ZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGYxMmM4Li4wMDAwMDAwCi0tLSBhL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXN1YmRpcnMgPSBbCi0gICAgImNhbWVyYSIsCi0gICAgImRybS8qIiwKLSAgICAibWVkaWEvKiIsCi0gICAgInNlcnZpY2VzLyoiLAotICAgICJzb3VuZHRyaWdnZXIiLAotXQpkaWZmIC0tZ2l0IGEvQ2xlYW5TcGVjLm1rIGIvQ2xlYW5TcGVjLm1rCmluZGV4IDc5M2NiZjQuLmU1ODRmZmIgMTAwNjQ0Ci0tLSBhL0NsZWFuU3BlYy5taworKysgYi9DbGVhblNwZWMubWsKQEAgLTgxLDYgKzgxLDcgQEAKICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyQDEuMC5zbykKICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGlic3RhZ2VmcmlnaHRfc29mdF8qKQogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2xpYi92bmRrL2xpYnN0YWdlZnJpZ2h0X3NvZnRfKikKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGliYXVkaW9wb2xpY3llbmdpbmVjb25maWcqKQogCiAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIyBORVdFUiBDTEVBTiBTVEVQUyBNVVNUIEJFIEFUIFRIRSBFTkQgT0YgVEhFIExJU1QKZGlmZiAtLWdpdCBhL2FwZXgvQW5kcm9pZC5icCBiL2FwZXgvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmE2MjBiCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTIxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCithcGV4X2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEtZGVmYXVsdHMiLAorICAgIGphdmFfbGliczogWyJ1cGRhdGFibGUtbWVkaWEiXSwKKyAgICBtdWx0aWxpYjogeworICAgICAgICBmaXJzdDogeworICAgICAgICAgICAgLy8gRXh0cmFjdG9yIHByb2Nlc3MgcnVucyBvbmx5IHdpdGggdGhlIHByaW1hcnkgQUJJLgorICAgICAgICAgICAgbmF0aXZlX3NoYXJlZF9saWJzOiBbCisgICAgICAgICAgICAgICAgLy8gRXh0cmFjdG9yIHBsdWdpbnMKKyAgICAgICAgICAgICAgICAibGliYWFjZXh0cmFjdG9yIiwKKyAgICAgICAgICAgICAgICAibGliYW1yZXh0cmFjdG9yIiwKKyAgICAgICAgICAgICAgICAibGliZmxhY2V4dHJhY3RvciIsCisgICAgICAgICAgICAgICAgImxpYm1pZGlleHRyYWN0b3IiLAorICAgICAgICAgICAgICAgICJsaWJta3ZleHRyYWN0b3IiLAorICAgICAgICAgICAgICAgICJsaWJtcDNleHRyYWN0b3IiLAorICAgICAgICAgICAgICAgICJsaWJtcDRleHRyYWN0b3IiLAorICAgICAgICAgICAgICAgICJsaWJtcGVnMmV4dHJhY3RvciIsCisgICAgICAgICAgICAgICAgImxpYm9nZ2V4dHJhY3RvciIsCisgICAgICAgICAgICAgICAgImxpYndhdmV4dHJhY3RvciIsCisgICAgICAgICAgICBdLAorICAgICAgICB9LAorICAgIH0sCisgICAgcHJlYnVpbHRzOiBbCisgICAgICAgICJtZWRpYWV4dHJhY3Rvci5wb2xpY3kiLAorICAgIF0sCisgICAga2V5OiAiY29tLmFuZHJvaWQubWVkaWEua2V5IiwKKyAgICBjZXJ0aWZpY2F0ZTogIjpjb20uYW5kcm9pZC5tZWRpYS5jZXJ0aWZpY2F0ZSIsCisKKyAgICAvLyBVc2UgYSBjdXN0b20gQW5kcm9pZE1hbmlmZXN0LnhtbCB1c2VkIGZvciBBUEkgdGFyZ2V0aW5nLgorICAgIGFuZHJvaWRNYW5pZmVzdDogIjpjb20uYW5kcm9pZC5tZWRpYS1hbmRyb2lkTWFuaWZlc3QiLAorfQorCithcGV4IHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEiLAorICAgIG1hbmlmZXN0OiAibWFuaWZlc3QuanNvbiIsCisgICAgZGVmYXVsdHM6IFsiY29tLmFuZHJvaWQubWVkaWEtZGVmYXVsdHMiXSwKK30KKworZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEtYW5kcm9pZE1hbmlmZXN0IiwKKyAgICBzcmNzOiBbIkFuZHJvaWRNYW5pZmVzdC1tZWRpYS54bWwiXSwKK30KKworZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy1hbmRyb2lkTWFuaWZlc3QiLAorICAgIHNyY3M6IFsiQW5kcm9pZE1hbmlmZXN0LXN3Y29kZWMueG1sIl0sCit9CisKK2FwZXhfZGVmYXVsdHMgeworICAgIG5hbWU6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLWRlZmF1bHRzIiwKKyAgICBiaW5hcmllczogWworICAgICAgICAibWVkaWFzd2NvZGVjIiwKKyAgICBdLAorICAgIHByZWJ1aWx0czogWworICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy1tZWRpYXN3Y29kZWMucmMiLAorICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy1sZC5jb25maWcudHh0IiwKKyAgICAgICAgIm1lZGlhc3djb2RlYy5wb2xpY3kiLAorICAgICAgICAibWVkaWFzd2NvZGVjLnhtbCIsCisgICAgXSwKKyAgICB1c2VfdmVuZG9yOiB0cnVlLAorICAgIGtleTogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMua2V5IiwKKyAgICBjZXJ0aWZpY2F0ZTogIjpjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLmNlcnRpZmljYXRlIiwKKworICAgIC8vIFVzZSBhIGN1c3RvbSBBbmRyb2lkTWFuaWZlc3QueG1sIHVzZWQgZm9yIEFQSSB0YXJnZXRpbmcuCisgICAgYW5kcm9pZE1hbmlmZXN0OiAiOmNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMtYW5kcm9pZE1hbmlmZXN0IiwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy1tZWRpYXN3Y29kZWMucmMiLAorICAgIHNyYzogIm1lZGlhc3djb2RlYy5yYyIsCisgICAgZmlsZW5hbWU6ICJpbml0LnJjIiwKKyAgICBpbnN0YWxsYWJsZTogZmFsc2UsCit9CisKK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMtbGQuY29uZmlnLnR4dCIsCisgICAgc3JjOiAibGQuY29uZmlnLnR4dCIsCisgICAgZmlsZW5hbWU6ICJsZC5jb25maWcudHh0IiwKKyAgICBpbnN0YWxsYWJsZTogZmFsc2UsCit9CisKK2FwZXggeworICAgIG5hbWU6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBtYW5pZmVzdDogIm1hbmlmZXN0X2NvZGVjLmpzb24iLAorICAgIGRlZmF1bHRzOiBbImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMtZGVmYXVsdHMiXSwKK30KKworYXBleF9rZXkgeworICAgIG5hbWU6ICJjb20uYW5kcm9pZC5tZWRpYS5rZXkiLAorICAgIHB1YmxpY19rZXk6ICJjb20uYW5kcm9pZC5tZWRpYS5hdmJwdWJrZXkiLAorICAgIHByaXZhdGVfa2V5OiAiY29tLmFuZHJvaWQubWVkaWEucGVtIiwKK30KKworYXBleF9rZXkgeworICAgIG5hbWU6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLmtleSIsCisgICAgcHVibGljX2tleTogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMuYXZicHVia2V5IiwKKyAgICBwcml2YXRlX2tleTogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMucGVtIiwKK30KKworYW5kcm9pZF9hcHBfY2VydGlmaWNhdGUgeworICAgIG5hbWU6ICJjb20uYW5kcm9pZC5tZWRpYS5jZXJ0aWZpY2F0ZSIsCisgICAgY2VydGlmaWNhdGU6ICJjb20uYW5kcm9pZC5tZWRpYSIsCit9CisKK2FuZHJvaWRfYXBwX2NlcnRpZmljYXRlIHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5jZXJ0aWZpY2F0ZSIsCisgICAgY2VydGlmaWNhdGU6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKK30KZGlmZiAtLWdpdCBhL2FwZXgvQW5kcm9pZE1hbmlmZXN0LW1lZGlhLnhtbCBiL2FwZXgvQW5kcm9pZE1hbmlmZXN0LW1lZGlhLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWY0NTg2Ci0tLSAvZGV2L251bGwKKysrIGIvYXBleC9BbmRyb2lkTWFuaWZlc3QtbWVkaWEueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLm1lZGlhIj4KKyAgPCEtLSBBUEVYIGRvZXMgbm90IGhhdmUgY2xhc3Nlcy5kZXggLS0+CisgIDxhcHBsaWNhdGlvbiBhbmRyb2lkOmhhc0NvZGU9ImZhbHNlIiAvPgorICA8IS0tIFNldHRpbmcgbWF4U2RrIHRvIGxvY2sgdGhlIG1vZHVsZSB0byBRLiBtaW5TZGsgaXMgYXV0by1zZXQgYnkgYnVpbGQgc3lzdGVtIC0tPgorICA8dXNlcy1zZGsKKyAgICAgIGFuZHJvaWQ6bWF4U2RrVmVyc2lvbj0iMjkiCisgICAgICBhbmRyb2lkOnRhcmdldFNka1ZlcnNpb249IjI5IgorICAvPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2FwZXgvQW5kcm9pZE1hbmlmZXN0LXN3Y29kZWMueG1sIGIvYXBleC9BbmRyb2lkTWFuaWZlc3Qtc3djb2RlYy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU1MDg2NAotLS0gL2Rldi9udWxsCisrKyBiL2FwZXgvQW5kcm9pZE1hbmlmZXN0LXN3Y29kZWMueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAtLT4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiPgorICA8IS0tIEFQRVggZG9lcyBub3QgaGF2ZSBjbGFzc2VzLmRleCAtLT4KKyAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6aGFzQ29kZT0iZmFsc2UiIC8+CisgIDwhLS0gU2V0dGluZyBtYXhTZGsgdG8gbG9jayB0aGUgbW9kdWxlIHRvIFEuIG1pblNkayBpcyBhdXRvLXNldCBieSBidWlsZCBzeXN0ZW0gLS0+CisgIDx1c2VzLXNkaworICAgICAgYW5kcm9pZDptYXhTZGtWZXJzaW9uPSIyOSIKKyAgICAgIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iMjkiCisgIC8+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvYXBleC9PV05FUlMgYi9hcGV4L09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTg3ZjVmCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9PV05FUlMKQEAgLTAsMCArMSw2IEBACitjaHpAZ29vZ2xlLmNvbQorZHdrYW5nQGdvb2dsZS5jb20KK2ppeW9uZ0Bnb29nbGUuY29tCitsYWpvc0Bnb29nbGUuY29tCittYXJjb25lQGdvb2dsZS5jb20KK3dqaWFAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvYXBleC9URVNUX01BUFBJTkcgYi9hcGV4L1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmU5OGNjCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9URVNUX01BUFBJTkcKQEAgLTAsMCArMSw3IEBACit7CisgICJpbXBvcnRzIjogWworICAgIHsKKyAgICAgICJwYXRoIjogInN5c3RlbS9hcGV4L3Rlc3RzIgorICAgIH0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5hdmJwdWJrZXkgYi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLmF2YnB1YmtleQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGM4ZmQzCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5hdmJwdWJrZXkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5wZW0gYi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGFhNTBlCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5wZW0KQEAgLTAsMCArMSw1MSBAQAorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorTUlJSktBSUJBQUtDQWdFQTA2ZEtpRit4UXAzNlhjb3NtYWMrRHpKVFhDOW5iSHkwWXFmeSt6RUM1aGx3WGJIWgorMWdBWlp1OHpMOXA3a2JCa210U0N1bFUwTStjVEhyNzRna0c5VURrTS9TN1orOTU3RnpITXFXWFkwM2d1cEZQNworbGNDbkt0cGt6c3lRckFCYXZ5bm94eVk2ZGZtS1pOdEVGUXJpa0sxenM4MENwcFJvTXdaUzJkTG9nWDhxTzVMVQorZ0xlNy8wUFpCZGJRU1ZBNUFBUkUrQU82cFI1UHgvOFFBZXJlOVRDTGNtMWFLOUJVVk9KdmFBWkFmN2JEMmY4cworM0ovbEFOUTF0dlhYWnJGTDFpMjZINnNOamExMXU1L00wb2RnM1NmcUtJMHgvMzE3bkxrWXg4UVNTSFZLRWpCcworbnpzeW9Gcnk0SU5FaC9xN3pTRVg1K1MxVkE2T1JqeW9mM3U3Q3JHYXZyWXdJMms2eDN0K0RrYzJkZk5EYU5ZOQorOXZHWUQxbk15UnFVelNJcWFPejhxNzh0YzFBMzkxTHVhOFNCMUUwVHgvRm5zUGp4UGVlMHdaMXRhR2Rka1p4RAorY3ZNZFFKaEx5RTZFbG9pbUZpT2hrVmpuQW5sUFlpaVBFUWt3Sm9tRTlrQ3NQOWFNbXlod0JPcGJiUklTajF1YQorZWRFU3JwVEM1REhwdDFvd2p0QWZIdkQ4VGZtUFdUMUtTTjFpQ1FBdWg1aG5FTTVMTERsamMvQVl2SlY0TDV1UgorbC82dDVkRThkZWc5a3NZNmxWUnJVd0hzWHhVdEJQaE04MlBXU3JwQVBOSkNITHVCQlZ4K3pERC8va09tdDVvZQorT3lZSjJSY0RzbkxtRGZGTEhiUGNBd3V5Zm14UStwYkZCZmlMNE5hS29VV1J5MHZpUjQvM3p1bHlzQ3NDQXdFQQorQVFLQ0FnQXBoYU5JbDhWVnRWcGR0Z0VENzl4cjdNcVB4amo2L29nQTVzUHpaWTBWQ1I2VE13WHlScmkxQ2U0MworMEJ2MzIrd1F0K29obGYrVXd4dHNKN2puRFBDUDRYRmI1aW9ia0cwRGd1Q014dzgvaFU5Wks2U3FuMDNzU1VZSAorai9nOTFoLzNhc2hnOFczOG9RVDJmbEdmOHkrNWhGMnpnMSttd0d5a3ZmUFpDZGhWTjFaWXM1aCszQXpFcWxIVQorSkcxZVJKKzZFaHhacjVtWk5SWWZ2VGt0dHg4Z2FQS2ljek9DYnU5c2E3UEJhNkNSclpCRW54djArR1Zid1VYOAorYThSalFCc0puSlRzQzRtd0pyeDNINFYyTTlyYjZDMjI0T1JUSkJIeEVCcjliY2pNY0Q0a3pWMHg2OUlseFZIcQorbTdZQkd6NW1vcnhtNE9aMTVCa2pURmtlRVc4QzhiZHBScllvWThvY215YldVZjZnNUl4cEUzM002OTlsV3pkbgorK3h3UGxvSk9BNXNxc0RJWEdYdDQrS1BiMmhqSExwcVM0VjlSdzFKUUVyQmdCOS8wRUhxSzR1MWt3STEvZGplYQorTnkyNmVzR2dqbXVwcStNK0czdlF5c0tFWDhtL0toWVpLdzh5cUc0THJ6VUtwMXVvc0VYRWVFK0ZCblBXMWZ3VQorT2FwSlRBS0xEQWVJdHoyWXNaKzgyb1RNUkVLUjZnTm9BdzN5RjNkeG8vRTRzazNJREc0eTN3N0E4RDVkbEJCTQoraHgyZkRxbmllUy9PZmZHbmRiYmJJSUdIMFNiMU1CVVJObFpsWHdYejFoYkFDYzhGTVltbjRpeVFVSmZLbENmVQorUnAxak9SNHNpbEZ4RUdZaFNpMEp3NytBSmUxcHJaUnlaWXAyWlFRK3RyR3ZxUU5od1FLQ0FRRUE3Q3NhRHh2UAorTDlHSTh5RlZ6bkFHNVNadkl1dDMvbExBN2hkNEYwTEtKMjc3aFc4WU1FTkxqdm1ydEVRVzFkeVFxUVhWK0NwTAorUUVydmdSdVZqOUR5VjZxT0tEaW1tcHFoVCtZWmxieHA5OE45QmE4Uko0Y2t3MDd2UE52Z2xUakFlSVp5VWJSUAorVlg1T25yL09GdzY2R0x6T0loc09uUmxxdmlPS2cyd20xa2ZCRjNPQkF3VmN6cWg0UEo0Z2MzcmJXOWpQTjNwbgorZWFvdVY0Q2RHSW9vWGNrVjZYdFFDR2pXRk5OenhtdWtubjFHYkxiSHNsR3VEVVg4OXJRc1JzazlxWkdwaTFNMQorQ2YyeWFRWTBkK0FqRGRQc2xYS1o5MkViREFtbzNLR3RveHkyaFdXeXRaSGJVaHRXZ2d1RXd4RE1rSmhKMHlDTQorWlNMUVoyVFhsQy9pQ3dLQ0FRRUE1VzB4dU5Ub3piMlVyd3FFYURDa29neGdkdjVOZFF2bHZCTTcrZkQ0UnBPWQorSXRERmN1ZGh1YXBucHhkYlByZGwzRjViZ1RYWko0aktNSUtlUFZ2ZXVnSTd3TkNRWDdhU0VUM1UwUWo0N1J6QQordlZWSGIwSzNTWnNpY3BLN0swNjdFamsxZXN4clByZWFUblVqMTRqVWxlMjBDcSszaXlzSm53TUZzMkRrbUUxQgorVUs2TWlCSjErTWJGdUJBVHc3VFd4dTh5UHlmYTNKelVBRXNmUDhOcXFJbFhySzI2RGRHZWZkOEMwaHlzaXE0WAorM21hdFozU0RjazFtQ2s0TFM5UENaWmxEcWR4TE02L1VJb3k0Y2owcWJTUGRGTW9wOHpqQjhsRi8xT0FCb3drVAorZS85TDBkcEcwOEczNWFFSko2dktTR25GTGJzdGdseTE2NVBsR2FwZVlRS0NBUUVBd29TaHV3NEJzWFlaSVlBMAorWjRzWDhzZWNSQnZEd29Ld2k2cGk3RzNEaVlVOHYyT0lmYi8vek94UmczR05pV3BZOEE1eGRTeUl2SlM3L2hBVgorT05ZMXRRVXlmMmhodVBkaHBDaDJyRUQ2MnVwMTRDZVlyb0QrUTZ1Ukd3UlRUelRtT3A4cUs2ZWlyRjBUTG1mMgordkVFU0FHd0tNRWN1MnpCakhlYXlJSnNFeGZ0bHpBWURuZFJkNDQwWk0zeGVhQjhwNjlXQW4wWS9VaE5jaGcvVgorMUs5K25maVJCclRkYjMvQnpIZDVaVldseWpDT3Y5NHdUdXc5dW9zSjFyMEJ0dS9yek8yL3dwU3ZHK0tNZnpwdworSHNoS3R3bjFWQWFIVUJ6NEpRc1R2VjJoWWJhMWt0djN2TnM4MUx6Vm5Oa1Y2WUM5ck43eDkyWlluTGgzQktJbgorZWRPU2p3S0NBUUFQNTF6ZUFpeE5Mc29peENqZmpCZXRnQXdqMDRjTkNSRVkwNENCMS9sdDh3ZEZ5cEVWWVFLKworT3hqS1ZXMG0wTkhIeithcDgxQ2xVKzhvSTdYU2JRN29lQVVxWFlyVWg3UmlhNVhZRTdZbHdhdCt0RzJxUWNhdworM0ljcnlBNGZkMnF5WGJMZVcxTkgyclJnb2ZBbEhjQVcwSTU5ZXliUEIrRzMyeDdIQzMxdExWWE13UHpPNWZDMQorbVJuVm80K3JMbHNCR1UyellSRGo0QjgyRWY4TmpYOVVSWWtGV0ZtZ1lacUtBUzZSNEJqNTJBMmhoaDZaSUZPSQorVmVNdjdhOE14NVlmTXR1azU3ZHkwc3B5eHF4Mmh0VHRFZUplY1pFczRnOVh1OXlQcGlPVzZLY29IazlrTWF4ZAorTzMyQzlvSEs5VGFsaEdkOXZ3N3RqWDJ5NGVLc3Y4bWhBb0lCQUJFdEpTalE1NzFZVWJFTHZKZ25WSUxXS0V4agorblVSbmJROEMyajJsTGRiMjBmaThVR0pEZWk5ZzJiMm9DczNTZkNhTWNScW9PczR1eThaSnpvZlBlbHdXWTFCNworU1plem4vMmQxUS9jWHBhWGV3KytrcmhGdkpGVnh5YTZlTEQ3cHZFVlFBc0d0a3A5QlRpMkNGSWhjR281VVFkYworcHltN1hqRnNXMExDSThtT0FsZXVZZTdERXBFVTc5UmRzZnhnUXBlaDFOZ0ZKUnB1cEhUNkkyQmtWaWpEL1RJNAora2J3ejExU3V6bmtVVEI0UWVQSXduRXpWK2dxRHRsbnk0TTFRdnNrOGhxY1U2SlVPdStNT1QxcW5JNlpHU3NkUworRDZSaFB1a29yZEM5eS9jYmlWNnFxS0JWWjM5Tzh5ZFd2cHRvL2c3RzdmU0w1U2RkRnVWUm53QVY3Vmc9CistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5wazggYi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnBrOApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGY3NDFlCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5wazgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLmF2YnB1YmtleSBiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5hdmJwdWJrZXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ1OTcyMwotLS0gL2Rldi9udWxsCisrKyBiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5hdmJwdWJrZXkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLnBlbSBiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5wZW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM3OWNkMwotLS0gL2Rldi9udWxsCisrKyBiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5wZW0KQEAgLTAsMCArMSw1MSBAQAorLS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQorTUlJSktnSUJBQUtDQWdFQXZCNmxPRUVPUjU4S01jRmxheUVaanNYdVBnY2ZIaS9PUHhjdmZwaUdMQ3BPY0szbAorT1BDaFdVdkRSY0lITUI3Qk8rQ3NmeHMwSGdzSHZ2WmZOeW9OSW05OVdjakZiYm9pTzdXckJCQXJJc3pQcjE0WAorY2ZZMk54elQ5TEJqK0VxQW5iZEwrNE9RVzEvbnBMSE5FMHF0RGN4TDcxaXBialN1S05iNThFOXFHTDBLd3ZrUworZnd3dWVXaisrYmcvaXo3ZHEwbXo3aUtwbnhZc2NObTRSaEpqcWNHMlVzbWc0RWpocjhoNVVtT1VtVEpiT2JDLwordnpDbFhRcWVldXpTOE5UdEdWZ1EvQ0k5Z0MyV045dXBxMnAvMlQ3UDRVM28zQ1d2Qnl0VW9MS1IwVXlDODNleQorUzhYSmdPYTQydVdSM1QvZUpPSTFaUzRINlNyZzFvMlhDOFliOEVwckZJL05NNi8rLzVEWC9GZ0RpbXNzbEFQNgorUXE0K3BTdGU5di9GaldHcXk3UUJRYWVmRlJHUnVTNjN4SGNTWmhYQzlKMkNGZG54bzgrNjVRVDhyNHlmUUVlaQorQXgvMFE5NHlCN1ZJTDFwSUp4SEVvbktqdGQzaUtkRkVLUXpBREozZWRzbXRIeWJFUmRKS0N4Y205UUlyRENzQworNFlWVDluWDBPb0M5UkQ1ZDVFVkQ3VzVJNmVFblJ1NmlncktJS2dVVnBwZVlGUU5aRCtvK2VpTkphNHlvZ2dSbAoraDhzVDAveExLak1SeEFRN2ZhZmkxaitMQjJPN1VnSm1JRERBbmlkcThBb3o3aDNwTmkxMzlyTldyak5md2h1cworbk1jWnZMOWRUVnYyNkpXZUVTSFAvekFmQVg3ajFyZmtEd1IwMm9jUkxxdXdFVXMxK1VIQTI3V2kxYk1DQXdFQQorQVFLQ0FnQU8zUFQ4M3RiNy9hcldoNHMxemFXeFRCNG90SE5XOVR2OGJCNktpQTZCeXMzcnhUR0pNQ252WGpjTgorZWVrTGVrS1dNb2d1ZXIzQmFlbXd3dEovRDBsK1lRU3NaVnFEOHVMbGlOTDhQVExMU3hkVnFiOThkNUdOQlRBUgorOHlYUzVrQUhOZ1pBMXdJKzFmTDlaamJud1V5dS9HYzdmK3ZURTBKM1k1VFgwYzUyS2VtQndpQWQvWjVtWlU5UAorOTZpOW5iZng0cDdldjhwYkVXdHRkeVpDRXczZ3liZFlEeW93emxGV2pDWlp4aGhsaWo3KzdlSVlmd1Z4dG5jVAorQzBjWFZCdHZseSt3WEJ3ejFtWTUvNWNHUGlIZnprQ3FjbmRsZld5NHlrbWpjTGhvcXZ6bHM1MVlzMFhhYzJCRAorbTBQTkVWREI1VVdHdXY1UkE5eEQxMmdKdkJ0VTNEN2dnTXc2QzVSY1hKVCtqU1ltU0Z0RDJrbFdpK0l0OEEvTgorSHY0MnNvS3NrdDZKcVlBV0UxY3ZKM1BFcUg5QVNFSk5xMlIwWi9QbXVNMDAwVUp5elU5S0lkM1NOd2pYQTFYYworS245aFJnYTR1ZjllbEhUamtURHQ3OS84K1h2N2hqZXI5c0YvUy9ucDdnMDRyVWpJV2t1RmtDLzdOSzJ0UVNoMQorbWxqVjFzRDlTRjREUGZWSzc1THdKSmFRVWxJN1R0R2Q1S0o3Rnpad3ZiK3c4T0RycFczaGt0NkZjSTZLd0UvYQorUVQxVDJaOURrblhKU1lOZFdHcmo2dk1Ic1lNaXl6OElkQUhTQ3JPQjZlWENReHBpdGJuNlc3MVJhdzdmOVVhWgorVkRLNUFoVFU0OTNoa0dqMW5vNGNKd2VjWEluTWlnZy9jNHl3azJJYmg2SVY4TzBua1FLQ0FRRUEyK2RRUTBJRgordnZWZ21RMld4SEJEN00ybWJPeWY0M1lCWTZLYTZvUEJOR1BWcFpFOFg4TG9UYXZRTFYrU2dDa0g4VDZnWTdYUworNUw0WmUwSkZ4ZnVhMG8xcm02K0wyWHJPeDVGL0EyWTQwWWNQY2xFaWs1aDF3b1N3SC9KMWlIR2lFaFk4TnFldQorOUdDdmpRb2prZ1h4L1JuM056K2xwdlozMjlPM0g4NVJXV0dGMGw2MFJ3TE9raWcwWndVYjYxOXQ4YWZmbUdJbAorc3hkRHYybmZ5N090Slg4aUdEdWE3S2Y2NGR2VldRS0t0QUNXa0FScmxrY1dYM3VvRVN4a3BTRHh1ZSt6N25kSAorbzd1SExmTThUeCtSbitRdllXdVJXNVRQTGJFRE1iSVlyWDY1SVN0MnIvVDd2LzA0WGRBQzhZcENRUnl0bHFQSQorZnBEbTE1aHR5SEJpelFLQ0FRRUEydis1b3RSb1k1NkpkdUlTYVZHbHNKL0lidkt6REFJeVdtTTE0RXBSQ1I1RQorbHUrTXBUY1JBaUZRQWJIR1hyMXRNbFRGZFZGRDA5MFdBeklLYUt0QURGVkxYb2JJSGVHc3BuUkNxNU9wVnA5VworUnZMdFZ3THhmbEhBYzJ5TjkvTE50bkJxSFVndCtTMDFMQlBFbHliZEdIUVJUdHFBS1hoa3AzMXNNMjFPMzRHbworUHJpL0l4Z3VwV3h5a01hVzQ0S2lnMUNyNURLdmM4Y3dVc0d1eURkSm04b0JRZU5QVE1XcVNuWHRxb1RXU2FZZworMmt4aU1URm9rcmtTWGd1ZmI4d25nNk9YdC9RZWx5d3JoRzNoQXNsZFBPM0dkS2lkRFN4aFdaU2dwVVhYRmRBWAoreTRHTzBJY1JKQkYvV0p0WVRZdFIrbDg0blFBMi8xWWU0dWpGbFQwYWZ3S0NBUUVBbVhyWHBTbTJjdkkyQ256VworaHFKSWRrV09hNlczYm4xVk9PSXJ0NVJmeTU0R1pubDRwdW1WVTJpZ2NwcXEySEpLemRERkJ2TEhqOGt5WmJuNgora3RVcDJOekZoeks5cS91dnlOQSswdk9Nb29qZWVnNHcwTXp2RytXYU82SHc4RnRISDlLUEVpSjAxTEdLdFNpbgorYk9walhDQzhUNzVIY3NIQkpCZWZUejZqdm50M2VEMkxHNmpVM21QYk55LzByWkc4WFphcVUyUGxKaHNOdU5JLworVmFCQkw5T015MWNHcVRnUXZZUytZbEtJMWxzMnVxdXJINGJjRWFadnhoU3k1aUdaTlFvZERrb0lJVG5vZm1TdQorNmhhQmdCUTJFWXVQTjFra1JLS3dOUVkxZlJuZVFrMWdtQ3luYlBkaVdPK3Vya0N1UDEyeHRscjN1NGFNNTFyRworL01lYjNRS0NBUUVBMTJTeFptOVhoTE9ITElCSjc0QTRZTEdtNTBpWnhYUGJwbjd4bkhvN25hWkJlOXA4RUh0SworcFRleWd4Z2dyVW5PUHJTVnlUOTJZTWlRUC9CVndJQythK0x3VURac1dNZC9rZS9ES3hIK2VZNFp3NHBtMlMreAorNmJYcWZSd0Z2aHIzTFRyL2czRmNsamxhbE5HVWg3M1hzNWRrOXBOOWZreEZZMTYrcnc0UmgwNzA5VXVyNG82RQorUW51WmFyK0g1SmkxMGtYajZudlhpUjRlYnliRUMzUWxWNjZrOGZMcUtlNDRBU2hmNjFqZmtteHMzNGhGQTNFLworRXlBbjZvdXY4cnR2R2RBckJ1aDV0ZUhobzB5WEJMQ2NuYktYZ0dIZXBmaENmMkxwWmVSOUdaMGo2aXF4Rm5QaAorN2dHdnFLeVJleU5PSzl5L3g5dFFQRzZ0eml0M09jTnhiUUtDQVFFQXVEaGVET1NrWFBvcFhNdkxBS09IQklkWgorcmJRN29GVERIdDU5Z2J1Y003VTgvbDJZdGF4dUtPUUZCTG56UWEvYW1Ja2tydGtsWXdPc3o4RTI0ZDdObTM5dworeWtMSHdYMFhybWpBbTZNNFhLbUR2NjZhK2tTblNWNkxFYktaZGp2WFAwMkRWK3RHZVo1VnNuTnZKRHF1eE1zRAorZnZSVHNwQjhqOENwVTk2c3pla3hsL3RDUmhxYmR3LzRrVlRTajVCRisrT2FSUmNKckF5ajFCMnFmMXluQVpFMQorZ1V2VlBrRVlhOTE0emNyeGc5WElYVDRNN3lxQjdpOEtKZWdPdE90Y1dqSjd1VGlQKzYzOEF2eWdKTE1KblNyVgorK0hqRlpXRzZQOWJ0Wm1MSFNFQlJ2d0dPQWlscDBxZWpYbzg2NmwwZm1ubEd5N2VoS3o4dTNQenZubFBZalE9PQorLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0KZGlmZiAtLWdpdCBhL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5wazggYi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMucGs4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1YTQyMTYKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMucGs4CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy54NTA5LnBlbSBiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy54NTA5LnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2I5YjRmCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLng1MDkucGVtCkBAIC0wLDAgKzEsMzQgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRjNqQ0NBOGFnQXdJQkFnSUpBSU03MkpwRDR2NlhNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1JR0NNUXN3Q1FZRAorVlFRR0V3SlZVekVUTUJFR0ExVUVDQXdLUTJGc2FXWnZjbTVwWVRFV01CUUdBMVVFQnd3TlRXOTFiblJoYVc0ZworVm1sbGR6RVFNQTRHQTFVRUNnd0hRVzVrY205cFpERVFNQTRHQTFVRUN3d0hRVzVrY205cFpERWlNQ0FHQTFVRQorQXd3WlkyOXRMbUZ1WkhKdmFXUXViV1ZrYVdFdWMzZGpiMlJsWXpBZ0Z3MHhPVEF5TVRFd01qRXhNVEZhR0E4MAorTnpVM01ERXdOekF5TVRFeE1Wb3dnWUl4Q3pBSkJnTlZCQVlUQWxWVE1STXdFUVlEVlFRSURBcERZV3hwWm05eQorYm1saE1SWXdGQVlEVlFRSERBMU5iM1Z1ZEdGcGJpQldhV1YzTVJBd0RnWURWUVFLREFkQmJtUnliMmxrTVJBdworRGdZRFZRUUxEQWRCYm1SeWIybGtNU0l3SUFZRFZRUUREQmxqYjIwdVlXNWtjbTlwWkM1dFpXUnBZUzV6ZDJOdgorWkdWak1JSUNJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBc3FYRTBBSVdwTFc5VGdxMgorblFHcGg3S1o2TDJROW94dmlxQ1ZIeElhUHFmaE0yU3dUYnljQURJUWVxcnJsUnhoZGRWa2pMdU1Va0phN21ldgorZkVSbWdwaU9mblBJbEdLNlBUczJnbGpDa3NrWmhGM2JnZmV5dUh0MHRzWU8rVWFOOE1Wb1pENy9RZGlFNDZ3MgorT01EQ2xHMVVxZ2lxT0JoTFRFTi9jSFhPYm5VaWlWWFVZcU44YVlaZjZMNkZzM3lRaTJaWmdmYnhUVkZld3FkdgorYUxMT3FDWW5WWVhaSCtaeGJYRVNBME0rV1hLZ1JLc1lUajJHWXMzZWtvMXJGaTRZNnVIVkx4NDV5YW9UNXUvaQorU3hQRWtvY3lNQ0t2R0pXdTRYbFNPZDNFalNPTWFxQ09ZVnlHTHhkbG5RV1FVN1BaRHFCU0owU3lzV2dwRkhwQgorSTE1YzJqaFJkWE9DZlE5WnREZlBaa0UwYTJBOGtKREFvRjFtelRwNkl2QkFXVXNsNW5IUHc1Q1drRnBOYWQvaAordHFxR0NTY1diaUtadXZyUTQvUlFObTNmMUsrbXhYOVRyakZpZ3BxTk82ZDRwR0FvMWZhNnNIUjN4V1B3L215cQoraDVaSmpWblhVNVlxNjRTNHhXT3NzZmpwT2c3UmZOdXZ6dWszb2szTVlzMW1ieDN2aFpPajVrbTFmM3FyZ1g5YworbVhqWW55WEQwakpCbTR1QUpXWExkSzlQbFp2bFhienRNQ3pZajgzMklvNHBGTEN0U3hrelg3NXQxZW0zNk52MAorbU5wNk50U1N5NlNGU3E4bDdJc1hWMkZOeVVpeUhXeFMvVVFtOHBZZzVRNWRXSHZFRUY3OFA2bFYwd1JhNkZRbAorQkJTZ3BxVEFJMDkyS0lqRER0QjdHUUNnVjVFQ0F3RUFBYU5UTUZFd0hRWURWUjBPQkJZRUZBRklkRlRERURmdAorZXdTU0FTN0ZhM09aNVRYek1COEdBMVVkSXdRWU1CYUFGQUZJZEZUREVEZnRld1NTQVM3RmEzT1o1VFh6TUE4RworQTFVZEV3RUIvd1FGTUFNQkFmOHdEUVlKS29aSWh2Y05BUUVMQlFBRGdnSUJBQzVlM3pYeXRoSkNHbXoxRm1BVgorOFkvVUkrR2xnNkcweC9rMDRXYVJHMERQTExqbEoxRjBMTTEvSVJlQlNnWGNZQUwwQ0FnUHljZi9yR1BPZ01GbQordFF4WXlqQlV4S2RqcElxVTVESm9WMWZlYW5HdmVJUnB0bzFZUktOZ0h1ekc5clpHUjRBZ1BudDZYNFl4bHEwNAorbEk3UXBXYWRYZTFteUFSSmhqM25pU05ZOSsyd0VJbmt4NFp1Q08xTHRJR3FuYmRjOGpROFlvVnFJRTVONGt1TQorY2N5UFlnc2RBQnRvcGJqTjkycnVldThzZkY4UjZST3krdE5nYjZPanBBQWV2dG5CZloyTFhxZk9iS2lySENLKworazZ3NFdTQjFVVW9aM1hnejhzSnRYZ29rdlllSW5rTjh0SHVUYWdIWVUyVlFUY0EwcmRCR01OLzFPbGpKcFdsTgorMFVVcTRmQVlVNmNONGxIeHIyTE05SWY0V3ZBemRMQVd2YUlackRxYVU0aS96WVQ5bDZyUjRsQzJLVzNFSFdvdgorblBYZmdFSko4QVAxaVJHaWJ2ZXczaTNTQjZYVFdGUVlUVUlCZUpmRHovS0RYUWFiUCt5elhXSVNkWkNVTVVweAorZitSYXFzYjVNb0thSmRWZ25TTDBtQnVuakN5SkR6emczNEo3b0d4Ni9CbndvaU9yd0xONFFhejVVOGpiclBTeAorcDlMZmxlQ2NPN1pkZUU4R0txeDBYMVQ0ZDd0cmFkdG14T1M4SXdyNG5pc2trSEdSa3pvenZWdnV5R0ttb04yaworMTYyVmZqcStkZGo3cUVwU2gzQlM2aEhVK3ZsTWJDOUwwdHJHeFB4RkVBSERyd3UwS3dHTmR1VGtpdS8zanZmQgorSlRnSDhQOW1EMWxvWXhSZG8rdmV0OGVRCistLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tCmRpZmYgLS1naXQgYS9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLng1MDkucGVtIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS54NTA5LnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzkwOGZhCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS54NTA5LnBlbQpAQCAtMCwwICsxLDMzIEBACistLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0KK01JSUZ6RENDQTdTZ0F3SUJBZ0lKQU8wNURCQnVzYWFMTUEwR0NTcUdTSWIzRFFFQkN3VUFNSG94Q3pBSkJnTlYKK0JBWVRBbFZUTVJNd0VRWURWUVFJREFwRFlXeHBabTl5Ym1saE1SWXdGQVlEVlFRSERBMU5iM1Z1ZEdGcGJpQlcKK2FXVjNNUkF3RGdZRFZRUUtEQWRCYm1SeWIybGtNUkF3RGdZRFZRUUxEQWRCYm1SeWIybGtNUm93R0FZRFZRUUQKK0RCRmpiMjB1WVc1a2NtOXBaQzV0WldScFlUQWdGdzB4T1RBeE1qVXhOekUzTVRkYUdBODBOelUyTVRJeU1URTMKK01UY3hOMW93ZWpFTE1Ba0dBMVVFQmhNQ1ZWTXhFekFSQmdOVkJBZ01Da05oYkdsbWIzSnVhV0V4RmpBVUJnTlYKK0JBY01EVTF2ZFc1MFlXbHVJRlpwWlhjeEVEQU9CZ05WQkFvTUIwRnVaSEp2YVdReEVEQU9CZ05WQkFzTUIwRnUKK1pISnZhV1F4R2pBWUJnTlZCQU1NRVdOdmJTNWhibVJ5YjJsa0xtMWxaR2xoTUlJQ0lqQU5CZ2txaGtpRzl3MEIKK0FRRUZBQU9DQWc4QU1JSUNDZ0tDQWdFQW1Oa1Z4VWJwL2JMYmVHYnZLcVlYendCeWNTRHBtT2hoLy8vbE5HWVEKKy9BTVVEMHE2RWFaelUyYmQ0YUwwck9HcWZvWWxoS2Qwa01WbU1VbWZkRTlPREFmS3hsZUVlRWFSbDJHSlM4YTkKK0FCaTc3MGwzR0hiQjJ4TUkyc0VXZU9EOXhzUEZGNitCeVBabW9VdU5oTXI0cFViWHNEcEUzaDhsanJnWEh0SWcKK2JoN29mYnZkZHJ1d0JWMGxTMWs5T1o5alBWR2hFS2tKbmhnUWE2N2N3Z2RqaXpBTWJJMERjejlndE1NYXdzRGoKK1oyYVFkMXIrdnhnaDEvWGtJL05NbVhDbkcyRVJ5dFhjSmVDNVM0Z0V0SGZUVFBvUDBGdVZnU0I2eTZkYWxNdVoKK0YwTkJadzhNdmdkeTNRSmlwMHVOYTM2SjYzQ01aS1RKV2JUZGxGcFBMMmhrMFBnYVl2amU4QzVYdGs1Mjgyd1QKK2RNb2NjOG4yeklYYnpiblNYR3ZqY05aaWIzUGZ1NTVZVW5YNmVUcVoxQnhsSjBGSFpBc0M0cXVGRldYeFlCWUQKK0xDUm9OTkZFdElEUXB1dnVIRjJEdUhORFVMcEFRankyeTYrN2VvdDBLRXNWb0RtWjRIOEJwdUFWVnUyU3hZTmIKK2dZZmxSOVNtTTB0bVllQWNSVDQ4cTN4cm9jR3lFSE1xdmdRUlVwUGZ2Y3QvOGw4eFZjRHpPSS9zSlZEcW1Zek0KK3UwQ2ozZmtTeXBHREpPTUYvZXNGU21Wdm9JMDF0UzdrYU5TNXZ2dEtZaWIvL3hxS1JDOWYwZENzR2ZGTG51VUsKK280S1liWVdZd015SnFFZC81L1p2WHlLSVBBRWVKTDE3NEw5K3dUa2MzY1Fwb0J3Sk40dCsyRTVNbmhPRXE2ZG8KKzVMMENBd0VBQWFOVE1GRXdIUVlEVlIwT0JCWUVGSGpOSy9HWmtvMVJkWnArOGlhdldYTDV4ejl3TUI4R0ExVWQKK0l3UVlNQmFBRkhqTksvR1prbzFSZFpwKzhpYXZXWEw1eHo5d01BOEdBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUoKK0tvWklodmNOQVFFTEJRQURnZ0lCQUNtUFFNa3N1THJOVjF2Ykk0NFMxZjcwSTBGSGRCeGNoRkdCMzl6dUxiY24KK1NzWW9tL0xQdFlKaUQwRGw0YkI0ZWIrWm54a1FQMlhlUDZweWNtVUgyajFFV2V4Rnd2ZFV2bGZlOFF6K3dBZWMKK2FwNEF4aVg0WjJLZTJpdllvdElaRlVIZFpPTGtYMjBqczhXZXgxbXpZNDNNTFFuNUFQbDlnSzFWWlR4RGdnZVIKK0VPYkgxUytKVmpHd1FxWVpqMmU2Z05aSDM0UTI1TlE2OThSTDg1R0RrWXRTSVNBaWZKdGFKc1UvQjN2S204MkkKK2s5eE1pQ29vQ0g2YlJkR0hHMWp6ZTRTUnBpZGp4RW04Y3hraWFRYWdmY3VYZUNMemlYSnIzcUFNS1lpRVk2YnAKKzArYkFxQ3QzUzhPcnJOM1JRWmZRcm5sd2l0c00xakpKLytDK1dvRGc0ZVk1QUZyWERMdk5lS2gxcU8vZjh4disKK2ZDWGtRUGNWVnBoTGZSSDlveE5yU2dPV0JQNS9xSURINHMxWVVMOWx1R1Q2SCswOGRsdWUzUmtiekRiQnFzUXUKKzdmUS9CYnJJRy9HdVZLZ3lFTSthN0M5Z3Y3emM4NllsdWVWWUpFeXhLaWRubjdSeE9xeURCcXl5ZlhBM3p2bWUKK1Jybzd4SXJNSFBMN051M0FXandqWHpicC93MHordEVGUHNmVkIrT09IS3NXUGNVRzBIVVRKR2t5ZU8vdUhSak4KK3FQRWtrZjdCSEhVTzRWMmdqT0lkQ3NFTHhLd0hmN3ZzWlRPazQwRVY3NTFmWjdGREhNcjFlZGRRa2dINGVxQWIKK0RCNzl1UCtTTGZVbys0Mm40cTZlTW1vcXc4ZDc2YkJYUm9VaElvL01zNHNlYmhWMHNSdEFTNjdPUWlvYzlVVWcKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL2FwZXgvbGQuY29uZmlnLnR4dCBiL2FwZXgvbGQuY29uZmlnLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTkzN2ZkCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9sZC5jb25maWcudHh0CkBAIC0wLDAgKzEsMTMxIEBACisjIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIEJpb25pYyBsb2FkZXIgY29uZmlnIGZpbGUgZm9yIHRoZSBtZWRpYSBzd2NvZGVjIEFQRVguCisjCisjIFRoZXJlIGFyZSBubyB2ZXJzaW9uZWQgQVBFWCBwYXRocyBoZXJlIC0gdGhpcyBBUEVYIG1vZHVsZSBkb2VzIG5vdCBzdXBwb3J0CisjIGhhdmluZyBzZXZlcmFsIHZlcnNpb25zIG1vdW50ZWQuCisKK2Rpci5zd2NvZGVjID0gL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy9iaW4vCisKK1tzd2NvZGVjXQorYWRkaXRpb25hbC5uYW1lc3BhY2VzID0gcGxhdGZvcm0sc3BoYWwKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAiZGVmYXVsdCIgbmFtZXNwYWNlCisjCisjIFRoaXMgbmFtZXNwYWNlIGlzIGZvciB0aGUgYmluYXJpZXMgYW5kIGxpYnJhcmllcyBvbiB0aGUgc3djb2RlYyBBUEVYLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCituYW1lc3BhY2UuZGVmYXVsdC5pc29sYXRlZCA9IHRydWUKK25hbWVzcGFjZS5kZWZhdWx0LnZpc2libGUgPSB0cnVlCisKK25hbWVzcGFjZS5kZWZhdWx0LnNlYXJjaC5wYXRocyAgICAgID0gL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy8ke0xJQn0KK25hbWVzcGFjZS5kZWZhdWx0LmFzYW4uc2VhcmNoLnBhdGhzID0gL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy8ke0xJQn0KKworbmFtZXNwYWNlLmRlZmF1bHQubGlua3MgPSBwbGF0Zm9ybQorCisjIFRPRE86IHJlcGxhY2UgdGhlIGZvbGxvd2luZyB3aGVuIGFwZXggaGFzIGEgd2F5IHRvIGF1dG8tZ2VuZXJhdGUgdGhpcyBsaXN0CisjIG5hbWVzcGFjZS5kZWZhdWx0LmxpbmsucGxhdGZvcm0uc2hhcmVkX2xpYnMgID0gJUxMTkRLX0xJQlJBUklFUyUKKyMgbmFtZXNwYWNlLmRlZmF1bHQubGluay5wbGF0Zm9ybS5zaGFyZWRfbGlicyArPSAlU0FOSVRJWkVSX1JVTlRJTUVfTElCUkFSSUVTJQorbmFtZXNwYWNlLmRlZmF1bHQubGluay5wbGF0Zm9ybS5zaGFyZWRfbGlicyA9IGxpYkVHTC5zbzpsaWJHTEVTdjFfQ00uc286bGliR0xFU3YyLnNvOmxpYkdMRVN2My5zbzpsaWJSUy5zbzpsaWJhbmRyb2lkX25ldC5zbzpsaWJjLnNvOmxpYmNncm91cHJjLnNvOmxpYmNsYW5nX3J0LmFzYW4tYWFyY2g2NC1hbmRyb2lkLnNvOmxpYmNsYW5nX3J0LmFzYW4tYXJtLWFuZHJvaWQuc286bGliY2xhbmdfcnQuaHdhc2FuLWFhcmNoNjQtYW5kcm9pZC5zbzpsaWJjbGFuZ19ydC5hc2FuLWk2ODYtYW5kcm9pZC5zbzpsaWJjbGFuZ19ydC5hc2FuLXg4Nl82NC1hbmRyb2lkLnNvOmxpYmRsLnNvOmxpYmZ0Mi5zbzpsaWJsb2cuc286bGlibS5zbzpsaWJtZWRpYW5kay5zbzpsaWJuYXRpdmV3aW5kb3cuc286bGlibmV1cmFsbmV0d29ya3Muc286bGlic3luYy5zbzpsaWJ2bmRrc3VwcG9ydC5zbzpsaWJkbF9hbmRyb2lkLnNvOmxpYnZ1bGthbi5zbworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICJwbGF0Zm9ybSIgbmFtZXNwYWNlCisjCisjIFRoaXMgbmFtZXNwYWNlIGlzIGZvciBsaW5raW5nIHRvIExMTkRLIGFuZCBBU0FOIGxpYnJhcmllcyBvbiB0aGUgc3lzdGVtLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCituYW1lc3BhY2UucGxhdGZvcm0uaXNvbGF0ZWQgPSB0cnVlCisKK25hbWVzcGFjZS5wbGF0Zm9ybS5zZWFyY2gucGF0aHMgPSAvc3lzdGVtLyR7TElCfQorbmFtZXNwYWNlLnBsYXRmb3JtLmFzYW4uc2VhcmNoLnBhdGhzICA9IC9kYXRhL2FzYW4vc3lzdGVtLyR7TElCfQorbmFtZXNwYWNlLnBsYXRmb3JtLmFzYW4uc2VhcmNoLnBhdGhzICs9ICAgICAgICAgICAvc3lzdGVtLyR7TElCfQorCisjIC9zeXN0ZW0vbGliL2xpYmMuc28sIGV0YyBhcmUgc3ltbGlua3MgdG8gL2FwZXgvY29tLmFuZHJvaWQubGliL2xpYi9iaW9uaWMvbGliYy5zbywgZXRjLgorIyBBZGQgL2FwZXgvLi4uIHBhdCB0byB0aGUgcGVybWl0dGVkIHBhdGhzIGJlY2F1c2UgbGlua2VyIHVzZXMgcmVhbHBhdGgoMykKKyMgdG8gY2hlY2sgdGhlIGFjY2Vzc2liaWxpdHkgb2YgdGhlIGxpYi4gV2UgY291bGQgYWRkIHRoaXMgdG8gc2VhcmNoLnBhdGhzCisjIGluc3RlYWQgYnV0IHRoYXQgbWFrZXMgdGhlIHJlc29sdXRpb24gb2YgYmlvbmljIGxpYnMgYmUgZGVwZW5kZW50IG9uCisjIHRoZSBvcmRlciBvZiAvc3lzdGVtL2xpYiBhbmQgL2FwZXgvLi4uIGluIHNlYXJjaC5wYXRocy4gSWYgL2FwZXgvLi4uCisjIGlzIGFmdGVyIC9zeXN0ZW0vbGliLCB0aGVuIC9hcGV4Ly4uLiBpcyBuZXZlciB0cmllZCBiZWNhdXNlIGxpYmMuc28KKyMgaXMgYWx3YXlzIGZvdW5kIGluIC9zeXN0ZW0vbGliIGJ1dCBmYWlscyB0byBwYXNzIHRoZSBhY2Nlc3NpYmlsaXR5IHRlc3QKKyMgYmVjYXVzZSBvZiBpdHMgcmVhbHBhdGguICBJdCdzIGJldHRlciB0byBub3QgZGVwZW5kIG9uIHRoZSBvcmRlcmluZyBpZgorIyBwb3NzaWJsZS4KK25hbWVzcGFjZS5wbGF0Zm9ybS5wZXJtaXR0ZWQucGF0aHMgPSAvYXBleC9jb20uYW5kcm9pZC5ydW50aW1lLyR7TElCfS9iaW9uaWMKK25hbWVzcGFjZS5wbGF0Zm9ybS5hc2FuLnBlcm1pdHRlZC5wYXRocyA9IC9hcGV4L2NvbS5hbmRyb2lkLnJ1bnRpbWUvJHtMSUJ9L2Jpb25pYworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICJzcGhhbCIgbmFtZXNwYWNlCisjCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCituYW1lc3BhY2Uuc3BoYWwuaXNvbGF0ZWQgPSB0cnVlCituYW1lc3BhY2Uuc3BoYWwudmlzaWJsZSA9IHRydWUKKworIyBLZWVwIHRoZSBiZWxvdyBpbiBzeW5jIHdpdGggInNwaGFsIiBuYW1lc3BhY2UgaW4gc3lzdGVtJ3MgL2V0Yy9sZC5jb25maWcudHh0CisjIENvZGVjMiBoYXMgZGVwZW5kZW5jaWVzIG9uIHNvbWUgU1AtaGFscyAoZWcuIGFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MubWFwcGVyQDIuMCkKKyMgVGhlc2UgYXJlIGRsb3BlbidlZCBieSBsaWJ2bmRrc3VwcG9ydC5zby4KK25hbWVzcGFjZS5zcGhhbC5zZWFyY2gucGF0aHMgID0gL29kbS8ke0xJQn0KK25hbWVzcGFjZS5zcGhhbC5zZWFyY2gucGF0aHMgKz0gL3ZlbmRvci8ke0xJQn0KKworbmFtZXNwYWNlLnNwaGFsLnBlcm1pdHRlZC5wYXRocyAgPSAvb2RtLyR7TElCfQorbmFtZXNwYWNlLnNwaGFsLnBlcm1pdHRlZC5wYXRocyArPSAvdmVuZG9yLyR7TElCfQorbmFtZXNwYWNlLnNwaGFsLnBlcm1pdHRlZC5wYXRocyArPSAvdmVuZG9yLyR7TElCfS9odworbmFtZXNwYWNlLnNwaGFsLnBlcm1pdHRlZC5wYXRocyArPSAvc3lzdGVtL3ZlbmRvci8ke0xJQn0KKworbmFtZXNwYWNlLnNwaGFsLmFzYW4uc2VhcmNoLnBhdGhzICA9IC9kYXRhL2FzYW4vb2RtLyR7TElCfQorbmFtZXNwYWNlLnNwaGFsLmFzYW4uc2VhcmNoLnBhdGhzICs9ICAgICAgICAgICAvb2RtLyR7TElCfQorbmFtZXNwYWNlLnNwaGFsLmFzYW4uc2VhcmNoLnBhdGhzICs9IC9kYXRhL2FzYW4vdmVuZG9yLyR7TElCfQorbmFtZXNwYWNlLnNwaGFsLmFzYW4uc2VhcmNoLnBhdGhzICs9ICAgICAgICAgICAvdmVuZG9yLyR7TElCfQorCituYW1lc3BhY2Uuc3BoYWwuYXNhbi5wZXJtaXR0ZWQucGF0aHMgID0gL2RhdGEvYXNhbi9vZG0vJHtMSUJ9CituYW1lc3BhY2Uuc3BoYWwuYXNhbi5wZXJtaXR0ZWQucGF0aHMgKz0gICAgICAgICAgIC9vZG0vJHtMSUJ9CituYW1lc3BhY2Uuc3BoYWwuYXNhbi5wZXJtaXR0ZWQucGF0aHMgKz0gL2RhdGEvYXNhbi92ZW5kb3IvJHtMSUJ9CituYW1lc3BhY2Uuc3BoYWwuYXNhbi5wZXJtaXR0ZWQucGF0aHMgKz0gICAgICAgICAgIC92ZW5kb3IvJHtMSUJ9CisKKyMgS2VlcCB0aGUgYmVsb3cgaW4gc3luYyB3aXRoICJ2bmRrIiBuYW1lc3BhY2UgaW4gc3lzdGVtJ3MgL2V0Yy9sZC5jb25maWcudHh0CisjIFN5c3RlbSdzIHNwaGFsIG5hbWVzcGFjZSBsaW5rcyB0byB2bmRrIG5hbWVzcGFjZSBmb3IgJVZOREtfU0FNRVBST0NFU1NfTElCUkFSSUVTJSwKKyMgc2luY2Ugd2UgZG9uJ3QgaGF2ZSBhIGdvb2Qgd2F5IHRvIGF1dG8tZXhwYW5kICVWTkRLX1NBTUVQUk9DRVNTX0xJQlJBUklFUyUsCisjIHdlJ2xsIGFkZCB0aGUgdm5kayBwYXRocyBiZWxvdy4KKworbmFtZXNwYWNlLnNwaGFsLnNlYXJjaC5wYXRocyArPSAvb2RtLyR7TElCfS92bmRrLXNwCituYW1lc3BhY2Uuc3BoYWwuc2VhcmNoLnBhdGhzICs9IC92ZW5kb3IvJHtMSUJ9L3ZuZGstc3AKK25hbWVzcGFjZS5zcGhhbC5zZWFyY2gucGF0aHMgKz0gL3N5c3RlbS8ke0xJQn0vdm5kay1zcCR7Vk5ES19WRVJ9CisKK25hbWVzcGFjZS5zcGhhbC5wZXJtaXR0ZWQucGF0aHMgKz0gL29kbS8ke0xJQn0vaHcKK25hbWVzcGFjZS5zcGhhbC5wZXJtaXR0ZWQucGF0aHMgKz0gL29kbS8ke0xJQn0vZWdsCituYW1lc3BhY2Uuc3BoYWwucGVybWl0dGVkLnBhdGhzICs9IC92ZW5kb3IvJHtMSUJ9L2h3CituYW1lc3BhY2Uuc3BoYWwucGVybWl0dGVkLnBhdGhzICs9IC92ZW5kb3IvJHtMSUJ9L2VnbAorbmFtZXNwYWNlLnNwaGFsLnBlcm1pdHRlZC5wYXRocyArPSAvc3lzdGVtL3ZlbmRvci8ke0xJQn0vaHcKK25hbWVzcGFjZS5zcGhhbC5wZXJtaXR0ZWQucGF0aHMgKz0gL3N5c3RlbS92ZW5kb3IvJHtMSUJ9L2VnbAorIyBUaGlzIGlzIGV4Y2VwdGlvbmFsbHkgcmVxdWlyZWQgc2luY2UgYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAtaW1wbC5zbyBpcyBoZXJlCituYW1lc3BhY2Uuc3BoYWwucGVybWl0dGVkLnBhdGhzICs9IC9zeXN0ZW0vJHtMSUJ9L3ZuZGstc3Ake1ZOREtfVkVSfS9odworCituYW1lc3BhY2Uuc3BoYWwuYXNhbi5zZWFyY2gucGF0aHMgKz0gL2RhdGEvYXNhbi9vZG0vJHtMSUJ9L3ZuZGstc3AKK25hbWVzcGFjZS5zcGhhbC5hc2FuLnNlYXJjaC5wYXRocyArPSAgICAgICAgICAgL29kbS8ke0xJQn0vdm5kay1zcAorbmFtZXNwYWNlLnNwaGFsLmFzYW4uc2VhcmNoLnBhdGhzICs9IC9kYXRhL2FzYW4vdmVuZG9yLyR7TElCfS92bmRrLXNwCituYW1lc3BhY2Uuc3BoYWwuYXNhbi5zZWFyY2gucGF0aHMgKz0gICAgICAgICAgIC92ZW5kb3IvJHtMSUJ9L3ZuZGstc3AKK25hbWVzcGFjZS5zcGhhbC5hc2FuLnNlYXJjaC5wYXRocyArPSAvZGF0YS9hc2FuL3N5c3RlbS8ke0xJQn0vdm5kay1zcCR7Vk5ES19WRVJ9CituYW1lc3BhY2Uuc3BoYWwuYXNhbi5zZWFyY2gucGF0aHMgKz0gICAgICAgICAgIC9zeXN0ZW0vJHtMSUJ9L3ZuZGstc3Ake1ZOREtfVkVSfQorCituYW1lc3BhY2Uuc3BoYWwuYXNhbi5wZXJtaXR0ZWQucGF0aHMgKz0gL2RhdGEvYXNhbi9vZG0vJHtMSUJ9L2h3CituYW1lc3BhY2Uuc3BoYWwuYXNhbi5wZXJtaXR0ZWQucGF0aHMgKz0gICAgICAgICAgIC9vZG0vJHtMSUJ9L2h3CituYW1lc3BhY2Uuc3BoYWwuYXNhbi5wZXJtaXR0ZWQucGF0aHMgKz0gL2RhdGEvYXNhbi9vZG0vJHtMSUJ9L2VnbAorbmFtZXNwYWNlLnNwaGFsLmFzYW4ucGVybWl0dGVkLnBhdGhzICs9ICAgICAgICAgICAvb2RtLyR7TElCfS9lZ2wKK25hbWVzcGFjZS5zcGhhbC5hc2FuLnBlcm1pdHRlZC5wYXRocyArPSAvZGF0YS9hc2FuL3ZlbmRvci8ke0xJQn0vaHcKK25hbWVzcGFjZS5zcGhhbC5hc2FuLnBlcm1pdHRlZC5wYXRocyArPSAgICAgICAgICAgL3ZlbmRvci8ke0xJQn0vaHcKK25hbWVzcGFjZS5zcGhhbC5hc2FuLnBlcm1pdHRlZC5wYXRocyArPSAvZGF0YS9hc2FuL3ZlbmRvci8ke0xJQn0vZWdsCituYW1lc3BhY2Uuc3BoYWwuYXNhbi5wZXJtaXR0ZWQucGF0aHMgKz0gICAgICAgICAgIC92ZW5kb3IvJHtMSUJ9L2VnbAorCituYW1lc3BhY2Uuc3BoYWwuYXNhbi5wZXJtaXR0ZWQucGF0aHMgKz0gL2RhdGEvYXNhbi9zeXN0ZW0vJHtMSUJ9L3ZuZGstc3Ake1ZOREtfVkVSfS9odworbmFtZXNwYWNlLnNwaGFsLmFzYW4ucGVybWl0dGVkLnBhdGhzICs9ICAgICAgICAgICAvc3lzdGVtLyR7TElCfS92bmRrLXNwJHtWTkRLX1ZFUn0vaHcKKworIyBPbmNlIGluIHRoaXMgbmFtZXNwYWNlLCBhY2Nlc3MgdG8gbGlicmFyaWVzIGluIC9zeXN0ZW0vbGliIGlzIHJlc3RyaWN0ZWQuIE9ubHkKKyMgbGlicyBsaXN0ZWQgaGVyZSBjYW4gYmUgdXNlZC4KK25hbWVzcGFjZS5zcGhhbC5saW5rcyA9IHBsYXRmb3JtCisKKyMgVE9ETzogcmVwbGFjZSB0aGUgZm9sbG93aW5nIHdoZW4gYXBleCBoYXMgYSB3YXkgdG8gYXV0by1nZW5lcmF0ZSB0aGlzIGxpc3QKKyMgbmFtZXNwYWNlLnNwaGFsLmxpbmsucGxhdGZvcm0uc2hhcmVkX2xpYnMgID0gJUxMTkRLX0xJQlJBUklFUyUKKyMgbmFtZXNwYWNlLnNwaGFsLmxpbmsucGxhdGZvcm0uc2hhcmVkX2xpYnMgKz0gJVNBTklUSVpFUl9SVU5USU1FX0xJQlJBUklFUyUKK25hbWVzcGFjZS5zcGhhbC5saW5rLnBsYXRmb3JtLnNoYXJlZF9saWJzID0gbGliRUdMLnNvOmxpYkdMRVN2MV9DTS5zbzpsaWJHTEVTdjIuc286bGliR0xFU3YzLnNvOmxpYlJTLnNvOmxpYmFuZHJvaWRfbmV0LnNvOmxpYmMuc286bGliY2dyb3VwcmMuc286bGliY2xhbmdfcnQuYXNhbi1hYXJjaDY0LWFuZHJvaWQuc286bGliY2xhbmdfcnQuYXNhbi1hcm0tYW5kcm9pZC5zbzpsaWJjbGFuZ19ydC5od2FzYW4tYWFyY2g2NC1hbmRyb2lkLnNvOmxpYmNsYW5nX3J0LmFzYW4taTY4Ni1hbmRyb2lkLnNvOmxpYmNsYW5nX3J0LmFzYW4teDg2XzY0LWFuZHJvaWQuc286bGliZGwuc286bGliZnQyLnNvOmxpYmxvZy5zbzpsaWJtLnNvOmxpYm1lZGlhbmRrLnNvOmxpYm5hdGl2ZXdpbmRvdy5zbzpsaWJuZXVyYWxuZXR3b3Jrcy5zbzpsaWJzeW5jLnNvOmxpYnZuZGtzdXBwb3J0LnNvOmxpYnZ1bGthbi5zbworCisjIEFkZCBhIGxpbmsgZm9yIGxpYnouc28gd2hpY2ggaXMgbGxuZGsgb24gZGV2aWNlcyB3aGVyZSBWTkRLIGlzIG5vdCBlbmZvcmNlZC4KK25hbWVzcGFjZS5zcGhhbC5saW5rLnBsYXRmb3JtLnNoYXJlZF9saWJzICs9IGxpYnouc28KZGlmZiAtLWdpdCBhL2FwZXgvbWFuaWZlc3QuanNvbiBiL2FwZXgvbWFuaWZlc3QuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2I5ZGQwCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9tYW5pZmVzdC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAibmFtZSI6ICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICJ2ZXJzaW9uIjogMjIwMDAwMDAwCit9CmRpZmYgLS1naXQgYS9hcGV4L21hbmlmZXN0X2NvZGVjLmpzb24gYi9hcGV4L21hbmlmZXN0X2NvZGVjLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThjZTg2OAotLS0gL2Rldi9udWxsCisrKyBiL2FwZXgvbWFuaWZlc3RfY29kZWMuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIm5hbWUiOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICJ2ZXJzaW9uIjogMjIwMDAwMDAwCit9CmRpZmYgLS1naXQgYS9hcGV4L21lZGlhc3djb2RlYy5yYyBiL2FwZXgvbWVkaWFzd2NvZGVjLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNzQ4MWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L21lZGlhc3djb2RlYy5yYwpAQCAtMCwwICsxLDcgQEAKK3NlcnZpY2UgbWVkaWEuc3djb2RlYyAvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjL2Jpbi9tZWRpYXN3Y29kZWMKKyAgICBjbGFzcyBtYWluCisgICAgdXNlciBtZWRpYWNvZGVjCisgICAgZ3JvdXAgY2FtZXJhIGRybXJwYyBtZWRpYWRybQorICAgIG92ZXJyaWRlCisgICAgaW9wcmlvIHJ0IDQKKyAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCmRpZmYgLS1naXQgYS9hcGV4L3Rlc3RpbmcvQW5kcm9pZC5icCBiL2FwZXgvdGVzdGluZy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwMWNlZDcKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L3Rlc3RpbmcvQW5kcm9pZC5icApAQCAtMCwwICsxLDI5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCithcGV4IHsKKyAgICBuYW1lOiAidGVzdF9jb20uYW5kcm9pZC5tZWRpYSIsCisgICAgbWFuaWZlc3Q6ICJ0ZXN0X21hbmlmZXN0Lmpzb24iLAorICAgIGZpbGVfY29udGV4dHM6ICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICAgZGVmYXVsdHM6IFsiY29tLmFuZHJvaWQubWVkaWEtZGVmYXVsdHMiXSwKKyAgICBpbnN0YWxsYWJsZTogZmFsc2UsCit9CisKK2FwZXggeworICAgIG5hbWU6ICJ0ZXN0X2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAgIG1hbmlmZXN0OiAidGVzdF9tYW5pZmVzdF9jb2RlYy5qc29uIiwKKyAgICBmaWxlX2NvbnRleHRzOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICAgZGVmYXVsdHM6IFsiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy1kZWZhdWx0cyJdLAorICAgIGluc3RhbGxhYmxlOiBmYWxzZSwKK30KZGlmZiAtLWdpdCBhL2FwZXgvdGVzdGluZy90ZXN0X21hbmlmZXN0Lmpzb24gYi9hcGV4L3Rlc3RpbmcvdGVzdF9tYW5pZmVzdC5qc29uCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZDY0MmUKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L3Rlc3RpbmcvdGVzdF9tYW5pZmVzdC5qc29uCkBAIC0wLDAgKzEsNCBAQAoreworICAibmFtZSI6ICJjb20uYW5kcm9pZC5tZWRpYSIsCisgICJ2ZXJzaW9uIjogMzAwMDAwMDAwCit9CmRpZmYgLS1naXQgYS9hcGV4L3Rlc3RpbmcvdGVzdF9tYW5pZmVzdF9jb2RlYy5qc29uIGIvYXBleC90ZXN0aW5nL3Rlc3RfbWFuaWZlc3RfY29kZWMuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzIwZmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvYXBleC90ZXN0aW5nL3Rlc3RfbWFuaWZlc3RfY29kZWMuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIm5hbWUiOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICJ2ZXJzaW9uIjogMzAwMDAwMDAwCit9CmRpZmYgLS1naXQgYS9jYW1lcmEvQW5kcm9pZC5icCBiL2NhbWVyYS9BbmRyb2lkLmJwCmluZGV4IDI0YjM5MTguLjI4MDA1OTUgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9BbmRyb2lkLmJwCisrKyBiL2NhbWVyYS9BbmRyb2lkLmJwCkBAIC0xMiw4ICsxMiw2IEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotc3ViZGlycyA9IFsibmRrIl0KLQogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJjYW1lcmFfY2xpZW50IiwKIApAQCAtNDMsNiArNDEsNyBAQAogICAgICAgICAiSUNhbWVyYVJlY29yZGluZ1Byb3h5TGlzdGVuZXIuY3BwIiwKICAgICAgICAgImNhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuY3BwIiwKICAgICAgICAgImNhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5jcHAiLAorICAgICAgICAiY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5jcHAiLAogICAgICAgICAiY2FtZXJhMi9TdWJtaXRJbmZvLmNwcCIsCiAgICAgICAgICJDYW1lcmFCYXNlLmNwcCIsCiAgICAgICAgICJDYW1lcmFVdGlscy5jcHAiLApkaWZmIC0tZ2l0IGEvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmNwcCBiL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5jcHAKaW5kZXggZTE0M2UwNS4uOTJmZTg0YiAxMDA2NDQKLS0tIGEvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmNwcAorKysgYi9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuY3BwCkBAIC0yMiw3ICsyMiw2IEBACiAKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+Ci0jaW5jbHVkZSA8Y2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00MDksNiArNDA4LDc5IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhTWV0YWRhdGE6OnJlbW92ZVBlcm1pc3Npb25FbnRyaWVzKG1ldGFkYXRhX3ZlbmRvcl9pZF90IHZlbmRvcklkLAorICAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiAqdGFnc1JlbW92ZWQpIHsKKyAgICB1aW50MzJfdCB0YWdDb3VudCA9IDA7CisgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHRhZ3NUb1JlbW92ZTsKKworICAgIGlmICh0YWdzUmVtb3ZlZCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gdlRhZ3MgPSBWZW5kb3JUYWdEZXNjcmlwdG9yOjpnZXRHbG9iYWxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisgICAgaWYgKChudWxscHRyID09IHZUYWdzLmdldCgpKSB8fCAoMCA+PSB2VGFncy0+Z2V0VGFnQ291bnQoKSkpIHsKKyAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlPiBjYWNoZSA9CisgICAgICAgICAgICBWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGU6OmdldEdsb2JhbFZlbmRvclRhZ0NhY2hlKCk7CisgICAgICAgIGlmIChjYWNoZS5nZXQoKSkgeworICAgICAgICAgICAgY2FjaGUtPmdldFZlbmRvclRhZ0Rlc2NyaXB0b3IodmVuZG9ySWQsICZ2VGFncyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKG51bGxwdHIgIT0gdlRhZ3MuZ2V0KCkpICYmICh2VGFncy0+Z2V0VGFnQ291bnQoKSA+IDApKSB7CisgICAgICAgIHRhZ0NvdW50ID0gdlRhZ3MtPmdldFRhZ0NvdW50KCk7CisgICAgICAgIHVpbnQzMl90ICp2ZW5kb3JUYWdzID0gbmV3IHVpbnQzMl90W3RhZ0NvdW50XTsKKyAgICAgICAgaWYgKG51bGxwdHIgPT0gdmVuZG9yVGFncykgeworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICB2VGFncy0+Z2V0VGFnQXJyYXkodmVuZG9yVGFncyk7CisKKyAgICAgICAgdGFnc1RvUmVtb3ZlLnJlc2VydmUodGFnQ291bnQpOworICAgICAgICB0YWdzVG9SZW1vdmUuaW5zZXJ0KHRhZ3NUb1JlbW92ZS5iZWdpbigpLCB2ZW5kb3JUYWdzLCB2ZW5kb3JUYWdzICsgdGFnQ291bnQpOworCisgICAgICAgIGRlbGV0ZSBbXSB2ZW5kb3JUYWdzOworICAgICAgICB0YWdDb3VudCA9IDA7CisgICAgfQorCisgICAgYXV0byB0YWdzTmVlZGluZ1Blcm1pc3Npb24gPSBnZXRfY2FtZXJhX21ldGFkYXRhX3Blcm1pc3Npb25fbmVlZGVkKCZ0YWdDb3VudCk7CisgICAgaWYgKHRhZ0NvdW50ID4gMCkgeworICAgICAgICB0YWdzVG9SZW1vdmUucmVzZXJ2ZSh0YWdzVG9SZW1vdmUuY2FwYWNpdHkoKSArIHRhZ0NvdW50KTsKKyAgICAgICAgdGFnc1RvUmVtb3ZlLmluc2VydCh0YWdzVG9SZW1vdmUuZW5kKCksIHRhZ3NOZWVkaW5nUGVybWlzc2lvbiwKKyAgICAgICAgICAgICAgICB0YWdzTmVlZGluZ1Blcm1pc3Npb24gKyB0YWdDb3VudCk7CisgICAgfQorCisgICAgdGFnc1JlbW92ZWQtPnJlc2VydmUodGFnc1RvUmVtb3ZlLnNpemUoKSk7CisgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IHRhZ3NUb1JlbW92ZSkgeworICAgICAgICBpZiAoZXhpc3RzKGl0KSkgeworICAgICAgICAgICAgYXV0byByYyA9IGVyYXNlKGl0KTsKKyAgICAgICAgICAgIGlmIChOT19FUlJPUiAhPSByYykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGVyYXNlIHRhZzogJXgiLCBfX2Z1bmNfXywgaXQpOworICAgICAgICAgICAgICAgIHJldHVybiByYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHRhZ3NSZW1vdmVkLT5wdXNoX2JhY2soaXQpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVXBkYXRlIHRoZSBhdmFpbGFibGUgY2hhcmFjdGVyc3RpY3MgYWNjb3JkaW5nbHkKKyAgICBpZiAoZXhpc3RzKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0hBUkFDVEVSSVNUSUNTX0tFWVMpKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBjdXJyZW50S2V5czsKKworICAgICAgICBzdGQ6OnNvcnQodGFnc1JlbW92ZWQtPmJlZ2luKCksIHRhZ3NSZW1vdmVkLT5lbmQoKSk7CisgICAgICAgIGF1dG8ga2V5cyA9IGZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUyk7CisgICAgICAgIGN1cnJlbnRLZXlzLnJlc2VydmUoa2V5cy5jb3VudCk7CisgICAgICAgIGN1cnJlbnRLZXlzLmluc2VydChjdXJyZW50S2V5cy5lbmQoKSwga2V5cy5kYXRhLmkzMiwga2V5cy5kYXRhLmkzMiArIGtleXMuY291bnQpOworICAgICAgICBzdGQ6OnNvcnQoY3VycmVudEtleXMuYmVnaW4oKSwgY3VycmVudEtleXMuZW5kKCkpOworCisgICAgICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IG5ld0tleXMoa2V5cy5jb3VudCk7CisgICAgICAgIGF1dG8gZW5kID0gc3RkOjpzZXRfZGlmZmVyZW5jZShjdXJyZW50S2V5cy5iZWdpbigpLCBjdXJyZW50S2V5cy5lbmQoKSwgdGFnc1JlbW92ZWQtPmJlZ2luKCksCisgICAgICAgICAgICAgICAgdGFnc1JlbW92ZWQtPmVuZCgpLCBuZXdLZXlzLmJlZ2luKCkpOworICAgICAgICBuZXdLZXlzLnJlc2l6ZShlbmQgLSBuZXdLZXlzLmJlZ2luKCkpOworCisgICAgICAgIHVwZGF0ZShBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTLCBuZXdLZXlzLmRhdGEoKSwgbmV3S2V5cy5zaXplKCkpOworICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwogdm9pZCBDYW1lcmFNZXRhZGF0YTo6ZHVtcChpbnQgZmQsIGludCB2ZXJib3NpdHksIGludCBpbmRlbnRhdGlvbikgY29uc3QgewogICAgIGR1bXBfaW5kZW50ZWRfY2FtZXJhX21ldGFkYXRhKG1CdWZmZXIsIGZkLCB2ZXJib3NpdHksIGluZGVudGF0aW9uKTsKIH0KZGlmZiAtLWdpdCBhL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmNwcCBiL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmNwcAppbmRleCA5MjhhNmJjLi4xZDhlOGM0IDEwMDY0NAotLS0gYS9jYW1lcmEvQ2FwdHVyZVJlc3VsdC5jcHAKKysrIGIvY2FtZXJhL0NhcHR1cmVSZXN1bHQuY3BwCkBAIC0zOSw2ICszOSwxNiBAQAogICAgIHBhcmNlbC0+cmVhZEludDY0KCZmcmFtZU51bWJlcik7CiAgICAgcGFyY2VsLT5yZWFkSW50MzIoJnBhcnRpYWxSZXN1bHRDb3VudCk7CiAgICAgcGFyY2VsLT5yZWFkSW50MzIoJmVycm9yU3RyZWFtSWQpOworICAgIGF1dG8gcGh5c2ljYWxDYW1lcmFJZFByZXNlbnQgPSBwYXJjZWwtPnJlYWRCb29sKCk7CisgICAgaWYgKHBoeXNpY2FsQ2FtZXJhSWRQcmVzZW50KSB7CisgICAgICAgIFN0cmluZzE2IGNhbWVyYUlkOworICAgICAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICAgICAgaWYgKChyZXMgPSBwYXJjZWwtPnJlYWRTdHJpbmcxNigmY2FtZXJhSWQpKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBjYW1lcmEgaWQ6ICVkIiwgX19GVU5DVElPTl9fLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBlcnJvclBoeXNpY2FsQ2FtZXJhSWQgPSBjYW1lcmFJZDsKKyAgICB9CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC01Niw2ICs2NiwxNiBAQAogICAgIHBhcmNlbC0+d3JpdGVJbnQ2NChmcmFtZU51bWJlcik7CiAgICAgcGFyY2VsLT53cml0ZUludDMyKHBhcnRpYWxSZXN1bHRDb3VudCk7CiAgICAgcGFyY2VsLT53cml0ZUludDMyKGVycm9yU3RyZWFtSWQpOworICAgIGlmIChlcnJvclBoeXNpY2FsQ2FtZXJhSWQuc2l6ZSgpID4gMCkgeworICAgICAgICBwYXJjZWwtPndyaXRlQm9vbCh0cnVlKTsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgICAgIGlmICgocmVzID0gcGFyY2VsLT53cml0ZVN0cmluZzE2KGVycm9yUGh5c2ljYWxDYW1lcmFJZCkpICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB3cml0ZSBwaHlzaWNhbCBjYW1lcmEgSUQgdG8gcGFyY2VsOiAlZCIsIF9fRlVOQ1RJT05fXywgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBwYXJjZWwtPndyaXRlQm9vbChmYWxzZSk7CisgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL09XTkVSUyBiL2NhbWVyYS9PV05FUlMKaW5kZXggMThhY2ZlZS4uZDZiOTVkYSAxMDA2NDQKLS0tIGEvY2FtZXJhL09XTkVSUworKysgYi9jYW1lcmEvT1dORVJTCkBAIC0xLDYgKzEsOCBAQAotY3ljaGVuQGdvb2dsZS5jb20KIGVwZWV2QGdvb2dsZS5jb20KIGV0YWx2YWxhQGdvb2dsZS5jb20KK2pjaG93ZGhhcnlAZ29vZ2xlLmNvbQogc2h1emhlbndhbmdAZ29vZ2xlLmNvbQogeWluY2hpYXllaEBnb29nbGUuY29tCisjIGJhY2t1cCBvd25lcgorY3ljaGVuQGdvb2dsZS5jb20KIHpoaWp1bmhlQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmNwcCBiL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmNwcAppbmRleCA0YzI4Nzg5Li5kNzEzZDJkIDEwMDY0NAotLS0gYS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAKKysrIGIvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuY3BwCkBAIC0zMTUsNiArMzE1LDEwIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzc2l6ZV90IFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmdldFNlY3Rpb25JbmRleCh1aW50MzJfdCB0YWcpIGNvbnN0IHsKKyAgICByZXR1cm4gbVRhZ1RvU2VjdGlvbk1hcC52YWx1ZUZvcih0YWcpOworfQorCiB2b2lkIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmR1bXAoaW50IGZkLCBpbnQgdmVyYm9zaXR5LCBpbnQgaW5kZW50YXRpb24pIGNvbnN0IHsKIAogICAgIHNpemVfdCBzaXplID0gbVRhZ1RvTmFtZU1hcC5zaXplKCk7CkBAIC00MDcsNiArNDExLDExIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAorY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPG1ldGFkYXRhX3ZlbmRvcl9pZF90LCBzcDxhbmRyb2lkOjpWZW5kb3JUYWdEZXNjcmlwdG9yPj4gJgorICAgICAgICAgICAgVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlOjpnZXRWZW5kb3JJZHNBbmRUYWdEZXNjcmlwdG9ycygpIHsKKyAgICByZXR1cm4gbVZlbmRvck1hcDsKK30KKwogaW50IFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZTo6Z2V0VGFnQ291bnQobWV0YWRhdGFfdmVuZG9yX2lkX3QgaWQpIGNvbnN0IHsKICAgICBpbnQgcmV0ID0gMDsKICAgICBhdXRvIGRlc2MgPSBtVmVuZG9yTWFwLmZpbmQoaWQpOwpAQCAtNTY2LDcgKzU3NSw3IEBACiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0YXRpY19jYXN0PHNpemVfdD4odGFnQ291bnQpOyArK2kpIHsKICAgICAgICAgdWludDMyX3QgdGFnID0gdGFnQXJyYXlbaV07Ci0gICAgICAgIFN0cmluZzggc2VjdGlvblN0cmluZyA9IHRhZ1RvU2VjdGlvbk1hcC52YWx1ZUZvcih0YWcpOworICAgICAgICBjb25zdCBTdHJpbmc4JiBzZWN0aW9uU3RyaW5nID0gdGFnVG9TZWN0aW9uTWFwLnZhbHVlRm9yKHRhZyk7CiAKICAgICAgICAgLy8gU2V0IHVwIHRhZyB0byBzZWN0aW9uIGluZGV4IG1hcAogICAgICAgICBzc2l6ZV90IGluZGV4ID0gc2VjdGlvbnMuaW5kZXhPZihzZWN0aW9uU3RyaW5nKTsKZGlmZiAtLWdpdCBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuYWlkbCBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuYWlkbAppbmRleCA5YzBmMjhiLi4zZTg5OTJhIDEwMDY0NAotLS0gYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmFpZGwKKysrIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5haWRsCkBAIC0xMDgsNyArMTA4LDcgQEAKICAgICAgKgogICAgICAqIEFsc28gcmV0dXJucyB0aGUgc2V0IG9mIGN1cnJlbnRseS1rbm93biBjYW1lcmEgSURzIGFuZCBzdGF0ZSBvZiBlYWNoIGRldmljZS4KICAgICAgKiBBZGRpbmcgYSBsaXN0ZW5lciB3aWxsIHRyaWdnZXIgdGhlIHRvcmNoIHN0YXR1cyBsaXN0ZW5lciB0byBmaXJlIGZvciBhbGwKLSAgICAgKiBkZXZpY2VzIHRoYXQgaGF2ZSBhIGZsYXNoIHVuaXQKKyAgICAgKiBkZXZpY2VzIHRoYXQgaGF2ZSBhIGZsYXNoIHVuaXQuCiAgICAgICovCiAgICAgQ2FtZXJhU3RhdHVzW10gYWRkTGlzdGVuZXIoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lciBsaXN0ZW5lcik7CiAKQEAgLTE0OSw4ICsxNDksMTAgQEAKICAgICBjb25zdCBpbnQgQVBJX1ZFUlNJT05fMSA9IDE7CiAgICAgY29uc3QgaW50IEFQSV9WRVJTSU9OXzIgPSAyOwogCi0gICAgLy8gRGV0ZXJtaW5lcyBpZiBhIHBhcnRpY3VsYXIgQVBJIHZlcnNpb24gaXMgc3VwcG9ydGVkIGRpcmVjdGx5CisgICAgLy8gRGV0ZXJtaW5lcyBpZiBhIHBhcnRpY3VsYXIgQVBJIHZlcnNpb24gaXMgc3VwcG9ydGVkIGRpcmVjdGx5IGZvciBhIGNhbWVyYUlkLgogICAgIGJvb2xlYW4gc3VwcG9ydHNDYW1lcmFBcGkoU3RyaW5nIGNhbWVyYUlkLCBpbnQgYXBpVmVyc2lvbik7CisgICAgLy8gRGV0ZXJtaW5lcyBpZiBhIGNhbWVyYUlkIGlzIGEgaGlkZGVuIHBoeXNpY2FsIGNhbWVyYSBvZiBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLgorICAgIGJvb2xlYW4gaXNIaWRkZW5QaHlzaWNhbENhbWVyYShTdHJpbmcgY2FtZXJhSWQpOwogCiAgICAgdm9pZCBzZXRUb3JjaE1vZGUoU3RyaW5nIGNhbWVyYUlkLCBib29sZWFuIGVuYWJsZWQsIElCaW5kZXIgY2xpZW50QmluZGVyKTsKIApAQCAtMTYwLDYgKzE2MiwyOCBAQAogICAgICAqIENhbGxlcnMgcmVxdWlyZSB0aGUgYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQV9TRU5EX1NZU1RFTV9FVkVOVFMgcGVybWlzc2lvbi4KICAgICAgKi8KICAgICBjb25zdCBpbnQgRVZFTlRfTk9ORSA9IDA7Ci0gICAgY29uc3QgaW50IEVWRU5UX1VTRVJfU1dJVENIRUQgPSAxOworICAgIGNvbnN0IGludCBFVkVOVF9VU0VSX1NXSVRDSEVEID0gMTsgLy8gVGhlIGFyZ3VtZW50IGlzIHRoZSBzZXQgb2YgbmV3IGZvcmVncm91bmQgdXNlciBJRHMuCiAgICAgb25ld2F5IHZvaWQgbm90aWZ5U3lzdGVtRXZlbnQoaW50IGV2ZW50SWQsIGluIGludFtdIGFyZ3MpOworCisgICAgLyoqCisgICAgICogTm90aWZ5IHRoZSBjYW1lcmEgc2VydmljZSBvZiBhIGRldmljZSBwaHlzaWNhbCBzdGF0dXMgY2hhbmdlLiBNYXkgb25seSBiZSBjYWxsZWQgZnJvbQorICAgICAqIGEgcHJpdmlsZWdlZCBwcm9jZXNzLgorICAgICAqCisgICAgICogbmV3U3RhdGUgaXMgYSBiaXRmaWVsZCBjb25zaXN0aW5nIG9mIERFVklDRV9TVEFURV8qIHZhbHVlcyBjb21iaW5lZCB0b2dldGhlci4gVmFsaWQgc3RhdGUKKyAgICAgKiBjb21iaW5hdGlvbnMgYXJlIGRldmljZS1zcGVjaWZpYy4gQXQgZGV2aWNlIHN0YXJ0dXAsIHRoZSBjYW1lcmEgc2VydmljZSB3aWxsIGFzc3VtZSB0aGUgZGV2aWNlCisgICAgICogc3RhdGUgaXMgTk9STUFMIHVudGlsIG90aGVyd2lzZSBub3RpZmllZC4KKyAgICAgKgorICAgICAqIENhbGxlcnMgcmVxdWlyZSB0aGUgYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQV9TRU5EX1NZU1RFTV9FVkVOVFMgcGVybWlzc2lvbi4KKyAgICAgKi8KKyAgICBvbmV3YXkgdm9pZCBub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShsb25nIG5ld1N0YXRlKTsKKworICAgIC8vIEJpdGZpZWxkIGNvbnN0YW50cyBmb3Igbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UKKyAgICAvLyBBbGwgYml0cyA+PSAzMiBhcmUgZm9yIGN1c3RvbSB2ZW5kb3Igc3RhdGVzCisgICAgLy8gV3JpdHRlbiBhcyBpbnRzIHNpbmNlIEFJREwgZG9lcyBub3Qgc3VwcG9ydCBsb25nIGNvbnN0YW50cy4KKyAgICBjb25zdCBpbnQgREVWSUNFX1NUQVRFX05PUk1BTCA9IDA7CisgICAgY29uc3QgaW50IERFVklDRV9TVEFURV9CQUNLX0NPVkVSRUQgPSAxOworICAgIGNvbnN0IGludCBERVZJQ0VfU1RBVEVfRlJPTlRfQ09WRVJFRCA9IDI7CisgICAgY29uc3QgaW50IERFVklDRV9TVEFURV9GT0xERUQgPSA0OworICAgIGNvbnN0IGludCBERVZJQ0VfU1RBVEVfTEFTVF9GUkFNRVdPUktfQklUID0gMHg4MDAwMDAwMDsgLy8gMSA8PCAzMTsKKwogfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZUxpc3RlbmVyLmFpZGwgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuYWlkbAppbmRleCBmODcxY2U0Li5lOWRjYmRiIDEwMDY0NAotLS0gYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuYWlkbAorKysgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuYWlkbApAQCAtNzYsNCArNzYsMTEgQEAKICAgICBjb25zdCBpbnQgVE9SQ0hfU1RBVFVTX1VOS05PV04gPSAtMTsKIAogICAgIG9uZXdheSB2b2lkIG9uVG9yY2hTdGF0dXNDaGFuZ2VkKGludCBzdGF0dXMsIFN0cmluZyBjYW1lcmFJZCk7CisKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgcmVnaXN0ZXJlZCBjbGllbnRzIGFib3V0IGNhbWVyYSBhY2Nlc3MgcHJpb3JpdHkgY2hhbmdlcy4KKyAgICAgKiBDbGllbnRzIHdoaWNoIHdlcmUgcHJldmlvdXNseSB1bmFibGUgdG8gb3BlbiBhIGNlcnRhaW4gY2FtZXJhIGRldmljZQorICAgICAqIGNhbiByZXRyeSBhZnRlciByZWNlaXZpbmcgdGhpcyBjYWxsYmFjay4KKyAgICAgKi8KKyAgICBvbmV3YXkgdm9pZCBvbkNhbWVyYUFjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkKCk7CiB9CmRpZmYgLS1naXQgYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuYWlkbCBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5haWRsCmluZGV4IDRjZWQwOGMuLjQ5ZGZkZTggMTAwNjQ0Ci0tLSBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5haWRsCisrKyBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5haWRsCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhcHR1cmVSZXF1ZXN0OwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5pbXBsLkNhbWVyYU1ldGFkYXRhTmF0aXZlOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5wYXJhbXMuT3V0cHV0Q29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIucGFyYW1zLlNlc3Npb25Db25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi51dGlscy5TdWJtaXRJbmZvOwogaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOwogCkBAIC04Myw2ICs4NCwxNiBAQAogICAgICAqLwogICAgIHZvaWQgZW5kQ29uZmlndXJlKGludCBvcGVyYXRpbmdNb2RlLCBpbiBDYW1lcmFNZXRhZGF0YU5hdGl2ZSBzZXNzaW9uUGFyYW1zKTsKIAorICAgIC8qKgorICAgICAgKiBDaGVjayB3aGV0aGVyIGEgcGFydGljdWxhciBzZXNzaW9uIGNvbmZpZ3VyYXRpb24gaGFzIGNhbWVyYSBkZXZpY2UKKyAgICAgICogc3VwcG9ydC4KKyAgICAgICoKKyAgICAgICogQHBhcmFtIHNlc3Npb25Db25maWd1cmF0aW9uIFNwZWNpZmljIHNlc3Npb24gY29uZmlndXJhdGlvbiB0byBiZSB2ZXJpZmllZC4KKyAgICAgICogQHJldHVybiB0cnVlICAtIGluIGNhc2UgdGhlIHN0cmVhbSBjb21iaW5hdGlvbiBpcyBzdXBwb3J0ZWQuCisgICAgICAqICAgICAgICAgZmFsc2UgLSBpbiBjYXNlIHRoZXJlIGlzIG5vIGRldmljZSBzdXBwb3J0LgorICAgICAgKi8KKyAgICBib29sZWFuIGlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoaW4gU2Vzc2lvbkNvbmZpZ3VyYXRpb24gc2Vzc2lvbkNvbmZpZ3VyYXRpb24pOworCiAgICAgdm9pZCBkZWxldGVTdHJlYW0oaW50IHN0cmVhbUlkKTsKIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL3BhcmFtcy9TZXNzaW9uQ29uZmlndXJhdGlvbi5haWRsIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL3BhcmFtcy9TZXNzaW9uQ29uZmlndXJhdGlvbi5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZjE1NTYKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvcGFyYW1zL1Nlc3Npb25Db25maWd1cmF0aW9uLmFpZGwKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLnBhcmFtczsKKworLyoqIEBoaWRlICovCitwYXJjZWxhYmxlIFNlc3Npb25Db25maWd1cmF0aW9uIGNwcF9oZWFkZXIgImNhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmgiOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5jcHAgYi9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmNwcAppbmRleCBmZWIwNGMyLi40ZTliMjdkIDEwMDY0NAotLS0gYS9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmNwcAorKysgYi9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmNwcApAQCAtMTY3LDE0ICsxNjcsMjQgQEAKIH0KIAogT3V0cHV0Q29uZmlndXJhdGlvbjo6T3V0cHV0Q29uZmlndXJhdGlvbihzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgZ2JwLCBpbnQgcm90YXRpb24sCisgICAgICAgIGNvbnN0IFN0cmluZzE2JiBwaHlzaWNhbElkLAogICAgICAgICBpbnQgc3VyZmFjZVNldElELCBib29sIGlzU2hhcmVkKSB7CiAgICAgbUdicHMucHVzaF9iYWNrKGdicCk7CiAgICAgbVJvdGF0aW9uID0gcm90YXRpb247CiAgICAgbVN1cmZhY2VTZXRJRCA9IHN1cmZhY2VTZXRJRDsKICAgICBtSXNEZWZlcnJlZCA9IGZhbHNlOwogICAgIG1Jc1NoYXJlZCA9IGlzU2hhcmVkOworICAgIG1QaHlzaWNhbENhbWVyYUlkID0gcGh5c2ljYWxJZDsKIH0KIAorT3V0cHV0Q29uZmlndXJhdGlvbjo6T3V0cHV0Q29uZmlndXJhdGlvbigKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4+JiBnYnBzLAorICAgIGludCByb3RhdGlvbiwgY29uc3QgU3RyaW5nMTYmIHBoeXNpY2FsQ2FtZXJhSWQsIGludCBzdXJmYWNlU2V0SUQsICBpbnQgc3VyZmFjZVR5cGUsCisgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBib29sIGlzU2hhcmVkKQorICA6IG1HYnBzKGdicHMpLCBtUm90YXRpb24ocm90YXRpb24pLCBtU3VyZmFjZVNldElEKHN1cmZhY2VTZXRJRCksIG1TdXJmYWNlVHlwZShzdXJmYWNlVHlwZSksCisgICAgbVdpZHRoKHdpZHRoKSwgbUhlaWdodChoZWlnaHQpLCBtSXNEZWZlcnJlZChmYWxzZSksIG1Jc1NoYXJlZChpc1NoYXJlZCksCisgICAgbVBoeXNpY2FsQ2FtZXJhSWQocGh5c2ljYWxDYW1lcmFJZCkgeyB9CisKIHN0YXR1c190IE91dHB1dENvbmZpZ3VyYXRpb246OndyaXRlVG9QYXJjZWwoYW5kcm9pZDo6UGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKIAogICAgIGlmIChwYXJjZWwgPT0gbnVsbHB0cikgcmV0dXJuIEJBRF9WQUxVRTsKZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmNwcCBiL2NhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDMxYTMzCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL2NhbWVyYTIvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uY3BwCkBAIC0wLDAgKzEsMTMzIEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjZGVmaW5lIExPR19UQUcgIlNlc3Npb25Db25maWd1cmF0aW9uIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdHVzX3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb246OnJlYWRGcm9tUGFyY2VsKGNvbnN0IGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSB7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgaW50IG9wZXJhdGluZ01vZGUgPSAwOworCisgICAgaWYgKHBhcmNlbCA9PSBudWxscHRyKSByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmb3BlcmF0aW5nTW9kZSkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgb3BlcmF0aW5nIG1vZGUgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludCBpbnB1dFdpZHRoID0gMDsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZpbnB1dFdpZHRoKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBpbnB1dCB3aWR0aCBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50IGlucHV0SGVpZ2h0ID0gMDsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZpbnB1dEhlaWdodCkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgaW5wdXQgaGVpZ2h0IGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbnQgaW5wdXRGb3JtYXQgPSAtMTsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZpbnB1dEZvcm1hdCkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgaW5wdXQgZm9ybWF0IGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxPdXRwdXRDb25maWd1cmF0aW9uPiBvdXRwdXRTdHJlYW1zOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkUGFyY2VsYWJsZVZlY3Rvcigmb3V0cHV0U3RyZWFtcykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgb3V0cHV0IGNvbmZpZ3VyYXRpb25zIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBtT3BlcmF0aW5nTW9kZSA9IG9wZXJhdGluZ01vZGU7CisgICAgbUlucHV0V2lkdGggPSBpbnB1dFdpZHRoOworICAgIG1JbnB1dEhlaWdodCA9IGlucHV0SGVpZ2h0OworICAgIG1JbnB1dEZvcm1hdCA9IGlucHV0Rm9ybWF0OworICAgIGZvciAoYXV0byYgc3RyZWFtIDogb3V0cHV0U3RyZWFtcykgeworICAgICAgICBtT3V0cHV0U3RyZWFtcy5wdXNoX2JhY2soc3RyZWFtKTsKKyAgICB9CisKKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IFNlc3Npb25Db25maWd1cmF0aW9uOjp3cml0ZVRvUGFyY2VsKGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSBjb25zdCB7CisKKyAgICBpZiAocGFyY2VsID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisKKyAgICBlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobU9wZXJhdGluZ01vZGUpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobUlucHV0V2lkdGgpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobUlucHV0SGVpZ2h0KTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKG1JbnB1dEZvcm1hdCk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIGVyciA9IHBhcmNlbC0+d3JpdGVQYXJjZWxhYmxlVmVjdG9yKG1PdXRwdXRTdHJlYW1zKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgcmV0dXJuIE9LOworfQorCitib29sIFNlc3Npb25Db25maWd1cmF0aW9uOjpvdXRwdXRzRXF1YWwoY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24mIG90aGVyKSBjb25zdCB7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8T3V0cHV0Q29uZmlndXJhdGlvbj4mIG90aGVyT3V0cHV0U3RyZWFtcyA9CisgICAgICAgICAgICBvdGhlci5nZXRPdXRwdXRDb25maWd1cmF0aW9ucygpOworCisgICAgaWYgKG1PdXRwdXRTdHJlYW1zLnNpemUoKSAhPSAgb3RoZXJPdXRwdXRTdHJlYW1zLnNpemUoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0U3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobU91dHB1dFN0cmVhbXNbaV0gIT0gb3RoZXJPdXRwdXRTdHJlYW1zW2ldKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTZXNzaW9uQ29uZmlndXJhdGlvbjo6b3V0cHV0c0xlc3NUaGFuKGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBvdGhlcikgY29uc3QgeworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE91dHB1dENvbmZpZ3VyYXRpb24+JiBvdGhlck91dHB1dFN0cmVhbXMgPQorICAgICAgICAgICAgb3RoZXIuZ2V0T3V0cHV0Q29uZmlndXJhdGlvbnMoKTsKKworICAgIGlmIChtT3V0cHV0U3RyZWFtcy5zaXplKCkgIT0gIG90aGVyT3V0cHV0U3RyZWFtcy5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIG1PdXRwdXRTdHJlYW1zLnNpemUoKSA8IG90aGVyT3V0cHV0U3RyZWFtcy5zaXplKCk7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0U3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobU91dHB1dFN0cmVhbXNbaV0gIT0gb3RoZXJPdXRwdXRTdHJlYW1zW2ldKSB7CisgICAgICAgICAgICByZXR1cm4gbU91dHB1dFN0cmVhbXNbaV0gPCBvdGhlck91dHB1dFN0cmVhbXNbaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhc2VydmVyL0FuZHJvaWQuYnAgYi9jYW1lcmEvY2FtZXJhc2VydmVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTJiMDZjMgotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDQ4IEBACisvLyBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJjYW1lcmFzZXJ2ZXIiLAorCisgICAgc3JjczogWyJtYWluX2NhbWVyYXNlcnZlci5jcHAiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjYW1lcmFzZXJ2aWNlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuY29tbW9uQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjQiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi41IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMiIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy40IiwKKyAgICBdLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKKyAgICBdLAorCisgICAgaW5pdF9yYzogWyJjYW1lcmFzZXJ2ZXIucmMiXSwKKworICAgIHZpbnRmX2ZyYWdtZW50czogWworICAgICAgICAibWFuaWZlc3RfYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2Uuc2VydmljZUAyLjAueG1sIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYXNlcnZlci9BbmRyb2lkLm1rIGIvY2FtZXJhL2NhbWVyYXNlcnZlci9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGM5NGU2Li4wMDAwMDAwCi0tLSBhL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0JbWFpbl9jYW1lcmFzZXJ2ZXIuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYmNhbWVyYXNlcnZpY2UgXAotCWxpYmxvZyBcCi0JbGlidXRpbHMgXAotCWxpYnVpIFwKLQlsaWJndWkgXAotCWxpYmJpbmRlciBcCi0JbGliaGlkbHRyYW5zcG9ydCBcCi0JYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuY29tbW9uQDEuMCBcCi0JYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40IFwKLQlhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMS4wIFwKLQlhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4yCi0KLUxPQ0FMX01PRFVMRTo9IGNhbWVyYXNlcnZlcgotTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQotCi1MT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdleHRyYSAtV2Vycm9yIC1Xbm8tdW51c2VkLXBhcmFtZXRlcgotCi1MT0NBTF9JTklUX1JDIDo9IGNhbWVyYXNlcnZlci5yYwotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvbWFpbl9jYW1lcmFzZXJ2ZXIuY3BwIGIvY2FtZXJhL2NhbWVyYXNlcnZlci9tYWluX2NhbWVyYXNlcnZlci5jcHAKaW5kZXggMzk3MjQzNi4uNTNiM2Q4NCAxMDA2NDQKLS0tIGEvY2FtZXJhL2NhbWVyYXNlcnZlci9tYWluX2NhbWVyYXNlcnZlci5jcHAKKysrIGIvY2FtZXJhL2NhbWVyYXNlcnZlci9tYWluX2NhbWVyYXNlcnZlci5jcHAKQEAgLTI2LDggKzI2LDkgQEAKIHsKICAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CiAKLSAgICAvLyBTZXQgMyB0aHJlYWRzIGZvciBISURMIGNhbGxzCi0gICAgaGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2woMywgLyp3aWxsam9pbiovIGZhbHNlKTsKKyAgICAvLyBTZXQgNSB0aHJlYWRzIGZvciBISURMIGNhbGxzLiBOb3cgY2FtZXJhc2VydmVyIHdpbGwgc2VydmUgSElETCBjYWxscyBpbgorICAgIC8vIGFkZGl0aW9uIHRvIGNvbnN1bWluZyB0aGVtIGZyb20gdGhlIENhbWVyYSBIQUwgYXMgd2VsbC4KKyAgICBoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbCg1LCAvKndpbGxqb2luKi8gZmFsc2UpOwogCiAgICAgc3A8UHJvY2Vzc1N0YXRlPiBwcm9jKFByb2Nlc3NTdGF0ZTo6c2VsZigpKTsKICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhc2VydmVyL21hbmlmZXN0X2FuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4wLnhtbCBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvbWFuaWZlc3RfYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2Uuc2VydmljZUAyLjAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMWM3MTcKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvY2FtZXJhc2VydmVyL21hbmlmZXN0X2FuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4wLnhtbApAQCAtMCwwICsxLDExIEBACis8bWFuaWZlc3QgdmVyc2lvbj0iMS4wIiB0eXBlPSJmcmFtZXdvcmsiPgorICAgIDxoYWw+CisgICAgICAgIDxuYW1lPmFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2U8L25hbWU+CisgICAgICAgIDx0cmFuc3BvcnQ+aHdiaW5kZXI8L3RyYW5zcG9ydD4KKyAgICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgorICAgICAgICA8aW50ZXJmYWNlPgorICAgICAgICAgICAgPG5hbWU+SUNhbWVyYVNlcnZpY2U8L25hbWU+CisgICAgICAgICAgICA8aW5zdGFuY2U+ZGVmYXVsdDwvaW5zdGFuY2U+CisgICAgICAgIDwvaW50ZXJmYWNlPgorICAgIDwvaGFsPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmgKaW5kZXggZDI4NDQ3Ny4uODQ0YmI4MCAxMDA2NDQKLS0tIGEvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmgKKysrIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmgKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KKyNpbmNsdWRlIDxjYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTE3MCw2ICsxNzEsMTIgQEAKICAgICBzdGF0dXNfdCBlcmFzZSh1aW50MzJfdCB0YWcpOwogCiAgICAgLyoqCisgICAgICogUmVtb3ZlIG1ldGFkYXRhIGVudHJpZXMgdGhhdCBuZWVkIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMuCisgICAgICovCisgICAgc3RhdHVzX3QgcmVtb3ZlUGVybWlzc2lvbkVudHJpZXMobWV0YWRhdGFfdmVuZG9yX2lkX3QgdmVuZG9ySWQsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiAqdGFnc1JlbW92ZWQgLypvdXQqLyk7CisKKyAgICAvKioKICAgICAgKiBTd2FwIHRoZSB1bmRlcmx5aW5nIGNhbWVyYSBtZXRhZGF0YSBiZXR3ZWVuIHRoaXMgYW5kIHRoZSBvdGhlcgogICAgICAqIG1ldGFkYXRhIG9iamVjdC4KICAgICAgKi8KZGlmZiAtLWdpdCBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmggYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FwdHVyZVJlc3VsdC5oCmluZGV4IDU2ZmExNzguLmVmODMwYjUgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmgKKysrIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0NhcHR1cmVSZXN1bHQuaApAQCAtNzAsNiArNzAsMTMgQEAKICAgICBpbnQzMl90IGVycm9yU3RyZWFtSWQ7CiAKICAgICAvKioKKyAgICAgKiBGb3IgY2FwdHVyZSByZXN1bHQgZXJyb3JzLCB0aGUgcGh5c2ljYWwgY2FtZXJhIElEIGluIGNhc2UgdGhlIHJlc3BlY3RpdmUgcmVxdWVzdCBjb250YWlucworICAgICAqIGEgcmVmZXJlbmNlIHRvIHBoeXNpY2FsIGNhbWVyYSBkZXZpY2UuCisgICAgICogRW1wdHkgb3RoZXJ3aXNlLgorICAgICAqLworICAgIFN0cmluZzE2ICBlcnJvclBoeXNpY2FsQ2FtZXJhSWQ7CisKKyAgICAvKioKICAgICAgKiBDb25zdHJ1Y3RvciBpbml0aWFsaXplcyBvYmplY3QgYXMgaW52YWxpZCBieSBzZXR0aW5nIHJlcXVlc3RJZCB0byBiZSAtMS4KICAgICAgKi8KICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzKCkKQEAgLTc5LDcgKzg2LDggQEAKICAgICAgICAgICBwcmVjYXB0dXJlVHJpZ2dlcklkKDApLAogICAgICAgICAgIGZyYW1lTnVtYmVyKDApLAogICAgICAgICAgIHBhcnRpYWxSZXN1bHRDb3VudCgwKSwKLSAgICAgICAgICBlcnJvclN0cmVhbUlkKC0xKSB7CisgICAgICAgICAgZXJyb3JTdHJlYW1JZCgtMSksCisgICAgICAgICAgZXJyb3JQaHlzaWNhbENhbWVyYUlkKCkgewogICAgIH0KIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaCBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmgKaW5kZXggOTA0ZmJhMi4uNmY1NTg5MCAxMDA2NDQKLS0tIGEvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaAorKysgYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oCkBAIC05OSw2ICs5OSwxMSBAQAogICAgICAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgdmVyYm9zaXR5LCBpbnQgaW5kZW50YXRpb24pIGNvbnN0OwogCiAgICAgICAgIC8qKgorICAgICAgICAgKiBHZXQgU2VjdGlvbiBmb3IgY29ycmVzcG9uZGluZyB0YWcuCisgICAgICAgICAqLworICAgICAgICBzc2l6ZV90IGdldFNlY3Rpb25JbmRleCh1aW50MzJfdCB0YWcpIGNvbnN0OworCisgICAgICAgIC8qKgogICAgICAgICAgKiBSZWFkIHZhbHVlcyBWZW5kb3JUYWdEZXNjcmlwdG9yIG9iamVjdCBmcm9tIHRoZSBnaXZlbiBwYXJjZWwuCiAgICAgICAgICAqCiAgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgpAQCAtMjA2LDYgKzIxMSw5IEBACiAgICAgICovCiAgICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHZlcmJvc2l0eSwgaW50IGluZGVudGF0aW9uKSBjb25zdDsKIAorICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxtZXRhZGF0YV92ZW5kb3JfaWRfdCwgc3A8YW5kcm9pZDo6VmVuZG9yVGFnRGVzY3JpcHRvcj4+ICYKKyAgICAgICAgICAgIGdldFZlbmRvcklkc0FuZFRhZ0Rlc2NyaXB0b3JzKCk7CisKICAgcHJvdGVjdGVkOgogICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxtZXRhZGF0YV92ZW5kb3JfaWRfdCwgc3A8YW5kcm9pZDo6VmVuZG9yVGFnRGVzY3JpcHRvcj4+IG1WZW5kb3JNYXA7CiAgICAgc3RydWN0IHZlbmRvcl90YWdfY2FjaGVfb3BzIG1WZW5kb3JDYWNoZU9wczsKZGlmZiAtLWdpdCBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaCBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaAppbmRleCBhODBmNDRiLi45NWM0ZjM5IDEwMDY0NAotLS0gYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmgKKysrIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oCkBAIC02NSw4ICs2NSwxNSBAQAogICAgIE91dHB1dENvbmZpZ3VyYXRpb24oY29uc3QgYW5kcm9pZDo6UGFyY2VsJiBwYXJjZWwpOwogCiAgICAgT3V0cHV0Q29uZmlndXJhdGlvbihzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgZ2JwLCBpbnQgcm90YXRpb24sCisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgcGh5c2ljYWxDYW1lcmFJZCwKICAgICAgICAgICAgIGludCBzdXJmYWNlU2V0SUQgPSBJTlZBTElEX1NFVF9JRCwgYm9vbCBpc1NoYXJlZCA9IGZhbHNlKTsKIAorICAgIE91dHB1dENvbmZpZ3VyYXRpb24oY29uc3Qgc3RkOjp2ZWN0b3I8c3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4+JiBnYnBzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0aW9uLCBjb25zdCBTdHJpbmcxNiYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdXJmYWNlU2V0SUQgPSBJTlZBTElEX1NFVF9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdXJmYWNlVHlwZSA9IE91dHB1dENvbmZpZ3VyYXRpb246OlNVUkZBQ0VfVFlQRV9VTktOT1dOLCBpbnQgd2lkdGggPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCA9IDAsIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSk7CisKICAgICBib29sIG9wZXJhdG9yID09IChjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uJiBvdGhlcikgY29uc3QgewogICAgICAgICByZXR1cm4gKCBtUm90YXRpb24gPT0gb3RoZXIubVJvdGF0aW9uICYmCiAgICAgICAgICAgICAgICAgbVN1cmZhY2VTZXRJRCA9PSBvdGhlci5tU3VyZmFjZVNldElEICYmCmRpZmYgLS1naXQgYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDI4OGVkCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uaApAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9DQU1FUkEyX1NFU1NJT05DT05GSUdVUkFUSU9OX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9DQU1FUkEyX1NFU1NJT05DT05GSUdVUkFUSU9OX0gKKworI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBjYW1lcmEyIHsKK25hbWVzcGFjZSBwYXJhbXMgeworCitjbGFzcyBPdXRwdXRDb25maWd1cmF0aW9uOworCitjbGFzcyBTZXNzaW9uQ29uZmlndXJhdGlvbiA6IHB1YmxpYyBhbmRyb2lkOjpQYXJjZWxhYmxlIHsKK3B1YmxpYzoKKworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE91dHB1dENvbmZpZ3VyYXRpb24+JiBnZXRPdXRwdXRDb25maWd1cmF0aW9ucygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1PdXRwdXRTdHJlYW1zOworICAgIH0KKworICAgIGludCBnZXRJbnB1dFdpZHRoKCkgY29uc3QgeyByZXR1cm4gbUlucHV0V2lkdGg7IH0KKyAgICBpbnQgZ2V0SW5wdXRIZWlnaHQoKSBjb25zdCB7IHJldHVybiBtSW5wdXRIZWlnaHQ7IH0KKyAgICBpbnQgZ2V0SW5wdXRGb3JtYXQoKSBjb25zdCB7IHJldHVybiBtSW5wdXRGb3JtYXQ7IH0KKyAgICBpbnQgZ2V0T3BlcmF0aW5nTW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1PcGVyYXRpbmdNb2RlOyB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoYW5kcm9pZDo6UGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgYW5kcm9pZDo6UGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOworCisgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb24oKSA6CisgICAgICAgICAgICBtSW5wdXRXaWR0aCgwKSwKKyAgICAgICAgICAgIG1JbnB1dEhlaWdodCgwKSwKKyAgICAgICAgICAgIG1JbnB1dEZvcm1hdCgtMSksCisgICAgICAgICAgICBtT3BlcmF0aW5nTW9kZSgtMSkge30KKworICAgIFNlc3Npb25Db25maWd1cmF0aW9uKGNvbnN0IGFuZHJvaWQ6OlBhcmNlbCYgcGFyY2VsKSB7CisgICAgICAgIHJlYWRGcm9tUGFyY2VsKCZwYXJjZWwpOworICAgIH0KKworICAgIFNlc3Npb25Db25maWd1cmF0aW9uKGludCBpbnB1dFdpZHRoLCBpbnQgaW5wdXRIZWlnaHQsIGludCBpbnB1dEZvcm1hdCwgaW50IG9wZXJhdGluZ01vZGUpIDoKKyAgICAgICAgbUlucHV0V2lkdGgoaW5wdXRXaWR0aCksIG1JbnB1dEhlaWdodChpbnB1dEhlaWdodCksIG1JbnB1dEZvcm1hdChpbnB1dEZvcm1hdCksCisgICAgICAgIG1PcGVyYXRpbmdNb2RlKG9wZXJhdGluZ01vZGUpIHt9CisKKyAgICBib29sIG9wZXJhdG9yID09IChjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIChvdXRwdXRzRXF1YWwob3RoZXIpICYmCisgICAgICAgICAgICAgICAgbUlucHV0V2lkdGggPT0gb3RoZXIubUlucHV0V2lkdGggJiYKKyAgICAgICAgICAgICAgICBtSW5wdXRIZWlnaHQgPT0gb3RoZXIubUlucHV0SGVpZ2h0ICYmCisgICAgICAgICAgICAgICAgbUlucHV0Rm9ybWF0ID09IG90aGVyLm1JbnB1dEZvcm1hdCAmJgorICAgICAgICAgICAgICAgIG1PcGVyYXRpbmdNb2RlID09IG90aGVyLm1PcGVyYXRpbmdNb2RlKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yICE9IChjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgPCAoY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24mIG90aGVyKSBjb25zdCB7CisgICAgICAgIGlmICgqdGhpcyA9PSBvdGhlcikgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmIChtSW5wdXRXaWR0aCAhPSBvdGhlci5tSW5wdXRXaWR0aCkgeworICAgICAgICAgICAgcmV0dXJuIG1JbnB1dFdpZHRoIDwgb3RoZXIubUlucHV0V2lkdGg7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUlucHV0SGVpZ2h0ICE9IG90aGVyLm1JbnB1dEhlaWdodCkgeworICAgICAgICAgICAgcmV0dXJuIG1JbnB1dEhlaWdodCA8IG90aGVyLm1JbnB1dEhlaWdodDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtSW5wdXRGb3JtYXQgIT0gb3RoZXIubUlucHV0Rm9ybWF0KSB7CisgICAgICAgICAgICByZXR1cm4gbUlucHV0Rm9ybWF0IDwgb3RoZXIubUlucHV0Rm9ybWF0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1PcGVyYXRpbmdNb2RlICE9IG90aGVyLm1PcGVyYXRpbmdNb2RlKSB7CisgICAgICAgICAgICByZXR1cm4gbU9wZXJhdGluZ01vZGUgPCBvdGhlci5tT3BlcmF0aW5nTW9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBvdXRwdXRzTGVzc1RoYW4ob3RoZXIpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgPiAoY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24mIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAoKnRoaXMgIT0gb3RoZXIgJiYgISgqdGhpcyA8IG90aGVyKSk7CisgICAgfQorCisgICAgYm9vbCBvdXRwdXRzRXF1YWwoY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24mIG90aGVyKSBjb25zdDsKKyAgICBib29sIG91dHB1dHNMZXNzVGhhbihjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0OworICAgIHZvaWQgYWRkT3V0cHV0Q29uZmlndXJhdGlvbihjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uICZjb25maWcpIHsKKyAgICAgICAgbU91dHB1dFN0cmVhbXMucHVzaF9iYWNrKGNvbmZpZyk7CisgICAgfQorCitwcml2YXRlOgorCisgICAgc3RkOjp2ZWN0b3I8T3V0cHV0Q29uZmlndXJhdGlvbj4gbU91dHB1dFN0cmVhbXM7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0V2lkdGgsIG1JbnB1dEhlaWdodCwgbUlucHV0Rm9ybWF0LCBtT3BlcmF0aW5nTW9kZTsKK307Cit9IC8vIG5hbWVzcGFjZSBwYXJhbXMKK30gLy8gbmFtZXNwYWNlIGNhbWVyYTIKK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCisKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjpwYXJhbXM6OlNlc3Npb25Db25maWd1cmF0aW9uOworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvQW5kcm9pZC5icCBiL2NhbWVyYS9uZGsvQW5kcm9pZC5icAppbmRleCA5N2NmNmJmLi5hMmVlNjVkIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL0FuZHJvaWQuYnAKKysrIGIvY2FtZXJhL25kay9BbmRyb2lkLmJwCkBAIC0zMCwzICszMCwxMzMgQEAKICAgICBzcmNzOiBbImluY2x1ZGUvY2FtZXJhLyoqLyouaCJdLAogICAgIGxpY2Vuc2U6ICJOT1RJQ0UiLAogfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNhbWVyYTJuZGsiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIk5ka0NhbWVyYU1hbmFnZXIuY3BwIiwKKyAgICAgICAgIk5ka0NhbWVyYU1ldGFkYXRhLmNwcCIsCisgICAgICAgICJOZGtDYW1lcmFEZXZpY2UuY3BwIiwKKyAgICAgICAgIk5ka0NhcHR1cmVSZXF1ZXN0LmNwcCIsCisgICAgICAgICJOZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAiLAorICAgICAgICAiaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAiLAorICAgICAgICAiaW1wbC9BQ2FtZXJhTWV0YWRhdGEuY3BwIiwKKyAgICAgICAgImltcGwvQUNhbWVyYURldmljZS5jcHAiLAorICAgICAgICAiaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJhbmRyb2lkX3J1bnRpbWUiLAorICAgICAgICAibGliY2FtZXJhX2NsaWVudCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJjYW1lcmFfbWV0YWRhdGEiLAorICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAibGlibmF0aXZld2luZG93IiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgICAgICItREVYUE9SVD1fX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoXCJkZWZhdWx0XCIpKSkiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorICAgIC8vIFRPRE86IGpjaG93ZGhhcnlALCB1c2UgaGVhZGVyX2xpYnMgaW5zdGVhZCBiLzEzMTE2NTcxOAorICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAic3lzdGVtL21lZGlhL3ByaXZhdGUvY2FtZXJhL2luY2x1ZGUiLAorICAgIF0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGlibmF0aXZld2luZG93IiwKKyAgICBdLAorICAgIHZlcnNpb25fc2NyaXB0OiAibGliY2FtZXJhMm5kay5tYXAudHh0IiwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjYW1lcmEybmRrX3ZlbmRvciIsCisgICAgdmVuZG9yOiB0cnVlLAorICAgIHNyY3M6IFsKKyAgICAgICAgIm5ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcCIsCisgICAgICAgICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwIiwKKyAgICAgICAgIm5ka192ZW5kb3IvaW1wbC91dGlscy5jcHAiLAorICAgICAgICAiaW1wbC9BQ2FtZXJhTWV0YWRhdGEuY3BwIiwKKyAgICAgICAgImltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcCIsCisgICAgICAgICJOZGtDYW1lcmFNZXRhZGF0YS5jcHAiLAorICAgICAgICAiTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwIiwKKyAgICAgICAgIk5ka0NhbWVyYU1hbmFnZXIuY3BwIiwKKyAgICAgICAgIk5ka0NhbWVyYURldmljZS5jcHAiLAorICAgICAgICAiTmRrQ2FwdHVyZVJlcXVlc3QuY3BwIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGliY3V0aWxzIiwKKyAgICBdLAorICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAiLiIsCisgICAgICAgICJpbmNsdWRlIiwKKyAgICAgICAgImltcGwiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKKyAgICAgICAgIi1ERVhQT1JUPV9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoXCJkZWZhdWx0XCIpKSkiLAorICAgICAgICAiLURfX0FORFJPSURfVk5ES19fIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmh3YmluZGVyIiwKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJoYXJkd2FyZSIsCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmNhbWVyYV9tZXRhZGF0YSIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgICAgICJhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5kZXZpY2VAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLmNvbW1vbkAyLjAiLAorICAgICAgICAiYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2Uuc2VydmljZUAyLjAiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuY29tbW9uQDEuMC1oZWxwZXIiLAorICAgICAgICAibGliYXJlY3QiLAorICAgIF0sCisgICAgLy8gVE9ETzogamNob3dkaGFyeUAsIHVzZSBoZWFkZXJfbGlicyBpbnN0ZWFkIGIvMTMxMTY1NzE4CisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSIsCisgICAgXSwKKyAgICBwcm9kdWN0X3ZhcmlhYmxlczogeworICAgICAgICBwZGs6IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJBSW1hZ2VSZWFkZXJWZW5kb3JUZXN0IiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjczogWyJuZGtfdmVuZG9yL3Rlc3RzL0FJbWFnZVJlYWRlclZlbmRvclRlc3QuY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmh3YmluZGVyIiwKKyAgICAgICAgImxpYmNhbWVyYTJuZGtfdmVuZG9yIiwKKyAgICAgICAgImxpYmNhbWVyYV9tZXRhZGF0YSIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuY29tbW9uQDEuMC1oZWxwZXIiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRF9fQU5EUk9JRF9WTkRLX18iLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL0FuZHJvaWQubWsgYi9jYW1lcmEvbmRrL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZmY2OWQuLjAwMDAwMDAKLS0tIGEvY2FtZXJhL25kay9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWlmbmVxICgkKFRBUkdFVF9CVUlMRF9QREspLCB0cnVlKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICAgICBcCi0gICAgTmRrQ2FtZXJhTWFuYWdlci5jcHAgICAgICAgICAgIFwKLSAgICBOZGtDYW1lcmFNZXRhZGF0YS5jcHAgICAgICAgICAgXAotICAgIE5ka0NhbWVyYURldmljZS5jcHAgICAgICAgICAgICBcCi0gICAgTmRrQ2FwdHVyZVJlcXVlc3QuY3BwICAgICAgICAgIFwKLSAgICBOZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAgICAgXAotICAgIGltcGwvQUNhbWVyYU1hbmFnZXIuY3BwICAgICAgICBcCi0gICAgaW1wbC9BQ2FtZXJhTWV0YWRhdGEuY3BwICAgICAgIFwKLSAgICBpbXBsL0FDYW1lcmFEZXZpY2UuY3BwICAgICAgICAgXAotICAgIGltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcAotCi1MT0NBTF9NT0RVTEU6PSBsaWJjYW1lcmEybmRrCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gJChMT0NBTF9QQVRIKS9pbmNsdWRlCi1MT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gJChMT0NBTF9QQVRIKS9pbmNsdWRlCi0KLUxPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuIC1EIEVYUE9SVD0nX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKScKLUxPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2V4dHJhIC1XZXJyb3IKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliYmluZGVyIFwKLSAgICBsaWJsb2cgXAotICAgIGxpYmd1aSBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYmFuZHJvaWRfcnVudGltZSBcCi0gICAgbGliY2FtZXJhX2NsaWVudCBcCi0gICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJjYW1lcmFfbWV0YWRhdGEgXAotICAgIGxpYm1lZGlhbmRrCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotZW5kaWYKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwIGIvY2FtZXJhL25kay9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAKaW5kZXggZmQ5NTI5Ni4uMWFjODQ4MiAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAKKysrIGIvY2FtZXJhL25kay9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAKQEAgLTI4LDYgKzI4LDggQEAKICNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaD4KICNpbmNsdWRlICJpbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIgogCisjaW5jbHVkZSAiaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaW5jIgorCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAogRVhQT1JUCkBAIC03OCwxMSArODAsMzkgQEAKIAogICAgIGlmIChzZXNzaW9uLT5pc0Nsb3NlZCgpKSB7CiAgICAgICAgIEFMT0dFKCIlczogc2Vzc2lvbiAlcCBpcyBhbHJlYWR5IGNsb3NlZCIsIF9fRlVOQ1RJT05fXywgc2Vzc2lvbik7Ci0gICAgICAgICpjYXB0dXJlU2VxdWVuY2VJZCA9IENBUFRVUkVfU0VRVUVOQ0VfSURfTk9ORTsKKyAgICAgICAgaWYgKGNhcHR1cmVTZXF1ZW5jZUlkICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICpjYXB0dXJlU2VxdWVuY2VJZCA9IENBUFRVUkVfU0VRVUVOQ0VfSURfTk9ORTsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKICAgICB9CiAKLSAgICByZXR1cm4gc2Vzc2lvbi0+Y2FwdHVyZShjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOworICAgIHJldHVybiBzZXNzaW9uLT5jYXB0dXJlKAorICAgICAgICAgICAgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKK30KKworRVhQT1JUCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZSgKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzKiBsY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpZiAoc2Vzc2lvbiA9PSBudWxscHRyIHx8IHJlcXVlc3RzID09IG51bGxwdHIgfHwgbnVtUmVxdWVzdHMgPCAxKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGludmFsaWQgaW5wdXQ6IHNlc3Npb24gJXAsIG51bVJlcXVlc3QgJWQsIHJlcXVlc3RzICVwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNlc3Npb24sIG51bVJlcXVlc3RzLCByZXF1ZXN0cyk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIGlmIChzZXNzaW9uLT5pc0Nsb3NlZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogc2Vzc2lvbiAlcCBpcyBhbHJlYWR5IGNsb3NlZCIsIF9fRlVOQ1RJT05fXywgc2Vzc2lvbik7CisgICAgICAgIGlmIChjYXB0dXJlU2VxdWVuY2VJZCkgeworICAgICAgICAgICAgKmNhcHR1cmVTZXF1ZW5jZUlkID0gQ0FQVFVSRV9TRVFVRU5DRV9JRF9OT05FOworICAgICAgICB9CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOworICAgIH0KKworICAgIHJldHVybiBzZXNzaW9uLT5jYXB0dXJlKAorICAgICAgICAgICAgbGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7CiB9CiAKIEVYUE9SVApAQCAtOTksNyArMTI5LDkgQEAKIAogICAgIGlmIChzZXNzaW9uLT5pc0Nsb3NlZCgpKSB7CiAgICAgICAgIEFMT0dFKCIlczogc2Vzc2lvbiAlcCBpcyBhbHJlYWR5IGNsb3NlZCIsIF9fRlVOQ1RJT05fXywgc2Vzc2lvbik7Ci0gICAgICAgICpjYXB0dXJlU2VxdWVuY2VJZCA9IENBUFRVUkVfU0VRVUVOQ0VfSURfTk9ORTsKKyAgICAgICAgaWYgKGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgICAgICAgICAqY2FwdHVyZVNlcXVlbmNlSWQgPSBDQVBUVVJFX1NFUVVFTkNFX0lEX05PTkU7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7CiAgICAgfQogCkBAIC0xMDcsNiArMTM5LDMwIEBACiB9CiAKIEVYUE9SVAorY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX3NldFJlcGVhdGluZ1JlcXVlc3QoCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcyogbGNicywKKyAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKHNlc3Npb24gPT0gbnVsbHB0ciB8fCByZXF1ZXN0cyA9PSBudWxscHRyIHx8IG51bVJlcXVlc3RzIDwgMSkgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBpbnZhbGlkIGlucHV0OiBzZXNzaW9uICVwLCBudW1SZXF1ZXN0ICVkLCByZXF1ZXN0cyAlcCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzZXNzaW9uLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBpZiAoc2Vzc2lvbi0+aXNDbG9zZWQoKSkgeworICAgICAgICBBTE9HRSgiJXM6IHNlc3Npb24gJXAgaXMgYWxyZWFkeSBjbG9zZWQiLCBfX0ZVTkNUSU9OX18sIHNlc3Npb24pOworICAgICAgICBpZiAoY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICAgICAgICAgICpjYXB0dXJlU2VxdWVuY2VJZCA9IENBUFRVUkVfU0VRVUVOQ0VfSURfTk9ORTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKKyAgICB9CisKKyAgICByZXR1cm4gc2Vzc2lvbi0+c2V0UmVwZWF0aW5nUmVxdWVzdChsY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKK30KKworRVhQT1JUCiBjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0b3BSZXBlYXRpbmcoQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAoc2Vzc2lvbiA9PSBudWxscHRyKSB7CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL05ka0NhbWVyYURldmljZS5jcHAgYi9jYW1lcmEvbmRrL05ka0NhbWVyYURldmljZS5jcHAKaW5kZXggODEyYTMxMi4uNjkxOTk2YiAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9OZGtDYW1lcmFEZXZpY2UuY3BwCisrKyBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhRGV2aWNlLmNwcApAQCAtMjQsNyArMjQsMTUgQEAKICNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhRGV2aWNlLmg+CiAjaW5jbHVkZSAiaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKIAotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YWNhbTsKKworYm9vbCBhcmVXaW5kb3dUeXBlc0VxdWFsKEFDYW1lcmFXaW5kb3dUeXBlICphLCBBQ2FtZXJhV2luZG93VHlwZSAqYikgeworI2lmZGVmIF9fQU5EUk9JRF9WTkRLX18KKyAgICByZXR1cm4gdXRpbHM6OmlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwoYSwgYik7CisjZWxzZQorICAgIHJldHVybiBhID09IGI7CisjZW5kaWYKK30KIAogRVhQT1JUCiBjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYURldmljZV9jbG9zZShBQ2FtZXJhRGV2aWNlKiBkZXZpY2UpIHsKQEAgLTcwLDcgKzc4LDM0IEBACiAgICAgICAgICAgICBBTE9HRSgiJXM6IHVua25vd24gdGVtcGxhdGUgSUQgJWQiLCBfX0ZVTkNUSU9OX18sIHRlbXBsYXRlSWQpOwogICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgfQotICAgIHJldHVybiBkZXZpY2UtPmNyZWF0ZUNhcHR1cmVSZXF1ZXN0KHRlbXBsYXRlSWQsIHJlcXVlc3QpOworICAgIHJldHVybiBkZXZpY2UtPmNyZWF0ZUNhcHR1cmVSZXF1ZXN0KHRlbXBsYXRlSWQsIG51bGxwdHIgLypwaHlzaWNhbElkTGlzdCovLCByZXF1ZXN0KTsKK30KKworRVhQT1JUCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHMoCisgICAgICAgIGNvbnN0IEFDYW1lcmFEZXZpY2UqIGRldmljZSwKKyAgICAgICAgQUNhbWVyYURldmljZV9yZXF1ZXN0X3RlbXBsYXRlIHRlbXBsYXRlSWQsCisgICAgICAgIGNvbnN0IEFDYW1lcmFJZExpc3QqIHBoeXNpY2FsQ2FtZXJhSWRMaXN0LAorICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0KSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpZiAoZGV2aWNlID09IG51bGxwdHIgfHwgcmVxdWVzdCA9PSBudWxscHRyIHx8IHBoeXNpY2FsQ2FtZXJhSWRMaXN0ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIGFyZ3VtZW50ISBkZXZpY2UgJXAgcmVxdWVzdCAlcCwgcGh5c2ljYWxDYW1lcmFJZExpc3QgJXAiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlLCByZXF1ZXN0LCBwaHlzaWNhbENhbWVyYUlkTGlzdCk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICBzd2l0Y2ggKHRlbXBsYXRlSWQpIHsKKyAgICAgICAgY2FzZSBURU1QTEFURV9QUkVWSUVXOgorICAgICAgICBjYXNlIFRFTVBMQVRFX1NUSUxMX0NBUFRVUkU6CisgICAgICAgIGNhc2UgVEVNUExBVEVfUkVDT1JEOgorICAgICAgICBjYXNlIFRFTVBMQVRFX1ZJREVPX1NOQVBTSE9UOgorICAgICAgICBjYXNlIFRFTVBMQVRFX1pFUk9fU0hVVFRFUl9MQUc6CisgICAgICAgIGNhc2UgVEVNUExBVEVfTUFOVUFMOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXM6IHVua25vd24gdGVtcGxhdGUgSUQgJWQiLCBfX0ZVTkNUSU9OX18sIHRlbXBsYXRlSWQpOworICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIHJldHVybiBkZXZpY2UtPmNyZWF0ZUNhcHR1cmVSZXF1ZXN0KHRlbXBsYXRlSWQsIHBoeXNpY2FsQ2FtZXJhSWRMaXN0LCByZXF1ZXN0KTsKIH0KIAogRVhQT1JUCkBAIC05Niw3ICsxMzEsNyBAQAogCiBFWFBPUlQKIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfY3JlYXRlKAotICAgICAgICBBTmF0aXZlV2luZG93KiB3aW5kb3csIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXQpIHsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdywgLypvdXQqL0FDYXB0dXJlU2Vzc2lvbk91dHB1dCoqIG91dCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKHdpbmRvdyA9PSBudWxscHRyIHx8IG91dCA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGJhZCBhcmd1bWVudC4gd2luZG93ICVwLCBvdXQgJXAiLApAQCAtMTA5LDcgKzE0NCw3IEBACiAKIEVYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9jcmVhdGUoCi0gICAgICAgIEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgLypvdXQqL0FDYXB0dXJlU2Vzc2lvbk91dHB1dCoqIG91dCkgeworICAgICAgICBBQ2FtZXJhV2luZG93VHlwZSogd2luZG93LCAvKm91dCovQUNhcHR1cmVTZXNzaW9uT3V0cHV0Kiogb3V0KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAod2luZG93ID09IG51bGxwdHIgfHwgb3V0ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogYmFkIGFyZ3VtZW50LiB3aW5kb3cgJXAsIG91dCAlcCIsCkBAIC0xMjEsOCArMTU2LDIyIEBACiB9CiAKIEVYUE9SVAorY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblBoeXNpY2FsT3V0cHV0X2NyZWF0ZSgKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdywgY29uc3QgY2hhciogcGh5c2ljYWxJZCwKKyAgICAgICAgLypvdXQqL0FDYXB0dXJlU2Vzc2lvbk91dHB1dCoqIG91dCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKHdpbmRvdyA9PSBudWxscHRyIHx8IHBoeXNpY2FsSWQgPT0gbnVsbHB0ciB8fCBvdXQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBiYWQgYXJndW1lbnQuIHdpbmRvdyAlcCwgcGh5c2ljYWxJZCAlcCwgb3V0ICVwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHdpbmRvdywgcGh5c2ljYWxJZCwgb3V0KTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgICpvdXQgPSBuZXcgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KHdpbmRvdywgZmFsc2UsIHBoeXNpY2FsSWQpOworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCitFWFBPUlQKIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfYWRkKEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqb3V0LAotICAgICAgICBBTmF0aXZlV2luZG93KiB3aW5kb3cpIHsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKCh3aW5kb3cgPT0gbnVsbHB0cikgfHwgKG91dCA9PSBudWxscHRyKSkgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBiYWQgYXJndW1lbnQuIHdpbmRvdyAlcCwgb3V0ICVwIiwKQEAgLTEzNCw3ICsxODMsNyBAQAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBpZiAob3V0LT5tV2luZG93ID09IHdpbmRvdykgeworICAgIGlmIChhcmVXaW5kb3dUeXBlc0VxdWFsKG91dC0+bVdpbmRvdywgd2luZG93KSkgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHRyeWluZyB0byBhZGQgdGhlIHNhbWUgd2luZG93IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3V0cHV0IGNvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwpAQCAtMTQ3LDcgKzE5Niw3IEBACiAKIEVYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9yZW1vdmUoQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpvdXQsCi0gICAgICAgIEFOYXRpdmVXaW5kb3cqIHdpbmRvdykgeworICAgICAgICBBQ2FtZXJhV2luZG93VHlwZSogd2luZG93KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAoKHdpbmRvdyA9PSBudWxscHRyKSB8fCAob3V0ID09IG51bGxwdHIpKSB7CiAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGJhZCBhcmd1bWVudC4gd2luZG93ICVwLCBvdXQgJXAiLApAQCAtMTU5LDcgKzIwOCw3IEBACiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIGlmIChvdXQtPm1XaW5kb3cgPT0gd2luZG93KSB7CisgICAgaWYgKGFyZVdpbmRvd1R5cGVzRXF1YWwob3V0LT5tV2luZG93LCB3aW5kb3cpKSB7CiAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgdHJ5aW5nIHRvIHJlbW92ZSB0aGUgc2FtZSB3aW5kb3cgYXNzb2NpYXRlZCB3aXRoIHRoZSBvdXRwdXQgY29uZmlndXJhdGlvbiIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CkBAIC0yMzgsMyArMjg3LDE2IEBACiAgICAgfQogICAgIHJldHVybiBkZXZpY2UtPmNyZWF0ZUNhcHR1cmVTZXNzaW9uKG91dHB1dHMsIHNlc3Npb25QYXJhbWV0ZXJzLCBjYWxsYmFja3MsIHNlc3Npb24pOwogfQorCitFWFBPUlQKK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhRGV2aWNlX2lzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgIGNvbnN0IEFDYW1lcmFEZXZpY2UqIGRldmljZSwKKyAgICAgICAgY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBzZXNzaW9uT3V0cHV0Q29udGFpbmVyKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpZiAoZGV2aWNlID09IG51bGxwdHIgfHwgc2Vzc2lvbk91dHB1dENvbnRhaW5lciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGludmFsaWQgaW5wdXQ6IGRldmljZSAlcCwgc2Vzc2lvbk91dHB1dENvbnRhaW5lciAlcCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZXZpY2UsIHNlc3Npb25PdXRwdXRDb250YWluZXIpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgcmV0dXJuIGRldmljZS0+aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZChzZXNzaW9uT3V0cHV0Q29udGFpbmVyKTsKK30KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvTmRrQ2FtZXJhTWFuYWdlci5jcHAgYi9jYW1lcmEvbmRrL05ka0NhbWVyYU1hbmFnZXIuY3BwCmluZGV4IDYwYjQ3NjMuLjNkMjMxYTggMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvTmRrQ2FtZXJhTWFuYWdlci5jcHAKKysrIGIvY2FtZXJhL25kay9OZGtDYW1lcmFNYW5hZ2VyLmNwcApAQCAtMjIsOSArMjIsMTUgQEAKICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogCiAjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYU1hbmFnZXIuaD4KLSNpbmNsdWRlICJpbXBsL0FDYW1lcmFNYW5hZ2VyLmgiCiAKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworI2lmZGVmIF9fQU5EUk9JRF9WTkRLX18KKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuaCIKKyNlbHNlCisjaW5jbHVkZSAiaW1wbC9BQ2FtZXJhTWFuYWdlci5oIgorI2VuZGlmCisjaW5jbHVkZSAiaW1wbC9BQ2FtZXJhTWV0YWRhdGEuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmFjYW07CiAKIEVYUE9SVAogQUNhbWVyYU1hbmFnZXIqIEFDYW1lcmFNYW5hZ2VyX2NyZWF0ZSgpIHsKQEAgLTk5LDYgKzEwNSw2MCBAQAogfQogCiBFWFBPUlQKK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhTWFuYWdlcl9yZWdpc3RlckV4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2soCisgICAgICAgIEFDYW1lcmFNYW5hZ2VyKiAvKm1hbmFnZXIqLywgY29uc3QgQUNhbWVyYU1hbmFnZXJfRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFja3MgKmNhbGxiYWNrKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgYXJndW1lbnQhIGNhbGxiYWNrIGlzIG51bGwhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIGlmICgoY2FsbGJhY2stPmF2YWlsYWJpbGl0eUNhbGxiYWNrcy5vbkNhbWVyYUF2YWlsYWJsZSA9PSBudWxscHRyKSB8fAorICAgICAgICAgICAgKGNhbGxiYWNrLT5hdmFpbGFiaWxpdHlDYWxsYmFja3Mub25DYW1lcmFVbmF2YWlsYWJsZSA9PSBudWxscHRyKSB8fAorICAgICAgICAgICAgKGNhbGxiYWNrLT5vbkNhbWVyYUFjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkID09IG51bGxwdHIpKSB7CisgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBhcmd1bWVudCEgY2FsbGJhY2sgJXAsICIKKyAgICAgICAgICAgICAgICAib25DYW1lcmFBdmFpbGFibGUgJXAsIG9uQ2FtZXJhVW5hdmFpbGFibGUgJXAgb25DYW1lcmFBY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZCAlcCIsCisgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgY2FsbGJhY2stPmF2YWlsYWJpbGl0eUNhbGxiYWNrcy5vbkNhbWVyYUF2YWlsYWJsZSwKKyAgICAgICAgICAgICAgIGNhbGxiYWNrLT5hdmFpbGFiaWxpdHlDYWxsYmFja3Mub25DYW1lcmFVbmF2YWlsYWJsZSwKKyAgICAgICAgICAgICAgIGNhbGxiYWNrLT5vbkNhbWVyYUFjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIGF1dG8gcmVzZXJ2ZWRFbnRyaWVzQ291bnQgPSBzaXplb2YoY2FsbGJhY2stPnJlc2VydmVkKSAvIHNpemVvZihjYWxsYmFjay0+cmVzZXJ2ZWRbMF0pOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzZXJ2ZWRFbnRyaWVzQ291bnQ7IGkrKykgeworICAgICAgICBpZiAoY2FsbGJhY2stPnJlc2VydmVkW2ldICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBhcmd1bWVudCEgY2FsbGJhY2sgcmVzZXJ2ZWQgZW50cmllcyBtdXN0IGJlIHNldCB0byBOVUxMIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICB9CisgICAgfQorICAgIENhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkucmVnaXN0ZXJFeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrKGNhbGxiYWNrKTsKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworRVhQT1JUCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYU1hbmFnZXJfdW5yZWdpc3RlckV4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2soCisgICAgICAgIEFDYW1lcmFNYW5hZ2VyKiAvKm1hbmFnZXIqLywgY29uc3QgQUNhbWVyYU1hbmFnZXJfRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFja3MgKmNhbGxiYWNrKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgYXJndW1lbnQhIGNhbGxiYWNrIGlzIG51bGwhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIGlmICgoY2FsbGJhY2stPmF2YWlsYWJpbGl0eUNhbGxiYWNrcy5vbkNhbWVyYUF2YWlsYWJsZSA9PSBudWxscHRyKSB8fAorICAgICAgICAgICAgKGNhbGxiYWNrLT5hdmFpbGFiaWxpdHlDYWxsYmFja3Mub25DYW1lcmFVbmF2YWlsYWJsZSA9PSBudWxscHRyKSB8fAorICAgICAgICAgICAgKGNhbGxiYWNrLT5vbkNhbWVyYUFjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkID09IG51bGxwdHIpKSB7CisgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBhcmd1bWVudCEgY2FsbGJhY2sgJXAsICIKKyAgICAgICAgICAgICAgICAib25DYW1lcmFBdmFpbGFibGUgJXAsIG9uQ2FtZXJhVW5hdmFpbGFibGUgJXAgb25DYW1lcmFBY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZCAlcCIsCisgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgY2FsbGJhY2stPmF2YWlsYWJpbGl0eUNhbGxiYWNrcy5vbkNhbWVyYUF2YWlsYWJsZSwKKyAgICAgICAgICAgICAgIGNhbGxiYWNrLT5hdmFpbGFiaWxpdHlDYWxsYmFja3Mub25DYW1lcmFVbmF2YWlsYWJsZSwKKyAgICAgICAgICAgICAgIGNhbGxiYWNrLT5vbkNhbWVyYUFjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIENhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkudW5yZWdpc3RlckV4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2soY2FsbGJhY2spOworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCitFWFBPUlQKIGNhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCiAgICAgICAgIEFDYW1lcmFNYW5hZ2VyKiBtZ3IsIGNvbnN0IGNoYXIqIGNhbWVyYUlkLCBBQ2FtZXJhTWV0YWRhdGEqKiBjaGFycyl7CiAgICAgQVRSQUNFX0NBTEwoKTsKQEAgLTEwNyw3ICsxNjcsMTQgQEAKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1nciwgY2FtZXJhSWQsIGNoYXJzKTsKICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgfQotICAgIHJldHVybiBtZ3ItPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZCwgY2hhcnMpOworICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gc3BDaGFyczsKKyAgICBjYW1lcmFfc3RhdHVzX3Qgc3RhdHVzID0gbWdyLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY2FtZXJhSWQsICZzcENoYXJzKTsKKyAgICBpZiAoc3RhdHVzICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgc3BDaGFycy0+aW5jU3Ryb25nKCh2b2lkKikgQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKTsKKyAgICAqY2hhcnMgPSBzcENoYXJzLmdldCgpOworICAgIHJldHVybiBBQ0FNRVJBX09LOwogfQogCiBFWFBPUlQKQEAgLTEyMywzICsxOTAsMTcgQEAKICAgICB9CiAgICAgcmV0dXJuIG1nci0+b3BlbkNhbWVyYShjYW1lcmFJZCwgY2FsbGJhY2ssIGRldmljZSk7CiB9CisKKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCitFWFBPUlQKK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhTWFuYWdlcl9nZXRUYWdGcm9tTmFtZShBQ2FtZXJhTWFuYWdlciAqbWdyLCBjb25zdCBjaGFyKiBjYW1lcmFJZCwKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgLypvdXQqL3VpbnQzMl90ICp0YWcpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChtZ3IgPT0gbnVsbHB0ciB8fCBjYW1lcmFJZCA9PSBudWxscHRyIHx8IG5hbWUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgYXJndW1lbnQhIG1nciAlcCBjYW1lcmFJZCAlcCBuYW1lICVwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1nciwgY2FtZXJhSWQsIG5hbWUpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgcmV0dXJuIG1nci0+Z2V0VGFnRnJvbU5hbWUoY2FtZXJhSWQsIG5hbWUsIHRhZyk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvTmRrQ2FtZXJhTWV0YWRhdGEuY3BwIGIvY2FtZXJhL25kay9OZGtDYW1lcmFNZXRhZGF0YS5jcHAKaW5kZXggNjVkZTgxZi4uOWEzOWVkOCAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9OZGtDYW1lcmFNZXRhZGF0YS5jcHAKKysrIGIvY2FtZXJhL25kay9OZGtDYW1lcmFNZXRhZGF0YS5jcHAKQEAgLTU3LDEzICs1NywzMiBAQAogICAgICAgICBBTE9HRSgiJXM6IHNyYyBpcyBudWxsISIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KLSAgICByZXR1cm4gbmV3IEFDYW1lcmFNZXRhZGF0YSgqc3JjKTsKKyAgICBBQ2FtZXJhTWV0YWRhdGEqIGNvcHkgPSBuZXcgQUNhbWVyYU1ldGFkYXRhKCpzcmMpOworICAgIGNvcHktPmluY1N0cm9uZygodm9pZCopIEFDYW1lcmFNZXRhZGF0YV9jb3B5KTsKKyAgICByZXR1cm4gY29weTsKIH0KIAogRVhQT1JUCiB2b2lkIEFDYW1lcmFNZXRhZGF0YV9mcmVlKEFDYW1lcmFNZXRhZGF0YSogbWV0YWRhdGEpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGlmIChtZXRhZGF0YSAhPSBudWxscHRyKSB7Ci0gICAgICAgIGRlbGV0ZSBtZXRhZGF0YTsKKyAgICAgICAgbWV0YWRhdGEtPmRlY1N0cm9uZygodm9pZCopIEFDYW1lcmFNZXRhZGF0YV9mcmVlKTsKICAgICB9CiB9CisKK0VYUE9SVAorYm9vbCBBQ2FtZXJhTWV0YWRhdGFfaXNMb2dpY2FsTXVsdGlDYW1lcmEoY29uc3QgQUNhbWVyYU1ldGFkYXRhKiBzdGF0aWNNZXRhZGF0YSwKKyAgICAgICAgLypvdXQqL3NpemVfdCogbnVtUGh5c2ljYWxDYW1lcmFzLCAvKm91dCovY29uc3QgY2hhcipjb25zdCoqIHBoeXNpY2FsQ2FtZXJhSWRzKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpZiAobnVtUGh5c2ljYWxDYW1lcmFzID09IG51bGxwdHIgfHwgcGh5c2ljYWxDYW1lcmFJZHMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgaW5wdXQ6IG51bVBoeXNpY2FsQ2FtZXJhcyAlcCwgcGh5c2ljYWxDYW1lcmFJZHMgJXAiLAorICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG51bVBoeXNpY2FsQ2FtZXJhcywgcGh5c2ljYWxDYW1lcmFJZHMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChzdGF0aWNNZXRhZGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBpbnB1dDogc3RhdGljTWV0YWRhdGEgaXMgbnVsbC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXRpY01ldGFkYXRhLT5pc0xvZ2ljYWxNdWx0aUNhbWVyYShudW1QaHlzaWNhbENhbWVyYXMsIHBoeXNpY2FsQ2FtZXJhSWRzKTsKK30KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvTmRrQ2FwdHVyZVJlcXVlc3QuY3BwIGIvY2FtZXJhL25kay9OZGtDYXB0dXJlUmVxdWVzdC5jcHAKaW5kZXggYWMxODU2Yi4uODdkZTRhOSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9OZGtDYXB0dXJlUmVxdWVzdC5jcHAKKysrIGIvY2FtZXJhL25kay9OZGtDYXB0dXJlUmVxdWVzdC5jcHAKQEAgLTI3LDcgKzI3LDcgQEAKIAogRVhQT1JUCiBjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYU91dHB1dFRhcmdldF9jcmVhdGUoCi0gICAgICAgIEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgQUNhbWVyYU91dHB1dFRhcmdldCoqIG91dCkgeworICAgICAgICBBQ2FtZXJhV2luZG93VHlwZSogd2luZG93LCBBQ2FtZXJhT3V0cHV0VGFyZ2V0Kiogb3V0KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAod2luZG93ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogaW5wdXQgd2luZG93IGlzIG51bGwiLCBfX0ZVTkNUSU9OX18pOwpAQCAtOTgsNiArOTgsMjcgQEAKIH0KIAogRVhQT1JUCitjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVSZXF1ZXN0X2dldENvbnN0RW50cnlfcGh5c2ljYWxDYW1lcmEoCisgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogcmVxLCBjb25zdCBjaGFyKiBwaHlzaWNhbElkLAorICAgICAgICB1aW50MzJfdCB0YWcsIEFDYW1lcmFNZXRhZGF0YV9jb25zdF9lbnRyeSogZW50cnkpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChyZXEgPT0gbnVsbHB0ciB8fCBlbnRyeSA9PSBudWxscHRyIHx8IHBoeXNpY2FsSWQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgYXJndW1lbnQhIHJlcSAlcCwgdGFnIDB4JXgsIGVudHJ5ICVwLCBwaHlzaWNhbElkICVwIiwKKyAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVxLCB0YWcsIGVudHJ5LCBwaHlzaWNhbElkKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgY29uc3QgYXV0byYgcGh5c2ljYWxTZXR0aW5ncyA9IHJlcS0+cGh5c2ljYWxTZXR0aW5ncy5maW5kKHBoeXNpY2FsSWQpOworICAgIGlmIChwaHlzaWNhbFNldHRpbmdzID09IHJlcS0+cGh5c2ljYWxTZXR0aW5ncy5lbmQoKSkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBmaW5kIG1ldGFkYXRhIGZvciBwaHlzaWNhbCBjYW1lcmEgaWQgICVzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBoeXNpY2FsSWQpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICByZXR1cm4gcGh5c2ljYWxTZXR0aW5ncy0+c2Vjb25kLT5nZXRDb25zdEVudHJ5KHRhZywgZW50cnkpOworfQorCitFWFBPUlQKIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVJlcXVlc3RfZ2V0QWxsVGFncygKICAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiByZXEsIC8qb3V0Ki9pbnQzMl90KiBudW1UYWdzLCAvKm91dCovY29uc3QgdWludDMyX3QqKiB0YWdzKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKQEAgLTEzMSwxMyArMTUyLDQyIEBACiAKICN1bmRlZiBTRVRfRU5UUlkKIAorI2RlZmluZSBTRVRfUEhZU0lDQUxfRU5UUlkoTkFNRSxOREtfVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK0VYUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3BoeXNpY2FsQ2FtZXJhXyMjTkFNRSggICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcSwgY29uc3QgY2hhciogcGh5c2ljYWxJZCwgdWludDMyX3QgdGFnLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdWludDMyX3QgY291bnQsIGNvbnN0IE5ES19UWVBFKiBkYXRhKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgQVRSQUNFX0NBTEwoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChyZXEgPT0gbnVsbHB0ciB8fCAoY291bnQgPiAwICYmIGRhdGEgPT0gbnVsbHB0cikgfHwgcGh5c2ljYWxJZCA9PSBudWxscHRyKSB7ICAgIFwKKyAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIGFyZ3VtZW50ISByZXEgJXAsIHRhZyAweCV4LCBjb3VudCAlZCwgZGF0YSAweCVwLCBwaHlzaWNhbElkICVwIiwgXAorICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXEsIHRhZywgY291bnQsIGRhdGEsIHBoeXNpY2FsSWQpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChyZXEtPnBoeXNpY2FsU2V0dGluZ3MuZmluZChwaHlzaWNhbElkKSA9PSByZXEtPnBoeXNpY2FsU2V0dGluZ3MuZW5kKCkpIHsgICAgICAgIFwKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZmluZCBtZXRhZGF0YSBmb3IgcGh5c2ljYWwgY2FtZXJhIGlkICVzIiwgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBoeXNpY2FsSWQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHJlcS0+cGh5c2ljYWxTZXR0aW5nc1twaHlzaWNhbElkXS0+dXBkYXRlKHRhZywgY291bnQsIGRhdGEpOyAgICAgICAgICAgICAgICAgXAorfQorCitTRVRfUEhZU0lDQUxfRU5UUlkodTgsdWludDhfdCkKK1NFVF9QSFlTSUNBTF9FTlRSWShpMzIsaW50MzJfdCkKK1NFVF9QSFlTSUNBTF9FTlRSWShmbG9hdCxmbG9hdCkKK1NFVF9QSFlTSUNBTF9FTlRSWShkb3VibGUsZG91YmxlKQorU0VUX1BIWVNJQ0FMX0VOVFJZKGk2NCxpbnQ2NF90KQorU0VUX1BIWVNJQ0FMX0VOVFJZKHJhdGlvbmFsLEFDYW1lcmFNZXRhZGF0YV9yYXRpb25hbCkKKworI3VuZGVmIFNFVF9QSFlTSUNBTF9FTlRSWQorCiBFWFBPUlQKIHZvaWQgQUNhcHR1cmVSZXF1ZXN0X2ZyZWUoQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAocmVxdWVzdCA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgZGVsZXRlIHJlcXVlc3QtPnNldHRpbmdzOworICAgIHJlcXVlc3QtPnNldHRpbmdzLmNsZWFyKCk7CisgICAgcmVxdWVzdC0+cGh5c2ljYWxTZXR0aW5ncy5jbGVhcigpOwogICAgIGRlbGV0ZSByZXF1ZXN0LT50YXJnZXRzOwogICAgIGRlbGV0ZSByZXF1ZXN0OwogICAgIHJldHVybjsKQEAgLTE3NCw2ICsyMjQsOSBAQAogCiAgICAgQUNhcHR1cmVSZXF1ZXN0KiBwUmVxdWVzdCA9IG5ldyBBQ2FwdHVyZVJlcXVlc3QoKTsKICAgICBwUmVxdWVzdC0+c2V0dGluZ3MgPSBuZXcgQUNhbWVyYU1ldGFkYXRhKCooc3JjLT5zZXR0aW5ncykpOworICAgIGZvciAoY29uc3QgYXV0byYgZW50cnkgOiBzcmMtPnBoeXNpY2FsU2V0dGluZ3MpIHsKKyAgICAgICAgcFJlcXVlc3QtPnBoeXNpY2FsU2V0dGluZ3NbZW50cnkuZmlyc3RdID0gbmV3IEFDYW1lcmFNZXRhZGF0YSgqKGVudHJ5LnNlY29uZCkpOworICAgIH0KICAgICBwUmVxdWVzdC0+dGFyZ2V0cyAgPSBuZXcgQUNhbWVyYU91dHB1dFRhcmdldHMoKTsKICAgICAqKHBSZXF1ZXN0LT50YXJnZXRzKSAgPSAqKHNyYy0+dGFyZ2V0cyk7CiAgICAgcFJlcXVlc3QtPmNvbnRleHQgPSBzcmMtPmNvbnRleHQ7CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCmluZGV4IGY2MGU1ZmQuLmQ2ZjE0MTIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCkBAIC0yMyw3ICsyMyw3IEBACiAKIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6fkFDYW1lcmFDYXB0dXJlU2Vzc2lvbigpIHsKICAgICBBTE9HVigifkFDYW1lcmFDYXB0dXJlU2Vzc2lvbjogJXAgbm90aWZ5IGRldmljZSBlbmQgb2YgbGlmZSIsIHRoaXMpOwotICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKKyAgICBzcDxhY2FtOjpDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CiAgICAgaWYgKGRldiAhPSBudWxscHRyICYmICFkZXYtPmlzQ2xvc2VkKCkpIHsKICAgICAgICAgZGV2LT5sb2NrRGV2aWNlRm9yU2Vzc2lvbk9wcygpOwogICAgICAgICB7CkBAIC00OCw3ICs0OCw3IEBACiAgICAgICAgIG1DbG9zZWRCeUFwcCA9IHRydWU7CiAgICAgfQogCi0gICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOworICAgIHNwPGFjYW06OkNhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKICAgICBpZiAoZGV2ICE9IG51bGxwdHIpIHsKICAgICAgICAgZGV2LT5sb2NrRGV2aWNlRm9yU2Vzc2lvbk9wcygpOwogICAgIH0KQEAgLTczLDcgKzczLDcgQEAKIAogY2FtZXJhX3N0YXR1c190CiBBQ2FtZXJhQ2FwdHVyZVNlc3Npb246OnN0b3BSZXBlYXRpbmcoKSB7Ci0gICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOworICAgIHNwPGFjYW06OkNhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKICAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIkVycm9yOiBEZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHNlc3Npb24gJXAgaGFzIGJlZW4gY2xvc2VkISIsIHRoaXMpOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKQEAgLTkxLDcgKzkxLDcgQEAKIAogY2FtZXJhX3N0YXR1c190CiBBQ2FtZXJhQ2FwdHVyZVNlc3Npb246OmFib3J0Q2FwdHVyZXMoKSB7Ci0gICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOworICAgIHNwPGFjYW06OkNhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKICAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIkVycm9yOiBEZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHNlc3Npb24gJXAgaGFzIGJlZW4gY2xvc2VkISIsIHRoaXMpOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKQEAgLTEwNyw0OSArMTA3LDggQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1jYW1lcmFfc3RhdHVzX3QKLUFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6c2V0UmVwZWF0aW5nUmVxdWVzdCgKLSAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKLSAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKLSAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgewotICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKLSAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIkVycm9yOiBEZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHNlc3Npb24gJXAgaGFzIGJlZW4gY2xvc2VkISIsIHRoaXMpOwotICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKLSAgICB9Ci0KLSAgICBjYW1lcmFfc3RhdHVzX3QgcmV0OwotICAgIGRldi0+bG9ja0RldmljZUZvclNlc3Npb25PcHMoKTsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vzc2lvbkxvY2spOwotICAgICAgICByZXQgPSBkZXYtPnNldFJlcGVhdGluZ1JlcXVlc3RzTG9ja2VkKAotICAgICAgICAgICAgICAgIHRoaXMsIGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7Ci0gICAgfQotICAgIGRldi0+dW5sb2NrRGV2aWNlKCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6Y2FwdHVyZSgKLSAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKLSAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKLSAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgewotICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKLSAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIkVycm9yOiBEZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHNlc3Npb24gJXAgaGFzIGJlZW4gY2xvc2VkISIsIHRoaXMpOwotICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKLSAgICB9Ci0gICAgY2FtZXJhX3N0YXR1c190IHJldDsKLSAgICBkZXYtPmxvY2tEZXZpY2VGb3JTZXNzaW9uT3BzKCk7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlc3Npb25Mb2NrKTsKLSAgICAgICAgcmV0ID0gZGV2LT5jYXB0dXJlTG9ja2VkKHRoaXMsIGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7Ci0gICAgfQotICAgIGRldi0+dW5sb2NrRGV2aWNlKCk7Ci0gICAgcmV0dXJuIHJldDsKLX0KLQogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6dXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbihBQ2FwdHVyZVNlc3Npb25PdXRwdXQgKm91dHB1dCkgewotICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKKyAgICBzcDxhY2FtOjpDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CiAgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJFcnJvcjogRGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBzZXNzaW9uICVwIGhhcyBiZWVuIGNsb3NlZCEiLCB0aGlzKTsKICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7CkBAIC0xNjgsNyArMTI3LDcgQEAKIEFDYW1lcmFEZXZpY2UqCiBBQ2FtZXJhQ2FwdHVyZVNlc3Npb246OmdldERldmljZSgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlc3Npb25Mb2NrKTsKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwogICAgIGlmIChkZXYgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiRXJyb3I6IERldmljZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAlcCBoYXMgYmVlbiBjbG9zZWQhIiwgdGhpcyk7CiAgICAgICAgIHJldHVybiBudWxscHRyOwpAQCAtMTgyLDkgKzE0MSw5IEBACiAgICAgbUlzQ2xvc2VkID0gdHJ1ZTsKIH0KIAotc3A8Q2FtZXJhRGV2aWNlPgorc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPgogQUNhbWVyYUNhcHR1cmVTZXNzaW9uOjpnZXREZXZpY2VTcCgpIHsKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGRldmljZSA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIHNwPGFjYW06OkNhbWVyYURldmljZT4gZGV2aWNlID0gbURldmljZS5wcm9tb3RlKCk7CiAgICAgaWYgKGRldmljZSA9PSBudWxscHRyIHx8IGRldmljZS0+aXNDbG9zZWQoKSkgewogICAgICAgICBBTE9HVygiRGV2aWNlIGlzIGNsb3NlZCBidXQgc2Vzc2lvbiAlZCBpcyBub3Qgbm90aWZpZWQiLCBtSWQpOwogICAgICAgICByZXR1cm4gbnVsbHB0cjsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaAppbmRleCBhMjA2OGU3Li4wOGE5MjI2IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmgKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oCkBAIC0xNywxNSArMTcsMjIgQEAKICNkZWZpbmUgX0FDQU1FUkFfQ0FQVFVSRV9TRVNTSU9OX0gKIAogI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhMy5oPgogI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaD4KKworI2lmZGVmIF9fQU5EUk9JRF9WTkRLX18KKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oIgorI2luY2x1ZGUgIm5ka192ZW5kb3IvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25WZW5kb3IuaCIKKyNlbHNlCiAjaW5jbHVkZSAiQUNhbWVyYURldmljZS5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAogc3RydWN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCB7Ci0gICAgZXhwbGljaXQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgYm9vbCBpc1NoYXJlZCA9IGZhbHNlKSA6Ci0gICAgICAgICAgICBtV2luZG93KHdpbmRvdyksIG1Jc1NoYXJlZChpc1NoYXJlZCkge307CisgICAgZXhwbGljaXQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KEFDYW1lcmFXaW5kb3dUeXBlKiB3aW5kb3csIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBoeXNpY2FsQ2FtZXJhSWQgPSAiIikgOgorICAgICAgICAgICAgbVdpbmRvdyh3aW5kb3cpLCBtSXNTaGFyZWQoaXNTaGFyZWQpLCBtUGh5c2ljYWxDYW1lcmFJZChwaHlzaWNhbENhbWVyYUlkKSB7fTsKIAogICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCYgb3RoZXIpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1XaW5kb3cgPT0gb3RoZXIubVdpbmRvdzsKQEAgLTQwLDExICs0NywxMyBAQAogICAgICAgICByZXR1cm4gbVdpbmRvdyA+IG90aGVyLm1XaW5kb3c7CiAgICAgfQogCi0gICAgQU5hdGl2ZVdpbmRvdyogbVdpbmRvdzsKLSAgICBzdGQ6OnNldDxBTmF0aXZlV2luZG93ICo+IG1TaGFyZWRXaW5kb3dzOworICAgIEFDYW1lcmFXaW5kb3dUeXBlKiBtV2luZG93OworICAgIHN0ZDo6c2V0PEFDYW1lcmFXaW5kb3dUeXBlICo+IG1TaGFyZWRXaW5kb3dzOwogICAgIGJvb2wgICAgICAgICAgIG1Jc1NoYXJlZDsKICAgICBpbnQgICAgICAgICAgICBtUm90YXRpb24gPSBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wOworICAgIHN0ZDo6c3RyaW5nIG1QaHlzaWNhbENhbWVyYUlkOwogfTsKKyNlbmRpZgogCiBzdHJ1Y3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyIHsKICAgICBzdGQ6OnNldDxBQ2FwdHVyZVNlc3Npb25PdXRwdXQ+IG1PdXRwdXRzOwpAQCAtNjAsNyArNjksNyBAQAogICAgICAgICAgICAgaW50IGlkLAogICAgICAgICAgICAgY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBvdXRwdXRzLAogICAgICAgICAgICAgY29uc3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzKiBjYiwKLSAgICAgICAgICAgIENhbWVyYURldmljZSogZGV2aWNlKSA6CisgICAgICAgICAgICBhbmRyb2lkOjphY2FtOjpDYW1lcmFEZXZpY2UqIGRldmljZSkgOgogICAgICAgICAgICAgbUlkKGlkKSwgbU91dHB1dCgqb3V0cHV0cyksIG1Vc2VyU2Vzc2lvbkNhbGxiYWNrKCpjYiksCiAgICAgICAgICAgICBtRGV2aWNlKGRldmljZSkge30KIApAQCAtODIsMTMgKzkxLDE1IEBACiAKICAgICBjYW1lcmFfc3RhdHVzX3QgYWJvcnRDYXB0dXJlcygpOwogCisgICAgdGVtcGxhdGU8Y2xhc3MgVD4KICAgICBjYW1lcmFfc3RhdHVzX3Qgc2V0UmVwZWF0aW5nUmVxdWVzdCgKLSAgICAgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMsCisgICAgICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCiAgICAgICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAogICAgICAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCk7CiAKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPgogICAgIGNhbWVyYV9zdGF0dXNfdCBjYXB0dXJlKAotICAgICAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKICAgICAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCiAgICAgICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKTsKIApAQCAtOTcsMTggKzEwOCwxOCBAQAogICAgIEFDYW1lcmFEZXZpY2UqIGdldERldmljZSgpOwogCiAgIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIENhbWVyYURldmljZTsKKyAgICBmcmllbmQgY2xhc3MgYW5kcm9pZDo6YWNhbTo6Q2FtZXJhRGV2aWNlOwogCiAgICAgLy8gQ2xvc2Ugc2Vzc2lvbiBiZWNhdXNlIGFwcCBjbG9zZSBjYW1lcmEgZGV2aWNlLCBjYW1lcmEgZGV2aWNlIGdvdCBFUlJPUl9ESVNDT05ORUNURUQsCiAgICAgLy8gb3IgYSBuZXcgc2Vzc2lvbiBpcyByZXBsYWNpbmcgdGhpcyBzZXNzaW9uLgogICAgIHZvaWQgY2xvc2VCeURldmljZSgpOwogCi0gICAgc3A8Q2FtZXJhRGV2aWNlPiBnZXREZXZpY2VTcCgpOworICAgIHNwPGFuZHJvaWQ6OmFjYW06OkNhbWVyYURldmljZT4gZ2V0RGV2aWNlU3AoKTsKIAogICAgIGNvbnN0IGludCBtSWQ7CiAgICAgY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyIG1PdXRwdXQ7CiAgICAgY29uc3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzIG1Vc2VyU2Vzc2lvbkNhbGxiYWNrOwotICAgIGNvbnN0IHdwPENhbWVyYURldmljZT4gbURldmljZTsKKyAgICBjb25zdCB3cDxhbmRyb2lkOjphY2FtOjpDYW1lcmFEZXZpY2U+IG1EZXZpY2U7CiAgICAgYm9vbCAgbUlzQ2xvc2VkID0gZmFsc2U7CiAgICAgYm9vbCAgbUNsb3NlZEJ5QXBwID0gZmFsc2U7CiAgICAgTXV0ZXggbVNlc3Npb25Mb2NrOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5pbmMgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmJmOGE1Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5pbmMKQEAgLTAsMCArMSw2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJBQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKKworI2lmZGVmIF9fQU5EUk9JRF9WTkRLX18KKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZVZlbmRvci5pbmMiCisjZWxzZQorI2luY2x1ZGUgIkFDYW1lcmFEZXZpY2UuaW5jIgorI2VuZGlmCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NhbWVyYV9zdGF0dXNfdAorQUNhbWVyYUNhcHR1cmVTZXNzaW9uOjpzZXRSZXBlYXRpbmdSZXF1ZXN0KAorICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICBzcDxhY2FtOjpDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJFcnJvcjogRGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBzZXNzaW9uICVwIGhhcyBiZWVuIGNsb3NlZCEiLCB0aGlzKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7CisgICAgfQorCisgICAgY2FtZXJhX3N0YXR1c190IHJldDsKKyAgICBkZXYtPmxvY2tEZXZpY2VGb3JTZXNzaW9uT3BzKCk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlc3Npb25Mb2NrKTsKKyAgICAgICAgcmV0ID0gZGV2LT5zZXRSZXBlYXRpbmdSZXF1ZXN0c0xvY2tlZCgKKyAgICAgICAgICAgICAgICB0aGlzLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOworICAgIH0KKyAgICBkZXYtPnVubG9ja0RldmljZSgpOworICAgIHJldHVybiByZXQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6Y2FwdHVyZSgKKyAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOworICAgIGlmIChkZXYgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiRXJyb3I6IERldmljZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAlcCBoYXMgYmVlbiBjbG9zZWQhIiwgdGhpcyk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOworICAgIH0KKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0OworICAgIGRldi0+bG9ja0RldmljZUZvclNlc3Npb25PcHMoKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vzc2lvbkxvY2spOworICAgICAgICByZXQgPSBkZXYtPmNhcHR1cmVMb2NrZWQodGhpcywgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKKyAgICB9CisgICAgZGV2LT51bmxvY2tEZXZpY2UoKTsKKyAgICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCmluZGV4IDkwN2RlYmMuLjI1YTgxZWIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5jcHAKQEAgLTIwLDE2ICsyMCwxNyBAQAogI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuaD4KLSNpbmNsdWRlIDxjYW1lcmEyL1N1Ym1pdEluZm8uaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogI2luY2x1ZGUgIkFDYW1lcmFEZXZpY2UuaCIKICNpbmNsdWRlICJBQ2FtZXJhTWV0YWRhdGEuaCIKICNpbmNsdWRlICJBQ2FwdHVyZVJlcXVlc3QuaCIKICNpbmNsdWRlICJBQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKIAotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisjaW5jbHVkZSAiQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmluYyIKIAogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0geworCiAvLyBTdGF0aWMgbWVtYmVyIGRlZmluaXRpb25zCiBjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtDb250ZXh0S2V5ICAgICAgICA9ICJDb250ZXh0IjsKIGNvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0RldmljZUtleSAgICAgICAgID0gIkRldmljZSI7CkBAIC0zOSwxMCArNDAsMTIgQEAKIGNvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0NhcHR1cmVSZXF1ZXN0S2V5ID0gIkNhcHR1cmVSZXF1ZXN0IjsKIGNvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a1RpbWVTdGFtcEtleSAgICAgID0gIlRpbWVTdGFtcCI7CiBjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtDYXB0dXJlUmVzdWx0S2V5ICA9ICJDYXB0dXJlUmVzdWx0IjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a1BoeXNpY2FsQ2FwdHVyZVJlc3VsdEtleSA9ICJQaHlzaWNhbENhcHR1cmVSZXN1bHQiOwogY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprQ2FwdHVyZUZhaWx1cmVLZXkgPSAiQ2FwdHVyZUZhaWx1cmUiOwogY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprU2VxdWVuY2VJZEtleSAgICAgPSAiU2VxdWVuY2VJZCI7CiBjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtGcmFtZU51bWJlcktleSAgICA9ICJGcmFtZU51bWJlciI7CiBjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtBbndLZXkgICAgICAgICAgICA9ICJBbnciOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprRmFpbGluZ1BoeXNpY2FsQ2FtZXJhSWQ9ICJGYWlsaW5nUGh5c2ljYWxDYW1lcmFJZCI7CiAKIC8qKgogICogQ2FtZXJhRGV2aWNlIEltcGxlbWVudGF0aW9uCkBAIC01MCwxMSArNTMsMTEgQEAKIENhbWVyYURldmljZTo6Q2FtZXJhRGV2aWNlKAogICAgICAgICBjb25zdCBjaGFyKiBpZCwKICAgICAgICAgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyogY2IsCi0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBQ2FtZXJhTWV0YWRhdGE+IGNoYXJzLAorICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IGNoYXJzLAogICAgICAgICBBQ2FtZXJhRGV2aWNlKiB3cmFwcGVyKSA6CiAgICAgICAgIG1DYW1lcmFJZChpZCksCiAgICAgICAgIG1BcHBDYWxsYmFja3MoKmNiKSwKLSAgICAgICAgbUNoYXJzKHN0ZDo6bW92ZShjaGFycykpLAorICAgICAgICBtQ2hhcnMoY2hhcnMpLAogICAgICAgICBtU2VydmljZUNhbGxiYWNrKG5ldyBTZXJ2aWNlQ2FsbGJhY2sodGhpcykpLAogICAgICAgICBtV3JhcHBlcih3cmFwcGVyKSwKICAgICAgICAgbUluRXJyb3IoZmFsc2UpLApAQCAtNzQsNyArNzcsNyBAQAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLWVyciksIGVycik7CiAgICAgICAgIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRSk7CiAgICAgfQotICAgIG1IYW5kbGVyID0gbmV3IENhbGxiYWNrSGFuZGxlcigpOworICAgIG1IYW5kbGVyID0gbmV3IENhbGxiYWNrSGFuZGxlcihpZCk7CiAgICAgbUNiTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXIpOwogCiAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhID0gbUNoYXJzLT5nZXRJbnRlcm5hbERhdGEoKTsKQEAgLTk1LDYgKzk4LDE0IEBACiAgICAgICAgIG1TaGFkaW5nTWFwU2l6ZVswXSA9IGVudHJ5LmRhdGEuaTMyWzBdOwogICAgICAgICBtU2hhZGluZ01hcFNpemVbMV0gPSBlbnRyeS5kYXRhLmkzMlsxXTsKICAgICB9CisKKyAgICBzaXplX3QgcGh5c2ljYWxJZENudCA9IDA7CisgICAgY29uc3QgY2hhcipjb25zdCogcGh5c2ljYWxDYW1lcmFJZHM7CisgICAgaWYgKG1DaGFycy0+aXNMb2dpY2FsTXVsdGlDYW1lcmEoJnBoeXNpY2FsSWRDbnQsICZwaHlzaWNhbENhbWVyYUlkcykpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzaWNhbElkQ250OyBpKyspIHsKKyAgICAgICAgICAgIG1QaHlzaWNhbElkcy5wdXNoX2JhY2socGh5c2ljYWxDYW1lcmFJZHNbaV0pOworICAgICAgICB9CisgICAgfQogfQogCiAvLyBEZXZpY2UgY2xvc2UgaW1wbGVtZW50YWl0b24KQEAgLTEyNyw4ICsxMzgsMjkgQEAKIGNhbWVyYV9zdGF0dXNfdAogQ2FtZXJhRGV2aWNlOjpjcmVhdGVDYXB0dXJlUmVxdWVzdCgKICAgICAgICAgQUNhbWVyYURldmljZV9yZXF1ZXN0X3RlbXBsYXRlIHRlbXBsYXRlSWQsCisgICAgICAgIGNvbnN0IEFDYW1lcmFJZExpc3QqIHBoeXNpY2FsSWRMaXN0LAogICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0KSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZXZpY2VMb2NrKTsKKworICAgIGlmIChwaHlzaWNhbElkTGlzdCAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChwaHlzaWNhbElkTGlzdC0+bnVtQ2FtZXJhcyA+IHN0YXRpY19jYXN0PGludD4obVBoeXNpY2FsSWRzLnNpemUoKSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogcGh5c2ljYWxJZExpc3Qgc2l6ZSAlZCBleGNlZWRzIG51bWJlciBvZiBhdmFpbGFibGUgcGh5c2ljYWwgY2FtZXJhcyAlenUiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHBoeXNpY2FsSWRMaXN0LT5udW1DYW1lcmFzLCBtUGh5c2ljYWxJZHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICB9CisgICAgICAgIGZvciAoYXV0byBpID0gMDsgaSA8IHBoeXNpY2FsSWRMaXN0LT5udW1DYW1lcmFzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChwaHlzaWNhbElkTGlzdC0+Y2FtZXJhSWRzW2ldID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IHBoeXNpY2FsSWQgaXMgbnVsbCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1QaHlzaWNhbElkcy5lbmQoKSA9PSBzdGQ6OmZpbmQoCisgICAgICAgICAgICAgICAgICAgIG1QaHlzaWNhbElkcy5iZWdpbigpLCBtUGh5c2ljYWxJZHMuZW5kKCksIHBoeXNpY2FsSWRMaXN0LT5jYW1lcmFJZHNbaV0pKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHBoeXNpY2FsSWQgJXMhIiwgX19GVU5DVElPTl9fLCBwaHlzaWNhbElkTGlzdC0+Y2FtZXJhSWRzW2ldKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKICAgICAgICAgcmV0dXJuIHJldDsKQEAgLTE0OSw2ICsxODEsMTIgQEAKICAgICB9CiAgICAgQUNhcHR1cmVSZXF1ZXN0KiBvdXRSZXEgPSBuZXcgQUNhcHR1cmVSZXF1ZXN0KCk7CiAgICAgb3V0UmVxLT5zZXR0aW5ncyA9IG5ldyBBQ2FtZXJhTWV0YWRhdGEocmF3UmVxdWVzdC5yZWxlYXNlKCksIEFDYW1lcmFNZXRhZGF0YTo6QUNNX1JFUVVFU1QpOworICAgIGlmIChwaHlzaWNhbElkTGlzdCAhPSBudWxscHRyKSB7CisgICAgICAgIGZvciAoYXV0byBpID0gMDsgaSA8IHBoeXNpY2FsSWRMaXN0LT5udW1DYW1lcmFzOyBpKyspIHsKKyAgICAgICAgICAgIG91dFJlcS0+cGh5c2ljYWxTZXR0aW5ncy5lbXBsYWNlKHBoeXNpY2FsSWRMaXN0LT5jYW1lcmFJZHNbaV0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBBQ2FtZXJhTWV0YWRhdGEoKihvdXRSZXEtPnNldHRpbmdzKSkpOworICAgICAgICB9CisgICAgfQogICAgIG91dFJlcS0+dGFyZ2V0cyAgPSBuZXcgQUNhbWVyYU91dHB1dFRhcmdldHMoKTsKICAgICAqcmVxdWVzdCA9IG91dFJlcTsKICAgICByZXR1cm4gQUNBTUVSQV9PSzsKQEAgLTE5MCwxMDQgKzIyOCw1MyBAQAogICAgIHJldHVybiBBQ0FNRVJBX09LOwogfQogCi1jYW1lcmFfc3RhdHVzX3QKLUNhbWVyYURldmljZTo6Y2FwdHVyZUxvY2tlZCgKLSAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAotICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzLAotICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAotICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7Ci0gICAgcmV0dXJuIHN1Ym1pdFJlcXVlc3RzTG9ja2VkKAotICAgICAgICAgICAgc2Vzc2lvbiwgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkLCAvKmlzUmVwZWF0aW5nKi9mYWxzZSk7Ci19Ci0KLWNhbWVyYV9zdGF0dXNfdAotQ2FtZXJhRGV2aWNlOjpzZXRSZXBlYXRpbmdSZXF1ZXN0c0xvY2tlZCgKLSAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAotICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzLAotICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAotICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7Ci0gICAgcmV0dXJuIHN1Ym1pdFJlcXVlc3RzTG9ja2VkKAotICAgICAgICAgICAgc2Vzc2lvbiwgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkLCAvKmlzUmVwZWF0aW5nKi90cnVlKTsKLX0KLQotY2FtZXJhX3N0YXR1c190Ci1DYW1lcmFEZXZpY2U6OnN1Ym1pdFJlcXVlc3RzTG9ja2VkKAotICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCi0gICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMsCi0gICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCi0gICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQsCi0gICAgICAgIGJvb2wgaXNSZXBlYXRpbmcpIHsKK2NhbWVyYV9zdGF0dXNfdCBDYW1lcmFEZXZpY2U6OmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgIGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogc2Vzc2lvbk91dHB1dENvbnRhaW5lcikgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGV2aWNlTG9jayk7CiAgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOwogICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgewotICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN1Ym1pdCBjYXB0dXJlIHJlcXVlc3QgZmFpbGVkISByZXQgJWQiLCBnZXRJZCgpLCByZXQpOwogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAotICAgIC8vIEZvcm0gdHdvIHZlY3RvcnMgb2YgY2FwdHVyZSByZXF1ZXN0LCBvbmUgZm9yIGludGVybmFsIHRyYWNraW5nCi0gICAgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OmNhbWVyYTI6OkNhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0TGlzdDsKLSAgICBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4gcmVxdWVzdHNWOwotICAgIHJlcXVlc3RzVi5zZXRDYXBhY2l0eShudW1SZXF1ZXN0cyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1SZXF1ZXN0czsgaSsrKSB7Ci0gICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXE7Ci0gICAgICAgIHJldCA9IGFsbG9jYXRlQ2FwdHVyZVJlcXVlc3QocmVxdWVzdHNbaV0sIHJlcSk7CisgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb24gc2Vzc2lvbkNvbmZpZ3VyYXRpb24oMCAvKmlucHV0V2lkdGgqLywgMCAvKmlucHV0SGVpZ2h0Ki8sCisgICAgICAgICAgICAtMSAvKmlucHV0Rm9ybWF0Ki8sIENBTUVSQTNfU1RSRUFNX0NPTkZJR1VSQVRJT05fTk9STUFMX01PREUpOworICAgIGZvciAoY29uc3QgYXV0byYgb3V0cHV0IDogc2Vzc2lvbk91dHB1dENvbnRhaW5lci0+bU91dHB1dHMpIHsKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gaUdCUChudWxscHRyKTsKKyAgICAgICAgcmV0ID0gZ2V0SUdCUGZyb21Bbncob3V0cHV0Lm1XaW5kb3csIGlHQlApOwogICAgICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJDb252ZXJ0IGNhcHR1cmUgcmVxdWVzdCB0byBpbnRlcm5hbCBmb3JtYXQgZmFpbHVyZSEgcmV0ICVkIiwgcmV0KTsKKyAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIGZhaWxlZCB0byBleHRyYWN0IGdyYXBoaWMgcHJvZHVjZXIgZnJvbSBuYXRpdmUgd2luZG93IiwKKyAgICAgICAgICAgICAgICAgICAgZ2V0SWQoKSk7CiAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICB9Ci0gICAgICAgIGlmIChyZXEtPm1TdXJmYWNlTGlzdC5lbXB0eSgpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQ2FwdHVyZSByZXF1ZXN0IHdpdGhvdXQgb3V0cHV0IHRhcmdldCBjYW5ub3QgYmUgc3VibWl0dGVkISIpOwotICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisKKyAgICAgICAgU3RyaW5nMTYgcGh5c2ljYWxJZDE2KG91dHB1dC5tUGh5c2ljYWxDYW1lcmFJZC5jX3N0cigpKTsKKyAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbiBvdXRDb25maWcoaUdCUCwgb3V0cHV0Lm1Sb3RhdGlvbiwgcGh5c2ljYWxJZDE2LAorICAgICAgICAgICAgICAgIE91dHB1dENvbmZpZ3VyYXRpb246OklOVkFMSURfU0VUX0lELCB0cnVlKTsKKworICAgICAgICBmb3IgKGF1dG8mIGFudyA6IG91dHB1dC5tU2hhcmVkV2luZG93cykgeworICAgICAgICAgICAgcmV0ID0gZ2V0SUdCUGZyb21BbncoYW53LCBpR0JQKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIGZhaWxlZCB0byBleHRyYWN0IGdyYXBoaWMgcHJvZHVjZXIgZnJvbSBuYXRpdmUgd2luZG93IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldElkKCkpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXRDb25maWcuYWRkR3JhcGhpY1Byb2R1Y2VyKGlHQlApOwogICAgICAgICB9Ci0gICAgICAgIHJlcXVlc3RMaXN0LnB1c2hfYmFjaygqKHJlcS5nZXQoKSkpOwotICAgICAgICByZXF1ZXN0c1YucHVzaF9iYWNrKHJlcSk7CisKKyAgICAgICAgc2Vzc2lvbkNvbmZpZ3VyYXRpb24uYWRkT3V0cHV0Q29uZmlndXJhdGlvbihvdXRDb25maWcpOwogICAgIH0KIAotICAgIGlmIChpc1JlcGVhdGluZykgewotICAgICAgICByZXQgPSBzdG9wUmVwZWF0aW5nTG9ja2VkKCk7Ci0gICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgewotICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzdG9wIHJlcGVhdGluZyBmYWlsZWQhIHJldCAlZCIsIGdldElkKCksIHJldCk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYmluZGVyOjpTdGF0dXMgcmVtb3RlUmV0OwotICAgIGhhcmR3YXJlOjpjYW1lcmEyOjp1dGlsczo6U3VibWl0SW5mbyBpbmZvOwotICAgIHJlbW90ZVJldCA9IG1SZW1vdGUtPnN1Ym1pdFJlcXVlc3RMaXN0KHJlcXVlc3RMaXN0LCBpc1JlcGVhdGluZywgJmluZm8pOwotICAgIGludCBzZXF1ZW5jZUlkID0gaW5mby5tUmVxdWVzdElkOwotICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gaW5mby5tTGFzdEZyYW1lTnVtYmVyOwotICAgIGlmIChzZXF1ZW5jZUlkIDwgMCkgewotICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN1Ym1pdCByZXF1ZXN0IHJlbW90ZSBmYWlsdXJlOiByZXQgJWQiLCBnZXRJZCgpLCBzZXF1ZW5jZUlkKTsKKyAgICBib29sIHN1cHBvcnRlZCA9IGZhbHNlOworICAgIGJpbmRlcjo6U3RhdHVzIHJlbW90ZVJldCA9IG1SZW1vdGUtPmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgICAgICBzZXNzaW9uQ29uZmlndXJhdGlvbiwgJnN1cHBvcnRlZCk7CisgICAgaWYgKHJlbW90ZVJldC5zZXJ2aWNlU3BlY2lmaWNFcnJvckNvZGUoKSA9PQorICAgICAgICAgICAgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTikgeworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9VTlNVUFBPUlRFRF9PUEVSQVRJT047CisgICAgfSBlbHNlIGlmICghcmVtb3RlUmV0LmlzT2soKSkgewogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9VTktOT1dOOwotICAgIH0KLQotICAgIENhbGxiYWNrSG9sZGVyIGNiSG9sZGVyKHNlc3Npb24sIHJlcXVlc3RzViwgaXNSZXBlYXRpbmcsIGNicyk7Ci0gICAgbVNlcXVlbmNlQ2FsbGJhY2tNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHNlcXVlbmNlSWQsIGNiSG9sZGVyKSk7Ci0KLSAgICBpZiAoaXNSZXBlYXRpbmcpIHsKLSAgICAgICAgLy8gc3RvcFJlcGVhdGluZyBhYm92ZSBzaG91bGQgaGF2ZSBjbGVhbnVwIHJlcGVhdGluZyBzZXF1ZW5jZSBpZAotICAgICAgICBpZiAobVJlcGVhdGluZ1NlcXVlbmNlSWQgIT0gUkVRVUVTVF9JRF9OT05FKSB7Ci0gICAgICAgICAgICBzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0UpOwotICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRTsKLSAgICAgICAgfQotICAgICAgICBtUmVwZWF0aW5nU2VxdWVuY2VJZCA9IHNlcXVlbmNlSWQ7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihzZXF1ZW5jZUlkLCBsYXN0RnJhbWVOdW1iZXIpKTsKKyAgICAgICAgcmV0dXJuIHN1cHBvcnRlZCA/IEFDQU1FUkFfT0sgOiBBQ0FNRVJBX0VSUk9SX1NUUkVBTV9DT05GSUdVUkVfRkFJTDsKICAgICB9Ci0KLSAgICBpZiAobUlkbGUpIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlc3Npb25TdGF0ZUNiLCBtSGFuZGxlcik7Ci0gICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgc2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2suY29udGV4dCk7Ci0gICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOwotICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgc2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2sub25BY3RpdmUpOwotICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKLSAgICB9Ci0gICAgbUlkbGUgPSBmYWxzZTsKLSAgICBtQnVzeVNlc3Npb24gPSBzZXNzaW9uOwotCi0gICAgaWYgKGNhcHR1cmVTZXF1ZW5jZUlkKSB7Ci0gICAgICAgICpjYXB0dXJlU2VxdWVuY2VJZCA9IHNlcXVlbmNlSWQ7Ci0gICAgfQotICAgIHJldHVybiBBQ0FNRVJBX09LOwogfQogCiBjYW1lcmFfc3RhdHVzX3QgQ2FtZXJhRGV2aWNlOjp1cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uTG9ja2VkKEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqb3V0cHV0KSB7CkBAIC0zMjUsOCArMzEyLDkgQEAKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CiAKLSAgICBPdXRwdXRDb25maWd1cmF0aW9uIG91dENvbmZpZyhpR0JQLCBvdXRwdXQtPm1Sb3RhdGlvbiwgT3V0cHV0Q29uZmlndXJhdGlvbjo6SU5WQUxJRF9TRVRfSUQsCi0gICAgICAgICAgICB0cnVlKTsKKyAgICBTdHJpbmcxNiBwaHlzaWNhbElkMTYob3V0cHV0LT5tUGh5c2ljYWxDYW1lcmFJZC5jX3N0cigpKTsKKyAgICBPdXRwdXRDb25maWd1cmF0aW9uIG91dENvbmZpZyhpR0JQLCBvdXRwdXQtPm1Sb3RhdGlvbiwgcGh5c2ljYWxJZDE2LAorICAgICAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbjo6SU5WQUxJRF9TRVRfSUQsIHRydWUpOwogCiAgICAgZm9yIChhdXRvJiBhbncgOiBvdXRwdXQtPm1TaGFyZWRXaW5kb3dzKSB7CiAgICAgICAgIHJldCA9IGdldElHQlBmcm9tQW53KGFudywgaUdCUCk7CkBAIC0zNzIsOCArMzYwLDEyIEBACiAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgLypvdXQqL3NwPENhcHR1cmVSZXF1ZXN0PiYgb3V0UmVxKSB7CiAgICAgY2FtZXJhX3N0YXR1c190IHJldDsKICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxKG5ldyBDYXB0dXJlUmVxdWVzdCgpKTsKLSAgICByZXEtPm1QaHlzaWNhbENhbWVyYVNldHRpbmdzLnB1c2hfYmFjayh7c3RkOjpzdHJpbmcobUNhbWVyYUlkLnN0cmluZygpKSwKKyAgICByZXEtPm1QaHlzaWNhbENhbWVyYVNldHRpbmdzLnB1c2hfYmFjayh7Z2V0SWQoKSwKICAgICAgICAgICAgIHJlcXVlc3QtPnNldHRpbmdzLT5nZXRJbnRlcm5hbERhdGEoKX0pOworICAgIGZvciAoYXV0byYgZW50cnkgOiByZXF1ZXN0LT5waHlzaWNhbFNldHRpbmdzKSB7CisgICAgICAgIHJlcS0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MucHVzaF9iYWNrKHtlbnRyeS5maXJzdCwKKyAgICAgICAgICAgICAgICBlbnRyeS5zZWNvbmQtPmdldEludGVybmFsRGF0YSgpfSk7CisgICAgfQogICAgIHJlcS0+bUlzUmVwcm9jZXNzID0gZmFsc2U7IC8vIE5ESyBkb2VzIG5vdCBzdXBwb3J0IHJlcHJvY2Vzc2luZyB5ZXQKICAgICByZXEtPm1Db250ZXh0ID0gcmVxdWVzdC0+Y29udGV4dDsKICAgICByZXEtPm1TdXJmYWNlQ29udmVydGVkID0gdHJ1ZTsgLy8gc2V0IHRvIHRydWUsIGFuZCBmaWxsIGluIHN0cmVhbS9zdXJmYWNlIGlkeCB0byBzcGVlZCB1cCBJUEMKQEAgLTQxNywxMCArNDA5LDE3IEBACiB9CiAKIEFDYXB0dXJlUmVxdWVzdCoKLUNhbWVyYURldmljZTo6YWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+JiByZXEpIHsKK0NhbWVyYURldmljZTo6YWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+JiByZXEsIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VJZCkgewogICAgIEFDYXB0dXJlUmVxdWVzdCogcFJlcXVlc3QgPSBuZXcgQUNhcHR1cmVSZXF1ZXN0KCk7Ci0gICAgQ2FtZXJhTWV0YWRhdGEgY2xvbmUgPSByZXEtPm1QaHlzaWNhbENhbWVyYVNldHRpbmdzLmJlZ2luKCktPnNldHRpbmdzOwotICAgIHBSZXF1ZXN0LT5zZXR0aW5ncyA9IG5ldyBBQ2FtZXJhTWV0YWRhdGEoY2xvbmUucmVsZWFzZSgpLCBBQ2FtZXJhTWV0YWRhdGE6OkFDTV9SRVFVRVNUKTsKKyAgICBmb3IgKGF1dG8mIGVudHJ5IDogcmVxLT5tUGh5c2ljYWxDYW1lcmFTZXR0aW5ncykgeworICAgICAgICBDYW1lcmFNZXRhZGF0YSBjbG9uZSA9IGVudHJ5LnNldHRpbmdzOworICAgICAgICBpZiAoZW50cnkuaWQgPT0gZGV2aWNlSWQpIHsKKyAgICAgICAgICAgIHBSZXF1ZXN0LT5zZXR0aW5ncyA9IG5ldyBBQ2FtZXJhTWV0YWRhdGEoY2xvbmUucmVsZWFzZSgpLCBBQ2FtZXJhTWV0YWRhdGE6OkFDTV9SRVFVRVNUKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBSZXF1ZXN0LT5waHlzaWNhbFNldHRpbmdzLmVtcGxhY2UoZW50cnkuaWQsCisgICAgICAgICAgICAgICAgICAgIG5ldyBBQ2FtZXJhTWV0YWRhdGEoY2xvbmUucmVsZWFzZSgpLCBBQ2FtZXJhTWV0YWRhdGE6OkFDTV9SRVFVRVNUKSk7CisgICAgICAgIH0KKyAgICB9CiAgICAgcFJlcXVlc3QtPnRhcmdldHMgID0gbmV3IEFDYW1lcmFPdXRwdXRUYXJnZXRzKCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXEtPm1TdXJmYWNlTGlzdC5zaXplKCk7IGkrKykgewogICAgICAgICBBTmF0aXZlV2luZG93KiBhbncgPSBzdGF0aWNfY2FzdDxBTmF0aXZlV2luZG93Kj4ocmVxLT5tU3VyZmFjZUxpc3RbaV0uZ2V0KCkpOwpAQCAtNDM2LDcgKzQzNSw4IEBACiAgICAgaWYgKHJlcSA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgZGVsZXRlIHJlcS0+c2V0dGluZ3M7CisgICAgcmVxLT5zZXR0aW5ncy5jbGVhcigpOworICAgIHJlcS0+cGh5c2ljYWxTZXR0aW5ncy5jbGVhcigpOwogICAgIGRlbGV0ZSByZXEtPnRhcmdldHM7CiAgICAgZGVsZXRlIHJlcTsKIH0KQEAgLTYzMywxNSArNjMzLDE2IEBACiAgICAgfQogCiAgICAgc3RkOjpzZXQ8c3RkOjpwYWlyPEFOYXRpdmVXaW5kb3cqLCBPdXRwdXRDb25maWd1cmF0aW9uPj4gb3V0cHV0U2V0OwotICAgIGZvciAoYXV0byBvdXRDb25maWcgOiBvdXRwdXRzLT5tT3V0cHV0cykgeworICAgIGZvciAoY29uc3QgYXV0byYgb3V0Q29uZmlnIDogb3V0cHV0cy0+bU91dHB1dHMpIHsKICAgICAgICAgQU5hdGl2ZVdpbmRvdyogYW53ID0gb3V0Q29uZmlnLm1XaW5kb3c7CiAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGlHQlAobnVsbHB0cik7CiAgICAgICAgIHJldCA9IGdldElHQlBmcm9tQW53KGFudywgaUdCUCk7CiAgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgewogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQorICAgICAgICBTdHJpbmcxNiBwaHlzaWNhbElkMTYob3V0Q29uZmlnLm1QaHlzaWNhbENhbWVyYUlkLmNfc3RyKCkpOwogICAgICAgICBvdXRwdXRTZXQuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAotICAgICAgICAgICAgICAgIGFudywgT3V0cHV0Q29uZmlndXJhdGlvbihpR0JQLCBvdXRDb25maWcubVJvdGF0aW9uLAorICAgICAgICAgICAgICAgIGFudywgT3V0cHV0Q29uZmlndXJhdGlvbihpR0JQLCBvdXRDb25maWcubVJvdGF0aW9uLCBwaHlzaWNhbElkMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uOjpJTlZBTElEX1NFVF9JRCwgb3V0Q29uZmlnLm1Jc1NoYXJlZCkpKTsKICAgICB9CiAgICAgYXV0byBhZGRTZXQgPSBvdXRwdXRTZXQ7CkBAIC03MDYsNyArNzA3LDcgQEAKICAgICB9CiAKICAgICAvLyBhZGQgbmV3IHN0cmVhbXMKLSAgICBmb3IgKGF1dG8gb3V0cHV0UGFpciA6IGFkZFNldCkgeworICAgIGZvciAoY29uc3QgYXV0byYgb3V0cHV0UGFpciA6IGFkZFNldCkgewogICAgICAgICBpbnQgc3RyZWFtSWQ7CiAgICAgICAgIHJlbW90ZVJldCA9IG1SZW1vdGUtPmNyZWF0ZVN0cmVhbShvdXRwdXRQYWlyLnNlY29uZCwgJnN0cmVhbUlkKTsKICAgICAgICAgaWYgKCFyZW1vdGVSZXQuaXNPaygpKSB7CkBAIC04MjksNyArODMwLDcgQEAKICAgICBpZiAoZXJyb3JDb2RlID09IGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfQlVGRkVSKSB7CiAgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSByZXN1bHRFeHRyYXMuZXJyb3JTdHJlYW1JZDsKICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19idWZmZXJMb3N0IG9uQnVmZmVyTG9zdCA9Ci0gICAgICAgICAgICAgICAgY2JoLm1DYWxsYmFja3Mub25DYXB0dXJlQnVmZmVyTG9zdDsKKyAgICAgICAgICAgICAgICBjYmgubU9uQ2FwdHVyZUJ1ZmZlckxvc3Q7CiAgICAgICAgIGF1dG8gb3V0cHV0UGFpckl0ID0gbUNvbmZpZ3VyZWRPdXRwdXRzLmZpbmQoc3RyZWFtSWQpOwogICAgICAgICBpZiAob3V0cHV0UGFpckl0ID09IG1Db25maWd1cmVkT3V0cHV0cy5lbmQoKSkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogc3RyZWFtIGlkICVkIGRvZXMgbm90IGV4aXN0IiwgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CkBAIC04MzksMTQgKzg0MCwxNCBAQAogCiAgICAgICAgIGNvbnN0IGF1dG8mIGdicHMgPSBvdXRwdXRQYWlySXQtPnNlY29uZC5zZWNvbmQuZ2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VycygpOwogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIG91dEdicCA6IGdicHMpIHsKLSAgICAgICAgICAgIGZvciAoYXV0byBzdXJmYWNlIDogcmVxdWVzdC0+bVN1cmZhY2VMaXN0KSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHN1cmZhY2UgOiByZXF1ZXN0LT5tU3VyZmFjZUxpc3QpIHsKICAgICAgICAgICAgICAgICBpZiAoc3VyZmFjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpID09IG91dEdicCkgewogICAgICAgICAgICAgICAgICAgICBBTmF0aXZlV2luZG93KiBhbncgPSBzdGF0aWNfY2FzdDxBTmF0aXZlV2luZG93Kj4oc3VyZmFjZS5nZXQoKSk7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJDYW1lcmEgJXMgTG9zdCBvdXRwdXQgYnVmZmVyIGZvciBBTlcgJXAgZnJhbWUgJSIgUFJJZDY0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldElkKCksIGFudywgZnJhbWVOdW1iZXIpOwogCiAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlQnVmZmVyTG9zdCwgbUhhbmRsZXIpOwotICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ2FsbGJhY2tzLmNvbnRleHQpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOwogICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgb25CdWZmZXJMb3N0KTsKICAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKQEAgLTg1OCw3ICs4NTksNyBAQAogICAgICAgICB9CiAgICAgfSBlbHNlIHsgLy8gSGFuZGxlIG90aGVyIGNhcHR1cmUgZmFpbHVyZXMKICAgICAgICAgLy8gRmlyZSBjYXB0dXJlIGZhaWx1cmUgY2FsbGJhY2sgaWYgdGhlcmUgaXMgb25lIHJlZ2lzdGVyZWQKLSAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgb25FcnJvciA9IGNiaC5tQ2FsbGJhY2tzLm9uQ2FwdHVyZUZhaWxlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgb25FcnJvciA9IGNiaC5tT25DYXB0dXJlRmFpbGVkOwogICAgICAgICBzcDxDYW1lcmFDYXB0dXJlRmFpbHVyZT4gZmFpbHVyZShuZXcgQ2FtZXJhQ2FwdHVyZUZhaWx1cmUoKSk7CiAgICAgICAgIGZhaWx1cmUtPmZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CiAgICAgICAgIC8vIFRPRE86IHJlZmluZSB0aGlzIHdoZW4gaW1wbGVtZW50aW5nIGZsdXNoCkBAIC04NjcsMTAgKzg2OCwxOSBAQAogICAgICAgICBmYWlsdXJlLT53YXNJbWFnZUNhcHR1cmVkID0gKGVycm9yQ29kZSA9PQogICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVTVUxUKTsKIAotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZUZhaWwsIG1IYW5kbGVyKTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNhbGxiYWNrcy5jb250ZXh0KTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShjYmgubUlzTG9naWNhbENhbWVyYUNhbGxiYWNrID8ga1doYXRMb2dpY2FsQ2FwdHVyZUZhaWwgOgorICAgICAgICAgICAgICAgIGtXaGF0Q2FwdHVyZUZhaWwsIG1IYW5kbGVyKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNvbnRleHQpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG9uRXJyb3IpOworICAgICAgICBpZiAoY2JoLm1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjaykgeworICAgICAgICAgICAgaWYgKHJlc3VsdEV4dHJhcy5lcnJvclBoeXNpY2FsQ2FtZXJhSWQuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIFN0cmluZzggY2FtZXJhSWQocmVzdWx0RXh0cmFzLmVycm9yUGh5c2ljYWxDYW1lcmFJZCk7CisgICAgICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoa0ZhaWxpbmdQaHlzaWNhbENhbWVyYUlkLCBjYW1lcmFJZC5zdHJpbmcoKSwgY2FtZXJhSWQuc2l6ZSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBjYmgubU9uTG9naWNhbENhbWVyYUNhcHR1cmVGYWlsZWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG9uRXJyb3IpOworICAgICAgICB9CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgcmVxdWVzdCk7CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlRmFpbHVyZUtleSwgZmFpbHVyZSk7CiAgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOwpAQCAtODgyLDYgKzg5Miw5IEBACiAgICAgcmV0dXJuOwogfQogCitDYW1lcmFEZXZpY2U6OkNhbGxiYWNrSGFuZGxlcjo6Q2FsbGJhY2tIYW5kbGVyKGNvbnN0IGNoYXIqIGlkKSA6IG1JZChpZCkgeworfQorCiB2b2lkIENhbWVyYURldmljZTo6Q2FsbGJhY2tIYW5kbGVyOjpvbk1lc3NhZ2VSZWNlaXZlZCgKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CkBAIC04OTAsNyArOTAzLDkgQEAKICAgICAgICAgY2FzZSBrV2hhdFNlc3Npb25TdGF0ZUNiOgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKKyAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlUmVzdWx0OgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUZhaWw6CisgICAgICAgIGNhc2Uga1doYXRMb2dpY2FsQ2FwdHVyZUZhaWw6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxRW5kOgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVNlcUFib3J0OgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUJ1ZmZlckxvc3Q6CkBAIC05NjAsNyArOTc1LDkgQEAKICAgICAgICAgY2FzZSBrV2hhdFNlc3Npb25TdGF0ZUNiOgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKKyAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlUmVzdWx0OgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUZhaWw6CisgICAgICAgIGNhc2Uga1doYXRMb2dpY2FsQ2FwdHVyZUZhaWw6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxRW5kOgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVNlcUFib3J0OgogICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUJ1ZmZlckxvc3Q6CkBAIC05NzcsNyArOTk0LDkgQEAKICAgICAgICAgICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdDoKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUZhaWw6CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlRmFpbDoKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUJ1ZmZlckxvc3Q6CiAgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kT2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgJm9iaik7CiAgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKQEAgLTEwMjAsNyArMTAzOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIHRpbWVzdGFtcCEiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCk7CisgICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCwgbUlkKTsKICAgICAgICAgICAgICAgICAgICAgKCpvblN0YXJ0KShjb250ZXh0LCBzZXNzaW9uLmdldCgpLCByZXF1ZXN0LCB0aW1lc3RhbXApOwogICAgICAgICAgICAgICAgICAgICBmcmVlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3QpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTEwNDMsMTEgKzEwNjIsNjkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IHJlc3VsdChzdGF0aWNfY2FzdDxBQ2FtZXJhTWV0YWRhdGEqPihvYmouZ2V0KCkpKTsKLSAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwKTsKKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwLCBtSWQpOwogICAgICAgICAgICAgICAgICAgICAoKm9uUmVzdWx0KShjb250ZXh0LCBzZXNzaW9uLmdldCgpLCByZXF1ZXN0LCByZXN1bHQuZ2V0KCkpOwogICAgICAgICAgICAgICAgICAgICBmcmVlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3QpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlUmVzdWx0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBvblJlc3VsdDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmb25SZXN1bHQpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGxvZ2ljYWxDYW1lcmEgY2FwdHVyZSByZXN1bHQgY2FsbGJhY2shIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAob25SZXN1bHQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRPYmplY3Qoa0NhcHR1cmVSZXN1bHRLZXksICZvYmopOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhcHR1cmUgcmVzdWx0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiByZXN1bHQoc3RhdGljX2Nhc3Q8QUNhbWVyYU1ldGFkYXRhKj4ob2JqLmdldCgpKSk7CisKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRPYmplY3Qoa1BoeXNpY2FsQ2FwdHVyZVJlc3VsdEtleSwgJm9iaik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgcGh5c2ljYWwgY2FwdHVyZSByZXN1bHQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gcGh5c2ljYWxSZXN1bHQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QUNhbWVyYVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8qPihvYmouZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4mIHBoeXNpY2FsUmVzdWx0SW5mbyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxSZXN1bHQtPm1QaHlzaWNhbFJlc3VsdEluZm87CisKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBoeXNpY2FsQ2FtZXJhSWRzOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzcDxBQ2FtZXJhTWV0YWRhdGE+PiBwaHlzaWNhbE1ldGFkYXRhQ29weTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzaWNhbFJlc3VsdEluZm8uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggcGh5c2ljYWxJZDgocGh5c2ljYWxSZXN1bHRJbmZvW2ldLm1QaHlzaWNhbENhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWRzLnB1c2hfYmFjayhwaHlzaWNhbElkOC5jX3N0cigpKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgY2xvbmUgPSBwaHlzaWNhbFJlc3VsdEluZm9baV0ubVBoeXNpY2FsQ2FtZXJhTWV0YWRhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICBjbG9uZS51cGRhdGUoQU5EUk9JRF9TWU5DX0ZSQU1FX05VTUJFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeXNpY2FsUmVzdWx0LT5tRnJhbWVOdW1iZXIsIC8qZGF0YV9jb3VudCovMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IG1ldGFkYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFDYW1lcmFNZXRhZGF0YShjbG9uZS5yZWxlYXNlKCksIEFDYW1lcmFNZXRhZGF0YTo6QUNNX1JFU1VMVCk7CisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbE1ldGFkYXRhQ29weS5wdXNoX2JhY2sobWV0YWRhdGEpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IHBoeXNpY2FsQ2FtZXJhSWRQdHJzOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBBQ2FtZXJhTWV0YWRhdGEqPiBwaHlzaWNhbE1ldGFkYXRhQ29weVB0cnM7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGh5c2ljYWxSZXN1bHRJbmZvLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkUHRycy5wdXNoX2JhY2socGh5c2ljYWxDYW1lcmFJZHNbaV0uY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbE1ldGFkYXRhQ29weVB0cnMucHVzaF9iYWNrKHBoeXNpY2FsTWV0YWRhdGFDb3B5W2ldLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCwgbUlkKTsKKyAgICAgICAgICAgICAgICAgICAgKCpvblJlc3VsdCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgcmVxdWVzdCwgcmVzdWx0LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsUmVzdWx0SW5mby5zaXplKCksIHBoeXNpY2FsQ2FtZXJhSWRQdHJzLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbE1ldGFkYXRhQ29weVB0cnMuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfZmFpbGVkIG9uRmFpbDsKQEAgLTEwNjksMTEgKzExNDYsNDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxDYW1lcmFDYXB0dXJlRmFpbHVyZSo+KG9iai5nZXQoKSkpOwogICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZUZhaWx1cmUqIGZhaWx1cmUgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFDYW1lcmFDYXB0dXJlRmFpbHVyZSo+KGZhaWx1cmVTcC5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCk7CisgICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCwgbUlkKTsKICAgICAgICAgICAgICAgICAgICAgKCpvbkZhaWwpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHJlcXVlc3QsIGZhaWx1cmUpOwogICAgICAgICAgICAgICAgICAgICBmcmVlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3QpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlRmFpbDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgb25GYWlsOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvbkZhaWwpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhcHR1cmUgZmFpbCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvbkZhaWwgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRPYmplY3Qoa0NhcHR1cmVGYWlsdXJlS2V5LCAmb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYXB0dXJlIGZhaWx1cmUhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxDYW1lcmFDYXB0dXJlRmFpbHVyZT4gZmFpbHVyZVNwKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYUNhcHR1cmVGYWlsdXJlKj4ob2JqLmdldCgpKSk7CisgICAgICAgICAgICAgICAgICAgIEFMb2dpY2FsQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgZmFpbHVyZTsKKyAgICAgICAgICAgICAgICAgICAgQVN0cmluZyBwaHlzaWNhbENhbWVyYUlkOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFN0cmluZyhrRmFpbGluZ1BoeXNpY2FsQ2FtZXJhSWQsICZwaHlzaWNhbENhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kICYmICFwaHlzaWNhbENhbWVyYUlkLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUucGh5c2ljYWxDYW1lcmFJZCA9IHBoeXNpY2FsQ2FtZXJhSWQuY19zdHIoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUucGh5c2ljYWxDYW1lcmFJZCA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZmFpbHVyZS5jYXB0dXJlRmFpbHVyZSA9ICpmYWlsdXJlU3A7CisgICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCwgbUlkKTsKKyAgICAgICAgICAgICAgICAgICAgKCpvbkZhaWwpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHJlcXVlc3QsICZmYWlsdXJlKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxRW5kOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUVuZCBvblNlcUVuZDsKQEAgLTExNDYsNyArMTI1Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QgPSBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0U3ApOworICAgICAgICAgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QgPSBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0U3AsIG1JZCk7CiAgICAgICAgICAgICAgICAgICAgICgqb25CdWZmZXJMb3N0KShjb250ZXh0LCBzZXNzaW9uLmdldCgpLCByZXF1ZXN0LCBhbncsIGZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0xMTU4LDEyICsxMjY4LDM2IEBACiB9CiAKIENhbWVyYURldmljZTo6Q2FsbGJhY2tIb2xkZXI6OkNhbGxiYWNrSG9sZGVyKAotICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICAgICAgICAgc2Vzc2lvbiwKLSAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4mIHJlcXVlc3RzLAotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCi0gICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicykgOgotICAgIG1TZXNzaW9uKHNlc3Npb24pLCBtUmVxdWVzdHMocmVxdWVzdHMpLAotICAgIG1Jc1JlcGVhdGluZyhpc1JlcGVhdGluZyksIG1DYWxsYmFja3MoZmlsbENiKGNicykpIHt9CisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgY29uc3QgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+JiByZXF1ZXN0cywKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdGluZywKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicykgOgorICAgICAgICBtU2Vzc2lvbihzZXNzaW9uKSwgbVJlcXVlc3RzKHJlcXVlc3RzKSwKKyAgICAgICAgbUlzUmVwZWF0aW5nKGlzUmVwZWF0aW5nKSwKKyAgICAgICAgbUlzTG9naWNhbENhbWVyYUNhbGxiYWNrKGZhbHNlKSB7CisgICAgaW5pdENhcHR1cmVDYWxsYmFja3MoY2JzKTsKKworICAgIGlmIChjYnMgIT0gbnVsbHB0cikgeworICAgICAgICBtT25DYXB0dXJlQ29tcGxldGVkID0gY2JzLT5vbkNhcHR1cmVDb21wbGV0ZWQ7CisgICAgICAgIG1PbkNhcHR1cmVGYWlsZWQgPSBjYnMtPm9uQ2FwdHVyZUZhaWxlZDsKKyAgICB9Cit9CisKK0NhbWVyYURldmljZTo6Q2FsbGJhY2tIb2xkZXI6OkNhbGxiYWNrSG9sZGVyKAorICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiYgcmVxdWVzdHMsCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MqIGxjYnMpIDoKKyAgICAgICAgbVNlc3Npb24oc2Vzc2lvbiksIG1SZXF1ZXN0cyhyZXF1ZXN0cyksCisgICAgICAgIG1Jc1JlcGVhdGluZyhpc1JlcGVhdGluZyksCisgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjayh0cnVlKSB7CisgICAgaW5pdENhcHR1cmVDYWxsYmFja3MobGNicyk7CisKKyAgICBpZiAobGNicyAhPSBudWxscHRyKSB7CisgICAgICAgIG1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkID0gbGNicy0+b25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZDsKKyAgICAgICAgbU9uTG9naWNhbENhbWVyYUNhcHR1cmVGYWlsZWQgPSBsY2JzLT5vbkxvZ2ljYWxDYW1lcmFDYXB0dXJlRmFpbGVkOworICAgIH0KK30KIAogdm9pZAogQ2FtZXJhRGV2aWNlOjpjaGVja1JlcGVhdGluZ1NlcXVlbmNlQ29tcGxldGVMb2NrZWQoCkBAIC0xMTgwLDkgKzEzMTQsOSBAQAogICAgICAgICBtU2VxdWVuY2VDYWxsYmFja01hcC5lcmFzZShjYkl0KTsKICAgICAgICAgLy8gc2VuZCBzZXEgYWJvcnRlZCBjYWxsYmFjawogICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVNlcUFib3J0LCBtSGFuZGxlcik7Ci0gICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1DYWxsYmFja3MuY29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgY2JoLm1TZXNzaW9uKTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGNiaC5tQ2FsbGJhY2tzLm9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZCk7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBjYmgubU9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZCk7CiAgICAgICAgIG1zZy0+c2V0SW50MzIoa1NlcXVlbmNlSWRLZXksIHNlcXVlbmNlSWQpOwogICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKICAgICB9IGVsc2UgewpAQCAtMTIzMCw5ICsxMzY0LDkgQEAKICAgICAgICAgICAgIG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVyYXNlKGNiSXQpOwogICAgICAgICAgICAgLy8gc2VuZCBzZXEgY29tcGxldGUgY2FsbGJhY2sKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlU2VxRW5kLCBtSGFuZGxlcik7Ci0gICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ2FsbGJhY2tzLmNvbnRleHQpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNvbnRleHQpOwogICAgICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgY2JoLm1TZXNzaW9uKTsKLSAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBjYmgubUNhbGxiYWNrcy5vbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZCk7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgY2JoLm1PbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZCk7CiAgICAgICAgICAgICBtc2ctPnNldEludDMyKGtTZXF1ZW5jZUlkS2V5LCBzZXF1ZW5jZUlkKTsKICAgICAgICAgICAgIG1zZy0+c2V0SW50NjQoa0ZyYW1lTnVtYmVyS2V5LCBsYXN0RnJhbWVOdW1iZXIpOwogCkBAIC0xMjkwLDE2ICsxNDI0LDIxIEBACiAgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dFKCJVbmtub3duIGVycm9yIGZyb20gY2FtZXJhIGRldmljZTogJWQiLCBlcnJvckNvZGUpOwotICAgICAgICAgICAgLy8gbm8gYnJlYWsKKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKICAgICAgICAgY2FzZSBFUlJPUl9DQU1FUkFfREVWSUNFOgogICAgICAgICBjYXNlIEVSUk9SX0NBTUVSQV9TRVJWSUNFOgogICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGVycm9yVmFsID0gOjpFUlJPUl9DQU1FUkFfREVWSUNFOworICAgICAgICAgICAgLy8gV2Uga2VlcCB0aGlzIHN3aXRjaCBzaW5jZSB0aGlzIGJsb2NrIG1pZ2h0IGJlIGVuY291bnRlcmVkIHdpdGgKKyAgICAgICAgICAgIC8vIG1vcmUgdGhhbiBqdXN0IDIgc3RhdGVzLiBUaGUgZGVmYXVsdCBmYWxsdGhyb3VnaCBjb3VsZCBoYXZlIHVzCisgICAgICAgICAgICAvLyBoYW5kbGluZyBtb3JlIHVubWF0Y2hlZCBlcnJvciBjYXNlcy4KICAgICAgICAgICAgIHN3aXRjaCAoZXJyb3JDb2RlKSB7CiAgICAgICAgICAgICAgICAgY2FzZSBFUlJPUl9DQU1FUkFfREVWSUNFOgogICAgICAgICAgICAgICAgICAgICBkZXYtPnNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgRVJST1JfQ0FNRVJBX1NFUlZJQ0U6CiAgICAgICAgICAgICAgICAgICAgIGRldi0+c2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRSk7CisgICAgICAgICAgICAgICAgICAgIGVycm9yVmFsID0gOjpFUlJPUl9DQU1FUkFfU0VSVklDRTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgZGV2LT5zZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX1VOS05PV04pOwpAQCAtMTMwOSw3ICsxNDQ4LDcgQEAKICAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgZGV2LT5tQXBwQ2FsbGJhY2tzLmNvbnRleHQpOwogICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtEZXZpY2VLZXksICh2b2lkKikgZGV2LT5nZXRXcmFwcGVyKCkpOwogICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGRldi0+bUFwcENhbGxiYWNrcy5vbkVycm9yKTsKLSAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoa0Vycm9yQ29kZUtleSwgZXJyb3JDb2RlKTsKKyAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoa0Vycm9yQ29kZUtleSwgZXJyb3JWYWwpOwogICAgICAgICAgICAgbXNnLT5wb3N0KCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTM4NCw3ICsxNTIzLDcgQEAKICAgICBhdXRvIGl0ID0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5maW5kKHNlcXVlbmNlSWQpOwogICAgIGlmIChpdCAhPSBkZXYtPm1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVuZCgpKSB7CiAgICAgICAgIENhbGxiYWNrSG9sZGVyIGNiaCA9ICgqaXQpLnNlY29uZDsKLSAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydCBvblN0YXJ0ID0gY2JoLm1DYWxsYmFja3Mub25DYXB0dXJlU3RhcnRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydCBvblN0YXJ0ID0gY2JoLm1PbkNhcHR1cmVTdGFydGVkOwogICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24gPSBjYmgubVNlc3Npb247CiAgICAgICAgIGlmICgoc2l6ZV90KSBidXJzdElkID49IGNiaC5tUmVxdWVzdHMuc2l6ZSgpKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiByZXF1ZXN0IGluZGV4ICVkIG91dCBvZiBib3VuZCAoc2l6ZSAlenUpIiwKQEAgLTEzOTMsNyArMTUzMiw3IEBACiAgICAgICAgIH0KICAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QgPSBjYmgubVJlcXVlc3RzW2J1cnN0SWRdOwogICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVN0YXJ0LCBkZXYtPm1IYW5kbGVyKTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNhbGxiYWNrcy5jb250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNvbnRleHQpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG9uU3RhcnQpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZVJlcXVlc3RLZXksIHJlcXVlc3QpOwpAQCAtMTQwOCw3ICsxNTQ3LDYgQEAKICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhLAogICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+JiBwaHlzaWNhbFJlc3VsdEluZm9zKSB7Ci0gICAgKHZvaWQpIHBoeXNpY2FsUmVzdWx0SW5mb3M7CiAgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAKICAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IG1EZXZpY2UucHJvbW90ZSgpOwpAQCAtMTQ0NCw5ICsxNTgyLDYgQEAKICAgICBhdXRvIGl0ID0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5maW5kKHNlcXVlbmNlSWQpOwogICAgIGlmIChpdCAhPSBkZXYtPm1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVuZCgpKSB7CiAgICAgICAgIENhbGxiYWNrSG9sZGVyIGNiaCA9ICgqaXQpLnNlY29uZDsKLSAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgb25SZXN1bHQgPSBpc1BhcnRpYWxSZXN1bHQgPwotICAgICAgICAgICAgICAgIGNiaC5tQ2FsbGJhY2tzLm9uQ2FwdHVyZVByb2dyZXNzZWQgOgotICAgICAgICAgICAgICAgIGNiaC5tQ2FsbGJhY2tzLm9uQ2FwdHVyZUNvbXBsZXRlZDsKICAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uID0gY2JoLm1TZXNzaW9uOwogICAgICAgICBpZiAoKHNpemVfdCkgYnVyc3RJZCA+PSBjYmgubVJlcXVlc3RzLnNpemUoKSkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogcmVxdWVzdCBpbmRleCAlZCBvdXQgb2YgYm91bmQgKHNpemUgJXp1KSIsCkBAIC0xNDU2LDEzICsxNTkxLDI3IEBACiAgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0ID0gY2JoLm1SZXF1ZXN0c1tidXJzdElkXTsKICAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiByZXN1bHQobmV3IEFDYW1lcmFNZXRhZGF0YSgKICAgICAgICAgICAgICAgICBtZXRhZGF0YUNvcHkucmVsZWFzZSgpLCBBQ2FtZXJhTWV0YWRhdGE6OkFDTV9SRVNVTFQpKTsKKyAgICAgICAgc3A8QUNhbWVyYVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+IHBoeXNpY2FsUmVzdWx0KAorICAgICAgICAgICAgICAgIG5ldyBBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyhwaHlzaWNhbFJlc3VsdEluZm9zLCBmcmFtZU51bWJlcikpOwogCi0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlUmVzdWx0LCBkZXYtPm1IYW5kbGVyKTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNhbGxiYWNrcy5jb250ZXh0KTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBjYmgubUlzTG9naWNhbENhbWVyYUNhbGxiYWNrID8ga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdCA6IGtXaGF0Q2FwdHVyZVJlc3VsdCwKKyAgICAgICAgICAgICAgICBkZXYtPm1IYW5kbGVyKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNvbnRleHQpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG9uUmVzdWx0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXN1bHRLZXksIHJlc3VsdCk7CisgICAgICAgIGlmIChpc1BhcnRpYWxSZXN1bHQpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljYmgubU9uQ2FwdHVyZVByb2dyZXNzZWQpOworICAgICAgICB9IGVsc2UgaWYgKGNiaC5tSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2spIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljYmgubU9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQpOworICAgICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1BoeXNpY2FsQ2FwdHVyZVJlc3VsdEtleSwgcGh5c2ljYWxSZXN1bHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWNiaC5tT25DYXB0dXJlQ29tcGxldGVkKTsKKyAgICAgICAgfQogICAgICAgICBkZXYtPnBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOwogICAgIH0KIApAQCAtMTUwOCw1ICsxNjU3LDUgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi0KK30gLy8gbmFtZXNwYWNlIGFjYW0KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmggYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5oCmluZGV4IDEzNjkxNDguLmM5MmE5NWYgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmgKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDxhdG9taWM+CiAjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgpAQCAtMzQsNiArMzUsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0Lmg+CiAKICNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhTWFuYWdlci5oPgpAQCAtNDEsMTQgKzQzLDI1IEBACiAjaW5jbHVkZSAiQUNhbWVyYU1ldGFkYXRhLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKIAogLy8gV3JhcCBBQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgc28gaXQgY2FuIGJlIHJlZi1jb3VudGVkCiBzdHJ1Y3QgQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgOiBwdWJsaWMgUmVmQmFzZSwgcHVibGljIEFDYW1lcmFDYXB0dXJlRmFpbHVyZSB7fTsKIAorLy8gV3JhcCBQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvIHNvIHRoYXQgaXQgY2FuIGJlIHJlZi1jb3VudGVkCitzdHJ1Y3QgQUNhbWVyYVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm86IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyhjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgaW5mbywKKyAgICAgICAgICAgIGludDY0X3QgZnJhbWVOdW1iZXIpIDoKKyAgICAgICAgbVBoeXNpY2FsUmVzdWx0SW5mbyhpbmZvKSwgbUZyYW1lTnVtYmVyKGZyYW1lTnVtYmVyKSB7fQorCisgICAgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gbVBoeXNpY2FsUmVzdWx0SW5mbzsKKyAgICBpbnQ2NF90IG1GcmFtZU51bWJlcjsKK307CisKIGNsYXNzIENhbWVyYURldmljZSBmaW5hbCA6IHB1YmxpYyBSZWZCYXNlIHsKICAgcHVibGljOgogICAgIENhbWVyYURldmljZShjb25zdCBjaGFyKiBpZCwgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyogY2IsCi0gICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QUNhbWVyYU1ldGFkYXRhPiBjaGFycywKKyAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMsCiAgICAgICAgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlKiB3cmFwcGVyKTsKICAgICB+Q2FtZXJhRGV2aWNlKCk7CiAKQEAgLTU2LDYgKzY5LDcgQEAKIAogICAgIGNhbWVyYV9zdGF0dXNfdCBjcmVhdGVDYXB0dXJlUmVxdWVzdCgKICAgICAgICAgICAgIEFDYW1lcmFEZXZpY2VfcmVxdWVzdF90ZW1wbGF0ZSB0ZW1wbGF0ZUlkLAorICAgICAgICAgICAgY29uc3QgQUNhbWVyYUlkTGlzdCogcGh5c2ljYWxJZExpc3QsCiAgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0KSBjb25zdDsKIAogICAgIGNhbWVyYV9zdGF0dXNfdCBjcmVhdGVDYXB0dXJlU2Vzc2lvbigKQEAgLTY0LDYgKzc4LDkgQEAKICAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2tzLAogICAgICAgICAgICAgLypvdXQqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbioqIHNlc3Npb24pOwogCisgICAgY2FtZXJhX3N0YXR1c190IGlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqIHNlc3Npb25PdXRwdXRDb250YWluZXIpIGNvbnN0OworCiAgICAgLy8gQ2FsbGJhY2tzIGZyb20gY2FtZXJhIHNlcnZpY2UKICAgICBjbGFzcyBTZXJ2aWNlQ2FsbGJhY2sgOiBwdWJsaWMgaGFyZHdhcmU6OmNhbWVyYTI6OkJuQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzIHsKICAgICAgIHB1YmxpYzoKQEAgLTEwOCwxOSArMTI1LDIyIEBACiAgICAgY2FtZXJhX3N0YXR1c190IHdhaXRVbnRpbElkbGVMb2NrZWQoKTsKIAogCisgICAgdGVtcGxhdGU8Y2xhc3MgVD4KICAgICBjYW1lcmFfc3RhdHVzX3QgY2FwdHVyZUxvY2tlZChzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCi0gICAgICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzLAorICAgICAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAogICAgICAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKICAgICAgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpOwogCisgICAgdGVtcGxhdGU8Y2xhc3MgVD4KICAgICBjYW1lcmFfc3RhdHVzX3Qgc2V0UmVwZWF0aW5nUmVxdWVzdHNMb2NrZWQoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAotICAgICAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKICAgICAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCiAgICAgICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKTsKIAorICAgIHRlbXBsYXRlPGNsYXNzIFQ+CiAgICAgY2FtZXJhX3N0YXR1c190IHN1Ym1pdFJlcXVlc3RzTG9ja2VkKAogICAgICAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAotICAgICAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKICAgICAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCiAgICAgICAgICAgICAvKm91dCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCwKICAgICAgICAgICAgIGJvb2wgaXNSZXBlYXRpbmcpOwpAQCAtMTMwLDcgKzE1MCw4IEBACiAgICAgY2FtZXJhX3N0YXR1c190IGFsbG9jYXRlQ2FwdHVyZVJlcXVlc3QoCiAgICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIHNwPENhcHR1cmVSZXF1ZXN0PiYgb3V0UmVxKTsKIAotICAgIHN0YXRpYyBBQ2FwdHVyZVJlcXVlc3QqIGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHNwPENhcHR1cmVSZXF1ZXN0PiYgcmVxKTsKKyAgICBzdGF0aWMgQUNhcHR1cmVSZXF1ZXN0KiBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChzcDxDYXB0dXJlUmVxdWVzdD4mIHJlcSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXZpY2VJZCk7CiAgICAgc3RhdGljIHZvaWQgZnJlZUFDYXB0dXJlUmVxdWVzdChBQ2FwdHVyZVJlcXVlc3QqKTsKIAogICAgIC8vIG9ubHkgRm9yIHNlc3Npb24gdG8gaG9sZCBkZXZpY2UgbG9jawpAQCAtMTU2LDcgKzE3Nyw3IEBACiAgICAgbXV0YWJsZSBNdXRleCBtRGV2aWNlTG9jazsKICAgICBjb25zdCBTdHJpbmc4IG1DYW1lcmFJZDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbWVyYSBJRAogICAgIGNvbnN0IEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MgbUFwcENhbGxiYWNrczsgLy8gQ2FsbGJhY2sgdG8gYXBwCi0gICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEFDYW1lcmFNZXRhZGF0YT4gbUNoYXJzOyAgICAvLyBDYW1lcmEgY2hhcmFjdGVyaXN0aWNzCisgICAgY29uc3Qgc3A8QUNhbWVyYU1ldGFkYXRhPiBtQ2hhcnM7ICAgICAgICAgICAgICAgICAvLyBDYW1lcmEgY2hhcmFjdGVyaXN0aWNzCiAgICAgY29uc3Qgc3A8U2VydmljZUNhbGxiYWNrPiBtU2VydmljZUNhbGxiYWNrOwogICAgIEFDYW1lcmFEZXZpY2UqIG1XcmFwcGVyOwogCkBAIC0xOTEsNyArMjEyLDkgQEAKICAgICAgICAgLy8gQ2FwdHVyZSBjYWxsYmFja3MKICAgICAgICAga1doYXRDYXB0dXJlU3RhcnQsICAgICAvLyBvbkNhcHR1cmVTdGFydGVkCiAgICAgICAgIGtXaGF0Q2FwdHVyZVJlc3VsdCwgICAgLy8gb25DYXB0dXJlUHJvZ3Jlc3NlZCwgb25DYXB0dXJlQ29tcGxldGVkCisgICAgICAgIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQsIC8vIG9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQKICAgICAgICAga1doYXRDYXB0dXJlRmFpbCwgICAgICAvLyBvbkNhcHR1cmVGYWlsZWQKKyAgICAgICAga1doYXRMb2dpY2FsQ2FwdHVyZUZhaWwsIC8vIG9uTG9naWNhbENhbWVyYUNhcHR1cmVGYWlsZWQKICAgICAgICAga1doYXRDYXB0dXJlU2VxRW5kLCAgICAvLyBvbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZAogICAgICAgICBrV2hhdENhcHR1cmVTZXFBYm9ydCwgIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZAogICAgICAgICBrV2hhdENhcHR1cmVCdWZmZXJMb3N0LC8vIG9uQ2FwdHVyZUJ1ZmZlckxvc3QKQEAgLTIwNiwxNiArMjI5LDIwIEBACiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYXB0dXJlUmVxdWVzdEtleTsKICAgICBzdGF0aWMgY29uc3QgY2hhcioga1RpbWVTdGFtcEtleTsKICAgICBzdGF0aWMgY29uc3QgY2hhcioga0NhcHR1cmVSZXN1bHRLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtQaHlzaWNhbENhcHR1cmVSZXN1bHRLZXk7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYXB0dXJlRmFpbHVyZUtleTsKICAgICBzdGF0aWMgY29uc3QgY2hhcioga1NlcXVlbmNlSWRLZXk7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtGcmFtZU51bWJlcktleTsKICAgICBzdGF0aWMgY29uc3QgY2hhcioga0Fud0tleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0ZhaWxpbmdQaHlzaWNhbENhbWVyYUlkOwogCiAgICAgY2xhc3MgQ2FsbGJhY2tIYW5kbGVyIDogcHVibGljIEFIYW5kbGVyIHsKICAgICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgQ2FsbGJhY2tIYW5kbGVyKGNvbnN0IGNoYXIqIGlkKTsKICAgICAgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgb3ZlcnJpZGU7CiAKICAgICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c3RyaW5nIG1JZDsKICAgICAgICAgLy8gVGhpcyBoYW5kbGVyIHdpbGwgY2FjaGUgYWxsIGNhcHR1cmUgc2Vzc2lvbiBzcCB1bnRpbCBrV2hhdENsZWFuVXBTZXNzaW9ucwogICAgICAgICAvLyBpcyBwcm9jZXNzZWQuIFRoaXMgaXMgdXNlZCB0byBndWFyYW50ZWUgdGhlIGxhc3Qgc2Vzc2lvbiByZWZlcmVuY2UgaXMgYWx3YXlzCiAgICAgICAgIC8vIGJlaW5nIHJlbW92ZWQgaW4gY2FsbGJhY2sgdGhyZWFkIHdpdGhvdXQgaG9sZGluZyBjYW1lcmEgZGV2aWNlIGxvY2sKQEAgLTI0NCwxOSArMjcxLDQ3IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiYgcmVxdWVzdHMsCiAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMpOworICAgICAgICBDYWxsYmFja0hvbGRlcihzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiYgcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MqIGxjYnMpOwogCi0gICAgICAgIHN0YXRpYyBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyBmaWxsQ2IoCi0gICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicykgeworICAgICAgICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgICAgICAgdm9pZCBpbml0Q2FwdHVyZUNhbGxiYWNrcyhUKiBjYnMpIHsKKyAgICAgICAgICAgIG1Db250ZXh0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVTdGFydGVkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVQcm9ncmVzc2VkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVDb21wbGV0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uTG9naWNhbENhbWVyYUNhcHR1cmVGYWlsZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZUZhaWxlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlQnVmZmVyTG9zdCA9IG51bGxwdHI7CiAgICAgICAgICAgICBpZiAoY2JzICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKmNiczsKKyAgICAgICAgICAgICAgICBtQ29udGV4dCA9IGNicy0+Y29udGV4dDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlU3RhcnRlZCA9IGNicy0+b25DYXB0dXJlU3RhcnRlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlUHJvZ3Jlc3NlZCA9IGNicy0+b25DYXB0dXJlUHJvZ3Jlc3NlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQgPSBjYnMtPm9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkOworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQgPSBjYnMtPm9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZDsKKyAgICAgICAgICAgICAgICBtT25DYXB0dXJlQnVmZmVyTG9zdCA9IGNicy0+b25DYXB0dXJlQnVmZmVyTG9zdDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB7IG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIsIG51bGxwdHIgfTsKICAgICAgICAgfQotCiAgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICBtU2Vzc2lvbjsKICAgICAgICAgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+IG1SZXF1ZXN0czsKICAgICAgICAgY29uc3QgYm9vbCAgICAgICAgICAgICAgICAgIG1Jc1JlcGVhdGluZzsKLSAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MgbUNhbGxiYWNrczsKKyAgICAgICAgY29uc3QgYm9vbCAgICAgICAgICAgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjazsKKworICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnQgbU9uQ2FwdHVyZVN0YXJ0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG1PbkNhcHR1cmVQcm9ncmVzc2VkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCBtT25DYXB0dXJlQ29tcGxldGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tfZmFpbGVkIG1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlRmFpbGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2ZhaWxlZCBtT25DYXB0dXJlRmFpbGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3NlcXVlbmNlRW5kIG1PbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUFib3J0IG1PbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfYnVmZmVyTG9zdCBtT25DYXB0dXJlQnVmZmVyTG9zdDsKICAgICB9OwogICAgIC8vIHNlcXVlbmNlIGlkIC0+IGNhbGxiYWNrcyBtYXAKICAgICBzdGQ6Om1hcDxpbnQsIENhbGxiYWNrSG9sZGVyPiBtU2VxdWVuY2VDYWxsYmFja01hcDsKQEAgLTI4Myw5ICszMzgsMTEgQEAKICAgICAvLyBNaXNjIHZhcmlhYmxlcwogICAgIGludDMyX3QgbVNoYWRpbmdNYXBTaXplWzJdOyAgIC8vIGNvbnN0IGFmdGVyIGNvbnN0cnVjdG9yCiAgICAgaW50MzJfdCBtUGFydGlhbFJlc3VsdENvdW50OyAgLy8gY29uc3QgYWZ0ZXIgY29uc3RydWN0b3IKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbVBoeXNpY2FsSWRzOyAvLyBjb25zdCBhZnRlciBjb25zdHJ1Y3RvcgogCiB9OwogCit9IC8vIG5hbWVzcGFjZSBhY2FtOwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZDsKIAogLyoqCkBAIC0yOTQsOCArMzUxLDggQEAKICAqLwogc3RydWN0IEFDYW1lcmFEZXZpY2UgewogICAgIEFDYW1lcmFEZXZpY2UoY29uc3QgY2hhciogaWQsIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNiLAotICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMpIDoKLSAgICAgICAgICAgIG1EZXZpY2UobmV3IENhbWVyYURldmljZShpZCwgY2IsIHN0ZDo6bW92ZShjaGFycyksIHRoaXMpKSB7fQorICAgICAgICAgICAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBjaGFycykgOgorICAgICAgICAgICAgbURldmljZShuZXcgYW5kcm9pZDo6YWNhbTo6Q2FtZXJhRGV2aWNlKGlkLCBjYiwgY2hhcnMsIHRoaXMpKSB7fQogCiAgICAgfkFDYW1lcmFEZXZpY2UoKSB7fTsKIApAQCAtMzA2LDggKzM2Myw5IEBACiAKICAgICBjYW1lcmFfc3RhdHVzX3QgY3JlYXRlQ2FwdHVyZVJlcXVlc3QoCiAgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCwKKyAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFJZExpc3QqIHBoeXNpY2FsQ2FtZXJhSWRMaXN0LAogICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdCkgY29uc3QgewotICAgICAgICByZXR1cm4gbURldmljZS0+Y3JlYXRlQ2FwdHVyZVJlcXVlc3QodGVtcGxhdGVJZCwgcmVxdWVzdCk7CisgICAgICAgIHJldHVybiBtRGV2aWNlLT5jcmVhdGVDYXB0dXJlUmVxdWVzdCh0ZW1wbGF0ZUlkLCBwaHlzaWNhbENhbWVyYUlkTGlzdCwgcmVxdWVzdCk7CiAgICAgfQogCiAgICAgY2FtZXJhX3N0YXR1c190IGNyZWF0ZUNhcHR1cmVTZXNzaW9uKApAQCAtMzE4LDYgKzM3NiwxMSBAQAogICAgICAgICByZXR1cm4gbURldmljZS0+Y3JlYXRlQ2FwdHVyZVNlc3Npb24ob3V0cHV0cywgc2Vzc2lvblBhcmFtZXRlcnMsIGNhbGxiYWNrcywgc2Vzc2lvbik7CiAgICAgfQogCisgICAgY2FtZXJhX3N0YXR1c190IGlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqIHNlc3Npb25PdXRwdXRDb250YWluZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1EZXZpY2UtPmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoc2Vzc2lvbk91dHB1dENvbnRhaW5lcik7CisgICAgfQorCiAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICogRGV2aWNlIGludGVyYWwgQVBJcyAqCiAgICAgICoqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzMxLDcgKzM5NCw3IEBACiAgICAgfQogCiAgIHByaXZhdGU6Ci0gICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6Q2FtZXJhRGV2aWNlPiBtRGV2aWNlOworICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OmFjYW06OkNhbWVyYURldmljZT4gbURldmljZTsKIH07CiAKICNlbmRpZiAvLyBfQUNBTUVSQV9ERVZJQ0VfSApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaW5jIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYzUzNTIKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5pbmMKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSAiQUNhbWVyYURldmljZS5oIgorI2luY2x1ZGUgIkFDYW1lcmFNZXRhZGF0YS5oIgorI2luY2x1ZGUgIkFDYXB0dXJlUmVxdWVzdC5oIgorI2luY2x1ZGUgIkFDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6Y2FwdHVyZUxvY2tlZCgKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNMb2NrZWQoCisgICAgICAgICAgICBzZXNzaW9uLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQsIC8qaXNSZXBlYXRpbmcqL2ZhbHNlKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVD4KK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjpzZXRSZXBlYXRpbmdSZXF1ZXN0c0xvY2tlZCgKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNMb2NrZWQoCisgICAgICAgICAgICBzZXNzaW9uLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQsIC8qaXNSZXBlYXRpbmcqL3RydWUpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBUPgorY2FtZXJhX3N0YXR1c190IENhbWVyYURldmljZTo6c3VibWl0UmVxdWVzdHNMb2NrZWQoCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkLAorICAgICAgICBib29sIGlzUmVwZWF0aW5nKSB7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN1Ym1pdCBjYXB0dXJlIHJlcXVlc3QgZmFpbGVkISByZXQgJWQiLCBnZXRJZCgpLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8vIEZvcm0gdHdvIHZlY3RvcnMgb2YgY2FwdHVyZSByZXF1ZXN0LCBvbmUgZm9yIGludGVybmFsIHRyYWNraW5nCisgICAgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OmNhbWVyYTI6OkNhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0TGlzdDsKKyAgICBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4gcmVxdWVzdHNWOworICAgIHJlcXVlc3RzVi5zZXRDYXBhY2l0eShudW1SZXF1ZXN0cyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1SZXF1ZXN0czsgaSsrKSB7CisgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXE7CisgICAgICAgIHJldCA9IGFsbG9jYXRlQ2FwdHVyZVJlcXVlc3QocmVxdWVzdHNbaV0sIHJlcSk7CisgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkNvbnZlcnQgY2FwdHVyZSByZXF1ZXN0IHRvIGludGVybmFsIGZvcm1hdCBmYWlsdXJlISByZXQgJWQiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVxLT5tU3VyZmFjZUxpc3QuZW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR0UoIkNhcHR1cmUgcmVxdWVzdCB3aXRob3V0IG91dHB1dCB0YXJnZXQgY2Fubm90IGJlIHN1Ym1pdHRlZCEiKTsKKyAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICB9CisgICAgICAgIHJlcXVlc3RMaXN0LnB1c2hfYmFjaygqKHJlcS5nZXQoKSkpOworICAgICAgICByZXF1ZXN0c1YucHVzaF9iYWNrKHJlcSk7CisgICAgfQorCisgICAgaWYgKGlzUmVwZWF0aW5nKSB7CisgICAgICAgIHJldCA9IHN0b3BSZXBlYXRpbmdMb2NrZWQoKTsKKyAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN0b3AgcmVwZWF0aW5nIGZhaWxlZCEgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBiaW5kZXI6OlN0YXR1cyByZW1vdGVSZXQ7CisgICAgaGFyZHdhcmU6OmNhbWVyYTI6OnV0aWxzOjpTdWJtaXRJbmZvIGluZm87CisgICAgcmVtb3RlUmV0ID0gbVJlbW90ZS0+c3VibWl0UmVxdWVzdExpc3QocmVxdWVzdExpc3QsIGlzUmVwZWF0aW5nLCAmaW5mbyk7CisgICAgaW50IHNlcXVlbmNlSWQgPSBpbmZvLm1SZXF1ZXN0SWQ7CisgICAgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIgPSBpbmZvLm1MYXN0RnJhbWVOdW1iZXI7CisgICAgaWYgKHNlcXVlbmNlSWQgPCAwKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmEgJXMgc3VibWl0IHJlcXVlc3QgcmVtb3RlIGZhaWx1cmU6IHJldCAlZCIsIGdldElkKCksIHNlcXVlbmNlSWQpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIENhbGxiYWNrSG9sZGVyIGNiSG9sZGVyKHNlc3Npb24sIHJlcXVlc3RzViwgaXNSZXBlYXRpbmcsIGNicyk7CisgICAgbVNlcXVlbmNlQ2FsbGJhY2tNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHNlcXVlbmNlSWQsIGNiSG9sZGVyKSk7CisKKyAgICBpZiAoaXNSZXBlYXRpbmcpIHsKKyAgICAgICAgLy8gc3RvcFJlcGVhdGluZyBhYm92ZSBzaG91bGQgaGF2ZSBjbGVhbnVwIHJlcGVhdGluZyBzZXF1ZW5jZSBpZAorICAgICAgICBpZiAobVJlcGVhdGluZ1NlcXVlbmNlSWQgIT0gUkVRVUVTVF9JRF9OT05FKSB7CisgICAgICAgICAgICBzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0UpOworICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRTsKKyAgICAgICAgfQorICAgICAgICBtUmVwZWF0aW5nU2VxdWVuY2VJZCA9IHNlcXVlbmNlSWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihzZXF1ZW5jZUlkLCBsYXN0RnJhbWVOdW1iZXIpKTsKKyAgICB9CisKKyAgICBpZiAobUlkbGUpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlc3Npb25TdGF0ZUNiLCBtSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgc2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2suY29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgc2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2sub25BY3RpdmUpOworICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICB9CisgICAgbUlkbGUgPSBmYWxzZTsKKyAgICBtQnVzeVNlc3Npb24gPSBzZXNzaW9uOworCisgICAgaWYgKGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgICAgICpjYXB0dXJlU2VxdWVuY2VJZCA9IHNlcXVlbmNlSWQ7CisgICAgfQorICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCit9IC8vIG5hbWVzcGFjZSBhY2FtCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcAppbmRleCBjNTlkMGU3Li45ZDQwZmQ3IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAKQEAgLTI2LDkgKzI2LDEwIEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaD4KIAotdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YWNhbTsKIAogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0gewogLy8gU3RhdGljIG1lbWJlciBkZWZpbml0aW9ucwogY29uc3QgY2hhciogQ2FtZXJhTWFuYWdlckdsb2JhbDo6a0NhbWVyYUlkS2V5ICAgPSAiQ2FtZXJhSWQiOwogY29uc3QgY2hhciogQ2FtZXJhTWFuYWdlckdsb2JhbDo6a0NhbGxiYWNrRnBLZXkgPSAiQ2FsbGJhY2tGcCI7CkBAIC0xOTIsNiArMTkzLDIwIEBACiAgICAgfQogfQogCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6OnJlZ2lzdGVyRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFjaygKKyAgICAgICAgY29uc3QgQUNhbWVyYU1hbmFnZXJfRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFja3MgKmNhbGxiYWNrKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBDYWxsYmFjayBjYihjYWxsYmFjayk7CisgICAgbUNhbGxiYWNrcy5pbnNlcnQoY2IpOworfQorCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6OnVucmVnaXN0ZXJFeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrKAorICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9FeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrcyAqY2FsbGJhY2spIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIENhbGxiYWNrIGNiKGNhbGxiYWNrKTsKKyAgICBtQ2FsbGJhY2tzLmVyYXNlKGNiKTsKK30KKwogdm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpyZWdpc3RlckF2YWlsYWJpbGl0eUNhbGxiYWNrKAogICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3MgKmNhbGxiYWNrKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTI4OCwxMiArMzAzLDQwIEBACiAgICAgICAgICAgICAoKmNiKShjb250ZXh0LCBjYW1lcmFJZC5jX3N0cigpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRTZW5kU2luZ2xlQWNjZXNzQ2FsbGJhY2s6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFDYW1lcmFNYW5hZ2VyX0FjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkQ2FsbGJhY2sgY2I7CisgICAgICAgICAgICB2b2lkKiBjb250ZXh0OworICAgICAgICAgICAgQVN0cmluZyBjYW1lcmFJZDsKKyAgICAgICAgICAgIGJvb2wgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmY2IpOworICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FtZXJhIGNhbGxiYWNrIGZwISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDb250ZXh0S2V5LCAmY29udGV4dCk7CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYWxsYmFjayBjb250ZXh0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKCpjYikoY29udGV4dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR0UoIiVzOiB1bmtub3duIG1lc3NhZ2UgdHlwZSAlZCIsIF9fRlVOQ1RJT05fXywgbXNnLT53aGF0KCkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogfQogCitiaW5kZXI6OlN0YXR1cyBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6Om9uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWQoKSB7CisgICAgc3A8Q2FtZXJhTWFuYWdlckdsb2JhbD4gY20gPSBtQ2FtZXJhTWFuYWdlci5wcm9tb3RlKCk7CisgICAgaWYgKGNtICE9IG51bGxwdHIpIHsKKyAgICAgICAgY20tPm9uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWQoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGRlbGl2ZXIgY2FtZXJhIGFjY2VzcyBwcmlvcml0eSBjYWxsYmFjay4gR2xvYmFsIGNhbWVyYSBtYW5hZ2VyIGRpZWQiKTsKKyAgICB9CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCiBiaW5kZXI6OlN0YXR1cyBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6Om9uU3RhdHVzQ2hhbmdlZCgKICAgICAgICAgaW50MzJfdCBzdGF0dXMsIGNvbnN0IFN0cmluZzE2JiBjYW1lcmFJZCkgewogICAgIHNwPENhbWVyYU1hbmFnZXJHbG9iYWw+IGNtID0gbUNhbWVyYU1hbmFnZXIucHJvbW90ZSgpOwpAQCAtMzA1LDYgKzM0OCwxOSBAQAogICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKIH0KIAordm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpvbkNhbWVyYUFjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgZm9yIChhdXRvIGNiIDogbUNhbGxiYWNrcykgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VuZFNpbmdsZUFjY2Vzc0NhbGxiYWNrLCBtSGFuZGxlcik7CisgICAgICAgIEFDYW1lcmFNYW5hZ2VyX0FjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkQ2FsbGJhY2sgY2JGcCA9IGNiLm1BY2Nlc3NQcmlvcml0eUNoYW5nZWQ7CisgICAgICAgIGlmIChjYkZwICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQgKikgY2JGcCk7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiLm1Db250ZXh0KTsKKyAgICAgICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICB9CisgICAgfQorfQorCiB2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6Om9uU3RhdHVzQ2hhbmdlZCgKICAgICAgICAgaW50MzJfdCBzdGF0dXMsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTM0NSw2ICs0MDEsNyBAQAogICAgIH0KIH0KIAorfSAvLyBuYW1lc3BhY2UgYWNhbQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAvKioKQEAgLTQwMiw3ICs0NTksNyBAQAogfQogCiBjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYU1hbmFnZXI6OmdldENhbWVyYUNoYXJhY3RlcmlzdGljcygKLSAgICAgICAgY29uc3QgY2hhciAqY2FtZXJhSWRTdHIsIEFDYW1lcmFNZXRhZGF0YSAqKmNoYXJhY3RlcmlzdGljcykgeworICAgICAgICBjb25zdCBjaGFyKiBjYW1lcmFJZFN0ciwgc3A8QUNhbWVyYU1ldGFkYXRhPiogY2hhcmFjdGVyaXN0aWNzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAogICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZT4gY3MgPSBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRJbnN0YW5jZSgpLmdldENhbWVyYVNlcnZpY2UoKTsKQEAgLTQzNywxOCArNDk0LDE2IEBACiAgICAgICAgIGNvbnN0IGNoYXIqIGNhbWVyYUlkLAogICAgICAgICBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzKiBjYWxsYmFjaywKICAgICAgICAgLypvdXQqL0FDYW1lcmFEZXZpY2UqKiBvdXREZXZpY2UpIHsKLSAgICBBQ2FtZXJhTWV0YWRhdGEqIHJhd0NoYXJzOwotICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY2FtZXJhSWQsICZyYXdDaGFycyk7CisgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBjaGFyczsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNhbWVyYUlkLCAmY2hhcnMpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CiAgICAgICAgIEFMT0dFKCIlczogY2Fubm90IGdldCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGZvciBjYW1lcmEgJXMuIGVyciAlZCIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCwgcmV0KTsKICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgfQotICAgIHN0ZDo6dW5pcXVlX3B0cjxBQ2FtZXJhTWV0YWRhdGE+IGNoYXJzKHJhd0NoYXJzKTsKLSAgICByYXdDaGFycyA9IG51bGxwdHI7CiAKLSAgICBBQ2FtZXJhRGV2aWNlKiBkZXZpY2UgPSBuZXcgQUNhbWVyYURldmljZShjYW1lcmFJZCwgY2FsbGJhY2ssIHN0ZDo6bW92ZShjaGFycykpOworICAgIEFDYW1lcmFEZXZpY2UqIGRldmljZSA9IG5ldyBBQ2FtZXJhRGV2aWNlKGNhbWVyYUlkLCBjYWxsYmFjaywgY2hhcnMpOwogCiAgICAgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlPiBjcyA9IENhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkuZ2V0Q2FtZXJhU2VydmljZSgpOwogICAgIGlmIChjcyA9PSBudWxscHRyKSB7CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuaCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCmluZGV4IGNjNDJmNzcuLjhjMWRhMzYgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5oCkBAIC0zNSw2ICszNSw3IEBACiAjaW5jbHVkZSA8bWFwPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CiAKIC8qKgogICogUGVyLXByb2Nlc3Mgc2luZ2xldG9uIGluc3RhbmNlIG9mIENhbWVyYU1hbmdlci4gU2hhcmVkIGJ5IGFsbCBBQ2FtZXJhTWFuYWdlcgpAQCAtNTMsNiArNTQsMTEgQEAKICAgICB2b2lkIHVucmVnaXN0ZXJBdmFpbGFiaWxpdHlDYWxsYmFjaygKICAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrcyAqY2FsbGJhY2spOwogCisgICAgdm9pZCByZWdpc3RlckV4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9FeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrcyogY2FsbGJhY2spOworICAgIHZvaWQgdW5yZWdpc3RlckV4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9FeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrcyogY2FsbGJhY2spOworCiAgICAgLyoqCiAgICAgICogUmV0dXJuIGNhbWVyYSBJRHMgdGhhdCBzdXBwb3J0IGNhbWVyYTIKICAgICAgKi8KQEAgLTg1LDYgKzkxLDggQEAKICAgICAgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKICAgICAgICAgfQogCisgICAgICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25DYW1lcmFBY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZCgpOworCiAgICAgICBwcml2YXRlOgogICAgICAgICBjb25zdCB3cDxDYW1lcmFNYW5hZ2VyR2xvYmFsPiBtQ2FtZXJhTWFuYWdlcjsKICAgICB9OwpAQCAtOTUsMTEgKzEwMywxOSBAQAogICAgICAgICBleHBsaWNpdCBDYWxsYmFjayhjb25zdCBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3MgKmNhbGxiYWNrKSA6CiAgICAgICAgICAgICBtQXZhaWxhYmxlKGNhbGxiYWNrLT5vbkNhbWVyYUF2YWlsYWJsZSksCiAgICAgICAgICAgICBtVW5hdmFpbGFibGUoY2FsbGJhY2stPm9uQ2FtZXJhVW5hdmFpbGFibGUpLAorICAgICAgICAgICAgbUFjY2Vzc1ByaW9yaXR5Q2hhbmdlZChudWxscHRyKSwKICAgICAgICAgICAgIG1Db250ZXh0KGNhbGxiYWNrLT5jb250ZXh0KSB7fQogCisgICAgICAgIGV4cGxpY2l0IENhbGxiYWNrKGNvbnN0IEFDYW1lcmFNYW5hZ2VyX0V4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2tzICpjYWxsYmFjaykgOgorICAgICAgICAgICAgbUF2YWlsYWJsZShjYWxsYmFjay0+YXZhaWxhYmlsaXR5Q2FsbGJhY2tzLm9uQ2FtZXJhQXZhaWxhYmxlKSwKKyAgICAgICAgICAgIG1VbmF2YWlsYWJsZShjYWxsYmFjay0+YXZhaWxhYmlsaXR5Q2FsbGJhY2tzLm9uQ2FtZXJhVW5hdmFpbGFibGUpLAorICAgICAgICAgICAgbUFjY2Vzc1ByaW9yaXR5Q2hhbmdlZChjYWxsYmFjay0+b25DYW1lcmFBY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZCksCisgICAgICAgICAgICBtQ29udGV4dChjYWxsYmFjay0+YXZhaWxhYmlsaXR5Q2FsbGJhY2tzLmNvbnRleHQpIHt9CisKICAgICAgICAgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQ2FsbGJhY2smIG90aGVyKSBjb25zdCB7CiAgICAgICAgICAgICByZXR1cm4gKG1BdmFpbGFibGUgPT0gb3RoZXIubUF2YWlsYWJsZSAmJgogICAgICAgICAgICAgICAgICAgICBtVW5hdmFpbGFibGUgPT0gb3RoZXIubVVuYXZhaWxhYmxlICYmCisgICAgICAgICAgICAgICAgICAgIG1BY2Nlc3NQcmlvcml0eUNoYW5nZWQgPT0gb3RoZXIubUFjY2Vzc1ByaW9yaXR5Q2hhbmdlZCAmJgogICAgICAgICAgICAgICAgICAgICBtQ29udGV4dCA9PSBvdGhlci5tQ29udGV4dCk7CiAgICAgICAgIH0KICAgICAgICAgYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgQ2FsbGJhY2smIG90aGVyKSBjb25zdCB7CkBAIC0xMDgsNiArMTI0LDkgQEAKICAgICAgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBDYWxsYmFjayYgb3RoZXIpIGNvbnN0IHsKICAgICAgICAgICAgIGlmICgqdGhpcyA9PSBvdGhlcikgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgaWYgKG1Db250ZXh0ICE9IG90aGVyLm1Db250ZXh0KSByZXR1cm4gbUNvbnRleHQgPCBvdGhlci5tQ29udGV4dDsKKyAgICAgICAgICAgIGlmIChtQWNjZXNzUHJpb3JpdHlDaGFuZ2VkICE9IG90aGVyLm1BY2Nlc3NQcmlvcml0eUNoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUFjY2Vzc1ByaW9yaXR5Q2hhbmdlZCA8IG90aGVyLm1BY2Nlc3NQcmlvcml0eUNoYW5nZWQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobUF2YWlsYWJsZSAhPSBvdGhlci5tQXZhaWxhYmxlKSByZXR1cm4gbUF2YWlsYWJsZSA8IG90aGVyLm1BdmFpbGFibGU7CiAgICAgICAgICAgICByZXR1cm4gbVVuYXZhaWxhYmxlIDwgb3RoZXIubVVuYXZhaWxhYmxlOwogICAgICAgICB9CkBAIC0xMTYsMTMgKzEzNSwxNSBAQAogICAgICAgICB9CiAgICAgICAgIEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrIG1BdmFpbGFibGU7CiAgICAgICAgIEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrIG1VbmF2YWlsYWJsZTsKKyAgICAgICAgQUNhbWVyYU1hbmFnZXJfQWNjZXNzUHJpb3JpdGllc0NoYW5nZWRDYWxsYmFjayBtQWNjZXNzUHJpb3JpdHlDaGFuZ2VkOwogICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dDsKICAgICB9OwogICAgIHN0ZDo6c2V0PENhbGxiYWNrPiBtQ2FsbGJhY2tzOwogCiAgICAgLy8gZGVmaW5pdGlvbiBvZiBoYW5kbGVyIGFuZCBtZXNzYWdlCiAgICAgZW51bSB7Ci0gICAgICAgIGtXaGF0U2VuZFNpbmdsZUNhbGxiYWNrCisgICAgICAgIGtXaGF0U2VuZFNpbmdsZUNhbGxiYWNrLAorICAgICAgICBrV2hhdFNlbmRTaW5nbGVBY2Nlc3NDYWxsYmFjaywKICAgICB9OwogICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ2FtZXJhSWRLZXk7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYWxsYmFja0ZwS2V5OwpAQCAtMTM1LDYgKzE1Niw3IEBACiAgICAgc3A8Q2FsbGJhY2tIYW5kbGVyPiBtSGFuZGxlcjsKICAgICBzcDxBTG9vcGVyPiAgICAgICAgIG1DYkxvb3BlcjsgLy8gTG9vcGVyIHRocmVhZCB3aGVyZSBjYWxsYmFja3MgYWN0dWFsbHkgaGFwcGVuIG9uCiAKKyAgICB2b2lkIG9uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWQoKTsKICAgICB2b2lkIG9uU3RhdHVzQ2hhbmdlZChpbnQzMl90IHN0YXR1cywgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpOwogICAgIHZvaWQgb25TdGF0dXNDaGFuZ2VkTG9ja2VkKGludDMyX3Qgc3RhdHVzLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCk7CiAgICAgLy8gVXRpbHMgZm9yIHN0YXR1cwpAQCAtMTcyLDYgKzE5NCw3IEBACiAgICAgfkNhbWVyYU1hbmFnZXJHbG9iYWwoKTsKIH07CiAKK30gLy8gbmFtZXNwYWNlIGFjYW07CiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkOwogCiAvKioKQEAgLTE4MCwxMyArMjAzLDEzIEBACiAgKi8KIHN0cnVjdCBBQ2FtZXJhTWFuYWdlciB7CiAgICAgQUNhbWVyYU1hbmFnZXIoKSA6Ci0gICAgICAgICAgICBtR2xvYmFsTWFuYWdlcigmKGFuZHJvaWQ6OkNhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkpKSB7fQorICAgICAgICAgICAgbUdsb2JhbE1hbmFnZXIoJihhbmRyb2lkOjphY2FtOjpDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRJbnN0YW5jZSgpKSkge30KICAgICB+QUNhbWVyYU1hbmFnZXIoKTsKICAgICBjYW1lcmFfc3RhdHVzX3QgZ2V0Q2FtZXJhSWRMaXN0KEFDYW1lcmFJZExpc3QqKiBjYW1lcmFJZExpc3QpOwogICAgIHN0YXRpYyB2b2lkICAgICBkZWxldGVDYW1lcmFJZExpc3QoQUNhbWVyYUlkTGlzdCogY2FtZXJhSWRMaXN0KTsKIAogICAgIGNhbWVyYV9zdGF0dXNfdCBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpjYW1lcmFJZCwgQUNhbWVyYU1ldGFkYXRhICoqY2hhcmFjdGVyaXN0aWNzKTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNhbWVyYUlkLCBhbmRyb2lkOjpzcDxBQ2FtZXJhTWV0YWRhdGE+KiBjaGFyYWN0ZXJpc3RpY3MpOwogICAgIGNhbWVyYV9zdGF0dXNfdCBvcGVuQ2FtZXJhKGNvbnN0IGNoYXIqIGNhbWVyYUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki9BQ2FtZXJhRGV2aWNlKiogZGV2aWNlKTsKQEAgLTE5Niw3ICsyMTksNyBAQAogICAgICAgICBrQ2FtZXJhSWRMaXN0Tm90SW5pdCA9IC0xCiAgICAgfTsKICAgICBhbmRyb2lkOjpNdXRleCAgICAgICAgIG1Mb2NrOwotICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkNhbWVyYU1hbmFnZXJHbG9iYWw+IG1HbG9iYWxNYW5hZ2VyOworICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OmFjYW06OkNhbWVyYU1hbmFnZXJHbG9iYWw+IG1HbG9iYWxNYW5hZ2VyOwogfTsKIAogI2VuZGlmIC8vX0FDQU1FUkFfTUFOQUdFUl9ICmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1ldGFkYXRhLmNwcCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWV0YWRhdGEuY3BwCmluZGV4IGZjMDBhMmQuLjc3ZGNkNDggMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWV0YWRhdGEuY3BwCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWV0YWRhdGEuY3BwCkBAIC0zMiw2ICszMiwxNCBAQAogICAgIGlmIChtVHlwZSA9PSBBQ01fQ0hBUkFDVEVSSVNUSUNTKSB7CiAgICAgICAgIGZpbHRlclVuc3VwcG9ydGVkRmVhdHVyZXMoKTsKICAgICAgICAgZmlsdGVyU3RyZWFtQ29uZmlndXJhdGlvbnMoKTsKKyAgICAgICAgZmlsdGVyRHVyYXRpb25zKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9NSU5fRlJBTUVfRFVSQVRJT05TKTsKKyAgICAgICAgZmlsdGVyRHVyYXRpb25zKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVEFMTF9EVVJBVElPTlMpOworICAgICAgICBmaWx0ZXJEdXJhdGlvbnMoQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OUyk7CisgICAgICAgIGZpbHRlckR1cmF0aW9ucyhBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVEFMTF9EVVJBVElPTlMpOworICAgICAgICBmaWx0ZXJEdXJhdGlvbnMoQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX01JTl9GUkFNRV9EVVJBVElPTlMpOworICAgICAgICBmaWx0ZXJEdXJhdGlvbnMoQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUQUxMX0RVUkFUSU9OUyk7CisgICAgICAgIGZpbHRlckR1cmF0aW9ucyhBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX01JTl9GUkFNRV9EVVJBVElPTlMpOworICAgICAgICBmaWx0ZXJEdXJhdGlvbnMoQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVEFMTF9EVVJBVElPTlMpOwogICAgIH0KICAgICAvLyBUT0RPOiBmaWx0ZXIgcmVxdWVzdC9yZXN1bHQga2V5cwogfQpAQCAtMzksMjMgKzQ3LDE0IEBACiBib29sCiBBQ2FtZXJhTWV0YWRhdGE6OmlzTmRrU3VwcG9ydGVkQ2FwYWJpbGl0eShpbnQzMl90IGNhcGFiaWxpdHkpIHsKICAgICBzd2l0Y2ggKGNhcGFiaWxpdHkpIHsKLSAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19CQUNLV0FSRF9DT01QQVRJQkxFOgotICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX01BTlVBTF9TRU5TT1I6Ci0gICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTUFOVUFMX1BPU1RfUFJPQ0VTU0lORzoKLSAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19SQVc6Ci0gICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfUkVBRF9TRU5TT1JfU0VUVElOR1M6Ci0gICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfQlVSU1RfQ0FQVFVSRToKLSAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19ERVBUSF9PVVRQVVQ6Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19ZVVZfUkVQUk9DRVNTSU5HOgogICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1BSSVZBVEVfUkVQUk9DRVNTSU5HOgogICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX0NPTlNUUkFJTkVEX0hJR0hfU1BFRURfVklERU86CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBOZXdseSBkZWZpbmVkIGNhcGFiaWxpdGllcyB3aWxsIGJlIHVuc3VwcG9ydGVkIGJ5IGRlZmF1bHQgKGJsYWNrbGlzdCkKLSAgICAgICAgICAgIC8vIFRPRE86IFNob3VsZCB3ZSBkbyB3aGl0ZWxpc3Qgb3IgYmxhY2tsaXN0IGhlcmU/Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFVua25vbnduIGNhcGFiaWxpdHkgJWQiLCBfX0ZVTkNUSU9OX18sIGNhcGFiaWxpdHkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgLy8gQXNzdW1pbmcgZXZlcnkgY2FwYWJpbGl0eSBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiBpcyBhY3R1YWxseSBhCisgICAgICAgICAgICAvLyB2YWxpZCBjYXBhYmlsaXR5LgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogfQogCkBAIC03NSwxMSArNzQsMTI4IEBACiAgICAgICAgIHVpbnQ4X3QgY2FwYWJpbGl0eSA9IGVudHJ5LmRhdGEudThbaV07CiAgICAgICAgIGlmIChpc05ka1N1cHBvcnRlZENhcGFiaWxpdHkoY2FwYWJpbGl0eSkpIHsKICAgICAgICAgICAgIGNhcGFiaWxpdGllcy5wdXNoKGNhcGFiaWxpdHkpOworCisgICAgICAgICAgICBpZiAoY2FwYWJpbGl0eSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19MT0dJQ0FMX01VTFRJX0NBTUVSQSkgeworICAgICAgICAgICAgICAgIGRlcml2ZVBoeXNpY2FsQ2FtZXJhSWRzKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgbURhdGEudXBkYXRlKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTLCBjYXBhYmlsaXRpZXMpOwogfQogCit2b2lkCitBQ2FtZXJhTWV0YWRhdGE6OmRlcml2ZVBoeXNpY2FsQ2FtZXJhSWRzKCkgeworICAgIEFDYW1lcmFNZXRhZGF0YV9jb25zdF9lbnRyeSBlbnRyeTsKKyAgICBhdXRvIHJldCA9IGdldENvbnN0RW50cnkoQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9QSFlTSUNBTF9JRFMsICZlbnRyeSk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCIlczogR2V0IEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfUEhZU0lDQUxfSURTIGtleSBmYWlsZWQuIHJldCAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgdWludDhfdCogaWRzID0gZW50cnkuZGF0YS51ODsKKyAgICBzaXplX3Qgc3RhcnQgPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7ICsraSkgeworICAgICAgICBpZiAoaWRzW2ldID09ICdcMCcpIHsKKyAgICAgICAgICAgIGlmIChzdGFydCAhPSBpKSB7CisgICAgICAgICAgICAgICAgbVN0YXRpY1BoeXNpY2FsQ2FtZXJhSWRWYWx1ZXMucHVzaF9iYWNrKFN0cmluZzgoKGNvbnN0IGNoYXIgKilpZHMrc3RhcnQpKTsKKyAgICAgICAgICAgICAgICBtU3RhdGljUGh5c2ljYWxDYW1lcmFJZHMucHVzaF9iYWNrKG1TdGF0aWNQaHlzaWNhbENhbWVyYUlkVmFsdWVzLmJhY2soKS5zdHJpbmcoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGFydCA9IGkrMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtU3RhdGljUGh5c2ljYWxDYW1lcmFJZHMuc2l6ZSgpIDwgMikgeworICAgICAgICBBTE9HVygiJXM6IExvZ2ljYWwgbXVsdGktY2FtZXJhIGRldmljZSBvbmx5IGhhcyAlenUgcGh5c2ljYWwgY2FtZXJhcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtU3RhdGljUGh5c2ljYWxDYW1lcmFJZHMuc2l6ZSgpKTsKKyAgICB9Cit9CisKK3ZvaWQKK0FDYW1lcmFNZXRhZGF0YTo6ZmlsdGVyRHVyYXRpb25zKHVpbnQzMl90IHRhZykgeworICAgIGNvbnN0IGludCBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFID0gNDsKKyAgICBjb25zdCBpbnQgU1RSRUFNX0ZPUk1BVF9PRkZTRVQgPSAwOworICAgIGNvbnN0IGludCBTVFJFQU1fV0lEVEhfT0ZGU0VUID0gMTsKKyAgICBjb25zdCBpbnQgU1RSRUFNX0hFSUdIVF9PRkZTRVQgPSAyOworICAgIGNvbnN0IGludCBTVFJFQU1fRFVSQVRJT05fT0ZGU0VUID0gMzsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgZW50cnkgPSBtRGF0YS5maW5kKHRhZyk7CisgICAgaWYgKGVudHJ5LmNvdW50ID09IDAgfHwgZW50cnkuY291bnQgJSA0IHx8IGVudHJ5LnR5cGUgIT0gVFlQRV9JTlQ2NCkgeworICAgICAgICBBTE9HRSgiJXM6IG1hbGZvcm1lZCBkdXJhdGlvbiBrZXkgJWQhIGNvdW50ICV6dSwgdHlwZSAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB0YWcsIGVudHJ5LmNvdW50LCBlbnRyeS50eXBlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBWZWN0b3I8aW50NjRfdD4gZmlsdGVyZWREdXJhdGlvbnM7CisgICAgZmlsdGVyZWREdXJhdGlvbnMuc2V0Q2FwYWNpdHkoZW50cnkuY291bnQgKiAyKTsKKworICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGVudHJ5LmNvdW50OyBpICs9IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUpIHsKKyAgICAgICAgaW50NjRfdCBmb3JtYXQgPSBlbnRyeS5kYXRhLmk2NFtpICsgU1RSRUFNX0ZPUk1BVF9PRkZTRVRdOworICAgICAgICBpbnQ2NF90IHdpZHRoID0gZW50cnkuZGF0YS5pNjRbaSArIFNUUkVBTV9XSURUSF9PRkZTRVRdOworICAgICAgICBpbnQ2NF90IGhlaWdodCA9IGVudHJ5LmRhdGEuaTY0W2kgKyBTVFJFQU1fSEVJR0hUX09GRlNFVF07CisgICAgICAgIGludDY0X3QgZHVyYXRpb24gPSBlbnRyeS5kYXRhLmkzMltpICsgU1RSRUFNX0RVUkFUSU9OX09GRlNFVF07CisKKyAgICAgICAgLy8gTGVhdmUgdGhlIHVuZmlsdGVyZWQgZm9ybWF0IGluIHNvIGFwcHMgZGVwZW5kaW5nIG9uIHByZXZpb3VzIHdyb25nCisgICAgICAgIC8vIGZpbHRlciBiZWhhdmlvciBjb250aW51ZSB0byB3b3JrCisgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhmb3JtYXQpOworICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2sod2lkdGgpOworICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soaGVpZ2h0KTsKKyAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKGR1cmF0aW9uKTsKKworICAgICAgICAvLyBUcmFuc2xhdGUgSEFMIGZvcm1hdHMgdG8gTkRLIGZvcm1hdAorICAgICAgICBzd2l0Y2ggKHRhZykgeworICAgICAgICAgICAgY2FzZSBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfTUlOX0ZSQU1FX0RVUkFUSU9OUzoKKyAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OUzoKKyAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBBSU1BR0VfRk9STUFUX0pQRUc7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhmb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2sod2lkdGgpOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKGR1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX01JTl9GUkFNRV9EVVJBVElPTlM6CisgICAgICAgICAgICBjYXNlIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUQUxMX0RVUkFUSU9OUzoKKyAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBBSU1BR0VfRk9STUFUX0RFUFRIX1BPSU5UX0NMT1VEOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhkdXJhdGlvbik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9ZMTYpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQUlNQUdFX0ZPUk1BVF9ERVBUSDE2OworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhkdXJhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfTUlOX0ZSQU1FX0RVUkFUSU9OUzoKKyAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUQUxMX0RVUkFUSU9OUzoKKyAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBBSU1BR0VfRk9STUFUX0hFSUM7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhmb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2sod2lkdGgpOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKGR1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OUzoKKyAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVEFMTF9EVVJBVElPTlM6CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQUlNQUdFX0ZPUk1BVF9ERVBUSF9KUEVHOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhkdXJhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAvLyBTaG91bGQgbm90IHJlYWNoIGhlcmUKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVua293biB0YWcgMHgleCIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1EYXRhLnVwZGF0ZSh0YWcsIGZpbHRlcmVkRHVyYXRpb25zKTsKK30KIAogdm9pZAogQUNhbWVyYU1ldGFkYXRhOjpmaWx0ZXJTdHJlYW1Db25maWd1cmF0aW9ucygpIHsKQEAgLTg5LDcgKzIwNSw3IEBACiAgICAgY29uc3QgaW50IFNUUkVBTV9IRUlHSFRfT0ZGU0VUID0gMjsKICAgICBjb25zdCBpbnQgU1RSRUFNX0lTX0lOUFVUX09GRlNFVCA9IDM7CiAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGVudHJ5ID0gbURhdGEuZmluZChBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKLSAgICBpZiAoZW50cnkuY291bnQgPT0gMCB8fCBlbnRyeS5jb3VudCAlIDQgfHwgZW50cnkudHlwZSAhPSBUWVBFX0lOVDMyKSB7CisgICAgaWYgKGVudHJ5LmNvdW50ID4gMCAmJiAoZW50cnkuY291bnQgJSA0IHx8IGVudHJ5LnR5cGUgIT0gVFlQRV9JTlQzMikpIHsKICAgICAgICAgQUxPR0UoIiVzOiBtYWxmb3JtZWQgYXZhaWxhYmxlIHN0cmVhbSBjb25maWd1cmF0aW9uIGtleSEgY291bnQgJXp1LCB0eXBlICVkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGVudHJ5LmNvdW50LCBlbnRyeS50eXBlKTsKICAgICAgICAgcmV0dXJuOwpAQCAtMTE3LDkgKzIzMywxNyBAQAogICAgICAgICBmaWx0ZXJlZFN0cmVhbUNvbmZpZ3MucHVzaF9iYWNrKGlzSW5wdXQpOwogICAgIH0KIAotICAgIG1EYXRhLnVwZGF0ZShBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TLCBmaWx0ZXJlZFN0cmVhbUNvbmZpZ3MpOworICAgIGlmIChmaWx0ZXJlZFN0cmVhbUNvbmZpZ3Muc2l6ZSgpID4gMCkgeworICAgICAgICBtRGF0YS51cGRhdGUoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUywgZmlsdGVyZWRTdHJlYW1Db25maWdzKTsKKyAgICB9CiAKICAgICBlbnRyeSA9IG1EYXRhLmZpbmQoQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKKyAgICBpZiAoZW50cnkuY291bnQgPiAwICYmIChlbnRyeS5jb3VudCAlIDQgfHwgZW50cnkudHlwZSAhPSBUWVBFX0lOVDMyKSkgeworICAgICAgICBBTE9HRSgiJXM6IG1hbGZvcm1lZCBhdmFpbGFibGUgZGVwdGggc3RyZWFtIGNvbmZpZ3VyYXRpb24ga2V5ISBjb3VudCAlenUsIHR5cGUgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZW50cnkuY291bnQsIGVudHJ5LnR5cGUpOworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgVmVjdG9yPGludDMyX3Q+IGZpbHRlcmVkRGVwdGhTdHJlYW1Db25maWdzOwogICAgIGZpbHRlcmVkRGVwdGhTdHJlYW1Db25maWdzLnNldENhcGFjaXR5KGVudHJ5LmNvdW50KTsKIApAQCAtMTQ0LDcgKzI2OCw2MiBAQAogICAgICAgICBmaWx0ZXJlZERlcHRoU3RyZWFtQ29uZmlncy5wdXNoX2JhY2soaGVpZ2h0KTsKICAgICAgICAgZmlsdGVyZWREZXB0aFN0cmVhbUNvbmZpZ3MucHVzaF9iYWNrKGlzSW5wdXQpOwogICAgIH0KLSAgICBtRGF0YS51cGRhdGUoQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TLCBmaWx0ZXJlZERlcHRoU3RyZWFtQ29uZmlncyk7CisKKyAgICBpZiAoZmlsdGVyZWREZXB0aFN0cmVhbUNvbmZpZ3Muc2l6ZSgpID4gMCkgeworICAgICAgICBtRGF0YS51cGRhdGUoQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TLAorICAgICAgICAgICAgICAgIGZpbHRlcmVkRGVwdGhTdHJlYW1Db25maWdzKTsKKyAgICB9CisKKyAgICBlbnRyeSA9IG1EYXRhLmZpbmQoQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUUkVBTV9DT05GSUdVUkFUSU9OUyk7CisgICAgVmVjdG9yPGludDMyX3Q+IGZpbHRlcmVkSGVpY1N0cmVhbUNvbmZpZ3M7CisgICAgZmlsdGVyZWRIZWljU3RyZWFtQ29uZmlncy5zZXRDYXBhY2l0eShlbnRyeS5jb3VudCk7CisKKyAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBlbnRyeS5jb3VudDsgaSArPSBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFKSB7CisgICAgICAgIGludDMyX3QgZm9ybWF0ID0gZW50cnkuZGF0YS5pMzJbaSArIFNUUkVBTV9GT1JNQVRfT0ZGU0VUXTsKKyAgICAgICAgaW50MzJfdCB3aWR0aCA9IGVudHJ5LmRhdGEuaTMyW2kgKyBTVFJFQU1fV0lEVEhfT0ZGU0VUXTsKKyAgICAgICAgaW50MzJfdCBoZWlnaHQgPSBlbnRyeS5kYXRhLmkzMltpICsgU1RSRUFNX0hFSUdIVF9PRkZTRVRdOworICAgICAgICBpbnQzMl90IGlzSW5wdXQgPSBlbnRyeS5kYXRhLmkzMltpICsgU1RSRUFNX0lTX0lOUFVUX09GRlNFVF07CisgICAgICAgIGlmIChpc0lucHV0ID09IEFDQU1FUkFfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVFJFQU1fQ09ORklHVVJBVElPTlNfSU5QVVQpIHsKKyAgICAgICAgICAgIC8vIEhpZGUgaW5wdXQgc3RyZWFtcworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gVHJhbnNsYXRlIEhBTCBmb3JtYXRzIHRvIE5ESyBmb3JtYXQKKyAgICAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpIHsKKyAgICAgICAgICAgIGZvcm1hdCA9IEFJTUFHRV9GT1JNQVRfSEVJQzsKKyAgICAgICAgfQorCisgICAgICAgIGZpbHRlcmVkSGVpY1N0cmVhbUNvbmZpZ3MucHVzaF9iYWNrKGZvcm1hdCk7CisgICAgICAgIGZpbHRlcmVkSGVpY1N0cmVhbUNvbmZpZ3MucHVzaF9iYWNrKHdpZHRoKTsKKyAgICAgICAgZmlsdGVyZWRIZWljU3RyZWFtQ29uZmlncy5wdXNoX2JhY2soaGVpZ2h0KTsKKyAgICAgICAgZmlsdGVyZWRIZWljU3RyZWFtQ29uZmlncy5wdXNoX2JhY2soaXNJbnB1dCk7CisgICAgfQorICAgIG1EYXRhLnVwZGF0ZShBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TLCBmaWx0ZXJlZEhlaWNTdHJlYW1Db25maWdzKTsKKworICAgIGVudHJ5ID0gbURhdGEuZmluZChBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUyk7CisgICAgVmVjdG9yPGludDMyX3Q+IGZpbHRlcmVkRHluYW1pY0RlcHRoU3RyZWFtQ29uZmlnczsKKyAgICBmaWx0ZXJlZER5bmFtaWNEZXB0aFN0cmVhbUNvbmZpZ3Muc2V0Q2FwYWNpdHkoZW50cnkuY291bnQpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgaSArPSBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFKSB7CisgICAgICAgIGludDMyX3QgZm9ybWF0ID0gZW50cnkuZGF0YS5pMzJbaSArIFNUUkVBTV9GT1JNQVRfT0ZGU0VUXTsKKyAgICAgICAgaW50MzJfdCB3aWR0aCA9IGVudHJ5LmRhdGEuaTMyW2kgKyBTVFJFQU1fV0lEVEhfT0ZGU0VUXTsKKyAgICAgICAgaW50MzJfdCBoZWlnaHQgPSBlbnRyeS5kYXRhLmkzMltpICsgU1RSRUFNX0hFSUdIVF9PRkZTRVRdOworICAgICAgICBpbnQzMl90IGlzSW5wdXQgPSBlbnRyeS5kYXRhLmkzMltpICsgU1RSRUFNX0lTX0lOUFVUX09GRlNFVF07CisgICAgICAgIGlmIChpc0lucHV0ID09IEFDQU1FUkFfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TX0lOUFVUKSB7CisgICAgICAgICAgICAvLyBIaWRlIGlucHV0IHN0cmVhbXMKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIFRyYW5zbGF0ZSBIQUwgZm9ybWF0cyB0byBOREsgZm9ybWF0CisgICAgICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSB7CisgICAgICAgICAgICBmb3JtYXQgPSBBSU1BR0VfRk9STUFUX0RFUFRIX0pQRUc7CisgICAgICAgIH0KKworICAgICAgICBmaWx0ZXJlZER5bmFtaWNEZXB0aFN0cmVhbUNvbmZpZ3MucHVzaF9iYWNrKGZvcm1hdCk7CisgICAgICAgIGZpbHRlcmVkRHluYW1pY0RlcHRoU3RyZWFtQ29uZmlncy5wdXNoX2JhY2sod2lkdGgpOworICAgICAgICBmaWx0ZXJlZER5bmFtaWNEZXB0aFN0cmVhbUNvbmZpZ3MucHVzaF9iYWNrKGhlaWdodCk7CisgICAgICAgIGZpbHRlcmVkRHluYW1pY0RlcHRoU3RyZWFtQ29uZmlncy5wdXNoX2JhY2soaXNJbnB1dCk7CisgICAgfQorICAgIG1EYXRhLnVwZGF0ZShBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUywKKyAgICAgICAgICAgIGZpbHRlcmVkRHluYW1pY0RlcHRoU3RyZWFtQ29uZmlncyk7CiB9CiAKIGJvb2wKQEAgLTIzOSw2ICs0MTgsMjcgQEAKICAgICByZXR1cm4gbURhdGE7CiB9CiAKK2Jvb2wKK0FDYW1lcmFNZXRhZGF0YTo6aXNMb2dpY2FsTXVsdGlDYW1lcmEoc2l6ZV90KiBjb3VudCwgY29uc3QgY2hhcipjb25zdCoqIHBoeXNpY2FsQ2FtZXJhSWRzKSBjb25zdCB7CisgICAgaWYgKG1UeXBlICE9IEFDTV9DSEFSQUNURVJJU1RJQ1MpIHsKKyAgICAgICAgQUxPR0UoIiVzIG11c3QgYmUgY2FsbGVkIGZvciBhIHN0YXRpYyBtZXRhZGF0YSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChjb3VudCA9PSBudWxscHRyIHx8IHBoeXNpY2FsQ2FtZXJhSWRzID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGlucHV0IGNvdW50OiAlcCwgcGh5c2ljYWxDYW1lcmFJZHM6ICVwIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGNvdW50LCBwaHlzaWNhbENhbWVyYUlkcyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobVN0YXRpY1BoeXNpY2FsQ2FtZXJhSWRzLnNpemUoKSA+PSAyKSB7CisgICAgICAgICpjb3VudCA9IG1TdGF0aWNQaHlzaWNhbENhbWVyYUlkcy5zaXplKCk7CisgICAgICAgICpwaHlzaWNhbENhbWVyYUlkcyA9IG1TdGF0aWNQaHlzaWNhbENhbWVyYUlkcy5kYXRhKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKwogLy8gVE9ETzogc29tZSBvZiBrZXkgYmVsb3cgc2hvdWxkIGJlIGhpZGRlbiBmcm9tIHVzZXIKIC8vIGV4OiBBQ0FNRVJBX1JFUVVFU1RfSUQgYW5kIEFDQU1FUkFfUkVQUk9DRVNTX0VGRkVDVElWRV9FWFBPU1VSRV9GQUNUT1IKIC8qQE9+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+CkBAIC0zNjAsNyArNTYwLDEwIEBACiAgICAgQU5EUk9JRF9TVEFUSVNUSUNTX0lORk9fTUFYX0hJU1RPR1JBTV9DT1VOVCwKICAgICBBTkRST0lEX1NUQVRJU1RJQ1NfSU5GT19NQVhfU0hBUlBORVNTX01BUF9WQUxVRSwKICAgICBBTkRST0lEX1NUQVRJU1RJQ1NfSU5GT19TSEFSUE5FU1NfTUFQX1NJWkUsCisgICAgQU5EUk9JRF9JTkZPX1NVUFBPUlRFRF9CVUZGRVJfTUFOQUdFTUVOVF9WRVJTSU9OLAogICAgIEFORFJPSURfREVQVEhfTUFYX0RFUFRIX1NBTVBMRVMsCisgICAgQU5EUk9JRF9IRUlDX0lORk9fU1VQUE9SVEVELAorICAgIEFORFJPSURfSEVJQ19JTkZPX01BWF9KUEVHX0FQUF9TRUdNRU5UU19DT1VOVCwKIH0pOwogCiAvKn5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1ldGFkYXRhLmggYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1ldGFkYXRhLmgKaW5kZXggMGZkN2VmYS4uOTdmN2Y0OCAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5oCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWV0YWRhdGEuaApAQCAtMTcsMTIgKzE3LDE5IEBACiAjZGVmaW5lIF9BQ0FNRVJBX01FVEFEQVRBX0gKIAogI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisKKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisjaW5jbHVkZSA8Q2FtZXJhTWV0YWRhdGEuaD4KK3VzaW5nIENhbWVyYU1ldGFkYXRhID0gYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpoZWxwZXI6OkNhbWVyYU1ldGFkYXRhOworI2Vsc2UKICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KKyNlbmRpZgogCiAjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhLmg+CiAKQEAgLTU4LDEzICs2NSwyMCBAQAogICAgIGNhbWVyYV9zdGF0dXNfdCBnZXRUYWdzKC8qb3V0Ki9pbnQzMl90KiBudW1UYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki9jb25zdCB1aW50MzJfdCoqIHRhZ3MpIGNvbnN0OwogCisgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGdldEludGVybmFsRGF0YSgpIGNvbnN0OworICAgIGJvb2wgaXNMb2dpY2FsTXVsdGlDYW1lcmEoc2l6ZV90KiBjb3VudCwgY29uc3QgY2hhciogY29uc3QqKiBwaHlzaWNhbENhbWVyYUlkcykgY29uc3Q7CisKKyAgcHJpdmF0ZToKKworICAgIC8vIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgY2hlY2sgd2hldGhlciB0aGUgY2FwYWJpbGl0eSBwYXNzZWQgdG8gaXQgaXMgdmFsaWQuCisgICAgLy8gVGhlIGNhbGxlciBtdXN0IG1ha2Ugc3VyZSB0aGF0IGl0IGlzLgogICAgIGJvb2wgaXNOZGtTdXBwb3J0ZWRDYXBhYmlsaXR5KGNvbnN0IGludDMyX3QgY2FwYWJpbGl0eSk7CiAgICAgc3RhdGljIGlubGluZSBib29sIGlzVmVuZG9yVGFnKGNvbnN0IHVpbnQzMl90IHRhZyk7CiAgICAgc3RhdGljIGJvb2wgaXNDYXB0dXJlUmVxdWVzdFRhZyhjb25zdCB1aW50MzJfdCB0YWcpOwogICAgIHZvaWQgZmlsdGVyVW5zdXBwb3J0ZWRGZWF0dXJlcygpOyAvLyBIaWRlIGZlYXR1cmVzIG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IE5ESwogICAgIHZvaWQgZmlsdGVyU3RyZWFtQ29uZmlndXJhdGlvbnMoKTsgLy8gSGlkZSBpbnB1dCBzdHJlYW1zLCB0cmFuc2xhdGUgaGFsIGZvcm1hdCB0byBOREsgZm9ybWF0cwotCi0gICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGdldEludGVybmFsRGF0YSgpIGNvbnN0OworICAgIHZvaWQgZmlsdGVyRHVyYXRpb25zKHVpbnQzMl90IHRhZyk7IC8vIHRyYW5zbGF0ZSBoYWwgZm9ybWF0IHRvIE5ESyBmb3JtYXRzCisgICAgdm9pZCBkZXJpdmVQaHlzaWNhbENhbWVyYUlkcygpOyAvLyBEZXJpdmUgYXJyYXkgb2YgcGh5c2ljYWwgaWRzLgogCiAgICAgdGVtcGxhdGU8dHlwZW5hbWUgSU5URVJOQUxfVCwgdHlwZW5hbWUgTkRLX1Q+CiAgICAgY2FtZXJhX3N0YXR1c190IHVwZGF0ZUltcGwodWludDMyX3QgdGFnLCB1aW50MzJfdCBjb3VudCwgY29uc3QgTkRLX1QqIGRhdGEpIHsKQEAgLTk2LDcgKzExMCw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgcHJpdmF0ZToKICAgICAvLyBndWFyZCBhY2Nlc3Mgb2YgcHVibGljIEFQSXM6IGdldC91cGRhdGUvZ2V0VGFncwogICAgIG11dGFibGUgTXV0ZXggICAgbUxvY2s7CiAgICAgQ2FtZXJhTWV0YWRhdGEgICBtRGF0YTsKQEAgLTEwNCw2ICsxMTcsOSBAQAogICAgIGNvbnN0IEFDQU1FUkFfTUVUQURBVEFfVFlQRSBtVHlwZTsKIAogICAgIHN0YXRpYyBzdGQ6OnVub3JkZXJlZF9zZXQ8dWludDMyX3Q+IHNTeXN0ZW1UYWdzOworCisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IG1TdGF0aWNQaHlzaWNhbENhbWVyYUlkczsKKyAgICBzdGQ6OnZlY3RvcjxTdHJpbmc4PiBtU3RhdGljUGh5c2ljYWxDYW1lcmFJZFZhbHVlczsKIH07CiAKICNlbmRpZiAvLyBfQUNBTUVSQV9NRVRBREFUQV9ICmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhcHR1cmVSZXF1ZXN0LmggYi9jYW1lcmEvbmRrL2ltcGwvQUNhcHR1cmVSZXF1ZXN0LmgKaW5kZXggMDZiMmNjMy4uMmZmY2FmZSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYXB0dXJlUmVxdWVzdC5oCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FwdHVyZVJlcXVlc3QuaApAQCAtMTgsMTEgKzE4LDE1IEBACiAKICNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FwdHVyZVJlcXVlc3QuaD4KICNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisjaW5jbHVkZSAibmRrX3ZlbmRvci9pbXBsL0FDYXB0dXJlUmVxdWVzdFZlbmRvci5oIgorI2Vsc2UKIHN0cnVjdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0IHsKLSAgICBleHBsaWNpdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0KEFOYXRpdmVXaW5kb3cqIHdpbmRvdykgOiBtV2luZG93KHdpbmRvdykge307CisgICAgZXhwbGljaXQgQUNhbWVyYU91dHB1dFRhcmdldChBQ2FtZXJhV2luZG93VHlwZSogd2luZG93KSA6IG1XaW5kb3cod2luZG93KSB7fTsKIAogICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IEFDYW1lcmFPdXRwdXRUYXJnZXQmIG90aGVyKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtV2luZG93ID09IG90aGVyLm1XaW5kb3c7CkBAIC0zNyw4ICs0MSw5IEBACiAgICAgICAgIHJldHVybiBtV2luZG93ID4gb3RoZXIubVdpbmRvdzsKICAgICB9CiAKLSAgICBBTmF0aXZlV2luZG93KiBtV2luZG93OworICAgIEFDYW1lcmFXaW5kb3dUeXBlKiBtV2luZG93OwogfTsKKyNlbmRpZgogCiBzdHJ1Y3QgQUNhbWVyYU91dHB1dFRhcmdldHMgewogICAgIHN0ZDo6c2V0PEFDYW1lcmFPdXRwdXRUYXJnZXQ+IG1PdXRwdXRzOwpAQCAtNTUsNyArNjAsOCBAQAogICAgICAgICByZXR1cm4gQUNBTUVSQV9PSzsKICAgICB9CiAKLSAgICBBQ2FtZXJhTWV0YWRhdGEqICAgICAgc2V0dGluZ3M7CisgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBzZXR0aW5nczsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHNwPEFDYW1lcmFNZXRhZGF0YT4+IHBoeXNpY2FsU2V0dGluZ3M7CiAgICAgQUNhbWVyYU91dHB1dFRhcmdldHMqIHRhcmdldHM7CiAgICAgdm9pZCogICAgICAgICAgICAgICAgIGNvbnRleHQ7CiB9OwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oCmluZGV4IDUxY2VmOGMuLjA3MTc2Y2YgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmgKQEAgLTM1LDkgKzM1LDEwIEBACiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CiAjaW5jbHVkZSA8c3RkYm9vbC5oPgogCi0jaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93Lmg+CiAjaW5jbHVkZSAiTmRrQ2FtZXJhRXJyb3IuaCIKICNpbmNsdWRlICJOZGtDYW1lcmFNZXRhZGF0YS5oIgorI2luY2x1ZGUgIk5ka0NhcHR1cmVSZXF1ZXN0LmgiCisjaW5jbHVkZSAiTmRrQ2FtZXJhV2luZG93VHlwZS5oIgogCiAjaWZuZGVmIF9OREtfQ0FNRVJBX0NBUFRVUkVfU0VTU0lPTl9ICiAjZGVmaW5lIF9OREtfQ0FNRVJBX0NBUFRVUkVfU0VTU0lPTl9ICkBAIC0yNDUsNyArMjQ2LDcgQEAKICAqLwogdHlwZWRlZiB2b2lkICgqQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19idWZmZXJMb3N0KSgKICAgICAgICAgdm9pZCogY29udGV4dCwgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uLAotICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIEFOYXRpdmVXaW5kb3cqIHdpbmRvdywgaW50NjRfdCBmcmFtZU51bWJlcik7CisgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdywgaW50NjRfdCBmcmFtZU51bWJlcik7CiAKIHR5cGVkZWYgc3RydWN0IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzIHsKICAgICAvLy8gb3B0aW9uYWwgYXBwbGljYXRpb24gY29udGV4dC4KQEAgLTQzMyw3ICs0MzQsNyBAQAogICoKICAqLwogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9nZXREZXZpY2UoCi0gICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwgLypvdXQqL0FDYW1lcmFEZXZpY2UqKiBkZXZpY2UpOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24sIC8qb3V0Ki9BQ2FtZXJhRGV2aWNlKiogZGV2aWNlKSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKICAqIFN1Ym1pdCBhbiBhcnJheSBvZiByZXF1ZXN0cyB0byBiZSBjYXB0dXJlZCBpbiBzZXF1ZW5jZSBhcyBhIGJ1cnN0IGluIHRoZSBtaW5pbXVtIG9mIHRpbWUgcG9zc2libGUuCkBAIC00NzEsNyArNDcyLDcgQEAKICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uLAogICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2FsbGJhY2tzLAogICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAotICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKTsKKyAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogLyoqCiAgKiBSZXF1ZXN0IGVuZGxlc3NseSByZXBlYXRpbmcgY2FwdHVyZSBvZiBhIHNlcXVlbmNlIG9mIGltYWdlcyBieSB0aGlzIGNhcHR1cmUgc2Vzc2lvbi4KQEAgLTUyNSw3ICs1MjYsNyBAQAogICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24sCiAgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYWxsYmFja3MsCiAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCi0gICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpOworICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKICAqIENhbmNlbCBhbnkgb25nb2luZyByZXBlYXRpbmcgY2FwdHVyZSBzZXQgYnkge0BsaW5rIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zZXRSZXBlYXRpbmdSZXF1ZXN0fS4KQEAgLTU0OCw3ICs1NDksOCBAQAogICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfQ0FNRVJBX1NFUlZJQ0V9IGlmIHRoZSBjYW1lcmEgc2VydmljZSBlbmNvdW50ZXJzIGZhdGFsIGVycm9yPC9saT4KICAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX1VOS05PV059IGlmIHRoZSBtZXRob2QgZmFpbHMgZm9yIHNvbWUgb3RoZXIgcmVhc29uczwvbGk+PC91bD4KICAqLwotY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdG9wUmVwZWF0aW5nKEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbik7CitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0b3BSZXBlYXRpbmcoQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uKQorICAgICAgICBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKICAqIERpc2NhcmQgYWxsIGNhcHR1cmVzIGN1cnJlbnRseSBwZW5kaW5nIGFuZCBpbi1wcm9ncmVzcyBhcyBmYXN0IGFzIHBvc3NpYmxlLgpAQCAtNTg4LDcgKzU5MCw4IEBACiAgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRX0gaWYgdGhlIGNhbWVyYSBzZXJ2aWNlIGVuY291bnRlcnMgZmF0YWwgZXJyb3I8L2xpPgogICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfVU5LTk9XTn0gaWYgdGhlIG1ldGhvZCBmYWlscyBmb3Igc29tZSBvdGhlciByZWFzb25zPC9saT48L3VsPgogICovCi1jYW1lcmFfc3RhdHVzX3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2Fib3J0Q2FwdHVyZXMoQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uKTsKK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fYWJvcnRDYXB0dXJlcyhBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24pCisgICAgICAgIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjQgKi8KIApAQCAtNjM3LDkgKzY0MCwxNTYgQEAKICAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX1VOS05PV059IGlmIHRoZSBtZXRob2QgZmFpbHMgZm9yIHNvbWUgb3RoZXIgcmVhc29uczwvbGk+PC91bD4KICAqLwogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl91cGRhdGVTaGFyZWRPdXRwdXQoQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uLAotICAgICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXQqIG91dHB1dCk7CisgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dCogb3V0cHV0KSBfX0lOVFJPRFVDRURfSU4oMjgpOwogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOCAqLwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDI5CisvKioKKyAqIFRoZSBkZWZpbml0aW9uIG9mIGZpbmFsIGNhcHR1cmUgcmVzdWx0IGNhbGxiYWNrIHdpdGggbG9naWNhbCBtdWx0aS1jYW1lcmEgc3VwcG9ydC4KKyAqCisgKiBUaGlzIGhhcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGZpbmFsIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0LCB3aXRoCisgKiBhZGRlZCBhYmlsaXR5IHRvIHJldHVybiBwaHlzaWNhbCBjYW1lcmEgcmVzdWx0IG1ldGFkYXRhIHdpdGhpbiBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLgorICoKKyAqIEZvciBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLCB0aGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIElkIGFuZCByZXN1bHQgbWV0YWRhdGEKKyAqIG9mIHRoZSB1bmRlcmx5aW5nIHBoeXNpY2FsIGNhbWVyYXMsIHdoaWNoIHRoZSBjb3JyZXNwb25kaW5nIGNhcHR1cmUgcmVxdWVzdCBjb250YWlucyB0YXJnZXRzIGZvci4KKyAqIElmIHRoZSBjYXB0dXJlIHJlcXVlc3QgZG9lc24ndCBjb250YWluIHRhcmdldHMgc3BlY2lmaWMgdG8gYW55IHBoeXNpY2FsIGNhbWVyYSwgb3IgdGhlIGN1cnJlbnQKKyAqIGNhbWVyYSBkZXZpY2UgaXNuJ3QgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSwgcGh5c2ljYWxSZXN1bHRDb3VudCB3aWxsIGJlIDAuCisgKgorICogQHBhcmFtIGNvbnRleHQgVGhlIG9wdGlvbmFsIGFwcGxpY2F0aW9uIGNvbnRleHQgcHJvdmlkZWQgYnkgdXNlciBpbgorICogICAgICAgICAgICAgICAge0BsaW5rIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzfS4KKyAqIEBwYXJhbSBzZXNzaW9uIFRoZSBjYW1lcmEgY2FwdHVyZSBzZXNzaW9uIG9mIGludGVyZXN0LgorICogQHBhcmFtIHJlcXVlc3QgVGhlIGNhcHR1cmUgcmVxdWVzdCBvZiBpbnRlcmVzdC4gTm90ZSB0aGF0IHRoaXMgcG9pbnRlciBwb2ludHMgdG8gYSBjb3B5IG9mCisgKiAgICAgICAgICAgICAgICBjYXB0dXJlIHJlcXVlc3Qgc2VudCBieSBhcHBsaWNhdGlvbiwgc28gdGhlIGFkZHJlc3MgaXMgZGlmZmVyZW50IHRvIHdoYXQKKyAqICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHNlbnQgYnV0IHRoZSBjb250ZW50IHdpbGwgbWF0Y2guIFRoaXMgcmVxdWVzdCB3aWxsIGJlIGZyZWVkIGJ5CisgKiAgICAgICAgICAgICAgICBmcmFtZXdvcmsgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcyBjYWxsYmFjayByZXR1cm5zLgorICogQHBhcmFtIHJlc3VsdCBUaGUgY2FwdHVyZSByZXN1bHQgbWV0YWRhdGEgcmVwb3J0ZWQgYnkgY2FtZXJhIGRldmljZS4gVGhlIG1lbW9yeSBpcyBtYW5hZ2VkIGJ5CisgKiAgICAgICAgICAgICAgICBjYW1lcmEgZnJhbWV3b3JrLiBEbyBub3QgYWNjZXNzIHRoaXMgcG9pbnRlciBhZnRlciB0aGlzIGNhbGxiYWNrIHJldHVybnMuCisgKiBAcGFyYW0gcGh5c2ljYWxSZXN1bHRDb3VudCBUaGUgbnVtYmVyIG9mIHBoeXNpY2FsIGNhbWVyYSByZXN1bHQgbWV0YWRhdGEKKyAqIEBwYXJhbSBwaHlzaWNhbENhbWVyYUlkcyBUaGUgYXJyYXkgb2YgcGh5c2ljYWwgY2FtZXJhIElEcyBvbiB3aGljaCB0aGUKKyAqICAgICAgICAgICAgICAgIHBoeXNpY2FsIHJlc3VsdCBtZXRhZGF0YSBhcmUgcmVwb3J0ZWQuCisgKiBAcGFyYW0gcGh5c2ljYWxSZXN1bHRzIFRoZSBhcnJheSBvZiBjYXB0dXJlIHJlc3VsdCBtZXRhZGF0YSByZXBvcnRlZCBieSB0aGUKKyAqICAgICAgICAgICAgICAgIHBoeXNpY2FsIGNhbWVyYSBkZXZpY2VzLgorICovCit0eXBlZGVmIHZvaWQgKCpBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0KSgKKyAgICAgICAgdm9pZCogY29udGV4dCwgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uLAorICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIGNvbnN0IEFDYW1lcmFNZXRhZGF0YSogcmVzdWx0LAorICAgICAgICBzaXplX3QgcGh5c2ljYWxSZXN1bHRDb3VudCwgY29uc3QgY2hhcioqIHBoeXNpY2FsQ2FtZXJhSWRzLAorICAgICAgICBjb25zdCBBQ2FtZXJhTWV0YWRhdGEqKiBwaHlzaWNhbFJlc3VsdHMpOworCisvLy8gU3RydWN0IHRvIGRlc2NyaWJlIGEgbG9naWNhbCBjYW1lcmEgY2FwdHVyZSBmYWlsdXJlCit0eXBlZGVmIHN0cnVjdCBBTG9naWNhbENhbWVyYUNhcHR1cmVGYWlsdXJlIHsKKyAgICAvKioKKyAgICAgKiBUaGUge0BsaW5rIEFDYW1lcmFDYXB0dXJlRmFpbHVyZX0gY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgcmVndWxhciBsb2dpY2FsIGRldmljZSBjYXB0dXJlCisgICAgICogZmFpbHVyZS4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgQUNhbWVyYUNhcHR1cmVGYWlsdXJlIGNhcHR1cmVGYWlsdXJlOworCisgICAgLyoqCisgICAgICogVGhlIHBoeXNpY2FsIGNhbWVyYSBkZXZpY2UgSUQgaW4gY2FzZSB0aGUgY2FwdHVyZSBmYWlsdXJlIGNvbWVzIGZyb20gYSBjYXB0dXJlIHJlcXVlc3QKKyAgICAgKiB3aXRoIGNvbmZpZ3VyZWQgcGh5c2ljYWwgY2FtZXJhIHN0cmVhbXMgZm9yIGEgbG9naWNhbCBjYW1lcmEuIHBoeXNpY2FsQ2FtZXJhSWQgd2lsbCBiZSBzZXQKKyAgICAgKiB0byBOVUxMIGluIGNhc2UgdGhlIGNhcHR1cmUgcmVxdWVzdCBoYXMgbm8gYXNzb2NpYXRlZCBwaHlzaWNhbCBjYW1lcmEgZGV2aWNlLgorICAgICAqCisgICAgICovCisgICAgY29uc3QgY2hhciogICAgcGh5c2ljYWxDYW1lcmFJZDsKK30gQUxvZ2ljYWxDYW1lcmFDYXB0dXJlRmFpbHVyZTsKKworLyoqCisgKiBUaGUgZGVmaW5pdGlvbiBvZiBsb2dpY2FsIGNhbWVyYSBjYXB0dXJlIGZhaWx1cmUgY2FsbGJhY2suCisgKgorICogQHBhcmFtIGNvbnRleHQgVGhlIG9wdGlvbmFsIGFwcGxpY2F0aW9uIGNvbnRleHQgcHJvdmlkZWQgYnkgdXNlciBpbgorICogICAgICAgICAgICAgICAge0BsaW5rIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzfS4KKyAqIEBwYXJhbSBzZXNzaW9uIFRoZSBjYW1lcmEgY2FwdHVyZSBzZXNzaW9uIG9mIGludGVyZXN0LgorICogQHBhcmFtIHJlcXVlc3QgVGhlIGNhcHR1cmUgcmVxdWVzdCBvZiBpbnRlcmVzdC4gTm90ZSB0aGF0IHRoaXMgcG9pbnRlciBwb2ludHMgdG8gYSBjb3B5IG9mCisgKiAgICAgICAgICAgICAgICBjYXB0dXJlIHJlcXVlc3Qgc2VudCBieSBhcHBsaWNhdGlvbiwgc28gdGhlIGFkZHJlc3MgaXMgZGlmZmVyZW50IHRvIHdoYXQKKyAqICAgICAgICAgICAgICAgIGFwcGxpY2F0aW9uIHNlbnQgYnV0IHRoZSBjb250ZW50IHdpbGwgbWF0Y2guIFRoaXMgcmVxdWVzdCB3aWxsIGJlIGZyZWVkIGJ5CisgKiAgICAgICAgICAgICAgICBmcmFtZXdvcmsgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcyBjYWxsYmFjayByZXR1cm5zLgorICogQHBhcmFtIGZhaWx1cmUgVGhlIHtAbGluayBBTG9naWNhbENhbWVyYUNhcHR1cmVGYWlsdXJlfSBkZXNyaWJlcyB0aGUgY2FwdHVyZSBmYWlsdXJlLiBUaGUgbWVtb3J5CisgKiAgICAgICAgICAgICAgICBpcyBtYW5hZ2VkIGJ5IGNhbWVyYSBmcmFtZXdvcmsuIERvIG5vdCBhY2Nlc3MgdGhpcyBwb2ludGVyIGFmdGVyIHRoaXMgY2FsbGJhY2sKKyAqICAgICAgICAgICAgICAgIHJldHVybnMuCisgKi8KK3R5cGVkZWYgdm9pZCAoKkFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja19mYWlsZWQpKAorICAgICAgICB2b2lkKiBjb250ZXh0LCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24sCisgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgQUxvZ2ljYWxDYW1lcmFDYXB0dXJlRmFpbHVyZSogZmFpbHVyZSk7CisKKy8qKgorICogVGhpcyBoYXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcywKKyAqIHdpdGggdGhlIGV4Y2VwdGlvbiB0aGF0IGFuIG9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQgY2FsbGJhY2sgaXMKKyAqIHVzZWQsIGluc3RlYWQgb2Ygb25DYXB0dXJlQ29tcGxldGVkLCB0byBzdXBwb3J0IGxvZ2ljYWwgbXVsdGktY2FtZXJhLgorICovCit0eXBlZGVmIHN0cnVjdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzIHsKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzCisgICAgICovCisgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ7CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydCAgICAgICAgIG9uQ2FwdHVyZVN0YXJ0ZWQ7CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgICAgICAgIG9uQ2FwdHVyZVByb2dyZXNzZWQ7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIGFuIGltYWdlIGNhcHR1cmUgaGFzIGZ1bGx5IGNvbXBsZXRlZCBhbmQgYWxsIHRoZQorICAgICAqIHJlc3VsdCBtZXRhZGF0YSBpcyBhdmFpbGFibGUuIEZvciBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLCB0aGlzIGNhbGxiYWNrCisgICAgICogYWxzbyByZXR1cm5zIHRoZSByZXN1bHQgbWV0YWRhdGEgZm9yIGFsbCBwaHlzaWNhbCBjYW1lcmFzIGJlaW5nCisgICAgICogZXhwbGljaXRseSByZXF1ZXN0ZWQgb24uCisgICAgICoKKyAgICAgKiA8cD5UaGlzIGNhbGxiYWNrIHdpbGwgYWx3YXlzIGZpcmUgYWZ0ZXIgdGhlIGxhc3Qge0BsaW5rIG9uQ2FwdHVyZVByb2dyZXNzZWR9OworICAgICAqIGluIG90aGVyIHdvcmRzLCBubyBtb3JlIHBhcnRpYWwgcmVzdWx0cyB3aWxsIGJlIGRlbGl2ZXJlZCBvbmNlIHRoZSBjb21wbGV0ZWQgcmVzdWx0CisgICAgICogaXMgYXZhaWxhYmxlLjwvcD4KKyAgICAgKgorICAgICAqIDxwPkZvciBwZXJmb3JtYW5jZS1pbnRlbnNpdmUgdXNlLWNhc2VzIHdoZXJlIGxhdGVuY3kgaXMgYSBmYWN0b3IsIGNvbnNpZGVyCisgICAgICogdXNpbmcge0BsaW5rIG9uQ2FwdHVyZVByb2dyZXNzZWR9IGluc3RlYWQuPC9wPgorICAgICAqCisgICAgICogPHA+Tm90ZSB0aGF0IHRoZSBBQ2FwdHVyZVJlcXVlc3QgcG9pbnRlciBpbiB0aGUgY2FsbGJhY2sgd2lsbCBub3QgbWF0Y2ggd2hhdCBhcHBsaWNhdGlvbiBoYXMKKyAgICAgKiBzdWJtaXR0ZWQsIGJ1dCB0aGUgY29udGVudHMgdGhlIEFDYXB0dXJlUmVxdWVzdCB3aWxsIG1hdGNoIHdoYXQgYXBwbGljYXRpb24gc3VibWl0dGVkLjwvcD4KKyAgICAgKi8KKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQ7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNhbGxiYWNrIGlzIGNhbGxlZCBpbnN0ZWFkIG9mIHtAbGluayBvbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkfSB3aGVuIHRoZQorICAgICAqIGNhbWVyYSBkZXZpY2UgZmFpbGVkIHRvIHByb2R1Y2UgYSBjYXB0dXJlIHJlc3VsdCBmb3IgdGhlCisgICAgICogcmVxdWVzdC4KKyAgICAgKgorICAgICAqIDxwPk90aGVyIHJlcXVlc3RzIGFyZSB1bmFmZmVjdGVkLCBhbmQgc29tZSBvciBhbGwgaW1hZ2UgYnVmZmVycyBmcm9tCisgICAgICogdGhlIGNhcHR1cmUgbWF5IGhhdmUgYmVlbiBwdXNoZWQgdG8gdGhlaXIgcmVzcGVjdGl2ZSBvdXRwdXQKKyAgICAgKiBzdHJlYW1zLjwvcD4KKyAgICAgKgorICAgICAqIDxwPk5vdGUgdGhhdCB0aGUgQUNhcHR1cmVSZXF1ZXN0IHBvaW50ZXIgaW4gdGhlIGNhbGxiYWNrIHdpbGwgbm90IG1hdGNoIHdoYXQgYXBwbGljYXRpb24gaGFzCisgICAgICogc3VibWl0dGVkLCBidXQgdGhlIGNvbnRlbnRzIHRoZSBBQ2FwdHVyZVJlcXVlc3Qgd2lsbCBtYXRjaCB3aGF0IGFwcGxpY2F0aW9uIHN1Ym1pdHRlZC48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFMb2dpY2FsQ2FtZXJhQ2FwdHVyZUZhaWx1cmUKKyAgICAgKi8KKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tfZmFpbGVkIG9uTG9naWNhbENhbWVyYUNhcHR1cmVGYWlsZWQ7CisKKyAgICAvKioKKyAgICAgKiBTYW1lIGFzIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzCisgICAgICovCisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUVuZCAgIG9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkOworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc2VxdWVuY2VBYm9ydCBvbkNhcHR1cmVTZXF1ZW5jZUFib3J0ZWQ7CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19idWZmZXJMb3N0ICAgIG9uQ2FwdHVyZUJ1ZmZlckxvc3Q7Cit9IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3M7CisKKy8qKgorICogVGhpcyBoYXMgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZSwgd2l0aCBhZGRlZAorICogc3VwcG9ydCBmb3IgbG9naWNhbCBtdWx0aS1jYW1lcmEgd2hlcmUgdGhlIGNhcHR1cmUgY2FsbGJhY2tzIHN1cHBvcnRzIHJlc3VsdCBtZXRhZGF0YSBmb3IKKyAqIHBoeXNpY2FsIGNhbWVyYXMuCisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlKAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24sCisgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MqIGNhbGxiYWNrcywKKyAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCisgKiBUaGlzIGhhcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zZXRSZXBlYXRpbmdSZXF1ZXN0LCB3aXRoIGFkZGVkCisgKiBzdXBwb3J0IGZvciBsb2dpY2FsIG11bHRpLWNhbWVyYSB3aGVyZSB0aGUgY2FwdHVyZSBjYWxsYmFja3Mgc3VwcG9ydHMgcmVzdWx0IG1ldGFkYXRhIGZvcgorICogcGh5c2ljYWwgY2FtZXJhcy4KKyAqLworY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX3NldFJlcGVhdGluZ1JlcXVlc3QoCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcyogY2FsbGJhY2tzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI5ICovCisKIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvKiBfTkRLX0NBTUVSQV9DQVBUVVJFX1NFU1NJT05fSCAqLwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhRGV2aWNlLmgKaW5kZXggOTJkYWQxYy4uMTUzN2JkZSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYURldmljZS5oCkBAIC0zNCwxMCArMzQsMTAgQEAKICAqLwogI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgogCi0jaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93Lmg+CiAjaW5jbHVkZSAiTmRrQ2FtZXJhRXJyb3IuaCIKICNpbmNsdWRlICJOZGtDYXB0dXJlUmVxdWVzdC5oIgogI2luY2x1ZGUgIk5ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmgiCisjaW5jbHVkZSAiTmRrQ2FtZXJhV2luZG93VHlwZS5oIgogCiAjaWZuZGVmIF9OREtfQ0FNRVJBX0RFVklDRV9ICiAjZGVmaW5lIF9OREtfQ0FNRVJBX0RFVklDRV9ICkBAIC01Myw2ICs1MywxNyBAQAogICovCiB0eXBlZGVmIHN0cnVjdCBBQ2FtZXJhRGV2aWNlIEFDYW1lcmFEZXZpY2U7CiAKKy8qKgorICogU3RydWN0IHRvIGhvbGQgbGlzdCBvZiBjYW1lcmEgZGV2aWNlIElkcy4gVGhpcyBjYW4gcmVmZXIgdG8gZWl0aGVyIHRoZSBJZHMKKyAqIG9mIGNvbm5lY3RlZCBjYW1lcmEgZGV2aWNlcyByZXR1cm5lZCBmcm9tIHtAbGluayBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFJZExpc3R9LAorICogb3IgdGhlIHBoeXNpY2FsIGNhbWVyYSBJZHMgcGFzc2VkIGludG8KKyAqIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0X3dpdGhQaHlzaWNhbElkc30uCisgKi8KK3R5cGVkZWYgc3RydWN0IEFDYW1lcmFJZExpc3QgeworICAgIGludCBudW1DYW1lcmFzOyAgICAgICAgICAvLy88IE51bWJlciBvZiBjYW1lcmEgZGV2aWNlIElkcworICAgIGNvbnN0IGNoYXIqKiBjYW1lcmFJZHM7ICAvLy88IGxpc3Qgb2YgY2FtZXJhIGRldmljZSBJZHMKK30gQUNhbWVyYUlkTGlzdDsKKwogLy8vIEVudW0gZm9yIEFDYW1lcmFEZXZpY2VfRXJyb3JTdGF0ZUNhbGxiYWNrIGVycm9yIGNvZGUKIGVudW0gewogICAgIC8qKgpAQCAtMTc2LDcgKzE4Nyw3IEBACiAgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9PS30gaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLjwvbGk+CiAgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgZGV2aWNlIGlzIE5VTEwuPC9saT48L3VsPgogICovCi1jYW1lcmFfc3RhdHVzX3QgQUNhbWVyYURldmljZV9jbG9zZShBQ2FtZXJhRGV2aWNlKiBkZXZpY2UpOworY2FtZXJhX3N0YXR1c190IEFDYW1lcmFEZXZpY2VfY2xvc2UoQUNhbWVyYURldmljZSogZGV2aWNlKSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKICAqIFJldHVybiB0aGUgY2FtZXJhIGlkIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGNhbWVyYSBkZXZpY2UuCkBAIC0xODcsNyArMTk4LDcgQEAKICAqIGRlbGV0ZS9mcmVlIGJ5IHRoZSBhcHBsaWNhdGlvbi4gQWxzbyB0aGUgcmV0dXJuZWQgc3RyaW5nIG11c3Qgbm90IGJlIHVzZWQgYWZ0ZXIgdGhlIGRldmljZQogICogaGFzIGJlZW4gY2xvc2VkLgogICovCi1jb25zdCBjaGFyKiBBQ2FtZXJhRGV2aWNlX2dldElkKGNvbnN0IEFDYW1lcmFEZXZpY2UqIGRldmljZSk7Citjb25zdCBjaGFyKiBBQ2FtZXJhRGV2aWNlX2dldElkKGNvbnN0IEFDYW1lcmFEZXZpY2UqIGRldmljZSkgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogdHlwZWRlZiBlbnVtIHsKICAgICAvKioKQEAgLTI5MCw3ICszMDEsNyBAQAogICovCiBjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdCgKICAgICAgICAgY29uc3QgQUNhbWVyYURldmljZSogZGV2aWNlLCBBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCwKLSAgICAgICAgLypvdXQqL0FDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3QpOworICAgICAgICAvKm91dCovQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdCkgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogCiB0eXBlZGVmIHN0cnVjdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyOwpAQCAtMzEzLDcgKzMyNCw3IEBACiAgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgY29udGFpbmVyIGlzIE5VTEwuPC9saT48L3VsPgogICovCiBjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2NyZWF0ZSgKLSAgICAgICAgLypvdXQqL0FDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcioqIGNvbnRhaW5lcik7CisgICAgICAgIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqKiBjb250YWluZXIpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qKgogICogRnJlZSBhIGNhcHR1cmUgc2Vzc2lvbiBvdXRwdXQgY29udGFpbmVyLgpAQCAtMzIyLDcgKzMzMyw4IEBACiAgKgogICogQHNlZSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfY3JlYXRlCiAgKi8KLXZvaWQgICAgICAgICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfZnJlZShBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqIGNvbnRhaW5lcik7Cit2b2lkICAgICAgICAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2ZyZWUoQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBjb250YWluZXIpCisgICAgICAgIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qKgogICogQ3JlYXRlIGEgQUNhcHR1cmVTZXNzaW9uT3V0cHV0IG9iamVjdC4KQEAgLTM0NCw3ICszNTYsNyBAQAogICogQHNlZSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkCiAgKi8KIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfY3JlYXRlKAotICAgICAgICBBTmF0aXZlV2luZG93KiBhbncsIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXRwdXQpOworICAgICAgICBBQ2FtZXJhV2luZG93VHlwZSogYW53LCAvKm91dCovQUNhcHR1cmVTZXNzaW9uT3V0cHV0Kiogb3V0cHV0KSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKICAqIEZyZWUgYSBBQ2FwdHVyZVNlc3Npb25PdXRwdXQgb2JqZWN0LgpAQCAtMzUzLDcgKzM2NSw3IEBACiAgKgogICogQHNlZSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfY3JlYXRlCiAgKi8KLXZvaWQgICAgICAgICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfZnJlZShBQ2FwdHVyZVNlc3Npb25PdXRwdXQqIG91dHB1dCk7Cit2b2lkICAgICAgICAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0X2ZyZWUoQUNhcHR1cmVTZXNzaW9uT3V0cHV0KiBvdXRwdXQpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qKgogICogQWRkIGFuIHtAbGluayBBQ2FwdHVyZVNlc3Npb25PdXRwdXR9IG9iamVjdCB0byB7QGxpbmsgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyfS4KQEAgLTM2Niw3ICszNzgsOCBAQAogICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIGNvbnRhaW5lciBvciBvdXRwdXQgaXMgTlVMTC48L2xpPjwvdWw+CiAgKi8KIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkKAotICAgICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqIGNvbnRhaW5lciwgY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KiBvdXRwdXQpOworICAgICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqIGNvbnRhaW5lciwgY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KiBvdXRwdXQpCisgICAgICAgIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qKgogICogUmVtb3ZlIGFuIHtAbGluayBBQ2FwdHVyZVNlc3Npb25PdXRwdXR9IG9iamVjdCBmcm9tIHtAbGluayBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJ9LgpAQCAtMzgyLDcgKzM5NSw4IEBACiAgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgY29udGFpbmVyIG9yIG91dHB1dCBpcyBOVUxMLjwvbGk+PC91bD4KICAqLwogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9yZW1vdmUoCi0gICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogY29udGFpbmVyLCBjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQqIG91dHB1dCk7CisgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogY29udGFpbmVyLCBjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQqIG91dHB1dCkKKyAgICAgICAgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogLyoqCiAgKiBDcmVhdGUgYSBuZXcgY2FtZXJhIGNhcHR1cmUgc2Vzc2lvbiBieSBwcm92aWRpbmcgdGhlIHRhcmdldCBvdXRwdXQgc2V0IG9mIHtAbGluayBBTmF0aXZlV2luZG93fQpAQCAtNjcxLDcgKzY4NSw3IEBACiAgICAgICAgIEFDYW1lcmFEZXZpY2UqIGRldmljZSwKICAgICAgICAgY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiAgICAgICBvdXRwdXRzLAogICAgICAgICBjb25zdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RhdGVDYWxsYmFja3MqIGNhbGxiYWNrcywKLSAgICAgICAgLypvdXQqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbioqIHNlc3Npb24pOworICAgICAgICAvKm91dCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiogc2Vzc2lvbikgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyNCAqLwogCkBAIC02OTksNyArNzEzLDcgQEAKICAqIEBzZWUgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZAogICovCiBjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVTZXNzaW9uU2hhcmVkT3V0cHV0X2NyZWF0ZSgKLSAgICAgICAgQU5hdGl2ZVdpbmRvdyogYW53LCAvKm91dCovQUNhcHR1cmVTZXNzaW9uT3V0cHV0Kiogb3V0cHV0KTsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIGFudywgLypvdXQqL0FDYXB0dXJlU2Vzc2lvbk91dHB1dCoqIG91dHB1dCkgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAogLyoqCiAgKiBBZGQgYSBuYXRpdmUgd2luZG93IHRvIHNoYXJlZCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQuCkBAIC03MTYsNyArNzMwLDggQEAKICAqICAgICAgICAgICAgIHdpbmRvdyBhc3NvY2lhdGVkIHdpdGggQUNhcHR1cmVTZXNzaW9uT3V0cHV0OyBvciBhbncgaXMgYWxyZWFkeSBwcmVzZW50IGluc2lkZQogICogICAgICAgICAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0LjwvbGk+PC91bD4KICAqLwotY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9hZGQoQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpvdXRwdXQsIEFOYXRpdmVXaW5kb3cgKmFudyk7CitjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVTZXNzaW9uU2hhcmVkT3V0cHV0X2FkZChBQ2FwdHVyZVNlc3Npb25PdXRwdXQgKm91dHB1dCwKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUgKmFudykgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAogLyoqCiAgKiBSZW1vdmUgYSBuYXRpdmUgd2luZG93IGZyb20gc2hhcmVkIEFDYXB0dXJlU2Vzc2lvbk91dHB1dC4KQEAgLTczMiw3ICs3NDcsNyBAQAogICogICAgICAgICAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0LjwvbGk+PC91bD4KICAqLwogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9yZW1vdmUoQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpvdXRwdXQsCi0gICAgICAgIEFOYXRpdmVXaW5kb3cqIGFudyk7CisgICAgICAgIEFDYW1lcmFXaW5kb3dUeXBlKiBhbncpIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKIC8qKgogICogQ3JlYXRlIGEgbmV3IGNhbWVyYSBjYXB0dXJlIHNlc3Npb24gc2ltaWxhciB0byB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbn0uIFRoaXMKQEAgLTc2NSwxMCArNzgwLDExOCBAQAogICAgICAgICBjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqIG91dHB1dHMsCiAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMsCiAgICAgICAgIGNvbnN0IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2tzLAotICAgICAgICAvKm91dCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiogc2Vzc2lvbik7CisgICAgICAgIC8qb3V0Ki9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24qKiBzZXNzaW9uKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI4ICovCiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjkKKworLyoqCisgKiBDcmVhdGUgYSBBQ2FwdHVyZVNlc3Npb25PdXRwdXQgb2JqZWN0IHVzZWQgZm9yIHN0cmVhbWluZyBmcm9tIGEgcGh5c2ljYWwKKyAqIGNhbWVyYSBhcyBwYXJ0IG9mIGEgbG9naWNhbCBjYW1lcmEgZGV2aWNlLgorICoKKyAqIDxwPlRoZSBBQ2FwdHVyZVNlc3Npb25PdXRwdXQgaXMgdXNlZCBpbiB7QGxpbmsgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZH0gbWV0aG9kIHRvIGFkZAorICogYW4gb3V0cHV0IHtAbGluayBBTmF0aXZlV2luZG93fSB0byBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIuIFVzZQorICoge0BsaW5rIEFDYXB0dXJlU2Vzc2lvbk91dHB1dF9mcmVlfSB0byBmcmVlIHRoZSBvYmplY3QgYW5kIGl0cyBtZW1vcnkgYWZ0ZXIgYXBwbGljYXRpb24gbm8gbG9uZ2VyCisgKiBuZWVkcyB0aGUge0BsaW5rIEFDYXB0dXJlU2Vzc2lvbk91dHB1dH0uPC9wPgorICoKKyAqIEBwYXJhbSBhbncgdGhlIHtAbGluayBBTmF0aXZlV2luZG93fSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHtAbGluayBBQ2FwdHVyZVNlc3Npb25PdXRwdXR9CisgKiBAcGFyYW0gcGh5c2ljYWxJZCB0aGUgSWQgb2YgdGhlIHBoeXNpY2FsIGNhbWVyYSB0aGlzIG91dHB1dCBpcyBhc3NvY2lhdGVkCisgKiAgICAgICAgICAgICAgICAgIHdpdGguCisgKiBAcGFyYW0gb3V0cHV0IHRoZSBvdXRwdXQge0BsaW5rIEFDYXB0dXJlU2Vzc2lvbk91dHB1dH0gd2lsbCBiZSBzdG9yZWQgaGVyZSBpZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgbWV0aG9kIGNhbGwgc3VjY2VlZHMuCisgKgorICogQHJldHVybiA8dWw+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9PS30gaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLiBUaGUgY3JlYXRlZCBjb250YWluZXIgd2lsbCBiZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxlZCBpbiB0aGUgb3V0cHV0IGFyZ3VtZW50LjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgYW53LCBwaHlzaWNhbElkIG9yIG91dHB1dCBpcyBOVUxMLjwvbGk+PC91bD4KKyAqCisgKiBAc2VlIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9hZGQKKyAqLworY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblBoeXNpY2FsT3V0cHV0X2NyZWF0ZSgKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIGFudywgY29uc3QgY2hhciogcGh5c2ljYWxJZCwKKyAgICAgICAgLypvdXQqL0FDYXB0dXJlU2Vzc2lvbk91dHB1dCoqIG91dHB1dCkgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCisgKiBDcmVhdGUgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSBBQ2FwdHVyZVJlcXVlc3QgZm9yIGNhcHR1cmluZyBpbWFnZXMsIGluaXRpYWxpemVkIHdpdGggdGVtcGxhdGUKKyAqIGZvciBhIHRhcmdldCB1c2UgY2FzZSwgd2l0aCB0aGUgYWJpbGl0eSB0byBzcGVjaWZ5IHBoeXNpY2FsIGNhbWVyYSBzZXR0aW5ncy4KKyAqCisgKiA8cD5UaGUgc2V0dGluZ3MgYXJlIGNob3NlbiB0byBiZSB0aGUgYmVzdCBvcHRpb25zIGZvciB0aGlzIGNhbWVyYSBkZXZpY2UsCisgKiBzbyBpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gcmV1c2UgdGhlIHNhbWUgcmVxdWVzdCBmb3IgYSBkaWZmZXJlbnQgY2FtZXJhIGRldmljZS48L3A+CisgKgorICogPHA+Tm90ZSB0aGF0IGZvciBhbGwga2V5cyBpbiBwaHlzaWNhbCBjYW1lcmEgc2V0dGluZ3MsIG9ubHkgdGhlIGtleXMKKyAqIGFkdmVydGlzZWQgaW4gQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTIGFyZQorICogYXBwbGljYWJsZS4gQWxsIG90aGVyIGtleXMgYXJlIGlnbm9yZWQgYnkgdGhlIGNhbWVyYSBkZXZpY2UuPC9wPgorICoKKyAqIEBwYXJhbSBkZXZpY2UgdGhlIGNhbWVyYSBkZXZpY2Ugb2YgaW50ZXJlc3QKKyAqIEBwYXJhbSB0ZW1wbGF0ZUlkIHRoZSB0eXBlIG9mIGNhcHR1cmUgcmVxdWVzdCB0byBiZSBjcmVhdGVkLgorICogICAgICAgIFNlZSB7QGxpbmsgQUNhbWVyYURldmljZV9yZXF1ZXN0X3RlbXBsYXRlfS4KKyAqIEBwYXJhbSBwaHlzaWNhbElkTGlzdCBUaGUgbGlzdCBvZiBwaHlzaWNhbCBjYW1lcmEgSWRzIHRoYXQgY2FuIGJlIHVzZWQgdG8KKyAqICAgICAgICBjdXN0b21pemUgdGhlIHJlcXVlc3QgZm9yIGEgc3BlY2lmaWMgcGh5c2ljYWwgY2FtZXJhLgorICogQHBhcmFtIHJlcXVlc3QgdGhlIG91dHB1dCByZXF1ZXN0IHdpbGwgYmUgc3RvcmVkIGhlcmUgaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy4gVGhlIGNyZWF0ZWQgY2FwdHVyZSByZXF1ZXN0IHdpbGwgYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsZWQgaW4gcmVxdWVzdCBhcmd1bWVudC48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIGRldmljZSwgcGh5c2ljYWxJZExpc3QsIG9yIHJlcXVlc3QgaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCB0ZW1wbGF0ZUlkIGlzIHVuZGVmaW5lZCBvciBjYW1lcmEgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWQgdGVtcGxhdGUsIG9yIGlmIHNvbWUgSWRzIGluIHBoeXNpY2FsSWRMaXN0IGlzbid0IGEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBwaHlzaWNhbCBjYW1lcmEgYmFja2luZyB0aGUgY3VycmVudCBjYW1lcmEgZGV2aWNlLjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEfSBpZiB0aGUgY2FtZXJhIGRldmljZSBpcyBjbG9zZWQuPC9saT4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0V9IGlmIHRoZSBjYW1lcmEgZGV2aWNlIGVuY291bnRlcnMgZmF0YWwgZXJyb3IuPC9saT4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9TRVJWSUNFfSBpZiB0aGUgY2FtZXJhIHNlcnZpY2UgZW5jb3VudGVycyBmYXRhbCBlcnJvci48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfVU5LTk9XTn0gaWYgdGhlIG1ldGhvZCBmYWlscyBmb3Igc29tZSBvdGhlciByZWFzb25zLjwvbGk+PC91bD4KKyAqCisgKiBAc2VlIFRFTVBMQVRFX1BSRVZJRVcKKyAqIEBzZWUgVEVNUExBVEVfUkVDT1JECisgKiBAc2VlIFRFTVBMQVRFX1NUSUxMX0NBUFRVUkUKKyAqIEBzZWUgVEVNUExBVEVfVklERU9fU05BUFNIT1QKKyAqIEBzZWUgVEVNUExBVEVfTUFOVUFMCisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0X3dpdGhQaHlzaWNhbElkcygKKyAgICAgICAgY29uc3QgQUNhbWVyYURldmljZSogZGV2aWNlLCBBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCwKKyAgICAgICAgY29uc3QgQUNhbWVyYUlkTGlzdCogcGh5c2ljYWxJZExpc3QsCisgICAgICAgIC8qb3V0Ki9BQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0KSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisvKioKKyAqIENoZWNrIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIHtAQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyfSBpcyBzdXBwb3J0ZWQgYnkKKyAqIHRoZSBjYW1lcmEgZGV2aWNlLgorICoKKyAqIDxwPlRoaXMgbWV0aG9kIHBlcmZvcm1zIGEgcnVudGltZSBjaGVjayBvZiBhIGdpdmVuIHtAbGluaworICogQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyfS4gVGhlIHJlc3VsdCBjb25maXJtcyB3aGV0aGVyIG9yIG5vdCB0aGUKKyAqIHBhc3NlZCBDYXB0dXJlU2Vzc2lvbiBvdXRwdXRzIGNhbiBiZSBzdWNjZXNzZnVsbHkgdXNlZCB0byBjcmVhdGUgYSBjYW1lcmEKKyAqIGNhcHR1cmUgc2Vzc2lvbiB1c2luZyB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbn0uPC9wPgorICoKKyAqIDxwPlRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgYXQgYW55IHBvaW50IGJlZm9yZSwgZHVyaW5nIGFuZCBhZnRlciBhY3RpdmUKKyAqIGNhcHR1cmUgc2Vzc2lvbi4gSXQgbXVzdCBub3QgaW1wYWN0IG5vcm1hbCBjYW1lcmEgYmVoYXZpb3IgaW4gYW55IHdheSBhbmQKKyAqIG11c3QgY29tcGxldGUgc2lnbmlmaWNhbnRseSBmYXN0ZXIgdGhhbiBjcmVhdGluZyBhIGNhcHR1cmUgc2Vzc2lvbi48L3A+CisgKgorICogPHA+QWx0aG91Z2ggdGhpcyBtZXRob2QgaXMgZmFzdGVyIHRoYW4gY3JlYXRpbmcgYSBuZXcgY2FwdHVyZSBzZXNzaW9uLCBpdCBpcyBub3QgaW50ZW5kZWQKKyAqIHRvIGJlIHVzZWQgZm9yIGV4cGxvcmluZyB0aGUgZW50aXJlIHNwYWNlIG9mIHN1cHBvcnRlZCBzdHJlYW0gY29tYmluYXRpb25zLjwvcD4KKyAqCisgKiBAcGFyYW0gZGV2aWNlIHRoZSBjYW1lcmEgZGV2aWNlIG9mIGludGVyZXN0CisgKiBAcGFyYW0gc2Vzc2lvbk91dHB1dENvbnRhaW5lciB0aGUge0BsaW5rIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcn0gb2YKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0LgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBnaXZlbiB7QGxpbmsgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyfQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHN1cHBvcnRlZCBieSB0aGUgY2FtZXJhIGRldmljZS48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIGRldmljZSwgb3Igc2Vzc2lvbk91dHB1dENvbnRhaW5lcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIE5VTEwuPC9saT4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX1NUUkVBTV9DT05GSUdVUkVfRkFJTH0gaWYgdGhlIGdpdmVuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJ9CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBzdXBwb3J0ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNhbWVyYQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UuPC9saT4KKyAqICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfVU5TVVBQT1JURURfT1BFUkFUSU9OfSBpZiB0aGUgcXVlcnkgb3BlcmF0aW9uIGlzIG5vdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCBieSB0aGUgY2FtZXJhIGRldmljZS48L2xpPgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYURldmljZV9pc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAorICAgICAgICBjb25zdCBBQ2FtZXJhRGV2aWNlKiBkZXZpY2UsCisgICAgICAgIGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogc2Vzc2lvbk91dHB1dENvbnRhaW5lcikgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOSAqLworCiBfX0VORF9ERUNMUwogCiAjZW5kaWYgLyogX05ES19DQU1FUkFfREVWSUNFX0ggKi8KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhRXJyb3IuaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhRXJyb3IuaAppbmRleCA2YjU4MTU1Li5mYzYxOGVlIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYUVycm9yLmgKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFFcnJvci5oCkBAIC0xMDYsNyArMTA2LDggQEAKIAogICAgIC8qKgogICAgICAqIENhbWVyYSBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGUgc3RyZWFtIGNvbmZpZ3VyYXRpb24gcHJvdmlkZWQgYnkgYXBwbGljYXRpb24gaW4KLSAgICAgKiB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbn0uCisgICAgICoge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb259IG9yIHtAbGluaworICAgICAqIEFDYW1lcmFEZXZpY2VfaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZH0uCiAgICAgICovCiAgICAgQUNBTUVSQV9FUlJPUl9TVFJFQU1fQ09ORklHVVJFX0ZBSUwgPSBBQ0FNRVJBX0VSUk9SX0JBU0UgLSA5LAogCkBAIC0xMzAsNiArMTMxLDExIEBACiAgICAgICogVGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuIGNhbWVyYS4KICAgICAgKi8KICAgICBBQ0FNRVJBX0VSUk9SX1BFUk1JU1NJT05fREVOSUVEICAgICA9IEFDQU1FUkFfRVJST1JfQkFTRSAtIDEzLAorCisgICAgLyoqCisgICAgICogVGhlIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjYW1lcmEgZGV2aWNlLgorICAgICAqLworICAgIEFDQU1FUkFfRVJST1JfVU5TVVBQT1JURURfT1BFUkFUSU9OID0gQUNBTUVSQV9FUlJPUl9CQVNFIC0gMTQsCiB9IGNhbWVyYV9zdGF0dXNfdDsKIAogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyNCAqLwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNYW5hZ2VyLmggYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1hbmFnZXIuaAppbmRleCBlNWIzYWQ4Li4yY2M4YTk3IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1hbmFnZXIuaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1hbmFnZXIuaApAQCAtNjUsMjAgKzY1LDE0IEBACiAgKiBAcmV0dXJuIGEge0BsaW5rIEFDYW1lcmFNYW5hZ2VyfSBpbnN0YW5jZS4KICAqCiAgKi8KLUFDYW1lcmFNYW5hZ2VyKiBBQ2FtZXJhTWFuYWdlcl9jcmVhdGUoKTsKK0FDYW1lcmFNYW5hZ2VyKiBBQ2FtZXJhTWFuYWdlcl9jcmVhdGUoKSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKICAqIDxwPkRlbGV0ZSB0aGUge0BsaW5rIEFDYW1lcmFNYW5hZ2VyfSBpbnN0YW5jZSBhbmQgZnJlZSBpdHMgcmVzb3VyY2VzLiA8L3A+CiAgKgogICogQHBhcmFtIG1hbmFnZXIgdGhlIHtAbGluayBBQ2FtZXJhTWFuYWdlcn0gaW5zdGFuY2UgdG8gYmUgZGVsZXRlZC4KICAqLwotdm9pZCBBQ2FtZXJhTWFuYWdlcl9kZWxldGUoQUNhbWVyYU1hbmFnZXIqIG1hbmFnZXIpOwotCi0vLy8gU3RydWN0IHRvIGhvbGQgbGlzdCBvZiBjYW1lcmEgZGV2aWNlcwotdHlwZWRlZiBzdHJ1Y3QgQUNhbWVyYUlkTGlzdCB7Ci0gICAgaW50IG51bUNhbWVyYXM7ICAgICAgICAgIC8vLzwgTnVtYmVyIG9mIGNvbm5lY3RlZCBjYW1lcmEgZGV2aWNlcwotICAgIGNvbnN0IGNoYXIqKiBjYW1lcmFJZHM7ICAvLy88IGxpc3Qgb2YgaWRlbnRpZmllciBvZiBjb25uZWN0ZWQgY2FtZXJhIGRldmljZXMKLX0gQUNhbWVyYUlkTGlzdDsKK3ZvaWQgQUNhbWVyYU1hbmFnZXJfZGVsZXRlKEFDYW1lcmFNYW5hZ2VyKiBtYW5hZ2VyKSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKICAqIENyZWF0ZSBhIGxpc3Qgb2YgY3VycmVudGx5IGNvbm5lY3RlZCBjYW1lcmEgZGV2aWNlcywgaW5jbHVkaW5nCkBAIC05MSw2ICs4NSwxMSBAQAogICogPHA+QUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhSWRMaXN0IHdpbGwgYWxsb2NhdGUgYW5kIHJldHVybiBhbiB7QGxpbmsgQUNhbWVyYUlkTGlzdH0uCiAgKiBUaGUgY2FsbGVyIG11c3QgY2FsbCB7QGxpbmsgQUNhbWVyYU1hbmFnZXJfZGVsZXRlQ2FtZXJhSWRMaXN0fSB0byBmcmVlIHRoZSBtZW1vcnk8L3A+CiAgKgorICogPHA+Tm90ZTogdGhlIHJldHVybmVkIGNhbWVyYSBsaXN0IG1pZ2h0IGJlIGEgc3Vic2V0IHRvIHRoZSBvdXRwdXQgb2YgPGEgaHJlZj0KKyAqICJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1hbmFnZXIuaHRtbCNnZXRDYW1lcmFJZExpc3QoKSI+CisgKiBTREsgQ2FtZXJhTWFuYWdlciNnZXRDYW1lcmFJZExpc3QgQVBJPC9hPiBhcyB0aGUgTkRLIEFQSSBkb2VzIG5vdCBzdXBwb3J0IHNvbWUgbGVnYWN5IGNhbWVyYQorICogaGFyZHdhcmUuPC9wPgorICoKICAqIEBwYXJhbSBtYW5hZ2VyIHRoZSB7QGxpbmsgQUNhbWVyYU1hbmFnZXJ9IG9mIGludGVyZXN0CiAgKiBAcGFyYW0gY2FtZXJhSWRMaXN0IHRoZSBvdXRwdXQge0BsaW5rIEFDYW1lcmFJZExpc3R9IHdpbGwgYmUgZmlsbGVkIGluIGhlcmUgaWYgdGhlIG1ldGhvZCBjYWxsCiAgKiAgICAgICAgc3VjY2VlZHMuCkBAIC0xMDIsMTQgKzEwMSwxNCBAQAogICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfTk9UX0VOT1VHSF9NRU1PUll9IGlmIGFsbG9jYXRpbmcgbWVtb3J5IGZhaWxzLjwvbGk+PC91bD4KICAqLwogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUlkTGlzdChBQ2FtZXJhTWFuYWdlciogbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovQUNhbWVyYUlkTGlzdCoqIGNhbWVyYUlkTGlzdCk7CisgICAgICAgIC8qb3V0Ki9BQ2FtZXJhSWRMaXN0KiogY2FtZXJhSWRMaXN0KSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKICAqIERlbGV0ZSBhIGxpc3Qgb2YgY2FtZXJhIGRldmljZXMgYWxsb2NhdGVkIHZpYSB7QGxpbmsgQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhSWRMaXN0fS4KICAqCiAgKiBAcGFyYW0gY2FtZXJhSWRMaXN0IHRoZSB7QGxpbmsgQUNhbWVyYUlkTGlzdH0gdG8gYmUgZGVsZXRlZC4KICAqLwotdm9pZCBBQ2FtZXJhTWFuYWdlcl9kZWxldGVDYW1lcmFJZExpc3QoQUNhbWVyYUlkTGlzdCogY2FtZXJhSWRMaXN0KTsKK3ZvaWQgQUNhbWVyYU1hbmFnZXJfZGVsZXRlQ2FtZXJhSWRMaXN0KEFDYW1lcmFJZExpc3QqIGNhbWVyYUlkTGlzdCkgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogLyoqCiAgKiBEZWZpbml0aW9uIG9mIGNhbWVyYSBhdmFpbGFiaWxpdHkgY2FsbGJhY2tzLgpAQCAtMTIwLDcgKzExOSw4IEBACiAgKiAgICAgICAgICAgICAgICAgYXJndW1lbnQgaXMgb3duZWQgYnkgY2FtZXJhIGZyYW1ld29yayBhbmQgd2lsbCBiZWNvbWUgaW52YWxpZCBpbW1lZGlhdGVseSBhZnRlcgogICogICAgICAgICAgICAgICAgIHRoaXMgY2FsbGJhY2sgcmV0dXJucy4KICAqLwotdHlwZWRlZiB2b2lkICgqQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2spKHZvaWQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIGNhbWVyYUlkKTsKK3R5cGVkZWYgdm9pZCAoKkFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrKSh2b2lkKiBjb250ZXh0LAorICAgICAgICBjb25zdCBjaGFyKiBjYW1lcmFJZCk7CiAKIC8qKgogICogQSBsaXN0ZW5lciBmb3IgY2FtZXJhIGRldmljZXMgYmVjb21pbmcgYXZhaWxhYmxlIG9yIHVuYXZhaWxhYmxlIHRvIG9wZW4uCkBAIC0xNjgsNyArMTY4LDggQEAKICAqICAgICAgICAgICAgICAgICAge0FDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrcyNvbkNhbWVyYVVuYXZhaWxhYmxlfSBpcyBOVUxMLjwvbGk+PC91bD4KICAqLwogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFNYW5hZ2VyX3JlZ2lzdGVyQXZhaWxhYmlsaXR5Q2FsbGJhY2soCi0gICAgICAgIEFDYW1lcmFNYW5hZ2VyKiBtYW5hZ2VyLCBjb25zdCBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3MqIGNhbGxiYWNrKTsKKyAgICAgICAgQUNhbWVyYU1hbmFnZXIqIG1hbmFnZXIsCisgICAgICAgIGNvbnN0IEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrcyogY2FsbGJhY2spIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qKgogICogVW5yZWdpc3RlciBjYW1lcmEgYXZhaWxhYmlsaXR5IGNhbGxiYWNrcy4KQEAgLTE4NSw3ICsxODYsOCBAQAogICogICAgICAgICAgICAgICAgICB7QUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzI29uQ2FtZXJhVW5hdmFpbGFibGV9IGlzIE5VTEwuPC9saT48L3VsPgogICovCiBjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYU1hbmFnZXJfdW5yZWdpc3RlckF2YWlsYWJpbGl0eUNhbGxiYWNrKAotICAgICAgICBBQ2FtZXJhTWFuYWdlciogbWFuYWdlciwgY29uc3QgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzKiBjYWxsYmFjayk7CisgICAgICAgIEFDYW1lcmFNYW5hZ2VyKiBtYW5hZ2VyLAorICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3MqIGNhbGxiYWNrKSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKICAqIFF1ZXJ5IHRoZSBjYXBhYmlsaXRpZXMgb2YgYSBjYW1lcmEgZGV2aWNlLiBUaGVzZSBjYXBhYmlsaXRpZXMgYXJlCkBAIC0yMTEsNyArMjEzLDcgQEAKICAqLwogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljcygKICAgICAgICAgQUNhbWVyYU1hbmFnZXIqIG1hbmFnZXIsIGNvbnN0IGNoYXIqIGNhbWVyYUlkLAotICAgICAgICAvKm91dCovQUNhbWVyYU1ldGFkYXRhKiogY2hhcmFjdGVyaXN0aWNzKTsKKyAgICAgICAgLypvdXQqL0FDYW1lcmFNZXRhZGF0YSoqIGNoYXJhY3RlcmlzdGljcykgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogLyoqCiAgKiBPcGVuIGEgY29ubmVjdGlvbiB0byBhIGNhbWVyYSB3aXRoIHRoZSBnaXZlbiBJRC4gVGhlIG9wZW5lZCBjYW1lcmEgZGV2aWNlIHdpbGwgYmUKQEAgLTI3MSwxMCArMjczLDEyNiBAQAogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFNYW5hZ2VyX29wZW5DYW1lcmEoCiAgICAgICAgIEFDYW1lcmFNYW5hZ2VyKiBtYW5hZ2VyLCBjb25zdCBjaGFyKiBjYW1lcmFJZCwKICAgICAgICAgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2ssCi0gICAgICAgIC8qb3V0Ki9BQ2FtZXJhRGV2aWNlKiogZGV2aWNlKTsKKyAgICAgICAgLypvdXQqL0FDYW1lcmFEZXZpY2UqKiBkZXZpY2UpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjQgKi8KIAorI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOQorCisvKioKKyAqIERlZmluaXRpb24gb2YgY2FtZXJhIGFjY2VzcyBwZXJtaXNzaW9uIGNoYW5nZSBjYWxsYmFjay4KKyAqCisgKiA8cD5Ob3RpZmljYXRpb24gdGhhdCBjYW1lcmEgYWNjZXNzIHByaW9yaXRpZXMgaGF2ZSBjaGFuZ2VkIGFuZCB0aGUgY2FtZXJhIG1heQorICogbm93IGJlIG9wZW5hYmxlLiBBbiBhcHBsaWNhdGlvbiB0aGF0IHdhcyBwcmV2aW91c2x5IGRlbmllZCBjYW1lcmEgYWNjZXNzIGR1ZSB0bworICogYSBoaWdoZXItcHJpb3JpdHkgdXNlciBhbHJlYWR5IHVzaW5nIHRoZSBjYW1lcmEsIG9yIHRoYXQgd2FzIGRpc2Nvbm5lY3RlZCBmcm9tIGFuCisgKiBhY3RpdmUgY2FtZXJhIHNlc3Npb24gZHVlIHRvIGEgaGlnaGVyLXByaW9yaXR5IHVzZXIgdHJ5aW5nIHRvIG9wZW4gdGhlIGNhbWVyYSwKKyAqIHNob3VsZCB0cnkgdG8gb3BlbiB0aGUgY2FtZXJhIGFnYWluIGlmIGl0IHN0aWxsIHdhbnRzIHRvIHVzZSBpdC4gIE5vdGUgdGhhdAorICogbXVsdGlwbGUgYXBwbGljYXRpb25zIG1heSByZWNlaXZlIHRoaXMgY2FsbGJhY2sgYXQgdGhlIHNhbWUgdGltZSwgYW5kIG9ubHkgb25lIG9mCisgKiB0aGVtIHdpbGwgc3VjY2VlZCBpbiBvcGVuaW5nIHRoZSBjYW1lcmEgaW4gcHJhY3RpY2UsIGRlcGVuZGluZyBvbiBleGFjdCBhY2Nlc3MKKyAqIHByaW9yaXR5IGxldmVscyBhbmQgdGltaW5nLiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgaW4gY2FzZXMgd2hlcmUgbXVsdGlwbGUKKyAqIGFwcGxpY2F0aW9ucyBtYXkgYmUgaW4gdGhlIHJlc3VtZWQgc3RhdGUgYXQgdGhlIHNhbWUgdGltZSwgYW5kIHRoZSB1c2VyIHN3aXRjaGVzCisgKiBmb2N1cyBiZXR3ZWVuIHRoZW0sIG9yIGlmIHRoZSBjdXJyZW50IGNhbWVyYS11c2luZyBhcHBsaWNhdGlvbiBtb3ZlcyBiZXR3ZWVuCisgKiBmdWxsLXNjcmVlbiBhbmQgUGljdHVyZS1pbi1QaWN0dXJlIChQaVApIHN0YXRlcy4gSW4gc3VjaCBjYXNlcywgdGhlIGNhbWVyYQorICogYXZhaWxhYmxlL3VuYXZhaWxhYmxlIGNhbGxiYWNrcyB3aWxsIG5vdCBiZSBpbnZva2VkLCBidXQgYW5vdGhlciBhcHBsaWNhdGlvbiBtYXkKKyAqIG5vdyBoYXZlIGhpZ2hlciBwcmlvcml0eSBmb3IgY2FtZXJhIGFjY2VzcyB0aGFuIHRoZSBjdXJyZW50IGNhbWVyYS11c2luZworICogYXBwbGljYXRpb24uPC9wPgorCisgKiBAcGFyYW0gY29udGV4dCBUaGUgb3B0aW9uYWwgYXBwbGljYXRpb24gY29udGV4dCBwcm92aWRlZCBieSB1c2VyIGluCisgKiAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5TGlzdGVuZXJ9LgorICovCit0eXBlZGVmIHZvaWQgKCpBQ2FtZXJhTWFuYWdlcl9BY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZENhbGxiYWNrKSh2b2lkKiBjb250ZXh0KTsKKworLyoqCisgKiBBIGxpc3RlbmVyIGZvciBjYW1lcmEgZGV2aWNlcyBiZWNvbWluZyBhdmFpbGFibGUvdW5hdmFpbGFibGUgdG8gb3BlbiBvciB3aGVuCisgKiB0aGUgY2FtZXJhIGFjY2VzcyBwZXJtaXNzaW9ucyBjaGFuZ2UuCisgKgorICogPHA+Q2FtZXJhcyBiZWNvbWUgYXZhaWxhYmxlIHdoZW4gdGhleSBhcmUgbm8gbG9uZ2VyIGluIHVzZSwgb3Igd2hlbiBhIG5ldworICogcmVtb3ZhYmxlIGNhbWVyYSBpcyBjb25uZWN0ZWQuIFRoZXkgYmVjb21lIHVuYXZhaWxhYmxlIHdoZW4gc29tZQorICogYXBwbGljYXRpb24gb3Igc2VydmljZSBzdGFydHMgdXNpbmcgYSBjYW1lcmEsIG9yIHdoZW4gYSByZW1vdmFibGUgY2FtZXJhCisgKiBpcyBkaXNjb25uZWN0ZWQuPC9wPgorICoKKyAqIEBzZWUgQUNhbWVyYU1hbmFnZXJfcmVnaXN0ZXJFeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrCisgKi8KK3R5cGVkZWYgc3RydWN0IEFDYW1lcmFNYW5hZ2VyX0V4dGVuZGVkQXZhaWxhYmlsaXR5TGlzdGVuZXIgeworICAgIC8vLworICAgIEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrcyBhdmFpbGFiaWxpdHlDYWxsYmFja3M7CisKKyAgICAvLy8gQ2FsbGVkIHdoZW4gdGhlcmUgaXMgY2FtZXJhIGFjY2VzcyBwZXJtaXNzaW9uIGNoYW5nZQorICAgIEFDYW1lcmFNYW5hZ2VyX0FjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkQ2FsbGJhY2sgb25DYW1lcmFBY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZDsKKworICAgIC8vLyBSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSwgcGxlYXNlIGVuc3VyZSB0aGF0IGFsbCBlbnRyaWVzIGFyZSBzZXQgdG8gTlVMTAorICAgIHZvaWQgKnJlc2VydmVkWzZdOworfSBBQ2FtZXJhTWFuYWdlcl9FeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrczsKKworLyoqCisgKiBSZWdpc3RlciBjYW1lcmEgZXh0ZW5kZWQgYXZhaWxhYmlsaXR5IGNhbGxiYWNrcy4KKyAqCisgKiA8cD5vbkNhbWVyYVVuYXZhaWxhYmxlIHdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyIGEgY2FtZXJhIGRldmljZSBpcyBvcGVuZWQgYnkgYW55IGNhbWVyYSBBUEkKKyAqIGNsaWVudC4gT3RoZXIgY2FtZXJhIEFQSSBjbGllbnRzIG1heSBzdGlsbCBiZSBhYmxlIHRvIG9wZW4gc3VjaCBhIGNhbWVyYSBkZXZpY2UsIGV2aWN0aW5nIHRoZQorICogZXhpc3RpbmcgY2xpZW50IGlmIHRoZXkgaGF2ZSBoaWdoZXIgcHJpb3JpdHkgdGhhbiB0aGUgZXhpc3RpbmcgY2xpZW50IG9mIGEgY2FtZXJhIGRldmljZS4KKyAqIFNlZSB7QGxpbmsgQUNhbWVyYU1hbmFnZXJfb3BlbkNhbWVyYX0gZm9yIG1vcmUgZGV0YWlscy48L3A+CisgKgorICogPHA+VGhlIGNhbGxiYWNrcyB3aWxsIGJlIGNhbGxlZCBvbiBhIGRlZGljYXRlZCB0aHJlYWQgc2hhcmVkIGFtb25nIGFsbCBBQ2FtZXJhTWFuYWdlcgorICogaW5zdGFuY2VzLjwvcD4KKyAqCisgKiA8cD5TaW5jZSB0aGlzIGNhbGxiYWNrIHdpbGwgYmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBjYW1lcmEgc2VydmljZSwgcmVtZW1iZXIgdG8gdW5yZWdpc3RlciBpdAorICogb25jZSBpdCBpcyBubyBsb25nZXIgbmVlZGVkOyBvdGhlcndpc2UgdGhlIGNhbGxiYWNrIHdpbGwgY29udGludWUgdG8gcmVjZWl2ZSBldmVudHMKKyAqIGluZGVmaW5pdGVseSBhbmQgaXQgbWF5IHByZXZlbnQgb3RoZXIgcmVzb3VyY2VzIGZyb20gYmVpbmcgcmVsZWFzZWQuIFNwZWNpZmljYWxseSwgdGhlCisgKiBjYWxsYmFja3Mgd2lsbCBiZSBpbnZva2VkIGluZGVwZW5kZW50bHkgb2YgdGhlIGdlbmVyYWwgYWN0aXZpdHkgbGlmZWN5Y2xlIGFuZCBpbmRlcGVuZGVudGx5CisgKiBvZiB0aGUgc3RhdGUgb2YgaW5kaXZpZHVhbCBBQ2FtZXJhTWFuYWdlciBpbnN0YW5jZXMuPC9wPgorICoKKyAqIEBwYXJhbSBtYW5hZ2VyIHRoZSB7QGxpbmsgQUNhbWVyYU1hbmFnZXJ9IG9mIGludGVyZXN0LgorICogQHBhcmFtIGNhbGxiYWNrIHRoZSB7QGxpbmsgQUNhbWVyYU1hbmFnZXJfRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFja3N9IHRvIGJlIHJlZ2lzdGVyZWQuCisgKgorICogQHJldHVybiA8dWw+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9PS30gaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgbWFuYWdlciBvciBjYWxsYmFjayBpcyBOVUxMLCBvcgorICogICAgICAgICAgICAgICAgICB7QUNhbWVyYU1hbmFnZXJfRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFja3Mjb25DYW1lcmFBY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZH0KKyAqICAgICAgICAgICAgICAgICAgb3Ige0FDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrcyNvbkNhbWVyYUF2YWlsYWJsZX0gb3IKKyAqICAgICAgICAgICAgICAgICAge0FDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrcyNvbkNhbWVyYVVuYXZhaWxhYmxlfSBpcyBOVUxMLjwvbGk+PC91bD4KKyAqLworY2FtZXJhX3N0YXR1c190IEFDYW1lcmFNYW5hZ2VyX3JlZ2lzdGVyRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFjaygKKyAgICAgICAgQUNhbWVyYU1hbmFnZXIqIG1hbmFnZXIsCisgICAgICAgIGNvbnN0IEFDYW1lcmFNYW5hZ2VyX0V4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2tzKiBjYWxsYmFjaykgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCisgKiBVbnJlZ2lzdGVyIGNhbWVyYSBleHRlbmRlZCBhdmFpbGFiaWxpdHkgY2FsbGJhY2tzLgorICoKKyAqIDxwPlJlbW92aW5nIGEgY2FsbGJhY2sgdGhhdCBpc24ndCByZWdpc3RlcmVkIGhhcyBubyBlZmZlY3QuPC9wPgorICoKKyAqIEBwYXJhbSBtYW5hZ2VyIHRoZSB7QGxpbmsgQUNhbWVyYU1hbmFnZXJ9IG9mIGludGVyZXN0LgorICogQHBhcmFtIGNhbGxiYWNrIHRoZSB7QGxpbmsgQUNhbWVyYU1hbmFnZXJfRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFja3N9IHRvIGJlIHVucmVnaXN0ZXJlZC4KKyAqCisgKiBAcmV0dXJuIDx1bD4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX09LfSBpZiB0aGUgbWV0aG9kIGNhbGwgc3VjY2VlZHMuPC9saT4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSfSBpZiBjYWxsYmFjaywKKyAqICAgICAgICAgICAgICAgICAge0FDYW1lcmFNYW5hZ2VyX0V4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2tzI29uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWR9CisgKiAgICAgICAgICAgICAgICAgIG9yIHtBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3Mjb25DYW1lcmFBdmFpbGFibGV9IG9yCisgKiAgICAgICAgICAgICAgICAgIHtBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3Mjb25DYW1lcmFVbmF2YWlsYWJsZX0gaXMgTlVMTC48L2xpPjwvdWw+CisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhTWFuYWdlcl91bnJlZ2lzdGVyRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFjaygKKyAgICAgICAgQUNhbWVyYU1hbmFnZXIqIG1hbmFnZXIsCisgICAgICAgIGNvbnN0IEFDYW1lcmFNYW5hZ2VyX0V4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2tzKiBjYWxsYmFjaykgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworI2lmZGVmIF9fQU5EUk9JRF9WTkRLX18KKy8qKgorICogUmV0cmlldmUgdGhlIHRhZyB2YWx1ZSwgZ2l2ZW4gdGhlIHRhZyBuYW1lIGFuZCBjYW1lcmEgaWQuCisgKiBUaGlzIG1ldGhvZCBpcyBkZXZpY2Ugc3BlY2lmaWMgc2luY2Ugc29tZSBtZXRhZGF0YSBtaWdodCBiZSBkZWZpbmVkIGJ5IGRldmljZSBtYW51ZmFjdHVyZXJzCisgKiBhbmQgbWlnaHQgb25seSBiZSBhY2Nlc3NpYmxlIGZvciBzcGVjaWZpYyBjYW1lcmFzLgorICogQHBhcmFtIG1hbmFnZXIgVGhlIHtAbGluayBBQ2FtZXJhTWFuYWdlcn0gb2YgaW50ZXJlc3QuCisgKiBAcGFyYW0gY2FtZXJhSWQgVGhlIGNhbWVyYUlkLCB3aGljaCBpcyB1c2VkIHRvIHF1ZXJ5IGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MuCisgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgdGFnIGJlaW5nIHF1ZXJpZWQuCisgKiBAcGFyYW0gdGFnIFRoZSBvdXRwdXQgdGFnIGFzc2lnbmVkIGJ5IHRoaXMgbWV0aG9kLgorICoKKyAqIEByZXR1cm4gQUNBTUVSQV9PSyBvbmx5IGlmIHRoZSBmdW5jdGlvbiBjYWxsIHdhcyBzdWNjZXNzZnVsLgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYU1hbmFnZXJfZ2V0VGFnRnJvbU5hbWUoQUNhbWVyYU1hbmFnZXIgKm1hbmFnZXIsIGNvbnN0IGNoYXIqIGNhbWVyYUlkLAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLCAvKm91dCovdWludDMyX3QgKnRhZykKKyAgICAgICAgX19JTlRST0RVQ0VEX0lOKDI5KTsKKyNlbmRpZgorCisjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI5ICovCisKIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvKiBfTkRLX0NBTUVSQV9NQU5BR0VSX0ggKi8KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGEuaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGEuaAppbmRleCBmMmFlYzk4Li45YmJmYjgzIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhLmgKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YS5oCkBAIC0zNiw2ICszNiw3IEBACiAjaWZuZGVmIF9OREtfQ0FNRVJBX01FVEFEQVRBX0gKICNkZWZpbmUgX05ES19DQU1FUkFfTUVUQURBVEFfSAogCisjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CiAKICNpbmNsdWRlICJOZGtDYW1lcmFFcnJvci5oIgpAQCAtMTkwLDcgKzE5MSw4IEBACiAgKiAgICAgICAgICAgICBvZiBpbnB1dCB0YWcgdmFsdWUuPC9saT48L3VsPgogICovCiBjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYU1ldGFkYXRhX2dldENvbnN0RW50cnkoCi0gICAgICAgIGNvbnN0IEFDYW1lcmFNZXRhZGF0YSogbWV0YWRhdGEsIHVpbnQzMl90IHRhZywgLypvdXQqL0FDYW1lcmFNZXRhZGF0YV9jb25zdF9lbnRyeSogZW50cnkpOworICAgICAgICBjb25zdCBBQ2FtZXJhTWV0YWRhdGEqIG1ldGFkYXRhLAorICAgICAgICB1aW50MzJfdCB0YWcsIC8qb3V0Ki9BQ2FtZXJhTWV0YWRhdGFfY29uc3RfZW50cnkqIGVudHJ5KSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKICAqIExpc3QgYWxsIHRoZSBlbnRyeSB0YWdzIGluIGlucHV0IHtAbGluayBBQ2FtZXJhTWV0YWRhdGF9LgpAQCAtMjA3LDcgKzIwOSw4IEBACiAgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9VTktOT1dOfSBpZiB0aGUgbWV0aG9kIGZhaWxzIGZvciBzb21lIG90aGVyIHJlYXNvbnMuPC9saT48L3VsPgogICovCiBjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYU1ldGFkYXRhX2dldEFsbFRhZ3MoCi0gICAgICAgIGNvbnN0IEFDYW1lcmFNZXRhZGF0YSogbWV0YWRhdGEsIC8qb3V0Ki9pbnQzMl90KiBudW1FbnRyaWVzLCAvKm91dCovY29uc3QgdWludDMyX3QqKiB0YWdzKTsKKyAgICAgICAgY29uc3QgQUNhbWVyYU1ldGFkYXRhKiBtZXRhZGF0YSwKKyAgICAgICAgLypvdXQqL2ludDMyX3QqIG51bUVudHJpZXMsIC8qb3V0Ki9jb25zdCB1aW50MzJfdCoqIHRhZ3MpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qKgogICogQ3JlYXRlIGEgY29weSBvZiBpbnB1dCB7QGxpbmsgQUNhbWVyYU1ldGFkYXRhfS4KQEAgLTIxOSwxNyArMjIyLDM5IEBACiAgKgogICogQHJldHVybiBhIHZhbGlkIEFDYW1lcmFNZXRhZGF0YSBwb2ludGVyIG9yIE5VTEwgaWYgdGhlIGlucHV0IG1ldGFkYXRhIGNhbm5vdCBiZSBjb3BpZWQuCiAgKi8KLUFDYW1lcmFNZXRhZGF0YSogQUNhbWVyYU1ldGFkYXRhX2NvcHkoY29uc3QgQUNhbWVyYU1ldGFkYXRhKiBzcmMpOworQUNhbWVyYU1ldGFkYXRhKiBBQ2FtZXJhTWV0YWRhdGFfY29weShjb25zdCBBQ2FtZXJhTWV0YWRhdGEqIHNyYykgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogLyoqCiAgKiBGcmVlIGEge0BsaW5rIEFDYW1lcmFNZXRhZGF0YX0gc3RydWN0dXJlLgogICoKICAqIEBwYXJhbSBtZXRhZGF0YSB0aGUge0BsaW5rIEFDYW1lcmFNZXRhZGF0YX0gdG8gYmUgZnJlZWQuCiAgKi8KLXZvaWQgQUNhbWVyYU1ldGFkYXRhX2ZyZWUoQUNhbWVyYU1ldGFkYXRhKiBtZXRhZGF0YSk7Cit2b2lkIEFDYW1lcmFNZXRhZGF0YV9mcmVlKEFDYW1lcmFNZXRhZGF0YSogbWV0YWRhdGEpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjQgKi8KIAorI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOQorCisvKioKKyAqIEhlbHBlciBmdW5jdGlvbiB0byBjaGVjayBpZiBhIGNhbWVyYSBpcyBsb2dpY2FsIG11bHRpLWNhbWVyYS4KKyAqCisgKiA8cD4gQ2hlY2sgd2hldGhlciBhIGNhbWVyYSBkZXZpY2UgaXMgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSBiYXNlZCBvbiBpdHMKKyAqIHN0YXRpYyBtZXRhZGF0YS4gSWYgaXQgaXMsIGFsc28gcmV0dXJucyBpdHMgcGh5c2ljYWwgc3ViIGNhbWVyYSBJZHMuPC9wPgorICoKKyAqIEBwYXJhbSBzdGF0aWNNZXRhZGF0YSB0aGUgc3RhdGljIG1ldGFkYXRhIG9mIHRoZSBjYW1lcmEgYmVpbmcgY2hlY2tlZC4KKyAqIEBwYXJhbSBudW1QaHlzaWNhbENhbWVyYXMgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHBoeXNpY2FsIGNhbWVyYXMuCisgKiBAcGFyYW0gcGh5c2ljYWxDYW1lcmFJZHMgcmV0dXJucyB0aGUgYXJyYXkgb2YgcGh5c2ljYWwgY2FtZXJhIElkcyBiYWNraW5nIHRoaXMgbG9naWNhbAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYSBkZXZpY2UuIE5vdGUgdGhhdCB0aGlzIHBvaW50ZXIgaXMgb25seSB2YWxpZAorICogICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgdGhlIHN0YXRpY01ldGFkYXRhIG9iamVjdC4KKyAqCisgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLCBmYWxzZSBvdGhlcndpc2UuCisgKi8KK2Jvb2wgQUNhbWVyYU1ldGFkYXRhX2lzTG9naWNhbE11bHRpQ2FtZXJhKGNvbnN0IEFDYW1lcmFNZXRhZGF0YSogc3RhdGljTWV0YWRhdGEsCisgICAgICAgIC8qb3V0Ki9zaXplX3QqIG51bVBoeXNpY2FsQ2FtZXJhcywgLypvdXQqL2NvbnN0IGNoYXIqIGNvbnN0KiogcGh5c2ljYWxDYW1lcmFJZHMpCisgICAgICAgIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKyNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjkgKi8KKwogX19FTkRfREVDTFMKIAogI2VuZGlmIC8qIF9OREtfQ0FNRVJBX01FVEFEQVRBX0ggKi8KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGFUYWdzLmggYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhVGFncy5oCmluZGV4IGJlZTFhNDYuLjdjZDgzMmEgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGFUYWdzLmgKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YVRhZ3MuaApAQCAtNzEsNiArNzEsOCBAQAogICAgIEFDQU1FUkFfREVQVEgsCiAgICAgQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQSwKICAgICBBQ0FNRVJBX0RJU1RPUlRJT05fQ09SUkVDVElPTiwKKyAgICBBQ0FNRVJBX0hFSUMsCisgICAgQUNBTUVSQV9IRUlDX0lORk8sCiAgICAgQUNBTUVSQV9TRUNUSU9OX0NPVU5ULAogCiAgICAgQUNBTUVSQV9WRU5ET1IgPSAweDgwMDAKQEAgLTExMiw2ICsxMTQsOCBAQAogICAgIEFDQU1FUkFfRElTVE9SVElPTl9DT1JSRUNUSU9OX1NUQVJUCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gQUNBTUVSQV9ESVNUT1JUSU9OX0NPUlJFQ1RJT04KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAxNiwKKyAgICBBQ0FNRVJBX0hFSUNfU1RBUlQgICAgICAgICAgICAgPSBBQ0FNRVJBX0hFSUMgICAgICAgICAgICAgIDw8IDE2LAorICAgIEFDQU1FUkFfSEVJQ19JTkZPX1NUQVJUICAgICAgICA9IEFDQU1FUkFfSEVJQ19JTkZPICAgICAgICAgPDwgMTYsCiAgICAgQUNBTUVSQV9WRU5ET1JfU1RBUlQgICAgICAgICAgID0gQUNBTUVSQV9WRU5ET1IgICAgICAgICAgICA8PCAxNgogfSBhY2FtZXJhX21ldGFkYXRhX3NlY3Rpb25fc3RhcnRfdDsKIApAQCAtMTkxMiw2ICsxOTE2LDcgQEAKICAgICAgKiAgIDxsaT5BQ2FwdHVyZVJlcXVlc3Q8L2xpPgogICAgICAqIDwvdWw+PC9wPgogICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgaXMgYWxzbyB1c2VkIGZvciBIRUlDIGltYWdlIGNhcHR1cmUuPC9wPgogICAgICAqLwogICAgIEFDQU1FUkFfSlBFR19HUFNfQ09PUkRJTkFURVMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvdWJsZVszXQogICAgICAgICAgICAgQUNBTUVSQV9KUEVHX1NUQVJULApAQCAtMTkyNyw2ICsxOTMyLDcgQEAKICAgICAgKiAgIDxsaT5BQ2FwdHVyZVJlcXVlc3Q8L2xpPgogICAgICAqIDwvdWw+PC9wPgogICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgaXMgYWxzbyB1c2VkIGZvciBIRUlDIGltYWdlIGNhcHR1cmUuPC9wPgogICAgICAqLwogICAgIEFDQU1FUkFfSlBFR19HUFNfUFJPQ0VTU0lOR19NRVRIT0QgPSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5dGUKICAgICAgICAgICAgIEFDQU1FUkFfSlBFR19TVEFSVCArIDEsCkBAIC0xOTQyLDYgKzE5NDgsNyBAQAogICAgICAqICAgPGxpPkFDYXB0dXJlUmVxdWVzdDwvbGk+CiAgICAgICogPC91bD48L3A+CiAgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBpcyBhbHNvIHVzZWQgZm9yIEhFSUMgaW1hZ2UgY2FwdHVyZS48L3A+CiAgICAgICovCiAgICAgQUNBTUVSQV9KUEVHX0dQU19USU1FU1RBTVAgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50NjQKICAgICAgICAgICAgIEFDQU1FUkFfSlBFR19TVEFSVCArIDIsCkBAIC0xOTg2LDYgKzE5OTMsMTAgQEAKICAgICAgKiA8L2NvZGU+PC9wcmU+CiAgICAgICogPHA+Rm9yIEVYVEVSTkFMIGNhbWVyYXMgdGhlIHNlbnNvciBvcmllbnRhdGlvbiB3aWxsIGFsd2F5cyBiZSBzZXQgdG8gMCBhbmQgdGhlIGZhY2luZyB3aWxsCiAgICAgICogYWxzbyBiZSBzZXQgdG8gRVhURVJOQUwuIFRoZSBhYm92ZSBjb2RlIGlzIG5vdCByZWxldmFudCBpbiBzdWNoIGNhc2UuPC9wPgorICAgICAqIDxwPlRoaXMgdGFnIGlzIGFsc28gdXNlZCB0byBkZXNjcmliZSB0aGUgb3JpZW50YXRpb24gb2YgdGhlIEhFSUMgaW1hZ2UgY2FwdHVyZSwgaW4gd2hpY2gKKyAgICAgKiBjYXNlIHRoZSByb3RhdGlvbiBpcyByZWZsZWN0ZWQgYnkKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9tZWRpYS9FeGlmSW50ZXJmYWNlLmh0bWwjVEFHX09SSUVOVEFUSU9OIj5FWElGIG9yaWVudGF0aW9uIGZsYWc8L2E+LCBhbmQgbm90IGJ5CisgICAgICogcm90YXRpbmcgdGhlIGltYWdlIGRhdGEgaXRzZWxmLjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfT1JJRU5UQVRJT04KICAgICAgKi8KQEAgLTIwMDMsNyArMjAxNCw4IEBACiAgICAgICogICA8bGk+QUNhcHR1cmVSZXF1ZXN0PC9saT4KICAgICAgKiA8L3VsPjwvcD4KICAgICAgKgotICAgICAqIDxwPjg1LTk1IGlzIHR5cGljYWwgdXNhZ2UgcmFuZ2UuPC9wPgorICAgICAqIDxwPjg1LTk1IGlzIHR5cGljYWwgdXNhZ2UgcmFuZ2UuIFRoaXMgdGFnIGlzIGFsc28gdXNlZCB0byBkZXNjcmliZSB0aGUgcXVhbGl0eQorICAgICAqIG9mIHRoZSBIRUlDIGltYWdlIGNhcHR1cmUuPC9wPgogICAgICAqLwogICAgIEFDQU1FUkFfSlBFR19RVUFMSVRZID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5dGUKICAgICAgICAgICAgIEFDQU1FUkFfSlBFR19TVEFSVCArIDQsCkBAIC0yMDE5LDYgKzIwMzEsNyBAQAogICAgICAqICAgPGxpPkFDYXB0dXJlUmVxdWVzdDwvbGk+CiAgICAgICogPC91bD48L3A+CiAgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBpcyBhbHNvIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHF1YWxpdHkgb2YgdGhlIEhFSUMgaW1hZ2UgY2FwdHVyZS48L3A+CiAgICAgICovCiAgICAgQUNBTUVSQV9KUEVHX1RIVU1CTkFJTF9RVUFMSVRZID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnl0ZQogICAgICAgICAgICAgQUNBTUVSQV9KUEVHX1NUQVJUICsgNSwKQEAgLTIwNTUsNiArMjA2OCwxMCBAQAogICAgICAqICAgb3JpZW50YXRpb24gaXMgcmVxdWVzdGVkLiBMRUdBQ1kgZGV2aWNlIHdpbGwgYWx3YXlzIHJlcG9ydCB1bnJvdGF0ZWQgdGh1bWJuYWlsCiAgICAgICogICBzaXplLjwvbGk+CiAgICAgICogPC91bD4KKyAgICAgKiA8cD5UaGUgdGFnIGlzIGFsc28gdXNlZCBhcyB0aHVtYm5haWwgc2l6ZSBmb3IgSEVJQyBpbWFnZSBmb3JtYXQgY2FwdHVyZSwgaW4gd2hpY2ggY2FzZSB0aGUKKyAgICAgKiB0aGUgdGh1bWJuYWlsIHJvdGF0aW9uIGlzIHJlZmxlY3RlZCBieQorICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0V4aWZJbnRlcmZhY2UuaHRtbCNUQUdfT1JJRU5UQVRJT04iPkVYSUYgb3JpZW50YXRpb24gZmxhZzwvYT4sIGFuZCBub3QgYnkKKyAgICAgKiByb3RhdGluZyB0aGUgdGh1bWJuYWlsIGRhdGEgaXRzZWxmLjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9KUEVHX09SSUVOVEFUSU9OCiAgICAgICovCkBAIC0yMDg4LDYgKzIxMDUsNyBAQAogICAgICAqIGFuZCB2aWNlIHZlcnNhLjwvbGk+CiAgICAgICogPGxpPkFsbCBub24tPGNvZGU+KDAsIDApPC9jb2RlPiBzaXplcyB3aWxsIGhhdmUgbm9uLXplcm8gd2lkdGhzIGFuZCBoZWlnaHRzLjwvbGk+CiAgICAgICogPC91bD4KKyAgICAgKiA8cD5UaGlzIGxpc3QgaXMgYWxzbyB1c2VkIGFzIHN1cHBvcnRlZCB0aHVtYm5haWwgc2l6ZXMgZm9yIEhFSUMgaW1hZ2UgZm9ybWF0IGNhcHR1cmUuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TCiAgICAgICovCkBAIC0yNzgzLDcgKzI4MDEsNyBAQAogICAgICAqICAge0BsaW5rIEFJTUFHRV9GT1JNQVRfUkFXMTIgUkFXMTJ9LjwvbGk+CiAgICAgICogPGxpPlByb2Nlc3NlZCAoYnV0IG5vdC1zdGFsbGluZyk6IGFueSBub24tUkFXIGZvcm1hdCB3aXRob3V0IGEgc3RhbGwgZHVyYXRpb24uICBUeXBpY2FsbHkKICAgICAgKiAgIHtAbGluayBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4IFlVVl80MjBfODg4fSwKLSAgICAgKiAgIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2dyYXBoaWNzL0ltYWdlRm9ybWF0Lmh0bWwjTlYyMSI+TlYyMTwvYT4sIG9yIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2dyYXBoaWNzL0ltYWdlRm9ybWF0Lmh0bWwjWVYxMiI+WVYxMjwvYT4uPC9saT4KKyAgICAgKiAgIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2dyYXBoaWNzL0ltYWdlRm9ybWF0Lmh0bWwjTlYyMSI+TlYyMTwvYT4sIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL2dyYXBoaWNzL0ltYWdlRm9ybWF0Lmh0bWwjWVYxMiI+WVYxMjwvYT4sIG9yIHtAbGluayBBSU1BR0VfRk9STUFUX1k4IFk4fSAuPC9saT4KICAgICAgKiA8L3VsPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TCkBAIC0zMDI4LDYgKzMwNDYsMjggQEAKICAgICAgKi8KICAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1NFU1NJT05fS0VZUyA9ICAgICAgICAgICAgICAgICAgICAvLyBpbnQzMltuXQogICAgICAgICAgICAgQUNBTUVSQV9SRVFVRVNUX1NUQVJUICsgMTYsCisgICAgLyoqCisgICAgICogPHA+QSBzdWJzZXQgb2YgdGhlIGF2YWlsYWJsZSByZXF1ZXN0IGtleXMgdGhhdCBjYW4gYmUgb3ZlcnJpZGRlbiBmb3IKKyAgICAgKiBwaHlzaWNhbCBkZXZpY2VzIGJhY2tpbmcgYSBsb2dpY2FsIG11bHRpLWNhbWVyYS48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQzMltuXTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIGlzIGEgc3Vic2V0IG9mIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUkVRVUVTVF9LRVlTIHdoaWNoIGNvbnRhaW5zIGEgbGlzdAorICAgICAqIG9mIGtleXMgdGhhdCBjYW4gYmUgb3ZlcnJpZGRlbiB1c2luZyA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvQ2FwdHVyZVJlcXVlc3QvQnVpbGRlci5odG1sI3NldFBoeXNpY2FsQ2FtZXJhS2V5Ij5CdWlsZGVyI3NldFBoeXNpY2FsQ2FtZXJhS2V5PC9hPi4KKyAgICAgKiBUaGUgcmVzcGVjdGl2ZSB2YWx1ZSBvZiBzdWNoIHJlcXVlc3Qga2V5IGNhbiBiZSBvYnRhaW5lZCBieSBjYWxsaW5nCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL0NhcHR1cmVSZXF1ZXN0L0J1aWxkZXIuaHRtbCNnZXRQaHlzaWNhbENhbWVyYUtleSI+QnVpbGRlciNnZXRQaHlzaWNhbENhbWVyYUtleTwvYT4uIENhcHR1cmUgcmVxdWVzdHMgdGhhdCBjb250YWluCisgICAgICogaW5kaXZpZHVhbCBwaHlzaWNhbCBkZXZpY2UgcmVxdWVzdHMgbXVzdCBiZSBidWlsdCB2aWEKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYURldmljZS5odG1sI2NyZWF0ZUNhcHR1cmVSZXF1ZXN0KGludCwiPlNldCk8L2E+LjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9SRVFVRVNUX0tFWVMKKyAgICAgKi8KKyAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVMgPSAgICAvLyBpbnQzMltuXQorICAgICAgICAgICAgQUNBTUVSQV9SRVFVRVNUX1NUQVJUICsgMTcsCiAgICAgQUNBTUVSQV9SRVFVRVNUX0VORCwKIAogICAgIC8qKgpAQCAtMzI1Nyw2ICszMjk3LDcgQEAKICAgICAgKiA8bGk+e0BsaW5rIEFJTUFHRV9GT1JNQVRfWVVWXzQyMF84ODggfTwvbGk+CiAgICAgICogPGxpPntAbGluayBBSU1BR0VfRk9STUFUX1JBVzEwIH08L2xpPgogICAgICAqIDxsaT57QGxpbmsgQUlNQUdFX0ZPUk1BVF9SQVcxMiB9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIEFJTUFHRV9GT1JNQVRfWTggfTwvbGk+CiAgICAgICogPC91bD4KICAgICAgKiA8cD5BbGwgb3RoZXIgZm9ybWF0cyBtYXkgb3IgbWF5IG5vdCBoYXZlIGFuIGFsbG93ZWQgc3RhbGwgZHVyYXRpb24gb24KICAgICAgKiBhIHBlci1jYXBhYmlsaXR5IGJhc2lzOyByZWZlciB0byBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUwpAQCAtMzI5NCw2ICszMzM1LDgxIEBACiAgICAgICovCiAgICAgQUNBTUVSQV9TQ0FMRVJfQ1JPUFBJTkdfVFlQRSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX2Nyb3BwaW5nX3R5cGVfdCkKICAgICAgICAgICAgIEFDQU1FUkFfU0NBTEVSX1NUQVJUICsgMTMsCisgICAgLyoqCisgICAgICogPHA+UmVjb21tZW5kZWQgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIGZvciBjb21tb24gY2xpZW50IHVzZSBjYXNlcy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQzMltuKjVdIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zY2FsZXJfYXZhaWxhYmxlX3JlY29tbWVuZGVkX3N0cmVhbV9jb25maWd1cmF0aW9uc190KTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5PcHRpb25hbCBzdWJzZXQgb2YgdGhlIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMgdGhhdCBjb250YWlucworICAgICAqIHNpbWlsYXIgdHVwbGVzIGxpc3RlZCBhcworICAgICAqIChpLmUuIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgb3V0cHV0L2lucHV0IHN0cmVhbSwgdXNlY2FzZSBiaXQgZmllbGQpLgorICAgICAqIENhbWVyYSBkZXZpY2VzIHdpbGwgYmUgYWJsZSB0byBzdWdnZXN0IHBhcnRpY3VsYXIgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIHdoaWNoIGFyZQorICAgICAqIHBvd2VyIGFuZCBwZXJmb3JtYW5jZSBlZmZpY2llbnQgZm9yIHNwZWNpZmljIHVzZSBjYXNlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQKKyAgICAgKiByZXRyaWV2aW5nIHRoZSBzdWdnZXN0aW9ucyBzZWUKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYUNoYXJhY3RlcmlzdGljcy5odG1sI2dldFJlY29tbWVuZGVkU3RyZWFtQ29uZmlndXJhdGlvbk1hcCI+Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzI2dldFJlY29tbWVuZGVkU3RyZWFtQ29uZmlndXJhdGlvbk1hcDwvYT4uPC9wPgorICAgICAqIDxwPlRoZSBkYXRhIHJlcHJlc2VudGF0aW9uIGlzIGludFs1XSwgd2hpY2ggbWFwcyB0bworICAgICAqICh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIG91dHB1dC9pbnB1dCBzdHJlYW0sIHVzZWNhc2UgYml0IGZpZWxkKS4gVGhlIGFycmF5IGNhbiBiZQorICAgICAqIHBhcnNlZCB1c2luZyB0aGUgZm9sbG93aW5nIHBzZXVkbyBjb2RlOjwvcD4KKyAgICAgKiA8cD5zdHJ1Y3QgU3RyZWFtQ29uZmlndXJhdGlvbiB7CisgICAgICogaW50MzJfdCBmb3JtYXQ7CisgICAgICogaW50MzJfdCB3aWR0aDsKKyAgICAgKiBpbnQzMl90IGhlaWdodDsKKyAgICAgKiBpbnQzMl90IGlzSW5wdXQ7IH07PC9wPgorICAgICAqIDxwPnZvaWQgZ2V0UHJlZmVycmVkU3RyZWFtQ29uZmlndXJhdGlvbnMoCisgICAgICogICAgIGludDMyX3QgKmFycmF5LCBzaXplX3QgY291bnQsIGludDMyX3QgdXNlY2FzZUlkLAorICAgICAqICAgICBWZWN0b3IgJmx0OyBTdHJlYW1Db25maWd1cmF0aW9uICZndDsgKiBzY3MpIHsKKyAgICAgKiAgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUgPSA1OworICAgICAqICAgICBjb25zdCBzaXplX3QgU1RSRUFNX1dJRFRIX09GRlNFVCA9IDA7CisgICAgICogICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fSEVJR0hUX09GRlNFVCA9IDE7CisgICAgICogICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fRk9STUFUX09GRlNFVCA9IDI7CisgICAgICogICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUID0gMzsKKyAgICAgKiAgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9VU0VDQVNFX0JJVE1BUF9PRkZTRVQgPSA0OzwvcD4KKyAgICAgKiA8cHJlPjxjb2RlPmZvciAoc2l6ZV90IGkgPSAwOyBpICZsdDsgY291bnQ7IGkrPSBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFKSB7CisgICAgICogICAgIGludDMyX3Qgd2lkdGggPSBhcnJheVtpICsgU1RSRUFNX1dJRFRIX09GRlNFVF07CisgICAgICogICAgIGludDMyX3QgaGVpZ2h0ID0gYXJyYXlbaSArIFNUUkVBTV9IRUlHSFRfT0ZGU0VUXTsKKyAgICAgKiAgICAgaW50MzJfdCBmb3JtYXQgPSBhcnJheVtpICsgU1RSRUFNX0ZPUk1BVF9PRkZTRVRdOworICAgICAqICAgICBpbnQzMl90IGlzSW5wdXQgPSBhcnJheVtpICsgU1RSRUFNX0lTX0lOUFVUX09GRlNFVF07CisgICAgICogICAgIGludDMyX3Qgc3VwcG9ydGVkVXNlY2FzZXMgPSBhcnJheVtpICsgU1RSRUFNX1VTRUNBU0VfQklUTUFQX09GRlNFVF07CisgICAgICogICAgIGlmIChzdXBwb3J0ZWRVc2VjYXNlcyAmYW1wOyAoMSAmbHQ7Jmx0OyB1c2VjYXNlSWQpKSB7CisgICAgICogICAgICAgICBTdHJlYW1Db25maWd1cmF0aW9uIHNjID0ge2Zvcm1hdCwgd2lkdGgsIGhlaWdodCwgaXNJbnB1dH07CisgICAgICogICAgICAgICBzY3MtJmd0O2FkZChzYyk7CisgICAgICogICAgIH0KKyAgICAgKiB9CisgICAgICogPC9jb2RlPjwvcHJlPgorICAgICAqIDxwPn08L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMKKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50MzJbbio1XSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX2F2YWlsYWJsZV9yZWNvbW1lbmRlZF9zdHJlYW1fY29uZmlndXJhdGlvbnNfdCkKKyAgICAgICAgICAgIEFDQU1FUkFfU0NBTEVSX1NUQVJUICsgMTQsCisgICAgLyoqCisgICAgICogPHA+UmVjb21tZW5kZWQgbWFwcGluZ3Mgb2YgaW1hZ2UgZm9ybWF0cyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhpcworICAgICAqIGNhbWVyYSBkZXZpY2UgZm9yIGlucHV0IHN0cmVhbXMsIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgb3V0cHV0IGZvcm1hdHMuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogaW50MzI8L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyBpcyBhIHJlY29tbWVuZGVkIHN1YnNldCBvZiB0aGUgY29tcGxldGUgbGlzdCBvZiBtYXBwaW5ncyBmb3VuZCBpbgorICAgICAqIGFuZHJvaWQuc2NhbGVyLmF2YWlsYWJsZUlucHV0T3V0cHV0Rm9ybWF0c01hcC4gVGhlIHNhbWUgcmVxdWlyZW1lbnRzIGFwcGx5IGhlcmUgYXMgd2VsbC4KKyAgICAgKiBUaGUgbGlzdCBob3dldmVyIGRvZXNuJ3QgbmVlZCB0byBjb250YWluIGFsbCBhdmFpbGFibGUgYW5kIHN1cHBvcnRlZCBtYXBwaW5ncy4gSW5zdGVhZCBvZgorICAgICAqIHRoaXMgZGV2ZWxvcGVycyBtdXN0IGxpc3Qgb25seSByZWNvbW1lbmRlZCBhbmQgZWZmaWNpZW50IGVudHJpZXMuCisgICAgICogSWYgc2V0LCB0aGUgaW5mb3JtYXRpb24gd2lsbCBiZSBhdmFpbGFibGUgaW4gdGhlIFpFUk9fU0hVVFRFUl9MQUcgcmVjb21tZW5kZWQgc3RyZWFtCisgICAgICogY29uZmlndXJhdGlvbiBzZWUKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYUNoYXJhY3RlcmlzdGljcy5odG1sI2dldFJlY29tbWVuZGVkU3RyZWFtQ29uZmlndXJhdGlvbk1hcCI+Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzI2dldFJlY29tbWVuZGVkU3RyZWFtQ29uZmlndXJhdGlvbk1hcDwvYT4uPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9JTlBVVF9PVVRQVVRfRk9STUFUU19NQVAgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnQzMgorICAgICAgICAgICAgQUNBTUVSQV9TQ0FMRVJfU1RBUlQgKyAxNSwKICAgICBBQ0FNRVJBX1NDQUxFUl9FTkQsCiAKICAgICAvKioKQEAgLTM0NTQsNiArMzU3MCw4IEBACiAgICAgICogPHA+U29tZSBkZXZpY2VzIG1heSBjaG9vc2UgdG8gcHJvdmlkZSBhIHNlY29uZCBzZXQgb2YgY2FsaWJyYXRpb24KICAgICAgKiBpbmZvcm1hdGlvbiBmb3IgaW1wcm92ZWQgcXVhbGl0eSwgaW5jbHVkaW5nCiAgICAgICogQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQyIGFuZCBpdHMgY29ycmVzcG9uZGluZyBtYXRyaWNlcy48L3A+CisgICAgICogPHA+U3RhcnRpbmcgZnJvbSBBbmRyb2lkIFEsIHRoaXMga2V5IHdpbGwgbm90IGJlIHByZXNlbnQgZm9yIGEgTU9OT0NIUk9NRSBjYW1lcmEsIGV2ZW4gaWYKKyAgICAgKiB0aGUgY2FtZXJhIGRldmljZSBoYXMgUkFXIGNhcGFiaWxpdHkuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9DQUxJQlJBVElPTl9UUkFOU0ZPUk0xCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9DT0xPUl9UUkFOU0ZPUk0xCkBAIC0zNDgzLDYgKzM2MDEsOCBAQAogICAgICAqIDxwPklmIHRoaXMga2V5IGlzIHByZXNlbnQsIHRoZW4gQUNBTUVSQV9TRU5TT1JfQ09MT1JfVFJBTlNGT1JNMiwKICAgICAgKiBBQ0FNRVJBX1NFTlNPUl9DQUxJQlJBVElPTl9UUkFOU0ZPUk0yLCBhbmQKICAgICAgKiBBQ0FNRVJBX1NFTlNPUl9GT1JXQVJEX01BVFJJWDIgd2lsbCBhbHNvIGJlIHByZXNlbnQuPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBldmVuIGlmCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgaGFzIFJBVyBjYXBhYmlsaXR5LjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfQ0FMSUJSQVRJT05fVFJBTlNGT1JNMgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfQ09MT1JfVFJBTlNGT1JNMgpAQCAtMzUxMCw2ICszNjMwLDggQEAKICAgICAgKiBjb2xvcnNwYWNlKSBpbnRvIHRoaXMgY2FtZXJhIGRldmljZSdzIG5hdGl2ZSBzZW5zb3IgY29sb3IKICAgICAgKiBzcGFjZSB1bmRlciB0aGUgZmlyc3QgcmVmZXJlbmNlIGlsbHVtaW5hbnQKICAgICAgKiAoQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxKS48L3A+CisgICAgICogPHA+U3RhcnRpbmcgZnJvbSBBbmRyb2lkIFEsIHRoaXMga2V5IHdpbGwgbm90IGJlIHByZXNlbnQgZm9yIGEgTU9OT0NIUk9NRSBjYW1lcmEsIGV2ZW4gaWYKKyAgICAgKiB0aGUgY2FtZXJhIGRldmljZSBoYXMgUkFXIGNhcGFiaWxpdHkuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDEKICAgICAgKi8KQEAgLTM1MzcsNiArMzY1OSw4IEBACiAgICAgICogKEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMikuPC9wPgogICAgICAqIDxwPlRoaXMgbWF0cml4IHdpbGwgb25seSBiZSBwcmVzZW50IGlmIHRoZSBzZWNvbmQgcmVmZXJlbmNlCiAgICAgICogaWxsdW1pbmFudCBpcyBwcmVzZW50LjwvcD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgorICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMgogICAgICAqLwpAQCAtMzU2NSw2ICszNjg5LDggQEAKICAgICAgKiBhbmQgdGhlIENJRSBYWVogY29sb3JzcGFjZSB3aGVuIGNhbGN1bGF0aW5nIHRoaXMgdHJhbnNmb3JtIHdpbGwKICAgICAgKiBtYXRjaCB0aGUgc3RhbmRhcmQgd2hpdGUgcG9pbnQgZm9yIHRoZSBmaXJzdCByZWZlcmVuY2UgaWxsdW1pbmFudAogICAgICAqIChpLmUuIG5vIGNocm9tYXRpYyBhZGFwdGF0aW9uIHdpbGwgYmUgYXBwbGllZCBieSB0aGlzIHRyYW5zZm9ybSkuPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBldmVuIGlmCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgaGFzIFJBVyBjYXBhYmlsaXR5LjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxCiAgICAgICovCkBAIC0zNTk1LDYgKzM3MjEsOCBAQAogICAgICAqIChpLmUuIG5vIGNocm9tYXRpYyBhZGFwdGF0aW9uIHdpbGwgYmUgYXBwbGllZCBieSB0aGlzIHRyYW5zZm9ybSkuPC9wPgogICAgICAqIDxwPlRoaXMgbWF0cml4IHdpbGwgb25seSBiZSBwcmVzZW50IGlmIHRoZSBzZWNvbmQgcmVmZXJlbmNlCiAgICAgICogaWxsdW1pbmFudCBpcyBwcmVzZW50LjwvcD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgorICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMgogICAgICAqLwpAQCAtMzYyMSw2ICszNzQ5LDggQEAKICAgICAgKiB0aGlzIG1hdHJpeCBpcyBjaG9zZW4gc28gdGhhdCB0aGUgc3RhbmRhcmQgd2hpdGUgcG9pbnQgZm9yIHRoaXMgcmVmZXJlbmNlCiAgICAgICogaWxsdW1pbmFudCBpbiB0aGUgcmVmZXJlbmNlIHNlbnNvciBjb2xvcnNwYWNlIGlzIG1hcHBlZCB0byBENTAgaW4gdGhlCiAgICAgICogQ0lFIFhZWiBjb2xvcnNwYWNlLjwvcD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgorICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMQogICAgICAqLwpAQCAtMzY0OSw2ICszNzc5LDggQEAKICAgICAgKiBDSUUgWFlaIGNvbG9yc3BhY2UuPC9wPgogICAgICAqIDxwPlRoaXMgbWF0cml4IHdpbGwgb25seSBiZSBwcmVzZW50IGlmIHRoZSBzZWNvbmQgcmVmZXJlbmNlCiAgICAgICogaWxsdW1pbmFudCBpcyBwcmVzZW50LjwvcD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgorICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMgogICAgICAqLwpAQCAtMzY4MSw2ICszODEzLDcgQEAKICAgICAgKiBsZXZlbCB2YWx1ZXMuIEZvciByYXcgY2FwdHVyZSBpbiBwYXJ0aWN1bGFyLCBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UKICAgICAgKiBwaXhlbHMgZnJvbSBBQ0FNRVJBX1NFTlNPUl9PUFRJQ0FMX0JMQUNLX1JFR0lPTlMgdG8gY2FsY3VsYXRlIGJsYWNrCiAgICAgICogbGV2ZWwgdmFsdWVzIGZvciBlYWNoIGZyYW1lLjwvcD4KKyAgICAgKiA8cD5Gb3IgYSBNT05PQ0hST01FIGNhbWVyYSBkZXZpY2UsIGFsbCBvZiB0aGUgMngyIGNoYW5uZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSB2YWx1ZXMuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9EWU5BTUlDX0JMQUNLX0xFVkVMCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVApAQCAtMzc3NSw2ICszOTA4LDggQEAKICAgICAgKiB1c2VkIHRvIGludGVycG9sYXRlIGJldHdlZW4gdGhlIHByb3ZpZGVkIGNvbG9yIHRyYW5zZm9ybXMgd2hlbgogICAgICAqIHByb2Nlc3NpbmcgcmF3IHNlbnNvciBkYXRhLjwvcD4KICAgICAgKiA8cD5UaGUgb3JkZXIgb2YgdGhlIHZhbHVlcyBpcyBSLCBHLCBCOyB3aGVyZSBSIGlzIGluIHRoZSBsb3dlc3QgaW5kZXguPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBldmVuIGlmCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgaGFzIFJBVyBjYXBhYmlsaXR5LjwvcD4KICAgICAgKi8KICAgICBBQ0FNRVJBX1NFTlNPUl9ORVVUUkFMX0NPTE9SX1BPSU5UID0gICAgICAgICAgICAgICAgICAgICAgICAvLyByYXRpb25hbFszXQogICAgICAgICAgICAgQUNBTUVSQV9TRU5TT1JfU1RBUlQgKyAxOCwKQEAgLTM4MDUsNiArMzk0MCw4IEBACiAgICAgICogdGhhdCBjaGFubmVsLjwvcD4KICAgICAgKiA8cD5BIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIG5vaXNlIG1vZGVsIGNhbiBiZSBmb3VuZCBpbiB0aGUKICAgICAgKiBBZG9iZSBETkcgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIE5vaXNlUHJvZmlsZSB0YWcuPC9wPgorICAgICAqIDxwPkZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCB0aGVyZSBpcyBvbmx5IG9uZSBjb2xvciBjaGFubmVsLiBTbyB0aGUgbm9pc2UgbW9kZWwgY29lZmZpY2llbnRzCisgICAgICogd2lsbCBvbmx5IGNvbnRhaW4gb25lIFMgYW5kIG9uZSBPLjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlQKICAgICAgKi8KQEAgLTM4NTAsNiArMzk4Nyw4IEBACiAgICAgICogPGxpPlIgJmd0OyAxLjIwIHdpbGwgcmVxdWlyZSBzdHJvbmcgc29mdHdhcmUgY29ycmVjdGlvbiB0byBwcm9kdWNlCiAgICAgICogYSB1c3VhYmxlIGltYWdlICgmZ3Q7MjAlIGRpdmVyZ2VuY2UpLjwvbGk+CiAgICAgICogPC91bD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgorICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CiAgICAgICovCiAgICAgQUNBTUVSQV9TRU5TT1JfR1JFRU5fU1BMSVQgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxvYXQKICAgICAgICAgICAgIEFDQU1FUkFfU0VOU09SX1NUQVJUICsgMjIsCkBAIC00MDAyLDYgKzQxNDEsNyBAQAogICAgICAqIGxheW91dCBrZXkgKHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVCksIGkuZS4gdGhlCiAgICAgICogbnRoIHZhbHVlIGdpdmVuIGNvcnJlc3BvbmRzIHRvIHRoZSBibGFjayBsZXZlbCBvZmZzZXQgZm9yIHRoZSBudGgKICAgICAgKiBjb2xvciBjaGFubmVsIGxpc3RlZCBpbiB0aGUgQ0ZBLjwvcD4KKyAgICAgKiA8cD5Gb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgYWxsIG9mIHRoZSAyeDIgY2hhbm5lbHMgbXVzdCBoYXZlIHRoZSBzYW1lIHZhbHVlcy48L3A+CiAgICAgICogPHA+VGhpcyBrZXkgd2lsbCBiZSBhdmFpbGFibGUgaWYgQUNBTUVSQV9TRU5TT1JfT1BUSUNBTF9CTEFDS19SRUdJT05TIGlzIGF2YWlsYWJsZSBvciB0aGUKICAgICAgKiBjYW1lcmEgZGV2aWNlIGFkdmVydGlzZXMgdGhpcyBrZXkgdmlhIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1JFU1VMVF9LRVlTIH0uPC9wPgogICAgICAqCkBAIC00MTA0LDcgKzQyNDQsOCBAQAogICAgIC8qKgogICAgICAqIDxwPlRoZSBhcnJhbmdlbWVudCBvZiBjb2xvciBmaWx0ZXJzIG9uIHNlbnNvcjsKICAgICAgKiByZXByZXNlbnRzIHRoZSBjb2xvcnMgaW4gdGhlIHRvcC1sZWZ0IDJ4MiBzZWN0aW9uIG9mCi0gICAgICogdGhlIHNlbnNvciwgaW4gcmVhZGluZyBvcmRlci48L3A+CisgICAgICogdGhlIHNlbnNvciwgaW4gcmVhZGluZyBvcmRlciwgZm9yIGEgQmF5ZXIgY2FtZXJhLCBvciB0aGUKKyAgICAgKiBsaWdodCBzcGVjdHJ1bSBpdCBjYXB0dXJlcyBmb3IgTU9OT0NIUk9NRSBjYW1lcmEuPC9wPgogICAgICAqCiAgICAgICogPHA+VHlwZTogYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2Vuc29yX2luZm9fY29sb3JfZmlsdGVyX2FycmFuZ2VtZW50X3QpPC9wPgogICAgICAqCkBAIC00NTczLDEzICs0NzE0LDEzIEBACiAgICAgICogKHgseSkgz7UgKDAgLi4uIE4tMSwgMCAuLi4gTS0xKSBpcyB0aGUgdmFsdWUgb2YgdGhlIHNoYWRpbmcgbWFwIGF0CiAgICAgICogcGl4ZWwgKCAoKFctMSkvKE4tMSkpICogeCwgKChILTEpLyhNLTEpKSAqIHkpIGZvciB0aGUgZm91ciBjb2xvciBjaGFubmVscy4KICAgICAgKiBUaGUgbWFwIGlzIGFzc3VtZWQgdG8gYmUgYmlsaW5lYXJseSBpbnRlcnBvbGF0ZWQgYmV0d2VlbiB0aGUgc2FtcGxlIHBvaW50cy48L3A+Ci0gICAgICogPHA+VGhlIGNoYW5uZWwgb3JkZXIgaXMgW1IsIEdldmVuLCBHb2RkLCBCXSwgd2hlcmUgR2V2ZW4gaXMgdGhlIGdyZWVuCi0gICAgICogY2hhbm5lbCBmb3IgdGhlIGV2ZW4gcm93cyBvZiBhIEJheWVyIHBhdHRlcm4sIGFuZCBHb2RkIGlzIHRoZSBvZGQgcm93cy4KKyAgICAgKiA8cD5Gb3IgYSBCYXllciBjYW1lcmEsIHRoZSBjaGFubmVsIG9yZGVyIGlzIFtSLCBHZXZlbiwgR29kZCwgQl0sIHdoZXJlIEdldmVuIGlzCisgICAgICogdGhlIGdyZWVuIGNoYW5uZWwgZm9yIHRoZSBldmVuIHJvd3Mgb2YgYSBCYXllciBwYXR0ZXJuLCBhbmQgR29kZCBpcyB0aGUgb2RkIHJvd3MuCiAgICAgICogVGhlIHNoYWRpbmcgbWFwIGlzIHN0b3JlZCBpbiBhIGZ1bGx5IGludGVybGVhdmVkIGZvcm1hdCwgYW5kIGl0cyBzaXplCiAgICAgICogaXMgcHJvdmlkZWQgaW4gdGhlIGNhbWVyYSBzdGF0aWMgbWV0YWRhdGEgYnkgQUNBTUVSQV9MRU5TX0lORk9fU0hBRElOR19NQVBfU0laRS48L3A+CiAgICAgICogPHA+VGhlIHNoYWRpbmcgbWFwIHdpbGwgZ2VuZXJhbGx5IGhhdmUgb24gdGhlIG9yZGVyIG9mIDMwLTQwIHJvd3MgYW5kIGNvbHVtbnMsCiAgICAgICogYW5kIHdpbGwgYmUgc21hbGxlciB0aGFuIDY0eDY0LjwvcD4KLSAgICAgKiA8cD5BcyBhbiBleGFtcGxlLCBnaXZlbiBhIHZlcnkgc21hbGwgbWFwIGRlZmluZWQgYXM6PC9wPgorICAgICAqIDxwPkFzIGFuIGV4YW1wbGUsIGdpdmVuIGEgdmVyeSBzbWFsbCBtYXAgZm9yIGEgQmF5ZXIgY2FtZXJhIGRlZmluZWQgYXM6PC9wPgogICAgICAqIDxwcmU+PGNvZGU+QUNBTUVSQV9MRU5TX0lORk9fU0hBRElOR19NQVBfU0laRSA9IFsgNCwgMyBdCiAgICAgICogQUNBTUVSQV9TVEFUSVNUSUNTX0xFTlNfU0hBRElOR19NQVAgPQogICAgICAqIFsgMS4zLCAxLjIsIDEuMTUsIDEuMiwgIDEuMiwgMS4yLCAxLjE1LCAxLjIsCkBAIC00NTk5LDYgKzQ3NDAsMTcgQEAKICAgICAgKiBpbWFnZSBvZiBhIGdyYXkgd2FsbCAodXNpbmcgYmljdWJpYyBpbnRlcnBvbGF0aW9uIGZvciB2aXN1YWwgcXVhbGl0eSkKICAgICAgKiBhcyBjYXB0dXJlZCBieSB0aGUgc2Vuc29yIGdpdmVzOjwvcD4KICAgICAgKiA8cD48aW1nIGFsdD0iSW1hZ2Ugb2YgYSB1bmlmb3JtIHdoaXRlIHdhbGwgKGludmVyc2Ugc2hhZGluZyBtYXApIiBzcmM9Ii4uL2ltYWdlcy9jYW1lcmEyL21ldGFkYXRhL2FuZHJvaWQuc3RhdGlzdGljcy5sZW5zU2hhZGluZ01hcC9pbnZfc2hhZGluZy5wbmciIC8+PC9wPgorICAgICAqIDxwPkZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBhbGwgb2YgdGhlIDJ4MiBjaGFubmVscyBtdXN0IGhhdmUgdGhlIHNhbWUgdmFsdWVzLiBBbiBleGFtcGxlCisgICAgICogc2hhZGluZyBtYXAgZm9yIHN1Y2ggYSBjYW1lcmEgaXMgZGVmaW5lZCBhczo8L3A+CisgICAgICogPHByZT48Y29kZT5BQ0FNRVJBX0xFTlNfSU5GT19TSEFESU5HX01BUF9TSVpFID0gWyA0LCAzIF0KKyAgICAgKiBBQ0FNRVJBX1NUQVRJU1RJQ1NfTEVOU19TSEFESU5HX01BUCA9CisgICAgICogWyAxLjMsIDEuMywgMS4zLCAxLjMsICAxLjIsIDEuMiwgMS4yLCAxLjIsCisgICAgICogICAgIDEuMSwgMS4xLCAxLjEsIDEuMSwgIDEuMywgMS4zLCAxLjMsIDEuMywKKyAgICAgKiAgIDEuMiwgMS4yLCAxLjIsIDEuMiwgIDEuMSwgMS4xLCAxLjEsIDEuMSwKKyAgICAgKiAgICAgMS4wLCAxLjAsIDEuMCwgMS4wLCAgMS4yLCAxLjIsIDEuMiwgMS4yLAorICAgICAqICAgMS4zLCAxLjMsIDEuMywgMS4zLCAgIDEuMiwgMS4yLCAxLjIsIDEuMiwKKyAgICAgKiAgICAgMS4yLCAxLjIsIDEuMiwgMS4yLCAgMS4zLCAxLjMsIDEuMywgMS4zIF0KKyAgICAgKiA8L2NvZGU+PC9wcmU+CiAgICAgICogPHA+Tm90ZSB0aGF0IHRoZSBSQVcgaW1hZ2UgZGF0YSBtaWdodCBiZSBzdWJqZWN0IHRvIGxlbnMgc2hhZGluZwogICAgICAqIGNvcnJlY3Rpb24gbm90IHJlcG9ydGVkIG9uIHRoaXMgbWFwLiBRdWVyeQogICAgICAqIEFDQU1FUkFfU0VOU09SX0lORk9fTEVOU19TSEFESU5HX0FQUExJRUQgdG8gc2VlIGlmIFJBVyBpbWFnZSBkYXRhIGhhcyBzdWJqZWN0CkBAIC00OTQyLDggKzUwOTQsOCBAQAogICAgICAqIG9mIHBvaW50cyBjYW4gYmUgbGVzcyB0aGFuIG1heCAodGhhdCBpcywgdGhlIHJlcXVlc3QgZG9lc24ndCBoYXZlIHRvCiAgICAgICogYWx3YXlzIHByb3ZpZGUgYSBjdXJ2ZSB3aXRoIG51bWJlciBvZiBwb2ludHMgZXF1aXZhbGVudCB0bwogICAgICAqIEFDQU1FUkFfVE9ORU1BUF9NQVhfQ1VSVkVfUE9JTlRTKS48L3A+Ci0gICAgICogPHA+Rm9yIGRldmljZXMgd2l0aCBNT05PQ0hST01FIGNhcGFiaWxpdHksIG9ubHkgcmVkIGNoYW5uZWwgaXMgdXNlZC4gR3JlZW4gYW5kIGJsdWUgY2hhbm5lbHMKLSAgICAgKiBhcmUgaWdub3JlZC48L3A+CisgICAgICogPHA+Rm9yIGRldmljZXMgd2l0aCBNT05PQ0hST01FIGNhcGFiaWxpdHksIGFsbCB0aHJlZSBjaGFubmVscyBtdXN0IGhhdmUgdGhlIHNhbWUgc2V0IG9mCisgICAgICogY29udHJvbCBwb2ludHMuPC9wPgogICAgICAqIDxwPkEgZmV3IGV4YW1wbGVzLCBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBncmFwaGljYWwgbWFwcGluZ3M7IHRoZXNlCiAgICAgICogb25seSBzcGVjaWZ5IHRoZSByZWQgY2hhbm5lbCBhbmQgdGhlIHByZWNpc2lvbiBpcyBsaW1pdGVkIHRvIDQKICAgICAgKiBkaWdpdHMsIGZvciBjb25jaXNlbmVzcy48L3A+CkBAIC01NDE3LDkgKzU1NjksMTIxIEBACiAgICAgICovCiAgICAgQUNBTUVSQV9ERVBUSF9ERVBUSF9JU19FWENMVVNJVkUgPSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfZGVwdGhfZGVwdGhfaXNfZXhjbHVzaXZlX3QpCiAgICAgICAgICAgICBBQ0FNRVJBX0RFUFRIX1NUQVJUICsgNCwKKyAgICAvKioKKyAgICAgKiA8cD5SZWNvbW1lbmRlZCBkZXB0aCBzdHJlYW0gY29uZmlndXJhdGlvbnMgZm9yIGNvbW1vbiBjbGllbnQgdXNlIGNhc2VzLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGludDMyW24qNV08L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+T3B0aW9uYWwgc3Vic2V0IG9mIHRoZSBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlMgdGhhdAorICAgICAqIGNvbnRhaW5zIHNpbWlsYXIgdHVwbGVzIGxpc3RlZCBhcworICAgICAqIChpLmUuIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgb3V0cHV0L2lucHV0IHN0cmVhbSwgdXNlY2FzZSBiaXQgZmllbGQpLgorICAgICAqIENhbWVyYSBkZXZpY2VzIHdpbGwgYmUgYWJsZSB0byBzdWdnZXN0IHBhcnRpY3VsYXIgZGVwdGggc3RyZWFtIGNvbmZpZ3VyYXRpb25zIHdoaWNoIGFyZQorICAgICAqIHBvd2VyIGFuZCBwZXJmb3JtYW5jZSBlZmZpY2llbnQgZm9yIHNwZWNpZmljIHVzZSBjYXNlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQKKyAgICAgKiByZXRyaWV2aW5nIHRoZSBzdWdnZXN0aW9ucyBzZWUKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYUNoYXJhY3RlcmlzdGljcy5odG1sI2dldFJlY29tbWVuZGVkU3RyZWFtQ29uZmlndXJhdGlvbk1hcCI+Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzI2dldFJlY29tbWVuZGVkU3RyZWFtQ29uZmlndXJhdGlvbk1hcDwvYT4uPC9wPgorICAgICAqIDxwPkZvciBkYXRhIHJlcHJlc2VudGF0aW9uIHBsZWFzZSByZWZlciB0bworICAgICAqIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlM8L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUworICAgICAqIEBzZWUgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OUworICAgICAqLworICAgIEFDQU1FUkFfREVQVEhfQVZBSUxBQkxFX1JFQ09NTUVOREVEX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUyA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludDMyW24qNV0KKyAgICAgICAgICAgIEFDQU1FUkFfREVQVEhfU1RBUlQgKyA1LAorICAgIC8qKgorICAgICAqIDxwPlRoZSBhdmFpbGFibGUgZHluYW1pYyBkZXB0aCBkYXRhc3BhY2Ugc3RyZWFtCisgICAgICogY29uZmlndXJhdGlvbnMgdGhhdCB0aGlzIGNhbWVyYSBkZXZpY2Ugc3VwcG9ydHMKKyAgICAgKiAoaS5lLiBmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIG91dHB1dC9pbnB1dCBzdHJlYW0pLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGludDMyW24qNF0gKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2RlcHRoX2F2YWlsYWJsZV9keW5hbWljX2RlcHRoX3N0cmVhbV9jb25maWd1cmF0aW9uc190KTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGVzZSBhcmUgb3V0cHV0IHN0cmVhbSBjb25maWd1cmF0aW9ucyBmb3IgdXNlIHdpdGgKKyAgICAgKiBkYXRhU3BhY2UgRFlOQU1JQ19ERVBUSC4gVGhlIGNvbmZpZ3VyYXRpb25zIGFyZQorICAgICAqIGxpc3RlZCBhcyA8Y29kZT4oZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBpbnB1dD8pPC9jb2RlPiB0dXBsZXMuPC9wPgorICAgICAqIDxwPk9ubHkgZGV2aWNlcyB0aGF0IHN1cHBvcnQgZGVwdGggb3V0cHV0IGZvciBhdCBsZWFzdAorICAgICAqIHRoZSBIQUxfUElYRUxfRk9STUFUX1kxNiBkZW5zZSBkZXB0aCBtYXAgYWxvbmcgd2l0aAorICAgICAqIEhBTF9QSVhFTF9GT1JNQVRfQkxPQiB3aXRoIHRoZSBzYW1lIHNpemUgb3Igc2l6ZSB3aXRoCisgICAgICogdGhlIHNhbWUgYXNwZWN0IHJhdGlvIGNhbiBoYXZlIGR5bmFtaWMgZGVwdGggZGF0YXNwYWNlCisgICAgICogc3RyZWFtIGNvbmZpZ3VyYXRpb24uIEFDQU1FUkFfREVQVEhfREVQVEhfSVNfRVhDTFVTSVZFIGFsc28KKyAgICAgKiBuZWVkcyB0byBiZSBzZXQgdG8gRkFMU0UuPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX0RFUFRIX0RFUFRIX0lTX0VYQ0xVU0lWRQorICAgICAqLworICAgIEFDQU1FUkFfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50MzJbbio0XSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfZGVwdGhfYXZhaWxhYmxlX2R5bmFtaWNfZGVwdGhfc3RyZWFtX2NvbmZpZ3VyYXRpb25zX3QpCisgICAgICAgICAgICBBQ0FNRVJBX0RFUFRIX1NUQVJUICsgNiwKKyAgICAvKioKKyAgICAgKiA8cD5UaGlzIGxpc3RzIHRoZSBtaW5pbXVtIGZyYW1lIGR1cmF0aW9uIGZvciBlYWNoCisgICAgICogZm9ybWF0L3NpemUgY29tYmluYXRpb24gZm9yIGR5bmFtaWMgZGVwdGggb3V0cHV0IHN0cmVhbXMuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogaW50NjRbNCpuXTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHNob3VsZCBjb3JyZXNwb25kIHRvIHRoZSBmcmFtZSBkdXJhdGlvbiB3aGVuIG9ubHkgdGhhdAorICAgICAqIHN0cmVhbSBpcyBhY3RpdmUsIHdpdGggYWxsIHByb2Nlc3NpbmcgKHR5cGljYWxseSBpbiBhbmRyb2lkLioubW9kZSkKKyAgICAgKiBzZXQgdG8gZWl0aGVyIE9GRiBvciBGQVNULjwvcD4KKyAgICAgKiA8cD5XaGVuIG11bHRpcGxlIHN0cmVhbXMgYXJlIHVzZWQgaW4gYSByZXF1ZXN0LCB0aGUgbWluaW11bSBmcmFtZQorICAgICAqIGR1cmF0aW9uIHdpbGwgYmUgbWF4KGluZGl2aWR1YWwgc3RyZWFtIG1pbiBkdXJhdGlvbnMpLjwvcD4KKyAgICAgKiA8cD5UaGUgbWluaW11bSBmcmFtZSBkdXJhdGlvbiBvZiBhIHN0cmVhbSAob2YgYSBwYXJ0aWN1bGFyIGZvcm1hdCwgc2l6ZSkKKyAgICAgKiBpcyB0aGUgc2FtZSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHN0cmVhbSBpcyBpbnB1dCBvciBvdXRwdXQuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OUyA9IC8vIGludDY0WzQqbl0KKyAgICAgICAgICAgIEFDQU1FUkFfREVQVEhfU1RBUlQgKyA3LAorICAgIC8qKgorICAgICAqIDxwPlRoaXMgbGlzdHMgdGhlIG1heGltdW0gc3RhbGwgZHVyYXRpb24gZm9yIGVhY2gKKyAgICAgKiBvdXRwdXQgZm9ybWF0L3NpemUgY29tYmluYXRpb24gZm9yIGR5bmFtaWMgZGVwdGggc3RyZWFtcy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQ2NFs0Km5dPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPkEgc3RhbGwgZHVyYXRpb24gaXMgaG93IG11Y2ggZXh0cmEgdGltZSB3b3VsZCBnZXQgYWRkZWQKKyAgICAgKiB0byB0aGUgbm9ybWFsIG1pbmltdW0gZnJhbWUgZHVyYXRpb24gZm9yIGEgcmVwZWF0aW5nIHJlcXVlc3QKKyAgICAgKiB0aGF0IGhhcyBzdHJlYW1zIHdpdGggbm9uLXplcm8gc3RhbGwuPC9wPgorICAgICAqIDxwPkFsbCBkeW5hbWljIGRlcHRoIG91dHB1dCBzdHJlYW1zIG1heSBoYXZlIGEgbm9uemVybyBzdGFsbAorICAgICAqIGR1cmF0aW9uLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUQUxMX0RVUkFUSU9OUyA9ICAgICAvLyBpbnQ2NFs0Km5dCisgICAgICAgICAgICBBQ0FNRVJBX0RFUFRIX1NUQVJUICsgOCwKICAgICBBQ0FNRVJBX0RFUFRIX0VORCwKIAogICAgIC8qKgorICAgICAqIDxwPlN0cmluZyBjb250YWluaW5nIHRoZSBpZHMgb2YgdGhlIHVuZGVybHlpbmcgcGh5c2ljYWwgY2FtZXJhcy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBieXRlW25dPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPkZvciBhIGxvZ2ljYWwgY2FtZXJhLCB0aGlzIGlzIGNvbmNhdGVuYXRpb24gb2YgYWxsIHVuZGVybHlpbmcgcGh5c2ljYWwgY2FtZXJhIElEcy4KKyAgICAgKiBUaGUgbnVsbCB0ZXJtaW5hdG9yIGZvciBwaHlzaWNhbCBjYW1lcmEgSUQgbXVzdCBiZSBwcmVzZXJ2ZWQgc28gdGhhdCB0aGUgd2hvbGUgc3RyaW5nCisgICAgICogY2FuIGJlIHRva2VuaXplZCB1c2luZyAnXDAnIHRvIGdlbmVyYXRlIGxpc3Qgb2YgcGh5c2ljYWwgY2FtZXJhIElEcy48L3A+CisgICAgICogPHA+Rm9yIGV4YW1wbGUsIGlmIHRoZSBwaHlzaWNhbCBjYW1lcmEgSURzIG9mIHRoZSBsb2dpY2FsIGNhbWVyYSBhcmUgIjIiIGFuZCAiMyIsIHRoZQorICAgICAqIHZhbHVlIG9mIHRoaXMgdGFnIHdpbGwgYmUgWycyJywgJ1wwJywgJzMnLCAnXDAnXS48L3A+CisgICAgICogPHA+VGhlIG51bWJlciBvZiBwaHlzaWNhbCBjYW1lcmEgSURzIG11c3QgYmUgbm8gbGVzcyB0aGFuIDIuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfUEhZU0lDQUxfSURTID0gICAgICAgICAgICAgICAgIC8vIGJ5dGVbbl0KKyAgICAgICAgICAgIEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfU1RBUlQsCisgICAgLyoqCiAgICAgICogPHA+VGhlIGFjY3VyYWN5IG9mIGZyYW1lIHRpbWVzdGFtcCBzeW5jaHJvbml6YXRpb24gYmV0d2VlbiBwaHlzaWNhbCBjYW1lcmFzPC9wPgogICAgICAqCiAgICAgICogPHA+VHlwZTogYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfbG9naWNhbF9tdWx0aV9jYW1lcmFfc2Vuc29yX3N5bmNfdHlwZV90KTwvcD4KQEAgLTU0MzcsOSArNTcwMSwzNyBAQAogICAgICAqIDxwPkluIGJvdGggY2FzZXMsIGFsbCBpbWFnZXMgZ2VuZXJhdGVkIGZvciBhIHBhcnRpY3VsYXIgY2FwdHVyZSByZXF1ZXN0IHN0aWxsIGNhcnJ5IHRoZSBzYW1lCiAgICAgICogdGltZXN0YW1wcywgc28gdGhhdCB0aGV5IGNhbiBiZSB1c2VkIHRvIGxvb2sgdXAgdGhlIG1hdGNoaW5nIGZyYW1lIG51bWJlciBhbmQKICAgICAgKiBvbkNhcHR1cmVTdGFydGVkIGNhbGxiYWNrLjwvcD4KKyAgICAgKiA8cD5UaGlzIHRhZyBpcyBvbmx5IGFwcGxpY2FibGUgaWYgdGhlIGxvZ2ljYWwgY2FtZXJhIGRldmljZSBzdXBwb3J0cyBjb25jdXJyZW50IHBoeXNpY2FsCisgICAgICogc3RyZWFtcyBmcm9tIGRpZmZlcmVudCBwaHlzaWNhbCBjYW1lcmFzLjwvcD4KICAgICAgKi8KICAgICBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1NFTlNPUl9TWU5DX1RZUEUgPSAgICAgICAgICAgICAvLyBieXRlIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9sb2dpY2FsX211bHRpX2NhbWVyYV9zZW5zb3Jfc3luY190eXBlX3QpCiAgICAgICAgICAgICBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1NUQVJUICsgMSwKKyAgICAvKioKKyAgICAgKiA8cD5TdHJpbmcgY29udGFpbmluZyB0aGUgSUQgb2YgdGhlIHVuZGVybHlpbmcgYWN0aXZlIHBoeXNpY2FsIGNhbWVyYS48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBieXRlPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgY2FsbGJhY2tzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoZSBJRCBvZiB0aGUgYWN0aXZlIHBoeXNpY2FsIGNhbWVyYSB0aGF0J3MgYmFja2luZyB0aGUgbG9naWNhbCBjYW1lcmEuIEFsbCBjYW1lcmEKKyAgICAgKiBzdHJlYW1zIGFuZCBtZXRhZGF0YSB0aGF0IGFyZSBub3QgcGh5c2ljYWwgY2FtZXJhIHNwZWNpZmljIHdpbGwgYmUgb3JpZ2luYXRpbmcgZnJvbSB0aGlzCisgICAgICogcGh5c2ljYWwgY2FtZXJhLjwvcD4KKyAgICAgKiA8cD5Gb3IgYSBsb2dpY2FsIGNhbWVyYSBtYWRlIHVwIG9mIHBoeXNpY2FsIGNhbWVyYXMgd2hlcmUgZWFjaCBjYW1lcmEncyBsZW5zZXMgaGF2ZQorICAgICAqIGRpZmZlcmVudCBjaGFyYWN0ZXJpc3RpY3MsIHRoZSBjYW1lcmEgZGV2aWNlIG1heSBjaG9vc2UgdG8gc3dpdGNoIGJldHdlZW4gdGhlIHBoeXNpY2FsCisgICAgICogY2FtZXJhcyB3aGVuIGFwcGxpY2F0aW9uIGNoYW5nZXMgRk9DQUxfTEVOR1RIIG9yIFNDQUxFUl9DUk9QX1JFR0lPTi4KKyAgICAgKiBBdCB0aGUgdGltZSBvZiBsZW5zIHN3aXRjaCwgdGhpcyByZXN1bHQgbWV0YWRhdGEgcmVmbGVjdHMgdGhlIG5ldyBhY3RpdmUgcGh5c2ljYWwgY2FtZXJhCisgICAgICogSUQuPC9wPgorICAgICAqIDxwPlRoaXMga2V5IHdpbGwgYmUgYXZhaWxhYmxlIGlmIHRoZSBjYW1lcmEgZGV2aWNlIGFkdmVydGlzZXMgdGhpcyBrZXkgdmlhIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1JFU1VMVF9LRVlTIH0uCisgICAgICogV2hlbiBhdmFpbGFibGUsIHRoaXMgbXVzdCBiZSBvbmUgb2YgdmFsaWQgcGh5c2ljYWwgSURzIGJhY2tpbmcgdGhpcyBsb2dpY2FsIG11bHRpLWNhbWVyYS4KKyAgICAgKiBJZiB0aGlzIGtleSBpcyBub3QgYXZhaWxhYmxlIGZvciBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLCB0aGUgY2FtZXJhIGRldmljZSBpbXBsZW1lbnRhdGlvbgorICAgICAqIG1heSBzdGlsbCBzd2l0Y2ggYmV0d2VlbiBkaWZmZXJlbnQgYWN0aXZlIHBoeXNpY2FsIGNhbWVyYXMgYmFzZWQgb24gdXNlIGNhc2UsIGJ1dCB0aGUKKyAgICAgKiBjdXJyZW50IGFjdGl2ZSBwaHlzaWNhbCBjYW1lcmEgaW5mb3JtYXRpb24gd29uJ3QgYmUgYXZhaWxhYmxlIHRvIHRoZSBhcHBsaWNhdGlvbi48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9BQ1RJVkVfUEhZU0lDQUxfSUQgPSAgICAgICAgICAgLy8gYnl0ZQorICAgICAgICAgICAgQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9TVEFSVCArIDIsCiAgICAgQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9FTkQsCiAKICAgICAvKioKQEAgLTU0NjMsOCArNTc1NSw4IEBACiAgICAgICogd2lsbCBub3Qgc2xvdyBkb3duIGNhcHR1cmUgcmF0ZSB3aGVuIGFwcGx5aW5nIGNvcnJlY3Rpb24uIEZBU1QgbWF5IGJlIHRoZSBzYW1lIGFzIE9GRiBpZgogICAgICAqIGFueSBjb3JyZWN0aW9uIGF0IGFsbCB3b3VsZCBzbG93IGRvd24gY2FwdHVyZSByYXRlLiAgRXZlcnkgb3V0cHV0IHN0cmVhbSB3aWxsIGhhdmUgYQogICAgICAqIHNpbWlsYXIgYW1vdW50IG9mIGVuaGFuY2VtZW50IGFwcGxpZWQuPC9wPgotICAgICAqIDxwPlRoZSBjb3JyZWN0aW9uIG9ubHkgYXBwbGllcyB0byBwcm9jZXNzZWQgb3V0cHV0cyBzdWNoIGFzIFlVViwgSlBFRywgb3IgREVQVEgxNjsgaXQgaXMgbm90Ci0gICAgICogYXBwbGllZCB0byBhbnkgUkFXIG91dHB1dC48L3A+CisgICAgICogPHA+VGhlIGNvcnJlY3Rpb24gb25seSBhcHBsaWVzIHRvIHByb2Nlc3NlZCBvdXRwdXRzIHN1Y2ggYXMgWVVWLCBZOCwgSlBFRywgb3IgREVQVEgxNjsgaXQgaXMKKyAgICAgKiBub3QgYXBwbGllZCB0byBhbnkgUkFXIG91dHB1dC48L3A+CiAgICAgICogPHA+VGhpcyBjb250cm9sIHdpbGwgYmUgb24gYnkgZGVmYXVsdCBvbiBkZXZpY2VzIHRoYXQgc3VwcG9ydCB0aGlzIGNvbnRyb2wuIEFwcGxpY2F0aW9ucwogICAgICAqIGRpc2FibGluZyBkaXN0b3J0aW9uIGNvcnJlY3Rpb24gbmVlZCB0byBwYXkgZXh0cmEgYXR0ZW50aW9uIHdpdGggdGhlIGNvb3JkaW5hdGUgc3lzdGVtIG9mCiAgICAgICogbWV0ZXJpbmcgcmVnaW9ucywgY3JvcCByZWdpb24sIGFuZCBmYWNlIHJlY3RhbmdsZXMuIFdoZW4gZGlzdG9ydGlvbiBjb3JyZWN0aW9uIGlzIE9GRiwKQEAgLTU1MTcsNiArNTgwOSw4MCBAQAogICAgICAgICAgICAgQUNBTUVSQV9ESVNUT1JUSU9OX0NPUlJFQ1RJT05fU1RBUlQgKyAxLAogICAgIEFDQU1FUkFfRElTVE9SVElPTl9DT1JSRUNUSU9OX0VORCwKIAorICAgIC8qKgorICAgICAqIDxwPlRoZSBhdmFpbGFibGUgSEVJQyAoSVNPL0lFQyAyMzAwOC0xMikgc3RyZWFtCisgICAgICogY29uZmlndXJhdGlvbnMgdGhhdCB0aGlzIGNhbWVyYSBkZXZpY2Ugc3VwcG9ydHMKKyAgICAgKiAoaS5lLiBmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIG91dHB1dC9pbnB1dCBzdHJlYW0pLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGludDMyW24qNF0gKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2hlaWNfYXZhaWxhYmxlX2hlaWNfc3RyZWFtX2NvbmZpZ3VyYXRpb25zX3QpPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoZSBjb25maWd1cmF0aW9ucyBhcmUgbGlzdGVkIGFzIDxjb2RlPihmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGlucHV0Pyk8L2NvZGU+IHR1cGxlcy48L3A+CisgICAgICogPHA+SWYgdGhlIGNhbWVyYSBkZXZpY2Ugc3VwcG9ydHMgSEVJQyBpbWFnZSBmb3JtYXQsIGl0IHdpbGwgc3VwcG9ydCBpZGVudGljYWwgc2V0IG9mIHN0cmVhbQorICAgICAqIGNvbWJpbmF0aW9ucyBpbnZvbHZpbmcgSEVJQyBpbWFnZSBmb3JtYXQsIGNvbXBhcmVkIHRvIHRoZSBjb21iaW5hdGlvbnMgaW52b2x2aW5nIEpQRUcKKyAgICAgKiBpbWFnZSBmb3JtYXQgYXMgcmVxdWlyZWQgYnkgdGhlIGRldmljZSdzIGhhcmR3YXJlIGxldmVsIGFuZCBjYXBhYmlsaXRpZXMuPC9wPgorICAgICAqIDxwPkFsbCB0aGUgc3RhdGljLCBjb250cm9sLCBhbmQgZHluYW1pYyBtZXRhZGF0YSB0YWdzIHJlbGF0ZWQgdG8gSlBFRyBhcHBseSB0byBIRUlDIGZvcm1hdHMuCisgICAgICogQ29uZmlndXJpbmcgSlBFRyBhbmQgSEVJQyBzdHJlYW1zIGF0IHRoZSBzYW1lIHRpbWUgaXMgbm90IHN1cHBvcnRlZC48L3A+CisgICAgICogPHA+QWxsIHRoZSBjb25maWd1cmF0aW9uIHR1cGxlcyA8Y29kZT4oZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBpbnB1dD8pPC9jb2RlPiB3aWxsIGNvbnRhaW4KKyAgICAgKiBBSU1BR0VfRk9STUFUX0hFSUMgZm9ybWF0IGFzIE9VVFBVVCBvbmx5LjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TID0gICAgICAgICAvLyBpbnQzMltuKjRdIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9oZWljX2F2YWlsYWJsZV9oZWljX3N0cmVhbV9jb25maWd1cmF0aW9uc190KQorICAgICAgICAgICAgQUNBTUVSQV9IRUlDX1NUQVJULAorICAgIC8qKgorICAgICAqIDxwPlRoaXMgbGlzdHMgdGhlIG1pbmltdW0gZnJhbWUgZHVyYXRpb24gZm9yIGVhY2gKKyAgICAgKiBmb3JtYXQvc2l6ZSBjb21iaW5hdGlvbiBmb3IgSEVJQyBvdXRwdXQgZm9ybWF0cy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQ2NFs0Km5dPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgc2hvdWxkIGNvcnJlc3BvbmQgdG8gdGhlIGZyYW1lIGR1cmF0aW9uIHdoZW4gb25seSB0aGF0CisgICAgICogc3RyZWFtIGlzIGFjdGl2ZSwgd2l0aCBhbGwgcHJvY2Vzc2luZyAodHlwaWNhbGx5IGluIGFuZHJvaWQuKi5tb2RlKQorICAgICAqIHNldCB0byBlaXRoZXIgT0ZGIG9yIEZBU1QuPC9wPgorICAgICAqIDxwPldoZW4gbXVsdGlwbGUgc3RyZWFtcyBhcmUgdXNlZCBpbiBhIHJlcXVlc3QsIHRoZSBtaW5pbXVtIGZyYW1lCisgICAgICogZHVyYXRpb24gd2lsbCBiZSBtYXgoaW5kaXZpZHVhbCBzdHJlYW0gbWluIGR1cmF0aW9ucykuPC9wPgorICAgICAqIDxwPlNlZSBBQ0FNRVJBX1NFTlNPUl9GUkFNRV9EVVJBVElPTiBhbmQKKyAgICAgKiBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RBTExfRFVSQVRJT05TIGZvciBtb3JlIGRldGFpbHMgYWJvdXQKKyAgICAgKiBjYWxjdWxhdGluZyB0aGUgbWF4IGZyYW1lIHJhdGUuPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RBTExfRFVSQVRJT05TCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9GUkFNRV9EVVJBVElPTgorICAgICAqLworICAgIEFDQU1FUkFfSEVJQ19BVkFJTEFCTEVfSEVJQ19NSU5fRlJBTUVfRFVSQVRJT05TID0gICAgICAgICAgIC8vIGludDY0WzQqbl0KKyAgICAgICAgICAgIEFDQU1FUkFfSEVJQ19TVEFSVCArIDEsCisgICAgLyoqCisgICAgICogPHA+VGhpcyBsaXN0cyB0aGUgbWF4aW11bSBzdGFsbCBkdXJhdGlvbiBmb3IgZWFjaAorICAgICAqIG91dHB1dCBmb3JtYXQvc2l6ZSBjb21iaW5hdGlvbiBmb3IgSEVJQyBzdHJlYW1zLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGludDY0WzQqbl08L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+QSBzdGFsbCBkdXJhdGlvbiBpcyBob3cgbXVjaCBleHRyYSB0aW1lIHdvdWxkIGdldCBhZGRlZAorICAgICAqIHRvIHRoZSBub3JtYWwgbWluaW11bSBmcmFtZSBkdXJhdGlvbiBmb3IgYSByZXBlYXRpbmcgcmVxdWVzdAorICAgICAqIHRoYXQgaGFzIHN0cmVhbXMgd2l0aCBub24temVybyBzdGFsbC48L3A+CisgICAgICogPHA+VGhpcyBmdW5jdGlvbnMgc2ltaWxhcmx5IHRvCisgICAgICogQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OUyBmb3IgSEVJQworICAgICAqIHN0cmVhbXMuPC9wPgorICAgICAqIDxwPkFsbCBIRUlDIG91dHB1dCBzdHJlYW0gZm9ybWF0cyBtYXkgaGF2ZSBhIG5vbnplcm8gc3RhbGwKKyAgICAgKiBkdXJhdGlvbi48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVEFMTF9EVVJBVElPTlMKKyAgICAgKi8KKyAgICBBQ0FNRVJBX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RBTExfRFVSQVRJT05TID0gICAgICAgICAgICAgICAvLyBpbnQ2NFs0Km5dCisgICAgICAgICAgICBBQ0FNRVJBX0hFSUNfU1RBUlQgKyAyLAorICAgIEFDQU1FUkFfSEVJQ19FTkQsCisKIH0gYWNhbWVyYV9tZXRhZGF0YV90YWdfdDsKIAogLyoqCkBAIC02MzMzLDcgKzY2OTksNyBAQAogCiAgICAgLyoqCiAgICAgICogPHA+T3B0aW1pemVkIGZvciBkaW0gc2V0dGluZ3Mgd2hlcmUgdGhlIG1haW4gbGlnaHQgc291cmNlCi0gICAgICogaXMgYSBmbGFtZS48L3A+CisgICAgICogaXMgYSBjYW5kbGUuPC9wPgogICAgICAqLwogICAgIEFDQU1FUkFfQ09OVFJPTF9TQ0VORV9NT0RFX0NBTkRMRUxJR0hUICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAxNSwKIApAQCAtNzAxMSw2ICs3Mzc3LDEwIEBACiAgICAgICogPHA+SWYgdGhpcyBpcyBzdXBwb3J0ZWQsIGFuZHJvaWQuc2NhbGVyLnN0cmVhbUNvbmZpZ3VyYXRpb25NYXAgd2lsbAogICAgICAqIGFkZGl0aW9uYWxseSByZXR1cm4gYSBtaW4gZnJhbWUgZHVyYXRpb24gdGhhdCBpcyBncmVhdGVyIHRoYW4KICAgICAgKiB6ZXJvIGZvciBlYWNoIHN1cHBvcnRlZCBzaXplLWZvcm1hdCBjb21iaW5hdGlvbi48L3A+CisgICAgICogPHA+Rm9yIGNhbWVyYSBkZXZpY2VzIHdpdGggTE9HSUNBTF9NVUxUSV9DQU1FUkEgY2FwYWJpbGl0eSwgd2hlbiB0aGUgdW5kZXJseWluZyBhY3RpdmUKKyAgICAgKiBwaHlzaWNhbCBjYW1lcmEgc3dpdGNoZXMsIGV4cG9zdXJlVGltZSwgc2Vuc2l0aXZpdHksIGFuZCBsZW5zIHByb3BlcnRpZXMgbWF5IGNoYW5nZQorICAgICAqIGV2ZW4gaWYgQUUvQUYgaXMgbG9ja2VkLiBIb3dldmVyLCB0aGUgb3ZlcmFsbCBhdXRvIGV4cG9zdXJlIGFuZCBhdXRvIGZvY3VzIGV4cGVyaWVuY2UKKyAgICAgKiBmb3IgdXNlcnMgd2lsbCBiZSBjb25zaXN0ZW50LiBSZWZlciB0byBMT0dJQ0FMX01VTFRJX0NBTUVSQSBjYXBhYmlsaXR5IGZvciBkZXRhaWxzLjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9CTEFDS19MRVZFTF9MT0NLCiAgICAgICogQHNlZSBBQ0FNRVJBX0NPTlRST0xfQUVfTE9DSwpAQCAtNzA2Niw2ICs3NDM2LDEwIEBACiAgICAgICogd2lsbCBhY2N1cmF0ZWx5IHJlcG9ydCB0aGUgdmFsdWVzIGFwcGxpZWQgYnkgQVdCIGluIHRoZSByZXN1bHQuPC9wPgogICAgICAqIDxwPkEgZ2l2ZW4gY2FtZXJhIGRldmljZSBtYXkgYWxzbyBzdXBwb3J0IGFkZGl0aW9uYWwgcG9zdC1wcm9jZXNzaW5nCiAgICAgICogY29udHJvbHMsIGJ1dCB0aGlzIGNhcGFiaWxpdHkgb25seSBjb3ZlcnMgdGhlIGFib3ZlIGxpc3Qgb2YgY29udHJvbHMuPC9wPgorICAgICAqIDxwPkZvciBjYW1lcmEgZGV2aWNlcyB3aXRoIExPR0lDQUxfTVVMVElfQ0FNRVJBIGNhcGFiaWxpdHksIHdoZW4gdW5kZXJseWluZyBhY3RpdmUKKyAgICAgKiBwaHlzaWNhbCBjYW1lcmEgc3dpdGNoZXMsIHRvbmVtYXAsIHdoaXRlIGJhbGFuY2UsIGFuZCBzaGFkaW5nIG1hcCBtYXkgY2hhbmdlIGV2ZW4gaWYKKyAgICAgKiBhd2IgaXMgbG9ja2VkLiBIb3dldmVyLCB0aGUgb3ZlcmFsbCBwb3N0LXByb2Nlc3NpbmcgZXhwZXJpZW5jZSBmb3IgdXNlcnMgd2lsbCBiZQorICAgICAqIGNvbnNpc3RlbnQuIFJlZmVyIHRvIExPR0lDQUxfTVVMVElfQ0FNRVJBIGNhcGFiaWxpdHkgZm9yIGRldGFpbHMuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX0NPTE9SX0NPUlJFQ1RJT05fQUJFUlJBVElPTl9NT0RFCiAgICAgICogQHNlZSBBQ0FNRVJBX0NPTE9SX0NPUlJFQ1RJT05fQVZBSUxBQkxFX0FCRVJSQVRJT05fTU9ERVMKQEAgLTcxMzcsMTkgKzc1MTEsMjAgQEAKIAogICAgIC8qKgogICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIHN1cHBvcnRzIGNhcHR1cmluZyBoaWdoLXJlc29sdXRpb24gaW1hZ2VzIGF0ICZndDs9IDIwIGZyYW1lcyBwZXIKLSAgICAgKiBzZWNvbmQsIGluIGF0IGxlYXN0IHRoZSB1bmNvbXByZXNzZWQgWVVWIGZvcm1hdCwgd2hlbiBwb3N0LXByb2Nlc3Npbmcgc2V0dGluZ3MgYXJlIHNldAotICAgICAqIHRvIEZBU1QuIEFkZGl0aW9uYWxseSwgbWF4aW11bS1yZXNvbHV0aW9uIGltYWdlcyBjYW4gYmUgY2FwdHVyZWQgYXQgJmd0Oz0gMTAgZnJhbWVzCi0gICAgICogcGVyIHNlY29uZC4gIEhlcmUsICdoaWdoIHJlc29sdXRpb24nIG1lYW5zIGF0IGxlYXN0IDggbWVnYXBpeGVscywgb3IgdGhlIG1heGltdW0KLSAgICAgKiByZXNvbHV0aW9uIG9mIHRoZSBkZXZpY2UsIHdoaWNoZXZlciBpcyBzbWFsbGVyLjwvcD4KKyAgICAgKiBzZWNvbmQsIGluIGF0IGxlYXN0IHRoZSB1bmNvbXByZXNzZWQgWVVWIGZvcm1hdCwgd2hlbiBwb3N0LXByb2Nlc3Npbmcgc2V0dGluZ3MgYXJlCisgICAgICogc2V0IHRvIEZBU1QuIEFkZGl0aW9uYWxseSwgYWxsIGltYWdlIHJlc29sdXRpb25zIGxlc3MgdGhhbiAyNCBtZWdhcGl4ZWxzIGNhbiBiZQorICAgICAqIGNhcHR1cmVkIGF0ICZndDs9IDEwIGZyYW1lcyBwZXIgc2Vjb25kLiBIZXJlLCAnaGlnaCByZXNvbHV0aW9uJyBtZWFucyBhdCBsZWFzdCA4CisgICAgICogbWVnYXBpeGVscywgb3IgdGhlIG1heGltdW0gcmVzb2x1dGlvbiBvZiB0aGUgZGV2aWNlLCB3aGljaGV2ZXIgaXMgc21hbGxlci48L3A+CiAgICAgICogPHA+TW9yZSBzcGVjaWZpY2FsbHksIHRoaXMgbWVhbnMgdGhhdCBhdCBsZWFzdCBvbmUgb3V0cHV0IHtAbGluayBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4IH0gc2l6ZSBsaXN0ZWQgaW4KICAgICAgKiB7QGxpbmsgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUyB9CiAgICAgICogaXMgbGFyZ2VyIG9yIGVxdWFsIHRvIHRoZSAnaGlnaCByZXNvbHV0aW9uJyBkZWZpbmVkIGFib3ZlLCBhbmQgY2FuIGJlIGNhcHR1cmVkIGF0IGF0CiAgICAgICogbGVhc3QgMjAgZnBzLiAgRm9yIHRoZSBsYXJnZXN0IHtAbGluayBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4IH0gc2l6ZSBsaXN0ZWQgaW4KICAgICAgKiB7QGxpbmsgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUyB9LAotICAgICAqIGNhbWVyYSBkZXZpY2UgY2FuIGNhcHR1cmUgdGhpcyBzaXplIGZvciBhdCBsZWFzdCAxMCBmcmFtZXMgcGVyIHNlY29uZC4gIEFsc28gdGhlCi0gICAgICogQUNBTUVSQV9DT05UUk9MX0FFX0FWQUlMQUJMRV9UQVJHRVRfRlBTX1JBTkdFUyBlbnRyeSBsaXN0cyBhdCBsZWFzdCBvbmUgRlBTIHJhbmdlIHdoZXJlCi0gICAgICogdGhlIG1pbmltdW0gRlBTIGlzICZndDs9IDEgLyBtaW5pbXVtRnJhbWVEdXJhdGlvbiBmb3IgdGhlIGxhcmdlc3QgWVVWXzQyMF84ODggc2l6ZS48L3A+Ci0gICAgICogPHA+SWYgdGhlIGRldmljZSBzdXBwb3J0cyB0aGUge0BsaW5rIEFJTUFHRV9GT1JNQVRfUkFXMTAgfSwge0BsaW5rIEFJTUFHRV9GT1JNQVRfUkFXMTIgfSwgdGhlbiB0aG9zZSBjYW4gYWxzbyBiZQorICAgICAqIGNhbWVyYSBkZXZpY2UgY2FuIGNhcHR1cmUgdGhpcyBzaXplIGZvciBhdCBsZWFzdCAxMCBmcmFtZXMgcGVyIHNlY29uZCBpZiB0aGUgc2l6ZSBpcworICAgICAqIGxlc3MgdGhhbiAyNCBtZWdhcGl4ZWxzLiBBbHNvIHRoZSBBQ0FNRVJBX0NPTlRST0xfQUVfQVZBSUxBQkxFX1RBUkdFVF9GUFNfUkFOR0VTIGVudHJ5CisgICAgICogbGlzdHMgYXQgbGVhc3Qgb25lIEZQUyByYW5nZSB3aGVyZSB0aGUgbWluaW11bSBGUFMgaXMgJmd0Oz0gMSAvIG1pbmltdW1GcmFtZUR1cmF0aW9uCisgICAgICogZm9yIHRoZSBsYXJnZXN0IFlVVl80MjBfODg4IHNpemUuPC9wPgorICAgICAqIDxwPklmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgdGhlIHtAbGluayBBSU1BR0VfRk9STUFUX1JBVzEwIH0sIHtAbGluayBBSU1BR0VfRk9STUFUX1JBVzEyIH0sIHtAbGluayBBSU1BR0VfRk9STUFUX1k4IH0sIHRoZW4gdGhvc2UgY2FuIGFsc28gYmUKICAgICAgKiBjYXB0dXJlZCBhdCB0aGUgc2FtZSByYXRlIGFzIHRoZSBtYXhpbXVtLXNpemUgWVVWXzQyMF84ODggcmVzb2x1dGlvbiBpcy48L3A+CiAgICAgICogPHA+SW4gYWRkaXRpb24sIHRoZSBBQ0FNRVJBX1NZTkNfTUFYX0xBVEVOQ1kgZmllbGQgaXMgZ3VhcmFudGVkIHRvIGhhdmUgYSB2YWx1ZSBiZXR3ZWVuIDAKICAgICAgKiBhbmQgNCwgaW5jbHVzaXZlLiBBQ0FNRVJBX0NPTlRST0xfQUVfTE9DS19BVkFJTEFCTEUgYW5kIEFDQU1FUkFfQ09OVFJPTF9BV0JfTE9DS19BVkFJTEFCTEUKQEAgLTcxODMsOCArNzU1OCw4IEBACiAgICAgICogPGxpPlRoZSBBQ0FNRVJBX0RFUFRIX0RFUFRIX0lTX0VYQ0xVU0lWRSBlbnRyeSBpcyBsaXN0ZWQgYnkgdGhpcyBkZXZpY2UuPC9saT4KICAgICAgKiA8bGk+QXMgb2YgQW5kcm9pZCBQLCB0aGUgQUNBTUVSQV9MRU5TX1BPU0VfUkVGRVJFTkNFIGVudHJ5IGlzIGxpc3RlZCBieSB0aGlzIGRldmljZS48L2xpPgogICAgICAqIDxsaT5BIExJTUlURUQgY2FtZXJhIHdpdGggb25seSB0aGUgREVQVEhfT1VUUFVUIGNhcGFiaWxpdHkgZG9lcyBub3QgaGF2ZSB0byBzdXBwb3J0Ci0gICAgICogICBub3JtYWwgWVVWXzQyMF84ODgsIEpQRUcsIGFuZCBQUklWLWZvcm1hdCBvdXRwdXRzLiBJdCBvbmx5IGhhcyB0byBzdXBwb3J0IHRoZSBERVBUSDE2Ci0gICAgICogICBmb3JtYXQuPC9saT4KKyAgICAgKiAgIG5vcm1hbCBZVVZfNDIwXzg4OCwgWTgsIEpQRUcsIGFuZCBQUklWLWZvcm1hdCBvdXRwdXRzLiBJdCBvbmx5IGhhcyB0byBzdXBwb3J0IHRoZQorICAgICAqICAgREVQVEgxNiBmb3JtYXQuPC9saT4KICAgICAgKiA8L3VsPgogICAgICAqIDxwPkdlbmVyYWxseSwgZGVwdGggb3V0cHV0IG9wZXJhdGVzIGF0IGEgc2xvd2VyIGZyYW1lIHJhdGUgdGhhbiBzdGFuZGFyZCBjb2xvciBjYXB0dXJlLAogICAgICAqIHNvIHRoZSBERVBUSDE2IGFuZCBERVBUSF9QT0lOVF9DTE9VRCBmb3JtYXRzIHdpbGwgY29tbW9ubHkgaGF2ZSBhIHN0YWxsIGR1cmF0aW9uIHRoYXQKQEAgLTcyMTUsOCArNzU5MCwyMyBAQAogICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX01PVElPTl9UUkFDS0lORyAgICAgICAgICAgPSAxMCwKIAogICAgIC8qKgotICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGlzIGEgbG9naWNhbCBjYW1lcmEgYmFja2VkIGJ5IHR3byBvciBtb3JlIHBoeXNpY2FsIGNhbWVyYXMgdGhhdCBhcmUKLSAgICAgKiBhbHNvIGV4cG9zZWQgdG8gdGhlIGFwcGxpY2F0aW9uLjwvcD4KKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBpcyBhIGxvZ2ljYWwgY2FtZXJhIGJhY2tlZCBieSB0d28gb3IgbW9yZSBwaHlzaWNhbCBjYW1lcmFzLjwvcD4KKyAgICAgKiA8cD5JbiBBUEkgbGV2ZWwgMjgsIHRoZSBwaHlzaWNhbCBjYW1lcmFzIG11c3QgYWxzbyBiZSBleHBvc2VkIHRvIHRoZSBhcHBsaWNhdGlvbiB2aWEKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1hbmFnZXIuaHRtbCNnZXRDYW1lcmFJZExpc3QiPkNhbWVyYU1hbmFnZXIjZ2V0Q2FtZXJhSWRMaXN0PC9hPi48L3A+CisgICAgICogPHA+U3RhcnRpbmcgZnJvbSBBUEkgbGV2ZWwgMjksIHNvbWUgb3IgYWxsIHBoeXNpY2FsIGNhbWVyYXMgbWF5IG5vdCBiZSBpbmRlcGVuZGVudGx5CisgICAgICogZXhwb3NlZCB0byB0aGUgYXBwbGljYXRpb24sIGluIHdoaWNoIGNhc2UgdGhlIHBoeXNpY2FsIGNhbWVyYSBJRHMgd2lsbCBub3QgYmUKKyAgICAgKiBhdmFpbGFibGUgaW4gPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNYW5hZ2VyLmh0bWwjZ2V0Q2FtZXJhSWRMaXN0Ij5DYW1lcmFNYW5hZ2VyI2dldENhbWVyYUlkTGlzdDwvYT4uIEJ1dCB0aGUKKyAgICAgKiBhcHBsaWNhdGlvbiBjYW4gc3RpbGwgcXVlcnkgdGhlIHBoeXNpY2FsIGNhbWVyYXMnIGNoYXJhY3RlcmlzdGljcyBieSBjYWxsaW5nCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNYW5hZ2VyLmh0bWwjZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzIj5DYW1lcmFNYW5hZ2VyI2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvYT4uIEFkZGl0aW9uYWxseSwKKyAgICAgKiBpZiBhIHBoeXNpY2FsIGNhbWVyYSBpcyBoaWRkZW4gZnJvbSBjYW1lcmEgSUQgbGlzdCwgdGhlIG1hbmRhdG9yeSBzdHJlYW0gY29tYmluYXRpb25zCisgICAgICogZm9yIHRoYXQgcGh5c2ljYWwgY2FtZXJhIG11c3QgYmUgc3VwcG9ydGVkIHRocm91Z2ggdGhlIGxvZ2ljYWwgY2FtZXJhIHVzaW5nIHBoeXNpY2FsCisgICAgICogc3RyZWFtcy48L3A+CisgICAgICogPHA+Q29tYmluYXRpb25zIG9mIGxvZ2ljYWwgYW5kIHBoeXNpY2FsIHN0cmVhbXMsIG9yIHBoeXNpY2FsIHN0cmVhbXMgZnJvbSBkaWZmZXJlbnQKKyAgICAgKiBwaHlzaWNhbCBjYW1lcmFzIGFyZSBub3QgZ3VhcmFudGVlZC4gSG93ZXZlciwgaWYgdGhlIGNhbWVyYSBkZXZpY2Ugc3VwcG9ydHMKKyAgICAgKiB7QGxpbmsgQUNhbWVyYURldmljZV9pc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkIH0sCisgICAgICogYXBwbGljYXRpb24gbXVzdCBiZSBhYmxlIHRvIHF1ZXJ5IHdoZXRoZXIgYSBzdHJlYW0gY29tYmluYXRpb24gaW52b2x2aW5nIHBoeXNpY2FsCisgICAgICogc3RyZWFtcyBpcyBzdXBwb3J0ZWQgYnkgY2FsbGluZworICAgICAqIHtAbGluayBBQ2FtZXJhRGV2aWNlX2lzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQgfS48L3A+CiAgICAgICogPHA+Q2FtZXJhIGFwcGxpY2F0aW9uIHNob3VsZG4ndCBhc3N1bWUgdGhhdCB0aGVyZSBhcmUgYXQgbW9zdCAxIHJlYXIgY2FtZXJhIGFuZCAxIGZyb250CiAgICAgICogY2FtZXJhIGluIHRoZSBzeXN0ZW0uIEZvciBhbiBhcHBsaWNhdGlvbiB0aGF0IHN3aXRjaGVzIGJldHdlZW4gZnJvbnQgYW5kIGJhY2sgY2FtZXJhcywKICAgICAgKiB0aGUgcmVjb21tZW5kYXRpb24gaXMgdG8gc3dpdGNoIGJldHdlZW4gdGhlIGZpcnN0IHJlYXIgY2FtZXJhIGFuZCB0aGUgZmlyc3QgZnJvbnQKQEAgLTcyMzksNDIgKzc2MjksMTI4IEBACiAgICAgICogPC9saT4KICAgICAgKiA8bGk+VGhlIFNFTlNPUl9JTkZPX1RJTUVTVEFNUF9TT1VSQ0Ugb2YgdGhlIGxvZ2ljYWwgZGV2aWNlIGFuZCBwaHlzaWNhbCBkZXZpY2VzIG11c3QgYmUKICAgICAgKiAgIHRoZSBzYW1lLjwvbGk+Ci0gICAgICogPGxpPlRoZSBsb2dpY2FsIGNhbWVyYSBkZXZpY2UgbXVzdCBiZSBMSU1JVEVEIG9yIGhpZ2hlciBkZXZpY2UuPC9saT4KKyAgICAgKiA8bGk+VGhlIGxvZ2ljYWwgY2FtZXJhIG11c3QgYmUgTElNSVRFRCBvciBoaWdoZXIgZGV2aWNlLjwvbGk+CiAgICAgICogPC91bD4KLSAgICAgKiA8cD5Cb3RoIHRoZSBsb2dpY2FsIGNhbWVyYSBkZXZpY2UgYW5kIGl0cyB1bmRlcmx5aW5nIHBoeXNpY2FsIGRldmljZXMgc3VwcG9ydCB0aGUKLSAgICAgKiBtYW5kYXRvcnkgc3RyZWFtIGNvbWJpbmF0aW9ucyByZXF1aXJlZCBmb3IgdGhlaXIgZGV2aWNlIGxldmVscy48L3A+Ci0gICAgICogPHA+QWRkaXRpb25hbGx5LCBmb3IgZWFjaCBndWFyYW50ZWVkIHN0cmVhbSBjb21iaW5hdGlvbiwgdGhlIGxvZ2ljYWwgY2FtZXJhIHN1cHBvcnRzOjwvcD4KKyAgICAgKiA8cD5BIGxvZ2ljYWwgY2FtZXJhIGRldmljZSdzIGR5bmFtaWMgbWV0YWRhdGEgbWF5IGNvbnRhaW4KKyAgICAgKiBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX0FDVElWRV9QSFlTSUNBTF9JRCB0byBub3RpZnkgdGhlIGFwcGxpY2F0aW9uIG9mIHRoZSBjdXJyZW50CisgICAgICogYWN0aXZlIHBoeXNpY2FsIGNhbWVyYSBJZC4gQW4gYWN0aXZlIHBoeXNpY2FsIGNhbWVyYSBpcyB0aGUgcGh5c2ljYWwgY2FtZXJhIGZyb20gd2hpY2gKKyAgICAgKiB0aGUgbG9naWNhbCBjYW1lcmEncyBtYWluIGltYWdlIGRhdGEgb3V0cHV0cyAoWVVWIG9yIFJBVykgYW5kIG1ldGFkYXRhIGNvbWUgZnJvbS4KKyAgICAgKiBJbiBhZGRpdGlvbiwgdGhpcyBzZXJ2ZXMgYXMgYW4gaW5kaWNhdGlvbiB3aGljaCBwaHlzaWNhbCBjYW1lcmEgaXMgdXNlZCB0byBvdXRwdXQgdG8KKyAgICAgKiBhIFJBVyBzdHJlYW0sIG9yIGluIGNhc2Ugb25seSBwaHlzaWNhbCBjYW1lcmFzIHN1cHBvcnQgUkFXLCB3aGljaCBwaHlzaWNhbCBSQVcgc3RyZWFtCisgICAgICogdGhlIGFwcGxpY2F0aW9uIHNob3VsZCByZXF1ZXN0LjwvcD4KKyAgICAgKiA8cD5Mb2dpY2FsIGNhbWVyYSdzIHN0YXRpYyBtZXRhZGF0YSB0YWdzIGJlbG93IGRlc2NyaWJlIHRoZSBkZWZhdWx0IGFjdGl2ZSBwaHlzaWNhbAorICAgICAqIGNhbWVyYS4gQW4gYWN0aXZlIHBoeXNpY2FsIGNhbWVyYSBpcyBkZWZhdWx0IGlmIGl0J3MgdXNlZCB3aGVuIGFwcGxpY2F0aW9uIGRpcmVjdGx5CisgICAgICogdXNlcyByZXF1ZXN0cyBidWlsdCBmcm9tIGEgdGVtcGxhdGUuIEFsbCB0ZW1wbGF0ZXMgd2lsbCBkZWZhdWx0IHRvIHRoZSBzYW1lIGFjdGl2ZQorICAgICAqIHBoeXNpY2FsIGNhbWVyYS48L3A+CiAgICAgICogPHVsPgotICAgICAqIDxsaT5Gb3IgZWFjaCBndWFyYW50ZWVkIHN0cmVhbSBjb21iaW5hdGlvbiwgdGhlIGxvZ2ljYWwgY2FtZXJhIHN1cHBvcnRzIHJlcGxhY2luZyBvbmUKLSAgICAgKiAgIGxvZ2ljYWwge0BsaW5rIEFJTUFHRV9GT1JNQVRfWVVWXzQyMF84ODggWVVWXzQyMF84ODh9Ci0gICAgICogICBvciByYXcgc3RyZWFtIHdpdGggdHdvIHBoeXNpY2FsIHN0cmVhbXMgb2YgdGhlIHNhbWUgc2l6ZSBhbmQgZm9ybWF0LCBlYWNoIGZyb20gYQotICAgICAqICAgc2VwYXJhdGUgcGh5c2ljYWwgY2FtZXJhLCBnaXZlbiB0aGF0IHRoZSBzaXplIGFuZCBmb3JtYXQgYXJlIHN1cHBvcnRlZCBieSBib3RoCi0gICAgICogICBwaHlzaWNhbCBjYW1lcmFzLjwvbGk+Ci0gICAgICogPGxpPklmIHRoZSBsb2dpY2FsIGNhbWVyYSBkb2Vzbid0IGFkdmVydGlzZSBSQVcgY2FwYWJpbGl0eSwgYnV0IHRoZSB1bmRlcmx5aW5nIHBoeXNpY2FsCi0gICAgICogICBjYW1lcmFzIGRvLCB0aGUgbG9naWNhbCBjYW1lcmEgd2lsbCBzdXBwb3J0IGd1YXJhbnRlZWQgc3RyZWFtIGNvbWJpbmF0aW9ucyBmb3IgUkFXCi0gICAgICogICBjYXBhYmlsaXR5LCBleGNlcHQgdGhhdCB0aGUgUkFXIHN0cmVhbXMgd2lsbCBiZSBwaHlzaWNhbCBzdHJlYW1zLCBlYWNoIGZyb20gYSBzZXBhcmF0ZQotICAgICAqICAgcGh5c2ljYWwgY2FtZXJhLiBUaGlzIGlzIHVzdWFsbHkgdGhlIGNhc2Ugd2hlbiB0aGUgcGh5c2ljYWwgY2FtZXJhcyBoYXZlIGRpZmZlcmVudAotICAgICAqICAgc2Vuc29yIHNpemVzLjwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0lORk9fU0VOU0lUSVZJVFlfUkFOR0U8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVDwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0lORk9fRVhQT1NVUkVfVElNRV9SQU5HRTwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0lORk9fTUFYX0ZSQU1FX0RVUkFUSU9OPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfSU5GT19QSFlTSUNBTF9TSVpFPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfSU5GT19XSElURV9MRVZFTDwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0lORk9fTEVOU19TSEFESU5HX0FQUExJRUQ8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDE8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDI8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9DQUxJQlJBVElPTl9UUkFOU0ZPUk0xPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfQ0FMSUJSQVRJT05fVFJBTlNGT1JNMjwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0NPTE9SX1RSQU5TRk9STTE8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9DT0xPUl9UUkFOU0ZPUk0yPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfRk9SV0FSRF9NQVRSSVgxPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfRk9SV0FSRF9NQVRSSVgyPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfQkxBQ0tfTEVWRUxfUEFUVEVSTjwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX01BWF9BTkFMT0dfU0VOU0lUSVZJVFk8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9PUFRJQ0FMX0JMQUNLX1JFR0lPTlM8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9BVkFJTEFCTEVfVEVTVF9QQVRURVJOX01PREVTPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX0lORk9fSFlQRVJGT0NBTF9ESVNUQU5DRTwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfTEVOU19JTkZPX01JTklNVU1fRk9DVVNfRElTVEFOQ0U8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX0xFTlNfSU5GT19GT0NVU19ESVNUQU5DRV9DQUxJQlJBVElPTjwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfTEVOU19QT1NFX1JPVEFUSU9OPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX1BPU0VfVFJBTlNMQVRJT048L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX0xFTlNfSU5UUklOU0lDX0NBTElCUkFUSU9OPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX1BPU0VfUkVGRVJFTkNFPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX0RJU1RPUlRJT048L2xpPgogICAgICAqIDwvdWw+Ci0gICAgICogPHA+VXNpbmcgcGh5c2ljYWwgc3RyZWFtcyBpbiBwbGFjZSBvZiBhIGxvZ2ljYWwgc3RyZWFtIG9mIHRoZSBzYW1lIHNpemUgYW5kIGZvcm1hdCB3aWxsCi0gICAgICogbm90IHNsb3cgZG93biB0aGUgZnJhbWUgcmF0ZSBvZiB0aGUgY2FwdHVyZSwgYXMgbG9uZyBhcyB0aGUgbWluaW11bSBmcmFtZSBkdXJhdGlvbgotICAgICAqIG9mIHRoZSBwaHlzaWNhbCBhbmQgbG9naWNhbCBzdHJlYW1zIGFyZSB0aGUgc2FtZS48L3A+CisgICAgICogPHA+VGhlIGZpZWxkIG9mIHZpZXcgb2YgYWxsIG5vbi1SQVcgcGh5c2ljYWwgc3RyZWFtcyBtdXN0IGJlIHRoZSBzYW1lIG9yIGFzIGNsb3NlIGFzCisgICAgICogcG9zc2libGUgdG8gdGhhdCBvZiBub24tUkFXIGxvZ2ljYWwgc3RyZWFtcy4gSWYgdGhlIHJlcXVlc3RlZCBGT1YgaXMgb3V0c2lkZSBvZiB0aGUKKyAgICAgKiByYW5nZSBzdXBwb3J0ZWQgYnkgdGhlIHBoeXNpY2FsIGNhbWVyYSwgdGhlIHBoeXNpY2FsIHN0cmVhbSBmb3IgdGhhdCBwaHlzaWNhbCBjYW1lcmEKKyAgICAgKiB3aWxsIHVzZSBlaXRoZXIgdGhlIG1heGltdW0gb3IgbWluaW11bSBzY2FsZXIgY3JvcCByZWdpb24sIGRlcGVuZGluZyBvbiB3aGljaCBvbmUgaXMKKyAgICAgKiBjbG9zZXIgdG8gdGhlIHJlcXVlc3RlZCBGT1YuIEZvciBleGFtcGxlLCBmb3IgYSBsb2dpY2FsIGNhbWVyYSB3aXRoIHdpZGUtdGVsZSBsZW5zCisgICAgICogY29uZmlndXJhdGlvbiB3aGVyZSB0aGUgd2lkZSBsZW5zIGlzIHRoZSBkZWZhdWx0LCBpZiB0aGUgbG9naWNhbCBjYW1lcmEncyBjcm9wIHJlZ2lvbgorICAgICAqIGlzIHNldCB0byBtYXhpbXVtLCB0aGUgcGh5c2ljYWwgc3RyZWFtIGZvciB0aGUgdGVsZSBsZW5zIHdpbGwgYmUgY29uZmlndXJlZCB0byBpdHMKKyAgICAgKiBtYXhpbXVtIGNyb3AgcmVnaW9uLiBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlIGxvZ2ljYWwgY2FtZXJhIGhhcyBhIG5vcm1hbC13aWRlIGxlbnMKKyAgICAgKiBjb25maWd1cmF0aW9uIHdoZXJlIHRoZSBub3JtYWwgbGVucyBpcyB0aGUgZGVmYXVsdCwgd2hlbiB0aGUgbG9naWNhbCBjYW1lcmEncyBjcm9wCisgICAgICogcmVnaW9uIGlzIHNldCB0byBtYXhpbXVtLCB0aGUgRk9WIG9mIHRoZSBsb2dpY2FsIHN0cmVhbXMgd2lsbCBiZSB0aGF0IG9mIHRoZSBub3JtYWwKKyAgICAgKiBsZW5zLiBUaGUgRk9WIG9mIHRoZSBwaHlzaWNhbCBzdHJlYW1zIGZvciB0aGUgd2lkZSBsZW5zIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlCisgICAgICogbG9naWNhbCBzdHJlYW0sIGJ5IG1ha2luZyB0aGUgY3JvcCByZWdpb24gc21hbGxlciB0aGFuIGl0cyBhY3RpdmUgYXJyYXkgc2l6ZSB0bworICAgICAqIGNvbXBlbnNhdGUgZm9yIHRoZSBzbWFsbGVyIGZvY2FsIGxlbmd0aC48L3A+CisgICAgICogPHA+RXZlbiBpZiB0aGUgdW5kZXJseWluZyBwaHlzaWNhbCBjYW1lcmFzIGhhdmUgZGlmZmVyZW50IFJBVyBjaGFyYWN0ZXJpc3RpY3MgKHN1Y2ggYXMKKyAgICAgKiBzaXplIG9yIENGQSBwYXR0ZXJuKSwgYSBsb2dpY2FsIGNhbWVyYSBjYW4gc3RpbGwgYWR2ZXJ0aXNlIFJBVyBjYXBhYmlsaXR5LiBJbiB0aGlzCisgICAgICogY2FzZSwgd2hlbiB0aGUgYXBwbGljYXRpb24gY29uZmlndXJlcyBhIFJBVyBzdHJlYW0sIHRoZSBjYW1lcmEgZGV2aWNlIHdpbGwgbWFrZSBzdXJlCisgICAgICogdGhlIGFjdGl2ZSBwaHlzaWNhbCBjYW1lcmEgd2lsbCByZW1haW4gYWN0aXZlIHRvIGVuc3VyZSBjb25zaXN0ZW50IFJBVyBvdXRwdXQKKyAgICAgKiBiZWhhdmlvciwgYW5kIG5vdCBzd2l0Y2ggdG8gb3RoZXIgcGh5c2ljYWwgY2FtZXJhcy48L3A+CisgICAgICogPHA+VG8gbWFpbnRhaW4gYmFja3dhcmQgY29tcGF0aWJpbGl0eSwgdGhlIGNhcHR1cmUgcmVxdWVzdCBhbmQgcmVzdWx0IG1ldGFkYXRhIHRhZ3MKKyAgICAgKiByZXF1aXJlZCBmb3IgYmFzaWMgY2FtZXJhIGZ1bmN0aW9uYWxpdGllcyB3aWxsIGJlIHNvbGVseSBiYXNlZCBvbiB0aGUKKyAgICAgKiBsb2dpY2FsIGNhbWVyYSBjYXBhYmlsdGl0eS4gT3RoZXIgcmVxdWVzdCBhbmQgcmVzdWx0IG1ldGFkYXRhIHRhZ3MsIG9uIHRoZSBvdGhlcgorICAgICAqIGhhbmQsIHdpbGwgYmUgYmFzZWQgb24gY3VycmVudCBhY3RpdmUgcGh5c2ljYWwgY2FtZXJhLiBGb3IgZXhhbXBsZSwgdGhlIHBoeXNpY2FsCisgICAgICogY2FtZXJhcycgc2Vuc29yIHNlbnNpdGl2aXR5IGFuZCBsZW5zIGNhcGFiaWxpdHkgY291bGQgYmUgZGlmZmVyZW50IGZyb20gZWFjaCBvdGhlci4KKyAgICAgKiBTbyB3aGVuIHRoZSBhcHBsaWNhdGlvbiBtYW51YWxseSBjb250cm9scyBzZW5zb3IgZXhwb3N1cmUgdGltZS9nYWluLCBvciBkb2VzIG1hbnVhbAorICAgICAqIGZvY3VzIGNvbnRyb2wsIGl0IG11c3QgY2hlY2tzIHRoZSBjdXJyZW50IGFjdGl2ZSBwaHlzaWNhbCBjYW1lcmEncyBleHBvc3VyZSwgZ2FpbiwKKyAgICAgKiBhbmQgZm9jdXMgZGlzdGFuY2UgcmFuZ2UuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfRElTVE9SVElPTgorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0lORk9fRk9DVVNfRElTVEFOQ0VfQ0FMSUJSQVRJT04KKyAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19JTkZPX0hZUEVSRk9DQUxfRElTVEFOQ0UKKyAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19JTkZPX01JTklNVU1fRk9DVVNfRElTVEFOQ0UKICAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19JTlRSSU5TSUNfQ0FMSUJSQVRJT04KICAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19QT1NFX1JFRkVSRU5DRQogICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfUk9UQVRJT04KICAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19QT1NFX1RSQU5TTEFUSU9OCisgICAgICogQHNlZSBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX0FDVElWRV9QSFlTSUNBTF9JRAogICAgICAqIEBzZWUgQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9TRU5TT1JfU1lOQ19UWVBFCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9BVkFJTEFCTEVfVEVTVF9QQVRURVJOX01PREVTCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9CTEFDS19MRVZFTF9QQVRURVJOCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9DQUxJQlJBVElPTl9UUkFOU0ZPUk0xCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9DQUxJQlJBVElPTl9UUkFOU0ZPUk0yCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9DT0xPUl9UUkFOU0ZPUk0xCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9DT0xPUl9UUkFOU0ZPUk0yCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9GT1JXQVJEX01BVFJJWDEKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0ZPUldBUkRfTUFUUklYMgorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlQKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fRVhQT1NVUkVfVElNRV9SQU5HRQorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19MRU5TX1NIQURJTkdfQVBQTElFRAorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19NQVhfRlJBTUVfRFVSQVRJT04KKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fUEhZU0lDQUxfU0laRQorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19TRU5TSVRJVklUWV9SQU5HRQorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19XSElURV9MRVZFTAorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfTUFYX0FOQUxPR19TRU5TSVRJVklUWQorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfT1BUSUNBTF9CTEFDS19SRUdJT05TCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDEKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMgogICAgICAqLwogICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX0xPR0lDQUxfTVVMVElfQ0FNRVJBICAgICAgPSAxMSwKIAogICAgIC8qKgogICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGlzIGEgbW9ub2Nocm9tZSBjYW1lcmEgdGhhdCBkb2Vzbid0IGNvbnRhaW4gYSBjb2xvciBmaWx0ZXIgYXJyYXksCi0gICAgICogYW5kIHRoZSBwaXhlbCB2YWx1ZXMgb24gVSBhbmQgViBwbGFuZXMgYXJlIGFsbCAxMjguPC9wPgorICAgICAqIGFuZCBmb3IgWVVWXzQyMF84ODggc3RyZWFtLCB0aGUgcGl4ZWwgdmFsdWVzIG9uIFUgYW5kIFYgcGxhbmVzIGFyZSBhbGwgMTI4LjwvcD4KKyAgICAgKiA8cD5BIE1PTk9DSFJPTUUgY2FtZXJhIG11c3Qgc3VwcG9ydCB0aGUgZ3VhcmFudGVlZCBzdHJlYW0gY29tYmluYXRpb25zIHJlcXVpcmVkIGZvcgorICAgICAqIGl0cyBkZXZpY2UgbGV2ZWwgYW5kIGNhcGFiaWxpdGllcy4gQWRkaXRpb25hbGx5LCBpZiB0aGUgbW9ub2Nocm9tZSBjYW1lcmEgZGV2aWNlCisgICAgICogc3VwcG9ydHMgWTggZm9ybWF0LCBhbGwgbWFuZGF0b3J5IHN0cmVhbSBjb21iaW5hdGlvbiByZXF1aXJlbWVudHMgcmVsYXRlZCB0byB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9ZVVZfNDIwXzg4OCBZVVZfNDIwXzg4OH0gYXBwbHkKKyAgICAgKiB0byB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9ZOCBZOH0gYXMgd2VsbC4gVGhlcmUgYXJlIG5vCisgICAgICogbWFuZGF0b3J5IHN0cmVhbSBjb21iaW5hdGlvbiByZXF1aXJlbWVudHMgd2l0aCByZWdhcmQgdG8KKyAgICAgKiB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9ZOCBZOH0gZm9yIEJheWVyIGNhbWVyYSBkZXZpY2VzLjwvcD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhlIFNFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVCBvZiBhIE1PTk9DSFJPTUUKKyAgICAgKiBjYW1lcmEgd2lsbCBiZSBlaXRoZXIgTU9OTyBvciBOSVIuPC9wPgogICAgICAqLwogICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX01PTk9DSFJPTUUgICAgICAgICAgICAgICAgPSAxMiwKIAorICAgIC8qKgorICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGlzIGNhcGFibGUgb2Ygd3JpdGluZyBpbWFnZSBkYXRhIGludG8gYSByZWdpb24gb2YgbWVtb3J5CisgICAgICogaW5hY2Nlc3NpYmxlIHRvIEFuZHJvaWQgdXNlcnNwYWNlIG9yIHRoZSBBbmRyb2lkIGtlcm5lbCwgYW5kIG9ubHkgYWNjZXNzaWJsZSB0bworICAgICAqIHRydXN0ZWQgZXhlY3V0aW9uIGVudmlyb25tZW50cyAoVEVFKS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfU0VDVVJFX0lNQUdFX0RBVEEgICAgICAgICA9IDEzLAorCiB9IGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3JlcXVlc3RfYXZhaWxhYmxlX2NhcGFiaWxpdGllc190OwogCiAKQEAgLTczMDAsNiArNzc3Niw4MSBAQAogCiB9IGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3NjYWxlcl9jcm9wcGluZ190eXBlX3Q7CiAKKy8vIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlMKK3R5cGVkZWYgZW51bSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYWNhbWVyYV9zY2FsZXJfYXZhaWxhYmxlX3JlY29tbWVuZGVkX3N0cmVhbV9jb25maWd1cmF0aW9ucyB7CisgICAgLyoqCisgICAgICogPHA+UHJldmlldyBtdXN0IG9ubHkgaW5jbHVkZSBub24tc3RhbGxpbmcgcHJvY2Vzc2VkIHN0cmVhbSBjb25maWd1cmF0aW9ucyB3aXRoCisgICAgICogb3V0cHV0IGZvcm1hdHMgbGlrZQorICAgICAqIHtAbGluayBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4IH0sCisgICAgICoge0BsaW5rIEFJTUFHRV9GT1JNQVRfUFJJVkFURSB9LCBldGMuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfUFJFVklFVworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwLAorCisgICAgLyoqCisgICAgICogPHA+VmlkZW8gcmVjb3JkIG11c3QgaW5jbHVkZSBzdHJlYW0gY29uZmlndXJhdGlvbnMgdGhhdCBtYXRjaCB0aGUgYWR2ZXJ0aXNlZAorICAgICAqIHN1cHBvcnRlZCBtZWRpYSBwcm9maWxlcyA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9tZWRpYS9DYW1jb3JkZXJQcm9maWxlLmh0bWwiPkNhbWNvcmRlclByb2ZpbGU8L2E+IHdpdGgKKyAgICAgKiBJTVBMRU1FTlRBVElPTl9ERUZJTkVEIGZvcm1hdC48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19SRUNPUkQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MSwKKworICAgIC8qKgorICAgICAqIDxwPlZpZGVvIHNuYXBzaG90IG11c3QgaW5jbHVkZSBzdHJlYW0gY29uZmlndXJhdGlvbnMgYXQgbGVhc3QgYXMgYmlnIGFzCisgICAgICogdGhlIG1heGltdW0gUkVDT1JEIHJlc29sdXRpb25zIGFuZCBvbmx5IHdpdGgKKyAgICAgKiB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9KUEVHIEpQRUcgb3V0cHV0IGZvcm1hdH0uCisgICAgICogQWRkaXRpb25hbGx5IHRoZSBjb25maWd1cmF0aW9ucyBzaG91bGRuJ3QgY2F1c2UgcHJldmlldyBnbGl0Y2hlcyBhbmQgYWxzbyBiZSBhYmxlIHRvCisgICAgICogcnVuIGF0IDMwIGZwcy48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19WSURFT19TTkFQU0hPVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgyLAorCisgICAgLyoqCisgICAgICogPHA+UmVjb21tZW5kZWQgc25hcHNob3Qgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIG11c3QgaW5jbHVkZSBhdCBsZWFzdCBvbmUgd2l0aAorICAgICAqIHNpemUgY2xvc2UgdG8gQUNBTUVSQV9TRU5TT1JfSU5GT19BQ1RJVkVfQVJSQVlfU0laRSBhbmQKKyAgICAgKiB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9KUEVHIEpQRUcgb3V0cHV0IGZvcm1hdH0uCisgICAgICogVGFraW5nIGludG8gYWNjb3VudCByZXN0cmljdGlvbnMgb24gYXNwZWN0IHJhdGlvLCBhbGlnbm1lbnQgZXRjLiB0aGUgYXJlYSBvZiB0aGUKKyAgICAgKiBtYXhpbXVtIHN1Z2dlc3RlZCBzaXplIHNob3VsZG7igJl0IGJlIGxlc3MgdGhhbiA5NyUgb2YgdGhlIHNlbnNvciBhcnJheSBzaXplIGFyZWEuPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFCisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19TTkFQU0hPVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgzLAorCisgICAgLyoqCisgICAgICogPHA+SWYgc3VwcG9ydGVkLCByZWNvbW1lbmRlZCBpbnB1dCBzdHJlYW0gY29uZmlndXJhdGlvbnMgbXVzdCBvbmx5IGJlIGFkdmVydGlzZWQgd2l0aAorICAgICAqIFpTTCBhbG9uZyB3aXRoIG90aGVyIHByb2Nlc3NlZCBhbmQvb3Igc3RhbGxpbmcgb3V0cHV0IGZvcm1hdHMuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfWlNMICAgPSAweDQsCisKKyAgICAvKioKKyAgICAgKiA8cD5JZiBzdXBwb3J0ZWQsIHJlY29tbWVuZGVkIHJhdyBzdHJlYW0gY29uZmlndXJhdGlvbnMgbXVzdCBvbmx5IGluY2x1ZGUgUkFXIGJhc2VkCisgICAgICogb3V0cHV0IGZvcm1hdHMuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfUkFXICAgPSAweDUsCisKKyAgICAvKioKKyAgICAgKiA8cD5JZiBzdXBwb3J0ZWQsIHRoZSByZWNvbW1lbmRlZCBsb3cgbGF0ZW5jeSBzdHJlYW0gY29uZmlndXJhdGlvbnMgbXVzdCBoYXZlCisgICAgICogZW5kLXRvLWVuZCBsYXRlbmN5IHRoYXQgZG9lcyBub3QgZXhjZWVkIDIwMCBtcy4gdW5kZXIgc3RhbmRhcmQgb3BlcmF0aW5nIGNvbmRpdGlvbnMKKyAgICAgKiAocmVhc29uYWJsZSBsaWdodCBsZXZlbHMsIG5vdCBsb2FkZWQgc3lzdGVtKSBhbmQgdXNpbmcgdGVtcGxhdGUKKyAgICAgKiBURU1QTEFURV9TVElMTF9DQVBUVVJFLiBUaGlzIGlzIHByaW1hcmlseSBmb3IgbGlzdGluZyBjb25maWd1cmF0aW9ucyBmb3IgdGhlCisgICAgICoge0BsaW5rIEFJTUFHRV9GT1JNQVRfSlBFRyBKUEVHIG91dHB1dCBmb3JtYXR9CisgICAgICogaG93ZXZlciBvdGhlciBzdXBwb3J0ZWQgb3V0cHV0IGZvcm1hdHMgY2FuIGJlIGFkZGVkIGFzIHdlbGwuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfTE9XX0xBVEVOQ1lfU05BUFNIT1QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4NiwKKworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfUFVCTElDX0VORAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg3LAorCisgICAgLyoqCisgICAgICogPHA+VmVuZG9yIGRlZmluZWQgdXNlIGNhc2VzLiBUaGVzZSBkZXBlbmQgb24gdGhlIHZlbmRvciBpbXBsZW1lbnRhdGlvbi48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19WRU5ET1JfU1RBUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MTgsCisKK30gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX2F2YWlsYWJsZV9yZWNvbW1lbmRlZF9zdHJlYW1fY29uZmlndXJhdGlvbnNfdDsKKwogCiAvLyBBQ0FNRVJBX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDEKIHR5cGVkZWYgZW51bSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYWNhbWVyYV9zZW5zb3JfcmVmZXJlbmNlX2lsbHVtaW5hbnQxIHsKQEAgLTc0NzYsNiArODAyNywyMSBAQAogICAgICAqLwogICAgIEFDQU1FUkFfU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UX1JHQiAgICAgICAgICAgICAgICAgPSA0LAogCisgICAgLyoqCisgICAgICogPHA+U2Vuc29yIGRvZXNuJ3QgaGF2ZSBhbnkgQmF5ZXIgY29sb3IgZmlsdGVyLgorICAgICAqIFN1Y2ggc2Vuc29yIGNhcHR1cmVzIHZpc2libGUgbGlnaHQgaW4gbW9ub2Nocm9tZS4gVGhlIGV4YWN0IHdlaWdodGluZyBhbmQKKyAgICAgKiB3YXZlbGVuZ3RocyBjYXB0dXJlZCBpcyBub3Qgc3BlY2lmaWVkLCBidXQgZ2VuZXJhbGx5IG9ubHkgaW5jbHVkZXMgdGhlIHZpc2libGUKKyAgICAgKiBmcmVxdWVuY2llcy4gVGhpcyB2YWx1ZSBpbXBsaWVzIGEgTU9OT0NIUk9NRSBjYW1lcmEuPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UX01PTk8gICAgICAgICAgICAgICAgPSA1LAorCisgICAgLyoqCisgICAgICogPHA+U2Vuc29yIGhhcyBhIG5lYXIgaW5mcmFyZWQgZmlsdGVyIGNhcHR1cmluZyBsaWdodCB3aXRoIHdhdmVsZW5ndGggYmV0d2VlbgorICAgICAqIHJvdWdobHkgNzUwbm0gYW5kIDE0MDBubSwgYW5kIHRoZSBzYW1lIGZpbHRlciBjb3ZlcnMgdGhlIHdob2xlIHNlbnNvciBhcnJheS4gVGhpcworICAgICAqIHZhbHVlIGltcGxpZXMgYSBNT05PQ0hST01FIGNhbWVyYS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlRfTklSICAgICAgICAgICAgICAgICA9IDYsCisKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2Vuc29yX2luZm9fY29sb3JfZmlsdGVyX2FycmFuZ2VtZW50X3Q7CiAKIC8vIEFDQU1FUkFfU0VOU09SX0lORk9fVElNRVNUQU1QX1NPVVJDRQpAQCAtNzc2NCw2ICs4MzMwLDcgQEAKICAgICAgKiBmaXJlIHRoZSBmbGFzaCBmb3IgZmxhc2ggcG93ZXIgbWV0ZXJpbmcgZHVyaW5nIHByZWNhcHR1cmUsIGFuZCB0aGVuIGZpcmUgdGhlIGZsYXNoCiAgICAgICogZm9yIHRoZSBmaW5hbCBjYXB0dXJlLCBpZiBhIGZsYXNoIGlzIGF2YWlsYWJsZSBvbiB0aGUgZGV2aWNlIGFuZCB0aGUgQUUgbW9kZSBpcyBzZXQgdG8KICAgICAgKiBlbmFibGUgdGhlIGZsYXNoLjwvcD4KKyAgICAgKiA8cD5EZXZpY2VzIHRoYXQgaW5pdGlhbGx5IHNoaXBwZWQgd2l0aCBBbmRyb2lkIHZlcnNpb24gPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvb3MvQnVpbGQuVkVSU0lPTl9DT0RFUy5odG1sI1EiPlE8L2E+IG9yIG5ld2VyIHdpbGwgbm90IGluY2x1ZGUgYW55IExFR0FDWS1sZXZlbCBkZXZpY2VzLjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9DT05UUk9MX0FFX1BSRUNBUFRVUkVfVFJJR0dFUgogICAgICAqIEBzZWUgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMKQEAgLTc5MDQsNiArODQ3MSwxNiBAQAogCiB9IGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2RlcHRoX2RlcHRoX2lzX2V4Y2x1c2l2ZV90OwogCisvLyBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUwordHlwZWRlZiBlbnVtIGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hY2FtZXJhX2RlcHRoX2F2YWlsYWJsZV9keW5hbWljX2RlcHRoX3N0cmVhbV9jb25maWd1cmF0aW9ucyB7CisgICAgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAwLAorCisgICAgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlNfSU5QVVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDEsCisKK30gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfZGVwdGhfYXZhaWxhYmxlX2R5bmFtaWNfZGVwdGhfc3RyZWFtX2NvbmZpZ3VyYXRpb25zX3Q7CisKIAogLy8gQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9TRU5TT1JfU1lOQ19UWVBFCiB0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfbG9naWNhbF9tdWx0aV9jYW1lcmFfc2Vuc29yX3N5bmNfdHlwZSB7CkBAIC03OTQ3LDYgKzg1MjQsMTYgQEAKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfZGlzdG9ydGlvbl9jb3JyZWN0aW9uX21vZGVfdDsKIAogCisvLyBBQ0FNRVJBX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TCit0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfaGVpY19hdmFpbGFibGVfaGVpY19zdHJlYW1fY29uZmlndXJhdGlvbnMgeworICAgIEFDQU1FUkFfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUICAgICAgICAgPSAwLAorCisgICAgQUNBTUVSQV9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUUkVBTV9DT05GSUdVUkFUSU9OU19JTlBVVCAgICAgICAgICA9IDEsCisKK30gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfaGVpY19hdmFpbGFibGVfaGVpY19zdHJlYW1fY29uZmlndXJhdGlvbnNfdDsKKworCisKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjQgKi8KIAogX19FTkRfREVDTFMKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhV2luZG93VHlwZS5oIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFXaW5kb3dUeXBlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTlmNjdlOQotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhV2luZG93VHlwZS5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9OREtfQ0FNRVJBX1dJTkRPV19UWVBFX0gKKyNkZWZpbmUgX05ES19DQU1FUkFfV0lORE9XX1RZUEVfSAorCisvKioKKyAqIEBhZGR0b2dyb3VwIENhbWVyYQorICogQHsKKyAqLworCisvKioKKyAqIEBmaWxlIE5ka0NhbWVyYVdpbmRvd1R5cGUuaAorICovCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBhbiBOREsgQVBJLgorICogRG8gbm90IHJlbW92ZSBtZXRob2RzLgorICogRG8gbm90IGNoYW5nZSBtZXRob2Qgc2lnbmF0dXJlcy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGNvbnN0YW50cy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHNpemUgb2YgYW55IG9mIHRoZSBjbGFzc2VzIGRlZmluZWQgaW4gaGVyZS4KKyAqIERvIG5vdCByZWZlcmVuY2UgdHlwZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIE5ESy4KKyAqIERvIG5vdCAjaW5jbHVkZSBmaWxlcyB0aGF0IGFyZW4ndCBwYXJ0IG9mIHRoZSBOREsuCisgKi8KKworLyoqCisgKiBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgd2luZG93IHR5cGUgdXNlZCBieSBOREsgYW5kIHRoZSBWTkRLIHZhcmlhbnRzIG9mIHRoZQorICogY2FtZXJhMiBOREsuIFRoaXMgZW5hYmxlcyB1cyB0byBzaGFyZSB0aGUgYXBpIGRlZmluaXRpb24gaGVhZGVycyBhbmQgYXZvaWQKKyAqIGNvZGUgZHVwbGljYXRpb24gKHNpbmNlIHRoZSBWTkRLIHZhcmlhbnQgZG9lc24ndCB1c2UgQU5hdGl2ZVdpbmRvdyB1bmxpa2UgdGhlCisgKiBOREsgdmFyaWFudCkuCisgKi8KKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KK3R5cGVkZWYgbmF0aXZlX2hhbmRsZV90IEFDYW1lcmFXaW5kb3dUeXBlOworI2Vsc2UKKyNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KK3R5cGVkZWYgQU5hdGl2ZVdpbmRvdyBBQ2FtZXJhV2luZG93VHlwZTsKKyNlbmRpZgorCisjZW5kaWYgLy9fTkRLX0NBTUVSQV9XSU5ET1dfVFlQRV9ICmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhcHR1cmVSZXF1ZXN0LmggYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhcHR1cmVSZXF1ZXN0LmgKaW5kZXggNDk2MWNlMy4uZDNmODgyNiAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYXB0dXJlUmVxdWVzdC5oCisrKyBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FwdHVyZVJlcXVlc3QuaApAQCAtMzUsOSArMzUsOSBAQAogCiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CiAKLSNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KICNpbmNsdWRlICJOZGtDYW1lcmFFcnJvci5oIgogI2luY2x1ZGUgIk5ka0NhbWVyYU1ldGFkYXRhLmgiCisjaW5jbHVkZSAiTmRrQ2FtZXJhV2luZG93VHlwZS5oIgogCiAjaWZuZGVmIF9OREtfQ0FQVFVSRV9SRVFVRVNUX0gKICNkZWZpbmUgX05ES19DQVBUVVJFX1JFUVVFU1RfSApAQCAtMTAxLDcgKzEwMSw4IEBACiAgKgogICogQHNlZSBBQ2FwdHVyZVJlcXVlc3RfYWRkVGFyZ2V0CiAgKi8KLWNhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2NyZWF0ZShBTmF0aXZlV2luZG93KiB3aW5kb3csIEFDYW1lcmFPdXRwdXRUYXJnZXQqKiBvdXRwdXQpOworY2FtZXJhX3N0YXR1c190IEFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlKEFDYW1lcmFXaW5kb3dUeXBlKiB3aW5kb3csCisgICAgICAgIEFDYW1lcmFPdXRwdXRUYXJnZXQqKiBvdXRwdXQpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qKgogICogRnJlZSBhIEFDYW1lcmFPdXRwdXRUYXJnZXQgb2JqZWN0LgpAQCAtMTEwLDcgKzExMSw3IEBACiAgKgogICogQHNlZSBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2NyZWF0ZQogICovCi12b2lkIEFDYW1lcmFPdXRwdXRUYXJnZXRfZnJlZShBQ2FtZXJhT3V0cHV0VGFyZ2V0KiBvdXRwdXQpOwordm9pZCBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2ZyZWUoQUNhbWVyYU91dHB1dFRhcmdldCogb3V0cHV0KSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKICAqIEFkZCBhbiB7QGxpbmsgQUNhbWVyYU91dHB1dFRhcmdldH0gb2JqZWN0IHRvIHtAbGluayBBQ2FwdHVyZVJlcXVlc3R9LgpAQCAtMTIzLDcgKzEyNCw3IEBACiAgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgcmVxdWVzdCBvciBvdXRwdXQgaXMgTlVMTC48L2xpPjwvdWw+CiAgKi8KIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVJlcXVlc3RfYWRkVGFyZ2V0KEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwKLSAgICAgICAgY29uc3QgQUNhbWVyYU91dHB1dFRhcmdldCogb3V0cHV0KTsKKyAgICAgICAgY29uc3QgQUNhbWVyYU91dHB1dFRhcmdldCogb3V0cHV0KSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKICAqIFJlbW92ZSBhbiB7QGxpbmsgQUNhbWVyYU91dHB1dFRhcmdldH0gb2JqZWN0IGZyb20ge0BsaW5rIEFDYXB0dXJlUmVxdWVzdH0uCkBAIC0xMzgsNyArMTM5LDcgQEAKICAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSfSBpZiByZXF1ZXN0IG9yIG91dHB1dCBpcyBOVUxMLjwvbGk+PC91bD4KICAqLwogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlUmVxdWVzdF9yZW1vdmVUYXJnZXQoQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LAotICAgICAgICBjb25zdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0KiBvdXRwdXQpOworICAgICAgICBjb25zdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0KiBvdXRwdXQpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qKgogICogR2V0IGEgbWV0YWRhdGEgZW50cnkgZnJvbSBpbnB1dCB7QGxpbmsgQUNhcHR1cmVSZXF1ZXN0fS4KQEAgLTE1OCw3ICsxNTksNyBAQAogICogICAgICAgICAgICAgZW50cnkgb2YgaW5wdXQgdGFnIHZhbHVlLjwvbGk+PC91bD4KICAqLwogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlUmVxdWVzdF9nZXRDb25zdEVudHJ5KAotICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIHVpbnQzMl90IHRhZywgQUNhbWVyYU1ldGFkYXRhX2NvbnN0X2VudHJ5KiBlbnRyeSk7CisgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgdWludDMyX3QgdGFnLCBBQ2FtZXJhTWV0YWRhdGFfY29uc3RfZW50cnkqIGVudHJ5KSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKgogICogTGlzdCBhbGwgdGhlIGVudHJ5IHRhZ3MgaW4gaW5wdXQge0BsaW5rIEFDYXB0dXJlUmVxdWVzdH0uCkBAIC0xNzksNyArMTgwLDcgQEAKICAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX1VOS05PV059IGlmIHRoZSBtZXRob2QgZmFpbHMgZm9yIHNvbWUgb3RoZXIgcmVhc29ucy48L2xpPjwvdWw+CiAgKi8KIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVJlcXVlc3RfZ2V0QWxsVGFncygKLSAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCAvKm91dCovaW50MzJfdCogbnVtVGFncywgLypvdXQqL2NvbnN0IHVpbnQzMl90KiogdGFncyk7CisgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgLypvdXQqL2ludDMyX3QqIG51bVRhZ3MsIC8qb3V0Ki9jb25zdCB1aW50MzJfdCoqIHRhZ3MpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qKgogICogU2V0L2NoYW5nZSBhIGNhbWVyYSBjYXB0dXJlIGNvbnRyb2wgZW50cnkgd2l0aCB1bnNpZ25lZCA4IGJpdHMgZGF0YSB0eXBlLgpAQCAtMTk4LDcgKzE5OSw3IEBACiAgKiAgICAgICAgICAgICB0aGUgdGFnIGlzIG5vdCBjb250cm9sbGFibGUgYnkgYXBwbGljYXRpb24uPC9saT48L3VsPgogICovCiBjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3U4KAotICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIHVpbnQzMl90IHRhZywgdWludDMyX3QgY291bnQsIGNvbnN0IHVpbnQ4X3QqIGRhdGEpOworICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIHVpbnQzMl90IHRhZywgdWludDMyX3QgY291bnQsIGNvbnN0IHVpbnQ4X3QqIGRhdGEpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qKgogICogU2V0L2NoYW5nZSBhIGNhbWVyYSBjYXB0dXJlIGNvbnRyb2wgZW50cnkgd2l0aCBzaWduZWQgMzIgYml0cyBkYXRhIHR5cGUuCkBAIC0yMTcsNyArMjE4LDcgQEAKICAqICAgICAgICAgICAgIHRoZSB0YWcgaXMgbm90IGNvbnRyb2xsYWJsZSBieSBhcHBsaWNhdGlvbi48L2xpPjwvdWw+CiAgKi8KIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfaTMyKAotICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIHVpbnQzMl90IHRhZywgdWludDMyX3QgY291bnQsIGNvbnN0IGludDMyX3QqIGRhdGEpOworICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIHVpbnQzMl90IHRhZywgdWludDMyX3QgY291bnQsIGNvbnN0IGludDMyX3QqIGRhdGEpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qKgogICogU2V0L2NoYW5nZSBhIGNhbWVyYSBjYXB0dXJlIGNvbnRyb2wgZW50cnkgd2l0aCBmbG9hdCBkYXRhIHR5cGUuCkBAIC0yMzYsNyArMjM3LDcgQEAKICAqICAgICAgICAgICAgIHRoZSB0YWcgaXMgbm90IGNvbnRyb2xsYWJsZSBieSBhcHBsaWNhdGlvbi48L2xpPjwvdWw+CiAgKi8KIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfZmxvYXQoCi0gICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgdWludDMyX3QgdGFnLCB1aW50MzJfdCBjb3VudCwgY29uc3QgZmxvYXQqIGRhdGEpOworICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIHVpbnQzMl90IHRhZywgdWludDMyX3QgY291bnQsIGNvbnN0IGZsb2F0KiBkYXRhKSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKICAqIFNldC9jaGFuZ2UgYSBjYW1lcmEgY2FwdHVyZSBjb250cm9sIGVudHJ5IHdpdGggc2lnbmVkIDY0IGJpdHMgZGF0YSB0eXBlLgpAQCAtMjU1LDcgKzI1Niw3IEBACiAgKiAgICAgICAgICAgICB0aGUgdGFnIGlzIG5vdCBjb250cm9sbGFibGUgYnkgYXBwbGljYXRpb24uPC9saT48L3VsPgogICovCiBjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X2k2NCgKLSAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCB1aW50MzJfdCB0YWcsIHVpbnQzMl90IGNvdW50LCBjb25zdCBpbnQ2NF90KiBkYXRhKTsKKyAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCB1aW50MzJfdCB0YWcsIHVpbnQzMl90IGNvdW50LCBjb25zdCBpbnQ2NF90KiBkYXRhKSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKICAqIFNldC9jaGFuZ2UgYSBjYW1lcmEgY2FwdHVyZSBjb250cm9sIGVudHJ5IHdpdGggZG91YmxlIGRhdGEgdHlwZS4KQEAgLTI3NCw3ICsyNzUsNyBAQAogICogICAgICAgICAgICAgdGhlIHRhZyBpcyBub3QgY29udHJvbGxhYmxlIGJ5IGFwcGxpY2F0aW9uLjwvbGk+PC91bD4KICAqLwogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9kb3VibGUoCi0gICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgdWludDMyX3QgdGFnLCB1aW50MzJfdCBjb3VudCwgY29uc3QgZG91YmxlKiBkYXRhKTsKKyAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCB1aW50MzJfdCB0YWcsIHVpbnQzMl90IGNvdW50LCBjb25zdCBkb3VibGUqIGRhdGEpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qKgogICogU2V0L2NoYW5nZSBhIGNhbWVyYSBjYXB0dXJlIGNvbnRyb2wgZW50cnkgd2l0aCByYXRpb25hbCBkYXRhIHR5cGUuCkBAIC0yOTQsMTQgKzI5NSwxNCBAQAogICovCiBjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3JhdGlvbmFsKAogICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIHVpbnQzMl90IHRhZywgdWludDMyX3QgY291bnQsCi0gICAgICAgIGNvbnN0IEFDYW1lcmFNZXRhZGF0YV9yYXRpb25hbCogZGF0YSk7CisgICAgICAgIGNvbnN0IEFDYW1lcmFNZXRhZGF0YV9yYXRpb25hbCogZGF0YSkgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogLyoqCiAgKiBGcmVlIGEge0BsaW5rIEFDYXB0dXJlUmVxdWVzdH0gc3RydWN0dXJlLgogICoKICAqIEBwYXJhbSByZXF1ZXN0IHRoZSB7QGxpbmsgQUNhcHR1cmVSZXF1ZXN0fSB0byBiZSBmcmVlZC4KICAqLwotdm9pZCBBQ2FwdHVyZVJlcXVlc3RfZnJlZShBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QpOwordm9pZCBBQ2FwdHVyZVJlcXVlc3RfZnJlZShBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjQgKi8KIApAQCAtMzI1LDcgKzMyNiw3IEBACiAgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgcmVxdWVzdCBpcyBOVUxMLjwvbGk+PC91bD4KICAqLwogY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlUmVxdWVzdF9zZXRVc2VyQ29udGV4dCgKLSAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCB2b2lkKiBjb250ZXh0KTsKKyAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCB2b2lkKiBjb250ZXh0KSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCiAvKioKICAqIEdldCB0aGUgdXNlciBjb250ZXh0IHBvaW50ZXIgb2YgdGhlIHtAbGluayBBQ2FwdHVyZVJlcXVlc3R9CkBAIC0zNDEsNyArMzQyLDcgQEAKICAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSfSBpZiByZXF1ZXN0IGlzIE5VTEwuPC9saT48L3VsPgogICovCiBjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVSZXF1ZXN0X2dldFVzZXJDb250ZXh0KAotICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIC8qb3V0Ki92b2lkKiogY29udGV4dCk7CisgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgLypvdXQqL3ZvaWQqKiBjb250ZXh0KSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCiAvKioKICAqIENyZWF0ZSBhIGNvcHkgb2YgaW5wdXQge0BsaW5rIEFDYXB0dXJlUmVxdWVzdH0uCkBAIC0zNTMsMTAgKzM1NCwyMjMgQEAKICAqCiAgKiBAcmV0dXJuIGEgdmFsaWQgQUNhcHR1cmVSZXF1ZXN0IHBvaW50ZXIgb3IgTlVMTCBpZiB0aGUgaW5wdXQgcmVxdWVzdCBjYW5ub3QgYmUgY29waWVkLgogICovCi1BQ2FwdHVyZVJlcXVlc3QqIEFDYXB0dXJlUmVxdWVzdF9jb3B5KGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc3JjKTsKK0FDYXB0dXJlUmVxdWVzdCogQUNhcHR1cmVSZXF1ZXN0X2NvcHkoY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiBzcmMpIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjggKi8KIAorI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOQorCisvKioKKyAqIEdldCBhIG1ldGFkYXRhIGVudHJ5IGZyb20gaW5wdXQge0BsaW5rIEFDYXB0dXJlUmVxdWVzdH0gZm9yCisgKiBhIHBoeXNpY2FsIGNhbWVyYSBiYWNraW5nIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEgZGV2aWNlLgorICoKKyAqIDxwPlNhbWUgYXMgQUNhcHR1cmVSZXF1ZXN0X2dldENvbnN0RW50cnksIGV4Y2VwdCB0aGF0IGlmIHRoZSBrZXkgaXMgY29udGFpbmVkCisgKiBpbiB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfSwgdGhpcyBmdW5jdGlvbgorICogcmV0dXJucyB0aGUgZW50cnkgc2V0IGJ5IEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9waHlzaWNhbENhbWVyYV8qIGNsYXNzIG9mCisgKiBmdW5jdGlvbnMgb24gdGhlIHBhcnRpY3VsYXIgcGh5c2ljYWwgY2FtZXJhLjwvcD4KKyAqCisgKiBAcGFyYW0gcmVxdWVzdCB0aGUge0BsaW5rIEFDYXB0dXJlUmVxdWVzdH0gb2YgaW50ZXJlc3QgY3JlYXRlZCBieQorICogICAgICAgICAgICAgICAge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Rfd2l0aFBoeXNpY2FsSWRzfS4KKyAqIEBwYXJhbSBwaHlzaWNhbElkIG9uZSBvZiB0aGUgcGh5c2ljYWwgSWRzIHVzZWQgd2hlbiByZXF1ZXN0IGlzIGNyZWF0ZWQgd2l0aAorICogICAgICAgICAgICAgICAgICAge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Rfd2l0aFBoeXNpY2FsSWRzfS4KKyAqIEBwYXJhbSB0YWcgdGhlIGNhcHR1cmUgcmVxdWVzdCBtZXRhZGF0YSB0YWcgaW4KKyAqICAgICAgICAgICAge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30KKyAqICAgICAgICAgICAgdGhhdCBpcyBzZXQgYnkgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3BoeXNpY2FsQ2FtZXJhXyogY2xhc3Mgb2YgZnVuY3Rpb25zLgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIG1ldGFkYXRhLCBwaHlzaWNhbElkLCBvciBlbnRyeSBpcyBOVUxMLAorICogICAgICAgICBwaHlzaWNhbElkIGlzIG5vdCBvbmUgb2YgdGhlIElkcyB1c2VkIGluIGNyZWF0aW5nIHRoZSByZXF1ZXN0LCBvciBpZiB0aGUgY2FwdHVyZQorICogICAgICAgICByZXF1ZXN0IGlzIGEgcmVndWxhciByZXF1ZXN0IHdpdGggbm8gcGh5c2ljYWwgSWRzIGF0IGFsbC48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfTUVUQURBVEFfTk9UX0ZPVU5EfSBpZiB0aGUgY2FwdHVyZSByZXF1ZXN0IGRvZXMgbm90IGNvbnRhaW4gYW4KKyAqICAgICAgICAgICAgIGVudHJ5IG9mIGlucHV0IHRhZyB2YWx1ZS48L2xpPjwvdWw+CisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVJlcXVlc3RfZ2V0Q29uc3RFbnRyeV9waHlzaWNhbENhbWVyYSgKKyAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCBjb25zdCBjaGFyKiBwaHlzaWNhbElkLCB1aW50MzJfdCB0YWcsCisgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9jb25zdF9lbnRyeSogZW50cnkpIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKy8qKgorICogU2V0L2NoYW5nZSBhIGNhbWVyYSBjYXB0dXJlIGNvbnRyb2wgZW50cnkgd2l0aCB1bnNpZ25lZCA4IGJpdHMgZGF0YSB0eXBlIGZvcgorICogYSBwaHlzaWNhbCBjYW1lcmEgYmFja2luZyBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhIGRldmljZS4KKyAqCisgKiA8cD5TYW1lIGFzIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV91OCwgZXhjZXB0IHRoYXQgaWYge0BsaW5rIHRhZ30gaXMgY29udGFpbmVkCisgKiBpbiB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfSwgdGhpcyBmdW5jdGlvbgorICogc2V0cyB0aGUgZW50cnkgZm9yIGEgcGFydGljdWxhciBwaHlzaWNhbCBzdWItY2FtZXJhIGJhY2tpbmcgdGhlIGxvZ2ljYWwgbXVsdGktY2FtZXJhLgorICogSWYge0BsaW5rIHRhZ30gaXMgbm90IGNvbnRhaW5lZCBpbgorICoge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30sIHRoZSBrZXkgd2lsbCBiZSBpZ25vcmVkCisgKiBieSB0aGUgY2FtZXJhIGRldmljZS48L3A+CisgKgorICogQHBhcmFtIHJlcXVlc3QgdGhlIHtAbGluayBBQ2FwdHVyZVJlcXVlc3R9IG9mIGludGVyZXN0IGNyZWF0ZWQgYnkKKyAqICAgICAgICAgICAgICAgIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0X3dpdGhQaHlzaWNhbElkc30uCisgKiBAcGFyYW0gcGh5c2ljYWxJZCBvbmUgb2YgdGhlIHBoeXNpY2FsIElkcyB1c2VkIHdoZW4gcmVxdWVzdCBpcyBjcmVhdGVkIHdpdGgKKyAqICAgICAgICAgICAgICAgICAgIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0X3dpdGhQaHlzaWNhbElkc30uCisgKiBAcGFyYW0gdGFnIG9uZSBvZiB0aGUgY2FwdHVyZSByZXF1ZXN0IG1ldGFkYXRhIHRhZ3MgaW4KKyAqICAgICAgICAgICAge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30uCisgKgorICogQHJldHVybiA8dWw+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9PS30gaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgcmVxdWVzdCBvciBwaHlzaWNhbElkIGlzIE5VTEwsIGNvdW50IGlzCisgKiAgICAgICAgICAgICBsYXJnZXIgdGhhbiB6ZXJvIHdoaWxlIGRhdGEgaXMgTlVMTCwgdGhlIGRhdGEgdHlwZSBvZiB0aGUgdGFnIGlzIG5vdCB1bnNpZ25lZCA4IGJpdHMsCisgKiAgICAgICAgICAgICB0aGUgdGFnIGlzIG5vdCBjb250cm9sbGFibGUgYnkgYXBwbGljYXRpb24sIHBoeXNpY2FsSWQgaXMgbm90IG9uZSBvZiB0aGUgSWRzIHVzZWQKKyAqICAgICAgICAgICAgIGluIGNyZWF0aW5nIHRoZSByZXF1ZXN0LCBvciBpZiB0aGUgY2FwdHVyZSByZXF1ZXN0IGlzIGEgcmVndWxhciByZXF1ZXN0IHdpdGggbm8KKyAqICAgICAgICAgICAgIHBoeXNpY2FsIElkcyBhdCBhbGwuPC9saT48L3VsPgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3BoeXNpY2FsQ2FtZXJhX3U4KAorICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIGNvbnN0IGNoYXIqIHBoeXNpY2FsSWQsIHVpbnQzMl90IHRhZywKKyAgICAgICAgdWludDMyX3QgY291bnQsIGNvbnN0IHVpbnQ4X3QqIGRhdGEpIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKy8qKgorICogU2V0L2NoYW5nZSBhIGNhbWVyYSBjYXB0dXJlIGNvbnRyb2wgZW50cnkgd2l0aCBzaWduZWQgMzIgYml0cyBkYXRhIHR5cGUgZm9yCisgKiBhIHBoeXNpY2FsIGNhbWVyYSBvZiBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhIGRldmljZS4KKyAqCisgKiA8cD5TYW1lIGFzIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9pMzIsIGV4Y2VwdCB0aGF0IGlmIHtAbGluayB0YWd9IGlzIGNvbnRhaW5lZAorICogaW4ge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30sIHRoaXMgZnVuY3Rpb24KKyAqIHNldHMgdGhlIGVudHJ5IGZvciBhIHBhcnRpY3VsYXIgcGh5c2ljYWwgc3ViLWNhbWVyYSBiYWNraW5nIHRoZSBsb2dpY2FsIG11bHRpLWNhbWVyYS4KKyAqIElmIHtAbGluayB0YWd9IGlzIG5vdCBjb250YWluZWQgaW4KKyAqIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LCB0aGUga2V5IHdpbGwgYmUgaWdub3JlZAorICogYnkgdGhlIGNhbWVyYSBkZXZpY2UuPC9wPgorICoKKyAqIEBwYXJhbSByZXF1ZXN0IHRoZSB7QGxpbmsgQUNhcHR1cmVSZXF1ZXN0fSBvZiBpbnRlcmVzdCBjcmVhdGVkIGJ5CisgKiAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICogQHBhcmFtIHBoeXNpY2FsSWQgb25lIG9mIHRoZSBwaHlzaWNhbCBJZHMgdXNlZCB3aGVuIHJlcXVlc3QgaXMgY3JlYXRlZCB3aXRoCisgKiAgICAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICogQHBhcmFtIHRhZyBvbmUgb2YgdGhlIGNhcHR1cmUgcmVxdWVzdCBtZXRhZGF0YSB0YWdzIGluCisgKiAgICAgICAgICAgIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIHJlcXVlc3Qgb3IgcGh5c2ljYWxJZCBpcyBOVUxMLCBjb3VudCBpcworICogICAgICAgICAgICAgbGFyZ2VyIHRoYW4gemVybyB3aGlsZSBkYXRhIGlzIE5VTEwsIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHRhZyBpcyBub3Qgc2lnbmVkIDMyIGJpdHMsCisgKiAgICAgICAgICAgICB0aGUgdGFnIGlzIG5vdCBjb250cm9sbGFibGUgYnkgYXBwbGljYXRpb24sIHBoeXNpY2FsSWQgaXMgbm90IG9uZSBvZiB0aGUgSWRzIHVzZWQKKyAqICAgICAgICAgICAgIGluIGNyZWF0aW5nIHRoZSByZXF1ZXN0LCBvciBpZiB0aGUgY2FwdHVyZSByZXF1ZXN0IGlzIGEgcmVndWxhciByZXF1ZXN0IHdpdGggbm8KKyAqICAgICAgICAgICAgIHBoeXNpY2FsIElkcyBhdCBhbGwuPC9saT48L3VsPgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3BoeXNpY2FsQ2FtZXJhX2kzMigKKyAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCBjb25zdCBjaGFyKiBwaHlzaWNhbElkLCB1aW50MzJfdCB0YWcsCisgICAgICAgIHVpbnQzMl90IGNvdW50LCBjb25zdCBpbnQzMl90KiBkYXRhKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisvKioKKyAqIFNldC9jaGFuZ2UgYSBjYW1lcmEgY2FwdHVyZSBjb250cm9sIGVudHJ5IHdpdGggZmxvYXQgZGF0YSB0eXBlIGZvcgorICogYSBwaHlzaWNhbCBjYW1lcmEgb2YgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSBkZXZpY2UuCisgKgorICogPHA+U2FtZSBhcyBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfZmxvYXQsIGV4Y2VwdCB0aGF0IGlmIHtAbGluayB0YWd9IGlzIGNvbnRhaW5lZAorICogaW4ge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30sIHRoaXMgZnVuY3Rpb24KKyAqIHNldHMgdGhlIGVudHJ5IGZvciBhIHBhcnRpY3VsYXIgcGh5c2ljYWwgc3ViLWNhbWVyYSBiYWNraW5nIHRoZSBsb2dpY2FsIG11bHRpLWNhbWVyYS4KKyAqIElmIHtAbGluayB0YWd9IGlzIG5vdCBjb250YWluZWQgaW4KKyAqIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LCB0aGUga2V5IHdpbGwgYmUgaWdub3JlZAorICogYnkgdGhlIGNhbWVyYSBkZXZpY2UuPC9wPgorICoKKyAqIEBwYXJhbSByZXF1ZXN0IHRoZSB7QGxpbmsgQUNhcHR1cmVSZXF1ZXN0fSBvZiBpbnRlcmVzdCBjcmVhdGVkIGJ5CisgKiAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICogQHBhcmFtIHBoeXNpY2FsSWQgb25lIG9mIHRoZSBwaHlzaWNhbCBJZHMgdXNlZCB3aGVuIHJlcXVlc3QgaXMgY3JlYXRlZCB3aXRoCisgKiAgICAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICogQHBhcmFtIHRhZyBvbmUgb2YgdGhlIGNhcHR1cmUgcmVxdWVzdCBtZXRhZGF0YSB0YWdzIGluCisgKiAgICAgICAgICAgIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIHJlcXVlc3Qgb3IgcGh5c2ljYWxJZCBpcyBOVUxMLCBjb3VudCBpcworICogICAgICAgICAgICAgbGFyZ2VyIHRoYW4gemVybyB3aGlsZSBkYXRhIGlzIE5VTEwsIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHRhZyBpcyBub3QgZmxvYXQsCisgKiAgICAgICAgICAgICB0aGUgdGFnIGlzIG5vdCBjb250cm9sbGFibGUgYnkgYXBwbGljYXRpb24sIHBoeXNpY2FsSWQgaXMgbm90IG9uZSBvZiB0aGUgSWRzIHVzZWQKKyAqICAgICAgICAgICAgIGluIGNyZWF0aW5nIHRoZSByZXF1ZXN0LCBvciBpZiB0aGUgY2FwdHVyZSByZXF1ZXN0IGlzIGEgcmVndWxhciByZXF1ZXN0IHdpdGggbm8KKyAqICAgICAgICAgICAgIHBoeXNpY2FsIElkcyBhdCBhbGwuPC9saT48L3VsPgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3BoeXNpY2FsQ2FtZXJhX2Zsb2F0KAorICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIGNvbnN0IGNoYXIqIHBoeXNpY2FsSWQsIHVpbnQzMl90IHRhZywKKyAgICAgICAgdWludDMyX3QgY291bnQsIGNvbnN0IGZsb2F0KiBkYXRhKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisvKioKKyAqIFNldC9jaGFuZ2UgYSBjYW1lcmEgY2FwdHVyZSBjb250cm9sIGVudHJ5IHdpdGggc2lnbmVkIDY0IGJpdHMgZGF0YSB0eXBlIGZvcgorICogYSBwaHlzaWNhbCBjYW1lcmEgb2YgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSBkZXZpY2UuCisgKgorICogPHA+U2FtZSBhcyBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfaTY0LCBleGNlcHQgdGhhdCBpZiB7QGxpbmsgdGFnfSBpcyBjb250YWluZWQKKyAqIGluIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LCB0aGlzIGZ1bmN0aW9uCisgKiBzZXRzIHRoZSBlbnRyeSBmb3IgYSBwYXJ0aWN1bGFyIHBoeXNpY2FsIHN1Yi1jYW1lcmEgYmFja2luZyB0aGUgbG9naWNhbCBtdWx0aS1jYW1lcmEuCisgKiBJZiB7QGxpbmsgdGFnfSBpcyBub3QgY29udGFpbmVkIGluCisgKiB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfSwgdGhlIGtleSB3aWxsIGJlIGlnbm9yZWQKKyAqIGJ5IHRoZSBjYW1lcmEgZGV2aWNlLjwvcD4KKyAqCisgKiBAcGFyYW0gcmVxdWVzdCB0aGUge0BsaW5rIEFDYXB0dXJlUmVxdWVzdH0gb2YgaW50ZXJlc3QgY3JlYXRlZCBieQorICogICAgICAgICAgICAgICAge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Rfd2l0aFBoeXNpY2FsSWRzfS4KKyAqIEBwYXJhbSBwaHlzaWNhbElkIG9uZSBvZiB0aGUgcGh5c2ljYWwgSWRzIHVzZWQgd2hlbiByZXF1ZXN0IGlzIGNyZWF0ZWQgd2l0aAorICogICAgICAgICAgICAgICAgICAge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Rfd2l0aFBoeXNpY2FsSWRzfS4KKyAqIEBwYXJhbSB0YWcgb25lIG9mIHRoZSBjYXB0dXJlIHJlcXVlc3QgbWV0YWRhdGEgdGFncyBpbgorICogICAgICAgICAgICB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfS4KKyAqCisgKiBAcmV0dXJuIDx1bD4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX09LfSBpZiB0aGUgbWV0aG9kIGNhbGwgc3VjY2VlZHMuPC9saT4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSfSBpZiByZXF1ZXN0IG9yIHBoeXNpY2FsSWQgaXMgTlVMTCwgY291bnQgaXMKKyAqICAgICAgICAgICAgIGxhcmdlciB0aGFuIHplcm8gd2hpbGUgZGF0YSBpcyBOVUxMLCB0aGUgZGF0YSB0eXBlIG9mIHRoZSB0YWcgaXMgbm90IHNpZ25lZCA2NCBiaXRzLAorICogICAgICAgICAgICAgdGhlIHRhZyBpcyBub3QgY29udHJvbGxhYmxlIGJ5IGFwcGxpY2F0aW9uLCBwaHlzaWNhbElkIGlzIG5vdCBvbmUgb2YgdGhlIElkcyB1c2VkCisgKiAgICAgICAgICAgICBpbiBjcmVhdGluZyB0aGUgcmVxdWVzdCwgb3IgaWYgdGhlIGNhcHR1cmUgcmVxdWVzdCBpcyBhIHJlZ3VsYXIgcmVxdWVzdCB3aXRoIG5vCisgKiAgICAgICAgICAgICBwaHlzaWNhbCBJZHMgYXQgYWxsLjwvbGk+PC91bD4KKyAqLworY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9waHlzaWNhbENhbWVyYV9pNjQoCisgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgY29uc3QgY2hhciogcGh5c2ljYWxJZCwgdWludDMyX3QgdGFnLAorICAgICAgICB1aW50MzJfdCBjb3VudCwgY29uc3QgaW50NjRfdCogZGF0YSkgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCisgKiBTZXQvY2hhbmdlIGEgY2FtZXJhIGNhcHR1cmUgY29udHJvbCBlbnRyeSB3aXRoIGRvdWJsZSBkYXRhIHR5cGUgZm9yCisgKiBhIHBoeXNpY2FsIGNhbWVyYSBvZiBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhIGRldmljZS4KKyAqCisgKiA8cD5TYW1lIGFzIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9kb3VibGUsIGV4Y2VwdCB0aGF0IGlmIHtAbGluayB0YWd9IGlzIGNvbnRhaW5lZAorICogaW4ge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30sIHRoaXMgZnVuY3Rpb24KKyAqIHNldHMgdGhlIGVudHJ5IGZvciBhIHBhcnRpY3VsYXIgcGh5c2ljYWwgc3ViLWNhbWVyYSBiYWNraW5nIHRoZSBsb2dpY2FsIG11bHRpLWNhbWVyYS4KKyAqIElmIHtAbGluayB0YWd9IGlzIG5vdCBjb250YWluZWQgaW4KKyAqIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LCB0aGUga2V5IHdpbGwgYmUgaWdub3JlZAorICogYnkgdGhlIGNhbWVyYSBkZXZpY2UuPC9wPgorICoKKyAqIEBwYXJhbSByZXF1ZXN0IHRoZSB7QGxpbmsgQUNhcHR1cmVSZXF1ZXN0fSBvZiBpbnRlcmVzdCBjcmVhdGVkIGJ5CisgKiAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICogQHBhcmFtIHBoeXNpY2FsSWQgb25lIG9mIHRoZSBwaHlzaWNhbCBJZHMgdXNlZCB3aGVuIHJlcXVlc3QgaXMgY3JlYXRlZCB3aXRoCisgKiAgICAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICogQHBhcmFtIHRhZyBvbmUgb2YgdGhlIGNhcHR1cmUgcmVxdWVzdCBtZXRhZGF0YSB0YWdzIGluCisgKiAgICAgICAgICAgIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIHJlcXVlc3Qgb3IgcGh5c2ljYWxJZCBpcyBOVUxMLCBjb3VudCBpcworICogICAgICAgICAgICAgbGFyZ2VyIHRoYW4gemVybyB3aGlsZSBkYXRhIGlzIE5VTEwsIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHRhZyBpcyBub3QgZG91YmxlLAorICogICAgICAgICAgICAgdGhlIHRhZyBpcyBub3QgY29udHJvbGxhYmxlIGJ5IGFwcGxpY2F0aW9uLCBwaHlzaWNhbElkIGlzIG5vdCBvbmUgb2YgdGhlIElkcyB1c2VkCisgKiAgICAgICAgICAgICBpbiBjcmVhdGluZyB0aGUgcmVxdWVzdCwgb3IgaWYgdGhlIGNhcHR1cmUgcmVxdWVzdCBpcyBhIHJlZ3VsYXIgcmVxdWVzdCB3aXRoIG5vCisgKiAgICAgICAgICAgICBwaHlzaWNhbCBJZHMgYXQgYWxsLjwvbGk+PC91bD4KKyAqLworY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9waHlzaWNhbENhbWVyYV9kb3VibGUoCisgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgY29uc3QgY2hhciogcGh5c2ljYWxJZCwgdWludDMyX3QgdGFnLAorICAgICAgICB1aW50MzJfdCBjb3VudCwgY29uc3QgZG91YmxlKiBkYXRhKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisvKioKKyAqIFNldC9jaGFuZ2UgYSBjYW1lcmEgY2FwdHVyZSBjb250cm9sIGVudHJ5IHdpdGggcmF0aW9uYWwgZGF0YSB0eXBlIGZvcgorICogYSBwaHlzaWNhbCBjYW1lcmEgb2YgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSBkZXZpY2UuCisgKgorICogPHA+U2FtZSBhcyBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfcmF0aW9uYWwsIGV4Y2VwdCB0aGF0IGlmIHtAbGluayB0YWd9IGlzIGNvbnRhaW5lZAorICogaW4ge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30sIHRoaXMgZnVuY3Rpb24KKyAqIHNldHMgdGhlIGVudHJ5IGZvciBhIHBhcnRpY3VsYXIgcGh5c2ljYWwgc3ViLWNhbWVyYSBiYWNraW5nIHRoZSBsb2dpY2FsIG11bHRpLWNhbWVyYS4KKyAqIElmIHtAbGluayB0YWd9IGlzIG5vdCBjb250YWluZWQgaW4KKyAqIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LCB0aGUga2V5IHdpbGwgYmUgaWdub3JlZAorICogYnkgdGhlIGNhbWVyYSBkZXZpY2UuPC9wPgorICoKKyAqIEBwYXJhbSByZXF1ZXN0IHRoZSB7QGxpbmsgQUNhcHR1cmVSZXF1ZXN0fSBvZiBpbnRlcmVzdCBjcmVhdGVkIGJ5CisgKiAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICogQHBhcmFtIHBoeXNpY2FsSWQgb25lIG9mIHRoZSBwaHlzaWNhbCBJZHMgdXNlZCB3aGVuIHJlcXVlc3QgaXMgY3JlYXRlZCB3aXRoCisgKiAgICAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICogQHBhcmFtIHRhZyBvbmUgb2YgdGhlIGNhcHR1cmUgcmVxdWVzdCBtZXRhZGF0YSB0YWdzIGluCisgKiAgICAgICAgICAgIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIHJlcXVlc3Qgb3IgcGh5c2ljYWxJZCBpcyBOVUxMLCBjb3VudCBpcworICogICAgICAgICAgICAgbGFyZ2VyIHRoYW4gemVybyB3aGlsZSBkYXRhIGlzIE5VTEwsIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHRhZyBpcyBub3QgcmF0aW9uYWwsCisgKiAgICAgICAgICAgICB0aGUgdGFnIGlzIG5vdCBjb250cm9sbGFibGUgYnkgYXBwbGljYXRpb24sIHBoeXNpY2FsSWQgaXMgbm90IG9uZSBvZiB0aGUgSWRzIHVzZWQKKyAqICAgICAgICAgICAgIGluIGNyZWF0aW5nIHRoZSByZXF1ZXN0LCBvciBpZiB0aGUgY2FwdHVyZSByZXF1ZXN0IGlzIGEgcmVndWxhciByZXF1ZXN0IHdpdGggbm8KKyAqICAgICAgICAgICAgIHBoeXNpY2FsIElkcyBhdCBhbGwuPC9saT48L3VsPgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3BoeXNpY2FsQ2FtZXJhX3JhdGlvbmFsKAorICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIGNvbnN0IGNoYXIqIHBoeXNpY2FsSWQsIHVpbnQzMl90IHRhZywKKyAgICAgICAgdWludDMyX3QgY291bnQsIGNvbnN0IEFDYW1lcmFNZXRhZGF0YV9yYXRpb25hbCogZGF0YSkgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOSAqLworCiBfX0VORF9ERUNMUwogCiAjZW5kaWYgLyogX05ES19DQVBUVVJFX1JFUVVFU1RfSCAqLwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9saWJjYW1lcmEybmRrLm1hcC50eHQgYi9jYW1lcmEvbmRrL2xpYmNhbWVyYTJuZGsubWFwLnR4dAppbmRleCBkMTc5YWEwLi5iNmYxNTUzIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2xpYmNhbWVyYTJuZGsubWFwLnR4dAorKysgYi9jYW1lcmEvbmRrL2xpYmNhbWVyYTJuZGsubWFwLnR4dApAQCAtMiwxNSArMiwxOSBAQAogICBnbG9iYWw6CiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2Fib3J0Q2FwdHVyZXM7CiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmU7CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZTsgIyBpbnRyb2R1Y2VkPTI5CiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2Nsb3NlOwogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9nZXREZXZpY2U7CiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3NldFJlcGVhdGluZ1JlcXVlc3Q7CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfc2V0UmVwZWF0aW5nUmVxdWVzdDsgIyBpbnRyb2R1Y2VkPTI5CiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0b3BSZXBlYXRpbmc7Ci0gICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3VwZGF0ZVNoYXJlZE91dHB1dDsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fdXBkYXRlU2hhcmVkT3V0cHV0OyAjIGludHJvZHVjZWQ9MjgKICAgICBBQ2FtZXJhRGV2aWNlX2Nsb3NlOwogICAgIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Q7CisgICAgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHM7ICMgaW50cm9kdWNlZD0yOQogICAgIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb247Ci0gICAgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbldpdGhTZXNzaW9uUGFyYW1ldGVyczsKKyAgICBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVTZXNzaW9uV2l0aFNlc3Npb25QYXJhbWV0ZXJzOyAjIGludHJvZHVjZWQ9MjgKKyAgICBBQ2FtZXJhRGV2aWNlX2lzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQ7ICMgaW50cm9kdWNlZD0yOQogICAgIEFDYW1lcmFEZXZpY2VfZ2V0SWQ7CiAgICAgQUNhbWVyYU1hbmFnZXJfY3JlYXRlOwogICAgIEFDYW1lcmFNYW5hZ2VyX2RlbGV0ZTsKQEAgLTIwLDM0ICsyNCw0NSBAQAogICAgIEFDYW1lcmFNYW5hZ2VyX29wZW5DYW1lcmE7CiAgICAgQUNhbWVyYU1hbmFnZXJfcmVnaXN0ZXJBdmFpbGFiaWxpdHlDYWxsYmFjazsKICAgICBBQ2FtZXJhTWFuYWdlcl91bnJlZ2lzdGVyQXZhaWxhYmlsaXR5Q2FsbGJhY2s7CisgICAgQUNhbWVyYU1hbmFnZXJfcmVnaXN0ZXJFeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrOyAjIGludHJvZHVjZWQ9MjkKKyAgICBBQ2FtZXJhTWFuYWdlcl91bnJlZ2lzdGVyRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFjazsgIyBpbnRyb2R1Y2VkPTI5CiAgICAgQUNhbWVyYU1ldGFkYXRhX2NvcHk7CiAgICAgQUNhbWVyYU1ldGFkYXRhX2ZyZWU7CiAgICAgQUNhbWVyYU1ldGFkYXRhX2dldEFsbFRhZ3M7CiAgICAgQUNhbWVyYU1ldGFkYXRhX2dldENvbnN0RW50cnk7CisgICAgQUNhbWVyYU1ldGFkYXRhX2lzTG9naWNhbE11bHRpQ2FtZXJhOyAjIGludHJvZHVjZWQ9MjkKICAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2NyZWF0ZTsKICAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2ZyZWU7CiAgICAgQUNhcHR1cmVSZXF1ZXN0X2FkZFRhcmdldDsKLSAgICBBQ2FwdHVyZVJlcXVlc3RfY29weTsKKyAgICBBQ2FwdHVyZVJlcXVlc3RfY29weTsgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQUNhcHR1cmVSZXF1ZXN0X2ZyZWU7CiAgICAgQUNhcHR1cmVSZXF1ZXN0X2dldEFsbFRhZ3M7CiAgICAgQUNhcHR1cmVSZXF1ZXN0X2dldENvbnN0RW50cnk7Ci0gICAgQUNhcHR1cmVSZXF1ZXN0X2dldFVzZXJDb250ZXh0OworICAgIEFDYXB0dXJlUmVxdWVzdF9nZXRDb25zdEVudHJ5X3BoeXNpY2FsQ2FtZXJhOyAjIGludHJvZHVjZWQ9MjkKKyAgICBBQ2FwdHVyZVJlcXVlc3RfZ2V0VXNlckNvbnRleHQ7ICMgaW50cm9kdWNlZD0yOAogICAgIEFDYXB0dXJlUmVxdWVzdF9yZW1vdmVUYXJnZXQ7CiAgICAgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X2RvdWJsZTsKKyAgICBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfcGh5c2ljYWxDYW1lcmFfZG91YmxlOyAjIGludHJvZHVjZWQ9MjkKICAgICBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfZmxvYXQ7CisgICAgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3BoeXNpY2FsQ2FtZXJhX2Zsb2F0OyAjIGludHJvZHVjZWQ9MjkKICAgICBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfaTMyOworICAgIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9waHlzaWNhbENhbWVyYV9pMzI7ICMgaW50cm9kdWNlZD0yOQogICAgIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9pNjQ7CisgICAgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3BoeXNpY2FsQ2FtZXJhX2k2NDsgIyBpbnRyb2R1Y2VkPTI5CiAgICAgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3JhdGlvbmFsOworICAgIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9waHlzaWNhbENhbWVyYV9yYXRpb25hbDsgIyBpbnRyb2R1Y2VkPTI5CiAgICAgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3U4OwotICAgIEFDYXB0dXJlUmVxdWVzdF9zZXRVc2VyQ29udGV4dDsKKyAgICBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfcGh5c2ljYWxDYW1lcmFfdTg7ICMgaW50cm9kdWNlZD0yOQorICAgIEFDYXB0dXJlUmVxdWVzdF9zZXRVc2VyQ29udGV4dDsgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZDsKICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfY3JlYXRlOwogICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9mcmVlOwogICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9yZW1vdmU7CiAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0X2NyZWF0ZTsKLSAgICBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfY3JlYXRlOwotICAgIEFDYXB0dXJlU2Vzc2lvblNoYXJlZE91dHB1dF9hZGQ7Ci0gICAgQUNhcHR1cmVTZXNzaW9uU2hhcmVkT3V0cHV0X3JlbW92ZTsKKyAgICBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfY3JlYXRlOyAjIGludHJvZHVjZWQ9MjgKKyAgICBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfYWRkOyAjIGludHJvZHVjZWQ9MjgKKyAgICBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfcmVtb3ZlOyAjIGludHJvZHVjZWQ9MjgKKyAgICBBQ2FwdHVyZVNlc3Npb25QaHlzaWNhbE91dHB1dF9jcmVhdGU7ICMgaW50cm9kdWNlZD0yOQogICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dF9mcmVlOwogICBsb2NhbDoKICAgICAqOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uVmVuZG9yLmggYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25WZW5kb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWFmOGMxCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uVmVuZG9yLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAidXRpbHMuaCIKKworc3RydWN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCB7CisgICAgZXhwbGljaXQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KG5hdGl2ZV9oYW5kbGVfdCogd2luZG93LCBib29sIGlzU2hhcmVkID0gZmFsc2UsCisgICAgICAgICAgICBjb25zdCBjaGFyKiBwaHlzaWNhbENhbWVyYUlkID0gIiIpIDoKKyAgICAgICAgICAgIG1XaW5kb3cod2luZG93KSwgbUlzU2hhcmVkKGlzU2hhcmVkKSwgbVBoeXNpY2FsQ2FtZXJhSWQocGh5c2ljYWxDYW1lcmFJZCkge307CisKKyAgICBib29sIG9wZXJhdG9yID09IChjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQmIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAobVdpbmRvdyA9PSBvdGhlci5tV2luZG93KTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yICE9IChjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQmIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtV2luZG93ICE9IG90aGVyLm1XaW5kb3c7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQmIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtV2luZG93IDwgb3RoZXIubVdpbmRvdzsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yID4gKGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3cgPiBvdGhlci5tV2luZG93OworICAgIH0KKworICAgIGFuZHJvaWQ6OmFjYW06OnV0aWxzOjpuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyIG1XaW5kb3c7CisgICAgc3RkOjpzZXQ8YW5kcm9pZDo6YWNhbTo6dXRpbHM6Om5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXI+IG1TaGFyZWRXaW5kb3dzOworICAgIGJvb2wgICAgICAgICAgIG1Jc1NoYXJlZDsKKyAgICBpbnQgICAgICAgICAgICBtUm90YXRpb24gPSBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wOworICAgIHN0ZDo6c3RyaW5nIG1QaHlzaWNhbENhbWVyYUlkOworfTsKKworCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOWMxNjcKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcApAQCAtMCwwICsxLDE3MzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFDYW1lcmFEZXZpY2VWZW5kb3IiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC9JQ2FtZXJhU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxDYW1lcmFNZXRhZGF0YS5oPgorCisjaW5jbHVkZSAibmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaCIKKyNpbmNsdWRlICJBQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKKyNpbmNsdWRlICJBQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJBQ2FwdHVyZVJlcXVlc3QuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCisjaW5jbHVkZSAiQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmluYyIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKKwordXNpbmcgSENhbWVyYU1ldGFkYXRhID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYW1lcmFNZXRhZGF0YTsKK3VzaW5nIE91dHB1dENvbmZpZ3VyYXRpb24gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6Ok91dHB1dENvbmZpZ3VyYXRpb247Cit1c2luZyBTZXNzaW9uQ29uZmlndXJhdGlvbiA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6U2Vzc2lvbkNvbmZpZ3VyYXRpb247Cit1c2luZyBoYXJkd2FyZTo6Vm9pZDsKKworLy8gU3RhdGljIG1lbWJlciBkZWZpbml0aW9ucworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprQ29udGV4dEtleSAgICAgICAgPSAiQ29udGV4dCI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtEZXZpY2VLZXkgICAgICAgICA9ICJEZXZpY2UiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprRXJyb3JDb2RlS2V5ICAgICAgPSAiRXJyb3JDb2RlIjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0NhbGxiYWNrRnBLZXkgICAgID0gIkNhbGxiYWNrIjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a1Nlc3Npb25TcEtleSAgICAgID0gIlNlc3Npb25TcCI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtDYXB0dXJlUmVxdWVzdEtleSA9ICJDYXB0dXJlUmVxdWVzdCI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtUaW1lU3RhbXBLZXkgICAgICA9ICJUaW1lU3RhbXAiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprQ2FwdHVyZVJlc3VsdEtleSAgPSAiQ2FwdHVyZVJlc3VsdCI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtQaHlzaWNhbENhcHR1cmVSZXN1bHRLZXkgPSAiUGh5c2ljYWxDYXB0dXJlUmVzdWx0IjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0NhcHR1cmVGYWlsdXJlS2V5ID0gIkNhcHR1cmVGYWlsdXJlIjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a1NlcXVlbmNlSWRLZXkgICAgID0gIlNlcXVlbmNlSWQiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprRnJhbWVOdW1iZXJLZXkgICAgPSAiRnJhbWVOdW1iZXIiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprQW53S2V5ICAgICAgICAgICAgPSAiQW53IjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0ZhaWxpbmdQaHlzaWNhbENhbWVyYUlkPSAiRmFpbGluZ1BoeXNpY2FsQ2FtZXJhSWQiOworCisvKioKKyAqIENhbWVyYURldmljZSBJbXBsZW1lbnRhdGlvbgorICovCitDYW1lcmFEZXZpY2U6OkNhbWVyYURldmljZSgKKyAgICAgICAgY29uc3QgY2hhciogaWQsCisgICAgICAgIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNiLAorICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IGNoYXJzLAorICAgICAgICBBQ2FtZXJhRGV2aWNlKiB3cmFwcGVyKSA6CisgICAgICAgIG1DYW1lcmFJZChpZCksCisgICAgICAgIG1BcHBDYWxsYmFja3MoKmNiKSwKKyAgICAgICAgbUNoYXJzKHN0ZDo6bW92ZShjaGFycykpLAorICAgICAgICBtU2VydmljZUNhbGxiYWNrKG5ldyBTZXJ2aWNlQ2FsbGJhY2sodGhpcykpLAorICAgICAgICBtV3JhcHBlcih3cmFwcGVyKSwKKyAgICAgICAgbUluRXJyb3IoZmFsc2UpLAorICAgICAgICBtRXJyb3IoQUNBTUVSQV9PSyksCisgICAgICAgIG1JZGxlKHRydWUpLAorICAgICAgICBtQ3VycmVudFNlc3Npb24obnVsbHB0cikgeworICAgIG1DbG9zaW5nID0gZmFsc2U7CisgICAgLy8gU2V0dXAgbG9vcGVyIHRocmVhZCB0byBwZXJmcm9tIGRldmljZSBjYWxsYmFja3MgdG8gYXBwCisgICAgbUNiTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgbUNiTG9vcGVyLT5zZXROYW1lKCJDMk4tZGV2LWxvb3BlciIpOworICAgIHN0YXR1c190IGVyciA9IG1DYkxvb3Blci0+c3RhcnQoCisgICAgICAgICAgICAvKnJ1bk9uQ2FsbGluZ1RocmVhZCovZmFsc2UsCisgICAgICAgICAgICAvKmNhbkNhbGxKYXZhKi8gICAgICAgdHJ1ZSwKKyAgICAgICAgICAgIFBSSU9SSVRZX0RFRkFVTFQpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gc3RhcnQgY2FtZXJhIGRldmljZSBjYWxsYmFjayBsb29wZXI6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRSk7CisgICAgfQorICAgIG1IYW5kbGVyID0gbmV3IENhbGxiYWNrSGFuZGxlcihpZCk7CisgICAgbUNiTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXIpOworCisgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhID0gbUNoYXJzLT5nZXRJbnRlcm5hbERhdGEoKTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfUkVRVUVTVF9QQVJUSUFMX1JFU1VMVF9DT1VOVCk7CisgICAgaWYgKGVudHJ5LmNvdW50ICE9IDEpIHsKKyAgICAgICAgQUxPR1coIiVzOiBiYWQgY291bnQgJXp1IGZvciBwYXJ0aWFsIHJlc3VsdCBjb3VudCIsIF9fRlVOQ1RJT05fXywgZW50cnkuY291bnQpOworICAgICAgICBtUGFydGlhbFJlc3VsdENvdW50ID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBtUGFydGlhbFJlc3VsdENvdW50ID0gZW50cnkuZGF0YS5pMzJbMF07CisgICAgfQorCisgICAgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfTEVOU19JTkZPX1NIQURJTkdfTUFQX1NJWkUpOworICAgIGlmIChlbnRyeS5jb3VudCAhPSAyKSB7CisgICAgICAgIEFMT0dXKCIlczogYmFkIGNvdW50ICV6dSBmb3Igc2hhZGluZyBtYXAgc2l6ZSIsIF9fRlVOQ1RJT05fXywgZW50cnkuY291bnQpOworICAgICAgICBtU2hhZGluZ01hcFNpemVbMF0gPSAwOworICAgICAgICBtU2hhZGluZ01hcFNpemVbMV0gPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIG1TaGFkaW5nTWFwU2l6ZVswXSA9IGVudHJ5LmRhdGEuaTMyWzBdOworICAgICAgICBtU2hhZGluZ01hcFNpemVbMV0gPSBlbnRyeS5kYXRhLmkzMlsxXTsKKyAgICB9Cit9CisKKy8vIERldmljZSBjbG9zZSBpbXBsZW1lbnRhaXRvbgorQ2FtZXJhRGV2aWNlOjp+Q2FtZXJhRGV2aWNlKCkgeworICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiA9IG1DdXJyZW50U2Vzc2lvbi5wcm9tb3RlKCk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURldmljZUxvY2spOworICAgICAgICBpZiAoIWlzQ2xvc2VkKCkpIHsKKyAgICAgICAgICAgIGRpc2Nvbm5lY3RMb2NrZWQoc2Vzc2lvbik7CisgICAgICAgIH0KKyAgICAgICAgbUN1cnJlbnRTZXNzaW9uID0gbnVsbHB0cjsKKyAgICAgICAgaWYgKG1DYkxvb3BlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtQ2JMb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyLT5pZCgpKTsKKyAgICAgICAgICAgIG1DYkxvb3Blci0+c3RvcCgpOworICAgICAgICB9CisgICAgfQorICAgIG1DYkxvb3Blci5jbGVhcigpOworICAgIG1IYW5kbGVyLmNsZWFyKCk7Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6cG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKHNwPEFNZXNzYWdlPiYgbXNnKSB7CisgICAgbXNnLT5wb3N0KCk7CisgICAgbXNnLmNsZWFyKCk7CisgICAgc3A8QU1lc3NhZ2U+IGNsZWFudXBNc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDbGVhblVwU2Vzc2lvbnMsIG1IYW5kbGVyKTsKKyAgICBjbGVhbnVwTXNnLT5wb3N0KCk7Cit9CisKKy8vIFRPRE86IGNhY2hlZCBjcmVhdGVkIHJlcXVlc3Q/CitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6Y3JlYXRlQ2FwdHVyZVJlcXVlc3QoCisgICAgICAgIEFDYW1lcmFEZXZpY2VfcmVxdWVzdF90ZW1wbGF0ZSB0ZW1wbGF0ZUlkLAorICAgICAgICBjb25zdCBBQ2FtZXJhSWRMaXN0KiBwaHlzaWNhbENhbWVyYUlkTGlzdCwKKyAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGV2aWNlTG9jayk7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAobVJlbW90ZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQ7CisgICAgfQorICAgIENhbWVyYU1ldGFkYXRhIHJhd1JlcXVlc3Q7CisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6Tk9fRVJST1I7CisgICAgYXV0byByZW1vdGVSZXQgPSBtUmVtb3RlLT5jcmVhdGVEZWZhdWx0UmVxdWVzdCgKKyAgICAgICAgdXRpbHM6OmNvbnZlcnRUb0hpZGwodGVtcGxhdGVJZCksCisgICAgICAgIFsmc3RhdHVzLCAmcmF3UmVxdWVzdF0oYXV0byBzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiAmbWV0YWRhdGEpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6Tk9fRVJST1IgJiYgdXRpbHM6OmNvbnZlcnRGcm9tSGlkbENsb25lZChtZXRhZGF0YSwgJnJhd1JlcXVlc3QpKSB7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ291bGRuJ3QgY3JlYXRlIGRlZmF1bHQgcmVxdWVzdCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIGlmICghcmVtb3RlUmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIHdoaWxlIHRyeWluZyB0byBjcmVhdGUgZGVmYXVsdCByZXF1ZXN0ICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICByZW1vdGVSZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiB1dGlsczo6Y29udmVydEZyb21IaWRsKHN0YXR1cyk7CisgICAgfQorICAgIEFDYXB0dXJlUmVxdWVzdCogb3V0UmVxID0gbmV3IEFDYXB0dXJlUmVxdWVzdCgpOworICAgIG91dFJlcS0+c2V0dGluZ3MgPSBuZXcgQUNhbWVyYU1ldGFkYXRhKHJhd1JlcXVlc3QucmVsZWFzZSgpLCBBQ2FtZXJhTWV0YWRhdGE6OkFDTV9SRVFVRVNUKTsKKyAgICBpZiAocGh5c2ljYWxDYW1lcmFJZExpc3QgIT0gbnVsbHB0cikgeworICAgICAgICBmb3IgKGF1dG8gaSA9IDA7IGkgPCBwaHlzaWNhbENhbWVyYUlkTGlzdC0+bnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgICAgICBvdXRSZXEtPnBoeXNpY2FsU2V0dGluZ3MuZW1wbGFjZShwaHlzaWNhbENhbWVyYUlkTGlzdC0+Y2FtZXJhSWRzW2ldLAorICAgICAgICAgICAgICAgICAgICBuZXcgQUNhbWVyYU1ldGFkYXRhKCoob3V0UmVxLT5zZXR0aW5ncykpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBvdXRSZXEtPnRhcmdldHMgID0gbmV3IEFDYW1lcmFPdXRwdXRUYXJnZXRzKCk7CisgICAgKnJlcXVlc3QgPSBvdXRSZXE7CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjpjcmVhdGVDYXB0dXJlU2Vzc2lvbigKKyAgICAgICAgY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiAgICAgICBvdXRwdXRzLAorICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHNlc3Npb25QYXJhbWV0ZXJzLAorICAgICAgICBjb25zdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RhdGVDYWxsYmFja3MqIGNhbGxiYWNrcywKKyAgICAgICAgLypvdXQqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbioqIHNlc3Npb24pIHsKKyAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IGN1cnJlbnRTZXNzaW9uID0gbUN1cnJlbnRTZXNzaW9uLnByb21vdGUoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobURldmljZUxvY2spOworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBpZiAoY3VycmVudFNlc3Npb24gIT0gbnVsbHB0cikgeworICAgICAgICBjdXJyZW50U2Vzc2lvbi0+Y2xvc2VCeURldmljZSgpOworICAgICAgICBzdG9wUmVwZWF0aW5nTG9ja2VkKCk7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIG5ldyBzZXNzaW9uCisgICAgcmV0ID0gY29uZmlndXJlU3RyZWFtc0xvY2tlZChvdXRwdXRzLCBzZXNzaW9uUGFyYW1ldGVycyk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsIHRvIGNyZWF0ZSBuZXcgc2Vzc2lvbi4gY2Fubm90IGNvbmZpZ3VyZSBzdHJlYW1zIik7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBuZXdTZXNzaW9uID0gbmV3IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbigKKyAgICAgICAgICAgIG1OZXh0U2Vzc2lvbklkKyssIG91dHB1dHMsIGNhbGxiYWNrcywgdGhpcyk7CisKKyAgICAvLyBzZXQgbmV3IHNlc3Npb24gYXMgY3VycmVudCBzZXNzaW9uCisgICAgbmV3U2Vzc2lvbi0+aW5jU3Ryb25nKCh2b2lkICopIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb24pOworICAgIG1DdXJyZW50U2Vzc2lvbiA9IG5ld1Nlc3Npb247CisgICAgbUZsdXNoaW5nID0gZmFsc2U7CisgICAgKnNlc3Npb24gPSBuZXdTZXNzaW9uOworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCitjYW1lcmFfc3RhdHVzX3QgQ2FtZXJhRGV2aWNlOjppc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAorICAgICAgICBjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqIHNlc3Npb25PdXRwdXRDb250YWluZXIpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobURldmljZUxvY2spOworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBTZXNzaW9uQ29uZmlndXJhdGlvbiBzZXNzaW9uQ29uZmlnOworICAgIHNlc3Npb25Db25maWcuaW5wdXRXaWR0aCA9IDA7CisgICAgc2Vzc2lvbkNvbmZpZy5pbnB1dEhlaWdodCA9IDA7CisgICAgc2Vzc2lvbkNvbmZpZy5pbnB1dEZvcm1hdCA9IC0xOworICAgIHNlc3Npb25Db25maWcub3BlcmF0aW9uTW9kZSA9IFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlOjpOT1JNQUxfTU9ERTsKKyAgICBzZXNzaW9uQ29uZmlnLm91dHB1dFN0cmVhbXMucmVzaXplKHNlc3Npb25PdXRwdXRDb250YWluZXItPm1PdXRwdXRzLnNpemUoKSk7CisgICAgc2l6ZV90IGluZGV4ID0gMDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG91dHB1dCA6IHNlc3Npb25PdXRwdXRDb250YWluZXItPm1PdXRwdXRzKSB7CisgICAgICAgIHNlc3Npb25Db25maWcub3V0cHV0U3RyZWFtc1tpbmRleF0ucm90YXRpb24gPSB1dGlsczo6Y29udmVydFRvSGlkbChvdXRwdXQubVJvdGF0aW9uKTsKKyAgICAgICAgc2Vzc2lvbkNvbmZpZy5vdXRwdXRTdHJlYW1zW2luZGV4XS53aW5kb3dHcm91cElkID0gLTE7CisgICAgICAgIHNlc3Npb25Db25maWcub3V0cHV0U3RyZWFtc1tpbmRleF0ud2luZG93SGFuZGxlcy5yZXNpemUob3V0cHV0Lm1TaGFyZWRXaW5kb3dzLnNpemUoKSArIDEpOworICAgICAgICBzZXNzaW9uQ29uZmlnLm91dHB1dFN0cmVhbXNbaW5kZXhdLndpbmRvd0hhbmRsZXNbMF0gPSBvdXRwdXQubVdpbmRvdzsKKyAgICAgICAgc2Vzc2lvbkNvbmZpZy5vdXRwdXRTdHJlYW1zW2luZGV4XS5waHlzaWNhbENhbWVyYUlkID0gb3V0cHV0Lm1QaHlzaWNhbENhbWVyYUlkOworICAgICAgICBpbmRleCsrOworICAgIH0KKworICAgIGJvb2wgY29uZmlnU3VwcG9ydGVkID0gZmFsc2U7CisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6Tk9fRVJST1I7CisgICAgYXV0byByZW1vdGVSZXQgPSBtUmVtb3RlLT5pc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKHNlc3Npb25Db25maWcsCisgICAgICAgIFsmc3RhdHVzLCAmY29uZmlnU3VwcG9ydGVkXShhdXRvIHMsIGF1dG8gc3VwcG9ydGVkKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgY29uZmlnU3VwcG9ydGVkID0gc3VwcG9ydGVkOworICAgICAgICB9KTsKKworICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpJTlZBTElEX09QRVJBVElPTikgeworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9VTlNVUFBPUlRFRF9PUEVSQVRJT047CisgICAgfSBlbHNlIGlmICghcmVtb3RlUmV0LmlzT2soKSkgeworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9VTktOT1dOOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBjb25maWdTdXBwb3J0ZWQgPyBBQ0FNRVJBX09LIDogQUNBTUVSQV9FUlJPUl9TVFJFQU1fQ09ORklHVVJFX0ZBSUw7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBhZGRNZXRhZGF0YVRvUGh5c2ljYWxDYW1lcmFTZXR0aW5ncyhjb25zdCBDYW1lcmFNZXRhZGF0YSAqbWV0YWRhdGEsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZjYW1lcmFJZCwgUGh5c2ljYWxDYW1lcmFTZXR0aW5ncyAqcGh5c2ljYWxDYW1lcmFTZXR0aW5ncykgeworICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhQ29weSA9ICptZXRhZGF0YTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfdCAqY2FtZXJhX21ldGFkYXRhID0gbWV0YWRhdGFDb3B5LnJlbGVhc2UoKTsKKyAgICBIQ2FtZXJhTWV0YWRhdGEgaENhbWVyYU1ldGFkYXRhOworICAgIHV0aWxzOjpjb252ZXJ0VG9IaWRsKGNhbWVyYV9tZXRhZGF0YSwgJmhDYW1lcmFNZXRhZGF0YSwgLypzaG91bGRPd24qLyB0cnVlKTsKKyAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzLT5zZXR0aW5ncy5tZXRhZGF0YShzdGQ6Om1vdmUoaENhbWVyYU1ldGFkYXRhKSk7CisgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5ncy0+aWQgPSBjYW1lcmFJZDsKK30KKwordm9pZCBDYW1lcmFEZXZpY2U6OmFkZFJlcXVlc3RTZXR0aW5nc01ldGFkYXRhKEFDYXB0dXJlUmVxdWVzdCAqYUNhcHR1cmVSZXF1ZXN0LAorICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gJnJlcSkgeworICAgIHJlcS0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MucmVzaXplKDEgKyBhQ2FwdHVyZVJlcXVlc3QtPnBoeXNpY2FsU2V0dGluZ3Muc2l6ZSgpKTsKKyAgICBhZGRNZXRhZGF0YVRvUGh5c2ljYWxDYW1lcmFTZXR0aW5ncygmKGFDYXB0dXJlUmVxdWVzdC0+c2V0dGluZ3MtPmdldEludGVybmFsRGF0YSgpKSwgZ2V0SWQoKSwKKyAgICAgICAgICAgICAgICAgICAgJihyZXEtPm1QaHlzaWNhbENhbWVyYVNldHRpbmdzWzBdKSk7CisgICAgc2l6ZV90IGkgPSAxOworICAgIGZvciAoYXV0byAmcGh5c2ljYWxTZXR0aW5nIDogYUNhcHR1cmVSZXF1ZXN0LT5waHlzaWNhbFNldHRpbmdzKSB7CisgICAgICAgIGFkZE1ldGFkYXRhVG9QaHlzaWNhbENhbWVyYVNldHRpbmdzKCYocGh5c2ljYWxTZXR0aW5nLnNlY29uZC0+Z2V0SW50ZXJuYWxEYXRhKCkpLAorICAgICAgICAgICAgICAgIHBoeXNpY2FsU2V0dGluZy5maXJzdCwgJihyZXEtPm1QaHlzaWNhbENhbWVyYVNldHRpbmdzW2ldKSk7CisgICAgICAgIGkrKzsKKyAgICB9Cit9CisKK2NhbWVyYV9zdGF0dXNfdCBDYW1lcmFEZXZpY2U6OnVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb25Mb2NrZWQoQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpvdXRwdXQpIHsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKG91dHB1dCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIGlmICghb3V0cHV0LT5tSXNTaGFyZWQpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIG91dHB1dCBjb25maWd1cmF0aW9uIGlzIG5vdCBzaGFyZWQiKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgaW50MzJfdCBzdHJlYW1JZCA9IC0xOworICAgIGZvciAoYXV0byYga3ZQYWlyIDogbUNvbmZpZ3VyZWRPdXRwdXRzKSB7CisgICAgICAgIGlmICh1dGlsczo6aXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbChrdlBhaXIuc2Vjb25kLmZpcnN0LCBvdXRwdXQtPm1XaW5kb3cpKSB7CisgICAgICAgICAgICBzdHJlYW1JZCA9IGt2UGFpci5maXJzdDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzdHJlYW1JZCA8IDApIHsKKyAgICAgICAgQUxPR0UoIkVycm9yOiBJbnZhbGlkIG91dHB1dCBjb25maWd1cmF0aW9uIik7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyIG91dENvbmZpZ1c7CisgICAgT3V0cHV0Q29uZmlndXJhdGlvbiAmb3V0Q29uZmlnID0gb3V0Q29uZmlnVy5tT3V0cHV0Q29uZmlndXJhdGlvbjsKKyAgICBvdXRDb25maWcucm90YXRpb24gPSB1dGlsczo6Y29udmVydFRvSGlkbChvdXRwdXQtPm1Sb3RhdGlvbik7CisgICAgb3V0Q29uZmlnLndpbmRvd0hhbmRsZXMucmVzaXplKG91dHB1dC0+bVNoYXJlZFdpbmRvd3Muc2l6ZSgpICsgMSk7CisgICAgb3V0Q29uZmlnLndpbmRvd0hhbmRsZXNbMF0gPSBvdXRwdXQtPm1XaW5kb3c7CisgICAgb3V0Q29uZmlnLnBoeXNpY2FsQ2FtZXJhSWQgPSBvdXRwdXQtPm1QaHlzaWNhbENhbWVyYUlkOworICAgIGludCBpID0gMTsKKyAgICBmb3IgKGF1dG8mIGFudyA6IG91dHB1dC0+bVNoYXJlZFdpbmRvd3MpIHsKKyAgICAgICAgb3V0Q29uZmlnLndpbmRvd0hhbmRsZXNbaSsrXSA9IGFudzsKKyAgICB9CisKKyAgICBhdXRvIHJlbW90ZVJldCA9IG1SZW1vdGUtPnVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb24oc3RyZWFtSWQsIG91dENvbmZpZyk7CisgICAgaWYgKCFyZW1vdGVSZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgaW4gdXBkYXRpbmcgT3V0cHV0Q29uZmlndXJhdGlvbjogJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgIHJlbW90ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIHN3aXRjaCAocmVtb3RlUmV0KSB7CisgICAgICAgICAgICBjYXNlIFN0YXR1czo6Tk9fRVJST1I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFN0YXR1czo6SU5WQUxJRF9PUEVSQVRJT046CisgICAgICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgaW52YWxpZCBvcGVyYXRpb24iLCBnZXRJZCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIGNhc2UgU3RhdHVzOjpBTFJFQURZX0VYSVNUUzoKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhIGRldmljZSAlcyBvdXRwdXQgc3VyZmFjZSBhbHJlYWR5IGV4aXN0cyIsIGdldElkKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICAgICAgY2FzZSBTdGF0dXM6OklMTEVHQUxfQVJHVU1FTlQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgaW52YWxpZCBpbnB1dCBhcmd1bWVudCIsIGdldElkKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhIGRldmljZSAlcyBmYWlsZWQgdG8gYWRkIHNoYXJlZCBvdXRwdXQiLCBnZXRJZCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIG1Db25maWd1cmVkT3V0cHV0c1tzdHJlYW1JZF0gPSBzdGQ6Om1ha2VfcGFpcihvdXRwdXQtPm1XaW5kb3csIG91dENvbmZpZ1cpOworCisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjphbGxvY2F0ZUNhcHR1cmVSZXF1ZXN0TG9ja2VkKAorICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIC8qb3V0Ki9zcDxDYXB0dXJlUmVxdWVzdD4gJm91dFJlcSkgeworICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXEobmV3IENhcHR1cmVSZXF1ZXN0KCkpOworICAgIHJlcS0+bUNhcHR1cmVSZXF1ZXN0LnBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MucmVzaXplKDEgKyByZXF1ZXN0LT5waHlzaWNhbFNldHRpbmdzLnNpemUoKSk7CisKKyAgICBzaXplX3QgaW5kZXggPSAwOworICAgIGFsbG9jYXRlT25lQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YSgKKyAgICAgICAgICAgIHJlcS0+bUNhcHR1cmVSZXF1ZXN0LnBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NbaW5kZXgrK10sIG1DYW1lcmFJZCwgcmVxdWVzdC0+c2V0dGluZ3MpOworCisgICAgZm9yIChhdXRvJiBwaHlzaWNhbEVudHJ5IDogcmVxdWVzdC0+cGh5c2ljYWxTZXR0aW5ncykgeworICAgICAgICBhbGxvY2F0ZU9uZUNhcHR1cmVSZXF1ZXN0TWV0YWRhdGEoCisgICAgICAgICAgICAgICAgcmVxLT5tQ2FwdHVyZVJlcXVlc3QucGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tpbmRleCsrXSwKKyAgICAgICAgICAgICAgICBwaHlzaWNhbEVudHJ5LmZpcnN0LCBwaHlzaWNhbEVudHJ5LnNlY29uZCk7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gcmVxdWVzdFN0cmVhbUlkeExpc3Q7CisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gcmVxdWVzdFN1cmZhY2VJZHhMaXN0OworICAgIGZvciAoYXV0byBvdXRwdXRUYXJnZXQgOiByZXF1ZXN0LT50YXJnZXRzLT5tT3V0cHV0cykgeworICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGFudyA9IG91dHB1dFRhcmdldC5tV2luZG93OworICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgIHJlcS0+bVN1cmZhY2VMaXN0LnB1c2hfYmFjayhhbncpOworICAgICAgICAvLyBsb29rdXAgc3RyZWFtL3N1cmZhY2UgSUQKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBrdlBhaXIgOiBtQ29uZmlndXJlZE91dHB1dHMpIHsKKyAgICAgICAgICAgIGludCBzdHJlYW1JZCA9IGt2UGFpci5maXJzdDsKKyAgICAgICAgICAgIGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyJiBvdXRDb25maWcgPSBrdlBhaXIuc2Vjb25kLnNlY29uZDsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8mIHdpbmRvd0hhbmRsZXMgPSBvdXRDb25maWcubU91dHB1dENvbmZpZ3VyYXRpb24ud2luZG93SGFuZGxlczsKKyAgICAgICAgICAgIGZvciAoaW50IHN1cmZhY2VJZCA9IDA7IHN1cmZhY2VJZCA8IChpbnQpIHdpbmRvd0hhbmRsZXMuc2l6ZSgpOyBzdXJmYWNlSWQrKykgeworICAgICAgICAgICAgICAgIC8vIElmIHR3byBuYXRpdmUgaGFuZGxlcyBhcmUgZXF1aXZhbGVudCwgc28gYXJlIHRoZWlyIHN1cmZhY2VzLgorICAgICAgICAgICAgICAgIGlmICh1dGlsczo6aXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbCh3aW5kb3dIYW5kbGVzW3N1cmZhY2VJZF0uZ2V0TmF0aXZlSGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbncpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFN0cmVhbUlkeExpc3QucHVzaF9iYWNrKHN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFN1cmZhY2VJZHhMaXN0LnB1c2hfYmFjayhzdXJmYWNlSWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5jb25maWd1cmVkIG91dHB1dCB0YXJnZXQgJXAgaW4gY2FwdHVyZSByZXF1ZXN0ISIsIGFudyk7CisgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXEtPm1DYXB0dXJlUmVxdWVzdC5zdHJlYW1BbmRXaW5kb3dJZHMucmVzaXplKHJlcXVlc3RTdHJlYW1JZHhMaXN0LnNpemUoKSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1ZXN0U3RyZWFtSWR4TGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICByZXEtPm1DYXB0dXJlUmVxdWVzdC5zdHJlYW1BbmRXaW5kb3dJZHNbaV0uc3RyZWFtSWQgPSByZXF1ZXN0U3RyZWFtSWR4TGlzdFtpXTsKKyAgICAgICAgcmVxLT5tQ2FwdHVyZVJlcXVlc3Quc3RyZWFtQW5kV2luZG93SWRzW2ldLndpbmRvd0lkID0gcmVxdWVzdFN1cmZhY2VJZHhMaXN0W2ldOworICAgIH0KKyAgICBvdXRSZXEgPSByZXE7CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK3ZvaWQgQ2FtZXJhRGV2aWNlOjphbGxvY2F0ZU9uZUNhcHR1cmVSZXF1ZXN0TWV0YWRhdGEoCisgICAgICAgIFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MmIGNhbWVyYVNldHRpbmdzLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaWQsIGNvbnN0IHNwPEFDYW1lcmFNZXRhZGF0YT4mIG1ldGFkYXRhKSB7CisgICAgY2FtZXJhU2V0dGluZ3MuaWQgPSBpZDsKKyAgICAvLyBUT0RPOiBEbyB3ZSByZWFsbHkgbmVlZCB0byBjb3B5IHRoZSBtZXRhZGF0YSBoZXJlID8KKyAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YUNvcHkgPSBtZXRhZGF0YS0+Z2V0SW50ZXJuYWxEYXRhKCk7CisgICAgY2FtZXJhX21ldGFkYXRhX3QgKmNhbWVyYU1ldGFkYXRhID0gbWV0YWRhdGFDb3B5LnJlbGVhc2UoKTsKKyAgICBIQ2FtZXJhTWV0YWRhdGEgaENhbWVyYU1ldGFkYXRhOworICAgIHV0aWxzOjpjb252ZXJ0VG9IaWRsKGNhbWVyYU1ldGFkYXRhLCAmaENhbWVyYU1ldGFkYXRhLCB0cnVlKTsKKyAgICBpZiAobWV0YWRhdGEgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAoaENhbWVyYU1ldGFkYXRhLmRhdGEoKSAhPSBudWxscHRyICYmCisgICAgICAgICAgICBtQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlICE9IG51bGxwdHIgJiYKKyAgICAgICAgICAgIG1DYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUtPndyaXRlKAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPihoQ2FtZXJhTWV0YWRhdGEuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICBoQ2FtZXJhTWV0YWRhdGEuc2l6ZSgpKSkgeworICAgICAgICAgICAgLy8gVGhlIG1ldGFkYXRhIGZpZWxkIG9mIHRoZSB1bmlvbiB3b3VsZCd2ZSBiZWVuIGRlc3RydWN0dWVkLCBzbyBubyBuZWVkCisgICAgICAgICAgICAvLyB0byByZS1zaXplIGl0LgorICAgICAgICAgICAgY2FtZXJhU2V0dGluZ3Muc2V0dGluZ3MuZm1xTWV0YWRhdGFTaXplKGhDYW1lcmFNZXRhZGF0YS5zaXplKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkZtcSB3cml0ZSBjYXB0dXJlIHJlc3VsdCBmYWlsZWQsIGZhbGxpbmcgYmFjayB0byBod2JpbmRlciIpOworICAgICAgICAgICAgY2FtZXJhU2V0dGluZ3Muc2V0dGluZ3MubWV0YWRhdGEoc3RkOjptb3ZlKGhDYW1lcmFNZXRhZGF0YSkpOworICAgICAgICB9CisgICAgfQorfQorCisKK0FDYXB0dXJlUmVxdWVzdCoKK0NhbWVyYURldmljZTo6YWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+JiByZXEsIGNvbnN0IGNoYXIqIGRldmljZUlkKSB7CisgICAgQUNhcHR1cmVSZXF1ZXN0KiBwUmVxdWVzdCA9IG5ldyBBQ2FwdHVyZVJlcXVlc3QoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcS0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGlkID0gcmVxLT5tUGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tpXS5pZDsKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEgY2xvbmU7CisgICAgICAgIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGxDbG9uZWQocmVxLT5tUGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tpXS5zZXR0aW5ncy5tZXRhZGF0YSgpLCAmY2xvbmUpOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCAqY2xvbmVwID0gY2xvbmUucmVsZWFzZSgpOworICAgICAgICBpZiAoaWQgPT0gZGV2aWNlSWQpIHsKKyAgICAgICAgICAgIHBSZXF1ZXN0LT5zZXR0aW5ncyA9IG5ldyBBQ2FtZXJhTWV0YWRhdGEoY2xvbmVwLCBBQ2FtZXJhTWV0YWRhdGE6OkFDTV9SRVFVRVNUKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHBSZXF1ZXN0LT5waHlzaWNhbFNldHRpbmdzW3JlcS0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NbaV0uaWRdID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IEFDYW1lcmFNZXRhZGF0YShjbG9uZXAsIEFDYW1lcmFNZXRhZGF0YTo6QUNNX1JFUVVFU1QpOworICAgICAgICB9CisgICAgfQorICAgIHBSZXF1ZXN0LT50YXJnZXRzID0gbmV3IEFDYW1lcmFPdXRwdXRUYXJnZXRzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXEtPm1TdXJmYWNlTGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGFudyA9IHJlcS0+bVN1cmZhY2VMaXN0W2ldOworICAgICAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0IG91dHB1dFRhcmdldChhbncpOworICAgICAgICBwUmVxdWVzdC0+dGFyZ2V0cy0+bU91dHB1dHMuaW5zZXJ0KG91dHB1dFRhcmdldCk7CisgICAgfQorICAgIHJldHVybiBwUmVxdWVzdDsKK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpmcmVlQUNhcHR1cmVSZXF1ZXN0KEFDYXB0dXJlUmVxdWVzdCogcmVxKSB7CisgICAgaWYgKHJlcSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcmVxLT5zZXR0aW5ncy5jbGVhcigpOworICAgIGRlbGV0ZSByZXEtPnRhcmdldHM7CisgICAgZGVsZXRlIHJlcTsKK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpub3RpZnlTZXNzaW9uRW5kT2ZMaWZlTG9ja2VkKEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbikgeworICAgIGlmIChpc0Nsb3NlZCgpKSB7CisgICAgICAgIC8vIERldmljZSBpcyBjbG9zaW5nIGFscmVhZHkuIGRvIG5vdGhpbmcKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtQ3VycmVudFNlc3Npb24gIT0gc2Vzc2lvbikgeworICAgICAgICAvLyBTZXNzaW9uIGhhcyBiZWVuIHJlcGxhY2VkIGJ5IG90aGVyIHNlZXNpb24gb3IgZGV2aWNlIGlzIGNsb3NlZAorICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1DdXJyZW50U2Vzc2lvbiA9IG51bGxwdHI7CisKKyAgICAvLyBTaG91bGQgbm90IGhhcHBlbgorICAgIGlmICghc2Vzc2lvbi0+bUlzQ2xvc2VkKSB7CisgICAgICAgIEFMT0dFKCJFcnJvcjogdW5jbG9zZWQgc2Vzc2lvbiAlcCByZWFjaGVzIGVuZCBvZiBsaWZlISIsIHNlc3Npb24pOworICAgICAgICBzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0UpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gTm8gbmV3IHNlc3Npb24sIHVuY29uZmlndXJlIG5vdworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjb25maWd1cmVTdHJlYW1zTG9ja2VkKG51bGxwdHIsIG51bGxwdHIpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiVW5jb25maWd1cmUgc3RyZWFtIGZhaWxlZC4gRGV2aWNlIG1pZ2h0IHN0aWxsIGJlIGNvbmZpZ3VyZWQhIHJldCAlZCIsIHJldCk7CisgICAgfQorfQorCit2b2lkCitDYW1lcmFEZXZpY2U6OmRpc2Nvbm5lY3RMb2NrZWQoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiYgc2Vzc2lvbikgeworICAgIGlmIChtQ2xvc2luZy5leGNoYW5nZSh0cnVlKSkgeworICAgICAgICAvLyBBbHJlYWR5IGNsb3NpbmcsIGp1c3QgcmV0dXJuCisgICAgICAgIEFMT0dXKCJDYW1lcmEgZGV2aWNlICVzIGlzIGFscmVhZHkgY2xvc2luZy4iLCBnZXRJZCgpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtUmVtb3RlICE9IG51bGxwdHIpIHsKKyAgICAgICAgYXV0byByZXQgPSBtUmVtb3RlLT5kaXNjb25uZWN0KCk7CisgICAgICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciB3aGlsZSBkaXNjb25uZWN0aW5nIGRldmljZSAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorICAgIG1SZW1vdGUgPSBudWxscHRyOworCisgICAgaWYgKHNlc3Npb24gIT0gbnVsbHB0cikgeworICAgICAgICBzZXNzaW9uLT5jbG9zZUJ5RGV2aWNlKCk7CisgICAgfQorfQorCitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6c3RvcFJlcGVhdGluZ0xvY2tlZCgpIHsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmEgJXMgc3RvcCByZXBlYXRpbmcgZmFpbGVkISByZXQgJWQiLCBnZXRJZCgpLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBpZiAobVJlcGVhdGluZ1NlcXVlbmNlSWQgIT0gUkVRVUVTVF9JRF9OT05FKSB7CisgICAgICAgIGludCByZXBlYXRpbmdTZXF1ZW5jZUlkID0gbVJlcGVhdGluZ1NlcXVlbmNlSWQ7CisgICAgICAgIG1SZXBlYXRpbmdTZXF1ZW5jZUlkID0gUkVRVUVTVF9JRF9OT05FOworCisgICAgICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyOworICAgICAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpOT19FUlJPUjsKKyAgICAgICAgYXV0byByZW1vdGVSZXQgPSBtUmVtb3RlLT5jYW5jZWxSZXBlYXRpbmdSZXF1ZXN0KAorICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmbGFzdEZyYW1lTnVtYmVyXShTdGF0dXMgcywgYXV0byBmcmFtZU51bWJlcikgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgICAgICBsYXN0RnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCFyZW1vdGVSZXQuaXNPaygpIHx8IHN0YXR1cyAhPSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjYW5jZWwgYWN0aXZlIHJlcGVhdGluZyByZXF1ZXN0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiB1dGlsczo6Y29udmVydEZyb21IaWRsKHN0YXR1cyk7CisgICAgICAgIH0KKyAgICAgICAgY2hlY2tSZXBlYXRpbmdTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKHJlcGVhdGluZ1NlcXVlbmNlSWQsIGxhc3RGcmFtZU51bWJlcik7CisgICAgfQorICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6Zmx1c2hMb2NrZWQoQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uKSB7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIGFib3J0IGNhcHR1cmVzIGZhaWxlZCEgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gYmVjYXVzZSBjcmVhdGluZyBhIG5ldyBzZXNzaW9uIHdpbGwgY2xvc2UKKyAgICAvLyBwcmV2aW91cyBvbmUgYW5kIHRodXMgcmVqZWN0IGFueSBBUEkgY2FsbCBmcm9tIHByZXZpb3VzIHNlc3Npb24uCisgICAgLy8gQnV0IHN0aWxsIGdvb2QgdG8gY2hlY2sgaGVyZSBpbiBjYXNlIHNvbWV0aGluZyB1bmV4cGVjdGVkIGhhcHBlbi4KKyAgICBpZiAobUN1cnJlbnRTZXNzaW9uICE9IHNlc3Npb24pIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzZXNzaW9uICVwIGlzIG5vdCBjdXJyZW50IGFjdGl2ZSBzZXNzaW9uISIsIGdldElkKCksIHNlc3Npb24pOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAobUZsdXNoaW5nKSB7CisgICAgICAgIEFMT0dXKCJDYW1lcmEgJXMgaXMgYWxyZWFkeSBhYm9ydGluZyBjYXB0dXJlcyIsIGdldElkKCkpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9PSzsKKyAgICB9CisKKyAgICBtRmx1c2hpbmcgPSB0cnVlOworCisgICAgLy8gU2VuZCBvbkFjdGl2ZSBjYWxsYmFjayB0byBndWFyYW50ZWUgdGhlcmUgaXMgYWx3YXlzIGFjdGl2ZS0+cmVhZHkgdHJhbnNpdGlvbgorICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXNzaW9uU3RhdGVDYiwgbUhhbmRsZXIpOworICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgc2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2suY29udGV4dCk7CisgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CisgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLm9uQWN0aXZlKTsKKyAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKworICAgIC8vIElmIGRldmljZSBpcyBhbHJlYWR5IGlkbGluZywgc2VuZCBjYWxsYmFjayBhbmQgZXhpdCBlYXJseQorICAgIGlmIChtSWRsZSkgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2Vzc2lvblN0YXRlQ2IsIG1IYW5kbGVyKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBzZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5jb250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBzZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5vblJlYWR5KTsKKyAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisgICAgICAgIG1GbHVzaGluZyA9IGZhbHNlOworICAgICAgICByZXR1cm4gQUNBTUVSQV9PSzsKKyAgICB9CisKKyAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlcjsKKyAgICBTdGF0dXMgc3RhdHVzOworICAgIGF1dG8gcmVtb3RlUmV0ID0gbVJlbW90ZS0+Zmx1c2goWyZzdGF0dXMsICZsYXN0RnJhbWVOdW1iZXJdKGF1dG8gcywgYXV0byBmcmFtZU51bWJlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBYm9ydCBjYXB0dXJlcyBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbChzdGF0dXMpOworICAgIH0KKyAgICBpZiAobVJlcGVhdGluZ1NlcXVlbmNlSWQgIT0gUkVRVUVTVF9JRF9OT05FKSB7CisgICAgICAgIGNoZWNrUmVwZWF0aW5nU2VxdWVuY2VDb21wbGV0ZUxvY2tlZChtUmVwZWF0aW5nU2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyKTsKKyAgICB9CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjp3YWl0VW50aWxJZGxlTG9ja2VkKCkgeworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIldhaXQgdW50aWwgY2FtZXJhICVzIGlkbGUgZmFpbGVkISByZXQgJWQiLCBnZXRJZCgpLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChtUmVwZWF0aW5nU2VxdWVuY2VJZCAhPSBSRVFVRVNUX0lEX05PTkUpIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgd29uJ3QgZ28gdG8gaWRsZSB3aGVuIHRoZXJlIGlzIHJlcGVhdGluZyByZXF1ZXN0ISIsIGdldElkKCkpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBhdXRvIHJlbW90ZVJldCA9IG1SZW1vdGUtPndhaXRVbnRpbElkbGUoKTsKKyAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiB3YWl0VW50aWxJZGxlIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiB1dGlsczo6Y29udmVydEZyb21IaWRsKHJlbW90ZVJldCk7CisgICAgfQorICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6Y29uZmlndXJlU3RyZWFtc0xvY2tlZChjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqIG91dHB1dHMsCisgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMpIHsKKyAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIgZW1wdHlPdXRwdXQ7CisgICAgaWYgKG91dHB1dHMgPT0gbnVsbHB0cikgeworICAgICAgICBvdXRwdXRzID0gJmVtcHR5T3V0cHV0OworICAgIH0KKworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBzdGQ6OnNldDxzdGQ6OnBhaXI8bmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciwgT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXI+PiBvdXRwdXRTZXQ7CisgICAgZm9yIChhdXRvIG91dENvbmZpZyA6IG91dHB1dHMtPm1PdXRwdXRzKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogYW53ID0gb3V0Q29uZmlnLm1XaW5kb3c7CisgICAgICAgIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyIG91dENvbmZpZ0luc2VydFc7CisgICAgICAgIE91dHB1dENvbmZpZ3VyYXRpb24gJm91dENvbmZpZ0luc2VydCA9IG91dENvbmZpZ0luc2VydFcubU91dHB1dENvbmZpZ3VyYXRpb247CisgICAgICAgIG91dENvbmZpZ0luc2VydC5yb3RhdGlvbiA9IHV0aWxzOjpjb252ZXJ0VG9IaWRsKG91dENvbmZpZy5tUm90YXRpb24pOworICAgICAgICBvdXRDb25maWdJbnNlcnQud2luZG93R3JvdXBJZCA9IC0xOworICAgICAgICBvdXRDb25maWdJbnNlcnQud2luZG93SGFuZGxlcy5yZXNpemUob3V0Q29uZmlnLm1TaGFyZWRXaW5kb3dzLnNpemUoKSArIDEpOworICAgICAgICBvdXRDb25maWdJbnNlcnQud2luZG93SGFuZGxlc1swXSA9IGFudzsKKyAgICAgICAgb3V0Q29uZmlnSW5zZXJ0LnBoeXNpY2FsQ2FtZXJhSWQgPSBvdXRDb25maWcubVBoeXNpY2FsQ2FtZXJhSWQ7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIgd3JhcChhbncpOworICAgICAgICBvdXRwdXRTZXQuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGFudywgb3V0Q29uZmlnSW5zZXJ0VykpOworICAgIH0KKyAgICBzdGQ6OnNldDxzdGQ6OnBhaXI8bmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciwgT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXI+PiBhZGRTZXQgPSBvdXRwdXRTZXQ7CisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gZGVsZXRlTGlzdDsKKworICAgIC8vIERldGVybWluZSB3aGljaCBzdHJlYW1zIG5lZWQgdG8gYmUgY3JlYXRlZCwgd2hpY2ggdG8gYmUgZGVsZXRlZAorICAgIGZvciAoYXV0byYga3ZQYWlyIDogbUNvbmZpZ3VyZWRPdXRwdXRzKSB7CisgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSBrdlBhaXIuZmlyc3Q7CisgICAgICAgIGF1dG8mIG91dHB1dFBhaXIgPSBrdlBhaXIuc2Vjb25kOworICAgICAgICBpZiAob3V0cHV0U2V0LmNvdW50KG91dHB1dFBhaXIpKSB7CisgICAgICAgICAgICBkZWxldGVMaXN0LnB1c2hfYmFjayhzdHJlYW1JZCk7IC8vIE5lZWQgdG8gZGVsZXRlIGEgbm8gbG9uZ2VyIG5lZWRlZCBzdHJlYW0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFkZFNldC5lcmFzZShvdXRwdXRQYWlyKTsgICAgICAgIC8vIE5vIG5lZWQgdG8gYWRkIGFscmVhZHkgZXhpc3Rpbmcgc3RyZWFtCisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXQgPSBzdG9wUmVwZWF0aW5nTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIHN0b3AgcmVwZWF0aW5nIGZhaWxlZCwgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXQgPSB3YWl0VW50aWxJZGxlTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIHdhaXQgdW50aWwgaWRsZSBmYWlsZWQsIHJldCAlZCIsIGdldElkKCksIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLy8gU2VuZCBvblJlYWR5IHRvIHByZXZpb3VzIHNlc3Npb24KKyAgICAvLyBDdXJyZW50U2Vzc2lvbiB3aWxsIGJlIHVwZGF0ZWQgYWZ0ZXIgY29uZmlndXJlU3RyZWFtTG9ja2VkLCBzbyBoZXJlCisgICAgLy8gbUN1cnJlbnRTZXNzaW9uIGlzIHRoZSBzZXNzaW9uIHRvIGJlIHJlcGxhY2VkIGJ5IGEgbmV3IHNlc3Npb24KKyAgICBpZiAoIW1JZGxlICYmIG1DdXJyZW50U2Vzc2lvbiAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChtQnVzeVNlc3Npb24gIT0gbUN1cnJlbnRTZXNzaW9uKSB7CisgICAgICAgICAgICBBTE9HRSgiQ3VycmVudCBzZXNzaW9uICE9IGJ1c3kgc2Vzc2lvbiIpOworICAgICAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFKTsKKyAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0U7CisgICAgICAgIH0KKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlc3Npb25TdGF0ZUNiLCBtSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgbUJ1c3lTZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5jb250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgbUJ1c3lTZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG1CdXN5U2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2sub25SZWFkeSk7CisgICAgICAgIG1CdXN5U2Vzc2lvbi5jbGVhcigpOworICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICB9CisgICAgbUlkbGUgPSB0cnVlOworCisgICAgYXV0byByZW1vdGVSZXQgPSBtUmVtb3RlLT5iZWdpbkNvbmZpZ3VyZSgpOworICAgIGlmICghcmVtb3RlUmV0LmlzT2soKXx8IHJlbW90ZVJldCAhPSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIGJlZ2luIGNvbmZpZ3VyZSBmYWlsZWQiLCBnZXRJZCgpKTsKKyAgICAgICAgcmV0dXJuIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGwocmVtb3RlUmV0KTsKKyAgICB9CisKKyAgICAvLyBkZWxldGUgdG8tYmUtZGVsZXRlZCBzdHJlYW1zCisgICAgZm9yIChhdXRvIHN0cmVhbUlkIDogZGVsZXRlTGlzdCkgeworICAgICAgICByZW1vdGVSZXQgPSBtUmVtb3RlLT5kZWxldGVTdHJlYW0oc3RyZWFtSWQpOworICAgICAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkgfHwgcmVtb3RlUmV0ICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIGZhaWxlZCB0byByZW1vdmUgc3RyZWFtICVkIiwgZ2V0SWQoKSwgc3RyZWFtSWQpOworICAgICAgICAgICAgcmV0dXJuIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGwocmVtb3RlUmV0KTsKKyAgICAgICAgfQorICAgICAgICBtQ29uZmlndXJlZE91dHB1dHMuZXJhc2Uoc3RyZWFtSWQpOworICAgIH0KKworICAgIC8vIGFkZCBuZXcgc3RyZWFtcworICAgIGZvciAoYXV0byBvdXRwdXRQYWlyIDogYWRkU2V0KSB7CisgICAgICAgIGludCBzdHJlYW1JZDsKKyAgICAgICAgU3RhdHVzIHN0YXR1czsKKyAgICAgICAgYXV0byByZXQgPSBtUmVtb3RlLT5jcmVhdGVTdHJlYW0ob3V0cHV0UGFpci5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmc3RyZWFtSWRdKFN0YXR1cyBzLCBhdXRvIHN0cmVhbV9pZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlkID0gc3RyZWFtX2lkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCFyZW1vdGVSZXQuaXNPaygpIHx8IHN0YXR1cyAhPSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhIGRldmljZSAlcyBmYWlsZWQgdG8gY3JlYXRlIHN0cmVhbSIsIGdldElkKCkpOworICAgICAgICAgICAgcmV0dXJuIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGwoc3RhdHVzKTsKKyAgICAgICAgfQorICAgICAgICBtQ29uZmlndXJlZE91dHB1dHMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHN0cmVhbUlkLCBvdXRwdXRQYWlyKSk7CisgICAgfQorCisgICAgQ2FtZXJhTWV0YWRhdGEgcGFyYW1zOworICAgIEhDYW1lcmFNZXRhZGF0YSBoaWRsUGFyYW1zOworICAgIGlmICgoc2Vzc2lvblBhcmFtZXRlcnMgIT0gbnVsbHB0cikgJiYgKHNlc3Npb25QYXJhbWV0ZXJzLT5zZXR0aW5ncyAhPSBudWxscHRyKSkgeworICAgICAgICBwYXJhbXMuYXBwZW5kKHNlc3Npb25QYXJhbWV0ZXJzLT5zZXR0aW5ncy0+Z2V0SW50ZXJuYWxEYXRhKCkpOworICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcGFyYW1zX21ldGFkYXRhID0gcGFyYW1zLmdldEFuZExvY2soKTsKKyAgICAgICAgdXRpbHM6OmNvbnZlcnRUb0hpZGwocGFyYW1zX21ldGFkYXRhLCAmaGlkbFBhcmFtcyk7CisgICAgICAgIHBhcmFtcy51bmxvY2socGFyYW1zX21ldGFkYXRhKTsKKyAgICB9CisgICAgcmVtb3RlUmV0ID0gbVJlbW90ZS0+ZW5kQ29uZmlndXJlKFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlOjpOT1JNQUxfTU9ERSwgaGlkbFBhcmFtcyk7CisgICAgaWYgKCFyZW1vdGVSZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCJUcmFuc2FjdGlvbiBlcnJvcjogZW5kQ29uZmlndXJlIGZhaWxlZCAlcyIsIHJlbW90ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgIH0KKworICAgIHJldHVybiB1dGlsczo6Y29udmVydEZyb21IaWRsKHJlbW90ZVJldCk7Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6c2V0UmVtb3RlRGV2aWNlKHNwPElDYW1lcmFEZXZpY2VVc2VyPiByZW1vdGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobURldmljZUxvY2spOworICAgIG1SZW1vdGUgPSByZW1vdGU7Cit9CisKK2Jvb2wKK0NhbWVyYURldmljZTo6c2V0RGV2aWNlTWV0YWRhdGFRdWV1ZXMoKSB7CisgICAgICAgIGlmIChtUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICAgICAgICBBTE9HRSgibVJlbW90ZSBtdXN0IG5vdCBiZSBudWxsIHdoaWxlIHRyeWluZyB0byBmZXRjaCBtZXRhZGF0YSBxdWV1ZXMiKTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiAmcmVxUXVldWUgPSBtQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlOworICAgICAgICBhdXRvIHJldCA9CisgICAgICAgICAgICBtUmVtb3RlLT5nZXRDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUoCisgICAgICAgICAgICAgICAgWyZyZXFRdWV1ZV0oY29uc3QgYXV0byAmbXFEZXNjcmlwdG9yKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcVF1ZXVlID0gc3RkOjptYWtlX3NoYXJlZDxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4obXFEZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXFRdWV1ZS0+aXNWYWxpZCgpIHx8IHJlcVF1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPD0wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRW1wdHkgZm1xIGZyb20gY2FtZXJhc2VydmVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXFRdWV1ZSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiVHJhbnNhY3Rpb24gZXJyb3IgdHJ5aW5nIHRvIGdldCBjYXB0dXJlIHJlcXVlc3QgbWV0YWRhdGEgcXVldWUiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVzdWx0TWV0YWRhdGFRdWV1ZT4gJnJlc1F1ZXVlID0gbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlOworICAgICAgICByZXQgPQorICAgICAgICAgICAgICAgIG1SZW1vdGUtPmdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKAorICAgICAgICAgICAgICAgICAgICAgICAgWyZyZXNRdWV1ZV0oY29uc3QgYXV0byAmbXFEZXNjcmlwdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzUXVldWUgPSBzdGQ6Om1ha2Vfc2hhcmVkPFJlc3VsdE1ldGFkYXRhUXVldWU+KG1xRGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNRdWV1ZS0+aXNWYWxpZCgpIHx8IHJlc1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPD0wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJFbXB0eSBmbXEgZnJvbSBjYW1lcmFzZXJ2ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiVHJhbnNhY3Rpb24gZXJyb3IgdHJ5aW5nIHRvIGdldCBjYXB0dXJlIHJlc3VsdCBtZXRhZGF0YSBxdWV1ZSIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworfQorCitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6Y2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCkgY29uc3QgeworICAgIGlmIChtUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjYW1lcmEgZGV2aWNlIGFscmVhZHkgY2xvc2VkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDsKKyAgICB9CisgICAgaWYgKG1JbkVycm9yKSB7Ly8gdHJpZ2dlcmVkIGJ5IG9uRGV2aWNlRXJyb3IKKyAgICAgICAgQUxPR0UoIiVzOiBjYW1lcmEgZGV2aWNlIGhhcyBlbmNvdW50ZXJlZCBhIHNlcmlvdXMgZXJyb3IiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gbUVycm9yOworICAgIH0KKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChjYW1lcmFfc3RhdHVzX3QgZXJyb3IpIHsKKyAgICBtSW5FcnJvciA9IHRydWU7CisgICAgbUVycm9yID0gZXJyb3I7CisgICAgcmV0dXJuOworfQorCit2b2lkCitDYW1lcmFEZXZpY2U6OkZyYW1lTnVtYmVyVHJhY2tlcjo6dXBkYXRlVHJhY2tlcihpbnQ2NF90IGZyYW1lTnVtYmVyLCBib29sIGlzRXJyb3IpIHsKKyAgICBBTE9HVigidXBkYXRlVHJhY2tlciBmcmFtZSAlIiBQUklkNjQgIiBpc0Vycm9yICVkIiwgZnJhbWVOdW1iZXIsIGlzRXJyb3IpOworICAgIGlmIChpc0Vycm9yKSB7CisgICAgICAgIG1GdXR1cmVFcnJvclNldC5pbnNlcnQoZnJhbWVOdW1iZXIpOworICAgIH0gZWxzZSBpZiAoZnJhbWVOdW1iZXIgPD0gbUNvbXBsZXRlZEZyYW1lTnVtYmVyKSB7CisgICAgICAgIEFMT0dFKCJGcmFtZSBudW1iZXIgJSIgUFJJZDY0ICIgZGVjcmVhc2VkISBjdXJyZW50IGZuICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICBmcmFtZU51bWJlciwgbUNvbXBsZXRlZEZyYW1lTnVtYmVyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChmcmFtZU51bWJlciAhPSBtQ29tcGxldGVkRnJhbWVOdW1iZXIgKyAxKSB7CisgICAgICAgICAgICBBTE9HRSgiRnJhbWUgbnVtYmVyIG91dCBvZiBvcmRlci4gRXhwZWN0ICUiIFBSSWQ2NCAiIGJ1dCBnZXQgJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgICAgICBtQ29tcGxldGVkRnJhbWVOdW1iZXIgKyAxLCBmcmFtZU51bWJlcik7CisgICAgICAgICAgICAvLyBEbyBub3QgYXNzZXJ0IGFzIGluIGphdmEgaW1wbGVtZW50YXRpb24KKyAgICAgICAgfQorICAgICAgICBtQ29tcGxldGVkRnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICB9CisgICAgdXBkYXRlKCk7Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6RnJhbWVOdW1iZXJUcmFja2VyOjp1cGRhdGUoKSB7CisgICAgZm9yIChhdXRvIGl0ID0gbUZ1dHVyZUVycm9yU2V0LmJlZ2luKCk7IGl0ICE9IG1GdXR1cmVFcnJvclNldC5lbmQoKTspIHsKKyAgICAgICAgaW50NjRfdCBlcnJvckZyYW1lTnVtYmVyID0gKml0OworICAgICAgICBpZiAoZXJyb3JGcmFtZU51bWJlciA9PSBtQ29tcGxldGVkRnJhbWVOdW1iZXIgKyAxKSB7CisgICAgICAgICAgICBtQ29tcGxldGVkRnJhbWVOdW1iZXIrKzsKKyAgICAgICAgICAgIGl0ID0gbUZ1dHVyZUVycm9yU2V0LmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIGlmIChlcnJvckZyYW1lTnVtYmVyIDw9IG1Db21wbGV0ZWRGcmFtZU51bWJlcikgeworICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IGRlYWwgd2l0aCBpdCBhbnl3YXkKKyAgICAgICAgICAgIEFMT0dFKCJDb21wbGV0ZCBmcmFtZSBudW1iZXIgcGFzc2VkIHRocm91Z2ggY3VycmVudCBmcmFtZSBudW1iZXIhIik7CisgICAgICAgICAgICAvLyBlcmFzZSB0aGUgb2xkIGVycm9yIHNpbmNlIGl0J3Mgbm8gbG9uZ2VyIHVzZWZ1bAorICAgICAgICAgICAgaXQgPSBtRnV0dXJlRXJyb3JTZXQuZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gTm9ybWFsIHJlcXVlc3RzIGhhc24ndCBjYXRjaGVkIHVwIGVycm9yIGZyYW1lcywganVzdCBicmVhaworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoIlVwZGF0ZSBjb21wbGV0ZSBmcmFtZSAlIiBQUklkNjQsIG1Db21wbGV0ZWRGcmFtZU51bWJlcik7Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6b25DYXB0dXJlRXJyb3JMb2NrZWQoCisgICAgICAgIEVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgeworICAgIGludCBzZXF1ZW5jZUlkID0gcmVzdWx0RXh0cmFzLnJlcXVlc3RJZDsKKyAgICBpbnQ2NF90IGZyYW1lTnVtYmVyID0gcmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyOworICAgIGludDMyX3QgYnVyc3RJZCA9IHJlc3VsdEV4dHJhcy5idXJzdElkOworICAgIGF1dG8gaXQgPSBtU2VxdWVuY2VDYWxsYmFja01hcC5maW5kKHNlcXVlbmNlSWQpOworICAgIGlmIChpdCA9PSBtU2VxdWVuY2VDYWxsYmFja01hcC5lbmQoKSkgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBjYXB0dXJlIHNlcXVlbmNlIGluZGV4ICVkIG5vdCBmb3VuZCEiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2VxdWVuY2VJZCk7CisgICAgICAgIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX1NFUlZJQ0UpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ2FsbGJhY2tIb2xkZXIgY2JoID0gKCppdCkuc2Vjb25kOworICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiA9IGNiaC5tU2Vzc2lvbjsKKyAgICBpZiAoKHNpemVfdCkgYnVyc3RJZCA+PSBjYmgubVJlcXVlc3RzLnNpemUoKSkgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiByZXF1ZXN0IGluZGV4ICVkIG91dCBvZiBib3VuZCAoc2l6ZSAlenUpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1cnN0SWQsIGNiaC5tUmVxdWVzdHMuc2l6ZSgpKTsKKyAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QgPSBjYmgubVJlcXVlc3RzW2J1cnN0SWRdOworCisgICAgLy8gSGFuZGxlIGJ1ZmZlciBlcnJvcgorICAgIGlmIChlcnJvckNvZGUgPT0gRXJyb3JDb2RlOjpDQU1FUkFfQlVGRkVSKSB7CisgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSByZXN1bHRFeHRyYXMuZXJyb3JTdHJlYW1JZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19idWZmZXJMb3N0IG9uQnVmZmVyTG9zdCA9CisgICAgICAgICAgICAgICAgY2JoLm1PbkNhcHR1cmVCdWZmZXJMb3N0OworICAgICAgICBhdXRvIG91dHB1dFBhaXJJdCA9IG1Db25maWd1cmVkT3V0cHV0cy5maW5kKHN0cmVhbUlkKTsKKyAgICAgICAgaWYgKG91dHB1dFBhaXJJdCA9PSBtQ29uZmlndXJlZE91dHB1dHMuZW5kKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IHN0cmVhbSBpZCAlZCBkb2VzIG5vdCBleGlzdCIsIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOworICAgICAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBhdXRvJiB3aW5kb3dIYW5kbGVzID0gb3V0cHV0UGFpckl0LT5zZWNvbmQuc2Vjb25kLm1PdXRwdXRDb25maWd1cmF0aW9uLndpbmRvd0hhbmRsZXM7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgb3V0SGFuZGxlIDogd2luZG93SGFuZGxlcykgeworICAgICAgICAgICAgZm9yIChhdXRvIHN0cmVhbUFuZFdpbmRvd0lkIDogcmVxdWVzdC0+bUNhcHR1cmVSZXF1ZXN0LnN0cmVhbUFuZFdpbmRvd0lkcykgeworICAgICAgICAgICAgICAgIGludDMyX3Qgd2luZG93SWQgPSBzdHJlYW1BbmRXaW5kb3dJZC53aW5kb3dJZDsKKyAgICAgICAgICAgICAgICBpZiAodXRpbHM6OmlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwod2luZG93SGFuZGxlc1t3aW5kb3dJZF0sb3V0SGFuZGxlKSkgeworICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGFudyA9CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPih3aW5kb3dIYW5kbGVzW3dpbmRvd0lkXS5nZXROYXRpdmVIYW5kbGUoKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJDYW1lcmEgJXMgTG9zdCBvdXRwdXQgYnVmZmVyIGZvciBBTlcgJXAgZnJhbWUgJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldElkKCksIGFudywgZnJhbWVOdW1iZXIpOworCisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlQnVmZmVyTG9zdCwgbUhhbmRsZXIpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgb25CdWZmZXJMb3N0KTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtBbndLZXksICh2b2lkKikgYW53KTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQ2NChrRnJhbWVOdW1iZXJLZXksIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsgLy8gSGFuZGxlIG90aGVyIGNhcHR1cmUgZmFpbHVyZXMKKyAgICAgICAgLy8gRmlyZSBjYXB0dXJlIGZhaWx1cmUgY2FsbGJhY2sgaWYgdGhlcmUgaXMgb25lIHJlZ2lzdGVyZWQKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgb25FcnJvciA9IGNiaC5tT25DYXB0dXJlRmFpbGVkOworICAgICAgICBzcDxDYW1lcmFDYXB0dXJlRmFpbHVyZT4gZmFpbHVyZShuZXcgQ2FtZXJhQ2FwdHVyZUZhaWx1cmUoKSk7CisgICAgICAgIGZhaWx1cmUtPmZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CisgICAgICAgIC8vIFRPRE86IHJlZmluZSB0aGlzIHdoZW4gaW1wbGVtZW50aW5nIGZsdXNoCisgICAgICAgIGZhaWx1cmUtPnJlYXNvbiAgICAgID0gQ0FQVFVSRV9GQUlMVVJFX1JFQVNPTl9FUlJPUjsKKyAgICAgICAgZmFpbHVyZS0+c2VxdWVuY2VJZCAgPSBzZXF1ZW5jZUlkOworICAgICAgICBmYWlsdXJlLT53YXNJbWFnZUNhcHR1cmVkID0gKGVycm9yQ29kZSA9PSBFcnJvckNvZGU6OkNBTUVSQV9SRVNVTFQpOworCisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoY2JoLm1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjayA/IGtXaGF0TG9naWNhbENhcHR1cmVGYWlsIDoKKyAgICAgICAgICAgICAgICBrV2hhdENhcHR1cmVGYWlsLCBtSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CisgICAgICAgIGlmIChjYmgubUlzTG9naWNhbENhbWVyYUNhbGxiYWNrKSB7CisgICAgICAgICAgICBpZiAocmVzdWx0RXh0cmFzLmVycm9yUGh5c2ljYWxDYW1lcmFJZC5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoa0ZhaWxpbmdQaHlzaWNhbENhbWVyYUlkLCByZXN1bHRFeHRyYXMuZXJyb3JQaHlzaWNhbENhbWVyYUlkLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRFeHRyYXMuZXJyb3JQaHlzaWNhbENhbWVyYUlkLnNpemUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgY2JoLm1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlRmFpbGVkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvbkVycm9yKTsKKyAgICAgICAgfQorICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZVJlcXVlc3RLZXksIHJlcXVlc3QpOworICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZUZhaWx1cmVLZXksIGZhaWx1cmUpOworICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKworICAgICAgICAvLyBVcGRhdGUgdHJhY2tlcgorICAgICAgICBtRnJhbWVOdW1iZXJUcmFja2VyLnVwZGF0ZVRyYWNrZXIoZnJhbWVOdW1iZXIsIC8qaXNFcnJvciovdHJ1ZSk7CisgICAgICAgIGNoZWNrQW5kRmlyZVNlcXVlbmNlQ29tcGxldGVMb2NrZWQoKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCitDYW1lcmFEZXZpY2U6OkNhbGxiYWNrSGFuZGxlcjo6Q2FsbGJhY2tIYW5kbGVyKGNvbnN0IGNoYXIgKmlkKSA6IG1JZChpZCkgeyB9CisKK3ZvaWQgQ2FtZXJhRGV2aWNlOjpDYWxsYmFja0hhbmRsZXI6Om9uTWVzc2FnZVJlY2VpdmVkKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdE9uRGlzY29ubmVjdGVkOgorICAgICAgICBjYXNlIGtXaGF0T25FcnJvcjoKKyAgICAgICAgY2FzZSBrV2hhdFNlc3Npb25TdGF0ZUNiOgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKKyAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlUmVzdWx0OgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUZhaWw6CisgICAgICAgIGNhc2Uga1doYXRMb2dpY2FsQ2FwdHVyZUZhaWw6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxRW5kOgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVNlcUFib3J0OgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUJ1ZmZlckxvc3Q6CisgICAgICAgICAgICBBTE9HVigiJXM6IFJlY2VpdmVkIG1zZyAlZCIsIF9fRlVOQ1RJT05fXywgbXNnLT53aGF0KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga1doYXRDbGVhblVwU2Vzc2lvbnM6CisgICAgICAgICAgICBtQ2FjaGVkU2Vzc2lvbnMuY2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlczpFcnJvcjogdW5rbm93biBkZXZpY2UgY2FsbGJhY2sgJWQiLCBfX0ZVTkNUSU9OX18sIG1zZy0+d2hhdCgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gQ2hlY2sgdGhlIGNvbW1vbiBwYXJ0IG9mIGFsbCBtZXNzYWdlCisgICAgdm9pZCogY29udGV4dDsKKyAgICBib29sIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ29udGV4dEtleSwgJmNvbnRleHQpOworICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYWxsYmFjayBjb250ZXh0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0T25EaXNjb25uZWN0ZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFDYW1lcmFEZXZpY2UqIGRldjsKKyAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrRGV2aWNlS2V5LCAodm9pZCoqKSAmZGV2KTsKKyAgICAgICAgICAgIGlmICghZm91bmQgfHwgZGV2ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGRldmljZSBwb2ludGVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrIG9uRGlzY29ubmVjdGVkOworICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmb25EaXNjb25uZWN0ZWQpOworICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgb25EaXNjb25uZWN0ZWQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob25EaXNjb25uZWN0ZWQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICgqb25EaXNjb25uZWN0ZWQpKGNvbnRleHQsIGRldik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0T25FcnJvcjoKKyAgICAgICAgeworICAgICAgICAgICAgQUNhbWVyYURldmljZSogZGV2OworICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtEZXZpY2VLZXksICh2b2lkKiopICZkZXYpOworICAgICAgICAgICAgaWYgKCFmb3VuZCB8fCBkZXYgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgZGV2aWNlIHBvaW50ZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX0Vycm9yU3RhdGVDYWxsYmFjayBvbkVycm9yOworICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmb25FcnJvcik7CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBvbkVycm9yISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGVycm9yQ29kZTsKKyAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kSW50MzIoa0Vycm9yQ29kZUtleSwgJmVycm9yQ29kZSk7CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBlcnJvciBjb2RlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9uRXJyb3IgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICgqb25FcnJvcikoY29udGV4dCwgZGV2LCBlcnJvckNvZGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFNlc3Npb25TdGF0ZUNiOgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKKyAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlUmVzdWx0OgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUZhaWw6CisgICAgICAgIGNhc2Uga1doYXRMb2dpY2FsQ2FwdHVyZUZhaWw6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxRW5kOgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVNlcUFib3J0OgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUJ1ZmZlckxvc3Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kT2JqZWN0KGtTZXNzaW9uU3BLZXksICZvYmopOworICAgICAgICAgICAgaWYgKCFmb3VuZCB8fCBvYmogPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgc2Vzc2lvbiBwb2ludGVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uKHN0YXRpY19jYXN0PEFDYW1lcmFDYXB0dXJlU2Vzc2lvbio+KG9iai5nZXQoKSkpOworICAgICAgICAgICAgbUNhY2hlZFNlc3Npb25zLnB1c2goc2Vzc2lvbik7CisgICAgICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdFNwID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmlkX2NzdHIgPSBtSWQuY19zdHIoKTsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdDoKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUZhaWw6CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlRmFpbDoKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUJ1ZmZlckxvc3Q6CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kT2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgJm9iaik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSByZXF1ZXN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFNwID0gc3RhdGljX2Nhc3Q8Q2FwdHVyZVJlcXVlc3QqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICAgICAgICAgIGNhc2Uga1doYXRTZXNzaW9uU3RhdGVDYjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrIG9uU3RhdGU7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJm9uU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIHN0YXRlIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9uU3RhdGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICgqb25TdGF0ZSkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydCBvblN0YXJ0OworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvblN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYXB0dXJlIHN0YXJ0IGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9uU3RhcnQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZEludDY0KGtUaW1lU3RhbXBLZXksICZ0aW1lc3RhbXApOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIHRpbWVzdGFtcCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCwgaWRfY3N0cik7CisgICAgICAgICAgICAgICAgICAgICgqb25TdGFydCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgcmVxdWVzdCwgdGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgb25SZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJm9uUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYXB0dXJlIHJlc3VsdCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblJlc3VsdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrQ2FwdHVyZVJlc3VsdEtleSwgJm9iaik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSByZXN1bHQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IHJlc3VsdChzdGF0aWNfY2FzdDxBQ2FtZXJhTWV0YWRhdGEqPihvYmouZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwLCBpZF9jc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgKCpvblJlc3VsdCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgcmVxdWVzdCwgcmVzdWx0LmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgb25SZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJm9uUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYXB0dXJlIHJlc3VsdCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblJlc3VsdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrQ2FwdHVyZVJlc3VsdEtleSwgJm9iaik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSByZXN1bHQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IHJlc3VsdChzdGF0aWNfY2FzdDxBQ2FtZXJhTWV0YWRhdGEqPihvYmouZ2V0KCkpKTsKKworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrUGh5c2ljYWxDYXB0dXJlUmVzdWx0S2V5LCAmb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBwaHlzaWNhbCBjYXB0dXJlIHJlc3VsdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBwaHlzaWNhbFJlc3VsdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyo+KG9iai5nZXQoKSkpOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvTG9jYWw+JiBwaHlzaWNhbFJlc3VsdEluZm8gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsUmVzdWx0LT5tUGh5c2ljYWxSZXN1bHRJbmZvOworCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkczsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3A8QUNhbWVyYU1ldGFkYXRhPj4gcGh5c2ljYWxNZXRhZGF0YUNvcHk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGh5c2ljYWxSZXN1bHRJbmZvLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkcy5wdXNoX2JhY2socGh5c2ljYWxSZXN1bHRJbmZvW2ldLnBoeXNpY2FsQ2FtZXJhSWQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBjbG9uZSA9IHBoeXNpY2FsUmVzdWx0SW5mb1tpXS5waHlzaWNhbE1ldGFkYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmUudXBkYXRlKEFORFJPSURfU1lOQ19GUkFNRV9OVU1CRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlzaWNhbFJlc3VsdC0+bUZyYW1lTnVtYmVyLCAvKmRhdGFfY291bnQqLzEpOworICAgICAgICAgICAgICAgICAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBtZXRhZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBQ2FtZXJhTWV0YWRhdGEoY2xvbmUucmVsZWFzZSgpLCBBQ2FtZXJhTWV0YWRhdGE6OkFDTV9SRVNVTFQpOworICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxNZXRhZGF0YUNvcHkucHVzaF9iYWNrKG1ldGFkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gcGh5c2ljYWxDYW1lcmFJZFB0cnM7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEFDYW1lcmFNZXRhZGF0YSo+IHBoeXNpY2FsTWV0YWRhdGFDb3B5UHRyczsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzaWNhbFJlc3VsdEluZm8uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWRQdHJzLnB1c2hfYmFjayhwaHlzaWNhbENhbWVyYUlkc1tpXS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsTWV0YWRhdGFDb3B5UHRycy5wdXNoX2JhY2socGh5c2ljYWxNZXRhZGF0YUNvcHlbaV0uZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwLCBpZF9jc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgKCpvblJlc3VsdCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgcmVxdWVzdCwgcmVzdWx0LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsUmVzdWx0SW5mby5zaXplKCksIHBoeXNpY2FsQ2FtZXJhSWRQdHJzLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbE1ldGFkYXRhQ29weVB0cnMuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVGYWlsOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgb25GYWlsOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvbkZhaWwpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhcHR1cmUgZmFpbCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvbkZhaWwgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRPYmplY3Qoa0NhcHR1cmVGYWlsdXJlS2V5LCAmb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYXB0dXJlIGZhaWx1cmUhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxDYW1lcmFDYXB0dXJlRmFpbHVyZT4gZmFpbHVyZVNwKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYUNhcHR1cmVGYWlsdXJlKj4ob2JqLmdldCgpKSk7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlRmFpbHVyZSogZmFpbHVyZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QUNhbWVyYUNhcHR1cmVGYWlsdXJlKj4oZmFpbHVyZVNwLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwLCBpZF9jc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgKCpvbkZhaWwpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHJlcXVlc3QsIGZhaWx1cmUpOworICAgICAgICAgICAgICAgICAgICBmcmVlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlRmFpbDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgb25GYWlsOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvbkZhaWwpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhcHR1cmUgZmFpbCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvbkZhaWwgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRPYmplY3Qoa0NhcHR1cmVGYWlsdXJlS2V5LCAmb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYXB0dXJlIGZhaWx1cmUhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxDYW1lcmFDYXB0dXJlRmFpbHVyZT4gZmFpbHVyZVNwKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYUNhcHR1cmVGYWlsdXJlKj4ob2JqLmdldCgpKSk7CisgICAgICAgICAgICAgICAgICAgIEFMb2dpY2FsQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgZmFpbHVyZTsKKyAgICAgICAgICAgICAgICAgICAgQVN0cmluZyBwaHlzaWNhbENhbWVyYUlkOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFN0cmluZyhrRmFpbGluZ1BoeXNpY2FsQ2FtZXJhSWQsICZwaHlzaWNhbENhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kICYmICFwaHlzaWNhbENhbWVyYUlkLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUucGh5c2ljYWxDYW1lcmFJZCA9IHBoeXNpY2FsQ2FtZXJhSWQuY19zdHIoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUucGh5c2ljYWxDYW1lcmFJZCA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZmFpbHVyZS5jYXB0dXJlRmFpbHVyZSA9ICpmYWlsdXJlU3A7CisgICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCwgaWRfY3N0cik7CisgICAgICAgICAgICAgICAgICAgICgqb25GYWlsKShjb250ZXh0LCBzZXNzaW9uLmdldCgpLCByZXF1ZXN0LCAmZmFpbHVyZSk7CisgICAgICAgICAgICAgICAgICAgIGZyZWVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVNlcUVuZDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc2VxdWVuY2VFbmQgb25TZXFFbmQ7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJm9uU2VxRW5kKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBzZXF1ZW5jZSBlbmQgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAob25TZXFFbmQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludCBzZXFJZDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRJbnQzMihrU2VxdWVuY2VJZEtleSwgJnNlcUlkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBmcmFtZSBudW1iZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lTnVtYmVyOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZEludDY0KGtGcmFtZU51bWJlcktleSwgJmZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBmcmFtZSBudW1iZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAoKm9uU2VxRW5kKShjb250ZXh0LCBzZXNzaW9uLmdldCgpLCBzZXFJZCwgZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTZXFBYm9ydDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc2VxdWVuY2VBYm9ydCBvblNlcUFib3J0OworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvblNlcUFib3J0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBzZXF1ZW5jZSBlbmQgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAob25TZXFBYm9ydCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50IHNlcUlkOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZEludDMyKGtTZXF1ZW5jZUlkS2V5LCAmc2VxSWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGZyYW1lIG51bWJlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICgqb25TZXFBYm9ydCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgc2VxSWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVCdWZmZXJMb3N0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19idWZmZXJMb3N0IG9uQnVmZmVyTG9zdDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmb25CdWZmZXJMb3N0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBidWZmZXIgbG9zdCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvbkJ1ZmZlckxvc3QgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBhbnc7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQW53S2V5LCAodm9pZCoqKSAmYW53KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBuYXRpdmVfaGFuZGxlX3QhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZnJhbWVOdW1iZXI7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kSW50NjQoa0ZyYW1lTnVtYmVyS2V5LCAmZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGZyYW1lIG51bWJlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwLCBpZF9jc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgKCpvbkJ1ZmZlckxvc3QpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHJlcXVlc3QsIGFudywgZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgICAgICAgICBmcmVlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworQ2FtZXJhRGV2aWNlOjpDYWxsYmFja0hvbGRlcjo6Q2FsbGJhY2tIb2xkZXIoCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgY29uc3QgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+JiByZXF1ZXN0cywKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdGluZywKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicykgOgorICAgICAgICBtU2Vzc2lvbihzZXNzaW9uKSwgbVJlcXVlc3RzKHJlcXVlc3RzKSwKKyAgICAgICAgbUlzUmVwZWF0aW5nKGlzUmVwZWF0aW5nKSwKKyAgICAgICAgbUlzTG9naWNhbENhbWVyYUNhbGxiYWNrKGZhbHNlKSB7CisgICAgaW5pdENhcHR1cmVDYWxsYmFja3MoY2JzKTsKKworICAgIGlmIChjYnMgIT0gbnVsbHB0cikgeworICAgICAgICBtT25DYXB0dXJlQ29tcGxldGVkID0gY2JzLT5vbkNhcHR1cmVDb21wbGV0ZWQ7CisgICAgICAgIG1PbkNhcHR1cmVGYWlsZWQgPSBjYnMtPm9uQ2FwdHVyZUZhaWxlZDsKKyAgICB9Cit9CisKK0NhbWVyYURldmljZTo6Q2FsbGJhY2tIb2xkZXI6OkNhbGxiYWNrSG9sZGVyKAorICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiYgcmVxdWVzdHMsCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MqIGxjYnMpIDoKKyAgICAgICAgbVNlc3Npb24oc2Vzc2lvbiksIG1SZXF1ZXN0cyhyZXF1ZXN0cyksCisgICAgICAgIG1Jc1JlcGVhdGluZyhpc1JlcGVhdGluZyksCisgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjayh0cnVlKSB7CisgICAgaW5pdENhcHR1cmVDYWxsYmFja3MobGNicyk7CisKKyAgICBpZiAobGNicyAhPSBudWxscHRyKSB7CisgICAgICAgIG1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkID0gbGNicy0+b25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZDsKKyAgICAgICAgbU9uTG9naWNhbENhbWVyYUNhcHR1cmVGYWlsZWQgPSBsY2JzLT5vbkxvZ2ljYWxDYW1lcmFDYXB0dXJlRmFpbGVkOworICAgIH0KK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpjaGVja1JlcGVhdGluZ1NlcXVlbmNlQ29tcGxldGVMb2NrZWQoCisgICAgY29uc3QgaW50IHNlcXVlbmNlSWQsIGNvbnN0IGludDY0X3QgbGFzdEZyYW1lTnVtYmVyKSB7CisgICAgQUxPR1YoIlJlcGVhdGluZyBzZXFJZCAlZCBsYXN0RnJhbWVOdW1lciAlIiBQUklkNjQsIHNlcXVlbmNlSWQsIGxhc3RGcmFtZU51bWJlcik7CisgICAgaWYgKGxhc3RGcmFtZU51bWJlciA9PSBOT19GUkFNRVNfQ0FQVFVSRUQpIHsKKyAgICAgICAgaWYgKG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmNvdW50KHNlcXVlbmNlSWQpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJObyBjYWxsYmFjayBmb3VuZCBmb3Igc2VxdWVuY2VJZCAlZCIsIHNlcXVlbmNlSWQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIHJlbW92ZSBjYWxsYmFjayBob2xkZXIgZnJvbSBjYWxsYmFjayBtYXAKKyAgICAgICAgYXV0byBjYkl0ID0gbVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKTsKKyAgICAgICAgQ2FsbGJhY2tIb2xkZXIgY2JoID0gY2JJdC0+c2Vjb25kOworICAgICAgICBtU2VxdWVuY2VDYWxsYmFja01hcC5lcmFzZShjYkl0KTsKKyAgICAgICAgLy8gc2VuZCBzZXEgYWJvcnRlZCBjYWxsYmFjaworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVNlcUFib3J0LCBtSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgY2JoLm1TZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGNiaC5tT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMihrU2VxdWVuY2VJZEtleSwgc2VxdWVuY2VJZCk7CisgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFVzZSBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAgdG8gdHJhY2sKKyAgICAgICAgbVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihzZXF1ZW5jZUlkLCBsYXN0RnJhbWVOdW1iZXIpKTsKKworICAgICAgICAvLyBMYXN0IGZyYW1lIG1pZ2h0IGhhdmUgYXJyaXZlZC4gQ2hlY2sgbm93CisgICAgICAgIGNoZWNrQW5kRmlyZVNlcXVlbmNlQ29tcGxldGVMb2NrZWQoKTsKKyAgICB9Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6Y2hlY2tBbmRGaXJlU2VxdWVuY2VDb21wbGV0ZUxvY2tlZCgpIHsKKyAgICBpbnQ2NF90IGNvbXBsZXRlZEZyYW1lTnVtYmVyID0gbUZyYW1lTnVtYmVyVHJhY2tlci5nZXRDb21wbGV0ZWRGcmFtZU51bWJlcigpOworICAgIGF1dG8gaXQgPSBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gbVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyTWFwLmVuZCgpKSB7CisgICAgICAgIGludCBzZXF1ZW5jZUlkID0gaXQtPmZpcnN0OworICAgICAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGJvb2wgc2VxQ29tcGxldGVkID0gZmFsc2U7CisgICAgICAgIGJvb2wgaGFzQ2FsbGJhY2sgID0gdHJ1ZTsKKworICAgICAgICBpZiAobVJlbW90ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HVygiQ2FtZXJhICVzIGNsb3NlZCB3aGlsZSBjaGVja2luZyBzZXF1ZW5jZSBjb21wbGV0ZSIsIGdldElkKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgY2FsbGJhY2sgZm9yIHRoaXMgc2VxdWVuY2UKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiBiZWNhdXNlIHdlIGFsd2F5cyByZWdpc3RlciBjYWxsYmFjayAod2l0aCBudWxscHRyIGluc2lkZSkKKyAgICAgICAgaWYgKG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmNvdW50KHNlcXVlbmNlSWQpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJObyBjYWxsYmFjayBmb3VuZCBmb3Igc2VxdWVuY2VJZCAlZCIsIHNlcXVlbmNlSWQpOworICAgICAgICAgICAgaGFzQ2FsbGJhY2sgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsYXN0RnJhbWVOdW1iZXIgPD0gY29tcGxldGVkRnJhbWVOdW1iZXIpIHsKKyAgICAgICAgICAgIEFMT0dWKCJzZXEgJWQgcmVhY2hlZCBsYXN0IGZyYW1lICUiIFBSSWQ2NCAiLCBjb21wbGV0ZWQgJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyLCBjb21wbGV0ZWRGcmFtZU51bWJlcik7CisgICAgICAgICAgICBzZXFDb21wbGV0ZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlcUNvbXBsZXRlZCAmJiBoYXNDYWxsYmFjaykgeworICAgICAgICAgICAgLy8gcmVtb3ZlIGNhbGxiYWNrIGhvbGRlciBmcm9tIGNhbGxiYWNrIG1hcAorICAgICAgICAgICAgYXV0byBjYkl0ID0gbVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKTsKKyAgICAgICAgICAgIENhbGxiYWNrSG9sZGVyIGNiaCA9IGNiSXQtPnNlY29uZDsKKyAgICAgICAgICAgIG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVyYXNlKGNiSXQpOworICAgICAgICAgICAgLy8gc2VuZCBzZXEgY29tcGxldGUgY2FsbGJhY2sKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlU2VxRW5kLCBtSGFuZGxlcik7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CisgICAgICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBjYmgubVNlc3Npb24pOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGNiaC5tT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQpOworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMihrU2VxdWVuY2VJZEtleSwgc2VxdWVuY2VJZCk7CisgICAgICAgICAgICBtc2ctPnNldEludDY0KGtGcmFtZU51bWJlcktleSwgbGFzdEZyYW1lTnVtYmVyKTsKKworICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIHNlc3Npb24gc3AgYmVmb3JlIHdlIHNlbmQgb3V0IHRoZSBtZXNzYWdlCisgICAgICAgICAgICAvLyBUaGlzIHdpbGwgZ3VhcmFudGVlIHRoZSByYXJlIGNhc2Ugd2hlcmUgdGhlIG1lc3NhZ2UgaXMgcHJvY2Vzc2VkCisgICAgICAgICAgICAvLyBiZWZvcmUgY2JoIGdvZXMgb3V0IG9mIHNjb3BlIGFuZCBjYXVzaW5nIHdlIGNhbGwgdGhlIHNlc3Npb24KKyAgICAgICAgICAgIC8vIGRlc3RydWN0b3Igd2hpbGUgaG9sZGluZyBkZXZpY2UgbG9jaworICAgICAgICAgICAgY2JoLm1TZXNzaW9uLmNsZWFyKCk7CisgICAgICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vIG5lZWQgdG8gdHJhY2sgc2VxdWVuY2UgY29tcGxldGUgaWYgdGhlcmUgaXMgbm8gY2FsbGJhY2sgcmVnaXN0ZXJlZAorICAgICAgICBpZiAoc2VxQ29tcGxldGVkIHx8ICFoYXNDYWxsYmFjaykgeworICAgICAgICAgICAgaXQgPSBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAuZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgIH0KK30KKworLyoqCisgICogQ2FtZXJhIHNlcnZpY2UgY2FsbGJhY2sgaW1wbGVtZW50YXRpb24KKyAgKi8KK2FuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4KK0NhbWVyYURldmljZTo6U2VydmljZUNhbGxiYWNrOjpvbkRldmljZUVycm9yKAorICAgICAgICBFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKKyAgICBBTE9HRCgiRGV2aWNlIGVycm9yIHJlY2VpdmVkLCBjb2RlICVkLCBmcmFtZSBudW1iZXIgJSIgUFJJZDY0ICIsIHJlcXVlc3QgSUQgJWQsIHN1YnNlcSBJRCAlZCIKKyAgICAgICAgICAgICIgcGh5c2ljYWwgY2FtZXJhIElEICVzIiwgZXJyb3JDb2RlLCByZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIsIHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQsCisgICAgICAgICAgICByZXN1bHRFeHRyYXMuYnVyc3RJZCwgcmVzdWx0RXh0cmFzLmVycm9yUGh5c2ljYWxDYW1lcmFJZC5jX3N0cigpKTsKKyAgICBhdXRvIHJldCA9IFZvaWQoKTsKKyAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIGlmIChkZXYgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OyAvLyBkZXZpY2UgaGFzIGJlZW4gY2xvc2VkCisgICAgfQorCisgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uID0gZGV2LT5tQ3VycmVudFNlc3Npb24ucHJvbW90ZSgpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChkZXYtPm1EZXZpY2VMb2NrKTsKKyAgICBpZiAoZGV2LT5tUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJldDsgLy8gZGV2aWNlIGhhcyBiZWVuIGNsb3NlZAorICAgIH0KKyAgICBzd2l0Y2ggKGVycm9yQ29kZSkgeworICAgICAgICBjYXNlIEVycm9yQ29kZTo6Q0FNRVJBX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQ2FtZXJhIGlzIGRpc2Nvbm5lY3RlZCwgY2xvc2UgdGhlIHNlc3Npb24gYW5kIGV4cGVjdCBubyBtb3JlIGNhbGxiYWNrcworICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHNlc3Npb24tPmNsb3NlQnlEZXZpY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRldi0+bUN1cnJlbnRTZXNzaW9uID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPbkRpc2Nvbm5lY3RlZCwgZGV2LT5tSGFuZGxlcik7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGRldi0+bUFwcENhbGxiYWNrcy5jb250ZXh0KTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrRGV2aWNlS2V5LCAodm9pZCopIGRldi0+Z2V0V3JhcHBlcigpKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBkZXYtPm1BcHBDYWxsYmFja3Mub25EaXNjb25uZWN0ZWQpOworICAgICAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIlVua25vd24gZXJyb3IgZnJvbSBjYW1lcmEgZGV2aWNlOiAlZCIsIGVycm9yQ29kZSk7CisgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfREVWSUNFOgorICAgICAgICBjYXNlIEVycm9yQ29kZTo6Q0FNRVJBX1NFUlZJQ0U6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZXJyb3JWYWwgPSA6OkVSUk9SX0NBTUVSQV9ERVZJQ0U7CisgICAgICAgICAgICAvLyBXZSBrZWVwIHRoaXMgc3dpdGNoIHNpbmNlIHRoaXMgYmxvY2sgbWlnaHQgYmUgZW5jb3VudGVyZWQgd2l0aAorICAgICAgICAgICAgLy8gbW9yZSB0aGFuIGp1c3QgMiBzdGF0ZXMuIFRoZSBkZWZhdWx0IGZhbGx0aHJvdWdoIGNvdWxkIGhhdmUgdXMKKyAgICAgICAgICAgIC8vIGhhbmRsaW5nIG1vcmUgdW5tYXRjaGVkIGVycm9yIGNhc2VzLgorICAgICAgICAgICAgc3dpdGNoIChlcnJvckNvZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEVycm9yQ29kZTo6Q0FNRVJBX0RFVklDRToKKyAgICAgICAgICAgICAgICAgICAgZGV2LT5zZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVycm9yQ29kZTo6Q0FNRVJBX1NFUlZJQ0U6CisgICAgICAgICAgICAgICAgICAgIGRldi0+c2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRSk7CisgICAgICAgICAgICAgICAgICAgIGVycm9yVmFsID0gOjpFUlJPUl9DQU1FUkFfU0VSVklDRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgZGV2LT5zZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX1VOS05PV04pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPbkVycm9yLCBkZXYtPm1IYW5kbGVyKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgZGV2LT5tQXBwQ2FsbGJhY2tzLmNvbnRleHQpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtEZXZpY2VLZXksICh2b2lkKikgZGV2LT5nZXRXcmFwcGVyKCkpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGRldi0+bUFwcENhbGxiYWNrcy5vbkVycm9yKTsKKyAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoa0Vycm9yQ29kZUtleSwgZXJyb3JWYWwpOworICAgICAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEVycm9yQ29kZTo6Q0FNRVJBX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfUkVTVUxUOgorICAgICAgICBjYXNlIEVycm9yQ29kZTo6Q0FNRVJBX0JVRkZFUjoKKyAgICAgICAgICAgIGRldi0+b25DYXB0dXJlRXJyb3JMb2NrZWQoZXJyb3JDb2RlLCByZXN1bHRFeHRyYXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2FuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4KK0NhbWVyYURldmljZTo6U2VydmljZUNhbGxiYWNrOjpvbkRldmljZUlkbGUoKSB7CisgICAgQUxPR1YoIkNhbWVyYSBpcyBub3cgaWRsZSIpOworICAgIGF1dG8gcmV0ID0gVm9pZCgpOworICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7IC8vIGRldmljZSBoYXMgYmVlbiBjbG9zZWQKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woZGV2LT5tRGV2aWNlTG9jayk7CisgICAgaWYgKGRldi0+aXNDbG9zZWQoKSB8fCBkZXYtPm1SZW1vdGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChkZXYtPm1JZGxlKSB7CisgICAgICAgIC8vIEFscmVhZHkgaW4gaWRsZSBzdGF0ZS4gUG9zc2libHkgb3RoZXIgdGhyZWFkIGRpZCB3YWl0VW50aWxJZGxlCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKGRldi0+bUN1cnJlbnRTZXNzaW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIm9uRGV2aWNlSWRsZSBzZW5kaW5nIHN0YXRlIGNiIik7CisgICAgICAgIGlmIChkZXYtPm1CdXN5U2Vzc2lvbiAhPSBkZXYtPm1DdXJyZW50U2Vzc2lvbikgeworICAgICAgICAgICAgQUxPR0UoIkN1cnJlbnQgc2Vzc2lvbiAhPSBidXN5IHNlc3Npb24iKTsKKyAgICAgICAgICAgIGRldi0+c2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2Vzc2lvblN0YXRlQ2IsIGRldi0+bUhhbmRsZXIpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGRldi0+bUJ1c3lTZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5jb250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgZGV2LT5tQnVzeVNlc3Npb24pOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgZGV2LT5tQnVzeVNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLm9uUmVhZHkpOworICAgICAgICAvLyBNYWtlIHN1cmUgd2UgY2xlYXIgdGhlIHNwIGZpcnN0IHNvIHRoZSBzZXNzaW9uIGRlc3RydWN0b3IgY2FuCisgICAgICAgIC8vIG9ubHkgaGFwcGVuIG9uIGhhbmRsZXIgdGhyZWFkICh3aGVyZSB3ZSBkb24ndCBob2xkIGRldmljZS9zZXNzaW9uIGxvY2spCisgICAgICAgIGRldi0+bUJ1c3lTZXNzaW9uLmNsZWFyKCk7CisgICAgICAgIGRldi0+cG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisgICAgfQorICAgIGRldi0+bUlkbGUgPSB0cnVlOworICAgIGRldi0+bUZsdXNoaW5nID0gZmFsc2U7CisgICAgcmV0dXJuIHJldDsKK30KKworYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPgorQ2FtZXJhRGV2aWNlOjpTZXJ2aWNlQ2FsbGJhY2s6Om9uQ2FwdHVyZVN0YXJ0ZWQoCisgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKKyAgICAgICAgdWludDY0X3QgdGltZXN0YW1wKSB7CisgICAgYXV0byByZXQgPSBWb2lkKCk7CisKKyAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIGlmIChkZXYgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OyAvLyBkZXZpY2UgaGFzIGJlZW4gY2xvc2VkCisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChkZXYtPm1EZXZpY2VMb2NrKTsKKyAgICBpZiAoZGV2LT5pc0Nsb3NlZCgpIHx8IGRldi0+bVJlbW90ZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaW50MzJfdCBzZXF1ZW5jZUlkID0gcmVzdWx0RXh0cmFzLnJlcXVlc3RJZDsKKyAgICBpbnQzMl90IGJ1cnN0SWQgPSByZXN1bHRFeHRyYXMuYnVyc3RJZDsKKworICAgIGF1dG8gaXQgPSBkZXYtPm1TZXF1ZW5jZUNhbGxiYWNrTWFwLmZpbmQoc2VxdWVuY2VJZCk7CisgICAgaWYgKGl0ICE9IGRldi0+bVNlcXVlbmNlQ2FsbGJhY2tNYXAuZW5kKCkpIHsKKyAgICAgICAgQ2FsbGJhY2tIb2xkZXIgY2JoID0gKCppdCkuc2Vjb25kOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3N0YXJ0IG9uU3RhcnQgPSBjYmgubU9uQ2FwdHVyZVN0YXJ0ZWQ7CisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiA9IGNiaC5tU2Vzc2lvbjsKKyAgICAgICAgaWYgKChzaXplX3QpIGJ1cnN0SWQgPj0gY2JoLm1SZXF1ZXN0cy5zaXplKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IHJlcXVlc3QgaW5kZXggJWQgb3V0IG9mIGJvdW5kIChzaXplICV6dSkiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1cnN0SWQsIGNiaC5tUmVxdWVzdHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGRldi0+c2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRSk7CisgICAgICAgIH0KKyAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QgPSBjYmgubVJlcXVlc3RzW2J1cnN0SWRdOworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVN0YXJ0LCBkZXYtPm1IYW5kbGVyKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNvbnRleHQpOworICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG9uU3RhcnQpOworICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZVJlcXVlc3RLZXksIHJlcXVlc3QpOworICAgICAgICBtc2ctPnNldEludDY0KGtUaW1lU3RhbXBLZXksIHRpbWVzdGFtcCk7CisgICAgICAgIGRldi0+cG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2FuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4KK0NhbWVyYURldmljZTo6U2VydmljZUNhbGxiYWNrOjpvblJlc3VsdFJlY2VpdmVkKAorICAgICAgICBjb25zdCBGbXFTaXplT3JNZXRhZGF0YSYgcmVzdWx0TWV0YWRhdGEsCisgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4mIHBoeXNpY2FsUmVzdWx0SW5mb3MpIHsKKyAgICBhdXRvIHJldCA9IFZvaWQoKTsKKworICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7IC8vIGRldmljZSBoYXMgYmVlbiBjbG9zZWQKKyAgICB9CisgICAgaW50MzJfdCBzZXF1ZW5jZUlkID0gcmVzdWx0RXh0cmFzLnJlcXVlc3RJZDsKKyAgICBpbnQ2NF90IGZyYW1lTnVtYmVyID0gcmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyOworICAgIGludDMyX3QgYnVyc3RJZCA9IHJlc3VsdEV4dHJhcy5idXJzdElkOworICAgIGJvb2wgICAgaXNQYXJ0aWFsUmVzdWx0ID0gKHJlc3VsdEV4dHJhcy5wYXJ0aWFsUmVzdWx0Q291bnQgPCBkZXYtPm1QYXJ0aWFsUmVzdWx0Q291bnQpOworCisgICAgaWYgKCFpc1BhcnRpYWxSZXN1bHQpIHsKKyAgICAgICAgQUxPR1YoIlNlcUlkICVkIGZyYW1lICUiIFBSSWQ2NCAiIHJlc3VsdCBhcnJpdmUuIiwgc2VxdWVuY2VJZCwgZnJhbWVOdW1iZXIpOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChkZXYtPm1EZXZpY2VMb2NrKTsKKyAgICBpZiAoZGV2LT5tUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJldDsgLy8gZGV2aWNlIGhhcyBiZWVuIGRpc2Nvbm5lY3RlZAorICAgIH0KKworICAgIGlmIChkZXYtPmlzQ2xvc2VkKCkpIHsKKyAgICAgICAgaWYgKCFpc1BhcnRpYWxSZXN1bHQpIHsKKyAgICAgICAgICAgIGRldi0+bUZyYW1lTnVtYmVyVHJhY2tlci51cGRhdGVUcmFja2VyKGZyYW1lTnVtYmVyLCAvKmlzRXJyb3IqL2ZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICAvLyBlYXJseSByZXR1cm4gdG8gYXZvaWQgY2FsbGJhY2sgc2VudCB0byBjbG9zZWQgZGV2aWNlcworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhQ29weTsKKyAgICBjYW1lcmFfc3RhdHVzX3Qgc3RhdHVzID0gcmVhZE9uZVJlc3VsdE1ldGFkYXRhKHJlc3VsdE1ldGFkYXRhLAorICAgICAgICAgICAgZGV2LT5tQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUuZ2V0KCksICZtZXRhZGF0YUNvcHkpOworICAgIGlmIChzdGF0dXMgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiJXM6IHJlc3VsdCBtZXRhZGF0YSBjb3VsZG4ndCBiZSBjb252ZXJ0ZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIG1ldGFkYXRhQ29weS51cGRhdGUoQU5EUk9JRF9MRU5TX0lORk9fU0hBRElOR19NQVBfU0laRSwgZGV2LT5tU2hhZGluZ01hcFNpemUsIC8qZGF0YV9jb3VudCovMik7CisgICAgbWV0YWRhdGFDb3B5LnVwZGF0ZShBTkRST0lEX1NZTkNfRlJBTUVfTlVNQkVSLCAmZnJhbWVOdW1iZXIsIC8qZGF0YV9jb3VudCovMSk7CisKKyAgICBhdXRvIGl0ID0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5maW5kKHNlcXVlbmNlSWQpOworICAgIGlmIChpdCAhPSBkZXYtPm1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVuZCgpKSB7CisgICAgICAgIENhbGxiYWNrSG9sZGVyIGNiaCA9ICgqaXQpLnNlY29uZDsKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uID0gY2JoLm1TZXNzaW9uOworICAgICAgICBpZiAoKHNpemVfdCkgYnVyc3RJZCA+PSBjYmgubVJlcXVlc3RzLnNpemUoKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogcmVxdWVzdCBpbmRleCAlZCBvdXQgb2YgYm91bmQgKHNpemUgJXp1KSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVyc3RJZCwgY2JoLm1SZXF1ZXN0cy5zaXplKCkpOworICAgICAgICAgICAgZGV2LT5zZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9TRVJWSUNFKTsKKyAgICAgICAgfQorICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCA9IGNiaC5tUmVxdWVzdHNbYnVyc3RJZF07CisgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gcmVzdWx0KG5ldyBBQ2FtZXJhTWV0YWRhdGEoCisgICAgICAgICAgICAgICAgbWV0YWRhdGFDb3B5LnJlbGVhc2UoKSwgQUNhbWVyYU1ldGFkYXRhOjpBQ01fUkVTVUxUKSk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb0xvY2FsPiBsb2NhbFBoeXNpY2FsUmVzdWx0OworICAgICAgICBsb2NhbFBoeXNpY2FsUmVzdWx0LnJlc2l6ZShwaHlzaWNhbFJlc3VsdEluZm9zLnNpemUoKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGh5c2ljYWxSZXN1bHRJbmZvcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgbG9jYWxQaHlzaWNhbFJlc3VsdFtpXS5waHlzaWNhbENhbWVyYUlkID0gcGh5c2ljYWxSZXN1bHRJbmZvc1tpXS5waHlzaWNhbENhbWVyYUlkOworICAgICAgICAgICAgc3RhdHVzID0gcmVhZE9uZVJlc3VsdE1ldGFkYXRhKHBoeXNpY2FsUmVzdWx0SW5mb3NbaV0ucGh5c2ljYWxDYW1lcmFNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgZGV2LT5tQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICZsb2NhbFBoeXNpY2FsUmVzdWx0W2ldLnBoeXNpY2FsTWV0YWRhdGEpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBwaHlzaWNhbCBjYW1lcmEgcmVzdWx0IG1ldGFkYXRhIGNvdWxkbid0IGJlIGNvbnZlcnRlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzcDxBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gcGh5c2ljYWxSZXN1bHQoCisgICAgICAgICAgICAgICAgbmV3IEFDYW1lcmFQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvKGxvY2FsUGh5c2ljYWxSZXN1bHQsIGZyYW1lTnVtYmVyKSk7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBjYmgubUlzTG9naWNhbENhbWVyYUNhbGxiYWNrID8ga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdCA6IGtXaGF0Q2FwdHVyZVJlc3VsdCwKKyAgICAgICAgICAgICAgICBkZXYtPm1IYW5kbGVyKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNvbnRleHQpOworICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXN1bHRLZXksIHJlc3VsdCk7CisgICAgICAgIGlmIChpc1BhcnRpYWxSZXN1bHQpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljYmgubU9uQ2FwdHVyZVByb2dyZXNzZWQpOworICAgICAgICB9IGVsc2UgaWYgKGNiaC5tSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2spIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljYmgubU9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQpOworICAgICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1BoeXNpY2FsQ2FwdHVyZVJlc3VsdEtleSwgcGh5c2ljYWxSZXN1bHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWNiaC5tT25DYXB0dXJlQ29tcGxldGVkKTsKKyAgICAgICAgfQorICAgICAgICBkZXYtPnBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworICAgIH0KKworICAgIGlmICghaXNQYXJ0aWFsUmVzdWx0KSB7CisgICAgICAgIGRldi0+bUZyYW1lTnVtYmVyVHJhY2tlci51cGRhdGVUcmFja2VyKGZyYW1lTnVtYmVyLCAvKmlzRXJyb3IqL2ZhbHNlKTsKKyAgICAgICAgZGV2LT5jaGVja0FuZEZpcmVTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKCk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPgorQ2FtZXJhRGV2aWNlOjpTZXJ2aWNlQ2FsbGJhY2s6Om9uUmVwZWF0aW5nUmVxdWVzdEVycm9yKAorICAgICAgICB1aW50NjRfdCBsYXN0RnJhbWVOdW1iZXIsIGludDMyX3Qgc3RvcHBlZFNlcXVlbmNlSWQpIHsKKyAgICBhdXRvIHJldCA9IFZvaWQoKTsKKworICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7IC8vIGRldmljZSBoYXMgYmVlbiBjbG9zZWQKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woZGV2LT5tRGV2aWNlTG9jayk7CisKKyAgICBpbnQgcmVwZWF0aW5nU2VxdWVuY2VJZCA9IGRldi0+bVJlcGVhdGluZ1NlcXVlbmNlSWQ7CisgICAgaWYgKHN0b3BwZWRTZXF1ZW5jZUlkID09IHJlcGVhdGluZ1NlcXVlbmNlSWQpIHsKKyAgICAgICAgZGV2LT5tUmVwZWF0aW5nU2VxdWVuY2VJZCA9IFJFUVVFU1RfSURfTk9ORTsKKyAgICB9CisKKyAgICBkZXYtPmNoZWNrUmVwZWF0aW5nU2VxdWVuY2VDb21wbGV0ZUxvY2tlZChyZXBlYXRpbmdTZXF1ZW5jZUlkLCBsYXN0RnJhbWVOdW1iZXIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworY2FtZXJhX3N0YXR1c190IENhbWVyYURldmljZTo6U2VydmljZUNhbGxiYWNrOjpyZWFkT25lUmVzdWx0TWV0YWRhdGEoCisgICAgICAgIGNvbnN0IEZtcVNpemVPck1ldGFkYXRhJiBmbXFTaXplT3JNZXRhZGF0YSwgUmVzdWx0TWV0YWRhdGFRdWV1ZSogbWV0YWRhdGFRdWV1ZSwKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEqIG1ldGFkYXRhKSB7CisgICAgaWYgKG1ldGFkYXRhUXVldWUgPT0gbnVsbHB0ciB8fCBtZXRhZGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICBib29sIGNvbnZlcnRlZDsKKyAgICBIQ2FtZXJhTWV0YWRhdGEgaENhbWVyYU1ldGFkYXRhOworICAgIGlmIChmbXFTaXplT3JNZXRhZGF0YS5nZXREaXNjcmltaW5hdG9yKCkgPT0KKyAgICAgICAgICAgIEZtcVNpemVPck1ldGFkYXRhOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmZtcU1ldGFkYXRhU2l6ZSkgeworICAgICAgICBoQ2FtZXJhTWV0YWRhdGEucmVzaXplKGZtcVNpemVPck1ldGFkYXRhLmZtcU1ldGFkYXRhU2l6ZSgpKTsKKyAgICAgICAgYm9vbCByZWFkID0gbWV0YWRhdGFRdWV1ZS0+cmVhZCgKKyAgICAgICAgICAgICAgICBoQ2FtZXJhTWV0YWRhdGEuZGF0YSgpLCBmbXFTaXplT3JNZXRhZGF0YS5mbXFNZXRhZGF0YVNpemUoKSk7CisgICAgICAgIGlmICghcmVhZCkgeworICAgICAgICAgICAgQUxPR0UoIiVzIGNhcHR1cmUgcmVxdWVzdCBzZXR0aW5ncyBjb3VsZCd0IGJlIHJlYWQgZnJvbSBmbXEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiBEbyB3ZSBhY3R1YWxseSBuZWVkIHRvIGNsb25lIGhlcmUgPworICAgICAgICBjb252ZXJ0ZWQgPSB1dGlsczo6Y29udmVydEZyb21IaWRsQ2xvbmVkKGhDYW1lcmFNZXRhZGF0YSwgbWV0YWRhdGEpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnZlcnRlZCA9IHV0aWxzOjpjb252ZXJ0RnJvbUhpZGxDbG9uZWQoZm1xU2l6ZU9yTWV0YWRhdGEubWV0YWRhdGEoKSwgbWV0YWRhdGEpOworICAgIH0KKworICAgIHJldHVybiBjb252ZXJ0ZWQgPyBBQ0FNRVJBX09LIDogQUNBTUVSQV9FUlJPUl9VTktOT1dOOworfQorCit9IC8vIG5hbWVzcGFjZSBhY2FtCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmggYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI5YjA4NAotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaApAQCAtMCwwICsxLDQzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIF9BQ0FNRVJBX0RFVklDRV9ICisjZGVmaW5lIF9BQ0FNRVJBX0RFVklDRV9ICisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvSUNhbWVyYURldmljZVVzZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL0lDYW1lcmFEZXZpY2VDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFNYW5hZ2VyLmg+CisjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmg+CisjaW5jbHVkZSAiQUNhbWVyYU1ldGFkYXRhLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0geworCit1c2luZyBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2sgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OklDYW1lcmFEZXZpY2VDYWxsYmFjazsKK3VzaW5nIElDYW1lcmFEZXZpY2VVc2VyID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpJQ2FtZXJhRGV2aWNlVXNlcjsKK3VzaW5nIENhcHR1cmVSZXN1bHRFeHRyYXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXN1bHRFeHRyYXM7Cit1c2luZyBQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvOwordXNpbmcgUGh5c2ljYWxDYW1lcmFTZXR0aW5ncyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6UGh5c2ljYWxDYW1lcmFTZXR0aW5nczsKK3VzaW5nIFN1Ym1pdEluZm8gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlN1Ym1pdEluZm87Cit1c2luZyBDYXB0dXJlUmVzdWx0RXh0cmFzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYXB0dXJlUmVzdWx0RXh0cmFzOwordXNpbmcgRXJyb3JDb2RlID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpFcnJvckNvZGU7Cit1c2luZyBGbXFTaXplT3JNZXRhZGF0YSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Rm1xU2l6ZU9yTWV0YWRhdGE7Cit1c2luZyBTdHJlYW1Db25maWd1cmF0aW9uTW9kZSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6U3RyZWFtQ29uZmlndXJhdGlvbk1vZGU7Cit1c2luZyBTdGF0dXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlN0YXR1czsKK3VzaW5nIFJlc3VsdE1ldGFkYXRhUXVldWUgPSBoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPjsKK3VzaW5nIFJlcXVlc3RNZXRhZGF0YVF1ZXVlID0gaGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT47Cit1c2luZyBDYW1lcmFTdGF0dXNBbmRJZCA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYVN0YXR1c0FuZElkOworCit1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyB1dGlsczo6bmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlcjsKK3VzaW5nIHV0aWxzOjpDYXB0dXJlUmVxdWVzdDsKK3VzaW5nIHV0aWxzOjpPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlcjsKKworLy8gV3JhcCBBQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgc28gaXQgY2FuIGJlIHJlZi1jb3VudGVkCitzdHJ1Y3QgQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgOiBwdWJsaWMgUmVmQmFzZSwgcHVibGljIEFDYW1lcmFDYXB0dXJlRmFpbHVyZSB7IH07CisKKy8vIFdyYXAgUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyBzbyB0aGF0IGl0IGNhbiBiZSByZWYtY291bnRlZAorc3RydWN0IFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9Mb2NhbCB7CisgICAgc3RkOjpzdHJpbmcgcGh5c2ljYWxDYW1lcmFJZDsKKyAgICBDYW1lcmFNZXRhZGF0YSBwaHlzaWNhbE1ldGFkYXRhOworfTsKKworc3RydWN0IEFDYW1lcmFQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvOiBwdWJsaWMgUmVmQmFzZSB7CisgICAgQUNhbWVyYVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8oY29uc3Qgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb0xvY2FsPiYgaW5mbywKKyAgICAgICAgICAgIGludDY0X3QgZnJhbWVOdW1iZXIpIDoKKyAgICAgICAgbVBoeXNpY2FsUmVzdWx0SW5mbyhpbmZvKSwgbUZyYW1lTnVtYmVyKGZyYW1lTnVtYmVyKSB7fQorCisgICAgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb0xvY2FsPiBtUGh5c2ljYWxSZXN1bHRJbmZvOworICAgIGludDY0X3QgbUZyYW1lTnVtYmVyOworfTsKKworY2xhc3MgQ2FtZXJhRGV2aWNlIGZpbmFsIDogcHVibGljIFJlZkJhc2UgeworICBwdWJsaWM6CisgICAgQ2FtZXJhRGV2aWNlKGNvbnN0IGNoYXIqIGlkLCBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzKiBjYiwKKyAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMsCisgICAgICAgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlKiB3cmFwcGVyKTsKKyAgICB+Q2FtZXJhRGV2aWNlKCk7CisKKyAgICBpbmxpbmUgY29uc3QgY2hhciogZ2V0SWQoKSBjb25zdCB7IHJldHVybiBtQ2FtZXJhSWQuY19zdHIoKTsgfQorCisgICAgY2FtZXJhX3N0YXR1c190IGNyZWF0ZUNhcHR1cmVSZXF1ZXN0KAorICAgICAgICAgICAgQUNhbWVyYURldmljZV9yZXF1ZXN0X3RlbXBsYXRlIHRlbXBsYXRlSWQsCisgICAgICAgICAgICBjb25zdCBBQ2FtZXJhSWRMaXN0KiBwaHlzaWNhbENhbWVyYUlkTGlzdCwKKyAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3QpIGNvbnN0OworCisgICAgY2FtZXJhX3N0YXR1c190IGNyZWF0ZUNhcHR1cmVTZXNzaW9uKAorICAgICAgICAgICAgY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiAgICAgICBvdXRwdXRzLAorICAgICAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiBzZXNzaW9uUGFyYW1ldGVycywKKyAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2tzLAorICAgICAgICAgICAgLypvdXQqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbioqIHNlc3Npb24pOworCisgICAgY2FtZXJhX3N0YXR1c190IGlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqIHNlc3Npb25PdXRwdXRDb250YWluZXIpIGNvbnN0OworCisgICAgLy8gQ2FsbGJhY2tzIGZyb20gY2FtZXJhIHNlcnZpY2UKKyAgICBjbGFzcyBTZXJ2aWNlQ2FsbGJhY2sgOiBwdWJsaWMgSUNhbWVyYURldmljZUNhbGxiYWNrIHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgU2VydmljZUNhbGxiYWNrKENhbWVyYURldmljZSogZGV2aWNlKSA6IG1EZXZpY2UoZGV2aWNlKSB7fQorICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IG9uRGV2aWNlRXJyb3IoRXJyb3JDb2RlIGVycm9yQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgb3ZlcnJpZGU7CisgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gb25EZXZpY2VJZGxlKCkgb3ZlcnJpZGU7CisgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gb25DYXB0dXJlU3RhcnRlZChjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXApIG92ZXJyaWRlOworICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IG9uUmVzdWx0UmVjZWl2ZWQoY29uc3QgRm1xU2l6ZU9yTWV0YWRhdGEmIHJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+JiBwaHlzaWNhbFJlc3VsdEluZm9zKSBvdmVycmlkZTsKKyAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiBvblJlcGVhdGluZ1JlcXVlc3RFcnJvcih1aW50NjRfdCBsYXN0RnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgaW50MzJfdCBzdG9wcGVkU2VxdWVuY2VJZCkgb3ZlcnJpZGU7CisgICAgICBwcml2YXRlOgorICAgICAgICBjYW1lcmFfc3RhdHVzX3QgcmVhZE9uZVJlc3VsdE1ldGFkYXRhKGNvbnN0IEZtcVNpemVPck1ldGFkYXRhJiBmbXFTaXplT3JNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICBSZXN1bHRNZXRhZGF0YVF1ZXVlKiBtZXRhZGF0YVF1ZXVlLCBDYW1lcmFNZXRhZGF0YSogbWV0YWRhdGEpOworICAgICAgICBjb25zdCB3cDxDYW1lcmFEZXZpY2U+IG1EZXZpY2U7CisgICAgfTsKKyAgICBpbmxpbmUgc3A8SUNhbWVyYURldmljZUNhbGxiYWNrPiBnZXRTZXJ2aWNlQ2FsbGJhY2soKSB7CisgICAgICAgIHJldHVybiBtU2VydmljZUNhbGxiYWNrOworICAgIH07CisKKyAgICAvLyBDYW1lcmEgZGV2aWNlIGlzIG9ubHkgZnVuY3Rpb25hbCBhZnRlciByZW1vdGUgYmVpbmcgc2V0CisgICAgdm9pZCBzZXRSZW1vdGVEZXZpY2Uoc3A8SUNhbWVyYURldmljZVVzZXI+IHJlbW90ZSk7CisKKyAgICBib29sIHNldERldmljZU1ldGFkYXRhUXVldWVzKCk7CisgICAgaW5saW5lIEFDYW1lcmFEZXZpY2UqIGdldFdyYXBwZXIoKSBjb25zdCB7IHJldHVybiBtV3JhcHBlcjsgfTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb247CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCkgY29uc3Q7CisKKyAgICAvLyBkZXZpY2UgZ29lcyBpbnRvIGZhdGFsIGVycm9yIHN0YXRlIGFmdGVyIHRoaXMKKyAgICB2b2lkIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKGNhbWVyYV9zdGF0dXNfdCBlcnJvcik7CisKKyAgICB2b2lkIGRpc2Nvbm5lY3RMb2NrZWQoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiYgc2Vzc2lvbik7IC8vIGRpc2Nvbm5lY3QgZnJvbSBjYW1lcmEgc2VydmljZQorCisgICAgY2FtZXJhX3N0YXR1c190IHN0b3BSZXBlYXRpbmdMb2NrZWQoKTsKKworICAgIGNhbWVyYV9zdGF0dXNfdCBmbHVzaExvY2tlZChBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qKTsKKworICAgIGNhbWVyYV9zdGF0dXNfdCB3YWl0VW50aWxJZGxlTG9ja2VkKCk7CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPgorICAgIGNhbWVyYV9zdGF0dXNfdCBjYXB0dXJlTG9ja2VkKHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKKyAgICAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKTsKKworICAgIHRlbXBsYXRlPGNsYXNzIFQ+CisgICAgY2FtZXJhX3N0YXR1c190IHNldFJlcGVhdGluZ1JlcXVlc3RzTG9ja2VkKHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKKyAgICAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKTsKKworICAgIHRlbXBsYXRlPGNsYXNzIFQ+CisgICAgY2FtZXJhX3N0YXR1c190IHN1Ym1pdFJlcXVlc3RzTG9ja2VkKAorICAgICAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAorICAgICAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAorICAgICAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgICAgIC8qb3V0Ki9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkLAorICAgICAgICAgICAgYm9vbCBpc1JlcGVhdGluZyk7CisKKyAgICB2b2lkIGFkZFJlcXVlc3RTZXR0aW5nc01ldGFkYXRhKEFDYXB0dXJlUmVxdWVzdCAqYUNhcHR1cmVSZXF1ZXN0LCBzcDxDYXB0dXJlUmVxdWVzdD4gJnJlcSk7CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgdXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbkxvY2tlZChBQ2FwdHVyZVNlc3Npb25PdXRwdXQgKm91dHB1dCk7CisKKyAgICAvLyBTaW5jZSB0aGlzIHdyaXRlcyB0byBJQ2FtZXJhRGV2aWNlVXNlcidzIGZtcSwgY2xpZW50cyBtdXN0IHRha2UgY2FyZSB0aGF0OgorICAgIC8vICAgYSkgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgc2VyaWFsbHkuCisgICAgLy8gICBiKSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBhY2NvcmRhbmNlIHdpdGggSUNhbWVyYURldmljZVVzZXIuc3VibWl0UmVxdWVzdExpc3QsCisgICAgLy8gICAgICBvdGhlcndpc2UsIHRoZSB3cm9uZyBjYXB0dXJlIHJlcXVlc3QgbWlnaHQgaGF2ZSB0aGUgd3Jvbmcgc2V0dGluZ3MKKyAgICAvLyAgICAgIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAgICBjYW1lcmFfc3RhdHVzX3QgYWxsb2NhdGVDYXB0dXJlUmVxdWVzdExvY2tlZCgKKyAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgc3A8Q2FwdHVyZVJlcXVlc3Q+JiBvdXRSZXEpOworICAgIHZvaWQgYWxsb2NhdGVPbmVDYXB0dXJlUmVxdWVzdE1ldGFkYXRhKAorICAgICAgICAgICAgUGh5c2ljYWxDYW1lcmFTZXR0aW5ncyYgY2FtZXJhU2V0dGluZ3MsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaWQsIGNvbnN0IHNwPEFDYW1lcmFNZXRhZGF0YT4mIG1ldGFkYXRhKTsKKworICAgIHN0YXRpYyBBQ2FwdHVyZVJlcXVlc3QqIGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHNwPENhcHR1cmVSZXF1ZXN0PiYgcmVxLCBjb25zdCBjaGFyKiBkZXZpY2VJZCk7CisgICAgc3RhdGljIHZvaWQgZnJlZUFDYXB0dXJlUmVxdWVzdChBQ2FwdHVyZVJlcXVlc3QqKTsKKworICAgIC8vIG9ubHkgRm9yIHNlc3Npb24gdG8gaG9sZCBkZXZpY2UgbG9jaworICAgIC8vIEFsd2F5cyBncmFiIGRldmljZSBsb2NrIGJlZm9yZSBncmFiYmluZyBzZXNzaW9uIGxvY2sKKyAgICB2b2lkIGxvY2tEZXZpY2VGb3JTZXNzaW9uT3BzKCkgY29uc3QgeyBtRGV2aWNlTG9jay5sb2NrKCk7IH07CisgICAgdm9pZCB1bmxvY2tEZXZpY2UoKSBjb25zdCB7IG1EZXZpY2VMb2NrLnVubG9jaygpOyB9OworCisgICAgLy8gRm9yIGNhcHR1cmUgc2Vzc2lvbiB0byBub3RpZnkgaXRzIGVuZCBvZiBsaWZlCisgICAgdm9pZCBub3RpZnlTZXNzaW9uRW5kT2ZMaWZlTG9ja2VkKEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbik7CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtc0xvY2tlZChjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqIG91dHB1dHMsCisgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMpOworCisgICAgLy8gSW5wdXQgbWVzc2FnZSB3aWxsIGJlIHBvc3RlZCBhbmQgY2xlYXJlZCBhZnRlciB0aGlzIHJldHVybnMKKyAgICB2b2lkIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChzcDxBTWVzc2FnZT4mIG1zZyk7CisKKyAgICBtdXRhYmxlIE11dGV4IG1EZXZpY2VMb2NrOworICAgIGNvbnN0IGhpZGxfc3RyaW5nIG1DYW1lcmFJZDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbWVyYSBJRAorICAgIGNvbnN0IEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MgbUFwcENhbGxiYWNrczsgLy8gQ2FsbGJhY2sgdG8gYXBwCisgICAgY29uc3Qgc3A8QUNhbWVyYU1ldGFkYXRhPiBtQ2hhcnM7ICAgIC8vIENhbWVyYSBjaGFyYWN0ZXJpc3RpY3MKKyAgICBjb25zdCBzcDxTZXJ2aWNlQ2FsbGJhY2s+IG1TZXJ2aWNlQ2FsbGJhY2s7CisgICAgQUNhbWVyYURldmljZSogbVdyYXBwZXI7CisKKyAgICAvLyBzdHJlYW0gaWQgLT4gcGFpciBvZiAoQUNhbWVyYVdpbmRvd1R5cGUqIGZyb20gYXBwbGljYXRpb24sIE91dHB1dENvbmZpZ3VyYXRpb24gdXNlZCBmb3IKKyAgICAvLyBjYW1lcmEgc2VydmljZSkKKyAgICBzdGQ6Om1hcDxpbnQsIHN0ZDo6cGFpcjxuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyLCBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlcj4+IG1Db25maWd1cmVkT3V0cHV0czsKKworICAgIC8vIFRPRE86IG1heWJlIGEgYm9vbCB3aWxsIHN1ZmZpY2UgZm9yIHN5bmNocm9ub3VzIGltcGxlbWVudGF0aW9uPworICAgIHN0ZDo6YXRvbWljX2Jvb2wgbUNsb3Npbmc7CisgICAgaW5saW5lIGJvb2wgaXNDbG9zZWQoKSB7IHJldHVybiBtQ2xvc2luZzsgfQorCisgICAgYm9vbCBtSW5FcnJvciA9IGZhbHNlOworICAgIGNhbWVyYV9zdGF0dXNfdCBtRXJyb3IgPSBBQ0FNRVJBX09LOworICAgIHZvaWQgb25DYXB0dXJlRXJyb3JMb2NrZWQoCisgICAgICAgICAgICBFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKTsKKworICAgIGJvb2wgbUlkbGUgPSB0cnVlOworICAgIC8vIFRoaXMgd2lsbCBhdm9pZCBhIGJ1c3kgc2Vzc2lvbiBiZWluZyBkZWxldGVkIGJlZm9yZSBpdCdzIGJhY2sgdG8gaWRsZSBzdGF0ZQorICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gbUJ1c3lTZXNzaW9uOworCisgICAgc3A8SUNhbWVyYURldmljZVVzZXI+IG1SZW1vdGU7CisKKyAgICAvLyBMb29wZXIgdGhyZWFkIHRvIGhhbmRsZSBjYWxsYmFjayB0byBhcHAKKyAgICBzcDxBTG9vcGVyPiBtQ2JMb29wZXI7CisgICAgLy8gZGVmaW5pdGlvbiBvZiBoYW5kbGVyIGFuZCBtZXNzYWdlCisgICAgZW51bSB7CisgICAgICAgIC8vIERldmljZSBzdGF0ZSBjYWxsYmFja3MKKyAgICAgICAga1doYXRPbkRpc2Nvbm5lY3RlZCwgICAvLyBvbkRpc2Nvbm5lY3RlZAorICAgICAgICBrV2hhdE9uRXJyb3IsICAgICAgICAgIC8vIG9uRXJyb3IKKyAgICAgICAgLy8gU2Vzc2lvbiBzdGF0ZSBjYWxsYmFja3MKKyAgICAgICAga1doYXRTZXNzaW9uU3RhdGVDYiwgICAvLyBvblJlYWR5LCBvbkFjdGl2ZQorICAgICAgICAvLyBDYXB0dXJlIGNhbGxiYWNrcworICAgICAgICBrV2hhdENhcHR1cmVTdGFydCwgICAgIC8vIG9uQ2FwdHVyZVN0YXJ0ZWQKKyAgICAgICAga1doYXRDYXB0dXJlUmVzdWx0LCAgICAvLyBvbkNhcHR1cmVQcm9ncmVzc2VkLCBvbkNhcHR1cmVDb21wbGV0ZWQKKyAgICAgICAga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdCwgLy8gb25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZAorICAgICAgICBrV2hhdENhcHR1cmVGYWlsLCAgICAgIC8vIG9uQ2FwdHVyZUZhaWxlZAorICAgICAgICBrV2hhdExvZ2ljYWxDYXB0dXJlRmFpbCwgLy8gb25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUZhaWxlZAorICAgICAgICBrV2hhdENhcHR1cmVTZXFFbmQsICAgIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkCisgICAgICAgIGtXaGF0Q2FwdHVyZVNlcUFib3J0LCAgLy8gb25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkCisgICAgICAgIGtXaGF0Q2FwdHVyZUJ1ZmZlckxvc3QsLy8gb25DYXB0dXJlQnVmZmVyTG9zdAorICAgICAgICAvLyBJbnRlcm5hbCBjbGVhbnVwCisgICAgICAgIGtXaGF0Q2xlYW5VcFNlc3Npb25zICAgLy8gQ2xlYW51cCBjYWNoZWQgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPgorICAgIH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDb250ZXh0S2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrRGV2aWNlS2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrRXJyb3JDb2RlS2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ2FsbGJhY2tGcEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga1Nlc3Npb25TcEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0NhcHR1cmVSZXF1ZXN0S2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrVGltZVN0YW1wS2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ2FwdHVyZVJlc3VsdEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga1BoeXNpY2FsQ2FwdHVyZVJlc3VsdEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0NhcHR1cmVGYWlsdXJlS2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrU2VxdWVuY2VJZEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0ZyYW1lTnVtYmVyS2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQW53S2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrRmFpbGluZ1BoeXNpY2FsQ2FtZXJhSWQ7CisKKyAgICBjbGFzcyBDYWxsYmFja0hhbmRsZXIgOiBwdWJsaWMgQUhhbmRsZXIgeworICAgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBDYWxsYmFja0hhbmRsZXIoY29uc3QgY2hhciAqaWQpOworICAgICAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzdHJpbmcgbUlkOworICAgICAgICAvLyBUaGlzIGhhbmRsZXIgd2lsbCBjYWNoZSBhbGwgY2FwdHVyZSBzZXNzaW9uIHNwIHVudGlsIGtXaGF0Q2xlYW5VcFNlc3Npb25zCisgICAgICAgIC8vIGlzIHByb2Nlc3NlZC4gVGhpcyBpcyB1c2VkIHRvIGd1YXJhbnRlZSB0aGUgbGFzdCBzZXNzaW9uIHJlZmVyZW5jZSBpcyBhbHdheXMKKyAgICAgICAgLy8gYmVpbmcgcmVtb3ZlZCBpbiBjYWxsYmFjayB0aHJlYWQgd2l0aG91dCBob2xkaW5nIGNhbWVyYSBkZXZpY2UgbG9jaworICAgICAgICBWZWN0b3I8c3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPj4gbUNhY2hlZFNlc3Npb25zOworICAgIH07CisgICAgc3A8Q2FsbGJhY2tIYW5kbGVyPiBtSGFuZGxlcjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIENhcHR1cmUgc2Vzc2lvbiByZWxhdGVkIG1lbWJlcnMgKgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvLyBUaGUgY3VycmVudCBhY3RpdmUgc2Vzc2lvbgorICAgIHdwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gbUN1cnJlbnRTZXNzaW9uOworICAgIGJvb2wgbUZsdXNoaW5nID0gZmFsc2U7CisKKyAgICBpbnQgbU5leHRTZXNzaW9uSWQgPSAwOworICAgIC8vIFRPRE86IG1pZ2h0IG5lZWQgYW5vdGhlciBsb29wZXIvaGFuZGxlciB0byBoYW5kbGUgY2FsbGJhY2tzIGZyb20gc2VydmljZQorCisgICAgc3RhdGljIGNvbnN0IGludCBSRVFVRVNUX0lEX05PTkUgPSAtMTsKKyAgICBpbnQgbVJlcGVhdGluZ1NlcXVlbmNlSWQgPSBSRVFVRVNUX0lEX05PTkU7CisKKyAgICAvLyBzZXF1ZW5jZSBpZCAtPiBsYXN0IGZyYW1lIG51bWJlciBtYXAKKyAgICBzdGQ6Om1hcDxpbnQzMl90LCBpbnQ2NF90PiBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXA7CisKKyAgICBzdHJ1Y3QgQ2FsbGJhY2tIb2xkZXIgeworICAgICAgICBDYWxsYmFja0hvbGRlcihzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4+JiAgcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMpOworICAgICAgICBDYWxsYmFja0hvbGRlcihzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4+JiAgcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MqIGxjYnMpOworCisgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPgorICAgICAgICB2b2lkIGluaXRDYXB0dXJlQ2FsbGJhY2tzKFQqIGNicykgeworICAgICAgICAgICAgbUNvbnRleHQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZVN0YXJ0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZVByb2dyZXNzZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZUNvbXBsZXRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUZhaWxlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlRmFpbGVkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVCdWZmZXJMb3N0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGlmIChjYnMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG1Db250ZXh0ID0gY2JzLT5jb250ZXh0OworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVTdGFydGVkID0gY2JzLT5vbkNhcHR1cmVTdGFydGVkOworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVQcm9ncmVzc2VkID0gY2JzLT5vbkNhcHR1cmVQcm9ncmVzc2VkOworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZCA9IGNicy0+b25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQ7CisgICAgICAgICAgICAgICAgbU9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZCA9IGNicy0+b25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkOworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVCdWZmZXJMb3N0ID0gY2JzLT5vbkNhcHR1cmVCdWZmZXJMb3N0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgIG1TZXNzaW9uOworICAgICAgICBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+PiAgbVJlcXVlc3RzOworICAgICAgICBjb25zdCBib29sICAgICAgICAgICAgICAgICAgbUlzUmVwZWF0aW5nOworICAgICAgICBjb25zdCBib29sICAgICAgICAgICAgICAgICAgbUlzTG9naWNhbENhbWVyYUNhbGxiYWNrOworCisgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydCBtT25DYXB0dXJlU3RhcnRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgbU9uQ2FwdHVyZVByb2dyZXNzZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG1PbkNhcHR1cmVDb21wbGV0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgbU9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgbU9uTG9naWNhbENhbWVyYUNhcHR1cmVGYWlsZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfZmFpbGVkIG1PbkNhcHR1cmVGYWlsZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc2VxdWVuY2VFbmQgbU9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3NlcXVlbmNlQWJvcnQgbU9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19idWZmZXJMb3N0IG1PbkNhcHR1cmVCdWZmZXJMb3N0OworICAgIH07CisgICAgLy8gc2VxdWVuY2UgaWQgLT4gY2FsbGJhY2tzIG1hcAorICAgIHN0ZDo6bWFwPGludCwgQ2FsbGJhY2tIb2xkZXI+IG1TZXF1ZW5jZUNhbGxiYWNrTWFwOworCisgICAgc3RhdGljIGNvbnN0IGludDY0X3QgTk9fRlJBTUVTX0NBUFRVUkVEID0gLTE7CisgICAgY2xhc3MgRnJhbWVOdW1iZXJUcmFja2VyIHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgLy8gVE9ETzogQ2FsbGVkIGluIG9uUmVzdWx0UmVjZWl2ZWQgYW5kIG9uQ2FwdHVyZUVycm9yTG9ja2VkCisgICAgICAgIHZvaWQgdXBkYXRlVHJhY2tlcihpbnQ2NF90IGZyYW1lTnVtYmVyLCBib29sIGlzRXJyb3IpOworICAgICAgICBpbmxpbmUgaW50NjRfdCBnZXRDb21wbGV0ZWRGcmFtZU51bWJlcigpIHsgcmV0dXJuIG1Db21wbGV0ZWRGcmFtZU51bWJlcjsgfQorICAgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCB1cGRhdGUoKTsKKyAgICAgICAgdm9pZCB1cGRhdGVDb21wbGV0ZWRGcmFtZU51bWJlcihpbnQ2NF90IGZyYW1lTnVtYmVyKTsKKworICAgICAgICBpbnQ2NF90IG1Db21wbGV0ZWRGcmFtZU51bWJlciA9IE5PX0ZSQU1FU19DQVBUVVJFRDsKKyAgICAgICAgTGlzdDxpbnQ2NF90PiBtU2tpcHBlZEZyYW1lTnVtYmVyczsKKyAgICAgICAgc3RkOjpzZXQ8aW50NjRfdD4gbUZ1dHVyZUVycm9yU2V0OworICAgIH07CisgICAgRnJhbWVOdW1iZXJUcmFja2VyIG1GcmFtZU51bWJlclRyYWNrZXI7CisKKyAgICB2b2lkIGNoZWNrUmVwZWF0aW5nU2VxdWVuY2VDb21wbGV0ZUxvY2tlZChjb25zdCBpbnQgc2VxdWVuY2VJZCwgY29uc3QgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIpOworICAgIHZvaWQgY2hlY2tBbmRGaXJlU2VxdWVuY2VDb21wbGV0ZUxvY2tlZCgpOworCisgICAgLy8gTWlzYyB2YXJpYWJsZXMKKyAgICBpbnQzMl90IG1TaGFkaW5nTWFwU2l6ZVsyXTsgICAvLyBjb25zdCBhZnRlciBjb25zdHJ1Y3RvcgorICAgIGludDMyX3QgbVBhcnRpYWxSZXN1bHRDb3VudDsgIC8vIGNvbnN0IGFmdGVyIGNvbnN0cnVjdG9yCisgICAgc3RkOjpzaGFyZWRfcHRyPFJlc3VsdE1ldGFkYXRhUXVldWU+IG1DYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUgPSBudWxscHRyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXN1bHRNZXRhZGF0YVF1ZXVlPiBtQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUgPSBudWxscHRyOworfTsKKworfSAvLyBuYW1lc3BhY2UgYWNhbTsKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQ7CisKKy8qKgorICogQUNhbWVyYURldmljZSBvcGFxdWUgc3RydWN0IGRlZmluaXRpb24KKyAqIExlYXZlIG91dHNpZGUgb2YgYW5kcm9pZCBuYW1lc3BhY2UgYmVjYXVzZSBpdCdzIE5ESyBzdHJ1Y3QKKyAqLworc3RydWN0IEFDYW1lcmFEZXZpY2UgeworICAgIEFDYW1lcmFEZXZpY2UoY29uc3QgY2hhciogaWQsIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNiLAorICAgICAgICAgICAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBjaGFycykgOgorICAgICAgICAgICAgbURldmljZShuZXcgYW5kcm9pZDo6YWNhbTo6Q2FtZXJhRGV2aWNlKGlkLCBjYiwgc3RkOjptb3ZlKGNoYXJzKSwgdGhpcykpIHt9CisKKyAgICB+QUNhbWVyYURldmljZSgpIHt9OworCisgICAgLyoqKioqKioqKioqKioqKioqKioKKyAgICAgKiBOREsgcHVibGljIEFQSXMgKgorICAgICAqKioqKioqKioqKioqKioqKioqLworICAgIGlubGluZSBjb25zdCBjaGFyKiBnZXRJZCgpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2UtPmdldElkKCk7IH0KKworICAgIGNhbWVyYV9zdGF0dXNfdCBjcmVhdGVDYXB0dXJlUmVxdWVzdCgKKyAgICAgICAgICAgIEFDYW1lcmFEZXZpY2VfcmVxdWVzdF90ZW1wbGF0ZSB0ZW1wbGF0ZUlkLAorICAgICAgICAgICAgY29uc3QgQUNhbWVyYUlkTGlzdCogcGh5c2ljYWxDYW1lcmFJZExpc3QsCisgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0KSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRGV2aWNlLT5jcmVhdGVDYXB0dXJlUmVxdWVzdCh0ZW1wbGF0ZUlkLCBwaHlzaWNhbENhbWVyYUlkTGlzdCwgcmVxdWVzdCk7CisgICAgfQorCisgICAgY2FtZXJhX3N0YXR1c190IGNyZWF0ZUNhcHR1cmVTZXNzaW9uKAorICAgICAgICAgICAgY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiAgICAgICBvdXRwdXRzLAorICAgICAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiBzZXNzaW9uUGFyYW1ldGVycywKKyAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2tzLAorICAgICAgICAgICAgLypvdXQqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbioqIHNlc3Npb24pIHsKKyAgICAgICAgcmV0dXJuIG1EZXZpY2UtPmNyZWF0ZUNhcHR1cmVTZXNzaW9uKG91dHB1dHMsIHNlc3Npb25QYXJhbWV0ZXJzLCBjYWxsYmFja3MsIHNlc3Npb24pOworICAgIH0KKworICAgIGNhbWVyYV9zdGF0dXNfdCBpc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAorICAgICAgICAgICAgY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBzZXNzaW9uT3V0cHV0Q29udGFpbmVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRGV2aWNlLT5pc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKHNlc3Npb25PdXRwdXRDb250YWluZXIpOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIERldmljZSBpbnRlcmFsIEFQSXMgKgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpbmxpbmUgYW5kcm9pZDo6c3A8YW5kcm9pZDo6YWNhbTo6SUNhbWVyYURldmljZUNhbGxiYWNrPiBnZXRTZXJ2aWNlQ2FsbGJhY2soKSB7CisgICAgICAgIHJldHVybiBtRGV2aWNlLT5nZXRTZXJ2aWNlQ2FsbGJhY2soKTsKKyAgICB9OworCisgICAgLy8gQ2FtZXJhIGRldmljZSBpcyBvbmx5IGZ1bmN0aW9uYWwgYWZ0ZXIgcmVtb3RlIGJlaW5nIHNldAorICAgIGlubGluZSB2b2lkIHNldFJlbW90ZURldmljZShhbmRyb2lkOjpzcDxhbmRyb2lkOjphY2FtOjpJQ2FtZXJhRGV2aWNlVXNlcj4gcmVtb3RlKSB7CisgICAgICAgIG1EZXZpY2UtPnNldFJlbW90ZURldmljZShyZW1vdGUpOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBzZXREZXZpY2VNZXRhZGF0YVF1ZXVlcygpIHsKKyAgICAgICAgcmV0dXJuIG1EZXZpY2UtPnNldERldmljZU1ldGFkYXRhUXVldWVzKCk7CisgICAgfQorICBwcml2YXRlOgorICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OmFjYW06OkNhbWVyYURldmljZT4gbURldmljZTsKK307CisKKyNlbmRpZiAvLyBfQUNBTUVSQV9ERVZJQ0VfSApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZVZlbmRvci5pbmMgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlVmVuZG9yLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmQ1YTUyCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZVZlbmRvci5pbmMKQEAgLTAsMCArMSwxNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjAvSUNhbWVyYVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8Q2FtZXJhTWV0YWRhdGEuaD4KKworI2luY2x1ZGUgIm5ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmgiCisjaW5jbHVkZSAiQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmgiCisjaW5jbHVkZSAiQUNhbWVyYU1ldGFkYXRhLmgiCisjaW5jbHVkZSAiQUNhcHR1cmVSZXF1ZXN0LmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKKwordGVtcGxhdGU8Y2xhc3MgVD4KK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjpjYXB0dXJlTG9ja2VkKAorICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCisgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKKyAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgeworICAgIHJldHVybiBzdWJtaXRSZXF1ZXN0c0xvY2tlZCgKKyAgICAgICAgICAgIHNlc3Npb24sIGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCwgLyppc1JlcGVhdGluZyovZmFsc2UpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBUPgorY2FtZXJhX3N0YXR1c190CitDYW1lcmFEZXZpY2U6OnNldFJlcGVhdGluZ1JlcXVlc3RzTG9ja2VkKAorICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCisgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKKyAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgeworICAgIHJldHVybiBzdWJtaXRSZXF1ZXN0c0xvY2tlZCgKKyAgICAgICAgICAgIHNlc3Npb24sIGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCwgLyppc1JlcGVhdGluZyovdHJ1ZSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitjYW1lcmFfc3RhdHVzX3QgQ2FtZXJhRGV2aWNlOjpzdWJtaXRSZXF1ZXN0c0xvY2tlZCgKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3V0Ki9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkLAorICAgICAgICBib29sIGlzUmVwZWF0aW5nKQoreworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzdWJtaXQgY2FwdHVyZSByZXF1ZXN0IGZhaWxlZCEgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvLyBGb3JtIHR3byB2ZWN0b3JzIG9mIGNhcHR1cmUgcmVxdWVzdCwgb25lIGZvciBpbnRlcm5hbCB0cmFja2luZworICAgIHN0ZDo6dmVjdG9yPGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3RMaXN0OworICAgIFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4+IHJlcXVlc3RzVjsKKyAgICByZXF1ZXN0c1Yuc2V0Q2FwYWNpdHkobnVtUmVxdWVzdHMpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUmVxdWVzdHM7IGkrKykgeworICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxOworICAgICAgICByZXQgPSBhbGxvY2F0ZUNhcHR1cmVSZXF1ZXN0TG9ja2VkKHJlcXVlc3RzW2ldLCByZXEpOworICAgICAgICAvLyBXZSBuZWVkIHRvIGNhbGwgdGhpcyBtZXRob2Qgc2luY2UgYWZ0ZXIgc3VibWl0UmVxdWVzdExpc3QgaXMgY2FsbGVkLAorICAgICAgICAvLyB0aGUgcmVxdWVzdCBtZXRhZGF0YSBxdWV1ZSBtaWdodCBoYXZlIHJlbW92ZWQgdGhlIGNhcHR1cmUgcmVxdWVzdAorICAgICAgICAvLyBtZXRhZGF0YS4gVGhlcmVmb3JlIHdlIHNpbXBseSBhZGQgdGhlIG1ldGFkYXRhIHRvIGl0cyB3cmFwcGVyIGNsYXNzLAorICAgICAgICAvLyBzbyB0aGF0IGl0IGNhbiBiZSByZXRyaWV2ZWQgbGF0ZXIuCisgICAgICAgIGFkZFJlcXVlc3RTZXR0aW5nc01ldGFkYXRhKHJlcXVlc3RzW2ldLCByZXEpOworICAgICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb252ZXJ0IGNhcHR1cmUgcmVxdWVzdCB0byBpbnRlcm5hbCBmb3JtYXQgZmFpbHVyZSEgcmV0ICVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlcS0+bUNhcHR1cmVSZXF1ZXN0LnN0cmVhbUFuZFdpbmRvd0lkcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIkNhcHR1cmUgcmVxdWVzdCB3aXRob3V0IG91dHB1dCB0YXJnZXQgY2Fubm90IGJlIHN1Ym1pdHRlZCEiKTsKKyAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICB9CisgICAgICAgIHJlcXVlc3RMaXN0LnB1c2hfYmFjayh1dGlsczo6Y29udmVydFRvSGlkbChyZXEuZ2V0KCkpKTsKKyAgICAgICAgcmVxdWVzdHNWLnB1c2hfYmFjayhyZXEpOworICAgIH0KKyAgICBpZiAoaXNSZXBlYXRpbmcpIHsKKyAgICAgICAgcmV0ID0gc3RvcFJlcGVhdGluZ0xvY2tlZCgpOworICAgICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgJXMgc3RvcCByZXBlYXRpbmcgZmFpbGVkISByZXQgJWQiLCBnZXRJZCgpLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgIH0KKworICAgIFN1Ym1pdEluZm8gaW5mbzsKKyAgICBTdGF0dXMgc3RhdHVzOworICAgIGF1dG8gcmVtb3RlUmV0ID0gbVJlbW90ZS0+c3VibWl0UmVxdWVzdExpc3QocmVxdWVzdExpc3QsIGlzUmVwZWF0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZpbmZvXShhdXRvIHMsIGF1dG8gJnN1Ym1pdEluZm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8gPSBzdWJtaXRJbmZvOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgaWYgKCFyZW1vdGVSZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgZm9yIHN1Ym1pdFJlcXVlc3RMaXN0IGNhbGw6ICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICByZW1vdGVSZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICB9CisgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiB1dGlsczo6Y29udmVydEZyb21IaWRsKHN0YXR1cyk7CisgICAgfQorICAgIGludDMyX3Qgc2VxdWVuY2VJZCA9IGluZm8ucmVxdWVzdElkOworICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gaW5mby5sYXN0RnJhbWVOdW1iZXI7CisgICAgaWYgKHNlcXVlbmNlSWQgPCAwKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmEgJXMgc3VibWl0IHJlcXVlc3QgcmVtb3RlIGZhaWx1cmU6IHJldCAlZCIsIGdldElkKCksIHNlcXVlbmNlSWQpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9VTktOT1dOOworICAgIH0KKworICAgIENhbGxiYWNrSG9sZGVyIGNiSG9sZGVyKHNlc3Npb24sIHJlcXVlc3RzViwgaXNSZXBlYXRpbmcsIGNicyk7CisgICAgbVNlcXVlbmNlQ2FsbGJhY2tNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHNlcXVlbmNlSWQsIGNiSG9sZGVyKSk7CisgICAgaWYgKGlzUmVwZWF0aW5nKSB7CisgICAgICAgIC8vIHN0b3BSZXBlYXRpbmcgYWJvdmUgc2hvdWxkIGhhdmUgY2xlYW51cCByZXBlYXRpbmcgc2VxdWVuY2UgaWQKKyAgICAgICAgaWYgKG1SZXBlYXRpbmdTZXF1ZW5jZUlkICE9IFJFUVVFU1RfSURfTk9ORSkgeworICAgICAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFKTsKKyAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0U7CisgICAgICAgIH0KKyAgICAgICAgbVJlcGVhdGluZ1NlcXVlbmNlSWQgPSBzZXF1ZW5jZUlkOworICAgIH0gZWxzZSB7CisgICAgICAgIG1TZXF1ZW5jZUxhc3RGcmFtZU51bWJlck1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoc2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyKSk7CisgICAgfQorCisgICAgaWYgKG1JZGxlKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXNzaW9uU3RhdGVDYiwgbUhhbmRsZXIpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOworICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLm9uQWN0aXZlKTsKKyAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisgICAgfQorICAgIG1JZGxlID0gZmFsc2U7CisgICAgbUJ1c3lTZXNzaW9uID0gc2Vzc2lvbjsKKworICAgIGlmIChjYXB0dXJlU2VxdWVuY2VJZCkgeworICAgICAgICAqY2FwdHVyZVNlcXVlbmNlSWQgPSBzZXF1ZW5jZUlkOworICAgIH0KKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworfSAvLyBuYW1lc3BhY2UgYWNhbQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYzg4N2EKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAKQEAgLTAsMCArMSw2MTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFDYW1lcmFNYW5hZ2VyVmVuZG9yIgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgIm5ka192ZW5kb3IvaW1wbC9BQ2FtZXJhTWFuYWdlci5oIgorI2luY2x1ZGUgIkFDYW1lcmFNZXRhZGF0YS5oIgorI2luY2x1ZGUgIm5ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmgiCisjaW5jbHVkZSAidXRpbHMuaCIKKyNpbmNsdWRlIDxDYW1lcmFNZXRhZGF0YS5oPgorI2luY2x1ZGUgPGNhbWVyYV9tZXRhZGF0YV9oaWRkZW4uaD4KKworI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxWZW5kb3JUYWdEZXNjcmlwdG9yLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjphY2FtOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CisKK3VzaW5nIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYVN0YXR1c0FuZElkOwordXNpbmcgZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpQcm92aWRlcklkQW5kVmVuZG9yVGFnU2VjdGlvbnM7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OmhlbHBlcjo6VmVuZG9yVGFnRGVzY3JpcHRvcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6aGVscGVyOjpWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGU7CisKKy8vIFN0YXRpYyBtZW1iZXIgZGVmaW5pdGlvbnMKK2NvbnN0IGNoYXIqIENhbWVyYU1hbmFnZXJHbG9iYWw6OmtDYW1lcmFJZEtleSAgID0gIkNhbWVyYUlkIjsKK2NvbnN0IGNoYXIqIENhbWVyYU1hbmFnZXJHbG9iYWw6OmtDYWxsYmFja0ZwS2V5ID0gIkNhbGxiYWNrRnAiOworY29uc3QgY2hhciogQ2FtZXJhTWFuYWdlckdsb2JhbDo6a0NvbnRleHRLZXkgICAgPSAiQ2FsbGJhY2tDb250ZXh0IjsKK011dGV4ICAgICAgICAgICAgICAgIENhbWVyYU1hbmFnZXJHbG9iYWw6OnNMb2NrOworQ2FtZXJhTWFuYWdlckdsb2JhbCogQ2FtZXJhTWFuYWdlckdsb2JhbDo6c0luc3RhbmNlID0gbnVsbHB0cjsKKworLyoqCisgKiBUaGUgdmVuZG9yIHRhZyBkZXNjcmlwdG9yIGNsYXNzIHRoYXQgdGFrZXMgSElETCB2ZW5kb3IgdGFnIGluZm9ybWF0aW9uIGFzCisgKiBpbnB1dC4gTm90IHBhcnQgb2YgdmVuZG9yIGF2YWlsYWJsZSBWZW5kb3JUYWdEZXNjcmlwdG9yIGNsYXNzIGJlY2F1c2UgdGhhdCBjbGFzcyBpcyB1c2VkIGJ5CisgKiBkZWZhdWx0IEhBTCBpbXBsZW1lbnRhdGlvbiBjb2RlIGFzIHdlbGwuCisgKi8KK2NsYXNzIEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yIDogcHVibGljIFZlbmRvclRhZ0Rlc2NyaXB0b3IgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZSBhIFZlbmRvclRhZ0Rlc2NyaXB0b3Igb2JqZWN0IGZyb20gdGhlIEhJREwgVmVuZG9yVGFnU2VjdGlvbgorICAgICAqIHZlY3Rvci4KKyAgICAgKgorICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAqLworICAgIHN0YXRpYyBzdGF0dXNfdCBjcmVhdGVEZXNjcmlwdG9yRnJvbUhpZGwoY29uc3QgaGlkbF92ZWM8VmVuZG9yVGFnU2VjdGlvbj4mIHZ0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8gc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gKmRlc2NyaXB0b3IpOworfTsKKworc3RhdHVzX3QgSGlkbFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNyZWF0ZURlc2NyaXB0b3JGcm9tSGlkbChjb25zdCBoaWRsX3ZlYzxWZW5kb3JUYWdTZWN0aW9uPiAmdnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiAqZGVzY3JpcHRvcikgeworICAgIGludCB0YWdDb3VudCA9IDA7CisKKyAgICBmb3IgKHNpemVfdCBzID0gMDsgcyA8IHZ0cy5zaXplKCk7IHMrKykgeworICAgICAgICB0YWdDb3VudCArPSB2dHNbc10udGFncy5zaXplKCk7CisgICAgfQorCisgICAgaWYgKHRhZ0NvdW50IDwgMCB8fCB0YWdDb3VudCA+IElOVDMyX01BWCkgeworICAgICAgICBBTE9HRSgiJXM6IHRhZyBjb3VudCAlZCBmcm9tIHZlbmRvciB0YWcgc2VjdGlvbnMgaXMgaW52YWxpZC4iLCBfX0ZVTkNUSU9OX18sIHRhZ0NvdW50KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBWZWN0b3I8dWludDMyX3Q+IHRhZ0FycmF5OworICAgIExPR19BTFdBWVNfRkFUQUxfSUYodGFnQXJyYXkucmVzaXplKHRhZ0NvdW50KSAhPSB0YWdDb3VudCwKKyAgICAgICAgICAgICIlczogdG9vIG1hbnkgKCV1KSB2ZW5kb3IgdGFncyBkZWZpbmVkLiIsIF9fRlVOQ1RJT05fXywgdGFnQ291bnQpOworCisgICAgc3A8SGlkbFZlbmRvclRhZ0Rlc2NyaXB0b3I+IGRlc2MgPSBuZXcgSGlkbFZlbmRvclRhZ0Rlc2NyaXB0b3IoKTsKKyAgICBkZXNjLT5tVGFnQ291bnQgPSB0YWdDb3VudDsKKworICAgIEtleWVkVmVjdG9yPHVpbnQzMl90LCBTdHJpbmc4PiB0YWdUb1NlY3Rpb25NYXA7CisKKyAgICBpbnQgaWR4ID0gMDsKKyAgICBmb3IgKHNpemVfdCBzID0gMDsgcyA8IHZ0cy5zaXplKCk7IHMrKykgeworICAgICAgICBjb25zdCBWZW5kb3JUYWdTZWN0aW9uJiBzZWN0aW9uID0gdnRzW3NdOworICAgICAgICBjb25zdCBjaGFyICpzZWN0aW9uTmFtZSA9IHNlY3Rpb24uc2VjdGlvbk5hbWUuY19zdHIoKTsKKyAgICAgICAgaWYgKHNlY3Rpb25OYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogbm8gc2VjdGlvbiBuYW1lIGRlZmluZWQgZm9yIHZlbmRvciB0YWcgc2VjdGlvbiAlenUuIiwgX19GVU5DVElPTl9fLCBzKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nOCBzZWN0aW9uU3RyaW5nKHNlY3Rpb25OYW1lKTsKKyAgICAgICAgZGVzYy0+bVNlY3Rpb25zLmFkZChzZWN0aW9uU3RyaW5nKTsKKworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHNlY3Rpb24udGFncy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgdWludDMyX3QgdGFnID0gc2VjdGlvbi50YWdzW2pdLnRhZ0lkOworICAgICAgICAgICAgaWYgKHRhZyA8IENBTUVSQV9NRVRBREFUQV9WRU5ET1JfVEFHX0JPVU5EQVJZKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiB2ZW5kb3IgdGFnICVkIG5vdCBpbiB2ZW5kb3IgdGFnIHNlY3Rpb24uIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRhZ0FycmF5LmVkaXRJdGVtQXQoaWR4KyspID0gc2VjdGlvbi50YWdzW2pdLnRhZ0lkOworCisgICAgICAgICAgICBjb25zdCBjaGFyICp0YWdOYW1lID0gc2VjdGlvbi50YWdzW2pdLnRhZ05hbWUuY19zdHIoKTsKKyAgICAgICAgICAgIGlmICh0YWdOYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IG5vIHRhZyBuYW1lIGRlZmluZWQgZm9yIHZlbmRvciB0YWcgJWQuIiwgX19GVU5DVElPTl9fLCB0YWcpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZXNjLT5tVGFnVG9OYW1lTWFwLmFkZCh0YWcsIFN0cmluZzgodGFnTmFtZSkpOworICAgICAgICAgICAgdGFnVG9TZWN0aW9uTWFwLmFkZCh0YWcsIHNlY3Rpb25TdHJpbmcpOworCisgICAgICAgICAgICBpbnQgdGFnVHlwZSA9IChpbnQpIHNlY3Rpb24udGFnc1tqXS50YWdUeXBlOworICAgICAgICAgICAgaWYgKHRhZ1R5cGUgPCAwIHx8IHRhZ1R5cGUgPj0gTlVNX1RZUEVTKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiB0YWcgdHlwZSAlZCBmcm9tIHZlbmRvciBvcHMgZG9lcyBub3QgZXhpc3QuIiwgX19GVU5DVElPTl9fLCB0YWdUeXBlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVzYy0+bVRhZ1RvVHlwZU1hcC5lbXBsYWNlKHRhZywgdGFnVHlwZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRhZ0FycmF5LnNpemUoKTsgKytpKSB7CisgICAgICAgIHVpbnQzMl90IHRhZyA9IHRhZ0FycmF5W2ldOworICAgICAgICBTdHJpbmc4IHNlY3Rpb25TdHJpbmcgPSB0YWdUb1NlY3Rpb25NYXAudmFsdWVGb3IodGFnKTsKKworICAgICAgICAvLyBTZXQgdXAgdGFnIHRvIHNlY3Rpb24gaW5kZXggbWFwCisgICAgICAgIHNzaXplX3QgaW5kZXggPSBkZXNjLT5tU2VjdGlvbnMuaW5kZXhPZihzZWN0aW9uU3RyaW5nKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihpbmRleCA8IDAsICJpbmRleCAlemQgbXVzdCBiZSBub24tbmVnYXRpdmUiLCBpbmRleCk7CisgICAgICAgIGRlc2MtPm1UYWdUb1NlY3Rpb25NYXAuYWRkKHRhZywgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGluZGV4KSk7CisKKyAgICAgICAgLy8gU2V0IHVwIHJldmVyc2UgbWFwcGluZworICAgICAgICBzc2l6ZV90IHJldmVyc2VJbmRleCA9IC0xOworICAgICAgICBpZiAoKHJldmVyc2VJbmRleCA9IGRlc2MtPm1SZXZlcnNlTWFwcGluZy5pbmRleE9mS2V5KHNlY3Rpb25TdHJpbmcpKSA8IDApIHsKKyAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIHVpbnQzMl90PiogbmFtZU1hcHBlciA9IG5ldyBLZXllZFZlY3RvcjxTdHJpbmc4LCB1aW50MzJfdD4oKTsKKyAgICAgICAgICAgIHJldmVyc2VJbmRleCA9IGRlc2MtPm1SZXZlcnNlTWFwcGluZy5hZGQoc2VjdGlvblN0cmluZywgbmFtZU1hcHBlcik7CisgICAgICAgIH0KKyAgICAgICAgZGVzYy0+bVJldmVyc2VNYXBwaW5nW3JldmVyc2VJbmRleF0tPmFkZChkZXNjLT5tVGFnVG9OYW1lTWFwLnZhbHVlRm9yKHRhZyksIHRhZyk7CisgICAgfQorCisgICAgKmRlc2NyaXB0b3IgPSBzdGQ6Om1vdmUoZGVzYyk7CisgICAgcmV0dXJuIE9LOworfQorCitDYW1lcmFNYW5hZ2VyR2xvYmFsJgorQ2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHNMb2NrKTsKKyAgICBDYW1lcmFNYW5hZ2VyR2xvYmFsKiBpbnN0YW5jZSA9IHNJbnN0YW5jZTsKKyAgICBpZiAoaW5zdGFuY2UgPT0gbnVsbHB0cikgeworICAgICAgICBpbnN0YW5jZSA9IG5ldyBDYW1lcmFNYW5hZ2VyR2xvYmFsKCk7CisgICAgICAgIHNJbnN0YW5jZSA9IGluc3RhbmNlOworICAgIH0KKyAgICByZXR1cm4gKmluc3RhbmNlOworfQorCitDYW1lcmFNYW5hZ2VyR2xvYmFsOjp+Q2FtZXJhTWFuYWdlckdsb2JhbCgpIHsKKyAgICAvLyBjbGVhciBzSW5zdGFuY2Ugc28gbmV4dCBnZXRJbnN0YW5jZSBjYWxsIGtub3dzIHRvIGNyZWF0ZSBhIG5ldyBvbmUKKyAgICBNdXRleDo6QXV0b2xvY2sgX3NsKHNMb2NrKTsKKyAgICBzSW5zdGFuY2UgPSBudWxscHRyOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1DYW1lcmFTZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUNhbWVyYVNlcnZpY2UtPnVubGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIpOworICAgICAgICBtQ2FtZXJhU2VydmljZS0+cmVtb3ZlTGlzdGVuZXIobUNhbWVyYVNlcnZpY2VMaXN0ZW5lcik7CisgICAgfQorICAgIG1EZWF0aE5vdGlmaWVyLmNsZWFyKCk7CisgICAgaWYgKG1DYkxvb3BlciAhPSBudWxscHRyKSB7CisgICAgICAgIG1DYkxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXItPmlkKCkpOworICAgICAgICBtQ2JMb29wZXItPnN0b3AoKTsKKyAgICB9CisgICAgbUNiTG9vcGVyLmNsZWFyKCk7CisgICAgbUhhbmRsZXIuY2xlYXIoKTsKKyAgICBtQ2FtZXJhU2VydmljZUxpc3RlbmVyLmNsZWFyKCk7CisgICAgbUNhbWVyYVNlcnZpY2UuY2xlYXIoKTsKK30KKworc3RhdGljIGJvb2wgaXNDYW1lcmFTZXJ2aWNlRGlzYWJsZWQoKSB7CisgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgIHByb3BlcnR5X2dldCgiY29uZmlnLmRpc2FibGVfY2FtZXJhc2VydmljZSIsIHZhbHVlLCAiMCIpOworICAgIHJldHVybiAoc3RybmNtcCh2YWx1ZSwgIjAiLCAyKSAhPSAwICYmIHN0cm5jYXNlY21wKHZhbHVlLCAiZmFsc2UiLCA2KSAhPSAwKTsKK30KKworYm9vbCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpzZXR1cFZlbmRvclRhZ3MoKSB7CisgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlPiB0YWdDYWNoZSA9IG5ldyBWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGUoKTsKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpOT19FUlJPUjsKKyAgICBzdGQ6OnZlY3RvcjxQcm92aWRlcklkQW5kVmVuZG9yVGFnU2VjdGlvbnM+IHByb3ZpZGVySWRzQW5kVnRzOworICAgIGF1dG8gcmVtb3RlUmV0ID0gbUNhbWVyYVNlcnZpY2UtPmdldENhbWVyYVZlbmRvclRhZ1NlY3Rpb25zKFsmc3RhdHVzLCAmcHJvdmlkZXJJZHNBbmRWdHNdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gJklkc0FuZFZ0cykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVySWRzQW5kVnRzID0gSWRzQW5kVnRzOyB9KTsKKworICAgIGlmICghcmVtb3RlUmV0LmlzT2soKSB8fCBzdGF0dXMgIT0gU3RhdHVzOjpOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJldHJpZXZlIFZlbmRvclRhZ1NlY3Rpb25zICVzIiwgcmVtb3RlUmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gQ29udmVydCBlYWNoIHByb3ZpZGVycyBWZW5kb3JUYWdTZWN0aW9ucyBpbnRvIGEgVmVuZG9yVGFnRGVzY3JpcHRvciBhbmQKKyAgICAvLyBhZGQgaXQgdG8gdGhlIGNhY2hlCisgICAgZm9yIChhdXRvICZwcm92aWRlcklkQW5kVnRzIDogcHJvdmlkZXJJZHNBbmRWdHMpIHsKKyAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gdmVuZG9yVGFnRGVzY3JpcHRvcjsKKyAgICAgICAgaWYgKEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbUhpZGwocHJvdmlkZXJJZEFuZFZ0cy52ZW5kb3JUYWdTZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnZlbmRvclRhZ0Rlc2NyaXB0b3IpICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNvbnZlcnQgZnJvbSBIaWRsOiBWZW5kb3JUYWdEZXNjcmlwdG9yIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgdGFnQ2FjaGUtPmFkZFZlbmRvckRlc2NyaXB0b3IocHJvdmlkZXJJZEFuZFZ0cy5wcm92aWRlcklkLCB2ZW5kb3JUYWdEZXNjcmlwdG9yKTsKKyAgICB9CisgICAgVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlOjpzZXRBc0dsb2JhbFZlbmRvclRhZ0NhY2hlKHRhZ0NhY2hlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3A8SUNhbWVyYVNlcnZpY2U+IENhbWVyYU1hbmFnZXJHbG9iYWw6OmdldENhbWVyYVNlcnZpY2UoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUNhbWVyYVNlcnZpY2UuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICBpZiAoaXNDYW1lcmFTZXJ2aWNlRGlzYWJsZWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIG1DYW1lcmFTZXJ2aWNlOworICAgICAgICB9CisKKyAgICAgICAgc3A8SUNhbWVyYVNlcnZpY2U+IGNhbWVyYVNlcnZpY2VCaW5kZXI7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGNhbWVyYVNlcnZpY2VCaW5kZXIgPSBJQ2FtZXJhU2VydmljZTo6Z2V0U2VydmljZSgpOworICAgICAgICAgICAgaWYgKGNhbWVyYVNlcnZpY2VCaW5kZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1coIkNhbWVyYVNlcnZpY2Ugbm90IHB1Ymxpc2hlZCwgd2FpdGluZy4uLiIpOworICAgICAgICAgICAgdXNsZWVwKGtDYW1lcmFTZXJ2aWNlUG9sbERlbGF5KTsKKyAgICAgICAgfSB3aGlsZSh0cnVlKTsKKyAgICAgICAgaWYgKG1EZWF0aE5vdGlmaWVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1EZWF0aE5vdGlmaWVyID0gbmV3IERlYXRoTm90aWZpZXIodGhpcyk7CisgICAgICAgIH0KKyAgICAgICAgY2FtZXJhU2VydmljZUJpbmRlci0+bGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIDApOworICAgICAgICBtQ2FtZXJhU2VydmljZSA9IGNhbWVyYVNlcnZpY2VCaW5kZXI7CisKKyAgICAgICAgLy8gU2V0dXAgbG9vcGVyIHRocmVhZCB0byBwZXJmcm9tIGF2YWlsaWFiaWxpdHkgY2FsbGJhY2tzCisgICAgICAgIGlmIChtQ2JMb29wZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUNiTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgICAgICAgICBtQ2JMb29wZXItPnNldE5hbWUoIkMyTi1tZ3ItbG9vcGVyIik7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQ2JMb29wZXItPnN0YXJ0KAorICAgICAgICAgICAgICAgICAgICAvKnJ1bk9uQ2FsbGluZ1RocmVhZCovZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIC8qY2FuQ2FsbEphdmEqLyAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICBQUklPUklUWV9ERUZBVUxUKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBzdGFydCBjYW1lcmEgc2VydmljZSBsaXN0ZW5lciBsb29wZXI6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtZXJyKSwgZXJyKTsKKyAgICAgICAgICAgICAgICBtQ2JMb29wZXIuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtSGFuZGxlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgbUhhbmRsZXIgPSBuZXcgQ2FsbGJhY2tIYW5kbGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2JMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlcik7CisgICAgICAgIH0KKworICAgICAgICAvLyByZWdpc3RlciBJQ2FtZXJhU2VydmljZUxpc3RlbmVyCisgICAgICAgIGlmIChtQ2FtZXJhU2VydmljZUxpc3RlbmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1DYW1lcmFTZXJ2aWNlTGlzdGVuZXIgPSBuZXcgQ2FtZXJhU2VydmljZUxpc3RlbmVyKHRoaXMpOworICAgICAgICB9CisgICAgICAgIGhpZGxfdmVjPENhbWVyYVN0YXR1c0FuZElkPiBjYW1lcmFTdGF0dXNlc3t9OworICAgICAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpOT19FUlJPUjsKKyAgICAgICAgYXV0byByZW1vdGVSZXQgPSBtQ2FtZXJhU2VydmljZS0+YWRkTGlzdGVuZXIobUNhbWVyYVNlcnZpY2VMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZjYW1lcmFTdGF0dXNlc10oU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gJnJldFN0YXR1c2VzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhU3RhdHVzZXMgPSByZXRTdGF0dXNlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmICghcmVtb3RlUmV0LmlzT2soKSB8fCBzdGF0dXMgIT0gU3RhdHVzOjpOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhZGQgbGlzdGVuZXIgdG8gY2FtZXJhIHNlcnZpY2UgJXMiLCByZW1vdGVSZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNldHVwIHZlbmRvciB0YWdzCisgICAgICAgIGlmICghc2V0dXBWZW5kb3JUYWdzKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IHVwIHZlbmRvciB0YWdzIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoYXV0byYgYyA6IGNhbWVyYVN0YXR1c2VzKSB7CisgICAgICAgICAgICBvblN0YXR1c0NoYW5nZWRMb2NrZWQoYyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG1DYW1lcmFTZXJ2aWNlOworfQorCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6OkRlYXRoTm90aWZpZXI6OnNlcnZpY2VEaWVkKHVpbnQ2NF90IGNvb2tpZSwgY29uc3Qgd3A8SUJhc2U+ICZ3aG8pIHsKKyAgICAodm9pZCkgY29va2llOworICAgICh2b2lkKSB3aG87CisgICAgQUxPR0UoIkNhbWVyYSBzZXJ2aWNlIGJpbmRlckRpZWQhIik7CisgICAgc3A8Q2FtZXJhTWFuYWdlckdsb2JhbD4gY20gPSBtQ2FtZXJhTWFuYWdlci5wcm9tb3RlKCk7CisgICAgaWYgKGNtICE9IG51bGxwdHIpIHsKKyAgICAgICAgQXV0b011dGV4IGxvY2soY20tPm1Mb2NrKTsKKyAgICAgICAgZm9yIChhdXRvJiBwYWlyIDogY20tPm1EZXZpY2VTdGF0dXNNYXApIHsKKyAgICAgICAgICAgIENhbWVyYVN0YXR1c0FuZElkIGNhbWVyYVN0YXR1c0FuZElkOworICAgICAgICAgICAgY2FtZXJhU3RhdHVzQW5kSWQuY2FtZXJhSWQgPSBwYWlyLmZpcnN0OworICAgICAgICAgICAgY2FtZXJhU3RhdHVzQW5kSWQuZGV2aWNlU3RhdHVzID0gcGFpci5zZWNvbmQ7CisgICAgICAgICAgICBjbS0+b25TdGF0dXNDaGFuZ2VkTG9ja2VkKGNhbWVyYVN0YXR1c0FuZElkKTsKKyAgICAgICAgfQorICAgICAgICBjbS0+bUNhbWVyYVNlcnZpY2UuY2xlYXIoKTsKKyAgICAgICAgLy8gVE9ETzogY29uc2lkZXIgYWRkaW5nIHJlLWNvbm5lY3QgY2FsbCBoZXJlPworICAgIH0KK30KKwordm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpyZWdpc3RlckF2YWlsYWJpbGl0eUNhbGxiYWNrKAorICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3MgKmNhbGxiYWNrKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBDYWxsYmFjayBjYihjYWxsYmFjayk7CisgICAgYXV0byBwYWlyID0gbUNhbGxiYWNrcy5pbnNlcnQoY2IpOworICAgIC8vIFNlbmQgaW5pdGlhbCBjYWxsYmFja3MgaWYgY2FsbGJhY2sgaXMgbmV3bHkgcmVnaXN0ZXJlZAorICAgIGlmIChwYWlyLnNlY29uZCkgeworICAgICAgICBmb3IgKGF1dG8mIHBhaXIgOiBtRGV2aWNlU3RhdHVzTWFwKSB7CisgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgY2FtZXJhSWQgPSBwYWlyLmZpcnN0OworICAgICAgICAgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1cyA9IHBhaXIuc2Vjb25kOworCisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VuZFNpbmdsZUNhbGxiYWNrLCBtSGFuZGxlcik7CisgICAgICAgICAgICBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFjayBjYiA9IGlzU3RhdHVzQXZhaWxhYmxlKHN0YXR1cykgPworICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay0+b25DYW1lcmFBdmFpbGFibGUgOiBjYWxsYmFjay0+b25DYW1lcmFVbmF2YWlsYWJsZTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQgKikgY2IpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYWxsYmFjay0+Y29udGV4dCk7CisgICAgICAgICAgICBtc2ctPnNldFN0cmluZyhrQ2FtZXJhSWRLZXksIEFTdHJpbmcoY2FtZXJhSWQuY19zdHIoKSkpOworICAgICAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhTWFuYWdlckdsb2JhbDo6dW5yZWdpc3RlckF2YWlsYWJpbGl0eUNhbGxiYWNrKAorICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3MgKmNhbGxiYWNrKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBDYWxsYmFjayBjYihjYWxsYmFjayk7CisgICAgbUNhbGxiYWNrcy5lcmFzZShjYik7Cit9CisKK3ZvaWQgQ2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0Q2FtZXJhSWRMaXN0KHN0ZDo6dmVjdG9yPGhpZGxfc3RyaW5nPiogY2FtZXJhSWRzKSB7CisgICAgLy8gRW5zdXJlIHRoYXQgd2UgaGF2ZSBpbml0aWFsaXplZC9yZWZyZXNoZWQgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIGRldmljZXMKKyAgICBhdXRvIGNzID0gZ2V0Q2FtZXJhU2VydmljZSgpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICBmb3IoYXV0byYgZGV2aWNlU3RhdHVzIDogbURldmljZVN0YXR1c01hcCkgeworICAgICAgICBpZiAoZGV2aWNlU3RhdHVzLnNlY29uZCA9PSBDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19OT1RfUFJFU0VOVCB8fAorICAgICAgICAgICAgICAgIGRldmljZVN0YXR1cy5zZWNvbmQgPT0gQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfRU5VTUVSQVRJTkcpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNhbWVyYUlkcy0+cHVzaF9iYWNrKGRldmljZVN0YXR1cy5maXJzdCk7CisgICAgfQorfQorCitib29sIENhbWVyYU1hbmFnZXJHbG9iYWw6OnZhbGlkU3RhdHVzKENhbWVyYURldmljZVN0YXR1cyBzdGF0dXMpIHsKKyAgICBzd2l0Y2ggKHN0YXR1cykgeworICAgICAgICBjYXNlIENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX05PVF9QUkVTRU5UOgorICAgICAgICBjYXNlIENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX1BSRVNFTlQ6CisgICAgICAgIGNhc2UgQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfRU5VTUVSQVRJTkc6CisgICAgICAgIGNhc2UgQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfTk9UX0FWQUlMQUJMRToKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworYm9vbCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjppc1N0YXR1c0F2YWlsYWJsZShDYW1lcmFEZXZpY2VTdGF0dXMgc3RhdHVzKSB7CisgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICAgICAgY2FzZSBDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19QUkVTRU5UOgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6OkNhbGxiYWNrSGFuZGxlcjo6b25NZXNzYWdlUmVjZWl2ZWQoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0U2VuZFNpbmdsZUNhbGxiYWNrOgorICAgICAgICB7CisgICAgICAgICAgICBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFjayBjYjsKKyAgICAgICAgICAgIHZvaWQqIGNvbnRleHQ7CisgICAgICAgICAgICBBU3RyaW5nIGNhbWVyYUlkOworICAgICAgICAgICAgYm9vbCBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZjYik7CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYW1lcmEgY2FsbGJhY2sgZnAhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NvbnRleHRLZXksICZjb250ZXh0KTsKKyAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhbGxiYWNrIGNvbnRleHQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFN0cmluZyhrQ2FtZXJhSWRLZXksICZjYW1lcmFJZCk7CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYW1lcmEgSUQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAoKmNiKShjb250ZXh0LCBjYW1lcmFJZC5jX3N0cigpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXM6IHVua25vd24gbWVzc2FnZSB0eXBlICVkIiwgX19GVU5DVElPTl9fLCBtc2ctPndoYXQoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK2hhcmR3YXJlOjpSZXR1cm48dm9pZD4gQ2FtZXJhTWFuYWdlckdsb2JhbDo6Q2FtZXJhU2VydmljZUxpc3RlbmVyOjpvblN0YXR1c0NoYW5nZWQoCisgICAgICAgIGNvbnN0IENhbWVyYVN0YXR1c0FuZElkICZzdGF0dXNBbmRJZCkgeworICAgIHNwPENhbWVyYU1hbmFnZXJHbG9iYWw+IGNtID0gbUNhbWVyYU1hbmFnZXIucHJvbW90ZSgpOworICAgIGlmIChjbSAhPSBudWxscHRyKSB7CisgICAgICAgIGNtLT5vblN0YXR1c0NoYW5nZWQoc3RhdHVzQW5kSWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJDYW5ub3QgZGVsaXZlciBzdGF0dXMgY2hhbmdlLiBHbG9iYWwgY2FtZXJhIG1hbmFnZXIgZGllZCIpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6Om9uU3RhdHVzQ2hhbmdlZCgKKyAgICAgICAgY29uc3QgQ2FtZXJhU3RhdHVzQW5kSWQgJnN0YXR1c0FuZElkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBvblN0YXR1c0NoYW5nZWRMb2NrZWQoc3RhdHVzQW5kSWQpOworfQorCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6Om9uU3RhdHVzQ2hhbmdlZExvY2tlZCgKKyAgICAgICAgY29uc3QgQ2FtZXJhU3RhdHVzQW5kSWQgJnN0YXR1c0FuZElkKSB7CisgICAgaGlkbF9zdHJpbmcgY2FtZXJhSWQgPSBzdGF0dXNBbmRJZC5jYW1lcmFJZDsKKyAgICBDYW1lcmFEZXZpY2VTdGF0dXMgc3RhdHVzID0gc3RhdHVzQW5kSWQuZGV2aWNlU3RhdHVzOworICAgIGlmICghdmFsaWRTdGF0dXMoc3RhdHVzKSkgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgc3RhdHVzICVkIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBmaXJzdFN0YXR1cyA9IChtRGV2aWNlU3RhdHVzTWFwLmNvdW50KGNhbWVyYUlkKSA9PSAwKTsKKyAgICBDYW1lcmFEZXZpY2VTdGF0dXMgb2xkU3RhdHVzID0gZmlyc3RTdGF0dXMgPworICAgICAgICAgICAgc3RhdHVzIDogLy8gZmlyc3Qgc3RhdHVzCisgICAgICAgICAgICBtRGV2aWNlU3RhdHVzTWFwW2NhbWVyYUlkXTsKKworICAgIGlmICghZmlyc3RTdGF0dXMgJiYKKyAgICAgICAgICAgIGlzU3RhdHVzQXZhaWxhYmxlKHN0YXR1cykgPT0gaXNTdGF0dXNBdmFpbGFibGUob2xkU3RhdHVzKSkgeworICAgICAgICAvLyBObyBzdGF0dXMgdXBkYXRlLiBObyBuZWVkIHRvIHNlbmQgY2FsbGJhY2sKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgcmVnaXN0ZXJlZCBjYWxsYmFja3MKKyAgICBtRGV2aWNlU3RhdHVzTWFwW2NhbWVyYUlkXSA9IHN0YXR1czsKKyAgICBmb3IgKGF1dG8gY2IgOiBtQ2FsbGJhY2tzKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZW5kU2luZ2xlQ2FsbGJhY2ssIG1IYW5kbGVyKTsKKyAgICAgICAgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2sgY2JGcCA9IGlzU3RhdHVzQXZhaWxhYmxlKHN0YXR1cykgPworICAgICAgICAgICAgICAgIGNiLm1BdmFpbGFibGUgOiBjYi5tVW5hdmFpbGFibGU7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQgKikgY2JGcCk7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2IubUNvbnRleHQpOworICAgICAgICBtc2ctPnNldFN0cmluZyhrQ2FtZXJhSWRLZXksIEFTdHJpbmcoY2FtZXJhSWQuY19zdHIoKSkpOworICAgICAgICBtc2ctPnBvc3QoKTsKKyAgICB9CisgICAgaWYgKHN0YXR1cyA9PSBDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19OT1RfUFJFU0VOVCkgeworICAgICAgICBtRGV2aWNlU3RhdHVzTWFwLmVyYXNlKGNhbWVyYUlkKTsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIGFjYW0KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworLyoqCisgKiBBQ2FtZXJhTWFuZ2VyIEltcGxlbWVudGF0aW9uCisgKi8KK2NhbWVyYV9zdGF0dXNfdAorQUNhbWVyYU1hbmFnZXI6OmdldENhbWVyYUlkTGlzdChBQ2FtZXJhSWRMaXN0KiogY2FtZXJhSWRMaXN0KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIHN0ZDo6dmVjdG9yPGhpZGxfc3RyaW5nPiBpZExpc3Q7CisgICAgQ2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKS5nZXRDYW1lcmFJZExpc3QoJmlkTGlzdCk7CisKKyAgICBpbnQgbnVtQ2FtZXJhcyA9IGlkTGlzdC5zaXplKCk7CisgICAgQUNhbWVyYUlkTGlzdCAqb3V0ID0gbmV3IEFDYW1lcmFJZExpc3Q7CisgICAgaWYgKCFvdXQpIHsKKyAgICAgICAgQUxPR0UoIkFsbG9jYXRlIG1lbW9yeSBmb3IgQUNhbWVyYUlkTGlzdCBmYWlsZWQhIik7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX05PVF9FTk9VR0hfTUVNT1JZOworICAgIH0KKyAgICBvdXQtPm51bUNhbWVyYXMgPSBudW1DYW1lcmFzOworICAgIG91dC0+Y2FtZXJhSWRzID0gbmV3IGNvbnN0IGNoYXIqW251bUNhbWVyYXNdOworICAgIGlmICghb3V0LT5jYW1lcmFJZHMpIHsKKyAgICAgICAgQUxPR0UoIkFsbG9jYXRlIG1lbW9yeSBmb3IgQUNhbWVyYUlkTGlzdCBmYWlsZWQhIik7CisgICAgICAgIGRlbGV0ZUNhbWVyYUlkTGlzdChvdXQpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9OT1RfRU5PVUdIX01FTU9SWTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DYW1lcmFzOyBpKyspIHsKKyAgICAgICAgY29uc3QgY2hhciogc3JjID0gaWRMaXN0W2ldLmNfc3RyKCk7CisgICAgICAgIHNpemVfdCBkc3RTaXplID0gc3RybGVuKHNyYykgKyAxOworICAgICAgICBjaGFyKiBkc3QgPSBuZXcgY2hhcltkc3RTaXplXTsKKyAgICAgICAgaWYgKCFkc3QpIHsKKyAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0ZSBtZW1vcnkgZm9yIEFDYW1lcmFJZExpc3QgZmFpbGVkISIpOworICAgICAgICAgICAgZGVsZXRlQ2FtZXJhSWRMaXN0KG91dCk7CisgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9OT1RfRU5PVUdIX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICBzdHJsY3B5KGRzdCwgc3JjLCBkc3RTaXplKTsKKyAgICAgICAgb3V0LT5jYW1lcmFJZHNbaV0gPSBkc3Q7CisgICAgfQorICAgICpjYW1lcmFJZExpc3QgPSBvdXQ7CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK3ZvaWQKK0FDYW1lcmFNYW5hZ2VyOjpkZWxldGVDYW1lcmFJZExpc3QoQUNhbWVyYUlkTGlzdCogY2FtZXJhSWRMaXN0KSB7CisgICAgaWYgKGNhbWVyYUlkTGlzdCAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChjYW1lcmFJZExpc3QtPmNhbWVyYUlkcyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbWVyYUlkTGlzdC0+bnVtQ2FtZXJhczsgaSArKykgeworICAgICAgICAgICAgICAgIGlmIChjYW1lcmFJZExpc3QtPmNhbWVyYUlkc1tpXSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZVtdIGNhbWVyYUlkTGlzdC0+Y2FtZXJhSWRzW2ldOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlbGV0ZVtdIGNhbWVyYUlkTGlzdC0+Y2FtZXJhSWRzOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBjYW1lcmFJZExpc3Q7CisgICAgfQorfQorCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYU1hbmFnZXI6OmdldENhbWVyYUNoYXJhY3RlcmlzdGljcygKKyAgICAgICAgY29uc3QgY2hhciAqY2FtZXJhSWRTdHIsIHNwPEFDYW1lcmFNZXRhZGF0YT4gKmNoYXJhY3RlcmlzdGljcykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICBzcDxJQ2FtZXJhU2VydmljZT4gY3MgPSBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRJbnN0YW5jZSgpLmdldENhbWVyYVNlcnZpY2UoKTsKKyAgICBpZiAoY3MgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCByZWFjaCBjYW1lcmEgc2VydmljZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEOworICAgIH0KKyAgICBDYW1lcmFNZXRhZGF0YSByYXdNZXRhZGF0YTsKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpOT19FUlJPUjsKKyAgICBhdXRvIHNlcnZpY2VSZXQgPQorICAgICAgICBjcy0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNhbWVyYUlkU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmcmF3TWV0YWRhdGFdIChhdXRvIHMgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiAmbWV0YWRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsczo6Y29udmVydEZyb21IaWRsQ2xvbmVkKG1ldGFkYXRhLCAmcmF3TWV0YWRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgIGlmICghc2VydmljZVJldC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIkdldCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGZyb20gY2FtZXJhIHNlcnZpY2UgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1VOS05PV047IC8vIHNob3VsZCBub3QgcmVhY2ggaGVyZQorICAgIH0KKworICAgICpjaGFyYWN0ZXJpc3RpY3MgPSBuZXcgQUNhbWVyYU1ldGFkYXRhKAorICAgICAgICAgICAgcmF3TWV0YWRhdGEucmVsZWFzZSgpLCBBQ2FtZXJhTWV0YWRhdGE6OkFDTV9DSEFSQUNURVJJU1RJQ1MpOworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCitjYW1lcmFfc3RhdHVzX3QKK0FDYW1lcmFNYW5hZ2VyOjpvcGVuQ2FtZXJhKAorICAgICAgICBjb25zdCBjaGFyKiBjYW1lcmFJZCwKKyAgICAgICAgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2ssCisgICAgICAgIC8qb3V0Ki9BQ2FtZXJhRGV2aWNlKiogb3V0RGV2aWNlKSB7CisgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiByYXdDaGFyczsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNhbWVyYUlkLCAmcmF3Q2hhcnMpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCIlczogY2Fubm90IGdldCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGZvciBjYW1lcmEgJXMuIGVyciAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCwgcmV0KTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgQUNhbWVyYURldmljZSogZGV2aWNlID0gbmV3IEFDYW1lcmFEZXZpY2UoY2FtZXJhSWQsIGNhbGxiYWNrLCBzdGQ6Om1vdmUocmF3Q2hhcnMpKTsKKworICAgIHNwPElDYW1lcmFTZXJ2aWNlPiBjcyA9IENhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkuZ2V0Q2FtZXJhU2VydmljZSgpOworICAgIGlmIChjcyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IHJlYWNoIGNhbWVyYSBzZXJ2aWNlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGRlbGV0ZSBkZXZpY2U7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQ7CisgICAgfQorCisgICAgc3A8SUNhbWVyYURldmljZUNhbGxiYWNrPiBjYWxsYmFja3MgPSBkZXZpY2UtPmdldFNlcnZpY2VDYWxsYmFjaygpOworICAgIHNwPElDYW1lcmFEZXZpY2VVc2VyPiBkZXZpY2VSZW1vdGU7CisKKyAgICAvLyBObyB3YXkgdG8gZ2V0IHBhY2thZ2UgbmFtZSBmcm9tIG5hdGl2ZS4KKyAgICAvLyBTZW5kIGEgemVybyBsZW5ndGggcGFja2FnZSBuYW1lIGFuZCBsZXQgY2FtZXJhIHNlcnZpY2UgZmlndXJlIGl0IG91dCBmcm9tIFVJRAorICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6Ok5PX0VSUk9SOworICAgIGF1dG8gc2VydmljZVJldCA9IGNzLT5jb25uZWN0RGV2aWNlKAorICAgICAgICAgICAgY2FsbGJhY2tzLCBjYW1lcmFJZCwgWyZzdGF0dXMsICZkZXZpY2VSZW1vdGVdKGF1dG8gcywgYXV0byAmZGV2aWNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VSZW1vdGUgPSBkZXZpY2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKworICAgIGlmICghc2VydmljZVJldC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjb25uZWN0IGNhbWVyYSBkZXZpY2UgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgLy8gVE9ETzogQ29udmVydCBzZXJ2aWNlUmV0IHRvIGNhbWVyYV9zdGF0dXNfdAorICAgICAgICBkZWxldGUgZGV2aWNlOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9VTktOT1dOOworICAgIH0KKyAgICBpZiAoZGV2aWNlUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjb25uZWN0IGNhbWVyYSBkZXZpY2UgZmFpbGVkISByZW1vdGUgZGV2aWNlIGlzIG51bGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBkZWxldGUgZGV2aWNlOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEOworICAgIH0KKyAgICBkZXZpY2UtPnNldFJlbW90ZURldmljZShkZXZpY2VSZW1vdGUpOworICAgIGRldmljZS0+c2V0RGV2aWNlTWV0YWRhdGFRdWV1ZXMoKTsKKyAgICAqb3V0RGV2aWNlID0gZGV2aWNlOworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCitjYW1lcmFfc3RhdHVzX3QKK0FDYW1lcmFNYW5hZ2VyOjpnZXRUYWdGcm9tTmFtZShjb25zdCBjaGFyICpjYW1lcmFJZCwgY29uc3QgY2hhciAqbmFtZSwgdWludDMyX3QgKnRhZykgeworICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gcmF3Q2hhcnM7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZCwgJnJhd0NoYXJzKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIiVzLCBDYW5ub3QgcmV0cmlldmUgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBmb3IgY2FtZXJhIGlkICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGNhbWVyYUlkKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfTUVUQURBVEFfTk9UX0ZPVU5EOworICAgIH0KKyAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEgPSByYXdDaGFycy0+Z2V0SW50ZXJuYWxEYXRhKCk7CisgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnJhd01ldGFkYXRhID0gbWV0YWRhdGEuZ2V0QW5kTG9jaygpOworICAgIG1ldGFkYXRhX3ZlbmRvcl9pZF90IHZlbmRvclRhZ0lkID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV92ZW5kb3JfaWQocmF3TWV0YWRhdGEpOworICAgIG1ldGFkYXRhLnVubG9jayhyYXdNZXRhZGF0YSk7CisgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlPiB2dENhY2hlID0gVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlOjpnZXRHbG9iYWxWZW5kb3JUYWdDYWNoZSgpOworICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IHZUYWdzID0gbnVsbHB0cjsKKyAgICB2dENhY2hlLT5nZXRWZW5kb3JUYWdEZXNjcmlwdG9yKHZlbmRvclRhZ0lkLCAmdlRhZ3MpOworICAgIHN0YXR1c190IHN0YXR1cz0gbWV0YWRhdGEuZ2V0VGFnRnJvbU5hbWUobmFtZSwgdlRhZ3MuZ2V0KCksIHRhZyk7CisgICAgcmV0dXJuIHN0YXR1cyA9PSBPSyA/IEFDQU1FUkFfT0sgOiBBQ0FNRVJBX0VSUk9SX01FVEFEQVRBX05PVF9GT1VORDsKK30KKworQUNhbWVyYU1hbmFnZXI6On5BQ2FtZXJhTWFuYWdlcigpIHsKKworfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuaCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM2MmQ0NAotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgKQEAgLTAsMCArMSwyMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9BQ0FNRVJBX01BTkFHRVJfSAorI2RlZmluZSBfQUNBTUVSQV9NQU5BR0VSX0gKKworI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFNYW5hZ2VyLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcGFyc2VpbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC9JQ2FtZXJhU2VydmljZS5oPgorCisjaW5jbHVkZSA8Q2FtZXJhTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CisKK3VzaW5nIElDYW1lcmFTZXJ2aWNlID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6SUNhbWVyYVNlcnZpY2U7Cit1c2luZyBDYW1lcmFEZXZpY2VTdGF0dXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFEZXZpY2VTdGF0dXM7Cit1c2luZyBJQ2FtZXJhU2VydmljZUxpc3RlbmVyID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjsKK3VzaW5nIENhbWVyYVN0YXR1c0FuZElkID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhU3RhdHVzQW5kSWQ7Cit1c2luZyBTdGF0dXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlN0YXR1czsKK3VzaW5nIFZlbmRvclRhZ1NlY3Rpb24gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlZlbmRvclRhZ1NlY3Rpb247Cit1c2luZyBWZW5kb3JUYWcgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlZlbmRvclRhZzsKK3VzaW5nIElCYXNlID0gYW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyBoYXJkd2FyZTo6Vm9pZDsKKworLyoqCisgKiBQZXItcHJvY2VzcyBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgQ2FtZXJhTWFuZ2VyLiBTaGFyZWQgYnkgYWxsIEFDYW1lcmFNYW5hZ2VyCisgKiBpbnN0YW5jZXMuIENyZWF0ZWQgd2hlbiBmaXJzdCBBQ2FtZXJhTWFuYWdlciBpcyBjcmVhdGVkIGFuZCBkZXN0cm95ZWQgd2hlbgorICogYWxsIEFDYW1lcmFNYW5hZ2VyIGluc3RhbmNlcyBhcmUgZGVsZXRlZC4KKyAqCisgKiBUT0RPOiBtYXliZSBDYW1lcmFNYW5hZ2VyR2xvYmFsIGlzIGJldHRlciBzdWl0ZWQgaW4gbGliY2FtZXJhY2xpZW50PworICovCitjbGFzcyBDYW1lcmFNYW5hZ2VyR2xvYmFsIGZpbmFsIDogcHVibGljIFJlZkJhc2UgeworICBwdWJsaWM6CisgICAgc3RhdGljIENhbWVyYU1hbmFnZXJHbG9iYWwmIGdldEluc3RhbmNlKCk7CisgICAgc3A8SUNhbWVyYVNlcnZpY2U+IGdldENhbWVyYVNlcnZpY2UoKTsKKworICAgIHZvaWQgcmVnaXN0ZXJBdmFpbGFiaWxpdHlDYWxsYmFjaygKKyAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrcyAqY2FsbGJhY2spOworICAgIHZvaWQgdW5yZWdpc3RlckF2YWlsYWJpbGl0eUNhbGxiYWNrKAorICAgICAgICAgICAgY29uc3QgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzICpjYWxsYmFjayk7CisKKyAgICB2b2lkIHJlZ2lzdGVyRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFjaygKKyAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFNYW5hZ2VyX0V4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2tzKiAvKmNhbGxiYWNrKi8pIHt9CisgICAgdm9pZCB1bnJlZ2lzdGVyRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFjaygKKyAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFNYW5hZ2VyX0V4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2tzKiAvKmNhbGxiYWNrKi8pIHt9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gY2FtZXJhIElEcyB0aGF0IHN1cHBvcnQgY2FtZXJhMgorICAgICAqLworICAgIHZvaWQgZ2V0Q2FtZXJhSWRMaXN0KHN0ZDo6dmVjdG9yPGhpZGxfc3RyaW5nPiAqY2FtZXJhSWRzKTsKKworICBwcml2YXRlOgorICAgIHNwPElDYW1lcmFTZXJ2aWNlPiBtQ2FtZXJhU2VydmljZTsKKyAgICBjb25zdCBpbnQgICAgICAgICAga0NhbWVyYVNlcnZpY2VQb2xsRGVsYXkgPSA1MDAwMDA7IC8vIDAuNXMKKyAgICBNdXRleCAgICAgICAgICAgICAgbUxvY2s7CisgICAgY2xhc3MgRGVhdGhOb3RpZmllciA6IHB1YmxpYyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQgeworICAgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBEZWF0aE5vdGlmaWVyKENhbWVyYU1hbmFnZXJHbG9iYWwqIGNtKSA6IG1DYW1lcmFNYW5hZ2VyKGNtKSB7fQorICAgICAgcHJvdGVjdGVkOgorICAgICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCBpbXBsZW1lbnRhdGlvbgorICAgICAgICB2aXJ0dWFsIHZvaWQgc2VydmljZURpZWQodWludDY0X3QgY29va2llLCBjb25zdCB3cDxJQmFzZT4gJndobyk7CisgICAgICBwcml2YXRlOgorICAgICAgICBjb25zdCB3cDxDYW1lcmFNYW5hZ2VyR2xvYmFsPiBtQ2FtZXJhTWFuYWdlcjsKKyAgICB9OworICAgIHNwPERlYXRoTm90aWZpZXI+IG1EZWF0aE5vdGlmaWVyOworCisgICAgY2xhc3MgQ2FtZXJhU2VydmljZUxpc3RlbmVyIGZpbmFsIDogcHVibGljIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXIgeworICAgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBDYW1lcmFTZXJ2aWNlTGlzdGVuZXIoQ2FtZXJhTWFuYWdlckdsb2JhbCogY20pIDogbUNhbWVyYU1hbmFnZXIoY20pIHt9CisgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gb25TdGF0dXNDaGFuZ2VkKAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhU3RhdHVzQW5kSWQgJnN0YXR1c0FuZElkKSBvdmVycmlkZTsKKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3Qgd3A8Q2FtZXJhTWFuYWdlckdsb2JhbD4gbUNhbWVyYU1hbmFnZXI7CisgICAgfTsKKyAgICBzcDxDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IG1DYW1lcmFTZXJ2aWNlTGlzdGVuZXI7CisKKyAgICAvLyBXcmFwcGVyIG9mIEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrcyBzbyB3ZSBjYW4gc3RvcmUgaXQgaW4gc3RkOjpzZXQKKyAgICBzdHJ1Y3QgQ2FsbGJhY2sgeworICAgICAgICBleHBsaWNpdCBDYWxsYmFjayhjb25zdCBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3MgKmNhbGxiYWNrKSA6CisgICAgICAgICAgICBtQXZhaWxhYmxlKGNhbGxiYWNrLT5vbkNhbWVyYUF2YWlsYWJsZSksCisgICAgICAgICAgICBtVW5hdmFpbGFibGUoY2FsbGJhY2stPm9uQ2FtZXJhVW5hdmFpbGFibGUpLAorICAgICAgICAgICAgbUNvbnRleHQoY2FsbGJhY2stPmNvbnRleHQpIHt9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQ2FsbGJhY2smIG90aGVyKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gKG1BdmFpbGFibGUgPT0gb3RoZXIubUF2YWlsYWJsZSAmJgorICAgICAgICAgICAgICAgICAgICBtVW5hdmFpbGFibGUgPT0gb3RoZXIubVVuYXZhaWxhYmxlICYmCisgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0ID09IG90aGVyLm1Db250ZXh0KTsKKyAgICAgICAgfQorICAgICAgICBib29sIG9wZXJhdG9yICE9IChjb25zdCBDYWxsYmFjayYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgICAgICAgfQorICAgICAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IENhbGxiYWNrJiBvdGhlcikgY29uc3QgeworICAgICAgICAgICAgaWYgKCp0aGlzID09IG90aGVyKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICBpZiAobUNvbnRleHQgIT0gb3RoZXIubUNvbnRleHQpIHJldHVybiBtQ29udGV4dCA8IG90aGVyLm1Db250ZXh0OworICAgICAgICAgICAgaWYgKG1BdmFpbGFibGUgIT0gb3RoZXIubUF2YWlsYWJsZSkgcmV0dXJuIG1BdmFpbGFibGUgPCBvdGhlci5tQXZhaWxhYmxlOworICAgICAgICAgICAgcmV0dXJuIG1VbmF2YWlsYWJsZSA8IG90aGVyLm1VbmF2YWlsYWJsZTsKKyAgICAgICAgfQorICAgICAgICBib29sIG9wZXJhdG9yID4gKGNvbnN0IENhbGxiYWNrJiBvdGhlcikgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuICgqdGhpcyAhPSBvdGhlciAmJiAhKCp0aGlzIDwgb3RoZXIpKTsKKyAgICAgICAgfQorICAgICAgICBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFjayBtQXZhaWxhYmxlOworICAgICAgICBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFjayBtVW5hdmFpbGFibGU7CisgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250ZXh0OworICAgIH07CisgICAgc3RkOjpzZXQ8Q2FsbGJhY2s+IG1DYWxsYmFja3M7CisKKyAgICAvLyBkZWZpbml0aW9uIG9mIGhhbmRsZXIgYW5kIG1lc3NhZ2UKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRTZW5kU2luZ2xlQ2FsbGJhY2sKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ2FtZXJhSWRLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYWxsYmFja0ZwS2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ29udGV4dEtleTsKKyAgICBjbGFzcyBDYWxsYmFja0hhbmRsZXIgOiBwdWJsaWMgQUhhbmRsZXIgeworICAgICAgcHVibGljOgorICAgICAgICBDYWxsYmFja0hhbmRsZXIoKSB7fQorICAgICAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKKyAgICB9OworICAgIHNwPENhbGxiYWNrSGFuZGxlcj4gbUhhbmRsZXI7CisgICAgc3A8QUxvb3Blcj4gICAgICAgICBtQ2JMb29wZXI7IC8vIExvb3BlciB0aHJlYWQgd2hlcmUgY2FsbGJhY2tzIGFjdHVhbGx5IGhhcHBlbiBvbgorCisgICAgdm9pZCBvblN0YXR1c0NoYW5nZWQoY29uc3QgQ2FtZXJhU3RhdHVzQW5kSWQgJnN0YXR1c0FuZElkKTsKKyAgICB2b2lkIG9uU3RhdHVzQ2hhbmdlZExvY2tlZChjb25zdCBDYW1lcmFTdGF0dXNBbmRJZCAmc3RhdHVzQW5kSWQpOworICAgIGJvb2wgc2V0dXBWZW5kb3JUYWdzKCk7CisKKyAgICAvLyBVdGlscyBmb3Igc3RhdHVzCisgICAgc3RhdGljIGJvb2wgdmFsaWRTdGF0dXMoQ2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1cyk7CisgICAgc3RhdGljIGJvb2wgaXNTdGF0dXNBdmFpbGFibGUoQ2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1cyk7CisKKyAgICAvLyBUaGUgc29ydCBsb2dpYyBtdXN0IG1hdGNoIHRoZSBsb2dpYyBpbgorICAgIC8vIGxpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHA6OmdldEFQSTFDb21wYXRpYmxlQ2FtZXJhRGV2aWNlSWRzCisgICAgc3RydWN0IENhbWVyYUlkQ29tcGFyYXRvciB7CisgICAgICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBoaWRsX3N0cmluZyYgYSwgY29uc3QgaGlkbF9zdHJpbmcmIGIpIGNvbnN0IHsKKyAgICAgICAgICAgIHVpbnQzMl90IGFVaW50ID0gMCwgYlVpbnQgPSAwOworICAgICAgICAgICAgYm9vbCBhSXNVaW50ID0gYmFzZTo6UGFyc2VVaW50KGEuY19zdHIoKSwgJmFVaW50KTsKKyAgICAgICAgICAgIGJvb2wgYklzVWludCA9IGJhc2U6OlBhcnNlVWludChiLmNfc3RyKCksICZiVWludCk7CisKKyAgICAgICAgICAgIC8vIFVpbnQgZGV2aWNlIElEcyBmaXJzdAorICAgICAgICAgICAgaWYgKGFJc1VpbnQgJiYgYklzVWludCkgeworICAgICAgICAgICAgICAgIHJldHVybiBhVWludCA8IGJVaW50OworICAgICAgICAgICAgfSBlbHNlIGlmIChhSXNVaW50KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGJJc1VpbnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBTaW1wbGUgc3RyaW5nIGNvbXBhcmUgaWYgYm90aCBpZCBhcmUgbm90IHVpbnQKKyAgICAgICAgICAgIHJldHVybiBhIDwgYjsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLyBNYXAgY2FtZXJhX2lkIC0+IHN0YXR1cworICAgIHN0ZDo6bWFwPGhpZGxfc3RyaW5nLCBDYW1lcmFEZXZpY2VTdGF0dXMsIENhbWVyYUlkQ29tcGFyYXRvcj4gbURldmljZVN0YXR1c01hcDsKKworICAgIC8vIEZvciB0aGUgc2luZ2xldG9uIGluc3RhbmNlCisgICAgc3RhdGljIE11dGV4IHNMb2NrOworICAgIHN0YXRpYyBDYW1lcmFNYW5hZ2VyR2xvYmFsKiBzSW5zdGFuY2U7CisgICAgQ2FtZXJhTWFuYWdlckdsb2JhbCgpIHt9OworICAgIH5DYW1lcmFNYW5hZ2VyR2xvYmFsKCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhY2FtOworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZDsKKworLyoqCisgKiBBQ2FtZXJhTWFuYWdlciBvcGFxdWUgc3RydWN0IGRlZmluaXRpb24KKyAqIExlYXZlIG91dHNpZGUgb2YgYW5kcm9pZCBuYW1lc3BhY2UgYmVjYXVzZSBpdCdzIE5ESyBzdHJ1Y3QKKyAqLworc3RydWN0IEFDYW1lcmFNYW5hZ2VyIHsKKyAgICBBQ2FtZXJhTWFuYWdlcigpIDoKKyAgICAgICAgICAgIG1HbG9iYWxNYW5hZ2VyKCYoYW5kcm9pZDo6YWNhbTo6Q2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKSkpIHt9CisgICAgfkFDYW1lcmFNYW5hZ2VyKCk7CisgICAgY2FtZXJhX3N0YXR1c190IGdldENhbWVyYUlkTGlzdChBQ2FtZXJhSWRMaXN0KiogY2FtZXJhSWRMaXN0KTsKKyAgICBzdGF0aWMgdm9pZCAgICAgZGVsZXRlQ2FtZXJhSWRMaXN0KEFDYW1lcmFJZExpc3QqIGNhbWVyYUlkTGlzdCk7CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAorICAgICAgICAgICAgY29uc3QgY2hhciogY2FtZXJhSWQsIGFuZHJvaWQ6OnNwPEFDYW1lcmFNZXRhZGF0YT4qIGNoYXJhY3RlcmlzdGljcyk7CisKKyAgICBjYW1lcmFfc3RhdHVzX3Qgb3BlbkNhbWVyYShjb25zdCBjaGFyKiBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzKiBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovQUNhbWVyYURldmljZSoqIGRldmljZSk7CisgICAgY2FtZXJhX3N0YXR1c190IGdldFRhZ0Zyb21OYW1lKGNvbnN0IGNoYXIgKmNhbWVyYUlkLCBjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCAqdGFnKTsKKworICBwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrQ2FtZXJhSWRMaXN0Tm90SW5pdCA9IC0xCisgICAgfTsKKyAgICBhbmRyb2lkOjpNdXRleCAgICAgICAgIG1Mb2NrOworICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OmFjYW06OkNhbWVyYU1hbmFnZXJHbG9iYWw+IG1HbG9iYWxNYW5hZ2VyOworfTsKKworI2VuZGlmIC8vX0FDQU1FUkFfTUFOQUdFUl9ICmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FwdHVyZVJlcXVlc3RWZW5kb3IuaCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYXB0dXJlUmVxdWVzdFZlbmRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkNjc2MTUKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FwdHVyZVJlcXVlc3RWZW5kb3IuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgInV0aWxzLmgiCisKK3N0cnVjdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0IHsKKyAgICBleHBsaWNpdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0KG5hdGl2ZV9oYW5kbGVfdCogd2luZG93KSA6IG1XaW5kb3cod2luZG93KSB7fTsKKworICAgIGJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IEFDYW1lcmFPdXRwdXRUYXJnZXQmIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtV2luZG93ID09IG90aGVyLm1XaW5kb3c7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IEFDYW1lcmFPdXRwdXRUYXJnZXQmIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtV2luZG93ICE9IG90aGVyLm1XaW5kb3c7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IgPCAoY29uc3QgQUNhbWVyYU91dHB1dFRhcmdldCYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3cgPCBvdGhlci5tV2luZG93OworICAgIH0KKyAgICBib29sIG9wZXJhdG9yID4gKGNvbnN0IEFDYW1lcmFPdXRwdXRUYXJnZXQmIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtV2luZG93ID4gb3RoZXIubVdpbmRvdzsKKyAgICB9CisKKyAgICBhbmRyb2lkOjphY2FtOjp1dGlsczo6bmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciBtV2luZG93OworfTsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL3V0aWxzLmNwcCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL3V0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGZiMjA0Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvdXRpbHMuY3BwCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBQ2FtZXJhVmVuZG9yVXRpbHMiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgInV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKK25hbWVzcGFjZSB1dGlscyB7CisKKy8vIENvbnZlcnQgQ2FwdHVyZVJlcXVlc3Qgd3JhcHBhYmxlIGJ5IHNwPD4gdG8gaGlkbCBDYXB0dXJlUmVxdWVzdC4KK2ZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlcXVlc3QKK2NvbnZlcnRUb0hpZGwoY29uc3QgQ2FwdHVyZVJlcXVlc3QgKmNhcHR1cmVSZXF1ZXN0KSB7CisgICAgZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYXB0dXJlUmVxdWVzdCBoQ2FwdHVyZVJlcXVlc3Q7CisgICAgaENhcHR1cmVSZXF1ZXN0LnBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MgPSBjYXB0dXJlUmVxdWVzdC0+bUNhcHR1cmVSZXF1ZXN0LnBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M7CisgICAgaENhcHR1cmVSZXF1ZXN0LnN0cmVhbUFuZFdpbmRvd0lkcyA9IGNhcHR1cmVSZXF1ZXN0LT5tQ2FwdHVyZVJlcXVlc3Quc3RyZWFtQW5kV2luZG93SWRzOworICAgIHJldHVybiBoQ2FwdHVyZVJlcXVlc3Q7Cit9CisKK0hSb3RhdGlvbiBjb252ZXJ0VG9IaWRsKGludCByb3RhdGlvbikgeworICAgIEhSb3RhdGlvbiBoUm90YXRpb24gPSBIUm90YXRpb246OlIwOworICAgIHN3aXRjaChyb3RhdGlvbikgeworICAgICAgICBjYXNlIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzkwOgorICAgICAgICAgICAgaFJvdGF0aW9uID0gSFJvdGF0aW9uOjpSOTA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8xODA6CisgICAgICAgICAgICBoUm90YXRpb24gPSBIUm90YXRpb246OlIxODA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8yNzA6CisgICAgICAgICAgICBoUm90YXRpb24gPSBIUm90YXRpb246OlIyNzA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gaFJvdGF0aW9uOworfQorCitib29sIGNvbnZlcnRGcm9tSGlkbENsb25lZChjb25zdCBIQ2FtZXJhTWV0YWRhdGEgJm1ldGFkYXRhLCBDYW1lcmFNZXRhZGF0YSAqcmF3TWV0YWRhdGEpIHsKKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGEgKmJ1ZmZlciA9IChjYW1lcmFfbWV0YWRhdGFfdCopKG1ldGFkYXRhLmRhdGEoKSk7CisgICAgc2l6ZV90IGV4cGVjdGVkU2l6ZSA9IG1ldGFkYXRhLnNpemUoKTsKKyAgICBpbnQgcmV0ID0gdmFsaWRhdGVfY2FtZXJhX21ldGFkYXRhX3N0cnVjdHVyZShidWZmZXIsICZleHBlY3RlZFNpemUpOworICAgIGlmIChyZXQgPT0gT0sgfHwgcmV0ID09IENBTUVSQV9NRVRBREFUQV9WQUxJREFUSU9OX1NISUZURUQpIHsKKyAgICAgICAgKnJhd01ldGFkYXRhID0gYnVmZmVyOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogTWFsZm9ybWVkIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIGNhbGxlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIE5vdGU6IGV4aXN0aW5nIGRhdGEgaW4gZHN0IHdpbGwgYmUgZ29uZS4gZHN0IG93bnMgbWVtb3J5IGlmIHNob3VsZE93biBpcyBzZXQKKy8vICAgICAgIHRvIHRydWUuCit2b2lkIGNvbnZlcnRUb0hpZGwoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnNyYywgSENhbWVyYU1ldGFkYXRhKiBkc3QsIGJvb2wgc2hvdWxkT3duKSB7CisgICAgaWYgKHNyYyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2l6ZV90IHNpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUoc3JjKTsKKyAgICBkc3QtPnNldFRvRXh0ZXJuYWwoKHVpbnQ4X3QgKikgc3JjLCBzaXplLCBzaG91bGRPd24pOworICAgIHJldHVybjsKK30KKworVGVtcGxhdGVJZCBjb252ZXJ0VG9IaWRsKEFDYW1lcmFEZXZpY2VfcmVxdWVzdF90ZW1wbGF0ZSB0ZW1wbGF0ZUlkKSB7CisgICAgc3dpdGNoKHRlbXBsYXRlSWQpIHsKKyAgICAgICAgY2FzZSBURU1QTEFURV9TVElMTF9DQVBUVVJFOgorICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlSWQ6OlNUSUxMX0NBUFRVUkU7CisgICAgICAgIGNhc2UgVEVNUExBVEVfUkVDT1JEOgorICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlSWQ6OlJFQ09SRDsKKyAgICAgICAgY2FzZSBURU1QTEFURV9WSURFT19TTkFQU0hPVDoKKyAgICAgICAgICAgIHJldHVybiBUZW1wbGF0ZUlkOjpWSURFT19TTkFQU0hPVDsKKyAgICAgICAgY2FzZSBURU1QTEFURV9aRVJPX1NIVVRURVJfTEFHOgorICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlSWQ6OlpFUk9fU0hVVFRFUl9MQUc7CisgICAgICAgIGNhc2UgVEVNUExBVEVfTUFOVUFMOgorICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlSWQ6Ok1BTlVBTDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBUZW1wbGF0ZUlkOjpQUkVWSUVXOworICAgIH0KK30KKworY2FtZXJhX3N0YXR1c190IGNvbnZlcnRGcm9tSGlkbChTdGF0dXMgc3RhdHVzKSB7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IEFDQU1FUkFfT0s7CisgICAgc3dpdGNoKHN0YXR1cykgeworICAgICAgICBjYXNlIFN0YXR1czo6Tk9fRVJST1I6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdGF0dXM6OkRJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgIHJldCA9IEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0YXR1czo6Q0FNRVJBX0lOX1VTRToKKyAgICAgICAgICAgIHJldCA9IEFDQU1FUkFfRVJST1JfQ0FNRVJBX0lOX1VTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0YXR1czo6TUFYX0NBTUVSQVNfSU5fVVNFOgorICAgICAgICAgICAgcmV0ID0gQUNBTUVSQV9FUlJPUl9NQVhfQ0FNRVJBX0lOX1VTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVDoKKyAgICAgICAgICAgIHJldCA9IEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdGF0dXM6OkRFUFJFQ0FURURfSEFMOgorICAgICAgICAgICAgLy8gU2hvdWxkIG5vdCByZWFjaCBoZXJlIHNpbmNlIHdlIGZpbHRlcmVkIGxlZ2FjeSBIQUxzIGVhcmxpZXIKKyAgICAgICAgICAgIHJldCA9IEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdGF0dXM6OkRJU0FCTEVEOgorICAgICAgICAgICAgcmV0ID0gQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQUJMRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTdGF0dXM6OlBFUk1JU1NJT05fREVOSUVEOgorICAgICAgICAgICAgcmV0ID0gQUNBTUVSQV9FUlJPUl9QRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0YXR1czo6SU5WQUxJRF9PUEVSQVRJT046CisgICAgICAgICAgICByZXQgPSBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXQgPSBBQ0FNRVJBX0VSUk9SX1VOS05PV047CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYm9vbCBpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgxLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMikgeworICAgIGlmIChuaDEtPm51bUZkcyAhPTAgfHwgbmgyLT5udW1GZHMgIT0wKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIHdpbmRvdyBuYXRpdmUgaGFuZGxlcyBiZWluZyBjb21wYXJlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChuaDEtPnZlcnNpb24gIT0gbmgyLT52ZXJzaW9uIHx8IG5oMS0+bnVtRmRzICE9IG5oMi0+bnVtRmRzIHx8CisgICAgICAgIG5oMS0+bnVtSW50cyAhPSBuaDItPm51bUludHMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5oMS0+bnVtSW50czsgaSsrKSB7CisgICAgICAgIGlmKG5oMS0+ZGF0YVtpXSAhPSBuaDItPmRhdGFbaV0pIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBpc1dpbmRvd05hdGl2ZUhhbmRsZUxlc3NUaGFuKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgxLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMikgeworICAgIGlmIChpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKG5oMSwgbmgyKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChuaDEtPm51bUludHMgIT0gbmgyLT5udW1JbnRzKSB7CisgICAgICAgIHJldHVybiBuaDEtPm51bUludHMgPCBuaDItPm51bUludHM7CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuaDEtPm51bUludHM7IGkrKykgeworICAgICAgICBpZiAobmgxLT5kYXRhW2ldICE9IG5oMi0+ZGF0YVtpXSkgeworICAgICAgICAgICAgcmV0dXJuIG5oMS0+ZGF0YVtpXSA8IG5oMi0+ZGF0YVtpXTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgaXNXaW5kb3dOYXRpdmVIYW5kbGVHcmVhdGVyVGhhbihjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMSwgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDIpIHsKKyAgICByZXR1cm4gIWlzV2luZG93TmF0aXZlSGFuZGxlTGVzc1RoYW4obmgxLCBuaDIpICYmICFpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKG5oMSwgbmgyKTsKK30KKworYm9vbCBhcmVXaW5kb3dOYXRpdmVIYW5kbGVzRXF1YWwoaGlkbF92ZWM8aGlkbF9oYW5kbGU+IGhhbmRsZXMxLCBoaWRsX3ZlYzxoaWRsX2hhbmRsZT4gaGFuZGxlczIpIHsKKyAgICBpZiAoaGFuZGxlczEuc2l6ZSgpICE9IGhhbmRsZXMyLnNpemUoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFuZGxlczEuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKCFpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKGhhbmRsZXMxW2ldLCBoYW5kbGVzMltpXSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBhcmVXaW5kb3dOYXRpdmVIYW5kbGVzTGVzc1RoYW4oaGlkbF92ZWM8aGlkbF9oYW5kbGU+IGhhbmRsZXMxLCBoaWRsX3ZlYzxoaWRsX2hhbmRsZT5oYW5kbGVzMikgeworICAgIGlmIChoYW5kbGVzMS5zaXplKCkgIT0gaGFuZGxlczIuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBoYW5kbGVzMS5zaXplKCkgPCBoYW5kbGVzMi5zaXplKCk7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFuZGxlczEuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUxID0gaGFuZGxlczFbaV0uZ2V0TmF0aXZlSGFuZGxlKCk7CisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlMiA9IGhhbmRsZXMyW2ldLmdldE5hdGl2ZUhhbmRsZSgpOworICAgICAgICBpZiAoIWlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwoaGFuZGxlMSwgaGFuZGxlMikpIHsKKyAgICAgICAgICAgIHJldHVybiBpc1dpbmRvd05hdGl2ZUhhbmRsZUxlc3NUaGFuKGhhbmRsZTEsIGhhbmRsZTIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworfSAvLyBuYW1lc3BhY2UgdXRpbHMKK30gLy8gbmFtZXNwYWNlIGFjYW0KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL3V0aWxzLmggYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzODlmMDMKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5oCkBAIC0wLDAgKzEsMTgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL0lDYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC9JQ2FtZXJhRGV2aWNlVXNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhRGV2aWNlLmg+CisjaW5jbHVkZSA8Q2FtZXJhTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEzLmg+CisKKyNpZm5kZWYgQ0FNRVJBX05ES19WRU5ET1JfSAorI2RlZmluZSBDQU1FUkFfTkRLX1ZFTkRPUl9ICisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0geworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgQ2FtZXJhTWV0YWRhdGEgPSBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OmhlbHBlcjo6Q2FtZXJhTWV0YWRhdGE7Cit1c2luZyBIQ2FtZXJhTWV0YWRhdGEgID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhTWV0YWRhdGE7Cit1c2luZyBTdGF0dXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlN0YXR1czsKK3VzaW5nIFRlbXBsYXRlSWQgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlRlbXBsYXRlSWQ7Cit1c2luZyBQaHlzaWNhbENhbWVyYVNldHRpbmdzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpQaHlzaWNhbENhbWVyYVNldHRpbmdzOwordXNpbmcgSFJvdGF0aW9uID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpPdXRwdXRDb25maWd1cmF0aW9uOjpSb3RhdGlvbjsKK3VzaW5nIE91dHB1dENvbmZpZ3VyYXRpb24gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6Ok91dHB1dENvbmZpZ3VyYXRpb247CisKKy8vIFV0aWxpdHkgY2xhc3Mgc28gdGhhdCBDYXB0dXJlUmVxdWVzdCBjYW4gYmUgc3RvcmVkIGJ5IHNwPD4KK3N0cnVjdCBDYXB0dXJlUmVxdWVzdCA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYXB0dXJlUmVxdWVzdCBtQ2FwdHVyZVJlcXVlc3Q7CisgIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCAqPiBtU3VyZmFjZUxpc3Q7CisgIC8vUGh5c2ljYWwgY2FtZXJhIHNldHRpbmdzIG1ldGFkYXRhIGlzIHN0b3JlZCBoZXJlLCBzaW5jZSB0aGUgY2FwdHVyZSByZXF1ZXN0CisgIC8vbWlnaHQgbm90IGNvbnRhaW4gaXQuIFRoYXQncyBzaW5jZSwgZm1xIG1pZ2h0IGhhdmUgY29uc3VtZWQgaXQuCisgIGhpZGxfdmVjPFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M+IG1QaHlzaWNhbENhbWVyYVNldHRpbmdzOworfTsKKworYm9vbCBhcmVXaW5kb3dOYXRpdmVIYW5kbGVzRXF1YWwoaGlkbF92ZWM8aGlkbF9oYW5kbGU+IGhhbmRsZXMxLCBoaWRsX3ZlYzxoaWRsX2hhbmRsZT5oYW5kbGVzMik7CisKK2Jvb2wgYXJlV2luZG93TmF0aXZlSGFuZGxlc0xlc3NUaGFuKGhpZGxfdmVjPGhpZGxfaGFuZGxlPiBoYW5kbGVzMSwgaGlkbF92ZWM8aGlkbF9oYW5kbGU+aGFuZGxlczIpOworCitib29sIGlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDEsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgyKTsKKworYm9vbCBpc1dpbmRvd05hdGl2ZUhhbmRsZUxlc3NUaGFuKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgxLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMik7CisKKy8vIENvbnZlbmllbmNlIHdyYXBwZXIgb3ZlciBpc1dpbmRvd05hdGl2ZUhhbmRsZUxlc3NUaGFuIGFuZCBpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsCitib29sIGlzV2luZG93TmF0aXZlSGFuZGxlR3JlYXRlclRoYW4oY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDEsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgyKTsKKworLy8gVXRpbGl0eSBjbGFzcyBzbyB0aGUgbmF0aXZlX2hhbmRsZV90IGNhbiBiZSBjb21wYXJlZCB3aXRoICBpdHMgY29udGVudHMgaW5zdGVhZAorLy8gb2YganVzdCByYXcgcG9pbnRlciBjb21wYXJpc29ucy4KK3N0cnVjdCBuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyIHsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKm1XaW5kb3cgPSBudWxscHRyOworCisgICAgbmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlcihuYXRpdmVfaGFuZGxlX3QgKm5oKSA6IG1XaW5kb3cobmgpIHsgfQorCisgICAgbmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlcigpID0gZGVmYXVsdDsKKworICAgIG9wZXJhdG9yIG5hdGl2ZV9oYW5kbGVfdCAqKCkgY29uc3QgeyByZXR1cm4gbVdpbmRvdzsgfQorCisgICAgYm9vbCBvcGVyYXRvciA9PShjb25zdCBuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKG1XaW5kb3csIG90aGVyLm1XaW5kb3cpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXImIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAhaXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbChtV2luZG93LCBvdGhlci5tV2luZG93KTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXImIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBpc1dpbmRvd05hdGl2ZUhhbmRsZUxlc3NUaGFuKG1XaW5kb3csIG90aGVyLm1XaW5kb3cpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgPiAoY29uc3QgbmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFpc1dpbmRvd05hdGl2ZUhhbmRsZUdyZWF0ZXJUaGFuKG1XaW5kb3csIG90aGVyLm1XaW5kb3cpOworICAgIH0KKworfTsKKworLy8gV3JhcHBlciBhcm91bmQgT3V0cHV0Q29uZmlndXJhdGlvbi4gVGhpcyBpcyBuZWVkZWQgc2luY2UgSElETAorLy8gT3V0cHV0Q29uZmlndXJhdGlvbiBpcyBhdXRvLWdlbmVyYXRlZCBhbmQgbWFya2VkIGZpbmFsLiBUaGVyZWZvcmUsIG9wZXJhdG9yCisvLyBvdmVybG9hZHMgb3V0c2lkZSB0aGUgY2xhc3MsIHdpbGwgbm90IGdldCBwaWNrZWQgYnkgY2xhbmcgd2hpbGUgdHJ5aW5nIHRvCisvLyBzdG9yZSBPdXRwdXRDb25maWd1cmF0aW9uIGluIG1hcHMvc2V0cy4KK3N0cnVjdCBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlciB7CisgICAgT3V0cHV0Q29uZmlndXJhdGlvbiBtT3V0cHV0Q29uZmlndXJhdGlvbjsKKworICAgIG9wZXJhdG9yIGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1PdXRwdXRDb25maWd1cmF0aW9uOworICAgIH0KKworICAgIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyKCkgeworICAgICAgICBtT3V0cHV0Q29uZmlndXJhdGlvbi5yb3RhdGlvbiA9IE91dHB1dENvbmZpZ3VyYXRpb246OlJvdGF0aW9uOjpSMDsKKyAgICAgICAgLy8gVGhlIG5kayBjdXJyZW50bHkgZG9lc24ndCBzdXBwb3J0IGRlZmVycmVkIHN1cmZhY2VzCisgICAgICAgIG1PdXRwdXRDb25maWd1cmF0aW9uLmlzRGVmZXJyZWQgPSBmYWxzZTsKKyAgICAgICAgbU91dHB1dENvbmZpZ3VyYXRpb24ud2lkdGggPSAwOworICAgICAgICBtT3V0cHV0Q29uZmlndXJhdGlvbi5oZWlnaHQgPSAwOworICAgICAgICAvLyBuZGsgZG9lc24ndCBzdXBwb3J0IGludGVyIE91dHB1dENvbmZpZ3VyYXRpb24gYnVmZmVyIHNoYXJpbmcuCisgICAgICAgIG1PdXRwdXRDb25maWd1cmF0aW9uLndpbmRvd0dyb3VwSWQgPSAtMTsKKyAgICB9OworCisgICAgT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXIoT3V0cHV0Q29uZmlndXJhdGlvbiAmb3V0cHV0Q29uZmlndXJhdGlvbikKKyAgICAgICAgICAgIDogbU91dHB1dENvbmZpZ3VyYXRpb24oKG91dHB1dENvbmZpZ3VyYXRpb24pKSB7IH0KKworICAgIGJvb2wgb3BlcmF0b3IgPT0oY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiAmc2VsZiA9IG1PdXRwdXRDb25maWd1cmF0aW9uOworICAgICAgICByZXR1cm4gc2VsZi5yb3RhdGlvbiA9PSBvdGhlci5yb3RhdGlvbiAmJiBzZWxmLndpbmRvd0dyb3VwSWQgPT0gb3RoZXIud2luZG93R3JvdXBJZCAmJgorICAgICAgICAgICAgICAgIHNlbGYucGh5c2ljYWxDYW1lcmFJZCA9PSBvdGhlci5waHlzaWNhbENhbWVyYUlkICYmIHNlbGYud2lkdGggPT0gb3RoZXIud2lkdGggJiYKKyAgICAgICAgICAgICAgICBzZWxmLmhlaWdodCA9PSBvdGhlci5oZWlnaHQgJiYgc2VsZi5pc0RlZmVycmVkID09IG90aGVyLmlzRGVmZXJyZWQgJiYKKyAgICAgICAgICAgICAgICBhcmVXaW5kb3dOYXRpdmVIYW5kbGVzRXF1YWwoc2VsZi53aW5kb3dIYW5kbGVzLCBvdGhlci53aW5kb3dIYW5kbGVzKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIDwgKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJm90aGVyKSBjb25zdCB7CisgICAgICAgIGlmICgqdGhpcyA9PSBvdGhlcikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJnNlbGYgPSBtT3V0cHV0Q29uZmlndXJhdGlvbjsKKyAgICAgICAgaWYgKHNlbGYud2luZG93R3JvdXBJZCAhPSBvdGhlci53aW5kb3dHcm91cElkKSB7CisgICAgICAgICAgICByZXR1cm4gc2VsZi53aW5kb3dHcm91cElkIDwgb3RoZXIud2luZG93R3JvdXBJZDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZWxmLndpZHRoICE9IG90aGVyLndpZHRoKSB7CisgICAgICAgICAgICByZXR1cm4gc2VsZi53aWR0aCA8IG90aGVyLndpZHRoOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlbGYuaGVpZ2h0ICE9IG90aGVyLmhlaWdodCkgeworICAgICAgICAgICAgcmV0dXJuIHNlbGYuaGVpZ2h0IDwgb3RoZXIuaGVpZ2h0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlbGYucm90YXRpb24gIT0gb3RoZXIucm90YXRpb24pIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc2VsZi5yb3RhdGlvbikgPCBzdGF0aWNfY2FzdDx1aW50MzJfdD4ob3RoZXIucm90YXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlbGYuaXNEZWZlcnJlZCAhPSBvdGhlci5pc0RlZmVycmVkKSB7CisgICAgICAgICAgICByZXR1cm4gc2VsZi5pc0RlZmVycmVkIDwgb3RoZXIuaXNEZWZlcnJlZDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzZWxmLnBoeXNpY2FsQ2FtZXJhSWQgIT0gb3RoZXIucGh5c2ljYWxDYW1lcmFJZCkgeworICAgICAgICAgICAgcmV0dXJuIHNlbGYucGh5c2ljYWxDYW1lcmFJZCA8IG90aGVyLnBoeXNpY2FsQ2FtZXJhSWQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFyZVdpbmRvd05hdGl2ZUhhbmRsZXNMZXNzVGhhbihzZWxmLndpbmRvd0hhbmRsZXMsIG90aGVyLndpbmRvd0hhbmRsZXMpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yID4gKGNvbnN0IE91dHB1dENvbmZpZ3VyYXRpb24gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAoKnRoaXMgIT0gb3RoZXIpICYmICEoKnRoaXMgPCBvdGhlcik7CisgICAgfQorfTsKKworLy8gQ29udmVydCBDYXB0dXJlUmVxdWVzdCB3cmFwcGFibGUgYnkgc3A8PiB0byBoaWRsIENhcHR1cmVSZXF1ZXN0LgorZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYXB0dXJlUmVxdWVzdCBjb252ZXJ0VG9IaWRsKAorICAgIGNvbnN0IENhcHR1cmVSZXF1ZXN0ICpjYXB0dXJlUmVxdWVzdCk7CisKK0hSb3RhdGlvbiBjb252ZXJ0VG9IaWRsKGludCByb3RhdGlvbik7CisKK2Jvb2wgY29udmVydEZyb21IaWRsQ2xvbmVkKGNvbnN0IEhDYW1lcmFNZXRhZGF0YSAmbWV0YWRhdGEsIENhbWVyYU1ldGFkYXRhICpyYXdNZXRhZGF0YSk7CisKKy8vIE5vdGU6IGV4aXN0aW5nIGRhdGEgaW4gZHN0IHdpbGwgYmUgZ29uZS4KK3ZvaWQgY29udmVydFRvSGlkbChjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqc3JjLCBIQ2FtZXJhTWV0YWRhdGEqIGRzdCwgYm9vbCBzaG91bGRPd24gPSBmYWxzZSk7CisKK1RlbXBsYXRlSWQgY29udmVydFRvSGlkbChBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCk7CisKK2NhbWVyYV9zdGF0dXNfdCBjb252ZXJ0RnJvbUhpZGwoU3RhdHVzIHN0YXR1cyk7CisKK30gLy8gbmFtZXNwYWNlIHV0aWxzCit9IC8vIG5hbWVzcGFjZSBhY2FtCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBDQU1FUkFfTkRLX1ZFTkRPUl9ICmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvdGVzdHMvQUltYWdlUmVhZGVyVmVuZG9yVGVzdC5jcHAgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvdGVzdHMvQUltYWdlUmVhZGVyVmVuZG9yVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdkZTMwYQotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci90ZXN0cy9BSW1hZ2VSZWFkZXJWZW5kb3JUZXN0LmNwcApAQCAtMCwwICsxLDgyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQUltYWdlUmVhZGVyVmVuZG9yVGVzdCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CisjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYUVycm9yLmg+CisjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhRGV2aWNlLmg+CisjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrSW1hZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtJbWFnZVJlYWRlci5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8VmVuZG9yVGFnRGVzY3JpcHRvci5oPgorCituYW1lc3BhY2UgeworCitzdGF0aWMgY29uc3RleHByIGludCBrRHVtbXlGZW5jZUZkID0gLTE7CitzdGF0aWMgY29uc3RleHByIGludCBrQ2FwdHVyZVdhaXRVcyA9IDEwMCAqIDEwMDA7CitzdGF0aWMgY29uc3RleHByIGludCBrQ2FwdHVyZVdhaXRSZXRyeSA9IDEwOworc3RhdGljIGNvbnN0ZXhwciBpbnQga1Rlc3RJbWFnZVdpZHRoID0gNjQwOworc3RhdGljIGNvbnN0ZXhwciBpbnQga1Rlc3RJbWFnZUhlaWdodCA9IDQ4MDsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtUZXN0SW1hZ2VGb3JtYXQgPSBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4OworCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OmhlbHBlcjo6VmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlOworCitjbGFzcyBDYW1lcmFIZWxwZXIgeworICAgcHVibGljOgorICAgIENhbWVyYUhlbHBlcihjb25zdCBjaGFyKiBpZCwgQUNhbWVyYU1hbmFnZXIgKm1hbmFnZXIpIDoKKyAgICAgICAgICAgIG1JbWdSZWFkZXJBbncobnVsbHB0ciksIG1DYW1lcmFJZChpZCksIG1DYW1lcmFNYW5hZ2VyKG1hbmFnZXIpIHt9CisgICAgfkNhbWVyYUhlbHBlcigpIHsgY2xvc2VDYW1lcmEoKTsgfQorCisgICAgc3RydWN0IFBoeXNpY2FsSW1nUmVhZGVySW5mbyB7CisgICAgICAgIGNvbnN0IGNoYXIqIHBoeXNpY2FsQ2FtZXJhSWQ7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogYW53OworICAgIH07CisgICAgaW50IGluaXRDYW1lcmEobmF0aXZlX2hhbmRsZV90KiBpbWdSZWFkZXJBbncsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbEltZ1JlYWRlckluZm8+JiBwaHlzaWNhbEltZ1JlYWRlcnMsCisgICAgICAgICAgICBib29sIHVzZVBoeXNpY2FsU2V0dGluZ3MpIHsKKyAgICAgICAgaWYgKGltZ1JlYWRlckFudyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IGluaXRpYWxpemUgY2FtZXJhIGJlZm9yZSBpbWFnZSByZWFkZXIgZ2V0IGluaXRpYWxpemVkLiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmIChtSXNDYW1lcmFSZWFkeSkgeworICAgICAgICAgICAgQUxPR0UoImluaXRDYW1lcmEgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2UuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBpbnQgcmV0OworICAgICAgICBtSW1nUmVhZGVyQW53ID0gaW1nUmVhZGVyQW53OworCisgICAgICAgIHJldCA9IEFDYW1lcmFNYW5hZ2VyX29wZW5DYW1lcmEobUNhbWVyYU1hbmFnZXIsIG1DYW1lcmFJZCwgJm1EZXZpY2VDYiwgJm1EZXZpY2UpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBtRGV2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb3BlbiBjYW1lcmEsIHJldD0lZCwgbURldmljZT0lcC4iLCByZXQsIG1EZXZpY2UpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGNhcHR1cmUgc2Vzc2lvbgorICAgICAgICByZXQgPSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfY3JlYXRlKCZtT3V0cHV0cyk7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2NyZWF0ZSBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHJldCA9IEFDYXB0dXJlU2Vzc2lvbk91dHB1dF9jcmVhdGUobUltZ1JlYWRlckFudywgJm1JbWdSZWFkZXJPdXRwdXQpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkFDYXB0dXJlU2Vzc2lvbk91dHB1dF9jcmVhdGUgZmFpbGVkLCByZXQ9JWQiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkKG1PdXRwdXRzLCBtSW1nUmVhZGVyT3V0cHV0KTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkIGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gaWRQb2ludGVyTGlzdDsKKyAgICAgICAgZm9yIChhdXRvJiBwaHlzaWNhbFN0cmVhbSA6IHBoeXNpY2FsSW1nUmVhZGVycykgeworICAgICAgICAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KiBzZXNzaW9uT3V0cHV0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHJldCA9IEFDYXB0dXJlU2Vzc2lvblBoeXNpY2FsT3V0cHV0X2NyZWF0ZShwaHlzaWNhbFN0cmVhbS5hbncsCisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsU3RyZWFtLnBoeXNpY2FsQ2FtZXJhSWQsICZzZXNzaW9uT3V0cHV0KTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBQ2FwdHVyZVNlc3Npb25QaHlzaWNhbE91dHB1dF9jcmVhdGUgZmFpbGVkLCByZXQ9JWQiLCByZXQpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgPSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkKG1PdXRwdXRzLCBzZXNzaW9uT3V0cHV0KTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9hZGQgZmFpbGVkLCByZXQ9JWQiLCByZXQpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRXh0cmFPdXRwdXRzLnB1c2hfYmFjayhzZXNzaW9uT3V0cHV0KTsKKyAgICAgICAgICAgIC8vIEFzc3VtZSB0aGF0IGF0IG1vc3Qgb25lIHBoeXNpY2FsIHN0cmVhbSBwZXIgcGh5c2ljYWwgY2FtZXJhLgorICAgICAgICAgICAgbVBoeXNpY2FsQ2FtZXJhSWRzLnB1c2hfYmFjayhwaHlzaWNhbFN0cmVhbS5waHlzaWNhbENhbWVyYUlkKTsKKyAgICAgICAgICAgIGlkUG9pbnRlckxpc3QucHVzaF9iYWNrKHBoeXNpY2FsU3RyZWFtLnBoeXNpY2FsQ2FtZXJhSWQpOworICAgICAgICB9CisgICAgICAgIEFDYW1lcmFJZExpc3QgY2FtZXJhSWRMaXN0OworICAgICAgICBjYW1lcmFJZExpc3QubnVtQ2FtZXJhcyA9IGlkUG9pbnRlckxpc3Quc2l6ZSgpOworICAgICAgICBjYW1lcmFJZExpc3QuY2FtZXJhSWRzID0gaWRQb2ludGVyTGlzdC5kYXRhKCk7CisKKyAgICAgICAgcmV0ID0gQUNhbWVyYURldmljZV9pc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKG1EZXZpY2UsIG1PdXRwdXRzKTsKKyAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LICYmIHJldCAhPSBBQ0FNRVJBX0VSUk9SX1VOU1VQUE9SVEVEX09QRVJBVElPTikgeworICAgICAgICAgICAgQUxPR0UoIkFDYW1lcmFEZXZpY2VfaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgcmV0ID0gQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbihtRGV2aWNlLCBtT3V0cHV0cywgJm1TZXNzaW9uQ2IsICZtU2Vzc2lvbik7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbiBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisKKyAgICAgICAgLy8gQ3JlYXRlIGNhcHR1cmUgcmVxdWVzdAorICAgICAgICBpZiAodXNlUGh5c2ljYWxTZXR0aW5ncykgeworICAgICAgICAgICAgcmV0ID0gQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHMobURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgVEVNUExBVEVfU1RJTExfQ0FQVFVSRSwgJmNhbWVyYUlkTGlzdCwgJm1TdGlsbFJlcXVlc3QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdChtRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICBURU1QTEFURV9TVElMTF9DQVBUVVJFLCAmbVN0aWxsUmVxdWVzdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0IGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gQUNhbWVyYU91dHB1dFRhcmdldF9jcmVhdGUobUltZ1JlYWRlckFudywgJm1SZXFJbWdSZWFkZXJPdXRwdXQpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlIGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gQUNhcHR1cmVSZXF1ZXN0X2FkZFRhcmdldChtU3RpbGxSZXF1ZXN0LCBtUmVxSW1nUmVhZGVyT3V0cHV0KTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQ2FwdHVyZVJlcXVlc3RfYWRkVGFyZ2V0IGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGF1dG8mIHBoeXNpY2FsU3RyZWFtIDogcGh5c2ljYWxJbWdSZWFkZXJzKSB7CisgICAgICAgICAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0KiBvdXRwdXRUYXJnZXQgPSBudWxscHRyOworICAgICAgICAgICAgcmV0ID0gQUNhbWVyYU91dHB1dFRhcmdldF9jcmVhdGUocGh5c2ljYWxTdHJlYW0uYW53LCAmb3V0cHV0VGFyZ2V0KTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlIGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0ID0gQUNhcHR1cmVSZXF1ZXN0X2FkZFRhcmdldChtU3RpbGxSZXF1ZXN0LCBvdXRwdXRUYXJnZXQpOworICAgICAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQUNhcHR1cmVSZXF1ZXN0X2FkZFRhcmdldCBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1SZXFFeHRyYU91dHB1dHMucHVzaF9iYWNrKG91dHB1dFRhcmdldCk7CisgICAgICAgIH0KKworICAgICAgICBtSXNDYW1lcmFSZWFkeSA9IHRydWU7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworCisgICAgYm9vbCBpc0NhbWVyYVJlYWR5KCkgeyByZXR1cm4gbUlzQ2FtZXJhUmVhZHk7IH0KKworICAgIHZvaWQgY2xvc2VDYW1lcmEoKSB7CisgICAgICAgIC8vIERlc3Ryb3kgY2FwdHVyZSByZXF1ZXN0CisgICAgICAgIGlmIChtUmVxSW1nUmVhZGVyT3V0cHV0KSB7CisgICAgICAgICAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2ZyZWUobVJlcUltZ1JlYWRlck91dHB1dCk7CisgICAgICAgICAgICBtUmVxSW1nUmVhZGVyT3V0cHV0ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGF1dG8mIG91dHB1dFRhcmdldCA6IG1SZXFFeHRyYU91dHB1dHMpIHsKKyAgICAgICAgICAgIEFDYW1lcmFPdXRwdXRUYXJnZXRfZnJlZShvdXRwdXRUYXJnZXQpOworICAgICAgICB9CisgICAgICAgIG1SZXFFeHRyYU91dHB1dHMuY2xlYXIoKTsKKyAgICAgICAgaWYgKG1TdGlsbFJlcXVlc3QpIHsKKyAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdF9mcmVlKG1TdGlsbFJlcXVlc3QpOworICAgICAgICAgICAgbVN0aWxsUmVxdWVzdCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgLy8gRGVzdHJveSBjYXB0dXJlIHNlc3Npb24KKyAgICAgICAgaWYgKG1TZXNzaW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jbG9zZShtU2Vzc2lvbik7CisgICAgICAgICAgICBtU2Vzc2lvbiA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1JbWdSZWFkZXJPdXRwdXQpIHsKKyAgICAgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dF9mcmVlKG1JbWdSZWFkZXJPdXRwdXQpOworICAgICAgICAgICAgbUltZ1JlYWRlck91dHB1dCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChhdXRvJiBleHRyYU91dHB1dCA6IG1FeHRyYU91dHB1dHMpIHsKKyAgICAgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dF9mcmVlKGV4dHJhT3V0cHV0KTsKKyAgICAgICAgfQorICAgICAgICBtRXh0cmFPdXRwdXRzLmNsZWFyKCk7CisgICAgICAgIGlmIChtT3V0cHV0cykgeworICAgICAgICAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2ZyZWUobU91dHB1dHMpOworICAgICAgICAgICAgbU91dHB1dHMgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIC8vIERlc3Ryb3kgY2FtZXJhIGRldmljZQorICAgICAgICBpZiAobURldmljZSkgeworICAgICAgICAgICAgQUNhbWVyYURldmljZV9jbG9zZShtRGV2aWNlKTsKKyAgICAgICAgICAgIG1EZXZpY2UgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIG1Jc0NhbWVyYVJlYWR5ID0gZmFsc2U7CisgICAgfQorCisgICAgaW50IHRha2VQaWN0dXJlKCkgeworICAgICAgICBpbnQgc2VxSWQ7CisgICAgICAgIHJldHVybiBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZShtU2Vzc2lvbiwgJm1DYXB0dXJlQ2FsbGJhY2tzLCAxLCAmbVN0aWxsUmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZXFJZCk7CisgICAgfQorCisgICAgaW50IHRha2VMb2dpY2FsQ2FtZXJhUGljdHVyZSgpIHsKKyAgICAgICAgaW50IHNlcUlkOworICAgICAgICByZXR1cm4gQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZShtU2Vzc2lvbiwgJm1Mb2dpY2FsQ2FwdHVyZUNhbGxiYWNrcywKKyAgICAgICAgICAgICAgICAxLCAmbVN0aWxsUmVxdWVzdCwgJnNlcUlkKTsKKyAgICB9CisKKyAgICBib29sIGNoZWNrQ2FsbGJhY2tzKGludCBwaWN0dXJlQ291bnQpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgaWYgKG1Db21wbGV0ZWRDYXB0dXJlQ2FsbGJhY2tDb3VudCAhPSBwaWN0dXJlQ291bnQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb21wbGV0ZWQgY2FwdHVyZSBjYWxsYWJhY2sgY291bnQgbm90IGFzIGV4cGVjdGVkLiBleHBlY3RlZCAlZCBhY3R1YWwgJWQiLAorICAgICAgICAgICAgICAgICAgcGljdHVyZUNvdW50LCBtQ29tcGxldGVkQ2FwdHVyZUNhbGxiYWNrQ291bnQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHN0YXRpYyB2b2lkIG9uRGV2aWNlRGlzY29ubmVjdGVkKHZvaWQqIC8qb2JqKi8sIEFDYW1lcmFEZXZpY2UqIC8qZGV2aWNlKi8pIHt9CisKKyAgICBzdGF0aWMgdm9pZCBvbkRldmljZUVycm9yKHZvaWQqIC8qb2JqKi8sIEFDYW1lcmFEZXZpY2UqIC8qZGV2aWNlKi8sIGludCAvKmVycm9yQ29kZSovKSB7fQorCisgICAgc3RhdGljIHZvaWQgb25TZXNzaW9uQ2xvc2VkKHZvaWQqIC8qb2JqKi8sIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogLypzZXNzaW9uKi8pIHt9CisKKyAgICBzdGF0aWMgdm9pZCBvblNlc3Npb25SZWFkeSh2b2lkKiAvKm9iaiovLCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIC8qc2Vzc2lvbiovKSB7fQorCisgICAgc3RhdGljIHZvaWQgb25TZXNzaW9uQWN0aXZlKHZvaWQqIC8qb2JqKi8sIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogLypzZXNzaW9uKi8pIHt9CisKKyAgIHByaXZhdGU6CisgICAgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyBtRGV2aWNlQ2J7dGhpcywgb25EZXZpY2VEaXNjb25uZWN0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25EZXZpY2VFcnJvcn07CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzIG1TZXNzaW9uQ2J7CisgICAgICAgIHRoaXMsIG9uU2Vzc2lvbkNsb3NlZCwgb25TZXNzaW9uUmVhZHksIG9uU2Vzc2lvbkFjdGl2ZX07CisKKyAgICBuYXRpdmVfaGFuZGxlX3QqIG1JbWdSZWFkZXJBbncgPSBudWxscHRyOyAgLy8gbm90IG93bmVkIGJ5IHVzLgorCisgICAgLy8gQ2FtZXJhIGRldmljZQorICAgIEFDYW1lcmFEZXZpY2UqIG1EZXZpY2UgPSBudWxscHRyOworICAgIC8vIENhcHR1cmUgc2Vzc2lvbgorICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogbU91dHB1dHMgPSBudWxscHRyOworICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dCogbUltZ1JlYWRlck91dHB1dCA9IG51bGxwdHI7CisgICAgc3RkOjp2ZWN0b3I8QUNhcHR1cmVTZXNzaW9uT3V0cHV0Kj4gbUV4dHJhT3V0cHV0czsKKworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogbVNlc3Npb24gPSBudWxscHRyOworICAgIC8vIENhcHR1cmUgcmVxdWVzdAorICAgIEFDYXB0dXJlUmVxdWVzdCogbVN0aWxsUmVxdWVzdCA9IG51bGxwdHI7CisgICAgQUNhbWVyYU91dHB1dFRhcmdldCogbVJlcUltZ1JlYWRlck91dHB1dCA9IG51bGxwdHI7CisgICAgc3RkOjp2ZWN0b3I8QUNhbWVyYU91dHB1dFRhcmdldCo+IG1SZXFFeHRyYU91dHB1dHM7CisKKyAgICBib29sIG1Jc0NhbWVyYVJlYWR5ID0gZmFsc2U7CisgICAgY29uc3QgY2hhciogbUNhbWVyYUlkOworICAgIEFDYW1lcmFNYW5hZ2VyKiBtQ2FtZXJhTWFuYWdlcjsKKyAgICBpbnQgbUNvbXBsZXRlZENhcHR1cmVDYWxsYmFja0NvdW50ID0gMDsKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyBtQ2FwdHVyZUNhbGxiYWNrcyA9IHsKKyAgICAgICAgLy8gVE9ETzogQWRkIHRlc3RzIGZvciBvdGhlciBjYWxsYmFja3MKKyAgICAgICAgdGhpcywgLy8gY29udGV4dAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVTdGFydGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVByb2dyZXNzZWQKKyAgICAgICAgW10odm9pZCogY3R4ICwgQUNhbWVyYUNhcHR1cmVTZXNzaW9uICosIEFDYXB0dXJlUmVxdWVzdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUNhbWVyYU1ldGFkYXRhICopIHsKKyAgICAgICAgICAgIENhbWVyYUhlbHBlciAqY2ggPSBzdGF0aWNfY2FzdDxDYW1lcmFIZWxwZXIgKj4oY3R4KTsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGNoLT5tTXV0ZXgpOworICAgICAgICAgICAgY2gtPm1Db21wbGV0ZWRDYXB0dXJlQ2FsbGJhY2tDb3VudCsrOworICAgICAgICB9LAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVGYWlsZWQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZUJ1ZmZlckxvc3QKKyAgICB9OworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1QaHlzaWNhbENhbWVyYUlkczsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzIG1Mb2dpY2FsQ2FwdHVyZUNhbGxiYWNrcyA9IHsKKyAgICAgICAgLy8gVE9ETzogQWRkIHRlc3RzIGZvciBvdGhlciBjYWxsYmFja3MKKyAgICAgICAgdGhpcywgLy8gY29udGV4dAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVTdGFydGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVByb2dyZXNzZWQKKyAgICAgICAgW10odm9pZCogY3R4ICwgQUNhbWVyYUNhcHR1cmVTZXNzaW9uICosIEFDYXB0dXJlUmVxdWVzdCAqLAorICAgICAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFNZXRhZGF0YSAqLCBzaXplX3QgcGh5c2ljYWxSZXN1bHRDb3VudCwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiogcGh5c2ljYWxDYW1lcmFJZHMsIGNvbnN0IEFDYW1lcmFNZXRhZGF0YSoqIHBoeXNpY2FsUmVzdWx0cykgeworICAgICAgICAgICAgQ2FtZXJhSGVscGVyICpjaCA9IHN0YXRpY19jYXN0PENhbWVyYUhlbHBlciAqPihjdHgpOworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soY2gtPm1NdXRleCk7CisgICAgICAgICAgICBBU1NFUlRfRVEocGh5c2ljYWxSZXN1bHRDb3VudCwgY2gtPm1QaHlzaWNhbENhbWVyYUlkcy5zaXplKCkpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzaWNhbFJlc3VsdENvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShwaHlzaWNhbENhbWVyYUlkc1tpXSAhPSBudWxscHRyKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShwaHlzaWNhbFJlc3VsdHNbaV0gIT0gbnVsbHB0cik7CisgICAgICAgICAgICAgICAgQVNTRVJUX05FKHN0ZDo6ZmluZChjaC0+bVBoeXNpY2FsQ2FtZXJhSWRzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICBjaC0+bVBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpLCBwaHlzaWNhbENhbWVyYUlkc1tpXSksCisgICAgICAgICAgICAgICAgICAgICAgICBjaC0+bVBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpKTsKKworICAgICAgICAgICAgICAgIC8vIFZlcmlmeSBmcmFtZU51bWJlciBhbmQgc2Vuc29yVGltZXN0YW1wIGV4aXN0IGluIHBoeXNpY2FsCisgICAgICAgICAgICAgICAgLy8gcmVzdWx0IG1ldGFkYXRhCisgICAgICAgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2NvbnN0X2VudHJ5IGVudHJ5OworICAgICAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9nZXRDb25zdEVudHJ5KAorICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxSZXN1bHRzW2ldLCBBQ0FNRVJBX1NZTkNfRlJBTUVfTlVNQkVSLCAmZW50cnkpOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShlbnRyeS5jb3VudCwgMSk7CisgICAgICAgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2dldENvbnN0RW50cnkoCisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbFJlc3VsdHNbaV0sIEFDQU1FUkFfU0VOU09SX1RJTUVTVEFNUCwgJmVudHJ5KTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoZW50cnkuY291bnQsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2gtPm1Db21wbGV0ZWRDYXB0dXJlQ2FsbGJhY2tDb3VudCsrOworICAgICAgICB9LAorICAgICAgICBbXSAodm9pZCAqIC8qY3R4Ki8sIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogLypzZXNzaW9uKi8sIEFDYXB0dXJlUmVxdWVzdCogLypyZXF1ZXN0Ki8sCisgICAgICAgICAgICAgICAgQUxvZ2ljYWxDYW1lcmFDYXB0dXJlRmFpbHVyZSogZmFpbHVyZSkgeworICAgICAgICAgICAgaWYgKGZhaWx1cmUtPnBoeXNpY2FsQ2FtZXJhSWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiJXM6IFBoeXNpY2FsIGNhbWVyYSBpZDogJXMgcmVzdWx0IGZhaWx1cmUiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlLT5waHlzaWNhbENhbWVyYUlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZUJ1ZmZlckxvc3QKKyAgICB9OworfTsKKworY2xhc3MgSW1hZ2VSZWFkZXJUZXN0Q2FzZSB7CisgICBwdWJsaWM6CisgICAgSW1hZ2VSZWFkZXJUZXN0Q2FzZShpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhJbWFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFzeW5jKQorICAgICAgICA6IG1XaWR0aCh3aWR0aCksCisgICAgICAgICAgbUhlaWdodChoZWlnaHQpLAorICAgICAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKKyAgICAgICAgICBtVXNhZ2UodXNhZ2UpLAorICAgICAgICAgIG1NYXhJbWFnZXMobWF4SW1hZ2VzKSwKKyAgICAgICAgICBtQXN5bmMoYXN5bmMpIHt9CisKKyAgICB+SW1hZ2VSZWFkZXJUZXN0Q2FzZSgpIHsKKyAgICAgICAgaWYgKG1JbWdSZWFkZXJBbncpIHsKKyAgICAgICAgICAgIEFJbWFnZVJlYWRlcl9kZWxldGUobUltZ1JlYWRlcik7CisgICAgICAgICAgICAvLyBObyBuZWVkIHRvIGNhbGwgbmF0aXZlX2hhbmRsZV90X3JlbGVhc2Ugb24gaW1hZ2VSZWFkZXJBbncKKyAgICAgICAgfQorICAgIH0KKworICAgIGludCBpbml0SW1hZ2VSZWFkZXIoKSB7CisgICAgICAgIGlmIChtSW1nUmVhZGVyICE9IG51bGxwdHIgfHwgbUltZ1JlYWRlckFudyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IHJlLWluaXRhbGl6ZSBpbWFnZSByZWFkZXIsIG1JbWdSZWFkZXI9JXAsIG1JbWdSZWFkZXJBbnc9JXAiLCBtSW1nUmVhZGVyLAorICAgICAgICAgICAgICAgICAgbUltZ1JlYWRlckFudyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBtZWRpYV9zdGF0dXNfdCByZXQgPSBBSW1hZ2VSZWFkZXJfbmV3V2l0aFVzYWdlKAorICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCwgbUZvcm1hdCwgbVVzYWdlLCBtTWF4SW1hZ2VzLCAmbUltZ1JlYWRlcik7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LIHx8IG1JbWdSZWFkZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgbmV3IEFJbWFnZVJlYWRlciwgcmV0PSVkLCBtSW1nUmVhZGVyPSVwIiwgcmV0LCBtSW1nUmVhZGVyKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IEFJbWFnZVJlYWRlcl9zZXRJbWFnZUxpc3RlbmVyKG1JbWdSZWFkZXIsICZtUmVhZGVyQXZhaWxhYmxlQ2IpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgaW1hZ2UgYXZhaWxhYmxlIGxpc3RlbmVyLCByZXQ9JWQuIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfc2V0QnVmZmVyUmVtb3ZlZExpc3RlbmVyKG1JbWdSZWFkZXIsICZtUmVhZGVyRGV0YWNoZWRDYik7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBidWZmZXIgZGV0YWNoaW5nIGxpc3RlbmVyLCByZXQ9JWQuIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfZ2V0V2luZG93TmF0aXZlSGFuZGxlKG1JbWdSZWFkZXIsICZtSW1nUmVhZGVyQW53KTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0sgfHwgbUltZ1JlYWRlckFudyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBuYXRpdmVfaGFuZGxlX3QgZnJvbSBBSW1hZ2VSZWFkZXIsIHJldD0lZCwgbUltZ1JlYWRlckFudz0lcC4iLCByZXQsCisgICAgICAgICAgICAgICAgICBtSW1nUmVhZGVyQW53KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIG5hdGl2ZV9oYW5kbGVfdCogZ2V0TmF0aXZlV2luZG93KCkgeyByZXR1cm4gbUltZ1JlYWRlckFudzsgfQorCisgICAgaW50IGdldEFjcXVpcmVkSW1hZ2VDb3VudCgpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgcmV0dXJuIG1BY3F1aXJlZEltYWdlQ291bnQ7CisgICAgfQorCisgICAgdm9pZCBIYW5kbGVJbWFnZUF2YWlsYWJsZShBSW1hZ2VSZWFkZXIqIHJlYWRlcikgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworCisgICAgICAgIEFJbWFnZSogb3V0SW1hZ2UgPSBudWxscHRyOworICAgICAgICBtZWRpYV9zdGF0dXNfdCByZXQ7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIEFJbWFnZSB3aWxsIGJlIGRlbGV0ZWQgYXV0b21hdGljYWxseSB3aGVuIGl0IGdvZXMgb3V0IG9mCisgICAgICAgIC8vIHNjb3BlLgorICAgICAgICBhdXRvIGltYWdlRGVsZXRlciA9IFt0aGlzXShBSW1hZ2UqIGltZykgeworICAgICAgICAgICAgaWYgKG1Bc3luYykgeworICAgICAgICAgICAgICAgIEFJbWFnZV9kZWxldGVBc3luYyhpbWcsIGtEdW1teUZlbmNlRmQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBSW1hZ2VfZGVsZXRlKGltZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBSW1hZ2UsIGRlY2x0eXBlKGltYWdlRGVsZXRlcik+IGltZyhudWxscHRyLCBpbWFnZURlbGV0ZXIpOworCisgICAgICAgIGlmIChtQXN5bmMpIHsKKyAgICAgICAgICAgIGludCBvdXRGZW5jZUZkID0gMDsKKyAgICAgICAgICAgIC8vIFZlcml0eSB0aGF0IG91dEZlbmNlRmQncyB2YWx1ZSB3aWxsIGJlIGNoYW5nZWQgYnkKKyAgICAgICAgICAgIC8vIEFJbWFnZVJlYWRlcl9hY3F1aXJlTmV4dEltYWdlQXN5bmMuCisgICAgICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfYWNxdWlyZU5leHRJbWFnZUFzeW5jKHJlYWRlciwgJm91dEltYWdlLCAmb3V0RmVuY2VGZCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBvdXRJbWFnZSA9PSBudWxscHRyIHx8IG91dEZlbmNlRmQgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWNxdWlyZSBpbWFnZSwgcmV0PSVkLCBvdXRJYW1nZT0lcCwgb3V0RmVuY2VGZD0lZC4iLCByZXQsIG91dEltYWdlLAorICAgICAgICAgICAgICAgICAgICAgIG91dEZlbmNlRmQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGltZy5yZXNldChvdXRJbWFnZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfYWNxdWlyZU5leHRJbWFnZShyZWFkZXIsICZvdXRJbWFnZSk7CisgICAgICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBvdXRJbWFnZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhY3F1aXJlIGltYWdlLCByZXQ9JWQsIG91dElhbWdlPSVwLiIsIHJldCwgb3V0SW1hZ2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGltZy5yZXNldChvdXRJbWFnZSk7CisgICAgICAgIH0KKworICAgICAgICBBSGFyZHdhcmVCdWZmZXIqIG91dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIHJldCA9IEFJbWFnZV9nZXRIYXJkd2FyZUJ1ZmZlcihpbWcuZ2V0KCksICZvdXRCdWZmZXIpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBvdXRCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxkIHRvIGdldCBoYXJkd2FyZSBidWZmZXIsIHJldD0lZCwgb3V0QnVmZmVyPSVwLiIsIHJldCwgb3V0QnVmZmVyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vIG5lZWQgdG8gcmVsZWFzZSBBSGFyZHdhcmVCdWZmZXIsIHNpbmNlIHdlIGRvbid0IGFjcXVpcmUgYWRkaXRpb25hbAorICAgICAgICAvLyByZWZlcmVuY2UgdG8gaXQuCisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjIG91dERlc2M7CisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9kZXNjcmliZShvdXRCdWZmZXIsICZvdXREZXNjKTsKKyAgICAgICAgaW50MzJfdCBpbWFnZVdpZHRoID0gMDsKKyAgICAgICAgaW50MzJfdCBpbWFnZUhlaWdodCA9IDA7CisgICAgICAgIGludDMyX3QgYnVmZmVyV2lkdGggPSBzdGF0aWNfY2FzdDxpbnQzMl90PihvdXREZXNjLndpZHRoKTsKKyAgICAgICAgaW50MzJfdCBidWZmZXJIZWlnaHQgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihvdXREZXNjLmhlaWdodCk7CisKKyAgICAgICAgQUltYWdlX2dldFdpZHRoKG91dEltYWdlLCAmaW1hZ2VXaWR0aCk7CisgICAgICAgIEFJbWFnZV9nZXRIZWlnaHQob3V0SW1hZ2UsICZpbWFnZUhlaWdodCk7CisgICAgICAgIGlmIChpbWFnZVdpZHRoICE9IG1XaWR0aCB8fCBpbWFnZUhlaWdodCAhPSBtSGVpZ2h0KSB7CisgICAgICAgICAgICBBTE9HRSgiTWlzbWF0Y2hlZCBvdXRwdXQgaW1hZ2UgZGltZW5zaW9uOiBleHBlY3RlZD0lZHglZCwgYWN0dWFsPSVkeCVkIiwgbVdpZHRoLAorICAgICAgICAgICAgICAgICAgbUhlaWdodCwgaW1hZ2VXaWR0aCwgaW1hZ2VIZWlnaHQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Gb3JtYXQgPT0gQUlNQUdFX0ZPUk1BVF9SR0JBXzg4ODggfHwKKyAgICAgICAgICAgIG1Gb3JtYXQgPT0gQUlNQUdFX0ZPUk1BVF9SR0JYXzg4ODggfHwKKyAgICAgICAgICAgIG1Gb3JtYXQgPT0gQUlNQUdFX0ZPUk1BVF9SR0JfODg4IHx8CisgICAgICAgICAgICBtRm9ybWF0ID09IEFJTUFHRV9GT1JNQVRfUkdCXzU2NSB8fAorICAgICAgICAgICAgbUZvcm1hdCA9PSBBSU1BR0VfRk9STUFUX1JHQkFfRlAxNiB8fAorICAgICAgICAgICAgbUZvcm1hdCA9PSBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4IHx8CisgICAgICAgICAgICBtRm9ybWF0ID09IEFJTUFHRV9GT1JNQVRfWTgpIHsKKyAgICAgICAgICAgIC8vIENoZWNrIG91dHB1dCBidWZmZXIgZGltZW5zaW9uIGZvciBjZXJ0YWluIGZvcm1hdHMuIERvbid0IGRvIHRoaXMgZm9yIGJsb2IgYmFzZWQKKyAgICAgICAgICAgIC8vIGZvcm1hdHMuCisgICAgICAgICAgICBpZiAoYnVmZmVyV2lkdGggIT0gbVdpZHRoIHx8IGJ1ZmZlckhlaWdodCAhPSBtSGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIk1pc21hdGNoZWQgb3V0cHV0IGJ1ZmZlciBkaW1lbnNpb246IGV4cGVjdGVkPSVkeCVkLCBhY3R1YWw9JWR4JWQiLCBtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgbUhlaWdodCwgYnVmZmVyV2lkdGgsIGJ1ZmZlckhlaWdodCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKChvdXREZXNjLnVzYWdlICYgbVVzYWdlKSAhPSBtVXNhZ2UpIHsKKyAgICAgICAgICAgIEFMT0dFKCJNaXNtYXRjaGVkIG91dHB1dCBidWZmZXIgdXNhZ2U6IGFjdHVhbCAoJSIgUFJJdTY0ICIpLCBleHBlY3RlZCAoJSIgUFJJdTY0ICIpIiwKKyAgICAgICAgICAgICAgICAgIG91dERlc2MudXNhZ2UsIG1Vc2FnZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB1aW50OF90KiBkYXRhID0gbnVsbHB0cjsKKyAgICAgICAgaW50IGRhdGFMZW5ndGggPSAwOworICAgICAgICByZXQgPSBBSW1hZ2VfZ2V0UGxhbmVEYXRhKGltZy5nZXQoKSwgMCwgJmRhdGEsICZkYXRhTGVuZ3RoKTsKKyAgICAgICAgaWYgKG1Vc2FnZSAmIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfUkVBRF9PRlRFTikgeworICAgICAgICAgICAgLy8gV2hlbiB3ZSBoYXZlIENQVV9SRUFEX09GVEVOIHVzYWdlIGJpdHMsIHdlIGNhbiBsb2NrIHRoZSBpbWFnZS4KKyAgICAgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LIHx8IGRhdGEgPT0gbnVsbHB0ciB8fCBkYXRhTGVuZ3RoIDwgMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWNjZXNzIENQVSBkYXRhLCByZXQ9JWQsIGRhdGE9JXAsIGRhdGFMZW5ndGg9JWQiLCByZXQsIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgZGF0YUxlbmd0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfSU1HUkVBREVSX0NBTk5PVF9MT0NLX0lNQUdFIHx8IGRhdGEgIT0gbnVsbHB0ciB8fCBkYXRhTGVuZ3RoICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiU2hvdWxkbid0IGJlIGFibGUgdG8gYWNjZXNzIENQVSBkYXRhLCByZXQ9JWQsIGRhdGE9JXAsIGRhdGFMZW5ndGg9JWQiLCByZXQsCisgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgZGF0YUxlbmd0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIE9ubHkgaW5jcmVhc2UgbUFjcXVpcmVkSW1hZ2VDb3VudCBpZiBhbGwgY2hlY2tzIHBhc3MuCisgICAgICAgIG1BY3F1aXJlZEltYWdlQ291bnQrKzsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBvbkltYWdlQXZhaWxhYmxlKHZvaWQqIG9iaiwgQUltYWdlUmVhZGVyKiByZWFkZXIpIHsKKyAgICAgICAgSW1hZ2VSZWFkZXJUZXN0Q2FzZSogdGhpeiA9IHJlaW50ZXJwcmV0X2Nhc3Q8SW1hZ2VSZWFkZXJUZXN0Q2FzZSo+KG9iaik7CisgICAgICAgIHRoaXotPkhhbmRsZUltYWdlQXZhaWxhYmxlKHJlYWRlcik7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQKKyAgICBvbkJ1ZmZlclJlbW92ZWQodm9pZCogLypvYmoqLywgQUltYWdlUmVhZGVyKiAvKnJlYWRlciovLCBBSGFyZHdhcmVCdWZmZXIqIC8qYnVmZmVyKi8pIHsKKyAgICAgICAgLy8gTm8tb3AsIGp1c3QgdG8gY2hlY2sgdGhlIGxpc3RlbmVyIGNhbiBiZSBzZXQgcHJvcGVybHkuCisgICAgfQorCisgICBwcml2YXRlOgorICAgIGludDMyX3QgbVdpZHRoOworICAgIGludDMyX3QgbUhlaWdodDsKKyAgICBpbnQzMl90IG1Gb3JtYXQ7CisgICAgdWludDY0X3QgbVVzYWdlOworICAgIGludDMyX3QgbU1heEltYWdlczsKKyAgICBib29sIG1Bc3luYzsKKworICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIGludCBtQWNxdWlyZWRJbWFnZUNvdW50ezB9OworCisgICAgQUltYWdlUmVhZGVyKiBtSW1nUmVhZGVyID0gbnVsbHB0cjsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIG1JbWdSZWFkZXJBbncgPSBudWxscHRyOworCisgICAgQUltYWdlUmVhZGVyX0ltYWdlTGlzdGVuZXIgbVJlYWRlckF2YWlsYWJsZUNie3RoaXMsIG9uSW1hZ2VBdmFpbGFibGV9OworICAgIEFJbWFnZVJlYWRlcl9CdWZmZXJSZW1vdmVkTGlzdGVuZXIgbVJlYWRlckRldGFjaGVkQ2J7dGhpcywgb25CdWZmZXJSZW1vdmVkfTsKK307CisKKworY2xhc3MgQUltYWdlUmVhZGVyVmVuZG9yVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICBwdWJsaWM6CisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNhbWVyYU1hbmFnZXIgPSBBQ2FtZXJhTWFuYWdlcl9jcmVhdGUoKTsKKyAgICAgICAgaWYgKG1DYW1lcmFNYW5hZ2VyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIEFDYW1lcmFNYW5hZ2VyLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUlkTGlzdChtQ2FtZXJhTWFuYWdlciwgJm1DYW1lcmFJZExpc3QpOworICAgICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IGNhbWVyYUlkTGlzdDogcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiBBZGQgbW9yZSByaWdvcm91cyB0ZXN0cyBmb3IgdmVuZG9yIHRhZ3MKKyAgICAgICAgQVNTRVJUX05FKFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZTo6Z2V0R2xvYmFsVmVuZG9yVGFnQ2FjaGUoKSwgbnVsbHB0cik7CisgICAgICAgIGlmIChtQ2FtZXJhSWRMaXN0LT5udW1DYW1lcmFzIDwgMSkgeworICAgICAgICAgICAgQUxPR1coIkRldmljZSBoYXMgbm8gY2FtZXJhIG9uIGJvYXJkLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIC8vIERlc3Ryb3kgY2FtZXJhIG1hbmFnZXIKKyAgICAgICAgaWYgKG1DYW1lcmFJZExpc3QpIHsKKyAgICAgICAgICAgIEFDYW1lcmFNYW5hZ2VyX2RlbGV0ZUNhbWVyYUlkTGlzdChtQ2FtZXJhSWRMaXN0KTsKKyAgICAgICAgICAgIG1DYW1lcmFJZExpc3QgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGlmIChtQ2FtZXJhTWFuYWdlcikgeworICAgICAgICAgICAgQUNhbWVyYU1hbmFnZXJfZGVsZXRlKG1DYW1lcmFNYW5hZ2VyKTsKKyAgICAgICAgICAgIG1DYW1lcmFNYW5hZ2VyID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgdGFrZVBpY3R1cmVzKGNvbnN0IGNoYXIqIGlkLCB1aW50NjRfdCByZWFkZXJVc2FnZSwgaW50IHJlYWRlck1heEltYWdlcywKKyAgICAgICAgICAgIGJvb2wgcmVhZGVyQXN5bmMsIGludCBwaWN0dXJlQ291bnQpIHsKKyAgICAgICAgaW50IHJldCA9IDA7CisKKyAgICAgICAgSW1hZ2VSZWFkZXJUZXN0Q2FzZSB0ZXN0Q2FzZSgKKyAgICAgICAgICAgICAgICBrVGVzdEltYWdlV2lkdGgsIGtUZXN0SW1hZ2VIZWlnaHQsIGtUZXN0SW1hZ2VGb3JtYXQsIHJlYWRlclVzYWdlLCByZWFkZXJNYXhJbWFnZXMsCisgICAgICAgICAgICAgICAgcmVhZGVyQXN5bmMpOworICAgICAgICByZXQgPSB0ZXN0Q2FzZS5pbml0SW1hZ2VSZWFkZXIoKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBJbWFnZVJlYWRlciIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQ2FtZXJhSGVscGVyIGNhbWVyYUhlbHBlcihpZCwgbUNhbWVyYU1hbmFnZXIpOworICAgICAgICByZXQgPSBjYW1lcmFIZWxwZXIuaW5pdENhbWVyYSh0ZXN0Q2FzZS5nZXROYXRpdmVXaW5kb3coKSwKKyAgICAgICAgICAgICAgICB7fS8qcGh5c2ljYWxJbWFnZVJlYWRlcnMqLywgZmFsc2UvKnVzZVBoeXNpY2FsU2V0dGluZ3MqLyk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGluaXRpYWxpemUgY2FtZXJhIGhlbHBlciIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFjYW1lcmFIZWxwZXIuaXNDYW1lcmFSZWFkeSgpKSB7CisgICAgICAgICAgICBBTE9HVygiQ2FtZXJhIGlzIG5vdCByZWFkeSBhZnRlciBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uLiBJdCdzIGVpdGhlciBkdWUgdG8gY2FtZXJhICIKKyAgICAgICAgICAgICAgICAgICJvbiBib2FyZCBsYWNrcyBCQUNLV0FSRFNfQ09NUEFUSUJMRSBjYXBhYmlsaXR5IG9yIHRoZSBkZXZpY2UgZG9lcyBub3QgaGF2ZSAiCisgICAgICAgICAgICAgICAgICAiY2FtZXJhIG9uIGJvYXJkLiIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpY3R1cmVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICByZXQgPSBjYW1lcmFIZWxwZXIudGFrZVBpY3R1cmUoKTsKKyAgICAgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byB0YWtlIHBpY3R1cmUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBTbGVlcCB1bnRpbCBhbGwgY2FwdHVyZSBmaW5pc2hlZAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtDYXB0dXJlV2FpdFJldHJ5ICogcGljdHVyZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHVzbGVlcChrQ2FwdHVyZVdhaXRVcyk7CisgICAgICAgICAgICBpZiAodGVzdENhc2UuZ2V0QWNxdWlyZWRJbWFnZUNvdW50KCkgPT0gcGljdHVyZUNvdW50KSB7CisgICAgICAgICAgICAgICAgQUxPR0koIlNlc3Npb24gdGFrZSB+JWQgbXMgdG8gY2FwdHVyZSAlZCBpbWFnZXMiLCBpICoga0NhcHR1cmVXYWl0VXMgLyAxMDAwLAorICAgICAgICAgICAgICAgICAgICAgIHBpY3R1cmVDb3VudCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRlc3RDYXNlLmdldEFjcXVpcmVkSW1hZ2VDb3VudCgpID09IHBpY3R1cmVDb3VudCAmJgorICAgICAgICAgICAgICAgIGNhbWVyYUhlbHBlci5jaGVja0NhbGxiYWNrcyhwaWN0dXJlQ291bnQpOworICAgIH0KKworICAgIGJvb2wgdGVzdFRha2VQaWN0dXJlc05hdGl2ZShjb25zdCBjaGFyKiBpZCkgeworICAgICAgICBmb3IgKGF1dG8mIHJlYWRlclVzYWdlIDoKKyAgICAgICAgICAgICB7QUhBUkRXQVJFQlVGRkVSX1VTQUdFX0NQVV9SRUFEX09GVEVOfSkgeworICAgICAgICAgICAgZm9yIChhdXRvJiByZWFkZXJNYXhJbWFnZXMgOiB7MSwgNCwgOH0pIHsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIHJlYWRlckFzeW5jIDoge3RydWUsIGZhbHNlfSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIHBpY3R1cmVDb3VudCA6IHsxLCA0LCA4fSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YWtlUGljdHVyZXMoaWQsIHJlYWRlclVzYWdlLCByZWFkZXJNYXhJbWFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlckFzeW5jLCBwaWN0dXJlQ291bnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlRlc3QgdGFrZVBpY3R1cmVzIGZhaWxlZCBmb3IgdGVzdCBjYXNlIHVzYWdlPSUiIFBSSXU2NAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIG1heEltYWdlcz0lZCwgYXN5bmM9JWQsIHBpY3R1cmVDb3VudD0lZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyVXNhZ2UsIHJlYWRlck1heEltYWdlcywgcmVhZGVyQXN5bmMsIHBpY3R1cmVDb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIENhbWVyYSBtYW5hZ2VyCisgICAgQUNhbWVyYU1hbmFnZXIqIG1DYW1lcmFNYW5hZ2VyID0gbnVsbHB0cjsKKyAgICBBQ2FtZXJhSWRMaXN0KiBtQ2FtZXJhSWRMaXN0ID0gbnVsbHB0cjsKKworICAgIGJvb2wgaXNDYXBhYmlsaXR5U3VwcG9ydGVkKEFDYW1lcmFNZXRhZGF0YSogc3RhdGljSW5mbywKKyAgICAgICAgICAgIGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX3JlcXVlc3RfYXZhaWxhYmxlX2NhcGFiaWxpdGllc190IGNhcCkgeworICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfY29uc3RfZW50cnkgZW50cnk7CisgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9nZXRDb25zdEVudHJ5KAorICAgICAgICAgICAgICAgIHN0YXRpY0luZm8sIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTLCAmZW50cnkpOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGVudHJ5LmRhdGEudThbaV0gPT0gY2FwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgaXNTaXplU3VwcG9ydGVkRm9yRm9ybWF0KEFDYW1lcmFNZXRhZGF0YSogc3RhdGljSW5mbywKKyAgICAgICAgICAgIGludDMyX3QgZm9ybWF0LCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgeworICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfY29uc3RfZW50cnkgZW50cnk7CisgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9nZXRDb25zdEVudHJ5KHN0YXRpY0luZm8sCisgICAgICAgICAgICAgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUywgJmVudHJ5KTsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyBpICs9IDQpIHsKKyAgICAgICAgICAgIGlmIChlbnRyeS5kYXRhLmkzMltpXSA9PSBmb3JtYXQgJiYKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuZGF0YS5pMzJbaSszXSA9PSBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX09VVFBVVCAmJgorICAgICAgICAgICAgICAgICAgICBlbnRyeS5kYXRhLmkzMltpKzFdID09IHdpZHRoICYmCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LmRhdGEuaTMyW2krMl0gPT0gaGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZvaWQgZmluZENhbmRpZGF0ZUxvZ2ljYWxDYW1lcmEoY29uc3QgY2hhciAqKmNhbWVyYUlkLAorICAgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhKiogc3RhdGljTWV0YWRhdGEsCisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4qIGNhbmRpZGF0ZVBoeXNpY2FsSWRzKSB7CisgICAgICAgIC8vIEZpbmQgZmlyc3QgYXZhaWxhYmxlIGxvZ2ljYWwgY2FtZXJhCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUNhbWVyYUlkTGlzdC0+bnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgICAgICBjYW1lcmFfc3RhdHVzX3QgcmV0OworICAgICAgICAgICAgcmV0ID0gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAorICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhTWFuYWdlciwgbUNhbWVyYUlkTGlzdC0+Y2FtZXJhSWRzW2ldLCBzdGF0aWNNZXRhZGF0YSk7CisgICAgICAgICAgICBBU1NFUlRfRVEocmV0LCBBQ0FNRVJBX09LKTsKKyAgICAgICAgICAgIEFTU0VSVF9ORSgqc3RhdGljTWV0YWRhdGEsIG51bGxwdHIpOworCisgICAgICAgICAgICBpZiAoIWlzQ2FwYWJpbGl0eVN1cHBvcnRlZCgqc3RhdGljTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX0xPR0lDQUxfTVVMVElfQ0FNRVJBKSkgeworICAgICAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9mcmVlKCpzdGF0aWNNZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgKnN0YXRpY01ldGFkYXRhID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ2hlY2sgcmV0dXJuZWQgcGh5c2ljYWwgY2FtZXJhIElkcyBhcmUgdmFsaWQKKyAgICAgICAgICAgIHNpemVfdCBwaHlzaWNhbENhbWVyYUlkQ250ID0gMDsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqY29uc3QqIHBoeXNpY2FsQ2FtZXJhSWRzID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGJvb2wgaXNMb2dpY2FsQ2FtZXJhID0gQUNhbWVyYU1ldGFkYXRhX2lzTG9naWNhbE11bHRpQ2FtZXJhKCpzdGF0aWNNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgJnBoeXNpY2FsQ2FtZXJhSWRDbnQsICZwaHlzaWNhbENhbWVyYUlkcyk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShpc0xvZ2ljYWxDYW1lcmEpOworICAgICAgICAgICAgQVNTRVJUX0dFKHBoeXNpY2FsQ2FtZXJhSWRDbnQsIDIpOworICAgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhKiBwaHlzaWNhbENhbWVyYU1ldGFkYXRhID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGNhbmRpZGF0ZVBoeXNpY2FsSWRzLT5jbGVhcigpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBwaHlzaWNhbENhbWVyYUlkQ250ICYmIGNhbmRpZGF0ZVBoeXNpY2FsSWRzLT5zaXplKCkgPCAyOyBqKyspIHsKKyAgICAgICAgICAgICAgICBBU1NFUlRfR1Qoc3RybGVuKHBoeXNpY2FsQ2FtZXJhSWRzW2pdKSwgMCk7CisgICAgICAgICAgICAgICAgcmV0ID0gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAorICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYU1hbmFnZXIsIHBoeXNpY2FsQ2FtZXJhSWRzW2pdLCAmcGh5c2ljYWxDYW1lcmFNZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKHJldCwgQUNBTUVSQV9PSyk7CisgICAgICAgICAgICAgICAgQVNTRVJUX05FKHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEsIG51bGxwdHIpOworCisgICAgICAgICAgICAgICAgaWYgKGlzU2l6ZVN1cHBvcnRlZEZvckZvcm1hdChwaHlzaWNhbENhbWVyYU1ldGFkYXRhLCBrVGVzdEltYWdlRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAga1Rlc3RJbWFnZVdpZHRoLCBrVGVzdEltYWdlSGVpZ2h0KSkgeworICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVQaHlzaWNhbElkcy0+cHVzaF9iYWNrKHBoeXNpY2FsQ2FtZXJhSWRzW2pdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2ZyZWUocGh5c2ljYWxDYW1lcmFNZXRhZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2FuZGlkYXRlUGh5c2ljYWxJZHMtPnNpemUoKSA9PSAyKSB7CisgICAgICAgICAgICAgICAgKmNhbWVyYUlkID0gbUNhbWVyYUlkTGlzdC0+Y2FtZXJhSWRzW2ldOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2ZyZWUoKnN0YXRpY01ldGFkYXRhKTsKKyAgICAgICAgICAgICAgICAqc3RhdGljTWV0YWRhdGEgPSBudWxscHRyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICpjYW1lcmFJZCA9IG51bGxwdHI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB2b2lkIHRlc3RMb2dpY2FsQ2FtZXJhUGh5c2ljYWxTdHJlYW0oYm9vbCB1c2VQaHlzaWNhbFNldHRpbmdzKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIGNhbWVyYUlkID0gbnVsbHB0cjsKKyAgICAgICAgQUNhbWVyYU1ldGFkYXRhKiBzdGF0aWNNZXRhZGF0YSA9IG51bGxwdHI7CisgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBwaHlzaWNhbENhbWVyYUlkczsKKworICAgICAgICBmaW5kQ2FuZGlkYXRlTG9naWNhbENhbWVyYSgmY2FtZXJhSWQsICZzdGF0aWNNZXRhZGF0YSwgJnBoeXNpY2FsQ2FtZXJhSWRzKTsKKyAgICAgICAgaWYgKGNhbWVyYUlkID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIC8vIENvdWxkbid0IGZpbmQgbG9naWNhbCBjYW1lcmEgdG8gdGVzdAorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGVzdCBzdHJlYW1pbmcgdGhlIGxvZ2ljYWwgbXVsdGktY2FtZXJhCisgICAgICAgIHVpbnQ2NF90IHJlYWRlclVzYWdlID0gQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0NQVV9SRUFEX09GVEVOOworICAgICAgICBpbnQzMl90IHJlYWRlck1heEltYWdlcyA9IDg7CisgICAgICAgIGJvb2wgcmVhZGVyQXN5bmMgPSBmYWxzZTsKKyAgICAgICAgY29uc3QgaW50IHBpY3R1cmVDb3VudCA9IDY7CisgICAgICAgIHN0ZDo6dmVjdG9yPEltYWdlUmVhZGVyVGVzdENhc2UqPiB0ZXN0Q2FzZXM7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgMzsgaSsrKSB7CisgICAgICAgICAgICBJbWFnZVJlYWRlclRlc3RDYXNlKiB0ZXN0Q2FzZSA9IG5ldyBJbWFnZVJlYWRlclRlc3RDYXNlKAorICAgICAgICAgICAgICAgICAgICBrVGVzdEltYWdlV2lkdGgsIGtUZXN0SW1hZ2VIZWlnaHQsIGtUZXN0SW1hZ2VGb3JtYXQsIHJlYWRlclVzYWdlLAorICAgICAgICAgICAgICAgICAgICByZWFkZXJNYXhJbWFnZXMsIHJlYWRlckFzeW5jKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUSh0ZXN0Q2FzZS0+aW5pdEltYWdlUmVhZGVyKCksIDApOworICAgICAgICAgICAgdGVzdENhc2VzLnB1c2hfYmFjayh0ZXN0Q2FzZSk7CisgICAgICAgIH0KKworICAgICAgICBDYW1lcmFIZWxwZXIgY2FtZXJhSGVscGVyKGNhbWVyYUlkLCBtQ2FtZXJhTWFuYWdlcik7CisgICAgICAgIHN0ZDo6dmVjdG9yPENhbWVyYUhlbHBlcjo6UGh5c2ljYWxJbWdSZWFkZXJJbmZvPiBwaHlzaWNhbEltZ1JlYWRlckluZm87CisgICAgICAgIHBoeXNpY2FsSW1nUmVhZGVySW5mby5wdXNoX2JhY2soe3BoeXNpY2FsQ2FtZXJhSWRzWzBdLCB0ZXN0Q2FzZXNbMV0tPmdldE5hdGl2ZVdpbmRvdygpfSk7CisgICAgICAgIHBoeXNpY2FsSW1nUmVhZGVySW5mby5wdXNoX2JhY2soe3BoeXNpY2FsQ2FtZXJhSWRzWzFdLCB0ZXN0Q2FzZXNbMl0tPmdldE5hdGl2ZVdpbmRvdygpfSk7CisKKyAgICAgICAgaW50IHJldCA9IGNhbWVyYUhlbHBlci5pbml0Q2FtZXJhKHRlc3RDYXNlc1swXS0+Z2V0TmF0aXZlV2luZG93KCksCisgICAgICAgICAgICAgICAgcGh5c2ljYWxJbWdSZWFkZXJJbmZvLCB1c2VQaHlzaWNhbFNldHRpbmdzKTsKKyAgICAgICAgQVNTRVJUX0VRKHJldCwgMCk7CisKKyAgICAgICAgaWYgKCFjYW1lcmFIZWxwZXIuaXNDYW1lcmFSZWFkeSgpKSB7CisgICAgICAgICAgICBBTE9HVygiQ2FtZXJhIGlzIG5vdCByZWFkeSBhZnRlciBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uLiBJdCdzIGVpdGhlciBkdWUgdG8gY2FtZXJhICIKKyAgICAgICAgICAgICAgICAgICJvbiBib2FyZCBsYWNrcyBCQUNLV0FSRFNfQ09NUEFUSUJMRSBjYXBhYmlsaXR5IG9yIHRoZSBkZXZpY2UgZG9lcyBub3QgaGF2ZSAiCisgICAgICAgICAgICAgICAgICAiY2FtZXJhIG9uIGJvYXJkLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaWN0dXJlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgcmV0ID0gY2FtZXJhSGVscGVyLnRha2VMb2dpY2FsQ2FtZXJhUGljdHVyZSgpOworICAgICAgICAgICAgQVNTRVJUX0VRKHJldCwgMCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTbGVlcCB1bnRpbCBhbGwgY2FwdHVyZSBmaW5pc2hlZAorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtDYXB0dXJlV2FpdFJldHJ5ICogcGljdHVyZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHVzbGVlcChrQ2FwdHVyZVdhaXRVcyk7CisgICAgICAgICAgICBpZiAodGVzdENhc2VzWzBdLT5nZXRBY3F1aXJlZEltYWdlQ291bnQoKSA9PSBwaWN0dXJlQ291bnQpIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiU2Vzc2lvbiB0YWtlIH4lZCBtcyB0byBjYXB0dXJlICVkIGltYWdlcyIsIGkgKiBrQ2FwdHVyZVdhaXRVcyAvIDEwMDAsCisgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZUNvdW50KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBU1NFUlRfRVEodGVzdENhc2VzWzBdLT5nZXRBY3F1aXJlZEltYWdlQ291bnQoKSwgcGljdHVyZUNvdW50KTsKKyAgICAgICAgQVNTRVJUX0VRKHRlc3RDYXNlc1sxXS0+Z2V0QWNxdWlyZWRJbWFnZUNvdW50KCksIHBpY3R1cmVDb3VudCk7CisgICAgICAgIEFTU0VSVF9FUSh0ZXN0Q2FzZXNbMl0tPmdldEFjcXVpcmVkSW1hZ2VDb3VudCgpLCBwaWN0dXJlQ291bnQpOworICAgICAgICBBU1NFUlRfVFJVRShjYW1lcmFIZWxwZXIuY2hlY2tDYWxsYmFja3MocGljdHVyZUNvdW50KSk7CisKKyAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2ZyZWUoc3RhdGljTWV0YWRhdGEpOworICAgIH0KK307CisKK1RFU1RfRihBSW1hZ2VSZWFkZXJWZW5kb3JUZXN0LCBDcmVhdGVXaW5kb3dOYXRpdmVIYW5kbGUpIHsKKyAgICAvLyBXZSBhbHdheXMgdXNlIHRoZSBmaXJzdCBjYW1lcmEuCisgICAgY29uc3QgY2hhciogY2FtZXJhSWQgPSBtQ2FtZXJhSWRMaXN0LT5jYW1lcmFJZHNbMF07CisgICAgQVNTRVJUX1RSVUUoY2FtZXJhSWQgIT0gbnVsbHB0cik7CisKKyAgICBBQ2FtZXJhTWV0YWRhdGEqIHN0YXRpY01ldGFkYXRhID0gbnVsbHB0cjsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAorICAgICAgICAgICAgbUNhbWVyYU1hbmFnZXIsIGNhbWVyYUlkLCAmc3RhdGljTWV0YWRhdGEpOworICAgIEFTU0VSVF9FUShyZXQsIEFDQU1FUkFfT0spOworICAgIEFTU0VSVF9ORShzdGF0aWNNZXRhZGF0YSwgbnVsbHB0cik7CisKKyAgICBib29sIGlzQkMgPSBpc0NhcGFiaWxpdHlTdXBwb3J0ZWQoc3RhdGljTWV0YWRhdGEsCisgICAgICAgICAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19CQUNLV0FSRF9DT01QQVRJQkxFKTsKKworICAgIHVpbnQzMl90IG5hbWVkVGFnID0gMDsKKyAgICAvLyBUZXN0IHRoYXQgQUNhbWVyYU1ldGFkYXRhX2dldFRhZ0Zyb21OYW1lIHdvcmtzIGFzIGV4cGVjdGVkIGZvciBwdWJsaWMgdGFnCisgICAgLy8gbmFtZXMKKyAgICBjYW1lcmFfc3RhdHVzX3Qgc3RhdHVzID0gQUNhbWVyYU1hbmFnZXJfZ2V0VGFnRnJvbU5hbWUobUNhbWVyYU1hbmFnZXIsIGNhbWVyYUlkLAorICAgICAgICAgICAgImFuZHJvaWQuY29udHJvbC5hZU1vZGUiLCAmbmFtZWRUYWcpOworCisgICAgQVNTRVJUX0VRKHN0YXR1cywgQUNBTUVSQV9PSyk7CisgICAgQVNTRVJUX0VRKG5hbWVkVGFnLCBBQ0FNRVJBX0NPTlRST0xfQUVfTU9ERSk7CisKKyAgICBBQ2FtZXJhTWV0YWRhdGFfZnJlZShzdGF0aWNNZXRhZGF0YSk7CisKKyAgICBpZiAoIWlzQkMpIHsKKyAgICAgICAgQUxPR1coIkNhbWVyYSBkb2VzIG5vdCBzdXBwb3J0IEJBQ0tXQVJEX0NPTVBBVElCTEUuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBFWFBFQ1RfVFJVRSh0ZXN0VGFrZVBpY3R1cmVzTmF0aXZlKGNhbWVyYUlkKSk7Cit9CisKK1RFU1RfRihBSW1hZ2VSZWFkZXJWZW5kb3JUZXN0LCBMb2dpY2FsQ2FtZXJhUGh5c2ljYWxTdHJlYW0pIHsKKyAgICB0ZXN0TG9naWNhbENhbWVyYVBoeXNpY2FsU3RyZWFtKGZhbHNlLyp1c2VQaHlzaWNhbFNldHRpbmdzKi8pOworICAgIHRlc3RMb2dpY2FsQ2FtZXJhUGh5c2ljYWxTdHJlYW0odHJ1ZS8qdXNlUGh5c2ljYWxTZXR0aW5ncyovKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9jYW1lcmEvdGVzdHMvQW5kcm9pZC5tayBiL2NhbWVyYS90ZXN0cy9BbmRyb2lkLm1rCmluZGV4IDY1OTQ4NGYuLmU1YzE2MzEgMTAwNjQ0Ci0tLSBhL2NhbWVyYS90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL2NhbWVyYS90ZXN0cy9BbmRyb2lkLm1rCkBAIC0xOSw3ICsxOSw4IEBACiBMT0NBTF9TUkNfRklMRVM6PSBcCiAJVmVuZG9yVGFnRGVzY3JpcHRvclRlc3RzLmNwcCBcCiAJQ2FtZXJhQmluZGVyVGVzdHMuY3BwIFwKLQlDYW1lcmFaU0xUZXN0cy5jcHAKKwlDYW1lcmFaU0xUZXN0cy5jcHAgXAorCUNhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb24uY3BwCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogCWxpYmxvZyBcCmRpZmYgLS1naXQgYS9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwIGIvY2FtZXJhL3Rlc3RzL0NhbWVyYUJpbmRlclRlc3RzLmNwcAppbmRleCAxZGU3MDEzLi44ZmUwMjlhIDEwMDY0NAotLS0gYS9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwCisrKyBiL2NhbWVyYS90ZXN0cy9DYW1lcmFCaW5kZXJUZXN0cy5jcHAKQEAgLTI5LDYgKzI5LDcgQEAKICNpbmNsdWRlIDx1dGlscy9Db25kaXRpb24uaD4KICNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgogI2luY2x1ZGUgPHN5c3RlbS9ncmFwaGljcy5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYTMuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9ncmFsbG9jLmg+CiAKICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KQEAgLTQwLDYgKzQxLDcgQEAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQm5DYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9DYXB0dXJlUmVxdWVzdC5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL1N1Ym1pdEluZm8uaD4KIAogI2luY2x1ZGUgPGd1aS9CdWZmZXJJdGVtQ29uc3VtZXIuaD4KQEAgLTU1LDYgKzU3LDggQEAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VEZWZhdWx0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI7CiAKICNkZWZpbmUgQVNTRVJUX05PVF9OVUxMKHgpIFwKICAgICBBU1NFUlRfVFJVRSgoeCkgIT0gbnVsbHB0cikKQEAgLTg2LDYgKzkwLDExIEBACiAgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKICAgICB9OwogCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvbkNhbWVyYUFjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkKCkgeworICAgICAgICAvLyBObyBvcAorICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CisgICAgfQorCiAgICAgYm9vbCB3YWl0Rm9yTnVtQ2FtZXJhcyhzaXplX3QgbnVtKSBjb25zdCB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIApAQCAtNDc2LDcgKzQ4NSw4IEBACiAKICAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZShuZXcgU3VyZmFjZShnYlByb2R1Y2VyLCAvKmNvbnRyb2xsZWRCeUFwcCovZmFsc2UpKTsKIAotICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uIG91dHB1dChnYlByb2R1Y2VyLCAvKnJvdGF0aW9uKi8wKTsKKyAgICAgICAgU3RyaW5nMTYgbm9QaHlzaWNhbElkOworICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uIG91dHB1dChnYlByb2R1Y2VyLCAvKnJvdGF0aW9uKi8wLCBub1BoeXNpY2FsSWQpOwogCiAgICAgICAgIC8vIENhbiB3ZSBjb25maWd1cmU/CiAgICAgICAgIHJlcyA9IGRldmljZS0+YmVnaW5Db25maWd1cmUoKTsKQEAgLTQ5MCw2ICs1MDAsMTkgQEAKICAgICAgICAgRVhQRUNUX1RSVUUocmVzLmlzT2soKSkgPDwgcmVzOwogICAgICAgICBFWFBFQ1RfRkFMU0UoY2FsbGJhY2tzLT5oYWRFcnJvcigpKTsKIAorICAgICAgICAvLyBTZXNzaW9uIGNvbmZpZ3VyYXRpb24gbXVzdCBhbHNvIGJlIHN1cHBvcnRlZCBpbiB0aGlzIGNhc2UKKyAgICAgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb24gc2Vzc2lvbkNvbmZpZ3VyYXRpb24gPSB7IC8qaW5wdXRXaWR0aCovIDAsIC8qaW5wdXRIZWlnaHQqLzAsCisgICAgICAgICAgICAgICAgLyppbnB1dEZvcm1hdCovIC0xLCBDQU1FUkEzX1NUUkVBTV9DT05GSUdVUkFUSU9OX05PUk1BTF9NT0RFfTsKKyAgICAgICAgc2Vzc2lvbkNvbmZpZ3VyYXRpb24uYWRkT3V0cHV0Q29uZmlndXJhdGlvbihvdXRwdXQpOworICAgICAgICBib29sIHF1ZXJ5U3RhdHVzOworICAgICAgICByZXMgPSBkZXZpY2UtPmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoc2Vzc2lvbkNvbmZpZ3VyYXRpb24sICZxdWVyeVN0YXR1cyk7CisgICAgICAgIEVYUEVDVF9UUlVFKHJlcy5pc09rKCkgfHwKKyAgICAgICAgICAgICAgICAocmVzLnNlcnZpY2VTcGVjaWZpY0Vycm9yQ29kZSgpID09IElDYW1lcmFTZXJ2aWNlRGVmYXVsdDo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04pKQorICAgICAgICAgICAgICAgIDw8IHJlczsKKyAgICAgICAgaWYgKHJlcy5pc09rKCkpIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHF1ZXJ5U3RhdHVzKTsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIENhbiB3ZSBtYWtlIHJlcXVlc3RzPwogICAgICAgICBDYW1lcmFNZXRhZGF0YSByZXF1ZXN0VGVtcGxhdGU7CiAgICAgICAgIHJlcyA9IGRldmljZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QoLypwcmV2aWV3IHRlbXBsYXRlKi8xLApkaWZmIC0tZ2l0IGEvY2FtZXJhL3Rlc3RzL0NhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb24uY3BwIGIvY2FtZXJhL3Rlc3RzL0NhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNWQyYTMKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvdGVzdHMvQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbi5jcHAKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb24iCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgorI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmEuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOworCitjbGFzcyBDYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uIDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Citwcm90ZWN0ZWQ6CisKKyAgICBDYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uKCkgOiBudW1DYW1lcmFzKDApe30KKyAgICAvL0d0ZXN0IGludGVyZmFjZQorICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZTsKKyAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGU7CisKKyAgICBpbnQzMl90IG51bUNhbWVyYXM7CisgICAgc3A8SUNhbWVyYVNlcnZpY2U+IG1DYW1lcmFTZXJ2aWNlOworfTsKKwordm9pZCBDYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uOjpTZXRVcCgpIHsKKyAgICA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIHJjOworICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKKyAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmNhbWVyYSIpKTsKKyAgICBtQ2FtZXJhU2VydmljZSA9IGludGVyZmFjZV9jYXN0PElDYW1lcmFTZXJ2aWNlPihiaW5kZXIpOworICAgIHJjID0gbUNhbWVyYVNlcnZpY2UtPmdldE51bWJlck9mQ2FtZXJhcygKKyAgICAgICAgICAgIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6Q0FNRVJBX1RZUEVfQUxMLCAmbnVtQ2FtZXJhcyk7CisgICAgRVhQRUNUX1RSVUUocmMuaXNPaygpKTsKK30KKwordm9pZCBDYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uOjpUZWFyRG93bigpIHsKKyAgICBtQ2FtZXJhU2VydmljZS5jbGVhcigpOworfQorCisvLyBSZXZva2luZyBhbmQgYWNxdWlyaW5nIHBlcm1pc3Npb25zIGF1dG9tYXRpY2FsbHkgbWlnaHQgbm90IGJlIHBvc3NpYmxlLgorLy8gVGVzdCB0aGUgZnVuY3Rpb25hbGl0eSBmb3IgcmVtb3ZhbCBvZiBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIG5lZWRpbmcKKy8vIGEgY2FtZXJhIHBlcm1pc3Npb24uCitURVNUX0YoQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbiwgVGVzdENhbWVyYVBlcm1pc3Npb24pIHsKKyAgICBmb3IgKGludDMyX3QgY2FtZXJhSWQgPSAwOyBjYW1lcmFJZCA8IG51bUNhbWVyYXM7IGNhbWVyYUlkKyspIHsKKworICAgICAgICBTdHJpbmcxNiBjYW1lcmFJZFN0ciA9IFN0cmluZzE2KFN0cmluZzg6OmZvcm1hdCgiJWQiLCBjYW1lcmFJZCkpOworICAgICAgICBib29sIGlzU3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgIGF1dG8gcmMgPSBtQ2FtZXJhU2VydmljZS0+c3VwcG9ydHNDYW1lcmFBcGkoY2FtZXJhSWRTdHIsCisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpBUElfVkVSU0lPTl8yLCAmaXNTdXBwb3J0ZWQpOworICAgICAgICBFWFBFQ1RfVFJVRShyYy5pc09rKCkpOworICAgICAgICBpZiAoIWlzU3VwcG9ydGVkKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhOworICAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiB0YWdzTmVlZGluZ1Blcm1pc3Npb247CisgICAgICAgIHJjID0gbUNhbWVyYVNlcnZpY2UtPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZFN0ciwgJm1ldGFkYXRhKTsKKyAgICAgICAgQVNTRVJUX1RSVUUocmMuaXNPaygpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKG1ldGFkYXRhLmlzRW1wdHkoKSk7CisgICAgICAgIEVYUEVDVF9FUShtZXRhZGF0YS5yZW1vdmVQZXJtaXNzaW9uRW50cmllcyhDQU1FUkFfTUVUQURBVEFfSU5WQUxJRF9WRU5ET1JfSUQsCisgICAgICAgICAgICAgICAgICAgICZ0YWdzTmVlZGluZ1Blcm1pc3Npb24pLCBOT19FUlJPUik7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGF2YWlsYWJsZUNoYXJhY3RlcmlzdGljcyA9CisgICAgICAgICAgICAgICAgbWV0YWRhdGEuZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoMCA8IGF2YWlsYWJsZUNoYXJhY3RlcmlzdGljcy5jb3VudCk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IGF2YWlsYWJsZUtleXM7CisgICAgICAgIGF2YWlsYWJsZUtleXMucmVzZXJ2ZShhdmFpbGFibGVDaGFyYWN0ZXJpc3RpY3MuY291bnQpOworICAgICAgICBhdmFpbGFibGVLZXlzLmluc2VydChhdmFpbGFibGVLZXlzLmJlZ2luKCksIGF2YWlsYWJsZUNoYXJhY3RlcmlzdGljcy5kYXRhLmkzMiwKKyAgICAgICAgICAgICAgICBhdmFpbGFibGVDaGFyYWN0ZXJpc3RpY3MuZGF0YS5pMzIgKyBhdmFpbGFibGVDaGFyYWN0ZXJpc3RpY3MuY291bnQpOworCisgICAgICAgIGZvciAoY29uc3QgYXV0byAma2V5IDogdGFnc05lZWRpbmdQZXJtaXNzaW9uKSB7CisgICAgICAgICAgICBBU1NFUlRfRkFMU0UobWV0YWRhdGEuZXhpc3RzKGtleSkpOworICAgICAgICAgICAgYXV0byBpdCA9IHN0ZDo6ZmluZChhdmFpbGFibGVLZXlzLmJlZ2luKCksIGF2YWlsYWJsZUtleXMuZW5kKCksIGtleSk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShpdCA9PSBhdmFpbGFibGVLZXlzLmVuZCgpKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NtZHMvc2NyZWVucmVjb3JkL0FuZHJvaWQuYnAgYi9jbWRzL3NjcmVlbnJlY29yZC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2NDc2Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9jbWRzL3NjcmVlbnJlY29yZC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTUgQEAKKy8vIENvcHlyaWdodCAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogInNjcmVlbnJlY29yZCIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJzY3JlZW5yZWNvcmQuY3BwIiwKKyAgICAgICAgIkVnbFdpbmRvdy5jcHAiLAorICAgICAgICAiRnJhbWVPdXRwdXQuY3BwIiwKKyAgICAgICAgIlRleHRSZW5kZXJlci5jcHAiLAorICAgICAgICAiT3ZlcmxheS5jcHAiLAorICAgICAgICAiUHJvZ3JhbS5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYmpwZWciLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliRUdMIiwKKyAgICAgICAgImxpYkdMRVN2MiIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1Xbm8tbXVsdGljaGFyIiwKKyAgICAgICAgLy8iLVVOREVCVUciLAorICAgIF0KK30KZGlmZiAtLWdpdCBhL2NtZHMvc2NyZWVucmVjb3JkL0FuZHJvaWQubWsgYi9jbWRzL3NjcmVlbnJlY29yZC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTgzZWQ2Li4wMDAwMDAwCi0tLSBhL2NtZHMvc2NyZWVucmVjb3JkL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0jIENvcHlyaWdodCAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLQlzY3JlZW5yZWNvcmQuY3BwIFwKLQlFZ2xXaW5kb3cuY3BwIFwKLQlGcmFtZU91dHB1dC5jcHAgXAotCVRleHRSZW5kZXJlci5jcHAgXAotCU92ZXJsYXkuY3BwIFwKLQlQcm9ncmFtLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJtZWRpYV9vbXggbGlidXRpbHMgbGliYmluZGVyIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAotCWxpYmpwZWcgbGlidWkgbGliZ3VpIGxpYmN1dGlscyBsaWJsb2cgbGliRUdMIGxpYkdMRVN2MgotCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLQlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKLQlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUgXAotCWZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCBcCi0JZXh0ZXJuYWwvanBlZwotCi1MT0NBTF9DRkxBR1MgOj0gLVdlcnJvciAtV2FsbAotTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tbXVsdGljaGFyCi0jTE9DQUxfQ0ZMQUdTICs9IC1VTkRFQlVHCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX01PRFVMRTo9IHNjcmVlbnJlY29yZAotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAgYi9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwCmluZGV4IGQxODU5ZDEuLjdhYTY1NWYgMTAwNjQ0Ci0tLSBhL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAKKysrIGIvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcApAQCAtNDgsNiArNDgsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1BlcnNpc3RlbnRTdXJmYWNlLmg+CkBAIC01OCw3ICs1OSwzNSBAQAogI2luY2x1ZGUgIk92ZXJsYXkuaCIKICNpbmNsdWRlICJGcmFtZU91dHB1dC5oIgogCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIGFuZHJvaWQ6OkFCdWZmZXI7Cit1c2luZyBhbmRyb2lkOjpBTG9vcGVyOwordXNpbmcgYW5kcm9pZDo6QU1lc3NhZ2U7Cit1c2luZyBhbmRyb2lkOjpBU3RyaW5nOwordXNpbmcgYW5kcm9pZDo6RGlzcGxheUluZm87Cit1c2luZyBhbmRyb2lkOjpGcmFtZU91dHB1dDsKK3VzaW5nIGFuZHJvaWQ6OklCaW5kZXI7Cit1c2luZyBhbmRyb2lkOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordXNpbmcgYW5kcm9pZDo6SVN1cmZhY2VDb21wb3NlcjsKK3VzaW5nIGFuZHJvaWQ6Ok1lZGlhQ29kZWM7Cit1c2luZyBhbmRyb2lkOjpNZWRpYUNvZGVjQnVmZmVyOwordXNpbmcgYW5kcm9pZDo6TWVkaWFNdXhlcjsKK3VzaW5nIGFuZHJvaWQ6Ok92ZXJsYXk7Cit1c2luZyBhbmRyb2lkOjpQZXJzaXN0ZW50U3VyZmFjZTsKK3VzaW5nIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTsKK3VzaW5nIGFuZHJvaWQ6OlJlY3Q7Cit1c2luZyBhbmRyb2lkOjpTdHJpbmc4OwordXNpbmcgYW5kcm9pZDo6U3VyZmFjZUNvbXBvc2VyQ2xpZW50OwordXNpbmcgYW5kcm9pZDo6VmVjdG9yOwordXNpbmcgYW5kcm9pZDo6c3A7Cit1c2luZyBhbmRyb2lkOjpzdGF0dXNfdDsKKwordXNpbmcgYW5kcm9pZDo6RElTUExBWV9PUklFTlRBVElPTl8wOwordXNpbmcgYW5kcm9pZDo6RElTUExBWV9PUklFTlRBVElPTl8xODA7Cit1c2luZyBhbmRyb2lkOjpESVNQTEFZX09SSUVOVEFUSU9OXzkwOwordXNpbmcgYW5kcm9pZDo6SU5WQUxJRF9PUEVSQVRJT047Cit1c2luZyBhbmRyb2lkOjpOQU1FX05PVF9GT1VORDsKK3VzaW5nIGFuZHJvaWQ6Ok5PX0VSUk9SOwordXNpbmcgYW5kcm9pZDo6VU5LTk9XTl9FUlJPUjsKIAogc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNaW5CaXRSYXRlID0gMTAwMDAwOyAgICAgICAgIC8vIDAuMU1icHMKIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWF4Qml0UmF0ZSA9IDIwMCAqIDEwMDAwMDA7ICAvLyAyMDBNYnBzCkBAIC03Myw3ICsxMDIsNyBAQAogc3RhdGljIGJvb2wgZ01vbm90b25pY1RpbWUgPSBmYWxzZTsgICAgIC8vIHVzZSBzeXN0ZW0gbW9ub3RvbmljIHRpbWUgZm9yIHRpbWVzdGFtcHMKIHN0YXRpYyBib29sIGdQZXJzaXN0ZW50U3VyZmFjZSA9IGZhbHNlOyAvLyB1c2UgcGVyc2lzdGVudCBzdXJmYWNlCiBzdGF0aWMgZW51bSB7Ci0gICAgRk9STUFUX01QNCwgRk9STUFUX0gyNjQsIEZPUk1BVF9GUkFNRVMsIEZPUk1BVF9SQVdfRlJBTUVTCisgICAgRk9STUFUX01QNCwgRk9STUFUX0gyNjQsIEZPUk1BVF9XRUJNLCBGT1JNQVRfM0dQUCwgRk9STUFUX0ZSQU1FUywgRk9STUFUX1JBV19GUkFNRVMKIH0gZ091dHB1dEZvcm1hdCA9IEZPUk1BVF9NUDQ7ICAgICAgICAgICAvLyBkYXRhIGZvcm1hdCBmb3Igb3V0cHV0CiBzdGF0aWMgQVN0cmluZyBnQ29kZWNOYW1lID0gIiI7ICAgICAgICAgLy8gY29kZWMgbmFtZSBvdmVycmlkZQogc3RhdGljIGJvb2wgZ1NpemVTcGVjaWZpZWQgPSBmYWxzZTsgICAgIC8vIHdhcyBzaXplIGV4cGxpY2l0bHkgcmVxdWVzdGVkPwpAQCAtODMsNiArMTEyLDcgQEAKIHN0YXRpYyB1aW50MzJfdCBnVmlkZW9IZWlnaHQgPSAwOwogc3RhdGljIHVpbnQzMl90IGdCaXRSYXRlID0gMjAwMDAwMDA7ICAgICAvLyAyME1icHMKIHN0YXRpYyB1aW50MzJfdCBnVGltZUxpbWl0U2VjID0ga01heFRpbWVMaW1pdFNlYzsKK3N0YXRpYyB1aW50MzJfdCBnQmZyYW1lcyA9IDA7CiAKIC8vIFNldCBieSBzaWduYWwgaGFuZGxlciB0byBzdG9wIHJlY29yZGluZy4KIHN0YXRpYyB2b2xhdGlsZSBib29sIGdTdG9wUmVxdWVzdGVkID0gZmFsc2U7CkBAIC0xNTQsMTUgKzE4NCwyMCBAQAogICAgIH0KIAogICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgZm9ybWF0LT5zZXRJbnQzMigid2lkdGgiLCBnVmlkZW9XaWR0aCk7Ci0gICAgZm9ybWF0LT5zZXRJbnQzMigiaGVpZ2h0IiwgZ1ZpZGVvSGVpZ2h0KTsKLSAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIGtNaW1lVHlwZUF2Yyk7Ci0gICAgZm9ybWF0LT5zZXRJbnQzMigiY29sb3ItZm9ybWF0IiwgT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRPcGFxdWUpOwotICAgIGZvcm1hdC0+c2V0SW50MzIoImJpdHJhdGUiLCBnQml0UmF0ZSk7Ci0gICAgZm9ybWF0LT5zZXRGbG9hdCgiZnJhbWUtcmF0ZSIsIGRpc3BsYXlGcHMpOwotICAgIGZvcm1hdC0+c2V0SW50MzIoImktZnJhbWUtaW50ZXJ2YWwiLCAxMCk7CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfV0lEVEgsIGdWaWRlb1dpZHRoKTsKKyAgICBmb3JtYXQtPnNldEludDMyKEtFWV9IRUlHSFQsIGdWaWRlb0hlaWdodCk7CisgICAgZm9ybWF0LT5zZXRTdHJpbmcoS0VZX01JTUUsIGtNaW1lVHlwZUF2Yyk7CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfRk9STUFULCBPTVhfQ09MT1JfRm9ybWF0QW5kcm9pZE9wYXF1ZSk7CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfQklUX1JBVEUsIGdCaXRSYXRlKTsKKyAgICBmb3JtYXQtPnNldEZsb2F0KEtFWV9GUkFNRV9SQVRFLCBkaXNwbGF5RnBzKTsKKyAgICBmb3JtYXQtPnNldEludDMyKEtFWV9JX0ZSQU1FX0lOVEVSVkFMLCAxMCk7CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfTUFYX0JfRlJBTUVTLCBnQmZyYW1lcyk7CisgICAgaWYgKGdCZnJhbWVzID4gMCkgeworICAgICAgICBmb3JtYXQtPnNldEludDMyKEtFWV9QUk9GSUxFLCBBVkNQcm9maWxlTWFpbik7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoS0VZX0xFVkVMLCBBVkNMZXZlbDQxKTsKKyAgICB9CiAKLSAgICBzcDxBTG9vcGVyPiBsb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBzcDxhbmRyb2lkOjpBTG9vcGVyPiBsb29wZXIgPSBuZXcgYW5kcm9pZDo6QUxvb3BlcjsKICAgICBsb29wZXItPnNldE5hbWUoInNjcmVlbnJlY29yZF9sb29wZXIiKTsKICAgICBsb29wZXItPnN0YXJ0KCk7CiAgICAgQUxPR1YoIkNyZWF0aW5nIGNvZGVjIik7CkBAIC0yMzUsMTAgKzI3MCwxMCBAQAogCiAgICAgLy8gU2V0IHRoZSByZWdpb24gb2YgdGhlIGxheWVyIHN0YWNrIHdlJ3JlIGludGVyZXN0ZWQgaW4sIHdoaWNoIGluIG91cgogICAgIC8vIGNhc2UgaXMgImFsbCBvZiBpdCIuCi0gICAgUmVjdCBsYXllclN0YWNrUmVjdChtYWluRHB5SW5mby53LCBtYWluRHB5SW5mby5oKTsKKyAgICBSZWN0IGxheWVyU3RhY2tSZWN0KG1haW5EcHlJbmZvLnZpZXdwb3J0VywgbWFpbkRweUluZm8udmlld3BvcnRIKTsKIAogICAgIC8vIFdlIG5lZWQgdG8gcHJlc2VydmUgdGhlIGFzcGVjdCByYXRpbyBvZiB0aGUgZGlzcGxheS4KLSAgICBmbG9hdCBkaXNwbGF5QXNwZWN0ID0gKGZsb2F0KSBtYWluRHB5SW5mby5oIC8gKGZsb2F0KSBtYWluRHB5SW5mby53OworICAgIGZsb2F0IGRpc3BsYXlBc3BlY3QgPSAoZmxvYXQpIG1haW5EcHlJbmZvLnZpZXdwb3J0SCAvIChmbG9hdCkgbWFpbkRweUluZm8udmlld3BvcnRXOwogCiAKICAgICAvLyBTZXQgdGhlIHdheSB3ZSBtYXAgdGhlIG91dHB1dCBvbnRvIHRoZSBkaXNwbGF5IHN1cmZhY2UgKHdoaWNoIHdpbGwKQEAgLTMxNSwyMiArMzUwLDYgQEAKIH0KIAogLyoKLSAqIFNldCB0aGUgbWFpbiBkaXNwbGF5IHdpZHRoIGFuZCBoZWlnaHQgdG8gdGhlIGFjdHVhbCB3aWR0aCBhbmQgaGVpZ2h0Ci0gKi8KLXN0YXRpYyBzdGF0dXNfdCBnZXRBY3R1YWxEaXNwbGF5U2l6ZShjb25zdCBzcDxJQmluZGVyPiYgbWFpbkRweSwgRGlzcGxheUluZm8qIG1haW5EcHlJbmZvKSB7Ci0gICAgUmVjdCB2aWV3cG9ydDsKLSAgICBzdGF0dXNfdCBlcnIgPSBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldERpc3BsYXlWaWV3cG9ydChtYWluRHB5LCAmdmlld3BvcnQpOwotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogdW5hYmxlIHRvIGdldCBkaXNwbGF5IHZpZXdwb3J0XG4iKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0gICAgbWFpbkRweUluZm8tPncgPSB2aWV3cG9ydC53aWR0aCgpOwotICAgIG1haW5EcHlJbmZvLT5oID0gdmlld3BvcnQuaGVpZ2h0KCk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8qCiAgKiBSdW5zIHRoZSBNZWRpYUNvZGVjIGVuY29kZXIsIHNlbmRpbmcgdGhlIG91dHB1dCB0byB0aGUgTWVkaWFNdXhlci4gIFRoZQogICogaW5wdXQgZnJhbWVzIGFyZSBjb21pbmcgZnJvbSB0aGUgdmlydHVhbCBkaXNwbGF5IGFzIGZhc3QgYXMgU3VyZmFjZUZsaW5nZXIKICAqIHdhbnRzIHRvIHNlbmQgdGhlbS4KQEAgLTQwMCwyMiArNDE5LDE0IEBACiAgICAgICAgICAgICAgICAgICAgIC8vIHVzZWZ1bCBzdHVmZiBpcyBoYXJkIHRvIGdldCBhdCB3aXRob3V0IGEgRGFsdmlrIFZNLgogICAgICAgICAgICAgICAgICAgICBlcnIgPSBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldERpc3BsYXlJbmZvKG1haW5EcHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1haW5EcHlJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gZ2V0QWN0dWFsRGlzcGxheVNpemUobWFpbkRweSwgJm1haW5EcHlJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiB1bmFibGUgdG8gc2V0IGFjdHVhbCBkaXNwbGF5IHNpemVcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcmllbnRhdGlvbiAhPSBtYWluRHB5SW5mby5vcmllbnRhdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJvcmllbnRhdGlvbiBjaGFuZ2VkLCBub3cgJWQiLCBtYWluRHB5SW5mby5vcmllbnRhdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpUcmFuc2FjdGlvbiB0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldERpc3BsYXlQcm9qZWN0aW9uKHQsIHZpcnR1YWxEcHksIG1haW5EcHlJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LmFwcGx5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb24gPSBtYWluRHB5SW5mby5vcmllbnRhdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImdldERpc3BsYXlJbmZvKG1haW4pIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG9yaWVudGF0aW9uICE9IG1haW5EcHlJbmZvLm9yaWVudGF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgib3JpZW50YXRpb24gY2hhbmdlZCwgbm93ICVkIiwgbWFpbkRweUluZm8ub3JpZW50YXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpUcmFuc2FjdGlvbiB0OworICAgICAgICAgICAgICAgICAgICAgICAgc2V0RGlzcGxheVByb2plY3Rpb24odCwgdmlydHVhbERweSwgbWFpbkRweUluZm8pOworICAgICAgICAgICAgICAgICAgICAgICAgdC5hcHBseSgpOworICAgICAgICAgICAgICAgICAgICAgICAgb3JpZW50YXRpb24gPSBtYWluRHB5SW5mby5vcmllbnRhdGlvbjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIApAQCAtNDcyLDcgKzQ4Myw3IEBACiAgICAgICAgIGNhc2UgLUVBR0FJTjogICAgICAgICAgICAgICAgICAgICAgIC8vIElORk9fVFJZX0FHQUlOX0xBVEVSCiAgICAgICAgICAgICBBTE9HVigiR290IC1FQUdBSU4sIGxvb3BpbmciKTsKICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIElORk9fRk9STUFUX0NIQU5HRUQ6ICAgICAgICAgICAvLyBJTkZPX09VVFBVVF9GT1JNQVRfQ0hBTkdFRAorICAgICAgICBjYXNlIGFuZHJvaWQ6OklORk9fRk9STUFUX0NIQU5HRUQ6ICAgIC8vIElORk9fT1VUUFVUX0ZPUk1BVF9DSEFOR0VECiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgLy8gRm9ybWF0IGluY2x1ZGVzIENTRCwgd2hpY2ggd2UgbXVzdCBwcm92aWRlIHRvIG11eGVyLgogICAgICAgICAgICAgICAgIEFMT0dWKCJFbmNvZGVyIGZvcm1hdCBjaGFuZ2VkIik7CkBAIC00ODksNyArNTAwLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBJTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQ6ICAgLy8gSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VECisgICAgICAgIGNhc2UgYW5kcm9pZDo6SU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEOiAgIC8vIElORk9fT1VUUFVUX0JVRkZFUlNfQ0hBTkdFRAogICAgICAgICAgICAgLy8gTm90IGV4cGVjdGVkIGZvciBhbiBlbmNvZGVyOyBoYW5kbGUgaXQgYW55d2F5LgogICAgICAgICAgICAgQUxPR1YoIkVuY29kZXIgYnVmZmVycyBjaGFuZ2VkIik7CiAgICAgICAgICAgICBlcnIgPSBlbmNvZGVyLT5nZXRPdXRwdXRCdWZmZXJzKCZidWZmZXJzKTsKQEAgLTU4MCw4ICs1OTEsMTIgQEAKICAgICBzZWxmLT5zdGFydFRocmVhZFBvb2woKTsKIAogICAgIC8vIEdldCBtYWluIGRpc3BsYXkgcGFyYW1ldGVycy4KLSAgICBzcDxJQmluZGVyPiBtYWluRHB5ID0gU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRCdWlsdEluRGlzcGxheSgKLSAgICAgICAgICAgIElTdXJmYWNlQ29tcG9zZXI6OmVEaXNwbGF5SWRNYWluKTsKKyAgICBjb25zdCBzcDxJQmluZGVyPiBtYWluRHB5ID0gU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRJbnRlcm5hbERpc3BsYXlUb2tlbigpOworICAgIGlmIChtYWluRHB5ID09IG51bGxwdHIpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogbm8gZGlzcGxheVxuIik7CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICB9CisKICAgICBEaXNwbGF5SW5mbyBtYWluRHB5SW5mbzsKICAgICBlcnIgPSBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldERpc3BsYXlJbmZvKG1haW5EcHksICZtYWluRHB5SW5mbyk7CiAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewpAQCAtNTg5LDI1ICs2MDQsMTkgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICBlcnIgPSBnZXRBY3R1YWxEaXNwbGF5U2l6ZShtYWluRHB5LCAmbWFpbkRweUluZm8pOwotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogdW5hYmxlIHRvIHNldCBhY3R1YWwgZGlzcGxheSBzaXplXG4iKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KICAgICBpZiAoZ1ZlcmJvc2UpIHsKICAgICAgICAgcHJpbnRmKCJNYWluIGRpc3BsYXkgaXMgJWR4JWQgQCUuMmZmcHMgKG9yaWVudGF0aW9uPSV1KVxuIiwKLSAgICAgICAgICAgICAgICBtYWluRHB5SW5mby53LCBtYWluRHB5SW5mby5oLCBtYWluRHB5SW5mby5mcHMsCisgICAgICAgICAgICAgICAgbWFpbkRweUluZm8udmlld3BvcnRXLCBtYWluRHB5SW5mby52aWV3cG9ydEgsIG1haW5EcHlJbmZvLmZwcywKICAgICAgICAgICAgICAgICBtYWluRHB5SW5mby5vcmllbnRhdGlvbik7CiAgICAgICAgIGZmbHVzaChzdGRvdXQpOwogICAgIH0KIAogICAgIC8vIEVuY29kZXIgY2FuJ3QgdGFrZSBvZGQgbnVtYmVyIGFzIGNvbmZpZwogICAgIGlmIChnVmlkZW9XaWR0aCA9PSAwKSB7Ci0gICAgICAgIGdWaWRlb1dpZHRoID0gZmxvb3JUb0V2ZW4obWFpbkRweUluZm8udyk7CisgICAgICAgIGdWaWRlb1dpZHRoID0gZmxvb3JUb0V2ZW4obWFpbkRweUluZm8udmlld3BvcnRXKTsKICAgICB9CiAgICAgaWYgKGdWaWRlb0hlaWdodCA9PSAwKSB7Ci0gICAgICAgIGdWaWRlb0hlaWdodCA9IGZsb29yVG9FdmVuKG1haW5EcHlJbmZvLmgpOworICAgICAgICBnVmlkZW9IZWlnaHQgPSBmbG9vclRvRXZlbihtYWluRHB5SW5mby52aWV3cG9ydEgpOwogICAgIH0KIAogICAgIC8vIENvbmZpZ3VyZSBhbmQgc3RhcnQgdGhlIGVuY29kZXIuCkBAIC02ODUsNyArNjk0LDkgQEAKICAgICBzcDxNZWRpYU11eGVyPiBtdXhlciA9IE5VTEw7CiAgICAgRklMRSogcmF3RnAgPSBOVUxMOwogICAgIHN3aXRjaCAoZ091dHB1dEZvcm1hdCkgewotICAgICAgICBjYXNlIEZPUk1BVF9NUDQ6IHsKKyAgICAgICAgY2FzZSBGT1JNQVRfTVA0OgorICAgICAgICBjYXNlIEZPUk1BVF9XRUJNOgorICAgICAgICBjYXNlIEZPUk1BVF8zR1BQOiB7CiAgICAgICAgICAgICAvLyBDb25maWd1cmUgbXV4ZXIuICBXZSBoYXZlIHRvIHdhaXQgZm9yIHRoZSBDU0QgYmxvYiBmcm9tIHRoZSBlbmNvZGVyCiAgICAgICAgICAgICAvLyBiZWZvcmUgd2UgY2FuIHN0YXJ0IGl0LgogICAgICAgICAgICAgZXJyID0gdW5saW5rKGZpbGVOYW1lKTsKQEAgLTY5OCw3ICs3MDksMTMgQEAKICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBjb3VsZG4ndCBvcGVuIGZpbGVcbiIpOwogICAgICAgICAgICAgICAgIGFib3J0KCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBtdXhlciA9IG5ldyBNZWRpYU11eGVyKGZkLCBNZWRpYU11eGVyOjpPVVRQVVRfRk9STUFUX01QRUdfNCk7CisgICAgICAgICAgICBpZiAoZ091dHB1dEZvcm1hdCA9PSBGT1JNQVRfTVA0KSB7CisgICAgICAgICAgICAgICAgbXV4ZXIgPSBuZXcgTWVkaWFNdXhlcihmZCwgTWVkaWFNdXhlcjo6T1VUUFVUX0ZPUk1BVF9NUEVHXzQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChnT3V0cHV0Rm9ybWF0ID09IEZPUk1BVF9XRUJNKSB7CisgICAgICAgICAgICAgICAgbXV4ZXIgPSBuZXcgTWVkaWFNdXhlcihmZCwgTWVkaWFNdXhlcjo6T1VUUFVUX0ZPUk1BVF9XRUJNKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbXV4ZXIgPSBuZXcgTWVkaWFNdXhlcihmZCwgTWVkaWFNdXhlcjo6T1VUUFVUX0ZPUk1BVF9USFJFRV9HUFApOworICAgICAgICAgICAgfQogICAgICAgICAgICAgY2xvc2UoZmQpOwogICAgICAgICAgICAgaWYgKGdSb3RhdGUpIHsKICAgICAgICAgICAgICAgICBtdXhlci0+c2V0T3JpZW50YXRpb25IaW50KDkwKTsgIC8vIFRPRE86IGRvZXMgdGhpcyBkbyBhbnl0aGluZz8KQEAgLTk0OCw2ICs5NjUsNyBAQAogICAgICAgICB7ICJjb2RlYy1uYW1lIiwgICAgICAgICByZXF1aXJlZF9hcmd1bWVudCwgIE5VTEwsICdOJyB9LAogICAgICAgICB7ICJtb25vdG9uaWMtdGltZSIsICAgICBub19hcmd1bWVudCwgICAgICAgIE5VTEwsICdtJyB9LAogICAgICAgICB7ICJwZXJzaXN0ZW50LXN1cmZhY2UiLCBub19hcmd1bWVudCwgICAgICAgIE5VTEwsICdwJyB9LAorICAgICAgICB7ICJiZnJhbWVzIiwgICAgICAgICAgICByZXF1aXJlZF9hcmd1bWVudCwgIE5VTEwsICdCJyB9LAogICAgICAgICB7IE5VTEwsICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgIE5VTEwsIDAgfQogICAgIH07CiAKQEAgLTEwMTgsNiArMTAzNiwxMCBAQAogICAgICAgICAgICAgICAgIGdPdXRwdXRGb3JtYXQgPSBGT1JNQVRfTVA0OwogICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAob3B0YXJnLCAiaDI2NCIpID09IDApIHsKICAgICAgICAgICAgICAgICBnT3V0cHV0Rm9ybWF0ID0gRk9STUFUX0gyNjQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChvcHRhcmcsICJ3ZWJtIikgPT0gMCkgeworICAgICAgICAgICAgICAgIGdPdXRwdXRGb3JtYXQgPSBGT1JNQVRfV0VCTTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG9wdGFyZywgIjNncHAiKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZ091dHB1dEZvcm1hdCA9IEZPUk1BVF8zR1BQOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAob3B0YXJnLCAiZnJhbWVzIikgPT0gMCkgewogICAgICAgICAgICAgICAgIGdPdXRwdXRGb3JtYXQgPSBGT1JNQVRfRlJBTUVTOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAob3B0YXJnLCAicmF3LWZyYW1lcyIpID09IDApIHsKQEAgLTEwMzYsNiArMTA1OCwxMSBAQAogICAgICAgICBjYXNlICdwJzoKICAgICAgICAgICAgIGdQZXJzaXN0ZW50U3VyZmFjZSA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAnQic6CisgICAgICAgICAgICBpZiAocGFyc2VWYWx1ZVdpdGhVbml0KG9wdGFyZywgJmdCZnJhbWVzKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBpZiAoaWMgIT0gJz8nKSB7CiAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJnZXRvcHRfbG9uZyByZXR1cm5lZCB1bmV4cGVjdGVkIHZhbHVlIDB4JXhcbiIsIGljKTsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5tayBiL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5tawppbmRleCBjNzYxOWFmLi42ZWIyZTlmIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsKKysrIGIvY21kcy9zdGFnZWZyaWdodC9BbmRyb2lkLm1rCkBAIC04LDcgKzgsNyBAQAogICAgICAgICBTaW5lU291cmNlLmNwcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibWVkaWEgbGlibWVkaWFfb214IGxpYm1lZGlhZXh0cmFjdG9yIGxpYnV0aWxzIGxpYmJpbmRlciBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYm1lZGlhX29teCBsaWJ1dGlscyBsaWJiaW5kZXIgXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYmpwZWcgbGlidWkgbGliZ3VpIGxpYmN1dGlscyBsaWJsb2cgXAogICAgICAgICBsaWJoaWRsYmFzZSBcCiAgICAgICAgIGFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCBcCkBAIC0zNiw3ICszNiw3IEBACiAgICAgICAgIHJlY29yZC5jcHAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYm1lZGlhZXh0cmFjdG9yIGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgXAorICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbgogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXApAQCAtNjEsNyArNjEsNyBAQAogICAgICAgICByZWNvcmR2aWRlby5jcHAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYm1lZGlhZXh0cmFjdG9yIGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgXAorICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbgogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXApAQCAtODcsNyArODcsNyBAQAogICAgICAgICBhdWRpb2xvb3AuY3BwCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJtZWRpYWV4dHJhY3RvciBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIFwKKyAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibWVkaWEgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24KIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKQEAgLTExMSw3ICsxMTEsNyBAQAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJ1aSBsaWJndWkgXAotICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYm1lZGlhIGxpYmN1dGlscyBsaWJtZWRpYWV4dHJhY3RvcgorICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYm1lZGlhIGxpYmN1dGlscwogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogICAgICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKQEAgLTE5MSw3ICsxOTEsNiBAQAogTE9DQUxfTU9EVUxFOj0gbWVkaWFmaWx0ZXIKIAogTE9DQUxfU0FOSVRJWkUgOj0gY2ZpCi1MT0NBTF9TQU5JVElaRV9ESUFHIDo9IGNmaQogCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKIApAQCAtMjA0LDcgKzIwMyw3IEBACiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJsb2cgbGlidXRpbHMgbGliYmluZGVyIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gXAotICAgICAgICBsaWJjdXRpbHMgbGliYyBsaWJtZWRpYWV4dHJhY3RvcgorICAgICAgICBsaWJjdXRpbHMgbGliYwogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogICAgICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9jb2RlYy5jcHAKaW5kZXggNmE1ODQ2Ny4uZTVhNDMzNyAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9jb2RlYy5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9jb2RlYy5jcHAKQEAgLTEzOCw3ICsxMzgsNyBAQAogCiAgICAgQ0hFQ0soIXN0YXRlQnlUcmFjay5pc0VtcHR5KCkpOwogCi0gICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgaW50NjRfdCBzdGFydFRpbWVVcyA9IGFuZHJvaWQ6OkFMb29wZXI6OkdldE5vd1VzKCk7CiAgICAgaW50NjRfdCBzdGFydFRpbWVSZW5kZXIgPSAtMTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RhdGVCeVRyYWNrLnNpemUoKTsgKytpKSB7CkBAIC0zMDcsNyArMzA3LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGludDY0X3QgZWxhcHNlZFRpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKKyAgICBpbnQ2NF90IGVsYXBzZWRUaW1lVXMgPSBhbmRyb2lkOjpBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lVXM7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0YXRlQnlUcmFjay5zaXplKCk7ICsraSkgewogICAgICAgICBDb2RlY1N0YXRlICpzdGF0ZSA9ICZzdGF0ZUJ5VHJhY2suZWRpdFZhbHVlQXQoaSk7CkBAIC0zNjYsMTMgKzM2NiwxMyBAQAogICAgICAgICAgICAgY2FzZSAnVCc6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdXNlVGltZXN0YW1wID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAogICAgICAgICAgICAgY2FzZSAnUic6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcmVuZGVyU3VyZmFjZSA9IHRydWU7CisgICAgICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKICAgICAgICAgICAgIGNhc2UgJ1MnOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHVzZVN1cmZhY2UgPSB0cnVlOwpAQCAtNDAwLDcgKzQwMCw3IEBACiAKICAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAKLSAgICBzcDxBTG9vcGVyPiBsb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBzcDxhbmRyb2lkOjpBTG9vcGVyPiBsb29wZXIgPSBuZXcgYW5kcm9pZDo6QUxvb3BlcjsKICAgICBsb29wZXItPnN0YXJ0KCk7CiAKICAgICBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+IGNvbXBvc2VyQ2xpZW50OwpAQCAtNDExLDEwICs0MTEsMTIgQEAKICAgICAgICAgY29tcG9zZXJDbGllbnQgPSBuZXcgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OwogICAgICAgICBDSEVDS19FUShjb21wb3NlckNsaWVudC0+aW5pdENoZWNrKCksIChzdGF0dXNfdClPSyk7CiAKLSAgICAgICAgc3A8SUJpbmRlcj4gZGlzcGxheShTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldEJ1aWx0SW5EaXNwbGF5KAotICAgICAgICAgICAgICAgIElTdXJmYWNlQ29tcG9zZXI6OmVEaXNwbGF5SWRNYWluKSk7CisgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+IGRpc3BsYXkgPSBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldEludGVybmFsRGlzcGxheVRva2VuKCk7CisgICAgICAgIENIRUNLKGRpc3BsYXkgIT0gbnVsbHB0cik7CisKICAgICAgICAgRGlzcGxheUluZm8gaW5mbzsKLSAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5SW5mbyhkaXNwbGF5LCAmaW5mbyk7CisgICAgICAgIENIRUNLX0VRKFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheUluZm8oZGlzcGxheSwgJmluZm8pLCBOT19FUlJPUik7CisKICAgICAgICAgc3NpemVfdCBkaXNwbGF5V2lkdGggPSBpbmZvLnc7CiAgICAgICAgIHNzaXplX3QgZGlzcGxheUhlaWdodCA9IGluZm8uaDsKIApkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9tZWRpYWZpbHRlci5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L21lZGlhZmlsdGVyLmNwcAppbmRleCBmMjRkMmRkLi4yY2Y2OTU1IDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L21lZGlhZmlsdGVyLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L21lZGlhZmlsdGVyLmNwcApAQCAtMzEwLDcgKzMxMCw3IEBACiB9CiAKIHN0YXRpYyBpbnQgZGVjb2RlKAotICAgICAgICBjb25zdCBzcDxBTG9vcGVyPiAmbG9vcGVyLAorICAgICAgICBjb25zdCBzcDxhbmRyb2lkOjpBTG9vcGVyPiAmbG9vcGVyLAogICAgICAgICBjb25zdCBjaGFyICpwYXRoLAogICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSwKICAgICAgICAgYm9vbCByZW5kZXJTdXJmYWNlLApAQCAtNDY1LDcgKzQ2NSw3IEBACiAgICAgZmlsdGVyU3RhdGUtPm1TaWduYWxsZWRJbnB1dEVPUyA9IGZhbHNlOwogICAgIGZpbHRlclN0YXRlLT5tU2F3T3V0cHV0RU9TID0gZmFsc2U7CiAKLSAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gYW5kcm9pZDo6QUxvb3Blcjo6R2V0Tm93VXMoKTsKICAgICBpbnQ2NF90IHN0YXJ0VGltZVJlbmRlciA9IC0xOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0ZUJ5VHJhY2suc2l6ZSgpOyArK2kpIHsKQEAgLTY0Myw3ICs2NDMsNyBAQAogICAgICAgICAgICAgICAgIHVzZVRpbWVzdGFtcCwgJnN0YXJ0VGltZVJlbmRlcik7CiAgICAgfQogCi0gICAgaW50NjRfdCBlbGFwc2VkVGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZVVzOworICAgIGludDY0X3QgZWxhcHNlZFRpbWVVcyA9IGFuZHJvaWQ6OkFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RhdGVCeVRyYWNrLnNpemUoKTsgKytpKSB7CiAgICAgICAgIENvZGVjU3RhdGUgKnN0YXRlID0gJnN0YXRlQnlUcmFjay5lZGl0VmFsdWVBdChpKTsKQEAgLTcwNiwxMyArNzA2LDEzIEBACiAgICAgICAgICAgICBjYXNlICdUJzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB1c2VUaW1lc3RhbXAgPSB0cnVlOworICAgICAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCiAgICAgICAgICAgICBjYXNlICdSJzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICByZW5kZXJTdXJmYWNlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAogICAgICAgICAgICAgY2FzZSAnUyc6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdXNlU3VyZmFjZSA9IHRydWU7CkBAIC03MzcsNyArNzM3LDcgQEAKIAogICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKIAotICAgIGFuZHJvaWQ6OnNwPEFMb29wZXI+IGxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkFMb29wZXI+IGxvb3BlciA9IG5ldyBhbmRyb2lkOjpBTG9vcGVyOwogICAgIGxvb3Blci0+c3RhcnQoKTsKIAogICAgIGFuZHJvaWQ6OnNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4gY29tcG9zZXJDbGllbnQ7CkBAIC03NDgsMTAgKzc0OCwxMiBAQAogICAgICAgICBjb21wb3NlckNsaWVudCA9IG5ldyBTdXJmYWNlQ29tcG9zZXJDbGllbnQ7CiAgICAgICAgIENIRUNLX0VRKChzdGF0dXNfdClPSywgY29tcG9zZXJDbGllbnQtPmluaXRDaGVjaygpKTsKIAotICAgICAgICBhbmRyb2lkOjpzcDxJQmluZGVyPiBkaXNwbGF5KFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0QnVpbHRJbkRpc3BsYXkoCi0gICAgICAgICAgICAgICAgSVN1cmZhY2VDb21wb3Nlcjo6ZURpc3BsYXlJZE1haW4pKTsKKyAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8SUJpbmRlcj4gZGlzcGxheSA9IFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0SW50ZXJuYWxEaXNwbGF5VG9rZW4oKTsKKyAgICAgICAgQ0hFQ0soZGlzcGxheSAhPSBudWxscHRyKTsKKwogICAgICAgICBEaXNwbGF5SW5mbyBpbmZvOwotICAgICAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldERpc3BsYXlJbmZvKGRpc3BsYXksICZpbmZvKTsKKyAgICAgICAgQ0hFQ0tfRVEoU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5SW5mbyhkaXNwbGF5LCAmaW5mbyksIE5PX0VSUk9SKTsKKwogICAgICAgICBzc2l6ZV90IGRpc3BsYXlXaWR0aCA9IGluZm8udzsKICAgICAgICAgc3NpemVfdCBkaXNwbGF5SGVpZ2h0ID0gaW5mby5oOwogCmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAKaW5kZXggNDRiMDAxNS4uOTVhMTZmMyAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcApAQCAtMTcsNyArMTcsNiBAQAogI2luY2x1ZGUgIlNpbmVTb3VyY2UuaCIKIAogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgpAQCAtMjgsNiArMjcsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TaW1wbGVEZWNvZGluZ1NvdXJjZS5oPgpkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAppbmRleCA2MWZjODk3Li5iZjM2YmUwIDEwMDY0NAotLS0gYS9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0YWdlZnJpZ2h0LmNwcApAQCAtMzIsNyArMzIsNiBAQAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KQEAgLTQ3LDkgKzQ2LDExIEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSlBFR1NvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1NpbXBsZURlY29kaW5nU291cmNlLmg+CkBAIC03OCw2ICs3OSw3IEBACiBzdGF0aWMgYm9vbCBnUGxheWJhY2tBdWRpbzsKIHN0YXRpYyBib29sIGdXcml0ZU1QNDsKIHN0YXRpYyBib29sIGdEaXNwbGF5SGlzdG9ncmFtOworc3RhdGljIGJvb2wgZ1ZlcmJvc2UgPSBmYWxzZTsKIHN0YXRpYyBib29sIHNob3dQcm9ncmVzcyA9IHRydWU7CiBzdGF0aWMgU3RyaW5nOCBnV3JpdGVNUDRGaWxlbmFtZTsKIHN0YXRpYyBTdHJpbmc4IGdDb21wb25lbnROYW1lT3ZlcnJpZGU7CkBAIC0xNTksNiArMTYxLDExIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGlmIChnVmVyYm9zZSkgeworICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhID0gbWJ1Zi0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgInNhbXBsZSBmb3JtYXQ6ICVzXG4iLCBtZXRhLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIH0KKwogICAgICAgICBDSEVDS19FUSgKICAgICAgICAgICAgICAgICBmd3JpdGUoKGNvbnN0IHVpbnQ4X3QgKiltYnVmLT5kYXRhKCkgKyBtYnVmLT5yYW5nZV9vZmZzZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgMSwKQEAgLTIxOCwxMSArMjI1LDE1IEBACiAgICAgICAgIHBsYXllci0+c2V0U291cmNlKHJhd1NvdXJjZSk7CiAgICAgICAgIHJhd1NvdXJjZS5jbGVhcigpOwogCi0gICAgICAgIHBsYXllci0+c3RhcnQodHJ1ZSAvKiBzb3VyY2VBbHJlYWR5U3RhcnRlZCAqLyk7CisgICAgICAgIGVyciA9IHBsYXllci0+c3RhcnQodHJ1ZSAvKiBzb3VyY2VBbHJlYWR5U3RhcnRlZCAqLyk7CiAKLSAgICAgICAgc3RhdHVzX3QgZmluYWxTdGF0dXM7Ci0gICAgICAgIHdoaWxlICghcGxheWVyLT5yZWFjaGVkRU9TKCZmaW5hbFN0YXR1cykpIHsKLSAgICAgICAgICAgIHVzbGVlcCgxMDAwMDBsbCk7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIHN0YXR1c190IGZpbmFsU3RhdHVzOworICAgICAgICAgICAgd2hpbGUgKCFwbGF5ZXItPnJlYWNoZWRFT1MoJmZpbmFsU3RhdHVzKSkgeworICAgICAgICAgICAgICAgIHVzbGVlcCgxMDAwMDBsbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInVuYWJsZSB0byBzdGFydCBwbGF5YmFjayBlcnI9JWQgKDB4JTA4eClcbiIsIGVyciwgZXJyKTsKICAgICAgICAgfQogCiAgICAgICAgIGRlbGV0ZSBwbGF5ZXI7CkBAIC0zNDgsNyArMzU5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIGRlY29kZVRpbWVzVXMucHVzaChkZWxheURlY29kZVVzKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoc2hvd1Byb2dyZXNzICYmIChuKysgJSAxNikgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChnVmVyYm9zZSkgeworICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIiVsZCBzYW1wbGUgZm9ybWF0OiAlc1xuIiwgbnVtRnJhbWVzLCBtZXRhLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzaG93UHJvZ3Jlc3MgJiYgKG4rKyAlIDE2KSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLiIpOwogICAgICAgICAgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKICAgICAgICAgICAgICAgICB9CkBAIC01NzksMTIgKzU5MywxMiBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBDSEVDSyhidWZmZXIgIT0gTlVMTCk7CisKICAgICAgICAgICAgIGlmIChidWZmZXItPnJhbmdlX2xlbmd0aCgpID4gMCkgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBDSEVDSyhidWZmZXIgIT0gTlVMTCk7Ci0KICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKICAgICAgICAgfQpAQCAtNjE1LDcgKzYyOSw3IEBACiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLWwoaXN0KSBjb21wb25lbnRzXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtbSBtYXgtbnVtYmVyLW9mLWZyYW1lcy10by1kZWNvZGUgaW4gZWFjaCBwYXNzXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtYiBidWcgdG8gcmVwcm9kdWNlXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtcChyb2ZpbGVzKSBkdW1wIGRlY29kZXIgcHJvZmlsZXMgc3VwcG9ydGVkXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtaShuZm8pIGR1bXAgY29kZWMgaW5mbyAocHJvZmlsZXMgYW5kIGNvbG9yIGZvcm1hdHMgc3VwcG9ydGVkLCBkZXRhaWxzKVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLXQoaHVtYm5haWwpIGV4dHJhY3QgdmlkZW8gdGh1bWJuYWlsIG9yIGFsYnVtIGFydFxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLXMob2Z0d2FyZSkgcHJlZmVyIHNvZnR3YXJlIGNvZGVjXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtcihoYXJkd2FyZSkgZm9yY2UgdG8gdXNlIGhhcmR3YXJlIGNvZGVjXG4iKTsKQEAgLTYzMCw1NSArNjQ0LDEzNCBAQAogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1UIGFsbG9jYXRlIGJ1ZmZlcnMgZnJvbSBhIHN1cmZhY2UgdGV4dHVyZVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLWQodW1wKSBvdXRwdXRfZmlsZW5hbWUgKHJhdyBzdHJlYW0gZGF0YSB0byBhIGZpbGUpXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtRCh1bXApIG91dHB1dF9maWxlbmFtZSAoZGVjb2RlZCBQQ00gZGF0YSB0byBhIGZpbGUpXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtdiBiZSBtb3JlIHZlcmJvc2VcbiIpOwogfQogCi1zdGF0aWMgdm9pZCBkdW1wQ29kZWNQcm9maWxlcyhib29sIHF1ZXJ5RGVjb2RlcnMpIHsKLSAgICBjb25zdCBjaGFyICprTWltZVR5cGVzW10gPSB7Ci0gICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsCi0gICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywKLSAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsCi0gICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcsIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVywKLSAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXLCBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMsCi0gICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCwgTUVESUFfTUlNRVRZUEVfVklERU9fVlA5LAotICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04KLSAgICB9OwotCi0gICAgY29uc3QgY2hhciAqY29kZWNUeXBlID0gcXVlcnlEZWNvZGVycz8gImRlY29kZXIiIDogImVuY29kZXIiOwotICAgIHByaW50ZigiJXMgcHJvZmlsZXM6XG4iLCBjb2RlY1R5cGUpOworc3RhdGljIHZvaWQgZHVtcENvZGVjRGV0YWlscyhib29sIHF1ZXJ5RGVjb2RlcnMpIHsKKyAgICBjb25zdCBjaGFyICpjb2RlY1R5cGUgPSBxdWVyeURlY29kZXJzPyAiRGVjb2RlciIgOiAiRW5jb2RlciI7CisgICAgcHJpbnRmKCJcbiVzIGluZm9zIGJ5IG1lZGlhIHR5cGVzOlxuIgorICAgICAgICAgICAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIsIGNvZGVjVHlwZSk7CiAKICAgICBzcDxJTWVkaWFDb2RlY0xpc3Q+IGxpc3QgPSBNZWRpYUNvZGVjTGlzdDo6Z2V0SW5zdGFuY2UoKTsKICAgICBzaXplX3QgbnVtQ29kZWNzID0gbGlzdC0+Y291bnRDb2RlY3MoKTsKIAotICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgc2l6ZW9mKGtNaW1lVHlwZXMpIC8gc2l6ZW9mKGtNaW1lVHlwZXNbMF0pOyArK2spIHsKLSAgICAgICAgcHJpbnRmKCJ0eXBlICclcyc6XG4iLCBrTWltZVR5cGVzW2tdKTsKKyAgICAvLyBnYXRoZXIgYWxsIG1lZGlhIHR5cGVzIHN1cHBvcnRlZCBieSBjb2RlYyBjbGFzcywgYW5kIGxpbmsgdG8gY29kZWNzIHRoYXQgc3VwcG9ydCB0aGVtCisgICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgVmVjdG9yPHNwPE1lZGlhQ29kZWNJbmZvPj4+IGFsbE1lZGlhVHlwZXM7CisgICAgZm9yIChzaXplX3QgY29kZWNfaXggPSAwOyBjb2RlY19peCA8IG51bUNvZGVjczsgKytjb2RlY19peCkgeworICAgICAgICBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IGxpc3QtPmdldENvZGVjSW5mbyhjb2RlY19peCk7CisgICAgICAgIGlmIChpbmZvLT5pc0VuY29kZXIoKSA9PSAhcXVlcnlEZWNvZGVycykgeworICAgICAgICAgICAgVmVjdG9yPEFTdHJpbmc+IHN1cHBvcnRlZE1lZGlhVHlwZXM7CisgICAgICAgICAgICBpbmZvLT5nZXRTdXBwb3J0ZWRNZWRpYVR5cGVzKCZzdXBwb3J0ZWRNZWRpYVR5cGVzKTsKKyAgICAgICAgICAgIGlmICghc3VwcG9ydGVkTWVkaWFUeXBlcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIndhcm5pbmc6ICVzIGRvZXMgbm90IHN1cHBvcnQgYW55IG1lZGlhIHR5cGVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+Z2V0Q29kZWNOYW1lKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IEFTdHJpbmcgJm1lZGlhVHlwZSA6IHN1cHBvcnRlZE1lZGlhVHlwZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFsbE1lZGlhVHlwZXMuaW5kZXhPZktleShtZWRpYVR5cGUpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWxsTWVkaWFUeXBlcy5hZGQobWVkaWFUeXBlLCBWZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+PigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhbGxNZWRpYVR5cGVzLmVkaXRWYWx1ZUZvcihtZWRpYVR5cGUpLmFkZChpbmZvKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IG51bUNvZGVjczsgKytpbmRleCkgewotICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8gPSBsaXN0LT5nZXRDb2RlY0luZm8oaW5kZXgpOwotICAgICAgICAgICAgaWYgKGluZm8gPT0gTlVMTCB8fCBpbmZvLT5pc0VuY29kZXIoKSAhPSAhcXVlcnlEZWNvZGVycykgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gY2FwcyA9IGluZm8tPmdldENhcGFiaWxpdGllc0ZvcihrTWltZVR5cGVzW2tdKTsKKyAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBib29sPiB2aXNpdGVkQ29kZWNzOworICAgIGZvciAoc2l6ZV90IHR5cGVfaXggPSAwOyB0eXBlX2l4IDwgYWxsTWVkaWFUeXBlcy5zaXplKCk7ICsrdHlwZV9peCkgeworICAgICAgICBjb25zdCBBU3RyaW5nICZtZWRpYVR5cGUgPSBhbGxNZWRpYVR5cGVzLmtleUF0KHR5cGVfaXgpOworICAgICAgICBwcmludGYoIlxuTWVkaWEgdHlwZSAnJXMnOlxuIiwgbWVkaWFUeXBlLmNfc3RyKCkpOworCisgICAgICAgIGZvciAoY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+ICZpbmZvIDogYWxsTWVkaWFUeXBlcy52YWx1ZUF0KHR5cGVfaXgpKSB7CisgICAgICAgICAgICBzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPiBjYXBzID0gaW5mby0+Z2V0Q2FwYWJpbGl0aWVzRm9yKG1lZGlhVHlwZS5jX3N0cigpKTsKICAgICAgICAgICAgIGlmIChjYXBzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIndhcm5pbmc6ICVzIGRvZXMgbm90IGhhdmUgY2FwYWJpbGl0aWVzIGZvciB0eXBlICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+Z2V0Q29kZWNOYW1lKCksIG1lZGlhVHlwZS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByaW50ZigiICAlcyAnJXMnIHN1cHBvcnRzICIsCisgICAgICAgICAgICBwcmludGYoIiAgJXMgXCIlc1wiIHN1cHBvcnRzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBjb2RlY1R5cGUsIGluZm8tPmdldENvZGVjTmFtZSgpKTsKIAotICAgICAgICAgICAgVmVjdG9yPE1lZGlhQ29kZWNJbmZvOjpQcm9maWxlTGV2ZWw+IHByb2ZpbGVMZXZlbHM7Ci0gICAgICAgICAgICBjYXBzLT5nZXRTdXBwb3J0ZWRQcm9maWxlTGV2ZWxzKCZwcm9maWxlTGV2ZWxzKTsKLSAgICAgICAgICAgIGlmIChwcm9maWxlTGV2ZWxzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJOT1RISU5HLlxuIik7Ci0gICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBhdXRvIHByaW50TGlzdCA9IFtdKGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IFZlY3RvcjxBU3RyaW5nPiAmdmFsdWVzKXsKKyAgICAgICAgICAgICAgICBwcmludGYoIiAgICAlczogWyIsIHR5cGUpOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgdmFsdWVzLnNpemUoKTsgKytqKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG4gICAgICAlcyVzIiwgdmFsdWVzW2pdLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiA9PSB2YWx1ZXMuc2l6ZSgpIC0gMSA/ICIgIiA6ICIsIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByaW50ZigiXVxuIik7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBpZiAodmlzaXRlZENvZGVjcy5pbmRleE9mS2V5KGluZm8tPmdldENvZGVjTmFtZSgpKSA8IDApIHsKKyAgICAgICAgICAgICAgICB2aXNpdGVkQ29kZWNzLmFkZChpbmZvLT5nZXRDb2RlY05hbWUoKSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBWZWN0b3I8QVN0cmluZz4gYWxpYXNlczsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+Z2V0QWxpYXNlcygmYWxpYXNlcyk7CisgICAgICAgICAgICAgICAgICAgIC8vIHF1b3RlIGFsaWFzCisgICAgICAgICAgICAgICAgICAgIGZvciAoQVN0cmluZyAmYWxpYXMgOiBhbGlhc2VzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbGlhcy5pbnNlcnQoIlwiIiwgMSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhbGlhcy5hcHBlbmQoJyInKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcmludExpc3QoImFsaWFzZXMiLCBhbGlhc2VzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhdHRycyA9IGluZm8tPmdldEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgVmVjdG9yPEFTdHJpbmc+IGxpc3Q7CisgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKEFTdHJpbmdQcmludGYoImVuY29kZXI6ICVkIiwgISEoYXR0cnMgJiBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc0VuY29kZXIpKSk7CisgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKEFTdHJpbmdQcmludGYoInZlbmRvcjogJWQiLCAhIShhdHRycyAmIE1lZGlhQ29kZWNJbmZvOjprRmxhZ0lzVmVuZG9yKSkpOworICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChBU3RyaW5nUHJpbnRmKCJzb2Z0d2FyZS1vbmx5OiAlZCIsICEhKGF0dHJzICYgTWVkaWFDb2RlY0luZm86OmtGbGFnSXNTb2Z0d2FyZU9ubHkpKSk7CisgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKEFTdHJpbmdQcmludGYoImh3LWFjY2VsZXJhdGVkOiAlZCIsICEhKGF0dHJzICYgTWVkaWFDb2RlY0luZm86OmtGbGFnSXNIYXJkd2FyZUFjY2VsZXJhdGVkKSkpOworICAgICAgICAgICAgICAgICAgICBwcmludExpc3QoQVN0cmluZ1ByaW50ZigiYXR0cmlidXRlczogJSN4IiwgYXR0cnMpLmNfc3RyKCksIGxpc3QpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByaW50ZigiICAgIG93bmVyOiBcIiVzXCJcbiIsIGluZm8tPmdldE93bmVyTmFtZSgpKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiAgICByYW5rOiAldVxuIiwgaW5mby0+Z2V0UmFuaygpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgYWxpYXNlcywgYXR0cmlidXRlcywgb3duZXIsIHJhbms6IHNlZSBhYm92ZVxuIik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcHJvZmlsZUxldmVscy5zaXplKCk7ICsraikgewotICAgICAgICAgICAgICAgIGNvbnN0IE1lZGlhQ29kZWNJbmZvOjpQcm9maWxlTGV2ZWwgJnByb2ZpbGVMZXZlbCA9IHByb2ZpbGVMZXZlbHNbal07CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVmVjdG9yPEFTdHJpbmc+IGxpc3Q7CisgICAgICAgICAgICAgICAgVmVjdG9yPE1lZGlhQ29kZWNJbmZvOjpQcm9maWxlTGV2ZWw+IHByb2ZpbGVMZXZlbHM7CisgICAgICAgICAgICAgICAgY2Fwcy0+Z2V0U3VwcG9ydGVkUHJvZmlsZUxldmVscygmcHJvZmlsZUxldmVscyk7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBNZWRpYUNvZGVjSW5mbzo6UHJvZmlsZUxldmVsICZwbCA6IHByb2ZpbGVMZXZlbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmljZVByb2ZpbGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfQVVESU9fQUFDKSAgID8gYXNTdHJpbmdfQUFDT2JqZWN0KHBsLm1Qcm9maWxlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19NUEVHMikgPyBhc1N0cmluZ19NUEVHMlByb2ZpbGUocGwubVByb2ZpbGUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX0gyNjMpICA/IGFzU3RyaW5nX0gyNjNQcm9maWxlKHBsLm1Qcm9maWxlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19NUEVHNCkgPyBhc1N0cmluZ19NUEVHNFByb2ZpbGUocGwubVByb2ZpbGUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX0FWQykgICA/IGFzU3RyaW5nX0FWQ1Byb2ZpbGUocGwubVByb2ZpbGUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX1ZQOCkgICA/IGFzU3RyaW5nX1ZQOFByb2ZpbGUocGwubVByb2ZpbGUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX0hFVkMpICA/IGFzU3RyaW5nX0hFVkNQcm9maWxlKHBsLm1Qcm9maWxlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19WUDkpICAgPyBhc1N0cmluZ19WUDlQcm9maWxlKHBsLm1Qcm9maWxlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19BVjEpICAgPyBhc1N0cmluZ19BVjFQcm9maWxlKHBsLm1Qcm9maWxlKSA6Ij8/IjsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmljZUxldmVsID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX01QRUcyKSA/IGFzU3RyaW5nX01QRUcyTGV2ZWwocGwubUxldmVsKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19IMjYzKSAgPyBhc1N0cmluZ19IMjYzTGV2ZWwocGwubUxldmVsKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19NUEVHNCkgPyBhc1N0cmluZ19NUEVHNExldmVsKHBsLm1MZXZlbCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fQVZDKSAgID8gYXNTdHJpbmdfQVZDTGV2ZWwocGwubUxldmVsKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19WUDgpICAgPyBhc1N0cmluZ19WUDhMZXZlbChwbC5tTGV2ZWwpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX0hFVkMpICA/IGFzU3RyaW5nX0hFVkNUaWVyTGV2ZWwocGwubUxldmVsKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19WUDkpICAgPyBhc1N0cmluZ19WUDlMZXZlbChwbC5tTGV2ZWwpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX0FWMSkgICA/IGFzU3RyaW5nX0FWMUxldmVsKHBsLm1MZXZlbCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgIj8/IjsKIAotICAgICAgICAgICAgICAgIHByaW50ZigiJXMldS8ldSIsIGogPiAwID8gIiwgIiA6ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZUxldmVsLm1Qcm9maWxlLCBwcm9maWxlTGV2ZWwubUxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoQVN0cmluZ1ByaW50ZigiJSA1dS8lIDV1ICglcy8lcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsLm1Qcm9maWxlLCBwbC5tTGV2ZWwsIG5pY2VQcm9maWxlLCBuaWNlTGV2ZWwpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJpbnRMaXN0KCJwcm9maWxlL2xldmVscyIsIGxpc3QpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVmVjdG9yPEFTdHJpbmc+IGxpc3Q7CisgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQzMl90PiBjb2xvcnM7CisgICAgICAgICAgICAgICAgY2Fwcy0+Z2V0U3VwcG9ydGVkQ29sb3JGb3JtYXRzKCZjb2xvcnMpOworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgY29sb3IgOiBjb2xvcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoQVN0cmluZ1ByaW50ZigiJSN4ICglcykiLCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc1N0cmluZ19Db2xvckZvcm1hdCgoaW50MzJfdCljb2xvcikpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJpbnRMaXN0KCJjb2xvcnMiLCBsaXN0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpbnRmKCIgICAgZGV0YWlsczogJXNcbiIsIGNhcHMtPmdldERldGFpbHMoKS0+ZGVidWdTdHJpbmcoNikuY19zdHIoKSk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC02ODgsNyArNzgxLDcgQEAKIAogICAgIGJvb2wgYXVkaW9Pbmx5ID0gZmFsc2U7CiAgICAgYm9vbCBsaXN0Q29tcG9uZW50cyA9IGZhbHNlOwotICAgIGJvb2wgZHVtcFByb2ZpbGVzID0gZmFsc2U7CisgICAgYm9vbCBkdW1wQ29kZWNJbmZvID0gZmFsc2U7CiAgICAgYm9vbCBleHRyYWN0VGh1bWJuYWlsID0gZmFsc2U7CiAgICAgYm9vbCBzZWVrVGVzdCA9IGZhbHNlOwogICAgIGJvb2wgdXNlU3VyZmFjZUFsbG9jID0gZmFsc2U7CkBAIC03MDUsMTAgKzc5OCwxMCBAQAogICAgIGdXcml0ZU1QNCA9IGZhbHNlOwogICAgIGdEaXNwbGF5SGlzdG9ncmFtID0gZmFsc2U7CiAKLSAgICBzcDxBTG9vcGVyPiBsb29wZXI7CisgICAgc3A8YW5kcm9pZDo6QUxvb3Blcj4gbG9vcGVyOwogCiAgICAgaW50IHJlczsKLSAgICB3aGlsZSAoKHJlcyA9IGdldG9wdChhcmdjLCBhcmd2LCAiaGFxbjpsbTpiOnB0c3JvdzprTjp4U1RkOkQ6IikpID49IDApIHsKKyAgICB3aGlsZSAoKHJlcyA9IGdldG9wdChhcmdjLCBhcmd2LCAidmhhcW46bG06YjppdHNyb3c6a046eFNUZDpEOiIpKSA+PSAwKSB7CiAgICAgICAgIHN3aXRjaCAocmVzKSB7CiAgICAgICAgICAgICBjYXNlICdhJzoKICAgICAgICAgICAgIHsKQEAgLTc3OCw5ICs4NzEsOSBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBjYXNlICdwJzoKKyAgICAgICAgICAgIGNhc2UgJ2knOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGR1bXBQcm9maWxlcyA9IHRydWU7CisgICAgICAgICAgICAgICAgZHVtcENvZGVjSW5mbyA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTgzMiw2ICs5MjUsMTIgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgY2FzZSAndic6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ1ZlcmJvc2UgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBjYXNlICc/JzoKICAgICAgICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICAgZGVmYXVsdDoKQEAgLTkxNSw5ICsxMDE0LDkgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgaWYgKGR1bXBQcm9maWxlcykgewotICAgICAgICBkdW1wQ29kZWNQcm9maWxlcyh0cnVlIC8qIHF1ZXJ5RGVjb2RlcnMgKi8pOwotICAgICAgICBkdW1wQ29kZWNQcm9maWxlcyhmYWxzZSAvKiBxdWVyeURlY29kZXJzICovKTsKKyAgICBpZiAoZHVtcENvZGVjSW5mbykgeworICAgICAgICBkdW1wQ29kZWNEZXRhaWxzKHRydWUgLyogcXVlcnlEZWNvZGVycyAqLyk7CisgICAgICAgIGR1bXBDb2RlY0RldGFpbHMoZmFsc2UgLyogcXVlcnlEZWNvZGVycyAqLyk7CiAgICAgfQogCiAgICAgaWYgKGxpc3RDb21wb25lbnRzKSB7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L3N0cmVhbS5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0cmVhbS5jcHAKaW5kZXggYjAxOTlkOC4uMzViZGJjMCAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9zdHJlYW0uY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcApAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lTdHJlYW1Tb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtMzIsNiArMzEsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2VGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogCkBAIC0zMTgsMTAgKzMxOCwxMiBAQAogICAgIHNwPFN1cmZhY2VDb21wb3NlckNsaWVudD4gY29tcG9zZXJDbGllbnQgPSBuZXcgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OwogICAgIENIRUNLX0VRKGNvbXBvc2VyQ2xpZW50LT5pbml0Q2hlY2soKSwgKHN0YXR1c190KU9LKTsKIAotICAgIHNwPElCaW5kZXI+IGRpc3BsYXkoU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXRCdWlsdEluRGlzcGxheSgKLSAgICAgICAgICAgIElTdXJmYWNlQ29tcG9zZXI6OmVEaXNwbGF5SWRNYWluKSk7CisgICAgY29uc3Qgc3A8SUJpbmRlcj4gZGlzcGxheSA9IFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0SW50ZXJuYWxEaXNwbGF5VG9rZW4oKTsKKyAgICBDSEVDSyhkaXNwbGF5ICE9IG51bGxwdHIpOworCiAgICAgRGlzcGxheUluZm8gaW5mbzsKLSAgICBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldERpc3BsYXlJbmZvKGRpc3BsYXksICZpbmZvKTsKKyAgICBDSEVDS19FUShTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldERpc3BsYXlJbmZvKGRpc3BsYXksICZpbmZvKSwgTk9fRVJST1IpOworCiAgICAgc3NpemVfdCBkaXNwbGF5V2lkdGggPSBpbmZvLnc7CiAgICAgc3NpemVfdCBkaXNwbGF5SGVpZ2h0ID0gaW5mby5oOwogCmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL0FuZHJvaWQuYnAgYi9kcm0vY29tbW9uL0FuZHJvaWQuYnAKaW5kZXggMTU1MmMzZi4uMjcyNjg0YyAxMDA2NDQKLS0tIGEvZHJtL2NvbW1vbi9BbmRyb2lkLmJwCisrKyBiL2RybS9jb21tb24vQW5kcm9pZC5icApAQCAtMzUsNyArMzUsNyBAQAogCiAgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKIAotICAgIHN0YXRpY19saWJzOiBbImxpYmJpbmRlciJdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmJpbmRlciJdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiB9CmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL0RybUVuZ2luZUJhc2UuY3BwIGIvZHJtL2NvbW1vbi9Ecm1FbmdpbmVCYXNlLmNwcAppbmRleCBmNzM0OTA1Li5hZWM1OTU5IDEwMDY0NAotLS0gYS9kcm0vY29tbW9uL0RybUVuZ2luZUJhc2UuY3BwCisrKyBiL2RybS9jb21tb24vRHJtRW5naW5lQmFzZS5jcHAKQEAgLTc5LDEyICs3OSwxMiBAQAogfQogCiBzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpjb25zdW1lUmlnaHRzKAotICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7CisgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7CiAgICAgcmV0dXJuIG9uQ29uc3VtZVJpZ2h0cyh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgYWN0aW9uLCByZXNlcnZlKTsKIH0KIAogc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6c2V0UGxheWJhY2tTdGF0dXMoCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pIHsKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pIHsKICAgICByZXR1cm4gb25TZXRQbGF5YmFja1N0YXR1cyh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgcGxheWJhY2tTdGF0dXMsIHBvc2l0aW9uKTsKIH0KIApAQCAtMTIwLDcgKzEyMCw3IEBACiB9CiAKIHN0YXR1c190IERybUVuZ2luZUJhc2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCwgY29uc3QgY2hhciogbWltZSkgewogCiAgICAgaWYgKCFtaW1lIHx8IG1pbWVbMF0gPT0gJ1wwJykgewpAQCAtMTMxLDcgKzEzMSw3IEBACiB9CiAKIHN0YXR1c190IERybUVuZ2luZUJhc2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpIHsKICAgICBpZiAoIW1pbWUgfHwgbWltZVswXSA9PSAnXDAnKSB7CiAgICAgICAgIHJldHVybiBvbk9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgdXJpKTsKQEAgLTEzOSwzMyArMTM5LDMzIEBACiAgICAgcmV0dXJuIG9uT3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCB1cmksIG1pbWUpOwogfQogCi1zdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6b3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgIGNvbnN0IERybUJ1ZmZlciYgYnVmLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgewogICAgIHJldHVybiBvbk9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgYnVmLCBtaW1lVHlwZSk7CiB9CiAKLXN0YXR1c190IERybUVuZ2luZUJhc2U6OmNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSB7CitzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpIHsKICAgICByZXR1cm4gb25DbG9zZURlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlKTsKIH0KIAogc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6aW5pdGlhbGl6ZURlY3J5cHRVbml0KAotICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgeworICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pIHsKICAgICByZXR1cm4gb25Jbml0aWFsaXplRGVjcnlwdFVuaXQodW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQsIGhlYWRlckluZm8pOwogfQogCiBzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpkZWNyeXB0KAotICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgewogICAgIHJldHVybiBvbkRlY3J5cHQodW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQsIGVuY0J1ZmZlciwgZGVjQnVmZmVyLCBJVik7CiB9CiAKIHN0YXR1c190IERybUVuZ2luZUJhc2U6OmZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgeworICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CiAgICAgcmV0dXJuIG9uRmluYWxpemVEZWNyeXB0VW5pdCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCk7CiB9CiAKIHNzaXplX3QgRHJtRW5naW5lQmFzZTo6cHJlYWQoCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KSB7CisgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCkgewogICAgIHJldHVybiBvblByZWFkKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBidWZmZXIsIG51bUJ5dGVzLCBvZmZzZXQpOwogfQogCmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL0lEcm1NYW5hZ2VyU2VydmljZS5jcHAgYi9kcm0vY29tbW9uL0lEcm1NYW5hZ2VyU2VydmljZS5jcHAKaW5kZXggNDRmOThkZC4uYTZkMzNiMCAxMDA2NDQKLS0tIGEvZHJtL2NvbW1vbi9JRHJtTWFuYWdlclNlcnZpY2UuY3BwCisrKyBiL2RybS9jb21tb24vSURybU1hbmFnZXJTZXJ2aWNlLmNwcApAQCAtMzksNyArMzksNyBAQAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKIHN0YXRpYyB2b2lkIHdyaXRlRGVjcnlwdEhhbmRsZVRvUGFyY2VsRGF0YSgKLSAgICAgICAgY29uc3QgRGVjcnlwdEhhbmRsZSogaGFuZGxlLCBQYXJjZWwqIGRhdGEpIHsKKyAgICAgICAgY29uc3Qgc3A8RGVjcnlwdEhhbmRsZT4mIGhhbmRsZSwgUGFyY2VsKiBkYXRhKSB7CiAgICAgZGF0YS0+d3JpdGVJbnQzMihoYW5kbGUtPmRlY3J5cHRJZCk7CiAgICAgZGF0YS0+d3JpdGVTdHJpbmc4KGhhbmRsZS0+bWltZVR5cGUpOwogICAgIGRhdGEtPndyaXRlSW50MzIoaGFuZGxlLT5kZWNyeXB0QXBpVHlwZSk7CkBAIC02Nyw3ICs2Nyw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoCi0gICAgICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSwgY29uc3QgUGFyY2VsJiBkYXRhKSB7CisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBoYW5kbGUsIGNvbnN0IFBhcmNlbCYgZGF0YSkgewogICAgIGlmICgwID09IGRhdGEuZGF0YUF2YWlsKCkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTk5LDcgKzk5LDcgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNsZWFyRGVjcnlwdEhhbmRsZShEZWNyeXB0SGFuZGxlKiBoYW5kbGUpIHsKK3N0YXRpYyB2b2lkIGNsZWFyRGVjcnlwdEhhbmRsZShzcDxEZWNyeXB0SGFuZGxlPiAmaGFuZGxlKSB7CiAgICAgaWYgKGhhbmRsZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC00MTQsNyArNDE0LDcgQEAKIH0KIAogc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6Y29uc3VtZVJpZ2h0cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKICAgICBBTE9HVigiY29uc3VtZVJpZ2h0cyIpOwogICAgIFBhcmNlbCBkYXRhLCByZXBseTsKIApAQCAtNDMxLDcgKzQzMSw3IEBACiB9CiAKIHN0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OnNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgewogICAgIEFMT0dWKCJzZXRQbGF5YmFja1N0YXR1cyIpOwogICAgIFBhcmNlbCBkYXRhLCByZXBseTsKIApAQCAtNjAzLDcgKzYwMyw3IEBACiAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogfQogCi1EZWNyeXB0SGFuZGxlKiBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCitzcDxEZWNyeXB0SGFuZGxlPiBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoLCBjb25zdCBjaGFyKiBtaW1lKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIEJwRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbiIpOwogICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTYyMSw3ICs2MjEsNyBAQAogCiAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE9QRU5fREVDUllQVF9TRVNTSU9OLCBkYXRhLCAmcmVwbHkpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gTlVMTDsKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGU7CiAgICAgaWYgKDAgIT0gcmVwbHkuZGF0YUF2YWlsKCkpIHsKICAgICAgICAgaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKICAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YShoYW5kbGUsIHJlcGx5KTsKQEAgLTYyOSw3ICs2MjksNyBAQAogICAgIHJldHVybiBoYW5kbGU7CiB9CiAKLURlY3J5cHRIYW5kbGUqIEJwRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKK3NwPERlY3J5cHRIYW5kbGU+IEJwRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpIHsKIAogICAgIEFMT0dWKCJFbnRlcmluZyBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb246IG1pbWU9JXMiLCBtaW1lPyBtaW1lOiAiTlVMTCIpOwpAQCAtNjQ2LDcgKzY0Niw3IEBACiAKICAgICByZW1vdGUoKS0+dHJhbnNhY3QoT1BFTl9ERUNSWVBUX1NFU1NJT05fRlJPTV9VUkksIGRhdGEsICZyZXBseSk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBOVUxMOworICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZTsKICAgICBpZiAoMCAhPSByZXBseS5kYXRhQXZhaWwoKSkgewogICAgICAgICBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOwogICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgcmVwbHkpOwpAQCAtNjU2LDcgKzY1Niw3IEBACiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIAotRGVjcnlwdEhhbmRsZSogQnBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAorc3A8RGVjcnlwdEhhbmRsZT4gQnBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1CdWZmZXImIGJ1ZiwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKICAgICBBTE9HVigiRW50ZXJpbmcgQnBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uIik7CiAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtNjczLDcgKzY3Myw3IEBACiAKICAgICByZW1vdGUoKS0+dHJhbnNhY3QoT1BFTl9ERUNSWVBUX1NFU1NJT05fRk9SX1NUUkVBTUlORywgZGF0YSwgJnJlcGx5KTsKIAotICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IE5VTEw7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlOwogICAgIGlmICgwICE9IHJlcGx5LmRhdGFBdmFpbCgpKSB7CiAgICAgICAgIGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CiAgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoaGFuZGxlLCByZXBseSk7CkBAIC02ODMsNyArNjgzLDcgQEAKICAgICByZXR1cm4gaGFuZGxlOwogfQogCi1zdGF0dXNfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjpjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgeworc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6Y2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKSB7CiAgICAgQUxPR1YoImNsb3NlRGVjcnlwdFNlc3Npb24iKTsKICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAKQEAgLTY5OCw3ICs2OTgsNyBAQAogfQogCiBzdGF0dXNfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjppbml0aWFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgewogICAgIEFMT0dWKCJpbml0aWFsaXplRGVjcnlwdFVuaXQiKTsKICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC03MTgsNyArNzE4LDcgQEAKIH0KIAogc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6ZGVjcnlwdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpIHsKICAgICBBTE9HVigiZGVjcnlwdCIpOwogICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTc1NCw3ICs3NTQsNyBAQAogfQogCiBzdGF0dXNfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjpmaW5hbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgeworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKICAgICBBTE9HVigiZmluYWxpemVEZWNyeXB0VW5pdCIpOwogICAgIFBhcmNlbCBkYXRhLCByZXBseTsKIApAQCAtNzcwLDcgKzc3MCw3IEBACiB9CiAKIHNzaXplX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6cHJlYWQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIHZvaWQqIGJ1ZmZlciwKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIHZvaWQqIGJ1ZmZlciwKICAgICAgICAgICAgIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KSB7CiAgICAgQUxPR1YoInJlYWQiKTsKICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC0xMTI4LDE2ICsxMTI4LDE2IEBACiAKICAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKIAotICAgICAgICBEZWNyeXB0SGFuZGxlIGhhbmRsZTsKLSAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YSgmaGFuZGxlLCBkYXRhKTsKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YShoYW5kbGUsIGRhdGEpOwogCiAgICAgICAgIGNvbnN0IGludCBhY3Rpb24gPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICBjb25zdCBib29sIHJlc2VydmUgPSBzdGF0aWNfY2FzdDxib29sPihkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzCi0gICAgICAgICAgICA9IGNvbnN1bWVSaWdodHModW5pcXVlSWQsICZoYW5kbGUsIGFjdGlvbiwgcmVzZXJ2ZSk7CisgICAgICAgICAgICA9IGNvbnN1bWVSaWdodHModW5pcXVlSWQsIGhhbmRsZSwgYWN0aW9uLCByZXNlcnZlKTsKICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKIAotICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoJmhhbmRsZSk7CisgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwogICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogICAgIH0KIApAQCAtMTE0OCwxNiArMTE0OCwxNiBAQAogCiAgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSBoYW5kbGU7Ci0gICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoJmhhbmRsZSwgZGF0YSk7CisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoaGFuZGxlLCBkYXRhKTsKIAogICAgICAgICBjb25zdCBpbnQgcGxheWJhY2tTdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICBjb25zdCBpbnQ2NF90IHBvc2l0aW9uID0gZGF0YS5yZWFkSW50NjQoKTsKICAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzCi0gICAgICAgICAgICA9IHNldFBsYXliYWNrU3RhdHVzKHVuaXF1ZUlkLCAmaGFuZGxlLCBwbGF5YmFja1N0YXR1cywgcG9zaXRpb24pOworICAgICAgICAgICAgPSBzZXRQbGF5YmFja1N0YXR1cyh1bmlxdWVJZCwgaGFuZGxlLCBwbGF5YmFja1N0YXR1cywgcG9zaXRpb24pOwogICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogCi0gICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZSgmaGFuZGxlKTsKKyAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7CiAgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiAgICAgfQogCkBAIC0xMzI5LDEzICsxMzI5LDEzIEBACiAgICAgICAgIGNvbnN0IG9mZjY0X3QgbGVuZ3RoID0gZGF0YS5yZWFkSW50NjQoKTsKICAgICAgICAgY29uc3QgU3RyaW5nOCBtaW1lID0gZGF0YS5yZWFkU3RyaW5nOCgpOwogCi0gICAgICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZQorICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUKICAgICAgICAgICAgID0gb3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBmZCwgb2Zmc2V0LCBsZW5ndGgsIG1pbWUuc3RyaW5nKCkpOwogCi0gICAgICAgIGlmIChOVUxMICE9IGhhbmRsZSkgewotICAgICAgICAgICAgd3JpdGVEZWNyeXB0SGFuZGxlVG9QYXJjZWxEYXRhKGhhbmRsZSwgcmVwbHkpOworICAgICAgICBpZiAoTlVMTCAhPSBoYW5kbGUuZ2V0KCkpIHsKKyAgICAgICAgICAgIHdyaXRlRGVjcnlwdEhhbmRsZVRvUGFyY2VsRGF0YShoYW5kbGUuZ2V0KCksIHJlcGx5KTsKICAgICAgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwotICAgICAgICAgICAgZGVsZXRlIGhhbmRsZTsgaGFuZGxlID0gTlVMTDsKKyAgICAgICAgICAgIGhhbmRsZS5jbGVhcigpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiAgICAgfQpAQCAtMTM0OSwxMyArMTM0OSwxMyBAQAogICAgICAgICBjb25zdCBTdHJpbmc4IHVyaSA9IGRhdGEucmVhZFN0cmluZzgoKTsKICAgICAgICAgY29uc3QgU3RyaW5nOCBtaW1lID0gZGF0YS5yZWFkU3RyaW5nOCgpOwogCi0gICAgICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IG9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgdXJpLnN0cmluZygpLCBtaW1lLnN0cmluZygpKTsKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gb3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCB1cmkuc3RyaW5nKCksIG1pbWUuc3RyaW5nKCkpOwogCi0gICAgICAgIGlmIChOVUxMICE9IGhhbmRsZSkgewotICAgICAgICAgICAgd3JpdGVEZWNyeXB0SGFuZGxlVG9QYXJjZWxEYXRhKGhhbmRsZSwgcmVwbHkpOworICAgICAgICBpZiAoTlVMTCAhPSBoYW5kbGUuZ2V0KCkpIHsKKyAgICAgICAgICAgIHdyaXRlRGVjcnlwdEhhbmRsZVRvUGFyY2VsRGF0YShoYW5kbGUuZ2V0KCksIHJlcGx5KTsKIAogICAgICAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7Ci0gICAgICAgICAgICBkZWxldGUgaGFuZGxlOyBoYW5kbGUgPSBOVUxMOworICAgICAgICAgICAgaGFuZGxlLmNsZWFyKCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HVigiTlVMTCBkZWNyeXB0SGFuZGxlIGlzIHJldHVybmVkIik7CiAgICAgICAgIH0KQEAgLTEzNzMsMTMgKzEzNzMsMTIgQEAKICAgICAgICAgICAgICAgICBidWZmZXJTaXplKTsKICAgICAgICAgY29uc3QgU3RyaW5nOCBtaW1lVHlwZShkYXRhLnJlYWRTdHJpbmc4KCkpOwogCi0gICAgICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IG9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgYnVmLCBtaW1lVHlwZSk7CisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgYnVmLCBtaW1lVHlwZSk7CiAKICAgICAgICAgaWYgKGhhbmRsZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICB3cml0ZURlY3J5cHRIYW5kbGVUb1BhcmNlbERhdGEoaGFuZGxlLCByZXBseSk7CiAgICAgICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKLSAgICAgICAgICAgIGRlbGV0ZSBoYW5kbGU7Ci0gICAgICAgICAgICBoYW5kbGUgPSBOVUxMOworICAgICAgICAgICAgaGFuZGxlLmNsZWFyKCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HVigiTlVMTCBkZWNyeXB0SGFuZGxlIGlzIHJldHVybmVkIik7CiAgICAgICAgIH0KQEAgLTEzOTMsNyArMTM5Miw3IEBACiAKICAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKIAotICAgICAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOwogICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgZGF0YSk7CiAKICAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzID0gY2xvc2VEZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgaGFuZGxlKTsKQEAgLTE0MDgsOCArMTQwNyw4IEBACiAKICAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKIAotICAgICAgICBEZWNyeXB0SGFuZGxlIGhhbmRsZTsKLSAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YSgmaGFuZGxlLCBkYXRhKTsKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YShoYW5kbGUsIGRhdGEpOwogCiAgICAgICAgIGNvbnN0IGludCBkZWNyeXB0VW5pdElkID0gZGF0YS5yZWFkSW50MzIoKTsKIApAQCAtMTQxNywxNyArMTQxNiwxNyBAQAogICAgICAgICBjb25zdCB1aW50MzJfdCBidWZmZXJTaXplID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgaWYgKGJ1ZmZlclNpemUgPiBkYXRhLmRhdGFBdmFpbCgpKSB7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihCQURfVkFMVUUpOwotICAgICAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKCZoYW5kbGUpOworICAgICAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7CiAgICAgICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogICAgICAgICB9CiAgICAgICAgIERybUJ1ZmZlciogaGVhZGVySW5mbyA9IE5VTEw7CiAgICAgICAgIGhlYWRlckluZm8gPSBuZXcgRHJtQnVmZmVyKChjaGFyICopZGF0YS5yZWFkSW5wbGFjZShidWZmZXJTaXplKSwgYnVmZmVyU2l6ZSk7CiAKICAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzCi0gICAgICAgICAgICA9IGluaXRpYWxpemVEZWNyeXB0VW5pdCh1bmlxdWVJZCwgJmhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgaGVhZGVySW5mbyk7CisgICAgICAgICAgICA9IGluaXRpYWxpemVEZWNyeXB0VW5pdCh1bmlxdWVJZCwgaGFuZGxlLCBkZWNyeXB0VW5pdElkLCBoZWFkZXJJbmZvKTsKICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKIAotICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoJmhhbmRsZSk7CisgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwogICAgICAgICBkZWxldGUgaGVhZGVySW5mbzsgaGVhZGVySW5mbyA9IE5VTEw7CiAgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiAgICAgfQpAQCAtMTQzOSw4ICsxNDM4LDggQEAKIAogICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOwogCi0gICAgICAgIERlY3J5cHRIYW5kbGUgaGFuZGxlOwotICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKCZoYW5kbGUsIGRhdGEpOworICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZTsKKyAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YShoYW5kbGUsIGRhdGEpOwogCiAgICAgICAgIGNvbnN0IGludCBkZWNyeXB0VW5pdElkID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgY29uc3QgdWludDMyX3QgZGVjQnVmZmVyU2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CkBAIC0xNDUwLDcgKzE0NDksNyBAQAogICAgICAgICAgICAgZGVjQnVmZmVyU2l6ZSA+IE1BWF9CSU5ERVJfVFJBTlNBQ1RJT05fU0laRSkgewogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoQkFEX1ZBTFVFKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOwotICAgICAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKCZoYW5kbGUpOworICAgICAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7CiAgICAgICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogICAgICAgICB9CiAKQEAgLTE0NzAsNyArMTQ2OSw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMKLSAgICAgICAgICAgID0gZGVjcnlwdCh1bmlxdWVJZCwgJmhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgZW5jQnVmZmVyLCAmZGVjQnVmZmVyLCBJVik7CisgICAgICAgICAgICA9IGRlY3J5cHQodW5pcXVlSWQsIGhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgZW5jQnVmZmVyLCAmZGVjQnVmZmVyLCBJVik7CiAKICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKIApAQCAtMTQ4MCw3ICsxNDc5LDcgQEAKICAgICAgICAgICAgIHJlcGx5LT53cml0ZShkZWNCdWZmZXItPmRhdGEsIHNpemUpOwogICAgICAgICB9CiAKLSAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKCZoYW5kbGUpOworICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgZGVsZXRlIGVuY0J1ZmZlcjsgZW5jQnVmZmVyID0gTlVMTDsKICAgICAgICAgZGVsZXRlIGRlY0J1ZmZlcjsgZGVjQnVmZmVyID0gTlVMTDsKICAgICAgICAgZGVsZXRlIFtdIGJ1ZmZlcjsgYnVmZmVyID0gTlVMTDsKQEAgLTE0OTUsMTMgKzE0OTQsMTMgQEAKIAogICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOwogCi0gICAgICAgIERlY3J5cHRIYW5kbGUgaGFuZGxlOwotICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKCZoYW5kbGUsIGRhdGEpOworICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgZGF0YSk7CiAKLSAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzID0gZmluYWxpemVEZWNyeXB0VW5pdCh1bmlxdWVJZCwgJmhhbmRsZSwgZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IGZpbmFsaXplRGVjcnlwdFVuaXQodW5pcXVlSWQsIGhhbmRsZSwgZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAKLSAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKCZoYW5kbGUpOworICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKICAgICB9CiAKQEAgLTE1MTIsOCArMTUxMSw4IEBACiAKICAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKIAotICAgICAgICBEZWNyeXB0SGFuZGxlIGhhbmRsZTsKLSAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YSgmaGFuZGxlLCBkYXRhKTsKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YShoYW5kbGUsIGRhdGEpOwogCiAgICAgICAgIGNvbnN0IHVpbnQzMl90IG51bUJ5dGVzID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgaWYgKG51bUJ5dGVzID4gTUFYX0JJTkRFUl9UUkFOU0FDVElPTl9TSVpFKSB7CkBAIC0xNTI0LDEzICsxNTIzLDEzIEBACiAKICAgICAgICAgY29uc3Qgb2ZmNjRfdCBvZmZzZXQgPSBkYXRhLnJlYWRJbnQ2NCgpOwogCi0gICAgICAgIHNzaXplX3QgcmVzdWx0ID0gcHJlYWQodW5pcXVlSWQsICZoYW5kbGUsIGJ1ZmZlciwgbnVtQnl0ZXMsIG9mZnNldCk7CisgICAgICAgIHNzaXplX3QgcmVzdWx0ID0gcHJlYWQodW5pcXVlSWQsIGhhbmRsZSwgYnVmZmVyLCBudW1CeXRlcywgb2Zmc2V0KTsKICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKICAgICAgICAgaWYgKDAgPCByZXN1bHQpIHsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZShidWZmZXIsIHJlc3VsdCk7CiAgICAgICAgIH0KIAotICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoJmhhbmRsZSk7CisgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwogICAgICAgICBkZWxldGUgW10gYnVmZmVyLCBidWZmZXIgPSBOVUxMOwogICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogICAgIH0KZGlmZiAtLWdpdCBhL2RybS9jb21tb24vaW5jbHVkZS9Ecm1FbmdpbmVCYXNlLmggYi9kcm0vY29tbW9uL2luY2x1ZGUvRHJtRW5naW5lQmFzZS5oCmluZGV4IDQxNzEwN2YuLjczZjExYTQgMTAwNjQ0Ci0tLSBhL2RybS9jb21tb24vaW5jbHVkZS9Ecm1FbmdpbmVCYXNlLmgKKysrIGIvZHJtL2NvbW1vbi9pbmNsdWRlL0RybUVuZ2luZUJhc2UuaApAQCAtNTksMTAgKzU5LDExIEBACiAKICAgICBpbnQgY2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uKTsKIAotICAgIHN0YXR1c190IGNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpOworICAgIHN0YXR1c190IGNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwKKyAgICAgICAgICAgIGJvb2wgcmVzZXJ2ZSk7CiAKICAgICBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CiAKICAgICBib29sIHZhbGlkYXRlQWN0aW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uLCBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pOwpAQCAtODAsMjcgKzgxLDI4IEBACiAgICAgRHJtU3VwcG9ydEluZm8qIGdldFN1cHBvcnRJbmZvKGludCB1bmlxdWVJZCk7CiAKICAgICBzdGF0dXNfdCBvcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgsIGNvbnN0IGNoYXIqIG1pbWUpOwogCiAgICAgc3RhdHVzX3Qgb3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSk7CiAKLSAgICBzdGF0dXNfdCBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHN0YXR1c190IG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyJiBidWYsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKIAotICAgIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKTsKKyAgICBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpOwogCi0gICAgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pOwogCi0gICAgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKTsKIAotICAgIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCk7CisgICAgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQpOwogCi0gICAgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCk7CiAKIHByb3RlY3RlZDoKQEAgLTI2NSw3ICsyNjcsNyBAQAogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvbkNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25Db25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpID0gMDsKIAogICAgIC8qKgpAQCAtMjgwLDcgKzI4Miw4IEBACiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25TZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSA9IDA7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsCisgICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBWYWxpZGF0ZXMgd2hldGhlciBhbiBhY3Rpb24gb24gdGhlIERSTSBjb250ZW50IGlzIGFsbG93ZWQgb3Igbm90LgpAQCAtMzgxLDcgKzM4NCw3IEBACiAgICAgICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoKSA9IDA7CiAKICAgICAvKioKQEAgLTM5OCw3ICs0MDEsNyBAQAogICAgICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCAvKiB1bmlxdWVJZCAqLywgRGVjcnlwdEhhbmRsZSogLyogZGVjcnlwdEhhbmRsZSAqLywKKyAgICAgICAgICAgIGludCAvKiB1bmlxdWVJZCAqLywgc3A8RGVjcnlwdEhhbmRsZT4mIC8qIGRlY3J5cHRIYW5kbGUgKi8sCiAgICAgICAgICAgICBpbnQgLyogZmQgKi8sIG9mZjY0X3QgLyogb2Zmc2V0ICovLCBvZmY2NF90IC8qIGxlbmd0aCAqLywKICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qIG1pbWUgKi8pIHsKIApAQCAtNDE1LDcgKzQxOCw3IEBACiAgICAgICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVyaSkgPSAwOwogCiAgICAgLyoqCkBAIC00MzAsNyArNDMzLDcgQEAKICAgICAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICBpbnQgLyogdW5pcXVlSWQgKi8sIERlY3J5cHRIYW5kbGUqIC8qIGRlY3J5cHRIYW5kbGUgKi8sCisgICAgICAgICAgICBpbnQgLyogdW5pcXVlSWQgKi8sIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLAogICAgICAgICAgICAgY29uc3QgY2hhciogLyogdXJpICovLCBjb25zdCBjaGFyKiAvKiBtaW1lICovKSB7CiAKICAgICAgICAgcmV0dXJuIERSTV9FUlJPUl9DQU5OT1RfSEFORExFOwpAQCAtNDQ3LDcgKzQ1MCw3IEBACiAgICAgICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIC8qIGRlY3J5cHRIYW5kbGUgKi8sCisgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciYgLyogYnVmICovLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgLyogbWltZVR5cGUgKi8pIHsKICAgICAgICAgcmV0dXJuIERSTV9FUlJPUl9DQU5OT1RfSEFORExFOwpAQCAtNDYxLDcgKzQ2NCw3IEBACiAgICAgICogQHJldHVybiBzdGF0dXNfdAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBJbml0aWFsaXplIGRlY3J5cHRpb24gZm9yIHRoZSBnaXZlbiB1bml0IG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudApAQCAtNDczLDcgKzQ3Niw3IEBACiAgICAgICogQHJldHVybiBzdGF0dXNfdAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSA9IDA7CiAKICAgICAvKioKQEAgLTQ5Myw3ICs0OTYsNyBAQAogICAgICAqICAgICBEUk1fRVJST1JfU0VTU0lPTl9OT1RfT1BFTkVELCBEUk1fRVJST1JfREVDUllQVF9VTklUX05PVF9JTklUSUFMSVpFRCwKICAgICAgKiAgICAgRFJNX0VSUk9SX0RFQ1JZUFQgZm9yIGZhaWx1cmUuCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uRGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpID0gMDsKIAogICAgIC8qKgpAQCAtNTA2LDcgKzUwOSw3IEBACiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25GaW5hbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgPSAwOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpID0gMDsKIAogICAgIC8qKgogICAgICAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gYW4gb3BlbiBEUk0gZmlsZS4KQEAgLTUxOSw3ICs1MjIsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiBOdW1iZXIgb2YgYnl0ZXMgcmVhZC4gUmV0dXJucyAtMSBmb3IgRmFpbHVyZS4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHNzaXplX3Qgb25QcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgdmlydHVhbCBzc2l6ZV90IG9uUHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpID0gMDsKIH07CiAKZGlmZiAtLWdpdCBhL2RybS9jb21tb24vaW5jbHVkZS9JRHJtRW5naW5lLmggYi9kcm0vY29tbW9uL2luY2x1ZGUvSURybUVuZ2luZS5oCmluZGV4IGFjYzhlZDkuLjE4MzdhMTEgMTAwNjQ0Ci0tLSBhL2RybS9jb21tb24vaW5jbHVkZS9JRHJtRW5naW5lLmgKKysrIGIvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1FbmdpbmUuaApAQCAtMjEwLDcgKzIxMCw3IEBACiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSA9IDA7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpID0gMDsKIAogICAgIC8qKgogICAgICAqIEluZm9ybXMgdGhlIERSTSBFbmdpbmUgYWJvdXQgdGhlIHBsYXliYWNrIGFjdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSBEUk0gZmlsZXMuCkBAIC0yMjMsNyArMjIzLDcgQEAKICAgICAgKiBAcmV0dXJuIHN0YXR1c190CiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tTdGF0dXMoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tTdGF0dXMoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgPSAwOwogCiAgICAgLyoqCkBAIC0zMjcsNyArMzI3LDcgQEAKICAgICAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoLCBjb25zdCBjaGFyKiBtaW1lKSA9IDA7CiAKICAgICAvKioKQEAgLTM0Miw3ICszNDIsNyBAQAogICAgICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKSA9IDA7CiAKICAgICAvKioKQEAgLTM1NSw3ICszNTUsNyBAQAogICAgICAqIEByZXR1cm4KICAgICAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyJiBidWYsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSA9IDA7CiAKICAgICAvKioKQEAgLTM2Niw3ICszNjYsNyBAQAogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBJbml0aWFsaXplIGRlY3J5cHRpb24gZm9yIHRoZSBnaXZlbiB1bml0IG9mIHRoZSBwcm90ZWN0ZWQgY29udGVudApAQCAtMzc4LDcgKzM3OCw3IEBACiAgICAgICogQHJldHVybiBzdGF0dXNfdAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pID0gMDsKIAogICAgIC8qKgpAQCAtMzk4LDcgKzM5OCw3IEBACiAgICAgICogICAgIERSTV9FUlJPUl9TRVNTSU9OX05PVF9PUEVORUQsIERSTV9FUlJPUl9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVELAogICAgICAqICAgICBEUk1fRVJST1JfREVDUllQVCBmb3IgZmFpbHVyZS4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSA9IDA7CiAKICAgICAvKioKQEAgLTQxMSw3ICs0MTEsNyBAQAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSA9IDA7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgPSAwOwogCiAgICAgLyoqCiAgICAgICogUmVhZHMgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMgZnJvbSBhbiBvcGVuIERSTSBmaWxlLgpAQCAtNDI0LDcgKzQyNCw3IEBACiAgICAgICoKICAgICAgKiBAcmV0dXJuIE51bWJlciBvZiBieXRlcyByZWFkLiBSZXR1cm5zIC0xIGZvciBGYWlsdXJlLgogICAgICAqLwotICAgIHZpcnR1YWwgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgdmlydHVhbCBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KSA9IDA7CiB9OwogCmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL2luY2x1ZGUvSURybU1hbmFnZXJTZXJ2aWNlLmggYi9kcm0vY29tbW9uL2luY2x1ZGUvSURybU1hbmFnZXJTZXJ2aWNlLmgKaW5kZXggMDM3NmI0OS4uODM2YWUwYSAxMDA2NDQKLS0tIGEvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1NYW5hZ2VyU2VydmljZS5oCisrKyBiL2RybS9jb21tb24vaW5jbHVkZS9JRHJtTWFuYWdlclNlcnZpY2UuaApAQCAtMTE1LDEwICsxMTUsMTEgQEAKICAgICB2aXJ0dWFsIGludCBjaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSA9IDA7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tTdGF0dXMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgPSAwOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLAorICAgICAgICAgICAgaW50NjRfdCBwb3NpdGlvbikgPSAwOwogCiAgICAgdmlydHVhbCBib29sIHZhbGlkYXRlQWN0aW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLApAQCAtMTM4LDI4ICsxMzksMjggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFsbFN1cHBvcnRJbmZvKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQqIGxlbmd0aCwgRHJtU3VwcG9ydEluZm8qKiBkcm1TdXBwb3J0SW5mb0FycmF5KSA9IDA7CiAKLSAgICB2aXJ0dWFsIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgb2ZmNjRfdCBsZW5ndGgsIGNvbnN0IGNoYXIqIG1pbWUpID0gMDsKIAotICAgIHZpcnR1YWwgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKSA9IDA7CiAKLSAgICB2aXJ0dWFsIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgRHJtQnVmZmVyJiBidWYsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgdmlydHVhbCBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgPSAwOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpID0gMDsKIAotICAgIHZpcnR1YWwgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgdmlydHVhbCBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsb2ZmNjRfdCBvZmZzZXQpID0gMDsKIH07CiAKQEAgLTIwMywxMCArMjA0LDEwIEBACiAgICAgdmlydHVhbCBpbnQgY2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKTsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKIAogICAgIHZpcnR1YWwgYm9vbCB2YWxpZGF0ZUFjdGlvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbiwgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKTsKQEAgLTIyNSwyOCArMjI2LDI4IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBbGxTdXBwb3J0SW5mbygKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50KiBsZW5ndGgsIERybVN1cHBvcnRJbmZvKiogZHJtU3VwcG9ydEluZm9BcnJheSk7CiAKLSAgICB2aXJ0dWFsIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoLAogICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1pbWUpOwogCi0gICAgdmlydHVhbCBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpOwogCi0gICAgdmlydHVhbCBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IERybUJ1ZmZlciYgYnVmLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgdmlydHVhbCBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVik7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKIAotICAgIHZpcnR1YWwgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgdmlydHVhbCBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KTsKIH07CiAKZGlmZiAtLWdpdCBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwCmluZGV4IGJmMDRhODkuLmFmYmNiMzkgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAKKysrIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcApAQCAtMjY3LDcgKzI2Nyw3IEBACiB9CiAKIHN0YXR1c190IERybU1hbmFnZXI6OmNvbnN1bWVSaWdodHMoCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlY3J5cHRMb2NrKTsKICAgICBpZiAobURlY3J5cHRTZXNzaW9uTWFwLmluZGV4T2ZLZXkoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSAhPSBOQU1FX05PVF9GT1VORCkgewpAQCAtMjc4LDcgKzI3OCw3IEBACiB9CiAKIHN0YXR1c190IERybU1hbmFnZXI6OnNldFBsYXliYWNrU3RhdHVzKAotICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CisgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWNyeXB0TG9jayk7CiAgICAgaWYgKG1EZWNyeXB0U2Vzc2lvbk1hcC5pbmRleE9mS2V5KGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkgIT0gTkFNRV9OT1RfRk9VTkQpIHsKQEAgLTM5NiwxNSArMzk2LDE1IEBACiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIAotRGVjcnlwdEhhbmRsZSogRHJtTWFuYWdlcjo6b3BlbkRlY3J5cHRTZXNzaW9uKAorc3A8RGVjcnlwdEhhbmRsZT4gRHJtTWFuYWdlcjo6b3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoLCBjb25zdCBjaGFyKiBtaW1lKSB7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlY3J5cHRMb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRTsKICAgICBWZWN0b3I8U3RyaW5nOD4gcGx1Z0luSWRMaXN0ID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luSWRMaXN0KCk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOwotICAgIGlmIChOVUxMICE9IGhhbmRsZSkgeworICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgaWYgKE5VTEwgIT0gaGFuZGxlLmdldCgpKSB7CiAgICAgICAgIGhhbmRsZS0+ZGVjcnlwdElkID0gbURlY3J5cHRTZXNzaW9uSWQgKyAxOwogCiAgICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBwbHVnSW5JZExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7CkBAIC00MjAsMTkgKzQyMCwxOSBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChEUk1fTk9fRVJST1IgIT0gcmVzdWx0KSB7Ci0gICAgICAgIGRlbGV0ZSBoYW5kbGU7IGhhbmRsZSA9IE5VTEw7CisgICAgICAgIGhhbmRsZS5jbGVhcigpOwogICAgIH0KICAgICByZXR1cm4gaGFuZGxlOwogfQogCi1EZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyOjpvcGVuRGVjcnlwdFNlc3Npb24oCitzcDxEZWNyeXB0SGFuZGxlPiBEcm1NYW5hZ2VyOjpvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWNyeXB0TG9jayk7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEU7CiAgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJbklkTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKLSAgICBpZiAoTlVMTCAhPSBoYW5kbGUpIHsKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgIGlmIChOVUxMICE9IGhhbmRsZS5nZXQoKSkgewogICAgICAgICBoYW5kbGUtPmRlY3J5cHRJZCA9IG1EZWNyeXB0U2Vzc2lvbklkICsgMTsKIAogICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcGx1Z0luSWRMaXN0LnNpemUoKTsgaW5kZXgrKykgewpAQCAtNDQ4LDIwICs0NDgsMjAgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoRFJNX05PX0VSUk9SICE9IHJlc3VsdCkgewotICAgICAgICBkZWxldGUgaGFuZGxlOyBoYW5kbGUgPSBOVUxMOworICAgICAgICBoYW5kbGUuY2xlYXIoKTsKICAgICAgICAgQUxPR1YoIkRybU1hbmFnZXI6Om9wZW5EZWNyeXB0U2Vzc2lvbjogbm8gY2FwYWJsZSBwbHVnLWluIGZvdW5kIik7CiAgICAgfQogICAgIHJldHVybiBoYW5kbGU7CiB9CiAKLURlY3J5cHRIYW5kbGUqIERybU1hbmFnZXI6Om9wZW5EZWNyeXB0U2Vzc2lvbigKK3NwPERlY3J5cHRIYW5kbGU+IERybU1hbmFnZXI6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1CdWZmZXImIGJ1ZiwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlY3J5cHRMb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRTsKICAgICBWZWN0b3I8U3RyaW5nOD4gcGx1Z0luSWRMaXN0ID0gbVBsdWdJbk1hbmFnZXIuZ2V0UGx1Z0luSWRMaXN0KCk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOwotICAgIGlmIChOVUxMICE9IGhhbmRsZSkgeworICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgaWYgKE5VTEwgIT0gaGFuZGxlLmdldCgpKSB7CiAgICAgICAgIGhhbmRsZS0+ZGVjcnlwdElkID0gbURlY3J5cHRTZXNzaW9uSWQgKyAxOwogCiAgICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBwbHVnSW5JZExpc3Quc2l6ZSgpOyBpbmRleCsrKSB7CkBAIC00NzcsMjAgKzQ3NywxOSBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChEUk1fTk9fRVJST1IgIT0gcmVzdWx0KSB7Ci0gICAgICAgIGRlbGV0ZSBoYW5kbGU7Ci0gICAgICAgIGhhbmRsZSA9IE5VTEw7CisgICAgICAgIGhhbmRsZS5jbGVhcigpOwogICAgICAgICBBTE9HVigiRHJtTWFuYWdlcjo6b3BlbkRlY3J5cHRTZXNzaW9uOiBubyBjYXBhYmxlIHBsdWctaW4gZm91bmQiKTsKICAgICB9CiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIAotc3RhdHVzX3QgRHJtTWFuYWdlcjo6Y2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpIHsKK3N0YXR1c190IERybU1hbmFnZXI6OmNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOwogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIGlmIChtRGVjcnlwdFNlc3Npb25NYXAuaW5kZXhPZktleShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CiAgICAgICAgIElEcm1FbmdpbmUqIGRybUVuZ2luZSA9IG1EZWNyeXB0U2Vzc2lvbk1hcC52YWx1ZUZvcihkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpOwogICAgICAgICByZXN1bHQgPSBkcm1FbmdpbmUtPmNsb3NlRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUpOwotICAgICAgICBpZiAoRFJNX05PX0VSUk9SID09IHJlc3VsdCkgeworICAgICAgICBpZiAoRFJNX05PX0VSUk9SID09IHJlc3VsdCAmJiBOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgICAgIG1EZWNyeXB0U2Vzc2lvbk1hcC5yZW1vdmVJdGVtKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCk7CiAgICAgICAgIH0KICAgICB9CkBAIC00OTgsNyArNDk3LDggQEAKIH0KIAogc3RhdHVzX3QgRHJtTWFuYWdlcjo6aW5pdGlhbGl6ZURlY3J5cHRVbml0KAotICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgeworICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSB7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWNyeXB0TG9jayk7CiAgICAgaWYgKG1EZWNyeXB0U2Vzc2lvbk1hcC5pbmRleE9mS2V5KGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkgIT0gTkFNRV9OT1RfRk9VTkQpIHsKQEAgLTUwOCw3ICs1MDgsNyBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXR1c190IERybU1hbmFnZXI6OmRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKK3N0YXR1c190IERybU1hbmFnZXI6OmRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSB7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CiAKQEAgLTUyMiw3ICs1MjIsNyBAQAogfQogCiBzdGF0dXNfdCBEcm1NYW5hZ2VyOjpmaW5hbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgeworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlY3J5cHRMb2NrKTsKICAgICBpZiAobURlY3J5cHRTZXNzaW9uTWFwLmluZGV4T2ZLZXkoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSAhPSBOQU1FX05PVF9GT1VORCkgewpAQCAtNTMyLDcgKzUzMiw3IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3NpemVfdCBEcm1NYW5hZ2VyOjpwcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCitzc2l6ZV90IERybU1hbmFnZXI6OnByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KSB7CiAgICAgc3NpemVfdCByZXN1bHQgPSBERUNSWVBUX0ZJTEVfRVJST1I7CiAKZGlmZiAtLWdpdCBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5oIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmgKaW5kZXggZTdjZGQzNi4uMjYyMjJiYyAxMDA2NDQKLS0tIGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmgKKysrIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmgKQEAgLTg5LDEwICs4OSwxMSBAQAogCiAgICAgaW50IGNoZWNrUmlnaHRzU3RhdHVzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbik7CiAKLSAgICBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKTsKKyAgICBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sCisgICAgICAgICAgICBib29sIHJlc2VydmUpOwogCiAgICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tTdGF0dXMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOwogCiAgICAgYm9vbCB2YWxpZGF0ZUFjdGlvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbiwgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKTsKQEAgLTEwOSwyNSArMTEwLDI2IEBACiAKICAgICBzdGF0dXNfdCBnZXRBbGxTdXBwb3J0SW5mbyhpbnQgdW5pcXVlSWQsIGludCogbGVuZ3RoLCBEcm1TdXBwb3J0SW5mbyoqIGRybVN1cHBvcnRJbmZvQXJyYXkpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgsIGNvbnN0IGNoYXIqIG1pbWUpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKTsKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgRHJtQnVmZmVyJiBidWYsCisgICAgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgRHJtQnVmZmVyJiBidWYsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CiAKLSAgICBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSk7CisgICAgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKTsKIAotICAgIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKTsKIAotICAgIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVik7CiAKLSAgICBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpOworICAgIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkKTsKIAotICAgIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpOwogCiAgICAgdm9pZCBvbkluZm8oY29uc3QgRHJtSW5mb0V2ZW50JiBldmVudCk7CmRpZmYgLS1naXQgYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmNwcCBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuY3BwCmluZGV4IGRhZDU5OWIuLjI2MDBhMmMgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuY3BwCisrKyBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuY3BwCkBAIC01OCwyMiArNTgsMjYgQEAKICAgICByZXR1cm4gZHJtX3Blcm1fbGFiZWxzW2luZGV4XTsKIH0KIAotYm9vbCBEcm1NYW5hZ2VyU2VydmljZTo6c2VsaW51eElzUHJvdGVjdGVkQ2FsbEFsbG93ZWQocGlkX3Qgc3BpZCwgZHJtX3Blcm1fdCBwZXJtKSB7Citib29sIERybU1hbmFnZXJTZXJ2aWNlOjpzZWxpbnV4SXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChwaWRfdCBzcGlkLCBjb25zdCBjaGFyKiBzc2lkLCBkcm1fcGVybV90IHBlcm0pIHsKICAgICBpZiAoc2VsaW51eF9lbmFibGVkIDw9IDApIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgY2hhciAqc2N0eDsKKyAgICBjaGFyICpzY3R4ID0gTlVMTDsKICAgICBjb25zdCBjaGFyICpzZWxpbnV4X2NsYXNzID0gImRybXNlcnZpY2UiOwogICAgIGNvbnN0IGNoYXIgKnN0cl9wZXJtID0gZ2V0X3Blcm1fbGFiZWwocGVybSk7CiAKLSAgICBpZiAoZ2V0cGlkY29uKHNwaWQsICZzY3R4KSAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJTRUxpbnV4OiBnZXRwaWRjb24ocGlkPSVkKSBmYWlsZWQuXG4iLCBzcGlkKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChzc2lkID09IE5VTEwpIHsKKyAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMjEwMzUwNDIiKTsKKworICAgICAgICBpZiAoZ2V0cGlkY29uKHNwaWQsICZzY3R4KSAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiU0VMaW51eDogZ2V0cGlkY29uKHBpZD0lZCkgZmFpbGVkLlxuIiwgc3BpZCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBib29sIGFsbG93ZWQgPSAoc2VsaW51eF9jaGVja19hY2Nlc3Moc2N0eCwgZHJtc2VydmVyX2NvbnRleHQsIHNlbGludXhfY2xhc3MsCi0gICAgICAgICAgICBzdHJfcGVybSwgTlVMTCkgPT0gMCk7CisgICAgYm9vbCBhbGxvd2VkID0gKHNlbGludXhfY2hlY2tfYWNjZXNzKHNzaWQgPyBzc2lkIDogc2N0eCwgZHJtc2VydmVyX2NvbnRleHQsCisgICAgICAgICAgICBzZWxpbnV4X2NsYXNzLCBzdHJfcGVybSwgTlVMTCkgPT0gMCk7CiAgICAgZnJlZWNvbihzY3R4KTsKIAogICAgIHJldHVybiBhbGxvd2VkOwpAQCAtODYsMTAgKzkwLDExIEBACiAgICAgSVBDVGhyZWFkU3RhdGUqIGlwY1N0YXRlID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKTsKICAgICB1aWRfdCB1aWQgPSBpcGNTdGF0ZS0+Z2V0Q2FsbGluZ1VpZCgpOwogICAgIHBpZF90IHNwaWQgPSBpcGNTdGF0ZS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIGNvbnN0IGNoYXIqIHNzaWQgPSBpcGNTdGF0ZS0+Z2V0Q2FsbGluZ1NpZCgpOwogCiAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCB0cnVzdGVkVWlkcy5zaXplKCk7ICsraSkgewogICAgICAgICBpZiAodHJ1c3RlZFVpZHNbaV0gPT0gdWlkKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2VsaW51eElzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoc3BpZCwgcGVybSk7CisgICAgICAgICAgICByZXR1cm4gc2VsaW51eElzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoc3BpZCwgc3NpZCwgcGVybSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtOTcsNyArMTAyLDkgQEAKIAogdm9pZCBEcm1NYW5hZ2VyU2VydmljZTo6aW5zdGFudGlhdGUoKSB7CiAgICAgQUxPR1YoImluc3RhbnRpYXRlIik7Ci0gICAgZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmFkZFNlcnZpY2UoU3RyaW5nMTYoImRybS5kcm1NYW5hZ2VyIiksIG5ldyBEcm1NYW5hZ2VyU2VydmljZSgpKTsKKyAgICBzcDxEcm1NYW5hZ2VyU2VydmljZT4gc2VydmljZSA9IG5ldyBEcm1NYW5hZ2VyU2VydmljZSgpOworICAgIHNlcnZpY2UtPnNldFJlcXVlc3RpbmdTaWQodHJ1ZSk7CisgICAgZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmFkZFNlcnZpY2UoU3RyaW5nMTYoImRybS5kcm1NYW5hZ2VyIiksIHNlcnZpY2UpOwogCiAgICAgaWYgKDAgPj0gdHJ1c3RlZFVpZHMuc2l6ZSgpKSB7CiAgICAgICAgIC8vIFRPRE8KQEAgLTIwNiw3ICsyMTMsNyBAQAogfQogCiBzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6Y29uc3VtZVJpZ2h0cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpIHsKICAgICBBTE9HVigiRW50ZXJpbmcgY29uc3VtZVJpZ2h0cyIpOwogICAgIGlmICghaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChDT05TVU1FX1JJR0hUUykpIHsKICAgICAgICAgcmV0dXJuIERSTV9FUlJPUl9OT19QRVJNSVNTSU9OOwpAQCAtMjE1LDcgKzIyMiw3IEBACiB9CiAKIHN0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjpzZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pIHsKICAgICBBTE9HVigiRW50ZXJpbmcgc2V0UGxheWJhY2tTdGF0dXMiKTsKICAgICBpZiAoIWlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoU0VUX1BMQVlCQUNLX1NUQVRVUykpIHsKICAgICAgICAgcmV0dXJuIERSTV9FUlJPUl9OT19QRVJNSVNTSU9OOwpAQCAtMjYyLDcgKzI2OSw3IEBACiAgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5nZXRBbGxTdXBwb3J0SW5mbyh1bmlxdWVJZCwgbGVuZ3RoLCBkcm1TdXBwb3J0SW5mb0FycmF5KTsKIH0KIAotRGVjcnlwdEhhbmRsZSogRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKK3NwPERlY3J5cHRIYW5kbGU+IERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoLCBjb25zdCBjaGFyKiBtaW1lKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24iKTsKICAgICBpZiAoaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChPUEVOX0RFQ1JZUFRfU0VTU0lPTikpIHsKQEAgLTI3Miw3ICsyNzksNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1EZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAorc3A8RGVjcnlwdEhhbmRsZT4gRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24gd2l0aCB1cmkiKTsKICAgICBpZiAoaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChPUEVOX0RFQ1JZUFRfU0VTU0lPTikpIHsKQEAgLTI4Miw3ICsyODksNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1EZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAorc3A8RGVjcnlwdEhhbmRsZT4gRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgRHJtQnVmZmVyJiBidWYsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24gZm9yIHN0cmVhbWluZyIpOwogICAgIGlmIChpc1Byb3RlY3RlZENhbGxBbGxvd2VkKE9QRU5fREVDUllQVF9TRVNTSU9OKSkgewpAQCAtMjkyLDcgKzI5OSw3IEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLXN0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjpjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgeworc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OmNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSkgewogICAgIEFMT0dWKCJFbnRlcmluZyBjbG9zZURlY3J5cHRTZXNzaW9uIik7CiAgICAgaWYgKCFpc1Byb3RlY3RlZENhbGxBbGxvd2VkKENMT1NFX0RFQ1JZUFRfU0VTU0lPTikpIHsKICAgICAgICAgcmV0dXJuIERSTV9FUlJPUl9OT19QRVJNSVNTSU9OOwpAQCAtMzAwLDcgKzMwNyw3IEBACiAgICAgcmV0dXJuIG1Ecm1NYW5hZ2VyLT5jbG9zZURlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlKTsKIH0KIAotc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OmluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCitzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6aW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIGluaXRpYWxpemVEZWNyeXB0VW5pdCIpOwogICAgIGlmICghaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChJTklUSUFMSVpFX0RFQ1JZUFRfVU5JVCkpIHsKQEAgLTMxMCw3ICszMTcsNyBAQAogfQogCiBzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6ZGVjcnlwdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpIHsKICAgICBBTE9HVigiRW50ZXJpbmcgZGVjcnlwdCIpOwogICAgIGlmICghaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChERUNSWVBUKSkgewpAQCAtMzIwLDcgKzMyNyw3IEBACiB9CiAKIHN0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjpmaW5hbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgeworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKICAgICBBTE9HVigiRW50ZXJpbmcgZmluYWxpemVEZWNyeXB0VW5pdCIpOwogICAgIGlmICghaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChGSU5BTElaRV9ERUNSWVBUX1VOSVQpKSB7CiAgICAgICAgIHJldHVybiBEUk1fRVJST1JfTk9fUEVSTUlTU0lPTjsKQEAgLTMyOCw3ICszMzUsNyBAQAogICAgIHJldHVybiBtRHJtTWFuYWdlci0+ZmluYWxpemVEZWNyeXB0VW5pdCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCk7CiB9CiAKLXNzaXplX3QgRHJtTWFuYWdlclNlcnZpY2U6OnByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKK3NzaXplX3QgRHJtTWFuYWdlclNlcnZpY2U6OnByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIHByZWFkIik7CiAgICAgaWYgKCFpc1Byb3RlY3RlZENhbGxBbGxvd2VkKFBSRUFEKSkgewpkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5oIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5oCmluZGV4IDQ1Y2VlMmUuLjJlMjdhM2MgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuaAorKysgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmgKQEAgLTYwLDcgKzYwLDcgQEAKIAogICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXRfcGVybV9sYWJlbChkcm1fcGVybV90IHBlcm0pOwogCi0gICAgc3RhdGljIGJvb2wgc2VsaW51eElzUHJvdGVjdGVkQ2FsbEFsbG93ZWQocGlkX3Qgc3BpZCwgZHJtX3Blcm1fdCBwZXJtKTsKKyAgICBzdGF0aWMgYm9vbCBzZWxpbnV4SXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChwaWRfdCBzcGlkLCBjb25zdCBjaGFyKiBzc2lkLCBkcm1fcGVybV90IHBlcm0pOwogCiAgICAgc3RhdGljIGJvb2wgaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChkcm1fcGVybV90IHBlcm0pOwogCkBAIC05NSwxMCArOTUsMTEgQEAKIAogICAgIGludCBjaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsaW50IGFjdGlvbik7CiAKLSAgICBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKTsKKyAgICBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sCisgICAgICAgICAgICBib29sIHJlc2VydmUpOwogCiAgICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tTdGF0dXMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOwogCiAgICAgYm9vbCB2YWxpZGF0ZUFjdGlvbihpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsCiAgICAgICAgICAgICBpbnQgYWN0aW9uLCBjb25zdCBBY3Rpb25EZXNjcmlwdGlvbiYgZGVzY3JpcHRpb24pOwpAQCAtMTE1LDI2ICsxMTYsMjcgQEAKIAogICAgIHN0YXR1c190IGdldEFsbFN1cHBvcnRJbmZvKGludCB1bmlxdWVJZCwgaW50KiBsZW5ndGgsIERybVN1cHBvcnRJbmZvKiogZHJtU3VwcG9ydEluZm9BcnJheSk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoLCBjb25zdCBjaGFyICptaW1lKTsKIAotICAgIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKTsKIAotICAgIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IERybUJ1ZmZlciYgYnVmLAorICAgIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IERybUJ1ZmZlciYgYnVmLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpOwogCi0gICAgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpOworICAgIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSk7CiAKLSAgICBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbyk7CiAKLSAgICBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpOwogCi0gICAgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKKyAgICBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCk7CiAKLSAgICBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9BbmRyb2lkLmJwIGIvZHJtL2xpYmRybWZyYW1ld29yay9BbmRyb2lkLmJwCmluZGV4IDQzYmE3MmIuLjk0MGMxN2QgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvQW5kcm9pZC5icAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL0FuZHJvaWQuYnAKQEAgLTM5LDQgKzM5LDMgQEAKICAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAogfQogCi1zdWJkaXJzID0gWyJwbHVnaW5zLyoiXQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9Ecm1NYW5hZ2VyQ2xpZW50SW1wbC5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnRJbXBsLmNwcAppbmRleCBjMDQ3ZWIxLi5iMGE0NDFiIDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnRJbXBsLmNwcAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL0RybU1hbmFnZXJDbGllbnRJbXBsLmNwcApAQCAtMTgzLDcgKzE4Myw3IEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgewogICAgICAgICBzdGF0dXMgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5jb25zdW1lUmlnaHRzKAotICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLmdldCgpLCBhY3Rpb24sIHJlc2VydmUpOworICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBhY3Rpb24sIHJlc2VydmUpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtMTk0LDcgKzE5NCw3IEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgewogICAgICAgICBzdGF0dXMgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5zZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZS5nZXQoKSwgcGxheWJhY2tTdGF0dXMsIHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgcGxheWJhY2tTdGF0dXMsIHBvc2l0aW9uKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTI2Nyw3ICsyNjcsNyBAQAogc3A8RGVjcnlwdEhhbmRsZT4gRHJtTWFuYWdlckNsaWVudEltcGw6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpIHsKIAotICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IE5VTEw7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlOwogICAgIGlmIChOVUxMICE9IHVyaSkgewogICAgICAgICBoYW5kbGUgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5vcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIHVyaSwgbWltZSk7CiAgICAgfQpAQCAtMjg0LDcgKzI4NCw3IEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgewogICAgICAgICBzdGF0dXMgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5jbG9zZURlY3J5cHRTZXNzaW9uKAotICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLmdldCgpKTsKKyAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CkBAIC0yOTUsNyArMjk1LDcgQEAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBpZiAoKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgJiYgKE5VTEwgIT0gaGVhZGVySW5mbykpIHsKICAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+aW5pdGlhbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLmdldCgpLCBkZWNyeXB0VW5pdElkLCBoZWFkZXJJbmZvKTsKKyAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgaGVhZGVySW5mbyk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CkBAIC0zMDgsNyArMzA4LDcgQEAKICAgICBpZiAoKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgJiYgKE5VTEwgIT0gZW5jQnVmZmVyKQogICAgICAgICAmJiAoTlVMTCAhPSBkZWNCdWZmZXIpICYmIChOVUxMICE9ICpkZWNCdWZmZXIpKSB7CiAgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmRlY3J5cHQoCi0gICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUuZ2V0KCksIGRlY3J5cHRVbml0SWQsCisgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICAgICAgZW5jQnVmZmVyLCBkZWNCdWZmZXIsIElWKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTMxOSw3ICszMTksNyBAQAogICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+ZmluYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUuZ2V0KCksIGRlY3J5cHRVbml0SWQpOworICAgICAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgZGVjcnlwdFVuaXRJZCk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CkBAIC0zMjksNyArMzI5LDcgQEAKICAgICBzc2l6ZV90IHJldENvZGUgPSBJTlZBTElEX1ZBTFVFOwogICAgIGlmICgoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSAmJiAoTlVMTCAhPSBidWZmZXIpICYmICgwIDwgbnVtQnl0ZXMpKSB7CiAgICAgICAgIHJldENvZGUgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5wcmVhZCgKLSAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZS5nZXQoKSwgYnVmZmVyLCBudW1CeXRlcywgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgYnVmZmVyLCBudW1CeXRlcywgb2Zmc2V0KTsKICAgICB9CiAgICAgcmV0dXJuIHJldENvZGU7CiB9CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL0FuZHJvaWQuYnAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvY29tbW9uL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxM2U1N2YuLjAwMDAwMDAKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc3ViZGlycyA9IFsidXRpbCJdCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0FuZHJvaWQuYnAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ODRjMTQuLjAwMDAwMDAKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi1zdWJkaXJzID0gWwotICAgICJGd2RMb2NrRW5naW5lIiwKLSAgICAiaW50ZXJuYWwtZm9ybWF0IiwKLV0KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9BbmRyb2lkLmJwIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL0FuZHJvaWQuYnAKaW5kZXggMjhhNzhhYS4uYmI5ZDdlYyAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL0FuZHJvaWQuYnAKQEAgLTI5LDggKzI5LDcgQEAKICAgICBzcmNzOiBbInNyYy9Gd2RMb2NrRW5naW5lLmNwcCJdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmljdWkxOG4iLAotICAgICAgICAibGliaWN1dWMiLAorICAgICAgICAibGliYW5kcm9pZGljdSIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGliZGwiLApkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL2luY2x1ZGUvRndkTG9ja0VuZ2luZS5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL2luY2x1ZGUvRndkTG9ja0VuZ2luZS5oCmluZGV4IGE1NzFiM2EuLmI2MmRkYjkgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9pbmNsdWRlL0Z3ZExvY2tFbmdpbmUuaAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lLmgKQEAgLTE5OCw3ICsxOTgsNyBAQAogICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICovCiBzdGF0dXNfdCBvbkNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlc2VydmUpOwogCkBAIC0yMTUsMTIgKzIxNSwxMiBAQAogICovCiAjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKIHN0YXR1c190IG9uU2V0UGxheWJhY2tTdGF0dXMoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBsYXliYWNrU3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHBvc2l0aW9uKTsKICNlbHNlCiBzdGF0dXNfdCBvblNldFBsYXliYWNrU3RhdHVzKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwbGF5YmFja1N0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uKTsKICNlbmRpZgpAQCAtMzMwLDExICszMzAsMTEgQEAKICAqLwogI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCiBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCk7CiAjZWxzZQogc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKICNlbmRpZgogCkBAIC0zNDgsNyArMzQ4LDcgQEAKICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgKi8KIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVyaSk7CiAKIC8qKgpAQCAtMzYwLDcgKzM2MCw3IEBACiAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgKi8KIHN0YXR1c190IG9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpOwogCiAvKioKICAqIEluaXRpYWxpemUgZGVjcnlwdGlvbiBmb3IgdGhlIGdpdmVuIHVuaXQgb2YgdGhlIHByb3RlY3RlZCBjb250ZW50LgpAQCAtMzczLDcgKzM3Myw3IEBACiAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICovCiBzdGF0dXNfdCBvbkluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbyk7CiAKQEAgLTM5NCw3ICszOTQsNyBAQAogICogICAgIERSTV9FUlJPUl9ERUNSWVBUIGZvciBmYWlsdXJlLgogICovCiBzdGF0dXNfdCBvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgRHJtQnVmZmVyKiogZGVjQnVmZmVyKTsKQEAgLTQxNiw3ICs0MTYsNyBAQAogICogICAgIERSTV9FUlJPUl9TRVNTSU9OX05PVF9PUEVORUQsIERSTV9FUlJPUl9ERUNSWVBUX1VOSVRfTk9UX0lOSVRJQUxJWkVELAogICogICAgIERSTV9FUlJPUl9ERUNSWVBUIGZvciBmYWlsdXJlLgogICovCi1zdGF0dXNfdCBvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorc3RhdHVzX3Qgb25EZWNyeXB0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLAogICAgICAgICAgICAgICAgICAgIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVik7CiAKQEAgLTQzMCw3ICs0MzAsNyBAQAogICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAqLwogc3RhdHVzX3Qgb25GaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkKTsKIAogLyoqCkBAIC00NDUsNyArNDQ1LDcgQEAKICAqIEByZXR2YWwgLTEgRmFpbHVyZS4KICAqLwogc3NpemVfdCBvblJlYWQoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgdm9pZCogcEJ1ZmZlciwKICAgICAgICAgICAgICAgIGludCBudW1CeXRlcyk7CiAKQEAgLTQ2MywxMiArNDYzLDEyIEBACiAgKi8KICNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQogb2ZmNjRfdCBvbkxzZWVrKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0LAogICAgICAgICAgICAgICAgIGludCB3aGVuY2UpOwogI2Vsc2UKIG9mZl90IG9uTHNlZWsoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgb2ZmX3Qgb2Zmc2V0LAogICAgICAgICAgICAgICBpbnQgd2hlbmNlKTsKICNlbmRpZgpAQCAtNDg2LDEzICs0ODYsMTMgQEAKICAqLwogI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCiBzc2l6ZV90IG9uUHJlYWQoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAogICAgICAgICAgICAgICAgIHNzaXplX3QgbnVtQnl0ZXMsCiAgICAgICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQpOwogI2Vsc2UKIHNzaXplX3Qgb25QcmVhZChpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCiAgICAgICAgICAgICAgICAgc3NpemVfdCBudW1CeXRlcywKICAgICAgICAgICAgICAgICBvZmZfdCBvZmZzZXQpOwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL3NyYy9Gd2RMb2NrRW5naW5lLmNwcCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAKaW5kZXggNzNlZWE4OS4uNzY5ZGUwYyAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL3NyYy9Gd2RMb2NrRW5naW5lLmNwcAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwCkBAIC0yOTQsNyArMjk0LDcgQEAKIH0KIAogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25Db25zdW1lUmlnaHRzKGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBhY3Rpb24gKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAvKiByZXNlcnZlICovKSB7CiAgICAgLy8gTm8gcmlnaHRzIGNvbnN1bXB0aW9uCkBAIC0zNzIsMTEgKzM3MiwxMyBAQAogfQogCiAjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKLXN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uU2V0UGxheWJhY2tTdGF0dXMoaW50IC8qIHVuaXF1ZUlkICovLCBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogcGxheWJhY2tTdGF0dXMgKi8sIGludDY0X3QgLyogcG9zaXRpb24gKi8pIHsKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uU2V0UGxheWJhY2tTdGF0dXMoaW50IC8qIHVuaXF1ZUlkICovLAorICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywgaW50IC8qIHBsYXliYWNrU3RhdHVzICovLAorICAgICAgICBpbnQ2NF90IC8qIHBvc2l0aW9uICovKSB7CiAjZWxzZQotc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25TZXRQbGF5YmFja1N0YXR1cyhpbnQgLyogdW5pcXVlSWQgKi8sIERlY3J5cHRIYW5kbGUqIC8qIGRlY3J5cHRIYW5kbGUgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBwbGF5YmFja1N0YXR1cyAqLywgaW50IC8qIHBvc2l0aW9uICovKSB7CitzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvblNldFBsYXliYWNrU3RhdHVzKGludCAvKiB1bmlxdWVJZCAqLywKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIC8qIGRlY3J5cHRIYW5kbGUgKi8sCisgICAgICAgIGludCAvKiBwbGF5YmFja1N0YXR1cyAqLywgaW50IC8qIHBvc2l0aW9uICovKSB7CiAjZW5kaWYKICAgICAvLyBOb3QgdXNlZAogICAgIExPR19WRVJCT1NFKCJGd2RMb2NrRW5naW5lOjpvblNldFBsYXliYWNrU3RhdHVzIik7CkBAIC00NzAsMTMgKzQ3MiwxMyBAQAogCiAjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uT3BlbkRlY3J5cHRTZXNzaW9uKGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmNjRfdCAvKiBsZW5ndGggKi8pIHsKICNlbHNlCiBzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgLyogdW5pcXVlSWQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIGxlbmd0aCAqLykgewpAQCAtNDg3LDcgKzQ4OSw3IEBACiAgICAgTE9HX1ZFUkJPU0UoIkZ3ZExvY2tFbmdpbmU6Om9uT3BlbkRlY3J5cHRTZXNzaW9uIik7CiAKICAgICBpZiAoKC0xIDwgZmQpICYmCi0gICAgICAgIChOVUxMICE9IGRlY3J5cHRIYW5kbGUpICYmCisgICAgICAgIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpICYmCiAgICAgICAgICghZGVjb2RlU2Vzc2lvbk1hcC5pc0NyZWF0ZWQoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSkpIHsKICAgICAgICAgZmlsZURlc2MgPSBkdXAoZmQpOwogICAgIH0gZWxzZSB7CkBAIC01MzMsMTIgKzUzNSwxMiBAQAogfQogCiBzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmkpIHsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRTsKICAgICBjb25zdCBjaGFyIGZpbGVUYWcgW10gPSAiZmlsZTovLyI7CiAKLSAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlICYmIE5VTEwgIT0gdXJpICYmIHN0cmxlbih1cmkpID4gc2l6ZW9mKGZpbGVUYWcpKSB7CisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSAmJiBOVUxMICE9IHVyaSAmJiBzdHJsZW4odXJpKSA+IHNpemVvZihmaWxlVGFnKSkgewogICAgICAgICBTdHJpbmc4IHVyaVRhZyA9IFN0cmluZzgodXJpKTsKICAgICAgICAgdXJpVGFnLnRvTG93ZXIoKTsKIApAQCAtNTYyLDExICs1NjQsMTEgQEAKIH0KIAogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25DbG9zZURlY3J5cHRTZXNzaW9uKGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpIHsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBMT0dfVkVSQk9TRSgiRndkTG9ja0VuZ2luZTo6b25DbG9zZURlY3J5cHRTZXNzaW9uIik7CiAKLSAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlICYmIGRlY29kZVNlc3Npb25NYXAuaXNDcmVhdGVkKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkpIHsKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpICYmIGRlY29kZVNlc3Npb25NYXAuaXNDcmVhdGVkKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkpIHsKICAgICAgICAgRGVjb2RlU2Vzc2lvbiogc2Vzc2lvbiA9IGRlY29kZVNlc3Npb25NYXAuZ2V0VmFsdWUoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKICAgICAgICAgaWYgKE5VTEwgIT0gc2Vzc2lvbiAmJiBzZXNzaW9uLT5maWxlRGVzYyA+IC0xKSB7CiAgICAgICAgICAgICBGd2RMb2NrRmlsZV9kZXRhY2goc2Vzc2lvbi0+ZmlsZURlc2MpOwpAQCAtNTc2LDcgKzU3OCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSB7CisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgewogICAgICAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbykgewogICAgICAgICAgICAgZGVsZXRlIGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvOwogICAgICAgICAgICAgZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8gPSBOVUxMOwpAQCAtNTg0LDkgKzU4Niw3IEBACiAKICAgICAgICAgZGVjcnlwdEhhbmRsZS0+Y29weUNvbnRyb2xWZWN0b3IuY2xlYXIoKTsKICAgICAgICAgZGVjcnlwdEhhbmRsZS0+ZXh0ZW5kZWREYXRhLmNsZWFyKCk7Ci0KLSAgICAgICAgZGVsZXRlIGRlY3J5cHRIYW5kbGU7Ci0gICAgICAgIGRlY3J5cHRIYW5kbGUgPSBOVUxMOworICAgICAgICBkZWNyeXB0SGFuZGxlLmNsZWFyKCk7CiAgICAgfQogCiAgICAgTE9HX1ZFUkJPU0UoIkZ3ZExvY2tFbmdpbmU6Om9uQ2xvc2VEZWNyeXB0U2Vzc2lvbiBFeGl0Iik7CkBAIC01OTQsNyArNTk0LDcgQEAKIH0KIAogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25Jbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IC8qIHVuaXF1ZUlkICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogLyogZGVjcnlwdEhhbmRsZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIGRlY3J5cHRVbml0SWQgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIC8qIGhlYWRlckluZm8gKi8pIHsKICAgICBBTE9HRSgiRndkTG9ja0VuZ2luZTo6b25Jbml0aWFsaXplRGVjcnlwdFVuaXQgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBEUk0gc2NoZW1lIik7CkBAIC02MDMsNyArNjAzLDcgQEAKIAogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25EZWNyeXB0KAogICAgICAgICAgICAgaW50IC8qIHVuaXF1ZUlkICovLAotICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogLyogZGVjcnlwdEhhbmRsZSAqLywKKyAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLAogICAgICAgICAgICAgaW50IC8qIGRlY3J5cHRVbml0SWQgKi8sCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIC8qIGVuY0J1ZmZlciAqLywKICAgICAgICAgICAgIERybUJ1ZmZlcioqIC8qIGRlY0J1ZmZlciAqLywKQEAgLTYxMyw3ICs2MTMsNyBAQAogfQogCiBzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbkRlY3J5cHQoaW50IC8qIHVuaXF1ZUlkICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIC8qIGRlY3J5cHRIYW5kbGUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIC8qIGRlY3J5cHRIYW5kbGUgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIGRlY3J5cHRVbml0SWQgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiAvKiBlbmNCdWZmZXIgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtQnVmZmVyKiogLyogZGVjQnVmZmVyICovKSB7CkBAIC02MjIsMTkgKzYyMiwxOSBAQAogfQogCiBzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbkZpbmFsaXplRGVjcnlwdFVuaXQoaW50IC8qIHVuaXF1ZUlkICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIC8qIGRlY3J5cHRIYW5kbGUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIC8qIGRlY3J5cHRIYW5kbGUgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIGRlY3J5cHRVbml0SWQgKi8pIHsKICAgICBBTE9HRSgiRndkTG9ja0VuZ2luZTo6b25GaW5hbGl6ZURlY3J5cHRVbml0IGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHRoaXMgRFJNIHNjaGVtZSIpOwogICAgIHJldHVybiBEUk1fRVJST1JfVU5LTk9XTjsKIH0KIAogc3NpemVfdCBGd2RMb2NrRW5naW5lOjpvblJlYWQoaW50IC8qIHVuaXF1ZUlkICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bUJ5dGVzKSB7CiAgICAgc3NpemVfdCBzaXplID0gLTE7CiAKLSAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlICYmCisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSAmJgogICAgICAgICBkZWNvZGVTZXNzaW9uTWFwLmlzQ3JlYXRlZChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpICYmCiAgICAgICAgIE5VTEwgIT0gYnVmZmVyICYmCiAgICAgICAgIG51bUJ5dGVzID4gLTEpIHsKQEAgLTY1NCwxNSArNjU0LDE1IEBACiB9CiAKICNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQotb2ZmNjRfdCBGd2RMb2NrRW5naW5lOjpvbkxzZWVrKGludCAvKiB1bmlxdWVJZCAqLywgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKK29mZjY0X3QgRndkTG9ja0VuZ2luZTo6b25Mc2VlayhpbnQgLyogdW5pcXVlSWQgKi8sIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKSB7CiAjZWxzZQotb2ZmX3QgRndkTG9ja0VuZ2luZTo6b25Mc2VlayhpbnQgLyogdW5pcXVlSWQgKi8sIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCitvZmZfdCBGd2RMb2NrRW5naW5lOjpvbkxzZWVrKGludCAvKiB1bmlxdWVJZCAqLywgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90IG9mZnNldCwgaW50IHdoZW5jZSkgewogI2VuZGlmCiAgICAgb2ZmX3Qgb2ZmdmFsID0gLTE7CiAKLSAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlICYmIGRlY29kZVNlc3Npb25NYXAuaXNDcmVhdGVkKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkpIHsKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpICYmIGRlY29kZVNlc3Npb25NYXAuaXNDcmVhdGVkKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkpIHsKICAgICAgICAgRGVjb2RlU2Vzc2lvbiogc2Vzc2lvbiA9IGRlY29kZVNlc3Npb25NYXAuZ2V0VmFsdWUoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKICAgICAgICAgaWYgKE5VTEwgIT0gc2Vzc2lvbiAmJiBzZXNzaW9uLT5maWxlRGVzYyA+IC0xKSB7CiAgICAgICAgICAgICBvZmZ2YWwgPSBGd2RMb2NrRmlsZV9sc2VlayhzZXNzaW9uLT5maWxlRGVzYywgb2Zmc2V0LCB3aGVuY2UpOwpAQCAtNjc1LDEzICs2NzUsMTMgQEAKIAogI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCiBzc2l6ZV90IEZ3ZExvY2tFbmdpbmU6Om9uUHJlYWQoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgbnVtQnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQpIHsKICNlbHNlCiBzc2l6ZV90IEZ3ZExvY2tFbmdpbmU6Om9uUHJlYWQoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgbnVtQnl0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmX3Qgb2Zmc2V0KSB7CkBAIC02OTAsNyArNjkwLDcgQEAKIAogICAgIERlY29kZVNlc3Npb24qIGRlY29kZXJTZXNzaW9uID0gTlVMTDsKIAotICAgIGlmICgoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSAmJgorICAgIGlmICgoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSAmJgogICAgICAgICAoTlVMTCAhPSAoZGVjb2RlclNlc3Npb24gPSBkZWNvZGVTZXNzaW9uTWFwLmdldFZhbHVlKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkpKSAmJgogICAgICAgICAoTlVMTCAhPSBidWZmZXIpICYmCiAgICAgICAgIChudW1CeXRlcyA+IC0xKSAmJgpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvQW5kcm9pZC5icCBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svaW50ZXJuYWwtZm9ybWF0L0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNThlMjYuLjAwMDAwMDAKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAotc3ViZGlycyA9IFsKLSAgICAiY29tbW9uIiwKLSAgICAiY29udmVydGVyIiwKLSAgICAiZGVjb2RlciIsCi1dCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvaW5jbHVkZS9Ecm1QYXNzdGhydVBsdWdJbi5oIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L2luY2x1ZGUvRHJtUGFzc3RocnVQbHVnSW4uaAppbmRleCA3YjY2ZGM3Li40YWI1MjcyIDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvaW5jbHVkZS9Ecm1QYXNzdGhydVBsdWdJbi5oCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9pbmNsdWRlL0RybVBhc3N0aHJ1UGx1Z0luLmgKQEAgLTUzLDEwICs1MywxMSBAQAogCiAgICAgaW50IG9uQ2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uKTsKIAotICAgIHN0YXR1c190IG9uQ29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSk7CisgICAgc3RhdHVzX3Qgb25Db25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpOwogCiAgICAgc3RhdHVzX3Qgb25TZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CiAKICAgICBib29sIG9uVmFsaWRhdGVBY3Rpb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CkBAIC03NCwyNiArNzUsMjUgQEAKICAgICBEcm1TdXBwb3J0SW5mbyogb25HZXRTdXBwb3J0SW5mbyhpbnQgdW5pcXVlSWQpOwogCiAgICAgc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoKTsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsCisgICAgICAgICAgICBvZmY2NF90IGxlbmd0aCk7CiAKICAgICBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgY29uc3QgY2hhciogdXJpKTsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGNvbnN0IGNoYXIqIHVyaSk7CiAKLSAgICBzdGF0dXNfdCBvbkNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKTsKKyAgICBzdGF0dXNfdCBvbkNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSk7CiAKLSAgICBzdGF0dXNfdCBvbkluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgc3RhdHVzX3Qgb25Jbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pOwogCi0gICAgc3RhdHVzX3Qgb25EZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgc3RhdHVzX3Qgb25EZWNyeXB0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVik7CiAKLSAgICBzdGF0dXNfdCBvbkZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCk7CisgICAgc3RhdHVzX3Qgb25GaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCk7CiAKLSAgICBzc2l6ZV90IG9uUHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHNzaXplX3Qgb25QcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCk7Ci0KLXByaXZhdGU6Ci0gICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uSW1wbCgpOwogfTsKIAogfTsKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9zcmMvRHJtUGFzc3RocnVQbHVnSW4uY3BwIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L3NyYy9Ecm1QYXNzdGhydVBsdWdJbi5jcHAKaW5kZXggZDdmMmQyOC4uMGZhMzQ3OCAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L3NyYy9Ecm1QYXNzdGhydVBsdWdJbi5jcHAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L3NyYy9Ecm1QYXNzdGhydVBsdWdJbi5jcHAKQEAgLTE4MywxMyArMTgzLDEzIEBACiB9CiAKIHN0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogLypkZWNyeXB0SGFuZGxlKi8sIGludCAvKmFjdGlvbiovLCBib29sIC8qcmVzZXJ2ZSovKSB7CisgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLypkZWNyeXB0SGFuZGxlKi8sIGludCAvKmFjdGlvbiovLCBib29sIC8qcmVzZXJ2ZSovKSB7CiAgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkNvbnN1bWVSaWdodHMoKSA6ICVkIiwgdW5pcXVlSWQpOwogICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvblNldFBsYXliYWNrU3RhdHVzKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIC8qZGVjcnlwdEhhbmRsZSovLCBpbnQgLypwbGF5YmFja1N0YXR1cyovLCBpbnQ2NF90IC8qcG9zaXRpb24qLykgeworICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIC8qZGVjcnlwdEhhbmRsZSovLCBpbnQgLypwbGF5YmFja1N0YXR1cyovLCBpbnQ2NF90IC8qcG9zaXRpb24qLykgewogICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25TZXRQbGF5YmFja1N0YXR1cygpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KQEAgLTIzNiw3ICsyMzYsOCBAQAogfQogCiBzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25PcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCAvKmZkKi8sIG9mZjY0X3QgLypvZmZzZXQqLywgb2ZmNjRfdCAvKmxlbmd0aCovKSB7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgLypmZCovLCBvZmY2NF90IC8qb2Zmc2V0Ki8sCisgICAgICAgICAgICBvZmY2NF90IC8qbGVuZ3RoKi8pIHsKICAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uT3BlbkRlY3J5cHRTZXNzaW9uKCkgOiAlZCIsIHVuaXF1ZUlkKTsKIAogI2lmZGVmIEVOQUJMRV9QQVNTVEhSVV9ERUNSWVBUSU9OCkBAIC0yNDYsMzYgKzI0NywzOCBAQAogICAgIGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvID0gTlVMTDsKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogI2Vsc2UKLSAgICAodm9pZCkoZGVjcnlwdEhhbmRsZSk7IC8vIHVudXNlZAorICAgICh2b2lkKShkZWNyeXB0SGFuZGxlLmdldCgpKTsgLy8gdW51c2VkCiAjZW5kaWYKIAogICAgIHJldHVybiBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRTsKIH0KIAogc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uT3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICAgICAgaW50IC8qdW5pcXVlSWQqLywgRGVjcnlwdEhhbmRsZSogLypkZWNyeXB0SGFuZGxlKi8sIGNvbnN0IGNoYXIqIC8qdXJpKi8pIHsKKyAgICAgICAgICAgIGludCAvKnVuaXF1ZUlkKi8sIHNwPERlY3J5cHRIYW5kbGU+JiAvKmRlY3J5cHRIYW5kbGUqLywgY29uc3QgY2hhciogLyp1cmkqLykgewogICAgIHJldHVybiBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRTsKIH0KIAotc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpIHsKK3N0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSkgewogICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25DbG9zZURlY3J5cHRTZXNzaW9uKCkgOiAlZCIsIHVuaXF1ZUlkKTsKLSAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlKSB7CisgICAgaWYgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgewogICAgICAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbykgewogICAgICAgICAgICAgZGVsZXRlIGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvOyBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbyA9IE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgZGVsZXRlIGRlY3J5cHRIYW5kbGU7IGRlY3J5cHRIYW5kbGUgPSBOVUxMOworICAgICAgICBkZWNyeXB0SGFuZGxlLmNsZWFyKCk7CiAgICAgfQogICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIC8qZGVjcnlwdEhhbmRsZSovLAotICAgICAgICAgICAgaW50IC8qZGVjcnlwdFVuaXRJZCovLCBjb25zdCBEcm1CdWZmZXIqIC8qaGVhZGVySW5mbyovKSB7CitzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25Jbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLAorICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLypkZWNyeXB0SGFuZGxlKi8sCisgICAgICAgIGludCAvKmRlY3J5cHRVbml0SWQqLywgY29uc3QgRHJtQnVmZmVyKiAvKmhlYWRlckluZm8qLykgewogICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25Jbml0aWFsaXplRGVjcnlwdFVuaXQoKSA6ICVkIiwgdW5pcXVlSWQpOwogICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiAvKmRlY3J5cHRIYW5kbGUqLywKLSAgICAgICAgICAgIGludCAvKmRlY3J5cHRVbml0SWQqLywgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiAvKklWKi8pIHsKK3N0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgLypkZWNyeXB0SGFuZGxlKi8sCisgICAgICAgIGludCAvKmRlY3J5cHRVbml0SWQqLywgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwKKyAgICAgICAgRHJtQnVmZmVyKiAvKklWKi8pIHsKICAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uRGVjcnlwdCgpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgLyoqCiAgICAgICogQXMgYSB3b3JrYXJvdW5kIGltcGxlbWVudGF0aW9uIHBhc3N0aHJ1IHdvdWxkIGNvcHkgdGhlIGdpdmVuCkBAIC0yOTYsMTIgKzI5OSwxMiBAQAogfQogCiBzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25GaW5hbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiAvKmRlY3J5cHRIYW5kbGUqLywgaW50IC8qZGVjcnlwdFVuaXRJZCovKSB7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiAvKmRlY3J5cHRIYW5kbGUqLywgaW50IC8qZGVjcnlwdFVuaXRJZCovKSB7CiAgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkZpbmFsaXplRGVjcnlwdFVuaXQoKSA6ICVkIiwgdW5pcXVlSWQpOwogICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiB9CiAKLXNzaXplX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uUHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiAvKmRlY3J5cHRIYW5kbGUqLywKK3NzaXplX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uUHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgLypkZWNyeXB0SGFuZGxlKi8sCiAgICAgICAgICAgICB2b2lkKiAvKmJ1ZmZlciovLCBzc2l6ZV90IC8qbnVtQnl0ZXMqLywgb2ZmNjRfdCAvKm9mZnNldCovKSB7CiAgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblByZWFkKCkgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICByZXR1cm4gMDsKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9BbmRyb2lkLmJwIGIvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAKaW5kZXggNDk5MWU1MC4uZDZkYjFkNCAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAKQEAgLTI3LDExICsyNywxMSBAQAogICAgICAgICAibGlibWVkaWFkcm1tZXRyaWNzX2xpdGUiLAogICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKICAgICAgICAgImxpYm1lZGlhdXRpbHMiLAotICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMiIsCiAgICAgICAgICJsaWJoaWRsYWxsb2NhdG9ydXRpbHMiLAogICAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCkBAIC01OSwyMCArNTksMTggQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMSIsCi0gICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMiIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCiAgICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogICAgIGNmbGFnczogWwogICAgICAgICAvLyBTdXBwcmVzcyB1bnVzZWQgcGFyYW1ldGVyIGFuZCBubyBlcnJvciBvcHRpb25zLiBUaGVzZSBjYXVzZSBwcm9ibGVtcwogICAgICAgICAvLyB3aXRoIHRoZSB3aGVuIHVzaW5nIHRoZSBtYXAgdHlwZSBpbiBhIHByb3RvIGRlZmluaXRpb24uCiAgICAgICAgICItV25vLXVudXNlZC1wYXJhbWV0ZXIiLAotICAgICAgICAiLVduby1lcnJvciIsCiAgICAgXSwKIH0KIApAQCAtOTIsNiArOTAsNyBAQAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMiIsCiAgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCkBAIC0xMDUsNyArMTA0LDYgQEAKICAgICAgICAgLy8gU3VwcHJlc3MgdW51c2VkIHBhcmFtZXRlciBhbmQgbm8gZXJyb3Igb3B0aW9ucy4gVGhlc2UgY2F1c2UgcHJvYmxlbXMKICAgICAgICAgLy8gd2hlbiB1c2luZyB0aGUgbWFwIHR5cGUgaW4gYSBwcm90byBkZWZpbml0aW9uLgogICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKLSAgICAgICAgIi1Xbm8tZXJyb3IiLAogICAgIF0sCiB9CiAKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9DcnlwdG9IYWwuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0NyeXB0b0hhbC5jcHAKaW5kZXggMzAzNWM1YS4uZDYyY2NkNiAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0NyeXB0b0hhbC5jcHAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL0NyeXB0b0hhbC5jcHAKQEAgLTMwLDE2ICszMCwxNiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWFkcm0vQ3J5cHRvSGFsLmg+CiAKK3VzaW5nIGRybTo6VjFfMDo6QnVmZmVyVHlwZTsKK3VzaW5nIGRybTo6VjFfMDo6RGVzdGluYXRpb25CdWZmZXI7Cit1c2luZyBkcm06OlYxXzA6OklDcnlwdG9GYWN0b3J5OwordXNpbmcgZHJtOjpWMV8wOjpJQ3J5cHRvUGx1Z2luOwordXNpbmcgZHJtOjpWMV8wOjpNb2RlOwordXNpbmcgZHJtOjpWMV8wOjpQYXR0ZXJuOwordXNpbmcgZHJtOjpWMV8wOjpTaGFyZWRCdWZmZXI7Cit1c2luZyBkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIGRybTo6VjFfMDo6U3ViU2FtcGxlOwogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OkJ1ZmZlclR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OkRlc3RpbmF0aW9uQnVmZmVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpJQ3J5cHRvRmFjdG9yeTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6SUNyeXB0b1BsdWdpbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6TW9kZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6UGF0dGVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U2hhcmVkQnVmZmVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdGF0dXM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN1YlNhbXBsZTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwpAQCAtNTAsNiArNTAsNyBAQAogdXNpbmcgOjphbmRyb2lkOjpoaWRsOjptYW5hZ2VyOjpWMV8wOjpJU2VydmljZU1hbmFnZXI7CiB1c2luZyA6OmFuZHJvaWQ6OnNwOwogCit0eXBlZGVmIGRybTo6VjFfMjo6U3RhdHVzIFN0YXR1c19WMV8yOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTc2LDYgKzc3LDE4IEBACiAgICAgfQogfQogCitzdGF0aWMgc3RhdHVzX3QgdG9TdGF0dXNUXzFfMihTdGF0dXNfVjFfMiBzdGF0dXMpIHsKKyAgICBzd2l0Y2ggKHN0YXR1cykgeworICAgIGNhc2UgU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9TRVNTSU9OX0xPU1RfU1RBVEU6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fU0VTU0lPTl9MT1NUX1NUQVRFOzsKKyAgICBjYXNlIFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0ZSQU1FX1RPT19MQVJHRTsKKyAgICBjYXNlIFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX1NFQ1VSSVRZOgorICAgICAgICByZXR1cm4gRVJST1JfRFJNX0lOU1VGRklDSUVOVF9TRUNVUklUWTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gdG9TdGF0dXNUKHN0YXRpY19jYXN0PFN0YXR1cz4oc3RhdHVzKSk7CisgICAgfQorfQogCiBzdGF0aWMgaGlkbF92ZWM8dWludDhfdD4gdG9IaWRsVmVjKGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmdmVjdG9yKSB7CiAgICAgaGlkbF92ZWM8dWludDhfdD4gdmVjOwpAQCAtMTk2LDYgKzIwOSw5IEBACiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmFjdG9yaWVzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGlmIChtRmFjdG9yaWVzW2ldLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKSkgewogICAgICAgICAgICAgbVBsdWdpbiA9IG1ha2VDcnlwdG9QbHVnaW4obUZhY3Rvcmllc1tpXSwgdXVpZCwgZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICBpZiAobVBsdWdpbiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbVBsdWdpblYxXzIgPSBkcm06OlYxXzI6OklDcnlwdG9QbHVnaW46OmNhc3RGcm9tKG1QbHVnaW4pOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0yMTYsNiArMjMyLDcgQEAKICAgICB9CiAKICAgICBtUGx1Z2luLmNsZWFyKCk7CisgICAgbVBsdWdpblYxXzIuY2xlYXIoKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTI4NCw3ICszMDEsNyBAQAogICAgIHNzaXplX3Qgb2Zmc2V0OwogICAgIHNpemVfdCBzaXplOwogCi0gICAgaWYgKG1lbW9yeSA9PSBOVUxMICYmIGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgaWYgKG1lbW9yeSA9PSBOVUxMIHx8IGJ1ZmZlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBVTkVYUEVDVEVEX05VTEw7CiAgICAgfQogCkBAIC0zODksMjEgKzQwNiwzMyBAQAogICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CiAgICAgdWludDMyX3QgYnl0ZXNXcml0dGVuID0gMDsKIAotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpbi0+ZGVjcnlwdChzZWN1cmUsIHRvSGlkbEFycmF5MTYoa2V5SWQpLCB0b0hpZGxBcnJheTE2KGl2KSwgaE1vZGUsCi0gICAgICAgICAgICBoUGF0dGVybiwgaFN1YlNhbXBsZXMsIGhTb3VyY2UsIG9mZnNldCwgaERlc3RpbmF0aW9uLAotICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIHVpbnQzMl90IGhCeXRlc1dyaXR0ZW4sIGhpZGxfc3RyaW5nIGhEZXRhaWxlZEVycm9yKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGhCeXRlc1dyaXR0ZW47Ci0gICAgICAgICAgICAgICAgICAgICplcnJvckRldGFpbE1zZyA9IHRvU3RyaW5nOChoRGV0YWlsZWRFcnJvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICApOworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0OwogCi0gICAgaWYgKCFoUmVzdWx0LmlzT2soKSkgewotICAgICAgICBlcnIgPSBERUFEX09CSkVDVDsKKyAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgeworICAgICAgICBoUmVzdWx0ID0gbVBsdWdpblYxXzItPmRlY3J5cHRfMV8yKHNlY3VyZSwgdG9IaWRsQXJyYXkxNihrZXlJZCksIHRvSGlkbEFycmF5MTYoaXYpLAorICAgICAgICAgICAgICAgIGhNb2RlLCBoUGF0dGVybiwgaFN1YlNhbXBsZXMsIGhTb3VyY2UsIG9mZnNldCwgaERlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXNfVjFfMiBzdGF0dXMsIHVpbnQzMl90IGhCeXRlc1dyaXR0ZW4sIGhpZGxfc3RyaW5nIGhEZXRhaWxlZEVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzX1YxXzI6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSBoQnl0ZXNXcml0dGVuOworICAgICAgICAgICAgICAgICAgICAgICAgKmVycm9yRGV0YWlsTXNnID0gdG9TdHJpbmc4KGhEZXRhaWxlZEVycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1RfMV8yKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBoUmVzdWx0ID0gbVBsdWdpbi0+ZGVjcnlwdChzZWN1cmUsIHRvSGlkbEFycmF5MTYoa2V5SWQpLCB0b0hpZGxBcnJheTE2KGl2KSwKKyAgICAgICAgICAgICAgICBoTW9kZSwgaFBhdHRlcm4sIGhTdWJTYW1wbGVzLCBoU291cmNlLCBvZmZzZXQsIGhEZXN0aW5hdGlvbiwKKyAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgdWludDMyX3QgaEJ5dGVzV3JpdHRlbiwgaGlkbF9zdHJpbmcgaERldGFpbGVkRXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSBoQnl0ZXNXcml0dGVuOworICAgICAgICAgICAgICAgICAgICAgICAgKmVycm9yRGV0YWlsTXNnID0gdG9TdHJpbmc4KGhEZXRhaWxlZEVycm9yKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApOwogICAgIH0KIAorICAgIGVyciA9IGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CiAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICByZXR1cm4gYnl0ZXNXcml0dGVuOwogICAgIH0KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9Ecm1IYWwuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0RybUhhbC5jcHAKaW5kZXggY2YwODYxMC4uOTE5ZjRlZSAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0RybUhhbC5jcHAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL0RybUhhbC5jcHAKQEAgLTIzLDggKzIzLDggQEAKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAKLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWFuYWdlci8xLjAvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21hbmFnZXIvMS4yL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGhpZGwvU2VydmljZU1hbmFnZW1lbnQuaD4KIAogI2luY2x1ZGUgPG1lZGlhL0V2ZW50TWV0cmljLmg+CkBAIC00MCwxNSArNDAsMTcgQEAKICNpbmNsdWRlIDxtZWRpYWRybS9Ecm1TZXNzaW9uTWFuYWdlci5oPgogCiB1c2luZyBkcm06OlYxXzA6OktleWVkVmVjdG9yOwotdXNpbmcgZHJtOjpWMV8wOjpLZXlTdGF0dXNUeXBlOwordXNpbmcgZHJtOjpWMV8wOjpLZXlSZXF1ZXN0VHlwZTsKIHVzaW5nIGRybTo6VjFfMDo6S2V5VHlwZTsKIHVzaW5nIGRybTo6VjFfMDo6S2V5VmFsdWU7Ci11c2luZyBkcm06OlYxXzE6OkhkY3BMZXZlbDs7CiB1c2luZyBkcm06OlYxXzA6OlNlY3VyZVN0b3A7Ci11c2luZyBkcm06OlYxXzE6OlNlY3VyZVN0b3BSZWxlYXNlOwogdXNpbmcgZHJtOjpWMV8wOjpTZWN1cmVTdG9wSWQ7Ci11c2luZyBkcm06OlYxXzE6OlNlY3VyaXR5TGV2ZWw7CiB1c2luZyBkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIGRybTo6VjFfMTo6SGRjcExldmVsOwordXNpbmcgZHJtOjpWMV8xOjpTZWN1cmVTdG9wUmVsZWFzZTsKK3VzaW5nIGRybTo6VjFfMTo6U2VjdXJpdHlMZXZlbDsKK3VzaW5nIGRybTo6VjFfMjo6S2V5U2V0SWQ7Cit1c2luZyBkcm06OlYxXzI6OktleVN0YXR1c1R5cGU7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OkRybU1ldHJpY0dyb3VwOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwpAQCAtNTksNiArNjEsMTAgQEAKIHVzaW5nIDo6YW5kcm9pZDo6b3M6OlBlcnNpc3RhYmxlQnVuZGxlOwogdXNpbmcgOjphbmRyb2lkOjpzcDsKIAordHlwZWRlZiBkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlIEtleVJlcXVlc3RUeXBlX1YxXzE7Cit0eXBlZGVmIGRybTo6VjFfMjo6U3RhdHVzIFN0YXR1c19WMV8yOwordHlwZWRlZiBkcm06OlYxXzI6OkhkY3BMZXZlbCBIZGNwTGV2ZWxfVjFfMjsKKwogbmFtZXNwYWNlIHsKIAogLy8gVGhpcyBjb25zdGFudCBjb3JyZXNwb25kcyB0byB0aGUgUFJPUEVSVFlfREVWSUNFX1VOSVFVRV9JRCBjb25zdGFudApAQCAtMTM5LDI2ICsxNDUsNTUgQEAKICAgICB9CiB9CiAKLXN0YXRpYyBEcm1QbHVnaW46OkhkY3BMZXZlbCB0b0hkY3BMZXZlbChIZGNwTGV2ZWwgbGV2ZWwpIHsKK3N0YXRpYyBTZWN1cml0eUxldmVsIHRvSGlkbFNlY3VyaXR5TGV2ZWwoRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsKSB7CiAgICAgc3dpdGNoKGxldmVsKSB7Ci0gICAgY2FzZSBIZGNwTGV2ZWw6OkhEQ1BfTk9ORToKKyAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZUNyeXB0bzoKKyAgICAgICAgcmV0dXJuIFNlY3VyaXR5TGV2ZWw6OlNXX1NFQ1VSRV9DUllQVE87CisgICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsU3dTZWN1cmVEZWNvZGU6CisgICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfREVDT0RFOworICAgIGNhc2UgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbEh3U2VjdXJlQ3J5cHRvOgorICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0NSWVBUTzsKKyAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZURlY29kZToKKyAgICAgICAgcmV0dXJuIFNlY3VyaXR5TGV2ZWw6OkhXX1NFQ1VSRV9ERUNPREU7CisgICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVBbGw6CisgICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQUxMOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpVTktOT1dOOworICAgIH0KK30KKworc3RhdGljIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSB0b09mZmxpbmVMaWNlbnNlU3RhdGUoCisgICAgICAgIE9mZmxpbmVMaWNlbnNlU3RhdGUgbGljZW5zZVN0YXRlKSB7CisgICAgc3dpdGNoKGxpY2Vuc2VTdGF0ZSkgeworICAgIGNhc2UgT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6VVNBQkxFOgorICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprT2ZmbGluZUxpY2Vuc2VTdGF0ZVVzYWJsZTsKKyAgICBjYXNlIE9mZmxpbmVMaWNlbnNlU3RhdGU6OklOQUNUSVZFOgorICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprT2ZmbGluZUxpY2Vuc2VTdGF0ZVJlbGVhc2VkOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtPZmZsaW5lTGljZW5zZVN0YXRlVW5rbm93bjsKKyAgICB9Cit9CisKK3N0YXRpYyBEcm1QbHVnaW46OkhkY3BMZXZlbCB0b0hkY3BMZXZlbChIZGNwTGV2ZWxfVjFfMiBsZXZlbCkgeworICAgIHN3aXRjaChsZXZlbCkgeworICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfTk9ORToKICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BOb25lOwotICAgIGNhc2UgSGRjcExldmVsOjpIRENQX1YxOgorICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfVjE6CiAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwVjE7Ci0gICAgY2FzZSBIZGNwTGV2ZWw6OkhEQ1BfVjI6CisgICAgY2FzZSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9WMjoKICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMjsKLSAgICBjYXNlIEhkY3BMZXZlbDo6SERDUF9WMl8xOgorICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfVjJfMToKICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMl8xOwotICAgIGNhc2UgSGRjcExldmVsOjpIRENQX1YyXzI6CisgICAgY2FzZSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9WMl8yOgogICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcFYyXzI7Ci0gICAgY2FzZSBIZGNwTGV2ZWw6OkhEQ1BfTk9fT1VUUFVUOgorICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfVjJfMzoKKyAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMl8zOworICAgIGNhc2UgSGRjcExldmVsX1YxXzI6OkhEQ1BfTk9fT1VUUFVUOgogICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcE5vT3V0cHV0OwogICAgIGRlZmF1bHQ6CiAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwTGV2ZWxVbmtub3duOwogICAgIH0KIH0KLQotCiBzdGF0aWMgOjpLZXllZFZlY3RvciB0b0hpZGxLZXllZFZlY3Rvcihjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiYKICAgICAgICAga2V5ZWRWZWN0b3IpIHsKICAgICBzdGQ6OnZlY3RvcjxLZXlWYWx1ZT4gc3RkS2V5ZWRWZWN0b3I7CkBAIC0xOTksNiArMjM0LDE1IEBACiAgICAgcmV0dXJuIHNlY3VyZVN0b3BJZHM7CiB9CiAKK3N0YXRpYyBMaXN0PFZlY3Rvcjx1aW50OF90Pj4gdG9LZXlTZXRJZHMoY29uc3QgaGlkbF92ZWM8S2V5U2V0SWQ+JgorICAgICAgICBoS2V5U2V0SWRzKSB7CisgICAgTGlzdDxWZWN0b3I8dWludDhfdD4+IGtleVNldElkczsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhLZXlTZXRJZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAga2V5U2V0SWRzLnB1c2hfYmFjayh0b1ZlY3RvcihoS2V5U2V0SWRzW2ldKSk7CisgICAgfQorICAgIHJldHVybiBrZXlTZXRJZHM7Cit9CisKIHN0YXRpYyBzdGF0dXNfdCB0b1N0YXR1c1QoU3RhdHVzIHN0YXR1cykgewogICAgIHN3aXRjaCAoc3RhdHVzKSB7CiAgICAgY2FzZSBTdGF0dXM6Ok9LOgpAQCAtMjE3LDcgKzI2MSw3IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBTdGF0dXM6OkVSUk9SX0RSTV9JTlZBTElEX1NUQVRFOgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX1RBTVBFUl9ERVRFQ1RFRDsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9JTlZBTElEX1NUQVRFOwogICAgICAgICBicmVhazsKICAgICBjYXNlIFN0YXR1czo6QkFEX1ZBTFVFOgogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtMjM4LDYgKzI4MiwxOSBAQAogICAgIH0KIH0KIAorc3RhdGljIHN0YXR1c190IHRvU3RhdHVzVF8xXzIoU3RhdHVzX1YxXzIgc3RhdHVzKSB7CisgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICBjYXNlIFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fUkVTT1VSQ0VfQ09OVEVOVElPTjoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9SRVNPVVJDRV9DT05URU5USU9OOworICAgIGNhc2UgU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0U6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFOworICAgIGNhc2UgU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfU0VDVVJJVFk6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX1NFQ1VSSVRZOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiB0b1N0YXR1c1Qoc3RhdGljX2Nhc3Q8U3RhdHVzPihzdGF0dXMpKTsKKyAgICB9Cit9CisKIAogTXV0ZXggRHJtSGFsOjptTG9jazsKIApAQCAtMjk3LDM5ICszNTQsNTEgQEAKIAogICAgIHNldExpc3RlbmVyKE5VTEwpOwogICAgIG1Jbml0Q2hlY2sgPSBOT19JTklUOwotCi0gICAgaWYgKG1QbHVnaW4gIT0gTlVMTCkgeworICAgIGlmIChtUGx1Z2luVjFfMiAhPSBOVUxMKSB7CisgICAgICAgIGlmICghbVBsdWdpblYxXzItPnNldExpc3RlbmVyKE5VTEwpLmlzT2soKSkgeworICAgICAgICAgICAgbUluaXRDaGVjayA9IERFQURfT0JKRUNUOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChtUGx1Z2luICE9IE5VTEwpIHsKICAgICAgICAgaWYgKCFtUGx1Z2luLT5zZXRMaXN0ZW5lcihOVUxMKS5pc09rKCkpIHsKICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBERUFEX09CSkVDVDsKICAgICAgICAgfQogICAgIH0KICAgICBtUGx1Z2luLmNsZWFyKCk7CiAgICAgbVBsdWdpblYxXzEuY2xlYXIoKTsKKyAgICBtUGx1Z2luVjFfMi5jbGVhcigpOwogfQogCiBWZWN0b3I8c3A8SURybUZhY3Rvcnk+PiBEcm1IYWw6Om1ha2VEcm1GYWN0b3JpZXMoKSB7CiAgICAgVmVjdG9yPHNwPElEcm1GYWN0b3J5Pj4gZmFjdG9yaWVzOwogCi0gICAgYXV0byBtYW5hZ2VyID0gaGFyZHdhcmU6OmRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICAgIGF1dG8gbWFuYWdlciA9IGhhcmR3YXJlOjpkZWZhdWx0U2VydmljZU1hbmFnZXIxXzIoKTsKIAogICAgIGlmIChtYW5hZ2VyICE9IE5VTEwpIHsKLSAgICAgICAgbWFuYWdlci0+bGlzdEJ5SW50ZXJmYWNlKGRybTo6VjFfMDo6SURybUZhY3Rvcnk6OmRlc2NyaXB0b3IsCisgICAgICAgIG1hbmFnZXItPmxpc3RNYW5pZmVzdEJ5SW50ZXJmYWNlKGRybTo6VjFfMDo6SURybUZhY3Rvcnk6OmRlc2NyaXB0b3IsCiAgICAgICAgICAgICAgICAgWyZmYWN0b3JpZXNdKGNvbnN0IGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAmcmVnaXN0ZXJlZCkgewogICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmluc3RhbmNlIDogcmVnaXN0ZXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBmYWN0b3J5ID0gZHJtOjpWMV8wOjpJRHJtRmFjdG9yeTo6Z2V0U2VydmljZShpbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoImZvdW5kIGRybUAxLjAgSURybUZhY3RvcnkgJXMiLCBpbnN0YW5jZS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKGZhY3RvcnkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgKTsKLSAgICAgICAgbWFuYWdlci0+bGlzdEJ5SW50ZXJmYWNlKGRybTo6VjFfMTo6SURybUZhY3Rvcnk6OmRlc2NyaXB0b3IsCisgICAgICAgIG1hbmFnZXItPmxpc3RNYW5pZmVzdEJ5SW50ZXJmYWNlKGRybTo6VjFfMTo6SURybUZhY3Rvcnk6OmRlc2NyaXB0b3IsCiAgICAgICAgICAgICAgICAgWyZmYWN0b3JpZXNdKGNvbnN0IGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAmcmVnaXN0ZXJlZCkgewogICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmluc3RhbmNlIDogcmVnaXN0ZXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBmYWN0b3J5ID0gZHJtOjpWMV8xOjpJRHJtRmFjdG9yeTo6Z2V0U2VydmljZShpbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoImZvdW5kIGRybUAxLjEgSURybUZhY3RvcnkgJXMiLCBpbnN0YW5jZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKGZhY3RvcnkpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKKyAgICAgICAgbWFuYWdlci0+bGlzdEJ5SW50ZXJmYWNlKGRybTo6VjFfMjo6SURybUZhY3Rvcnk6OmRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgWyZmYWN0b3JpZXNdKGNvbnN0IGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAmcmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmluc3RhbmNlIDogcmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXV0byBmYWN0b3J5ID0gZHJtOjpWMV8yOjpJRHJtRmFjdG9yeTo6Z2V0U2VydmljZShpbnN0YW5jZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFjdG9yaWVzLnB1c2hfYmFjayhmYWN0b3J5KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNDQ4LDYgKzUxNywxNyBAQAogfQogCiBSZXR1cm48dm9pZD4gRHJtSGFsOjpzZW5kS2V5c0NoYW5nZShjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlTdGF0dXNfVjFfMD4mIGtleVN0YXR1c0xpc3RfVjFfMCwgYm9vbCBoYXNOZXdVc2FibGVLZXkpIHsKKyAgICBzdGQ6OnZlY3RvcjxLZXlTdGF0dXM+IGtleVN0YXR1c1ZlYzsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmtleVN0YXR1c19WMV8wIDoga2V5U3RhdHVzTGlzdF9WMV8wKSB7CisgICAgICAgIGtleVN0YXR1c1ZlYy5wdXNoX2JhY2soe2tleVN0YXR1c19WMV8wLmtleUlkLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEtleVN0YXR1c1R5cGU+KGtleVN0YXR1c19WMV8wLnR5cGUpfSk7CisgICAgfQorICAgIGhpZGxfdmVjPEtleVN0YXR1cz4ga2V5U3RhdHVzTGlzdF9WMV8yKGtleVN0YXR1c1ZlYyk7CisgICAgcmV0dXJuIHNlbmRLZXlzQ2hhbmdlXzFfMihzZXNzaW9uSWQsIGtleVN0YXR1c0xpc3RfVjFfMiwgaGFzTmV3VXNhYmxlS2V5KTsKK30KKworUmV0dXJuPHZvaWQ+IERybUhhbDo6c2VuZEtleXNDaGFuZ2VfMV8yKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVN0YXR1cz4mIGtleVN0YXR1c0xpc3QsIGJvb2wgaGFzTmV3VXNhYmxlS2V5KSB7CiAKICAgICBtRXZlbnRMb2NrLmxvY2soKTsKQEAgLTQ3Nyw2ICs1NTcsOSBAQAogICAgICAgICAgICAgY2FzZSBLZXlTdGF0dXNUeXBlOjpTVEFUVVNQRU5ESU5HOgogICAgICAgICAgICAgICAgIHR5cGUgPSBEcm1QbHVnaW46OmtLZXlTdGF0dXNUeXBlX1N0YXR1c1BlbmRpbmc7CiAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEtleVN0YXR1c1R5cGU6OlVTQUJMRUlORlVUVVJFOgorICAgICAgICAgICAgICAgIHR5cGUgPSBEcm1QbHVnaW46OmtLZXlTdGF0dXNUeXBlX1VzYWJsZUluRnV0dXJlOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBLZXlTdGF0dXNUeXBlOjpJTlRFUk5BTEVSUk9SOgogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICB0eXBlID0gRHJtUGx1Z2luOjprS2V5U3RhdHVzVHlwZV9JbnRlcm5hbEVycm9yOwpAQCAtNTAxLDMyICs1ODQsODAgQEAKICAgICByZXR1cm4gVm9pZCgpOwogfQogCi1ib29sIERybUhhbDo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworUmV0dXJuPHZvaWQ+IERybUhhbDo6c2VuZFNlc3Npb25Mb3N0U3RhdGUoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZhY3Rvcmllcy5zaXplKCk7IGkrKykgeworICAgIG1FdmVudExvY2subG9jaygpOworICAgIHNwPElEcm1DbGllbnQ+IGxpc3RlbmVyID0gbUxpc3RlbmVyOworICAgIG1FdmVudExvY2sudW5sb2NrKCk7CisKKyAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBQYXJjZWwgb2JqOworICAgICAgICB3cml0ZUJ5dGVBcnJheShvYmosIHNlc3Npb25JZCk7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Ob3RpZnlMb2NrKTsKKyAgICAgICAgbGlzdGVuZXItPm5vdGlmeShEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudFNlc3Npb25Mb3N0U3RhdGUsIDAsICZvYmopOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCitzdGF0dXNfdCBEcm1IYWw6Om1hdGNoTWltZVR5cGVBbmRTZWN1cml0eUxldmVsKGNvbnN0IHNwPElEcm1GYWN0b3J5PiAmZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpIHsKKyAgICAqaXNTdXBwb3J0ZWQgPSBmYWxzZTsKKworICAgIC8vIGhhbmRsZSBkZWZhdWx0IHZhbHVlIGNhc2VzCisgICAgaWYgKGxldmVsID09IERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxVbmtub3duKSB7CisgICAgICAgIGlmIChtaW1lVHlwZSA9PSAiIikgeworICAgICAgICAgICAgLy8gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkKKyAgICAgICAgICAgICppc1N1cHBvcnRlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkLCBtaW1lVHlwZSkKKyAgICAgICAgICAgICppc1N1cHBvcnRlZCA9IGZhY3RvcnktPmlzQ29udGVudFR5cGVTdXBwb3J0ZWQobWltZVR5cGUuc3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgaWYgKG1pbWVUeXBlID09ICIiKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3A8ZHJtOjpWMV8yOjpJRHJtRmFjdG9yeT4gZmFjdG9yeVYxXzIgPSBkcm06OlYxXzI6OklEcm1GYWN0b3J5OjpjYXN0RnJvbShmYWN0b3J5KTsKKyAgICBpZiAoZmFjdG9yeVYxXzIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmlzU3VwcG9ydGVkID0gZmFjdG9yeVYxXzItPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkXzFfMih1dWlkLAorICAgICAgICAgICAgICAgIG1pbWVUeXBlLnN0cmluZygpLCB0b0hpZGxTZWN1cml0eUxldmVsKGxldmVsKSk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9Cit9CisKK3N0YXR1c190IERybUhhbDo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICppc1N1cHBvcnRlZCA9IGZhbHNlOworICAgIGZvciAoc3NpemVfdCBpID0gbUZhY3Rvcmllcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICBpZiAobUZhY3Rvcmllc1tpXS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkpIHsKLSAgICAgICAgICAgIGlmIChtaW1lVHlwZSAhPSAiIikgewotICAgICAgICAgICAgICAgIGlmIChtRmFjdG9yaWVzW2ldLT5pc0NvbnRlbnRUeXBlU3VwcG9ydGVkKG1pbWVUeXBlLnN0cmluZygpKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1hdGNoTWltZVR5cGVBbmRTZWN1cml0eUxldmVsKG1GYWN0b3JpZXNbaV0sCisgICAgICAgICAgICAgICAgICAgIHV1aWQsIG1pbWVUeXBlLCBsZXZlbCwgaXNTdXBwb3J0ZWQpOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IERybUhhbDo6Y3JlYXRlUGx1Z2luKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFwcFBhY2thZ2VOYW1lKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZhY3Rvcmllcy5zaXplKCk7IGkrKykgeworICAgIGZvciAoc3NpemVfdCBpID0gbUZhY3Rvcmllcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICBpZiAobUZhY3Rvcmllc1tpXS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkpIHsKLSAgICAgICAgICAgIG1QbHVnaW4gPSBtYWtlRHJtUGx1Z2luKG1GYWN0b3JpZXNbaV0sIHV1aWQsIGFwcFBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgIGlmIChtUGx1Z2luICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGF1dG8gcGx1Z2luID0gbWFrZURybVBsdWdpbihtRmFjdG9yaWVzW2ldLCB1dWlkLCBhcHBQYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBpZiAocGx1Z2luICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtUGx1Z2luID0gcGx1Z2luOwogICAgICAgICAgICAgICAgIG1QbHVnaW5WMV8xID0gZHJtOjpWMV8xOjpJRHJtUGx1Z2luOjpjYXN0RnJvbShtUGx1Z2luKTsKKyAgICAgICAgICAgICAgICBtUGx1Z2luVjFfMiA9IGRybTo6VjFfMjo6SURybVBsdWdpbjo6Y2FzdEZyb20obVBsdWdpbik7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC01MzQsMTMgKzY2NSwyMiBAQAogICAgIGlmIChtUGx1Z2luID09IE5VTEwpIHsKICAgICAgICAgbUluaXRDaGVjayA9IEVSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghbVBsdWdpbi0+c2V0TGlzdGVuZXIodGhpcykuaXNPaygpKSB7CisgICAgICAgIG1Jbml0Q2hlY2sgPSBPSzsKKyAgICAgICAgaWYgKG1QbHVnaW5WMV8yICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmICghbVBsdWdpblYxXzItPnNldExpc3RlbmVyKHRoaXMpLmlzT2soKSkgeworICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBERUFEX09CSkVDVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghbVBsdWdpbi0+c2V0TGlzdGVuZXIodGhpcykuaXNPaygpKSB7CiAgICAgICAgICAgICBtSW5pdENoZWNrID0gREVBRF9PQkpFQ1Q7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtSW5pdENoZWNrID0gT0s7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgICAgIG1QbHVnaW4uY2xlYXIoKTsKKyAgICAgICAgICAgIG1QbHVnaW5WMV8xLmNsZWFyKCk7CisgICAgICAgICAgICBtUGx1Z2luVjFfMi5jbGVhcigpOwogICAgICAgICB9CiAgICAgfQogCisKICAgICByZXR1cm4gbUluaXRDaGVjazsKIH0KIApAQCAtNTU0LDMwICs2OTQsMTUgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIElOSVRfQ0hFQ0soKTsKIAotICAgIFNlY3VyaXR5TGV2ZWwgaFNlY3VyaXR5TGV2ZWw7CisgICAgU2VjdXJpdHlMZXZlbCBoU2VjdXJpdHlMZXZlbCA9IHRvSGlkbFNlY3VyaXR5TGV2ZWwobGV2ZWwpOwogICAgIGJvb2wgc2V0U2VjdXJpdHlMZXZlbCA9IHRydWU7CiAKLSAgICBzd2l0Y2gobGV2ZWwpIHsKLSAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZUNyeXB0bzoKLSAgICAgICAgaFNlY3VyaXR5TGV2ZWwgPSBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZURlY29kZToKLSAgICAgICAgaFNlY3VyaXR5TGV2ZWwgPSBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfREVDT0RFOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUNyeXB0bzoKLSAgICAgICAgaFNlY3VyaXR5TGV2ZWwgPSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQ1JZUFRPOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZURlY29kZToKLSAgICAgICAgaFNlY3VyaXR5TGV2ZWwgPSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfREVDT0RFOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUFsbDoKLSAgICAgICAgaFNlY3VyaXR5TGV2ZWwgPSBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQUxMOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxNYXg6CisgICAgaWYgKGxldmVsID09IERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxNYXgpIHsKICAgICAgICAgc2V0U2VjdXJpdHlMZXZlbCA9IGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gRVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGhTZWN1cml0eUxldmVsID09IFNlY3VyaXR5TGV2ZWw6OlVOS05PV04pIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHN0YXR1c190ICBlcnIgPSBVTktOT1dOX0VSUk9SOwpAQCAtNjU3LDYgKzc4MiwzOSBAQAogICAgIHJldHVybiBERUFEX09CSkVDVDsKIH0KIAorc3RhdGljIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUgdG9LZXlSZXF1ZXN0VHlwZSgKKyAgICAgICAgS2V5UmVxdWVzdFR5cGUga2V5UmVxdWVzdFR5cGUpIHsKKyAgICBzd2l0Y2ggKGtleVJlcXVlc3RUeXBlKSB7CisgICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGU6OklOSVRJQUw6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfSW5pdGlhbDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtleVJlcXVlc3RUeXBlOjpSRU5FV0FMOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1JlbmV3YWw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLZXlSZXF1ZXN0VHlwZTo6UkVMRUFTRToKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9SZWxlYXNlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfVW5rbm93bjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc3RhdGljIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUgdG9LZXlSZXF1ZXN0VHlwZV8xXzEoCisgICAgICAgIEtleVJlcXVlc3RUeXBlX1YxXzEga2V5UmVxdWVzdFR5cGUpIHsKKyAgICBzd2l0Y2ggKGtleVJlcXVlc3RUeXBlKSB7CisgICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGVfVjFfMTo6Tk9ORToKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Ob25lOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGVfVjFfMTo6VVBEQVRFOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1VwZGF0ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIHRvS2V5UmVxdWVzdFR5cGUoc3RhdGljX2Nhc3Q8S2V5UmVxdWVzdFR5cGU+KGtleVJlcXVlc3RUeXBlKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKIHN0YXR1c190IERybUhhbDo6Z2V0S2V5UmVxdWVzdChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZpbml0RGF0YSwgU3RyaW5nOCBjb25zdCAmbWltZVR5cGUsCiAgICAgICAgIERybVBsdWdpbjo6S2V5VHlwZSBrZXlUeXBlLCBLZXllZFZlY3RvcjxTdHJpbmc4LApAQCAtNjgzLDczICs4NDEsNTEgQEAKICAgICA6OktleWVkVmVjdG9yIGhPcHRpb25hbFBhcmFtZXRlcnMgPSB0b0hpZGxLZXllZFZlY3RvcihvcHRpb25hbFBhcmFtZXRlcnMpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdDsKIAotICAgIGlmIChtUGx1Z2luVjFfMSAhPSBOVUxMKSB7Ci0gICAgICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0KLSAgICAgICAgICAgIG1QbHVnaW5WMV8xLT5nZXRLZXlSZXF1ZXN0XzFfMSgKKyAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgeworICAgICAgICBoUmVzdWx0ID0gbVBsdWdpblYxXzItPmdldEtleVJlcXVlc3RfMV8yKAorICAgICAgICAgICAgICAgIHRvSGlkbFZlYyhzZXNzaW9uSWQpLCB0b0hpZGxWZWMoaW5pdERhdGEpLAorICAgICAgICAgICAgICAgIHRvSGlkbFN0cmluZyhtaW1lVHlwZSksIGhLZXlUeXBlLCBoT3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXNfVjFfMiBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoUmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtleVJlcXVlc3RUeXBlX1YxXzEgaEtleVJlcXVlc3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGhEZWZhdWx0VXJsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzX1YxXzI6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3IoaFJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7CisgICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSB0b0tleVJlcXVlc3RUeXBlXzFfMShoS2V5UmVxdWVzdFR5cGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVF8xXzIoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9IGVsc2UgaWYgKG1QbHVnaW5WMV8xICE9IE5VTEwpIHsKKyAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8xLT5nZXRLZXlSZXF1ZXN0XzFfMSgKICAgICAgICAgICAgICAgICB0b0hpZGxWZWMoc2Vzc2lvbklkKSwgdG9IaWRsVmVjKGluaXREYXRhKSwKICAgICAgICAgICAgICAgICB0b0hpZGxTdHJpbmcobWltZVR5cGUpLCBoS2V5VHlwZSwgaE9wdGlvbmFsUGFyYW1ldGVycywKICAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhSZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICBkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlIGhLZXlSZXF1ZXN0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGhEZWZhdWx0VXJsKSB7Ci0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGhLZXlSZXF1ZXN0VHlwZSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIGRybTo6VjFfMTo6S2V5UmVxdWVzdFR5cGU6OklOSVRJQUw6Ci0gICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Jbml0aWFsOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgZHJtOjpWMV8xOjpLZXlSZXF1ZXN0VHlwZTo6UkVORVdBTDoKLSAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1JlbmV3YWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlOjpSRUxFQVNFOgotICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfUmVsZWFzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIGRybTo6VjFfMTo6S2V5UmVxdWVzdFR5cGU6Ok5PTkU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Ob25lOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgZHJtOjpWMV8xOjpLZXlSZXF1ZXN0VHlwZTo6VVBEQVRFOgotICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfVXBkYXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Vbmtub3duOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Ci0gICAgfQotCi0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5nZXRLZXlSZXF1ZXN0KHRvSGlkbFZlYyhzZXNzaW9uSWQpLAotICAgICAgICAgICAgdG9IaWRsVmVjKGluaXREYXRhKSwgdG9IaWRsU3RyaW5nKG1pbWVUeXBlKSwgaEtleVR5cGUsIGhPcHRpb25hbFBhcmFtZXRlcnMsCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhSZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICBkcm06OlYxXzA6OktleVJlcXVlc3RUeXBlIGhLZXlSZXF1ZXN0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGhEZWZhdWx0VXJsKSB7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA9IHRvVmVjdG9yKGhSZXF1ZXN0KTsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChoS2V5UmVxdWVzdFR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBkcm06OlYxXzA6OktleVJlcXVlc3RUeXBlOjpJTklUSUFMOgotICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfSW5pdGlhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIGRybTo6VjFfMDo6S2V5UmVxdWVzdFR5cGU6OlJFTkVXQUw6Ci0gICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9SZW5ld2FsOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgZHJtOjpWMV8wOjpLZXlSZXF1ZXN0VHlwZTo6UkVMRUFTRToKLSAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1JlbGVhc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1Vua25vd247Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtleVJlcXVlc3RUeXBlX1YxXzEgaEtleVJlcXVlc3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGhEZWZhdWx0VXJsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA9IHRvVmVjdG9yKGhSZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRVcmwgPSB0b1N0cmluZzgoaERlZmF1bHRVcmwpOworICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gdG9LZXlSZXF1ZXN0VHlwZV8xXzEoaEtleVJlcXVlc3RUeXBlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgICBoUmVzdWx0ID0gbVBsdWdpbi0+Z2V0S2V5UmVxdWVzdCgKKyAgICAgICAgICAgICAgICB0b0hpZGxWZWMoc2Vzc2lvbklkKSwgdG9IaWRsVmVjKGluaXREYXRhKSwKKyAgICAgICAgICAgICAgICB0b0hpZGxTdHJpbmcobWltZVR5cGUpLCBoS2V5VHlwZSwgaE9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGhSZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgS2V5UmVxdWVzdFR5cGUgaEtleVJlcXVlc3RUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGhEZWZhdWx0VXJsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA9IHRvVmVjdG9yKGhSZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRVcmwgPSB0b1N0cmluZzgoaERlZmF1bHRVcmwpOworICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gdG9LZXlSZXF1ZXN0VHlwZShoS2V5UmVxdWVzdFR5cGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0KIAogICAgIGVyciA9IGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CiAgICAga2V5UmVxdWVzdFRpbWVyLlNldEF0dHJpYnV0ZShlcnIpOwpAQCAtODMxLDE4ICs5NjcsMzMgQEAKICAgICBJTklUX0NIRUNLKCk7CiAKICAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0OwogCi0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5nZXRQcm92aXNpb25SZXF1ZXN0KAotICAgICAgICAgICAgdG9IaWRsU3RyaW5nKGNlcnRUeXBlKSwgdG9IaWRsU3RyaW5nKGNlcnRBdXRob3JpdHkpLAotICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoUmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGhEZWZhdWx0VXJsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRVcmwgPSB0b1N0cmluZzgoaERlZmF1bHRVcmwpOworICAgIGlmIChtUGx1Z2luVjFfMiAhPSBOVUxMKSB7CisgICAgICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpblYxXzItPmdldFByb3Zpc2lvblJlcXVlc3RfMV8yKAorICAgICAgICAgICAgICAgIHRvSGlkbFN0cmluZyhjZXJ0VHlwZSksIHRvSGlkbFN0cmluZyhjZXJ0QXV0aG9yaXR5KSwKKyAgICAgICAgICAgICAgICBbJl0oU3RhdHVzX1YxXzIgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1RfMV8yKHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICApOworICAgICAgICAgICAgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPmdldFByb3Zpc2lvblJlcXVlc3QoCisgICAgICAgICAgICAgICAgdG9IaWRsU3RyaW5nKGNlcnRUeXBlKSwgdG9IaWRsU3RyaW5nKGNlcnRBdXRob3JpdHkpLAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3IoaFJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKKyAgICB9CiAKICAgICBlcnIgPSBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOwogICAgIG1NZXRyaWNzLm1HZXRQcm92aXNpb25SZXF1ZXN0Q291bnRlci5JbmNyZW1lbnQoZXJyKTsKQEAgLTk4OCwyMiArMTEzOSwzMSBAQAogICAgIH0KICAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwogCi0gICAgaWYgKG1QbHVnaW5WMV8xID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgIH0KLQogICAgICpjb25uZWN0ZWQgPSBEcm1QbHVnaW46OmtIZGNwTGV2ZWxVbmtub3duOwogICAgICptYXggPSBEcm1QbHVnaW46OmtIZGNwTGV2ZWxVbmtub3duOwogCi0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luVjFfMS0+Z2V0SGRjcExldmVscygKLSAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBIZGNwTGV2ZWwmIGhDb25uZWN0ZWQsIGNvbnN0IEhkY3BMZXZlbCYgaE1heCkgewotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICAqY29ubmVjdGVkID0gdG9IZGNwTGV2ZWwoaENvbm5lY3RlZCk7Ci0gICAgICAgICAgICAgICAgICAgICptYXggPSB0b0hkY3BMZXZlbChoTWF4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgKTsKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdDsKKyAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgeworICAgICAgICBoUmVzdWx0ID0gbVBsdWdpblYxXzItPmdldEhkY3BMZXZlbHNfMV8yKAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXNfVjFfMiBzdGF0dXMsIGNvbnN0IEhkY3BMZXZlbF9WMV8yJiBoQ29ubmVjdGVkLCBjb25zdCBIZGNwTGV2ZWxfVjFfMiYgaE1heCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1c19WMV8yOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgKmNvbm5lY3RlZCA9IHRvSGRjcExldmVsKGhDb25uZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgKm1heCA9IHRvSGRjcExldmVsKGhNYXgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVF8xXzIoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9IGVsc2UgaWYgKG1QbHVnaW5WMV8xICE9IE5VTEwpIHsKKyAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8xLT5nZXRIZGNwTGV2ZWxzKAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBIZGNwTGV2ZWwmIGhDb25uZWN0ZWQsIGNvbnN0IEhkY3BMZXZlbCYgaE1heCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpjb25uZWN0ZWQgPSB0b0hkY3BMZXZlbChzdGF0aWNfY2FzdDxIZGNwTGV2ZWxfVjFfMj4oaENvbm5lY3RlZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgKm1heCA9IHRvSGRjcExldmVsKHN0YXRpY19jYXN0PEhkY3BMZXZlbF9WMV8yPihoTWF4KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KIAogICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOwogfQpAQCAtMTA2NSw2ICsxMjI1LDczIEBACiAgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CiB9CiAKK3N0YXR1c190IERybUhhbDo6Z2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4+ICZrZXlTZXRJZHMpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1QbHVnaW5WMV8yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRPZmZsaW5lTGljZW5zZUtleVNldElkcygKKyAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzxLZXlTZXRJZD4mIGhLZXlTZXRJZHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAga2V5U2V0SWRzID0gdG9LZXlTZXRJZHMoaEtleVNldElkcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgfQorICAgICk7CisKKyAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsOjpyZW1vdmVPZmZsaW5lTGljZW5zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGlmIChtUGx1Z2luVjFfMiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBtUGx1Z2luVjFfMi0+cmVtb3ZlT2ZmbGluZUxpY2Vuc2UodG9IaWRsVmVjKGtleVNldElkKSk7CisgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWw6OmdldE9mZmxpbmVMaWNlbnNlU3RhdGUoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCwKKyAgICAgICAgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlICpsaWNlbnNlU3RhdGUpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1QbHVnaW5WMV8yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKyAgICAqbGljZW5zZVN0YXRlID0gRHJtUGx1Z2luOjprT2ZmbGluZUxpY2Vuc2VTdGF0ZVVua25vd247CisKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luVjFfMi0+Z2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZSh0b0hpZGxWZWMoa2V5U2V0SWQpLAorICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIE9mZmxpbmVMaWNlbnNlU3RhdGUgaExpY2Vuc2VTdGF0ZSkgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAqbGljZW5zZVN0YXRlID0gdG9PZmZsaW5lTGljZW5zZVN0YXRlKGhMaWNlbnNlU3RhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICApOworCisgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Cit9CisKIHN0YXR1c190IERybUhhbDo6Z2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUgKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICByZXR1cm4gZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChuYW1lLCB2YWx1ZSk7CkBAIC0xMzQzLDIyICsxNTcwLDIyIEBACiAKIHZvaWQgRHJtSGFsOjpyZXBvcnRGcmFtZXdvcmtNZXRyaWNzKCkgY29uc3QKIHsKLSAgICBNZWRpYUFuYWx5dGljc0l0ZW0gaXRlbSgibWVkaWFkcm0iKTsKLSAgICBpdGVtLmdlbmVyYXRlU2Vzc2lvbklEKCk7Ci0gICAgaXRlbS5zZXRQa2dOYW1lKG1NZXRyaWNzLkdldEFwcFBhY2thZ2VOYW1lKCkuY19zdHIoKSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQW5hbHl0aWNzSXRlbT4gaXRlbShNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZSgibWVkaWFkcm0iKSk7CisgICAgaXRlbS0+Z2VuZXJhdGVTZXNzaW9uSUQoKTsKKyAgICBpdGVtLT5zZXRQa2dOYW1lKG1NZXRyaWNzLkdldEFwcFBhY2thZ2VOYW1lKCkuY19zdHIoKSk7CiAgICAgU3RyaW5nOCB2ZW5kb3I7CiAgICAgU3RyaW5nOCBkZXNjcmlwdGlvbjsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzgoInZlbmRvciIpLCB2ZW5kb3IpOwogICAgIGlmIChyZXN1bHQgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgdmVuZG9yIGZyb20gZHJtIHBsdWdpbjogJWQiLCByZXN1bHQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGl0ZW0uc2V0Q1N0cmluZygidmVuZG9yIiwgdmVuZG9yLmNfc3RyKCkpOworICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKCJ2ZW5kb3IiLCB2ZW5kb3IuY19zdHIoKSk7CiAgICAgfQogICAgIHJlc3VsdCA9IGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgiZGVzY3JpcHRpb24iKSwgZGVzY3JpcHRpb24pOwogICAgIGlmIChyZXN1bHQgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgZGVzY3JpcHRpb24gZnJvbSBkcm0gcGx1Z2luOiAlZCIsIHJlc3VsdCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaXRlbS5zZXRDU3RyaW5nKCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uLmNfc3RyKCkpOworICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uLmNfc3RyKCkpOwogICAgIH0KIAogICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWRNZXRyaWNzOwpAQCAtMTM2OSw5ICsxNTk2LDkgQEAKICAgICBzdGQ6OnN0cmluZyBiNjRFbmNvZGVkTWV0cmljcyA9IHRvQmFzZTY0U3RyaW5nTm9QYWQoc2VyaWFsaXplZE1ldHJpY3MuZGF0YSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkTWV0cmljcy5zaXplKCkpOwogICAgIGlmICghYjY0RW5jb2RlZE1ldHJpY3MuZW1wdHkoKSkgewotICAgICAgICBpdGVtLnNldENTdHJpbmcoInNlcmlhbGl6ZWRfbWV0cmljcyIsIGI2NEVuY29kZWRNZXRyaWNzLmNfc3RyKCkpOworICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKCJzZXJpYWxpemVkX21ldHJpY3MiLCBiNjRFbmNvZGVkTWV0cmljcy5jX3N0cigpKTsKICAgICB9Ci0gICAgaWYgKCFpdGVtLnNlbGZyZWNvcmQoKSkgeworICAgIGlmICghaXRlbS0+c2VsZnJlY29yZCgpKSB7CiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2VsZiByZWNvcmQgZnJhbWV3b3JrIG1ldHJpY3MiKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vRHJtTWV0cmljcy5jcHAgYi9kcm0vbGlibWVkaWFkcm0vRHJtTWV0cmljcy5jcHAKaW5kZXggNGZlZDcwNy4uMzA4MDgwMiAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0RybU1ldHJpY3MuY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9Ecm1NZXRyaWNzLmNwcApAQCAtMzIsNyArMzIsNyBAQAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6RXZlbnRUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlTdGF0dXNUeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpLZXlTdGF0dXNUeXBlOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpEcm1NZXRyaWNHcm91cDsKIHVzaW5nIDo6YW5kcm9pZDo6b3M6OlBlcnNpc3RhYmxlQnVuZGxlOwogCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vSURybS5jcHAgYi9kcm0vbGlibWVkaWFkcm0vSURybS5jcHAKaW5kZXggNTA5OTYxZi4uNTEyNzRkMSAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0lEcm0uY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9JRHJtLmNwcApAQCAtNjEsNyArNjEsMTAgQEAKICAgICBHRVRfTlVNQkVSX09GX1NFU1NJT05TLAogICAgIEdFVF9TRUNVUklUWV9MRVZFTCwKICAgICBSRU1PVkVfU0VDVVJFX1NUT1AsCi0gICAgR0VUX1NFQ1VSRV9TVE9QX0lEUworICAgIEdFVF9TRUNVUkVfU1RPUF9JRFMsCisgICAgR0VUX09GRkxJTkVfTElDRU5TRV9LRVlTRVRfSURTLAorICAgIFJFTU9WRV9PRkZMSU5FX0xJQ0VOU0UsCisgICAgR0VUX09GRkxJTkVfTElDRU5TRV9TVEFURQogfTsKIAogc3RydWN0IEJwRHJtIDogcHVibGljIEJwSW50ZXJmYWNlPElEcm0+IHsKQEAgLTgwLDE4ICs4MywyMiBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCi0gICAgdmlydHVhbCBib29sIGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFN0cmluZzggJm1pbWVUeXBlKSB7CisgICAgdmlydHVhbCBzdGF0dXNfdCBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBTdHJpbmc4ICZtaW1lVHlwZSwKKyAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwgYm9vbCAqaXNTdXBwb3J0ZWQpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZSh1dWlkLCAxNik7CiAgICAgICAgIGRhdGEud3JpdGVTdHJpbmc4KG1pbWVUeXBlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGxldmVsKTsKKwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoSVNfQ1JZUFRPX1NVUFBPUlRFRCwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoImlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkOiBiaW5kZXIgY2FsbCBmYWlsZWQ6ICVkIiwgc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgIH0KKyAgICAgICAgKmlzU3VwcG9ydGVkID0gc3RhdGljX2Nhc3Q8Ym9vbD4ocmVwbHkucmVhZEludDMyKCkpOwogCi0gICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKSAhPSAwOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVQbHVnaW4oY29uc3QgdWludDhfdCB1dWlkWzE2XSwKQEAgLTEyMCwxMSArMTI3LDExIEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5TZXNzaW9uKERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBzZWN1cml0eUxldmVsLAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlblNlc3Npb24oRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsLAogICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKHNlY3VyaXR5TGV2ZWwpOworICAgICAgICBkYXRhLndyaXRlSW50MzIobGV2ZWwpOwogCiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX1NFU1NJT04sIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKQEAgLTM3Niw2ICszODMsNTIgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4gPiAma2V5U2V0SWRzKSBjb25zdCB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9PRkZMSU5FX0xJQ0VOU0VfS0VZU0VUX0lEUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorCisgICAgICAgIGtleVNldElkcy5jbGVhcigpOworICAgICAgICB1aW50MzJfdCBjb3VudCA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBrZXlTZXRJZDsKKyAgICAgICAgICAgIHJlYWRWZWN0b3IocmVwbHksIGtleVNldElkKTsKKyAgICAgICAgICAgIGtleVNldElkcy5wdXNoX2JhY2soa2V5U2V0SWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZU9mZmxpbmVMaWNlbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSURybTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICB3cml0ZVZlY3RvcihkYXRhLCBrZXlTZXRJZCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChSRU1PVkVfT0ZGTElORV9MSUNFTlNFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlU3RhdGUoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCwKKyAgICAgICAgICAgIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSAqbGljZW5zZVN0YXRlKSBjb25zdCB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgd3JpdGVWZWN0b3IoZGF0YSwga2V5U2V0SWQpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX09GRkxJTkVfTElDRU5TRV9TVEFURSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgKmxpY2Vuc2VTdGF0ZSA9IERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZTo6a09mZmxpbmVMaWNlbnNlU3RhdGVVbmtub3duOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICAqbGljZW5zZVN0YXRlID0gc3RhdGljX2Nhc3Q8RHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlPihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggJnZhbHVlKSBjb25zdCB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC03MTksNyArNzcyLDEyIEBACiAgICAgICAgICAgICB1aW50OF90IHV1aWRbMTZdOwogICAgICAgICAgICAgZGF0YS5yZWFkKHV1aWQsIHNpemVvZih1dWlkKSk7CiAgICAgICAgICAgICBTdHJpbmc4IG1pbWVUeXBlID0gZGF0YS5yZWFkU3RyaW5nOCgpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCwgbWltZVR5cGUpKTsKKyAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbD4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICBib29sIGlzU3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkLCBtaW1lVHlwZSwgbGV2ZWwsICZpc1N1cHBvcnRlZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpc1N1cHBvcnRlZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOwogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAKQEAgLTk4MCw2ICsxMDM4LDQ1IEBACiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIEdFVF9PRkZMSU5FX0xJQ0VOU0VfS0VZU0VUX0lEUzoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm0sIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4ga2V5U2V0SWRzOworICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gZ2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoa2V5U2V0SWRzKTsKKyAgICAgICAgICAgIHNpemVfdCBjb3VudCA9IGtleVNldElkcy5zaXplKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihjb3VudCk7CisgICAgICAgICAgICBMaXN0PFZlY3Rvcjx1aW50OF90PiA+OjppdGVyYXRvciBpdGVyID0ga2V5U2V0SWRzLmJlZ2luKCk7CisgICAgICAgICAgICB3aGlsZShpdGVyICE9IGtleVNldElkcy5lbmQoKSkgeworICAgICAgICAgICAgICAgIHNpemVfdCBzaXplID0gaXRlci0+c2l6ZSgpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNpemUpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZShpdGVyLT5hcnJheSgpLCBpdGVyLT5zaXplKCkpOworICAgICAgICAgICAgICAgIGl0ZXIrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFJFTU9WRV9PRkZMSU5FX0xJQ0VOU0U6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4ga2V5U2V0SWQ7CisgICAgICAgICAgICByZWFkVmVjdG9yKGRhdGEsIGtleVNldElkKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlbW92ZU9mZmxpbmVMaWNlbnNlKGtleVNldElkKSk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEdFVF9PRkZMSU5FX0xJQ0VOU0VfU1RBVEU6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4ga2V5U2V0SWQ7CisgICAgICAgICAgICByZWFkVmVjdG9yKGRhdGEsIGtleVNldElkKTsKKyAgICAgICAgICAgIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSBzdGF0ZTsKKyAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IGdldE9mZmxpbmVMaWNlbnNlU3RhdGUoa2V5U2V0SWQsICZzdGF0ZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGU+KHN0YXRlKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBHRVRfUFJPUEVSVFlfU1RSSU5HOgogICAgICAgICB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybSwgZGF0YSwgcmVwbHkpOwpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuY3BwCmluZGV4IDVjYjQ4YmYuLjhjZDZmOTYgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9QbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vUGx1Z2luTWV0cmljc1JlcG9ydGluZy5jcHAKQEAgLTM0LDE3ICszNCwxNyBAQAogc3RhdHVzX3QgcmVwb3J0VmVuZG9yTWV0cmljcyhjb25zdCBzdGQ6OnN0cmluZyYgbWV0cmljcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYXBwUGFja2FnZU5hbWUpIHsKLSAgICBNZWRpYUFuYWx5dGljc0l0ZW0gYW5hbHl0aWNzSXRlbShuYW1lLmNfc3RyKCkpOwotICAgIGFuYWx5dGljc0l0ZW0uZ2VuZXJhdGVTZXNzaW9uSUQoKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFBbmFseXRpY3NJdGVtPiBhbmFseXRpY3NJdGVtKE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKG5hbWUuY19zdHIoKSkpOworICAgIGFuYWx5dGljc0l0ZW0tPmdlbmVyYXRlU2Vzc2lvbklEKCk7CiAKICAgICBzdGQ6OnN0cmluZyBhcHBfcGFja2FnZV9uYW1lKGFwcFBhY2thZ2VOYW1lLmNfc3RyKCksIGFwcFBhY2thZ2VOYW1lLnNpemUoKSk7Ci0gICAgYW5hbHl0aWNzSXRlbS5zZXRQa2dOYW1lKGFwcF9wYWNrYWdlX25hbWUpOworICAgIGFuYWx5dGljc0l0ZW0tPnNldFBrZ05hbWUoYXBwX3BhY2thZ2VfbmFtZSk7CiAgICAgaWYgKG1ldHJpY3Muc2l6ZSgpID4gMCkgewotICAgICAgICBhbmFseXRpY3NJdGVtLnNldENTdHJpbmcoa1NlcmlhbGl6ZWRNZXRyaWNzRmllbGQsIG1ldHJpY3MuY19zdHIoKSk7CisgICAgICAgIGFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa1NlcmlhbGl6ZWRNZXRyaWNzRmllbGQsIG1ldHJpY3MuY19zdHIoKSk7CiAgICAgfQogCi0gICAgaWYgKCFhbmFseXRpY3NJdGVtLnNlbGZyZWNvcmQoKSkgewotICAgICAgQUxPR0UoInNlbGZyZWNvcmQoKSByZXR1cm5lZCBmYWxzZS4gc2Vzc2lvSWQgJSIgUFJJZDY0LCBhbmFseXRpY3NJdGVtLmdldFNlc3Npb25JRCgpKTsKKyAgICBpZiAoIWFuYWx5dGljc0l0ZW0tPnNlbGZyZWNvcmQoKSkgeworICAgICAgQUxPR0UoInNlbGZyZWNvcmQoKSByZXR1cm5lZCBmYWxzZS4gc2Vzc2lvSWQgJSIgUFJJZDY0LCBhbmFseXRpY3NJdGVtLT5nZXRTZXNzaW9uSUQoKSk7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0FuZHJvaWQuYnAgYi9kcm0vbGlibWVkaWFkcm0vdGVzdHMvQW5kcm9pZC5icAppbmRleCA2NmM5MDZmLi45ZTAxMTVlIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vdGVzdHMvQW5kcm9pZC5icAorKysgYi9kcm0vbGlibWVkaWFkcm0vdGVzdHMvQW5kcm9pZC5icApAQCAtMTcsNiArMTcsNyBAQAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIiwKICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEiLAorICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMiIsCiAgICAgICAibGliYmluZGVyIiwKICAgICAgICJsaWJoaWRsYmFzZSIsCiAgICAgICAibGlibG9nIiwKQEAgLTMzLDcgKzM0LDYgQEAKICAgICAgICAgLy8gU3VwcHJlc3MgdW51c2VkIHBhcmFtZXRlciBhbmQgbm8gZXJyb3Igb3B0aW9ucy4gVGhlc2UgY2F1c2UgcHJvYmxlbXMKICAgICAgICAgLy8gd2hlbiB1c2luZyB0aGUgbWFwIHR5cGUgaW4gYSBwcm90byBkZWZpbml0aW9uLgogICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKLSAgICAgICAgIi1Xbm8tZXJyb3IiLAogICAgIF0KIH0KIApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0RybU1ldHJpY3NfdGVzdC5jcHAgYi9kcm0vbGlibWVkaWFkcm0vdGVzdHMvRHJtTWV0cmljc190ZXN0LmNwcAppbmRleCA2NGFhOWQwLi41YzhhMWIwIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vdGVzdHMvRHJtTWV0cmljc190ZXN0LmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vdGVzdHMvRHJtTWV0cmljc190ZXN0LmNwcApAQCAtMzAsNyArMzAsNyBAQAogdXNpbmcgOjphbmRyb2lkOjpkcm1fbWV0cmljczo6RHJtRnJhbWV3b3JrTWV0cmljczsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpFdmVudFR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OktleVN0YXR1c1R5cGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OktleVN0YXR1c1R5cGU7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN0YXR1czsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA7CiB1c2luZyA6OmFuZHJvaWQ6Om9zOjpQZXJzaXN0YWJsZUJ1bmRsZTsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmNwcCBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmNwcAppbmRleCAxNTU4ZThiLi5iZjM1MjI0IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5jcHAKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlDYXNQbHVnaW4uY3BwCkBAIC02NSw3ICs2NSwyMCBAQAogICAgICpwbHVnaW4gPSBuZXcgQ2xlYXJLZXlDYXNQbHVnaW4oYXBwRGF0YSwgY2FsbGJhY2spOwogICAgIHJldHVybiBPSzsKIH0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdHVzX3QgQ2xlYXJLZXlDYXNGYWN0b3J5OjpjcmVhdGVQbHVnaW4oCisgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLAorICAgICAgICB2b2lkICphcHBEYXRhLAorICAgICAgICBDYXNQbHVnaW5DYWxsYmFja0V4dCBjYWxsYmFjaywKKyAgICAgICAgQ2FzUGx1Z2luICoqcGx1Z2luKSB7CisgICAgaWYgKCFpc1N5c3RlbUlkU3VwcG9ydGVkKENBX3N5c3RlbV9pZCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAqcGx1Z2luID0gbmV3IENsZWFyS2V5Q2FzUGx1Z2luKGFwcERhdGEsIGNhbGxiYWNrKTsKKyAgICByZXR1cm4gT0s7Cit9CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogYm9vbCBDbGVhcktleURlc2NyYW1ibGVyRmFjdG9yeTo6aXNTeXN0ZW1JZFN1cHBvcnRlZCgKICAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQpIGNvbnN0IHsKICAgICByZXR1cm4gQ0Ffc3lzdGVtX2lkID09IHNDbGVhcktleVN5c3RlbUlkOwpAQCAtODQsNyArOTcsMTMgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIENsZWFyS2V5Q2FzUGx1Z2luOjpDbGVhcktleUNhc1BsdWdpbigKICAgICAgICAgdm9pZCAqYXBwRGF0YSwgQ2FzUGx1Z2luQ2FsbGJhY2sgY2FsbGJhY2spCi0gICAgOiBtQ2FsbGJhY2soY2FsbGJhY2spLCBtQXBwRGF0YShhcHBEYXRhKSB7CisgICAgOiBtQ2FsbGJhY2soY2FsbGJhY2spLCBtQ2FsbGJhY2tFeHQoTlVMTCksIG1BcHBEYXRhKGFwcERhdGEpIHsKKyAgICBBTE9HVigiQ1RPUiIpOworfQorCitDbGVhcktleUNhc1BsdWdpbjo6Q2xlYXJLZXlDYXNQbHVnaW4oCisgICAgICAgIHZvaWQgKmFwcERhdGEsIENhc1BsdWdpbkNhbGxiYWNrRXh0IGNhbGxiYWNrKQorICAgIDogbUNhbGxiYWNrKE5VTEwpLCBtQ2FsbGJhY2tFeHQoY2FsbGJhY2spLCBtQXBwRGF0YShhcHBEYXRhKSB7CiAgICAgQUxPR1YoIkNUT1IiKTsKIH0KIApAQCAtMTY3LDExICsxODYsMzAgQEAKICAgICAvLyBFY2hvIHRoZSByZWNlaXZlZCBldmVudCB0byB0aGUgY2FsbGJhY2suCiAgICAgLy8gQ2xlYXIga2V5IHBsdWdpbiBkb2Vzbid0IHVzZSBhbnkgZXZlbnQsIGVjaG8naW5nIGZvciB0ZXN0aW5nIG9ubHkuCiAgICAgaWYgKG1DYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgICAgIG1DYWxsYmFjaygodm9pZCopbUFwcERhdGEsIGV2ZW50LCBhcmcsICh1aW50OF90KilldmVudERhdGEuZGF0YSgpLCBldmVudERhdGEuc2l6ZSgpKTsKKyAgICAgICAgbUNhbGxiYWNrKCh2b2lkKiltQXBwRGF0YSwgZXZlbnQsIGFyZywgKHVpbnQ4X3QqKWV2ZW50RGF0YS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YS5zaXplKCkpOworICAgIH0gZWxzZSBpZiAobUNhbGxiYWNrRXh0ICE9IE5VTEwpIHsKKyAgICAgICAgbUNhbGxiYWNrRXh0KCh2b2lkKiltQXBwRGF0YSwgZXZlbnQsIGFyZywgKHVpbnQ4X3QqKWV2ZW50RGF0YS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YS5zaXplKCksIE5VTEwpOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IENsZWFyS2V5Q2FzUGx1Z2luOjpzZW5kU2Vzc2lvbkV2ZW50KAorICAgICAgICBjb25zdCBDYXNTZXNzaW9uSWQgJnNlc3Npb25JZCwgaW50MzJfdCBldmVudCwKKyAgICAgICAgaW50IGFyZywgY29uc3QgQ2FzRGF0YSAmZXZlbnREYXRhKSB7CisgICAgQUxPR1YoInNlbmRTZXNzaW9uRXZlbnQ6IHNlc3Npb25JZD0lcywgZXZlbnQ9JWQsIGFyZz0lZCIsCisgICAgICAgICAgc2Vzc2lvbklkVG9TdHJpbmcoc2Vzc2lvbklkKS5zdHJpbmcoKSwgZXZlbnQsIGFyZyk7CisgICAgLy8gRWNobyB0aGUgcmVjZWl2ZWQgZXZlbnQgdG8gdGhlIGNhbGxiYWNrLgorICAgIC8vIENsZWFyIGtleSBwbHVnaW4gZG9lc24ndCB1c2UgYW55IGV2ZW50LCBlY2hvJ2luZyBmb3IgdGVzdGluZyBvbmx5LgorICAgIGlmIChtQ2FsbGJhY2tFeHQgIT0gTlVMTCkgeworICAgICAgICBtQ2FsbGJhY2tFeHQoKHZvaWQqKW1BcHBEYXRhLCBldmVudCwgYXJnLCAodWludDhfdCopZXZlbnREYXRhLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhLnNpemUoKSwgJnNlc3Npb25JZCk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBDbGVhcktleUNhc1BsdWdpbjo6cHJvdmlzaW9uKGNvbnN0IFN0cmluZzggJnN0cikgewogICAgIEFMT0dWKCJwcm92aXNpb246IHByb3Zpc2lvblN0cmluZz0lcyIsIHN0ci5zdHJpbmcoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUtleUZldGNoZXJMb2NrKTsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmggYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5oCmluZGV4IDM4OWUxNzIuLmY0OGQ1YjEgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmgKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlDYXNQbHVnaW4uaApAQCAtNDcsNiArNDcsMTEgQEAKICAgICAgICAgICAgIHZvaWQgKmFwcERhdGEsCiAgICAgICAgICAgICBDYXNQbHVnaW5DYWxsYmFjayBjYWxsYmFjaywKICAgICAgICAgICAgIENhc1BsdWdpbiAqKnBsdWdpbikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVQbHVnaW4oCisgICAgICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwKKyAgICAgICAgICAgIHZvaWQgKmFwcERhdGEsCisgICAgICAgICAgICBDYXNQbHVnaW5DYWxsYmFja0V4dCBjYWxsYmFjaywKKyAgICAgICAgICAgIENhc1BsdWdpbiAqKnBsdWdpbikgb3ZlcnJpZGU7CiB9OwogCiBjbGFzcyBDbGVhcktleURlc2NyYW1ibGVyRmFjdG9yeSA6IHB1YmxpYyBEZXNjcmFtYmxlckZhY3RvcnkgewpAQCAtNjMsNiArNjgsNyBAQAogY2xhc3MgQ2xlYXJLZXlDYXNQbHVnaW4gOiBwdWJsaWMgQ2FzUGx1Z2luIHsKIHB1YmxpYzoKICAgICBDbGVhcktleUNhc1BsdWdpbih2b2lkICphcHBEYXRhLCBDYXNQbHVnaW5DYWxsYmFjayBjYWxsYmFjayk7CisgICAgQ2xlYXJLZXlDYXNQbHVnaW4odm9pZCAqYXBwRGF0YSwgQ2FzUGx1Z2luQ2FsbGJhY2tFeHQgY2FsbGJhY2spOwogICAgIHZpcnR1YWwgfkNsZWFyS2V5Q2FzUGx1Z2luKCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByaXZhdGVEYXRhKApAQCAtODUsNiArOTEsMTAgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNlbmRFdmVudCgKICAgICAgICAgICAgIGludDMyX3QgZXZlbnQsIGludDMyX3QgYXJnLCBjb25zdCBDYXNEYXRhICZldmVudERhdGEpIG92ZXJyaWRlOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZW5kU2Vzc2lvbkV2ZW50KAorICAgICAgICAgICAgY29uc3QgQ2FzU2Vzc2lvbklkICZzZXNzaW9uSWQsCisgICAgICAgICAgICBpbnQzMl90IGV2ZW50LCBpbnQzMl90IGFyZywgY29uc3QgQ2FzRGF0YSAmZXZlbnREYXRhKSBvdmVycmlkZTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvdmlzaW9uKGNvbnN0IFN0cmluZzggJnN0cikgb3ZlcnJpZGU7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZnJlc2hFbnRpdGxlbWVudHMoCkBAIC05NCw2ICsxMDQsNyBAQAogICAgIE11dGV4IG1LZXlGZXRjaGVyTG9jazsKICAgICBzdGQ6OnVuaXF1ZV9wdHI8S2V5RmV0Y2hlcj4gbUtleUZldGNoZXI7CiAgICAgQ2FzUGx1Z2luQ2FsbGJhY2sgbUNhbGxiYWNrOworICAgIENhc1BsdWdpbkNhbGxiYWNrRXh0IG1DYWxsYmFja0V4dDsKICAgICB2b2lkKiBtQXBwRGF0YTsKIH07CiAKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svTW9ja0Nhc1BsdWdpbi5jcHAgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL01vY2tDYXNQbHVnaW4uY3BwCmluZGV4IDg0MDRhODMuLjI5NjQ3OTEgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svTW9ja0Nhc1BsdWdpbi5jcHAKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9Nb2NrQ2FzUGx1Z2luLmNwcApAQCAtNjAsNiArNjAsMTkgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IE1vY2tDYXNGYWN0b3J5OjpjcmVhdGVQbHVnaW4oCisgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLAorICAgICAgICB2b2lkKiAvKmFwcERhdGEqLywKKyAgICAgICAgQ2FzUGx1Z2luQ2FsbGJhY2tFeHQgLypjYWxsYmFjayovLAorICAgICAgICBDYXNQbHVnaW4gKipwbHVnaW4pIHsKKyAgICBpZiAoIWlzU3lzdGVtSWRTdXBwb3J0ZWQoQ0Ffc3lzdGVtX2lkKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgICpwbHVnaW4gPSBuZXcgTW9ja0Nhc1BsdWdpbigpOworICAgIHJldHVybiBPSzsKK30KKwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBib29sIE1vY2tEZXNjcmFtYmxlckZhY3Rvcnk6OmlzU3lzdGVtSWRTdXBwb3J0ZWQoaW50MzJfdCBDQV9zeXN0ZW1faWQpIGNvbnN0IHsKQEAgLTE3MCw2ICsxODMsMTYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IE1vY2tDYXNQbHVnaW46OnNlbmRTZXNzaW9uRXZlbnQoCisgICAgICAgIGNvbnN0IENhc1Nlc3Npb25JZCAmc2Vzc2lvbklkLCBpbnQzMl90IGV2ZW50LAorICAgICAgICBpbnQgLyphcmcqLywgY29uc3QgQ2FzRGF0YSYgLypldmVudERhdGEqLykgeworICAgIEFMT0dWKCJzZW5kU2Vzc2lvbkV2ZW50OiBzZXNzaW9uSWQ9JXMsIGV2ZW50PSVkIiwKKyAgICAgICAgICBhcnJheVRvU3RyaW5nKHNlc3Npb25JZCkuc3RyaW5nKCksIGV2ZW50KTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IE1vY2tDYXNQbHVnaW46OnByb3Zpc2lvbihjb25zdCBTdHJpbmc4ICZzdHIpIHsKICAgICBBTE9HVigicHJvdmlzaW9uOiBwcm92aXNpb25TdHJpbmc9JXMiLCBzdHIuc3RyaW5nKCkpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svTW9ja0Nhc1BsdWdpbi5oIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9Nb2NrQ2FzUGx1Z2luLmgKaW5kZXggODEwNjk5MC4uNzRiNTQwYyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9Nb2NrQ2FzUGx1Z2luLmgKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9Nb2NrQ2FzUGx1Z2luLmgKQEAgLTQyLDYgKzQyLDExIEBACiAgICAgICAgICAgICB2b2lkICphcHBEYXRhLAogICAgICAgICAgICAgQ2FzUGx1Z2luQ2FsbGJhY2sgY2FsbGJhY2ssCiAgICAgICAgICAgICBDYXNQbHVnaW4gKipwbHVnaW4pIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlUGx1Z2luKAorICAgICAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQsCisgICAgICAgICAgICB2b2lkICphcHBEYXRhLAorICAgICAgICAgICAgQ2FzUGx1Z2luQ2FsbGJhY2tFeHQgY2FsbGJhY2ssCisgICAgICAgICAgICBDYXNQbHVnaW4gKipwbHVnaW4pIG92ZXJyaWRlOwogfTsKIAogY2xhc3MgTW9ja0Rlc2NyYW1ibGVyRmFjdG9yeSA6IHB1YmxpYyBEZXNjcmFtYmxlckZhY3RvcnkgewpAQCAtODAsNyArODUsMTEgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNlbmRFdmVudCgKICAgICAgICAgICAgIGludDMyX3QgZXZlbnQsIGludDMyX3QgYXJnLCBjb25zdCBDYXNEYXRhICZldmVudERhdGEpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwcm92aXNpb24oY29uc3QgU3RyaW5nOCAmc3RyKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlbmRTZXNzaW9uRXZlbnQoCisgICAgICAgICAgICBjb25zdCBDYXNTZXNzaW9uSWQgJnNlc3Npb25JZCwKKyAgICAgICAgICAgIGludDMyX3QgZXZlbnQsIGludDMyX3QgYXJnLCBjb25zdCBDYXNEYXRhICZldmVudERhdGEpIG92ZXJyaWRlOworCisgICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvdmlzaW9uKGNvbnN0IFN0cmluZzggJnN0cikgb3ZlcnJpZGU7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZnJlc2hFbnRpdGxlbWVudHMoCiAgICAgICAgICAgICBpbnQzMl90IHJlZnJlc2hUeXBlLCBjb25zdCBDYXNEYXRhICZyZWZyZXNoRGF0YSkgb3ZlcnJpZGU7CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vQW5kcm9pZC5icCBiL2RybS9tZWRpYWRybS9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWYwN2YxLi4wMDAwMDAwCi0tLSBhL2RybS9tZWRpYWRybS9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc3ViZGlycyA9IFsicGx1Z2lucy8qIl0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9VdGlscy5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vVXRpbHMuY3BwCmluZGV4IDkzYzY0M2IuLmQ0OGIwYTggMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9VdGlscy5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL1V0aWxzLmNwcApAQCAtMjcsNCArMjcsMTggQEAKICAgICByZXR1cm4gbWVtY21wKCh2b2lkICopbGhzLmFycmF5KCksICh2b2lkICopcmhzLmFycmF5KCksIHJocy5zaXplKCkpIDwgMDsKIH0KIAorc3RkOjpzdHJpbmcgQnl0ZUFycmF5VG9IZXhTdHJpbmcoY29uc3QgdWludDhfdCogaW5fYnVmZmVyLCBzaXplX3QgbGVuZ3RoKSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga0hleENoYXJzW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7CisKKyAgICAvLyBFYWNoIGlucHV0IGJ5dGUgY3JlYXRlcyB0d28gb3V0cHV0IGhleCBjaGFyYWN0ZXJzLgorICAgIHN0ZDo6c3RyaW5nIG91dF9idWZmZXIobGVuZ3RoICogMiwgJ1wwJyk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICAgIGNoYXIgYnl0ZSA9IGluX2J1ZmZlcltpXTsKKyAgICAgICAgb3V0X2J1ZmZlclsoaSAqIDIpXSA9IGtIZXhDaGFyc1soYnl0ZSA+PiA0KSAmIDB4Zl07CisgICAgICAgIG91dF9idWZmZXJbKGkgKiAyKSArIDFdID0ga0hleENoYXJzW2J5dGUgJiAweGZdOworICAgIH0KKyAgICByZXR1cm4gb3V0X2J1ZmZlcjsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvVXRpbHMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL1V0aWxzLmgKaW5kZXggMjU0MzEyNC4uYWE1NzFjMCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvVXRpbHMuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9VdGlscy5oCkBAIC0xNywxNCArMTcsMTYgQEAKICNpZm5kZWYgQ0xFQVJLRVlfVVRJTFNfSF8KICNkZWZpbmUgQ0xFQVJLRVlfVVRJTFNfSF8KIAorI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAorbmFtZXNwYWNlIGFuZHJvaWQgewogLy8gQWRkIGEgY29tcGFyaXNvbiBvcGVyYXRvciBmb3IgdGhpcyBWZWN0b3Igc3BlY2lhbGl6YXRpb24gc28gdGhhdCBpdCBjYW4gYmUKIC8vIHVzZWQgYXMgYSBrZXkgaW4gYSBLZXllZFZlY3Rvci4KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQogYm9vbCBvcGVyYXRvcjwoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZsaHMsIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmcmhzKTsKIAorc3RkOjpzdHJpbmcgQnl0ZUFycmF5VG9IZXhTdHJpbmcoY29uc3QgdWludDhfdCogaW5fYnVmZmVyLCBzaXplX3QgbGVuZ3RoKTsKKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCk7CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L0FuZHJvaWQuYnAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L0FuZHJvaWQuYnAKaW5kZXggN2JhNTcwOC4uOTgwM2QzMiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9BbmRyb2lkLmJwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvQW5kcm9pZC5icApAQCAtNjEsNyArNjEsMyBAQAogICAgIH0sCiB9CiAKLS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0vLyBCdWlsZCB1bml0IHRlc3RzCi0KLXN1YmRpcnMgPSBbInRlc3RzIl0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQWVzQ3RyRGVjcnlwdG9yLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQWVzQ3RyRGVjcnlwdG9yLmNwcAppbmRleCAyZmNlMDc5MC4uMGFjODc5YyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BZXNDdHJEZWNyeXB0b3IuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQWVzQ3RyRGVjcnlwdG9yLmNwcApAQCAtMjYsNyArMjYsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdWJTYW1wbGU7CkBAIC03OSw3ICs3OSw3IEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0FuZHJvaWQuYnAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0FuZHJvaWQuYnAKaW5kZXggMzQxZDRmNi4uZTkxZTkxOCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BbmRyb2lkLmJwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQW5kcm9pZC5icApAQCAtMTQsOCArMTQsOCBAQAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAvLwogCi1jY19iaW5hcnkgewotICAgIG5hbWU6ICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEtc2VydmljZS5jbGVhcmtleSIsCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImNsZWFya2V5X3NlcnZpY2VfZGVmYXVsdHMiLAogICAgIHZlbmRvcjogdHJ1ZSwKIAogICAgIHNyY3M6IFsKQEAgLTI1LDIzICsyNSwyNCBAQAogICAgICAgICAiQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcCIsCiAgICAgICAgICJDcnlwdG9GYWN0b3J5LmNwcCIsCiAgICAgICAgICJDcnlwdG9QbHVnaW4uY3BwIiwKKyAgICAgICAgIkRldmljZUZpbGVzLmNwcCIsCiAgICAgICAgICJEcm1GYWN0b3J5LmNwcCIsCiAgICAgICAgICJEcm1QbHVnaW4uY3BwIiwKICAgICAgICAgIkluaXREYXRhUGFyc2VyLmNwcCIsCiAgICAgICAgICJKc29uV2ViS2V5LmNwcCIsCisgICAgICAgICJNZW1vcnlGaWxlU3lzdGVtLmNwcCIsCiAgICAgICAgICJTZXNzaW9uLmNwcCIsCiAgICAgICAgICJTZXNzaW9uTGlicmFyeS5jcHAiLAotICAgICAgICAic2VydmljZS5jcHAiLAogICAgIF0sCiAKICAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJodyIsCiAKICAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAotICAgIGluaXRfcmM6IFsiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xLXNlcnZpY2UuY2xlYXJrZXkucmMiXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMiIsCiAgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjcnlwdG8iLApAQCAtNDksMTEgKzUwLDEzIEBACiAgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKICAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAogICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYmNsZWFya2V5Y29tbW9uIiwKKyAgICAgICAgImxpYmNsZWFya2V5ZGV2aWNlZmlsZXMtcHJvdG9zIiwKICAgICAgICAgImxpYmpzbW4iLAogICAgIF0sCiAKQEAgLTY1LDQgKzY4LDI2IEBACiAgICAgICAgIGludGVnZXJfb3ZlcmZsb3c6IHRydWUsCiAgICAgfSwKIH0KK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGliY2xlYXJrZXlkZXZpY2VmaWxlcy1wcm90b3MiLAorICAgIHZlbmRvcjogdHJ1ZSwKIAorICAgIHByb3RvOiB7CisgICAgICAgIGV4cG9ydF9wcm90b19oZWFkZXJzOiB0cnVlLAorICAgICAgICB0eXBlOiAibGl0ZSIsCisgICAgfSwKKyAgICBzcmNzOiBbInByb3Rvcy9EZXZpY2VGaWxlcy5wcm90byJdLAorfQorY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkiLAorICAgIGRlZmF1bHRzOiBbImNsZWFya2V5X3NlcnZpY2VfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInNlcnZpY2UuY3BwIl0sCisgICAgaW5pdF9yYzogWyJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS5jbGVhcmtleS5yYyJdLAorfQorY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UtbGF6eS5jbGVhcmtleSIsCisgICAgb3ZlcnJpZGVzOiBbImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLmNsZWFya2V5Il0sCisgICAgZGVmYXVsdHM6IFsiY2xlYXJrZXlfc2VydmljZV9kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsic2VydmljZUxhenkuY3BwIl0sCisgICAgaW5pdF9yYzogWyJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS1sYXp5LmNsZWFya2V5LnJjIl0sCit9CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0Jhc2U2NC5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0Jhc2U2NC5jcHAKaW5kZXggYzJlZDc1MS4uNjU3YTQyZiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9CYXNlNjQuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQmFzZTY0LmNwcApAQCAtMjEsNyArMjEsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogc3A8QnVmZmVyPiBkZWNvZGVCYXNlNjQoY29uc3Qgc3RkOjpzdHJpbmcgJnMpIHsKQEAgLTE2OSw3ICsxNjksNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9CdWZmZXIuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9CdWZmZXIuY3BwCmluZGV4IGU1OGY1OGEuLjc1ZjgzOTUgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQnVmZmVyLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0J1ZmZlci5jcHAKQEAgLTIxLDcgKzIxLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIEJ1ZmZlcjo6QnVmZmVyKHNpemVfdCBjYXBhY2l0eSkKQEAgLTQ3LDcgKzQ3LDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcAppbmRleCAxYmE1YzZhLi4xNDEwZDc3IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuY3BwCkBAIC0yMiw3ICsyMiw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBleHRlcm4gIkMiIHsKQEAgLTM4LDcgKzM4LDcgQEAKIH0gLy8gZXh0ZXJuICJDIgogCiB9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gIC8vIG5hbWVzcGFjZSBWMV8xCit9ICAvLyBuYW1lc3BhY2UgVjFfMgogfSAgLy8gbmFtZXNwYWNlIGRybQogfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9GYWN0b3J5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3J5cHRvRmFjdG9yeS5jcHAKaW5kZXggMDg0OGNlZi4uMmE0OGRiNiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9GYWN0b3J5LmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyeXB0b0ZhY3RvcnkuY3BwCkBAIC0yNyw3ICsyNyw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBSZXR1cm48Ym9vbD4gQ3J5cHRvRmFjdG9yeTo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoCkBAIC02MCw3ICs2MCw3IEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyeXB0b1BsdWdpbi5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyeXB0b1BsdWdpbi5jcHAKaW5kZXggZjMzZjk0ZS4uMjNhMzVlNSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9QbHVnaW4uY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3J5cHRvUGx1Z2luLmNwcApAQCAtMjcsNyArMjcsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpCdWZmZXJUeXBlOwpAQCAtNDIsMTAgKzQyLDQyIEBACiAgICAgcmV0dXJuIFZvaWQoKTsKIH0KIAorUmV0dXJuPHZvaWQ+IENyeXB0b1BsdWdpbjo6ZGVjcnlwdCgKKyAgICBib29sIHNlY3VyZSwKKyAgICBjb25zdCBoaWRsX2FycmF5PHVpbnQ4X3QsIDE2PiYga2V5SWQsCisgICAgY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCAxNj4mIGl2LAorICAgIE1vZGUgbW9kZSwKKyAgICBjb25zdCBQYXR0ZXJuJiBwYXR0ZXJuLAorICAgIGNvbnN0IGhpZGxfdmVjPFN1YlNhbXBsZT4mIHN1YlNhbXBsZXMsCisgICAgY29uc3QgU2hhcmVkQnVmZmVyJiBzb3VyY2UsCisgICAgdWludDY0X3Qgb2Zmc2V0LAorICAgIGNvbnN0IERlc3RpbmF0aW9uQnVmZmVyJiBkZXN0aW5hdGlvbiwKKyAgICBkZWNyeXB0X2NiIF9oaWRsX2NiKSB7CisKKyAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6RVJST1JfRFJNX1VOS05PV047CisgIGhpZGxfc3RyaW5nIGRldGFpbGVkRXJyb3I7CisgIHVpbnQzMl90IGJ5dGVzV3JpdHRlbiA9IDA7CisKKyAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBkZWNyeXB0XzFfMigKKyAgICAgIHNlY3VyZSwga2V5SWQsIGl2LCBtb2RlLCBwYXR0ZXJuLCBzdWJTYW1wbGVzLCBzb3VyY2UsIG9mZnNldCwgZGVzdGluYXRpb24sCisgICAgICBbJl0oU3RhdHVzX1YxXzIgaFN0YXR1cywgdWludDMyX3QgaEJ5dGVzV3JpdHRlbiwgaGlkbF9zdHJpbmcgaERldGFpbGVkRXJyb3IpIHsKKyAgICAgICAgc3RhdHVzID0gdG9TdGF0dXNfMV8wKGhTdGF0dXMpOworICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICBieXRlc1dyaXR0ZW4gPSBoQnl0ZXNXcml0dGVuOworICAgICAgICAgIGRldGFpbGVkRXJyb3IgPSBoRGV0YWlsZWRFcnJvcjsKKyAgICAgICAgfQorICAgICAgfQorICAgICk7CisKKyAgc3RhdHVzID0gaFJlc3VsdC5pc09rKCkgPyBzdGF0dXMgOiBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICBfaGlkbF9jYihzdGF0dXMsIGJ5dGVzV3JpdHRlbiwgZGV0YWlsZWRFcnJvcik7CisgIHJldHVybiBWb2lkKCk7Cit9CisKIC8vIFJldHVybnMgbmVnYXRpdmUgdmFsdWVzIGZvciBlcnJvciBjb2RlIGFuZCBwb3NpdGl2ZSB2YWx1ZXMgZm9yIHRoZSBzaXplIG9mCiAvLyBkZWNyeXB0ZWQgZGF0YS4gIEluIHRoZW9yeSwgdGhlIG91dHB1dCBzaXplIGNhbiBiZSBsYXJnZXIgdGhhbiB0aGUgaW5wdXQKIC8vIHNpemUsIGJ1dCBpbiBwcmFjdGljZSB0aGlzIHdpbGwgbmV2ZXIgaGFwcGVuIGZvciBBRVMtQ1RSLgotUmV0dXJuPHZvaWQ+IENyeXB0b1BsdWdpbjo6ZGVjcnlwdCgKK1JldHVybjx2b2lkPiBDcnlwdG9QbHVnaW46OmRlY3J5cHRfMV8yKAogICAgICAgICBib29sIHNlY3VyZSwKICAgICAgICAgY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCBLRVlfSURfU0laRT4mIGtleUlkLAogICAgICAgICBjb25zdCBoaWRsX2FycmF5PHVpbnQ4X3QsIEtFWV9JVl9TSVpFPiYgaXYsCkBAIC01NSwxNyArODcsMTcgQEAKICAgICAgICAgY29uc3QgU2hhcmVkQnVmZmVyJiBzb3VyY2UsCiAgICAgICAgIHVpbnQ2NF90IG9mZnNldCwKICAgICAgICAgY29uc3QgRGVzdGluYXRpb25CdWZmZXImIGRlc3RpbmF0aW9uLAotICAgICAgICBkZWNyeXB0X2NiIF9oaWRsX2NiKSB7CisgICAgICAgIGRlY3J5cHRfMV8yX2NiIF9oaWRsX2NiKSB7CiAgICAgVU5VU0VEKHBhdHRlcm4pOwogCiAgICAgaWYgKHNlY3VyZSkgewotICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAorICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsCiAgICAgICAgICAgICAiU2VjdXJlIGRlY3J5cHRpb24gaXMgbm90IHN1cHBvcnRlZCB3aXRoIENsZWFyS2V5LiIpOwogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KIAogICAgIGlmIChtU2hhcmVkQnVmZmVyTWFwLmZpbmQoc291cmNlLmJ1ZmZlcklkKSA9PSBtU2hhcmVkQnVmZmVyTWFwLmVuZCgpKSB7Ci0gICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAorICAgICAgX2hpZGxfY2IoU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAogICAgICAgICAgICAgICAgInNvdXJjZSBkZWNyeXB0IGJ1ZmZlciBiYXNlIG5vdCBzZXQiKTsKICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQpAQCAtNzMsNyArMTA1LDcgQEAKICAgICBpZiAoZGVzdGluYXRpb24udHlwZSA9PSBCdWZmZXJUeXBlOjpTSEFSRURfTUVNT1JZKSB7CiAgICAgICBjb25zdCBTaGFyZWRCdWZmZXImIGRlc3QgPSBkZXN0aW5hdGlvbi5ub25zZWN1cmVNZW1vcnk7CiAgICAgICBpZiAobVNoYXJlZEJ1ZmZlck1hcC5maW5kKGRlc3QuYnVmZmVySWQpID09IG1TaGFyZWRCdWZmZXJNYXAuZW5kKCkpIHsKLSAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAogICAgICAgICAgICAgICAgICAiZGVzdGluYXRpb24gZGVjcnlwdCBidWZmZXIgYmFzZSBub3Qgc2V0Iik7CiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgICB9CkBAIC04MSwxMiArMTEzLDEyIEBACiAKICAgICBzcDxJTWVtb3J5PiBzb3VyY2VCYXNlID0gbVNoYXJlZEJ1ZmZlck1hcFtzb3VyY2UuYnVmZmVySWRdOwogICAgIGlmIChzb3VyY2VCYXNlID09IG51bGxwdHIpIHsKLSAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwgInNvdXJjZSBpcyBhIG51bGxwdHIiKTsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLCAic291cmNlIGlzIGEgbnVsbHB0ciIpOwogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KIAogICAgIGlmIChzb3VyY2Uub2Zmc2V0ICsgb2Zmc2V0ICsgc291cmNlLnNpemUgPiBzb3VyY2VCYXNlLT5nZXRTaXplKCkpIHsKLSAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwgImludmFsaWQgYnVmZmVyIHNpemUiKTsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLCAiaW52YWxpZCBidWZmZXIgc2l6ZSIpOwogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KIApAQCAtOTgsMTIgKzEzMCwxMiBAQAogICAgICAgICBjb25zdCBTaGFyZWRCdWZmZXImIGRlc3RCdWZmZXIgPSBkZXN0aW5hdGlvbi5ub25zZWN1cmVNZW1vcnk7CiAgICAgICAgIHNwPElNZW1vcnk+IGRlc3RCYXNlID0gbVNoYXJlZEJ1ZmZlck1hcFtkZXN0QnVmZmVyLmJ1ZmZlcklkXTsKICAgICAgICAgaWYgKGRlc3RCYXNlID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsICJkZXN0aW5hdGlvbiBpcyBhIG51bGxwdHIiKTsKKyAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwgImRlc3RpbmF0aW9uIGlzIGEgbnVsbHB0ciIpOwogICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChkZXN0QnVmZmVyLm9mZnNldCArIGRlc3RCdWZmZXIuc2l6ZSA+IGRlc3RCYXNlLT5nZXRTaXplKCkpIHsKLSAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsICJpbnZhbGlkIGJ1ZmZlciBzaXplIik7CisgICAgICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0ZSQU1FX1RPT19MQVJHRSwgMCwgImludmFsaWQgYnVmZmVyIHNpemUiKTsKICAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgICAgIH0KICAgICAgICAgZGVzdFB0ciA9IHN0YXRpY19jYXN0PHZvaWQgKj4oYmFzZSArIGRlc3RpbmF0aW9uLm5vbnNlY3VyZU1lbW9yeS5vZmZzZXQpOwpAQCAtMTI4LDcgKzE2MCw3IEBACiAKICAgICBpZiAobW9kZSA9PSBNb2RlOjpVTkVOQ1JZUFRFRCkgewogICAgICAgICBpZiAoaGF2ZUVuY3J5cHRlZFN1YnNhbXBsZXMpIHsKLSAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsCisgICAgICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsCiAgICAgICAgICAgICAgICAgICAgICJFbmNyeXB0ZWQgc3Vic2FtcGxlcyBmb3VuZCBpbiBhbGxlZ2VkbHkgdW5lbmNyeXB0ZWQgZGF0YS4iKTsKICAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgICAgIH0KQEAgLTE0NCwyMiArMTc2LDIxIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCBzdGF0aWNfY2FzdDxzc2l6ZV90PihvZmZzZXQpLCAiIik7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpPSywgc3RhdGljX2Nhc3Q8c3NpemVfdD4ob2Zmc2V0KSwgIiIpOwogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0gZWxzZSBpZiAobW9kZSA9PSBNb2RlOjpBRVNfQ1RSKSB7CiAgICAgICAgIHNpemVfdCBieXRlc0RlY3J5cHRlZDsKLSAgICAgICAgU3RhdHVzIHJlcyA9IG1TZXNzaW9uLT5kZWNyeXB0KGtleUlkLmRhdGEoKSwgaXYuZGF0YSgpLCBzcmNQdHIsCisgICAgICAgIFN0YXR1c19WMV8yIHJlcyA9IG1TZXNzaW9uLT5kZWNyeXB0KGtleUlkLmRhdGEoKSwgaXYuZGF0YSgpLCBzcmNQdHIsCiAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDhfdCo+KGRlc3RQdHIpLCB0b1ZlY3RvcihzdWJTYW1wbGVzKSwgJmJ5dGVzRGVjcnlwdGVkKTsKLSAgICAgICAgaWYgKHJlcyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCBzdGF0aWNfY2FzdDxzc2l6ZV90PihieXRlc0RlY3J5cHRlZCksICIiKTsKKyAgICAgICAgaWYgKHJlcyA9PSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpPSywgc3RhdGljX2Nhc3Q8c3NpemVfdD4oYnl0ZXNEZWNyeXB0ZWQpLCAiIik7CiAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fREVDUllQVCwgc3RhdGljX2Nhc3Q8c3NpemVfdD4ocmVzKSwKLSAgICAgICAgICAgICAgICAgICAgIkRlY3J5cHRpb24gRXJyb3IiKTsKKyAgICAgICAgICAgIF9oaWRsX2NiKHJlcywgMCwgIkRlY3J5cHRpb24gRXJyb3IiKTsKICAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAorICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsCiAgICAgICAgICAgICAgICAgIlNlbGVjdGVkIGVuY3J5cHRpb24gbW9kZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBDbGVhcktleSBEUk0gUGx1Z2luLiIpOwogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KQEAgLTE3OSw3ICsyMTAsNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9EZXZpY2VGaWxlcy5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RldmljZUZpbGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDE1YjZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9EZXZpY2VGaWxlcy5jcHAKQEAgLTAsMCArMSwyNTIgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgZmlsZSBhbmQgcHJvcHJpZXRhcnkKKy8vIHNvdXJjZSBjb2RlIG1heSBvbmx5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXaWRldmluZSBNYXN0ZXIKKy8vIExpY2Vuc2UgQWdyZWVtZW50LgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgIkRldmljZUZpbGVzLmgiCisjaW5jbHVkZSAiVXRpbHMuaCIKKworI2luY2x1ZGUgPG9wZW5zc2wvc2hhLmg+CisKKy8vIFByb3RvYnVmIGdlbmVyYXRlZCBjbGFzc2VzLgordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6Y2xlYXJrZXk6Ok9mZmxpbmVGaWxlOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6Y2xlYXJrZXk6Okhhc2hlZEZpbGU7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpjbGVhcmtleTo6TGljZW5zZTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OmNsZWFya2V5OjpMaWNlbnNlX0xpY2Vuc2VTdGF0ZV9BQ1RJVkU7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpjbGVhcmtleTo6TGljZW5zZV9MaWNlbnNlU3RhdGVfUkVMRUFTSU5HOworCituYW1lc3BhY2UgeworY29uc3QgY2hhciBrTGljZW5zZUZpbGVOYW1lRXh0W10gPSAiLmxpYyI7CisKK2Jvb2wgSGFzaChjb25zdCBzdGQ6OnN0cmluZyYgZGF0YSwgc3RkOjpzdHJpbmcqIGhhc2gpIHsKKyAgICBpZiAoIWhhc2gpIHJldHVybiBmYWxzZTsKKworICAgIGhhc2gtPnJlc2l6ZShTSEEyNTZfRElHRVNUX0xFTkdUSCk7CisKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBpbnB1dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGRhdGEuZGF0YSgpKTsKKyAgICB1bnNpZ25lZCBjaGFyKiBvdXRwdXQgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkIGNoYXIqPigmKCpoYXNoKVswXSk7CisgICAgU0hBMjU2KGlucHV0LCBkYXRhLnNpemUoKSwgb3V0cHV0KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZHJtIHsKK25hbWVzcGFjZSBWMV8yIHsKK25hbWVzcGFjZSBjbGVhcmtleSB7CisKK2Jvb2wgRGV2aWNlRmlsZXM6OlN0b3JlTGljZW5zZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleVNldElkLCBMaWNlbnNlU3RhdGUgc3RhdGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsaWNlbnNlUmVzcG9uc2UpIHsKKworICAgIE9mZmxpbmVGaWxlIGZpbGU7CisgICAgZmlsZS5zZXRfdHlwZShPZmZsaW5lRmlsZTo6TElDRU5TRSk7CisgICAgZmlsZS5zZXRfdmVyc2lvbihPZmZsaW5lRmlsZTo6VkVSU0lPTl8xKTsKKworICAgIExpY2Vuc2UqIGxpY2Vuc2UgPSBmaWxlLm11dGFibGVfbGljZW5zZSgpOworICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgY2FzZSBrTGljZW5zZVN0YXRlQWN0aXZlOgorICAgICAgICAgICAgbGljZW5zZS0+c2V0X3N0YXRlKExpY2Vuc2VfTGljZW5zZVN0YXRlX0FDVElWRSk7CisgICAgICAgICAgICBsaWNlbnNlLT5zZXRfbGljZW5zZShsaWNlbnNlUmVzcG9uc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga0xpY2Vuc2VTdGF0ZVJlbGVhc2luZzoKKyAgICAgICAgICAgIGxpY2Vuc2UtPnNldF9zdGF0ZShMaWNlbnNlX0xpY2Vuc2VTdGF0ZV9SRUxFQVNJTkcpOworICAgICAgICAgICAgbGljZW5zZS0+c2V0X2xpY2Vuc2UobGljZW5zZVJlc3BvbnNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1coIlN0b3JlTGljZW5zZTogVW5rbm93biBsaWNlbnNlIHN0YXRlOiAldSIsIHN0YXRlKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkRmlsZTsKKyAgICBmaWxlLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkRmlsZSk7CisKKyAgICByZXR1cm4gU3RvcmVGaWxlV2l0aEhhc2goa2V5U2V0SWQgKyBrTGljZW5zZUZpbGVOYW1lRXh0LCBzZXJpYWxpemVkRmlsZSk7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OlN0b3JlRmlsZVdpdGhIYXNoKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcmlhbGl6ZWRGaWxlKSB7CisgICAgc3RkOjpzdHJpbmcgaGFzaDsKKyAgICBpZiAoIUhhc2goc2VyaWFsaXplZEZpbGUsICZoYXNoKSkgeworICAgICAgICBBTE9HRSgiU3RvcmVGaWxlV2l0aEhhc2g6IEZhaWxlZCB0byBjb21wdXRlIGhhc2giKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEhhc2hlZEZpbGUgaGFzaEZpbGU7CisgICAgaGFzaEZpbGUuc2V0X2ZpbGUoc2VyaWFsaXplZEZpbGUpOworICAgIGhhc2hGaWxlLnNldF9oYXNoKGhhc2gpOworCisgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZEhhc2hGaWxlOworICAgIGhhc2hGaWxlLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkSGFzaEZpbGUpOworCisgICAgcmV0dXJuIFN0b3JlRmlsZVJhdyhmaWxlTmFtZSwgc2VyaWFsaXplZEhhc2hGaWxlKTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6U3RvcmVGaWxlUmF3KGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcmlhbGl6ZWRIYXNoRmlsZSkgeworICAgIE1lbW9yeUZpbGVTeXN0ZW06Ok1lbW9yeUZpbGUgbWVtRmlsZTsKKyAgICBtZW1GaWxlLnNldEZpbGVOYW1lKGZpbGVOYW1lKTsKKyAgICBtZW1GaWxlLnNldENvbnRlbnQoc2VyaWFsaXplZEhhc2hGaWxlKTsKKyAgICBtZW1GaWxlLnNldEZpbGVTaXplKHNlcmlhbGl6ZWRIYXNoRmlsZS5zaXplKCkpOworICAgIHNpemVfdCBsZW4gPSBtRmlsZUhhbmRsZS5Xcml0ZShmaWxlTmFtZSwgbWVtRmlsZSk7CisKKyAgICBpZiAobGVuICE9IHN0YXRpY19jYXN0PHNpemVfdD4oc2VyaWFsaXplZEhhc2hGaWxlLnNpemUoKSkpIHsKKyAgICAgICAgQUxPR0UoIlN0b3JlRmlsZVJhdzogRmFpbGVkIHRvIHdyaXRlICVzIiwgZmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgIEFMT0dEKCJTdG9yZUZpbGVSYXc6IGV4cGVjdGVkPSV6ZCwgYWN0dWFsPSV6dSIsIHNlcmlhbGl6ZWRIYXNoRmlsZS5zaXplKCksIGxlbik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBTE9HRCgiU3RvcmVGaWxlUmF3OiB3cm90ZSAlenUgYnl0ZXMgdG8gJXMiLCBzZXJpYWxpemVkSGFzaEZpbGUuc2l6ZSgpLCBmaWxlTmFtZS5jX3N0cigpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6UmV0cmlldmVMaWNlbnNlKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlTZXRJZCwgTGljZW5zZVN0YXRlKiBzdGF0ZSwgc3RkOjpzdHJpbmcqIG9mZmxpbmVMaWNlbnNlKSB7CisKKyAgICBPZmZsaW5lRmlsZSBmaWxlOworICAgIGlmICghUmV0cmlldmVIYXNoZWRGaWxlKGtleVNldElkICsga0xpY2Vuc2VGaWxlTmFtZUV4dCwgJmZpbGUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoZmlsZS50eXBlKCkgIT0gT2ZmbGluZUZpbGU6OkxJQ0VOU0UpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlTGljZW5zZTogSW52YWxpZCBmaWxlIHR5cGUiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChmaWxlLnZlcnNpb24oKSAhPSBPZmZsaW5lRmlsZTo6VkVSU0lPTl8xKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUxpY2Vuc2U6IEludmFsaWQgZmlsZSB2ZXJzaW9uIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIWZpbGUuaGFzX2xpY2Vuc2UoKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVMaWNlbnNlOiBMaWNlbnNlIG5vdCBwcmVzZW50Iik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBMaWNlbnNlIGxpY2Vuc2UgPSBmaWxlLmxpY2Vuc2UoKTsKKyAgICBzd2l0Y2ggKGxpY2Vuc2Uuc3RhdGUoKSkgeworICAgICAgICBjYXNlIExpY2Vuc2VfTGljZW5zZVN0YXRlX0FDVElWRToKKyAgICAgICAgICAgICpzdGF0ZSA9IGtMaWNlbnNlU3RhdGVBY3RpdmU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBMaWNlbnNlX0xpY2Vuc2VTdGF0ZV9SRUxFQVNJTkc6CisgICAgICAgICAgICAqc3RhdGUgPSBrTGljZW5zZVN0YXRlUmVsZWFzaW5nOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVygiUmV0cmlldmVMaWNlbnNlOiBVbnJlY29nbml6ZWQgbGljZW5zZSBzdGF0ZTogJXUiLAorICAgICAgICAgICAgICAgICAgICBrTGljZW5zZVN0YXRlVW5rbm93bik7CisgICAgICAgICAgICAqc3RhdGUgPSBrTGljZW5zZVN0YXRlVW5rbm93bjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAqb2ZmbGluZUxpY2Vuc2UgPSBsaWNlbnNlLmxpY2Vuc2UoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6RGVsZXRlTGljZW5zZShjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQpIHsKKyAgICByZXR1cm4gbUZpbGVIYW5kbGUuUmVtb3ZlRmlsZShrZXlTZXRJZCArIGtMaWNlbnNlRmlsZU5hbWVFeHQpOworfQorCitib29sIERldmljZUZpbGVzOjpEZWxldGVBbGxMaWNlbnNlcygpIHsKKyAgICByZXR1cm4gbUZpbGVIYW5kbGUuUmVtb3ZlQWxsRmlsZXMoKTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6TGljZW5zZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQpIHsKKyAgICByZXR1cm4gbUZpbGVIYW5kbGUuRmlsZUV4aXN0cyhrZXlTZXRJZCArIGtMaWNlbnNlRmlsZU5hbWVFeHQpOworfQorCitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gRGV2aWNlRmlsZXM6Okxpc3RMaWNlbnNlcygpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGljZW5zZXMgPSBtRmlsZUhhbmRsZS5MaXN0RmlsZXMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpY2Vuc2VzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nJiBsaWNlbnNlID0gbGljZW5zZXNbaV07CisgICAgICAgIGxpY2Vuc2UgPSBsaWNlbnNlLnN1YnN0cigwLCBsaWNlbnNlLnNpemUoKSAtIHN0cmxlbihrTGljZW5zZUZpbGVOYW1lRXh0KSk7CisgICAgfQorICAgIHJldHVybiBsaWNlbnNlczsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6UmV0cmlldmVIYXNoZWRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSwgT2ZmbGluZUZpbGUqIGRlU2VyaWFsaXplZEZpbGUpIHsKKyAgICBpZiAoIWRlU2VyaWFsaXplZEZpbGUpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlSGFzaGVkRmlsZTogaW52YWxpZCBmaWxlIHBhcmFtZXRlciIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFGaWxlRXhpc3RzKGZpbGVOYW1lKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiAlcyBkb2VzIG5vdCBleGlzdCIsIGZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3NpemVfdCBieXRlcyA9IEdldEZpbGVTaXplKGZpbGVOYW1lKTsKKyAgICBpZiAoYnl0ZXMgPD0gMCkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBpbnZhbGlkIGZpbGUgc2l6ZTogJXMiLCBmaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgLy8gUmVtb3ZlIHRoZSBjb3JydXB0ZWQgZmlsZSBzbyB0aGUgY2FsbGVyIHdpbGwgbm90IGdldCB0aGUgc2FtZSBlcnJvcgorICAgICAgICAvLyB3aGVuIHRyeWluZyB0byBhY2Nlc3MgdGhlIGZpbGUgcmVwZWF0ZWRseSwgY2F1c2luZyB0aGUgc3lzdGVtIHRvIHN0YWxsLgorICAgICAgICBSZW1vdmVGaWxlKGZpbGVOYW1lKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWRIYXNoRmlsZTsKKyAgICBzZXJpYWxpemVkSGFzaEZpbGUucmVzaXplKGJ5dGVzKTsKKyAgICBieXRlcyA9IG1GaWxlSGFuZGxlLlJlYWQoZmlsZU5hbWUsICZzZXJpYWxpemVkSGFzaEZpbGUpOworCisgICAgaWYgKGJ5dGVzICE9IHN0YXRpY19jYXN0PHNzaXplX3Q+KHNlcmlhbGl6ZWRIYXNoRmlsZS5zaXplKCkpKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IEZhaWxlZCB0byByZWFkIGZyb20gJXMiLCBmaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgQUxPR1YoIlJldHJpZXZlSGFzaGVkRmlsZTogZXhwZWN0ZWQ6ICV6ZCwgYWN0dWFsOiAlemQiLCBzZXJpYWxpemVkSGFzaEZpbGUuc2l6ZSgpLCBieXRlcyk7CisgICAgICAgIC8vIFJlbW92ZSB0aGUgY29ycnVwdGVkIGZpbGUgc28gdGhlIGNhbGxlciB3aWxsIG5vdCBnZXQgdGhlIHNhbWUgZXJyb3IKKyAgICAgICAgLy8gd2hlbiB0cnlpbmcgdG8gYWNjZXNzIHRoZSBmaWxlIHJlcGVhdGVkbHksIGNhdXNpbmcgdGhlIHN5c3RlbSB0byBzdGFsbC4KKyAgICAgICAgUmVtb3ZlRmlsZShmaWxlTmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBTE9HVigiUmV0cmlldmVIYXNoZWRGaWxlOiByZWFkICV6ZCBmcm9tICVzIiwgYnl0ZXMsIGZpbGVOYW1lLmNfc3RyKCkpOworCisgICAgSGFzaGVkRmlsZSBoYXNoRmlsZTsKKyAgICBpZiAoIWhhc2hGaWxlLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkSGFzaEZpbGUpKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IFVuYWJsZSB0byBwYXJzZSBoYXNoIGZpbGUiKTsKKyAgICAgICAgLy8gUmVtb3ZlIGNvcnJ1cHQgZmlsZS4KKyAgICAgICAgUmVtb3ZlRmlsZShmaWxlTmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBoYXNoOworICAgIGlmICghSGFzaChoYXNoRmlsZS5maWxlKCksICZoYXNoKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBIYXNoIGNvbXB1dGF0aW9uIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGhhc2ggIT0gaGFzaEZpbGUuaGFzaCgpKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IEhhc2ggbWlzbWF0Y2giKTsKKyAgICAgICAgLy8gUmVtb3ZlIGNvcnJ1cHQgZmlsZS4KKyAgICAgICAgUmVtb3ZlRmlsZShmaWxlTmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIWRlU2VyaWFsaXplZEZpbGUtPlBhcnNlRnJvbVN0cmluZyhoYXNoRmlsZS5maWxlKCkpKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IFVuYWJsZSB0byBwYXJzZSBmaWxlIik7CisgICAgICAgIC8vIFJlbW92ZSBjb3JydXB0IGZpbGUuCisgICAgICAgIFJlbW92ZUZpbGUoZmlsZU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OkZpbGVFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIG1GaWxlSGFuZGxlLkZpbGVFeGlzdHMoZmlsZU5hbWUpOworfQorCitib29sIERldmljZUZpbGVzOjpSZW1vdmVGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgeworICAgIHJldHVybiBtRmlsZUhhbmRsZS5SZW1vdmVGaWxlKGZpbGVOYW1lKTsKK30KKworc3NpemVfdCBEZXZpY2VGaWxlczo6R2V0RmlsZVNpemUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIG1GaWxlSGFuZGxlLkdldEZpbGVTaXplKGZpbGVOYW1lKTsKK30KKworfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKK30gLy8gbmFtZXNwYWNlIFYxXzIKK30gLy8gbmFtZXNwYWNlIGRybQorfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtRmFjdG9yeS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RybUZhY3RvcnkuY3BwCmluZGV4IDc3NTU3ZjkuLjlmYjViYmUgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtRmFjdG9yeS5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1GYWN0b3J5LmNwcApAQCAtMzAsMTAgKzMwLDExIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6U2VjdXJpdHlMZXZlbDsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7CiAKIFJldHVybjxib29sPiBEcm1GYWN0b3J5Ojppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCgKQEAgLTQxLDYgKzQyLDEzIEBACiAgICAgcmV0dXJuIGNsZWFya2V5ZHJtOjppc0NsZWFyS2V5VVVJRCh1dWlkLmRhdGEoKSk7CiB9CiAKK1JldHVybjxib29sPiBEcm1GYWN0b3J5Ojppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZF8xXzIoY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCAxNj4mIHV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nICZtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjdXJpdHlMZXZlbCBsZXZlbCkgeworICAgIHJldHVybiBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKSAmJiBpc0NvbnRlbnRUeXBlU3VwcG9ydGVkKG1pbWVUeXBlKSAmJgorICAgICAgICAgICAgbGV2ZWwgPT0gU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0NSWVBUTzsKK30KKwogUmV0dXJuPGJvb2w+IERybUZhY3Rvcnk6OmlzQ29udGVudFR5cGVTdXBwb3J0ZWQoY29uc3QgaGlkbF9zdHJpbmcgJm1pbWVUeXBlKSB7CiAgICAgLy8gVGhpcyBzaG91bGQgbWF0Y2ggdGhlIG1pbWVUeXBlcyBoYW5kZWQgYnkgSW5pdERhdGFQYXJzZXIuCiAgICAgcmV0dXJuIG1pbWVUeXBlID09IGtJc29CbWZmVmlkZW9NaW1lVHlwZSB8fApAQCAtNzEsNyArNzksNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1QbHVnaW4uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1QbHVnaW4uY3BwCmluZGV4IGQ1MWUyOWQuLmQ3NGJjNTMgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtUGx1Z2luLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RybVBsdWdpbi5jcHAKQEAgLTI1LDExICsyNSwxNSBAQAogI2luY2x1ZGUgIkNsZWFyS2V5RHJtUHJvcGVydGllcy5oIgogI2luY2x1ZGUgIlNlc3Npb24uaCIKICNpbmNsdWRlICJUeXBlQ29udmVydC5oIgorI2luY2x1ZGUgIlV0aWxzLmgiCiAKIG5hbWVzcGFjZSB7Citjb25zdCBzdGQ6OnN0cmluZyBrS2V5U2V0SWRQcmVmaXgoImNraWQiKTsKK2NvbnN0IGludCBrS2V5U2V0SWRMZW5ndGggPSAxNjsKIGNvbnN0IGludCBrU2VjdXJlU3RvcElkU3RhcnQgPSAxMDA7Citjb25zdCBzdGQ6OnN0cmluZyBrT2ZmbGluZUxpY2Vuc2UoIlwidHlwZVwiOlwicGVyc2lzdGVudC1saWNlbnNlXCIiKTsKIGNvbnN0IHN0ZDo6c3RyaW5nIGtTdHJlYW1pbmcoIlN0cmVhbWluZyIpOwotY29uc3Qgc3RkOjpzdHJpbmcga09mZmxpbmUoIk9mZmxpbmUiKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtUZW1wb3JhcnlMaWNlbnNlKCJcInR5cGVcIjpcInRlbXBvcmFyeVwiIik7CiBjb25zdCBzdGQ6OnN0cmluZyBrVHJ1ZSgiVHJ1ZSIpOwogCiBjb25zdCBzdGQ6OnN0cmluZyBrUXVlcnlLZXlMaWNlbnNlVHlwZSgiTGljZW5zZVR5cGUiKTsKQEAgLTU0LDE4ICs1OCwzMSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAorS2V5UmVxdWVzdFR5cGUgdG9LZXlSZXF1ZXN0VHlwZV9WMV8wKEtleVJlcXVlc3RUeXBlX1YxXzEga2V5UmVxdWVzdFR5cGUpIHsKKyAgc3dpdGNoIChrZXlSZXF1ZXN0VHlwZSkgeworICAgIGNhc2UgS2V5UmVxdWVzdFR5cGVfVjFfMTo6Tk9ORToKKyAgICBjYXNlIEtleVJlcXVlc3RUeXBlX1YxXzE6OlVQREFURToKKyAgICAgIHJldHVybiBLZXlSZXF1ZXN0VHlwZTo6VU5LTk9XTjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEtleVJlcXVlc3RUeXBlPihrZXlSZXF1ZXN0VHlwZSk7CisgIH0KK30KKwogRHJtUGx1Z2luOjpEcm1QbHVnaW4oU2Vzc2lvbkxpYnJhcnkqIHNlc3Npb25MaWJyYXJ5KQogICAgICAgICA6IG1TZXNzaW9uTGlicmFyeShzZXNzaW9uTGlicmFyeSksCiAgICAgICAgICAgbU9wZW5TZXNzaW9uT2tDb3VudCgwKSwKICAgICAgICAgICBtQ2xvc2VTZXNzaW9uT2tDb3VudCgwKSwKICAgICAgICAgICBtQ2xvc2VTZXNzaW9uTm90T3BlbmVkQ291bnQoMCksCi0gICAgICAgICAgbU5leHRTZWN1cmVTdG9wSWQoa1NlY3VyZVN0b3BJZFN0YXJ0KSB7CisgICAgICAgICAgbU5leHRTZWN1cmVTdG9wSWQoa1NlY3VyZVN0b3BJZFN0YXJ0KSwKKyAgICAgICAgICBtTW9ja0Vycm9yKFN0YXR1c19WMV8yOjpPSykgewogICAgIG1QbGF5UG9saWN5LmNsZWFyKCk7CiAgICAgaW5pdFByb3BlcnRpZXMoKTsKICAgICBtU2VjdXJlU3RvcHMuY2xlYXIoKTsKKyAgICBtUmVsZWFzZUtleXNNYXAuY2xlYXIoKTsKKyAgICBzdGQ6OnNyYW5kKHN0ZDo6dGltZShudWxscHRyKSk7CiB9CiAKIHZvaWQgRHJtUGx1Z2luOjppbml0UHJvcGVydGllcygpIHsKQEAgLTc1LDYgKzkyLDcgQEAKICAgICBtU3RyaW5nUHJvcGVydGllc1trUGx1Z2luRGVzY3JpcHRpb25LZXldID0ga1BsdWdpbkRlc2NyaXB0aW9uVmFsdWU7CiAgICAgbVN0cmluZ1Byb3BlcnRpZXNba0FsZ29yaXRobXNLZXldID0ga0FsZ29yaXRobXNWYWx1ZTsKICAgICBtU3RyaW5nUHJvcGVydGllc1trTGlzdGVuZXJUZXN0U3VwcG9ydEtleV0gPSBrTGlzdGVuZXJUZXN0U3VwcG9ydFZhbHVlOworICAgIG1TdHJpbmdQcm9wZXJ0aWVzW2tEcm1FcnJvclRlc3RLZXldID0ga0RybUVycm9yVGVzdFZhbHVlOwogCiAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmFsdWVWZWN0b3I7CiAgICAgdmFsdWVWZWN0b3IuY2xlYXIoKTsKQEAgLTEwMyw2ICsxMjEsNyBAQAogCiBSZXR1cm48dm9pZD4gRHJtUGx1Z2luOjpvcGVuU2Vzc2lvbihvcGVuU2Vzc2lvbl9jYiBfaGlkbF9jYikgewogICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmNyZWF0ZVNlc3Npb24oKTsKKyAgICBwcm9jZXNzTW9ja0Vycm9yKHNlc3Npb24pOwogICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZCA9IHNlc3Npb24tPnNlc3Npb25JZCgpOwogCiAgICAgU3RhdHVzIHN0YXR1cyA9IHNldFNlY3VyaXR5TGV2ZWwoc2Vzc2lvbklkLCBTZWN1cml0eUxldmVsOjpTV19TRUNVUkVfQ1JZUFRPKTsKQEAgLTExNCw2ICsxMzMsNyBAQAogUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6b3BlblNlc3Npb25fMV8xKFNlY3VyaXR5TGV2ZWwgc2VjdXJpdHlMZXZlbCwKICAgICAgICAgb3BlblNlc3Npb25fMV8xX2NiIF9oaWRsX2NiKSB7CiAgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+Y3JlYXRlU2Vzc2lvbigpOworICAgIHByb2Nlc3NNb2NrRXJyb3Ioc2Vzc2lvbik7CiAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkID0gc2Vzc2lvbi0+c2Vzc2lvbklkKCk7CiAKICAgICBTdGF0dXMgc3RhdHVzID0gc2V0U2VjdXJpdHlMZXZlbChzZXNzaW9uSWQsIHNlY3VyaXR5TGV2ZWwpOwpAQCAtMTI5LDYgKzE0OSwxMCBAQAogCiAgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24odG9WZWN0b3Ioc2Vzc2lvbklkKSk7CiAgICAgaWYgKHNlc3Npb24uZ2V0KCkpIHsKKyAgICAgICAgaWYgKHNlc3Npb24tPmdldE1vY2tFcnJvcigpICE9IFN0YXR1c19WMV8yOjpPSykgeworICAgICAgICAgICAgc2VuZFNlc3Npb25Mb3N0U3RhdGUoc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9JTlZBTElEX1NUQVRFOworICAgICAgICB9CiAgICAgICAgIG1DbG9zZVNlc3Npb25Pa0NvdW50Kys7CiAgICAgICAgIG1TZXNzaW9uTGlicmFyeS0+ZGVzdHJveVNlc3Npb24oc2Vzc2lvbik7CiAgICAgICAgIHJldHVybiBTdGF0dXM6Ok9LOwpAQCAtMTM3LDM1ICsxNjEsNzUgQEAKICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOwogfQogCi1TdGF0dXMgRHJtUGx1Z2luOjpnZXRLZXlSZXF1ZXN0Q29tbW9uKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzY29wZSwKK1N0YXR1c19WMV8yIERybVBsdWdpbjo6Z2V0S2V5UmVxdWVzdENvbW1vbihjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBpbml0RGF0YSwKICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG1pbWVUeXBlLAogICAgICAgICBLZXlUeXBlIGtleVR5cGUsCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVZhbHVlPiYgb3B0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcmVxdWVzdCwKLSAgICAgICAgS2V5UmVxdWVzdFR5cGUgKmtleVJlcXVlc3RUeXBlLAorICAgICAgICBLZXlSZXF1ZXN0VHlwZV9WMV8xICprZXlSZXF1ZXN0VHlwZSwKICAgICAgICAgc3RkOjpzdHJpbmcgKmRlZmF1bHRVcmwpIHsKICAgICAgICAgVU5VU0VEKG9wdGlvbmFsUGFyYW1ldGVycyk7CiAKKyAgICAvLyBHZXRLZXlSZXF1ZXN0T2ZmbGluZUtleVR5cGVOb3RTdXBwb3J0ZWQoKSBpbiB2dHMgMS4wIGFuZCAxLjEgZXhwZWN0cworICAgIC8vIEtleVR5cGU6Ok9GRkxJTkUgdG8gcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFIGluIGNsZWFya2V5IHBsdWdpbi4KKyAgICAvLyBUaG9zZSB0ZXN0cyBwYXNzIGluIGFuIGVtcHR5IGluaXREYXRhLCB3ZSB1c2UgdGhlIGVtcHR5IGluaXREYXRhIHRvCisgICAgLy8gc2lnbmFsIHN1Y2ggc3BlY2lmaWMgdXNlIGNhc2UuCisgICAgaWYgKGtleVR5cGUgPT0gS2V5VHlwZTo6T0ZGTElORSAmJiAwID09IGluaXREYXRhLnNpemUoKSkgeworICAgICAgICByZXR1cm4gU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KKwogICAgICpkZWZhdWx0VXJsID0gIiI7Ci0gICAgKmtleVJlcXVlc3RUeXBlID0gS2V5UmVxdWVzdFR5cGU6OlVOS05PV047CisgICAgKmtleVJlcXVlc3RUeXBlID0gS2V5UmVxdWVzdFR5cGVfVjFfMTo6VU5LTk9XTjsKICAgICAqcmVxdWVzdCA9IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KCk7CiAKLSAgICBpZiAoc2NvcGUuc2l6ZSgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgIGlmIChzY29wZS5zaXplKCkgPT0gMCB8fAorICAgICAgICAgICAgKGtleVR5cGUgIT0gS2V5VHlwZTo6U1RSRUFNSU5HICYmCisgICAgICAgICAgICBrZXlUeXBlICE9IEtleVR5cGU6Ok9GRkxJTkUgJiYKKyAgICAgICAgICAgIGtleVR5cGUgIT0gS2V5VHlwZTo6UkVMRUFTRSkpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1c19WMV8yOjpCQURfVkFMVUU7CiAgICAgfQogCi0gICAgaWYgKGtleVR5cGUgIT0gS2V5VHlwZTo6U1RSRUFNSU5HKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNjb3BlSWQgPSB0b1ZlY3RvcihzY29wZSk7CisgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbjsKKyAgICBpZiAoa2V5VHlwZSA9PSBLZXlUeXBlOjpTVFJFQU1JTkcgfHwga2V5VHlwZSA9PSBLZXlUeXBlOjpPRkZMSU5FKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZChzY29wZUlkLmJlZ2luKCksIHNjb3BlSWQuZW5kKCkpOworICAgICAgICBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbihzZXNzaW9uSWQpOworICAgICAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKKyAgICAgICAgfSBlbHNlIGlmIChzZXNzaW9uLT5nZXRNb2NrRXJyb3IoKSAhPSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgICAgIHJldHVybiBzZXNzaW9uLT5nZXRNb2NrRXJyb3IoKTsKKyAgICAgICAgfQorCisgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlX1YxXzE6OklOSVRJQUw7CiAgICAgfQogCi0gICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24odG9WZWN0b3Ioc2NvcGUpKTsKLSAgICBpZiAoIXNlc3Npb24uZ2V0KCkpIHsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKLSAgICB9CisgICAgU3RhdHVzX1YxXzIgc3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzX1YxXzI+KAorICAgICAgICAgICAgc2Vzc2lvbi0+Z2V0S2V5UmVxdWVzdChpbml0RGF0YSwgbWltZVR5cGUsIGtleVR5cGUsIHJlcXVlc3QpKTsKIAotICAgIFN0YXR1cyBzdGF0dXMgPSBzZXNzaW9uLT5nZXRLZXlSZXF1ZXN0KGluaXREYXRhLCBtaW1lVHlwZSwgcmVxdWVzdCk7Ci0gICAgKmtleVJlcXVlc3RUeXBlID0gS2V5UmVxdWVzdFR5cGU6OklOSVRJQUw7CisgICAgaWYgKGtleVR5cGUgPT0gS2V5VHlwZTo6UkVMRUFTRSkgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlTZXRJZChzY29wZUlkLmJlZ2luKCksIHNjb3BlSWQuZW5kKCkpOworICAgICAgICBzdGQ6OnN0cmluZyByZXF1ZXN0U3RyaW5nKHJlcXVlc3QtPmJlZ2luKCksIHJlcXVlc3QtPmVuZCgpKTsKKyAgICAgICAgaWYgKHJlcXVlc3RTdHJpbmcuZmluZChrT2ZmbGluZUxpY2Vuc2UpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBlbXB0eVJlc3BvbnNlOworICAgICAgICAgICAgc3RkOjpzdHJpbmcga2V5U2V0SWRTdHJpbmcoa2V5U2V0SWQuYmVnaW4oKSwga2V5U2V0SWQuZW5kKCkpOworICAgICAgICAgICAgaWYgKCFtRmlsZUhhbmRsZS5TdG9yZUxpY2Vuc2Uoa2V5U2V0SWRTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgIERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlUmVsZWFzaW5nLAorICAgICAgICAgICAgICAgICAgICBlbXB0eVJlc3BvbnNlKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJQcm9ibGVtIHJlbGVhc2luZyBvZmZsaW5lIGxpY2Vuc2UiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9VTktOT1dOOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1SZWxlYXNlS2V5c01hcC5maW5kKGtleVNldElkU3RyaW5nKSA9PSBtUmVsZWFzZUtleXNNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5jcmVhdGVTZXNzaW9uKCk7CisgICAgICAgICAgICAgICAgbVJlbGVhc2VLZXlzTWFwW2tleVNldElkU3RyaW5nXSA9IHNlc3Npb24tPnNlc3Npb25JZCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgia2V5IGlzIGluIHVzZSwgaWdub3JlIHJlbGVhc2UgcmVxdWVzdCIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIk9mZmxpbmUgbGljZW5zZSBub3QgZm91bmQsIG5vdGhpbmcgdG8gcmVsZWFzZSIpOworICAgICAgICB9CisgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlX1YxXzE6OlJFTEVBU0U7CisgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE3OCwxNSArMjQyLDE1IEBACiAgICAgICAgIGdldEtleVJlcXVlc3RfY2IgX2hpZGxfY2IpIHsKICAgICBVTlVTRUQob3B0aW9uYWxQYXJhbWV0ZXJzKTsKIAotICAgIEtleVJlcXVlc3RUeXBlIGtleVJlcXVlc3RUeXBlID0gS2V5UmVxdWVzdFR5cGU6OlVOS05PV047CisgICAgS2V5UmVxdWVzdFR5cGVfVjFfMSBrZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlX1YxXzE6OlVOS05PV047CiAgICAgc3RkOjpzdHJpbmcgZGVmYXVsdFVybCgiIik7CiAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVxdWVzdDsKLSAgICBTdGF0dXMgc3RhdHVzID0gZ2V0S2V5UmVxdWVzdENvbW1vbigKKyAgICBTdGF0dXNfVjFfMiBzdGF0dXMgPSBnZXRLZXlSZXF1ZXN0Q29tbW9uKAogICAgICAgICAgICAgc2NvcGUsIGluaXREYXRhLCBtaW1lVHlwZSwga2V5VHlwZSwgb3B0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgICAgICAgJnJlcXVlc3QsICZrZXlSZXF1ZXN0VHlwZSwgJmRlZmF1bHRVcmwpOwogCi0gICAgX2hpZGxfY2Ioc3RhdHVzLCB0b0hpZGxWZWMocmVxdWVzdCksCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxkcm06OlYxXzA6OktleVJlcXVlc3RUeXBlPihrZXlSZXF1ZXN0VHlwZSksCisgICAgX2hpZGxfY2IodG9TdGF0dXNfMV8wKHN0YXR1cyksIHRvSGlkbFZlYyhyZXF1ZXN0KSwKKyAgICAgICAgICAgIHRvS2V5UmVxdWVzdFR5cGVfVjFfMChrZXlSZXF1ZXN0VHlwZSksCiAgICAgICAgICAgICBoaWRsX3N0cmluZyhkZWZhdWx0VXJsKSk7CiAgICAgcmV0dXJuIFZvaWQoKTsKIH0KQEAgLTIwMCwxMCArMjY0LDMxIEBACiAgICAgICAgIGdldEtleVJlcXVlc3RfMV8xX2NiIF9oaWRsX2NiKSB7CiAgICAgVU5VU0VEKG9wdGlvbmFsUGFyYW1ldGVycyk7CiAKLSAgICBLZXlSZXF1ZXN0VHlwZSBrZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlOjpVTktOT1dOOworICAgIEtleVJlcXVlc3RUeXBlX1YxXzEga2V5UmVxdWVzdFR5cGUgPSBLZXlSZXF1ZXN0VHlwZV9WMV8xOjpVTktOT1dOOwogICAgIHN0ZDo6c3RyaW5nIGRlZmF1bHRVcmwoIiIpOwogICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlcXVlc3Q7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IGdldEtleVJlcXVlc3RDb21tb24oCisgICAgU3RhdHVzX1YxXzIgc3RhdHVzID0gZ2V0S2V5UmVxdWVzdENvbW1vbigKKyAgICAgICAgICAgIHNjb3BlLCBpbml0RGF0YSwgbWltZVR5cGUsIGtleVR5cGUsIG9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgICAgICZyZXF1ZXN0LCAma2V5UmVxdWVzdFR5cGUsICZkZWZhdWx0VXJsKTsKKworICAgIF9oaWRsX2NiKHRvU3RhdHVzXzFfMChzdGF0dXMpLCB0b0hpZGxWZWMocmVxdWVzdCksCisgICAgICAgICAgICBrZXlSZXF1ZXN0VHlwZSwgaGlkbF9zdHJpbmcoZGVmYXVsdFVybCkpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBEcm1QbHVnaW46OmdldEtleVJlcXVlc3RfMV8yKAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBpbml0RGF0YSwKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICBLZXlUeXBlIGtleVR5cGUsCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVZhbHVlPiYgb3B0aW9uYWxQYXJhbWV0ZXJzLAorICAgICAgICBnZXRLZXlSZXF1ZXN0XzFfMl9jYiBfaGlkbF9jYikgeworICAgIFVOVVNFRChvcHRpb25hbFBhcmFtZXRlcnMpOworCisgICAgS2V5UmVxdWVzdFR5cGVfVjFfMSBrZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlX1YxXzE6OlVOS05PV047CisgICAgc3RkOjpzdHJpbmcgZGVmYXVsdFVybCgiIik7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcmVxdWVzdDsKKyAgICBTdGF0dXNfVjFfMiBzdGF0dXMgPSBnZXRLZXlSZXF1ZXN0Q29tbW9uKAogICAgICAgICAgICAgc2NvcGUsIGluaXREYXRhLCBtaW1lVHlwZSwga2V5VHlwZSwgb3B0aW9uYWxQYXJhbWV0ZXJzLAogICAgICAgICAgICAgJnJlcXVlc3QsICZrZXlSZXF1ZXN0VHlwZSwgJmRlZmF1bHRVcmwpOwogCkBAIC0yMjcsNiArMzEyLDMwIEBACiAgICAgbVBsYXlQb2xpY3kucHVzaF9iYWNrKHBvbGljeSk7CiB9CiAKK2Jvb2wgRHJtUGx1Z2luOjptYWtlS2V5U2V0SWQoc3RkOjpzdHJpbmcqIGtleVNldElkKSB7CisgICAgaWYgKCFrZXlTZXRJZCkgeworICAgICAgICBBTE9HRSgia2V5U2V0SWQgZGVzdGluYXRpb24gbm90IHByb3ZpZGVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga3NpZChrS2V5U2V0SWRQcmVmaXguYmVnaW4oKSwga0tleVNldElkUHJlZml4LmVuZCgpKTsKKyAgICBrc2lkLnJlc2l6ZShrS2V5U2V0SWRMZW5ndGgpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJhbmRvbURhdGEoKGtLZXlTZXRJZExlbmd0aCAtIGtLZXlTZXRJZFByZWZpeC5zaXplKCkpIC8gMiwgMCk7CisKKyAgICB3aGlsZSAoa2V5U2V0SWQtPmVtcHR5KCkpIHsKKyAgICAgICAgZm9yIChhdXRvIGl0ciA9IHJhbmRvbURhdGEuYmVnaW4oKTsgaXRyICE9IHJhbmRvbURhdGEuZW5kKCk7ICsraXRyKSB7CisgICAgICAgICAgICAqaXRyID0gc3RkOjpyYW5kKCkgJSAweGZmOworICAgICAgICB9CisgICAgICAgICprZXlTZXRJZCA9IGtLZXlTZXRJZFByZWZpeCArIEJ5dGVBcnJheVRvSGV4U3RyaW5nKAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHJhbmRvbURhdGEuZGF0YSgpKSwgcmFuZG9tRGF0YS5zaXplKCkpOworICAgICAgICBpZiAobUZpbGVIYW5kbGUuTGljZW5zZUV4aXN0cygqa2V5U2V0SWQpKSB7CisgICAgICAgICAgICAvLyBjb2xsaXNpb24sIHJlZ2VuZXJhdGUKKyAgICAgICAgICAgIEFMT0dWKCJSZXRyeSBnZW5lcmF0aW5nIEtleVNldElkIik7CisgICAgICAgICAgICBrZXlTZXRJZC0+Y2xlYXIoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6cHJvdmlkZUtleVJlc3BvbnNlKAogICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiByZXNwb25zZSwKQEAgLTIzNywyOCArMzQ2LDEyNCBAQAogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KIAotICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHRvVmVjdG9yKHNjb3BlKSk7CisgICAgc3RkOjpzdHJpbmcgcmVzcG9uc2VTdHJpbmcoCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihyZXNwb25zZS5kYXRhKCkpLCByZXNwb25zZS5zaXplKCkpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNjb3BlSWQgPSB0b1ZlY3RvcihzY29wZSk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc2Vzc2lvbklkOworICAgIHN0ZDo6c3RyaW5nIGtleVNldElkOworCisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7CisgICAgYm9vbCBpc09mZmxpbmVMaWNlbnNlID0gcmVzcG9uc2VTdHJpbmcuZmluZChrT2ZmbGluZUxpY2Vuc2UpICE9IHN0ZDo6c3RyaW5nOjpucG9zOworICAgIGJvb2wgaXNSZWxlYXNlID0gKG1lbWNtcChzY29wZUlkLmRhdGEoKSwga0tleVNldElkUHJlZml4LmRhdGEoKSwga0tleVNldElkUHJlZml4LnNpemUoKSkgPT0gMCk7CisgICAgaWYgKGlzUmVsZWFzZSkgeworICAgICAgICBrZXlTZXRJZC5hc3NpZ24oc2NvcGVJZC5iZWdpbigpLCBzY29wZUlkLmVuZCgpKTsKKworICAgICAgICBhdXRvIGl0ZXIgPSBtUmVsZWFzZUtleXNNYXAuZmluZChzdGQ6OnN0cmluZyhrZXlTZXRJZC5iZWdpbigpLCBrZXlTZXRJZC5lbmQoKSkpOworICAgICAgICBpZiAoaXRlciAhPSBtUmVsZWFzZUtleXNNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgIHNlc3Npb25JZC5hc3NpZ24oaXRlci0+c2Vjb25kLmJlZ2luKCksIGl0ZXItPnNlY29uZC5lbmQoKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzZXNzaW9uSWQuYXNzaWduKHNjb3BlSWQuYmVnaW4oKSwgc2NvcGVJZC5lbmQoKSk7CisgICAgICAgIC8vIG5vbiBvZmZsaW5lIGxpY2Vuc2UgcmV0dXJucyBlbXB0eSBrZXlTZXRJZAorICAgICAgICBrZXlTZXRJZC5jbGVhcigpOworICAgIH0KKworICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHNlc3Npb25JZCk7CiAgICAgaWYgKCFzZXNzaW9uLmdldCgpKSB7CiAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRCwgaGlkbF92ZWM8dWludDhfdD4oKSk7CiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQotCiAgICAgc2V0UGxheVBvbGljeSgpOwotICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGtleVNldElkOwotICAgIFN0YXR1cyBzdGF0dXMgPSBzZXNzaW9uLT5wcm92aWRlS2V5UmVzcG9uc2UocmVzcG9uc2UpOworCisgICAgc3RhdHVzID0gc2Vzc2lvbi0+cHJvdmlkZUtleVJlc3BvbnNlKHJlc3BvbnNlKTsKICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgLy8gVGhpcyBpcyBmb3IgdGVzdGluZyBBTWVkaWFEcm1fc2V0T25FdmVudExpc3RlbmVyIG9ubHkuCi0gICAgICAgIHNlbmRFdmVudChFdmVudFR5cGU6OlZFTkRPUl9ERUZJTkVELCAwLCBzY29wZSk7Ci0gICAgICAgIGtleVNldElkLmNsZWFyKCk7CisgICAgICAgIGlmIChpc09mZmxpbmVMaWNlbnNlKSB7CisgICAgICAgICAgICBpZiAoaXNSZWxlYXNlKSB7CisgICAgICAgICAgICAgICAgbUZpbGVIYW5kbGUuRGVsZXRlTGljZW5zZShrZXlTZXRJZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghbWFrZUtleVNldElkKCZrZXlTZXRJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fVU5LTk9XTiwgaGlkbF92ZWM8dWludDhfdD4oKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYm9vbCBvayA9IG1GaWxlSGFuZGxlLlN0b3JlTGljZW5zZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGtleVNldElkLAorICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlRmlsZXM6OmtMaWNlbnNlU3RhdGVBY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhyZXNwb25zZS5iZWdpbigpLCByZXNwb25zZS5lbmQoKSkpOworICAgICAgICAgICAgICAgIGlmICghb2spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzdG9yZSBvZmZsaW5lIGxpY2Vuc2UiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUZXN0IGNhbGxpbmcgQU1lZGlhRHJtIGxpc3RlbmVycy4KKyAgICAgICAgc2VuZEV2ZW50KEV2ZW50VHlwZTo6VkVORE9SX0RFRklORUQsIHNlc3Npb25JZCwgc2Vzc2lvbklkKTsKKworICAgICAgICBzZW5kRXhwaXJhdGlvblVwZGF0ZShzZXNzaW9uSWQsIDEwMCk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8S2V5U3RhdHVzX1YxXzI+IGtleXNTdGF0dXM7CisgICAgICAgIEtleVN0YXR1c19WMV8yIGtleVN0YXR1czsKKworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlJZDEgPSB7IDB4QSwgMHhCLCAweEMgfTsKKyAgICAgICAga2V5U3RhdHVzLmtleUlkID0ga2V5SWQxOworICAgICAgICBrZXlTdGF0dXMudHlwZSA9IFYxXzI6OktleVN0YXR1c1R5cGU6OlVTQUJMRTsKKyAgICAgICAga2V5c1N0YXR1cy5wdXNoX2JhY2soa2V5U3RhdHVzKTsKKworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlJZDIgPSB7IDB4RCwgMHhFLCAweEYgfTsKKyAgICAgICAga2V5U3RhdHVzLmtleUlkID0ga2V5SWQyOworICAgICAgICBrZXlTdGF0dXMudHlwZSA9IFYxXzI6OktleVN0YXR1c1R5cGU6OkVYUElSRUQ7CisgICAgICAgIGtleXNTdGF0dXMucHVzaF9iYWNrKGtleVN0YXR1cyk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5SWQzID0geyAweDAsIDB4MSwgMHgyIH07CisgICAgICAgIGtleVN0YXR1cy5rZXlJZCA9IGtleUlkMzsKKyAgICAgICAga2V5U3RhdHVzLnR5cGUgPSBWMV8yOjpLZXlTdGF0dXNUeXBlOjpVU0FCTEVJTkZVVFVSRTsKKyAgICAgICAga2V5c1N0YXR1cy5wdXNoX2JhY2soa2V5U3RhdHVzKTsKKworICAgICAgICBzZW5kS2V5c0NoYW5nZV8xXzIoc2Vzc2lvbklkLCBrZXlzU3RhdHVzLCB0cnVlKTsKKworICAgICAgICBpbnN0YWxsU2VjdXJlU3RvcChzZXNzaW9uSWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJwcm92aWRlS2V5UmVzcG9uc2UgcmV0dXJucyBlcnJvcj0lZCIsIHN0YXR1cyk7CiAgICAgfQogCi0gICAgaW5zdGFsbFNlY3VyZVN0b3Aoc2NvcGUpOwotCi0gICAgLy8gUmV0dXJucyBzdGF0dXMgYW5kIGVtcHR5IGtleVNldElkCi0gICAgX2hpZGxfY2Ioc3RhdHVzLCB0b0hpZGxWZWMoa2V5U2V0SWQpKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlTZXRJZFZlYyhrZXlTZXRJZC5iZWdpbigpLCBrZXlTZXRJZC5lbmQoKSk7CisgICAgX2hpZGxfY2Ioc3RhdHVzLCB0b0hpZGxWZWMoa2V5U2V0SWRWZWMpKTsKICAgICByZXR1cm4gVm9pZCgpOwogfQogCitSZXR1cm48U3RhdHVzPiBEcm1QbHVnaW46OnJlc3RvcmVLZXlzKAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYga2V5U2V0SWQpIHsKKyAgICAgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCB8fCBrZXlTZXRJZC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgRGV2aWNlRmlsZXM6OkxpY2Vuc2VTdGF0ZSBsaWNlbnNlU3RhdGU7CisgICAgICAgIHN0ZDo6c3RyaW5nIG9mZmxpbmVMaWNlbnNlOworICAgICAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICAgICAgaWYgKCFtRmlsZUhhbmRsZS5SZXRyaWV2ZUxpY2Vuc2Uoc3RkOjpzdHJpbmcoa2V5U2V0SWQuYmVnaW4oKSwga2V5U2V0SWQuZW5kKCkpLAorICAgICAgICAgICAgICAgICZsaWNlbnNlU3RhdGUsICZvZmZsaW5lTGljZW5zZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVzdG9yZSBvZmZsaW5lIGxpY2Vuc2UiKTsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9OT19MSUNFTlNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlVW5rbm93biA9PSBsaWNlbnNlU3RhdGUgfHwKKyAgICAgICAgICAgICAgICBEZXZpY2VGaWxlczo6a0xpY2Vuc2VTdGF0ZVJlbGVhc2luZyA9PSBsaWNlbnNlU3RhdGUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGxpY2Vuc2Ugc3RhdGU9JWQiLCBsaWNlbnNlU3RhdGUpOworICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX05PX0xJQ0VOU0U7CisgICAgICAgIH0KKworICAgICAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbih0b1ZlY3RvcihzZXNzaW9uSWQpKTsKKyAgICAgICAgaWYgKCFzZXNzaW9uLmdldCgpKSB7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHNlc3Npb24tPnByb3ZpZGVLZXlSZXNwb25zZShzdGQ6OnZlY3Rvcjx1aW50OF90PihvZmZsaW5lTGljZW5zZS5iZWdpbigpLAorICAgICAgICAgICAgICAgIG9mZmxpbmVMaWNlbnNlLmVuZCgpKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZXN0b3JlIGtleXMiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworfQorCiBSZXR1cm48dm9pZD4gRHJtUGx1Z2luOjpnZXRQcm9wZXJ0eVN0cmluZygKICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIHByb3BlcnR5TmFtZSwgZ2V0UHJvcGVydHlTdHJpbmdfY2IgX2hpZGxfY2IpIHsKICAgICBzdGQ6OnN0cmluZyBuYW1lKHByb3BlcnR5TmFtZS5jX3N0cigpKTsKQEAgLTI3NCw2ICs0NzksOCBAQAogICAgICAgICB2YWx1ZSA9IG1TdHJpbmdQcm9wZXJ0aWVzW2tBbGdvcml0aG1zS2V5XTsKICAgICB9IGVsc2UgaWYgKG5hbWUgPT0ga0xpc3RlbmVyVGVzdFN1cHBvcnRLZXkpIHsKICAgICAgICAgdmFsdWUgPSBtU3RyaW5nUHJvcGVydGllc1trTGlzdGVuZXJUZXN0U3VwcG9ydEtleV07CisgICAgfSBlbHNlIGlmIChuYW1lID09IGtEcm1FcnJvclRlc3RLZXkpIHsKKyAgICAgICAgdmFsdWUgPSBtU3RyaW5nUHJvcGVydGllc1trRHJtRXJyb3JUZXN0S2V5XTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HRSgiQXBwIHJlcXVlc3RlZCB1bmtub3duIHN0cmluZyBwcm9wZXJ0eSAlcyIsIG5hbWUuY19zdHIoKSk7CiAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsICIiKTsKQEAgLTMxOCw2ICs1MjUsMjAgQEAKICAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOwogICAgIH0KIAorICAgIGlmIChuYW1lID09IGtEcm1FcnJvclRlc3RLZXkpIHsKKyAgICAgICAgaWYgKHZhbHVlID09IGtSZXNvdXJjZUNvbnRlbnRpb25WYWx1ZSkgeworICAgICAgICAgICAgbU1vY2tFcnJvciA9IFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fUkVTT1VSQ0VfQ09OVEVOVElPTjsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBrTG9zdFN0YXRlVmFsdWUpIHsKKyAgICAgICAgICAgIG1Nb2NrRXJyb3IgPSBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX1NFU1NJT05fTE9TVF9TVEFURTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBrRnJhbWVUb29MYXJnZVZhbHVlKSB7CisgICAgICAgICAgICBtTW9ja0Vycm9yID0gU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0U7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0ga0ludmFsaWRTdGF0ZVZhbHVlKSAgeworICAgICAgICAgICAgbU1vY2tFcnJvciA9IFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fSU5WQUxJRF9TVEFURTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Nb2NrRXJyb3IgPSBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX1VOS05PV047CisgICAgICAgIH0KKyAgICB9CisKICAgICBtU3RyaW5nUHJvcGVydGllc1trZXldID0gc3RkOjpzdHJpbmcodmFsdWUuY19zdHIoKSk7CiAgICAgcmV0dXJuIFN0YXR1czo6T0s7CiB9CkBAIC0zMjgsNiArNTQ5LDkgQEAKICAgIGlmIChuYW1lID09IGtEZXZpY2VJZEtleSkgewogICAgICAgQUxPR0QoIkNhbm5vdCBzZXQgaW1tdXRhYmxlIHByb3BlcnR5OiAlcyIsIG5hbWUuY19zdHIoKSk7CiAgICAgICByZXR1cm4gU3RhdHVzOjpCQURfVkFMVUU7CisgICB9IGVsc2UgaWYgKG5hbWUgPT0ga0NsaWVudElkS2V5KSB7CisgICAgICAgbUJ5dGVBcnJheVByb3BlcnRpZXNba0NsaWVudElkS2V5XSA9IHRvVmVjdG9yKHZhbHVlKTsKKyAgICAgICByZXR1cm4gU3RhdHVzOjpPSzsKICAgIH0KIAogICAgLy8gU2V0dGluZyBvZiB1bmRlZmluZWQgcHJvcGVydGllcyBpcyBub3Qgc3VwcG9ydGVkCkBAIC00NjUsNiArNjg5LDYwIEBACiAgICAgcmV0dXJuIFZvaWQoKTsKIH0KIAorUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6Z2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoZ2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHNfY2IgX2hpZGxfY2IpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGljZW5zZU5hbWVzID0gbUZpbGVIYW5kbGUuTGlzdExpY2Vuc2VzKCk7CisgICAgc3RkOjp2ZWN0b3I8S2V5U2V0SWQ+IGtleVNldElkczsKKyAgICBpZiAobU1vY2tFcnJvciAhPSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgX2hpZGxfY2IodG9TdGF0dXNfMV8wKG1Nb2NrRXJyb3IpLCBrZXlTZXRJZHMpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIG5hbWUgOiBsaWNlbnNlTmFtZXMpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5U2V0SWQobmFtZS5iZWdpbigpLCBuYW1lLmVuZCgpKTsKKyAgICAgICAga2V5U2V0SWRzLnB1c2hfYmFjayhrZXlTZXRJZCk7CisgICAgfQorICAgIF9oaWRsX2NiKFN0YXR1czo6T0ssIGtleVNldElkcyk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworCitSZXR1cm48U3RhdHVzPiBEcm1QbHVnaW46OnJlbW92ZU9mZmxpbmVMaWNlbnNlKGNvbnN0IEtleVNldElkJiBrZXlTZXRJZCkgeworICAgIGlmIChtTW9ja0Vycm9yICE9IFN0YXR1c19WMV8yOjpPSykgeworICAgICAgICByZXR1cm4gdG9TdGF0dXNfMV8wKG1Nb2NrRXJyb3IpOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBsaWNlbnNlTmFtZShrZXlTZXRJZC5iZWdpbigpLCBrZXlTZXRJZC5lbmQoKSk7CisgICAgaWYgKG1GaWxlSGFuZGxlLkRlbGV0ZUxpY2Vuc2UobGljZW5zZU5hbWUpKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6Ok9LOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpCQURfVkFMVUU7Cit9CisKK1JldHVybjx2b2lkPiBEcm1QbHVnaW46OmdldE9mZmxpbmVMaWNlbnNlU3RhdGUoY29uc3QgS2V5U2V0SWQmIGtleVNldElkLAorICAgICAgICBnZXRPZmZsaW5lTGljZW5zZVN0YXRlX2NiIF9oaWRsX2NiKSB7CisgICAgc3RkOjpzdHJpbmcgbGljZW5zZU5hbWUoa2V5U2V0SWQuYmVnaW4oKSwga2V5U2V0SWQuZW5kKCkpOworICAgIERldmljZUZpbGVzOjpMaWNlbnNlU3RhdGUgc3RhdGU7CisgICAgc3RkOjpzdHJpbmcgbGljZW5zZTsKKyAgICBPZmZsaW5lTGljZW5zZVN0YXRlIGhMaWNlbnNlU3RhdGU7CisgICAgaWYgKG1Nb2NrRXJyb3IgIT0gU3RhdHVzX1YxXzI6Ok9LKSB7CisgICAgICAgIF9oaWRsX2NiKHRvU3RhdHVzXzFfMChtTW9ja0Vycm9yKSwgT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6VU5LTk9XTik7CisgICAgfSBlbHNlIGlmIChtRmlsZUhhbmRsZS5SZXRyaWV2ZUxpY2Vuc2UobGljZW5zZU5hbWUsICZzdGF0ZSwgJmxpY2Vuc2UpKSB7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgY2FzZSBEZXZpY2VGaWxlczo6a0xpY2Vuc2VTdGF0ZUFjdGl2ZToKKyAgICAgICAgICAgIGhMaWNlbnNlU3RhdGUgPSBPZmZsaW5lTGljZW5zZVN0YXRlOjpVU0FCTEU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEZXZpY2VGaWxlczo6a0xpY2Vuc2VTdGF0ZVJlbGVhc2luZzoKKyAgICAgICAgICAgIGhMaWNlbnNlU3RhdGUgPSBPZmZsaW5lTGljZW5zZVN0YXRlOjpJTkFDVElWRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlVW5rbm93bjoKKyAgICAgICAgICAgIGhMaWNlbnNlU3RhdGUgPSBPZmZsaW5lTGljZW5zZVN0YXRlOjpVTktOT1dOOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywgaExpY2Vuc2VTdGF0ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpCQURfVkFMVUUsIE9mZmxpbmVMaWNlbnNlU3RhdGU6OlVOS05PV04pOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCiBSZXR1cm48dm9pZD4gRHJtUGx1Z2luOjpnZXRTZWN1cmVTdG9wcyhnZXRTZWN1cmVTdG9wc19jYiBfaGlkbF9jYikgewogICAgIHN0ZDo6dmVjdG9yPFNlY3VyZVN0b3A+IHN0b3BzOwogICAgIGZvciAoYXV0byBpdHIgPSBtU2VjdXJlU3RvcHMuYmVnaW4oKTsgaXRyICE9IG1TZWN1cmVTdG9wcy5lbmQoKTsgKytpdHIpIHsKQEAgLTU2Nyw3ICs4NDUsNyBAQAogfQogCiB9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gIC8vIG5hbWVzcGFjZSBWMV8xCit9ICAvLyBuYW1lc3BhY2UgVjFfMgogfSAgLy8gbmFtZXNwYWNlIGRybQogfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Jbml0RGF0YVBhcnNlci5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0luaXREYXRhUGFyc2VyLmNwcAppbmRleCBlMmJiNjUxLi5iOTg4Y2UwIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0luaXREYXRhUGFyc2VyLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0luaXREYXRhUGFyc2VyLmNwcApAQCAtMzEsNyArMzEsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogbmFtZXNwYWNlIHsKQEAgLTQ1LDIxICs0NSwyMiBAQAogfQogCiBTdGF0dXMgSW5pdERhdGFQYXJzZXI6OnBhcnNlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lVHlwZSwKKyAgICAgICAgVjFfMDo6S2V5VHlwZSBrZXlUeXBlLAogICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiogbGljZW5zZVJlcXVlc3QpIHsKICAgICAvLyBCdWlsZCBhIGxpc3Qgb2YgdGhlIGtleSBJRHMKICAgICBzdGQ6OnZlY3Rvcjxjb25zdCB1aW50OF90Kj4ga2V5SWRzOwogCi0gICAgaWYgKHR5cGUgPT0ga0lzb0JtZmZWaWRlb01pbWVUeXBlIHx8Ci0gICAgICAgIHR5cGUgPT0ga0lzb0JtZmZBdWRpb01pbWVUeXBlIHx8Ci0gICAgICAgIHR5cGUgPT0ga0NlbmNJbml0RGF0YUZvcm1hdCkgeworICAgIGlmIChtaW1lVHlwZSA9PSBrSXNvQm1mZlZpZGVvTWltZVR5cGUuY19zdHIoKSB8fAorICAgICAgICBtaW1lVHlwZSA9PSBrSXNvQm1mZkF1ZGlvTWltZVR5cGUuY19zdHIoKSB8fAorICAgICAgICBtaW1lVHlwZSA9PSBrQ2VuY0luaXREYXRhRm9ybWF0LmNfc3RyKCkpIHsKICAgICAgICAgU3RhdHVzIHJlcyA9IHBhcnNlUHNzaChpbml0RGF0YSwgJmtleUlkcyk7CiAgICAgICAgIGlmIChyZXMgIT0gU3RhdHVzOjpPSykgewogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZSA9PSBrV2VibVZpZGVvTWltZVR5cGUgfHwKLSAgICAgICAgdHlwZSA9PSBrV2VibUF1ZGlvTWltZVR5cGUgfHwKLSAgICAgICAgdHlwZSA9PSBrV2VibUluaXREYXRhRm9ybWF0KSB7CisgICAgfSBlbHNlIGlmIChtaW1lVHlwZSA9PSBrV2VibVZpZGVvTWltZVR5cGUuY19zdHIoKSB8fAorICAgICAgICBtaW1lVHlwZSA9PSBrV2VibUF1ZGlvTWltZVR5cGUuY19zdHIoKSB8fAorICAgICAgICBtaW1lVHlwZSA9PSBrV2VibUluaXREYXRhRm9ybWF0LmNfc3RyKCkpIHsKICAgICAgICAgLy8gV2ViTSAiaW5pdCBkYXRhIiBpcyBqdXN0IGEgc2luZ2xlIGtleSBJRAogICAgICAgICBpZiAoaW5pdERhdGEuc2l6ZSgpICE9IGtLZXlJZFNpemUpIHsKICAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwpAQCAtNjksOCArNzAsMTIgQEAKICAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CiAgICAgfQogCisgICAgaWYgKGtleVR5cGUgPT0gVjFfMDo6S2V5VHlwZTo6UkVMRUFTRSkgeworICAgICAgICAvLyByZXN0b3JlIGtleQorICAgIH0KKwogICAgIC8vIEJ1aWxkIHRoZSByZXF1ZXN0Ci0gICAgc3RkOjpzdHJpbmcgcmVxdWVzdEpzb24gPSBnZW5lcmF0ZVJlcXVlc3Qoa2V5SWRzKTsKKyAgICBzdGQ6OnN0cmluZyByZXF1ZXN0SnNvbiA9IGdlbmVyYXRlUmVxdWVzdChrZXlUeXBlLCBrZXlJZHMpOwogICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlcXVlc3RKc29uVmVjID0gU3RyVG9WZWN0b3IocmVxdWVzdEpzb24pOwogCiAgICAgbGljZW5zZVJlcXVlc3QtPmNsZWFyKCk7CkBAIC0xMzEsOSArMTM2LDExIEBACiAgICAgcmV0dXJuIFN0YXR1czo6T0s7CiB9CiAKLXN0ZDo6c3RyaW5nIEluaXREYXRhUGFyc2VyOjpnZW5lcmF0ZVJlcXVlc3QoY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgdWludDhfdCo+JiBrZXlJZHMpIHsKK3N0ZDo6c3RyaW5nIEluaXREYXRhUGFyc2VyOjpnZW5lcmF0ZVJlcXVlc3QoVjFfMDo6S2V5VHlwZSBrZXlUeXBlLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCB1aW50OF90Kj4mIGtleUlkcykgewogICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGtSZXF1ZXN0UHJlZml4KCJ7XCJraWRzXCI6WyIpOwotICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGtSZXF1ZXN0U3VmZml4KCJdLFwidHlwZVwiOlwidGVtcG9yYXJ5XCJ9Iik7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcga1RlbXBvcmFyeVNlc3Npb24oIl0sXCJ0eXBlXCI6XCJ0ZW1wb3JhcnlcIn0iKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBrUGVyc2lzdGVudFNlc3Npb24oIl0sXCJ0eXBlXCI6XCJwZXJzaXN0ZW50LWxpY2Vuc2VcIn0iKTsKIAogICAgIHN0ZDo6c3RyaW5nIHJlcXVlc3Qoa1JlcXVlc3RQcmVmaXgpOwogICAgIHN0ZDo6c3RyaW5nIGVuY29kZWRJZDsKQEAgLTE0Nyw3ICsxNTQsMTIgQEAKICAgICAgICAgcmVxdWVzdC5hcHBlbmQoZW5jb2RlZElkKTsKICAgICAgICAgcmVxdWVzdC5wdXNoX2JhY2soJ1wiJyk7CiAgICAgfQotICAgIHJlcXVlc3QuYXBwZW5kKGtSZXF1ZXN0U3VmZml4KTsKKyAgICBpZiAoa2V5VHlwZSA9PSBWMV8wOjpLZXlUeXBlOjpTVFJFQU1JTkcpIHsKKyAgICAgICAgcmVxdWVzdC5hcHBlbmQoa1RlbXBvcmFyeVNlc3Npb24pOworICAgIH0gZWxzZSBpZiAoa2V5VHlwZSA9PSBWMV8wOjpLZXlUeXBlOjpPRkZMSU5FIHx8CisgICAgICAgICAgICAgICAgICAga2V5VHlwZSA9PSBWMV8wOjpLZXlUeXBlOjpSRUxFQVNFKSB7CisgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChrUGVyc2lzdGVudFNlc3Npb24pOworICAgIH0KIAogICAgIC8vIEFuZHJvaWQncyBCYXNlNjQgZW5jb2RlciBwcm9kdWNlcyBwYWRkaW5nLiBFTUUgZm9yYmlkcyBwYWRkaW5nLgogICAgIGNvbnN0IGNoYXIga0Jhc2U2NFBhZGRpbmcgPSAnPSc7CkBAIC0xNTcsNyArMTY5LDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSnNvbldlYktleS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0pzb25XZWJLZXkuY3BwCmluZGV4IGNjY2I0MWUuLmQ5Mzc3N2QgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSnNvbldlYktleS5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Kc29uV2ViS2V5LmNwcApAQCAtMjIsMTggKzIyLDIxIEBACiAjaW5jbHVkZSAiQmFzZTY0LmgiCiAKIG5hbWVzcGFjZSB7Citjb25zdCBzdGQ6OnN0cmluZyBrQmFzZTY0UGFkZGluZygiPSIpOwogY29uc3Qgc3RkOjpzdHJpbmcga0tleXNUYWcoImtleXMiKTsKIGNvbnN0IHN0ZDo6c3RyaW5nIGtLZXlUeXBlVGFnKCJrdHkiKTsKLWNvbnN0IHN0ZDo6c3RyaW5nIGtTeW1tZXRyaWNLZXlWYWx1ZSgib2N0Iik7CiBjb25zdCBzdGQ6OnN0cmluZyBrS2V5VGFnKCJrIik7CiBjb25zdCBzdGQ6OnN0cmluZyBrS2V5SWRUYWcoImtpZCIpOwotY29uc3Qgc3RkOjpzdHJpbmcga0Jhc2U2NFBhZGRpbmcoIj0iKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtNZWRpYVNlc3Npb25UeXBlKCJ0eXBlIik7Citjb25zdCBzdGQ6OnN0cmluZyBrUGVyc2lzdGVudExpY2Vuc2VTZXNzaW9uKCJwZXJzaXN0ZW50LWxpY2Vuc2UiKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtTeW1tZXRyaWNLZXlWYWx1ZSgib2N0Iik7Citjb25zdCBzdGQ6OnN0cmluZyBrVGVtcG9yYXJ5TGljZW5zZVNlc3Npb24oInRlbXBvcmFyeSIpOwogfQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBKc29uV2ViS2V5OjpKc29uV2ViS2V5KCkgewpAQCAtMjY4LDcgKzI3MSw3IEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL01lbW9yeUZpbGVTeXN0ZW0uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9NZW1vcnlGaWxlU3lzdGVtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGNkMDBmCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9NZW1vcnlGaWxlU3lzdGVtLmNwcApAQCAtMCwwICsxLDkyIEBACisvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIGZpbGUgYW5kIHByb3ByaWV0YXJ5CisvLyBzb3VyY2UgY29kZSBtYXkgb25seSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgV2lkZXZpbmUgTWFzdGVyCisvLyBMaWNlbnNlIEFncmVlbWVudC4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgIk1lbW9yeUZpbGVTeXN0ZW0uaCIKKyNpbmNsdWRlICJVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMiB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCitzdGQ6OnN0cmluZyBNZW1vcnlGaWxlU3lzdGVtOjpHZXRGaWxlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgeworICAgIHNpemVfdCBpbmRleCA9IHBhdGguZmluZF9sYXN0X29mKCIvIik7CisgICAgaWYgKGluZGV4ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIHJldHVybiBwYXRoLnN1YnN0cihpbmRleCsxKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gcGF0aDsKKyAgICB9Cit9CisKK2Jvb2wgTWVtb3J5RmlsZVN5c3RlbTo6RmlsZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIGNvbnN0IHsKKyAgICBhdXRvIHJlc3VsdCA9IG1NZW1vcnlGaWxlU3lzdGVtLmZpbmQoZmlsZU5hbWUpOworICAgIHJldHVybiByZXN1bHQgIT0gbU1lbW9yeUZpbGVTeXN0ZW0uZW5kKCk7Cit9CisKK3NzaXplX3QgTWVtb3J5RmlsZVN5c3RlbTo6R2V0RmlsZVNpemUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSBjb25zdCB7CisgICAgYXV0byByZXN1bHQgPSBtTWVtb3J5RmlsZVN5c3RlbS5maW5kKGZpbGVOYW1lKTsKKyAgICBpZiAocmVzdWx0ICE9IG1NZW1vcnlGaWxlU3lzdGVtLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzc2l6ZV90PihyZXN1bHQtPnNlY29uZC5nZXRGaWxlU2l6ZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBzaXplIGZvciAlcyIsIGZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gTWVtb3J5RmlsZVN5c3RlbTo6TGlzdEZpbGVzKCkgY29uc3QgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsaXN0OworICAgIGZvciAoY29uc3QgYXV0byYgZmlsZW5hbWUgOiBtTWVtb3J5RmlsZVN5c3RlbSkgeworICAgICAgICBsaXN0LnB1c2hfYmFjayhmaWxlbmFtZS5maXJzdCk7CisgICAgfQorICAgIHJldHVybiBsaXN0OworfQorCitzaXplX3QgTWVtb3J5RmlsZVN5c3RlbTo6UmVhZChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgc3RkOjpzdHJpbmcqIGJ1ZmZlcikgeworICAgIHN0ZDo6c3RyaW5nIGtleSA9IEdldEZpbGVOYW1lKHBhdGgpOworICAgIGF1dG8gcmVzdWx0ID0gbU1lbW9yeUZpbGVTeXN0ZW0uZmluZChrZXkpOworICAgIGlmIChyZXN1bHQgIT0gbU1lbW9yeUZpbGVTeXN0ZW0uZW5kKCkpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZEhhc2hGaWxlID0gcmVzdWx0LT5zZWNvbmQuZ2V0Q29udGVudCgpOworICAgICAgICBidWZmZXItPmFzc2lnbihzZXJpYWxpemVkSGFzaEZpbGUpOworICAgICAgICByZXR1cm4gYnVmZmVyLT5zaXplKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZWFkIGZyb20gJXMiLCBwYXRoLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCitzaXplX3QgTWVtb3J5RmlsZVN5c3RlbTo6V3JpdGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIGNvbnN0IE1lbW9yeUZpbGUmIG1lbW9yeUZpbGUpIHsKKyAgICBzdGQ6OnN0cmluZyBrZXkgPSBHZXRGaWxlTmFtZShwYXRoKTsKKyAgICBhdXRvIHJlc3VsdCA9IG1NZW1vcnlGaWxlU3lzdGVtLmZpbmQoa2V5KTsKKyAgICBpZiAocmVzdWx0ICE9IG1NZW1vcnlGaWxlU3lzdGVtLmVuZCgpKSB7CisgICAgICAgIG1NZW1vcnlGaWxlU3lzdGVtLmVyYXNlKGtleSk7CisgICAgfQorICAgIG1NZW1vcnlGaWxlU3lzdGVtLmluc2VydChzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIE1lbW9yeUZpbGU+KGtleSwgbWVtb3J5RmlsZSkpOworICAgIHJldHVybiBtZW1vcnlGaWxlLmdldEZpbGVTaXplKCk7Cit9CisKK2Jvb2wgTWVtb3J5RmlsZVN5c3RlbTo6UmVtb3ZlRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIHsKKyAgICBhdXRvIHJlc3VsdCA9IG1NZW1vcnlGaWxlU3lzdGVtLmZpbmQoZmlsZU5hbWUpOworICAgIGlmIChyZXN1bHQgIT0gbU1lbW9yeUZpbGVTeXN0ZW0uZW5kKCkpIHsKKyAgICAgICAgbU1lbW9yeUZpbGVTeXN0ZW0uZXJhc2UocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBmaW5kIGxpY2Vuc2UgdG8gcmVtb3ZlOiAlcyIsIGZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitib29sIE1lbW9yeUZpbGVTeXN0ZW06OlJlbW92ZUFsbEZpbGVzKCkgeworICAgIG1NZW1vcnlGaWxlU3lzdGVtLmNsZWFyKCk7CisgICAgcmV0dXJuIG1NZW1vcnlGaWxlU3lzdGVtLmVtcHR5KCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9IC8vIG5hbWVzcGFjZSBWMV8yCit9IC8vIG5hbWVzcGFjZSBkcm0KK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL1Nlc3Npb24uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uLmNwcAppbmRleCAwN2M5MjY5Li5hOWQ3MDE2IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL1Nlc3Npb24uY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvU2Vzc2lvbi5jcHAKQEAgLTI4LDcgKzI4LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6S2V5VmFsdWU7CkBAIC00Miw5ICs0MiwxMCBAQAogU3RhdHVzIFNlc3Npb246OmdldEtleVJlcXVlc3QoCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICBWMV8wOjpLZXlUeXBlIGtleVR5cGUsCiAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBrZXlSZXF1ZXN0KSBjb25zdCB7CiAgICAgSW5pdERhdGFQYXJzZXIgcGFyc2VyOwotICAgIHJldHVybiBwYXJzZXIucGFyc2UoaW5pdERhdGEsIG1pbWVUeXBlLCBrZXlSZXF1ZXN0KTsKKyAgICByZXR1cm4gcGFyc2VyLnBhcnNlKGluaXREYXRhLCBtaW1lVHlwZSwga2V5VHlwZSwga2V5UmVxdWVzdCk7CiB9CiAKIFN0YXR1cyBTZXNzaW9uOjpwcm92aWRlS2V5UmVzcG9uc2UoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHJlc3BvbnNlKSB7CkBAIC02NywyOSArNjgsMzQgQEAKICAgICB9CiB9CiAKLVN0YXR1cyBTZXNzaW9uOjpkZWNyeXB0KAorU3RhdHVzX1YxXzIgU2Vzc2lvbjo6ZGVjcnlwdCgKICAgICAgICAgY29uc3QgS2V5SWQga2V5SWQsIGNvbnN0IEl2IGl2LCBjb25zdCB1aW50OF90KiBzcmNQdHIsCiAgICAgICAgIHVpbnQ4X3QqIGRlc3RQdHIsIGNvbnN0IHN0ZDo6dmVjdG9yPFN1YlNhbXBsZT4gc3ViU2FtcGxlcywKICAgICAgICAgc2l6ZV90KiBieXRlc0RlY3J5cHRlZE91dCkgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NYXBMb2NrKTsKIAorICAgIGlmIChnZXRNb2NrRXJyb3IoKSAhPSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgcmV0dXJuIGdldE1vY2tFcnJvcigpOworICAgIH0KKwogICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGtleUlkVmVjdG9yOwogICAgIGtleUlkVmVjdG9yLmNsZWFyKCk7CiAgICAga2V5SWRWZWN0b3IuaW5zZXJ0KGtleUlkVmVjdG9yLmVuZCgpLCBrZXlJZCwga2V5SWQgKyBrQmxvY2tTaXplKTsKICAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3RkOjp2ZWN0b3I8dWludDhfdD4gPjo6aXRlcmF0b3IgaXRyOwogICAgIGl0ciA9IG1LZXlNYXAuZmluZChrZXlJZFZlY3Rvcik7CiAgICAgaWYgKGl0ciA9PSBtS2V5TWFwLmVuZCgpKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9OT19MSUNFTlNFOworICAgICAgICByZXR1cm4gU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9OT19MSUNFTlNFOwogICAgIH0KIAogICAgIEFlc0N0ckRlY3J5cHRvciBkZWNyeXB0b3I7Ci0gICAgcmV0dXJuIGRlY3J5cHRvci5kZWNyeXB0KAorICAgIFN0YXR1cyBzdGF0dXMgPSBkZWNyeXB0b3IuZGVjcnlwdCgKICAgICAgICAgICAgIGl0ci0+c2Vjb25kIC8qa2V5Ki8sIGl2LCBzcmNQdHIsIGRlc3RQdHIsIHN1YlNhbXBsZXMsCiAgICAgICAgICAgICBzdWJTYW1wbGVzLnNpemUoKSwgYnl0ZXNEZWNyeXB0ZWRPdXQpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdGF0dXNfVjFfMj4oc3RhdHVzKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvU2Vzc2lvbkxpYnJhcnkuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uTGlicmFyeS5jcHAKaW5kZXggYjQzMTllNi4uOTlmYjMwZiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uTGlicmFyeS5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uTGlicmFyeS5jcHAKQEAgLTI0LDcgKzI0LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwpAQCAtNTksNyArNTksOCBAQAogCiAgICAgbVNlc3Npb25zLmluc2VydChzdGQ6OnBhaXI8c3RkOjp2ZWN0b3I8dWludDhfdD4sCiAgICAgICAgICAgICBzcDxTZXNzaW9uPiA+KHNlc3Npb25JZCwgbmV3IFNlc3Npb24oc2Vzc2lvbklkKSkpOwotICAgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzcDxTZXNzaW9uPiA+OjppdGVyYXRvciBpdHIgPSBtU2Vzc2lvbnMuZmluZChzZXNzaW9uSWQpOworICAgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzcDxTZXNzaW9uPiA+OjppdGVyYXRvciBpdHIgPQorICAgICAgICAgICAgbVNlc3Npb25zLmZpbmQoc2Vzc2lvbklkKTsKICAgICBpZiAoaXRyICE9IG1TZXNzaW9ucy5lbmQoKSkgewogICAgICAgICByZXR1cm4gaXRyLT5zZWNvbmQ7CiAgICAgfSBlbHNlIHsKQEAgLTcwLDcgKzcxLDggQEAKIHNwPFNlc3Npb24+IFNlc3Npb25MaWJyYXJ5OjpmaW5kU2Vzc2lvbigKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXNzaW9uc0xvY2spOwotICAgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzcDxTZXNzaW9uPiA+OjppdGVyYXRvciBpdHIgPSBtU2Vzc2lvbnMuZmluZChzZXNzaW9uSWQpOworICAgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzcDxTZXNzaW9uPiA+OjppdGVyYXRvciBpdHIgPQorICAgICAgICAgICAgbVNlc3Npb25zLmZpbmQoc2Vzc2lvbklkKTsKICAgICBpZiAoaXRyICE9IG1TZXNzaW9ucy5lbmQoKSkgewogICAgICAgICByZXR1cm4gaXRyLT5zZWNvbmQ7CiAgICAgfSBlbHNlIHsKQEAgLTg0LDcgKzg2LDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xLXNlcnZpY2UuY2xlYXJrZXkucmMgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5LnJjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmU4NTZhLi4wMDAwMDAwCi0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xLXNlcnZpY2UuY2xlYXJrZXkucmMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNlcnZpY2UgdmVuZG9yLmRybS1jbGVhcmtleS1oYWwtMS0xIC92ZW5kb3IvYmluL2h3L2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5Ci0gICAgY2xhc3MgaGFsCi0gICAgdXNlciBtZWRpYQotICAgIGdyb3VwIG1lZGlhIG1lZGlhZHJtCi0gICAgaW9wcmlvIHJ0IDQKLSAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFmZDNkNwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UtbGF6eS5jbGVhcmtleS5yYwpAQCAtMCwwICsxLDE0IEBACitzZXJ2aWNlIHZlbmRvci5kcm0tY2xlYXJrZXktaGFsLTEtMiAvdmVuZG9yL2Jpbi9ody9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS1sYXp5LmNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMDo6SUNyeXB0b0ZhY3RvcnkgY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wOjpJRHJtRmFjdG9yeSBjbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjE6OklDcnlwdG9GYWN0b3J5IGNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMTo6SURybUZhY3RvcnkgY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yOjpJQ3J5cHRvRmFjdG9yeSBjbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjI6OklEcm1GYWN0b3J5IGNsZWFya2V5CisgICAgZGlzYWJsZWQKKyAgICBvbmVzaG90CisgICAgY2xhc3MgaGFsCisgICAgdXNlciBtZWRpYQorICAgIGdyb3VwIG1lZGlhIG1lZGlhZHJtCisgICAgaW9wcmlvIHJ0IDQKKyAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLmNsZWFya2V5LnJjIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS5jbGVhcmtleS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmE2NjlkCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS5jbGVhcmtleS5yYwpAQCAtMCwwICsxLDEyIEBACitzZXJ2aWNlIHZlbmRvci5kcm0tY2xlYXJrZXktaGFsLTEtMiAvdmVuZG9yL2Jpbi9ody9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS5jbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjA6OklDcnlwdG9GYWN0b3J5IGNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMDo6SURybUZhY3RvcnkgY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xOjpJQ3J5cHRvRmFjdG9yeSBjbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjE6OklEcm1GYWN0b3J5IGNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMjo6SUNyeXB0b0ZhY3RvcnkgY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yOjpJRHJtRmFjdG9yeSBjbGVhcmtleQorICAgIGNsYXNzIGhhbAorICAgIHVzZXIgbWVkaWEKKyAgICBncm91cCBtZWRpYSBtZWRpYWRybQorICAgIGlvcHJpbyBydCA0CisgICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0Flc0N0ckRlY3J5cHRvci5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0Flc0N0ckRlY3J5cHRvci5oCmluZGV4IDBjN2VmMjAuLjcyMWY0YzAgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9BZXNDdHJEZWNyeXB0b3IuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQWVzQ3RyRGVjcnlwdG9yLmgKQEAgLTIyLDcgKzIyLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3RhdHVzOwpAQCAtNDIsNyArNDIsNyBAQAogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CYXNlNjQuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CYXNlNjQuaAppbmRleCA0YTM4NWJkLi5lYzMwY2MxIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQmFzZTY0LmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0Jhc2U2NC5oCkBAIC0yNSw3ICsyNSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OnNwOwpAQCAtMzgsNyArMzgsNyBAQAogdm9pZCBlbmNvZGVCYXNlNjRVcmwoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIHN0ZDo6c3RyaW5nICpvdXQpOwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0J1ZmZlci5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0J1ZmZlci5oCmluZGV4IDViYmIyOGEuLmM0OTdlMzcgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CdWZmZXIuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQnVmZmVyLmgKQEAgLTI1LDcgKzI1LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6c3A7CkBAIC01NCw3ICs1NCw3IEBACiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5RHJtUHJvcGVydGllcy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5RHJtUHJvcGVydGllcy5oCmluZGV4IGQ2NWIyNWMuLmI4M2NlNjkgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DbGVhcktleURybVByb3BlcnRpZXMuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlEcm1Qcm9wZXJ0aWVzLmgKQEAgLTIyLDMwICsyMiw0MCBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtWZW5kb3JLZXkoInZlbmRvciIpOwogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtWZW5kb3JWYWx1ZSgiR29vZ2xlIik7CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1ZlcnNpb25LZXkoInZlcnNpb24iKTsKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVmVyc2lvblZhbHVlKCIxLjEiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVmVyc2lvblZhbHVlKCIxLjIiKTsKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrUGx1Z2luRGVzY3JpcHRpb25LZXkoImRlc2NyaXB0aW9uIik7CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1BsdWdpbkRlc2NyaXB0aW9uVmFsdWUoIkNsZWFyS2V5IENETSIpOwogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtBbGdvcml0aG1zS2V5KCJhbGdvcml0aG1zIik7CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0FsZ29yaXRobXNWYWx1ZSgiIik7CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0xpc3RlbmVyVGVzdFN1cHBvcnRLZXkoImxpc3RlbmVyVGVzdFN1cHBvcnQiKTsKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrTGlzdGVuZXJUZXN0U3VwcG9ydFZhbHVlKCJ0cnVlIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0RybUVycm9yVGVzdEtleSgiZHJtRXJyb3JUZXN0Iik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0RybUVycm9yVGVzdFZhbHVlKCIiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrUmVzb3VyY2VDb250ZW50aW9uVmFsdWUoInJlc291cmNlQ29udGVudGlvbiIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtMb3N0U3RhdGVWYWx1ZSgibG9zdFN0YXRlIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0ZyYW1lVG9vTGFyZ2VWYWx1ZSgiZnJhbWVUb29MYXJnZSIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtJbnZhbGlkU3RhdGVWYWx1ZSgiaW52YWxpZFN0YXRlIik7CiAKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRGV2aWNlSWRLZXkoImRldmljZUlkIik7CiBzdGF0aWMgY29uc3QgdWludDhfdCBrVGVzdERldmljZUlkRGF0YVtdID0KICAgICAgICAgezB4MCwgMHgxLCAweDIsIDB4MywgMHg0LCAweDUsIDB4NiwgMHg3LAogICAgICAgICAgMHg4LCAweDksIDB4YSwgMHhiLCAweGMsIDB4ZCwgMHhlLCAweGZ9OworCisvLyBzZXR0YWJsZSBieXRlIGFycmF5IHByb3BlcnR5CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0NsaWVudElkS2V5KCJjbGllbnRJZCIpOworCiAvLyBUT0RPIHN0dWIgb3V0IG1ldHJpY3MgZm9yIG53CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga01ldHJpY3NLZXkoIm1ldHJpY3MiKTsKIHN0YXRpYyBjb25zdCB1aW50OF90IGtNZXRyaWNzRGF0YVtdID0geyAwIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlUeXBlcy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5VHlwZXMuaAppbmRleCA0NmNiNWU0Li4wM2M0MzRlIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlUeXBlcy5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DbGVhcktleVR5cGVzLmgKQEAgLTE3LDE3ICsxNywxOCBAQAogI2lmbmRlZiBDTEVBUktFWV9NQUNST1NfSF8KICNkZWZpbmUgQ0xFQVJLRVlfTUFDUk9TX0hfCiAKLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvdHlwZXMuaD4KIAogI2luY2x1ZGUgPG1hcD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlWYWx1ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6U2VjdXJpdHlMZXZlbDsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwogCiBjb25zdCB1aW50OF90IGtCbG9ja1NpemUgPSAxNjsgLy9BRVNfQkxPQ0tfU0laRTsKQEAgLTQ3LDcgKzQ4LDcgQEAKICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVHlwZU5hbWUmKSA9IGRlbGV0ZTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaAppbmRleCA5OTUyMDI3Li42MzY4ZjNkIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oCkBAIC0xNywxNyArMTcsMTcgQEAKICNpZm5kZWYgQ0xFQVJLRVlfQ1JFQVRFX1BMVUdJTl9GQUNUT1JJRVNfSF8KICNkZWZpbmUgQ0xFQVJLRVlfQ1JFQVRFX1BMVUdJTl9GQUNUT1JJRVNfSF8KIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JQ3J5cHRvRmFjdG9yeS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JRHJtRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JQ3J5cHRvRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtRmFjdG9yeS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OklDcnlwdG9GYWN0b3J5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpJRHJtRmFjdG9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6SUNyeXB0b0ZhY3Rvcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OklEcm1GYWN0b3J5OwogCiBleHRlcm4gIkMiIHsKICAgICBJRHJtRmFjdG9yeSogY3JlYXRlRHJtRmFjdG9yeSgpOwpAQCAtMzUsNyArMzUsNyBAQAogfQogCiB9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gIC8vIG5hbWVzcGFjZSBWMV8xCit9ICAvLyBuYW1lc3BhY2UgVjFfMgogfSAgLy8gbmFtZXNwYWNlIGRybQogfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b0ZhY3RvcnkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9GYWN0b3J5LmgKaW5kZXggMTc1YWI3Ni4uMjAzYmIyZCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b0ZhY3RvcnkuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3J5cHRvRmFjdG9yeS5oCkBAIC0xOCwxNyArMTgsMTcgQEAKICNkZWZpbmUgQ0xFQVJLRVlfQ1JZUFRPX0ZBQ1RPUllfSF8KIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JQ3J5cHRvUGx1Z2luLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lDcnlwdG9GYWN0b3J5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lDcnlwdG9GYWN0b3J5Lmg+CiAKICNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6SUNyeXB0b0ZhY3Rvcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OklDcnlwdG9GYWN0b3J5OwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpJQ3J5cHRvUGx1Z2luOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwpAQCAtNTIsNyArNTIsNyBAQAogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9QbHVnaW4uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9QbHVnaW4uaAppbmRleCA2YTczODA2Li44NjgwZjBjIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3J5cHRvUGx1Z2luLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b1BsdWdpbi5oCkBAIC0xNyw3ICsxNyw3IEBACiAjaWZuZGVmIENMRUFSS0VZX0NSWVBUT19QTFVHSU5fSF8KICNkZWZpbmUgQ0xFQVJLRVlfQ1JZUFRPX1BMVUdJTl9IXwogCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lDcnlwdG9QbHVnaW4uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSUNyeXB0b1BsdWdpbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tZW1vcnkvMS4wL0lNZW1vcnkuaD4KIAogI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKQEAgLTMyLDE2ICszMiwxNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpEZXN0aW5hdGlvbkJ1ZmZlcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6SUNyeXB0b1BsdWdpbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6TW9kZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6UGF0dGVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U2hhcmVkQnVmZmVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdGF0dXM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN1YlNhbXBsZTsKK25hbWVzcGFjZSBkcm0gPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm07Cit1c2luZyBkcm06OlYxXzA6OkRlc3RpbmF0aW9uQnVmZmVyOwordXNpbmcgZHJtOjpWMV8wOjpNb2RlOwordXNpbmcgZHJtOjpWMV8wOjpQYXR0ZXJuOwordXNpbmcgZHJtOjpWMV8wOjpTaGFyZWRCdWZmZXI7Cit1c2luZyBkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIGRybTo6VjFfMDo6U3ViU2FtcGxlOworCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKQEAgLTUxLDcgKzUyLDkgQEAKIHVzaW5nIDo6YW5kcm9pZDo6aGlkbDo6bWVtb3J5OjpWMV8wOjpJTWVtb3J5OwogdXNpbmcgOjphbmRyb2lkOjpzcDsKIAotc3RydWN0IENyeXB0b1BsdWdpbiA6IHB1YmxpYyBJQ3J5cHRvUGx1Z2luIHsKK3R5cGVkZWYgZHJtOjpWMV8yOjpTdGF0dXMgU3RhdHVzX1YxXzI7CisKK3N0cnVjdCBDcnlwdG9QbHVnaW4gOiBwdWJsaWMgZHJtOjpWMV8yOjpJQ3J5cHRvUGx1Z2luIHsKICAgICBleHBsaWNpdCBDcnlwdG9QbHVnaW4oY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCkgewogICAgICAgICBtSW5pdFN0YXR1cyA9IHNldE1lZGlhRHJtU2Vzc2lvbihzZXNzaW9uSWQpOwogICAgIH0KQEAgLTgwLDYgKzgzLDE4IEBACiAgICAgICAgICAgICBjb25zdCBEZXN0aW5hdGlvbkJ1ZmZlciYgZGVzdGluYXRpb24sCiAgICAgICAgICAgICBkZWNyeXB0X2NiIF9oaWRsX2NiKTsKIAorICAgIFJldHVybjx2b2lkPiBkZWNyeXB0XzFfMigKKyAgICAgICAgICAgIGJvb2wgc2VjdXJlLAorICAgICAgICAgICAgY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCBLRVlfSURfU0laRT4mIGtleUlkLAorICAgICAgICAgICAgY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCBLRVlfSVZfU0laRT4mIGl2LAorICAgICAgICAgICAgTW9kZSBtb2RlLAorICAgICAgICAgICAgY29uc3QgUGF0dGVybiYgcGF0dGVybiwKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPFN1YlNhbXBsZT4mIHN1YlNhbXBsZXMsCisgICAgICAgICAgICBjb25zdCBTaGFyZWRCdWZmZXImIHNvdXJjZSwKKyAgICAgICAgICAgIHVpbnQ2NF90IG9mZnNldCwKKyAgICAgICAgICAgIGNvbnN0IERlc3RpbmF0aW9uQnVmZmVyJiBkZXN0aW5hdGlvbiwKKyAgICAgICAgICAgIGRlY3J5cHRfMV8yX2NiIF9oaWRsX2NiKTsKKwogICAgIFJldHVybjx2b2lkPiBzZXRTaGFyZWRCdWZmZXJCYXNlKGNvbnN0IGhpZGxfbWVtb3J5JiBiYXNlLAogICAgICAgICAgICAgdWludDMyX3QgYnVmZmVySWQpOwogCkBAIC05Niw3ICsxMTEsNyBAQAogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9EZXZpY2VGaWxlcy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RldmljZUZpbGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0YWU1OQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9EZXZpY2VGaWxlcy5oCkBAIC0wLDAgKzEsNzEgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgZmlsZSBhbmQgcHJvcHJpZXRhcnkKKy8vIHNvdXJjZSBjb2RlIG1heSBvbmx5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXaWRldmluZSBNYXN0ZXIKKy8vIExpY2Vuc2UgQWdyZWVtZW50LgorLy8KKyNpZm5kZWYgQ0xFQVJLRVlfREVWSUNFX0ZJTEVTX0hfCisjZGVmaW5lIENMRUFSS0VZX0RFVklDRV9GSUxFU19IXworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJwcm90b3MvRGV2aWNlRmlsZXMucGIuaCIKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisjaW5jbHVkZSAiTWVtb3J5RmlsZVN5c3RlbS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMiB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCitjbGFzcyBEZXZpY2VGaWxlcyB7CisgcHVibGljOgorICAgIHR5cGVkZWYgZW51bSB7CisgICAgICAgIGtMaWNlbnNlU3RhdGVVbmtub3duLAorICAgICAgICBrTGljZW5zZVN0YXRlQWN0aXZlLAorICAgICAgICBrTGljZW5zZVN0YXRlUmVsZWFzaW5nLAorICAgIH0gTGljZW5zZVN0YXRlOworCisgICAgRGV2aWNlRmlsZXMoKSB7fTsKKyAgICB2aXJ0dWFsIH5EZXZpY2VGaWxlcygpIHt9OworCisgICAgdmlydHVhbCBib29sIFN0b3JlTGljZW5zZShjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQsIExpY2Vuc2VTdGF0ZSBzdGF0ZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlSZXNwb25zZSk7CisKKyAgICB2aXJ0dWFsIGJvb2wgUmV0cmlldmVMaWNlbnNlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zZXRfaWQsIExpY2Vuc2VTdGF0ZSogc3RhdGUsIHN0ZDo6c3RyaW5nKiBvZmZsaW5lTGljZW5zZSk7CisKKyAgICB2aXJ0dWFsIGJvb2wgTGljZW5zZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQpOworCisgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gTGlzdExpY2Vuc2VzKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wgRGVsZXRlTGljZW5zZShjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQpOworCisgICAgdmlydHVhbCBib29sIERlbGV0ZUFsbExpY2Vuc2VzKCk7CisKKyBwcml2YXRlOgorICAgIGJvb2wgRmlsZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgY29uc3Q7CisgICAgc3NpemVfdCBHZXRGaWxlU2l6ZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIGNvbnN0OworICAgIGJvb2wgUmVtb3ZlRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpOworCisgICAgYm9vbCBSZXRyaWV2ZUhhc2hlZEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lLCBPZmZsaW5lRmlsZSogZGVTZXJpYWxpemVkRmlsZSk7CisgICAgYm9vbCBTdG9yZUZpbGVSYXcoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VyaWFsaXplZEZpbGUpOworICAgIGJvb2wgU3RvcmVGaWxlV2l0aEhhc2goY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VyaWFsaXplZEZpbGUpOworCisgICAgTWVtb3J5RmlsZVN5c3RlbSBtRmlsZUhhbmRsZTsKKworICAgIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihEZXZpY2VGaWxlcyk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAvLyBuYW1lc3BhY2UgVjFfMgorfSAvLyBuYW1lc3BhY2UgZHJtCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENMRUFSS0VZX0RFVklDRV9GSUxFU19IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybUZhY3RvcnkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1GYWN0b3J5LmgKaW5kZXggNmY1ODE5NS4uNGNhODU2ZCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybUZhY3RvcnkuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRHJtRmFjdG9yeS5oCkBAIC0xNywxNSArMTcsMTUgQEAKICNpZm5kZWYgQ0xFQVJLRVlfRFJNX0ZBQ1RPUllfSF8KICNkZWZpbmUgQ0xFQVJLRVlfRFJNX0ZBQ1RPUllfSF8KIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JRHJtUGx1Z2luLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lEcm1GYWN0b3J5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1QbHVnaW4uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSURybUZhY3RvcnkuaD4KIAogI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKQEAgLTM5LDYgKzM5LDEwIEBACiAgICAgUmV0dXJuPGJvb2w+IGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgMTY+JiB1dWlkKQogICAgICAgICAgICAgb3ZlcnJpZGU7CiAKKyAgICBSZXR1cm48Ym9vbD4gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWRfMV8yKGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgMTY+JiB1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjdXJpdHlMZXZlbCBsZXZlbCkgb3ZlcnJpZGU7CisKICAgICBSZXR1cm48Ym9vbD4gaXNDb250ZW50VHlwZVN1cHBvcnRlZChjb25zdCBoaWRsX3N0cmluZyAmbWltZVR5cGUpCiAgICAgICAgICAgICBvdmVycmlkZTsKIApAQCAtNTIsNyArNTYsNyBAQAogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1QbHVnaW4uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1QbHVnaW4uaAppbmRleCBmYjA2OTVhLi5mMjk0ZDRkIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRHJtUGx1Z2luLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybVBsdWdpbi5oCkBAIC0xNywzMiArMTcsNDIgQEAKICNpZm5kZWYgQ0xFQVJLRVlfRFJNX1BMVUdJTl9IXwogI2RlZmluZSBDTEVBUktFWV9EUk1fUExVR0lOX0hfCiAKLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybVBsdWdpbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1QbHVnaW5MaXN0ZW5lci5oPgogCi0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RkaW8uaD4KIAorI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKworI2luY2x1ZGUgIkRldmljZUZpbGVzLmgiCiAjaW5jbHVkZSAiU2Vzc2lvbkxpYnJhcnkuaCIKICNpbmNsdWRlICJVdGlscy5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OkV2ZW50VHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6SURybVBsdWdpbkxpc3RlbmVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlTdGF0dXM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OktleVR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OktleVZhbHVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTZWN1cmVTdG9wOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTZWN1cmVTdG9wSWQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlNlc3Npb25JZDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3RhdHVzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpEcm1NZXRyaWNHcm91cDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6SURybVBsdWdpbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6S2V5UmVxdWVzdFR5cGU7CituYW1lc3BhY2UgZHJtID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOwordXNpbmcgZHJtOjpWMV8wOjpFdmVudFR5cGU7Cit1c2luZyBkcm06OlYxXzA6OklEcm1QbHVnaW5MaXN0ZW5lcjsKK3VzaW5nIGRybTo6VjFfMDo6S2V5UmVxdWVzdFR5cGU7Cit1c2luZyBkcm06OlYxXzA6OktleVN0YXR1czsKK3VzaW5nIGRybTo6VjFfMDo6S2V5VHlwZTsKK3VzaW5nIGRybTo6VjFfMDo6S2V5VmFsdWU7Cit1c2luZyBkcm06OlYxXzA6OlNlY3VyZVN0b3A7Cit1c2luZyBkcm06OlYxXzA6OlNlY3VyZVN0b3BJZDsKK3VzaW5nIGRybTo6VjFfMDo6U2Vzc2lvbklkOwordXNpbmcgZHJtOjpWMV8wOjpTdGF0dXM7Cit1c2luZyBkcm06OlYxXzE6OkRybU1ldHJpY0dyb3VwOwordXNpbmcgZHJtOjpWMV8xOjpIZGNwTGV2ZWw7Cit1c2luZyBkcm06OlYxXzE6OlNlY3VyZVN0b3BSZWxlYXNlOwordXNpbmcgZHJtOjpWMV8xOjpTZWN1cml0eUxldmVsOwordXNpbmcgZHJtOjpWMV8yOjpJRHJtUGx1Z2luOwordXNpbmcgZHJtOjpWMV8yOjpLZXlTZXRJZDsKK3VzaW5nIGRybTo6VjFfMjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZTsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKQEAgLTUwLDEwICs2MCwxNiBAQAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKIHVzaW5nIDo6YW5kcm9pZDo6c3A7CiAKK3R5cGVkZWYgZHJtOjpWMV8xOjpLZXlSZXF1ZXN0VHlwZSBLZXlSZXF1ZXN0VHlwZV9WMV8xOwordHlwZWRlZiBkcm06OlYxXzI6OklEcm1QbHVnaW5MaXN0ZW5lciBJRHJtUGx1Z2luTGlzdGVuZXJfVjFfMjsKK3R5cGVkZWYgZHJtOjpWMV8yOjpLZXlTdGF0dXMgS2V5U3RhdHVzX1YxXzI7Cit0eXBlZGVmIGRybTo6VjFfMjo6U3RhdHVzIFN0YXR1c19WMV8yOwordHlwZWRlZiBkcm06OlYxXzI6OkhkY3BMZXZlbCBIZGNwTGV2ZWxfVjFfMjsKKwogc3RydWN0IERybVBsdWdpbiA6IHB1YmxpYyBJRHJtUGx1Z2luIHsKICAgICBleHBsaWNpdCBEcm1QbHVnaW4oU2Vzc2lvbkxpYnJhcnkqIHNlc3Npb25MaWJyYXJ5KTsKIAotICAgIHZpcnR1YWwgfkRybVBsdWdpbigpIHt9CisgICAgdmlydHVhbCB+RHJtUGx1Z2luKCkgeyBtRmlsZUhhbmRsZS5EZWxldGVBbGxMaWNlbnNlcygpOyB9CiAKICAgICBSZXR1cm48dm9pZD4gb3BlblNlc3Npb24ob3BlblNlc3Npb25fY2IgX2hpZGxfY2IpIG92ZXJyaWRlOwogICAgIFJldHVybjx2b2lkPiBvcGVuU2Vzc2lvbl8xXzEoU2VjdXJpdHlMZXZlbCBzZWN1cml0eUxldmVsLApAQCAtNzcsNiArOTMsMTQgQEAKICAgICAgICAgY29uc3QgaGlkbF92ZWM8S2V5VmFsdWU+JiBvcHRpb25hbFBhcmFtZXRlcnMsCiAgICAgICAgIGdldEtleVJlcXVlc3RfMV8xX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKIAorICAgIFJldHVybjx2b2lkPiBnZXRLZXlSZXF1ZXN0XzFfMigKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNjb3BlLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBtaW1lVHlwZSwKKyAgICAgICAgS2V5VHlwZSBrZXlUeXBlLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlWYWx1ZT4mIG9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgZ2V0S2V5UmVxdWVzdF8xXzJfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCiAgICAgUmV0dXJuPHZvaWQ+IHByb3ZpZGVLZXlSZXNwb25zZSgKICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNjb3BlLAogICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgcmVzcG9uc2UsCkBAIC05MSwxMyArMTE1LDcgQEAKIAogICAgIFJldHVybjxTdGF0dXM+IHJlc3RvcmVLZXlzKAogICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAotICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYga2V5U2V0SWQpIHsKLQotICAgICAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwIHx8IGtleVNldElkLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7Ci0gICAgfQorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYga2V5U2V0SWQpIG92ZXJyaWRlOwogCiAgICAgUmV0dXJuPHZvaWQ+IHF1ZXJ5S2V5U3RhdHVzKAogICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLApAQCAtMTE1LDYgKzEzMywxOCBAQAogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KIAorICAgIFJldHVybjx2b2lkPiBnZXRQcm92aXNpb25SZXF1ZXN0XzFfMigKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGNlcnRpZmljYXRlVHlwZSwKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGNlcnRpZmljYXRlQXV0aG9yaXR5LAorICAgICAgICBnZXRQcm92aXNpb25SZXF1ZXN0XzFfMl9jYiBfaGlkbF9jYikgeworICAgICAgICBVTlVTRUQoY2VydGlmaWNhdGVUeXBlKTsKKyAgICAgICAgVU5VU0VEKGNlcnRpZmljYXRlQXV0aG9yaXR5KTsKKworICAgICAgICBoaWRsX3N0cmluZyBkZWZhdWx0VXJsOworICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIGhpZGxfdmVjPHVpbnQ4X3Q+KCksIGRlZmF1bHRVcmwpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKwogICAgIFJldHVybjx2b2lkPiBwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UoCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiByZXNwb25zZSwKICAgICAgICAgcHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlX2NiIF9oaWRsX2NiKSB7CkBAIC0xMzQsNiArMTY0LDEzIEBACiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQogCisgICAgUmV0dXJuPHZvaWQ+IGdldEhkY3BMZXZlbHNfMV8yKGdldEhkY3BMZXZlbHNfMV8yX2NiIF9oaWRsX2NiKSB7CisgICAgICAgIEhkY3BMZXZlbF9WMV8yIGNvbm5lY3RlZExldmVsID0gSGRjcExldmVsX1YxXzI6OkhEQ1BfTk9ORTsKKyAgICAgICAgSGRjcExldmVsX1YxXzIgbWF4TGV2ZWwgPSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9OT19PVVRQVVQ7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpPSywgY29ubmVjdGVkTGV2ZWwsIG1heExldmVsKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKICAgICBSZXR1cm48dm9pZD4gZ2V0TnVtYmVyT2ZTZXNzaW9ucyhnZXROdW1iZXJPZlNlc3Npb25zX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKIAogICAgIFJldHVybjx2b2lkPiBnZXRTZWN1cml0eUxldmVsKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCkBAIC0xNDEsNiArMTc4LDEzIEBACiAKICAgICBSZXR1cm48dm9pZD4gZ2V0TWV0cmljcyhnZXRNZXRyaWNzX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKIAorICAgIFJldHVybjx2b2lkPiBnZXRPZmZsaW5lTGljZW5zZUtleVNldElkcyhnZXRPZmZsaW5lTGljZW5zZUtleVNldElkc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48U3RhdHVzPiByZW1vdmVPZmZsaW5lTGljZW5zZShjb25zdCBLZXlTZXRJZCAma2V5U2V0SWQpIG92ZXJyaWRlOworCisgICAgUmV0dXJuPHZvaWQ+IGdldE9mZmxpbmVMaWNlbnNlU3RhdGUoY29uc3QgS2V5U2V0SWQgJmtleVNldElkLAorICAgICAgICAgICAgZ2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKICAgICBSZXR1cm48dm9pZD4gZ2V0UHJvcGVydHlTdHJpbmcoCiAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBuYW1lLAogICAgICAgICBnZXRQcm9wZXJ0eVN0cmluZ19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CkBAIC0yNDgsMTIgKzI5MiwxNyBAQAogCiAgICAgUmV0dXJuPHZvaWQ+IHNldExpc3RlbmVyKGNvbnN0IHNwPElEcm1QbHVnaW5MaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CiAgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICBtTGlzdGVuZXJWMV8yID0gSURybVBsdWdpbkxpc3RlbmVyX1YxXzI6OmNhc3RGcm9tKGxpc3RlbmVyKTsKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9OwogCi0gICAgUmV0dXJuPHZvaWQ+IHNlbmRFdmVudChFdmVudFR5cGUgZXZlbnRUeXBlLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgIFJldHVybjx2b2lkPiBzZW5kRXZlbnQoCisgICAgICAgICAgICBFdmVudFR5cGUgZXZlbnRUeXBlLAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBkYXRhKSB7Ci0gICAgICAgIGlmIChtTGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBpZiAobUxpc3RlbmVyVjFfMiAhPSBOVUxMKSB7CisgICAgICAgICAgICBtTGlzdGVuZXJWMV8yLT5zZW5kRXZlbnQoZXZlbnRUeXBlLCBzZXNzaW9uSWQsIGRhdGEpOworICAgICAgICB9IGVsc2UgaWYgKG1MaXN0ZW5lciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBtTGlzdGVuZXItPnNlbmRFdmVudChldmVudFR5cGUsIHNlc3Npb25JZCwgZGF0YSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HRSgiTnVsbCBldmVudCBsaXN0ZW5lciwgZXZlbnQgbm90IHNlbnQiKTsKQEAgLTI2MSw4ICszMTAsMTIgQEAKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9CiAKLSAgICBSZXR1cm48dm9pZD4gc2VuZEV4cGlyYXRpb25VcGRhdGUoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwgaW50NjRfdCBleHBpcnlUaW1lSW5NUykgewotICAgICAgICBpZiAobUxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICBSZXR1cm48dm9pZD4gc2VuZEV4cGlyYXRpb25VcGRhdGUoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgaW50NjRfdCBleHBpcnlUaW1lSW5NUykgeworICAgICAgICBpZiAobUxpc3RlbmVyVjFfMiAhPSBOVUxMKSB7CisgICAgICAgICAgICBtTGlzdGVuZXJWMV8yLT5zZW5kRXhwaXJhdGlvblVwZGF0ZShzZXNzaW9uSWQsIGV4cGlyeVRpbWVJbk1TKTsKKyAgICAgICAgfSBlbHNlIGlmIChtTGlzdGVuZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgbUxpc3RlbmVyLT5zZW5kRXhwaXJhdGlvblVwZGF0ZShzZXNzaW9uSWQsIGV4cGlyeVRpbWVJbk1TKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dFKCJOdWxsIGV2ZW50IGxpc3RlbmVyLCBldmVudCBub3Qgc2VudCIpOwpAQCAtMjcwLDkgKzMyMywxMiBAQAogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KIAotICAgIFJldHVybjx2b2lkPiBzZW5kS2V5c0NoYW5nZShjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgIFJldHVybjx2b2lkPiBzZW5kS2V5c0NoYW5nZSgKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCiAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlTdGF0dXM+JiBrZXlTdGF0dXNMaXN0LCBib29sIGhhc05ld1VzYWJsZUtleSkgewotICAgICAgICBpZiAobUxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lclYxXzIgIT0gTlVMTCkgeworICAgICAgICAgICAgbUxpc3RlbmVyVjFfMi0+c2VuZEtleXNDaGFuZ2Uoc2Vzc2lvbklkLCBrZXlTdGF0dXNMaXN0LCBoYXNOZXdVc2FibGVLZXkpOworICAgICAgICB9IGVsc2UgaWYgKG1MaXN0ZW5lciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBtTGlzdGVuZXItPnNlbmRLZXlzQ2hhbmdlKHNlc3Npb25JZCwga2V5U3RhdHVzTGlzdCwgaGFzTmV3VXNhYmxlS2V5KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dFKCJOdWxsIGV2ZW50IGxpc3RlbmVyLCBldmVudCBub3Qgc2VudCIpOwpAQCAtMjgwLDYgKzMzNiwyMyBAQAogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KIAorICAgIFJldHVybjx2b2lkPiBzZW5kS2V5c0NoYW5nZV8xXzIoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8S2V5U3RhdHVzX1YxXzI+JiBrZXlTdGF0dXNMaXN0LCBib29sIGhhc05ld1VzYWJsZUtleSkgeworICAgICAgICBpZiAobUxpc3RlbmVyVjFfMiAhPSBOVUxMKSB7CisgICAgICAgICAgICBtTGlzdGVuZXJWMV8yLT5zZW5kS2V5c0NoYW5nZV8xXzIoc2Vzc2lvbklkLCBrZXlTdGF0dXNMaXN0LCBoYXNOZXdVc2FibGVLZXkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgUmV0dXJuPHZvaWQ+IHNlbmRTZXNzaW9uTG9zdFN0YXRlKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgICAgICBpZiAobUxpc3RlbmVyVjFfMiAhPSBOVUxMKSB7CisgICAgICAgICAgICBtTGlzdGVuZXJWMV8yLT5zZW5kU2Vzc2lvbkxvc3RTdGF0ZShzZXNzaW9uSWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCiAgICAgUmV0dXJuPHZvaWQ+IGdldFNlY3VyZVN0b3BzKGdldFNlY3VyZVN0b3BzX2NiIF9oaWRsX2NiKTsKIAogICAgIFJldHVybjx2b2lkPiBnZXRTZWN1cmVTdG9wKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZWN1cmVTdG9wSWQsCkBAIC0zMDAsMTggKzM3MywxOSBAQAogcHJpdmF0ZToKICAgICB2b2lkIGluaXRQcm9wZXJ0aWVzKCk7CiAgICAgdm9pZCBpbnN0YWxsU2VjdXJlU3RvcChjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkKTsKKyAgICBib29sIG1ha2VLZXlTZXRJZChzdGQ6OnN0cmluZyoga2V5U2V0SWQpOwogICAgIHZvaWQgc2V0UGxheVBvbGljeSgpOwogCiAgICAgUmV0dXJuPFN0YXR1cz4gc2V0U2VjdXJpdHlMZXZlbChjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAogICAgICAgICAgICAgU2VjdXJpdHlMZXZlbCBsZXZlbCk7CiAKLSAgICBTdGF0dXMgZ2V0S2V5UmVxdWVzdENvbW1vbihjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCisgICAgU3RhdHVzX1YxXzIgZ2V0S2V5UmVxdWVzdENvbW1vbihjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCiAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaW5pdERhdGEsCiAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbWltZVR5cGUsCiAgICAgICAgICAgICBLZXlUeXBlIGtleVR5cGUsCiAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlWYWx1ZT4mIG9wdGlvbmFsUGFyYW1ldGVycywKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpyZXF1ZXN0LAotICAgICAgICAgICAgS2V5UmVxdWVzdFR5cGUgKmdldEtleVJlcXVlc3RUeXBlLAorICAgICAgICAgICAgS2V5UmVxdWVzdFR5cGVfVjFfMSAqZ2V0S2V5UmVxdWVzdFR5cGUsCiAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqZGVmYXVsdFVybCk7CiAKICAgICBzdHJ1Y3QgQ2xlYXJrZXlTZWN1cmVTdG9wIHsKQEAgLTMyMywxOSArMzk3LDMxIEBACiAgICAgc3RkOjp2ZWN0b3I8S2V5VmFsdWU+IG1QbGF5UG9saWN5OwogICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gbVN0cmluZ1Byb3BlcnRpZXM7CiAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ID4gbUJ5dGVBcnJheVByb3BlcnRpZXM7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ID4gbVJlbGVhc2VLZXlzTWFwOwogICAgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBTZWN1cml0eUxldmVsPiBtU2VjdXJpdHlMZXZlbDsKICAgICBzcDxJRHJtUGx1Z2luTGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICBzcDxJRHJtUGx1Z2luTGlzdGVuZXJfVjFfMj4gbUxpc3RlbmVyVjFfMjsKICAgICBTZXNzaW9uTGlicmFyeSAqbVNlc3Npb25MaWJyYXJ5OwogICAgIGludDY0X3QgbU9wZW5TZXNzaW9uT2tDb3VudDsKICAgICBpbnQ2NF90IG1DbG9zZVNlc3Npb25Pa0NvdW50OwogICAgIGludDY0X3QgbUNsb3NlU2Vzc2lvbk5vdE9wZW5lZENvdW50OwogICAgIHVpbnQzMl90IG1OZXh0U2VjdXJlU3RvcElkOwogCisgICAgLy8gc2V0IGJ5IHByb3BlcnR5IHRvIG1vY2sgZXJyb3Igc2NlbmFyaW9zCisgICAgU3RhdHVzX1YxXzIgbU1vY2tFcnJvcjsKKworICAgIHZvaWQgcHJvY2Vzc01vY2tFcnJvcihjb25zdCBzcDxTZXNzaW9uPiAmc2Vzc2lvbikgeworICAgICAgICBzZXNzaW9uLT5zZXRNb2NrRXJyb3IobU1vY2tFcnJvcik7CisgICAgICAgIG1Nb2NrRXJyb3IgPSBTdGF0dXNfVjFfMjo6T0s7CisgICAgfQorCisgICAgRGV2aWNlRmlsZXMgbUZpbGVIYW5kbGU7CisKICAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fQU5EX05FVyhEcm1QbHVnaW4pOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Jbml0RGF0YVBhcnNlci5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0luaXREYXRhUGFyc2VyLmgKaW5kZXggMzE4OWM0YS4uODg5ZjUxMSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0luaXREYXRhUGFyc2VyLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0luaXREYXRhUGFyc2VyLmgKQEAgLTI0LDcgKzI0LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3RhdHVzOwpAQCAtMzQsNyArMzQsOCBAQAogICAgIEluaXREYXRhUGFyc2VyKCkge30KIAogICAgIFN0YXR1cyBwYXJzZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lVHlwZSwKKyAgICAgICAgICAgIFYxXzA6OktleVR5cGUga2V5VHlwZSwKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBsaWNlbnNlUmVxdWVzdCk7CiAKIHByaXZhdGU6CkBAIC00MywxMiArNDQsMTIgQEAKICAgICBTdGF0dXMgcGFyc2VQc3NoKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IHVpbnQ4X3QqPioga2V5SWRzKTsKIAotICAgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlUmVxdWVzdCgKKyAgICBzdGQ6OnN0cmluZyBnZW5lcmF0ZVJlcXVlc3QoVjFfMDo6S2V5VHlwZSBrZXlUeXBlLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgdWludDhfdCo+JiBrZXlJZHMpOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Kc29uV2ViS2V5LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvSnNvbldlYktleS5oCmluZGV4IDRhYjAzNGMuLmU1NzQ3MGMgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Kc29uV2ViS2V5LmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0pzb25XZWJLZXkuaApAQCAtMjMsNyArMjMsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogY2xhc3MgSnNvbldlYktleSB7CkBAIC01NCw3ICs1NCw3IEBACiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL01lbW9yeUZpbGVTeXN0ZW0uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9NZW1vcnlGaWxlU3lzdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNkOWZkNgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9NZW1vcnlGaWxlU3lzdGVtLmgKQEAgLTAsMCArMSw2OCBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBmaWxlIGFuZCBwcm9wcmlldGFyeQorLy8gc291cmNlIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFdpZGV2aW5lIE1hc3RlcgorLy8gTGljZW5zZSBBZ3JlZW1lbnQuCisvLworI2lmbmRlZiBDTEVBUktFWV9NRU1PUllfRklMRV9TWVNURU1fSF8KKyNkZWZpbmUgQ0xFQVJLRVlfTUVNT1JZX0ZJTEVfU1lTVEVNX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMiB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCisvLyBVc2luZyBhbmRyb2lkIGZpbGUgc3lzdGVtIHJlcXVpcmVzIGNsZWFya2V5IHBsdWdpbiB0byB1cGRhdGUKKy8vIGl0cyBzZXBvbGljeS4gSG93ZXZlciwgd2UgYXJlIHVuYWJsZSB0byB1cGRhdGUgc2Vwb2xpY3kgZm9yCisvLyBvbGRlciB2ZW5kb3IgcGFydGl0aW9ucy4gVG8gcHJvdmlkZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LAorLy8gY2xlYXJrZXkgcGx1Z2luIGltcGxlbWVudHMgYSB2ZXJ5IHNpbXBsZSBmaWxlIHN5c3RlbSBpbiBtZW1vcnkuCisvLyBUaGlzIG1lbW9yeSBmaWxlIHN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCitjbGFzcyBNZW1vcnlGaWxlU3lzdGVtIHsKKyBwdWJsaWM6CisgICAgc3RydWN0IE1lbW9yeUZpbGUgeworICAgICAgICBzdGQ6OnN0cmluZyBmaWxlTmFtZTsgIC8vIGV4Y2x1ZGVzIHBhdGgKKyAgICAgICAgc3RkOjpzdHJpbmcgY29udGVudDsKKyAgICAgICAgc2l6ZV90IGZpbGVTaXplOworCisgICAgICAgIHN0ZDo6c3RyaW5nIGdldENvbnRlbnQoKSBjb25zdCB7IHJldHVybiBjb250ZW50OyB9CisgICAgICAgIHNpemVfdCBnZXRGaWxlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGZpbGVTaXplOyB9CisgICAgICAgIHZvaWQgc2V0Q29udGVudChjb25zdCBzdGQ6OnN0cmluZyYgZmlsZSkgeyBjb250ZW50ID0gZmlsZTsgfQorICAgICAgICB2b2lkIHNldEZpbGVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7IGZpbGVOYW1lID0gbmFtZTsgfQorICAgICAgICB2b2lkIHNldEZpbGVTaXplKHNpemVfdCBzaXplKSB7CisgICAgICAgICAgICBjb250ZW50LnJlc2l6ZShzaXplKTsgZmlsZVNpemUgPSBzaXplOworICAgICAgICB9CisgICAgfTsKKworICAgIE1lbW9yeUZpbGVTeXN0ZW0oKSB7fTsKKyAgICB2aXJ0dWFsIH5NZW1vcnlGaWxlU3lzdGVtKCkge307CisKKyAgICBib29sIEZpbGVFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSBjb25zdDsKKyAgICBzc2l6ZV90IEdldEZpbGVTaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3Q7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IExpc3RGaWxlcygpIGNvbnN0OworICAgIHNpemVfdCBSZWFkKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoTmFtZSwgc3RkOjpzdHJpbmcqIGJ1ZmZlcik7CisgICAgYm9vbCBSZW1vdmVBbGxGaWxlcygpOworICAgIGJvb2wgUmVtb3ZlRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpOworICAgIHNpemVfdCBXcml0ZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aE5hbWUsIGNvbnN0IE1lbW9yeUZpbGUmIG1lbW9yeUZpbGUpOworCisgcHJpdmF0ZToKKyAgICAvLyBMaWNlbnNlIGZpbGUgbmFtZSBpcyBtYWRlIHVwIG9mIGEgdW5pcXVlIGtleVNldElkLCB0aGVyZWZvcmUsCisgICAgLy8gdGhlIGZpbGVuYW1lIGNhbiBiZSB1c2VkIGFzIHRoZSBrZXkgdG8gbG9jYXRlIGxpY2Vuc2VzIGluIHRoZQorICAgIC8vIG1lbW9yeSBmaWxlIHN5c3RlbS4KKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgTWVtb3J5RmlsZT4gbU1lbW9yeUZpbGVTeXN0ZW07CisKKyAgICBzdGQ6OnN0cmluZyBHZXRGaWxlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7CisKKyAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oTWVtb3J5RmlsZVN5c3RlbSk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAvLyBuYW1lc3BhY2UgVjFfMgorfSAvLyBuYW1lc3BhY2UgZHJtCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENMRUFSS0VZX01FTU9SWV9GSUxFX1NZU1RFTV9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1Nlc3Npb24uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uLmgKaW5kZXggY2RkZmNhNS4uYTE1OWU1YSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1Nlc3Npb24uaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvU2Vzc2lvbi5oCkBAIC0yNyw0MyArMjcsNTMgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3RhdHVzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdWJTYW1wbGU7CituYW1lc3BhY2UgZHJtID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOwordXNpbmcgZHJtOjpWMV8wOjpTdGF0dXM7Cit1c2luZyBkcm06OlYxXzA6OlN1YlNhbXBsZTsKKwordHlwZWRlZiBkcm06OlYxXzI6OlN0YXR1cyBTdGF0dXNfVjFfMjsKIAogY2xhc3MgU2Vzc2lvbiA6IHB1YmxpYyBSZWZCYXNlIHsKIHB1YmxpYzoKICAgICBleHBsaWNpdCBTZXNzaW9uKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpCi0gICAgICAgICAgICA6IG1TZXNzaW9uSWQoc2Vzc2lvbklkKSB7fQorICAgICAgICA6IG1TZXNzaW9uSWQoc2Vzc2lvbklkKSwgbU1vY2tFcnJvcihTdGF0dXNfVjFfMjo6T0spIHt9CiAgICAgdmlydHVhbCB+U2Vzc2lvbigpIHt9CiAKICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKCkgY29uc3QgeyByZXR1cm4gbVNlc3Npb25JZDsgfQogCiAgICAgU3RhdHVzIGdldEtleVJlcXVlc3QoCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgbWltZVR5cGUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5pdERhdGFUeXBlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluaXREYXRhVHlwZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lVHlwZSwKKyAgICAgICAgICAgIFYxXzA6OktleVR5cGUga2V5VHlwZSwKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBrZXlSZXF1ZXN0KSBjb25zdDsKIAogICAgIFN0YXR1cyBwcm92aWRlS2V5UmVzcG9uc2UoCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcmVzcG9uc2UpOwogCi0gICAgU3RhdHVzIGRlY3J5cHQoCisgICAgU3RhdHVzX1YxXzIgZGVjcnlwdCgKICAgICAgICAgICAgIGNvbnN0IEtleUlkIGtleUlkLCBjb25zdCBJdiBpdiwgY29uc3QgdWludDhfdCogc3JjUHRyLAogICAgICAgICAgICAgdWludDhfdCogZHN0UHRyLCBjb25zdCBzdGQ6OnZlY3RvcjxTdWJTYW1wbGU+IHN1YlNhbXBsZXMsCiAgICAgICAgICAgICBzaXplX3QqIGJ5dGVzRGVjcnlwdGVkT3V0KTsKIAorICAgIHZvaWQgc2V0TW9ja0Vycm9yKFN0YXR1c19WMV8yIGVycm9yKSB7bU1vY2tFcnJvciA9IGVycm9yO30KKyAgICBTdGF0dXNfVjFfMiBnZXRNb2NrRXJyb3IoKSBjb25zdCB7cmV0dXJuIG1Nb2NrRXJyb3I7fQorCiBwcml2YXRlOgogICAgIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTZXNzaW9uKTsKIAogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1TZXNzaW9uSWQ7CiAgICAgS2V5TWFwIG1LZXlNYXA7CiAgICAgTXV0ZXggbU1hcExvY2s7CisKKyAgICAvLyBGb3IgbW9ja2luZyBlcnJvciByZXR1cm4gc2NlbmFyaW9zCisgICAgU3RhdHVzX1YxXzIgbU1vY2tFcnJvcjsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvU2Vzc2lvbkxpYnJhcnkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uTGlicmFyeS5oCmluZGV4IDMyNmEwYzEuLjFlNTY3YjggMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uTGlicmFyeS5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uTGlicmFyeS5oCkBAIC0yNiw3ICsyNiw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OnNwOwpAQCAtNTgsNyArNTgsNyBAQAogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9UeXBlQ29udmVydC5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1R5cGVDb252ZXJ0LmgKaW5kZXggY2MwNjMyOS4uYjBmODYwNyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1R5cGVDb252ZXJ0LmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1R5cGVDb252ZXJ0LmgKQEAgLTI0LDcgKzI0LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7CkBAIC02OCw4ICs2OCwxOSBAQAogICAgIHJldHVybiB2ZWM7CiB9CiAKK2lubGluZSBTdGF0dXMgdG9TdGF0dXNfMV8wKFN0YXR1c19WMV8yIHN0YXR1cykgeworICBzd2l0Y2ggKHN0YXR1cykgeworICAgIGNhc2UgU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfU0VDVVJJVFk6CisgICAgY2FzZSBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0ZSQU1FX1RPT19MQVJHRToKKyAgICBjYXNlIFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fU0VTU0lPTl9MT1NUX1NUQVRFOgorICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX1VOS05PV047CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdGF0dXM+KHN0YXR1cyk7CisgIH0KK30KKwogfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19ICAvLyBuYW1lc3BhY2UgVjFfMQorfSAgLy8gbmFtZXNwYWNlIFYxXzIKIH0gIC8vIG5hbWVzcGFjZSBkcm0KIH0gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvcHJvdG9zL0RldmljZUZpbGVzLnByb3RvIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9wcm90b3MvRGV2aWNlRmlsZXMucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UxMWYwYgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvcHJvdG9zL0RldmljZUZpbGVzLnByb3RvCkBAIC0wLDAgKzEsNDcgQEAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGRldmljZV9maWxlcy5wcm90bworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBmaWxlIGFuZCBwcm9wcmlldGFyeQorLy8gc291cmNlIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFdpZGV2aW5lIE1hc3RlcgorLy8gTGljZW5zZSBBZ3JlZW1lbnQuCisvLworLy8gRGVzY3JpcHRpb246CisvLyAgIEZvcm1hdCBvZiB2YXJpb3VzIGZpbGVzIHN0b3JlZCBhdCB0aGUgZGV2aWNlLgorLy8KK3N5bnRheCA9ICJwcm90bzIiOworCitwYWNrYWdlIGFuZHJvaWQuaGFyZHdhcmUuZHJtLlYxXzIuY2xlYXJrZXk7CisKKy8vIG5lZWQgdGhpcyBpZiB3ZSBhcmUgdXNpbmcgbGlicHJvdG9idWYtY3BwLTIuMy4wLWxpdGUKK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUU7CisKK21lc3NhZ2UgTGljZW5zZSB7CisgIGVudW0gTGljZW5zZVN0YXRlIHsKKyAgICBBQ1RJVkUgPSAxOworICAgIFJFTEVBU0lORyA9IDI7CisgIH0KKworICBvcHRpb25hbCBMaWNlbnNlU3RhdGUgc3RhdGUgPSAxOworICBvcHRpb25hbCBieXRlcyBsaWNlbnNlID0gMjsKK30KKworbWVzc2FnZSBPZmZsaW5lRmlsZSB7CisgIGVudW0gRmlsZVR5cGUgeworICAgIExJQ0VOU0UgPSAxOworICB9CisKKyAgZW51bSBGaWxlVmVyc2lvbiB7CisgICAgVkVSU0lPTl8xID0gMTsKKyAgfQorCisgIG9wdGlvbmFsIEZpbGVUeXBlIHR5cGUgPSAxOworICBvcHRpb25hbCBGaWxlVmVyc2lvbiB2ZXJzaW9uID0gMiBbZGVmYXVsdCA9IFZFUlNJT05fMV07CisgIG9wdGlvbmFsIExpY2Vuc2UgbGljZW5zZSA9IDM7CisKK30KKworbWVzc2FnZSBIYXNoZWRGaWxlIHsKKyAgb3B0aW9uYWwgYnl0ZXMgZmlsZSA9IDE7CisgIC8vIEEgcmF3IChub3QgaGV4LWVuY29kZWQpIFNIQTI1NiwgdGFrZW4gb3ZlciB0aGUgYnl0ZXMgb2YgJ2ZpbGUnLgorICBvcHRpb25hbCBieXRlcyBoYXNoID0gMjsKK30KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvc2VydmljZS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3NlcnZpY2UuY3BwCmluZGV4IDZhOTdiNzIuLmIzOWVhMDEgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvc2VydmljZS5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9zZXJ2aWNlLmNwcApAQCAtMTMsMzIgKzEzLDI0IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotI2RlZmluZSBMT0dfVEFHICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEtc2VydmljZS5jbGVhcmtleSIKLQogI2luY2x1ZGUgPENyeXB0b0ZhY3RvcnkuaD4KICNpbmNsdWRlIDxEcm1GYWN0b3J5Lmg+CiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxMYXp5VXRpbHMuaD4KICNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2w7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpqb2luUnBjVGhyZWFkcG9vbDsKIHVzaW5nIDo6YW5kcm9pZDo6c3A7CiAKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OklDcnlwdG9GYWN0b3J5OwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6SURybUZhY3Rvcnk7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpjbGVhcmtleTo6Q3J5cHRvRmFjdG9yeTsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OmNsZWFya2V5OjpEcm1GYWN0b3J5OwotCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpJQ3J5cHRvRmFjdG9yeTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OklEcm1GYWN0b3J5OwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6Y2xlYXJrZXk6OkNyeXB0b0ZhY3Rvcnk7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpjbGVhcmtleTo6RHJtRmFjdG9yeTsKIAogaW50IG1haW4oaW50IC8qIGFyZ2MgKi8sIGNoYXIqKiAvKiBhcmd2ICovKSB7Ci0gICAgQUxPR0QoImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5IHN0YXJ0aW5nLi4uIik7Ci0KLSAgICAvLyBUaGUgRFJNIEhBTCBtYXkgY29tbXVuaWNhdGUgdG8gb3RoZXIgdmVuZG9yIGNvbXBvbmVudHMgdmlhCi0gICAgLy8gL2Rldi92bmRiaW5kZXIKLSAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OmluaXRXaXRoRHJpdmVyKCIvZGV2L3ZuZGJpbmRlciIpOwotCiAgICAgc3A8SURybUZhY3Rvcnk+IGRybUZhY3RvcnkgPSBuZXcgRHJtRmFjdG9yeTsKICAgICBzcDxJQ3J5cHRvRmFjdG9yeT4gY3J5cHRvRmFjdG9yeSA9IG5ldyBDcnlwdG9GYWN0b3J5OwogCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3NlcnZpY2VMYXp5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvc2VydmljZUxhenkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZmQ4ODMKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3NlcnZpY2VMYXp5LmNwcApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPENyeXB0b0ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxEcm1GYWN0b3J5Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxMYXp5VXRpbHMuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2w7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpqb2luUnBjVGhyZWFkcG9vbDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OklDcnlwdG9GYWN0b3J5OwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6SURybUZhY3Rvcnk7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpjbGVhcmtleTo6Q3J5cHRvRmFjdG9yeTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OmNsZWFya2V5OjpEcm1GYWN0b3J5OwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OkxhenlTZXJ2aWNlUmVnaXN0cmFyOworCitpbnQgbWFpbihpbnQgLyogYXJnYyAqLywgY2hhcioqIC8qIGFyZ3YgKi8pIHsKKyAgICBzcDxJRHJtRmFjdG9yeT4gZHJtRmFjdG9yeSA9IG5ldyBEcm1GYWN0b3J5OworICAgIHNwPElDcnlwdG9GYWN0b3J5PiBjcnlwdG9GYWN0b3J5ID0gbmV3IENyeXB0b0ZhY3Rvcnk7CisKKyAgICBjb25maWd1cmVScGNUaHJlYWRwb29sKDgsIHRydWUgLyogY2FsbGVyV2lsbEpvaW4gKi8pOworCisgICAgLy8gU2V0dXAgaHdiaW5kZXIgc2VydmljZQorICAgIExhenlTZXJ2aWNlUmVnaXN0cmFyIHNlcnZpY2VSZWdpc3RyYXI7CisKKyAgICAvLyBTZXR1cCBod2JpbmRlciBzZXJ2aWNlCisgICAgQ0hFQ0tfRVEoc2VydmljZVJlZ2lzdHJhci5yZWdpc3RlclNlcnZpY2UoZHJtRmFjdG9yeSwgImNsZWFya2V5IiksIGFuZHJvaWQ6Ok5PX0VSUk9SKQorICAgICAgICA8PCAiRmFpbGVkIHRvIHJlZ2lzdGVyIENsZWFya2V5IEZhY3RvcnkgSEFMIjsKKyAgICBDSEVDS19FUShzZXJ2aWNlUmVnaXN0cmFyLnJlZ2lzdGVyU2VydmljZShjcnlwdG9GYWN0b3J5LCAiY2xlYXJrZXkiKSwgYW5kcm9pZDo6Tk9fRVJST1IpCisgICAgICAgIDw8ICJGYWlsZWQgdG8gcmVnaXN0ZXIgQ2xlYXJrZXkgQ3J5cHRvICBIQUwiOworCisgICAgam9pblJwY1RocmVhZHBvb2woKTsKK30KZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29tbW9uX3RpbWUvSUNvbW1vbkNsb2NrLmggYi9pbmNsdWRlL2NvbW1vbl90aW1lL0lDb21tb25DbG9jay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzA3M2YxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29tbW9uX3RpbWUvSUNvbW1vbkNsb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9JQ09NTU9OQ0xPQ0tfSAotI2RlZmluZSBBTkRST0lEX0lDT01NT05DTE9DS19ICi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIElDb21tb25DbG9ja0xpc3RlbmVyIDogcHVibGljIElJbnRlcmZhY2UgewotICBwdWJsaWM6Ci0gICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShDb21tb25DbG9ja0xpc3RlbmVyKTsKLQotICAgIHZpcnR1YWwgdm9pZCBvblRpbWVsaW5lQ2hhbmdlZCh1aW50NjRfdCB0aW1lbGluZUlEKSA9IDA7Ci19OwotCi1jbGFzcyBCbkNvbW1vbkNsb2NrTGlzdGVuZXIgOiBwdWJsaWMgQm5JbnRlcmZhY2U8SUNvbW1vbkNsb2NrTGlzdGVuZXI+IHsKLSAgcHVibGljOgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzID0gMCk7Ci19OwotCi1jbGFzcyBJQ29tbW9uQ2xvY2sgOiBwdWJsaWMgSUludGVyZmFjZSB7Ci0gIHB1YmxpYzoKLSAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKENvbW1vbkNsb2NrKTsKLQotICAgIC8vIE5hbWUgb2YgdGhlIElDb21tb25DbG9jayBzZXJ2aWNlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgc2VydmljZSBtYW5hZ2VyLgotICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBrU2VydmljZU5hbWU7Ci0KLSAgICAvLyBhIHJlc2VydmVkIGludmFsaWQgdGltZWxpbmUgSUQKLSAgICBzdGF0aWMgY29uc3QgdWludDY0X3Qga0ludmFsaWRUaW1lbGluZUlEOwotCi0gICAgLy8gYSByZXNlcnZlZCBpbnZhbGlkIGVycm9yIGVzdGltYXRlCi0gICAgc3RhdGljIGNvbnN0IGludDMyX3Qga0Vycm9yRXN0aW1hdGVVbmtub3duOwotCi0gICAgZW51bSBTdGF0ZSB7Ci0gICAgICAgIC8vIHRoZSBkZXZpY2UganVzdCBjYW1lIHVwIGFuZCBpcyB0cnlpbmcgdG8gZGlzY292ZXIgdGhlIG1hc3RlcgotICAgICAgICBTVEFURV9JTklUSUFMLAotCi0gICAgICAgIC8vIHRoZSBkZXZpY2UgaXMgYSBjbGllbnQgb2YgYSBtYXN0ZXIKLSAgICAgICAgU1RBVEVfQ0xJRU5ULAotCi0gICAgICAgIC8vIHRoZSBkZXZpY2UgaXMgYWN0aW5nIGFzIG1hc3RlcgotICAgICAgICBTVEFURV9NQVNURVIsCi0KLSAgICAgICAgLy8gdGhlIGRldmljZSBoYXMgbG9zdCBjb250YWN0IHdpdGggaXRzIG1hc3RlciBhbmQgbmVlZHMgdG8gcGFydGljaXBhdGUKLSAgICAgICAgLy8gaW4gdGhlIGVsZWN0aW9uIG9mIGEgbmV3IG1hc3RlcgotICAgICAgICBTVEFURV9ST05JTiwKLQotICAgICAgICAvLyB0aGUgZGV2aWNlIGlzIHdhaXRpbmcgZm9yIGFubm91bmNlbWVudCBvZiB0aGUgbmV3bHkgZWxlY3RlZCBtYXN0ZXIKLSAgICAgICAgU1RBVEVfV0FJVF9GT1JfRUxFQ1RJT04sCi0gICAgfTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgaXNDb21tb25UaW1lVmFsaWQoYm9vbCogdmFsaWQsIHVpbnQzMl90KiB0aW1lbGluZUlEKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBjb21tb25UaW1lVG9Mb2NhbFRpbWUoaW50NjRfdCBjb21tb25UaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIGxvY2FsVGltZSkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgbG9jYWxUaW1lVG9Db21tb25UaW1lKGludDY0X3QgbG9jYWxUaW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QqIGNvbW1vblRpbWUpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldENvbW1vblRpbWUoaW50NjRfdCogY29tbW9uVGltZSkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q29tbW9uRnJlcSh1aW50NjRfdCogZnJlcSkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TG9jYWxUaW1lKGludDY0X3QqIGxvY2FsVGltZSkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TG9jYWxGcmVxKHVpbnQ2NF90KiBmcmVxKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFc3RpbWF0ZWRFcnJvcihpbnQzMl90KiBlc3RpbWF0ZSkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VGltZWxpbmVJRCh1aW50NjRfdCogaWQpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN0YXRlKFN0YXRlKiBzdGF0ZSkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyQWRkcihzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSogYWRkcikgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3Rlckxpc3RlbmVyKAotICAgICAgICAgICAgY29uc3Qgc3A8SUNvbW1vbkNsb2NrTGlzdGVuZXI+JiBsaXN0ZW5lcikgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3Rlckxpc3RlbmVyKAotICAgICAgICAgICAgY29uc3Qgc3A8SUNvbW1vbkNsb2NrTGlzdGVuZXI+JiBsaXN0ZW5lcikgPSAwOwotCi0gICAgLy8gU2ltcGxlIGhlbHBlciB0byBtYWtlIGl0IGVhc2llciB0byBjb25uZWN0IHRvIHRoZSBDb21tb25DbG9jayBzZXJ2aWNlLgotICAgIHN0YXRpYyBpbmxpbmUgc3A8SUNvbW1vbkNsb2NrPiBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmNoZWNrU2VydmljZSgKLSAgICAgICAgICAgICAgICBJQ29tbW9uQ2xvY2s6OmtTZXJ2aWNlTmFtZSk7Ci0gICAgICAgIHNwPElDb21tb25DbG9jaz4gY2xrID0gaW50ZXJmYWNlX2Nhc3Q8SUNvbW1vbkNsb2NrPihiaW5kZXIpOwotICAgICAgICByZXR1cm4gY2xrOwotICAgIH0KLX07Ci0KLWNsYXNzIEJuQ29tbW9uQ2xvY2sgOiBwdWJsaWMgQm5JbnRlcmZhY2U8SUNvbW1vbkNsb2NrPiB7Ci0gIHB1YmxpYzoKLSAgICB2aXJ0dWFsIHN0YXR1c190IG9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyA9IDApOwotfTsKLQotfTsgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQU5EUk9JRF9JQ09NTU9OQ0xPQ0tfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb21tb25fdGltZS9JQ29tbW9uVGltZUNvbmZpZy5oIGIvaW5jbHVkZS9jb21tb25fdGltZS9JQ29tbW9uVGltZUNvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTdiNjY2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29tbW9uX3RpbWUvSUNvbW1vblRpbWVDb25maWcuaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSUNPTU1PTlRJTUVDT05GSUdfSAotI2RlZmluZSBBTkRST0lEX0lDT01NT05USU1FQ09ORklHX0gKLQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgU3RyaW5nMTY7Ci0KLWNsYXNzIElDb21tb25UaW1lQ29uZmlnIDogcHVibGljIElJbnRlcmZhY2UgewotICBwdWJsaWM6Ci0gICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShDb21tb25UaW1lQ29uZmlnKTsKLQotICAgIC8vIE5hbWUgb2YgdGhlIElDb21tb25UaW1lQ29uZmlnIHNlcnZpY2UgcmVnaXN0ZXJlZCB3aXRoIHRoZSBzZXJ2aWNlCi0gICAgLy8gbWFuYWdlci4KLSAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYga1NlcnZpY2VOYW1lOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJFbGVjdGlvblByaW9yaXR5KHVpbnQ4X3QgKnByaW9yaXR5KSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJFbGVjdGlvblByaW9yaXR5KHVpbnQ4X3QgcHJpb3JpdHkpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3RlckVsZWN0aW9uRW5kcG9pbnQoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFkZHIpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlckVsZWN0aW9uRW5kcG9pbnQoY29uc3Qgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgKmFkZHIpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3RlckVsZWN0aW9uR3JvdXBJZCh1aW50NjRfdCAqaWQpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlckVsZWN0aW9uR3JvdXBJZCh1aW50NjRfdCBpZCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW50ZXJmYWNlQmluZGluZyhTdHJpbmcxNiYgaWZhY2VOYW1lKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRJbnRlcmZhY2VCaW5kaW5nKGNvbnN0IFN0cmluZzE2JiBpZmFjZU5hbWUpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3RlckFubm91bmNlSW50ZXJ2YWwoaW50ICppbnRlcnZhbCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyQW5ub3VuY2VJbnRlcnZhbChpbnQgaW50ZXJ2YWwpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldENsaWVudFN5bmNJbnRlcnZhbChpbnQgKmludGVydmFsKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDbGllbnRTeW5jSW50ZXJ2YWwoaW50IGludGVydmFsKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYW5pY1RocmVzaG9sZChpbnQgKnRocmVzaG9sZCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFuaWNUaHJlc2hvbGQoaW50IHRocmVzaG9sZCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXV0b0Rpc2FibGUoYm9vbCAqYXV0b0Rpc2FibGUpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1dG9EaXNhYmxlKGJvb2wgYXV0b0Rpc2FibGUpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGZvcmNlTmV0d29ya2xlc3NNYXN0ZXJNb2RlKCkgPSAwOwotCi0gICAgLy8gU2ltcGxlIGhlbHBlciB0byBtYWtlIGl0IGVhc2llciB0byBjb25uZWN0IHRvIHRoZSBDb21tb25UaW1lQ29uZmlnIHNlcnZpY2UuCi0gICAgc3RhdGljIGlubGluZSBzcDxJQ29tbW9uVGltZUNvbmZpZz4gZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5jaGVja1NlcnZpY2UoCi0gICAgICAgICAgICAgICAgSUNvbW1vblRpbWVDb25maWc6OmtTZXJ2aWNlTmFtZSk7Ci0gICAgICAgIHNwPElDb21tb25UaW1lQ29uZmlnPiBjbGsgPSBpbnRlcmZhY2VfY2FzdDxJQ29tbW9uVGltZUNvbmZpZz4oYmluZGVyKTsKLSAgICAgICAgcmV0dXJuIGNsazsKLSAgICB9Ci19OwotCi1jbGFzcyBCbkNvbW1vblRpbWVDb25maWcgOiBwdWJsaWMgQm5JbnRlcmZhY2U8SUNvbW1vblRpbWVDb25maWc+IHsKLSAgcHVibGljOgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHksIHVpbnQzMl90IGZsYWdzID0gMCk7Ci19OwotCi19OyAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBBTkRST0lEX0lDT01NT05USU1FQ09ORklHX0gKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY29tbW9uX3RpbWUvY2NfaGVscGVyLmggYi9pbmNsdWRlL2NvbW1vbl90aW1lL2NjX2hlbHBlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzRkNWMwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29tbW9uX3RpbWUvY2NfaGVscGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBfX0NDX0hFTFBFUl9IX18KLSNkZWZpbmUgX19DQ19IRUxQRVJfSF9fCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxjb21tb25fdGltZS9JQ29tbW9uQ2xvY2suaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gQ0NIZWxwZXIgaXMgYSBzaW1wbGUgd3JhcHBlciBjbGFzcyB0byBoZWxwIHdpdGggY2VudHJhbGl6aW5nIGFjY2VzcyB0byB0aGUKLS8vIENvbW1vbiBDbG9jayBzZXJ2aWNlIGFuZCBpbXBsZW1lbnRpbmcgbGlmZXRpbWUgbWFuYWdtZW50LCBhcyB3ZWxsIGFzIHRvCi0vLyBpbXBsZW1lbnQgYSBzaW1wbGUgcG9saWN5IG9mIG1ha2luZyBhIGJhc2ljIGF0dGVtcHQgdG8gcmVjb25uZWN0IHRvIHRoZQotLy8gY29tbW9uIGNsb2NrIHNlcnZpY2Ugd2hlbiB0aGluZ3MgZ28gd3JvbmcuCi0vLwotLy8gT24gcGxhdGZvcm1zIHdoaWNoIHJ1biB0aGUgbmF0aXZlIGNvbW1vbl90aW1lIHNlcnZpY2UgaW4gYXV0by1kaXNhYmxlIG1vZGUsCi0vLyB0aGUgc2VydmljZSB3aWxsIGdvIGludG8gbmV0d29ya2xlc3MgbW9kZSB3aGVuZXZlciBpdCBoYXMgbm8gYWN0aXZlIGNsaWVudHMuCi0vLyBJdCB0cmFja3MgYWN0aXZlIGNsaWVudHMgdXNpbmcgcmVnaXN0ZXJlZCBDb21tb25DbG9ja0xpc3RlbmVycyAodGhlIGNhbGxiYWNrCi0vLyBpbnRlcmZhY2UgZm9yIG9uVGltZWxpbmVDaGFuZ2VkKSBzaW5jZSB0aGlzIHByb3ZpZGVzIGEgY29udmllbmVudCBkZWF0aAotLy8gaGFuZGxlciBub3RpZmljYXRpb24gZm9yIHdoZW4gdGhlIHNlcnZpY2UncyBjbGllbnRzIGRpZSB1bmV4cGVjdGVkbHkuICBUaGlzCi0vLyBtZWFucyB0aGF0IHVzZXJzIG9mIHRoZSBjb21tb24gdGltZSBzZXJ2aWNlIHNob3VsZCByZWFsbHkgYWx3YXlzIGhhdmUgYQotLy8gQ29tbW9uQ2xvY2tMaXN0ZW5lciwgdW5sZXNzIHRoZXkga25vdyB0aGF0IHRoZSB0aW1lIHNlcnZpY2UgaXMgbm90IHJ1bm5pbmcgaW4KLS8vIGF1dG8gZGlzYWJsZWQgbW9kZSwgb3IgdGhhdCB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgb3RoZXIgcmVnaXN0ZXJlZCBsaXN0ZW5lcgotLy8gYWN0aXZlIGluIHRoZSBzeXN0ZW0uICBUaGUgQ0NIZWxwZXIgbWFrZXMgdGhpcyBhIGxpdHRsZSBlYXNpZXIgYnkgc2hhcmluZyBhCi0vLyByZWYgY291bnRlZCBJQ29tbW9uQ2xvY2sgaW50ZXJmYWNlIGFjcm9zcyBhbGwgY2xpZW50cyBhbmQgYXV0b21hdGljYWxseQotLy8gcmVnaXN0ZXJpbmcgYW5kIHVucmVnaXN0ZXJpbmcgYSBsaXN0ZW5lciB3aGVuZXZlciB0aGVyZSBhcmUgQ0NIZWxwZXIKLS8vIGluc3RhbmNlcyBhY3RpdmUgaW4gdGhlIHByb2Nlc3MuCi1jbGFzcyBDQ0hlbHBlciB7Ci0gIHB1YmxpYzoKLSAgICBDQ0hlbHBlcigpOwotICAgIH5DQ0hlbHBlcigpOwotCi0gICAgc3RhdHVzX3QgaXNDb21tb25UaW1lVmFsaWQoYm9vbCogdmFsaWQsIHVpbnQzMl90KiB0aW1lbGluZUlEKTsKLSAgICBzdGF0dXNfdCBjb21tb25UaW1lVG9Mb2NhbFRpbWUoaW50NjRfdCBjb21tb25UaW1lLCBpbnQ2NF90KiBsb2NhbFRpbWUpOwotICAgIHN0YXR1c190IGxvY2FsVGltZVRvQ29tbW9uVGltZShpbnQ2NF90IGxvY2FsVGltZSwgaW50NjRfdCogY29tbW9uVGltZSk7Ci0gICAgc3RhdHVzX3QgZ2V0Q29tbW9uVGltZShpbnQ2NF90KiBjb21tb25UaW1lKTsKLSAgICBzdGF0dXNfdCBnZXRDb21tb25GcmVxKHVpbnQ2NF90KiBmcmVxKTsKLSAgICBzdGF0dXNfdCBnZXRMb2NhbFRpbWUoaW50NjRfdCogbG9jYWxUaW1lKTsKLSAgICBzdGF0dXNfdCBnZXRMb2NhbEZyZXEodWludDY0X3QqIGZyZXEpOwotCi0gIHByaXZhdGU6Ci0gICAgY2xhc3MgQ29tbW9uQ2xvY2tMaXN0ZW5lciA6IHB1YmxpYyBCbkNvbW1vbkNsb2NrTGlzdGVuZXIgewotICAgICAgcHVibGljOgotICAgICAgICB2b2lkIG9uVGltZWxpbmVDaGFuZ2VkKHVpbnQ2NF90IHRpbWVsaW5lSUQpOwotICAgIH07Ci0KLSAgICBzdGF0aWMgYm9vbCB2ZXJpZnlDbG9ja19sKCk7Ci0KLSAgICBzdGF0aWMgTXV0ZXggbG9ja187Ci0gICAgc3RhdGljIHNwPElDb21tb25DbG9jaz4gY29tbW9uX2Nsb2NrXzsKLSAgICBzdGF0aWMgc3A8SUNvbW1vbkNsb2NrTGlzdGVuZXI+IGNvbW1vbl9jbG9ja19saXN0ZW5lcl87Ci0gICAgc3RhdGljIHVpbnQzMl90IHJlZl9jb3VudF87Ci19OwotCi0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0jZW5kaWYgIC8vIF9fQ0NfSEVMUEVSX0hfXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9jb21tb25fdGltZS9sb2NhbF9jbG9jay5oIGIvaW5jbHVkZS9jb21tb25fdGltZS9sb2NhbF9jbG9jay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODRjM2RlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY29tbW9uX3RpbWUvbG9jYWxfY2xvY2suaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLSNpZm5kZWYgX19MT0NBTF9DTE9DS19IX18KLSNkZWZpbmUgX19MT0NBTF9DTE9DS19IX18KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8aGFyZHdhcmUvbG9jYWxfdGltZV9oYWwuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgTG9jYWxDbG9jayB7Ci0gIHB1YmxpYzoKLSAgICBMb2NhbENsb2NrKCk7Ci0KLSAgICBib29sIGluaXRDaGVjaygpOwotCi0gICAgaW50NjRfdCAgZ2V0TG9jYWxUaW1lKCk7Ci0gICAgdWludDY0X3QgZ2V0TG9jYWxGcmVxKCk7Ci0gICAgc3RhdHVzX3Qgc2V0TG9jYWxTbGV3KGludDE2X3QgcmF0ZSk7Ci0gICAgaW50MzJfdCAgZ2V0RGVidWdMb2coc3RydWN0IGxvY2FsX3RpbWVfZGVidWdfZXZlbnQqIHJlY29yZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9yZWNvcmRzKTsKLQotICBwcml2YXRlOgotICAgIHN0YXRpYyBNdXRleCBkZXZfbG9ja187Ci0gICAgc3RhdGljIGxvY2FsX3RpbWVfaHdfZGV2aWNlX3QqIGRldl87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotI2VuZGlmICAvLyBfX0xPQ0FMX0NMT0NLX0hfXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMjdiYTQ3MQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9Db21tb25UeXBlcy5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0NvbW1vblR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uYWU3Yzk5YQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvQXVkaW9Db21tb25UeXBlcy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Db21tb25UeXBlcy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA1NTg2NTdlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9QcmVzZW50YXRpb25JbmZvLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTFhOTkyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9QcmVzZW50YXRpb25JbmZvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBVURJT19QUkVTRU5UQVRJT05fSU5GT19IXwotI2RlZmluZSBBVURJT19QUkVTRU5UQVRJT05fSU5GT19IXwotCi0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+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+ICopOwordm9pZCBBTWVkaWFGb3JtYXRfZ2V0Rm9ybWF0KGNvbnN0IEFNZWRpYUZvcm1hdCogbURhdGEsIHNwPEFNZXNzYWdlPiAqZGVzdCk7CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9OREtfTUVESUFfRk9STUFUX1BSSVZfSAorCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL1RpbWVDaGVjay5oIGIvaW5jbHVkZS9tZWRpYS9UaW1lQ2hlY2suaAppbmRleCBlM2VmMTM0Li44NWUxN2Y5IDEyMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL1RpbWVDaGVjay5oCisrKyBiL2luY2x1ZGUvbWVkaWEvVGltZUNoZWNrLmgKQEAgLTEgKzEgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVGltZUNoZWNrLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisuLi8uLi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvVGltZUNoZWNrLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL1ZvbHVtZVNoYXBlci5oIGIvaW5jbHVkZS9tZWRpYS9Wb2x1bWVTaGFwZXIuaAppbmRleCBhM2FhZWNlLi43OWFmZDZjIDEwMDY0NAotLS0gYS9pbmNsdWRlL21lZGlhL1ZvbHVtZVNoYXBlci5oCisrKyBiL2luY2x1ZGUvbWVkaWEvVm9sdW1lU2hhcGVyLmgKQEAgLTU1MSw3ICs1NTEsNyBAQAogCiAgICAgc3RhdGljIGludDY0X3QgY29udmVydFRpbWVzcGVjVG9Vcyhjb25zdCBzdHJ1Y3QgdGltZXNwZWMgJnR2KQogICAgIHsKLSAgICAgICAgcmV0dXJuIHR2LnR2X3NlYyAqIDEwMDAwMDBsbCArIHR2LnR2X25zZWMgLyAxMDAwOworICAgICAgICByZXR1cm4gdHYudHZfc2VjICogMTAwMDAwMExMICsgdHYudHZfbnNlYyAvIDEwMDA7CiAgICAgfQogCiAgICAgLy8gY3VycmVudCBtb25vdG9uaWMgdGltZSBpbiBtaWNyb3NlY29uZHMuCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL1ZvcmJpc0NvbW1lbnQuaCBiL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCBhZGFhNDg5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9Wb3JiaXNDb21tZW50LmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhZHJtL0NyeXB0by5oIGIvaW5jbHVkZS9tZWRpYWRybS9DcnlwdG8uaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggOWFmNjQ5NS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhZHJtL0NyeXB0by5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9DcnlwdG8uaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWFkcm0vRHJtLmggYi9pbmNsdWRlL21lZGlhZHJtL0RybS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCBhYzYwMDAzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWFkcm0vRHJtLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaCBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKaW5kZXggY2ExMTlkNS4uNWYxOWY3NCAxMDA2NDQKLS0tIGEvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaAorKysgYi9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCkBAIC01MzgsNiArNTM4LDEwIEBACiAgICAgICAgIG1UaW1lc3RhbXBNdXRhdG9yLnB1c2godGltZXN0YW1wKTsKICAgICB9CiAKKyAgICB2aXJ0dWFsIEV4dGVuZGVkVGltZXN0YW1wIGdldFRpbWVzdGFtcCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UaW1lc3RhbXBNdXRhdG9yLmxhc3QoKTsKKyAgICB9CisKICAgICAvLyBGbHVzaGVzIHRoZSBzaGFyZWQgcmluZyBidWZmZXIgaWYgdGhlIGNsaWVudCBoYWQgcmVxdWVzdGVkIGl0IHVzaW5nIG1TdHJlYW1pbmcubUZsdXNoLgogICAgIC8vIElmIGZsdXNoIG9jY3VycyB0aGVuOgogICAgIC8vICAgY2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udCwgU2VydmVyUHJveHk6Om1GbHVzaCBhbmQgU2VydmVyUHJveHk6Om1GbHVzaGVkIHdpbGwgYmUgbW9kaWZpZWQKQEAgLTU1MSw2ICs1NTUsOSBAQAogICAgIC8vIFRvdGFsIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgZmx1c2hlZCBmcmFtZXMgc2luY2UgY3JlYXRpb24gKG5ldmVyIHJlc2V0KS4KICAgICB2aXJ0dWFsIGludDY0X3QgICAgIGZyYW1lc0ZsdXNoZWQoKSBjb25zdCB7IHJldHVybiBtRmx1c2hlZDsgfQogCisgICAgLy8gU2FmZSBmcmFtZXMgcmVhZHkgcXVlcnkgd2l0aCBubyBzaWRlIGVmZmVjdHMuCisgICAgdmlydHVhbCBzaXplX3QgICAgICBmcmFtZXNSZWFkeVNhZmUoKSBjb25zdCA9IDA7CisKICAgICAvLyBHZXQgZHluYW1pYyBidWZmZXIgc2l6ZSBmcm9tIHRoZSBzaGFyZWQgY29udHJvbCBibG9jay4KICAgICB1aW50MzJfdCAgICAgICAgICAgIGdldEJ1ZmZlclNpemVJbkZyYW1lcygpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgoaW50MzJfdCAqKSZtQ2Jsay0+bUJ1ZmZlclNpemVJbkZyYW1lcyk7CkBAIC01ODgsOCArNTk1LDcgQEAKICAgICAvLyB3aGljaCBtYXkgaW5jbHVkZSBub24tY29udGlndW91cyBmcmFtZXMKICAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGZyYW1lc1JlYWR5KCk7CiAKLSAgICAvLyBTYWZlIGZyYW1lcyByZWFkeSBxdWVyeSB1c2VkIGJ5IGR1bXAoKSAtIHRoaXMgaGFzIG5vIHNpZGUgZWZmZWN0cy4KLSAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGZyYW1lc1JlYWR5U2FmZSgpIGNvbnN0OworICAgIHNpemVfdCAgICAgICAgICAgICAgZnJhbWVzUmVhZHlTYWZlKCkgY29uc3Qgb3ZlcnJpZGU7IC8vIGZyYW1lcyBhdmFpbGFibGUgdG8gcmVhZCBieSBzZXJ2ZXIuCiAKICAgICAvLyBDdXJyZW50bHkgQXVkaW9GbGluZ2VyIHdpbGwgY2FsbCBmcmFtZXNSZWFkeSgpIGZvciBhIGZhc3QgdHJhY2sgZnJvbSB0d28gdGhyZWFkczoKICAgICAvLyBGYXN0TWl4ZXIgdGhyZWFkLCBhbmQgbm9ybWFsIG1peGVyIHRocmVhZC4gIFRoaXMgaXMgZGFuZ2Vyb3VzLCBhcyB0aGUgcHJveHkgaXMgaW50ZW5kZWQKQEAgLTY5Myw2ICs2OTksOCBAQAogICAgICAgICByZXR1cm4gbUNibGstPnUubVN0cmVhbWluZy5tUmVhcjsgLy8gRm9yIGNvbXBsZXRlbmVzcyBvbmx5OyBtUmVhciB3cml0dGVuIGJ5IHNlcnZlci4KICAgICB9CiAKKyAgICBzaXplX3QgZnJhbWVzUmVhZHlTYWZlKCkgY29uc3Qgb3ZlcnJpZGU7IC8vIGZyYW1lcyBhdmFpbGFibGUgdG8gcmVhZCBieSBjbGllbnQuCisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BdWRpb1JlY29yZFNlcnZlclByb3h5KCkgeyB9CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5oIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5oCmluZGV4IDVmZDhlYjIuLmMzNTdjYWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuaAorKysgYi9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmgKQEAgLTQwLDYgKzQwLDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0UmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YU1lbW9yeSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpID0gMDsKIAogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5oIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5oCmluZGV4IGFlMGNiMDEuLjFmYWViMGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuaAorKysgYi9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VySHdTZXJ2aWNlLmgKQEAgLTMzLDEyICszMywxNCBAQAogCiAgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShTb3VuZFRyaWdnZXJId1NlcnZpY2UpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0TW9kdWxlcyhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciAqbW9kdWxlcywKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RNb2R1bGVzKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgKm1vZHVsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcykgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhdHRhY2goY29uc3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJU291bmRUcmlnZ2VyPiYgbW9kdWxlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBhdHRhY2goY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SVNvdW5kVHJpZ2dlcj4mIG1vZHVsZSkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYXB0dXJlU3RhdGUoYm9vbCBhY3RpdmUpID0gMDsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuaCBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oCmluZGV4IDdhMjllMzEuLmNjYzYxZGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oCisrKyBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oCkBAIC0zNiwxMCArMzYsMTIgQEAKIAogICAgIHZpcnR1YWwgflNvdW5kVHJpZ2dlcigpOwogCi0gICAgc3RhdGljICBzdGF0dXNfdCBsaXN0TW9kdWxlcyhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciAqbW9kdWxlcywKKyAgICBzdGF0aWMgIHN0YXR1c190IGxpc3RNb2R1bGVzKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgKm1vZHVsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcyk7Ci0gICAgc3RhdGljICBzcDxTb3VuZFRyaWdnZXI+IGF0dGFjaChjb25zdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTb3VuZFRyaWdnZXJDYWxsYmFjaz4mIGNhbGxiYWNrKTsKKyAgICBzdGF0aWMgIHNwPFNvdW5kVHJpZ2dlcj4gYXR0YWNoKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U291bmRUcmlnZ2VyQ2FsbGJhY2s+JiBjYWxsYmFjayk7CiAKICAgICBzdGF0aWMgIHN0YXR1c190IHNldENhcHR1cmVTdGF0ZShib29sIGFjdGl2ZSk7CiAKQEAgLTUyLDYgKzU0LDcgQEAKIAogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhTWVtb3J5KTsKICAgICAgICAgICAgIHN0YXR1c190IHN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOworICAgICAgICAgICAgc3RhdHVzX3QgZ2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOwogCiAgICAgICAgICAgICAvLyBCcFNvdW5kVHJpZ2dlckNsaWVudAogICAgICAgICAgICAgdmlydHVhbCB2b2lkIG9uUmVjb2duaXRpb25FdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvT1dORVJTIGIvbWVkaWEvT1dORVJTCmluZGV4IGQ0OWViOGQuLjFhZmMyNTMgMTAwNjQ0Ci0tLSBhL21lZGlhL09XTkVSUworKysgYi9tZWRpYS9PV05FUlMKQEAgLTEsOSArMSwxMiBAQAorYW5kcmV3bGV3aXNAZ29vZ2xlLmNvbQogY2h6QGdvb2dsZS5jb20KIGR3a2FuZ0Bnb29nbGUuY29tCiBlbGF1cmVudEBnb29nbGUuY29tCiBlc3NpY2tAZ29vZ2xlLmNvbQorZ2thc3RlbkBnb29nbGUuY29tCiBoa3VhbmdAZ29vZ2xlLmNvbQogaHVuZ2FAZ29vZ2xlLmNvbQoramlhYmluQGdvb2dsZS5jb20KIGptdHJpdmlAZ29vZ2xlLmNvbQoga3JvY2FyZEBnb29nbGUuY29tCiBsYWpvc0Bnb29nbGUuY29tCkBAIC0xNSw1ICsxOCw2IEBACiByYWNoYWRAZ29vZ2xlLmNvbQogcmFnb0Bnb29nbGUuY29tCiByb2JlcnRzaGloQGdvb2dsZS5jb20KK3Rha2xlZUBnb29nbGUuY29tCiB3amlhQGdvb2dsZS5jb20KIHdvbnNpa0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLm1rIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5tawppbmRleCA3MGMyODFhLi4xZjI0NDEzIDEwMDY0NAotLS0gYS9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsKQEAgLTQsNyArNCw2IEBACiAKIExPQ0FMX1NSQ19GSUxFUyA6PSBcCiAJbWFpbl9hdWRpb3NlcnZlci5jcHAgXAotCS4uL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9SZWNvcmQuYWlkbAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJhYXVkaW9zZXJ2aWNlIFwKQEAgLTE3LDkgKzE2LDEyIEBACiAJbGliaHdiaW5kZXIgXAogCWxpYm1lZGlhIFwKIAlsaWJtZWRpYWxvZ3NlcnZpY2UgXAorCWxpYm1lZGlhdXRpbHMgXAogCWxpYm5iYWlvIFwKKwlsaWJuYmxvZyBcCiAJbGlic291bmR0cmlnZ2Vyc2VydmljZSBcCi0JbGlidXRpbHMKKwlsaWJ1dGlscyBcCisJbGlidmlicmF0b3IKIAogIyBUT0RPIG9ib2VzZXJ2aWNlIGlzIHRoZSBvbGQgZm9sZGVyIG5hbWUgZm9yIGFhdWRpb3NlcnZpY2UuIEl0IHdpbGwgYmUgY2hhbmdlZC4KIExPQ0FMX0NfSU5DTFVERVMgOj0gXApAQCAtNDAsOSArNDIsNiBAQAogCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAogCWV4dGVybmFsL3NvbmljIFwKIAotTE9DQUxfQUlETF9JTkNMVURFUyA6PSBcCi0gICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbAotCiAjIElmIEFVRElPU0VSVkVSX01VTFRJTElCIGluIGRldmljZS5tayBpcyBub24tZW1wdHkgdGhlbiBpdCBpcyB1c2VkIHRvIGNvbnRyb2wKICMgdGhlIExPQ0FMX01VTFRJTElCIGZvciBhbGwgYXVkaW9zZXJ2ZXIgZXhjbHVzaXZlIGxpYnJhcmllcy4KICMgVGhpcyBpcyByZWxldmFudCBmb3IgNjQgYml0IGFyY2hpdGVjdHVyZXMgd2hlcmUgZWl0aGVyIG9yIGJvdGgKQEAgLTU0LDEzICs1Myw5IEBACiAjICAgYm90aCAgICB0byBidWlsZCBib3RoIDMyIGJpdCBhbmQgNjQgYml0IGxpYnJhcmllcywKICMgICAgICAgICAgIGFuZCB1c2UgcHJpbWFyeSB0YXJnZXQgYXJjaGl0ZWN0dXJlICgzMiBvciA2NCkgZm9yIGF1ZGlvc2VydmVyLgogIyAgIGZpcnN0ICAgdG8gYnVpbGQgbGlicmFyaWVzIGFuZCBhdWRpb3NlcnZlciBmb3IgdGhlIHByaW1hcnkgdGFyZ2V0IGFyY2hpdGVjdHVyZSBvbmx5LgotIyAgIDxlbXB0eT4gdG8gYnVpbGQgYm90aCAzMiBhbmQgNjQgYml0IGxpYnJhcmllcyBhbmQgMzIgYml0IGF1ZGlvc2VydmVyLgorIyAgIDxlbXB0eT4gdG8gYnVpbGQgYm90aCAzMiBhbmQgNjQgYml0IGxpYnJhcmllcyBhbmQgcHJpbWFyeSB0YXJnZXQgYXVkaW9zZXJ2ZXIuCiAKLWlmZXEgKCQoc3RyaXAgJChBVURJT1NFUlZFUl9NVUxUSUxJQikpLCkKLUxPQ0FMX01VTFRJTElCIDo9IDMyCi1lbHNlCiBMT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQotZW5kaWYKIAogTE9DQUxfTU9EVUxFIDo9IGF1ZGlvc2VydmVyCiAKZGlmZiAtLWdpdCBhL21lZGlhL2F1ZGlvc2VydmVyL2F1ZGlvc2VydmVyLnJjIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvYXVkaW9zZXJ2ZXIucmMKaW5kZXggNzU2NzVhOS4uZGZiMWEzZiAxMDA2NDQKLS0tIGEvbWVkaWEvYXVkaW9zZXJ2ZXIvYXVkaW9zZXJ2ZXIucmMKKysrIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvYXVkaW9zZXJ2ZXIucmMKQEAgLTIsMTAgKzIsMTIgQEAKICAgICBjbGFzcyBjb3JlCiAgICAgdXNlciBhdWRpb3NlcnZlcgogICAgICMgbWVkaWEgZ2lkIG5lZWRlZCBmb3IgL2Rldi9mbSAocmFkaW8pIGFuZCBmb3IgL2RhdGEvbWlzYy9tZWRpYSAodGVlKQotICAgIGdyb3VwIGF1ZGlvIGNhbWVyYSBkcm1ycGMgaW5ldCBtZWRpYSBtZWRpYWRybSBuZXRfYnQgbmV0X2J0X2FkbWluIG5ldF9id19hY2N0CisgICAgZ3JvdXAgYXVkaW8gY2FtZXJhIGRybXJwYyBpbmV0IG1lZGlhIG1lZGlhZHJtIG5ldF9idCBuZXRfYnRfYWRtaW4gbmV0X2J3X2FjY3Qgd2FrZWxvY2sKKyAgICBjYXBhYmlsaXRpZXMgQkxPQ0tfU1VTUEVORAogICAgIGlvcHJpbyBydCA0CiAgICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcyAvZGV2L3N0dW5lL2ZvcmVncm91bmQvdGFza3MKICAgICBvbnJlc3RhcnQgcmVzdGFydCB2ZW5kb3IuYXVkaW8taGFsLTItMAorICAgIG9ucmVzdGFydCByZXN0YXJ0IHZlbmRvci5hdWRpby1oYWwtNC0wLW1zZAogICAgICMgS2VlcCB0aGUgb3JpZ2luYWwgc2VydmljZSBuYW1lIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdoZW4gdXBncmFkaW5nCiAgICAgIyBPLU1SMSBkZXZpY2VzIHdpdGggZnJhbWV3b3JrLW9ubHkuCiAgICAgb25yZXN0YXJ0IHJlc3RhcnQgYXVkaW8taGFsLTItMApAQCAtMTQsMyArMTYsNiBAQAogICAgIHN0b3AgYXVkaW9zZXJ2ZXIKIG9uIHByb3BlcnR5OnZ0cy5uYXRpdmVfc2VydmVyLm9uPTAKICAgICBzdGFydCBhdWRpb3NlcnZlcgorCitvbiBpbml0CisgICAgbWtkaXIgL2Rldi9zb2NrZXQvYXVkaW9zZXJ2ZXIgMDc3NSBhdWRpb3NlcnZlciBhdWRpb3NlcnZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3IuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZGZjMDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3Nvci5jcHAKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQb29sQ29ubmVjdGlvbiIKKworI2luY2x1ZGUgIkFjY2Vzc29yLmgiCisjaW5jbHVkZSAiQWNjZXNzb3JJbXBsLmgiCisjaW5jbHVkZSAiQ29ubmVjdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3ZvaWQgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OjphZGQoCisgICAgICAgIGludDY0X3QgY29ubmVjdGlvbklkLAorICAgICAgICBjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGlmIChtQWNjZXNzb3JzLmZpbmQoY29ubmVjdGlvbklkKSA9PSBtQWNjZXNzb3JzLmVuZCgpKSB7CisgICAgICAgIG1BY2Nlc3NvcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbm5lY3Rpb25JZCwgYWNjZXNzb3IpKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OjpyZW1vdmUoaW50NjRfdCBjb25uZWN0aW9uSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgbUFjY2Vzc29ycy5lcmFzZShjb25uZWN0aW9uSWQpOworICAgIGF1dG8gaXQgPSBtQ29ubmVjdGlvblRvQ29va2llLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAoaXQgIT0gbUNvbm5lY3Rpb25Ub0Nvb2tpZS5lbmQoKSkgeworICAgICAgICB1aW50NjRfdCBjb29raWUgPSBpdC0+c2Vjb25kOworICAgICAgICBtQ29ubmVjdGlvblRvQ29va2llLmVyYXNlKGl0KTsKKyAgICAgICAgYXV0byBjaXQgPSBtQ29va2llVG9Db25uZWN0aW9ucy5maW5kKGNvb2tpZSk7CisgICAgICAgIGlmIChjaXQgIT0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgICAgIGNpdC0+c2Vjb25kLmVyYXNlKGNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICBpZiAoY2l0LT5zZWNvbmQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBtQ29va2llVG9Db25uZWN0aW9ucy5lcmFzZShjaXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDo6YWRkQ29va2llVG9Db25uZWN0aW9uKAorICAgICAgICB1aW50NjRfdCBjb29raWUsCisgICAgICAgIGludDY0X3QgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGlmIChtQWNjZXNzb3JzLmZpbmQoY29ubmVjdGlvbklkKSA9PSBtQWNjZXNzb3JzLmVuZCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUNvbm5lY3Rpb25Ub0Nvb2tpZS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY29ubmVjdGlvbklkLCBjb29raWUpKTsKKyAgICBhdXRvIGl0ID0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZmluZChjb29raWUpOworICAgIGlmIChpdCAhPSBtQ29va2llVG9Db25uZWN0aW9ucy5lbmQoKSkgeworICAgICAgICBpdC0+c2Vjb25kLmluc2VydChjb25uZWN0aW9uSWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Db29raWVUb0Nvbm5lY3Rpb25zLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICBjb29raWUsIHN0ZDo6c2V0PGludDY0X3Q+e2Nvbm5lY3Rpb25JZH0pKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OjpzZXJ2aWNlRGllZCgKKyAgICAgICAgdWludDY0X3QgY29va2llLAorICAgICAgICBjb25zdCB3cDw6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgLyogd2hvICovCisgICAgICAgICkgeworICAgIHN0ZDo6bWFwPGludDY0X3QsIGNvbnN0IHdwPEFjY2Vzc29yPj4gY29ubmVjdGlvbnNUb0Nsb3NlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworCisgICAgICAgIGF1dG8gaXQgPSBtQ29va2llVG9Db25uZWN0aW9ucy5maW5kKGNvb2tpZSk7CisgICAgICAgIGlmIChpdCAhPSBtQ29va2llVG9Db25uZWN0aW9ucy5lbmQoKSkgeworICAgICAgICAgICAgZm9yIChhdXRvIGNvbkl0ID0gaXQtPnNlY29uZC5iZWdpbigpOyBjb25JdCAhPSBpdC0+c2Vjb25kLmVuZCgpOyArK2Nvbkl0KSB7CisgICAgICAgICAgICAgICAgYXV0byBhY2Nlc3Nvckl0ID0gbUFjY2Vzc29ycy5maW5kKCpjb25JdCk7CisgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc29ySXQgIT0gbUFjY2Vzc29ycy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uc1RvQ2xvc2UuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCpjb25JdCwgYWNjZXNzb3JJdC0+c2Vjb25kKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY2Nlc3NvcnMuZXJhc2UoYWNjZXNzb3JJdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uVG9Db29raWUuZXJhc2UoKmNvbkl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db29raWVUb0Nvbm5lY3Rpb25zLmVyYXNlKGl0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjb25uZWN0aW9uc1RvQ2xvc2Uuc2l6ZSgpID4gMCkgeworICAgICAgICBzcDxBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgICAgIGZvciAoYXV0byBpdCA9IGNvbm5lY3Rpb25zVG9DbG9zZS5iZWdpbigpOyBpdCAhPSBjb25uZWN0aW9uc1RvQ2xvc2UuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGFjY2Vzc29yID0gaXQtPnNlY29uZC5wcm9tb3RlKCk7CisKKyAgICAgICAgICAgIGlmIChhY2Nlc3NvcikgeworICAgICAgICAgICAgICAgIGFjY2Vzc29yLT5jbG9zZShpdC0+Zmlyc3QpOworICAgICAgICAgICAgICAgIEFMT0dEKCJjb25uZWN0aW9uICVsbGQgY2xvc2VkIG9uIGRlYXRoIiwgKGxvbmcgbG9uZylpdC0+Zmlyc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCituYW1lc3BhY2Ugeworc3RhdGljIHNwPENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudD4gc0Nvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCA9CisgICAgICAgIG5ldyBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQoKTsKK30KKworc3A8Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50PiBBY2Nlc3Nvcjo6Z2V0Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50KCkgeworICAgIHJldHVybiBzQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OworfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklBY2Nlc3NvciBmb2xsb3cuCitSZXR1cm48dm9pZD4gQWNjZXNzb3I6OmNvbm5lY3QoY29ubmVjdF9jYiBfaGlkbF9jYikgeworICAgIHNwPENvbm5lY3Rpb24+IGNvbm5lY3Rpb247CisgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZDsKKyAgICBjb25zdCBRdWV1ZURlc2NyaXB0b3IqIGZtcURlc2M7CisKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gY29ubmVjdCgmY29ubmVjdGlvbiwgJmNvbm5lY3Rpb25JZCwgJmZtcURlc2MsIGZhbHNlKTsKKyAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBjb25uZWN0aW9uLCBjb25uZWN0aW9uSWQsICpmbXFEZXNjKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfaGlkbF9jYihzdGF0dXMsIG51bGxwdHIsIC0xTEwsCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jPEJ1ZmZlclN0YXR1c01lc3NhZ2U+KAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OmhhcmR3YXJlOjpHcmFudG9yRGVzY3JpcHRvcj4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIG5oYW5kbGUgKi8sIDAgLyogc2l6ZSAqLykpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCitBY2Nlc3Nvcjo6QWNjZXNzb3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IpCisgICAgOiBtSW1wbChuZXcgSW1wbChhbGxvY2F0b3IpKSB7fQorCitBY2Nlc3Nvcjo6fkFjY2Vzc29yKCkgeworfQorCitib29sIEFjY2Vzc29yOjppc1ZhbGlkKCkgeworICAgIHJldHVybiAoYm9vbCltSW1wbDsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjphbGxvY2F0ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgQnVmZmVySWQgKmJ1ZmZlcklkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5hbGxvY2F0ZShjb25uZWN0aW9uSWQsIHBhcmFtcywgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OmZldGNoKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5mZXRjaChjb25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpjb25uZWN0KAorICAgICAgICBzcDxDb25uZWN0aW9uPiAqY29ubmVjdGlvbiwgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkLAorICAgICAgICBjb25zdCBRdWV1ZURlc2NyaXB0b3IqKiBmbXFEZXNjUHRyLCBib29sIGxvY2FsKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtSW1wbC0+Y29ubmVjdCh0aGlzLCBjb25uZWN0aW9uLCBwQ29ubmVjdGlvbklkLCBmbXFEZXNjUHRyKTsKKyAgICAgICAgaWYgKCFsb2NhbCAmJiBzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgc3A8QWNjZXNzb3I+IGFjY2Vzc29yKHRoaXMpOworICAgICAgICAgICAgc0Nvbm5lY3Rpb25EZWF0aFJlY2lwaWVudC0+YWRkKCpwQ29ubmVjdGlvbklkLCBhY2Nlc3Nvcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6Y2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUltcGwtPmNsb3NlKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIHNDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQtPnJlbW92ZShjb25uZWN0aW9uSWQpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKwordm9pZCBBY2Nlc3Nvcjo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgbUltcGwtPmNsZWFuVXAoY2xlYXJDYWNoZSk7CisgICAgfQorfQorCisvL0lBY2Nlc3NvciogSElETF9GRVRDSF9JQWNjZXNzb3IoY29uc3QgY2hhciogLyogbmFtZSAqLykgeworLy8gICAgcmV0dXJuIG5ldyBBY2Nlc3NvcigpOworLy99CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29yLmggYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmODZmN2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3Nvci5oCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9BQ0NFU1NPUl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0FDQ0VTU09SX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8xLjAvSUFjY2Vzc29yLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSAiQnVmZmVyU3RhdHVzLmgiCisKKyNpbmNsdWRlIDxzZXQ+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQWNjZXNzb3I7CitzdHJ1Y3QgQ29ubmVjdGlvbjsKKworLyoqCisgKiBSZWNlaXZlcyBkZWF0aCBub3RpZmljYXRpb25zIGZyb20gcmVtb3RlIGNvbm5lY3Rpb25zLgorICogT24gZGVhdGggbm90aWZpY2F0aW9ucywgdGhlIGNvbm5lY3Rpb25zIGFyZSBjbG9zZWQgYW5kIHVzZWQgcmVzb3VyY2VzCisgKiBhcmUgcmVsZWFzZWQuCisgKi8KK3N0cnVjdCBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQgOiBwdWJsaWMgaGFyZHdhcmU6OmhpZGxfZGVhdGhfcmVjaXBpZW50IHsKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBuZXdseSBjb25uZWN0ZWQgY29ubmVjdGlvbiBmcm9tIHJlbW90ZSBwcm9jZXNzZXMuCisgICAgICovCisgICAgdm9pZCBhZGQoaW50NjRfdCBjb25uZWN0aW9uSWQsIGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhIGNvbm5lY3Rpb24uCisgICAgICovCisgICAgdm9pZCByZW1vdmUoaW50NjRfdCBjb25uZWN0aW9uSWQpOworCisgICAgdm9pZCBhZGRDb29raWVUb0Nvbm5lY3Rpb24odWludDY0X3QgY29va2llLCBpbnQ2NF90IGNvbm5lY3Rpb25JZCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2VydmljZURpZWQoCisgICAgICAgICAgICB1aW50NjRfdCAvKiBjb29raWUgKi8sCisgICAgICAgICAgICBjb25zdCB3cDw6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgLyogd2hvICovCisgICAgICAgICAgICApIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6c2V0PGludDY0X3Q+PiAgbUNvb2tpZVRvQ29ubmVjdGlvbnM7CisgICAgc3RkOjptYXA8aW50NjRfdCwgdWludDY0X3Q+IG1Db25uZWN0aW9uVG9Db29raWU7CisgICAgc3RkOjptYXA8aW50NjRfdCwgY29uc3Qgd3A8QWNjZXNzb3I+PiBtQWNjZXNzb3JzOworfTsKKworLyoqCisgKiBBIGJ1ZmZlciBwb29sIGFjY2Vzc29yIHdoaWNoIGVuYWJsZXMgYSBidWZmZXIgcG9vbCB0byBjb21tdW5pY2F0ZSB3aXRoIGJ1ZmZlcgorICogcG9vbCBjbGllbnRzLiAxOjEgY29ycmVzcG9uZGVuc2UgaG9sZHMgYmV0d2VlbiBhIGJ1ZmZlciBwb29sIGFuZCBhbiBhY2Nlc3Nvci4KKyAqLworc3RydWN0IEFjY2Vzc29yIDogcHVibGljIElBY2Nlc3NvciB7CisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQWNjZXNzb3IgZm9sbG93LgorICAgIFJldHVybjx2b2lkPiBjb25uZWN0KGNvbm5lY3RfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sIGFjY2Vzc29yIHdoaWNoIHVzZXMgdGhlIHNwZWNpZmllZCBhbGxvY2F0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWxsb2NhdG9yIGJ1ZmZlciBhbGxvY2F0b3IuCisgICAgICovCisgICAgZXhwbGljaXQgQWNjZXNzb3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IpOworCisgICAgLyoqIERlc3RydWN0cyBhIGJ1ZmZlciBwb29sIGFjY2Vzc29yLiAqLworICAgIH5BY2Nlc3NvcigpOworCisgICAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgYWNjZXNzb3IgaXMgdmFsaWQuICovCisgICAgYm9vbCBpc1ZhbGlkKCk7CisKKyAgICAvKiogQWxsb2NhdGVzIGEgYnVmZmVyIGZyb20gYSBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBjb25uZWN0aW9uIGlkIG9mIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIHBhcmFtcyAgICAgICAgdGhlIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICogQHBhcmFtIGhhbmRsZSAgICAgICAgdGhlIG5hdGl2ZSBoYW5kbGUgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywKKyAgICAgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBGZXRjaGVzIGEgYnVmZmVyIGZvciB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGlkIG9mIHJlY2VpdmluZyBjb25uZWN0aW9uKGNsaWVudCkuCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uSWQgdGhlIGlkIG9mIHRoZSB0cmFuc2ZlciB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGJ1ZmZlciB0byBiZSBmZXRjaGVkLgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgICAgIHRoZSBuYXRpdmUgaGFuZGxlIG9mIHRoZSBmZXRjaGVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciBpcyBzdWNjZXNzZnVsbHkgZmV0Y2hlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgZmV0Y2goCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpOworCisgICAgLyoqCisgICAgICogTWFrZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBidWZmZXIgcG9vbC4gVGhlIGJ1ZmZlciBwb29sIGNsaWVudCB1c2VzIHRoZQorICAgICAqIGNyZWF0ZWQgY29ubmVjdGlvbiBpbiBvcmRlciB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBidWZmZXIgcG9vbC4gQW4KKyAgICAgKiBGTVEgZm9yIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBpcyBhbHNvIGNyZWF0ZWQgZm9yIHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbiAgICBjcmVhdGVkIGNvbm5lY3Rpb24KKyAgICAgKiBAcGFyYW0gcENvbm5lY3Rpb25JZCB0aGUgaWQgb2YgdGhlIGNyZWF0ZWQgY29ubmVjdGlvbgorICAgICAqIEBwYXJhbSBmbXFEZXNjUHRyICAgIEZNUSBkZXNjcmlwdG9yIGZvciBzaGFyZWQgYnVmZmVyIHN0YXR1cyBtZXNzYWdlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcXVldWUgYmV0d2VlbiBhIGJ1ZmZlciBwb29sIGFuZCB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSBsb2NhbCAgICAgICAgIHRydWUgd2hlbiBhIGNvbm5lY3Rpb24gcmVxdWVzdCBjb21lcyBmcm9tIGxvY2FsIHByb2Nlc3MsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgY29ubmVjdGlvbiBpcyBzdWNjZXNzZnVsbHkgbWFkZS4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgY29ubmVjdCgKKyAgICAgICAgICAgIHNwPENvbm5lY3Rpb24+ICpjb25uZWN0aW9uLCBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQsCisgICAgICAgICAgICBjb25zdCBRdWV1ZURlc2NyaXB0b3IqKiBmbXFEZXNjUHRyLCBib29sIGxvY2FsKTsKKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gdG8gdGhlIGNsaWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgLyoqCisgICAgICogUHJvY2Vzc2VzIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBhbmQgcGVyZm9tcyBwZXJpb2RpYyBjYWNoZQorICAgICAqIGNsZWFuaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGNsZWFyQ2FjaGUgICAgaWYgY2xlYXJDYWNoZSBpcyB0cnVlLCBpdCBmcmVlcyBhbGwgYnVmZmVycyB3YWl0aW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVjeWNsZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgaGlkbF9kZWF0aF9yZWNpcGllbnQgZm9yIHJlbW90ZSBjb25uZWN0aW9uIGRlYXRoLgorICAgICAqLworICAgIHN0YXRpYyBzcDxDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ+IGdldENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCgpOworCitwcml2YXRlOgorICAgIGNsYXNzIEltcGw7CisgICAgc3RkOjp1bmlxdWVfcHRyPEltcGw+IG1JbXBsOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0FDQ0VTU09SX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29ySW1wbC5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3NvckltcGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMTdmMTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3NvckltcGwuY3BwCkBAIC0wLDAgKzEsNTQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQb29sQWNjZXNzb3IiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSAiQWNjZXNzb3JJbXBsLmgiCisjaW5jbHVkZSAiQ29ubmVjdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK25hbWVzcGFjZSB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtDbGVhblVwRHVyYXRpb25VcyA9IDUwMDAwMDsgLy8gVE9ETyB0dW5lIDAuNSBzZWMKKyAgICBzdGF0aWMgY29uc3RleHByIGludDY0X3Qga0xvZ0R1cmF0aW9uVXMgPSA1MDAwMDAwOyAvLyA1IHNlY3MKKworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNaW5BbGxvY0J5dGVzRm9yRXZpY3Rpb24gPSAxMDI0KjEwMjQqMTU7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01pbkJ1ZmZlckNvdW50Rm9yRXZpY3Rpb24gPSA0MDsKK30KKworLy8gQnVmZmVyIHN0cnVjdHVyZSBpbiBidWZmZXJwb29sIHByb2Nlc3MKK3N0cnVjdCBJbnRlcm5hbEJ1ZmZlciB7CisgICAgQnVmZmVySWQgbUlkOworICAgIHNpemVfdCBtT3duZXJDb3VudDsKKyAgICBzaXplX3QgbVRyYW5zYWN0aW9uQ291bnQ7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiBtQWxsb2NhdGlvbjsKKyAgICBjb25zdCBzaXplX3QgbUFsbG9jU2l6ZTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtQ29uZmlnOworCisgICAgSW50ZXJuYWxCdWZmZXIoCisgICAgICAgICAgICBCdWZmZXJJZCBpZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jU2l6ZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZhbGxvY0NvbmZpZykKKyAgICAgICAgICAgIDogbUlkKGlkKSwgbU93bmVyQ291bnQoMCksIG1UcmFuc2FjdGlvbkNvdW50KDApLAorICAgICAgICAgICAgbUFsbG9jYXRpb24oYWxsb2MpLCBtQWxsb2NTaXplKGFsbG9jU2l6ZSksIG1Db25maWcoYWxsb2NDb25maWcpIHt9CisKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uLT5oYW5kbGUoKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgVHJhbnNhY3Rpb25TdGF0dXMgeworICAgIFRyYW5zYWN0aW9uSWQgbUlkOworICAgIEJ1ZmZlcklkIG1CdWZmZXJJZDsKKyAgICBDb25uZWN0aW9uSWQgbVNlbmRlcjsKKyAgICBDb25uZWN0aW9uSWQgbVJlY2VpdmVyOworICAgIEJ1ZmZlclN0YXR1cyBtU3RhdHVzOworICAgIGludDY0X3QgbVRpbWVzdGFtcFVzOworICAgIGJvb2wgbVNlbmRlclZhbGlkYXRlZDsKKworICAgIFRyYW5zYWN0aW9uU3RhdHVzKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UsIGludDY0X3QgdGltZXN0YW1wVXMpIHsKKyAgICAgICAgbUlkID0gbWVzc2FnZS50cmFuc2FjdGlvbklkOworICAgICAgICBtQnVmZmVySWQgPSBtZXNzYWdlLmJ1ZmZlcklkOworICAgICAgICBtU3RhdHVzID0gbWVzc2FnZS5uZXdTdGF0dXM7CisgICAgICAgIG1UaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgICAgICBpZiAobVN0YXR1cyA9PSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RPKSB7CisgICAgICAgICAgICBtU2VuZGVyID0gbWVzc2FnZS5jb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBtUmVjZWl2ZXIgPSBtZXNzYWdlLnRhcmdldENvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIG1TZW5kZXJWYWxpZGF0ZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNlbmRlciA9IC0xTEw7CisgICAgICAgICAgICBtUmVjZWl2ZXIgPSBtZXNzYWdlLmNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIG1TZW5kZXJWYWxpZGF0ZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK307CisKKy8vIEhlbHBlciB0ZW1wbGF0ZSBtZXRob2RzIGZvciBoYW5kbGluZyBtYXAgb2Ygc2V0LgordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KK2Jvb2wgaW5zZXJ0KHN0ZDo6bWFwPFQsIHN0ZDo6c2V0PFU+PiAqbWFwT2ZTZXQsIFQga2V5LCBVIHZhbHVlKSB7CisgICAgYXV0byBpdGVyID0gbWFwT2ZTZXQtPmZpbmQoa2V5KTsKKyAgICBpZiAoaXRlciA9PSBtYXBPZlNldC0+ZW5kKCkpIHsKKyAgICAgICAgc3RkOjpzZXQ8VT4gdmFsdWVTZXR7dmFsdWV9OworICAgICAgICBtYXBPZlNldC0+aW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGtleSwgdmFsdWVTZXQpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChpdGVyLT5zZWNvbmQuZmluZCh2YWx1ZSkgID09IGl0ZXItPnNlY29uZC5lbmQoKSkgeworICAgICAgICBpdGVyLT5zZWNvbmQuaW5zZXJ0KHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KK2Jvb2wgZXJhc2Uoc3RkOjptYXA8VCwgc3RkOjpzZXQ8VT4+ICptYXBPZlNldCwgVCBrZXksIFUgdmFsdWUpIHsKKyAgICBib29sIHJldCA9IGZhbHNlOworICAgIGF1dG8gaXRlciA9IG1hcE9mU2V0LT5maW5kKGtleSk7CisgICAgaWYgKGl0ZXIgIT0gbWFwT2ZTZXQtPmVuZCgpKSB7CisgICAgICAgIGlmIChpdGVyLT5zZWNvbmQuZXJhc2UodmFsdWUpID4gMCkgeworICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXRlci0+c2Vjb25kLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBtYXBPZlNldC0+ZXJhc2UoaXRlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KK2Jvb2wgY29udGFpbnMoc3RkOjptYXA8VCwgc3RkOjpzZXQ8VT4+ICptYXBPZlNldCwgVCBrZXksIFUgdmFsdWUpIHsKKyAgICBhdXRvIGl0ZXIgPSBtYXBPZlNldC0+ZmluZChrZXkpOworICAgIGlmIChpdGVyICE9IG1hcE9mU2V0LT5lbmQoKSkgeworICAgICAgICBhdXRvIHNldEl0ZXIgPSBpdGVyLT5zZWNvbmQuZmluZCh2YWx1ZSk7CisgICAgICAgIHJldHVybiBzZXRJdGVyICE9IGl0ZXItPnNlY29uZC5lbmQoKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbnQzMl90IEFjY2Vzc29yOjpJbXBsOjpzUGlkID0gZ2V0cGlkKCk7Cit1aW50MzJfdCBBY2Nlc3Nvcjo6SW1wbDo6c1NlcUlkID0gdGltZShudWxscHRyKTsKKworQWNjZXNzb3I6OkltcGw6OkltcGwoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yKQorICAgICAgICA6IG1BbGxvY2F0b3IoYWxsb2NhdG9yKSB7fQorCitBY2Nlc3Nvcjo6SW1wbDo6fkltcGwoKSB7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6Y29ubmVjdCgKKyAgICAgICAgY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3Nvciwgc3A8Q29ubmVjdGlvbj4gKmNvbm5lY3Rpb24sCisgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCwgY29uc3QgUXVldWVEZXNjcmlwdG9yKiogZm1xRGVzY1B0cikgeworICAgIHNwPENvbm5lY3Rpb24+IG5ld0Nvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbigpOworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICAgICAgaWYgKG5ld0Nvbm5lY3Rpb24pIHsKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBpZCA9IChpbnQ2NF90KXNQaWQgPDwgMzIgfCBzU2VxSWQ7CisgICAgICAgICAgICBzdGF0dXMgPSBtQnVmZmVyUG9vbC5tT2JzZXJ2ZXIub3BlbihpZCwgZm1xRGVzY1B0cik7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICBuZXdDb25uZWN0aW9uLT5pbml0aWFsaXplKGFjY2Vzc29yLCBpZCk7CisgICAgICAgICAgICAgICAgKmNvbm5lY3Rpb24gPSBuZXdDb25uZWN0aW9uOworICAgICAgICAgICAgICAgICpwQ29ubmVjdGlvbklkID0gaWQ7CisgICAgICAgICAgICAgICAgKytzU2VxSWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgICAgIG1CdWZmZXJQb29sLmNsZWFuVXAoKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjpjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBtQnVmZmVyUG9vbC5oYW5kbGVDbG9zZShjb25uZWN0aW9uSWQpOworICAgIG1CdWZmZXJQb29sLm1PYnNlcnZlci5jbG9zZShjb25uZWN0aW9uSWQpOworICAgIC8vIFNpbmNlIGNsb3NlIyB3aWxsIGJlIGNhbGxlZCBhZnRlciBhbGwgd29ya3MgYXJlIGZpbmlzaGVkLCBpdCBpcyBPSyB0bworICAgIC8vIGV2aWN0IHVudXNlZCBidWZmZXJzLgorICAgIG1CdWZmZXJQb29sLmNsZWFuVXAodHJ1ZSk7CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6YWxsb2NhdGUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsCisgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6T0s7CisgICAgaWYgKCFtQnVmZmVyUG9vbC5nZXRGcmVlQnVmZmVyKG1BbGxvY2F0b3IsIHBhcmFtcywgYnVmZmVySWQsIGhhbmRsZSkpIHsKKyAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgc2l6ZV90IGFsbG9jU2l6ZTsKKyAgICAgICAgc3RhdHVzID0gbUFsbG9jYXRvci0+YWxsb2NhdGUocGFyYW1zLCAmYWxsb2MsICZhbGxvY1NpemUpOworICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBtQnVmZmVyUG9vbC5hZGROZXdCdWZmZXIoYWxsb2MsIGFsbG9jU2l6ZSwgcGFyYW1zLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiY3JlYXRlIGEgYnVmZmVyICVkIDogJXUgJXAiLAorICAgICAgICAgICAgICBzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSywgKmJ1ZmZlcklkLCAqaGFuZGxlKTsKKyAgICB9CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIC8vIFRPRE86IGhhbmRsZSBvd25CdWZmZXIgZmFpbHVyZQorICAgICAgICBtQnVmZmVyUG9vbC5oYW5kbGVPd25CdWZmZXIoY29ubmVjdGlvbklkLCAqYnVmZmVySWQpOworICAgIH0KKyAgICBtQnVmZmVyUG9vbC5jbGVhblVwKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjpmZXRjaCgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBhdXRvIGZvdW5kID0gbUJ1ZmZlclBvb2wubVRyYW5zYWN0aW9ucy5maW5kKHRyYW5zYWN0aW9uSWQpOworICAgIGlmIChmb3VuZCAhPSBtQnVmZmVyUG9vbC5tVHJhbnNhY3Rpb25zLmVuZCgpICYmCisgICAgICAgICAgICBjb250YWlucygmbUJ1ZmZlclBvb2wubVBlbmRpbmdUcmFuc2FjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQpKSB7CisgICAgICAgIGlmIChmb3VuZC0+c2Vjb25kLT5tU2VuZGVyVmFsaWRhdGVkICYmCisgICAgICAgICAgICAgICAgZm91bmQtPnNlY29uZC0+bVN0YXR1cyA9PSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZST00gJiYKKyAgICAgICAgICAgICAgICBmb3VuZC0+c2Vjb25kLT5tQnVmZmVySWQgPT0gYnVmZmVySWQpIHsKKyAgICAgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TdGF0dXMgPSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZFVENIOworICAgICAgICAgICAgYXV0byBidWZmZXJJdCA9IG1CdWZmZXJQb29sLm1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgaWYgKGJ1ZmZlckl0ICE9IG1CdWZmZXJQb29sLm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlclBvb2wubVN0YXRzLm9uQnVmZmVyRmV0Y2hlZCgpOworICAgICAgICAgICAgICAgICpoYW5kbGUgPSBidWZmZXJJdC0+c2Vjb25kLT5oYW5kbGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtQnVmZmVyUG9vbC5jbGVhblVwKCk7CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgLy8gdHJhbnNhY3Rpb24gdGltZW91dCwgYnVmZmVyIGNhY2hlaW5nIFRUTCBoYW5kbGluZworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcChjbGVhckNhY2hlKTsKK30KKworQWNjZXNzb3I6OkltcGw6OkltcGw6OkJ1ZmZlclBvb2w6OkJ1ZmZlclBvb2woKQorICAgIDogbVRpbWVzdGFtcFVzKGdldFRpbWVzdGFtcE5vdygpKSwKKyAgICAgIG1MYXN0Q2xlYW5VcFVzKG1UaW1lc3RhbXBVcyksCisgICAgICBtTGFzdExvZ1VzKG1UaW1lc3RhbXBVcyksCisgICAgICBtU2VxKDApIHt9CisKKworLy8gU3RhdGlzdGljcyBoZWxwZXIKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFM+CitpbnQgcGVyY2VudGFnZShUIGJhc2UsIFMgdG90YWwpIHsKKyAgICByZXR1cm4gaW50KHRvdGFsID8gMC41ICsgMTAwLiAqIHN0YXRpY19jYXN0PFM+KGJhc2UpIC8gdG90YWwgOiAwKTsKK30KKworQWNjZXNzb3I6OkltcGw6OkltcGw6OkJ1ZmZlclBvb2w6On5CdWZmZXJQb29sKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgQUxPR0QoIkRlc3RydWN0aW9uIC0gYnVmZmVycG9vbCAlcCAiCisgICAgICAgICAgImNhY2hlZDogJXp1LyV6dU0sICV6dS8lZCUlIGluIHVzZTsgIgorICAgICAgICAgICJhbGxvY3M6ICV6dSwgJWQlJSByZWN5Y2xlZDsgIgorICAgICAgICAgICJ0cmFuc2ZlcnM6ICV6dSwgJWQlJSB1bmZldGNlZCIsCisgICAgICAgICAgdGhpcywgbVN0YXRzLm1CdWZmZXJzQ2FjaGVkLCBtU3RhdHMubVNpemVDYWNoZWQgPj4gMjAsCisgICAgICAgICAgbVN0YXRzLm1CdWZmZXJzSW5Vc2UsIHBlcmNlbnRhZ2UobVN0YXRzLm1CdWZmZXJzSW5Vc2UsIG1TdGF0cy5tQnVmZmVyc0NhY2hlZCksCisgICAgICAgICAgbVN0YXRzLm1Ub3RhbEFsbG9jYXRpb25zLCBwZXJjZW50YWdlKG1TdGF0cy5tVG90YWxSZWN5Y2xlcywgbVN0YXRzLm1Ub3RhbEFsbG9jYXRpb25zKSwKKyAgICAgICAgICBtU3RhdHMubVRvdGFsVHJhbnNmZXJzLAorICAgICAgICAgIHBlcmNlbnRhZ2UobVN0YXRzLm1Ub3RhbFRyYW5zZmVycyAtIG1TdGF0cy5tVG90YWxGZXRjaGVzLCBtU3RhdHMubVRvdGFsVHJhbnNmZXJzKSk7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZU93bkJ1ZmZlcigKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQpIHsKKworICAgIGJvb2wgYWRkZWQgPSBpbnNlcnQoJm1Vc2luZ0J1ZmZlcnMsIGNvbm5lY3Rpb25JZCwgYnVmZmVySWQpOworICAgIGlmIChhZGRlZCkgeworICAgICAgICBhdXRvIGl0ZXIgPSBtQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgaXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCsrOworICAgIH0KKyAgICBpbnNlcnQoJm1Vc2luZ0Nvbm5lY3Rpb25zLCBidWZmZXJJZCwgY29ubmVjdGlvbklkKTsKKyAgICByZXR1cm4gYWRkZWQ7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZVJlbGVhc2VCdWZmZXIoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkKSB7CisgICAgYm9vbCBkZWxldGVkID0gZXJhc2UoJm1Vc2luZ0J1ZmZlcnMsIGNvbm5lY3Rpb25JZCwgYnVmZmVySWQpOworICAgIGlmIChkZWxldGVkKSB7CisgICAgICAgIGF1dG8gaXRlciA9IG1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICBpdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50LS07CisgICAgICAgIGlmIChpdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAgJiYKKyAgICAgICAgICAgICAgICBpdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChpdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgbUZyZWVCdWZmZXJzLmluc2VydChidWZmZXJJZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgZXJhc2UoJm1Vc2luZ0Nvbm5lY3Rpb25zLCBidWZmZXJJZCwgY29ubmVjdGlvbklkKTsKKyAgICBBTE9HVigicmVsZWFzZSBidWZmZXIgJXUgOiAlZCIsIGJ1ZmZlcklkLCBkZWxldGVkKTsKKyAgICByZXR1cm4gZGVsZXRlZDsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlVHJhbnNmZXJUbyhjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKSB7CisgICAgYXV0byBjb21wbGV0ZWQgPSBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmZpbmQoCisgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGlmIChjb21wbGV0ZWQgIT0gbUNvbXBsZXRlZFRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICAvLyBhbHJlYWR5IGNvbXBsZXRlZAorICAgICAgICBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmVyYXNlKGNvbXBsZXRlZCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyB0aGUgYnVmZmVyIHNob3VsZCBleGlzdCBhbmQgYmUgb3duZWQuCisgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICBpZiAoYnVmZmVySXRlciA9PSBtQnVmZmVycy5lbmQoKSB8fAorICAgICAgICAgICAgIWNvbnRhaW5zKCZtVXNpbmdCdWZmZXJzLCBtZXNzYWdlLmNvbm5lY3Rpb25JZCwgbWVzc2FnZS5idWZmZXJJZCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBhdXRvIGZvdW5kID0gbVRyYW5zYWN0aW9ucy5maW5kKG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGZvdW5kICE9IG1UcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgLy8gdHJhbnNmZXJfZnJvbSB3YXMgcmVjZWl2ZWQgZWFybGllci4KKyAgICAgICAgZm91bmQtPnNlY29uZC0+bVNlbmRlciA9IG1lc3NhZ2UuY29ubmVjdGlvbklkOworICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU2VuZGVyVmFsaWRhdGVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIC8vIFRPRE86IHZlcmlmeSB0aGVyZSBpcyB0YXJnZXQgY29ubmVjdGlvbiBJZAorICAgIG1TdGF0cy5vbkJ1ZmZlclNlbnQoKTsKKyAgICBtVHJhbnNhY3Rpb25zLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8VHJhbnNhY3Rpb25TdGF0dXM+KG1lc3NhZ2UsIG1UaW1lc3RhbXBVcykpKTsKKyAgICBpbnNlcnQoJm1QZW5kaW5nVHJhbnNhY3Rpb25zLCBtZXNzYWdlLnRhcmdldENvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50Kys7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZVRyYW5zZmVyRnJvbShjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKSB7CisgICAgYXV0byBmb3VuZCA9IG1UcmFuc2FjdGlvbnMuZmluZChtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGlmIChmb3VuZCA9PSBtVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIC8vIFRPRE86IGlzIGl0IGZlYXNpYmxlIHRvIGNoZWNrIG93bmVyc2hpcCBoZXJlPworICAgICAgICBtU3RhdHMub25CdWZmZXJTZW50KCk7CisgICAgICAgIG1UcmFuc2FjdGlvbnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPFRyYW5zYWN0aW9uU3RhdHVzPihtZXNzYWdlLCBtVGltZXN0YW1wVXMpKSk7CisgICAgICAgIGluc2VydCgmbVBlbmRpbmdUcmFuc2FjdGlvbnMsIG1lc3NhZ2UuY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICAgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCsrOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtZXNzYWdlLmNvbm5lY3Rpb25JZCA9PSBmb3VuZC0+c2Vjb25kLT5tUmVjZWl2ZXIpIHsKKyAgICAgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TdGF0dXMgPSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZST007CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZVRyYW5zZmVyUmVzdWx0KGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpIHsKKyAgICBhdXRvIGZvdW5kID0gbVRyYW5zYWN0aW9ucy5maW5kKG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGZvdW5kICE9IG1UcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgYm9vbCBkZWxldGVkID0gZXJhc2UoJm1QZW5kaW5nVHJhbnNhY3Rpb25zLCBtZXNzYWdlLmNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICAgICAgaWYgKGRlbGV0ZWQpIHsKKyAgICAgICAgICAgIGlmICghZm91bmQtPnNlY29uZC0+bVNlbmRlclZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgIG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuaW5zZXJ0KG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICAgICAgaWYgKG1lc3NhZ2UubmV3U3RhdHVzID09IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfT0spIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVPd25CdWZmZXIobWVzc2FnZS5jb25uZWN0aW9uSWQsIG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudC0tOworICAgICAgICAgICAgaWYgKGJ1ZmZlckl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMAorICAgICAgICAgICAgICAgICYmIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgIG1GcmVlQnVmZmVycy5pbnNlcnQobWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVHJhbnNhY3Rpb25zLmVyYXNlKGZvdW5kKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigidHJhbnNmZXIgZmluaXNoZWQgJWxsdSAldSAtICVkIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyltZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgIG1lc3NhZ2UuYnVmZmVySWQsIGRlbGV0ZWQpOworICAgICAgICByZXR1cm4gZGVsZXRlZDsKKyAgICB9CisgICAgQUxPR1YoInRyYW5zZmVyIG5vdCBmb3VuZCAlbGx1ICV1IiwgKHVuc2lnbmVkIGxvbmcgbG9uZyltZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpwcm9jZXNzU3RhdHVzTWVzc2FnZXMoKSB7CisgICAgc3RkOjp2ZWN0b3I8QnVmZmVyU3RhdHVzTWVzc2FnZT4gbWVzc2FnZXM7CisgICAgbU9ic2VydmVyLmdldEJ1ZmZlclN0YXR1c0NoYW5nZXMobWVzc2FnZXMpOworICAgIG1UaW1lc3RhbXBVcyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgIGZvciAoQnVmZmVyU3RhdHVzTWVzc2FnZSYgbWVzc2FnZTogbWVzc2FnZXMpIHsKKyAgICAgICAgYm9vbCByZXQgPSBmYWxzZTsKKyAgICAgICAgc3dpdGNoIChtZXNzYWdlLm5ld1N0YXR1cykgeworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6Ok5PVF9VU0VEOgorICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZVJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNvbm5lY3Rpb25JZCwgbWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VVNFRDoKKyAgICAgICAgICAgICAgICAvLyBub3QgaGFwcGVuaW5nCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVE86CisgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlVHJhbnNmZXJUbyhtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GUk9NOgorICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZVRyYW5zZmVyRnJvbShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9USU1FT1VUOgorICAgICAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9MT1NUOgorICAgICAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GRVRDSDoKKyAgICAgICAgICAgICAgICAvLyBub3QgaGFwcGVuaW5nCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfT0s6CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRVJST1I6CisgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlVHJhbnNmZXJSZXN1bHQobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJldCA9PSBmYWxzZSkgeworICAgICAgICAgICAgQUxPR1coImJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBwcm9jZXNzaW5nIGZhaWx1cmUgLSBtZXNzYWdlIDogJWQgY29ubmVjdGlvbiA6ICVsbGQiLAorICAgICAgICAgICAgICAgICAgbWVzc2FnZS5uZXdTdGF0dXMsIChsb25nIGxvbmcpbWVzc2FnZS5jb25uZWN0aW9uSWQpOworICAgICAgICB9CisgICAgfQorICAgIG1lc3NhZ2VzLmNsZWFyKCk7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmhhbmRsZUNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICAvLyBDbGVhbmluZyBidWZmZXJzCisgICAgYXV0byBidWZmZXJzID0gbVVzaW5nQnVmZmVycy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgaWYgKGJ1ZmZlcnMgIT0gbVVzaW5nQnVmZmVycy5lbmQoKSkgeworICAgICAgICBmb3IgKGNvbnN0IEJ1ZmZlcklkJiBidWZmZXJJZCA6IGJ1ZmZlcnMtPnNlY29uZCkgeworICAgICAgICAgICAgYm9vbCBkZWxldGVkID0gZXJhc2UoJm1Vc2luZ0Nvbm5lY3Rpb25zLCBidWZmZXJJZCwgY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIGlmIChkZWxldGVkKSB7CisgICAgICAgICAgICAgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgICAgICAgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tT3duZXJDb3VudC0tOworICAgICAgICAgICAgICAgIGlmIChidWZmZXJJdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgZnJlZWJ1ZmZlciBpbnNlcnQgZmFpbAorICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbUZyZWVCdWZmZXJzLmluc2VydChidWZmZXJJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Vc2luZ0J1ZmZlcnMuZXJhc2UoYnVmZmVycyk7CisgICAgfQorCisgICAgLy8gQ2xlYW5pbmcgdHJhbnNhY3Rpb25zCisgICAgYXV0byBwZW5kaW5nID0gbVBlbmRpbmdUcmFuc2FjdGlvbnMuZmluZChjb25uZWN0aW9uSWQpOworICAgIGlmIChwZW5kaW5nICE9IG1QZW5kaW5nVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIGZvciAoY29uc3QgVHJhbnNhY3Rpb25JZCYgdHJhbnNhY3Rpb25JZCA6IHBlbmRpbmctPnNlY29uZCkgeworICAgICAgICAgICAgYXV0byBpdGVyID0gbVRyYW5zYWN0aW9ucy5maW5kKHRyYW5zYWN0aW9uSWQpOworICAgICAgICAgICAgaWYgKGl0ZXIgIT0gbVRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICAgICAgICAgIGlmICghaXRlci0+c2Vjb25kLT5tU2VuZGVyVmFsaWRhdGVkKSB7CisgICAgICAgICAgICAgICAgICAgIG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuaW5zZXJ0KHRyYW5zYWN0aW9uSWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCA9IGl0ZXItPnNlY29uZC0+bUJ1ZmZlcklkOworICAgICAgICAgICAgICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQtLTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVySXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgZnJlZWJ1ZmZlciBpbnNlcnQgZmFpbAorICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbUZyZWVCdWZmZXJzLmluc2VydChidWZmZXJJZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1UcmFuc2FjdGlvbnMuZXJhc2UoaXRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmdldEZyZWVCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLCBCdWZmZXJJZCAqcElkLAorICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBhdXRvIGJ1ZmZlckl0ID0gbUZyZWVCdWZmZXJzLmJlZ2luKCk7CisgICAgZm9yICg7YnVmZmVySXQgIT0gbUZyZWVCdWZmZXJzLmVuZCgpOyArK2J1ZmZlckl0KSB7CisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkID0gKmJ1ZmZlckl0OworICAgICAgICBpZiAoYWxsb2NhdG9yLT5jb21wYXRpYmxlKHBhcmFtcywgbUJ1ZmZlcnNbYnVmZmVySWRdLT5tQ29uZmlnKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGJ1ZmZlckl0ICE9IG1GcmVlQnVmZmVycy5lbmQoKSkgeworICAgICAgICBCdWZmZXJJZCBpZCA9ICpidWZmZXJJdDsKKyAgICAgICAgbUZyZWVCdWZmZXJzLmVyYXNlKGJ1ZmZlckl0KTsKKyAgICAgICAgbVN0YXRzLm9uQnVmZmVyUmVjeWNsZWQobUJ1ZmZlcnNbaWRdLT5tQWxsb2NTaXplKTsKKyAgICAgICAgKmhhbmRsZSA9IG1CdWZmZXJzW2lkXS0+aGFuZGxlKCk7CisgICAgICAgICpwSWQgPSBpZDsKKyAgICAgICAgQUxPR1YoInJlY3ljbGUgYSBidWZmZXIgJXUgJXAiLCBpZCwgKmhhbmRsZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6YWRkTmV3QnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jU2l6ZSwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgQnVmZmVySWQgKnBJZCwKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisKKyAgICBCdWZmZXJJZCBidWZmZXJJZCA9IG1TZXErKzsKKyAgICBpZiAobVNlcSA9PSBDb25uZWN0aW9uOjpTWU5DX0JVRkZFUklEKSB7CisgICAgICAgIG1TZXEgPSAwOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW50ZXJuYWxCdWZmZXI+IGJ1ZmZlciA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEludGVybmFsQnVmZmVyPigKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVySWQsIGFsbG9jLCBhbGxvY1NpemUsIHBhcmFtcyk7CisgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICBhdXRvIHJlcyA9IG1CdWZmZXJzLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICBidWZmZXJJZCwgc3RkOjptb3ZlKGJ1ZmZlcikpKTsKKyAgICAgICAgaWYgKHJlcy5zZWNvbmQpIHsKKyAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckFsbG9jYXRlZChhbGxvY1NpemUpOworICAgICAgICAgICAgKmhhbmRsZSA9IGFsbG9jLT5oYW5kbGUoKTsKKyAgICAgICAgICAgICpwSWQgPSBidWZmZXJJZDsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpZiAoY2xlYXJDYWNoZSB8fCBtVGltZXN0YW1wVXMgPiBtTGFzdENsZWFuVXBVcyArIGtDbGVhblVwRHVyYXRpb25VcykgeworICAgICAgICBtTGFzdENsZWFuVXBVcyA9IG1UaW1lc3RhbXBVczsKKyAgICAgICAgaWYgKG1UaW1lc3RhbXBVcyA+IG1MYXN0TG9nVXMgKyBrTG9nRHVyYXRpb25VcykgeworICAgICAgICAgICAgbUxhc3RMb2dVcyA9IG1UaW1lc3RhbXBVczsKKyAgICAgICAgICAgIEFMT0dEKCJidWZmZXJwb29sICVwIDogJXp1KCV6dSBzaXplKSB0b3RhbCBidWZmZXJzIC0gIgorICAgICAgICAgICAgICAgICAgIiV6dSglenUgc2l6ZSkgdXNlZCBidWZmZXJzIC0gJXp1LyV6dSAocmVjeWNsZS9hbGxvYykgLSAiCisgICAgICAgICAgICAgICAgICAiJXp1LyV6dSAoZmV0Y2gvdHJhbnNmZXIpIiwKKyAgICAgICAgICAgICAgICAgIHRoaXMsIG1TdGF0cy5tQnVmZmVyc0NhY2hlZCwgbVN0YXRzLm1TaXplQ2FjaGVkLAorICAgICAgICAgICAgICAgICAgbVN0YXRzLm1CdWZmZXJzSW5Vc2UsIG1TdGF0cy5tU2l6ZUluVXNlLAorICAgICAgICAgICAgICAgICAgbVN0YXRzLm1Ub3RhbFJlY3ljbGVzLCBtU3RhdHMubVRvdGFsQWxsb2NhdGlvbnMsCisgICAgICAgICAgICAgICAgICBtU3RhdHMubVRvdGFsRmV0Y2hlcywgbVN0YXRzLm1Ub3RhbFRyYW5zZmVycyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChhdXRvIGZyZWVJdCA9IG1GcmVlQnVmZmVycy5iZWdpbigpOyBmcmVlSXQgIT0gbUZyZWVCdWZmZXJzLmVuZCgpOykgeworICAgICAgICAgICAgaWYgKCFjbGVhckNhY2hlICYmIG1TdGF0cy5tU2l6ZUNhY2hlZCA8IGtNaW5BbGxvY0J5dGVzRm9yRXZpY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgJiYgbUJ1ZmZlcnMuc2l6ZSgpIDwga01pbkJ1ZmZlckNvdW50Rm9yRXZpY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gaXQgPSBtQnVmZmVycy5maW5kKCpmcmVlSXQpOworICAgICAgICAgICAgaWYgKGl0ICE9IG1CdWZmZXJzLmVuZCgpICYmCisgICAgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAgJiYgaXQtPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckV2aWN0ZWQoaXQtPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIGZyZWVJdCA9IG1GcmVlQnVmZmVycy5lcmFzZShmcmVlSXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICArK2ZyZWVJdDsKKyAgICAgICAgICAgICAgICBBTE9HVygiYnVmZmVycG9vbCBpbmNvbnNpc3RlbnQhIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29ySW1wbC5oIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3JJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA0ZGJmMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29ySW1wbC5oCkBAIC0wLDAgKzEsMzAwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9BQ0NFU1NPUklNUExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9BQ0NFU1NPUklNUExfSAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3N0cnVjdCBJbnRlcm5hbEJ1ZmZlcjsKK3N0cnVjdCBUcmFuc2FjdGlvblN0YXR1czsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBhIGJ1ZmZlciBwb29sIGFjY2Vzc29yKG9yIGEgYnVmZmVyIHBvb2wgaW1wbGVtZW50YXRpb24uKSAqLworY2xhc3MgQWNjZXNzb3I6OkltcGwgeworcHVibGljOgorICAgIEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IpOworCisgICAgfkltcGwoKTsKKworICAgIFJlc3VsdFN0YXR1cyBjb25uZWN0KAorICAgICAgICAgICAgY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3Nvciwgc3A8Q29ubmVjdGlvbj4gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQsIGNvbnN0IFF1ZXVlRGVzY3JpcHRvcioqIGZtcURlc2NQdHIpOworCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKTsKKworICAgIFJlc3VsdFN0YXR1cyBmZXRjaChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpOworCisgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSk7CisKK3ByaXZhdGU6CisgICAgLy8gQ29ubmVjdGlvbklkID0gcGlkIDogKHRpbWVzdGFtcF9jcmVhdGVkICsgc2VxSWQpCisgICAgLy8gaW4gb3JkZXIgdG8gZ3VhcmFudGVlIHVuaXF1ZW5lc3MgZm9yIGVhY2ggY29ubmVjdGlvbgorICAgIHN0YXRpYyB1aW50MzJfdCBzU2VxSWQ7CisgICAgc3RhdGljIGludDMyX3Qgc1BpZDsKKworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworCisgICAgLyoqCisgICAgICogQnVmZmVyIHBvb2wgaW1wbGVtZW50YXRpb24uCisgICAgICoKKyAgICAgKiBIYW5kbGVzIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMuIEhhbmRsZXMgYnVmZmVyIGFsbG9jYXRpb24vcmVjeWNsaW5nLgorICAgICAqIEhhbmRsZXMgYnVmZmVyIHRyYW5zZmVyIGJldHdlZW4gYnVmZmVyIHBvb2wgY2xpZW50cy4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgQnVmZmVyUG9vbCB7CisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgICAgIGludDY0X3QgbVRpbWVzdGFtcFVzOworICAgICAgICBpbnQ2NF90IG1MYXN0Q2xlYW5VcFVzOworICAgICAgICBpbnQ2NF90IG1MYXN0TG9nVXM7CisgICAgICAgIEJ1ZmZlcklkIG1TZXE7CisgICAgICAgIEJ1ZmZlclN0YXR1c09ic2VydmVyIG1PYnNlcnZlcjsKKworICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIHN0ZDo6c2V0PEJ1ZmZlcklkPj4gbVVzaW5nQnVmZmVyczsKKyAgICAgICAgc3RkOjptYXA8QnVmZmVySWQsIHN0ZDo6c2V0PENvbm5lY3Rpb25JZD4+IG1Vc2luZ0Nvbm5lY3Rpb25zOworCisgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgc3RkOjpzZXQ8VHJhbnNhY3Rpb25JZD4+IG1QZW5kaW5nVHJhbnNhY3Rpb25zOworICAgICAgICAvLyBUcmFuc2FjdGlvbnMgY29tcGxldGVkIGJlZm9yZSBUUkFOU0ZFUl9UTyBtZXNzYWdlIGFycml2YWwuCisgICAgICAgIC8vIEZldGNoIGRvZXMgbm90IG9jY3VyIGZvciB0aGUgdHJhbnNhY3Rpb25zLgorICAgICAgICAvLyBPbmx5IHRyYW5zYWN0aW9uIGlkIGlzIGtlcHQgZm9yIHRoZSB0cmFuc2FjdGlvbnMgaW4gc2hvcnQgZHVyYXRpb24uCisgICAgICAgIHN0ZDo6c2V0PFRyYW5zYWN0aW9uSWQ+IG1Db21wbGV0ZWRUcmFuc2FjdGlvbnM7CisgICAgICAgIC8vIEN1cnJlbnRseSBhY3RpdmUocGVuZGluZykgdHJhbnNhdGlvbnMnIHN0YXR1cyAmIGluZm9ybWF0aW9uLgorICAgICAgICBzdGQ6Om1hcDxUcmFuc2FjdGlvbklkLCBzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNhY3Rpb25TdGF0dXM+PgorICAgICAgICAgICAgICAgIG1UcmFuc2FjdGlvbnM7CisKKyAgICAgICAgc3RkOjptYXA8QnVmZmVySWQsIHN0ZDo6dW5pcXVlX3B0cjxJbnRlcm5hbEJ1ZmZlcj4+IG1CdWZmZXJzOworICAgICAgICBzdGQ6OnNldDxCdWZmZXJJZD4gbUZyZWVCdWZmZXJzOworCisgICAgICAgIC8vLyBCdWZmZXIgcG9vbCBzdGF0aXN0aWNzIHdoaWNoIHRyYWNrcyBhbGxvY2F0aW9uIGFuZCB0cmFuc2ZlciBzdGF0aXN0aWNzLgorICAgICAgICBzdHJ1Y3QgU3RhdHMgeworICAgICAgICAgICAgLy8vIFRvdGFsIHNpemUgb2YgYWxsb2NhdGlvbnMgd2hpY2ggYXJlIHVzZWQgb3IgYXZhaWxhYmxlIHRvIHVzZS4KKyAgICAgICAgICAgIC8vLyAoYnl0ZXMgb3IgcGl4ZWxzKQorICAgICAgICAgICAgc2l6ZV90IG1TaXplQ2FjaGVkOworICAgICAgICAgICAgLy8vICMgb2YgY2FjaGVkIGJ1ZmZlcnMgd2hpY2ggYXJlIHVzZWQgb3IgYXZhaWxhYmxlIHRvIHVzZS4KKyAgICAgICAgICAgIHNpemVfdCBtQnVmZmVyc0NhY2hlZDsKKyAgICAgICAgICAgIC8vLyBUb3RhbCBzaXplIG9mIGFsbG9jYXRpb25zIHdoaWNoIGFyZSBjdXJyZW50bHkgdXNlZC4gKGJ5dGVzIG9yIHBpeGVscykKKyAgICAgICAgICAgIHNpemVfdCBtU2l6ZUluVXNlOworICAgICAgICAgICAgLy8vICMgb2YgY3VycmVudGx5IHVzZWQgYnVmZmVycworICAgICAgICAgICAgc2l6ZV90IG1CdWZmZXJzSW5Vc2U7CisKKyAgICAgICAgICAgIC8vLyAjIG9mIGFsbG9jYXRpb25zIGNhbGxlZCBvbiBidWZmZXJwb29sLiAoIyBvZiBmZXRjaGVkIGZyb20gQmxvY2tQb29sKQorICAgICAgICAgICAgc2l6ZV90IG1Ub3RhbEFsbG9jYXRpb25zOworICAgICAgICAgICAgLy8vICMgb2YgYWxsb2NhdGlvbnMgdGhhdCB3ZXJlIHNlcnZlZCBmcm9tIHRoZSBjYWNoZS4KKyAgICAgICAgICAgIC8vLyAoIyBvZiBhbGxvY2F0b3IgYWxsb2MgcHJldmVudGVkKQorICAgICAgICAgICAgc2l6ZV90IG1Ub3RhbFJlY3ljbGVzOworICAgICAgICAgICAgLy8vICMgb2YgYnVmZmVyIHRyYW5zZmVycyBpbml0aWF0ZWQuCisgICAgICAgICAgICBzaXplX3QgbVRvdGFsVHJhbnNmZXJzOworICAgICAgICAgICAgLy8vICMgb2YgdHJhbnNmZXJzIHRoYXQgaGFkIHRvIGJlIGZldGNoZWQuCisgICAgICAgICAgICBzaXplX3QgbVRvdGFsRmV0Y2hlczsKKworICAgICAgICAgICAgU3RhdHMoKQorICAgICAgICAgICAgICAgIDogbVNpemVDYWNoZWQoMCksIG1CdWZmZXJzQ2FjaGVkKDApLCBtU2l6ZUluVXNlKDApLCBtQnVmZmVyc0luVXNlKDApLAorICAgICAgICAgICAgICAgICAgbVRvdGFsQWxsb2NhdGlvbnMoMCksIG1Ub3RhbFJlY3ljbGVzKDApLCBtVG90YWxUcmFuc2ZlcnMoMCksIG1Ub3RhbEZldGNoZXMoMCkge30KKworICAgICAgICAgICAgLy8vIEEgbmV3IGJ1ZmZlciBpcyBhbGxvY2F0ZWQgb24gYW4gYWxsb2NhdGlvbiByZXF1ZXN0LgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlckFsbG9jYXRlZChzaXplX3QgYWxsb2NTaXplKSB7CisgICAgICAgICAgICAgICAgbVNpemVDYWNoZWQgKz0gYWxsb2NTaXplOworICAgICAgICAgICAgICAgIG1CdWZmZXJzQ2FjaGVkKys7CisKKyAgICAgICAgICAgICAgICBtU2l6ZUluVXNlICs9IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0luVXNlKys7CisKKyAgICAgICAgICAgICAgICBtVG90YWxBbGxvY2F0aW9ucysrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgaXMgZXZpY3RlZCBhbmQgZGVzdHJveWVkLgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlckV2aWN0ZWQoc2l6ZV90IGFsbG9jU2l6ZSkgeworICAgICAgICAgICAgICAgIG1TaXplQ2FjaGVkIC09IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0NhY2hlZC0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgaXMgcmVjeWNsZWQgb24gYW4gYWxsb2NhdGlvbiByZXF1ZXN0LgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlclJlY3ljbGVkKHNpemVfdCBhbGxvY1NpemUpIHsKKyAgICAgICAgICAgICAgICBtU2l6ZUluVXNlICs9IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0luVXNlKys7CisKKyAgICAgICAgICAgICAgICBtVG90YWxBbGxvY2F0aW9ucysrOworICAgICAgICAgICAgICAgIG1Ub3RhbFJlY3ljbGVzKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciBpcyBhdmFpbGFibGUgdG8gYmUgcmVjeWNsZWQuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyVW51c2VkKHNpemVfdCBhbGxvY1NpemUpIHsKKyAgICAgICAgICAgICAgICBtU2l6ZUluVXNlIC09IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0luVXNlLS07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciB0cmFuc2ZlciBpcyBpbml0aWF0ZWQuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyU2VudCgpIHsKKyAgICAgICAgICAgICAgICBtVG90YWxUcmFuc2ZlcnMrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIEEgYnVmZmVyIGZldGNoIGlzIGludm9rZWQgYnkgYSBidWZmZXIgdHJhbnNmZXIuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyRmV0Y2hlZCgpIHsKKyAgICAgICAgICAgICAgICBtVG90YWxGZXRjaGVzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0gbVN0YXRzOworCisgICAgcHVibGljOgorICAgICAgICAvKiogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sLiAqLworICAgICAgICBCdWZmZXJQb29sKCk7CisKKyAgICAgICAgLyoqIERlc3Ryb3lzIGEgYnVmZmVyIHBvb2wuICovCisgICAgICAgIH5CdWZmZXJQb29sKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByb2Nlc3NlcyBhbGwgcGVuZGluZyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorICAgICAgICAgKiBFYWNoIHN0YXR1cyBtZXNzYWdlIGlzIGhhbmRsZWQgYnkgbWV0aG9kcyB3aXRoICdoYW5kbGUnIHByZWZpeC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgcHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSBidWZmZXIgYmVpbmcgb3duZWQgYnkgYSBjb25uZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgdGhlIGJ1ZmZlciBvd25pbmcgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgdGhlIGlkIG9mIHRoZSBidWZmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGJ1ZmZlciBpcyBvd25lZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlT3duQnVmZmVyKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIGJ1ZmZlciBiZWluZyByZWxlYXNlZCBieSBhIGNvbm5lY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgYnVmZmVyIG93bmluZyBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgYnVmZmVyIG93bmVyc2hpcCBpcyByZWxlYXNlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlUmVsZWFzZUJ1ZmZlcihDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiBzdGFydCBtZXNzYWdlIGZyb20gdGhlIHNlbmRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UgICBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBmb3IgdGhlIHRyYW5zYWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmVzdWx0IHtAY29kZSB0cnVlfSB3aGVuIHRyYW5zZmVyX3RvIG1lc3NhZ2UgaXMgYWNrbm93bGVkZ2VkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVUcmFuc2ZlclRvKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gYmVpbmcgYWNrZWQgYnkgdGhlIHJlY2VpdmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZSAgIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXN1bHQge0Bjb2RlIHRydWV9IHdoZW4gdHJhbnNmZXJfZnJvbSBtZXNzYWdlIGlzIGFja25vd2xlZGdlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlVHJhbnNmZXJGcm9tKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gcmVzdWx0IG1lc3NhZ2UgZnJvbSB0aGUgcmVjZWl2ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtZXNzYWdlICAgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJlc3VsdCB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgZXhpc2l0bmcgdHJhbnNhY3Rpb24gaXMgZmluaXNoZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZVRyYW5zZmVyUmVzdWx0KGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgY29ubmVjdGlvbiBiZWluZyBjbG9zZWQsIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuIEFsbCB0aGUKKyAgICAgICAgICogYnVmZmVycyBhbmQgdHJhbnNhY3Rpb25zIG93bmVkIGJ5IHRoZSBjb25uZWN0aW9uIHdpbGwgYmUgY2xlYW5lZCB1cC4KKyAgICAgICAgICogVGhlIHJlbGF0ZWQgRk1RIHdpbGwgYmUgY2xlYW5lZCB1cCB0b28uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJlc3VsdCB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgY29ubmVjdGlvbiBleGlzdGVkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVDbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVjeWNsZXMgYSBleGlzdGluZyBmcmVlIGJ1ZmZlciBpZiBpdCBpcyBwb3NzaWJsZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFsbG9jYXRvciB0aGUgYnVmZmVyIGFsbG9jYXRvcgorICAgICAgICAgKiBAcGFyYW0gcGFyYW1zICAgIHRoZSBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICAgICAqIEBwYXJhbSBwSWQgICAgICAgdGhlIGlkIG9mIHRoZSByZWN5Y2xlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBoYW5kbGUgICAgdGhlIG5hdGl2ZSBoYW5kbGUgb2YgdGhlIHJlY3ljbGVkIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbiBhIGJ1ZmZlciBpcyByZWN5Y2xlZCwge0Bjb2RlIGZhbHNlfQorICAgICAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgZ2V0RnJlZUJ1ZmZlcigKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpwSWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgYSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyIHRvIGJ1ZmZlcnBvb2wuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbGxvYyAgICAgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBhbGxvY1NpemUgdGhlIHNpemUgb2YgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBwYXJhbXMgICAgdGhlIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgICAgICogQHBhcmFtIHBJZCAgICAgICB0aGUgYnVmZmVyIGlkIGZvciB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgICAgICogQHBhcmFtIGhhbmRsZSAgICB0aGUgbmF0aXZlIGhhbmRsZSBmb3IgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gT0sgd2hlbiBhbiBhbGxvY2F0aW9uIGlzIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQuCisgICAgICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIFJlc3VsdFN0YXR1cyBhZGROZXdCdWZmZXIoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jU2l6ZSwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpwSWQsCisgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUHJvY2Vzc2VzIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBhbmQgcGVyZm9ybXMgcGVyaW9kaWMgY2FjaGUKKyAgICAgICAgICogY2xlYW5pbmcuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjbGVhckNhY2hlICAgIGlmIGNsZWFyQ2FjaGUgaXMgdHJ1ZSwgaXQgZnJlZXMgYWxsIGJ1ZmZlcnMKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgd2FpdGluZyB0byBiZSByZWN5Y2xlZC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUgPSBmYWxzZSk7CisKKyAgICAgICAgZnJpZW5kIGNsYXNzIEFjY2Vzc29yOjpJbXBsOworICAgIH0gbUJ1ZmZlclBvb2w7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgdWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9BQ0NFU1NPUklNUExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQW5kcm9pZC5icCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzdlYTcwZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyOSBAQAorY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMS4wIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHNyY3M6IFsKKyAgICAgICAgIkFjY2Vzc29yLmNwcCIsCisgICAgICAgICJBY2Nlc3NvckltcGwuY3BwIiwKKyAgICAgICAgIkJ1ZmZlclBvb2xDbGllbnQuY3BwIiwKKyAgICAgICAgIkJ1ZmZlclN0YXR1cy5jcHAiLAorICAgICAgICAiQ2xpZW50TWFuYWdlci5jcHAiLAorICAgICAgICAiQ29ubmVjdGlvbi5jcHAiLAorICAgIF0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJod2JpbmRlciIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMS4wIiwKKyAgICBdLAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMS4wIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyUG9vbENsaWVudC5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJQb29sQ2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzEyMzk4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyUG9vbENsaWVudC5jcHAKQEAgLTAsMCArMSw3MTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclBvb2xDbGllbnQiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSAiQnVmZmVyUG9vbENsaWVudC5oIgorI2luY2x1ZGUgIkNvbm5lY3Rpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga1JlY2VpdmVUaW1lb3V0VXMgPSAxMDAwMDAwOyAvLyAxMDBtcworc3RhdGljIGNvbnN0ZXhwciBpbnQga1Bvc3RNYXhSZXRyeSA9IDM7CitzdGF0aWMgY29uc3RleHByIGludCBrQ2FjaGVUdGxVcyA9IDEwMDAwMDA7IC8vIFRPRE86IHR1bmUKKworY2xhc3MgQnVmZmVyUG9vbENsaWVudDo6SW1wbAorICAgICAgICA6IHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw+IHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbXBsKGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IpOworCisgICAgZXhwbGljaXQgSW1wbChjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3Nvcik7CisKKyAgICBib29sIGlzVmFsaWQoKSB7CisgICAgICAgIHJldHVybiBtVmFsaWQ7CisgICAgfQorCisgICAgYm9vbCBpc0xvY2FsKCkgeworICAgICAgICByZXR1cm4gbVZhbGlkICYmIG1Mb2NhbDsKKyAgICB9CisKKyAgICBDb25uZWN0aW9uSWQgZ2V0Q29ubmVjdGlvbklkKCkgeworICAgICAgICByZXR1cm4gbUNvbm5lY3Rpb25JZDsKKyAgICB9CisKKyAgICBzcDxJQWNjZXNzb3I+ICZnZXRBY2Nlc3NvcigpIHsKKyAgICAgICAgcmV0dXJuIG1BY2Nlc3NvcjsKKyAgICB9CisKKyAgICBib29sIGlzQWN0aXZlKGludDY0X3QgKmxhc3RUcmFuc2FjdGlvblVzLCBib29sIGNsZWFyQ2FjaGUpOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIFJlc3VsdFN0YXR1cyByZWNlaXZlKAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICB2b2lkIHBvc3RCdWZmZXJSZWxlYXNlKEJ1ZmZlcklkIGJ1ZmZlcklkKTsKKworICAgIGJvb2wgcG9zdFNlbmQoCisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgQ29ubmVjdGlvbklkIHJlY2VpdmVyLAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwgaW50NjRfdCAqdGltZXN0YW1wVXMpOworcHJpdmF0ZToKKworICAgIGJvb2wgcG9zdFJlY2VpdmUoCisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcyk7CisKKyAgICBib29sIHBvc3RSZWNlaXZlUmVzdWx0KAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgYm9vbCByZXN1bHQsIGJvb2wgKm5lZWRzU3luYyk7CisKKyAgICB2b2lkIHRyeVN5bmNGcm9tUmVtb3RlKCk7CisKKyAgICBib29sIHN5bmNSZWxlYXNlZCgpOworCisgICAgdm9pZCBldmljdENhY2hlcyhib29sIGNsZWFyQ2FjaGUgPSBmYWxzZSk7CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGVCdWZmZXJIYW5kbGUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFyYW1zLCBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgUmVzdWx0U3RhdHVzIGZldGNoQnVmZmVySGFuZGxlKAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICBzdHJ1Y3QgQmxvY2tQb29sRGF0YUR0b3I7CisgICAgc3RydWN0IENsaWVudEJ1ZmZlcjsKKworICAgIGJvb2wgbUxvY2FsOworICAgIGJvb2wgbVZhbGlkOworICAgIHNwPElBY2Nlc3Nvcj4gbUFjY2Vzc29yOworICAgIHNwPENvbm5lY3Rpb24+IG1Mb2NhbENvbm5lY3Rpb247CisgICAgc3A8SUNvbm5lY3Rpb24+IG1SZW1vdGVDb25uZWN0aW9uOworICAgIHVpbnQzMl90IG1TZXFJZDsKKyAgICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKKyAgICBpbnQ2NF90IG1MYXN0RXZpY3RDYWNoZVVzOworCisgICAgLy8gQ2FjaGVkQnVmZmVycworICAgIHN0cnVjdCBCdWZmZXJDYWNoZSB7CisgICAgICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgICAgIGJvb2wgbUNyZWF0aW5nOworICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ3JlYXRlQ3Y7CisgICAgICAgIHN0ZDo6bWFwPEJ1ZmZlcklkLCBzdGQ6OnVuaXF1ZV9wdHI8Q2xpZW50QnVmZmVyPj4gbUJ1ZmZlcnM7CisgICAgICAgIGludCBtQWN0aXZlOworICAgICAgICBpbnQ2NF90IG1MYXN0Q2hhbmdlVXM7CisKKyAgICAgICAgQnVmZmVyQ2FjaGUoKSA6IG1DcmVhdGluZyhmYWxzZSksIG1BY3RpdmUoMCksIG1MYXN0Q2hhbmdlVXMoZ2V0VGltZXN0YW1wTm93KCkpIHt9CisKKyAgICAgICAgdm9pZCBpbmNBY3RpdmVfbCgpIHsKKyAgICAgICAgICAgICsrbUFjdGl2ZTsKKyAgICAgICAgICAgIG1MYXN0Q2hhbmdlVXMgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZGVjQWN0aXZlX2woKSB7CisgICAgICAgICAgICAtLW1BY3RpdmU7CisgICAgICAgICAgICBtTGFzdENoYW5nZVVzID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgIH0KKyAgICB9IG1DYWNoZTsKKworICAgIC8vIEZNUSAtIHJlbGVhc2Ugbm90aWZpZXIKKyAgICBzdHJ1Y3QgeworICAgICAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgICAgICAvLyBUT0RPOiB1c2Ugb25seSBvbmUgbGlzdD8odXNpbmcgb25lIGxpc3QgbWF5IGRlYWx5IHNlbmRpbmcgbWVzc2FnZXM/KQorICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+IG1SZWxlYXNpbmdJZHM7CisgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gbVJlbGVhc2VkSWRzOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzQ2hhbm5lbD4gbVN0YXR1c0NoYW5uZWw7CisgICAgfSBtUmVsZWFzaW5nOworCisgICAgLy8gVGhpcyBsb2NrIGlzIGhlbGQgZHVyaW5nIHN5bmNocm9uaXphdGlvbiBmcm9tIHJlbW90ZSBzaWRlLgorICAgIC8vIEluIG9yZGVyIHRvIG1pbmltaXplIHJlbW90ZSBjYWxscyBhbmQgbG9ja2luZyBkdXJ0YWlvbiwgdGhpcyBsb2NrIGlzIGhlbGQKKyAgICAvLyBieSBiZXN0IGVmZm9ydCBhcHByb2FjaCB1c2luZyB0cnlfbG9jaygpLgorICAgIHN0ZDo6bXV0ZXggbVJlbW90ZVN5bmNMb2NrOworfTsKKworc3RydWN0IEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OkJsb2NrUG9vbERhdGFEdG9yIHsKKyAgICBCbG9ja1Bvb2xEYXRhRHRvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudDo6SW1wbD4gJmltcGwpCisgICAgICAgICAgICA6IG1JbXBsKGltcGwpIHt9CisKKyAgICB2b2lkIG9wZXJhdG9yKCkoQnVmZmVyUG9vbERhdGEgKmJ1ZmZlcikgeworICAgICAgICBCdWZmZXJJZCBpZCA9IGJ1ZmZlci0+bUlkOworICAgICAgICBkZWxldGUgYnVmZmVyOworCisgICAgICAgIGF1dG8gaW1wbCA9IG1JbXBsLmxvY2soKTsKKyAgICAgICAgaWYgKGltcGwgJiYgaW1wbC0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICBpbXBsLT5wb3N0QnVmZmVyUmVsZWFzZShpZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50OjpJbXBsPiBtSW1wbDsKK307CisKK3N0cnVjdCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpDbGllbnRCdWZmZXIgeworcHJpdmF0ZToKKyAgICBib29sIG1JbnZhbGlkYXRlZDsgLy8gVE9ETzogaW1wbGVtZW50CisgICAgaW50NjRfdCBtRXhwaXJlVXM7CisgICAgYm9vbCBtSGFzQ2FjaGU7CisgICAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7CisgICAgQnVmZmVySWQgbUlkOworICAgIG5hdGl2ZV9oYW5kbGVfdCAqbUhhbmRsZTsKKyAgICBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xEYXRhPiBtQ2FjaGU7CisKKyAgICB2b2lkIHVwZGF0ZUV4cGlyZSgpIHsKKyAgICAgICAgbUV4cGlyZVVzID0gZ2V0VGltZXN0YW1wTm93KCkgKyBrQ2FjaGVUdGxVczsKKyAgICB9CisKK3B1YmxpYzoKKyAgICBDbGllbnRCdWZmZXIoCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBpZCwgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUpCisgICAgICAgICAgICA6IG1JbnZhbGlkYXRlZChmYWxzZSksIG1IYXNDYWNoZShmYWxzZSksCisgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQoY29ubmVjdGlvbklkKSwgbUlkKGlkKSwgbUhhbmRsZShoYW5kbGUpIHsKKyAgICAgICAgKHZvaWQpbUludmFsaWRhdGVkOworICAgICAgICBtRXhwaXJlVXMgPSBnZXRUaW1lc3RhbXBOb3coKSArIGtDYWNoZVR0bFVzOworICAgIH0KKworICAgIH5DbGllbnRCdWZmZXIoKSB7CisgICAgICAgIGlmIChtSGFuZGxlKSB7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKG1IYW5kbGUpOworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobUhhbmRsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGV4cGlyZSgpIGNvbnN0IHsKKyAgICAgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgcmV0dXJuIG5vdyA+PSBtRXhwaXJlVXM7CisgICAgfQorCisgICAgYm9vbCBoYXNDYWNoZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1IYXNDYWNoZTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGZldGNoQ2FjaGUobmF0aXZlX2hhbmRsZV90ICoqcEhhbmRsZSkgeworICAgICAgICBpZiAobUhhc0NhY2hlKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGNhY2hlID0gbUNhY2hlLmxvY2soKTsKKyAgICAgICAgICAgIGlmIChjYWNoZSkgeworICAgICAgICAgICAgICAgICpwSGFuZGxlID0gbUhhbmRsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjYWNoZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGNyZWF0ZUNhY2hlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw+ICZpbXBsLAorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqcEhhbmRsZSkgeworICAgICAgICBpZiAoIW1IYXNDYWNoZSkgeworICAgICAgICAgICAgLy8gQWxsb2NhdGVzIGEgcmF3IHB0ciBpbiBvcmRlciB0byBhdm9pZCBzZW5kaW5nICNwb3N0QnVmZmVyUmVsZWFzZQorICAgICAgICAgICAgLy8gZnJvbSBkZWxldGVyLCBpbiBjYXNlIG9mIG5hdGl2ZV9oYW5kbGVfY2xvbmUgZmFpbHVyZS4KKyAgICAgICAgICAgIEJ1ZmZlclBvb2xEYXRhICpwdHIgPSBuZXcgQnVmZmVyUG9vbERhdGEobUNvbm5lY3Rpb25JZCwgbUlkKTsKKyAgICAgICAgICAgIGlmIChwdHIpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGNhY2hlKHB0ciwgQmxvY2tQb29sRGF0YUR0b3IoaW1wbCkpOworICAgICAgICAgICAgICAgIGlmIChjYWNoZSkgeworICAgICAgICAgICAgICAgICAgICBtQ2FjaGUgPSBjYWNoZTsKKyAgICAgICAgICAgICAgICAgICAgbUhhc0NhY2hlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgKnBIYW5kbGUgPSBtSGFuZGxlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHB0cikgeworICAgICAgICAgICAgICAgIGRlbGV0ZSBwdHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgYm9vbCBvbkNhY2hlUmVsZWFzZSgpIHsKKyAgICAgICAgaWYgKG1IYXNDYWNoZSkgeworICAgICAgICAgICAgLy8gVE9ETzogdmVyaWZ5IG1DYWNoZSBpcyBub3QgdmFsaWQ7CisgICAgICAgICAgICB1cGRhdGVFeHBpcmUoKTsKKyAgICAgICAgICAgIG1IYXNDYWNoZSA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK307CisKK0J1ZmZlclBvb2xDbGllbnQ6OkltcGw6OkltcGwoY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvcikKKyAgICA6IG1Mb2NhbCh0cnVlKSwgbVZhbGlkKGZhbHNlKSwgbUFjY2Vzc29yKGFjY2Vzc29yKSwgbVNlcUlkKDApLAorICAgICAgbUxhc3RFdmljdENhY2hlVXMoZ2V0VGltZXN0YW1wTm93KCkpIHsKKyAgICBjb25zdCBRdWV1ZURlc2NyaXB0b3IgKmZtcURlc2M7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IGFjY2Vzc29yLT5jb25uZWN0KAorICAgICAgICAgICAgJm1Mb2NhbENvbm5lY3Rpb24sICZtQ29ubmVjdGlvbklkLCAmZm1xRGVzYywgdHJ1ZSk7CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwgPQorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVyU3RhdHVzQ2hhbm5lbD4oKmZtcURlc2MpOworICAgICAgICBtVmFsaWQgPSBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsICYmCisgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+aXNWYWxpZCgpOworICAgIH0KK30KKworQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6SW1wbChjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3NvcikKKyAgICA6IG1Mb2NhbChmYWxzZSksIG1WYWxpZChmYWxzZSksIG1BY2Nlc3NvcihhY2Nlc3NvciksIG1TZXFJZCgwKSwKKyAgICAgIG1MYXN0RXZpY3RDYWNoZVVzKGdldFRpbWVzdGFtcE5vdygpKSB7CisgICAgYm9vbCB2YWxpZCA9IGZhbHNlOworICAgIHNwPElDb25uZWN0aW9uPiYgb3V0Q29ubmVjdGlvbiA9IG1SZW1vdGVDb25uZWN0aW9uOworICAgIENvbm5lY3Rpb25JZCYgaWQgPSBtQ29ubmVjdGlvbklkOworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNDaGFubmVsPiYgb3V0Q2hhbm5lbCA9CisgICAgICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsOworICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IGFjY2Vzc29yLT5jb25uZWN0KAorICAgICAgICAgICAgWyZ2YWxpZCwgJm91dENvbm5lY3Rpb24sICZpZCwgJm91dENoYW5uZWxdCisgICAgICAgICAgICAoUmVzdWx0U3RhdHVzIHN0YXR1cywgc3A8SUNvbm5lY3Rpb24+IGNvbm5lY3Rpb24sCisgICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgY29uc3QgUXVldWVEZXNjcmlwdG9yJiBkZXNjKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIG91dENvbm5lY3Rpb24gPSBjb25uZWN0aW9uOworICAgICAgICAgICAgICAgICAgICBpZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgICAgICAgICAgb3V0Q2hhbm5lbCA9IHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVyU3RhdHVzQ2hhbm5lbD4oZGVzYyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRDaGFubmVsICYmIG91dENoYW5uZWwtPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgbVZhbGlkID0gdHJhbnNSZXN1bHQuaXNPaygpICYmIHZhbGlkOworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmlzQWN0aXZlKGludDY0X3QgKmxhc3RUcmFuc2FjdGlvblVzLCBib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBib29sIGFjdGl2ZSA9IGZhbHNlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1Mb2NrKTsKKyAgICAgICAgc3luY1JlbGVhc2VkKCk7CisgICAgICAgIGV2aWN0Q2FjaGVzKGNsZWFyQ2FjaGUpOworICAgICAgICAqbGFzdFRyYW5zYWN0aW9uVXMgPSBtQ2FjaGUubUxhc3RDaGFuZ2VVczsKKyAgICAgICAgYWN0aXZlID0gbUNhY2hlLm1BY3RpdmUgPiAwOworICAgIH0KKyAgICBpZiAobVZhbGlkICYmIG1Mb2NhbCAmJiBtTG9jYWxDb25uZWN0aW9uKSB7CisgICAgICAgIG1Mb2NhbENvbm5lY3Rpb24tPmNsZWFuVXAoY2xlYXJDYWNoZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gYWN0aXZlOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6YWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKnBIYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmICghbUxvY2FsIHx8ICFtTG9jYWxDb25uZWN0aW9uIHx8ICFtVmFsaWQpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIEJ1ZmZlcklkIGJ1ZmZlcklkOworICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gbnVsbHB0cjsKKyAgICBidWZmZXItPnJlc2V0KCk7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IGFsbG9jYXRlQnVmZmVySGFuZGxlKHBhcmFtcywgJmJ1ZmZlcklkLCAmaGFuZGxlKTsKKyAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgaWYgKGhhbmRsZSkgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTG9jayk7CisgICAgICAgICAgICBzeW5jUmVsZWFzZWQoKTsKKyAgICAgICAgICAgIGV2aWN0Q2FjaGVzKCk7CisgICAgICAgICAgICBhdXRvIGNhY2hlSXQgPSBtQ2FjaGUubUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgICAgICBpZiAoY2FjaGVJdCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiB2ZXJpZnkgaXQgaXMgcmVjeWNsZWQuIChub3QgaGF2aW5nIGFjdGl2ZSByZWYpCisgICAgICAgICAgICAgICAgbUNhY2hlLm1CdWZmZXJzLmVyYXNlKGNhY2hlSXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0byBjbGllbnRCdWZmZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENsaWVudEJ1ZmZlcj4oCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgICAgICAgICAgaWYgKGNsaWVudEJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gbUNhY2hlLm1CdWZmZXJzLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcklkLCBzdGQ6Om1vdmUoY2xpZW50QnVmZmVyKSkpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSByZXN1bHQuZmlyc3QtPnNlY29uZC0+Y3JlYXRlQ2FjaGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX2Zyb21fdGhpcygpLCBwSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYWNoZS5pbmNBY3RpdmVfbCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghKmJ1ZmZlcikgeworICAgICAgICAgICAgQUxPR1YoImNsaWVudCBjYWNoZSBjcmVhdGlvbiBmYWlsdXJlICVkOiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgIGhhbmRsZSAhPSBudWxscHRyLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICBwb3N0QnVmZmVyUmVsZWFzZShidWZmZXJJZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnJlY2VpdmUoCisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKnBIYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmICghbVZhbGlkKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBpZiAodGltZXN0YW1wVXMgIT0gMCkgeworICAgICAgICB0aW1lc3RhbXBVcyArPSBrUmVjZWl2ZVRpbWVvdXRVczsKKyAgICB9CisgICAgaWYgKCFwb3N0UmVjZWl2ZShidWZmZXJJZCwgdHJhbnNhY3Rpb25JZCwgdGltZXN0YW1wVXMpKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICBidWZmZXItPnJlc2V0KCk7CisgICAgd2hpbGUoMSkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1Mb2NrKTsKKyAgICAgICAgc3luY1JlbGVhc2VkKCk7CisgICAgICAgIGV2aWN0Q2FjaGVzKCk7CisgICAgICAgIGF1dG8gY2FjaGVJdCA9IG1DYWNoZS5tQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgaWYgKGNhY2hlSXQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICBpZiAoY2FjaGVJdC0+c2Vjb25kLT5oYXNDYWNoZSgpKSB7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGNhY2hlSXQtPnNlY29uZC0+ZmV0Y2hDYWNoZShwSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAoISpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdHJhbnNmZXIgdGltZV9vdXQKKyAgICAgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6eWllbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgcmVjZWl2ZSBmcm9tIHJlZmVyZW5jZSAlbGxkIiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGNhY2hlSXQtPnNlY29uZC0+Y3JlYXRlQ2FjaGUoc2hhcmVkX2Zyb21fdGhpcygpLCBwSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAoKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICBtQ2FjaGUuaW5jQWN0aXZlX2woKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoImNsaWVudCByZWNlaXZlIGZyb20gY2FjaGUgJWxsZCIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIW1DYWNoZS5tQ3JlYXRpbmcpIHsKKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNyZWF0aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBmZXRjaEJ1ZmZlckhhbmRsZSh0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgJmhhbmRsZSk7CisgICAgICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gY2xpZW50QnVmZmVyID0gc3RkOjptYWtlX3VuaXF1ZTxDbGllbnRCdWZmZXI+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGllbnRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IG1DYWNoZS5tQnVmZmVycy5pbnNlcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihidWZmZXJJZCwgc3RkOjptb3ZlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRCdWZmZXIpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IHJlc3VsdC5maXJzdC0+c2Vjb25kLT5jcmVhdGVDYWNoZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfZnJvbV90aGlzKCksIHBIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhY2hlLmluY0FjdGl2ZV9sKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNyZWF0aW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNyZWF0ZUN2Lm5vdGlmeV9hbGwoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYWNoZS5tQ3JlYXRlQ3Yud2FpdChsb2NrKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIG5lZWRzU3luYyA9IGZhbHNlOworICAgIGJvb2wgcG9zdGVkID0gcG9zdFJlY2VpdmVSZXN1bHQoYnVmZmVySWQsIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPyB0cnVlIDogZmFsc2UsICZuZWVkc1N5bmMpOworICAgIEFMT0dWKCJjbGllbnQgcmVjZWl2ZSAlbGxkIC0gJXUgOiAlcyAoJWQpIiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAqYnVmZmVyID8gIm9rIiA6ICJmYWlsIiwgcG9zdGVkKTsKKyAgICBpZiAobVZhbGlkICYmIG1Mb2NhbCAmJiBtTG9jYWxDb25uZWN0aW9uKSB7CisgICAgICAgIG1Mb2NhbENvbm5lY3Rpb24tPmNsZWFuVXAoZmFsc2UpOworICAgIH0KKyAgICBpZiAobmVlZHNTeW5jICYmIG1SZW1vdGVDb25uZWN0aW9uKSB7CisgICAgICAgIHRyeVN5bmNGcm9tUmVtb3RlKCk7CisgICAgfQorICAgIGlmICgqYnVmZmVyKSB7CisgICAgICAgIGlmICghcG9zdGVkKSB7CisgICAgICAgICAgICBidWZmZXItPnJlc2V0KCk7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnBvc3RCdWZmZXJSZWxlYXNlKEJ1ZmZlcklkIGJ1ZmZlcklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLnB1c2hfYmFjayhidWZmZXJJZCk7CisgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclJlbGVhc2UoCisgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKK30KKworLy8gVE9ETzogcmV2aXNlIGFkLWhvYyBwb3N0aW5nIGRhdGEgc3RydWN0dXJlCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnBvc3RTZW5kKAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgQ29ubmVjdGlvbklkIHJlY2VpdmVyLAorICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLCBpbnQ2NF90ICp0aW1lc3RhbXBVcykgeworICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgYm9vbCBuZWVkc1N5bmMgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgICAgICAqdGltZXN0YW1wVXMgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgKnRyYW5zYWN0aW9uSWQgPSAobUNvbm5lY3Rpb25JZCA8PCAzMikgfCBtU2VxSWQrKzsKKyAgICAgICAgLy8gVE9ETzogcmV0cnksIGFkZCB0aW1lb3V0LCB0YXJnZXQ/CisgICAgICAgIHJldCA9ICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAqdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVE8sIG1Db25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgcmVjZWl2ZXIsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgICAgICBuZWVkc1N5bmMgPSAhbUxvY2FsICYmIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPm5lZWRzU3luYygpOworICAgIH0KKyAgICBpZiAobVZhbGlkICYmIG1Mb2NhbCAmJiBtTG9jYWxDb25uZWN0aW9uKSB7CisgICAgICAgIG1Mb2NhbENvbm5lY3Rpb24tPmNsZWFuVXAoZmFsc2UpOworICAgIH0KKyAgICBpZiAobmVlZHNTeW5jICYmIG1SZW1vdGVDb25uZWN0aW9uKSB7CisgICAgICAgIHRyeVN5bmNGcm9tUmVtb3RlKCk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cG9zdFJlY2VpdmUoCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIGludDY0X3QgdGltZXN0YW1wVXMpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGtQb3N0TWF4UmV0cnk7ICsraSkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgICAgIGludDY0X3Qgbm93ID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgIGlmICh0aW1lc3RhbXBVcyA9PSAwIHx8IG5vdyA8IHRpbWVzdGFtcFVzKSB7CisgICAgICAgICAgICBib29sIHJlc3VsdCA9IG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GUk9NLAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCAtMSwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLAorICAgICAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgICAgICAgICBpZiAocmVzdWx0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6eWllbGQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9USU1FT1VULAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCAtMSwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLAorICAgICAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnBvc3RSZWNlaXZlUmVzdWx0KAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBib29sIHJlc3VsdCwgYm9vbCAqbmVlZHNTeW5jKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgLy8gVE9ETzogcmV0cnksIGFkZCB0aW1lb3V0CisgICAgYm9vbCByZXQgPSBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLAorICAgICAgICAgICAgcmVzdWx0ID8gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9PSyA6IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRVJST1IsCisgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCAtMSwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLAorICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgICpuZWVkc1N5bmMgPSAhbUxvY2FsICYmIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPm5lZWRzU3luYygpOworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6dHJ5U3luY0Zyb21SZW1vdGUoKSB7CisgICAgaWYgKG1SZW1vdGVTeW5jTG9jay50cnlfbG9jaygpKSB7CisgICAgICAgIGJvb2wgbmVlZHNTeW5jID0gZmFsc2U7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgICAgICAgICAgbmVlZHNTeW5jID0gbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+bmVlZHNTeW5jKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5lZWRzU3luYykgeworICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkID0gKG1Db25uZWN0aW9uSWQgPDwgMzIpOworICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQgPSBDb25uZWN0aW9uOjpTWU5DX0JVRkZFUklEOworICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gbVJlbW90ZUNvbm5lY3Rpb24tPmZldGNoKAorICAgICAgICAgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgW10KKyAgICAgICAgICAgICAgICAgICAgKFJlc3VsdFN0YXR1cyBvdXRTdGF0dXMsIEJ1ZmZlciBvdXRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBvdXRTdGF0dXM7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgb3V0QnVmZmVyOworICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmKCF0cmFuc1Jlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgic3luYyBmcm9tIGNsaWVudCAlbGxkIGZhaWxlZDogYnVmZmVycG9vbCBwcm9jZXNzIGRpZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1SZW1vdGVTeW5jTG9jay51bmxvY2soKTsKKyAgICB9Cit9CisKKy8vIHNob3VsZCBoYXZlIG1DYWNoZS5tTG9jaworYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpzeW5jUmVsZWFzZWQoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+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+ICpidWZmZXIpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5yZWNlaXZlKGNvbm5lY3Rpb25JZCwgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcywgaGFuZGxlLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OnBvc3RTZW5kKAorICAgICAgICBDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLCBpbnQ2NF90KiB0aW1lc3RhbXBVcykgeworICAgIGlmIChtSW1wbCAmJiBidWZmZXIpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5wb3N0U2VuZChyZWNlaXZlcklkLCBidWZmZXIsIHRyYW5zYWN0aW9uSWQsIHRpbWVzdGFtcFVzKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQ2xpZW50TWFuYWdlcjo6Y2xlYW5VcCgpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgbUltcGwtPmNsZWFuVXAodHJ1ZSk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9Db25uZWN0aW9uLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0Nvbm5lY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlODk3MDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9Db25uZWN0aW9uLmNwcApAQCAtMCwwICsxLDk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkNvbm5lY3Rpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklDb25uZWN0aW9uIGZvbGxvdy4KK1JldHVybjx2b2lkPiBDb25uZWN0aW9uOjpmZXRjaCh1aW50NjRfdCB0cmFuc2FjdGlvbklkLCB1aW50MzJfdCBidWZmZXJJZCwgZmV0Y2hfY2IgX2hpZGxfY2IpIHsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICBpZiAobUluaXRpYWxpemVkICYmIG1BY2Nlc3NvcikgeworICAgICAgICBpZiAoYnVmZmVySWQgIT0gU1lOQ19CVUZGRVJJRCkgeworICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBudWxscHRyOworICAgICAgICAgICAgc3RhdHVzID0gbUFjY2Vzc29yLT5mZXRjaCgKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsICZoYW5kbGUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgQnVmZmVyIGJ1ZmZlciA9IHt9OworICAgICAgICAgICAgICAgIGJ1ZmZlci5pZCA9IGJ1ZmZlcklkOworICAgICAgICAgICAgICAgIGJ1ZmZlci5idWZmZXIgPSBoYW5kbGU7CisgICAgICAgICAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBidWZmZXIpOworICAgICAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQWNjZXNzb3ItPmNsZWFuVXAoZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgQnVmZmVyIGJ1ZmZlciA9IHt9OworICAgIGJ1ZmZlci5pZCA9IDA7CisgICAgYnVmZmVyLmJ1ZmZlciA9IG51bGxwdHI7CisKKyAgICBfaGlkbF9jYihzdGF0dXMsIGJ1ZmZlcik7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworQ29ubmVjdGlvbjo6Q29ubmVjdGlvbigpIDogbUluaXRpYWxpemVkKGZhbHNlKSwgbUNvbm5lY3Rpb25JZCgtMUxMKSB7fQorCitDb25uZWN0aW9uOjp+Q29ubmVjdGlvbigpIHsKKyAgICBpZiAobUluaXRpYWxpemVkICYmIG1BY2Nlc3NvcikgeworICAgICAgICBtQWNjZXNzb3ItPmNsb3NlKG1Db25uZWN0aW9uSWQpOworICAgIH0KK30KKwordm9pZCBDb25uZWN0aW9uOjppbml0aWFsaXplKAorICAgICAgICBjb25zdCBzcDxBY2Nlc3Nvcj4mIGFjY2Vzc29yLCBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgbUFjY2Vzc29yID0gYWNjZXNzb3I7CisgICAgICAgIG1Db25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgfQorfQorCitSZXN1bHRTdGF0dXMgQ29ubmVjdGlvbjo6YWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgcmV0dXJuIG1BY2Nlc3Nvci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgcGFyYW1zLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQ29ubmVjdGlvbjo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpZiAobUluaXRpYWxpemVkICYmIG1BY2Nlc3NvcikgeworICAgICAgICBtQWNjZXNzb3ItPmNsZWFuVXAoY2xlYXJDYWNoZSk7CisgICAgfQorfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZSBmb2xsb3cuCisKKy8vSUNvbm5lY3Rpb24qIEhJRExfRkVUQ0hfSUNvbm5lY3Rpb24oY29uc3QgY2hhciogLyogbmFtZSAqLykgeworLy8gICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uKCk7CisvL30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ29ubmVjdGlvbi5oIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ29ubmVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxOWNiNjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9Db25uZWN0aW9uLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0NPTk5FQ1RJT05fSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9DT05ORUNUSU9OX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8xLjAvSUNvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OkFjY2Vzc29yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBDb25uZWN0aW9uIDogcHVibGljIElDb25uZWN0aW9uIHsKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklDb25uZWN0aW9uIGZvbGxvdy4KKyAgICBSZXR1cm48dm9pZD4gZmV0Y2godWludDY0X3QgdHJhbnNhY3Rpb25JZCwgdWludDMyX3QgYnVmZmVySWQsIGZldGNoX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlcyBhIGJ1ZmZlciB1c2luZyB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuIFJlY3ljbGVzIGEgYnVmZmVyIGlmCisgICAgICogaXQgaXMgcG9zc2libGUuIFRoZSByZXR1cm5lZCBidWZmZXIgY2FuIGJlIHRyYW5zZmVycmVkIHRvIG90aGVyIHJlbW90ZQorICAgICAqIGNsaWVudHMoQ29ubmVjdGlvbikuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgIElkIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgbmF0aXZlIGhhbmRsZSBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgaWYgYSBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgKmJ1ZmZlcklkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgLyoqCisgICAgICogUHJvY2Vzc2VzIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBhbmQgcGVyZm9ybXMgcGVyaW9kaWMgY2FjaGUgY2xlYW5pbmcKKyAgICAgKiBmcm9tIGJ1ZmZlcnBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xlYXJDYWNoZSAgICBpZiBjbGVhckNhY2hlIGlzIHRydWUsIGJ1ZmZlcnBvb2wgZnJlZXMgYWxsIGJ1ZmZlcnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3YWl0aW5nIHRvIGJlIHJlY3ljbGVkLgorICAgICAqLworICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUpOworCisgICAgLyoqIERlc3RydWN0cyBhIGNvbm5lY3Rpb24uICovCisgICAgfkNvbm5lY3Rpb24oKTsKKworICAgIC8qKiBDcmVhdGVzIGEgY29ubmVjdGlvbi4gKi8KKyAgICBDb25uZWN0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyB3aXRoIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHBvb2wgYW5kIHRoZSBjb25uZWN0aW9uIGlkLgorICAgICAqIFRoZSBjb25uZWN0aW9uIGlkIHNob3VsZCBiZSB1bmlxdWUgaW4gdGhlIHdob2xlIHN5c3RlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY2Nlc3NvciAgICAgIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHBvb2wuCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgSWQuCisgICAgICovCisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgZW51bSA6IHVpbnQzMl90IHsKKyAgICAgICAgU1lOQ19CVUZGRVJJRCA9IFVJTlQzMl9NQVgsCisgICAgfTsKKworcHJpdmF0ZToKKyAgICBib29sIG1Jbml0aWFsaXplZDsKKyAgICBzcDxBY2Nlc3Nvcj4gbUFjY2Vzc29yOworICAgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0NPTk5FQ1RJT05fSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvaW5jbHVkZS9idWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvaW5jbHVkZS9idWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMGYwMTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmgKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0JVRkZFUlBPT0xUWVBFU19ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0JVRkZFUlBPT0xUWVBFU19ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3R5cGVzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKKworc3RydWN0IEJ1ZmZlclBvb2xEYXRhIHsKKyAgICAvLyBGb3IgbG9jYWwgdXNlLCB0byBzcGVjaWZ5IGEgYnVmZmVycG9vbCAoY2xpZW50IGNvbm5lY3Rpb24pIGZvciBidWZmZXJzLgorICAgIC8vIFJldHVybiB2YWx1ZSBmcm9tIGNvbm5lY3QjSUFjY2Vzc29yKGFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAxLjApLgorICAgIGludDY0X3QgbUNvbm5lY3Rpb25JZDsKKyAgICAvLyBCdWZmZXJJZAorICAgIHVpbnQzMl90IG1JZDsKKworICAgIEJ1ZmZlclBvb2xEYXRhKCkgOiBtQ29ubmVjdGlvbklkKDApLCBtSWQoMCkge30KKworICAgIEJ1ZmZlclBvb2xEYXRhKAorICAgICAgICAgICAgaW50NjRfdCBjb25uZWN0aW9uSWQsIHVpbnQzMl90IGlkKQorICAgICAgICAgICAgOiBtQ29ubmVjdGlvbklkKGNvbm5lY3Rpb25JZCksIG1JZChpZCkge30KKworICAgIH5CdWZmZXJQb29sRGF0YSgpIHt9Cit9OworCituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlOworCit0eXBlZGVmIHVpbnQzMl90IEJ1ZmZlcklkOwordHlwZWRlZiB1aW50NjRfdCBUcmFuc2FjdGlvbklkOwordHlwZWRlZiBpbnQ2NF90IENvbm5lY3Rpb25JZDsKKworZW51bSA6IENvbm5lY3Rpb25JZCB7CisgICAgSU5WQUxJRF9DT05ORUNUSU9OSUQgPSAwLAorfTsKKwordHlwZWRlZiBhbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlPEJ1ZmZlclN0YXR1c01lc3NhZ2UsIGtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IEJ1ZmZlclN0YXR1c1F1ZXVlOwordHlwZWRlZiBCdWZmZXJTdGF0dXNRdWV1ZTo6RGVzY3JpcHRvciBRdWV1ZURlc2NyaXB0b3I7CisKKy8qKgorICogQWxsb2NhdGlvbiB3cmFwcGVyIGNsYXNzIGZvciBidWZmZXIgcG9vbC4KKyAqLworc3RydWN0IEJ1ZmZlclBvb2xBbGxvY2F0aW9uIHsKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm1IYW5kbGU7CisKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1IYW5kbGU7CisgICAgfQorCisgICAgQnVmZmVyUG9vbEFsbG9jYXRpb24oY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUpIDogbUhhbmRsZShoYW5kbGUpIHt9CisKKyAgICB+QnVmZmVyUG9vbEFsbG9jYXRpb24oKSB7fTsKK307CisKKy8qKgorICogQWxsb2NhdG9yIHdyYXBwZXIgY2xhc3MgZm9yIGJ1ZmZlciBwb29sLgorICovCitjbGFzcyBCdWZmZXJQb29sQWxsb2NhdG9yIHsKK3B1YmxpYzoKKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlIGFuIGFsbG9jYXRpb24oYnVmZmVyKSBmb3IgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgIGFsbG9jYXRpb24gcGFyYW1ldGVycworICAgICAqIEBwYXJhbSBhbGxvYyAgICAgY3JlYXRlZCBhbGxvY2F0aW9uCisgICAgICogQHBhcmFtIGFsbG9jU2l6ZSBzaXplIG9mIGNyZWF0ZWQgYWxsb2NhdGlvbgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGFuIGFsbG9jYXRpb24gaXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICovCisgICAgdmlydHVhbCBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAqYWxsb2MsCisgICAgICAgICAgICBzaXplX3QgKmFsbG9jU2l6ZSkgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIGFsbG9jYXRpb24gcGFyYW1ldGVycyBvZiBhbiBvbGQgYWxsb2NhdGlvbiBhcmUKKyAgICAgKiBjb21wYXRpYmxlIHdpdGggbmV3IGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgY29tcGF0aWJsZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmbmV3UGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZvbGRQYXJhbXMpID0gMDsKKworcHJvdGVjdGVkOgorICAgIEJ1ZmZlclBvb2xBbGxvY2F0b3IoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIH5CdWZmZXJQb29sQWxsb2NhdG9yKCkgPSBkZWZhdWx0OworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0JVRkZFUlBPT0xUWVBFU19ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvaW5jbHVkZS9idWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTU3NzlmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvaW5jbHVkZS9idWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaApAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQ0xJRU5UTUFOQUdFUl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0NMSUVOVE1BTkFHRVJfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzEuMC9JQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSAiQnVmZmVyUG9vbFR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQWNjZXNzb3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBDbGllbnRNYW5hZ2VyIDogcHVibGljIElDbGllbnRNYW5hZ2VyIHsKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklDbGllbnRNYW5hZ2VyIGZvbGxvdy4KKyAgICBSZXR1cm48dm9pZD4gcmVnaXN0ZXJTZW5kZXIoY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklBY2Nlc3Nvcj4mIGJ1ZmZlclBvb2wsIHJlZ2lzdGVyU2VuZGVyX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIC8qKiBHZXRzIGFuIGluc3RhbmNlLiAqLworICAgIHN0YXRpYyBzcDxDbGllbnRNYW5hZ2VyPiBnZXRJbnN0YW5jZSgpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGxvY2FsIGNvbm5lY3Rpb24gd2l0aCBhIG5ld2x5IGNyZWF0ZWQgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWxsb2NhdG9yICAgICBmb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9uLgorICAgICAqIEBwYXJhbSBwQ29ubmVjdGlvbklkIElkIG9mIHRoZSBjcmVhdGVkIGNvbm5lY3Rpb24uIFRoaXMgaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW0td2lkZSB1bmlxdWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgcG9vbCBhbmQgYSBsb2NhbCBjb25uZWN0aW9uIGlzIHN1Y2Nlc3NmdWxseQorICAgICAqICAgICAgICAgY3JlYXRlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgY3JlYXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKTsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgY3JlYXRlZCBjb25uZWN0aW9uIGFzIHNlbmRlciBmb3IgcmVtb3RlIHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVjZWl2ZXIgICAgICBUaGUgcmVtb3RlIHJlY2VpdmluZyBwcm9jZXNzLgorICAgICAqIEBwYXJhbSBzZW5kZXJJZCAgICAgIEEgbG9jYWwgY29ubmVjdGlvbiB3aGljaCB3aWxsIHNlbmQgYnVmZmVycyB0by4KKyAgICAgKiBAcGFyYW0gcmVjZWl2ZXJJZCAgICBJZCBvZiB0aGUgY3JlYXRlZCByZWNlaXZpbmcgY29ubmVjdGlvbiBvbiB0aGUgcmVjZWl2ZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIHRoZSByZWNlaXZpbmcgY29ubmVjdGlvbiBpcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCBvbiB0aGUKKyAgICAgKiAgICAgICAgIHJlY2VpdmVyIHByb2Nlc3MuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc2VuZGVyIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIEFMUkVBRFlfRVhJU1RTIHRoZSByZWNlaXZpbmcgY29ubmVjdGlvbiBpcyBhbHJlYWR5IG1hZGUuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIHJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmcmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCBzZW5kZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpyZWNlaXZlcklkKTsKKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBUaGUgaWQgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkLgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgLyoqCisgICAgICogQWxsb2NhdGVzIGEgYnVmZmVyIGZyb20gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgVGhlIGlkIG9mIHRoZSBjb25uZWN0aW9uLgorICAgICAqIEBwYXJhbSBwYXJhbXMgICAgICAgIFRoZSBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICogQHBhcmFtIGhhbmRsZSAgICAgICAgVGhlIG5hdGl2ZSBoYW5kbGUgdG8gdGhlIGFsbG9jYXRlZCBidWZmZXIuIGhhbmRsZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBjbG9uZWQgYmVmb3JlIHVzZS4KKyAgICAgKiBAcGFyYW0gYnVmZmVyICAgICAgICBUaGUgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciB3YXMgYWxsb2NhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiAgICAgICAgIE5PVF9GT1VORCB3aGVuIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICAvKioKKyAgICAgKiBSZWNlaXZlcyBhIGJ1ZmZlciBmb3IgdGhlIHRyYW5zYWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgVGhlIGlkIG9mIHRoZSByZWNlaXZpbmcgY29ubmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCBUaGUgaWQgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICBUaGUgaWQgZm9yIHRoZSBidWZmZXIuCisgICAgICogQHBhcmFtIHRpbWVzdGFtcFVzICAgVGhlIHRpbWVzdGFtcCBvZiB0aGUgYnVmZmVyIGlzIGJlaW5nIHNlbnQuCisgICAgICogQHBhcmFtIGhhbmRsZSAgICAgICAgVGhlIG5hdGl2ZSBoYW5kbGUgdG8gdGhlIGFsbG9jYXRlZCBidWZmZXIuIGhhbmRsZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBjbG9uZWQgYmVmb3JlIHVzZS4KKyAgICAgKiBAcGFyYW0gYnVmZmVyICAgICAgICBUaGUgcmVjZWl2ZWQgYnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIHdhcyByZWNlaXZlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgcmVjZWl2ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIC8qKgorICAgICAqIFBvc3RzIGEgYnVmZmVyIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHRvIHRoZSBidWZmZXIgcG9vbC4gU2VuZHMgYSBidWZmZXIKKyAgICAgKiB0byBvdGhlciByZW1vdGUgY2xpZW50cyhjb25uZWN0aW9uKSBhZnRlciB0aGlzIGNhbGwgaGFzIGJlZW4gc3VjY2VlZGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlY2VpdmVySWQgICAgVGhlIGlkIG9mIHRoZSByZWNlaXZpbmcgY29ubmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gYnVmZmVyICAgICAgICB0byB0cmFuc2ZlcgorICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbklkIElkIG9mIHRoZSB0cmFuc2ZlciB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gdGltZXN0YW1wVXMgICBUaGUgdGltZXN0YW1wIG9mIHRoZSBidWZmZXIgdHJhbnNhY3Rpb24gaXMgYmVpbmcKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwb3N0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgdHJhbnNhY3Rpb24gd2FzIHBvc3RlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc2VuZGluZyBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIHBvc3RTZW5kKENvbm5lY3Rpb25JZCByZWNlaXZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVzdGFtcFVzKTsKKworICAgIC8qKgorICAgICAqICBUaW1lIG91dCBpbmFjdGl2ZSBsaW5nZXJpbmcgY29ubmVjdGlvbnMgYW5kIGNsb3NlLgorICAgICAqLworICAgIHZvaWQgY2xlYW5VcCgpOworCisgICAgLyoqIERlc3RydWN0cyB0aGUgbWFuYWdlciBvZiBidWZmZXIgcG9vbCBjbGllbnRzLiAgKi8KKyAgICB+Q2xpZW50TWFuYWdlcigpOworcHJpdmF0ZToKKyAgICBzdGF0aWMgc3A8Q2xpZW50TWFuYWdlcj4gc0luc3RhbmNlOworICAgIHN0YXRpYyBzdGQ6Om11dGV4IHNJbnN0YW5jZUxvY2s7CisKKyAgICBjbGFzcyBJbXBsOworICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxJbXBsPiBtSW1wbDsKKworICAgIENsaWVudE1hbmFnZXIoKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9DTElFTlRNQU5BR0VSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9BbmRyb2lkLmJwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU1YTc1NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVnRzVm5ka0hpZGxCdWZmZXJwb29sVjFfMFRhcmdldFNpbmdsZVRlc3QiLAorICAgIGRlZmF1bHRzOiBbIlZ0c0hhbFRhcmdldFRlc3REZWZhdWx0cyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgImFsbG9jYXRvci5jcHAiLAorICAgICAgICAic2luZ2xlLmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDEuMCIsCisgICAgICAgICJsaWJpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAxLjAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmZtcSIsCisgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiYm90aCIsCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNWbmRrSGlkbEJ1ZmZlcnBvb2xWMV8wVGFyZ2V0TXVsdGlUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNIYWxUYXJnZXRUZXN0RGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJhbGxvY2F0b3IuY3BwIiwKKyAgICAgICAgIm11bHRpLmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDEuMCIsCisgICAgICAgICJsaWJpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAxLjAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmZtcSIsCisgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiYm90aCIsCit9CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvT1dORVJTIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzMzZTBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL09XTkVSUwpAQCAtMCwwICsxLDkgQEAKKyMgTWVkaWEgdGVhbQorbGFqb3NAZ29vZ2xlLmNvbQorcGF3aW5AZ29vZ2xlLmNvbQordGFrbGVlQGdvb2dsZS5jb20KK3dvbnNpa0Bnb29nbGUuY29tCisKKyMgVlRTIHRlYW0KK3lpbUBnb29nbGUuY29tCit6aHVveWFvQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9hbGxvY2F0b3IuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL2FsbG9jYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQzZjdlYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9hbGxvY2F0b3IuY3BwCkBAIC0wLDAgKzEsMjA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGN1dGlscy9hc2htZW0uaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgImFsbG9jYXRvci5oIgorCit1bmlvbiBQYXJhbXMgeworICBzdHJ1Y3QgeworICAgIHVpbnQzMl90IGNhcGFjaXR5OworICB9IGRhdGE7CisgIHVpbnQ4X3QgYXJyYXlbMF07CisgIFBhcmFtcygpIDogZGF0YXswfSB7fQorICBQYXJhbXModWludDMyX3Qgc2l6ZSkKKyAgICAgIDogZGF0YXtzaXplfSB7fQorfTsKKworCituYW1lc3BhY2UgeworCitzdHJ1Y3QgSGFuZGxlQXNobWVtIDogcHVibGljIG5hdGl2ZV9oYW5kbGVfdCB7CisgIEhhbmRsZUFzaG1lbShpbnQgYXNobWVtRmQsIHNpemVfdCBzaXplKQorICAgIDogbmF0aXZlX2hhbmRsZV90KGNIZWFkZXIpLAorICAgIG1GZHN7IGFzaG1lbUZkIH0sCisgICAgbUludHN7IGludCAoc2l6ZSAmIDB4RkZGRkZGRkYpLCBpbnQoKHVpbnQ2NF90KHNpemUpID4+IDMyKSAmIDB4RkZGRkZGRkYpLCBrTWFnaWMgfSB7fQorCisgIGludCBhc2htZW1GZCgpIGNvbnN0IHsgcmV0dXJuIG1GZHMubUFzaG1lbTsgfQorICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc2l6ZV90KHVuc2lnbmVkKG1JbnRzLm1TaXplTG8pKQorICAgICAgICB8IHNpemVfdCh1aW50NjRfdCh1bnNpZ25lZChtSW50cy5tU2l6ZUhpKSkgPDwgMzIpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKiBjb25zdCBvKTsKKworcHJvdGVjdGVkOgorICBzdHJ1Y3QgeworICAgIGludCBtQXNobWVtOworICB9IG1GZHM7CisgIHN0cnVjdCB7CisgICAgaW50IG1TaXplTG87CisgICAgaW50IG1TaXplSGk7CisgICAgaW50IG1NYWdpYzsKKyAgfSBtSW50czsKKworcHJpdmF0ZToKKyAgZW51bSB7CisgICAga01hZ2ljID0gJ2FobVx4MDAnLAorICAgIG51bUZkcyA9IHNpemVvZihtRmRzKSAvIHNpemVvZihpbnQpLAorICAgIG51bUludHMgPSBzaXplb2YobUludHMpIC8gc2l6ZW9mKGludCksCisgICAgdmVyc2lvbiA9IHNpemVvZihuYXRpdmVfaGFuZGxlX3QpCisgIH07CisgIGNvbnN0IHN0YXRpYyBuYXRpdmVfaGFuZGxlX3QgY0hlYWRlcjsKK307CisKK2NvbnN0IG5hdGl2ZV9oYW5kbGVfdCBIYW5kbGVBc2htZW06OmNIZWFkZXIgPSB7CisgIEhhbmRsZUFzaG1lbTo6dmVyc2lvbiwKKyAgSGFuZGxlQXNobWVtOjpudW1GZHMsCisgIEhhbmRsZUFzaG1lbTo6bnVtSW50cywKKyAge30KK307CisKK2Jvb2wgSGFuZGxlQXNobWVtOjppc1ZhbGlkKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqIGNvbnN0IG8pIHsKKyAgaWYgKCFvIHx8IG1lbWNtcChvLCAmY0hlYWRlciwgc2l6ZW9mKGNIZWFkZXIpKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBIYW5kbGVBc2htZW0gKm90aGVyID0gc3RhdGljX2Nhc3Q8Y29uc3QgSGFuZGxlQXNobWVtKj4obyk7CisgIHJldHVybiBvdGhlci0+bUludHMubU1hZ2ljID09IGtNYWdpYzsKK30KKworY2xhc3MgQWxsb2NhdGlvbkFzaG1lbSB7Citwcml2YXRlOgorICBBbGxvY2F0aW9uQXNobWVtKGludCBhc2htZW1GZCwgc2l6ZV90IGNhcGFjaXR5LCBib29sIHJlcykKKyAgICA6IG1IYW5kbGUoYXNobWVtRmQsIGNhcGFjaXR5KSwKKyAgICAgIG1Jbml0KHJlcykge30KKworcHVibGljOgorICBzdGF0aWMgQWxsb2NhdGlvbkFzaG1lbSAqQWxsb2Moc2l6ZV90IHNpemUpIHsKKyAgICBjb25zdGV4cHIgc3RhdGljIGNvbnN0IGNoYXIgKmtBbGxvY2F0aW9uVGFnID0gImJ1ZmZlcnBvb2xfdGVzdCI7CisgICAgaW50IGFzaG1lbUZkID0gYXNobWVtX2NyZWF0ZV9yZWdpb24oa0FsbG9jYXRpb25UYWcsIHNpemUpOworICAgIHJldHVybiBuZXcgQWxsb2NhdGlvbkFzaG1lbShhc2htZW1GZCwgc2l6ZSwgYXNobWVtRmQgPj0gMCk7CisgIH0KKworICB+QWxsb2NhdGlvbkFzaG1lbSgpIHsKKyAgICBpZiAobUluaXQpIHsKKyAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoJm1IYW5kbGUpOworICAgIH0KKyAgfQorCisgIGNvbnN0IEhhbmRsZUFzaG1lbSAqaGFuZGxlKCkgeworICAgIHJldHVybiAmbUhhbmRsZTsKKyAgfQorCitwcml2YXRlOgorICBIYW5kbGVBc2htZW0gbUhhbmRsZTsKKyAgYm9vbCBtSW5pdDsKKyAgLy8gVE9ETzogbWFwcGluZyBhbmQgbWFwIGZkCit9OworCitzdHJ1Y3QgQWxsb2NhdGlvbkR0b3IgeworICBBbGxvY2F0aW9uRHRvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWxsb2NhdGlvbkFzaG1lbT4gJmFsbG9jKQorICAgICAgOiBtQWxsb2MoYWxsb2MpIHt9CisKKyAgdm9pZCBvcGVyYXRvcigpKEJ1ZmZlclBvb2xBbGxvY2F0aW9uICpwb29sQWxsb2MpIHsgZGVsZXRlIHBvb2xBbGxvYzsgfQorCisgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBbGxvY2F0aW9uQXNobWVtPiBtQWxsb2M7Cit9OworCit9CisKKworUmVzdWx0U3RhdHVzIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjphbGxvY2F0ZSgKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gKmFsbG9jLAorICAgIHNpemVfdCAqYWxsb2NTaXplKSB7CisgIFBhcmFtcyBhc2htZW1QYXJhbXM7CisgIG1lbWNweSgmYXNobWVtUGFyYW1zLCBwYXJhbXMuZGF0YSgpLCBzdGQ6Om1pbihzaXplb2YoUGFyYW1zKSwgcGFyYW1zLnNpemUoKSkpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxBbGxvY2F0aW9uQXNobWVtPiBhc2htZW1BbGxvYyA9CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8QWxsb2NhdGlvbkFzaG1lbT4oCisgICAgICAgICAgQWxsb2NhdGlvbkFzaG1lbTo6QWxsb2MoYXNobWVtUGFyYW1zLmRhdGEuY2FwYWNpdHkpKTsKKyAgaWYgKGFzaG1lbUFsbG9jKSB7CisgICAgQnVmZmVyUG9vbEFsbG9jYXRpb24gKnB0ciA9IG5ldyBCdWZmZXJQb29sQWxsb2NhdGlvbihhc2htZW1BbGxvYy0+aGFuZGxlKCkpOworICAgIGlmIChwdHIpIHsKKyAgICAgICphbGxvYyA9IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4ocHRyLCBBbGxvY2F0aW9uRHRvcihhc2htZW1BbGxvYykpOworICAgICAgaWYgKCphbGxvYykgeworICAgICAgICAgICphbGxvY1NpemUgPSBhc2htZW1QYXJhbXMuZGF0YS5jYXBhY2l0eTsKKyAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgIH0KKyAgICAgIGRlbGV0ZSBwdHI7CisgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgfQorICB9CisgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitib29sIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpjb21wYXRpYmxlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZuZXdQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm9sZFBhcmFtcykgeworICBzaXplX3QgbmV3U2l6ZSA9IG5ld1BhcmFtcy5zaXplKCk7CisgIHNpemVfdCBvbGRTaXplID0gb2xkUGFyYW1zLnNpemUoKTsKKyAgaWYgKG5ld1NpemUgPT0gb2xkU2l6ZSkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmV3U2l6ZTsgKytpKSB7CisgICAgICBpZiAobmV3UGFyYW1zW2ldICE9IG9sZFBhcmFtc1tpXSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6RmlsbChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwgY29uc3QgdW5zaWduZWQgY2hhciB2YWwpIHsKKyAgaWYgKCFIYW5kbGVBc2htZW06OmlzVmFsaWQoaGFuZGxlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBIYW5kbGVBc2htZW0gKm8gPSBzdGF0aWNfY2FzdDxjb25zdCBIYW5kbGVBc2htZW0qPihoYW5kbGUpOworICB1bnNpZ25lZCBjaGFyICpwdHIgPSAodW5zaWduZWQgY2hhciAqKW1tYXAoCisgICAgICBOVUxMLCBvLT5zaXplKCksIFBST1RfUkVBRHxQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBvLT5hc2htZW1GZCgpLCAwKTsKKworICBpZiAocHRyICE9IE1BUF9GQUlMRUQpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG8tPnNpemUoKTsgKytpKSB7CisgICAgICBwdHJbaV0gPSB2YWw7CisgICAgfQorICAgIG11bm1hcChwdHIsIG8tPnNpemUoKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpWZXJpZnkoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmFsKSB7CisgIGlmICghSGFuZGxlQXNobWVtOjppc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSGFuZGxlQXNobWVtICpvID0gc3RhdGljX2Nhc3Q8Y29uc3QgSGFuZGxlQXNobWVtKj4oaGFuZGxlKTsKKyAgdW5zaWduZWQgY2hhciAqcHRyID0gKHVuc2lnbmVkIGNoYXIgKiltbWFwKAorICAgICAgTlVMTCwgby0+c2l6ZSgpLCBQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIG8tPmFzaG1lbUZkKCksIDApOworCisgIGlmIChwdHIgIT0gTUFQX0ZBSUxFRCkgeworICAgIGJvb2wgcmVzID0gdHJ1ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG8tPnNpemUoKTsgKytpKSB7CisgICAgICBpZiAocHRyW2ldICE9IHZhbCkgeworICAgICAgICByZXMgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIG11bm1hcChwdHIsIG8tPnNpemUoKSk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcyhzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcGFyYW1zKSB7CisgIGNvbnN0ZXhwciBzdGF0aWMgaW50IGtBbGxvY2F0aW9uU2l6ZSA9IDEwMjQgKiAxMDsKKyAgUGFyYW1zIGFzaG1lbVBhcmFtcyhrQWxsb2NhdGlvblNpemUpOworCisgIHBhcmFtcy0+YXNzaWduKGFzaG1lbVBhcmFtcy5hcnJheSwgYXNobWVtUGFyYW1zLmFycmF5ICsgc2l6ZW9mKGFzaG1lbVBhcmFtcykpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL2FsbG9jYXRvci5oIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL2FsbG9jYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4NmU1ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvYWxsb2NhdG9yLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVk5ES19ISURMX0JVRkZFUlBPT0xfVjFfMF9BTExPQ0FUT1JfSAorI2RlZmluZSBWTkRLX0hJRExfQlVGRkVSUE9PTF9WMV8wX0FMTE9DQVRPUl9ICisKKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OgorICAgIEJ1ZmZlclBvb2xBbGxvY2F0aW9uOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6CisgICAgQnVmZmVyUG9vbEFsbG9jYXRvcjsKKworLy8gYnVmZmVyIGFsbG9jYXRvciBmb3IgdGhlIHRlc3RzCitjbGFzcyBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvciA6IHB1YmxpYyBCdWZmZXJQb29sQWxsb2NhdG9yIHsKKyBwdWJsaWM6CisgIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yKCkge30KKworICB+VGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3IoKSBvdmVycmlkZSB7fQorCisgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAqYWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmFsbG9jU2l6ZSkgb3ZlcnJpZGU7CisKKyAgYm9vbCBjb21wYXRpYmxlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZuZXdQYXJhbXMsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmb2xkUGFyYW1zKSBvdmVycmlkZTsKKworICBzdGF0aWMgYm9vbCBGaWxsKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLCBjb25zdCB1bnNpZ25lZCBjaGFyIHZhbCk7CisKKyAgc3RhdGljIGJvb2wgVmVyaWZ5KGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLCBjb25zdCB1bnNpZ25lZCBjaGFyIHZhbCk7CisKK307CisKKy8vIHJldHJpZXZlIGJ1ZmZlciBhbGxvY2F0b3IgcGFyYW10ZXJzCit2b2lkIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoc3RkOjp2ZWN0b3I8dWludDhfdD4gKnBhcmFtcyk7CisKKyNlbmRpZiAgLy8gVk5ES19ISURMX0JVRkZFUlBPT0xfVjFfMF9BTExPQ0FUT1JfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL211bHRpLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9tdWx0aS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTc5NjgxOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9tdWx0aS5jcHAKQEAgLTAsMCArMSwyMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgImJ1ZmZmZXJwb29sX3VuaXRfdGVzdCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvTGVnYWN5U3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgImFsbG9jYXRvci5oIgorCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUNsaWVudE1hbmFnZXI7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OkJ1ZmZlcklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6Q2xpZW50TWFuYWdlcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OkNvbm5lY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OlRyYW5zYWN0aW9uSWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhOworCituYW1lc3BhY2UgeworCisvLyBjb21tdW5pY2F0aW9uIG1lc3NhZ2UgdHlwZXMgYmV0d2VlbiBwcm9jZXNzZXMuCitlbnVtIFBpcGVDb21tYW5kIDogaW50MzJfdCB7CisgICAgSU5JVF9PSyA9IDAsCisgICAgSU5JVF9FUlJPUiwKKyAgICBTRU5ELAorICAgIFJFQ0VJVkVfT0ssCisgICAgUkVDRUlWRV9FUlJPUiwKK307CisKKy8vIGNvbW11bmljYXRpb24gbWVzc2FnZSBiZXR3ZWVuIHByb2Nlc3Nlcy4KK3VuaW9uIFBpcGVNZXNzYWdlIHsKKyAgICBzdHJ1Y3QgIHsKKyAgICAgICAgaW50MzJfdCBjb21tYW5kOworICAgICAgICBCdWZmZXJJZCBidWZmZXJJZDsKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZDsKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkOworICAgICAgICBpbnQ2NF90ICB0aW1lc3RhbXBVczsKKyAgICB9IGRhdGE7CisgICAgY2hhciBhcnJheVswXTsKK307CisKKy8vIG1lZGlhLmJ1ZmZlcnBvb2wgdGVzdCBzZXR1cAorY2xhc3MgQnVmZmVycG9vbE11bHRpVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgICAgbVJlY2VpdmVyUGlkID0gLTE7CisgICAgbUNvbm5lY3Rpb25WYWxpZCA9IGZhbHNlOworCisgICAgQVNTRVJUX1RSVUUocGlwZShtQ29tbWFuZFBpcGVGZHMpID09IDApOworICAgIEFTU0VSVF9UUlVFKHBpcGUobVJlc3VsdFBpcGVGZHMpID09IDApOworCisgICAgbVJlY2VpdmVyUGlkID0gZm9yaygpOworICAgIEFTU0VSVF9UUlVFKG1SZWNlaXZlclBpZCA+PSAwKTsKKworICAgIGlmIChtUmVjZWl2ZXJQaWQgPT0gMCkgeworICAgICAgZG9SZWNlaXZlcigpOworICAgICAgLy8gSW4gb3JkZXIgdG8gaWdub3JlIGd0ZXN0IGJlaGF2aW91ciwgd2FpdCBmb3IgYmVpbmcga2lsbGVkIGZyb20KKyAgICAgIC8vIHRlYXJEb3duCisgICAgICBwYXVzZSgpOworICAgIH0KKworICAgIG1NYW5hZ2VyID0gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKKyAgICBBU1NFUlRfTkUobU1hbmFnZXIsIG51bGxwdHIpOworCisgICAgbUFsbG9jYXRvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8VGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I+KCk7CisgICAgQVNTRVJUX1RSVUUoKGJvb2wpbUFsbG9jYXRvcik7CisKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+Y3JlYXRlKG1BbGxvY2F0b3IsICZtQ29ubmVjdGlvbklkKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgICAgbUNvbm5lY3Rpb25WYWxpZCA9IHRydWU7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgaWYgKG1SZWNlaXZlclBpZCA+IDApIHsKKyAgICAgIGtpbGwobVJlY2VpdmVyUGlkLCBTSUdLSUxMKTsKKyAgICAgIGludCB3c3RhdHVzOworICAgICAgd2FpdCgmd3N0YXR1cyk7CisgICAgfQorCisgICAgaWYgKG1Db25uZWN0aW9uVmFsaWQpIHsKKyAgICAgIG1NYW5hZ2VyLT5jbG9zZShtQ29ubmVjdGlvbklkKTsKKyAgICB9CisgIH0KKworIHByb3RlY3RlZDoKKyAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworICB9CisKKyAgYW5kcm9pZDo6c3A8Q2xpZW50TWFuYWdlcj4gbU1hbmFnZXI7CisgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworICBib29sIG1Db25uZWN0aW9uVmFsaWQ7CisgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworICBwaWRfdCBtUmVjZWl2ZXJQaWQ7CisgIGludCBtQ29tbWFuZFBpcGVGZHNbMl07CisgIGludCBtUmVzdWx0UGlwZUZkc1syXTsKKworICBib29sIHNlbmRNZXNzYWdlKGludCAqcGlwZXMsIGNvbnN0IFBpcGVNZXNzYWdlICZtZXNzYWdlKSB7CisgICAgaW50IHJldCA9IHdyaXRlKHBpcGVzWzFdLCBtZXNzYWdlLmFycmF5LCBzaXplb2YoUGlwZU1lc3NhZ2UpKTsKKyAgICByZXR1cm4gcmV0ID09IHNpemVvZihQaXBlTWVzc2FnZSk7CisgIH0KKworICBib29sIHJlY2VpdmVNZXNzYWdlKGludCAqcGlwZXMsIFBpcGVNZXNzYWdlICptZXNzYWdlKSB7CisgICAgaW50IHJldCA9IHJlYWQocGlwZXNbMF0sIG1lc3NhZ2UtPmFycmF5LCBzaXplb2YoUGlwZU1lc3NhZ2UpKTsKKyAgICByZXR1cm4gcmV0ID09IHNpemVvZihQaXBlTWVzc2FnZSk7CisgIH0KKworICB2b2lkIGRvUmVjZWl2ZXIoKSB7CisgICAgY29uZmlndXJlUnBjVGhyZWFkcG9vbCgxLCBmYWxzZSk7CisgICAgUGlwZU1lc3NhZ2UgbWVzc2FnZTsKKyAgICBtTWFuYWdlciA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgaWYgKCFtTWFuYWdlcikgeworICAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6SU5JVF9FUlJPUjsKKyAgICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgYW5kcm9pZDo6c3RhdHVzX3Qgc3RhdHVzID0gbU1hbmFnZXItPnJlZ2lzdGVyQXNTZXJ2aWNlKCk7CisgICAgaWYgKHN0YXR1cyAhPSBhbmRyb2lkOjpPSykgeworICAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6SU5JVF9FUlJPUjsKKyAgICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6SU5JVF9PSzsKKyAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisKKyAgICByZWNlaXZlTWVzc2FnZShtQ29tbWFuZFBpcGVGZHMsICZtZXNzYWdlKTsKKyAgICB7CisgICAgICBuYXRpdmVfaGFuZGxlX3QgKnJoYW5kbGUgPSBudWxscHRyOworICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiByYnVmZmVyOworICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWNlaXZlKAorICAgICAgICAgIG1lc3NhZ2UuZGF0YS5jb25uZWN0aW9uSWQsIG1lc3NhZ2UuZGF0YS50cmFuc2FjdGlvbklkLAorICAgICAgICAgIG1lc3NhZ2UuZGF0YS5idWZmZXJJZCwgbWVzc2FnZS5kYXRhLnRpbWVzdGFtcFVzLCAmcmhhbmRsZSwgJnJidWZmZXIpOworICAgICAgbU1hbmFnZXItPmNsb3NlKG1lc3NhZ2UuZGF0YS5jb25uZWN0aW9uSWQpOworICAgICAgaWYgKHN0YXR1cyAhPSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIGlmICghVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OlZlcmlmeShyaGFuZGxlLCAweDc3KSkgeworICAgICAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OlJFQ0VJVkVfRVJST1I7CisgICAgICAgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpSRUNFSVZFX09LOworICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgfQorfTsKKworLy8gQnVmZmVyIHRyYW5zZmVyIHRlc3QgYmV0d2VlbiBwcm9jZXNzZXMuCitURVNUX0YoQnVmZmVycG9vbE11bHRpVGVzdCwgVHJhbnNmZXJCdWZmZXIpIHsKKyAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgUGlwZU1lc3NhZ2UgbWVzc2FnZTsKKworICBBU1NFUlRfVFJVRShyZWNlaXZlTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgJm1lc3NhZ2UpKTsKKworICBhbmRyb2lkOjpzcDxJQ2xpZW50TWFuYWdlcj4gcmVjZWl2ZXIgPSBJQ2xpZW50TWFuYWdlcjo6Z2V0U2VydmljZSgpOworICBDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZDsKKyAgQVNTRVJUX1RSVUUoKGJvb2wpcmVjZWl2ZXIpOworCisgIHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWdpc3RlclNlbmRlcihyZWNlaXZlciwgbUNvbm5lY3Rpb25JZCwgJnJlY2VpdmVySWQpOworICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIHsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKnNoYW5kbGUgPSBudWxscHRyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gc2J1ZmZlcjsKKyAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQ7CisgICAgaW50NjRfdCBwb3N0VXM7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworCisgICAgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcygmdmVjUGFyYW1zKTsKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmc2hhbmRsZSwgJnNidWZmZXIpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKworICAgIEFTU0VSVF9UUlVFKFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpGaWxsKHNoYW5kbGUsIDB4NzcpKTsKKworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5wb3N0U2VuZChyZWNlaXZlcklkLCBzYnVmZmVyLCAmdHJhbnNhY3Rpb25JZCwgJnBvc3RVcyk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworCisgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6U0VORDsKKyAgICBtZXNzYWdlLmRhdGEuYnVmZmVySWQgPSBzYnVmZmVyLT5tSWQ7CisgICAgbWVzc2FnZS5kYXRhLmNvbm5lY3Rpb25JZCA9IHJlY2VpdmVySWQ7CisgICAgbWVzc2FnZS5kYXRhLnRyYW5zYWN0aW9uSWQgPSB0cmFuc2FjdGlvbklkOworICAgIG1lc3NhZ2UuZGF0YS50aW1lc3RhbXBVcyA9IHBvc3RVczsKKyAgICBzZW5kTWVzc2FnZShtQ29tbWFuZFBpcGVGZHMsIG1lc3NhZ2UpOworICB9CisgIEVYUEVDVF9UUlVFKHJlY2VpdmVNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCAmbWVzc2FnZSkpOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICBzZXRlbnYoIlRSRUJMRV9URVNUSU5HX09WRVJSSURFIiwgInRydWUiLCB0cnVlKTsKKyAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgIExPRyhJTkZPKSA8PCAiVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9zaW5nbGUuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL3NpbmdsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczZWI2MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9zaW5nbGUuY3BwCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJidWZmZmVycG9vbF91bml0X3Rlc3QiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL0xlZ2FjeVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAiYWxsb2NhdG9yLmgiCisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6QnVmZmVySWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpDbGllbnRNYW5hZ2VyOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6Q29ubmVjdGlvbklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6VHJhbnNhY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6QnVmZmVyUG9vbERhdGE7CisKK25hbWVzcGFjZSB7CisKKy8vIE51bWJlciBvZiBpdGVyYXRpb24gZm9yIGJ1ZmZlciBhbGxvY2F0aW9uIHRlc3QuCitjb25zdGV4cHIgc3RhdGljIGludCBrTnVtQWxsb2NhdGlvblRlc3QgPSAzOworCisvLyBOdW1iZXIgb2YgaXRlcmF0aW9uIGZvciBidWZmZXIgcmVjeWNsaW5nIHRlc3QuCitjb25zdGV4cHIgc3RhdGljIGludCBrTnVtUmVjeWNsZVRlc3QgPSAzOworCisvLyBtZWRpYS5idWZmZXJwb29sIHRlc3Qgc2V0dXAKK2NsYXNzIEJ1ZmZlcnBvb2xTaW5nbGVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgICBtQ29ubmVjdGlvblZhbGlkID0gZmFsc2U7CisKKyAgICBtTWFuYWdlciA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgQVNTRVJUX05FKG1NYW5hZ2VyLCBudWxscHRyKTsKKworICAgIG1BbGxvY2F0b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yPigpOworICAgIEFTU0VSVF9UUlVFKChib29sKW1BbGxvY2F0b3IpOworCisgICAgc3RhdHVzID0gbU1hbmFnZXItPmNyZWF0ZShtQWxsb2NhdG9yLCAmbUNvbm5lY3Rpb25JZCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworCisgICAgbUNvbm5lY3Rpb25WYWxpZCA9IHRydWU7CisKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+cmVnaXN0ZXJTZW5kZXIobU1hbmFnZXIsIG1Db25uZWN0aW9uSWQsICZtUmVjZWl2ZXJJZCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6QUxSRUFEWV9FWElTVFMgJiYKKyAgICAgICAgICAgICAgICBtUmVjZWl2ZXJJZCA9PSBtQ29ubmVjdGlvbklkKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICBpZiAobUNvbm5lY3Rpb25WYWxpZCkgeworICAgICAgbU1hbmFnZXItPmNsb3NlKG1Db25uZWN0aW9uSWQpOworICAgIH0KKyAgfQorCisgcHJvdGVjdGVkOgorICBzdGF0aWMgdm9pZCBkZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24pIHsKKyAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgIH0KKworICBhbmRyb2lkOjpzcDxDbGllbnRNYW5hZ2VyPiBtTWFuYWdlcjsKKyAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisgIGJvb2wgbUNvbm5lY3Rpb25WYWxpZDsKKyAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7CisgIENvbm5lY3Rpb25JZCBtUmVjZWl2ZXJJZDsKKworfTsKKworLy8gQnVmZmVyIGFsbG9jYXRpb24gdGVzdC4KKy8vIENoZWNrIHdoZXRoZXIgZWFjaCBidWZmZXIgYWxsb2NhdGlvbiBpcyBkb25lIHN1Y2Nlc3NmdWxseSB3aXRoCisvLyB1bmlxdWUgYnVmZmVyIGlkLgorVEVTVF9GKEJ1ZmZlcnBvb2xTaW5nbGVUZXN0LCBBbGxvY2F0ZUJ1ZmZlcikgeworICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWNQYXJhbXM7CisgIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoJnZlY1BhcmFtcyk7CisKKyAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBidWZmZXJba051bUFsbG9jYXRpb25UZXN0XTsKKyAgbmF0aXZlX2hhbmRsZV90ICphbGxvY0hhbmRsZSA9IG51bGxwdHI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga051bUFsbG9jYXRpb25UZXN0OyArK2kpIHsKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmYWxsb2NIYW5kbGUsICZidWZmZXJbaV0pOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1BbGxvY2F0aW9uVGVzdDsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwga051bUFsbG9jYXRpb25UZXN0OyArK2opIHsKKyAgICAgIEFTU0VSVF9UUlVFKGJ1ZmZlcltpXS0+bUlkICE9IGJ1ZmZlcltqXS0+bUlkKTsKKyAgICB9CisgIH0KKyAgRVhQRUNUX1RSVUUoa051bUFsbG9jYXRpb25UZXN0ID4gMSk7Cit9CisKKy8vIEJ1ZmZlciByZWN5Y2xlIHRlc3QuCisvLyBDaGVjayB3aGV0aGVyIGRlLWFsbG9jYXRlZCBidWZmZXJzIGFyZSByZWN5Y2xlZC4KK1RFU1RfRihCdWZmZXJwb29sU2luZ2xlVGVzdCwgUmVjeWNsZUJ1ZmZlcikgeworICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWNQYXJhbXM7CisgIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoJnZlY1BhcmFtcyk7CisKKyAgQnVmZmVySWQgYmlkW2tOdW1SZWN5Y2xlVGVzdF07CisgIGZvciAoaW50IGkgPSAwOyBpIDwga051bVJlY3ljbGVUZXN0OyArK2kpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJ1ZmZlcjsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKmFsbG9jSGFuZGxlID0gbnVsbHB0cjsKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmYWxsb2NIYW5kbGUsICZidWZmZXIpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgICBiaWRbaV0gPSBidWZmZXItPm1JZDsKKyAgfQorICBmb3IgKGludCBpID0gMTsgaSA8IGtOdW1SZWN5Y2xlVGVzdDsgKytpKSB7CisgICAgQVNTRVJUX1RSVUUoYmlkW2kgLSAxXSA9PSBiaWRbaV0pOworICB9CisgIEVYUEVDVF9UUlVFKGtOdW1SZWN5Y2xlVGVzdCA+IDEpOworfQorCisvLyBCdWZmZXIgdHJhbnNmZXIgdGVzdC4KKy8vIENoZWNrIHdoZXRoZXIgYnVmZmVyIGlzIHRyYW5zZmVycmVkIHRvIGFub3RoZXIgY2xpZW50IHN1Y2Nlc3NmdWxseS4KK1RFU1RfRihCdWZmZXJwb29sU2luZ2xlVGVzdCwgVHJhbnNmZXJCdWZmZXIpIHsKKyAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworICBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKCZ2ZWNQYXJhbXMpOworICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IHNidWZmZXIsIHJidWZmZXI7CisgIG5hdGl2ZV9oYW5kbGVfdCAqYWxsb2NIYW5kbGUgPSBudWxscHRyOworICBuYXRpdmVfaGFuZGxlX3QgKnJlY3ZIYW5kbGUgPSBudWxscHRyOworCisgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZDsKKyAgaW50NjRfdCBwb3N0VXM7CisKKyAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJmFsbG9jSGFuZGxlLCAmc2J1ZmZlcik7CisgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgQVNTRVJUX1RSVUUoVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OkZpbGwoYWxsb2NIYW5kbGUsIDB4NzcpKTsKKyAgc3RhdHVzID0gbU1hbmFnZXItPnBvc3RTZW5kKG1SZWNlaXZlcklkLCBzYnVmZmVyLCAmdHJhbnNhY3Rpb25JZCwgJnBvc3RVcyk7CisgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgc3RhdHVzID0gbU1hbmFnZXItPnJlY2VpdmUobVJlY2VpdmVySWQsIHRyYW5zYWN0aW9uSWQsIHNidWZmZXItPm1JZCwgcG9zdFVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjdkhhbmRsZSwgJnJidWZmZXIpOworICBFWFBFQ1RfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIEFTU0VSVF9UUlVFKFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpWZXJpZnkocmVjdkhhbmRsZSwgMHg3NykpOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgTE9HKElORk8pIDw8ICJUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3IuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YjQ2MDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3Nvci5jcHAKQEAgLTAsMCArMSwyMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQb29sQ29ubmVjdGlvbiIKKworI2luY2x1ZGUgIkFjY2Vzc29yLmgiCisjaW5jbHVkZSAiQWNjZXNzb3JJbXBsLmgiCisjaW5jbHVkZSAiQ29ubmVjdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3ZvaWQgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OjphZGQoCisgICAgICAgIGludDY0X3QgY29ubmVjdGlvbklkLAorICAgICAgICBjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGlmIChtQWNjZXNzb3JzLmZpbmQoY29ubmVjdGlvbklkKSA9PSBtQWNjZXNzb3JzLmVuZCgpKSB7CisgICAgICAgIG1BY2Nlc3NvcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbm5lY3Rpb25JZCwgYWNjZXNzb3IpKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OjpyZW1vdmUoaW50NjRfdCBjb25uZWN0aW9uSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgbUFjY2Vzc29ycy5lcmFzZShjb25uZWN0aW9uSWQpOworICAgIGF1dG8gaXQgPSBtQ29ubmVjdGlvblRvQ29va2llLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAoaXQgIT0gbUNvbm5lY3Rpb25Ub0Nvb2tpZS5lbmQoKSkgeworICAgICAgICB1aW50NjRfdCBjb29raWUgPSBpdC0+c2Vjb25kOworICAgICAgICBtQ29ubmVjdGlvblRvQ29va2llLmVyYXNlKGl0KTsKKyAgICAgICAgYXV0byBjaXQgPSBtQ29va2llVG9Db25uZWN0aW9ucy5maW5kKGNvb2tpZSk7CisgICAgICAgIGlmIChjaXQgIT0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgICAgIGNpdC0+c2Vjb25kLmVyYXNlKGNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICBpZiAoY2l0LT5zZWNvbmQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBtQ29va2llVG9Db25uZWN0aW9ucy5lcmFzZShjaXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDo6YWRkQ29va2llVG9Db25uZWN0aW9uKAorICAgICAgICB1aW50NjRfdCBjb29raWUsCisgICAgICAgIGludDY0X3QgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGlmIChtQWNjZXNzb3JzLmZpbmQoY29ubmVjdGlvbklkKSA9PSBtQWNjZXNzb3JzLmVuZCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUNvbm5lY3Rpb25Ub0Nvb2tpZS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY29ubmVjdGlvbklkLCBjb29raWUpKTsKKyAgICBhdXRvIGl0ID0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZmluZChjb29raWUpOworICAgIGlmIChpdCAhPSBtQ29va2llVG9Db25uZWN0aW9ucy5lbmQoKSkgeworICAgICAgICBpdC0+c2Vjb25kLmluc2VydChjb25uZWN0aW9uSWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Db29raWVUb0Nvbm5lY3Rpb25zLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICBjb29raWUsIHN0ZDo6c2V0PGludDY0X3Q+e2Nvbm5lY3Rpb25JZH0pKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OjpzZXJ2aWNlRGllZCgKKyAgICAgICAgdWludDY0X3QgY29va2llLAorICAgICAgICBjb25zdCB3cDw6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgLyogd2hvICovCisgICAgICAgICkgeworICAgIHN0ZDo6bWFwPGludDY0X3QsIGNvbnN0IHdwPEFjY2Vzc29yPj4gY29ubmVjdGlvbnNUb0Nsb3NlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworCisgICAgICAgIGF1dG8gaXQgPSBtQ29va2llVG9Db25uZWN0aW9ucy5maW5kKGNvb2tpZSk7CisgICAgICAgIGlmIChpdCAhPSBtQ29va2llVG9Db25uZWN0aW9ucy5lbmQoKSkgeworICAgICAgICAgICAgZm9yIChhdXRvIGNvbkl0ID0gaXQtPnNlY29uZC5iZWdpbigpOyBjb25JdCAhPSBpdC0+c2Vjb25kLmVuZCgpOyArK2Nvbkl0KSB7CisgICAgICAgICAgICAgICAgYXV0byBhY2Nlc3Nvckl0ID0gbUFjY2Vzc29ycy5maW5kKCpjb25JdCk7CisgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc29ySXQgIT0gbUFjY2Vzc29ycy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uc1RvQ2xvc2UuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCpjb25JdCwgYWNjZXNzb3JJdC0+c2Vjb25kKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY2Nlc3NvcnMuZXJhc2UoYWNjZXNzb3JJdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uVG9Db29raWUuZXJhc2UoKmNvbkl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db29raWVUb0Nvbm5lY3Rpb25zLmVyYXNlKGl0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjb25uZWN0aW9uc1RvQ2xvc2Uuc2l6ZSgpID4gMCkgeworICAgICAgICBzcDxBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgICAgIGZvciAoYXV0byBpdCA9IGNvbm5lY3Rpb25zVG9DbG9zZS5iZWdpbigpOyBpdCAhPSBjb25uZWN0aW9uc1RvQ2xvc2UuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGFjY2Vzc29yID0gaXQtPnNlY29uZC5wcm9tb3RlKCk7CisKKyAgICAgICAgICAgIGlmIChhY2Nlc3NvcikgeworICAgICAgICAgICAgICAgIGFjY2Vzc29yLT5jbG9zZShpdC0+Zmlyc3QpOworICAgICAgICAgICAgICAgIEFMT0dEKCJjb25uZWN0aW9uICVsbGQgY2xvc2VkIG9uIGRlYXRoIiwgKGxvbmcgbG9uZylpdC0+Zmlyc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCituYW1lc3BhY2Ugeworc3RhdGljIHNwPENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudD4gc0Nvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCA9CisgICAgICAgIG5ldyBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQoKTsKK30KKworc3A8Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50PiBBY2Nlc3Nvcjo6Z2V0Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50KCkgeworICAgIHJldHVybiBzQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OworfQorCit2b2lkIEFjY2Vzc29yOjpjcmVhdGVJbnZhbGlkYXRvcigpIHsKKyAgICBBY2Nlc3Nvcjo6SW1wbDo6Y3JlYXRlSW52YWxpZGF0b3IoKTsKK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQWNjZXNzb3IgZm9sbG93LgorUmV0dXJuPHZvaWQ+IEFjY2Vzc29yOjpjb25uZWN0KAorICAgICAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SU9ic2VydmVyPiYgb2JzZXJ2ZXIsCisgICAgICAgIGNvbm5lY3RfY2IgX2hpZGxfY2IpIHsKKyAgICBzcDxDb25uZWN0aW9uPiBjb25uZWN0aW9uOworICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQ7CisgICAgdWludDMyX3QgbXNnSWQ7CisgICAgY29uc3QgU3RhdHVzRGVzY3JpcHRvciogZm1xRGVzYzsKKyAgICBjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yKiBpbnZEZXNjOworCisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IGNvbm5lY3QoCisgICAgICAgICAgICBvYnNlcnZlciwgZmFsc2UsICZjb25uZWN0aW9uLCAmY29ubmVjdGlvbklkLCAmbXNnSWQsICZmbXFEZXNjLCAmaW52RGVzYyk7CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIF9oaWRsX2NiKHN0YXR1cywgY29ubmVjdGlvbiwgY29ubmVjdGlvbklkLCBtc2dJZCwgKmZtcURlc2MsICppbnZEZXNjKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfaGlkbF9jYihzdGF0dXMsIG51bGxwdHIsIC0xTEwsIDAsCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jPEJ1ZmZlclN0YXR1c01lc3NhZ2U+KAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OmhhcmR3YXJlOjpHcmFudG9yRGVzY3JpcHRvcj4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIG5oYW5kbGUgKi8sIDAgLyogc2l6ZSAqLyksCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JVbnN5bmM8QnVmZmVySW52YWxpZGF0aW9uTWVzc2FnZT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YW5kcm9pZDo6aGFyZHdhcmU6OkdyYW50b3JEZXNjcmlwdG9yPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogbmhhbmRsZSAqLywgMCAvKiBzaXplICovKSk7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKK0FjY2Vzc29yOjpBY2Nlc3Nvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvcikKKyAgICA6IG1JbXBsKG5ldyBJbXBsKGFsbG9jYXRvcikpIHt9CisKK0FjY2Vzc29yOjp+QWNjZXNzb3IoKSB7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OmlzVmFsaWQoKSB7CisgICAgcmV0dXJuIChib29sKW1JbXBsICYmIG1JbXBsLT5pc1ZhbGlkKCk7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6Zmx1c2goKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIG1JbXBsLT5mbHVzaCgpOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6YWxsb2NhdGUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+YWxsb2NhdGUoY29ubmVjdGlvbklkLCBwYXJhbXMsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpmZXRjaCgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+ZmV0Y2goY29ubmVjdGlvbklkLCB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6Y29ubmVjdCgKKyAgICAgICAgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIsIGJvb2wgbG9jYWwsCisgICAgICAgIHNwPENvbm5lY3Rpb24+ICpjb25uZWN0aW9uLCBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQsCisgICAgICAgIHVpbnQzMl90ICpwTXNnSWQsCisgICAgICAgIGNvbnN0IFN0YXR1c0Rlc2NyaXB0b3IqKiBzdGF0dXNEZXNjUHRyLAorICAgICAgICBjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yKiogaW52RGVzY1B0cikgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUltcGwtPmNvbm5lY3QoCisgICAgICAgICAgICAgICAgdGhpcywgb2JzZXJ2ZXIsIGNvbm5lY3Rpb24sIHBDb25uZWN0aW9uSWQsIHBNc2dJZCwKKyAgICAgICAgICAgICAgICBzdGF0dXNEZXNjUHRyLCBpbnZEZXNjUHRyKTsKKyAgICAgICAgaWYgKCFsb2NhbCAmJiBzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgc3A8QWNjZXNzb3I+IGFjY2Vzc29yKHRoaXMpOworICAgICAgICAgICAgc0Nvbm5lY3Rpb25EZWF0aFJlY2lwaWVudC0+YWRkKCpwQ29ubmVjdGlvbklkLCBhY2Nlc3Nvcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6Y2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUltcGwtPmNsb3NlKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIHNDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQtPnJlbW92ZShjb25uZWN0aW9uSWQpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKwordm9pZCBBY2Nlc3Nvcjo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgbUltcGwtPmNsZWFuVXAoY2xlYXJDYWNoZSk7CisgICAgfQorfQorCisvL0lBY2Nlc3NvciogSElETF9GRVRDSF9JQWNjZXNzb3IoY29uc3QgY2hhciogLyogbmFtZSAqLykgeworLy8gICAgcmV0dXJuIG5ldyBBY2Nlc3NvcigpOworLy99CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29yLmggYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMDI1MTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3Nvci5oCkBAIC0wLDAgKzEsMjAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9BQ0NFU1NPUl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0FDQ0VTU09SX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUFjY2Vzc29yLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JT2JzZXJ2ZXIuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlICJCdWZmZXJTdGF0dXMuaCIKKworI2luY2x1ZGUgPHNldD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBBY2Nlc3NvcjsKK3N0cnVjdCBDb25uZWN0aW9uOworCisvKioKKyAqIFJlY2VpdmVzIGRlYXRoIG5vdGlmaWNhdGlvbnMgZnJvbSByZW1vdGUgY29ubmVjdGlvbnMuCisgKiBPbiBkZWF0aCBub3RpZmljYXRpb25zLCB0aGUgY29ubmVjdGlvbnMgYXJlIGNsb3NlZCBhbmQgdXNlZCByZXNvdXJjZXMKKyAqIGFyZSByZWxlYXNlZC4KKyAqLworc3RydWN0IENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCA6IHB1YmxpYyBoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQgeworICAgIC8qKgorICAgICAqIFJlZ2lzdGVycyBhIG5ld2x5IGNvbm5lY3RlZCBjb25uZWN0aW9uIGZyb20gcmVtb3RlIHByb2Nlc3Nlcy4KKyAgICAgKi8KKyAgICB2b2lkIGFkZChpbnQ2NF90IGNvbm5lY3Rpb25JZCwgY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3Nvcik7CisKKyAgICAvKioKKyAgICAgKiBSZW1vdmVzIGEgY29ubmVjdGlvbi4KKyAgICAgKi8KKyAgICB2b2lkIHJlbW92ZShpbnQ2NF90IGNvbm5lY3Rpb25JZCk7CisKKyAgICB2b2lkIGFkZENvb2tpZVRvQ29ubmVjdGlvbih1aW50NjRfdCBjb29raWUsIGludDY0X3QgY29ubmVjdGlvbklkKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXJ2aWNlRGllZCgKKyAgICAgICAgICAgIHVpbnQ2NF90IC8qIGNvb2tpZSAqLywKKyAgICAgICAgICAgIGNvbnN0IHdwPDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U+JiAvKiB3aG8gKi8KKyAgICAgICAgICAgICkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICBzdGQ6Om1hcDx1aW50NjRfdCwgc3RkOjpzZXQ8aW50NjRfdD4+ICBtQ29va2llVG9Db25uZWN0aW9uczsKKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCB1aW50NjRfdD4gbUNvbm5lY3Rpb25Ub0Nvb2tpZTsKKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCBjb25zdCB3cDxBY2Nlc3Nvcj4+IG1BY2Nlc3NvcnM7Cit9OworCisvKioKKyAqIEEgYnVmZmVyIHBvb2wgYWNjZXNzb3Igd2hpY2ggZW5hYmxlcyBhIGJ1ZmZlciBwb29sIHRvIGNvbW11bmljYXRlIHdpdGggYnVmZmVyCisgKiBwb29sIGNsaWVudHMuIDE6MSBjb3JyZXNwb25kZW5zZSBob2xkcyBiZXR3ZWVuIGEgYnVmZmVyIHBvb2wgYW5kIGFuIGFjY2Vzc29yLgorICovCitzdHJ1Y3QgQWNjZXNzb3IgOiBwdWJsaWMgSUFjY2Vzc29yIHsKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklBY2Nlc3NvciBmb2xsb3cuCisgICAgUmV0dXJuPHZvaWQ+IGNvbm5lY3QoY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklPYnNlcnZlcj4mIG9ic2VydmVyLCBjb25uZWN0X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWZmZXIgcG9vbCBhY2Nlc3NvciB3aGljaCB1c2VzIHRoZSBzcGVjaWZpZWQgYWxsb2NhdG9yLgorICAgICAqCisgICAgICogQHBhcmFtIGFsbG9jYXRvciBidWZmZXIgYWxsb2NhdG9yLgorICAgICAqLworICAgIGV4cGxpY2l0IEFjY2Vzc29yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yKTsKKworICAgIC8qKiBEZXN0cnVjdHMgYSBidWZmZXIgcG9vbCBhY2Nlc3Nvci4gKi8KKyAgICB+QWNjZXNzb3IoKTsKKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGFjY2Vzc29yIGlzIHZhbGlkLiAqLworICAgIGJvb2wgaXNWYWxpZCgpOworCisgICAgLyoqIEludmFsaWRhdGVzIGFsbCBidWZmZXJzIHdoaWNoIGFyZSBvd25lZCBieSBidWZmZXJwb29sICovCisgICAgUmVzdWx0U3RhdHVzIGZsdXNoKCk7CisKKyAgICAvKiogQWxsb2NhdGVzIGEgYnVmZmVyIGZyb20gYSBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBjb25uZWN0aW9uIGlkIG9mIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIHBhcmFtcyAgICAgICAgdGhlIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICogQHBhcmFtIGhhbmRsZSAgICAgICAgdGhlIG5hdGl2ZSBoYW5kbGUgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywKKyAgICAgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBGZXRjaGVzIGEgYnVmZmVyIGZvciB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGlkIG9mIHJlY2VpdmluZyBjb25uZWN0aW9uKGNsaWVudCkuCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uSWQgdGhlIGlkIG9mIHRoZSB0cmFuc2ZlciB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGJ1ZmZlciB0byBiZSBmZXRjaGVkLgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgICAgIHRoZSBuYXRpdmUgaGFuZGxlIG9mIHRoZSBmZXRjaGVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciBpcyBzdWNjZXNzZnVsbHkgZmV0Y2hlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgZmV0Y2goCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpOworCisgICAgLyoqCisgICAgICogTWFrZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBidWZmZXIgcG9vbC4gVGhlIGJ1ZmZlciBwb29sIGNsaWVudCB1c2VzIHRoZQorICAgICAqIGNyZWF0ZWQgY29ubmVjdGlvbiBpbiBvcmRlciB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBidWZmZXIgcG9vbC4gQW4KKyAgICAgKiBGTVEgZm9yIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBpcyBhbHNvIGNyZWF0ZWQgZm9yIHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gb2JzZXJ2ZXIgICAgICBjbGllbnQgb2JzZXJ2ZXIgZm9yIGJ1ZmZlciBpbnZhbGlkYXRpb24KKyAgICAgKiBAcGFyYW0gbG9jYWwgICAgICAgICB0cnVlIHdoZW4gYSBjb25uZWN0aW9uIHJlcXVlc3QgY29tZXMgZnJvbSBsb2NhbCBwcm9jZXNzLAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbiAgICBjcmVhdGVkIGNvbm5lY3Rpb24KKyAgICAgKiBAcGFyYW0gcENvbm5lY3Rpb25JZCB0aGUgaWQgb2YgdGhlIGNyZWF0ZWQgY29ubmVjdGlvbgorICAgICAqIEBwYXJhbSBwTXNnSWQgICAgICAgIHRoZSBpZCBvZiB0aGUgcmVjZW50IGJ1ZmZlciBwb29sIG1lc3NhZ2UKKyAgICAgKiBAcGFyYW0gc3RhdHVzRGVzY1B0ciBGTVEgZGVzY3JpcHRvciBmb3Igc2hhcmVkIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlIGJldHdlZW4gYSBidWZmZXIgcG9vbCBhbmQgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gaW52RGVzY1B0ciAgICBGTVEgZGVzY3JpcHRvciBmb3IgYnVmZmVyIGludmFsaWRhdGlvbiBtZXNzYWdlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcXVldWUgZnJvbSBhIGJ1ZmZlciBwb29sIHRvIHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBjb25uZWN0aW9uIGlzIHN1Y2Nlc3NmdWxseSBtYWRlLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBjb25uZWN0KAorICAgICAgICAgICAgY29uc3Qgc3A8SU9ic2VydmVyPiYgb2JzZXJ2ZXIsCisgICAgICAgICAgICBib29sIGxvY2FsLAorICAgICAgICAgICAgc3A8Q29ubmVjdGlvbj4gKmNvbm5lY3Rpb24sIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIHVpbnQzMl90ICpwTXNnSWQsCisgICAgICAgICAgICBjb25zdCBTdGF0dXNEZXNjcmlwdG9yKiogc3RhdHVzRGVzY1B0ciwKKyAgICAgICAgICAgIGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IqKiBpbnZEZXNjUHRyKTsKKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gdG8gdGhlIGNsaWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgLyoqCisgICAgICogUHJvY2Vzc2VzIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBhbmQgcGVyZm9tcyBwZXJpb2RpYyBjYWNoZQorICAgICAqIGNsZWFuaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGNsZWFyQ2FjaGUgICAgaWYgY2xlYXJDYWNoZSBpcyB0cnVlLCBpdCBmcmVlcyBhbGwgYnVmZmVycyB3YWl0aW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVjeWNsZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgaGlkbF9kZWF0aF9yZWNpcGllbnQgZm9yIHJlbW90ZSBjb25uZWN0aW9uIGRlYXRoLgorICAgICAqLworICAgIHN0YXRpYyBzcDxDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ+IGdldENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCgpOworCisgICAgc3RhdGljIHZvaWQgY3JlYXRlSW52YWxpZGF0b3IoKTsKKworcHJpdmF0ZToKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9BQ0NFU1NPUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3NvckltcGwuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3JJbXBsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NGNmMDA2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3JJbXBsLmNwcApAQCAtMCwwICsxLDg2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbEFjY2Vzc29yIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlICJBY2Nlc3NvckltcGwuaCIKKyNpbmNsdWRlICJDb25uZWN0aW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworbmFtZXNwYWNlIHsKKyAgICBzdGF0aWMgY29uc3RleHByIGludDY0X3Qga0NsZWFuVXBEdXJhdGlvblVzID0gNTAwMDAwOyAvLyBUT0RPIHR1bmUgMC41IHNlYworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrTG9nRHVyYXRpb25VcyA9IDUwMDAwMDA7IC8vIDUgc2VjcworCisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01pbkFsbG9jQnl0ZXNGb3JFdmljdGlvbiA9IDEwMjQqMTAyNCoxNTsKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWluQnVmZmVyQ291bnRGb3JFdmljdGlvbiA9IDQwOworfQorCisvLyBCdWZmZXIgc3RydWN0dXJlIGluIGJ1ZmZlcnBvb2wgcHJvY2Vzcworc3RydWN0IEludGVybmFsQnVmZmVyIHsKKyAgICBCdWZmZXJJZCBtSWQ7CisgICAgc2l6ZV90IG1Pd25lckNvdW50OworICAgIHNpemVfdCBtVHJhbnNhY3Rpb25Db3VudDsKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+IG1BbGxvY2F0aW9uOworICAgIGNvbnN0IHNpemVfdCBtQWxsb2NTaXplOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1Db25maWc7CisgICAgYm9vbCBtSW52YWxpZGF0ZWQ7CisKKyAgICBJbnRlcm5hbEJ1ZmZlcigKKyAgICAgICAgICAgIEJ1ZmZlcklkIGlkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgICAgICBjb25zdCBzaXplX3QgYWxsb2NTaXplLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmFsbG9jQ29uZmlnKQorICAgICAgICAgICAgOiBtSWQoaWQpLCBtT3duZXJDb3VudCgwKSwgbVRyYW5zYWN0aW9uQ291bnQoMCksCisgICAgICAgICAgICBtQWxsb2NhdGlvbihhbGxvYyksIG1BbGxvY1NpemUoYWxsb2NTaXplKSwgbUNvbmZpZyhhbGxvY0NvbmZpZyksCisgICAgICAgICAgICBtSW52YWxpZGF0ZWQoZmFsc2UpIHt9CisKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uLT5oYW5kbGUoKTsKKyAgICB9CisKKyAgICB2b2lkIGludmFsaWRhdGUoKSB7CisgICAgICAgIG1JbnZhbGlkYXRlZCA9IHRydWU7CisgICAgfQorfTsKKworc3RydWN0IFRyYW5zYWN0aW9uU3RhdHVzIHsKKyAgICBUcmFuc2FjdGlvbklkIG1JZDsKKyAgICBCdWZmZXJJZCBtQnVmZmVySWQ7CisgICAgQ29ubmVjdGlvbklkIG1TZW5kZXI7CisgICAgQ29ubmVjdGlvbklkIG1SZWNlaXZlcjsKKyAgICBCdWZmZXJTdGF0dXMgbVN0YXR1czsKKyAgICBpbnQ2NF90IG1UaW1lc3RhbXBVczsKKyAgICBib29sIG1TZW5kZXJWYWxpZGF0ZWQ7CisKKyAgICBUcmFuc2FjdGlvblN0YXR1cyhjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlLCBpbnQ2NF90IHRpbWVzdGFtcFVzKSB7CisgICAgICAgIG1JZCA9IG1lc3NhZ2UudHJhbnNhY3Rpb25JZDsKKyAgICAgICAgbUJ1ZmZlcklkID0gbWVzc2FnZS5idWZmZXJJZDsKKyAgICAgICAgbVN0YXR1cyA9IG1lc3NhZ2UubmV3U3RhdHVzOworICAgICAgICBtVGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKKyAgICAgICAgaWYgKG1TdGF0dXMgPT0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9UTykgeworICAgICAgICAgICAgbVNlbmRlciA9IG1lc3NhZ2UuY29ubmVjdGlvbklkOworICAgICAgICAgICAgbVJlY2VpdmVyID0gbWVzc2FnZS50YXJnZXRDb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBtU2VuZGVyVmFsaWRhdGVkID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TZW5kZXIgPSAtMUxMOworICAgICAgICAgICAgbVJlY2VpdmVyID0gbWVzc2FnZS5jb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBtU2VuZGVyVmFsaWRhdGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9Cit9OworCisvLyBIZWxwZXIgdGVtcGxhdGUgbWV0aG9kcyBmb3IgaGFuZGxpbmcgbWFwIG9mIHNldC4KK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+Citib29sIGluc2VydChzdGQ6Om1hcDxULCBzdGQ6OnNldDxVPj4gKm1hcE9mU2V0LCBUIGtleSwgVSB2YWx1ZSkgeworICAgIGF1dG8gaXRlciA9IG1hcE9mU2V0LT5maW5kKGtleSk7CisgICAgaWYgKGl0ZXIgPT0gbWFwT2ZTZXQtPmVuZCgpKSB7CisgICAgICAgIHN0ZDo6c2V0PFU+IHZhbHVlU2V0e3ZhbHVlfTsKKyAgICAgICAgbWFwT2ZTZXQtPmluc2VydChzdGQ6Om1ha2VfcGFpcihrZXksIHZhbHVlU2V0KSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoaXRlci0+c2Vjb25kLmZpbmQodmFsdWUpICA9PSBpdGVyLT5zZWNvbmQuZW5kKCkpIHsKKyAgICAgICAgaXRlci0+c2Vjb25kLmluc2VydCh2YWx1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+Citib29sIGVyYXNlKHN0ZDo6bWFwPFQsIHN0ZDo6c2V0PFU+PiAqbWFwT2ZTZXQsIFQga2V5LCBVIHZhbHVlKSB7CisgICAgYm9vbCByZXQgPSBmYWxzZTsKKyAgICBhdXRvIGl0ZXIgPSBtYXBPZlNldC0+ZmluZChrZXkpOworICAgIGlmIChpdGVyICE9IG1hcE9mU2V0LT5lbmQoKSkgeworICAgICAgICBpZiAoaXRlci0+c2Vjb25kLmVyYXNlKHZhbHVlKSA+IDApIHsKKyAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGl0ZXItPnNlY29uZC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgbWFwT2ZTZXQtPmVyYXNlKGl0ZXIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+Citib29sIGNvbnRhaW5zKHN0ZDo6bWFwPFQsIHN0ZDo6c2V0PFU+PiAqbWFwT2ZTZXQsIFQga2V5LCBVIHZhbHVlKSB7CisgICAgYXV0byBpdGVyID0gbWFwT2ZTZXQtPmZpbmQoa2V5KTsKKyAgICBpZiAoaXRlciAhPSBtYXBPZlNldC0+ZW5kKCkpIHsKKyAgICAgICAgYXV0byBzZXRJdGVyID0gaXRlci0+c2Vjb25kLmZpbmQodmFsdWUpOworICAgICAgICByZXR1cm4gc2V0SXRlciAhPSBpdGVyLT5zZWNvbmQuZW5kKCk7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworaW50MzJfdCBBY2Nlc3Nvcjo6SW1wbDo6c1BpZCA9IGdldHBpZCgpOwordWludDMyX3QgQWNjZXNzb3I6OkltcGw6OnNTZXFJZCA9IHRpbWUobnVsbHB0cik7CisKK0FjY2Vzc29yOjpJbXBsOjpJbXBsKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvcikKKyAgICAgICAgOiBtQWxsb2NhdG9yKGFsbG9jYXRvcikge30KKworQWNjZXNzb3I6OkltcGw6On5JbXBsKCkgeworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OmNvbm5lY3QoCisgICAgICAgIGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyLAorICAgICAgICBzcDxDb25uZWN0aW9uPiAqY29ubmVjdGlvbiwKKyAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkLAorICAgICAgICB1aW50MzJfdCAqcE1zZ0lkLAorICAgICAgICBjb25zdCBTdGF0dXNEZXNjcmlwdG9yKiogc3RhdHVzRGVzY1B0ciwKKyAgICAgICAgY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvcioqIGludkRlc2NQdHIpIHsKKyAgICBzcDxDb25uZWN0aW9uPiBuZXdDb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24oKTsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgICAgIGlmIChuZXdDb25uZWN0aW9uKSB7CisgICAgICAgICAgICBDb25uZWN0aW9uSWQgaWQgPSAoaW50NjRfdClzUGlkIDw8IDMyIHwgc1NlcUlkOworICAgICAgICAgICAgc3RhdHVzID0gbUJ1ZmZlclBvb2wubU9ic2VydmVyLm9wZW4oaWQsIHN0YXR1c0Rlc2NQdHIpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgbmV3Q29ubmVjdGlvbi0+aW5pdGlhbGl6ZShhY2Nlc3NvciwgaWQpOworICAgICAgICAgICAgICAgICpjb25uZWN0aW9uID0gbmV3Q29ubmVjdGlvbjsKKyAgICAgICAgICAgICAgICAqcENvbm5lY3Rpb25JZCA9IGlkOworICAgICAgICAgICAgICAgICpwTXNnSWQgPSBtQnVmZmVyUG9vbC5tSW52YWxpZGF0aW9uLm1JbnZhbGlkYXRpb25JZDsKKyAgICAgICAgICAgICAgICBtQnVmZmVyUG9vbC5tSW52YWxpZGF0aW9uQ2hhbm5lbC5nZXREZXNjKGludkRlc2NQdHIpOworICAgICAgICAgICAgICAgIG1CdWZmZXJQb29sLm1JbnZhbGlkYXRpb24ub25Db25uZWN0KGlkLCBvYnNlcnZlcik7CisgICAgICAgICAgICAgICAgKytzU2VxSWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICAgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcCgpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OmNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgIEFMT0dWKCJjb25uZWN0aW9uIGNsb3NlICVsbGQ6ICV1IiwgKGxvbmcgbG9uZyljb25uZWN0aW9uSWQsIG1CdWZmZXJQb29sLm1JbnZhbGlkYXRpb24ubUlkKTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBtQnVmZmVyUG9vbC5oYW5kbGVDbG9zZShjb25uZWN0aW9uSWQpOworICAgIG1CdWZmZXJQb29sLm1PYnNlcnZlci5jbG9zZShjb25uZWN0aW9uSWQpOworICAgIG1CdWZmZXJQb29sLm1JbnZhbGlkYXRpb24ub25DbG9zZShjb25uZWN0aW9uSWQpOworICAgIC8vIFNpbmNlIGNsb3NlIyB3aWxsIGJlIGNhbGxlZCBhZnRlciBhbGwgd29ya3MgYXJlIGZpbmlzaGVkLCBpdCBpcyBPSyB0bworICAgIC8vIGV2aWN0IHVudXNlZCBidWZmZXJzLgorICAgIG1CdWZmZXJQb29sLmNsZWFuVXAodHJ1ZSk7CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6YWxsb2NhdGUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsCisgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6T0s7CisgICAgaWYgKCFtQnVmZmVyUG9vbC5nZXRGcmVlQnVmZmVyKG1BbGxvY2F0b3IsIHBhcmFtcywgYnVmZmVySWQsIGhhbmRsZSkpIHsKKyAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgc2l6ZV90IGFsbG9jU2l6ZTsKKyAgICAgICAgc3RhdHVzID0gbUFsbG9jYXRvci0+YWxsb2NhdGUocGFyYW1zLCAmYWxsb2MsICZhbGxvY1NpemUpOworICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBtQnVmZmVyUG9vbC5hZGROZXdCdWZmZXIoYWxsb2MsIGFsbG9jU2l6ZSwgcGFyYW1zLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiY3JlYXRlIGEgYnVmZmVyICVkIDogJXUgJXAiLAorICAgICAgICAgICAgICBzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSywgKmJ1ZmZlcklkLCAqaGFuZGxlKTsKKyAgICB9CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIC8vIFRPRE86IGhhbmRsZSBvd25CdWZmZXIgZmFpbHVyZQorICAgICAgICBtQnVmZmVyUG9vbC5oYW5kbGVPd25CdWZmZXIoY29ubmVjdGlvbklkLCAqYnVmZmVySWQpOworICAgIH0KKyAgICBtQnVmZmVyUG9vbC5jbGVhblVwKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjpmZXRjaCgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBhdXRvIGZvdW5kID0gbUJ1ZmZlclBvb2wubVRyYW5zYWN0aW9ucy5maW5kKHRyYW5zYWN0aW9uSWQpOworICAgIGlmIChmb3VuZCAhPSBtQnVmZmVyUG9vbC5tVHJhbnNhY3Rpb25zLmVuZCgpICYmCisgICAgICAgICAgICBjb250YWlucygmbUJ1ZmZlclBvb2wubVBlbmRpbmdUcmFuc2FjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQpKSB7CisgICAgICAgIGlmIChmb3VuZC0+c2Vjb25kLT5tU2VuZGVyVmFsaWRhdGVkICYmCisgICAgICAgICAgICAgICAgZm91bmQtPnNlY29uZC0+bVN0YXR1cyA9PSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZST00gJiYKKyAgICAgICAgICAgICAgICBmb3VuZC0+c2Vjb25kLT5tQnVmZmVySWQgPT0gYnVmZmVySWQpIHsKKyAgICAgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TdGF0dXMgPSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZFVENIOworICAgICAgICAgICAgYXV0byBidWZmZXJJdCA9IG1CdWZmZXJQb29sLm1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgaWYgKGJ1ZmZlckl0ICE9IG1CdWZmZXJQb29sLm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlclBvb2wubVN0YXRzLm9uQnVmZmVyRmV0Y2hlZCgpOworICAgICAgICAgICAgICAgICpoYW5kbGUgPSBidWZmZXJJdC0+c2Vjb25kLT5oYW5kbGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtQnVmZmVyUG9vbC5jbGVhblVwKCk7CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgLy8gdHJhbnNhY3Rpb24gdGltZW91dCwgYnVmZmVyIGNhY2hlaW5nIFRUTCBoYW5kbGluZworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcChjbGVhckNhY2hlKTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6Zmx1c2goKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBtQnVmZmVyUG9vbC5mbHVzaChzaGFyZWRfZnJvbV90aGlzKCkpOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpoYW5kbGVJbnZhbGlkYXRlQWNrKCkgeworICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgY29uc3Qgc3A8SU9ic2VydmVyPj4gb2JzZXJ2ZXJzOworICAgIHVpbnQzMl90IGludmFsaWRhdGlvbklkOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICAgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgICAgIG1CdWZmZXJQb29sLm1JbnZhbGlkYXRpb24ub25IYW5kbGVBY2soJm9ic2VydmVycywgJmludmFsaWRhdGlvbklkKTsKKyAgICB9CisgICAgLy8gRG8gbm90IGhvbGQgbG9jayBmb3Igc2VuZCBpbnZhbGlkYXRpb25zCisgICAgc2l6ZV90IGRlYWRDbGllbnRzID0gMDsKKyAgICBmb3IgKGF1dG8gaXQgPSBvYnNlcnZlcnMuYmVnaW4oKTsgaXQgIT0gb2JzZXJ2ZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGNvbnN0IHNwPElPYnNlcnZlcj4gb2JzZXJ2ZXIgPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAob2JzZXJ2ZXIpIHsKKyAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IG9ic2VydmVyLT5vbk1lc3NhZ2UoaXQtPmZpcnN0LCBpbnZhbGlkYXRpb25JZCk7CisgICAgICAgICAgICBpZiAoIXRyYW5zUmVzdWx0LmlzT2soKSkgeworICAgICAgICAgICAgICAgICsrZGVhZENsaWVudHM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGRlYWRDbGllbnRzID4gMCkgeworICAgICAgICBBTE9HRCgiRHVyaW5nIGludmFsaWRhdGlvbiBmb3VuZCAlenUgZGVhZCBjbGllbnRzIiwgZGVhZENsaWVudHMpOworICAgIH0KK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gbUJ1ZmZlclBvb2wuaXNWYWxpZCgpOworfQorCitBY2Nlc3Nvcjo6SW1wbDo6SW1wbDo6QnVmZmVyUG9vbDo6QnVmZmVyUG9vbCgpCisgICAgOiBtVGltZXN0YW1wVXMoZ2V0VGltZXN0YW1wTm93KCkpLAorICAgICAgbUxhc3RDbGVhblVwVXMobVRpbWVzdGFtcFVzKSwKKyAgICAgIG1MYXN0TG9nVXMobVRpbWVzdGFtcFVzKSwKKyAgICAgIG1TZXEoMCksCisgICAgICBtU3RhcnRTZXEoMCkgeworICAgIG1WYWxpZCA9IG1JbnZhbGlkYXRpb25DaGFubmVsLmlzVmFsaWQoKTsKK30KKworCisvLyBTdGF0aXN0aWNzIGhlbHBlcgordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUz4KK2ludCBwZXJjZW50YWdlKFQgYmFzZSwgUyB0b3RhbCkgeworICAgIHJldHVybiBpbnQodG90YWwgPyAwLjUgKyAxMDAuICogc3RhdGljX2Nhc3Q8Uz4oYmFzZSkgLyB0b3RhbCA6IDApOworfQorCitzdGQ6OmF0b21pYzxzdGQ6OnVpbnQzMl90PiBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6SW52YWxpZGF0aW9uOjpzSW52U2VxSWQoMCk7CisKK0FjY2Vzc29yOjpJbXBsOjpJbXBsOjpCdWZmZXJQb29sOjp+QnVmZmVyUG9vbCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIEFMT0dEKCJEZXN0cnVjdGlvbiAtIGJ1ZmZlcnBvb2wyICVwICIKKyAgICAgICAgICAiY2FjaGVkOiAlenUvJXp1TSwgJXp1LyVkJSUgaW4gdXNlOyAiCisgICAgICAgICAgImFsbG9jczogJXp1LCAlZCUlIHJlY3ljbGVkOyAiCisgICAgICAgICAgInRyYW5zZmVyczogJXp1LCAlZCUlIHVuZmV0Y2VkIiwKKyAgICAgICAgICB0aGlzLCBtU3RhdHMubUJ1ZmZlcnNDYWNoZWQsIG1TdGF0cy5tU2l6ZUNhY2hlZCA+PiAyMCwKKyAgICAgICAgICBtU3RhdHMubUJ1ZmZlcnNJblVzZSwgcGVyY2VudGFnZShtU3RhdHMubUJ1ZmZlcnNJblVzZSwgbVN0YXRzLm1CdWZmZXJzQ2FjaGVkKSwKKyAgICAgICAgICBtU3RhdHMubVRvdGFsQWxsb2NhdGlvbnMsIHBlcmNlbnRhZ2UobVN0YXRzLm1Ub3RhbFJlY3ljbGVzLCBtU3RhdHMubVRvdGFsQWxsb2NhdGlvbnMpLAorICAgICAgICAgIG1TdGF0cy5tVG90YWxUcmFuc2ZlcnMsCisgICAgICAgICAgcGVyY2VudGFnZShtU3RhdHMubVRvdGFsVHJhbnNmZXJzIC0gbVN0YXRzLm1Ub3RhbEZldGNoZXMsIG1TdGF0cy5tVG90YWxUcmFuc2ZlcnMpKTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6SW52YWxpZGF0aW9uOjpvbkNvbm5lY3QoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25JZCwgY29uc3Qgc3A8SU9ic2VydmVyPiYgb2JzZXJ2ZXIpIHsKKyAgICBtQWNrc1tjb25JZF0gPSBtSW52YWxpZGF0aW9uSWQ7IC8vIHN0YXJ0cyBmcm9tIGN1cnJlbnQgaW52YWxpZGF0aW9uSWQKKyAgICBtT2JzZXJ2ZXJzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25JZCwgb2JzZXJ2ZXIpKTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6SW52YWxpZGF0aW9uOjpvbkNsb3NlKENvbm5lY3Rpb25JZCBjb25JZCkgeworICAgIG1BY2tzLmVyYXNlKGNvbklkKTsKKyAgICBtT2JzZXJ2ZXJzLmVyYXNlKGNvbklkKTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6SW52YWxpZGF0aW9uOjpvbkFjaygKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbklkLAorICAgICAgICB1aW50MzJfdCBtc2dJZCkgeworICAgIGF1dG8gaXQgPSBtQWNrcy5maW5kKGNvbklkKTsKKyAgICBpZiAoaXQgPT0gbUFja3MuZW5kKCkpIHsKKyAgICAgICAgQUxPR1coIkFDSyBmcm9tIGluY29uc2lzdGVudCBjb25uZWN0aW9uISAlbGxkIiwgKGxvbmcgbG9uZyljb25JZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGlzTWVzc2FnZUxhdGVyKG1zZ0lkLCBpdC0+c2Vjb25kKSkgeworICAgICAgICBtQWNrc1tjb25JZF0gPSBtc2dJZDsKKyAgICB9Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OkludmFsaWRhdGlvbjo6b25CdWZmZXJJbnZhbGlkYXRlZCgKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWwgJmNoYW5uZWwpIHsKKyAgICBmb3IgKGF1dG8gaXQgPSBtUGVuZGluZ3MuYmVnaW4oKTsgaXQgIT0gbVBlbmRpbmdzLmVuZCgpOykgeworICAgICAgICBpZiAoaXQtPmlzSW52YWxpZGF0ZWQoYnVmZmVySWQpKSB7CisgICAgICAgICAgICB1aW50MzJfdCBtc2dJZCA9IDA7CisgICAgICAgICAgICBpZiAoaXQtPm1OZWVkc0FjaykgeworICAgICAgICAgICAgICAgIG1zZ0lkID0gKyttSW52YWxpZGF0aW9uSWQ7CisgICAgICAgICAgICAgICAgaWYgKG1zZ0lkID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd3JhcCBoYXBwZW5zCisgICAgICAgICAgICAgICAgICAgIG1zZ0lkID0gKyttSW52YWxpZGF0aW9uSWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hhbm5lbC5wb3N0SW52YWxpZGF0aW9uKG1zZ0lkLCBpdC0+bUZyb20sIGl0LT5tVG8pOworICAgICAgICAgICAgaXQgPSBtUGVuZGluZ3MuZXJhc2UoaXQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgKytpdDsKKyAgICB9Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OkludmFsaWRhdGlvbjo6b25JbnZhbGlkYXRpb25SZXF1ZXN0KAorICAgICAgICBib29sIG5lZWRzQWNrLAorICAgICAgICB1aW50MzJfdCBmcm9tLAorICAgICAgICB1aW50MzJfdCB0bywKKyAgICAgICAgc2l6ZV90IGxlZnQsCisgICAgICAgIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWwgJmNoYW5uZWwsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gJmltcGwpIHsKKyAgICAgICAgdWludDMyX3QgbXNnSWQgPSAwOworICAgIGlmIChuZWVkc0FjaykgeworICAgICAgICBtc2dJZCA9ICsrbUludmFsaWRhdGlvbklkOworICAgICAgICBpZiAobXNnSWQgPT0gMCkgeworICAgICAgICAgICAgLy8gd3JhcCBoYXBwZW5zCisgICAgICAgICAgICBtc2dJZCA9ICsrbUludmFsaWRhdGlvbklkOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJidWZmZXJwb29sMiBpbnZhbGlkYXRpb24gcmVxdWVzdGVkIGFuZCBxdWV1ZWQiKTsKKyAgICBpZiAobGVmdCA9PSAwKSB7CisgICAgICAgIGNoYW5uZWwucG9zdEludmFsaWRhdGlvbihtc2dJZCwgZnJvbSwgdG8pOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRPRE86IHNlbmRpbmcgaGludCBtZXNzYWdlPworICAgICAgICBBTE9HVigiYnVmZmVycG9vMiBpbnZhbGlkYXRpb24gcmVxdWVzdGVkIGFuZCBwZW5kaW5nIik7CisgICAgICAgIFBlbmRpbmcgcGVuZGluZyhuZWVkc0FjaywgZnJvbSwgdG8sIGxlZnQsIGltcGwpOworICAgICAgICBtUGVuZGluZ3MucHVzaF9iYWNrKHBlbmRpbmcpOworICAgIH0KKyAgICBzSW52YWxpZGF0b3ItPmFkZEFjY2Vzc29yKG1JZCwgaW1wbCk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OkludmFsaWRhdGlvbjo6b25IYW5kbGVBY2soCisgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgY29uc3Qgc3A8SU9ic2VydmVyPj4gKm9ic2VydmVycywKKyAgICAgICAgdWludDMyX3QgKmludmFsaWRhdGlvbklkKSB7CisgICAgaWYgKG1JbnZhbGlkYXRpb25JZCAhPSAwKSB7CisgICAgICAgICppbnZhbGlkYXRpb25JZCA9IG1JbnZhbGlkYXRpb25JZDsKKyAgICAgICAgc3RkOjpzZXQ8aW50PiBkZWFkczsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbUFja3MuYmVnaW4oKTsgaXQgIT0gbUFja3MuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGlmIChpdC0+c2Vjb25kICE9IG1JbnZhbGlkYXRpb25JZCkgeworICAgICAgICAgICAgICAgIGNvbnN0IHNwPElPYnNlcnZlcj4gb2JzZXJ2ZXIgPSBtT2JzZXJ2ZXJzW2l0LT5maXJzdF07CisgICAgICAgICAgICAgICAgaWYgKG9ic2VydmVyKSB7CisgICAgICAgICAgICAgICAgICAgIG9ic2VydmVycy0+ZW1wbGFjZShpdC0+Zmlyc3QsIG9ic2VydmVyKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNvbm5lY3Rpb24gJWxsZCB3aWxsIGNhbGwgb2JzZXJ2ZXIgKCV1OiAldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWl0LT5maXJzdCwgaXQtPnNlY29uZCwgbUludmFsaWRhdGlvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gTi5COiBvbk1lc3NhZ2Ugd2lsbCBiZSBjYWxsZWQgbGF0ZXIuIGlnbm9yZSBwb3NzaWJpbGl0eSBvZgorICAgICAgICAgICAgICAgICAgICAvLyBvbk1lc3NhZ2UjIG9uZXdheSBjYWxsIGJlaW5nIGxvc3QuCisgICAgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQgPSBtSW52YWxpZGF0aW9uSWQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImJ1ZmZlcnBvb2wyIG9ic2VydmVyIGRpZWQgJWxsZCIsIChsb25nIGxvbmcpaXQtPmZpcnN0KTsKKyAgICAgICAgICAgICAgICAgICAgZGVhZHMuaW5zZXJ0KGl0LT5maXJzdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChkZWFkcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBkZWFkcy5iZWdpbigpOyBpdCAhPSBkZWFkcy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgICAgIG9uQ2xvc2UoKml0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobVBlbmRpbmdzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIC8vIEFsbCBpbnZhbGlkYXRpb24gSWRzIGFyZSBzeW5jZWQgYW5kIG5vIG1vcmUgcGVuZGluZyBpbnZhbGlkYXRpb25zLgorICAgICAgICBzSW52YWxpZGF0b3ItPmRlbEFjY2Vzc29yKG1JZCk7CisgICAgfQorfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVPd25CdWZmZXIoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkKSB7CisKKyAgICBib29sIGFkZGVkID0gaW5zZXJ0KCZtVXNpbmdCdWZmZXJzLCBjb25uZWN0aW9uSWQsIGJ1ZmZlcklkKTsKKyAgICBpZiAoYWRkZWQpIHsKKyAgICAgICAgYXV0byBpdGVyID0gbUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgIGl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQrKzsKKyAgICB9CisgICAgaW5zZXJ0KCZtVXNpbmdDb25uZWN0aW9ucywgYnVmZmVySWQsIGNvbm5lY3Rpb25JZCk7CisgICAgcmV0dXJuIGFkZGVkOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVSZWxlYXNlQnVmZmVyKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCkgeworICAgIGJvb2wgZGVsZXRlZCA9IGVyYXNlKCZtVXNpbmdCdWZmZXJzLCBjb25uZWN0aW9uSWQsIGJ1ZmZlcklkKTsKKyAgICBpZiAoZGVsZXRlZCkgeworICAgICAgICBhdXRvIGl0ZXIgPSBtQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgaXRlci0+c2Vjb25kLT5tT3duZXJDb3VudC0tOworICAgICAgICBpZiAoaXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwICYmCisgICAgICAgICAgICAgICAgaXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICBpZiAoIWl0ZXItPnNlY29uZC0+bUludmFsaWRhdGVkKSB7CisgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgbUZyZWVCdWZmZXJzLmluc2VydChidWZmZXJJZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChpdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckV2aWN0ZWQoaXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVycy5lcmFzZShpdGVyKTsKKyAgICAgICAgICAgICAgICBtSW52YWxpZGF0aW9uLm9uQnVmZmVySW52YWxpZGF0ZWQoYnVmZmVySWQsIG1JbnZhbGlkYXRpb25DaGFubmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlcmFzZSgmbVVzaW5nQ29ubmVjdGlvbnMsIGJ1ZmZlcklkLCBjb25uZWN0aW9uSWQpOworICAgIEFMT0dWKCJyZWxlYXNlIGJ1ZmZlciAldSA6ICVkIiwgYnVmZmVySWQsIGRlbGV0ZWQpOworICAgIHJldHVybiBkZWxldGVkOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVUcmFuc2ZlclRvKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpIHsKKyAgICBhdXRvIGNvbXBsZXRlZCA9IG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuZmluZCgKKyAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGNvbXBsZXRlZCAhPSBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIC8vIGFscmVhZHkgY29tcGxldGVkCisgICAgICAgIG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuZXJhc2UoY29tcGxldGVkKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIC8vIHRoZSBidWZmZXIgc2hvdWxkIGV4aXN0IGFuZCBiZSBvd25lZC4KKyAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKG1lc3NhZ2UuYnVmZmVySWQpOworICAgIGlmIChidWZmZXJJdGVyID09IG1CdWZmZXJzLmVuZCgpIHx8CisgICAgICAgICAgICAhY29udGFpbnMoJm1Vc2luZ0J1ZmZlcnMsIG1lc3NhZ2UuY29ubmVjdGlvbklkLCBtZXNzYWdlLmJ1ZmZlcklkKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGF1dG8gZm91bmQgPSBtVHJhbnNhY3Rpb25zLmZpbmQobWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoZm91bmQgIT0gbVRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICAvLyB0cmFuc2Zlcl9mcm9tIHdhcyByZWNlaXZlZCBlYXJsaWVyLgorICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU2VuZGVyID0gbWVzc2FnZS5jb25uZWN0aW9uSWQ7CisgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TZW5kZXJWYWxpZGF0ZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gVE9ETzogdmVyaWZ5IHRoZXJlIGlzIHRhcmdldCBjb25uZWN0aW9uIElkCisgICAgbVN0YXRzLm9uQnVmZmVyU2VudCgpOworICAgIG1UcmFuc2FjdGlvbnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxUcmFuc2FjdGlvblN0YXR1cz4obWVzc2FnZSwgbVRpbWVzdGFtcFVzKSkpOworICAgIGluc2VydCgmbVBlbmRpbmdUcmFuc2FjdGlvbnMsIG1lc3NhZ2UudGFyZ2V0Q29ubmVjdGlvbklkLAorICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQrKzsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlVHJhbnNmZXJGcm9tKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpIHsKKyAgICBhdXRvIGZvdW5kID0gbVRyYW5zYWN0aW9ucy5maW5kKG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGZvdW5kID09IG1UcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgLy8gVE9ETzogaXMgaXQgZmVhc2libGUgdG8gY2hlY2sgb3duZXJzaGlwIGhlcmU/CisgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclNlbnQoKTsKKyAgICAgICAgbVRyYW5zYWN0aW9ucy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8VHJhbnNhY3Rpb25TdGF0dXM+KG1lc3NhZ2UsIG1UaW1lc3RhbXBVcykpKTsKKyAgICAgICAgaW5zZXJ0KCZtUGVuZGluZ1RyYW5zYWN0aW9ucywgbWVzc2FnZS5jb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgICAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50Kys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1lc3NhZ2UuY29ubmVjdGlvbklkID09IGZvdW5kLT5zZWNvbmQtPm1SZWNlaXZlcikgeworICAgICAgICAgICAgZm91bmQtPnNlY29uZC0+bVN0YXR1cyA9IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRlJPTTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlVHJhbnNmZXJSZXN1bHQoY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSkgeworICAgIGF1dG8gZm91bmQgPSBtVHJhbnNhY3Rpb25zLmZpbmQobWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoZm91bmQgIT0gbVRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICBib29sIGRlbGV0ZWQgPSBlcmFzZSgmbVBlbmRpbmdUcmFuc2FjdGlvbnMsIG1lc3NhZ2UuY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgICAgICBpZiAoZGVsZXRlZCkgeworICAgICAgICAgICAgaWYgKCFmb3VuZC0+c2Vjb25kLT5tU2VuZGVyVmFsaWRhdGVkKSB7CisgICAgICAgICAgICAgICAgbUNvbXBsZXRlZFRyYW5zYWN0aW9ucy5pbnNlcnQobWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQobWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZS5uZXdTdGF0dXMgPT0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9PSykgeworICAgICAgICAgICAgICAgIGhhbmRsZU93bkJ1ZmZlcihtZXNzYWdlLmNvbm5lY3Rpb25JZCwgbWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50LS07CisgICAgICAgICAgICBpZiAoYnVmZmVySXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwCisgICAgICAgICAgICAgICAgJiYgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKCFidWZmZXJJdGVyLT5zZWNvbmQtPm1JbnZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbUZyZWVCdWZmZXJzLmluc2VydChtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyRXZpY3RlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICBtQnVmZmVycy5lcmFzZShidWZmZXJJdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgbUludmFsaWRhdGlvbi5vbkJ1ZmZlckludmFsaWRhdGVkKG1lc3NhZ2UuYnVmZmVySWQsIG1JbnZhbGlkYXRpb25DaGFubmVsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVHJhbnNhY3Rpb25zLmVyYXNlKGZvdW5kKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigidHJhbnNmZXIgZmluaXNoZWQgJWxsdSAldSAtICVkIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyltZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgIG1lc3NhZ2UuYnVmZmVySWQsIGRlbGV0ZWQpOworICAgICAgICByZXR1cm4gZGVsZXRlZDsKKyAgICB9CisgICAgQUxPR1YoInRyYW5zZmVyIG5vdCBmb3VuZCAlbGx1ICV1IiwgKHVuc2lnbmVkIGxvbmcgbG9uZyltZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpwcm9jZXNzU3RhdHVzTWVzc2FnZXMoKSB7CisgICAgc3RkOjp2ZWN0b3I8QnVmZmVyU3RhdHVzTWVzc2FnZT4gbWVzc2FnZXM7CisgICAgbU9ic2VydmVyLmdldEJ1ZmZlclN0YXR1c0NoYW5nZXMobWVzc2FnZXMpOworICAgIG1UaW1lc3RhbXBVcyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgIGZvciAoQnVmZmVyU3RhdHVzTWVzc2FnZSYgbWVzc2FnZTogbWVzc2FnZXMpIHsKKyAgICAgICAgYm9vbCByZXQgPSBmYWxzZTsKKyAgICAgICAgc3dpdGNoIChtZXNzYWdlLm5ld1N0YXR1cykgeworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6Ok5PVF9VU0VEOgorICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZVJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNvbm5lY3Rpb25JZCwgbWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VVNFRDoKKyAgICAgICAgICAgICAgICAvLyBub3QgaGFwcGVuaW5nCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVE86CisgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlVHJhbnNmZXJUbyhtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GUk9NOgorICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZVRyYW5zZmVyRnJvbShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9USU1FT1VUOgorICAgICAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9MT1NUOgorICAgICAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GRVRDSDoKKyAgICAgICAgICAgICAgICAvLyBub3QgaGFwcGVuaW5nCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfT0s6CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRVJST1I6CisgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlVHJhbnNmZXJSZXN1bHQobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6SU5WQUxJREFUSU9OX0FDSzoKKyAgICAgICAgICAgICAgICBtSW52YWxpZGF0aW9uLm9uQWNrKG1lc3NhZ2UuY29ubmVjdGlvbklkLCBtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChyZXQgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIEFMT0dXKCJidWZmZXIgc3RhdHVzIG1lc3NhZ2UgcHJvY2Vzc2luZyBmYWlsdXJlIC0gbWVzc2FnZSA6ICVkIGNvbm5lY3Rpb24gOiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmV3U3RhdHVzLCAobG9uZyBsb25nKW1lc3NhZ2UuY29ubmVjdGlvbklkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtZXNzYWdlcy5jbGVhcigpOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVDbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgLy8gQ2xlYW5pbmcgYnVmZmVycworICAgIGF1dG8gYnVmZmVycyA9IG1Vc2luZ0J1ZmZlcnMuZmluZChjb25uZWN0aW9uSWQpOworICAgIGlmIChidWZmZXJzICE9IG1Vc2luZ0J1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgZm9yIChjb25zdCBCdWZmZXJJZCYgYnVmZmVySWQgOiBidWZmZXJzLT5zZWNvbmQpIHsKKyAgICAgICAgICAgIGJvb2wgZGVsZXRlZCA9IGVyYXNlKCZtVXNpbmdDb25uZWN0aW9ucywgYnVmZmVySWQsIGNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICBpZiAoZGVsZXRlZCkgeworICAgICAgICAgICAgICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQtLTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVySXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGZyZWVidWZmZXIgaW5zZXJ0IGZhaWwKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFidWZmZXJJdGVyLT5zZWNvbmQtPm1JbnZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRnJlZUJ1ZmZlcnMuaW5zZXJ0KGJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyRXZpY3RlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UoYnVmZmVySXRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBtSW52YWxpZGF0aW9uLm9uQnVmZmVySW52YWxpZGF0ZWQoYnVmZmVySWQsIG1JbnZhbGlkYXRpb25DaGFubmVsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtVXNpbmdCdWZmZXJzLmVyYXNlKGJ1ZmZlcnMpOworICAgIH0KKworICAgIC8vIENsZWFuaW5nIHRyYW5zYWN0aW9ucworICAgIGF1dG8gcGVuZGluZyA9IG1QZW5kaW5nVHJhbnNhY3Rpb25zLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAocGVuZGluZyAhPSBtUGVuZGluZ1RyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICBmb3IgKGNvbnN0IFRyYW5zYWN0aW9uSWQmIHRyYW5zYWN0aW9uSWQgOiBwZW5kaW5nLT5zZWNvbmQpIHsKKyAgICAgICAgICAgIGF1dG8gaXRlciA9IG1UcmFuc2FjdGlvbnMuZmluZCh0cmFuc2FjdGlvbklkKTsKKyAgICAgICAgICAgIGlmIChpdGVyICE9IG1UcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWl0ZXItPnNlY29uZC0+bVNlbmRlclZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgICAgICBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmluc2VydCh0cmFuc2FjdGlvbklkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQgPSBpdGVyLT5zZWNvbmQtPm1CdWZmZXJJZDsKKyAgICAgICAgICAgICAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50LS07CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlckl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGZyZWVidWZmZXIgaW5zZXJ0IGZhaWwKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFidWZmZXJJdGVyLT5zZWNvbmQtPm1JbnZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRnJlZUJ1ZmZlcnMuaW5zZXJ0KGJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyRXZpY3RlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UoYnVmZmVySXRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBtSW52YWxpZGF0aW9uLm9uQnVmZmVySW52YWxpZGF0ZWQoYnVmZmVySWQsIG1JbnZhbGlkYXRpb25DaGFubmVsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtVHJhbnNhY3Rpb25zLmVyYXNlKGl0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpnZXRGcmVlQnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywgQnVmZmVySWQgKnBJZCwKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgYXV0byBidWZmZXJJdCA9IG1GcmVlQnVmZmVycy5iZWdpbigpOworICAgIGZvciAoO2J1ZmZlckl0ICE9IG1GcmVlQnVmZmVycy5lbmQoKTsgKytidWZmZXJJdCkgeworICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCA9ICpidWZmZXJJdDsKKyAgICAgICAgaWYgKGFsbG9jYXRvci0+Y29tcGF0aWJsZShwYXJhbXMsIG1CdWZmZXJzW2J1ZmZlcklkXS0+bUNvbmZpZykpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChidWZmZXJJdCAhPSBtRnJlZUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgQnVmZmVySWQgaWQgPSAqYnVmZmVySXQ7CisgICAgICAgIG1GcmVlQnVmZmVycy5lcmFzZShidWZmZXJJdCk7CisgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclJlY3ljbGVkKG1CdWZmZXJzW2lkXS0+bUFsbG9jU2l6ZSk7CisgICAgICAgICpoYW5kbGUgPSBtQnVmZmVyc1tpZF0tPmhhbmRsZSgpOworICAgICAgICAqcElkID0gaWQ7CisgICAgICAgIEFMT0dWKCJyZWN5Y2xlIGEgYnVmZmVyICV1ICVwIiwgaWQsICpoYW5kbGUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmFkZE5ld0J1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgIGNvbnN0IHNpemVfdCBhbGxvY1NpemUsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIEJ1ZmZlcklkICpwSWQsCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworCisgICAgQnVmZmVySWQgYnVmZmVySWQgPSBtU2VxKys7CisgICAgaWYgKG1TZXEgPT0gQ29ubmVjdGlvbjo6U1lOQ19CVUZGRVJJRCkgeworICAgICAgICBtU2VxID0gMDsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPEludGVybmFsQnVmZmVyPiBidWZmZXIgPQorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxJbnRlcm5hbEJ1ZmZlcj4oCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcklkLCBhbGxvYywgYWxsb2NTaXplLCBwYXJhbXMpOworICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgYXV0byByZXMgPSBtQnVmZmVycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgYnVmZmVySWQsIHN0ZDo6bW92ZShidWZmZXIpKSk7CisgICAgICAgIGlmIChyZXMuc2Vjb25kKSB7CisgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJBbGxvY2F0ZWQoYWxsb2NTaXplKTsKKyAgICAgICAgICAgICpoYW5kbGUgPSBhbGxvYy0+aGFuZGxlKCk7CisgICAgICAgICAgICAqcElkID0gYnVmZmVySWQ7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaWYgKGNsZWFyQ2FjaGUgfHwgbVRpbWVzdGFtcFVzID4gbUxhc3RDbGVhblVwVXMgKyBrQ2xlYW5VcER1cmF0aW9uVXMpIHsKKyAgICAgICAgbUxhc3RDbGVhblVwVXMgPSBtVGltZXN0YW1wVXM7CisgICAgICAgIGlmIChtVGltZXN0YW1wVXMgPiBtTGFzdExvZ1VzICsga0xvZ0R1cmF0aW9uVXMpIHsKKyAgICAgICAgICAgIG1MYXN0TG9nVXMgPSBtVGltZXN0YW1wVXM7CisgICAgICAgICAgICBBTE9HRCgiYnVmZmVycG9vbDIgJXAgOiAlenUoJXp1IHNpemUpIHRvdGFsIGJ1ZmZlcnMgLSAiCisgICAgICAgICAgICAgICAgICAiJXp1KCV6dSBzaXplKSB1c2VkIGJ1ZmZlcnMgLSAlenUvJXp1IChyZWN5Y2xlL2FsbG9jKSAtICIKKyAgICAgICAgICAgICAgICAgICIlenUvJXp1IChmZXRjaC90cmFuc2ZlcikiLAorICAgICAgICAgICAgICAgICAgdGhpcywgbVN0YXRzLm1CdWZmZXJzQ2FjaGVkLCBtU3RhdHMubVNpemVDYWNoZWQsCisgICAgICAgICAgICAgICAgICBtU3RhdHMubUJ1ZmZlcnNJblVzZSwgbVN0YXRzLm1TaXplSW5Vc2UsCisgICAgICAgICAgICAgICAgICBtU3RhdHMubVRvdGFsUmVjeWNsZXMsIG1TdGF0cy5tVG90YWxBbGxvY2F0aW9ucywKKyAgICAgICAgICAgICAgICAgIG1TdGF0cy5tVG90YWxGZXRjaGVzLCBtU3RhdHMubVRvdGFsVHJhbnNmZXJzKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGF1dG8gZnJlZUl0ID0gbUZyZWVCdWZmZXJzLmJlZ2luKCk7IGZyZWVJdCAhPSBtRnJlZUJ1ZmZlcnMuZW5kKCk7KSB7CisgICAgICAgICAgICBpZiAoIWNsZWFyQ2FjaGUgJiYgbVN0YXRzLm1TaXplQ2FjaGVkIDwga01pbkFsbG9jQnl0ZXNGb3JFdmljdGlvbgorICAgICAgICAgICAgICAgICAgICAmJiBtQnVmZmVycy5zaXplKCkgPCBrTWluQnVmZmVyQ291bnRGb3JFdmljdGlvbikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0byBpdCA9IG1CdWZmZXJzLmZpbmQoKmZyZWVJdCk7CisgICAgICAgICAgICBpZiAoaXQgIT0gbUJ1ZmZlcnMuZW5kKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMCAmJiBpdC0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyRXZpY3RlZChpdC0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgZnJlZUl0ID0gbUZyZWVCdWZmZXJzLmVyYXNlKGZyZWVJdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICsrZnJlZUl0OworICAgICAgICAgICAgICAgIEFMT0dXKCJidWZmZXJwb29sMiBpbmNvbnNpc3RlbnQhIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmludmFsaWRhdGUoCisgICAgICAgIGJvb2wgbmVlZHNBY2ssIEJ1ZmZlcklkIGZyb20sIEJ1ZmZlcklkIHRvLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzb3I6OkltcGw+ICZpbXBsKSB7CisgICAgZm9yIChhdXRvIGZyZWVJdCA9IG1GcmVlQnVmZmVycy5iZWdpbigpOyBmcmVlSXQgIT0gbUZyZWVCdWZmZXJzLmVuZCgpOykgeworICAgICAgICBpZiAoaXNCdWZmZXJJblJhbmdlKGZyb20sIHRvLCAqZnJlZUl0KSkgeworICAgICAgICAgICAgYXV0byBpdCA9IG1CdWZmZXJzLmZpbmQoKmZyZWVJdCk7CisgICAgICAgICAgICBpZiAoaXQgIT0gbUJ1ZmZlcnMuZW5kKCkgJiYKKyAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwICYmIGl0LT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJFdmljdGVkKGl0LT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgIG1CdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBmcmVlSXQgPSBtRnJlZUJ1ZmZlcnMuZXJhc2UoZnJlZUl0KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coImJ1ZmZlcnBvb2wyIGluY29uc2lzdGVudCEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICArK2ZyZWVJdDsKKyAgICB9CisKKyAgICBzaXplX3QgbGVmdCA9IDA7CisgICAgZm9yIChhdXRvIGl0ID0gbUJ1ZmZlcnMuYmVnaW4oKTsgaXQgIT0gbUJ1ZmZlcnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKGlzQnVmZmVySW5SYW5nZShmcm9tLCB0bywgaXQtPmZpcnN0KSkgeworICAgICAgICAgICAgaXQtPnNlY29uZC0+aW52YWxpZGF0ZSgpOworICAgICAgICAgICAgKytsZWZ0OworICAgICAgICB9CisgICAgfQorICAgIG1JbnZhbGlkYXRpb24ub25JbnZhbGlkYXRpb25SZXF1ZXN0KG5lZWRzQWNrLCBmcm9tLCB0bywgbGVmdCwgbUludmFsaWRhdGlvbkNoYW5uZWwsIGltcGwpOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpmbHVzaChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzb3I6OkltcGw+ICZpbXBsKSB7CisgICAgQnVmZmVySWQgZnJvbSA9IG1TdGFydFNlcTsKKyAgICBCdWZmZXJJZCB0byA9IG1TZXE7CisgICAgbVN0YXJ0U2VxID0gbVNlcTsKKyAgICAvLyBUT0RPOiBuZWVkc0FjayBwYXJhbXMgCisgICAgQUxPR1YoImJ1ZmZlciBpbnZhbGlkYXRpb24gcmVxdWVzdCBicDoldSAldSAldSIsIG1JbnZhbGlkYXRpb24ubUlkLCBmcm9tLCB0byk7CisgICAgaWYgKGZyb20gIT0gdG8pIHsKKyAgICAgICAgaW52YWxpZGF0ZSh0cnVlLCBmcm9tLCB0bywgaW1wbCk7CisgICAgfQorfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjppbnZhbGlkYXRvclRocmVhZCgKKyAgICAgICAgICAgIHN0ZDo6bWFwPHVpbnQzMl90LCBjb25zdCBzdGQ6OndlYWtfcHRyPEFjY2Vzc29yOjpJbXBsPj4gJmFjY2Vzc29ycywKKyAgICAgICAgICAgIHN0ZDo6bXV0ZXggJm11dGV4LAorICAgICAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgJmN2LAorICAgICAgICAgICAgYm9vbCAmcmVhZHkpIHsKKyAgICB3aGlsZSh0cnVlKSB7CisgICAgICAgIHN0ZDo6bWFwPHVpbnQzMl90LCBjb25zdCBzdGQ6OndlYWtfcHRyPEFjY2Vzc29yOjpJbXBsPj4gY29waWVkOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXgpOworICAgICAgICAgICAgaWYgKCFyZWFkeSkgeworICAgICAgICAgICAgICAgIGN2LndhaXQobG9jayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb3BpZWQuaW5zZXJ0KGFjY2Vzc29ycy5iZWdpbigpLCBhY2Nlc3NvcnMuZW5kKCkpOworICAgICAgICB9CisgICAgICAgIHN0ZDo6bGlzdDxDb25uZWN0aW9uSWQ+IGVyYXNlZDsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gY29waWVkLmJlZ2luKCk7IGl0ICE9IGNvcGllZC5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc29yOjpJbXBsPiBpbXBsID0gaXQtPnNlY29uZC5sb2NrKCk7CisgICAgICAgICAgICBpZiAoIWltcGwpIHsKKyAgICAgICAgICAgICAgICBlcmFzZWQucHVzaF9iYWNrKGl0LT5maXJzdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGltcGwtPmhhbmRsZUludmFsaWRhdGVBY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXgpOworICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gZXJhc2VkLmJlZ2luKCk7IGl0ICE9IGVyYXNlZC5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgICAgIGFjY2Vzc29ycy5lcmFzZSgqaXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFjY2Vzc29ycy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHJlYWR5ID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgZHJhaW5pbmcgY3B1LgorICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6eWllbGQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworQWNjZXNzb3I6OkltcGw6OkFjY2Vzc29ySW52YWxpZGF0b3I6OkFjY2Vzc29ySW52YWxpZGF0b3IoKSA6IG1SZWFkeShmYWxzZSkgeworICAgIHN0ZDo6dGhyZWFkIGludmFsaWRhdG9yKAorICAgICAgICAgICAgaW52YWxpZGF0b3JUaHJlYWQsCisgICAgICAgICAgICBzdGQ6OnJlZihtQWNjZXNzb3JzKSwKKyAgICAgICAgICAgIHN0ZDo6cmVmKG1NdXRleCksCisgICAgICAgICAgICBzdGQ6OnJlZihtQ3YpLAorICAgICAgICAgICAgc3RkOjpyZWYobVJlYWR5KSk7CisgICAgaW52YWxpZGF0b3IuZGV0YWNoKCk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkFjY2Vzc29ySW52YWxpZGF0b3I6OmFkZEFjY2Vzc29yKAorICAgICAgICB1aW50MzJfdCBhY2Nlc3NvcklkLCBjb25zdCBzdGQ6OndlYWtfcHRyPEFjY2Vzc29yOjpJbXBsPiAmaW1wbCkgeworICAgIGJvb2wgbm90aWZ5ID0gZmFsc2U7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgaWYgKG1BY2Nlc3NvcnMuZmluZChhY2Nlc3NvcklkKSA9PSBtQWNjZXNzb3JzLmVuZCgpKSB7CisgICAgICAgIGlmICghbVJlYWR5KSB7CisgICAgICAgICAgICBtUmVhZHkgPSB0cnVlOworICAgICAgICAgICAgbm90aWZ5ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBtQWNjZXNzb3JzLmluc2VydChzdGQ6Om1ha2VfcGFpcihhY2Nlc3NvcklkLCBpbXBsKSk7CisgICAgICAgIEFMT0dWKCJidWZmZXIgaW52YWxpZGF0aW9uIGFkZGVkIGJwOiV1ICVkIiwgYWNjZXNzb3JJZCwgbm90aWZ5KTsKKyAgICB9CisgICAgbG9jay51bmxvY2soKTsKKyAgICBpZiAobm90aWZ5KSB7CisgICAgICAgIG1Ddi5ub3RpZnlfb25lKCk7CisgICAgfQorfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpBY2Nlc3NvckludmFsaWRhdG9yOjpkZWxBY2Nlc3Nvcih1aW50MzJfdCBhY2Nlc3NvcklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBtQWNjZXNzb3JzLmVyYXNlKGFjY2Vzc29ySWQpOworICAgIEFMT0dWKCJidWZmZXIgaW52YWxpZGF0aW9uIGRlbGV0ZWQgYnA6JXUiLCBhY2Nlc3NvcklkKTsKKyAgICBpZiAobUFjY2Vzc29ycy5zaXplKCkgPT0gMCkgeworICAgICAgICBtUmVhZHkgPSBmYWxzZTsKKyAgICB9Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxBY2Nlc3Nvcjo6SW1wbDo6QWNjZXNzb3JJbnZhbGlkYXRvcj4gQWNjZXNzb3I6OkltcGw6OnNJbnZhbGlkYXRvcjsKKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6Y3JlYXRlSW52YWxpZGF0b3IoKSB7CisgICAgaWYgKCFzSW52YWxpZGF0b3IpIHsKKyAgICAgICAgc0ludmFsaWRhdG9yID0gc3RkOjptYWtlX3VuaXF1ZTxBY2Nlc3Nvcjo6SW1wbDo6QWNjZXNzb3JJbnZhbGlkYXRvcj4oKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29ySW1wbC5oIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3JJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVhNzJiOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29ySW1wbC5oCkBAIC0wLDAgKzEsNDAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9BQ0NFU1NPUklNUExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9BQ0NFU1NPUklNUExfSAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+CisjaW5jbHVkZSAiQWNjZXNzb3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCitzdHJ1Y3QgSW50ZXJuYWxCdWZmZXI7CitzdHJ1Y3QgVHJhbnNhY3Rpb25TdGF0dXM7CisKKy8qKgorICogQW4gaW1wbGVtZW50YXRpb24gb2YgYSBidWZmZXIgcG9vbCBhY2Nlc3NvcihvciBhIGJ1ZmZlciBwb29sIGltcGxlbWVudGF0aW9uLikgKi8KK2NsYXNzIEFjY2Vzc29yOjpJbXBsCisgICAgOiBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxBY2Nlc3Nvcjo6SW1wbD4geworcHVibGljOgorICAgIEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IpOworCisgICAgfkltcGwoKTsKKworICAgIFJlc3VsdFN0YXR1cyBjb25uZWN0KAorICAgICAgICAgICAgY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvciwgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIsCisgICAgICAgICAgICBzcDxDb25uZWN0aW9uPiAqY29ubmVjdGlvbiwKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIHVpbnQzMl90ICpwTXNnSWQsCisgICAgICAgICAgICBjb25zdCBTdGF0dXNEZXNjcmlwdG9yKiogc3RhdHVzRGVzY1B0ciwKKyAgICAgICAgICAgIGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IqKiBpbnZEZXNjUHRyKTsKKworICAgIFJlc3VsdFN0YXR1cyBjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSk7CisKKyAgICBSZXN1bHRTdGF0dXMgZmV0Y2goQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKTsKKworICAgIHZvaWQgZmx1c2goKTsKKworICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUpOworCisgICAgYm9vbCBpc1ZhbGlkKCk7CisKKyAgICB2b2lkIGhhbmRsZUludmFsaWRhdGVBY2soKTsKKworICAgIHN0YXRpYyB2b2lkIGNyZWF0ZUludmFsaWRhdG9yKCk7CisKK3ByaXZhdGU6CisgICAgLy8gQ29ubmVjdGlvbklkID0gcGlkIDogKHRpbWVzdGFtcF9jcmVhdGVkICsgc2VxSWQpCisgICAgLy8gaW4gb3JkZXIgdG8gZ3VhcmFudGVlIHVuaXF1ZW5lc3MgZm9yIGVhY2ggY29ubmVjdGlvbgorICAgIHN0YXRpYyB1aW50MzJfdCBzU2VxSWQ7CisgICAgc3RhdGljIGludDMyX3Qgc1BpZDsKKworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworCisgICAgLyoqCisgICAgICogQnVmZmVyIHBvb2wgaW1wbGVtZW50YXRpb24uCisgICAgICoKKyAgICAgKiBIYW5kbGVzIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMuIEhhbmRsZXMgYnVmZmVyIGFsbG9jYXRpb24vcmVjeWNsaW5nLgorICAgICAqIEhhbmRsZXMgYnVmZmVyIHRyYW5zZmVyIGJldHdlZW4gYnVmZmVyIHBvb2wgY2xpZW50cy4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgQnVmZmVyUG9vbCB7CisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgICAgIGludDY0X3QgbVRpbWVzdGFtcFVzOworICAgICAgICBpbnQ2NF90IG1MYXN0Q2xlYW5VcFVzOworICAgICAgICBpbnQ2NF90IG1MYXN0TG9nVXM7CisgICAgICAgIEJ1ZmZlcklkIG1TZXE7CisgICAgICAgIEJ1ZmZlcklkIG1TdGFydFNlcTsKKyAgICAgICAgYm9vbCBtVmFsaWQ7CisgICAgICAgIEJ1ZmZlclN0YXR1c09ic2VydmVyIG1PYnNlcnZlcjsKKyAgICAgICAgQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbCBtSW52YWxpZGF0aW9uQ2hhbm5lbDsKKworICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIHN0ZDo6c2V0PEJ1ZmZlcklkPj4gbVVzaW5nQnVmZmVyczsKKyAgICAgICAgc3RkOjptYXA8QnVmZmVySWQsIHN0ZDo6c2V0PENvbm5lY3Rpb25JZD4+IG1Vc2luZ0Nvbm5lY3Rpb25zOworCisgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgc3RkOjpzZXQ8VHJhbnNhY3Rpb25JZD4+IG1QZW5kaW5nVHJhbnNhY3Rpb25zOworICAgICAgICAvLyBUcmFuc2FjdGlvbnMgY29tcGxldGVkIGJlZm9yZSBUUkFOU0ZFUl9UTyBtZXNzYWdlIGFycml2YWwuCisgICAgICAgIC8vIEZldGNoIGRvZXMgbm90IG9jY3VyIGZvciB0aGUgdHJhbnNhY3Rpb25zLgorICAgICAgICAvLyBPbmx5IHRyYW5zYWN0aW9uIGlkIGlzIGtlcHQgZm9yIHRoZSB0cmFuc2FjdGlvbnMgaW4gc2hvcnQgZHVyYXRpb24uCisgICAgICAgIHN0ZDo6c2V0PFRyYW5zYWN0aW9uSWQ+IG1Db21wbGV0ZWRUcmFuc2FjdGlvbnM7CisgICAgICAgIC8vIEN1cnJlbnRseSBhY3RpdmUocGVuZGluZykgdHJhbnNhdGlvbnMnIHN0YXR1cyAmIGluZm9ybWF0aW9uLgorICAgICAgICBzdGQ6Om1hcDxUcmFuc2FjdGlvbklkLCBzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNhY3Rpb25TdGF0dXM+PgorICAgICAgICAgICAgICAgIG1UcmFuc2FjdGlvbnM7CisKKyAgICAgICAgc3RkOjptYXA8QnVmZmVySWQsIHN0ZDo6dW5pcXVlX3B0cjxJbnRlcm5hbEJ1ZmZlcj4+IG1CdWZmZXJzOworICAgICAgICBzdGQ6OnNldDxCdWZmZXJJZD4gbUZyZWVCdWZmZXJzOworCisgICAgICAgIHN0cnVjdCBJbnZhbGlkYXRpb24geworICAgICAgICAgICAgc3RhdGljIHN0ZDo6YXRvbWljPHN0ZDo6dWludDMyX3Q+IHNJbnZTZXFJZDsKKworICAgICAgICAgICAgc3RydWN0IFBlbmRpbmcgeworICAgICAgICAgICAgICAgIGJvb2wgbU5lZWRzQWNrOworICAgICAgICAgICAgICAgIHVpbnQzMl90IG1Gcm9tOworICAgICAgICAgICAgICAgIHVpbnQzMl90IG1UbzsKKyAgICAgICAgICAgICAgICBzaXplX3QgbUxlZnQ7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gbUltcGw7CisgICAgICAgICAgICAgICAgUGVuZGluZyhib29sIG5lZWRzQWNrLCB1aW50MzJfdCBmcm9tLCB1aW50MzJfdCB0bywgc2l6ZV90IGxlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzb3I6OkltcGw+ICZpbXBsKQorICAgICAgICAgICAgICAgICAgICAgICAgOiBtTmVlZHNBY2sobmVlZHNBY2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJvbShmcm9tKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbVRvKHRvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUxlZnQobGVmdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbXBsKGltcGwpCisgICAgICAgICAgICAgICAge30KKworICAgICAgICAgICAgICAgIGJvb2wgaXNJbnZhbGlkYXRlZCh1aW50MzJfdCBidWZmZXJJZCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXNCdWZmZXJJblJhbmdlKG1Gcm9tLCBtVG8sIGJ1ZmZlcklkKSAmJiAtLW1MZWZ0ID09IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc3RkOjpsaXN0PFBlbmRpbmc+IG1QZW5kaW5nczsKKyAgICAgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgdWludDMyX3Q+IG1BY2tzOworICAgICAgICAgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBjb25zdCBzcDxJT2JzZXJ2ZXI+PiBtT2JzZXJ2ZXJzOworICAgICAgICAgICAgdWludDMyX3QgbUludmFsaWRhdGlvbklkOworICAgICAgICAgICAgdWludDMyX3QgbUlkOworCisgICAgICAgICAgICBJbnZhbGlkYXRpb24oKSA6IG1JbnZhbGlkYXRpb25JZCgwKSwgbUlkKHNJbnZTZXFJZC5mZXRjaF9hZGQoMSkpIHt9CisKKyAgICAgICAgICAgIHZvaWQgb25Db25uZWN0KENvbm5lY3Rpb25JZCBjb25JZCwgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIpOworCisgICAgICAgICAgICB2b2lkIG9uQ2xvc2UoQ29ubmVjdGlvbklkIGNvbklkKTsKKworICAgICAgICAgICAgdm9pZCBvbkFjayhDb25uZWN0aW9uSWQgY29uSWQsIHVpbnQzMl90IG1zZ0lkKTsKKworICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlckludmFsaWRhdGVkKAorICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbCAmY2hhbm5lbCk7CisKKyAgICAgICAgICAgIHZvaWQgb25JbnZhbGlkYXRpb25SZXF1ZXN0KAorICAgICAgICAgICAgICAgICAgICBib29sIG5lZWRzQWNrLCB1aW50MzJfdCBmcm9tLCB1aW50MzJfdCB0bywgc2l6ZV90IGxlZnQsCisgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWwgJmNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gJmltcGwpOworCisgICAgICAgICAgICB2b2lkIG9uSGFuZGxlQWNrKAorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIGNvbnN0IHNwPElPYnNlcnZlcj4+ICpvYnNlcnZlcnMsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICppbnZhbGlkYXRpb25JZCk7CisgICAgICAgIH0gbUludmFsaWRhdGlvbjsKKyAgICAgICAgLy8vIEJ1ZmZlciBwb29sIHN0YXRpc3RpY3Mgd2hpY2ggdHJhY2tzIGFsbG9jYXRpb24gYW5kIHRyYW5zZmVyIHN0YXRpc3RpY3MuCisgICAgICAgIHN0cnVjdCBTdGF0cyB7CisgICAgICAgICAgICAvLy8gVG90YWwgc2l6ZSBvZiBhbGxvY2F0aW9ucyB3aGljaCBhcmUgdXNlZCBvciBhdmFpbGFibGUgdG8gdXNlLgorICAgICAgICAgICAgLy8vIChieXRlcyBvciBwaXhlbHMpCisgICAgICAgICAgICBzaXplX3QgbVNpemVDYWNoZWQ7CisgICAgICAgICAgICAvLy8gIyBvZiBjYWNoZWQgYnVmZmVycyB3aGljaCBhcmUgdXNlZCBvciBhdmFpbGFibGUgdG8gdXNlLgorICAgICAgICAgICAgc2l6ZV90IG1CdWZmZXJzQ2FjaGVkOworICAgICAgICAgICAgLy8vIFRvdGFsIHNpemUgb2YgYWxsb2NhdGlvbnMgd2hpY2ggYXJlIGN1cnJlbnRseSB1c2VkLiAoYnl0ZXMgb3IgcGl4ZWxzKQorICAgICAgICAgICAgc2l6ZV90IG1TaXplSW5Vc2U7CisgICAgICAgICAgICAvLy8gIyBvZiBjdXJyZW50bHkgdXNlZCBidWZmZXJzCisgICAgICAgICAgICBzaXplX3QgbUJ1ZmZlcnNJblVzZTsKKworICAgICAgICAgICAgLy8vICMgb2YgYWxsb2NhdGlvbnMgY2FsbGVkIG9uIGJ1ZmZlcnBvb2wuICgjIG9mIGZldGNoZWQgZnJvbSBCbG9ja1Bvb2wpCisgICAgICAgICAgICBzaXplX3QgbVRvdGFsQWxsb2NhdGlvbnM7CisgICAgICAgICAgICAvLy8gIyBvZiBhbGxvY2F0aW9ucyB0aGF0IHdlcmUgc2VydmVkIGZyb20gdGhlIGNhY2hlLgorICAgICAgICAgICAgLy8vICgjIG9mIGFsbG9jYXRvciBhbGxvYyBwcmV2ZW50ZWQpCisgICAgICAgICAgICBzaXplX3QgbVRvdGFsUmVjeWNsZXM7CisgICAgICAgICAgICAvLy8gIyBvZiBidWZmZXIgdHJhbnNmZXJzIGluaXRpYXRlZC4KKyAgICAgICAgICAgIHNpemVfdCBtVG90YWxUcmFuc2ZlcnM7CisgICAgICAgICAgICAvLy8gIyBvZiB0cmFuc2ZlcnMgdGhhdCBoYWQgdG8gYmUgZmV0Y2hlZC4KKyAgICAgICAgICAgIHNpemVfdCBtVG90YWxGZXRjaGVzOworCisgICAgICAgICAgICBTdGF0cygpCisgICAgICAgICAgICAgICAgOiBtU2l6ZUNhY2hlZCgwKSwgbUJ1ZmZlcnNDYWNoZWQoMCksIG1TaXplSW5Vc2UoMCksIG1CdWZmZXJzSW5Vc2UoMCksCisgICAgICAgICAgICAgICAgICBtVG90YWxBbGxvY2F0aW9ucygwKSwgbVRvdGFsUmVjeWNsZXMoMCksIG1Ub3RhbFRyYW5zZmVycygwKSwgbVRvdGFsRmV0Y2hlcygwKSB7fQorCisgICAgICAgICAgICAvLy8gQSBuZXcgYnVmZmVyIGlzIGFsbG9jYXRlZCBvbiBhbiBhbGxvY2F0aW9uIHJlcXVlc3QuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyQWxsb2NhdGVkKHNpemVfdCBhbGxvY1NpemUpIHsKKyAgICAgICAgICAgICAgICBtU2l6ZUNhY2hlZCArPSBhbGxvY1NpemU7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNDYWNoZWQrKzsKKworICAgICAgICAgICAgICAgIG1TaXplSW5Vc2UgKz0gYWxsb2NTaXplOworICAgICAgICAgICAgICAgIG1CdWZmZXJzSW5Vc2UrKzsKKworICAgICAgICAgICAgICAgIG1Ub3RhbEFsbG9jYXRpb25zKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciBpcyBldmljdGVkIGFuZCBkZXN0cm95ZWQuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyRXZpY3RlZChzaXplX3QgYWxsb2NTaXplKSB7CisgICAgICAgICAgICAgICAgbVNpemVDYWNoZWQgLT0gYWxsb2NTaXplOworICAgICAgICAgICAgICAgIG1CdWZmZXJzQ2FjaGVkLS07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciBpcyByZWN5Y2xlZCBvbiBhbiBhbGxvY2F0aW9uIHJlcXVlc3QuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyUmVjeWNsZWQoc2l6ZV90IGFsbG9jU2l6ZSkgeworICAgICAgICAgICAgICAgIG1TaXplSW5Vc2UgKz0gYWxsb2NTaXplOworICAgICAgICAgICAgICAgIG1CdWZmZXJzSW5Vc2UrKzsKKworICAgICAgICAgICAgICAgIG1Ub3RhbEFsbG9jYXRpb25zKys7CisgICAgICAgICAgICAgICAgbVRvdGFsUmVjeWNsZXMrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIEEgYnVmZmVyIGlzIGF2YWlsYWJsZSB0byBiZSByZWN5Y2xlZC4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJVbnVzZWQoc2l6ZV90IGFsbG9jU2l6ZSkgeworICAgICAgICAgICAgICAgIG1TaXplSW5Vc2UgLT0gYWxsb2NTaXplOworICAgICAgICAgICAgICAgIG1CdWZmZXJzSW5Vc2UtLTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIEEgYnVmZmVyIHRyYW5zZmVyIGlzIGluaXRpYXRlZC4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJTZW50KCkgeworICAgICAgICAgICAgICAgIG1Ub3RhbFRyYW5zZmVycysrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgZmV0Y2ggaXMgaW52b2tlZCBieSBhIGJ1ZmZlciB0cmFuc2Zlci4KKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJGZXRjaGVkKCkgeworICAgICAgICAgICAgICAgIG1Ub3RhbEZldGNoZXMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBtU3RhdHM7CisKKyAgICAgICAgYm9vbCBpc1ZhbGlkKCkgeworICAgICAgICAgICAgcmV0dXJuIG1WYWxpZDsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgaW52YWxpZGF0ZShib29sIG5lZWRzQWNrLCBCdWZmZXJJZCBmcm9tLCBCdWZmZXJJZCB0bywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gJmltcGwpOworCisgICAgICAgIHN0YXRpYyB2b2lkIGNyZWF0ZUludmFsaWRhdG9yKCk7CisKKyAgICBwdWJsaWM6CisgICAgICAgIC8qKiBDcmVhdGVzIGEgYnVmZmVyIHBvb2wuICovCisgICAgICAgIEJ1ZmZlclBvb2woKTsKKworICAgICAgICAvKiogRGVzdHJveXMgYSBidWZmZXIgcG9vbC4gKi8KKyAgICAgICAgfkJ1ZmZlclBvb2woKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUHJvY2Vzc2VzIGFsbCBwZW5kaW5nIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMsIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuCisgICAgICAgICAqIEVhY2ggc3RhdHVzIG1lc3NhZ2UgaXMgaGFuZGxlZCBieSBtZXRob2RzIHdpdGggJ2hhbmRsZScgcHJlZml4LgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBwcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIGJ1ZmZlciBiZWluZyBvd25lZCBieSBhIGNvbm5lY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgYnVmZmVyIG93bmluZyBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgYnVmZmVyIGlzIG93bmVkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVPd25CdWZmZXIoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgYnVmZmVyIGJlaW5nIHJlbGVhc2VkIGJ5IGEgY29ubmVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGlkIG9mIHRoZSBidWZmZXIgb3duaW5nIGNvbm5lY3Rpb24uCisgICAgICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIHRoZSBpZCBvZiB0aGUgYnVmZmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuIHRoZSBidWZmZXIgb3duZXJzaGlwIGlzIHJlbGVhc2VkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVSZWxlYXNlQnVmZmVyKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHN0YXJ0IG1lc3NhZ2UgZnJvbSB0aGUgc2VuZGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZSAgIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXN1bHQge0Bjb2RlIHRydWV9IHdoZW4gdHJhbnNmZXJfdG8gbWVzc2FnZSBpcyBhY2tub3dsZWRnZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZVRyYW5zZmVyVG8oY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiBiZWluZyBhY2tlZCBieSB0aGUgcmVjZWl2ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtZXNzYWdlICAgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJlc3VsdCB7QGNvZGUgdHJ1ZX0gd2hlbiB0cmFuc2Zlcl9mcm9tIG1lc3NhZ2UgaXMgYWNrbm93bGVkZ2VkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVUcmFuc2ZlckZyb20oY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiByZXN1bHQgbWVzc2FnZSBmcm9tIHRoZSByZWNlaXZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UgICBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBmb3IgdGhlIHRyYW5zYWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmVzdWx0IHtAY29kZSB0cnVlfSB3aGVuIHRoZSBleGlzaXRuZyB0cmFuc2FjdGlvbiBpcyBmaW5pc2hlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlVHJhbnNmZXJSZXN1bHQoY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSBjb25uZWN0aW9uIGJlaW5nIGNsb3NlZCwgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4gQWxsIHRoZQorICAgICAgICAgKiBidWZmZXJzIGFuZCB0cmFuc2FjdGlvbnMgb3duZWQgYnkgdGhlIGNvbm5lY3Rpb24gd2lsbCBiZSBjbGVhbmVkIHVwLgorICAgICAgICAgKiBUaGUgcmVsYXRlZCBGTVEgd2lsbCBiZSBjbGVhbmVkIHVwIHRvby4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGlkIG9mIHRoZSBjb25uZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmVzdWx0IHtAY29kZSB0cnVlfSB3aGVuIHRoZSBjb25uZWN0aW9uIGV4aXN0ZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZUNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZWN5Y2xlcyBhIGV4aXN0aW5nIGZyZWUgYnVmZmVyIGlmIGl0IGlzIHBvc3NpYmxlLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gYWxsb2NhdG9yIHRoZSBidWZmZXIgYWxsb2NhdG9yCisgICAgICAgICAqIEBwYXJhbSBwYXJhbXMgICAgdGhlIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgICAgICogQHBhcmFtIHBJZCAgICAgICB0aGUgaWQgb2YgdGhlIHJlY3ljbGVkIGJ1ZmZlci4KKyAgICAgICAgICogQHBhcmFtIGhhbmRsZSAgICB0aGUgbmF0aXZlIGhhbmRsZSBvZiB0aGUgcmVjeWNsZWQgYnVmZmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuIGEgYnVmZmVyIGlzIHJlY3ljbGVkLCB7QGNvZGUgZmFsc2V9CisgICAgICAgICAqICAgICAgICAgb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBnZXRGcmVlQnVmZmVyKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgQnVmZmVySWQgKnBJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyBhIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIgdG8gYnVmZmVycG9vbC4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFsbG9jICAgICB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgICAgICogQHBhcmFtIGFsbG9jU2l6ZSB0aGUgc2l6ZSBvZiB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgICAgICogQHBhcmFtIHBhcmFtcyAgICB0aGUgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAgICAgKiBAcGFyYW0gcElkICAgICAgIHRoZSBidWZmZXIgaWQgZm9yIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAgICAgKiBAcGFyYW0gaGFuZGxlICAgIHRoZSBuYXRpdmUgaGFuZGxlIGZvciB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBPSyB3aGVuIGFuIGFsbG9jYXRpb24gaXMgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZC4KKyAgICAgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgUmVzdWx0U3RhdHVzIGFkZE5ld0J1ZmZlcigKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgICAgICAgICBjb25zdCBzaXplX3QgYWxsb2NTaXplLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgQnVmZmVySWQgKnBJZCwKKyAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBQcm9jZXNzZXMgcGVuZGluZyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzIGFuZCBwZXJmb3JtcyBwZXJpb2RpYyBjYWNoZQorICAgICAgICAgKiBjbGVhbmluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNsZWFyQ2FjaGUgICAgaWYgY2xlYXJDYWNoZSBpcyB0cnVlLCBpdCBmcmVlcyBhbGwgYnVmZmVycworICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3YWl0aW5nIHRvIGJlIHJlY3ljbGVkLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSA9IGZhbHNlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUHJvY2Vzc2VzIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBhbmQgaW52YWxpZGF0ZSBhbGwgY3VycmVudAorICAgICAgICAgKiBmcmVlIGJ1ZmZlcnMuIEFjdGl2ZSBidWZmZXJzIGFyZSBpbnZhbGlkYXRlZCBhZnRlciBiZWluZyBpbmFjdGl2ZS4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgZmx1c2goY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc29yOjpJbXBsPiAmaW1wbCk7CisKKyAgICAgICAgZnJpZW5kIGNsYXNzIEFjY2Vzc29yOjpJbXBsOworICAgIH0gbUJ1ZmZlclBvb2w7CisKKyAgICBzdHJ1Y3QgIEFjY2Vzc29ySW52YWxpZGF0b3IgeworICAgICAgICBzdGQ6Om1hcDx1aW50MzJfdCwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxBY2Nlc3Nvcjo6SW1wbD4+IG1BY2Nlc3NvcnM7CisgICAgICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ3Y7CisgICAgICAgIGJvb2wgbVJlYWR5OworCisgICAgICAgIEFjY2Vzc29ySW52YWxpZGF0b3IoKTsKKyAgICAgICAgdm9pZCBhZGRBY2Nlc3Nvcih1aW50MzJfdCBhY2Nlc3NvcklkLCBjb25zdCBzdGQ6OndlYWtfcHRyPEFjY2Vzc29yOjpJbXBsPiAmaW1wbCk7CisgICAgICAgIHZvaWQgZGVsQWNjZXNzb3IodWludDMyX3QgYWNjZXNzb3JJZCk7CisgICAgfTsKKworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QWNjZXNzb3JJbnZhbGlkYXRvcj4gc0ludmFsaWRhdG9yOworCisgICAgc3RhdGljIHZvaWQgaW52YWxpZGF0b3JUaHJlYWQoCisgICAgICAgIHN0ZDo6bWFwPHVpbnQzMl90LCBjb25zdCBzdGQ6OndlYWtfcHRyPEFjY2Vzc29yOjpJbXBsPj4gJmFjY2Vzc29ycywKKyAgICAgICAgc3RkOjptdXRleCAmbXV0ZXgsCisgICAgICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlICZjdiwKKyAgICAgICAgYm9vbCAmcmVhZHkpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIHVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQUNDRVNTT1JJTVBMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FuZHJvaWQuYnAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MWFjMTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzMgQEAKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMCIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKKyAgICBzcmNzOiBbCisgICAgICAgICJBY2Nlc3Nvci5jcHAiLAorICAgICAgICAiQWNjZXNzb3JJbXBsLmNwcCIsCisgICAgICAgICJCdWZmZXJQb29sQ2xpZW50LmNwcCIsCisgICAgICAgICJCdWZmZXJTdGF0dXMuY3BwIiwKKyAgICAgICAgIkNsaWVudE1hbmFnZXIuY3BwIiwKKyAgICAgICAgIkNvbm5lY3Rpb24uY3BwIiwKKyAgICAgICAgIk9ic2VydmVyLmNwcCIsCisgICAgXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZm1xIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmh3YmluZGVyIiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgIF0sCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGliZm1xIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJQb29sQ2xpZW50LmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclBvb2xDbGllbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MmZlZjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJQb29sQ2xpZW50LmNwcApAQCAtMCwwICsxLDg2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbENsaWVudCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlICJCdWZmZXJQb29sQ2xpZW50LmgiCisjaW5jbHVkZSAiQ29ubmVjdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3N0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrUmVjZWl2ZVRpbWVvdXRVcyA9IDEwMDAwMDA7IC8vIDEwMG1zCitzdGF0aWMgY29uc3RleHByIGludCBrUG9zdE1heFJldHJ5ID0gMzsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtDYWNoZVR0bFVzID0gMTAwMDAwMDsgLy8gVE9ETzogdHVuZQorCitjbGFzcyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsCisgICAgICAgIDogcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8QnVmZmVyUG9vbENsaWVudDo6SW1wbD4geworcHVibGljOgorICAgIGV4cGxpY2l0IEltcGwoY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvciwgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIpOworCisgICAgZXhwbGljaXQgSW1wbChjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3NvciwgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIpOworCisgICAgYm9vbCBpc1ZhbGlkKCkgeworICAgICAgICByZXR1cm4gbVZhbGlkOworICAgIH0KKworICAgIGJvb2wgaXNMb2NhbCgpIHsKKyAgICAgICAgcmV0dXJuIG1WYWxpZCAmJiBtTG9jYWw7CisgICAgfQorCisgICAgQ29ubmVjdGlvbklkIGdldENvbm5lY3Rpb25JZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Db25uZWN0aW9uSWQ7CisgICAgfQorCisgICAgc3A8SUFjY2Vzc29yPiAmZ2V0QWNjZXNzb3IoKSB7CisgICAgICAgIHJldHVybiBtQWNjZXNzb3I7CisgICAgfQorCisgICAgYm9vbCBpc0FjdGl2ZShpbnQ2NF90ICpsYXN0VHJhbnNhY3Rpb25VcywgYm9vbCBjbGVhckNhY2hlKTsKKworICAgIHZvaWQgcmVjZWl2ZUludmFsaWRhdGlvbih1aW50MzJfdCBtc2dJRCk7CisKKyAgICBSZXN1bHRTdGF0dXMgZmx1c2goKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcmVjZWl2ZSgKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgdm9pZCBwb3N0QnVmZmVyUmVsZWFzZShCdWZmZXJJZCBidWZmZXJJZCk7CisKKyAgICBib29sIHBvc3RTZW5kKAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIENvbm5lY3Rpb25JZCByZWNlaXZlciwKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsIGludDY0X3QgKnRpbWVzdGFtcFVzKTsKK3ByaXZhdGU6CisKKyAgICBib29sIHBvc3RSZWNlaXZlKAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMpOworCisgICAgYm9vbCBwb3N0UmVjZWl2ZVJlc3VsdCgKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIGJvb2wgcmVzdWx0LCBib29sICpuZWVkc1N5bmMpOworCisgICAgdm9pZCB0cnlTeW5jRnJvbVJlbW90ZSgpOworCisgICAgYm9vbCBzeW5jUmVsZWFzZWQodWludDMyX3QgbXNnSWQgPSAwKTsKKworICAgIHZvaWQgZXZpY3RDYWNoZXMoYm9vbCBjbGVhckNhY2hlID0gZmFsc2UpOworCisgICAgdm9pZCBpbnZhbGlkYXRlQnVmZmVyKEJ1ZmZlcklkIGlkKTsKKworICAgIHZvaWQgaW52YWxpZGF0ZVJhbmdlKEJ1ZmZlcklkIGZyb20sIEJ1ZmZlcklkIHRvKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZUJ1ZmZlckhhbmRsZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICBSZXN1bHRTdGF0dXMgZmV0Y2hCdWZmZXJIYW5kbGUoCisgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgIHN0cnVjdCBCbG9ja1Bvb2xEYXRhRHRvcjsKKyAgICBzdHJ1Y3QgQ2xpZW50QnVmZmVyOworCisgICAgYm9vbCBtTG9jYWw7CisgICAgYm9vbCBtVmFsaWQ7CisgICAgc3A8SUFjY2Vzc29yPiBtQWNjZXNzb3I7CisgICAgc3A8Q29ubmVjdGlvbj4gbUxvY2FsQ29ubmVjdGlvbjsKKyAgICBzcDxJQ29ubmVjdGlvbj4gbVJlbW90ZUNvbm5lY3Rpb247CisgICAgdWludDMyX3QgbVNlcUlkOworICAgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworICAgIGludDY0X3QgbUxhc3RFdmljdENhY2hlVXM7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlckludmFsaWRhdGlvbkxpc3RlbmVyPiBtSW52YWxpZGF0aW9uTGlzdGVuZXI7CisKKyAgICAvLyBDYWNoZWRCdWZmZXJzCisgICAgc3RydWN0IEJ1ZmZlckNhY2hlIHsKKyAgICAgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICAgICAgYm9vbCBtQ3JlYXRpbmc7CisgICAgICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1DcmVhdGVDdjsKKyAgICAgICAgc3RkOjptYXA8QnVmZmVySWQsIHN0ZDo6dW5pcXVlX3B0cjxDbGllbnRCdWZmZXI+PiBtQnVmZmVyczsKKyAgICAgICAgaW50IG1BY3RpdmU7CisgICAgICAgIGludDY0X3QgbUxhc3RDaGFuZ2VVczsKKworICAgICAgICBCdWZmZXJDYWNoZSgpIDogbUNyZWF0aW5nKGZhbHNlKSwgbUFjdGl2ZSgwKSwgbUxhc3RDaGFuZ2VVcyhnZXRUaW1lc3RhbXBOb3coKSkge30KKworICAgICAgICB2b2lkIGluY0FjdGl2ZV9sKCkgeworICAgICAgICAgICAgKyttQWN0aXZlOworICAgICAgICAgICAgbUxhc3RDaGFuZ2VVcyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBkZWNBY3RpdmVfbCgpIHsKKyAgICAgICAgICAgIC0tbUFjdGl2ZTsKKyAgICAgICAgICAgIG1MYXN0Q2hhbmdlVXMgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgfQorICAgIH0gbUNhY2hlOworCisgICAgLy8gRk1RIC0gcmVsZWFzZSBub3RpZmllcgorICAgIHN0cnVjdCBSZWxlYXNlQ2FjaGUgeworICAgICAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgICAgICAvLyBUT0RPOiB1c2Ugb25seSBvbmUgbGlzdD8odXNpbmcgb25lIGxpc3QgbWF5IGRlYWx5IHNlbmRpbmcgbWVzc2FnZXM/KQorICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+IG1SZWxlYXNpbmdJZHM7CisgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gbVJlbGVhc2VkSWRzOworICAgICAgICB1aW50MzJfdCBtSW52YWxpZGF0ZUlkOyAvLyBUT0RPOiBpbnZhbGlkYXRpb24gQUNLIHRvIGJ1ZmZlcnBvb2wKKyAgICAgICAgYm9vbCBtSW52YWxpZGF0ZUFjazsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c0NoYW5uZWw+IG1TdGF0dXNDaGFubmVsOworCisgICAgICAgIFJlbGVhc2VDYWNoZSgpIDogbUludmFsaWRhdGVJZCgwKSwgbUludmFsaWRhdGVBY2sodHJ1ZSkge30KKyAgICB9IG1SZWxlYXNpbmc7CisKKyAgICAvLyBUaGlzIGxvY2sgaXMgaGVsZCBkdXJpbmcgc3luY2hyb25pemF0aW9uIGZyb20gcmVtb3RlIHNpZGUuCisgICAgLy8gSW4gb3JkZXIgdG8gbWluaW1pemUgcmVtb3RlIGNhbGxzIGFuZCBsb2NraW5nIGR1cnRhaW9uLCB0aGlzIGxvY2sgaXMgaGVsZAorICAgIC8vIGJ5IGJlc3QgZWZmb3J0IGFwcHJvYWNoIHVzaW5nIHRyeV9sb2NrKCkuCisgICAgc3RkOjptdXRleCBtUmVtb3RlU3luY0xvY2s7Cit9OworCitzdHJ1Y3QgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6QmxvY2tQb29sRGF0YUR0b3IgeworICAgIEJsb2NrUG9vbERhdGFEdG9yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50OjpJbXBsPiAmaW1wbCkKKyAgICAgICAgICAgIDogbUltcGwoaW1wbCkge30KKworICAgIHZvaWQgb3BlcmF0b3IoKShCdWZmZXJQb29sRGF0YSAqYnVmZmVyKSB7CisgICAgICAgIEJ1ZmZlcklkIGlkID0gYnVmZmVyLT5tSWQ7CisgICAgICAgIGRlbGV0ZSBidWZmZXI7CisKKyAgICAgICAgYXV0byBpbXBsID0gbUltcGwubG9jaygpOworICAgICAgICBpZiAoaW1wbCAmJiBpbXBsLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIGltcGwtPnBvc3RCdWZmZXJSZWxlYXNlKGlkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjb25zdCBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw+IG1JbXBsOworfTsKKworc3RydWN0IEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OkNsaWVudEJ1ZmZlciB7Citwcml2YXRlOgorICAgIGludDY0X3QgbUV4cGlyZVVzOworICAgIGJvb2wgbUhhc0NhY2hlOworICAgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworICAgIEJ1ZmZlcklkIG1JZDsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKm1IYW5kbGU7CisgICAgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sRGF0YT4gbUNhY2hlOworCisgICAgdm9pZCB1cGRhdGVFeHBpcmUoKSB7CisgICAgICAgIG1FeHBpcmVVcyA9IGdldFRpbWVzdGFtcE5vdygpICsga0NhY2hlVHRsVXM7CisgICAgfQorCitwdWJsaWM6CisgICAgQ2xpZW50QnVmZmVyKAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQnVmZmVySWQgaWQsIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKQorICAgICAgICAgICAgOiBtSGFzQ2FjaGUoZmFsc2UpLCBtQ29ubmVjdGlvbklkKGNvbm5lY3Rpb25JZCksCisgICAgICAgICAgICAgIG1JZChpZCksIG1IYW5kbGUoaGFuZGxlKSB7CisgICAgICAgIG1FeHBpcmVVcyA9IGdldFRpbWVzdGFtcE5vdygpICsga0NhY2hlVHRsVXM7CisgICAgfQorCisgICAgfkNsaWVudEJ1ZmZlcigpIHsKKyAgICAgICAgaWYgKG1IYW5kbGUpIHsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UobUhhbmRsZSk7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShtSGFuZGxlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEJ1ZmZlcklkIGlkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUlkOworICAgIH0KKworICAgIGJvb2wgZXhwaXJlKCkgY29uc3QgeworICAgICAgICBpbnQ2NF90IG5vdyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICByZXR1cm4gbm93ID49IG1FeHBpcmVVczsKKyAgICB9CisKKyAgICBib29sIGhhc0NhY2hlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUhhc0NhY2hlOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gZmV0Y2hDYWNoZShuYXRpdmVfaGFuZGxlX3QgKipwSGFuZGxlKSB7CisgICAgICAgIGlmIChtSGFzQ2FjaGUpIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gY2FjaGUgPSBtQ2FjaGUubG9jaygpOworICAgICAgICAgICAgaWYgKGNhY2hlKSB7CisgICAgICAgICAgICAgICAgKnBIYW5kbGUgPSBtSGFuZGxlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNhY2hlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gY3JlYXRlQ2FjaGUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudDo6SW1wbD4gJmltcGwsCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipwSGFuZGxlKSB7CisgICAgICAgIGlmICghbUhhc0NhY2hlKSB7CisgICAgICAgICAgICAvLyBBbGxvY2F0ZXMgYSByYXcgcHRyIGluIG9yZGVyIHRvIGF2b2lkIHNlbmRpbmcgI3Bvc3RCdWZmZXJSZWxlYXNlCisgICAgICAgICAgICAvLyBmcm9tIGRlbGV0ZXIsIGluIGNhc2Ugb2YgbmF0aXZlX2hhbmRsZV9jbG9uZSBmYWlsdXJlLgorICAgICAgICAgICAgQnVmZmVyUG9vbERhdGEgKnB0ciA9IG5ldyBCdWZmZXJQb29sRGF0YShtQ29ubmVjdGlvbklkLCBtSWQpOworICAgICAgICAgICAgaWYgKHB0cikgeworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gY2FjaGUocHRyLCBCbG9ja1Bvb2xEYXRhRHRvcihpbXBsKSk7CisgICAgICAgICAgICAgICAgaWYgKGNhY2hlKSB7CisgICAgICAgICAgICAgICAgICAgIG1DYWNoZSA9IGNhY2hlOworICAgICAgICAgICAgICAgICAgICBtSGFzQ2FjaGUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAqcEhhbmRsZSA9IG1IYW5kbGU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocHRyKSB7CisgICAgICAgICAgICAgICAgZGVsZXRlIHB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBib29sIG9uQ2FjaGVSZWxlYXNlKCkgeworICAgICAgICBpZiAobUhhc0NhY2hlKSB7CisgICAgICAgICAgICAvLyBUT0RPOiB2ZXJpZnkgbUNhY2hlIGlzIG5vdCB2YWxpZDsKKyAgICAgICAgICAgIHVwZGF0ZUV4cGlyZSgpOworICAgICAgICAgICAgbUhhc0NhY2hlID0gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfTsKKworQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6SW1wbChjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlcikKKyAgICA6IG1Mb2NhbCh0cnVlKSwgbVZhbGlkKGZhbHNlKSwgbUFjY2Vzc29yKGFjY2Vzc29yKSwgbVNlcUlkKDApLAorICAgICAgbUxhc3RFdmljdENhY2hlVXMoZ2V0VGltZXN0YW1wTm93KCkpIHsKKyAgICBjb25zdCBTdGF0dXNEZXNjcmlwdG9yICpzdGF0dXNEZXNjOworICAgIGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IgKmludkRlc2M7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IGFjY2Vzc29yLT5jb25uZWN0KAorICAgICAgICAgICAgb2JzZXJ2ZXIsIHRydWUsCisgICAgICAgICAgICAmbUxvY2FsQ29ubmVjdGlvbiwgJm1Db25uZWN0aW9uSWQsICZtUmVsZWFzaW5nLm1JbnZhbGlkYXRlSWQsCisgICAgICAgICAgICAmc3RhdHVzRGVzYywgJmludkRlc2MpOworICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsID0KKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlclN0YXR1c0NoYW5uZWw+KCpzdGF0dXNEZXNjKTsKKyAgICAgICAgbUludmFsaWRhdGlvbkxpc3RlbmVyID0KKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlckludmFsaWRhdGlvbkxpc3RlbmVyPigqaW52RGVzYyk7CisgICAgICAgIG1WYWxpZCA9IG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwgJiYKKyAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5pc1ZhbGlkKCkgJiYKKyAgICAgICAgICAgICAgICBtSW52YWxpZGF0aW9uTGlzdGVuZXIgJiYKKyAgICAgICAgICAgICAgICBtSW52YWxpZGF0aW9uTGlzdGVuZXItPmlzVmFsaWQoKTsKKyAgICB9Cit9CisKK0J1ZmZlclBvb2xDbGllbnQ6OkltcGw6OkltcGwoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IsIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyKQorICAgIDogbUxvY2FsKGZhbHNlKSwgbVZhbGlkKGZhbHNlKSwgbUFjY2Vzc29yKGFjY2Vzc29yKSwgbVNlcUlkKDApLAorICAgICAgbUxhc3RFdmljdENhY2hlVXMoZ2V0VGltZXN0YW1wTm93KCkpIHsKKyAgICBib29sIHZhbGlkID0gZmFsc2U7CisgICAgc3A8SUNvbm5lY3Rpb24+JiBvdXRDb25uZWN0aW9uID0gbVJlbW90ZUNvbm5lY3Rpb247CisgICAgQ29ubmVjdGlvbklkJiBpZCA9IG1Db25uZWN0aW9uSWQ7CisgICAgdWludDMyX3QmIG91dE1zZ0lkID0gbVJlbGVhc2luZy5tSW52YWxpZGF0ZUlkOworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNDaGFubmVsPiYgb3V0Q2hhbm5lbCA9CisgICAgICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsOworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lcj4mIG91dE9ic2VydmVyID0KKyAgICAgICAgICAgIG1JbnZhbGlkYXRpb25MaXN0ZW5lcjsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSBhY2Nlc3Nvci0+Y29ubmVjdCgKKyAgICAgICAgICAgIG9ic2VydmVyLAorICAgICAgICAgICAgWyZ2YWxpZCwgJm91dENvbm5lY3Rpb24sICZpZCwgJm91dE1zZ0lkLCAmb3V0Q2hhbm5lbCwgJm91dE9ic2VydmVyXQorICAgICAgICAgICAgKFJlc3VsdFN0YXR1cyBzdGF0dXMsIHNwPElDb25uZWN0aW9uPiBjb25uZWN0aW9uLAorICAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIHVpbnQzMl90IG1zZ0lkLAorICAgICAgICAgICAgIGNvbnN0IFN0YXR1c0Rlc2NyaXB0b3ImIHN0YXR1c0Rlc2MsCisgICAgICAgICAgICAgY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvciYgaW52RGVzYykgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBvdXRDb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgaWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICAgICAgICAgIG91dE1zZ0lkID0gbXNnSWQ7CisgICAgICAgICAgICAgICAgICAgIG91dENoYW5uZWwgPSBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlclN0YXR1c0NoYW5uZWw+KHN0YXR1c0Rlc2MpOworICAgICAgICAgICAgICAgICAgICBvdXRPYnNlcnZlciA9IHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVySW52YWxpZGF0aW9uTGlzdGVuZXI+KGludkRlc2MpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0Q2hhbm5lbCAmJiBvdXRDaGFubmVsLT5pc1ZhbGlkKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dE9ic2VydmVyICYmIG91dE9ic2VydmVyLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIG1WYWxpZCA9IHRyYW5zUmVzdWx0LmlzT2soKSAmJiB2YWxpZDsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjppc0FjdGl2ZShpbnQ2NF90ICpsYXN0VHJhbnNhY3Rpb25VcywgYm9vbCBjbGVhckNhY2hlKSB7CisgICAgYm9vbCBhY3RpdmUgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTG9jayk7CisgICAgICAgIHN5bmNSZWxlYXNlZCgpOworICAgICAgICBldmljdENhY2hlcyhjbGVhckNhY2hlKTsKKyAgICAgICAgKmxhc3RUcmFuc2FjdGlvblVzID0gbUNhY2hlLm1MYXN0Q2hhbmdlVXM7CisgICAgICAgIGFjdGl2ZSA9IG1DYWNoZS5tQWN0aXZlID4gMDsKKyAgICB9CisgICAgaWYgKG1WYWxpZCAmJiBtTG9jYWwgJiYgbUxvY2FsQ29ubmVjdGlvbikgeworICAgICAgICBtTG9jYWxDb25uZWN0aW9uLT5jbGVhblVwKGNsZWFyQ2FjaGUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGFjdGl2ZTsKK30KKwordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpyZWNlaXZlSW52YWxpZGF0aW9uKHVpbnQzMl90IG1lc3NhZ2VJZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTG9jayk7CisgICAgc3luY1JlbGVhc2VkKG1lc3NhZ2VJZCk7CisgICAgLy8gVE9ETzogZXZpY3QgY2FjaGUgcmVxdWlyZWQ/Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpmbHVzaCgpIHsKKyAgICBpZiAoIW1Mb2NhbCB8fCAhbUxvY2FsQ29ubmVjdGlvbiB8fCAhbVZhbGlkKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubUxvY2spOworICAgICAgICBzeW5jUmVsZWFzZWQoKTsKKyAgICAgICAgZXZpY3RDYWNoZXMoKTsKKyAgICAgICAgcmV0dXJuIG1Mb2NhbENvbm5lY3Rpb24tPmZsdXNoKCk7CisgICAgfQorfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6YWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKnBIYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmICghbUxvY2FsIHx8ICFtTG9jYWxDb25uZWN0aW9uIHx8ICFtVmFsaWQpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIEJ1ZmZlcklkIGJ1ZmZlcklkOworICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gbnVsbHB0cjsKKyAgICBidWZmZXItPnJlc2V0KCk7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IGFsbG9jYXRlQnVmZmVySGFuZGxlKHBhcmFtcywgJmJ1ZmZlcklkLCAmaGFuZGxlKTsKKyAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgaWYgKGhhbmRsZSkgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTG9jayk7CisgICAgICAgICAgICBzeW5jUmVsZWFzZWQoKTsKKyAgICAgICAgICAgIGV2aWN0Q2FjaGVzKCk7CisgICAgICAgICAgICBhdXRvIGNhY2hlSXQgPSBtQ2FjaGUubUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgICAgICBpZiAoY2FjaGVJdCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiB2ZXJpZnkgaXQgaXMgcmVjeWNsZWQuIChub3QgaGF2aW5nIGFjdGl2ZSByZWYpCisgICAgICAgICAgICAgICAgbUNhY2hlLm1CdWZmZXJzLmVyYXNlKGNhY2hlSXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0byBjbGllbnRCdWZmZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENsaWVudEJ1ZmZlcj4oCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgICAgICAgICAgaWYgKGNsaWVudEJ1ZmZlcikgeworICAgICAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gbUNhY2hlLm1CdWZmZXJzLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcklkLCBzdGQ6Om1vdmUoY2xpZW50QnVmZmVyKSkpOworICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSByZXN1bHQuZmlyc3QtPnNlY29uZC0+Y3JlYXRlQ2FjaGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX2Zyb21fdGhpcygpLCBwSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYWNoZS5pbmNBY3RpdmVfbCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghKmJ1ZmZlcikgeworICAgICAgICAgICAgQUxPR1YoImNsaWVudCBjYWNoZSBjcmVhdGlvbiBmYWlsdXJlICVkOiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgIGhhbmRsZSAhPSBudWxscHRyLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICBwb3N0QnVmZmVyUmVsZWFzZShidWZmZXJJZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnJlY2VpdmUoCisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKnBIYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmICghbVZhbGlkKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBpZiAodGltZXN0YW1wVXMgIT0gMCkgeworICAgICAgICB0aW1lc3RhbXBVcyArPSBrUmVjZWl2ZVRpbWVvdXRVczsKKyAgICB9CisgICAgaWYgKCFwb3N0UmVjZWl2ZShidWZmZXJJZCwgdHJhbnNhY3Rpb25JZCwgdGltZXN0YW1wVXMpKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICBidWZmZXItPnJlc2V0KCk7CisgICAgd2hpbGUoMSkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1Mb2NrKTsKKyAgICAgICAgc3luY1JlbGVhc2VkKCk7CisgICAgICAgIGV2aWN0Q2FjaGVzKCk7CisgICAgICAgIGF1dG8gY2FjaGVJdCA9IG1DYWNoZS5tQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgaWYgKGNhY2hlSXQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICBpZiAoY2FjaGVJdC0+c2Vjb25kLT5oYXNDYWNoZSgpKSB7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGNhY2hlSXQtPnNlY29uZC0+ZmV0Y2hDYWNoZShwSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAoISpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdHJhbnNmZXIgdGltZV9vdXQKKyAgICAgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6eWllbGQoKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgcmVjZWl2ZSBmcm9tIHJlZmVyZW5jZSAlbGxkIiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGNhY2hlSXQtPnNlY29uZC0+Y3JlYXRlQ2FjaGUoc2hhcmVkX2Zyb21fdGhpcygpLCBwSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBpZiAoKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICBtQ2FjaGUuaW5jQWN0aXZlX2woKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoImNsaWVudCByZWNlaXZlIGZyb20gY2FjaGUgJWxsZCIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIW1DYWNoZS5tQ3JlYXRpbmcpIHsKKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNyZWF0aW5nID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBmZXRjaEJ1ZmZlckhhbmRsZSh0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgJmhhbmRsZSk7CisgICAgICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gY2xpZW50QnVmZmVyID0gc3RkOjptYWtlX3VuaXF1ZTxDbGllbnRCdWZmZXI+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGllbnRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IG1DYWNoZS5tQnVmZmVycy5pbnNlcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihidWZmZXJJZCwgc3RkOjptb3ZlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRCdWZmZXIpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IHJlc3VsdC5maXJzdC0+c2Vjb25kLT5jcmVhdGVDYWNoZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfZnJvbV90aGlzKCksIHBIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhY2hlLmluY0FjdGl2ZV9sKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKCEqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNyZWF0aW5nID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNyZWF0ZUN2Lm5vdGlmeV9hbGwoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYWNoZS5tQ3JlYXRlQ3Yud2FpdChsb2NrKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIG5lZWRzU3luYyA9IGZhbHNlOworICAgIGJvb2wgcG9zdGVkID0gcG9zdFJlY2VpdmVSZXN1bHQoYnVmZmVySWQsIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPyB0cnVlIDogZmFsc2UsICZuZWVkc1N5bmMpOworICAgIEFMT0dWKCJjbGllbnQgcmVjZWl2ZSAlbGxkIC0gJXUgOiAlcyAoJWQpIiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAqYnVmZmVyID8gIm9rIiA6ICJmYWlsIiwgcG9zdGVkKTsKKyAgICBpZiAobVZhbGlkICYmIG1Mb2NhbCAmJiBtTG9jYWxDb25uZWN0aW9uKSB7CisgICAgICAgIG1Mb2NhbENvbm5lY3Rpb24tPmNsZWFuVXAoZmFsc2UpOworICAgIH0KKyAgICBpZiAobmVlZHNTeW5jICYmIG1SZW1vdGVDb25uZWN0aW9uKSB7CisgICAgICAgIHRyeVN5bmNGcm9tUmVtb3RlKCk7CisgICAgfQorICAgIGlmICgqYnVmZmVyKSB7CisgICAgICAgIGlmICghcG9zdGVkKSB7CisgICAgICAgICAgICBidWZmZXItPnJlc2V0KCk7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnBvc3RCdWZmZXJSZWxlYXNlKEJ1ZmZlcklkIGJ1ZmZlcklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLnB1c2hfYmFjayhidWZmZXJJZCk7CisgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclJlbGVhc2UoCisgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKK30KKworLy8gVE9ETzogcmV2aXNlIGFkLWhvYyBwb3N0aW5nIGRhdGEgc3RydWN0dXJlCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnBvc3RTZW5kKAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgQ29ubmVjdGlvbklkIHJlY2VpdmVyLAorICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLCBpbnQ2NF90ICp0aW1lc3RhbXBVcykgeworICAgIHsKKyAgICAgICAgLy8gVE9ETzogZG9uJ3QgbmVlZCB0byBjYWxsIHN5bmNSZWxlYXNlZCBldmVyeSB0aW1lCisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTG9jayk7CisgICAgICAgIHN5bmNSZWxlYXNlZCgpOworICAgIH0KKyAgICBib29sIHJldCA9IGZhbHNlOworICAgIGJvb2wgbmVlZHNTeW5jID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAgICAgKnRpbWVzdGFtcFVzID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgICp0cmFuc2FjdGlvbklkID0gKG1Db25uZWN0aW9uSWQgPDwgMzIpIHwgbVNlcUlkKys7CisgICAgICAgIC8vIFRPRE86IHJldHJ5LCBhZGQgdGltZW91dCwgdGFyZ2V0PworICAgICAgICByZXQgPSAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgICAgICAgICAgKnRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RPLCBtQ29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgIHJlY2VpdmVyLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKKyAgICAgICAgbmVlZHNTeW5jID0gIW1Mb2NhbCAmJiBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5uZWVkc1N5bmMoKTsKKyAgICB9CisgICAgaWYgKG1WYWxpZCAmJiBtTG9jYWwgJiYgbUxvY2FsQ29ubmVjdGlvbikgeworICAgICAgICBtTG9jYWxDb25uZWN0aW9uLT5jbGVhblVwKGZhbHNlKTsKKyAgICB9CisgICAgaWYgKG5lZWRzU3luYyAmJiBtUmVtb3RlQ29ubmVjdGlvbikgeworICAgICAgICB0cnlTeW5jRnJvbVJlbW90ZSgpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnBvc3RSZWNlaXZlKAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrUG9zdE1heFJldHJ5OyArK2kpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgICAgICBpbnQ2NF90IG5vdyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICBpZiAodGltZXN0YW1wVXMgPT0gMCB8fCBub3cgPCB0aW1lc3RhbXBVcykgeworICAgICAgICAgICAgYm9vbCByZXN1bHQgPSBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRlJPTSwKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgLTEsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywKKyAgICAgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgICAgICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnlpZWxkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgLTEsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywKKyAgICAgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpwb3N0UmVjZWl2ZVJlc3VsdCgKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgYm9vbCByZXN1bHQsIGJvb2wgKm5lZWRzU3luYykgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgIC8vIFRPRE86IHJldHJ5LCBhZGQgdGltZW91dAorICAgIGJvb2wgcmV0ID0gbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAgIHJlc3VsdCA/IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfT0sgOiBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0VSUk9SLAorICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgLTEsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywKKyAgICAgICAgICAgIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKKyAgICAqbmVlZHNTeW5jID0gIW1Mb2NhbCAmJiBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5uZWVkc1N5bmMoKTsKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnRyeVN5bmNGcm9tUmVtb3RlKCkgeworICAgIGlmIChtUmVtb3RlU3luY0xvY2sudHJ5X2xvY2soKSkgeworICAgICAgICBib29sIG5lZWRzU3luYyA9IGZhbHNlOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAgICAgICAgIG5lZWRzU3luYyA9IG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPm5lZWRzU3luYygpOworICAgICAgICB9CisgICAgICAgIGlmIChuZWVkc1N5bmMpIHsKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCA9IChtQ29ubmVjdGlvbklkIDw8IDMyKTsKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkID0gQ29ubmVjdGlvbjo6U1lOQ19CVUZGRVJJRDsKKyAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IG1SZW1vdGVDb25uZWN0aW9uLT5mZXRjaCgKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgIFtdCisgICAgICAgICAgICAgICAgICAgIChSZXN1bHRTdGF0dXMgb3V0U3RhdHVzLCBCdWZmZXIgb3V0QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgb3V0U3RhdHVzOworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIG91dEJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoIXRyYW5zUmVzdWx0LmlzT2soKSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJzeW5jIGZyb20gY2xpZW50ICVsbGQgZmFpbGVkOiBidWZmZXJwb29sIHByb2Nlc3MgZGllZC4iLAorICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVJlbW90ZVN5bmNMb2NrLnVubG9jaygpOworICAgIH0KK30KKworLy8gc2hvdWxkIGhhdmUgbUNhY2hlLm1Mb2NrCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnN5bmNSZWxlYXNlZCh1aW50MzJfdCBtZXNzYWdlSWQpIHsKKyAgICBib29sIGNsZWFyZWQgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgICAgICBpZiAobVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJSZWxlYXNlKAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsCisgICAgICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVJlbGVhc2luZy5tUmVsZWFzZWRJZHMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZm9yIChCdWZmZXJJZCYgaWQ6IG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNsaWVudCByZWxlYXNlIGJ1ZmZlciAlbGxkIC0gJXUiLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsIGlkKTsKKyAgICAgICAgICAgICAgICBhdXRvIGZvdW5kID0gbUNhY2hlLm1CdWZmZXJzLmZpbmQoaWQpOworICAgICAgICAgICAgICAgIGlmIChmb3VuZCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kLT5zZWNvbmQtPm9uQ2FjaGVSZWxlYXNlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DYWNoZS5kZWNBY3RpdmVfbCgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4hCisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2xpZW50ICVsbGQgY2FjaGUgcmVsZWFzZSBzdGF0dXMgaW5jb25zaXRlbnQhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBoYXBwZW4hCisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjbGllbnQgJWxsZCBjYWNoZSBzdGF0dXMgaW5jb25zaXRlbnQhIiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcy5jbGVhcigpOworICAgICAgICAgICAgY2xlYXJlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8QnVmZmVySW52YWxpZGF0aW9uTWVzc2FnZT4gaW52YWxpZGF0aW9uczsKKyAgICBtSW52YWxpZGF0aW9uTGlzdGVuZXItPmdldEludmFsaWRhdGlvbnMoaW52YWxpZGF0aW9ucyk7CisgICAgdWludDMyX3QgbGFzdE1zZ0lkID0gMDsKKyAgICBpZiAoaW52YWxpZGF0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgICAgIGZvciAoYXV0byBpdCA9IGludmFsaWRhdGlvbnMuYmVnaW4oKTsgaXQgIT0gaW52YWxpZGF0aW9ucy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgaWYgKGl0LT5tZXNzYWdlSWQgIT0gMCkgeworICAgICAgICAgICAgICAgIGxhc3RNc2dJZCA9IGl0LT5tZXNzYWdlSWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaXQtPmZyb21CdWZmZXJJZCA9PSBpdC0+dG9CdWZmZXJJZCkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IGhhbmRsZSBmcm9tQnVmZmVySWQgPSBVSU5UMzJfTUFYCisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZUJ1ZmZlcihpdC0+ZnJvbUJ1ZmZlcklkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZVJhbmdlKGl0LT5mcm9tQnVmZmVySWQsIGl0LT50b0J1ZmZlcklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgICAgICBpZiAobGFzdE1zZ0lkICE9IDApIHsKKyAgICAgICAgICAgIGlmIChpc01lc3NhZ2VMYXRlcihsYXN0TXNnSWQsIG1SZWxlYXNpbmcubUludmFsaWRhdGVJZCkpIHsKKyAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlSWQgPSBsYXN0TXNnSWQ7CisgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tSW52YWxpZGF0ZUFjayA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2VJZCAhPSAwKSB7CisgICAgICAgICAgICAvLyBtZXNzYWdlcyBhcmUgZHJhaW5lZC4KKyAgICAgICAgICAgIGlmIChpc01lc3NhZ2VMYXRlcihtZXNzYWdlSWQsIG1SZWxlYXNpbmcubUludmFsaWRhdGVJZCkpIHsKKyAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlSWQgPSBtZXNzYWdlSWQ7CisgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tSW52YWxpZGF0ZUFjayA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtUmVsZWFzaW5nLm1JbnZhbGlkYXRlQWNrKSB7CisgICAgICAgICAgICAvLyBwb3N0IEFDSworICAgICAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlckludmFsaWRhdGVBY2soCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubUludmFsaWRhdGVJZCwgJm1SZWxlYXNpbmcubUludmFsaWRhdGVBY2spOworICAgICAgICAgICAgQUxPR1YoImNsaWVudCAlbGxkIGludmFsaWRhdGVpb24gYWNrICglZCkgJXUiLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlQWNrLCBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlSWQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjbGVhcmVkOworfQorCisvLyBzaG91bGQgaGF2ZSBtQ2FjaGUubUxvY2sKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6ZXZpY3RDYWNoZXMoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICBpZiAobm93ID49IG1MYXN0RXZpY3RDYWNoZVVzICsga0NhY2hlVHRsVXMgfHwgY2xlYXJDYWNoZSkgeworICAgICAgICBzaXplX3QgZXZpY3RlZCA9IDA7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1DYWNoZS5tQnVmZmVycy5iZWdpbigpOyBpdCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCk7KSB7CisgICAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmhhc0NhY2hlKCkgJiYgKGl0LT5zZWNvbmQtPmV4cGlyZSgpIHx8IGNsZWFyQ2FjaGUpKSB7CisgICAgICAgICAgICAgICAgaXQgPSBtQ2FjaGUubUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgICsrZXZpY3RlZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiY2FjaGUgY291bnQgJWxsZCA6IHRvdGFsICV6dSwgYWN0aXZlICVkLCBldmljdGVkICV6dSIsCisgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgbUNhY2hlLm1CdWZmZXJzLnNpemUoKSwgbUNhY2hlLm1BY3RpdmUsIGV2aWN0ZWQpOworICAgICAgICBtTGFzdEV2aWN0Q2FjaGVVcyA9IG5vdzsKKyAgICB9Cit9CisKKy8vIHNob3VsZCBoYXZlIG1DYWNoZS5tTG9jawordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjppbnZhbGlkYXRlQnVmZmVyKEJ1ZmZlcklkIGlkKSB7CisgICAgZm9yIChhdXRvIGl0ID0gbUNhY2hlLm1CdWZmZXJzLmJlZ2luKCk7IGl0ICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoaWQgPT0gaXQtPnNlY29uZC0+aWQoKSkgeworICAgICAgICAgICAgaWYgKCFpdC0+c2Vjb25kLT5oYXNDYWNoZSgpKSB7CisgICAgICAgICAgICAgICAgbUNhY2hlLm1CdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICBBTE9HVigiY2FjaGUgaW52YWxpZGF0ZWQgJWxsZCA6IGJ1ZmZlciAldSIsCisgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBpZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJJbmNvbnNpdGVudCBpbnZhbGlkYXRpb24gJWxsZCA6IGFjdGl2ZXIgYnVmZmVyISEgJXUiLAorICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgKHVuc2lnbmVkIGludClpZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gc2hvdWxkIGhhdmUgbUNhY2hlLm1Mb2NrCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmludmFsaWRhdGVSYW5nZShCdWZmZXJJZCBmcm9tLCBCdWZmZXJJZCB0bykgeworICAgIHNpemVfdCBpbnZhbGlkYXRlZCA9IDA7CisgICAgZm9yIChhdXRvIGl0ID0gbUNhY2hlLm1CdWZmZXJzLmJlZ2luKCk7IGl0ICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKTspIHsKKyAgICAgICAgaWYgKCFpdC0+c2Vjb25kLT5oYXNDYWNoZSgpKSB7CisgICAgICAgICAgICBCdWZmZXJJZCBiaWQgPSBpdC0+c2Vjb25kLT5pZCgpOworICAgICAgICAgICAgaWYgKGZyb20gPCB0bykgeworICAgICAgICAgICAgICAgIGlmIChmcm9tIDw9IGJpZCAmJiBiaWQgPCB0bykgeworICAgICAgICAgICAgICAgICAgICArK2ludmFsaWRhdGVkOworICAgICAgICAgICAgICAgICAgICBpdCA9IG1DYWNoZS5tQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGZyb20gPD0gYmlkIHx8IGJpZCA8IHRvKSB7CisgICAgICAgICAgICAgICAgICAgICsraW52YWxpZGF0ZWQ7CisgICAgICAgICAgICAgICAgICAgIGl0ID0gbUNhY2hlLm1CdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICsraXQ7CisgICAgfQorICAgIEFMT0dWKCJjYWNoZSBpbnZhbGlkYXRlZCAlbGxkIDogIyBvZiBpbnZhbGlkYXRlZCAlenUiLAorICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgaW52YWxpZGF0ZWQpOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6YWxsb2NhdGVCdWZmZXJIYW5kbGUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgaWYgKG1Mb2NhbENvbm5lY3Rpb24pIHsKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiBhbGxvY0hhbmRsZSA9IG51bGxwdHI7CisgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtTG9jYWxDb25uZWN0aW9uLT5hbGxvY2F0ZSgKKyAgICAgICAgICAgICAgICBwYXJhbXMsIGJ1ZmZlcklkLCAmYWxsb2NIYW5kbGUpOworICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2Nsb25lKGFsbG9jSGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiY2xpZW50IGFsbG9jYXRlIHJlc3VsdCAlbGxkICVkIDogJXUgY2xvbmUgJXAiLAorICAgICAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsIHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LLAorICAgICAgICAgICAgICAqaGFuZGxlID8gKmJ1ZmZlcklkIDogMCAsICpoYW5kbGUpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmZldGNoQnVmZmVySGFuZGxlKAorICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpIHsKKyAgICBzcDxJQ29ubmVjdGlvbj4gY29ubmVjdGlvbjsKKyAgICBpZiAobUxvY2FsKSB7CisgICAgICAgIGNvbm5lY3Rpb24gPSBtTG9jYWxDb25uZWN0aW9uOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbm5lY3Rpb24gPSBtUmVtb3RlQ29ubmVjdGlvbjsKKyAgICB9CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSBjb25uZWN0aW9uLT5mZXRjaCgKKyAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLAorICAgICAgICAgICAgWyZzdGF0dXMsICZoYW5kbGVdCisgICAgICAgICAgICAoUmVzdWx0U3RhdHVzIG91dFN0YXR1cywgQnVmZmVyIG91dEJ1ZmZlcikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IG91dFN0YXR1czsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKmhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY2xvbmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLmJ1ZmZlci5nZXROYXRpdmVIYW5kbGUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHRyYW5zUmVzdWx0LmlzT2soKSA/IHN0YXR1cyA6IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKKworQnVmZmVyUG9vbENsaWVudDo6QnVmZmVyUG9vbENsaWVudChjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlcikgeworICAgIG1JbXBsID0gc3RkOjptYWtlX3NoYXJlZDxJbXBsPihhY2Nlc3Nvciwgb2JzZXJ2ZXIpOworfQorCitCdWZmZXJQb29sQ2xpZW50OjpCdWZmZXJQb29sQ2xpZW50KGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlcikgeworICAgIG1JbXBsID0gc3RkOjptYWtlX3NoYXJlZDxJbXBsPihhY2Nlc3Nvciwgb2JzZXJ2ZXIpOworfQorCitCdWZmZXJQb29sQ2xpZW50Ojp+QnVmZmVyUG9vbENsaWVudCgpIHsKKyAgICAvLyBUT0RPOiBob3cgdG8gaGFuZGxlIG9ycGhhbmVkIGJ1ZmZlcnM/Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gbUltcGwgJiYgbUltcGwtPmlzVmFsaWQoKTsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50Ojppc0xvY2FsKCkgeworICAgIHJldHVybiBtSW1wbCAmJiBtSW1wbC0+aXNMb2NhbCgpOworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OmlzQWN0aXZlKGludDY0X3QgKmxhc3RUcmFuc2FjdGlvblVzLCBib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpZiAoIWlzVmFsaWQoKSkgeworICAgICAgICAqbGFzdFRyYW5zYWN0aW9uVXMgPSAwOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBtSW1wbC0+aXNBY3RpdmUobGFzdFRyYW5zYWN0aW9uVXMsIGNsZWFyQ2FjaGUpOworfQorCitDb25uZWN0aW9uSWQgQnVmZmVyUG9vbENsaWVudDo6Z2V0Q29ubmVjdGlvbklkKCkgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5nZXRDb25uZWN0aW9uSWQoKTsKKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6Z2V0QWNjZXNzb3Ioc3A8SUFjY2Vzc29yPiAqYWNjZXNzb3IpIHsKKyAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgICphY2Nlc3NvciA9IG1JbXBsLT5nZXRBY2Nlc3NvcigpOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6cmVjZWl2ZUludmFsaWRhdGlvbih1aW50MzJfdCBtc2dJZCkgeworICAgIEFMT0dWKCJidWZmZXJwb29sMiBjbGllbnQgcmVjdiBpbnYgJXUiLCBtc2dJZCk7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICBtSW1wbC0+cmVjZWl2ZUludmFsaWRhdGlvbihtc2dJZCk7CisgICAgfQorfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6Zmx1c2goKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gbUltcGwtPmZsdXNoKCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6YWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gbUltcGwtPmFsbG9jYXRlKHBhcmFtcywgaGFuZGxlLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OnJlY2VpdmUoCisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gbUltcGwtPnJlY2VpdmUodHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIHRpbWVzdGFtcFVzLCBoYW5kbGUsIGJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6cG9zdFNlbmQoCisgICAgICAgIENvbm5lY3Rpb25JZCByZWNlaXZlcklkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsCisgICAgICAgIGludDY0X3QgKnRpbWVzdGFtcFVzKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICBib29sIHJlc3VsdCA9IG1JbXBsLT5wb3N0U2VuZCgKKyAgICAgICAgICAgICAgICBidWZmZXItPm1JZCwgcmVjZWl2ZXJJZCwgdHJhbnNhY3Rpb25JZCwgdGltZXN0YW1wVXMpOworICAgICAgICByZXR1cm4gcmVzdWx0ID8gUmVzdWx0U3RhdHVzOjpPSyA6IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJQb29sQ2xpZW50LmggYi9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJQb29sQ2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZThkOWFlNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclBvb2xDbGllbnQuaApAQCAtMCwwICsxLDExMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQlVGRkVSUE9PTENMSUVOVF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0JVRkZFUlBPT0xDTElFTlRfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUFjY2Vzc29yLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSU9ic2VydmVyLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgIkFjY2Vzc29yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklBY2Nlc3NvcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQ29ubmVjdGlvbjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJT2JzZXJ2ZXI7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworLyoqCisgKiBBIGJ1ZmZlciBwb29sIGNsaWVudCBmb3IgYSBidWZmZXIgcG9vbC4gRm9yIGEgc3BlY2lmaWMgYnVmZmVyIHBvb2wsIGF0IG1vc3QKKyAqIG9uZSBidWZmZXIgcG9vbCBjbGllbnQgZXhpc3RzIHBlciBwcm9jZXNzLiBUaGlzIGNsYXNzIHdpbGwgbm90IGJlIGV4cG9zZWQKKyAqIG91dHNpZGUuIEEgYnVmZmVyIHBvb2wgY2xpZW50IHdpbGwgYmUgdXNlZCB2aWEgQ2xpZW50TWFuYWdlci4KKyAqLworY2xhc3MgQnVmZmVyUG9vbENsaWVudCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sIGNsaWVudCBmcm9tIGEgbG9jYWwgYnVmZmVyIHBvb2wKKyAgICAgKiAodmlhIENsaWVudE1hbmFnZXIjY3JlYXRlKS4KKyAgICAgKi8KKyAgICBleHBsaWNpdCBCdWZmZXJQb29sQ2xpZW50KGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlcik7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgYnVmZmVyIHBvb2wgY2xpZW50IGZyb20gYSByZW1vdGUgYnVmZmVyIHBvb2wKKyAgICAgKiAodmlhIENsaWVudE1hbmFnZXIjcmVnaXN0ZXJTZW5kZXIpLgorICAgICAqIE5vdGU6IEEgYnVmZmVyIHBvb2wgY2xpZW50IGNyZWF0ZWQgd2l0aCByZW1vdGUgYnVmZmVyIHBvb2wgY2Fubm90CisgICAgICogYWxsb2NhdGUgYSBidWZmZXIuCisgICAgICovCisgICAgZXhwbGljaXQgQnVmZmVyUG9vbENsaWVudChjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyKTsKKworICAgIC8qKiBEZXN0cnVjdHMgYSBidWZmZXIgcG9vbCBjbGllbnQuICovCisgICAgfkJ1ZmZlclBvb2xDbGllbnQoKTsKKworcHJpdmF0ZToKKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIGJvb2wgaXNMb2NhbCgpOworCisgICAgYm9vbCBpc0FjdGl2ZShpbnQ2NF90ICpsYXN0VHJhbnNhY3Rpb25VcywgYm9vbCBjbGVhckNhY2hlKTsKKworICAgIENvbm5lY3Rpb25JZCBnZXRDb25uZWN0aW9uSWQoKTsKKworICAgIFJlc3VsdFN0YXR1cyBnZXRBY2Nlc3NvcihzcDxJQWNjZXNzb3I+ICphY2Nlc3Nvcik7CisKKyAgICB2b2lkIHJlY2VpdmVJbnZhbGlkYXRpb24odWludDMyX3QgbXNnSWQpOworCisgICAgUmVzdWx0U3RhdHVzIGZsdXNoKCk7CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgUmVzdWx0U3RhdHVzIHJlY2VpdmUoVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcG9zdFNlbmQoQ29ubmVjdGlvbklkIHJlY2VpdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVzdGFtcFVzKTsKKworICAgIGNsYXNzIEltcGw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOworCisgICAgZnJpZW5kIHN0cnVjdCBDbGllbnRNYW5hZ2VyOworICAgIGZyaWVuZCBzdHJ1Y3QgT2JzZXJ2ZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQlVGRkVSUE9PTENMSUVOVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJTdGF0dXMuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyU3RhdHVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTM3MjYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyU3RhdHVzLmNwcApAQCAtMCwwICsxLDMwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbFN0YXR1cyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHRocmVhZD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSAiQnVmZmVyU3RhdHVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworaW50NjRfdCBnZXRUaW1lc3RhbXBOb3coKSB7CisgICAgaW50NjRfdCBzdGFtcDsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7CisgICAgLy8gVE9ETzogQ0xPQ0tfTU9OT1RPTklDX0NPQVJTRT8KKyAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRzKTsKKyAgICBzdGFtcCA9IHRzLnR2X25zZWMgLyAxMDAwOworICAgIHN0YW1wICs9ICh0cy50dl9zZWMgKiAxMDAwMDAwTEwpOworICAgIHJldHVybiBzdGFtcDsKK30KKworYm9vbCBpc01lc3NhZ2VMYXRlcih1aW50MzJfdCBjdXJNc2dJZCwgdWludDMyX3QgcHJldk1zZ0lkKSB7CisgICAgcmV0dXJuIGN1ck1zZ0lkICE9IHByZXZNc2dJZCAmJiBjdXJNc2dJZCAtIHByZXZNc2dJZCA8IHByZXZNc2dJZCAtIGN1ck1zZ0lkOworfQorCitib29sIGlzQnVmZmVySW5SYW5nZShCdWZmZXJJZCBmcm9tLCBCdWZmZXJJZCB0bywgQnVmZmVySWQgYnVmZmVySWQpIHsKKyAgICBpZiAoZnJvbSA8IHRvKSB7CisgICAgICAgIHJldHVybiBmcm9tIDw9IGJ1ZmZlcklkICYmIGJ1ZmZlcklkIDwgdG87CisgICAgfSBlbHNlIHsgLy8gd3JhcCBoYXBwZW5zCisgICAgICAgIHJldHVybiBmcm9tIDw9IGJ1ZmZlcklkIHx8IGJ1ZmZlcklkIDwgdG87CisgICAgfQorfQorCitzdGF0aWMgY29uc3RleHByIGludCBrTnVtRWxlbWVudHNJblF1ZXVlID0gMTAyNCoxNjsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtNaW5FbGVtZW50c1RvU3luY0luUXVldWUgPSAxMjg7CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJTdGF0dXNPYnNlcnZlcjo6b3BlbigKKyAgICAgICAgQ29ubmVjdGlvbklkIGlkLCBjb25zdCBTdGF0dXNEZXNjcmlwdG9yKiogZm1xRGVzY1B0cikgeworICAgIGlmIChtQnVmZmVyU3RhdHVzUXVldWVzLmZpbmQoaWQpICE9IG1CdWZmZXJTdGF0dXNRdWV1ZXMuZW5kKCkpIHsKKyAgICAgICAgLy8gVE9ETzogaWQgY29sbGlzaW9uIGxvZz8KKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNRdWV1ZT4gcXVldWUgPQorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJTdGF0dXNRdWV1ZT4oa051bUVsZW1lbnRzSW5RdWV1ZSk7CisgICAgaWYgKCFxdWV1ZSB8fCBxdWV1ZS0+aXNWYWxpZCgpID09IGZhbHNlKSB7CisgICAgICAgICpmbXFEZXNjUHRyID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgIH0gZWxzZSB7CisgICAgICAgICpmbXFEZXNjUHRyID0gcXVldWUtPmdldERlc2MoKTsKKyAgICB9CisgICAgYXV0byByZXN1bHQgPSBtQnVmZmVyU3RhdHVzUXVldWVzLmluc2VydCgKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKGlkLCBzdGQ6Om1vdmUocXVldWUpKSk7CisgICAgaWYgKCFyZXN1bHQuc2Vjb25kKSB7CisgICAgICAgICpmbXFEZXNjUHRyID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclN0YXR1c09ic2VydmVyOjpjbG9zZShDb25uZWN0aW9uSWQgaWQpIHsKKyAgICBpZiAobUJ1ZmZlclN0YXR1c1F1ZXVlcy5maW5kKGlkKSA9PSBtQnVmZmVyU3RhdHVzUXVldWVzLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBtQnVmZmVyU3RhdHVzUXVldWVzLmVyYXNlKGlkKTsKKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKK30KKwordm9pZCBCdWZmZXJTdGF0dXNPYnNlcnZlcjo6Z2V0QnVmZmVyU3RhdHVzQ2hhbmdlcyhzdGQ6OnZlY3RvcjxCdWZmZXJTdGF0dXNNZXNzYWdlPiAmbWVzc2FnZXMpIHsKKyAgICBmb3IgKGF1dG8gaXQgPSBtQnVmZmVyU3RhdHVzUXVldWVzLmJlZ2luKCk7IGl0ICE9IG1CdWZmZXJTdGF0dXNRdWV1ZXMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgQnVmZmVyU3RhdHVzTWVzc2FnZSBtZXNzYWdlOworICAgICAgICBzaXplX3QgYXZhaWwgPSBpdC0+c2Vjb25kLT5hdmFpbGFibGVUb1JlYWQoKTsKKyAgICAgICAgd2hpbGUgKGF2YWlsID4gMCkgeworICAgICAgICAgICAgaWYgKCFpdC0+c2Vjb25kLT5yZWFkKCZtZXNzYWdlLCAxKSkgeworICAgICAgICAgICAgICAgIC8vIFNpbmNlIGF2YWxpYWJsZSAjIG9mIHJlYWRzIGFyZSBhbHJlYWR5IGNvbmZpcm1lZCwKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nIChzcHVyaW91cyBjbGllbnQ/KQorICAgICAgICAgICAgICAgIEFMT0dXKCJGTVEgbWVzc2FnZSBjYW5ub3QgYmUgcmVhZCBmcm9tICVsbGQiLCAobG9uZyBsb25nKWl0LT5maXJzdCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVzc2FnZS5jb25uZWN0aW9uSWQgPSBpdC0+Zmlyc3Q7CisgICAgICAgICAgICBtZXNzYWdlcy5wdXNoX2JhY2sobWVzc2FnZSk7CisgICAgICAgICAgICAtLWF2YWlsOworICAgICAgICB9CisgICAgfQorfQorCitCdWZmZXJTdGF0dXNDaGFubmVsOjpCdWZmZXJTdGF0dXNDaGFubmVsKAorICAgICAgICBjb25zdCBTdGF0dXNEZXNjcmlwdG9yICZmbXFEZXNjKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c1F1ZXVlPiBxdWV1ZSA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlclN0YXR1c1F1ZXVlPihmbXFEZXNjKTsKKyAgICBpZiAoIXF1ZXVlIHx8IHF1ZXVlLT5pc1ZhbGlkKCkgPT0gZmFsc2UpIHsKKyAgICAgICAgbVZhbGlkID0gZmFsc2U7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVZhbGlkICA9IHRydWU7CisgICAgbUJ1ZmZlclN0YXR1c1F1ZXVlID0gc3RkOjptb3ZlKHF1ZXVlKTsKK30KKworYm9vbCBCdWZmZXJTdGF0dXNDaGFubmVsOjppc1ZhbGlkKCkgeworICAgIHJldHVybiBtVmFsaWQ7Cit9CisKK2Jvb2wgQnVmZmVyU3RhdHVzQ2hhbm5lbDo6bmVlZHNTeW5jKCkgeworICAgIGlmIChtVmFsaWQpIHsKKyAgICAgICAgc2l6ZV90IGF2YWlsID0gbUJ1ZmZlclN0YXR1c1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCk7CisgICAgICAgIHJldHVybiBhdmFpbCArIGtNaW5FbGVtZW50c1RvU3luY0luUXVldWUgPCBrTnVtRWxlbWVudHNJblF1ZXVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQnVmZmVyU3RhdHVzQ2hhbm5lbDo6cG9zdEJ1ZmZlclJlbGVhc2UoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBlbmRpbmcsIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBvc3RlZCkgeworICAgIGlmIChtVmFsaWQgJiYgcGVuZGluZy5zaXplKCkgPiAwKSB7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IG1CdWZmZXJTdGF0dXNRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpOworICAgICAgICBhdmFpbCA9IHN0ZDo6bWluKGF2YWlsLCBwZW5kaW5nLnNpemUoKSk7CisgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UgbWVzc2FnZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDAgOyBpIDwgYXZhaWw7ICsraSkgeworICAgICAgICAgICAgQnVmZmVySWQgaWQgPSBwZW5kaW5nLmZyb250KCk7CisgICAgICAgICAgICBtZXNzYWdlLm5ld1N0YXR1cyA9IEJ1ZmZlclN0YXR1czo6Tk9UX1VTRUQ7CisgICAgICAgICAgICBtZXNzYWdlLmJ1ZmZlcklkID0gaWQ7CisgICAgICAgICAgICBtZXNzYWdlLmNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIGlmICghbUJ1ZmZlclN0YXR1c1F1ZXVlLT53cml0ZSgmbWVzc2FnZSwgMSkpIHsKKyAgICAgICAgICAgICAgICAvLyBTaW5jZSBhdmFsaWFibGUgIyBvZiB3cml0ZXMgYXJlIGFscmVhZHkgY29uZmlybWVkLAorICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCisgICAgICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGluZz8KKyAgICAgICAgICAgICAgICBBTE9HVygiRk1RIG1lc3NhZ2UgY2Fubm90IGJlIHNlbnQgZnJvbSAlbGxkIiwgKGxvbmcgbG9uZyljb25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBlbmRpbmcucG9wX2Zyb250KCk7CisgICAgICAgICAgICBwb3N0ZWQucHVzaF9iYWNrKGlkKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBCdWZmZXJTdGF0dXNDaGFubmVsOjpwb3N0QnVmZmVySW52YWxpZGF0ZUFjaygKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgdWludDMyX3QgaW52YWxpZGF0ZUlkLAorICAgICAgICBib29sICppbnZhbGlkYXRlZCkgeworICAgIGlmIChtVmFsaWQgJiYgISppbnZhbGlkYXRlZCkgeworICAgICAgICBzaXplX3QgYXZhaWwgPSBtQnVmZmVyU3RhdHVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKTsKKyAgICAgICAgaWYgKGF2YWlsID4gMCkgeworICAgICAgICAgICAgQnVmZmVyU3RhdHVzTWVzc2FnZSBtZXNzYWdlOworICAgICAgICAgICAgbWVzc2FnZS5uZXdTdGF0dXMgPSBCdWZmZXJTdGF0dXM6OklOVkFMSURBVElPTl9BQ0s7CisgICAgICAgICAgICBtZXNzYWdlLmJ1ZmZlcklkID0gaW52YWxpZGF0ZUlkOworICAgICAgICAgICAgbWVzc2FnZS5jb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBpZiAoIW1CdWZmZXJTdGF0dXNRdWV1ZS0+d3JpdGUoJm1lc3NhZ2UsIDEpKSB7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgYXZhbGlhYmxlICMgb2Ygd3JpdGVzIGFyZSBhbHJlYWR5IGNvbmZpcm1lZCwKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRpbmc/CisgICAgICAgICAgICAgICAgQUxPR1coIkZNUSBtZXNzYWdlIGNhbm5vdCBiZSBzZW50IGZyb20gJWxsZCIsIChsb25nIGxvbmcpY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqaW52YWxpZGF0ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorfQorCitib29sIEJ1ZmZlclN0YXR1c0NoYW5uZWw6OnBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICBCdWZmZXJTdGF0dXMgc3RhdHVzLCBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBDb25uZWN0aW9uSWQgdGFyZ2V0SWQsCisgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBlbmRpbmcsIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBvc3RlZCkgeworICAgIGlmIChtVmFsaWQpIHsKKyAgICAgICAgc2l6ZV90IGF2YWlsID0gbUJ1ZmZlclN0YXR1c1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCk7CisgICAgICAgIHNpemVfdCBudW1QZW5kaW5nID0gcGVuZGluZy5zaXplKCk7CisgICAgICAgIGlmIChhdmFpbCA+PSBudW1QZW5kaW5nICsgMSkgeworICAgICAgICAgICAgQnVmZmVyU3RhdHVzTWVzc2FnZSByZWxlYXNlLCBtZXNzYWdlOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1QZW5kaW5nOyArK2kpIHsKKyAgICAgICAgICAgICAgICBCdWZmZXJJZCBpZCA9IHBlbmRpbmcuZnJvbnQoKTsKKyAgICAgICAgICAgICAgICByZWxlYXNlLm5ld1N0YXR1cyA9IEJ1ZmZlclN0YXR1czo6Tk9UX1VTRUQ7CisgICAgICAgICAgICAgICAgcmVsZWFzZS5idWZmZXJJZCA9IGlkOworICAgICAgICAgICAgICAgIHJlbGVhc2UuY29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgICAgIGlmICghbUJ1ZmZlclN0YXR1c1F1ZXVlLT53cml0ZSgmcmVsZWFzZSwgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgYXZhbGlhYmxlICMgb2Ygd3JpdGVzIGFyZSBhbHJlYWR5IGNvbmZpcm1lZCwKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmc/CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJGTVEgbWVzc2FnZSBjYW5ub3QgYmUgc2VudCBmcm9tICVsbGQiLCAobG9uZyBsb25nKWNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGVuZGluZy5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgICAgICBwb3N0ZWQucHVzaF9iYWNrKGlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCA9IHRyYW5zYWN0aW9uSWQ7CisgICAgICAgICAgICBtZXNzYWdlLmJ1ZmZlcklkID0gYnVmZmVySWQ7CisgICAgICAgICAgICBtZXNzYWdlLm5ld1N0YXR1cyA9IHN0YXR1czsKKyAgICAgICAgICAgIG1lc3NhZ2UuY29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgbWVzc2FnZS50YXJnZXRDb25uZWN0aW9uSWQgPSB0YXJnZXRJZDsKKyAgICAgICAgICAgIC8vIFRPRE8gOiB0aW1lc2F0YW1wCisgICAgICAgICAgICBtZXNzYWdlLnRpbWVzdGFtcFVzID0gMDsKKyAgICAgICAgICAgIGlmICghbUJ1ZmZlclN0YXR1c1F1ZXVlLT53cml0ZSgmbWVzc2FnZSwgMSkpIHsKKyAgICAgICAgICAgICAgICAvLyBTaW5jZSBhdmFsaWFibGUgIyBvZiB3cml0ZXMgYXJlIGFscmVhZHkgY29uZmlybWVkLAorICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCisgICAgICAgICAgICAgICAgQUxPR1coIkZNUSBtZXNzYWdlIGNhbm5vdCBiZSBzZW50IGZyb20gJWxsZCIsIChsb25nIGxvbmcpY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK0J1ZmZlckludmFsaWRhdGlvbkxpc3RlbmVyOjpCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lcigKKyAgICAgICAgY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvciAmZm1xRGVzYykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJJbnZhbGlkYXRpb25RdWV1ZT4gcXVldWUgPQorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJJbnZhbGlkYXRpb25RdWV1ZT4oZm1xRGVzYyk7CisgICAgaWYgKCFxdWV1ZSB8fCBxdWV1ZS0+aXNWYWxpZCgpID09IGZhbHNlKSB7CisgICAgICAgIG1WYWxpZCA9IGZhbHNlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1WYWxpZCAgPSB0cnVlOworICAgIG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZSA9IHN0ZDo6bW92ZShxdWV1ZSk7CisgICAgLy8gZHJhaW4gcHJldmlvdXMgbWVzc2FnZXMKKyAgICBzaXplX3QgYXZhaWwgPSBzdGQ6Om1pbigKKyAgICAgICAgICAgIG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZS0+YXZhaWxhYmxlVG9SZWFkKCksIChzaXplX3QpIGtOdW1FbGVtZW50c0luUXVldWUpOworICAgIHN0ZDo6dmVjdG9yPEJ1ZmZlckludmFsaWRhdGlvbk1lc3NhZ2U+IHRlbXAoYXZhaWwpOworICAgIGlmIChhdmFpbCA+IDApIHsKKyAgICAgICAgbUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlLT5yZWFkKHRlbXAuZGF0YSgpLCBhdmFpbCk7CisgICAgfQorfQorCit2b2lkIEJ1ZmZlckludmFsaWRhdGlvbkxpc3RlbmVyOjpnZXRJbnZhbGlkYXRpb25zKAorICAgICAgICBzdGQ6OnZlY3RvcjxCdWZmZXJJbnZhbGlkYXRpb25NZXNzYWdlPiAmbWVzc2FnZXMpIHsKKyAgICAvLyBUcnkgdHdpY2UgaW4gY2FzZSBvZiBvdmVyZmxvdy4KKyAgICAvLyBUT0RPOiBoYW5kbGluZyBvdmVyZmxvdyB0aG91Z2ggaXQgbWF5IG5vdCBoYXBwZW4uCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKKyAgICAgICAgc2l6ZV90IGF2YWlsID0gc3RkOjptaW4oCisgICAgICAgICAgICAgICAgbUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlLT5hdmFpbGFibGVUb1JlYWQoKSwgKHNpemVfdCkga051bUVsZW1lbnRzSW5RdWV1ZSk7CisgICAgICAgIGlmIChhdmFpbCA+IDApIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEJ1ZmZlckludmFsaWRhdGlvbk1lc3NhZ2U+IHRlbXAoYXZhaWwpOworICAgICAgICAgICAgaWYgKG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZS0+cmVhZCh0ZW1wLmRhdGEoKSwgYXZhaWwpKSB7CisgICAgICAgICAgICAgICAgbWVzc2FnZXMucmVzZXJ2ZShtZXNzYWdlcy5zaXplKCkgKyBhdmFpbCk7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gdGVtcC5iZWdpbigpOyBpdCAhPSB0ZW1wLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2hfYmFjaygqaXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lcjo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gbVZhbGlkOworfQorCitCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsOjpCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsKCkKKyAgICA6IG1WYWxpZCh0cnVlKSwKKyAgICAgIG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZSgKKyAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJJbnZhbGlkYXRpb25RdWV1ZT4oa051bUVsZW1lbnRzSW5RdWV1ZSwgdHJ1ZSkpIHsKKyAgICBpZiAoIW1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZSB8fCBtQnVmZmVySW52YWxpZGF0aW9uUXVldWUtPmlzVmFsaWQoKSA9PSBmYWxzZSkgeworICAgICAgICBtVmFsaWQgPSBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbDo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gbVZhbGlkOworfQorCit2b2lkIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWw6OmdldERlc2MoY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvciAqKmZtcURlc2NQdHIpIHsKKyAgICBpZiAobVZhbGlkKSB7CisgICAgICAgICpmbXFEZXNjUHRyID0gbUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlLT5nZXREZXNjKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmZtcURlc2NQdHIgPSBudWxscHRyOworICAgIH0KK30KKwordm9pZCBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsOjpwb3N0SW52YWxpZGF0aW9uKAorICAgICAgICB1aW50MzJfdCBtc2dJZCwgQnVmZmVySWQgZnJvbUlkLCBCdWZmZXJJZCB0b0lkKSB7CisgICAgQnVmZmVySW52YWxpZGF0aW9uTWVzc2FnZSBtZXNzYWdlOworCisgICAgbWVzc2FnZS5tZXNzYWdlSWQgPSBtc2dJZDsKKyAgICBtZXNzYWdlLmZyb21CdWZmZXJJZCA9IGZyb21JZDsKKyAgICBtZXNzYWdlLnRvQnVmZmVySWQgPSB0b0lkOworICAgIC8vIFRPRE86IGhhbmRsZSBmYWlsdXJlIChpdCBkb2VzIG5vdCBoYXBwZW4gbm9ybWFsbHkuKQorICAgIG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZS0+d3JpdGUoJm1lc3NhZ2UpOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclN0YXR1cy5oIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyU3RhdHVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmE2NTgzOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclN0YXR1cy5oCkBAIC0wLDAgKzEsMjMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9CVUZGRVJTVEFUVVNfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9CVUZGRVJTVEFUVVNfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGxpc3Q+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworLyoqIFJldHVybnMgbW9ub3RvbmljIHRpbWVzdGFtcCBpbiBVcyBzaW5jZSBmaXhlZCBwb2ludCBpbiB0aW1lLiAqLworaW50NjRfdCBnZXRUaW1lc3RhbXBOb3coKTsKKworYm9vbCBpc01lc3NhZ2VMYXRlcih1aW50MzJfdCBjdXJNc2dJZCwgdWludDMyX3QgcHJldk1zZ0lkKTsKKworYm9vbCBpc0J1ZmZlckluUmFuZ2UoQnVmZmVySWQgZnJvbSwgQnVmZmVySWQgdG8sIEJ1ZmZlcklkIGJ1ZmZlcklkKTsKKworLyoqCisgKiBBIGNvbGxlY3Rpb24gb2YgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIEZNUSBmb3IgYSBidWZmZXIgcG9vbC4gYnVmZmVyCisgKiBvd25lcnNoaXAvc3RhdHVzIGNoYW5nZSBtZXNzYWdlcyBhcmUgc2VudCB2aWEgdGhlIEZNUXMgZnJvbSB0aGUgY2xpZW50cy4KKyAqLworY2xhc3MgQnVmZmVyU3RhdHVzT2JzZXJ2ZXIgeworcHJpdmF0ZToKKyAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNRdWV1ZT4+CisgICAgICAgICAgICBtQnVmZmVyU3RhdHVzUXVldWVzOworCitwdWJsaWM6CisgICAgLyoqIENyZWF0ZXMgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgRk1RIGZvciB0aGUgc3BlY2lmaWVkCisgICAgICogY29ubmVjdGlvbihjbGllbnQpLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgY29ubmVjdGlvbiBJZCBvZiB0aGUgc3BlY2lmaWVkIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gZm1xRGVzY1B0ciAgICBkb3VibGUgcHRyIG9mIGNyZWF0ZWQgRk1RJ3MgZGVzY3JpcHRvci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgaWYgRk1RIGlzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBvcGVuKENvbm5lY3Rpb25JZCBpZCwgY29uc3QgU3RhdHVzRGVzY3JpcHRvcioqIGZtcURlc2NQdHIpOworCisgICAgLyoqIENsb3NlcyBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBGTVEgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAgKiBjb25uZWN0aW9uKGNsaWVudCkuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBjb25uZWN0aW9uIElkIG9mIHRoZSBzcGVjaWZpZWQgY2xpZW50LgorICAgICAqCisgICAgICogQHJldHVybiBPSyBpZiB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gaXMgY2xvc2VkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgY2xvc2UoQ29ubmVjdGlvbklkIGlkKTsKKworICAgIC8qKiBSZXRyaWV2ZXMgYWxsIHBlbmRpbmcgRk1RIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMgZnJvbSBjbGllbnRzLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2VzICByZXRyaWV2ZWQgcGVuZGluZyBtZXNzYWdlcy4KKyAgICAgKi8KKyAgICB2b2lkIGdldEJ1ZmZlclN0YXR1c0NoYW5nZXMoc3RkOjp2ZWN0b3I8QnVmZmVyU3RhdHVzTWVzc2FnZT4gJm1lc3NhZ2VzKTsKK307CisKKy8qKgorICogQSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgRk1RIGZvciBhIGJ1ZmZlciBwb29sIGNsaWVudC4gQnVmZmVyIG93bmVyc2hpcC9zdGF0dXMKKyAqIGNoYW5nZSBtZXNzYWdlcyBhcmUgc2VudCB2aWEgdGhlIGZtcSB0byB0aGUgYnVmZmVyIHBvb2wuCisgKi8KK2NsYXNzIEJ1ZmZlclN0YXR1c0NoYW5uZWwgeworcHJpdmF0ZToKKyAgICBib29sIG1WYWxpZDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzUXVldWU+IG1CdWZmZXJTdGF0dXNRdWV1ZTsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbm5lY3RzIHRvIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIEZNUSBmcm9tIGEgZGVzY3JpcHRvciBvZgorICAgICAqIHRoZSBjcmVhdGVkIEZNUS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbXFEZXNjICAgRGVzY3JpcHRvciBvZiB0aGUgY3JlYXRlZCBGTVEuCisgICAgICovCisgICAgQnVmZmVyU3RhdHVzQ2hhbm5lbChjb25zdCBTdGF0dXNEZXNjcmlwdG9yICZmbXFEZXNjKTsKKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIEZNUSBpcyBjb25uZWN0ZWQgc3VjY2Vzc2Z1bGx5LiAqLworICAgIGJvb2wgaXNWYWxpZCgpOworCisgICAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgRk1RIG5lZWRzIHRvIGJlIHN5bmNlZCBmcm9tIHRoZSBidWZmZXIgcG9vbCAqLworICAgIGJvb2wgbmVlZHNTeW5jKCk7CisKKyAgICAvKioKKyAgICAgKiBQb3N0cyBhIGJ1ZmZlciByZWxlYXNlIG1lc3NhZ2UgdG8gdGhlIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgY29ubmVjdGlvbiBJZCBvZiB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSBwZW5kaW5nICAgICAgIGN1cnJlbnRseSBwZW5kaW5nIGJ1ZmZlciByZWxlYXNlIG1lc3NhZ2VzLgorICAgICAqIEBwYXJhbSBwb3N0ZWQgICAgICAgIHBvc3RlZCBidWZmZXIgcmVsZWFzZSBtZXNzYWdlcy4KKyAgICAgKi8KKyAgICB2b2lkIHBvc3RCdWZmZXJSZWxlYXNlKAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBlbmRpbmcsIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBvc3RlZCk7CisKKyAgICAvKioKKyAgICAgKiBQb3N0cyBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSByZWdhcmRpbmcgdGhlIHNwZWNpZmllZCBidWZmZXIKKyAgICAgKiB0cmFuc2ZlciB0cmFuc2FjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbklkIElkIG9mIHRoZSBzcGVjaWZpZWQgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgYnVmZmVyIElkIG9mIHRoZSBzcGVjaWZpZWQgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIHN0YXR1cyAgICAgICAgbmV3IHN0YXR1cyBvZiB0aGUgYnVmZmVyLgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0SWQgICAgICBjb25uZWN0aW9uIElkIG9mIHRoZSByZWNlaXZlcihvbmx5IHdoZW4gdGhlIHNlbmRlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBvc3RzIGEgc3RhdHVzIG1lc3NhZ2UpLgorICAgICAqIEBwYXJhbSBwZW5kaW5nICAgICAgIGN1cnJlbnRseSBwZW5kaW5nIGJ1ZmZlciByZWxlYXNlIG1lc3NhZ2VzLgorICAgICAqIEBwYXJhbSBwb3N0ZWQgICAgICAgIHBvc3RlZCBidWZmZXIgcmVsZWFzZSBtZXNzYWdlcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHdoZW4gdGhlIHNwZWNpZmllZCBtZXNzYWdlIGlzIHBvc3RlZCwKKyAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2wgcG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIHRhcmdldElkLAorICAgICAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcGVuZGluZywgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcG9zdGVkKTsKKworICAgIC8qKgorICAgICAqIFBvc3RzIGEgYnVmZmVyIGludmFsaWFkYXRpb24gbWVzc2dlIHRvIHRoZSBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gaW52YWxpZGF0ZUlkICBpbnZhbGlkYXRpb24gYWNrIHRvIHRoZSBidWZmZXIgcG9vbC4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpZiBpbnZhbGlkYXRpb24gaWQgaXMgemVybywgdGhlIGFjayB3aWxsIG5vdCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBvc3RlZC4KKyAgICAgKiBAcGFyYW0gaW52YWxpZGF0ZWQgICBzZXRzIHtAY29kZSB0cnVlfSBvbmx5IHdoZW4gdGhlIGludmFsaWRhdGlvbiBhY2sgaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwb3N0ZWQuCisgICAgICovCisgICAgdm9pZCBwb3N0QnVmZmVySW52YWxpZGF0ZUFjaygKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICB1aW50MzJfdCBpbnZhbGlkYXRlSWQsCisgICAgICAgICAgICBib29sICppbnZhbGlkYXRlZCk7Cit9OworCisvKioKKyAqIEEgYnVmZmVyIGludmFsaWRhdGlvbiBGTVEgZm9yIGEgYnVmZmVyIHBvb2wgY2xpZW50LiBCdWZmZXIgaW52YWxpZGF0aW9uCisgKiBtZXNzYWdlcyBhcmUgcmVjZWl2ZWQgdmlhIHRoZSBmbXEgZnJvbSB0aGUgYnVmZmVyIHBvb2wuIEJ1ZmZlciBpbnZhbGlkYXRpb24KKyAqIG1lc3NhZ2VzIGFyZSBoYW5kbGVkIGFzIHNvb24gYXMgcG9zc2libGUuCisgKi8KK2NsYXNzIEJ1ZmZlckludmFsaWRhdGlvbkxpc3RlbmVyIHsKK3ByaXZhdGU6CisgICAgYm9vbCBtVmFsaWQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlckludmFsaWRhdGlvblF1ZXVlPiBtQnVmZmVySW52YWxpZGF0aW9uUXVldWU7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25uZWN0cyB0byBhIGJ1ZmZlciBpbnZhbGlkYXRpb24gRk1RIGZyb20gYSBkZXNjcmlwdG9yIG9mIHRoZSBjcmVhdGVkIEZNUS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbXFEZXNjICAgRGVzY3JpcHRvciBvZiB0aGUgY3JlYXRlZCBGTVEuCisgICAgICovCisgICAgQnVmZmVySW52YWxpZGF0aW9uTGlzdGVuZXIoY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvciAmZm1xRGVzYyk7CisKKyAgICAvKiogUmV0cmlldmVzIGFsbCBwZW5kaW5nIGJ1ZmZlciBpbnZhbGlkYXRpb24gbWVzc2FnZXMgZnJvbSB0aGUgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWVzc2FnZXMgIHJldHJpZXZlZCBwZW5kaW5nIG1lc3NhZ2VzLgorICAgICAqLworICAgIHZvaWQgZ2V0SW52YWxpZGF0aW9ucyhzdGQ6OnZlY3RvcjxCdWZmZXJJbnZhbGlkYXRpb25NZXNzYWdlPiAmbWVzc2FnZXMpOworCisgICAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgRk1RIGlzIGNvbm5lY3RlZCBzdWNjZXNmdWxseS4gKi8KKyAgICBib29sIGlzVmFsaWQoKTsKK307CisKKy8qKgorICogQSBidWZmZXIgaW52YWxpZGF0aW9uIEZNUSBmb3IgYSBidWZmZXIgcG9vbC4gQSBidWZmZXIgcG9vbCB3aWxsIHNlbmQgYnVmZmVyCisgKiBpbnZhbGlkYXRpb24gbWVzc2FnZXMgdG8gdGhlIGNsaWVudHMgdmlhIHRoZSBGTVEuIFRoZSBGTVEgaXMgc2hhcmVkIGFtb25nCisgKiBidWZmZXIgcG9vbCBjbGllbnRzLgorICovCitjbGFzcyBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsIHsKK3ByaXZhdGU6CisgICAgYm9vbCBtVmFsaWQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlckludmFsaWRhdGlvblF1ZXVlPiBtQnVmZmVySW52YWxpZGF0aW9uUXVldWU7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgYnVmZmVyIGludmFsaWRhdGlvbiBGTVEgZm9yIGEgYnVmZmVyIHBvb2wuCisgICAgICovCisgICAgQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbCgpOworCisgICAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgRk1RIGlzIGNvbm5lY3RlZCBzdWNjZXNmdWxseS4gKi8KKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgZGVzY3JpcHRvciBvZiBhIGJ1ZmZlciBpbnZhbGlkYXRpb24gRk1RLiB0aGUgZGVzY3JpcHRvciBtYXkKKyAgICAgKiBiZSBwYXNzZWQgdG8gdGhlIGNsaWVudCBmb3IgYnVmZmVyIGludmFsaWRhdGlvbiBoYW5kbGluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbXFEZXNjUHRyICAgIGRvdWJsZSBwdHIgb2YgY3JlYXRlZCBGTVEncyBkZXNjcmlwdG9yLgorICAgICAqLworICAgIHZvaWQgZ2V0RGVzYyhjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yICoqZm1xRGVzY1B0cik7CisKKyAgICAvKiogUG9zdHMgYSBidWZmZXIgaW52YWxpZGF0aW9uIGZvciBpbnZhbGlkYXRlZCBidWZmZXJzLgorICAgICAqCisgICAgICogQHBhcmFtIG1zZ0lkICAgICBJbnZhbGlkYXRpb24gbWVzc2FnZSBpZCB3aGljaCBpcyB1c2VkIHdoZW4gY2xpZW50cyBzZW5kCisgICAgICogICAgICAgICAgICAgICAgICBhY2tzIGJhY2sgdmlhIEJ1ZmZlclN0YXR1c01lc3NhZ2UKKyAgICAgKiBAcGFyYW0gZnJvbUlkICAgIFRoZSBzdGFydCBidWZmZXJpZCBvZiB0aGUgaW52YWxpZGF0ZWQgYnVmZmVycyhpbmNsdXNpdmUpCisgICAgICogQHBhcmFtIHRvSWQgICAgICBUaGUgZW5kIGJ1ZmZlcklkIG9mIHRoZSBpbnZhbGlkYXRlZCBidWZmZXJzKGluY2x1c2l2ZSkKKyAgICAgKi8KKyAgICB2b2lkIHBvc3RJbnZhbGlkYXRpb24odWludDMyX3QgbXNnSWQsIEJ1ZmZlcklkIGZyb21JZCwgQnVmZmVySWQgdG9JZCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQlVGRkVSU1RBVFVTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0NsaWVudE1hbmFnZXIuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQ2xpZW50TWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMxZDMxMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0NsaWVudE1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsNTM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbE1hbmFnZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgIkJ1ZmZlclBvb2xDbGllbnQuaCIKKyNpbmNsdWRlICJPYnNlcnZlci5oIgorI2luY2x1ZGUgIkFjY2Vzc29yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtSZWdpc3RlclRpbWVvdXRVcyA9IDUwMDAwMDsgLy8gMC41IHNlYworc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtDbGVhblVwRHVyYXRpb25VcyA9IDEwMDAwMDA7IC8vIFRPRE86IDEgc2VjIHR1bmUKK3N0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrQ2xpZW50VGltZW91dFVzID0gNTAwMDAwMDsgLy8gVE9ETzogNSBzZWNzIHR1bmUKKworLyoqCisgKiBUaGUgaG9sZGVyIG9mIHRoZSBjb29raWUgb2YgcmVtb3RlIElDbGllbnRNYW5hZ2VyLgorICogVGhlIGNvb2tpZSBpcyBwcm9jZXNzIGxvY2FsbHkgdW5pcXVlIGZvciBlYWNoIElDbGllbnRNYW5hZ2VyLgorICogKFRoZSBjb29raWUgaXMgdXNlZCB0byBub3RpZnkgZGVhdGggb2YgY2xpZW50cyB0byBidWZmZXJwb29sIHByb2Nlc3MuKQorICovCitjbGFzcyBDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgY29va2llIGhvbGRlciBmb3IgcmVtb3RlIElDbGllbnRNYW5hZ2VyKHMpLgorICAgICAqLworICAgIENsaWVudE1hbmFnZXJDb29raWVIb2xkZXIoKTsKKworICAgIC8qKgorICAgICAqIEdldHMgYSBjb29raWUgZm9yIGEgcmVtb3RlIElDbGllbnRNYW5hZ2VyLgorICAgICAqCisgICAgICogQHBhcmFtIG1hbmFnZXIgICB0aGUgc3BlY2lmaWVkIHJlbW90ZSBJQ2xpZW50TWFuYWdlci4KKyAgICAgKiBAcGFyYW0gYWRkZWQgICAgIHRydWUgd2hlbiB0aGUgc3BlY2lmaWVkIHJlbW90ZSBJQ2xpZW50TWFuYWdlciBpcyBhZGRlZAorICAgICAqICAgICAgICAgICAgICAgICAgbmV3bHksIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdGhlIHByb2Nlc3MgbG9jYWxseSB1bmlxdWUgY29va2llIGZvciB0aGUgc3BlY2lmaWVkIElDbGllbnRNYW5hZ2VyLgorICAgICAqLworICAgIHVpbnQ2NF90IGdldENvb2tpZShjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJm1hbmFnZXIsIGJvb2wgKmFkZGVkKTsKKworcHJpdmF0ZToKKyAgICB1aW50NjRfdCBtU2VxSWQ7CisgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICBzdGQ6Omxpc3Q8c3RkOjpwYWlyPGNvbnN0IHdwPElDbGllbnRNYW5hZ2VyPiwgdWludDY0X3Q+PiBtTWFuYWdlcnM7Cit9OworCitDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyOjpDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyKCkgOiBtU2VxSWQoMCl7fQorCit1aW50NjRfdCBDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyOjpnZXRDb29raWUoCisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmbWFuYWdlciwKKyAgICAgICAgYm9vbCAqYWRkZWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgZm9yIChhdXRvIGl0ID0gbU1hbmFnZXJzLmJlZ2luKCk7IGl0ICE9IG1NYW5hZ2Vycy5lbmQoKTspIHsKKyAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+IGtleSA9IGl0LT5maXJzdC5wcm9tb3RlKCk7CisgICAgICAgIGlmIChrZXkpIHsKKyAgICAgICAgICAgIGlmIChpbnRlcmZhY2VzRXF1YWwoa2V5LCBtYW5hZ2VyKSkgeworICAgICAgICAgICAgICAgICphZGRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGl0ID0gbU1hbmFnZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICB1aW50NjRfdCBpZCA9IG1TZXFJZCsrOworICAgICphZGRlZCA9IHRydWU7CisgICAgbU1hbmFnZXJzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihtYW5hZ2VyLCBpZCkpOworICAgIHJldHVybiBpZDsKK30KKworY2xhc3MgQ2xpZW50TWFuYWdlcjo6SW1wbCB7CitwdWJsaWM6CisgICAgSW1wbCgpOworCisgICAgLy8gQm5SZWdpc3RlclNlbmRlcgorICAgIFJlc3VsdFN0YXR1cyByZWdpc3RlclNlbmRlcihjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKTsKKworICAgIC8vIEJwUmVnaXN0ZXJTZW5kZXIKKyAgICBSZXN1bHRTdGF0dXMgcmVnaXN0ZXJTZW5kZXIoY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZyZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkIHNlbmRlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnJlY2VpdmVySWQpOworCisgICAgUmVzdWx0U3RhdHVzIGNyZWF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCk7CisKKyAgICBSZXN1bHRTdGF0dXMgY2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICBSZXN1bHRTdGF0dXMgZmx1c2goQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgUmVzdWx0U3RhdHVzIHJlY2VpdmUoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIFJlc3VsdFN0YXR1cyBwb3N0U2VuZChDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lc3RhbXBVcyk7CisKKyAgICBSZXN1bHRTdGF0dXMgZ2V0QWNjZXNzb3IoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SUFjY2Vzc29yPiAqYWNjZXNzb3IpOworCisgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSA9IGZhbHNlKTsKKworcHJpdmF0ZToKKyAgICAvLyBJbiBvcmRlciB0byBwcmV2ZW50IGRlYWRsb2NrIGJldHdlZW4gbXVsdGlwbGUgbG9ja3MsCisgICAgLy8gYWx3YXlzIGxvY2sgQ2xpZW50Q2FjaGUubG9jayBiZWZvcmUgbG9ja2luZyBBY3RpdmVDbGllbnRzLmxvY2suCisgICAgc3RydWN0IENsaWVudENhY2hlIHsKKyAgICAgICAgLy8gVGhpcyBsb2NrIGlzIGhlbGQgZm9yIGJyaWVmIGR1cmF0aW9uLgorICAgICAgICAvLyBCbG9ja2luZyBvcGVyYXRpb24gaXMgbm90IHBlcmZvcm1lZCB3aGlsZSBob2xkaW5nIHRoZSBsb2NrLgorICAgICAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6cGFpcjxjb25zdCB3cDxJQWNjZXNzb3I+LCBjb25zdCBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+Pj4KKyAgICAgICAgICAgICAgICBtQ2xpZW50czsKKyAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbUNvbm5lY3RDdjsKKyAgICAgICAgYm9vbCBtQ29ubmVjdGluZzsKKyAgICAgICAgaW50NjRfdCBtTGFzdENsZWFuVXBVczsKKworICAgICAgICBDbGllbnRDYWNoZSgpIDogbUNvbm5lY3RpbmcoZmFsc2UpLCBtTGFzdENsZWFuVXBVcyhnZXRUaW1lc3RhbXBOb3coKSkge30KKyAgICB9IG1DYWNoZTsKKworICAgIC8vIEFjdGl2ZSBjbGllbnRzIHdoaWNoIGNhbiBiZSByZXRyaWV2ZWQgdmlhIENvbm5lY3Rpb25JZAorICAgIHN0cnVjdCBBY3RpdmVDbGllbnRzIHsKKyAgICAgICAgLy8gVGhpcyBsb2NrIGlzIGhlbGQgZm9yIGJyaWVmIGR1cmF0aW9uLgorICAgICAgICAvLyBCbG9ja2luZyBvcGVyYXRpb24gaXMgbm90IHBlcmZvcm1lZCBob2xkaW5nIHRoZSBsb2NrLgorICAgICAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICAgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4+CisgICAgICAgICAgICAgICAgbUNsaWVudHM7CisgICAgfSBtQWN0aXZlOworCisgICAgc3A8T2JzZXJ2ZXI+IG1PYnNlcnZlcjsKKworICAgIENsaWVudE1hbmFnZXJDb29raWVIb2xkZXIgbVJlbW90ZUNsaWVudENvb2tpZXM7Cit9OworCitDbGllbnRNYW5hZ2VyOjpJbXBsOjpJbXBsKCkKKyAgICA6IG1PYnNlcnZlcihuZXcgT2JzZXJ2ZXIoKSkge30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OnJlZ2lzdGVyU2VuZGVyKAorICAgICAgICBjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3NvciwgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKSB7CisgICAgY2xlYW5VcCgpOworICAgIGludDY0X3QgdGltZW91dFVzID0gZ2V0VGltZXN0YW1wTm93KCkgKyBrUmVnaXN0ZXJUaW1lb3V0VXM7CisgICAgZG8geworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1NdXRleCk7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1DYWNoZS5tQ2xpZW50cy5iZWdpbigpOyBpdCAhPSBtQ2FjaGUubUNsaWVudHMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gc0FjY2Vzc29yID0gaXQtPmZpcnN0LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChzQWNjZXNzb3IgJiYgaW50ZXJmYWNlc0VxdWFsKHNBY2Nlc3NvciwgYWNjZXNzb3IpKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudCA9IGl0LT5zZWNvbmQubG9jaygpOworICAgICAgICAgICAgICAgIGlmIChjbGllbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICAgICAgICAgICAgICAqcENvbm5lY3Rpb25JZCA9IGNsaWVudC0+Z2V0Q29ubmVjdGlvbklkKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtQWN0aXZlLm1DbGllbnRzLmZpbmQoKnBDb25uZWN0aW9uSWQpICE9IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJyZWdpc3RlciBleGlzdGluZyBjb25uZWN0aW9uICVsbGQiLCAobG9uZyBsb25nKSpwQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkFMUkVBRFlfRVhJU1RTOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1DYWNoZS5tQ2xpZW50cy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtQ2FjaGUubUNvbm5lY3RpbmcpIHsKKyAgICAgICAgICAgIG1DYWNoZS5tQ29ubmVjdGluZyA9IHRydWU7CisgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgUmVzdWx0U3RhdHVzIHJlc3VsdCA9IFJlc3VsdFN0YXR1czo6T0s7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50ID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxCdWZmZXJQb29sQ2xpZW50PihhY2Nlc3NvciwgbU9ic2VydmVyKTsKKyAgICAgICAgICAgIGxvY2subG9jaygpOworICAgICAgICAgICAgaWYgKCFjbGllbnQpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWNsaWVudC0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IGhhbmRsZSBpbnNlcnQgZmFpbC4gKG1hbGxvYyBmYWlsKQorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudD4gd2NsaWVudCA9IGNsaWVudDsKKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNsaWVudHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGFjY2Vzc29yLCB3Y2xpZW50KSk7CisgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbklkID0gY2xpZW50LT5nZXRDb25uZWN0aW9uSWQoKTsKKyAgICAgICAgICAgICAgICBtT2JzZXJ2ZXItPmFkZENsaWVudChjb25JZCwgd2NsaWVudCk7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgICAgICAgICAgICAgIG1BY3RpdmUubUNsaWVudHMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbklkLCBjbGllbnQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKnBDb25uZWN0aW9uSWQgPSBjb25JZDsKKyAgICAgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXIgbmV3IGNvbm5lY3Rpb24gJWxsZCIsIChsb25nIGxvbmcpKnBDb25uZWN0aW9uSWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNhY2hlLm1Db25uZWN0aW5nID0gZmFsc2U7CisgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgbUNhY2hlLm1Db25uZWN0Q3Yubm90aWZ5X2FsbCgpOworICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgfQorICAgICAgICBtQ2FjaGUubUNvbm5lY3RDdi53YWl0X2ZvcigKKyAgICAgICAgICAgICAgICBsb2NrLCBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzKGtSZWdpc3RlclRpbWVvdXRVcykpOworICAgIH0gd2hpbGUgKGdldFRpbWVzdGFtcE5vdygpIDwgdGltZW91dFVzKTsKKyAgICAvLyBUT0RPOiByZXR1cm4gdGltZW91dCBlcnJvcgorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6cmVnaXN0ZXJTZW5kZXIoCisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmcmVjZWl2ZXIsCisgICAgICAgIENvbm5lY3Rpb25JZCBzZW5kZXJJZCwKKyAgICAgICAgQ29ubmVjdGlvbklkICpyZWNlaXZlcklkKSB7CisgICAgc3A8SUFjY2Vzc29yPiBhY2Nlc3NvcjsKKyAgICBib29sIGxvY2FsID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoc2VuZGVySWQpOworICAgICAgICBpZiAoaXQgPT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGl0LT5zZWNvbmQtPmdldEFjY2Vzc29yKCZhY2Nlc3Nvcik7CisgICAgICAgIGxvY2FsID0gaXQtPnNlY29uZC0+aXNMb2NhbCgpOworICAgIH0KKyAgICBSZXN1bHRTdGF0dXMgcnMgPSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIGlmIChhY2Nlc3NvcikgeworICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IHJlY2VpdmVyLT5yZWdpc3RlclNlbmRlcigKKyAgICAgICAgICAgICAgICBhY2Nlc3NvciwKKyAgICAgICAgICAgICAgICBbJnJzLCByZWNlaXZlcklkXSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGNvbm5lY3Rpb25JZCkgeworICAgICAgICAgICAgICAgICAgICBycyA9IHN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgKnJlY2VpdmVySWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICAgICAgfSBlbHNlIGlmIChsb2NhbCAmJiBycyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBzcDxDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ+IHJlY2lwaWVudCA9IEFjY2Vzc29yOjpnZXRDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQoKTsKKyAgICAgICAgICAgIGlmIChyZWNpcGllbnQpICB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNsaWVudCBkZWF0aCByZWNpcGllbnQgcmVnaXN0ZXJlZCAlbGxkIiwgKGxvbmcgbG9uZykqcmVjZWl2ZXJJZCk7CisgICAgICAgICAgICAgICAgYm9vbCBhZGRlZDsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBjb29raWUgPSBtUmVtb3RlQ2xpZW50Q29va2llcy5nZXRDb29raWUocmVjZWl2ZXIsICZhZGRlZCk7CisgICAgICAgICAgICAgICAgcmVjaXBpZW50LT5hZGRDb29raWVUb0Nvbm5lY3Rpb24oY29va2llLCAqcmVjZWl2ZXJJZCk7CisgICAgICAgICAgICAgICAgaWYgKGFkZGVkKSB7CisgICAgICAgICAgICAgICAgICAgIFJldHVybjxib29sPiB0cmFuc1Jlc3VsdCA9IHJlY2VpdmVyLT5saW5rVG9EZWF0aChyZWNpcGllbnQsIGNvb2tpZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByczsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OmNyZWF0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCkgeworICAgIGNvbnN0IHNwPEFjY2Vzc29yPiBhY2Nlc3NvciA9IG5ldyBBY2Nlc3NvcihhbGxvY2F0b3IpOworICAgIGlmICghYWNjZXNzb3IgfHwgIWFjY2Vzc29yLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIC8vIFRPRE86IG9ic2VydmVyIGlzIGxvY2FsLiB1c2UgZGlyZWN0IGNhbGwgaW5zdGVhZCBvZiBoaWRsIGNhbGwuCisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudCA9CisgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEJ1ZmZlclBvb2xDbGllbnQ+KGFjY2Vzc29yLCBtT2JzZXJ2ZXIpOworICAgIGlmICghY2xpZW50IHx8ICFjbGllbnQtPmlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgLy8gU2luY2UgYSBuZXcgYnVmZmVycG9vbCBpcyBjcmVhdGVkLCBldmljdCBtZW1vcmllcyB3aGljaCBhcmUgdXNlZCBieQorICAgIC8vIGV4aXN0aW5nIGJ1ZmZlcnBvb2xzIGFuZCBjbGllbnRzLgorICAgIGNsZWFuVXAodHJ1ZSk7CisgICAgeworICAgICAgICAvLyBUT0RPOiBoYW5kbGUgaW5zZXJ0IGZhaWwuIChtYWxsb2MgZmFpbCkKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1NdXRleCk7CisgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudD4gd2NsaWVudCA9IGNsaWVudDsKKyAgICAgICAgbUNhY2hlLm1DbGllbnRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhY2Nlc3Nvciwgd2NsaWVudCkpOworICAgICAgICBDb25uZWN0aW9uSWQgY29uSWQgPSBjbGllbnQtPmdldENvbm5lY3Rpb25JZCgpOworICAgICAgICBtT2JzZXJ2ZXItPmFkZENsaWVudChjb25JZCwgd2NsaWVudCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgICAgIG1BY3RpdmUubUNsaWVudHMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbklkLCBjbGllbnQpKTsKKyAgICAgICAgfQorICAgICAgICAqcENvbm5lY3Rpb25JZCA9IGNvbklkOworICAgICAgICBBTE9HVigiY3JlYXRlIG5ldyBjb25uZWN0aW9uICVsbGQiLCAobG9uZyBsb25nKSpwQ29ubmVjdGlvbklkKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrMShtQ2FjaGUubU11dGV4KTsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2syKG1BY3RpdmUubU11dGV4KTsKKyAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgaWYgKGl0ICE9IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgc3A8SUFjY2Vzc29yPiBhY2Nlc3NvcjsKKyAgICAgICAgaXQtPnNlY29uZC0+Z2V0QWNjZXNzb3IoJmFjY2Vzc29yKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsb3NpbmcgPSBpdC0+c2Vjb25kOworICAgICAgICBtQWN0aXZlLm1DbGllbnRzLmVyYXNlKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGZvciAoYXV0byBjaXQgPSBtQ2FjaGUubUNsaWVudHMuYmVnaW4oKTsgY2l0ICE9IG1DYWNoZS5tQ2xpZW50cy5lbmQoKTspIHsKKyAgICAgICAgICAgIC8vIGNsZWFuIHVwIGRlYWQgY2xpZW50IGNhY2hlcworICAgICAgICAgICAgc3A8SUFjY2Vzc29yPiBjQWNjZXNzb3IgPSBjaXQtPmZpcnN0LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmICghY0FjY2Vzc29yIHx8IChhY2Nlc3NvciAmJiBpbnRlcmZhY2VzRXF1YWwoY0FjY2Vzc29yLCBhY2Nlc3NvcikpKSB7CisgICAgICAgICAgICAgICAgY2l0ID0gbUNhY2hlLm1DbGllbnRzLmVyYXNlKGNpdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNpdCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGxvY2syLnVubG9jaygpOworICAgICAgICBsb2NrMS51bmxvY2soKTsKKyAgICAgICAgY2xvc2luZy0+Zmx1c2goKTsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OmZsdXNoKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudC0+Zmx1c2goKTsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OmFsbG9jYXRlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQ7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBpdC0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gY2xpZW50LT5hbGxvY2F0ZShwYXJhbXMsIGhhbmRsZSwgYnVmZmVyKTsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OnJlY2VpdmUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudDsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgICAgICBpZiAoaXQgPT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGNsaWVudCA9IGl0LT5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBjbGllbnQtPnJlY2VpdmUodHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIHRpbWVzdGFtcFVzLCBoYW5kbGUsIGJ1ZmZlcik7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpwb3N0U2VuZCgKKyAgICAgICAgQ29ubmVjdGlvbklkIHJlY2VpdmVySWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwgaW50NjRfdCAqdGltZXN0YW1wVXMpIHsKKyAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkID0gYnVmZmVyLT5tQ29ubmVjdGlvbklkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQ7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBpdC0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gY2xpZW50LT5wb3N0U2VuZChyZWNlaXZlcklkLCBidWZmZXIsIHRyYW5zYWN0aW9uSWQsIHRpbWVzdGFtcFVzKTsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OmdldEFjY2Vzc29yKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBzcDxJQWNjZXNzb3I+ICphY2Nlc3NvcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQ7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBpdC0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gY2xpZW50LT5nZXRBY2Nlc3NvcihhY2Nlc3Nvcik7Cit9CisKK3ZvaWQgQ2xpZW50TWFuYWdlcjo6SW1wbDo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpbnQ2NF90IG5vdyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgIGludDY0X3QgbGFzdFRyYW5zYWN0aW9uVXM7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sxKG1DYWNoZS5tTXV0ZXgpOworICAgIGlmIChjbGVhckNhY2hlIHx8IG1DYWNoZS5tTGFzdENsZWFuVXBVcyArIGtDbGVhblVwRHVyYXRpb25VcyA8IG5vdykgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jazIobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBpbnQgY2xlYW5lZCA9IDA7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuYmVnaW4oKTsgaXQgIT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKTspIHsKKyAgICAgICAgICAgIGlmICghaXQtPnNlY29uZC0+aXNBY3RpdmUoJmxhc3RUcmFuc2FjdGlvblVzLCBjbGVhckNhY2hlKSkgeworICAgICAgICAgICAgICAgIGlmIChsYXN0VHJhbnNhY3Rpb25VcyArIGtDbGllbnRUaW1lb3V0VXMgPCBub3cpIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8SUFjY2Vzc29yPiBhY2Nlc3NvcjsKKyAgICAgICAgICAgICAgICAgICAgaXQtPnNlY29uZC0+Z2V0QWNjZXNzb3IoJmFjY2Vzc29yKTsKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBtQWN0aXZlLm1DbGllbnRzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICAgICAgKytjbGVhbmVkOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2l0OworICAgICAgICB9CisgICAgICAgIGZvciAoYXV0byBjaXQgPSBtQ2FjaGUubUNsaWVudHMuYmVnaW4oKTsgY2l0ICE9IG1DYWNoZS5tQ2xpZW50cy5lbmQoKTspIHsKKyAgICAgICAgICAgIC8vIGNsZWFuIHVwIGRlYWQgY2xpZW50IGNhY2hlcworICAgICAgICAgICAgc3A8SUFjY2Vzc29yPiBjQWNjZXNzb3IgPSBjaXQtPmZpcnN0LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmICghY0FjY2Vzc29yKSB7CisgICAgICAgICAgICAgICAgY2l0ID0gbUNhY2hlLm1DbGllbnRzLmVyYXNlKGNpdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICsrY2l0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dWKCIjIG9mIGNsZWFuZWQgY29ubmVjdGlvbnM6ICVkIiwgY2xlYW5lZCk7CisgICAgICAgIG1DYWNoZS5tTGFzdENsZWFuVXBVcyA9IG5vdzsKKyAgICB9Cit9CisKKy8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUNsaWVudE1hbmFnZXIgZm9sbG93LgorUmV0dXJuPHZvaWQ+IENsaWVudE1hbmFnZXI6OnJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQWNjZXNzb3I+JiBidWZmZXJQb29sLCByZWdpc3RlclNlbmRlcl9jYiBfaGlkbF9jYikgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkID0gLTE7CisgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtSW1wbC0+cmVnaXN0ZXJTZW5kZXIoYnVmZmVyUG9vbCwgJmNvbm5lY3Rpb25JZCk7CisgICAgICAgIF9oaWRsX2NiKHN0YXR1cywgY29ubmVjdGlvbklkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfaGlkbF9jYihSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SLCAtMSk7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKKy8vIE1ldGhvZHMgZm9yIGxvY2FsIHVzZS4KK3NwPENsaWVudE1hbmFnZXI+IENsaWVudE1hbmFnZXI6OnNJbnN0YW5jZTsKK3N0ZDo6bXV0ZXggQ2xpZW50TWFuYWdlcjo6c0luc3RhbmNlTG9jazsKKworc3A8Q2xpZW50TWFuYWdlcj4gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soc0luc3RhbmNlTG9jayk7CisgICAgaWYgKCFzSW5zdGFuY2UpIHsKKyAgICAgICAgc0luc3RhbmNlID0gbmV3IENsaWVudE1hbmFnZXIoKTsKKyAgICB9CisgICAgQWNjZXNzb3I6OmNyZWF0ZUludmFsaWRhdG9yKCk7CisgICAgcmV0dXJuIHNJbnN0YW5jZTsKK30KKworQ2xpZW50TWFuYWdlcjo6Q2xpZW50TWFuYWdlcigpIDogbUltcGwobmV3IEltcGwoKSkge30KKworQ2xpZW50TWFuYWdlcjo6fkNsaWVudE1hbmFnZXIoKSB7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpjcmVhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5jcmVhdGUoYWxsb2NhdG9yLCBwQ29ubmVjdGlvbklkKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpyZWdpc3RlclNlbmRlcigKKyAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZyZWNlaXZlciwKKyAgICAgICAgQ29ubmVjdGlvbklkIHNlbmRlcklkLAorICAgICAgICBDb25uZWN0aW9uSWQgKnJlY2VpdmVySWQpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5yZWdpc3RlclNlbmRlcihyZWNlaXZlciwgc2VuZGVySWQsIHJlY2VpdmVySWQpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OmNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5jbG9zZShjb25uZWN0aW9uSWQpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OmZsdXNoKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5mbHVzaChjb25uZWN0aW9uSWQpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OmFsbG9jYXRlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmFsbG9jYXRlKGNvbm5lY3Rpb25JZCwgcGFyYW1zLCBoYW5kbGUsIGJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6cmVjZWl2ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5yZWNlaXZlKGNvbm5lY3Rpb25JZCwgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcywgaGFuZGxlLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OnBvc3RTZW5kKAorICAgICAgICBDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLCBpbnQ2NF90KiB0aW1lc3RhbXBVcykgeworICAgIGlmIChtSW1wbCAmJiBidWZmZXIpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5wb3N0U2VuZChyZWNlaXZlcklkLCBidWZmZXIsIHRyYW5zYWN0aW9uSWQsIHRpbWVzdGFtcFVzKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQ2xpZW50TWFuYWdlcjo6Y2xlYW5VcCgpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgbUltcGwtPmNsZWFuVXAodHJ1ZSk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9Db25uZWN0aW9uLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0Nvbm5lY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZDBjN2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9Db25uZWN0aW9uLmNwcApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJDb25uZWN0aW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQ29ubmVjdGlvbiBmb2xsb3cuCitSZXR1cm48dm9pZD4gQ29ubmVjdGlvbjo6ZmV0Y2godWludDY0X3QgdHJhbnNhY3Rpb25JZCwgdWludDMyX3QgYnVmZmVySWQsIGZldGNoX2NiIF9oaWRsX2NiKSB7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgaWYgKGJ1ZmZlcklkICE9IFNZTkNfQlVGRkVSSUQpIHsKKyAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1BY2Nlc3Nvci0+ZmV0Y2goCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCAmaGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIEJ1ZmZlciBidWZmZXIgPSB7fTsKKyAgICAgICAgICAgICAgICBidWZmZXIuaWQgPSBidWZmZXJJZDsKKyAgICAgICAgICAgICAgICBidWZmZXIuYnVmZmVyID0gaGFuZGxlOworICAgICAgICAgICAgICAgIF9oaWRsX2NiKHN0YXR1cywgYnVmZmVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUFjY2Vzc29yLT5jbGVhblVwKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEJ1ZmZlciBidWZmZXIgPSB7fTsKKyAgICBidWZmZXIuaWQgPSAwOworICAgIGJ1ZmZlci5idWZmZXIgPSBudWxscHRyOworCisgICAgX2hpZGxfY2Ioc3RhdHVzLCBidWZmZXIpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK0Nvbm5lY3Rpb246OkNvbm5lY3Rpb24oKSA6IG1Jbml0aWFsaXplZChmYWxzZSksIG1Db25uZWN0aW9uSWQoLTFMTCkge30KKworQ29ubmVjdGlvbjo6fkNvbm5lY3Rpb24oKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgbUFjY2Vzc29yLT5jbG9zZShtQ29ubmVjdGlvbklkKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29ubmVjdGlvbjo6aW5pdGlhbGl6ZSgKKyAgICAgICAgY29uc3Qgc3A8QWNjZXNzb3I+JiBhY2Nlc3NvciwgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIGlmICghbUluaXRpYWxpemVkKSB7CisgICAgICAgIG1BY2Nlc3NvciA9IGFjY2Vzc29yOworICAgICAgICBtQ29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KK30KKworUmVzdWx0U3RhdHVzIENvbm5lY3Rpb246OmZsdXNoKCkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQgJiYgbUFjY2Vzc29yKSB7CisgICAgICAgIHJldHVybiBtQWNjZXNzb3ItPmZsdXNoKCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ29ubmVjdGlvbjo6YWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgcmV0dXJuIG1BY2Nlc3Nvci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgcGFyYW1zLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQ29ubmVjdGlvbjo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpZiAobUluaXRpYWxpemVkICYmIG1BY2Nlc3NvcikgeworICAgICAgICBtQWNjZXNzb3ItPmNsZWFuVXAoY2xlYXJDYWNoZSk7CisgICAgfQorfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZSBmb2xsb3cuCisKKy8vSUNvbm5lY3Rpb24qIEhJRExfRkVUQ0hfSUNvbm5lY3Rpb24oY29uc3QgY2hhciogLyogbmFtZSAqLykgeworLy8gICAgcmV0dXJuIG5ldyBDb25uZWN0aW9uKCk7CisvL30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQ29ubmVjdGlvbi5oIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQ29ubmVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1MDc3NDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9Db25uZWN0aW9uLmgKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0NPTk5FQ1RJT05fSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9DT05ORUNUSU9OX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUNvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkFjY2Vzc29yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBDb25uZWN0aW9uIDogcHVibGljIElDb25uZWN0aW9uIHsKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklDb25uZWN0aW9uIGZvbGxvdy4KKyAgICBSZXR1cm48dm9pZD4gZmV0Y2godWludDY0X3QgdHJhbnNhY3Rpb25JZCwgdWludDMyX3QgYnVmZmVySWQsIGZldGNoX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIEludmFsaWRhdGVzIGFsbCBidWZmZXJzIHdoaWNoIGFyZSBhY3RpdmUgYW5kL29yIGFyZSByZWFkeSB0byBiZSByZWN5Y2xlZC4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgZmx1c2goKTsKKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlcyBhIGJ1ZmZlciB1c2luZyB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuIFJlY3ljbGVzIGEgYnVmZmVyIGlmCisgICAgICogaXQgaXMgcG9zc2libGUuIFRoZSByZXR1cm5lZCBidWZmZXIgY2FuIGJlIHRyYW5zZmVycmVkIHRvIG90aGVyIHJlbW90ZQorICAgICAqIGNsaWVudHMoQ29ubmVjdGlvbikuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgIElkIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgbmF0aXZlIGhhbmRsZSBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgaWYgYSBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgKmJ1ZmZlcklkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgLyoqCisgICAgICogUHJvY2Vzc2VzIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBhbmQgcGVyZm9ybXMgcGVyaW9kaWMgY2FjaGUgY2xlYW5pbmcKKyAgICAgKiBmcm9tIGJ1ZmZlcnBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY2xlYXJDYWNoZSAgICBpZiBjbGVhckNhY2hlIGlzIHRydWUsIGJ1ZmZlcnBvb2wgZnJlZXMgYWxsIGJ1ZmZlcnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3YWl0aW5nIHRvIGJlIHJlY3ljbGVkLgorICAgICAqLworICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUpOworCisgICAgLyoqIERlc3RydWN0cyBhIGNvbm5lY3Rpb24uICovCisgICAgfkNvbm5lY3Rpb24oKTsKKworICAgIC8qKiBDcmVhdGVzIGEgY29ubmVjdGlvbi4gKi8KKyAgICBDb25uZWN0aW9uKCk7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplcyB3aXRoIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHBvb2wgYW5kIHRoZSBjb25uZWN0aW9uIGlkLgorICAgICAqIFRoZSBjb25uZWN0aW9uIGlkIHNob3VsZCBiZSB1bmlxdWUgaW4gdGhlIHdob2xlIHN5c3RlbS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhY2Nlc3NvciAgICAgIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHBvb2wuCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgSWQuCisgICAgICovCisgICAgdm9pZCBpbml0aWFsaXplKGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgZW51bSA6IHVpbnQzMl90IHsKKyAgICAgICAgU1lOQ19CVUZGRVJJRCA9IFVJTlQzMl9NQVgsCisgICAgfTsKKworcHJpdmF0ZToKKyAgICBib29sIG1Jbml0aWFsaXplZDsKKyAgICBzcDxBY2Nlc3Nvcj4gbUFjY2Vzc29yOworICAgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0NPTk5FQ1RJT05fSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvT2JzZXJ2ZXIuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvT2JzZXJ2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMjMxNjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9PYnNlcnZlci5jcHAKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJPYnNlcnZlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK09ic2VydmVyOjpPYnNlcnZlcigpIHsKK30KKworT2JzZXJ2ZXI6On5PYnNlcnZlcigpIHsKK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJT2JzZXJ2ZXIgZm9sbG93LgorUmV0dXJuPHZvaWQ+IE9ic2VydmVyOjpvbk1lc3NhZ2UoaW50NjRfdCBjb25uZWN0aW9uSWQsIHVpbnQzMl90IG1zZ0lkKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBhdXRvIGl0ID0gbUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgIGlmIChpdCAhPSBtQ2xpZW50cy5lbmQoKSkgeworICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50ID0gaXQtPnNlY29uZC5sb2NrKCk7CisgICAgICAgIGlmICghY2xpZW50KSB7CisgICAgICAgICAgICBtQ2xpZW50cy5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgY2xpZW50LT5yZWNlaXZlSW52YWxpZGF0aW9uKG1zZ0lkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCit2b2lkIE9ic2VydmVyOjphZGRDbGllbnQoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+ICZ3Y2xpZW50KSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGZvciAoYXV0byBpdCA9IG1DbGllbnRzLmJlZ2luKCk7IGl0ICE9IG1DbGllbnRzLmVuZCgpOykgeworICAgICAgICBpZiAoIWl0LT5zZWNvbmQubG9jaygpIHx8IGl0LT5maXJzdCA9PSBjb25uZWN0aW9uSWQpIHsKKyAgICAgICAgICAgIGl0ID0gbUNsaWVudHMuZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBtQ2xpZW50cy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY29ubmVjdGlvbklkLCB3Y2xpZW50KSk7CisKK30KKwordm9pZCBPYnNlcnZlcjo6ZGVsQ2xpZW50KENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgbUNsaWVudHMuZXJhc2UoY29ubmVjdGlvbklkKTsKK30KKworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9PYnNlcnZlci5oIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvT2JzZXJ2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmJkN2MxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvT2JzZXJ2ZXIuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9PQlNFUlZFUl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX09CU0VSVkVSX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSU9ic2VydmVyLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgIkJ1ZmZlclBvb2xDbGllbnQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBPYnNlcnZlciA6IHB1YmxpYyBJT2JzZXJ2ZXIgeworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SU9ic2VydmVyIGZvbGxvdy4KKyAgICBSZXR1cm48dm9pZD4gb25NZXNzYWdlKGludDY0X3QgY29ubmVjdGlvbklkLCB1aW50MzJfdCBtc2dJZCkgb3ZlcnJpZGU7CisKKyAgICB+T2JzZXJ2ZXIoKTsKKworICAgIHZvaWQgYWRkQ2xpZW50KENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50PiAmd2NsaWVudCk7CisKKyAgICB2b2lkIGRlbENsaWVudChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworcHJpdmF0ZToKKyAgICBPYnNlcnZlcigpOworCisgICAgZnJpZW5kIHN0cnVjdCBDbGllbnRNYW5hZ2VyOworCisgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudD4+IG1DbGllbnRzOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX09CU0VSVkVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL2luY2x1ZGUvYnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL2luY2x1ZGUvYnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzkwNmNiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvaW5jbHVkZS9idWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oCkBAIC0wLDAgKzEsMTIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9CVUZGRVJQT09MVFlQRVNfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9CVUZGRVJQT09MVFlQRVNfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CisKK3N0cnVjdCBCdWZmZXJQb29sRGF0YSB7CisgICAgLy8gRm9yIGxvY2FsIHVzZSwgdG8gc3BlY2lmeSBhIGJ1ZmZlcnBvb2wgKGNsaWVudCBjb25uZWN0aW9uKSBmb3IgYnVmZmVycy4KKyAgICAvLyBSZXR1cm4gdmFsdWUgZnJvbSBjb25uZWN0I0lBY2Nlc3NvcihhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wKS4KKyAgICBpbnQ2NF90IG1Db25uZWN0aW9uSWQ7CisgICAgLy8gQnVmZmVySWQKKyAgICB1aW50MzJfdCBtSWQ7CisKKyAgICBCdWZmZXJQb29sRGF0YSgpIDogbUNvbm5lY3Rpb25JZCgwKSwgbUlkKDApIHt9CisKKyAgICBCdWZmZXJQb29sRGF0YSgKKyAgICAgICAgICAgIGludDY0X3QgY29ubmVjdGlvbklkLCB1aW50MzJfdCBpZCkKKyAgICAgICAgICAgIDogbUNvbm5lY3Rpb25JZChjb25uZWN0aW9uSWQpLCBtSWQoaWQpIHt9CisKKyAgICB+QnVmZmVyUG9vbERhdGEoKSB7fQorfTsKKworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmtVbnN5bmNocm9uaXplZFdyaXRlOworCit0eXBlZGVmIHVpbnQzMl90IEJ1ZmZlcklkOwordHlwZWRlZiB1aW50NjRfdCBUcmFuc2FjdGlvbklkOwordHlwZWRlZiBpbnQ2NF90IENvbm5lY3Rpb25JZDsKKworZW51bSA6IENvbm5lY3Rpb25JZCB7CisgICAgSU5WQUxJRF9DT05ORUNUSU9OSUQgPSAwLAorfTsKKwordHlwZWRlZiBhbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlPEJ1ZmZlclN0YXR1c01lc3NhZ2UsIGtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IEJ1ZmZlclN0YXR1c1F1ZXVlOwordHlwZWRlZiBCdWZmZXJTdGF0dXNRdWV1ZTo6RGVzY3JpcHRvciBTdGF0dXNEZXNjcmlwdG9yOworCit0eXBlZGVmIGFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU8QnVmZmVySW52YWxpZGF0aW9uTWVzc2FnZSwga1Vuc3luY2hyb25pemVkV3JpdGU+CisgICAgICAgIEJ1ZmZlckludmFsaWRhdGlvblF1ZXVlOwordHlwZWRlZiBCdWZmZXJJbnZhbGlkYXRpb25RdWV1ZTo6RGVzY3JpcHRvciBJbnZhbGlkYXRpb25EZXNjcmlwdG9yOworCisvKioKKyAqIEFsbG9jYXRpb24gd3JhcHBlciBjbGFzcyBmb3IgYnVmZmVyIHBvb2wuCisgKi8KK3N0cnVjdCBCdWZmZXJQb29sQWxsb2NhdGlvbiB7CisgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICptSGFuZGxlOworCisgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUoKSB7CisgICAgICAgIHJldHVybiBtSGFuZGxlOworICAgIH0KKworICAgIEJ1ZmZlclBvb2xBbGxvY2F0aW9uKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKSA6IG1IYW5kbGUoaGFuZGxlKSB7fQorCisgICAgfkJ1ZmZlclBvb2xBbGxvY2F0aW9uKCkge307Cit9OworCisvKioKKyAqIEFsbG9jYXRvciB3cmFwcGVyIGNsYXNzIGZvciBidWZmZXIgcG9vbC4KKyAqLworY2xhc3MgQnVmZmVyUG9vbEFsbG9jYXRvciB7CitwdWJsaWM6CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhbiBhbGxvY2F0aW9uKGJ1ZmZlcikgZm9yIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtcyAgICBhbGxvY2F0aW9uIHBhcmFtZXRlcnMKKyAgICAgKiBAcGFyYW0gYWxsb2MgICAgIGNyZWF0ZWQgYWxsb2NhdGlvbgorICAgICAqIEBwYXJhbSBhbGxvY1NpemUgc2l6ZSBvZiBjcmVhdGVkIGFsbG9jYXRpb24KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhbiBhbGxvY2F0aW9uIGlzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqLworICAgIHZpcnR1YWwgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gKmFsbG9jLAorICAgICAgICAgICAgc2l6ZV90ICphbGxvY1NpemUpID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBhbGxvY2F0aW9uIHBhcmFtZXRlcnMgb2YgYW4gb2xkIGFsbG9jYXRpb24gYXJlCisgICAgICogY29tcGF0aWJsZSB3aXRoIG5ldyBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICovCisgICAgdmlydHVhbCBib29sIGNvbXBhdGlibGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm5ld1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmb2xkUGFyYW1zKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICBCdWZmZXJQb29sQWxsb2NhdG9yKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCB+QnVmZmVyUG9vbEFsbG9jYXRvcigpID0gZGVmYXVsdDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9CVUZGRVJQT09MVFlQRVNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvaW5jbHVkZS9idWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL2luY2x1ZGUvYnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTUzYzMwNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL2luY2x1ZGUvYnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmgKQEAgLTAsMCArMSwxOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0NMSUVOVE1BTkFHRVJfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9DTElFTlRNQU5BR0VSX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUNsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgIkJ1ZmZlclBvb2xUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUFjY2Vzc29yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQ2xpZW50TWFuYWdlciA6IHB1YmxpYyBJQ2xpZW50TWFuYWdlciB7CisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQ2xpZW50TWFuYWdlciBmb2xsb3cuCisgICAgUmV0dXJuPHZvaWQ+IHJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQWNjZXNzb3I+JiBidWZmZXJQb29sLCByZWdpc3RlclNlbmRlcl9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICAvKiogR2V0cyBhbiBpbnN0YW5jZS4gKi8KKyAgICBzdGF0aWMgc3A8Q2xpZW50TWFuYWdlcj4gZ2V0SW5zdGFuY2UoKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBsb2NhbCBjb25uZWN0aW9uIHdpdGggYSBuZXdseSBjcmVhdGVkIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGFsbG9jYXRvciAgICAgZm9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbi4KKyAgICAgKiBAcGFyYW0gcENvbm5lY3Rpb25JZCBJZCBvZiB0aGUgY3JlYXRlZCBjb25uZWN0aW9uLiBUaGlzIGlzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgc3lzdGVtLXdpZGUgdW5pcXVlLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIHBvb2wgYW5kIGEgbG9jYWwgY29ubmVjdGlvbiBpcyBzdWNjZXNzZnVsbHkKKyAgICAgKiAgICAgICAgIGNyZWF0ZWQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNyZWF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCk7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIGNyZWF0ZWQgY29ubmVjdGlvbiBhcyBzZW5kZXIgZm9yIHJlbW90ZSBwcm9jZXNzLgorICAgICAqCisgICAgICogQHBhcmFtIHJlY2VpdmVyICAgICAgVGhlIHJlbW90ZSByZWNlaXZpbmcgcHJvY2Vzcy4KKyAgICAgKiBAcGFyYW0gc2VuZGVySWQgICAgICBBIGxvY2FsIGNvbm5lY3Rpb24gd2hpY2ggd2lsbCBzZW5kIGJ1ZmZlcnMgdG8uCisgICAgICogQHBhcmFtIHJlY2VpdmVySWQgICAgSWQgb2YgdGhlIGNyZWF0ZWQgcmVjZWl2aW5nIGNvbm5lY3Rpb24gb24gdGhlIHJlY2VpdmVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiB0aGUgcmVjZWl2aW5nIGNvbm5lY3Rpb24gaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgb24gdGhlCisgICAgICogICAgICAgICByZWNlaXZlciBwcm9jZXNzLgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNlbmRlciBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBBTFJFQURZX0VYSVNUUyB0aGUgcmVjZWl2aW5nIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBtYWRlLgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyByZWdpc3RlclNlbmRlcihjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJnJlY2VpdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgc2VuZGVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcmVjZWl2ZXJJZCk7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgVGhlIGlkIG9mIHRoZSBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC4KKyAgICAgKiAgICAgICAgIE5PVF9GT1VORCB3aGVuIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIC8qKgorICAgICAqIEV2aWN0cyBjYWNoZWQgYWxsb2NhdGlvbnMuIElmIGl0J3MgbG9jYWwgY29ubmVjdGlvbiwgcmVsZWFzZSB0aGUKKyAgICAgKiBwcmV2aW91cyBhbGxvY2F0aW9ucyBhbmQgZG8gbm90IHJlY3ljbGUgY3VycmVudCBhY3RpdmUgYWxsb2NhdGlvbnMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkIFRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyByZXNldHRlZC4KKyAgICAgKiAgICAgICAgIE5PVF9GT1VORCB3aGVuIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBmbHVzaChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlcyBhIGJ1ZmZlciBmcm9tIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIFRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgICAgICBUaGUgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgICAgIFRoZSBuYXRpdmUgaGFuZGxlIHRvIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLiBoYW5kbGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgY2xvbmVkIGJlZm9yZSB1c2UuCisgICAgICogQHBhcmFtIGJ1ZmZlciAgICAgICAgVGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgd2FzIGFsbG9jYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgLyoqCisgICAgICogUmVjZWl2ZXMgYSBidWZmZXIgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIFRoZSBpZCBvZiB0aGUgcmVjZWl2aW5nIGNvbm5lY3Rpb24uCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uSWQgVGhlIGlkIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgVGhlIGlkIGZvciB0aGUgYnVmZmVyLgorICAgICAqIEBwYXJhbSB0aW1lc3RhbXBVcyAgIFRoZSB0aW1lc3RhbXAgb2YgdGhlIGJ1ZmZlciBpcyBiZWluZyBzZW50LgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgICAgIFRoZSBuYXRpdmUgaGFuZGxlIHRvIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLiBoYW5kbGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgY2xvbmVkIGJlZm9yZSB1c2UuCisgICAgICogQHBhcmFtIGJ1ZmZlciAgICAgICAgVGhlIHJlY2VpdmVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciB3YXMgcmVjZWl2ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIHJlY2VpdmUoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICAvKioKKyAgICAgKiBQb3N0cyBhIGJ1ZmZlciB0cmFuc2ZlciB0cmFuc2FjdGlvbiB0byB0aGUgYnVmZmVyIHBvb2wuIFNlbmRzIGEgYnVmZmVyCisgICAgICogdG8gb3RoZXIgcmVtb3RlIGNsaWVudHMoY29ubmVjdGlvbikgYWZ0ZXIgdGhpcyBjYWxsIGhhcyBiZWVuIHN1Y2NlZWRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWNlaXZlcklkICAgIFRoZSBpZCBvZiB0aGUgcmVjZWl2aW5nIGNvbm5lY3Rpb24uCisgICAgICogQHBhcmFtIGJ1ZmZlciAgICAgICAgdG8gdHJhbnNmZXIKKyAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCBJZCBvZiB0aGUgdHJhbnNmZXIgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIHRpbWVzdGFtcFVzICAgVGhlIHRpbWVzdGFtcCBvZiB0aGUgYnVmZmVyIHRyYW5zYWN0aW9uIGlzIGJlaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcG9zdGVkLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIHRyYW5zYWN0aW9uIHdhcyBwb3N0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNlbmRpbmcgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBwb3N0U2VuZChDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lc3RhbXBVcyk7CisKKyAgICAvKioKKyAgICAgKiAgVGltZSBvdXQgaW5hY3RpdmUgbGluZ2VyaW5nIGNvbm5lY3Rpb25zIGFuZCBjbG9zZS4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFuVXAoKTsKKworICAgIC8qKiBEZXN0cnVjdHMgdGhlIG1hbmFnZXIgb2YgYnVmZmVyIHBvb2wgY2xpZW50cy4gICovCisgICAgfkNsaWVudE1hbmFnZXIoKTsKK3ByaXZhdGU6CisgICAgc3RhdGljIHNwPENsaWVudE1hbmFnZXI+IHNJbnN0YW5jZTsKKyAgICBzdGF0aWMgc3RkOjptdXRleCBzSW5zdGFuY2VMb2NrOworCisgICAgY2xhc3MgSW1wbDsKKyAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8SW1wbD4gbUltcGw7CisKKyAgICBDbGllbnRNYW5hZ2VyKCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQ0xJRU5UTUFOQUdFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjQ0ZjYxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlZ0c1ZuZGtIaWRsQnVmZmVycG9vbFYyXzBUYXJnZXRTaW5nbGVUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNIYWxUYXJnZXRUZXN0RGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJhbGxvY2F0b3IuY3BwIiwKKyAgICAgICAgInNpbmdsZS5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJmbXEiLAorICAgIF0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogImJvdGgiLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVnRzVm5ka0hpZGxCdWZmZXJwb29sVjJfMFRhcmdldE11bHRpVGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzSGFsVGFyZ2V0VGVzdERlZmF1bHRzIl0sCisgICAgc3JjczogWworICAgICAgICAiYWxsb2NhdG9yLmNwcCIsCisgICAgICAgICJtdWx0aS5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJmbXEiLAorICAgIF0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogImJvdGgiLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvT1dORVJTIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MzNlMGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9PV05FUlMKQEAgLTAsMCArMSw5IEBACisjIE1lZGlhIHRlYW0KK2xham9zQGdvb2dsZS5jb20KK3Bhd2luQGdvb2dsZS5jb20KK3Rha2xlZUBnb29nbGUuY29tCit3b25zaWtAZ29vZ2xlLmNvbQorCisjIFZUUyB0ZWFtCit5aW1AZ29vZ2xlLmNvbQoremh1b3lhb0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9hbGxvY2F0b3IuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvYWxsb2NhdG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDNmN2VhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvYWxsb2NhdG9yLmNwcApAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjdXRpbHMvYXNobWVtLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlICJhbGxvY2F0b3IuaCIKKwordW5pb24gUGFyYW1zIHsKKyAgc3RydWN0IHsKKyAgICB1aW50MzJfdCBjYXBhY2l0eTsKKyAgfSBkYXRhOworICB1aW50OF90IGFycmF5WzBdOworICBQYXJhbXMoKSA6IGRhdGF7MH0ge30KKyAgUGFyYW1zKHVpbnQzMl90IHNpemUpCisgICAgICA6IGRhdGF7c2l6ZX0ge30KK307CisKKworbmFtZXNwYWNlIHsKKworc3RydWN0IEhhbmRsZUFzaG1lbSA6IHB1YmxpYyBuYXRpdmVfaGFuZGxlX3QgeworICBIYW5kbGVBc2htZW0oaW50IGFzaG1lbUZkLCBzaXplX3Qgc2l6ZSkKKyAgICA6IG5hdGl2ZV9oYW5kbGVfdChjSGVhZGVyKSwKKyAgICBtRmRzeyBhc2htZW1GZCB9LAorICAgIG1JbnRzeyBpbnQgKHNpemUgJiAweEZGRkZGRkZGKSwgaW50KCh1aW50NjRfdChzaXplKSA+PiAzMikgJiAweEZGRkZGRkZGKSwga01hZ2ljIH0ge30KKworICBpbnQgYXNobWVtRmQoKSBjb25zdCB7IHJldHVybiBtRmRzLm1Bc2htZW07IH0KKyAgc2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIHNpemVfdCh1bnNpZ25lZChtSW50cy5tU2l6ZUxvKSkKKyAgICAgICAgfCBzaXplX3QodWludDY0X3QodW5zaWduZWQobUludHMubVNpemVIaSkpIDw8IDMyKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzVmFsaWQoY29uc3QgbmF0aXZlX2hhbmRsZV90ICogY29uc3Qgbyk7CisKK3Byb3RlY3RlZDoKKyAgc3RydWN0IHsKKyAgICBpbnQgbUFzaG1lbTsKKyAgfSBtRmRzOworICBzdHJ1Y3QgeworICAgIGludCBtU2l6ZUxvOworICAgIGludCBtU2l6ZUhpOworICAgIGludCBtTWFnaWM7CisgIH0gbUludHM7CisKK3ByaXZhdGU6CisgIGVudW0geworICAgIGtNYWdpYyA9ICdhaG1ceDAwJywKKyAgICBudW1GZHMgPSBzaXplb2YobUZkcykgLyBzaXplb2YoaW50KSwKKyAgICBudW1JbnRzID0gc2l6ZW9mKG1JbnRzKSAvIHNpemVvZihpbnQpLAorICAgIHZlcnNpb24gPSBzaXplb2YobmF0aXZlX2hhbmRsZV90KQorICB9OworICBjb25zdCBzdGF0aWMgbmF0aXZlX2hhbmRsZV90IGNIZWFkZXI7Cit9OworCitjb25zdCBuYXRpdmVfaGFuZGxlX3QgSGFuZGxlQXNobWVtOjpjSGVhZGVyID0geworICBIYW5kbGVBc2htZW06OnZlcnNpb24sCisgIEhhbmRsZUFzaG1lbTo6bnVtRmRzLAorICBIYW5kbGVBc2htZW06Om51bUludHMsCisgIHt9Cit9OworCitib29sIEhhbmRsZUFzaG1lbTo6aXNWYWxpZChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKiBjb25zdCBvKSB7CisgIGlmICghbyB8fCBtZW1jbXAobywgJmNIZWFkZXIsIHNpemVvZihjSGVhZGVyKSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSGFuZGxlQXNobWVtICpvdGhlciA9IHN0YXRpY19jYXN0PGNvbnN0IEhhbmRsZUFzaG1lbSo+KG8pOworICByZXR1cm4gb3RoZXItPm1JbnRzLm1NYWdpYyA9PSBrTWFnaWM7Cit9CisKK2NsYXNzIEFsbG9jYXRpb25Bc2htZW0geworcHJpdmF0ZToKKyAgQWxsb2NhdGlvbkFzaG1lbShpbnQgYXNobWVtRmQsIHNpemVfdCBjYXBhY2l0eSwgYm9vbCByZXMpCisgICAgOiBtSGFuZGxlKGFzaG1lbUZkLCBjYXBhY2l0eSksCisgICAgICBtSW5pdChyZXMpIHt9CisKK3B1YmxpYzoKKyAgc3RhdGljIEFsbG9jYXRpb25Bc2htZW0gKkFsbG9jKHNpemVfdCBzaXplKSB7CisgICAgY29uc3RleHByIHN0YXRpYyBjb25zdCBjaGFyICprQWxsb2NhdGlvblRhZyA9ICJidWZmZXJwb29sX3Rlc3QiOworICAgIGludCBhc2htZW1GZCA9IGFzaG1lbV9jcmVhdGVfcmVnaW9uKGtBbGxvY2F0aW9uVGFnLCBzaXplKTsKKyAgICByZXR1cm4gbmV3IEFsbG9jYXRpb25Bc2htZW0oYXNobWVtRmQsIHNpemUsIGFzaG1lbUZkID49IDApOworICB9CisKKyAgfkFsbG9jYXRpb25Bc2htZW0oKSB7CisgICAgaWYgKG1Jbml0KSB7CisgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKCZtSGFuZGxlKTsKKyAgICB9CisgIH0KKworICBjb25zdCBIYW5kbGVBc2htZW0gKmhhbmRsZSgpIHsKKyAgICByZXR1cm4gJm1IYW5kbGU7CisgIH0KKworcHJpdmF0ZToKKyAgSGFuZGxlQXNobWVtIG1IYW5kbGU7CisgIGJvb2wgbUluaXQ7CisgIC8vIFRPRE86IG1hcHBpbmcgYW5kIG1hcCBmZAorfTsKKworc3RydWN0IEFsbG9jYXRpb25EdG9yIHsKKyAgQWxsb2NhdGlvbkR0b3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFsbG9jYXRpb25Bc2htZW0+ICZhbGxvYykKKyAgICAgIDogbUFsbG9jKGFsbG9jKSB7fQorCisgIHZvaWQgb3BlcmF0b3IoKShCdWZmZXJQb29sQWxsb2NhdGlvbiAqcG9vbEFsbG9jKSB7IGRlbGV0ZSBwb29sQWxsb2M7IH0KKworICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWxsb2NhdGlvbkFzaG1lbT4gbUFsbG9jOworfTsKKworfQorCisKK1Jlc3VsdFN0YXR1cyBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6YWxsb2NhdGUoCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICphbGxvYywKKyAgICBzaXplX3QgKmFsbG9jU2l6ZSkgeworICBQYXJhbXMgYXNobWVtUGFyYW1zOworICBtZW1jcHkoJmFzaG1lbVBhcmFtcywgcGFyYW1zLmRhdGEoKSwgc3RkOjptaW4oc2l6ZW9mKFBhcmFtcyksIHBhcmFtcy5zaXplKCkpKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8QWxsb2NhdGlvbkFzaG1lbT4gYXNobWVtQWxsb2MgPQorICAgICAgc3RkOjpzaGFyZWRfcHRyPEFsbG9jYXRpb25Bc2htZW0+KAorICAgICAgICAgIEFsbG9jYXRpb25Bc2htZW06OkFsbG9jKGFzaG1lbVBhcmFtcy5kYXRhLmNhcGFjaXR5KSk7CisgIGlmIChhc2htZW1BbGxvYykgeworICAgIEJ1ZmZlclBvb2xBbGxvY2F0aW9uICpwdHIgPSBuZXcgQnVmZmVyUG9vbEFsbG9jYXRpb24oYXNobWVtQWxsb2MtPmhhbmRsZSgpKTsKKyAgICBpZiAocHRyKSB7CisgICAgICAqYWxsb2MgPSBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+KHB0ciwgQWxsb2NhdGlvbkR0b3IoYXNobWVtQWxsb2MpKTsKKyAgICAgIGlmICgqYWxsb2MpIHsKKyAgICAgICAgICAqYWxsb2NTaXplID0gYXNobWVtUGFyYW1zLmRhdGEuY2FwYWNpdHk7CisgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgICB9CisgICAgICBkZWxldGUgcHRyOworICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgIH0KKyAgfQorICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworYm9vbCBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6Y29tcGF0aWJsZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmbmV3UGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZvbGRQYXJhbXMpIHsKKyAgc2l6ZV90IG5ld1NpemUgPSBuZXdQYXJhbXMuc2l6ZSgpOworICBzaXplX3Qgb2xkU2l6ZSA9IG9sZFBhcmFtcy5zaXplKCk7CisgIGlmIChuZXdTaXplID09IG9sZFNpemUpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5ld1NpemU7ICsraSkgeworICAgICAgaWYgKG5ld1BhcmFtc1tpXSAhPSBvbGRQYXJhbXNbaV0pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OkZpbGwoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmFsKSB7CisgIGlmICghSGFuZGxlQXNobWVtOjppc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSGFuZGxlQXNobWVtICpvID0gc3RhdGljX2Nhc3Q8Y29uc3QgSGFuZGxlQXNobWVtKj4oaGFuZGxlKTsKKyAgdW5zaWduZWQgY2hhciAqcHRyID0gKHVuc2lnbmVkIGNoYXIgKiltbWFwKAorICAgICAgTlVMTCwgby0+c2l6ZSgpLCBQUk9UX1JFQUR8UFJPVF9XUklURSwgTUFQX1NIQVJFRCwgby0+YXNobWVtRmQoKSwgMCk7CisKKyAgaWYgKHB0ciAhPSBNQVBfRkFJTEVEKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvLT5zaXplKCk7ICsraSkgeworICAgICAgcHRyW2ldID0gdmFsOworICAgIH0KKyAgICBtdW5tYXAocHRyLCBvLT5zaXplKCkpOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6VmVyaWZ5KGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLCBjb25zdCB1bnNpZ25lZCBjaGFyIHZhbCkgeworICBpZiAoIUhhbmRsZUFzaG1lbTo6aXNWYWxpZChoYW5kbGUpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEhhbmRsZUFzaG1lbSAqbyA9IHN0YXRpY19jYXN0PGNvbnN0IEhhbmRsZUFzaG1lbSo+KGhhbmRsZSk7CisgIHVuc2lnbmVkIGNoYXIgKnB0ciA9ICh1bnNpZ25lZCBjaGFyICopbW1hcCgKKyAgICAgIE5VTEwsIG8tPnNpemUoKSwgUFJPVF9SRUFELCBNQVBfU0hBUkVELCBvLT5hc2htZW1GZCgpLCAwKTsKKworICBpZiAocHRyICE9IE1BUF9GQUlMRUQpIHsKKyAgICBib29sIHJlcyA9IHRydWU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvLT5zaXplKCk7ICsraSkgeworICAgICAgaWYgKHB0cltpXSAhPSB2YWwpIHsKKyAgICAgICAgcmVzID0gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBtdW5tYXAocHRyLCBvLT5zaXplKCkpOworICAgIHJldHVybiByZXM7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoc3RkOjp2ZWN0b3I8dWludDhfdD4gKnBhcmFtcykgeworICBjb25zdGV4cHIgc3RhdGljIGludCBrQWxsb2NhdGlvblNpemUgPSAxMDI0ICogMTA7CisgIFBhcmFtcyBhc2htZW1QYXJhbXMoa0FsbG9jYXRpb25TaXplKTsKKworICBwYXJhbXMtPmFzc2lnbihhc2htZW1QYXJhbXMuYXJyYXksIGFzaG1lbVBhcmFtcy5hcnJheSArIHNpemVvZihhc2htZW1QYXJhbXMpKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL2FsbG9jYXRvci5oIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvYWxsb2NhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI4MWRjMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL2FsbG9jYXRvci5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFZOREtfSElETF9CVUZGRVJQT09MX1YyXzBfQUxMT0NBVE9SX0gKKyNkZWZpbmUgVk5ES19ISURMX0JVRkZFUlBPT0xfVjJfMF9BTExPQ0FUT1JfSAorCisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjoKKyAgICBCdWZmZXJQb29sQWxsb2NhdGlvbjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OgorICAgIEJ1ZmZlclBvb2xBbGxvY2F0b3I7CisKKy8vIGJ1ZmZlciBhbGxvY2F0b3IgZm9yIHRoZSB0ZXN0cworY2xhc3MgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3IgOiBwdWJsaWMgQnVmZmVyUG9vbEFsbG9jYXRvciB7CisgcHVibGljOgorICBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcigpIHt9CisKKyAgflRlc3RCdWZmZXJQb29sQWxsb2NhdG9yKCkgb3ZlcnJpZGUge30KKworICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gKmFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICphbGxvY1NpemUpIG92ZXJyaWRlOworCisgIGJvb2wgY29tcGF0aWJsZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmbmV3UGFyYW1zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm9sZFBhcmFtcykgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgRmlsbChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwgY29uc3QgdW5zaWduZWQgY2hhciB2YWwpOworCisgIHN0YXRpYyBib29sIFZlcmlmeShjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwgY29uc3QgdW5zaWduZWQgY2hhciB2YWwpOworCit9OworCisvLyByZXRyaWV2ZSBidWZmZXIgYWxsb2NhdG9yIHBhcmFtdGVycwordm9pZCBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpwYXJhbXMpOworCisjZW5kaWYgIC8vIFZOREtfSElETF9CVUZGRVJQT09MX1YyXzBfQUxMT0NBVE9SX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL211bHRpLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL211bHRpLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGI2OTkyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvbXVsdGkuY3BwCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJidWZmZmVycG9vbF91bml0X3Rlc3QiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL0xlZ2FjeVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJhbGxvY2F0b3IuaCIKKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2w7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklDbGllbnRNYW5hZ2VyOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpCdWZmZXJJZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkNsaWVudE1hbmFnZXI7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpDb25uZWN0aW9uSWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpUcmFuc2FjdGlvbklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpCdWZmZXJQb29sRGF0YTsKKworbmFtZXNwYWNlIHsKKworLy8gY29tbXVuaWNhdGlvbiBtZXNzYWdlIHR5cGVzIGJldHdlZW4gcHJvY2Vzc2VzLgorZW51bSBQaXBlQ29tbWFuZCA6IGludDMyX3QgeworICAgIElOSVRfT0sgPSAwLAorICAgIElOSVRfRVJST1IsCisgICAgU0VORCwKKyAgICBSRUNFSVZFX09LLAorICAgIFJFQ0VJVkVfRVJST1IsCit9OworCisvLyBjb21tdW5pY2F0aW9uIG1lc3NhZ2UgYmV0d2VlbiBwcm9jZXNzZXMuCit1bmlvbiBQaXBlTWVzc2FnZSB7CisgICAgc3RydWN0ICB7CisgICAgICAgIGludDMyX3QgY29tbWFuZDsKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQ7CisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQ7CisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZDsKKyAgICAgICAgaW50NjRfdCAgdGltZXN0YW1wVXM7CisgICAgfSBkYXRhOworICAgIGNoYXIgYXJyYXlbMF07Cit9OworCisvLyBtZWRpYS5idWZmZXJwb29sIHRlc3Qgc2V0dXAKK2NsYXNzIEJ1ZmZlcnBvb2xNdWx0aVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICAgIG1SZWNlaXZlclBpZCA9IC0xOworICAgIG1Db25uZWN0aW9uVmFsaWQgPSBmYWxzZTsKKworICAgIEFTU0VSVF9UUlVFKHBpcGUobUNvbW1hbmRQaXBlRmRzKSA9PSAwKTsKKyAgICBBU1NFUlRfVFJVRShwaXBlKG1SZXN1bHRQaXBlRmRzKSA9PSAwKTsKKworICAgIG1SZWNlaXZlclBpZCA9IGZvcmsoKTsKKyAgICBBU1NFUlRfVFJVRShtUmVjZWl2ZXJQaWQgPj0gMCk7CisKKyAgICBpZiAobVJlY2VpdmVyUGlkID09IDApIHsKKyAgICAgIGRvUmVjZWl2ZXIoKTsKKyAgICAgIC8vIEluIG9yZGVyIHRvIGlnbm9yZSBndGVzdCBiZWhhdmlvdXIsIHdhaXQgZm9yIGJlaW5nIGtpbGxlZCBmcm9tCisgICAgICAvLyB0ZWFyRG93bgorICAgICAgcGF1c2UoKTsKKyAgICB9CisKKyAgICBtTWFuYWdlciA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgQVNTRVJUX05FKG1NYW5hZ2VyLCBudWxscHRyKTsKKworICAgIG1BbGxvY2F0b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yPigpOworICAgIEFTU0VSVF9UUlVFKChib29sKW1BbGxvY2F0b3IpOworCisgICAgc3RhdHVzID0gbU1hbmFnZXItPmNyZWF0ZShtQWxsb2NhdG9yLCAmbUNvbm5lY3Rpb25JZCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICAgIG1Db25uZWN0aW9uVmFsaWQgPSB0cnVlOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgIGlmIChtUmVjZWl2ZXJQaWQgPiAwKSB7CisgICAgICBraWxsKG1SZWNlaXZlclBpZCwgU0lHS0lMTCk7CisgICAgICBpbnQgd3N0YXR1czsKKyAgICAgIHdhaXQoJndzdGF0dXMpOworICAgIH0KKworICAgIGlmIChtQ29ubmVjdGlvblZhbGlkKSB7CisgICAgICBtTWFuYWdlci0+Y2xvc2UobUNvbm5lY3Rpb25JZCk7CisgICAgfQorICB9CisKKyBwcm90ZWN0ZWQ6CisgIHN0YXRpYyB2b2lkIGRlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdGlvbikgeworICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgfQorCisgIGFuZHJvaWQ6OnNwPENsaWVudE1hbmFnZXI+IG1NYW5hZ2VyOworICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKyAgYm9vbCBtQ29ubmVjdGlvblZhbGlkOworICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKKyAgcGlkX3QgbVJlY2VpdmVyUGlkOworICBpbnQgbUNvbW1hbmRQaXBlRmRzWzJdOworICBpbnQgbVJlc3VsdFBpcGVGZHNbMl07CisKKyAgYm9vbCBzZW5kTWVzc2FnZShpbnQgKnBpcGVzLCBjb25zdCBQaXBlTWVzc2FnZSAmbWVzc2FnZSkgeworICAgIGludCByZXQgPSB3cml0ZShwaXBlc1sxXSwgbWVzc2FnZS5hcnJheSwgc2l6ZW9mKFBpcGVNZXNzYWdlKSk7CisgICAgcmV0dXJuIHJldCA9PSBzaXplb2YoUGlwZU1lc3NhZ2UpOworICB9CisKKyAgYm9vbCByZWNlaXZlTWVzc2FnZShpbnQgKnBpcGVzLCBQaXBlTWVzc2FnZSAqbWVzc2FnZSkgeworICAgIGludCByZXQgPSByZWFkKHBpcGVzWzBdLCBtZXNzYWdlLT5hcnJheSwgc2l6ZW9mKFBpcGVNZXNzYWdlKSk7CisgICAgcmV0dXJuIHJldCA9PSBzaXplb2YoUGlwZU1lc3NhZ2UpOworICB9CisKKyAgdm9pZCBkb1JlY2VpdmVyKCkgeworICAgIGNvbmZpZ3VyZVJwY1RocmVhZHBvb2woMSwgZmFsc2UpOworICAgIFBpcGVNZXNzYWdlIG1lc3NhZ2U7CisgICAgbU1hbmFnZXIgPSBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworICAgIGlmICghbU1hbmFnZXIpIHsKKyAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OklOSVRfRVJST1I7CisgICAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGFuZHJvaWQ6OnN0YXR1c190IHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWdpc3RlckFzU2VydmljZSgpOworICAgIGlmIChzdGF0dXMgIT0gYW5kcm9pZDo6T0spIHsKKyAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OklOSVRfRVJST1I7CisgICAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OklOSVRfT0s7CisgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworCisgICAgcmVjZWl2ZU1lc3NhZ2UobUNvbW1hbmRQaXBlRmRzLCAmbWVzc2FnZSk7CisgICAgeworICAgICAgbmF0aXZlX2hhbmRsZV90ICpyaGFuZGxlID0gbnVsbHB0cjsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gcmJ1ZmZlcjsKKyAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtTWFuYWdlci0+cmVjZWl2ZSgKKyAgICAgICAgICBtZXNzYWdlLmRhdGEuY29ubmVjdGlvbklkLCBtZXNzYWdlLmRhdGEudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICBtZXNzYWdlLmRhdGEuYnVmZmVySWQsIG1lc3NhZ2UuZGF0YS50aW1lc3RhbXBVcywgJnJoYW5kbGUsICZyYnVmZmVyKTsKKyAgICAgIG1NYW5hZ2VyLT5jbG9zZShtZXNzYWdlLmRhdGEuY29ubmVjdGlvbklkKTsKKyAgICAgIGlmIChzdGF0dXMgIT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICBpZiAoIVRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpWZXJpZnkocmhhbmRsZSwgMHg3NykpIHsKKyAgICAgICAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpSRUNFSVZFX0VSUk9SOworICAgICAgICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6UkVDRUlWRV9PSzsKKyAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgIH0KK307CisKKy8vIEJ1ZmZlciB0cmFuc2ZlciB0ZXN0IGJldHdlZW4gcHJvY2Vzc2VzLgorVEVTVF9GKEJ1ZmZlcnBvb2xNdWx0aVRlc3QsIFRyYW5zZmVyQnVmZmVyKSB7CisgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgIFBpcGVNZXNzYWdlIG1lc3NhZ2U7CisKKyAgQVNTRVJUX1RSVUUocmVjZWl2ZU1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsICZtZXNzYWdlKSk7CisKKyAgYW5kcm9pZDo6c3A8SUNsaWVudE1hbmFnZXI+IHJlY2VpdmVyID0gSUNsaWVudE1hbmFnZXI6OmdldFNlcnZpY2UoKTsKKyAgQ29ubmVjdGlvbklkIHJlY2VpdmVySWQ7CisgIEFTU0VSVF9UUlVFKChib29sKXJlY2VpdmVyKTsKKworICBzdGF0dXMgPSBtTWFuYWdlci0+cmVnaXN0ZXJTZW5kZXIocmVjZWl2ZXIsIG1Db25uZWN0aW9uSWQsICZyZWNlaXZlcklkKTsKKyAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICB7CisgICAgbmF0aXZlX2hhbmRsZV90ICpzaGFuZGxlID0gbnVsbHB0cjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IHNidWZmZXI7CisgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkOworICAgIGludDY0X3QgcG9zdFVzOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY1BhcmFtczsKKworICAgIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoJnZlY1BhcmFtcyk7CisgICAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJnNoYW5kbGUsICZzYnVmZmVyKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisKKyAgICBBU1NFUlRfVFJVRShUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6RmlsbChzaGFuZGxlLCAweDc3KSk7CisKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+cG9zdFNlbmQocmVjZWl2ZXJJZCwgc2J1ZmZlciwgJnRyYW5zYWN0aW9uSWQsICZwb3N0VXMpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKworICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OlNFTkQ7CisgICAgbWVzc2FnZS5kYXRhLmJ1ZmZlcklkID0gc2J1ZmZlci0+bUlkOworICAgIG1lc3NhZ2UuZGF0YS5jb25uZWN0aW9uSWQgPSByZWNlaXZlcklkOworICAgIG1lc3NhZ2UuZGF0YS50cmFuc2FjdGlvbklkID0gdHJhbnNhY3Rpb25JZDsKKyAgICBtZXNzYWdlLmRhdGEudGltZXN0YW1wVXMgPSBwb3N0VXM7CisgICAgc2VuZE1lc3NhZ2UobUNvbW1hbmRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgfQorICBFWFBFQ1RfVFJVRShyZWNlaXZlTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgJm1lc3NhZ2UpKTsKK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgc2V0ZW52KCJUUkVCTEVfVEVTVElOR19PVkVSUklERSIsICJ0cnVlIiwgdHJ1ZSk7CisgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICBMT0coSU5GTykgPDwgIlRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9zaW5nbGUuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvc2luZ2xlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzdlZGNmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvc2luZ2xlLmNwcApAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiYnVmZmZlcnBvb2xfdW5pdF90ZXN0IgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9MZWdhY3lTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgImFsbG9jYXRvci5oIgorCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkJ1ZmZlcklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6Q2xpZW50TWFuYWdlcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkNvbm5lY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OlRyYW5zYWN0aW9uSWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhOworCituYW1lc3BhY2UgeworCisvLyBOdW1iZXIgb2YgaXRlcmF0aW9uIGZvciBidWZmZXIgYWxsb2NhdGlvbiB0ZXN0LgorY29uc3RleHByIHN0YXRpYyBpbnQga051bUFsbG9jYXRpb25UZXN0ID0gMzsKKworLy8gTnVtYmVyIG9mIGl0ZXJhdGlvbiBmb3IgYnVmZmVyIHJlY3ljbGluZyB0ZXN0LgorY29uc3RleHByIHN0YXRpYyBpbnQga051bVJlY3ljbGVUZXN0ID0gMzsKKworLy8gbWVkaWEuYnVmZmVycG9vbCB0ZXN0IHNldHVwCitjbGFzcyBCdWZmZXJwb29sU2luZ2xlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgICAgbUNvbm5lY3Rpb25WYWxpZCA9IGZhbHNlOworCisgICAgbU1hbmFnZXIgPSBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworICAgIEFTU0VSVF9ORShtTWFuYWdlciwgbnVsbHB0cik7CisKKyAgICBtQWxsb2NhdG9yID0gc3RkOjptYWtlX3NoYXJlZDxUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcj4oKTsKKyAgICBBU1NFUlRfVFJVRSgoYm9vbCltQWxsb2NhdG9yKTsKKworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5jcmVhdGUobUFsbG9jYXRvciwgJm1Db25uZWN0aW9uSWQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKworICAgIG1Db25uZWN0aW9uVmFsaWQgPSB0cnVlOworCisgICAgc3RhdHVzID0gbU1hbmFnZXItPnJlZ2lzdGVyU2VuZGVyKG1NYW5hZ2VyLCBtQ29ubmVjdGlvbklkLCAmbVJlY2VpdmVySWQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6OkFMUkVBRFlfRVhJU1RTICYmCisgICAgICAgICAgICAgICAgbVJlY2VpdmVySWQgPT0gbUNvbm5lY3Rpb25JZCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgaWYgKG1Db25uZWN0aW9uVmFsaWQpIHsKKyAgICAgIG1NYW5hZ2VyLT5jbG9zZShtQ29ubmVjdGlvbklkKTsKKyAgICB9CisgIH0KKworIHByb3RlY3RlZDoKKyAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworICB9CisKKyAgYW5kcm9pZDo6c3A8Q2xpZW50TWFuYWdlcj4gbU1hbmFnZXI7CisgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworICBib29sIG1Db25uZWN0aW9uVmFsaWQ7CisgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworICBDb25uZWN0aW9uSWQgbVJlY2VpdmVySWQ7CisKK307CisKKy8vIEJ1ZmZlciBhbGxvY2F0aW9uIHRlc3QuCisvLyBDaGVjayB3aGV0aGVyIGVhY2ggYnVmZmVyIGFsbG9jYXRpb24gaXMgZG9uZSBzdWNjZXNzZnVsbHkgd2l0aAorLy8gdW5pcXVlIGJ1ZmZlciBpZC4KK1RFU1RfRihCdWZmZXJwb29sU2luZ2xlVGVzdCwgQWxsb2NhdGVCdWZmZXIpIHsKKyAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworICBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKCZ2ZWNQYXJhbXMpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gYnVmZmVyW2tOdW1BbGxvY2F0aW9uVGVzdF07CisgIG5hdGl2ZV9oYW5kbGVfdCAqYWxsb2NIYW5kbGUgPSBudWxscHRyOworICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1BbGxvY2F0aW9uVGVzdDsgKytpKSB7CisgICAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJmFsbG9jSGFuZGxlLCAmYnVmZmVyW2ldKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtQWxsb2NhdGlvblRlc3Q7ICsraSkgeworICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IGtOdW1BbGxvY2F0aW9uVGVzdDsgKytqKSB7CisgICAgICBBU1NFUlRfVFJVRShidWZmZXJbaV0tPm1JZCAhPSBidWZmZXJbal0tPm1JZCk7CisgICAgfQorICB9CisgIEVYUEVDVF9UUlVFKGtOdW1BbGxvY2F0aW9uVGVzdCA+IDEpOworfQorCisvLyBCdWZmZXIgcmVjeWNsZSB0ZXN0LgorLy8gQ2hlY2sgd2hldGhlciBkZS1hbGxvY2F0ZWQgYnVmZmVycyBhcmUgcmVjeWNsZWQuCitURVNUX0YoQnVmZmVycG9vbFNpbmdsZVRlc3QsIFJlY3ljbGVCdWZmZXIpIHsKKyAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworICBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKCZ2ZWNQYXJhbXMpOworCisgIEJ1ZmZlcklkIGJpZFtrTnVtUmVjeWNsZVRlc3RdOworICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1SZWN5Y2xlVGVzdDsgKytpKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBidWZmZXI7CisgICAgbmF0aXZlX2hhbmRsZV90ICphbGxvY0hhbmRsZSA9IG51bGxwdHI7CisgICAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJmFsbG9jSGFuZGxlLCAmYnVmZmVyKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgICAgYmlkW2ldID0gYnVmZmVyLT5tSWQ7CisgIH0KKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBrTnVtUmVjeWNsZVRlc3Q7ICsraSkgeworICAgIEFTU0VSVF9UUlVFKGJpZFtpIC0gMV0gPT0gYmlkW2ldKTsKKyAgfQorICBFWFBFQ1RfVFJVRShrTnVtUmVjeWNsZVRlc3QgPiAxKTsKK30KKworLy8gQnVmZmVyIHRyYW5zZmVyIHRlc3QuCisvLyBDaGVjayB3aGV0aGVyIGJ1ZmZlciBpcyB0cmFuc2ZlcnJlZCB0byBhbm90aGVyIGNsaWVudCBzdWNjZXNzZnVsbHkuCitURVNUX0YoQnVmZmVycG9vbFNpbmdsZVRlc3QsIFRyYW5zZmVyQnVmZmVyKSB7CisgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY1BhcmFtczsKKyAgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcygmdmVjUGFyYW1zKTsKKyAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBzYnVmZmVyLCByYnVmZmVyOworICBuYXRpdmVfaGFuZGxlX3QgKmFsbG9jSGFuZGxlID0gbnVsbHB0cjsKKyAgbmF0aXZlX2hhbmRsZV90ICpyZWN2SGFuZGxlID0gbnVsbHB0cjsKKworICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQ7CisgIGludDY0X3QgcG9zdFVzOworCisgIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCB2ZWNQYXJhbXMsICZhbGxvY0hhbmRsZSwgJnNidWZmZXIpOworICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIEFTU0VSVF9UUlVFKFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpGaWxsKGFsbG9jSGFuZGxlLCAweDc3KSk7CisgIHN0YXR1cyA9IG1NYW5hZ2VyLT5wb3N0U2VuZChtUmVjZWl2ZXJJZCwgc2J1ZmZlciwgJnRyYW5zYWN0aW9uSWQsICZwb3N0VXMpOworICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWNlaXZlKG1SZWNlaXZlcklkLCB0cmFuc2FjdGlvbklkLCBzYnVmZmVyLT5tSWQsIHBvc3RVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY3ZIYW5kbGUsICZyYnVmZmVyKTsKKyAgRVhQRUNUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICBBU1NFUlRfVFJVRShUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6VmVyaWZ5KHJlY3ZIYW5kbGUsIDB4NzcpKTsKK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgIExPRyhJTkZPKSA8PCAiVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9BbmRyb2lkLm1rIGIvbWVkaWEvY29kZWMyL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJkNzM5ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDggQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgRE9DVU1FTlRBVElPTiBHRU5FUkFUSU9OCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitDMl9ST09UIDo9ICQoY2FsbCBteS1kaXIpCisKK0MyX0RPQ1NfUk9PVCA6PSAkKE9VVF9ESVIpL3RhcmdldC9jb21tb24vZG9jcy9jb2RlYzIKKworQzJfT1VUX1RFTVAgOj0gJChQUk9EVUNUX09VVCkvZ2VuL0VUQy9Db2RlYzItZG9jc19pbnRlcm1lZGlhdGVzCisKK0MyX0RPWFkgOj0gJChvciAkKHNoZWxsIGNvbW1hbmQgLXYgZG94eWdlbiksXAorCQkkKHNoZWxsIGNvbW1hbmQgLXYgL0FwcGxpY2F0aW9ucy9Eb3h5Z2VuLmFwcC9Db250ZW50cy9SZXNvdXJjZXMvZG94eWdlbikpCisKKy5QSE9OWTogY2hlY2stZG94eWdlbgorY2hlY2stZG94eWdlbjoKK2lmbmRlZiBDMl9ET1hZCisJJChlcnJvciAnZG94eWdlbiBpcyBub3QgYXZhaWxhYmxlJykKK2VuZGlmCisKKyQoQzJfT1VUX1RFTVApL2RveHktYXBpLmNvbmZpZzogJChDMl9ST09UKS9kb2NzL2RveHlnZW4uY29uZmlnCisJIyBvbmx5IGRvY3VtZW50IGluY2x1ZGUgZGlyZWN0b3J5LCBubyBpbnRlcm5hbCBzZWN0aW9ucworCXNlZCAncy9cKF5JTlBVVCAqPS4qXCkvXDFpbmNsdWRlXC8vOyBcCisJcy9cKF5JTlRFUk5BTF9ET0NTICo9ICpcKS4qL1wxTk8vOyBcCisJcy9cKF5FTkFCTEVEX1NFQ1RJT05TICo9LipcKUlOVEVSTkFMXCguKlwpLiovXDFcMi87IFwKKwlzOlwoXk9VVFBVVF9ESVJFQ1RPUlkgKj0gXClvdXQ6XDEnJChPVVRfRElSKSc6OycgXAorCQkkKEMyX1JPT1QpL2RvY3MvZG94eWdlbi5jb25maWcgPiAkQAorCiskKEMyX09VVF9URU1QKS9kb3h5LWludGVybmFsLmNvbmZpZzogJChDMl9ST09UKS9kb2NzL2RveHlnZW4uY29uZmlnCisJc2VkICdzOlwoXk9VVFBVVF9ESVJFQ1RPUlkgKj0gXClvdXRcKC4qXClhcGk6XDEnJChPVVRfRElSKSdcMmludGVybmFsOjsnIFwKKwkJJChDMl9ST09UKS9kb2NzL2RveHlnZW4uY29uZmlnID4gJEAKKworLlBIT05ZOiBkb2NzLWFwaQorZG9jcy1hcGk6ICQoQzJfT1VUX1RFTVApL2RveHktYXBpLmNvbmZpZyBjaGVjay1kb3h5Z2VuCisJZWNobyBBUEkgZG9jcyBhcmUgYnVpbGRpbmcgaW4gJChDMl9ET0NTX1JPT1QpL2FwaQorCXJtIC1yZiAkKEMyX0RPQ1NfUk9PVCkvYXBpCisJbWtkaXIgLXAgJChDMl9ET0NTX1JPT1QpL2FwaQorCSQoQzJfRE9YWSkgJChDMl9PVVRfVEVNUCkvZG94eS1hcGkuY29uZmlnCisKKy5QSE9OWTogZG9jcy1pbnRlcm5hbAorZG9jcy1pbnRlcm5hbDogJChDMl9PVVRfVEVNUCkvZG94eS1pbnRlcm5hbC5jb25maWcgY2hlY2stZG94eWdlbgorCWVjaG8gSW50ZXJuYWwgZG9jcyBhcmUgYnVpbGRpbmcgaW4gJChDMl9ET0NTX1JPT1QpL2ludGVybmFsCisJcm0gLXJmICQoQzJfRE9DU19ST09UKS9pbnRlcm5hbAorCW1rZGlyIC1wICQoQzJfRE9DU19ST09UKS9pbnRlcm5hbAorCSQoQzJfRE9YWSkgJChDMl9PVVRfVEVNUCkvZG94eS1pbnRlcm5hbC5jb25maWcKKworLlBIT05ZOiBkb2NzLWFsbAorZG9jcy1hbGw6IGRvY3MtYXBpIGRvY3MtaW50ZXJuYWwKKworaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKGNhbGwgbXktZGlyKSkKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWVjYTU4NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzAgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYWFjZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAiQzJTb2Z0QWFjRGVjLmNwcCIsCisgICAgICAgICJEcmNQcmVzTW9kZVdyYXAuY3BwIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYkZyYXVuaG9mZXJBQUMiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYWFjZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRBYWNFbmMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliRnJhdW5ob2ZlckFBQyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQ0ZTEyNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNEZWMuY3BwCkBAIC0wLDAgKzEsOTI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRBYWNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8bnVtZXJpYz4KKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdEFhY0RlYy5oIgorCisjZGVmaW5lIEZJTEVSRUFEX01BWF9MQVlFUlMgMgorCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwgLTE2LjAgIC8qIDY0Ki0wLjI1ZEIgPSAtMTYgZEIgYmVsb3cgZnVsbCBzY2FsZSBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQgICAxLjAgLyogbWF4aW11bSBjb21wcmVzc2lvbiBvZiBkeW5hbWljIHJhbmdlIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0JPT1NUIDEuMCAvKiBtYXhpbXVtIGNvbXByZXNzaW9uIG9mIGR5bmFtaWMgcmFuZ2UgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfSEVBVlkgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9IRUFWWSAgIC8qIHN3aXRjaCBmb3IgaGVhdnkgY29tcHJlc3Npb24gZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfRUZGRUNUIDMgIC8qIE1QRUctRCBEUkMgZWZmZWN0IHR5cGU7IDMgPT4gTGltaXRlZCBwbGF5YmFjayByYW5nZSAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRU5DX0xFVkVMICgwLjI1KSAvKiBlbmNvZGVyIHRhcmdldCBsZXZlbDsgLTEgPT4gdGhlIHZhbHVlIGlzIHVua25vd24sIG90aGVyd2lzZSBkQiBzdGVwIHZhbHVlIChlLmcuIDY0IGZvciAtMTYgZEIpICovCisjZGVmaW5lIE1BWF9DSEFOTkVMX0NPVU5UICAgICAgICAgICAgOCAgLyogbWF4aW11bSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgdGhhdCBjYW4gYmUgZGVjb2RlZCAqLworLy8gbmFtZXMgb2YgcHJvcGVydGllcyB0aGF0IGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IERSQyBzZXR0aW5ncworI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9SRUZfTEVWRUwgICJhYWNfZHJjX3JlZmVyZW5jZV9sZXZlbCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfQ1VUICAgICAgICAiYWFjX2RyY19jdXQiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0JPT1NUICAgICAgImFhY19kcmNfYm9vc3QiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0hFQVZZICAgICAgImFhY19kcmNfaGVhdnkiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0VOQ19MRVZFTCAiYWFjX2RyY19lbmNfdGFyZ2V0X2xldmVsIgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9FRkZFQ1QgICAgICJyby5hYWNfZHJjX2VmZmVjdF90eXBlIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5hYWMuZGVjb2RlciI7CisKK2NsYXNzIEMyU29mdEFhY0RlYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fQVVESU8sCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUFjdHVhbE91dHB1dERlbGF5LCBDMl9QQVJBTUtFWV9PVVRQVVRfREVMQVkpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0KDJ1KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgNDQxMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgIDczNTAsIDgwMDAsIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMAorICAgICAgICAgICAgICAgIH0pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuaW5SYW5nZSgxLCA4KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg4MDAwLCA5NjAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA4MTkyKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BYWNGb3JtYXQsIEMyX1BBUkFNS0VZX0FBQ19QQUNLQUdJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUFhY0Zvcm1hdEluZm86OmlucHV0KDB1LCBDMkNvbmZpZzo6QUFDX1BBQ0tBR0lOR19SQVcpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUFhY0Zvcm1hdCwgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkFBQ19QQUNLQUdJTkdfUkFXLCBDMkNvbmZpZzo6QUFDX1BBQ0tBR0lOR19BRFRTCisgICAgICAgICAgICAgICAgfSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUFhY0Zvcm1hdCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MQywgQzJDb25maWc6OkxFVkVMX1VOVVNFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0hFX1BTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfRUxELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FUl9TQ0FMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfWEhFfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNDb21wcmVzc01vZGUsIEMyX1BBUkFNS0VZX0RSQ19DT01QUkVTU0lPTl9NT0RFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNDb21wcmVzc2lvbk1vZGVUdW5pbmc6OmlucHV0KDB1LCBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtRHJjQ29tcHJlc3NNb2RlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fT0RNX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fTElHSFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9IRUFWWX0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNDb21wcmVzc01vZGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY1RhcmdldFJlZkxldmVsLCBDMl9QQVJBTUtFWV9EUkNfVEFSR0VUX1JFRkVSRU5DRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjVGFyZ2V0UmVmZXJlbmNlTGV2ZWxUdW5pbmc6OmlucHV0KDB1LCBEUkNfREVGQVVMVF9NT0JJTEVfUkVGX0xFVkVMKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1EcmNUYXJnZXRSZWZMZXZlbCwgdmFsdWUpLmluUmFuZ2UoLTMxLjc1LCAwLjI1KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjVGFyZ2V0UmVmTGV2ZWwpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY0VuY1RhcmdldExldmVsLCBDMl9QQVJBTUtFWV9EUkNfRU5DT0RFRF9UQVJHRVRfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY0VuY29kZWRUYXJnZXRMZXZlbFR1bmluZzo6aW5wdXQoMHUsIERSQ19ERUZBVUxUX01PQklMRV9FTkNfTEVWRUwpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobURyY0VuY1RhcmdldExldmVsLCB2YWx1ZSkuaW5SYW5nZSgtMzEuNzUsIDAuMjUpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNFbmNUYXJnZXRMZXZlbCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjQm9vc3RGYWN0b3IsIEMyX1BBUkFNS0VZX0RSQ19CT09TVF9GQUNUT1IpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY0Jvb3N0RmFjdG9yVHVuaW5nOjppbnB1dCgwdSwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19CT09TVCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRHJjQm9vc3RGYWN0b3IsIHZhbHVlKS5pblJhbmdlKDAsIDEuKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjQm9vc3RGYWN0b3IpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY0F0dGVudWF0aW9uRmFjdG9yLCBDMl9QQVJBTUtFWV9EUkNfQVRURU5VQVRJT05fRkFDVE9SKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNBdHRlbnVhdGlvbkZhY3RvclR1bmluZzo6aW5wdXQoMHUsIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1EcmNBdHRlbnVhdGlvbkZhY3RvciwgdmFsdWUpLmluUmFuZ2UoMCwgMS4pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNBdHRlbnVhdGlvbkZhY3Rvcik+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjRWZmZWN0VHlwZSwgQzJfUEFSQU1LRVlfRFJDX0VGRkVDVF9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNFZmZlY3RUeXBlVHVuaW5nOjppbnB1dCgwdSwgQzJDb25maWc6OkRSQ19FRkZFQ1RfTElNSVRFRF9QTEFZQkFDS19SQU5HRSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobURyY0VmZmVjdFR5cGUsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfT0RNX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfT0ZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfTEFURV9OSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9OT0lTWV9FTlZJUk9OTUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9MSU1JVEVEX1BMQVlCQUNLX1JBTkdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0xPV19QTEFZQkFDS19MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9ESUFMT0dfRU5IQU5DRU1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfR0VORVJBTF9DT01QUkVTU0lPTn0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNFZmZlY3RUeXBlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgYm9vbCBpc0FkdHMoKSBjb25zdCB7IHJldHVybiBtQWFjRm9ybWF0LT52YWx1ZSA9PSBDMkNvbmZpZzo6QUFDX1BBQ0tBR0lOR19BRFRTOyB9CisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgKHZvaWQpbWU7ICAvLyBUT0RPOiB2YWxpZGF0ZQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKyAgICBpbnQzMl90IGdldERyY0NvbXByZXNzTW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1EcmNDb21wcmVzc01vZGUtPnZhbHVlID09IEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fSEVBVlkgPyAxIDogMDsgfQorICAgIGludDMyX3QgZ2V0RHJjVGFyZ2V0UmVmTGV2ZWwoKSBjb25zdCB7IHJldHVybiAobURyY1RhcmdldFJlZkxldmVsLT52YWx1ZSA8PSAwID8gLW1EcmNUYXJnZXRSZWZMZXZlbC0+dmFsdWUgKiA0LiArIDAuNSA6IC0xKTsgfQorICAgIGludDMyX3QgZ2V0RHJjRW5jVGFyZ2V0TGV2ZWwoKSBjb25zdCB7IHJldHVybiAobURyY0VuY1RhcmdldExldmVsLT52YWx1ZSA8PSAwID8gLW1EcmNFbmNUYXJnZXRMZXZlbC0+dmFsdWUgKiA0LiArIDAuNSA6IC0xKTsgfQorICAgIGludDMyX3QgZ2V0RHJjQm9vc3RGYWN0b3IoKSBjb25zdCB7IHJldHVybiBtRHJjQm9vc3RGYWN0b3ItPnZhbHVlICogMTI3LiArIDAuNTsgfQorICAgIGludDMyX3QgZ2V0RHJjQXR0ZW51YXRpb25GYWN0b3IoKSBjb25zdCB7IHJldHVybiBtRHJjQXR0ZW51YXRpb25GYWN0b3ItPnZhbHVlICogMTI3LiArIDAuNTsgfQorICAgIGludDMyX3QgZ2V0RHJjRWZmZWN0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1EcmNFZmZlY3RUeXBlLT52YWx1ZTsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ+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+IG1CdWZmZXJzSW5mbzsKKworICAgIENEcmNQcmVzTW9kZVdyYXBwZXIgbURyY1dyYXA7CisKKyAgICBlbnVtIHsKKyAgICAgICAgTk9ORSwKKyAgICAgICAgQVdBSVRJTkdfRElTQUJMRUQsCisgICAgICAgIEFXQUlUSU5HX0VOQUJMRUQKKyAgICB9IG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2U7CisKKyAgICB2b2lkIGluaXRQb3J0cygpOworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgYm9vbCBpc0NvbmZpZ3VyZWQoKSBjb25zdDsKKyAgICB2b2lkIGRyYWluRGVjb2RlcigpOworCisgICAgdm9pZCBkcmFpblJpbmdCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgICAgICBib29sIGVvcyk7CisgICAgYzJfc3RhdHVzX3QgZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisKKy8vICAgICAgZGVsYXkgY29tcGVuc2F0aW9uCisgICAgYm9vbCBtRW5kT2ZJbnB1dDsKKyAgICBib29sIG1FbmRPZk91dHB1dDsKKyAgICBpbnQzMl90IG1PdXRwdXREZWxheUNvbXBlbnNhdGVkOworICAgIGludDMyX3QgbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemU7CisgICAgc2hvcnQgKm1PdXRwdXREZWxheVJpbmdCdWZmZXI7CisgICAgaW50MzJfdCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3M7CisgICAgaW50MzJfdCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvczsKKyAgICBpbnQzMl90IG1PdXRwdXREZWxheVJpbmdCdWZmZXJGaWxsZWQ7CisgICAgYm9vbCBvdXRwdXREZWxheVJpbmdCdWZmZXJQdXRTYW1wbGVzKElOVF9QQ00gKnNhbXBsZXMsIGludCBudW1TYW1wbGVzKTsKKyAgICBpbnQzMl90IG91dHB1dERlbGF5UmluZ0J1ZmZlckdldFNhbXBsZXMoSU5UX1BDTSAqc2FtcGxlcywgaW50IG51bVNhbXBsZXMpOworICAgIGludDMyX3Qgb3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpOworICAgIGludDMyX3Qgb3V0cHV0RGVsYXlSaW5nQnVmZmVyU3BhY2VMZWZ0KCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRBYWNEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfQUFDX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0VuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTM4NTJjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0VuYy5jcHAKQEAgLTAsMCArMSw2MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEFhY0VuYyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKworI2luY2x1ZGUgIkMyU29mdEFhY0VuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5hYWMuZW5jb2RlciI7CisKK30gIC8vIG5hbWVzcGFjZQorCitjbGFzcyBDMlNvZnRBYWNFbmM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPLAorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7CisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKAorICAgICAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6QVRUUklCX0lTX1RFTVBPUkFMKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0KDB1LCA0NDEwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgODAwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsIDI0MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwCisgICAgICAgICAgICAgICAgfSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuaW5SYW5nZSgxLCA2KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoODAwMCwgOTYwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgODE5MikpCisgICAgICAgICAgICAgICAgLmNhbGN1bGF0ZWRBcyhNYXhCdWZTaXplQ2FsY3VsYXRvciwgbUNoYW5uZWxDb3VudCkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MQywgQzJDb25maWc6OkxFVkVMX1VOVVNFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0hFX1BTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfRUxEfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNCUk1vZGUsIEMyX1BBUkFNS0VZX0FBQ19TQlJfTU9ERSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQWFjU2JyTW9kZVR1bmluZzo6aW5wdXQoMHUsIEFBQ19TQlJfQVVUTykpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU0JSTW9kZSwgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6QUFDX1NCUl9PRkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkFBQ19TQlJfU0lOR0xFX1JBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkFBQ19TQlJfRFVBTF9SQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpBQUNfU0JSX0FVVE8gfSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbVNCUk1vZGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBnZXRTYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbVNhbXBsZVJhdGUtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0Q2hhbm5lbENvdW50KCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxDb3VudC0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRCaXRyYXRlKCkgY29uc3QgeyByZXR1cm4gbUJpdHJhdGUtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0U0JSTW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1TQlJNb2RlLT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldFByb2ZpbGUoKSBjb25zdCB7IHJldHVybiBtUHJvZmlsZUxldmVsLT5wcm9maWxlOyB9CisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heEJ1ZlNpemVDYWxjdWxhdG9yKAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgIEMyUDxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQ+ICZjaGFubmVsQ291bnQpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIG1lLnNldCgpLnZhbHVlID0gMTAyNCAqIHNpemVvZihzaG9ydCkgKiBjaGFubmVsQ291bnQudi52YWx1ZTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUFhY1Nick1vZGVUdW5pbmc6OmlucHV0PiBtU0JSTW9kZTsKK307CisKK0MyU29mdEFhY0VuYzo6QzJTb2Z0QWFjRW5jKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1BQUNFbmNvZGVyKG51bGxwdHIpLAorICAgICAgbU51bUJ5dGVzUGVySW5wdXRGcmFtZSgwdSksCisgICAgICBtT3V0QnVmZmVyU2l6ZSgwdSksCisgICAgICBtU2VudENvZGVjU3BlY2lmaWNEYXRhKGZhbHNlKSwKKyAgICAgIG1JbnB1dFRpbWVTZXQoZmFsc2UpLAorICAgICAgbUlucHV0U2l6ZSgwKSwKKyAgICAgIG1JbnB1dFRpbWVVcygwKSwKKyAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSksCisgICAgICBtT3V0SW5kZXgoMHUpIHsKK30KKworQzJTb2Z0QWFjRW5jOjp+QzJTb2Z0QWFjRW5jKCkgeworICAgIG9uUmVzZXQoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QWFjRW5jOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdEVuY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7Cit9CisKK3N0YXR1c190IEMyU29mdEFhY0VuYzo6aW5pdEVuY29kZXIoKSB7CisgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNPcGVuKCZtQUFDRW5jb2RlciwgMCwgMCkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0IEFBQyBlbmNvZGVyIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gc2V0QXVkaW9QYXJhbXMoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QWFjRW5jOjpvblN0b3AoKSB7CisgICAgbVNlbnRDb2RlY1NwZWNpZmljRGF0YSA9IGZhbHNlOworICAgIG1JbnB1dFRpbWVTZXQgPSBmYWxzZTsKKyAgICBtSW5wdXRTaXplID0gMHU7CisgICAgbUlucHV0VGltZVVzID0gMDsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QWFjRW5jOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworICAgIGFhY0VuY0Nsb3NlKCZtQUFDRW5jb2Rlcik7Cit9CisKK3ZvaWQgQzJTb2Z0QWFjRW5jOjpvblJlbGVhc2UoKSB7CisgICAgLy8gbm8tb3AKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QWFjRW5jOjpvbkZsdXNoX3NtKCkgeworICAgIG1TZW50Q29kZWNTcGVjaWZpY0RhdGEgPSBmYWxzZTsKKyAgICBtSW5wdXRUaW1lU2V0ID0gZmFsc2U7CisgICAgbUlucHV0U2l6ZSA9IDB1OworICAgIG1JbnB1dFRpbWVVcyA9IDA7CisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0aWMgQ0hBTk5FTF9NT0RFIGdldENoYW5uZWxNb2RlKHVpbnQzMl90IG5DaGFubmVscykgeworICAgIENIQU5ORUxfTU9ERSBjaE1vZGUgPSBNT0RFX0lOVkFMSUQ7CisgICAgc3dpdGNoIChuQ2hhbm5lbHMpIHsKKyAgICAgICAgY2FzZSAxOiBjaE1vZGUgPSBNT0RFXzE7IGJyZWFrOworICAgICAgICBjYXNlIDI6IGNoTW9kZSA9IE1PREVfMjsgYnJlYWs7CisgICAgICAgIGNhc2UgMzogY2hNb2RlID0gTU9ERV8xXzI7IGJyZWFrOworICAgICAgICBjYXNlIDQ6IGNoTW9kZSA9IE1PREVfMV8yXzE7IGJyZWFrOworICAgICAgICBjYXNlIDU6IGNoTW9kZSA9IE1PREVfMV8yXzI7IGJyZWFrOworICAgICAgICBjYXNlIDY6IGNoTW9kZSA9IE1PREVfMV8yXzJfMTsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IGNoTW9kZSA9IE1PREVfSU5WQUxJRDsKKyAgICB9CisgICAgcmV0dXJuIGNoTW9kZTsKK30KKworc3RhdGljIEFVRElPX09CSkVDVF9UWVBFIGdldEFPVEZyb21Qcm9maWxlKHVpbnQzMl90IHByb2ZpbGUpIHsKKyAgIGlmIChwcm9maWxlID09IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MQykgeworICAgICAgIHJldHVybiBBT1RfQUFDX0xDOworICAgfSBlbHNlIGlmIChwcm9maWxlID09IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19IRSkgeworICAgICAgIHJldHVybiBBT1RfU0JSOworICAgfSBlbHNlIGlmIChwcm9maWxlID09IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19IRV9QUykgeworICAgICAgIHJldHVybiBBT1RfUFM7CisgICB9IGVsc2UgaWYgKHByb2ZpbGUgPT0gQzJDb25maWc6OlBST0ZJTEVfQUFDX0xEKSB7CisgICAgICAgcmV0dXJuIEFPVF9FUl9BQUNfTEQ7CisgICB9IGVsc2UgaWYgKHByb2ZpbGUgPT0gQzJDb25maWc6OlBST0ZJTEVfQUFDX0VMRCkgeworICAgICAgIHJldHVybiBBT1RfRVJfQUFDX0VMRDsKKyAgIH0gZWxzZSB7CisgICAgICAgQUxPR1coIlVuc3VwcG9ydGVkIEFBQyBwcm9maWxlIC0gZGVmYXVsdGluZyB0byBBQUMtTEMiKTsKKyAgICAgICByZXR1cm4gQU9UX0FBQ19MQzsKKyAgIH0KK30KKworc3RhdHVzX3QgQzJTb2Z0QWFjRW5jOjpzZXRBdWRpb1BhcmFtcygpIHsKKyAgICAvLyBXZSBjYWxsIHRoaXMgd2hlbmV2ZXIgc2FtcGxlIHJhdGUsIG51bWJlciBvZiBjaGFubmVscywgYml0cmF0ZSBvciBTQlIgbW9kZSBjaGFuZ2UKKyAgICAvLyBpbiByZXBvbnNlIHRvIHNldFBhcmFtZXRlciBjYWxscy4KKyAgICBpbnQzMl90IHNiclJhdGlvID0gMDsKKyAgICB1aW50MzJfdCBzYnJNb2RlID0gbUludGYtPmdldFNCUk1vZGUoKTsKKyAgICBpZiAoc2JyTW9kZSA9PSBBQUNfU0JSX1NJTkdMRV9SQVRFKSBzYnJSYXRpbyA9IDE7CisgICAgZWxzZSBpZiAoc2JyTW9kZSA9PSBBQUNfU0JSX0RVQUxfUkFURSkgc2JyUmF0aW8gPSAyOworCisgICAgQUxPR1YoInNldEF1ZGlvUGFyYW1zOiAldSBIeiwgJXUgY2hhbm5lbHMsICV1IGJwcywgJWkgc2JyIG1vZGUsICVpIHNiciByYXRpbyIsCisgICAgICAgICBtSW50Zi0+Z2V0U2FtcGxlUmF0ZSgpLCBtSW50Zi0+Z2V0Q2hhbm5lbENvdW50KCksIG1JbnRmLT5nZXRCaXRyYXRlKCksCisgICAgICAgICBzYnJNb2RlLCBzYnJSYXRpbyk7CisKKyAgICB1aW50MzJfdCBhYWNQcm9maWxlID0gbUludGYtPmdldFByb2ZpbGUoKTsKKyAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY29kZXJfU2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19BT1QsIGdldEFPVEZyb21Qcm9maWxlKGFhY1Byb2ZpbGUpKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBBQUMgZW5jb2RlciBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jb2Rlcl9TZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX1NBTVBMRVJBVEUsIG1JbnRmLT5nZXRTYW1wbGVSYXRlKCkpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFBQyBlbmNvZGVyIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jb2Rlcl9TZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX0JJVFJBVEUsIG1JbnRmLT5nZXRCaXRyYXRlKCkpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFBQyBlbmNvZGVyIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jb2Rlcl9TZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX0NIQU5ORUxNT0RFLAorICAgICAgICAgICAgZ2V0Q2hhbm5lbE1vZGUobUludGYtPmdldENoYW5uZWxDb3VudCgpKSkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgQUFDIGVuY29kZXIgcGFyYW1ldGVycyIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNvZGVyX1NldFBhcmFtKG1BQUNFbmNvZGVyLCBBQUNFTkNfVFJBTlNNVVgsIFRUX01QNF9SQVcpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFBQyBlbmNvZGVyIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaWYgKHNick1vZGUgIT0gLTEgJiYgYWFjUHJvZmlsZSA9PSBDMkNvbmZpZzo6UFJPRklMRV9BQUNfRUxEKSB7CisgICAgICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jb2Rlcl9TZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX1NCUl9NT0RFLCBzYnJNb2RlKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgQUFDIGVuY29kZXIgcGFyYW1ldGVycyIpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBTQlIgcmF0aW8gcGFyYW1ldGVyIGNvbmZpZ3VyYXRpb25zOgorICAgICAgIDA6IERlZmF1bHQgY29uZmlndXJhdGlvbiB3aGVyZWluIFNCUiByYXRpbyBpcyBjb25maWd1cmVkIGRlcGVuZGluZyBvbiBhdWRpbyBvYmplY3QgdHlwZSBieQorICAgICAgICAgIHRoZSBGREsuCisgICAgICAgMTogRG93bnNhbXBsZWQgU0JSIChkZWZhdWx0IGZvciBFTEQpCisgICAgICAgMjogRHVhbHJhdGUgU0JSIChkZWZhdWx0IGZvciBIRS1BQUMpCisgICAgICovCisgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNvZGVyX1NldFBhcmFtKG1BQUNFbmNvZGVyLCBBQUNFTkNfU0JSX1JBVElPLCBzYnJSYXRpbykpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgQUFDIGVuY29kZXIgcGFyYW1ldGVycyIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QWFjRW5jOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvcikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGJvb2wgZW9zID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKworICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBtSW50Zi0+Z2V0U2FtcGxlUmF0ZSgpOworICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IG1JbnRmLT5nZXRDaGFubmVsQ291bnQoKTsKKworICAgIGlmICghbVNlbnRDb2RlY1NwZWNpZmljRGF0YSkgeworICAgICAgICAvLyBUaGUgdmVyeSBmaXJzdCB0aGluZyB3ZSB3YW50IHRvIG91dHB1dCBpcyB0aGUgY29kZWMgc3BlY2lmaWMKKyAgICAgICAgLy8gZGF0YS4KKworICAgICAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY0VuY29kZShtQUFDRW5jb2RlciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikpIHsKKyAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBlbmNvZGVyIGZvciBwcm9maWxlIC8gc2FtcGxlLXJhdGUgLyBiaXQtcmF0ZSAvIGNoYW5uZWxzIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3QgYml0cmF0ZSA9IG1JbnRmLT5nZXRCaXRyYXRlKCk7CisgICAgICAgIHVpbnQzMl90IGFjdHVhbEJpdFJhdGUgPSBhYWNFbmNvZGVyX0dldFBhcmFtKG1BQUNFbmNvZGVyLCBBQUNFTkNfQklUUkFURSk7CisgICAgICAgIGlmIChiaXRyYXRlICE9IGFjdHVhbEJpdFJhdGUpIHsKKyAgICAgICAgICAgIEFMT0dXKCJSZXF1ZXN0ZWQgYml0cmF0ZSAldSB1bnN1cHBvcnRlZCwgdXNpbmcgJXUiLCBiaXRyYXRlLCBhY3R1YWxCaXRSYXRlKTsKKyAgICAgICAgfQorCisgICAgICAgIEFBQ0VOQ19JbmZvU3RydWN0IGVuY0luZm87CisgICAgICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jSW5mbyhtQUFDRW5jb2RlciwgJmVuY0luZm8pKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBBQUMgZW5jb2RlciBpbmZvIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+IGNzZCA9CisgICAgICAgICAgICBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0OjpBbGxvY1VuaXF1ZShlbmNJbmZvLmNvbmZTaXplLCAwdSk7CisgICAgICAgIGlmICghY3NkKSB7CisgICAgICAgICAgICBBTE9HRSgiQ1NEIGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1lbWNweShjc2QtPm0udmFsdWUsIGVuY0luZm8uY29uZkJ1ZiwgZW5jSW5mby5jb25mU2l6ZSk7CisgICAgICAgIEFMT0dWKCJwdXQgY3NkIik7CisjaWYgZGVmaW5lZChMT0dfTkRFQlVHKSAmJiAhTE9HX05ERUJVRworICAgICAgICBoZXhkdW1wKGNzZC0+bS52YWx1ZSwgY3NkLT5mbGV4Q291bnQoKSk7CisjZW5kaWYKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soc3RkOjptb3ZlKGNzZCkpOworCisgICAgICAgIG1PdXRCdWZmZXJTaXplID0gZW5jSW5mby5tYXhPdXRCdWZCeXRlczsKKyAgICAgICAgbU51bUJ5dGVzUGVySW5wdXRGcmFtZSA9IGVuY0luZm8uZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQgKiBzaXplb2YoaW50MTZfdCk7CisKKyAgICAgICAgbVNlbnRDb2RlY1NwZWNpZmljRGF0YSA9IHRydWU7CisgICAgfQorCisgICAgdWludDhfdCB0ZW1wWzFdOworICAgIEMyUmVhZFZpZXcgdmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSB0ZW1wOworICAgIHNpemVfdCBjYXBhY2l0eSA9IDB1OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgZGF0YSA9IHZpZXcuZGF0YSgpOworICAgICAgICBjYXBhY2l0eSA9IHZpZXcuY2FwYWNpdHkoKTsKKyAgICB9CisgICAgaWYgKCFtSW5wdXRUaW1lU2V0ICYmIGNhcGFjaXR5ID4gMCkgeworICAgICAgICBtSW5wdXRUaW1lVXMgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcDsKKyAgICAgICAgbUlucHV0VGltZVNldCA9IHRydWU7CisgICAgfQorCisgICAgc2l6ZV90IG51bUZyYW1lcyA9IChjYXBhY2l0eSArIG1JbnB1dFNpemUgKyAoZW9zID8gbU51bUJ5dGVzUGVySW5wdXRGcmFtZSAtIDEgOiAwKSkKKyAgICAgICAgICAgIC8gbU51bUJ5dGVzUGVySW5wdXRGcmFtZTsKKyAgICBBTE9HVigiY2FwYWNpdHkgPSAlenU7IG1JbnB1dFNpemUgPSAlenU7IG51bUZyYW1lcyA9ICV6dSBtTnVtQnl0ZXNQZXJJbnB1dEZyYW1lID0gJXUiLAorICAgICAgICAgIGNhcGFjaXR5LCBtSW5wdXRTaXplLCBudW1GcmFtZXMsIG1OdW1CeXRlc1BlcklucHV0RnJhbWUpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldyaXRlVmlldz4gd1ZpZXc7CisgICAgdWludDhfdCAqb3V0UHRyID0gdGVtcDsKKyAgICBzaXplX3Qgb3V0QXZhaWxhYmxlID0gMHU7CisgICAgdWludDY0X3QgaW5wdXRJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworCisgICAgQUFDRU5DX0luQXJncyBpbmFyZ3M7CisgICAgQUFDRU5DX091dEFyZ3Mgb3V0YXJnczsKKyAgICBtZW1zZXQoJmluYXJncywgMCwgc2l6ZW9mKGluYXJncykpOworICAgIG1lbXNldCgmb3V0YXJncywgMCwgc2l6ZW9mKG91dGFyZ3MpKTsKKyAgICBpbmFyZ3MubnVtSW5TYW1wbGVzID0gY2FwYWNpdHkgLyBzaXplb2YoaW50MTZfdCk7CisKKyAgICB2b2lkKiBpbkJ1ZmZlcltdICAgICAgICA9IHsgKHVuc2lnbmVkIGNoYXIgKilkYXRhIH07CisgICAgSU5UICAgaW5CdWZmZXJJZHNbXSAgICAgPSB7IElOX0FVRElPX0RBVEEgfTsKKyAgICBJTlQgICBpbkJ1ZmZlclNpemVbXSAgICA9IHsgKElOVCljYXBhY2l0eSB9OworICAgIElOVCAgIGluQnVmZmVyRWxTaXplW10gID0geyBzaXplb2YoaW50MTZfdCkgfTsKKworICAgIEFBQ0VOQ19CdWZEZXNjIGluQnVmRGVzYzsKKyAgICBpbkJ1ZkRlc2MubnVtQnVmcyAgICAgICAgICAgPSBzaXplb2YoaW5CdWZmZXIpIC8gc2l6ZW9mKHZvaWQqKTsKKyAgICBpbkJ1ZkRlc2MuYnVmcyAgICAgICAgICAgICAgPSAodm9pZCoqKSZpbkJ1ZmZlcjsKKyAgICBpbkJ1ZkRlc2MuYnVmZmVySWRlbnRpZmllcnMgPSBpbkJ1ZmZlcklkczsKKyAgICBpbkJ1ZkRlc2MuYnVmU2l6ZXMgICAgICAgICAgPSBpbkJ1ZmZlclNpemU7CisgICAgaW5CdWZEZXNjLmJ1ZkVsU2l6ZXMgICAgICAgID0gaW5CdWZmZXJFbFNpemU7CisKKyAgICB2b2lkKiBvdXRCdWZmZXJbXSAgICAgICA9IHsgb3V0UHRyIH07CisgICAgSU5UICAgb3V0QnVmZmVySWRzW10gICAgPSB7IE9VVF9CSVRTVFJFQU1fREFUQSB9OworICAgIElOVCAgIG91dEJ1ZmZlclNpemVbXSAgID0geyAwIH07CisgICAgSU5UICAgb3V0QnVmZmVyRWxTaXplW10gPSB7IHNpemVvZihVQ0hBUikgfTsKKworICAgIEFBQ0VOQ19CdWZEZXNjIG91dEJ1ZkRlc2M7CisgICAgb3V0QnVmRGVzYy5udW1CdWZzICAgICAgICAgICA9IHNpemVvZihvdXRCdWZmZXIpIC8gc2l6ZW9mKHZvaWQqKTsKKyAgICBvdXRCdWZEZXNjLmJ1ZnMgICAgICAgICAgICAgID0gKHZvaWQqKikmb3V0QnVmZmVyOworICAgIG91dEJ1ZkRlc2MuYnVmZmVySWRlbnRpZmllcnMgPSBvdXRCdWZmZXJJZHM7CisgICAgb3V0QnVmRGVzYy5idWZTaXplcyAgICAgICAgICA9IG91dEJ1ZmZlclNpemU7CisgICAgb3V0QnVmRGVzYy5idWZFbFNpemVzICAgICAgICA9IG91dEJ1ZmZlckVsU2l6ZTsKKworICAgIEFBQ0VOQ19FUlJPUiBlbmNvZGVyRXJyID0gQUFDRU5DX09LOworCisgICAgY2xhc3MgRmlsbFdvcmsgeworICAgIHB1YmxpYzoKKyAgICAgICAgRmlsbFdvcmsodWludDMyX3QgZmxhZ3MsIEMyV29ya09yZGluYWxTdHJ1Y3Qgb3JkaW5hbCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKQorICAgICAgICAgICAgOiBtRmxhZ3MoZmxhZ3MpLCBtT3JkaW5hbChvcmRpbmFsKSwgbUJ1ZmZlcihidWZmZXIpIHsKKyAgICAgICAgfQorICAgICAgICB+RmlsbFdvcmsoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpbUZsYWdzOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gbU9yZGluYWw7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgICAgICAgICBpZiAobUJ1ZmZlcikgeworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhtQnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJ0aW1lc3RhbXAgPSAlbGxkLCBpbmRleCA9ICVsbGQsIHcvJXMgYnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgIG1PcmRpbmFsLnRpbWVzdGFtcC5wZWVrbGwoKSwKKyAgICAgICAgICAgICAgICAgIG1PcmRpbmFsLmZyYW1lSW5kZXgucGVla2xsKCksCisgICAgICAgICAgICAgICAgICBtQnVmZmVyID8gIiIgOiAibyIpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCB1aW50MzJfdCBtRmxhZ3M7CisgICAgICAgIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgbU9yZGluYWw7CisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gbUJ1ZmZlcjsKKyAgICB9OworCisgICAgQzJXb3JrT3JkaW5hbFN0cnVjdCBvdXRPcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKworICAgIHdoaWxlIChlbmNvZGVyRXJyID09IEFBQ0VOQ19PSyAmJiBpbmFyZ3MubnVtSW5TYW1wbGVzID4gMCkgeworICAgICAgICBpZiAobnVtRnJhbWVzICYmICFibG9jaykgeworICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmcsIHByb3BlciB1c2FnZSwgZXRjLgorICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhtT3V0QnVmZmVyU2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZmFpbGVkIDogZXJyID0gJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdWaWV3LnJlc2V0KG5ldyBDMldyaXRlVmlldyhibG9jay0+bWFwKCkuZ2V0KCkpKTsKKyAgICAgICAgICAgIG91dFB0ciA9IHdWaWV3LT5kYXRhKCk7CisgICAgICAgICAgICBvdXRBdmFpbGFibGUgPSB3Vmlldy0+c2l6ZSgpOworICAgICAgICAgICAgLS1udW1GcmFtZXM7CisgICAgICAgIH0KKworICAgICAgICBtZW1zZXQoJm91dGFyZ3MsIDAsIHNpemVvZihvdXRhcmdzKSk7CisKKyAgICAgICAgb3V0QnVmZmVyWzBdID0gb3V0UHRyOworICAgICAgICBvdXRCdWZmZXJTaXplWzBdID0gb3V0QXZhaWxhYmxlOworCisgICAgICAgIGVuY29kZXJFcnIgPSBhYWNFbmNFbmNvZGUobUFBQ0VuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQnVmRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QnVmRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRhcmdzKTsKKworICAgICAgICBpZiAoZW5jb2RlckVyciA9PSBBQUNFTkNfT0spIHsKKyAgICAgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgICAgICBvdXRPcmRpbmFsLmZyYW1lSW5kZXggPSBtT3V0SW5kZXgrKzsKKyAgICAgICAgICAgICAgICBvdXRPcmRpbmFsLnRpbWVzdGFtcCA9IG1JbnB1dFRpbWVVczsKKyAgICAgICAgICAgICAgICBjbG9uZUFuZFNlbmQoCisgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZpbGxXb3JrKEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUsIG91dE9yZGluYWwsIGJ1ZmZlcikpOworICAgICAgICAgICAgICAgIGJ1ZmZlci5yZXNldCgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAob3V0YXJncy5udW1PdXRCeXRlcyA+IDApIHsKKyAgICAgICAgICAgICAgICBtSW5wdXRTaXplID0gMDsKKyAgICAgICAgICAgICAgICBpbnQgY29uc3VtZWQgPSAoY2FwYWNpdHkgLyBzaXplb2YoaW50MTZfdCkpIC0gaW5hcmdzLm51bUluU2FtcGxlcworICAgICAgICAgICAgICAgICAgICAgICAgKyBvdXRhcmdzLm51bUluU2FtcGxlczsKKyAgICAgICAgICAgICAgICBtSW5wdXRUaW1lVXMgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcAorICAgICAgICAgICAgICAgICAgICAgICAgKyAoY29uc3VtZWQgKiAxMDAwMDAwbGwgLyBjaGFubmVsQ291bnQgLyBzYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIDAsIG91dGFyZ3MubnVtT3V0Qnl0ZXMpOworI2lmIGRlZmluZWQoTE9HX05ERUJVRykgJiYgIUxPR19OREVCVUcKKyAgICAgICAgICAgICAgICBoZXhkdW1wKG91dFB0ciwgc3RkOjptaW4ob3V0YXJncy5udW1PdXRCeXRlcywgMjU2KSk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICBvdXRQdHIgPSB0ZW1wOworICAgICAgICAgICAgICAgIG91dEF2YWlsYWJsZSA9IDA7CisgICAgICAgICAgICAgICAgYmxvY2sucmVzZXQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUlucHV0U2l6ZSArPSBvdXRhcmdzLm51bUluU2FtcGxlcyAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG91dGFyZ3MubnVtSW5TYW1wbGVzID4gMCkgeworICAgICAgICAgICAgICAgIGluQnVmZmVyWzBdID0gKGludDE2X3QgKilpbkJ1ZmZlclswXSArIG91dGFyZ3MubnVtSW5TYW1wbGVzOworICAgICAgICAgICAgICAgIGluQnVmZmVyU2l6ZVswXSAtPSBvdXRhcmdzLm51bUluU2FtcGxlcyAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgICAgICBpbmFyZ3MubnVtSW5TYW1wbGVzIC09IG91dGFyZ3MubnVtSW5TYW1wbGVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dWKCJlbmNvZGVyRXJyID0gJWQgbUlucHV0U2l6ZSA9ICV6dSBpbmFyZ3MubnVtSW5TYW1wbGVzID0gJWQsIG1JbnB1dFRpbWVVcyA9ICVsbGQiLAorICAgICAgICAgICAgICBlbmNvZGVyRXJyLCBtSW5wdXRTaXplLCBpbmFyZ3MubnVtSW5TYW1wbGVzLCBtSW5wdXRUaW1lVXMucGVla2xsKCkpOworICAgIH0KKworICAgIGlmIChlb3MgJiYgaW5CdWZmZXJTaXplWzBdID4gMCkgeworICAgICAgICBpZiAobnVtRnJhbWVzICYmICFibG9jaykgeworICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmcsIHByb3BlciB1c2FnZSwgZXRjLgorICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhtT3V0QnVmZmVyU2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZmFpbGVkIDogZXJyID0gJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdWaWV3LnJlc2V0KG5ldyBDMldyaXRlVmlldyhibG9jay0+bWFwKCkuZ2V0KCkpKTsKKyAgICAgICAgICAgIG91dFB0ciA9IHdWaWV3LT5kYXRhKCk7CisgICAgICAgICAgICBvdXRBdmFpbGFibGUgPSB3Vmlldy0+c2l6ZSgpOworICAgICAgICAgICAgLS1udW1GcmFtZXM7CisgICAgICAgIH0KKworICAgICAgICBtZW1zZXQoJm91dGFyZ3MsIDAsIHNpemVvZihvdXRhcmdzKSk7CisKKyAgICAgICAgb3V0QnVmZmVyWzBdID0gb3V0UHRyOworICAgICAgICBvdXRCdWZmZXJTaXplWzBdID0gb3V0QXZhaWxhYmxlOworCisgICAgICAgIC8vIEZsdXNoCisgICAgICAgIGluYXJncy5udW1JblNhbXBsZXMgPSAtMTsKKworICAgICAgICAodm9pZClhYWNFbmNFbmNvZGUobUFBQ0VuY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5CdWZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dEJ1ZkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5hcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dGFyZ3MpOworICAgIH0KKworICAgIG91dE9yZGluYWwuZnJhbWVJbmRleCA9IG1PdXRJbmRleCsrOworICAgIG91dE9yZGluYWwudGltZXN0YW1wID0gbUlucHV0VGltZVVzOworICAgIEZpbGxXb3JrKChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkoZW9zID8gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSA6IDApLAorICAgICAgICAgICAgIG91dE9yZGluYWwsIGJ1ZmZlcikod29yayk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFhY0VuYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIHN3aXRjaCAoZHJhaW5Nb2RlKSB7CisgICAgICAgIGNhc2UgRFJBSU5fQ09NUE9ORU5UX05PX0VPUzoKKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgY2FzZSBOT19EUkFJTjoKKyAgICAgICAgICAgIC8vIG5vLW9wCisgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgIGNhc2UgRFJBSU5fQ0hBSU46CisgICAgICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICAgICAgY2FzZSBEUkFJTl9DT01QT05FTlRfV0lUSF9FT1M6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgKHZvaWQpcG9vbDsKKyAgICBtU2VudENvZGVjU3BlY2lmaWNEYXRhID0gZmFsc2U7CisgICAgbUlucHV0VGltZVNldCA9IGZhbHNlOworICAgIG1JbnB1dFNpemUgPSAwdTsKKyAgICBtSW5wdXRUaW1lVXMgPSAwOworCisgICAgLy8gVE9ETzogd2UgZG9uJ3QgaGF2ZSBhbnkgcGVuZGluZyB3b3JrIGF0IHRoaXMgdGltZSB0byBkcmFpbi4KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdEFhY0VuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRBYWNFbmNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0QWFjRW5jKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEFhY0VuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEFhY0VuYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEFhY0VuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEFhY0VuY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEFhY0VuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0VuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0VuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzOGJlMTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRW5jLmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0FBQ19FTkNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FBQ19FTkNfSF8KKworI2luY2x1ZGUgPGF0b21pYz4KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJhYWNlbmNfbGliLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQzJTb2Z0QWFjRW5jIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKK3B1YmxpYzoKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEFhY0VuYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRBYWNFbmMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKworICAgIEhBTkRMRV9BQUNFTkNPREVSIG1BQUNFbmNvZGVyOworCisgICAgVUlOVCBtTnVtQnl0ZXNQZXJJbnB1dEZyYW1lOworICAgIFVJTlQgbU91dEJ1ZmZlclNpemU7CisKKyAgICBib29sIG1TZW50Q29kZWNTcGVjaWZpY0RhdGE7CisgICAgYm9vbCBtSW5wdXRUaW1lU2V0OworICAgIHNpemVfdCBtSW5wdXRTaXplOworICAgIGMyX2NudHI2NF90IG1JbnB1dFRpbWVVczsKKworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIHN0ZDo6YXRvbWljX3VpbnQ2NF90IG1PdXRJbmRleDsKKworICAgIHN0YXR1c190IGluaXRFbmNvZGVyKCk7CisKKyAgICBzdGF0dXNfdCBzZXRBdWRpb1BhcmFtcygpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0QWFjRW5jKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0FBQ19FTkNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9EcmNQcmVzTW9kZVdyYXAuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0RyY1ByZXNNb2RlV3JhcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI5YWViYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9EcmNQcmVzTW9kZVdyYXAuY3BwCkBAIC0wLDAgKzEsMzcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlICJEcmNQcmVzTW9kZVdyYXAuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEFhY0RyY1dyYXBwZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKy8vI2RlZmluZSBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKworI2RlZmluZSBHUE1fRU5DT0RFUl9UQVJHRVRfTEVWRUwgNjQKKyNkZWZpbmUgTUFYX1RBUkdFVF9MRVZFTCA0MAorCitDRHJjUHJlc01vZGVXcmFwcGVyOjpDRHJjUHJlc01vZGVXcmFwcGVyKCkKK3sKKyAgICBtRGF0YVVwZGF0ZSA9IHRydWU7CisKKyAgICAvKiBEYXRhIGZyb20gc3RyZWFtSW5mby4gKi8KKyAgICAvKiBJbml0aWFsaXplZCB0byB0aGUgc2FtZSB2YWx1ZXMgYXMgaW4gdGhlIGFhYyBkZWNvZGVyICovCisgICAgbVN0cmVhbVBSTCA9IC0xOworICAgIG1TdHJlYW1EUkNQcmVzTW9kZSA9IC0xOworICAgIG1TdHJlYW1OckFBQ0NoYW4gPSAwOworICAgIG1TdHJlYW1Ock91dENoYW4gPSAwOworCisgICAgLyogRGVzaXJlZCB2YWx1ZXMgKHNldCBieSB1c2VyKS4gKi8KKyAgICAvKiBJbml0aWFsaXplZCB0byB0aGUgc2FtZSB2YWx1ZXMgYXMgaW4gdGhlIGFhYyBkZWNvZGVyICovCisgICAgbURlc1RhcmdldCA9IC0xOworICAgIG1EZXNBdHRGYWN0b3IgPSAwOworICAgIG1EZXNCb29zdEZhY3RvciA9IDA7CisgICAgbURlc0hlYXZ5ID0gMDsKKworICAgIG1FbmNvZGVyVGFyZ2V0ID0gLTE7CisKKyAgICAvKiBWYWx1ZXMgZnJvbSBsYXN0IHRpbWUuICovCisgICAgLyogSW5pdGlhbGl6ZWQgdG8gdGhlIHNhbWUgdmFsdWVzIGFzIHRoZSBkZXNpcmVkIHZhbHVlcyAqLworICAgIG1MYXN0VGFyZ2V0ID0gLTE7CisgICAgbUxhc3RBdHRGYWN0b3IgPSAwOworICAgIG1MYXN0Qm9vc3RGYWN0b3IgPSAwOworICAgIG1MYXN0SGVhdnkgPSAwOworfQorCitDRHJjUHJlc01vZGVXcmFwcGVyOjp+Q0RyY1ByZXNNb2RlV3JhcHBlcigpCit7Cit9CisKK3ZvaWQKK0NEcmNQcmVzTW9kZVdyYXBwZXI6OnNldERlY29kZXJIYW5kbGUoY29uc3QgSEFORExFX0FBQ0RFQ09ERVIgaGFuZGxlKQoreworICAgIG1IYW5kbGVEZWNvZGVyID0gaGFuZGxlOworfQorCit2b2lkCitDRHJjUHJlc01vZGVXcmFwcGVyOjpzdWJtaXRTdHJlYW1EYXRhKENTdHJlYW1JbmZvKiBwU3RyZWFtSW5mbykKK3sKKyAgICBhc3NlcnQocFN0cmVhbUluZm8pOworCisgICAgaWYgKG1TdHJlYW1QUkwgIT0gcFN0cmVhbUluZm8tPmRyY1Byb2dSZWZMZXYpIHsKKyAgICAgICAgbVN0cmVhbVBSTCA9IHBTdHJlYW1JbmZvLT5kcmNQcm9nUmVmTGV2OworICAgICAgICBtRGF0YVVwZGF0ZSA9IHRydWU7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogZHJjUHJvZ1JlZkxldiBpcyAlZFxuIiwgbVN0cmVhbVBSTCk7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAobVN0cmVhbURSQ1ByZXNNb2RlICE9IHBTdHJlYW1JbmZvLT5kcmNQcmVzTW9kZSkgeworICAgICAgICBtU3RyZWFtRFJDUHJlc01vZGUgPSBwU3RyZWFtSW5mby0+ZHJjUHJlc01vZGU7CisgICAgICAgIG1EYXRhVXBkYXRlID0gdHJ1ZTsKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBkcmNQcmVzTW9kZSBpcyAlZFxuIiwgbVN0cmVhbURSQ1ByZXNNb2RlKTsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChtU3RyZWFtTnJBQUNDaGFuICE9IHBTdHJlYW1JbmZvLT5hYWNOdW1DaGFubmVscykgeworICAgICAgICBtU3RyZWFtTnJBQUNDaGFuID0gcFN0cmVhbUluZm8tPmFhY051bUNoYW5uZWxzOworICAgICAgICBtRGF0YVVwZGF0ZSA9IHRydWU7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogYWFjTnVtQ2hhbm5lbHMgaXMgJWRcbiIsIG1TdHJlYW1OckFBQ0NoYW4pOworI2VuZGlmCisgICAgfQorCisgICAgaWYgKG1TdHJlYW1Ock91dENoYW4gIT0gcFN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSB7CisgICAgICAgIG1TdHJlYW1Ock91dENoYW4gPSBwU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisgICAgICAgIG1EYXRhVXBkYXRlID0gdHJ1ZTsKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBudW1DaGFubmVscyBpcyAlZFxuIiwgbVN0cmVhbU5yT3V0Q2hhbik7CisjZW5kaWYKKyAgICB9CisKKworCisgICAgaWYgKG1TdHJlYW1Ock91dENoYW48bVN0cmVhbU5yQUFDQ2hhbikgeworICAgICAgICBtSXNEb3dubWl4ID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtSXNEb3dubWl4ID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1Jc0Rvd25taXggJiYgKG1TdHJlYW1Ock91dENoYW4gPT0gMSkpIHsKKyAgICAgICAgbUlzTW9ub0Rvd25taXggPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Jc01vbm9Eb3dubWl4ID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1Jc0Rvd25taXggJiYgbVN0cmVhbU5yT3V0Q2hhbiA9PSAyKXsKKyAgICAgICAgbUlzU3RlcmVvRG93bm1peCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUlzU3RlcmVvRG93bm1peCA9IGZhbHNlOworICAgIH0KKworfQorCit2b2lkCitDRHJjUHJlc01vZGVXcmFwcGVyOjpzZXRQYXJhbShjb25zdCBEUkNfUFJFU19NT0RFX1dSQVBfUEFSQU0gcGFyYW0sIGNvbnN0IGludCB2YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgY2FzZSBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9UQVJHRVQ6CisgICAgICAgIG1EZXNUYXJnZXQgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9BVFRfRkFDVE9SOgorICAgICAgICBtRGVzQXR0RmFjdG9yID0gdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQk9PU1RfRkFDVE9SOgorICAgICAgICBtRGVzQm9vc3RGYWN0b3IgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9IRUFWWToKKyAgICAgICAgbURlc0hlYXZ5ID0gdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX1BSRVNfTU9ERV9XUkFQX0VOQ09ERVJfVEFSR0VUOgorICAgICAgICBtRW5jb2RlclRhcmdldCA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgbURhdGFVcGRhdGUgPSB0cnVlOworfQorCit2b2lkCitDRHJjUHJlc01vZGVXcmFwcGVyOjp1cGRhdGUoKQoreworICAgIC8vIEdldCBEYXRhIGZyb20gRGVjb2RlcgorICAgIGludCBwcm9nUmVmTGV2ZWwgPSBtU3RyZWFtUFJMOworICAgIGludCBkcmNQcmVzTW9kZSA9IG1TdHJlYW1EUkNQcmVzTW9kZTsKKworICAgIC8vIGJ5IGRlZmF1bHQsIGRvIGFzIGRlc2lyZWQKKyAgICBpbnQgbmV3VGFyZ2V0ICAgICAgICAgPSBtRGVzVGFyZ2V0OworICAgIGludCBuZXdBdHRGYWN0b3IgICAgICA9IG1EZXNBdHRGYWN0b3I7CisgICAgaW50IG5ld0Jvb3N0RmFjdG9yICAgID0gbURlc0Jvb3N0RmFjdG9yOworICAgIGludCBuZXdIZWF2eSAgICAgICAgICA9IG1EZXNIZWF2eTsKKworICAgIGlmIChtRGF0YVVwZGF0ZSkgeworICAgICAgICAvLyBzYW5pdHkgY2hlY2sKKyAgICAgICAgaWYgKG1EZXNUYXJnZXQgPCBNQVhfVEFSR0VUX0xFVkVMKXsKKyAgICAgICAgICAgIG1EZXNUYXJnZXQgPSBNQVhfVEFSR0VUX0xFVkVMOyAgLy8gbGltaXQgdGFyZ2V0IGxldmVsIHRvIC0xMCBkQiBvciBiZWxvdworICAgICAgICAgICAgbmV3VGFyZ2V0ID0gTUFYX1RBUkdFVF9MRVZFTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRW5jb2RlclRhcmdldCAhPSAtMSkgeworICAgICAgICAgICAgaWYgKG1EZXNUYXJnZXQ8MTI0KSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IC0zMSBkQgorICAgICAgICAgICAgICAgIGlmICgobUlzU3RlcmVvRG93bm1peCA9PSBmYWxzZSkgJiYgKG1Jc01vbm9Eb3dubWl4ID09IGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBubyBzdGVyZW8gb3IgbW9ubyBkb3dubWl4aW5nLCBjYWxjdWxhdGVkIHNjYWxpbmcgb2YgbGlnaHQgRFJDCisgICAgICAgICAgICAgICAgICAgIC8qIHVzZSBhcyBsaXR0bGUgY29tcHJlc3Npb24gYXMgcG9zc2libGUgKi8KKyAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbmV3Qm9vc3RGYWN0b3IgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAobURlc1RhcmdldDxwcm9nUmVmTGV2ZWwpIHsgLy8gaWYgdGFyZ2V0IGxldmVsID4gUFJMCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUVuY29kZXJUYXJnZXQgPCBtRGVzVGFyZ2V0KSB7IC8vIGlmIG1FbmNvZGVyVGFyZ2V0ID4gdGFyZ2V0IGxldmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUVuY29kZXJUYXJnZXQgPiB0YXJnZXQgbGV2ZWwgPiBQUkwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FsY0ZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjYWxjRmFjdG9yX25vcm07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMC4wZiA8IGNhbGNGYWN0b3Jfbm9ybSA8IDEuMGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjRmFjdG9yX25vcm0gPSAoZmxvYXQpKG1EZXNUYXJnZXQgLSBwcm9nUmVmTGV2ZWwpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCkobUVuY29kZXJUYXJnZXQgLSBwcm9nUmVmTGV2ZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNGYWN0b3IgPSAoaW50KShjYWxjRmFjdG9yX25vcm0qMTI3LjBmKTsgLy8gMCA8PSBjYWxjRmFjdG9yIDwgMTI3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsY0ZhY3RvciBpcyB0aGUgbG93ZXIgbGltaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAoY2FsY0ZhY3Rvcj5uZXdBdHRGYWN0b3IpID8gY2FsY0ZhY3RvciA6IG5ld0F0dEZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXcgQXR0RmFjdG9yIHdpbGwgYmUgYWx3YXlzID0gY2FsY0ZhY3RvciwgYXMgaXQgaXMgc2V0IHRvIDAgYmVmb3JlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Jvb3N0RmFjdG9yID0gbmV3QXR0RmFjdG9yOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0YXJnZXQgbGV2ZWwgPiBtRW5jb2RlclRhcmdldCA+IFBSTCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld1RETGltaXRlckVuYWJsZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRpbWUgZG9tYWluIGxpbWl0ZXIgbXVzdCBhbHdheXMgYmUgYWN0aXZlIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZXdvcmsgYWN0aXZhdGVzIGl0IGJ5IGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Qm9vc3RGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRhcmdldCBsZXZlbCA8PSBQUkwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHJlc3RyaWN0aW9ucyByZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3QXR0RmFjdG9yID0gbmV3QXR0RmFjdG9yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gZG93bm1peGluZworICAgICAgICAgICAgICAgICAgICAvLyBpZiB0YXJnZXQgbGV2ZWwgPiAtMjMgZEIgb3IgbW9ubyBkb3dubWl4CisgICAgICAgICAgICAgICAgICAgIGlmICggKG1EZXNUYXJnZXQ8OTIpIHx8IG1Jc01vbm9Eb3dubWl4ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnkgPSAxOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgcGVyZm9ybSBhIGRvd25taXgsIHNvLCB3ZSBuZWVkIGF0IGxlYXN0IGZ1bGwgbGlnaHQgRFJDCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeyAvLyB0YXJnZXQgbGV2ZWwgPD0gLTMxIGRCCisgICAgICAgICAgICAgICAgLy8gcGxheWJhY2sgLTMxIGRCOiBsaWdodCBEUkMgb25seSBuZWVkZWQgaWYgd2UgcGVyZm9ybSBkb3dubWl4aW5nCisgICAgICAgICAgICAgICAgaWYgKG1Jc0Rvd25taXgpIHsgICAvLyB3ZSBkbyBkb3dubWl4aW5nCisgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7IC8vIGhhbmRsZSBvdGhlciB1c2VkIGVuY29kZXIgdGFyZ2V0IGxldmVscworCisgICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2s6IERSQyBwcmVzZW50YXRpb24gbW9kZSBpcyBvbmx5IHNwZWNpZmllZCBmb3IgbWF4LiA1LjEgY2hhbm5lbHMKKyAgICAgICAgICAgIGlmIChtU3RyZWFtTnJBQUNDaGFuID4gNikgeworICAgICAgICAgICAgICAgIGRyY1ByZXNNb2RlID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChkcmNQcmVzTW9kZSkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZGVmYXVsdDogLy8gcHJlc2VudGF0aW9uIG1vZGUgbm90IGluZGljYXRlZAorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgaWYgKG1EZXNUYXJnZXQ8MTI0KSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICAvLyBubyBzdGVyZW8gb3IgbW9ubyBkb3dubWl4aW5nCisgICAgICAgICAgICAgICAgICAgIGlmICgobUlzU3RlcmVvRG93bm1peCA9PSBmYWxzZSkgJiYgKG1Jc01vbm9Eb3dubWl4ID09IGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1EZXNUYXJnZXQ8cHJvZ1JlZkxldmVsKSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IFBSTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld1RETGltaXRlckVuYWJsZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRpbWUgZG9tYWluIGxpbWl0ZXIgbXVzdCBhbHdheXMgYmUgYWN0aXZlIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGZyYW1ld29yayBhY3RpdmF0ZXMgaXQgYnkgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsgLy8gYXQgbGVhc3QsIHVzZSBsaWdodCBjb21wcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGFyZ2V0IGxldmVsIDw9IFBSTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHJlc3RyaWN0aW9ucyByZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld0F0dEZhY3RvciA9IG5ld0F0dEZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gZG93bm1peGluZworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3VERMaW1pdGVyRW5hYmxlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0aW1lIGRvbWFpbiBsaW1pdGVyIG11c3QgYWx3YXlzIGJlIGFjdGl2ZSBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGZyYW1ld29yayBhY3RpdmF0ZXMgaXQgYnkgZGVmYXVsdAorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0YXJnZXQgbGV2ZWwgPiAtMjMgZEIgb3IgbW9ubyBkb3dubWl4CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChtRGVzVGFyZ2V0IDwgOTIpIHx8IG1Jc01vbm9Eb3dubWl4ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBwZXJmb3JtIGEgZG93bm1peCwgc28sIHdlIG5lZWQgYXQgbGVhc3QgZnVsbCBsaWdodCBEUkMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyB0YXJnZXQgbGV2ZWwgPD0gLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIGlmIChtSXNEb3dubWl4KSB7ICAgLy8gd2UgZG8gZG93bm1peGluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld1RETGltaXRlckVuYWJsZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGltZSBkb21haW4gbGltaXRlciBtdXN0IGFsd2F5cyBiZSBhY3RpdmUgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZXdvcmsgYWN0aXZhdGVzIGl0IGJ5IGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyBQcmVzZW50YXRpb24gbW9kZSAxIGFuZCAyIGFjY29yZGluZyB0byBFVFNJIFRTIDEwMSAxNTQ6CisgICAgICAgICAgICAvLyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyAoRFZCKTsgU3BlY2lmaWNhdGlvbiBmb3IgdGhlIHVzZSBvZiBWaWRlbyBhbmQgQXVkaW8gQ29kaW5nCisgICAgICAgICAgICAvLyBpbiBCcm9hZGNhc3RpbmcgQXBwbGljYXRpb25zIGJhc2VkIG9uIHRoZSBNUEVHLTIgVHJhbnNwb3J0IFN0cmVhbSwKKyAgICAgICAgICAgIC8vIHNlY3Rpb24gQy41LjQuLCAiRGVjb2RpbmciLCBhbmQgVGFibGUgQy4zMworICAgICAgICAgICAgLy8gSVNPIERSQyAgICAgICAgICAgIC0+IG5ld0hlYXZ5ID0gMCAgKFVzZSBsaWdodCBjb21wcmVzc2lvbiwgTVBFRy1zdHlsZSkKKyAgICAgICAgICAgIC8vIENvbXByZXNzaW9uX3ZhbHVlICAtPiBuZXdIZWF2eSA9IDEgIChVc2UgaGVhdnkgY29tcHJlc3Npb24sIERWQi1zdHlsZSkKKyAgICAgICAgICAgIC8vIHNjYWxpbmcgcmVzdHJpY3RlZCAtPiBuZXdBdHRGYWN0b3IgPSAxMjcKKworICAgICAgICAgICAgY2FzZSAxOiAvLyBwcmVzZW50YXRpb24gbW9kZSAxLCBMaWdodDotMzEvSGVhdnk6LTIzCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1EZXNUYXJnZXQgPCAxMjQpIHsgLy8gaWYgdGFyZ2V0IGxldmVsID4gLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIC8vIHBsYXliYWNrIHVwIHRvIC0yMyBkQgorICAgICAgICAgICAgICAgICAgICBuZXdIZWF2eSA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGFyZ2V0IGxldmVsIDw9IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICAvLyBwbGF5YmFjayAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc0Rvd25taXgpIHsgICAvLyB3ZSBkbyBkb3dubWl4aW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMjogLy8gcHJlc2VudGF0aW9uIG1vZGUgMiwgTGlnaHQ6LTIzL0hlYXZ5Oi0yMworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0IDwgMTI0KSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICAvLyBwbGF5YmFjayB1cCB0byAtMjMgZEIKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc01vbm9Eb3dubWl4KSB7IC8vIGlmIG1vbm8gZG93bm1peAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnkgPSAxOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGFyZ2V0IGxldmVsIDw9IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICAvLyBwbGF5YmFjayAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnkgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAobUlzRG93bm1peCkgeyAgIC8vIHdlIGRvIGRvd25taXhpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfSAvLyBzd2l0Y2goKQorICAgICAgICB9IC8vIGlmIChtRW5jb2RlclRhcmdldCAgPT0gR1BNX0VOQ09ERVJfVEFSR0VUX0xFVkVMKQorCisgICAgICAgIC8vIHNhbml0eSBhZ2FpbgorICAgICAgICBpZiAobmV3SGVhdnkgPT0gMSkgeworICAgICAgICAgICAgbmV3Qm9vc3RGYWN0b3I9MTI3OyAvLyBub3QgcmVhbGx5IG5lZWRlZCBhcyB0aGUgc2FtZSB3b3VsZCBiZSBkb25lIGJ5IHRoZSBkZWNvZGVyIGFueXdheQorICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICB9CisKKyAgICAgICAgLy8gdXBkYXRlIHRoZSBkZWNvZGVyCisgICAgICAgIGlmIChuZXdUYXJnZXQgIT0gbUxhc3RUYXJnZXQpIHsKKyAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUhhbmRsZURlY29kZXIsIEFBQ19EUkNfUkVGRVJFTkNFX0xFVkVMLCBuZXdUYXJnZXQpOworICAgICAgICAgICAgbUxhc3RUYXJnZXQgPSBuZXdUYXJnZXQ7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgICAgICBpZiAobmV3VGFyZ2V0ICE9IG1EZXNUYXJnZXQpCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBmb3JjZWQgdGFyZ2V0IGxldmVsIHRvICVkIChmcm9tICVkKVxuIiwgbmV3VGFyZ2V0LCBtRGVzVGFyZ2V0KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IHNldCB0YXJnZXQgbGV2ZWwgdG8gJWRcbiIsIG5ld1RhcmdldCk7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZXdBdHRGYWN0b3IgIT0gbUxhc3RBdHRGYWN0b3IpIHsKKyAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUhhbmRsZURlY29kZXIsIEFBQ19EUkNfQVRURU5VQVRJT05fRkFDVE9SLCBuZXdBdHRGYWN0b3IpOworICAgICAgICAgICAgbUxhc3RBdHRGYWN0b3IgPSBuZXdBdHRGYWN0b3I7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgICAgICBpZiAobmV3QXR0RmFjdG9yICE9IG1EZXNBdHRGYWN0b3IpCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBmb3JjZWQgYXR0ZW51YXRpb24gZmFjdG9yIHRvICVkIChmcm9tICVkKVxuIiwgbmV3QXR0RmFjdG9yLCBtRGVzQXR0RmFjdG9yKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IHNldCBhdHRlbnVhdGlvbiBmYWN0b3IgdG8gJWRcbiIsIG5ld0F0dEZhY3Rvcik7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZXdCb29zdEZhY3RvciAhPSBtTGFzdEJvb3N0RmFjdG9yKSB7CisgICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1IYW5kbGVEZWNvZGVyLCBBQUNfRFJDX0JPT1NUX0ZBQ1RPUiwgbmV3Qm9vc3RGYWN0b3IpOworICAgICAgICAgICAgbUxhc3RCb29zdEZhY3RvciA9IG5ld0Jvb3N0RmFjdG9yOworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICAgICAgaWYgKG5ld0Jvb3N0RmFjdG9yICE9IG1EZXNCb29zdEZhY3RvcikKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGZvcmNlZCBib29zdCBmYWN0b3IgdG8gJWQgKGZyb20gJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3Qm9vc3RGYWN0b3IsIG1EZXNCb29zdEZhY3Rvcik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBzZXQgYm9vc3QgZmFjdG9yIHRvICVkXG4iLCBuZXdCb29zdEZhY3Rvcik7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZXdIZWF2eSAhPSBtTGFzdEhlYXZ5KSB7CisgICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1IYW5kbGVEZWNvZGVyLCBBQUNfRFJDX0hFQVZZX0NPTVBSRVNTSU9OLCBuZXdIZWF2eSk7CisgICAgICAgICAgICBtTGFzdEhlYXZ5ID0gbmV3SGVhdnk7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgICAgICBpZiAobmV3SGVhdnkgIT0gbURlc0hlYXZ5KQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogZm9yY2VkIGhlYXZ5IGNvbXByZXNzaW9uIHRvICVkIChmcm9tICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5LCBtRGVzSGVhdnkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogc2V0IGhlYXZ5IGNvbXByZXNzaW9uIHRvICVkXG4iLCBuZXdIZWF2eSk7CisjZW5kaWYKKyAgICAgICAgfQorCisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgIEFMT0dWKCJEUkMgY29uZmlnOiB0Z3RfbGV2OiAlM2QsIGN1dDogJTNkLCBib29zdDogJTNkLCBoZWF2eTogJWRcbiIsIG5ld1RhcmdldCwKKyAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IsIG5ld0Jvb3N0RmFjdG9yLCBuZXdIZWF2eSk7CisjZW5kaWYKKyAgICAgICAgbURhdGFVcGRhdGUgPSBmYWxzZTsKKworICAgIH0gLy8gaWYgKG1EYXRhVXBkYXRlKQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0RyY1ByZXNNb2RlV3JhcC5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0RyY1ByZXNNb2RlV3JhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYjZjZjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvRHJjUHJlc01vZGVXcmFwLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKyNpbmNsdWRlICJhYWNkZWNvZGVyX2xpYi5oIgorCit0eXBlZGVmIGVudW0KK3sKKyAgICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9UQVJHRVQgICAgICAgICA9IDB4MDAwMCwKKyAgICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9BVFRfRkFDVE9SICAgICA9IDB4MDAwMSwKKyAgICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9CT09TVF9GQUNUT1IgICA9IDB4MDAwMiwKKyAgICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9IRUFWWSAgICAgICAgICA9IDB4MDAwMywKKyAgICBEUkNfUFJFU19NT0RFX1dSQVBfRU5DT0RFUl9UQVJHRVQgICAgICAgICA9IDB4MDAwNAorfSBEUkNfUFJFU19NT0RFX1dSQVBfUEFSQU07CisKKworY2xhc3MgQ0RyY1ByZXNNb2RlV3JhcHBlciB7CitwdWJsaWM6CisgICAgQ0RyY1ByZXNNb2RlV3JhcHBlcigpOworICAgIH5DRHJjUHJlc01vZGVXcmFwcGVyKCk7CisgICAgdm9pZCBzZXREZWNvZGVySGFuZGxlKGNvbnN0IEhBTkRMRV9BQUNERUNPREVSIGhhbmRsZSk7CisgICAgdm9pZCBzZXRQYXJhbShjb25zdCBEUkNfUFJFU19NT0RFX1dSQVBfUEFSQU0gcGFyYW0sIGNvbnN0IGludCB2YWx1ZSk7CisgICAgdm9pZCBzdWJtaXRTdHJlYW1EYXRhKENTdHJlYW1JbmZvKik7CisgICAgdm9pZCB1cGRhdGUoKTsKKworcHJvdGVjdGVkOgorICAgIEhBTkRMRV9BQUNERUNPREVSIG1IYW5kbGVEZWNvZGVyOworICAgIGludCBtRGVzVGFyZ2V0OworICAgIGludCBtRGVzQXR0RmFjdG9yOworICAgIGludCBtRGVzQm9vc3RGYWN0b3I7CisgICAgaW50IG1EZXNIZWF2eTsKKworICAgIGludCBtRW5jb2RlclRhcmdldDsKKworICAgIGludCBtTGFzdFRhcmdldDsKKyAgICBpbnQgbUxhc3RBdHRGYWN0b3I7CisgICAgaW50IG1MYXN0Qm9vc3RGYWN0b3I7CisgICAgaW50IG1MYXN0SGVhdnk7CisKKyAgICBTQ0hBUiBtU3RyZWFtUFJMOworICAgIFNDSEFSIG1TdHJlYW1EUkNQcmVzTW9kZTsKKyAgICBJTlQgbVN0cmVhbU5yQUFDQ2hhbjsKKyAgICBJTlQgbVN0cmVhbU5yT3V0Q2hhbjsKKworICAgIGJvb2wgbUlzRG93bm1peDsKKyAgICBib29sIG1Jc01vbm9Eb3dubWl4OworICAgIGJvb2wgbUlzU3RlcmVvRG93bm1peDsKKworICAgIGJvb2wgbURhdGFVcGRhdGU7Cit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29tbW9uX3RpbWUvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9jb21tb25fdGltZS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnJlbmFtZSB0byBtZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29tbW9uX3RpbWUvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvY29tbW9uX3RpbWUvTk9USUNFCnJlbmFtZSB0byBtZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvTk9USUNFCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvcGF0ZW50X2Rpc2NsYWltZXIudHh0IGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL3BhdGVudF9kaXNjbGFpbWVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGJmMTFkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL3BhdGVudF9kaXNjbGFpbWVyLnR4dApAQCAtMCwwICsxLDkgQEAKKworVEhJUyBJUyBOT1QgQSBHUkFOVCBPRiBQQVRFTlQgUklHSFRTLgorCitHb29nbGUgbWFrZXMgbm8gcmVwcmVzZW50YXRpb24gb3Igd2FycmFudHkgdGhhdCB0aGUgY29kZWNzIGZvciB3aGljaAorc291cmNlIGNvZGUgaXMgbWFkZSBhdmFpbGFibGUgaGVyZXVuZGVyIGFyZSB1bmVuY3VtYmVyZWQgYnkKK3RoaXJkLXBhcnR5IHBhdGVudHMuICBUaG9zZSBpbnRlbmRpbmcgdG8gdXNlIHRoaXMgc291cmNlIGNvZGUgaW4KK2hhcmR3YXJlIG9yIHNvZnR3YXJlIHByb2R1Y3RzIGFyZSBhZHZpc2VkIHRoYXQgaW1wbGVtZW50YXRpb25zIG9mCit0aGVzZSBjb2RlY3MsIGluY2x1ZGluZyBpbiBvcGVuIHNvdXJjZSBzb2Z0d2FyZSBvciBzaGFyZXdhcmUsIG1heQorcmVxdWlyZSBwYXRlbnQgbGljZW5zZXMgZnJvbSB0aGUgcmVsZXZhbnQgcGF0ZW50IGhvbGRlcnMuCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMjViYzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQW5kcm9pZC5icApAQCAtMCwwICsxLDc3IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2Ftcm5iZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRBbXJEZWMuY3BwIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EQU1STkIiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJkZWMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1yd2JkZWMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2FtcndiZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRBbXJEZWMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJkZWMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1yd2JkZWMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2Ftcm5iZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRBbXJOYkVuYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYmVuYyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYW1yd2JlbmMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEFtcldiRW5jLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2FtcndiZW5jIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VuY19jb21tb24iLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NzhhZDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yRGVjLmNwcApAQCAtMCwwICsxLDQzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpZmRlZiBBTVJOQgorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRBbXJOYkRlYyIKKyNlbHNlCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEFtcldiRGVjIgorI2VuZGlmCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdEFtckRlYy5oIgorI2luY2x1ZGUgImdzbWFtcl9kZWMuaCIKKyNpbmNsdWRlICJwdmFtcndiZGVjb2Rlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKKyNpZmRlZiBBTVJOQgorICBjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuYW1ybmIuZGVjb2RlciI7CisjZWxzZQorICBjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuYW1yd2IuZGVjb2RlciI7CisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlCisKK2NsYXNzIEMyU29mdEFtckRlYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fQVVESU8sCisjaWZkZWYgQU1STkIKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIKKyNlbHNlCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCCisjZW5kaWYKKyAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOworICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZygKKyAgICAgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisjaWZkZWYgQU1STkIKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgODAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmVxdWFsVG8oODAwMCl9KQorI2Vsc2UKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgMTYwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5lcXVhbFRvKDE2MDAwKX0pCisjZW5kaWYKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5lcXVhbFRvKDEpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyNpZmRlZiBBTVJOQgorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQoMHUsIDQ3NTApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDQ3NTAsIDEyMjAwKX0pCisjZWxzZQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQoMHUsIDY2MDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDY2MDAsIDIzODUwKX0pCisjZW5kaWYKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA4MTkyKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ+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+CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0QW1yRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEFtckRlYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRBbXJEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7Citwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTnVtU2FtcGxlc1BlckZyYW1lTkIgICA9IDE2MCwKKyAgICAgICAga051bVNhbXBsZXNQZXJGcmFtZVdCICAgPSAzMjAsCisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgdm9pZCAqbUFtckhhbmRsZTsKKyAgICB2b2lkICptRGVjb2RlckJ1ZjsKKyAgICBpbnQxNl90ICptRGVjb2RlckNvb2tpZTsKKworICAgIGludDE2X3QgbUlucHV0U2FtcGxlQnVmZmVyWzQ3N107CisKKyAgICBib29sIG1Jc1dpZGU7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworCisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEFtckRlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9BTVJfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yTmJFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmQ4Y2I2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmNwcApAQCAtMCwwICsxLDM0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0QW1yTmJFbmMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdEFtck5iRW5jLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmFtcm5iLmVuY29kZXIiOworCit9ICAvLyBuYW1lc3BhY2UKKworCitjbGFzcyBDMlNvZnRBbXJOYkVuYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fQVVESU8sCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoCisgICAgICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmVxdWFsVG8oMSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQoMHUsIDgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5lcXVhbFRvKDgwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0KDB1LCA0NzUwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg0NzUwLCAxMjIwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDgxOTIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBnZXRTYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbVNhbXBsZVJhdGUtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0Q2hhbm5lbENvdW50KCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxDb3VudC0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRCaXRyYXRlKCkgY29uc3QgeyByZXR1cm4gbUJpdHJhdGUtPnZhbHVlOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRBbXJOYkVuYzo6QzJTb2Z0QW1yTmJFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1FbmNTdGF0ZShudWxscHRyKSwKKyAgICAgIG1TaWRTdGF0ZShudWxscHRyKSB7Cit9CisKK0MyU29mdEFtck5iRW5jOjp+QzJTb2Z0QW1yTmJFbmMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtck5iRW5jOjpvbkluaXQoKSB7CisgICAgYm9vbCBkdHhfZW5hYmxlID0gZmFsc2U7CisKKyAgICBpZiAoQU1SRW5jb2RlSW5pdCgmbUVuY1N0YXRlLCAmbVNpZFN0YXRlLCBkdHhfZW5hYmxlKSAhPSAwKQorICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIC8vIFRPRE86IGdldCBtb2RlIGRpcmVjdGx5IGZyb20gY29uZmlnCisgICAgc3dpdGNoKG1JbnRmLT5nZXRCaXRyYXRlKCkpIHsKKyAgICAgICAgY2FzZSA0NzUwOiBtTW9kZSA9IE1SNDc1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNTE1MDogbU1vZGUgPSBNUjUxNTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDU5MDA6IG1Nb2RlID0gTVI1OTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDY3MDA6IG1Nb2RlID0gTVI2NzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc0MDA6IG1Nb2RlID0gTVI3NDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDc5NTA6IG1Nb2RlID0gTVI3OTU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxMDIwMDogbU1vZGUgPSBNUjEwMjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEyMjAwOiBtTW9kZSA9IE1SMTIyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IG1Nb2RlID0gTVI3OTU7CisgICAgfQorICAgIG1Jc0ZpcnN0ID0gdHJ1ZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDA7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwOworICAgIG1GaWxsZWRMZW4gPSAwOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEFtck5iRW5jOjpvblJlbGVhc2UoKSB7CisgICAgaWYgKG1FbmNTdGF0ZSkgeworICAgICAgICBBTVJFbmNvZGVFeGl0KCZtRW5jU3RhdGUsICZtU2lkU3RhdGUpOworICAgICAgICBtRW5jU3RhdGUgPSBtU2lkU3RhdGUgPSBudWxscHRyOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yTmJFbmM6Om9uU3RvcCgpIHsKKyAgICBpZiAoQU1SRW5jb2RlUmVzZXQobUVuY1N0YXRlLCBtU2lkU3RhdGUpICE9IDApCisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgbUlzRmlyc3QgPSB0cnVlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDA7CisgICAgbUZpbGxlZExlbiA9IDA7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QW1yTmJFbmM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpIG9uU3RvcCgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBbXJOYkVuYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCit2b2lkIEMyU29mdEFtck5iRW5jOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICBpblNpemUsIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCB3b3JrLT5pbnB1dC5mbGFncyk7CisKKyAgICBzaXplX3Qgb3V0Q2FwYWNpdHkgPSBrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lOworICAgIG91dENhcGFjaXR5ICs9IG1GaWxsZWRMZW4gKyBpblNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IG91dHB1dEJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKG91dENhcGFjaXR5LCB1c2FnZSwgJm91dHB1dEJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gb3V0cHV0QmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHVpbnQ2NF90IG91dFRpbWVTdGFtcCA9CisgICAgICAgIG1Qcm9jZXNzZWRTYW1wbGVzICogMTAwMDAwMGxsIC8gbUludGYtPmdldFNhbXBsZVJhdGUoKTsKKyAgICBzaXplX3QgaW5Qb3MgPSAwOworICAgIHNpemVfdCBvdXRQb3MgPSAwOworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBjb25zdCB1aW50OF90ICppblB0ciA9IHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0OworICAgICAgICBpbnQgdmFsaWRTYW1wbGVzID0gbUZpbGxlZExlbiAvIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgaWYgKChpblBvcyArIChrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbikpIDw9IGluU2l6ZSkgeworICAgICAgICAgICAgbWVtY3B5KG1JbnB1dEZyYW1lICsgdmFsaWRTYW1wbGVzLCBpblB0ciArIGluUG9zLAorICAgICAgICAgICAgICAgICAgIChrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbikpOworICAgICAgICAgICAgaW5Qb3MgKz0gKGtOdW1CeXRlc1BlcklucHV0RnJhbWUgLSBtRmlsbGVkTGVuKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lbWNweShtSW5wdXRGcmFtZSArIHZhbGlkU2FtcGxlcywgaW5QdHIgKyBpblBvcywgKGluU2l6ZSAtIGluUG9zKSk7CisgICAgICAgICAgICBtRmlsbGVkTGVuICs9IChpblNpemUgLSBpblBvcyk7CisgICAgICAgICAgICBpblBvcyArPSAoaW5TaXplIC0gaW5Qb3MpOworICAgICAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgICAgIHZhbGlkU2FtcGxlcyA9IG1GaWxsZWRMZW4gLyBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICAgICAgbWVtc2V0KG1JbnB1dEZyYW1lICsgdmFsaWRTYW1wbGVzLCAwLCAoa051bUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW4pKTsKKyAgICAgICAgICAgIH0gZWxzZSBicmVhazsKKworICAgICAgICB9CisgICAgICAgIEZyYW1lX1R5cGVfM0dQUCBmcmFtZVR5cGU7CisgICAgICAgIGludCBudW1FbmNCeXRlcyA9IEFNUkVuY29kZShtRW5jU3RhdGUsIG1TaWRTdGF0ZSwgbU1vZGUsIG1JbnB1dEZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd1ZpZXcuZGF0YSgpICsgb3V0UG9zLCAmZnJhbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1SX1RYX1dNRik7CisgICAgICAgIGlmIChudW1FbmNCeXRlcyA8IDAgfHwgbnVtRW5jQnl0ZXMgPiAoKGludClvdXRDYXBhY2l0eSAtIChpbnQpb3V0UG9zKSkgeworICAgICAgICAgICAgQUxPR0UoImVuY29kZUZyYW1lIGNhbGwgZmFpbGVkLCBzdGF0ZSBbJWQgJXp1ICV6dV0iLCBudW1FbmNCeXRlcywgb3V0UG9zLCBvdXRDYXBhY2l0eSk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIENvbnZlcnQgaGVhZGVyIGJ5dGUgZnJvbSBXTUYgdG8gSUVURiBmb3JtYXQuCisgICAgICAgIGlmIChudW1FbmNCeXRlcyA+IDApCisgICAgICAgICAgICB3Vmlldy5kYXRhKClbb3V0UG9zXSA9ICgod1ZpZXcuZGF0YSgpW291dFBvc10gPDwgMykgfCA0KSAmIDB4N2M7CisgICAgICAgIG91dFBvcyArPSBudW1FbmNCeXRlczsKKyAgICAgICAgbVByb2Nlc3NlZFNhbXBsZXMgKz0ga051bVNhbXBsZXNQZXJGcmFtZTsKKyAgICAgICAgbUZpbGxlZExlbiA9IDA7CisgICAgfQorICAgIEFMT0dWKCJjYXVzYWwgc2FtcGxlIHNpemUgJWQiLCBtRmlsbGVkTGVuKTsKKyAgICBpZiAobUlzRmlyc3QgJiYgb3V0UG9zICE9IDApIHsKKyAgICAgICAgbUlzRmlyc3QgPSBmYWxzZTsKKyAgICAgICAgbUFuY2hvclRpbWVTdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1bGwoKTsKKyAgICB9CisgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICBpZiAob3V0UG9zICE9IDApIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIGNyZWF0ZUxpbmVhckJ1ZmZlcihzdGQ6Om1vdmUob3V0cHV0QmxvY2spLCAwLCBvdXRQb3MpKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wID0gbUFuY2hvclRpbWVTdGFtcCArIG91dFRpbWVTdGFtcDsKKworICAgIH0KKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICBpZiAobUZpbGxlZExlbikgQUxPR1YoIkRpc2NhcmRpbmcgdHJhaWxpbmcgJWQgYnl0ZXMiLCBtRmlsbGVkTGVuKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtck5iRW5jOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIG9uRmx1c2hfc20oKTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdEFtck5iRW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEFtck5iRW5jRmFjdG9yeSgpCisgICAgICAgIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7fQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgIG5ldyBDMlNvZnRBbXJOYkVuYygKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBbXJOYkVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0QW1yTmJFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBbXJOYkVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0QW1yTmJFbmNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRBbXJOYkVuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yTmJFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWIxNGRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtck5iRW5jLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0FNUl9OQl9FTkNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FNUl9OQl9FTkNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJnc21hbXJfZW5jLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQzJTb2Z0QW1yTmJFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgcHVibGljOgorICAgIGNsYXNzIEludGZJbXBsOworICAgIEMyU29mdEFtck5iRW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0QW1yTmJFbmMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrTnVtU2FtcGxlc1BlckZyYW1lID0gTF9GUkFNRTsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lID0ga051bVNhbXBsZXNQZXJGcmFtZSAqIHNpemVvZihpbnQxNl90KTsKKworICAgIHZvaWQgKm1FbmNTdGF0ZTsKKyAgICB2b2lkICptU2lkU3RhdGU7CisgICAgTW9kZSBtTW9kZTsKKyAgICBib29sIG1Jc0ZpcnN0OworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICB1aW50NjRfdCBtQW5jaG9yVGltZVN0YW1wOworICAgIHVpbnQ2NF90IG1Qcm9jZXNzZWRTYW1wbGVzOworICAgIGludDMyX3QgbUZpbGxlZExlbjsKKyAgICBpbnQxNl90IG1JbnB1dEZyYW1lW2tOdW1TYW1wbGVzUGVyRnJhbWVdOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0QW1yTmJFbmMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfQU1SX05CX0VOQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJXYkVuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRhZTRiNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJXYkVuYy5jcHAKQEAgLTAsMCArMSw0MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEFtcldiRW5jIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0QW1yV2JFbmMuaCIKKyNpbmNsdWRlICJjbW5NZW1vcnkuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuYW1yd2IuZW5jb2RlciI7CisKK30gIC8vIG5hbWVzcGFjZQorCitjbGFzcyBDMlNvZnRBbXJXYkVuYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fQVVESU8sCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoCisgICAgICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmVxdWFsVG8oMSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQoMHUsIDE2MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuZXF1YWxUbygxNjAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgICAgICAoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQoMHUsIDY2MDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDY2MDAsIDIzODUwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgODE5MikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHVpbnQzMl90IGdldFNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtU2FtcGxlUmF0ZS0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRDaGFubmVsQ291bnQoKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbENvdW50LT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldEJpdHJhdGUoKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZS0+dmFsdWU7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQ+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+IG1JbnRmOworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtOdW1TYW1wbGVzUGVyRnJhbWUgPSAzMjA7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga051bUJ5dGVzUGVySW5wdXRGcmFtZSA9IGtOdW1TYW1wbGVzUGVyRnJhbWUgKiBzaXplb2YoaW50MTZfdCk7CisKKyAgICB2b2lkICptRW5jb2RlckhhbmRsZTsKKyAgICBWT19BVURJT19DT0RFQ0FQSSAqbUFwaUhhbmRsZTsKKyAgICBWT19NRU1fT1BFUkFUT1IgKm1NZW1PcGVyYXRvcjsKKyAgICBWT0FNUldCTU9ERSBtTW9kZTsKKyAgICBib29sIG1Jc0ZpcnN0OworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICB1aW50NjRfdCBtQW5jaG9yVGltZVN0YW1wOworICAgIHVpbnQ2NF90IG1Qcm9jZXNzZWRTYW1wbGVzOworICAgIGludDMyX3QgbUZpbGxlZExlbjsKKyAgICBpbnQxNl90IG1JbnB1dEZyYW1lW2tOdW1TYW1wbGVzUGVyRnJhbWVdOworCisgICAgc3RhdHVzX3QgaW5pdEVuY29kZXIoKTsKKyAgICBpbnQgZW5jb2RlSW5wdXQodWludDhfdCAqYnVmZmVyLCB1aW50MzJfdCBsZW5ndGgpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0QW1yV2JFbmMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfQU1SX1dCX0VOQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29tbW9uX3RpbWUvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvY29tbW9uX3RpbWUvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpjb3B5IHRvIG1lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9jb21tb25fdGltZS9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvTk9USUNFCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvY29tbW9uX3RpbWUvTk9USUNFCmNvcHkgdG8gbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL05PVElDRQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL3BhdGVudF9kaXNjbGFpbWVyLnR4dCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9wYXRlbnRfZGlzY2xhaW1lci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiZjExZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9wYXRlbnRfZGlzY2xhaW1lci50eHQKQEAgLTAsMCArMSw5IEBACisKK1RISVMgSVMgTk9UIEEgR1JBTlQgT0YgUEFURU5UIFJJR0hUUy4KKworR29vZ2xlIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9uIG9yIHdhcnJhbnR5IHRoYXQgdGhlIGNvZGVjcyBmb3Igd2hpY2gKK3NvdXJjZSBjb2RlIGlzIG1hZGUgYXZhaWxhYmxlIGhlcmV1bmRlciBhcmUgdW5lbmN1bWJlcmVkIGJ5Cit0aGlyZC1wYXJ0eSBwYXRlbnRzLiAgVGhvc2UgaW50ZW5kaW5nIHRvIHVzZSB0aGlzIHNvdXJjZSBjb2RlIGluCitoYXJkd2FyZSBvciBzb2Z0d2FyZSBwcm9kdWN0cyBhcmUgYWR2aXNlZCB0aGF0IGltcGxlbWVudGF0aW9ucyBvZgordGhlc2UgY29kZWNzLCBpbmNsdWRpbmcgaW4gb3BlbiBzb3VyY2Ugc29mdHdhcmUgb3Igc2hhcmV3YXJlLCBtYXkKK3JlcXVpcmUgcGF0ZW50IGxpY2Vuc2VzIGZyb20gdGhlIHJlbGV2YW50IHBhdGVudCBob2xkZXJzLgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmFiZjVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxNCBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hdjFkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEFvbURlYy5jcHAiXSwKKyAgICBzdGF0aWNfbGliczogWyJsaWJhb20iXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZXh0ZXJuYWwvbGliYW9tLyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0MyU29mdEFvbURlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY5ODk1YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuY3BwCkBAIC0wLDAgKzEsODEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRBb21EZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdEFvbURlYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5hdjEuZGVjb2RlciI7CisKK2NsYXNzIEMyU29mdEFvbURlYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4mIGhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgIGhlbHBlciwgQ09NUE9ORU5UX05BTUUsIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fVklERU8sIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSkgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7ICAvLyBUT0RPOiBhY2NvdW50IGZvciBvdXIgYnVmZmVycyBoZXJlCisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1TaXplLCBDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDIwNDgsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNpemVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FWMV8wLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzJfMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FWMV8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FWMV8xfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVjFfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVYxXzJfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVYxXzJfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVYxXzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWMV8zXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWMV8zXzIsCisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBtSGRyMTBQbHVzSW5mb0lucHV0ID0gQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjppbnB1dDo6QWxsb2NTaGFyZWQoMCk7CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSGRyMTBQbHVzSW5mb0lucHV0LCBDMl9QQVJBTUtFWV9JTlBVVF9IRFIxMF9QTFVTX0lORk8pCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG1IZHIxMFBsdXNJbmZvSW5wdXQpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUhkcjEwUGx1c0luZm9JbnB1dCwgbS52YWx1ZSkuYW55KCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihIZHIxMFBsdXNJbmZvSW5wdXRTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIG1IZHIxMFBsdXNJbmZvT3V0cHV0ID0gQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKDApOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUhkcjEwUGx1c0luZm9PdXRwdXQsIEMyX1BBUkFNS0VZX09VVFBVVF9IRFIxMF9QTFVTX0lORk8pCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG1IZHIxMFBsdXNJbmZvT3V0cHV0KQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1IZHIxMFBsdXNJbmZvT3V0cHV0LCBtLnZhbHVlKS5hbnkoKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKEhkcjEwUGx1c0luZm9PdXRwdXRTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcihEZWZpbmVQYXJhbShtTWF4U2l6ZSwgQzJfUEFSQU1LRVlfTUFYX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDIwNDgsIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoTWF4UGljdHVyZVNpemVTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4SW5wdXRTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KAorICAgICAgICAgICAgICAgICAgICBuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDMyMCAqIDI0MCAqIDMgLyA0KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtTWF4SW5wdXRTaXplLCB2YWx1ZSkuYW55KCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuY2FsY3VsYXRlZEFzKE1heElucHV0U2l6ZVNldHRlciwgbU1heFNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIEMyQ2hyb21hT2Zmc2V0U3RydWN0IGxvY2F0aW9uc1sxXSA9IHsKKyAgICAgICAgICAgIEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCl9OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gZGVmYXVsdENvbG9ySW5mbyA9CisgICAgICAgICAgICBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgxdSwgMHUsIDh1IC8qIGJpdERlcHRoICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIG1lbWNweShkZWZhdWx0Q29sb3JJbmZvLT5tLmxvY2F0aW9ucywgbG9jYXRpb25zLCBzaXplb2YobG9jYXRpb25zKSk7CisKKyAgICAgICAgZGVmYXVsdENvbG9ySW5mbyA9IEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAge0MyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCl9LCAwdSwgOHUgLyogYml0RGVwdGggKi8sCisgICAgICAgICAgICBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgaGVscGVyLT5hZGRTdHJ1Y3REZXNjcmlwdG9yczxDMkNocm9tYU9mZnNldFN0cnVjdD4oKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoRGVmaW5lUGFyYW0obUNvbG9ySW5mbywgQzJfUEFSQU1LRVlfQ09ERURfQ09MT1JfSU5GTykKKyAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoZGVmYXVsdENvbG9ySW5mbykKKyAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoRGVmYXVsdENvbG9yQXNwZWN0c1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBtb3JlIGZvcm1hdHM/CisgICAgICAgIGFkZFBhcmFtZXRlcihEZWZpbmVQYXJhbShtUGl4ZWxGb3JtYXQsIEMyX1BBUkFNS0VZX1BJWEVMX0ZPUk1BVCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+JiBvbGRNZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+JiBtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heFBpY3R1cmVTaXplU2V0dGVyKAorICAgICAgICBib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiYgbWUsCisgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiYgc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gVE9ETzogZ2V0IG1heCB3aWR0aC9oZWlnaHQgZnJvbSB0aGUgc2l6ZSdzIGZpZWxkIGhlbHBlcnMgdnMuCisgICAgICAgIC8vIGhhcmRjb2RpbmcKKyAgICAgICAgbWUuc2V0KCkud2lkdGggPSBjMl9taW4oYzJfbWF4KG1lLnYud2lkdGgsIHNpemUudi53aWR0aCksIDQwOTZ1KTsKKyAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gYzJfbWluKGMyX21heChtZS52LmhlaWdodCwgc2l6ZS52LmhlaWdodCksIDQwOTZ1KTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heElucHV0U2l6ZVNldHRlcigKKyAgICAgICAgYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiYgbWUsCisgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+JiBtYXhTaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBhc3N1bWUgY29tcHJlc3Npb24gcmF0aW8gb2YgMgorICAgICAgICBtZS5zZXQoKS52YWx1ZSA9ICgoKG1heFNpemUudi53aWR0aCArIDYzKSAvIDY0KSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICgobWF4U2l6ZS52LmhlaWdodCArIDYzKSAvIDY0KSAqIDMwNzIpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKyAgICBzdGF0aWMgQzJSIERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5wcmltYXJpZXMgPiBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi50cmFuc2ZlciA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7CisgICAgICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX09USEVSOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKXNpemU7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IGdldERlZmF1bHRDb2xvckFzcGVjdHNfbCgpIHsKKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0Q29sb3JBc3BlY3RzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgSGRyMTBQbHVzSW5mb0lucHV0U2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUhkcjEwUGx1c0luZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEhkcjEwUGx1c0luZm9PdXRwdXRTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gbU1heFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtTWF4SW5wdXRTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBtQ29sb3JJbmZvOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0PiBtUGl4ZWxGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IG1EZWZhdWx0Q29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUhkcjEwUGx1c0luZm86OmlucHV0PiBtSGRyMTBQbHVzSW5mb0lucHV0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUhkcjEwUGx1c0luZm86Om91dHB1dD4gbUhkcjEwUGx1c0luZm9PdXRwdXQ7Cit9OworCitDMlNvZnRBb21EZWM6OkMyU29mdEFvbURlYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KAorICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtQ29kZWNDdHgobnVsbHB0cil7CisKKyAgICBHRU5FUkFURV9GSUxFX05BTUVTKCk7CisgICAgQ1JFQVRFX0RVTVBfRklMRShtSW5GaWxlKTsKKyAgICBDUkVBVEVfRFVNUF9GSUxFKG1PdXRGaWxlKTsKKworICAgIGdldHRpbWVvZmRheSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgZ2V0dGltZW9mZGF5KCZtVGltZUVuZCwgbnVsbHB0cik7Cit9CisKK0MyU29mdEFvbURlYzo6fkMyU29mdEFvbURlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW9tRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFvbURlYzo6b25TdG9wKCkgeworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QW9tRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworICAgIGMyX3N0YXR1c190IGVyciA9IG9uRmx1c2hfc20oKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gZmx1c2ggZGVjb2Rlci4gVHJ5IHRvIGhhcmQgcmVzZXQgZGVjb2Rlci4iKTsKKyAgICAgICAgZGVzdHJveURlY29kZXIoKTsKKyAgICAgICAgKHZvaWQpaW5pdERlY29kZXIoKTsKKyAgICB9Cit9CisKK3ZvaWQgQzJTb2Z0QW9tRGVjOjpvblJlbGVhc2UoKSB7CisgICAgZGVzdHJveURlY29kZXIoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW9tRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIGlmIChhb21fY29kZWNfZGVjb2RlKG1Db2RlY0N0eCwgbnVsbHB0ciwgMCwgbnVsbHB0cikpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBmbHVzaCBhdjEgZGVjb2Rlci4iKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICBhb21fY29kZWNfaXRlcl90IGl0ZXIgPSBudWxscHRyOworICAgIHdoaWxlIChhb21fY29kZWNfZ2V0X2ZyYW1lKG1Db2RlY0N0eCwgJml0ZXIpKSB7CisgICAgfQorCisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworCisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0aWMgaW50IEdldENQVUNvcmVDb3VudCgpIHsKKyAgICBpbnQgY3B1Q29yZUNvdW50ID0gMTsKKyNpZiBkZWZpbmVkKF9TQ19OUFJPQ0VTU09SU19PTkxOKQorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworI2Vsc2UKKyAgICAvLyBfU0NfTlBST0NfT05MTiBtdXN0IGJlIGRlZmluZWQuLi4KKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ19PTkxOKTsKKyNlbmRpZgorICAgIENIRUNLKGNwdUNvcmVDb3VudCA+PSAxKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIENQVSBjb3JlczogJWQiLCBjcHVDb3JlQ291bnQpOworICAgIHJldHVybiBjcHVDb3JlQ291bnQ7Cit9CisKK3N0YXR1c190IEMyU29mdEFvbURlYzo6aW5pdERlY29kZXIoKSB7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIGlmICghbUNvZGVjQ3R4KSB7CisgICAgICAgIG1Db2RlY0N0eCA9IG5ldyBhb21fY29kZWNfY3R4X3Q7CisgICAgfQorCisgICAgaWYgKCFtQ29kZWNDdHgpIHsKKyAgICAgICAgQUxPR0UoIm1Db2RlY0N0eCBpcyBudWxsIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgYW9tX2NvZGVjX2RlY19jZmdfdCBjZmc7CisgICAgbWVtc2V0KCZjZmcsIDAsIHNpemVvZihhb21fY29kZWNfZGVjX2NmZ190KSk7CisgICAgY2ZnLnRocmVhZHMgPSBHZXRDUFVDb3JlQ291bnQoKTsKKyAgICBjZmcuYWxsb3dfbG93Yml0ZGVwdGggPSAxOworCisgICAgYW9tX2NvZGVjX2ZsYWdzX3QgZmxhZ3M7CisgICAgbWVtc2V0KCZmbGFncywgMCwgc2l6ZW9mKGFvbV9jb2RlY19mbGFnc190KSk7CisKKyAgICBhb21fY29kZWNfZXJyX3QgZXJyOworICAgIGlmICgoZXJyID0gYW9tX2NvZGVjX2RlY19pbml0KG1Db2RlY0N0eCwgYW9tX2NvZGVjX2F2MV9keCgpLCAmY2ZnLCAwKSkpIHsKKyAgICAgICAgQUxPR0UoImF2MSBkZWNvZGVyIGZhaWxlZCB0byBpbml0aWFsaXplLiAoJWQpIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRBb21EZWM6OmRlc3Ryb3lEZWNvZGVyKCkgeworICAgIGlmIChtQ29kZWNDdHgpIHsKKyAgICAgICAgYW9tX2NvZGVjX2Rlc3Ryb3kobUNvZGVjQ3R4KTsKKyAgICAgICAgZGVsZXRlIG1Db2RlY0N0eDsKKyAgICAgICAgbUNvZGVjQ3R4ID0gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3ZvaWQgQzJTb2Z0QW9tRGVjOjpmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+JiBibG9jaykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0KKyAgICAgICAgY3JlYXRlR3JhcGhpY0J1ZmZlcihibG9jaywgQzJSZWN0KG1XaWR0aCwgbUhlaWdodCkpOworICAgIGF1dG8gZmlsbFdvcmsgPSBbYnVmZmVyLCBpbmRleCwgaW50ZiA9IHRoaXMtPm1JbnRmXSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrKSB7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgaWYgKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICYmCisgICAgICAgICAgICAoYzJfY250cjY0X3QoaW5kZXgpID09IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCkpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtOiB3b3JrLT5pbnB1dC5jb25maWdVcGRhdGUpIHsKKyAgICAgICAgICAgIGlmIChwYXJhbSkgeworICAgICAgICAgICAgICAgIEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6aW5wdXQgKmhkcjEwUGx1c0luZm8gPQorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjppbnB1dDo6RnJvbShwYXJhbS5nZXQoKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoaGRyMTBQbHVzSW5mbyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IG91dFBhcmFtID0gQzJQYXJhbTo6Q29weUFzU3RyZWFtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwYXJhbS5nZXQoKSwgdHJ1ZSAvKm91dHB1dCovLCBwYXJhbS0+c3RyZWFtKCkpOworICAgICAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBpbnRmLT5jb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBvdXRQYXJhbS5nZXQoKSB9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KCpvdXRQYXJhbS5nZXQoKSkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImZpbmlzaFdvcms6IENvbmZpZyB1cGRhdGUgc2l6ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworICAgIGlmICh3b3JrICYmIGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpIHsKKyAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmluaXNoKGluZGV4LCBmaWxsV29yayk7CisgICAgfQorfQorCit2b2lkIEMyU29mdEFvbURlYzo6cHJvY2Vzcyhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIHsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9CisgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgY29kZWNDb25maWcgPQorICAgICAgICAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwKTsKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICBpblNpemUsIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCB3b3JrLT5pbnB1dC5mbGFncyk7CisKKyAgICBpZiAoY29kZWNDb25maWcpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDY0X3QgZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrbGwoKTsKKyAgICBpZiAoaW5TaXplKSB7CisgICAgICAgIHVpbnQ4X3QqIGJpdHN0cmVhbSA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0KTsKKyAgICAgICAgaW50MzJfdCBkZWNvZGVUaW1lID0gMDsKKyAgICAgICAgaW50MzJfdCBkZWxheSA9IDA7CisKKyAgICAgICAgRFVNUF9UT19GSUxFKG1PdXRGaWxlLCBiaXRzdHJlYW0sIGluU2l6ZSk7CisgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgICAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIGRlbGF5KTsKKworICAgICAgICBhb21fY29kZWNfZXJyX3QgZXJyID0KKyAgICAgICAgICAgIGFvbV9jb2RlY19kZWNvZGUobUNvZGVjQ3R4LCBiaXRzdHJlYW0sIGluU2l6ZSwgJmZyYW1lSW5kZXgpOworCisgICAgICAgIEdFVFRJTUUoJm1UaW1lRW5kLCBudWxscHRyKTsKKyAgICAgICAgVElNRV9ESUZGKG1UaW1lU3RhcnQsIG1UaW1lRW5kLCBkZWNvZGVUaW1lKTsKKyAgICAgICAgQUxPR1YoImRlY29kZVRpbWU9JTRkIGRlbGF5PSU0ZFxuIiwgZGVjb2RlVGltZSwgZGVsYXkpOworCisgICAgICAgIGlmIChlcnIgIT0gQU9NX0NPREVDX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiYXYxIGRlY29kZXIgZmFpbGVkIHRvIGRlY29kZSBmcmFtZSBlcnI6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYW9tX2NvZGVjX2RlY29kZShtQ29kZWNDdHgsIG51bGxwdHIsIDAsIG51bGxwdHIpKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGZsdXNoIGF2MSBkZWNvZGVyLiIpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAodm9pZClvdXRwdXRCdWZmZXIocG9vbCwgd29yayk7CisKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TLCBwb29sLCB3b3JrKTsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgfSBlbHNlIGlmICghaW5TaXplKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb3B5T3V0cHV0QnVmZmVyVG9ZdXZQbGFuYXJGcmFtZSgKKyAgICAgICAgdWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNZLCBjb25zdCB1aW50OF90ICpzcmNVLCBjb25zdCB1aW50OF90ICpzcmNWLAorICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAorICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7CisgICAgdWludDhfdCogZHN0U3RhcnQgPSBkc3Q7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7CisgICAgICAgIG1lbWNweShkc3QsIHNyY1ksIHdpZHRoKTsKKyAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlOworICAgICAgICBkc3QgKz0gZHN0WVN0cmlkZTsKKyAgICB9CisKKyAgICBkc3QgPSBkc3RTdGFydCArIGRzdFlTdHJpZGUgKiBoZWlnaHQ7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyY1YsIHdpZHRoIC8gMik7CisgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKKyAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgIH0KKworICAgIGRzdCA9IGRzdFN0YXJ0ICsgKGRzdFlTdHJpZGUgKiBoZWlnaHQpICsgKGRzdFVWU3RyaWRlICogaGVpZ2h0IC8gMik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyY1UsIHdpZHRoIC8gMik7CisgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKKyAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKHVpbnQzMl90ICpkc3QsCisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNZLCBjb25zdCB1aW50MTZfdCAqc3JjVSwgY29uc3QgdWludDE2X3QgKnNyY1YsCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCisgICAgICAgIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgeworCisgICAgLy8gQ29udmVydGluZyB0d28gbGluZXMgYXQgYSB0aW1lLCBzbGlnaHRseSBmYXN0ZXIKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgeSArPSAyKSB7CisgICAgICAgIHVpbnQzMl90ICpkc3RUb3AgPSAodWludDMyX3QgKikgZHN0OworICAgICAgICB1aW50MzJfdCAqZHN0Qm90ID0gKHVpbnQzMl90ICopIChkc3QgKyBkc3RTdHJpZGUpOworICAgICAgICB1aW50MTZfdCAqeVNyY1RvcCA9ICh1aW50MTZfdCopIHNyY1k7CisgICAgICAgIHVpbnQxNl90ICp5U3JjQm90ID0gKHVpbnQxNl90KikgKHNyY1kgKyBzcmNZU3RyaWRlKTsKKyAgICAgICAgdWludDE2X3QgKnVTcmMgPSAodWludDE2X3QqKSBzcmNVOworICAgICAgICB1aW50MTZfdCAqdlNyYyA9ICh1aW50MTZfdCopIHNyY1Y7CisKKyAgICAgICAgdWludDMyX3QgdTAxLCB2MDEsIHkwMSwgeTIzLCB5NDUsIHk2NywgdXYwLCB1djE7CisgICAgICAgIHNpemVfdCB4ID0gMDsKKyAgICAgICAgZm9yICg7IHggPCB3aWR0aCAtIDM7IHggKz0gNCkgeworCisgICAgICAgICAgICB1MDEgPSAqKCh1aW50MzJfdCopdVNyYyk7IHVTcmMgKz0gMjsKKyAgICAgICAgICAgIHYwMSA9ICooKHVpbnQzMl90Kil2U3JjKTsgdlNyYyArPSAyOworCisgICAgICAgICAgICB5MDEgPSAqKCh1aW50MzJfdCopeVNyY1RvcCk7IHlTcmNUb3AgKz0gMjsKKyAgICAgICAgICAgIHkyMyA9ICooKHVpbnQzMl90Kil5U3JjVG9wKTsgeVNyY1RvcCArPSAyOworICAgICAgICAgICAgeTQ1ID0gKigodWludDMyX3QqKXlTcmNCb3QpOyB5U3JjQm90ICs9IDI7CisgICAgICAgICAgICB5NjcgPSAqKCh1aW50MzJfdCopeVNyY0JvdCk7IHlTcmNCb3QgKz0gMjsKKworICAgICAgICAgICAgdXYwID0gKHUwMSAmIDB4M0ZGKSB8ICgodjAxICYgMHgzRkYpIDw8IDIwKTsKKyAgICAgICAgICAgIHV2MSA9ICh1MDEgPj4gMTYpIHwgKCh2MDEgPj4gMTYpIDw8IDIwKTsKKworICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTAxICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkwMSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTIzICYgMHgzRkYpIDw8IDEwKSB8IHV2MTsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkyMyA+PiAxNikgPDwgMTApIHwgdXYxOworCisgICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NDUgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTQ1ID4+IDE2KSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NjcgJiAweDNGRikgPDwgMTApIHwgdXYxOworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTY3ID4+IDE2KSA8PCAxMCkgfCB1djE7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGVyZSBzaG91bGQgYmUgYXQgbW9zdCAyIG1vcmUgcGl4ZWxzIHRvIHByb2Nlc3MuIE5vdGUgdGhhdCB3ZSBkb24ndAorICAgICAgICAvLyBuZWVkIHRvIGNvbnNpZGVyIG9kZCBjYXNlIGFzIHRoZSBidWZmZXIgaXMgYWx3YXlzIGFsaWduZWQgdG8gZXZlbi4KKyAgICAgICAgaWYgKHggPCB3aWR0aCkgeworICAgICAgICAgICAgdTAxID0gKnVTcmM7CisgICAgICAgICAgICB2MDEgPSAqdlNyYzsKKyAgICAgICAgICAgIHkwMSA9ICooKHVpbnQzMl90Kil5U3JjVG9wKTsKKyAgICAgICAgICAgIHk0NSA9ICooKHVpbnQzMl90Kil5U3JjQm90KTsKKyAgICAgICAgICAgIHV2MCA9ICh1MDEgJiAweDNGRikgfCAoKHYwMSAmIDB4M0ZGKSA8PCAyMCk7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAoKHkwMSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAoKHkwMSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gKCh5NDUgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gKCh5NDUgPj4gMTYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgfQorCisgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZSAqIDI7CisgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKKyAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOworICAgICAgICBkc3QgKz0gZHN0U3RyaWRlICogMjsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1ksIGNvbnN0IHVpbnQxNl90ICpzcmNVLCBjb25zdCB1aW50MTZfdCAqc3JjViwKKyAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKKyAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSB7CisKKyAgICB1aW50OF90ICpkc3RZID0gKHVpbnQ4X3QgKilkc3Q7CisgICAgc2l6ZV90IGRzdFlTaXplID0gZHN0WVN0cmlkZSAqIGhlaWdodDsKKyAgICBzaXplX3QgZHN0VVZTaXplID0gZHN0VVZTdHJpZGUgKiBoZWlnaHQgLyAyOworICAgIHVpbnQ4X3QgKmRzdFYgPSBkc3RZICsgZHN0WVNpemU7CisgICAgdWludDhfdCAqZHN0VSA9IGRzdFYgKyBkc3RVVlNpemU7CisKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworICAgICAgICAgICAgZHN0WVt4XSA9ICh1aW50OF90KShzcmNZW3hdID4+IDIpOworICAgICAgICB9CisKKyAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlOworICAgICAgICBkc3RZICs9IGRzdFlTdHJpZGU7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCAoaGVpZ2h0ICsgMSkgLyAyOyArK3kpIHsKKyAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCAod2lkdGggKyAxKSAvIDI7ICsreCkgeworICAgICAgICAgICAgZHN0VVt4XSA9ICh1aW50OF90KShzcmNVW3hdID4+IDIpOworICAgICAgICAgICAgZHN0Vlt4XSA9ICh1aW50OF90KShzcmNWW3hdID4+IDIpOworICAgICAgICB9CisKKyAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOworICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7CisgICAgICAgIGRzdFUgKz0gZHN0VVZTdHJpZGU7CisgICAgICAgIGRzdFYgKz0gZHN0VVZTdHJpZGU7CisgICAgfQorICAgIHJldHVybjsKK30KK2Jvb2wgQzJTb2Z0QW9tRGVjOjpvdXRwdXRCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKQoreworICAgIGlmICghKHdvcmsgJiYgcG9vbCkpIHJldHVybiBmYWxzZTsKKworICAgIGFvbV9jb2RlY19pdGVyX3QgaXRlciA9IG51bGxwdHI7CisgICAgYW9tX2ltYWdlX3QqIGltZyA9IGFvbV9jb2RlY19nZXRfZnJhbWUobUNvZGVjQ3R4LCAmaXRlcik7CisKKyAgICBpZiAoIWltZykgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGltZy0+ZF93ICE9IG1XaWR0aCB8fCBpbWctPmRfaCAhPSBtSGVpZ2h0KSB7CisgICAgICAgIG1XaWR0aCA9IGltZy0+ZF93OworICAgICAgICBtSGVpZ2h0ID0gaW1nLT5kX2g7CisKKyAgICAgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCBzaXplKDB1LCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcoeyZzaXplfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KHNpemUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb25maWcgdXBkYXRlIHNpemUgZmFpbGVkIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIENIRUNLKGltZy0+Zm10ID09IEFPTV9JTUdfRk1UX0k0MjAgfHwgaW1nLT5mbXQgPT0gQU9NX0lNR19GTVRfSTQyMDE2KTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2s7CisgICAgdWludDMyX3QgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOworICAgIGlmIChpbWctPmZtdCA9PSBBT01fSU1HX0ZNVF9JNDIwMTYpIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBkZWZhdWx0Q29sb3JBc3BlY3RzID0gbUludGYtPmdldERlZmF1bHRDb2xvckFzcGVjdHNfbCgpOworCisgICAgICAgIGlmIChkZWZhdWx0Q29sb3JBc3BlY3RzLT5wcmltYXJpZXMgPT0gQzJDb2xvcjo6UFJJTUFSSUVTX0JUMjAyMCAmJgorICAgICAgICAgICAgZGVmYXVsdENvbG9yQXNwZWN0cy0+bWF0cml4ID09IEMyQ29sb3I6Ok1BVFJJWF9CVDIwMjAgJiYKKyAgICAgICAgICAgIGRlZmF1bHRDb2xvckFzcGVjdHMtPnRyYW5zZmVyID09IEMyQ29sb3I6OlRSQU5TRkVSX1NUMjA4NCkgeworICAgICAgICAgICAgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDI7CisgICAgICAgIH0KKyAgICB9CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfTsKKworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKGFsaWduKG1XaWR0aCwgMTYpLCBtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgdXNhZ2UsICZibG9jayk7CisKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaEdyYXBoaWNCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IGVycjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQUxPR1YoInByb3ZpZGVkICglZHglZCkgcmVxdWlyZWQgKCVkeCVkKSwgb3V0IGZyYW1laW5kZXggJWQiLAorICAgICAgICAgIGJsb2NrLT53aWR0aCgpLCBibG9jay0+aGVpZ2h0KCksIG1XaWR0aCwgbUhlaWdodCwKKyAgICAgICAgICAoaW50KSooaW50NjRfdCopaW1nLT51c2VyX3ByaXYpOworCisgICAgdWludDhfdCogZHN0ID0gY29uc3RfY2FzdDx1aW50OF90Kj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgICAgc2l6ZV90IHNyY1lTdHJpZGUgPSBpbWctPnN0cmlkZVtBT01fUExBTkVfWV07CisgICAgc2l6ZV90IHNyY1VTdHJpZGUgPSBpbWctPnN0cmlkZVtBT01fUExBTkVfVV07CisgICAgc2l6ZV90IHNyY1ZTdHJpZGUgPSBpbWctPnN0cmlkZVtBT01fUExBTkVfVl07CisgICAgQzJQbGFuYXJMYXlvdXQgbGF5b3V0ID0gd1ZpZXcubGF5b3V0KCk7CisgICAgc2l6ZV90IGRzdFlTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXS5yb3dJbmM7CisgICAgc2l6ZV90IGRzdFVWU3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ucm93SW5jOworCisgICAgaWYgKGltZy0+Zm10ID09IEFPTV9JTUdfRk1UX0k0MjAxNikgeworICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjWSA9IChjb25zdCB1aW50MTZfdCAqKWltZy0+cGxhbmVzW0FPTV9QTEFORV9ZXTsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1UgPSAoY29uc3QgdWludDE2X3QgKilpbWctPnBsYW5lc1tBT01fUExBTkVfVV07CisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNWID0gKGNvbnN0IHVpbnQxNl90ICopaW1nLT5wbGFuZXNbQU9NX1BMQU5FX1ZdOworCisgICAgICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDIpIHsKKyAgICAgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMCgodWludDMyX3QgKilkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0WVN0cmlkZSAvIHNpemVvZih1aW50MzJfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIoZHN0LCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW0FPTV9QTEFORV9ZXTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjVSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbQU9NX1BMQU5FX1VdOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNWID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tBT01fUExBTkVfVl07CisgICAgICAgIGNvcHlPdXRwdXRCdWZmZXJUb1l1dlBsYW5hckZyYW1lKAorICAgICAgICAgICAgICAgIGRzdCwgc3JjWSwgc3JjVSwgc3JjViwKKyAgICAgICAgICAgICAgICBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLCBzcmNWU3RyaWRlLAorICAgICAgICAgICAgICAgIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLAorICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CisgICAgfQorICAgIGZpbmlzaFdvcmsoKihpbnQ2NF90KilpbWctPnVzZXJfcHJpdiwgd29yaywgc3RkOjptb3ZlKGJsb2NrKSk7CisgICAgYmxvY2sgPSBudWxscHRyOworICAgIHJldHVybiB0cnVlOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBb21EZWM6OmRyYWluSW50ZXJuYWwoCisgICAgdWludDMyX3QgZHJhaW5Nb2RlLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sLAorICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrKSB7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIGlmIChhb21fY29kZWNfZGVjb2RlKG1Db2RlY0N0eCwgbnVsbHB0ciwgMCwgbnVsbHB0cikpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBmbHVzaCBhdjEgZGVjb2Rlci4iKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICB3aGlsZSAoKG91dHB1dEJ1ZmZlcihwb29sLCB3b3JrKSkpIHsKKyAgICB9CisKKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUyAmJiB3b3JrICYmCisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID09IDB1KSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBb21EZWM6OmRyYWluKHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgeworICAgIHJldHVybiBkcmFpbkludGVybmFsKGRyYWluTW9kZSwgcG9vbCwgbnVsbHB0cik7Cit9CisKK2NsYXNzIEMyU29mdEFvbUZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKKyAgIHB1YmxpYzoKKyAgICBDMlNvZnRBb21GYWN0b3J5KCkKKyAgICAgICAgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHt9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgbmV3IEMyU29mdEFvbURlYyhDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QW9tRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRBb21EZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBb21EZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEFvbUZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEFvbUZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0MyU29mdEFvbURlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0MyU29mdEFvbURlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjODI2NDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmgKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9BVjFfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9BVjFfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgImFvbS9hb21fZGVjb2Rlci5oIgorI2luY2x1ZGUgImFvbS9hb21keC5oIgorCisjZGVmaW5lIEdFVFRJTUUoYSwgYikgZ2V0dGltZW9mZGF5KGEsIGIpOworI2RlZmluZSBUSU1FX0RJRkYoc3RhcnQsIGVuZCwgZGlmZikgICAgIFwKKyAgICBkaWZmID0gKCgoZW5kKS50dl9zZWMgLSAoc3RhcnQpLnR2X3NlYykgKiAxMDAwMDAwKSArIFwKKyAgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0QW9tRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEFvbURlYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRBb21EZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSBvdmVycmlkZTsKKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIGFvbV9jb2RlY19jdHhfdCogbUNvZGVjQ3R4OworCisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworCisgICAgI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKyAgICBjaGFyIG1JbkZpbGVbMjAwXTsKKyAgICBjaGFyIG1PdXRGaWxlWzIwMF07CisgICAgI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKworICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lU3RhcnQ7ICAgLy8gVGltZSBhdCB0aGUgc3RhcnQgb2YgZGVjb2RlKCkKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZUVuZDsgICAgIC8vIFRpbWUgYXQgdGhlIGVuZCBvZiBkZWNvZGUoKQorCisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBzdGF0dXNfdCBkZXN0cm95RGVjb2RlcigpOworICAgIHZvaWQgZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4mIGJsb2NrKTsKKyAgICBib29sIG91dHB1dEJ1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrKTsKKworICAgIGMyX3N0YXR1c190IGRyYWluSW50ZXJuYWwodWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEFvbURlYyk7Cit9OworCisjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQorCisjZGVmaW5lIElOUFVUX0RVTVBfUEFUSCAiL2RhdGEvbG9jYWwvdG1wL3RlbXAvYXYxIgorI2RlZmluZSBJTlBVVF9EVU1QX0VYVCAid2VibSIKKyNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSCAiL2RhdGEvbG9jYWwvdG1wL3RlbXAvYXYxIgorI2RlZmluZSBPVVRQVVRfRFVNUF9FWFQgImF2MSIKKyNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RyY3B5KG1JbkZpbGUsICIiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIkdFTkVSQVRFX0ZJTEVfTkFNRVMiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3ByaW50ZihtSW5GaWxlLCAiJXNfJWxkLiVsZC4lcyIsIElOUFVUX0RVTVBfUEFUSCwgbVRpbWVTdGFydC50dl9zZWMsIFwKKyAgICAgICAgICAgICAgICBtVGltZVN0YXJ0LnR2X3VzZWMsIElOUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RyY3B5KG1PdXRGaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3ByaW50ZihtT3V0RmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBPVVRQVVRfRFVNUF9QQVRILCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBtVGltZVN0YXJ0LnR2X3NlYywgbVRpbWVTdGFydC50dl91c2VjLCBPVVRQVVRfRFVNUF9FWFQpOyAgICAgIFwKKyAgICB9CisKKyNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRklMRSogZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAid2IiKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGZwICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJPcGVuZWQgZmlsZSAlcyIsIG1fZmlsZW5hbWUpOyAgICAgICAgIFwKKyAgICAgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJDb3VsZCBub3Qgb3BlbiBmaWxlICVzIiwgbV9maWxlbmFtZSk7IFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKSAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRklMRSogZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAiYWIiKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChmcCAhPSBOVUxMICYmIG1fYnVmICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJEdW1wIHRvIGZpbGUhIik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpID0gZndyaXRlKG1fYnVmLCAxLCBtX3NpemUsIGZwKTsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKGkgIT0gKGludCltX3NpemUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBBTE9HRCgiRXJyb3IgaW4gZndyaXRlLCByZXR1cm5lZCAlZCIsIGkpOyAgICBcCisgICAgICAgICAgICAgICAgcGVycm9yKCJFcnJvciBpbiB3cml0ZSB0byBmaWxlIik7ICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCB3cml0ZSB0byBmaWxlICVzIiwgbV9maWxlbmFtZSk7IFwKKyAgICAgICAgICAgIGlmIChmcCAhPSBOVUxMKSBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKyNkZWZpbmUgSU5QVVRfRFVNUF9QQVRICisjZGVmaW5lIElOUFVUX0RVTVBfRVhUCisjZGVmaW5lIE9VVFBVVF9EVU1QX1BBVEgKKyNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUCisjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKQorI2RlZmluZSBDUkVBVEVfRFVNUF9GSUxFKG1fZmlsZW5hbWUpCisjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKQorI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfQVYxX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDIxNDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzNyBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hdmNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9zaWduZWQtZGVmYXVsdHMiLAorICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYmF2Y2RlYyJdLAorCisgICAgc3JjczogWyJDMlNvZnRBdmNEZWMuY3BwIl0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImV4dGVybmFsL2xpYmF2Yy9kZWNvZGVyIiwKKyAgICAgICAgImV4dGVybmFsL2xpYmF2Yy9jb21tb24iLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYXZjZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJhdmNlbmMiXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0QXZjRW5jLmNwcCJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJleHRlcm5hbC9saWJhdmMvZW5jb2RlciIsCisgICAgICAgICJleHRlcm5hbC9saWJhdmMvY29tbW9uIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLXVudXNlZC12YXJpYWJsZSIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YwMTViNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuY3BwCkBAIC0wLDAgKzEsMTAzMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRBdmNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPENvZGVjMk1hcHBlci5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRBdmNEZWMuaCIKKyNpbmNsdWRlICJpaDI2NGQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuYXZjLmRlY29kZXIiOworCit9ICAvLyBuYW1lc3BhY2UKKworY2xhc3MgQzJTb2Z0QXZjRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTywKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOyAvLyBUT0RPOiBhY2NvdW50IGZvciBvdXIgYnVmZmVycyBoZXJlCisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisKKyAgICAgICAgLy8gVE9ETzogUHJvcGVyIHN1cHBvcnQgZm9yIHJlb3JkZXIgZGVwdGguCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWN0dWFsT3V0cHV0RGVsYXksIEMyX1BBUkFNS0VZX09VVFBVVF9ERUxBWSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjpvdXRwdXQoOHUpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUT0RPOiBvdXRwdXQgbGF0ZW5jeSBhbmQgcmVvcmRlcmluZworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIGNvZGVkIGFuZCBvdXRwdXQgcGljdHVyZSBzaXplIGlzIHRoZSBzYW1lIGZvciB0aGlzIGNvZGVjCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCA0MDgwLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgNDA4MCwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heFNpemUsIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgNDA4MCwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDQwODAsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoTWF4UGljdHVyZVNpemVTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQ09OU1RSQUlORURfQkFTRUxJTkUsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNV8yKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19CQVNFTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVkNfTUFJTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQ09OU1RSQUlORURfSElHSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVkNfUFJPR1JFU1NJVkVfSElHSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSH0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVZDXzEsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMUIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMV8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVkNfMV8yLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzFfMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVZDXzIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMl8xLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzJfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVZDXzMsIEMyQ29uZmlnOjpMRVZFTF9BVkNfM18xLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzNfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVZDXzQsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNF8xLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzRfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVZDXzUsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNV8xLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzVfMgorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhJbnB1dFNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCAzMjAgKiAyNDAgKiAzIC8gNCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobU1heElucHV0U2l6ZSwgdmFsdWUpLmFueSgpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLmNhbGN1bGF0ZWRBcyhNYXhJbnB1dFNpemVTZXR0ZXIsIG1NYXhTaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBDMkNocm9tYU9mZnNldFN0cnVjdCBsb2NhdGlvbnNbMV0gPSB7IEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCkgfTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IGRlZmF1bHRDb2xvckluZm8gPQorICAgICAgICAgICAgQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgIDF1LCAwdSwgOHUgLyogYml0RGVwdGggKi8sIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBtZW1jcHkoZGVmYXVsdENvbG9ySW5mby0+bS5sb2NhdGlvbnMsIGxvY2F0aW9ucywgc2l6ZW9mKGxvY2F0aW9ucykpOworCisgICAgICAgIGRlZmF1bHRDb2xvckluZm8gPQorICAgICAgICAgICAgQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgIHsgQzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKSB9LAorICAgICAgICAgICAgICAgICAgICAwdSwgOHUgLyogYml0RGVwdGggKi8sIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBoZWxwZXItPmFkZFN0cnVjdERlc2NyaXB0b3JzPEMyQ2hyb21hT2Zmc2V0U3RydWN0PigpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JJbmZvLCBDMl9QQVJBTUtFWV9DT0RFRF9DT0xPUl9JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShkZWZhdWx0Q29sb3JJbmZvKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURlZmF1bHRDb2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsICAgICBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCAgICBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvZGVkQ29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9WVUlfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfTElNSVRFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsICAgICBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsICBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCAgICBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihDb2RlZENvbG9yQXNwZWN0c1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsICBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQ29sb3JBc3BlY3RzU2V0dGVyLCBtRGVmYXVsdENvbG9yQXNwZWN0cywgbUNvZGVkQ29sb3JBc3BlY3RzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IG1vcmUgZm9ybWF0cz8KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1QaXhlbEZvcm1hdCwgQzJfUEFSQU1LRVlfUElYRUxfRk9STUFUKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhQaWN0dXJlU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIFRPRE86IGdldCBtYXggd2lkdGgvaGVpZ2h0IGZyb20gdGhlIHNpemUncyBmaWVsZCBoZWxwZXJzIHZzLiBoYXJkY29kaW5nCisgICAgICAgIG1lLnNldCgpLndpZHRoID0gYzJfbWluKGMyX21heChtZS52LndpZHRoLCBzaXplLnYud2lkdGgpLCA0MDgwdSk7CisgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IGMyX21pbihjMl9tYXgobWUudi5oZWlnaHQsIHNpemUudi5oZWlnaHQpLCA0MDgwdSk7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhJbnB1dFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1heFNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIGFzc3VtZSBjb21wcmVzc2lvbiByYXRpbyBvZiAyCisgICAgICAgIG1lLnNldCgpLnZhbHVlID0gKCgobWF4U2l6ZS52LndpZHRoICsgMTUpIC8gMTYpICogKChtYXhTaXplLnYuaGVpZ2h0ICsgMTUpIC8gMTYpICogMTkyKTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgKHZvaWQpc2l6ZTsKKyAgICAgICAgKHZvaWQpbWU7ICAvLyBUT0RPOiB2YWxpZGF0ZQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgRGVmYXVsdENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAobWUudi5yYW5nZSA+IEMyQ29sb3I6OlJBTkdFX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5wcmltYXJpZXMgPiBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYudHJhbnNmZXIgPiBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYubWF0cml4ID4gQzJDb2xvcjo6TUFUUklYX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX09USEVSOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBDb2RlZENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAobWUudi5yYW5nZSA+IEMyQ29sb3I6OlJBTkdFX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5wcmltYXJpZXMgPiBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYudHJhbnNmZXIgPiBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYubWF0cml4ID4gQzJDb2xvcjo6TUFUUklYX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX09USEVSOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+ICZkZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+ICZjb2RlZCkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gdGFrZSBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsIHVuc3BlY2lmaWVkIGZpZWxkcywgYW5kIGNvZGVkIHZhbHVlcyBmb3Igc3BlY2lmaWVkIG9uZXMKKyAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBjb2RlZC52LnJhbmdlID09IFJBTkdFX1VOU1BFQ0lGSUVEID8gZGVmLnYucmFuZ2UgOiBjb2RlZC52LnJhbmdlOworICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBjb2RlZC52LnByaW1hcmllcyA9PSBQUklNQVJJRVNfVU5TUEVDSUZJRUQKKyAgICAgICAgICAgICAgICA/IGRlZi52LnByaW1hcmllcyA6IGNvZGVkLnYucHJpbWFyaWVzOworICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IGNvZGVkLnYudHJhbnNmZXIgPT0gVFJBTlNGRVJfVU5TUEVDSUZJRUQKKyAgICAgICAgICAgICAgICA/IGRlZi52LnRyYW5zZmVyIDogY29kZWQudi50cmFuc2ZlcjsKKyAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gY29kZWQudi5tYXRyaXggPT0gTUFUUklYX1VOU1BFQ0lGSUVEID8gZGVmLnYubWF0cml4IDogY29kZWQudi5tYXRyaXg7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiBnZXRDb2xvckFzcGVjdHNfbCgpIHsKKyAgICAgICAgcmV0dXJuIG1Db2xvckFzcGVjdHM7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiBtTWF4U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1NYXhJbnB1dFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IG1Db2xvckluZm87CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+IG1Db2RlZENvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gbURlZmF1bHRDb2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiBtQ29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0PiBtUGl4ZWxGb3JtYXQ7Cit9OworCitzdGF0aWMgc2l6ZV90IGdldENwdUNvcmVDb3VudCgpIHsKKyAgICBsb25nIGNwdUNvcmVDb3VudCA9IDE7CisjaWYgZGVmaW5lZChfU0NfTlBST0NFU1NPUlNfT05MTikKKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKyNlbHNlCisgICAgLy8gX1NDX05QUk9DX09OTE4gbXVzdCBiZSBkZWZpbmVkLi4uCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NfT05MTik7CisjZW5kaWYKKyAgICBDSEVDSyhjcHVDb3JlQ291bnQgPj0gMSk7CisgICAgQUxPR1YoIk51bWJlciBvZiBDUFUgY29yZXM6ICVsZCIsIGNwdUNvcmVDb3VudCk7CisgICAgcmV0dXJuIChzaXplX3QpY3B1Q29yZUNvdW50OworfQorCitzdGF0aWMgdm9pZCAqaXZkX2FsaWduZWRfbWFsbG9jKHZvaWQgKmN0eHQsIFdPUkQzMiBhbGlnbm1lbnQsIFdPUkQzMiBzaXplKSB7CisgICAgKHZvaWQpIGN0eHQ7CisgICAgcmV0dXJuIG1lbWFsaWduKGFsaWdubWVudCwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGl2ZF9hbGlnbmVkX2ZyZWUodm9pZCAqY3R4dCwgdm9pZCAqbWVtKSB7CisgICAgKHZvaWQpIGN0eHQ7CisgICAgZnJlZShtZW0pOworfQorCitDMlNvZnRBdmNEZWM6OkMyU29mdEF2Y0RlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtRGVjSGFuZGxlKG51bGxwdHIpLAorICAgICAgbU91dEJ1ZmZlckZsdXNoKG51bGxwdHIpLAorICAgICAgbUl2Q29sb3JGb3JtYXQoSVZfWVVWXzQyMFApLAorICAgICAgbVdpZHRoKDMyMCksCisgICAgICBtSGVpZ2h0KDI0MCksCisgICAgICBtSGVhZGVyRGVjb2RlZChmYWxzZSksCisgICAgICBtT3V0SW5kZXgoMHUpIHsKKyAgICBHRU5FUkFURV9GSUxFX05BTUVTKCk7CisgICAgQ1JFQVRFX0RVTVBfRklMRShtSW5GaWxlKTsKK30KKworQzJTb2Z0QXZjRGVjOjp+QzJTb2Z0QXZjRGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNEZWM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RGVjb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRDsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpvblN0b3AoKSB7CisgICAgaWYgKE9LICE9IHJlc2V0RGVjb2RlcigpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIHJlc2V0UGx1Z2luKCk7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEF2Y0RlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZCkgb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0QXZjRGVjOjpvblJlbGVhc2UoKSB7CisgICAgKHZvaWQpIGRlbGV0ZURlY29kZXIoKTsKKyAgICBpZiAobU91dEJ1ZmZlckZsdXNoKSB7CisgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUobnVsbHB0ciwgbU91dEJ1ZmZlckZsdXNoKTsKKyAgICAgICAgbU91dEJ1ZmZlckZsdXNoID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKG1PdXRCbG9jaykgeworICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0RlYzo6b25GbHVzaF9zbSgpIHsKKyAgICBpZiAoT0sgIT0gc2V0Rmx1c2hNb2RlKCkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisKKyAgICB1aW50MzJfdCBidWZmZXJTaXplID0gbVN0cmlkZSAqIG1IZWlnaHQgKiAzIC8gMjsKKyAgICBtT3V0QnVmZmVyRmx1c2ggPSAodWludDhfdCAqKWl2ZF9hbGlnbmVkX21hbGxvYyhudWxscHRyLCAxMjgsIGJ1ZmZlclNpemUpOworICAgIGlmICghbU91dEJ1ZmZlckZsdXNoKSB7CisgICAgICAgIEFMT0dFKCJjb3VsZCBub3QgYWxsb2NhdGUgdG1wIG91dHB1dCBidWZmZXIgKGZvciBmbHVzaCkgb2Ygc2l6ZSAldSAiLCBidWZmZXJTaXplKTsKKyAgICAgICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICB9CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKKworICAgICAgICBzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCBudWxscHRyLCBudWxscHRyLCAwLCAwLCAwKTsKKyAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIGlmICgwID09IHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICByZXNldFBsdWdpbigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobU91dEJ1ZmZlckZsdXNoKSB7CisgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUobnVsbHB0ciwgbU91dEJ1ZmZlckZsdXNoKTsKKyAgICAgICAgbU91dEJ1ZmZlckZsdXNoID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEF2Y0RlYzo6Y3JlYXRlRGVjb2RlcigpIHsKKyAgICBpdmRleHRfY3JlYXRlX2lwX3Qgc19jcmVhdGVfaXA7CisgICAgaXZkZXh0X2NyZWF0ZV9vcF90IHNfY3JlYXRlX29wOworCisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3JlYXRlX2lwX3QpOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LmVfY21kID0gSVZEX0NNRF9DUkVBVEU7CisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QudTRfc2hhcmVfZGlzcF9idWYgPSAwOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LmVfb3V0cHV0X2Zvcm1hdCA9IG1JdkNvbG9yRm9ybWF0OworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnBmX2FsaWduZWRfYWxsb2MgPSBpdmRfYWxpZ25lZF9tYWxsb2M7CisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QucGZfYWxpZ25lZF9mcmVlID0gaXZkX2FsaWduZWRfZnJlZTsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5wdl9tZW1fY3R4dCA9IG51bGxwdHI7CisgICAgc19jcmVhdGVfb3Auc19pdmRfY3JlYXRlX29wX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3JlYXRlX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19jcmVhdGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2NyZWF0ZV9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICBzX2NyZWF0ZV9vcC5zX2l2ZF9jcmVhdGVfb3BfdC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIG1EZWNIYW5kbGUgPSAoaXZfb2JqX3QqKXNfY3JlYXRlX29wLnNfaXZkX2NyZWF0ZV9vcF90LnB2X2hhbmRsZTsKKyAgICBtRGVjSGFuZGxlLT5wdl9meG5zID0gKHZvaWQgKilpdmRlY19hcGlfZnVuY3Rpb247CisgICAgbURlY0hhbmRsZS0+dTRfc2l6ZSA9IHNpemVvZihpdl9vYmpfdCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEF2Y0RlYzo6c2V0TnVtQ29yZXMoKSB7CisgICAgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3Qgc19zZXRfbnVtX2NvcmVzX2lwOworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90IHNfc2V0X251bV9jb3Jlc19vcDsKKworICAgIHNfc2V0X251bV9jb3Jlc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90KTsKKyAgICBzX3NldF9udW1fY29yZXNfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9udW1fY29yZXNfaXAuZV9zdWJfY21kID0gSVZERVhUX0NNRF9DVExfU0VUX05VTV9DT1JFUzsKKyAgICBzX3NldF9udW1fY29yZXNfaXAudTRfbnVtX2NvcmVzID0gbU51bUNvcmVzOworICAgIHNfc2V0X251bV9jb3Jlc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X251bV9jb3Jlc19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X251bV9jb3Jlc19vcCk7CisgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgIEFMT0dEKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3NldF9udW1fY29yZXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpzZXRQYXJhbXMoc2l6ZV90IHN0cmlkZSwgSVZEX1ZJREVPX0RFQ09ERV9NT0RFX1QgZGVjX21vZGUpIHsKKyAgICBpdmRfY3RsX3NldF9jb25maWdfaXBfdCBzX3NldF9keW5fcGFyYW1zX2lwOworICAgIGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90IHNfc2V0X2R5bl9wYXJhbXNfb3A7CisKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX2lwX3QpOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX1NFVFBBUkFNUzsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLnU0X2Rpc3Bfd2QgPSAoVVdPUkQzMikgc3RyaWRlOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9mcm1fc2tpcF9tb2RlID0gSVZEX1NLSVBfTk9ORTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfZnJtX291dF9tb2RlID0gSVZEX0RJU1BMQVlfRlJBTUVfT1VUOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV92aWRfZGVjX21vZGUgPSBkZWNfbW9kZTsKKyAgICBzX3NldF9keW5fcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZHluX3BhcmFtc19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2R5bl9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfZHluX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEMyU29mdEF2Y0RlYzo6Z2V0VmVyc2lvbigpIHsKKyAgICBpdmRfY3RsX2dldHZlcnNpb25pbmZvX2lwX3Qgc19nZXRfdmVyc2lvbmluZm9faXA7CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90IHNfZ2V0X3ZlcnNpb25pbmZvX29wOworICAgIFVXT1JEOCBhdTFfYnVmWzUxMl07CisKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCk7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9HRVRWRVJTSU9OOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnB2X3ZlcnNpb25fYnVmZmVyID0gYXUxX2J1ZjsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC51NF92ZXJzaW9uX2J1ZmZlcl9zaXplID0gc2l6ZW9mKGF1MV9idWYpOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3ZlcnNpb25pbmZvX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19nZXRfdmVyc2lvbmluZm9fb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRCgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgc19nZXRfdmVyc2lvbmluZm9fb3AudTRfZXJyb3JfY29kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIml0dGlhbSBkZWNvZGVyIHZlcnNpb24gbnVtYmVyOiAlcyIsCisgICAgICAgICAgICAgIChjaGFyICopIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnB2X3ZlcnNpb25fYnVmZmVyKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEMyU29mdEF2Y0RlYzo6aW5pdERlY29kZXIoKSB7CisgICAgaWYgKE9LICE9IGNyZWF0ZURlY29kZXIoKSkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgbU51bUNvcmVzID0gTUlOKGdldENwdUNvcmVDb3VudCgpLCBNQVhfTlVNX0NPUkVTKTsKKyAgICBtU3RyaWRlID0gQUxJR042NChtV2lkdGgpOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIHJlc2V0UGx1Z2luKCk7CisgICAgKHZvaWQpIHNldE51bUNvcmVzKCk7CisgICAgaWYgKE9LICE9IHNldFBhcmFtcyhtU3RyaWRlLCBJVkRfREVDT0RFX0ZSQU1FKSkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgKHZvaWQpIGdldFZlcnNpb24oKTsKKworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBDMlNvZnRBdmNEZWM6OnNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNvZGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY29kZV9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVhZFZpZXcgKmluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJHcmFwaGljVmlldyAqb3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRzTWFya2VyKSB7CisgICAgdWludDMyX3QgZGlzcGxheVN0cmlkZSA9IG1TdHJpZGU7CisgICAgdWludDMyX3QgZGlzcGxheUhlaWdodCA9IG1IZWlnaHQ7CisgICAgc2l6ZV90IGx1bWFTaXplID0gZGlzcGxheVN0cmlkZSAqIGRpc3BsYXlIZWlnaHQ7CisgICAgc2l6ZV90IGNocm9tYVNpemUgPSBsdW1hU2l6ZSA+PiAyOworCisgICAgcHNfZGVjb2RlX2lwLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfaXBfdCk7CisgICAgcHNfZGVjb2RlX2lwLT5lX2NtZCA9IElWRF9DTURfVklERU9fREVDT0RFOworICAgIGlmIChpbkJ1ZmZlcikgeworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X3RzID0gdHNNYXJrZXI7CisgICAgICAgIHBzX2RlY29kZV9pcC0+cHZfc3RyZWFtX2J1ZmZlciA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpbkJ1ZmZlci0+ZGF0YSgpICsgaW5PZmZzZXQpOworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X251bV9CeXRlcyA9IGluU2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X3RzID0gMDsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5wdl9zdHJlYW1fYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF9udW1fQnl0ZXMgPSAwOworICAgIH0KKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzBdID0gbHVtYVNpemU7CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVsxXSA9IGNocm9tYVNpemU7CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVsyXSA9IGNocm9tYVNpemU7CisgICAgaWYgKG91dEJ1ZmZlcikgeworICAgICAgICBpZiAob3V0QnVmZmVyLT53aWR0aCgpIDwgZGlzcGxheVN0cmlkZSB8fCBvdXRCdWZmZXItPmhlaWdodCgpIDwgZGlzcGxheUhlaWdodCkgeworICAgICAgICAgICAgQUxPR0UoIk91dHB1dCBidWZmZXIgdG9vIHNtYWxsOiBwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICgldXgldSkiLAorICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT53aWR0aCgpLCBvdXRCdWZmZXItPmhlaWdodCgpLCBkaXNwbGF5U3RyaWRlLCBkaXNwbGF5SGVpZ2h0KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1swXSA9IG91dEJ1ZmZlci0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMV0gPSBvdXRCdWZmZXItPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzJdID0gb3V0QnVmZmVyLT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworICAgIH0gZWxzZSB7CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzBdID0gbU91dEJ1ZmZlckZsdXNoOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1sxXSA9IG1PdXRCdWZmZXJGbHVzaCArIGx1bWFTaXplOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1syXSA9IG1PdXRCdWZmZXJGbHVzaCArIGx1bWFTaXplICsgY2hyb21hU2l6ZTsKKyAgICB9CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbnVtX2J1ZnMgPSAzOworICAgIHBzX2RlY29kZV9vcC0+dTRfc2l6ZSA9IHNpemVvZihpdmRfdmlkZW9fZGVjb2RlX29wX3QpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQzJTb2Z0QXZjRGVjOjpnZXRWdWlQYXJhbXMoKSB7CisgICAgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19pcF90IHNfZ2V0X3Z1aV9wYXJhbXNfaXA7CisgICAgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19vcF90IHNfZ2V0X3Z1aV9wYXJhbXNfb3A7CisKKyAgICBzX2dldF92dWlfcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19pcF90KTsKKyAgICBzX2dldF92dWlfcGFyYW1zX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19nZXRfdnVpX3BhcmFtc19pcC5lX3N1Yl9jbWQgPQorICAgICAgICAgICAgKElWRF9DT05UUk9MX0FQSV9DT01NQU5EX1RZUEVfVCkgSUgyNjREX0NNRF9DVExfR0VUX1ZVSV9QQVJBTVM7CisgICAgc19nZXRfdnVpX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92dWlfcGFyYW1zX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19nZXRfdnVpX3BhcmFtc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dEKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX2dldF92dWlfcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgVnVpQ29sb3JBc3BlY3RzIHZ1aUNvbG9yQXNwZWN0czsKKyAgICB2dWlDb2xvckFzcGVjdHMucHJpbWFyaWVzID0gc19nZXRfdnVpX3BhcmFtc19vcC51MV9jb2xvdXJfcHJpbWFyaWVzOworICAgIHZ1aUNvbG9yQXNwZWN0cy50cmFuc2ZlciA9IHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTFfdGZyX2NoYXJzOworICAgIHZ1aUNvbG9yQXNwZWN0cy5jb2VmZnMgPSBzX2dldF92dWlfcGFyYW1zX29wLnUxX21hdHJpeF9jb2VmZnM7CisgICAgdnVpQ29sb3JBc3BlY3RzLmZ1bGxSYW5nZSA9IHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTFfdmlkZW9fZnVsbF9yYW5nZV9mbGFnOworCisgICAgLy8gY29udmVydCB2dWkgYXNwZWN0cyB0byBDMiB2YWx1ZXMgaWYgY2hhbmdlZAorICAgIGlmICghKHZ1aUNvbG9yQXNwZWN0cyA9PSBtQml0c3RyZWFtQ29sb3JBc3BlY3RzKSkgeworICAgICAgICBtQml0c3RyZWFtQ29sb3JBc3BlY3RzID0gdnVpQ29sb3JBc3BlY3RzOworICAgICAgICBDb2xvckFzcGVjdHMgc2ZBc3BlY3RzOworICAgICAgICBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0IGNvZGVkQXNwZWN0cyA9IHsgMHUgfTsKKyAgICAgICAgQ29sb3JVdGlsczo6Y29udmVydElzb0NvbG9yQXNwZWN0c1RvQ29kZWNBc3BlY3RzKAorICAgICAgICAgICAgICAgIHZ1aUNvbG9yQXNwZWN0cy5wcmltYXJpZXMsIHZ1aUNvbG9yQXNwZWN0cy50cmFuc2ZlciwgdnVpQ29sb3JBc3BlY3RzLmNvZWZmcywKKyAgICAgICAgICAgICAgICB2dWlDb2xvckFzcGVjdHMuZnVsbFJhbmdlLCBzZkFzcGVjdHMpOworICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1QcmltYXJpZXMsICZjb2RlZEFzcGVjdHMucHJpbWFyaWVzKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1SYW5nZSwgJmNvZGVkQXNwZWN0cy5yYW5nZSkpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubU1hdHJpeENvZWZmcywgJmNvZGVkQXNwZWN0cy5tYXRyaXgpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubVRyYW5zZmVyLCAmY29kZWRBc3BlY3RzLnRyYW5zZmVyKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAodm9pZCltSW50Zi0+Y29uZmlnKHsmY29kZWRBc3BlY3RzfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpzZXRGbHVzaE1vZGUoKSB7CisgICAgaXZkX2N0bF9mbHVzaF9pcF90IHNfc2V0X2ZsdXNoX2lwOworICAgIGl2ZF9jdGxfZmx1c2hfb3BfdCBzX3NldF9mbHVzaF9vcDsKKworICAgIHNfc2V0X2ZsdXNoX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9mbHVzaF9pcF90KTsKKyAgICBzX3NldF9mbHVzaF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfc2V0X2ZsdXNoX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX0ZMVVNIOworICAgIHNfc2V0X2ZsdXNoX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9mbHVzaF9vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2ZsdXNoX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZmx1c2hfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfZmx1c2hfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpyZXNldERlY29kZXIoKSB7CisgICAgaXZkX2N0bF9yZXNldF9pcF90IHNfcmVzZXRfaXA7CisgICAgaXZkX2N0bF9yZXNldF9vcF90IHNfcmVzZXRfb3A7CisKKyAgICBzX3Jlc2V0X2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9yZXNldF9pcF90KTsKKyAgICBzX3Jlc2V0X2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19yZXNldF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9SRVNFVDsKKyAgICBzX3Jlc2V0X29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9yZXNldF9vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfcmVzZXRfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3Jlc2V0X29wKTsKKyAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfcmVzZXRfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtU3RyaWRlID0gMDsKKyAgICAodm9pZCkgc2V0TnVtQ29yZXMoKTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtSGVhZGVyRGVjb2RlZCA9IGZhbHNlOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEMyU29mdEF2Y0RlYzo6cmVzZXRQbHVnaW4oKSB7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgZ2V0dGltZW9mZGF5KCZtVGltZUVuZCwgbnVsbHB0cik7Cit9CisKK3N0YXR1c190IEMyU29mdEF2Y0RlYzo6ZGVsZXRlRGVjb2RlcigpIHsKKyAgICBpZiAobURlY0hhbmRsZSkgeworICAgICAgICBpdmRleHRfZGVsZXRlX2lwX3Qgc19kZWxldGVfaXA7CisgICAgICAgIGl2ZGV4dF9kZWxldGVfb3BfdCBzX2RlbGV0ZV9vcDsKKworICAgICAgICBzX2RlbGV0ZV9pcC5zX2l2ZF9kZWxldGVfaXBfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9kZWxldGVfaXBfdCk7CisgICAgICAgIHNfZGVsZXRlX2lwLnNfaXZkX2RlbGV0ZV9pcF90LmVfY21kID0gSVZEX0NNRF9ERUxFVEU7CisgICAgICAgIHNfZGVsZXRlX29wLnNfaXZkX2RlbGV0ZV9vcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2RlbGV0ZV9vcF90KTsKKyAgICAgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19kZWxldGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19kZWxldGVfb3ApOworICAgICAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgc19kZWxldGVfb3Auc19pdmRfZGVsZXRlX29wX3QudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBtRGVjSGFuZGxlID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3ZvaWQgQzJTb2Z0QXZjRGVjOjpmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0gY3JlYXRlR3JhcGhpY0J1ZmZlcihzdGQ6Om1vdmUobU91dEJsb2NrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJSZWN0KG1XaWR0aCwgbUhlaWdodCkpOworICAgIG1PdXRCbG9jayA9IG51bGxwdHI7CisgICAgeworICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKyAgICAgICAgYnVmZmVyLT5zZXRJbmZvKG1JbnRmLT5nZXRDb2xvckFzcGVjdHNfbCgpKTsKKyAgICB9CisKKyAgICBjbGFzcyBGaWxsV29yayB7CisgICAgICAgcHVibGljOgorICAgICAgICBGaWxsV29yayh1aW50MzJfdCBmbGFncywgQzJXb3JrT3JkaW5hbFN0cnVjdCBvcmRpbmFsLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBidWZmZXIpCisgICAgICAgICAgICA6IG1GbGFncyhmbGFncyksIG1PcmRpbmFsKG9yZGluYWwpLCBtQnVmZmVyKGJ1ZmZlcikge30KKyAgICAgICAgfkZpbGxXb3JrKCkgPSBkZWZhdWx0OworCisgICAgICAgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaykgeworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KW1GbGFnczsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IG1PcmRpbmFsOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgICAgICAgICAgaWYgKG1CdWZmZXIpIHsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2sobUJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigidGltZXN0YW1wID0gJWxsZCwgaW5kZXggPSAlbGxkLCB3LyVzIGJ1ZmZlciIsCisgICAgICAgICAgICAgICAgICBtT3JkaW5hbC50aW1lc3RhbXAucGVla2xsKCksIG1PcmRpbmFsLmZyYW1lSW5kZXgucGVla2xsKCksCisgICAgICAgICAgICAgICAgICBtQnVmZmVyID8gIiIgOiAibyIpOworICAgICAgICB9CisKKyAgICAgICBwcml2YXRlOgorICAgICAgICBjb25zdCB1aW50MzJfdCBtRmxhZ3M7CisgICAgICAgIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgbU9yZGluYWw7CisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gbUJ1ZmZlcjsKKyAgICB9OworCisgICAgYXV0byBmaWxsV29yayA9IFtidWZmZXJdKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkwOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIH07CisgICAgaWYgKHdvcmsgJiYgYzJfY250cjY0X3QoaW5kZXgpID09IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCkgeworICAgICAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICAgICAgLy8gVE9ETzogQ2hlY2sgaWYgY2xvbmVBbmRTZW5kIGNhbiBiZSBhdm9pZGVkIGJ5IHRyYWNraW5nIG51bWJlciBvZiBmcmFtZXMgcmVtYWluaW5nCisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgICAgICBtT3V0SW5kZXggPSBpbmRleDsKKyAgICAgICAgICAgICAgICBDMldvcmtPcmRpbmFsU3RydWN0IG91dE9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICAgICAgICAgIGNsb25lQW5kU2VuZCgKKyAgICAgICAgICAgICAgICAgICAgbU91dEluZGV4LCB3b3JrLAorICAgICAgICAgICAgICAgICAgICBGaWxsV29yayhDMkZyYW1lRGF0YTo6RkxBR19JTkNPTVBMRVRFLCBvdXRPcmRpbmFsLCBidWZmZXIpKTsKKyAgICAgICAgICAgICAgICBidWZmZXIucmVzZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbGxXb3JrKHdvcmspOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmluaXNoKGluZGV4LCBmaWxsV29yayk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNEZWM6OmVuc3VyZURlY29kZXJTdGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgaWYgKCFtRGVjSGFuZGxlKSB7CisgICAgICAgIEFMT0dFKCJub3Qgc3VwcG9zZWQgdG8gYmUgaGVyZSwgaW52YWxpZCBkZWNvZGVyIGNvbnRleHQiKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgaWYgKG1TdHJpZGUgIT0gQUxJR042NChtV2lkdGgpKSB7CisgICAgICAgIG1TdHJpZGUgPSBBTElHTjY0KG1XaWR0aCk7CisgICAgICAgIGlmIChPSyAhPSBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9GUkFNRSkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIGlmIChtT3V0QmxvY2sgJiYKKyAgICAgICAgICAgIChtT3V0QmxvY2stPndpZHRoKCkgIT0gbVN0cmlkZSB8fCBtT3V0QmxvY2stPmhlaWdodCgpICE9IG1IZWlnaHQpKSB7CisgICAgICAgIG1PdXRCbG9jay5yZXNldCgpOworICAgIH0KKyAgICBpZiAoIW1PdXRCbG9jaykgeworICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2sobVN0cmlkZSwgbUhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJm1PdXRCbG9jayk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJmZXRjaEdyYXBoaWNCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICglZHglZCkiLAorICAgICAgICAgICAgICBtT3V0QmxvY2stPndpZHRoKCksIG1PdXRCbG9jay0+aGVpZ2h0KCksIG1TdHJpZGUsIG1IZWlnaHQpOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworLy8gVE9ETzogY2FuIG92ZXJhbGwgZXJyb3IgY2hlY2tpbmcgYmUgaW1wcm92ZWQ/CisvLyBUT0RPOiBhbGxvdyBjb25maWd1cmF0aW9uIG9mIGNvbG9yIGZvcm1hdCBhbmQgdXNhZ2UgZm9yIGdyYXBoaWMgYnVmZmVycyBpbnN0ZWFkCisvLyAgICAgICBvZiBoYXJkIGNvZGluZyB0aGVtIHRvIEhBTF9QSVhFTF9GT1JNQVRfWVYxMgorLy8gVE9ETzogcGFzcyBjb2xvcmFzcGVjdHMgaW5mb3JtYXRpb24gdG8gc3VyZmFjZQorLy8gVE9ETzogdGVzdCBzdXBwb3J0IGZvciBkeW5hbWljIGNoYW5nZSBpbiByZXNvbHV0aW9uCisvLyBUT0RPOiB2ZXJpZnkgaWYgdGhlIGRlY29kZXIgc2VudCBiYWNrIGFsbCBmcmFtZXMKK3ZvaWQgQzJTb2Z0QXZjRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgdWludDMyX3Qgd29ya0luZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkgJiAweEZGRkZGRkZGOworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gclZpZXcuZXJyb3IoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBib29sIGhhc1BpY3R1cmUgPSBmYWxzZTsKKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICBpblNpemUsIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCB3b3JrLT5pbnB1dC5mbGFncyk7CisgICAgc2l6ZV90IGluUG9zID0gMDsKKyAgICB3aGlsZSAoaW5Qb3MgPCBpblNpemUpIHsKKyAgICAgICAgaWYgKEMyX09LICE9IGVuc3VyZURlY29kZXJTdGF0ZShwb29sKSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKKyAgICAgICAgeworICAgICAgICAgICAgQzJHcmFwaGljVmlldyB3VmlldyA9IG1PdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgICAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHdWaWV3LmVycm9yKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCAmclZpZXcsICZ3VmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk9mZnNldCArIGluUG9zLCBpblNpemUgLSBpblBvcywgd29ya0luZGV4KSkgeworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZmFsc2UgPT0gbUhlYWRlckRlY29kZWQpIHsKKyAgICAgICAgICAgICAgICAvKiBEZWNvZGUgaGVhZGVyIGFuZCBnZXQgZGltZW5zaW9ucyAqLworICAgICAgICAgICAgICAgIHNldFBhcmFtcyhtU3RyaWRlLCBJVkRfREVDT0RFX0hFQURFUik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFdPUkQzMiBkZWxheTsKKyAgICAgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgICAgICAgICAgVElNRV9ESUZGKG1UaW1lRW5kLCBtVGltZVN0YXJ0LCBkZWxheSk7CisgICAgICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgICAgIFdPUkQzMiBkZWNvZGVUaW1lOworICAgICAgICAgICAgR0VUVElNRSgmbVRpbWVFbmQsIG51bGxwdHIpOworICAgICAgICAgICAgVElNRV9ESUZGKG1UaW1lU3RhcnQsIG1UaW1lRW5kLCBkZWNvZGVUaW1lKTsKKyAgICAgICAgICAgIEFMT0dWKCJkZWNvZGVUaW1lPSU2ZCBkZWxheT0lNmQgbnVtQnl0ZXM9JTZkIiwgZGVjb2RlVGltZSwgZGVsYXksCisgICAgICAgICAgICAgICAgICBzX2RlY29kZV9vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQpOworICAgICAgICB9CisgICAgICAgIGlmIChJVkRfTUVNX0FMTE9DX0ZBSUxFRCA9PSAoc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSAmIElWRF9FUlJPUl9NQVNLKSkgeworICAgICAgICAgICAgQUxPR0UoImFsbG9jYXRpb24gZmFpbHVyZSBpbiBkZWNvZGVyIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChJVkRfU1RSRUFNX1dJRFRIX0hFSUdIVF9OT1RfU1VQUE9SVEVEID09IChzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlICYgSVZEX0VSUk9SX01BU0spKSB7CisgICAgICAgICAgICBBTE9HRSgidW5zdXBwb3J0ZWQgcmVzb2x1dGlvbiA6ICVkeCVkIiwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKElWRF9SRVNfQ0hBTkdFRCA9PSAoc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSAmIElWRF9FUlJPUl9NQVNLKSkgeworICAgICAgICAgICAgQUxPR1YoInJlc29sdXRpb24gY2hhbmdlZCIpOworICAgICAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfTk9fRU9TLCBwb29sLCB3b3JrKTsKKyAgICAgICAgICAgIHJlc2V0RGVjb2RlcigpOworICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisKKyAgICAgICAgICAgIC8qIERlY29kZSBoZWFkZXIgYW5kIGdldCBuZXcgZGltZW5zaW9ucyAqLworICAgICAgICAgICAgc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfSEVBREVSKTsKKyAgICAgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICB9IGVsc2UgaWYgKElTX0lWRF9GQVRBTF9FUlJPUihzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhdGFsIGVycm9yIGluIGRlY29kZXIgMHgleCIsIHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKDAgPCBzX2RlY29kZV9vcC51NF9waWNfd2QgJiYgMCA8IHNfZGVjb2RlX29wLnU0X3BpY19odCkgeworICAgICAgICAgICAgaWYgKG1IZWFkZXJEZWNvZGVkID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgbUhlYWRlckRlY29kZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHNldFBhcmFtcyhBTElHTjY0KHNfZGVjb2RlX29wLnU0X3BpY193ZCksIElWRF9ERUNPREVfRlJBTUUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X3BpY193ZCAhPSBtV2lkdGggfHwgc19kZWNvZGVfb3AudTRfcGljX2h0ICE9IG1IZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBtV2lkdGggPSBzX2RlY29kZV9vcC51NF9waWNfd2Q7CisgICAgICAgICAgICAgICAgbUhlaWdodCA9IHNfZGVjb2RlX29wLnU0X3BpY19odDsKKyAgICAgICAgICAgICAgICBDSEVDS19FUSgwdSwgc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpOworCisgICAgICAgICAgICAgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCBzaXplKDB1LCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKHsmc2l6ZX0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShzaXplKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBzZXQgd2lkdGggYW5kIGhlaWdodCIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKHZvaWQpZ2V0VnVpUGFyYW1zKCk7CisgICAgICAgIGhhc1BpY3R1cmUgfD0gKDEgPT0gc19kZWNvZGVfb3AudTRfZnJhbWVfZGVjb2RlZF9mbGFnKTsKKyAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICBmaW5pc2hXb3JrKHNfZGVjb2RlX29wLnU0X3RzLCB3b3JrKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoMCA9PSBzX2RlY29kZV9vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQpIHsKKyAgICAgICAgICAgIEFMT0dEKCJCeXRlcyBjb25zdW1lZCBpcyB6ZXJvLiBJZ25vcmluZyByZW1haW5pbmcgYnl0ZXMiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGluUG9zICs9IHNfZGVjb2RlX29wLnU0X251bV9ieXRlc19jb25zdW1lZDsKKyAgICAgICAgaWYgKGhhc1BpY3R1cmUgJiYgKGluU2l6ZSAtIGluUG9zKSkgeworICAgICAgICAgICAgQUxPR0QoImRlY29kZWQgZnJhbWUgaW4gY3VycmVudCBhY2Nlc3MgbmFsLCBpZ25vcmluZyBmdXJ0aGVyIHRyYWlsaW5nIGJ5dGVzICVkIiwKKyAgICAgICAgICAgICAgICAgIChpbnQpaW5TaXplIC0gKGludClpblBvcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZW9zKSB7CisgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TLCBwb29sLCB3b3JrKTsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgfSBlbHNlIGlmICghaGFzUGljdHVyZSkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIH0KKworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpkcmFpbkludGVybmFsKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIGlmIChPSyAhPSBzZXRGbHVzaE1vZGUoKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoQzJfT0sgIT0gZW5zdXJlRGVjb2RlclN0YXRlKHBvb2wpKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgQzJHcmFwaGljVmlldyB3VmlldyA9IG1PdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisgICAgICAgIGlmICghc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgbnVsbHB0ciwgJndWaWV3LCAwLCAwLCAwKSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICBpZiAoc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIGZpbmlzaFdvcmsoc19kZWNvZGVfb3AudTRfdHMsIHdvcmspOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICByZXR1cm4gZHJhaW5JbnRlcm5hbChkcmFpbk1vZGUsIHBvb2wsIG51bGxwdHIpOworfQorCitjbGFzcyBDMlNvZnRBdmNEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0QXZjRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0QXZjRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEF2Y0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRBdmNEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBdmNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRBdmNEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRBdmNEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmVlNTgzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5oCkBAIC0wLDAgKzEsMTk4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9BVkNfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9BVkNfREVDX0hfCisKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgImloMjY0X3R5cGVkZWZzLmgiCisjaW5jbHVkZSAiaXYuaCIKKyNpbmNsdWRlICJpdmQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIGl2ZGVjX2FwaV9mdW5jdGlvbiAgICAgICAgICAgICAgaWgyNjRkX2FwaV9mdW5jdGlvbgorI2RlZmluZSBpdmRleHRfY3JlYXRlX2lwX3QgICAgICAgICAgICAgIGloMjY0ZF9jcmVhdGVfaXBfdAorI2RlZmluZSBpdmRleHRfY3JlYXRlX29wX3QgICAgICAgICAgICAgIGloMjY0ZF9jcmVhdGVfb3BfdAorI2RlZmluZSBpdmRleHRfZGVsZXRlX2lwX3QgICAgICAgICAgICAgIGloMjY0ZF9kZWxldGVfaXBfdAorI2RlZmluZSBpdmRleHRfZGVsZXRlX29wX3QgICAgICAgICAgICAgIGloMjY0ZF9kZWxldGVfb3BfdAorI2RlZmluZSBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCAgIGloMjY0ZF9jdGxfc2V0X251bV9jb3Jlc19pcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90ICAgaWgyNjRkX2N0bF9zZXRfbnVtX2NvcmVzX29wX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19pcF90ICBpaDI2NGRfY3RsX2dldF92dWlfcGFyYW1zX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19vcF90ICBpaDI2NGRfY3RsX2dldF92dWlfcGFyYW1zX29wX3QKKyNkZWZpbmUgQUxJR042NCh4KSAgICAgICAgICAgICAgICAgICAgICAoKCgoeCkgKyA2MykgPj4gNikgPDwgNikKKyNkZWZpbmUgTUFYX05VTV9DT1JFUyAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMgICAgXAorICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKUlIMjY0RF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMKKyNkZWZpbmUgTUlOKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZGVmaW5lIEdFVFRJTUUoYSwgYikgICAgICAgICAgICAgICAgICAgZ2V0dGltZW9mZGF5KGEsIGIpOworI2RlZmluZSBUSU1FX0RJRkYoc3RhcnQsIGVuZCwgZGlmZikgICAgIFwKKyAgICBkaWZmID0gKCgoZW5kKS50dl9zZWMgLSAoc3RhcnQpLnR2X3NlYykgKiAxMDAwMDAwKSArIFwKKyAgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKKworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKyAgICAjZGVmaW5lIElOUFVUX0RVTVBfUEFUSCAgICAgIi9zZGNhcmQvY2xpcHMvYXZjZF9pbnB1dCIKKyAgICAjZGVmaW5lIElOUFVUX0RVTVBfRVhUICAgICAgImgyNjQiCisgICAgI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0cmNweShtSW5GaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNwcmludGYobUluRmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBJTlBVVF9EVU1QX1BBVEgsICBcCisgICAgICAgICAgICAgICAgbVRpbWVTdGFydC50dl9zZWMsIG1UaW1lU3RhcnQudHZfdXNlYywgICAgICBcCisgICAgICAgICAgICAgICAgSU5QVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorICAgICNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKSB7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBGSUxFICpmcCA9IGZvcGVuKG1fZmlsZW5hbWUsICJ3YiIpOyAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZnAgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCBvcGVuIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyAgICAjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplLCBtX29mZnNldClcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEZJTEUgKmZwID0gZm9wZW4obV9maWxlbmFtZSwgImFiIik7ICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChmcCAhPSBOVUxMICYmIG1fYnVmICE9IE5VTEwgJiYgbV9vZmZzZXQgPT0gMCkgeyBcCisgICAgICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpID0gZndyaXRlKG1fYnVmLCAxLCBtX3NpemUsIGZwKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiZndyaXRlIHJldCAlZCB0byB3cml0ZSAlZCIsIGksIG1fc2l6ZSk7ICBcCisgICAgICAgICAgICBpZiAoaSAhPSAoaW50KSBtX3NpemUpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQUxPR0QoIkVycm9yIGluIGZ3cml0ZSwgcmV0dXJuZWQgJWQiLCBpKTsgICBcCisgICAgICAgICAgICAgICAgcGVycm9yKCJFcnJvciBpbiB3cml0ZSB0byBmaWxlIik7ICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSBpZiAoZnAgPT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiQ291bGQgbm90IHdyaXRlIHRvIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTtcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChmcCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UgLyogRklMRV9EVU1QX0VOQUJMRSAqLworICAgICNkZWZpbmUgSU5QVVRfRFVNUF9QQVRICisgICAgI2RlZmluZSBJTlBVVF9EVU1QX0VYVAorICAgICNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSAorICAgICNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUCisgICAgI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkKKyAgICAjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkKKyAgICAjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplLCBtX29mZnNldCkKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKKworY2xhc3MgQzJTb2Z0QXZjRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKK3B1YmxpYzoKKyAgICBjbGFzcyBJbnRmSW1wbDsKKyAgICBDMlNvZnRBdmNEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0QXZjRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0YXR1c190IGNyZWF0ZURlY29kZXIoKTsKKyAgICBzdGF0dXNfdCBzZXROdW1Db3JlcygpOworICAgIHN0YXR1c190IHNldFBhcmFtcyhzaXplX3Qgc3RyaWRlLCBJVkRfVklERU9fREVDT0RFX01PREVfVCBkZWNfbW9kZSk7CisgICAgdm9pZCBnZXRWZXJzaW9uKCk7CisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBib29sIHNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNvZGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjb2RlX29wLAorICAgICAgICAgICAgICAgICAgICAgICBDMlJlYWRWaWV3ICppbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgQzJHcmFwaGljVmlldyAqb3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRzTWFya2VyKTsKKyAgICBib29sIGdldFZ1aVBhcmFtcygpOworICAgIGMyX3N0YXR1c190IGVuc3VyZURlY29kZXJTdGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKTsKKyAgICB2b2lkIGZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKyAgICBzdGF0dXNfdCBzZXRGbHVzaE1vZGUoKTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbkludGVybmFsKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKyAgICBzdGF0dXNfdCByZXNldERlY29kZXIoKTsKKyAgICB2b2lkIHJlc2V0UGx1Z2luKCk7CisgICAgc3RhdHVzX3QgZGVsZXRlRGVjb2RlcigpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKworICAgIC8vIFRPRE86VGhpcyBpcyBub3QgdGhlIHJpZ2h0IHBsYWNlIGZvciB0aGlzIGVudW0uIFRoZXNlIHNob3VsZAorICAgIC8vIGJlIHBhcnQgb2YgYzItdm5kayBzbyB0aGF0IHRoZXkgY2FuIGJlIGFjY2Vzc2VkIGJ5IGFsbCB2aWRlbyBwbHVnaW5zCisgICAgLy8gdW50aWwgdGhlbiwgbWFrZSB0aGVtIGZlZWwgYXQgaG9tZQorICAgIGVudW0geworICAgICAgICBrTm90U3VwcG9ydGVkLAorICAgICAgICBrUHJlZmVyQml0c3RyZWFtLAorICAgICAgICBrUHJlZmVyQ29udGFpbmVyLAorICAgIH07CisKKyAgICBpdl9vYmpfdCAqbURlY0hhbmRsZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IG1PdXRCbG9jazsKKyAgICB1aW50OF90ICptT3V0QnVmZmVyRmx1c2g7CisKKyAgICBzaXplX3QgbU51bUNvcmVzOworICAgIElWX0NPTE9SX0ZPUk1BVF9UIG1JdkNvbG9yRm9ybWF0OworCisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CisgICAgdWludDMyX3QgbVN0cmlkZTsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtSGVhZGVyRGVjb2RlZDsKKyAgICBzdGQ6OmF0b21pY191aW50NjRfdCBtT3V0SW5kZXg7CisgICAgLy8gQ29sb3IgYXNwZWN0cy4gVGhlc2UgYXJlIElTTyB2YWx1ZXMgYW5kIGFyZSBtZWFudCB0byBkZXRlY3QgY2hhbmdlcyBpbiBhc3BlY3RzIHRvIGF2b2lkCisgICAgLy8gY29udmVydGluZyB0aGVtIHRvIEMyIHZhbHVlcyBmb3IgZWFjaCBmcmFtZQorICAgIHN0cnVjdCBWdWlDb2xvckFzcGVjdHMgeworICAgICAgICB1aW50OF90IHByaW1hcmllczsKKyAgICAgICAgdWludDhfdCB0cmFuc2ZlcjsKKyAgICAgICAgdWludDhfdCBjb2VmZnM7CisgICAgICAgIHVpbnQ4X3QgZnVsbFJhbmdlOworCisgICAgICAgIC8vIGRlZmF1bHQgY29sb3IgYXNwZWN0cworICAgICAgICBWdWlDb2xvckFzcGVjdHMoKQorICAgICAgICAgICAgOiBwcmltYXJpZXMoMiksIHRyYW5zZmVyKDIpLCBjb2VmZnMoMiksIGZ1bGxSYW5nZSgwKSB7IH0KKworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgVnVpQ29sb3JBc3BlY3RzICZvKSB7CisgICAgICAgICAgICByZXR1cm4gcHJpbWFyaWVzID09IG8ucHJpbWFyaWVzICYmIHRyYW5zZmVyID09IG8udHJhbnNmZXIgJiYgY29lZmZzID09IG8uY29lZmZzCisgICAgICAgICAgICAgICAgICAgICYmIGZ1bGxSYW5nZSA9PSBvLmZ1bGxSYW5nZTsKKyAgICAgICAgfQorICAgIH0gbUJpdHN0cmVhbUNvbG9yQXNwZWN0czsKKworICAgIC8vIHByb2ZpbGUKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZVN0YXJ0OworICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lRW5kOworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKyAgICBjaGFyIG1JbkZpbGVbMjAwXTsKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRBdmNEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfQVZDX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0VuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDFjMjcxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0VuYy5jcHAKQEAgLTAsMCArMSwxNzY1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEF2Y0VuYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgorCisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPENvZGVjMkJ1ZmZlclV0aWxzLmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisKKyNpbmNsdWRlICJDMlNvZnRBdmNFbmMuaCIKKyNpbmNsdWRlICJpaDI2NGUuaCIKKyNpbmNsdWRlICJpaDI2NGVfZXJyb3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuYXZjLmVuY29kZXIiOworCit2b2lkIFBhcnNlR29wKAorICAgICAgICBjb25zdCBDMlN0cmVhbUdvcFR1bmluZzo6b3V0cHV0ICZnb3AsCisgICAgICAgIHVpbnQzMl90ICpzeW5jSW50ZXJ2YWwsIHVpbnQzMl90ICppSW50ZXJ2YWwsIHVpbnQzMl90ICptYXhCZnJhbWVzKSB7CisgICAgdWludDMyX3Qgc3luY0ludCA9IDE7CisgICAgdWludDMyX3QgaUludCA9IDE7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBnb3AuZmxleENvdW50KCk7ICsraSkgeworICAgICAgICBjb25zdCBDMkdvcExheWVyU3RydWN0ICZsYXllciA9IGdvcC5tLnZhbHVlc1tpXTsKKyAgICAgICAgaWYgKGxheWVyLmNvdW50ID09IFVJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgIHN5bmNJbnQgPSAwOworICAgICAgICB9IGVsc2UgaWYgKHN5bmNJbnQgPD0gVUlOVDMyX01BWCAvIChsYXllci5jb3VudCArIDEpKSB7CisgICAgICAgICAgICBzeW5jSW50ICo9IChsYXllci5jb3VudCArIDEpOworICAgICAgICB9CisgICAgICAgIGlmICgobGF5ZXIudHlwZV8gJiBJX0ZSQU1FKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAobGF5ZXIuY291bnQgPT0gVUlOVDMyX01BWCkgeworICAgICAgICAgICAgICAgIGlJbnQgPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmIChpSW50IDw9IFVJTlQzMl9NQVggLyAobGF5ZXIuY291bnQgKyAxKSkgeworICAgICAgICAgICAgICAgIGlJbnQgKj0gKGxheWVyLmNvdW50ICsgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxheWVyLnR5cGVfID09IEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdChQX0ZSQU1FIHwgQl9GUkFNRSkgJiYgbWF4QmZyYW1lcykgeworICAgICAgICAgICAgKm1heEJmcmFtZXMgPSBsYXllci5jb3VudDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3luY0ludGVydmFsKSB7CisgICAgICAgICpzeW5jSW50ZXJ2YWwgPSBzeW5jSW50OworICAgIH0KKyAgICBpZiAoaUludGVydmFsKSB7CisgICAgICAgICppSW50ZXJ2YWwgPSBpSW50OworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2NsYXNzIEMyU29mdEF2Y0VuYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fVklERU8sCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsgLy8gVE9ETzogYWNjb3VudCBmb3Igb3VyIGJ1ZmZlcnMgaGVyZQorICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Vc2FnZSwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX1VTQUdFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgKHVpbnQ2NF90KUMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZygKKyAgICAgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDI1NjAsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAyNTYwLCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNpemVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtR29wLCBDMl9QQVJBTUtFWV9HT1ApCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KEMyU3RyZWFtR29wVHVuaW5nOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBmbGV4Q291bnQgKi8sIDB1IC8qIHN0cmVhbSAqLykpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtR29wLCBtLnZhbHVlc1swXS50eXBlXykuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtR29wLCBtLnZhbHVlc1swXS5jb3VudCkuYW55KCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKEdvcFNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BY3R1YWxJbnB1dERlbGF5LCBDMl9QQVJBTUtFWV9JTlBVVF9ERUxBWSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjppbnB1dChERUZBVUxUX0JfRlJBTUVTKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1BY3R1YWxJbnB1dERlbGF5LCB2YWx1ZSkuaW5SYW5nZSgwLCBNQVhfQl9GUkFNRVMpfSkKKyAgICAgICAgICAgICAgICAuY2FsY3VsYXRlZEFzKElucHV0RGVsYXlTZXR0ZXIsIG1Hb3ApCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRnJhbWVSYXRlLCBDMl9QQVJBTUtFWV9GUkFNRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDMwLikpCisgICAgICAgICAgICAgICAgLy8gVE9ETzogTW9yZSByZXN0cmljdGlvbj8KKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1GcmFtZVJhdGUsIHZhbHVlKS5ncmVhdGVyVGhhbigwLil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUZyYW1lUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dCgwdSwgNjQwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDQwOTYsIDEyMDAwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQml0cmF0ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnRyYVJlZnJlc2gsIEMyX1BBUkFNS0VZX0lOVFJBX1JFRlJFU0gpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0RJU0FCTEVELCAwLikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUludHJhUmVmcmVzaCwgbW9kZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OklOVFJBX1JFRlJFU0hfRElTQUJMRUQsIEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0FSQklUUkFSWSB9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1JbnRyYVJlZnJlc2gsIHBlcmlvZCkuYW55KCkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKEludHJhUmVmcmVzaFNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORSwgTEVWRUxfQVZDXzRfMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgUFJPRklMRV9BVkNfQkFTRUxJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICBQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBST0ZJTEVfQVZDX01BSU4sCisgICAgICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18xLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzFCLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzFfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18xXzIsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfMV8zLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzIsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfMl8xLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzJfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18zLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzNfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18zXzIsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ180XzEsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfNF8yLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzUsCisgICAgICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSwgbUZyYW1lUmF0ZSwgbUJpdHJhdGUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUmVxdWVzdFN5bmMsIEMyX1BBUkFNS0VZX1JFUVVFU1RfU1lOQ19GUkFNRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0KDB1LCBDMl9GQUxTRSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtUmVxdWVzdFN5bmMsIHZhbHVlKS5vbmVPZih7IEMyX0ZBTFNFLCBDMl9UUlVFIH0pIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptUmVxdWVzdFN5bmMpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVN5bmNGcmFtZVBlcmlvZCwgQzJfUEFSQU1LRVlfU1lOQ19GUkFNRV9JTlRFUlZBTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc6Om91dHB1dCgwdSwgMTAwMDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU3luY0ZyYW1lUGVyaW9kLCB2YWx1ZSkuYW55KCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbVN5bmNGcmFtZVBlcmlvZCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgSW5wdXREZWxheVNldHRlcigKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICBDMlA8QzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6OmlucHV0PiAmbWUsCisgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1Hb3BUdW5pbmc6Om91dHB1dD4gJmdvcCkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgdWludDMyX3QgbWF4QmZyYW1lcyA9IDA7CisgICAgICAgIFBhcnNlR29wKGdvcC52LCBudWxscHRyLCBudWxscHRyLCAmbWF4QmZyYW1lcyk7CisgICAgICAgIG1lLnNldCgpLnZhbHVlID0gbWF4QmZyYW1lczsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEJpdHJhdGVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAobWUudi52YWx1ZSA8PSA0MDk2KSB7CisgICAgICAgICAgICBtZS5zZXQoKS52YWx1ZSA9IDQwOTY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiAmbWUsCisgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmc2l6ZSwKKyAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gJmZyYW1lUmF0ZSwKKyAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+ICZiaXRyYXRlKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAoIW1lLkYobWUudi5wcm9maWxlKS5zdXBwb3J0c0F0QWxsKG1lLnYucHJvZmlsZSkpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnByb2ZpbGUgPSBQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORTsKKyAgICAgICAgfQorCisgICAgICAgIHN0cnVjdCBMZXZlbExpbWl0cyB7CisgICAgICAgICAgICBDMkNvbmZpZzo6bGV2ZWxfdCBsZXZlbDsKKyAgICAgICAgICAgIGZsb2F0IG1ic1BlclNlYzsKKyAgICAgICAgICAgIHVpbnQ2NF90IG1iczsKKyAgICAgICAgICAgIHVpbnQzMl90IGJpdHJhdGU7CisgICAgICAgIH07CisgICAgICAgIGNvbnN0ZXhwciBMZXZlbExpbWl0cyBrTGltaXRzW10gPSB7CisgICAgICAgICAgICB7IExFVkVMX0FWQ18xLCAgICAgMTQ4NSwgICAgOTksICAgICA2NDAwMCB9LAorICAgICAgICAgICAgLy8gRGVjb2RlciBkb2VzIG5vdCBwcm9wZXJseSBoYW5kbGUgbGV2ZWwgMWIuCisgICAgICAgICAgICAvLyB7IExFVkVMX0FWQ18xQiwgICAgMTQ4NSwgICA5OSwgICAxMjgwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzFfMSwgICAzMDAwLCAgIDM5NiwgICAgMTkyMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18xXzIsICAgNjAwMCwgICAzOTYsICAgIDM4NDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMV8zLCAgMTE4ODAsICAgMzk2LCAgICA3NjgwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzIsICAgIDExODgwLCAgIDM5NiwgICAyMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18yXzEsICAxOTgwMCwgICA3OTIsICAgNDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMl8yLCAgMjAyNTAsICAxNjIwLCAgIDQwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzMsICAgIDQwNTAwLCAgMTYyMCwgIDEwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18zXzEsIDEwODAwMCwgIDM2MDAsICAxNDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfM18yLCAyMTYwMDAsICA1MTIwLCAgMjAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzQsICAgMjQ1NzYwLCAgODE5MiwgIDIwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ180XzEsIDI0NTc2MCwgIDgxOTIsICA1MDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfNF8yLCA1MjIyNDAsICA4NzA0LCAgNTAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzUsICAgNTg5ODI0LCAyMjA4MCwgMTM1MDAwMDAwIH0sCisgICAgICAgIH07CisKKyAgICAgICAgdWludDY0X3QgbWJzID0gdWludDY0X3QoKHNpemUudi53aWR0aCArIDE1KSAvIDE2KSAqICgoc2l6ZS52LmhlaWdodCArIDE1KSAvIDE2KTsKKyAgICAgICAgZmxvYXQgbWJzUGVyU2VjID0gZmxvYXQobWJzKSAqIGZyYW1lUmF0ZS52LnZhbHVlOworCisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBzdXBwbGllZCBsZXZlbCBtZWV0cyB0aGUgTUIgLyBiaXRyYXRlIHJlcXVpcmVtZW50cy4gSWYKKyAgICAgICAgLy8gbm90LCB1cGRhdGUgdGhlIGxldmVsIHdpdGggdGhlIGxvd2VzdCBsZXZlbCBtZWV0aW5nIHRoZSByZXF1aXJlbWVudHMuCisKKyAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICAvLyBCeSBkZWZhdWx0IG5lZWRzVXBkYXRlID0gZmFsc2UgaW4gY2FzZSB0aGUgc3VwcGxpZWQgbGV2ZWwgZG9lcyBtZWV0CisgICAgICAgIC8vIHRoZSByZXF1aXJlbWVudHMuIEZvciBMZXZlbCAxYiwgd2Ugd2FudCB0byB1cGRhdGUgdGhlIGxldmVsIGFueXdheSwKKyAgICAgICAgLy8gc28gd2Ugc2V0IGl0IHRvIHRydWUgaW4gdGhhdCBjYXNlLgorICAgICAgICBib29sIG5lZWRzVXBkYXRlID0gKG1lLnYubGV2ZWwgPT0gTEVWRUxfQVZDXzFCKTsKKyAgICAgICAgZm9yIChjb25zdCBMZXZlbExpbWl0cyAmbGltaXQgOiBrTGltaXRzKSB7CisgICAgICAgICAgICBpZiAobWJzIDw9IGxpbWl0Lm1icyAmJiBtYnNQZXJTZWMgPD0gbGltaXQubWJzUGVyU2VjICYmCisgICAgICAgICAgICAgICAgICAgIGJpdHJhdGUudi52YWx1ZSA8PSBsaW1pdC5iaXRyYXRlKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgbG93ZXN0IGxldmVsIHRoYXQgbWVldHMgdGhlIHJlcXVpcmVtZW50cywgYW5kIGlmCisgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZW4ndCBzZWVuIHRoZSBzdXBwbGllZCBsZXZlbCB5ZXQsIHRoYXQgbWVhbnMgd2UgZG9uJ3QKKyAgICAgICAgICAgICAgICAvLyBuZWVkIHRoZSB1cGRhdGUuCisgICAgICAgICAgICAgICAgaWYgKG5lZWRzVXBkYXRlKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJHaXZlbiBsZXZlbCAleCBkb2VzIG5vdCBjb3ZlciBjdXJyZW50IGNvbmZpZ3VyYXRpb246ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImFkanVzdGluZyB0byAleCIsIG1lLnYubGV2ZWwsIGxpbWl0LmxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgbWUuc2V0KCkubGV2ZWwgPSBsaW1pdC5sZXZlbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1lLnYubGV2ZWwgPT0gbGltaXQubGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBicmVhayBvdXQgb2YgdGhlIGxvb3Agd2hlbiB0aGUgbG93ZXN0IGZlYXNpYmxlIGxldmVsIGlzCisgICAgICAgICAgICAgICAgLy8gZm91bmQuIFRoZSBmYWN0IHRoYXQgd2UncmUgaGVyZSBtZWFucyB0aGF0IG91ciBsZXZlbCBkb2Vzbid0CisgICAgICAgICAgICAgICAgLy8gbWVldCB0aGUgcmVxdWlyZW1lbnQgYW5kIG5lZWRzIHRvIGJlIHVwZGF0ZWQuCisgICAgICAgICAgICAgICAgbmVlZHNVcGRhdGUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgIC8vIFdlIHNldCB0byB0aGUgaGlnaGVzdCBzdXBwb3J0ZWQgbGV2ZWwuCisgICAgICAgICAgICBtZS5zZXQoKS5sZXZlbCA9IExFVkVMX0FWQ181OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEludHJhUmVmcmVzaFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAobWUudi5wZXJpb2QgPCAxKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5tb2RlID0gQzJDb25maWc6OklOVFJBX1JFRlJFU0hfRElTQUJMRUQ7CisgICAgICAgICAgICBtZS5zZXQoKS5wZXJpb2QgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gb25seSBzdXBwb3J0IGFyYml0cmFyeSBtb2RlIChjeWNsaWMgaW4gb3VyIGNhc2UpCisgICAgICAgICAgICBtZS5zZXQoKS5tb2RlID0gQzJDb25maWc6OklOVFJBX1JFRlJFU0hfQVJCSVRSQVJZOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBHb3BTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtR29wVHVuaW5nOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtZS52LmZsZXhDb3VudCgpOyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IEMyR29wTGF5ZXJTdHJ1Y3QgJmxheWVyID0gbWUudi5tLnZhbHVlc1swXTsKKyAgICAgICAgICAgIGlmIChsYXllci50eXBlXyA9PSBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QoUF9GUkFNRSB8IEJfRlJBTUUpCisgICAgICAgICAgICAgICAgICAgICYmIGxheWVyLmNvdW50ID4gTUFYX0JfRlJBTUVTKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkubS52YWx1ZXNbaV0uY291bnQgPSBNQVhfQl9GUkFNRVM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBJVl9QUk9GSUxFX1QgZ2V0UHJvZmlsZV9sKCkgY29uc3QgeworICAgICAgICBzd2l0Y2ggKG1Qcm9maWxlTGV2ZWwtPnByb2ZpbGUpIHsKKyAgICAgICAgY2FzZSBQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORTogIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgY2FzZSBQUk9GSUxFX0FWQ19CQVNFTElORTogcmV0dXJuIElWX1BST0ZJTEVfQkFTRTsKKyAgICAgICAgY2FzZSBQUk9GSUxFX0FWQ19NQUlOOiAgICAgcmV0dXJuIElWX1BST0ZJTEVfTUFJTjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dEKCJVbnJlY29nbml6ZWQgcHJvZmlsZTogJXgiLCBtUHJvZmlsZUxldmVsLT5wcm9maWxlKTsKKyAgICAgICAgICAgIHJldHVybiBJVl9QUk9GSUxFX0RFRkFVTFQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBVV09SRDMyIGdldExldmVsX2woKSBjb25zdCB7CisgICAgICAgIHN0cnVjdCBMZXZlbCB7CisgICAgICAgICAgICBDMkNvbmZpZzo6bGV2ZWxfdCBjMkxldmVsOworICAgICAgICAgICAgVVdPUkQzMiBhdmNMZXZlbDsKKyAgICAgICAgfTsKKyAgICAgICAgY29uc3RleHByIExldmVsIGxldmVsc1tdID0geworICAgICAgICAgICAgeyBMRVZFTF9BVkNfMSwgICAxMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMUIsICAgOSB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMV8xLCAxMSB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMV8yLCAxMiB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMV8zLCAxMyB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMiwgICAyMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMl8xLCAyMSB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMl8yLCAyMiB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMywgICAzMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfM18xLCAzMSB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfM18yLCAzMiB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfNCwgICA0MCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfNF8xLCA0MSB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfNF8yLCA0MiB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfNSwgICA1MCB9LAorICAgICAgICB9OworICAgICAgICBmb3IgKGNvbnN0IExldmVsICZsZXZlbCA6IGxldmVscykgeworICAgICAgICAgICAgaWYgKG1Qcm9maWxlTGV2ZWwtPmxldmVsID09IGxldmVsLmMyTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGV2ZWwuYXZjTGV2ZWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR0QoIlVucmVjb2duaXplZCBsZXZlbDogJXgiLCBtUHJvZmlsZUxldmVsLT5sZXZlbCk7CisgICAgICAgIHJldHVybiA0MTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBnZXRTeW5jRnJhbWVQZXJpb2RfbCgpIGNvbnN0IHsKKyAgICAgICAgaWYgKG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlIDwgMCB8fCBtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSA9PSBJTlQ2NF9NQVgpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGRvdWJsZSBwZXJpb2QgPSBtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSAvIDFlNiAqIG1GcmFtZVJhdGUtPnZhbHVlOworICAgICAgICByZXR1cm4gKHVpbnQzMl90KWMyX21heChjMl9taW4ocGVyaW9kICsgMC41LCBkb3VibGUoVUlOVDMyX01BWCkpLCAxLik7CisgICAgfQorCisgICAgLy8gdW5zYWZlIGdldHRlcnMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBnZXRTaXplX2woKSBjb25zdCB7IHJldHVybiBtU2l6ZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBnZXRJbnRyYVJlZnJlc2hfbCgpIGNvbnN0IHsgcmV0dXJuIG1JbnRyYVJlZnJlc2g7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IGdldEZyYW1lUmF0ZV9sKCkgY29uc3QgeyByZXR1cm4gbUZyYW1lUmF0ZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IGdldEJpdHJhdGVfbCgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PiBnZXRSZXF1ZXN0U3luY19sKCkgY29uc3QgeyByZXR1cm4gbVJlcXVlc3RTeW5jOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtR29wVHVuaW5nOjpvdXRwdXQ+IGdldEdvcF9sKCkgY29uc3QgeyByZXR1cm4gbUdvcDsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVVzYWdlVHVuaW5nOjppbnB1dD4gbVVzYWdlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gbUZyYW1lUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+IG1SZXF1ZXN0U3luYzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dD4gbUludHJhUmVmcmVzaDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc6Om91dHB1dD4gbVN5bmNGcmFtZVBlcmlvZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Hb3BUdW5pbmc6Om91dHB1dD4gbUdvcDsKK307CisKKyNkZWZpbmUgaXZlX2FwaV9mdW5jdGlvbiAgaWgyNjRlX2FwaV9mdW5jdGlvbgorCituYW1lc3BhY2UgeworCisvLyBGcm9tIGV4dGVybmFsL2xpYmF2Yy9lbmNvZGVyL2loMjY0ZV9iaXRzdHJlYW0uaAorY29uc3RleHByIHVpbnQzMl90IE1JTl9TVFJFQU1fU0laRSA9IDB4ODAwOworCitzdGF0aWMgc2l6ZV90IEdldENQVUNvcmVDb3VudCgpIHsKKyAgICBsb25nIGNwdUNvcmVDb3VudCA9IDE7CisjaWYgZGVmaW5lZChfU0NfTlBST0NFU1NPUlNfT05MTikKKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKyNlbHNlCisgICAgLy8gX1NDX05QUk9DX09OTE4gbXVzdCBiZSBkZWZpbmVkLi4uCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NfT05MTik7CisjZW5kaWYKKyAgICBDSEVDSyhjcHVDb3JlQ291bnQgPj0gMSk7CisgICAgQUxPR1YoIk51bWJlciBvZiBDUFUgY29yZXM6ICVsZCIsIGNwdUNvcmVDb3VudCk7CisgICAgcmV0dXJuIChzaXplX3QpY3B1Q29yZUNvdW50OworfQorCit9ICAvLyBuYW1lc3BhY2UKKworQzJTb2Z0QXZjRW5jOjpDMlNvZnRBdmNFbmMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUl2VmlkZW9Db2xvckZvcm1hdChJVl9ZVVZfNDIwUCksCisgICAgICBtQVZDRW5jUHJvZmlsZShJVl9QUk9GSUxFX0JBU0UpLAorICAgICAgbUFWQ0VuY0xldmVsKDQxKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1TYXdJbnB1dEVPUyhmYWxzZSksCisgICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpLAorICAgICAgbUNvZGVjQ3R4KG51bGxwdHIpLAorICAgICAgbU91dEJsb2NrKG51bGxwdHIpLAorICAgICAgLy8gVE9ETzogb3V0cHV0IGJ1ZmZlciBzaXplCisgICAgICBtT3V0QnVmZmVyU2l6ZSg1MjQyODgpIHsKKworICAgIC8vIElmIGR1bXAgaXMgZW5hYmxlZCwgdGhlbiBvcGVuIGNyZWF0ZSBhbiBlbXB0eSBmaWxlCisgICAgR0VORVJBVEVfRklMRV9OQU1FUygpOworICAgIENSRUFURV9EVU1QX0ZJTEUobUluRmlsZSk7CisgICAgQ1JFQVRFX0RVTVBfRklMRShtT3V0RmlsZSk7CisKKyAgICBpbml0RW5jUGFyYW1zKCk7Cit9CisKK0MyU29mdEF2Y0VuYzo6fkMyU29mdEF2Y0VuYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpvbkluaXQoKSB7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6Om9uU3RvcCgpIHsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QXZjRW5jOjpvblJlc2V0KCkgeworICAgIC8vIFRPRE86IHVzZSBJVkVfQ01EX0NUTF9SRVNFVD8KKyAgICByZWxlYXNlRW5jb2RlcigpOworICAgIGlmIChtT3V0QmxvY2spIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorICAgIGluaXRFbmNQYXJhbXMoKTsKK30KKwordm9pZCBDMlNvZnRBdmNFbmM6Om9uUmVsZWFzZSgpIHsKKyAgICByZWxlYXNlRW5jb2RlcigpOworICAgIGlmIChtT3V0QmxvY2spIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6Om9uRmx1c2hfc20oKSB7CisgICAgLy8gVE9ETzogdXNlIElWRV9DTURfQ1RMX0ZMVVNIPworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCAgQzJTb2Z0QXZjRW5jOjppbml0RW5jUGFyYW1zKCkgeworICAgIG1Db2RlY0N0eCA9IG51bGxwdHI7CisgICAgbU1lbVJlY29yZHMgPSBudWxscHRyOworICAgIG1OdW1NZW1SZWNvcmRzID0gREVGQVVMVF9NRU1fUkVDX0NOVDsKKyAgICBtSGVhZGVyR2VuZXJhdGVkID0gMDsKKyAgICBtTnVtQ29yZXMgPSBHZXRDUFVDb3JlQ291bnQoKTsKKyAgICBtQXJjaCA9IERFRkFVTFRfQVJDSDsKKyAgICBtU2xpY2VNb2RlID0gREVGQVVMVF9TTElDRV9NT0RFOworICAgIG1TbGljZVBhcmFtID0gREVGQVVMVF9TTElDRV9QQVJBTTsKKyAgICBtSGFsZlBlbEVuYWJsZSA9IERFRkFVTFRfSFBFTDsKKyAgICBtSUludGVydmFsID0gREVGQVVMVF9JX0lOVEVSVkFMOworICAgIG1JRFJJbnRlcnZhbCA9IERFRkFVTFRfSURSX0lOVEVSVkFMOworICAgIG1EaXNhYmxlRGVibGtMZXZlbCA9IERFRkFVTFRfRElTQUJMRV9ERUJMS19MRVZFTDsKKyAgICBtRW5hYmxlRmFzdFNhZCA9IERFRkFVTFRfRU5BQkxFX0ZBU1RfU0FEOworICAgIG1FbmFibGVBbHRSZWYgPSBERUZBVUxUX0VOQUJMRV9BTFRfUkVGOworICAgIG1FbmNTcGVlZCA9IERFRkFVTFRfRU5DX1NQRUVEOworICAgIG1JbnRyYTR4NCA9IERFRkFVTFRfSU5UUkE0eDQ7CisgICAgbUNvbnN0cmFpbmVkSW50cmFGbGFnID0gREVGQVVMVF9DT05TVFJBSU5FRF9JTlRSQTsKKyAgICBtUFNOUkVuYWJsZSA9IERFRkFVTFRfUFNOUl9FTkFCTEU7CisgICAgbVJlY29uRW5hYmxlID0gREVGQVVMVF9SRUNPTl9FTkFCTEU7CisgICAgbUVudHJvcHlNb2RlID0gREVGQVVMVF9FTlRST1BZX01PREU7CisgICAgbUJmcmFtZXMgPSBERUZBVUxUX0JfRlJBTUVTOworCisgICAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBudWxscHRyKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXREaW1lbnNpb25zKCkgeworICAgIGl2ZV9jdGxfc2V0X2RpbWVuc2lvbnNfaXBfdCBzX2RpbWVuc2lvbnNfaXA7CisgICAgaXZlX2N0bF9zZXRfZGltZW5zaW9uc19vcF90IHNfZGltZW5zaW9uc19vcDsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX2RpbWVuc2lvbnNfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2RpbWVuc2lvbnNfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0RJTUVOU0lPTlM7CisgICAgc19kaW1lbnNpb25zX2lwLnU0X2h0ID0gbVNpemUtPmhlaWdodDsKKyAgICBzX2RpbWVuc2lvbnNfaXAudTRfd2QgPSBtU2l6ZS0+d2lkdGg7CisKKyAgICBzX2RpbWVuc2lvbnNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2RpbWVuc2lvbnNfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19kaW1lbnNpb25zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZGltZW5zaW9uc19pcF90KTsKKyAgICBzX2RpbWVuc2lvbnNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9kaW1lbnNpb25zX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2RpbWVuc2lvbnNfaXAsICZzX2RpbWVuc2lvbnNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBmcmFtZSBkaW1lbnNpb25zID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX2RpbWVuc2lvbnNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXROdW1Db3JlcygpIHsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgaXZlX2N0bF9zZXRfbnVtX2NvcmVzX2lwX3Qgc19udW1fY29yZXNfaXA7CisgICAgaXZlX2N0bF9zZXRfbnVtX2NvcmVzX29wX3Qgc19udW1fY29yZXNfb3A7CisgICAgc19udW1fY29yZXNfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX251bV9jb3Jlc19pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfTlVNX0NPUkVTOworICAgIHNfbnVtX2NvcmVzX2lwLnU0X251bV9jb3JlcyA9IE1JTihtTnVtQ29yZXMsIENPREVDX01BWF9DT1JFUyk7CisgICAgc19udW1fY29yZXNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX251bV9jb3Jlc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisgICAgc19udW1fY29yZXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9udW1fY29yZXNfaXBfdCk7CisKKyAgICBzX251bV9jb3Jlc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X251bV9jb3Jlc19vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24oCisgICAgICAgICAgICBtQ29kZWNDdHgsICh2b2lkICopICZzX251bV9jb3Jlc19pcCwgKHZvaWQgKikgJnNfbnVtX2NvcmVzX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgcHJvY2Vzc29yIHBhcmFtcyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19udW1fY29yZXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRGcmFtZVJhdGUoKSB7CisgICAgaXZlX2N0bF9zZXRfZnJhbWVfcmF0ZV9pcF90IHNfZnJhbWVfcmF0ZV9pcDsKKyAgICBpdmVfY3RsX3NldF9mcmFtZV9yYXRlX29wX3Qgc19mcmFtZV9yYXRlX29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfZnJhbWVfcmF0ZV9pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfZnJhbWVfcmF0ZV9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfRlJBTUVSQVRFOworCisgICAgc19mcmFtZV9yYXRlX2lwLnU0X3NyY19mcmFtZV9yYXRlID0gbUZyYW1lUmF0ZS0+dmFsdWUgKyAwLjU7CisgICAgc19mcmFtZV9yYXRlX2lwLnU0X3RndF9mcmFtZV9yYXRlID0gbUZyYW1lUmF0ZS0+dmFsdWUgKyAwLjU7CisKKyAgICBzX2ZyYW1lX3JhdGVfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2ZyYW1lX3JhdGVfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19mcmFtZV9yYXRlX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZnJhbWVfcmF0ZV9pcF90KTsKKyAgICBzX2ZyYW1lX3JhdGVfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9mcmFtZV9yYXRlX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2ZyYW1lX3JhdGVfaXAsICZzX2ZyYW1lX3JhdGVfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBmcmFtZSByYXRlID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX2ZyYW1lX3JhdGVfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRJcGVQYXJhbXMoKSB7CisgICAgaXZlX2N0bF9zZXRfaXBlX3BhcmFtc19pcF90IHNfaXBlX3BhcmFtc19pcDsKKyAgICBpdmVfY3RsX3NldF9pcGVfcGFyYW1zX29wX3Qgc19pcGVfcGFyYW1zX29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfaXBlX3BhcmFtc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfaXBlX3BhcmFtc19pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfSVBFX1BBUkFNUzsKKworICAgIHNfaXBlX3BhcmFtc19pcC51NF9lbmFibGVfaW50cmFfNHg0ID0gbUludHJhNHg0OworICAgIHNfaXBlX3BhcmFtc19pcC51NF9lbmNfc3BlZWRfcHJlc2V0ID0gbUVuY1NwZWVkOworICAgIHNfaXBlX3BhcmFtc19pcC51NF9jb25zdHJhaW5lZF9pbnRyYV9wcmVkID0gbUNvbnN0cmFpbmVkSW50cmFGbGFnOworCisgICAgc19pcGVfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19pcGVfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfaXBlX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2lwZV9wYXJhbXNfaXBfdCk7CisgICAgc19pcGVfcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfaXBlX3BhcmFtc19vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19pcGVfcGFyYW1zX2lwLCAmc19pcGVfcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgaXBlIHBhcmFtcyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19pcGVfcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0Qml0UmF0ZSgpIHsKKyAgICBpdmVfY3RsX3NldF9iaXRyYXRlX2lwX3Qgc19iaXRyYXRlX2lwOworICAgIGl2ZV9jdGxfc2V0X2JpdHJhdGVfb3BfdCBzX2JpdHJhdGVfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19iaXRyYXRlX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19iaXRyYXRlX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9CSVRSQVRFOworCisgICAgc19iaXRyYXRlX2lwLnU0X3RhcmdldF9iaXRyYXRlID0gbUJpdHJhdGUtPnZhbHVlOworCisgICAgc19iaXRyYXRlX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19iaXRyYXRlX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfYml0cmF0ZV9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2JpdHJhdGVfaXBfdCk7CisgICAgc19iaXRyYXRlX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfYml0cmF0ZV9vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19iaXRyYXRlX2lwLCAmc19iaXRyYXRlX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgYml0IHJhdGUgPSAweCV4XG4iLCBzX2JpdHJhdGVfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRGcmFtZVR5cGUoSVZfUElDVFVSRV9DT0RJTkdfVFlQRV9UIGVfZnJhbWVfdHlwZSkgeworICAgIGl2ZV9jdGxfc2V0X2ZyYW1lX3R5cGVfaXBfdCBzX2ZyYW1lX3R5cGVfaXA7CisgICAgaXZlX2N0bF9zZXRfZnJhbWVfdHlwZV9vcF90IHNfZnJhbWVfdHlwZV9vcDsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgc19mcmFtZV90eXBlX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19mcmFtZV90eXBlX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9GUkFNRVRZUEU7CisKKyAgICBzX2ZyYW1lX3R5cGVfaXAuZV9mcmFtZV90eXBlID0gZV9mcmFtZV90eXBlOworCisgICAgc19mcmFtZV90eXBlX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19mcmFtZV90eXBlX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfZnJhbWVfdHlwZV9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2ZyYW1lX3R5cGVfaXBfdCk7CisgICAgc19mcmFtZV90eXBlX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZnJhbWVfdHlwZV9vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19mcmFtZV90eXBlX2lwLCAmc19mcmFtZV90eXBlX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgZnJhbWUgdHlwZSA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19mcmFtZV90eXBlX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0UXAoKSB7CisgICAgaXZlX2N0bF9zZXRfcXBfaXBfdCBzX3FwX2lwOworICAgIGl2ZV9jdGxfc2V0X3FwX29wX3Qgc19xcF9vcDsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX3FwX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19xcF9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfUVA7CisKKyAgICBzX3FwX2lwLnU0X2lfcXAgPSBERUZBVUxUX0lfUVA7CisgICAgc19xcF9pcC51NF9pX3FwX21heCA9IERFRkFVTFRfUVBfTUFYOworICAgIHNfcXBfaXAudTRfaV9xcF9taW4gPSBERUZBVUxUX1FQX01JTjsKKworICAgIHNfcXBfaXAudTRfcF9xcCA9IERFRkFVTFRfUF9RUDsKKyAgICBzX3FwX2lwLnU0X3BfcXBfbWF4ID0gREVGQVVMVF9RUF9NQVg7CisgICAgc19xcF9pcC51NF9wX3FwX21pbiA9IERFRkFVTFRfUVBfTUlOOworCisgICAgc19xcF9pcC51NF9iX3FwID0gREVGQVVMVF9QX1FQOworICAgIHNfcXBfaXAudTRfYl9xcF9tYXggPSBERUZBVUxUX1FQX01BWDsKKyAgICBzX3FwX2lwLnU0X2JfcXBfbWluID0gREVGQVVMVF9RUF9NSU47CisKKyAgICBzX3FwX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19xcF9pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX3FwX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfcXBfaXBfdCk7CisgICAgc19xcF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X3FwX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX3FwX2lwLCAmc19xcF9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IHFwIDB4JXhcbiIsIHNfcXBfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRFbmNNb2RlKElWRV9FTkNfTU9ERV9UIGVfZW5jX21vZGUpIHsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgaXZlX2N0bF9zZXRfZW5jX21vZGVfaXBfdCBzX2VuY19tb2RlX2lwOworICAgIGl2ZV9jdGxfc2V0X2VuY19tb2RlX29wX3Qgc19lbmNfbW9kZV9vcDsKKworICAgIHNfZW5jX21vZGVfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2VuY19tb2RlX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9FTkNfTU9ERTsKKworICAgIHNfZW5jX21vZGVfaXAuZV9lbmNfbW9kZSA9IGVfZW5jX21vZGU7CisKKyAgICBzX2VuY19tb2RlX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19lbmNfbW9kZV9pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2VuY19tb2RlX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZW5jX21vZGVfaXBfdCk7CisgICAgc19lbmNfbW9kZV9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2VuY19tb2RlX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2VuY19tb2RlX2lwLCAmc19lbmNfbW9kZV9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IGluIGhlYWRlciBlbmNvZGUgbW9kZSA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19lbmNfbW9kZV9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldFZidlBhcmFtcygpIHsKKyAgICBpdmVfY3RsX3NldF92YnZfcGFyYW1zX2lwX3Qgc192YnZfaXA7CisgICAgaXZlX2N0bF9zZXRfdmJ2X3BhcmFtc19vcF90IHNfdmJ2X29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfdmJ2X2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc192YnZfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX1ZCVl9QQVJBTVM7CisKKyAgICBzX3Zidl9pcC51NF92YnZfYnVmX3NpemUgPSAwOworICAgIHNfdmJ2X2lwLnU0X3Zidl9idWZmZXJfZGVsYXkgPSAxMDAwOworCisgICAgc192YnZfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX3Zidl9pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX3Zidl9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X3Zidl9wYXJhbXNfaXBfdCk7CisgICAgc192YnZfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF92YnZfcGFyYW1zX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX3Zidl9pcCwgJnNfdmJ2X29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgVkJWIHBhcmFtcyA9IDB4JXhcbiIsIHNfdmJ2X29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0QWlyUGFyYW1zKCkgeworICAgIGl2ZV9jdGxfc2V0X2Fpcl9wYXJhbXNfaXBfdCBzX2Fpcl9pcDsKKyAgICBpdmVfY3RsX3NldF9haXJfcGFyYW1zX29wX3Qgc19haXJfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19haXJfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2Fpcl9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfQUlSX1BBUkFNUzsKKworICAgIHNfYWlyX2lwLmVfYWlyX21vZGUgPQorICAgICAgICAobUludHJhUmVmcmVzaC0+bW9kZSA9PSBDMkNvbmZpZzo6SU5UUkFfUkVGUkVTSF9ESVNBQkxFRCB8fCBtSW50cmFSZWZyZXNoLT5wZXJpb2QgPCAxKQorICAgICAgICAgICAgPyBJVkVfQUlSX01PREVfTk9ORSA6IElWRV9BSVJfTU9ERV9DWUNMSUM7CisgICAgc19haXJfaXAudTRfYWlyX3JlZnJlc2hfcGVyaW9kID0gbUludHJhUmVmcmVzaC0+cGVyaW9kOworCisgICAgc19haXJfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2Fpcl9pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2Fpcl9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2Fpcl9wYXJhbXNfaXBfdCk7CisgICAgc19haXJfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9haXJfcGFyYW1zX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2Fpcl9pcCwgJnNfYWlyX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgYWlyIHBhcmFtcyA9IDB4JXhcbiIsIHNfYWlyX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0TWVQYXJhbXMoKSB7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworICAgIGl2ZV9jdGxfc2V0X21lX3BhcmFtc19pcF90IHNfbWVfcGFyYW1zX2lwOworICAgIGl2ZV9jdGxfc2V0X21lX3BhcmFtc19vcF90IHNfbWVfcGFyYW1zX29wOworCisgICAgc19tZV9wYXJhbXNfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX21lX3BhcmFtc19pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfTUVfUEFSQU1TOworCisgICAgc19tZV9wYXJhbXNfaXAudTRfZW5hYmxlX2Zhc3Rfc2FkID0gbUVuYWJsZUZhc3RTYWQ7CisgICAgc19tZV9wYXJhbXNfaXAudTRfZW5hYmxlX2FsdF9yZWYgPSBtRW5hYmxlQWx0UmVmOworCisgICAgc19tZV9wYXJhbXNfaXAudTRfZW5hYmxlX2hwZWwgPSBtSGFsZlBlbEVuYWJsZTsKKyAgICBzX21lX3BhcmFtc19pcC51NF9lbmFibGVfcXBlbCA9IERFRkFVTFRfUVBFTDsKKyAgICBzX21lX3BhcmFtc19pcC51NF9tZV9zcGVlZF9wcmVzZXQgPSBERUZBVUxUX01FX1NQRUVEOworICAgIHNfbWVfcGFyYW1zX2lwLnU0X3NyY2hfcm5nX3ggPSBERUZBVUxUX1NSQ0hfUk5HX1g7CisgICAgc19tZV9wYXJhbXNfaXAudTRfc3JjaF9ybmdfeSA9IERFRkFVTFRfU1JDSF9STkdfWTsKKworICAgIHNfbWVfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19tZV9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19tZV9wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9tZV9wYXJhbXNfaXBfdCk7CisgICAgc19tZV9wYXJhbXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9tZV9wYXJhbXNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfbWVfcGFyYW1zX2lwLCAmc19tZV9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBtZSBwYXJhbXMgPSAweCV4XG4iLCBzX21lX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldEdvcFBhcmFtcygpIHsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgaXZlX2N0bF9zZXRfZ29wX3BhcmFtc19pcF90IHNfZ29wX3BhcmFtc19pcDsKKyAgICBpdmVfY3RsX3NldF9nb3BfcGFyYW1zX29wX3Qgc19nb3BfcGFyYW1zX29wOworCisgICAgc19nb3BfcGFyYW1zX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19nb3BfcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9HT1BfUEFSQU1TOworCisgICAgc19nb3BfcGFyYW1zX2lwLnU0X2lfZnJtX2ludGVydmFsID0gbUlJbnRlcnZhbDsKKyAgICBzX2dvcF9wYXJhbXNfaXAudTRfaWRyX2ZybV9pbnRlcnZhbCA9IG1JRFJJbnRlcnZhbDsKKworICAgIHNfZ29wX3BhcmFtc19pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfZ29wX3BhcmFtc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2dvcF9wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9nb3BfcGFyYW1zX2lwX3QpOworICAgIHNfZ29wX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2dvcF9wYXJhbXNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZ29wX3BhcmFtc19pcCwgJnNfZ29wX3BhcmFtc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IEdPUCBwYXJhbXMgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfZ29wX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldFByb2ZpbGVQYXJhbXMoKSB7CisgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgaXZlX2N0bF9zZXRfcHJvZmlsZV9wYXJhbXNfaXBfdCBzX3Byb2ZpbGVfcGFyYW1zX2lwOworICAgIGl2ZV9jdGxfc2V0X3Byb2ZpbGVfcGFyYW1zX29wX3Qgc19wcm9maWxlX3BhcmFtc19vcDsKKworICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9QUk9GSUxFX1BBUkFNUzsKKworICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAuZV9wcm9maWxlID0gbUludGYtPmdldFByb2ZpbGVfbCgpOworICAgIGlmIChzX3Byb2ZpbGVfcGFyYW1zX2lwLmVfcHJvZmlsZSA9PSBJVl9QUk9GSUxFX0JBU0UpIHsKKyAgICAgICAgc19wcm9maWxlX3BhcmFtc19pcC51NF9lbnRyb3B5X2NvZGluZ19tb2RlID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLnU0X2VudHJvcHlfY29kaW5nX21vZGUgPSAxOworICAgIH0KKyAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19wcm9maWxlX3BhcmFtc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfcHJvZmlsZV9wYXJhbXNfaXBfdCk7CisgICAgc19wcm9maWxlX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X3Byb2ZpbGVfcGFyYW1zX29wX3QpOworICAgIGxvY2sudW5sb2NrKCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfcHJvZmlsZV9wYXJhbXNfaXAsICZzX3Byb2ZpbGVfcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgcHJvZmlsZSBwYXJhbXMgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfcHJvZmlsZV9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXREZWJsb2NrUGFyYW1zKCkgeworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmVfY3RsX3NldF9kZWJsb2NrX3BhcmFtc19pcF90IHNfZGVibG9ja19wYXJhbXNfaXA7CisgICAgaXZlX2N0bF9zZXRfZGVibG9ja19wYXJhbXNfb3BfdCBzX2RlYmxvY2tfcGFyYW1zX29wOworCisgICAgc19kZWJsb2NrX3BhcmFtc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfZGVibG9ja19wYXJhbXNfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0RFQkxPQ0tfUEFSQU1TOworCisgICAgc19kZWJsb2NrX3BhcmFtc19pcC51NF9kaXNhYmxlX2RlYmxvY2tfbGV2ZWwgPSBtRGlzYWJsZURlYmxrTGV2ZWw7CisKKyAgICBzX2RlYmxvY2tfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19kZWJsb2NrX3BhcmFtc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2RlYmxvY2tfcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZGVibG9ja19wYXJhbXNfaXBfdCk7CisgICAgc19kZWJsb2NrX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2RlYmxvY2tfcGFyYW1zX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2RlYmxvY2tfcGFyYW1zX2lwLCAmc19kZWJsb2NrX3BhcmFtc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gZW5hYmxlL2Rpc2FibGUgZGVibG9jayBwYXJhbXMgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfZGVibG9ja19wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBdmNFbmM6OmxvZ1ZlcnNpb24oKSB7CisgICAgaXZlX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90IHNfY3RsX2lwOworICAgIGl2ZV9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCBzX2N0bF9vcDsKKyAgICBVV09SRDggYXUxX2J1Zls1MTJdOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfY3RsX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19jdGxfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfR0VUVkVSU0lPTjsKKyAgICBzX2N0bF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCk7CisgICAgc19jdGxfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX2dldHZlcnNpb25pbmZvX29wX3QpOworICAgIHNfY3RsX2lwLnB1MV92ZXJzaW9uID0gYXUxX2J1ZjsKKyAgICBzX2N0bF9pcC51NF92ZXJzaW9uX2J1ZnNpemUgPSBzaXplb2YoYXUxX2J1Zik7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikgJnNfY3RsX2lwLCAodm9pZCAqKSAmc19jdGxfb3ApOworCisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBpbiBnZXR0aW5nIHZlcnNpb246IDB4JXgiLCBzX2N0bF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiSXR0aWFtIGVuY29kZXIgdmVyc2lvbjogJXMiLCAoY2hhciAqKXNfY3RsX2lwLnB1MV92ZXJzaW9uKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OmluaXRFbmNvZGVyKCkgeworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBXT1JEMzIgbGV2ZWw7CisKKyAgICBDSEVDSyghbVN0YXJ0ZWQpOworCisgICAgYzJfc3RhdHVzX3QgZXJyVHlwZSA9IEMyX09LOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtR29wVHVuaW5nOjpvdXRwdXQ+IGdvcDsKKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBtU2l6ZSA9IG1JbnRmLT5nZXRTaXplX2woKTsKKyAgICAgICAgbUJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZV9sKCk7CisgICAgICAgIG1GcmFtZVJhdGUgPSBtSW50Zi0+Z2V0RnJhbWVSYXRlX2woKTsKKyAgICAgICAgbUludHJhUmVmcmVzaCA9IG1JbnRmLT5nZXRJbnRyYVJlZnJlc2hfbCgpOworICAgICAgICBtQVZDRW5jTGV2ZWwgPSBtSW50Zi0+Z2V0TGV2ZWxfbCgpOworICAgICAgICBtSUludGVydmFsID0gbUludGYtPmdldFN5bmNGcmFtZVBlcmlvZF9sKCk7CisgICAgICAgIG1JRFJJbnRlcnZhbCA9IG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2RfbCgpOworICAgICAgICBnb3AgPSBtSW50Zi0+Z2V0R29wX2woKTsKKyAgICB9CisgICAgaWYgKGdvcCAmJiBnb3AtPmZsZXhDb3VudCgpID4gMCkgeworICAgICAgICB1aW50MzJfdCBzeW5jSW50ZXJ2YWwgPSAxOworICAgICAgICB1aW50MzJfdCBpSW50ZXJ2YWwgPSAxOworICAgICAgICB1aW50MzJfdCBtYXhCZnJhbWVzID0gMDsKKyAgICAgICAgUGFyc2VHb3AoKmdvcCwgJnN5bmNJbnRlcnZhbCwgJmlJbnRlcnZhbCwgJm1heEJmcmFtZXMpOworICAgICAgICBpZiAoc3luY0ludGVydmFsID4gMCkgeworICAgICAgICAgICAgQUxPR0QoIlVwZGF0aW5nIElEUiBpbnRlcnZhbCBmcm9tIEdPUDogb2xkICV1IG5ldyAldSIsIG1JRFJJbnRlcnZhbCwgc3luY0ludGVydmFsKTsKKyAgICAgICAgICAgIG1JRFJJbnRlcnZhbCA9IHN5bmNJbnRlcnZhbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaUludGVydmFsID4gMCkgeworICAgICAgICAgICAgQUxPR0QoIlVwZGF0aW5nIEkgaW50ZXJ2YWwgZnJvbSBHT1A6IG9sZCAldSBuZXcgJXUiLCBtSUludGVydmFsLCBpSW50ZXJ2YWwpOworICAgICAgICAgICAgbUlJbnRlcnZhbCA9IGlJbnRlcnZhbDsKKyAgICAgICAgfQorICAgICAgICBpZiAobUJmcmFtZXMgIT0gbWF4QmZyYW1lcykgeworICAgICAgICAgICAgQUxPR0QoIlVwZGF0aW5nIG1heCBCIGZyYW1lcyBmcm9tIEdPUDogb2xkICV1IG5ldyAldSIsIG1CZnJhbWVzLCBtYXhCZnJhbWVzKTsKKyAgICAgICAgICAgIG1CZnJhbWVzID0gbWF4QmZyYW1lczsKKyAgICAgICAgfQorICAgIH0KKyAgICB1aW50MzJfdCB3aWR0aCA9IG1TaXplLT53aWR0aDsKKyAgICB1aW50MzJfdCBoZWlnaHQgPSBtU2l6ZS0+aGVpZ2h0OworCisgICAgbVN0cmlkZSA9IHdpZHRoOworCisgICAgLy8gVE9ETworICAgIG1JdlZpZGVvQ29sb3JGb3JtYXQgPSBJVl9ZVVZfNDIwUDsKKworICAgIEFMT0dEKCJQYXJhbXMgd2lkdGggJWQgaGVpZ2h0ICVkIGxldmVsICVkIGNvbG9yRm9ybWF0ICVkIGJmcmFtZXMgJWQiLCB3aWR0aCwKKyAgICAgICAgICAgIGhlaWdodCwgbUFWQ0VuY0xldmVsLCBtSXZWaWRlb0NvbG9yRm9ybWF0LCBtQmZyYW1lcyk7CisKKyAgICAvKiBHZXR0aW5nIE51bWJlciBvZiBNZW1SZWNvcmRzICovCisgICAgeworICAgICAgICBpdl9udW1fbWVtX3JlY19pcF90IHNfbnVtX21lbV9yZWNfaXA7CisgICAgICAgIGl2X251bV9tZW1fcmVjX29wX3Qgc19udW1fbWVtX3JlY19vcDsKKworICAgICAgICBzX251bV9tZW1fcmVjX2lwLnU0X3NpemUgPSBzaXplb2YoaXZfbnVtX21lbV9yZWNfaXBfdCk7CisgICAgICAgIHNfbnVtX21lbV9yZWNfb3AudTRfc2l6ZSA9IHNpemVvZihpdl9udW1fbWVtX3JlY19vcF90KTsKKworICAgICAgICBzX251bV9tZW1fcmVjX2lwLmVfY21kID0gSVZfQ01EX0dFVF9OVU1fTUVNX1JFQzsKKworICAgICAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG51bGxwdHIsICZzX251bV9tZW1fcmVjX2lwLCAmc19udW1fbWVtX3JlY19vcCk7CisKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgICAgICBBTE9HRSgiR2V0IG51bWJlciBvZiBtZW1vcnkgcmVjb3JkcyBmYWlsZWQgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICBzX251bV9tZW1fcmVjX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorCisgICAgICAgIG1OdW1NZW1SZWNvcmRzID0gc19udW1fbWVtX3JlY19vcC51NF9udW1fbWVtX3JlYzsKKyAgICB9CisKKyAgICAvKiBBbGxvY2F0ZSBhcnJheSB0byBob2xkIG1lbW9yeSByZWNvcmRzICovCisgICAgaWYgKG1OdW1NZW1SZWNvcmRzID4gU0laRV9NQVggLyBzaXplb2YoaXZfbWVtX3JlY190KSkgeworICAgICAgICBBTE9HRSgicmVxdWVzdGVkIG1lbW9yeSBzaXplIGlzIHRvbyBiaWcuIik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIG1NZW1SZWNvcmRzID0gKGl2X21lbV9yZWNfdCAqKW1hbGxvYyhtTnVtTWVtUmVjb3JkcyAqIHNpemVvZihpdl9tZW1fcmVjX3QpKTsKKyAgICBpZiAobnVsbHB0ciA9PSBtTWVtUmVjb3JkcykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgaG9sZCBtZW1vcnkgcmVjb3JkczogU2l6ZSAlenUiLAorICAgICAgICAgICAgICAgIG1OdW1NZW1SZWNvcmRzICogc2l6ZW9mKGl2X21lbV9yZWNfdCkpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIHsKKyAgICAgICAgaXZfbWVtX3JlY190ICpwc19tZW1fcmVjOworICAgICAgICBwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKykgeworICAgICAgICAgICAgcHNfbWVtX3JlYy0+dTRfc2l6ZSA9IHNpemVvZihpdl9tZW1fcmVjX3QpOworICAgICAgICAgICAgcHNfbWVtX3JlYy0+cHZfYmFzZSA9IG51bGxwdHI7CisgICAgICAgICAgICBwc19tZW1fcmVjLT51NF9tZW1fc2l6ZSA9IDA7CisgICAgICAgICAgICBwc19tZW1fcmVjLT51NF9tZW1fYWxpZ25tZW50ID0gMDsKKyAgICAgICAgICAgIHBzX21lbV9yZWMtPmVfbWVtX3R5cGUgPSBJVl9OQV9NRU1fVFlQRTsKKworICAgICAgICAgICAgcHNfbWVtX3JlYysrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogR2V0dGluZyBNZW1SZWNvcmRzIEF0dHJpYnV0ZXMgKi8KKyAgICB7CisgICAgICAgIGl2X2ZpbGxfbWVtX3JlY19pcF90IHNfZmlsbF9tZW1fcmVjX2lwOworICAgICAgICBpdl9maWxsX21lbV9yZWNfb3BfdCBzX2ZpbGxfbWVtX3JlY19vcDsKKworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9zaXplID0gc2l6ZW9mKGl2X2ZpbGxfbWVtX3JlY19pcF90KTsKKyAgICAgICAgc19maWxsX21lbV9yZWNfb3AudTRfc2l6ZSA9IHNpemVvZihpdl9maWxsX21lbV9yZWNfb3BfdCk7CisKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAuZV9jbWQgPSBJVl9DTURfRklMTF9OVU1fTUVNX1JFQzsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAucHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9udW1fbWVtX3JlYyA9IG1OdW1NZW1SZWNvcmRzOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfd2QgPSB3aWR0aDsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbWF4X2h0ID0gaGVpZ2h0OworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfbGV2ZWwgPSBtQVZDRW5jTGV2ZWw7CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLmVfY29sb3JfZm9ybWF0ID0gREVGQVVMVF9JTlBfQ09MT1JfRk9STUFUOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfcmVmX2NudCA9IERFRkFVTFRfTUFYX1JFRl9GUk07CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X21heF9yZW9yZGVyX2NudCA9IERFRkFVTFRfTUFYX1JFT1JERVJfRlJNOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfc3JjaF9ybmdfeCA9IERFRkFVTFRfTUFYX1NSQ0hfUkFOR0VfWDsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbWF4X3NyY2hfcm5nX3kgPSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1k7CisKKyAgICAgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihudWxscHRyLCAmc19maWxsX21lbV9yZWNfaXAsICZzX2ZpbGxfbWVtX3JlY19vcCk7CisKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgICAgICBBTE9HRSgiRmlsbCBtZW1vcnkgcmVjb3JkcyBmYWlsZWQgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICBzX2ZpbGxfbWVtX3JlY19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBBbGxvY2F0aW5nIE1lbW9yeSBmb3IgTWVtIFJlY29yZHMgKi8KKyAgICB7CisgICAgICAgIFdPUkQzMiB0b3RhbF9zaXplOworICAgICAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWM7CisgICAgICAgIHRvdGFsX3NpemUgPSAwOworICAgICAgICBwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtTWVtUmVjb3JkczsgaSsrKSB7CisgICAgICAgICAgICBwc19tZW1fcmVjLT5wdl9iYXNlID0gaXZlX2FsaWduZWRfbWFsbG9jKAorICAgICAgICAgICAgICAgICAgICBwc19tZW1fcmVjLT51NF9tZW1fYWxpZ25tZW50LCBwc19tZW1fcmVjLT51NF9tZW1fc2l6ZSk7CisgICAgICAgICAgICBpZiAocHNfbWVtX3JlYy0+cHZfYmFzZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkFsbG9jYXRpb24gZmFpbHVyZSBmb3IgbWVtIHJlY29yZCBpZCAlenUgc2l6ZSAldVxuIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzX21lbV9yZWMtPnU0X21lbV9zaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0b3RhbF9zaXplICs9IHBzX21lbV9yZWMtPnU0X21lbV9zaXplOworCisgICAgICAgICAgICBwc19tZW1fcmVjKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDb2RlYyBJbnN0YW5jZSBDcmVhdGlvbiAqLworICAgIHsKKyAgICAgICAgaXZlX2luaXRfaXBfdCBzX2luaXRfaXA7CisgICAgICAgIGl2ZV9pbml0X29wX3Qgc19pbml0X29wOworCisgICAgICAgIG1Db2RlY0N0eCA9IChpdl9vYmpfdCAqKW1NZW1SZWNvcmRzWzBdLnB2X2Jhc2U7CisgICAgICAgIG1Db2RlY0N0eC0+dTRfc2l6ZSA9IHNpemVvZihpdl9vYmpfdCk7CisgICAgICAgIG1Db2RlY0N0eC0+cHZfZnhucyA9ICh2b2lkICopaXZlX2FwaV9mdW5jdGlvbjsKKworICAgICAgICBzX2luaXRfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfaW5pdF9pcF90KTsKKyAgICAgICAgc19pbml0X29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2luaXRfb3BfdCk7CisKKyAgICAgICAgc19pbml0X2lwLmVfY21kID0gSVZfQ01EX0lOSVQ7CisgICAgICAgIHNfaW5pdF9pcC51NF9udW1fbWVtX3JlYyA9IG1OdW1NZW1SZWNvcmRzOworICAgICAgICBzX2luaXRfaXAucHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworICAgICAgICBzX2luaXRfaXAudTRfbWF4X3dkID0gd2lkdGg7CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfaHQgPSBoZWlnaHQ7CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfcmVmX2NudCA9IERFRkFVTFRfTUFYX1JFRl9GUk07CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfcmVvcmRlcl9jbnQgPSBERUZBVUxUX01BWF9SRU9SREVSX0ZSTTsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF9sZXZlbCA9IG1BVkNFbmNMZXZlbDsKKyAgICAgICAgc19pbml0X2lwLmVfaW5wX2NvbG9yX2ZtdCA9IG1JdlZpZGVvQ29sb3JGb3JtYXQ7CisKKyAgICAgICAgaWYgKG1SZWNvbkVuYWJsZSB8fCBtUFNOUkVuYWJsZSkgeworICAgICAgICAgICAgc19pbml0X2lwLnU0X2VuYWJsZV9yZWNvbiA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzX2luaXRfaXAudTRfZW5hYmxlX3JlY29uID0gMDsKKyAgICAgICAgfQorICAgICAgICBzX2luaXRfaXAuZV9yZWNvbl9jb2xvcl9mbXQgPSBERUZBVUxUX1JFQ09OX0NPTE9SX0ZPUk1BVDsKKyAgICAgICAgc19pbml0X2lwLmVfcmNfbW9kZSA9IERFRkFVTFRfUkNfTU9ERTsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF9mcmFtZXJhdGUgPSBERUZBVUxUX01BWF9GUkFNRVJBVEU7CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfYml0cmF0ZSA9IERFRkFVTFRfTUFYX0JJVFJBVEU7CisgICAgICAgIHNfaW5pdF9pcC51NF9udW1fYmZyYW1lcyA9IG1CZnJhbWVzOworICAgICAgICBzX2luaXRfaXAuZV9jb250ZW50X3R5cGUgPSBJVl9QUk9HUkVTU0lWRTsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF9zcmNoX3JuZ194ID0gREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9YOworICAgICAgICBzX2luaXRfaXAudTRfbWF4X3NyY2hfcm5nX3kgPSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1k7CisgICAgICAgIHNfaW5pdF9pcC5lX3NsaWNlX21vZGUgPSBtU2xpY2VNb2RlOworICAgICAgICBzX2luaXRfaXAudTRfc2xpY2VfcGFyYW0gPSBtU2xpY2VQYXJhbTsKKyAgICAgICAgc19pbml0X2lwLmVfYXJjaCA9IG1BcmNoOworICAgICAgICBzX2luaXRfaXAuZV9zb2MgPSBERUZBVUxUX1NPQzsKKworICAgICAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfaW5pdF9pcCwgJnNfaW5pdF9vcCk7CisKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgICAgICBBTE9HRSgiSW5pdCBlbmNvZGVyIGZhaWxlZCA9IDB4JXhcbiIsIHNfaW5pdF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBHZXQgQ29kZWMgVmVyc2lvbiAqLworICAgIGxvZ1ZlcnNpb24oKTsKKworICAgIC8qIHNldCBwcm9jZXNzb3IgZGV0YWlscyAqLworICAgIHNldE51bUNvcmVzKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBGcmFtZSBkaW1lbnNpb25zICovCisgICAgc2V0RGltZW5zaW9ucygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgRnJhbWUgcmF0ZXMgKi8KKyAgICBzZXRGcmFtZVJhdGUoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IElQRSBQYXJhbXMgKi8KKyAgICBzZXRJcGVQYXJhbXMoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IEJpdHJhdGUgKi8KKyAgICBzZXRCaXRSYXRlKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBRUCAqLworICAgIHNldFFwKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBBSVIgcGFyYW1zICovCisgICAgc2V0QWlyUGFyYW1zKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBWQlYgcGFyYW1zICovCisgICAgc2V0VmJ2UGFyYW1zKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBNb3Rpb24gZXN0aW1hdGlvbiBwYXJhbXMgKi8KKyAgICBzZXRNZVBhcmFtcygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgR09QIHBhcmFtcyAqLworICAgIHNldEdvcFBhcmFtcygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgRGVibG9jayBwYXJhbXMgKi8KKyAgICBzZXREZWJsb2NrUGFyYW1zKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBQcm9maWxlIHBhcmFtcyAqLworICAgIHNldFByb2ZpbGVQYXJhbXMoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IGluIEVuY29kZSBoZWFkZXIgbW9kZSAqLworICAgIHNldEVuY01vZGUoSVZFX0VOQ19NT0RFX0hFQURFUik7CisKKyAgICBBTE9HVigiaW5pdF9jb2RlYyBzdWNjZXNzZnVsbCIpOworCisgICAgbVNwc1Bwc0hlYWRlclJlY2VpdmVkID0gZmFsc2U7CisgICAgbVN0YXJ0ZWQgPSB0cnVlOworCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnJlbGVhc2VFbmNvZGVyKCkgeworICAgIElWX1NUQVRVU19UIHN0YXR1cyA9IElWX1NVQ0NFU1M7CisgICAgaXZfcmV0cmlldmVfbWVtX3JlY19pcF90IHNfcmV0cmlldmVfbWVtX2lwOworICAgIGl2X3JldHJpZXZlX21lbV9yZWNfb3BfdCBzX3JldHJpZXZlX21lbV9vcDsKKyAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWM7CisKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBzX3JldHJpZXZlX21lbV9pcC51NF9zaXplID0gc2l6ZW9mKGl2X3JldHJpZXZlX21lbV9yZWNfaXBfdCk7CisgICAgc19yZXRyaWV2ZV9tZW1fb3AudTRfc2l6ZSA9IHNpemVvZihpdl9yZXRyaWV2ZV9tZW1fcmVjX29wX3QpOworICAgIHNfcmV0cmlldmVfbWVtX2lwLmVfY21kID0gSVZfQ01EX1JFVFJJRVZFX01FTVJFQzsKKyAgICBzX3JldHJpZXZlX21lbV9pcC5wc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfcmV0cmlldmVfbWVtX2lwLCAmc19yZXRyaWV2ZV9tZW1fb3ApOworCisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gcmV0cmlldmUgbWVtb3J5IHJlY29yZHMgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfcmV0cmlldmVfbWVtX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIC8qIEZyZWUgbWVtb3J5IHJlY29yZHMgKi8KKyAgICBwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzX3JldHJpZXZlX21lbV9vcC51NF9udW1fbWVtX3JlY19maWxsZWQ7IGkrKykgeworICAgICAgICBpZiAocHNfbWVtX3JlYykgaXZlX2FsaWduZWRfZnJlZShwc19tZW1fcmVjLT5wdl9iYXNlKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgibWVtb3J5IHJlY29yZCBpcyBudWxsLiIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICBwc19tZW1fcmVjKys7CisgICAgfQorCisgICAgaWYgKG1NZW1SZWNvcmRzKSBmcmVlKG1NZW1SZWNvcmRzKTsKKworICAgIC8vIGNsZWFyIG90aGVyIHBvaW50ZXJzIGludG8gdGhlIHNwYWNlIGJlaW5nIGZyZWUoKWQKKyAgICBtQ29kZWNDdHggPSBudWxscHRyOworCisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRFbmNvZGVBcmdzKAorICAgICAgICBpdmVfdmlkZW9fZW5jb2RlX2lwX3QgKnBzX2VuY29kZV9pcCwKKyAgICAgICAgaXZlX3ZpZGVvX2VuY29kZV9vcF90ICpwc19lbmNvZGVfb3AsCisgICAgICAgIGNvbnN0IEMyR3JhcGhpY1ZpZXcgKmNvbnN0IGlucHV0LAorICAgICAgICB1aW50OF90ICpiYXNlLAorICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwKKyAgICAgICAgdWludDY0X3Qgd29ya0luZGV4KSB7CisgICAgaXZfcmF3X2J1Zl90ICpwc19pbnBfcmF3X2J1ZjsKKyAgICBtZW1zZXQocHNfZW5jb2RlX2lwLCAwLCBzaXplb2YoKnBzX2VuY29kZV9pcCkpOworICAgIG1lbXNldChwc19lbmNvZGVfb3AsIDAsIHNpemVvZigqcHNfZW5jb2RlX29wKSk7CisKKyAgICBwc19pbnBfcmF3X2J1ZiA9ICZwc19lbmNvZGVfaXAtPnNfaW5wX2J1ZjsKKyAgICBwc19lbmNvZGVfaXAtPnNfb3V0X2J1Zi5wdl9idWYgPSBiYXNlOworICAgIHBzX2VuY29kZV9pcC0+c19vdXRfYnVmLnU0X2J5dGVzID0gMDsKKyAgICBwc19lbmNvZGVfaXAtPnNfb3V0X2J1Zi51NF9idWZzaXplID0gY2FwYWNpdHk7CisgICAgcHNfZW5jb2RlX2lwLT51NF9zaXplID0gc2l6ZW9mKGl2ZV92aWRlb19lbmNvZGVfaXBfdCk7CisgICAgcHNfZW5jb2RlX29wLT51NF9zaXplID0gc2l6ZW9mKGl2ZV92aWRlb19lbmNvZGVfb3BfdCk7CisKKyAgICBwc19lbmNvZGVfaXAtPmVfY21kID0gSVZFX0NNRF9WSURFT19FTkNPREU7CisgICAgcHNfZW5jb2RlX2lwLT5wdl9idWZzID0gbnVsbHB0cjsKKyAgICBwc19lbmNvZGVfaXAtPnB2X21iX2luZm8gPSBudWxscHRyOworICAgIHBzX2VuY29kZV9pcC0+cHZfcGljX2luZm8gPSBudWxscHRyOworICAgIHBzX2VuY29kZV9pcC0+dTRfbWJfaW5mb190eXBlID0gMDsKKyAgICBwc19lbmNvZGVfaXAtPnU0X3BpY19pbmZvX3R5cGUgPSAwOworICAgIHBzX2VuY29kZV9pcC0+dTRfaXNfbGFzdCA9IDA7CisgICAgcHNfZW5jb2RlX2lwLT51NF90aW1lc3RhbXBfaGlnaCA9IHdvcmtJbmRleCA+PiAzMjsKKyAgICBwc19lbmNvZGVfaXAtPnU0X3RpbWVzdGFtcF9sb3cgPSB3b3JrSW5kZXggJiAweEZGRkZGRkZGOworICAgIHBzX2VuY29kZV9vcC0+c19vdXRfYnVmLnB2X2J1ZiA9IG51bGxwdHI7CisKKyAgICAvKiBJbml0aWFsaXplIGNvbG9yIGZvcm1hdHMgKi8KKyAgICBtZW1zZXQocHNfaW5wX3Jhd19idWYsIDAsIHNpemVvZihpdl9yYXdfYnVmX3QpKTsKKyAgICBwc19pbnBfcmF3X2J1Zi0+dTRfc2l6ZSA9IHNpemVvZihpdl9yYXdfYnVmX3QpOworICAgIHBzX2lucF9yYXdfYnVmLT5lX2NvbG9yX2ZtdCA9IG1JdlZpZGVvQ29sb3JGb3JtYXQ7CisgICAgaWYgKGlucHV0ID09IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKG1TYXdJbnB1dEVPUykgeworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT51NF9pc19sYXN0ID0gMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgaWYgKGlucHV0LT53aWR0aCgpIDwgbVNpemUtPndpZHRoIHx8CisgICAgICAgIGlucHV0LT5oZWlnaHQoKSA8IG1TaXplLT5oZWlnaHQpIHsKKyAgICAgICAgLyogRXhwZWN0IHdpZHRoIGhlaWdodCB0byBiZSBjb25maWd1cmVkICovCisgICAgICAgIEFMT0dXKCJ1bmV4cGVjdGVkIENhcGFjaXR5IEFzcGVjdCAlZCglZCkgeCAlZCglZCkiLCBpbnB1dC0+d2lkdGgoKSwKKyAgICAgICAgICAgICAgbVNpemUtPndpZHRoLCBpbnB1dC0+aGVpZ2h0KCksIG1TaXplLT5oZWlnaHQpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigid2lkdGggPSAlZCwgaGVpZ2h0ID0gJWQiLCBpbnB1dC0+d2lkdGgoKSwgaW5wdXQtPmhlaWdodCgpKTsKKyAgICBjb25zdCBDMlBsYW5hckxheW91dCAmbGF5b3V0ID0gaW5wdXQtPmxheW91dCgpOworICAgIHVpbnQ4X3QgKnlQbGFuZSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpbnB1dC0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgICAgdWludDhfdCAqdVBsYW5lID0gY29uc3RfY2FzdDx1aW50OF90ICo+KGlucHV0LT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdKTsKKyAgICB1aW50OF90ICp2UGxhbmUgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5wdXQtPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl0pOworICAgIGludDMyX3QgeVN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldLnJvd0luYzsKKyAgICBpbnQzMl90IHVTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXS5yb3dJbmM7CisgICAgaW50MzJfdCB2U3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0ucm93SW5jOworCisgICAgdWludDMyX3Qgd2lkdGggPSBtU2l6ZS0+d2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0ID0gbVNpemUtPmhlaWdodDsKKyAgICAvLyB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBhbHdheXMgZXZlbiAoYXMgYmxvY2sgc2l6ZSBpcyAxNngxNikKKyAgICBDSEVDS19FUSgod2lkdGggJiAxdSksIDB1KTsKKyAgICBDSEVDS19FUSgoaGVpZ2h0ICYgMXUpLCAwdSk7CisgICAgc2l6ZV90IHlQbGFuZVNpemUgPSB3aWR0aCAqIGhlaWdodDsKKworICAgIHN3aXRjaCAobGF5b3V0LnR5cGUpIHsKKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0I6CisgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCQTogeworICAgICAgICAgICAgQUxPR1YoInlQbGFuZVNpemUgPSAlenUiLCB5UGxhbmVTaXplKTsKKyAgICAgICAgICAgIE1lbW9yeUJsb2NrIGNvbnZlcnNpb25CdWZmZXIgPSBtQ29udmVyc2lvbkJ1ZmZlcnMuZmV0Y2goeVBsYW5lU2l6ZSAqIDMgLyAyKTsKKyAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyc0luVXNlLmVtcGxhY2UoY29udmVyc2lvbkJ1ZmZlci5kYXRhKCksIGNvbnZlcnNpb25CdWZmZXIpOworICAgICAgICAgICAgeVBsYW5lID0gY29udmVyc2lvbkJ1ZmZlci5kYXRhKCk7CisgICAgICAgICAgICB1UGxhbmUgPSB5UGxhbmUgKyB5UGxhbmVTaXplOworICAgICAgICAgICAgdlBsYW5lID0gdVBsYW5lICsgeVBsYW5lU2l6ZSAvIDQ7CisgICAgICAgICAgICB5U3RyaWRlID0gd2lkdGg7CisgICAgICAgICAgICB1U3RyaWRlID0gdlN0cmlkZSA9IHlTdHJpZGUgLyAyOworICAgICAgICAgICAgQ29udmVydFJHQlRvUGxhbmFyWVVWKHlQbGFuZSwgeVN0cmlkZSwgaGVpZ2h0LCBjb252ZXJzaW9uQnVmZmVyLnNpemUoKSwgKmlucHV0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWOiB7CisgICAgICAgICAgICBpZiAoIUlzWVVWNDIwKCppbnB1dCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiaW5wdXQgaXMgbm90IFlVVjQyMCIpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9ZXS5jb2xJbmMgPT0gMQorICAgICAgICAgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5jb2xJbmMgPT0gMQorICAgICAgICAgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5jb2xJbmMgPT0gMQorICAgICAgICAgICAgICAgICAgICAmJiB1U3RyaWRlID09IHZTdHJpZGUKKyAgICAgICAgICAgICAgICAgICAgJiYgeVN0cmlkZSA9PSAyICogdlN0cmlkZSkgeworICAgICAgICAgICAgICAgIC8vIEk0MjAgY29tcGF0aWJsZSAtIGFscmVhZHkgc2V0IHVwIGFib3ZlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNvcHkgdG8gSTQyMAorICAgICAgICAgICAgeVN0cmlkZSA9IHdpZHRoOworICAgICAgICAgICAgdVN0cmlkZSA9IHZTdHJpZGUgPSB5U3RyaWRlIC8gMjsKKyAgICAgICAgICAgIE1lbW9yeUJsb2NrIGNvbnZlcnNpb25CdWZmZXIgPSBtQ29udmVyc2lvbkJ1ZmZlcnMuZmV0Y2goeVBsYW5lU2l6ZSAqIDMgLyAyKTsKKyAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyc0luVXNlLmVtcGxhY2UoY29udmVyc2lvbkJ1ZmZlci5kYXRhKCksIGNvbnZlcnNpb25CdWZmZXIpOworICAgICAgICAgICAgTWVkaWFJbWFnZTIgaW1nID0gQ3JlYXRlWVVWNDIwUGxhbmFyTWVkaWFJbWFnZTIod2lkdGgsIGhlaWdodCwgeVN0cmlkZSwgaGVpZ2h0KTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IEltYWdlQ29weShjb252ZXJzaW9uQnVmZmVyLmRhdGEoKSwgJmltZywgKmlucHV0KTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQnVmZmVyIGNvbnZlcnNpb24gZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHlQbGFuZSA9IGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpOworICAgICAgICAgICAgdVBsYW5lID0geVBsYW5lICsgeVBsYW5lU2l6ZTsKKyAgICAgICAgICAgIHZQbGFuZSA9IHVQbGFuZSArIHlQbGFuZVNpemUgLyA0OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWQToKKyAgICAgICAgICAgIEFMT0dFKCJZVVZBIHBsYW5lIHR5cGUgaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIlVucmVjb2duaXplZCBwbGFuZSB0eXBlOiAlZCIsIGxheW91dC50eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgc3dpdGNoIChtSXZWaWRlb0NvbG9yRm9ybWF0KSB7CisgICAgICAgIGNhc2UgSVZfWVVWXzQyMFA6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlucHV0IGJ1ZmZlciBpcyBzdXBwb3NlZCB0byBiZSBjb25zdCBidXQgSXR0aWFtIEFQSSB3YW50cyBiYXJlIHBvaW50ZXIuCisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXB2X2J1ZnNbMF0gPSB5UGxhbmU7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXB2X2J1ZnNbMV0gPSB1UGxhbmU7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXB2X2J1ZnNbMl0gPSB2UGxhbmU7CisKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfd2RbMF0gPSBpbnB1dC0+d2lkdGgoKTsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfd2RbMV0gPSBpbnB1dC0+d2lkdGgoKSAvIDI7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3dkWzJdID0gaW5wdXQtPndpZHRoKCkgLyAyOworCisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X2h0WzBdID0gaW5wdXQtPmhlaWdodCgpOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9odFsxXSA9IGlucHV0LT5oZWlnaHQoKSAvIDI7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X2h0WzJdID0gaW5wdXQtPmhlaWdodCgpIC8gMjsKKworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9zdHJkWzBdID0geVN0cmlkZTsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfc3RyZFsxXSA9IHVTdHJpZGU7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3N0cmRbMl0gPSB2U3RyaWRlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIElWX1lVVl80MjJJTEU6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgIC8vIHBzX2lucF9yYXdfYnVmLT5hcHZfYnVmc1swXSA9IHB1MV9idWY7CisgICAgICAgICAgICAvLyBwc19pbnBfcmF3X2J1Zi0+YXU0X3dkWzBdID0gbVdpZHRoICogMjsKKyAgICAgICAgICAgIC8vIHBzX2lucF9yYXdfYnVmLT5hdTRfaHRbMF0gPSBtSGVpZ2h0OworICAgICAgICAgICAgLy8gcHNfaW5wX3Jhd19idWYtPmF1NF9zdHJkWzBdID0gbVN0cmlkZSAqIDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgSVZfWVVWXzQyMFNQX1VWOgorICAgICAgICBjYXNlIElWX1lVVl80MjBTUF9WVToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmFwdl9idWZzWzBdID0geVBsYW5lOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmFwdl9idWZzWzFdID0gdVBsYW5lOworCisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3dkWzBdID0gaW5wdXQtPndpZHRoKCk7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3dkWzFdID0gaW5wdXQtPndpZHRoKCk7CisKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfaHRbMF0gPSBpbnB1dC0+aGVpZ2h0KCk7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X2h0WzFdID0gaW5wdXQtPmhlaWdodCgpIC8gMjsKKworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9zdHJkWzBdID0geVN0cmlkZTsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfc3RyZFsxXSA9IHVTdHJpZGU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QXZjRW5jOjpmaW5pc2hXb3JrKHVpbnQ2NF90IHdvcmtJbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdmVfdmlkZW9fZW5jb2RlX29wX3QgKnBzX2VuY29kZV9vcCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0KKyAgICAgICAgICAgIGNyZWF0ZUxpbmVhckJ1ZmZlcihtT3V0QmxvY2ssIDAsIHBzX2VuY29kZV9vcC0+c19vdXRfYnVmLnU0X2J5dGVzKTsKKyAgICBpZiAoSVZfSURSX0ZSQU1FID09IHBzX2VuY29kZV9vcC0+dTRfZW5jb2RlZF9mcmFtZV90eXBlKSB7CisgICAgICAgIEFMT0dWKCJJRFIgZnJhbWUgcHJvZHVjZWQiKTsKKyAgICAgICAgYnVmZmVyLT5zZXRJbmZvKHN0ZDo6bWFrZV9zaGFyZWQ8QzJTdHJlYW1QaWN0dXJlVHlwZU1hc2tJbmZvOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgIDB1IC8qIHN0cmVhbSBpZCAqLywgQzJDb25maWc6OlNZTkNfRlJBTUUpKTsKKyAgICB9CisgICAgbU91dEJsb2NrID0gbnVsbHB0cjsKKworICAgIGF1dG8gZmlsbFdvcmsgPSBbYnVmZmVyXShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpMDsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB9OworICAgIGlmICh3b3JrICYmIGMyX2NudHI2NF90KHdvcmtJbmRleCkgPT0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4KSB7CisgICAgICAgIGZpbGxXb3JrKHdvcmspOworICAgICAgICBpZiAobVNhd0lucHV0RU9TKSB7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmluaXNoKHdvcmtJbmRleCwgZmlsbFdvcmspOworICAgIH0KK30KKwordm9pZCBDMlNvZnRBdmNFbmM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgV09SRDMyIHRpbWVEZWxheSA9IDA7CisgICAgV09SRDMyIHRpbWVUYWtlbiA9IDA7CisgICAgdWludDY0X3Qgd29ya0luZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1bGwoKTsKKworICAgIC8vIEluaXRpYWxpemUgZW5jb2RlciBpZiBub3QgYWxyZWFkeSBpbml0aWFsaXplZAorICAgIGlmIChtQ29kZWNDdHggPT0gbnVsbHB0cikgeworICAgICAgICBpZiAoQzJfT0sgIT0gaW5pdEVuY29kZXIoKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIGVuY29kZXIiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtU2lnbmFsbGVkRXJyb3IpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyB3aGlsZSAoIW1TYXdPdXRwdXRFT1MgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKKyAgICBjMl9zdGF0dXNfdCBlcnJvcjsKKyAgICBpdmVfdmlkZW9fZW5jb2RlX2lwX3Qgc19lbmNvZGVfaXA7CisgICAgaXZlX3ZpZGVvX2VuY29kZV9vcF90IHNfZW5jb2RlX29wOworICAgIG1lbXNldCgmc19lbmNvZGVfb3AsIDAsIHNpemVvZihzX2VuY29kZV9vcCkpOworCisgICAgaWYgKCFtU3BzUHBzSGVhZGVyUmVjZWl2ZWQpIHsKKyAgICAgICAgY29uc3RleHByIHVpbnQzMl90IGtIZWFkZXJMZW5ndGggPSBNSU5fU1RSRUFNX1NJWkU7CisgICAgICAgIHVpbnQ4X3QgaGVhZGVyW2tIZWFkZXJMZW5ndGhdOworICAgICAgICBlcnJvciA9IHNldEVuY29kZUFyZ3MoCisgICAgICAgICAgICAgICAgJnNfZW5jb2RlX2lwLCAmc19lbmNvZGVfb3AsIG51bGxwdHIsIGhlYWRlciwga0hlYWRlckxlbmd0aCwgd29ya0luZGV4KTsKKyAgICAgICAgaWYgKGVycm9yICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgic2V0RW5jb2RlQXJncyBmYWlsZWQ6ICVkIiwgZXJyb3IpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2VuY29kZV9pcCwgJnNfZW5jb2RlX29wKTsKKworICAgICAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFbmNvZGUgaGVhZGVyIGZhaWxlZCA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgIHNfZW5jb2RlX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJCeXRlcyBHZW5lcmF0ZWQgaW4gaGVhZGVyICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBzX2VuY29kZV9vcC5zX291dF9idWYudTRfYnl0ZXMpOworICAgICAgICB9CisKKyAgICAgICAgbVNwc1Bwc0hlYWRlclJlY2VpdmVkID0gdHJ1ZTsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dD4gY3NkID0KKyAgICAgICAgICAgIEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKHNfZW5jb2RlX29wLnNfb3V0X2J1Zi51NF9ieXRlcywgMHUpOworICAgICAgICBpZiAoIWNzZCkgeworICAgICAgICAgICAgQUxPR0UoIkNTRCBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGNzZC0+bS52YWx1ZSwgaGVhZGVyLCBzX2VuY29kZV9vcC5zX291dF9idWYudTRfYnl0ZXMpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhzdGQ6Om1vdmUoY3NkKSk7CisKKyAgICAgICAgRFVNUF9UT19GSUxFKAorICAgICAgICAgICAgICAgIG1PdXRGaWxlLCBjc2QtPm0udmFsdWUsIGNzZC0+ZmxleENvdW50KCkpOworICAgICAgICBpZiAod29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gaGFuZGxlIGR5bmFtaWMgY29uZmlnIHBhcmFtZXRlcnMKKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dD4gaW50cmFSZWZyZXNoID0gbUludGYtPmdldEludHJhUmVmcmVzaF9sKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IGJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZV9sKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gcmVxdWVzdFN5bmMgPSBtSW50Zi0+Z2V0UmVxdWVzdFN5bmNfbCgpOworICAgICAgICBsb2NrLnVubG9jaygpOworCisgICAgICAgIGlmIChiaXRyYXRlICE9IG1CaXRyYXRlKSB7CisgICAgICAgICAgICBtQml0cmF0ZSA9IGJpdHJhdGU7CisgICAgICAgICAgICBzZXRCaXRSYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW50cmFSZWZyZXNoICE9IG1JbnRyYVJlZnJlc2gpIHsKKyAgICAgICAgICAgIG1JbnRyYVJlZnJlc2ggPSBpbnRyYVJlZnJlc2g7CisgICAgICAgICAgICBzZXRBaXJQYXJhbXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXF1ZXN0U3luYyAhPSBtUmVxdWVzdFN5bmMpIHsKKyAgICAgICAgICAgIC8vIHdlIGNhbiBoYW5kbGUgSURSIGltbWVkaWF0ZWx5CisgICAgICAgICAgICBpZiAocmVxdWVzdFN5bmMtPnZhbHVlKSB7CisgICAgICAgICAgICAgICAgLy8gdW5zZXQgcmVxdWVzdAorICAgICAgICAgICAgICAgIEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0IGNsZWFyU3luYygwdSwgQzJfRkFMU0UpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBtSW50Zi0+Y29uZmlnKHsgJmNsZWFyU3luYyB9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgQUxPR1YoIkdvdCBzeW5jIHJlcXVlc3QiKTsKKyAgICAgICAgICAgICAgICBzZXRGcmFtZVR5cGUoSVZfSURSX0ZSQU1FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1SZXF1ZXN0U3luYyA9IHJlcXVlc3RTeW5jOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBtU2F3SW5wdXRFT1MgPSB0cnVlOworICAgIH0KKworICAgIC8qIEluIG5vcm1hbCBtb2RlLCBzdG9yZSBpbnB1dEJ1ZmZlckluZm8gYW5kIHRoaXMgd2lsbCBiZSByZXR1cm5lZAorICAgICAgIHdoZW4gZW5jb2RlciBjb25zdW1lcyB0aGlzIGlucHV0ICovCisgICAgLy8gaWYgKCFtSW5wdXREYXRhSXNNZXRhICYmIChpbnB1dEJ1ZmZlckluZm8gIT0gTlVMTCkpIHsKKyAgICAvLyAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBNQVhfSU5QVVRfQlVGRkVSX0hFQURFUlM7IGkrKykgeworICAgIC8vICAgICAgICAgaWYgKE5VTEwgPT0gbUlucHV0QnVmZmVySW5mb1tpXSkgeworICAgIC8vICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlckluZm9baV0gPSBpbnB1dEJ1ZmZlckluZm87CisgICAgLy8gICAgICAgICAgICAgYnJlYWs7CisgICAgLy8gICAgICAgICB9CisgICAgLy8gICAgIH0KKyAgICAvLyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IHZpZXc7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBpbnB1dEJ1ZmZlcjsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICBpbnB1dEJ1ZmZlciA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF07CisgICAgICAgIHZpZXcgPSBzdGQ6Om1ha2Vfc2hhcmVkPGNvbnN0IEMyR3JhcGhpY1ZpZXc+KAorICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCkpOworICAgICAgICBpZiAodmlldy0+ZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZXJyID0gJWQiLCB2aWV3LT5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkbyB7CisgICAgICAgIGlmIChtU2F3SW5wdXRFT1MgJiYgd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSBicmVhazsKKyAgICAgICAgaWYgKCFtT3V0QmxvY2spIHsKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX07CisgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZywgcHJvcGVyIHVzYWdlLCBldGMuCisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAgICAgIHBvb2wtPmZldGNoTGluZWFyQmxvY2sobU91dEJ1ZmZlclNpemUsIHVzYWdlLCAmbU91dEJsb2NrKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZmV0Y2ggbGluZWFyIGJsb2NrIGVyciA9ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBlcnI7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBtT3V0QmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAod1ZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGVyciA9ICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGVycm9yID0gc2V0RW5jb2RlQXJncygKKyAgICAgICAgICAgICAgICAmc19lbmNvZGVfaXAsICZzX2VuY29kZV9vcCwgdmlldy5nZXQoKSwgd1ZpZXcuYmFzZSgpLCB3Vmlldy5jYXBhY2l0eSgpLCB3b3JrSW5kZXgpOworICAgICAgICBpZiAoZXJyb3IgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJzZXRFbmNvZGVBcmdzIGZhaWxlZCA6ICVkIiwgZXJyb3IpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IGVycm9yOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERVTVBfVE9fRklMRSgKKyAgICAgICAgLy8gICAgICAgICBtSW5GaWxlLCBzX2VuY29kZV9pcC5zX2lucF9idWYuYXB2X2J1ZnNbMF0sCisgICAgICAgIC8vICAgICAgICAgKG1IZWlnaHQgKiBtU3RyaWRlICogMyAvIDIpKTsKKworICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICAgICAgLyogQ29tcHV0ZSB0aW1lIGVsYXBzZWQgYmV0d2VlbiBlbmQgb2YgcHJldmlvdXMgZGVjb2RlKCkKKyAgICAgICAgICogdG8gc3RhcnQgb2YgY3VycmVudCBkZWNvZGUoKSAqLworICAgICAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIHRpbWVEZWxheSk7CisgICAgICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19lbmNvZGVfaXAsICZzX2VuY29kZV9vcCk7CisKKyAgICAgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgICAgICBpZiAoKHNfZW5jb2RlX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSA9PSBJSDI2NEVfQklUU1RSRUFNX0JVRkZFUl9PVkVSRkxPVykgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IHVzZSBJVkVfQ01EX0NUTF9HRVRCVUZJTkZPIGZvciBwcm9wZXIgbWF4IGlucHV0IHNpemU/CisgICAgICAgICAgICAgICAgbU91dEJ1ZmZlclNpemUgKj0gMjsKKyAgICAgICAgICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dFKCJFbmNvZGUgRnJhbWUgZmFpbGVkID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgc19lbmNvZGVfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKTsKKworICAgIC8vIEhvbGQgaW5wdXQgYnVmZmVyIHJlZmVyZW5jZQorICAgIGlmIChpbnB1dEJ1ZmZlcikgeworICAgICAgICBtQnVmZmVyc1tzX2VuY29kZV9pcC5zX2lucF9idWYuYXB2X2J1ZnNbMF1dID0gaW5wdXRCdWZmZXI7CisgICAgfQorCisgICAgR0VUVElNRSgmbVRpbWVFbmQsIG51bGxwdHIpOworICAgIC8qIENvbXB1dGUgdGltZSB0YWtlbiBmb3IgZGVjb2RlKCkgKi8KKyAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIHRpbWVUYWtlbik7CisKKyAgICBBTE9HVigidGltZVRha2VuPSU2ZCBkZWxheT0lNmQgbnVtQnl0ZXM9JTZkIiwgdGltZVRha2VuLCB0aW1lRGVsYXksCisgICAgICAgICAgICBzX2VuY29kZV9vcC5zX291dF9idWYudTRfYnl0ZXMpOworCisgICAgdm9pZCAqZnJlZWQgPSBzX2VuY29kZV9vcC5zX2lucF9idWYuYXB2X2J1ZnNbMF07CisgICAgLyogSWYgZW5jb2RlciBmcmVlcyB1cCBhbiBpbnB1dCBidWZmZXIsIG1hcmsgaXQgYXMgZnJlZSAqLworICAgIGlmIChmcmVlZCAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChtQnVmZmVycy5jb3VudChmcmVlZCkgPT0gMHUpIHsKKyAgICAgICAgICAgIEFMT0dEKCJidWZmZXIgbm90IHRyYWNrZWQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFJlbGVhc2UgaW5wdXQgYnVmZmVyIHJlZmVyZW5jZQorICAgICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UoZnJlZWQpOworICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2UuZXJhc2UoZnJlZWQpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNfZW5jb2RlX29wLm91dHB1dF9wcmVzZW50KSB7CisgICAgICAgIGlmICghc19lbmNvZGVfb3Auc19vdXRfYnVmLnU0X2J5dGVzKSB7CisgICAgICAgICAgICBBTE9HRSgiRXJyb3I6IE91dHB1dCBwcmVzZW50IGJ1dCBieXRlcyBnZW5lcmF0ZWQgaXMgemVybyIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdWludDY0X3Qgd29ya0lkID0gKCh1aW50NjRfdClzX2VuY29kZV9vcC51NF90aW1lc3RhbXBfaGlnaCA8PCAzMikgfAorICAgICAgICAgICAgICAgICAgICAgIHNfZW5jb2RlX29wLnU0X3RpbWVzdGFtcF9sb3c7CisgICAgICAgIGZpbmlzaFdvcmsod29ya0lkLCB3b3JrLCAmc19lbmNvZGVfb3ApOworICAgIH0KKyAgICBpZiAobVNhd0lucHV0RU9TKSB7CisgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TLCBwb29sLCB3b3JrKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6ZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworCisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmICghbU91dEJsb2NrKSB7CisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0ge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9OworICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmcsIHByb3BlciB1c2FnZSwgZXRjLgorICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0KKyAgICAgICAgICAgICAgICBwb29sLT5mZXRjaExpbmVhckJsb2NrKG1PdXRCdWZmZXJTaXplLCB1c2FnZSwgJm1PdXRCbG9jayk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImZldGNoIGxpbmVhciBibG9jayBlcnIgPSAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gZXJyOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBDMldyaXRlVmlldyB3VmlldyA9IG1PdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgaXZlX3ZpZGVvX2VuY29kZV9pcF90IHNfZW5jb2RlX2lwOworICAgICAgICBpdmVfdmlkZW9fZW5jb2RlX29wX3Qgc19lbmNvZGVfb3A7CisgICAgICAgIGlmIChDMl9PSyAhPSBzZXRFbmNvZGVBcmdzKCZzX2VuY29kZV9pcCwgJnNfZW5jb2RlX29wLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Vmlldy5iYXNlKCksIHdWaWV3LmNhcGFjaXR5KCksIDApKSB7CisgICAgICAgICAgICBBTE9HRSgic2V0RW5jb2RlQXJncyBmYWlsZWQgZm9yIGRyYWluSW50ZXJuYWwiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICAodm9pZClpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZW5jb2RlX2lwLCAmc19lbmNvZGVfb3ApOworCisgICAgICAgIHZvaWQgKmZyZWVkID0gc19lbmNvZGVfb3Auc19pbnBfYnVmLmFwdl9idWZzWzBdOworICAgICAgICAvKiBJZiBlbmNvZGVyIGZyZWVzIHVwIGFuIGlucHV0IGJ1ZmZlciwgbWFyayBpdCBhcyBmcmVlICovCisgICAgICAgIGlmIChmcmVlZCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpZiAobUJ1ZmZlcnMuY291bnQoZnJlZWQpID09IDB1KSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImJ1ZmZlciBub3QgdHJhY2tlZCIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBSZWxlYXNlIGlucHV0IGJ1ZmZlciByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICBtQnVmZmVycy5lcmFzZShmcmVlZCk7CisgICAgICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2UuZXJhc2UoZnJlZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHNfZW5jb2RlX29wLm91dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICB1aW50NjRfdCB3b3JrSWQgPSAoKHVpbnQ2NF90KXNfZW5jb2RlX29wLnU0X3RpbWVzdGFtcF9oaWdoIDw8IDMyKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNfZW5jb2RlX29wLnU0X3RpbWVzdGFtcF9sb3c7CisgICAgICAgICAgICBmaW5pc2hXb3JrKHdvcmtJZCwgd29yaywgJnNfZW5jb2RlX29wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICh3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCAhPSAxdSkgeworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgcmV0dXJuIGRyYWluSW50ZXJuYWwoZHJhaW5Nb2RlLCBwb29sLCBudWxscHRyKTsKK30KKworY2xhc3MgQzJTb2Z0QXZjRW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEF2Y0VuY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEF2Y0VuYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBdmNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0QXZjRW5jOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QXZjRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0QXZjRW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0QXZjRW5jRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU1MDU1YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNFbmMuaApAQCAtMCwwICsxLDMwNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfQVZDX0VOQ19IX18KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FWQ19FTkNfSF9fCisKKyNpbmNsdWRlIDxtYXA+CisKKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJpaDI2NF90eXBlZGVmcy5oIgorI2luY2x1ZGUgIml2Mi5oIgorI2luY2x1ZGUgIml2ZTIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIENPREVDX01BWF9DT1JFUyAgICAgICAgICA0CisjZGVmaW5lIExFTl9TVEFUVVNfQlVGRkVSICAgICAgICAoMTAgICogMTAyNCkKKyNkZWZpbmUgTUFYX1ZCVl9CVUZGX1NJWkUgICAgICAgICgxMjAgKiAxNjM4NCkKKyNkZWZpbmUgTUFYX05VTV9JT19CVUZTICAgICAgICAgICAzCisjZGVmaW5lIE1BWF9CX0ZSQU1FUyAgICAgICAgICAgICAgMQorCisjZGVmaW5lIERFRkFVTFRfTUFYX1JFRl9GUk0gICAgICAgICAyCisjZGVmaW5lIERFRkFVTFRfTUFYX1JFT1JERVJfRlJNICAgICAwCisjZGVmaW5lIERFRkFVTFRfUVBfTUlOICAgICAgICAgICAgICAxMAorI2RlZmluZSBERUZBVUxUX1FQX01BWCAgICAgICAgICAgICAgNDAKKyNkZWZpbmUgREVGQVVMVF9NQVhfQklUUkFURSAgICAgICAgIDI0MDAwMDAwMAorI2RlZmluZSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1ggICAgMjU2CisjZGVmaW5lIERFRkFVTFRfTUFYX1NSQ0hfUkFOR0VfWSAgICAyNTYKKyNkZWZpbmUgREVGQVVMVF9NQVhfRlJBTUVSQVRFICAgICAgIDEyMDAwMAorI2RlZmluZSBERUZBVUxUX05VTV9DT1JFUyAgICAgICAgICAgMQorI2RlZmluZSBERUZBVUxUX05VTV9DT1JFU19QUkVfRU5DICAgMAorI2RlZmluZSBERUZBVUxUX0ZQUyAgICAgICAgICAgICAgICAgMzAKKyNkZWZpbmUgREVGQVVMVF9FTkNfU1BFRUQgICAgICAgICAgIElWRV9OT1JNQUwKKworI2RlZmluZSBERUZBVUxUX01FTV9SRUNfQ05UICAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX1JFQ09OX0VOQUJMRSAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX0NIS1NVTV9FTkFCTEUgICAgICAgMAorI2RlZmluZSBERUZBVUxUX1NUQVJUX0ZSTSAgICAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX05VTV9GUk1TICAgICAgICAgICAgMHhGRkZGRkZGRgorI2RlZmluZSBERUZBVUxUX0lOUF9DT0xPUl9GT1JNQVQgICAgICAgSVZfWVVWXzQyMFNQX1ZVCisjZGVmaW5lIERFRkFVTFRfUkVDT05fQ09MT1JfRk9STUFUICAgICBJVl9ZVVZfNDIwUAorI2RlZmluZSBERUZBVUxUX0xPT1BCQUNLICAgICAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX1NSQ19GUkFNRV9SQVRFICAgICAgMzAKKyNkZWZpbmUgREVGQVVMVF9UR1RfRlJBTUVfUkFURSAgICAgIDMwCisjZGVmaW5lIERFRkFVTFRfTUFYX1dEICAgICAgICAgICAgICAxOTIwCisjZGVmaW5lIERFRkFVTFRfTUFYX0hUICAgICAgICAgICAgICAxOTIwCisjZGVmaW5lIERFRkFVTFRfTUFYX0xFVkVMICAgICAgICAgICA0MQorI2RlZmluZSBERUZBVUxUX1NUUklERSAgICAgICAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX1dEICAgICAgICAgICAgICAgICAgMTI4MAorI2RlZmluZSBERUZBVUxUX0hUICAgICAgICAgICAgICAgICAgNzIwCisjZGVmaW5lIERFRkFVTFRfUFNOUl9FTkFCTEUgICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfTUVfU1BFRUQgICAgICAgICAgICAxMDAKKyNkZWZpbmUgREVGQVVMVF9FTkFCTEVfRkFTVF9TQUQgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9FTkFCTEVfQUxUX1JFRiAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9SQ19NT0RFICAgICAgICAgICAgIElWRV9SQ19TVE9SQUdFCisjZGVmaW5lIERFRkFVTFRfQklUUkFURSAgICAgICAgICAgICA2MDAwMDAwCisjZGVmaW5lIERFRkFVTFRfSV9RUCAgICAgICAgICAgICAgICAyMgorI2RlZmluZSBERUZBVUxUX0lfUVBfTUFYICAgICAgICAgICAgREVGQVVMVF9RUF9NQVgKKyNkZWZpbmUgREVGQVVMVF9JX1FQX01JTiAgICAgICAgICAgIERFRkFVTFRfUVBfTUlOCisjZGVmaW5lIERFRkFVTFRfUF9RUCAgICAgICAgICAgICAgICAyOAorI2RlZmluZSBERUZBVUxUX1BfUVBfTUFYICAgICAgICAgICAgREVGQVVMVF9RUF9NQVgKKyNkZWZpbmUgREVGQVVMVF9QX1FQX01JTiAgICAgICAgICAgIERFRkFVTFRfUVBfTUlOCisjZGVmaW5lIERFRkFVTFRfQl9RUCAgICAgICAgICAgICAgICAyMgorI2RlZmluZSBERUZBVUxUX0JfUVBfTUFYICAgICAgICAgICAgREVGQVVMVF9RUF9NQVgKKyNkZWZpbmUgREVGQVVMVF9CX1FQX01JTiAgICAgICAgICAgIERFRkFVTFRfUVBfTUlOCisjZGVmaW5lIERFRkFVTFRfQUlSICAgICAgICAgICAgICAgICBJVkVfQUlSX01PREVfTk9ORQorI2RlZmluZSBERUZBVUxUX0FJUl9SRUZSRVNIX1BFUklPRCAgMzAKKyNkZWZpbmUgREVGQVVMVF9TUkNIX1JOR19YICAgICAgICAgIDY0CisjZGVmaW5lIERFRkFVTFRfU1JDSF9STkdfWSAgICAgICAgICA0OAorI2RlZmluZSBERUZBVUxUX0lfSU5URVJWQUwgICAgICAgICAgMzAKKyNkZWZpbmUgREVGQVVMVF9JRFJfSU5URVJWQUwgICAgICAgIDEwMDAKKyNkZWZpbmUgREVGQVVMVF9CX0ZSQU1FUyAgICAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9ESVNBQkxFX0RFQkxLX0xFVkVMIDAKKyNkZWZpbmUgREVGQVVMVF9IUEVMICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVGQVVMVF9RUEVMICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVGQVVMVF9JNCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVGQVVMVF9FUFJPRklMRSAgICAgICAgICAgIElWX1BST0ZJTEVfQkFTRQorI2RlZmluZSBERUZBVUxUX0VOVFJPUFlfTU9ERSAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX1NMSUNFX01PREUgICAgICAgICAgSVZFX1NMSUNFX01PREVfTk9ORQorI2RlZmluZSBERUZBVUxUX1NMSUNFX1BBUkFNICAgICAgICAgMjU2CisjZGVmaW5lIERFRkFVTFRfQVJDSCAgICAgICAgICAgICAgICBBUkNIX0FSTV9BOVEKKyNkZWZpbmUgREVGQVVMVF9TT0MgICAgICAgICAgICAgICAgIFNPQ19HRU5FUklDCisjZGVmaW5lIERFRkFVTFRfSU5UUkE0eDQgICAgICAgICAgICAwCisjZGVmaW5lIFNUUkxFTkdUSCAgICAgICAgICAgICAgICAgICA1MDAKKyNkZWZpbmUgREVGQVVMVF9DT05TVFJBSU5FRF9JTlRSQSAgIDAKKworI2RlZmluZSBNSU4oYSwgYikgKChhKSA8IChiKSk/IChhKSA6IChiKQorI2RlZmluZSBNQVgoYSwgYikgKChhKSA+IChiKSk/IChhKSA6IChiKQorI2RlZmluZSBBTElHTjE2KHgpICgoKCh4KSArIDE1KSA+PiA0KSA8PCA0KQorI2RlZmluZSBBTElHTjEyOCh4KSAoKCgoeCkgKyAxMjcpID4+IDcpIDw8IDcpCisjZGVmaW5lIEFMSUdONDA5Nih4KSAoKCgoeCkgKyA0MDk1KSA+PiAxMikgPDwgMTIpCisKKy8qKiBVc2VkIHRvIHJlbW92ZSB3YXJuaW5ncyBhYm91dCB1bnVzZWQgcGFyYW1ldGVycyAqLworI2RlZmluZSBVTlVTRUQoeCkgKCh2b2lkKSh4KSkKKworLyoqIEdldCB0aW1lICovCisjZGVmaW5lIEdFVFRJTUUoYSwgYikgZ2V0dGltZW9mZGF5KGEsIGIpOworCisvKiogQ29tcHV0ZSBkaWZmZXJlbmNlIGJldHdlZW4gc3RhcnQgYW5kIGVuZCAqLworI2RlZmluZSBUSU1FX0RJRkYoc3RhcnQsIGVuZCwgZGlmZikgXAorICAgIGRpZmYgPSAoKChlbmQpLnR2X3NlYyAtIChzdGFydCkudHZfc2VjKSAqIDEwMDAwMDApICsgXAorICAgICAgICAgICAgKChlbmQpLnR2X3VzZWMgLSAoc3RhcnQpLnR2X3VzZWMpOworCisjZGVmaW5lIGl2ZV9hbGlnbmVkX21hbGxvYyhhbGlnbm1lbnQsIHNpemUpIG1lbWFsaWduKGFsaWdubWVudCwgc2l6ZSkKKyNkZWZpbmUgaXZlX2FsaWduZWRfZnJlZShidWYpIGZyZWUoYnVmKQorCitzdHJ1Y3QgQzJTb2Z0QXZjRW5jIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEF2Y0VuYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5DMlNvZnRBdmNFbmMoKTsKKworcHJpdmF0ZToKKyAgICAvLyBPTVggaW5wdXQgYnVmZmVyJ3MgdGltZXN0YW1wIGFuZCBmbGFncworICAgIHR5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgaW50NjRfdCBtVGltZVVzOworICAgICAgICBpbnQzMl90IG1GbGFnczsKKyAgICB9IElucHV0QnVmZmVySW5mbzsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisKKyAgICBpbnQzMl90IG1TdHJpZGU7CisKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZVN0YXJ0OyAgIC8vIFRpbWUgYXQgdGhlIHN0YXJ0IG9mIGRlY29kZSgpCisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7ICAgICAvLyBUaW1lIGF0IHRoZSBlbmQgb2YgZGVjb2RlKCkKKworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKyAgICBjaGFyIG1JbkZpbGVbMjAwXTsKKyAgICBjaGFyIG1PdXRGaWxlWzIwMF07CisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCisgICAgSVZfQ09MT1JfRk9STUFUX1QgbUl2VmlkZW9Db2xvckZvcm1hdDsKKworICAgIElWX1BST0ZJTEVfVCBtQVZDRW5jUHJvZmlsZSBfX3VudXNlZDsKKyAgICBXT1JEMzIgICBtQVZDRW5jTGV2ZWw7CisgICAgYm9vbCAgICAgbVN0YXJ0ZWQ7CisgICAgYm9vbCAgICAgbVNwc1Bwc0hlYWRlclJlY2VpdmVkOworCisgICAgYm9vbCAgICAgbVNhd0lucHV0RU9TOworICAgIGJvb2wgICAgIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sICAgICBtSW50cmE0eDQ7CisgICAgYm9vbCAgICAgbUVuYWJsZUZhc3RTYWQ7CisgICAgYm9vbCAgICAgbUVuYWJsZUFsdFJlZjsKKyAgICBib29sICAgICBtUmVjb25FbmFibGU7CisgICAgYm9vbCAgICAgbVBTTlJFbmFibGU7CisgICAgYm9vbCAgICAgbUVudHJvcHlNb2RlOworICAgIGJvb2wgICAgIG1Db25zdHJhaW5lZEludHJhRmxhZzsKKyAgICBJVkVfU1BFRURfQ09ORklHICAgICBtRW5jU3BlZWQ7CisKKyAgICBpdl9vYmpfdCAqbUNvZGVjQ3R4OyAgICAgICAgIC8vIENvZGVjIGNvbnRleHQKKyAgICBpdl9tZW1fcmVjX3QgKm1NZW1SZWNvcmRzOyAgIC8vIE1lbW9yeSByZWNvcmRzIHJlcXVlc3RlZCBieSB0aGUgY29kZWMKKyAgICBzaXplX3QgbU51bU1lbVJlY29yZHM7ICAgICAgIC8vIE51bWJlciBvZiBtZW1vcnkgcmVjb3JkcyByZXF1ZXN0ZWQgYnkgY29kZWMKKyAgICBzaXplX3QgbU51bUNvcmVzOyAgICAgICAgICAgIC8vIE51bWJlciBvZiBjb3JlcyB1c2VkIGJ5IHRoZSBjb2RlYworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IG1PdXRCbG9jazsKKworICAgIC8vIGNvbmZpZ3VyYXRpb25zIHVzZWQgYnkgY29tcG9uZW50IGluIHByb2Nlc3MKKyAgICAvLyAoVE9ETzoga2VlcCB0aGlzIGluIGludGYgYnV0IG1ha2UgdGhlbSBpbnRlcm5hbCBvbmx5KQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBtSW50cmFSZWZyZXNoOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gbUZyYW1lUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+IG1SZXF1ZXN0U3luYzsKKworICAgIHVpbnQzMl90IG1PdXRCdWZmZXJTaXplOworICAgIFVXT1JEMzIgbUhlYWRlckdlbmVyYXRlZDsKKyAgICBVV09SRDMyIG1CZnJhbWVzOworICAgIElWX0FSQ0hfVCBtQXJjaDsKKyAgICBJVkVfU0xJQ0VfTU9ERV9UIG1TbGljZU1vZGU7CisgICAgVVdPUkQzMiBtU2xpY2VQYXJhbTsKKyAgICBib29sIG1IYWxmUGVsRW5hYmxlOworICAgIFVXT1JEMzIgbUlJbnRlcnZhbDsKKyAgICBVV09SRDMyIG1JRFJJbnRlcnZhbDsKKyAgICBVV09SRDMyIG1EaXNhYmxlRGVibGtMZXZlbDsKKyAgICBzdGQ6Om1hcDxjb25zdCB2b2lkICosIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4+IG1CdWZmZXJzOworICAgIE1lbW9yeUJsb2NrUG9vbCBtQ29udmVyc2lvbkJ1ZmZlcnM7CisgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCAqLCBNZW1vcnlCbG9jaz4gbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2U7CisKKyAgICB2b2lkIGluaXRFbmNQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBpbml0RW5jb2RlcigpOworICAgIGMyX3N0YXR1c190IHJlbGVhc2VFbmNvZGVyKCk7CisKKyAgICBjMl9zdGF0dXNfdCBzZXRGcmFtZVR5cGUoSVZfUElDVFVSRV9DT0RJTkdfVFlQRV9UICBlX2ZyYW1lX3R5cGUpOworICAgIGMyX3N0YXR1c190IHNldFFwKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0RW5jTW9kZShJVkVfRU5DX01PREVfVCBlX2VuY19tb2RlKTsKKyAgICBjMl9zdGF0dXNfdCBzZXREaW1lbnNpb25zKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0TnVtQ29yZXMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRGcmFtZVJhdGUoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRJcGVQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRCaXRSYXRlKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0QWlyUGFyYW1zKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0TWVQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRHb3BQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRQcm9maWxlUGFyYW1zKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0RGVibG9ja1BhcmFtcygpOworICAgIGMyX3N0YXR1c190IHNldFZidlBhcmFtcygpOworICAgIHZvaWQgbG9nVmVyc2lvbigpOworICAgIGMyX3N0YXR1c190IHNldEVuY29kZUFyZ3MoCisgICAgICAgICAgICBpdmVfdmlkZW9fZW5jb2RlX2lwX3QgKnBzX2VuY29kZV9pcCwKKyAgICAgICAgICAgIGl2ZV92aWRlb19lbmNvZGVfb3BfdCAqcHNfZW5jb2RlX29wLAorICAgICAgICAgICAgY29uc3QgQzJHcmFwaGljVmlldyAqY29uc3QgaW5wdXQsCisgICAgICAgICAgICB1aW50OF90ICpiYXNlLAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHksCisgICAgICAgICAgICB1aW50NjRfdCB3b3JrSW5kZXgpOworICAgIHZvaWQgZmluaXNoV29yayh1aW50NjRfdCB3b3JrSW5kZXgsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGl2ZV92aWRlb19lbmNvZGVfb3BfdCAqcHNfZW5jb2RlX29wKTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbkludGVybmFsKHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRBdmNFbmMpOworfTsKKworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKworI2RlZmluZSBJTlBVVF9EVU1QX1BBVEggICAgICIvc2RjYXJkL21lZGlhL2F2Y2VfaW5wdXQiCisjZGVmaW5lIElOUFVUX0RVTVBfRVhUICAgICAgInl1diIKKyNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSCAgICAiL3NkY2FyZC9tZWRpYS9hdmNlX291dHB1dCIKKyNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUICAgICAiaDI2NCIKKworI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdHJjcHkobUluRmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNwcmludGYobUluRmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBJTlBVVF9EVU1QX1BBVEgsICBcCisgICAgICAgICAgICBtVGltZVN0YXJ0LnR2X3NlYywgbVRpbWVTdGFydC50dl91c2VjLCAgICAgIFwKKyAgICAgICAgICAgIElOUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cmNweShtT3V0RmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3ByaW50ZihtT3V0RmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBPVVRQVVRfRFVNUF9QQVRILFwKKyAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfc2VjLCBtVGltZVN0YXJ0LnR2X3VzZWMsICAgICAgXAorICAgICAgICAgICAgT1VUUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKSB7ICAgICAgICAgICAgICAgICAgXAorICAgIEZJTEUgKmZwID0gZm9wZW4obV9maWxlbmFtZSwgIndiIik7ICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZwICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIk9wZW5lZCBmaWxlICVzIiwgbV9maWxlbmFtZSk7ICAgICAgICAgICAgXAorICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCBvcGVuIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKSAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTEUgKmZwID0gZm9wZW4obV9maWxlbmFtZSwgImFiIik7ICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZwICE9IE5VTEwgJiYgbV9idWYgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpID0gZndyaXRlKG1fYnVmLCAxLCBtX3NpemUsIGZwKTsgICAgICAgICAgICAgICBcCisgICAgICAgIEFMT0dEKCJmd3JpdGUgcmV0ICVkIHRvIHdyaXRlICVkIiwgaSwgbV9zaXplKTsgIFwKKyAgICAgICAgaWYgKGkgIT0gKGludCltX3NpemUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoIkVycm9yIGluIGZ3cml0ZSwgcmV0dXJuZWQgJWQiLCBpKTsgICBcCisgICAgICAgICAgICBwZXJyb3IoIkVycm9yIGluIHdyaXRlIHRvIGZpbGUiKTsgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCB3cml0ZSB0byBmaWxlICVzIiwgbV9maWxlbmFtZSk7XAorICAgICAgICBpZiAoZnAgIT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2Vsc2UgLyogRklMRV9EVU1QX0VOQUJMRSAqLworI2RlZmluZSBJTlBVVF9EVU1QX1BBVEgKKyNkZWZpbmUgSU5QVVRfRFVNUF9FWFQKKyNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSAorI2RlZmluZSBPVVRQVVRfRFVNUF9FWFQKKyNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpCisjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkKKyNkZWZpbmUgRFVNUF9UT19GSUxFKG1fZmlsZW5hbWUsIG1fYnVmLCBtX3NpemUpCisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9BVkNfRU5DX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMDgzNWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMzQgQEAKKy8vIERPIE5PVCBERVBFTkQgT04gVEhJUyBESVJFQ1RMWQorLy8gdXNlIGxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIGluc3RlYWQKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfY29tbW9uIiwKKyAgICBkZWZhdWx0czogWyJsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyJdLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJTaW1wbGVDMkNvbXBvbmVudC5jcHAiLAorICAgICAgICAiU2ltcGxlQzJJbnRlcmZhY2UuY3BwIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlY191dGlscyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjdXRpbHMiLCAvLyBmb3IgcHJvcGVydGllcworICAgICAgICAibGlibG9nIiwgICAgLy8gZm9yIEFMT0cKKyAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlY191dGlscyIsIC8vIGZvciBJbWFnZUNvcHkKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLCAvLyBmb3IgTXV0ZXhlZAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCisKKyAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCit9CisKK2ZpbGVncm91cCB7CisgICAgbmFtZTogImNvZGVjMl9zb2Z0X2V4cG9ydHMiLAorICAgIHNyY3M6IFsgImV4cG9ydHMubGRzIiBdLAorfQorCisvLyBwdWJsaWMgZGVwZW5kZW5jeSBmb3Igc29mdHdhcmUgY29kZWMgaW1wbGVtZW50YXRpb24KKy8vIHRvIGJlIHVzZWQgYnkgY29kZSB1bmRlciBtZWRpYS9jb2RlY3MvKiBvbmx5IGFzIGl0cyBzdGFiaWxpdHkgaXMgbm90IGd1YXJhbnRlZWQKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgIGRlZmF1bHRzOiBbImxpYmNvZGVjMi1pbXBsLWRlZmF1bHRzIl0sCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2ZXJzaW9uX3NjcmlwdDogIjpjb2RlYzJfc29mdF9leHBvcnRzIiwKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJzZnBsdWdpbl9jY29kZWNfdXRpbHMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY29kZWMyX3NvZnRfY29tbW9uIiwKKyAgICAgICAgImxpYmN1dGlscyIsIC8vIGZvciBwcm9wZXJ0aWVzCisgICAgICAgICJsaWJsb2ciLCAvLyBmb3IgQUxPRworICAgICAgICAibGlic2ZwbHVnaW5fY2NvZGVjX3V0aWxzIiwgLy8gZm9yIEltYWdlQ29weQorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsIC8vIGZvciBDb2xvclV0aWxzIGFuZCBNSU1FCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworICAgIGxkZmxhZ3M6IFsiLVdsLC1Cc3ltYm9saWMiXSwKK30KKworLy8gcHVibGljIGRlcGVuZGVuY3kgZm9yIHNvZnR3YXJlIGNvZGVjIGltcGxlbWVudGF0aW9uCisvLyB0byBiZSB1c2VkIGJ5IGNvZGUgdW5kZXIgbWVkaWEvY29kZWNzLyogb25seQorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorfQorCisvLyBwdWJsaWMgZGVwZW5kZW5jeSBmb3Igc29mdHdhcmUgY29kZWMgaW1wbGVtZW50YXRpb24KKy8vIHRvIGJlIHVzZWQgYnkgY29kZSB1bmRlciBtZWRpYS9jb2RlY3MvKiBvbmx5CitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCit9CisKKy8vIFRFTVA6IHVzZWQgYnkgY2hlZXRzMiBwcm9qZWN0IC0gcmVtb3ZlIHdoZW4gbm8gbG9uZ2VyIHVzZWQKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NpbXBsZV9jb21wb25lbnQiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJTaW1wbGVDMkludGVyZmFjZS5jcHAiLAorICAgIF0sCisKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCisKKyAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJDb21wb25lbnQuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9TaW1wbGVDMkNvbXBvbmVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzZmJkMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJDb21wb25lbnQuY3BwCkBAIC0wLDAgKzEsNjExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTaW1wbGVDMkNvbXBvbmVudCIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gU2ltcGxlQzJDb21wb25lbnQ6OldvcmtRdWV1ZTo6cG9wX2Zyb250KCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmsgPSBzdGQ6Om1vdmUobVF1ZXVlLmZyb250KCkud29yayk7CisgICAgbVF1ZXVlLnBvcF9mcm9udCgpOworICAgIHJldHVybiB3b3JrOworfQorCit2b2lkIFNpbXBsZUMyQ29tcG9uZW50OjpXb3JrUXVldWU6OnB1c2hfYmFjayhzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrKSB7CisgICAgbVF1ZXVlLnB1c2hfYmFjayh7IHN0ZDo6bW92ZSh3b3JrKSwgTk9fRFJBSU4gfSk7Cit9CisKK2Jvb2wgU2ltcGxlQzJDb21wb25lbnQ6OldvcmtRdWV1ZTo6ZW1wdHkoKSBjb25zdCB7CisgICAgcmV0dXJuIG1RdWV1ZS5lbXB0eSgpOworfQorCit2b2lkIFNpbXBsZUMyQ29tcG9uZW50OjpXb3JrUXVldWU6OmNsZWFyKCkgeworICAgIG1RdWV1ZS5jbGVhcigpOworfQorCit1aW50MzJfdCBTaW1wbGVDMkNvbXBvbmVudDo6V29ya1F1ZXVlOjpkcmFpbk1vZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1RdWV1ZS5mcm9udCgpLmRyYWluTW9kZTsKK30KKwordm9pZCBTaW1wbGVDMkNvbXBvbmVudDo6V29ya1F1ZXVlOjptYXJrRHJhaW4odWludDMyX3QgZHJhaW5Nb2RlKSB7CisgICAgbVF1ZXVlLnB1c2hfYmFjayh7IG51bGxwdHIsIGRyYWluTW9kZSB9KTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworU2ltcGxlQzJDb21wb25lbnQ6OldvcmtIYW5kbGVyOjpXb3JrSGFuZGxlcigpIDogbVJ1bm5pbmcoZmFsc2UpIHt9CisKK3ZvaWQgU2ltcGxlQzJDb21wb25lbnQ6OldvcmtIYW5kbGVyOjpzZXRDb21wb25lbnQoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxTaW1wbGVDMkNvbXBvbmVudD4gJnRoaXopIHsKKyAgICBtVGhpeiA9IHRoaXo7Cit9CisKK3N0YXRpYyB2b2lkIFJlcGx5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBpbnQzMl90ICplcnIgPSBudWxscHRyKSB7CisgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SWQ7CisgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJZCkpOworICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIHJlcGx5LT5zZXRJbnQzMigiZXJyIiwgKmVycik7CisgICAgfQorICAgIHJlcGx5LT5wb3N0UmVwbHkocmVwbHlJZCk7Cit9CisKK3ZvaWQgU2ltcGxlQzJDb21wb25lbnQ6OldvcmtIYW5kbGVyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxTaW1wbGVDMkNvbXBvbmVudD4gdGhpeiA9IG1UaGl6LmxvY2soKTsKKyAgICBpZiAoIXRoaXopIHsKKyAgICAgICAgQUxPR0QoImNvbXBvbmVudCBub3QgeWV0IHNldDsgbXNnID0gJXMiLCBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlkOworICAgICAgICBpZiAobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJZCkpIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIHJlcGx5LT5zZXRJbnQzMigiZXJyIiwgQzJfQ09SUlVQVEVEKTsKKyAgICAgICAgICAgIHJlcGx5LT5wb3N0UmVwbHkocmVwbHlJZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdFByb2Nlc3M6IHsKKyAgICAgICAgICAgIGlmIChtUnVubmluZykgeworICAgICAgICAgICAgICAgIGlmICh0aGl6LT5wcm9jZXNzUXVldWUoKSkgeworICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0UHJvY2VzcywgdGhpcykpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiSWdub3JlIHByb2Nlc3MgbWVzc2FnZSBhcyB3ZSdyZSBub3QgcnVubmluZyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdEluaXQ6IHsKKyAgICAgICAgICAgIGludDMyX3QgZXJyID0gdGhpei0+b25Jbml0KCk7CisgICAgICAgICAgICBSZXBseShtc2csICZlcnIpOworICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRTdGFydDogeworICAgICAgICAgICAgbVJ1bm5pbmcgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFN0b3A6IHsKKyAgICAgICAgICAgIGludDMyX3QgZXJyID0gdGhpei0+b25TdG9wKCk7CisgICAgICAgICAgICBSZXBseShtc2csICZlcnIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFJlc2V0OiB7CisgICAgICAgICAgICB0aGl6LT5vblJlc2V0KCk7CisgICAgICAgICAgICBtUnVubmluZyA9IGZhbHNlOworICAgICAgICAgICAgUmVwbHkobXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRSZWxlYXNlOiB7CisgICAgICAgICAgICB0aGl6LT5vblJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1SdW5uaW5nID0gZmFsc2U7CisgICAgICAgICAgICBSZXBseShtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgQUxPR0QoIlVucmVjb2duaXplZCBtc2c6ICVkIiwgbXNnLT53aGF0KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2NsYXNzIFNpbXBsZUMyQ29tcG9uZW50OjpCbG9ja2luZ0Jsb2NrUG9vbCA6IHB1YmxpYyBDMkJsb2NrUG9vbCB7CitwdWJsaWM6CisgICAgQmxvY2tpbmdCbG9ja1Bvb2woY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgYmFzZSk6IG1CYXNle2Jhc2V9IHt9CisKKyAgICB2aXJ0dWFsIGxvY2FsX2lkX3QgZ2V0TG9jYWxJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1CYXNlLT5nZXRMb2NhbElkKCk7CisgICAgfQorCisgICAgdmlydHVhbCBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1CYXNlLT5nZXRBbGxvY2F0b3JJZCgpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiogYmxvY2spIHsKKyAgICAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICBkbyB7CisgICAgICAgICAgICBzdGF0dXMgPSBtQmFzZS0+ZmV0Y2hMaW5lYXJCbG9jayhjYXBhY2l0eSwgdXNhZ2UsIGJsb2NrKTsKKyAgICAgICAgfSB3aGlsZSAoc3RhdHVzID09IEMyX0JMT0NLSU5HKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoQ2lyY3VsYXJCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNpcmN1bGFyQmxvY2s+KiBibG9jaykgeworICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1CYXNlLT5mZXRjaENpcmN1bGFyQmxvY2soY2FwYWNpdHksIHVzYWdlLCBibG9jayk7CisgICAgICAgIH0gd2hpbGUgKHN0YXR1cyA9PSBDMl9CTE9DS0lORyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+KiBibG9jaykgeworICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1CYXNlLT5mZXRjaEdyYXBoaWNCbG9jayh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrKTsKKyAgICAgICAgfSB3aGlsZSAoc3RhdHVzID09IEMyX0JMT0NLSU5HKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtQmFzZTsKK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBEdW1teVJlYWRWaWV3IDogcHVibGljIEMyUmVhZFZpZXcgeworICAgIER1bW15UmVhZFZpZXcoKSA6IEMyUmVhZFZpZXcoQzJfTk9fSU5JVCkge30KK307CisKK30gIC8vIG5hbWVzcGFjZQorCitTaW1wbGVDMkNvbXBvbmVudDo6U2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gJmludGYpCisgICAgOiBtRHVtbXlSZWFkVmlldyhEdW1teVJlYWRWaWV3KCkpLAorICAgICAgbUludGYoaW50ZiksCisgICAgICBtTG9vcGVyKG5ldyBBTG9vcGVyKSwKKyAgICAgIG1IYW5kbGVyKG5ldyBXb3JrSGFuZGxlcikgeworICAgIG1Mb29wZXItPnNldE5hbWUoaW50Zi0+Z2V0TmFtZSgpLmNfc3RyKCkpOworICAgICh2b2lkKW1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlcik7CisgICAgbUxvb3Blci0+c3RhcnQoZmFsc2UsIGZhbHNlLCBBTkRST0lEX1BSSU9SSVRZX1ZJREVPKTsKK30KKworU2ltcGxlQzJDb21wb25lbnQ6On5TaW1wbGVDMkNvbXBvbmVudCgpIHsKKyAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlci0+aWQoKSk7CisgICAgKHZvaWQpbUxvb3Blci0+c3RvcCgpOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6c2V0TGlzdGVuZXJfdmIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+ICZsaXN0ZW5lciwgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgeworICAgIG1IYW5kbGVyLT5zZXRDb21wb25lbnQoc2hhcmVkX2Zyb21fdGhpcygpKTsKKworICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgIGlmIChzdGF0ZS0+bVN0YXRlID09IFJVTk5JTkcpIHsKKyAgICAgICAgaWYgKGxpc3RlbmVyKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1NUQVRFOworICAgICAgICB9IGVsc2UgaWYgKCFtYXlCbG9jaykgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JMT0NLSU5HOworICAgICAgICB9CisgICAgfQorICAgIHN0YXRlLT5tTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAvLyBUT0RPOiB3YWl0IGZvciBsaXN0ZW5lciBjaGFuZ2UgdG8gaGF2ZSB0YWtlbiBwbGFjZSBiZWZvcmUgcmV0dXJuaW5nCisgICAgLy8gKGUuZy4gaWYgdGhlcmUgaXMgYW4gb25nb2luZyBsaXN0ZW5lciBjYWxsYmFjaykKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50OjpxdWV1ZV9uYihzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICogY29uc3QgaXRlbXMpIHsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPm1TdGF0ZSAhPSBSVU5OSU5HKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1NUQVRFOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgcXVldWVXYXNFbXB0eSA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxXb3JrUXVldWU+OjpMb2NrZWQgcXVldWUobVdvcmtRdWV1ZSk7CisgICAgICAgIHF1ZXVlV2FzRW1wdHkgPSBxdWV1ZS0+ZW1wdHkoKTsKKyAgICAgICAgd2hpbGUgKCFpdGVtcy0+ZW1wdHkoKSkgeworICAgICAgICAgICAgcXVldWUtPnB1c2hfYmFjayhzdGQ6Om1vdmUoaXRlbXMtPmZyb250KCkpKTsKKyAgICAgICAgICAgIGl0ZW1zLT5wb3BfZnJvbnQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocXVldWVXYXNFbXB0eSkgeworICAgICAgICAobmV3IEFNZXNzYWdlKFdvcmtIYW5kbGVyOjprV2hhdFByb2Nlc3MsIG1IYW5kbGVyKSktPnBvc3QoKTsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6YW5ub3VuY2VfbmIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJXb3JrT3V0bGluZT4gJml0ZW1zKSB7CisgICAgKHZvaWQpaXRlbXM7CisgICAgcmV0dXJuIEMyX09NSVRURUQ7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50OjpmbHVzaF9zbSgKKyAgICAgICAgZmx1c2hfbW9kZV90IGZsdXNoTW9kZSwgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgZmx1c2hlZFdvcmspIHsKKyAgICAodm9pZClmbHVzaE1vZGU7CisgICAgeworICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5tU3RhdGUgIT0gUlVOTklORykgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9TVEFURTsKKyAgICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8V29ya1F1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1Xb3JrUXVldWUpOworICAgICAgICBxdWV1ZS0+aW5jR2VuZXJhdGlvbigpOworICAgICAgICAvLyBUT0RPOiBxdWV1ZS0+c3BsaWNlZEJ5KGZsdXNoZWRXb3JrLCBmbHVzaGVkV29yay0+ZW5kKCkpOworICAgICAgICB3aGlsZSAoIXF1ZXVlLT5lbXB0eSgpKSB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrID0gcXVldWUtPnBvcF9mcm9udCgpOworICAgICAgICAgICAgaWYgKHdvcmspIHsKKyAgICAgICAgICAgICAgICBmbHVzaGVkV29yay0+cHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKCFxdWV1ZS0+cGVuZGluZygpLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGZsdXNoZWRXb3JrLT5wdXNoX2JhY2soc3RkOjptb3ZlKHF1ZXVlLT5wZW5kaW5nKCkuYmVnaW4oKS0+c2Vjb25kKSk7CisgICAgICAgICAgICBxdWV1ZS0+cGVuZGluZygpLmVyYXNlKHF1ZXVlLT5wZW5kaW5nKCkuYmVnaW4oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50OjpkcmFpbl9uYihkcmFpbl9tb2RlX3QgZHJhaW5Nb2RlKSB7CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5tU3RhdGUgIT0gUlVOTklORykgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9TVEFURTsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIHF1ZXVlV2FzRW1wdHkgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8V29ya1F1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1Xb3JrUXVldWUpOworICAgICAgICBxdWV1ZVdhc0VtcHR5ID0gcXVldWUtPmVtcHR5KCk7CisgICAgICAgIHF1ZXVlLT5tYXJrRHJhaW4oZHJhaW5Nb2RlKTsKKyAgICB9CisgICAgaWYgKHF1ZXVlV2FzRW1wdHkpIHsKKyAgICAgICAgKG5ldyBBTWVzc2FnZShXb3JrSGFuZGxlcjo6a1doYXRQcm9jZXNzLCBtSGFuZGxlcikpLT5wb3N0KCk7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6c3RhcnQoKSB7CisgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgaWYgKHN0YXRlLT5tU3RhdGUgPT0gUlVOTklORykgeworICAgICAgICByZXR1cm4gQzJfQkFEX1NUQVRFOworICAgIH0KKyAgICBib29sIG5lZWRzSW5pdCA9IChzdGF0ZS0+bVN0YXRlID09IFVOSU5JVElBTElaRUQpOworICAgIHN0YXRlLnVubG9jaygpOworICAgIGlmIChuZWVkc0luaXQpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5OworICAgICAgICAobmV3IEFNZXNzYWdlKFdvcmtIYW5kbGVyOjprV2hhdEluaXQsIG1IYW5kbGVyKSktPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXBseSk7CisgICAgICAgIGludDMyX3QgZXJyOworICAgICAgICBDSEVDSyhyZXBseS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiAoYzJfc3RhdHVzX3QpZXJyOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgKG5ldyBBTWVzc2FnZShXb3JrSGFuZGxlcjo6a1doYXRTdGFydCwgbUhhbmRsZXIpKS0+cG9zdCgpOworICAgIH0KKyAgICBzdGF0ZS5sb2NrKCk7CisgICAgc3RhdGUtPm1TdGF0ZSA9IFJVTk5JTkc7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6c3RvcCgpIHsKKyAgICBBTE9HVigic3RvcCIpOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+bVN0YXRlICE9IFJVTk5JTkcpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfU1RBVEU7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPm1TdGF0ZSA9IFNUT1BQRUQ7CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxXb3JrUXVldWU+OjpMb2NrZWQgcXVldWUobVdvcmtRdWV1ZSk7CisgICAgICAgIHF1ZXVlLT5jbGVhcigpOworICAgICAgICBxdWV1ZS0+cGVuZGluZygpLmNsZWFyKCk7CisgICAgfQorICAgIHNwPEFNZXNzYWdlPiByZXBseTsKKyAgICAobmV3IEFNZXNzYWdlKFdvcmtIYW5kbGVyOjprV2hhdFN0b3AsIG1IYW5kbGVyKSktPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXBseSk7CisgICAgaW50MzJfdCBlcnI7CisgICAgQ0hFQ0socmVwbHktPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIChjMl9zdGF0dXNfdCllcnI7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OnJlc2V0KCkgeworICAgIEFMT0dWKCJyZXNldCIpOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgIHN0YXRlLT5tU3RhdGUgPSBVTklOSVRJQUxJWkVEOworICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8V29ya1F1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1Xb3JrUXVldWUpOworICAgICAgICBxdWV1ZS0+Y2xlYXIoKTsKKyAgICAgICAgcXVldWUtPnBlbmRpbmcoKS5jbGVhcigpOworICAgIH0KKyAgICBzcDxBTWVzc2FnZT4gcmVwbHk7CisgICAgKG5ldyBBTWVzc2FnZShXb3JrSGFuZGxlcjo6a1doYXRSZXNldCwgbUhhbmRsZXIpKS0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlcGx5KTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50OjpyZWxlYXNlKCkgeworICAgIEFMT0dWKCJyZWxlYXNlIik7CisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5OworICAgIChuZXcgQU1lc3NhZ2UoV29ya0hhbmRsZXI6OmtXaGF0UmVsZWFzZSwgbUhhbmRsZXIpKS0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlcGx5KTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gU2ltcGxlQzJDb21wb25lbnQ6OmludGYoKSB7CisgICAgcmV0dXJuIG1JbnRmOworfQorCituYW1lc3BhY2UgeworCitzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHZlYyhzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gcmV0OworICAgIHJldC5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICByZXR1cm4gcmV0OworfQorCit9ICAvLyBuYW1lc3BhY2UKKwordm9pZCBTaW1wbGVDMkNvbXBvbmVudDo6ZmluaXNoKAorICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LCBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJik+IGZpbGxXb3JrKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8V29ya1F1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1Xb3JrUXVldWUpOworICAgICAgICBpZiAocXVldWUtPnBlbmRpbmcoKS5jb3VudChmcmFtZUluZGV4KSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVygidW5rbm93biBmcmFtZSBpbmRleDogJSIgUFJJdTY0LCBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB3b3JrID0gc3RkOjptb3ZlKHF1ZXVlLT5wZW5kaW5nKCkuYXQoZnJhbWVJbmRleCkpOworICAgICAgICBxdWV1ZS0+cGVuZGluZygpLmVyYXNlKGZyYW1lSW5kZXgpOworICAgIH0KKyAgICBpZiAod29yaykgeworICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBtRXhlY1N0YXRlLmxvY2soKS0+bUxpc3RlbmVyOworICAgICAgICBsaXN0ZW5lci0+b25Xb3JrRG9uZV9uYihzaGFyZWRfZnJvbV90aGlzKCksIHZlYyh3b3JrKSk7CisgICAgICAgIEFMT0dWKCJyZXR1cm5pbmcgcGVuZGluZyB3b3JrIik7CisgICAgfQorfQorCit2b2lkIFNpbXBsZUMyQ29tcG9uZW50OjpjbG9uZUFuZFNlbmQoCisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZjdXJyZW50V29yaywKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICYpPiBmaWxsV29yaykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmsobmV3IEMyV29yayk7CisgICAgaWYgKGN1cnJlbnRXb3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPT0gZnJhbWVJbmRleCkgeworICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IGN1cnJlbnRXb3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbCA9IGN1cnJlbnRXb3JrLT5pbnB1dC5vcmRpbmFsOworICAgIH0gZWxzZSB7CisgICAgICAgIE11dGV4ZWQ8V29ya1F1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1Xb3JrUXVldWUpOworICAgICAgICBpZiAocXVldWUtPnBlbmRpbmcoKS5jb3VudChmcmFtZUluZGV4KSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVygidW5rbm93biBmcmFtZSBpbmRleDogJSIgUFJJdTY0LCBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IHF1ZXVlLT5wZW5kaW5nKCkuYXQoZnJhbWVJbmRleCktPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsID0gcXVldWUtPnBlbmRpbmcoKS5hdChmcmFtZUluZGV4KS0+aW5wdXQub3JkaW5hbDsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworICAgIGlmICh3b3JrKSB7CisgICAgICAgIGZpbGxXb3JrKHdvcmspOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IG1FeGVjU3RhdGUubG9jaygpLT5tTGlzdGVuZXI7CisgICAgICAgIGxpc3RlbmVyLT5vbldvcmtEb25lX25iKHNoYXJlZF9mcm9tX3RoaXMoKSwgdmVjKHdvcmspKTsKKyAgICAgICAgQUxPR1YoImNsb25lZCBhbmQgc2VuZGluZyB3b3JrIik7CisgICAgfQorfQorCitib29sIFNpbXBsZUMyQ29tcG9uZW50Ojpwcm9jZXNzUXVldWUoKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICB1aW50NjRfdCBnZW5lcmF0aW9uOworICAgIGludDMyX3QgZHJhaW5Nb2RlOworICAgIGJvb2wgaXNGbHVzaFBlbmRpbmcgPSBmYWxzZTsKKyAgICBib29sIGhhc1F1ZXVlZFdvcmsgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8V29ya1F1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1Xb3JrUXVldWUpOworICAgICAgICBpZiAocXVldWUtPmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGdlbmVyYXRpb24gPSBxdWV1ZS0+Z2VuZXJhdGlvbigpOworICAgICAgICBkcmFpbk1vZGUgPSBxdWV1ZS0+ZHJhaW5Nb2RlKCk7CisgICAgICAgIGlzRmx1c2hQZW5kaW5nID0gcXVldWUtPnBvcFBlbmRpbmdGbHVzaCgpOworICAgICAgICB3b3JrID0gcXVldWUtPnBvcF9mcm9udCgpOworICAgICAgICBoYXNRdWV1ZWRXb3JrID0gIXF1ZXVlLT5lbXB0eSgpOworICAgIH0KKyAgICBpZiAoaXNGbHVzaFBlbmRpbmcpIHsKKyAgICAgICAgQUxPR1YoInByb2Nlc3NpbmcgcGVuZGluZyBmbHVzaCIpOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBvbkZsdXNoX3NtKCk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dEKCJmbHVzaCBlcnI6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIC8vIFRPRE86IGVycm9yCisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIW1PdXRwdXRCbG9ja1Bvb2wpIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gW3RoaXNdIHsKKyAgICAgICAgICAgIC8vIFRPRE86IGRvbid0IHVzZSBxdWVyeV92YgorICAgICAgICAgICAgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0IG91dHB1dEZvcm1hdCgwdSk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtczsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IGludGYoKS0+cXVlcnlfdmIoCisgICAgICAgICAgICAgICAgICAgIHsgJm91dHB1dEZvcm1hdCB9LAorICAgICAgICAgICAgICAgICAgICB7IEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSB9LAorICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAmcGFyYW1zKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0sgJiYgZXJyICE9IEMyX0JBRF9JTkRFWCkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJxdWVyeSBlcnIgPSAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IHBvb2xJZCA9CisgICAgICAgICAgICAgICAgb3V0cHV0Rm9ybWF0LnZhbHVlID09IEMyQnVmZmVyRGF0YTo6R1JBUEhJQworICAgICAgICAgICAgICAgICAgICAgICAgPyBDMkJsb2NrUG9vbDo6QkFTSUNfR1JBUEhJQworICAgICAgICAgICAgICAgICAgICAgICAgOiBDMkJsb2NrUG9vbDo6QkFTSUNfTElORUFSOworICAgICAgICAgICAgaWYgKHBhcmFtcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQgKm91dHB1dFBvb2xzID0KKyAgICAgICAgICAgICAgICAgICAgQzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0OjpGcm9tKHBhcmFtc1swXS5nZXQoKSk7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dFBvb2xzICYmIG91dHB1dFBvb2xzLT5mbGV4Q291bnQoKSA+PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHBvb2xJZCA9IG91dHB1dFBvb2xzLT5tLnZhbHVlc1swXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gYmxvY2tQb29sOworICAgICAgICAgICAgZXJyID0gR2V0Q29kZWMyQmxvY2tQb29sKHBvb2xJZCwgc2hhcmVkX2Zyb21fdGhpcygpLCAmYmxvY2tQb29sKTsKKyAgICAgICAgICAgIEFMT0dEKCJVc2luZyBvdXRwdXQgYmxvY2sgcG9vbCB3aXRoIHBvb2xJRCAlbGx1ID0+IGdvdCAlbGx1IC0gJWQiLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBvb2xJZCwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tQb29sID8gYmxvY2tQb29sLT5nZXRMb2NhbElkKCkgOiAxMTEwMDAxMTEpLAorICAgICAgICAgICAgICAgICAgICBlcnIpOworICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgIG1PdXRwdXRCbG9ja1Bvb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPEJsb2NraW5nQmxvY2tQb29sPihibG9ja1Bvb2wpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfSgpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+IGxpc3RlbmVyID0gc3RhdGUtPm1MaXN0ZW5lcjsKKyAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgbGlzdGVuZXItPm9uRXJyb3JfbmIoc2hhcmVkX2Zyb21fdGhpcygpLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGhhc1F1ZXVlZFdvcms7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXdvcmspIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gZHJhaW4oZHJhaW5Nb2RlLCBtT3V0cHV0QmxvY2tQb29sKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IHN0YXRlLT5tTGlzdGVuZXI7CisgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vbkVycm9yX25iKHNoYXJlZF9mcm9tX3RoaXMoKSwgZXJyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaGFzUXVldWVkV29yazsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0gKj4gdXBkYXRlczsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtOiB3b3JrLT5pbnB1dC5jb25maWdVcGRhdGUpIHsKKyAgICAgICAgICAgIGlmIChwYXJhbSkgeworICAgICAgICAgICAgICAgIHVwZGF0ZXMuZW1wbGFjZV9iYWNrKHBhcmFtLmdldCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXVwZGF0ZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gaW50ZigpLT5jb25maWdfdmIodXBkYXRlcywgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgQUxPR0QoImFwcGxpZWQgJXp1IGNvbmZpZ1VwZGF0ZXMgPT4gJXMgKCVkKSIsIHVwZGF0ZXMuc2l6ZSgpLCBhc1N0cmluZyhlcnIpLCBlcnIpOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoInN0YXJ0IHByb2Nlc3NpbmcgZnJhbWUgIyUiIFBSSXU2NCwgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworICAgIC8vIElmIGlucHV0IGJ1ZmZlciBsaXN0IGlzIG5vdCBlbXB0eSwgaXQgbWVhbnMgd2UgaGF2ZSBzb21lIGlucHV0IHRvIHByb2Nlc3Mgb24uCisgICAgLy8gSG93ZXZlciwgaW5wdXQgY291bGQgYmUgYSBudWxsIGJ1ZmZlci4gSW4gc3VjaCBjYXNlLCBjbGVhciB0aGUgYnVmZmVyIGxpc3QKKyAgICAvLyBiZWZvcmUgbWFraW5nIGNhbGwgdG8gcHJvY2VzcygpLgorICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpICYmICF3b3JrLT5pbnB1dC5idWZmZXJzWzBdKSB7CisgICAgICAgIEFMT0dEKCJFbmNvdW50ZXJlZCBudWxsIGlucHV0IGJ1ZmZlci4gQ2xlYXJpbmcgdGhlIGlucHV0IGJ1ZmZlciIpOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgfQorICAgIHByb2Nlc3Mod29yaywgbU91dHB1dEJsb2NrUG9vbCk7CisgICAgQUxPR1YoInByb2Nlc3NlZCBmcmFtZSAjJSIgUFJJdTY0LCB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgTXV0ZXhlZDxXb3JrUXVldWU+OjpMb2NrZWQgcXVldWUobVdvcmtRdWV1ZSk7CisgICAgaWYgKHF1ZXVlLT5nZW5lcmF0aW9uKCkgIT0gZ2VuZXJhdGlvbikgeworICAgICAgICBBTE9HRCgid29yayBmb3JtIG9sZCBnZW5lcmF0aW9uOiB3YXMgJSIgUFJJdTY0ICIgbm93ICUiIFBSSXU2NCwKKyAgICAgICAgICAgICAgICBxdWV1ZS0+Z2VuZXJhdGlvbigpLCBnZW5lcmF0aW9uKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9UX0ZPVU5EOworICAgICAgICBxdWV1ZS51bmxvY2soKTsKKworICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBzdGF0ZS0+bUxpc3RlbmVyOworICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgbGlzdGVuZXItPm9uV29ya0RvbmVfbmIoc2hhcmVkX2Zyb21fdGhpcygpLCB2ZWMod29yaykpOworICAgICAgICByZXR1cm4gaGFzUXVldWVkV29yazsKKyAgICB9CisgICAgaWYgKHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkICE9IDB1KSB7CisgICAgICAgIHF1ZXVlLnVubG9jaygpOworICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgQUxPR1YoInJldHVybmluZyB0aGlzIHdvcmsiKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBzdGF0ZS0+bUxpc3RlbmVyOworICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgbGlzdGVuZXItPm9uV29ya0RvbmVfbmIoc2hhcmVkX2Zyb21fdGhpcygpLCB2ZWMod29yaykpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJxdWV1ZSBwZW5kaW5nIHdvcmsiKTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB1bmV4cGVjdGVkOworCisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgaWYgKHF1ZXVlLT5wZW5kaW5nKCkuY291bnQoZnJhbWVJbmRleCkgIT0gMCkgeworICAgICAgICAgICAgdW5leHBlY3RlZCA9IHN0ZDo6bW92ZShxdWV1ZS0+cGVuZGluZygpLmF0KGZyYW1lSW5kZXgpKTsKKyAgICAgICAgICAgIHF1ZXVlLT5wZW5kaW5nKCkuZXJhc2UoZnJhbWVJbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgKHZvaWQpcXVldWUtPnBlbmRpbmcoKS5pbnNlcnQoeyBmcmFtZUluZGV4LCBzdGQ6Om1vdmUod29yaykgfSk7CisKKyAgICAgICAgcXVldWUudW5sb2NrKCk7CisgICAgICAgIGlmICh1bmV4cGVjdGVkKSB7CisgICAgICAgICAgICBBTE9HRCgidW5leHBlY3RlZCBwZW5kaW5nIHdvcmsiKTsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWQtPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBzdGF0ZS0+bUxpc3RlbmVyOworICAgICAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgICAgICBsaXN0ZW5lci0+b25Xb3JrRG9uZV9uYihzaGFyZWRfZnJvbV90aGlzKCksIHZlYyh1bmV4cGVjdGVkKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGhhc1F1ZXVlZFdvcms7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gU2ltcGxlQzJDb21wb25lbnQ6OmNyZWF0ZUxpbmVhckJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jaykgeworICAgIHJldHVybiBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIGJsb2NrLT5vZmZzZXQoKSwgYmxvY2stPnNpemUoKSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gU2ltcGxlQzJDb21wb25lbnQ6OmNyZWF0ZUxpbmVhckJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jaywgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICByZXR1cm4gQzJCdWZmZXI6OkNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jay0+c2hhcmUob2Zmc2V0LCBzaXplLCA6OkMyRmVuY2UoKSkpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IFNpbXBsZUMyQ29tcG9uZW50OjpjcmVhdGVHcmFwaGljQnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaykgeworICAgIHJldHVybiBjcmVhdGVHcmFwaGljQnVmZmVyKGJsb2NrLCBDMlJlY3QoYmxvY2stPndpZHRoKCksIGJsb2NrLT5oZWlnaHQoKSkpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IFNpbXBsZUMyQ29tcG9uZW50OjpjcmVhdGVHcmFwaGljQnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaywgY29uc3QgQzJSZWN0ICZjcm9wKSB7CisgICAgcmV0dXJuIEMyQnVmZmVyOjpDcmVhdGVHcmFwaGljQnVmZmVyKGJsb2NrLT5zaGFyZShjcm9wLCA6OkMyRmVuY2UoKSkpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL1NpbXBsZUMySW50ZXJmYWNlLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJJbnRlcmZhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NDlhNGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL1NpbXBsZUMySW50ZXJmYWNlLmNwcApAQCAtMCwwICsxLDMxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU2ltcGxlQzJJbnRlcmZhY2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKy8vIHVzZSBNZWRpYURlZnMgaGVyZSB2cy4gTWVkaWFDb2RlY0NvbnN0YW50cyBhcyB0aGlzIGlzIG5vdCBNZWRpYUNvZGVjIHNwZWNpZmljL2RlcGVuZGVudAorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qIFNpbXBsZUludGVyZmFjZSAqLworCitTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXM6OkJhc2VQYXJhbXMoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJnJlZmxlY3RvciwKKyAgICAgICAgQzJTdHJpbmcgbmFtZSwKKyAgICAgICAgQzJDb21wb25lbnQ6OmtpbmRfdCBraW5kLAorICAgICAgICBDMkNvbXBvbmVudDo6ZG9tYWluX3QgZG9tYWluLAorICAgICAgICBDMlN0cmluZyBtZWRpYVR5cGUsCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyU3RyaW5nPiBhbGlhc2VzKQorICAgIDogQzJJbnRlcmZhY2VIZWxwZXIocmVmbGVjdG9yKSB7CisgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU5hbWUsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9OQU1FKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyQ29tcG9uZW50TmFtZVNldHRpbmc+KG5hbWUuY19zdHIoKSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBpZiAoYWxpYXNlcy5zaXplKCkpIHsKKyAgICAgICAgQzJTdHJpbmcgam9pbmVkOworICAgICAgICBmb3IgKGNvbnN0IEMyU3RyaW5nICZhbGlhcyA6IGFsaWFzZXMpIHsKKyAgICAgICAgICAgIGlmIChqb2luZWQubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICBqb2luZWQgKz0gIiwiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgam9pbmVkICs9IGFsaWFzOworICAgICAgICB9CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWxpYXNlcywgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FMSUFTRVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyQ29tcG9uZW50QWxpYXNlc1NldHRpbmc+KGpvaW5lZC5jX3N0cigpKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUtpbmQsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9LSU5EKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEtpbmRTZXR0aW5nKGtpbmQpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obURvbWFpbiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0RPTUFJTikKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnREb21haW5TZXR0aW5nKGRvbWFpbikpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAvLyBzaW1wbGUgaW50ZXJmYWNlcyBoYXZlIHNpbmdsZSBzdHJlYW1zCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0U3RyZWFtQ291bnQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9DT1VOVCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJQb3J0U3RyZWFtQ291bnRUdW5pbmc6OmlucHV0KDEpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dFN0cmVhbUNvdW50LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0NPVU5UKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRTdHJlYW1Db3VudFR1bmluZzo6b3V0cHV0KDEpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgLy8gc2V0IHVwIGJ1ZmZlciBmb3JtYXRzIGFuZCBhbGxvY2F0b3JzCisKKyAgICAvLyBkZWZhdWx0IHRvIGxpbmVhciBidWZmZXJzIGFuZCBubyBtZWRpYSB0eXBlCisgICAgQzJCdWZmZXJEYXRhOjp0eXBlX3QgcmF3QnVmZmVyVHlwZSA9IEMyQnVmZmVyRGF0YTo6TElORUFSOworICAgIEMyU3RyaW5nIHJhd01lZGlhVHlwZTsKKyAgICBDMkFsbG9jYXRvcjo6aWRfdCByYXdBbGxvY2F0b3IgPSBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUjsKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCByYXdQb29sSWQgPSBDMkJsb2NrUG9vbDo6QkFTSUNfTElORUFSOworICAgIEMyQnVmZmVyRGF0YTo6dHlwZV90IGNvZGVkQnVmZmVyVHlwZSA9IEMyQnVmZmVyRGF0YTo6TElORUFSOworICAgIEMyQWxsb2NhdG9yOjppZF90IGNvZGVkQWxsb2NhdG9yID0gQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVI7CisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgY29kZWRQb29sSWQgPSBDMkJsb2NrUG9vbDo6QkFTSUNfTElORUFSOworCisgICAgc3dpdGNoIChkb21haW4pIHsKKyAgICAgICAgY2FzZSBDMkNvbXBvbmVudDo6RE9NQUlOX0lNQUdFOgorICAgICAgICBjYXNlIEMyQ29tcG9uZW50OjpET01BSU5fVklERU86CisgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2UgZGVmaW5lIHJhdyBpbWFnZT8gVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aW1lc3RhbXAgaGFuZGxpbmcKKyAgICAgICAgICAgIHJhd0J1ZmZlclR5cGUgPSBDMkJ1ZmZlckRhdGE6OkdSQVBISUM7CisgICAgICAgICAgICByYXdNZWRpYVR5cGUgPSBNRURJQV9NSU1FVFlQRV9WSURFT19SQVc7CisgICAgICAgICAgICByYXdBbGxvY2F0b3IgPSBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0dSQVBISUM7CisgICAgICAgICAgICByYXdQb29sSWQgPSBDMkJsb2NrUG9vbDo6QkFTSUNfR1JBUEhJQzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEMyQ29tcG9uZW50OjpET01BSU5fQVVESU86CisgICAgICAgICAgICByYXdCdWZmZXJUeXBlID0gQzJCdWZmZXJEYXRhOjpMSU5FQVI7CisgICAgICAgICAgICByYXdNZWRpYVR5cGUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19SQVc7CisgICAgICAgICAgICByYXdBbGxvY2F0b3IgPSBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUjsKKyAgICAgICAgICAgIHJhd1Bvb2xJZCA9IEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBib29sIGlzRW5jb2RlciA9IGtpbmQgPT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjsKKworICAgIC8vIGhhbmRsZSByYXcgZGVjb2RlcnMKKyAgICBpZiAobWVkaWFUeXBlID09IHJhd01lZGlhVHlwZSkgeworICAgICAgICBjb2RlZEJ1ZmZlclR5cGUgPSByYXdCdWZmZXJUeXBlOworICAgICAgICBjb2RlZEFsbG9jYXRvciA9IHJhd0FsbG9jYXRvcjsKKyAgICAgICAgY29kZWRQb29sSWQgPSByYXdQb29sSWQ7CisgICAgfQorCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0KAorICAgICAgICAgICAgICAgICAgICAwdSwgaXNFbmNvZGVyID8gcmF3QnVmZmVyVHlwZSA6IGNvZGVkQnVmZmVyVHlwZSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICBpc0VuY29kZXIgPyByYXdNZWRpYVR5cGUgOiBtZWRpYVR5cGUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAwdSwgaXNFbmNvZGVyID8gY29kZWRCdWZmZXJUeXBlIDogcmF3QnVmZmVyVHlwZSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICBpc0VuY29kZXIgPyBtZWRpYVR5cGUgOiByYXdNZWRpYVR5cGUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgQzJBbGxvY2F0b3I6OmlkX3QgaW5wdXRBbGxvY2F0b3JzWzFdID0geyBpc0VuY29kZXIgPyByYXdBbGxvY2F0b3IgOiBjb2RlZEFsbG9jYXRvciB9OworICAgIEMyQWxsb2NhdG9yOjppZF90IG91dHB1dEFsbG9jYXRvcnNbMV0gPSB7IGlzRW5jb2RlciA/IGNvZGVkQWxsb2NhdG9yIDogcmF3QWxsb2NhdG9yIH07CisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3Qgb3V0cHV0UG9vbElkc1sxXSA9IHsgaXNFbmNvZGVyID8gY29kZWRQb29sSWQgOiByYXdQb29sSWQgfTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEFsbG9jYXRvcnMsIEMyX1BBUkFNS0VZX0lOUFVUX0FMTE9DQVRPUlMpCisgICAgICAgICAgICAud2l0aERlZmF1bHQoQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQ6OkFsbG9jU2hhcmVkKGlucHV0QWxsb2NhdG9ycykpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7IEMyRihtSW5wdXRBbGxvY2F0b3JzLCBtLnZhbHVlc1swXSkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtSW5wdXRBbGxvY2F0b3JzLCBtLnZhbHVlcykuaW5SYW5nZSgwLCAxKSB9KQorICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0Pjo6Tm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcykKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRBbGxvY2F0b3JzLCBDMl9QQVJBTUtFWV9PVVRQVVRfQUxMT0NBVE9SUykKKyAgICAgICAgICAgIC53aXRoRGVmYXVsdChDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKG91dHB1dEFsbG9jYXRvcnMpKQorICAgICAgICAgICAgLndpdGhGaWVsZHMoeyBDMkYobU91dHB1dEFsbG9jYXRvcnMsIG0udmFsdWVzWzBdKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1PdXRwdXRBbGxvY2F0b3JzLCBtLnZhbHVlcykuaW5SYW5nZSgwLCAxKSB9KQorICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6Om91dHB1dD46Ok5vblN0cmljdFZhbHVlc1dpdGhOb0RlcHMpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0UG9vbElkcywgQzJfUEFSQU1LRVlfT1VUUFVUX0JMT0NLX1BPT0xTKQorICAgICAgICAgICAgLndpdGhEZWZhdWx0KEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dDo6QWxsb2NTaGFyZWQob3V0cHV0UG9vbElkcykpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7IEMyRihtT3V0cHV0UG9vbElkcywgbS52YWx1ZXNbMF0pLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobU91dHB1dFBvb2xJZHMsIG0udmFsdWVzKS5pblJhbmdlKDAsIDEpIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8QzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0Pjo6Tm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcykKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIC8vIGFkZCBzdGF0ZWxlc3MgcGFyYW1zCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVN1YnNjcmliZWRQYXJhbUluZGljZXMsIEMyX1BBUkFNS0VZX1NVQlNDUklCRURfUEFSQU1fSU5ESUNFUykKKyAgICAgICAgICAgIC53aXRoRGVmYXVsdChDMlN1YnNjcmliZWRQYXJhbUluZGljZXNUdW5pbmc6OkFsbG9jU2hhcmVkKDB1KSkKKyAgICAgICAgICAgIC53aXRoRmllbGRzKHsgQzJGKG1TdWJzY3JpYmVkUGFyYW1JbmRpY2VzLCBtLnZhbHVlc1swXSkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtU3Vic2NyaWJlZFBhcmFtSW5kaWNlcywgbS52YWx1ZXMpLmFueSgpIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8QzJTdWJzY3JpYmVkUGFyYW1JbmRpY2VzVHVuaW5nPjo6Tm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcykKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIC8qIFRPRE8KKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1DdXJyZW50V29ya09yZGluYWwsIEMyX1BBUkFNS0VZX0NVUlJFTlRfV09SSykKKyAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJDdXJyZW50V29ya1R1bmluZygpKQorICAgICAgICAgICAgLndpdGhGaWVsZHMoeyBDMkYobUN1cnJlbnRXb3JrT3JkaW5hbCwgbS50aW1lU3RhbXApLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobUN1cnJlbnRXb3JrT3JkaW5hbCwgbS5mcmFtZUluZGV4KS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1DdXJyZW50V29ya09yZGluYWwsIG0uY3VzdG9tT3JkaW5hbCkuYW55KCkgfSkKKyAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxDMkN1cnJlbnRXb3JrVHVuaW5nPjo6Tm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcykKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1MYXN0SW5wdXRRdWV1ZWRXb3JrT3JkaW5hbCwgQzJfUEFSQU1LRVlfTEFTVF9JTlBVVF9RVUVVRUQpCisgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyTGFzdFdvcmtRdWV1ZWRUdW5pbmc6OmlucHV0KCkpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7IEMyRihtTGFzdElucHV0UXVldWVkV29ya09yZGluYWwsIG0udGltZVN0YW1wKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1MYXN0SW5wdXRRdWV1ZWRXb3JrT3JkaW5hbCwgbS5mcmFtZUluZGV4KS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1MYXN0SW5wdXRRdWV1ZWRXb3JrT3JkaW5hbCwgbS5jdXN0b21PcmRpbmFsKS5hbnkoKSB9KQorICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPEMyTGFzdFdvcmtRdWV1ZWRUdW5pbmc6OmlucHV0Pjo6Tm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcykKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1MYXN0T3V0cHV0UXVldWVkV29ya09yZGluYWwsIEMyX1BBUkFNS0VZX0xBU1RfT1VUUFVUX1FVRVVFRCkKKyAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJMYXN0V29ya1F1ZXVlZFR1bmluZzo6b3V0cHV0KCkpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7IEMyRihtTGFzdE91dHB1dFF1ZXVlZFdvcmtPcmRpbmFsLCBtLnRpbWVTdGFtcCkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtTGFzdE91dHB1dFF1ZXVlZFdvcmtPcmRpbmFsLCBtLmZyYW1lSW5kZXgpLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobUxhc3RPdXRwdXRRdWV1ZWRXb3JrT3JkaW5hbCwgbS5jdXN0b21PcmRpbmFsKS5hbnkoKSB9KQorICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPEMyTGFzdFdvcmtRdWV1ZWRUdW5pbmc6Om91dHB1dD46Ok5vblN0cmljdFZhbHVlc1dpdGhOb0RlcHMpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJPdXRPZk1lbW9yeVR1bmluZz4gbU91dE9mTWVtb3J5OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydENvbmZpZ0NvdW50ZXJUdW5pbmc6OmlucHV0PiBtSW5wdXRDb25maWdDb3VudGVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRDb25maWdDb3VudGVyVHVuaW5nOjpvdXRwdXQ+IG1PdXRwdXRDb25maWdDb3VudGVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbmZpZ0NvdW50ZXJUdW5pbmc+IG1EaXJlY3RDb25maWdDb3VudGVyOworCisgICAgKi8KK30KKwordm9pZCBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXM6Om5vSW5wdXRMYXRlbmN5KCkgeworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1SZXF1ZXN0ZWRJbnB1dERlbGF5LCBDMl9QQVJBTUtFWV9JTlBVVF9ERUxBWV9SRVFVRVNUKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRSZXF1ZXN0ZWREZWxheVR1bmluZzo6aW5wdXQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUFjdHVhbElucHV0RGVsYXksIEMyX1BBUkFNS0VZX0lOUFVUX0RFTEFZKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6aW5wdXQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworfQorCit2b2lkIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtczo6bm9PdXRwdXRMYXRlbmN5KCkgeworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1SZXF1ZXN0ZWRPdXRwdXREZWxheSwgQzJfUEFSQU1LRVlfT1VUUFVUX0RFTEFZX1JFUVVFU1QpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUG9ydFJlcXVlc3RlZERlbGF5VHVuaW5nOjpvdXRwdXQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUFjdHVhbE91dHB1dERlbGF5LCBDMl9QQVJBTUtFWV9PVVRQVVRfREVMQVkpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjpvdXRwdXQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworfQorCit2b2lkIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtczo6bm9QaXBlbGluZUxhdGVuY3koKSB7CisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVJlcXVlc3RlZFBpcGVsaW5lRGVsYXksIEMyX1BBUkFNS0VZX1BJUEVMSU5FX0RFTEFZX1JFUVVFU1QpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUmVxdWVzdGVkUGlwZWxpbmVEZWxheVR1bmluZygwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWN0dWFsUGlwZWxpbmVEZWxheSwgQzJfUEFSQU1LRVlfUElQRUxJTkVfREVMQVkpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQWN0dWFsUGlwZWxpbmVEZWxheVR1bmluZygwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7Cit9CisKK3ZvaWQgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zOjpub1ByaXZhdGVCdWZmZXJzKCkgeworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcml2YXRlQWxsb2NhdG9ycywgQzJfUEFSQU1LRVlfUFJJVkFURV9BTExPQ0FUT1JTKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEMyUHJpdmF0ZUFsbG9jYXRvcnNUdW5pbmc6OkFsbG9jU2hhcmVkKDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhQcml2YXRlQnVmZmVyQ291bnQsIEMyX1BBUkFNS0VZX01BWF9QUklWQVRFX0JVRkZFUl9DT1VOVCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShDMk1heFByaXZhdGVCdWZmZXJDb3VudFR1bmluZzo6QWxsb2NTaGFyZWQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByaXZhdGVQb29sSWRzLCBDMl9QQVJBTUtFWV9QUklWQVRFX0JMT0NLX1BPT0xTKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEMyUHJpdmF0ZUJsb2NrUG9vbHNUdW5pbmc6OkFsbG9jU2hhcmVkKDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKK30KKwordm9pZCBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXM6Om5vSW5wdXRSZWZlcmVuY2VzKCkgeworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhJbnB1dFJlZmVyZW5jZUFnZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX1JFRkVSRU5DRV9BR0UpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4UmVmZXJlbmNlQWdlVHVuaW5nOjppbnB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4SW5wdXRSZWZlcmVuY2VDb3VudCwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX1JFRkVSRU5DRV9DT1VOVCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhSZWZlcmVuY2VDb3VudFR1bmluZzo6aW5wdXQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworfQorCit2b2lkIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtczo6bm9PdXRwdXRSZWZlcmVuY2VzKCkgeworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhPdXRwdXRSZWZlcmVuY2VBZ2UsIEMyX1BBUkFNS0VZX09VVFBVVF9NQVhfUkVGRVJFTkNFX0FHRSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhSZWZlcmVuY2VBZ2VUdW5pbmc6Om91dHB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4T3V0cHV0UmVmZXJlbmNlQ291bnQsIEMyX1BBUkFNS0VZX09VVFBVVF9NQVhfUkVGRVJFTkNFX0NPVU5UKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heFJlZmVyZW5jZUNvdW50VHVuaW5nOjpvdXRwdXQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworfQorCit2b2lkIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtczo6bm9UaW1lU3RyZXRjaCgpIHsKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtVGltZVN0cmV0Y2gsIEMyX1BBUkFNS0VZX1RJTUVfU1RSRVRDSCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRUaW1lU3RyZXRjaFR1bmluZygxLmYpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworfQorCisvKgorICAgIENsaWVudHMgbmVlZCB0byBoYW5kbGUgdGhlIGZvbGxvd2luZyBiYXNlIHBhcmFtcyBkdWUgdG8gY3VzdG9tIGRlcGVuZGVuY3kuCisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBcGlMZXZlbFNldHRpbmc+IG1BcGlMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBcGlGZWF0dXJlc1NldHRpbmc+IG1BcGlGZWF0dXJlczsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZz4gbUF0dHJpYjsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRTdWdnZXN0ZWRCdWZmZXJDb3VudFR1bmluZzo6aW5wdXQ+IG1TdWdnZXN0ZWRJbnB1dEJ1ZmZlckNvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRTdWdnZXN0ZWRCdWZmZXJDb3VudFR1bmluZzo6b3V0cHV0PiBtU3VnZ2VzdGVkT3V0cHV0QnVmZmVyQ291bnQ7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJUcmlwcGVkVHVuaW5nPiBtVHJpcHBlZDsKKworKi8KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9leHBvcnRzLmxkcyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvZXhwb3J0cy5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQxYmFlOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvZXhwb3J0cy5sZHMKQEAgLTAsMCArMSw3IEBACit7CisgICAgZ2xvYmFsOgorICAgICAgICBDcmVhdGVDb2RlYzJGYWN0b3J5OworICAgICAgICBEZXN0cm95Q29kZWMyRmFjdG9yeTsKKyAgICBsb2NhbDogKjsKK307CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvaW5jbHVkZS9TaW1wbGVDMkNvbXBvbmVudC5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9pbmNsdWRlL1NpbXBsZUMyQ29tcG9uZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJkNTcxNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvaW5jbHVkZS9TaW1wbGVDMkNvbXBvbmVudC5oCkBAIC0wLDAgKzEsMjQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTSU1QTEVfQzJfQ09NUE9ORU5UX0hfCisjZGVmaW5lIFNJTVBMRV9DMl9DT01QT05FTlRfSF8KKworI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NdXRleGVkLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgU2ltcGxlQzJDb21wb25lbnQKKyAgICAgICAgOiBwdWJsaWMgQzJDb21wb25lbnQsIHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPFNpbXBsZUMyQ29tcG9uZW50PiB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICZpbnRmKTsKKyAgICB2aXJ0dWFsIH5TaW1wbGVDMkNvbXBvbmVudCgpOworCisgICAgLy8gQzJDb21wb25lbnQKKyAgICAvLyBGcm9tIEMyQ29tcG9uZW50CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzZXRMaXN0ZW5lcl92YigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gJmxpc3RlbmVyLCBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXVlX25iKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGl0ZW1zKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGFubm91bmNlX25iKGNvbnN0IHN0ZDo6dmVjdG9yPEMyV29ya091dGxpbmU+ICZpdGVtcykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmbHVzaF9zbSgKKyAgICAgICAgICAgIGZsdXNoX21vZGVfdCBtb2RlLCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBmbHVzaGVkV29yaykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBkcmFpbl9uYihkcmFpbl9tb2RlX3QgbW9kZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzdGFydCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgc3RvcCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVzZXQoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZigpIG92ZXJyaWRlOworCisgICAgLy8gZm9yIGhhbmRsZXIKKyAgICBib29sIHByb2Nlc3NRdWV1ZSgpOworCitwcm90ZWN0ZWQ6CisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBpbnRlcm5hbCBzdGF0ZXMgb2YgdGhlIGNvbXBvbmVudCBhY2NvcmRpbmcgdG8gdGhlIGNvbmZpZyBzZXQKKyAgICAgKiBpbiB0aGUgaW50ZXJmYWNlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGR1cmluZyBzdGFydCgpLCBidXQgb25seSBhdCB0aGUgZmlyc3QgaW52b2NhdGlvbiBvcgorICAgICAqIGFmdGVyIHJlc2V0KCkuCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBvbkluaXQoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTdG9wIHRoZSBjb21wb25lbnQuCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBvblN0b3AoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXNldCB0aGUgY29tcG9uZW50LgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBvblJlc2V0KCkgPSAwOworCisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGUgY29tcG9uZW50LgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBvblJlbGVhc2UoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBGbHVzaCB0aGUgY29tcG9uZW50LgorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpID0gMDsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIGdpdmVuIHdvcmsgYW5kIGZpbmlzaCBwZW5kaW5nIHdvcmsgdXNpbmcgZmluaXNoKCkuCisgICAgICoKKyAgICAgKiBccGFyYW1baW4sb3V0XSAgIHdvcmsgICAgdGhlIHdvcmsgdG8gcHJvY2VzcworICAgICAqIFxwYXJhbVtpbl0gICAgICAgcG9vbCAgICB0aGUgcG9vbCB0byB1c2UgZm9yIGFsbG9jYXRpbmcgb3V0cHV0IGJsb2Nrcy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgPSAwOworCisgICAgLyoqCisgICAgICogRHJhaW4gdGhlIGNvbXBvbmVudCBhbmQgZmluaXNoIHBlbmRpbmcgd29yayB1c2luZyBmaW5pc2goKS4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gICBkcmFpbk1vZGUgICBtb2RlIG9mIGRyYWluLgorICAgICAqIFxwYXJhbVtpbl0gICBwb29sICAgICAgICB0aGUgcG9vbCB0byB1c2UgZm9yIGFsbG9jYXRpbmcgb3V0cHV0IGJsb2Nrcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgICAgICBUaGUgY29tcG9uZW50IGhhcyBkcmFpbmVkIGFsbCBwZW5kaW5nIG91dHB1dAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLgorICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgICAgICBVbnN1cHBvcnRlZCBtb2RlIChlLmcuIERSQUlOX0NIQUlOKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSA9IDA7CisKKyAgICAvLyBmb3IgZGVyaXZlZCBjbGFzc2VzCisgICAgLyoqCisgICAgICogRmluaXNoIHBlbmRpbmcgd29yay4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0cmlldmUgdGhlIHBlbmRpbmcgd29yayBhY2NvcmRpbmcgdG8gfGZyYW1lSW5kZXh8IGFuZAorICAgICAqIGZlZWQgdGhlIHdvcmsgaW50byB8ZmlsbFdvcmt8IGZ1bmN0aW9uLiB8ZmlsbFdvcmt8IG11c3QgYmUKKyAgICAgKiAibm9uLWJsb2NraW5nIi4gT25jZSB8ZmlsbFdvcmt8IHJldHVybnMgdGhlIGZpbGxlZCB3b3JrIHdpbGwgYmUgcmV0dXJuZWQKKyAgICAgKiB0byB0aGUgY2xpZW50LgorICAgICAqCisgICAgICogXHBhcmFtW2luXSAgIGZyYW1lSW5kZXggICAgdGhlIGluZGV4IG9mIHRoZSBwZW5kaW5nIHdvcmsKKyAgICAgKiBccGFyYW1baW5dICAgZmlsbFdvcmsgICAgICB0aGUgZnVuY3Rpb24gdG8gZmlsbCB0aGUgcmV0cmlldmVkIHdvcmsuCisgICAgICovCisgICAgdm9pZCBmaW5pc2godWludDY0X3QgZnJhbWVJbmRleCwgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICYpPiBmaWxsV29yayk7CisKKyAgICAvKioKKyAgICAgKiBDbG9uZSBwZW5kaW5nIG9yIGN1cnJlbnQgd29yayBhbmQgc2VuZCB0aGUgd29yayBiYWNrIHRvIGNsaWVudC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0cmlldmUgYW5kIGNsb25lIHRoZSBwZW5kaW5nIG9yIGN1cnJlbnQgd29yayBhY2NvcmRpbmcKKyAgICAgKiB0byB8ZnJhbWVJbmRleHwgYW5kIGZlZWQgdGhlIHdvcmsgaW50byB8ZmlsbFdvcmt8IGZ1bmN0aW9uLiB8ZmlsbFdvcmt8CisgICAgICogbXVzdCBiZSAibm9uLWJsb2NraW5nIi4gT25jZSB8ZmlsbFdvcmt8IHJldHVybnMgdGhlIGZpbGxlZCB3b3JrIHdpbGwgYmUKKyAgICAgKiByZXR1cm5lZCB0byB0aGUgY2xpZW50LgorICAgICAqCisgICAgICogXHBhcmFtW2luXSAgIGZyYW1lSW5kZXggICAgdGhlIGluZGV4IG9mIHRoZSB3b3JrCisgICAgICogXHBhcmFtW2luXSAgIGN1cnJlbnRXb3JrICAgdGhlIGN1cnJlbnQgd29yayB1bmRlciBwcm9jZXNzaW5nCisgICAgICogXHBhcmFtW2luXSAgIGZpbGxXb3JrICAgICAgdGhlIGZ1bmN0aW9uIHRvIGZpbGwgdGhlIHJldHJpZXZlZCB3b3JrLgorICAgICAqLworICAgIHZvaWQgY2xvbmVBbmRTZW5kKAorICAgICAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZjdXJyZW50V29yaywKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmKT4gZmlsbFdvcmspOworCisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGNyZWF0ZUxpbmVhckJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2spOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjcmVhdGVMaW5lYXJCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGNyZWF0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jayk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGNyZWF0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaywKKyAgICAgICAgICAgIGNvbnN0IEMyUmVjdCAmY3JvcCk7CisKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IE5PX0RSQUlOID0gfjB1OworCisgICAgQzJSZWFkVmlldyBtRHVtbXlSZWFkVmlldzsKKworcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IG1JbnRmOworCisgICAgY2xhc3MgV29ya0hhbmRsZXIgOiBwdWJsaWMgQUhhbmRsZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgZW51bSB7CisgICAgICAgICAgICBrV2hhdFByb2Nlc3MsCisgICAgICAgICAgICBrV2hhdEluaXQsCisgICAgICAgICAgICBrV2hhdFN0YXJ0LAorICAgICAgICAgICAga1doYXRTdG9wLAorICAgICAgICAgICAga1doYXRSZXNldCwKKyAgICAgICAgICAgIGtXaGF0UmVsZWFzZSwKKyAgICAgICAgfTsKKworICAgICAgICBXb3JrSGFuZGxlcigpOworICAgICAgICB+V29ya0hhbmRsZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICAgICAgdm9pZCBzZXRDb21wb25lbnQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFNpbXBsZUMyQ29tcG9uZW50PiAmdGhpeik7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIG92ZXJyaWRlOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxTaW1wbGVDMkNvbXBvbmVudD4gbVRoaXo7CisgICAgICAgIGJvb2wgbVJ1bm5pbmc7CisgICAgfTsKKworICAgIGVudW0geworICAgICAgICBVTklOSVRJQUxJWkVELAorICAgICAgICBTVE9QUEVELAorICAgICAgICBSVU5OSU5HLAorICAgIH07CisKKyAgICBzdHJ1Y3QgRXhlY1N0YXRlIHsKKyAgICAgICAgRXhlY1N0YXRlKCkgOiBtU3RhdGUoVU5JTklUSUFMSVpFRCkge30KKworICAgICAgICBpbnQgbVN0YXRlOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgfTsKKyAgICBNdXRleGVkPEV4ZWNTdGF0ZT4gbUV4ZWNTdGF0ZTsKKworICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CisgICAgc3A8V29ya0hhbmRsZXI+IG1IYW5kbGVyOworCisgICAgY2xhc3MgV29ya1F1ZXVlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHR5cGVkZWYgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gUGVuZGluZ1dvcms7CisKKyAgICAgICAgaW5saW5lIFdvcmtRdWV1ZSgpIDogbUZsdXNoKGZhbHNlKSwgbUdlbmVyYXRpb24oMHVsKSB7fQorCisgICAgICAgIGlubGluZSB1aW50NjRfdCBnZW5lcmF0aW9uKCkgY29uc3QgeyByZXR1cm4gbUdlbmVyYXRpb247IH0KKyAgICAgICAgaW5saW5lIHZvaWQgaW5jR2VuZXJhdGlvbigpIHsgKyttR2VuZXJhdGlvbjsgbUZsdXNoID0gdHJ1ZTsgfQorCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHBvcF9mcm9udCgpOworICAgICAgICB2b2lkIHB1c2hfYmFjayhzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrKTsKKyAgICAgICAgYm9vbCBlbXB0eSgpIGNvbnN0OworICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUoKSBjb25zdDsKKyAgICAgICAgdm9pZCBtYXJrRHJhaW4odWludDMyX3QgZHJhaW5Nb2RlKTsKKyAgICAgICAgaW5saW5lIGJvb2wgcG9wUGVuZGluZ0ZsdXNoKCkgeworICAgICAgICAgICAgYm9vbCBmbHVzaCA9IG1GbHVzaDsKKyAgICAgICAgICAgIG1GbHVzaCA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIGZsdXNoOworICAgICAgICB9CisgICAgICAgIHZvaWQgY2xlYXIoKTsKKyAgICAgICAgUGVuZGluZ1dvcmsgJnBlbmRpbmcoKSB7IHJldHVybiBtUGVuZGluZ1dvcms7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0cnVjdCBFbnRyeSB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlOworICAgICAgICB9OworCisgICAgICAgIGJvb2wgbUZsdXNoOworICAgICAgICB1aW50NjRfdCBtR2VuZXJhdGlvbjsKKyAgICAgICAgc3RkOjpsaXN0PEVudHJ5PiBtUXVldWU7CisgICAgICAgIFBlbmRpbmdXb3JrIG1QZW5kaW5nV29yazsKKyAgICB9OworICAgIE11dGV4ZWQ8V29ya1F1ZXVlPiBtV29ya1F1ZXVlOworCisgICAgY2xhc3MgQmxvY2tpbmdCbG9ja1Bvb2w7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJsb2NraW5nQmxvY2tQb29sPiBtT3V0cHV0QmxvY2tQb29sOworCisgICAgU2ltcGxlQzJDb21wb25lbnQoKSA9IGRlbGV0ZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gU0lNUExFX0MyX0NPTVBPTkVOVF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9pbmNsdWRlL1NpbXBsZUMySW50ZXJmYWNlLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL2luY2x1ZGUvU2ltcGxlQzJJbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDUxZDNkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9pbmNsdWRlL1NpbXBsZUMySW50ZXJmYWNlLmgKQEAgLTAsMCArMSwyMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0lNUExFX0MyX0lOVEVSRkFDRV9IXworI2RlZmluZSBBTkRST0lEX1NJTVBMRV9DMl9JTlRFUkZBQ0VfSF8KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+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+Z2V0VHJhY2soaSk7CisgICAgICAgIGlmIChtZWRpYVNvdXJjZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNraXAgTlVMTCB0cmFjayAlenUsIHRvdGFsIHRyYWNrcyAlenUuXG4iLCBpLCBudW1UcmFja3MpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgcGxheWVyLnBsYXkobWVkaWFTb3VyY2UpOworICAgIH0KKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZWI1MWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMCBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9mbGFjZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsibGliRkxBQy1oZWFkZXJzIl0sCisKKyAgICBzcmNzOiBbIkMyU29mdEZsYWNEZWMuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZmxhY2RlYyIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9mbGFjZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRGbGFjRW5jLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliRkxBQyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMzliOWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNEZWMuY3BwCkBAIC0wLDAgKzEsMzc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRGbGFjRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRGbGFjRGVjLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmZsYWMuZGVjb2RlciI7CisKK30gIC8vIG5hbWVzcGFjZQorCitjbGFzcyBDMlNvZnRGbGFjRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTywKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoCisgICAgICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCA0NDEwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmluUmFuZ2UoMSwgNjU1MzUwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuaW5SYW5nZSgxLCA4KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQoMHUsIDc2ODAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoMSwgMjEwMDAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCAzMjc2OCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGNtRW5jb2RpbmdJbmZvLCBDMl9QQVJBTUtFWV9QQ01fRU5DT0RJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVBjbUVuY29kaW5nSW5mbzo6b3V0cHV0KDB1LCBDMkNvbmZpZzo6UENNXzE2KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1QY21FbmNvZGluZ0luZm8sIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UENNXzE2LAorICAgICAgICAgICAgICAgICAgICAgLy8gQzJDb25maWc6OlBDTV84LAorICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBDTV9GTE9BVH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptUGNtRW5jb2RpbmdJbmZvKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIGludDMyX3QgZ2V0UGNtRW5jb2RpbmdJbmZvKCkgY29uc3QgeyByZXR1cm4gbVBjbUVuY29kaW5nSW5mby0+dmFsdWU7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGNtRW5jb2RpbmdJbmZvOjpvdXRwdXQ+IG1QY21FbmNvZGluZ0luZm87Cit9OworCitDMlNvZnRGbGFjRGVjOjpDMlNvZnRGbGFjRGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1GTEFDRGVjb2RlcihudWxscHRyKSB7Cit9CisKK0MyU29mdEZsYWNEZWM6On5DMlNvZnRGbGFjRGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRGbGFjRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9OT19NRU1PUlk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEZsYWNEZWM6Om9uU3RvcCgpIHsKKyAgICBpZiAobUZMQUNEZWNvZGVyKSBtRkxBQ0RlY29kZXItPmZsdXNoKCk7CisgICAgbWVtc2V0KCZtU3RyZWFtSW5mbywgMCwgc2l6ZW9mKG1TdHJlYW1JbmZvKSk7CisgICAgbUhhc1N0cmVhbUluZm8gPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEZsYWNEZWM6Om9uUmVzZXQoKSB7CisgICAgbUlucHV0QnVmZmVyQ291bnQgPSAwOworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdEZsYWNEZWM6Om9uUmVsZWFzZSgpIHsKKyAgICBtSW5wdXRCdWZmZXJDb3VudCA9IDA7CisgICAgaWYgKG1GTEFDRGVjb2RlcikgZGVsZXRlIG1GTEFDRGVjb2RlcjsKKyAgICBtRkxBQ0RlY29kZXIgPSBudWxscHRyOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRGbGFjRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKworc3RhdHVzX3QgQzJTb2Z0RmxhY0RlYzo6aW5pdERlY29kZXIoKSB7CisgICAgaWYgKG1GTEFDRGVjb2RlcikgeworICAgICAgICBkZWxldGUgbUZMQUNEZWNvZGVyOworICAgIH0KKyAgICBtRkxBQ0RlY29kZXIgPSBGTEFDRGVjb2Rlcjo6Q3JlYXRlKCk7CisgICAgaWYgKCFtRkxBQ0RlY29kZXIpIHsKKyAgICAgICAgQUxPR0UoImluaXREZWNvZGVyOiBmYWlsZWQgdG8gY3JlYXRlIEZMQUNEZWNvZGVyIik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgbWVtc2V0KCZtU3RyZWFtSW5mbywgMCwgc2l6ZW9mKG1TdHJlYW1JbmZvKSk7CisgICAgbUhhc1N0cmVhbUluZm8gPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUlucHV0QnVmZmVyQ291bnQgPSAwOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0aWMgdm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKworLy8gKFRPRE8pIGFkZCBtdWx0aWZyYW1lIHN1cHBvcnQsIGluIHBsdWdpbiBhbmQgRkxBQ0RlY29kZXIuY3BwCit2b2lkIEMyU29mdEZsYWNEZWM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIGVvcyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisgICAgYm9vbCBjb2RlY0NvbmZpZyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMDsKKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLCBpblNpemUsCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKworICAgIGlmIChpblNpemUgPT0gMCkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAwICYmICFjb2RlY0NvbmZpZykgeworICAgICAgICBBTE9HVigiRmlyc3QgZnJhbWUgaGFzIHRvIGluY2x1ZGUgY29uZmlndXJhdGlvbiwgZm9yY2luZyBjb25maWciKTsKKyAgICAgICAgY29kZWNDb25maWcgPSB0cnVlOworICAgIH0KKworICAgIHVpbnQ4X3QgKmlucHV0ID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0KTsKKyAgICBpZiAoY29kZWNDb25maWcpIHsKKyAgICAgICAgc3RhdHVzX3QgZGVjb2RlckVyciA9IG1GTEFDRGVjb2Rlci0+cGFyc2VNZXRhZGF0YShpbnB1dCwgaW5TaXplKTsKKyAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gT0sgJiYgZGVjb2RlckVyciAhPSBXT1VMRF9CTE9DSykgeworICAgICAgICAgICAgQUxPR0UoInByb2Nlc3M6IEZMQUNEZWNvZGVyIHBhcnNlTWV0YURhdGEgcmV0dXJucyBlcnJvciAlZCIsIGRlY29kZXJFcnIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1JbnB1dEJ1ZmZlckNvdW50Kys7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZWNvZGVyRXJyID09IFdPVUxEX0JMT0NLKSB7CisgICAgICAgICAgICBBTE9HVigicHJvY2VzczogcGFyc2VNZXRhZGF0YSBpcyBCbG9ja2luZywgQ29udGludWUgJWQiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TdHJlYW1JbmZvID0gbUZMQUNEZWNvZGVyLT5nZXRTdHJlYW1JbmZvKCk7CisgICAgICAgICAgICBpZiAobVN0cmVhbUluZm8uc2FtcGxlX3JhdGUgJiYgbVN0cmVhbUluZm8ubWF4X2Jsb2Nrc2l6ZSAmJgorICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLmNoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgbUhhc1N0cmVhbUluZm8gPSB0cnVlOworICAgICAgICAgICAgICAgIEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCBzYW1wbGVSYXRlSW5mbygKKyAgICAgICAgICAgICAgICAgICAgMHUsIG1TdHJlYW1JbmZvLnNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgICAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCBjaGFubmVsQ291bnRJbmZvKAorICAgICAgICAgICAgICAgICAgICAwdSwgbVN0cmVhbUluZm8uY2hhbm5lbHMpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAgICAgICAgICBtSW50Zi0+Y29uZmlnKHsmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoc2FtcGxlUmF0ZUluZm8pKTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KGNoYW5uZWxDb3VudEluZm8pKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ29uZmlnIFVwZGF0ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR0QoInByb2Nlc3M6IGRlY29kZXIgY29uZmlndXJhdGlvbiA6ICVkIEh6LCAlZCBjaGFubmVscywgJWQgc2FtcGxlcywiCisgICAgICAgICAgICAgICAgICAiICVkIGJsb2NrIHNpemUiLCBtU3RyZWFtSW5mby5zYW1wbGVfcmF0ZSwgbVN0cmVhbUluZm8uY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAoaW50KW1TdHJlYW1JbmZvLnRvdGFsX3NhbXBsZXMsIG1TdHJlYW1JbmZvLm1heF9ibG9ja3NpemUpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBib29sIG91dHB1dEZsb2F0ID0gbUludGYtPmdldFBjbUVuY29kaW5nSW5mbygpID09IEMyQ29uZmlnOjpQQ01fRkxPQVQ7CisgICAgY29uc3Qgc2l6ZV90IHNhbXBsZVNpemUgPSBvdXRwdXRGbG9hdCA/IHNpemVvZihmbG9hdCkgOiBzaXplb2Yoc2hvcnQpOworICAgIHNpemVfdCBvdXRTaXplID0gbUhhc1N0cmVhbUluZm8gPworICAgICAgICAgICAgbVN0cmVhbUluZm8ubWF4X2Jsb2Nrc2l6ZSAqIG1TdHJlYW1JbmZvLmNoYW5uZWxzICogc2FtcGxlU2l6ZQorICAgICAgICAgIDoga01heEJsb2NrU2l6ZSAqIEZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHMgKiBzYW1wbGVTaXplOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKG91dFNpemUsIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBkZWNvZGVyRXJyID0gbUZMQUNEZWNvZGVyLT5kZWNvZGVPbmVGcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgaW5TaXplLCB3Vmlldy5kYXRhKCksICZvdXRTaXplLCBvdXRwdXRGbG9hdCk7CisgICAgaWYgKGRlY29kZXJFcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoInByb2Nlc3M6IEZMQUNEZWNvZGVyIGRlY29kZU9uZUZyYW1lIHJldHVybnMgZXJyb3IgJWQiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUlucHV0QnVmZmVyQ291bnQrKzsKKyAgICBBTE9HVigib3V0IGJ1ZmZlciBhdHRyLiBzaXplICV6dSIsIG91dFNpemUpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgMCwgb3V0U2l6ZSkpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RmxhY0RlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICBpZiAobUZMQUNEZWNvZGVyKSBtRkxBQ0RlY29kZXItPmZsdXNoKCk7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdEZsYWNEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0RmxhY0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRGbGFjRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRGbGFjRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEZsYWNEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRGbGFjRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0RmxhY0RlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEZsYWNEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ5MWJmZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0RlYy5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9GTEFDX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfRkxBQ19ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJGTEFDRGVjb2Rlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRGbGFjRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEZsYWNEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRGbGFjRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTWF4QmxvY2tTaXplICAgPSA0MDk2CisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgRkxBQ0RlY29kZXIgKm1GTEFDRGVjb2RlcjsKKyAgICBGTEFDX19TdHJlYW1NZXRhZGF0YV9TdHJlYW1JbmZvIG1TdHJlYW1JbmZvOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1IYXNTdHJlYW1JbmZvOworICAgIHNpemVfdCBtSW5wdXRCdWZmZXJDb3VudDsKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRGbGFjRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0ZMQUNfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDhkYjdlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRW5jLmNwcApAQCAtMCwwICsxLDQ5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0RmxhY0VuYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdEZsYWNFbmMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuZmxhYy5lbmNvZGVyIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK2NsYXNzIEMyU29mdEZsYWNFbmM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPLAorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOworICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZygKKyAgICAgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQoMHUsIDQ0MTAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuaW5SYW5nZSgxLCA2NTUzNTApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86OmlucHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5pblJhbmdlKDEsIDIpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0KDB1LCA3NjgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDEsIDIxMDAwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbXBsZXhpdHksIEMyX1BBUkFNS0VZX0NPTVBMRVhJVFkpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbXBsZXhpdHlUdW5pbmc6Om91dHB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgRkxBQ19DT01QUkVTU0lPTl9MRVZFTF9ERUZBVUxUKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1Db21wbGV4aXR5LCB2YWx1ZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgRkxBQ19DT01QUkVTU0lPTl9MRVZFTF9NSU4sIEZMQUNfQ09NUFJFU1NJT05fTEVWRUxfTUFYKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ29tcGxleGl0eSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDQ2MDgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVBjbUVuY29kaW5nSW5mbywgQzJfUEFSQU1LRVlfUENNX0VOQ09ESU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QY21FbmNvZGluZ0luZm86OmlucHV0KDB1LCBDMkNvbmZpZzo6UENNXzE2KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1QY21FbmNvZGluZ0luZm8sIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UENNXzE2LAorICAgICAgICAgICAgICAgICAgICAgLy8gQzJDb25maWc6OlBDTV84LAorICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBDTV9GTE9BVH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptUGNtRW5jb2RpbmdJbmZvKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHVpbnQzMl90IGdldFNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtU2FtcGxlUmF0ZS0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRDaGFubmVsQ291bnQoKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbENvdW50LT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldEJpdHJhdGUoKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZS0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRDb21wbGV4aXR5KCkgY29uc3QgeyByZXR1cm4gbUNvbXBsZXhpdHktPnZhbHVlOyB9CisgICAgaW50MzJfdCBnZXRQY21FbmNvZGluZ0luZm8oKSBjb25zdCB7IHJldHVybiBtUGNtRW5jb2RpbmdJbmZvLT52YWx1ZTsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29tcGxleGl0eVR1bmluZzo6b3V0cHV0PiBtQ29tcGxleGl0eTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGNtRW5jb2RpbmdJbmZvOjppbnB1dD4gbVBjbUVuY29kaW5nSW5mbzsKK307CisKK0MyU29mdEZsYWNFbmM6OkMyU29mdEZsYWNFbmMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUZsYWNTdHJlYW1FbmNvZGVyKG51bGxwdHIpLAorICAgICAgbUlucHV0QnVmZmVyUGNtMzIobnVsbHB0cikgeworfQorCitDMlNvZnRGbGFjRW5jOjp+QzJTb2Z0RmxhY0VuYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RmxhY0VuYzo6b25Jbml0KCkgeworICAgIG1GbGFjU3RyZWFtRW5jb2RlciA9IEZMQUNfX3N0cmVhbV9lbmNvZGVyX25ldygpOworICAgIGlmICghbUZsYWNTdHJlYW1FbmNvZGVyKSByZXR1cm4gQzJfQ09SUlVQVEVEOworCisgICAgbUlucHV0QnVmZmVyUGNtMzIgPSAoRkxBQ19faW50MzIqKSBtYWxsb2MoCisgICAgICAgICAgICBrSW5CbG9ja1NpemUgKiBrTWF4TnVtQ2hhbm5lbHMgKiBzaXplb2YoRkxBQ19faW50MzIpKTsKKyAgICBpZiAoIW1JbnB1dEJ1ZmZlclBjbTMyKSByZXR1cm4gQzJfTk9fTUVNT1JZOworCisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1Jc0ZpcnN0RnJhbWUgPSB0cnVlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwdWxsOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMHU7CisgICAgbUVuY29kZXJXcml0ZURhdGEgPSBmYWxzZTsKKyAgICBtRW5jb2RlclJldHVybmVkTmJCeXRlcyA9IDA7CisgICAgbUhlYWRlck9mZnNldCA9IDA7CisgICAgbVdyb3RlSGVhZGVyID0gZmFsc2U7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBjb25maWd1cmVFbmNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCit2b2lkIEMyU29mdEZsYWNFbmM6Om9uUmVsZWFzZSgpIHsKKyAgICBpZiAobUZsYWNTdHJlYW1FbmNvZGVyKSB7CisgICAgICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX2RlbGV0ZShtRmxhY1N0cmVhbUVuY29kZXIpOworICAgICAgICBtRmxhY1N0cmVhbUVuY29kZXIgPSBudWxscHRyOworICAgIH0KKworICAgIGlmIChtSW5wdXRCdWZmZXJQY20zMikgeworICAgICAgICBmcmVlKG1JbnB1dEJ1ZmZlclBjbTMyKTsKKyAgICAgICAgbUlucHV0QnVmZmVyUGNtMzIgPSBudWxscHRyOworICAgIH0KK30KKwordm9pZCBDMlNvZnRGbGFjRW5jOjpvblJlc2V0KCkgeworICAgICh2b2lkKSBvblN0b3AoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RmxhY0VuYzo6b25TdG9wKCkgeworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtSXNGaXJzdEZyYW1lID0gdHJ1ZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMHVsbDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDB1OworICAgIG1FbmNvZGVyV3JpdGVEYXRhID0gZmFsc2U7CisgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgPSAwOworICAgIG1IZWFkZXJPZmZzZXQgPSAwOworICAgIG1Xcm90ZUhlYWRlciA9IGZhbHNlOworCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gZHJhaW4oRFJBSU5fQ09NUE9ORU5UX05PX0VPUywgbnVsbHB0cik7CisgICAgaWYgKEMyX09LICE9IHN0YXR1cykgcmV0dXJuIHN0YXR1czsKKworICAgIHN0YXR1c190IGVyciA9IGNvbmZpZ3VyZUVuY29kZXIoKTsKKyAgICBpZiAoZXJyICE9IE9LKSBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RmxhY0VuYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKK30KKwordm9pZCBDMlNvZnRGbGFjRW5jOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksIHdvcmstPmlucHV0LmZsYWdzKTsKKyAgICBpZiAobUlzRmlyc3RGcmFtZSAmJiBpblNpemUpIHsKKyAgICAgICAgbUFuY2hvclRpbWVTdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1bGwoKTsKKyAgICAgICAgbUlzRmlyc3RGcmFtZSA9IGZhbHNlOworICAgIH0KKworICAgIGlmICghbVdyb3RlSGVhZGVyKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0PiBjc2QgPQorICAgICAgICAgICAgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dDo6QWxsb2NVbmlxdWUobUhlYWRlck9mZnNldCwgMHUpOworICAgICAgICBpZiAoIWNzZCkgeworICAgICAgICAgICAgQUxPR0UoIkNTRCBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoY3NkLT5tLnZhbHVlLCBtSGVhZGVyLCBtSGVhZGVyT2Zmc2V0KTsKKyAgICAgICAgQUxPR1YoInB1dCBjc2QsICVkIGJ5dGVzIiwgbUhlYWRlck9mZnNldCk7CisKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soc3RkOjptb3ZlKGNzZCkpOworICAgICAgICBtV3JvdGVIZWFkZXIgPSB0cnVlOworICAgIH0KKworICAgIGNvbnN0IHVpbnQzMl90IHNhbXBsZVJhdGUgPSBtSW50Zi0+Z2V0U2FtcGxlUmF0ZSgpOworICAgIGNvbnN0IHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IG1JbnRmLT5nZXRDaGFubmVsQ291bnQoKTsKKyAgICBjb25zdCBib29sIGlucHV0RmxvYXQgPSBtSW50Zi0+Z2V0UGNtRW5jb2RpbmdJbmZvKCkgPT0gQzJDb25maWc6OlBDTV9GTE9BVDsKKyAgICBjb25zdCB1bnNpZ25lZCBzYW1wbGVTaXplID0gaW5wdXRGbG9hdCA/IHNpemVvZihmbG9hdCkgOiBzaXplb2YoaW50MTZfdCk7CisgICAgY29uc3QgdW5zaWduZWQgZnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogc2FtcGxlU2l6ZTsKKyAgICBjb25zdCB1aW50NjRfdCBvdXRUaW1lU3RhbXAgPSBtUHJvY2Vzc2VkU2FtcGxlcyAqIDEwMDAwMDBsbCAvIHNhbXBsZVJhdGU7CisKKyAgICBzaXplX3Qgb3V0Q2FwYWNpdHkgPSBpblNpemU7CisgICAgb3V0Q2FwYWNpdHkgKz0gbUJsb2NrU2l6ZSAqIGZyYW1lU2l6ZTsKKworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKG91dENhcGFjaXR5LCB1c2FnZSwgJm1PdXRwdXRCbG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IG1PdXRwdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtRW5jb2RlcldyaXRlRGF0YSA9IHRydWU7CisgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgPSAwOworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluUHRyID0gclZpZXcuZGF0YSgpICsgaW5PZmZzZXQ7CisgICAgICAgIGNvbnN0IHNpemVfdCBwcm9jZXNzU2l6ZSA9IE1JTihrSW5CbG9ja1NpemUgKiBmcmFtZVNpemUsIChpblNpemUgLSBpblBvcykpOworICAgICAgICBjb25zdCB1bnNpZ25lZCBuYklucHV0RnJhbWVzID0gcHJvY2Vzc1NpemUgLyBmcmFtZVNpemU7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIG5iSW5wdXRTYW1wbGVzID0gcHJvY2Vzc1NpemUgLyBzYW1wbGVTaXplOworCisgICAgICAgIEFMT0dWKCJhYm91dCB0byBlbmNvZGUgJXp1IGJ5dGVzIiwgcHJvY2Vzc1NpemUpOworICAgICAgICBpZiAoaW5wdXRGbG9hdCkgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgKiBjb25zdCBwY21GbG9hdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQgKj4oaW5QdHIgKyBpblBvcyk7CisgICAgICAgICAgICBtZW1jcHlfdG9fcThfMjNfZnJvbV9mbG9hdF93aXRoX2NsYW1wKG1JbnB1dEJ1ZmZlclBjbTMyLCBwY21GbG9hdCwgbmJJbnB1dFNhbXBsZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqIGNvbnN0IHBjbTE2ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQxNl90ICo+KGluUHRyICsgaW5Qb3MpOworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5iSW5wdXRTYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXJQY20zMltpXSA9IChGTEFDX19pbnQzMikgcGNtMTZbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBGTEFDX19ib29sIG9rID0gRkxBQ19fc3RyZWFtX2VuY29kZXJfcHJvY2Vzc19pbnRlcmxlYXZlZCgKKyAgICAgICAgICAgICAgICBtRmxhY1N0cmVhbUVuY29kZXIsIG1JbnB1dEJ1ZmZlclBjbTMyLCBuYklucHV0RnJhbWVzKTsKKyAgICAgICAgaWYgKCFvaykgeworICAgICAgICAgICAgQUxPR0UoImVycm9yIGVuY291bnRlcmVkIGR1cmluZyBlbmNvZGluZyIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIG1PdXRwdXRCbG9jay5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGluUG9zICs9IHByb2Nlc3NTaXplOworICAgIH0KKyAgICBpZiAoZW9zICYmIChDMl9PSyAhPSBkcmFpbihEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsIHBvb2wpKSkgeworICAgICAgICBBTE9HRSgiZXJyb3IgZW5jb3VudGVyZWQgZHVyaW5nIGVuY29kaW5nIik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgbU91dHB1dEJsb2NrLnJlc2V0KCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICBpZiAobUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgIT0gMCkgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGNyZWF0ZUxpbmVhckJ1ZmZlcihzdGQ6Om1vdmUobU91dHB1dEJsb2NrKSwgMCwgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wID0gbUFuY2hvclRpbWVTdGFtcCArIG91dFRpbWVTdGFtcDsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiZW5jb2RlciBwcm9jZXNzX2ludGVybGVhdmVkIHJldHVybmVkIHdpdGhvdXQgZGF0YSB0byB3cml0ZSIpOworICAgIH0KKyAgICBtT3V0cHV0QmxvY2sgPSBudWxscHRyOworICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgfQorICAgIG1FbmNvZGVyV3JpdGVEYXRhID0gZmFsc2U7CisgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgPSAwOworfQorCitGTEFDX19TdHJlYW1FbmNvZGVyV3JpdGVTdGF0dXMgQzJTb2Z0RmxhY0VuYzo6b25FbmNvZGVkRmxhY0F2YWlsYWJsZSgKKyAgICAgICAgY29uc3QgRkxBQ19fYnl0ZSBidWZmZXJbXSwgc2l6ZV90IGJ5dGVzLCB1bnNpZ25lZCBzYW1wbGVzLAorICAgICAgICB1bnNpZ25lZCBjdXJyZW50X2ZyYW1lKSB7CisgICAgKHZvaWQpIGN1cnJlbnRfZnJhbWU7CisgICAgQUxPR1YoIiVzIChieXRlcz0lenUsIHNhbXBsZXM9JXUsIGN1cnJfZnJhbWU9JXUpIiwgX19mdW5jX18sIGJ5dGVzLCBzYW1wbGVzLAorICAgICAgICAgIGN1cnJlbnRfZnJhbWUpOworCisgICAgaWYgKHNhbXBsZXMgPT0gMCkgeworICAgICAgICBBTE9HSSgic2F2aW5nICV6dSBieXRlcyBvZiBoZWFkZXIiLCBieXRlcyk7CisgICAgICAgIG1lbWNweShtSGVhZGVyICsgbUhlYWRlck9mZnNldCwgYnVmZmVyLCBieXRlcyk7CisgICAgICAgIG1IZWFkZXJPZmZzZXQgKz0gYnl0ZXM7Ly8gd2lsbCBjb250YWluIGhlYWRlciBzaXplIHdoZW4gZmluaXNoZWQgcmVjZWl2aW5nIGhlYWRlcgorICAgICAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0VOQ09ERVJfV1JJVEVfU1RBVFVTX09LOworICAgIH0KKworICAgIGlmICgoc2FtcGxlcyA9PSAwKSB8fCAhbUVuY29kZXJXcml0ZURhdGEpIHsKKyAgICAgICAgLy8gY2FsbGVkIGJ5IHRoZSBlbmNvZGVyIGJlY2F1c2UgdGhlcmUncyBoZWFkZXIgZGF0YSB0byBzYXZlLCBidXQgaXQncyBub3QgdGhlIHJvbGUKKyAgICAgICAgLy8gb2YgdGhpcyBjb21wb25lbnQgKHVubGVzcyBXUklURV9GTEFDX0hFQURFUl9JTl9GSVJTVF9CVUZGRVIgaXMgZGVmaW5lZCkKKyAgICAgICAgQUxPR1YoImlnbm9yaW5nICV6dSBieXRlcyBvZiBoZWFkZXIgZGF0YSAoc2FtcGxlcz0lZCkiLCBieXRlcywgc2FtcGxlcyk7CisgICAgICAgIHJldHVybiBGTEFDX19TVFJFQU1fRU5DT0RFUl9XUklURV9TVEFUVVNfT0s7CisgICAgfQorCisgICAgLy8gd3JpdGUgZW5jb2RlZCBkYXRhCisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBtT3V0cHV0QmxvY2stPm1hcCgpLmdldCgpOworICAgIHVpbnQ4X3QqIG91dERhdGEgPSB3Vmlldy5kYXRhKCk7CisgICAgQUxPR1YoIndyaXRpbmcgJXp1IGJ5dGVzIG9mIGVuY29kZWQgZGF0YSBvbiBvdXRwdXQiLCBieXRlcyk7CisgICAgLy8gaW5jcmVtZW50IG1Qcm9jZXNzZWRTYW1wbGVzIHRvIG1haW50YWluIGF1ZGlvIHN5bmNocm9uaXphdGlvbiBkdXJpbmcKKyAgICAvLyBwbGF5IGJhY2sKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyArPSBzYW1wbGVzOworICAgIGlmIChieXRlcyArIG1FbmNvZGVyUmV0dXJuZWROYkJ5dGVzID4gbU91dHB1dEJsb2NrLT5jYXBhY2l0eSgpKSB7CisgICAgICAgIEFMT0dFKCJub3QgZW5vdWdoIHNwYWNlIGxlZnQgdG8gd3JpdGUgZW5jb2RlZCBkYXRhLCBkcm9wcGluZyAlenUgYnl0ZXMiLCBieXRlcyk7CisgICAgICAgIC8vIGEgZmF0YWwgZXJyb3Igd291bGQgc3RvcCB0aGUgZW5jb2RpbmcKKyAgICAgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9FTkNPREVSX1dSSVRFX1NUQVRVU19PSzsKKyAgICB9CisgICAgbWVtY3B5KG91dERhdGEgKyBtRW5jb2RlclJldHVybmVkTmJCeXRlcywgYnVmZmVyLCBieXRlcyk7CisgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgKz0gYnl0ZXM7CisgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9FTkNPREVSX1dSSVRFX1NUQVRVU19PSzsKK30KKworCitzdGF0dXNfdCBDMlNvZnRGbGFjRW5jOjpjb25maWd1cmVFbmNvZGVyKCkgeworICAgIEFMT0dWKCIlcyBudW1DaGFubmVsPSVkLCBzYW1wbGVSYXRlPSVkIiwgX19mdW5jX18sIG1JbnRmLT5nZXRDaGFubmVsQ291bnQoKSwgbUludGYtPmdldFNhbXBsZVJhdGUoKSk7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8ICFtRmxhY1N0cmVhbUVuY29kZXIpIHsKKyAgICAgICAgQUxPR0UoImNhbid0IGNvbmZpZ3VyZSBlbmNvZGVyOiBubyBlbmNvZGVyIG9yIGludmFsaWQgc3RhdGUiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgY29uc3QgYm9vbCBpbnB1dEZsb2F0ID0gbUludGYtPmdldFBjbUVuY29kaW5nSW5mbygpID09IEMyQ29uZmlnOjpQQ01fRkxPQVQ7CisgICAgY29uc3QgaW50IGJpdHNQZXJTYW1wbGUgPSBpbnB1dEZsb2F0ID8gMjQgOiAxNjsKKyAgICBGTEFDX19ib29sIG9rID0gdHJ1ZTsKKyAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9jaGFubmVscyhtRmxhY1N0cmVhbUVuY29kZXIsIG1JbnRmLT5nZXRDaGFubmVsQ291bnQoKSk7CisgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfc2FtcGxlX3JhdGUobUZsYWNTdHJlYW1FbmNvZGVyLCBtSW50Zi0+Z2V0U2FtcGxlUmF0ZSgpKTsKKyAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9iaXRzX3Blcl9zYW1wbGUobUZsYWNTdHJlYW1FbmNvZGVyLCBiaXRzUGVyU2FtcGxlKTsKKyAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9jb21wcmVzc2lvbl9sZXZlbChtRmxhY1N0cmVhbUVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgIG1JbnRmLT5nZXRDb21wbGV4aXR5KCkpOworICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X3ZlcmlmeShtRmxhY1N0cmVhbUVuY29kZXIsIGZhbHNlKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIEFMT0dFKCJ1bmtub3duIGVycm9yIHdoZW4gY29uZmlndXJpbmcgZW5jb2RlciIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBvayAmPSBGTEFDX19TVFJFQU1fRU5DT0RFUl9JTklUX1NUQVRVU19PSyA9PQorICAgICAgICAgICAgRkxBQ19fc3RyZWFtX2VuY29kZXJfaW5pdF9zdHJlYW0obUZsYWNTdHJlYW1FbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICBmbGFjRW5jb2RlcldyaXRlQ2FsbGJhY2sgICAgLyp3cml0ZV9jYWxsYmFjayovLAorICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qc2Vla19jYWxsYmFjayovLAorICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qdGVsbF9jYWxsYmFjayovLAorICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qbWV0YWRhdGFfY2FsbGJhY2sqLywKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgdGhpcyAvKmNsaWVudF9kYXRhKi8pOworCisgICAgaWYgKCFvaykgeworICAgICAgICBBTE9HRSgidW5rbm93biBlcnJvciB3aGVuIGNvbmZpZ3VyaW5nIGVuY29kZXIiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgbUJsb2NrU2l6ZSA9IEZMQUNfX3N0cmVhbV9lbmNvZGVyX2dldF9ibG9ja3NpemUobUZsYWNTdHJlYW1FbmNvZGVyKTsKKworICAgIEFMT0dWKCJlbmNvZGVyIHN1Y2Nlc3NmdWxseSBjb25maWd1cmVkIik7CisgICAgcmV0dXJuIE9LOworfQorCitGTEFDX19TdHJlYW1FbmNvZGVyV3JpdGVTdGF0dXMgQzJTb2Z0RmxhY0VuYzo6ZmxhY0VuY29kZXJXcml0ZUNhbGxiYWNrKAorICAgICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRW5jb2RlciAqLAorICAgICAgICAgICAgY29uc3QgRkxBQ19fYnl0ZSBidWZmZXJbXSwKKyAgICAgICAgICAgIHNpemVfdCBieXRlcywKKyAgICAgICAgICAgIHVuc2lnbmVkIHNhbXBsZXMsCisgICAgICAgICAgICB1bnNpZ25lZCBjdXJyZW50X2ZyYW1lLAorICAgICAgICAgICAgdm9pZCAqY2xpZW50X2RhdGEpIHsKKyAgICByZXR1cm4gKChDMlNvZnRGbGFjRW5jKikgY2xpZW50X2RhdGEpLT5vbkVuY29kZWRGbGFjQXZhaWxhYmxlKAorICAgICAgICAgICAgYnVmZmVyLCBieXRlcywgc2FtcGxlcywgY3VycmVudF9mcmFtZSk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEZsYWNFbmM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZCkgcG9vbDsKKyAgICBzd2l0Y2ggKGRyYWluTW9kZSkgeworICAgICAgICBjYXNlIE5PX0RSQUlOOgorICAgICAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgIGNhc2UgRFJBSU5fQ0hBSU46CisgICAgICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgICAgIGNhc2UgRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TOgorICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBmbGFnIGlzIG5vdCBiZWluZyBzZW50IGJhY2sgdG8gdGhlIGNsaWVudAorICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGVyZSBhcmUgbm8gaXRlbXMgaW4gUGVuZGluZ1dvcmsgcXVldWUgYXMgYWxsIHRoZQorICAgICAgICAgICAgLy8gaW5wdXRzIGFyZSBiZWluZyBzZW50IGJhY2sgd2l0aCBlbXB0eXdvcmsgb3IgdmFsaWQgZW5jb2RlZCBkYXRhCisgICAgICAgICAgICAvLyBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgY2FzZSBEUkFJTl9DT01QT05FTlRfTk9fRU9TOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKyAgICBGTEFDX19ib29sIG9rID0gRkxBQ19fc3RyZWFtX2VuY29kZXJfZmluaXNoKG1GbGFjU3RyZWFtRW5jb2Rlcik7CisgICAgaWYgKCFvaykgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICBtSXNGaXJzdEZyYW1lID0gdHJ1ZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMHVsbDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDB1OworCisgICAgcmV0dXJuIEMyX09LOworfQorCitjbGFzcyBDMlNvZnRGbGFjRW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEZsYWNFbmNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0RmxhY0VuYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEZsYWNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0RmxhY0VuYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEZsYWNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRGbGFjRW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEZsYWNFbmNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0VuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNmMDFkNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0VuYy5oCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9GTEFDX0VOQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfRkxBQ19FTkNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJGTEFDL3N0cmVhbV9lbmNvZGVyLmgiCisKKyNkZWZpbmUgRkxBQ19DT01QUkVTU0lPTl9MRVZFTF9NSU4gICAgIDAKKyNkZWZpbmUgRkxBQ19DT01QUkVTU0lPTl9MRVZFTF9ERUZBVUxUIDUKKyNkZWZpbmUgRkxBQ19DT01QUkVTU0lPTl9MRVZFTF9NQVggICAgIDgKKworI2RlZmluZSBGTEFDX0hFQURFUl9TSVpFICAgICAgICAgICAgICAgMTI4CisKKyNkZWZpbmUgTUlOKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDMlNvZnRGbGFjRW5jIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKK3B1YmxpYzoKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEZsYWNFbmMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0RmxhY0VuYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdGF0dXNfdCBjb25maWd1cmVFbmNvZGVyKCk7CisgICAgc3RhdGljIEZMQUNfX1N0cmVhbUVuY29kZXJXcml0ZVN0YXR1cyBmbGFjRW5jb2RlcldyaXRlQ2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1FbmNvZGVyICplbmNvZGVyLCBjb25zdCBGTEFDX19ieXRlIGJ1ZmZlcltdLAorICAgICAgICAgICAgc2l6ZV90IGJ5dGVzLCB1bnNpZ25lZCBzYW1wbGVzLCB1bnNpZ25lZCBjdXJyZW50X2ZyYW1lLAorICAgICAgICAgICAgdm9pZCAqY2xpZW50X2RhdGEpOworICAgIEZMQUNfX1N0cmVhbUVuY29kZXJXcml0ZVN0YXR1cyBvbkVuY29kZWRGbGFjQXZhaWxhYmxlKAorICAgICAgICAgICAgY29uc3QgRkxBQ19fYnl0ZSBidWZmZXJbXSwgc2l6ZV90IGJ5dGVzLCB1bnNpZ25lZCBzYW1wbGVzLAorICAgICAgICAgICAgdW5zaWduZWQgY3VycmVudF9mcmFtZSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIGNvbnN0IHVuc2lnbmVkIGludCBrSW5CbG9ja1NpemUgPSAxMTUyOworICAgIGNvbnN0IHVuc2lnbmVkIGludCBrTWF4TnVtQ2hhbm5lbHMgPSAyOworICAgIEZMQUNfX1N0cmVhbUVuY29kZXIqIG1GbGFjU3RyZWFtRW5jb2RlcjsKKyAgICBGTEFDX19pbnQzMiogbUlucHV0QnVmZmVyUGNtMzI7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IG1PdXRwdXRCbG9jazsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgdWludDMyX3QgbUJsb2NrU2l6ZTsKKyAgICBib29sIG1Jc0ZpcnN0RnJhbWU7CisgICAgdWludDY0X3QgbUFuY2hvclRpbWVTdGFtcDsKKyAgICB1aW50NjRfdCBtUHJvY2Vzc2VkU2FtcGxlczsKKyAgICAvLyBzaG91bGQgdGhlIGRhdGEgcmVjZWl2ZWQgYnkgdGhlIGNhbGxiYWNrIGJlIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBwb3J0CisgICAgYm9vbCBtRW5jb2RlcldyaXRlRGF0YTsKKyAgICBzaXplX3QgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXM7CisgICAgdW5zaWduZWQgbUhlYWRlck9mZnNldDsKKyAgICBib29sIG1Xcm90ZUhlYWRlcjsKKyAgICBjaGFyIG1IZWFkZXJbRkxBQ19IRUFERVJfU0laRV07CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRGbGFjRW5jKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0ZMQUNfRU5DX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb21tb25fdGltZS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvY29tbW9uX3RpbWUvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpjb3B5IHRvIG1lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29tbW9uX3RpbWUvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9OT1RJQ0UKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9jb21tb25fdGltZS9OT1RJQ0UKY29weSB0byBtZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL05PVElDRQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZGU2OGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyMyBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9nNzExYWxhd2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0RzcxMURlYy5jcHAiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURBTEFXIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2c3MTFtbGF3ZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRHNzExRGVjLmNwcCJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNiODQzYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5jcHAKQEAgLTAsMCArMSwzMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEc3MTFEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdEc3MTFEZWMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCisjaWZkZWYgQUxBVworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmc3MTEuYWxhdy5kZWNvZGVyIjsKKyNlbHNlCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuZzcxMS5tbGF3LmRlY29kZXIiOworI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZQorCitjbGFzcyBDMlNvZnRHNzExRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTywKKyNpZmRlZiBBTEFXCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXCisjZWxzZQorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVworI2VuZGlmCisgICAgICAgICAgICAgICAgKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoCisgICAgICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCA4MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuaW5SYW5nZSg4MDAwLCA0ODAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmVxdWFsVG8oMSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmVxdWFsVG8oNjQwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA4MTkyKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKK307CisKK0MyU29mdEc3MTFEZWM6OkMyU29mdEc3MTFEZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpIHsKK30KKworQzJTb2Z0RzcxMURlYzo6fkMyU29mdEc3MTFEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEc3MTFEZWM6Om9uSW5pdCgpIHsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRHNzExRGVjOjpvblN0b3AoKSB7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRHNzExRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdEc3MTFEZWM6Om9uUmVsZWFzZSgpIHsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RzcxMURlYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0RzcxMURlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIGVvcyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisgICAgaW50IG91dFNpemUgPSBpblNpemUgKiBzaXplb2YoaW50MTZfdCk7CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkIiwgaW5TaXplLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisKKyAgICBpZiAoaW5TaXplID09IDApIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50OF90ICppbnB1dHB0ciA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihyVmlldy5kYXRhKCkgKyBpbk9mZnNldCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sob3V0U2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQxNl90ICpvdXRwdXRwdHIgPSByZWludGVycHJldF9jYXN0PGludDE2X3QgKj4od1ZpZXcuZGF0YSgpKTsKKworI2lmZGVmIEFMQVcKKyAgICBEZWNvZGVBTGF3KG91dHB1dHB0ciwgaW5wdXRwdHIsIGluU2l6ZSk7CisjZWxzZQorICAgIERlY29kZU1MYXcob3V0cHV0cHRyLCBpbnB1dHB0ciwgaW5TaXplKTsKKyNlbmRpZgorCisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrKSk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworCisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEc3MTFEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZCkgcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCisjaWZkZWYgQUxBVwordm9pZCBDMlNvZnRHNzExRGVjOjpEZWNvZGVBTGF3KAorICAgICAgICBpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKSB7CisgICAgd2hpbGUgKGluU2l6ZSA+IDApIHsKKyAgICAgICAgaW5TaXplLS07CisgICAgICAgIGludDMyX3QgeCA9ICppbisrOworCisgICAgICAgIGludDMyX3QgaXggPSB4IF4gMHg1NTsKKyAgICAgICAgaXggJj0gMHg3ZjsKKworICAgICAgICBpbnQzMl90IGlleHAgPSBpeCA+PiA0OworICAgICAgICBpbnQzMl90IG1hbnQgPSBpeCAmIDB4MGY7CisKKyAgICAgICAgaWYgKGlleHAgPiAwKSB7CisgICAgICAgICAgICBtYW50ICs9IDE2OworICAgICAgICB9CisKKyAgICAgICAgbWFudCA9IChtYW50IDw8IDQpICsgODsKKworICAgICAgICBpZiAoaWV4cCA+IDEpIHsKKyAgICAgICAgICAgIG1hbnQgPSBtYW50IDw8IChpZXhwIC0gMSk7CisgICAgICAgIH0KKworICAgICAgICAqb3V0KysgPSAoeCA+IDEyNykgPyBtYW50IDogLW1hbnQ7CisgICAgfQorfQorI2Vsc2UKK3ZvaWQgQzJTb2Z0RzcxMURlYzo6RGVjb2RlTUxhdygKKyAgICAgICAgaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSkgeworICAgIHdoaWxlIChpblNpemUgPiAwKSB7CisgICAgICAgIGluU2l6ZS0tOworICAgICAgICBpbnQzMl90IHggPSAqaW4rKzsKKworICAgICAgICBpbnQzMl90IG1hbnRpc3NhID0gfng7CisgICAgICAgIGludDMyX3QgZXhwb25lbnQgPSAobWFudGlzc2EgPj4gNCkgJiA3OworICAgICAgICBpbnQzMl90IHNlZ21lbnQgPSBleHBvbmVudCArIDE7CisgICAgICAgIG1hbnRpc3NhICY9IDB4MGY7CisKKyAgICAgICAgaW50MzJfdCBzdGVwID0gNCA8PCBzZWdtZW50OworCisgICAgICAgIGludDMyX3QgYWJzID0gKDB4ODBsIDw8IGV4cG9uZW50KSArIHN0ZXAgKiBtYW50aXNzYSArIHN0ZXAgLyAyIC0gNCAqIDMzOworCisgICAgICAgICpvdXQrKyA9ICh4IDwgMHg4MCkgPyAtYWJzIDogYWJzOworICAgIH0KK30KKyNlbmRpZgorCitjbGFzcyBDMlNvZnRHNzExRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEc3MTFEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0RzcxMURlYyhDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRHNzExRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0RzcxMURlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEc3MTFEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRHNzExRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0RzcxMURlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2U4ZmZjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0c3MTFfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9HNzExX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRHNzExRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEc3MTFEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdEc3MTFEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7Citwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworCisjaWZkZWYgQUxBVworICAgIHZvaWQgRGVjb2RlQUxhdyhpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKTsKKyNlbHNlCisgICAgdm9pZCBEZWNvZGVNTGF3KGludDE2X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpblNpemUpOworI2VuZGlmCisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRHNzExRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0c3MTFfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb21tb25fdGltZS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvY29tbW9uX3RpbWUvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpjb3B5IHRvIG1lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29tbW9uX3RpbWUvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9OT1RJQ0UKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9jb21tb25fdGltZS9OT1RJQ0UKY29weSB0byBtZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL05PVElDRQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzMwYzAxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMSBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9nc21kZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEdzbURlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYmdzbSJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0MyU29mdEdzbURlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQzJTb2Z0R3NtRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODdjZmM2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0MyU29mdEdzbURlYy5jcHAKQEAgLTAsMCArMSwzMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEdzbURlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0R3NtRGVjLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmdzbS5kZWNvZGVyIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK2NsYXNzIEMyU29mdEdzbURlYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fQVVESU8sCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fTVNHU00pIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOworICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZygKKyAgICAgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5lcXVhbFRvKDgwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5lcXVhbFRvKDEpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dCgwdSwgMTMyMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5lcXVhbFRvKDEzMjAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMTAyNCAvIE1TR1NNX0lOX0ZSTV9TWiAqIE1TR1NNX0lOX0ZSTV9TWikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRHc21EZWM6OkMyU29mdEdzbURlYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KAorICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUdzbShudWxscHRyKSB7Cit9CisKK0MyU29mdEdzbURlYzo6fkMyU29mdEdzbURlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0R3NtRGVjOjpvbkluaXQoKSB7CisgICAgaWYgKCFtR3NtKSBtR3NtID0gZ3NtX2NyZWF0ZSgpOworICAgIGlmICghbUdzbSkgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICBpbnQgbXNvcHQgPSAxOworICAgICh2b2lkKWdzbV9vcHRpb24obUdzbSwgR1NNX09QVF9XQVY0OSwgJm1zb3B0KTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRW9zID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRHc21EZWM6Om9uU3RvcCgpIHsKKyAgICBpZiAobUdzbSkgeworICAgICAgICBnc21fZGVzdHJveShtR3NtKTsKKyAgICAgICAgbUdzbSA9IG51bGxwdHI7CisgICAgfQorICAgIGlmICghbUdzbSkgbUdzbSA9IGdzbV9jcmVhdGUoKTsKKyAgICBpZiAoIW1Hc20pIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgaW50IG1zb3B0ID0gMTsKKyAgICAodm9pZClnc21fb3B0aW9uKG1Hc20sIEdTTV9PUFRfV0FWNDksICZtc29wdCk7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVvcyA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRHc21EZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0R3NtRGVjOjpvblJlbGVhc2UoKSB7CisgICAgaWYgKG1Hc20pIHsKKyAgICAgICAgZ3NtX2Rlc3Ryb3kobUdzbSk7CisgICAgICAgIG1Hc20gPSBudWxscHRyOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0R3NtRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKworc3RhdGljIHNpemVfdCBkZWNvZGVHU00oZ3NtIGhhbmRsZSwgaW50MTZfdCAqb3V0LCBzaXplX3Qgb3V0Q2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSkgeworICAgIHNpemVfdCBvdXRTaXplID0gMDsKKworICAgIGlmIChpblNpemUgJSBNU0dTTV9JTl9GUk1fU1ogPT0gMAorICAgICAgICAgICAgJiYgKGluU2l6ZSAvIE1TR1NNX0lOX0ZSTV9TWiAqIE1TR1NNX09VVF9GUk1fU1ogKiBzaXplb2YoKm91dCkKKyAgICAgICAgICAgICAgICAgICAgPD0gb3V0Q2FwYWNpdHkpKSB7CisgICAgICAgIHdoaWxlIChpblNpemUgPiAwKSB7CisgICAgICAgICAgICBnc21fZGVjb2RlKGhhbmRsZSwgaW4sIG91dCk7CisgICAgICAgICAgICBpbiArPSBGUkdTTV9JTl9GUk1fU1o7CisgICAgICAgICAgICBpblNpemUgLT0gRlJHU01fSU5fRlJNX1NaOworICAgICAgICAgICAgb3V0ICs9IEZSR1NNX09VVF9GUk1fU1o7CisgICAgICAgICAgICBvdXRTaXplICs9IEZSR1NNX09VVF9GUk1fU1o7CisKKyAgICAgICAgICAgIGdzbV9kZWNvZGUoaGFuZGxlLCBpbiwgb3V0KTsKKyAgICAgICAgICAgIGluICs9IEZSR1NNX0lOX0ZSTV9TWl9NSU5VU18xOworICAgICAgICAgICAgaW5TaXplIC09IEZSR1NNX0lOX0ZSTV9TWl9NSU5VU18xOworICAgICAgICAgICAgb3V0ICs9IEZSR1NNX09VVF9GUk1fU1o7CisgICAgICAgICAgICBvdXRTaXplICs9IEZSR1NNX09VVF9GUk1fU1o7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gb3V0U2l6ZSAqIHNpemVvZihpbnQxNl90KTsKK30KKwordm9pZCBDMlNvZnRHc21EZWM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gclZpZXcuZXJyb3IoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpblNpemUgPT0gMCkgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkIiwgaW5TaXplLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisKKyAgICBzaXplX3Qgb3V0Q2FwYWNpdHkgPSAoaW5TaXplIC8gTVNHU01fSU5fRlJNX1NaICkgKiBNU0dTTV9PVVRfRlJNX1NaICogc2l6ZW9mKGludDE2X3QpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhvdXRDYXBhY2l0eSwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IHdWaWV3LmVycm9yKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQxNl90ICpvdXRwdXQgPSByZWludGVycHJldF9jYXN0PGludDE2X3QgKj4od1ZpZXcuZGF0YSgpKTsKKyAgICB1aW50OF90ICppbnB1dCA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihyVmlldy5kYXRhKCkgKyBpbk9mZnNldCk7CisgICAgc2l6ZV90IG91dFNpemUgPSBkZWNvZGVHU00obUdzbSwgb3V0cHV0LCBvdXRDYXBhY2l0eSwgaW5wdXQsIGluU2l6ZSk7CisgICAgaWYgKCFvdXRTaXplKSB7CisgICAgICAgIEFMT0dFKCJlbmNvdW50ZXJlZCBpbXByb3BlciBpbnNpemUgb3Igb3V0c2l6ZSIpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1YoIm91dCBidWZmZXIgYXR0ci4gc2l6ZSAlenUiLCBvdXRTaXplKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIDAsIG91dFNpemUpKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkRW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEdzbURlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdEdTTURlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRHU01EZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0R3NtRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEdzbURlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRHc21EZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRHc21EZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRHU01EZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRHU01EZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjIwOWZlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0MyU29mdEdzbURlYy5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9HU01fREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9HU01fREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKK2V4dGVybiAiQyIgeworICAgICNpbmNsdWRlICJnc20uaCIKK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIEZSR1NNX0lOX0ZSTV9TWiAgICAgICAgICAgICAzMworI2RlZmluZSBGUkdTTV9JTl9GUk1fU1pfTUlOVVNfMSAgICAgMzIKKyNkZWZpbmUgRlJHU01fT1VUX0ZSTV9TWiAgICAgICAgICAgIDE2MAorI2RlZmluZSBNU0dTTV9JTl9GUk1fU1ogICAgICAgICAgICAgKEZSR1NNX0lOX0ZSTV9TWiArIEZSR1NNX0lOX0ZSTV9TWl9NSU5VU18xKQorI2RlZmluZSBNU0dTTV9PVVRfRlJNX1NaICAgICAgICAgICAgKEZSR1NNX09VVF9GUk1fU1ogKiAyKQorCitzdHJ1Y3QgQzJTb2Z0R3NtRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEdzbURlYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRHc21EZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIGdzbSBtR3NtOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZEVvczsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEdzbURlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9HU01fREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb21tb25fdGltZS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9jb21tb25fdGltZS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmNvcHkgdG8gbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2NvbW1vbl90aW1lL05PVElDRSBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9OT1RJQ0UKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9jb21tb25fdGltZS9OT1RJQ0UKY29weSB0byBtZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vTk9USUNFCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY5YmQ3OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQW5kcm9pZC5icApAQCAtMCwwICsxLDI1IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2hldmNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9zaWduZWQtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEhldmNEZWMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJoZXZjZGVjIl0sCisKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9oZXZjZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRIZXZjRW5jLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGliaGV2Y2VuYyJdLAorCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjMyNTcyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmNwcApAQCAtMCwwICsxLDEwMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEhldmNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPENvZGVjMk1hcHBlci5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRIZXZjRGVjLmgiCisjaW5jbHVkZSAiaWhldmNkX2N4YS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5oZXZjLmRlY29kZXIiOworCit9ICAvLyBuYW1lc3BhY2UKKworY2xhc3MgQzJTb2Z0SGV2Y0RlYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fVklERU8sCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQykgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7IC8vIFRPRE86IGFjY291bnQgZm9yIG91ciBidWZmZXJzIGhlcmUKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKworICAgICAgICAvLyBUT0RPOiBQcm9wZXIgc3VwcG9ydCBmb3IgcmVvcmRlciBkZXB0aC4KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BY3R1YWxPdXRwdXREZWxheSwgQzJfUEFSQU1LRVlfT1VUUFVUX0RFTEFZKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6Om91dHB1dCg4dSkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCA0MDk2LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgNDA5NiwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU4sIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNV8xKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl9TVElMTH0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8yLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzJfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzMsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fM18xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNCwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl80XzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl81LCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzVfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzVfMiwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF80LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNF8xLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF81XzEsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNV8yCisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heFNpemUsIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgNDA5NiwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDQwOTYsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoTWF4UGljdHVyZVNpemVTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heElucHV0U2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDMyMCAqIDI0MCAqIDMgLyA0KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtTWF4SW5wdXRTaXplLCB2YWx1ZSkuYW55KCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuY2FsY3VsYXRlZEFzKE1heElucHV0U2l6ZVNldHRlciwgbU1heFNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIEMyQ2hyb21hT2Zmc2V0U3RydWN0IGxvY2F0aW9uc1sxXSA9IHsgQzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKSB9OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gZGVmYXVsdENvbG9ySW5mbyA9CisgICAgICAgICAgICBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgMXUsIDB1LCA4dSAvKiBiaXREZXB0aCAqLywgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIG1lbWNweShkZWZhdWx0Q29sb3JJbmZvLT5tLmxvY2F0aW9ucywgbG9jYXRpb25zLCBzaXplb2YobG9jYXRpb25zKSk7CisKKyAgICAgICAgZGVmYXVsdENvbG9ySW5mbyA9IEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAge0MyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCl9LCAwdSwgOHUgLyogYml0RGVwdGggKi8sCisgICAgICAgICAgICBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgaGVscGVyLT5hZGRTdHJ1Y3REZXNjcmlwdG9yczxDMkNocm9tYU9mZnNldFN0cnVjdD4oKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbG9ySW5mbywgQzJfUEFSQU1LRVlfQ09ERURfQ09MT1JfSU5GTykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoZGVmYXVsdENvbG9ySW5mbykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoRGVmYXVsdENvbG9yQXNwZWN0c1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2RlZENvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfVlVJX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX0xJTUlURUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQ29kZWRDb2xvckFzcGVjdHNTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKENvbG9yQXNwZWN0c1NldHRlciwgbURlZmF1bHRDb2xvckFzcGVjdHMsIG1Db2RlZENvbG9yQXNwZWN0cykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBtb3JlIGZvcm1hdHM/CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGl4ZWxGb3JtYXQsIEMyX1BBUkFNS0VZX1BJWEVMX0ZPUk1BVCkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAoIW1lLkYobWUudi53aWR0aCkuc3VwcG9ydHNBdEFsbChtZS52LndpZHRoKSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LndpZHRoKSkpOworICAgICAgICAgICAgbWUuc2V0KCkud2lkdGggPSBvbGRNZS52LndpZHRoOworICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmhlaWdodCkuc3VwcG9ydHNBdEFsbChtZS52LmhlaWdodCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi5oZWlnaHQpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBvbGRNZS52LmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4UGljdHVyZVNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBUT0RPOiBnZXQgbWF4IHdpZHRoL2hlaWdodCBmcm9tIHRoZSBzaXplJ3MgZmllbGQgaGVscGVycyB2cy4gaGFyZGNvZGluZworICAgICAgICBtZS5zZXQoKS53aWR0aCA9IGMyX21pbihjMl9tYXgobWUudi53aWR0aCwgc2l6ZS52LndpZHRoKSwgNDA5NnUpOworICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBjMl9taW4oYzJfbWF4KG1lLnYuaGVpZ2h0LCBzaXplLnYuaGVpZ2h0KSwgNDA5NnUpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4SW5wdXRTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtYXhTaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBhc3N1bWUgY29tcHJlc3Npb24gcmF0aW8gb2YgMgorICAgICAgICBtZS5zZXQoKS52YWx1ZSA9ICgoKG1heFNpemUudi53aWR0aCArIDYzKSAvIDY0KSAqICgobWF4U2l6ZS52LmhlaWdodCArIDYzKSAvIDY0KSAqIDMwNzIpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZClzaXplOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi50cmFuc2ZlciA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIENvZGVkQ29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi50cmFuc2ZlciA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gJmRlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gJmNvZGVkKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyB0YWtlIGRlZmF1bHQgdmFsdWVzIGZvciBhbGwgdW5zcGVjaWZpZWQgZmllbGRzLCBhbmQgY29kZWQgdmFsdWVzIGZvciBzcGVjaWZpZWQgb25lcworICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IGNvZGVkLnYucmFuZ2UgPT0gUkFOR0VfVU5TUEVDSUZJRUQgPyBkZWYudi5yYW5nZSA6IGNvZGVkLnYucmFuZ2U7CisgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IGNvZGVkLnYucHJpbWFyaWVzID09IFBSSU1BUklFU19VTlNQRUNJRklFRAorICAgICAgICAgICAgICAgID8gZGVmLnYucHJpbWFyaWVzIDogY29kZWQudi5wcmltYXJpZXM7CisgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gY29kZWQudi50cmFuc2ZlciA9PSBUUkFOU0ZFUl9VTlNQRUNJRklFRAorICAgICAgICAgICAgICAgID8gZGVmLnYudHJhbnNmZXIgOiBjb2RlZC52LnRyYW5zZmVyOworICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBjb2RlZC52Lm1hdHJpeCA9PSBNQVRSSVhfVU5TUEVDSUZJRUQgPyBkZWYudi5tYXRyaXggOiBjb2RlZC52Lm1hdHJpeDsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IGdldENvbG9yQXNwZWN0c19sKCkgeworICAgICAgICByZXR1cm4gbUNvbG9yQXNwZWN0czsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+IG1NYXhTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbU1heElucHV0U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gbUNvbG9ySW5mbzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gbUNvZGVkQ29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBtRGVmYXVsdENvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IG1Db2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQ+IG1QaXhlbEZvcm1hdDsKK307CisKK3N0YXRpYyBzaXplX3QgZ2V0Q3B1Q29yZUNvdW50KCkgeworICAgIGxvbmcgY3B1Q29yZUNvdW50ID0gMTsKKyNpZiBkZWZpbmVkKF9TQ19OUFJPQ0VTU09SU19PTkxOKQorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworI2Vsc2UKKyAgICAvLyBfU0NfTlBST0NfT05MTiBtdXN0IGJlIGRlZmluZWQuLi4KKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ19PTkxOKTsKKyNlbmRpZgorICAgIENIRUNLKGNwdUNvcmVDb3VudCA+PSAxKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIENQVSBjb3JlczogJWxkIiwgY3B1Q29yZUNvdW50KTsKKyAgICByZXR1cm4gKHNpemVfdCljcHVDb3JlQ291bnQ7Cit9CisKK3N0YXRpYyB2b2lkICppdmRfYWxpZ25lZF9tYWxsb2Modm9pZCAqY3R4dCwgV09SRDMyIGFsaWdubWVudCwgV09SRDMyIHNpemUpIHsKKyAgICAodm9pZCkgY3R4dDsKKyAgICByZXR1cm4gbWVtYWxpZ24oYWxpZ25tZW50LCBzaXplKTsKK30KKworc3RhdGljIHZvaWQgaXZkX2FsaWduZWRfZnJlZSh2b2lkICpjdHh0LCB2b2lkICptZW0pIHsKKyAgICAodm9pZCkgY3R4dDsKKyAgICBmcmVlKG1lbSk7Cit9CisKK0MyU29mdEhldmNEZWM6OkMyU29mdEhldmNEZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICAgIG1EZWNIYW5kbGUobnVsbHB0ciksCisgICAgICAgIG1PdXRCdWZmZXJGbHVzaChudWxscHRyKSwKKyAgICAgICAgbUl2Q29sb3Jmb3JtYXQoSVZfWVVWXzQyMFApLAorICAgICAgICBtV2lkdGgoMzIwKSwKKyAgICAgICAgbUhlaWdodCgyNDApLAorICAgICAgICBtSGVhZGVyRGVjb2RlZChmYWxzZSksCisgICAgICAgIG1PdXRJbmRleCgwdSkgeworfQorCitDMlNvZnRIZXZjRGVjOjp+QzJTb2Z0SGV2Y0RlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpvblN0b3AoKSB7CisgICAgaWYgKE9LICE9IHJlc2V0RGVjb2RlcigpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIHJlc2V0UGx1Z2luKCk7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEhldmNEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpIG9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdEhldmNEZWM6Om9uUmVsZWFzZSgpIHsKKyAgICAodm9pZCkgZGVsZXRlRGVjb2RlcigpOworICAgIGlmIChtT3V0QnVmZmVyRmx1c2gpIHsKKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShudWxscHRyLCBtT3V0QnVmZmVyRmx1c2gpOworICAgICAgICBtT3V0QnVmZmVyRmx1c2ggPSBudWxscHRyOworICAgIH0KKyAgICBpZiAobU91dEJsb2NrKSB7CisgICAgICAgIG1PdXRCbG9jay5yZXNldCgpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6b25GbHVzaF9zbSgpIHsKKyAgICBpZiAoT0sgIT0gc2V0Rmx1c2hNb2RlKCkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisKKyAgICB1aW50MzJfdCBkaXNwbGF5U3RyaWRlID0gbVN0cmlkZTsKKyAgICB1aW50MzJfdCBkaXNwbGF5SGVpZ2h0ID0gbUhlaWdodDsKKyAgICB1aW50MzJfdCBidWZmZXJTaXplID0gZGlzcGxheVN0cmlkZSAqIGRpc3BsYXlIZWlnaHQgKiAzIC8gMjsKKyAgICBtT3V0QnVmZmVyRmx1c2ggPSAodWludDhfdCAqKWl2ZF9hbGlnbmVkX21hbGxvYyhudWxscHRyLCAxMjgsIGJ1ZmZlclNpemUpOworICAgIGlmICghbU91dEJ1ZmZlckZsdXNoKSB7CisgICAgICAgIEFMT0dFKCJjb3VsZCBub3QgYWxsb2NhdGUgdG1wIG91dHB1dCBidWZmZXIgKGZvciBmbHVzaCkgb2Ygc2l6ZSAldSAiLCBidWZmZXJTaXplKTsKKyAgICAgICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICB9CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKKworICAgICAgICBzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCBudWxscHRyLCBudWxscHRyLCAwLCAwLCAwKTsKKyAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIGlmICgwID09IHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICByZXNldFBsdWdpbigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobU91dEJ1ZmZlckZsdXNoKSB7CisgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUobnVsbHB0ciwgbU91dEJ1ZmZlckZsdXNoKTsKKyAgICAgICAgbU91dEJ1ZmZlckZsdXNoID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEhldmNEZWM6OmNyZWF0ZURlY29kZXIoKSB7CisgICAgaXZkZXh0X2NyZWF0ZV9pcF90IHNfY3JlYXRlX2lwOworICAgIGl2ZGV4dF9jcmVhdGVfb3BfdCBzX2NyZWF0ZV9vcDsKKworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2NyZWF0ZV9pcF90KTsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5lX2NtZCA9IElWRF9DTURfQ1JFQVRFOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnU0X3NoYXJlX2Rpc3BfYnVmID0gMDsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5lX291dHB1dF9mb3JtYXQgPSBtSXZDb2xvcmZvcm1hdDsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5wZl9hbGlnbmVkX2FsbG9jID0gaXZkX2FsaWduZWRfbWFsbG9jOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnBmX2FsaWduZWRfZnJlZSA9IGl2ZF9hbGlnbmVkX2ZyZWU7CisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QucHZfbWVtX2N0eHQgPSBudWxscHRyOworICAgIHNfY3JlYXRlX29wLnNfaXZkX2NyZWF0ZV9vcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2NyZWF0ZV9vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfY3JlYXRlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19jcmVhdGVfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgc19jcmVhdGVfb3Auc19pdmRfY3JlYXRlX29wX3QudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtRGVjSGFuZGxlID0gKGl2X29ial90KilzX2NyZWF0ZV9vcC5zX2l2ZF9jcmVhdGVfb3BfdC5wdl9oYW5kbGU7CisgICAgbURlY0hhbmRsZS0+cHZfZnhucyA9ICh2b2lkICopaXZkZWNfYXBpX2Z1bmN0aW9uOworICAgIG1EZWNIYW5kbGUtPnU0X3NpemUgPSBzaXplb2YoaXZfb2JqX3QpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpzZXROdW1Db3JlcygpIHsKKyAgICBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCBzX3NldF9udW1fY29yZXNfaXA7CisgICAgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3Qgc19zZXRfbnVtX2NvcmVzX29wOworCisgICAgc19zZXRfbnVtX2NvcmVzX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QpOworICAgIHNfc2V0X251bV9jb3Jlc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfc2V0X251bV9jb3Jlc19pcC5lX3N1Yl9jbWQgPSBJVkRFWFRfQ01EX0NUTF9TRVRfTlVNX0NPUkVTOworICAgIHNfc2V0X251bV9jb3Jlc19pcC51NF9udW1fY29yZXMgPSBtTnVtQ29yZXM7CisgICAgc19zZXRfbnVtX2NvcmVzX29wLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfbnVtX2NvcmVzX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfbnVtX2NvcmVzX29wKTsKKyAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0QoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X251bV9jb3Jlc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpzZXRQYXJhbXMoc2l6ZV90IHN0cmlkZSwgSVZEX1ZJREVPX0RFQ09ERV9NT0RFX1QgZGVjX21vZGUpIHsKKyAgICBpdmRfY3RsX3NldF9jb25maWdfaXBfdCBzX3NldF9keW5fcGFyYW1zX2lwOworICAgIGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90IHNfc2V0X2R5bl9wYXJhbXNfb3A7CisKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX2lwX3QpOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX1NFVFBBUkFNUzsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLnU0X2Rpc3Bfd2QgPSAoVVdPUkQzMikgc3RyaWRlOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9mcm1fc2tpcF9tb2RlID0gSVZEX1NLSVBfTk9ORTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfZnJtX291dF9tb2RlID0gSVZEX0RJU1BMQVlfRlJBTUVfT1VUOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV92aWRfZGVjX21vZGUgPSBkZWNfbW9kZTsKKyAgICBzX3NldF9keW5fcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZHluX3BhcmFtc19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2R5bl9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfZHluX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpnZXRWZXJzaW9uKCkgeworICAgIGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCBzX2dldF92ZXJzaW9uaW5mb19pcDsKKyAgICBpdmRfY3RsX2dldHZlcnNpb25pbmZvX29wX3Qgc19nZXRfdmVyc2lvbmluZm9fb3A7CisgICAgVVdPUkQ4IGF1MV9idWZbNTEyXTsKKworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90KTsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX0dFVFZFUlNJT047CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAucHZfdmVyc2lvbl9idWZmZXIgPSBhdTFfYnVmOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnU0X3ZlcnNpb25fYnVmZmVyX3NpemUgPSBzaXplb2YoYXUxX2J1Zik7CisgICAgc19nZXRfdmVyc2lvbmluZm9fb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2dldHZlcnNpb25pbmZvX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19nZXRfdmVyc2lvbmluZm9faXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92ZXJzaW9uaW5mb19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dEKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICBzX2dldF92ZXJzaW9uaW5mb19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiaXR0aWFtIGRlY29kZXIgdmVyc2lvbiBudW1iZXI6ICVzIiwKKyAgICAgICAgICAgICAgKGNoYXIgKikgc19nZXRfdmVyc2lvbmluZm9faXAucHZfdmVyc2lvbl9idWZmZXIpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6aW5pdERlY29kZXIoKSB7CisgICAgaWYgKE9LICE9IGNyZWF0ZURlY29kZXIoKSkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgbU51bUNvcmVzID0gTUlOKGdldENwdUNvcmVDb3VudCgpLCBNQVhfTlVNX0NPUkVTKTsKKyAgICBtU3RyaWRlID0gQUxJR042NChtV2lkdGgpOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIHJlc2V0UGx1Z2luKCk7CisgICAgKHZvaWQpIHNldE51bUNvcmVzKCk7CisgICAgaWYgKE9LICE9IHNldFBhcmFtcyhtU3RyaWRlLCBJVkRfREVDT0RFX0ZSQU1FKSkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgKHZvaWQpIGdldFZlcnNpb24oKTsKKworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBDMlNvZnRIZXZjRGVjOjpzZXREZWNvZGVBcmdzKGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjb2RlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjb2RlX29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVhZFZpZXcgKmluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgKm91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0c01hcmtlcikgeworICAgIHVpbnQzMl90IGRpc3BsYXlTdHJpZGUgPSBtU3RyaWRlOworICAgIHVpbnQzMl90IGRpc3BsYXlIZWlnaHQgPSBtSGVpZ2h0OworICAgIHNpemVfdCBsdW1hU2l6ZSA9IGRpc3BsYXlTdHJpZGUgKiBkaXNwbGF5SGVpZ2h0OworICAgIHNpemVfdCBjaHJvbWFTaXplID0gbHVtYVNpemUgPj4gMjsKKworICAgIHBzX2RlY29kZV9pcC0+dTRfc2l6ZSA9IHNpemVvZihpdmRfdmlkZW9fZGVjb2RlX2lwX3QpOworICAgIHBzX2RlY29kZV9pcC0+ZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0RFQ09ERTsKKyAgICBpZiAoaW5CdWZmZXIpIHsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF90cyA9IHRzTWFya2VyOworICAgICAgICBwc19kZWNvZGVfaXAtPnB2X3N0cmVhbV9idWZmZXIgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5CdWZmZXItPmRhdGEoKSArIGluT2Zmc2V0KTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF9udW1fQnl0ZXMgPSBpblNpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF90cyA9IDA7CisgICAgICAgIHBzX2RlY29kZV9pcC0+cHZfc3RyZWFtX2J1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfbnVtX0J5dGVzID0gMDsKKyAgICB9CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVswXSA9IGx1bWFTaXplOworICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMV0gPSBjaHJvbWFTaXplOworICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMl0gPSBjaHJvbWFTaXplOworICAgIGlmIChvdXRCdWZmZXIpIHsKKyAgICAgICAgaWYgKG91dEJ1ZmZlci0+d2lkdGgoKSA8IGRpc3BsYXlTdHJpZGUgfHwgb3V0QnVmZmVyLT5oZWlnaHQoKSA8IGRpc3BsYXlIZWlnaHQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJPdXRwdXQgYnVmZmVyIHRvbyBzbWFsbDogcHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJXV4JXUpIiwKKyAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+d2lkdGgoKSwgb3V0QnVmZmVyLT5oZWlnaHQoKSwgZGlzcGxheVN0cmlkZSwgZGlzcGxheUhlaWdodCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMF0gPSBvdXRCdWZmZXItPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzFdID0gb3V0QnVmZmVyLT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1syXSA9IG91dEJ1ZmZlci0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKyAgICB9IGVsc2UgeworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1swXSA9IG1PdXRCdWZmZXJGbHVzaDsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMV0gPSBtT3V0QnVmZmVyRmx1c2ggKyBsdW1hU2l6ZTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMl0gPSBtT3V0QnVmZmVyRmx1c2ggKyBsdW1hU2l6ZSArIGNocm9tYVNpemU7CisgICAgfQorICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X251bV9idWZzID0gMzsKKyAgICBwc19kZWNvZGVfb3AtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9vcF90KTsKKyAgICBwc19kZWNvZGVfb3AtPnU0X291dHB1dF9wcmVzZW50ID0gMDsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEMyU29mdEhldmNEZWM6OmdldFZ1aVBhcmFtcygpIHsKKyAgICBpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX2lwX3Qgc19nZXRfdnVpX3BhcmFtc19pcDsKKyAgICBpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX29wX3Qgc19nZXRfdnVpX3BhcmFtc19vcDsKKworICAgIHNfZ2V0X3Z1aV9wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX2lwX3QpOworICAgIHNfZ2V0X3Z1aV9wYXJhbXNfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2dldF92dWlfcGFyYW1zX2lwLmVfc3ViX2NtZCA9CisgICAgICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKSBJSEVWQ0RfQ1hBX0NNRF9DVExfR0VUX1ZVSV9QQVJBTVM7CisgICAgc19nZXRfdnVpX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92dWlfcGFyYW1zX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19nZXRfdnVpX3BhcmFtc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dEKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX2dldF92dWlfcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgVnVpQ29sb3JBc3BlY3RzIHZ1aUNvbG9yQXNwZWN0czsKKyAgICB2dWlDb2xvckFzcGVjdHMucHJpbWFyaWVzID0gc19nZXRfdnVpX3BhcmFtc19vcC51MV9jb2xvdXJfcHJpbWFyaWVzOworICAgIHZ1aUNvbG9yQXNwZWN0cy50cmFuc2ZlciA9IHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTFfdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzOworICAgIHZ1aUNvbG9yQXNwZWN0cy5jb2VmZnMgPSBzX2dldF92dWlfcGFyYW1zX29wLnUxX21hdHJpeF9jb2VmZmljaWVudHM7CisgICAgdnVpQ29sb3JBc3BlY3RzLmZ1bGxSYW5nZSA9IHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTFfdmlkZW9fZnVsbF9yYW5nZV9mbGFnOworCisgICAgLy8gY29udmVydCB2dWkgYXNwZWN0cyB0byBDMiB2YWx1ZXMgaWYgY2hhbmdlZAorICAgIGlmICghKHZ1aUNvbG9yQXNwZWN0cyA9PSBtQml0c3RyZWFtQ29sb3JBc3BlY3RzKSkgeworICAgICAgICBtQml0c3RyZWFtQ29sb3JBc3BlY3RzID0gdnVpQ29sb3JBc3BlY3RzOworICAgICAgICBDb2xvckFzcGVjdHMgc2ZBc3BlY3RzOworICAgICAgICBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0IGNvZGVkQXNwZWN0cyA9IHsgMHUgfTsKKyAgICAgICAgQ29sb3JVdGlsczo6Y29udmVydElzb0NvbG9yQXNwZWN0c1RvQ29kZWNBc3BlY3RzKAorICAgICAgICAgICAgICAgIHZ1aUNvbG9yQXNwZWN0cy5wcmltYXJpZXMsIHZ1aUNvbG9yQXNwZWN0cy50cmFuc2ZlciwgdnVpQ29sb3JBc3BlY3RzLmNvZWZmcywKKyAgICAgICAgICAgICAgICB2dWlDb2xvckFzcGVjdHMuZnVsbFJhbmdlLCBzZkFzcGVjdHMpOworICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1QcmltYXJpZXMsICZjb2RlZEFzcGVjdHMucHJpbWFyaWVzKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1SYW5nZSwgJmNvZGVkQXNwZWN0cy5yYW5nZSkpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubU1hdHJpeENvZWZmcywgJmNvZGVkQXNwZWN0cy5tYXRyaXgpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubVRyYW5zZmVyLCAmY29kZWRBc3BlY3RzLnRyYW5zZmVyKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAodm9pZCltSW50Zi0+Y29uZmlnKHsmY29kZWRBc3BlY3RzfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6c2V0Rmx1c2hNb2RlKCkgeworICAgIGl2ZF9jdGxfZmx1c2hfaXBfdCBzX3NldF9mbHVzaF9pcDsKKyAgICBpdmRfY3RsX2ZsdXNoX29wX3Qgc19zZXRfZmx1c2hfb3A7CisKKyAgICBzX3NldF9mbHVzaF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZmx1c2hfaXBfdCk7CisgICAgc19zZXRfZmx1c2hfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9mbHVzaF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9GTFVTSDsKKyAgICBzX3NldF9mbHVzaF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZmx1c2hfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9mbHVzaF9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2ZsdXNoX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X2ZsdXNoX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEhldmNEZWM6OnJlc2V0RGVjb2RlcigpIHsKKyAgICBpdmRfY3RsX3Jlc2V0X2lwX3Qgc19yZXNldF9pcDsKKyAgICBpdmRfY3RsX3Jlc2V0X29wX3Qgc19yZXNldF9vcDsKKworICAgIHNfcmVzZXRfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3Jlc2V0X2lwX3QpOworICAgIHNfcmVzZXRfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3Jlc2V0X2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX1JFU0VUOworICAgIHNfcmVzZXRfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3Jlc2V0X29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19yZXNldF9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfcmVzZXRfb3ApOworICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19yZXNldF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIG1TdHJpZGUgPSAwOworICAgICh2b2lkKSBzZXROdW1Db3JlcygpOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1IZWFkZXJEZWNvZGVkID0gZmFsc2U7CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEMyU29mdEhldmNEZWM6OnJlc2V0UGx1Z2luKCkgeworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVFbmQsIG51bGxwdHIpOworfQorCitzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpkZWxldGVEZWNvZGVyKCkgeworICAgIGlmIChtRGVjSGFuZGxlKSB7CisgICAgICAgIGl2ZGV4dF9kZWxldGVfaXBfdCBzX2RlbGV0ZV9pcDsKKyAgICAgICAgaXZkZXh0X2RlbGV0ZV9vcF90IHNfZGVsZXRlX29wOworCisgICAgICAgIHNfZGVsZXRlX2lwLnNfaXZkX2RlbGV0ZV9pcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2RlbGV0ZV9pcF90KTsKKyAgICAgICAgc19kZWxldGVfaXAuc19pdmRfZGVsZXRlX2lwX3QuZV9jbWQgPSBJVkRfQ01EX0RFTEVURTsKKyAgICAgICAgc19kZWxldGVfb3Auc19pdmRfZGVsZXRlX29wX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfZGVsZXRlX29wX3QpOworICAgICAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2RlbGV0ZV9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2RlbGV0ZV9vcCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICBzX2RlbGV0ZV9vcC5zX2l2ZF9kZWxldGVfb3BfdC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIG1EZWNIYW5kbGUgPSBudWxscHRyOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgfQorICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCit2b2lkIEMyU29mdEhldmNEZWM6OmZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBjcmVhdGVHcmFwaGljQnVmZmVyKHN0ZDo6bW92ZShtT3V0QmxvY2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlY3QobVdpZHRoLCBtSGVpZ2h0KSk7CisgICAgbU91dEJsb2NrID0gbnVsbHB0cjsKKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBidWZmZXItPnNldEluZm8obUludGYtPmdldENvbG9yQXNwZWN0c19sKCkpOworICAgIH0KKworICAgIGNsYXNzIEZpbGxXb3JrIHsKKyAgICAgICBwdWJsaWM6CisgICAgICAgIEZpbGxXb3JrKHVpbnQzMl90IGZsYWdzLCBDMldvcmtPcmRpbmFsU3RydWN0IG9yZGluYWwsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIGJ1ZmZlcikKKyAgICAgICAgICAgIDogbUZsYWdzKGZsYWdzKSwgbU9yZGluYWwob3JkaW5hbCksIG1CdWZmZXIoYnVmZmVyKSB7fQorICAgICAgICB+RmlsbFdvcmsoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrKSB7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpbUZsYWdzOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gbU9yZGluYWw7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgICAgICAgICBpZiAobUJ1ZmZlcikgeworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhtQnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJ0aW1lc3RhbXAgPSAlbGxkLCBpbmRleCA9ICVsbGQsIHcvJXMgYnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgIG1PcmRpbmFsLnRpbWVzdGFtcC5wZWVrbGwoKSwgbU9yZGluYWwuZnJhbWVJbmRleC5wZWVrbGwoKSwKKyAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPyAiIiA6ICJvIik7CisgICAgICAgIH0KKworICAgICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IHVpbnQzMl90IG1GbGFnczsKKyAgICAgICAgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCBtT3JkaW5hbDsKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBtQnVmZmVyOworICAgIH07CisKKyAgICBhdXRvIGZpbGxXb3JrID0gW2J1ZmZlcl0oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KTA7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgfTsKKyAgICBpZiAod29yayAmJiBjMl9jbnRyNjRfdChpbmRleCkgPT0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4KSB7CisgICAgICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgICAgICAvLyBUT0RPOiBDaGVjayBpZiBjbG9uZUFuZFNlbmQgY2FuIGJlIGF2b2lkZWQgYnkgdHJhY2tpbmcgbnVtYmVyIG9mIGZyYW1lcyByZW1haW5pbmcKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgICAgIG1PdXRJbmRleCA9IGluZGV4OworICAgICAgICAgICAgICAgIEMyV29ya09yZGluYWxTdHJ1Y3Qgb3V0T3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgICAgICAgICAgY2xvbmVBbmRTZW5kKAorICAgICAgICAgICAgICAgICAgICBtT3V0SW5kZXgsIHdvcmssCisgICAgICAgICAgICAgICAgICAgIEZpbGxXb3JrKEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUsIG91dE9yZGluYWwsIGJ1ZmZlcikpOworICAgICAgICAgICAgICAgIGJ1ZmZlci5yZXNldCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmaW5pc2goaW5kZXgsIGZpbGxXb3JrKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNEZWM6OmVuc3VyZURlY29kZXJTdGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgaWYgKCFtRGVjSGFuZGxlKSB7CisgICAgICAgIEFMT0dFKCJub3Qgc3VwcG9zZWQgdG8gYmUgaGVyZSwgaW52YWxpZCBkZWNvZGVyIGNvbnRleHQiKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgaWYgKG1TdHJpZGUgIT0gQUxJR042NChtV2lkdGgpKSB7CisgICAgICAgIG1TdHJpZGUgPSBBTElHTjY0KG1XaWR0aCk7CisgICAgICAgIGlmIChPSyAhPSBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9GUkFNRSkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIGlmIChtT3V0QmxvY2sgJiYKKyAgICAgICAgICAgIChtT3V0QmxvY2stPndpZHRoKCkgIT0gbVN0cmlkZSB8fCBtT3V0QmxvY2stPmhlaWdodCgpICE9IG1IZWlnaHQpKSB7CisgICAgICAgIG1PdXRCbG9jay5yZXNldCgpOworICAgIH0KKyAgICBpZiAoIW1PdXRCbG9jaykgeworICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2sobVN0cmlkZSwgbUhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJm1PdXRCbG9jayk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJmZXRjaEdyYXBoaWNCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICglZHglZCkiLAorICAgICAgICAgICAgICBtT3V0QmxvY2stPndpZHRoKCksIG1PdXRCbG9jay0+aGVpZ2h0KCksIG1TdHJpZGUsIG1IZWlnaHQpOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworLy8gVE9ETzogY2FuIG92ZXJhbGwgZXJyb3IgY2hlY2tpbmcgYmUgaW1wcm92ZWQ/CisvLyBUT0RPOiBhbGxvdyBjb25maWd1cmF0aW9uIG9mIGNvbG9yIGZvcm1hdCBhbmQgdXNhZ2UgZm9yIGdyYXBoaWMgYnVmZmVycyBpbnN0ZWFkCisvLyAgICAgICBvZiBoYXJkIGNvZGluZyB0aGVtIHRvIEhBTF9QSVhFTF9GT1JNQVRfWVYxMgorLy8gVE9ETzogcGFzcyBjb2xvcmFzcGVjdHMgaW5mb3JtYXRpb24gdG8gc3VyZmFjZQorLy8gVE9ETzogdGVzdCBzdXBwb3J0IGZvciBkeW5hbWljIGNoYW5nZSBpbiByZXNvbHV0aW9uCisvLyBUT0RPOiB2ZXJpZnkgaWYgdGhlIGRlY29kZXIgc2VudCBiYWNrIGFsbCBmcmFtZXMKK3ZvaWQgQzJTb2Z0SGV2Y0RlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIHVpbnQzMl90IHdvcmtJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpICYgMHhGRkZGRkZGRjsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHJWaWV3LmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgYm9vbCBoYXNQaWN0dXJlID0gZmFsc2U7CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsCisgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwgd29yay0+aW5wdXQuZmxhZ3MpOworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplKSB7CisgICAgICAgIGlmIChDMl9PSyAhPSBlbnN1cmVEZWNvZGVyU3RhdGUocG9vbCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBtT3V0QmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOworICAgICAgICBpZiAoIXNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsICZyVmlldywgJndWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5PZmZzZXQgKyBpblBvcywgaW5TaXplIC0gaW5Qb3MsIHdvcmtJbmRleCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZhbHNlID09IG1IZWFkZXJEZWNvZGVkKSB7CisgICAgICAgICAgICAvKiBEZWNvZGUgaGVhZGVyIGFuZCBnZXQgZGltZW5zaW9ucyAqLworICAgICAgICAgICAgc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfSEVBREVSKTsKKyAgICAgICAgfQorICAgICAgICBXT1JEMzIgZGVsYXk7CisgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgICAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIGRlbGF5KTsKKyAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIFdPUkQzMiBkZWNvZGVUaW1lOworICAgICAgICBHRVRUSU1FKCZtVGltZUVuZCwgbnVsbHB0cik7CisgICAgICAgIFRJTUVfRElGRihtVGltZVN0YXJ0LCBtVGltZUVuZCwgZGVjb2RlVGltZSk7CisgICAgICAgIEFMT0dWKCJkZWNvZGVUaW1lPSU2ZCBkZWxheT0lNmQgbnVtQnl0ZXM9JTZkIiwgZGVjb2RlVGltZSwgZGVsYXksCisgICAgICAgICAgICAgIHNfZGVjb2RlX29wLnU0X251bV9ieXRlc19jb25zdW1lZCk7CisgICAgICAgIGlmIChJVkRfTUVNX0FMTE9DX0ZBSUxFRCA9PSAoc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSAmIElWRF9FUlJPUl9NQVNLKSkgeworICAgICAgICAgICAgQUxPR0UoImFsbG9jYXRpb24gZmFpbHVyZSBpbiBkZWNvZGVyIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChJVkRfU1RSRUFNX1dJRFRIX0hFSUdIVF9OT1RfU1VQUE9SVEVEID09CisgICAgICAgICAgICAgICAgICAgKHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUgJiBJVkRfRVJST1JfTUFTSykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ1bnN1cHBvcnRlZCByZXNvbHV0aW9uIDogJWR4JWQiLCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoSVZEX1JFU19DSEFOR0VEID09IChzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlICYgSVZEX0VSUk9SX01BU0spKSB7CisgICAgICAgICAgICBBTE9HVigicmVzb2x1dGlvbiBjaGFuZ2VkIik7CisgICAgICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9OT19FT1MsIHBvb2wsIHdvcmspOworICAgICAgICAgICAgcmVzZXREZWNvZGVyKCk7CisgICAgICAgICAgICByZXNldFBsdWdpbigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKworICAgICAgICAgICAgLyogRGVjb2RlIGhlYWRlciBhbmQgZ2V0IG5ldyBkaW1lbnNpb25zICovCisgICAgICAgICAgICBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9IRUFERVIpOworICAgICAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIH0gZWxzZSBpZiAoSVNfSVZEX0ZBVEFMX0VSUk9SKHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUpKSB7CisgICAgICAgICAgICBBTE9HRSgiRmF0YWwgZXJyb3IgaW4gZGVjb2RlciAweCV4Iiwgc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoMCA8IHNfZGVjb2RlX29wLnU0X3BpY193ZCAmJiAwIDwgc19kZWNvZGVfb3AudTRfcGljX2h0KSB7CisgICAgICAgICAgICBpZiAobUhlYWRlckRlY29kZWQgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICBtSGVhZGVyRGVjb2RlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgc2V0UGFyYW1zKEFMSUdONjQoc19kZWNvZGVfb3AudTRfcGljX3dkKSwgSVZEX0RFQ09ERV9GUkFNRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc19kZWNvZGVfb3AudTRfcGljX3dkICE9IG1XaWR0aCB8fCAgc19kZWNvZGVfb3AudTRfcGljX2h0ICE9IG1IZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBtV2lkdGggPSBzX2RlY29kZV9vcC51NF9waWNfd2Q7CisgICAgICAgICAgICAgICAgbUhlaWdodCA9IHNfZGVjb2RlX29wLnU0X3BpY19odDsKKyAgICAgICAgICAgICAgICBDSEVDS19FUSgwdSwgc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpOworCisgICAgICAgICAgICAgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCBzaXplKDB1LCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAgICAgICAgICBtSW50Zi0+Y29uZmlnKHsmc2l6ZX0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShzaXplKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBzZXQgd2lkdGggYW5kIGhlaWdodCIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKHZvaWQpIGdldFZ1aVBhcmFtcygpOworICAgICAgICBoYXNQaWN0dXJlIHw9ICgxID09IHNfZGVjb2RlX29wLnU0X2ZyYW1lX2RlY29kZWRfZmxhZyk7CisgICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgZmluaXNoV29yayhzX2RlY29kZV9vcC51NF90cywgd29yayk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKDAgPT0gc19kZWNvZGVfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkKSB7CisgICAgICAgICAgICBBTE9HRCgiQnl0ZXMgY29uc3VtZWQgaXMgemVyby4gSWdub3JpbmcgcmVtYWluaW5nIGJ5dGVzIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpblBvcyArPSBzX2RlY29kZV9vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQ7CisgICAgICAgIGlmIChoYXNQaWN0dXJlICYmIChpblNpemUgLSBpblBvcykpIHsKKyAgICAgICAgICAgIEFMT0dEKCJkZWNvZGVkIGZyYW1lIGluIGN1cnJlbnQgYWNjZXNzIG5hbCwgaWdub3JpbmcgZnVydGhlciB0cmFpbGluZyBieXRlcyAlZCIsCisgICAgICAgICAgICAgICAgICAoaW50KWluU2l6ZSAtIChpbnQpaW5Qb3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TLCBwb29sLCB3b3JrKTsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgfSBlbHNlIGlmICghaGFzUGljdHVyZSkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6ZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICBpZiAoT0sgIT0gc2V0Rmx1c2hNb2RlKCkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWYgKEMyX09LICE9IGVuc3VyZURlY29kZXJTdGF0ZShwb29sKSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBtT3V0QmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOworICAgICAgICBpZiAoIXNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsIG51bGxwdHIsICZ3VmlldywgMCwgMCwgMCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICBmaW5pc2hXb3JrKHNfZGVjb2RlX29wLnU0X3RzLCB3b3JrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIHJldHVybiBkcmFpbkludGVybmFsKGRyYWluTW9kZSwgcG9vbCwgbnVsbHB0cik7Cit9CisKK2NsYXNzIEMyU29mdEhldmNEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0SGV2Y0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEhldmNEZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0SGV2Y0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRIZXZjRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0SGV2Y0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEhldmNEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRIZXZjRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NjY0ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuaApAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0hFVkNfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9IRVZDX0RFQ19IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgImloZXZjX3R5cGVkZWZzLmgiCisjaW5jbHVkZSAiaXYuaCIKKyNpbmNsdWRlICJpdmQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIGl2ZGVjX2FwaV9mdW5jdGlvbiAgICAgICAgICAgICAgaWhldmNkX2N4YV9hcGlfZnVuY3Rpb24KKyNkZWZpbmUgaXZkZXh0X2NyZWF0ZV9pcF90ICAgICAgICAgICAgICBpaGV2Y2RfY3hhX2NyZWF0ZV9pcF90CisjZGVmaW5lIGl2ZGV4dF9jcmVhdGVfb3BfdCAgICAgICAgICAgICAgaWhldmNkX2N4YV9jcmVhdGVfb3BfdAorI2RlZmluZSBpdmRleHRfZGVsZXRlX2lwX3QgICAgICAgICAgICAgIGloZXZjZF9jeGFfZGVsZXRlX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2RlbGV0ZV9vcF90ICAgICAgICAgICAgICBpaGV2Y2RfY3hhX2RlbGV0ZV9vcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90ICAgaWhldmNkX2N4YV9jdGxfc2V0X251bV9jb3Jlc19pcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90ICAgaWhldmNkX2N4YV9jdGxfc2V0X251bV9jb3Jlc19vcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfZ2V0X3Z1aV9wYXJhbXNfaXBfdCAgaWhldmNkX2N4YV9jdGxfZ2V0X3Z1aV9wYXJhbXNfaXBfdAorI2RlZmluZSBpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX29wX3QgIGloZXZjZF9jeGFfY3RsX2dldF92dWlfcGFyYW1zX29wX3QKKyNkZWZpbmUgQUxJR042NCh4KSAgICAgICAgICAgICAgICAgICAgICAoKCgoeCkgKyA2MykgPj4gNikgPDwgNikKKyNkZWZpbmUgTUFYX05VTV9DT1JFUyAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMgICAgXAorICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKUlIRVZDRF9DWEFfQ01EX0NUTF9TRVRfTlVNX0NPUkVTCisjZGVmaW5lIE1JTihhLCBiKSAgICAgICAgICAgICAgICAgICAgICAgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorI2RlZmluZSBHRVRUSU1FKGEsIGIpICAgICAgICAgICAgICAgICAgIGdldHRpbWVvZmRheShhLCBiKTsKKyNkZWZpbmUgVElNRV9ESUZGKHN0YXJ0LCBlbmQsIGRpZmYpICAgICBcCisgICAgZGlmZiA9ICgoKGVuZCkudHZfc2VjIC0gKHN0YXJ0KS50dl9zZWMpICogMTAwMDAwMCkgKyBcCisgICAgICAgICAgICAoKGVuZCkudHZfdXNlYyAtIChzdGFydCkudHZfdXNlYyk7CisKKworc3RydWN0IEMyU29mdEhldmNEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0SGV2Y0RlYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0SGV2Y0RlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyBwcml2YXRlOgorICAgIHN0YXR1c190IGNyZWF0ZURlY29kZXIoKTsKKyAgICBzdGF0dXNfdCBzZXROdW1Db3JlcygpOworICAgIHN0YXR1c190IHNldFBhcmFtcyhzaXplX3Qgc3RyaWRlLCBJVkRfVklERU9fREVDT0RFX01PREVfVCBkZWNfbW9kZSk7CisgICAgc3RhdHVzX3QgZ2V0VmVyc2lvbigpOworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgYm9vbCBzZXREZWNvZGVBcmdzKGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjb2RlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY29kZV9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgQzJSZWFkVmlldyAqaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgKm91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0c01hcmtlcik7CisgICAgYm9vbCBnZXRWdWlQYXJhbXMoKTsKKyAgICAvLyBUT0RPOlRoaXMgaXMgbm90IHRoZSByaWdodCBwbGFjZSBmb3IgY29sb3JBc3BlY3RzIGZ1bmN0aW9ucy4gVGhlc2Ugc2hvdWxkCisgICAgLy8gYmUgcGFydCBvZiBjMi12bmRrIHNvIHRoYXQgdGhleSBjYW4gYmUgYWNjZXNzZWQgYnkgYWxsIHZpZGVvIHBsdWdpbnMKKyAgICAvLyB1bnRpbCB0aGVuLCBtYWtlIHRoZW0gZmVlbCBhdCBob21lCisgICAgYm9vbCBjb2xvckFzcGVjdHNEaWZmZXIoY29uc3QgQ29sb3JBc3BlY3RzICZhLCBjb25zdCBDb2xvckFzcGVjdHMgJmIpOworICAgIHZvaWQgdXBkYXRlRmluYWxDb2xvckFzcGVjdHMoCisgICAgICAgICAgICBjb25zdCBDb2xvckFzcGVjdHMgJm90aGVyQXNwZWN0cywgY29uc3QgQ29sb3JBc3BlY3RzICZwcmVmZXJyZWRBc3BlY3RzKTsKKyAgICBzdGF0dXNfdCBoYW5kbGVDb2xvckFzcGVjdHNDaGFuZ2UoKTsKKyAgICBjMl9zdGF0dXNfdCBlbnN1cmVEZWNvZGVyU3RhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCk7CisgICAgdm9pZCBmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisgICAgc3RhdHVzX3Qgc2V0Rmx1c2hNb2RlKCk7CisgICAgYzJfc3RhdHVzX3QgZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisgICAgc3RhdHVzX3QgcmVzZXREZWNvZGVyKCk7CisgICAgdm9pZCByZXNldFBsdWdpbigpOworICAgIHN0YXR1c190IGRlbGV0ZURlY29kZXIoKTsKKworICAgIC8vIFRPRE86VGhpcyBpcyBub3QgdGhlIHJpZ2h0IHBsYWNlIGZvciB0aGlzIGVudW0uIFRoZXNlIHNob3VsZAorICAgIC8vIGJlIHBhcnQgb2YgYzItdm5kayBzbyB0aGF0IHRoZXkgY2FuIGJlIGFjY2Vzc2VkIGJ5IGFsbCB2aWRlbyBwbHVnaW5zCisgICAgLy8gdW50aWwgdGhlbiwgbWFrZSB0aGVtIGZlZWwgYXQgaG9tZQorICAgIGVudW0geworICAgICAgICBrTm90U3VwcG9ydGVkLAorICAgICAgICBrUHJlZmVyQml0c3RyZWFtLAorICAgICAgICBrUHJlZmVyQ29udGFpbmVyLAorICAgIH07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIGl2X29ial90ICptRGVjSGFuZGxlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gbU91dEJsb2NrOworICAgIHVpbnQ4X3QgKm1PdXRCdWZmZXJGbHVzaDsKKworICAgIHNpemVfdCBtTnVtQ29yZXM7CisgICAgSVZfQ09MT1JfRk9STUFUX1QgbUl2Q29sb3Jmb3JtYXQ7CisKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKKyAgICB1aW50MzJfdCBtU3RyaWRlOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1IZWFkZXJEZWNvZGVkOworICAgIHN0ZDo6YXRvbWljX3VpbnQ2NF90IG1PdXRJbmRleDsKKworICAgIC8vIENvbG9yIGFzcGVjdHMuIFRoZXNlIGFyZSBJU08gdmFsdWVzIGFuZCBhcmUgbWVhbnQgdG8gZGV0ZWN0IGNoYW5nZXMgaW4gYXNwZWN0cyB0byBhdm9pZAorICAgIC8vIGNvbnZlcnRpbmcgdGhlbSB0byBDMiB2YWx1ZXMgZm9yIGVhY2ggZnJhbWUKKyAgICBzdHJ1Y3QgVnVpQ29sb3JBc3BlY3RzIHsKKyAgICAgICAgdWludDhfdCBwcmltYXJpZXM7CisgICAgICAgIHVpbnQ4X3QgdHJhbnNmZXI7CisgICAgICAgIHVpbnQ4X3QgY29lZmZzOworICAgICAgICB1aW50OF90IGZ1bGxSYW5nZTsKKworICAgICAgICAvLyBkZWZhdWx0IGNvbG9yIGFzcGVjdHMKKyAgICAgICAgVnVpQ29sb3JBc3BlY3RzKCkKKyAgICAgICAgICAgIDogcHJpbWFyaWVzKDIpLCB0cmFuc2ZlcigyKSwgY29lZmZzKDIpLCBmdWxsUmFuZ2UoMCkgeyB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZ1aUNvbG9yQXNwZWN0cyAmbykgeworICAgICAgICAgICAgcmV0dXJuIHByaW1hcmllcyA9PSBvLnByaW1hcmllcyAmJiB0cmFuc2ZlciA9PSBvLnRyYW5zZmVyICYmIGNvZWZmcyA9PSBvLmNvZWZmcworICAgICAgICAgICAgICAgICAgICAmJiBmdWxsUmFuZ2UgPT0gby5mdWxsUmFuZ2U7CisgICAgICAgIH0KKyAgICB9IG1CaXRzdHJlYW1Db2xvckFzcGVjdHM7CisKKyAgICAvLyBwcm9maWxlCisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVTdGFydDsKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZUVuZDsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEhldmNEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfSEVWQ19ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0VuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxMjliMWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuY3BwCkBAIC0wLDAgKzEsOTc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRIZXZjRW5jIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDb2RlYzJCdWZmZXJVdGlscy5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorCisjaW5jbHVkZSAiaWhldmNfdHlwZWRlZnMuaCIKKyNpbmNsdWRlICJpdHRfdmlkZW9fYXBpLmgiCisjaW5jbHVkZSAiaWhldmNlX2FwaS5oIgorI2luY2x1ZGUgImloZXZjZV9wbHVnaW4uaCIKKyNpbmNsdWRlICJDMlNvZnRIZXZjRW5jLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmhldmMuZW5jb2RlciI7CisKK30gLy8gbmFtZXBzYWNlCisKK2NsYXNzIEMyU29mdEhldmNFbmM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fVklERU8sCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQykgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7IC8vIFRPRE86IGFjY291bnQgZm9yIG91ciBidWZmZXJzIGhlcmUKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWN0dWFsSW5wdXREZWxheSwgQzJfUEFSQU1LRVlfSU5QVVRfREVMQVkpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQl9GUkFNRVMgKyBERUZBVUxUX1JDX0xPT0tBSEVBRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQWN0dWFsSW5wdXREZWxheSwgdmFsdWUpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgIDAsIE1BWF9CX0ZSQU1FUyArIE1BWF9SQ19MT09LQUhFQUQpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgU2V0dGVyPGRlY2x0eXBlKCptQWN0dWFsSW5wdXREZWxheSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoCisgICAgICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVVzYWdlLCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fVVNBR0UpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbVVzYWdlVHVuaW5nOjppbnB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCAodWludDY0X3QpQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBtYXRjaGVzIHNpemUgbGltaXRzIGluIGNvZGVjIGxpYnJhcnkKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAxOTIwLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMTA4OCwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtRnJhbWVSYXRlLCBDMl9QQVJBTUtFWV9GUkFNRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDMwLikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRnJhbWVSYXRlLCB2YWx1ZSkuZ3JlYXRlclRoYW4oMC4pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgU2V0dGVyPGRlY2x0eXBlKCptRnJhbWVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gbWF0Y2hlcyBsaW1pdHMgaW4gY29kZWMgbGlicmFyeQorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZU1vZGUsIEMyX1BBUkFNS0VZX0JJVFJBVEVfTU9ERSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZU1vZGVUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbmZpZzo6QklUUkFURV9WQVJJQUJMRSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUJpdHJhdGVNb2RlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkJJVFJBVEVfQ09OU1QsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6QklUUkFURV9WQVJJQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpCSVRSQVRFX0lHTk9SRX0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZU1vZGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dCgwdSwgNjQwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDQwOTYsIDEyMDAwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQml0cmF0ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gbWF0Y2hlcyBsZXZlbHMgYWxsb3dlZCB3aXRoaW4gY29kZWMgbGlicmFyeQorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbXBsZXhpdHksIEMyX1BBUkFNS0VZX0NPTVBMRVhJVFkpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbXBsZXhpdHlUdW5pbmc6Om91dHB1dCgwdSwgMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ29tcGxleGl0eSwgdmFsdWUpLmluUmFuZ2UoMCwgMTApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1Db21wbGV4aXR5KT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1RdWFsaXR5LCBDMl9QQVJBTUtFWV9RVUFMSVRZKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1RdWFsaXR5VHVuaW5nOjpvdXRwdXQoMHUsIDgwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1RdWFsaXR5LCB2YWx1ZSkuaW5SYW5nZSgwLCAxMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1RdWFsaXR5KT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAwdSwgUFJPRklMRV9IRVZDX01BSU4sIExFVkVMX0hFVkNfTUFJTl8xKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgLm9uZU9mKHtDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl9TVElMTH0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpCisgICAgICAgICAgICAgICAgICAgICAgICAub25lT2Yoe0xFVkVMX0hFVkNfTUFJTl8xLCBMRVZFTF9IRVZDX01BSU5fMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfSEVWQ19NQUlOXzJfMSwgTEVWRUxfSEVWQ19NQUlOXzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0hFVkNfTUFJTl8zXzEsIExFVkVMX0hFVkNfTUFJTl80LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9IRVZDX01BSU5fNF8xLCBMRVZFTF9IRVZDX01BSU5fNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfSEVWQ19NQUlOXzVfMSwgTEVWRUxfSEVWQ19NQUlOXzVfMn0pLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSwgbUZyYW1lUmF0ZSwgbUJpdHJhdGUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUmVxdWVzdFN5bmMsIEMyX1BBUkFNS0VZX1JFUVVFU1RfU1lOQ19GUkFNRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0KDB1LCBDMl9GQUxTRSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtUmVxdWVzdFN5bmMsIHZhbHVlKS5vbmVPZih7IEMyX0ZBTFNFLCBDMl9UUlVFIH0pIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptUmVxdWVzdFN5bmMpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtU3luY0ZyYW1lUGVyaW9kLCBDMl9QQVJBTUtFWV9TWU5DX0ZSQU1FX0lOVEVSVkFMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdCgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc6Om91dHB1dCgwdSwgMTAwMDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU3luY0ZyYW1lUGVyaW9kLCB2YWx1ZSkuYW55KCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgICAgICBTZXR0ZXI8ZGVjbHR5cGUoKm1TeW5jRnJhbWVQZXJpb2QpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEJpdHJhdGVTZXR0ZXIoYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4mIG1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAobWUudi52YWx1ZSA8IDQwOTYpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnZhbHVlID0gNDA5NjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiYgb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+JiBtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcigKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+ICZzaXplLAorICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiAmZnJhbWVSYXRlLAorICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gJmJpdHJhdGUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmICghbWUuRihtZS52LnByb2ZpbGUpLnN1cHBvcnRzQXRBbGwobWUudi5wcm9maWxlKSkgeworICAgICAgICAgICAgbWUuc2V0KCkucHJvZmlsZSA9IFBST0ZJTEVfSEVWQ19NQUlOOworICAgICAgICB9CisKKyAgICAgICAgc3RydWN0IExldmVsTGltaXRzIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpsZXZlbF90IGxldmVsOworICAgICAgICAgICAgdWludDY0X3Qgc2FtcGxlc1BlclNlYzsKKyAgICAgICAgICAgIHVpbnQ2NF90IHNhbXBsZXM7CisgICAgICAgICAgICB1aW50MzJfdCBiaXRyYXRlOworICAgICAgICB9OworCisgICAgICAgIGNvbnN0ZXhwciBMZXZlbExpbWl0cyBrTGltaXRzW10gPSB7CisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl8xLCAgICAgICA1NTI5NjAsICAgIDM2ODY0LCAgICAxMjgwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzIsICAgICAgMzY4NjQwMCwgICAxMjI4ODAsICAgMTUwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fMl8xLCAgICA3MzcyODAwLCAgIDI0NTc2MCwgICAzMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl8zLCAgICAgMTY1ODg4MDAsICAgNTUyOTYwLCAgIDYwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzNfMSwgICAzMzE3NzYwMCwgICA5ODMwNDAsICAxMDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNCwgICAgIDY2ODQ2NzIwLCAgMjIyODIyNCwgIDEyMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl80XzEsICAxMzM2OTM0NDAsICAyMjI4MjI0LCAgMjAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzUsICAgIDI2NzM4Njg4MCwgIDg5MTI4OTYsICAyNTAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNV8xLCAgNTM0NzczNzYwLCAgODkxMjg5NiwgIDQwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl81XzIsIDEwNjk1NDc1MjAsICA4OTEyODk2LCAgNjAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzYsICAgMTA2OTU0NzUyMCwgMzU2NTE1ODQsICA2MDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNl8xLCAyMTM5MDk1MDQwLCAzNTY1MTU4NCwgMTIwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl82XzIsIDQyNzgxOTAwODAsIDM1NjUxNTg0LCAyNDAwMDAwMDAgfSwKKyAgICAgICAgfTsKKworICAgICAgICB1aW50NjRfdCBzYW1wbGVzID0gc2l6ZS52LndpZHRoICogc2l6ZS52LmhlaWdodDsKKyAgICAgICAgdWludDY0X3Qgc2FtcGxlc1BlclNlYyA9IHNhbXBsZXMgKiBmcmFtZVJhdGUudi52YWx1ZTsKKworICAgICAgICAvLyBDaGVjayBpZiB0aGUgc3VwcGxpZWQgbGV2ZWwgbWVldHMgdGhlIE1CIC8gYml0cmF0ZSByZXF1aXJlbWVudHMuIElmCisgICAgICAgIC8vIG5vdCwgdXBkYXRlIHRoZSBsZXZlbCB3aXRoIHRoZSBsb3dlc3QgbGV2ZWwgbWVldGluZyB0aGUgcmVxdWlyZW1lbnRzLgorCisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgLy8gQnkgZGVmYXVsdCBuZWVkc1VwZGF0ZSA9IGZhbHNlIGluIGNhc2UgdGhlIHN1cHBsaWVkIGxldmVsIGRvZXMgbWVldAorICAgICAgICAvLyB0aGUgcmVxdWlyZW1lbnRzLgorICAgICAgICBib29sIG5lZWRzVXBkYXRlID0gZmFsc2U7CisgICAgICAgIGZvciAoY29uc3QgTGV2ZWxMaW1pdHMgJmxpbWl0IDoga0xpbWl0cykgeworICAgICAgICAgICAgaWYgKHNhbXBsZXMgPD0gbGltaXQuc2FtcGxlcyAmJiBzYW1wbGVzUGVyU2VjIDw9IGxpbWl0LnNhbXBsZXNQZXJTZWMgJiYKKyAgICAgICAgICAgICAgICAgICAgYml0cmF0ZS52LnZhbHVlIDw9IGxpbWl0LmJpdHJhdGUpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBsb3dlc3QgbGV2ZWwgdGhhdCBtZWV0cyB0aGUgcmVxdWlyZW1lbnRzLCBhbmQgaWYKKyAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlbid0IHNlZW4gdGhlIHN1cHBsaWVkIGxldmVsIHlldCwgdGhhdCBtZWFucyB3ZSBkb24ndAorICAgICAgICAgICAgICAgIC8vIG5lZWQgdGhlIHVwZGF0ZS4KKyAgICAgICAgICAgICAgICBpZiAobmVlZHNVcGRhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkdpdmVuIGxldmVsICV4IGRvZXMgbm90IGNvdmVyIGN1cnJlbnQgY29uZmlndXJhdGlvbjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRqdXN0aW5nIHRvICV4IiwgbWUudi5sZXZlbCwgbGltaXQubGV2ZWwpOworICAgICAgICAgICAgICAgICAgICBtZS5zZXQoKS5sZXZlbCA9IGxpbWl0LmxldmVsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWUudi5sZXZlbCA9PSBsaW1pdC5sZXZlbCkgeworICAgICAgICAgICAgICAgIC8vIFdlIGJyZWFrIG91dCBvZiB0aGUgbG9vcCB3aGVuIHRoZSBsb3dlc3QgZmVhc2libGUgbGV2ZWwgaXMKKyAgICAgICAgICAgICAgICAvLyBmb3VuZC4gVGhlIGZhY3QgdGhhdCB3ZSdyZSBoZXJlIG1lYW5zIHRoYXQgb3VyIGxldmVsIGRvZXNuJ3QKKyAgICAgICAgICAgICAgICAvLyBtZWV0IHRoZSByZXF1aXJlbWVudCBhbmQgbmVlZHMgdG8gYmUgdXBkYXRlZC4KKyAgICAgICAgICAgICAgICBuZWVkc1VwZGF0ZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgLy8gV2Ugc2V0IHRvIHRoZSBoaWdoZXN0IHN1cHBvcnRlZCBsZXZlbC4KKyAgICAgICAgICAgIG1lLnNldCgpLmxldmVsID0gTEVWRUxfSEVWQ19NQUlOXzVfMjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIFVXT1JEMzIgZ2V0UHJvZmlsZV9sKCkgY29uc3QgeworICAgICAgICBzd2l0Y2ggKG1Qcm9maWxlTGV2ZWwtPnByb2ZpbGUpIHsKKyAgICAgICAgY2FzZSBQUk9GSUxFX0hFVkNfTUFJTjogIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgY2FzZSBQUk9GSUxFX0hFVkNfTUFJTl9TVElMTDogcmV0dXJuIDE7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRCgiVW5yZWNvZ25pemVkIHByb2ZpbGU6ICV4IiwgbVByb2ZpbGVMZXZlbC0+cHJvZmlsZSk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFVXT1JEMzIgZ2V0TGV2ZWxfbCgpIGNvbnN0IHsKKyAgICAgICAgc3RydWN0IExldmVsIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpsZXZlbF90IGMyTGV2ZWw7CisgICAgICAgICAgICBVV09SRDMyIGhldmNMZXZlbDsKKyAgICAgICAgfTsKKyAgICAgICAgY29uc3RleHByIExldmVsIGxldmVsc1tdID0geworICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fMSwgICAgMzAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzIsICAgIDYwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl8yXzEsICA2MyB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fMywgICAgOTAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzNfMSwgIDkzIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl80LCAgIDEyMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNF8xLCAxMjMgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzUsICAgMTUwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl81XzEsIDE1MyB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNV8yLCAxNTYgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzYsICAgMTgwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl82XzEsIDE4MyB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNl8yLCAxODYgfSwKKyAgICAgICAgfTsKKyAgICAgICAgZm9yIChjb25zdCBMZXZlbCAmbGV2ZWwgOiBsZXZlbHMpIHsKKyAgICAgICAgICAgIGlmIChtUHJvZmlsZUxldmVsLT5sZXZlbCA9PSBsZXZlbC5jMkxldmVsKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxldmVsLmhldmNMZXZlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HRCgiVW5yZWNvZ25pemVkIGxldmVsOiAleCIsIG1Qcm9maWxlTGV2ZWwtPmxldmVsKTsKKyAgICAgICAgcmV0dXJuIDE1NjsKKyAgICB9CisgICAgdWludDMyX3QgZ2V0U3luY0ZyYW1lUGVyaW9kX2woKSBjb25zdCB7CisgICAgICAgIGlmIChtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSA8IDAgfHwKKyAgICAgICAgICAgIG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlID09IElOVDY0X01BWCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgZG91YmxlIHBlcmlvZCA9IG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlIC8gMWU2ICogbUZyYW1lUmF0ZS0+dmFsdWU7CisgICAgICAgIHJldHVybiAodWludDMyX3QpYzJfbWF4KGMyX21pbihwZXJpb2QgKyAwLjUsIGRvdWJsZShVSU5UMzJfTUFYKSksIDEuKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBnZXRTaXplX2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU2l6ZTsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBnZXRGcmFtZVJhdGVfbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1GcmFtZVJhdGU7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVNb2RlVHVuaW5nOjpvdXRwdXQ+IGdldEJpdHJhdGVNb2RlX2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQml0cmF0ZU1vZGU7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IGdldEJpdHJhdGVfbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1CaXRyYXRlOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+IGdldFJlcXVlc3RTeW5jX2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUmVxdWVzdFN5bmM7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbXBsZXhpdHlUdW5pbmc6Om91dHB1dD4gZ2V0Q29tcGxleGl0eV9sKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNvbXBsZXhpdHk7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVF1YWxpdHlUdW5pbmc6Om91dHB1dD4gZ2V0UXVhbGl0eV9sKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVF1YWxpdHk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVVzYWdlVHVuaW5nOjppbnB1dD4gbVVzYWdlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gbUZyYW1lUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+IG1SZXF1ZXN0U3luYzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlTW9kZVR1bmluZzo6b3V0cHV0PiBtQml0cmF0ZU1vZGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29tcGxleGl0eVR1bmluZzo6b3V0cHV0PiBtQ29tcGxleGl0eTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1RdWFsaXR5VHVuaW5nOjpvdXRwdXQ+IG1RdWFsaXR5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TeW5jRnJhbWVJbnRlcnZhbFR1bmluZzo6b3V0cHV0PiBtU3luY0ZyYW1lUGVyaW9kOworfTsKKworc3RhdGljIHNpemVfdCBHZXRDUFVDb3JlQ291bnQoKSB7CisgICAgbG9uZyBjcHVDb3JlQ291bnQgPSAwOworCisjaWYgZGVmaW5lZChfU0NfTlBST0NFU1NPUlNfT05MTikKKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKyNlbHNlCisgICAgLy8gX1NDX05QUk9DX09OTE4gbXVzdCBiZSBkZWZpbmVkLi4uCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NfT05MTik7CisjZW5kaWYKKworICAgIGlmIChjcHVDb3JlQ291bnQgPCAxKQorICAgICAgICBjcHVDb3JlQ291bnQgPSAxOworICAgIHJldHVybiAoc2l6ZV90KWNwdUNvcmVDb3VudDsKK30KKworQzJTb2Z0SGV2Y0VuYzo6QzJTb2Z0SGV2Y0VuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1JdlZpZGVvQ29sb3JGb3JtYXQoSVZfWVVWXzQyMFApLAorICAgICAgbUhldmNFbmNQcm9maWxlKDEpLAorICAgICAgbUhldmNFbmNMZXZlbCgzMCksCisgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtU3BzUHBzSGVhZGVyUmVjZWl2ZWQoZmFsc2UpLAorICAgICAgbVNpZ25hbGxlZEVvcyhmYWxzZSksCisgICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpLAorICAgICAgbUNvZGVjQ3R4KG51bGxwdHIpIHsKKyAgICAvLyBJZiBkdW1wIGlzIGVuYWJsZWQsIHRoZW4gY3JlYXRlIGFuIGVtcHR5IGZpbGUKKyAgICBHRU5FUkFURV9GSUxFX05BTUVTKCk7CisgICAgQ1JFQVRFX0RVTVBfRklMRShtSW5GaWxlKTsKKyAgICBDUkVBVEVfRFVNUF9GSUxFKG1PdXRGaWxlKTsKKworICAgIGdldHRpbWVvZmRheSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgZ2V0dGltZW9mZGF5KCZtVGltZUVuZCwgbnVsbHB0cik7Cit9CisKK0MyU29mdEhldmNFbmM6On5DMlNvZnRIZXZjRW5jKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRW5jOjpvbkluaXQoKSB7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRW5jOjpvblN0b3AoKSB7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEhldmNFbmM6Om9uUmVzZXQoKSB7CisgICAgcmVsZWFzZUVuY29kZXIoKTsKK30KKwordm9pZCBDMlNvZnRIZXZjRW5jOjpvblJlbGVhc2UoKSB7CisgICAgcmVsZWFzZUVuY29kZXIoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0VuYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigiU2lnbmFsbGluZyBFT1MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3N0YXRpYyBpbnQgZ2V0UXBGcm9tUXVhbGl0eShpbnQgcXVhbGl0eSkgeworICAgIGludCBxcDsKKyNkZWZpbmUgTUlOX1FQIDQKKyNkZWZpbmUgTUFYX1FQIDUwCisgICAgLyogUXVhbGl0eTogMTAwIC0+IFFwIDogTUlOX1FQCisgICAgICogUXVhbGl0eTogMCAtPiBRcCA6IE1BWF9RUAorICAgICAqIFFwID0gKChNSU5fUVAgLSBNQVhfUVApICogcXVhbGl0eSAvIDEwMCkgKyBNQVhfUVA7CisgICAgICovCisgICAgcXAgPSAoKE1JTl9RUCAtIE1BWF9RUCkgKiBxdWFsaXR5IC8gMTAwKSArIE1BWF9RUDsKKyAgICBxcCA9IHN0ZDo6bWluKHFwLCBNQVhfUVApOworICAgIHFwID0gc3RkOjptYXgocXAsIE1JTl9RUCk7CisgICAgcmV0dXJuIHFwOworfQorYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0VuYzo6aW5pdEVuY1BhcmFtcygpIHsKKyAgICBtQ29kZWNDdHggPSBudWxscHRyOworICAgIG1OdW1Db3JlcyA9IHN0ZDo6bWluKEdldENQVUNvcmVDb3VudCgpLCAoc2l6ZV90KSBDT0RFQ19NQVhfQ09SRVMpOworICAgIG1lbXNldCgmbUVuY1BhcmFtcywgMCwgc2l6ZW9mKGloZXZjZV9zdGF0aWNfY2ZnX3BhcmFtc190KSk7CisKKyAgICAvLyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyAgICBJSEVWQ0VfUExVR0lOX1NUQVRVU19UIGVyciA9IGloZXZjZV9zZXRfZGVmX3BhcmFtcygmbUVuY1BhcmFtcyk7CisgICAgaWYgKElIRVZDRV9FT0sgIT0gZXJyKSB7CisgICAgICAgIEFMT0dFKCJIRVZDIGRlZmF1bHQgaW5pdCBmYWlsZWQgOiAweCV4IiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICAvLyB1cGRhdGUgY29uZmlndXJhdGlvbgorICAgIG1FbmNQYXJhbXMuc19zcmNfcHJtcy5pNF93aWR0aCA9IG1TaXplLT53aWR0aDsKKyAgICBtRW5jUGFyYW1zLnNfc3JjX3BybXMuaTRfaGVpZ2h0ID0gbVNpemUtPmhlaWdodDsKKyAgICBtRW5jUGFyYW1zLnNfc3JjX3BybXMuaTRfZnJtX3JhdGVfZGVub20gPSAxMDAwOworICAgIG1FbmNQYXJhbXMuc19zcmNfcHJtcy5pNF9mcm1fcmF0ZV9udW0gPQorICAgICAgICBtRnJhbWVSYXRlLT52YWx1ZSAqIG1FbmNQYXJhbXMuc19zcmNfcHJtcy5pNF9mcm1fcmF0ZV9kZW5vbTsKKyAgICBtRW5jUGFyYW1zLnNfdGd0X2x5cl9wcm1zLmFzX3RndF9wYXJhbXNbMF0uaTRfcXVhbGl0eV9wcmVzZXQgPSBJSEVWQ0VfUVVBTElUWV9QNTsKKyAgICBtRW5jUGFyYW1zLnNfdGd0X2x5cl9wcm1zLmFzX3RndF9wYXJhbXNbMF0uYWk0X3RndF9iaXRyYXRlWzBdID0KKyAgICAgICAgbUJpdHJhdGUtPnZhbHVlOworICAgIG1FbmNQYXJhbXMuc190Z3RfbHlyX3BybXMuYXNfdGd0X3BhcmFtc1swXS5haTRfcGVha19iaXRyYXRlWzBdID0KKyAgICAgICAgbUJpdHJhdGUtPnZhbHVlIDw8IDE7CisgICAgbUVuY1BhcmFtcy5zX3RndF9seXJfcHJtcy5hc190Z3RfcGFyYW1zWzBdLmk0X2NvZGVjX2xldmVsID0gbUhldmNFbmNMZXZlbDsKKyAgICBtRW5jUGFyYW1zLnNfY29kaW5nX3Rvb2xzX3BybXMuaTRfbWF4X2lfb3Blbl9nb3BfcGVyaW9kID0gbUlEUkludGVydmFsOworICAgIG1FbmNQYXJhbXMuc19jb2RpbmdfdG9vbHNfcHJtcy5pNF9tYXhfY3JhX29wZW5fZ29wX3BlcmlvZCA9IG1JRFJJbnRlcnZhbDsKKyAgICBtSXZWaWRlb0NvbG9yRm9ybWF0ID0gSVZfWVVWXzQyMFA7CisgICAgbUVuY1BhcmFtcy5zX211bHRpX3RocmRfcHJtcy5pNF9tYXhfbnVtX2NvcmVzID0gbU51bUNvcmVzOworICAgIG1FbmNQYXJhbXMuc19vdXRfc3RybV9wcm1zLmk0X2NvZGVjX3Byb2ZpbGUgPSBtSGV2Y0VuY1Byb2ZpbGU7CisgICAgbUVuY1BhcmFtcy5zX2xhcF9wcm1zLmk0X3JjX2xvb2tfYWhlYWRfcGljcyA9IERFRkFVTFRfUkNfTE9PS0FIRUFEOworICAgIG1FbmNQYXJhbXMuc19jb2RpbmdfdG9vbHNfcHJtcy5pNF9tYXhfdGVtcG9yYWxfbGF5ZXJzID0gREVGQVVMVF9CX0ZSQU1FUzsKKworICAgIHN3aXRjaCAobUJpdHJhdGVNb2RlLT52YWx1ZSkgeworICAgICAgICBjYXNlIEMyQ29uZmlnOjpCSVRSQVRFX0lHTk9SRToKKyAgICAgICAgICAgIG1FbmNQYXJhbXMuc19jb25maWdfcHJtcy5pNF9yYXRlX2NvbnRyb2xfbW9kZSA9IDM7CisgICAgICAgICAgICBtRW5jUGFyYW1zLnNfdGd0X2x5cl9wcm1zLmFzX3RndF9wYXJhbXNbMF0uYWk0X2ZyYW1lX3FwWzBdID0KKyAgICAgICAgICAgICAgICBnZXRRcEZyb21RdWFsaXR5KG1RdWFsaXR5LT52YWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbmZpZzo6QklUUkFURV9DT05TVDoKKyAgICAgICAgICAgIG1FbmNQYXJhbXMuc19jb25maWdfcHJtcy5pNF9yYXRlX2NvbnRyb2xfbW9kZSA9IDU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbmZpZzo6QklUUkFURV9WQVJJQUJMRToKKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIG1FbmNQYXJhbXMuc19jb25maWdfcHJtcy5pNF9yYXRlX2NvbnRyb2xfbW9kZSA9IDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgaWYgKG1Db21wbGV4aXR5LT52YWx1ZSA9PSAxMCkgeworICAgICAgICBtRW5jUGFyYW1zLnNfdGd0X2x5cl9wcm1zLmFzX3RndF9wYXJhbXNbMF0uaTRfcXVhbGl0eV9wcmVzZXQgPSBJSEVWQ0VfUVVBTElUWV9QMDsKKyAgICB9IGVsc2UgaWYgKG1Db21wbGV4aXR5LT52YWx1ZSA+PSA4KSB7CisgICAgICAgIG1FbmNQYXJhbXMuc190Z3RfbHlyX3BybXMuYXNfdGd0X3BhcmFtc1swXS5pNF9xdWFsaXR5X3ByZXNldCA9IElIRVZDRV9RVUFMSVRZX1AyOworICAgIH0gZWxzZSBpZiAobUNvbXBsZXhpdHktPnZhbHVlID49IDcpIHsKKyAgICAgICAgbUVuY1BhcmFtcy5zX3RndF9seXJfcHJtcy5hc190Z3RfcGFyYW1zWzBdLmk0X3F1YWxpdHlfcHJlc2V0ID0gSUhFVkNFX1FVQUxJVFlfUDM7CisgICAgfSBlbHNlIGlmIChtQ29tcGxleGl0eS0+dmFsdWUgPj0gNSkgeworICAgICAgICBtRW5jUGFyYW1zLnNfdGd0X2x5cl9wcm1zLmFzX3RndF9wYXJhbXNbMF0uaTRfcXVhbGl0eV9wcmVzZXQgPSBJSEVWQ0VfUVVBTElUWV9QNDsKKyAgICB9IGVsc2UgeworICAgICAgICBtRW5jUGFyYW1zLnNfdGd0X2x5cl9wcm1zLmFzX3RndF9wYXJhbXNbMF0uaTRfcXVhbGl0eV9wcmVzZXQgPSBJSEVWQ0VfUVVBTElUWV9QNTsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNFbmM6OnJlbGVhc2VFbmNvZGVyKCkgeworICAgIG1TcHNQcHNIZWFkZXJSZWNlaXZlZCA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworCisgICAgaWYgKG1Db2RlY0N0eCkgeworICAgICAgICBJSEVWQ0VfUExVR0lOX1NUQVRVU19UIGVyciA9IGloZXZjZV9jbG9zZShtQ29kZWNDdHgpOworICAgICAgICBpZiAoSUhFVkNFX0VPSyAhPSBlcnIpIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIG1Db2RlY0N0eCA9IG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0VuYzo6ZHJhaW4odWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgeworICAgIHJldHVybiBkcmFpbkludGVybmFsKGRyYWluTW9kZSwgcG9vbCwgbnVsbHB0cik7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNFbmM6OmluaXRFbmNvZGVyKCkgeworICAgIENIRUNLKCFtQ29kZWNDdHgpOworICAgIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIG1TaXplID0gbUludGYtPmdldFNpemVfbCgpOworICAgICAgICBtQml0cmF0ZU1vZGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZU1vZGVfbCgpOworICAgICAgICBtQml0cmF0ZSA9IG1JbnRmLT5nZXRCaXRyYXRlX2woKTsKKyAgICAgICAgbUZyYW1lUmF0ZSA9IG1JbnRmLT5nZXRGcmFtZVJhdGVfbCgpOworICAgICAgICBtSGV2Y0VuY1Byb2ZpbGUgPSBtSW50Zi0+Z2V0UHJvZmlsZV9sKCk7CisgICAgICAgIG1IZXZjRW5jTGV2ZWwgPSBtSW50Zi0+Z2V0TGV2ZWxfbCgpOworICAgICAgICBtSURSSW50ZXJ2YWwgPSBtSW50Zi0+Z2V0U3luY0ZyYW1lUGVyaW9kX2woKTsKKyAgICAgICAgbUNvbXBsZXhpdHkgPSBtSW50Zi0+Z2V0Q29tcGxleGl0eV9sKCk7CisgICAgICAgIG1RdWFsaXR5ID0gbUludGYtPmdldFF1YWxpdHlfbCgpOworICAgIH0KKworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGluaXRFbmNQYXJhbXMoKTsKKworICAgIGlmIChDMl9PSyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIGVuY29kZXIgcGFyYW1zIDogMHgleCIsIHN0YXR1cyk7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgSUhFVkNFX1BMVUdJTl9TVEFUVVNfVCBlcnIgPSBJSEVWQ0VfRU9LOworICAgIGVyciA9IGloZXZjZV9pbml0KCZtRW5jUGFyYW1zLCAmbUNvZGVjQ3R4KTsKKyAgICBpZiAoSUhFVkNFX0VPSyAhPSBlcnIpIHsKKyAgICAgICAgQUxPR0UoIkhFVkMgZW5jb2RlciBpbml0IGZhaWxlZCA6IDB4JXgiLCBlcnIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNFbmM6OnNldEVuY29kZUFyZ3MoaWhldmNlX2lucF9idWZfdCogcHNfZW5jb2RlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMkdyYXBoaWNWaWV3KiBjb25zdCBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgd29ya0luZGV4KSB7CisgICAgaWhldmNlX3N0YXRpY19jZmdfcGFyYW1zX3QqIHBhcmFtcyA9ICZtRW5jUGFyYW1zOworICAgIG1lbXNldChwc19lbmNvZGVfaXAsIDAsIHNpemVvZigqcHNfZW5jb2RlX2lwKSk7CisKKyAgICBpZiAoIWlucHV0KSB7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBpZiAoaW5wdXQtPndpZHRoKCkgPCBtU2l6ZS0+d2lkdGggfHwKKyAgICAgICAgaW5wdXQtPmhlaWdodCgpIDwgbVNpemUtPmhlaWdodCkgeworICAgICAgICAvKiBFeHBlY3Qgd2lkdGggaGVpZ2h0IHRvIGJlIGNvbmZpZ3VyZWQgKi8KKyAgICAgICAgQUxPR1coInVuZXhwZWN0ZWQgQ2FwYWNpdHkgQXNwZWN0ICVkKCVkKSB4ICVkKCVkKSIsIGlucHV0LT53aWR0aCgpLAorICAgICAgICAgICAgICBtU2l6ZS0+d2lkdGgsIGlucHV0LT5oZWlnaHQoKSwgbVNpemUtPmhlaWdodCk7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQmIGxheW91dCA9IGlucHV0LT5sYXlvdXQoKTsKKyAgICB1aW50OF90KiB5UGxhbmUgPQorICAgICAgICBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5wdXQtPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICAgIHVpbnQ4X3QqIHVQbGFuZSA9CisgICAgICAgIGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpbnB1dC0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSk7CisgICAgdWludDhfdCogdlBsYW5lID0KKyAgICAgICAgY29uc3RfY2FzdDx1aW50OF90ICo+KGlucHV0LT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdKTsKKyAgICBpbnQzMl90IHlTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXS5yb3dJbmM7CisgICAgaW50MzJfdCB1U3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ucm93SW5jOworICAgIGludDMyX3QgdlN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdLnJvd0luYzsKKworICAgIGNvbnN0IHVpbnQzMl90IHdpZHRoID0gbVNpemUtPndpZHRoOworICAgIGNvbnN0IHVpbnQzMl90IGhlaWdodCA9IG1TaXplLT5oZWlnaHQ7CisKKyAgICAvLyB3aWR0aCBhbmQgaGVpZ2h0IG11c3QgYmUgZXZlbgorICAgIGlmICh3aWR0aCAmIDF1IHx8IGhlaWdodCAmIDF1KSB7CisgICAgICAgIEFMT0dXKCJoZWlnaHQoJXUpIGFuZCB3aWR0aCgldSkgbXVzdCBib3RoIGJlIGV2ZW4iLCBoZWlnaHQsIHdpZHRoKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzaXplX3QgeVBsYW5lU2l6ZSA9IHdpZHRoICogaGVpZ2h0OworCisgICAgc3dpdGNoIChsYXlvdXQudHlwZSkgeworICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQjoKKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0JBOiB7CisgICAgICAgICAgICBNZW1vcnlCbG9jayBjb252ZXJzaW9uQnVmZmVyID0KKyAgICAgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcnMuZmV0Y2goeVBsYW5lU2l6ZSAqIDMgLyAyKTsKKyAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyc0luVXNlLmVtcGxhY2UoY29udmVyc2lvbkJ1ZmZlci5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25CdWZmZXIpOworICAgICAgICAgICAgeVBsYW5lID0gY29udmVyc2lvbkJ1ZmZlci5kYXRhKCk7CisgICAgICAgICAgICB1UGxhbmUgPSB5UGxhbmUgKyB5UGxhbmVTaXplOworICAgICAgICAgICAgdlBsYW5lID0gdVBsYW5lICsgeVBsYW5lU2l6ZSAvIDQ7CisgICAgICAgICAgICB5U3RyaWRlID0gd2lkdGg7CisgICAgICAgICAgICB1U3RyaWRlID0gdlN0cmlkZSA9IHlTdHJpZGUgLyAyOworICAgICAgICAgICAgQ29udmVydFJHQlRvUGxhbmFyWVVWKHlQbGFuZSwgeVN0cmlkZSwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnZlcnNpb25CdWZmZXIuc2l6ZSgpLCAqaW5wdXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVY6IHsKKyAgICAgICAgICAgIGlmICghSXNZVVY0MjAoKmlucHV0KSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJpbnB1dCBpcyBub3QgWVVWNDIwIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLmNvbEluYyA9PSAxICYmCisgICAgICAgICAgICAgICAgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uY29sSW5jID09IDEgJiYKKyAgICAgICAgICAgICAgICBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5jb2xJbmMgPT0gMSAmJgorICAgICAgICAgICAgICAgIHVTdHJpZGUgPT0gdlN0cmlkZSAmJiB5U3RyaWRlID09IDIgKiB2U3RyaWRlKSB7CisgICAgICAgICAgICAgICAgLy8gSTQyMCBjb21wYXRpYmxlIC0gYWxyZWFkeSBzZXQgdXAgYWJvdmUKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY29weSB0byBJNDIwCisgICAgICAgICAgICB5U3RyaWRlID0gd2lkdGg7CisgICAgICAgICAgICB1U3RyaWRlID0gdlN0cmlkZSA9IHlTdHJpZGUgLyAyOworICAgICAgICAgICAgTWVtb3J5QmxvY2sgY29udmVyc2lvbkJ1ZmZlciA9CisgICAgICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzLmZldGNoKHlQbGFuZVNpemUgKiAzIC8gMik7CisgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZS5lbXBsYWNlKGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uQnVmZmVyKTsKKyAgICAgICAgICAgIE1lZGlhSW1hZ2UyIGltZyA9CisgICAgICAgICAgICAgICAgQ3JlYXRlWVVWNDIwUGxhbmFyTWVkaWFJbWFnZTIod2lkdGgsIGhlaWdodCwgeVN0cmlkZSwgaGVpZ2h0KTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IEltYWdlQ29weShjb252ZXJzaW9uQnVmZmVyLmRhdGEoKSwgJmltZywgKmlucHV0KTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQnVmZmVyIGNvbnZlcnNpb24gZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHlQbGFuZSA9IGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpOworICAgICAgICAgICAgdVBsYW5lID0geVBsYW5lICsgeVBsYW5lU2l6ZTsKKyAgICAgICAgICAgIHZQbGFuZSA9IHVQbGFuZSArIHlQbGFuZVNpemUgLyA0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVkE6CisgICAgICAgICAgICBBTE9HRSgiWVVWQSBwbGFuZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJVbnJlY29nbml6ZWQgcGxhbmUgdHlwZTogJWQiLCBsYXlvdXQudHlwZSk7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN3aXRjaCAobUl2VmlkZW9Db2xvckZvcm1hdCkgeworICAgICAgICBjYXNlIElWX1lVVl80MjBQOiB7CisgICAgICAgICAgICAvLyBpbnB1dCBidWZmZXIgaXMgc3VwcG9zZWQgdG8gYmUgY29uc3QgYnV0IEl0dGlhbSBBUEkgd2FudHMgYmFyZQorICAgICAgICAgICAgLy8gcG9pbnRlci4KKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YXB2X2lucF9wbGFuZXNbMF0gPSB5UGxhbmU7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFwdl9pbnBfcGxhbmVzWzFdID0gdVBsYW5lOworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5hcHZfaW5wX3BsYW5lc1syXSA9IHZQbGFuZTsKKworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5haTRfaW5wX3N0cmRbMF0gPSB5U3RyaWRlOworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5haTRfaW5wX3N0cmRbMV0gPSB1U3RyaWRlOworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5haTRfaW5wX3N0cmRbMl0gPSB2U3RyaWRlOworCisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFpNF9pbnBfc2l6ZVswXSA9IHlTdHJpZGUgKiBoZWlnaHQ7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFpNF9pbnBfc2l6ZVsxXSA9IHVTdHJpZGUgKiBoZWlnaHQgPj4gMTsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YWk0X2lucF9zaXplWzJdID0gdlN0cmlkZSAqIGhlaWdodCA+PiAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIElWX1lVVl80MjJJTEU6IHsKKyAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBJVl9ZVVZfNDIwU1BfVVY6CisgICAgICAgIGNhc2UgSVZfWVVWXzQyMFNQX1ZVOgorICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFwdl9pbnBfcGxhbmVzWzBdID0geVBsYW5lOworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5hcHZfaW5wX3BsYW5lc1sxXSA9IHVQbGFuZTsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YXB2X2lucF9wbGFuZXNbMl0gPSBudWxscHRyOworCisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFpNF9pbnBfc3RyZFswXSA9IHlTdHJpZGU7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFpNF9pbnBfc3RyZFsxXSA9IHVTdHJpZGU7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFpNF9pbnBfc3RyZFsyXSA9IDA7CisKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YWk0X2lucF9zaXplWzBdID0geVN0cmlkZSAqIGhlaWdodDsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YWk0X2lucF9zaXplWzFdID0gdVN0cmlkZSAqIGhlaWdodCA+PiAxOworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5haTRfaW5wX3NpemVbMl0gPSAwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwc19lbmNvZGVfaXAtPmk0X2N1cnJfYml0cmF0ZSA9CisgICAgICAgIHBhcmFtcy0+c190Z3RfbHlyX3BybXMuYXNfdGd0X3BhcmFtc1swXS5haTRfdGd0X2JpdHJhdGVbMF07CisgICAgcHNfZW5jb2RlX2lwLT5pNF9jdXJyX3BlYWtfYml0cmF0ZSA9CisgICAgICAgIHBhcmFtcy0+c190Z3RfbHlyX3BybXMuYXNfdGd0X3BhcmFtc1swXS5haTRfcGVha19iaXRyYXRlWzBdOworICAgIHBzX2VuY29kZV9pcC0+aTRfY3Vycl9yYXRlX2ZhY3RvciA9IHBhcmFtcy0+c19jb25maWdfcHJtcy5pNF9yYXRlX2ZhY3RvcjsKKyAgICBwc19lbmNvZGVfaXAtPnU4X3B0cyA9IHdvcmtJbmRleDsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0SGV2Y0VuYzo6ZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGloZXZjZV9vdXRfYnVmX3QqIHBzX2VuY29kZV9vcCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0ge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9OworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgIHBvb2wtPmZldGNoTGluZWFyQmxvY2socHNfZW5jb2RlX29wLT5pNF9ieXRlc19nZW5lcmF0ZWQsIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChDMl9PSyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgMHgleCIsIHN0YXR1cyk7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IHN0YXR1czsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAoQzJfT0sgIT0gd1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkIHdpdGggc3RhdHVzIDB4JXgiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gd1ZpZXcuZXJyb3IoKTsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtZW1jcHkod1ZpZXcuZGF0YSgpLCBwc19lbmNvZGVfb3AtPnB1MV9vdXRwdXRfYnVmLAorICAgICAgICAgICBwc19lbmNvZGVfb3AtPmk0X2J5dGVzX2dlbmVyYXRlZCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9CisgICAgICAgIGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgMCwgcHNfZW5jb2RlX29wLT5pNF9ieXRlc19nZW5lcmF0ZWQpOworCisgICAgRFVNUF9UT19GSUxFKG1PdXRGaWxlLCBwc19lbmNvZGVfb3AtPnB1MV9vdXRwdXRfYnVmLAorICAgICAgICAgICAgICAgICBwc19lbmNvZGVfb3AtPmk0X2J5dGVzX2dlbmVyYXRlZCk7CisKKyAgICBpZiAocHNfZW5jb2RlX29wLT5pNF9pc19rZXlfZnJhbWUpIHsKKyAgICAgICAgQUxPR1YoIklEUiBmcmFtZSBwcm9kdWNlZCIpOworICAgICAgICBidWZmZXItPnNldEluZm8oc3RkOjptYWtlX3NoYXJlZDxDMlN0cmVhbVBpY3R1cmVUeXBlTWFza0luZm86Om91dHB1dD4oCisgICAgICAgICAgICAwdSAvKiBzdHJlYW0gaWQgKi8sIEMyQ29uZmlnOjpTWU5DX0ZSQU1FKSk7CisgICAgfQorCisgICAgYXV0byBmaWxsV29yayA9IFtidWZmZXJdKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkwOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIH07CisgICAgaWYgKHdvcmsgJiYgYzJfY250cjY0X3QoaW5kZXgpID09IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCkgeworICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICAgICAgaWYgKG1TaWduYWxsZWRFb3MpIHsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9CisgICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZpbmlzaChpbmRleCwgZmlsbFdvcmspOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0VuYzo6ZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworCisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGloZXZjZV9vdXRfYnVmX3Qgc19lbmNvZGVfb3B7fTsKKyAgICAgICAgbWVtc2V0KCZzX2VuY29kZV9vcCwgMCwgc2l6ZW9mKHNfZW5jb2RlX29wKSk7CisKKyAgICAgICAgaWhldmNlX2VuY29kZShtQ29kZWNDdHgsIG51bGxwdHIsICZzX2VuY29kZV9vcCk7CisgICAgICAgIGlmIChzX2VuY29kZV9vcC5pNF9ieXRlc19nZW5lcmF0ZWQpIHsKKyAgICAgICAgICAgIGZpbmlzaFdvcmsoc19lbmNvZGVfb3AudThfcHRzLCB3b3JrLCBwb29sLCAmc19lbmNvZGVfb3ApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkICE9IDF1KSBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEhldmNFbmM6OnByb2Nlc3MoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkRW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgQUxPR0QoIlNpZ25hbGxlZCBFcnJvciAvIFNpZ25hbGxlZCBFb3MiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBDMl9PSzsKKworICAgIC8vIEluaXRpYWxpemUgZW5jb2RlciBpZiBub3QgYWxyZWFkeSBpbml0aWFsaXplZAorICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgc3RhdHVzID0gaW5pdEVuY29kZXIoKTsKKyAgICAgICAgaWYgKEMyX09LICE9IHN0YXR1cykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIGVuY29kZXIgOiAweCV4Iiwgc3RhdHVzKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBzdGF0dXM7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IHZpZXc7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBpbnB1dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgaWYgKGVvcykgbVNpZ25hbGxlZEVvcyA9IHRydWU7CisKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICBpbnB1dEJ1ZmZlciA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF07CisgICAgICAgIHZpZXcgPSBzdGQ6Om1ha2Vfc2hhcmVkPGNvbnN0IEMyR3JhcGhpY1ZpZXc+KAorICAgICAgICAgICAgaW5wdXRCdWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKSk7CisgICAgICAgIGlmICh2aWV3LT5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBlcnIgPSAlZCIsIHZpZXctPmVycm9yKCkpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgSUhFVkNFX1BMVUdJTl9TVEFUVVNfVCBlcnIgPSBJSEVWQ0VfRU9LOworCisgICAgaWYgKCFtU3BzUHBzSGVhZGVyUmVjZWl2ZWQpIHsKKyAgICAgICAgaWhldmNlX291dF9idWZfdCBzX2hlYWRlcl9vcHt9OworICAgICAgICBlcnIgPSBpaGV2Y2VfZW5jb2RlX2hlYWRlcihtQ29kZWNDdHgsICZzX2hlYWRlcl9vcCk7CisgICAgICAgIGlmIChlcnIgPT0gSUhFVkNFX0VPSyAmJiBzX2hlYWRlcl9vcC5pNF9ieXRlc19nZW5lcmF0ZWQpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0PiBjc2QgPQorICAgICAgICAgICAgICAgIEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKAorICAgICAgICAgICAgICAgICAgICBzX2hlYWRlcl9vcC5pNF9ieXRlc19nZW5lcmF0ZWQsIDB1KTsKKyAgICAgICAgICAgIGlmICghY3NkKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNTRCBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtY3B5KGNzZC0+bS52YWx1ZSwgc19oZWFkZXJfb3AucHUxX291dHB1dF9idWYsCisgICAgICAgICAgICAgICAgICAgc19oZWFkZXJfb3AuaTRfYnl0ZXNfZ2VuZXJhdGVkKTsKKyAgICAgICAgICAgIERVTVBfVE9fRklMRShtT3V0RmlsZSwgY3NkLT5tLnZhbHVlLCBjc2QtPmZsZXhDb3VudCgpKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShjc2QpKTsKKyAgICAgICAgICAgIG1TcHNQcHNIZWFkZXJSZWNlaXZlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFpbnB1dEJ1ZmZlcikgeworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGhhbmRsZSBkeW5hbWljIGNvbmZpZyBwYXJhbWV0ZXJzCisgICAgeworICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gYml0cmF0ZSA9IG1JbnRmLT5nZXRCaXRyYXRlX2woKTsKKyAgICAgICAgbG9jay51bmxvY2soKTsKKworICAgICAgICBpZiAoYml0cmF0ZSAhPSBtQml0cmF0ZSkgeworICAgICAgICAgICAgbUJpdHJhdGUgPSBiaXRyYXRlOworICAgICAgICAgICAgbUVuY1BhcmFtcy5zX3RndF9seXJfcHJtcy5hc190Z3RfcGFyYW1zWzBdLmFpNF90Z3RfYml0cmF0ZVswXSA9CisgICAgICAgICAgICAgICAgbUJpdHJhdGUtPnZhbHVlOworICAgICAgICAgICAgbUVuY1BhcmFtcy5zX3RndF9seXJfcHJtcy5hc190Z3RfcGFyYW1zWzBdLmFpNF9wZWFrX2JpdHJhdGVbMF0gPQorICAgICAgICAgICAgICAgIG1CaXRyYXRlLT52YWx1ZSA8PCAxOworICAgICAgICB9CisgICAgfQorCisgICAgaWhldmNlX2lucF9idWZfdCBzX2VuY29kZV9pcHt9OworICAgIGloZXZjZV9vdXRfYnVmX3Qgc19lbmNvZGVfb3B7fTsKKyAgICB1aW50NjRfdCB3b3JrSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3VsbCgpOworCisgICAgc3RhdHVzID0gc2V0RW5jb2RlQXJncygmc19lbmNvZGVfaXAsIHZpZXcuZ2V0KCksIHdvcmtJbmRleCk7CisgICAgaWYgKEMyX09LICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRSgic2V0RW5jb2RlQXJncyBmYWlsZWQgOiAweCV4Iiwgc3RhdHVzKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gc3RhdHVzOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdWludDY0X3QgdGltZURlbGF5ID0gMDsKKyAgICB1aW50NjRfdCB0aW1lVGFrZW4gPSAwOworICAgIG1lbXNldCgmc19lbmNvZGVfb3AsIDAsIHNpemVvZihzX2VuY29kZV9vcCkpOworICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgdGltZURlbGF5KTsKKworICAgIGlmIChpbnB1dEJ1ZmZlcikgeworICAgICAgICBlcnIgPSBpaGV2Y2VfZW5jb2RlKG1Db2RlY0N0eCwgJnNfZW5jb2RlX2lwLCAmc19lbmNvZGVfb3ApOworICAgICAgICBpZiAoSUhFVkNFX0VPSyAhPSBlcnIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFbmNvZGUgRnJhbWUgZmFpbGVkIDogMHgleCIsIGVycik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoIWVvcykgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIH0KKworICAgIEdFVFRJTUUoJm1UaW1lRW5kLCBudWxscHRyKTsKKyAgICAvKiBDb21wdXRlIHRpbWUgdGFrZW4gZm9yIGRlY29kZSgpICovCisgICAgVElNRV9ESUZGKG1UaW1lU3RhcnQsIG1UaW1lRW5kLCB0aW1lVGFrZW4pOworCisgICAgQUxPR1YoInRpbWVUYWtlbj0lNmQgZGVsYXk9JTZkIG51bUJ5dGVzPSU2ZCIsIChpbnQpdGltZVRha2VuLAorICAgICAgICAgIChpbnQpdGltZURlbGF5LCBzX2VuY29kZV9vcC5pNF9ieXRlc19nZW5lcmF0ZWQpOworCisgICAgaWYgKHNfZW5jb2RlX29wLmk0X2J5dGVzX2dlbmVyYXRlZCkgeworICAgICAgICBmaW5pc2hXb3JrKHNfZW5jb2RlX29wLnU4X3B0cywgd29yaywgcG9vbCwgJnNfZW5jb2RlX29wKTsKKyAgICB9CisKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TLCBwb29sLCB3b3JrKTsKKyAgICB9Cit9CisKK2NsYXNzIEMyU29mdEhldmNFbmNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CisgICBwdWJsaWM6CisgICAgQzJTb2Z0SGV2Y0VuY0ZhY3RvcnkoKQorICAgICAgICA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkge30KKworICAgIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgbmV3IEMyU29mdEhldmNFbmMoCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0SGV2Y0VuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEhldmNFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRIZXZjRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB+QzJTb2Z0SGV2Y0VuY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEhldmNFbmNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0VuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJjNzY0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0VuYy5oCkBAIC0wLDAgKzEsMTY5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9IRVZDX0VOQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfSEVWQ19FTkNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgImloZXZjX3R5cGVkZWZzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqIEdldCB0aW1lICovCisjZGVmaW5lIEdFVFRJTUUoYSwgYikgZ2V0dGltZW9mZGF5KGEsIGIpCisKKy8qKiBDb21wdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBzdGFydCBhbmQgZW5kICovCisjZGVmaW5lIFRJTUVfRElGRihzdGFydCwgZW5kLCBkaWZmKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZGlmZiA9ICgoKGVuZCkudHZfc2VjIC0gKHN0YXJ0KS50dl9zZWMpICogMTAwMDAwMCkgKyBcCisgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKKworI2RlZmluZSBDT0RFQ19NQVhfQ09SRVMgIDQKKyNkZWZpbmUgTUFYX0JfRlJBTUVTICAgICAxCisjZGVmaW5lIE1BWF9SQ19MT09LQUhFQUQgMQorCisjZGVmaW5lIERFRkFVTFRfQl9GUkFNRVMgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9SQ19MT09LQUhFQUQgMAorCitzdHJ1Y3QgQzJTb2Z0SGV2Y0VuYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRIZXZjRW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSBvdmVycmlkZTsKKworICAgcHJvdGVjdGVkOgorICAgIH5DMlNvZnRIZXZjRW5jKCkgb3ZlcnJpZGU7CisKKyAgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBpaGV2Y2Vfc3RhdGljX2NmZ19wYXJhbXNfdCBtRW5jUGFyYW1zOworICAgIHNpemVfdCBtTnVtQ29yZXM7CisgICAgVVdPUkQzMiBtSURSSW50ZXJ2YWw7CisgICAgSVZfQ09MT1JfRk9STUFUX1QgbUl2VmlkZW9Db2xvckZvcm1hdDsKKyAgICBVV09SRDMyIG1IZXZjRW5jUHJvZmlsZTsKKyAgICBVV09SRDMyIG1IZXZjRW5jTGV2ZWw7CisgICAgYm9vbCBtU3RhcnRlZDsKKyAgICBib29sIG1TcHNQcHNIZWFkZXJSZWNlaXZlZDsKKyAgICBib29sIG1TaWduYWxsZWRFb3M7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgdm9pZCogbUNvZGVjQ3R4OworICAgIE1lbW9yeUJsb2NrUG9vbCBtQ29udmVyc2lvbkJ1ZmZlcnM7CisgICAgc3RkOjptYXA8dm9pZCosIE1lbW9yeUJsb2NrPiBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZTsKKyAgICAvLyBjb25maWd1cmF0aW9ucyB1c2VkIGJ5IGNvbXBvbmVudCBpbiBwcm9jZXNzCisgICAgLy8gKFRPRE86IGtlZXAgdGhpcyBpbiBpbnRmIGJ1dCBtYWtlIHRoZW0gaW50ZXJuYWwgb25seSkKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IG1GcmFtZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZU1vZGVUdW5pbmc6Om91dHB1dD4gbUJpdHJhdGVNb2RlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbXBsZXhpdHlUdW5pbmc6Om91dHB1dD4gbUNvbXBsZXhpdHk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUXVhbGl0eVR1bmluZzo6b3V0cHV0PiBtUXVhbGl0eTsKKworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKyAgICBjaGFyIG1JbkZpbGVbMjAwXTsKKyAgICBjaGFyIG1PdXRGaWxlWzIwMF07CisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCisgICAgLy8gcHJvZmlsZQorICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lU3RhcnQ7CisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7CisKKyAgICBjMl9zdGF0dXNfdCBpbml0RW5jUGFyYW1zKCk7CisgICAgYzJfc3RhdHVzX3QgaW5pdEVuY29kZXIoKTsKKyAgICBjMl9zdGF0dXNfdCByZWxlYXNlRW5jb2RlcigpOworICAgIGMyX3N0YXR1c190IHNldEVuY29kZUFyZ3MoaWhldmNlX2lucF9idWZfdCogcHNfZW5jb2RlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJHcmFwaGljVmlldyogY29uc3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB3b3JrSW5kZXgpOworICAgIHZvaWQgZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wsCisgICAgICAgICAgICAgICAgICAgIGloZXZjZV9vdXRfYnVmX3QqIHBzX2VuY29kZV9vcCk7CisgICAgYzJfc3RhdHVzX3QgZHJhaW5JbnRlcm5hbCh1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspOworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEhldmNFbmMpOworfTsKKyNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCisKKyNkZWZpbmUgSU5QVVRfRFVNUF9QQVRIICIvZGF0YS9sb2NhbC90bXAvaGV2YyIKKyNkZWZpbmUgSU5QVVRfRFVNUF9FWFQgInl1diIKKyNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSCAiL2RhdGEvbG9jYWwvdG1wL2hldmMiCisjZGVmaW5lIE9VVFBVVF9EVU1QX0VYVCAiaDI2NSIKKyNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdHJjcHkobUluRmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFMT0dEKCJHRU5FUkFURV9GSUxFX05BTUVTIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3ByaW50ZihtSW5GaWxlLCAiJXNfJWxkLiVsZC4lcyIsIElOUFVUX0RVTVBfUEFUSCwgbVRpbWVTdGFydC50dl9zZWMsIFwKKyAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfdXNlYywgSU5QVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cmNweShtT3V0RmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3ByaW50ZihtT3V0RmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBPVVRQVVRfRFVNUF9QQVRILCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfc2VjLCBtVGltZVN0YXJ0LnR2X3VzZWMsIE9VVFBVVF9EVU1QX0VYVCk7ICAgICAgXAorfQorCisjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTEUqIGZwID0gZm9wZW4obV9maWxlbmFtZSwgIndiIik7ICAgICAgICAgICAgICBcCisgICAgaWYgKGZwICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIk9wZW5lZCBmaWxlICVzIiwgbV9maWxlbmFtZSk7ICAgICAgICAgXAorICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCBvcGVuIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKSAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMRSogZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAiYWIiKTsgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZwICE9IE5VTEwgJiYgbV9idWYgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFMT0dEKCJEdW1wIHRvIGZpbGUhIik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGkgPSBmd3JpdGUobV9idWYsIDEsIG1fc2l6ZSwgZnApOyAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChpICE9IChpbnQpbV9zaXplKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiRXJyb3IgaW4gZndyaXRlLCByZXR1cm5lZCAlZCIsIGkpOyAgICBcCisgICAgICAgICAgICBwZXJyb3IoIkVycm9yIGluIHdyaXRlIHRvIGZpbGUiKTsgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFMT0dEKCJDb3VsZCBub3Qgd3JpdGUgdG8gZmlsZSAlcyIsIG1fZmlsZW5hbWUpOyBcCisgICAgICAgIGlmIChmcCAhPSBOVUxMKSBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZWxzZSAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisjZGVmaW5lIElOUFVUX0RVTVBfUEFUSAorI2RlZmluZSBJTlBVVF9EVU1QX0VYVAorI2RlZmluZSBPVVRQVVRfRFVNUF9QQVRICisjZGVmaW5lIE9VVFBVVF9EVU1QX0VYVAorI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkKKyNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKQorI2RlZmluZSBEVU1QX1RPX0ZJTEUobV9maWxlbmFtZSwgbV9idWYsIG1fc2l6ZSkKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQzJfU09GVF9IRVZDX0VOQ19IX18KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY2NjVlZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTEgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfbXAzZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRNcDNEZWMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9tcDNkZWMiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9DMlNvZnRNcDNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0MyU29mdE1wM0RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJhN2UzZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9DMlNvZnRNcDNEZWMuY3BwCkBAIC0wLDAgKzEsNTUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRNcDNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bnVtZXJpYz4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRNcDNEZWMuaCIKKyNpbmNsdWRlICJwdm1wM2RlY29kZXJfYXBpLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLm1wMy5kZWNvZGVyIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK2NsYXNzIEMyU29mdE1QMzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fQVVESU8sCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRykgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7CisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKAorICAgICAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6QVRUUklCX0lTX1RFTVBPUkFMKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgNDQxMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5vbmVPZih7ODAwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwKKyAgICAgICAgICAgICAgICAgICAgMjIwNTAsIDI0MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwfSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDIpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgMil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoODAwMCwgMzIwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgODE5MikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRNUDM6OkMyU29mdE1QMyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtQ29uZmlnKG51bGxwdHIpLAorICAgICAgbURlY29kZXJCdWYobnVsbHB0cikgeworfQorCitDMlNvZnRNUDM6On5DMlNvZnRNUDMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1QMzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfTk9fTUVNT1JZOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNUDM6Om9uU3RvcCgpIHsKKyAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgbmV4dCBidWZmZXIgb3V0cHV0IGRvZXMgbm90IHN0aWxsCisgICAgLy8gZGVwZW5kIG9uIGZyYWdtZW50cyBmcm9tIHRoZSBsYXN0IG9uZSBkZWNvZGVkLgorICAgIHB2bXAzX0luaXREZWNvZGVyKG1Db25maWcsIG1EZWNvZGVyQnVmKTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtSXNGaXJzdCA9IHRydWU7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMDsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRNUDM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0TVAzOjpvblJlbGVhc2UoKSB7CisgICAgbUdhcGxlc3NCeXRlcyA9IGZhbHNlOworICAgIGlmIChtRGVjb2RlckJ1ZikgeworICAgICAgICBmcmVlKG1EZWNvZGVyQnVmKTsKKyAgICAgICAgbURlY29kZXJCdWYgPSBudWxscHRyOworICAgIH0KKworICAgIGlmIChtQ29uZmlnKSB7CisgICAgICAgIGRlbGV0ZSBtQ29uZmlnOworICAgICAgICBtQ29uZmlnID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3N0YXR1c190IEMyU29mdE1QMzo6aW5pdERlY29kZXIoKSB7CisgICAgbUNvbmZpZyA9IG5ldyB0UFZNUDNEZWNvZGVyRXh0ZXJuYWx7fTsKKyAgICBpZiAoIW1Db25maWcpIHJldHVybiBOT19NRU1PUlk7CisgICAgbUNvbmZpZy0+ZXF1YWxpemVyVHlwZSA9IGZsYXQ7CisgICAgbUNvbmZpZy0+Y3JjRW5hYmxlZCA9IGZhbHNlOworCisgICAgc2l6ZV90IG1lbVJlcXVpcmVtZW50cyA9IHB2bXAzX2RlY29kZXJNZW1SZXF1aXJlbWVudHMoKTsKKyAgICBtRGVjb2RlckJ1ZiA9IG1hbGxvYyhtZW1SZXF1aXJlbWVudHMpOworICAgIGlmICghbURlY29kZXJCdWYpIHJldHVybiBOT19NRU1PUlk7CisKKyAgICBwdm1wM19Jbml0RGVjb2RlcihtQ29uZmlnLCBtRGVjb2RlckJ1Zik7CisKKyAgICBtSXNGaXJzdCA9IHRydWU7CisgICAgbUdhcGxlc3NCeXRlcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDA7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qIFRoZSBiZWxvdyBjb2RlIGlzIGJvcnJvd2VkIGZyb20gLi90ZXN0L21wM3JlYWRlci5jcHAgKi8KK3N0YXRpYyBib29sIHBhcnNlTXAzSGVhZGVyKHVpbnQzMl90IGhlYWRlciwgc2l6ZV90ICpmcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9zYW1wbGluZ19yYXRlID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRfY2hhbm5lbHMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9iaXRyYXRlID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRfbnVtX3NhbXBsZXMgPSBudWxscHRyKSB7CisgICAgKmZyYW1lX3NpemUgPSAwOworICAgIGlmIChvdXRfc2FtcGxpbmdfcmF0ZSkgKm91dF9zYW1wbGluZ19yYXRlID0gMDsKKyAgICBpZiAob3V0X2NoYW5uZWxzKSAqb3V0X2NoYW5uZWxzID0gMDsKKyAgICBpZiAob3V0X2JpdHJhdGUpICpvdXRfYml0cmF0ZSA9IDA7CisgICAgaWYgKG91dF9udW1fc2FtcGxlcykgKm91dF9udW1fc2FtcGxlcyA9IDExNTI7CisKKyAgICBpZiAoKGhlYWRlciAmIDB4ZmZlMDAwMDApICE9IDB4ZmZlMDAwMDApIHJldHVybiBmYWxzZTsKKworICAgIHVuc2lnbmVkIHZlcnNpb24gPSAoaGVhZGVyID4+IDE5KSAmIDM7CisgICAgaWYgKHZlcnNpb24gPT0gMHgwMSkgcmV0dXJuIGZhbHNlOworCisgICAgdW5zaWduZWQgbGF5ZXIgPSAoaGVhZGVyID4+IDE3KSAmIDM7CisgICAgaWYgKGxheWVyID09IDB4MDApIHJldHVybiBmYWxzZTsKKworICAgIHVuc2lnbmVkIGJpdHJhdGVfaW5kZXggPSAoaGVhZGVyID4+IDEyKSAmIDB4MGY7CisgICAgaWYgKGJpdHJhdGVfaW5kZXggPT0gMCB8fCBiaXRyYXRlX2luZGV4ID09IDB4MGYpIHJldHVybiBmYWxzZTsKKworICAgIHVuc2lnbmVkIHNhbXBsaW5nX3JhdGVfaW5kZXggPSAoaGVhZGVyID4+IDEwKSAmIDM7CisgICAgaWYgKHNhbXBsaW5nX3JhdGVfaW5kZXggPT0gMykgcmV0dXJuIGZhbHNlOworCisgICAgc3RhdGljIGNvbnN0IGludCBrU2FtcGxpbmdSYXRlVjFbXSA9IHsgNDQxMDAsIDQ4MDAwLCAzMjAwMCB9OworICAgIGludCBzYW1wbGluZ19yYXRlID0ga1NhbXBsaW5nUmF0ZVYxW3NhbXBsaW5nX3JhdGVfaW5kZXhdOworICAgIGlmICh2ZXJzaW9uID09IDIgLyogVjIgKi8pIHsKKyAgICAgICAgc2FtcGxpbmdfcmF0ZSAvPSAyOworICAgIH0gZWxzZSBpZiAodmVyc2lvbiA9PSAwIC8qIFYyLjUgKi8pIHsKKyAgICAgICAgc2FtcGxpbmdfcmF0ZSAvPSA0OworICAgIH0KKworICAgIHVuc2lnbmVkIHBhZGRpbmcgPSAoaGVhZGVyID4+IDkpICYgMTsKKworICAgIGlmIChsYXllciA9PSAzKSB7IC8vIGxheWVyIEkKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYxW10gPQorICAgICAgICB7CisgICAgICAgICAgICAzMiwgNjQsIDk2LCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMjg4LCAzMjAsIDM1MiwgMzg0LCA0MTYsIDQ0OAorICAgICAgICB9OworICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjJbXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIDMyLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNDQsIDE2MCwgMTc2LCAxOTIsIDIyNCwgMjU2CisgICAgICAgIH07CisKKyAgICAgICAgaW50IGJpdHJhdGUgPSAodmVyc2lvbiA9PSAzIC8qIFYxICovKSA/IGtCaXRyYXRlVjFbYml0cmF0ZV9pbmRleCAtIDFdIDoKKyAgICAgICAgICAgICAgICBrQml0cmF0ZVYyW2JpdHJhdGVfaW5kZXggLSAxXTsKKworICAgICAgICBpZiAob3V0X2JpdHJhdGUpIHsKKyAgICAgICAgICAgICpvdXRfYml0cmF0ZSA9IGJpdHJhdGU7CisgICAgICAgIH0KKyAgICAgICAgKmZyYW1lX3NpemUgPSAoMTIwMDAgKiBiaXRyYXRlIC8gc2FtcGxpbmdfcmF0ZSArIHBhZGRpbmcpICogNDsKKyAgICAgICAgaWYgKG91dF9udW1fc2FtcGxlcykgeworICAgICAgICAgICAgKm91dF9udW1fc2FtcGxlcyA9IDM4NDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8vIGxheWVyIElJIG9yIElJSQorICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjFMMltdID0KKyAgICAgICAgeworICAgICAgICAgICAgMzIsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMzIwLCAzODQKKyAgICAgICAgfTsKKworICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjFMM1tdID0KKyAgICAgICAgeworICAgICAgICAgICAgMzIsIDQwLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYsIDMyMAorICAgICAgICB9OworCisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMltdID0KKyAgICAgICAgeworICAgICAgICAgICAgOCwgMTYsIDI0LCAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE0NCwgMTYwCisgICAgICAgIH07CisKKyAgICAgICAgaW50IGJpdHJhdGU7CisgICAgICAgIGlmICh2ZXJzaW9uID09IDMgLyogVjEgKi8pIHsKKyAgICAgICAgICAgIGJpdHJhdGUgPSAobGF5ZXIgPT0gMiAvKiBMMiAqLykgPyBrQml0cmF0ZVYxTDJbYml0cmF0ZV9pbmRleCAtIDFdIDoKKyAgICAgICAgICAgICAgICAgICAga0JpdHJhdGVWMUwzW2JpdHJhdGVfaW5kZXggLSAxXTsKKworICAgICAgICAgICAgaWYgKG91dF9udW1fc2FtcGxlcykgeworICAgICAgICAgICAgICAgICpvdXRfbnVtX3NhbXBsZXMgPSAxMTUyOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAvLyBWMiAob3IgMi41KQorICAgICAgICAgICAgYml0cmF0ZSA9IGtCaXRyYXRlVjJbYml0cmF0ZV9pbmRleCAtIDFdOworICAgICAgICAgICAgaWYgKG91dF9udW1fc2FtcGxlcykgeworICAgICAgICAgICAgICAgICpvdXRfbnVtX3NhbXBsZXMgPSAobGF5ZXIgPT0gMSAvKiBMMyAqLykgPyA1NzYgOiAxMTUyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG91dF9iaXRyYXRlKSB7CisgICAgICAgICAgICAqb3V0X2JpdHJhdGUgPSBiaXRyYXRlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZlcnNpb24gPT0gMyAvKiBWMSAqLykgeworICAgICAgICAgICAgKmZyYW1lX3NpemUgPSAxNDQwMDAgKiBiaXRyYXRlIC8gc2FtcGxpbmdfcmF0ZSArIHBhZGRpbmc7CisgICAgICAgIH0gZWxzZSB7IC8vIFYyIG9yIFYyLjUKKyAgICAgICAgICAgIHNpemVfdCB0bXAgPSAobGF5ZXIgPT0gMSAvKiBMMyAqLykgPyA3MjAwMCA6IDE0NDAwMDsKKyAgICAgICAgICAgICpmcmFtZV9zaXplID0gdG1wICogYml0cmF0ZSAvIHNhbXBsaW5nX3JhdGUgKyBwYWRkaW5nOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG91dF9zYW1wbGluZ19yYXRlKSB7CisgICAgICAgICpvdXRfc2FtcGxpbmdfcmF0ZSA9IHNhbXBsaW5nX3JhdGU7CisgICAgfQorCisgICAgaWYgKG91dF9jaGFubmVscykgeworICAgICAgICBpbnQgY2hhbm5lbF9tb2RlID0gKGhlYWRlciA+PiA2KSAmIDM7CisKKyAgICAgICAgKm91dF9jaGFubmVscyA9IChjaGFubmVsX21vZGUgPT0gMykgPyAxIDogMjsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHVpbnQzMl90IFUzMl9BVChjb25zdCB1aW50OF90ICpwdHIpIHsKKyAgICByZXR1cm4gcHRyWzBdIDw8IDI0IHwgcHRyWzFdIDw8IDE2IHwgcHRyWzJdIDw8IDggfCBwdHJbM107Cit9CisKK3N0YXRpYyBzdGF0dXNfdCBjYWxjdWxhdGVPdXRTaXplKHVpbnQ4ICpoZWFkZXIsIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+ICpkZWNvZGVkU2l6ZXMpIHsKKyAgICB1aW50MzJfdCBjaGFubmVsczsKKyAgICB1aW50MzJfdCBudW1TYW1wbGVzOworICAgIHNpemVfdCBmcmFtZVNpemU7CisgICAgc2l6ZV90IHRvdGFsSW5TaXplID0gMDsKKworICAgIHdoaWxlICh0b3RhbEluU2l6ZSArIDQgPCBpblNpemUpIHsKKyAgICAgICAgaWYgKCFwYXJzZU1wM0hlYWRlcihVMzJfQVQoaGVhZGVyICsgdG90YWxJblNpemUpLCAmZnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsICZjaGFubmVscywgbnVsbHB0ciwgJm51bVNhbXBsZXMpKSB7CisgICAgICAgICAgICBBTE9HRSgiRXJyb3IgaW4gcGFyc2UgbXAzIGhlYWRlciBkdXJpbmcgb3V0U2l6ZSBlc3RpbWF0aW9uIik7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICB0b3RhbEluU2l6ZSArPSBmcmFtZVNpemU7CisgICAgICAgIGRlY29kZWRTaXplcy0+cHVzaF9iYWNrKG51bVNhbXBsZXMgKiBjaGFubmVscyAqIHNpemVvZihpbnQxNl90KSk7CisgICAgfQorCisgICAgaWYgKGRlY29kZWRTaXplcy0+ZW1wdHkoKSkgcmV0dXJuIFVOS05PV05fRVJST1I7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1QMzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1QMzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKy8vIFRPRE86IENhbiBvdmVyYWxsIGVycm9yIGNoZWNraW5nIGJlIGltcHJvdmVkPyBBcyBpbiB0aGUgY2hlY2sgZm9yIHZhbGlkaXR5IG9mCisvLyAgICAgICB3b3JrLCBwb29sIHB0ciwgd29yay0+aW5wdXQuYnVmZmVycy5zaXplKCkgPT0gMSwgLi4uCisvLyBUT0RPOiBCbGluZCByZW1vdmFsIG9mIDUyOSBzYW1wbGVzIGZyb20gdGhlIG91dHB1dCBtYXkgbm90IHdvcmsuIEJlY2F1c2UKKy8vICAgICAgIG1wZWcgbGF5ZXIgMSBmcmFtZSBzaXplIGlzIDM4NCBzYW1wbGVzIHBlciBmcmFtZS4gVGhpcyBzaG91bGQgaW50cm9kdWNlCisvLyAgICAgICBuZWdhdGl2ZSB2YWx1ZXMgYW5kIGNhbiBjYXVzZSBTRUcgZmF1bHRzLiBTb2Z0IG9teCBtcDMgcGx1Z2luIGNhbiBoYXZlCisvLyAgICAgICB0aGlzIHByb2JsZW0gKENIRUNLISkKK3ZvaWQgQzJTb2Z0TVAzOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSByVmlldy5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGluU2l6ZSA9PSAwICYmICghbUdhcGxlc3NCeXRlcyB8fCAhZW9zKSkgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLCBpblNpemUsCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKworICAgIGludDMyX3QgbnVtQ2hhbm5lbHMgPSBtQ29uZmlnLT5udW1fY2hhbm5lbHM7CisgICAgc2l6ZV90IGNhbE91dFNpemU7CisgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiBkZWNvZGVkU2l6ZXM7CisgICAgaWYgKGluU2l6ZSAmJiBPSyAhPSBjYWxjdWxhdGVPdXRTaXplKGNvbnN0X2Nhc3Q8dWludDggKj4oclZpZXcuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TaXplLCAmZGVjb2RlZFNpemVzKSkgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FsT3V0U2l6ZSA9IHN0ZDo6YWNjdW11bGF0ZShkZWNvZGVkU2l6ZXMuYmVnaW4oKSwgZGVjb2RlZFNpemVzLmVuZCgpLCAwKTsKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIGNhbE91dFNpemUgKz0ga1BWTVAzRGVjb2RlckRlbGF5ICogbnVtQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKGNhbE91dFNpemUsIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IG91dFNpemUgPSAwOworICAgIGludCBvdXRPZmZzZXQgPSAwOworICAgIGF1dG8gaXQgPSBkZWNvZGVkU2l6ZXMuYmVnaW4oKTsKKyAgICBzaXplX3QgaW5Qb3MgPSAwOworICAgIGludDMyX3Qgc2FtcGxpbmdSYXRlID0gbUNvbmZpZy0+c2FtcGxpbmdSYXRlOworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBpZiAoaXQgPT0gZGVjb2RlZFNpemVzLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HRSgidW5leHBlY3RlZCB0cmFpbGluZyBieXRlcywgaWdub3JpbmcgdGhlbSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBtQ29uZmlnLT5wSW5wdXRCdWZmZXIgPSBjb25zdF9jYXN0PHVpbnQ4ICo+KHJWaWV3LmRhdGEoKSArIGluUG9zKTsKKyAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJDdXJyZW50TGVuZ3RoID0gKGluU2l6ZSAtIGluUG9zKTsKKyAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJNYXhMZW5ndGggPSAwOworICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGggPSAwOworICAgICAgICBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgPSAoY2FsT3V0U2l6ZSAtIG91dFNpemUpOworICAgICAgICBtQ29uZmlnLT5wT3V0cHV0QnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90ICo+ICh3Vmlldy5kYXRhKCkgKyBvdXRTaXplKTsKKworICAgICAgICBFUlJPUl9DT0RFIGRlY29kZXJFcnI7CisgICAgICAgIGlmICgoZGVjb2RlckVyciA9IHB2bXAzX2ZyYW1lZGVjb2RlcihtQ29uZmlnLCBtRGVjb2RlckJ1ZikpCisgICAgICAgICAgICAgICAgIT0gTk9fREVDT0RJTkdfRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJtcDMgZGVjb2RlciByZXR1cm5lZCBlcnJvciAlZCIsIGRlY29kZXJFcnIpOworICAgICAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gTk9fRU5PVUdIX01BSU5fREFUQV9FUlJPUgorICAgICAgICAgICAgICAgICAgICAmJiBkZWNvZGVyRXJyICE9IFNJREVfSU5GT19FUlJPUikgeworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVGhpcyBpcyByZWNvdmVyYWJsZSwganVzdCBpZ25vcmUgdGhlIGN1cnJlbnQgZnJhbWUgYW5kCisgICAgICAgICAgICAvLyBwbGF5IHNpbGVuY2UgaW5zdGVhZC4KKyAgICAgICAgICAgIEFMT0dWKCJpZ25vcmluZyBlcnJvciBhbmQgc2VuZGluZyBzaWxlbmNlIik7CisgICAgICAgICAgICBpZiAobUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplID09IDApIHsKKyAgICAgICAgICAgICAgICBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgPSAqaXQgLyBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1zZXQobUNvbmZpZy0+cE91dHB1dEJ1ZmZlciwgMCwgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgfSBlbHNlIGlmIChtQ29uZmlnLT5zYW1wbGluZ1JhdGUgIT0gc2FtcGxpbmdSYXRlCisgICAgICAgICAgICAgICAgfHwgbUNvbmZpZy0+bnVtX2NoYW5uZWxzICE9IG51bUNoYW5uZWxzKSB7CisgICAgICAgICAgICBBTE9HSSgiUmVjb25maWd1cmluZyBkZWNvZGVyOiAlZC0+JWQgSHosICVkLT4lZCBjaGFubmVscyIsCisgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLCBtQ29uZmlnLT5zYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsIG1Db25maWctPm51bV9jaGFubmVscyk7CisgICAgICAgICAgICBzYW1wbGluZ1JhdGUgPSBtQ29uZmlnLT5zYW1wbGluZ1JhdGU7CisgICAgICAgICAgICBudW1DaGFubmVscyA9IG1Db25maWctPm51bV9jaGFubmVsczsKKworICAgICAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0IHNhbXBsZVJhdGVJbmZvKDB1LCBzYW1wbGluZ1JhdGUpOworICAgICAgICAgICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQgY2hhbm5lbENvdW50SW5mbygwdSwgbnVtQ2hhbm5lbHMpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgeyAmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvIH0sCisgICAgICAgICAgICAgICAgICAgIEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KHNhbXBsZVJhdGVJbmZvKSk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShjaGFubmVsQ291bnRJbmZvKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDb25maWcgVXBkYXRlIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKml0ICE9IG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSAqIHNpemVvZihpbnQxNl90KSkgeworICAgICAgICAgICAgQUxPR0UoInBhbmljLCBwYXJzZWQgc2l6ZSBkb2VzIG5vdCBtYXRjaCBkZWNvZGVkIHNpemUiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgb3V0U2l6ZSArPSBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgKiBzaXplb2YoaW50MTZfdCk7CisgICAgICAgIGluUG9zICs9IG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aDsKKyAgICAgICAgaXQrKzsKKyAgICB9CisgICAgaWYgKG1Jc0ZpcnN0KSB7CisgICAgICAgIG1Jc0ZpcnN0ID0gZmFsc2U7CisgICAgICAgIG1HYXBsZXNzQnl0ZXMgPSB0cnVlOworICAgICAgICAvLyBUaGUgZGVjb2RlciBkZWxheSBpcyA1Mjkgc2FtcGxlcywgc28gdHJpbSB0aGF0IG1hbnkgc2FtcGxlcyBvZmYKKyAgICAgICAgLy8gdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCBvdXRwdXQgYnVmZmVyLiBUaGlzIGVzc2VudGlhbGx5IG1ha2VzIHRoaXMKKyAgICAgICAgLy8gZGVjb2RlciBoYXZlIHplcm8gZGVsYXksIHdoaWNoIHRoZSByZXN0IG9mIHRoZSBwaXBlbGluZSBhc3N1bWVzLgorICAgICAgICBvdXRPZmZzZXQgPSBrUFZNUDNEZWNvZGVyRGVsYXkgKiBudW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgbUFuY2hvclRpbWVTdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1bGwoKTsKKyAgICB9CisgICAgaWYgKGVvcykgeworICAgICAgICBpZiAoY2FsT3V0U2l6ZSA+PQorICAgICAgICAgICAgb3V0U2l6ZSArIGtQVk1QM0RlY29kZXJEZWxheSAqIG51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpKSB7CisgICAgICAgICAgICBpZiAoIW1lbXNldChyZWludGVycHJldF9jYXN0PGludDE2X3QqPih3Vmlldy5kYXRhKCkgKyBvdXRTaXplKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtQVk1QM0RlY29kZXJEZWxheSAqIG51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpKSkgeworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiQWRkaW5nIDUyOSBzYW1wbGVzIGF0IGVuZCIpOworICAgICAgICAgICAgbUdhcGxlc3NCeXRlcyA9IGZhbHNlOworICAgICAgICAgICAgb3V0U2l6ZSArPSBrUFZNUDNEZWNvZGVyRGVsYXkgKiBudW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHVpbnQ2NF90IG91dFRpbWVTdGFtcCA9IG1Qcm9jZXNzZWRTYW1wbGVzICogMTAwMDAwMGxsIC8gc2FtcGxpbmdSYXRlOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzICs9ICgob3V0U2l6ZSAtIG91dE9mZnNldCkgLyAobnVtQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCkpKTsKKyAgICBBTE9HVigib3V0IGJ1ZmZlciBhdHRyLiBvZmZzZXQgJWQgc2l6ZSAlZCB0aW1lc3RhbXAgJXUiLCBvdXRPZmZzZXQsIG91dFNpemUgLSBvdXRPZmZzZXQsCisgICAgICAgICAgKHVpbnQzMl90KShtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wKSk7CisgICAgZGVjb2RlZFNpemVzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soCisgICAgICAgICAgICBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIG91dE9mZnNldCwgb3V0U2l6ZSAtIG91dE9mZnNldCkpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgPSBtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wOworICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgfQorfQorCitjbGFzcyBDMlNvZnRNcDNEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0TXAzRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgIG5ldyBDMlNvZnRNUDMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRNUDM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRNUDM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0TVAzOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdE1wM0RlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdE1wM0RlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0MyU29mdE1wM0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0MyU29mdE1wM0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMmJkYzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQzJTb2Z0TXAzRGVjLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX01QM19ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX01QM19ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworc3RydWN0IHRQVk1QM0RlY29kZXJFeHRlcm5hbDsKKworYm9vbCBwYXJzZU1wM0hlYWRlcih1aW50MzJfdCBoZWFkZXIsIHNpemVfdCAqZnJhbWVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9zYW1wbGluZ19yYXRlID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9jaGFubmVscyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRfYml0cmF0ZSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRfbnVtX3NhbXBsZXMgPSBudWxscHRyKTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0TVAzIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdE1QMyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRNUDMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtQVk1QM0RlY29kZXJEZWxheSA9IDUyOSAvLyBzYW1wbGVzCisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgdFBWTVAzRGVjb2RlckV4dGVybmFsICptQ29uZmlnOworICAgIHZvaWQgKm1EZWNvZGVyQnVmOworCisgICAgYm9vbCBtSXNGaXJzdDsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgYm9vbCBtR2FwbGVzc0J5dGVzOworICAgIHVpbnQ2NF90IG1BbmNob3JUaW1lU3RhbXA7CisgICAgdWludDY0X3QgbVByb2Nlc3NlZFNhbXBsZXM7CisKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0TVAzKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX01QM19ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvbW1vbl90aW1lL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2NvbW1vbl90aW1lL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKY29weSB0byBtZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29tbW9uX3RpbWUvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2NvbW1vbl90aW1lL05PVElDRQpjb3B5IHRvIG1lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9OT1RJQ0UKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9wYXRlbnRfZGlzY2xhaW1lci50eHQgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvcGF0ZW50X2Rpc2NsYWltZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YmYxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvcGF0ZW50X2Rpc2NsYWltZXIudHh0CkBAIC0wLDAgKzEsOSBAQAorCitUSElTIElTIE5PVCBBIEdSQU5UIE9GIFBBVEVOVCBSSUdIVFMuCisKK0dvb2dsZSBtYWtlcyBubyByZXByZXNlbnRhdGlvbiBvciB3YXJyYW50eSB0aGF0IHRoZSBjb2RlY3MgZm9yIHdoaWNoCitzb3VyY2UgY29kZSBpcyBtYWRlIGF2YWlsYWJsZSBoZXJldW5kZXIgYXJlIHVuZW5jdW1iZXJlZCBieQordGhpcmQtcGFydHkgcGF0ZW50cy4gIFRob3NlIGludGVuZGluZyB0byB1c2UgdGhpcyBzb3VyY2UgY29kZSBpbgoraGFyZHdhcmUgb3Igc29mdHdhcmUgcHJvZHVjdHMgYXJlIGFkdmlzZWQgdGhhdCBpbXBsZW1lbnRhdGlvbnMgb2YKK3RoZXNlIGNvZGVjcywgaW5jbHVkaW5nIGluIG9wZW4gc291cmNlIHNvZnR3YXJlIG9yIHNoYXJld2FyZSwgbWF5CityZXF1aXJlIHBhdGVudCBsaWNlbnNlcyBmcm9tIHRoZSByZWxldmFudCBwYXRlbnQgaG9sZGVycy4KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0MWYwYTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTYgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfbXBlZzJkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9zaWduZWQtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdE1wZWcyRGVjLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlibXBlZzJkZWMiXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZXh0ZXJuYWwvbGlibXBlZzIvZGVjb2RlciIsCisgICAgICAgICJleHRlcm5hbC9saWJtcGVnMi9jb21tb24iLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9DMlNvZnRNcGVnMkRlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9DMlNvZnRNcGVnMkRlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY3YjQwMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmNwcApAQCAtMCwwICsxLDExMTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdE1wZWcyRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDb2RlYzJNYXBwZXIuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0TXBlZzJEZWMuaCIKKyNpbmNsdWRlICJpbXBlZzJkLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLm1wZWcyLmRlY29kZXIiOworCitjbGFzcyBDMlNvZnRNcGVnMkRlYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fVklERU8sCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOyAvLyBUT0RPOiBhY2NvdW50IGZvciBvdXIgYnVmZmVycyBoZXJlCisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisKKyAgICAgICAgLy8gVE9ETzogb3V0cHV0IGxhdGVuY3kgYW5kIHJlb3JkZXJpbmcKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMTYsIDE5MjAsIDQpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgxNiwgMTA4OCwgNCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX1NJTVBMRSwgQzJDb25maWc6OkxFVkVMX01QMlZfSElHSCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfU0lNUExFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfTUFJTn0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVAyVl9MT1csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QMlZfTUFJTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdIXzE0NDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QMlZfSElHSH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heFNpemUsIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMTkyMCwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDEwODgsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoTWF4UGljdHVyZVNpemVTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heElucHV0U2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDMyMCAqIDI0MCAqIDMgLyAyKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtTWF4SW5wdXRTaXplLCB2YWx1ZSkuYW55KCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuY2FsY3VsYXRlZEFzKE1heElucHV0U2l6ZVNldHRlciwgbU1heFNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIEMyQ2hyb21hT2Zmc2V0U3RydWN0IGxvY2F0aW9uc1sxXSA9IHsgQzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKSB9OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gZGVmYXVsdENvbG9ySW5mbyA9CisgICAgICAgICAgICBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgMXUsIDB1LCA4dSAvKiBiaXREZXB0aCAqLywgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIG1lbWNweShkZWZhdWx0Q29sb3JJbmZvLT5tLmxvY2F0aW9ucywgbG9jYXRpb25zLCBzaXplb2YobG9jYXRpb25zKSk7CisKKyAgICAgICAgZGVmYXVsdENvbG9ySW5mbyA9CisgICAgICAgICAgICBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgeyBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpIH0sCisgICAgICAgICAgICAgICAgICAgIDB1LCA4dSAvKiBiaXREZXB0aCAqLywgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIGhlbHBlci0+YWRkU3RydWN0RGVzY3JpcHRvcnM8QzJDaHJvbWFPZmZzZXRTdHJ1Y3Q+KCk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2xvckluZm8sIEMyX1BBUkFNS0VZX0NPREVEX0NPTE9SX0lORk8pCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKGRlZmF1bHRDb2xvckluZm8pCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRGVmYXVsdENvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvZGVkQ29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9WVUlfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfTElNSVRFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQ29kZWRDb2xvckFzcGVjdHNTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihDb2xvckFzcGVjdHNTZXR0ZXIsIG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBtQ29kZWRDb2xvckFzcGVjdHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgbW9yZSBmb3JtYXRzPworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVBpeGVsRm9ybWF0LCBDMl9QQVJBTUtFWV9QSVhFTF9GT1JNQVQpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZvbGRNZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heFBpY3R1cmVTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gVE9ETzogZ2V0IG1heCB3aWR0aC9oZWlnaHQgZnJvbSB0aGUgc2l6ZSdzIGZpZWxkIGhlbHBlcnMgdnMuIGhhcmRjb2RpbmcKKyAgICAgICAgbWUuc2V0KCkud2lkdGggPSBjMl9taW4oYzJfbWF4KG1lLnYud2lkdGgsIHNpemUudi53aWR0aCksIDE5MjB1KTsKKyAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gYzJfbWluKGMyX21heChtZS52LmhlaWdodCwgc2l6ZS52LmhlaWdodCksIDEwODh1KTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heElucHV0U2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiAmbWF4U2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gYXNzdW1lIGNvbXByZXNzaW9uIHJhdGlvIG9mIDEKKyAgICAgICAgbWUuc2V0KCkudmFsdWUgPSAoKChtYXhTaXplLnYud2lkdGggKyAxNSkgLyAxNikgKiAoKG1heFNpemUudi5oZWlnaHQgKyAxNSkgLyAxNikgKiAzODQpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZClzaXplOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi50cmFuc2ZlciA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIENvZGVkQ29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi50cmFuc2ZlciA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gJmRlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gJmNvZGVkKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyB0YWtlIGRlZmF1bHQgdmFsdWVzIGZvciBhbGwgdW5zcGVjaWZpZWQgZmllbGRzLCBhbmQgY29kZWQgdmFsdWVzIGZvciBzcGVjaWZpZWQgb25lcworICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IGNvZGVkLnYucmFuZ2UgPT0gUkFOR0VfVU5TUEVDSUZJRUQgPyBkZWYudi5yYW5nZSA6IGNvZGVkLnYucmFuZ2U7CisgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IGNvZGVkLnYucHJpbWFyaWVzID09IFBSSU1BUklFU19VTlNQRUNJRklFRAorICAgICAgICAgICAgICAgID8gZGVmLnYucHJpbWFyaWVzIDogY29kZWQudi5wcmltYXJpZXM7CisgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gY29kZWQudi50cmFuc2ZlciA9PSBUUkFOU0ZFUl9VTlNQRUNJRklFRAorICAgICAgICAgICAgICAgID8gZGVmLnYudHJhbnNmZXIgOiBjb2RlZC52LnRyYW5zZmVyOworICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBjb2RlZC52Lm1hdHJpeCA9PSBNQVRSSVhfVU5TUEVDSUZJRUQgPyBkZWYudi5tYXRyaXggOiBjb2RlZC52Lm1hdHJpeDsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IGdldENvbG9yQXNwZWN0c19sKCkgeworICAgICAgICByZXR1cm4gbUNvbG9yQXNwZWN0czsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+IG1NYXhTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbU1heElucHV0U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gbUNvbG9ySW5mbzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gbUNvZGVkQ29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBtRGVmYXVsdENvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjpvdXRwdXQ+IG1Db2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQ+IG1QaXhlbEZvcm1hdDsKK307CisKK3N0YXRpYyBzaXplX3QgZ2V0Q3B1Q29yZUNvdW50KCkgeworICAgIGxvbmcgY3B1Q29yZUNvdW50ID0gMTsKKyNpZiBkZWZpbmVkKF9TQ19OUFJPQ0VTU09SU19PTkxOKQorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworI2Vsc2UKKyAgICAvLyBfU0NfTlBST0NfT05MTiBtdXN0IGJlIGRlZmluZWQuLi4KKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ19PTkxOKTsKKyNlbmRpZgorICAgIENIRUNLKGNwdUNvcmVDb3VudCA+PSAxKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIENQVSBjb3JlczogJWxkIiwgY3B1Q29yZUNvdW50KTsKKyAgICByZXR1cm4gKHNpemVfdCljcHVDb3JlQ291bnQ7Cit9CisKK3N0YXRpYyB2b2lkICppdmRfYWxpZ25lZF9tYWxsb2MoV09SRDMyIGFsaWdubWVudCwgV09SRDMyIHNpemUpIHsKKyAgICByZXR1cm4gbWVtYWxpZ24oYWxpZ25tZW50LCBzaXplKTsKK30KKworc3RhdGljIHZvaWQgaXZkX2FsaWduZWRfZnJlZSh2b2lkICptZW0pIHsKKyAgICBmcmVlKG1lbSk7Cit9CisKK0MyU29mdE1wZWcyRGVjOjpDMlNvZnRNcGVnMkRlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgICAgbURlY0hhbmRsZShudWxscHRyKSwKKyAgICAgICAgbU1lbVJlY29yZHMobnVsbHB0ciksCisgICAgICAgIG1PdXRCdWZmZXJEcmFpbihudWxscHRyKSwKKyAgICAgICAgbUl2Q29sb3Jmb3JtYXQoSVZfWVVWXzQyMFApLAorICAgICAgICBtV2lkdGgoMzIwKSwKKyAgICAgICAgbUhlaWdodCgyNDApLAorICAgICAgICBtT3V0SW5kZXgoMHUpIHsKKyAgICAvLyBJZiBpbnB1dCBkdW1wIGlzIGVuYWJsZWQsIHRoZW4gb3BlbiBjcmVhdGUgYW4gZW1wdHkgZmlsZQorICAgIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKTsKKyAgICBDUkVBVEVfRFVNUF9GSUxFKG1JbkZpbGUpOworfQorCitDMlNvZnRNcGVnMkRlYzo6fkMyU29mdE1wZWcyRGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6b25TdG9wKCkgeworICAgIGlmIChPSyAhPSByZXNldERlY29kZXIoKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICByZXNldFBsdWdpbigpOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRNcGVnMkRlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZCkgb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzJEZWM6Om9uUmVsZWFzZSgpIHsKKyAgICAodm9pZCkgZGVsZXRlRGVjb2RlcigpOworICAgIGlmIChtT3V0QnVmZmVyRHJhaW4pIHsKKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShtT3V0QnVmZmVyRHJhaW4pOworICAgICAgICBtT3V0QnVmZmVyRHJhaW4gPSBudWxscHRyOworICAgIH0KKyAgICBpZiAobU91dEJsb2NrKSB7CisgICAgICAgIG1PdXRCbG9jay5yZXNldCgpOworICAgIH0KKyAgICBpZiAobU1lbVJlY29yZHMpIHsKKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShtTWVtUmVjb3Jkcyk7CisgICAgICAgIG1NZW1SZWNvcmRzID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIGlmIChPSyAhPSBzZXRGbHVzaE1vZGUoKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKworICAgIHVpbnQzMl90IGRpc3BsYXlTdHJpZGUgPSBtU3RyaWRlOworICAgIHVpbnQzMl90IGRpc3BsYXlIZWlnaHQgPSBtSGVpZ2h0OworICAgIHVpbnQzMl90IGJ1ZmZlclNpemUgPSBkaXNwbGF5U3RyaWRlICogZGlzcGxheUhlaWdodCAqIDMgLyAyOworICAgIG1PdXRCdWZmZXJEcmFpbiA9ICh1aW50OF90ICopaXZkX2FsaWduZWRfbWFsbG9jKDEyOCwgYnVmZmVyU2l6ZSk7CisgICAgaWYgKCFtT3V0QnVmZmVyRHJhaW4pIHsKKyAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBhbGxvY2F0ZSB0bXAgb3V0cHV0IGJ1ZmZlciAoZm9yIGZsdXNoKSBvZiBzaXplICV1ICIsIGJ1ZmZlclNpemUpOworICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgIH0KKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOworCisgICAgICAgIHNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsIG51bGxwdHIsIG51bGxwdHIsIDAsIDAsIDApOworICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgaWYgKDAgPT0gc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtT3V0QnVmZmVyRHJhaW4pIHsKKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShtT3V0QnVmZmVyRHJhaW4pOworICAgICAgICBtT3V0QnVmZmVyRHJhaW4gPSBudWxscHRyOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OmdldE51bU1lbVJlY29yZHMoKSB7CisgICAgaXZfbnVtX21lbV9yZWNfaXBfdCBzX251bV9tZW1fcmVjX2lwOworICAgIGl2X251bV9tZW1fcmVjX29wX3Qgc19udW1fbWVtX3JlY19vcDsKKworICAgIHNfbnVtX21lbV9yZWNfaXAudTRfc2l6ZSA9IHNpemVvZihzX251bV9tZW1fcmVjX2lwKTsKKyAgICBzX251bV9tZW1fcmVjX2lwLmVfY21kID0gSVZfQ01EX0dFVF9OVU1fTUVNX1JFQzsKKyAgICBzX251bV9tZW1fcmVjX29wLnU0X3NpemUgPSBzaXplb2Yoc19udW1fbWVtX3JlY19vcCk7CisKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfbnVtX21lbV9yZWNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX251bV9tZW1fcmVjX29wKTsKKyAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIGdldHRpbmcgbWVtIHJlY29yZHM6IDB4JXgiLCBzX251bV9tZW1fcmVjX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgbU51bU1lbVJlY29yZHMgPSBzX251bV9tZW1fcmVjX29wLnU0X251bV9tZW1fcmVjOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6ZmlsbE1lbVJlY29yZHMoKSB7CisgICAgaXZfbWVtX3JlY190ICpwc19tZW1fcmVjID0gKGl2X21lbV9yZWNfdCAqKSBpdmRfYWxpZ25lZF9tYWxsb2MoCisgICAgICAgICAgICAxMjgsIG1OdW1NZW1SZWNvcmRzICogc2l6ZW9mKGl2X21lbV9yZWNfdCkpOworICAgIGlmICghcHNfbWVtX3JlYykgeworICAgICAgICBBTE9HRSgiQWxsb2NhdGlvbiBmYWlsdXJlIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorICAgIG1lbXNldChwc19tZW1fcmVjLCAwLCBtTnVtTWVtUmVjb3JkcyAqIHNpemVvZihpdl9tZW1fcmVjX3QpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1NZW1SZWNvcmRzOyBpKyspCisgICAgICAgIHBzX21lbV9yZWNbaV0udTRfc2l6ZSA9IHNpemVvZihpdl9tZW1fcmVjX3QpOworICAgIG1NZW1SZWNvcmRzID0gcHNfbWVtX3JlYzsKKworICAgIGl2ZGV4dF9maWxsX21lbV9yZWNfaXBfdCBzX2ZpbGxfbWVtX2lwOworICAgIGl2ZGV4dF9maWxsX21lbV9yZWNfb3BfdCBzX2ZpbGxfbWVtX29wOworCisgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9maWxsX21lbV9yZWNfaXBfdCk7CisgICAgc19maWxsX21lbV9pcC51NF9zaGFyZV9kaXNwX2J1ZiA9IDA7CisgICAgc19maWxsX21lbV9pcC5lX291dHB1dF9mb3JtYXQgPSBtSXZDb2xvcmZvcm1hdDsKKyAgICBzX2ZpbGxfbWVtX2lwLnU0X2RlaW50ZXJsYWNlID0gMTsKKyAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LmVfY21kID0gSVZfQ01EX0ZJTExfTlVNX01FTV9SRUM7CisgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC5wdl9tZW1fcmVjX2xvY2F0aW9uID0gbU1lbVJlY29yZHM7CisgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC51NF9tYXhfZnJtX3dkID0gbVdpZHRoOworICAgIHNfZmlsbF9tZW1faXAuc19pdmRfZmlsbF9tZW1fcmVjX2lwX3QudTRfbWF4X2ZybV9odCA9IG1IZWlnaHQ7CisgICAgc19maWxsX21lbV9vcC5zX2l2ZF9maWxsX21lbV9yZWNfb3BfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9maWxsX21lbV9yZWNfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2ZpbGxfbWVtX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19maWxsX21lbV9vcCk7CisgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBpbiBmaWxsaW5nIG1lbSByZWNvcmRzOiAweCV4IiwKKyAgICAgICAgICAgICAgc19maWxsX21lbV9vcC5zX2l2ZF9maWxsX21lbV9yZWNfb3BfdC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgQ0hFQ0tfRVEobU51bU1lbVJlY29yZHMsIHNfZmlsbF9tZW1fb3Auc19pdmRfZmlsbF9tZW1fcmVjX29wX3QudTRfbnVtX21lbV9yZWNfZmlsbGVkKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1NZW1SZWNvcmRzOyBpKyssIHBzX21lbV9yZWMrKykgeworICAgICAgICBwc19tZW1fcmVjLT5wdl9iYXNlID0gaXZkX2FsaWduZWRfbWFsbG9jKAorICAgICAgICAgICAgICAgIHBzX21lbV9yZWMtPnU0X21lbV9hbGlnbm1lbnQsIHBzX21lbV9yZWMtPnU0X21lbV9zaXplKTsKKyAgICAgICAgaWYgKCFwc19tZW1fcmVjLT5wdl9iYXNlKSB7CisgICAgICAgICAgICBBTE9HRSgiQWxsb2NhdGlvbiBmYWlsdXJlIGZvciBtZW1vcnkgcmVjb3JkICMlenUgb2Ygc2l6ZSAldSIsCisgICAgICAgICAgICAgICAgICBpLCBwc19tZW1fcmVjLT51NF9tZW1fc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6Y3JlYXRlRGVjb2RlcigpIHsKKyAgICBpdmRleHRfaW5pdF9pcF90IHNfaW5pdF9pcDsKKyAgICBpdmRleHRfaW5pdF9vcF90IHNfaW5pdF9vcDsKKworICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfaW5pdF9pcF90KTsKKyAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LmVfY21kID0gKElWRF9BUElfQ09NTUFORF9UWVBFX1QpSVZfQ01EX0lOSVQ7CisgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC5wdl9tZW1fcmVjX2xvY2F0aW9uID0gbU1lbVJlY29yZHM7CisgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC51NF9mcm1fbWF4X3dkID0gbVdpZHRoOworICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QudTRfZnJtX21heF9odCA9IG1IZWlnaHQ7CisgICAgc19pbml0X2lwLnU0X3NoYXJlX2Rpc3BfYnVmID0gMDsKKyAgICBzX2luaXRfaXAudTRfZGVpbnRlcmxhY2UgPSAxOworICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QudTRfbnVtX21lbV9yZWMgPSBtTnVtTWVtUmVjb3JkczsKKyAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LmVfb3V0cHV0X2Zvcm1hdCA9IG1JdkNvbG9yZm9ybWF0OworICAgIHNfaW5pdF9vcC5zX2l2ZF9pbml0X29wX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfaW5pdF9vcF90KTsKKworICAgIG1EZWNIYW5kbGUgPSAoaXZfb2JqX3QgKiltTWVtUmVjb3Jkc1swXS5wdl9iYXNlOworICAgIG1EZWNIYW5kbGUtPnB2X2Z4bnMgPSAodm9pZCAqKWl2ZGVjX2FwaV9mdW5jdGlvbjsKKyAgICBtRGVjSGFuZGxlLT51NF9zaXplID0gc2l6ZW9mKGl2X29ial90KTsKKworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19pbml0X2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19pbml0X29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sCisgICAgICAgICAgICAgIHNfaW5pdF9vcC5zX2l2ZF9pbml0X29wX3QudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OnNldE51bUNvcmVzKCkgeworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90IHNfc2V0X251bV9jb3Jlc19pcDsKKyAgICBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCBzX3NldF9udW1fY29yZXNfb3A7CisKKyAgICBzX3NldF9udW1fY29yZXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCk7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLmVfc3ViX2NtZCA9IElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVM7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLnU0X251bV9jb3JlcyA9IG1OdW1Db3JlczsKKyAgICBzX3NldF9udW1fY29yZXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9udW1fY29yZXNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9udW1fY29yZXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRCgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfbnVtX2NvcmVzX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpzZXRQYXJhbXMoc2l6ZV90IHN0cmlkZSkgeworICAgIGl2ZF9jdGxfc2V0X2NvbmZpZ19pcF90IHNfc2V0X2R5bl9wYXJhbXNfaXA7CisgICAgaXZkX2N0bF9zZXRfY29uZmlnX29wX3Qgc19zZXRfZHluX3BhcmFtc19vcDsKKworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3NldF9jb25maWdfaXBfdCk7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfU0VUUEFSQU1TOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAudTRfZGlzcF93ZCA9IChVV09SRDMyKSBzdHJpZGU7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX2ZybV9za2lwX21vZGUgPSBJVkRfU0tJUF9OT05FOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9mcm1fb3V0X21vZGUgPSBJVkRfRElTUExBWV9GUkFNRV9PVVQ7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX3ZpZF9kZWNfbW9kZSA9IElWRF9ERUNPREVfRlJBTUU7CisgICAgc19zZXRfZHluX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2R5bl9wYXJhbXNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9keW5fcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X2R5bl9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OmdldFZlcnNpb24oKSB7CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90IHNfZ2V0X3ZlcnNpb25pbmZvX2lwOworICAgIGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCBzX2dldF92ZXJzaW9uaW5mb19vcDsKKyAgICBVV09SRDggYXUxX2J1Zls1MTJdOworCisgICAgc19nZXRfdmVyc2lvbmluZm9faXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2dldHZlcnNpb25pbmZvX2lwX3QpOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfR0VUVkVSU0lPTjsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC5wdl92ZXJzaW9uX2J1ZmZlciA9IGF1MV9idWY7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAudTRfdmVyc2lvbl9idWZmZXJfc2l6ZSA9IHNpemVvZihhdTFfYnVmKTsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92ZXJzaW9uaW5mb19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3ZlcnNpb25pbmZvX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0QoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sCisgICAgICAgICAgICAgIHNfZ2V0X3ZlcnNpb25pbmZvX29wLnU0X2Vycm9yX2NvZGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJpdHRpYW0gZGVjb2RlciB2ZXJzaW9uIG51bWJlcjogJXMiLAorICAgICAgICAgICAgICAoY2hhciAqKSBzX2dldF92ZXJzaW9uaW5mb19pcC5wdl92ZXJzaW9uX2J1ZmZlcik7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6aW5pdERlY29kZXIoKSB7CisgICAgc3RhdHVzX3QgcmV0ID0gZ2V0TnVtTWVtUmVjb3JkcygpOworICAgIGlmIChPSyAhPSByZXQpIHJldHVybiByZXQ7CisKKyAgICByZXQgPSBmaWxsTWVtUmVjb3JkcygpOworICAgIGlmIChPSyAhPSByZXQpIHJldHVybiByZXQ7CisKKyAgICBpZiAoT0sgIT0gY3JlYXRlRGVjb2RlcigpKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKworICAgIG1OdW1Db3JlcyA9IE1JTihnZXRDcHVDb3JlQ291bnQoKSwgTUFYX05VTV9DT1JFUyk7CisgICAgbVN0cmlkZSA9IEFMSUdONjQobVdpZHRoKTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICByZXNldFBsdWdpbigpOworICAgICh2b2lkKSBzZXROdW1Db3JlcygpOworICAgIGlmIChPSyAhPSBzZXRQYXJhbXMobVN0cmlkZSkpIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICh2b2lkKSBnZXRWZXJzaW9uKCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgQzJTb2Z0TXBlZzJEZWM6OnNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNvZGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjb2RlX29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlYWRWaWV3ICppbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJHcmFwaGljVmlldyAqb3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRzTWFya2VyKSB7CisgICAgdWludDMyX3QgZGlzcGxheVN0cmlkZSA9IG1TdHJpZGU7CisgICAgdWludDMyX3QgZGlzcGxheUhlaWdodCA9IG1IZWlnaHQ7CisgICAgc2l6ZV90IGx1bWFTaXplID0gZGlzcGxheVN0cmlkZSAqIGRpc3BsYXlIZWlnaHQ7CisgICAgc2l6ZV90IGNocm9tYVNpemUgPSBsdW1hU2l6ZSA+PiAyOworCisgICAgcHNfZGVjb2RlX2lwLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfaXBfdCk7CisgICAgcHNfZGVjb2RlX2lwLT5lX2NtZCA9IElWRF9DTURfVklERU9fREVDT0RFOworICAgIGlmIChpbkJ1ZmZlcikgeworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X3RzID0gdHNNYXJrZXI7CisgICAgICAgIHBzX2RlY29kZV9pcC0+cHZfc3RyZWFtX2J1ZmZlciA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpbkJ1ZmZlci0+ZGF0YSgpICsgaW5PZmZzZXQpOworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X251bV9CeXRlcyA9IGluU2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X3RzID0gMDsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5wdl9zdHJlYW1fYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT51NF9udW1fQnl0ZXMgPSAwOworICAgIH0KKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzBdID0gbHVtYVNpemU7CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVsxXSA9IGNocm9tYVNpemU7CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbWluX291dF9idWZfc2l6ZVsyXSA9IGNocm9tYVNpemU7CisgICAgaWYgKG91dEJ1ZmZlcikgeworICAgICAgICBpZiAob3V0QnVmZmVyLT53aWR0aCgpIDwgZGlzcGxheVN0cmlkZSB8fCBvdXRCdWZmZXItPmhlaWdodCgpIDwgZGlzcGxheUhlaWdodCkgeworICAgICAgICAgICAgQUxPR0UoIk91dHB1dCBidWZmZXIgdG9vIHNtYWxsOiBwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICgldXgldSkiLAorICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT53aWR0aCgpLCBvdXRCdWZmZXItPmhlaWdodCgpLCBkaXNwbGF5U3RyaWRlLCBkaXNwbGF5SGVpZ2h0KTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1swXSA9IG91dEJ1ZmZlci0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMV0gPSBvdXRCdWZmZXItPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzJdID0gb3V0QnVmZmVyLT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworICAgIH0gZWxzZSB7CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzBdID0gbU91dEJ1ZmZlckRyYWluOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1sxXSA9IG1PdXRCdWZmZXJEcmFpbiArIGx1bWFTaXplOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1syXSA9IG1PdXRCdWZmZXJEcmFpbiArIGx1bWFTaXplICsgY2hyb21hU2l6ZTsKKyAgICB9CisgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIudTRfbnVtX2J1ZnMgPSAzOworICAgIHBzX2RlY29kZV9vcC0+dTRfc2l6ZSA9IHNpemVvZihpdmRfdmlkZW9fZGVjb2RlX29wX3QpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKKworYm9vbCBDMlNvZnRNcGVnMkRlYzo6Z2V0U2VxSW5mbygpIHsKKyAgICBpdmRleHRfY3RsX2dldF9zZXFfaW5mb19pcF90IHNfY3RsX2dldF9zZXFfaW5mb19pcDsKKyAgICBpdmRleHRfY3RsX2dldF9zZXFfaW5mb19vcF90IHNfY3RsX2dldF9zZXFfaW5mb19vcDsKKworICAgIHNfY3RsX2dldF9zZXFfaW5mb19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfZ2V0X3NlcV9pbmZvX2lwX3QpOworICAgIHNfY3RsX2dldF9zZXFfaW5mb19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfY3RsX2dldF9zZXFfaW5mb19pcC5lX3N1Yl9jbWQgPQorICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKUlNUEVHMkRfQ01EX0NUTF9HRVRfU0VRX0lORk87CisgICAgc19jdGxfZ2V0X3NlcV9pbmZvX29wLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9nZXRfc2VxX2luZm9fb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2N0bF9nZXRfc2VxX2luZm9faXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2N0bF9nZXRfc2VxX2luZm9fb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HVygiRXJyb3IgaW4gZ2V0dGluZyBTZXF1ZW5jZSBpbmZvOiAweCV4Iiwgc19jdGxfZ2V0X3NlcV9pbmZvX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgVnVpQ29sb3JBc3BlY3RzIHZ1aUNvbG9yQXNwZWN0czsKKyAgICB2dWlDb2xvckFzcGVjdHMucHJpbWFyaWVzID0gc19jdGxfZ2V0X3NlcV9pbmZvX29wLnUxX2NvbG91cl9wcmltYXJpZXM7CisgICAgdnVpQ29sb3JBc3BlY3RzLnRyYW5zZmVyID0gc19jdGxfZ2V0X3NlcV9pbmZvX29wLnUxX3RyYW5zZmVyX2NoYXJhY3RlcmlzdGljczsKKyAgICB2dWlDb2xvckFzcGVjdHMuY29lZmZzID0gc19jdGxfZ2V0X3NlcV9pbmZvX29wLnUxX21hdHJpeF9jb2VmZmljaWVudHM7CisgICAgdnVpQ29sb3JBc3BlY3RzLmZ1bGxSYW5nZSA9ICBmYWxzZTsgIC8vIG1wZWcyIHZpZGVvIGhhcyBsaW1pdGVkIHJhbmdlLgorCisgICAgLy8gY29udmVydCB2dWkgYXNwZWN0cyB0byBDMiB2YWx1ZXMgaWYgY2hhbmdlZAorICAgIGlmICghKHZ1aUNvbG9yQXNwZWN0cyA9PSBtQml0c3RyZWFtQ29sb3JBc3BlY3RzKSkgeworICAgICAgICBtQml0c3RyZWFtQ29sb3JBc3BlY3RzID0gdnVpQ29sb3JBc3BlY3RzOworICAgICAgICBDb2xvckFzcGVjdHMgc2ZBc3BlY3RzOworICAgICAgICBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0IGNvZGVkQXNwZWN0cyA9IHsgMHUgfTsKKyAgICAgICAgQ29sb3JVdGlsczo6Y29udmVydElzb0NvbG9yQXNwZWN0c1RvQ29kZWNBc3BlY3RzKAorICAgICAgICAgICAgICAgIHZ1aUNvbG9yQXNwZWN0cy5wcmltYXJpZXMsIHZ1aUNvbG9yQXNwZWN0cy50cmFuc2ZlciwgdnVpQ29sb3JBc3BlY3RzLmNvZWZmcywKKyAgICAgICAgICAgICAgICB2dWlDb2xvckFzcGVjdHMuZnVsbFJhbmdlLCBzZkFzcGVjdHMpOworICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1QcmltYXJpZXMsICZjb2RlZEFzcGVjdHMucHJpbWFyaWVzKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1SYW5nZSwgJmNvZGVkQXNwZWN0cy5yYW5nZSkpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubU1hdHJpeENvZWZmcywgJmNvZGVkQXNwZWN0cy5tYXRyaXgpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubVRyYW5zZmVyLCAmY29kZWRBc3BlY3RzLnRyYW5zZmVyKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAodm9pZCltSW50Zi0+Y29uZmlnKHsmY29kZWRBc3BlY3RzfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OnNldEZsdXNoTW9kZSgpIHsKKyAgICBpdmRfY3RsX2ZsdXNoX2lwX3Qgc19zZXRfZmx1c2hfaXA7CisgICAgaXZkX2N0bF9mbHVzaF9vcF90IHNfc2V0X2ZsdXNoX29wOworCisgICAgc19zZXRfZmx1c2hfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2ZsdXNoX2lwX3QpOworICAgIHNfc2V0X2ZsdXNoX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfZmx1c2hfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfRkxVU0g7CisgICAgc19zZXRfZmx1c2hfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2ZsdXNoX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZmx1c2hfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9mbHVzaF9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3NldF9mbHVzaF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6cmVzZXREZWNvZGVyKCkgeworICAgIGl2ZF9jdGxfcmVzZXRfaXBfdCBzX3Jlc2V0X2lwOworICAgIGl2ZF9jdGxfcmVzZXRfb3BfdCBzX3Jlc2V0X29wOworCisgICAgc19yZXNldF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfcmVzZXRfaXBfdCk7CisgICAgc19yZXNldF9pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfcmVzZXRfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfUkVTRVQ7CisgICAgc19yZXNldF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfcmVzZXRfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3Jlc2V0X2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19yZXNldF9vcCk7CisgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3Jlc2V0X29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgKHZvaWQpIHNldE51bUNvcmVzKCk7CisgICAgbVN0cmlkZSA9IDA7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzJEZWM6OnJlc2V0UGx1Z2luKCkgeworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVFbmQsIG51bGxwdHIpOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6ZGVsZXRlRGVjb2RlcigpIHsKKyAgICBpZiAobU1lbVJlY29yZHMpIHsKKyAgICAgICAgaXZfbWVtX3JlY190ICpwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtTWVtUmVjb3JkczsgaSsrLCBwc19tZW1fcmVjKyspIHsKKyAgICAgICAgICAgIGlmIChwc19tZW1fcmVjLT5wdl9iYXNlKSB7CisgICAgICAgICAgICAgICAgaXZkX2FsaWduZWRfZnJlZShwc19tZW1fcmVjLT5wdl9iYXNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG1NZW1SZWNvcmRzKTsKKyAgICAgICAgbU1lbVJlY29yZHMgPSBudWxscHRyOworICAgIH0KKyAgICBtRGVjSGFuZGxlID0gbnVsbHB0cjsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OnJlSW5pdERlY29kZXIoKSB7CisgICAgZGVsZXRlRGVjb2RlcigpOworCisgICAgc3RhdHVzX3QgcmV0ID0gaW5pdERlY29kZXIoKTsKKyAgICBpZiAoT0sgIT0gcmV0KSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBkZWNvZGVyIik7CisgICAgICAgIGRlbGV0ZURlY29kZXIoKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzJEZWM6OmZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBjcmVhdGVHcmFwaGljQnVmZmVyKHN0ZDo6bW92ZShtT3V0QmxvY2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlY3QobVdpZHRoLCBtSGVpZ2h0KSk7CisgICAgbU91dEJsb2NrID0gbnVsbHB0cjsKKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBidWZmZXItPnNldEluZm8obUludGYtPmdldENvbG9yQXNwZWN0c19sKCkpOworICAgIH0KKworICAgIGNsYXNzIEZpbGxXb3JrIHsKKyAgICAgICBwdWJsaWM6CisgICAgICAgIEZpbGxXb3JrKHVpbnQzMl90IGZsYWdzLCBDMldvcmtPcmRpbmFsU3RydWN0IG9yZGluYWwsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIGJ1ZmZlcikKKyAgICAgICAgICAgIDogbUZsYWdzKGZsYWdzKSwgbU9yZGluYWwob3JkaW5hbCksIG1CdWZmZXIoYnVmZmVyKSB7fQorICAgICAgICB+RmlsbFdvcmsoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrKSB7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpbUZsYWdzOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gbU9yZGluYWw7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgICAgICAgICBpZiAobUJ1ZmZlcikgeworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhtQnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJ0aW1lc3RhbXAgPSAlbGxkLCBpbmRleCA9ICVsbGQsIHcvJXMgYnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgIG1PcmRpbmFsLnRpbWVzdGFtcC5wZWVrbGwoKSwgbU9yZGluYWwuZnJhbWVJbmRleC5wZWVrbGwoKSwKKyAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPyAiIiA6ICJvIik7CisgICAgICAgIH0KKworICAgICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IHVpbnQzMl90IG1GbGFnczsKKyAgICAgICAgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCBtT3JkaW5hbDsKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBtQnVmZmVyOworICAgIH07CisKKyAgICBhdXRvIGZpbGxXb3JrID0gW2J1ZmZlcl0oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KTA7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgfTsKKyAgICBpZiAod29yayAmJiBjMl9jbnRyNjRfdChpbmRleCkgPT0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4KSB7CisgICAgICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgICAgICAvLyBUT0RPOiBDaGVjayBpZiBjbG9uZUFuZFNlbmQgY2FuIGJlIGF2b2lkZWQgYnkgdHJhY2tpbmcgbnVtYmVyIG9mIGZyYW1lcyByZW1haW5pbmcKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgICAgIG1PdXRJbmRleCA9IGluZGV4OworICAgICAgICAgICAgICAgIEMyV29ya09yZGluYWxTdHJ1Y3Qgb3V0T3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgICAgICAgICAgY2xvbmVBbmRTZW5kKAorICAgICAgICAgICAgICAgICAgICBtT3V0SW5kZXgsIHdvcmssCisgICAgICAgICAgICAgICAgICAgIEZpbGxXb3JrKEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUsIG91dE9yZGluYWwsIGJ1ZmZlcikpOworICAgICAgICAgICAgICAgIGJ1ZmZlci5yZXNldCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmaW5pc2goaW5kZXgsIGZpbGxXb3JrKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjplbnN1cmVEZWNvZGVyU3RhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIGlmICghbURlY0hhbmRsZSkgeworICAgICAgICBBTE9HRSgibm90IHN1cHBvc2VkIHRvIGJlIGhlcmUsIGludmFsaWQgZGVjb2RlciBjb250ZXh0Iik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIGlmIChtU3RyaWRlICE9IEFMSUdONjQobVdpZHRoKSkgeworICAgICAgICBtU3RyaWRlID0gQUxJR042NChtV2lkdGgpOworICAgICAgICBpZiAoT0sgIT0gc2V0UGFyYW1zKG1TdHJpZGUpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICBpZiAobU91dEJsb2NrICYmCisgICAgICAgICAgICAobU91dEJsb2NrLT53aWR0aCgpICE9IG1TdHJpZGUgfHwgbU91dEJsb2NrLT5oZWlnaHQoKSAhPSBtSGVpZ2h0KSkgeworICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKCFtT3V0QmxvY2spIHsKKyAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOworICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKG1TdHJpZGUsIG1IZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZtT3V0QmxvY2spOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiZmV0Y2hHcmFwaGljQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigicHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJWR4JWQpIiwKKyAgICAgICAgICAgICAgbU91dEJsb2NrLT53aWR0aCgpLCBtT3V0QmxvY2stPmhlaWdodCgpLCBtU3RyaWRlLCBtSGVpZ2h0KTsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKy8vIFRPRE86IGNhbiBvdmVyYWxsIGVycm9yIGNoZWNraW5nIGJlIGltcHJvdmVkPworLy8gVE9ETzogYWxsb3cgY29uZmlndXJhdGlvbiBvZiBjb2xvciBmb3JtYXQgYW5kIHVzYWdlIGZvciBncmFwaGljIGJ1ZmZlcnMgaW5zdGVhZAorLy8gICAgICAgb2YgaGFyZCBjb2RpbmcgdGhlbSB0byBIQUxfUElYRUxfRk9STUFUX1lWMTIKKy8vIFRPRE86IHBhc3MgY29sb3Jhc3BlY3RzIGluZm9ybWF0aW9uIHRvIHN1cmZhY2UKKy8vIFRPRE86IHRlc3Qgc3VwcG9ydCBmb3IgZHluYW1pYyBjaGFuZ2UgaW4gcmVzb2x1dGlvbgorLy8gVE9ETzogdmVyaWZ5IGlmIHRoZSBkZWNvZGVyIHNlbnQgYmFjayBhbGwgZnJhbWVzCit2b2lkIEMyU29mdE1wZWcyRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgdWludDMyX3Qgd29ya0luZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkgJiAweEZGRkZGRkZGOworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIGJvb2wgaGFzUGljdHVyZSA9IGZhbHNlOworCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCwgZmxhZ3MgJXgiLAorICAgICAgICAgIGluU2l6ZSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksIHdvcmstPmlucHV0LmZsYWdzKTsKKyAgICBzaXplX3QgaW5Qb3MgPSAwOworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBpZiAoQzJfT0sgIT0gZW5zdXJlRGVjb2RlclN0YXRlKHBvb2wpKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDMkdyYXBoaWNWaWV3IHdWaWV3ID0gbU91dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisgICAgICAgIGlmICghc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgJnJWaWV3LCAmd1ZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbk9mZnNldCArIGluUG9zLCBpblNpemUgLSBpblBvcywgd29ya0luZGV4KSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gSWYgaW5wdXQgZHVtcCBpcyBlbmFibGVkLCB0aGVuIHdyaXRlIHRvIGZpbGUKKyAgICAgICAgRFVNUF9UT19GSUxFKG1JbkZpbGUsIHNfZGVjb2RlX2lwLnB2X3N0cmVhbV9idWZmZXIsIHNfZGVjb2RlX2lwLnU0X251bV9CeXRlcyk7CisgICAgICAgIFdPUkQzMiBkZWxheTsKKyAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgZGVsYXkpOworICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgV09SRDMyIGRlY29kZVRpbWU7CisgICAgICAgIEdFVFRJTUUoJm1UaW1lRW5kLCBudWxscHRyKTsKKyAgICAgICAgVElNRV9ESUZGKG1UaW1lU3RhcnQsIG1UaW1lRW5kLCBkZWNvZGVUaW1lKTsKKyAgICAgICAgQUxPR1YoImRlY29kZVRpbWU9JTZkIGRlbGF5PSU2ZCBudW1CeXRlcz0lNmQgIiwgZGVjb2RlVGltZSwgZGVsYXksCisgICAgICAgICAgICAgIHNfZGVjb2RlX29wLnU0X251bV9ieXRlc19jb25zdW1lZCk7CisgICAgICAgIGlmIChJTVBFRzJEX1VOU1VQUE9SVEVEX0RJTUVOU0lPTlMgPT0gc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSkgeworICAgICAgICAgICAgQUxPR1YoInVuc3VwcG9ydGVkIHJlc29sdXRpb24gOiAlZHglZCIsIHNfZGVjb2RlX29wLnU0X3BpY193ZCwgc19kZWNvZGVfb3AudTRfcGljX2h0KTsKKyAgICAgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX05PX0VPUywgcG9vbCwgd29yayk7CisgICAgICAgICAgICByZXNldFBsdWdpbigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgICAgICAgICAgIG1XaWR0aCA9IHNfZGVjb2RlX29wLnU0X3BpY193ZDsKKyAgICAgICAgICAgIG1IZWlnaHQgPSBzX2RlY29kZV9vcC51NF9waWNfaHQ7CisKKyAgICAgICAgICAgIEFMT0dJKCJDb25maWd1cmluZyBkZWNvZGVyOiBtV2lkdGggJWQgLCBtSGVpZ2h0ICVkICIsCisgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQgc2l6ZSgwdSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgICAgICAgICAgbUludGYtPmNvbmZpZyh7JnNpemV9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoc2l6ZSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IHNldCB3aWR0aCBhbmQgaGVpZ2h0Iik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChPSyAhPSByZUluaXREZWNvZGVyKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlaW5pdGlhbGl6ZSBkZWNvZGVyIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChJVkRfUkVTX0NIQU5HRUQgPT0gKHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSkgeworICAgICAgICAgICAgQUxPR1YoInJlc29sdXRpb24gY2hhbmdlZCIpOworICAgICAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfTk9fRU9TLCBwb29sLCB3b3JrKTsKKyAgICAgICAgICAgIHJlc2V0RGVjb2RlcigpOworICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoMCA8IHNfZGVjb2RlX29wLnU0X3BpY193ZCAmJiAwIDwgc19kZWNvZGVfb3AudTRfcGljX2h0KSB7CisgICAgICAgICAgICBpZiAoc19kZWNvZGVfb3AudTRfcGljX3dkICE9IG1XaWR0aCB8fCAgc19kZWNvZGVfb3AudTRfcGljX2h0ICE9IG1IZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBtV2lkdGggPSBzX2RlY29kZV9vcC51NF9waWNfd2Q7CisgICAgICAgICAgICAgICAgbUhlaWdodCA9IHNfZGVjb2RlX29wLnU0X3BpY19odDsKKyAgICAgICAgICAgICAgICBDSEVDS19FUSgwdSwgc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpOworCisgICAgICAgICAgICAgICAgQUxPR0koIkNvbmZpZ3VyaW5nIGRlY29kZXIgb3V0OiBtV2lkdGggJWQgLCBtSGVpZ2h0ICVkICIsCisgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICAgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCBzaXplKDB1LCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAgICAgICAgICBtSW50Zi0+Y29uZmlnKHsmc2l6ZX0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShzaXplKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBzZXQgd2lkdGggYW5kIGhlaWdodCIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAodm9pZCkgZ2V0U2VxSW5mbygpOworICAgICAgICBoYXNQaWN0dXJlIHw9ICgxID09IHNfZGVjb2RlX29wLnU0X2ZyYW1lX2RlY29kZWRfZmxhZyk7CisgICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgZmluaXNoV29yayhzX2RlY29kZV9vcC51NF90cywgd29yayk7CisgICAgICAgIH0KKworICAgICAgICBpblBvcyArPSBzX2RlY29kZV9vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQ7CisgICAgICAgIGlmIChoYXNQaWN0dXJlICYmIChpblNpemUgLSBpblBvcykgIT0gMCkgeworICAgICAgICAgICAgQUxPR0QoImRlY29kZWQgZnJhbWUgaW4gY3VycmVudCBhY2Nlc3MgbmFsLCBpZ25vcmluZyBmdXJ0aGVyIHRyYWlsaW5nIGJ5dGVzICVkIiwKKyAgICAgICAgICAgICAgICAgIChpbnQpaW5TaXplIC0gKGludClpblBvcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlb3MpIHsKKyAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsIHBvb2wsIHdvcmspOworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCFoYXNQaWN0dXJlKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6ZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICBpZiAoT0sgIT0gc2V0Rmx1c2hNb2RlKCkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWYgKEMyX09LICE9IGVuc3VyZURlY29kZXJTdGF0ZShwb29sKSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBtT3V0QmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOworICAgICAgICBpZiAoIXNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsIG51bGxwdHIsICZ3VmlldywgMCwgMCwgMCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICBmaW5pc2hXb3JrKHNfZGVjb2RlX29wLnU0X3RzLCB3b3JrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICByZXR1cm4gZHJhaW5JbnRlcm5hbChkcmFpbk1vZGUsIHBvb2wsIG51bGxwdHIpOworfQorCitjbGFzcyBDMlNvZnRNcGVnMkRlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRNcGVnMkRlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRNcGVnMkRlYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0TXBlZzJEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0TXBlZzJEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRNcGVnMkRlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdE1wZWcyRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0TXBlZzJEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9DMlNvZnRNcGVnMkRlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ZDNiODcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnMi9DMlNvZnRNcGVnMkRlYy5oCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfTVBFRzJfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9NUEVHMl9ERUNfSF8KKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CisKKyNpbmNsdWRlICJpdl9kYXRhdHlwZWRlZi5oIgorI2luY2x1ZGUgIml2LmgiCisjaW5jbHVkZSAiaXZkLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2RlZmluZSBpdmRlY19hcGlfZnVuY3Rpb24gICAgICAgICAgICAgIGltcGVnMmRfYXBpX2Z1bmN0aW9uCisjZGVmaW5lIGl2ZGV4dF9pbml0X2lwX3QgICAgICAgICAgICAgICAgaW1wZWcyZF9pbml0X2lwX3QKKyNkZWZpbmUgaXZkZXh0X2luaXRfb3BfdCAgICAgICAgICAgICAgICBpbXBlZzJkX2luaXRfb3BfdAorI2RlZmluZSBpdmRleHRfZmlsbF9tZW1fcmVjX2lwX3QgICAgICAgIGltcGVnMmRfZmlsbF9tZW1fcmVjX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2ZpbGxfbWVtX3JlY19vcF90ICAgICAgICBpbXBlZzJkX2ZpbGxfbWVtX3JlY19vcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90ICAgaW1wZWcyZF9jdGxfc2V0X251bV9jb3Jlc19pcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90ICAgaW1wZWcyZF9jdGxfc2V0X251bV9jb3Jlc19vcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfZ2V0X3NlcV9pbmZvX2lwX3QgICAgaW1wZWcyZF9jdGxfZ2V0X3NlcV9pbmZvX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9nZXRfc2VxX2luZm9fb3BfdCAgICBpbXBlZzJkX2N0bF9nZXRfc2VxX2luZm9fb3BfdAorI2RlZmluZSBBTElHTjY0KHgpICAgICAgICAgICAgICAgICAgICAgICgoKCh4KSArIDYzKSA+PiA2KSA8PCA2KQorI2RlZmluZSBNQVhfTlVNX0NPUkVTICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgSVZERVhUX0NNRF9DVExfU0VUX05VTV9DT1JFUyAgICBcCisgICAgICAgIChJVkRfQ09OVFJPTF9BUElfQ09NTUFORF9UWVBFX1QpSU1QRUcyRF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMKKyNkZWZpbmUgTUlOKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZGVmaW5lIEdFVFRJTUUoYSwgYikgICAgICAgICAgICAgICAgICAgZ2V0dGltZW9mZGF5KGEsIGIpOworI2RlZmluZSBUSU1FX0RJRkYoc3RhcnQsIGVuZCwgZGlmZikgICAgIFwKKyAgICBkaWZmID0gKCgoZW5kKS50dl9zZWMgLSAoc3RhcnQpLnR2X3NlYykgKiAxMDAwMDAwKSArIFwKKyAgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKKworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKyAgICAjZGVmaW5lIElOUFVUX0RVTVBfUEFUSCAgICAgIi9zZGNhcmQvY2xpcHMvbXBlZzJkX2lucHV0IgorICAgICNkZWZpbmUgSU5QVVRfRFVNUF9FWFQgICAgICAibTJ2IgorICAgICNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdHJjcHkobUluRmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzcHJpbnRmKG1JbkZpbGUsICIlc18lbGQuJWxkLiVzIiwgSU5QVVRfRFVNUF9QQVRILCAgXAorICAgICAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfc2VjLCBtVGltZVN0YXJ0LnR2X3VzZWMsICAgICAgXAorICAgICAgICAgICAgICAgIElOUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyAgICAjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRklMRSAqZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAid2IiKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGZwICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJDb3VsZCBub3Qgb3BlbiBmaWxlICVzIiwgbV9maWxlbmFtZSk7ICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisgICAgI2RlZmluZSBEVU1QX1RPX0ZJTEUobV9maWxlbmFtZSwgbV9idWYsIG1fc2l6ZSkgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEZJTEUgKmZwID0gZm9wZW4obV9maWxlbmFtZSwgImFiIik7ICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChmcCAhPSBOVUxMICYmIG1fYnVmICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB1aW50MzJfdCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpID0gZndyaXRlKG1fYnVmLCAxLCBtX3NpemUsIGZwKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiZndyaXRlIHJldCAlZCB0byB3cml0ZSAlZCIsIGksIG1fc2l6ZSk7ICBcCisgICAgICAgICAgICBpZiAoaSAhPSAodWludDMyX3QpbV9zaXplKSB7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQUxPR0QoIkVycm9yIGluIGZ3cml0ZSwgcmV0dXJuZWQgJWQiLCBpKTsgICBcCisgICAgICAgICAgICAgICAgcGVycm9yKCJFcnJvciBpbiB3cml0ZSB0byBmaWxlIik7ICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiQ291bGQgbm90IHdyaXRlIHRvIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTtcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UgLyogRklMRV9EVU1QX0VOQUJMRSAqLworICAgICNkZWZpbmUgSU5QVVRfRFVNUF9QQVRICisgICAgI2RlZmluZSBJTlBVVF9EVU1QX0VYVAorICAgICNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSAorICAgICNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUCisgICAgI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkKKyAgICAjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkKKyAgICAjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKQorI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKworc3RydWN0IEMyU29mdE1wZWcyRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdE1wZWcyRGVjKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0TXBlZzJEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgcHJpdmF0ZToKKyAgICBzdGF0dXNfdCBnZXROdW1NZW1SZWNvcmRzKCk7CisgICAgc3RhdHVzX3QgZmlsbE1lbVJlY29yZHMoKTsKKyAgICBzdGF0dXNfdCBjcmVhdGVEZWNvZGVyKCk7CisgICAgc3RhdHVzX3Qgc2V0TnVtQ29yZXMoKTsKKyAgICBzdGF0dXNfdCBzZXRQYXJhbXMoc2l6ZV90IHN0cmlkZSk7CisgICAgc3RhdHVzX3QgZ2V0VmVyc2lvbigpOworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgYm9vbCBzZXREZWNvZGVBcmdzKGl2ZF92aWRlb19kZWNvZGVfaXBfdCAqcHNfZGVjb2RlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY29kZV9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgQzJSZWFkVmlldyAqaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgKm91dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB0c01hcmtlcik7CisgICAgYm9vbCBnZXRTZXFJbmZvKCk7CisgICAgYzJfc3RhdHVzX3QgZW5zdXJlRGVjb2RlclN0YXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpOworICAgIHZvaWQgZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOworICAgIHN0YXR1c190IHNldEZsdXNoTW9kZSgpOworICAgIGMyX3N0YXR1c190IGRyYWluSW50ZXJuYWwoCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOworICAgIHN0YXR1c190IHJlc2V0RGVjb2RlcigpOworICAgIHZvaWQgcmVzZXRQbHVnaW4oKTsKKyAgICBzdGF0dXNfdCBkZWxldGVEZWNvZGVyKCk7CisgICAgc3RhdHVzX3QgcmVJbml0RGVjb2RlcigpOworCisgICAgLy8gVE9ETzpUaGlzIGlzIG5vdCB0aGUgcmlnaHQgcGxhY2UgZm9yIHRoaXMgZW51bS4gVGhlc2Ugc2hvdWxkCisgICAgLy8gYmUgcGFydCBvZiBjMi12bmRrIHNvIHRoYXQgdGhleSBjYW4gYmUgYWNjZXNzZWQgYnkgYWxsIHZpZGVvIHBsdWdpbnMKKyAgICAvLyB1bnRpbCB0aGVuLCBtYWtlIHRoZW0gZmVlbCBhdCBob21lCisgICAgZW51bSB7CisgICAgICAgIGtOb3RTdXBwb3J0ZWQsCisgICAgICAgIGtQcmVmZXJCaXRzdHJlYW0sCisgICAgICAgIGtQcmVmZXJDb250YWluZXIsCisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgaXZfb2JqX3QgKm1EZWNIYW5kbGU7CisgICAgaXZfbWVtX3JlY190ICptTWVtUmVjb3JkczsKKyAgICBzaXplX3QgbU51bU1lbVJlY29yZHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBtT3V0QmxvY2s7CisgICAgdWludDhfdCAqbU91dEJ1ZmZlckRyYWluOworCisgICAgc2l6ZV90IG1OdW1Db3JlczsKKyAgICBJVl9DT0xPUl9GT1JNQVRfVCBtSXZDb2xvcmZvcm1hdDsKKworICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIHVpbnQzMl90IG1TdHJpZGU7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIHN0ZDo6YXRvbWljX3VpbnQ2NF90IG1PdXRJbmRleDsKKworICAgIC8vIENvbG9yIGFzcGVjdHMuIFRoZXNlIGFyZSBJU08gdmFsdWVzIGFuZCBhcmUgbWVhbnQgdG8gZGV0ZWN0IGNoYW5nZXMgaW4gYXNwZWN0cyB0byBhdm9pZAorICAgIC8vIGNvbnZlcnRpbmcgdGhlbSB0byBDMiB2YWx1ZXMgZm9yIGVhY2ggZnJhbWUKKyAgICBzdHJ1Y3QgVnVpQ29sb3JBc3BlY3RzIHsKKyAgICAgICAgdWludDhfdCBwcmltYXJpZXM7CisgICAgICAgIHVpbnQ4X3QgdHJhbnNmZXI7CisgICAgICAgIHVpbnQ4X3QgY29lZmZzOworICAgICAgICB1aW50OF90IGZ1bGxSYW5nZTsKKworICAgICAgICAvLyBkZWZhdWx0IGNvbG9yIGFzcGVjdHMKKyAgICAgICAgVnVpQ29sb3JBc3BlY3RzKCkKKyAgICAgICAgICAgIDogcHJpbWFyaWVzKDIpLCB0cmFuc2ZlcigyKSwgY29lZmZzKDIpLCBmdWxsUmFuZ2UoMCkgeyB9CisKKyAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZ1aUNvbG9yQXNwZWN0cyAmbykgeworICAgICAgICAgICAgcmV0dXJuIHByaW1hcmllcyA9PSBvLnByaW1hcmllcyAmJiB0cmFuc2ZlciA9PSBvLnRyYW5zZmVyICYmIGNvZWZmcyA9PSBvLmNvZWZmcworICAgICAgICAgICAgICAgICAgICAmJiBmdWxsUmFuZ2UgPT0gby5mdWxsUmFuZ2U7CisgICAgICAgIH0KKyAgICB9IG1CaXRzdHJlYW1Db2xvckFzcGVjdHM7CisKKyAgICAvLyBwcm9maWxlCisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVTdGFydDsKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZUVuZDsKKyNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCisgICAgY2hhciBtSW5GaWxlWzIwMF07CisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0TXBlZzJEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfTVBFRzJfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFlNGY0NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQW5kcm9pZC5icApAQCAtMCwwICsxLDY2IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X21wZWc0ZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRNcGVnNERlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnN0YWdlZnJpZ2h0X200dmgyNjNkZWMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURPU0NMX0lNUE9SVF9SRUY9IiwKKyAgICAgICAgIi1ETVBFRzQiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfaDI2M2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0TXBlZzREZWMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1ET1NDTF9JTVBPUlRfUkVGPSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9tcGVnNGVuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisgICAgXSwKKworCisgICAgc3JjczogWyJDMlNvZnRNcGVnNEVuYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnN0YWdlZnJpZ2h0X200dmgyNjNlbmMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURNUEVHNCIsCisgICAgICAgICItRE9TQ0xfSU1QT1JUX1JFRj0iLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfaDI2M2VuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0TXBlZzRFbmMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyAibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2VuYyIgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURPU0NMX0lNUE9SVF9SRUY9IiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNERlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTY2ODVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNERlYy5jcHAKQEAgLTAsMCArMSw3NTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaWZkZWYgTVBFRzQKKyAgI2RlZmluZSBMT0dfVEFHICJDMlNvZnRNcGVnNERlYyIKKyNlbHNlCisgICNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0SDI2M0RlYyIKKyNlbmRpZgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRNcGVnNERlYy5oIgorI2luY2x1ZGUgIm1wNGRlY19hcGkuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjaWZkZWYgTVBFRzQKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5tcGVnNC5kZWNvZGVyIjsKKyNlbHNlCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuaDI2My5kZWNvZGVyIjsKKyNlbmRpZgorCitjbGFzcyBDMlNvZnRNcGVnNERlYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fVklERU8sCisjaWZkZWYgTVBFRzQKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNAorI2Vsc2UKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzCisjZW5kaWYKKyAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOyAvLyBUT0RPOiBhY2NvdW50IGZvciBvdXIgYnVmZmVycyBoZXJlCisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisKKyAgICAgICAgLy8gVE9ETzogUHJvcGVyIHN1cHBvcnQgZm9yIHJlb3JkZXIgZGVwdGguCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWN0dWFsT3V0cHV0RGVsYXksIEMyX1BBUkFNS0VZX09VVFBVVF9ERUxBWSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjpvdXRwdXQoMXUpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQoMHUsIDE3NiwgMTQ0KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisjaWZkZWYgTVBFRzQKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAxOTIwLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMTA4OCwgMiksCisjZWxzZQorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDM1MiwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDI4OCwgMiksCisjZW5kaWYKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNpemVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisjaWZkZWYgTVBFRzQKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9TSU1QTEUsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzMpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLmVxdWFsVG8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9TSU1QTEUpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzNCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfNEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl82fSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworI2Vsc2UKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfSDI2M19CQVNFTElORSwgQzJDb25maWc6OkxFVkVMX0gyNjNfMzApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0JBU0VMSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSVNXVjJ9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0gyNjNfMTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0gyNjNfMjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0gyNjNfMzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0gyNjNfNDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0gyNjNfNDV9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisjZW5kaWYKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heFNpemUsIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkUpCisjaWZkZWYgTVBFRzQKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dCgwdSwgMTkyMCwgMTA4OCkpCisjZWxzZQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0KDB1LCAzNTIsIDI4OCkpCisjZW5kaWYKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisjaWZkZWYgTVBFRzQKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAxOTIwLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMTA4OCwgMiksCisjZWxzZQorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDM1MiwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDI4OCwgMiksCisjZW5kaWYKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKE1heFBpY3R1cmVTaXplU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhJbnB1dFNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDE5MjAgKiAxMDg4ICogMyAvIDIpKQorI2Vsc2UKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCAzNTIgKiAyODggKiAzIC8gMikpCisjZW5kaWYKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtTWF4SW5wdXRTaXplLCB2YWx1ZSkuYW55KCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuY2FsY3VsYXRlZEFzKE1heElucHV0U2l6ZVNldHRlciwgbU1heFNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIEMyQ2hyb21hT2Zmc2V0U3RydWN0IGxvY2F0aW9uc1sxXSA9IHsgQzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKSB9OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gZGVmYXVsdENvbG9ySW5mbyA9CisgICAgICAgICAgICBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgMXUsIDB1LCA4dSAvKiBiaXREZXB0aCAqLywgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIG1lbWNweShkZWZhdWx0Q29sb3JJbmZvLT5tLmxvY2F0aW9ucywgbG9jYXRpb25zLCBzaXplb2YobG9jYXRpb25zKSk7CisKKyAgICAgICAgZGVmYXVsdENvbG9ySW5mbyA9CisgICAgICAgICAgICBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgeyBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpIH0sCisgICAgICAgICAgICAgICAgICAgIDB1LCA4dSAvKiBiaXREZXB0aCAqLywgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIGhlbHBlci0+YWRkU3RydWN0RGVzY3JpcHRvcnM8QzJDaHJvbWFPZmZzZXRTdHJ1Y3Q+KCk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2xvckluZm8sIEMyX1BBUkFNS0VZX0NPREVEX0NPTE9SX0lORk8pCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKGRlZmF1bHRDb2xvckluZm8pCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgbW9yZSBmb3JtYXRzPworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVBpeGVsRm9ybWF0LCBDMl9QQVJBTUtFWV9QSVhFTF9GT1JNQVQpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZvbGRNZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heFBpY3R1cmVTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gVE9ETzogZ2V0IG1heCB3aWR0aC9oZWlnaHQgZnJvbSB0aGUgc2l6ZSdzIGZpZWxkIGhlbHBlcnMgdnMuIGhhcmRjb2RpbmcKKyNpZmRlZiBNUEVHNAorICAgICAgICBtZS5zZXQoKS53aWR0aCA9IGMyX21pbihjMl9tYXgobWUudi53aWR0aCwgc2l6ZS52LndpZHRoKSwgMTkyMHUpOworICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBjMl9taW4oYzJfbWF4KG1lLnYuaGVpZ2h0LCBzaXplLnYuaGVpZ2h0KSwgMTA4OHUpOworI2Vsc2UKKyAgICAgICAgbWUuc2V0KCkud2lkdGggPSBjMl9taW4oYzJfbWF4KG1lLnYud2lkdGgsIHNpemUudi53aWR0aCksIDM1MnUpOworICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBjMl9taW4oYzJfbWF4KG1lLnYuaGVpZ2h0LCBzaXplLnYuaGVpZ2h0KSwgMjg4dSk7CisjZW5kaWYKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heElucHV0U2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiAmbWF4U2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gYXNzdW1lIGNvbXByZXNzaW9uIHJhdGlvIG9mIDEKKyAgICAgICAgbWUuc2V0KCkudmFsdWUgPSAoKChtYXhTaXplLnYud2lkdGggKyAxNSkgLyAxNikgKiAoKG1heFNpemUudi5oZWlnaHQgKyAxNSkgLyAxNikgKiAzODQpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZClzaXplOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgdWludDMyX3QgZ2V0TWF4V2lkdGgoKSBjb25zdCB7IHJldHVybiBtTWF4U2l6ZS0+d2lkdGg7IH0KKyAgICB1aW50MzJfdCBnZXRNYXhIZWlnaHQoKSBjb25zdCB7IHJldHVybiBtTWF4U2l6ZS0+aGVpZ2h0OyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+IG1NYXhTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbU1heElucHV0U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gbUNvbG9ySW5mbzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dD4gbVBpeGVsRm9ybWF0OworfTsKKworQzJTb2Z0TXBlZzREZWM6OkMyU29mdE1wZWc0RGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1EZWNIYW5kbGUobnVsbHB0ciksCisgICAgICBtT3V0cHV0QnVmZmVye30sCisgICAgICBtSW5pdGlhbGl6ZWQoZmFsc2UpIHsKK30KKworQzJTb2Z0TXBlZzREZWM6On5DMlNvZnRNcGVnNERlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzREZWM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RGVjb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRDsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzREZWM6Om9uU3RvcCgpIHsKKyAgICBpZiAobUluaXRpYWxpemVkKSB7CisgICAgICAgIGlmIChtRGVjSGFuZGxlKSB7CisgICAgICAgICAgICBQVkNsZWFuVXBWaWRlb0RlY29kZXIobURlY0hhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgbUluaXRpYWxpemVkID0gZmFsc2U7CisgICAgfQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGtOdW1PdXRwdXRCdWZmZXJzOyArK2kpIHsKKyAgICAgICAgaWYgKG1PdXRwdXRCdWZmZXJbaV0pIHsKKyAgICAgICAgICAgIGZyZWUobU91dHB1dEJ1ZmZlcltpXSk7CisgICAgICAgICAgICBtT3V0cHV0QnVmZmVyW2ldID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKyAgICBtTnVtU2FtcGxlc091dHB1dCA9IDA7CisgICAgbUZyYW1lc0NvbmZpZ3VyZWQgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzREZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7CisgICAgKHZvaWQpb25Jbml0KCk7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzREZWM6Om9uUmVsZWFzZSgpIHsKKyAgICBpZiAobUluaXRpYWxpemVkKSB7CisgICAgICAgIGlmIChtRGVjSGFuZGxlKSB7CisgICAgICAgICAgICBQVkNsZWFuVXBWaWRlb0RlY29kZXIobURlY0hhbmRsZSk7CisgICAgICAgICAgICBkZWxldGUgbURlY0hhbmRsZTsKKyAgICAgICAgICAgIG1EZWNIYW5kbGUgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgIH0KKyAgICBpZiAobU91dEJsb2NrKSB7CisgICAgICAgIG1PdXRCbG9jay5yZXNldCgpOworICAgIH0KKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBrTnVtT3V0cHV0QnVmZmVyczsgKytpKSB7CisgICAgICAgIGlmIChtT3V0cHV0QnVmZmVyW2ldKSB7CisgICAgICAgICAgICBmcmVlKG1PdXRwdXRCdWZmZXJbaV0pOworICAgICAgICAgICAgbU91dHB1dEJ1ZmZlcltpXSA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RGVjOjpvbkZsdXNoX3NtKCkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgaWYgKFBWX1RSVUUgIT0gUFZSZXNldFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKSkgeworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgIH0KKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnNERlYzo6aW5pdERlY29kZXIoKSB7CisjaWZkZWYgTVBFRzQKKyAgICBtSXNNcGVnNCA9IHRydWU7CisjZWxzZQorICAgIG1Jc01wZWc0ID0gZmFsc2U7CisjZW5kaWYKKyAgICBpZiAoIW1EZWNIYW5kbGUpIHsKKyAgICAgICAgbURlY0hhbmRsZSA9IG5ldyB0YWd2aWRlb0RlY0NvbnRyb2xzOworICAgIH0KKyAgICBpZiAoIW1EZWNIYW5kbGUpIHsKKyAgICAgICAgQUxPR0UoIm1EZWNIYW5kbGUgaXMgbnVsbCIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKyAgICBtZW1zZXQobURlY0hhbmRsZSwgMCwgc2l6ZW9mKHRhZ3ZpZGVvRGVjQ29udHJvbHMpKTsKKworICAgIC8qIFRPRE86IGJyaW5nIHRoZXNlIHZhbHVlcyB0byAzNTIgYW5kIDI4OC4gSXQgY2Fubm90IGJlIGRvbmUgYXMgb2Ygbm93CisgICAgICogYmVjYXVzZSwgaDI2MyBkb2Vzbid0IHNlZW0gdG8gYWxsb3cgcG9ydCByZWNvbmZpZ3VyYXRpb24uIEluIE9NWCwgdGhlCisgICAgICogcHJvYmxlbSBvZiBsYXJnZXIgd2lkdGggYW5kIGhlaWdodCB0aGFuIGRlZmF1bHQgd2lkdGggYW5kIGhlaWdodCBpcworICAgICAqIG92ZXJjb21lIGJ5IGFkYXB0aXZlUGxheUJhY2soKSBhcGkgY2FsbC4gVGhpcyBjYWxsIGdldHMgd2lkdGggYW5kIGhlaWdodAorICAgICAqIGluZm9ybWF0aW9uIGZyb20gZXh0cmFjdG9yLiBTdWNoIGEgdGhpbmcgaXMgbm90IHBvc3NpYmxlIGhlcmUuCisgICAgICogU28gd2UgYXJlIGNvbmZpZ3VyaW5nIHRvIGxhcmdlciB2YWx1ZXMuKi8KKyAgICBtV2lkdGggPSAxNDA4OworICAgIG1IZWlnaHQgPSAxMTUyOworICAgIG1OdW1TYW1wbGVzT3V0cHV0ID0gMDsKKyAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBtRnJhbWVzQ29uZmlndXJlZCA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgfQorICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCit2b2lkIEMyU29mdE1wZWc0RGVjOjpmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0gY3JlYXRlR3JhcGhpY0J1ZmZlcihzdGQ6Om1vdmUobU91dEJsb2NrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJSZWN0KG1XaWR0aCwgbUhlaWdodCkpOworICAgIG1PdXRCbG9jayA9IG51bGxwdHI7CisgICAgYXV0byBmaWxsV29yayA9IFtidWZmZXIsIGluZGV4XShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIGlmICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAmJgorICAgICAgICAgICAgICAgIChjMl9jbnRyNjRfdChpbmRleCkgPT0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4KSkgeworICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB9OworICAgIGlmICh3b3JrICYmIGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpIHsKKyAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmluaXNoKGluZGV4LCBmaWxsV29yayk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNERlYzo6ZW5zdXJlRGVjb2RlclN0YXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICBpZiAoIW1EZWNIYW5kbGUpIHsKKyAgICAgICAgQUxPR0UoIm5vdCBzdXBwb3NlZCB0byBiZSBoZXJlLCBpbnZhbGlkIGRlY29kZXIgY29udGV4dCIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIG1PdXRwdXRCdWZmZXJTaXplID0gYWxpZ24obUludGYtPmdldE1heFdpZHRoKCksIDE2KSAqIGFsaWduKG1JbnRmLT5nZXRNYXhIZWlnaHQoKSwgMTYpICogMyAvIDI7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwga051bU91dHB1dEJ1ZmZlcnM7ICsraSkgeworICAgICAgICBpZiAoIW1PdXRwdXRCdWZmZXJbaV0pIHsKKyAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJbaV0gPSAodWludDhfdCAqKW1hbGxvYyhtT3V0cHV0QnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBpZiAoIW1PdXRwdXRCdWZmZXJbaV0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChtT3V0QmxvY2sgJiYKKyAgICAgICAgICAgIChtT3V0QmxvY2stPndpZHRoKCkgIT0gYWxpZ24obVdpZHRoLCAxNikgfHwgbU91dEJsb2NrLT5oZWlnaHQoKSAhPSBtSGVpZ2h0KSkgeworICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKCFtT3V0QmxvY2spIHsKKyAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOworICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKGFsaWduKG1XaWR0aCwgMTYpLCBtSGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCAmbU91dEJsb2NrKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoImZldGNoR3JhcGhpY0Jsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInByb3ZpZGVkICglZHglZCkgcmVxdWlyZWQgKCVkeCVkKSIsCisgICAgICAgICAgICAgIG1PdXRCbG9jay0+d2lkdGgoKSwgbU91dEJsb2NrLT5oZWlnaHQoKSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitib29sIEMyU29mdE1wZWc0RGVjOjpoYW5kbGVSZXNDaGFuZ2UoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB1aW50MzJfdCBkaXNwX3dpZHRoLCBkaXNwX2hlaWdodDsKKyAgICBQVkdldFZpZGVvRGltZW5zaW9ucyhtRGVjSGFuZGxlLCAoaW50MzIgKikmZGlzcF93aWR0aCwgKGludDMyICopJmRpc3BfaGVpZ2h0KTsKKworICAgIHVpbnQzMl90IGJ1Zl93aWR0aCwgYnVmX2hlaWdodDsKKyAgICBQVkdldEJ1ZmZlckRpbWVuc2lvbnMobURlY0hhbmRsZSwgKGludDMyICopJmJ1Zl93aWR0aCwgKGludDMyICopJmJ1Zl9oZWlnaHQpOworCisgICAgQ0hFQ0tfTEUoZGlzcF93aWR0aCwgYnVmX3dpZHRoKTsKKyAgICBDSEVDS19MRShkaXNwX2hlaWdodCwgYnVmX2hlaWdodCk7CisKKyAgICBBTE9HVigiZGlzcGxheSBzaXplICglZHglZCksIGJ1ZmZlciBzaXplICglZHglZCkiLAorICAgICAgICAgICBkaXNwX3dpZHRoLCBkaXNwX2hlaWdodCwgYnVmX3dpZHRoLCBidWZfaGVpZ2h0KTsKKworICAgIGJvb2wgcmVzQ2hhbmdlZCA9IGZhbHNlOworICAgIGlmIChkaXNwX3dpZHRoICE9IG1XaWR0aCB8fCBkaXNwX2hlaWdodCAhPSBtSGVpZ2h0KSB7CisgICAgICAgIG1XaWR0aCA9IGRpc3Bfd2lkdGg7CisgICAgICAgIG1IZWlnaHQgPSBkaXNwX2hlaWdodDsKKyAgICAgICAgcmVzQ2hhbmdlZCA9IHRydWU7CisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGtOdW1PdXRwdXRCdWZmZXJzOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChtT3V0cHV0QnVmZmVyW2ldKSB7CisgICAgICAgICAgICAgICAgZnJlZShtT3V0cHV0QnVmZmVyW2ldKTsKKyAgICAgICAgICAgICAgICBtT3V0cHV0QnVmZmVyW2ldID0gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghbUlzTXBlZzQpIHsKKyAgICAgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKKworICAgICAgICAgICAgdWludDhfdCAqdm9sX2RhdGFbMV17fTsKKyAgICAgICAgICAgIGludDMyX3Qgdm9sX3NpemUgPSAwOworCisgICAgICAgICAgICBpZiAoIVBWSW5pdFZpZGVvRGVjb2RlcigKKyAgICAgICAgICAgICAgICAgICAgbURlY0hhbmRsZSwgdm9sX2RhdGEsICZ2b2xfc2l6ZSwgMSwgbUludGYtPmdldE1heFdpZHRoKCksIG1JbnRmLT5nZXRNYXhIZWlnaHQoKSwgSDI2M19NT0RFKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJFcnJvciBpbiBQVkluaXRWaWRlb0RlY29kZXIgSDI2M19NT0RFIHdoaWxlIHJlc0NoYW5nZWQgd2FzIHNldCB0byB0cnVlIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUZyYW1lc0NvbmZpZ3VyZWQgPSBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHJlc0NoYW5nZWQ7Cit9CisKKy8qIFRPRE86IGNhbiByZW1vdmUgdGVtcG9yYXJ5IGNvcHkgYWZ0ZXIgbGlicmFyeSBzdXBwb3J0cyB3cml0aW5nIHRvIGRpc3BsYXkKKyAqIGJ1ZmZlciBZLCBVIGFuZCBWIHBsYW5lIHBvaW50ZXJzIHVzaW5nIHN0cmlkZSBpbmZvLiAqLworc3RhdGljIHZvaWQgY29weU91dHB1dEJ1ZmZlclRvWXV2UGxhbmFyRnJhbWUoCisgICAgICAgIHVpbnQ4X3QgKmRzdCwgdWludDhfdCAqc3JjLAorICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLAorICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgdWludDMyX3Qgd2lkdGgsCisgICAgICAgIHVpbnQzMl90IGhlaWdodCkgeworICAgIHNpemVfdCBzcmNVVlN0cmlkZSA9IHNyY1lTdHJpZGUgLyAyOworICAgIHVpbnQ4X3QgKnNyY1N0YXJ0ID0gc3JjOworICAgIHVpbnQ4X3QgKmRzdFN0YXJ0ID0gZHN0OworICAgIHNpemVfdCB2U3RyaWRlID0gYWxpZ24oaGVpZ2h0LCAxNik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgeworICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCB3aWR0aCk7CisgICAgICAgICBzcmMgKz0gc3JjWVN0cmlkZTsKKyAgICAgICAgIGRzdCArPSBkc3RZU3RyaWRlOworICAgIH0KKyAgICAvKiBVIGJ1ZmZlciAqLworICAgIHNyYyA9IHNyY1N0YXJ0ICsgdlN0cmlkZSAqIHNyY1lTdHJpZGU7CisgICAgZHN0ID0gZHN0U3RhcnQgKyAoZHN0WVN0cmlkZSAqIGhlaWdodCkgKyAoZHN0VVZTdHJpZGUgKiBoZWlnaHQgLyAyKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgeworICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCB3aWR0aCAvIDIpOworICAgICAgICAgc3JjICs9IHNyY1VWU3RyaWRlOworICAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgIH0KKyAgICAvKiBWIGJ1ZmZlciAqLworICAgIHNyYyA9IHNyY1N0YXJ0ICsgdlN0cmlkZSAqIHNyY1lTdHJpZGUgKiA1IC8gNDsKKyAgICBkc3QgPSBkc3RTdGFydCArIChkc3RZU3RyaWRlICogaGVpZ2h0KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgeworICAgICAgICAgbWVtY3B5KGRzdCwgc3JjLCB3aWR0aCAvIDIpOworICAgICAgICAgc3JjICs9IHNyY1VWU3RyaWRlOworICAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgIH0KK30KKwordm9pZCBDMlNvZnRNcGVnNERlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIHVpbnQzMl90IHdvcmtJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpICYgMHhGRkZGRkZGRjsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsCisgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwgd29yay0+aW5wdXQuZmxhZ3MpOworCisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgaWYgKGluU2l6ZSA9PSAwKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50OF90ICpiaXRzdHJlYW0gPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oclZpZXcuZGF0YSgpICsgaW5PZmZzZXQpOworICAgIHVpbnQzMl90ICpzdGFydF9jb2RlID0gKHVpbnQzMl90ICopYml0c3RyZWFtOworICAgIGJvb2wgdm9sSGVhZGVyID0gKnN0YXJ0X2NvZGUgPT0gMHhCMDAxMDAwMDsKKyAgICBpZiAodm9sSGVhZGVyKSB7CisgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKKyAgICAgICAgbUluaXRpYWxpemVkID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgdWludDhfdCAqdm9sX2RhdGFbMV17fTsKKyAgICAgICAgaW50MzJfdCB2b2xfc2l6ZSA9IDA7CisKKyAgICAgICAgYm9vbCBjb2RlY0NvbmZpZyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMDsKKyAgICAgICAgaWYgKGNvZGVjQ29uZmlnIHx8IHZvbEhlYWRlcikgeworICAgICAgICAgICAgdm9sX2RhdGFbMF0gPSBiaXRzdHJlYW07CisgICAgICAgICAgICB2b2xfc2l6ZSA9IGluU2l6ZTsKKyAgICAgICAgfQorICAgICAgICBNUDREZWNvZGluZ01vZGUgbW9kZSA9IChtSXNNcGVnNCkgPyBNUEVHNF9NT0RFIDogSDI2M19NT0RFOworICAgICAgICBpZiAoIVBWSW5pdFZpZGVvRGVjb2RlcigKKyAgICAgICAgICAgICAgICBtRGVjSGFuZGxlLCB2b2xfZGF0YSwgJnZvbF9zaXplLCAxLAorICAgICAgICAgICAgICAgIG1JbnRmLT5nZXRNYXhXaWR0aCgpLCBtSW50Zi0+Z2V0TWF4SGVpZ2h0KCksIG1vZGUpKSB7CisgICAgICAgICAgICBBTE9HRSgiUFZJbml0VmlkZW9EZWNvZGVyIGZhaWxlZC4gVW5zdXBwb3J0ZWQgY29udGVudD8iKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUluaXRpYWxpemVkID0gdHJ1ZTsKKyAgICAgICAgTVA0RGVjb2RpbmdNb2RlIGFjdHVhbE1vZGUgPSBQVkdldERlY0JpdHN0cmVhbU1vZGUobURlY0hhbmRsZSk7CisgICAgICAgIGlmIChtb2RlICE9IGFjdHVhbE1vZGUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJEZWNvZGVkIG1vZGUgbm90IHNhbWUgYXMgYWN0dWFsIG1vZGUgb2YgdGhlIGRlY29kZXIiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBQVlNldFBvc3RQcm9jVHlwZShtRGVjSGFuZGxlLCAwKTsKKyAgICAgICAgaWYgKGhhbmRsZVJlc0NoYW5nZSh3b3JrKSkgeworICAgICAgICAgICAgQUxPR0koIlNldHRpbmcgd2lkdGggYW5kIGhlaWdodCIpOworICAgICAgICAgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCBzaXplKDB1LCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZyh7JnNpemV9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoc2l6ZSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ29uZmlnIHVwZGF0ZSBzaXplIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY29kZWNDb25maWcpIHsKKyAgICAgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzaXplX3QgaW5Qb3MgPSAwOworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBlbnN1cmVEZWNvZGVyU3RhdGUocG9vbCk7CisgICAgICAgIGlmIChDMl9PSyAhPSBlcnIpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBlcnI7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQzJHcmFwaGljVmlldyB3VmlldyA9IG1PdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IHlGcmFtZVNpemUgPSBzaXplb2YodWludDgpICogbURlY0hhbmRsZS0+c2l6ZTsKKyAgICAgICAgaWYgKG1PdXRwdXRCdWZmZXJTaXplIDwgeUZyYW1lU2l6ZSAqIDMgLyAyKXsKKyAgICAgICAgICAgIEFMT0dFKCJUb28gc21hbGwgb3V0cHV0IGJ1ZmZlcjogJXp1IGJ5dGVzIiwgbU91dHB1dEJ1ZmZlclNpemUpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghbUZyYW1lc0NvbmZpZ3VyZWQpIHsKKyAgICAgICAgICAgIFBWU2V0UmVmZXJlbmNlWVVWKG1EZWNIYW5kbGUsbU91dHB1dEJ1ZmZlclsxXSk7CisgICAgICAgICAgICBtRnJhbWVzQ29uZmlndXJlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBOZWVkIHRvIGNoZWNrIGlmIGhlYWRlciBjb250YWlucyBuZXcgaW5mbywgZS5nLiwgd2lkdGgvaGVpZ2h0LCBldGMuCisgICAgICAgIFZvcEhlYWRlckluZm8gaGVhZGVyX2luZm87CisgICAgICAgIHVpbnQzMl90IHVzZUV4dFRpbWVzdGFtcCA9IChpblBvcyA9PSAwKTsKKyAgICAgICAgaW50MzJfdCB0bXBJblNpemUgPSAoaW50MzJfdClpblNpemU7CisgICAgICAgIHVpbnQ4X3QgKmJpdHN0cmVhbVRtcCA9IGJpdHN0cmVhbTsKKyAgICAgICAgdWludDMyX3QgdGltZXN0YW1wID0gd29ya0luZGV4OworICAgICAgICBpZiAoUFZEZWNvZGVWb3BIZWFkZXIoCisgICAgICAgICAgICAgICAgICAgIG1EZWNIYW5kbGUsICZiaXRzdHJlYW1UbXAsICZ0aW1lc3RhbXAsICZ0bXBJblNpemUsCisgICAgICAgICAgICAgICAgICAgICZoZWFkZXJfaW5mbywgJnVzZUV4dFRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgbU91dHB1dEJ1ZmZlclttTnVtU2FtcGxlc091dHB1dCAmIDFdKSAhPSBQVl9UUlVFKSB7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGRlY29kZSB2b3AgaGVhZGVyLiIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEgyNjMgZG9lc24ndCBoYXZlIFZPTCBoZWFkZXIsIHRoZSBmcmFtZSBzaXplIGluZm9ybWF0aW9uIGlzIGluIHNob3J0IGhlYWRlciwgaS5lLiB0aGUKKyAgICAgICAgLy8gZGVjb2RlciBtYXkgZGV0ZWN0IHNpemUgY2hhbmdlIGFmdGVyIFBWRGVjb2RlVm9wSGVhZGVyLgorICAgICAgICBib29sIHJlc0NoYW5nZSA9IGhhbmRsZVJlc0NoYW5nZSh3b3JrKTsKKyAgICAgICAgaWYgKG1Jc01wZWc0ICYmIHJlc0NoYW5nZSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChyZXNDaGFuZ2UpIHsKKyAgICAgICAgICAgIEFMT0dJKCJTZXR0aW5nIHdpZHRoIGFuZCBoZWlnaHQiKTsKKyAgICAgICAgICAgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQgc2l6ZSgwdSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcoeyZzaXplfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoc2l6ZSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ29uZmlnIHVwZGF0ZSBzaXplIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKFBWRGVjb2RlVm9wQm9keShtRGVjSGFuZGxlLCAmdG1wSW5TaXplKSAhPSBQVl9UUlVFKSB7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGRlY29kZSB2aWRlbyBmcmFtZS4iKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhhbmRsZVJlc0NoYW5nZSh3b3JrKSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQ4X3QgKm91dHB1dEJ1ZmZlclkgPSB3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgICAgICBDMlBsYW5hckxheW91dCBsYXlvdXQgPSB3Vmlldy5sYXlvdXQoKTsKKyAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXS5yb3dJbmM7CisgICAgICAgIHNpemVfdCBkc3RVVlN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdLnJvd0luYzsKKyAgICAgICAgKHZvaWQpY29weU91dHB1dEJ1ZmZlclRvWXV2UGxhbmFyRnJhbWUoCisgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyWSwKKyAgICAgICAgICAgICAgICBtT3V0cHV0QnVmZmVyW21OdW1TYW1wbGVzT3V0cHV0ICYgMV0sCisgICAgICAgICAgICAgICAgZHN0WVN0cmlkZSwgZHN0VVZTdHJpZGUsCisgICAgICAgICAgICAgICAgYWxpZ24obVdpZHRoLCAxNiksIG1XaWR0aCwgbUhlaWdodCk7CisKKyAgICAgICAgaW5Qb3MgKz0gaW5TaXplIC0gKHNpemVfdCl0bXBJblNpemU7CisgICAgICAgIGZpbmlzaFdvcmsod29ya0luZGV4LCB3b3JrKTsKKyAgICAgICAgKyttTnVtU2FtcGxlc091dHB1dDsKKyAgICAgICAgaWYgKGluU2l6ZSAtIGluUG9zICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dEKCJkZWNvZGVkIGZyYW1lLCBpZ25vcmluZyBmdXJ0aGVyIHRyYWlsaW5nIGJ5dGVzICVkIiwKKyAgICAgICAgICAgICAgICAgIChpbnQpaW5TaXplIC0gKGludClpblBvcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzREZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZClwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjbGFzcyBDMlNvZnRNcGVnNERlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRNcGVnNERlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdE1wZWc0RGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRNcGVnNERlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRNcGVnNERlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE1wZWc0RGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0TXBlZzREZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRNcGVnNERlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNERlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNERlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNmEwOTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmgKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJfU09GVF9NUEVHNF9ERUNfSF8KKyNkZWZpbmUgQzJfU09GVF9NUEVHNF9ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworc3RydWN0IHRhZ3ZpZGVvRGVjQ29udHJvbHM7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdE1wZWc0RGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdE1wZWc0RGVjKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0TXBlZzREZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga051bU91dHB1dEJ1ZmZlcnMgPSAyLAorICAgIH07CisKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworICAgIGMyX3N0YXR1c190IGVuc3VyZURlY29kZXJTdGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKTsKKyAgICB2b2lkIGZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKyAgICBib29sIGhhbmRsZVJlc0NoYW5nZShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIHRhZ3ZpZGVvRGVjQ29udHJvbHMgKm1EZWNIYW5kbGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBtT3V0QmxvY2s7CisgICAgdWludDhfdCAqbU91dHB1dEJ1ZmZlcltrTnVtT3V0cHV0QnVmZmVyc107CisgICAgc2l6ZV90ICBtT3V0cHV0QnVmZmVyU2l6ZTsKKworICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIHVpbnQzMl90IG1OdW1TYW1wbGVzT3V0cHV0OworCisgICAgYm9vbCBtSXNNcGVnNDsKKyAgICBib29sIG1Jbml0aWFsaXplZDsKKyAgICBib29sIG1GcmFtZXNDb25maWd1cmVkOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdE1wZWc0RGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQzJfU09GVF9NUEVHNF9ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzRFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNEVuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYwNTNmNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzRFbmMuY3BwCkBAIC0wLDAgKzEsNjYxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaWZkZWYgTVBFRzQKKyAgI2RlZmluZSBMT0dfVEFHICJDMlNvZnRNcGVnNEVuYyIKKyNlbHNlCisgICNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0SDI2M0VuYyIKKyNlbmRpZgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisKKyNpbmNsdWRlICJDMlNvZnRNcGVnNEVuYy5oIgorI2luY2x1ZGUgIm1wNGVuY19hcGkuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCisjaWZkZWYgTVBFRzQKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5tcGVnNC5lbmNvZGVyIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPID0gTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQ7CisjZWxzZQorY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmgyNjMuZW5jb2RlciI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFTyA9IE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjM7CisjZW5kaWYKKworfSAvLyBuYW1lcHNhY2UKKworY2xhc3MgQzJTb2Z0TXBlZzRFbmM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPLAorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsgLy8gVE9ETzogYWNjb3VudCBmb3Igb3VyIGJ1ZmZlcnMgaGVyZQorICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZygKKyAgICAgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtVXNhZ2UsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9VU0FHRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsICh1aW50NjRfdClDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1TaXplLCBDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQoMHUsIDE3NiwgMTQ0KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisjaWZkZWYgTVBFRzQKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgxNiwgMTc2LCAxNiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDE2LCAxNDQsIDE2KSwKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLm9uZU9mKHsxNzYsIDM1Mn0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkub25lT2YoezE0NCwgMjg4fSksCisjZW5kaWYKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNpemVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1GcmFtZVJhdGUsIEMyX1BBUkFNS0VZX0ZSQU1FX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dCgwdSwgMTcuKSkKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBNb3JlIHJlc3RyaWN0aW9uPworICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUZyYW1lUmF0ZSwgdmFsdWUpLmdyZWF0ZXJUaGFuKDAuKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoCisgICAgICAgICAgICAgICAgICAgIFNldHRlcjxkZWNsdHlwZSgqbUZyYW1lUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoNDA5NiwgMTIwMDAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihCaXRyYXRlU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVN5bmNGcmFtZVBlcmlvZCwgQzJfUEFSQU1LRVlfU1lOQ19GUkFNRV9JTlRFUlZBTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc6Om91dHB1dCgwdSwgMTAwMDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU3luY0ZyYW1lUGVyaW9kLCB2YWx1ZSkuYW55KCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbVN5bmNGcmFtZVBlcmlvZCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisjaWZkZWYgTVBFRzQKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBQUk9GSUxFX01QNFZfU0lNUExFLCBMRVZFTF9NUDRWXzIpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLmVxdWFsVG8oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPRklMRV9NUDRWX1NJTVBMRSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfMEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8yfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisjZWxzZQorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIFBST0ZJTEVfSDI2M19CQVNFTElORSwgTEVWRUxfSDI2M180NSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkuZXF1YWxUbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9GSUxFX0gyNjNfQkFTRUxJTkUpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M18xMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M18yMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M18zMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M180MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M180NX0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworI2VuZGlmCisgICAgfQorCisgICAgc3RhdGljIEMyUiBCaXRyYXRlU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKG1lLnYudmFsdWUgPD0gNDA5NikgeworICAgICAgICAgICAgbWUuc2V0KCkudmFsdWUgPSA0MDk2OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+ICZvbGRNZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAoIW1lLkYobWUudi53aWR0aCkuc3VwcG9ydHNBdEFsbChtZS52LndpZHRoKSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LndpZHRoKSkpOworICAgICAgICAgICAgbWUuc2V0KCkud2lkdGggPSBvbGRNZS52LndpZHRoOworICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmhlaWdodCkuc3VwcG9ydHNBdEFsbChtZS52LmhlaWdodCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi5oZWlnaHQpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBvbGRNZS52LmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAoIW1lLkYobWUudi5wcm9maWxlKS5zdXBwb3J0c0F0QWxsKG1lLnYucHJvZmlsZSkpIHsKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgbWUuc2V0KCkucHJvZmlsZSA9IFBST0ZJTEVfTVA0Vl9TSU1QTEU7CisjZWxzZQorICAgICAgICAgICAgbWUuc2V0KCkucHJvZmlsZSA9IFBST0ZJTEVfSDI2M19CQVNFTElORTsKKyNlbmRpZgorICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmxldmVsKS5zdXBwb3J0c0F0QWxsKG1lLnYubGV2ZWwpKSB7CisjaWZkZWYgTVBFRzQKKyAgICAgICAgICAgIG1lLnNldCgpLmxldmVsID0gTEVWRUxfTVA0Vl8yOworI2Vsc2UKKyAgICAgICAgICAgIG1lLnNldCgpLmxldmVsID0gTEVWRUxfSDI2M180NTsKKyNlbmRpZgorICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgLy8gdW5zYWZlIGdldHRlcnMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBnZXRTaXplX2woKSBjb25zdCB7IHJldHVybiBtU2l6ZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gZ2V0RnJhbWVSYXRlX2woKSBjb25zdCB7IHJldHVybiBtRnJhbWVSYXRlOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gZ2V0Qml0cmF0ZV9sKCkgY29uc3QgeyByZXR1cm4gbUJpdHJhdGU7IH0KKyAgICB1aW50MzJfdCBnZXRTeW5jRnJhbWVQZXJpb2QoKSBjb25zdCB7CisgICAgICAgIGlmIChtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSA8IDAgfHwgbVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgPT0gSU5UNjRfTUFYKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBkb3VibGUgcGVyaW9kID0gbVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgLyAxZTYgKiBtRnJhbWVSYXRlLT52YWx1ZTsKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCljMl9tYXgoYzJfbWluKHBlcmlvZCArIDAuNSwgZG91YmxlKFVJTlQzMl9NQVgpKSwgMS4pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQ+IG1Vc2FnZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IG1GcmFtZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVN5bmNGcmFtZUludGVydmFsVHVuaW5nOjpvdXRwdXQ+IG1TeW5jRnJhbWVQZXJpb2Q7Cit9OworCitDMlNvZnRNcGVnNEVuYzo6QzJTb2Z0TXBlZzRFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1IYW5kbGUobnVsbHB0ciksCisgICAgICBtRW5jUGFyYW1zKG51bGxwdHIpLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbU91dEJ1ZmZlclNpemUoNTI0Mjg4KSB7Cit9CisKK0MyU29mdE1wZWc0RW5jOjp+QzJTb2Z0TXBlZzRFbmMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RW5jOjpvbkluaXQoKSB7CisjaWZkZWYgTVBFRzQKKyAgICBtRW5jb2RlTW9kZSA9IENPTUJJTkVfTU9ERV9XSVRIX0VSUl9SRVM7CisjZWxzZQorICAgIG1FbmNvZGVNb2RlID0gSDI2M19NT0RFOworI2VuZGlmCisgICAgaWYgKCFtSGFuZGxlKSB7CisgICAgICAgIG1IYW5kbGUgPSBuZXcgdGFndmlkZW9FbmNDb250cm9sczsKKyAgICB9CisKKyAgICBpZiAoIW1FbmNQYXJhbXMpIHsKKyAgICAgICAgbUVuY1BhcmFtcyA9IG5ldyB0YWd2aWRlb0VuY09wdGlvbnM7CisgICAgfQorCisgICAgaWYgKCEobUVuY1BhcmFtcyAmJiBtSGFuZGxlKSkgcmV0dXJuIEMyX05PX01FTU9SWTsKKworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKworICAgIHJldHVybiBpbml0RW5jb2RlcigpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNEVuYzo6b25TdG9wKCkgeworICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAobUhhbmRsZSkgeworICAgICAgICAodm9pZClQVkNsZWFuVXBWaWRlb0VuY29kZXIobUhhbmRsZSk7CisgICAgfQorICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRNcGVnNEVuYzo6b25SZXNldCgpIHsKKyAgICBvblN0b3AoKTsKKyAgICBpbml0RW5jb2RlcigpOworfQorCit2b2lkIEMyU29mdE1wZWc0RW5jOjpvblJlbGVhc2UoKSB7CisgICAgb25TdG9wKCk7CisgICAgaWYgKG1FbmNQYXJhbXMpIHsKKyAgICAgICAgZGVsZXRlIG1FbmNQYXJhbXM7CisgICAgICAgIG1FbmNQYXJhbXMgPSBudWxscHRyOworICAgIH0KKyAgICBpZiAobUhhbmRsZSkgeworICAgICAgICBkZWxldGUgbUhhbmRsZTsKKyAgICAgICAgbUhhbmRsZSA9IG51bGxwdHI7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNEVuYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RW5jOjppbml0RW5jUGFyYW1zKCkgeworICAgIGlmIChtSGFuZGxlKSB7CisgICAgICAgIG1lbXNldChtSGFuZGxlLCAwLCBzaXplb2YodGFndmlkZW9FbmNDb250cm9scykpOworICAgIH0gZWxzZSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIGlmIChtRW5jUGFyYW1zKSB7CisgICAgICAgIG1lbXNldChtRW5jUGFyYW1zLCAwLCBzaXplb2YodGFndmlkZW9FbmNPcHRpb25zKSk7CisgICAgfSBlbHNlIHJldHVybiBDMl9DT1JSVVBURUQ7CisKKyAgICBpZiAoIVBWR2V0RGVmYXVsdEVuY09wdGlvbihtRW5jUGFyYW1zLCAwKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBkZWZhdWx0IGVuY29kaW5nIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICBpZiAobUZyYW1lUmF0ZS0+dmFsdWUgPT0gMCkgeworICAgICAgICBBTE9HRSgiRnJhbWVyYXRlIHNob3VsZCBub3QgYmUgMCIpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIG1FbmNQYXJhbXMtPmVuY01vZGUgPSBtRW5jb2RlTW9kZTsKKyAgICBtRW5jUGFyYW1zLT5lbmNXaWR0aFswXSA9IG1TaXplLT53aWR0aDsKKyAgICBtRW5jUGFyYW1zLT5lbmNIZWlnaHRbMF0gPSBtU2l6ZS0+aGVpZ2h0OworICAgIG1FbmNQYXJhbXMtPmVuY0ZyYW1lUmF0ZVswXSA9IG1GcmFtZVJhdGUtPnZhbHVlICsgMC41OworICAgIG1FbmNQYXJhbXMtPnJjVHlwZSA9IFZCUl8xOworICAgIG1FbmNQYXJhbXMtPnZidkRlbGF5ID0gNS4wZjsKKyAgICBtRW5jUGFyYW1zLT5wcm9maWxlX2xldmVsID0gQ09SRV9QUk9GSUxFX0xFVkVMMjsKKyAgICBtRW5jUGFyYW1zLT5wYWNrZXRTaXplID0gMzI7CisgICAgbUVuY1BhcmFtcy0+cnZsY0VuYWJsZSA9IFBWX09GRjsKKyAgICBtRW5jUGFyYW1zLT5udW1MYXllcnMgPSAxOworICAgIG1FbmNQYXJhbXMtPnRpbWVJbmNSZXMgPSAxMDAwOworICAgIG1FbmNQYXJhbXMtPnRpY2tQZXJTcmMgPSBtRW5jUGFyYW1zLT50aW1lSW5jUmVzIC8gKG1GcmFtZVJhdGUtPnZhbHVlICsgMC41KTsKKyAgICBtRW5jUGFyYW1zLT5iaXRSYXRlWzBdID0gbUJpdHJhdGUtPnZhbHVlOworICAgIG1FbmNQYXJhbXMtPmlRdWFudFswXSA9IDE1OworICAgIG1FbmNQYXJhbXMtPnBRdWFudFswXSA9IDEyOworICAgIG1FbmNQYXJhbXMtPnF1YW50VHlwZVswXSA9IDA7CisgICAgbUVuY1BhcmFtcy0+bm9GcmFtZVNraXBwZWQgPSBQVl9PRkY7CisKKyAgICAvLyBQVidzIE1QRUc0IGVuY29kZXIgcmVxdWlyZXMgdGhlIHZpZGVvIGRpbWVuc2lvbiBvZiBtdWx0aXBsZQorICAgIGlmIChtU2l6ZS0+d2lkdGggJSAxNiAhPSAwIHx8IG1TaXplLT5oZWlnaHQgJSAxNiAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJWaWRlbyBmcmFtZSBzaXplICVkeCVkIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNiIsCisgICAgICAgICAgICAgIG1TaXplLT53aWR0aCwgbVNpemUtPmhlaWdodCk7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gU2V0IElEUiBmcmFtZSByZWZyZXNoIGludGVydmFsCisgICAgbUVuY1BhcmFtcy0+aW50cmFQZXJpb2QgPSBtSW50Zi0+Z2V0U3luY0ZyYW1lUGVyaW9kKCk7CisgICAgbUVuY1BhcmFtcy0+bnVtSW50cmFNQiA9IDA7CisgICAgbUVuY1BhcmFtcy0+c2NlbmVEZXRlY3QgPSBQVl9PTjsKKyAgICBtRW5jUGFyYW1zLT5zZWFyY2hSYW5nZSA9IDE2OworICAgIG1FbmNQYXJhbXMtPm12OHg4RW5hYmxlID0gUFZfT0ZGOworICAgIG1FbmNQYXJhbXMtPmdvYkhlYWRlckludGVydmFsID0gMDsKKyAgICBtRW5jUGFyYW1zLT51c2VBQ1ByZWQgPSBQVl9PTjsKKyAgICBtRW5jUGFyYW1zLT5pbnRyYURDVmxjVGggPSAwOworCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNEVuYzo6aW5pdEVuY29kZXIoKSB7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgeworICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKyAgICAgICAgbVNpemUgPSBtSW50Zi0+Z2V0U2l6ZV9sKCk7CisgICAgICAgIG1CaXRyYXRlID0gbUludGYtPmdldEJpdHJhdGVfbCgpOworICAgICAgICBtRnJhbWVSYXRlID0gbUludGYtPmdldEZyYW1lUmF0ZV9sKCk7CisgICAgfQorICAgIGMyX3N0YXR1c190IGVyciA9IGluaXRFbmNQYXJhbXMoKTsKKyAgICBpZiAoQzJfT0sgIT0gZXJyKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZWQgZW5jb2RlciBwYXJhbXMiKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgaWYgKCFQVkluaXRWaWRlb0VuY29kZXIobUhhbmRsZSwgbUVuY1BhcmFtcykpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIHRoZSBlbmNvZGVyIik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgLy8gMXN0IGJ1ZmZlciBmb3IgY29kZWMgc3BlY2lmaWMgZGF0YQorICAgIG1OdW1JbnB1dEZyYW1lcyA9IC0xOworICAgIG1TdGFydGVkID0gdHJ1ZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzRFbmM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEluaXRpYWxpemUgZW5jb2RlciBpZiBub3QgYWxyZWFkeSBpbml0aWFsaXplZAorICAgIGlmICghbVN0YXJ0ZWQgJiYgQzJfT0sgIT0gaW5pdEVuY29kZXIoKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgZW5jb2RlciIpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sobU91dEJ1ZmZlclNpemUsIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IHdWaWV3LmVycm9yKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50OF90ICpvdXRQdHIgPSAodWludDhfdCAqKXdWaWV3LmRhdGEoKTsKKyAgICBpZiAobU51bUlucHV0RnJhbWVzIDwgMCkgeworICAgICAgICAvLyBUaGUgdmVyeSBmaXJzdCB0aGluZyB3ZSB3YW50IHRvIG91dHB1dCBpcyB0aGUgY29kZWMgc3BlY2lmaWMgZGF0YS4KKyAgICAgICAgaW50MzJfdCBvdXRwdXRTaXplID0gbU91dEJ1ZmZlclNpemU7CisgICAgICAgIGlmICghUFZHZXRWb2xIZWFkZXIobUhhbmRsZSwgb3V0UHRyLCAmb3V0cHV0U2l6ZSwgMCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IFZPTCBoZWFkZXIiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigiQnl0ZXMgR2VuZXJhdGVkIGluIGhlYWRlciAlZFxuIiwgb3V0cHV0U2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICArK21OdW1JbnB1dEZyYW1lczsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+IGNzZCA9CisgICAgICAgICAgICBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0OjpBbGxvY1VuaXF1ZShvdXRwdXRTaXplLCAwdSk7CisgICAgICAgIGlmICghY3NkKSB7CisgICAgICAgICAgICBBTE9HRSgiQ1NEIGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1lbWNweShjc2QtPm0udmFsdWUsIG91dFB0ciwgb3V0cHV0U2l6ZSk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKHN0ZDo6bW92ZShjc2QpKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJHcmFwaGljVmlldz4gclZpZXc7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBpbnB1dEJ1ZmZlcjsKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICBpbnB1dEJ1ZmZlciA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF07CisgICAgICAgIHJWaWV3ID0gc3RkOjptYWtlX3NoYXJlZDxjb25zdCBDMkdyYXBoaWNWaWV3PigKKyAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpKTsKKyAgICAgICAgaWYgKHJWaWV3LT5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBlcnIgPSAlZCIsIHJWaWV3LT5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHJWaWV3LT5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1aW50NjRfdCBpbnB1dFRpbWVTdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1bGwoKTsKKyAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrIGluQnVmZmVyID0gaW5wdXRCdWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuZnJvbnQoKTsKKyAgICBpZiAoaW5CdWZmZXIud2lkdGgoKSA8IG1TaXplLT53aWR0aCB8fAorICAgICAgICBpbkJ1ZmZlci5oZWlnaHQoKSA8IG1TaXplLT5oZWlnaHQpIHsKKyAgICAgICAgLyogRXhwZWN0IHdpZHRoIGhlaWdodCB0byBiZSBjb25maWd1cmVkICovCisgICAgICAgIEFMT0dXKCJ1bmV4cGVjdGVkIENhcGFjaXR5IEFzcGVjdCAlZCglZCkgeCAlZCglZCkiLCBpbkJ1ZmZlci53aWR0aCgpLAorICAgICAgICAgICAgICBtU2l6ZS0+d2lkdGgsIGluQnVmZmVyLmhlaWdodCgpLCBtU2l6ZS0+aGVpZ2h0KTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQgJmxheW91dCA9IHJWaWV3LT5sYXlvdXQoKTsKKyAgICB1aW50OF90ICp5UGxhbmUgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oclZpZXctPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICAgIHVpbnQ4X3QgKnVQbGFuZSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihyVmlldy0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSk7CisgICAgdWludDhfdCAqdlBsYW5lID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHJWaWV3LT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdKTsKKyAgICBpbnQzMl90IHlTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXS5yb3dJbmM7CisgICAgaW50MzJfdCB1U3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ucm93SW5jOworICAgIGludDMyX3QgdlN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdLnJvd0luYzsKKyAgICB1aW50MzJfdCB3aWR0aCA9IG1TaXplLT53aWR0aDsKKyAgICB1aW50MzJfdCBoZWlnaHQgPSBtU2l6ZS0+aGVpZ2h0OworICAgIC8vIHdpZHRoIGFuZCBoZWlnaHQgYXJlIGFsd2F5cyBldmVuIChhcyBibG9jayBzaXplIGlzIDE2eDE2KQorICAgIENIRUNLX0VRKCh3aWR0aCAmIDF1KSwgMHUpOworICAgIENIRUNLX0VRKChoZWlnaHQgJiAxdSksIDB1KTsKKyAgICBzaXplX3QgeVBsYW5lU2l6ZSA9IHdpZHRoICogaGVpZ2h0OworICAgIHN3aXRjaCAobGF5b3V0LnR5cGUpIHsKKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0I6CisgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCQTogeworICAgICAgICAgICAgTWVtb3J5QmxvY2sgY29udmVyc2lvbkJ1ZmZlciA9IG1Db252ZXJzaW9uQnVmZmVycy5mZXRjaCh5UGxhbmVTaXplICogMyAvIDIpOworICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2UuZW1wbGFjZShjb252ZXJzaW9uQnVmZmVyLmRhdGEoKSwgY29udmVyc2lvbkJ1ZmZlcik7CisgICAgICAgICAgICB5UGxhbmUgPSBjb252ZXJzaW9uQnVmZmVyLmRhdGEoKTsKKyAgICAgICAgICAgIHVQbGFuZSA9IHlQbGFuZSArIHlQbGFuZVNpemU7CisgICAgICAgICAgICB2UGxhbmUgPSB1UGxhbmUgKyB5UGxhbmVTaXplIC8gNDsKKyAgICAgICAgICAgIHlTdHJpZGUgPSB3aWR0aDsKKyAgICAgICAgICAgIHVTdHJpZGUgPSB2U3RyaWRlID0gd2lkdGggLyAyOworICAgICAgICAgICAgQ29udmVydFJHQlRvUGxhbmFyWVVWKHlQbGFuZSwgeVN0cmlkZSwgaGVpZ2h0LCBjb252ZXJzaW9uQnVmZmVyLnNpemUoKSwgKnJWaWV3LmdldCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWOiB7CisgICAgICAgICAgICBpZiAoIUlzWVVWNDIwKCpyVmlldykpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiaW5wdXQgaXMgbm90IFlVVjQyMCIpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLmNvbEluYyA9PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLmNvbEluYyA9PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLmNvbEluYyA9PSAxCisgICAgICAgICAgICAgICAgICAgICYmIHVTdHJpZGUgPT0gdlN0cmlkZQorICAgICAgICAgICAgICAgICAgICAmJiB5U3RyaWRlID09IDIgKiB2U3RyaWRlKSB7CisgICAgICAgICAgICAgICAgLy8gSTQyMCBjb21wYXRpYmxlIC0gcGxhbmVzIGFyZSBhbHJlYWR5IHNldCB1cCBhYm92ZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjb3B5IHRvIEk0MjAKKyAgICAgICAgICAgIE1lbW9yeUJsb2NrIGNvbnZlcnNpb25CdWZmZXIgPSBtQ29udmVyc2lvbkJ1ZmZlcnMuZmV0Y2goeVBsYW5lU2l6ZSAqIDMgLyAyKTsKKyAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyc0luVXNlLmVtcGxhY2UoY29udmVyc2lvbkJ1ZmZlci5kYXRhKCksIGNvbnZlcnNpb25CdWZmZXIpOworICAgICAgICAgICAgTWVkaWFJbWFnZTIgaW1nID0gQ3JlYXRlWVVWNDIwUGxhbmFyTWVkaWFJbWFnZTIod2lkdGgsIGhlaWdodCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBJbWFnZUNvcHkoY29udmVyc2lvbkJ1ZmZlci5kYXRhKCksICZpbWcsICpyVmlldyk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkJ1ZmZlciBjb252ZXJzaW9uIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB5UGxhbmUgPSBjb252ZXJzaW9uQnVmZmVyLmRhdGEoKTsKKyAgICAgICAgICAgIHVQbGFuZSA9IHlQbGFuZSArIHlQbGFuZVNpemU7CisgICAgICAgICAgICB2UGxhbmUgPSB1UGxhbmUgKyB5UGxhbmVTaXplIC8gNDsKKyAgICAgICAgICAgIHlTdHJpZGUgPSB3aWR0aDsKKyAgICAgICAgICAgIHVTdHJpZGUgPSB2U3RyaWRlID0gd2lkdGggLyAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVkE6CisgICAgICAgICAgICBBTE9HRSgiWVVWQSBwbGFuZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIlVucmVjb2duaXplZCBwbGFuZSB0eXBlOiAlZCIsIGxheW91dC50eXBlKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDSEVDSyhOVUxMICE9IHlQbGFuZSk7CisgICAgLyogRW5jb2RlIGZyYW1lcyAqLworICAgIFZpZGVvRW5jRnJhbWVJTyB2aW4sIHZvdXQ7CisgICAgbWVtc2V0KCZ2aW4sIDAsIHNpemVvZih2aW4pKTsKKyAgICBtZW1zZXQoJnZvdXQsIDAsIHNpemVvZih2b3V0KSk7CisgICAgdmluLnlDaGFuID0geVBsYW5lOworICAgIHZpbi51Q2hhbiA9IHVQbGFuZTsKKyAgICB2aW4udkNoYW4gPSB2UGxhbmU7CisgICAgdmluLnRpbWVzdGFtcCA9IChpbnB1dFRpbWVTdGFtcCArIDUwMCkgLyAxMDAwOyAgLy8gaW4gbXMKKyAgICB2aW4uaGVpZ2h0ID0gYWxpZ24oaGVpZ2h0LCAxNik7CisgICAgdmluLnBpdGNoID0gYWxpZ24od2lkdGgsIDE2KTsKKworICAgIHVpbnQzMl90IG1vZFRpbWVNcyA9IDA7CisgICAgaW50MzJfdCBuTGF5ZXIgPSAwOworICAgIE1QNEhpbnRUcmFjayBoaW50VHJhY2s7CisgICAgaW50MzJfdCBvdXRwdXRTaXplID0gbU91dEJ1ZmZlclNpemU7CisgICAgaWYgKCFQVkVuY29kZVZpZGVvRnJhbWUobUhhbmRsZSwgJnZpbiwgJnZvdXQsICZtb2RUaW1lTXMsIG91dFB0ciwgJm91dHB1dFNpemUsICZuTGF5ZXIpIHx8CisgICAgICAgICFQVkdldEhpbnRUcmFjayhtSGFuZGxlLCAmaGludFRyYWNrKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGVuY29kZSBmcmFtZSBvciBnZXQgaGludCB0cmFjayBhdCBmcmFtZSAlIiBQUklkNjQsIG1OdW1JbnB1dEZyYW1lcyk7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigib3V0cHV0U2l6ZSBmaWxsZWQgOiAlZCIsIG91dHB1dFNpemUpOworICAgICsrbU51bUlucHV0RnJhbWVzOworICAgIENIRUNLKE5VTEwgPT0gUFZHZXRPdmVycnVuQnVmZmVyKG1IYW5kbGUpKTsKKworICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgaWYgKG91dHB1dFNpemUpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIDAsIG91dHB1dFNpemUpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgPSBpbnB1dFRpbWVTdGFtcDsKKyAgICAgICAgaWYgKGhpbnRUcmFjay5Db2RlVHlwZSA9PSAwKSB7CisgICAgICAgICAgICBidWZmZXItPnNldEluZm8oc3RkOjptYWtlX3NoYXJlZDxDMlN0cmVhbVBpY3R1cmVUeXBlTWFza0luZm86Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgIDB1IC8qIHN0cmVhbSBpZCAqLywgQzJDb25maWc6OlNZTkNfRlJBTUUpKTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICB9CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICB9CisKKyAgICBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZS5lcmFzZSh5UGxhbmUpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNEVuYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKXBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworY2xhc3MgQzJTb2Z0TXBlZzRFbmNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0TXBlZzRFbmNGYWN0b3J5KCkKKyAgICAgICAgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHt9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgbmV3IEMyU29mdE1wZWc0RW5jKAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE1wZWc0RW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRNcGVnNEVuYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE1wZWc0RW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRNcGVnNEVuY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdE1wZWc0RW5jRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM0NjFmYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzRFbmMuaApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyX1NPRlRfTVBFRzRfRU5DX0hfXworI2RlZmluZSBDMl9TT0ZUX01QRUc0X0VOQ19IX18KKworI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgPENvZGVjMkJ1ZmZlclV0aWxzLmg+CisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgIm1wNGVuY19hcGkuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0TXBlZzRFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0TXBlZzRFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKworICAgIHZpcnR1YWwgfkMyU29mdE1wZWc0RW5jKCk7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKworICAgIHRhZ3ZpZGVvRW5jQ29udHJvbHMgKm1IYW5kbGU7CisgICAgdGFndmlkZW9FbmNPcHRpb25zICAqbUVuY1BhcmFtczsKKworICAgIGJvb2wgICAgIG1TdGFydGVkOworICAgIGJvb2wgICAgIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgYm9vbCAgICAgbVNpZ25hbGxlZEVycm9yOworCisgICAgdWludDMyX3QgbU91dEJ1ZmZlclNpemU7CisgICAgLy8gY29uZmlndXJhdGlvbnMgdXNlZCBieSBjb21wb25lbnQgaW4gcHJvY2VzcworICAgIC8vIChUT0RPOiBrZWVwIHRoaXMgaW4gaW50ZiBidXQgbWFrZSB0aGVtIGludGVybmFsIG9ubHkpCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBtRnJhbWVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1CaXRyYXRlOworCisgICAgaW50NjRfdCAgbU51bUlucHV0RnJhbWVzOworICAgIE1QNEVuY29kaW5nTW9kZSBtRW5jb2RlTW9kZTsKKworICAgIE1lbW9yeUJsb2NrUG9vbCBtQ29udmVyc2lvbkJ1ZmZlcnM7CisgICAgc3RkOjptYXA8dm9pZCAqLCBNZW1vcnlCbG9jaz4gbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2U7CisKKyAgICBjMl9zdGF0dXNfdCBpbml0RW5jUGFyYW1zKCk7CisgICAgYzJfc3RhdHVzX3QgaW5pdEVuY29kZXIoKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdE1wZWc0RW5jKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQzJfU09GVF9NUEVHNF9FTkNfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9jb21tb25fdGltZS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvY29tbW9uX3RpbWUvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpjb3B5IHRvIG1lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29tbW9uX3RpbWUvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9OT1RJQ0UKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9jb21tb25fdGltZS9OT1RJQ0UKY29weSB0byBtZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL05PVElDRQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9wYXRlbnRfZGlzY2xhaW1lci50eHQgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL3BhdGVudF9kaXNjbGFpbWVyLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGJmMTFkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9wYXRlbnRfZGlzY2xhaW1lci50eHQKQEAgLTAsMCArMSw5IEBACisKK1RISVMgSVMgTk9UIEEgR1JBTlQgT0YgUEFURU5UIFJJR0hUUy4KKworR29vZ2xlIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9uIG9yIHdhcnJhbnR5IHRoYXQgdGhlIGNvZGVjcyBmb3Igd2hpY2gKK3NvdXJjZSBjb2RlIGlzIG1hZGUgYXZhaWxhYmxlIGhlcmV1bmRlciBhcmUgdW5lbmN1bWJlcmVkIGJ5Cit0aGlyZC1wYXJ0eSBwYXRlbnRzLiAgVGhvc2UgaW50ZW5kaW5nIHRvIHVzZSB0aGlzIHNvdXJjZSBjb2RlIGluCitoYXJkd2FyZSBvciBzb2Z0d2FyZSBwcm9kdWN0cyBhcmUgYWR2aXNlZCB0aGF0IGltcGxlbWVudGF0aW9ucyBvZgordGhlc2UgY29kZWNzLCBpbmNsdWRpbmcgaW4gb3BlbiBzb3VyY2Ugc29mdHdhcmUgb3Igc2hhcmV3YXJlLCBtYXkKK3JlcXVpcmUgcGF0ZW50IGxpY2Vuc2VzIGZyb20gdGhlIHJlbGV2YW50IHBhdGVudCBob2xkZXJzLgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZDE0MWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyMiBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9vcHVzZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRPcHVzRGVjLmNwcCJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsibGlib3B1cyJdLAorfQorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9vcHVzZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRPcHVzRW5jLmNwcCJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsibGlib3B1cyJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmI2OTc0ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0RlYy5jcHAKQEAgLTAsMCArMSw0ODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdE9wdXNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL09wdXNIZWFkZXIuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisjaW5jbHVkZSAiQzJTb2Z0T3B1c0RlYy5oIgorCitleHRlcm4gIkMiIHsKKyAgICAjaW5jbHVkZSA8b3B1cy5oPgorICAgICNpbmNsdWRlIDxvcHVzX211bHRpc3RyZWFtLmg+Cit9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLm9wdXMuZGVjb2RlciI7CisKK30gIC8vIG5hbWVzcGFjZQorCitjbGFzcyBDMlNvZnRPcHVzRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTywKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoCisgICAgICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCA0ODAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmVxdWFsVG8oNDgwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5pblJhbmdlKDEsIDgpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dCgwdSwgNjAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoNjAwMCwgNTEwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgOTYwICogNikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRPcHVzRGVjOjpDMlNvZnRPcHVzRGVjKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudCgKKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1EZWNvZGVyKG51bGxwdHIpIHsKK30KKworQzJTb2Z0T3B1c0RlYzo6fkMyU29mdE9wdXNEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE9wdXNEZWM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RGVjb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX05PX01FTU9SWTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0RlYzo6b25TdG9wKCkgeworICAgIGlmIChtRGVjb2RlcikgeworICAgICAgICBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfZGVzdHJveShtRGVjb2Rlcik7CisgICAgICAgIG1EZWNvZGVyID0gbnVsbHB0cjsKKyAgICB9CisgICAgbWVtc2V0KCZtSGVhZGVyLCAwLCBzaXplb2YobUhlYWRlcikpOworICAgIG1Db2RlY0RlbGF5ID0gMDsKKyAgICBtU2Vla1ByZVJvbGwgPSAwOworICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gMDsKKyAgICBtSW5wdXRCdWZmZXJDb3VudCA9IDA7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdE9wdXNEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0T3B1c0RlYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtRGVjb2RlcikgeworICAgICAgICBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfZGVzdHJveShtRGVjb2Rlcik7CisgICAgICAgIG1EZWNvZGVyID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3N0YXR1c190IEMyU29mdE9wdXNEZWM6OmluaXREZWNvZGVyKCkgeworICAgIG1lbXNldCgmbUhlYWRlciwgMCwgc2l6ZW9mKG1IZWFkZXIpKTsKKyAgICBtQ29kZWNEZWxheSA9IDA7CisgICAgbVNlZWtQcmVSb2xsID0gMDsKKyAgICBtU2FtcGxlc1RvRGlzY2FyZCA9IDA7CisgICAgbUlucHV0QnVmZmVyQ291bnQgPSAwOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKworICAgIHJldHVybiBPSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0RlYzo6b25GbHVzaF9zbSgpIHsKKyAgICBpZiAobURlY29kZXIpIHsKKyAgICAgICAgb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2N0bChtRGVjb2RlciwgT1BVU19SRVNFVF9TVEFURSk7CisgICAgICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gbVNlZWtQcmVSb2xsOworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0RlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCitzdGF0aWMgY29uc3QgaW50IGtSYXRlID0gNDgwMDA7CisKKy8vIE9wdXMgdXNlcyBWb3JiaXMgY2hhbm5lbCBtYXBwaW5nLCBhbmQgVm9yYmlzIGNoYW5uZWwgbWFwcGluZyBzcGVjaWZpZXMKKy8vIG1hcHBpbmdzIGZvciB1cCB0byA4IGNoYW5uZWxzLiBUaGlzIGluZm9ybWF0aW9uIGlzIHBhcnQgb2YgdGhlIFZvcmJpcyBJCisvLyBTcGVjaWZpY2F0aW9uOgorLy8gaHR0cDovL3d3dy54aXBoLm9yZy92b3JiaXMvZG9jL1ZvcmJpc19JX3NwZWMuaHRtbAorc3RhdGljIGNvbnN0IGludCBrTWF4Q2hhbm5lbHMgPSA4OworCisvLyBNYXhpbXVtIHBhY2tldCBzaXplIHVzZWQgaW4gWGlwaCdzIG9wdXNkZWMuCitzdGF0aWMgY29uc3QgaW50IGtNYXhPcHVzT3V0cHV0UGFja2V0U2l6ZVNhbXBsZXMgPSA5NjAgKiA2OworCisvLyBEZWZhdWx0IGF1ZGlvIG91dHB1dCBjaGFubmVsIGxheW91dC4gVXNlZCB0byBpbml0aWFsaXplIHxzdHJlYW1fbWFwfCBpbgorLy8gT3B1c0hlYWRlciwgYW5kIHBhc3NlZCB0byBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlKCkgd2hlbiB0aGUgaGVhZGVyCisvLyBkb2VzIG5vdCBjb250YWluIG1hcHBpbmcgaW5mb3JtYXRpb24uIFRoZSB2YWx1ZXMgYXJlIHZhbGlkIG9ubHkgZm9yIG1vbm8gYW5kCisvLyBzdGVyZW8gb3V0cHV0OiBPcHVzIHN0cmVhbXMgd2l0aCBtb3JlIHRoYW4gMiBjaGFubmVscyByZXF1aXJlIGEgc3RyZWFtIG1hcC4KK3N0YXRpYyBjb25zdCBpbnQga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQgPSAyOworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0RlZmF1bHRPcHVzQ2hhbm5lbExheW91dFtrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dF0gPSB7IDAsIDEgfTsKKworCisvLyBDb252ZXJ0IG5hbm9zZWNvbmRzIHRvIG51bWJlciBvZiBzYW1wbGVzLgorc3RhdGljIHVpbnQ2NF90IG5zX3RvX3NhbXBsZXModWludDY0X3QgbnMsIGludCByYXRlKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGRvdWJsZT4obnMpICogcmF0ZSAvIDEwMDAwMDAwMDA7Cit9CisKK3ZvaWQgQzJTb2Z0T3B1c0RlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpblNpemUgPT0gMCkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLCBpblNpemUsCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gclZpZXcuZGF0YSgpICsgaW5PZmZzZXQ7CisgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50IDwgMykgeworICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMCkgeworICAgICAgICAgICAgc2l6ZV90IG9wdXNIZWFkU2l6ZSA9IDA7CisgICAgICAgICAgICBzaXplX3QgY29kZWNEZWxheUJ1ZlNpemUgPSAwOworICAgICAgICAgICAgc2l6ZV90IHNlZWtQcmVSb2xsQnVmU2l6ZSA9IDA7CisgICAgICAgICAgICB2b2lkICpvcHVzSGVhZEJ1ZiA9IE5VTEw7CisgICAgICAgICAgICB2b2lkICpjb2RlY0RlbGF5QnVmID0gTlVMTDsKKyAgICAgICAgICAgIHZvaWQgKnNlZWtQcmVSb2xsQnVmID0gTlVMTDsKKworICAgICAgICAgICAgaWYgKCFHZXRPcHVzSGVhZGVyQnVmZmVycyhkYXRhLCBpblNpemUsICZvcHVzSGVhZEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3B1c0hlYWRTaXplLCAmY29kZWNEZWxheUJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZWNEZWxheUJ1ZlNpemUsICZzZWVrUHJlUm9sbEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2Vla1ByZVJvbGxCdWZTaXplKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlcyBlbmNvdW50ZXJlZCBlcnJvciBpbiBHZXRPcHVzSGVhZGVyQnVmZmVycyIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghUGFyc2VPcHVzSGVhZGVyKCh1aW50OF90ICopb3B1c0hlYWRCdWYsIG9wdXNIZWFkU2l6ZSwgJm1IZWFkZXIpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzIEVuY291bnRlcmVkIGVycm9yIHdoaWxlIFBhcnNpbmcgT3B1cyBIZWFkZXIuIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVpbnQ4X3QgY2hhbm5lbF9tYXBwaW5nW2tNYXhDaGFubmVsc10gPSB7MH07CisgICAgICAgICAgICBpZiAobUhlYWRlci5jaGFubmVscyA8PSBrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dCkgeworICAgICAgICAgICAgICAgIG1lbWNweSgmY2hhbm5lbF9tYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICBrRGVmYXVsdE9wdXNDaGFubmVsTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICBrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1lbWNweSgmY2hhbm5lbF9tYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLnN0cmVhbV9tYXAsCisgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXIuY2hhbm5lbHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHN0YXR1cyA9IE9QVVNfSU5WQUxJRF9TVEFURTsKKyAgICAgICAgICAgIG1EZWNvZGVyID0gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2NyZWF0ZShrUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLmNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXIubnVtX3N0cmVhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci5udW1fY291cGxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsX21hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7CisgICAgICAgICAgICBpZiAoIW1EZWNvZGVyIHx8IHN0YXR1cyAhPSBPUFVTX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIm9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jcmVhdGUgZmFpbGVkIHN0YXR1cyA9ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBvcHVzX3N0cmVycm9yKHN0YXR1cykpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jdGwobURlY29kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9QVVNfU0VUX0dBSU4obUhlYWRlci5nYWluX2RiKSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE9QVVNfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBPUFVTIGhlYWRlciBnYWluOyBzdGF0dXMgPSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgb3B1c19zdHJlcnJvcihzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb2RlY0RlbGF5QnVmICYmIGNvZGVjRGVsYXlCdWZTaXplID09IHNpemVvZih1aW50NjRfdCkpIHsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJnZhbHVlLCBjb2RlY0RlbGF5QnVmLCBzaXplb2YodWludDY0X3QpKTsKKyAgICAgICAgICAgICAgICBtQ29kZWNEZWxheSA9IG5zX3RvX3NhbXBsZXModmFsdWUsIGtSYXRlKTsKKyAgICAgICAgICAgICAgICBtU2FtcGxlc1RvRGlzY2FyZCA9IG1Db2RlY0RlbGF5OworICAgICAgICAgICAgICAgICsrbUlucHV0QnVmZmVyQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2Vla1ByZVJvbGxCdWYgJiYgc2Vla1ByZVJvbGxCdWZTaXplID09IHNpemVvZih1aW50NjRfdCkpIHsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJnZhbHVlLCBzZWVrUHJlUm9sbEJ1Ziwgc2l6ZW9mKHVpbnQ2NF90KSk7CisgICAgICAgICAgICAgICAgbVNlZWtQcmVSb2xsID0gbnNfdG9fc2FtcGxlcyh2YWx1ZSwga1JhdGUpOworICAgICAgICAgICAgICAgICsrbUlucHV0QnVmZmVyQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoaW5TaXplIDwgOCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJJbnB1dCBzYW1wbGUgc2l6ZSBpcyB0b28gc21hbGwuIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50NjRfdCBzYW1wbGVzID0gbnNfdG9fc2FtcGxlcyggKihyZWludGVycHJldF9jYXN0PGludDY0X3QqPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0X2Nhc3Q8dWludDhfdCAqPiAoZGF0YSkpKSwga1JhdGUpOworICAgICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDEpIHsKKyAgICAgICAgICAgICAgICBtQ29kZWNEZWxheSA9IHNhbXBsZXM7CisgICAgICAgICAgICAgICAgbVNhbXBsZXNUb0Rpc2NhcmQgPSBtQ29kZWNEZWxheTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG1TZWVrUHJlUm9sbCA9IHNhbXBsZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICArK21JbnB1dEJ1ZmZlckNvdW50OworICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMykgeworICAgICAgICAgICAgQUxPR0koIkNvbmZpZ3VyaW5nIGRlY29kZXI6ICVkIEh6LCAlZCBjaGFubmVscyIsCisgICAgICAgICAgICAgICAgICAga1JhdGUsIG1IZWFkZXIuY2hhbm5lbHMpOworICAgICAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0IHNhbXBsZVJhdGVJbmZvKDB1LCBrUmF0ZSk7CisgICAgICAgICAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCBjaGFubmVsQ291bnRJbmZvKDB1LCBtSGVhZGVyLmNoYW5uZWxzKTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcoCisgICAgICAgICAgICAgICAgICAgIHsgJnNhbXBsZVJhdGVJbmZvLCAmY2hhbm5lbENvdW50SW5mbyB9LAorICAgICAgICAgICAgICAgICAgICBDMl9NQVlfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICZmYWlsdXJlcyk7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShzYW1wbGVSYXRlSW5mbykpOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoY2hhbm5lbENvdW50SW5mbykpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ29uZmlnIFVwZGF0ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBJZ25vcmUgQ1NEIHJlLXN1Ym1pc3Npb25zLgorICAgIGlmICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBXaGVuIHNlZWtpbmcgdG8gemVybywgfG1Db2RlY0RlbGF5fCBzYW1wbGVzIGhhcyB0byBiZSBkaXNjYXJkZWQKKyAgICAvLyBpbnN0ZWFkIG9mIHxtU2Vla1ByZVJvbGx8IHNhbXBsZXMgKGFzIHdlIHdvdWxkIHdoZW4gc2Vla2luZyB0byBhbnkKKyAgICAvLyBvdGhlciB0aW1lc3RhbXApLgorICAgIGlmICh3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpID09IDApIG1TYW1wbGVzVG9EaXNjYXJkID0gbUNvZGVjRGVsYXk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgIGtNYXhOdW1TYW1wbGVzUGVyQnVmZmVyICoga01heENoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IG51bVNhbXBsZXMgPSBvcHVzX211bHRpc3RyZWFtX2RlY29kZShtRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGludDE2X3QgKj4gKHdWaWV3LmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTWF4T3B1c091dHB1dFBhY2tldFNpemVTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgaWYgKG51bVNhbXBsZXMgPCAwKSB7CisgICAgICAgIEFMT0dFKCJvcHVzX211bHRpc3RyZWFtX2RlY29kZSByZXR1cm5lZCBudW1TYW1wbGVzICVkIiwgbnVtU2FtcGxlcyk7CisgICAgICAgIG51bVNhbXBsZXMgPSAwOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgb3V0T2Zmc2V0ID0gMDsKKyAgICBpZiAobVNhbXBsZXNUb0Rpc2NhcmQgPiAwKSB7CisgICAgICAgIGlmIChtU2FtcGxlc1RvRGlzY2FyZCA+IG51bVNhbXBsZXMpIHsKKyAgICAgICAgICAgIG1TYW1wbGVzVG9EaXNjYXJkIC09IG51bVNhbXBsZXM7CisgICAgICAgICAgICBudW1TYW1wbGVzID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG51bVNhbXBsZXMgLT0gbVNhbXBsZXNUb0Rpc2NhcmQ7CisgICAgICAgICAgICBvdXRPZmZzZXQgPSBtU2FtcGxlc1RvRGlzY2FyZCAqIHNpemVvZihpbnQxNl90KSAqIG1IZWFkZXIuY2hhbm5lbHM7CisgICAgICAgICAgICBtU2FtcGxlc1RvRGlzY2FyZCA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobnVtU2FtcGxlcykgeworICAgICAgICBpbnQgb3V0U2l6ZSA9IG51bVNhbXBsZXMgKiBzaXplb2YoaW50MTZfdCkgKiBtSGVhZGVyLmNoYW5uZWxzOworICAgICAgICBBTE9HVigib3V0IGJ1ZmZlciBhdHRyLiBvZmZzZXQgJWQgc2l6ZSAlZCAiLCBvdXRPZmZzZXQsIG91dFNpemUpOworCisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrLCBvdXRPZmZzZXQsIG91dFNpemUpKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIH0gZWxzZSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGJsb2NrLnJlc2V0KCk7CisgICAgfQorICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgfQorfQorCitjbGFzcyBDMlNvZnRPcHVzRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdE9wdXNEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0T3B1c0RlYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE9wdXNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0T3B1c0RlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE9wdXNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRPcHVzRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0T3B1c0RlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDcxNWFjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRGVjLmgKQEAgLTAsMCArMSw2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX09QVVNfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9PUFVTX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworCitzdHJ1Y3QgT3B1c01TRGVjb2RlcjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0T3B1c0RlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRPcHVzRGVjKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRPcHVzRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga01heE51bVNhbXBsZXNQZXJCdWZmZXIgPSA5NjAgKiA2CisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgT3B1c01TRGVjb2RlciAqbURlY29kZXI7CisgICAgT3B1c0hlYWRlciBtSGVhZGVyOworCisgICAgaW50NjRfdCBtQ29kZWNEZWxheTsKKyAgICBpbnQ2NF90IG1TZWVrUHJlUm9sbDsKKyAgICBpbnQ2NF90IG1TYW1wbGVzVG9EaXNjYXJkOworICAgIHNpemVfdCBtSW5wdXRCdWZmZXJDb3VudDsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0T3B1c0RlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9PUFVTX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0VuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBkMTk2NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0VuYy5jcHAKQEAgLTAsMCArMSw2MzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdE9wdXNFbmMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL09wdXNIZWFkZXIuaD4KKyNpbmNsdWRlICJDMlNvZnRPcHVzRW5jLmgiCisKK2V4dGVybiAiQyIgeworICAgICNpbmNsdWRlIDxvcHVzLmg+CisgICAgI2luY2x1ZGUgPG9wdXNfbXVsdGlzdHJlYW0uaD4KK30KKworI2RlZmluZSBERUZBVUxUX0ZSQU1FX0RVUkFUSU9OX01TIDIwCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5vcHVzLmVuY29kZXIiOworCit9ICAvLyBuYW1lc3BhY2UKKworc3RhdGljIGNvbnN0IGludCBrTWF4TnVtQ2hhbm5lbHNTdXBwb3J0ZWQgPSAyOworCitjbGFzcyBDMlNvZnRPcHVzRW5jOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTywKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoCisgICAgICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQoMHUsIDQ4MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICA4MDAwLCAxMjAwMCwgMTYwMDAsIDI0MDAwLCA0ODAwMH0pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwga01heE51bUNoYW5uZWxzU3VwcG9ydGVkKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQoMHUsIDEyODAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoNTAwLCA1MTIwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db21wbGV4aXR5LCBDMl9QQVJBTUtFWV9DT01QTEVYSVRZKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db21wbGV4aXR5VHVuaW5nOjpvdXRwdXQoMHUsIDEwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1Db21wbGV4aXR5LCB2YWx1ZSkuaW5SYW5nZSgxLCAxMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNvbXBsZXhpdHkpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDM4NDApKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBnZXRTYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbVNhbXBsZVJhdGUtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0Q2hhbm5lbENvdW50KCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxDb3VudC0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRCaXRyYXRlKCkgY29uc3QgeyByZXR1cm4gbUJpdHJhdGUtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0Q29tcGxleGl0eSgpIGNvbnN0IHsgcmV0dXJuIG1Db21wbGV4aXR5LT52YWx1ZTsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29tcGxleGl0eVR1bmluZzo6b3V0cHV0PiBtQ29tcGxleGl0eTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRPcHVzRW5jOjpDMlNvZnRPcHVzRW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KAorICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtT3V0cHV0QmxvY2sobnVsbHB0ciksCisgICAgICBtRW5jb2RlcihudWxscHRyKSwKKyAgICAgIG1JbnB1dEJ1ZmZlclBjbTE2KG51bGxwdHIpLAorICAgICAgbU91dEluZGV4KDB1KSB7Cit9CisKK0MyU29mdE9wdXNFbmM6On5DMlNvZnRPcHVzRW5jKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRPcHVzRW5jOjpvbkluaXQoKSB7CisgICAgcmV0dXJuIGluaXRFbmNvZGVyKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE9wdXNFbmM6OmNvbmZpZ3VyZUVuY29kZXIoKSB7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgbW9ub19tYXBwaW5nWzI1Nl0gPSB7MH07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgc3RlcmVvX21hcHBpbmdbMjU2XSA9IHswLCAxfTsKKyAgICBtU2FtcGxlUmF0ZSA9IG1JbnRmLT5nZXRTYW1wbGVSYXRlKCk7CisgICAgbUNoYW5uZWxDb3VudCA9IG1JbnRmLT5nZXRDaGFubmVsQ291bnQoKTsKKyAgICB1aW50MzJfdCBiaXRyYXRlID0gbUludGYtPmdldEJpdHJhdGUoKTsKKyAgICBpbnQgY29tcGxleGl0eSA9IG1JbnRmLT5nZXRDb21wbGV4aXR5KCk7CisgICAgbU51bVNhbXBsZXNQZXJGcmFtZSA9IG1TYW1wbGVSYXRlIC8gKDEwMDAgLyBtRnJhbWVEdXJhdGlvbk1zKTsKKyAgICBtTnVtUGNtQnl0ZXNQZXJJbnB1dEZyYW1lID0KKyAgICAgICAgbUNoYW5uZWxDb3VudCAqIG1OdW1TYW1wbGVzUGVyRnJhbWUgKiBzaXplb2YoaW50MTZfdCk7CisgICAgaW50IGVyciA9IEMyX09LOworCisgICAgY29uc3QgdW5zaWduZWQgY2hhciogbWFwcGluZzsKKyAgICBpZiAobUNoYW5uZWxDb3VudCA9PSAxKSB7CisgICAgICAgIG1hcHBpbmcgPSBtb25vX21hcHBpbmc7CisgICAgfSBlbHNlIGlmIChtQ2hhbm5lbENvdW50ID09IDIpIHsKKyAgICAgICAgbWFwcGluZyA9IHN0ZXJlb19tYXBwaW5nOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJOdW1iZXIgb2YgY2hhbm5lbHMgKCVkKSBpcyBub3Qgc3VwcG9ydGVkIiwgbUNoYW5uZWxDb3VudCk7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKG1FbmNvZGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgb3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2Rlc3Ryb3kobUVuY29kZXIpOworICAgIH0KKworICAgIG1FbmNvZGVyID0gb3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2NyZWF0ZShtU2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCwKKyAgICAgICAgMSwgbUNoYW5uZWxDb3VudCAtIDEsIG1hcHBpbmcsIE9QVVNfQVBQTElDQVRJT05fQVVESU8sICZlcnIpOworICAgIGlmIChlcnIpIHsKKyAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBjcmVhdGUgbGlib3B1cyBlbmNvZGVyLiBFcnJvciBjb2RlOiAlaSIsIGVycik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgLy8gQ29tcGxleGl0eQorICAgIGlmIChvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfY3RsKAorICAgICAgICAgICAgbUVuY29kZXIsIE9QVVNfU0VUX0NPTVBMRVhJVFkoY29tcGxleGl0eSkpICE9IE9QVVNfT0spIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBzZXQgY29tcGxleGl0eSIpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIERUWAorICAgIGlmIChvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfY3RsKG1FbmNvZGVyLCBPUFVTX1NFVF9EVFgoMCkgIT0gT1BVU19PSykpIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBzZXQgZHR4Iik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gQXBwbGljYXRpb24KKyAgICBpZiAob3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2N0bChtRW5jb2RlciwKKyAgICAgICAgICAgIE9QVVNfU0VUX0FQUExJQ0FUSU9OKE9QVVNfQVBQTElDQVRJT05fQVVESU8pKSAhPSBPUFVTX09LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gc2V0IGFwcGxpY2F0aW9uIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gU2lnbmFsIHR5cGUKKyAgICBpZiAob3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2N0bChtRW5jb2RlciwgT1BVU19TRVRfU0lHTkFMKE9QVVNfQVVUTykpICE9CisgICAgICAgIE9QVVNfT0spIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBzZXQgc2lnbmFsIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gQ29uc3RyYWluZWQgVkJSCisgICAgaWYgKG9wdXNfbXVsdGlzdHJlYW1fZW5jb2Rlcl9jdGwobUVuY29kZXIsIE9QVVNfU0VUX1ZCUigxKSAhPSBPUFVTX09LKSkgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHNldCB2YnIgdHlwZSIpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAob3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2N0bChtRW5jb2RlciwgT1BVU19TRVRfVkJSX0NPTlNUUkFJTlQoMSkgIT0KKyAgICAgICAgICAgIE9QVVNfT0spKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gc2V0IHZiciBjb25zdHJhaW50Iik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gQml0cmF0ZQorICAgIGlmIChvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfY3RsKG1FbmNvZGVyLCBPUFVTX1NFVF9CSVRSQVRFKGJpdHJhdGUpKSAhPQorICAgICAgICAgICAgT1BVU19PSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHNldCBiaXRyYXRlIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gU2V0IHNlZWsgcHJlcm9sbCB0byA4MCBtcworICAgIG1TZWVrUHJlUm9sbCA9IDgwMDAwMDAwOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0VuYzo6aW5pdEVuY29kZXIoKSB7CisgICAgbVNpZ25hbGxlZEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1IZWFkZXJHZW5lcmF0ZWQgPSBmYWxzZTsKKyAgICBtSXNGaXJzdEZyYW1lID0gdHJ1ZTsKKyAgICBtRW5jb2RlckZsdXNoZWQgPSBmYWxzZTsKKyAgICBtQnVmZmVyQXZhaWxhYmxlID0gZmFsc2U7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDB1bGw7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwOworICAgIG1GaWxsZWRMZW4gPSAwOworICAgIG1GcmFtZUR1cmF0aW9uTXMgPSBERUZBVUxUX0ZSQU1FX0RVUkFUSU9OX01TOworICAgIGlmICghbUlucHV0QnVmZmVyUGNtMTYpIHsKKyAgICAgICAgbUlucHV0QnVmZmVyUGNtMTYgPQorICAgICAgICAgICAgKGludDE2X3QqKW1hbGxvYyhrRnJhbWVTaXplICoga01heE51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICB9CisgICAgaWYgKCFtSW5wdXRCdWZmZXJQY20xNikgcmV0dXJuIEMyX05PX01FTU9SWTsKKworICAgIC8qIERlZmF1bHQgQ29uZmlndXJhdGlvbnMgKi8KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBjb25maWd1cmVFbmNvZGVyKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0VuYzo6b25TdG9wKCkgeworICAgIG1TaWduYWxsZWRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtSXNGaXJzdEZyYW1lID0gdHJ1ZTsKKyAgICBtRW5jb2RlckZsdXNoZWQgPSBmYWxzZTsKKyAgICBtQnVmZmVyQXZhaWxhYmxlID0gZmFsc2U7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDB1bGw7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwdTsKKyAgICBtRmlsbGVkTGVuID0gMDsKKyAgICBpZiAobUVuY29kZXIpIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IG9wdXNfbXVsdGlzdHJlYW1fZW5jb2Rlcl9jdGwobUVuY29kZXIsIE9QVVNfUkVTRVRfU1RBVEUpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9QVVNfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJPUFVTX1JFU0VUX1NUQVRFIGZhaWxlZCBzdGF0dXMgPSAlcyIsIG9wdXNfc3RyZXJyb3Ioc3RhdHVzKSk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobU91dHB1dEJsb2NrKSBtT3V0cHV0QmxvY2sucmVzZXQoKTsKKyAgICBtT3V0cHV0QmxvY2sgPSBudWxscHRyOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdE9wdXNFbmM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0T3B1c0VuYzo6b25SZWxlYXNlKCkgeworICAgICh2b2lkKW9uU3RvcCgpOworICAgIGlmIChtSW5wdXRCdWZmZXJQY20xNikgeworICAgICAgICBmcmVlKG1JbnB1dEJ1ZmZlclBjbTE2KTsKKyAgICAgICAgbUlucHV0QnVmZmVyUGNtMTYgPSBudWxscHRyOworICAgIH0KKyAgICBpZiAobUVuY29kZXIpIHsKKyAgICAgICAgb3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2Rlc3Ryb3kobUVuY29kZXIpOworICAgICAgICBtRW5jb2RlciA9IG51bGxwdHI7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRPcHVzRW5jOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKworLy8gRHJhaW4gdGhlIGVuY29kZXIgdG8gZ2V0IGxhc3QgZnJhbWVzIChpZiBhbnkpCitpbnQgQzJTb2Z0T3B1c0VuYzo6ZHJhaW5FbmNvZGVyKHVpbnQ4X3QqIG91dFB0cikgeworICAgIG1lbXNldCgodWludDhfdCAqKW1JbnB1dEJ1ZmZlclBjbTE2ICsgbUZpbGxlZExlbiwgMCwKKyAgICAgICAgKG1OdW1QY21CeXRlc1BlcklucHV0RnJhbWUgLSBtRmlsbGVkTGVuKSk7CisgICAgaW50IGVuY29kZWRCeXRlcyA9IG9wdXNfbXVsdGlzdHJlYW1fZW5jb2RlKAorICAgICAgICBtRW5jb2RlciwgbUlucHV0QnVmZmVyUGNtMTYsIG1OdW1TYW1wbGVzUGVyRnJhbWUsIG91dFB0ciwga01heFBheWxvYWQpOworICAgIGlmIChlbmNvZGVkQnl0ZXMgPiBtT3V0cHV0QmxvY2stPmNhcGFjaXR5KCkpIHsKKyAgICAgICAgQUxPR0UoIm5vdCBlbm91Z2ggc3BhY2UgbGVmdCB0byB3cml0ZSBlbmNvZGVkIGRhdGEsIGRyb3BwaW5nICVkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgbUJ5dGVzRW5jb2RlZCk7CisgICAgICAgIC8vIGEgZmF0YWwgZXJyb3Igd291bGQgc3RvcCB0aGUgZW5jb2RpbmcKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBBTE9HVigiZW5jb2RlZCAlaSBPcHVzIGJ5dGVzIGZyb20gJXp1IFBDTSBieXRlcyIsIGVuY29kZWRCeXRlcywKKyAgICAgICAgICBtTnVtUGNtQnl0ZXNQZXJJbnB1dEZyYW1lKTsKKyAgICBtRW5jb2RlckZsdXNoZWQgPSB0cnVlOworICAgIG1GaWxsZWRMZW4gPSAwOworICAgIHJldHVybiBlbmNvZGVkQnl0ZXM7Cit9CisKK3ZvaWQgQzJTb2Z0T3B1c0VuYzo6cHJvY2Vzcyhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBlb3MgPSAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwOworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gQzJfT0s7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPQorICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsCisgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwgd29yay0+aW5wdXQuZmxhZ3MpOworCisgICAgaWYgKCFtRW5jb2RlcikgeworICAgICAgICBpZiAoaW5pdEVuY29kZXIoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoImluaXRFbmNvZGVyIGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBlcnI7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtSXNGaXJzdEZyYW1lICYmIGluU2l6ZSA+IDApIHsKKyAgICAgICAgbUFuY2hvclRpbWVTdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1bGwoKTsKKyAgICAgICAgbUlzRmlyc3RGcmFtZSA9IGZhbHNlOworICAgIH0KKworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX07CisgICAgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhrTWF4UGF5bG9hZCwgdXNhZ2UsICZtT3V0cHV0QmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDMldyaXRlVmlldyB3VmlldyA9IG1PdXRwdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIG1PdXRwdXRCbG9jay5yZXNldCgpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IGluUG9zID0gMDsKKyAgICBzaXplX3QgcHJvY2Vzc1NpemUgPSAwOworICAgIG1CeXRlc0VuY29kZWQgPSAwOworICAgIHVpbnQ2NF90IG91dFRpbWVTdGFtcCA9IDB1OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyOworICAgIHVpbnQ2NF90IGlucHV0SW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICBjb25zdCB1aW50OF90KiBpblB0ciA9IHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0OworCisgICAgY2xhc3MgRmlsbFdvcmsgeworICAgIHB1YmxpYzoKKyAgICAgICAgRmlsbFdvcmsodWludDMyX3QgZmxhZ3MsIEMyV29ya09yZGluYWxTdHJ1Y3Qgb3JkaW5hbCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKQorICAgICAgICAgICAgOiBtRmxhZ3MoZmxhZ3MpLCBtT3JkaW5hbChvcmRpbmFsKSwgbUJ1ZmZlcihidWZmZXIpIHsKKyAgICAgICAgfQorICAgICAgICB+RmlsbFdvcmsoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrKSB7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpbUZsYWdzOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gbU9yZGluYWw7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgICAgICAgICBpZiAobUJ1ZmZlcikgeworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhtQnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJ0aW1lc3RhbXAgPSAlbGxkLCBpbmRleCA9ICVsbGQsIHcvJXMgYnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgIG1PcmRpbmFsLnRpbWVzdGFtcC5wZWVrbGwoKSwKKyAgICAgICAgICAgICAgICAgIG1PcmRpbmFsLmZyYW1lSW5kZXgucGVla2xsKCksCisgICAgICAgICAgICAgICAgICBtQnVmZmVyID8gIiIgOiAibyIpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCB1aW50MzJfdCBtRmxhZ3M7CisgICAgICAgIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgbU9yZGluYWw7CisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gbUJ1ZmZlcjsKKyAgICB9OworCisgICAgQzJXb3JrT3JkaW5hbFN0cnVjdCBvdXRPcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKworICAgIGlmICghbUhlYWRlckdlbmVyYXRlZCkgeworICAgICAgICB1aW50OF90IGhlYWRlcltBT1BVU19VTklGSUVEX0NTRF9NQVhTSVpFXTsKKyAgICAgICAgbWVtc2V0KGhlYWRlciwgMCwgc2l6ZW9mKGhlYWRlcikpOworCisgICAgICAgIC8vIEdldCBjb2RlY0RlbGF5CisgICAgICAgIGludDMyX3QgbG9va2FoZWFkOworICAgICAgICBpZiAob3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2N0bChtRW5jb2RlciwgT1BVU19HRVRfTE9PS0FIRUFEKCZsb29rYWhlYWQpKSAhPQorICAgICAgICAgICAgICAgIE9QVVNfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZ2V0IGxvb2thaGVhZCIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtQ29kZWNEZWxheSA9IGxvb2thaGVhZCAqIDEwMDAwMDAwMDBsbCAvIG1TYW1wbGVSYXRlOworCisgICAgICAgIE9wdXNIZWFkZXIgb3B1c0hlYWRlcjsKKyAgICAgICAgbWVtc2V0KCZvcHVzSGVhZGVyLCAwLCBzaXplb2Yob3B1c0hlYWRlcikpOworICAgICAgICBvcHVzSGVhZGVyLmNoYW5uZWxzID0gbUNoYW5uZWxDb3VudDsKKyAgICAgICAgb3B1c0hlYWRlci5udW1fc3RyZWFtcyA9IG1DaGFubmVsQ291bnQ7CisgICAgICAgIG9wdXNIZWFkZXIubnVtX2NvdXBsZWQgPSAwOworICAgICAgICBvcHVzSGVhZGVyLmNoYW5uZWxfbWFwcGluZyA9ICgobUNoYW5uZWxDb3VudCA+IDgpID8gMjU1IDogKG1DaGFubmVsQ291bnQgPiAyKSk7CisgICAgICAgIG9wdXNIZWFkZXIuZ2Fpbl9kYiA9IDA7CisgICAgICAgIG9wdXNIZWFkZXIuc2tpcF9zYW1wbGVzID0gbG9va2FoZWFkOworICAgICAgICBpbnQgaGVhZGVyTGVuID0gV3JpdGVPcHVzSGVhZGVycyhvcHVzSGVhZGVyLCBtU2FtcGxlUmF0ZSwgaGVhZGVyLAorICAgICAgICAgICAgc2l6ZW9mKGhlYWRlciksIG1Db2RlY0RlbGF5LCBtU2Vla1ByZVJvbGwpOworCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0PiBjc2QgPQorICAgICAgICAgICAgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dDo6QWxsb2NVbmlxdWUoaGVhZGVyTGVuLCAwdSk7CisgICAgICAgIGlmICghY3NkKSB7CisgICAgICAgICAgICBBTE9HRSgiQ1NEIGFsbG9jYXRpb24gZmFpbGVkIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJwdXQgY3NkLCAlZCBieXRlcyIsIGhlYWRlckxlbik7CisgICAgICAgIG1lbWNweShjc2QtPm0udmFsdWUsIGhlYWRlciwgaGVhZGVyTGVuKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soc3RkOjptb3ZlKGNzZCkpOworICAgICAgICBtSGVhZGVyR2VuZXJhdGVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEZvciBidWZmZXIgc2l6ZSB3aGljaCBpcyBub3QgYSBtdWx0aXBsZSBvZiBtTnVtUGNtQnl0ZXNQZXJJbnB1dEZyYW1lLCB3ZSB3aWxsCisgICAgICogYWNjdW11bGF0ZSB0aGUgaW5wdXQgYW5kIGtlZXAgaXQuIE9uY2UgdGhlIGlucHV0IGlzIGZpbGxlZCB3aXRoIGV4cGVjdGVkIG51bWJlcgorICAgICAqIG9mIGJ5dGVzLCB3ZSB3aWxsIHNlbmQgaXQgdG8gZW5jb2Rlci4gbUZpbGxlZExlbiBtYW5hZ2VzIHRoZSBieXRlcyBvZiBpbnB1dCB5ZXQKKyAgICAgKiB0byBiZSBwcm9jZXNzZWQuIFRoZSBuZXh0IGNhbGwgd2lsbCBmaWxsIG1OdW1QY21CeXRlc1BlcklucHV0RnJhbWUgLSBtRmlsbGVkTGVuCisgICAgICogYnl0ZXMgdG8gaW5wdXQgYW5kIHNlbmQgaXQgdG8gdGhlIGVuY29kZXIuCisgICAgICovCisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBjbUJ5dGVzID0gaW5QdHIgKyBpblBvczsKKyAgICAgICAgaW50IGZpbGxlZFNhbXBsZXMgPSBtRmlsbGVkTGVuIC8gc2l6ZW9mKGludDE2X3QpOworICAgICAgICBpZiAoKGluUG9zICsgKG1OdW1QY21CeXRlc1BlcklucHV0RnJhbWUgLSBtRmlsbGVkTGVuKSkgPD0gaW5TaXplKSB7CisgICAgICAgICAgICBwcm9jZXNzU2l6ZSA9IG1OdW1QY21CeXRlc1BlcklucHV0RnJhbWUgLSBtRmlsbGVkTGVuOworICAgICAgICAgICAgbUJ1ZmZlckF2YWlsYWJsZSA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcm9jZXNzU2l6ZSA9IGluU2l6ZSAtIGluUG9zOworICAgICAgICAgICAgbUJ1ZmZlckF2YWlsYWJsZSA9IGZhbHNlOworICAgICAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgICAgIG1lbXNldChtSW5wdXRCdWZmZXJQY20xNiArIGZpbGxlZFNhbXBsZXMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgIChtTnVtUGNtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbikpOworICAgICAgICAgICAgICAgIG1CdWZmZXJBdmFpbGFibGUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIG5JbnB1dFNhbXBsZXMgPSBwcm9jZXNzU2l6ZSAvIHNpemVvZihpbnQxNl90KTsKKworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbklucHV0U2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICBpbnQzMl90IGRhdGEgPSBwY21CeXRlc1syICogaSArIDFdIDw8IDggfCBwY21CeXRlc1syICogaV07CisgICAgICAgICAgICBkYXRhID0gKChkYXRhICYgMHhGRkZGKSBeIDB4ODAwMCkgLSAweDgwMDA7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXJQY20xNltpICsgZmlsbGVkU2FtcGxlc10gPSBkYXRhOworICAgICAgICB9CisgICAgICAgIGluUG9zICs9IHByb2Nlc3NTaXplOworICAgICAgICBtRmlsbGVkTGVuICs9IHByb2Nlc3NTaXplOworICAgICAgICBpZiAoIW1CdWZmZXJBdmFpbGFibGUpIGJyZWFrOworICAgICAgICB1aW50OF90KiBvdXRQdHIgPSB3Vmlldy5kYXRhKCkgKyBtQnl0ZXNFbmNvZGVkOworICAgICAgICBpbnQgZW5jb2RlZEJ5dGVzID0KKyAgICAgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZW5jb2RlKG1FbmNvZGVyLCBtSW5wdXRCdWZmZXJQY20xNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1TYW1wbGVzUGVyRnJhbWUsIG91dFB0ciwga01heFBheWxvYWQgLSBtQnl0ZXNFbmNvZGVkKTsKKyAgICAgICAgQUxPR1YoImVuY29kZWQgJWkgT3B1cyBieXRlcyBmcm9tICV6dSBQQ00gYnl0ZXMiLCBlbmNvZGVkQnl0ZXMsCisgICAgICAgICAgICAgIHByb2Nlc3NTaXplKTsKKworICAgICAgICBpZiAoZW5jb2RlZEJ5dGVzIDwgMCB8fCBlbmNvZGVkQnl0ZXMgPiAoa01heFBheWxvYWQgLSBtQnl0ZXNFbmNvZGVkKSkgeworICAgICAgICAgICAgQUxPR0UoIm9wdXNfZW5jb2RlIGZhaWxlZCwgZW5jb2RlZEJ5dGVzIDogJWQiLCBlbmNvZGVkQnl0ZXMpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICBvdXRPcmRpbmFsLmZyYW1lSW5kZXggPSBtT3V0SW5kZXgrKzsKKyAgICAgICAgICAgIG91dE9yZGluYWwudGltZXN0YW1wID0gbUFuY2hvclRpbWVTdGFtcCArIG91dFRpbWVTdGFtcDsKKyAgICAgICAgICAgIGNsb25lQW5kU2VuZCgKKyAgICAgICAgICAgICAgICBpbnB1dEluZGV4LCB3b3JrLAorICAgICAgICAgICAgICAgIEZpbGxXb3JrKEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUsIG91dE9yZGluYWwsIGJ1ZmZlcikpOworICAgICAgICAgICAgYnVmZmVyLnJlc2V0KCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVuY29kZWRCeXRlcyA+IDApIHsKKyAgICAgICAgICAgIGJ1ZmZlciA9CisgICAgICAgICAgICAgICAgY3JlYXRlTGluZWFyQnVmZmVyKG1PdXRwdXRCbG9jaywgbUJ5dGVzRW5jb2RlZCwgZW5jb2RlZEJ5dGVzKTsKKyAgICAgICAgfQorICAgICAgICBtQnl0ZXNFbmNvZGVkICs9IGVuY29kZWRCeXRlczsKKyAgICAgICAgbVByb2Nlc3NlZFNhbXBsZXMgKz0gKGZpbGxlZFNhbXBsZXMgKyBuSW5wdXRTYW1wbGVzKTsKKyAgICAgICAgb3V0VGltZVN0YW1wID0KKyAgICAgICAgICAgIG1Qcm9jZXNzZWRTYW1wbGVzICogMTAwMDAwMGxsIC8gbUNoYW5uZWxDb3VudCAvIG1TYW1wbGVSYXRlOworICAgICAgICBpZiAoKHByb2Nlc3NTaXplICsgbUZpbGxlZExlbikgPCBtTnVtUGNtQnl0ZXNQZXJJbnB1dEZyYW1lKQorICAgICAgICAgICAgbUVuY29kZXJGbHVzaGVkID0gdHJ1ZTsKKyAgICAgICAgbUZpbGxlZExlbiA9IDA7CisgICAgfQorCisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmIChlb3MpIHsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBlb3MiKTsKKyAgICAgICAgbVNpZ25hbGxlZEVvcyA9IHRydWU7CisgICAgICAgIGlmICghbUVuY29kZXJGbHVzaGVkKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgb3V0T3JkaW5hbC5mcmFtZUluZGV4ID0gbU91dEluZGV4Kys7CisgICAgICAgICAgICAgICAgb3V0T3JkaW5hbC50aW1lc3RhbXAgPSBtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wOworICAgICAgICAgICAgICAgIGNsb25lQW5kU2VuZCgKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRJbmRleCwgd29yaywKKyAgICAgICAgICAgICAgICAgICAgRmlsbFdvcmsoQzJGcmFtZURhdGE6OkZMQUdfSU5DT01QTEVURSwgb3V0T3JkaW5hbCwgYnVmZmVyKSk7CisgICAgICAgICAgICAgICAgYnVmZmVyLnJlc2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBkcmFpbiB0aGUgZW5jb2RlciBmb3IgbGFzdCBidWZmZXIKKyAgICAgICAgICAgIGRyYWluSW50ZXJuYWwocG9vbCwgd29yayk7CisgICAgICAgIH0KKyAgICAgICAgZmxhZ3MgPSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgIH0KKyAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgIG91dE9yZGluYWwuZnJhbWVJbmRleCA9IG1PdXRJbmRleCsrOworICAgICAgICBvdXRPcmRpbmFsLnRpbWVzdGFtcCA9IG1BbmNob3JUaW1lU3RhbXAgKyBvdXRUaW1lU3RhbXA7CisgICAgICAgIEZpbGxXb3JrKChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkoZmxhZ3MpLCBvdXRPcmRpbmFsLCBidWZmZXIpKHdvcmspOworICAgICAgICBidWZmZXIucmVzZXQoKTsKKyAgICB9CisgICAgbU91dHB1dEJsb2NrID0gbnVsbHB0cjsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0VuYzo6ZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCwKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspIHsKKyAgICBtQnl0ZXNFbmNvZGVkID0gMDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IG51bGxwdHI7CisgICAgQzJXb3JrT3JkaW5hbFN0cnVjdCBvdXRPcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICBib29sIGVvcyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0ge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soa01heFBheWxvYWQsIHVzYWdlLCAmbU91dHB1dEJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICB9CisKKyAgICBDMldyaXRlVmlldyB3VmlldyA9IG1PdXRwdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICBtT3V0cHV0QmxvY2sucmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICBpbnQgZW5jQnl0ZXMgPSBkcmFpbkVuY29kZXIod1ZpZXcuZGF0YSgpKTsKKyAgICBpZiAoZW5jQnl0ZXMgPiAwKSBtQnl0ZXNFbmNvZGVkICs9IGVuY0J5dGVzOworICAgIGlmIChtQnl0ZXNFbmNvZGVkID4gMCkgeworICAgICAgICBidWZmZXIgPSBjcmVhdGVMaW5lYXJCdWZmZXIobU91dHB1dEJsb2NrLCAwLCBtQnl0ZXNFbmNvZGVkKTsKKyAgICAgICAgbU91dHB1dEJsb2NrLnJlc2V0KCk7CisgICAgfQorICAgIG1Qcm9jZXNzZWRTYW1wbGVzICs9IChtTnVtUGNtQnl0ZXNQZXJJbnB1dEZyYW1lIC8gc2l6ZW9mKGludDE2X3QpKTsKKyAgICB1aW50NjRfdCBvdXRUaW1lU3RhbXAgPQorICAgICAgICBtUHJvY2Vzc2VkU2FtcGxlcyAqIDEwMDAwMDBsbCAvIG1DaGFubmVsQ291bnQgLyBtU2FtcGxlUmF0ZTsKKyAgICBvdXRPcmRpbmFsLmZyYW1lSW5kZXggPSBtT3V0SW5kZXgrKzsKKyAgICBvdXRPcmRpbmFsLnRpbWVzdGFtcCA9IG1BbmNob3JUaW1lU3RhbXAgKyBvdXRUaW1lU3RhbXA7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0KKyAgICAgICAgKEMyRnJhbWVEYXRhOjpmbGFnc190KShlb3MgPyBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNIDogMCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IG91dE9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgIH0KKyAgICBtT3V0cHV0QmxvY2sgPSBudWxscHRyOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0VuYzo6ZHJhaW4odWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgeworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisgICAgbUlzRmlyc3RGcmFtZSA9IHRydWU7CisgICAgbUFuY2hvclRpbWVTdGFtcCA9IDB1bGw7CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgPSAwdTsKKyAgICByZXR1cm4gZHJhaW5JbnRlcm5hbChwb29sLCBudWxscHRyKTsKK30KKworY2xhc3MgQzJTb2Z0T3B1c0VuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRPcHVzRW5jRmFjdG9yeSgpCisgICAgICAgIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7fQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgIG5ldyBDMlNvZnRPcHVzRW5jKAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE9wdXNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdE9wdXNFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRPcHVzRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRPcHVzRW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdE9wdXNFbmNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0VuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI0ZDhmMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0VuYy5oCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9PUFVTX0VOQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfT1BVU19FTkNfSF8KKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorI2RlZmluZSBNSU4oYSwgYikgKCgoYSkgPCAoYikpID8gKGEpIDogKGIpKQorCitzdHJ1Y3QgT3B1c01TRW5jb2RlcjsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0T3B1c0VuYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRPcHVzRW5jKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRPcHVzRW5jKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworcHJpdmF0ZToKKyAgICAvKiBPUFVTX0ZSQU1FU0laRV8yMF9NUyAqLworICAgIGNvbnN0IGludCBrRnJhbWVTaXplID0gOTYwOworICAgIGNvbnN0IGludCBrTWF4U2FtcGxlUmF0ZSA9IDQ4MDAwOworICAgIGNvbnN0IGludCBrTWluU2FtcGxlUmF0ZSA9IDgwMDA7CisgICAgY29uc3QgaW50IGtNYXhQYXlsb2FkID0gKDQwMDAgKiBrTWF4U2FtcGxlUmF0ZSkgLyBrTWluU2FtcGxlUmF0ZTsKKyAgICBjb25zdCBpbnQga01heE51bUNoYW5uZWxzID0gODsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IG1PdXRwdXRCbG9jazsKKworICAgIE9wdXNNU0VuY29kZXIqIG1FbmNvZGVyOworICAgIGludDE2X3QqIG1JbnB1dEJ1ZmZlclBjbTE2OworCisgICAgYm9vbCBtSGVhZGVyR2VuZXJhdGVkOworICAgIGJvb2wgbUlzRmlyc3RGcmFtZTsKKyAgICBib29sIG1FbmNvZGVyRmx1c2hlZDsKKyAgICBib29sIG1CdWZmZXJBdmFpbGFibGU7CisgICAgYm9vbCBtU2lnbmFsbGVkRW9zOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIHVpbnQzMl90IG1TYW1wbGVSYXRlOworICAgIHVpbnQzMl90IG1DaGFubmVsQ291bnQ7CisgICAgdWludDMyX3QgbUZyYW1lRHVyYXRpb25NczsKKyAgICB1aW50NjRfdCBtQW5jaG9yVGltZVN0YW1wOworICAgIHVpbnQ2NF90IG1Qcm9jZXNzZWRTYW1wbGVzOworICAgIC8vIENvZGVjIGRlbGF5IGluIG5zCisgICAgdWludDY0X3QgbUNvZGVjRGVsYXk7CisgICAgLy8gU2VlayBwcmUtcm9sbCBpbiBucworICAgIHVpbnQ2NF90IG1TZWVrUHJlUm9sbDsKKyAgICBpbnQgbU51bVNhbXBsZXNQZXJGcmFtZTsKKyAgICBpbnQgbUJ5dGVzRW5jb2RlZDsKKyAgICBpbnQzMl90IG1GaWxsZWRMZW47CisgICAgc2l6ZV90IG1OdW1QY21CeXRlc1BlcklucHV0RnJhbWU7CisgICAgc3RkOjphdG9taWNfdWludDY0X3QgbU91dEluZGV4OworICAgIGMyX3N0YXR1c190IGluaXRFbmNvZGVyKCk7CisgICAgYzJfc3RhdHVzX3QgY29uZmlndXJlRW5jb2RlcigpOworICAgIGludCBkcmFpbkVuY29kZXIodWludDhfdCogb3V0UHRyKTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbkludGVybmFsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRPcHVzRW5jKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX09QVVNfRU5DX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjOTQ0ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQW5kcm9pZC5icApAQCAtMCwwICsxLDkgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfcmF3ZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRSYXdEZWMuY3BwIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQzJTb2Z0UmF3RGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9DMlNvZnRSYXdEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1ZWI5MDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQzJTb2Z0UmF3RGVjLmNwcApAQCAtMCwwICsxLDIyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0UmF3RGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRSYXdEZWMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQucmF3LmRlY29kZXIiOworCit9ICAvLyBuYW1lc3BhY2UKKworY2xhc3MgQzJTb2Z0UmF3RGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTywKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOworICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZygKKyAgICAgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDQ0MTAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuaW5SYW5nZSg4MDAwLCAzODQwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0KDB1LCAyKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5pblJhbmdlKDEsIDgpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dCgwdSwgNjQwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDEsIDk4MzA0MDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgNjQgKiAxMDI0KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1QY21FbmNvZGluZ0luZm8sIEMyX1BBUkFNS0VZX1BDTV9FTkNPRElORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGNtRW5jb2RpbmdJbmZvOjpvdXRwdXQoMHUsIEMyQ29uZmlnOjpQQ01fMTYpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVBjbUVuY29kaW5nSW5mbywgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQQ01fMTYsCisgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UENNXzgsCisgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UENNX0ZMT0FUfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1QY21FbmNvZGluZ0luZm8pPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBjbUVuY29kaW5nSW5mbzo6b3V0cHV0PiBtUGNtRW5jb2RpbmdJbmZvOworfTsKKworQzJTb2Z0UmF3RGVjOjpDMlNvZnRSYXdEZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpIHsKK30KKworQzJTb2Z0UmF3RGVjOjp+QzJTb2Z0UmF3RGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRSYXdEZWM6Om9uSW5pdCgpIHsKKyAgICBtU2lnbmFsbGVkRW9zID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRSYXdEZWM6Om9uU3RvcCgpIHsKKyAgICBtU2lnbmFsbGVkRW9zID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdFJhd0RlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRSYXdEZWM6Om9uUmVsZWFzZSgpIHsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0UmF3RGVjOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRSYXdEZWM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpcG9vbDsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworCisgICAgaWYgKG1TaWduYWxsZWRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCIsCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayh3b3JrLT5pbnB1dC5idWZmZXJzWzBdKTsKKyAgICB9CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBtU2lnbmFsbGVkRW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFJhd0RlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdFJhd0RlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRSYXdEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0UmF3RGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFJhd0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRSYXdEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRSYXdEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRSYXdEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRSYXdEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9DMlNvZnRSYXdEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9DMlNvZnRSYXdEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGZkZWM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0MyU29mdFJhd0RlYy5oCkBAIC0wLDAgKzEsNTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9SQVdfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9SQVdfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdFJhd0RlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRSYXdEZWMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0UmF3RGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIGJvb2wgbVNpZ25hbGxlZEVvczsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdFJhd0RlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9SQVdfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb21tb25fdGltZS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9jb21tb25fdGltZS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmNvcHkgdG8gbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2NvbW1vbl90aW1lL05PVElDRSBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9OT1RJQ0UKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9jb21tb25fdGltZS9OT1RJQ0UKY29weSB0byBtZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvTk9USUNFCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZjQ4NWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvQW5kcm9pZC5icApAQCAtMCwwICsxLDExIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3ZvcmJpc2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0Vm9yYmlzRGVjLmNwcCJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsibGlidm9yYmlzaWRlYyJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0MyU29mdFZvcmJpc0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvQzJTb2Z0Vm9yYmlzRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGU2ZGIyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0MyU29mdFZvcmJpc0RlYy5jcHAKQEAgLTAsMCArMSw0ODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdFZvcmJpc0RlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0Vm9yYmlzRGVjLmgiCisKK2V4dGVybiAiQyIgeworICAgICNpbmNsdWRlIDxUcmVtb2xvL2NvZGVjX2ludGVybmFsLmg+CisKKyAgICBpbnQgX3ZvcmJpc191bnBhY2tfYm9va3Modm9yYmlzX2luZm8gKnZpLG9nZ3BhY2tfYnVmZmVyICpvcGIpOworICAgIGludCBfdm9yYmlzX3VucGFja19pbmZvKHZvcmJpc19pbmZvICp2aSxvZ2dwYWNrX2J1ZmZlciAqb3BiKTsKKyAgICBpbnQgX3ZvcmJpc191bnBhY2tfY29tbWVudCh2b3JiaXNfY29tbWVudCAqdmMsb2dncGFja19idWZmZXIgKm9wYik7Cit9CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLnZvcmJpcy5kZWNvZGVyIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK2NsYXNzIEMyU29mdFZvcmJpc0RlYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fQVVESU8sCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoCisgICAgICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCA0ODAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmluUmFuZ2UoODAwMCwgOTYwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5pblJhbmdlKDEsIDgpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dCgwdSwgNjQwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDMyMDAwLCA1MDAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA4MTkyICogMiAqIHNpemVvZihpbnQxNl90KSkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRWb3JiaXNEZWM6OkMyU29mdFZvcmJpc0RlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtU3RhdGUobnVsbHB0ciksCisgICAgICBtVmkobnVsbHB0cikgeworfQorCitDMlNvZnRWb3JiaXNEZWM6On5DMlNvZnRWb3JiaXNEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZvcmJpc0RlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfTk9fTUVNT1JZOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWb3JiaXNEZWM6Om9uU3RvcCgpIHsKKyAgICBpZiAobVN0YXRlKSB7CisgICAgICAgIHZvcmJpc19kc3BfY2xlYXIobVN0YXRlKTsKKyAgICAgICAgZGVsZXRlIG1TdGF0ZTsKKyAgICAgICAgbVN0YXRlID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBpZiAobVZpKSB7CisgICAgICAgIHZvcmJpc19pbmZvX2NsZWFyKG1WaSk7CisgICAgICAgIGRlbGV0ZSBtVmk7CisgICAgICAgIG1WaSA9IG51bGxwdHI7CisgICAgfQorICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlID0gLTE7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworCisgICAgcmV0dXJuIChpbml0RGVjb2RlcigpID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQpOworfQorCit2b2lkIEMyU29mdFZvcmJpc0RlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRWb3JiaXNEZWM6Om9uUmVsZWFzZSgpIHsKKyAgICBpZiAobVN0YXRlKSB7CisgICAgICAgIHZvcmJpc19kc3BfY2xlYXIobVN0YXRlKTsKKyAgICAgICAgZGVsZXRlIG1TdGF0ZTsKKyAgICAgICAgbVN0YXRlID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBpZiAobVZpKSB7CisgICAgICAgIHZvcmJpc19pbmZvX2NsZWFyKG1WaSk7CisgICAgICAgIGRlbGV0ZSBtVmk7CisgICAgICAgIG1WaSA9IG51bGxwdHI7CisgICAgfQorfQorCitzdGF0dXNfdCBDMlNvZnRWb3JiaXNEZWM6OmluaXREZWNvZGVyKCkgeworICAgIG1WaSA9IG5ldyB2b3JiaXNfaW5mb3t9OworICAgIGlmICghbVZpKSByZXR1cm4gTk9fTUVNT1JZOworICAgIHZvcmJpc19pbmZvX2NsZWFyKG1WaSk7CisKKyAgICBtU3RhdGUgPSBuZXcgdm9yYmlzX2RzcF9zdGF0ZXt9OworICAgIGlmICghbVN0YXRlKSByZXR1cm4gTk9fTUVNT1JZOworICAgIHZvcmJpc19kc3BfY2xlYXIobVN0YXRlKTsKKworICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlID0gLTE7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1JbmZvVW5wYWNrZWQgPSBmYWxzZTsKKyAgICBtQm9va3NVbnBhY2tlZCA9IGZhbHNlOworICAgIHJldHVybiBPSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0Vm9yYmlzRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlID0gLTE7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIGlmIChtU3RhdGUpIHZvcmJpc19kc3BfcmVzdGFydChtU3RhdGUpOworCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWb3JiaXNEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZCkgcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0aWMgdm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKworc3RhdGljIHZvaWQgbWFrZUJpdFJlYWRlcigKKyAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsCisgICAgICAgIG9nZ19idWZmZXIgKmJ1Ziwgb2dnX3JlZmVyZW5jZSAqcmVmLCBvZ2dwYWNrX2J1ZmZlciAqYml0cykgeworICAgIGJ1Zi0+ZGF0YSA9ICh1aW50OF90ICopZGF0YTsKKyAgICBidWYtPnNpemUgPSBzaXplOworICAgIGJ1Zi0+cmVmY291bnQgPSAxOworICAgIGJ1Zi0+cHRyLm93bmVyID0gbnVsbHB0cjsKKworICAgIHJlZi0+YnVmZmVyID0gYnVmOworICAgIHJlZi0+YmVnaW4gPSAwOworICAgIHJlZi0+bGVuZ3RoID0gc2l6ZTsKKyAgICByZWYtPm5leHQgPSBudWxscHRyOworCisgICAgb2dncGFja19yZWFkaW5pdChiaXRzLCByZWYpOworfQorCisvLyAoQ0hFQ0shKSBtdWx0aWZyYW1lIGlzIHRyaWNreS4gZGVjb2RlIGNhbGwgZG9lc250IHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzCisvLyBjb25zdW1lZCBieSB0aGUgY29tcG9uZW50LiBBbHNvIGl0IGlzIHVuY2xlYXIgd2h5IG51bVBhZ2VGcmFtZXMgaXMgYmVpbmcKKy8vIHRhZ2dlZCBhdCB0aGUgZW5kIG9mIGlucHV0IGJ1ZmZlcnMgZm9yIG5ldyBwYWdlcy4gUmVmZXIgbGluZXMgMjk3LTMwMCBpbgorLy8gU2ltcGxlRGVjb2RpbmdTb3VyY2UuY3BwCit2b2lkIEMyU29mdFZvcmJpc0RlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gclZpZXcuZXJyb3IoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpblNpemUgPT0gMCkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLCBpblNpemUsCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gclZpZXcuZGF0YSgpICsgaW5PZmZzZXQ7CisgICAgaW50MzJfdCBudW1DaGFubmVscyAgPSBtVmktPmNoYW5uZWxzOworICAgIGludDMyX3Qgc2FtcGxpbmdSYXRlID0gbVZpLT5yYXRlOworICAgIC8qIERlY29kZSB2b3JiaXMgaGVhZGVycyBvbmx5IG9uY2UgKi8KKyAgICBpZiAoaW5TaXplID4gNyAmJiAhbWVtY21wKCZkYXRhWzFdLCAidm9yYmlzIiwgNikgJiYgKCFtSW5mb1VucGFja2VkIHx8ICFtQm9va3NVbnBhY2tlZCkpIHsKKyAgICAgICAgaWYgKChkYXRhWzBdICE9IDEpICYmIChkYXRhWzBdICE9IDUpKSB7CisgICAgICAgICAgICBBTE9HRSgidW5leHBlY3RlZCB0eXBlIHJlY2VpdmVkICVkIiwgZGF0YVswXSk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgb2dnX2J1ZmZlciBidWY7CisgICAgICAgIG9nZ19yZWZlcmVuY2UgcmVmOworICAgICAgICBvZ2dwYWNrX2J1ZmZlciBiaXRzOworCisgICAgICAgIC8vIHNraXAgNyA8dHlwZSArICJ2b3JiaXMiPiBieXRlcworICAgICAgICBtYWtlQml0UmVhZGVyKChjb25zdCB1aW50OF90ICopZGF0YSArIDcsIGluU2l6ZSAtIDcsICZidWYsICZyZWYsICZiaXRzKTsKKyAgICAgICAgaWYgKGRhdGFbMF0gPT0gMSkgeworICAgICAgICAgICAgdm9yYmlzX2luZm9faW5pdChtVmkpOworICAgICAgICAgICAgaWYgKDAgIT0gX3ZvcmJpc191bnBhY2tfaW5mbyhtVmksICZiaXRzKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJFbmNvdW50ZXJlZCBlcnJvciB3aGlsZSB1bnBhY2tpbmcgaW5mbyIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtVmktPnJhdGUgIT0gc2FtcGxpbmdSYXRlIHx8CisgICAgICAgICAgICAgICAgICAgIG1WaS0+Y2hhbm5lbHMgIT0gbnVtQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigidm9yYmlzOiByYXRlL2NoYW5uZWxzIGNoYW5nZWQ6ICVsZC8lZCIsIG1WaS0+cmF0ZSwgbVZpLT5jaGFubmVscyk7CisgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlID0gbVZpLT5yYXRlOworICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzID0gbVZpLT5jaGFubmVsczsKKworICAgICAgICAgICAgICAgIEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCBzYW1wbGVSYXRlSW5mbygwdSwgc2FtcGxpbmdSYXRlKTsKKyAgICAgICAgICAgICAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCBjaGFubmVsQ291bnRJbmZvKDB1LCBudW1DaGFubmVscyk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICB7ICZzYW1wbGVSYXRlSW5mbywgJmNoYW5uZWxDb3VudEluZm8gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgICAgICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KHNhbXBsZVJhdGVJbmZvKSk7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoY2hhbm5lbENvdW50SW5mbykpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb25maWcgVXBkYXRlIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtSW5mb1VucGFja2VkID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghbUluZm9VbnBhY2tlZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJEYXRhIHdpdGggdHlwZTo1IHNlbnQgYmVmb3JlIHNlbmRpbmcgdHlwZToxIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKDAgIT0gX3ZvcmJpc191bnBhY2tfYm9va3MobVZpLCAmYml0cykpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRW5jb3VudGVyZWQgZXJyb3Igd2hpbGUgdW5wYWNraW5nIGJvb2tzIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKDAgIT0gdm9yYmlzX2RzcF9pbml0KG1TdGF0ZSwgbVZpKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJFbmNvdW50ZXJlZCBlcnJvciB3aGlsZSBkc3AgaW5pdCIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Cb29rc1VucGFja2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmICghbUluZm9VbnBhY2tlZCB8fCAhbUJvb2tzVW5wYWNrZWQpIHsKKyAgICAgICAgQUxPR0UoIk1pc3NpbmcgQ09ERUNfQ09ORklHIGRhdGEgbUluZm9VbnBhY2tlZDogJWQgbUJvb2tzVW5wYWNrICVkIiwgbUluZm9VbnBhY2tlZCwgbUJvb2tzVW5wYWNrZWQpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQzMl90IG51bVBhZ2VGcmFtZXMgPSAwOworICAgIGlmIChpblNpemUgPCBzaXplb2YobnVtUGFnZUZyYW1lcykpIHsKKyAgICAgICAgQUxPR0UoImlucHV0IGhlYWRlciBoYXMgc2l6ZSAlenUsIGV4cGVjdGVkICV6dSIsIGluU2l6ZSwgc2l6ZW9mKG51bVBhZ2VGcmFtZXMpKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1lbWNweSgmbnVtUGFnZUZyYW1lcywgZGF0YSArIGluU2l6ZSAtIHNpemVvZihudW1QYWdlRnJhbWVzKSwgc2l6ZW9mKG51bVBhZ2VGcmFtZXMpKTsKKyAgICBpblNpemUgLT0gc2l6ZW9mKG51bVBhZ2VGcmFtZXMpOworICAgIGlmIChudW1QYWdlRnJhbWVzID49IDApIHsKKyAgICAgICAgbU51bUZyYW1lc0xlZnRPblBhZ2UgPSBudW1QYWdlRnJhbWVzOworICAgIH0KKworICAgIG9nZ19idWZmZXIgYnVmOworICAgIGJ1Zi5kYXRhID0gY29uc3RfY2FzdDx1bnNpZ25lZCBjaGFyKj4oZGF0YSk7CisgICAgYnVmLnNpemUgPSBpblNpemU7CisgICAgYnVmLnJlZmNvdW50ID0gMTsKKyAgICBidWYucHRyLm93bmVyID0gbnVsbHB0cjsKKworICAgIG9nZ19yZWZlcmVuY2UgcmVmOworICAgIHJlZi5idWZmZXIgPSAmYnVmOworICAgIHJlZi5iZWdpbiA9IDA7CisgICAgcmVmLmxlbmd0aCA9IGJ1Zi5zaXplOworICAgIHJlZi5uZXh0ID0gbnVsbHB0cjsKKworICAgIG9nZ19wYWNrZXQgcGFjazsKKyAgICBwYWNrLnBhY2tldCA9ICZyZWY7CisgICAgcGFjay5ieXRlcyA9IHJlZi5sZW5ndGg7CisgICAgcGFjay5iX29fcyA9IDA7CisgICAgcGFjay5lX29fcyA9IDA7CisgICAgcGFjay5ncmFudWxlcG9zID0gMDsKKyAgICBwYWNrLnBhY2tldG5vID0gMDsKKworICAgIHNpemVfdCBtYXhTYW1wbGVzSW5CdWZmZXIgPSBrTWF4TnVtU2FtcGxlc1BlckNoYW5uZWwgKiBtVmktPmNoYW5uZWxzOworICAgIHNpemVfdCBvdXRDYXBhY2l0eSA9ICBtYXhTYW1wbGVzSW5CdWZmZXIgKiBzaXplb2YoaW50MTZfdCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKG91dENhcGFjaXR5LCB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gd1ZpZXcuZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludCBudW1GcmFtZXMgPSAwOworICAgIGludCByZXQgPSB2b3JiaXNfZHNwX3N5bnRoZXNpcyhtU3RhdGUsICZwYWNrLCAxKTsKKyAgICBpZiAoMCAhPSByZXQpIHsKKyAgICAgICAgQUxPR0QoInZvcmJpc19kc3Bfc3ludGhlc2lzIHJldHVybmVkICVkOyBpZ25vcmVkIiwgcmV0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBudW1GcmFtZXMgPSB2b3JiaXNfZHNwX3BjbW91dCgKKyAgICAgICAgICAgICAgICBtU3RhdGUsICByZWludGVycHJldF9jYXN0PGludDE2X3QgKj4gKHdWaWV3LmRhdGEoKSksCisgICAgICAgICAgICAgICAga01heE51bVNhbXBsZXNQZXJDaGFubmVsKTsKKyAgICAgICAgaWYgKG51bUZyYW1lcyA8IDApIHsKKyAgICAgICAgICAgIEFMT0dEKCJ2b3JiaXNfZHNwX3BjbW91dCByZXR1cm5lZCAlZCIsIG51bUZyYW1lcyk7CisgICAgICAgICAgICBudW1GcmFtZXMgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1OdW1GcmFtZXNMZWZ0T25QYWdlID49IDApIHsKKyAgICAgICAgaWYgKG51bUZyYW1lcyA+IG1OdW1GcmFtZXNMZWZ0T25QYWdlKSB7CisgICAgICAgICAgICBBTE9HVigiZGlzY2FyZGluZyAlZCBmcmFtZXMgYXQgZW5kIG9mIHBhZ2UiLCBudW1GcmFtZXMgLSBtTnVtRnJhbWVzTGVmdE9uUGFnZSk7CisgICAgICAgICAgICBudW1GcmFtZXMgPSBtTnVtRnJhbWVzTGVmdE9uUGFnZTsKKyAgICAgICAgfQorICAgICAgICBtTnVtRnJhbWVzTGVmdE9uUGFnZSAtPSBudW1GcmFtZXM7CisgICAgfQorCisgICAgaWYgKG51bUZyYW1lcykgeworICAgICAgICBpbnQgb3V0U2l6ZSA9IG51bUZyYW1lcyAqIHNpemVvZihpbnQxNl90KSAqIG1WaS0+Y2hhbm5lbHM7CisKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIDAsIG91dFNpemUpKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIH0gZWxzZSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGJsb2NrLnJlc2V0KCk7CisgICAgfQorICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgfQorfQorCitjbGFzcyBDMlNvZnRWb3JiaXNEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0Vm9yYmlzRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdFZvcmJpc0RlYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRWb3JiaXNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0Vm9yYmlzRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0Vm9yYmlzRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0Vm9yYmlzRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0Vm9yYmlzRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvQzJTb2Z0Vm9yYmlzRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvQzJTb2Z0Vm9yYmlzRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JmNzMyNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuaApAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfVk9SQklTX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfVk9SQklTX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworCitzdHJ1Y3Qgdm9yYmlzX2RzcF9zdGF0ZTsKK3N0cnVjdCB2b3JiaXNfaW5mbzsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0Vm9yYmlzRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdFZvcmJpc0RlYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRWb3JiaXNEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTWF4TnVtU2FtcGxlc1BlckNoYW5uZWwgPSA4MTkyLAorICAgIH07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIHZvcmJpc19kc3Bfc3RhdGUgKm1TdGF0ZTsKKyAgICB2b3JiaXNfaW5mbyAqbVZpOworCisgICAgaW50MzJfdCBtTnVtRnJhbWVzTGVmdE9uUGFnZTsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgYm9vbCBtSW5mb1VucGFja2VkOworICAgIGJvb2wgbUJvb2tzVW5wYWNrZWQ7CisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdFZvcmJpc0RlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9WT1JCSVNfREVDX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvbW1vbl90aW1lL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2NvbW1vbl90aW1lL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKY29weSB0byBtZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29tbW9uX3RpbWUvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2NvbW1vbl90aW1lL05PVElDRQpjb3B5IHRvIG1lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9OT1RJQ0UKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRmNTc1MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNjAgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfdnA5ZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRWcHhEZWMuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWyJsaWJ2cHgiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURWUDkiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfdnA4ZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRWcHhEZWMuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWyJsaWJ2cHgiXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF92cDllbmMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDMlNvZnRWcDlFbmMuY3BwIiwKKyAgICAgICAgIkMyU29mdFZweEVuYy5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWyJsaWJ2cHgiXSwKKworICAgIGNmbGFnczogWyItRFZQOSJdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3ZwOGVuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkMyU29mdFZwOEVuYy5jcHAiLAorICAgICAgICAiQzJTb2Z0VnB4RW5jLmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbImxpYnZweCJdLAorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA4RW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDhFbmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxOGY1ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA4RW5jLmNwcApAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRWcDhFbmMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgorCisjaW5jbHVkZSAiQzJTb2Z0VnA4RW5jLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQzJTb2Z0VnA4RW5jOjpDMlNvZnRWcDhFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpCisgICAgOiBDMlNvZnRWcHhFbmMobmFtZSwgaWQsIGludGZJbXBsKSwgbURDVFBhcnRpdGlvbnMoMCksIG1Qcm9maWxlKDEpIHt9CisKK3ZvaWQgQzJTb2Z0VnA4RW5jOjpzZXRDb2RlY1NwZWNpZmljSW50ZXJmYWNlKCkgeworICAgIG1Db2RlY0ludGVyZmFjZSA9IHZweF9jb2RlY192cDhfY3goKTsKK30KKwordm9pZCBDMlNvZnRWcDhFbmM6OnNldENvZGVjU3BlY2lmaWNDb25maWd1cmF0aW9uKCkgeworICAgIHN3aXRjaCAobVByb2ZpbGUpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wcm9maWxlID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAyOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wcm9maWxlID0gMzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAwOworICAgIH0KK30KKwordnB4X2NvZGVjX2Vycl90IEMyU29mdFZwOEVuYzo6c2V0Q29kZWNTcGVjaWZpY0NvbnRyb2xzKCkgeworICAgIHZweF9jb2RlY19lcnJfdCBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfY29udHJvbChtQ29kZWNDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhFX1NFVF9UT0tFTl9QQVJUSVRJT05TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRENUUGFydGl0aW9ucyk7CisgICAgaWYgKGNvZGVjX3JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIHNldHRpbmcgZGN0IHBhcnRpdGlvbnMgZm9yIHZweCBlbmNvZGVyLiIpOworICAgIH0KKyAgICByZXR1cm4gY29kZWNfcmV0dXJuOworfQorCitjbGFzcyBDMlNvZnRWcDhFbmNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0VnA4RW5jRmFjdG9yeSgpCisgICAgICAgIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7fQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgIG5ldyBDMlNvZnRWcDhFbmMoQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFZweEVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0VnB4RW5jOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0VnB4RW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRWcDhFbmNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRWcDhFbmNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDhFbmMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDhFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDZmMzU2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOEVuYy5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX1ZQOF9FTkNfSF9fCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9WUDhfRU5DX0hfXworCisjaW5jbHVkZSAiQzJTb2Z0VnB4RW5jLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gRXhwb3NlcyB2cDggZW5jb2RlciBhcyBhIGMyIENvbXBvbmVudAorLy8KKy8vIEluIGFkZGl0aW9uIHRvIHRoZSBiYXNlIGNsYXNzIHNldHRpbmdzLCBPbmx5IGZvbGxvd2luZyBlbmNvZGVyIHNldHRpbmdzIGFyZQorLy8gYXZhaWxhYmxlOgorLy8gICAgLSB0b2tlbiBwYXJ0aXRpb25pbmcKK3N0cnVjdCBDMlNvZnRWcDhFbmMgOiBwdWJsaWMgQzJTb2Z0VnB4RW5jIHsKKyAgICBDMlNvZnRWcDhFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisKKyBwcm90ZWN0ZWQ6CisgICAgLy8gUG9wdWxhdGVzIHxtQ29kZWNJbnRlcmZhY2V8IHdpdGggY29kZWMgc3BlY2lmaWMgc2V0dGluZ3MuCisgICAgdmlydHVhbCB2b2lkIHNldENvZGVjU3BlY2lmaWNJbnRlcmZhY2UoKTsKKworICAgIC8vIFNldHMgY29kZWMgc3BlY2lmaWMgY29uZmlndXJhdGlvbi4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29kZWNTcGVjaWZpY0NvbmZpZ3VyYXRpb24oKTsKKworICAgIC8vIEluaXRpYWxpemVzIGNvZGVjIHNwZWNpZmljIGVuY29kZXIgc2V0dGluZ3MuCisgICAgdmlydHVhbCB2cHhfY29kZWNfZXJyX3Qgc2V0Q29kZWNTcGVjaWZpY0NvbnRyb2xzKCk7CisKKyBwcml2YXRlOgorICAgIC8vIE1heCB2YWx1ZSBzdXBwb3J0ZWQgZm9yIERDVCBwYXJ0aXRpb25zCisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYXhEQ1RQYXJ0aXRpb25zID0gMzsKKworICAgIC8vIHZwOCBzcGVjaWZpYyBjb25maWd1cmF0aW9uIHBhcmFtZXRlcgorICAgIC8vIHRoYXQgZW5hYmxlcyB0b2tlbiBwYXJ0aXRpb25pbmcgb2YKKyAgICAvLyB0aGUgc3RyZWFtIGludG8gc3Vic3RyZWFtcworICAgIGludDMyX3QgbURDVFBhcnRpdGlvbnM7CisKKyAgICAvLyBDMiBQcm9maWxlIHBhcmFtZXRlcgorICAgIGludDMyX3QgbVByb2ZpbGU7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRWcDhFbmMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfVlA4X0VOQ19IX18KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDlFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOUVuYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQwZGJkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDlFbmMuY3BwCkBAIC0wLDAgKzEsMTQyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdFZwOUVuYyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisKKyNpbmNsdWRlICJDMlNvZnRWcDlFbmMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitDMlNvZnRWcDlFbmM6OkMyU29mdFZwOUVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCkKKyAgICA6IEMyU29mdFZweEVuYyhuYW1lLCBpZCwgaW50ZkltcGwpLAorICAgICAgbVByb2ZpbGUoMSksCisgICAgICBtTGV2ZWwoMCksCisgICAgICBtVGlsZUNvbHVtbnMoMCksCisgICAgICBtRnJhbWVQYXJhbGxlbERlY29kaW5nKGZhbHNlKSB7Cit9CisKK3ZvaWQgQzJTb2Z0VnA5RW5jOjpzZXRDb2RlY1NwZWNpZmljSW50ZXJmYWNlKCkgeworICAgIG1Db2RlY0ludGVyZmFjZSA9IHZweF9jb2RlY192cDlfY3goKTsKK30KKwordm9pZCBDMlNvZnRWcDlFbmM6OnNldENvZGVjU3BlY2lmaWNDb25maWd1cmF0aW9uKCkgeworICAgIHN3aXRjaCAobVByb2ZpbGUpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wcm9maWxlID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDE7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAyOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA4OgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wcm9maWxlID0gMzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAwOworICAgIH0KK30KKwordnB4X2NvZGVjX2Vycl90IEMyU29mdFZwOUVuYzo6c2V0Q29kZWNTcGVjaWZpY0NvbnRyb2xzKCkgeworICAgIHZweF9jb2RlY19lcnJfdCBjb2RlY1JldHVybiA9IHZweF9jb2RlY19jb250cm9sKAorICAgICAgICAgICAgbUNvZGVjQ29udGV4dCwgVlA5RV9TRVRfVElMRV9DT0xVTU5TLCBtVGlsZUNvbHVtbnMpOworICAgIGlmIChjb2RlY1JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIHNldHRpbmcgVlA5RV9TRVRfVElMRV9DT0xVTU5TIHRvICVkLiB2cHhfY29kZWNfY29udHJvbCgpICIKKyAgICAgICAgICAgICAgInJldHVybmVkICVkIiwgbVRpbGVDb2x1bW5zLCBjb2RlY1JldHVybik7CisgICAgICAgIHJldHVybiBjb2RlY1JldHVybjsKKyAgICB9CisgICAgY29kZWNSZXR1cm4gPSB2cHhfY29kZWNfY29udHJvbCgKKyAgICAgICAgICAgIG1Db2RlY0NvbnRleHQsIFZQOUVfU0VUX0ZSQU1FX1BBUkFMTEVMX0RFQ09ESU5HLAorICAgICAgICAgICAgbUZyYW1lUGFyYWxsZWxEZWNvZGluZyk7CisgICAgaWYgKGNvZGVjUmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBBTE9HRSgiRXJyb3Igc2V0dGluZyBWUDlFX1NFVF9GUkFNRV9QQVJBTExFTF9ERUNPRElORyB0byAlZC4iCisgICAgICAgICAgICAgICJ2cHhfY29kZWNfY29udHJvbCgpIHJldHVybmVkICVkIiwgbUZyYW1lUGFyYWxsZWxEZWNvZGluZywKKyAgICAgICAgICAgICAgY29kZWNSZXR1cm4pOworICAgICAgICByZXR1cm4gY29kZWNSZXR1cm47CisgICAgfQorICAgIGNvZGVjUmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2wobUNvZGVjQ29udGV4dCwgVlA5RV9TRVRfUk9XX01ULCAxKTsKKyAgICBpZiAoY29kZWNSZXR1cm4gIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBzZXR0aW5nIFZQOUVfU0VUX1JPV19NVCB0byAxLiB2cHhfY29kZWNfY29udHJvbCgpICIKKyAgICAgICAgICAgICAgInJldHVybmVkICVkIiwgY29kZWNSZXR1cm4pOworICAgICAgICByZXR1cm4gY29kZWNSZXR1cm47CisgICAgfQorCisgICAgLy8gRm9yIFZQOSwgd2UgYWx3YXlzIHNldCBDUFVfVVNFRCB0byA4IChiZWNhdXNlIHRoZSByZWFsdGltZSBkZWZhdWx0IGlzIDAKKyAgICAvLyB3aGljaCBpcyB0b28gc2xvdykuCisgICAgY29kZWNSZXR1cm4gPSB2cHhfY29kZWNfY29udHJvbChtQ29kZWNDb250ZXh0LCBWUDhFX1NFVF9DUFVVU0VELCA4KTsKKyAgICBpZiAoY29kZWNSZXR1cm4gIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBzZXR0aW5nIFZQOEVfU0VUX0NQVVVTRUQgdG8gOC4gdnB4X2NvZGVjX2NvbnRyb2woKSAiCisgICAgICAgICAgICAgICJyZXR1cm5lZCAlZCIsIGNvZGVjUmV0dXJuKTsKKyAgICAgICAgcmV0dXJuIGNvZGVjUmV0dXJuOworICAgIH0KKyAgICByZXR1cm4gY29kZWNSZXR1cm47Cit9CisKK2NsYXNzIEMyU29mdFZwOUVuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRWcDlFbmNGYWN0b3J5KCkKKyAgICAgICAgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHt9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgbmV3IEMyU29mdFZwOUVuYyhDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0VnB4RW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRWcHhFbmM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRWcHhFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdFZwOUVuY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdFZwOUVuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOUVuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOUVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3ZWY4ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA5RW5jLmgKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfVlA5X0VOQ19IX18KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX1ZQOV9FTkNfSF9fCisKKyNpbmNsdWRlICJDMlNvZnRWcHhFbmMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBFeHBvc2VzIHZwOSBlbmNvZGVyIGFzIGEgYzIgQ29tcG9uZW50CisvLworLy8gSW4gYWRkaXRpb24gdG8gdGhlIGJhc2UgY2xhc3Mgc2V0dGluZ3MsIE9ubHkgZm9sbG93aW5nIGVuY29kZXIgc2V0dGluZ3MgYXJlCisvLyBhdmFpbGFibGU6CisvLyAgICAtIHRpbGUgcm93cworLy8gICAgLSB0aWxlIGNvbHVtbnMKKy8vICAgIC0gZnJhbWUgcGFyYWxsZWwgbW9kZQorc3RydWN0IEMyU29mdFZwOUVuYyA6IHB1YmxpYyBDMlNvZnRWcHhFbmMgeworICAgIEMyU29mdFZwOUVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKworIHByb3RlY3RlZDoKKyAgICAvLyBQb3B1bGF0ZXMgfG1Db2RlY0ludGVyZmFjZXwgd2l0aCBjb2RlYyBzcGVjaWZpYyBzZXR0aW5ncy4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29kZWNTcGVjaWZpY0ludGVyZmFjZSgpOworCisgICAgLy8gU2V0cyBjb2RlYyBzcGVjaWZpYyBjb25maWd1cmF0aW9uLgorICAgIHZpcnR1YWwgdm9pZCBzZXRDb2RlY1NwZWNpZmljQ29uZmlndXJhdGlvbigpOworCisgICAgLy8gSW5pdGlhbGl6ZXMgY29kZWMgc3BlY2lmaWMgZW5jb2RlciBzZXR0aW5ncy4KKyAgICB2aXJ0dWFsIHZweF9jb2RlY19lcnJfdCBzZXRDb2RlY1NwZWNpZmljQ29udHJvbHMoKTsKKworIHByaXZhdGU6CisgICAgLy8gQzIgUHJvZmlsZSAmIExldmVsIHBhcmFtZXRlcgorICAgIGludDMyX3QgbVByb2ZpbGU7CisgICAgaW50MzJfdCBtTGV2ZWwgX191bnVzZWQ7CisKKyAgICBpbnQzMl90IG1UaWxlQ29sdW1uczsKKworICAgIGJvb2wgbUZyYW1lUGFyYWxsZWxEZWNvZGluZzsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdFZwOUVuYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9WUDlfRU5DX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTJjYTE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5jcHAKQEAgLTAsMCArMSw5MzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdFZweERlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0VnB4RGVjLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2lmZGVmIFZQOQorY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLnZwOS5kZWNvZGVyIjsKKyNlbHNlCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQudnA4LmRlY29kZXIiOworI2VuZGlmCisKK2NsYXNzIEMyU29mdFZweERlYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fVklERU8sCisjaWZkZWYgVlA5CisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fVlA5CisjZWxzZQorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOAorI2VuZGlmCisgICAgICAgICAgICAgICAgKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsgLy8gVE9ETzogYWNjb3VudCBmb3Igb3VyIGJ1ZmZlcnMgaGVyZQorICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworCisgICAgICAgIC8vIFRPRE86IG91dHB1dCBsYXRlbmN5IGFuZCByZW9yZGVyaW5nCisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZyhDMkNvbXBvbmVudDo6QVRUUklCX0lTX1RFTVBPUkFMKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TaXplLCBDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDIwNDgsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNpemVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisjaWZkZWYgVlA5CisgICAgICAgIC8vIFRPRE86IEFkZCBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMkhEUiA/PworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMCwgQzJDb25maWc6OkxFVkVMX1ZQOV81KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfVlA5XzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfVlA5XzJ9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9WUDlfMV8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9WUDlfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzJfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV8zXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV80LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9WUDlfNF8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9WUDlfNSwKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIG1IZHIxMFBsdXNJbmZvSW5wdXQgPSBDMlN0cmVhbUhkcjEwUGx1c0luZm86OmlucHV0OjpBbGxvY1NoYXJlZCgwKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1IZHIxMFBsdXNJbmZvSW5wdXQsIEMyX1BBUkFNS0VZX0lOUFVUX0hEUjEwX1BMVVNfSU5GTykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobUhkcjEwUGx1c0luZm9JbnB1dCkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtSGRyMTBQbHVzSW5mb0lucHV0LCBtLnZhbHVlKS5hbnkoKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKEhkcjEwUGx1c0luZm9JbnB1dFNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgbUhkcjEwUGx1c0luZm9PdXRwdXQgPSBDMlN0cmVhbUhkcjEwUGx1c0luZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoMCk7CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSGRyMTBQbHVzSW5mb091dHB1dCwgQzJfUEFSQU1LRVlfT1VUUFVUX0hEUjEwX1BMVVNfSU5GTykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobUhkcjEwUGx1c0luZm9PdXRwdXQpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUhkcjEwUGx1c0luZm9PdXRwdXQsIG0udmFsdWUpLmFueSgpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoSGRyMTBQbHVzSW5mb091dHB1dFNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyNpZiAwCisgICAgICAgIC8vIHNhbXBsZSBCVC4yMDIwIHN0YXRpYyBpbmZvCisgICAgICAgIG1IZHJTdGF0aWNJbmZvID0gc3RkOjptYWtlX3NoYXJlZDxDMlN0cmVhbUhkclN0YXRpY0luZm86Om91dHB1dD4oKTsKKyAgICAgICAgbUhkclN0YXRpY0luZm8tPm1hc3RlcmluZyA9IHsKKyAgICAgICAgICAgIC5yZWQgICA9IHsgLnggPSAwLjcwOCwgIC55ID0gMC4yOTIgfSwKKyAgICAgICAgICAgIC5ncmVlbiA9IHsgLnggPSAwLjE3MCwgIC55ID0gMC43OTcgfSwKKyAgICAgICAgICAgIC5ibHVlICA9IHsgLnggPSAwLjEzMSwgIC55ID0gMC4wNDYgfSwKKyAgICAgICAgICAgIC53aGl0ZSA9IHsgLnggPSAwLjMxMjcsIC55ID0gMC4zMjkwIH0sCisgICAgICAgICAgICAubWF4THVtaW5hbmNlID0gMTAwMCwKKyAgICAgICAgICAgIC5taW5MdW1pbmFuY2UgPSAwLjEsCisgICAgICAgIH07CisgICAgICAgIG1IZHJTdGF0aWNJbmZvLT5tYXhDbGwgPSAxMDAwOworICAgICAgICBtSGRyU3RhdGljSW5mby0+bWF4RmFsbCA9IDEyMDsKKworICAgICAgICBtSGRyU3RhdGljSW5mby0+bWF4THVtaW5hbmNlID0gMDsgLy8gZGlzYWJsZSBzdGF0aWMgaW5mbworCisgICAgICAgIGhlbHBlci0+YWRkU3RydWN0RGVzY3JpcHRvcnM8QzJNYXN0ZXJpbmdEaXNwbGF5Q29sb3JWb2x1bWVTdHJ1Y3QsIEMyQ29sb3JYeVN0cnVjdD4oKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1IZHJTdGF0aWNJbmZvLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8pCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG1IZHJTdGF0aWNJbmZvKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1IZHJTdGF0aWNJbmZvLCBtYXN0ZXJpbmcucmVkLngpLmluUmFuZ2UoMCwgMSksCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKEhkclN0YXRpY0luZm9TZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworI2VuZGlmCisjZWxzZQorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9VTlVTRUQsIEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyNlbmRpZgorCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4U2l6ZSwgQzJfUEFSQU1LRVlfTUFYX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihNYXhQaWN0dXJlU2l6ZVNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4SW5wdXRTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMzIwICogMjQwICogMyAvIDQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1NYXhJbnB1dFNpemUsIHZhbHVlKS5hbnkoKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5jYWxjdWxhdGVkQXMoTWF4SW5wdXRTaXplU2V0dGVyLCBtTWF4U2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgbG9jYXRpb25zWzFdID0geyBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpIH07CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICAxdSwgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgbWVtY3B5KGRlZmF1bHRDb2xvckluZm8tPm0ubG9jYXRpb25zLCBsb2NhdGlvbnMsIHNpemVvZihsb2NhdGlvbnMpKTsKKworICAgICAgICBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICB7IEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCkgfSwKKyAgICAgICAgICAgICAgICAgICAgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgaGVscGVyLT5hZGRTdHJ1Y3REZXNjcmlwdG9yczxDMkNocm9tYU9mZnNldFN0cnVjdD4oKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbG9ySW5mbywgQzJfUEFSQU1LRVlfQ09ERURfQ09MT1JfSU5GTykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoZGVmYXVsdENvbG9ySW5mbykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoRGVmYXVsdENvbG9yQXNwZWN0c1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBtb3JlIGZvcm1hdHM/CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGl4ZWxGb3JtYXQsIEMyX1BBUkFNS0VZX1BJWEVMX0ZPUk1BVCkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAoIW1lLkYobWUudi53aWR0aCkuc3VwcG9ydHNBdEFsbChtZS52LndpZHRoKSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LndpZHRoKSkpOworICAgICAgICAgICAgbWUuc2V0KCkud2lkdGggPSBvbGRNZS52LndpZHRoOworICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmhlaWdodCkuc3VwcG9ydHNBdEFsbChtZS52LmhlaWdodCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi5oZWlnaHQpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBvbGRNZS52LmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4UGljdHVyZVNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBUT0RPOiBnZXQgbWF4IHdpZHRoL2hlaWdodCBmcm9tIHRoZSBzaXplJ3MgZmllbGQgaGVscGVycyB2cy4gaGFyZGNvZGluZworICAgICAgICBtZS5zZXQoKS53aWR0aCA9IGMyX21pbihjMl9tYXgobWUudi53aWR0aCwgc2l6ZS52LndpZHRoKSwgMjA0OHUpOworICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBjMl9taW4oYzJfbWF4KG1lLnYuaGVpZ2h0LCBzaXplLnYuaGVpZ2h0KSwgMjA0OHUpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4SW5wdXRTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtYXhTaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBhc3N1bWUgY29tcHJlc3Npb24gcmF0aW8gb2YgMgorICAgICAgICBtZS5zZXQoKS52YWx1ZSA9ICgoKG1heFNpemUudi53aWR0aCArIDYzKSAvIDY0KSAqICgobWF4U2l6ZS52LmhlaWdodCArIDYzKSAvIDY0KSAqIDMwNzIpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgRGVmYXVsdENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAobWUudi5yYW5nZSA+IEMyQ29sb3I6OlJBTkdFX09USEVSKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5yYW5nZSA9IEMyQ29sb3I6OlJBTkdFX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnRyYW5zZmVyID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYubWF0cml4ID4gQzJDb2xvcjo6TUFUUklYX09USEVSKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgKHZvaWQpc2l6ZTsKKyAgICAgICAgKHZvaWQpbWU7ICAvLyBUT0RPOiB2YWxpZGF0ZQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gZ2V0RGVmYXVsdENvbG9yQXNwZWN0c19sKCkgeworICAgICAgICByZXR1cm4gbURlZmF1bHRDb2xvckFzcGVjdHM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBIZHIxMFBsdXNJbmZvSW5wdXRTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgKHZvaWQpbWU7ICAvLyBUT0RPOiB2YWxpZGF0ZQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgSGRyMTBQbHVzSW5mb091dHB1dFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgKHZvaWQpbWU7ICAvLyBUT0RPOiB2YWxpZGF0ZQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gbU1heFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtTWF4SW5wdXRTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBtQ29sb3JJbmZvOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0PiBtUGl4ZWxGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IG1EZWZhdWx0Q29sb3JBc3BlY3RzOworI2lmZGVmIFZQOQorI2lmIDAKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1IZHJTdGF0aWNJbmZvOjpvdXRwdXQ+IG1IZHJTdGF0aWNJbmZvOworI2VuZGlmCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6aW5wdXQ+IG1IZHIxMFBsdXNJbmZvSW5wdXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0PiBtSGRyMTBQbHVzSW5mb091dHB1dDsKKyNlbmRpZgorfTsKKworQzJTb2Z0VnB4RGVjOjpDb252ZXJ0ZXJUaHJlYWQ6OkNvbnZlcnRlclRocmVhZCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE11dGV4ZWQ8Q29udmVyc2lvblF1ZXVlPj4gJnF1ZXVlKQorICAgIDogVGhyZWFkKGZhbHNlKSwgbVF1ZXVlKHF1ZXVlKSB7fQorCitib29sIEMyU29mdFZweERlYzo6Q29udmVydGVyVGhyZWFkOjp0aHJlYWRMb29wKCkgeworICAgIE11dGV4ZWQ8Q29udmVyc2lvblF1ZXVlPjo6TG9ja2VkIHF1ZXVlKCptUXVldWUpOworICAgIGlmIChxdWV1ZS0+ZW50cmllcy5lbXB0eSgpKSB7CisgICAgICAgIHF1ZXVlLndhaXRGb3JDb25kaXRpb24ocXVldWUtPmNvbmQpOworICAgICAgICBpZiAocXVldWUtPmVudHJpZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKCk+IGNvbnZlcnQgPSBxdWV1ZS0+ZW50cmllcy5mcm9udCgpOworICAgIHF1ZXVlLT5lbnRyaWVzLnBvcF9mcm9udCgpOworICAgIGlmICghcXVldWUtPmVudHJpZXMuZW1wdHkoKSkgeworICAgICAgICBxdWV1ZS0+Y29uZC5zaWduYWwoKTsKKyAgICB9CisgICAgcXVldWUudW5sb2NrKCk7CisKKyAgICBjb252ZXJ0KCk7CisKKyAgICBxdWV1ZS5sb2NrKCk7CisgICAgaWYgKC0tcXVldWUtPm51bVBlbmRpbmcgPT0gMHUpIHsKKyAgICAgICAgcXVldWUtPmNvbmQuYnJvYWRjYXN0KCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitDMlNvZnRWcHhEZWM6OkMyU29mdFZweERlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtQ29kZWNDdHgobnVsbHB0ciksCisgICAgICBtQ29yZUNvdW50KDEpLAorICAgICAgbVF1ZXVlKG5ldyBNdXRleGVkPENvbnZlcnNpb25RdWV1ZT4pIHsKK30KKworQzJTb2Z0VnB4RGVjOjp+QzJTb2Z0VnB4RGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWcHhEZWM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RGVjb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRDsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0VnB4RGVjOjpvblN0b3AoKSB7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdFZweERlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBvbkZsdXNoX3NtKCk7CisgICAgaWYgKGVyciAhPSBDMl9PSykKKyAgICB7CisgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gZmx1c2ggZGVjb2Rlci4gVHJ5IHRvIGhhcmQgcmVzZXQgZGVjb2RlciIpOworICAgICAgICBkZXN0cm95RGVjb2RlcigpOworICAgICAgICAodm9pZClpbml0RGVjb2RlcigpOworICAgIH0KK30KKwordm9pZCBDMlNvZnRWcHhEZWM6Om9uUmVsZWFzZSgpIHsKKyAgICBkZXN0cm95RGVjb2RlcigpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWcHhEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgaWYgKG1GcmFtZVBhcmFsbGVsTW9kZSkgeworICAgICAgICAvLyBGbHVzaCBkZWNvZGVyIGJ5IHBhc3NpbmcgbnVsbHB0ciBkYXRhIHB0ciBhbmQgMCBzaXplLgorICAgICAgICAvLyBJZGVhbGx5LCB0aGlzIHNob3VsZCBuZXZlciBmYWlsLgorICAgICAgICBpZiAodnB4X2NvZGVjX2RlY29kZShtQ29kZWNDdHgsIG51bGxwdHIsIDAsIG51bGxwdHIsIDApKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGZsdXNoIG9uMiBkZWNvZGVyLiIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIERyb3AgYWxsIHRoZSBkZWNvZGVkIGZyYW1lcyBpbiBkZWNvZGVyLgorICAgIHZweF9jb2RlY19pdGVyX3QgaXRlciA9IG51bGxwdHI7CisgICAgd2hpbGUgKHZweF9jb2RlY19nZXRfZnJhbWUobUNvZGVjQ3R4LCAmaXRlcikpIHsKKyAgICB9CisKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0aWMgaW50IEdldENQVUNvcmVDb3VudCgpIHsKKyAgICBpbnQgY3B1Q29yZUNvdW50ID0gMTsKKyNpZiBkZWZpbmVkKF9TQ19OUFJPQ0VTU09SU19PTkxOKQorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworI2Vsc2UKKyAgICAvLyBfU0NfTlBST0NfT05MTiBtdXN0IGJlIGRlZmluZWQuLi4KKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ19PTkxOKTsKKyNlbmRpZgorICAgIENIRUNLKGNwdUNvcmVDb3VudCA+PSAxKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIENQVSBjb3JlczogJWQiLCBjcHVDb3JlQ291bnQpOworICAgIHJldHVybiBjcHVDb3JlQ291bnQ7Cit9CisKK3N0YXR1c190IEMyU29mdFZweERlYzo6aW5pdERlY29kZXIoKSB7CisjaWZkZWYgVlA5CisgICAgbU1vZGUgPSBNT0RFX1ZQOTsKKyNlbHNlCisgICAgbU1vZGUgPSBNT0RFX1ZQODsKKyNlbmRpZgorCisgICAgbVdpZHRoID0gMzIwOworICAgIG1IZWlnaHQgPSAyNDA7CisgICAgbUZyYW1lUGFyYWxsZWxNb2RlID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworCisgICAgaWYgKCFtQ29kZWNDdHgpIHsKKyAgICAgICAgbUNvZGVjQ3R4ID0gbmV3IHZweF9jb2RlY19jdHhfdDsKKyAgICB9CisgICAgaWYgKCFtQ29kZWNDdHgpIHsKKyAgICAgICAgQUxPR0UoIm1Db2RlY0N0eCBpcyBudWxsIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgdnB4X2NvZGVjX2RlY19jZmdfdCBjZmc7CisgICAgbWVtc2V0KCZjZmcsIDAsIHNpemVvZih2cHhfY29kZWNfZGVjX2NmZ190KSk7CisgICAgY2ZnLnRocmVhZHMgPSBtQ29yZUNvdW50ID0gR2V0Q1BVQ29yZUNvdW50KCk7CisKKyAgICB2cHhfY29kZWNfZmxhZ3NfdCBmbGFnczsKKyAgICBtZW1zZXQoJmZsYWdzLCAwLCBzaXplb2YodnB4X2NvZGVjX2ZsYWdzX3QpKTsKKyAgICBpZiAobUZyYW1lUGFyYWxsZWxNb2RlKSBmbGFncyB8PSBWUFhfQ09ERUNfVVNFX0ZSQU1FX1RIUkVBRElORzsKKworICAgIHZweF9jb2RlY19lcnJfdCB2cHhfZXJyOworICAgIGlmICgodnB4X2VyciA9IHZweF9jb2RlY19kZWNfaW5pdCgKKyAgICAgICAgICAgICAgICAgbUNvZGVjQ3R4LCBtTW9kZSA9PSBNT0RFX1ZQOCA/ICZ2cHhfY29kZWNfdnA4X2R4X2FsZ28gOiAmdnB4X2NvZGVjX3ZwOV9keF9hbGdvLAorICAgICAgICAgICAgICAgICAmY2ZnLCBmbGFncykpKSB7CisgICAgICAgIEFMT0dFKCJvbjIgZGVjb2RlciBmYWlsZWQgdG8gaW5pdGlhbGl6ZS4gKCVkKSIsIHZweF9lcnIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAobU1vZGUgPT0gTU9ERV9WUDkpIHsKKyAgICAgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDo6c3RyaW5nX2xpdGVyYWxzOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Db3JlQ291bnQ7ICsraSkgeworICAgICAgICAgICAgc3A8Q29udmVydGVyVGhyZWFkPiB0aHJlYWQobmV3IENvbnZlcnRlclRocmVhZChtUXVldWUpKTsKKyAgICAgICAgICAgIG1Db252ZXJ0ZXJUaHJlYWRzLnB1c2hfYmFjayh0aHJlYWQpOworICAgICAgICAgICAgaWYgKHRocmVhZC0+cnVuKCgidnA5Y29udiAjInMgKyBzdGQ6OnRvX3N0cmluZyhpKSkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1BSSU9SSVRZX0FVRElPKSAhPSBPSykgeworICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRWcHhEZWM6OmRlc3Ryb3lEZWNvZGVyKCkgeworICAgIGlmICAobUNvZGVjQ3R4KSB7CisgICAgICAgIHZweF9jb2RlY19kZXN0cm95KG1Db2RlY0N0eCk7CisgICAgICAgIGRlbGV0ZSBtQ29kZWNDdHg7CisgICAgICAgIG1Db2RlY0N0eCA9IG51bGxwdHI7CisgICAgfQorICAgIGJvb2wgcnVubmluZyA9IHRydWU7CisgICAgZm9yIChjb25zdCBzcDxDb252ZXJ0ZXJUaHJlYWQ+ICZ0aHJlYWQgOiBtQ29udmVydGVyVGhyZWFkcykgeworICAgICAgICB0aHJlYWQtPnJlcXVlc3RFeGl0KCk7CisgICAgfQorICAgIHdoaWxlIChydW5uaW5nKSB7CisgICAgICAgIG1RdWV1ZS0+bG9jaygpLT5jb25kLmJyb2FkY2FzdCgpOworICAgICAgICBydW5uaW5nID0gZmFsc2U7CisgICAgICAgIGZvciAoY29uc3Qgc3A8Q29udmVydGVyVGhyZWFkPiAmdGhyZWFkIDogbUNvbnZlcnRlclRocmVhZHMpIHsKKyAgICAgICAgICAgIGlmICh0aHJlYWQtPmlzUnVubmluZygpKSB7CisgICAgICAgICAgICAgICAgcnVubmluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbUNvbnZlcnRlclRocmVhZHMuY2xlYXIoKTsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgfQorICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCit2b2lkIEMyU29mdFZweERlYzo6ZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0gY3JlYXRlR3JhcGhpY0J1ZmZlcihibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJSZWN0KG1XaWR0aCwgbUhlaWdodCkpOworICAgIGF1dG8gZmlsbFdvcmsgPSBbYnVmZmVyLCBpbmRleCwgaW50ZiA9IHRoaXMtPm1JbnRmXSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgaWYgKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICYmCisgICAgICAgICAgICAgICAgKGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpKSB7CisgICAgICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgICAgIH0KKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworCisgICAgICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+ICZwYXJhbTogd29yay0+aW5wdXQuY29uZmlnVXBkYXRlKSB7CisgICAgICAgICAgICBpZiAocGFyYW0pIHsKKyAgICAgICAgICAgICAgICBDMlN0cmVhbUhkcjEwUGx1c0luZm86OmlucHV0ICpoZHIxMFBsdXNJbmZvID0KKyAgICAgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6aW5wdXQ6OkZyb20ocGFyYW0uZ2V0KCkpOworCisgICAgICAgICAgICAgICAgaWYgKGhkcjEwUGx1c0luZm8gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBvdXRQYXJhbSA9IEMyUGFyYW06OkNvcHlBc1N0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGFyYW0uZ2V0KCksIHRydWUgLypvdXRwdXQqLywgcGFyYW0tPnN0cmVhbSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gaW50Zi0+Y29uZmlnKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgb3V0UGFyYW0uZ2V0KCkgfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weSgqb3V0UGFyYW0uZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJmaW5pc2hXb3JrOiBDb25maWcgdXBkYXRlIHNpemUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKyAgICBpZiAod29yayAmJiBjMl9jbnRyNjRfdChpbmRleCkgPT0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4KSB7CisgICAgICAgIGZpbGxXb3JrKHdvcmspOworICAgIH0gZWxzZSB7CisgICAgICAgIGZpbmlzaChpbmRleCwgZmlsbFdvcmspOworICAgIH0KK30KKwordm9pZCBDMlNvZnRWcHhEZWM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgY29kZWNDb25maWcgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPTApOworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCwgZmxhZ3MgJXgiLAorICAgICAgICAgIGluU2l6ZSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksIHdvcmstPmlucHV0LmZsYWdzKTsKKworICAgIC8vIFNvZnR3YXJlIFZQOSBEZWNvZGVyIGRvZXMgbm90IG5lZWQgdGhlIENvZGVjIFNwZWNpZmljIERhdGEgKENTRCkKKyAgICAvLyAoc3BlY2lmaWVkIGluIGh0dHA6Ly93d3cud2VibXByb2plY3Qub3JnL3ZwOS9wcm9maWxlcy8pLiBJZ25vcmUgaXQgaWYKKyAgICAvLyBpdCB3YXMgcGFzc2VkLgorICAgIGlmIChjb2RlY0NvbmZpZykgeworICAgICAgICAvLyBJZ25vcmUgQ1NEIGJ1ZmZlciBmb3IgVlA5LgorICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9WUDkpIHsKKyAgICAgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUb2xlcmF0ZSB0aGUgQ1NEIGJ1ZmZlciBmb3IgVlA4LiBUaGlzIGlzIGEgd29ya2Fyb3VuZAorICAgICAgICAgICAgLy8gZm9yIGIvMjg2ODk1MzYuIGNvbnRpbnVlCisgICAgICAgICAgICBBTE9HVygiV0FSTklORzogR290IENTRCBidWZmZXIgZm9yIFZQOC4gQ29udGludWUiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludDY0X3QgZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrbGwoKTsKKworICAgIGlmIChpblNpemUpIHsKKyAgICAgICAgdWludDhfdCAqYml0c3RyZWFtID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0KTsKKyAgICAgICAgdnB4X2NvZGVjX2Vycl90IGVyciA9IHZweF9jb2RlY19kZWNvZGUoCisgICAgICAgICAgICAgICAgbUNvZGVjQ3R4LCBiaXRzdHJlYW0sIGluU2l6ZSwgJmZyYW1lSW5kZXgsIDApOworICAgICAgICBpZiAoZXJyICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICAgICAgQUxPR0UoIm9uMiBkZWNvZGVyIGZhaWxlZCB0byBkZWNvZGUgZnJhbWUuIGVycjogJWQiLCBlcnIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAodm9pZClvdXRwdXRCdWZmZXIocG9vbCwgd29yayk7CisKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TLCBwb29sLCB3b3JrKTsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgfSBlbHNlIGlmICghaW5TaXplKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb3B5T3V0cHV0QnVmZmVyVG9ZdXZQbGFuYXJGcmFtZSgKKyAgICAgICAgdWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNZLCBjb25zdCB1aW50OF90ICpzcmNVLCBjb25zdCB1aW50OF90ICpzcmNWLAorICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAorICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7CisgICAgdWludDhfdCAqZHN0U3RhcnQgPSBkc3Q7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmNZLCB3aWR0aCk7CisgICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGU7CisgICAgICAgICBkc3QgKz0gZHN0WVN0cmlkZTsKKyAgICB9CisKKyAgICBkc3QgPSBkc3RTdGFydCArIGRzdFlTdHJpZGUgKiBoZWlnaHQ7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyY1YsIHdpZHRoIC8gMik7CisgICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7CisgICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgfQorCisgICAgZHN0ID0gZHN0U3RhcnQgKyAoZHN0WVN0cmlkZSAqIGhlaWdodCkgKyAoZHN0VVZTdHJpZGUgKiBoZWlnaHQgLyAyKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgeworICAgICAgICAgbWVtY3B5KGRzdCwgc3JjVSwgd2lkdGggLyAyKTsKKyAgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKKyAgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMCh1aW50MzJfdCAqZHN0LAorICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjWSwgY29uc3QgdWludDE2X3QgKnNyY1UsIGNvbnN0IHVpbnQxNl90ICpzcmNWLAorICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAorICAgICAgICBzaXplX3QgZHN0U3RyaWRlLCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKKworICAgIC8vIENvbnZlcnRpbmcgdHdvIGxpbmVzIGF0IGEgdGltZSwgc2xpZ2h0bHkgZmFzdGVyCisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKz0gMikgeworICAgICAgICB1aW50MzJfdCAqZHN0VG9wID0gKHVpbnQzMl90ICopIGRzdDsKKyAgICAgICAgdWludDMyX3QgKmRzdEJvdCA9ICh1aW50MzJfdCAqKSAoZHN0ICsgZHN0U3RyaWRlKTsKKyAgICAgICAgdWludDE2X3QgKnlTcmNUb3AgPSAodWludDE2X3QqKSBzcmNZOworICAgICAgICB1aW50MTZfdCAqeVNyY0JvdCA9ICh1aW50MTZfdCopIChzcmNZICsgc3JjWVN0cmlkZSk7CisgICAgICAgIHVpbnQxNl90ICp1U3JjID0gKHVpbnQxNl90Kikgc3JjVTsKKyAgICAgICAgdWludDE2X3QgKnZTcmMgPSAodWludDE2X3QqKSBzcmNWOworCisgICAgICAgIHVpbnQzMl90IHUwMSwgdjAxLCB5MDEsIHkyMywgeTQ1LCB5NjcsIHV2MCwgdXYxOworICAgICAgICBzaXplX3QgeCA9IDA7CisgICAgICAgIGZvciAoOyB4IDwgd2lkdGggLSAzOyB4ICs9IDQpIHsKKworICAgICAgICAgICAgdTAxID0gKigodWludDMyX3QqKXVTcmMpOyB1U3JjICs9IDI7CisgICAgICAgICAgICB2MDEgPSAqKCh1aW50MzJfdCopdlNyYyk7IHZTcmMgKz0gMjsKKworICAgICAgICAgICAgeTAxID0gKigodWludDMyX3QqKXlTcmNUb3ApOyB5U3JjVG9wICs9IDI7CisgICAgICAgICAgICB5MjMgPSAqKCh1aW50MzJfdCopeVNyY1RvcCk7IHlTcmNUb3AgKz0gMjsKKyAgICAgICAgICAgIHk0NSA9ICooKHVpbnQzMl90Kil5U3JjQm90KTsgeVNyY0JvdCArPSAyOworICAgICAgICAgICAgeTY3ID0gKigodWludDMyX3QqKXlTcmNCb3QpOyB5U3JjQm90ICs9IDI7CisKKyAgICAgICAgICAgIHV2MCA9ICh1MDEgJiAweDNGRikgfCAoKHYwMSAmIDB4M0ZGKSA8PCAyMCk7CisgICAgICAgICAgICB1djEgPSAodTAxID4+IDE2KSB8ICgodjAxID4+IDE2KSA8PCAyMCk7CisKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkwMSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MDEgPj4gMTYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkyMyAmIDB4M0ZGKSA8PCAxMCkgfCB1djE7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MjMgPj4gMTYpIDw8IDEwKSB8IHV2MTsKKworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTQ1ICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk0NSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTY3ICYgMHgzRkYpIDw8IDEwKSB8IHV2MTsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk2NyA+PiAxNikgPDwgMTApIHwgdXYxOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlcmUgc2hvdWxkIGJlIGF0IG1vc3QgMiBtb3JlIHBpeGVscyB0byBwcm9jZXNzLiBOb3RlIHRoYXQgd2UgZG9uJ3QKKyAgICAgICAgLy8gbmVlZCB0byBjb25zaWRlciBvZGQgY2FzZSBhcyB0aGUgYnVmZmVyIGlzIGFsd2F5cyBhbGlnbmVkIHRvIGV2ZW4uCisgICAgICAgIGlmICh4IDwgd2lkdGgpIHsKKyAgICAgICAgICAgIHUwMSA9ICp1U3JjOworICAgICAgICAgICAgdjAxID0gKnZTcmM7CisgICAgICAgICAgICB5MDEgPSAqKCh1aW50MzJfdCopeVNyY1RvcCk7CisgICAgICAgICAgICB5NDUgPSAqKCh1aW50MzJfdCopeVNyY0JvdCk7CisgICAgICAgICAgICB1djAgPSAodTAxICYgMHgzRkYpIHwgKCh2MDEgJiAweDNGRikgPDwgMjApOworICAgICAgICAgICAgKmRzdFRvcCsrID0gKCh5MDEgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdFRvcCsrID0gKCh5MDEgPj4gMTYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9ICgoeTQ1ICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9ICgoeTQ1ID4+IDE2KSA8PCAxMCkgfCB1djA7CisgICAgICAgIH0KKworICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGUgKiAyOworICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7CisgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKKyAgICAgICAgZHN0ICs9IGRzdFN0cmlkZSAqIDI7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcih1aW50OF90ICpkc3QsCisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNZLCBjb25zdCB1aW50MTZfdCAqc3JjVSwgY29uc3QgdWludDE2X3QgKnNyY1YsCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCisgICAgICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgeworCisgICAgdWludDhfdCAqZHN0WSA9ICh1aW50OF90ICopZHN0OworICAgIHNpemVfdCBkc3RZU2l6ZSA9IGRzdFlTdHJpZGUgKiBoZWlnaHQ7CisgICAgc2l6ZV90IGRzdFVWU2l6ZSA9IGRzdFVWU3RyaWRlICogaGVpZ2h0IC8gMjsKKyAgICB1aW50OF90ICpkc3RWID0gZHN0WSArIGRzdFlTaXplOworICAgIHVpbnQ4X3QgKmRzdFUgPSBkc3RWICsgZHN0VVZTaXplOworCisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKKyAgICAgICAgICAgIGRzdFlbeF0gPSAodWludDhfdCkoc3JjWVt4XSA+PiAyKTsKKyAgICAgICAgfQorCisgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKKyAgICAgICAgZHN0WSArPSBkc3RZU3RyaWRlOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgKGhlaWdodCArIDEpIC8gMjsgKyt5KSB7CisgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgKHdpZHRoICsgMSkgLyAyOyArK3gpIHsKKyAgICAgICAgICAgIGRzdFVbeF0gPSAodWludDhfdCkoc3JjVVt4XSA+PiAyKTsKKyAgICAgICAgICAgIGRzdFZbeF0gPSAodWludDhfdCkoc3JjVlt4XSA+PiAyKTsKKyAgICAgICAgfQorCisgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKKyAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOworICAgICAgICBkc3RVICs9IGRzdFVWU3RyaWRlOworICAgICAgICBkc3RWICs9IGRzdFVWU3RyaWRlOworICAgIH0KKyAgICByZXR1cm47Cit9Citib29sIEMyU29mdFZweERlYzo6b3V0cHV0QnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykKK3sKKyAgICBpZiAoISh3b3JrICYmIHBvb2wpKSByZXR1cm4gZmFsc2U7CisKKyAgICB2cHhfY29kZWNfaXRlcl90IGl0ZXIgPSBudWxscHRyOworICAgIHZweF9pbWFnZV90ICppbWcgPSB2cHhfY29kZWNfZ2V0X2ZyYW1lKG1Db2RlY0N0eCwgJml0ZXIpOworCisgICAgaWYgKCFpbWcpIHJldHVybiBmYWxzZTsKKworICAgIGlmIChpbWctPmRfdyAhPSBtV2lkdGggfHwgaW1nLT5kX2ggIT0gbUhlaWdodCkgeworICAgICAgICBtV2lkdGggPSBpbWctPmRfdzsKKyAgICAgICAgbUhlaWdodCA9IGltZy0+ZF9oOworCisgICAgICAgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQgc2l6ZSgwdSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKHsmc2l6ZX0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShzaXplKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiQ29uZmlnIHVwZGF0ZSBzaXplIGZhaWxlZCIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgIH0KKyAgICBDSEVDSyhpbWctPmZtdCA9PSBWUFhfSU1HX0ZNVF9JNDIwIHx8IGltZy0+Zm10ID09IFZQWF9JTUdfRk1UX0k0MjAxNik7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrOworICAgIHVpbnQzMl90IGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKKyAgICBpZiAoaW1nLT5mbXQgPT0gVlBYX0lNR19GTVRfSTQyMDE2KSB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gZGVmYXVsdENvbG9yQXNwZWN0cyA9IG1JbnRmLT5nZXREZWZhdWx0Q29sb3JBc3BlY3RzX2woKTsKKworICAgICAgICBpZiAoZGVmYXVsdENvbG9yQXNwZWN0cy0+cHJpbWFyaWVzID09IEMyQ29sb3I6OlBSSU1BUklFU19CVDIwMjAgJiYKKyAgICAgICAgICAgIGRlZmF1bHRDb2xvckFzcGVjdHMtPm1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfQlQyMDIwICYmCisgICAgICAgICAgICBkZWZhdWx0Q29sb3JBc3BlY3RzLT50cmFuc2ZlciA9PSBDMkNvbG9yOjpUUkFOU0ZFUl9TVDIwODQpIHsKKyAgICAgICAgICAgIGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyOworICAgICAgICB9CisgICAgfQorICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaEdyYXBoaWNCbG9jayhhbGlnbihtV2lkdGgsIDE2KSwgbUhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaEdyYXBoaWNCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IGVycjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEFMT0dWKCJwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICglZHglZCksIG91dCBmcmFtZWluZGV4ICVkIiwKKyAgICAgICAgICAgYmxvY2stPndpZHRoKCksIGJsb2NrLT5oZWlnaHQoKSwgbVdpZHRoLCBtSGVpZ2h0LCAoaW50KSooaW50NjRfdCAqKWltZy0+dXNlcl9wcml2KTsKKworICAgIHVpbnQ4X3QgKmRzdCA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPih3Vmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldKTsKKyAgICBzaXplX3Qgc3JjWVN0cmlkZSA9IGltZy0+c3RyaWRlW1ZQWF9QTEFORV9ZXTsKKyAgICBzaXplX3Qgc3JjVVN0cmlkZSA9IGltZy0+c3RyaWRlW1ZQWF9QTEFORV9VXTsKKyAgICBzaXplX3Qgc3JjVlN0cmlkZSA9IGltZy0+c3RyaWRlW1ZQWF9QTEFORV9WXTsKKyAgICBDMlBsYW5hckxheW91dCBsYXlvdXQgPSB3Vmlldy5sYXlvdXQoKTsKKyAgICBzaXplX3QgZHN0WVN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldLnJvd0luYzsKKyAgICBzaXplX3QgZHN0VVZTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXS5yb3dJbmM7CisKKyAgICBpZiAoaW1nLT5mbXQgPT0gVlBYX0lNR19GTVRfSTQyMDE2KSB7CisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNZID0gKGNvbnN0IHVpbnQxNl90ICopaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1ldOworICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjVSA9IChjb25zdCB1aW50MTZfdCAqKWltZy0+cGxhbmVzW1ZQWF9QTEFORV9VXTsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1YgPSAoY29uc3QgdWludDE2X3QgKilpbWctPnBsYW5lc1tWUFhfUExBTkVfVl07CisKKyAgICAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMikgeworICAgICAgICAgICAgTXV0ZXhlZDxDb252ZXJzaW9uUXVldWU+OjpMb2NrZWQgcXVldWUoKm1RdWV1ZSk7CisgICAgICAgICAgICBzaXplX3QgaSA9IDA7CisgICAgICAgICAgICBjb25zdGV4cHIgc2l6ZV90IGtIZWlnaHQgPSA2NDsKKyAgICAgICAgICAgIGZvciAoOyBpIDwgbUhlaWdodDsgaSArPSBrSGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgcXVldWUtPmVudHJpZXMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgW2RzdCwgc3JjWSwgc3JjVSwgc3JjViwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLCBzcmNWU3RyaWRlLCBkc3RZU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gbVdpZHRoLCBoZWlnaHQgPSBzdGQ6Om1pbihtSGVpZ2h0IC0gaSwga0hlaWdodCldIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1k0MTAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QgKilkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLCBkc3RZU3RyaWRlIC8gc2l6ZW9mKHVpbnQzMl90KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlIC8gMiAqIGtIZWlnaHQ7CisgICAgICAgICAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlIC8gMiAqIChrSGVpZ2h0IC8gMik7CisgICAgICAgICAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlIC8gMiAqIChrSGVpZ2h0IC8gMik7CisgICAgICAgICAgICAgICAgZHN0ICs9IGRzdFlTdHJpZGUgKiBrSGVpZ2h0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ0hFQ0tfRVEoMHUsIHF1ZXVlLT5udW1QZW5kaW5nKTsKKyAgICAgICAgICAgIHF1ZXVlLT5udW1QZW5kaW5nID0gcXVldWUtPmVudHJpZXMuc2l6ZSgpOworICAgICAgICAgICAgd2hpbGUgKHF1ZXVlLT5udW1QZW5kaW5nID4gMCkgeworICAgICAgICAgICAgICAgIHF1ZXVlLT5jb25kLnNpZ25hbCgpOworICAgICAgICAgICAgICAgIHF1ZXVlLndhaXRGb3JDb25kaXRpb24ocXVldWUtPmNvbmQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIoZHN0LCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW1ZQWF9QTEFORV9ZXTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjVSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1VdOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNWID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tWUFhfUExBTkVfVl07CisgICAgICAgIGNvcHlPdXRwdXRCdWZmZXJUb1l1dlBsYW5hckZyYW1lKAorICAgICAgICAgICAgICAgIGRzdCwgc3JjWSwgc3JjVSwgc3JjViwKKyAgICAgICAgICAgICAgICBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLCBzcmNWU3RyaWRlLAorICAgICAgICAgICAgICAgIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLAorICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CisgICAgfQorICAgIGZpbmlzaFdvcmsoKihpbnQ2NF90ICopaW1nLT51c2VyX3ByaXYsIHdvcmssIHN0ZDo6bW92ZShibG9jaykpOworICAgIHJldHVybiB0cnVlOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWcHhEZWM6OmRyYWluSW50ZXJuYWwoCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgd2hpbGUgKChvdXRwdXRCdWZmZXIocG9vbCwgd29yaykpKSB7CisgICAgfQorCisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MgJiYKKyAgICAgICAgICAgIHdvcmsgJiYgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPT0gMHUpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CitjMl9zdGF0dXNfdCBDMlNvZnRWcHhEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICByZXR1cm4gZHJhaW5JbnRlcm5hbChkcmFpbk1vZGUsIHBvb2wsIG51bGxwdHIpOworfQorCitjbGFzcyBDMlNvZnRWcHhGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0VnB4RmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgIG5ldyBDMlNvZnRWcHhEZWMoQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFZweERlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0VnB4RGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0VnB4RGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRWcHhGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRWcHhGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNTFiY2VlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5oCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfVlBYX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfVlBYX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworCisjaW5jbHVkZSAidnB4L3ZweF9kZWNvZGVyLmgiCisjaW5jbHVkZSAidnB4L3ZwOGR4LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdFZweERlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRWcHhEZWMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0VnB4RGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworIHByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIE1PREVfVlA4LAorICAgICAgICBNT0RFX1ZQOSwKKyAgICB9IG1Nb2RlOworCisgICAgc3RydWN0IENvbnZlcnNpb25RdWV1ZTsKKworICAgIGNsYXNzIENvbnZlcnRlclRocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgQ29udmVydGVyVGhyZWFkKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxNdXRleGVkPENvbnZlcnNpb25RdWV1ZT4+ICZxdWV1ZSk7CisgICAgICAgIH5Db252ZXJ0ZXJUaHJlYWQoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisgICAgICAgIGJvb2wgdGhyZWFkTG9vcCgpIG92ZXJyaWRlOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPE11dGV4ZWQ8Q29udmVyc2lvblF1ZXVlPj4gbVF1ZXVlOworICAgIH07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIHZweF9jb2RlY19jdHhfdCAqbUNvZGVjQ3R4OworICAgIGJvb2wgbUZyYW1lUGFyYWxsZWxNb2RlOyAgLy8gRnJhbWUgcGFyYWxsZWwgaXMgb25seSBzdXBwb3J0ZWQgYnkgVlA5IGRlY29kZXIuCisKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisKKyAgICBpbnQgbUNvcmVDb3VudDsKKyAgICBzdHJ1Y3QgQ29udmVyc2lvblF1ZXVlIHsKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6ZnVuY3Rpb248dm9pZCgpPj4gZW50cmllczsKKyAgICAgICAgQ29uZGl0aW9uIGNvbmQ7CisgICAgICAgIHNpemVfdCBudW1QZW5kaW5nezB1fTsKKyAgICB9OworICAgIHN0ZDo6c2hhcmVkX3B0cjxNdXRleGVkPENvbnZlcnNpb25RdWV1ZT4+IG1RdWV1ZTsKKyAgICBzdGQ6OnZlY3RvcjxzcDxDb252ZXJ0ZXJUaHJlYWQ+PiBtQ29udmVydGVyVGhyZWFkczsKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgc3RhdHVzX3QgZGVzdHJveURlY29kZXIoKTsKKyAgICB2b2lkIGZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+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+ICZwb29sKSB7CisgICAgKHZvaWQpcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNzU4ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmgKQEAgLTAsMCArMSw0MzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX1ZQWF9FTkNfSF9fCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9WUFhfRU5DX0hfXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8Q29kZWMyQnVmZmVyVXRpbHMuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorCisjaW5jbHVkZSAidnB4L3ZweF9lbmNvZGVyLmgiCisjaW5jbHVkZSAidnB4L3ZweF9jb2RlYy5oIgorI2luY2x1ZGUgInZweC92cHhfaW1hZ2UuaCIKKyNpbmNsdWRlICJ2cHgvdnA4Y3guaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBUT0RPOiBUaGVzZSBkZWZzIHRha2VuIGZyb20gZGVwcmVjYXRlZCBPTVhfVmlkZW9FeHQuaC4gTW92ZSB0aGVzZSBkZWZpbml0aW9ucworLy8gdG8gYSBuZXcgaGVhZGVyIGZpbGUgYW5kIGluY2x1ZGUgaXQuCisKKy8qKiBNYXhpbXVtIG51bWJlciBvZiB0ZW1wb3JhbCBsYXllcnMgKi8KKyNkZWZpbmUgTUFYVEVNUE9SQUxMQVlFUlMgMworCisvKiogdGVtcG9yYWwgbGF5ZXIgcGF0dGVybnMgKi8KK3R5cGVkZWYgZW51bSBUZW1wb3JhbFBhdHRlcm5UeXBlIHsKKyAgICBWUFhUZW1wb3JhbExheWVyUGF0dGVybk5vbmUgPSAwLAorICAgIFZQWFRlbXBvcmFsTGF5ZXJQYXR0ZXJuV2ViUlRDID0gMSwKKyAgICBWUFhUZW1wb3JhbExheWVyUGF0dGVybk1heCA9IDB4N0ZGRkZGRkYKK30gVGVtcG9yYWxQYXR0ZXJuVHlwZTsKKworLy8gQmFzZSBjbGFzcyBmb3IgYSBWUFggRW5jb2RlciBDb21wb25lbnQKKy8vCisvLyBPbmx5IGZvbGxvd2luZyBlbmNvZGVyIHNldHRpbmdzIGFyZSBhdmFpbGFibGUgKGNvZGVjIHNwZWNpZmljIHNldHRpbmdzIG1pZ2h0CisvLyBiZSBhdmFpbGFibGUgaW4gdGhlIHN1Yi1jbGFzc2VzKToKKy8vICAgIC0gdmlkZW8gcmVzb2x1dGlvbgorLy8gICAgLSB0YXJnZXQgYml0cmF0ZQorLy8gICAgLSByYXRlIGNvbnRyb2wgKGNvbnN0YW50IC8gdmFyaWFibGUpCisvLyAgICAtIGZyYW1lIHJhdGUKKy8vICAgIC0gZXJyb3IgcmVzaWxpZW5jZQorLy8gICAgLSByZWNvbnN0cnVjdGlvbiAmIGxvb3AgZmlsdGVycyAoZ19wcm9maWxlKQorLy8KKy8vIE9ubHkgZm9sbG93aW5nIGNvbG9yIGZvcm1hdHMgYXJlIHJlY29nbml6ZWQKKy8vICAgIC0gQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCCisvLyAgICAtIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQkEKKy8vCisvLyBGb2xsb3dpbmcgc2V0dGluZ3MgYXJlIG5vdCBjb25maWd1cmFibGUgYnkgdGhlIGNsaWVudAorLy8gICAgLSBlbmNvZGluZyBkZWFkbGluZSBpcyByZWFsdGltZQorLy8gICAgLSBtdWx0aXRocmVhZGVkIGVuY29kaW5nIHV0aWxpemVzIGEgbnVtYmVyIG9mIHRocmVhZHMgZXF1YWwKKy8vIHRvIG9ubGluZSBjcHUncyBhdmFpbGFibGUKKy8vICAgIC0gdGhlIGFsZ29yaXRobSBpbnRlcmZhY2UgZm9yIGVuY29kZXIgaXMgZGVjaWRlZCBieSB0aGUgc3ViLWNsYXNzIGluIHVzZQorLy8gICAgLSBmcmFjdGlvbmFsIGJpdHMgb2YgZnJhbWUgcmF0ZSBpcyBkaXNjYXJkZWQKKy8vICAgIC0gdGltZXN0YW1wcyBhcmUgaW4gbWljcm9zZWNvbmRzLCB0aGVyZWZvcmUgZW5jb2RlciB0aW1lYmFzZSBpcyBmaXhlZAorLy8gdG8gMS8xMDAwMDAwCisKK3N0cnVjdCBDMlNvZnRWcHhFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0VnB4RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlIGZpbmFsOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlIGZpbmFsOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlIGZpbmFsOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGUgZmluYWw7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlIGZpbmFsOworCisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZSBmaW5hbDsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlIGZpbmFsOworCisgcHJvdGVjdGVkOgorICAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgICB2aXJ0dWFsIH5DMlNvZnRWcHhFbmMoKTsKKworICAgICAvLyBJbml0aWFsaXplcyB2cHggZW5jb2RlciB3aXRoIGF2YWlsYWJsZSBzZXR0aW5ncy4KKyAgICAgc3RhdHVzX3QgaW5pdEVuY29kZXIoKTsKKworICAgICAvLyBQb3B1bGF0ZXMgbUNvZGVjSW50ZXJmYWNlIHdpdGggY29kZWMgc3BlY2lmaWMgc2V0dGluZ3MuCisgICAgIHZpcnR1YWwgdm9pZCBzZXRDb2RlY1NwZWNpZmljSW50ZXJmYWNlKCkgPSAwOworCisgICAgIC8vIFNldHMgY29kZWMgc3BlY2lmaWMgY29uZmlndXJhdGlvbi4KKyAgICAgdmlydHVhbCB2b2lkIHNldENvZGVjU3BlY2lmaWNDb25maWd1cmF0aW9uKCkgPSAwOworCisgICAgIC8vIFNldHMgY29kZWMgc3BlY2lmaWMgZW5jb2RlciBjb250cm9scy4KKyAgICAgdmlydHVhbCB2cHhfY29kZWNfZXJyX3Qgc2V0Q29kZWNTcGVjaWZpY0NvbnRyb2xzKCkgPSAwOworCisgICAgIC8vIEdldCBjdXJyZW50IGVuY29kZSBmbGFncy4KKyAgICAgdmlydHVhbCB2cHhfZW5jX2ZyYW1lX2ZsYWdzX3QgZ2V0RW5jb2RlRmxhZ3MoKTsKKworICAgICBlbnVtIFRlbXBvcmFsUmVmZXJlbmNlcyB7CisgICAgICAgICAvLyBGb3IgMSBsYXllciBjYXNlOiByZWZlcmVuY2UgYWxsIChsYXN0LCBnb2xkZW4sIGFuZCBhbHQgcmVmKSwgYnV0IG9ubHkKKyAgICAgICAgIC8vIHVwZGF0ZSBsYXN0LgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsbCA9IDEyLAorICAgICAgICAgLy8gRmlyc3QgYmFzZSBsYXllciBmcmFtZSBmb3IgMyB0ZW1wb3JhbCBsYXllcnMsIHdoaWNoIHVwZGF0ZXMgbGFzdCBhbmQKKyAgICAgICAgIC8vIGdvbGRlbiB3aXRoIGFsdCByZWYgZGVwZW5kZW5jeS4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUxhc3RBbmRHb2xkZW5SZWZBbHRSZWYgPSAxMSwKKyAgICAgICAgIC8vIEZpcnN0IGVuaGFuY2VtZW50IGxheWVyIHdpdGggYWx0IHJlZiBkZXBlbmRlbmN5LgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlR29sZGVuUmVmQWx0UmVmID0gMTAsCisgICAgICAgICAvLyBGaXJzdCBlbmhhbmNlbWVudCBsYXllciB3aXRoIGFsdCByZWYgZGVwZW5kZW5jeS4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbldpdGhvdXREZXBlbmRlbmN5UmVmQWx0UmVmID0gOSwKKyAgICAgICAgIC8vIEJhc2UgbGF5ZXIgd2l0aCBhbHQgcmVmIGRlcGVuZGVuY3kuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWx0UmVmID0gOCwKKyAgICAgICAgIC8vIEhpZ2hlc3QgZW5oYWNlbWVudCBsYXllciB3aXRob3V0IGRlcGVuZGVuY3kgb24gZ29sZGVuIHdpdGggYWx0IHJlZgorICAgICAgICAgLy8gZGVwZW5kZW5jeS4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkdvbGRlblJlZkFsdFJlZiA9IDcsCisgICAgICAgICAvLyBTZWNvbmQgbGF5ZXIgYW5kIGxhc3QgZnJhbWUgaW4gY3ljbGUsIGZvciAyIGxheWVycy4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkFsdHJlZiA9IDYsCisgICAgICAgICAvLyBIaWdoZXN0IGVuaGFuY2VtZW50IGxheWVyLgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlTm9uZSA9IDUsCisgICAgICAgICAvLyBTZWNvbmQgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVBbHRyZWYgPSA0LAorICAgICAgICAgLy8gU2Vjb25kIGVuaGFuY2VtZW50IGxheWVyIHdpdGhvdXQgZGVwZW5kZW5jeSBvbiBwcmV2aW91cyBmcmFtZXMgaW4KKyAgICAgICAgIC8vIHRoZSBzZWNvbmQgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVBbHRyZWZXaXRob3V0RGVwZW5kZW5jeSA9IDMsCisgICAgICAgICAvLyBGaXJzdCBlbmhhbmNlbWVudCBsYXllci4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbiA9IDIsCisgICAgICAgICAvLyBGaXJzdCBlbmhhbmNlbWVudCBsYXllciB3aXRob3V0IGRlcGVuZGVuY3kgb24gcHJldmlvdXMgZnJhbWVzIGluCisgICAgICAgICAvLyB0aGUgZmlyc3QgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeSA9IDEsCisgICAgICAgICAvLyBCYXNlIGxheWVyLgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlTGFzdCA9IDAsCisgICAgIH07CisgICAgIGVudW0geworICAgICAgICAga01heFRlbXBvcmFsUGF0dGVybiA9IDgKKyAgICAgfTsKKworICAgICAvLyB2cHggc3BlY2lmaWMgb3BhcXVlIGRhdGEgc3RydWN0dXJlIHRoYXQKKyAgICAgLy8gc3RvcmVzIGVuY29kZXIgc3RhdGUKKyAgICAgdnB4X2NvZGVjX2N0eF90KiBtQ29kZWNDb250ZXh0OworCisgICAgIC8vIHZweCBzcGVjaWZpYyBkYXRhIHN0cnVjdHVyZSB0aGF0CisgICAgIC8vIHN0b3JlcyBlbmNvZGVyIGNvbmZpZ3VyYXRpb24KKyAgICAgdnB4X2NvZGVjX2VuY19jZmdfdCogbUNvZGVjQ29uZmlndXJhdGlvbjsKKworICAgICAvLyB2cHggc3BlY2lmaWMgcmVhZC1vbmx5IGRhdGEgc3RydWN0dXJlCisgICAgIC8vIHRoYXQgc3BlY2lmaWVzIGFsZ29yaXRobSBpbnRlcmZhY2UgKGUuZy4gdnA4KQorICAgICB2cHhfY29kZWNfaWZhY2VfdCogbUNvZGVjSW50ZXJmYWNlOworCisgICAgIC8vIGFsaWduIHN0cmlkZSB0byB0aGUgcG93ZXIgb2YgMgorICAgICBpbnQzMl90IG1TdHJpZGVBbGlnbjsKKworICAgICAvLyBDb2xvciBmb3JtYXQgZm9yIHRoZSBpbnB1dCBwb3J0CisgICAgIHZweF9pbWdfZm10X3QgbUNvbG9yRm9ybWF0OworCisgICAgIC8vIEJpdHJhdGUgY29udHJvbCBtb2RlLCBlaXRoZXIgY29uc3RhbnQgb3IgdmFyaWFibGUKKyAgICAgdnB4X3JjX21vZGUgbUJpdHJhdGVDb250cm9sTW9kZTsKKworICAgICAvLyBQYXJhbWV0ZXIgdGhhdCBkZW5vdGVzIHdoZXRoZXIgZXJyb3IgcmVzaWxpZW5jZQorICAgICAvLyBpcyBlbmFibGVkIGluIGVuY29kZXIKKyAgICAgYm9vbCBtRXJyb3JSZXNpbGllbmNlOworCisgICAgIC8vIE1pbmltdW0gKGJlc3QgcXVhbGl0eSkgcXVhbnRpemVyCisgICAgIHVpbnQzMl90IG1NaW5RdWFudGl6ZXI7CisKKyAgICAgLy8gTWF4aW11bSAod29yc3QgcXVhbGl0eSkgcXVhbnRpemVyCisgICAgIHVpbnQzMl90IG1NYXhRdWFudGl6ZXI7CisKKyAgICAgLy8gTnVtYmVyIG9mIGNvZGluZyB0ZW1wb3JhbCBsYXllcnMgdG8gYmUgdXNlZC4KKyAgICAgc2l6ZV90IG1UZW1wb3JhbExheWVyczsKKworICAgICAvLyBUZW1wb3JhbCBsYXllciBiaXRyYXJlIHJhdGlvIGluIHBlcmNlbnRhZ2UKKyAgICAgdWludDMyX3QgbVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW9bTUFYVEVNUE9SQUxMQVlFUlNdOworCisgICAgIC8vIFRlbXBvcmFsIHBhdHRlcm4gdHlwZQorICAgICBUZW1wb3JhbFBhdHRlcm5UeXBlIG1UZW1wb3JhbFBhdHRlcm5UeXBlOworCisgICAgIC8vIFRlbXBvcmFsIHBhdHRlcm4gbGVuZ3RoCisgICAgIHNpemVfdCBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoOworCisgICAgIC8vIFRlbXBvcmFsIHBhdHRlcm4gY3VycmVudCBpbmRleAorICAgICBzaXplX3QgbVRlbXBvcmFsUGF0dGVybklkeDsKKworICAgICAvLyBGcmFtZSB0eXBlIHRlbXBvcmFsIHBhdHRlcm4KKyAgICAgVGVtcG9yYWxSZWZlcmVuY2VzIG1UZW1wb3JhbFBhdHRlcm5ba01heFRlbXBvcmFsUGF0dGVybl07CisKKyAgICAgLy8gTGFzdCBpbnB1dCBidWZmZXIgdGltZXN0YW1wCisgICAgIHVpbnQ2NF90IG1MYXN0VGltZXN0YW1wOworCisgICAgIC8vIE51bWJlciBvZiBpbnB1dCBmcmFtZXMKKyAgICAgaW50NjRfdCBtTnVtSW5wdXRGcmFtZXM7CisKKyAgICAgLy8gQ29udmVyc2lvbiBidWZmZXIgaXMgbmVlZGVkIHRvIGlucHV0IHRvCisgICAgIC8vIHl1djQyMCBwbGFuYXIgZm9ybWF0LgorICAgICBNZW1vcnlCbG9jayBtQ29udmVyc2lvbkJ1ZmZlcjsKKworICAgICAvLyBTaWduYWxsZWQgRU9TCisgICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKworICAgICAvLyBTaWduYWxsZWQgRXJyb3IKKyAgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisKKyAgICAvLyBjb25maWd1cmF0aW9ucyB1c2VkIGJ5IGNvbXBvbmVudCBpbiBwcm9jZXNzCisgICAgLy8gKFRPRE86IGtlZXAgdGhpcyBpbiBpbnRmIGJ1dCBtYWtlIHRoZW0gaW50ZXJuYWwgb25seSkKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dD4gbUludHJhUmVmcmVzaDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IG1GcmFtZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZU1vZGVUdW5pbmc6Om91dHB1dD4gbUJpdHJhdGVNb2RlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gbVJlcXVlc3RTeW5jOworCisgICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdFZweEVuYyk7Cit9OworCituYW1lc3BhY2UgeworCisjaWZkZWYgVlA5Citjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQudnA5LmVuY29kZXIiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU8gPSBNRURJQV9NSU1FVFlQRV9WSURFT19WUDk7CisjZWxzZQorY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLnZwOC5lbmNvZGVyIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPID0gTUVESUFfTUlNRVRZUEVfVklERU9fVlA4OworI2VuZGlmCisKK30gLy8gbmFtZXBzYWNlCisKK2NsYXNzIEMyU29mdFZweEVuYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fVklERU8sCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU8pIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOyAvLyBUT0RPOiBhY2NvdW50IGZvciBvdXIgYnVmZmVycyBoZXJlCisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKAorICAgICAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6QVRUUklCX0lTX1RFTVBPUkFMKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Vc2FnZSwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX1VTQUdFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgKHVpbnQ2NF90KUMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZU1vZGUsIEMyX1BBUkFNS0VZX0JJVFJBVEVfTU9ERSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZU1vZGVUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbmZpZzo6QklUUkFURV9DT05TVCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUJpdHJhdGVNb2RlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkJJVFJBVEVfQ09OU1QsIEMyQ29uZmlnOjpCSVRSQVRFX1ZBUklBQkxFIH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZU1vZGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtRnJhbWVSYXRlLCBDMl9QQVJBTUtFWV9GUkFNRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDMwLikpCisgICAgICAgICAgICAgICAgLy8gVE9ETzogTW9yZSByZXN0cmljdGlvbj8KKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1GcmFtZVJhdGUsIHZhbHVlKS5ncmVhdGVyVGhhbigwLil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgICAgICBTZXR0ZXI8ZGVjbHR5cGUoKm1GcmFtZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtTGF5ZXJpbmcsIEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dDo6QWxsb2NTaGFyZWQoMHUsIDAsIDAsIDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1MYXllcmluZywgbS5sYXllckNvdW50KS5pblJhbmdlKDAsIDQpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUxheWVyaW5nLCBtLmJMYXllckNvdW50KS5pblJhbmdlKDAsIDApLAorICAgICAgICAgICAgICAgICAgICBDMkYobUxheWVyaW5nLCBtLmJpdHJhdGVSYXRpb3MpLmluUmFuZ2UoMC4sIDEuKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoTGF5ZXJpbmdTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU3luY0ZyYW1lUGVyaW9kLCBDMl9QQVJBTUtFWV9TWU5DX0ZSQU1FX0lOVEVSVkFMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TeW5jRnJhbWVJbnRlcnZhbFR1bmluZzo6b3V0cHV0KDB1LCAxMDAwMDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TeW5jRnJhbWVQZXJpb2QsIHZhbHVlKS5hbnkoKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptU3luY0ZyYW1lUGVyaW9kKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg0MDk2LCA0MDAwMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKEJpdHJhdGVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW50cmFSZWZyZXNoLCBDMl9QQVJBTUtFWV9JTlRSQV9SRUZSRVNIKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0RJU0FCTEVELCAwLikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAwdSwgUFJPRklMRV9WUDlfMCwgTEVWRUxfVlA5XzRfMSkpCisgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5lcXVhbFRvKAorICAgICAgICAgICAgICAgIFBST0ZJTEVfVlA5XzAKKyAgICAgICAgICAgICksCisgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLmVxdWFsVG8oCisgICAgICAgICAgICAgICAgTEVWRUxfVlA5XzRfMSksCisgICAgICAgIH0pCisgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlcikKKyAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUmVxdWVzdFN5bmMsIEMyX1BBUkFNS0VZX1JFUVVFU1RfU1lOQ19GUkFNRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0KDB1LCBDMl9GQUxTRSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtUmVxdWVzdFN5bmMsIHZhbHVlKS5vbmVPZih7IEMyX0ZBTFNFLCBDMl9UUlVFIH0pIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptUmVxdWVzdFN5bmMpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEJpdHJhdGVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAobWUudi52YWx1ZSA8PSA0MDk2KSB7CisgICAgICAgICAgICBtZS5zZXQoKS52YWx1ZSA9IDQwOTY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmICghbWUuRihtZS52LnByb2ZpbGUpLnN1cHBvcnRzQXRBbGwobWUudi5wcm9maWxlKSkgeworICAgICAgICAgICAgbWUuc2V0KCkucHJvZmlsZSA9IFBST0ZJTEVfVlA5XzA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYubGV2ZWwpLnN1cHBvcnRzQXRBbGwobWUudi5sZXZlbCkpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLmxldmVsID0gTEVWRUxfVlA5XzRfMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTGF5ZXJpbmdTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0PiYgbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmIChtZS52Lm0ubGF5ZXJDb3VudCA+IDQpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLm0ubGF5ZXJDb3VudCA9IDQ7CisgICAgICAgIH0KKyAgICAgICAgbWUuc2V0KCkubS5iTGF5ZXJDb3VudCA9IDA7CisgICAgICAgIC8vIGVuc3VyZSByYXRpb3MgYXJlIG1vbm90b25pYyBhbmQgY2xhbXBlZCBiZXR3ZWVuIDAgYW5kIDEKKyAgICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IG1lLnYuZmxleENvdW50KCk7ICsraXgpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLm0uYml0cmF0ZVJhdGlvc1tpeF0gPSBjMl9jbGFtcCgKKyAgICAgICAgICAgICAgICBpeCA+IDAgPyBtZS52Lm0uYml0cmF0ZVJhdGlvc1tpeCAtIDFdIDogMCwgbWUudi5tLmJpdHJhdGVSYXRpb3NbaXhdLCAxLik7CisgICAgICAgIH0KKyAgICAgICAgQUxPR0koInNldHRpbmcgdGVtcG9yYWwgbGF5ZXJpbmcgJXUgKyAldSIsIG1lLnYubS5sYXllckNvdW50LCBtZS52Lm0uYkxheWVyQ291bnQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8vIHVuc2FmZSBnZXR0ZXJzCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gZ2V0U2l6ZV9sKCkgY29uc3QgeyByZXR1cm4gbVNpemU7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dD4gZ2V0SW50cmFSZWZyZXNoX2woKSBjb25zdCB7IHJldHVybiBtSW50cmFSZWZyZXNoOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBnZXRGcmFtZVJhdGVfbCgpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZVJhdGU7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBnZXRCaXRyYXRlX2woKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVNb2RlVHVuaW5nOjpvdXRwdXQ+IGdldEJpdHJhdGVNb2RlX2woKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZU1vZGU7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+IGdldFJlcXVlc3RTeW5jX2woKSBjb25zdCB7IHJldHVybiBtUmVxdWVzdFN5bmM7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ+IGdldFRlbXBvcmFsTGF5ZXJzX2woKSBjb25zdCB7IHJldHVybiBtTGF5ZXJpbmc7IH0KKyAgICB1aW50MzJfdCBnZXRTeW5jRnJhbWVQZXJpb2QoKSBjb25zdCB7CisgICAgICAgIGlmIChtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSA8IDAgfHwgbVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgPT0gSU5UNjRfTUFYKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBkb3VibGUgcGVyaW9kID0gbVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgLyAxZTYgKiBtRnJhbWVSYXRlLT52YWx1ZTsKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCljMl9tYXgoYzJfbWluKHBlcmlvZCArIDAuNSwgZG91YmxlKFVJTlQzMl9NQVgpKSwgMS4pOworICAgIH0KKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQ+IG1Vc2FnZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IG1GcmFtZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0PiBtTGF5ZXJpbmc7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSW50cmFSZWZyZXNoVHVuaW5nOjpvdXRwdXQ+IG1JbnRyYVJlZnJlc2g7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PiBtUmVxdWVzdFN5bmM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc6Om91dHB1dD4gbVN5bmNGcmFtZVBlcmlvZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlTW9kZVR1bmluZzo6b3V0cHV0PiBtQml0cmF0ZU1vZGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiBtUHJvZmlsZUxldmVsOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfVlBYX0VOQ19IX18KZGlmZiAtLWdpdCBhL21lZGlhL2NvbW1vbl90aW1lL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2NvbW1vbl90aW1lL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKY29weSB0byBtZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L05PVElDRSBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9OT1RJQ0UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFlZDU4YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9OT1RJQ0UKQEAgLTAsMCArMSwxOTAgQEAKKworICAgQ29weXJpZ2h0IChjKSAyMDA1LTIwMTMsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisKKyAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0CisgICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCisKKyAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgorCisgICAxLiBEZWZpbml0aW9ucy4KKworICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKKyAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgorCisgICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQorICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCisgICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCisgICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAorICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCisgICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgorICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCisgICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgorCisgICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5CisgICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgorCisgICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKKyAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KKyAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCisKKyAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCisgICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0CisgICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCisgICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCisKKyAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCisgICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCisgICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKKyAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCisKKyAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKKyAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKKyAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKKyAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCisgICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KKyAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKKyAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCisKKyAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCisgICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCisgICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKKyAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKKyAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgorICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCisgICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50CisgICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bworICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKKyAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCisgICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKKyAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCisgICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKKworICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAorICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCisKKyAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAorICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCisgICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgorCisgICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKKyAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKKyAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCisgICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKKyAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAorICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCisgICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCisgICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQorICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKKyAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKKyAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0CisgICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCisgICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKKyAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAorICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKKyAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgorICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCisKKyAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKKyAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKKworICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCisgICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAorICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCisgICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgorICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKKworICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCisgICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAorICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAorICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAorICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQorICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCisgICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgorICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAorICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKKyAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKKyAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCisgICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KKyAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQorICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAorICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAorICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KKworICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCisgICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCisgICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCisgICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKKyAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAorICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KKworICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAorICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCisgICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCisgICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5CisgICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAorICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgorCisgICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCisgICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCisgICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKKyAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgorCisgICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKKyAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKKyAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCisgICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucworICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQorICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCisgICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKKyAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KKworICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCisgICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKKyAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5CisgICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQorICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAorICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCisgICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCisgICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCisgICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAorICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgorICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgorCisgICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCisgICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAorICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKKyAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCisgICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQorICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKKyAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKKyAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQorICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgorICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCisKKyAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc5NWNjMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3hhYWMvQW5kcm9pZC5icApAQCAtMCwwICsxLDExIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3hhYWNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdFhhYWNEZWMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJ4YWFjZGVjIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0MyU29mdFhhYWNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9DMlNvZnRYYWFjRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2ViYWRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9DMlNvZnRYYWFjRGVjLmNwcApAQCAtMCwwICsxLDE1OTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdFhhYWNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0WGFhY0RlYy5oIgorCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwgLTE2LjAgICAvKiA2NCotMC4yNWRCID0gLTE2IGRCIGJlbG93IGZ1bGwgc2NhbGUgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUICAgMS4wICAvKiBtYXhpbXVtIGNvbXByZXNzaW9uIG9mIGR5bmFtaWMgcmFuZ2UgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQk9PU1QgMS4wIC8qIG1heGltdW0gY29tcHJlc3Npb24gb2YgZHluYW1pYyByYW5nZSBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19IRUFWWSBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZICAgLyogc3dpdGNoIGZvciBoZWF2eSBjb21wcmVzc2lvbiBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19FRkZFQ1QgMyAgLyogTVBFRy1EIERSQyBlZmZlY3QgdHlwZTsgMyA9PiBMaW1pdGVkIHBsYXliYWNrIHJhbmdlICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9FTkNfTEVWRUwgKDAuMjUpIC8qIGVuY29kZXIgdGFyZ2V0IGxldmVsOyAtMSA9PiB0aGUgdmFsdWUgaXMgdW5rbm93biwgb3RoZXJ3aXNlIGRCIHN0ZXAgdmFsdWUgKGUuZy4gNjQgZm9yIC0xNiBkQikgKi8KKyNkZWZpbmUgTUFYX0NIQU5ORUxfQ09VTlQgICAgICAgICAgICA4ICAvKiBtYXhpbXVtIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyB0aGF0IGNhbiBiZSBkZWNvZGVkICovCisvLyBuYW1lcyBvZiBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgRFJDIHNldHRpbmdzCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX1JFRl9MRVZFTCAgImFhY19kcmNfcmVmZXJlbmNlX2xldmVsIgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9DVVQgICAgICAgICJhYWNfZHJjX2N1dCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfQk9PU1QgICAgICAiYWFjX2RyY19ib29zdCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfSEVBVlkgICAgICAiYWFjX2RyY19oZWF2eSIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfRU5DX0xFVkVMICAiYWFjX2RyY19lbmNfdGFyZ2V0X2xldmVsIgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9FRkZFQ1RfVFlQRSAicm8uYWFjX2RyY19lZmZlY3RfdHlwZSIKKworI2RlZmluZSBSRVRVUk5fSUZfRkFUQUwocmV0dmFsLCBzdHIpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHJldHZhbCAmIElBX0ZBVEFMX0VSUk9SKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0UoIkVycm9yIGluICVzOiBSZXR1cm5lZDogJWQiLCBzdHIsIHJldHZhbCk7ICAgXAorICAgICAgICByZXR1cm4gcmV0dmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIGlmIChyZXR2YWwgIT0gSUFfTk9fRVJST1IpIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR1coIldhcm5pbmcgaW4gJXM6IFJldHVybmVkOiAlZCIsIHN0ciwgcmV0dmFsKTsgXAorICAgIH0KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC54YWFjLmRlY29kZXIiOworCit9ICAvLyBuYW1lc3BhY2UKKworY2xhc3MgQzJTb2Z0WGFhY0RlYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fQVVESU8sCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKAorICAgICAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6QVRUUklCX0lTX1RFTVBPUkFMKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgNDQxMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgIDczNTAsIDgwMDAsIDExMDI1LCAxMjAwMCwgMTYwMDAsIDIyMDUwLCAyNDAwMCwgMzIwMDAsIDQ0MTAwLCA0ODAwMAorICAgICAgICAgICAgICAgIH0pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5pblJhbmdlKDEsIDgpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dCgwdSwgNjQwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDgwMDAsIDk2MDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDgxOTIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUFhY0Zvcm1hdCwgQzJfUEFSQU1LRVlfQUFDX1BBQ0tBR0lORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQWFjRm9ybWF0SW5mbzo6aW5wdXQoMHUsIEMyQ29uZmlnOjpBQUNfUEFDS0FHSU5HX1JBVykpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQWFjRm9ybWF0LCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6QUFDX1BBQ0tBR0lOR19SQVcsIEMyQ29uZmlnOjpBQUNfUEFDS0FHSU5HX0FEVFMKKyAgICAgICAgICAgICAgICB9KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQWFjRm9ybWF0KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xDLCBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19IRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEVfUFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FTEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX1hIRX0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVU5VU0VECisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjQ29tcHJlc3NNb2RlLCBDMl9QQVJBTUtFWV9EUkNfQ09NUFJFU1NJT05fTU9ERSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjQ29tcHJlc3Npb25Nb2RlVHVuaW5nOjppbnB1dCgwdSwgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9IRUFWWSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobURyY0NvbXByZXNzTW9kZSwgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX09ETV9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0xJR0hULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fSEVBVll9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjQ29tcHJlc3NNb2RlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNUYXJnZXRSZWZMZXZlbCwgQzJfUEFSQU1LRVlfRFJDX1RBUkdFVF9SRUZFUkVOQ0VfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY1RhcmdldFJlZmVyZW5jZUxldmVsVHVuaW5nOjppbnB1dCgwdSwgRFJDX0RFRkFVTFRfTU9CSUxFX1JFRl9MRVZFTCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRHJjVGFyZ2V0UmVmTGV2ZWwsIHZhbHVlKS5pblJhbmdlKC0zMS43NSwgMC4yNSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbURyY1RhcmdldFJlZkxldmVsKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNFbmNUYXJnZXRMZXZlbCwgQzJfUEFSQU1LRVlfRFJDX0VOQ09ERURfVEFSR0VUX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNFbmNvZGVkVGFyZ2V0TGV2ZWxUdW5pbmc6OmlucHV0KDB1LCBEUkNfREVGQVVMVF9NT0JJTEVfRU5DX0xFVkVMKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1EcmNFbmNUYXJnZXRMZXZlbCwgdmFsdWUpLmluUmFuZ2UoLTMxLjc1LCAwLjI1KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjRW5jVGFyZ2V0TGV2ZWwpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY0Jvb3N0RmFjdG9yLCBDMl9QQVJBTUtFWV9EUkNfQk9PU1RfRkFDVE9SKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNCb29zdEZhY3RvclR1bmluZzo6aW5wdXQoMHUsIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQk9PU1QpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobURyY0Jvb3N0RmFjdG9yLCB2YWx1ZSkuaW5SYW5nZSgwLCAxLil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbURyY0Jvb3N0RmFjdG9yKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNBdHRlbnVhdGlvbkZhY3RvciwgQzJfUEFSQU1LRVlfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUikKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjQXR0ZW51YXRpb25GYWN0b3JUdW5pbmc6OmlucHV0KDB1LCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0NVVCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRHJjQXR0ZW51YXRpb25GYWN0b3IsIHZhbHVlKS5pblJhbmdlKDAsIDEuKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjQXR0ZW51YXRpb25GYWN0b3IpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY0VmZmVjdFR5cGUsIEMyX1BBUkFNS0VZX0RSQ19FRkZFQ1RfVFlQRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjRWZmZWN0VHlwZVR1bmluZzo6aW5wdXQoMHUsIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0xJTUlURURfUExBWUJBQ0tfUkFOR0UpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EcmNFZmZlY3RUeXBlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX09ETV9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX09GRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0xBVEVfTklHSFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfTk9JU1lfRU5WSVJPTk1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfTElNSVRFRF9QTEFZQkFDS19SQU5HRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9MT1dfUExBWUJBQ0tfTEVWRUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfRElBTE9HX0VOSEFOQ0VNRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0dFTkVSQUxfQ09NUFJFU1NJT059KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjRWZmZWN0VHlwZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIGJvb2wgaXNBZHRzKCkgY29uc3QgeyByZXR1cm4gbUFhY0Zvcm1hdC0+dmFsdWUgPT0gQzJDb25maWc6OkFBQ19QQUNLQUdJTkdfQURUUzsgfQorICAgIHVpbnQzMl90IGdldEJpdHJhdGUoKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZS0+dmFsdWU7IH0KKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorICAgIGludDMyX3QgZ2V0RHJjQ29tcHJlc3NNb2RlKCkgY29uc3QgeyByZXR1cm4gbURyY0NvbXByZXNzTW9kZS0+dmFsdWUgPT0gQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9IRUFWWSA/IDEgOiAwOyB9CisgICAgaW50MzJfdCBnZXREcmNUYXJnZXRSZWZMZXZlbCgpIGNvbnN0IHsgcmV0dXJuIChtRHJjVGFyZ2V0UmVmTGV2ZWwtPnZhbHVlIDw9IDAgPyAtbURyY1RhcmdldFJlZkxldmVsLT52YWx1ZSAqIDQuICsgMC41IDogLTEpOyB9CisgICAgaW50MzJfdCBnZXREcmNFbmNUYXJnZXRMZXZlbCgpIGNvbnN0IHsgcmV0dXJuIChtRHJjRW5jVGFyZ2V0TGV2ZWwtPnZhbHVlIDw9IDAgPyAtbURyY0VuY1RhcmdldExldmVsLT52YWx1ZSAqIDQuICsgMC41IDogLTEpOyB9CisgICAgaW50MzJfdCBnZXREcmNCb29zdEZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIG1EcmNCb29zdEZhY3Rvci0+dmFsdWUgKiAxMjcuICsgMC41OyB9CisgICAgaW50MzJfdCBnZXREcmNBdHRlbnVhdGlvbkZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIG1EcmNBdHRlbnVhdGlvbkZhY3Rvci0+dmFsdWUgKiAxMjcuICsgMC41OyB9CisgICAgaW50MzJfdCBnZXREcmNFZmZlY3RUeXBlKCkgY29uc3QgeyByZXR1cm4gbURyY0VmZmVjdFR5cGUtPnZhbHVlOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUFhY0Zvcm1hdEluZm86OmlucHV0PiBtQWFjRm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbURyY0NvbXByZXNzaW9uTW9kZVR1bmluZzo6aW5wdXQ+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+QzJDb21wb25lbnRTdG9yZSgpID0gZGVmYXVsdDsKK307CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLy8gQH0KKworI2VuZGlmICAvLyBDMkNPTVBPTkVOVF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkNvbmZpZy5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4MjBmOTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQ29uZmlnLmgKQEAgLTAsMCArMSwyMTQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMkNPTkZJR19IXworI2RlZmluZSBDMkNPTkZJR19IXworCisjaW5jbHVkZSA8QzIuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyRW51bS5oPgorI2luY2x1ZGUgPEMyUGFyYW1EZWYuaD4KKworLy8vIFxkZWZncm91cCBjb25maWcgQ29tcG9uZW50IGNvbmZpZ3VyYXRpb24KKy8vLyBAeworCisvKioKKyAqIEVudW1lcmF0ZWQgYm9vbGVhbi4KKyAqLworQzJFTlVNKGMyX2Jvb2xfdCwgdWludDMyX3QsCisgICAgQzJfRkFMU0UsIC8vLzwgdHJ1ZQorICAgIEMyX1RSVUUsICAvLy88IGZhbHNlCispCisKK3R5cGVkZWYgQzJTaW1wbGVWYWx1ZVN0cnVjdDxjMl9ib29sX3Q+IEMyQm9vbFZhbHVlOworCit0eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJFYXN5RW51bTxjMl9ib29sX3Q+PiBDMkVhc3lCb29sVmFsdWU7CisKKy8qKgorICogRW51bWVyYXRlZCBzZXQgdHJpLXN0YXRlLgorICoKKyAqIFVzZWQgZm9yIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb25zIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gdmFsdWVzIHNldCBieSB0aGUgY2xpZW50LAorICogZGVmYXVsdCB2YWx1ZXMgc2V0IGJ5IHRoZSBjb21wb25lbnQsIG9yIHVuc2V0IHZhbHVlcy4KKyAqLworQzJFTlVNKGMyX3NldF90LCB1aW50MzJfdCwKKyAgICBDMl9VTlNFVCwgICAvLyBwYXJhbWV0ZXIgaXMgdW5zZXQgYW5kIGhhcyBubyB2YWx1ZQorICAgIEMyX1NFVCwgICAgIC8vIHBhcmFtZXRlciBpcy9oYXMgYmVlbiBzZXQgYnkgdGhlIGNsaWVudAorICAgIEMyX0RFRkFVTFQsIC8vIHBhcmFtZXRlciBoYXMgbm90IGJlZW4gc2V0IGJ5IHRoZSBjbGllbnQsIGJ1dCBpcyBzZXQgYnkgdGhlIGNvbXBvbmVudAorKQorCisvKiogRW51bWVyYXRpb25zIHVzZWQgYnkgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzICovCitzdHJ1Y3QgQzJDb25maWcgeworICAgIGVudW0gYWFjX3BhY2thZ2luZ190IDogdWludDMyX3Q7ICAgICAgICAvLy88IEFBQyBwYWNrYWdpbmcgKFJBVyB2cyBBRFRTKQorICAgIGVudW0gYWFjX3Nicl9tb2RlX3QgOiB1aW50MzJfdDsgICAgICAgICAvLy88IEFBQyBTQlIgbW9kZQorICAgIGVudW0gYXBpX2ZlYXR1cmVfdCA6IHVpbnQ2NF90OyAgICAgICAgICAvLy88IEFQSSBmZWF0dXJlcworICAgIGVudW0gYXBpX2xldmVsX3QgOiB1aW50MzJfdDsgICAgICAgICAgICAvLy88IEFQSSBsZXZlbAorICAgIGVudW0gYml0cmF0ZV9tb2RlX3QgOiB1aW50MzJfdDsgICAgICAgICAvLy88IGJpdHJhdGUgY29udHJvbCBtb2RlCisgICAgZW51bSBkcmNfY29tcHJlc3Npb25fbW9kZV90IDogaW50MzJfdDsgIC8vLzwgRFJDIGNvbXByZXNzaW9uIG1vZGUKKyAgICBlbnVtIGRyY19lZmZlY3RfdHlwZV90IDogaW50MzJfdDsgICAgICAgLy8vPCBEUkMgZWZmZWN0IHR5cGUKKyAgICBlbnVtIGludHJhX3JlZnJlc2hfbW9kZV90IDogdWludDMyX3Q7ICAgLy8vPCBpbnRyYSByZWZyZXNoIG1vZGVzCisgICAgZW51bSBsZXZlbF90IDogdWludDMyX3Q7ICAgICAgICAgICAgICAgIC8vLzwgY29kaW5nIGxldmVsCisgICAgZW51bSBvcmRpbmFsX2tleV90IDogdWludDMyX3Q7ICAgICAgICAgIC8vLzwgd29yayBvcmRlcmluZyBrZXlzCisgICAgZW51bSBwY21fZW5jb2RpbmdfdCA6IHVpbnQzMl90OyAgICAgICAgIC8vLzwgUENNIGVuY29kaW5nCisgICAgZW51bSBwaWN0dXJlX3R5cGVfdCA6IHVpbnQzMl90OyAgICAgICAgIC8vLzwgcGljdHVyZSB0eXBlcworICAgIGVudW0gcGxhdGZvcm1fZmVhdHVyZV90IDogdWludDY0X3Q7ICAgICAvLy88IHBsYXRmb3JtIGZlYXR1cmVzCisgICAgZW51bSBwbGF0Zm9ybV9sZXZlbF90IDogdWludDMyX3Q7ICAgICAgIC8vLzwgcGxhdGZvcm0gbGV2ZWwKKyAgICBlbnVtIHByZXBlbmRfaGVhZGVyX21vZGVfdCA6IHVpbnQzMl90OyAgLy8vPCBwcmVwZW5kIGhlYWRlciBvcGVyYXRpb25hbCBtb2RlcworICAgIGVudW0gcHJvZmlsZV90IDogdWludDMyX3Q7ICAgICAgICAgICAgICAvLy88IGNvZGluZyBwcm9maWxlCisgICAgZW51bSBzY2FsaW5nX21ldGhvZF90IDogdWludDMyX3Q7ICAgICAgIC8vLzwgc2NhbGluZyBtZXRob2RzCisgICAgZW51bSBzY2FuX29yZGVyX3QgOiB1aW50MzJfdDsgICAgICAgICAgIC8vLzwgc2NhbiBvcmRlcnMKKyAgICBlbnVtIHNlY3VyZV9tb2RlX3QgOiB1aW50MzJfdDsgICAgICAgICAgLy8vPCBzZWN1cmUvcHJvdGVjdGVkIG1vZGVzCisgICAgZW51bSBzdXBwbGVtZW50YWxfaW5mb190IDogdWludDMyX3Q7ICAgIC8vLzwgc3VwcGxlbWVudGFsIGluZm9ybWF0aW9uIHR5cGVzCisgICAgZW51bSB0aWxpbmdfbW9kZV90IDogdWludDMyX3Q7ICAgICAgICAgIC8vLzwgdGlsaW5nIG1vZGVzCit9OworCituYW1lc3BhY2UgeworCitlbnVtIEMyUGFyYW1JbmRleEtpbmQgOiBDMlBhcmFtOjp0eXBlX2luZGV4X3QgeworICAgIEMyX1BBUkFNX0lOREVYX0lOVkFMSUQgICAgICAgICAgICAgPSAweDAsICAgIC8vLzwgZG8gbm90IHVzZQorICAgIEMyX1BBUkFNX0lOREVYX1NUUlVDVF9TVEFSVCAgICAgICAgPSAweDEsICAgIC8vLzwgc3RydWN0IG9ubHkgaW5kaWNlcworICAgIEMyX1BBUkFNX0lOREVYX1BBUkFNX1NUQVJUICAgICAgICAgPSAweDgwMCwgIC8vLzwgcmVndWxhciBwYXJhbWV0ZXJzCisgICAgQzJfUEFSQU1fSU5ERVhfQ09ERVJfUEFSQU1fU1RBUlQgICA9IDB4MTAwMCwgLy8vPCBlbi90cmFuc2NvZGVyIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9QSUNUVVJFX1BBUkFNX1NUQVJUID0gMHgxODAwLCAvLy88IGltYWdlL3ZpZGVvIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9WSURFT19QQVJBTV9TVEFSVCAgID0gMHgyMDAwLCAvLy88IHZpZGVvIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9JTUFHRV9QQVJBTV9TVEFSVCAgID0gMHgyODAwLCAvLy88IGltYWdlIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9BVURJT19QQVJBTV9TVEFSVCAgID0gMHgzMDAwLCAvLy88IGltYWdlIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9QTEFURk9STV9TVEFSVCAgICAgID0gMHg0MDAwLCAvLy88IHBsYXRmb3JtLWRlZmluZWQgcGFyYW1ldGVycworCisgICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gc3RydWN0dXJlIGluZGljZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICAgIGtQYXJhbUluZGV4Q29sb3JYeSA9IEMyX1BBUkFNX0lOREVYX1NUUlVDVF9TVEFSVCwKKyAgICBrUGFyYW1JbmRleE1hc3RlcmluZ0Rpc3BsYXlDb2xvclZvbHVtZSwKKyAgICBrUGFyYW1JbmRleENocm9tYU9mZnNldCwKKyAgICBrUGFyYW1JbmRleEdvcExheWVyLAorCisgICAgLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gcGFyYW1ldGVyIGluZGljZXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworICAgIGtQYXJhbUluZGV4QXBpTGV2ZWwgPSBDMl9QQVJBTV9JTkRFWF9QQVJBTV9TVEFSVCwKKyAgICBrUGFyYW1JbmRleEFwaUZlYXR1cmVzLAorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGFsbCBjb21wb25lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAgLyogZ2VuZXJpYyBjb21wb25lbnQgY2hhcmFjdGVyaXN0aWNzICovCisgICAga1BhcmFtSW5kZXhOYW1lLAorICAgIGtQYXJhbUluZGV4QWxpYXNlcywKKyAgICBrUGFyYW1JbmRleEtpbmQsCisgICAga1BhcmFtSW5kZXhEb21haW4sCisgICAga1BhcmFtSW5kZXhBdHRyaWJ1dGVzLAorICAgIGtQYXJhbUluZGV4VGltZVN0cmV0Y2gsCisKKyAgICAvKiBjb2RpbmcgY2hhcmFjdGVyaXN0aWNzICovCisgICAga1BhcmFtSW5kZXhQcm9maWxlTGV2ZWwsCisgICAga1BhcmFtSW5kZXhJbml0RGF0YSwKKyAgICBrUGFyYW1JbmRleFN1cHBsZW1lbnRhbERhdGEsCisgICAga1BhcmFtSW5kZXhTdWJzY3JpYmVkU3VwcGxlbWVudGFsRGF0YSwKKworICAgIC8qIHBpcGVsaW5lIGNoYXJhY3RlcmlzdGljcyAqLworICAgIGtQYXJhbUluZGV4TWVkaWFUeXBlLAorICAgIF9fa1BhcmFtSW5kZXhSRVNFUlZFRF8wLAorICAgIGtQYXJhbUluZGV4RGVsYXksCisgICAga1BhcmFtSW5kZXhNYXhSZWZlcmVuY2VBZ2UsCisgICAga1BhcmFtSW5kZXhNYXhSZWZlcmVuY2VDb3VudCwKKyAgICBrUGFyYW1JbmRleFJlb3JkZXJCdWZmZXJEZXB0aCwKKyAgICBrUGFyYW1JbmRleFJlb3JkZXJLZXksCisgICAga1BhcmFtSW5kZXhTdHJlYW1Db3VudCwKKyAgICBrUGFyYW1JbmRleFN1YnNjcmliZWRQYXJhbUluZGljZXMsCisgICAga1BhcmFtSW5kZXhTdWdnZXN0ZWRCdWZmZXJDb3VudCwKKyAgICBrUGFyYW1JbmRleEJhdGNoU2l6ZSwKKyAgICBrUGFyYW1JbmRleEN1cnJlbnRXb3JrLAorICAgIGtQYXJhbUluZGV4TGFzdFdvcmtRdWV1ZWQsCisKKyAgICAvKiBtZW1vcnkgYWxsb2NhdGlvbiAqLworICAgIGtQYXJhbUluZGV4QWxsb2NhdG9ycywKKyAgICBrUGFyYW1JbmRleEJsb2NrUG9vbHMsCisgICAga1BhcmFtSW5kZXhCdWZmZXJUeXBlLAorICAgIGtQYXJhbUluZGV4VXNhZ2UsCisgICAga1BhcmFtSW5kZXhPdXRPZk1lbW9yeSwKKyAgICBrUGFyYW1JbmRleE1heEJ1ZmZlclNpemUsCisKKyAgICAvKiBtaXNjLiBzdGF0ZSAqLworICAgIGtQYXJhbUluZGV4VHJpcHBlZCwKKyAgICBrUGFyYW1JbmRleENvbmZpZ0NvdW50ZXIsCisKKyAgICAvKiByZXNvdXJjZXMgKi8KKyAgICBrUGFyYW1JbmRleFJlc291cmNlc05lZWRlZCwKKyAgICBrUGFyYW1JbmRleFJlc291cmNlc1Jlc2VydmVkLAorICAgIGtQYXJhbUluZGV4T3BlcmF0aW5nUmF0ZSwKKyAgICBrUGFyYW1JbmRleFJlYWxUaW1lUHJpb3JpdHksCisKKyAgICAvKiBwcm90ZWN0ZWQgY29udGVudCAqLworICAgIGtQYXJhbUluZGV4U2VjdXJlTW9kZSwKKworICAgIC8vIGRlcHJlY2F0ZWQKKyAgICBrUGFyYW1JbmRleERlbGF5UmVxdWVzdCA9IGtQYXJhbUluZGV4RGVsYXkgfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX1JFUVVFU1RfRkxBRywKKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAodHJhbnMvZW4pY29kZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAga1BhcmFtSW5kZXhCaXRyYXRlID0gQzJfUEFSQU1fSU5ERVhfQ09ERVJfUEFSQU1fU1RBUlQsCisgICAga1BhcmFtSW5kZXhCaXRyYXRlTW9kZSwKKyAgICBrUGFyYW1JbmRleFF1YWxpdHksCisgICAga1BhcmFtSW5kZXhDb21wbGV4aXR5LAorICAgIGtQYXJhbUluZGV4UHJlcGVuZEhlYWRlck1vZGUsCisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaW1hZ2UvdmlkZW8gY29tcG9uZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIGtQYXJhbUluZGV4UGljdHVyZVNpemUgPSBDMl9QQVJBTV9JTkRFWF9QSUNUVVJFX1BBUkFNX1NUQVJULAorICAgIGtQYXJhbUluZGV4Q3JvcFJlY3QsCisgICAga1BhcmFtSW5kZXhQaXhlbEZvcm1hdCwKKyAgICBrUGFyYW1JbmRleFJvdGF0aW9uLAorICAgIGtQYXJhbUluZGV4UGl4ZWxBc3BlY3RSYXRpbywKKyAgICBrUGFyYW1JbmRleFNjYWxlZFBpY3R1cmVTaXplLAorICAgIGtQYXJhbUluZGV4U2NhbGVkQ3JvcFJlY3QsCisgICAga1BhcmFtSW5kZXhTY2FsaW5nTWV0aG9kLAorICAgIGtQYXJhbUluZGV4Q29sb3JJbmZvLAorICAgIGtQYXJhbUluZGV4Q29sb3JBc3BlY3RzLAorICAgIGtQYXJhbUluZGV4SGRyU3RhdGljTWV0YWRhdGEsCisgICAga1BhcmFtSW5kZXhEZWZhdWx0Q29sb3JBc3BlY3RzLAorCisgICAga1BhcmFtSW5kZXhCbG9ja1NpemUsCisgICAga1BhcmFtSW5kZXhCbG9ja0NvdW50LAorICAgIGtQYXJhbUluZGV4QmxvY2tSYXRlLAorCisgICAga1BhcmFtSW5kZXhQaWN0dXJlVHlwZU1hc2ssCisgICAga1BhcmFtSW5kZXhQaWN0dXJlVHlwZSwKKyAgICBrUGFyYW1JbmRleEhkcjEwUGx1c01ldGFkYXRhLAorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHZpZGVvIGNvbXBvbmVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICBrUGFyYW1JbmRleEZyYW1lUmF0ZSA9IEMyX1BBUkFNX0lOREVYX1ZJREVPX1BBUkFNX1NUQVJULAorICAgIGtQYXJhbUluZGV4TWF4Qml0cmF0ZSwKKyAgICBrUGFyYW1JbmRleE1heEZyYW1lUmF0ZSwKKyAgICBrUGFyYW1JbmRleE1heFBpY3R1cmVTaXplLAorICAgIGtQYXJhbUluZGV4R29wLAorICAgIGtQYXJhbUluZGV4U3luY0ZyYW1lSW50ZXJ2YWwsCisgICAga1BhcmFtSW5kZXhSZXF1ZXN0U3luY0ZyYW1lLAorICAgIGtQYXJhbUluZGV4VGVtcG9yYWxMYXllcmluZywKKyAgICBrUGFyYW1JbmRleExheWVySW5kZXgsCisgICAga1BhcmFtSW5kZXhMYXllckNvdW50LAorICAgIGtQYXJhbUluZGV4SW50cmFSZWZyZXNoLAorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGltYWdlIGNvbXBvbmVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICBrUGFyYW1JbmRleFRpbGVMYXlvdXQgPSBDMl9QQVJBTV9JTkRFWF9JTUFHRV9QQVJBTV9TVEFSVCwKKyAgICBrUGFyYW1JbmRleFRpbGVIYW5kbGluZywKKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBhdWRpbyBjb21wb25lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAga1BhcmFtSW5kZXhTYW1wbGVSYXRlID0gQzJfUEFSQU1fSU5ERVhfQVVESU9fUEFSQU1fU1RBUlQsCisgICAga1BhcmFtSW5kZXhDaGFubmVsQ291bnQsCisgICAga1BhcmFtSW5kZXhQY21FbmNvZGluZywKKyAgICBrUGFyYW1JbmRleEFhY1BhY2thZ2luZywKKyAgICBrUGFyYW1JbmRleE1heENoYW5uZWxDb3VudCwKKyAgICBrUGFyYW1JbmRleEFhY1Nick1vZGUsIC8vIGFhYyBlbmNvZGUsIGVudW0KKyAgICBrUGFyYW1JbmRleERyY0VuY29kZWRUYXJnZXRMZXZlbCwgIC8vIGRyYywgZmxvYXQgKGRCRlMpCisgICAga1BhcmFtSW5kZXhEcmNUYXJnZXRSZWZlcmVuY2VMZXZlbCwgLy8gZHJjLCBmbG9hdCAoZEJGUykKKyAgICBrUGFyYW1JbmRleERyY0NvbXByZXNzaW9uLCAvLyBkcmMsIGVudW0KKyAgICBrUGFyYW1JbmRleERyY0Jvb3N0RmFjdG9yLCAvLyBkcmMsIGZsb2F0ICgwLTEpCisgICAga1BhcmFtSW5kZXhEcmNBdHRlbnVhdGlvbkZhY3RvciwgLy8gZHJjLCBmbG9hdCAoMC0xKQorICAgIGtQYXJhbUluZGV4RHJjRWZmZWN0VHlwZSwgLy8gZHJjLCBlbnVtCisKKyAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gcGxhdGZvcm0tZGVmaW5lZCBwYXJhbWV0ZXJzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgICAga1BhcmFtSW5kZXhQbGF0Zm9ybUxldmVsID0gQzJfUEFSQU1fSU5ERVhfUExBVEZPUk1fU1RBUlQsIC8vIGFsbCwgdTMyCisgICAga1BhcmFtSW5kZXhQbGF0Zm9ybUZlYXR1cmVzLCAvLyBhbGwsIHU2NCBtYXNrCisgICAga1BhcmFtSW5kZXhTdG9yZUlvblVzYWdlLCAvLyBzdG9yZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhBc3BlY3RzVG9EYXRhU3BhY2UsIC8vIHN0b3JlLCBzdHJ1Y3QKKyAgICBrUGFyYW1JbmRleEZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yLCAvLyBzdG9yZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvcnMsIC8vIHN0b3JlLCBzdHJ1Y3RbXQorICAgIGtQYXJhbUluZGV4RGF0YVNwYWNlVG9Bc3BlY3RzLCAvLyBzdG9yZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhEYXRhU3BhY2UsIC8vIHUzMgorICAgIGtQYXJhbUluZGV4U3VyZmFjZVNjYWxpbmcsIC8vIHUzMgorCisgICAgLy8gaW5wdXQgc3VyZmFjZQorICAgIGtQYXJhbUluZGV4SW5wdXRTdXJmYWNlRW9zLCAvLyBpbnB1dC1zdXJmYWNlLCBlb3MKKyAgICBrUGFyYW1JbmRleFRpbWVkQ29udHJvbCwgLy8gc3RydWN0CisgICAga1BhcmFtSW5kZXhTdGFydEF0LCAvLyBpbnB1dC1zdXJmYWNlLCBzdHJ1Y3QKKyAgICBrUGFyYW1JbmRleFN1c3BlbmRBdCwgLy8gaW5wdXQtc3VyZmFjZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhSZXN1bWVBdCwgLy8gaW5wdXQtc3VyZmFjZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhTdG9wQXQsIC8vIGlucHV0LXN1cmZhY2UsIHN0cnVjdAorICAgIGtQYXJhbUluZGV4VGltZU9mZnNldCwgLy8gaW5wdXQtc3VyZmFjZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhNaW5GcmFtZVJhdGUsIC8vIGlucHV0LXN1cmZhY2UsIGZsb2F0CisgICAga1BhcmFtSW5kZXhUaW1lc3RhbXBHYXBBZGp1c3RtZW50LCAvLyBpbnB1dC1zdXJmYWNlLCBzdHJ1Y3QKKworICAgIGtQYXJhbUluZGV4U3VyZmFjZUFsbG9jYXRvciwgLy8gdTMyCit9OworCit9CisKKy8qKgorICogQ29kZWMgMi4wIHBhcmFtZXRlciB0eXBlcyBmb2xsb3cgdGhlIGZvbGxvd2luZyBuYW1pbmcgY29udmVudGlvbjoKKyAqCisgKiBDMjxncm91cD48ZG9tYWluPjxpbmRleD48dHlwZT4KKyAqCisgKiBFLmcuIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOiBncm91cD0iIiBkb21haW49IlN0cmVhbSIgaW5kZXg9IlBpY3R1cmVTaXplIiB0eXBlPSJJbmZvIi4KKyAqIEdyb3VwIGlzIHNvbWV3aGF0IGFyYml0cmFyeSwgYnV0IGRlbm90ZXMga2luZCBvZiBvYmplY3RzIHRoZSBwYXJhbWV0ZXIgaXMgZGVmaW5lZC4KKyAqIEF0IHRoaXMgcG9pbnQgd2UgdXNlIENvbXBvbmVudCBhbmQgU3RvcmUgdG8gZGlzdGluZ3Vpc2ggYmFzaWMgY29tcG9uZW50L3N0b3JlIHBhcmFtZXRlcnMuCisgKgorICogUGFyYW1ldGVyIGtleXMgYXJlIG5hbWVkIEMyX1BBUkFNS0VZX1s8Z3JvdXA+X108ZG9tYWluPl88aW5kZXg+IGFzIHR5cGUgaXMgbm90IGV4cGVjdGVkCisgKiB0byBkaXN0aW5ndWlzaCBwYXJhbWV0ZXJzLiBFLmcuIGEgY29tcG9uZW50IGNvdWxkIGNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgcGFyYW1ldGVyIGFuZCBpdAorICogaXMgbm90IGV4cGVjdGVkIHVzZXJzIHdvdWxkIG5lZWQgdG8gY2hhbmdlIHRoZSBrZXkuCisgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQVBJIGxldmVsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2VudW0gQzJDb25maWc6OmFwaV9sZXZlbF90IDogdWludDMyX3QgeworICAgIEFQSV9MMF8xID0gMCwgICAvLy88IHN1cHBvcnQgZm9yIEFQSSBsZXZlbCAwLjEKK307CisKKy8vIHJlYWQtb25seQordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbmZpZzo6YXBpX2xldmVsX3Q+LCBrUGFyYW1JbmRleEFwaUxldmVsPgorICAgICAgICBDMkFwaUxldmVsU2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0FQSV9MRVZFTFtdID0gImFwaS5sZXZlbCI7CisKK2VudW0gQzJDb25maWc6OmFwaV9mZWF0dXJlX3QgOiB1aW50NjRfdCB7CisgICAgQVBJX1JFRkxFQ1RJT04gICAgICAgPSAoMVUgPDwgMCksICAvLy88IGFiaWxpdHkgdG8gbGlzdCBzdXBwb3J0ZWQgcGFyYW1ldGVycworICAgIEFQSV9WQUxVRVMgICAgICAgICAgID0gKDFVIDw8IDEpLCAgLy8vPCBhYmlsaXR5IHRvIGxpc3Qgc3VwcG9ydGVkIHZhbHVlcyBmb3IgZWFjaCBwYXJhbWV0ZXIKKyAgICBBUElfQ1VSUkVOVF9WQUxVRVMgICA9ICgxVSA8PCAyKSwgIC8vLzwgYWJpbGl0eSB0byBsaXN0IGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIGZvciBlYWNoIHBhcmFtZXRlcgorICAgIEFQSV9ERVBFTkRFTkNZICAgICAgID0gKDFVIDw8IDMpLCAgLy8vPCBoYXZlIGEgZGVmaW5lZCBwYXJhbWV0ZXIgZGVwZW5kZW5jeQorCisgICAgQVBJX1NUUkVBTVMgICAgICAgICAgPSAoMVVMTCA8PCAzMiksICAvLy88IHN1cHBvcnRpbmcgdmFyaWFibGUgbnVtYmVyIG9mIHN0cmVhbXMKKworICAgIEFQSV9UVU5ORUxJTkcgICAgICAgID0gKDFVTEwgPDwgNDgpLCAgLy8vPCB0dW5uZWxpbmcgQVBJCit9OworCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OmFwaV9mZWF0dXJlX3Q+LCBrUGFyYW1JbmRleEFwaUZlYXR1cmVzPgorICAgICAgICBDMkFwaUZlYXR1cmVzU2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0FQSV9GRUFUVVJFU1tdID0gImFwaS5mZWF0dXJlcyI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdlbmVyaWMgY29tcG9uZW50IGNoYXJhY3RlcmlzdGljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIFRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQuCisgKgorICogVGhpcyBtdXN0IGNvbnRhaW4gb25seSBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBvciBkb3QgJy4nLCBoeXBoZW4gJy0nLCBwbHVzICcrJywgb3IKKyAqIHVuZGVybGluZSAnXycuIFRoZSBuYW1lIG9mIGVhY2ggY29tcG9uZW50IG11c3QgYmUgdW5pcXVlLgorICoKKyAqIEZvciBBbmRyb2lkOiBDb21wb25lbnQgbmFtZXMgbXVzdCBzdGFydCB3aXRoICdjMi4nIGZvbGxvd2VkIGJ5IHRoZSBjb21wYW55IG5hbWUgb3IgYWJicmV2aWF0aW9uCisgKiBhbmQgYW5vdGhlciBkb3QsIGUuZy4gJ2MyLmFuZHJvaWQuJy4gVXNlIG9mIGxvd2VyY2FzZSBpcyBwcmVmZXJyZWQgYnV0IG5vdCByZXF1aXJlZC4KKyAqLworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlN0cmluZ1ZhbHVlLCBrUGFyYW1JbmRleE5hbWU+IEMyQ29tcG9uZW50TmFtZVNldHRpbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT01QT05FTlRfTkFNRVtdICA9ICJjb21wb25lbnQubmFtZSI7CisKKy8qKgorICogQWx0ZXJuYXRlIG5hbWVzIChhbGlhc2VzKSBvZiB0aGUgY29tcG9uZW50LgorICoKKyAqIFRoaXMgaXMgYSBjb21tYSAnLCcgc2VwYXJhdGVkIGxpc3Qgb2YgYWx0ZXJuYXRlIGNvbXBvbmVudCBuYW1lcy4gVW5saWtlIGNvbXBvbmVudCBuYW1lcyB0aGF0CisgKiBtdXN0IGJlIHVuaXF1ZSwgbXVsdGlwbGUgY29tcG9uZW50cyBjYW4gaGF2ZSB0aGUgc2FtZSBhbGlhcy4KKyAqLworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlN0cmluZ1ZhbHVlLCBrUGFyYW1JbmRleEFsaWFzZXM+IEMyQ29tcG9uZW50QWxpYXNlc1NldHRpbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT01QT05FTlRfQUxJQVNFU1tdICA9ICJjb21wb25lbnQuYWxpYXNlcyI7CisKKy8qKgorICogQ29tcG9uZW50IGtpbmQuCisgKi8KKy8vIHJlYWQtb25seQordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbXBvbmVudDo6a2luZF90Piwga1BhcmFtSW5kZXhLaW5kPgorICAgICAgICBDMkNvbXBvbmVudEtpbmRTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0tJTkRbXSAgPSAiY29tcG9uZW50LmtpbmQiOworCisvKioKKyAqIENvbXBvbmVudCBkb21haW4uCisgKi8KKy8vIHJlYWQtb25seQordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbXBvbmVudDo6ZG9tYWluX3Q+LCBrUGFyYW1JbmRleERvbWFpbj4KKyAgICAgICAgQzJDb21wb25lbnREb21haW5TZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0RPTUFJTltdICA9ICJjb21wb25lbnQuZG9tYWluIjsKKworLyoqCisgKiBDb21wb25lbnQgYXR0cmlidXRlcy4KKyAqCisgKiBUaGVzZSBhcmUgYSBzZXQgb2YgZmxhZ3MgcHJvdmlkZWQgYnkgdGhlIGNvbXBvbmVudCBjaGFyYWN0ZXJpemluZyBpdHMgcHJvY2Vzc2luZyBhbGdvcml0aG0uCisgKi8KK0MyRU5VTShDMkNvbXBvbmVudDo6YXR0cmliX3QsIHVpbnQ2NF90LAorICAgIEFUVFJJQl9JU19URU1QT1JBTCA9IDF1IDw8IDAsIC8vLzwgY29tcG9uZW50IGlucHV0IG9yZGVyaW5nIG1hdHRlcnMgZm9yIHByb2Nlc3NpbmcKKykKKworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29tcG9uZW50OjphdHRyaWJfdD4sIGtQYXJhbUluZGV4QXR0cmlidXRlcz4KKyAgICAgICAgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTW10gPSAiY29tcG9uZW50LmF0dHJpYnV0ZXMiOworCisvKioKKyAqIFRpbWUgc3RyZXRjaGluZy4KKyAqCisgKiBUaGlzIGlzIHRoZSByYXRpbyBiZXR3ZWVuIHRoZSByYXRlIG9mIHRoZSBpbnB1dCB0aW1lc3RhbXAsIGFuZCB0aGUgcmF0ZSBvZiB0aGUgb3V0cHV0IHRpbWVzdGFtcC4KKyAqIEUuZy4gaWYgdGhpcyBpcyA0LjAsIGZvciBldmVyeSAxIHNlY29uZHMgb2YgaW5wdXQgdGltZXN0YW1wIGRpZmZlcmVuY2UsIHRoZSBvdXRwdXQgc2hhbGwgZGlmZmVyCisgKiBieSA0IHNlY29uZHMuCisgKi8KK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleFRpbWVTdHJldGNoPiBDMkNvbXBvbmVudFRpbWVTdHJldGNoVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfVElNRV9TVFJFVENIW10gID0gImFsZ28udGltZS1zdHJldGNoIjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY29kaW5nIGNoYXJhY3RlcmlzdGljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIFByb2ZpbGUgYW5kIGxldmVsLgorICoKKyAqIFByb2ZpbGUgZGV0ZXJtaW5lcyB0aGUgdG9vbHMgdXNlZCBieSB0aGUgY29tcG9uZW50LgorICogTGV2ZWwgZGV0ZXJtaW5lcyB0aGUgbGV2ZWwgb2YgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIGNvbXBvbmVudC4KKyAqLworCituYW1lc3BhY2UgeworCitlbnVtIDogdWludDMyX3QgeworICAgIF9DMl9QTF9NUDJWX0JBU0UgPSAweDEwMDAsCisgICAgX0MyX1BMX0FBQ19CQVNFICA9IDB4MjAwMCwKKyAgICBfQzJfUExfSDI2M19CQVNFID0gMHgzMDAwLAorICAgIF9DMl9QTF9NUDRWX0JBU0UgPSAweDQwMDAsCisgICAgX0MyX1BMX0FWQ19CQVNFICA9IDB4NTAwMCwKKyAgICBfQzJfUExfSEVWQ19CQVNFID0gMHg2MDAwLAorICAgIF9DMl9QTF9WUDlfQkFTRSAgPSAweDcwMDAsCisgICAgX0MyX1BMX0RWX0JBU0UgICA9IDB4ODAwMCwKKyAgICBfQzJfUExfQVYxX0JBU0UgID0gMHg5MDAwLAorCisgICAgQzJfUFJPRklMRV9MRVZFTF9WRU5ET1JfU1RBUlQgPSAweDcwMDAwMDAwLAorfTsKKworfQorCitlbnVtIEMyQ29uZmlnOjpwcm9maWxlX3QgOiB1aW50MzJfdCB7CisgICAgUFJPRklMRV9VTlVTRUQgPSAwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHByb2ZpbGUgaXMgbm90IHVzZWQgYnkgdGhpcyBtZWRpYSB0eXBlCisKKyAgICAvLyBBQUMgKE1QRUctMiBQYXJ0IDcgYW5kIE1QRUctNCBQYXJ0IDMpIHByb2ZpbGVzCisgICAgUFJPRklMRV9BQUNfTEMgPSBfQzJfUExfQUFDX0JBU0UsICAgICAgICAgICAvLy88IEFBQyBMb3ctQ29tcGxleGl0eQorICAgIFBST0ZJTEVfQUFDX01BSU4sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgTWFpbgorICAgIFBST0ZJTEVfQUFDX1NTUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgU2NhbGFibGUgU2FtcGxpbmcgUmF0ZQorICAgIFBST0ZJTEVfQUFDX0xUUCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgTG9uZyBUZXJtIFByZWRpY3Rpb24KKyAgICBQUk9GSUxFX0FBQ19IRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQUFDIEhpZ2gtRWZmaWNpZW5jeQorICAgIFBST0ZJTEVfQUFDX1NDQUxBQkxFLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgU2NhbGFibGUKKyAgICBQUk9GSUxFX0FBQ19FUl9MQywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQUFDIEVycm9yIFJlc2lsaWVudCBMb3ctQ29tcGxleGl0eQorICAgIFBST0ZJTEVfQUFDX0VSX1NDQUxBQkxFLCAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgRXJyb3IgUmVzaWxpZW50IFNjYWxhYmxlCisgICAgUFJPRklMRV9BQUNfTEQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFBQyBMb3cgRGVsYXkKKyAgICBQUk9GSUxFX0FBQ19IRV9QUywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQUFDIEhpZ2gtRWZmaWNpZW5jeSBQYXJhbWV0cmljIFN0ZXJlbworICAgIFBST0ZJTEVfQUFDX0VMRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgRW5oYW5jZWQgTG93IERlbGF5CisgICAgUFJPRklMRV9BQUNfWEhFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFBQyBFeHRlbmRlZCBIaWdoLUVmZmljaWVuY3kKKworICAgIC8vIE1QRUctMiBWaWRlbyBwcm9maWxlcworICAgIFBST0ZJTEVfTVAyVl9TSU1QTEUgPSBfQzJfUExfTVAyVl9CQVNFLCAgICAgLy8vPCBNUEVHLTIgVmlkZW8gKEguMjYyKSBTaW1wbGUKKyAgICBQUk9GSUxFX01QMlZfTUFJTiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgTWFpbgorICAgIFBST0ZJTEVfTVAyVl9TTlJfU0NBTEFCTEUsICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTIgVmlkZW8gKEguMjYyKSBTTlIgU2NhbGFibGUKKyAgICBQUk9GSUxFX01QMlZfU1BBVElBTExZX1NDQUxBQkxFLCAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgU3BhdGlhbGx5IFNjYWxhYmxlCisgICAgUFJPRklMRV9NUDJWX0hJR0gsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctMiBWaWRlbyAoSC4yNjIpIEhpZ2gKKyAgICBQUk9GSUxFX01QMlZfNDIyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgNDoyOjIKKyAgICBQUk9GSUxFX01QMlZfTVVMVElWSUVXLCAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgTXVsdGktdmlldworCisgICAgLy8gSC4yNjMgcHJvZmlsZXMKKyAgICBQUk9GSUxFX0gyNjNfQkFTRUxJTkUgPSBfQzJfUExfSDI2M19CQVNFLCAgIC8vLzwgSC4yNjMgQmFzZWxpbmUgKFByb2ZpbGUgMCkKKyAgICBQUk9GSUxFX0gyNjNfSDMyMCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgSC4zMjAgQ29kaW5nIEVmZmljaWVuY3kgVmVyc2lvbiAyIEJhY2t3YXJkLUNvbXBhdGliaWxpdHkgKFByb2ZpbGUgMSkKKyAgICBQUk9GSUxFX0gyNjNfVjFCQywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgVmVyc2lvbiAxIEJhY2t3YXJkLUNvbXBhdGliaWxpdHkgKFByb2ZpbGUgMikKKyAgICBQUk9GSUxFX0gyNjNfSVNXVjIsICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgVmVyc2lvbiAyIEludGVyYWN0aXZlIGFuZCBTdHJlYW1pbmcgV2lyZWxlc3MgKFByb2ZpbGUgMykKKyAgICBQUk9GSUxFX0gyNjNfSVNXVjMsICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgVmVyc2lvbiAzIEludGVyYWN0aXZlIGFuZCBTdHJlYW1pbmcgV2lyZWxlc3MgKFByb2ZpbGUgNCkKKyAgICBQUk9GSUxFX0gyNjNfSElHSF9DT01QUkVTU0lPTiwgICAgICAgICAgICAgIC8vLzwgSC4yNjMgQ29udmVyc2F0aW9uYWwgSGlnaCBDb21wcmVzc2lvbiAoUHJvZmlsZSA1KQorICAgIFBST0ZJTEVfSDI2M19JTlRFUk5FVCwgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBDb252ZXJzYXRpb25hbCBJbnRlcm5ldCAoUHJvZmlsZSA2KQorICAgIFBST0ZJTEVfSDI2M19JTlRFUkxBQ0UsICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBDb252ZXJzYXRpb25hbCBJbnRlcmxhY2UgKFByb2ZpbGUgNykKKyAgICBQUk9GSUxFX0gyNjNfSElHSF9MQVRFTkNZLCAgICAgICAgICAgICAgICAgIC8vLzwgSC4yNjMgSGlnaCBMYXRlbmN5IChQcm9maWxlIDgpCisKKyAgICAvLyBNUEVHLTQgUGFydCAyIChWaWRlbykgTmF0dXJhbCBWaXN1YWwgUHJvZmlsZXMKKyAgICBQUk9GSUxFX01QNFZfU0lNUExFLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIFNpbXBsZQorICAgIFBST0ZJTEVfTVA0Vl9TSU1QTEVfU0NBTEFCTEUsICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gU2ltcGxlIFNjYWxhYmxlCisgICAgUFJPRklMRV9NUDRWX0NPUkUsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBDb3JlCisgICAgUFJPRklMRV9NUDRWX01BSU4sICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBNYWluCisgICAgUFJPRklMRV9NUDRWX05CSVQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBOLUJpdAorICAgIFBST0ZJTEVfTVA0Vl9BUlRTLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gQWR2YW5jZWQgUmVhbHRpbWUgU2ltcGxlCisgICAgUFJPRklMRV9NUDRWX0NPUkVfU0NBTEFCTEUsICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBDb3JlIFNjYWxhYmxlCisgICAgUFJPRklMRV9NUDRWX0FDRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBBZHZhbmNlZCBDb2RpbmcgRWZmaWNpZW5jeQorICAgIFBST0ZJTEVfTVA0Vl9BRFZBTkNFRF9DT1JFLCAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gQWR2YW5jZWQgQ29yZQorICAgIFBST0ZJTEVfTVA0Vl9TSU1QTEVfU1RVRElPLCAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gU2ltcGxlIFN0dWRpbworICAgIFBST0ZJTEVfTVA0Vl9DT1JFX1NUVURJTywgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gQ29yZSBTdHVkaW8KKyAgICBQUk9GSUxFX01QNFZfQURWQU5DRURfU0lNUExFLCAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIEFkdmFuY2VkIFNpbXBsZQorICAgIFBST0ZJTEVfTVA0Vl9GR1MsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gRmluZSBHcmFudWxhcml0eSBTY2FsYWJsZQorCisgICAgLy8gQVZDIC8gTVBFRy00IFBhcnQgMTAgKEguMjY0KSBwcm9maWxlcworICAgIFBST0ZJTEVfQVZDX0JBU0VMSU5FID0gX0MyX1BMX0FWQ19CQVNFLCAgICAgLy8vPCBBVkMgKEguMjY0KSBCYXNlbGluZQorICAgIFBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FLCAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBDb25zdHJhaW5lZCBCYXNlbGluZQorICAgIFBST0ZJTEVfQVZDX01BSU4sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBNYWluCisgICAgUFJPRklMRV9BVkNfRVhURU5ERUQsICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIEV4dGVuZGVkCisgICAgUFJPRklMRV9BVkNfSElHSCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIEhpZ2gKKyAgICBQUk9GSUxFX0FWQ19QUk9HUkVTU0lWRV9ISUdILCAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgUHJvZ3Jlc3NpdmUgSGlnaAorICAgIFBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0hJR0gsICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBDb25zdHJhaW5lZCBIaWdoCisgICAgUFJPRklMRV9BVkNfSElHSF8xMCwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIEhpZ2ggMTAKKyAgICBQUk9GSUxFX0FWQ19QUk9HUkVTU0lWRV9ISUdIXzEwLCAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgUHJvZ3Jlc3NpdmUgSGlnaCAxMAorICAgIFBST0ZJTEVfQVZDX0hJR0hfNDIyLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBIaWdoIDQ6MjoyCisgICAgUFJPRklMRV9BVkNfSElHSF80NDRfUFJFRElDVElWRSwgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIEhpZ2ggNDo0OjQgUHJlZGljdGl2ZQorICAgIFBST0ZJTEVfQVZDX0hJR0hfMTBfSU5UUkEsICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBIaWdoIDEwIEludHJhCisgICAgUFJPRklMRV9BVkNfSElHSF80MjJfSU5UUkEsICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIEhpZ2ggNDoyOjIgSW50cmEKKyAgICBQUk9GSUxFX0FWQ19ISUdIXzQ0NF9JTlRSQSwgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgSGlnaCA0OjQ6NCBJbnRyYQorICAgIFBST0ZJTEVfQVZDX0NBVkxDXzQ0NF9JTlRSQSwgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBDQVZMQyA0OjQ6NCBJbnRyYQorICAgIFBST0ZJTEVfQVZDX1NDQUxBQkxFX0JBU0VMSU5FID0gX0MyX1BMX0FWQ19CQVNFICsgMHgxMDAsICAvLy88IEFWQyAoSC4yNjQpIFNjYWxhYmxlIEJhc2VsaW5lCisgICAgUFJPRklMRV9BVkNfU0NBTEFCTEVfQ09OU1RSQUlORURfQkFTRUxJTkUsICAvLy88IEFWQyAoSC4yNjQpIFNjYWxhYmxlIENvbnN0cmFpbmVkIEJhc2VsaW5lCisgICAgUFJPRklMRV9BVkNfU0NBTEFCTEVfSElHSCwgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIFNjYWxhYmxlIEhpZ2gKKyAgICBQUk9GSUxFX0FWQ19TQ0FMQUJMRV9DT05TVFJBSU5FRF9ISUdILCAgICAgIC8vLzwgQVZDIChILjI2NCkgU2NhbGFibGUgQ29uc3RyYWluZWQgSGlnaAorICAgIFBST0ZJTEVfQVZDX1NDQUxBQkxFX0hJR0hfSU5UUkEsICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBTY2FsYWJsZSBIaWdoIEludHJhCisgICAgUFJPRklMRV9BVkNfTVVMVElWSUVXX0hJR0ggPSBfQzJfUExfQVZDX0JBU0UgKyAweDIwMCwgIC8vLzwgQVZDIChILjI2NCkgTXVsdGl2aWV3IEhpZ2gKKyAgICBQUk9GSUxFX0FWQ19TVEVSRU9fSElHSCwgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgU3RlcmVvIEhpZ2gKKyAgICBQUk9GSUxFX0FWQ19NRkNfSElHSCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTUZDIEhpZ2gKKyAgICBQUk9GSUxFX0FWQ19NVUxUSVZJRVdfREVQVEhfSElHSCA9IF9DMl9QTF9BVkNfQkFTRSArIDB4MzAwLCAgLy8vPCBBVkMgKEguMjY0KSBNdWx0aXZpZXcgRGVwdGggSGlnaAorICAgIFBST0ZJTEVfQVZDX01GQ19ERVBUSF9ISUdILCAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBNRkMgRGVwdGggSGlnaAorICAgIFBST0ZJTEVfQVZDX0VOSEFOQ0VEX01VTFRJVklFV19ERVBUSF9ISUdIID0gX0MyX1BMX0FWQ19CQVNFICsgMHg0MDAsICAvLy88IEFWQyAoSC4yNjQpIEVuaGFuY2VkIE11bHRpdmlldyBEZXB0aCBIaWdoCisKKyAgICAvLyBIRVZDIHByb2ZpbGVzCisgICAgUFJPRklMRV9IRVZDX01BSU4gPSBfQzJfUExfSEVWQ19CQVNFLCAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluCisgICAgUFJPRklMRV9IRVZDX01BSU5fMTAsICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIDEwCisgICAgUFJPRklMRV9IRVZDX01BSU5fU1RJTEwsICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFN0aWxsIFBpY3R1cmUKKyAgICBQUk9GSUxFX0hFVkNfTU9OTyA9IF9DMl9QTF9IRVZDX0JBU0UgKyAweDEwMCwgIC8vLzwgSEVWQyAoSC4yNjUpIE1vbm9jaHJvbWUKKyAgICBQUk9GSUxFX0hFVkNfTU9OT18xMiwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1vbm9jaHJvbWUgMTIKKyAgICBQUk9GSUxFX0hFVkNfTU9OT18xNiwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1vbm9jaHJvbWUgMTYKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl8xMiwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gMTIKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80MjJfMTAsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDoyOjIgMTAKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80MjJfMTIsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDoyOjIgMTIKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDQsICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTAsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgMTAKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTIsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgMTIKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl9JTlRSQSwgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl8xMF9JTlRSQSwgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gMTAgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl8xMl9JTlRSQSwgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gMTIgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80MjJfMTBfSU5UUkEsICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDoyOjIgMTAgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80MjJfMTJfSU5UUkEsICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDoyOjIgMTIgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfSU5UUkEsICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTBfSU5UUkEsICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgMTAgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTJfSU5UUkEsICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgMTIgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfMTZfSU5UUkEsICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgMTYgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl80NDRfU1RJTEwsICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gNDo0OjQgU3RpbGwgUGljdHVyZQorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xNl9TVElMTCwgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiA0OjQ6NCAxNiBTdGlsbCBQaWN0dXJlCisgICAgUFJPRklMRV9IRVZDX0hJR0hfNDQ0ID0gX0MyX1BMX0hFVkNfQkFTRSArIDB4MjAwLCAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaHJvdWdocHV0IDQ6NDo0CisgICAgUFJPRklMRV9IRVZDX0hJR0hfNDQ0XzEwLCAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBIaWdoIFRocm91Z2hwdXQgNDo0OjQgMTAKKyAgICBQUk9GSUxFX0hFVkNfSElHSF80NDRfMTQsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGhyb3VnaHB1dCA0OjQ6NCAxNAorICAgIFBST0ZJTEVfSEVWQ19ISUdIXzQ0NF8xNl9JTlRSQSwgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaHJvdWdocHV0IDQ6NDo0IDE2IEludHJhCisgICAgUFJPRklMRV9IRVZDX1NYX01BSU4gPSBfQzJfUExfSEVWQ19CQVNFICsgMHgzMDAsICAvLy88IEhFVkMgKEguMjY1KSBTY3JlZW4tRXh0ZW5kZWQgTWFpbgorICAgIFBST0ZJTEVfSEVWQ19TWF9NQUlOXzEwLCAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgU2NyZWVuLUV4dGVuZGVkIE1haW4gMTAKKyAgICBQUk9GSUxFX0hFVkNfU1hfTUFJTl80NDQsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIFNjcmVlbi1FeHRlbmRlZCBNYWluIDQ6NDo0CisgICAgUFJPRklMRV9IRVZDX1NYX01BSU5fNDQ0XzEwLCAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY3JlZW4tRXh0ZW5kZWQgTWFpbiA0OjQ6NCAxMAorICAgIFBST0ZJTEVfSEVWQ19TWF9ISUdIXzQ0NCwgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgU2NyZWVuLUV4dGVuZGVkIEhpZ2ggVGhyb3VnaHB1dCA0OjQ6NAorICAgIFBST0ZJTEVfSEVWQ19TWF9ISUdIXzQ0NF8xMCwgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgU2NyZWVuLUV4dGVuZGVkIEhpZ2ggVGhyb3VnaHB1dCA0OjQ6NCAxMAorICAgIFBST0ZJTEVfSEVWQ19TWF9ISUdIXzQ0NF8xNCwgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgU2NyZWVuLUV4dGVuZGVkIEhpZ2ggVGhyb3VnaHB1dCA0OjQ6NCAxNAorICAgIFBST0ZJTEVfSEVWQ19NVUxUSVZJRVdfTUFJTiA9IF9DMl9QTF9IRVZDX0JBU0UgKyAweDQwMCwgIC8vLzwgSEVWQyAoSC4yNjUpIE11bHRpdmlldyBNYWluCisgICAgUFJPRklMRV9IRVZDX1NDQUxBQkxFX01BSU4gPSBfQzJfUExfSEVWQ19CQVNFICsgMHg1MDAsICAvLy88IEhFVkMgKEguMjY1KSBTY2FsYWJsZSBNYWluCisgICAgUFJPRklMRV9IRVZDX1NDQUxBQkxFX01BSU5fMTAsICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY2FsYWJsZSBNYWluIDEwCisgICAgUFJPRklMRV9IRVZDX1NDQUxBQkxFX01PTk8gPSBfQzJfUExfSEVWQ19CQVNFICsgMHg2MDAsICAvLy88IEhFVkMgKEguMjY1KSBTY2FsYWJsZSBNb25vY2hyb21lCisgICAgUFJPRklMRV9IRVZDX1NDQUxBQkxFX01PTk9fMTIsICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY2FsYWJsZSBNb25vY2hyb21lIDEyCisgICAgUFJPRklMRV9IRVZDX1NDQUxBQkxFX01PTk9fMTYsICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY2FsYWJsZSBNb25vY2hyb21lIDE2CisgICAgUFJPRklMRV9IRVZDX1NDQUxBQkxFX01BSU5fNDQ0LCAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY2FsYWJsZSBNYWluIDQ6NDo0CisgICAgUFJPRklMRV9IRVZDXzNEX01BSU4gPSBfQzJfUExfSEVWQ19CQVNFICsgMHg3MDAsICAvLy88IEhFVkMgKEguMjY1KSAzRCBNYWluCisKKyAgICAvLyBWUDkgcHJvZmlsZXMKKyAgICBQUk9GSUxFX1ZQOV8wID0gX0MyX1BMX1ZQOV9CQVNFLCAgICAgICAgICAgIC8vLzwgVlA5IFByb2ZpbGUgMCAoNDoyOjApCisgICAgUFJPRklMRV9WUDlfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBQcm9maWxlIDEgKDQ6MjoyIG9yIDQ6NDo0KQorICAgIFBST0ZJTEVfVlA5XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgUHJvZmlsZSAyICg0OjI6MCwgMTAgb3IgMTIgYml0KQorICAgIFBST0ZJTEVfVlA5XzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgUHJvZmlsZSAzICg0OjI6MiBvciA0OjQ6NCwgMTAgb3IgMTIgYml0KQorCisgICAgLy8gRG9sYnkgVmlzaW9uIHByb2ZpbGVzCisgICAgUFJPRklMRV9EVl9BVl9QRVIgPSBfQzJfUExfRFZfQkFTRSArIDAsICAgICAvLy88IERvbGJ5IFZpc2lvbiBkdmF2LnBlciBwcm9maWxlIChkZXByZWNhdGVkKQorICAgIFBST0ZJTEVfRFZfQVZfUEVOLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gZHZhdi5wZW4gcHJvZmlsZSAoZGVwcmVjYXRlZCkKKyAgICBQUk9GSUxFX0RWX0hFX0RFUiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGR2aGUuZGVyIHByb2ZpbGUgKGRlcHJlY2F0ZWQpCisgICAgUFJPRklMRV9EVl9IRV9ERU4sICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBkdmhlLmRlbiBwcm9maWxlIChkZXByZWNhdGVkKQorICAgIFBST0ZJTEVfRFZfSEVfMDQgPSBfQzJfUExfRFZfQkFTRSArIDQsICAgICAgLy8vPCBEb2xieSBWaXNpb24gZHZoZS4wNCBwcm9maWxlCisgICAgUFJPRklMRV9EVl9IRV8wNSA9IF9DMl9QTF9EVl9CQVNFICsgNSwgICAgICAvLy88IERvbGJ5IFZpc2lvbiBkdmhlLjA1IHByb2ZpbGUKKyAgICBQUk9GSUxFX0RWX0hFX0RUSCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGR2aGUuZHRoIHByb2ZpbGUgKGRlcHJlY2F0ZWQpCisgICAgUFJPRklMRV9EVl9IRV8wNyA9IF9DMl9QTF9EVl9CQVNFICsgNywgICAgICAvLy88IERvbGJ5IFZpc2lvbiBkdmhlLjA3IHByb2ZpbGUKKyAgICBQUk9GSUxFX0RWX0hFXzA4ID0gX0MyX1BMX0RWX0JBU0UgKyA4LCAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGR2aGUuMDggcHJvZmlsZQorICAgIFBST0ZJTEVfRFZfQVZfMDkgPSBfQzJfUExfRFZfQkFTRSArIDksICAgICAgLy8vPCBEb2xieSBWaXNpb24gZHZhdi4wOSBwcm9maWxlCisKKyAgICAvLyBBVjEgcHJvZmlsZXMKKyAgICBQUk9GSUxFX0FWMV8wID0gX0MyX1BMX0FWMV9CQVNFLCAgICAgICAgICAgIC8vLzwgQVYxIFByb2ZpbGUgMCAoNDoyOjAsIDggdG8gMTAgYml0KQorICAgIFBST0ZJTEVfQVYxXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgUHJvZmlsZSAxICg4IHRvIDEwIGJpdCkKKyAgICBQUk9GSUxFX0FWMV8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIFByb2ZpbGUgMiAoOCB0byAxMiBiaXQpCit9OworCitlbnVtIEMyQ29uZmlnOjpsZXZlbF90IDogdWludDMyX3QgeworICAgIExFVkVMX1VOVVNFRCA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBsZXZlbCBpcyBub3QgdXNlZCBieSB0aGlzIG1lZGlhIHR5cGUKKworICAgIC8vIE1QRUctMiBWaWRlbyBsZXZlbHMKKyAgICBMRVZFTF9NUDJWX0xPVyA9IF9DMl9QTF9NUDJWX0JBU0UsICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgTG93IExldmVsCisgICAgTEVWRUxfTVAyVl9NQUlOLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctMiBWaWRlbyAoSC4yNjIpIE1haW4gTGV2ZWwKKyAgICBMRVZFTF9NUDJWX0hJR0hfMTQ0MCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgSGlnaCAxNDQwIExldmVsCisgICAgTEVWRUxfTVAyVl9ISUdILCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctMiBWaWRlbyAoSC4yNjIpIEhpZ2ggTGV2ZWwKKyAgICBMRVZFTF9NUDJWX0hJR0hQLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgSGlnaFAgTGV2ZWwKKworICAgIC8vIEguMjYzIGxldmVscworICAgIExFVkVMX0gyNjNfMTAgPSBfQzJfUExfSDI2M19CQVNFLCAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCAxMAorICAgIExFVkVMX0gyNjNfMjAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCAyMAorICAgIExFVkVMX0gyNjNfMzAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCAzMAorICAgIExFVkVMX0gyNjNfNDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCA0MAorICAgIExFVkVMX0gyNjNfNDUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCA0NQorICAgIExFVkVMX0gyNjNfNTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCA1MAorICAgIExFVkVMX0gyNjNfNjAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCA2MAorICAgIExFVkVMX0gyNjNfNzAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBMZXZlbCA3MAorCisgICAgLy8gTVBFRy00IFBhcnQgMiAoVmlkZW8pIGxldmVscworICAgIExFVkVMX01QNFZfMCA9IF9DMl9QTF9NUDRWX0JBU0UsICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTGV2ZWwgMAorICAgIExFVkVMX01QNFZfMEIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTGV2ZWwgMGIKKyAgICBMRVZFTF9NUDRWXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIExldmVsIDEKKyAgICBMRVZFTF9NUDRWXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIExldmVsIDIKKyAgICBMRVZFTF9NUDRWXzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIExldmVsIDMKKyAgICBMRVZFTF9NUDRWXzNCLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIExldmVsIDNiCisgICAgTEVWRUxfTVA0Vl80LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBMZXZlbCA0CisgICAgTEVWRUxfTVA0Vl80QSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBMZXZlbCA0YQorICAgIExFVkVMX01QNFZfNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTGV2ZWwgNQorICAgIExFVkVMX01QNFZfNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTGV2ZWwgNgorCisgICAgLy8gQVZDIC8gTVBFRy00IFBhcnQgMTAgKEguMjY0KSBsZXZlbHMKKyAgICBMRVZFTF9BVkNfMSA9IF9DMl9QTF9BVkNfQkFTRSwgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgMQorICAgIExFVkVMX0FWQ18xQiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAxYgorICAgIExFVkVMX0FWQ18xXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAxLjEKKyAgICBMRVZFTF9BVkNfMV8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgMS4yCisgICAgTEVWRUxfQVZDXzFfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDEuMworICAgIExFVkVMX0FWQ18yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAyCisgICAgTEVWRUxfQVZDXzJfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDIuMQorICAgIExFVkVMX0FWQ18yXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAyLjIKKyAgICBMRVZFTF9BVkNfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgMworICAgIExFVkVMX0FWQ18zXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAzLjEKKyAgICBMRVZFTF9BVkNfM18yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgMy4yCisgICAgTEVWRUxfQVZDXzQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDQKKyAgICBMRVZFTF9BVkNfNF8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgNC4xCisgICAgTEVWRUxfQVZDXzRfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDQuMgorICAgIExFVkVMX0FWQ181LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCA1CisgICAgTEVWRUxfQVZDXzVfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDUuMQorICAgIExFVkVMX0FWQ181XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCA1LjIKKyAgICBMRVZFTF9BVkNfNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgNgorICAgIExFVkVMX0FWQ182XzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCA2LjEKKyAgICBMRVZFTF9BVkNfNl8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgNi4yCisKKyAgICAvLyBIRVZDIChILjI2NSkgdGllcnMgYW5kIGxldmVscworICAgIExFVkVMX0hFVkNfTUFJTl8xID0gX0MyX1BMX0hFVkNfQkFTRSwgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDEKKyAgICBMRVZFTF9IRVZDX01BSU5fMiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gVGllciBMZXZlbCAyCisgICAgTEVWRUxfSEVWQ19NQUlOXzJfMSwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgMi4xCisgICAgTEVWRUxfSEVWQ19NQUlOXzMsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgMworICAgIExFVkVMX0hFVkNfTUFJTl8zXzEsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDMuMQorICAgIExFVkVMX0hFVkNfTUFJTl80LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDQKKyAgICBMRVZFTF9IRVZDX01BSU5fNF8xLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gVGllciBMZXZlbCA0LjEKKyAgICBMRVZFTF9IRVZDX01BSU5fNSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gVGllciBMZXZlbCA1CisgICAgTEVWRUxfSEVWQ19NQUlOXzVfMSwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgNS4xCisgICAgTEVWRUxfSEVWQ19NQUlOXzVfMiwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgNS4yCisgICAgTEVWRUxfSEVWQ19NQUlOXzYsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgNgorICAgIExFVkVMX0hFVkNfTUFJTl82XzEsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDYuMQorICAgIExFVkVMX0hFVkNfTUFJTl82XzIsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDYuMgorCisgICAgTEVWRUxfSEVWQ19ISUdIXzQgPSBfQzJfUExfSEVWQ19CQVNFICsgMHgxMDAsICAvLy88IEhFVkMgKEguMjY1KSBIaWdoIFRpZXIgTGV2ZWwgNAorICAgIExFVkVMX0hFVkNfSElHSF80XzEsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaWVyIExldmVsIDQuMQorICAgIExFVkVMX0hFVkNfSElHSF81LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaWVyIExldmVsIDUKKyAgICBMRVZFTF9IRVZDX0hJR0hfNV8xLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGllciBMZXZlbCA1LjEKKyAgICBMRVZFTF9IRVZDX0hJR0hfNV8yLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGllciBMZXZlbCA1LjIKKyAgICBMRVZFTF9IRVZDX0hJR0hfNiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGllciBMZXZlbCA2CisgICAgTEVWRUxfSEVWQ19ISUdIXzZfMSwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBIaWdoIFRpZXIgTGV2ZWwgNi4xCisgICAgTEVWRUxfSEVWQ19ISUdIXzZfMiwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBIaWdoIFRpZXIgTGV2ZWwgNi4yCisKKyAgICAvLyBWUDkgbGV2ZWxzCisgICAgTEVWRUxfVlA5XzEgPSBfQzJfUExfVlA5X0JBU0UsICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCAxCisgICAgTEVWRUxfVlA5XzFfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCAxLjEKKyAgICBMRVZFTF9WUDlfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDIKKyAgICBMRVZFTF9WUDlfMl8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDIuMQorICAgIExFVkVMX1ZQOV8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgTGV2ZWwgMworICAgIExFVkVMX1ZQOV8zXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgTGV2ZWwgMy4xCisgICAgTEVWRUxfVlA5XzQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCA0CisgICAgTEVWRUxfVlA5XzRfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCA0LjEKKyAgICBMRVZFTF9WUDlfNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDUKKyAgICBMRVZFTF9WUDlfNV8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDUuMQorICAgIExFVkVMX1ZQOV81XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgTGV2ZWwgNS4yCisgICAgTEVWRUxfVlA5XzYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCA2CisgICAgTEVWRUxfVlA5XzZfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCA2LjEKKyAgICBMRVZFTF9WUDlfNl8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDYuMgorCisgICAgLy8gRG9sYnkgVmlzaW9uIGxldmVscworICAgIExFVkVMX0RWX01BSU5fSERfMjQgPSBfQzJfUExfRFZfQkFTRSwgICAgICAgLy8vPCBEb2xieSBWaXNpb24gbWFpbiB0aWVyIGhkMjQKKyAgICBMRVZFTF9EVl9NQUlOX0hEXzMwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIG1haW4gdGllciBoZDMwCisgICAgTEVWRUxfRFZfTUFJTl9GSERfMjQsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBtYWluIHRpZXIgZmhkMjQKKyAgICBMRVZFTF9EVl9NQUlOX0ZIRF8zMCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIG1haW4gdGllciBmaGQzMAorICAgIExFVkVMX0RWX01BSU5fRkhEXzYwLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gbWFpbiB0aWVyIGZoZDYwCisgICAgTEVWRUxfRFZfTUFJTl9VSERfMjQsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBtYWluIHRpZXIgdWhkMjQKKyAgICBMRVZFTF9EVl9NQUlOX1VIRF8zMCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIG1haW4gdGllciB1aGQzMAorICAgIExFVkVMX0RWX01BSU5fVUhEXzQ4LCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gbWFpbiB0aWVyIHVoZDQ4CisgICAgTEVWRUxfRFZfTUFJTl9VSERfNjAsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBtYWluIHRpZXIgdWhkNjAKKworICAgIExFVkVMX0RWX0hJR0hfSERfMjQgPSBfQzJfUExfRFZfQkFTRSArIDB4MTAwLCAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIGhkMjQKKyAgICBMRVZFTF9EVl9ISUdIX0hEXzMwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciBoZDMwCisgICAgTEVWRUxfRFZfSElHSF9GSERfMjQsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgZmhkMjQKKyAgICBMRVZFTF9EVl9ISUdIX0ZIRF8zMCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciBmaGQzMAorICAgIExFVkVMX0RWX0hJR0hfRkhEXzYwLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIGZoZDYwCisgICAgTEVWRUxfRFZfSElHSF9VSERfMjQsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgdWhkMjQKKyAgICBMRVZFTF9EVl9ISUdIX1VIRF8zMCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciB1aGQzMAorICAgIExFVkVMX0RWX0hJR0hfVUhEXzQ4LCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIHVoZDQ4CisgICAgTEVWRUxfRFZfSElHSF9VSERfNjAsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgdWhkNjAKKworICAgIC8vIEFWMSBsZXZlbHMKKyAgICBMRVZFTF9BVjFfMiAgICA9IF9DMl9QTF9BVjFfQkFTRSAsICAgICAgICAgIC8vLzwgQVYxIExldmVsIDIKKyAgICBMRVZFTF9BVjFfMl8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDIuMQorICAgIExFVkVMX0FWMV8yXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgMi4yCisgICAgTEVWRUxfQVYxXzJfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCAyLjMKKyAgICBMRVZFTF9BVjFfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDMKKyAgICBMRVZFTF9BVjFfM18xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDMuMQorICAgIExFVkVMX0FWMV8zXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgMy4yCisgICAgTEVWRUxfQVYxXzNfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCAzLjMKKyAgICBMRVZFTF9BVjFfNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDQKKyAgICBMRVZFTF9BVjFfNF8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDQuMQorICAgIExFVkVMX0FWMV80XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNC4yCisgICAgTEVWRUxfQVYxXzRfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA0LjMKKyAgICBMRVZFTF9BVjFfNSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDUKKyAgICBMRVZFTF9BVjFfNV8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDUuMQorICAgIExFVkVMX0FWMV81XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNS4yCisgICAgTEVWRUxfQVYxXzVfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA1LjMKKyAgICBMRVZFTF9BVjFfNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDYKKyAgICBMRVZFTF9BVjFfNl8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDYuMQorICAgIExFVkVMX0FWMV82XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNi4yCisgICAgTEVWRUxfQVYxXzZfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA2LjMKKyAgICBMRVZFTF9BVjFfNywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDcKKyAgICBMRVZFTF9BVjFfN18xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDcuMQorICAgIExFVkVMX0FWMV83XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNy4yCisgICAgTEVWRUxfQVYxXzdfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA3LjMKK307CisKK3N0cnVjdCBDMlByb2ZpbGVMZXZlbFN0cnVjdCB7CisgICAgQzJDb25maWc6OnByb2ZpbGVfdCBwcm9maWxlOyAgLy8vPCBjb2RpbmcgcHJvZmlsZQorICAgIEMyQ29uZmlnOjpsZXZlbF90ICAgbGV2ZWw7ICAgIC8vLzwgY29kaW5nIGxldmVsCisKKyAgICBDMlByb2ZpbGVMZXZlbFN0cnVjdCgKKyAgICAgICAgICAgIEMyQ29uZmlnOjpwcm9maWxlX3QgcHJvZmlsZV8gPSBDMkNvbmZpZzo6UFJPRklMRV9VTlVTRUQsCisgICAgICAgICAgICBDMkNvbmZpZzo6bGV2ZWxfdCBsZXZlbF8gPSBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEKQorICAgICAgICA6IHByb2ZpbGUocHJvZmlsZV8pLCBsZXZlbChsZXZlbF8pIHsgfQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChQcm9maWxlTGV2ZWwpCisgICAgQzJGSUVMRChwcm9maWxlLCAicHJvZmlsZSIpCisgICAgQzJGSUVMRChsZXZlbCwgICAibGV2ZWwiKQorfTsKKworLy8gVE9ETzogbWF5IG5lZWQgdG8gbWFrZSB0aGlzIGV4cGxpY2l0IChoYXZlIC5zZXQgbWVtYmVyKQordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJQcm9maWxlTGV2ZWxTdHJ1Y3QsIGtQYXJhbUluZGV4UHJvZmlsZUxldmVsPgorICAgICAgICBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMW10gPSAiY29kZWQucGwiOworCisvKioKKyAqIENvZGVjLXNwZWNpZmljIGluaXRpYWxpemF0aW9uIGRhdGEuCisgKgorICogVGhpcyBpcyBpbml0aWFsaXphdGlvbiBkYXRhIGZvciB0aGUgY29kZWMuCisgKgorICogRm9yIEFWQy9IRVZDLCB0aGVzZSBhcmUgdGhlIGNvbmNhdGVuYXRlZCBTUFMvUFBTL1ZQUyBOQUxzLgorICoKKyAqIFRPRE86IGRlZmluZSBmb3Igb3RoZXIgY29kZWNzLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkJsb2JWYWx1ZSwga1BhcmFtSW5kZXhJbml0RGF0YT4gQzJTdHJlYW1Jbml0RGF0YUluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTklUX0RBVEFbXSA9ICJjb2RlZC5pbml0LWRhdGEiOworCisvKioKKyAqIFN1cHBsZW1lbnRhbCBEYXRhLgorICoKKyAqIFRoaXMgaXMgY29kaW5nLXNwZWNpZmljIHN1cHBsZW1lbnRhbCBpbmZvcm1hdGlvbmFsIGRhdGEsIGUuZy4gU0VJIGZvciBBVkMvSEVWQy4KKyAqIFRoaXMgc3RydWN0dXJlIGlzIG5vdCBhIGNvbmZpZ3VyYXRpb24gc28gaXQgZG9lcyBub3QgaGF2ZSBhIHBhcmFtZXRlciBrZXkuCisgKiBUaGlzIHN0cnVjdHVyZSBzaGFsbCBiZSByZXR1cm5lZCBpbiB0aGUgY29uZmlndXJhdGlvbiB1cGRhdGUsIGFuZCBjYW4gYmUgcmVwZWF0ZWQgYXMgbmVlZGVkCisgKiBpbiB0aGUgc2FtZSB1cGRhdGUuCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6c3VwcGxlbWVudGFsX2luZm9fdCwgdWludDMyX3QsCisgICAgSU5GT19OT05FID0gMCwKKworICAgIElORk9fUFJFRklYX1NFSV9VTklUID0gMHgxMDAwMCwgLy8vPCBwcmVmaXggU0VJIHBheWxvYWQgdHlwZXMgYWRkIHRoaXMgZmxhZworICAgIElORk9fU1VGRklYX1NFSV9VTklUID0gMHgyMDAwMCwgLy8vPCBzdWZmaXggU0VJIHBheWxvYWQgdHlwZXMgYWRkIHRoaXMgZmxhZworCisgICAgSU5GT19TRUlfVVNFUl9EQVRBID0gSU5GT19QUkVGSVhfU0VJX1VOSVQgfCA0LCAgICAvLy88IGNsb3NlZC1jYXB0aW9uaW5nIGRhdGEgKElUVS1UIFQzNSkKKyAgICBJTkZPX1NFSV9NRENWICAgICAgPSBJTkZPX1BSRUZJWF9TRUlfVU5JVCB8IDEzNywgIC8vLzwgbWFzdGVyaW5nIGRpc3BsYXkgY29sb3Igdm9sdW1lCisgICAgSU5GT19TRVRfVVNFUl9EQVRBX1NGWCA9IElORk9fU1VGRklYX1NFSV9VTklUIHwgNCwgLy8vPCBjbG9zZWQtY2FwdGlvbmluZyBkYXRhIChJVFUtVCBUMzUpCisKKyAgICBJTkZPX1ZFTkRPUl9TVEFSVCA9IDB4NzAwMDAwMDAKKykKKworc3RydWN0IEMyU3VwcGxlbWVudGFsRGF0YVN0cnVjdCB7CisgICAgQzJTdXBwbGVtZW50YWxEYXRhU3RydWN0KCkKKyAgICAgICAgOiB0eXBlXyhJTkZPX05PTkUpIHsgfQorCisgICAgQzJTdXBwbGVtZW50YWxEYXRhU3RydWN0KAorICAgICAgICAgICAgc2l6ZV90IGZsZXhDb3VudCwgQzJDb25maWc6OnN1cHBsZW1lbnRhbF9pbmZvX3QgdHlwZSwgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGF0YV8pCisgICAgICAgIDogdHlwZV8odHlwZSkgeworICAgICAgICAgICAgbWVtY3B5KGRhdGEsICZkYXRhX1swXSwgYzJfbWluKGRhdGFfLnNpemUoKSwgZmxleENvdW50KSk7CisgICAgfQorCisgICAgQzJDb25maWc6OnN1cHBsZW1lbnRhbF9pbmZvX3QgdHlwZV87CisgICAgdWludDhfdCBkYXRhW107CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoU3VwcGxlbWVudGFsRGF0YSwgZGF0YSkKKyAgICBDMkZJRUxEKHR5cGVfLCAidHlwZSIpCisgICAgQzJGSUVMRChkYXRhLCAiZGF0YSIpCit9OwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJTdXBwbGVtZW50YWxEYXRhU3RydWN0LCBrUGFyYW1JbmRleFN1cHBsZW1lbnRhbERhdGE+CisgICAgICAgIEMyU3RyZWFtU3VwcGxlbWVudGFsRGF0YUluZm87CisKKy8qKgorICogU3VwcGxlbWVudGFsIERhdGEgU3Vic2NyaXB0aW9uCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJTaW1wbGVBcnJheVN0cnVjdDxDMkNvbmZpZzo6c3VwcGxlbWVudGFsX2luZm9fdD4sCisgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhTdWJzY3JpYmVkU3VwcGxlbWVudGFsRGF0YT4KKyAgICAgICAgQzJTdHJlYW1TdWJzY3JpYmVkU3VwcGxlbWVudGFsRGF0YVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1NVQlNDUklCRURfU1VQUExFTUVOVEFMX0RBVEFbXSA9ICJvdXRwdXQuc3Vic2NyaWJlZC1zdXBwbGVtZW50YWwiOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHBpcGVsaW5lIGNoYXJhY3RlcmlzdGljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogTWVkaWEtdHlwZS4KKyAqCisgKiBUaGlzIGlzIGRlZmluZWQgZm9yIGJvdGggcG9ydCBhbmQgc3RyZWFtLCBidXQgc3RyZWFtIG1lZGlhIHR5cGUgbWF5IGJlIGEgc3VidHlwZSBvZiB0aGUKKyAqIHBvcnQgbWVkaWEgdHlwZS4KKyAqLwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlNldHRpbmcsIEMyU3RyaW5nVmFsdWUsIGtQYXJhbUluZGV4TWVkaWFUeXBlPiBDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfTUVESUFfVFlQRVtdID0gImlucHV0Lm1lZGlhLXR5cGUiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEVbXSA9ICJvdXRwdXQubWVkaWEtdHlwZSI7CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlNldHRpbmcsIEMyU3RyaW5nVmFsdWUsIGtQYXJhbUluZGV4TWVkaWFUeXBlPiBDMlN0cmVhbU1lZGlhVHlwZVNldHRpbmc7CisKKy8qKgorICogUGlwZWxpbmUgZGVsYXlzLgorICoKKyAqIElucHV0IGRlbGF5IGlzIHRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBpbnB1dCBmcmFtZXMgcmVxdWVzdGVkIGJ5IHRoZSBjb21wb25lbnQgdG8gcHJvY2VzcworICogYW4gaW5wdXQgZnJhbWUuCisgKgorICogT3V0cHV0IGRlbGF5IGlzIHRoZSBudW1iZXIgb2YgYWRkaXRpb25hbCBvdXRwdXQgZnJhbWVzIHRoYXQgbmVlZCB0byBiZSBnZW5lcmF0ZWQgYmVmb3JlIGFuCisgKiBvdXRwdXQgY2FuIGJlIHJlbGVhc2VkIGJ5IHRoZSBjb21wb25lbnQuCisgKgorICogUGlwZWxpbmUgZGVsYXkgaXMgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGZyYW1lcyB0aGF0IGFyZSBwcm9jZXNzZWQgYXQgb25lIHRpbWUgYnkgdGhlCisgKiBjb21wb25lbnQuCisgKgorICogQXMgdGhlc2UgbWF5IHZhcnkgZnJvbSBmcmFtZSB0byBmcmFtZSwgdGhlIG51bWJlciBpcyB0aGUgbWF4aW11bSByZXF1aXJlZCB2YWx1ZS4gRS5nLiBpZgorICogaW5wdXQgZGVsYXkgaXMgMCwgdGhlIGNvbXBvbmVudCBpcyBleHBlY3RlZCB0byBjb25zdW1lIGVhY2ggZnJhbWUgcXVldWVkIGV2ZW4gaWYgbm8gZnVydGhlcgorICogZnJhbWVzIGFyZSBxdWV1ZWQuIFNpbWlsYXJseSwgaWYgaW5wdXQgZGVsYXkgaXMgMSwgYXMgbG9uZyBhcyB0aGVyZSBhcmUgYWx3YXlzIGV4YWN0bHkgMgorICogb3V0c3RhbmRpbmcgaW5wdXQgZnJhbWVzIHF1ZXVlZCB0byB0aGUgY29tcG9uZW50LCBpdCBzaGFsbCBwcm9kdWNlIG91dHB1dC4KKyAqLworCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleERlbGF5IHwgQzJQYXJhbTo6Q29yZUluZGV4OjpJU19SRVFVRVNUX0ZMQUc+CisgICAgICAgIEMyUG9ydFJlcXVlc3RlZERlbGF5VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfREVMQVlfUkVRVUVTVFtdID0gImlucHV0LmRlbGF5IjsgLy8gZGVwcmVjYXRlZAorY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX0RFTEFZX1JFUVVFU1RbXSA9ICJvdXRwdXQuZGVsYXkiOyAvLyBkZXByZWNhdGVkCisKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwKKyAgICAgICAgICAgICAgICBrUGFyYW1JbmRleERlbGF5IHwgQzJQYXJhbTo6Q29yZUluZGV4OjpJU19SRVFVRVNUX0ZMQUc+CisgICAgICAgIEMyUmVxdWVzdGVkUGlwZWxpbmVEZWxheVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BJUEVMSU5FX0RFTEFZX1JFUVVFU1RbXSA9ICJhbGdvLmRlbGF5IjsgLy8gZGVwcmVjYXRlZAorCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4RGVsYXk+IEMyUG9ydERlbGF5VHVuaW5nOwordHlwZWRlZiBDMlBvcnREZWxheVR1bmluZyBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzsgLy8gZGVwcmVjYXRlZAorY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfREVMQVlbXSA9ICJpbnB1dC5kZWxheSI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfREVMQVlbXSA9ICJvdXRwdXQuZGVsYXkiOworCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhEZWxheT4gQzJQaXBlbGluZURlbGF5VHVuaW5nOwordHlwZWRlZiBDMlBpcGVsaW5lRGVsYXlUdW5pbmcgQzJBY3R1YWxQaXBlbGluZURlbGF5VHVuaW5nOyAvLyBkZXByZWNhdGVkCitjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QSVBFTElORV9ERUxBWVtdID0gImFsZ28uZGVsYXkiOworCisvKioKKyAqIFJlZmVyZW5jZSBjaGFyYWN0ZXJpc3RpY3MuCisgKgorICogVGhlIGNvbXBvbmVudCBtYXkgaG9sZCBvbnRvIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBldmVuIGFmdGVyIGNvbXBsZXRpbmcgdGhlIGNvcnJlc3BvbmRpbmcKKyAqIHdvcmsgaXRlbS4KKyAqCisgKiBNYXggcmVmZXJlbmNlIGFnZSBpcyB0aGUgbG9uZ2VzdCBudW1iZXIgb2YgYWRkaXRpb25hbCBmcmFtZSBwcm9jZXNzaW5nIHRoYXQgYSBjb21wb25lbnQgbWF5CisgKiBob2xkIG9udG8gYSBidWZmZXIgZm9yLiBNYXggcmVmZXJlbmNlIGNvdW50IGlzIHRoZSBudW1iZXIgb2YgYnVmZmVycyB0aGF0IGEgY29tcG9uZW50IG1heQorICogaG9sZCBvbnRvIGF0IHRoZSBzYW1lIHRpbWUgYXQgdGhlIHdvcnN0IGNhc2UuIFRoZXNlIG51bWJlcnMgYXNzdW1lIHNpbmdsZSBmcmFtZSBwZXIgYnVmZmVycy4KKyAqCisgKiBVc2UgbWF4LXVpbnQzMiBpZiB0aGVyZSBpcyBubyBsaW1pdCBmb3IgdGhlIG1heCBhZ2Ugb3IgY291bnQuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhNYXhSZWZlcmVuY2VBZ2U+CisgICAgICAgIEMyU3RyZWFtTWF4UmVmZXJlbmNlQWdlVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX1JFRkVSRU5DRV9BR0VbXSA9ICJpbnB1dC5yZWZlcmVuY2UubWF4LWFnZSI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfTUFYX1JFRkVSRU5DRV9BR0VbXSA9ICJvdXRwdXQucmVmZXJlbmNlLm1heC1hZ2UiOworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4TWF4UmVmZXJlbmNlQ291bnQ+CisgICAgICAgIEMyU3RyZWFtTWF4UmVmZXJlbmNlQ291bnRUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfUkVGRVJFTkNFX0NPVU5UW10gPSAiaW5wdXQucmVmZXJlbmNlLm1heC1jb3VudCI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfTUFYX1JFRkVSRU5DRV9DT1VOVFtdID0gIm91dHB1dC5yZWZlcmVuY2UubWF4LWNvdW50IjsKKworLyoqCisgKiBPdXRwdXQgcmVvcmRlcmluZy4KKyAqCisgKiBUaGUgc2l6ZSBvZiB0aGUgd2luZG93IHRvIHVzZSBmb3Igb3V0cHV0IGJ1ZmZlciByZW9yZGVyaW5nLiAwIGlzIGludGVycHJldGVkIGFzIDEuCisgKi8KKy8vIG91dHB1dCBvbmx5Cit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleFJlb3JkZXJCdWZmZXJEZXB0aD4KKyAgICAgICAgQzJQb3J0UmVvcmRlckJ1ZmZlckRlcHRoVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX1JFT1JERVJfREVQVEhbXSA9ICJvdXRwdXQucmVvcmRlci5kZXB0aCI7CisKK0MyRU5VTShDMkNvbmZpZzo6b3JkaW5hbF9rZXlfdCwgdWludDMyX3QsCisgICAgICAgIE9SRElOQUwsCisgICAgICAgIFRJTUVTVEFNUCwKKyAgICAgICAgQ1VTVE9NKQorCisvLyByZWFkLW9ubHksIG91dHB1dCBvbmx5Cit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyU2V0dGluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbmZpZzo6b3JkaW5hbF9rZXlfdD4sIGtQYXJhbUluZGV4UmVvcmRlcktleT4KKyAgICAgICAgQzJQb3J0UmVvcmRlcktleVNldHRpbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfUkVPUkRFUl9LRVlbXSA9ICJvdXRwdXQucmVvcmRlci5rZXkiOworCisvKioKKyAqIFN0cmVhbSBjb3VudC4KKyAqLworLy8gcHJpdmF0ZQordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhTdHJlYW1Db3VudD4gQzJQb3J0U3RyZWFtQ291bnRUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQ09VTlRbXSA9ICJpbnB1dC5zdHJlYW0tY291bnQiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9DT1VOVFtdID0gIm91dHB1dC5zdHJlYW0tY291bnQiOworCisvKioKKyAqIENvbmZpZyB1cGRhdGUgc3Vic2NyaXB0aW9uLgorICovCisvLyBwcml2YXRlCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyVWludDMyQXJyYXksIGtQYXJhbUluZGV4U3Vic2NyaWJlZFBhcmFtSW5kaWNlcz4KKyAgICAgICAgQzJTdWJzY3JpYmVkUGFyYW1JbmRpY2VzVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfU1VCU0NSSUJFRF9QQVJBTV9JTkRJQ0VTW10gPSAib3V0cHV0LnN1YnNjcmliZWQtaW5kaWNlcyI7CisKKy8qKgorICogU3VnZ2VzdGVkIGJ1ZmZlciAoQzJGcmFtZSkgY291bnQuIFRoaXMgaXMgYSBzdWdnZXN0aW9uIGJ5IHRoZSBjb21wb25lbnQgZm9yIHRoZSBudW1iZXIgb2YKKyAqIGlucHV0IGFuZCBvdXRwdXQgZnJhbWVzIGFsbG9jYXRlZCBmb3IgdGhlIGNvbXBvbmVudCdzIHVzZSBpbiB0aGUgYnVmZmVyIHBvb2xzLgorICoKKyAqIENvbXBvbmVudCBzaGFsbCBzZXQgdGhlIGFjY2VwdGFibGUgcmFuZ2Ugb2YgYnVmZmVycyBhbGxvY2F0ZWQgZm9yIGl0LiBFLmcuIGNsaWVudCBzaGFsbAorICogYWxsb2NhdGUgYXQgbGVhc3QgdGhlIG1pbmltdW0gcmVxdWlyZWQgdmFsdWUuCisgKi8KKy8vIHJlYWQtb25seQordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJVaW50NjRBcnJheSwga1BhcmFtSW5kZXhTdWdnZXN0ZWRCdWZmZXJDb3VudD4KKyAgICAgICAgQzJQb3J0U3VnZ2VzdGVkQnVmZmVyQ291bnRUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9TVUdHRVNURURfQlVGRkVSX0NPVU5UW10gPSAiaW5wdXQuYnVmZmVycy5wb29sLXNpemUiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX1NVR0dFU1RFRF9CVUZGRVJfQ09VTlRbXSA9ICJvdXRwdXQuYnVmZmVycy5wb29sLXNpemUiOworCisvKioKKyAqIElucHV0L291dHB1dCBiYXRjaGluZy4KKyAqCisgKiBGb3IgaW5wdXQsIGNvbXBvbmVudCByZXF1ZXN0cyB0aGF0IGNsaWVudCBiYXRjaGVzIHdvcmsgaW4gYmF0Y2hlcyBvZiBzcGVjaWZpZWQgc2l6ZS4gRm9yIG91dHB1dCwKKyAqIGNsaWVudCByZXF1ZXN0cyB0aGF0IHRoZSBjb21wb25lbnQgYmF0Y2hlcyB3b3JrIGNvbXBsZXRpb24gaW4gZ2l2ZW4gYmF0Y2ggc2l6ZS4KKyAqIFZhbHVlIDAgbWVhbnMgZG9uJ3QgY2FyZS4KKyAqLwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJVaW50NjRBcnJheSwga1BhcmFtSW5kZXhCYXRjaFNpemU+IEMyUG9ydEJhdGNoU2l6ZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX0JBVENIX1NJWkVbXSA9ICJpbnB1dC5idWZmZXJzLmJhdGNoLXNpemUiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX0JBVENIX1NJWkVbXSA9ICJvdXRwdXQuYnVmZmVycy5iYXRjaC1zaXplIjsKKworLyoqCisgKiBDdXJyZW50ICYgbGFzdCB3b3JrIG9yZGluYWxzLgorICoKKyAqIGlucHV0IHBvcnQ6IGxhc3Qgd29yayBxdWV1ZWQgdG8gY29tcG9uZW50LgorICogb3V0cHV0IHBvcnQ6IGxhc3Qgd29yayBjb21wbGV0ZWQgYnkgY29tcG9uZW50LgorICogZ2xvYmFsOiBjdXJyZW50IHdvcmsuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyV29ya09yZGluYWxTdHJ1Y3QsIGtQYXJhbUluZGV4TGFzdFdvcmtRdWV1ZWQ+IEMyTGFzdFdvcmtRdWV1ZWRUdW5pbmc7Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyV29ya09yZGluYWxTdHJ1Y3QsIGtQYXJhbUluZGV4Q3VycmVudFdvcms+IEMyQ3VycmVudFdvcmtUdW5pbmc7CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtZW1vcnkgYWxsb2NhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogQWxsb2NhdG9ycyB0byB1c2UuCisgKgorICogVGhlc2UgYXJlIHJlcXVlc3RlZCBieSB0aGUgY29tcG9uZW50LgorICoKKyAqIElmIG5vbmUgc3BlY2lmaWVkLCBjbGllbnQgd2lsbCB1c2UgdGhlIGRlZmF1bHQgYWxsb2NhdG9yIElEIGJhc2VkIG9uIHRoZSBjb21wb25lbnQgZG9tYWluIGFuZAorICoga2luZC4KKyAqLwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJTaW1wbGVBcnJheVN0cnVjdDxDMkFsbG9jYXRvcjo6aWRfdD4sIGtQYXJhbUluZGV4QWxsb2NhdG9ycz4KKyAgICAgICAgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX0FMTE9DQVRPUlNbXSA9ICJpbnB1dC5idWZmZXJzLmFsbG9jYXRvci1pZHMiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX0FMTE9DQVRPUlNbXSA9ICJvdXRwdXQuYnVmZmVycy5hbGxvY2F0b3ItaWRzIjsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMlNpbXBsZUFycmF5U3RydWN0PEMyQWxsb2NhdG9yOjppZF90Piwga1BhcmFtSW5kZXhBbGxvY2F0b3JzPgorICAgICAgICBDMlByaXZhdGVBbGxvY2F0b3JzVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUFJJVkFURV9BTExPQ0FUT1JTW10gPSAiYWxnby5idWZmZXJzLmFsbG9jYXRvci1pZHMiOworCisvKioKKyAqIEFsbG9jYXRvciB0byB1c2UgZm9yIG91dHB1dHRpbmcgdG8gc3VyZmFjZS4KKyAqCisgKiBDb21wb25lbnRzIGNhbiBvcHRpb25hbGx5IHJlcXVlc3QgYWxsb2NhdG9yIHR5cGUgZm9yIG91dHB1dHRpbmcgdG8gc3VyZmFjZS4KKyAqCisgKiBJZiBub25lIHNwZWNpZmllZCwgY2xpZW50IHdpbGwgdXNlIHRoZSBkZWZhdWx0IEJ1ZmZlclF1ZXVlLWJhY2tlZCBhbGxvY2F0b3IgSUQgZm9yIG91dHB1dHRpbmcgdG8KKyAqIHN1cmZhY2UuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4U3VyZmFjZUFsbG9jYXRvcj4KKyAgICAgICAgQzJQb3J0U3VyZmFjZUFsbG9jYXRvclR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9TVVJGQUNFX0FMTE9DQVRPUltdID0gIm91dHB1dC5idWZmZXJzLnN1cmZhY2UtYWxsb2NhdG9yLWlkIjsKKworLyoqCisgKiBCbG9jayBwb29scyB0byB1c2UuCisgKgorICogVGhlc2UgYXJlIGFsbG9jYXRlZCBieSB0aGUgY2xpZW50IGZvciB0aGUgY29tcG9uZW50IHVzaW5nIHRoZSBhbGxvY2F0b3IgSURzIHNwZWNpZmllZCBieSB0aGUKKyAqIGNvbXBvbmVudC4gVGhpcyBpcyBub3QgdXNlZCBmb3IgdGhlIGlucHV0IHBvcnQuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8QzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3Q+LCBrUGFyYW1JbmRleEJsb2NrUG9vbHM+CisgICAgICAgIEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfQkxPQ0tfUE9PTFNbXSA9ICJvdXRwdXQuYnVmZmVycy5wb29sLWlkcyI7CisKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJTaW1wbGVBcnJheVN0cnVjdDxDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdD4sIGtQYXJhbUluZGV4QmxvY2tQb29scz4KKyAgICAgICAgQzJQcml2YXRlQmxvY2tQb29sc1R1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BSSVZBVEVfQkxPQ0tfUE9PTFNbXSA9ICJhbGdvLmJ1ZmZlcnMucG9vbC1pZHMiOworCisvKioKKyAqIFRoZSBtYXggbnVtYmVyIG9mIHByaXZhdGUgYWxsb2NhdGlvbnMgYXQgYW55IG9uZSB0aW1lIGJ5IHRoZSBjb21wb25lbnQuCisgKiAoVGhpcyBpcyBhbiBhcnJheSB3aXRoIGEgY29ycmVzcG9uZGluZyB2YWx1ZSBmb3IgZWFjaCBwcml2YXRlIGFsbG9jYXRvcikKKyAqLwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMkFycmF5LCBrUGFyYW1JbmRleE1heFJlZmVyZW5jZUNvdW50PgorICAgICAgICBDMk1heFByaXZhdGVCdWZmZXJDb3VudFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX01BWF9QUklWQVRFX0JVRkZFUl9DT1VOVFtdID0gImFsZ28uYnVmZmVycy5tYXgtY291bnQiOworCisvKioKKyAqIEJ1ZmZlciB0eXBlCisgKgorICogVGhpcyBpcyBwcm92aWRlZCBieSB0aGUgY29tcG9uZW50IGZvciB0aGUgY2xpZW50IHRvIGFsbG9jYXRlIHRoZSBwcm9wZXIgYnVmZmVyIHR5cGUgZm9yIHRoZQorICogaW5wdXQgcG9ydCwgYW5kIGNhbiBiZSBwcm92aWRlZCBieSB0aGUgY2xpZW50IHRvIGNvbnRyb2wgdGhlIGJ1ZmZlciB0eXBlIGZvciB0aGUgb3V0cHV0LgorICovCisvLyBwcml2YXRlCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJTZXR0aW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyRWFzeUVudW08QzJCdWZmZXJEYXRhOjp0eXBlX3Q+PiwKKyAgICAgICAgICAgICAgICBrUGFyYW1JbmRleEJ1ZmZlclR5cGU+CisgICAgICAgIEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQlVGRkVSX1RZUEVbXSA9ICJpbnB1dC5idWZmZXJzLnR5cGUiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRVtdID0gIm91dHB1dC5idWZmZXJzLnR5cGUiOworCisvKioKKyAqIE1lbW9yeSB1c2FnZS4KKyAqCisgKiBTdWdnZXN0ZWQgYnkgY29tcG9uZW50IGZvciBpbnB1dCBhbmQgbmVnb3RpYXRlZCBiZXR3ZWVuIGNsaWVudCBhbmQgY29tcG9uZW50IGZvciBvdXRwdXQuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJVaW50NjRWYWx1ZSwga1BhcmFtSW5kZXhVc2FnZT4gQzJTdHJlYW1Vc2FnZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9VU0FHRVtdID0gImlucHV0LmJ1ZmZlcnMudXNhZ2UiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9VU0FHRVtdID0gIm91dHB1dC5idWZmZXJzLnVzYWdlIjsKKworLyoqCisgKiBQaWN0dXJlICh2aWRlbyBvciBpbWFnZSBmcmFtZSkgc2l6ZS4KKyAqLworc3RydWN0IEMyUGljdHVyZVNpemVTdHJ1Y3QgeworICAgIGlubGluZSBDMlBpY3R1cmVTaXplU3RydWN0KCkKKyAgICAgICAgOiB3aWR0aCgwKSwgaGVpZ2h0KDApIHsgfQorCisgICAgaW5saW5lIEMyUGljdHVyZVNpemVTdHJ1Y3QodWludDMyX3Qgd2lkdGhfLCB1aW50MzJfdCBoZWlnaHRfKQorICAgICAgICA6IHdpZHRoKHdpZHRoXyksIGhlaWdodChoZWlnaHRfKSB7IH0KKworICAgIHVpbnQzMl90IHdpZHRoOyAgICAgLy8vPCB2aWRlbyB3aWR0aAorICAgIHVpbnQzMl90IGhlaWdodDsgICAgLy8vPCB2aWRlbyBoZWlnaHQKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoUGljdHVyZVNpemUpCisgICAgQzJGSUVMRCh3aWR0aCwgIndpZHRoIikKKyAgICBDMkZJRUxEKGhlaWdodCwgImhlaWdodCIpCit9OworCisvKioKKyAqIE91dCBvZiBtZW1vcnkgc2lnbmFsaW5nCisgKgorICogVGhpcyBpcyBhIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBjbGllbnQgdG8gbWFyayB0aGF0IGl0IGNhbm5vdCBhbGxvY2F0ZSBuZWNlc3NhcnkgcHJpdmF0ZSBhbmQvCisgKiBvciBvdXRwdXQgYnVmZmVycyB0byBjb250aW51ZSBvcGVyYXRpb24sIGFuZCB0byBzaWduYWwgdGhlIGZhaWxpbmcgY29uZmlndXJhdGlvbi4KKyAqLworc3RydWN0IEMyT3V0T2ZNZW1vcnlTdHJ1Y3QgeworICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IHBvb2w7ICAgLy8vPCBwb29sIElEIHRoYXQgZmFpbGVkIHRoZSBhbGxvY2F0aW9uCisgICAgdWludDY0X3QgdXNhZ2U7ICAgICAgICAgICAgICAgICAvLy88IG1lbW9yeSB1c2FnZSB1c2VkCisgICAgQzJQaWN0dXJlU2l6ZVN0cnVjdCBwbGFuYXI7ICAgICAvLy88IGJ1ZmZlciBkaW1lbnNpb25zIHRvIGJlIGFsbG9jYXRlZCBpZiAyRAorICAgIHVpbnQzMl90IGZvcm1hdDsgICAgICAgICAgICAgICAgLy8vPCBwaXhlbCBmb3JtYXQgdG8gYmUgdXNlZCBpZiAyRAorICAgIHVpbnQzMl90IGNhcGFjaXR5OyAgICAgICAgICAgICAgLy8vPCBidWZmZXIgY2FwYWNpdHkgdG8gYmUgYWxsb2NhdGVkIGlmIDFECisgICAgYzJfYm9vbF90IG91dE9mTWVtb3J5OyAgICAgICAgICAgLy8vPCB0cnVlIGlmIGNvbXBvbmVudCBpcyBvdXQgb2YgbWVtb3J5CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKE91dE9mTWVtb3J5KQorICAgIEMyRklFTEQocG9vbCwgInBvb2wiKQorICAgIEMyRklFTEQodXNhZ2UsICJ1c2FnZSIpCisgICAgQzJGSUVMRChwbGFuYXIsICJwbGFuYXIiKQorICAgIEMyRklFTEQoZm9ybWF0LCAiZm9ybWF0IikKKyAgICBDMkZJRUxEKGNhcGFjaXR5LCAiY2FwYWNpdHkiKQorICAgIEMyRklFTEQob3V0T2ZNZW1vcnksICJvdXQtb2YtbWVtb3J5IikKK307CisKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJPdXRPZk1lbW9yeVN0cnVjdCwga1BhcmFtSW5kZXhPdXRPZk1lbW9yeT4gQzJPdXRPZk1lbW9yeVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVF9PRl9NRU1PUllbXSA9ICJhbGdvLm9vbSI7CisKKy8qKgorICogTWF4IGJ1ZmZlciBzaXplCisgKgorICogVGhpcyBpcyBhIGhpbnQgcHJvdmlkZWQgYnkgdGhlIGNvbXBvbmVudCBmb3IgdGhlIG1heGltdW0gYnVmZmVyIHNpemUgZXhwZWN0ZWQgb24gYSBzdHJlYW0gZm9yIHRoZQorICogY3VycmVudCBjb25maWd1cmF0aW9uIG9uIGl0cyBpbnB1dCBhbmQgb3V0cHV0IHN0cmVhbXMuIFRoaXMgaXMgY29tbXVuaWNhdGVkIHRvIGNsaWVudHMgc28gdGhleQorICogY2FuIHByZWFsbG9jYXRlIGlucHV0IGJ1ZmZlcnMsIG9yIGNvbmZpZ3VyZSBkb3duc3RyZWFtIGNvbXBvbmVudHMgdGhhdCByZXF1aXJlIGEgbWF4aW11bSBzaXplIG9uCisgKiB0aGVpciBidWZmZXJzLgorICoKKyAqIFJlYWQtb25seS4gUmVxdWlyZWQgdG8gYmUgcHJvdmlkZWQgYnkgY29tcG9uZW50cyBvbiBhbGwgY29tcHJlc3NlZCBzdHJlYW1zLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleE1heEJ1ZmZlclNpemU+IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkVbXSA9ICJpbnB1dC5idWZmZXJzLm1heC1zaXplIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9NQVhfQlVGRkVSX1NJWkVbXSA9ICJvdXRwdXQuYnVmZmVycy5tYXgtc2l6ZSI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbWlzYy4gc3RhdGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIFRyaXBwZWQgc3RhdGUsCisgKgorICogVGhpcyBzdGF0ZSBleGlzdHMgdG8gYmUgYWJsZSB0byBwcm92aWRlIHJlYXNvbmluZyBmb3IgYSB0cmlwcGVkIHN0YXRlIGR1cmluZyBub3JtYWwKKyAqIGludGVyZmFjZSBvcGVyYXRpb25zLCBhcyB3ZWxsIGFzIHRvIGFsbG93IGNsaWVudCB0byB0cmlwIHRoZSBjb21wb25lbnQgb24gZGVtYW5kLgorICovCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyQm9vbFZhbHVlLCBrUGFyYW1JbmRleFRyaXBwZWQ+CisgICAgICAgIEMyVHJpcHBlZFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1RSSVBQRURbXSA9ICJhbGdvLnRyaXBwZWQiOworCisvKioKKyAqIENvbmZpZ3VyYXRpb24gY291bnRlcnMuCisgKgorICogQ29uZmlndXJhdGlvbnMgYXJlIHRyYWNrZWQgdXNpbmcgdGhyZWUgY291bnRlcnMuIFRoZSBpbnB1dCBjb3VudGVyIGlzIGluY3JlbWVudGVkIGV4YWN0bHkKKyAqIG9uY2Ugd2l0aCBlYWNoIHdvcmsgYWNjZXB0ZWQgYnkgdGhlIGNvbXBvbmVudC4gVGhlIG91dHB1dCBjb3VudGVyIGlzIGluY3JlbWVudGVkIGV4YWN0bHkKKyAqIG9uY2Ugd2l0aCBlYWNoIHdvcmsgY29tcGxldGVkIGJ5IHRoZSBjb21wb25lbnQgKGluIHRoZSBvcmRlciBvZiB3b3JrIGNvbXBsZXRpb24pLiBUaGUKKyAqIGdsb2JhbCBjb3VudGVyIGlzIGluY3JlbWVudGVkIGV4YWN0bHkgb25jZSBkdXJpbmcgdG8gZWFjaCBjb25maWcoKSBjYWxsLiBUaGVzZSBjb3VudGVycworICogc2hhbGwgYmUgcmVhZC1vbmx5LgorICoKKyAqIFRPRE86IHRoZXNlIHNob3VsZCBiZSBjb3VudGVycy4KKyAqLwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJVaW50NjRWYWx1ZSwga1BhcmFtSW5kZXhDb25maWdDb3VudGVyPiBDMlBvcnRDb25maWdDb3VudGVyVHVuaW5nOwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQ2NFZhbHVlLCBrUGFyYW1JbmRleENvbmZpZ0NvdW50ZXI+IEMyQ29uZmlnQ291bnRlclR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX0NPVU5URVJbXSA9ICJpbnB1dC5idWZmZXJzLmNvdW50ZXIiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX0NPVU5URVJbXSA9ICJvdXRwdXQuYnVmZmVycy5jb3VudGVyIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NPTkZJR19DT1VOVEVSW10gPSAiYWxnby5jb25maWcuY291bnRlciI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHJlc291cmNlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIFJlc291cmNlcyBuZWVkZWQgYW5kIHJlc291cmNlcyByZXNlcnZlZCBmb3IgY3VycmVudCBjb25maWd1cmF0aW9uLgorICoKKyAqIFJlc291cmNlcyBhcmUgdHJhY2tlZCBhcyBhIHZlY3RvciBvZiBwb3NpdGl2ZSBudW1iZXJzLiBBdmFpbGFibGUgcmVzb3VyY2VzIGFyZSBkZWZpbmVkIGJ5CisgKiB0aGUgdmVuZG9yLgorICoKKyAqIEJ5IGRlZmF1bHQsIG5vIHJlc291cmNlcyBhcmUgcmVzZXJ2ZWQgZm9yIGEgY29tcG9uZW50LiBJZiByZXNvdXJjZSByZXNlcnZhdGlvbiBpcyBzdWNjZXNzZnVsLAorICogdGhlIGNvbXBvbmVudCBzaGFsbCBiZSBhYmxlIHRvIHVzZSB0aG9zZSByZXNvdXJjZXMgZXhjbHVzaXZlbHkuIElmIGhvd2V2ZXIsIHRoZSBjb21wb25lbnQgaXMKKyAqIG5vdCB1c2luZyBhbGwgb2YgdGhlIHJlc2VydmVkIHJlc291cmNlcywgdGhvc2UgbWF5IGJlIHNoYXJlZCB3aXRoIG90aGVyIGNvbXBvbmVudHMuCisgKgorICogVE9ETzogZGVmaW5lIHNvbWUgb2YgdGhlIHJlc291cmNlcy4KKyAqLwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQ2NEFycmF5LCBrUGFyYW1JbmRleFJlc291cmNlc05lZWRlZD4gQzJSZXNvdXJjZXNOZWVkZWRUdW5pbmc7Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyVWludDY0QXJyYXksIGtQYXJhbUluZGV4UmVzb3VyY2VzUmVzZXJ2ZWQ+CisgICAgICAgIEMyUmVzb3VyY2VzUmVzZXJ2ZWRUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9SRVNPVVJDRVNfTkVFREVEW10gPSAicmVzb3VyY2VzLm5lZWRlZCI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9SRVNPVVJDRVNfUkVTRVJWRURbXSA9ICJyZXNvdXJjZXMucmVzZXJ2ZWQiOworCisvKioKKyAqIE9wZXJhdGluZyByYXRlLgorICoKKyAqIE9wZXJhdGluZyByYXRlIGlzIHRoZSBleHBlY3RlZCByYXRlIG9mIHdvcmsgdGhyb3VnaCB0aGUgY29tcG9uZW50LiBOZWdhdGl2ZSB2YWx1ZXMgaXMKKyAqIGludmFsaWQuCisgKgorICogVE9ETzogdGhpcyBjb3VsZCBkaXN0aW5ndWlzaCBzZXQgdmFsdWUKKyAqLwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMkZsb2F0VmFsdWUsIGtQYXJhbUluZGV4T3BlcmF0aW5nUmF0ZT4gQzJPcGVyYXRpbmdSYXRlVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1BFUkFUSU5HX1JBVEVbXSA9ICJhbGdvLnJhdGUiOworCisvKioKKyAqIFJlYWx0aW1lIC8gb3BlcmF0aW5nIHBvaW50LgorICoKKyAqIFByaW9yaXR5IHZhbHVlIGRlZmluZXMgdGhlIG9wZXJhdGluZyBwb2ludCBmb3IgdGhlIGNvbXBvbmVudC4gT3BlcmF0aW5nIHBvaW50cyBhcmUgZGVmaW5lZCBieQorICogdGhlIHZlbmRvci4gUHJpb3JpdHkgdmFsdWUgb2YgMCBtZWFucyB0aGF0IHRoZSBjbGllbnQgcmVxdWlyZXMgb3BlcmF0aW9uIGF0IHRoZSBnaXZlbiBvcGVyYXRpbmcKKyAqIHJhdGUuIFByaW9yaXR5IHZhbHVlcyAtMSBhbmQgYmVsb3cgZGVmaW5lIG9wZXJhdGluZyBwb2ludHMgaW4gZGVjcmVhc2luZyBwZXJmb3JtYW5jZS4gSW4gdGhpcworICogY2FzZSBjbGllbnQgZXhwZWN0cyBiZXN0IGVmZm9ydCB3aXRob3V0IGV4Y2VlZGluZyB0aGUgc3BlY2lmaWMgb3BlcmF0aW5nIHBvaW50LiBUaGlzIGFsbG93cworICogY2xpZW50IHRvIHJ1biBjb21wb25lbnRzIGRlZXBlciBpbiB0aGUgYmFja2dyb3VuZCBieSB1c2luZyBsYXJnZXIgcHJpb3JpdHkgdmFsdWVzLiBJbiB0aGVzZQorICogY2FzZXMgb3BlcmF0aW5nIHJhdGUgaXMgYSBoaW50IGZvciB0aGUgbWF4aW11bSByYXRlIHRoYXQgdGhlIGNsaWVudCBhbnRpY2lwYXRlcy4KKyAqCisgKiBPcGVyYXRpbmcgcmF0ZSBhbmQgcHJpb3JpdHkgYXJlIHVzZWQgaW4gdGFuZGVtLiBFLmcuIGlmIHRoZXJlIGFyZSBjb21wb25lbnRzIHRoYXQgcnVuIGF0IGEKKyAqIGhpZ2hlciBvcGVyYXRpbmcgcG9pbnQgKHByaW9yaXR5KSBpdCB3aWxsIG1ha2UgbW9yZSByZXNvdXJjZXMgYXZhaWxhYmxlIGZvciBjb21wb25lbnRzIGF0CisgKiBhIGxvd2VyIG9wZXJhdGluZyBwb2ludCwgc28gb3BlcmF0aW5nIHJhdGUgY2FuIGJlIHVzZWQgdG8gZ2F0ZSB0aG9zZSBjb21wb25lbnRzLgorICoKKyAqIFBvc2l0aXZlIHByaW9yaXR5IHZhbHVlcyBhcmUgbm90IGRlZmluZWQgYXQgdGhlIG1vbWVudCBhbmQgc2hhbGwgYmUgdHJlYXRlZCBlcXVpdmFsZW50IHRvIDAuCisgKi8KK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJJbnQzMlZhbHVlLCBrUGFyYW1JbmRleFJlYWxUaW1lUHJpb3JpdHk+CisgICAgICAgIEMyUmVhbFRpbWVQcmlvcml0eVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BSSU9SSVRZW10gPSAiYWxnby5wcmlvcml0eSI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcHJvdGVjdGVkIGNvbnRlbnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIFNlY3VyZSBtb2RlLgorICovCitDMkVOVU0oQzJDb25maWc6OnNlY3VyZV9tb2RlX3QsIHVpbnQzMl90LAorICAgIFNNX1VOUFJPVEVDVEVELCAgICAvLy88IG5vIGNvbnRlbnQgcHJvdGVjdGlvbgorICAgIFNNX1JFQURfUFJPVEVDVEVELCAvLy88IGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBzaGFsbCBiZSBwcm90ZWN0ZWQgZnJvbSByZWFkaW5nCispCisKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbmZpZzo6c2VjdXJlX21vZGVfdD4sIGtQYXJhbUluZGV4U2VjdXJlTW9kZT4KKyAgICAgICAgQzJTZWN1cmVNb2RlVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfU0VDVVJFX01PREVbXSA9ICJhbGdvLnNlY3VyZS1tb2RlIjsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBFTkNPREVSIENPTVBPTkVOVFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIEJpdHJhdGUKKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhCaXRyYXRlPiBDMlN0cmVhbUJpdHJhdGVJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQklUUkFURVtdID0gImNvZGVkLmJpdHJhdGUiOworCisvKioKKyAqIEJpdHJhdGUgbW9kZS4KKyAqCisgKiBUT0RPOiByZWZpbmUgdGhpcyB3aXRoIGJpdHJhdGUgcmFuZ2VzIGFuZCBzdWdnZXN0ZWQgd2luZG93CisgKi8KK0MyRU5VTShDMkNvbmZpZzo6Yml0cmF0ZV9tb2RlX3QsIHVpbnQzMl90LAorICAgIEJJVFJBVEVfQ09OU1RfU0tJUF9BTExPV0VEID0gMCwgICAgICAvLy88IGNvbnN0YW50IGJpdHJhdGUsIGZyYW1lIHNraXBwaW5nIGFsbG93ZWQKKyAgICBCSVRSQVRFX0NPTlNUID0gMSwgICAgICAgICAgICAgICAgICAgLy8vPCBjb25zdGFudCBiaXRyYXRlLCBrZWVwIGFsbCBmcmFtZXMKKyAgICBCSVRSQVRFX1ZBUklBQkxFX1NLSVBfQUxMT1dFRCA9IDIsICAgLy8vPCBiaXRyYXRlIGNhbiB2YXJ5LCBmcmFtZSBza2lwcGluZyBhbGxvd2VkCisgICAgQklUUkFURV9WQVJJQUJMRSA9IDMsICAgICAgICAgICAgICAgIC8vLzwgYml0cmF0ZSBjYW4gdmFyeSwga2VlcCBhbGwgZnJhbWVzCisgICAgQklUUkFURV9JR05PUkUgPSA3LCAgICAgICAgICAgICAgICAgIC8vLzwgYml0cmF0ZSBjYW4gYmUgZXhjZWVkZWQgYXQgd2lsbCB0byBhY2hpZXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgcXVhbGl0eSBvciBvdGhlciBzZXR0aW5ncworCisgICAgLy8gYml0cmF0ZSBtb2RlcyBhcmUgY29tcG9zZWQgb2YgdGhlIGZvbGxvd2luZyBmbGFncworICAgIEJJVFJBVEVfRkxBR19LRUVQX0FMTF9GUkFNRVMgPSAxLAorICAgIEJJVFJBVEVfRkxBR19DQU5fVkFSWSA9IDIsCisgICAgQklUUkFURV9GTEFHX0NBTl9FWENFRUQgPSA0LAorKQorCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OmJpdHJhdGVfbW9kZV90PiwKKyAgICAgICAgICAgICAgICBrUGFyYW1JbmRleEJpdHJhdGVNb2RlPgorICAgICAgICBDMlN0cmVhbUJpdHJhdGVNb2RlVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQklUUkFURV9NT0RFW10gPSAiYWxnby5iaXRyYXRlLW1vZGUiOworCisvKioKKyAqIFF1YWxpdHkuCisgKgorICogVGhpcyBpcyBkZWZpbmVkIGJ5IGVhY2ggY29tcG9uZW50LCB0aGUgaGlnaGVyIHRoZSBiZXR0ZXIgdGhlIG91dHB1dCBxdWFsaXR5IGF0IHRoZSBleHBlbnNlIG9mCisgKiBsZXNzIGNvbXByZXNzaW9uIGVmZmljaWVuY3kuIFRoaXMgc2V0dGluZyBpcyBkZWZpbmVkIGZvciB0aGUgb3V0cHV0IHN0cmVhbXMgaW4gY2FzZSB0aGUKKyAqIGNvbXBvbmVudCBjYW4gc3VwcG9ydCB2YXJ5aW5nIHF1YWxpdHkgb24gZWFjaCBzdHJlYW0sIG9yIGFzIGFuIG91dHB1dCBwb3J0IHR1bmluZyBpbiBjYXNlIHRoZQorICogcXVhbGl0eSBpcyBnbG9iYWwgdG8gYWxsIHN0cmVhbXMuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhRdWFsaXR5PiBDMlN0cmVhbVF1YWxpdHlUdW5pbmc7Cit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleFF1YWxpdHk+IEMyUXVhbGl0eVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1FVQUxJVFlbXSA9ICJhbGdvLnF1YWxpdHkiOworCisvKioKKyAqIENvbXBsZXhpdHkuCisgKgorICogVGhpcyBpcyBkZWZpbmVkIGJ5IGVhY2ggY29tcG9uZW50LCB0aGlzIGhpZ2hlciB0aGUgdmFsdWUsIHRoZSBtb3JlIHJlc291cmNlcyB0aGUgY29tcG9uZW50CisgKiB3aWxsIHVzZSB0byBwcm9kdWNlIGJldHRlciBxdWFsaXR5IGF0IHRoZSBzYW1lIGNvbXByZXNzaW9uIGVmZmljaWVuY3kgb3IgYmV0dGVyIGNvbXByZXNzaW9uCisgKiBlZmZpY2llbmN5IGF0IHRoZSBzYW1lIHF1YWxpdHkuIFRoaXMgc2V0dGluZyBpcyBkZWZpbmVkIGZvciB0aGUgb3V0cHV0IHN0cmVhbXMgaW4gY2FzZSB0aGUKKyAqIGNvbXBvbmVudCBjYW4gc3VwcG9ydCB2YXJ5aW5nIGNvbXBsZXhpdHkgb24gZWFjaCBzdHJlYW0sIG9yIGFzIGFuIG91dHB1dCBwb3J0IHR1bmluZyBpbiBjYXNlIHRoZQorICogcXVhbGl0eSBpcyBnbG9iYWwgdG8gYWxsIHN0cmVhbXMKKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleENvbXBsZXhpdHk+IEMyU3RyZWFtQ29tcGxleGl0eVR1bmluZzsKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4Q29tcGxleGl0eT4gQzJDb21wbGV4aXR5VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09NUExFWElUWVtdID0gImFsZ28uY29tcGxleGl0eSI7CisKKy8qKgorICogSGVhZGVyIChpbml0LWRhdGEpIGhhbmRsaW5nIGFyb3VuZCBzeW5jIGZyYW1lcy4KKyAqLworQzJFTlVNKEMyQ29uZmlnOjpwcmVwZW5kX2hlYWRlcl9tb2RlX3QsIHVpbnQzMl90LAorICAgIC8qKgorICAgICAqIGRvbid0IHByZXBlbmQgaGVhZGVyLiBTaWduYWwgaGVhZGVyIG9ubHkgdGhyb3VnaCBDMlN0cmVhbUluaXREYXRhSW5mby4KKyAgICAgKi8KKyAgICBQUkVQRU5EX0hFQURFUl9UT19OT05FLAorCisgICAgLyoqCisgICAgICogcHJlcGVuZCBoZWFkZXIgYmVmb3JlIHRoZSBmaXJzdCBvdXRwdXQgZnJhbWUgYW5kIHRoZXJlYWZ0ZXIgYmVmb3JlIHRoZSBuZXh0IHN5bmMgZnJhbWUKKyAgICAgKiBpZiBpdCBjaGFuZ2VzLgorICAgICAqLworICAgIFBSRVBFTkRfSEVBREVSX09OX0NIQU5HRSwKKworICAgIC8qKgorICAgICAqIHByZXBlbmQgaGVhZGVyIGJlZm9yZSBldmVyeSBzeW5jIGZyYW1lLgorICAgICAqLworICAgIFBSRVBFTkRfSEVBREVSX1RPX0FMTF9TWU5DLAorKQorCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjpwcmVwZW5kX2hlYWRlcl9tb2RlX3Q+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4UHJlcGVuZEhlYWRlck1vZGU+CisgICAgICAgIEMyUHJlcGVuZEhlYWRlck1vZGVTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUFJFUEVORF9IRUFERVJfTU9ERVtdID0gIm91dHB1dC5idWZmZXJzLnByZXBlbmQtaGVhZGVyIjsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSU1BR0UvVklERU8gQ09NUE9ORU5UUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKgorICogT3JkZXIgb2YgdHJhbnNmb3JtYXRpb24gaXM6CisgKgorICogY3JvcCA9PiAoc2NhbGluZyA9PiBzY2FsZWQtY3JvcCkgPT4gc2FtcGxlLWFzcGVjdC1yYXRpbyA9PiBmbGlwID0+IHJvdGF0aW9uCisgKi8KKworLyoqCisgKiBQaWN0dXJlIChpbWFnZS0gYW5kIHZpZGVvIGZyYW1lKSBzaXplLgorICoKKyAqIFRoaXMgaXMgdXNlZCBmb3IgdGhlIG91dHB1dCBvZiB0aGUgdmlkZW8gZGVjb2RlciwgYW5kIHRoZSBpbnB1dCBvZiB0aGUgdmlkZW8gZW5jb2Rlci4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJQaWN0dXJlU2l6ZVN0cnVjdCwga1BhcmFtSW5kZXhQaWN0dXJlU2l6ZT4gQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkVbXSA9ICJyYXcuc2l6ZSI7CisKKy8qKgorICogQ3JvcCByZWN0YW5nbGUuCisgKi8KK3N0cnVjdCBDMlJlY3RTdHJ1Y3QgOiBDMlJlY3QgeworICAgIEMyUmVjdFN0cnVjdCgpID0gZGVmYXVsdDsKKyAgICBDMlJlY3RTdHJ1Y3QoY29uc3QgQzJSZWN0ICZyZWN0KSA6IEMyUmVjdChyZWN0KSB7IH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMlJlY3RTdHJ1Y3QgJikgPSBkZWxldGU7CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEMyUmVjdFN0cnVjdCAmKSA9IGRlbGV0ZTsKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQkFTRV9DMlNUUlVDVChSZWN0KQorICAgIEMyRklFTEQod2lkdGgsICJ3aWR0aCIpCisgICAgQzJGSUVMRChoZWlnaHQsICJoZWlnaHQiKQorICAgIEMyRklFTEQobGVmdCwgImxlZnQiKQorICAgIEMyRklFTEQodG9wLCAidG9wIikKK307CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyUmVjdFN0cnVjdCwga1BhcmFtSW5kZXhDcm9wUmVjdD4gQzJTdHJlYW1Dcm9wUmVjdEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DUk9QX1JFQ1RbXSA9ICJyYXcuY3JvcCI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT0RFRF9DUk9QX1JFQ1RbXSA9ICJjb2RlZC5jcm9wIjsKKworLyoqCisgKiBQaXhlbCBmb3JtYXQuCisgKi8KKy8vIFRPRE86IGRlZmluZSBzb21lCisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4UGl4ZWxGb3JtYXQ+IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUElYRUxfRk9STUFUW10gPSAicmF3LnBpeGVsLWZvcm1hdCI7CisKKy8qKgorICogRXh0ZW5kZWQgcm90YXRpb24gaW5mb3JtYXRpb24gYWxzbyBpbmNvcnBvcmF0aW5nIGEgZmxpcC4KKyAqCisgKiBSb3RhdGlvbiBpcyBjb3VudGVyIGNsb2NrLXdpc2UuCisgKi8KK3N0cnVjdCBDMlJvdGF0aW9uU3RydWN0IHsKKyAgICBDMlJvdGF0aW9uU3RydWN0KGludDMyX3Qgcm90YXRpb24gPSAwKQorICAgICAgICA6IGZsaXAoMCksIHZhbHVlKHJvdGF0aW9uKSB7IH0KKworICAgIGludDMyX3QgZmxpcDsgICAvLy88IGhvcml6b250YWwgZmxpcCAobGVmdC1yaWdodCBmbGlwIGFwcGxpZWQgcHJpb3IgdG8gcm90YXRpb24pCisgICAgaW50MzJfdCB2YWx1ZTsgIC8vLzwgcm90YXRpb24gaW4gZGVncmVlcyBjb3VudGVyIGNsb2Nrd2lzZQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9CQVNFX0MyU1RSVUNUKFJvdGF0aW9uKQorICAgIEMyRklFTEQoZmxpcCwgImZsaXAiKQorICAgIEMyRklFTEQodmFsdWUsICJ2YWx1ZSIpCit9OworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlJvdGF0aW9uU3RydWN0LCBrUGFyYW1JbmRleFJvdGF0aW9uPiBDMlN0cmVhbVJvdGF0aW9uSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1JPVEFUSU9OW10gPSAicmF3LnJvdGF0aW9uIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1ZVSV9ST1RBVElPTltdID0gImNvZGVkLnZ1aS5yb3RhdGlvbiI7CisKKy8qKgorICogUGl4ZWwgKHNhbXBsZSkgYXNwZWN0IHJhdGlvLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlBpY3R1cmVTaXplU3RydWN0LCBrUGFyYW1JbmRleFBpeGVsQXNwZWN0UmF0aW8+CisgICAgICAgIEMyU3RyZWFtUGl4ZWxBc3BlY3RSYXRpb0luZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QSVhFTF9BU1BFQ1RfUkFUSU9bXSA9ICJyYXcuc2FyIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1ZVSV9QSVhFTF9BU1BFQ1RfUkFUSU9bXSA9ICJjb2RlZC52dWkuc2FyIjsKKworLyoqCisgKiBJbi1saW5lIHNjYWxpbmcuCisgKgorICogQ29tcG9uZW50cyBjYW4gb3B0aW9uYWxseSBzdXBwb3J0IHNjYWxpbmcgb2YgcmF3IGltYWdlL3ZpZGVvIGZyYW1lcy4gIE9yIHNjYWxpbmcgb25seSBhCisgKiBwb3J0aW9uIG9mIHJhdyBpbWFnZS92aWRlbyBmcmFtZXMgKHNjYWxlZC1jcm9wKS4KKyAqLworCitDMkVOVU0oQzJDb25maWc6OnNjYWxpbmdfbWV0aG9kX3QsIHVpbnQzMl90LAorICAgIFNDQUxJTkdfQVJCSVRSQVJZLCAgIC8vLzwgYXJiaXRyYXJ5LCB1bnNwZWNpZmllZAorKQorCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OnNjYWxpbmdfbWV0aG9kX3Q+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4U2NhbGluZ01ldGhvZD4KKyAgICAgICAgQzJTdHJlYW1TY2FsaW5nTWV0aG9kVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfU0NBTElOR19NT0RFW10gPSAicmF3LnNjYWxpbmctbWV0aG9kIjsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlBpY3R1cmVTaXplU3RydWN0LCBrUGFyYW1JbmRleFNjYWxlZFBpY3R1cmVTaXplPgorICAgICAgICBDMlN0cmVhbVNjYWxlZFBpY3R1cmVTaXplVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfU0NBTEVEX1BJQ1RVUkVfU0laRVtdID0gInJhdy5zY2FsZWQtc2l6ZSI7CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJSZWN0U3RydWN0LCBrUGFyYW1JbmRleFNjYWxlZENyb3BSZWN0PgorICAgICAgICBDMlN0cmVhbVNjYWxlZENyb3BSZWN0VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfU0NBTEVEX0NST1BfUkVDVFtdID0gInJhdy5zY2FsZWQtY3JvcCI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gY29sb3IgaW5mb3JtYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIENvbG9yIEluZm8KKyAqCisgKiBDaHJvbWEgbG9jYXRpb24gY2FuIHZhcnkgZm9yIHRvcCBhbmQgYm90dG9tIGZpZWxkcywgc28gdXNlIGFuIGFycmF5LCB0aGF0IGNhbiBoYXZlIDAgdG8gMgorICogdmFsdWVzLiBFbXB0eSBhcnJheSBpcyB1c2VkIGZvciBub24gWVVWIGZvcm1hdHMuCisgKi8KKworc3RydWN0IEMyQ29sb3IgeworICAgIGVudW0gbWF0cml4X3QgOiB1aW50MzJfdDsgIC8vLzwgbWF0cml4IGNvZWZmaWNpZW50IChZVVYgPD0+IFJHQikKKyAgICBlbnVtIHBsYW5lX2xheW91dF90IDogdWludDMyX3Q7ICAvLy88IHBsYW5lIGxheW91dCBmb3IgZmxleGlibGUgZm9ybWF0cworICAgIGVudW0gcHJpbWFyaWVzX3QgOiB1aW50MzJfdDsgIC8vLzwgY29sb3IgcHJpbWFyaWVzIGFuZCB3aGl0ZSBwb2ludAorICAgIGVudW0gcmFuZ2VfdCA6IHVpbnQzMl90OyAgLy8vPCByYW5nZSBvZiBjb2xvciBjb21wb25lbnQgdmFsdWVzCisgICAgZW51bSBzdWJzYW1wbGluZ190IDogdWludDMyX3Q7ICAvLy88IGNocm9tYSBzdWJzYW1wbGluZworICAgIGVudW0gdHJhbnNmZXJfdCA6IHVpbnQzMl90OyAgLy8vPCB0cmFuc2ZlciBmdW5jdGlvbgorfTsKKworLy8vIENocm9tYSBzdWJzYW1wbGluZworQzJFTlVNKEMyQ29sb3I6OnN1YnNhbXBsaW5nX3QsIHVpbnQzMl90LAorICAgIE1PTk9DSFJPTUUsICAgICAvLy88IHRoZXJlIGFyZSBubyBDciBub3IgQ2IgcGxhbmVzCisgICAgTU9OT0NIUk9NRV9BTFBIQSwgLy8vPCB0aGVyZSBhcmUgbm8gQ3Igbm9yIENiIHBsYW5lcywgYnV0IHRoZXJlIGlzIGFuIGFscGhhIHBsYW5lCisgICAgUkdCLCAgICAgICAgICAgIC8vLzwgUkdCCisgICAgUkdCQSwgICAgICAgICAgIC8vLzwgUkdCQQorICAgIFlVVl80MjAsICAgICAgICAvLy88IENyIGFuZCBDYiBwbGFuZXMgYXJlIHN1YnNhbXBsZWQgYnkgMiBib3RoIGhvcml6b250YWxseSBhbmQgdmVydGljYWxseQorICAgIFlVVl80MjIsICAgICAgICAvLy88IENyIGFuZCBDYiBwbGFuZXMgYXJlIHN1YnNhbXBsZWQgaG9yaXpvbnRhbGx5CisgICAgWVVWXzQ0NCwgICAgICAgIC8vLzwgQ3IgYW5kIENiIHBsYW5lcyBhcmUgbm90IHN1YnNhbXBsZWQKKyAgICBZVVZBXzQ0NCwgICAgICAgLy8vPCBDciBhbmQgQ2IgcGxhbmVzIGFyZSBub3Qgc3Vic2FtcGxlZCwgdGhlcmUgaXMgYW4gYWxwaGEgcGxhbmUKKykKKworc3RydWN0IEMyQ2hyb21hT2Zmc2V0U3RydWN0IHsKKyAgICAvLyBjaHJvbWEgb2Zmc2V0cyBkZWZpbmVkIGJ5IElUVQorICAgIGNvbnN0ZXhwciBzdGF0aWMgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgSVRVX1lVVl80NDQoKSB7IHJldHVybiB7IDAuMGYsIDAuMGYgfTsgfQorICAgIGNvbnN0ZXhwciBzdGF0aWMgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgSVRVX1lVVl80MjIoKSB7IHJldHVybiB7IDAuMGYsIDAuMGYgfTsgfQorICAgIGNvbnN0ZXhwciBzdGF0aWMgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgSVRVX1lVVl80MjBfMCgpIHsgcmV0dXJuIHsgMC4wZiwgMC41ZiB9OyB9CisgICAgY29uc3RleHByIHN0YXRpYyBDMkNocm9tYU9mZnNldFN0cnVjdCBJVFVfWVVWXzQyMF8xKCkgeyByZXR1cm4geyAwLjVmLCAwLjVmIH07IH0KKyAgICBjb25zdGV4cHIgc3RhdGljIEMyQ2hyb21hT2Zmc2V0U3RydWN0IElUVV9ZVVZfNDIwXzIoKSB7IHJldHVybiB7IDAuMGYsIDAuMGYgfTsgfQorICAgIGNvbnN0ZXhwciBzdGF0aWMgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgSVRVX1lVVl80MjBfMygpIHsgcmV0dXJuIHsgMC41ZiwgMC4wZiB9OyB9CisgICAgY29uc3RleHByIHN0YXRpYyBDMkNocm9tYU9mZnNldFN0cnVjdCBJVFVfWVVWXzQyMF80KCkgeyByZXR1cm4geyAwLjBmLCAxLjBmIH07IH0KKyAgICBjb25zdGV4cHIgc3RhdGljIEMyQ2hyb21hT2Zmc2V0U3RydWN0IElUVV9ZVVZfNDIwXzUoKSB7IHJldHVybiB7IDAuNWYsIDEuMGYgfTsgfQorCisgICAgZmxvYXQgeDsgICAgLy8vPCB4IG9mZnNldCBpbiBwaXhlbHMgKHRvd2FyZHMgcmlnaHQpCisgICAgZmxvYXQgeTsgICAgLy8vPCB5IG9mZnNldCBpbiBwaXhlbHMgKHRvd2FyZHMgZG93bikKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoQ2hyb21hT2Zmc2V0KQorICAgIEMyRklFTEQoeCwgIngiKQorICAgIEMyRklFTEQoeSwgInkiKQorfTsKKworc3RydWN0IEMyQ29sb3JJbmZvU3RydWN0IHsKKyAgICBDMkNvbG9ySW5mb1N0cnVjdCgpCisgICAgICAgIDogYml0RGVwdGgoOCksIHN1YnNhbXBsaW5nKEMyQ29sb3I6OllVVl80MjApIHsgfQorCisgICAgdWludDMyX3QgYml0RGVwdGg7CisgICAgQzJDb2xvcjo6c3Vic2FtcGxpbmdfdCBzdWJzYW1wbGluZzsKKyAgICBDMkNocm9tYU9mZnNldFN0cnVjdCBsb2NhdGlvbnNbXTsgLy8gbWF4IDIgZWxlbWVudHMKKworICAgIEMyQ29sb3JJbmZvU3RydWN0KAorICAgICAgICAgICAgc2l6ZV90IC8qIGZsZXhDb3VudCAqLywgdWludDMyX3QgYml0RGVwdGhfLCBDMkNvbG9yOjpzdWJzYW1wbGluZ190IHN1YnNhbXBsaW5nXykKKyAgICAgICAgOiBiaXREZXB0aChiaXREZXB0aF8pLCBzdWJzYW1wbGluZyhzdWJzYW1wbGluZ18pIHsgfQorCisgICAgQzJDb2xvckluZm9TdHJ1Y3QoCisgICAgICAgICAgICBzaXplX3QgZmxleENvdW50LCB1aW50MzJfdCBiaXREZXB0aF8sIEMyQ29sb3I6OnN1YnNhbXBsaW5nX3Qgc3Vic2FtcGxpbmdfLAorICAgICAgICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PEMyQ2hyb21hT2Zmc2V0U3RydWN0PiBsb2NhdGlvbnNfKQorICAgICAgICA6IGJpdERlcHRoKGJpdERlcHRoXyksIHN1YnNhbXBsaW5nKHN1YnNhbXBsaW5nXykgeworICAgICAgICBzaXplX3QgaXggPSAwOworICAgICAgICBmb3IgKGNvbnN0IEMyQ2hyb21hT2Zmc2V0U3RydWN0ICZsb2NhdGlvbiA6IGxvY2F0aW9uc18pIHsKKyAgICAgICAgICAgIGlmIChpeCA9PSBmbGV4Q291bnQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvY2F0aW9uc1tpeF0gPSBsb2NhdGlvbjsKKyAgICAgICAgICAgICsraXg7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoQ29sb3JJbmZvLCBsb2NhdGlvbnMpCisgICAgQzJGSUVMRChiaXREZXB0aCwgImJpdC1kZXB0aCIpCisgICAgQzJGSUVMRChzdWJzYW1wbGluZywgInN1YnNhbXBsaW5nIikKKyAgICBDMkZJRUxEKGxvY2F0aW9ucywgImxvY2F0aW9ucyIpCit9OworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkNvbG9ySW5mb1N0cnVjdCwga1BhcmFtSW5kZXhDb2xvckluZm8+IEMyU3RyZWFtQ29sb3JJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09MT1JfSU5GT1tdID0gInJhdy5jb2xvci1mb3JtYXQiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09ERURfQ09MT1JfSU5GT1tdID0gImNvZGVkLmNvbG9yLWZvcm1hdCI7CisKKy8qKgorICogQ29sb3IgQXNwZWN0cworICovCisKKy8qIFRoZSBtZWFuaW5nIG9mIHRoZSBmb2xsb3dpbmcgZW51bWVyYXRvcnMgaXMgYXMgZGVzY3JpYmVkIGluIElUVS1UIEguMjczLiAqLworCisvLy8gUmFuZ2UKK0MyRU5VTShDMkNvbG9yOjpyYW5nZV90LCB1aW50MzJfdCwKKyAgICBSQU5HRV9VTlNQRUNJRklFRCwgICAgICAgICAgLy8vPCByYW5nZSBpcyB1bnNwZWNpZmllZAorICAgIFJBTkdFX0ZVTEwsICAgICAgICAgICAgICAgICAvLy88IGZ1bGwgcmFuZ2UKKyAgICBSQU5HRV9MSU1JVEVELCAgICAgICAgICAgICAgLy8vPCBsaW1pdGVkIHJhbmdlCisKKyAgICBSQU5HRV9WRU5ET1JfU1RBUlQgPSAweDgwLCAgLy8vPCB2ZW5kb3Itc3BlY2lmaWMgcmFuZ2UgdmFsdWVzIHN0YXJ0IGhlcmUKKyAgICBSQU5HRV9PVEhFUiA9IDBYRkYgICAgICAgICAgLy8vPCBtYXggdmFsdWUsIHJlc2VydmVkIGZvciB1bmRlZmluZWQgdmFsdWVzCispCisKKy8vLyBDb2xvciBwcmltYXJpZXMKK0MyRU5VTShDMkNvbG9yOjpwcmltYXJpZXNfdCwgdWludDMyX3QsCisgICAgUFJJTUFSSUVTX1VOU1BFQ0lGSUVELCAgICAgICAgICAvLy88IHByaW1hcmllcyBhcmUgdW5zcGVjaWZpZWQKKyAgICBQUklNQVJJRVNfQlQ3MDksICAgICAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjcwOS02IG9yIGVxdWl2YWxlbnQKKyAgICBQUklNQVJJRVNfQlQ0NzBfTSwgICAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjQ3MC02IFN5c3RlbSBNIG9yIGVxdWl2YWxlbnQKKyAgICBQUklNQVJJRVNfQlQ2MDFfNjI1LCAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjYwMS02IDYyNSBvciBlcXVpdmFsZW50CisgICAgUFJJTUFSSUVTX0JUNjAxXzUyNSwgICAgICAgICAgICAvLy88IFJlYy5JVFUtUiBCVC42MDEtNiA1MjUgb3IgZXF1aXZhbGVudAorICAgIFBSSU1BUklFU19HRU5FUklDX0ZJTE0sICAgICAgICAgLy8vPCBHZW5lcmljIEZpbG0KKyAgICBQUklNQVJJRVNfQlQyMDIwLCAgICAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjIwMjAgb3IgZXF1aXZhbGVudAorICAgIFBSSU1BUklFU19SUDQzMSwgICAgICAgICAgICAgICAgLy8vPCBTTVBURSBSUCA0MzEtMiBvciBlcXVpdmFsZW50CisgICAgUFJJTUFSSUVTX0VHNDMyLCAgICAgICAgICAgICAgICAvLy88IFNNUFRFIEVHIDQzMi0xIG9yIGVxdWl2YWxlbnQKKyAgICBQUklNQVJJRVNfRUJVMzIxMywgICAgICAgICAgICAgIC8vLzwgRUJVIFRlY2guMzIxMy1FIG9yIGVxdWl2YWxlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLworICAgIFBSSU1BUklFU19WRU5ET1JfU1RBUlQgPSAweDgwLCAgLy8vPCB2ZW5kb3Itc3BlY2lmaWMgcHJpbWFyaWVzIHZhbHVlcyBzdGFydCBoZXJlCisgICAgUFJJTUFSSUVTX09USEVSID0gMHhmZiAgICAgICAgICAvLy88IG1heCB2YWx1ZSwgcmVzZXJ2ZWQgZm9yIHVuZGVmaW5lZCB2YWx1ZXMKKykKKworLy8vIFRyYW5zZmVyIGZ1bmN0aW9uCitDMkVOVU0oQzJDb2xvcjo6dHJhbnNmZXJfdCwgdWludDMyX3QsCisgICAgVFJBTlNGRVJfVU5TUEVDSUZJRUQsICAgICAgICAgICAvLy88IHRyYW5zZmVyIGlzIHVuc3BlY2lmaWVkCisgICAgVFJBTlNGRVJfTElORUFSLCAgICAgICAgICAgICAgICAvLy88IExpbmVhciB0cmFuc2ZlciBjaGFyYWN0ZXJpc3RpY3MKKyAgICBUUkFOU0ZFUl9TUkdCLCAgICAgICAgICAgICAgICAgIC8vLzwgc1JHQiBvciBlcXVpdmFsZW50CisgICAgVFJBTlNGRVJfMTcwTSwgICAgICAgICAgICAgICAgICAvLy88IFNNUFRFIDE3ME0gb3IgZXF1aXZhbGVudCAoZS5nLiBCVC42MDEvNzA5LzIwMjApCisgICAgVFJBTlNGRVJfR0FNTUEyMiwgICAgICAgICAgICAgICAvLy88IEFzc3VtZWQgZGlzcGxheSBnYW1tYSAyLjIKKyAgICBUUkFOU0ZFUl9HQU1NQTI4LCAgICAgICAgICAgICAgIC8vLzwgQXNzdW1lZCBkaXNwbGF5IGdhbW1hIDIuOAorICAgIFRSQU5TRkVSX1NUMjA4NCwgICAgICAgICAgICAgICAgLy8vPCBTTVBURSBTVCAyMDg0IGZvciAxMC8xMi8xNC8xNiBiaXQgc3lzdGVtcworICAgIFRSQU5TRkVSX0hMRywgICAgICAgICAgICAgICAgICAgLy8vPCBBUklCIFNURC1CNjcgaHlicmlkLWxvZy1nYW1tYQorCisgICAgVFJBTlNGRVJfMjQwTSA9IDB4NDAsICAgICAgICAgICAvLy88IFNNUFRFIDI0ME0gb3IgZXF1aXZhbGVudAorICAgIFRSQU5TRkVSX1hWWUNDLCAgICAgICAgICAgICAgICAgLy8vPCBJRUMgNjE5NjYtMi00IG9yIGVxdWl2YWxlbnQKKyAgICBUUkFOU0ZFUl9CVDEzNjEsICAgICAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjEzNjEgZXh0ZW5kZWQgZ2FtdXQKKyAgICBUUkFOU0ZFUl9TVDQyOCwgICAgICAgICAgICAgICAgIC8vLzwgU01QVEUgU1QgNDI4LTEgb3IgZXF1aXZhbGVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vCisgICAgVFJBTlNGRVJfVkVORE9SX1NUQVJUID0gMHg4MCwgICAvLy88IHZlbmRvci1zcGVjaWZpYyB0cmFuc2ZlciB2YWx1ZXMgc3RhcnQgaGVyZQorICAgIFRSQU5TRkVSX09USEVSID0gMHhmZiAgICAgICAgICAgLy8vPCBtYXggdmFsdWUsIHJlc2VydmVkIGZvciB1bmRlZmluZWQgdmFsdWVzCispCisKKy8vLyBNYXRyaXggY29lZmZpY2llbnQKK0MyRU5VTShDMkNvbG9yOjptYXRyaXhfdCwgdWludDMyX3QsCisgICAgTUFUUklYX1VOU1BFQ0lGSUVELCAgICAgICAgICAgICAvLy88IG1hdHJpeCBjb2VmZmljaWVudHMgYXJlIHVuc3BlY2lmaWVkCisgICAgTUFUUklYX0JUNzA5LCAgICAgICAgICAgICAgICAgICAvLy88IFJlYy5JVFUtUiBCVC43MDktNSBvciBlcXVpdmFsZW50CisgICAgTUFUUklYX0ZDQzQ3XzczXzY4MiwgICAgICAgICAgICAvLy88IEZDQyBUaXRsZSA0NyBDRlIgNzMuNjgyIG9yIGVxdWl2YWxlbnQgKEtSPTAuMzAsIEtCPTAuMTEpCisgICAgTUFUUklYX0JUNjAxLCAgICAgICAgICAgICAgICAgICAvLy88IFJlYy5JVFUtUiBCVC40NzAsIEJULjYwMS02IDYyNSBvciBlcXVpdmFsZW50CisgICAgTUFUUklYXzI0ME0sICAgICAgICAgICAgICAgICAgICAvLy88IFNNUFRFIDI0ME0gb3IgZXF1aXZhbGVudAorICAgIE1BVFJJWF9CVDIwMjAsICAgICAgICAgICAgICAgICAgLy8vPCBSZWMuSVRVLVIgQlQuMjAyMCBub24tY29uc3RhbnQgbHVtaW5hbmNlCisgICAgTUFUUklYX0JUMjAyMF9DT05TVEFOVCwgICAgICAgICAvLy88IFJlYy5JVFUtUiBCVC4yMDIwIGNvbnN0YW50IGx1bWluYW5jZQorICAgIE1BVFJJWF9WRU5ET1JfU1RBUlQgPSAweDgwLCAgICAgLy8vPCB2ZW5kb3Itc3BlY2lmaWMgbWF0cml4IGNvZWZmaWNpZW50IHZhbHVlcyBzdGFydCBoZXJlCisgICAgTUFUUklYX09USEVSID0gMHhmZiwgICAgICAgICAgICAvLy88IG1heCB2YWx1ZSwgcmVzZXJ2ZWQgZm9yIHVuZGVmaW5lZCB2YWx1ZXMKKykKKworc3RydWN0IEMyQ29sb3JBc3BlY3RzU3RydWN0IHsKKyAgICBDMkNvbG9yOjpyYW5nZV90IHJhbmdlOworICAgIEMyQ29sb3I6OnByaW1hcmllc190IHByaW1hcmllczsKKyAgICBDMkNvbG9yOjp0cmFuc2Zlcl90IHRyYW5zZmVyOworICAgIEMyQ29sb3I6Om1hdHJpeF90IG1hdHJpeDsKKworICAgIEMyQ29sb3JBc3BlY3RzU3RydWN0KCkKKyAgICAgICAgOiByYW5nZShDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCksCisgICAgICAgICAgcHJpbWFyaWVzKEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCksCisgICAgICAgICAgdHJhbnNmZXIoQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQpLAorICAgICAgICAgIG1hdHJpeChDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpIHsgfQorCisgICAgQzJDb2xvckFzcGVjdHNTdHJ1Y3QoQzJDb2xvcjo6cmFuZ2VfdCByYW5nZV8sIEMyQ29sb3I6OnByaW1hcmllc190IHByaW1hcmllc18sCisgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6dHJhbnNmZXJfdCB0cmFuc2Zlcl8sIEMyQ29sb3I6Om1hdHJpeF90IG1hdHJpeF8pCisgICAgICAgIDogcmFuZ2UocmFuZ2VfKSwgcHJpbWFyaWVzKHByaW1hcmllc18pLCB0cmFuc2Zlcih0cmFuc2Zlcl8pLCBtYXRyaXgobWF0cml4Xykge30KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoQ29sb3JBc3BlY3RzKQorICAgIEMyRklFTEQocmFuZ2UsICJyYW5nZSIpCisgICAgQzJGSUVMRChwcmltYXJpZXMsICJwcmltYXJpZXMiKQorICAgIEMyRklFTEQodHJhbnNmZXIsICJ0cmFuc2ZlciIpCisgICAgQzJGSUVMRChtYXRyaXgsICJtYXRyaXgiKQorfTsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJDb2xvckFzcGVjdHNTdHJ1Y3QsIGtQYXJhbUluZGV4Q29sb3JBc3BlY3RzPgorICAgICAgICBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTW10gPSAicmF3LmNvbG9yIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1ZVSV9DT0xPUl9BU1BFQ1RTW10gPSAiY29kZWQudnVpLmNvbG9yIjsKKworLyoqCisgKiBEZWZhdWx0IGNvbG9yIGFzcGVjdHMgdG8gdXNlLiBUaGVzZSBjb21lIGZyb20gdGhlIGNvbnRhaW5lciBvciBjbGllbnQgYW5kIHNoYWxsIGJlIGhhbmRsZWQKKyAqIGFjY29yZGluZyB0byB0aGUgY29kaW5nIHN0YW5kYXJkLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyQ29sb3JBc3BlY3RzU3RydWN0LCBrUGFyYW1JbmRleERlZmF1bHRDb2xvckFzcGVjdHM+CisgICAgICAgIEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTW10gPSAiZGVmYXVsdC5jb2xvciI7CisKKy8qKgorICogSERSIFN0YXRpYyBNZXRhZGF0YSBJbmZvLgorICovCitzdHJ1Y3QgQzJDb2xvclh5U3RydWN0IHsKKyAgICBmbG9hdCB4OyAvLy88IHggY29sb3IgY29vcmRpbmF0ZSBpbiB4eVkgc3BhY2UgWzAtMV0KKyAgICBmbG9hdCB5OyAvLy88IHkgY29sb3IgY29vcmRpbmF0ZSBpbiB4eVkgc3BhY2UgWzAtMV0KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoQ29sb3JYeSkKKyAgICBDMkZJRUxEKHgsICJ4IikKKyAgICBDMkZJRUxEKHksICJ5IikKK307CisKK3N0cnVjdCBDMk1hc3RlcmluZ0Rpc3BsYXlDb2xvclZvbHVtZVN0cnVjdCB7CisgICAgQzJDb2xvclh5U3RydWN0IHJlZDsgICAgLy8vPCBjb29yZGluYXRlcyBvZiByZWQgZGlzcGxheSBwcmltYXJ5CisgICAgQzJDb2xvclh5U3RydWN0IGdyZWVuOyAgLy8vPCBjb29yZGluYXRlcyBvZiBncmVlbiBkaXNwbGF5IHByaW1hcnkKKyAgICBDMkNvbG9yWHlTdHJ1Y3QgYmx1ZTsgICAvLy88IGNvb3JkaW5hdGVzIG9mIGJsdWUgZGlzcGxheSBwcmltYXJ5CisgICAgQzJDb2xvclh5U3RydWN0IHdoaXRlOyAgLy8vPCBjb29yZGluYXRlcyBvZiB3aGl0ZSBwb2ludAorCisgICAgZmxvYXQgbWF4THVtaW5hbmNlOyAgLy8vPCBtYXggZGlzcGxheSBtYXN0ZXJpbmcgbHVtaW5hbmNlIGluIGNkL21eMgorICAgIGZsb2F0IG1pbkx1bWluYW5jZTsgIC8vLzwgbWluIGRpc3BsYXkgbWFzdGVyaW5nIGx1bWluYW5jZSBpbiBjZC9tXjIKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoTWFzdGVyaW5nRGlzcGxheUNvbG9yVm9sdW1lKQorICAgIEMyRklFTEQocmVkLCAicmVkIikKKyAgICBDMkZJRUxEKGdyZWVuLCAiZ3JlZW4iKQorICAgIEMyRklFTEQoYmx1ZSwgImJsdWUiKQorICAgIEMyRklFTEQod2hpdGUsICJ3aGl0ZSIpCisKKyAgICBDMkZJRUxEKG1heEx1bWluYW5jZSwgIm1heC1sdW1pbmFuY2UiKQorICAgIEMyRklFTEQobWluTHVtaW5hbmNlLCAibWluLWx1bWluYW5jZSIpCit9OworCitzdHJ1Y3QgQzJIZHJTdGF0aWNNZXRhZGF0YVN0cnVjdCB7CisgICAgQzJNYXN0ZXJpbmdEaXNwbGF5Q29sb3JWb2x1bWVTdHJ1Y3QgbWFzdGVyaW5nOworCisgICAgLy8gY29udGVudCBkZXNjcmlwdG9ycworICAgIGZsb2F0IG1heENsbDsgIC8vLzwgbWF4IGNvbnRlbnQgbGlnaHQgbGV2ZWwgKHBpeGVsIGx1bWluYW5jZSkgaW4gY2QvbV4yCisgICAgZmxvYXQgbWF4RmFsbDsgLy8vPCBtYXggZnJhbWUgYXZlcmFnZSBsaWdodCBsZXZlbCAoZnJhbWUgbHVtaW5hbmNlKSBpbiBjZC9tXjIKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQkFTRV9DMlNUUlVDVChIZHJTdGF0aWNNZXRhZGF0YSkKKyAgICBDMkZJRUxEKG1hc3RlcmluZywgIm1hc3RlcmluZyIpCisgICAgQzJGSUVMRChtYXhDbGwsICJtYXgtY2xsIikKKyAgICBDMkZJRUxEKG1heEZhbGwsICJtYXgtZmFsbCIpCit9OwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJIZHJTdGF0aWNNZXRhZGF0YVN0cnVjdCwga1BhcmFtSW5kZXhIZHJTdGF0aWNNZXRhZGF0YT4KKyAgICAgICAgQzJTdHJlYW1IZHJTdGF0aWNJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPW10gPSAicmF3Lmhkci1zdGF0aWMtaW5mbyI7CisKKy8qKgorICogSERSMTArIE1ldGFkYXRhIEluZm8uCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyQmxvYlZhbHVlLCBrUGFyYW1JbmRleEhkcjEwUGx1c01ldGFkYXRhPgorICAgICAgICBDMlN0cmVhbUhkcjEwUGx1c0luZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9IRFIxMF9QTFVTX0lORk9bXSA9ICJpbnB1dC5oZHIxMC1wbHVzLWluZm8iOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX0hEUjEwX1BMVVNfSU5GT1tdID0gIm91dHB1dC5oZHIxMC1wbHVzLWluZm8iOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYmxvY2stYmFzZWQgY29kaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogQmxvY2stc2l6ZSwgYmxvY2sgY291bnQgYW5kIGJsb2NrIHJhdGUuIFVzZWQgdG8gZGV0ZXJtaW5lIG9yIGNvbW11bmljYXRlIHByb2ZpbGUtbGV2ZWwKKyAqIHJlcXVpcmVtZW50cy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJQaWN0dXJlU2l6ZVN0cnVjdCwga1BhcmFtSW5kZXhCbG9ja1NpemU+IEMyU3RyZWFtQmxvY2tTaXplSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0JMT0NLX1NJWkVbXSA9ICJjb2RlZC5ibG9jay1zaXplIjsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhCbG9ja0NvdW50PiBDMlN0cmVhbUJsb2NrQ291bnRJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQkxPQ0tfQ09VTlRbXSA9ICJjb2RlZC5ibG9jay1jb3VudCI7CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhCbG9ja1JhdGU+IEMyU3RyZWFtQmxvY2tSYXRlSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0JMT0NLX1JBVEVbXSA9ICJjb2RlZC5ibG9jay1yYXRlIjsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gVklERU8gQ09NUE9ORU5UUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIEZyYW1lIHJhdGUgKGNvZGVkIGFuZCBwb3J0IGZvciByYXcgZGF0YSkKKyAqCisgKiBDb2RlZCBmcmFtZSByYXRlcyBhcmUgd2hhdCBpcyByZXByZXNlbnRlZCBpbiB0aGUgY29tcHJlc3NlZCBiaXRzdHJlYW0gYW5kIHNob3VsZCBjb3JyZXNwb25kIHRvCisgKiB0aGUgdGltZXN0YW1wLgorICoKKyAqIEZyYW1lIHJhdGVzIG9uIHJhdyBwb3J0cyBzaG91bGQgc3RpbGwgY29ycmVzcG9uZCB0byB0aGUgdGltZXN0YW1wcy4KKyAqCisgKiBGb3Igc2xvdyBtb3Rpb24gb3IgdGltZWxhcHNlIHJlY29yZGluZywgdGhlIHRpbWVzdGFtcCBzaGFsbCBiZSBhZGp1c3RlZCBwcmlvciB0byBmZWVkaW5nIGFuCisgKiBlbmNvZGVyLCBhbmQgdGhlIHRpbWUgc3RyZXRjaCBwYXJhbWV0ZXIgc2hvdWxkIGJlIHVzZWQgdG8gc2lnbmFsIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbgorICogdGltZXN0YW1wIGFuZCByZWFsLXdvcmxkIHRpbWUuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhGcmFtZVJhdGU+IEMyU3RyZWFtRnJhbWVSYXRlSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0ZSQU1FX1JBVEVbXSA9ICJjb2RlZC5mcmFtZS1yYXRlIjsKKwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMkluZm8sIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhGcmFtZVJhdGU+IEMyUG9ydEZyYW1lUmF0ZUluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9GUkFNRV9SQVRFW10gPSAiaW5wdXQuZnJhbWUtcmF0ZSI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfRlJBTUVfUkFURVtdID0gIm91dHB1dC5mcmFtZS1yYXRlIjsKKworLyoqCisgKiBUaW1lIHN0cmV0Y2guIFJhdGlvIGJldHdlZW4gcmVhbC13b3JsZCB0aW1lIGFuZCB0aW1lc3RhbXAuIEUuZy4gdGltZSBzdHJldGNoIG9mIDQuMCBtZWFucyB0aGF0CisgKiB0aW1lc3RhbXAgZ3Jvd3MgMS80IHRoZSBzcGVlZCBvZiByZWFsLXdvcmxkIHRpbWUgKGUuZy4gNHggc2xvLW1vIGlucHV0KS4gVGhpcyBjYW4gYmUgdXNlZCB0bworICogb3B0aW1pemUgZW5jb2RpbmcuCisgKi8KK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJJbmZvLCBDMkZsb2F0VmFsdWUsIGtQYXJhbUluZGV4VGltZVN0cmV0Y2g+IEMyUG9ydFRpbWVTdHJldGNoSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1RJTUVfU1RSRVRDSFtdID0gImlucHV0LnRpbWUtc3RyZXRjaCI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfVElNRV9TVFJFVENIW10gPSAib3V0cHV0LnRpbWUtc3RyZXRjaCI7CisKKy8qKgorICogTWF4IHZpZGVvIGZyYW1lIHNpemUuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJQaWN0dXJlU2l6ZVN0cnVjdCwga1BhcmFtSW5kZXhNYXhQaWN0dXJlU2l6ZT4KKyAgICAgICAgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzsKK3R5cGVkZWYgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZyBDMk1heFZpZGVvU2l6ZUhpbnRQb3J0U2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkVbXSA9ICJyYXcubWF4LXNpemUiOworCisvKioKKyAqIFBpY3R1cmUgdHlwZSBtYXNrLgorICovCitDMkVOVU0oQzJDb25maWc6OnBpY3R1cmVfdHlwZV90LCB1aW50MzJfdCwKKyAgICBTWU5DX0ZSQU1FID0gKDEgPDwgMCksICAvLy88IHN5bmMgZnJhbWUsIGUuZy4gSURSCisgICAgSV9GUkFNRSAgICA9ICgxIDw8IDEpLCAgLy8vPCBpbnRyYSBmcmFtZSB0aGF0IGlzIGNvbXBsZXRlbHkgZW5jb2RlZAorICAgIFBfRlJBTUUgICAgPSAoMSA8PCAyKSwgIC8vLzwgaW50ZXIgcHJlZGljdGVkIGZyYW1lIGZyb20gcHJldmlvdXMgZnJhbWVzCisgICAgQl9GUkFNRSAgICA9ICgxIDw8IDMpLCAgLy8vPCBiYWNrd2FyZCBwcmVkaWN0ZWQgKG91dC1vZi1vcmRlcikgZnJhbWUKKykKKworLyoqCisgKiBBbGxvd2VkIHBpY3R1cmUgdHlwZXMuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkVhc3lFbnVtPEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdD4+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4UGljdHVyZVR5cGVNYXNrPgorICAgICAgICBDMlN0cmVhbVBpY3R1cmVUeXBlTWFza1R1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BJQ1RVUkVfVFlQRV9NQVNLW10gPSAiY29kaW5nLnBpY3R1cmUtdHlwZS1tYXNrIjsKKworLyoqCisgKiBSZXN1bHRpbmcgcGljdHVyZSB0eXBlCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJFYXN5RW51bTxDMkNvbmZpZzo6cGljdHVyZV90eXBlX3Q+PiwKKyAgICAgICAgICAgICAgICBrUGFyYW1JbmRleFBpY3R1cmVUeXBlPgorICAgICAgICBDMlN0cmVhbVBpY3R1cmVUeXBlSW5mbzsKK3R5cGVkZWYgQzJTdHJlYW1QaWN0dXJlVHlwZUluZm8gQzJTdHJlYW1QaWN0dXJlVHlwZU1hc2tJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUElDVFVSRV9UWVBFW10gPSAiY29kZWQucGljdHVyZS10eXBlIjsKKworLyoqCisgKiBHT1Agc3BlY2lmaWNhdGlvbi4KKyAqCisgKiBHT1AgaXMgc3BlY2lmaWVkIGluIGxheWVycyBiZXR3ZWVuIHN5bmMgZnJhbWVzLCBieSBzcGVjaWZ5aW5nIHRoZSBudW1iZXIgb2Ygc3BlY2lmaWMgdHlwZSBvZgorICogZnJhbWVzIGJldHdlZW4gdGhlIHByZXZpb3VzIHR5cGUgKHN0YXJ0aW5nIHdpdGggc3luYyBmcmFtZXMgZm9yIHRoZSBmaXJzdCBsYXllcik6CisgKgorICogRS5nLgorICogICAgICAtIDQgSSBmcmFtZXMgYmV0d2VlbiBlYWNoIHN5bmMgZnJhbWUKKyAqICAgICAgLSAyIFAgZnJhbWVzIGJldHdlZW4gZWFjaCBJIGZyYW1lCisgKiAgICAgIC0gMSBCIGZyYW1lIGJldHdlZW4gZWFjaCBQIGZyYW1lCisgKgorICogICAgICBbIHsgSSwgNCB9LCB7IFAsIDIgfSwgeyBCLCAxIH0gXSA9PT4gKFN5bmMpQlBCUEIgSUJQQlBCIElCUEJQQiBJQlBCUEIgSUJQQlBCIChTeW5jKUJQQlBCCisgKgorICogRm9yIGluZmluaXRlIEdPUCwgSSBsYXllciBjYW4gYmUgb21pdHRlZCAoYXMgdGhlIGZpcnN0IGZyYW1lIGlzIGFsd2F5cyBhIHN5bmMgZnJhbWUuKToKKyAqCisgKiAgICAgIFsgeyBQLCBNQVhfVUlOVCB9IF0gICA9PT4gKFN5bmMpUFBQUFBQUFBQUFBQUFBQUFBQLi4uCisgKgorICogU3luYyBmcmFtZXMgY2FuIGFsc28gYmUgcmVxdWVzdGVkIG9uIGRlbWFuZCwgYW5kIGFzIGEgdGltZS1iYXNlZCBpbnRlcnZhbC4gRm9yIHRpbWUtYmFzZWQKKyAqIGludGVydmFsLCBpZiB0aGVyZSBoYXNuJ3QgYmVlbiBhIHN5bmMgZnJhbWUgaW4gYXQgbGVhc3QgdGhlIGdpdmVuIHRpbWUsIHRoZSBuZXh0IEkgZnJhbWUgc2hhbGwKKyAqIGJlIGVuY29kZWQgYXMgYSBzeW5jIGZyYW1lLiAgRm9yIHN5bmMgcmVxdWVzdCwgdGhlIG5leHQgSSBmcmFtZSBzaGFsbCBiZSBlbmNvZGVkIGFzIGEgc3luYyBmcmFtZS4KKyAqCisgKiBUZW1wb3JhbCBsYXllcmluZyB3aWxsIGRldGVybWluZSBHT1Agc3RydWN0dXJlIG90aGVyIHRoYW4gdGhlIEkgZnJhbWUgY291bnQgYmV0d2VlbiBzeW5jCisgKiBmcmFtZXMuCisgKi8KK3N0cnVjdCBDMkdvcExheWVyU3RydWN0IHsKKyAgICBDMkdvcExheWVyU3RydWN0KCkgOiB0eXBlXygoQzJDb25maWc6OnBpY3R1cmVfdHlwZV90KTApLCBjb3VudCgwKSB7fQorICAgIEMyR29wTGF5ZXJTdHJ1Y3QoQzJDb25maWc6OnBpY3R1cmVfdHlwZV90IHR5cGUsIHVpbnQzMl90IGNvdW50XykKKyAgICAgICAgOiB0eXBlXyh0eXBlKSwgY291bnQoY291bnRfKSB7IH0KKworICAgIEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdCB0eXBlXzsKKyAgICB1aW50MzJfdCBjb3VudDsKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoR29wTGF5ZXIpCisgICAgQzJGSUVMRCh0eXBlXywgInR5cGUiKQorICAgIEMyRklFTEQoY291bnQsICJjb3VudCIpCit9OworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8QzJHb3BMYXllclN0cnVjdD4sIGtQYXJhbUluZGV4R29wPgorICAgICAgICBDMlN0cmVhbUdvcFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0dPUFtdID0gImNvZGluZy5nb3AiOworCisvKioKKyAqIFN5bmMgZnJhbWUgY2FuIGJlIHJlcXVlc3RlZCBvbiBkZW1hbmQgYnkgdGhlIGNsaWVudC4KKyAqCisgKiBJZiB0cnVlLCB0aGUgbmV4dCBJIGZyYW1lIHNoYWxsIGJlIGVuY29kZWQgYXMgYSBzeW5jIGZyYW1lLiBUaGlzIGNvbmZpZyBjYW4gYmUgcGFzc2VkCisgKiBzeW5jaHJvbm91c2x5IHdpdGggdGhlIHdvcmssIG9yIGRpcmVjdGx5IHRvIHRoZSBjb21wb25lbnQgLSBsZWFkaW5nIHRvIGRpZmZlcmVudCByZXN1bHQuCisgKiBJZiBpdCBpcyBwYXNzZWQgd2l0aCB3b3JrLCBpdCBzaGFsbCB0YWtlIGVmZmVjdCB3aGVuIHRoYXQgd29yayBpdGVtIGlzIGJlaW5nIHByb2Nlc3NlZCAoc28KKyAqIHRoZSBmaXJzdCBJIGZyYW1lIGF0IG9yIGFmdGVyIHRoYXQgd29yayBpdGVtIHNoYWxsIGJlIGEgc3luYyBmcmFtZSkuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJFYXN5Qm9vbFZhbHVlLCBrUGFyYW1JbmRleFJlcXVlc3RTeW5jRnJhbWU+CisgICAgICAgIEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1JFUVVFU1RfU1lOQ19GUkFNRVtdID0gImNvZGluZy5yZXF1ZXN0LXN5bmMtZnJhbWUiOworCisvKioKKyAqIFN5bmMgZnJhbWUgaW50ZXJ2YWwgaW4gdGltZSBkb21haW4gKHRpbWVzdGFtcCkuCisgKgorICogSWYgdGhlcmUgaGFzbid0IGJlZW4gYSBzeW5jIGZyYW1lIGluIGF0IGxlYXN0IHRoaXMgdmFsdWUsIHRoZSBuZXh0IGludHJhIGZyYW1lIHNoYWxsIGJlIGVuY29kZWQKKyAqIGFzIGEgc3luYyBmcmFtZS4gVGhlIHZhbHVlIG9mIE1BWF9JNjQgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBtZWFucyBubyBzeW5jIGZyYW1lcyBhZnRlciB0aGUgZmlyc3QKKyAqIGZyYW1lLiBBIHZhbHVlIG9mIDAgbWVhbnMgYWxsIHN5bmMgZnJhbWVzLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMySW50NjRWYWx1ZSwga1BhcmFtSW5kZXhTeW5jRnJhbWVJbnRlcnZhbD4KKyAgICAgICAgQzJTdHJlYW1TeW5jRnJhbWVJbnRlcnZhbFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1NZTkNfRlJBTUVfSU5URVJWQUxbXSA9ICJjb2Rpbmcuc3luYy1mcmFtZS1pbnRlcnZhbCI7CisKKy8qKgorICogVGVtcG9yYWwgbGF5ZXJpbmcKKyAqCisgKiBMYXllciBpbmRleCBpcyBhIHZhbHVlIGJldHdlZW4gMCBhbmQgbGF5ZXIgY291bnQgLSAxLiBMYXllcnMgd2l0aCBoaWdoZXIgaW5kZXggaGF2ZSBoaWdoZXIKKyAqIGZyZXF1ZW5jeToKKyAqICAgICAwCisgKiAgIDEgICAxCisgKiAgMiAyIDIgMgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleExheWVySW5kZXg+IEMyU3RyZWFtTGF5ZXJJbmRleEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9MQVlFUl9JTkRFWFtdID0gImNvZGVkLmxheWVyLWluZGV4IjsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhMYXllckNvdW50PiBDMlN0cmVhbUxheWVyQ291bnRJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfTEFZRVJfQ09VTlRbXSA9ICJjb2RlZC5sYXllci1jb3VudCI7CisKK3N0cnVjdCBDMlRlbXBvcmFsTGF5ZXJpbmdTdHJ1Y3QgeworICAgIEMyVGVtcG9yYWxMYXllcmluZ1N0cnVjdCgpCisgICAgICAgIDogbGF5ZXJDb3VudCgwKSwgYkxheWVyQ291bnQoMCkgeyB9CisKKyAgICBDMlRlbXBvcmFsTGF5ZXJpbmdTdHJ1Y3Qoc2l6ZV90IC8qIGZsZXhDb3VudCAqLywgdWludDMyX3QgbGF5ZXJDb3VudF8sIHVpbnQzMl90IGJMYXllckNvdW50XykKKyAgICAgICAgOiBsYXllckNvdW50KGxheWVyQ291bnRfKSwgYkxheWVyQ291bnQoYzJfbWluKGxheWVyQ291bnRfLCBiTGF5ZXJDb3VudF8pKSB7IH0KKworICAgIEMyVGVtcG9yYWxMYXllcmluZ1N0cnVjdChzaXplX3QgZmxleENvdW50LCB1aW50MzJfdCBsYXllckNvdW50XywgdWludDMyX3QgYkxheWVyQ291bnRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8ZmxvYXQ+IHJhdGlvcykKKyAgICAgICAgOiBsYXllckNvdW50KGxheWVyQ291bnRfKSwgYkxheWVyQ291bnQoYzJfbWluKGxheWVyQ291bnRfLCBiTGF5ZXJDb3VudF8pKSB7CisgICAgICAgIHNpemVfdCBpeCA9IDA7CisgICAgICAgIGZvciAoZmxvYXQgcmF0aW8gOiByYXRpb3MpIHsKKyAgICAgICAgICAgIGlmIChpeCA9PSBmbGV4Q291bnQpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJpdHJhdGVSYXRpb3NbaXgrK10gPSByYXRpbzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHVpbnQzMl90IGxheWVyQ291bnQ7ICAgICAvLy88IHRvdGFsIG51bWJlciBvZiBsYXllcnMgKDAgbWVhbnMgbm8gdGVtcG9yYWwgbGF5ZXJpbmcpCisgICAgdWludDMyX3QgYkxheWVyQ291bnQ7ICAgIC8vLzwgdG90YWwgbnVtYmVyIG9mIGJpZGlyZWN0aW9uYWwgbGF5ZXJzICg8PSBudW0gbGF5ZXJzKQorICAgIC8qKgorICAgICAqIEJpdHJhdGUgYnVkZ2V0cyBmb3IgZWFjaCBsYXllciBhbmQgdGhlIGxheWVycyBiZWxvdywgZ2l2ZW4gYXMgYSByYXRpbyBvZiB0aGUgdG90YWwKKyAgICAgKiBzdHJlYW0gYml0cmF0ZS4gVGhpcyBjYW4gYmUgb21pdHRlZCBvciBwYXJ0aWFsbHkgc3BlY2lmaWZlZCBieSB0aGUgY2xpZW50IHdoaWxlIGNvbmZpZ3VyaW5nLAorICAgICAqIGluIHdoaWNoIGNhc2UgdGhlIGNvbXBvbmVudCBzaGFsbCBmaWxsIGluIGFwcHJvcHJpYXRlIHZhbHVlcyBmb3IgdGhlIG1pc3NpbmcgbGF5ZXJzLgorICAgICAqIFRoaXMgbXVzdCBiZSBwcm92aWRlZCBieSB0aGUgY29tcG9uZW50IHdoZW4gcXVlcmllZCBmb3IgYXQgbGVhc3QgbGF5ZXIgY291bnQgLSAxIChhcyB0aGUKKyAgICAgKiBsYXN0IGxheWVyJ3MgYnVkZ2V0IGlzIGFsd2F5cyAxLjApLgorICAgICAqLworICAgIGZsb2F0IGJpdHJhdGVSYXRpb3NbXTsgICAvLy88IDEuMC1iYXNlZAorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKFRlbXBvcmFsTGF5ZXJpbmcsIGJpdHJhdGVSYXRpb3MpCisgICAgQzJGSUVMRChsYXllckNvdW50LCAibGF5ZXItY291bnQiKQorICAgIEMyRklFTEQoYkxheWVyQ291bnQsICJiLWxheWVyLWNvdW50IikKKyAgICBDMkZJRUxEKGJpdHJhdGVSYXRpb3MsICJiaXRyYXRlLXJhdGlvcyIpCit9OworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyVGVtcG9yYWxMYXllcmluZ1N0cnVjdCwga1BhcmFtSW5kZXhUZW1wb3JhbExheWVyaW5nPgorICAgICAgICBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9URU1QT1JBTF9MQVlFUklOR1tdID0gImNvZGluZy50ZW1wb3JhbC1sYXllcmluZyI7CisKKy8qKgorICogSW50cmEtcmVmcmVzaC4KKyAqLworCitDMkVOVU0oQzJDb25maWc6OmludHJhX3JlZnJlc2hfbW9kZV90LCB1aW50MzJfdCwKKyAgICBJTlRSQV9SRUZSRVNIX0RJU0FCTEVELCAgICAgLy8vPCBubyBpbnRyYSByZWZyZXNoCisgICAgSU5UUkFfUkVGUkVTSF9BUkJJVFJBUlksICAgIC8vLzwgYXJiaXRyYXJ5LCB1bnNwZWNpZmllZAorKQorCitzdHJ1Y3QgQzJJbnRyYVJlZnJlc2hTdHJ1Y3QgeworICAgIEMySW50cmFSZWZyZXNoU3RydWN0KCkKKyAgICAgICAgOiBtb2RlKEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0RJU0FCTEVEKSwgcGVyaW9kKDAuKSB7IH0KKworICAgIEMySW50cmFSZWZyZXNoU3RydWN0KEMyQ29uZmlnOjppbnRyYV9yZWZyZXNoX21vZGVfdCBtb2RlXywgZmxvYXQgcGVyaW9kXykKKyAgICAgICAgOiBtb2RlKG1vZGVfKSwgcGVyaW9kKHBlcmlvZF8pIHsgfQorCisgICAgQzJDb25maWc6OmludHJhX3JlZnJlc2hfbW9kZV90IG1vZGU7IC8vLzwgcmVmcmVzaCBtb2RlCisgICAgZmxvYXQgcGVyaW9kOyAgICAgICAgIC8vLzwgaW50cmEgcmVmcmVzaCBwZXJpb2QgaW4gZnJhbWVzIChtdXN0IGJlID49IDEpLCAwIG1lYW5zIGRpc2FibGVkCisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKEludHJhUmVmcmVzaCkKKyAgICBDMkZJRUxEKG1vZGUsICJtb2RlIikKKyAgICBDMkZJRUxEKHBlcmlvZCwgInBlcmlvZCIpCit9OworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMySW50cmFSZWZyZXNoU3RydWN0LCBrUGFyYW1JbmRleEludHJhUmVmcmVzaD4KKyAgICAgICAgQzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlRSQV9SRUZSRVNIW10gPSAiY29kaW5nLmludHJhLXJlZnJlc2giOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJTUFHRSBDT01QT05FTlRTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogVGlsZSBsYXlvdXQuCisgKgorICogVGhpcyBkZXNjcmliZWQgaG93IHRoZSBpbWFnZSBpcyBkZWNvbXBvc2VkIGludG8gdGlsZXMuCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6c2Nhbl9vcmRlcl90LCB1aW50MzJfdCwKKyAgICBTQ0FOX0xFRlRfVE9fUklHSFRfVEhFTl9ET1dOCispCisKK3N0cnVjdCBDMlRpbGVMYXlvdXRTdHJ1Y3QgeworICAgIEMyUGljdHVyZVNpemVTdHJ1Y3QgdGlsZTsgICAgICAgLy8vPCB0aWxlIHNpemUKKyAgICB1aW50MzJfdCBjb2x1bW5Db3VudDsgICAgICAgICAgIC8vLzwgbnVtYmVyIG9mIHRpbGVzIGhvcml6b250YWxseQorICAgIHVpbnQzMl90IHJvd0NvdW50OyAgICAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgdGlsZXMgdmVydGljYWxseQorICAgIEMyQ29uZmlnOjpzY2FuX29yZGVyX3Qgb3JkZXI7ICAgLy8vPCB0aWxlIG9yZGVyCisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFRpbGVMYXlvdXQpCisgICAgQzJGSUVMRCh0aWxlLCAidGlsZSIpCisgICAgQzJGSUVMRChjb2x1bW5Db3VudCwgImNvbHVtbnMiKQorICAgIEMyRklFTEQocm93Q291bnQsICJyb3dzIikKKyAgICBDMkZJRUxEKG9yZGVyLCAib3JkZXIiKQorfTsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJUaWxlTGF5b3V0U3RydWN0LCBrUGFyYW1JbmRleFRpbGVMYXlvdXQ+IEMyU3RyZWFtVGlsZUxheW91dEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9USUxFX0xBWU9VVFtdID0gImNvZGVkLnRpbGUtbGF5b3V0IjsKKworLyoqCisgKiBUaWxlIGhhbmRsaW5nLgorICoKKyAqIFdoZXRoZXIgdG8gY29uY2F0ZW5hdGUgdGlsZXMgb3Igb3V0cHV0IHRoZW0gZWFjaC4KKyAqLworQzJFTlVNKEMyQ29uZmlnOjp0aWxpbmdfbW9kZV90LCB1aW50MzJfdCwKKyAgICBUSUxJTkdfU0VQQVJBVEUsICAgIC8vLzwgb3V0cHV0IGVhY2ggdGlsZSBpbiBhIHNlcGFyYXRlIG9uV29ya0RvbmUKKyAgICBUSUxJTkdfQ09OQ0FURU5BVEUgIC8vLzwgb3V0cHV0IG9uZSB3b3JrIGNvbXBsZXRpb24gcGVyIGZyYW1lIChjb25jYXRlbmF0ZSB0aWxlcykKKykKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlRpbGVMYXlvdXRTdHJ1Y3QsIGtQYXJhbUluZGV4VGlsZUhhbmRsaW5nPgorICAgICAgICBDMlN0cmVhbVRpbGVIYW5kbGluZ1R1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1RJTEVfSEFORExJTkdbXSA9ICJjb2RpbmcudGlsZS1oYW5kbGluZyI7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEFVRElPIENPTVBPTkVOVFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoqCisgKiBTYW1wbGUgcmF0ZQorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleFNhbXBsZVJhdGU+IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURVtdID0gInJhdy5zYW1wbGUtcmF0ZSI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT0RFRF9TQU1QTEVfUkFURVtdID0gImNvZGVkLnNhbXBsZS1yYXRlIjsKKworLyoqCisgKiBDaGFubmVsIGNvdW50LgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleENoYW5uZWxDb3VudD4gQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVFtdID0gInJhdy5jaGFubmVsLWNvdW50IjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NPREVEX0NIQU5ORUxfQ09VTlRbXSA9ICJjb2RlZC5jaGFubmVsLWNvdW50IjsKKworLyoqCisgKiBNYXggY2hhbm5lbCBjb3VudC4gVXNlZCB0byBsaW1pdCB0aGUgbnVtYmVyIG9mIGNvZGVkIG9yIGRlY29kZWQgY2hhbm5lbHMuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4TWF4Q2hhbm5lbENvdW50PiBDMlN0cmVhbU1heENoYW5uZWxDb3VudEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9NQVhfQ0hBTk5FTF9DT1VOVFtdID0gInJhdy5tYXgtY2hhbm5lbC1jb3VudCI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9NQVhfQ09ERURfQ0hBTk5FTF9DT1VOVFtdID0gImNvZGVkLm1heC1jaGFubmVsLWNvdW50IjsKKworLyoqCisgKiBBdWRpbyBzYW1wbGUgZm9ybWF0IChQQ00gZW5jb2RpbmcpCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QsIHVpbnQzMl90LAorICAgIFBDTV8xNiwKKyAgICBQQ01fOCwKKyAgICBQQ01fRkxPQVQKKykKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3Q+LCBrUGFyYW1JbmRleFBjbUVuY29kaW5nPgorICAgICAgICBDMlN0cmVhbVBjbUVuY29kaW5nSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BDTV9FTkNPRElOR1tdID0gInJhdy5wY20tZW5jb2RpbmciOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09ERURfUENNX0VOQ09ESU5HW10gPSAiY29kZWQucGNtLWVuY29kaW5nIjsKKworLyoqCisgKiBBQUMgU0JSIE1vZGUuIFVzZWQgZHVyaW5nIGVuY29kaW5nLgorICovCitDMkVOVU0oQzJDb25maWc6OmFhY19zYnJfbW9kZV90LCB1aW50MzJfdCwKKyAgICBBQUNfU0JSX09GRiwKKyAgICBBQUNfU0JSX1NJTkdMRV9SQVRFLAorICAgIEFBQ19TQlJfRFVBTF9SQVRFLAorICAgIEFBQ19TQlJfQVVUTyAvLy88IGxldCB0aGUgY29kZWMgZGVjaWRlCispCisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OmFhY19zYnJfbW9kZV90Piwga1BhcmFtSW5kZXhBYWNTYnJNb2RlPgorICAgICAgICBDMlN0cmVhbUFhY1Nick1vZGVUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9BQUNfU0JSX01PREVbXSA9ICJjb2RpbmcuYWFjLXNici1tb2RlIjsKKworLyoqCisgKiBEUkMgQ29tcHJlc3Npb24uIFVzZWQgZHVyaW5nIGRlY29kaW5nLgorICovCitDMkVOVU0oQzJDb25maWc6OmRyY19jb21wcmVzc2lvbl9tb2RlX3QsIGludDMyX3QsCisgICAgRFJDX0NPTVBSRVNTSU9OX09ETV9ERUZBVUxULCAvLy88IG9kbSdzIGRlZmF1bHQKKyAgICBEUkNfQ09NUFJFU1NJT05fTk9ORSwKKyAgICBEUkNfQ09NUFJFU1NJT05fTElHSFQsCisgICAgRFJDX0NPTVBSRVNTSU9OX0hFQVZZIC8vLzwKKykKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbmZpZzo6ZHJjX2NvbXByZXNzaW9uX21vZGVfdD4sCisgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhEcmNDb21wcmVzc2lvbj4KKyAgICAgICAgQzJTdHJlYW1EcmNDb21wcmVzc2lvbk1vZGVUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9EUkNfQ09NUFJFU1NJT05fTU9ERVtdID0gImNvZGluZy5kcmMuY29tcHJlc3Npb24tbW9kZSI7CisKKy8qKgorICogRFJDIHRhcmdldCByZWZlcmVuY2UgbGV2ZWwgaW4gZEJGUy4gVXNlZCBkdXJpbmcgZGVjb2RpbmcuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhEcmNUYXJnZXRSZWZlcmVuY2VMZXZlbD4KKyAgICAgICAgQzJTdHJlYW1EcmNUYXJnZXRSZWZlcmVuY2VMZXZlbFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0RSQ19UQVJHRVRfUkVGRVJFTkNFX0xFVkVMW10gPSAiY29kaW5nLmRyYy5yZWZlcmVuY2UtbGV2ZWwiOworCisvKioKKyAqIERSQyB0YXJnZXQgcmVmZXJlbmNlIGxldmVsIGluIGRCRlMuIFVzZWQgZHVyaW5nIGRlY29kaW5nLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkZsb2F0VmFsdWUsIGtQYXJhbUluZGV4RHJjRW5jb2RlZFRhcmdldExldmVsPgorICAgICAgICBDMlN0cmVhbURyY0VuY29kZWRUYXJnZXRMZXZlbFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0RSQ19FTkNPREVEX1RBUkdFVF9MRVZFTFtdID0gImNvZGluZy5kcmMuZW5jb2RlZC1sZXZlbCI7CisKKy8qKgorICogRFJDIHRhcmdldCByZWZlcmVuY2UgbGV2ZWwgaW4gZEJGUy4gVXNlZCBkdXJpbmcgZGVjb2RpbmcuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhEcmNCb29zdEZhY3Rvcj4KKyAgICAgICAgQzJTdHJlYW1EcmNCb29zdEZhY3RvclR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0RSQ19CT09TVF9GQUNUT1JbXSA9ICJjb2RpbmcuZHJjLmJvb3N0LWZhY3RvciI7CisKKy8qKgorICogRFJDIHRhcmdldCByZWZlcmVuY2UgbGV2ZWwgaW4gZEJGUy4gVXNlZCBkdXJpbmcgZGVjb2RpbmcuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhEcmNBdHRlbnVhdGlvbkZhY3Rvcj4KKyAgICAgICAgQzJTdHJlYW1EcmNBdHRlbnVhdGlvbkZhY3RvclR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0RSQ19BVFRFTlVBVElPTl9GQUNUT1JbXSA9ICJjb2RpbmcuZHJjLmF0dGVudWF0aW9uLWZhY3RvciI7CisKKy8qKgorICogRFJDIEVmZmVjdCBUeXBlIChzZWUgSVNPIDIzMDAzLTQpIFVuaWZvcm0gRHluYW1pYyBSYW5nZSBDb250cm9sLiBVc2VkIGR1cmluZyBkZWNvZGluZy4KKyAqLworQzJFTlVNKEMyQ29uZmlnOjpkcmNfZWZmZWN0X3R5cGVfdCwgaW50MzJfdCwKKyAgICBEUkNfRUZGRUNUX09ETV9ERUZBVUxUID0gLTIsIC8vLzwgb2RtJ3MgZGVmYXVsdAorICAgIERSQ19FRkZFQ1RfT0ZGID0gLTEsICAgIC8vLzwgbm8gRFJDCisgICAgRFJDX0VGRkVDVF9OT05FID0gMCwgICAgLy8vPCBubyBEUkMgZXhjZXB0IHRvIHByZXZlbnQgY2xpcHBpbmcKKyAgICBEUkNfRUZGRUNUX0xBVEVfTklHSFQsCisgICAgRFJDX0VGRkVDVF9OT0lTWV9FTlZJUk9OTUVOVCwKKyAgICBEUkNfRUZGRUNUX0xJTUlURURfUExBWUJBQ0tfUkFOR0UsCisgICAgRFJDX0VGRkVDVF9MT1dfUExBWUJBQ0tfTEVWRUwsCisgICAgRFJDX0VGRkVDVF9ESUFMT0dfRU5IQU5DRU1FTlQsCisgICAgRFJDX0VGRkVDVF9HRU5FUkFMX0NPTVBSRVNTSU9OCispCisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OmRyY19lZmZlY3RfdHlwZV90PiwKKyAgICAgICAgICAgICAgICBrUGFyYW1JbmRleERyY0VmZmVjdFR5cGU+CisgICAgICAgIEMyU3RyZWFtRHJjRWZmZWN0VHlwZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0RSQ19FRkZFQ1RfVFlQRVtdID0gImNvZGluZy5kcmMuZWZmZWN0LXR5cGUiOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQUFDIGNvbXBvbmVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogQUFDIHN0cmVhbSBmb3JtYXQKKyAqLworQzJFTlVNKEMyQ29uZmlnOjphYWNfcGFja2FnaW5nX3QsIHVpbnQzMl90LAorICAgIEFBQ19QQUNLQUdJTkdfUkFXLAorICAgIEFBQ19QQUNLQUdJTkdfQURUUworKQorCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyRWFzeUVudW08QzJDb25maWc6OmFhY19wYWNrYWdpbmdfdD4+LAorICAgICAgICBrUGFyYW1JbmRleEFhY1BhY2thZ2luZz4gQzJTdHJlYW1BYWNQYWNrYWdpbmdJbmZvOwordHlwZWRlZiBDMlN0cmVhbUFhY1BhY2thZ2luZ0luZm8gQzJTdHJlYW1BYWNGb3JtYXRJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQUFDX1BBQ0tBR0lOR1tdID0gImNvZGVkLmFhYy1wYWNrYWdpbmciOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBQTEFURk9STS1ERUZJTkVEIFBBUkFNRVRFUlMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoqCisgKiBQbGF0Zm9ybSBsZXZlbCBhbmQgZmVhdHVyZXMuCisgKi8KK2VudW0gQzJDb25maWc6OnBsYXRmb3JtX2xldmVsX3QgOiB1aW50MzJfdCB7CisgICAgUExBVEZPUk1fUCwgICAvLy88IHN1cHBvcnQgZm9yIEFuZHJvaWQgOS4wIGZlYXR1cmUgc2V0Cit9OworCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OnBsYXRmb3JtX2xldmVsX3Q+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4UGxhdGZvcm1MZXZlbD4KKyAgICAgICAgQzJQbGF0Zm9ybUxldmVsU2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BMQVRGT1JNX0xFVkVMW10gPSAiYXBpLnBsYXRmb3JtLWxldmVsIjsKKworZW51bSBDMkNvbmZpZzo6cGxhdGZvcm1fZmVhdHVyZV90IDogdWludDY0X3QgeworICAgIC8vIG5vIHBsYXRmb3JtLXNwZWNpZmljIGZlYXR1cmVzIGhhdmUgYmVlbiBkZWZpbmVkCit9OworCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OnBsYXRmb3JtX2ZlYXR1cmVfdD4sCisgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhQbGF0Zm9ybUZlYXR1cmVzPgorICAgICAgICBDMlBsYXRmb3JtRmVhdHVyZXNTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUExBVEZPUk1fRkVBVFVSRVNbXSA9ICJhcGkucGxhdGZvcm0tZmVhdHVyZXMiOworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgcHJlZmVycmVkIGlvbiBhbGxvY2F0aW9uIHBhcmFtZXRlcnMgZm9yIGEgZ2l2ZW4gbWVtb3J5IHVzYWdlLgorICovCitzdHJ1Y3QgQzJTdG9yZUlvblVzYWdlU3RydWN0IHsKKyAgICBpbmxpbmUgQzJTdG9yZUlvblVzYWdlU3RydWN0KCkgeworICAgICAgICBtZW1zZXQodGhpcywgMCwgc2l6ZW9mKCp0aGlzKSk7CisgICAgfQorCisgICAgaW5saW5lIEMyU3RvcmVJb25Vc2FnZVN0cnVjdCh1aW50NjRfdCB1c2FnZV8sIHVpbnQzMl90IGNhcGFjaXR5XykKKyAgICAgICAgOiB1c2FnZSh1c2FnZV8pLCBjYXBhY2l0eShjYXBhY2l0eV8pLCBoZWFwTWFzaygwKSwgYWxsb2NGbGFncygwKSwgbWluQWxpZ25tZW50KDApIHsgfQorCisgICAgdWludDY0X3QgdXNhZ2U7ICAgICAgICAvLy88IEMyTWVtb3J5VXNhZ2UKKyAgICB1aW50MzJfdCBjYXBhY2l0eTsgICAgIC8vLzwgY2FwYWNpdHkKKyAgICBpbnQzMl90IGhlYXBNYXNrOyAgICAgIC8vLzwgaW9uIGhlYXBNYXNrCisgICAgaW50MzJfdCBhbGxvY0ZsYWdzOyAgICAvLy88IGlvbiBhbGxvY2F0aW9uIGZsYWdzCisgICAgdWludDMyX3QgbWluQWxpZ25tZW50OyAvLy88IG1pbmltdW0gYWxpZ25tZW50CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFN0b3JlSW9uVXNhZ2UpCisgICAgQzJGSUVMRCh1c2FnZSwgInVzYWdlIikKKyAgICBDMkZJRUxEKGNhcGFjaXR5LCAiY2FwYWNpdHkiKQorICAgIEMyRklFTEQoaGVhcE1hc2ssICJoZWFwLW1hc2siKQorICAgIEMyRklFTEQoYWxsb2NGbGFncywgImFsbG9jLWZsYWdzIikKKyAgICBDMkZJRUxEKG1pbkFsaWdubWVudCwgIm1pbi1hbGlnbm1lbnQiKQorfTsKKworLy8gc3RvcmUsIHByaXZhdGUKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyU3RvcmVJb25Vc2FnZVN0cnVjdCwga1BhcmFtSW5kZXhTdG9yZUlvblVzYWdlPgorICAgICAgICBDMlN0b3JlSW9uVXNhZ2VJbmZvOworCisvKioKKyAqIEZsZXhpYmxlIHBpeGVsIGZvcm1hdCBkZXNjcmlwdG9ycworICovCitzdHJ1Y3QgQzJGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvclN0cnVjdCB7CisgICAgdWludDMyX3QgcGl4ZWxGb3JtYXQ7CisgICAgdWludDMyX3QgYml0RGVwdGg7CisgICAgQzJDb2xvcjo6c3Vic2FtcGxpbmdfdCBzdWJzYW1wbGluZzsKKyAgICBDMkNvbG9yOjpwbGFuZV9sYXlvdXRfdCBsYXlvdXQ7CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKEZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yKQorICAgIEMyRklFTEQocGl4ZWxGb3JtYXQsICJwaXhlbC1mb3JtYXQiKQorICAgIEMyRklFTEQoYml0RGVwdGgsICJiaXQtZGVwdGgiKQorICAgIEMyRklFTEQoc3Vic2FtcGxpbmcsICJzdWJzYW1wbGluZyIpCisgICAgQzJGSUVMRChsYXlvdXQsICJsYXlvdXQiKQorfTsKKworLyoqCisgKiBQbGFuZSBsYXlvdXQgb2YgZmxleGlibGUgcGl4ZWwgZm9ybWF0cy4KKyAqCisgKiBicHA6IGJ5dGVzIHBlciBjb2xvciBjb21wb25lbnQsIGUuZy4gMSBmb3IgOC1iaXQgZm9ybWF0cywgYW5kIDIgZm9yIDEwLTE2LWJpdCBmb3JtYXRzLgorICovCitDMkVOVU0oQzJDb2xvcjo6cGxhbmVfbGF5b3V0X3QsIHVpbnQzMl90LAorICAgICAgIC8qKiBVbmtub3duIGxheW91dCAqLworICAgICAgIFVOS05PV05fTEFZT1VULAorCisgICAgICAgLyoqIFBsYW5hciBsYXlvdXQgd2l0aCByb3dzIG9mIGVhY2ggcGxhbmUgcGFja2VkIChjb2xJbmMgPSBicHApICovCisgICAgICAgUExBTkFSX1BBQ0tFRCwKKworICAgICAgIC8qKiBTZW1pcGxhbmFyIGxheW91dCB3aXRoIHJvd3Mgb2YgZWFjaCBwbGFuZSBwYWNrZWQgKGNvbEluY19ZL0EgPSBicHAgKHBsYW5hciksCisgICAgICAgICogIGNvbEluY19DYi9DciA9IDIqYnBwIChpbnRlcmxlYXZlZCkuIFVzZWQgb25seSBmb3IgWVVWKEEpIGZvcm1hdHMuICovCisgICAgICAgU0VNSVBMQU5BUl9QQUNLRUQsCisKKyAgICAgICAvKiogSW50ZXJsZWF2ZWQgcGFja2VkLiBjb2xJbmMgPSBOKmJwcCAoTiBhcmUgdGhlIG51bWJlciBvZiBjb2xvciBjb21wb25lbnRzKSAqLworICAgICAgIElOVEVSTEVBVkVEX1BBQ0tFRCwKKworICAgICAgIC8qKiBJbnRlcmxlYXZlZCBhbGlnbmVkLiBjb2xJbmMgPSBzbWFsbGVzdCBwb3dlciBvZiAyID49IE4qYnBwIChOIGFyZSB0aGUgbnVtYmVyIG9mIGNvbG9yCisgICAgICAgICogIGNvbXBvbmVudHMpICovCisgICAgICAgSU5URVJMRUFWRURfQUxJR05FRAorKQorCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlNpbXBsZUFycmF5U3RydWN0PEMyRmxleGlibGVQaXhlbEZvcm1hdERlc2NyaXB0b3JTdHJ1Y3Q+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4RmxleGlibGVQaXhlbEZvcm1hdERlc2NyaXB0b3JzPgorICAgICAgICBDMlN0b3JlRmxleGlibGVQaXhlbEZvcm1hdERlc2NyaXB0b3JzSW5mbzsKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIGFuZHJvaWQgZGF0YXNwYWNlIGZvciBhIHJhdyB2aWRlby9pbWFnZSBmcmFtZS4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhEYXRhU3BhY2U+IEMyU3RyZWFtRGF0YVNwYWNlSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0RBVEFfU1BBQ0VbXSA9ICJyYXcuZGF0YS1zcGFjZSI7CisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSBhbmRyb2lkIHN1cmZhY2Ugc2NhbGluZyBtb2RlIGZvciBhIHJhdyB2aWRlby9pbWFnZSBmcmFtZS4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhTdXJmYWNlU2NhbGluZz4gQzJTdHJlYW1TdXJmYWNlU2NhbGluZ0luZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9TVVJGQUNFX1NDQUxJTkdfTU9ERVtdID0gInJhdy5zdXJmYWNlLXNjYWxpbmciOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSU5QVVQgU1VSRkFDRSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoqCisgKiBJbnB1dCBzdXJmYWNlIEVPUworICovCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyRWFzeUJvb2xWYWx1ZSwga1BhcmFtSW5kZXhJbnB1dFN1cmZhY2VFb3M+CisgICAgICAgIEMySW5wdXRTdXJmYWNlRW9zVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VSRkFDRV9FT1NbXSA9ICJpbnB1dC1zdXJmYWNlLmVvcyI7CisKKy8qKgorICogU3RhcnQvc3VzcGVuZC9yZXN1bWUvc3RvcCBjb250cm9scyBhbmQgdGltZXN0YW1wcyBmb3IgaW5wdXQgc3VyZmFjZS4KKyAqCisgKiBUT0RPOiBtYWtlIHRoZXNlIGNvdW50ZXJzCisgKi8KKworc3RydWN0IEMyVGltZWRDb250cm9sU3RydWN0IHsKKyAgICBjMl9ib29sX3QgZW5hYmxlZDsgLy8vPCBjb250cm9sIGlzIGVuYWJsZWQKKyAgICBpbnQ2NF90IHRpbWVzdGFtcDsgLy8vPCBpZiBlbmFibGVkLCB0aW1lIHRoZSBjb250cm9sIHNob3VsZCB0YWtlIGVmZmVjdAorCisgICAgQzJUaW1lZENvbnRyb2xTdHJ1Y3QoKQorICAgICAgICA6IGVuYWJsZWQoQzJfRkFMU0UpLCB0aW1lc3RhbXAoMCkgeyB9CisKKyAgICAvKiBpbXBsaWNpdCAqLyBDMlRpbWVkQ29udHJvbFN0cnVjdCh1aW50NjRfdCB0aW1lc3RhbXBfKQorICAgICAgICA6IGVuYWJsZWQoQzJfVFJVRSksIHRpbWVzdGFtcCh0aW1lc3RhbXBfKSB7IH0KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoVGltZWRDb250cm9sKQorICAgIEMyRklFTEQoZW5hYmxlZCwgICAiZW5hYmxlZCIpCisgICAgQzJGSUVMRCh0aW1lc3RhbXAsICJ0aW1lc3RhbXAiKQorfTsKKwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJUaW1lZENvbnRyb2xTdHJ1Y3QsIGtQYXJhbUluZGV4U3RhcnRBdD4KKyAgICAgICAgQzJQb3J0U3RhcnRUaW1lc3RhbXBUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9TVVJGQUNFX1NUQVJUX0FUW10gPSAiaW5wdXQtc3VyZmFjZS5zdGFydCI7Cit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlRpbWVkQ29udHJvbFN0cnVjdCwga1BhcmFtSW5kZXhTdXNwZW5kQXQ+CisgICAgICAgIEMyUG9ydFN1c3BlbmRUaW1lc3RhbXBUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9TVVJGQUNFX1NVU1BFTkRfQVRbXSA9ICJpbnB1dC1zdXJmYWNlLnN1c3BlbmQiOwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJUaW1lZENvbnRyb2xTdHJ1Y3QsIGtQYXJhbUluZGV4UmVzdW1lQXQ+CisgICAgICAgIEMyUG9ydFJlc3VtZVRpbWVzdGFtcFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NVUkZBQ0VfUkVTVU1FX0FUW10gPSAiaW5wdXQtc3VyZmFjZS5yZXN1bWUiOwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJUaW1lZENvbnRyb2xTdHJ1Y3QsIGtQYXJhbUluZGV4U3RvcEF0PgorICAgICAgICBDMlBvcnRTdG9wVGltZXN0YW1wVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VSRkFDRV9TVE9QX0FUW10gPSAiaW5wdXQtc3VyZmFjZS5zdG9wIjsKKworLyoqCisgKiBUaW1lIG9mZnNldCBmb3IgaW5wdXQgc3VyZmFjZS4gSW5wdXQgdGltZXN0YW1wIHRvIGNvZGVjIGlzIHN1cmZhY2UgYnVmZmVyIHRpbWVzdGFtcCBwbHVzIHRoaXMKKyAqIHRpbWUgb2Zmc2V0LgorICovCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMySW50NjRWYWx1ZSwga1BhcmFtSW5kZXhUaW1lT2Zmc2V0PiBDMkNvbXBvbmVudFRpbWVPZmZzZXRUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9TVVJGQUNFX1RJTUVfT0ZGU0VUW10gPSAiaW5wdXQtc3VyZmFjZS50aW1lLW9mZnNldCI7CisKKy8qKgorICogTWluaW11bSBmcHMgZm9yIGlucHV0IHN1cmZhY2UuCisgKgorICogUmVwZWF0IGZyYW1lIHRvIG1lZXQgdGhpcy4KKyAqLwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleE1pbkZyYW1lUmF0ZT4gQzJQb3J0TWluRnJhbWVSYXRlVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VSRkFDRV9NSU5fRlJBTUVfUkFURVtdID0gImlucHV0LXN1cmZhY2UubWluLWZyYW1lLXJhdGUiOworCisvKioKKyAqIFRpbWVzdGFtcCBhZGp1c3RtZW50IChvdmVycmlkZSkgZm9yIGlucHV0IHN1cmZhY2UgYnVmZmVycy4gVGhlc2UgY29udHJvbCB0aGUgaW5wdXQgdGltZXN0YW1wCisgKiBmZWQgdG8gdGhlIGNvZGVjLCBidXQgZG8gbm90IGltcGFjdCB0aGUgb3V0cHV0IHRpbWVzdGFtcC4KKyAqLworc3RydWN0IEMyVGltZXN0YW1wR2FwQWRqdXN0bWVudFN0cnVjdCB7CisgICAgLy8vIGNvbnRyb2wgbW9kZXMKKyAgICBlbnVtIG1vZGVfdCA6IHVpbnQzMl90OworCisgICAgaW5saW5lIEMyVGltZXN0YW1wR2FwQWRqdXN0bWVudFN0cnVjdCgpOworCisgICAgaW5saW5lIEMyVGltZXN0YW1wR2FwQWRqdXN0bWVudFN0cnVjdChtb2RlX3QgbW9kZV8sIHVpbnQ2NF90IHZhbHVlXykKKyAgICAgICAgOiBtb2RlKG1vZGVfKSwgdmFsdWUodmFsdWVfKSB7IH0KKworICAgIG1vZGVfdCBtb2RlOyAgICAvLy88IGNvbnRyb2wgbW9kZQorICAgIHVpbnQ2NF90IHZhbHVlOyAvLy88IGNvbnRyb2wgdmFsdWUgZm9yIGdhcCBiZXR3ZWVuIHR3byB0aW1lc3RhbXAKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoVGltZXN0YW1wR2FwQWRqdXN0bWVudCkKKyAgICBDMkZJRUxEKG1vZGUsICJtb2RlIikKKyAgICBDMkZJRUxEKHZhbHVlLCAidmFsdWUiKQorfTsKKworQzJFTlVNKEMyVGltZXN0YW1wR2FwQWRqdXN0bWVudFN0cnVjdDo6bW9kZV90LCB1aW50MzJfdCwKKyAgICBOT05FLAorICAgIE1JTl9HQVAsCisgICAgRklYRURfR0FQLAorKTsKKworaW5saW5lIEMyVGltZXN0YW1wR2FwQWRqdXN0bWVudFN0cnVjdDo6QzJUaW1lc3RhbXBHYXBBZGp1c3RtZW50U3RydWN0KCkKKyAgICA6IG1vZGUoQzJUaW1lc3RhbXBHYXBBZGp1c3RtZW50U3RydWN0OjpOT05FKSwgdmFsdWUoMCkgeyB9CisKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVGltZXN0YW1wR2FwQWRqdXN0bWVudFN0cnVjdD4gQzJQb3J0VGltZXN0YW1wR2FwVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VSRkFDRV9USU1FU1RBTVBfQURKVVNUTUVOVFtdID0gImlucHV0LXN1cmZhY2UudGltZXN0YW1wLWFkanVzdG1lbnQiOworCisvLy8gQH0KKworI2VuZGlmICAvLyBDMkNPTkZJR19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkVudW0uaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJFbnVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBmYWQ4ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJFbnVtLmgKQEAgLTAsMCArMSwyMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyRU5VTV9IXworI2RlZmluZSBDMkVOVU1fSF8KKworI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxfQzJNYWNyb1V0aWxzLmg+CisKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLyoqIFxmaWxlCisgKiBUb29scyBmb3IgZWFzaWVyIGVudW0gc3VwcG9ydC4KKyAqLworCisvLy8gXGNvbmQgSU5URVJOQUwKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVVElMSVRJRVMgRk9SIEVOVU1FUkFUSU9OIFJFRkxFQ1RJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdGhhdCBhbGxvd3MgaWdub3JpbmcgZW51bSB2YWx1ZSBhc3NpZ25tZW50IChlLmcuIGJvdGggJyhfQzJFbnVtQ29uc3Qpa1ZhbHVlID0geCcKKyAqIGFuZCAnKF9DMkVudW1Db25zdClrVmFsdWUnIHdpbGwgZXZhbCB0byBrVmFsdWUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBfQzJFbnVtQ29uc3QgeworcHVibGljOgorICAgIC8vIGltcGxpY2l0IGNvbnZlcnNpb24gZnJvbSBUCisgICAgaW5saW5lIF9DMkVudW1Db25zdChUIHZhbHVlKSA6IF9tVmFsdWUodmFsdWUpIHt9CisgICAgLy8gaW1wbGljaXQgY29udmVyc2lvbiB0byBUCisgICAgaW5saW5lIG9wZXJhdG9yIFQoKSB7IHJldHVybiBfbVZhbHVlOyB9CisgICAgLy8gaW1wbGljaXQgY29udmVyc2lvbiB0byBDMlZhbHVlOjpQcmltaXRpdmUKKyAgICBpbmxpbmUgb3BlcmF0b3IgQzJWYWx1ZTo6UHJpbWl0aXZlKCkgeyByZXR1cm4gKFQpX21WYWx1ZTsgfQorICAgIC8vIGlnbm9yZSBhc3NpZ25tZW50IGFuZCByZXR1cm4gVCBoZXJlIHRvIGF2b2lkIGltcGxpY2l0IGNvbnZlcnNpb24gdG8gVCBsYXRlcgorICAgIGlubGluZSBUICZvcGVyYXRvciA9KFQgdmFsdWUgX191bnVzZWQpIHsgcmV0dXJuIF9tVmFsdWU7IH0KK3ByaXZhdGU6CisgICAgVCBfbVZhbHVlOworfTsKKworLy8vIG1hcHBlciB0byBnZXQgbmFtZSBvZiBlbnVtCisvLy8gXG5vdGUgdGhpcyB3aWxsIGNvbnRhaW4gYW55IGluaXRpYWxpemF0aW9uLCB3aGljaCB3ZSB3aWxsIHJlbW92ZSB3aGVuIGNvbnZlcnRpbmcgdG8gbG93ZXItY2FzZQorI2RlZmluZSBfQzJfR0VUX0VOVU1fTkFNRSh4LCB5KSAjeAorLy8vIG1hcHBlciB0byBnZXQgdmFsdWUgb2YgZW51bQorI2RlZmluZSBfQzJfR0VUX0VOVU1fVkFMVUUoeCwgdHlwZSkgKF9DMkVudW1Db25zdDx0eXBlPil4CisKKy8vLyBcZW5kY29uZAorCitjbGFzcyBfQzJFbnVtVXRpbHMgeworICAgIHN0YXRpYyBDMlN0cmluZyBjYW1lbENhc2VUb0Rhc2hlZChDMlN0cmluZyBuYW1lKTsKKworICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxDMlN0cmluZz4gc2FuaXRpemVFbnVtVmFsdWVOYW1lcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyU3RyaW5nTGl0ZXJhbD4gbmFtZXMsCisgICAgICAgICAgICBDMlN0cmluZ0xpdGVyYWwgX3ByZWZpeCA9IG51bGxwdHIpOworCisgICAgZnJpZW5kIGNsYXNzIEMyVXRpbFRlc3RfRW51bVV0aWxzVGVzdF9UZXN0OworCitwdWJsaWM6CisgICAgLy8gdGhpcyBtYXkgbm90IGJlIHVzZWQuLi4KKyAgICBzdGF0aWMgQzJfSElERSBzdGQ6OnZlY3RvcjxDMlN0cmluZz4gcGFyc2VFbnVtVmFsdWVzRnJvbVN0cmluZyhDMlN0cmluZ0xpdGVyYWwgdmFsdWUpOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdGF0aWMgQzJfSElERSBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIHNhbml0aXplRW51bVZhbHVlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFQ+IHZhbHVlcywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyU3RyaW5nTGl0ZXJhbD4gbmFtZXMsCisgICAgICAgICAgICBDMlN0cmluZ0xpdGVyYWwgcHJlZml4ID0gbnVsbHB0cikgeworICAgICAgICBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIG5hbWVkVmFsdWVzOworICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cmluZz4gc2FuaXRpemVkTmFtZXMgPSBzYW5pdGl6ZUVudW1WYWx1ZU5hbWVzKG5hbWVzLCBwcmVmaXgpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHZhbHVlcy5zaXplKCkgJiYgaSA8IHNhbml0aXplZE5hbWVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBuYW1lZFZhbHVlcy5lbXBsYWNlX2JhY2soc2FuaXRpemVkTmFtZXNbaV0sIHZhbHVlc1tpXSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5hbWVkVmFsdWVzOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEU+CisgICAgc3RhdGljIEMyX0hJREUgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBjdXN0b21FbnVtVmFsdWVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEMyU3RyaW5nTGl0ZXJhbCwgRT4+IGl0ZW1zKSB7CisgICAgICAgIEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgbmFtZWRWYWx1ZXM7CisgICAgICAgIGZvciAoYXV0byAmaXRlbSA6IGl0ZW1zKSB7CisgICAgICAgICAgICBuYW1lZFZhbHVlcy5lbXBsYWNlX2JhY2soaXRlbS5maXJzdCwgaXRlbS5zZWNvbmQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBuYW1lZFZhbHVlczsKKyAgICB9Cit9OworCisjZGVmaW5lIERFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSKG5hbWUsIHR5cGUsIHByZWZpeCwgLi4uKSBcCisgICAgX0RFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSKF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXywgbmFtZSwgdHlwZSwgcHJlZml4LCBcCisgICAgICAgICAgICAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfREVGSU5FX0MyX0VOVU1fVkFMVUVfQVVUT19IRUxQRVIoZW5hYmxlZCwgbmFtZSwgdHlwZSwgcHJlZml4LCAuLi4pIFwKKyAgICBfX0RFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSKGVuYWJsZWQsIG5hbWUsIHR5cGUsIHByZWZpeCwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX19ERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUihlbmFibGVkLCBuYW1lLCB0eXBlLCBwcmVmaXgsIC4uLikgXAorICAgIF9fX0RFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSIyNlbmFibGVkKG5hbWUsIHR5cGUsIHByZWZpeCwgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX19fREVGSU5FX0MyX0VOVU1fVkFMVUVfQVVUT19IRUxQRVIobmFtZSwgdHlwZSwgcHJlZml4LCAuLi4pIFwKK3RlbXBsYXRlPD4gXAorQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBDMkZpZWxkRGVzY3JpcHRvcjo6bmFtZWRWYWx1ZXNGb3IoY29uc3QgbmFtZSAmciBfX3VudXNlZCkgeyBcCisgICAgcmV0dXJuIF9DMkVudW1VdGlsczo6c2FuaXRpemVFbnVtVmFsdWVzKCBcCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IHsgX0MyX01BUChfQzJfR0VUX0VOVU1fVkFMVUUsIHR5cGUsIF9fVkFfQVJHU19fKSB9LCBcCisgICAgICAgICAgICB7IF9DMl9NQVAoX0MyX0dFVF9FTlVNX05BTUUsIHR5cGUsIF9fVkFfQVJHU19fKSB9LCBcCisgICAgICAgICAgICBwcmVmaXgpOyBcCit9CisjZGVmaW5lIF9fX0RFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKG5hbWUsIHR5cGUsIHByZWZpeCwgLi4uKQorCisjZGVmaW5lIERFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIobmFtZSwgbmFtZXMpIFwKKyAgICBfREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18sIG5hbWUsIG5hbWVzKQorI2RlZmluZSBfREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihlbmFibGVkLCBuYW1lLCBuYW1lcykgXAorICAgIF9fREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihlbmFibGVkLCBuYW1lLCBuYW1lcykKKyNkZWZpbmUgX19ERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSKGVuYWJsZWQsIG5hbWUsIG5hbWVzKSBcCisgICAgX19fREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUiMjZW5hYmxlZChuYW1lLCBuYW1lcykKKyNkZWZpbmUgX19fREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihuYW1lLCBuYW1lcykgXAordGVtcGxhdGU8PiBcCitDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0Zvcihjb25zdCBuYW1lICZyIF9fdW51c2VkKSB7IFwKKyAgICByZXR1cm4gX0MyRW51bVV0aWxzOjpjdXN0b21FbnVtVmFsdWVzKCBcCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8QzJTdHJpbmdMaXRlcmFsLCBuYW1lPj4gbmFtZXMpOyBcCit9CisjZGVmaW5lIF9fX0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVJfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18obmFtZSwgbmFtZXMpCisKKy8qKgorICogRGVmaW5lcyBhbiBlbnVtIHR5cGUgd2l0aCB0aGUgZGVmYXVsdCBuYW1lZCB2YWx1ZSBtYXBwZXIuIFRoZSBkZWZhdWx0IG1hcHBlcgorICogZmluZHMgYW5kIHJlbW92ZXMgdGhlIGxvbmdlc3QgY29tbW9uIHByZWZpeCBhY3Jvc3MgYWxsIG9mIHRoZSBlbnVtIHZhbHVlIG5hbWVzLCBhbmQKKyAqIHJlcGxhY2VzIGNhbWVsLWNhc2Ugc2VwYXJhdG9ycyB3aXRoIGRhc2hlcyAoJy0nKS4KKyAqCisgKiBUaGlzIG1hY3JvIG11c3QgYmUgdXNlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlIGFuZCBuYW1lc3BhY2UuCisgKgorICogIH5+fn5+fn5+fn5+fn4gKC5jcHApCisgKiAgQzJFTlVNKGMyX2VudW1fdCwgdWludDMyX3QsCisgKiAgICBDMl9WQUxVRTEsCisgKiAgICBDMl9WQUxVRTIgPSA1LAorICogICAgQzJfVkFMVUUzID0gQzJfVkFMVUUxICsgMSkKKyAqICAvLyBuYW1lZCB2YWx1ZXMgYXJlOiBDMl9WQUxVRTEgPT4gIjEiLCBDMl9WQUxVRTIgPT4gIjIiLCAuLi4KKyAqICAvLyBsb25nZXN0IGNvbW1vbiBwcmVmaXggaXMgIkMyX1ZBTFVFIgorICogIH5+fn5+fn5+fn5+fn4KKyAqCisgKiBccGFyYW0gbmFtZSBuYW1lIG9mIHRoZSBlbnVtIHR5cGUgKFRoaXMgY2FuIGJlIGFuIGlubmVyIGNsYXNzIGVudW0uKQorICogXHBhcmFtIHR5cGUgdW5kZXJseWluZyB0eXBlCisgKi8KKyNkZWZpbmUgQzJFTlVNKG5hbWUsIHR5cGUsIC4uLikgXAorZW51bSBuYW1lIDogdHlwZSB7IF9fVkFfQVJHU19fIH07IFwKK0RFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSKG5hbWUsIHR5cGUsIG51bGxwdHIsIF9fVkFfQVJHU19fKQorCisvKioKKyAqIERlZmluZXMgYW4gZW51bSB0eXBlIHdpdGggdGhlIGRlZmF1bHQgbmFtZWQgdmFsdWUgbWFwcGVyIGJ1dCBjdXN0b20gcHJlZml4LiBUaGUgZGVmYXVsdAorICogbWFwcGVyIHJlbW92ZXMgdGhlIHByZWZpeCBmcm9tIGFsbCBvZiB0aGUgZW51bSB2YWx1ZSBuYW1lcyAoaWYgcHJlc2VudCksIGFuZAorICogaW5zZXJ0cyBkYXNoZXMgYXQgY2FtZWwtY2FzZSBzZXBhcmF0b3JzIChsb3dIaWdoIGJlY29tZXMgbG93LWhpZ2gpIGFuZCBhbHNvIHJlcGxhY2VzCisgKiBub24tbGVhZGluZyB1bmRlcnNjb3JlcyB3aXRoIGRhc2hlcyAoJy0nKS4KKyAqCisgKiBUaGlzIG1hY3JvIG11c3QgYmUgdXNlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlIGFuZCBuYW1lc3BhY2UuCisgKgorICogIH5+fn5+fn5+fn5+fn4gKC5jcHApCisgKiAgQzJFTlVNX0NVU1RPTV9QUkVGSVgoYzJfZW51bV90LCB1aW50MzJfdCwgIkMyXyIsCisgKiAgICBDMl9WQUxVRTEsCisgKiAgICBDMl9WQUxVRTIgPSA1LAorICogICAgQzJfVkFMVUUzID0gQzJfVkFMVUUxICsgMSkKKyAqICAvLyBuYW1lZCB2YWx1ZXMgYXJlOiBDMl9WQUxVRTEgPT4gIlZBTFVFMSIsIEMyX1ZBTFVFMiA9PiAiVkFMVUUyIiwgLi4uCisgKiAgfn5+fn5+fn5+fn5+fgorICoKKyAqIFxwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIGVudW0gdHlwZSAoVGhpcyBjYW4gYmUgYW4gaW5uZXIgY2xhc3MgZW51bS4pCisgKiBccGFyYW0gdHlwZSB1bmRlcmx5aW5nIHR5cGUKKyAqIFxwYXJhbSBwcmVmaXggcHJlZml4IHRvIHJlbW92ZQorICovCisjZGVmaW5lIEMyRU5VTV9DVVNUT01fUFJFRklYKG5hbWUsIHR5cGUsIHByZWZpeCwgLi4uKSBcCitlbnVtIG5hbWUgOiB0eXBlIHsgX19WQV9BUkdTX18gfTsgXAorREVGSU5FX0MyX0VOVU1fVkFMVUVfQVVUT19IRUxQRVIobmFtZSwgdHlwZSwgcHJlZml4LCBfX1ZBX0FSR1NfXykKKworLyoqCisgKiBEZWZpbmVzIGFuIGVudW0gdHlwZSB3aXRoIGN1c3RvbSBuYW1lcy4KKyAqCisgKiBUaGlzIG1hY3JvIG11c3QgYmUgdXNlZCBpbiB0aGUgZ2xvYmFsIHNjb3BlIGFuZCBuYW1lc3BhY2UuCisgKgorICogIH5+fn5+fn5+fn5+fn4gKC5jcHApCisgKiAgQzJFTlVNX0NVU1RPTV9OQU1FUyhTb21lU3RydWN0OjpjMl9lbnVtX3QsIHVpbnQzMl90LCAoeworICogICAgICB7ICJPbmUiLCBTb21lU3RydWN0OjpDMl9WQUxVRTEgfSwKKyAqICAgICAgeyAiVHdvIiwgU29tZVN0cnVjdDo6QzJfVkFMVUUyIH0sCisgKiAgICAgIHsgIlRocmVlIiwgU29tZVN0cnVjdDo6QzJfVkFMVUUzIH0gfSksCisgKiAgICBDMl9WQUxVRTEsCisgKiAgICBDMl9WQUxVRTIgPSA1LAorICogICAgQzJfVkFMVUUzID0gQzJfVkFMVUUxICsgMSkKKyAqCisgKiAgLy8gbmFtZWQgdmFsdWVzIGFyZTogQzJfVkFMVUUxID0+ICJPbmUiLCBDMl9WQUxVRTIgPT4gIlR3byIsIC4uLgorICogIH5+fn5+fn5+fn5+fn4KKyAqLworI2RlZmluZSBDMkVOVU1fQ1VTVE9NX05BTUVTKG5hbWUsIHR5cGUsIG5hbWVzLCAuLi4pIFwKK2VudW0gbmFtZSA6IHR5cGUgeyBfX1ZBX0FSR1NfXyB9OyBcCitERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSKG5hbWUsIG5hbWVzKQorCisvKioKKyAqIE1ha2UgZW51bXMgdXNhYmxlIGFzIHRoZWlyIGludGVncmFsIHR5cGVzLgorICoKKyAqIE5vdGU6IHRoaXMgbWFrZXMgdGhlbSBub3QgdXNhYmxlIGluIHByaW50ZigpCisgKi8KK3RlbXBsYXRlPGNsYXNzIEU+CitzdHJ1Y3QgQzJFYXN5RW51bSB7CisgICAgdXNpbmcgVSA9IHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPEU+Ojp0eXBlOworICAgIEUgdmFsdWU7CisgICAgLy8gZGVmaW5lIGNvbnZlcnNpb24gZnVuY3Rpb25zCisgICAgaW5saW5lIGNvbnN0ZXhwciBvcGVyYXRvciBFKCkgY29uc3QgeyByZXR1cm4gdmFsdWU7IH0KKyAgICBpbmxpbmUgY29uc3RleHByIEMyRWFzeUVudW0oRSB2YWx1ZV8pIDogdmFsdWUodmFsdWVfKSB7IH0KKyAgICBpbmxpbmUgY29uc3RleHByIEMyRWFzeUVudW0oVSB2YWx1ZV8pIDogdmFsdWUoRSh2YWx1ZV8pKSB7IH0KKyAgICBpbmxpbmUgY29uc3RleHByIEMyRWFzeUVudW0oKSA9IGRlZmF1bHQ7Cit9OworCisvLyBtYWtlIEMyRWFzeUVudW0gYmVoYXZlIGxpa2UgYSByZWd1bGFyIGVudW0KKworbmFtZXNwYWNlIHN0ZCB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRT4KKyAgICBzdHJ1Y3QgdW5kZXJseWluZ190eXBlPEMyRWFzeUVudW08RT4+IHsKKyAgICAgICAgdHlwZWRlZiB0eXBlbmFtZSB1bmRlcmx5aW5nX3R5cGU8RT46OnR5cGUgdHlwZTsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRT4KKyAgICBzdHJ1Y3QgaXNfZW51bTxDMkVhc3lFbnVtPEU+PiB7CisgICAgICAgIGNvbnN0ZXhwciBzdGF0aWMgYm9vbCB2YWx1ZSA9IHRydWU7CisgICAgfTsKK30KKworI2VuZGlmICAvLyBDMkVOVU1fSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMlBhcmFtLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyUGFyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzhjMTdhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMlBhcmFtLmgKQEAgLTAsMCArMSwxNjg3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlBBUkFNX0hfCisjZGVmaW5lIEMyUEFSQU1fSF8KKworI2luY2x1ZGUgPEMyLmg+CisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvLy8gXGFkZHRvZ3JvdXAgUGFyYW1ldGVycworLy8vIEB7CisKKy8vLyBcZGVmZ3JvdXAgaW50ZXJuYWwgSW50ZXJuYWwgaGVscGVycy4KKworLyohCisgKiBcZmlsZQorICogUEFSQU1FVEVSUzogU0VUVElOR3MsIFRVTklOR3MsIGFuZCBJTkZPcworICogPT09CisgKgorICogVGhlc2UgcmVwcmVzZW50IG1pc2NlbGxhbmVvdXMgY29udHJvbCBhbmQgbWV0YWRhdGEgaW5mb3JtYXRpb24gYW5kIGFyZSBsaWtlbHkgY29waWVkIGludG8KKyAqIGtlcm5lbCBzcGFjZS4gVGhlcmVmb3JlLCB0aGVzZSBhcmUgQy1saWtlIHN0cnVjdHVyZXMgZGVzaWduZWQgdG8gY2FycnkganVzdCBhIHNtYWxsIGFtb3VudCBvZgorICogaW5mb3JtYXRpb24uIFdlIGFyZSB1c2luZyBDKysgdG8gYmUgYWJsZSB0byBhZGQgY29uc3RydWN0b3JzLCBhcyB3ZWxsIGFzIG5vbi12aXJ0dWFsIGFuZCBjbGFzcworICogbWV0aG9kcy4KKyAqCisgKiA9PVNwZWNpZmljYXRpb24gZGV0YWlsczoKKyAqCisgKiBSZXN0cmljdGlvbnM6CisgKiAgIC0gbXVzdCBiZSBQT0Qgc3RydWN0LCBlLmcuIG5vIHZ0YWJsZSAobm8gdmlydHVhbCBkZXN0cnVjdG9yKQorICogICAtIG11c3QgaGF2ZSB0aGUgc2FtZSBzaXplIGluIDY0LWJpdCBhbmQgMzItYml0IG1vZGUgKG5vIHNpemVfdCkKKyAqICAgLSBhcyBzdWNoLCBubyBwb2ludGVyIG1lbWJlcnMKKyAqICAgLSBzb21lIGNvbW1vbiBtZW1iZXIgZmllbGQgbmFtZXMgYXJlIHJlc2VydmVkIGFzIHRoZXkgYXJlIGRlZmluZWQgYXMgbWV0aG9kcyBmb3IgYWxsCisgKiAgICAgcGFyYW1ldGVyczoKKyAqICAgICB0aGV5IGFyZTogc2l6ZSwgdHlwZSwga2luZCwgaW5kZXggYW5kIHN0cmVhbQorICoKKyAqIEJlaGF2aW9yOgorICogLSBQYXJhbXMgY2FuIGJlIGdsb2JhbCAobm90IHJlbGF0ZWQgdG8gaW5wdXQgb3Igb3V0cHV0KSwgcmVsYXRlZCB0byBpbnB1dCBvciBvdXRwdXQsCisgKiAgIG9yIHJlbGF0ZWQgdG8gYW4gaW5wdXQvb3V0cHV0IHN0cmVhbS4KKyAqIC0gQWxsIHBhcmFtcyBhcmUgcXVlcmllZC9zZXQgdXNpbmcgYSB1bmlxdWUgcGFyYW0gaW5kZXgsIHdoaWNoIGluY29ycG9yYXRlcyBhIHBvdGVudGlhbCBzdHJlYW0KKyAqICAgaW5kZXggYW5kL29yIHBvcnQuCisgKiAtIFF1ZXJ5aW5nIChzdXBwb3J0ZWQpIHBhcmFtcyBNVVNUIG5ldmVyIGZhaWwuCisgKiAtIEFsbCBwYXJhbXMgTVVTVCBoYXZlIGRlZmF1bHQgdmFsdWVzLgorICogLSBJZiBzb21lIGZpZWxkcyBoYXZlICJ1bnN1cHBvcnRlZCIgb3IgImludmFsaWQiIHZhbHVlcyBkdXJpbmcgc2V0dGluZywgdGhpcyBTSE9VTEQgYmUKKyAqICAgY29tbXVuaWNhdGVkIHRvIHRoZSBhcHAuCisgKiAgIGEpIElkZWFsbHksIHRoaXMgc2hvdWxkIGJlIGF2b2lkZWQuICBXaGVuIHNldHRpbmcgcGFyYW1ldGVycywgaW4gZ2VuZXJhbCwgY29tcG9uZW50IHNob3VsZCBkbworICogICAgICJiZXN0IGVmZm9ydCIgdG8gYXBwbHkgYWxsIHNldHRpbmdzLiBJdCBzaG91bGQgY2hhbmdlICJpbnZhbGlkL3Vuc3VwcG9ydGVkIiB2YWx1ZXMgdG8gdGhlCisgKiAgICAgbmVhcmVzdCBzdXBwb3J0ZWQgdmFsdWVzLgorICogICAtIFRoaXMgaXMgY29tbXVuaWNhdGVkIHRvIHRoZSBjbGllbnQgYnkgY2hhbmdpbmcgdGhlIHNvdXJjZSB2YWx1ZXMgaW4gdHVuZSgpLworICogICAgIGNvbmZpZ3VyZSgpLgorICogICBiKSBJZiBmYWxsaW5nIGJhY2sgdG8gYSBzdXBwb3J0ZWQgdmFsdWUgaXMgYWJzb2x1dGVseSBpbXBvc3NpYmxlLCB0aGUgY29tcG9uZW50IFNIQUxMIHJldHVybgorICogICAgIGFuIGVycm9yIGZvciB0aGUgc3BlY2lmaWMgc2V0dGluZywgYnV0IHNob3VsZCBjb250aW51ZSB0byBhcHBseSBvdGhlciBzZXR0aW5ncy4KKyAqICAgICBUT0RPOiB0aGlzIGN1cnJlbnRseSBtYXkgcmVzdWx0IGluIHVuaW50ZW5kZWQgcmVzdWx0cy4KKyAqCisgKiAqKk5PVEU6KiogdW5saWtlIE9NWCwgcGFyYW1zIGFyZSBub3QgdmVyc2lvbmVkLiBJbnN0ZWFkLCBhIG5ldyBzdHJ1Y3Qgd2l0aCBuZXcgcGFyYW0gaW5kZXgKKyAqIFNIQUxMIGJlIGFkZGVkIGFzIG5ldyB2ZXJzaW9ucyBhcmUgcmVxdWlyZWQuCisgKgorICogVGhlIHByb3BlciBzdWJ0eXBlIChTZXR0aW5nLCBJbmZvIG9yIFBhcmFtKSBpcyBpbmNvcnBvcmF0ZWQgaW50byB0aGUgY2xhc3MgdHlwZS4gRGVmaW5lIHN0cnVjdHMKKyAqIHRvIGRlZmluZSBtdWx0aXBsZSBzdWJ0eXBlZCB2ZXJzaW9ucyBvZiByZWxhdGVkIHBhcmFtZXRlcnMuCisgKgorICogPT1JbXBsZW1lbnRhdGlvbiBkZXRhaWxzOgorICoKKyAqIC0gVXNlIG1hY3JvcyB0byBkZWZpbmUgcGFyYW1ldGVycworICogLSBBbGwgcGFyYW1ldGVycyBtdXN0IGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yCisgKiAgIC0gVGhpcyBpcyBvbmx5IHVzZWQgZm9yIGluc3RhbnRpYXRpbmcgdGhlIGNsYXNzIGluIHNvdXJjZSAoZS5nLiB3aWxsIG5vdCBiZSB1c2VkCisgKiAgICAgd2hlbiBidWlsZGluZyBhIHBhcmFtZXRlciBieSB0aGUgZnJhbWV3b3JrIGZyb20ga2V5L3ZhbHVlIHBhaXJzLikKKyAqLworCisvLy8gXGluZ3JvdXAgaW50ZXJuYWwKKworLyoqCisgKiBQYXJhbWV0ZXIgYmFzZSBjbGFzcy4KKyAqLworc3RydWN0IEMyUGFyYW0geworICAgIC8vIHBhcmFtIGluZGV4IGVuY29tcGFzc2VzIHRoZSBmb2xsb3dpbmc6CisgICAgLy8KKyAgICAvLyAtIGtpbmQgKHNldHRpbmcsIHR1bmluZywgaW5mbywgc3RydWN0KQorICAgIC8vIC0gc2NvcGUKKyAgICAvLyAgIC0gZGlyZWN0aW9uIChnbG9iYWwsIGlucHV0LCBvdXRwdXQpCisgICAgLy8gICAtIHN0cmVhbSBmbGFnCisgICAgLy8gICAtIHN0cmVhbSBJRCAodXN1YWxseSAwKQorICAgIC8vIC0gYW5kIHRoZSBwYXJhbWV0ZXIncyB0eXBlIChjb3JlIGluZGV4KQorICAgIC8vICAgLSBmbGV4aWJsZSBwYXJhbWV0ZXIgZmxhZworICAgIC8vICAgLSB2ZW5kb3IgZXh0ZW5zaW9uIGZsYWcKKyAgICAvLyAgIC0gdHlwZSBpbmRleCAodGhpcyBpbmNsdWRlcyB0aGUgdmVuZG9yIGV4dGVuc2lvbiBmbGFnKQorICAgIC8vCisgICAgLy8gbGF5b3V0OgorICAgIC8vCisgICAgLy8gICAgICAgIGtpbmQgOiA8LS0tLS0tLSBzY29wZSAtLS0tLS0tPiA6IDwtLS0tLSBjb3JlIGluZGV4IC0tLS0tPgorICAgIC8vICAgICAgKy0tLS0tLSstLS0tLSstLS0rLS0tLS0tKy0tLS0tLS0tKy0tLS18LS0tLS0tKy0tLS0tLS0tLS0tLS0tKworICAgIC8vICAgICAgfCBraW5kIHwgZGlyIHwgLSB8c3RyZWFtfHN0cmVhbUlEfGZsZXh8dmVuZG9yfCAgdHlwZSBpbmRleCAgfAorICAgIC8vICAgICAgKy0tLS0tLSstLS0tLSstLS0rLS0tLS0tKy0tLS0tLS0tKy0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tKworICAgIC8vICBiaXQ6IDMxLi4zMCAyOS4yOCAgICAgICAyNSAgIDI0IC4uIDE3ICAxNiAgICAxNSAgIDE0ICAgIC4uICAgICAwCisgICAgLy8KK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDMlBhcmFtIGtpbmRzLCB1c2FibGUgYXMgYml0bWFwcy4KKyAgICAgKi8KKyAgICBlbnVtIGtpbmRfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgTk9ORSAgICA9IDAsCisgICAgICAgIFNUUlVDVCAgPSAoMSA8PCAwKSwKKyAgICAgICAgSU5GTyAgICA9ICgxIDw8IDEpLAorICAgICAgICBTRVRUSU5HID0gKDEgPDwgMiksCisgICAgICAgIFRVTklORyAgPSAoMSA8PCAzKSB8IFNFVFRJTkcsIC8vIHR1bmluZ3MgYXJlIHNldHRpbmdzCisgICAgfTsKKworICAgIC8qKgorICAgICAqIFRoZSBwYXJhbWV0ZXIgdHlwZSBpbmRleCBzcGVjaWZpZXMgdGhlIHVuZGVybHlpbmcgcGFyYW1ldGVyIHR5cGUgb2YgYSBwYXJhbWV0ZXIgYXMKKyAgICAgKiBhbiBpbnRlZ2VyIHZhbHVlLgorICAgICAqCisgICAgICogUGFyYW1ldGVyIHR5cGVzIGFyZSBkaXZpZGVkIGludG8gdHdvIGdyb3VwczogcGxhdGZvcm0gdHlwZXMgYW5kIHZlbmRvciB0eXBlcy4KKyAgICAgKgorICAgICAqIFBsYXRmb3JtIHR5cGVzIGFyZSBkZWZpbmVkIGJ5IHRoZSBwbGF0Zm9ybSBhbmQgYXJlIGNvbW1vbiBmb3IgYWxsIGltcGxlbWVudGF0aW9ucy4KKyAgICAgKgorICAgICAqIFZlbmRvciB0eXBlcyBhcmUgZGVmaW5lZCBieSBlYWNoIHZlbmRvcnMsIHNvIHRoZXkgbWF5IGRpZmZlciBiZXR3ZWVuIGltcGxlbWVudGF0aW9ucy4KKyAgICAgKiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0IHZlbmRvciB0eXBlcyBiZSB0aGUgc2FtZSBmb3IgYWxsIGltcGxlbWVudGF0aW9ucyBieSBhIHNwZWNpZmljCisgICAgICogdmVuZG9yLgorICAgICAqLworICAgIHR5cGVkZWYgdWludDMyX3QgdHlwZV9pbmRleF90OworICAgIGVudW0gOiB1aW50MzJfdCB7CisgICAgICAgICAgICBUWVBFX0lOREVYX1ZFTkRPUl9TVEFSVCA9IDB4MDAwMDgwMDAsIC8vLzwgdmVuZG9yIGluZGljZXMgU0hBTEwgc3RhcnQgYWZ0ZXIgdGhpcworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBDb3JlIGluZGV4IGlzIHRoZSB1bmRlcmx5aW5nIHBhcmFtZXRlciB0eXBlIGZvciBhIHBhcmFtZXRlci4gSXQgaXMgdXNlZCB0byBkZXNjcmliZSB0aGUKKyAgICAgKiBsYXlvdXQgb2YgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgcmVnYXJkbGVzcyBvZiB0aGUgY29tcG9uZW50IG9yIHBhcmFtZXRlciBraW5kL3Njb3BlLgorICAgICAqCisgICAgICogSXQgaXMgdXNlZCB0byBpZGVudGlmeSBhbmQgZGlzdGluZ3Vpc2ggZ2xvYmFsIHBhcmFtZXRlcnMsIGFuZCBhbHNvIHBhcmFtZXRlcnMgb24gYSBnaXZlbgorICAgICAqIHBvcnQgb3Igc3RyZWFtLiBUaGV5IG11c3QgYmUgdW5pcXVlIGZvciB0aGUgc2V0IG9mIGdsb2JhbCBwYXJhbWV0ZXJzLCBhcyB3ZWxsIGFzIGZvciB0aGUKKyAgICAgKiBzZXQgb2YgcGFyYW1ldGVycyBvbiBlYWNoIHBvcnQgb3IgZWFjaCBzdHJlYW0sIGJ1dCB0aGUgc2FtZSBjb3JlIGluZGV4IGNhbiBiZSB1c2VkIGZvcgorICAgICAqIHBhcmFtZXRlcnMgb24gZGlmZmVyZW50IHN0cmVhbXMgb3IgcG9ydHMsIGFzIHdlbGwgYXMgZm9yIGdsb2JhbCBwYXJhbWV0ZXJzIGFuZCBwb3J0L3N0cmVhbQorICAgICAqIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBNdWx0aXBsZSBwYXJhbWV0ZXIgdHlwZXMgY2FuIHNoYXJlIHRoZSBzYW1lIGxheW91dC4KKyAgICAgKgorICAgICAqIFxub3RlIFRoZSBsYXlvdXQgZm9yIGFsbCBwYXJhbWV0ZXJzIHdpdGggdGhlIHNhbWUgY29yZSBpbmRleCBhY3Jvc3MgYWxsIGNvbXBvbmVudHMgbXVzdAorICAgICAqIGJlIGlkZW50aWNhbC4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgQ29yZUluZGV4IHsKKyAgICAvL3B1YmxpYzoKKyAgICAgICAgZW51bSA6IHVpbnQzMl90IHsKKyAgICAgICAgICAgIElTX0ZMRVhfRkxBRyAgICA9IDB4MDAwMTAwMDAsCisgICAgICAgICAgICBJU19SRVFVRVNUX0ZMQUcgPSAweDAwMDIwMDAwLAorICAgICAgICB9OworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICAgICAgS0lORF9NQVNLICAgICAgPSAweEMwMDAwMDAwLAorICAgICAgICAgICAgS0lORF9TVFJVQ1QgICAgPSAweDAwMDAwMDAwLAorICAgICAgICAgICAgS0lORF9UVU5JTkcgICAgPSAweDQwMDAwMDAwLAorICAgICAgICAgICAgS0lORF9TRVRUSU5HICAgPSAweDgwMDAwMDAwLAorICAgICAgICAgICAgS0lORF9JTkZPICAgICAgPSAweEMwMDAwMDAwLAorCisgICAgICAgICAgICBESVJfTUFTSyAgICAgICA9IDB4MzAwMDAwMDAsCisgICAgICAgICAgICBESVJfR0xPQkFMICAgICA9IDB4MjAwMDAwMDAsCisgICAgICAgICAgICBESVJfVU5ERUZJTkVEICA9IERJUl9NQVNLLCAvLyBNVVNUIGhhdmUgYWxsIGJpdHMgc2V0CisgICAgICAgICAgICBESVJfSU5QVVQgICAgICA9IDB4MDAwMDAwMDAsCisgICAgICAgICAgICBESVJfT1VUUFVUICAgICA9IDB4MTAwMDAwMDAsCisKKyAgICAgICAgICAgIElTX1NUUkVBTV9GTEFHICA9IDB4MDAxMDAwMDAsCisgICAgICAgICAgICBTVFJFQU1fSURfTUFTSyAgPSAweDAzRTAwMDAwLAorICAgICAgICAgICAgU1RSRUFNX0lEX1NISUZUID0gMjEsCisgICAgICAgICAgICBNQVhfU1RSRUFNX0lEICAgPSBTVFJFQU1fSURfTUFTSyA+PiBTVFJFQU1fSURfU0hJRlQsCisgICAgICAgICAgICBTVFJFQU1fTUFTSyAgICAgPSBJU19TVFJFQU1fRkxBRyB8IFNUUkVBTV9JRF9NQVNLLAorCisgICAgICAgICAgICBJU19WRU5ET1JfRkxBRyAgPSAweDAwMDA4MDAwLAorICAgICAgICAgICAgVFlQRV9JTkRFWF9NQVNLID0gMHgwMDAwRkZGRiwKKyAgICAgICAgICAgIENPUkVfTUFTSyAgICAgICA9IFRZUEVfSU5ERVhfTUFTSyB8IElTX0ZMRVhfRkxBRywKKyAgICAgICAgfTsKKworICAgIHB1YmxpYzoKKyAgICAgICAgLy8vIGNvbnN0cnVjdG9yL2NvbnZlcnNpb24gZnJvbSB1aW50MzJfdAorICAgICAgICBpbmxpbmUgQ29yZUluZGV4KHVpbnQzMl90IGluZGV4KSA6IG1JbmRleChpbmRleCkgeyB9CisKKyAgICAgICAgLy8gbm8gY29udmVyc2lvbiBmcm9tIHVpbnQ2NF90CisgICAgICAgIGlubGluZSBDb3JlSW5kZXgodWludDY0X3QgaW5kZXgpID0gZGVsZXRlOworCisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSB2ZW5kb3IgZXh0ZW5zaW9uIHBhcmFtZXRlcgorICAgICAgICBpbmxpbmUgYm9vbCBpc1ZlbmRvcigpIGNvbnN0IHsgcmV0dXJuIG1JbmRleCAmIElTX1ZFTkRPUl9GTEFHOyB9CisKKyAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIGZsZXhpYmxlIHBhcmFtZXRlciAod2l0aCB2YXJpYWJsZSBzaXplKQorICAgICAgICBpbmxpbmUgYm9vbCBpc0ZsZXhpYmxlKCkgY29uc3QgeyByZXR1cm4gbUluZGV4ICYgSVNfRkxFWF9GTEFHOyB9CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIGNvcmUgaW5kZXgKKyAgICAgICAgLy8vIFRoaXMgaXMgdGhlIGNvbWJpbmF0aW9uIG9mIHRoZSBwYXJhbWV0ZXIgdHlwZSBpbmRleCBhbmQgdGhlIGZsZXhpYmxlIGZsYWcuCisgICAgICAgIGlubGluZSB1aW50MzJfdCBjb3JlSW5kZXgoKSBjb25zdCB7IHJldHVybiBtSW5kZXggJiBDT1JFX01BU0s7IH0KKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgcGFyYW1ldGVyIHR5cGUgaW5kZXgKKyAgICAgICAgaW5saW5lIHR5cGVfaW5kZXhfdCB0eXBlSW5kZXgoKSBjb25zdCB7IHJldHVybiBtSW5kZXggJiBUWVBFX0lOREVYX01BU0s7IH0KKworICAgICAgICBERUZJTkVfRklFTERfQU5EX01BU0tfQkFTRURfQ09NUEFSSVNPTl9PUEVSQVRPUlMoQ29yZUluZGV4LCBtSW5kZXgsIENPUkVfTUFTSykKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgdWludDMyX3QgbUluZGV4OworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUeXBlIGVuY29tcGFzc2VzIHRoZSBwYXJhbWV0ZXIncyBraW5kICh0dW5pbmcsIHNldHRpbmcsIGluZm8pLCBpdHMgc2NvcGUgKHdoZXRoZXIgdGhlCisgICAgICogcGFyYW1ldGVyIGlzIGdsb2JhbCwgaW5wdXQgb3Igb3V0cHV0LCBhbmQgd2hldGhlciBpdCBpcyBmb3IgYSBzdHJlYW0pIGFuZCB0aGUgaXRzIGJhc2UKKyAgICAgKiBpbmRleCAod2hpY2ggYWxzbyBkZXRlcm1pbmVzIGl0cyBsYXlvdXQpLgorICAgICAqLworICAgIHN0cnVjdCBUeXBlIDogcHVibGljIENvcmVJbmRleCB7CisgICAgLy9wdWJsaWM6CisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBnbG9iYWwgcGFyYW1ldGVyIChub3QgZm9yIGlucHV0IG5vciBvdXRwdXQpCisgICAgICAgIGlubGluZSBib29sIGlzR2xvYmFsKCkgY29uc3QgeyByZXR1cm4gKG1JbmRleCAmIERJUl9NQVNLKSA9PSBESVJfR0xPQkFMOyB9CisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYW4gaW5wdXQgb3IgaW5wdXQgc3RyZWFtIHBhcmFtZXRlcgorICAgICAgICBpbmxpbmUgYm9vbCBmb3JJbnB1dCgpIGNvbnN0IHsgcmV0dXJuIChtSW5kZXggJiBESVJfTUFTSykgPT0gRElSX0lOUFVUOyB9CisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYW4gb3V0cHV0IG9yIG91dHB1dCBzdHJlYW0gcGFyYW1ldGVyCisgICAgICAgIGlubGluZSBib29sIGZvck91dHB1dCgpIGNvbnN0IHsgcmV0dXJuIChtSW5kZXggJiBESVJfTUFTSykgPT0gRElSX09VVFBVVDsgfQorCisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBzdHJlYW0gcGFyYW1ldGVyCisgICAgICAgIGlubGluZSBib29sIGZvclN0cmVhbSgpIGNvbnN0IHsgcmV0dXJuIG1JbmRleCAmIElTX1NUUkVBTV9GTEFHOyB9CisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBwb3J0IChpbnB1dCBvciBvdXRwdXQpIHBhcmFtZXRlcgorICAgICAgICBpbmxpbmUgYm9vbCBmb3JQb3J0KCkgY29uc3QgICB7IHJldHVybiAhZm9yU3RyZWFtKCkgJiYgIWlzR2xvYmFsKCk7IH0KKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgcGFyYW1ldGVyIHR5cGU6IHRoZSBwYXJhbWV0ZXIgaW5kZXggd2l0aG91dCB0aGUgc3RyZWFtIElECisgICAgICAgIGlubGluZSB1aW50MzJfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gbUluZGV4ICYgKH5TVFJFQU1fSURfTUFTSyk7IH0KKworICAgICAgICAvLy8gcmV0dXJuIHRoZSBraW5kIChzdHJ1Y3QsIGluZm8sIHNldHRpbmcgb3IgdHVuaW5nKSBvZiB0aGlzIHBhcmFtCisgICAgICAgIGlubGluZSBraW5kX3Qga2luZCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHN3aXRjaCAobUluZGV4ICYgS0lORF9NQVNLKSB7CisgICAgICAgICAgICAgICAgY2FzZSBLSU5EX1NUUlVDVDogcmV0dXJuIFNUUlVDVDsKKyAgICAgICAgICAgICAgICBjYXNlIEtJTkRfSU5GTzogcmV0dXJuIElORk87CisgICAgICAgICAgICAgICAgY2FzZSBLSU5EX1NFVFRJTkc6IHJldHVybiBTRVRUSU5HOworICAgICAgICAgICAgICAgIGNhc2UgS0lORF9UVU5JTkc6IHJldHVybiBUVU5JTkc7CisgICAgICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PTkU7IC8vIHNob3VsZCBub3QgaGFwcGVuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gY29uc3RydWN0b3IvY29udmVyc2lvbiBmcm9tIHVpbnQzMl90CisgICAgICAgIGlubGluZSBUeXBlKHVpbnQzMl90IGluZGV4KSA6IENvcmVJbmRleChpbmRleCkgeyB9CisKKyAgICAgICAgLy8gbm8gY29udmVyc2lvbiBmcm9tIHVpbnQ2NF90CisgICAgICAgIGlubGluZSBUeXBlKHVpbnQ2NF90IGluZGV4KSA9IGRlbGV0ZTsKKworICAgICAgICBERUZJTkVfRklFTERfQU5EX01BU0tfQkFTRURfQ09NUEFSSVNPTl9PUEVSQVRPUlMoVHlwZSwgbUluZGV4LCB+U1RSRUFNX0lEX01BU0spCisKKyAgICBwcml2YXRlOgorICAgICAgICBmcmllbmQgc3RydWN0IEMyUGFyYW07ICAgLy8gZm9yIHNldFBvcnQoKQorICAgICAgICBmcmllbmQgc3RydWN0IEMyVHVuaW5nOyAgLy8gZm9yIEtJTkRfVFVOSU5HCisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgQzJTZXR0aW5nOyAvLyBmb3IgS0lORF9TRVRUSU5HCisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgQzJJbmZvOyAgICAvLyBmb3IgS0lORF9JTkZPCisgICAgICAgIC8vIGZvciBESVJfR0xPQkFMCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBJLCBjbGFzcyBGPiBmcmllbmQgc3RydWN0IEMyR2xvYmFsUGFyYW07CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBJLCBjbGFzcyBGPiBmcmllbmQgc3RydWN0IEMyUG9ydFBhcmFtOyAgIC8vIGZvciBrRGlyKgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgSSwgY2xhc3MgRj4gZnJpZW5kIHN0cnVjdCBDMlN0cmVhbVBhcmFtOyAvLyBmb3Iga0RpcioKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsgLy8gZm9yIHRlc3RpbmcKKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgcG9ydC9zdHJlYW0gZGlyZWN0aW9uLgorICAgICAgICAgKiBAcmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgY291bGQgbm90IHNldCBkaXJlY3Rpb24gKGUuZy4gaXQgaXMgZ2xvYmFsIHBhcmFtKS4KKyAgICAgICAgICovCisgICAgICAgIGlubGluZSBib29sIHNldFBvcnQoYm9vbCBvdXRwdXQpIHsKKyAgICAgICAgICAgIGlmIChpc0dsb2JhbCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtSW5kZXggPSAobUluZGV4ICYgfkRJUl9NQVNLKSB8IChvdXRwdXQgPyBESVJfT1VUUFVUIDogRElSX0lOUFVUKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBpbmRleCBlbmNvbXBhc3NlcyBhbGwgcmVtYWluaW5nIGluZm9ybWF0aW9uOiBiYXNpY2FsbHkgdGhlIHN0cmVhbSBJRC4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgSW5kZXggOiBwdWJsaWMgVHlwZSB7CisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBpbmRleCBhcyB1aW50MzJfdAorICAgICAgICBpbmxpbmUgb3BlcmF0b3IgdWludDMyX3QoKSBjb25zdCB7IHJldHVybiBtSW5kZXg7IH0KKworICAgICAgICAvLy8gY29uc3RydWN0b3IvY29udmVyc2lvbiBmcm9tIHVpbnQzMl90CisgICAgICAgIGlubGluZSBJbmRleCh1aW50MzJfdCBpbmRleCkgOiBUeXBlKGluZGV4KSB7IH0KKworICAgICAgICAvLy8gY29weSBjb25zdHJ1Y3RvcgorICAgICAgICBpbmxpbmUgSW5kZXgoY29uc3QgSW5kZXggJmluZGV4KSA9IGRlZmF1bHQ7CisKKyAgICAgICAgLy8gbm8gY29udmVyc2lvbiBmcm9tIHVpbnQ2NF90CisgICAgICAgIGlubGluZSBJbmRleCh1aW50NjRfdCBpbmRleCkgPSBkZWxldGU7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIHN0cmVhbSBJRCBvciB+MCBpZiBub3QgYSBzdHJlYW0KKyAgICAgICAgaW5saW5lIHVuc2lnbmVkIHN0cmVhbSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBmb3JTdHJlYW0oKSA/IHJhd1N0cmVhbSgpIDogfjBVOworICAgICAgICB9CisKKyAgICAgICAgLy8vIFJldHVybnMgYW4gaW5kZXggd2l0aCBzdHJlYW0gZmllbGQgc2V0IHRvIGdpdmVuIHN0cmVhbS4KKyAgICAgICAgaW5saW5lIEluZGV4IHdpdGhTdHJlYW0odW5zaWduZWQgc3RyZWFtKSBjb25zdCB7CisgICAgICAgICAgICBJbmRleCBpeCA9IG1JbmRleDsKKyAgICAgICAgICAgICh2b2lkKWl4LnNldFN0cmVhbShzdHJlYW0pOworICAgICAgICAgICAgcmV0dXJuIGl4OworICAgICAgICB9CisKKyAgICAgICAgLy8vIHNldHMgdGhlIHBvcnQgKGRpcmVjdGlvbikuIFJldHVybnMgdHJ1ZSBpZmYgc3VjY2Vzc2Z1bC4KKyAgICAgICAgaW5saW5lIEluZGV4IHdpdGhQb3J0KGJvb2wgb3V0cHV0KSBjb25zdCB7CisgICAgICAgICAgICBJbmRleCBpeCA9IG1JbmRleDsKKyAgICAgICAgICAgICh2b2lkKWl4LnNldFBvcnQob3V0cHV0KTsKKyAgICAgICAgICAgIHJldHVybiBpeDsKKyAgICAgICAgfQorCisgICAgICAgIERFRklORV9GSUVMRF9CQVNFRF9DT01QQVJJU09OX09QRVJBVE9SUyhJbmRleCwgbUluZGV4KQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBDMlBhcmFtOyAgICAgICAgICAgLy8gZm9yIHNldFN0cmVhbSwgTWFrZVN0cmVhbUlkLCBpc1ZhbGlkCisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgX0MyUGFyYW1JbnNwZWN0b3I7IC8vIGZvciB0ZXN0aW5nCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdHlwZSBpcyB2YWxpZCwgZS5nLiBkaXJlY3Rpb24gaXMgbm90IHVuZGVmaW5lZCBBTkQKKyAgICAgICAgICogc3RyZWFtIGlzIDAgaWYgbm90IGEgc3RyZWFtIHBhcmFtLgorICAgICAgICAgKi8KKyAgICAgICAgaW5saW5lIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsKKyAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vIFR5cGU6OmlzVmFsaWQgKGV2ZW4gdGhvdWdoIHNvbWUgb2YgdGhpcyBjaGVjayBjb3VsZCBiZQorICAgICAgICAgICAgLy8gcGVyZm9ybWVkIG9uIHR5cGVzKSBhcyB0aGlzIGlzIG9ubHkgdXNlZCBvbiBpbmRleC4uLgorICAgICAgICAgICAgcmV0dXJuIChmb3JTdHJlYW0oKSA/IHJhd1N0cmVhbSgpIDwgTUFYX1NUUkVBTV9JRCA6IHJhd1N0cmVhbSgpID09IDApCisgICAgICAgICAgICAgICAgICAgICYmIChtSW5kZXggJiBESVJfTUFTSykgIT0gRElSX1VOREVGSU5FRDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSByYXcgc3RyZWFtIElEIGZpZWxkCisgICAgICAgIGlubGluZSB1bnNpZ25lZCByYXdTdHJlYW0oKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gKG1JbmRleCAmIFNUUkVBTV9JRF9NQVNLKSA+PiBTVFJFQU1fSURfU0hJRlQ7CisgICAgICAgIH0KKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgc3RyZWFtSWQgYml0ZmllbGQgZm9yIGEgZ2l2ZW4gfHN0cmVhbXwuIElmIHN0cmVhbSBpcyBpbnZhbGlkLAorICAgICAgICAvLy8gcmV0dXJucyBhbiBpbnZhbGlkIGJpdGZpZWxkLgorICAgICAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IE1ha2VTdHJlYW1JZCh1bnNpZ25lZCBzdHJlYW0pIHsKKyAgICAgICAgICAgIC8vIHNhdHVyYXRlIHN0cmVhbSBJRCAobWF4IHZhbHVlIGlzIGludmFsaWQpCisgICAgICAgICAgICBpZiAoc3RyZWFtID4gTUFYX1NUUkVBTV9JRCkgeworICAgICAgICAgICAgICAgIHN0cmVhbSA9IE1BWF9TVFJFQU1fSUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKHN0cmVhbSA8PCBTVFJFQU1fSURfU0hJRlQpICYgU1RSRUFNX0lEX01BU0s7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgYm9vbCBjb252ZXJ0VG9TdHJlYW0oYm9vbCBvdXRwdXQsIHVuc2lnbmVkIHN0cmVhbSkgeworICAgICAgICAgICAgbUluZGV4ID0gKG1JbmRleCAmIH5ESVJfTUFTSykgfCBJU19TVFJFQU1fRkxBRzsKKyAgICAgICAgICAgICh2b2lkKXNldFBvcnQob3V0cHV0KTsKKyAgICAgICAgICAgIHJldHVybiBzZXRTdHJlYW0oc3RyZWFtKTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSB2b2lkIGNvbnZlcnRUb1BvcnQoYm9vbCBvdXRwdXQpIHsKKyAgICAgICAgICAgIG1JbmRleCA9IChtSW5kZXggJiB+KERJUl9NQVNLIHwgSVNfU1RSRUFNX0ZMQUcpKTsKKyAgICAgICAgICAgICh2b2lkKXNldFBvcnQob3V0cHV0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSB2b2lkIGNvbnZlcnRUb0dsb2JhbCgpIHsKKyAgICAgICAgICAgIG1JbmRleCA9IChtSW5kZXggJiB+KERJUl9NQVNLIHwgSVNfU1RSRUFNX0ZMQUcpKSB8IERJUl9HTE9CQUw7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgdm9pZCBjb252ZXJ0VG9SZXF1ZXN0KCkgeworICAgICAgICAgICAgbUluZGV4ID0gbUluZGV4IHwgSVNfUkVRVUVTVF9GTEFHOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIHN0cmVhbSBpbmRleC4KKyAgICAgICAgICogXHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIGlmIGNvdWxkIG5vdCBzZXQgaW5kZXggKGUuZy4gbm90IGEgc3RyZWFtIHBhcmFtKS4KKyAgICAgICAgICovCisgICAgICAgIGlubGluZSBib29sIHNldFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIHsKKyAgICAgICAgICAgIGlmIChmb3JTdHJlYW0oKSkgeworICAgICAgICAgICAgICAgIG1JbmRleCA9IChtSW5kZXggJiB+U1RSRUFNX0lEX01BU0spIHwgTWFrZVN0cmVhbUlkKHN0cmVhbSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMtPnN0cmVhbSgpIDwgTUFYX1NUUkVBTV9JRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH07CisKK3B1YmxpYzoKKyAgICAvLyBwdWJsaWMgZ2V0dGVycyBmb3IgSW5kZXggbWV0aG9kcworCisgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIHZlbmRvciBleHRlbnNpb24gcGFyYW1ldGVyCisgICAgaW5saW5lIGJvb2wgaXNWZW5kb3IoKSBjb25zdCB7IHJldHVybiBfbUluZGV4LmlzVmVuZG9yKCk7IH0KKyAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGEgZmxleGlibGUgcGFyYW1ldGVyCisgICAgaW5saW5lIGJvb2wgaXNGbGV4aWJsZSgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguaXNGbGV4aWJsZSgpOyB9CisgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIGdsb2JhbCBwYXJhbWV0ZXIgKG5vdCBmb3IgaW5wdXQgbm9yIG91dHB1dCkKKyAgICBpbmxpbmUgYm9vbCBpc0dsb2JhbCgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguaXNHbG9iYWwoKTsgfQorICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYW4gaW5wdXQgb3IgaW5wdXQgc3RyZWFtIHBhcmFtZXRlcgorICAgIGlubGluZSBib29sIGZvcklucHV0KCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5mb3JJbnB1dCgpOyB9CisgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhbiBvdXRwdXQgb3Igb3V0cHV0IHN0cmVhbSBwYXJhbWV0ZXIKKyAgICBpbmxpbmUgYm9vbCBmb3JPdXRwdXQoKSBjb25zdCB7IHJldHVybiBfbUluZGV4LmZvck91dHB1dCgpOyB9CisKKyAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGEgc3RyZWFtIHBhcmFtZXRlcgorICAgIGlubGluZSBib29sIGZvclN0cmVhbSgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguZm9yU3RyZWFtKCk7IH0KKyAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGEgcG9ydCAoaW5wdXQgb3Igb3V0cHV0KSBwYXJhbWV0ZXIKKyAgICBpbmxpbmUgYm9vbCBmb3JQb3J0KCkgY29uc3QgICB7IHJldHVybiBfbUluZGV4LmZvclBvcnQoKTsgfQorCisgICAgLy8vIHJldHVybnMgdGhlIHN0cmVhbSBJRCBvciB+MCBpZiBub3QgYSBzdHJlYW0KKyAgICBpbmxpbmUgdW5zaWduZWQgc3RyZWFtKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5zdHJlYW0oKTsgfQorCisgICAgLy8vIHJldHVybnMgdGhlIHBhcmFtZXRlciB0eXBlOiB0aGUgcGFyYW1ldGVyIGluZGV4IHdpdGhvdXQgdGhlIHN0cmVhbSBJRAorICAgIGlubGluZSBUeXBlIHR5cGUoKSBjb25zdCB7IHJldHVybiBfbUluZGV4LnR5cGUoKTsgfQorCisgICAgLy8vIHJldHVybnMgdGhlIGluZGV4IG9mIHRoaXMgcGFyYW1ldGVyCisgICAgLy8vIFx0b2RvOiBzaG91bGQgd2UgcmVzdHJpY3QgdGhpcyB0byBDMlBhcmFtRmllbGQ/CisgICAgaW5saW5lIHVpbnQzMl90IGluZGV4KCkgY29uc3QgeyByZXR1cm4gKHVpbnQzMl90KV9tSW5kZXg7IH0KKworICAgIC8vLyByZXR1cm5zIHRoZSBjb3JlIGluZGV4IG9mIHRoaXMgcGFyYW1ldGVyCisgICAgaW5saW5lIENvcmVJbmRleCBjb3JlSW5kZXgoKSBjb25zdCB7IHJldHVybiBfbUluZGV4LmNvcmVJbmRleCgpOyB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUga2luZCBvZiB0aGlzIHBhcmFtZXRlcgorICAgIGlubGluZSBraW5kX3Qga2luZCgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXgua2luZCgpOyB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgcGFyYW1ldGVyIG9yIDAgaWYgdGhlIHBhcmFtZXRlciBpcyBpbnZhbGlkCisgICAgaW5saW5lIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gX21TaXplOyB9CisKKyAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGUgcGFyYW1ldGVyIGlzIHZhbGlkCisgICAgaW5saW5lIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBfbUluZGV4LmlzVmFsaWQoKSAmJiBfbVNpemUgPiAwOyB9CisKKyAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGUgcGFyYW1ldGVyIGlzIGludmFsaWQKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciEoKSBjb25zdCB7IHJldHVybiAhb3BlcmF0b3IgYm9vbCgpOyB9CisKKyAgICAvLyBlcXVhbGl0eSBpcyBkb25lIGJ5IG1lbWNtcCAodXNlIGVxdWFscygpIHRvIHByZXZlbnQgYW55IG92ZXJyZWFkKQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQzJQYXJhbSAmbykgY29uc3QgeworICAgICAgICByZXR1cm4gZXF1YWxzKG8pICYmIG1lbWNtcCh0aGlzLCAmbywgX21TaXplKSA9PSAwOworICAgIH0KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEMyUGFyYW0gJm8pIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvcj09KG8pOyB9CisKKyAgICAvLy8gc2FmZShyKSB0eXBlIGNhc3QgZnJvbSBwb2ludGVyIGFuZCBzaXplCisgICAgaW5saW5lIHN0YXRpYyBDMlBhcmFtKiBGcm9tKHZvaWQgKmFkZHIsIHNpemVfdCBsZW4pIHsKKyAgICAgICAgLy8gX21TaXplIG11c3QgZml0IGludG8gc2l6ZSwgYnV0IHJlYWxseSBDMlBhcmFtIG11c3QgYWxzbyB0byBiZSBhIHZhbGlkIHBhcmFtCisgICAgICAgIGlmIChsZW4gPCBzaXplb2YoQzJQYXJhbSkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIC8vIF9tU2l6ZSBtdXN0IG1hdGNoIGxlbmd0aAorICAgICAgICBDMlBhcmFtICpwYXJhbSA9IChDMlBhcmFtKilhZGRyOworICAgICAgICBpZiAocGFyYW0tPl9tU2l6ZSAhPSBsZW4pIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYXJhbTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyBtYW5hZ2VkIGNsb25lIG9mIHxvcmlnfCBhdCBoZWFwLgorICAgIGlubGluZSBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IENvcHkoY29uc3QgQzJQYXJhbSAmb3JpZykgeworICAgICAgICBpZiAob3JpZy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCAqbWVtID0gOjpvcGVyYXRvciBuZXcgKG9yaWcuc2l6ZSgpKTsKKyAgICAgICAgQzJQYXJhbSAqcGFyYW0gPSBuZXcgKG1lbSkgQzJQYXJhbShvcmlnLnNpemUoKSwgb3JpZy5fbUluZGV4KTsKKyAgICAgICAgcGFyYW0tPnVwZGF0ZUZyb20ob3JpZyk7CisgICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4ocGFyYW0pOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIG1hbmFnZWQgY2xvbmUgb2YgfG9yaWd8IGFzIGEgc3RyZWFtIHBhcmFtZXRlciBhdCBoZWFwLgorICAgIGlubGluZSBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IENvcHlBc1N0cmVhbSgKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gJm9yaWcsIGJvb2wgb3V0cHV0LCB1bnNpZ25lZCBzdHJlYW0pIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IGNvcHkgPSBDb3B5KG9yaWcpOworICAgICAgICBpZiAoY29weSkgeworICAgICAgICAgICAgY29weS0+X21JbmRleC5jb252ZXJ0VG9TdHJlYW0ob3V0cHV0LCBzdHJlYW0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb3B5OworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIG1hbmFnZWQgY2xvbmUgb2YgfG9yaWd8IGFzIGEgcG9ydCBwYXJhbWV0ZXIgYXQgaGVhcC4KKyAgICBpbmxpbmUgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBDb3B5QXNQb3J0KGNvbnN0IEMyUGFyYW0gJm9yaWcsIGJvb2wgb3V0cHV0KSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBjb3B5ID0gQ29weShvcmlnKTsKKyAgICAgICAgaWYgKGNvcHkpIHsKKyAgICAgICAgICAgIGNvcHktPl9tSW5kZXguY29udmVydFRvUG9ydChvdXRwdXQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb3B5OworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIG1hbmFnZWQgY2xvbmUgb2YgfG9yaWd8IGFzIGEgZ2xvYmFsIHBhcmFtZXRlciBhdCBoZWFwLgorICAgIGlubGluZSBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IENvcHlBc0dsb2JhbChjb25zdCBDMlBhcmFtICZvcmlnKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBjb3B5ID0gQ29weShvcmlnKTsKKyAgICAgICAgaWYgKGNvcHkpIHsKKyAgICAgICAgICAgIGNvcHktPl9tSW5kZXguY29udmVydFRvR2xvYmFsKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvcHk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgbWFuYWdlZCBjbG9uZSBvZiB8b3JpZ3wgYXMgYSBzdHJlYW0gcGFyYW1ldGVyIGF0IGhlYXAuCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gQ29weUFzUmVxdWVzdChjb25zdCBDMlBhcmFtICZvcmlnKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBjb3B5ID0gQ29weShvcmlnKTsKKyAgICAgICAgaWYgKGNvcHkpIHsKKyAgICAgICAgICAgIGNvcHktPl9tSW5kZXguY29udmVydFRvUmVxdWVzdCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb3B5OworICAgIH0KKworI2lmIDAKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBQLCBjbGFzcz1kZWNsdHlwZShDMlBhcmFtKFAoKSkpPgorICAgIFAgKkFzKCkgeyByZXR1cm4gUDo6RnJvbSh0aGlzKTsgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFA+CisgICAgY29uc3QgUCAqQXMoKSBjb25zdCB7IHJldHVybiBjb25zdF9jYXN0PGNvbnN0IFAqPihQOjpGcm9tKGNvbnN0X2Nhc3Q8QzJQYXJhbSo+KHRoaXMpKSk7IH0KKyNlbmRpZgorCitwcm90ZWN0ZWQ6CisgICAgLy8vIHNldHMgdGhlIHN0cmVhbSBmaWVsZC4gUmV0dXJucyB0cnVlIGlmZiBzdWNjZXNzZnVsLgorICAgIGlubGluZSBib29sIHNldFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIHsKKyAgICAgICAgcmV0dXJuIF9tSW5kZXguc2V0U3RyZWFtKHN0cmVhbSk7CisgICAgfQorCisgICAgLy8vIHNldHMgdGhlIHBvcnQgKGRpcmVjdGlvbikuIFJldHVybnMgdHJ1ZSBpZmYgc3VjY2Vzc2Z1bC4KKyAgICBpbmxpbmUgYm9vbCBzZXRQb3J0KGJvb2wgb3V0cHV0KSB7CisgICAgICAgIHJldHVybiBfbUluZGV4LnNldFBvcnQob3V0cHV0KTsKKyAgICB9CisKK3B1YmxpYzoKKyAgICAvLy8gaW52YWxpZGF0ZSB0aGlzIHBhcmFtZXRlci4gVGhlcmUgaXMgbm8gcmVjb3ZlcnkgZnJvbSB0aGlzIGNhbGw7IGUuZy4gcGFyYW1ldGVyCisgICAgLy8vIGNhbm5vdCBiZSAnY29ycmVjdGVkJyB0byBiZSB2YWxpZC4KKyAgICBpbmxpbmUgdm9pZCBpbnZhbGlkYXRlKCkgeyBfbVNpemUgPSAwOyB9CisKKyAgICAvLyBpZiBvdGhlciBpcyB0aGUgc2FtZSBraW5kIG9mICh2YWxpZCkgcGFyYW0gYXMgdGhpcywgY29weSBpdCBpbnRvIHRoaXMgYW5kIHJldHVybiB0cnVlLgorICAgIC8vIG90aGVyd2lzZSwgZG8gbm90IGNvcHkgYW55dGhpbmcsIGFuZCByZXR1cm4gZmFsc2UuCisgICAgaW5saW5lIGJvb2wgdXBkYXRlRnJvbShjb25zdCBDMlBhcmFtICZvdGhlcikgeworICAgICAgICBpZiAob3RoZXIuX21TaXplIDw9IF9tU2l6ZSAmJiBvdGhlci5fbUluZGV4ID09IF9tSW5kZXggJiYgX21TaXplID4gMCkgeworICAgICAgICAgICAgbWVtY3B5KHRoaXMsICZvdGhlciwgb3RoZXIuX21TaXplKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICAvLyByZXR1cm5zIHxvfCBpZiBpdCBpcyBhIG51bGwgcHRyLCBvciBpZiBjYW4gc3VpdGFibHkgYmUgYSBwYXJhbSBvZiBnaXZlbiB8dHlwZXwgKGUuZy4gaGFzCisgICAgLy8gc2FtZSB0eXBlIChpZ25vcmluZyBzdHJlYW0gSUQpLCBhbmQgc2l6ZSkuIE90aGVyd2lzZSwgcmV0dXJucyBudWxsLiBJZiB8Y2hlY2tEaXJ8IGlzIGZhbHNlLAorICAgIC8vIGFsbG93IHVuZGVmaW5lZCBvciBkaWZmZXJlbnQgZGlyZWN0aW9uIChlLmcuIGFzIGNvbnN0cnVjdGVkIGZyb20gQzJQb3J0UGFyYW0oKSB2cy4KKyAgICAvLyBDMlBvcnRQYXJhbTo6aW5wdXQpLCBidXQgc3RpbGwgcmVxdWlyZSBlcXVpdmFsZW50IHR5cGUgKHN0cmVhbSwgcG9ydCBvciBnbG9iYWwpOyBvdGhlcndpc2UsCisgICAgLy8gcmV0dXJuIG51bGwuCisgICAgaW5saW5lIHN0YXRpYyBjb25zdCBDMlBhcmFtKiBJZlN1aXRhYmxlKAorICAgICAgICAgICAgY29uc3QgQzJQYXJhbSogbywgc2l6ZV90IHNpemUsIFR5cGUgdHlwZSwgc2l6ZV90IGZsZXhTaXplID0gMCwgYm9vbCBjaGVja0RpciA9IHRydWUpIHsKKyAgICAgICAgaWYgKG8gPT0gbnVsbHB0ciB8fCBvLT5fbVNpemUgPCBzaXplIHx8IChmbGV4U2l6ZSAmJiAoKG8tPl9tU2l6ZSAtIHNpemUpICUgZmxleFNpemUpKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0gZWxzZSBpZiAoY2hlY2tEaXIpIHsKKyAgICAgICAgICAgIHJldHVybiBvLT5fbUluZGV4LnR5cGUoKSA9PSB0eXBlLm1JbmRleCA/IG8gOiBudWxscHRyOworICAgICAgICB9IGVsc2UgaWYgKG8tPl9tSW5kZXguaXNHbG9iYWwoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gKChvLT5fbUluZGV4LnR5cGUoKSBeIHR5cGUubUluZGV4KSAmIH5UeXBlOjpESVJfTUFTSykgPyBudWxscHRyIDogbzsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBiYXNlIGNvbnN0cnVjdG9yCisgICAgaW5saW5lIEMyUGFyYW0odWludDMyX3QgcGFyYW1TaXplLCBJbmRleCBwYXJhbUluZGV4KQorICAgICAgICA6IF9tU2l6ZShwYXJhbVNpemUpLAorICAgICAgICAgIF9tSW5kZXgocGFyYW1JbmRleCkgeworICAgICAgICBpZiAocGFyYW1TaXplID4gc2l6ZW9mKEMyUGFyYW0pKSB7CisgICAgICAgICAgICBtZW1zZXQodGhpcyArIDEsIDAsIHBhcmFtU2l6ZSAtIHNpemVvZihDMlBhcmFtKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gYmFzZSBjb25zdHJ1Y3RvciB3aXRoIHN0cmVhbSBzZXQKKyAgICBpbmxpbmUgQzJQYXJhbSh1aW50MzJfdCBwYXJhbVNpemUsIEluZGV4IHBhcmFtSW5kZXgsIHVuc2lnbmVkIHN0cmVhbSkKKyAgICAgICAgOiBfbVNpemUocGFyYW1TaXplKSwKKyAgICAgICAgICBfbUluZGV4KHBhcmFtSW5kZXggfCBJbmRleDo6TWFrZVN0cmVhbUlkKHN0cmVhbSkpIHsKKyAgICAgICAgaWYgKHBhcmFtU2l6ZSA+IHNpemVvZihDMlBhcmFtKSkgeworICAgICAgICAgICAgbWVtc2V0KHRoaXMgKyAxLCAwLCBwYXJhbVNpemUgLSBzaXplb2YoQzJQYXJhbSkpOworICAgICAgICB9CisgICAgICAgIGlmICghZm9yU3RyZWFtKCkpIHsKKyAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IF9DMlBhcmFtSW5zcGVjdG9yOyAvLyBmb3IgdGVzdGluZworCisgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgfG98IGhhcyB0aGUgc2FtZSBzaXplIGFuZCBpbmRleCBhcyB0aGlzLiBUaGlzIHBlcmZvcm1zIHRoZQorICAgIC8vLyBiYXNpYyBjaGVjayBmb3IgZXF1YWxpdHkuCisgICAgaW5saW5lIGJvb2wgZXF1YWxzKGNvbnN0IEMyUGFyYW0gJm8pIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tU2l6ZSA9PSBvLl9tU2l6ZSAmJiBfbUluZGV4ID09IG8uX21JbmRleDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBfbVNpemU7CisgICAgSW5kZXggX21JbmRleDsKK307CisKKy8vLyBcaW5ncm91cCBpbnRlcm5hbAorLy8vIGFsbG93IEMyUGFyYW1zIGFjY2VzcyB0byBwcml2YXRlIG1ldGhvZHMsIGUuZy4gY29uc3RydWN0b3JzCisjZGVmaW5lIEMyUEFSQU1fTUFLRV9GUklFTkRTIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBTLCBpbnQgSSwgY2xhc3MgRj4gZnJpZW5kIHN0cnVjdCBDMkdsb2JhbFBhcmFtOyBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgUywgaW50IEksIGNsYXNzIEY+IGZyaWVuZCBzdHJ1Y3QgQzJQb3J0UGFyYW07IFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBTLCBpbnQgSSwgY2xhc3MgRj4gZnJpZW5kIHN0cnVjdCBDMlN0cmVhbVBhcmFtOyBcCisKKy8qKgorICogU2V0dGluZyBiYXNlIHN0cnVjdHVyZSBmb3IgY29tcG9uZW50IG1ldGhvZCBzaWduYXR1cmVzLiBXcmFwIGNvbnN0cnVjdG9ycy4KKyAqLworc3RydWN0IEMyU2V0dGluZyA6IHB1YmxpYyBDMlBhcmFtIHsKK3Byb3RlY3RlZDoKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgIGlubGluZSBDMlNldHRpbmcoY29uc3QgQXJncygmLi4uIGFyZ3MpKSA6IEMyUGFyYW0oYXJncy4uLikgeyB9CitwdWJsaWM6IC8vIFRPRE8KKyAgICBlbnVtIDogdWludDMyX3QgeyBQQVJBTV9LSU5EID0gVHlwZTo6S0lORF9TRVRUSU5HIH07Cit9OworCisvKioKKyAqIFR1bmluZyBiYXNlIHN0cnVjdHVyZSBmb3IgY29tcG9uZW50IG1ldGhvZCBzaWduYXR1cmVzLiBXcmFwIGNvbnN0cnVjdG9ycy4KKyAqLworc3RydWN0IEMyVHVuaW5nIDogcHVibGljIEMyU2V0dGluZyB7Citwcm90ZWN0ZWQ6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICBpbmxpbmUgQzJUdW5pbmcoY29uc3QgQXJncygmLi4uIGFyZ3MpKSA6IEMyU2V0dGluZyhhcmdzLi4uKSB7IH0KK3B1YmxpYzogLy8gVE9ETworICAgIGVudW0gOiB1aW50MzJfdCB7IFBBUkFNX0tJTkQgPSBUeXBlOjpLSU5EX1RVTklORyB9OworfTsKKworLyoqCisgKiBJbmZvIGJhc2Ugc3RydWN0dXJlIGZvciBjb21wb25lbnQgbWV0aG9kIHNpZ25hdHVyZXMuIFdyYXAgY29uc3RydWN0b3JzLgorICovCitzdHJ1Y3QgQzJJbmZvIDogcHVibGljIEMyUGFyYW0geworcHJvdGVjdGVkOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgaW5saW5lIEMySW5mbyhjb25zdCBBcmdzKCYuLi4gYXJncykpIDogQzJQYXJhbShhcmdzLi4uKSB7IH0KK3B1YmxpYzogLy8gVE9ETworICAgIGVudW0gOiB1aW50MzJfdCB7IFBBUkFNX0tJTkQgPSBUeXBlOjpLSU5EX0lORk8gfTsKK307CisKKy8qKgorICogU3RydWN0dXJlIHVuaXF1ZWx5IHNwZWNpZnlpbmcgYSBmaWVsZCBpbiBhbiBhcmJpdHJhcnkgc3RydWN0dXJlLgorICoKKyAqIFxub3RlIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZGlmZmVyZW50bHkgaW4gQzJGaWVsZERlc2NyaXB0b3IgdG8KKyAqIGlkZW50aWZ5IGFycmF5IGZpZWxkcywgc3VjaCB0aGF0IF9tU2l6ZSBpcyB0aGUgc2l6ZSBvZiBlYWNoIGVsZW1lbnQuIFRoaXMgaXMKKyAqIGJlY2F1c2UgdGhlIGZpZWxkIGRlc2NyaXB0b3IgY29udGFpbnMgdGhlIGFycmF5LWxlbmd0aCwgYW5kIHdlIHdhbnQgdG8ga2VlcAorICogYSByZWxldmFudCBlbGVtZW50IHNpemUgZm9yIHZhcmlhYmxlIGxlbmd0aCBhcnJheXMuCisgKi8KK3N0cnVjdCBfQzJGaWVsZElkIHsKKy8vcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHVzZWQgZm9yIEMyRmllbGREZXNjcmlwdG9yIHRoYXQgcmVtb3ZlcyB0aGUgYXJyYXkgZXh0ZW50LgorICAgICAqCisgICAgICogXHBhcmFtW2luXSBvZmZzZXQgcG9pbnRlciB0byB0aGUgZmllbGQgaW4gYW4gb2JqZWN0IGF0IGFkZHJlc3MgMC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCBjbGFzcyBCPXR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDxUPjo6dHlwZT4KKyAgICBpbmxpbmUgX0MyRmllbGRJZChUKiBvZmZzZXQpCisgICAgICAgIDogLy8gb2Zmc2V0IGlzIGZyb20gIjAiIHNvIHdpbGwgZml0IG9uIDMyLWJpdHMKKyAgICAgICAgICBfbU9mZnNldCgodWludDMyX3QpKHVpbnRwdHJfdCkob2Zmc2V0KSksCisgICAgICAgICAgX21TaXplKHNpemVvZihCKSkgeyB9CisKKyAgICAvKioKKyAgICAgKiBEaXJlY3QgY29uc3RydWN0b3IgZnJvbSBvZmZzZXQgYW5kIHNpemUuCisgICAgICoKKyAgICAgKiBccGFyYW1baW5dIG9mZnNldCBvZmZzZXQgb2YgdGhlIGZpZWxkLgorICAgICAqIFxwYXJhbVtpbl0gc2l6ZSBzaXplIG9mIHRoZSBmaWVsZC4KKyAgICAgKi8KKyAgICBpbmxpbmUgX0MyRmllbGRJZChzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBfbU9mZnNldChvZmZzZXQpLCBfbVNpemUoc2l6ZSkge30KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHVzZWQgdG8gaWRlbnRpZnkgYSBmaWVsZCBpbiBhbiBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gVVt0eXBlXSBwb2ludGVyIHRvIHRoZSBvYmplY3QgdGhhdCBjb250YWlucyB0aGlzIGZpZWxkLiBUaGlzIGlzIG5lZWRlZCBpbiBjYXNlIHRoZQorICAgICAqICAgICAgICBmaWVsZCBpcyBpbiBhbiAoaW5oZXJpdGVkKSBiYXNlIGNsYXNzLCBpbiB3aGljaCBjYXNlIFQgd2lsbCBiZSB0aGF0IGJhc2UgY2xhc3MuCisgICAgICogXHBhcmFtIHBtW2ltXSBtZW1iZXIgcG9pbnRlciB0byB0aGUgZmllbGQKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZSBCPXR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDxSPjo6dHlwZT4KKyAgICBpbmxpbmUgX0MyRmllbGRJZChVICosIFIgVDo6KiBwbSkKKyAgICAgICAgOiBfbU9mZnNldCgodWludDMyX3QpKHVpbnRwdHJfdCkoJigoKFUqKTI1NiktPipwbSkpIC0gMjU2dSksCisgICAgICAgICAgX21TaXplKHNpemVvZihCKSkgeyB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RvciB1c2VkIHRvIGlkZW50aWZ5IGEgZmllbGQgaW4gYW4gb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIHBtW2ltXSBtZW1iZXIgcG9pbnRlciB0byB0aGUgZmllbGQKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBCPXR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDxSPjo6dHlwZT4KKyAgICBpbmxpbmUgX0MyRmllbGRJZChSIFQ6OiogcG0pCisgICAgICAgIDogX21PZmZzZXQoKHVpbnQzMl90KSh1aW50cHRyX3QpKCYoKChUKikwKS0+KnBtKSkpLAorICAgICAgICAgIF9tU2l6ZShzaXplb2YoQikpIHsgfQorCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBfQzJGaWVsZElkICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gX21PZmZzZXQgPT0gb3RoZXIuX21PZmZzZXQgJiYgX21TaXplID09IG90aGVyLl9tU2l6ZTsKKyAgICB9CisKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgX0MyRmllbGRJZCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tT2Zmc2V0IDwgb3RoZXIuX21PZmZzZXQgfHwKKyAgICAgICAgICAgIC8vIE5PVEU6IG9yZGVyIHBhcmVudCBzdHJ1Y3R1cmUgYmVmb3JlIHN1YiBmaWVsZAorICAgICAgICAgICAgKF9tT2Zmc2V0ID09IG90aGVyLl9tT2Zmc2V0ICYmIF9tU2l6ZSA+IG90aGVyLl9tU2l6ZSk7CisgICAgfQorCisgICAgREVGSU5FX09USEVSX0NPTVBBUklTT05fT1BFUkFUT1JTKF9DMkZpZWxkSWQpCisKKyNpZiAwCisgICAgaW5saW5lIHVpbnQzMl90IG9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIF9tT2Zmc2V0OyB9CisgICAgaW5saW5lIHVpbnQzMl90IHNpemUoKSBjb25zdCB7IHJldHVybiBfbVNpemU7IH0KKyNlbmRpZgorCisjaWYgZGVmaW5lZChGUklFTkRfVEVTVCkKKyAgICBmcmllbmQgdm9pZCBQcmludFRvKGNvbnN0IF9DMkZpZWxkSWQgJmQsIDo6c3RkOjpvc3RyZWFtKik7CisjZW5kaWYKKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IF9DMlBhcmFtSW5zcGVjdG9yOworICAgIGZyaWVuZCBzdHJ1Y3QgQzJGaWVsZERlc2NyaXB0b3I7CisKKyAgICB1aW50MzJfdCBfbU9mZnNldDsgLy8gb2Zmc2V0IG9mIGZpZWxkCisgICAgdWludDMyX3QgX21TaXplOyAgIC8vIHNpemUgb2YgZmllbGQKK307CisKKy8qKgorICogU3RydWN0dXJlIHVuaXF1ZWx5IHNwZWNpZnlpbmcgYSAnZmllbGQnIGluIGEgY29uZmlndXJhdGlvbi4gVGhlIGZpZWxkCisgKiBjYW4gYmUgYSBmaWVsZCBvZiBhIGNvbmZpZ3VyYXRpb24sIGEgc3ViZmllbGQgb2YgYSBmaWVsZCBvZiBhIGNvbmZpZ3VyYXRpb24sCisgKiBhbmQgZXZlbiB0aGUgd2hvbGUgY29uZmlndXJhdGlvbi4gTW9yZW92ZXIsIGlmIHRoZSBmaWVsZCBjYW4gcG9pbnQgdG8gYW4KKyAqIGVsZW1lbnQgaW4gYSBhcnJheSBmaWVsZCwgb3IgdG8gdGhlIGVudGlyZSBhcnJheSBmaWVsZC4KKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIGZvciBxdWVyeWluZyBzdXBwb3J0ZWQgdmFsdWVzIGZvciBhIGZpZWxkLCBhcyB3ZWxsCisgKiBhcyBjb21tdW5pY2F0aW5nIGNvbmZpZ3VyYXRpb24gZmFpbHVyZXMgYW5kIGNvbmZsaWN0cyB3aGVuIHRyeWluZyB0byBjaGFuZ2UKKyAqIGEgY29uZmlndXJhdGlvbiBmb3IgYSBjb21wb25lbnQvaW50ZXJmYWNlIG9yIGEgc3RvcmUuCisgKi8KK3N0cnVjdCBDMlBhcmFtRmllbGQgeworLy9wdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZmllbGQgaWRlbnRpZmllciB1c2luZyBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyICh2YXJpYWJsZSksCisgICAgICogYW5kIGEgcG9pbnRlciB0byBtZW1iZXIuCisgICAgICoKKyAgICAgKiB+fn5+fn5+fn5+fn5+ICguY3BwKQorICAgICAqCisgICAgICogc3RydWN0IEMyU29tZVBhcmFtIHsKKyAgICAgKiAgIHVpbnQzMl90IG1GaWVsZDsKKyAgICAgKiAgIHVpbnQzMl90IG1BcnJheVsyXTsKKyAgICAgKiAgIEMyT3RoZXJTdHJ1Y3QgbVN0cnVjdDsKKyAgICAgKiAgIHVpbnQzMl90IG1GbGV4QXJyYXlbXTsKKyAgICAgKiB9ICptUGFyYW07CisgICAgICoKKyAgICAgKiBDMlBhcmFtRmllbGQobVBhcmFtLCAmbVBhcmFtLT5tRmllbGQpOworICAgICAqIEMyUGFyYW1GaWVsZChtUGFyYW0sICZtUGFyYW0tPm1BcnJheSk7CisgICAgICogQzJQYXJhbUZpZWxkKG1QYXJhbSwgJm1QYXJhbS0+bUFycmF5WzBdKTsKKyAgICAgKiBDMlBhcmFtRmllbGQobVBhcmFtLCAmbVBhcmFtLT5tU3RydWN0Lm1TdWJGaWVsZCk7CisgICAgICogQzJQYXJhbUZpZWxkKG1QYXJhbSwgJm1QYXJhbS0+bUZsZXhBcnJheSk7CisgICAgICogQzJQYXJhbUZpZWxkKG1QYXJhbSwgJm1QYXJhbS0+bUZsZXhBcnJheVsyXSk7CisgICAgICoKKyAgICAgKiB+fn5+fn5+fn5+fn5+CisgICAgICoKKyAgICAgKiBcdG9kbyBmaXggd2hhdCB0aGlzIGlzIGZvciBUW10gKGZvciBub3cgc2l6ZSBiZWNvbWVzIFRbMV0pCisgICAgICoKKyAgICAgKiBcbm90ZSB0aGlzIGRvZXMgbm90IHdvcmsgZm9yIDY0LWJpdCBtZW1iZXJzIGFzIGl0IHRyaWdnZXJzIGEKKyAgICAgKiAndGFraW5nIGFkZHJlc3Mgb2YgcGFja2VkIG1lbWJlcicgd2FybmluZy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwYXJhbSBwb2ludGVyIHRvIHBhcmFtZXRlcgorICAgICAqIFxwYXJhbSBvZmZzZXQgbWVtYmVyIHBvaW50ZXIKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTLCB0eXBlbmFtZSBUPgorICAgIGlubGluZSBDMlBhcmFtRmllbGQoUyogcGFyYW0sIFQqIG9mZnNldCkKKyAgICAgICAgOiBfbUluZGV4KHBhcmFtLT5pbmRleCgpKSwKKyAgICAgICAgICBfbUZpZWxkSWQoKFQqKSgodWludHB0cl90KW9mZnNldCAtICh1aW50cHRyX3QpcGFyYW0pKSB7fQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUywgdHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgc3RhdGljIEMyUGFyYW1GaWVsZCBNYWtlKFMmIHBhcmFtLCBUJiBvZmZzZXQpIHsKKyAgICAgICAgcmV0dXJuIEMyUGFyYW1GaWVsZChwYXJhbS5pbmRleCgpLCAodWludHB0cl90KSZvZmZzZXQgLSAodWludHB0cl90KSZwYXJhbSwgc2l6ZW9mKFQpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBmaWVsZCBpZGVudGlmaWVyIHVzaW5nIGEgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgKHZhcmlhYmxlKSwKKyAgICAgKiBhbmQgYSBtZW1iZXIgcG9pbnRlci4gVGhpcyBtZXRob2QgY2Fubm90IGJlIHVzZWQgdG8gcmVmZXIgdG8gYW4KKyAgICAgKiBhcnJheSBlbGVtZW50IG9yIGEgc3ViZmllbGQuCisgICAgICoKKyAgICAgKiB+fn5+fn5+fn5+fn5+ICguY3BwKQorICAgICAqCisgICAgICogQzJTb21lUGFyYW0gbVBhcmFtOworICAgICAqIEMyUGFyYW1GaWVsZCgmbVBhcmFtLCAmQzJTb21lUGFyYW06Om1NZW1iZXJGaWVsZCk7CisgICAgICoKKyAgICAgKiB+fn5+fn5+fn5+fn5+CisgICAgICoKKyAgICAgKiBccGFyYW0gcCBwb2ludGVyIHRvIHBhcmFtZXRlcgorICAgICAqIFxwYXJhbSBUIG1lbWJlciBwb2ludGVyIHRvIHRoZSBmaWVsZCBtZW1iZXIKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorICAgIGlubGluZSBDMlBhcmFtRmllbGQoVSAqcCwgUiBUOjoqIHBtKSA6IF9tSW5kZXgocC0+aW5kZXgoKSksIF9tRmllbGRJZChwLCBwbSkgeyB9CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBmaWVsZCBpZGVudGlmaWVyIHRvIGEgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgKHZhcmlhYmxlKS4KKyAgICAgKgorICAgICAqIH5+fn5+fn5+fn5+fn4gKC5jcHApCisgICAgICoKKyAgICAgKiBDMlNvbWVQYXJhbSBtUGFyYW07CisgICAgICogQzJQYXJhbUZpZWxkKCZtUGFyYW0pOworICAgICAqCisgICAgICogfn5+fn5+fn5+fn5+fgorICAgICAqCisgICAgICogXHBhcmFtIHBhcmFtIHBvaW50ZXIgdG8gcGFyYW1ldGVyCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUz4KKyAgICBpbmxpbmUgQzJQYXJhbUZpZWxkKFMqIHBhcmFtKQorICAgICAgICA6IF9tSW5kZXgocGFyYW0tPmluZGV4KCkpLCBfbUZpZWxkSWQoMHUsIHBhcmFtLT5zaXplKCkpIHsgfQorCisgICAgLyoqIENvcHkgY29uc3RydWN0b3IuICovCisgICAgaW5saW5lIEMyUGFyYW1GaWVsZChjb25zdCBDMlBhcmFtRmllbGQgJm90aGVyKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBFcXVhbGl0eSBvcGVyYXRvci4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEMyUGFyYW1GaWVsZCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tSW5kZXggPT0gb3RoZXIuX21JbmRleCAmJiBfbUZpZWxkSWQgPT0gb3RoZXIuX21GaWVsZElkOworICAgIH0KKworICAgIC8qKgorICAgICAqIE9yZGVyaW5nIG9wZXJhdG9yLgorICAgICAqLworICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBDMlBhcmFtRmllbGQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbUluZGV4IDwgb3RoZXIuX21JbmRleCB8fAorICAgICAgICAgICAgKF9tSW5kZXggPT0gb3RoZXIuX21JbmRleCAmJiBfbUZpZWxkSWQgPCBvdGhlci5fbUZpZWxkSWQpOworICAgIH0KKworICAgIERFRklORV9PVEhFUl9DT01QQVJJU09OX09QRVJBVE9SUyhDMlBhcmFtRmllbGQpCisKK3Byb3RlY3RlZDoKKyAgICBpbmxpbmUgQzJQYXJhbUZpZWxkKEMyUGFyYW06OkluZGV4IGluZGV4LCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IHNpemUpCisgICAgICAgIDogX21JbmRleChpbmRleCksIF9tRmllbGRJZChvZmZzZXQsIHNpemUpIHt9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsKKworICAgIEMyUGFyYW06OkluZGV4IF9tSW5kZXg7IC8vLzwgcGFyYW1ldGVyIGluZGV4CisgICAgX0MyRmllbGRJZCBfbUZpZWxkSWQ7ICAgLy8vPCBmaWVsZCBpZGVudGlmaWVyCit9OworCisvKioKKyAqIEEgc2hhcmVkICh1bmlvbikgcmVwcmVzZW50YXRpb24gb2YgbnVtZXJpYyB2YWx1ZXMKKyAqLworY2xhc3MgQzJWYWx1ZSB7CitwdWJsaWM6CisgICAgLy8vIEEgdW5pb24gb2Ygc3VwcG9ydGVkIHByaW1pdGl2ZSB0eXBlcy4KKyAgICB1bmlvbiBQcmltaXRpdmUgeworICAgICAgICAvLyBmaXJzdCBtZW1iZXIgaXMgYWx3YXlzIHplcm8gaW5pdGlhbGl6ZWQgc28gaXQgbXVzdCBiZSB0aGUgbGFyZ2VzdAorICAgICAgICB1aW50NjRfdCAgICB1NjQ7ICAgLy8vPCB1aW50NjRfdCB2YWx1ZQorICAgICAgICBpbnQ2NF90ICAgICBpNjQ7ICAgLy8vPCBpbnQ2NF90IHZhbHVlCisgICAgICAgIGMyX2NudHI2NF90IGM2NDsgICAvLy88IGMyX2NudHI2NF90IHZhbHVlCisgICAgICAgIHVpbnQzMl90ICAgIHUzMjsgICAvLy88IHVpbnQzMl90IHZhbHVlCisgICAgICAgIGludDMyX3QgICAgIGkzMjsgICAvLy88IGludDMyX3QgdmFsdWUKKyAgICAgICAgYzJfY250cjMyX3QgYzMyOyAgIC8vLzwgYzJfY250cjMyX3QgdmFsdWUKKyAgICAgICAgZmxvYXQgICAgICAgZnA7ICAgIC8vLzwgZmxvYXQgdmFsdWUKKworICAgICAgICAvLyBjb25zdHJ1Y3RvcnMgLSBpbXBsaWNpdAorICAgICAgICBQcmltaXRpdmUodWludDY0X3QgdmFsdWUpICAgIDogdTY0KHZhbHVlKSB7IH0KKyAgICAgICAgUHJpbWl0aXZlKGludDY0X3QgdmFsdWUpICAgICA6IGk2NCh2YWx1ZSkgeyB9CisgICAgICAgIFByaW1pdGl2ZShjMl9jbnRyNjRfdCB2YWx1ZSkgOiBjNjQodmFsdWUpIHsgfQorICAgICAgICBQcmltaXRpdmUodWludDMyX3QgdmFsdWUpICAgIDogdTMyKHZhbHVlKSB7IH0KKyAgICAgICAgUHJpbWl0aXZlKGludDMyX3QgdmFsdWUpICAgICA6IGkzMih2YWx1ZSkgeyB9CisgICAgICAgIFByaW1pdGl2ZShjMl9jbnRyMzJfdCB2YWx1ZSkgOiBjMzIodmFsdWUpIHsgfQorICAgICAgICBQcmltaXRpdmUodWludDhfdCB2YWx1ZSkgICAgIDogdTMyKHZhbHVlKSB7IH0KKyAgICAgICAgUHJpbWl0aXZlKGNoYXIgdmFsdWUpICAgICAgICA6IGkzMih2YWx1ZSkgeyB9CisgICAgICAgIFByaW1pdGl2ZShmbG9hdCB2YWx1ZSkgICAgICAgOiBmcCh2YWx1ZSkgIHsgfQorCisgICAgICAgIC8vIGFsbG93IGNvbnN0cnVjdGlvbiBmcm9tIGVudW0gdHlwZQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBFLCB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfZW51bTxFPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBQcmltaXRpdmUoRSB2YWx1ZSkKKyAgICAgICAgICAgIDogUHJpbWl0aXZlKHN0YXRpY19jYXN0PHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPEU+Ojp0eXBlPih2YWx1ZSkpIHsgfQorCisgICAgICAgIFByaW1pdGl2ZSgpIDogdTY0KDApIHsgfQorCisgICAgICAgIC8qKiBnZXRzIHZhbHVlIG91dCBvZiB0aGUgdW5pb24gKi8KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gY29uc3QgVCAmcmVmKCkgY29uc3Q7CisKKyAgICAgICAgLy8gdmVyaWZ5IHRoYXQgd2UgY2FuIGFzc3VtZSBzdGFuZGFyZCBhbGlhc2luZworICAgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZih1NjQpID09IHNpemVvZihpNjQpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKHU2NCkgPT0gc2l6ZW9mKGM2NCksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YodTMyKSA9PSBzaXplb2YoaTMyKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZih1MzIpID09IHNpemVvZihjMzIpLCAiIik7CisgICAgfTsKKyAgICAvLyB2ZXJpZnkgdGhhdCB3ZSBjYW4gYXNzdW1lIHN0YW5kYXJkIGFsaWFzaW5nCisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihQcmltaXRpdmUsIHU2NCkgPT0gb2Zmc2V0b2YoUHJpbWl0aXZlLCBpNjQpLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihQcmltaXRpdmUsIHU2NCkgPT0gb2Zmc2V0b2YoUHJpbWl0aXZlLCBjNjQpLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihQcmltaXRpdmUsIHUzMikgPT0gb2Zmc2V0b2YoUHJpbWl0aXZlLCBpMzIpLCAiIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihQcmltaXRpdmUsIHUzMikgPT0gb2Zmc2V0b2YoUHJpbWl0aXZlLCBjMzIpLCAiIik7CisKKyAgICBlbnVtIHR5cGVfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgTk9fSU5JVCwKKyAgICAgICAgSU5UMzIsCisgICAgICAgIFVJTlQzMiwKKyAgICAgICAgQ05UUjMyLAorICAgICAgICBJTlQ2NCwKKyAgICAgICAgVUlOVDY0LAorICAgICAgICBDTlRSNjQsCisgICAgICAgIEZMT0FULAorICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sID0gc3RkOjppc19lbnVtPFQ+Ojp2YWx1ZT4KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciB0eXBlX3QgVHlwZUZvcigpIHsKKyAgICAgICAgdXNpbmcgVSA9IHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPFQ+Ojp0eXBlOworICAgICAgICByZXR1cm4gVHlwZUZvcjxVPigpOworICAgIH0KKworICAgIC8vIGRlcHJlY3RhdGVkCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgYm9vbCBCID0gc3RkOjppc19lbnVtPFQ+Ojp2YWx1ZT4KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciB0eXBlX3QgdHlwZUZvcigpIHsKKyAgICAgICAgcmV0dXJuIFR5cGVGb3I8VCwgQj4oKTsKKyAgICB9CisKKyAgICAvLyBjb25zdHJ1Y3RvcnMgLSBpbXBsaWNpdAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQzJWYWx1ZShUIHZhbHVlKSAgOiBfbVR5cGUodHlwZUZvcjxUPigpKSwgX21WYWx1ZSh2YWx1ZSkgeyB9CisKKyAgICBDMlZhbHVlKCkgOiBfbVR5cGUoTk9fSU5JVCkgeyB9CisKKyAgICBpbmxpbmUgdHlwZV90IHR5cGUoKSBjb25zdCB7IHJldHVybiBfbVR5cGU7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIGJvb2wgZ2V0KFQgKnZhbHVlKSBjb25zdCB7CisgICAgICAgIGlmIChfbVR5cGUgPT0gdHlwZUZvcjxUPigpKSB7CisgICAgICAgICAgICAqdmFsdWUgPSBfbVZhbHVlLnJlZjxUPigpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vLyByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSB2YWx1ZQorICAgIHZvaWQgKmdldCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tVHlwZSA9PSBOT19JTklUID8gbnVsbHB0ciA6ICh2b2lkKikmX21WYWx1ZTsKKyAgICB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgY29udGFpbmVkIHZhbHVlCisgICAgc2l6ZV90IGlubGluZSBzaXplT2YoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBTaXplRm9yKF9tVHlwZSk7CisgICAgfQorCisgICAgc3RhdGljIHNpemVfdCBTaXplRm9yKHR5cGVfdCB0eXBlKSB7CisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBJTlQzMjoKKyAgICAgICAgICAgIGNhc2UgVUlOVDMyOgorICAgICAgICAgICAgY2FzZSBDTlRSMzI6IHJldHVybiBzaXplb2YoX21WYWx1ZS5pMzIpOworICAgICAgICAgICAgY2FzZSBJTlQ2NDoKKyAgICAgICAgICAgIGNhc2UgVUlOVDY0OgorICAgICAgICAgICAgY2FzZSBDTlRSNjQ6IHJldHVybiBzaXplb2YoX21WYWx1ZS5pNjQpOworICAgICAgICAgICAgY2FzZSBGTE9BVDogcmV0dXJuIHNpemVvZihfbVZhbHVlLmZwKTsKKyAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiAwOworICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIHR5cGVfdCBfbVR5cGU7CisgICAgUHJpbWl0aXZlIF9tVmFsdWU7Cit9OworCit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCBpbnQzMl90ICZDMlZhbHVlOjpQcmltaXRpdmU6OnJlZjxpbnQzMl90PigpIGNvbnN0IHsgcmV0dXJuIGkzMjsgfQordGVtcGxhdGU8PiBpbmxpbmUgY29uc3QgaW50NjRfdCAmQzJWYWx1ZTo6UHJpbWl0aXZlOjpyZWY8aW50NjRfdD4oKSBjb25zdCB7IHJldHVybiBpNjQ7IH0KK3RlbXBsYXRlPD4gaW5saW5lIGNvbnN0IHVpbnQzMl90ICZDMlZhbHVlOjpQcmltaXRpdmU6OnJlZjx1aW50MzJfdD4oKSBjb25zdCB7IHJldHVybiB1MzI7IH0KK3RlbXBsYXRlPD4gaW5saW5lIGNvbnN0IHVpbnQ2NF90ICZDMlZhbHVlOjpQcmltaXRpdmU6OnJlZjx1aW50NjRfdD4oKSBjb25zdCB7IHJldHVybiB1NjQ7IH0KK3RlbXBsYXRlPD4gaW5saW5lIGNvbnN0IGMyX2NudHIzMl90ICZDMlZhbHVlOjpQcmltaXRpdmU6OnJlZjxjMl9jbnRyMzJfdD4oKSBjb25zdCB7IHJldHVybiBjMzI7IH0KK3RlbXBsYXRlPD4gaW5saW5lIGNvbnN0IGMyX2NudHI2NF90ICZDMlZhbHVlOjpQcmltaXRpdmU6OnJlZjxjMl9jbnRyNjRfdD4oKSBjb25zdCB7IHJldHVybiBjNjQ7IH0KK3RlbXBsYXRlPD4gaW5saW5lIGNvbnN0IGZsb2F0ICZDMlZhbHVlOjpQcmltaXRpdmU6OnJlZjxmbG9hdD4oKSBjb25zdCB7IHJldHVybiBmcDsgfQorCisvLyBwcm92aWRlIHR5cGVzIGZvciBlbnVtcyBhbmQgdWludDhfdCwgY2hhciBldmVuIHRob3VnaCB3ZSBkb24ndCBwcm92aWRlIHJlYWRpbmcgYXMgdGhlbQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8Y2hhciwgZmFsc2U+KCkgeyByZXR1cm4gSU5UMzI7IH0KK3RlbXBsYXRlPD4gY29uc3RleHByIEMyVmFsdWU6OnR5cGVfdCBDMlZhbHVlOjpUeXBlRm9yPGludDMyX3QsIGZhbHNlPigpIHsgcmV0dXJuIElOVDMyOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBDMlZhbHVlOjp0eXBlX3QgQzJWYWx1ZTo6VHlwZUZvcjxpbnQ2NF90LCBmYWxzZT4oKSB7IHJldHVybiBJTlQ2NDsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8dWludDhfdCwgZmFsc2U+KCkgeyByZXR1cm4gVUlOVDMyOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBDMlZhbHVlOjp0eXBlX3QgQzJWYWx1ZTo6VHlwZUZvcjx1aW50MzJfdCwgZmFsc2U+KCkgeyByZXR1cm4gVUlOVDMyOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBDMlZhbHVlOjp0eXBlX3QgQzJWYWx1ZTo6VHlwZUZvcjx1aW50NjRfdCwgZmFsc2U+KCkgeyByZXR1cm4gVUlOVDY0OyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBDMlZhbHVlOjp0eXBlX3QgQzJWYWx1ZTo6VHlwZUZvcjxjMl9jbnRyMzJfdCwgZmFsc2U+KCkgeyByZXR1cm4gQ05UUjMyOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBDMlZhbHVlOjp0eXBlX3QgQzJWYWx1ZTo6VHlwZUZvcjxjMl9jbnRyNjRfdCwgZmFsc2U+KCkgeyByZXR1cm4gQ05UUjY0OyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBDMlZhbHVlOjp0eXBlX3QgQzJWYWx1ZTo6VHlwZUZvcjxmbG9hdCwgZmFsc2U+KCkgeyByZXR1cm4gRkxPQVQ7IH0KKworLy8gZm9yd2FyZCBkZWNsYXJlIGVhc3kgZW51bSB0ZW1wbGF0ZQordGVtcGxhdGU8dHlwZW5hbWUgRT4gc3RydWN0IEMyRWFzeUVudW07CisKKy8qKgorICogZmllbGQgZGVzY3JpcHRvci4gQSBmaWVsZCBpcyB1bmlxdWVseSBkZWZpbmVkIGJ5IGFuIGluZGV4IGludG8gYSBwYXJhbWV0ZXIuCisgKiAoTm90ZTogU3RyZWFtLWlkIGlzIG5vdCBjYXB0dXJlZCBhcyBhIGZpZWxkLikKKyAqCisgKiBPcmRlcmluZyBvZiBmaWVsZHMgaXMgYnkgb2Zmc2V0LiBJbiBjYXNlIG9mIHN0cnVjdHVyZXMsIGl0IGlzIGRlcHRoIGZpcnN0LAorICogd2l0aCBhIHN0cnVjdHVyZSB0YWtpbmcgYW4gaW5kZXgganVzdCBiZWZvcmUgYW5kIGluIGFkZGl0aW9uIHRvIGl0cyBtZW1iZXJzLgorICovCitzdHJ1Y3QgQzJGaWVsZERlc2NyaXB0b3IgeworLy9wdWJsaWM6CisgICAgLyoqIGZpZWxkIHR5cGVzIGFuZCBmbGFncworICAgICAqIFxub3RlOiBvbmx5IDMyLWJpdCBhbmQgNjQtYml0IGZpZWxkcyBhcmUgc3VwcG9ydGVkIChlLmcuIG5vIGJvb2xlYW4sIGFzIHRoYXQKKyAgICAgKiBpcyByZXByZXNlbnRlZCB1c2luZyBJTlQzMikuCisgICAgICovCisgICAgZW51bSB0eXBlX3QgOiB1aW50MzJfdCB7CisgICAgICAgIC8vIHByaW1pdGl2ZSB0eXBlcworICAgICAgICBJTlQzMiAgID0gQzJWYWx1ZTo6SU5UMzIsICAvLy88IDMyLWJpdCBzaWduZWQgaW50ZWdlcgorICAgICAgICBVSU5UMzIgID0gQzJWYWx1ZTo6VUlOVDMyLCAvLy88IDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyCisgICAgICAgIENOVFIzMiAgPSBDMlZhbHVlOjpDTlRSMzIsIC8vLzwgMzItYml0IGNvdW50ZXIKKyAgICAgICAgSU5UNjQgICA9IEMyVmFsdWU6OklOVDY0LCAgLy8vPCA2NC1iaXQgc2lnbmVkIGludGVnZXIKKyAgICAgICAgVUlOVDY0ICA9IEMyVmFsdWU6OlVJTlQ2NCwgLy8vPCA2NC1iaXQgc2lnbmVkIGludGVnZXIKKyAgICAgICAgQ05UUjY0ICA9IEMyVmFsdWU6OkNOVFI2NCwgLy8vPCA2NC1iaXQgY291bnRlcgorICAgICAgICBGTE9BVCAgID0gQzJWYWx1ZTo6RkxPQVQsICAvLy88IDMyLWJpdCBmbG9hdGluZyBwb2ludAorCisgICAgICAgIC8vIGFycmF5IHR5cGVzCisgICAgICAgIFNUUklORyA9IDB4MTAwLCAvLy88IGZpeGVkLXNpemUgc3RyaW5nIChQT0QpCisgICAgICAgIEJMT0IsICAgICAgICAgICAvLy88IGJsb2IuIEJsb2JzIGhhdmUgbm8gc3ViLWVsZW1lbnRzIGFuZCBjYW4gYmUgdGhvdWdodCBvZiBhcyBieXRlIGFycmF5czsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgaG93ZXZlciwgYnl0ZXMgY2Fubm90IGJlIGluZGl2aWR1YWxseSBhZGRyZXNzZWQgYnkgY2xpZW50cy4KKworICAgICAgICAvLyBjb21wbGV4IHR5cGVzCisgICAgICAgIFNUUlVDVF9GTEFHID0gMHgyMDAwMCwgLy8vPCBzdHJ1Y3RzLiBNYXJrZWQgd2l0aCB0aGlzIGZsYWcgaW4gYWRkaXRpb24gdG8gdGhlaXIgY29yZUluZGV4LgorICAgIH07CisKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjxDMlN0cmluZywgQzJWYWx1ZTo6UHJpbWl0aXZlPiBOYW1lZFZhbHVlVHlwZTsKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPE5hbWVkVmFsdWVUeXBlPiBOYW1lZFZhbHVlc1R5cGU7CisgICAgLy90eXBlZGVmIHN0ZDo6cGFpcjxzdGQ6OnZlY3RvcjxDMlN0cmluZz4sIHN0ZDo6dmVjdG9yPEMyVmFsdWU6OlByaW1pdGl2ZT4+IE5hbWVkVmFsdWVzVHlwZTsKKworICAgIC8qKgorICAgICAqIFRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIHRoYXQgcmV0dXJucyB0aGUgbmFtZWQgdmFsdWVzIGZvciBhIHR5cGUuCisgICAgICoKKyAgICAgKiBcdG9kbyBoaWRlIGZyb20gY2xpZW50LgorICAgICAqCisgICAgICogXHJldHVybiBhIHZlY3RvciBvZiBuYW1lLXZhbHVlIHBhaXJzLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEI+CisgICAgc3RhdGljIE5hbWVkVmFsdWVzVHlwZSBuYW1lZFZhbHVlc0Zvcihjb25zdCBCICYpOworCisgICAgLyoqIHNwZWNpYWxpemF0aW9uIGZvciBlYXN5IGVudW1zICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRT4KKyAgICBpbmxpbmUgc3RhdGljIE5hbWVkVmFsdWVzVHlwZSBuYW1lZFZhbHVlc0Zvcihjb25zdCBDMkVhc3lFbnVtPEU+ICYpIHsKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBpZ25vcmVkICItV251bGwtZGVyZWZlcmVuY2UiCisgICAgICAgIHJldHVybiBuYW1lZFZhbHVlc0ZvcigqKEUqKW51bGxwdHIpOworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKyAgICB9CisKK3ByaXZhdGU6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQiwgYm9vbCBlbmFibGVkPXN0ZDo6aXNfYXJpdGhtZXRpYzxCPjo6dmFsdWUgfHwgc3RkOjppc19lbnVtPEI+Ojp2YWx1ZT4KKyAgICBzdHJ1Y3QgQzJfSElERSBfTmFtZWRWYWx1ZXNHZXR0ZXI7CisKK3B1YmxpYzoKKyAgICBpbmxpbmUgQzJGaWVsZERlc2NyaXB0b3IodWludDMyX3QgdHlwZSwgdWludDMyX3QgZXh0ZW50LCBDMlN0cmluZyBuYW1lLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBfbVR5cGUoKHR5cGVfdCl0eXBlKSwgX21FeHRlbnQoZXh0ZW50KSwgX21OYW1lKG5hbWUpLCBfbUZpZWxkSWQob2Zmc2V0LCBzaXplKSB7IH0KKworICAgIGlubGluZSBDMkZpZWxkRGVzY3JpcHRvcihjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmKSA9IGRlZmF1bHQ7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCBjbGFzcyBCPXR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDxUPjo6dHlwZT4KKyAgICBpbmxpbmUgQzJGaWVsZERlc2NyaXB0b3IoY29uc3QgVCogb2Zmc2V0LCBjb25zdCBjaGFyICpuYW1lKQorICAgICAgICA6IF9tVHlwZSh0aGlzLT5HZXRUeXBlKChCKiludWxscHRyKSksCisgICAgICAgICAgX21FeHRlbnQoc3RkOjppc19hcnJheTxUPjo6dmFsdWUgPyBzdGQ6OmV4dGVudDxUPjo6dmFsdWUgOiAxKSwKKyAgICAgICAgICBfbU5hbWUobmFtZSksCisgICAgICAgICAgX21OYW1lZFZhbHVlcyhfTmFtZWRWYWx1ZXNHZXR0ZXI8Qj46OmdldE5hbWVkVmFsdWVzKCkpLAorICAgICAgICAgIF9tRmllbGRJZChvZmZzZXQpIHt9CisKKyAgICAvLy8gXGRlcHJlY2F0ZWQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBjbGFzcyBCPXR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDxUPjo6dHlwZT4KKyAgICBpbmxpbmUgQzJGaWVsZERlc2NyaXB0b3IoUyosIFQgUzo6KiBmaWVsZCwgY29uc3QgY2hhciAqbmFtZSkKKyAgICAgICAgOiBfbVR5cGUodGhpcy0+R2V0VHlwZSgoQiopbnVsbHB0cikpLAorICAgICAgICAgIF9tRXh0ZW50KHN0ZDo6aXNfYXJyYXk8VD46OnZhbHVlID8gc3RkOjpleHRlbnQ8VD46OnZhbHVlIDogMSksCisgICAgICAgICAgX21OYW1lKG5hbWUpLAorICAgICAgICAgIF9tRmllbGRJZCgmKCgoUyopMCktPipmaWVsZCkpIHt9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgdHlwZSBvZiB0aGlzIGZpZWxkCisgICAgaW5saW5lIHR5cGVfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gX21UeXBlOyB9CisgICAgLy8vIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgZmllbGQgaW4gY2FzZSBpdCBpcyBhbiBhcnJheS4gUmV0dXJucyAwIGZvcgorICAgIC8vLyBUW10gYXJyYXlzLCByZXR1cm5zIDEgZm9yIFRbMV0gYXJyYXlzIGFzIHdlbGwgYXMgaWYgdGhlIGZpZWxkIGlzIG5vdCBhbiBhcnJheS4KKyAgICBpbmxpbmUgc2l6ZV90IGV4dGVudCgpIGNvbnN0IHsgcmV0dXJuIF9tRXh0ZW50OyB9CisgICAgLy8vIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkCisgICAgaW5saW5lIEMyU3RyaW5nIG5hbWUoKSBjb25zdCB7IHJldHVybiBfbU5hbWU7IH0KKworICAgIGNvbnN0IE5hbWVkVmFsdWVzVHlwZSAmbmFtZWRWYWx1ZXMoKSBjb25zdCB7IHJldHVybiBfbU5hbWVkVmFsdWVzOyB9CisKKyNpZiBkZWZpbmVkKEZSSUVORF9URVNUKQorICAgIGZyaWVuZCB2b2lkIFByaW50VG8oY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJiwgOjpzdGQ6Om9zdHJlYW0qKTsKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICYsIGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICYpOworICAgIEZSSUVORF9URVNUKEMyUGFyYW1UZXN0X1BhcmFtRmllbGRMaXN0LCBWZXJpZnlTdHJ1Y3QpOworI2VuZGlmCisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGFuIG9mZnNldGVkIGZpZWxkIGRlc2NyaXB0b3IuCisgICAgICovCisgICAgaW5saW5lIEMyRmllbGREZXNjcmlwdG9yKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZkZXNjLCBzaXplX3Qgb2Zmc2V0KQorICAgICAgICA6IF9tVHlwZShkZXNjLl9tVHlwZSksIF9tRXh0ZW50KGRlc2MuX21FeHRlbnQpLAorICAgICAgICAgIF9tTmFtZShkZXNjLl9tTmFtZSksIF9tTmFtZWRWYWx1ZXMoZGVzYy5fbU5hbWVkVmFsdWVzKSwKKyAgICAgICAgICBfbUZpZWxkSWQoZGVzYy5fbUZpZWxkSWQuX21PZmZzZXQgKyBvZmZzZXQsIGRlc2MuX21GaWVsZElkLl9tU2l6ZSkgeyB9CisKKyAgICB0eXBlX3QgX21UeXBlOworICAgIHVpbnQzMl90IF9tRXh0ZW50OyAvLyB0aGUgbGFzdCBtZW1iZXIgY2FuIGJlIGFyYml0cmFyeSBsZW5ndGggaWYgaXQgaXMgVFtdIGFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAvLyBleHRlbmRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgcGFyYW1ldGVyICh0aGlzIGlzIG1hcmtlZCB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgIC8vIDApLiBUWzBdLXMgYXJlIG5vdCBmaWVsZHMuCisgICAgQzJTdHJpbmcgX21OYW1lOworICAgIE5hbWVkVmFsdWVzVHlwZSBfbU5hbWVkVmFsdWVzOworCisgICAgX0MyRmllbGRJZCBfbUZpZWxkSWQ7ICAgLy8gZmllbGQgaWRlbnRpZmllciAob2Zmc2V0IGFuZCBzaXplKQorCisgICAgLy8gTk9URTogV2UgZG8gbm90IGNhcHR1cmUgZGVmYXVsdCB2YWx1ZShzKSBoZXJlIGFzIHRoYXQgbWF5IGRlcGVuZCBvbiB0aGUgY29tcG9uZW50LgorICAgIC8vIE5PVEU6IFdlIGFsc28gZG8gbm90IGNhcHR1cmUgYmVzdEVmZm9ydCwgYXMgMSkgdGhpcyBzaG91bGQgYmUgdHJ1ZSBmb3IgbW9zdCBmaWVsZHMsCisgICAgLy8gMikgdGhpcyBpcyBhdCBwYXJhbWV0ZXIgZ3JhbnVsYXJpdHkuCisKKyAgICAvLyB0eXBlIHJlc29sdXRpb24KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKGludDMyX3QqKSAgICAgeyByZXR1cm4gSU5UMzI7IH0KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKHVpbnQzMl90KikgICAgeyByZXR1cm4gVUlOVDMyOyB9CisgICAgaW5saW5lIHN0YXRpYyB0eXBlX3QgR2V0VHlwZShjMl9jbnRyMzJfdCopIHsgcmV0dXJuIENOVFIzMjsgfQorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUoaW50NjRfdCopICAgICB7IHJldHVybiBJTlQ2NDsgfQorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUodWludDY0X3QqKSAgICB7IHJldHVybiBVSU5UNjQ7IH0KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKGMyX2NudHI2NF90KikgeyByZXR1cm4gQ05UUjY0OyB9CisgICAgaW5saW5lIHN0YXRpYyB0eXBlX3QgR2V0VHlwZShmbG9hdCopICAgICAgIHsgcmV0dXJuIEZMT0FUOyB9CisgICAgaW5saW5lIHN0YXRpYyB0eXBlX3QgR2V0VHlwZShjaGFyKikgICAgICAgIHsgcmV0dXJuIFNUUklORzsgfQorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUodWludDhfdCopICAgICB7IHJldHVybiBCTE9COyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULAorICAgICAgICAgICAgIGNsYXNzPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfZW51bTxUPjo6dmFsdWU+Ojp0eXBlPgorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUoVCopIHsKKyAgICAgICAgdHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8VD46OnR5cGUgdW5kZXJseWluZygwKTsKKyAgICAgICAgcmV0dXJuIEdldFR5cGUoJnVuZGVybHlpbmcpOworICAgIH0KKworICAgIC8vIHZlcmlmeSBDMlN0cnVjdCBieSBoYXZpbmcgYSBGaWVsZExpc3QoKSBhbmQgYSBDT1JFX0lOREVYLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsCisgICAgICAgICAgICAgY2xhc3M9ZGVjbHR5cGUoVDo6Q09SRV9JTkRFWCArIDEpLCBjbGFzcz1kZWNsdHlwZShUOjpGaWVsZExpc3QoKSk+CisgICAgaW5saW5lIHN0YXRpYyB0eXBlX3QgR2V0VHlwZShUKikgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX2Jhc2Vfb2Y8QzJQYXJhbSwgVD46OnZhbHVlLCAiY2Fubm90IHVzZSBDMlBhcmFtcyBhcyBmaWVsZHMiKTsKKyAgICAgICAgcmV0dXJuICh0eXBlX3QpKFQ6OkNPUkVfSU5ERVggfCBTVFJVQ1RfRkxBRyk7CisgICAgfQorCisgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsKK307CisKKy8vIG5vIG5hbWVkIHZhbHVlcyBmb3IgY29tcG91bmQgdHlwZXMKK3RlbXBsYXRlPHR5cGVuYW1lIEI+CitzdHJ1Y3QgQzJGaWVsZERlc2NyaXB0b3I6Ol9OYW1lZFZhbHVlc0dldHRlcjxCLCBmYWxzZT4geworICAgIGlubGluZSBzdGF0aWMgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBnZXROYW1lZFZhbHVlcygpIHsKKyAgICAgICAgcmV0dXJuIE5hbWVkVmFsdWVzVHlwZSgpOworICAgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEI+CitzdHJ1Y3QgQzJGaWVsZERlc2NyaXB0b3I6Ol9OYW1lZFZhbHVlc0dldHRlcjxCLCB0cnVlPiB7CisgICAgaW5saW5lIHN0YXRpYyBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIGdldE5hbWVkVmFsdWVzKCkgeworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XbnVsbC1kZXJlZmVyZW5jZSIKKyAgICAgICAgcmV0dXJuIEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0ZvcigqKEIqKW51bGxwdHIpOworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKyAgICB9Cit9OworCisjZGVmaW5lIERFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKHR5cGUpIFwKK3RlbXBsYXRlPD4gaW5saW5lIEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkVmFsdWVzRm9yKGNvbnN0IHR5cGUgJikgeyBcCisgICAgcmV0dXJuIE5hbWVkVmFsdWVzVHlwZSgpOyBcCit9CisKKy8vIFdlIGNhbm5vdCBzdWJ0eXBlIGNvbnN0cnVjdG9yIGZvciBlbnVtZXJhdGVkIHR5cGVzIHNvIGluc3RlZCBkZWZpbmUgbm8gbmFtZWQgdmFsdWVzIGZvcgorLy8gbm9uLWVudW1lcmF0ZWQgaW50ZWdyYWwgdHlwZXMuCitERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUihpbnQzMl90KQorREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IodWludDMyX3QpCitERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUihjMl9jbnRyMzJfdCkKK0RFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKGludDY0X3QpCitERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUih1aW50NjRfdCkKK0RFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKGMyX2NudHI2NF90KQorREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IodWludDhfdCkKK0RFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKGNoYXIpCitERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUihmbG9hdCkKKworLyoqCisgKiBEZXNjcmliZXMgdGhlIGZpZWxkcyBvZiBhIHN0cnVjdHVyZS4KKyAqLworc3RydWN0IEMyU3RydWN0RGVzY3JpcHRvciB7CitwdWJsaWM6CisgICAgLy8vIFJldHVybnMgdGhlIGNvcmUgaW5kZXggb2YgdGhlIHN0cnVjdAorICAgIGlubGluZSBDMlBhcmFtOjpDb3JlSW5kZXggY29yZUluZGV4KCkgY29uc3QgeyByZXR1cm4gX21UeXBlLmNvcmVJbmRleCgpOyB9CisKKyAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZmllbGRzIGluIHRoaXMgc3RydWN0IChub3QgY291bnRpbmcgYW55IHJlY3Vyc2l2ZSBmaWVsZHMpLgorICAgIC8vIE11c3QgYmUgYXQgbGVhc3QgMSBmb3IgdmFsaWQgc3RydWN0cy4KKyAgICBpbmxpbmUgc2l6ZV90IG51bUZpZWxkcygpIGNvbnN0IHsgcmV0dXJuIF9tRmllbGRzLnNpemUoKTsgfQorCisgICAgLy8gUmV0dXJucyB0aGUgbGlzdCBvZiBkaXJlY3QgZmllbGRzIChub3QgY291bnRpbmcgYW55IHJlY3Vyc2l2ZSBmaWVsZHMpLgorICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+Ojpjb25zdF9pdGVyYXRvciBmaWVsZF9pdGVyYXRvcjsKKyAgICBpbmxpbmUgZmllbGRfaXRlcmF0b3IgY2JlZ2luKCkgY29uc3QgeyByZXR1cm4gX21GaWVsZHMuY2JlZ2luKCk7IH0KKyAgICBpbmxpbmUgZmllbGRfaXRlcmF0b3IgY2VuZCgpIGNvbnN0IHsgcmV0dXJuIF9tRmllbGRzLmNlbmQoKTsgfQorCisgICAgLy8gb25seSBzdXBwbHlpbmcgY29uc3QgaXRlcmF0b3IgLSBidXQgdGhlc2UgbmFtZXMgYXJlIG5lZWRlZCBmb3IgcmFuZ2UgYmFzZWQgbG9vcHMKKyAgICBpbmxpbmUgZmllbGRfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBfbUZpZWxkcy5jYmVnaW4oKTsgfQorICAgIGlubGluZSBmaWVsZF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBfbUZpZWxkcy5jZW5kKCk7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIEMyU3RydWN0RGVzY3JpcHRvcihUKikKKyAgICAgICAgOiBDMlN0cnVjdERlc2NyaXB0b3IoVDo6Q09SRV9JTkRFWCwgVDo6RmllbGRMaXN0KCkpIHsgfQorCisgICAgaW5saW5lIEMyU3RydWN0RGVzY3JpcHRvcigKKyAgICAgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCB0eXBlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+ICZmaWVsZHMpCisgICAgICAgIDogX21UeXBlKHR5cGUpLCBfbUZpZWxkcyhmaWVsZHMpIHsgfQorCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgX0MyUGFyYW1JbnNwZWN0b3I7CisKKyAgICBpbmxpbmUgQzJTdHJ1Y3REZXNjcmlwdG9yKAorICAgICAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IHR5cGUsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gJiZmaWVsZHMpCisgICAgICAgIDogX21UeXBlKHR5cGUpLCBfbUZpZWxkcyhzdGQ6Om1vdmUoZmllbGRzKSkgeyB9CisKKyAgICBjb25zdCBDMlBhcmFtOjpDb3JlSW5kZXggX21UeXBlOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfbUZpZWxkczsKK307CisKKy8qKgorICogRGVzY3JpYmVzIHBhcmFtZXRlcnMgZm9yIGEgY29tcG9uZW50LgorICovCitzdHJ1Y3QgQzJQYXJhbURlc2NyaXB0b3IgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBzZXR0aW5nIHRoaXMgcGFyYW0gaXMgcmVxdWlyZWQgdG8gY29uZmlndXJlIHRoaXMgY29tcG9uZW50LgorICAgICAqIFRoaXMgY2FuIG9ubHkgYmUgdHJ1ZSBmb3IgYnVpbHRpbiBwYXJhbXMgZm9yIHBsYXRmb3JtLWRlZmluZWQgY29tcG9uZW50cyAoZS5nLiB2aWRlbyBhbmQKKyAgICAgKiBhdWRpbyBlbmNvZGVycy9kZWNvZGVycywgdmlkZW8vYXVkaW8gZmlsdGVycykuCisgICAgICogRm9yIHZlbmRvci1kZWZpbmVkIGNvbXBvbmVudHMsIGl0IGNhbiBiZSB0cnVlIGV2ZW4gZm9yIHZlbmRvci1kZWZpbmVkIHBhcmFtcywKKyAgICAgKiBidXQgaXQgaXMgbm90IHJlY29tbWVuZGVkLCBpbiBjYXNlIHRoZSBjb21wb25lbnQgYmVjb21lcyBwbGF0Zm9ybS1kZWZpbmVkLgorICAgICAqLworICAgIGlubGluZSBib29sIGlzUmVxdWlyZWQoKSBjb25zdCB7IHJldHVybiBfbUF0dHJpYiAmIElTX1JFUVVJUkVEOyB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBwYXJhbWV0ZXIgaXMgcGVyc2lzdGVudC4gVGhpcyBpcyBhbHdheXMgdHJ1ZSBmb3IgQzJUdW5pbmcgYW5kIEMyU2V0dGluZywKKyAgICAgKiBidXQgbWF5IGJlIGZhbHNlIGZvciBDMkluZm8uIElmIHRydWUsIHRoaXMgcGFyYW1ldGVyIHBlcnNpc3RzIGFjcm9zcyBmcmFtZXMgYW5kIGFwcGxpZXMgdG8KKyAgICAgKiB0aGUgY3VycmVudCBhbmQgc3Vic2VxdWVudCBmcmFtZXMuIElmIGZhbHNlLCB0aGlzIEMySW5mbyBwYXJhbWV0ZXIgb25seSBhcHBsaWVzIHRvIHRoZQorICAgICAqIGN1cnJlbnQgZnJhbWUgYW5kIGlzIG5vdCBhc3N1bWVkIHRvIGhhdmUgdGhlIHNhbWUgdmFsdWUgKG9yIGV2ZW4gYmUgcHJlc2VudCkgb24gc3Vic2VxdWVudAorICAgICAqIGZyYW1lcywgdW5sZXNzIGl0IGlzIHNwZWNpZmllZCBmb3IgdGhvc2UgZnJhbWVzLgorICAgICAqLworICAgIGlubGluZSBib29sIGlzUGVyc2lzdGVudCgpIGNvbnN0IHsgcmV0dXJuIF9tQXR0cmliICYgSVNfUEVSU0lTVEVOVDsgfQorCisgICAgaW5saW5lIGJvb2wgaXNTdHJpY3QoKSBjb25zdCB7IHJldHVybiBfbUF0dHJpYiAmIElTX1NUUklDVDsgfQorCisgICAgaW5saW5lIGJvb2wgaXNSZWFkT25seSgpIGNvbnN0IHsgcmV0dXJuIF9tQXR0cmliICYgSVNfUkVBRF9PTkxZOyB9CisKKyAgICBpbmxpbmUgYm9vbCBpc1Zpc2libGUoKSBjb25zdCB7IHJldHVybiAhKF9tQXR0cmliICYgSVNfSElEREVOKTsgfQorCisgICAgaW5saW5lIGJvb2wgaXNQdWJsaWMoKSBjb25zdCB7IHJldHVybiAhKF9tQXR0cmliICYgSVNfSU5URVJOQUwpOyB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIHBhcmFtLgorICAgIC8vLyBUaGlzIGRlZmF1bHRzIHRvIHRoZSB1bmRlcmx5aW5nIEMyU3RydWN0J3MgbmFtZSwgYnV0IGNvdWxkIGJlIGFsdGVyZWQgZm9yIGEgY29tcG9uZW50LgorICAgIGlubGluZSBDMlN0cmluZyBuYW1lKCkgY29uc3QgeyByZXR1cm4gX21OYW1lOyB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgcGFyYW1ldGVyIGluZGV4CisgICAgaW5saW5lIEMyUGFyYW06OkluZGV4IGluZGV4KCkgY29uc3QgeyByZXR1cm4gX21JbmRleDsgfQorCisgICAgLy8vIFJldHVybnMgdGhlIGluZGljZXMgb2YgcGFyYW1ldGVycyB0aGF0IHRoaXMgcGFyYW1ldGVyIGhhcyBhIGRlcGVuZGVuY3kgb24KKyAgICBpbmxpbmUgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZkZXBlbmRlbmNpZXMoKSBjb25zdCB7IHJldHVybiBfbURlcGVuZGVuY2llczsgfQorCisgICAgLy8vIFxkZXByZWNhdGVkCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgQzJQYXJhbURlc2NyaXB0b3IoYm9vbCBpc1JlcXVpcmVkLCBDMlN0cmluZ0xpdGVyYWwgbmFtZSwgY29uc3QgVCopCisgICAgICAgIDogX21JbmRleChUOjpQQVJBTV9UWVBFKSwKKyAgICAgICAgICBfbUF0dHJpYihJU19QRVJTSVNURU5UIHwgKGlzUmVxdWlyZWQgPyBJU19SRVFVSVJFRCA6IDApKSwKKyAgICAgICAgICBfbU5hbWUobmFtZSkgeyB9CisKKyAgICAvLy8gXGRlcHJlY2F0ZWQKKyAgICBpbmxpbmUgQzJQYXJhbURlc2NyaXB0b3IoCisgICAgICAgICAgICBib29sIGlzUmVxdWlyZWQsIEMyU3RyaW5nTGl0ZXJhbCBuYW1lLCBDMlBhcmFtOjpJbmRleCBpbmRleCkKKyAgICAgICAgOiBfbUluZGV4KGluZGV4KSwKKyAgICAgICAgICBfbUF0dHJpYihJU19QRVJTSVNURU5UIHwgKGlzUmVxdWlyZWQgPyBJU19SRVFVSVJFRCA6IDApKSwKKyAgICAgICAgICBfbU5hbWUobmFtZSkgeyB9CisKKyAgICBlbnVtIGF0dHJpYl90IDogdWludDMyX3QgeworICAgICAgICAvLyBmbGFncyB0aGF0IGRlZmF1bHQgb24KKyAgICAgICAgSVNfUkVRVUlSRUQgICA9IDF1IDw8IDAsIC8vLzwgcGFyYW1ldGVyIGlzIHJlcXVpcmVkIHRvIGJlIHNwZWNpZmllZAorICAgICAgICBJU19QRVJTSVNURU5UID0gMXUgPDwgMSwgLy8vPCBwYXJhbWV0ZXIgcmV0YWlucyBpdHMgdmFsdWUKKyAgICAgICAgLy8gZmxhZ3MgdGhhdCBkZWZhdWx0IG9mZgorICAgICAgICBJU19TVFJJQ1QgICAgID0gMXUgPDwgMiwgLy8vPCBwYXJhbWV0ZXIgaXMgc3RyaWN0CisgICAgICAgIElTX1JFQURfT05MWSAgPSAxdSA8PCAzLCAvLy88IHBhcmFtZXRlciBpcyBwdWJsaWNseSByZWFkLW9ubHkKKyAgICAgICAgSVNfSElEREVOICAgICA9IDF1IDw8IDQsIC8vLzwgcGFyYW1ldGVyIHNoYWxsIG5vdCBiZSB2aXNpYmxlIHRvIGNsaWVudHMKKyAgICAgICAgSVNfSU5URVJOQUwgICA9IDF1IDw8IDUsIC8vLzwgcGFyYW1ldGVyIHNoYWxsIG5vdCBiZSB1c2VkIGJ5IGZyYW1ld29yayAob3RoZXIgdGhhbiB0ZXN0aW5nKQorICAgICAgICBJU19DT05TVCAgICAgID0gMXUgPDwgNiB8IElTX1JFQURfT05MWSwgLy8vPCBwYXJhbWV0ZXIgaXMgcHVibGljbHkgY29uc3QgKGhlbmNlIHJlYWQtb25seSkKKyAgICB9OworCisgICAgaW5saW5lIEMyUGFyYW1EZXNjcmlwdG9yKAorICAgICAgICBDMlBhcmFtOjpJbmRleCBpbmRleCwgYXR0cmliX3QgYXR0cmliLCBDMlN0cmluZ0xpdGVyYWwgbmFtZSkKKyAgICAgICAgOiBfbUluZGV4KGluZGV4KSwKKyAgICAgICAgICBfbUF0dHJpYihhdHRyaWIpLAorICAgICAgICAgIF9tTmFtZShuYW1lKSB7IH0KKworICAgIGlubGluZSBDMlBhcmFtRGVzY3JpcHRvcigKKyAgICAgICAgQzJQYXJhbTo6SW5kZXggaW5kZXgsIGF0dHJpYl90IGF0dHJpYiwgQzJTdHJpbmcgJiZuYW1lLAorICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJiZkZXBlbmRlbmNpZXMpCisgICAgICAgIDogX21JbmRleChpbmRleCksCisgICAgICAgICAgX21BdHRyaWIoYXR0cmliKSwKKyAgICAgICAgICBfbU5hbWUobmFtZSksCisgICAgICAgICAgX21EZXBlbmRlbmNpZXMoc3RkOjptb3ZlKGRlcGVuZGVuY2llcykpIHsgfQorCitwcml2YXRlOgorICAgIGNvbnN0IEMyUGFyYW06OkluZGV4IF9tSW5kZXg7CisgICAgY29uc3QgdWludDMyX3QgX21BdHRyaWI7CisgICAgY29uc3QgQzJTdHJpbmcgX21OYW1lOworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBfbURlcGVuZGVuY2llczsKKworICAgIGZyaWVuZCBzdHJ1Y3QgX0MyUGFyYW1JbnNwZWN0b3I7Cit9OworCitERUZJTkVfRU5VTV9PUEVSQVRPUlMoOjpDMlBhcmFtRGVzY3JpcHRvcjo6YXR0cmliX3QpCisKKworLy8vIFxpbmdyb3VwIGludGVybmFsCisvLy8gRGVmaW5lIGEgc3RydWN0dXJlIHdpdGhvdXQgQ09SRV9JTkRFWC4KKy8vLyBcbm90ZSBfRklFTERfTElTVCBpcyB1c2VkIG9ubHkgZHVyaW5nIGRlY2xhcmF0aW9uIHNvIHRoYXQgQzJTdHJ1Y3QgZGVjbGFyYXRpb25zIGNhbiBlbmQgd2l0aAorLy8vIGEgc2ltcGxlIGxpc3Qgb2YgQzJGSUVMRC1zIGFuZCBjbG9zaW5nIGJyYWNrZXQuIE1hcmsgaXQgdW51c2VkIGFzIGl0IGlzIG5vdCB1c2VkIGluIHRlbXBsYXRlZAorLy8vIHN0cnVjdHMuCisjZGVmaW5lIERFRklORV9CQVNFX0MyU1RSVUNUKG5hbWUpIFwKK3ByaXZhdGU6IFwKKyAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IF9GSUVMRF9MSVNUIF9fdW51c2VkOyAvKio8IHN0cnVjdHVyZSBmaWVsZHMgKi8gXAorcHVibGljOiBcCisgICAgdHlwZWRlZiBDMiMjbmFtZSMjU3RydWN0IF90eXBlOyAvKio8IHR5cGUgbmFtZSBzaG9ydGhhbmQgKi8gXAorICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7IC8qKjwgc3RydWN0dXJlIGZpZWxkcyBmYWN0b3J5ICovCisKKy8vLyBEZWZpbmUgYSBzdHJ1Y3R1cmUgd2l0aCBtYXRjaGluZyBDT1JFX0lOREVYLgorI2RlZmluZSBERUZJTkVfQzJTVFJVQ1QobmFtZSkgXAorcHVibGljOiBcCisgICAgZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IGtQYXJhbUluZGV4IyNuYW1lIH07IFwKKyAgICBERUZJTkVfQkFTRV9DMlNUUlVDVChuYW1lKQorCisvLy8gRGVmaW5lIGEgZmxleGlibGUgc3RydWN0dXJlIHdpdGhvdXQgQ09SRV9JTkRFWC4KKyNkZWZpbmUgREVGSU5FX0JBU0VfRkxFWF9DMlNUUlVDVChuYW1lLCBmbGV4TWVtYmVyKSBcCitwdWJsaWM6IFwKKyAgICBGTEVYKEMyIyNuYW1lIyNTdHJ1Y3QsIGZsZXhNZW1iZXIpIFwKKyAgICBERUZJTkVfQkFTRV9DMlNUUlVDVChuYW1lKQorCisvLy8gRGVmaW5lIGEgZmxleGlibGUgc3RydWN0dXJlIHdpdGggbWF0Y2hpbmcgQ09SRV9JTkRFWC4KKyNkZWZpbmUgREVGSU5FX0ZMRVhfQzJTVFJVQ1QobmFtZSwgZmxleE1lbWJlcikgXAorcHVibGljOiBcCisgICAgRkxFWChDMiMjbmFtZSMjU3RydWN0LCBmbGV4TWVtYmVyKSBcCisgICAgZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IGtQYXJhbUluZGV4IyNuYW1lIHwgQzJQYXJhbTo6Q29yZUluZGV4OjpJU19GTEVYX0ZMQUcgfTsgXAorICAgIERFRklORV9CQVNFX0MyU1RSVUNUKG5hbWUpCisKKy8vLyBcaW5ncm91cCBpbnRlcm5hbAorLy8vIERlc2NyaWJlIGEgc3RydWN0dXJlIG9mIGEgdGVtcGxhdGVkIHN0cnVjdHVyZS4KKy8vIFVzZSBsaXN0Li4uIGFzIHRoZSBhcmd1bWVudCBnZXRzIHJlc3Vic2l0aXR1dGVkIGFuZCBpdCBjb250YWlucyBjb21tYXMuIEFsdGVybmF0aXZlIHdvdWxkIGJlCisvLyB0byB3cmFwIGxpc3QgaW4gYW4gZXhwcmVzc2lvbiwgZS5nLiAoeyBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gbGlzdDsgfSkpIHdoaWNoIGNvbnZlcnRzCisvLyBpdCBmcm9tIGFuIGluaXRpYWxpemVyIGxpc3QgdG8gYSB2ZWN0b3IuCisjZGVmaW5lIERFU0NSSUJFX1RFTVBMQVRFRF9DMlNUUlVDVChzdHJ1a3QsIGxpc3QuLi4pIFwKKyAgICBfREVTQ1JJQkVfVEVNUExBVEFCTEVfQzJTVFJVQ1QodGVtcGxhdGU8Piwgc3RydWt0LCBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18sIGxpc3QpCisKKy8vLyBcZGVwcmVjYXRlZAorLy8vIERlc2NyaWJlIHRoZSBmaWVsZHMgb2YgYSBzdHJ1Y3R1cmUgdXNpbmcgYW4gaW5pdGlhbGl6ZXIgbGlzdC4KKyNkZWZpbmUgREVTQ1JJQkVfQzJTVFJVQ1QobmFtZSwgbGlzdC4uLikgXAorICAgIF9ERVNDUklCRV9URU1QTEFUQUJMRV9DMlNUUlVDVCgsIEMyIyNuYW1lIyNTdHJ1Y3QsIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXywgbGlzdCkKKworLy8vIFxpbmdyb3VwIGludGVybmFsCisvLy8gTWFjcm8gbGF5ZXIgdG8gZ2V0IHZhbHVlIG9mIGVuYWJsZWQgdGhhdCBpcyBwYXNzZWQgaW4gYXMgYSBtYWNybyB2YXJpYWJsZQorI2RlZmluZSBfREVTQ1JJQkVfVEVNUExBVEFCTEVfQzJTVFJVQ1QodGVtcGxhdGUsIHN0cnVrdCwgZW5hYmxlZCwgbGlzdC4uLikgXAorICAgIF9fREVTQ1JJQkVfVEVNUExBVEFCTEVfQzJTVFJVQ1QodGVtcGxhdGUsIHN0cnVrdCwgZW5hYmxlZCwgbGlzdCkKKworLy8vIFxpbmdyb3VwIGludGVybmFsCisvLy8gTWFjcm8gbGF5ZXIgdG8gcmVzb2x2ZSB0byB0aGUgc3BlY2lmaWMgbWFjcm8gYmFzZWQgb24gbWFjcm8gdmFyaWFibGUKKyNkZWZpbmUgX19ERVNDUklCRV9URU1QTEFUQUJMRV9DMlNUUlVDVCh0ZW1wbGF0ZSwgc3RydWt0LCBlbmFibGVkLCBsaXN0Li4uKSBcCisgICAgX19fREVTQ1JJQkVfVEVNUExBVEFCTEVfQzJTVFJVQ1QjI2VuYWJsZWQodGVtcGxhdGUsIHN0cnVrdCwgbGlzdCkKKworI2RlZmluZSBfX19ERVNDUklCRV9URU1QTEFUQUJMRV9DMlNUUlVDVCh0ZW1wbGF0ZSwgc3RydWt0LCBsaXN0Li4uKSBcCisgICAgdGVtcGxhdGUgXAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBzdHJ1a3Q6OkZpZWxkTGlzdCgpIHsgcmV0dXJuIGxpc3Q7IH0KKworI2RlZmluZSBfX19ERVNDUklCRV9URU1QTEFUQUJMRV9DMlNUUlVDVF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXyh0ZW1wbGF0ZSwgc3RydWt0LCBsaXN0Li4uKQorCisvKioKKyAqIERlc2NyaWJlIGEgZmllbGQgb2YgYSBzdHJ1Y3R1cmUuCisgKiBUaGVzZSBtdXN0IGJlIGluIG9yZGVyLgorICoKKyAqIFRoZXJlIGFyZSB0d28gd2F5cyB0byB1c2UgdGhpcyBtYWNybzoKKyAqCisgKiAgfn5+fn5+fn5+fn5+fiAoLmNwcCkKKyAqICBzdHJ1Y3QgQzJWaWRlb1dpZHRoU3RydWN0IHsKKyAqICAgICAgaW50MzJfdCB3aWR0aDsKKyAqICAgICAgQzJWaWRlb1dpZHRoU3RydWN0KCkge30gLy8gb3B0aW9uYWwgZGVmYXVsdCBjb25zdHJ1Y3RvcgorICogICAgICBDMlZpZGVvV2lkdGhTdHJ1Y3QoaW50MzJfdCBfd2lkdGgpIDogd2lkdGgoX3dpZHRoKSB7fQorICoKKyAqICAgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChWaWRlb1dpZHRoKQorICogICAgICBDMkZJRUxEKHdpZHRoLCAid2lkdGgiKQorICogIH07CisgKiAgfn5+fn5+fn5+fn5+fgorICoKKyAqICB+fn5+fn5+fn5+fn5+ICguY3BwKQorICogIHN0cnVjdCBDMlZpZGVvV2lkdGhTdHJ1Y3QgeworICogICAgICBpbnQzMl90IHdpZHRoOworICogICAgICBDMlZpZGVvV2lkdGhTdHJ1Y3QoKSA9IGRlZmF1bHQ7IC8vIG9wdGlvbmFsIGRlZmF1bHQgY29uc3RydWN0b3IKKyAqICAgICAgQzJWaWRlb1dpZHRoU3RydWN0KGludDMyX3QgX3dpZHRoKSA6IHdpZHRoKF93aWR0aCkge30KKyAqCisgKiAgICAgIERFRklORV9DMlNUUlVDVChWaWRlb1dpZHRoKQorICogIH0gQzJfUEFDSzsKKyAqCisgKiAgREVTQ1JJQkVfQzJTVFJVQ1QoVmlkZW9XaWR0aCwgeworICogICAgICBDMkZJRUxEKHdpZHRoLCAid2lkdGgiKQorICogIH0pCisgKiAgfn5+fn5+fn5+fn5+fgorICoKKyAqICBGb3IgZmxleGlibGUgc3RydWN0dXJlcyAodGhvc2UgZW5kaW5nIGluIFRbXSksIHVzZSB0aGUgZmxleGlibGUgbWFjcm9zOgorICoKKyAqICB+fn5+fn5+fn5+fn5+ICguY3BwKQorICogIHN0cnVjdCBDMlZpZGVvRmxleFdpZHRoc1N0cnVjdCB7CisgKiAgICAgIGludDMyX3Qgd2lkdGhzW107CisgKiAgICAgIEMyVmlkZW9GbGV4V2lkdGhzU3RydWN0KCk7IC8vIG11c3QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IKKyAqCisgKiAgcHJpdmF0ZToKKyAqICAgICAgLy8gbWF5IGhhdmUgcHJpdmF0ZSBjb25zdHJ1Y3RvcnMgdGFraW5nIG51bWJlciBvZiB3aWR0aHMgYXMgdGhlIGZpcnN0IGFyZ3VtZW50CisgKiAgICAgIC8vIFRoaXMgaXMgdXNlZCBieSB0aGUgQzJQYXJhbSBmYWN0b3J5IG1ldGhvZHMsIGUuZy4KKyAqICAgICAgLy8gICBDMlZpZGVvRmxleFdpZHRoc0dsb2JhbFBhcmFtOjpBbGxvY1VuaXF1ZShzaXplX3QsIGludDMyX3QpOworICogICAgICBDMlZpZGVvRmxleFdpZHRoc1N0cnVjdChzaXplX3QgZmxleENvdW50LCBpbnQzMl90IHZhbHVlKSB7CisgKiAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZsZXhDb3VudDsgKytpKSB7CisgKiAgICAgICAgICAgICAgd2lkdGhzW2ldID0gdmFsdWU7CisgKiAgICAgICAgICB9CisgKiAgICAgIH0KKyAqCisgKiAgICAgIC8vIElmIHRoZSBsYXN0IGFyZ3VtZW50IGlzIFRbTl0gb3Igc3RkOjppbml0aWFsaXplcl9saXN0PFQ+LCB0aGUgZmxleENvdW50IHdpbGwKKyAqICAgICAgLy8gYmUgYXV0b21hdGljYWxseSBjYWxjdWxhdGVkIGFuZCBwYXNzZWQgYnkgdGhlIEMyUGFyYW0gZmFjdG9yeSBtZXRob2RzLCBlLmcuCisgKiAgICAgIC8vICAgaW50IHdpZHRoc1tdID0geyAxLCAyLCAzIH07CisgKiAgICAgIC8vICAgQzJWaWRlb0ZsZXhXaWR0aHNHbG9iYWxQYXJhbTo6QWxsb2NVbmlxdWUod2lkdGhzKTsKKyAqICAgICAgdGVtcGxhdGU8dW5zaWduZWQgTj4KKyAqICAgICAgQzJWaWRlb0ZsZXhXaWR0aHNTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgY29uc3QgaW50MzJfdCgmaW5pdClbTl0pIHsKKyAqICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmxleENvdW50OyArK2kpIHsKKyAqICAgICAgICAgICAgICB3aWR0aHNbaV0gPSBpbml0W2ldOworICogICAgICAgICAgfQorICogICAgICB9CisgKgorICogICAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoVmlkZW9GbGV4V2lkdGhzLCB3aWR0aHMpCisgKiAgICAgIEMyRklFTEQod2lkdGhzLCAid2lkdGhzIikKKyAqICB9OworICogIH5+fn5+fn5+fn5+fn4KKyAqCisgKiAgfn5+fn5+fn5+fn5+fiAoLmNwcCkKKyAqICBzdHJ1Y3QgQzJWaWRlb0ZsZXhXaWR0aHNTdHJ1Y3QgeworICogICAgICBpbnQzMl90IG1XaWR0aHNbXTsKKyAqICAgICAgQzJWaWRlb0ZsZXhXaWR0aHNTdHJ1Y3QoKTsgLy8gbXVzdCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3RvcgorICoKKyAqICAgICAgREVGSU5FX0ZMRVhfQzJTVFJVQ1QoVmlkZW9GbGV4V2lkdGhzLCBtV2lkdGhzKQorICogIH0gQzJfUEFDSzsKKyAqCisgKiAgREVTQ1JJQkVfQzJTVFJVQ1QoVmlkZW9GbGV4V2lkdGhzLCB7CisgKiAgICAgIEMyRklFTEQobVdpZHRocywgIndpZHRocyIpCisgKiAgfSkKKyAqICB+fn5+fn5+fn5+fn5+CisgKgorICovCisjZGVmaW5lIERFU0NSSUJFX0MyRklFTEQobWVtYmVyLCBuYW1lKSBcCisgIEMyRmllbGREZXNjcmlwdG9yKCYoKF90eXBlKikobnVsbHB0cikpLT5tZW1iZXIsIG5hbWUpLAorCisjZGVmaW5lIEMyRklFTEQobWVtYmVyLCBuYW1lKSBfQzJGSUVMRChtZW1iZXIsIG5hbWUsIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXykKKy8vLyBcaWYgMAorI2RlZmluZSBfQzJGSUVMRChtZW1iZXIsIG5hbWUsIGVuYWJsZWQpIF9fQzJGSUVMRChtZW1iZXIsIG5hbWUsIGVuYWJsZWQpCisjZGVmaW5lIF9fQzJGSUVMRChtZW1iZXIsIG5hbWUsIGVuYWJsZWQpIERFU0NSSUJFX0MyRklFTEQjI2VuYWJsZWQobWVtYmVyLCBuYW1lKQorI2RlZmluZSBERVNDUklCRV9DMkZJRUxEX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKG1lbWJlciwgbmFtZSkKKy8vLyBcZW5kaWYKKworLy8vIERlZmluZSBhIHN0cnVjdHVyZSB3aXRoIG1hdGNoaW5nIENPUkVfSU5ERVggYW5kIHN0YXJ0IGRlc2NyaWJpbmcgaXRzIGZpZWxkcy4KKy8vLyBUaGlzIG11c3QgYmUgYXQgdGhlIGVuZCBvZiB0aGUgc3RydWN0dXJlIGRlZmluaXRpb24uCisjZGVmaW5lIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QobmFtZSkgXAorICAgIF9ERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKG5hbWUsIERFRklORV9DMlNUUlVDVCwgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKQorCisvLy8gRGVmaW5lIGEgYmFzZSBzdHJ1Y3R1cmUgKHdpdGggbm8gQ09SRV9JTkRFWCkgYW5kIHN0YXJ0IGRlc2NyaWJpbmcgaXRzIGZpZWxkcy4KKy8vLyBUaGlzIG11c3QgYmUgYXQgdGhlIGVuZCBvZiB0aGUgc3RydWN0dXJlIGRlZmluaXRpb24uCisjZGVmaW5lIERFRklORV9BTkRfREVTQ1JJQkVfQkFTRV9DMlNUUlVDVChuYW1lKSBcCisgICAgX0RFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QobmFtZSwgREVGSU5FX0JBU0VfQzJTVFJVQ1QsIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXykKKworLy8vIERlZmluZSBhIGZsZXhpYmxlIHN0cnVjdHVyZSB3aXRoIG1hdGNoaW5nIENPUkVfSU5ERVggYW5kIHN0YXJ0IGRlc2NyaWJpbmcgaXRzIGZpZWxkcy4KKy8vLyBUaGlzIG11c3QgYmUgYXQgdGhlIGVuZCBvZiB0aGUgc3RydWN0dXJlIGRlZmluaXRpb24uCisjZGVmaW5lIERFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChuYW1lLCBmbGV4TWVtYmVyKSBcCisgICAgX0RFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVCggXAorICAgICAgICAgICAgbmFtZSwgZmxleE1lbWJlciwgREVGSU5FX0ZMRVhfQzJTVFJVQ1QsIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXykKKworLy8vIERlZmluZSBhIGZsZXhpYmxlIGJhc2Ugc3RydWN0dXJlICh3aXRoIG5vIENPUkVfSU5ERVgpIGFuZCBzdGFydCBkZXNjcmliaW5nIGl0cyBmaWVsZHMuCisvLy8gVGhpcyBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9uLgorI2RlZmluZSBERUZJTkVfQU5EX0RFU0NSSUJFX0JBU0VfRkxFWF9DMlNUUlVDVChuYW1lLCBmbGV4TWVtYmVyKSBcCisgICAgX0RFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVCggXAorICAgICAgICAgICAgbmFtZSwgZmxleE1lbWJlciwgREVGSU5FX0JBU0VfRkxFWF9DMlNUUlVDVCwgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKQorCisvLy8gXGlmIDAKKy8qCisgICBBbHRlcm5hdGUgZGVjbGFyYXRpb24gb2YgZmllbGQgZGVmaW5pdGlvbnMgaW4gY2FzZSBubyBmaWVsZCBsaXN0IGlzIHRvIGJlIGdlbmVyYXRlZC4KKyAgIFRoZSBzcGVjaWZpYyBtYWNybyBpcyBjaG9zZWQgYmFzZWQgb24gdGhlIHZhbHVlIG9mIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXyAod2hldGhlciBpdCBpcworICAgZGVmaW5lZCAodG8gYmUgZW1wdHkpIG9yIG5vdC4gVGhpcyByZXF1aXJlcyB0d28gbGV2ZWwgb2YgbWFjcm8gc3Vic3RpdHV0aW9uLgorICAgVFJJQ0tZOiB1c2UgbmFtZXNwYWNlIGRlY2xhcmF0aW9uIHRvIGhhbmRsZSBjbG9zaW5nIGJyYWNrZXQgdGhhdCBpcyBub3JtYWxseSBhZnRlcgorICAgdGhlc2UgbWFjcm9zLgorKi8KKworI2RlZmluZSBfREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChuYW1lLCBkZWZpbmVNYWNybywgZW5hYmxlZCkgXAorICAgIF9fREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChuYW1lLCBkZWZpbmVNYWNybywgZW5hYmxlZCkKKyNkZWZpbmUgX19ERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKG5hbWUsIGRlZmluZU1hY3JvLCBlbmFibGVkKSBcCisgICAgX19fREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVCMjZW5hYmxlZChuYW1lLCBkZWZpbmVNYWNybykKKyNkZWZpbmUgX19fREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXyhuYW1lLCBkZWZpbmVNYWNybykgXAorICAgIGRlZmluZU1hY3JvKG5hbWUpIH0gQzJfUEFDSzsgbmFtZXNwYWNlIHsKKyNkZWZpbmUgX19fREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChuYW1lLCBkZWZpbmVNYWNybykgXAorICAgIGRlZmluZU1hY3JvKG5hbWUpIH0gQzJfUEFDSzsgXAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMiMjbmFtZSMjU3RydWN0OjpGaWVsZExpc3QoKSB7IHJldHVybiBfRklFTERfTElTVDsgfSBcCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyIyNuYW1lIyNTdHJ1Y3Q6Ol9GSUVMRF9MSVNUID0geworCisjZGVmaW5lIF9ERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QobmFtZSwgZmxleE1lbWJlciwgZGVmaW5lTWFjcm8sIGVuYWJsZWQpIFwKKyAgICBfX0RFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChuYW1lLCBmbGV4TWVtYmVyLCBkZWZpbmVNYWNybywgZW5hYmxlZCkKKyNkZWZpbmUgX19ERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QobmFtZSwgZmxleE1lbWJlciwgZGVmaW5lTWFjcm8sIGVuYWJsZWQpIFwKKyAgICBfX19ERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QjI2VuYWJsZWQobmFtZSwgZmxleE1lbWJlciwgZGVmaW5lTWFjcm8pCisjZGVmaW5lIF9fX0RFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXyhuYW1lLCBmbGV4TWVtYmVyLCBkZWZpbmVNYWNybykgXAorICAgIGRlZmluZU1hY3JvKG5hbWUsIGZsZXhNZW1iZXIpIH0gQzJfUEFDSzsgbmFtZXNwYWNlIHsKKyNkZWZpbmUgX19fREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKG5hbWUsIGZsZXhNZW1iZXIsIGRlZmluZU1hY3JvKSBcCisgICAgZGVmaW5lTWFjcm8obmFtZSwgZmxleE1lbWJlcikgfSBDMl9QQUNLOyBcCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyIyNuYW1lIyNTdHJ1Y3Q6OkZpZWxkTGlzdCgpIHsgcmV0dXJuIF9GSUVMRF9MSVNUOyB9IFwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzIjI25hbWUjI1N0cnVjdDo6X0ZJRUxEX0xJU1QgPSB7CisvLy8gXGVuZGlmCisKKworLyoqCisgKiBQYXJhbWV0ZXIgcmVmbGVjdG9yIGNsYXNzLgorICoKKyAqIFRoaXMgY2xhc3MgY2VudHJhbGl6ZXMgdGhlIGRlc2NyaXB0aW9uIG9mIHBhcmFtZXRlciBzdHJ1Y3R1cmVzLiBUaGlzIGNhbiBiZSBzaGFyZWQKKyAqIGJ5IG11bHRpcGxlIGNvbXBvbmVudHMgYXMgZGVzY3JpYmluZyBhIHBhcmFtZXRlciBkb2VzIG5vdCBpbXBseSBzdXBwb3J0IG9mIHRoYXQKKyAqIHBhcmFtZXRlci4gSG93ZXZlciwgZWFjaCBzdXBwb3J0ZWQgcGFyYW1ldGVyIGFuZCBhbnkgZGVwZW5kZW50IHN0cnVjdHVyZXMgd2l0aGluCisgKiBtdXN0IGJlIGRlc2NyaWJlZCBieSB0aGUgcGFyYW1ldGVyIHJlZmxlY3RvciBwcm92aWRlZCBieSBhIGNvbXBvbmVudC4KKyAqLworY2xhc3MgQzJQYXJhbVJlZmxlY3RvciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogIERlc2NyaWJlcyBhIHBhcmFtZXRlciBzdHJ1Y3R1cmUuCisgICAgICoKKyAgICAgKiAgXHBhcmFtW2luXSBjb3JlSW5kZXggdGhlIGNvcmUgaW5kZXggb2YgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgY29udGFpbmluZyBhdCBsZWFzdCB0aGUKKyAgICAgKiAgY29yZSBpbmRleAorICAgICAqCisgICAgICogIFxyZXR1cm4gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlCisgICAgICogIFxyZXR2YWwgbnVsbHB0ciBpZiB0aGUgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyByZWZsZWN0b3IKKyAgICAgKgorICAgICAqICBUaGlzIG1ldGhvZHMgc2hhbGwgbm90IGJsb2NrIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkuCisgICAgICoKKyAgICAgKiAgXG5vdGUgdGhpcyBjbGFzcyBkb2VzIG5vdCB0YWtlIGEgc2V0IG9mIGluZGljZXMgYmVjYXVzZSB3ZSB3b3VsZCB0aGVuIHByZWZlcgorICAgICAqICB0byBhbHNvIHJldHVybiBhbnkgZGVwZW5kZW50IHN0cnVjdHVyZXMsIGFuZCB3ZSBkb24ndCB3YW50IHRoaXMgbG9naWMgdG8gYmUKKyAgICAgKiAgcmVwZWF0ZWQgaW4gZWFjaCByZWZsZWN0b3IuIEFsdGVybmF0ZWx5LCB0aGlzIGNvdWxkIGp1c3QgcmV0dXJuIGEgbWFwIG9mIGFsbAorICAgICAqICBkZXNjcmlwdGlvbnMsIGJ1dCB3ZSB3YW50IHRvIGNvbnNlcnZlIG1lbW9yeSBpZiBjbGllbnQgb25seSB3YW50cyB0aGUgZGVzY3JpcHRpb24KKyAgICAgKiAgb2YgYSBmZXcgaW5kaWNlcy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaWJlKEMyUGFyYW06OkNvcmVJbmRleCBjb3JlSW5kZXgpIGNvbnN0ID0gMDsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkMyUGFyYW1SZWZsZWN0b3IoKSA9IGRlZmF1bHQ7Cit9OworCisvKioKKyAqIEdlbmVyaWMgc3VwcG9ydGVkIHZhbHVlcyBmb3IgYSBmaWVsZC4KKyAqCisgKiBUaGlzIGNhbiBiZSBlaXRoZXIgYSByYW5nZSBvciBhIHNldCBvZiB2YWx1ZXMuIFRoZSByYW5nZSBjYW4gYmUgYSBzaW1wbGUgcmFuZ2UsIGFuIGFyaXRobWV0aWMsCisgKiBnZW9tZXRyaWMgb3IgbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMgd2l0aCBhIGNsZWFyIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWUuIFZhbHVlcyBjYW4KKyAqIGJlIGRpc2NyZXRlIHZhbHVlcywgb3IgY2FuIG9wdGlvbmFsbHkgcmVwcmVzZW50IGZsYWdzIHRvIGJlIG9yLWVkLgorICoKKyAqIFxub3RlIERvIG5vdCB1c2UgZmxhZ3MgdG8gcmVwcmVzZW50IGJpdGZpZWxkcy4gVXNlIGluZGl2aWR1YWwgdmFsdWVzIG9yIHNlcGFyYXRlIGZpZWxkcyBpbnN0ZWFkLgorICovCitzdHJ1Y3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyB7CisvL3B1YmxpYzoKKyAgICBlbnVtIHR5cGVfdCB7CisgICAgICAgIEVNUFRZLCAgICAgIC8vLzwgbm8gc3VwcG9ydGVkIHZhbHVlcworICAgICAgICBSQU5HRSwgICAgICAvLy88IGEgbnVtZXJpYyByYW5nZSB0aGF0IGNhbiBiZSBjb250aW51b3VzIG9yIGRpc2NyZXRlCisgICAgICAgIFZBTFVFUywgICAgIC8vLzwgYSBsaXN0IG9mIHZhbHVlcworICAgICAgICBGTEFHUyAgICAgICAvLy88IGEgbGlzdCBvZiBmbGFncyB0aGF0IGNhbiBiZSBPUi1lZAorICAgIH07CisKKyAgICB0eXBlX3QgdHlwZTsgLyoqIFR5cGUgb2YgdmFsdWVzIGZvciB0aGlzIGZpZWxkLiAqLworCisgICAgdHlwZWRlZiBDMlZhbHVlOjpQcmltaXRpdmUgUHJpbWl0aXZlOworCisgICAgLyoqCisgICAgICogUmFuZ2Ugc3BlY2lmaWVyIGZvciBzdXBwb3J0ZWQgdmFsdWUuIFVzZWQgaWYgdHlwZSBpcyBSQU5HRS4KKyAgICAgKgorICAgICAqIElmIHN0ZXAgaXMgMCBhbmQgbnVtIGFuZCBkZW5vbSBhcmUgYm90aCAxLCB0aGUgc3VwcG9ydGVkIHZhbHVlcyBhcmUgYW55IHZhbHVlLCBmb3Igd2hpY2gKKyAgICAgKiBtaW4gPD0gdmFsdWUgPD0gbWF4LgorICAgICAqCisgICAgICogT3RoZXJ3aXNlLCB0aGUgcmFuZ2UgcmVwcmVzZW50cyBhIGdlb21ldHJpYy9hcml0aG1ldGljL211bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzLCB3aGVyZQorICAgICAqIHN1Y2Nlc3NpdmUgc3VwcG9ydGVkIHZhbHVlcyBjYW4gYmUgZGVyaXZlZCBmcm9tIHByZXZpb3VzIHZhbHVlcyAoc3RhcnRpbmcgYXQgbWluKSwgdXNpbmcgdGhlCisgICAgICogZm9sbG93aW5nIGZvcm11bGE6CisgICAgICogIHZbMF0gPSBtaW4KKyAgICAgKiAgdltpXSA9IHZbaS0xXSAqIG51bSAvIGRlbm9tICsgc3RlcCBmb3IgaSA+PSAxLCB3aGlsZSBtaW4gPCB2W2ldIDw9IG1heC4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgeworICAgICAgICAvKiogTG93ZXIgZW5kIG9mIHRoZSByYW5nZSAoaW5jbHVzaXZlKS4gKi8KKyAgICAgICAgUHJpbWl0aXZlIG1pbjsKKyAgICAgICAgLyoqIFVwcGVyIGVuZCBvZiB0aGUgcmFuZ2UgKGluY2x1c2l2ZSBpZiBwZXJtaXR0ZWQgYnkgc2VyaWVzKS4gKi8KKyAgICAgICAgUHJpbWl0aXZlIG1heDsKKyAgICAgICAgLyoqIFN0ZXAgYmV0d2VlbiBzdXBwb3J0ZWQgdmFsdWVzLiAqLworICAgICAgICBQcmltaXRpdmUgc3RlcDsKKyAgICAgICAgLyoqIE51bWVyYXRvciBvZiBhIGdlb21ldHJpYyBzZXJpZXMuICovCisgICAgICAgIFByaW1pdGl2ZSBudW07CisgICAgICAgIC8qKiBEZW5vbWluYXRvciBvZiBhIGdlb21ldHJpYyBzZXJpZXMuICovCisgICAgICAgIFByaW1pdGl2ZSBkZW5vbTsKKyAgICB9IHJhbmdlOworCisgICAgLyoqCisgICAgICogTGlzdCBvZiB2YWx1ZXMuIFVzZWQgaWYgdHlwZSBpcyBWQUxVRVMgb3IgRkxBR1MuCisgICAgICoKKyAgICAgKiBJZiB0eXBlIGlzIFZBTFVFUywgdGhpcyBpcyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgdmFsdWVzIGluIGRlY3JlYXNpbmcgcHJlZmVyZW5jZS4KKyAgICAgKgorICAgICAqIElmIHR5cGUgaXMgRkxBR1MsIHRoaXMgdmVjdG9yIGNvbnRhaW5zIHsgbWluLW1hc2ssIGZsYWcxLCBmbGFnMi4uLiB9LiBCYXNpY2FsbHksIHRoZSBmaXJzdAorICAgICAqIHZhbHVlIGlzIHRoZSByZXF1aXJlZCBzZXQgb2YgZmxhZ3MgdG8gYmUgc2V0LCBhbmQgdGhlIHJlc3Qgb2YgdGhlIHZhbHVlcyBhcmUgZmxhZ3MgdGhhdCBjYW4KKyAgICAgKiBiZSBzZXQgaW5kZXBlbmRlbnRseS4gRkxBR1MgaXMgb25seSBzdXBwb3J0ZWQgZm9yIGludGVncmFsIHR5cGVzLiBTdXBwb3J0ZWQgZmxhZ3Mgc2hvdWxkCisgICAgICogbm90IG92ZXJsYXAsIGFzIGl0IGNhbiBtYWtlIHZhbGlkYXRpb24gbm9uLWRldGVybWluaXN0aWMuIFRoZSBzdGFuZGFyZCB2YWxpZGF0aW9uIG1ldGhvZAorICAgICAqIGlzIHRoYXQgc3RhcnRpbmcgZnJvbSB0aGUgb3JpZ2luYWwgdmFsdWUsIGlmIGVhY2ggZmxhZyBpcyByZW1vdmVkIHdoZW4gZnVsbHkgcHJlc2VudCAodGhlCisgICAgICogbWluLW1hc2sgbXVzdCBiZSBmdWxseSBwcmVzZW50KSwgd2Ugc2hhbGwgYXJyaXZlIGF0IDAuCisgICAgICovCisgICAgc3RkOjp2ZWN0b3I8UHJpbWl0aXZlPiB2YWx1ZXM7CisKKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKCkKKyAgICAgICAgOiB0eXBlKEVNUFRZKSB7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKFQgbWluLCBUIG1heCwgVCBzdGVwID0gVChzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZSA/IDAgOiAxKSkKKyAgICAgICAgOiB0eXBlKFJBTkdFKSwKKyAgICAgICAgICByYW5nZXttaW4sIG1heCwgc3RlcCwgKFQpMSwgKFQpMX0geyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoVCBtaW4sIFQgbWF4LCBUIG51bSwgVCBkZW4pIDoKKyAgICAgICAgdHlwZShSQU5HRSksCisgICAgICAgIHJhbmdle21pbiwgbWF4LCAoVCkwLCBudW0sIGRlbn0geyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoVCBtaW4sIFQgbWF4LCBUIHN0ZXAsIFQgbnVtLCBUIGRlbikKKyAgICAgICAgOiB0eXBlKFJBTkdFKSwKKyAgICAgICAgICByYW5nZXttaW4sIG1heCwgc3RlcCwgbnVtLCBkZW59IHsgfQorCisgICAgLy8vIFxkZXByZWNhdGVkCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKGJvb2wgZmxhZ3MsIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiBsaXN0KQorICAgICAgICA6IHR5cGUoZmxhZ3MgPyBGTEFHUyA6IFZBTFVFUyksCisgICAgICAgICAgcmFuZ2V7KFQpMCwgKFQpMCwgKFQpMCwgKFQpMCwgKFQpMH0geworICAgICAgICBmb3IgKFQgdmFsdWUgOiBsaXN0KSB7CisgICAgICAgICAgICB2YWx1ZXMuZW1wbGFjZV9iYWNrKHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBcZGVwcmVjYXRlZAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhib29sIGZsYWdzLCBjb25zdCBzdGQ6OnZlY3RvcjxUPiYgbGlzdCkKKyAgICAgICAgOiB0eXBlKGZsYWdzID8gRkxBR1MgOiBWQUxVRVMpLAorICAgICAgICAgIHJhbmdleyhUKTAsIChUKTAsIChUKTAsIChUKTAsIChUKTB9IHsKKyAgICAgICAgZm9yKFQgdmFsdWUgOiBsaXN0KSB7CisgICAgICAgICAgICB2YWx1ZXMuZW1wbGFjZV9iYWNrKHZhbHVlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBcaW50ZXJuYWwKKyAgICAvLy8gXHRvZG86IGNyZWF0ZSBzZXBhcmF0ZSB2YWx1ZXMgdnMuIGZsYWdzIGluaXRpYWxpemVyIGFzIGZvciBmbGFncyB3ZSB3YW50CisgICAgLy8vIHRvIGxpc3QgYm90aCBhbGxvd2VkIGFuZCByZXF1aXJlZCBmbGFncworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XbnVsbC1kZXJlZmVyZW5jZSIKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBFPWRlY2x0eXBlKEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0ZvcigqKFQqKW51bGxwdHIpKT4KKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKGJvb2wgZmxhZ3MsIGNvbnN0IFQqKQorICAgICAgICA6IHR5cGUoZmxhZ3MgPyBGTEFHUyA6IFZBTFVFUyksCisgICAgICAgICAgcmFuZ2V7KFQpMCwgKFQpMCwgKFQpMCwgKFQpMCwgKFQpMH0geworICAgICAgICAgICAgICBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIG5hbWVkID0gQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkVmFsdWVzRm9yKCooVCopbnVsbHB0cik7CisgICAgICAgIGlmIChmbGFncykgeworICAgICAgICAgICAgdmFsdWVzLmVtcGxhY2VfYmFjaygwKTsgLy8gbWluLW1hc2sgZGVmYXVsdHMgdG8gMAorICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVUeXBlICZpdGVtIDogbmFtZWQpeworICAgICAgICAgICAgdmFsdWVzLmVtcGxhY2VfYmFjayhpdGVtLnNlY29uZCk7CisgICAgICAgIH0KKyAgICB9Cit9OworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwb3AKKworLyoqCisgKiBTdXBwb3J0ZWQgdmFsdWVzIGZvciBhIHNwZWNpZmljIGZpZWxkLgorICoKKyAqIFRoaXMgaXMgYSBwYWlyIG9mIHRoZSBmaWVsZCBzcGVjaWZpZXIgdG9nZXRoZXIgd2l0aCBhbiBvcHRpb25hbCBzdXBwb3J0ZWQgdmFsdWVzIG9iamVjdC4KKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgd2hlbiByZXBvcnRpbmcgcGFyYW1ldGVyIGNvbmZpZ3VyYXRpb24gZmFpbHVyZXMgYW5kIGNvbmZsaWN0cy4KKyAqLworc3RydWN0IEMyUGFyYW1GaWVsZFZhbHVlcyB7CisgICAgQzJQYXJhbUZpZWxkIHBhcmFtT3JGaWVsZDsgLy8vPCB0aGUgZmllbGQgb3IgcGFyYW1ldGVyCisgICAgLy8vIG9wdGlvbmFsIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIHRoZSBmaWVsZCBpZiBwYXJhbU9yRmllbGQgc3BlY2lmaWVzIGFuIGFjdHVhbCBmaWVsZCB0aGF0IGlzCisgICAgLy8vIG51bWVyaWMgKG5vbiBzdHJ1Y3QsIGJsb2Igb3Igc3RyaW5nKS4gU3VwcG9ydGVkIHZhbHVlcyBmb3IgYXJyYXlzIChpbmNsdWRpbmcgc3RyaW5nIGFuZAorICAgIC8vLyBibG9icykgZGVzY3JpYmUgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIGVhY2ggZWxlbWVudCAoY2hhcmFjdGVyIGZvciBzdHJpbmcsIGFuZCBieXRlcyBmb3IKKyAgICAvLy8gYmxvYnMpLiBJdCBpcyBvcHRpb25hbCBmb3IgcmVhZC1vbmx5IHN0cmluZ3MgYW5kIGJsb2JzLgorICAgIHN0ZDo6dW5pcXVlX3B0cjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPiB2YWx1ZXM7CisKKyAgICAvLyBUaGlzIHN0cnVjdCBpcyBtZWFudCB0byBiZSBtb3ZlIGNvbnN0cnVjdGVkLgorICAgIEMyX0RFRkFVTFRfTU9WRShDMlBhcmFtRmllbGRWYWx1ZXMpOworCisgICAgLy8gQ29weSBjb25zdHJ1Y3Rvci9hc3NpZ25tZW50IGlzIGFsc28gcHJvdmlkZWQgYXMgdGhpcyBvYmplY3QgbWF5IGdldCBjb3BpZWQuCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzKGNvbnN0IEMyUGFyYW1GaWVsZFZhbHVlcyAmb3RoZXIpCisgICAgICAgIDogcGFyYW1PckZpZWxkKG90aGVyLnBhcmFtT3JGaWVsZCksCisgICAgICAgICAgdmFsdWVzKG90aGVyLnZhbHVlcyA/IHN0ZDo6bWFrZV91bmlxdWU8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4oKm90aGVyLnZhbHVlcykgOiBudWxscHRyKSB7IH0KKworICAgIEMyUGFyYW1GaWVsZFZhbHVlcyYgb3BlcmF0b3I9KGNvbnN0IEMyUGFyYW1GaWVsZFZhbHVlcyAmb3RoZXIpIHsKKyAgICAgICAgcGFyYW1PckZpZWxkID0gb3RoZXIucGFyYW1PckZpZWxkOworICAgICAgICB2YWx1ZXMgPSBvdGhlci52YWx1ZXMgPyBzdGQ6Om1ha2VfdW5pcXVlPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+KCpvdGhlci52YWx1ZXMpIDogbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IHdpdGggbm8gdmFsdWVzLgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlcyhjb25zdCBDMlBhcmFtRmllbGQgJnBhcmFtT3JGaWVsZF8pCisgICAgICAgIDogcGFyYW1PckZpZWxkKHBhcmFtT3JGaWVsZF8pIHsgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IHdpdGggdmFsdWVzLgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlcyhjb25zdCBDMlBhcmFtRmllbGQgJnBhcmFtT3JGaWVsZF8sIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbHVlc18pCisgICAgICAgIDogcGFyYW1PckZpZWxkKHBhcmFtT3JGaWVsZF8pLAorICAgICAgICAgIHZhbHVlcyhzdGQ6Om1ha2VfdW5pcXVlPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+KHZhbHVlc18pKSB7IH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBmcm9tIGZpZWxkcy4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXMoY29uc3QgQzJQYXJhbUZpZWxkICZwYXJhbU9yRmllbGRfLCBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gJiZ2YWx1ZXNfKQorICAgICAgICA6IHBhcmFtT3JGaWVsZChwYXJhbU9yRmllbGRfKSwKKyAgICAgICAgICB2YWx1ZXMoc3RkOjptb3ZlKHZhbHVlc18pKSB7IH0KK307CisKKy8vLyBAfQorCisvLyBpbmNsdWRlIGRlYnVnIGhlYWRlciBmb3IgQzJQYXJhbXMuaCBpZiBDMkRlYnVnLmggd2FzIGFscmVhZHkgaW5jbHVkZWQKKyNpZmRlZiBDMlVUSUxTX0RFQlVHX0hfCisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLXBhcmFtLmg+CisjZW5kaWYKKworI2VuZGlmICAvLyBDMlBBUkFNX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyUGFyYW1EZWYuaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJQYXJhbURlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMzMyODMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyUGFyYW1EZWYuaApAQCAtMCwwICsxLDkzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKiBcZmlsZQorICogVGVtcGxhdGVzIHVzZWQgdG8gZGVjbGFyZSBwYXJhbWV0ZXJzLgorICovCisjaWZuZGVmIEMyUEFSQU1fREVGX0hfCisjZGVmaW5lIEMyUEFSQU1fREVGX0hfCisKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworI2luY2x1ZGUgPEMyUGFyYW0uaD4KKworLy8vIFxhZGR0b2dyb3VwIFBhcmFtZXRlcnMKKy8vLyBAeworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT0gVVRJTElUWSBURU1QTEFURVMgRk9SIFBBUkFNRVRFUiBERUZJTklUSU9OUyA9PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLy8vIFxhZGR0b2dyb3VwIGludGVybmFsCisvLy8gQHsKKworLy8vIEhlbHBlciBjbGFzcyB0aGF0IGNoZWNrcyBpZiBhIHR5cGUgaGFzIGVxdWFsaXR5IGFuZCBpbmVxdWFsaXR5IG9wZXJhdG9ycy4KK3N0cnVjdCBDMl9ISURFIF9DMkNvbXBhcmFibGVfaW1wbAoreworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFMsIHR5cGVuYW1lPWRlY2x0eXBlKFMoKSA9PSBTKCkpPgorICAgIHN0YXRpYyBzdGQ6OnRydWVfdHlwZSBUZXN0RXF1YWwoaW50KTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdGF0aWMgc3RkOjpmYWxzZV90eXBlIFRlc3RFcXVhbCguLi4pOworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUywgdHlwZW5hbWU9ZGVjbHR5cGUoUygpICE9IFMoKSk+CisgICAgc3RhdGljIHN0ZDo6dHJ1ZV90eXBlIFRlc3ROb3RFcXVhbChpbnQpOworICAgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0YXRpYyBzdGQ6OmZhbHNlX3R5cGUgVGVzdE5vdEVxdWFsKC4uLik7Cit9OworCisvKioKKyAqIEhlbHBlciB0ZW1wbGF0ZSB0aGF0IHJldHVybnMgaWYgYSB0eXBlIGhhcyBlcXVhbGl0eSBhbmQgaW5lcXVhbGl0eSBvcGVyYXRvcnMuCisgKgorICogVXNlIGFzIF9DMkNvbXBhcmFibGU8dHlwZW5hbWUgUz46OnZhbHVlLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTPgorc3RydWN0IEMyX0hJREUgX0MyQ29tcGFyYWJsZQorICAgIDogcHVibGljIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgZGVjbHR5cGUoX0MyQ29tcGFyYWJsZV9pbXBsOjpUZXN0RXF1YWw8Uz4oMCkpOjp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgZGVjbHR5cGUoX0MyQ29tcGFyYWJsZV9pbXBsOjpUZXN0Tm90RXF1YWw8Uz4oMCkpOjp2YWx1ZT4geworfTsKKworLy8vICBIZWxwZXIgY2xhc3MgdGhhdCBjaGVja3MgaWYgYSB0eXBlIGhhcyBhIENPUkVfSU5ERVggY29uc3RhbnQuCitzdHJ1Y3QgQzJfSElERSBfQzJDb3JlSW5kZXhIZWxwZXJfaW1wbAoreworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFMsIGludD1TOjpDT1JFX0lOREVYPgorICAgIHN0YXRpYyBzdGQ6OnRydWVfdHlwZSBUZXN0Q29yZUluZGV4KGludCk7CisgICAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RhdGljIHN0ZDo6ZmFsc2VfdHlwZSBUZXN0Q29yZUluZGV4KC4uLik7Cit9OworCisvLy8gTWFjcm8gdGhhdCBkZWZpbmVzIGFuZCB0aHVzIG92ZXJyaWRlcyBhIHR5cGUncyBDT1JFX0lOREVYIGZvciBhIHNldHRpbmcKKyNkZWZpbmUgX0MyX0NPUkVfSU5ERVhfT1ZFUlJJREUoY29yZUluZGV4KSBcCitwdWJsaWM6IFwKKyAgICBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0gY29yZUluZGV4IH07CisKKworLy8vIEhlbHBlciB0ZW1wbGF0ZSB0aGF0IGFkZHMgYSBDT1JFX0lOREVYIHRvIGEgdHlwZSBpZiBpdCBkb2VzIG5vdCBoYXZlIG9uZSAoZm9yIHRlc3RpbmcpCit0ZW1wbGF0ZTx0eXBlbmFtZSBTLCBpbnQgQ29yZUluZGV4Pgorc3RydWN0IEMyX0hJREUgX0MyQWRkQ29yZUluZGV4IDogcHVibGljIFMgeworICAgIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKENvcmVJbmRleCkKK307CisKKy8qKgorICogXGJyaWVmIEhlbHBlciBjbGFzcyB0byBjaGVjayBzdHJ1Y3QgcmVxdWlyZW1lbnRzIGZvciBwYXJhbWV0ZXJzLgorICoKKyAqIEZlYXR1cmVzOgorICogIC0gdmVyaWZ5IGRlZmF1bHQgY29uc3RydWN0b3IsIG5vIHZpcnR1YWwgbWV0aG9kcywgYW5kIG5vIGVxdWFsaXR5IG9wZXJhdG9ycy4KKyAqICAtIGV4cG9zZSBQQVJBTV9UWVBFLCBhbmQgbm9uLWZsZXggRkxFWF9TSVpFLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTLCBpbnQgQ29yZUluZGV4LCB1bnNpZ25lZCBUeXBlRmxhZ3M+CitzdHJ1Y3QgQzJfSElERSBfQzJTdHJ1Y3RDaGVjayB7CisgICAgc3RhdGljX2Fzc2VydCgKKyAgICAgICAgICAgIHN0ZDo6aXNfZGVmYXVsdF9jb25zdHJ1Y3RpYmxlPFM+Ojp2YWx1ZSwgIkMyIHN0cnVjdHVyZSBtdXN0IGhhdmUgZGVmYXVsdCBjb25zdHJ1Y3RvciIpOworICAgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfcG9seW1vcnBoaWM8Uz46OnZhbHVlLCAiQzIgc3RydWN0dXJlIG11c3Qgbm90IGhhdmUgdmlydHVhbCBtZXRob2RzIik7CisgICAgc3RhdGljX2Fzc2VydCghX0MyQ29tcGFyYWJsZTxTPjo6dmFsdWUsICJDMiBzdHJ1Y3R1cmUgbXVzdCBub3QgaGF2ZSBvcGVyYXRvcj09IG9yICE9Iik7CisKK3B1YmxpYzoKKyAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICBQQVJBTV9UWVBFID0gQ29yZUluZGV4IHwgVHlwZUZsYWdzCisgICAgfTsKKworcHJvdGVjdGVkOgorICAgIGVudW0gOiB1aW50MzJfdCB7CisgICAgICAgIEZMRVhfU0laRSA9IDAsCisgICAgfTsKK307CisKKy8vLyBIZWxwZXIgY2xhc3MgdGhhdCBjaGVja3MgaWYgYSB0eXBlIGhhcyBhbiBpbnRlZ2VyIEZMRVhfU0laRSBtZW1iZXIuCitzdHJ1Y3QgQzJfSElERSBfQzJGbGV4aWJsZV9pbXBsIHsKKyAgICAvLy8gc3BlY2lhbGl6YXRpb24gZm9yIHR5cGVzIHRoYXQgaGF2ZSBhIEZMRVhfU0laRSBtZW1iZXIKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTLCB1bnNpZ25lZD1TOjpGTEVYX1NJWkU+CisgICAgc3RhdGljIHN0ZDo6dHJ1ZV90eXBlIFRlc3RGbGV4U2l6ZShpbnQpOworICAgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0YXRpYyBzdGQ6OmZhbHNlX3R5cGUgVGVzdEZsZXhTaXplKC4uLik7Cit9OworCisvLy8gSGVscGVyIHRlbXBsYXRlIHRoYXQgcmV0dXJucyBpZiBhIHR5cGUgaGFzIGFuIGludGVnZXIgRkxFWF9TSVpFIG1lbWJlci4KK3RlbXBsYXRlPHR5cGVuYW1lIFM+CitzdHJ1Y3QgQzJfSElERSBfQzJGbGV4aWJsZQorICAgIDogcHVibGljIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgZGVjbHR5cGUoX0MyRmxleGlibGVfaW1wbDo6VGVzdEZsZXhTaXplPFM+KDApKTo6dmFsdWU+IHsKK307CisKKy8vLyBNYWNybyB0byB0ZXN0IGlmIGEgdHlwZSBpcyBmbGV4aWJsZSAoaGFzIGEgRkxFWF9TSVpFIG1lbWJlcikuCisjZGVmaW5lIElGX0ZMRVhJQkxFKFMpIEVOQUJMRV9JRihfQzJGbGV4aWJsZTxTPjo6dmFsdWUpCisvLy8gU2hvcnRoYW5kIGZvciBzdGQ6OmVuYWJsZV9pZgorI2RlZmluZSBFTkFCTEVfSUYoY29uZCkgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8Y29uZD46OnR5cGUKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVj12b2lkPgorc3RydWN0IEMyX0hJREUgX2MyX2VuYWJsZV9pZl90eXBlIHsKKyAgICB0eXBlZGVmIFYgdHlwZTsKK307CisKKy8vLyBIZWxwZXIgdGVtcGxhdGUgdGhhdCBleHBvc2VzIHRoZSBmbGV4aWJsZSBzdWJ0eXBlIG9mIGEgc3RydWN0LgordGVtcGxhdGU8dHlwZW5hbWUgUywgdHlwZW5hbWUgRT12b2lkPgorc3RydWN0IEMyX0hJREUgX0MyRmxleEhlbHBlciB7CisgICAgdHlwZWRlZiB2b2lkIEZsZXhUeXBlOworICAgIGVudW0gOiB1aW50MzJfdCB7IEZMRVhfU0laRSA9IDAgfTsKK307CisKKy8vLyBTcGVjaWFsaXphdGlvbiBmb3IgZmxleGlibGUgdHlwZXMuIFRoaXMgb25seSB3b3JrcyBpZiBfRmxleE1lbWJlclR5cGUgaXMgcHVibGljLgordGVtcGxhdGU8dHlwZW5hbWUgUz4KK3N0cnVjdCBDMl9ISURFIF9DMkZsZXhIZWxwZXI8UywKKyAgICAgICAgdHlwZW5hbWUgX2MyX2VuYWJsZV9pZl90eXBlPHR5cGVuYW1lIFM6Ol9GbGV4TWVtYmVyVHlwZT46OnR5cGU+IHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9DMkZsZXhIZWxwZXI8dHlwZW5hbWUgUzo6X0ZsZXhNZW1iZXJUeXBlPjo6RmxleFR5cGUgRmxleFR5cGU7CisgICAgZW51bSA6IHVpbnQzMl90IHsgRkxFWF9TSVpFID0gX0MyRmxleEhlbHBlcjx0eXBlbmFtZSBTOjpfRmxleE1lbWJlclR5cGU+OjpGTEVYX1NJWkUgfTsKK307CisKKy8vLyBTcGVjaWFsaXphdGlvbiBmb3IgZmxleCBhcnJheXMuCit0ZW1wbGF0ZTx0eXBlbmFtZSBTPgorc3RydWN0IEMyX0hJREUgX0MyRmxleEhlbHBlcjxTW10sCisgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfdm9pZDx0eXBlbmFtZSBfQzJGbGV4SGVscGVyPFM+OjpGbGV4VHlwZT46OnZhbHVlPjo6dHlwZT4geworICAgIHR5cGVkZWYgUyBGbGV4VHlwZTsKKyAgICBlbnVtIDogdWludDMyX3QgeyBGTEVYX1NJWkUgPSBzaXplb2YoUykgfTsKK307CisKKy8qKgorICogXGJyaWVmIEhlbHBlciBjbGFzcyB0byBjaGVjayBmbGV4aWJsZSBzdHJ1Y3QgcmVxdWlyZW1lbnRzIGFuZCBhZGQgY29tbW9uIG9wZXJhdGlvbnMuCisgKgorICogRmVhdHVyZXM6CisgKiAgLSBleHBvc2UgQ09SRV9JTkRFWCBhbmQgRmllbGRMaXN0ICh0aGlzIGlzIG5vcm1hbGx5IGluaGVyaXRlZCBmcm9tIHRoZSBzdHJ1Y3QsIGJ1dCBmbGV4aWJsZQorICogICAgc3RydWN0cyBjYW5ub3QgYmUgYmFzZSBjbGFzc2VzIGFuZCB0aHVzIGluaGVyaXRlZCBmcm9tKQorICogIC0gZGlzYWJsZSBjb3B5IGFzc2lnbm1lbnQgYW5kIGNvbnN0cnVjdGlvbiAoVE9ETzogdGhpcyBpcyBhbHJlYWR5IGRvbmUgaW4gdGhlIEZMRVggbWFjcm8gZm9yIHRoZQorICogICAgZmxleGlibGUgc3RydWN0LCBzbyBtYXkgbm90IGJlIG5lZWRlZCBoZXJlKQorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBTLCBpbnQgUGFyYW1JbmRleCwgdW5zaWduZWQgVHlwZUZsYWdzPgorc3RydWN0IEMyX0hJREUgX0MyRmxleFN0cnVjdENoZWNrIDoKKy8vIGFkZCBmbGV4aWJsZSBmbGFnIGFzIF9DMlN0cnVjdENoZWNrIGRlZmluZXMgUEFSQU1fVFlQRQorICAgICAgICBwdWJsaWMgX0MyU3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfRkxFWF9GTEFHLCBUeXBlRmxhZ3M+IHsKK3B1YmxpYzoKKyAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICAvLy8gXGhpZGVpbml0aWFsaXplcgorICAgICAgICBDT1JFX0lOREVYID0gUGFyYW1JbmRleCB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfRkxFWF9GTEFHLCAvLy88IGZsZXhpYmxlIHN0cnVjdCBjb3JlLWluZGV4CisgICAgfTsKKworICAgIGlubGluZSBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpIHsgcmV0dXJuIFM6OkZpZWxkTGlzdCgpOyB9CisKKyAgICAvLyBkZWZhdWx0IGNvbnN0cnVjdG9yIG5lZWRlZCBiZWNhdXNlIG9mIHRoZSBkaXNhYmxlZCBjb3B5IGNvbnN0cnVjdG9yCisgICAgaW5saW5lIF9DMkZsZXhTdHJ1Y3RDaGVjaygpID0gZGVmYXVsdDsKKworcHJvdGVjdGVkOgorICAgIC8vIGNhbm5vdCBjb3B5IGZsZXhpYmxlIHBhcmFtcworICAgIF9DMkZsZXhTdHJ1Y3RDaGVjayhjb25zdCBfQzJGbGV4U3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVHlwZUZsYWdzPiAmKSA9IGRlbGV0ZTsKKyAgICBfQzJGbGV4U3RydWN0Q2hlY2smIG9wZXJhdG9yPSAoY29uc3QgX0MyRmxleFN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsIFR5cGVGbGFncz4gJikgPSBkZWxldGU7CisKKyAgICAvLyBjb25zdGFudHMgdXNlZCBmb3IgaGVscGVyIG1ldGhvZHMKKyAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICAvLy8gXGhpZGVpbml0aWFsaXplcgorICAgICAgICBGTEVYX1NJWkUgPSBfQzJGbGV4SGVscGVyPFM+OjpGTEVYX1NJWkUsIC8vLzwgc2l6ZSBvZiBmbGV4aWJsZSB0eXBlCisgICAgICAgIC8vLyBcaGlkZWluaXRpYWxpemVyCisgICAgICAgIE1BWF9TSVpFID0gKHVpbnQzMl90KXN0ZDo6bWluKChzaXplX3QpVUlOVDMyX01BWCwgU0laRV9NQVgpLCAvLyBUT0RPOiBpcyB0aGlzIGFsd2F5cyB1MzIgbWF4PworICAgICAgICAvLy8gXGhpZGVpbml0aWFsaXplcgorICAgICAgICBCQVNFX1NJWkUgPSBzaXplb2YoUykgKyBzaXplb2YoQzJQYXJhbSksIC8vLzwgc2l6ZSBvZiB0aGUgYmFzZSBwYXJhbQorICAgIH07CisKKyAgICAvLy8gcmV0dXJucyB0aGUgYWxsb2NhdGVkIHNpemUgb2YgdGhpcyBwYXJhbSB3aXRoIGZsZXhDb3VudCwgb3IgMCBpZiBpdCB3b3VsZCBvdmVyZmxvdy4KKyAgICBpbmxpbmUgc3RhdGljIHNpemVfdCBDYWxjU2l6ZShzaXplX3QgZmxleENvdW50LCBzaXplX3Qgc2l6ZSA9IEJBU0VfU0laRSkgeworICAgICAgICBpZiAoZmxleENvdW50IDw9IChNQVhfU0laRSAtIHNpemUpIC8gUzo6RkxFWF9TSVpFKSB7CisgICAgICAgICAgICByZXR1cm4gc2l6ZSArIFM6OkZMRVhfU0laRSAqIGZsZXhDb3VudDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLy8gZHluYW1pYyBuZXcgb3BlcmF0b3IgdXNhYmxlIGZvciBwYXJhbXMgb2YgdHlwZSBTCisgICAgaW5saW5lIHZvaWQqIG9wZXJhdG9yIG5ldyhzaXplX3Qgc2l6ZSwgc2l6ZV90IGZsZXhDb3VudCkgbm9leGNlcHQgeworICAgICAgICAvLyBUT0RPOiBhc3NlcnQoc2l6ZSA9PSBCQVNFX1NJWkUpOworICAgICAgICBzaXplID0gQ2FsY1NpemUoZmxleENvdW50LCBzaXplKTsKKyAgICAgICAgaWYgKHNpemUgPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gOjpvcGVyYXRvciBuZXcoc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorfTsKKworLy8vIERlZmluZSBGcm9tKCkgY2FzdCBvcGVyYXRvcnMgZm9yIHBhcmFtcy4KKyNkZWZpbmUgREVGSU5FX0NBU1RfT1BFUkFUT1JTKF9UeXBlKSBcCisgICAgaW5saW5lIHN0YXRpYyBfVHlwZSogRnJvbShDMlBhcmFtICpvdGhlcikgeyBcCisgICAgICAgIHJldHVybiAoX1R5cGUqKUMyUGFyYW06OklmU3VpdGFibGUoIFwKKyAgICAgICAgICAgICAgICBvdGhlciwgc2l6ZW9mKF9UeXBlKSwgX1R5cGU6OlBBUkFNX1RZUEUsIF9UeXBlOjpGTEVYX1NJWkUsIFwKKyAgICAgICAgICAgICAgICAoX1R5cGU6OlBBUkFNX1RZUEUgJiBUOjpJbmRleDo6RElSX1VOREVGSU5FRCkgIT0gVDo6SW5kZXg6OkRJUl9VTkRFRklORUQpOyBcCisgICAgfSBcCisgICAgaW5saW5lIHN0YXRpYyBjb25zdCBfVHlwZSogRnJvbShjb25zdCBDMlBhcmFtICpvdGhlcikgeyBcCisgICAgICAgIHJldHVybiBjb25zdF9jYXN0PGNvbnN0IF9UeXBlKj4oRnJvbShjb25zdF9jYXN0PEMyUGFyYW0gKj4ob3RoZXIpKSk7IFwKKyAgICB9IFwKKyAgICBpbmxpbmUgc3RhdGljIF9UeXBlKiBGcm9tKHN0ZDo6bnVsbHB0cl90KSB7IHJldHVybiBudWxscHRyOyB9IFwKKworLyoqCisgKiBEZWZpbmUgZmxleGlibGUgYWxsb2NhdG9ycyAoQWxsb2NTaGFyZWQgb3IgQWxsb2NVbmlxdWUpIGZvciBmbGV4aWJsZSBwYXJhbXMuCisgKiAgLSBQOjpBbGxvY1h5eihmbGV4Q291bnQsIGFyZ3MuLi4pOiBhbGxvY2F0ZSBmb3IgZ2l2ZW4gZmxleC1jb3VudC4gVGhpcyBtYXBzIHRvCisgKiAgICAgICAgICBUKGZsZXhDb3VudCwgYXJncy4uLilcCisgKgorICogQ2xhbmcgZG9lcyBub3Qgc3VwcG9ydCBhcmdzLi4uIGZvbGxvd2VkIGJ5IHRlbXBsYXRlZCBwYXJhbSBhcyBhcmdzLi4uIGVhdHMgaXQuIEhlbmNlLAorICogcHJvdmlkZSBzcGVjaWFsaXphdGlvbnMgd2hlcmUgdGhlIGluaXRpYWxpemVyIHJlcGxhY2VzIHRoZSBmbGV4Q291bnQuCisgKgorICogU3BlY2lhbGl6YXRpb25zIHRoYXQgZGVkdWNlIGZsZXhDb3VudDoKKyAqICAtIFA6OkFsbG9jWHl6KFRbXSwgYXJncy4uLik6IGFsbG9jYXRlIGZvciBzaXplIG9mIChhbmQgd2l0aCkgaW5pdCBhcnJheS4KKyAqICAtIFA6OkFsbG9jWHl6KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiwgYXJncy4uLik6IGFsbG9jYXRlIGZvciBzaXplIG9mIChhbmQgd2l0aCkgaW5pdGlhbGl6ZXIKKyAqICAgICAgICAgICAgbGlzdC4KKyAqICAtIFA6OkFsbG9jWHl6KHN0ZDo6dmVjdG9yPFQ+LCBhcmdzLi4uKTogYWxsb2NhdGUgZm9yIHNpemUgb2YgKGFuZCB3aXRoKSBpbml0IHZlY3Rvci4KKyAqICBUaGVzZSBzcGVjaWFsaXphdGlvbnMgbWFwIHRvIFQoZmxleENvdW50ID0gc2l6ZS1vZi1pbml0LCBhcmdzLi4uLCBpbml0KQorICovCisjZGVmaW5lIERFRklORV9GTEVYSUJMRV9BTExPQyhfVHlwZSwgUywgcHRyLCBQdHIpIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPiBcCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnB0ciMjX3B0cjxfVHlwZT4gQWxsb2MjI1B0cihzaXplX3QgZmxleENvdW50LCBjb25zdCBBcmdzKCYuLi4gYXJncykpIHsgXAorICAgICAgICByZXR1cm4gc3RkOjpwdHIjI19wdHI8X1R5cGU+KG5ldyhmbGV4Q291bnQpIF9UeXBlKGZsZXhDb3VudCwgYXJncy4uLikpOyBcCisgICAgfSBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncywgdHlwZW5hbWUgVT10eXBlbmFtZSBTOjpGbGV4VHlwZT4gXAorICAgIGlubGluZSBzdGF0aWMgc3RkOjpwdHIjI19wdHI8X1R5cGU+IEFsbG9jIyNQdHIoIFwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxVPiAmaW5pdCwgY29uc3QgQXJncygmLi4uIGFyZ3MpKSB7IFwKKyAgICAgICAgcmV0dXJuIHN0ZDo6cHRyIyNfcHRyPF9UeXBlPihuZXcoaW5pdC5zaXplKCkpIF9UeXBlKGluaXQuc2l6ZSgpLCBhcmdzLi4uLCBpbml0KSk7IFwKKyAgICB9IFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzLCB0eXBlbmFtZSBVPXR5cGVuYW1lIFM6OkZsZXhUeXBlPiBcCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnB0ciMjX3B0cjxfVHlwZT4gQWxsb2MjI1B0ciggXAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VT4gJmluaXQsIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgeyBcCisgICAgICAgIHJldHVybiBzdGQ6OnB0ciMjX3B0cjxfVHlwZT4obmV3KGluaXQuc2l6ZSgpKSBfVHlwZShpbml0LnNpemUoKSwgYXJncy4uLiwgaW5pdCkpOyBcCisgICAgfSBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncywgdHlwZW5hbWUgVT10eXBlbmFtZSBTOjpGbGV4VHlwZSwgdW5zaWduZWQgTj4gXAorICAgIGlubGluZSBzdGF0aWMgc3RkOjpwdHIjI19wdHI8X1R5cGU+IEFsbG9jIyNQdHIoY29uc3QgVSgmaW5pdClbTl0sIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgeyBcCisgICAgICAgIHJldHVybiBzdGQ6OnB0ciMjX3B0cjxfVHlwZT4obmV3KE4pIF9UeXBlKE4sIGFyZ3MuLi4sIGluaXQpKTsgXAorICAgIH0gXAorCisvKioKKyAqIERlZmluZSBmbGV4aWJsZSBtZXRob2RzIEFsbG9jU2hhcmVkLCBBbGxvY1VuaXF1ZSBhbmQgZmxleENvdW50LgorICovCisjZGVmaW5lIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKF9UeXBlLCBTKSBcCisgICAgREVGSU5FX0ZMRVhJQkxFX0FMTE9DKF9UeXBlLCBTLCBzaGFyZWQsIFNoYXJlZCkgXAorICAgIERFRklORV9GTEVYSUJMRV9BTExPQyhfVHlwZSwgUywgdW5pcXVlLCBVbmlxdWUpIFwKKyAgICBpbmxpbmUgc2l6ZV90IGZsZXhDb3VudCgpIGNvbnN0IHsgXAorICAgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihfVHlwZSkgPT0gX1R5cGU6OkJBU0VfU0laRSwgImluY29ycmVjdCBCQVNFX1NJWkUiKTsgXAorICAgICAgICBzaXplX3Qgc3ogPSB0aGlzLT5zaXplKCk7IFwKKyAgICAgICAgaWYgKHN6ID49IHNpemVvZihfVHlwZSkpIHsgXAorICAgICAgICAgICAgcmV0dXJuIChzeiAtIHNpemVvZihfVHlwZSkpIC8gX1R5cGU6OkZMRVhfU0laRTsgXAorICAgICAgICB9IFwKKyAgICAgICAgcmV0dXJuIDA7IFwKKyAgICB9IFwKKworLy8vIE1hcmsgZmxleGlibGUgbWVtYmVyIHZhcmlhYmxlIGFuZCBtYWtlIHN0cnVjdHVyZSBmbGV4aWJsZS4KKyNkZWZpbmUgRkxFWChjbHMsIG0pIFwKKyAgICBDMl9ET19OT1RfQ09QWShjbHMpIFwKK3ByaXZhdGU6IFwKKyAgICBDMlBBUkFNX01BS0VfRlJJRU5EUyBcCisgICAgLyoqIFxpZiAwICovIFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSwgdHlwZW5hbWU+IGZyaWVuZCBzdHJ1Y3QgX0MyRmxleEhlbHBlcjsgXAorcHVibGljOiBcCisgICAgdHlwZWRlZiBkZWNsdHlwZShtKSBfRmxleE1lbWJlclR5cGU7IFwKKyAgICAvKiBkZWZhdWx0IGNvbnN0cnVjdG9yIHdpdGggZmxleENvdW50ICovIFwKKyAgICBpbmxpbmUgY2xzKHNpemVfdCkgOiBjbHMoKSB7fSBcCisgICAgLyogY29uc3RleHByIHN0YXRpYyBfRmxleE1lbWJlclR5cGUgY2xzOjoqIGZsZXhNZW1iZXIgPSAmY2xzOjptOyAqLyBcCisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQzJGbGV4SGVscGVyPF9GbGV4TWVtYmVyVHlwZT46OkZsZXhUeXBlIEZsZXhUeXBlOyBcCisgICAgc3RhdGljX2Fzc2VydChcCisgICAgICAgICAgICAhc3RkOjppc192b2lkPEZsZXhUeXBlPjo6dmFsdWUsIFwKKyAgICAgICAgICAgICJtZW1iZXIgaXMgbm90IGZsZXhpYmxlLCBvciBhIGZsZXhpYmxlIGFycmF5IG9mIGEgZmxleGlibGUgdHlwZSIpOyBcCisgICAgZW51bSA6IHVpbnQzMl90IHsgRkxFWF9TSVpFID0gX0MyRmxleEhlbHBlcjxfRmxleE1lbWJlclR5cGU+OjpGTEVYX1NJWkUgfTsgXAorICAgIC8qKiBcZW5kaWYgKi8gXAorCisvLy8gQH0KKworLyoqCisgKiBHbG9iYWwtcGFyYW1ldGVyIHRlbXBsYXRlLgorICoKKyAqIEJhc2UgdGVtcGxhdGUgdG8gZGVmaW5lIGEgZ2xvYmFsIHNldHRpbmcvdHVuaW5nIG9yIGluZm8gYmFzZWQgb24gYSBzdHJ1Y3R1cmUgYW5kCisgKiBhbiBvcHRpb25hbCBQYXJhbUluZGV4LiBHbG9iYWwgcGFyYW1ldGVycyBhcmUgbm90IHRpZWQgdG8gYSBwb3J0IChpbnB1dCBvciBvdXRwdXQpLgorICoKKyAqIFBhcmFtZXRlcnMgd3JhcCBzdHJ1Y3R1cmVzIGJ5IHByZXBlbmRpbmcgYSAocGFyYW1ldGVyKSBoZWFkZXIuIFRoZSBmaWVsZHMgb2YgdGhlIHdyYXBwZWQKKyAqIHN0cnVjdHVyZSBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHksIGFuZCBjb25zdHJ1Y3RvcnMgYW5kIHBvdGVudGlhbCBwdWJsaWMgbWV0aG9kcyBhcmUgYWxzbworICogd3JhcHBlZC4KKyAqCisgKiBcdHBhcmFtIFQgcGFyYW0gdHlwZSBDMlNldHRpbmcsIEMyVHVuaW5nIG9yIEMySW5mbworICogXHRwYXJhbSBTIHdyYXBwZWQgc3RydWN0dXJlCisgKiBcdHBhcmFtIFBhcmFtSW5kZXggb3B0aW9uYWwgcGFyYW1ldGVyIGluZGV4IG92ZXJyaWRlLiBNdXN0IGJlIHNwZWNpZmllZCBmb3IgYmFzZS9yZXVzZWQKKyAqIHN0cnVjdHVyZXMuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBQYXJhbUluZGV4PVM6OkNPUkVfSU5ERVgsIGNsYXNzIEZsZXg9dm9pZD4KK3N0cnVjdCBDMl9ISURFIEMyR2xvYmFsUGFyYW0gOiBwdWJsaWMgVCwgcHVibGljIFMsCisgICAgICAgIHB1YmxpYyBfQzJTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LCBUOjpQQVJBTV9LSU5EIHwgVDo6VHlwZTo6RElSX0dMT0JBTD4geworICAgIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKFBhcmFtSW5kZXgpCitwcml2YXRlOgorICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxULCBTLCBQYXJhbUluZGV4PiBfVHlwZTsKKworcHVibGljOgorICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgaW5saW5lIEMyR2xvYmFsUGFyYW0oY29uc3QgQXJncygmLi4uIGFyZ3MpKSA6IFQoc2l6ZW9mKF9UeXBlKSwgX1R5cGU6OlBBUkFNX1RZUEUpLCBTKGFyZ3MuLi4pIHsgfQorCisgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKF9UeXBlKQorfTsKKworLyoqCisgKiBHbG9iYWwtcGFyYW1ldGVyIHRlbXBsYXRlIGZvciBmbGV4aWJsZSBzdHJ1Y3R1cmVzLgorICoKKyAqIEJhc2UgdGVtcGxhdGUgdG8gZGVmaW5lIGEgZ2xvYmFsIHNldHRpbmcvdHVuaW5nIG9yIGluZm8gYmFzZWQgb24gYSBmbGV4aWJsZSBzdHJ1Y3R1cmUgYW5kCisgKiBhbiBvcHRpb25hbCBQYXJhbUluZGV4LiBHbG9iYWwgcGFyYW1ldGVycyBhcmUgbm90IHRpZWQgdG8gYSBwb3J0IChpbnB1dCBvciBvdXRwdXQpLgorICoKKyAqIFx0cGFyYW0gVCBwYXJhbSB0eXBlIEMyU2V0dGluZywgQzJUdW5pbmcgb3IgQzJJbmZvCisgKiBcdHBhcmFtIFMgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKyAqIFx0cGFyYW0gUGFyYW1JbmRleCBvcHRpb25hbCBwYXJhbWV0ZXIgaW5kZXggb3ZlcnJpZGUuIE11c3QgYmUgc3BlY2lmaWVkIGZvciBiYXNlL3JldXNlZAorICogICAgICAgICBzdHJ1Y3R1cmVzLgorICoKKyAqIFBhcmFtZXRlcnMgd3JhcCBzdHJ1Y3R1cmVzIGJ5IHByZXBlbmRpbmcgYSAocGFyYW1ldGVyKSBoZWFkZXIuIFRoZSBmaWVsZHMgYW5kIG1ldGhvZHMgb2YgZmxleGlibGUKKyAqIHN0cnVjdHVyZXMgY2FuIGJlIGFjY2Vzc2VkIHZpYSB0aGUgbSBtZW1iZXIgdmFyaWFibGU7IGhvd2V2ZXIsIHRoZSBjb25zdHJ1Y3RvcnMgb2YgdGhlIHN0cnVjdHVyZQorICogYXJlIHdyYXBwZWQgZGlyZWN0bHkuIChUaGlzIGlzIGJlY2F1c2UgZmxleGlibGUgdHlwZXMgY2Fubm90IGJlIHN1YmNsYXNzZWQuKQorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgUGFyYW1JbmRleD4KK3N0cnVjdCBDMl9ISURFIEMyR2xvYmFsUGFyYW08VCwgUywgUGFyYW1JbmRleCwgSUZfRkxFWElCTEUoUyk+CisgICAgOiBwdWJsaWMgVCwgcHVibGljIF9DMkZsZXhTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LCBUOjpQQVJBTV9LSU5EIHwgVDo6VHlwZTo6RElSX0dMT0JBTD4geworcHJpdmF0ZToKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08VCwgUywgUGFyYW1JbmRleD4gX1R5cGU7CisKKyAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3Rvci4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgIGlubGluZSBDMkdsb2JhbFBhcmFtKHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBfVHlwZTo6UEFSQU1fVFlQRSksIG0oZmxleENvdW50LCBhcmdzLi4uKSB7IH0KKworcHVibGljOgorICAgIFMgbTsgLy8vPCB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQorCisgICAgREVGSU5FX0ZMRVhJQkxFX01FVEhPRFMoX1R5cGUsIFMpCisgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKF9UeXBlKQorfTsKKworLyoqCisgKiBQb3J0LXBhcmFtZXRlciB0ZW1wbGF0ZS4KKyAqCisgKiBCYXNlIHRlbXBsYXRlIHRvIGRlZmluZSBhIHBvcnQgc2V0dGluZy90dW5pbmcgb3IgaW5mbyBiYXNlZCBvbiBhIHN0cnVjdHVyZSBhbmQKKyAqIGFuIG9wdGlvbmFsIFBhcmFtSW5kZXguIFBvcnQgcGFyYW1ldGVycyBhcmUgdGllZCB0byBhIHBvcnQgKGlucHV0IG9yIG91dHB1dCksIGJ1dCBub3QgdG8gYQorICogc3BlY2lmaWMgc3RyZWFtLgorICoKKyAqIFx0cGFyYW0gVCBwYXJhbSB0eXBlIEMyU2V0dGluZywgQzJUdW5pbmcgb3IgQzJJbmZvCisgKiBcdHBhcmFtIFMgd3JhcHBlZCBzdHJ1Y3R1cmUKKyAqIFx0cGFyYW0gUGFyYW1JbmRleCBvcHRpb25hbCBwYXJhbWV0ZXIgaW5kZXggb3ZlcnJpZGUuIE11c3QgYmUgc3BlY2lmaWVkIGZvciBiYXNlL3JldXNlZAorICogICAgICAgICBzdHJ1Y3R1cmVzLgorICoKKyAqIFBhcmFtZXRlcnMgd3JhcCBzdHJ1Y3R1cmVzIGJ5IHByZXBlbmRpbmcgYSAocGFyYW1ldGVyKSBoZWFkZXIuIFRoZSBmaWVsZHMgb2YgdGhlIHdyYXBwZWQKKyAqIHN0cnVjdHVyZSBjYW4gYmUgYWNjZXNzZWQgZGlyZWN0bHksIGFuZCBjb25zdHJ1Y3RvcnMgYW5kIHBvdGVudGlhbCBwdWJsaWMgbWV0aG9kcyBhcmUgYWxzbworICogd3JhcHBlZC4KKyAqCisgKiBUaGVyZSBhcmUgMyBmbGF2b3JzIG9mIHBvcnQgcGFyYW1ldGVyczogdW5zcGVjaWZpZWQsIGlucHV0IGFuZCBvdXRwdXQuIFBhcmFtZXRlcnMgd2l0aAorICogdW5zcGVjaWZpZWQgcG9ydCBleHBvc2UgYSBzZXRQb3J0IG1ldGhvZCwgYW5kIGFkZCBhbiBpbml0aWFsIHBvcnQgcGFyYW1ldGVyIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgaW50IFBhcmFtSW5kZXg9Uzo6Q09SRV9JTkRFWCwgY2xhc3MgRmxleD12b2lkPgorc3RydWN0IEMyX0hJREUgQzJQb3J0UGFyYW0gOiBwdWJsaWMgVCwgcHVibGljIFMsCisgICAgICAgIHByaXZhdGUgX0MyU3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpESVJfVU5ERUZJTkVEPiB7CisgICAgX0MyX0NPUkVfSU5ERVhfT1ZFUlJJREUoUGFyYW1JbmRleCkKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBDMlBvcnRQYXJhbTxULCBTLCBQYXJhbUluZGV4PiBfVHlwZTsKKworcHVibGljOgorICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgIGlubGluZSBDMlBvcnRQYXJhbSgpIDogVChzaXplb2YoX1R5cGUpLCBfVHlwZTo6UEFSQU1fVFlQRSkgeyB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBzcGVjaWZ5aW5nIHBvcnQvZGlyZWN0aW9uLgorICAgIGlubGluZSBDMlBvcnRQYXJhbShib29sIF9vdXRwdXQsIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgOiBUKHNpemVvZihfVHlwZSksIF9vdXRwdXQgPyBvdXRwdXQ6OlBBUkFNX1RZUEUgOiBpbnB1dDo6UEFSQU1fVFlQRSksIFMoYXJncy4uLikgeyB9CisgICAgLy8vIFNldCBwb3J0L2RpcmVjdGlvbi4KKyAgICBpbmxpbmUgdm9pZCBzZXRQb3J0KGJvb2wgb3V0cHV0KSB7IEMyUGFyYW06OnNldFBvcnQob3V0cHV0KTsgfQorCisgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKF9UeXBlKQorCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBhbiBpbnB1dCBwb3J0IHBhcmFtZXRlci4KKyAgICBzdHJ1Y3QgaW5wdXQgOiBwdWJsaWMgVCwgcHVibGljIFMsCisgICAgICAgICAgICBwdWJsaWMgX0MyU3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpESVJfSU5QVVQ+IHsKKyAgICAgICAgX0MyX0NPUkVfSU5ERVhfT1ZFUlJJREUoUGFyYW1JbmRleCkKKyAgICAgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3IuCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgICAgIGlubGluZSBpbnB1dChjb25zdCBBcmdzKCYuLi4gYXJncykpIDogVChzaXplb2YoX1R5cGUpLCBpbnB1dDo6UEFSQU1fVFlQRSksIFMoYXJncy4uLikgeyB9CisKKyAgICAgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKGlucHV0KQorCisgICAgfTsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYW4gb3V0cHV0IHBvcnQgcGFyYW1ldGVyLgorICAgIHN0cnVjdCBvdXRwdXQgOiBwdWJsaWMgVCwgcHVibGljIFMsCisgICAgICAgICAgICBwdWJsaWMgX0MyU3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpESVJfT1VUUFVUPiB7CisgICAgICAgIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKFBhcmFtSW5kZXgpCisgICAgICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yLgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgICAgICBpbmxpbmUgb3V0cHV0KGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgOiBUKHNpemVvZihfVHlwZSksIG91dHB1dDo6UEFSQU1fVFlQRSksIFMoYXJncy4uLikgeyB9CisKKyAgICAgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKG91dHB1dCkKKyAgICB9OworfTsKKworLyoqCisgKiBQb3J0LXBhcmFtZXRlciB0ZW1wbGF0ZSBmb3IgZmxleGlibGUgc3RydWN0dXJlcy4KKyAqCisgKiBCYXNlIHRlbXBsYXRlIHRvIGRlZmluZSBhIHBvcnQgc2V0dGluZy90dW5pbmcgb3IgaW5mbyBiYXNlZCBvbiBhIGZsZXhpYmxlIHN0cnVjdHVyZSBhbmQKKyAqIGFuIG9wdGlvbmFsIFBhcmFtSW5kZXguIFBvcnQgcGFyYW1ldGVycyBhcmUgdGllZCB0byBhIHBvcnQgKGlucHV0IG9yIG91dHB1dCksIGJ1dCBub3QgdG8gYQorICogc3BlY2lmaWMgc3RyZWFtLgorICoKKyAqIFx0cGFyYW0gVCBwYXJhbSB0eXBlIEMyU2V0dGluZywgQzJUdW5pbmcgb3IgQzJJbmZvCisgKiBcdHBhcmFtIFMgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKyAqIFx0cGFyYW0gUGFyYW1JbmRleCBvcHRpb25hbCBwYXJhbWV0ZXIgaW5kZXggb3ZlcnJpZGUuIE11c3QgYmUgc3BlY2lmaWVkIGZvciBiYXNlL3JldXNlZAorICogICAgICAgICBzdHJ1Y3R1cmVzLgorICoKKyAqIFBhcmFtZXRlcnMgd3JhcCBzdHJ1Y3R1cmVzIGJ5IHByZXBlbmRpbmcgYSAocGFyYW1ldGVyKSBoZWFkZXIuIFRoZSBmaWVsZHMgYW5kIG1ldGhvZHMgb2YgZmxleGlibGUKKyAqIHN0cnVjdHVyZXMgY2FuIGJlIGFjY2Vzc2VkIHZpYSB0aGUgbSBtZW1iZXIgdmFyaWFibGU7IGhvd2V2ZXIsIHRoZSBjb25zdHJ1Y3RvcnMgb2YgdGhlIHN0cnVjdHVyZQorICogYXJlIHdyYXBwZWQgZGlyZWN0bHkuIChUaGlzIGlzIGJlY2F1c2UgZmxleGlibGUgdHlwZXMgY2Fubm90IGJlIHN1YmNsYXNzZWQuKQorICoKKyAqIFRoZXJlIGFyZSAzIGZsYXZvcnMgb2YgcG9ydCBwYXJhbWV0ZXJzOiB1bnNwZWNpZmllZCwgaW5wdXQgYW5kIG91dHB1dC4gUGFyYW1ldGVycyB3aXRoCisgKiB1bnNwZWNpZmllZCBwb3J0IGV4cG9zZSBhIHNldFBvcnQgbWV0aG9kLCBhbmQgYWRkIGFuIGluaXRpYWwgcG9ydCBwYXJhbWV0ZXIgdG8gdGhlIGNvbnN0cnVjdG9yLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgUGFyYW1JbmRleD4KK3N0cnVjdCBDMl9ISURFIEMyUG9ydFBhcmFtPFQsIFMsIFBhcmFtSW5kZXgsIElGX0ZMRVhJQkxFKFMpPgorICAgIDogcHVibGljIFQsIHB1YmxpYyBfQzJGbGV4U3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVDo6UEFSQU1fS0lORCB8IFQ6OlR5cGU6OkRJUl9VTkRFRklORUQ+IHsKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBDMlBvcnRQYXJhbTxULCBTLCBQYXJhbUluZGV4PiBfVHlwZTsKKworICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yIGZvciBiYXNpYyBhbGxvY2F0aW9uOiBuZXcoZmxleENvdW50KSBQLgorICAgIGlubGluZSBDMlBvcnRQYXJhbShzaXplX3QgZmxleENvdW50KSA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIF9UeXBlOjpQQVJBTV9UWVBFKSB7IH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBwb3J0L2RpcmVjdGlvbi4KKyAgICBpbmxpbmUgQzJQb3J0UGFyYW0oc2l6ZV90IGZsZXhDb3VudCwgYm9vbCBfb3V0cHV0LCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgIDogVChfVHlwZTo6Q2FsY1NpemUoZmxleENvdW50KSwgX291dHB1dCA/IG91dHB1dDo6UEFSQU1fVFlQRSA6IGlucHV0OjpQQVJBTV9UWVBFKSwKKyAgICAgICAgICBtKGZsZXhDb3VudCwgYXJncy4uLikgeyB9CisKK3B1YmxpYzoKKyAgICAvLy8gU2V0IHBvcnQvZGlyZWN0aW9uLgorICAgIGlubGluZSB2b2lkIHNldFBvcnQoYm9vbCBvdXRwdXQpIHsgQzJQYXJhbTo6c2V0UG9ydChvdXRwdXQpOyB9CisKKyAgICBTIG07IC8vLzwgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKworICAgIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKF9UeXBlLCBTKQorICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhfVHlwZSkKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYW4gaW5wdXQgcG9ydCBwYXJhbWV0ZXIuCisgICAgc3RydWN0IGlucHV0IDogcHVibGljIFQsCisgICAgICAgICAgICBwdWJsaWMgX0MyRmxleFN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6RElSX0lOUFVUPiB7CisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHBvcnQvZGlyZWN0aW9uLgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgICAgICBpbmxpbmUgaW5wdXQoc2l6ZV90IGZsZXhDb3VudCwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQorICAgICAgICAgICAgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBpbnB1dDo6UEFSQU1fVFlQRSksIG0oZmxleENvdW50LCBhcmdzLi4uKSB7IH0KKworICAgIHB1YmxpYzoKKyAgICAgICAgUyBtOyAvLy88IHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCisKKyAgICAgICAgREVGSU5FX0ZMRVhJQkxFX01FVEhPRFMoaW5wdXQsIFMpCisgICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhpbnB1dCkKKyAgICB9OworCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBhbiBvdXRwdXQgcG9ydCBwYXJhbWV0ZXIuCisgICAgc3RydWN0IG91dHB1dCA6IHB1YmxpYyBULAorICAgICAgICAgICAgcHVibGljIF9DMkZsZXhTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LCBUOjpQQVJBTV9LSU5EIHwgVDo6SW5kZXg6OkRJUl9PVVRQVVQ+IHsKKyAgICBwcml2YXRlOgorICAgICAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBhbHNvIHNwZWNpZnlpbmcgcG9ydC9kaXJlY3Rpb24uCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgICAgIGlubGluZSBvdXRwdXQoc2l6ZV90IGZsZXhDb3VudCwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQorICAgICAgICAgICAgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBvdXRwdXQ6OlBBUkFNX1RZUEUpLCBtKGZsZXhDb3VudCwgYXJncy4uLikgeyB9CisKKyAgICBwdWJsaWM6CisgICAgICAgIFMgbTsgLy8vPCB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQorCisgICAgICAgIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKG91dHB1dCwgUykKKyAgICAgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKG91dHB1dCkKKyAgICB9OworfTsKKworLyoqCisgKiBTdHJlYW0tcGFyYW1ldGVyIHRlbXBsYXRlLgorICoKKyAqIEJhc2UgdGVtcGxhdGUgdG8gZGVmaW5lIGEgc3RyZWFtIHNldHRpbmcvdHVuaW5nIG9yIGluZm8gYmFzZWQgb24gYSBzdHJ1Y3R1cmUgYW5kCisgKiBhbiBvcHRpb25hbCBQYXJhbUluZGV4LiBTdHJlYW0gcGFyYW1ldGVycyBhcmUgdGllZCB0byBhIHNwZWNpZmljIHN0cmVhbSBvbiBhIHBvcnQgKGlucHV0IG9yCisgKiBvdXRwdXQpLgorICoKKyAqIFx0cGFyYW0gVCBwYXJhbSB0eXBlIEMyU2V0dGluZywgQzJUdW5pbmcgb3IgQzJJbmZvCisgKiBcdHBhcmFtIFMgd3JhcHBlZCBzdHJ1Y3R1cmUKKyAqIFx0cGFyYW0gUGFyYW1JbmRleCBvcHRpb25hbCBwYXJhbXRlciBpbmRleCBvdmVycmlkZS4gTXVzdCBiZSBzcGVjaWZpZWQgZm9yIGJhc2UvcmV1c2VkCisgKiAgICAgICAgIHN0cnVjdHVyZXMuCisgKgorICogUGFyYW1ldGVycyB3cmFwIHN0cnVjdHVyZXMgYnkgcHJlcGVuZGluZyBhIChwYXJhbWV0ZXIpIGhlYWRlci4gVGhlIGZpZWxkcyBvZiB0aGUgd3JhcHBlZAorICogc3RydWN0dXJlIGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSwgYW5kIGNvbnN0cnVjdG9ycyBhbmQgcG90ZW50aWFsIHB1YmxpYyBtZXRob2RzIGFyZSBhbHNvCisgKiB3cmFwcGVkLgorICoKKyAqIFRoZXJlIGFyZSAzIGZsYXZvcnMgb2Ygc3RyZWFtIHBhcmFtZXRlcnM6IHVuc3BlY2lmaWVkIHBvcnQsIGlucHV0IGFuZCBvdXRwdXQuIEFsbCBvZiB0aGVzZSBleHBvc2UKKyAqIGEgc2V0U3RyZWFtIG1ldGhvZCBhbmQgYW4gZXh0cmEgaW5pdGlhbCBzdHJlYW1JRCBwYXJhbWV0ZXIgZm9yIHRoZSBjb25zdHJ1Y3Rvci4gTW9yZW92ZXIsCisgKiBwYXJhbWV0ZXJzIHdpdGggdW5zcGVjaWZpZWQgcG9ydCBleHBvc2UgYSBzZXRQb3J0IG1ldGhvZCwgYW5kIGFkZCBhbiBhZGRpdGlvbmFsIGluaXRpYWwgcG9ydAorICogcGFyYW1ldGVyIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgaW50IFBhcmFtSW5kZXg9Uzo6Q09SRV9JTkRFWCwgY2xhc3MgRmxleD12b2lkPgorc3RydWN0IEMyX0hJREUgQzJTdHJlYW1QYXJhbSA6IHB1YmxpYyBULCBwdWJsaWMgUywKKyAgICAgICAgcHJpdmF0ZSBfQzJTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LAorICAgICAgICAgICAgICAgIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6SVNfU1RSRUFNX0ZMQUcgfCBUOjpJbmRleDo6RElSX1VOREVGSU5FRD4geworICAgIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKFBhcmFtSW5kZXgpCitwcml2YXRlOgorICAgIHR5cGVkZWYgQzJTdHJlYW1QYXJhbTxULCBTLCBQYXJhbUluZGV4PiBfVHlwZTsKKworcHVibGljOgorICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLiBQb3J0L2RpcmVjdGlvbiBhbmQgc3RyZWFtLUlEIGlzIHVuZGVmaW5lZC4KKyAgICBpbmxpbmUgQzJTdHJlYW1QYXJhbSgpIDogVChzaXplb2YoX1R5cGUpLCBfVHlwZTo6UEFSQU1fVFlQRSkgeyB9CisgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHBvcnQvZGlyZWN0aW9uIGFuZAorICAgIC8vLyBzdHJlYW0tSUQuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICBpbmxpbmUgQzJTdHJlYW1QYXJhbShib29sIF9vdXRwdXQsIHVuc2lnbmVkIHN0cmVhbSwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQorICAgICAgICA6IFQoc2l6ZW9mKF9UeXBlKSwgX291dHB1dCA/IG91dHB1dDo6UEFSQU1fVFlQRSA6IGlucHV0OjpQQVJBTV9UWVBFLCBzdHJlYW0pLAorICAgICAgICAgIFMoYXJncy4uLikgeyB9CisgICAgLy8vIFNldCBwb3J0L2RpcmVjdGlvbi4KKyAgICBpbmxpbmUgdm9pZCBzZXRQb3J0KGJvb2wgb3V0cHV0KSB7IEMyUGFyYW06OnNldFBvcnQob3V0cHV0KTsgfQorICAgIC8vLyBTZXQgc3RyZWFtLWlkLiBccmV0dmFsIHRydWUgaWYgdGhlIHN0cmVhbS1pZCB3YXMgc3VjY2Vzc2Z1bGx5IHNldC4KKyAgICBpbmxpbmUgYm9vbCBzZXRTdHJlYW0odW5zaWduZWQgc3RyZWFtKSB7IHJldHVybiBDMlBhcmFtOjpzZXRTdHJlYW0oc3RyZWFtKTsgfQorCisgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKF9UeXBlKQorCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBhbiBpbnB1dCBzdHJlYW0gcGFyYW1ldGVyLgorICAgIHN0cnVjdCBpbnB1dCA6IHB1YmxpYyBULCBwdWJsaWMgUywKKyAgICAgICAgICAgIHB1YmxpYyBfQzJTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LAorICAgICAgICAgICAgICAgICAgICBUOjpQQVJBTV9LSU5EIHwgVDo6SW5kZXg6OklTX1NUUkVBTV9GTEFHIHwgVDo6VHlwZTo6RElSX0lOUFVUPiB7CisgICAgICAgIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKFBhcmFtSW5kZXgpCisKKyAgICAgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuIFN0cmVhbS1JRCBpcyB1bmRlZmluZWQuCisgICAgICAgIGlubGluZSBpbnB1dCgpIDogVChzaXplb2YoX1R5cGUpLCBpbnB1dDo6UEFSQU1fVFlQRSkgeyB9CisgICAgICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBzdHJlYW0tSUQuCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgICAgIGlubGluZSBpbnB1dCh1bnNpZ25lZCBzdHJlYW0sIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgICAgIDogVChzaXplb2YoX1R5cGUpLCBpbnB1dDo6UEFSQU1fVFlQRSwgc3RyZWFtKSwgUyhhcmdzLi4uKSB7IH0KKyAgICAgICAgLy8vIFNldCBzdHJlYW0taWQuIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgc3RyZWFtLWlkIHdhcyBzdWNjZXNzZnVsbHkgc2V0LgorICAgICAgICBpbmxpbmUgYm9vbCBzZXRTdHJlYW0odW5zaWduZWQgc3RyZWFtKSB7IHJldHVybiBDMlBhcmFtOjpzZXRTdHJlYW0oc3RyZWFtKTsgfQorCisgICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhpbnB1dCkKKyAgICB9OworCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBhbiBvdXRwdXQgc3RyZWFtIHBhcmFtZXRlci4KKyAgICBzdHJ1Y3Qgb3V0cHV0IDogcHVibGljIFQsIHB1YmxpYyBTLAorICAgICAgICAgICAgcHVibGljIF9DMlN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsCisgICAgICAgICAgICAgICAgICAgIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6SVNfU1RSRUFNX0ZMQUcgfCBUOjpUeXBlOjpESVJfT1VUUFVUPiB7CisgICAgICAgIF9DMl9DT1JFX0lOREVYX09WRVJSSURFKFBhcmFtSW5kZXgpCisKKyAgICAgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuIFN0cmVhbS1JRCBpcyB1bmRlZmluZWQuCisgICAgICAgIGlubGluZSBvdXRwdXQoKSA6IFQoc2l6ZW9mKF9UeXBlKSwgb3V0cHV0OjpQQVJBTV9UWVBFKSB7IH0KKyAgICAgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHN0cmVhbS1JRC4KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICAgICAgaW5saW5lIG91dHB1dCh1bnNpZ25lZCBzdHJlYW0sIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgICAgIDogVChzaXplb2YoX1R5cGUpLCBvdXRwdXQ6OlBBUkFNX1RZUEUsIHN0cmVhbSksIFMoYXJncy4uLikgeyB9CisgICAgICAgIC8vLyBTZXQgc3RyZWFtLWlkLiBccmV0dmFsIHRydWUgaWYgdGhlIHN0cmVhbS1pZCB3YXMgc3VjY2Vzc2Z1bGx5IHNldC4KKyAgICAgICAgaW5saW5lIGJvb2wgc2V0U3RyZWFtKHVuc2lnbmVkIHN0cmVhbSkgeyByZXR1cm4gQzJQYXJhbTo6c2V0U3RyZWFtKHN0cmVhbSk7IH0KKworICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMob3V0cHV0KQorICAgIH07Cit9OworCisvKioKKyAqIFN0cmVhbS1wYXJhbWV0ZXIgdGVtcGxhdGUgZm9yIGZsZXhpYmxlIHN0cnVjdHVyZXMuCisgKgorICogQmFzZSB0ZW1wbGF0ZSB0byBkZWZpbmUgYSBzdHJlYW0gc2V0dGluZy90dW5pbmcgb3IgaW5mbyBiYXNlZCBvbiBhIGZsZXhpYmxlIHN0cnVjdHVyZSBhbmQKKyAqIGFuIG9wdGlvbmFsIFBhcmFtSW5kZXguIFN0cmVhbSBwYXJhbWV0ZXJzIGFyZSB0aWVkIHRvIGEgc3BlY2lmaWMgc3RyZWFtIG9uIGEgcG9ydCAoaW5wdXQgb3IKKyAqIG91dHB1dCkuCisgKgorICogXHRwYXJhbSBUIHBhcmFtIHR5cGUgQzJTZXR0aW5nLCBDMlR1bmluZyBvciBDMkluZm8KKyAqIFx0cGFyYW0gUyB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQorICogXHRwYXJhbSBQYXJhbUluZGV4IG9wdGlvbmFsIHBhcmFtZXRlciBpbmRleCBvdmVycmlkZS4gTXVzdCBiZSBzcGVjaWZpZWQgZm9yIGJhc2UvcmV1c2VkCisgKiAgICAgICAgIHN0cnVjdHVyZXMuCisgKgorICogUGFyYW1ldGVycyB3cmFwIHN0cnVjdHVyZXMgYnkgcHJlcGVuZGluZyBhIChwYXJhbWV0ZXIpIGhlYWRlci4gVGhlIGZpZWxkcyBhbmQgbWV0aG9kcyBvZiBmbGV4aWJsZQorICogc3RydWN0dXJlcyBjYW4gYmUgYWNjZXNzZWQgdmlhIHRoZSBtIG1lbWJlciB2YXJpYWJsZTsgaG93ZXZlciwgdGhlIGNvbnN0cnVjdG9ycyBvZiB0aGUgc3RydWN0dXJlCisgKiBhcmUgd3JhcHBlZCBkaXJlY3RseS4gKFRoaXMgaXMgYmVjYXVzZSBmbGV4aWJsZSB0eXBlcyBjYW5ub3QgYmUgc3ViY2xhc3NlZC4pCisgKgorICogVGhlcmUgYXJlIDMgZmxhdm9ycyBvZiBzdHJlYW0gcGFyYW1ldGVyczogdW5zcGVjaWZpZWQgcG9ydCwgaW5wdXQgYW5kIG91dHB1dC4gQWxsIG9mIHRoZXNlIGV4cG9zZQorICogYSBzZXRTdHJlYW0gbWV0aG9kIGFuZCBhbiBleHRyYSBpbml0aWFsIHN0cmVhbUlEIHBhcmFtZXRlciBmb3IgdGhlIGNvbnN0cnVjdG9yLiBNb3Jlb3ZlciwKKyAqIHBhcmFtZXRlcnMgd2l0aCB1bnNwZWNpZmllZCBwb3J0IGV4cG9zZSBhIHNldFBvcnQgbWV0aG9kLCBhbmQgYWRkIGFuIGFkZGl0aW9uYWwgaW5pdGlhbCBwb3J0CisgKiBwYXJhbWV0ZXIgdG8gdGhlIGNvbnN0cnVjdG9yLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgUGFyYW1JbmRleD4KK3N0cnVjdCBDMl9ISURFIEMyU3RyZWFtUGFyYW08VCwgUywgUGFyYW1JbmRleCwgSUZfRkxFWElCTEUoUyk+CisgICAgOiBwdWJsaWMgVCwKKyAgICAgIHB1YmxpYyBfQzJGbGV4U3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwKKyAgICAgICAgICAgICAgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpJU19TVFJFQU1fRkxBRyB8IFQ6OkluZGV4OjpESVJfVU5ERUZJTkVEPiB7Citwcml2YXRlOgorICAgIHR5cGVkZWYgQzJTdHJlYW1QYXJhbTxULCBTLCBQYXJhbUluZGV4PiBfVHlwZTsKKyAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4gUG9ydC9kaXJlY3Rpb24gYW5kIHN0cmVhbS1JRCBpcyB1bmRlZmluZWQuCisgICAgaW5saW5lIEMyU3RyZWFtUGFyYW0oc2l6ZV90IGZsZXhDb3VudCkgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBfVHlwZTo6UEFSQU1fVFlQRSwgMHUpIHsgfQorICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBwb3J0L2RpcmVjdGlvbiBhbmQKKyAgICAvLy8gc3RyZWFtLUlELgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgaW5saW5lIEMyU3RyZWFtUGFyYW0oc2l6ZV90IGZsZXhDb3VudCwgYm9vbCBfb3V0cHV0LCB1bnNpZ25lZCBzdHJlYW0sIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBfb3V0cHV0ID8gb3V0cHV0OjpQQVJBTV9UWVBFIDogaW5wdXQ6OlBBUkFNX1RZUEUsIHN0cmVhbSksCisgICAgICAgICAgbShmbGV4Q291bnQsIGFyZ3MuLi4pIHsgfQorCitwdWJsaWM6CisgICAgUyBtOyAvLy88IHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCisKKyAgICAvLy8gU2V0IHBvcnQvZGlyZWN0aW9uLgorICAgIGlubGluZSB2b2lkIHNldFBvcnQoYm9vbCBvdXRwdXQpIHsgQzJQYXJhbTo6c2V0UG9ydChvdXRwdXQpOyB9CisgICAgLy8vIFNldCBzdHJlYW0taWQuIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgc3RyZWFtLWlkIHdhcyBzdWNjZXNzZnVsbHkgc2V0LgorICAgIGlubGluZSBib29sIHNldFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIHsgcmV0dXJuIEMyUGFyYW06OnNldFN0cmVhbShzdHJlYW0pOyB9CisKKyAgICBERUZJTkVfRkxFWElCTEVfTUVUSE9EUyhfVHlwZSwgUykKKyAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoX1R5cGUpCisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGFuIGlucHV0IHN0cmVhbSBwYXJhbWV0ZXIuCisgICAgc3RydWN0IGlucHV0IDogcHVibGljIFQsCisgICAgICAgICAgICBwdWJsaWMgX0MyRmxleFN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsCisgICAgICAgICAgICAgICAgICAgIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6SVNfU1RSRUFNX0ZMQUcgfCBUOjpUeXBlOjpESVJfSU5QVVQ+IHsKKyAgICBwcml2YXRlOgorICAgICAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4gU3RyZWFtLUlEIGlzIHVuZGVmaW5lZC4KKyAgICAgICAgaW5saW5lIGlucHV0KHNpemVfdCBmbGV4Q291bnQpIDogVChfVHlwZTo6Q2FsY1NpemUoZmxleENvdW50KSwgaW5wdXQ6OlBBUkFNX1RZUEUpIHsgfQorICAgICAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBhbHNvIHNwZWNpZnlpbmcgc3RyZWFtLUlELgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgICAgICBpbmxpbmUgaW5wdXQoc2l6ZV90IGZsZXhDb3VudCwgdW5zaWduZWQgc3RyZWFtLCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgICAgICA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIGlucHV0OjpQQVJBTV9UWVBFLCBzdHJlYW0pLCBtKGZsZXhDb3VudCwgYXJncy4uLikgeyB9CisKKyAgICBwdWJsaWM6CisgICAgICAgIFMgbTsgLy8vPCB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQorCisgICAgICAgIC8vLyBTZXQgc3RyZWFtLWlkLiBccmV0dmFsIHRydWUgaWYgdGhlIHN0cmVhbS1pZCB3YXMgc3VjY2Vzc2Z1bGx5IHNldC4KKyAgICAgICAgaW5saW5lIGJvb2wgc2V0U3RyZWFtKHVuc2lnbmVkIHN0cmVhbSkgeyByZXR1cm4gQzJQYXJhbTo6c2V0U3RyZWFtKHN0cmVhbSk7IH0KKworICAgICAgICBERUZJTkVfRkxFWElCTEVfTUVUSE9EUyhpbnB1dCwgUykKKyAgICAgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKGlucHV0KQorICAgIH07CisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGFuIG91dHB1dCBzdHJlYW0gcGFyYW1ldGVyLgorICAgIHN0cnVjdCBvdXRwdXQgOiBwdWJsaWMgVCwKKyAgICAgICAgICAgIHB1YmxpYyBfQzJGbGV4U3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpJU19TVFJFQU1fRkxBRyB8IFQ6OlR5cGU6OkRJUl9PVVRQVVQ+IHsKKyAgICBwcml2YXRlOgorICAgICAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4gU3RyZWFtLUlEIGlzIHVuZGVmaW5lZC4KKyAgICAgICAgaW5saW5lIG91dHB1dChzaXplX3QgZmxleENvdW50KSA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIG91dHB1dDo6UEFSQU1fVFlQRSkgeyB9CisgICAgICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBzdHJlYW0tSUQuCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgICAgIGlubGluZSBvdXRwdXQoc2l6ZV90IGZsZXhDb3VudCwgdW5zaWduZWQgc3RyZWFtLCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgICAgICA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIG91dHB1dDo6UEFSQU1fVFlQRSwgc3RyZWFtKSwgbShmbGV4Q291bnQsIGFyZ3MuLi4pIHsgfQorCisgICAgcHVibGljOgorICAgICAgICBTIG07IC8vLzwgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKworICAgICAgICAvLy8gU2V0IHN0cmVhbS1pZC4gXHJldHZhbCB0cnVlIGlmIHRoZSBzdHJlYW0taWQgd2FzIHN1Y2Nlc3NmdWxseSBzZXQuCisgICAgICAgIGlubGluZSBib29sIHNldFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIHsgcmV0dXJuIEMyUGFyYW06OnNldFN0cmVhbShzdHJlYW0pOyB9CisKKyAgICAgICAgREVGSU5FX0ZMRVhJQkxFX01FVEhPRFMob3V0cHV0LCBTKQorICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMob3V0cHV0KQorICAgIH07Cit9OworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT0gU0lNUExFIFZBTFVFIFBBUkFNRVRFUlMgPT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogXGluZ3JvdXAgaW50ZXJuYWwKKyAqIEEgc3RydWN0dXJlIHRlbXBsYXRlIGVuY2Fwc3VsYXRpbmcgYSBzaW5nbGUgZWxlbWVudCB3aXRoIGRlZmF1bHQgY29uc3RydWN0b3JzIGFuZCBubyBjb3JlLWluZGV4LgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IEMyU2ltcGxlVmFsdWVTdHJ1Y3QgeworICAgIFQgdmFsdWU7IC8vLzwgc2ltcGxlIHZhbHVlIG9mIHRoZSBzdHJ1Y3R1cmUKKyAgICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgIGlubGluZSBDMlNpbXBsZVZhbHVlU3RydWN0KCkgPSBkZWZhdWx0OworICAgIC8vIENvbnN0cnVjdG9yIHdpdGggYW4gaW5pdGlhbCB2YWx1ZS4KKyAgICBpbmxpbmUgQzJTaW1wbGVWYWx1ZVN0cnVjdChUIHZhbHVlKSA6IHZhbHVlKHZhbHVlKSB7fQorICAgIERFRklORV9CQVNFX0MyU1RSVUNUKFNpbXBsZVZhbHVlKQorfTsKKworLy8gVE9ETzogbW92ZSB0aGlzIGFuZCBuZXh0IHRvIHNvbWUgZ2VuZXJpYyBwbGFjZQorLyoqCisgKiBJbnRlcmZhY2UgdG8gYSBibG9jayBvZiAobWFwcGVkKSBtZW1vcnkgY29udGFpbmluZyBhbiBhcnJheSBvZiBzb21lIHR5cGUgKFQpLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IEMyTWVtb3J5QmxvY2sgeworICAgIC8vLyBccmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgYmxvY2suCisgICAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIGNvbnN0ID0gMDsKKyAgICAvLy8gXHJldHVybnMgYSBjb25zdCBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGlzIGJsb2NrLiBDYXJlIG11c3QgYmUgdGFrZW4gdG8gbm90IHJlYWQgb3V0c2lkZQorICAgIC8vLyB0aGUgYmxvY2suCisgICAgdmlydHVhbCBjb25zdCBUICpkYXRhKCkgY29uc3QgPSAwOyAvLyBUT0RPOiBzaG91bGQgdGhpcyBiZSBmcmllbmQgYWNjZXNzIG9ubHkgaW4gc29tZSBDMk1lbW9yeSBtb2R1bGU/CisgICAgLy8vIFxyZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhpcyBibG9jay4gQ2FyZSBtdXN0IGJlIHRha2VuIHRvIG5vdCByZWFkIG9yIHdyaXRlCisgICAgLy8vIG91dHNpZGUgdGhlIGJsb2NrLgorICAgIGlubGluZSBUICpkYXRhKCkgeyByZXR1cm4gY29uc3RfY2FzdDxUKj4oY29uc3RfY2FzdDxjb25zdCBDMk1lbW9yeUJsb2NrKj4odGhpcyktPmRhdGEoKSk7IH0KKworcHJvdGVjdGVkOgorICAgIC8vIFRPRE86IGZvciBub3cgaXQgc2hvdWxkIG5ldmVyIGJlIGRlbGV0ZWQgYXMgQzJNZW1vcnlCbG9jaworICAgIHZpcnR1YWwgfkMyTWVtb3J5QmxvY2soKSA9IGRlZmF1bHQ7Cit9OworCisvKioKKyAqIEludGVyZmFjZSB0byBhIGJsb2NrIG9mIG1lbW9yeSBjb250YWluaW5nIGEgY29uc3RhbnQgKGNvbnN0ZXhwcikgYXJyYXkgb2Ygc29tZSB0eXBlIChUKS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBDMkNvbnN0TWVtb3J5QmxvY2sgOiBwdWJsaWMgQzJNZW1vcnlCbG9jazxUPiB7CisgICAgdmlydHVhbCBjb25zdCBUICogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIF9tRGF0YTsgfQorICAgIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBfbVNpemU7IH0KKworICAgIC8vLyBDb25zdHJ1Y3Rvci4KKyAgICB0ZW1wbGF0ZTx1bnNpZ25lZCBOPgorICAgIGlubGluZSBjb25zdGV4cHIgQzJDb25zdE1lbW9yeUJsb2NrKGNvbnN0IFQoJmluaXQpW05dKSA6IF9tRGF0YShpbml0KSwgX21TaXplKE4pIHt9CisKK3ByaXZhdGU6CisgICAgY29uc3QgVCAqX21EYXRhOworICAgIGNvbnN0IHNpemVfdCBfbVNpemU7Cit9OworCisvLy8gXGFkZHRvZ3JvdXAgaW50ZXJuYWwKKy8vLyBAeworCisvLy8gSGVscGVyIGNsYXNzIHRvIGluaXRpYWxpemUgZmxleGlibGUgYXJyYXlzIHdpdGggdmFyaW91cyBpbml0YWxpemVycy4KK3N0cnVjdCBfQzJWYWx1ZUFycmF5SGVscGVyIHsKKyAgICAvLyBjaGFyW10tcyBhcmUgdXNlZCBhcyBudWxsIHRlcm1pbmF0ZWQgc3RyaW5ncywgc28gdGhlIGxhc3QgZWxlbWVudCBpcyBuZXZlciBpbml0ZWQuCisKKyAgICAvLy8gSW5pdGlhbGl6ZSBhIGZsZXhpYmxlIGFycmF5IHVzaW5nIGEgY29uc3RleHByIG1lbW9yeSBibG9jay4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXRpYyB2b2lkIGluaXQoVCgmYXJyYXkpW10sIHNpemVfdCBhcnJheUxlbiwgY29uc3QgQzJNZW1vcnlCbG9jazxUPiAmYmxvY2spIHsKKyAgICAgICAgLy8gcmVzZXJ2ZSBsYXN0IGVsZW1lbnQgZm9yIHRlcm1pbmFsIDAgZm9yIHN0cmluZ3MKKyAgICAgICAgaWYgKGFycmF5TGVuICYmIHN0ZDo6aXNfc2FtZTxULCBjaGFyPjo6dmFsdWUpIHsKKyAgICAgICAgICAgIC0tYXJyYXlMZW47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJsb2NrLmRhdGEoKSkgeworICAgICAgICAgICAgbWVtY3B5KGFycmF5LCBibG9jay5kYXRhKCksIHN0ZDo6bWluKGFycmF5TGVuLCBibG9jay5zaXplKCkpICogc2l6ZW9mKFQpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBJbml0aWFsaXplIGEgZmxleGlibGUgYXJyYXkgdXNpbmcgYW4gaW5pdGlhbGl6ZXIgbGlzdC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXRpYyB2b2lkIGluaXQoVCgmYXJyYXkpW10sIHNpemVfdCBhcnJheUxlbiwgY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+ICZpbml0KSB7CisgICAgICAgIHNpemVfdCBpeCA9IDA7CisgICAgICAgIC8vIHJlc2VydmUgbGFzdCBlbGVtZW50IGZvciB0ZXJtaW5hbCAwIGZvciBzdHJpbmdzCisgICAgICAgIGlmIChhcnJheUxlbiAmJiBzdGQ6OmlzX3NhbWU8VCwgY2hhcj46OnZhbHVlKSB7CisgICAgICAgICAgICAtLWFycmF5TGVuOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgVCAmaXRlbSA6IGluaXQpIHsKKyAgICAgICAgICAgIGlmIChpeCA9PSBhcnJheUxlbikgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXJyYXlbaXgrK10gPSBpdGVtOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIEluaXRpYWxpemUgYSBmbGV4aWJsZSBhcnJheSB1c2luZyBhIHZlY3Rvci4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXRpYyB2b2lkIGluaXQoVCgmYXJyYXkpW10sIHNpemVfdCBhcnJheUxlbiwgY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJmluaXQpIHsKKyAgICAgICAgc2l6ZV90IGl4ID0gMDsKKyAgICAgICAgLy8gcmVzZXJ2ZSBsYXN0IGVsZW1lbnQgZm9yIHRlcm1pbmFsIDAgZm9yIHN0cmluZ3MKKyAgICAgICAgaWYgKGFycmF5TGVuICYmIHN0ZDo6aXNfc2FtZTxULCBjaGFyPjo6dmFsdWUpIHsKKyAgICAgICAgICAgIC0tYXJyYXlMZW47CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBUICZpdGVtIDogaW5pdCkgeworICAgICAgICAgICAgaWYgKGl4ID09IGFycmF5TGVuKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhcnJheVtpeCsrXSA9IGl0ZW07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gSW5pdGlhbGl6ZSBhIGZsZXhpYmxlIGFycmF5IHVzaW5nIGFub3RoZXIgZmxleGlibGUgYXJyYXkuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdW5zaWduZWQgTj4KKyAgICBzdGF0aWMgdm9pZCBpbml0KFQoJmFycmF5KVtdLCBzaXplX3QgYXJyYXlMZW4sIGNvbnN0IFQoJnN0cilbTl0pIHsKKyAgICAgICAgLy8gcmVzZXJ2ZSBsYXN0IGVsZW1lbnQgZm9yIHRlcm1pbmFsIDAgZm9yIHN0cmluZ3MKKyAgICAgICAgaWYgKGFycmF5TGVuICYmIHN0ZDo6aXNfc2FtZTxULCBjaGFyPjo6dmFsdWUpIHsKKyAgICAgICAgICAgIC0tYXJyYXlMZW47CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFycmF5TGVuKSB7CisgICAgICAgICAgICBtZW1jcHkoYXJyYXksIHN0ciwgc3RkOjptaW4oYXJyYXlMZW4sIChzaXplX3QpTikgKiBzaXplb2YoVCkpOworICAgICAgICB9CisgICAgfQorfTsKKworLyoqCisgKiBTcGVjaWFsaXphdGlvbiBmb3IgYSBmbGV4aWJsZSBibG9iIGFuZCBzdHJpbmcgYXJyYXlzLiBBIHN0cnVjdHVyZSB0ZW1wbGF0ZSBlbmNhcHN1bGF0aW5nIGEgc2luZ2xlCisgKiBmbGV4aWJsZSBhcnJheSBtZW1iZXIgd2l0aCBkZWZhdWx0IGZsZXhpYmxlIGNvbnN0cnVjdG9ycyBhbmQgbm8gY29yZS1pbmRleC4gVGhpcyB0eXBlIGNhbm5vdCBiZQorICogY29uc3RydWN0ZWQgb24gaXRzIG93biBhcyBpdCdzIHNpemUgaXMgMC4KKyAqCisgKiBcaW50ZXJuYWwgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBDMlNpbXBsZUFycmF5U3RydWN0PFRbXT4gc2ltcGx5IGJlY2F1c2UgaXRzIG1lbWJlciBoYXMgdGhlIG5hbWUKKyAqIGFzIHZhbHVlIHRvIHJlZmxlY3QgdGhpcyBpcyBhIHNpbmdsZSB2YWx1ZS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBDMlNpbXBsZVZhbHVlU3RydWN0PFRbXT4geworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPFQsIGNoYXI+Ojp2YWx1ZSB8fCBzdGQ6OmlzX3NhbWU8VCwgdWludDhfdD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgIkMyU2ltcGxlVmFsdWVTdHJ1Y3Q8VFtdPiBpcyBvbmx5IGZvciBCTE9CIG9yIFNUUklORyIpOworICAgIFQgdmFsdWVbXTsKKworICAgIGlubGluZSBDMlNpbXBsZVZhbHVlU3RydWN0KCkgPSBkZWZhdWx0OworICAgIERFRklORV9CQVNFX0MyU1RSVUNUKFNpbXBsZVZhbHVlKQorICAgIEZMRVgoQzJTaW1wbGVWYWx1ZVN0cnVjdCwgdmFsdWUpCisKK3ByaXZhdGU6CisgICAgaW5saW5lIEMyU2ltcGxlVmFsdWVTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgY29uc3QgQzJNZW1vcnlCbG9jazxUPiAmYmxvY2spIHsKKyAgICAgICAgX0MyVmFsdWVBcnJheUhlbHBlcjo6aW5pdCh2YWx1ZSwgZmxleENvdW50LCBibG9jayk7CisgICAgfQorCisgICAgaW5saW5lIEMyU2ltcGxlVmFsdWVTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+ICZpbml0KSB7CisgICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQodmFsdWUsIGZsZXhDb3VudCwgaW5pdCk7CisgICAgfQorCisgICAgaW5saW5lIEMyU2ltcGxlVmFsdWVTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJmluaXQpIHsKKyAgICAgICAgX0MyVmFsdWVBcnJheUhlbHBlcjo6aW5pdCh2YWx1ZSwgZmxleENvdW50LCBpbml0KTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx1bnNpZ25lZCBOPgorICAgIGlubGluZSBDMlNpbXBsZVZhbHVlU3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IFQoJmluaXQpW05dKSB7CisgICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQodmFsdWUsIGZsZXhDb3VudCwgaW5pdCk7CisgICAgfQorfTsKKworLy8vIEB9CisKKy8qKgorICogQSBzdHJ1Y3R1cmUgdGVtcGxhdGUgZW5jYXBzdWxhdGluZyBhIHNpbmdsZSBmbGV4aWJsZSBhcnJheSBlbGVtZW50IG9mIGEgc3BlY2lmaWMgdHlwZSAoVCkgd2l0aAorICogZGVmYXVsdCBjb25zdHJ1Y3RvcnMgYW5kIG5vIGNvcmUtaW5kZXguIFRoaXMgdHlwZSBjYW5ub3QgYmUgY29uc3RydWN0ZWQgb24gaXRzIG93biBhcyBpdCdzIHNpemUKKyAqIGlzIDAuIEluc3RlYWQsIGl0IGlzIG1lYW50IHRvIGJlIHVzZWQgYXMgYSBwYXJhbWV0ZXIsIGUuZy4KKyAqCisgKiAgIHR5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8QzJNeUZhbmN5U3RydWN0PiwKKyAqICAgICAgICAgICBrUGFyYW1JbmRleE15RmFuY3lBcnJheVN0cmVhbVBhcmFtPiBDMk15RmFuY3lBcnJheVN0cmVhbUluZm87CisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJTaW1wbGVBcnJheVN0cnVjdCB7CisgICAgc3RhdGljX2Fzc2VydCghc3RkOjppc19zYW1lPFQsIGNoYXI+Ojp2YWx1ZSAmJiAhc3RkOjppc19zYW1lPFQsIHVpbnQ4X3Q+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJ1c2UgQzJTaW1wbGVWYWx1ZVN0cnVjdDxUW10+IGlzIGZvciBCTE9CIG9yIFNUUklORyIpOworCisgICAgVCB2YWx1ZXNbXTsgLy8vPCBhcnJheSBtZW1iZXIKKyAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3RvcgorICAgIGlubGluZSBDMlNpbXBsZUFycmF5U3RydWN0KCkgPSBkZWZhdWx0OworICAgIERFRklORV9CQVNFX0ZMRVhfQzJTVFJVQ1QoU2ltcGxlQXJyYXksIHZhbHVlcykKKyAgICAvL0ZMRVgoQzJTaW1wbGVBcnJheVN0cnVjdCwgdmFsdWVzKQorCitwcml2YXRlOgorICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhIEMyTWVtb3J5QmxvY2suCisgICAgLy8vIFVzZWQgb25seSBieSB0aGUgZmxleGlibGUgcGFyYW1ldGVyIGFsbG9jYXRvcnMgKEFsbG9jVW5pcXVlICYgQWxsb2NTaGFyZWQpLgorICAgIGlubGluZSBDMlNpbXBsZUFycmF5U3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IEMyTWVtb3J5QmxvY2s8VD4gJmJsb2NrKSB7CisgICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQodmFsdWVzLCBmbGV4Q291bnQsIGJsb2NrKTsKKyAgICB9CisKKyAgICAvLy8gQ29uc3RydWN0IGZyb20gYW4gaW5pdGlhbGl6ZXIgbGlzdC4KKyAgICAvLy8gVXNlZCBvbmx5IGJ5IHRoZSBmbGV4aWJsZSBwYXJhbWV0ZXIgYWxsb2NhdG9ycyAoQWxsb2NVbmlxdWUgJiBBbGxvY1NoYXJlZCkuCisgICAgaW5saW5lIEMyU2ltcGxlQXJyYXlTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+ICZpbml0KSB7CisgICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQodmFsdWVzLCBmbGV4Q291bnQsIGluaXQpOworICAgIH0KKworICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhbiB2ZWN0b3IuCisgICAgLy8vIFVzZWQgb25seSBieSB0aGUgZmxleGlibGUgcGFyYW1ldGVyIGFsbG9jYXRvcnMgKEFsbG9jVW5pcXVlICYgQWxsb2NTaGFyZWQpLgorICAgIGlubGluZSBDMlNpbXBsZUFycmF5U3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZpbml0KSB7CisgICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQodmFsdWVzLCBmbGV4Q291bnQsIGluaXQpOworICAgIH0KKworICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhbm90aGVyIGZsZXhpYmxlIGFycmF5LgorICAgIC8vLyBVc2VkIG9ubHkgYnkgdGhlIGZsZXhpYmxlIHBhcmFtZXRlciBhbGxvY2F0b3JzIChBbGxvY1VuaXF1ZSAmIEFsbG9jU2hhcmVkKS4KKyAgICB0ZW1wbGF0ZTx1bnNpZ25lZCBOPgorICAgIGlubGluZSBDMlNpbXBsZUFycmF5U3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IFQoJmluaXQpW05dKSB7CisgICAgICAgIF9DMlZhbHVlQXJyYXlIZWxwZXI6OmluaXQodmFsdWVzLCBmbGV4Q291bnQsIGluaXQpOworICAgIH0KK307CisKKy8qKgorICogXGFkZHRvZ3JvdXAgc2ltcGxldmFsdWUgU2ltcGxlIHZhbHVlIGFuZCBhcnJheSBzdHJ1Y3R1cmVzLgorICogQHsKKyAqCisgKiBTaW1wbGUgdmFsdWUgc3RydWN0dXJlcy4KKyAqCisgKiBTdHJ1Y3R1cmVzIGNvbnRhaW5pbmcgYSBzaW5nbGUgc2ltcGxlIHZhbHVlLiBUaGVzZSBjYW4gYmUgcmV1c2VkIHRvIGVhc2lseSBkZWZpbmUgc2ltcGxlCisgKiBwYXJhbWV0ZXJzIG9mIHZhcmlvdXMgdHlwZXM6CisgKgorICogICB0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMkludDMyVmFsdWUsIGtQYXJhbUluZGV4TXlJbnRlZ2VyUG9ydFBhcmFtPgorICogICAgICAgICAgIEMyTXlJbnRlZ2VyUG9ydFBhcmFtVHVuaW5nOworICoKKyAqIFRoZXkgY29udGFpbiBhIHNpbmdsZSBtZW1iZXIgKHZhbHVlIG9yIHZhbHVlcykgdGhhdCBpcyBkZXNjcmliZWQgYXMgInZhbHVlIiBvciAidmFsdWVzIi4KKyAqCisgKiBUaGVzZSBzdHJ1Y3R1cmVzIGRvbid0IGRlZmluZSBhIGNvcmUgaW5kZXgsIGFuZCBhcyBzdWNoLCB0aGV5IGNhbm5vdCBiZSB1c2VkIGluIHN0cnVjdHVyZQorICogZGVjbGFyYXRpb25zLiBVc2UgdHlwZVtdIGluc3RlYWQsIHN1Y2ggYXMgaW50MzJfdCBmaWVsZFtdLgorICovCisvLy8gQSAzMi1iaXQgc2lnbmVkIGludGVnZXIgcGFyYW1ldGVyIGluIHZhbHVlLCBkZXNjcmliZWQgYXMgInZhbHVlIgordHlwZWRlZiBDMlNpbXBsZVZhbHVlU3RydWN0PGludDMyX3Q+IEMySW50MzJWYWx1ZTsKKy8vLyBBIDMyLWJpdCBzaWduZWQgaW50ZWdlciBhcnJheSBwYXJhbWV0ZXIgaW4gdmFsdWVzLCBkZXNjcmliZWQgYXMgInZhbHVlcyIKK3R5cGVkZWYgQzJTaW1wbGVBcnJheVN0cnVjdDxpbnQzMl90PiBDMkludDMyQXJyYXk7CisvLy8gQSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciBwYXJhbWV0ZXIgaW4gdmFsdWUsIGRlc2NyaWJlZCBhcyAidmFsdWUiCit0eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8dWludDMyX3Q+IEMyVWludDMyVmFsdWU7CisvLy8gQSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciBhcnJheSBwYXJhbWV0ZXIgaW4gdmFsdWVzLCBkZXNjcmliZWQgYXMgInZhbHVlcyIKK3R5cGVkZWYgQzJTaW1wbGVBcnJheVN0cnVjdDx1aW50MzJfdD4gQzJVaW50MzJBcnJheTsKKy8vLyBBIDY0LWJpdCBzaWduZWQgaW50ZWdlciBwYXJhbWV0ZXIgaW4gdmFsdWUsIGRlc2NyaWJlZCBhcyAidmFsdWUiCit0eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8aW50NjRfdD4gQzJJbnQ2NFZhbHVlOworLy8vIEEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyIGFycmF5IHBhcmFtZXRlciBpbiB2YWx1ZXMsIGRlc2NyaWJlZCBhcyAidmFsdWVzIgordHlwZWRlZiBDMlNpbXBsZUFycmF5U3RydWN0PGludDY0X3Q+IEMySW50NjRBcnJheTsKKy8vLyBBIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHBhcmFtZXRlciBpbiB2YWx1ZSwgZGVzY3JpYmVkIGFzICJ2YWx1ZSIKK3R5cGVkZWYgQzJTaW1wbGVWYWx1ZVN0cnVjdDx1aW50NjRfdD4gQzJVaW50NjRWYWx1ZTsKKy8vLyBBIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGFycmF5IHBhcmFtZXRlciBpbiB2YWx1ZXMsIGRlc2NyaWJlZCBhcyAidmFsdWVzIgordHlwZWRlZiBDMlNpbXBsZUFycmF5U3RydWN0PHVpbnQ2NF90PiBDMlVpbnQ2NEFycmF5OworLy8vIEEgZmxvYXQgcGFyYW1ldGVyIGluIHZhbHVlLCBkZXNjcmliZWQgYXMgInZhbHVlIgordHlwZWRlZiBDMlNpbXBsZVZhbHVlU3RydWN0PGZsb2F0PiBDMkZsb2F0VmFsdWU7CisvLy8gQSBmbG9hdCBhcnJheSBwYXJhbWV0ZXIgaW4gdmFsdWVzLCBkZXNjcmliZWQgYXMgInZhbHVlcyIKK3R5cGVkZWYgQzJTaW1wbGVBcnJheVN0cnVjdDxmbG9hdD4gQzJGbG9hdEFycmF5OworLy8vIEEgYmxvYiBmbGV4aWJsZSBwYXJhbWV0ZXIgaW4gdmFsdWUsIGRlc2NyaWJlZCBhcyAidmFsdWUiCit0eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8dWludDhfdFtdPiBDMkJsb2JWYWx1ZTsKKy8vLyBBIHN0cmluZyBmbGV4aWJsZSBwYXJhbWV0ZXIgaW4gdmFsdWUsIGRlc2NyaWJlZCBhcyAidmFsdWUiCit0eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8Y2hhcltdPiBDMlN0cmluZ1ZhbHVlOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8VD46OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4geyBERVNDUklCRV9DMkZJRUxEKHZhbHVlLCAidmFsdWUiKSB9OworfQordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlNpbXBsZVZhbHVlU3RydWN0PFRbXT46OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4geyBERVNDUklCRV9DMkZJRUxEKHZhbHVlLCAidmFsdWUiKSB9OworfQordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlNpbXBsZUFycmF5U3RydWN0PFQ+OjpGaWVsZExpc3QoKSB7CisgICAgcmV0dXJuIHsgREVTQ1JJQkVfQzJGSUVMRCh2YWx1ZXMsICJ2YWx1ZXMiKSB9OworfQorCisvLy8gQH0KKworLy8vIEB9CisKKyNlbmRpZiAgLy8gQzJQQVJBTV9ERUZfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJXb3JrLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyV29yay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MjNmM2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyV29yay5oCkBAIC0wLDAgKzEsMjM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMldPUktfSF8KKworI2RlZmluZSBDMldPUktfSF8KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkYm9vbC5oPgorCisvLy8gXGRlZmdyb3VwIHdvcmsgV29yayBhbmQgZGF0YSBwcm9jZXNzaW5nCisvLy8gQHsKKworLyoqCisgKiBJbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoZSByZWFzb24gYSBwYXJhbWV0ZXIgc2V0dGluZ3MgbWF5IGZhaWwsIG9yCisgKiBtYXkgYmUgb3ZlcnJpZGVuLgorICovCitzdHJ1Y3QgQzJTZXR0aW5nUmVzdWx0IHsKKyAgICBlbnVtIEZhaWx1cmUgOiB1aW50MzJfdCB7CisgICAgICAgIC8qIHBhcmFtZXRlciBmYWlsdXJlcyBiZWxvdyAqLworICAgICAgICBCQURfVFlQRSwgICAvLy88IHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkCisgICAgICAgIEJBRF9QT1JULCAgIC8vLzwgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIHNwZWNpZmljIHBvcnQKKyAgICAgICAgQkFEX0lOREVYLCAgLy8vPCBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGUgc3BlY2lmaWMgc3RyZWFtCisgICAgICAgIFJFQURfT05MWSwgIC8vLzwgcGFyYW1ldGVyIGlzIHJlYWQtb25seSBhbmQgY2Fubm90IGJlIHNldAorICAgICAgICBNSVNNQVRDSCwgICAvLy88IHBhcmFtZXRlciBtaXNtYXRjaGVzIGlucHV0IGRhdGEKKworICAgICAgICAvKiBmaWVsZCBmYWlsdXJlcyBiZWxvdyAqLworICAgICAgICBCQURfVkFMVUUsICAvLy88IHN0cmljdCBwYXJhbWV0ZXIgZG9lcyBub3QgYWNjZXB0IHZhbHVlIGZvciB0aGUgZmllbGQgYXQgYWxsCisgICAgICAgIENPTkZMSUNULCAgIC8vLzwgc3RyaWN0IHBhcmFtZXRlciBmaWVsZCB2YWx1ZSBpcyBpbiBjb25mbGljdCB3aXRoIGFuL290aGVyIHNldHRpbmcocykKKworICAgICAgICAvLy8gcGFyYW1ldGVyIGZpZWxkIGlzIG91dCBvZiByYW5nZSBkdWUgdG8gb3RoZXIgc2V0dGluZ3MgKHRoaXMgZmFpbHVyZSBtb2RlCisgICAgICAgIC8vLyBjYW4gb25seSBiZSB1c2VkIGZvciBzdHJpY3QgY2FsY3VsYXRlZCBwYXJhbWV0ZXJzKQorICAgICAgICBVTlNVUFBPUlRFRCwKKworICAgICAgICAvLy8gZmllbGQgZG9lcyBub3QgYWNjZXNzIHRoZSByZXF1ZXN0ZWQgcGFyYW1ldGVyIHZhbHVlIGF0IGFsbC4gSXQgaGFzIGJlZW4gY29ycmVjdGVkIHRvCisgICAgICAgIC8vLyB0aGUgY2xvc2VzdCBzdXBwb3J0ZWQgdmFsdWUuIFRoaXMgZmFpbHVyZSBtb2RlIGlzIHByb3ZpZGVkIHRvIGdpdmUgZ3VpZGFuY2UgYXMgdG8gd2hhdAorICAgICAgICAvLy8gYXJlIHRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyBmb3IgdGhpcyBmaWVsZCAod2hpY2ggbWF5IGJlIGEgc3Vic2V0IG9mIHRoZSBhdC1hbGwtCisgICAgICAgIC8vLyBwb3RlbnRpYWwgdmFsdWVzKQorICAgICAgICBJTkZPX0JBRF9WQUxVRSwKKworICAgICAgICAvLy8gcmVxdWVzdGVkIHBhcmFtZXRlciB2YWx1ZSBpcyBpbiBjb25mbGljdCB3aXRoIGFuL290aGVyIHNldHRpbmcocykKKyAgICAgICAgLy8vIGFuZCBoYXMgYmVlbiBjb3JyZWN0ZWQgdG8gdGhlIGNsb3Nlc3Qgc3VwcG9ydGVkIHZhbHVlLiBUaGlzIGZhaWx1cmUKKyAgICAgICAgLy8vIG1vZGUgaXMgZ2l2ZW4gdG8gcHJvdmlkZSBndWlkYW5jZSBhcyB0byB3aGF0IGFyZSB0aGUgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgYXMgd2VsbAorICAgICAgICAvLy8gYXMgdG8gb3B0aW9uYWxseSBwcm92aWRlIHN1Z2dlc3Rpb24gdG8gdGhlIGNsaWVudCBhcyB0byBob3cgdG8gZW5hYmxlIHRoZSByZXF1ZXN0ZWQKKyAgICAgICAgLy8vIHBhcmFtZXRlciB2YWx1ZS4KKyAgICAgICAgSU5GT19DT05GTElDVCwKKyAgICB9OworCisgICAgRmFpbHVyZSBmYWlsdXJlOyAgICAvLy88IGZhaWx1cmUgY29kZQorCisgICAgLy8vIEZhaWxpbmcgKG9yIGNvcnJlY3RlZCkgZmllbGQgb3IgcGFyYW1ldGVyYW5kIG9wdGlvbmFsbHksIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIGZvciB0aGUKKyAgICAvLy8gZmllbGQuIFZhbHVlcyBtdXN0IG9ubHkgYmUgc2V0IGZvciBmaWVsZCBmYWlsdXJlcyBvdGhlciB0aGFuIEJBRF9WQUxVRSwgYW5kIG9ubHkgaWYgdGhleSBhcmUKKyAgICAvLy8gZGlmZmVyZW50IGZyb20gdGhlIGdsb2JhbGx5IHN1cHBvcnRlZCB2YWx1ZXMgKGUuZy4gZHVlIHRvIHJlc3RyaWN0aW9ucyBieSBhbm90aGVyIHBhcmFtIG9yCisgICAgLy8vIGlucHV0IGRhdGEpLgorICAgIEMyUGFyYW1GaWVsZFZhbHVlcyBmaWVsZDsKKworICAgIC8vLyBDb25mbGljdGluZyBwYXJhbWV0ZXJzIG9yIGZpZWxkcyB3aXRoIG9wdGlvbmFsIHN1Z2dlc3Rpb25zIHdpdGggKG9wdGlvbmFsKSBzdWdnZXN0ZWQgdmFsdWVzCisgICAgLy8vIGZvciBhbnkgY29uZmxpY3RpbmcgZmllbGRzIHRvIGF2b2lkIHRoZSBjb25mbGljdC4gTXVzdCBvbmx5IGJlIHNldCBmb3IgQ09ORkxJQ1QsIFVOU1VQUE9SVEVECisgICAgLy8vIGFuZCBJTkZPX0NPTkZMSUNUIGZhaWx1cmUgY29kZXMuCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbUZpZWxkVmFsdWVzPiBjb25mbGljdHM7Cit9OworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBXT1JLCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyoqIFVuaXF1ZSBJRCBmb3IgYSBwcm9jZXNzaW5nIG5vZGUuICovCit0eXBlZGVmIHVpbnQzMl90IGMyX25vZGVfaWRfdDsKKworZW51bSB7CisgICAga1BhcmFtSW5kZXhXb3JrT3JkaW5hbCwKK307CisKKy8qKgorICogSW5mb3JtYXRpb24gZm9yIG9yZGVyaW5nIHdvcmsgaXRlbXMgb24gYSBjb21wb25lbnQgcG9ydC4KKyAqLworc3RydWN0IEMyV29ya09yZGluYWxTdHJ1Y3QgeworLy9wdWJsaWM6CisgICAgYzJfY250cjY0X3QgdGltZXN0YW1wOyAgICAgLyoqIGZyYW1lIHRpbWVzdGFtcCBpbiBtaWNyb3NlY29uZHMgKi8KKyAgICBjMl9jbnRyNjRfdCBmcmFtZUluZGV4OyAgICAvKiogc3VibWlzc2lvbiBvcmRpbmFsIG9uIHRoZSBpbml0aWFsIGNvbXBvbmVudCAqLworICAgIGMyX2NudHI2NF90IGN1c3RvbU9yZGluYWw7IC8qKiBjYW4gYmUgZ2l2ZW4gYnkgdGhlIGNvbXBvbmVudCwgZS5nLiBkZWNvZGUgb3JkZXIgKi8KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoV29ya09yZGluYWwpCisgICAgQzJGSUVMRCh0aW1lc3RhbXAsICJ0aW1lc3RhbXAiKQorICAgIEMyRklFTEQoZnJhbWVJbmRleCwgImZyYW1lLWluZGV4IikKKyAgICBDMkZJRUxEKGN1c3RvbU9yZGluYWwsICJjdXN0b20tb3JkaW5hbCIpCit9OworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIHJlcHJlc2VudHMgYSBDb2RlYyAyLjAgZnJhbWUgd2l0aCBpdHMgbWV0YWRhdGEuCisgKgorICogQSBmcmFtZSBiYXNpY2FsbHkgY29uc2lzdHMgb2YgYW4gb3JkZXJlZCBzZXRzIG9mIGJ1ZmZlcnMsIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBhbmQgaW5mbyBidWZmZXJzCisgKiBhbG9uZyB3aXRoIHNvbWUgbm9uLWNvbmZpZ3VyYXRpb24gbWV0YWRhdGEuCisgKi8KK3N0cnVjdCBDMkZyYW1lRGF0YSB7CisvL3B1YmxpYzoKKyAgICBlbnVtIGZsYWdzX3QgOiB1aW50MzJfdCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBGb3IgaW5wdXQgZnJhbWVzOiBubyBvdXRwdXQgZnJhbWUgc2hhbGwgYmUgZ2VuZXJhdGVkIHdoZW4gcHJvY2Vzc2luZyB0aGlzIGZyYW1lLCBidXQKKyAgICAgICAgICogbWV0YWRhdGEgc2hhbGwgc3RpbGwgYmUgcHJvY2Vzc2VkLgorICAgICAgICAgKiBGb3Igb3V0cHV0IGZyYW1lczogdGhpcyBmcmFtZSBzaGFsbCBiZSBkaXNjYXJkZWQgYW5kIGJ1dCBtZXRhZGF0YSBpcyBzdGlsbCB2YWxpZC4KKyAgICAgICAgICovCisgICAgICAgIEZMQUdfRFJPUF9GUkFNRSAgICA9ICgxIDw8IDApLAorICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBmcmFtZSBpcyB0aGUgbGFzdCBmcmFtZSBvZiB0aGUgY3VycmVudCBzdHJlYW0uIEZ1cnRoZXIgZnJhbWVzIGFyZSBwYXJ0IG9mIGEgbmV3CisgICAgICAgICAqIHN0cmVhbS4KKyAgICAgICAgICovCisgICAgICAgIEZMQUdfRU5EX09GX1NUUkVBTSA9ICgxIDw8IDEpLAorICAgICAgICAvKioKKyAgICAgICAgICogVGhpcyBmcmFtZSBzaGFsbCBiZSBkaXNjYXJkZWQgd2l0aCBpdHMgbWV0YWRhdGEuCisgICAgICAgICAqIFRoaXMgZmxhZyBpcyBvbmx5IHNldCBieSBjb21wb25lbnRzIC0gZS5nLiBhcyBhIHJlc3BvbnNlIHRvIHRoZSBmbHVzaCBjb21tYW5kLgorICAgICAgICAgKi8KKyAgICAgICAgRkxBR19ESVNDQVJEX0ZSQU1FID0gKDEgPDwgMiksCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGZyYW1lIGlzIG5vdCB0aGUgbGFzdCBmcmFtZSBwcm9kdWNlZCBmb3IgdGhlIGlucHV0LgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIGZsYWcgaXMgbm9ybWFsbHkgc2V0IGJ5IHRoZSBjb21wb25lbnQgLSBlLmcuIHdoZW4gYW4gaW5wdXQgZnJhbWUgcmVzdWx0cyBpbiBtdWx0aXBsZQorICAgICAgICAgKiBvdXRwdXQgZnJhbWVzLCB0aGlzIGZsYWcgaXMgc2V0IG9uIGFsbCBidXQgdGhlIGxhc3Qgb3V0cHV0IGZyYW1lLgorICAgICAgICAgKgorICAgICAgICAgKiBBbHNvLCB3aGVuIGNvbXBvbmVudHMgYXJlIGNoYWluZWQsIHRoaXMgZmxhZyBzaG91bGQgYmUgcHJvcGFnYXRlZCBkb3duIHRoZQorICAgICAgICAgKiB3b3JrIGNoYWluLiBUaGF0IGlzLCBpZiBzZXQgb24gYW4gZWFybGllciBmcmFtZSBvZiBhIHdvcmstY2hhaW4sIGl0IHNob3VsZCBiZSBwcm9wYWdhdGVkCisgICAgICAgICAqIHRvIGFsbCBsYXRlciBmcmFtZXMgaW4gdGhhdCBjaGFpbi4gQWRkaXRpb25hbGx5LCBjb21wb25lbnRzIGRvd24gdGhlIGNoYWluIGNvdWxkIHNldAorICAgICAgICAgKiB0aGlzIGZsYWcgZXZlbiBpZiBub3Qgc2V0IGVhcmxpZXIsIGUuZy4gaWYgbXVsdGlwbGUgb3V0cHV0IGZyYW1lIGlzIGdlbmVyYXRlZCBhdCB0aGF0CisgICAgICAgICAqIGNvbXBvbmVudCBmb3IgdGhlIGlucHV0IGZyYW1lLgorICAgICAgICAgKi8KKyAgICAgICAgRkxBR19JTkNPTVBMRVRFID0gKDEgPDwgMyksCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGZyYW1lIGNvbnRhaW5zIG9ubHkgY29kZWMtc3BlY2lmaWMgY29uZmlndXJhdGlvbiBkYXRhLCBhbmQgbm8gYWN0dWFsIGFjY2VzcyB1bml0LgorICAgICAgICAgKgorICAgICAgICAgKiBcZGVwcmVjYXRlZCBwYXNzIGNvZGVjIGNvbmZpZ3VyYXRpb24gd2l0aCB1c2luZyB0aGUgXHRvZG8gY29kZWMtc3BlY2lmaWMgY29uZmlndXJhdGlvbgorICAgICAgICAgKiBpbmZvIHRvZ2V0aGVyIHdpdGggdGhlIGFjY2VzcyB1bml0LgorICAgICAgICAgKi8KKyAgICAgICAgRkxBR19DT0RFQ19DT05GSUcgID0gKDF1IDw8IDMxKSwKKyAgICB9OworCisgICAgLyoqCisgICAgICogRnJhbWUgZmxhZ3MgKi8KKyAgICBmbGFnc190ICBmbGFnczsKKyAgICBDMldvcmtPcmRpbmFsU3RydWN0IG9yZGluYWw7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPj4gYnVmZmVyczsKKyAgICAvLzwgZm9yIGluaXRpYWwgd29yayBpdGVtLCB0aGVzZSBtYXkgYWxzbyBjb21lIGZyb20gdGhlIHBhcnNlciAtIGlmIHByb3ZpZGVkCisgICAgLy88IGZvciBvdXRwdXQgYnVmZmVycywgdGhlc2UgYXJlIHRoZSByZXNwb25zZXMgdG8gcmVxdWVzdGVkSW5mb3MKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICAgICAgY29uZmlnVXBkYXRlOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMkluZm9CdWZmZXI+PiBpbmZvQnVmZmVyczsKK307CisKK3N0cnVjdCBDMldvcmtsZXQgeworLy9wdWJsaWM6CisgICAgLy8gSU4KKyAgICBjMl9ub2RlX2lkX3QgY29tcG9uZW50OworCisgICAgLyoqIENvbmZpZ3VyYXRpb24gY2hhbmdlcyB0byBiZSBhcHBsaWVkIGJlZm9yZSBwcm9jZXNzaW5nIHRoaXMgd29ya2xldC4gKi8KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJUdW5pbmc+PiB0dW5pbmdzOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKworICAgIC8vIE9VVAorICAgIEMyRnJhbWVEYXRhIG91dHB1dDsKK307CisKKy8qKgorICogSW5mb3JtYXRpb24gYWJvdXQgcGFydGlhbCB3b3JrLWNoYWlucyBub3QgcGFydCBvZiB0aGUgY3VycmVudCB3b3JrIGl0ZW1zLgorICoKKyAqIFRvIGJlIGRlZmluZWQgbGF0ZXIuCisgKi8KK3N0cnVjdCBDMldvcmtDaGFpbkluZm87CisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgYWxsIGEgc2luZ2xlIHdvcmsgaXRlbS4KKyAqCisgKiBUaGlzIHN0cnVjdHVyZSBzaGFsbCBiZSBwYXNzZWQgYnkgdGhlIGNsaWVudCB0byB0aGUgY29tcG9uZW50IGZvciB0aGUgZmlyc3Qgd29ya2xldC4gQXMgc3VjaCwKKyAqIHdvcmtsZXRzIG11c3Qgbm90IGJlIGVtcHR5LiBUaGUgb3duZXJzaGlwIG9mIHRoaXMgb2JqZWN0IGlzIHBhc3NlZC4KKyAqLworc3RydWN0IEMyV29yayB7CisvL3B1YmxpYzoKKyAgICAvLy8gYWRkaXRpb25hbCB3b3JrIGNoYWluIGluZm8gbm90IHBhcnQgb2YgdGhpcyB3b3JrCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyV29ya0NoYWluSW5mbz4gY2hhaW5JbmZvOworCisgICAgLy8vIFRoZSBpbnB1dCBkYXRhIHRvIGJlIHByb2Nlc3NlZCBhcyBwYXJ0IG9mIHRoaXMgd29yay93b3JrLWNoYWluLiBUaGlzIGlzIHByb3ZpZGVkIGJ5IHRoZQorICAgIC8vLyBjbGllbnQgd2l0aCBvd25lcnNoaXAuIFdoZW4gdGhlIHdvcmsgaXMgcmV0dXJuZWQgKHZpYSBvbldvcmtEb25lKSwgdGhlIGlucHV0IGJ1ZmZlci1wYWNrJ3MKKyAgICAvLy8gYnVmZmVyIHZlY3RvciBzaGFsbCBjb250YWluIG51bGxwdHJzLgorICAgIEMyRnJhbWVEYXRhIGlucHV0OworCisgICAgLy8vIFRoZSBjaGFpbiBvZiBjb21wb25lbnRzLCB0dW5pbmdzIChpbmNsdWRpbmcgb3V0cHV0IGJ1ZmZlciBwb29sIElEcykgYW5kIGluZm8gcmVxdWVzdHMgdGhhdCB0aGUKKyAgICAvLy8gZGF0YSBtdXN0IHBhc3MgdGhyb3VnaC4gSWYgdGhpcyBoYXMgbW9yZSB0aGFuIGEgc2luZ2xlIGVsZW1lbnQsIHRoZSB0dW5uZWxzIGJldHdlZW4gc3VjY2Vzc2l2ZQorICAgIC8vLyBjb21wb25lbnRzIG9mIHRoZSB3b3JrbGV0IGNoYWluIG11c3QgaGF2ZSBiZWVuIChzdWNjZXNzZnVsbHkpIHByZS1yZWdpc3RlcmVkIGF0IHRoZSB0aW1lIHRoYXQKKyAgICAvLy8gdGhlIHdvcmsgaXMgc3VibWl0dGVkLiBBbGxvY2F0aW5nIHRoZSBvdXRwdXQgYnVmZmVycyBpbiB0aGUgd29ya2xldHMgaXMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mCisgICAgLy8vIGVhY2ggY29tcG9uZW50LiBVcG9uIHdvcmsgc3VibWlzc2lvbiwgZWFjaCBvdXRwdXQgYnVmZmVyLXBhY2sgc2hhbGwgYmUgYW4gYXBwcm9wcmlhdGVseSBzaXplZAorICAgIC8vLyB2ZWN0b3IgY29udGFpbmluZyBudWxscHRycy4gV2hlbiB0aGUgd29yayBpcyBjb21wbGV0ZWQvcmV0dXJuZWQgdG8gdGhlIGNsaWVudCwgb3V0cHV0IGJ1ZmZlcnMKKyAgICAvLy8gcG9pbnRlcnMgZnJvbSBhbGwgYnV0IHRoZSBmaW5hbCB3b3JrbGV0IHNoYWxsIGJlIG51bGxwdHJzLgorICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrbGV0Pj4gd29ya2xldHM7CisKKyAgICAvLy8gTnVtYmVyIG9mIHdvcmtsZXRzIHN1Y2Nlc3NmdWxseSBwcm9jZXNzZWQgaW4gdGhpcyBjaGFpbi4gVGhpcyBzaGFsbCBiZSBpbml0aWFsaXplZCB0byAwIGJ5IHRoZQorICAgIC8vLyBjbGllbnQgd2hlbiB0aGUgd29yayBpcyBzdWJtaXR0ZWQuIEl0IHNoYWxsIGNvbnRhaW4gdGhlIG51bWJlciBvZiB3b3JrbGV0cyB0aGF0IHdlcmUKKyAgICAvLy8gc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCB3aGVuIHRoZSB3b3JrIGlzIHJldHVybmVkIHRvIHRoZSBjbGllbnQuIElmIHRoaXMgaXMgbGVzcyB0aGVuIHRoZSBudW1iZXIKKyAgICAvLy8gb2Ygd29ya2xldHMsIHJlc3VsdCBtdXN0IG5vdCBiZSBzdWNjZXNzLiBJdCBtdXN0IGJlIGluIHRoZSByYW5nZSBvZiBbMCwgd29ya2xldHMuc2l6ZSgpXS4KKyAgICB1aW50MzJfdCB3b3JrbGV0c1Byb2Nlc3NlZDsKKworICAgIC8vLyBUaGUgZmluYWwgb3V0Y29tZSBvZiB0aGUgd29yayAoY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudCB3b3JrbGV0c1Byb2Nlc3NlZCkuIElmIDAgd2hlbgorICAgIC8vLyB3b3JrIGlzIHJldHVybmVkLCBpdCBpcyBhc3N1bWVkIHRoYXQgYWxsIHdvcmtsZXRzIGhhdmUgYmVlbiBwcm9jZXNzZWQuCisgICAgYzJfc3RhdHVzX3QgcmVzdWx0OworfTsKKworLyoqCisgKiBJbmZvcm1hdGlvbiBhYm91dCBhIGZ1dHVyZSB3b3JrIHRvIGJlIHN1Ym1pdHRlZCB0byB0aGUgY29tcG9uZW50LiBUaGUgaW5mb3JtYXRpb24gaXMgdXNlZCB0bworICogcmVzZXJ2ZSB0aGUgd29yayBmb3Igd29yayBvcmRlcmluZyBwdXJwb3Nlcy4KKyAqLworc3RydWN0IEMyV29ya091dGxpbmUgeworLy9wdWJsaWM6CisgICAgQzJXb3JrT3JkaW5hbFN0cnVjdCBvcmRpbmFsOworICAgIHN0ZDo6dmVjdG9yPGMyX25vZGVfaWRfdD4gY2hhaW47Cit9OworCisvLy8gQH0KKworI2VuZGlmICAvLyBDMldPUktfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvX0MyTWFjcm9VdGlscy5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9fQzJNYWNyb1V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRlOWJhNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvX0MyTWFjcm9VdGlscy5oCkBAIC0wLDAgKzEsMTYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX01BQ1JPX1VUSUxTX0hfCisjZGVmaW5lIEMyVVRJTFNfTUFDUk9fVVRJTFNfSF8KKworLyoqIFxmaWxlCisgKiBNYWNybyB1dGlsaXRpZXMgZm9yIHRoZSB1dGlscyBsaWJyYXJ5IHVzZWQgYnkgQ29kZWMyIGltcGxlbWVudGF0aW9ucy4KKyAqLworCisvLy8gXGlmIDAKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZBUklBQkxFIEFSR1VNRU5UIENPVU5USU5HIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvLyByZW1vdmUgZW1wdHkgYXJndW1lbnRzIC0gX0MyX0FSRygpIGV4cGFuZHMgdG8gJycsIHdoaWxlIF9DMl9BUkcoeCkgZXhwYW5kcyB0byAnLCB4JworLy8gX0MyX0FSR24oLi4uKSBkb2VzIHRoZSBzYW1lIGZvciBuIGFyZ3VtZW50cworI2RlZmluZSBfQzJfQVJHKC4uLikgLCAjI19fVkFfQVJHU19fCisjZGVmaW5lIF9DMl9BUkcyKF8xLCBfMikgX0MyX0FSRyhfMSkgX0MyX0FSRyhfMikKKyNkZWZpbmUgX0MyX0FSRzQoXzEsIF8yLCBfMywgXzQpIF9DMl9BUkcyKF8xLCBfMikgX0MyX0FSRzIoXzMsIF80KQorI2RlZmluZSBfQzJfQVJHOChfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBfNywgXzgpIF9DMl9BUkc0KF8xLCBfMiwgXzMsIF80KSBfQzJfQVJHNChfNSwgXzYsIF83LCBfOCkKKyNkZWZpbmUgX0MyX0FSRzE2KF8xLCBfMiwgXzMsIF80LCBfNSwgXzYsIF83LCBfOCwgXzksIF8xMCwgXzExLCBfMTIsIF8xMywgXzE0LCBfMTUsIF8xNikgXAorICAgICAgICBfQzJfQVJHOChfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBfNywgXzgpIF9DMl9BUkc4KF85LCBfMTAsIF8xMSwgXzEyLCBfMTMsIF8xNCwgXzE1LCBfMTYpCisKKy8vIHJldHVybiB0aGUgNjV0aCBhcmd1bWVudAorI2RlZmluZSBfQzJfQVJHQ18zKF8sIF8wLCBfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBfNywgXzgsIF85LCBfMTAsIF8xMSwgXzEyLCBfMTMsIF8xNCwgXzE1LCBfMTYsIFwKKyAgICAgICAgXzE3LCBfMTgsIF8xOSwgXzIwLCBfMjEsIF8yMiwgXzIzLCBfMjQsIF8yNSwgXzI2LCBfMjcsIF8yOCwgXzI5LCBfMzAsIF8zMSwgXzMyLCBcCisgICAgICAgIF8zMywgXzM0LCBfMzUsIF8zNiwgXzM3LCBfMzgsIF8zOSwgXzQwLCBfNDEsIF80MiwgXzQzLCBfNDQsIF80NSwgXzQ2LCBfNDcsIF80OCwgXAorICAgICAgICBfNDksIF81MCwgXzUxLCBfNTIsIF81MywgXzU0LCBfNTUsIF81NiwgXzU3LCBfNTgsIF81OSwgXzYwLCBfNjEsIF82MiwgXzYzLCBfNjQsIC4uLikgXzY0CisKKy8vLyBcZW5kaWYKKworLyoqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgorICovCisvLyBXZSBkbyB0aGlzIGJ5IHByZXBlbmRpbmcgMSBhbmQgYXBwZW5kaW5nIDY1IGRlc2lnbmVkIHZhbHVlcyBzdWNoIHRoYXQgdGhlIDY1dGggZWxlbWVudAorLy8gd2lsbCBiZSB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KKyNkZWZpbmUgX0MyX0FSR0MoLi4uKSBfQzJfQVJHQ18xKDAsICMjX19WQV9BUkdTX18sIFwKKyAgICAgICAgNjQsIDYzLCA2MiwgNjEsIDYwLCA1OSwgNTgsIDU3LCA1NiwgNTUsIDU0LCA1MywgNTIsIDUxLCA1MCwgNDksIDQ4LCA0NywgNDYsIDQ1LCA0NCwgNDMsIFwKKyAgICAgICAgNDIsIDQxLCA0MCwgMzksIDM4LCAzNywgMzYsIDM1LCAzNCwgMzMsIDMyLCAzMSwgMzAsIDI5LCAyOCwgMjcsIDI2LCAyNSwgMjQsIDIzLCAyMiwgMjEsIFwKKyAgICAgICAgMjAsIDE5LCAxOCwgMTcsIDE2LCAxNSwgMTQsIDEzLCAxMiwgMTEsIDEwLCA5LCA4LCA3LCA2LCA1LCA0LCAzLCAyLCAxLCAwKQorCisvLy8gXGlmIDAKKworLy8gc3RlcCAxLiByZW1vdmUgZW1wdHkgYXJndW1lbnRzIC0gdGhpcyBpcyBuZWVkZWQgdG8gYWxsb3cgdHJhaWxpbmcgY29tbWEgaW4gZW51bSBkZWZpbml0aW9ucworLy8gKE5PVEU6IHdlIGRvbid0IGtub3cgd2hpY2ggYXJndW1lbnQgd2lsbCBoYXZlIHRoaXMgdHJhaWxpbmcgY29tbWEgc28gd2UgaGF2ZSB0byB0cnkgYWxsKQorI2RlZmluZSBfQzJfQVJHQ18xKF8sIF8wLCBfMSwgXzIsIF8zLCBfNCwgXzUsIF82LCBfNywgXzgsIF85LCBfMTAsIF8xMSwgXzEyLCBfMTMsIF8xNCwgXzE1LCBfMTYsIFwKKyAgICAgICAgXzE3LCBfMTgsIF8xOSwgXzIwLCBfMjEsIF8yMiwgXzIzLCBfMjQsIF8yNSwgXzI2LCBfMjcsIF8yOCwgXzI5LCBfMzAsIF8zMSwgXzMyLCBcCisgICAgICAgIF8zMywgXzM0LCBfMzUsIF8zNiwgXzM3LCBfMzgsIF8zOSwgXzQwLCBfNDEsIF80MiwgXzQzLCBfNDQsIF80NSwgXzQ2LCBfNDcsIF80OCwgXAorICAgICAgICBfNDksIF81MCwgXzUxLCBfNTIsIF81MywgXzU0LCBfNTUsIF81NiwgXzU3LCBfNTgsIF81OSwgXzYwLCBfNjEsIF82MiwgXzYzLCBfNjQsIC4uLikgXAorICAgIF9DMl9BUkdDXzIoXyBfQzJfQVJHKF8wKSBcCisgICAgX0MyX0FSRzE2KF8xLCBfMiwgXzMsIF80LCBfNSwgXzYsIF83LCBfOCwgXzksIF8xMCwgXzExLCBfMTIsIF8xMywgXzE0LCBfMTUsIF8xNikgXAorICAgIF9DMl9BUkcxNihfMTcsIF8xOCwgXzE5LCBfMjAsIF8yMSwgXzIyLCBfMjMsIF8yNCwgXzI1LCBfMjYsIF8yNywgXzI4LCBfMjksIF8zMCwgXzMxLCBfMzIpIFwKKyAgICBfQzJfQVJHMTYoXzMzLCBfMzQsIF8zNSwgXzM2LCBfMzcsIF8zOCwgXzM5LCBfNDAsIF80MSwgXzQyLCBfNDMsIF80NCwgXzQ1LCBfNDYsIF80NywgXzQ4KSBcCisgICAgX0MyX0FSRzE2KF80OSwgXzUwLCBfNTEsIF81MiwgXzUzLCBfNTQsIF81NSwgXzU2LCBfNTcsIF81OCwgXzU5LCBfNjAsIF82MSwgXzYyLCBfNjMsIF82NCksIFwKKyAgICAjI19fVkFfQVJHU19fKQorCisvLyBzdGVwIDIuIHRoaXMgaXMgbmVlZGVkIGFzIHJlbW92ZWQgYXJndW1lbnRzIGNhbm5vdCBiZSBwYXNzZWQgZGlyZWN0bHkgYXMgZW1wdHkgaW50byBhIG1hY3JvCisjZGVmaW5lIF9DMl9BUkdDXzIoLi4uKSBfQzJfQVJHQ18zKF9fVkFfQVJHU19fKQorCisvLy8gXGVuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFZBUklBQkxFIEFSR1VNRU5UIENPTlZFUlNJT04gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLy8vIFxpZiAwCisKKy8vIG1hY3JvcyB0aGF0IGNvbnZlcnQgXzEsIF8yLCBfMywgLi4uIHRvIGZuKF8xLCBhcmcpLCBmbihfMiwgYXJnKSwgZm4oXzMsIGFyZyksIC4uLgorI2RlZmluZSBfQzJfTUFQXzY0KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF82MyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzYzKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF82MihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzYyKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF82MShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzYxKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF82MChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzYwKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81OShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzU5KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81OChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzU4KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81NyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzU3KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81NihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzU2KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81NShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzU1KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81NChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzU0KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81MyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzUzKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81MihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzUyKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81MShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzUxKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81MChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzUwKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80OShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQ5KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80OChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQ4KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80NyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQ3KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80NihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQ2KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80NShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQ1KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80NChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQ0KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80MyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQzKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80MihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQyKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80MShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQxKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF80MChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQwKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zOShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzM5KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zOChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzM4KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zNyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzM3KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zNihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzM2KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zNShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzM1KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zNChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzM0KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zMyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzMzKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zMihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzMyKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zMShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzMxKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zMChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzMwKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yOShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzI5KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yOChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzI4KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yNyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzI3KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yNihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzI2KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yNShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzI1KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yNChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzI0KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yMyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzIzKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yMihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzIyKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yMShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzIxKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yMChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzIwKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xOShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzE5KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xOChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzE4KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xNyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzE3KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xNihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzE2KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xNShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzE1KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xNChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzE0KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xMyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzEzKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xMihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzEyKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xMShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzExKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8xMChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzEwKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF85KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfOShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfOChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzgoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzcoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF83KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF82KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzUoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF80KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8zKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMyhmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMihmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzIoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzEoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8xKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKQorCisvLy8gXGVuZGlmCisKKy8qKgorICogTWFwcyBlYWNoIGFyZ3VtZW50IHVzaW5nIGFub3RoZXIgbWFjcm8geCAtPiBmbih4LCBhcmcpCisgKi8KKy8vIHVzZSB3cmFwcGVyIHRvIGNhbGwgdGhlIHByb3BlciBtYXBwZXIgYmFzZWQgb24gdGhlIG51bWJlciBvZiBhcmd1bWVudHMKKyNkZWZpbmUgX0MyX01BUChmbiwgYXJnLCAuLi4pIF9DMl9NQVBfXyhfQzJfQVJHQyhfX1ZBX0FSR1NfXyksIGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisKKy8vLyBcaWYgMAorCisvLyBldmFsdWF0ZSBfbiBzbyBpdCBiZWNvbWVzIGEgbnVtYmVyCisjZGVmaW5lIF9DMl9NQVBfXyhfbiwgZm4sIGFyZywgLi4uKSBfQzJfTUFQXyhfbiwgZm4sIGFyZywgX19WQV9BUkdTX18pCisvLyBjYWxsIHRoZSBwcm9wZXIgbWFwcGVyCisjZGVmaW5lIF9DMl9NQVBfKF9uLCBmbiwgYXJnLCAuLi4pIF9DMl9NQVBfIyNfbiAoZm4sIGFyZywgX19WQV9BUkdTX18pCisKKy8vLyBcZW5kaWYKKworI2VuZGlmICAvLyBDMlVUSUxTX01BQ1JPX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL2FuZHJvaWQtQzJCdWZmZXIuaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvYW5kcm9pZC1DMkJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2YmVhYjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL2FuZHJvaWQtQzJCdWZmZXIuaApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyQlVGRkVSX0hfCisjZGVmaW5lIEFORFJPSURfQzJCVUZGRVJfSF8KKworI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPgorCisvKiBVc2UgYW5kcm9pZCBuYXRpdmUgaGFuZGxlIGZvciBDMkhhbmRsZSAqLwordHlwZWRlZiA6Om5hdGl2ZV9oYW5kbGVfdCBDMkhhbmRsZTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIEFuZHJvaWQgcGxhdGZvcm0gYnVmZmVyL21lbW9yeSB1c2FnZSBiaXRzLgorICovCitzdHJ1Y3QgQzJBbmRyb2lkTWVtb3J5VXNhZ2UgOiBwdWJsaWMgQzJNZW1vcnlVc2FnZSB7CisgICAgaW5saW5lIEMyQW5kcm9pZE1lbW9yeVVzYWdlKGNvbnN0IEMyTWVtb3J5VXNhZ2UgJnVzYWdlKSA6IEMyTWVtb3J5VXNhZ2UodXNhZ2UpIHsgfQorCisvLyBwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV1c2UgZ3JhbGxvYyBmbGFncyB3aGVyZSBwb3NzaWJsZSwgYXMgQ29kZWMgMi4wIEFQSSBvbmx5IHVzZXMgYml0cyAwIGFuZCAxLgorICAgICAqLworICAgIGVudW0gY29uc3VtZXJfdCA6IHVpbnQ2NF90IHsKKyAgICAgICAgUkVOREVSU0NSSVBUX1JFQUQgPSBHUkFMTE9DX1VTQUdFX1JFTkRFUlNDUklQVCwKKyAgICAgICAgSFdfVEVYVFVSRV9SRUFEICAgPSBHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUsCisgICAgICAgIEhXX0NPTVBPU0VSX1JFQUQgID0gR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUiwKKyAgICAgICAgLy8gZ3JhbGxvYyBkb2VzIG5vdCBkZWZpbmUgYSB2aWRlbyBkZWNvZGVyIHJlYWQgdXNhZ2UgZmxhZywgc28gdXNlIGVuY29kZXIgZm9yCisgICAgICAgIC8vIG5vdworICAgICAgICBIV19DT0RFQ19SRUFEICAgICA9IEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUiwKKyAgICAgICAgUkVBRF9QUk9URUNURUQgICAgPSBHUkFMTE9DX1VTQUdFX1BST1RFQ1RFRCwKKyAgICB9OworCisgICAgZW51bSBwcm9kdWNlcl90IDogdWludDY0X3QgeworICAgICAgICBSRU5ERVJTQ1JJUFRfV1JJVEUgPSBHUkFMTE9DX1VTQUdFX1JFTkRFUlNDUklQVCwKKyAgICAgICAgSFdfVEVYVFVSRV9XUklURSAgID0gR1JBTExPQ19VU0FHRV9IV19SRU5ERVIsCisgICAgICAgIEhXX0NPTVBPU0VSX1dSSVRFICA9IEdSQUxMT0NfVVNBR0VfSFdfQ09NUE9TRVIgfCBHUkFMTE9DX1VTQUdFX0hXX1JFTkRFUiwKKyAgICAgICAgSFdfQ09ERUNfV1JJVEUgICAgID0gR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSLAorICAgICAgICAvLyBncmFsbG9jIGRvZXMgbm90IGRlZmluZSBhIHdyaXRlIHByb3RlY3RlZCB1c2FnZSBmbGFnLCBzbyB1c2UgcmVhZCBwcm90ZWN0ZWQKKyAgICAgICAgLy8gbm93CisgICAgICAgIFdSSVRFX1BST1RFQ1RFRCAgICA9IEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVELAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0IGZyb20gZ3JhbGxvYyB1c2FnZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgQzJNZW1vcnlVc2FnZSBGcm9tR3JhbGxvY1VzYWdlKHVpbnQ2NF90IHVzYWdlKTsKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgdG8gZ3JhbGxvYyB1c2FnZS4KKyAgICAgKi8KKyAgICB1aW50NjRfdCBhc0dyYWxsb2NVc2FnZSgpIGNvbnN0OworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyQlVGRkVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE4MmE2OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvY29kZWMyLzEuMC9JbnB1dFN1cmZhY2UuaApAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0MyX1YxXzBfSU5QVVRfU1VSRkFDRV9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQzJfVjFfMF9JTlBVVF9TVVJGQUNFX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvY29kZWMyLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgR3JhcGhpY0J1ZmZlclNvdXJjZTsKKworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpzcDsKKwordHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OklHcmFwaGljQnVmZmVyUHJvZHVjZXIKKyAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3R5cGVkZWYgOjphbmRyb2lkOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKKy8vIFRPRE86IDo6YW5kcm9pZDo6VFdHcmFwaGljQnVmZmVyUHJvZHVjZXI8SUlucHV0U3VyZmFjZT4KK3R5cGVkZWYgOjphbmRyb2lkOjpUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBJbnB1dFN1cmZhY2VCYXNlOworCitjbGFzcyBJbnB1dFN1cmZhY2UgOiBwdWJsaWMgSW5wdXRTdXJmYWNlQmFzZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+SW5wdXRTdXJmYWNlKCkgPSBkZWZhdWx0OworCisgICAgLy8gTWV0aG9kcyBmcm9tIElJbnB1dFN1cmZhY2UKKyAgICBzcDxJbnB1dFN1cmZhY2VDb25uZWN0aW9uPiBjb25uZWN0VG9Db21wb25lbnQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8OjpDMkNvbXBvbmVudD4gJmNvbXApOworICAgIC8vIFRPRE86IGludGYoKQorCisgICAgc3RhdGljIHNwPElucHV0U3VyZmFjZT4gQ3JlYXRlKCk7CisKK3ByaXZhdGU6CisgICAgSW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgY29uc3Qgc3A8QkdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gJmJhc2UsCisgICAgICAgICAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OkdyYXBoaWNCdWZmZXJTb3VyY2U+ICZzb3VyY2UpOworCisgICAgc3A8OjphbmRyb2lkOjpHcmFwaGljQnVmZmVyU291cmNlPiBtU291cmNlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0MyX1YxXzBfSU5QVVRfU1VSRkFDRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9jb2RlYzIvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWFlM2FmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9jb2RlYzIvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0MyX1YxXzBfSU5QVVRfU1VSRkFDRV9DT05ORUNUSU9OX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9DMl9WMV8wX0lOUFVUX1NVUkZBQ0VfQ09OTkVDVElPTl9ICisKKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9jb2RlYzIvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworLy8gVE9ETzogaW5oZXJpdCBmcm9tIElJbnB1dFN1cmZhY2VDb25uZWN0aW9uCitjbGFzcyBJbnB1dFN1cmZhY2VDb25uZWN0aW9uIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorICAgIHZpcnR1YWwgfklucHV0U3VyZmFjZUNvbm5lY3Rpb24oKTsKKworICAgIC8vIEZyb20gSUlucHV0U3VyZmFjZUNvbm5lY3Rpb24KKyAgICB2b2lkIGRpc2Nvbm5lY3QoKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgSW5wdXRTdXJmYWNlOworCisgICAgLy8gRm9yIElucHV0U3VyZmFjZQorICAgIElucHV0U3VyZmFjZUNvbm5lY3Rpb24oCisgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiAmc291cmNlLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+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+bVJlc3VsdE92ZXJyaWRlID0gZXJyOworfQorCitTaW1wbGVNZXRob2RTdGF0ZTo6U2ltcGxlTWV0aG9kU3RhdGUoKQorICAgIDogbU1vZGUoRVhFQ1VURSksIG1PdmVycmlkZShmYWxzZSksIG1SZXN1bHRPdmVycmlkZShDMl9PSykge30KKworU2ltcGxlTWV0aG9kU3RhdGU6Ok1vZGUgU2ltcGxlTWV0aG9kU3RhdGU6OmdldE1vZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Nb2RlOworfQorCitib29sIFNpbXBsZU1ldGhvZFN0YXRlOjpvdmVycmlkZVJlc3VsdChjMl9zdGF0dXNfdCAqcmVzdWx0KSBjb25zdCB7CisgICAgaWYgKCFtT3ZlcnJpZGUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAqcmVzdWx0ID0gbVJlc3VsdE92ZXJyaWRlOworICAgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL1NpbXBsZU1ldGhvZFN0YXRlLmggYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vU2ltcGxlTWV0aG9kU3RhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzA0NTlkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL1NpbXBsZU1ldGhvZFN0YXRlLmgKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU0lNUExFX01FVEhPRF9TVEFURV9IXworI2RlZmluZSBTSU1QTEVfTUVUSE9EX1NUQVRFX0hfCisKKyNpbmNsdWRlIDxDMi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogU3RhdGUgZm9yIGEgc2ltcGxlIG1ldGhvZCB3aGljaCByZXR1cm5zIGMyX3N0YXR1c190IGFuZCB0YWtlcyBubyBwYXJhbWV0ZXJzLgorICovCitjbGFzcyBTaW1wbGVNZXRob2RTdGF0ZSB7CitwdWJsaWM6CisgICAgZW51bSBNb2RlIHsKKyAgICAgICAgLy8gRXhlY3V0ZSB0aGUgbm9ybWFsIG9wZXJhdGlvbgorICAgICAgICBFWEVDVVRFLAorICAgICAgICAvLyBEb24ndCBkbyBhbnl0aGluZworICAgICAgICBOT19PUCwKKyAgICAgICAgLy8gSGFuZzsgbmV2ZXIgcmV0dXJuCisgICAgICAgIEhBTkcsCisgICAgfTsKKworICAgIC8qKgorICAgICAqIEluamVjdGVyIGNsYXNzIHRoYXQgbW9kaWZpZXMgdGhlIGludGVybmFsIHN0YXRlcyBvZiB0aGlzIGNsYXNzLgorICAgICAqLworICAgIGNsYXNzIEluamVjdGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IEluamVjdGVyKFNpbXBsZU1ldGhvZFN0YXRlICp0aGl6KTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZyB0aGUgb3BlcmF0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBoYW5nKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZhaWwgdGhlIG9wZXJhdGlvbiB3aXRoIGdpdmVuIHBhcmFtcy4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIGVyciAgICAgICBlcnJvciBjb2RlIHRvIHJlcGxhY2UgdGhlIGFjdHVhbCByZXR1cm4gdmFsdWUKKyAgICAgICAgICogXHBhcmFtIGV4ZWN1dGUgICB3aGV0aGVyIHRoZSB3cmFwcGVyIHNob3VsZCBleGVjdXRlIHRoZSBvcGVyYXRpb24KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgZmFpbChjMl9zdGF0dXNfdCBlcnIsIGJvb2wgZXhlY3V0ZSA9IGZhbHNlKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIFNpbXBsZU1ldGhvZFN0YXRlICpjb25zdCBtVGhpejsKKyAgICB9OworCisgICAgU2ltcGxlTWV0aG9kU3RhdGUoKTsKKworICAgIC8qKgorICAgICAqIEdldCBleGVjdXRpb24gbW9kZS4KKyAgICAgKi8KKyAgICBNb2RlIGdldE1vZGUoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIE92ZXJyaWRlIHJlc3VsdCBmcm9tIHJ1bm5pbmcgdGhlIG9wZXJhdGlvbiBpZiBjb25maWd1cmVkIHNvLgorICAgICAqLworICAgIGJvb2wgb3ZlcnJpZGVSZXN1bHQoYzJfc3RhdHVzX3QgKnJlc3VsdCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgTW9kZSBtTW9kZTsKKyAgICBib29sIG1PdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBtUmVzdWx0T3ZlcnJpZGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gU0lNUExFX01FVEhPRF9TVEFURV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2ZlMzZiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMjYgQEAKKy8vIERPIE5PVCBERVBFTkQgT04gVEhJUyBESVJFQ1RMWQorLy8gdXNlIGxpYmNvZGVjMi1oaWRsLWNsaWVudC1kZWZhdWx0cyBpbnN0ZWFkCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGliY29kZWMyX2hpZGxfY2xpZW50QDEuMCIsCisKKyAgICBkZWZhdWx0czogWyJoaWRsX2RlZmF1bHRzIl0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDbGllbnRCbG9ja0hlbHBlci5jcHAiLAorICAgICAgICAidHlwZXMuY3BwIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9pbnRlcm5hbCIsIC8vIHByaXZhdGUKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMCIsCisgICAgICAgICJsaWJ1aSIsCisgICAgXSwKK30KKworCisvLyBETyBOT1QgREVQRU5EIE9OIFRISVMgRElSRUNUTFkKKy8vIHVzZSBsaWJjb2RlYzItaGlkbC1kZWZhdWx0cyBpbnN0ZWFkCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGliY29kZWMyX2hpZGxAMS4wIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgZGVmYXVsdHM6IFsiaGlkbF9kZWZhdWx0cyJdLAorCisgICAgc3JjczogWworICAgICAgICAiQ29tcG9uZW50LmNwcCIsCisgICAgICAgICJDb21wb25lbnRJbnRlcmZhY2UuY3BwIiwKKyAgICAgICAgIkNvbXBvbmVudFN0b3JlLmNwcCIsCisgICAgICAgICJDb25maWd1cmFibGUuY3BwIiwKKyAgICAgICAgIklucHV0QnVmZmVyTWFuYWdlci5jcHAiLAorICAgICAgICAiSW5wdXRTdXJmYWNlLmNwcCIsCisgICAgICAgICJJbnB1dFN1cmZhY2VDb25uZWN0aW9uLmNwcCIsCisgICAgICAgICJ0eXBlcy5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlic3lzdGVtX2hlYWRlcnMiLAorICAgICAgICAibGliY29kZWMyX2ludGVybmFsIiwgLy8gcHJpdmF0ZQorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5jb21tb25AMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWFAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImxpYmh3YmluZGVyIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJxdWV1ZV9oZWxwZXIiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICBdLAorfQorCisvLyBwdWJsaWMgZGVwZW5kZW5jeSBmb3IgQ29kZWMgMi4wIEhBTCBzZXJ2aWNlIGltcGxlbWVudGF0aW9ucworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJjb2RlYzItaGlkbC1kZWZhdWx0cyIsCisgICAgZGVmYXVsdHM6IFsibGliY29kZWMyLWltcGwtZGVmYXVsdHMiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMCIsCisgICAgICAgICJsaWJjb2RlYzJfaGlkbEAxLjAiLAorICAgIF0sCit9CisKKy8vIHB1YmxpYyBkZXBlbmRlbmN5IGZvciBDb2RlYyAyLjAgSEFMIGNsaWVudAorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJjb2RlYzItaGlkbC1jbGllbnQtZGVmYXVsdHMiLAorICAgIGRlZmF1bHRzOiBbImxpYmNvZGVjMi1pbXBsLWRlZmF1bHRzIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAorICAgICAgICAibGliY29kZWMyX2hpZGxfY2xpZW50QDEuMCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9DbGllbnRCbG9ja0hlbHBlci5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ2xpZW50QmxvY2tIZWxwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ODZjNjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ2xpZW50QmxvY2tIZWxwZXIuY3BwCkBAIC0wLDAgKzEsMjMyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi1ibG9ja19oZWxwZXIiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMi4wL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ2xpZW50QmxvY2tIZWxwZXIuaD4KKyNpbmNsdWRlIDxndWkvYnVmZmVycXVldWUvMi4wL0IySEdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJCbG9ja0ludGVybmFsLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorCisjaW5jbHVkZSA8aW9tYW5pcD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgSEdyYXBoaWNCdWZmZXJQcm9kdWNlciA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6CisgICAgICAgIFYyXzA6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit1c2luZyBCMkhHcmFwaGljQnVmZmVyUHJvZHVjZXIgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OgorICAgICAgICBWMl8wOjp1dGlsczo6QjJIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKKy8vIENyZWF0ZSBhIEdyYXBoaWNCdWZmZXIgb2JqZWN0IGZyb20gYSBncmFwaGljIGJsb2NrLgorc3A8R3JhcGhpY0J1ZmZlcj4gY3JlYXRlR3JhcGhpY0J1ZmZlcihjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaykgeworICAgIHVpbnQzMl90IHdpZHRoOworICAgIHVpbnQzMl90IGhlaWdodDsKKyAgICB1aW50MzJfdCBmb3JtYXQ7CisgICAgdWludDY0X3QgdXNhZ2U7CisgICAgdWludDMyX3Qgc3RyaWRlOworICAgIHVpbnQzMl90IGdlbmVyYXRpb247CisgICAgdWludDY0X3QgYnFJZDsKKyAgICBpbnQzMl90IGJxU2xvdDsKKyAgICBfVW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY01ldGFkYXRhKAorICAgICAgICAgICAgYmxvY2suaGFuZGxlKCksICZ3aWR0aCwgJmhlaWdodCwgJmZvcm1hdCwgJnVzYWdlLAorICAgICAgICAgICAgJnN0cmlkZSwgJmdlbmVyYXRpb24sICZicUlkLCByZWludGVycHJldF9jYXN0PHVpbnQzMl90Kj4oJmJxU2xvdCkpOworICAgIG5hdGl2ZV9oYW5kbGVfdCAqZ3JhbGxvY0hhbmRsZSA9CisgICAgICAgICAgICBVbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlKGJsb2NrLmhhbmRsZSgpKTsKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBncmFwaGljQnVmZmVyID0KKyAgICAgICAgICAgIG5ldyBHcmFwaGljQnVmZmVyKGdyYWxsb2NIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHcmFwaGljQnVmZmVyOjpDTE9ORV9IQU5ETEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCB1c2FnZSwgc3RyaWRlKTsKKyAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShncmFsbG9jSGFuZGxlKTsKKyAgICByZXR1cm4gZ3JhcGhpY0J1ZmZlcjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEJsb2NrUHJvY2Vzc29yPgordm9pZCBmb3JFYWNoQmxvY2soQzJGcmFtZURhdGEmIGZyYW1lRGF0YSwKKyAgICAgICAgICAgICAgICAgIEJsb2NrUHJvY2Vzc29yIHByb2Nlc3MpIHsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIGJ1ZmZlciA6IGZyYW1lRGF0YS5idWZmZXJzKSB7CisgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2sgOgorICAgICAgICAgICAgICAgICAgICBidWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkpIHsKKyAgICAgICAgICAgICAgICBwcm9jZXNzKGJsb2NrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEJsb2NrUHJvY2Vzc29yPgordm9pZCBmb3JFYWNoQmxvY2soY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0xpc3QsCisgICAgICAgICAgICAgICAgICBCbG9ja1Byb2Nlc3NvciBwcm9jZXNzLAorICAgICAgICAgICAgICAgICAgYm9vbCBwcm9jZXNzSW5wdXQsIGJvb2wgcHJvY2Vzc091dHB1dCkgeworICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiB3b3JrTGlzdCkgeworICAgICAgICBpZiAoIXdvcmspIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChwcm9jZXNzSW5wdXQpIHsKKyAgICAgICAgICAgIGZvckVhY2hCbG9jayh3b3JrLT5pbnB1dCwgcHJvY2Vzcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByb2Nlc3NPdXRwdXQpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29ya2xldD4mIHdvcmtsZXQgOiB3b3JrLT53b3JrbGV0cykgeworICAgICAgICAgICAgICAgIGlmICh3b3JrbGV0KSB7CisgICAgICAgICAgICAgICAgICAgIGZvckVhY2hCbG9jayh3b3JrbGV0LT5vdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGdldEhnYnAoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnApIHsKKyAgICBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBoZ2JwID0KKyAgICAgICAgICAgIGlnYnAtPmdldEhhbEludGVyZmFjZTxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPigpOworICAgIHJldHVybiBoZ2JwID8gaGdicCA6CisgICAgICAgICAgICBuZXcgQjJIR3JhcGhpY0J1ZmZlclByb2R1Y2VyKGlnYnApOworfQorCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKK3N0YXR1c190IGF0dGFjaFRvQnVmZmVyUXVldWUoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBicVNsb3QpIHsKKyAgICBpZiAoIWlnYnApIHsKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJhdHRhY2hUb0J1ZmZlclF1ZXVlIC0tIG51bGwgcHJvZHVjZXIuIjsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ3JhcGhpY0J1ZmZlciA9IGNyZWF0ZUdyYXBoaWNCdWZmZXIoYmxvY2spOworICAgIGdyYXBoaWNCdWZmZXItPnNldEdlbmVyYXRpb25OdW1iZXIoZ2VuZXJhdGlvbik7CisKKyAgICBMT0coVkVSQk9TRSkgPDwgImF0dGFjaFRvQnVmZmVyUXVldWUgLS0gYXR0YWNoaW5nIGJ1ZmZlcjoiCisgICAgICAgICAgICA8PCAiIGJsb2NrIGRpbWVuc2lvbiAiIDw8IGJsb2NrLndpZHRoKCkgPDwgIngiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGJsb2NrLmhlaWdodCgpCisgICAgICAgICAgICA8PCAiLCBncmFwaGljQnVmZmVyIGRpbWVuc2lvbiAiIDw8IGdyYXBoaWNCdWZmZXItPmdldFdpZHRoKCkgPDwgIngiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZ3JhcGhpY0J1ZmZlci0+Z2V0SGVpZ2h0KCkKKyAgICAgICAgICAgIDw8IHN0ZDo6aGV4IDw8IHN0ZDo6c2V0ZmlsbCgnMCcpCisgICAgICAgICAgICA8PCAiLCBmb3JtYXQgMHgiIDw8IHN0ZDo6c2V0dyg4KSA8PCBncmFwaGljQnVmZmVyLT5nZXRQaXhlbEZvcm1hdCgpCisgICAgICAgICAgICA8PCAiLCB1c2FnZSAweCIgPDwgc3RkOjpzZXR3KDE2KSA8PCBncmFwaGljQnVmZmVyLT5nZXRVc2FnZSgpCisgICAgICAgICAgICA8PCBzdGQ6OmRlYyA8PCBzdGQ6OnNldGZpbGwoJyAnKQorICAgICAgICAgICAgPDwgIiwgc3RyaWRlICIgPDwgZ3JhcGhpY0J1ZmZlci0+Z2V0U3RyaWRlKCkKKyAgICAgICAgICAgIDw8ICIsIGdlbmVyYXRpb24gIiA8PCBncmFwaGljQnVmZmVyLT5nZXRHZW5lcmF0aW9uTnVtYmVyKCk7CisKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBpZ2JwLT5hdHRhY2hCdWZmZXIoYnFTbG90LCBncmFwaGljQnVmZmVyKTsKKyAgICBpZiAocmVzdWx0ICE9IE9LKSB7CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiYXR0YWNoVG9CdWZmZXJRdWV1ZSAtLSBhdHRhY2hCdWZmZXIgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAic3RhdHVzID0gIiA8PCByZXN1bHQgPDwgIi4iOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBMT0coVkVSQk9TRSkgPDwgImF0dGFjaFRvQnVmZmVyUXVldWUgLS0gYXR0YWNoQnVmZmVyIHJldHVybmVkIHNsb3QgIyIKKyAgICAgICAgICAgICAgICAgPDwgKmJxU2xvdCA8PCAiLiI7CisgICAgcmV0dXJuIE9LOworfQorCitib29sIGdldEJ1ZmZlclF1ZXVlQXNzaWdubWVudChjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBnZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QqIGJxSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBicVNsb3QpIHsKKyAgICByZXR1cm4gX0MyQmxvY2tGYWN0b3J5OjpHZXRCdWZmZXJRdWV1ZURhdGEoCisgICAgICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkdldEdyYXBoaWNCbG9ja1Bvb2xEYXRhKGJsb2NrKSwKKyAgICAgICAgICAgIGdlbmVyYXRpb24sIGJxSWQsIGJxU2xvdCk7Cit9CisKK2Jvb2wgaG9sZEJ1ZmZlclF1ZXVlQmxvY2soY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYnFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IGRhdGEgPQorICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpHZXRHcmFwaGljQmxvY2tQb29sRGF0YShibG9jayk7CisgICAgaWYgKCFkYXRhKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBvbGRHZW5lcmF0aW9uOworICAgIHVpbnQ2NF90IG9sZElkOworICAgIGludDMyX3Qgb2xkU2xvdDsKKyAgICAvLyBJZiB0aGUgYmxvY2sgaXMgbm90IGJ1ZmZlcnF1ZXVlLWJhc2VkLCBkbyBub3RoaW5nLgorICAgIGlmICghX0MyQmxvY2tGYWN0b3J5OjpHZXRCdWZmZXJRdWV1ZURhdGEoCisgICAgICAgICAgICBkYXRhLCAmb2xkR2VuZXJhdGlvbiwgJm9sZElkLCAmb2xkU2xvdCkgfHwKKyAgICAgICAgICAgIChvbGRJZCA9PSAwKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gSWYgdGhlIGJsb2NrJ3MgYnFJZCBpcyB0aGUgc2FtZSBhcyB0aGUgZGVzaXJlZCBicUlkLCBqdXN0IGhvbGQuCisgICAgaWYgKChvbGRJZCA9PSBicUlkKSAmJiAob2xkR2VuZXJhdGlvbiA9PSBnZW5lcmF0aW9uKSkgeworICAgICAgICBMT0coVkVSQk9TRSkgPDwgImhvbGRCdWZmZXJRdWV1ZUJsb2NrIC0tIGltcG9ydCB3aXRob3V0IGF0dGFjaGluZzoiCisgICAgICAgICAgICAgICAgICAgICA8PCAiIGJxSWQgIiA8PCBvbGRJZAorICAgICAgICAgICAgICAgICAgICAgPDwgIiwgYnFTbG90ICIgPDwgb2xkU2xvdAorICAgICAgICAgICAgICAgICAgICAgPDwgIiwgZ2VuZXJhdGlvbiAiIDw8IGdlbmVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpIb2xkQmxvY2tGcm9tQnVmZmVyUXVldWUoZGF0YSwgZ2V0SGdicChpZ2JwKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIE90aGVyd2lzZSwgYXR0YWNoIHRvIHRoZSBnaXZlbiBpZ2JwLCB3aGljaCBtdXN0IG5vdCBiZSBudWxsLgorICAgIGlmICghaWdicCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50MzJfdCBicVNsb3Q7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gYXR0YWNoVG9CdWZmZXJRdWV1ZShibG9jaywgaWdicCwgZ2VuZXJhdGlvbiwgJmJxU2xvdCk7CisKKyAgICBpZiAocmVzdWx0ICE9IE9LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImhvbGRCdWZmZXJRdWV1ZUJsb2NrIC0tIGZhaWwgdG8gYXR0YWNoOiIKKyAgICAgICAgICAgICAgICAgICA8PCAiIHRhcmdldCBicUlkICIgPDwgYnFJZAorICAgICAgICAgICAgICAgICAgIDw8ICIsIGdlbmVyYXRpb24gIiA8PCBnZW5lcmF0aW9uCisgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgTE9HKFZFUkJPU0UpIDw8ICJob2xkQnVmZmVyUXVldWVCbG9jayAtLSBhdHRhY2hlZDoiCisgICAgICAgICAgICAgICAgIDw8ICIgYnFJZCAiIDw8IGJxSWQKKyAgICAgICAgICAgICAgICAgPDwgIiwgYnFTbG90ICIgPDwgYnFTbG90CisgICAgICAgICAgICAgICAgIDw8ICIsIGdlbmVyYXRpb24gIiA8PCBnZW5lcmF0aW9uCisgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICBfQzJCbG9ja0ZhY3Rvcnk6OkFzc2lnbkJsb2NrVG9CdWZmZXJRdWV1ZSgKKyAgICAgICAgICAgIGRhdGEsIGdldEhnYnAoaWdicCksIGdlbmVyYXRpb24sIGJxSWQsIGJxU2xvdCwgdHJ1ZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgaG9sZEJ1ZmZlclF1ZXVlQmxvY2tzKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBicUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9ySW5wdXQpIHsKKyAgICBmb3JFYWNoQmxvY2sod29ya0xpc3QsCisgICAgICAgICAgICAgICAgIHN0ZDo6YmluZChob2xkQnVmZmVyUXVldWVCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGxhY2Vob2xkZXJzOjpfMSwgaWdicCwgYnFJZCwgZ2VuZXJhdGlvbiksCisgICAgICAgICAgICAgICAgIGZvcklucHV0LCAhZm9ySW5wdXQpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29tcG9uZW50LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4OTdkY2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29tcG9uZW50LmNwcApAQCAtMCwwICsxLDQ4MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlYzItQ29tcG9uZW50IgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0lucHV0QnVmZmVyTWFuYWdlci5oPgorCisjaW5jbHVkZSA8aGlkbC9IaWRsQmluZGVyU3VwcG9ydC5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorCisjaW5jbHVkZSA8QzJCcUJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ7CisKKy8vIENvbXBvbmVudExpc3RlbmVyIHdyYXBwZXIKK3N0cnVjdCBDb21wb25lbnQ6Okxpc3RlbmVyIDogcHVibGljIEMyQ29tcG9uZW50OjpMaXN0ZW5lciB7CisKKyAgICBMaXN0ZW5lcihjb25zdCBzcDxDb21wb25lbnQ+JiBjb21wb25lbnQpIDoKKyAgICAgICAgbUNvbXBvbmVudChjb21wb25lbnQpLAorICAgICAgICBtTGlzdGVuZXIoY29tcG9uZW50LT5tTGlzdGVuZXIpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25FcnJvcl9uYigKKyAgICAgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IC8qIGMyY29tcG9uZW50ICovLAorICAgICAgICAgICAgdWludDMyX3QgZXJyb3JDb2RlKSBvdmVycmlkZSB7CisgICAgICAgIHNwPElDb21wb25lbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgICAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IGxpc3RlbmVyLT5vbkVycm9yKFN0YXR1czo6T0ssIGVycm9yQ29kZSk7CisgICAgICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNvbXBvbmVudDo6TGlzdGVuZXI6Om9uRXJyb3JfbmIgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uVHJpcHBlZF9uYigKKyAgICAgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IC8qIGMyY29tcG9uZW50ICovLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGMyc2V0dGluZ1Jlc3VsdAorICAgICAgICAgICAgKSBvdmVycmlkZSB7CisgICAgICAgIHNwPElDb21wb25lbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgICAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgICAgIGhpZGxfdmVjPFNldHRpbmdSZXN1bHQ+IHNldHRpbmdSZXN1bHRzKGMyc2V0dGluZ1Jlc3VsdC5zaXplKCkpOworICAgICAgICAgICAgc2l6ZV90IGl4ID0gMDsKKyAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4gJmMycmVzdWx0IDoKKyAgICAgICAgICAgICAgICAgICAgYzJzZXR0aW5nUmVzdWx0KSB7CisgICAgICAgICAgICAgICAgaWYgKGMycmVzdWx0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghb2JqY3B5KCZzZXR0aW5nUmVzdWx0c1tpeCsrXSwgKmMycmVzdWx0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzZXR0aW5nUmVzdWx0cy5yZXNpemUoaXgpOworICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbGlzdGVuZXItPm9uVHJpcHBlZChzZXR0aW5nUmVzdWx0cyk7CisgICAgICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNvbXBvbmVudDo6TGlzdGVuZXI6Om9uVHJpcHBlZF9uYiAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAidHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrRG9uZV9uYigKKyAgICAgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IC8qIGMyY29tcG9uZW50ICovLAorICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBjMndvcmtJdGVtcykgb3ZlcnJpZGUgeworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogYzJ3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgIGlmICh3b3JrKSB7CisgICAgICAgICAgICAgICAgaWYgKHdvcmstPndvcmtsZXRzLmVtcHR5KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICF3b3JrLT53b3JrbGV0cy5iYWNrKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICh3b3JrLT53b3JrbGV0cy5iYWNrKCktPm91dHB1dC5mbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfSU5DT01QTEVURSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBJbnB1dEJ1ZmZlck1hbmFnZXI6OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVucmVnaXN0ZXJGcmFtZURhdGEobUxpc3RlbmVyLCB3b3JrLT5pbnB1dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3A8SUNvbXBvbmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7CisgICAgICAgIGlmIChsaXN0ZW5lcikgeworICAgICAgICAgICAgV29ya0J1bmRsZSB3b3JrQnVuZGxlOworCisgICAgICAgICAgICBzcDxDb21wb25lbnQ+IHN0cm9uZ0NvbXBvbmVudCA9IG1Db21wb25lbnQucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKCFvYmpjcHkoJndvcmtCdW5kbGUsIGMyd29ya0l0ZW1zLCBzdHJvbmdDb21wb25lbnQgPworICAgICAgICAgICAgICAgICAgICAmc3Ryb25nQ29tcG9uZW50LT5tQnVmZmVyUG9vbFNlbmRlciA6IG51bGxwdHIpKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ29tcG9uZW50OjpMaXN0ZW5lcjo6b25Xb3JrRG9uZV9uYiAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAicmVjZWl2ZWQgY29ycnVwdGVkIHdvcmsgaXRlbXMuIjsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBsaXN0ZW5lci0+b25Xb3JrRG9uZSh3b3JrQnVuZGxlKTsKKyAgICAgICAgICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ29tcG9uZW50OjpMaXN0ZW5lcjo6b25Xb3JrRG9uZV9uYiAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAidHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgeWllbGRCdWZmZXJRdWV1ZUJsb2NrcyhjMndvcmtJdGVtcywgdHJ1ZSk7CisgICAgICAgIH0KKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB3cDxDb21wb25lbnQ+IG1Db21wb25lbnQ7CisgICAgd3A8SUNvbXBvbmVudExpc3RlbmVyPiBtTGlzdGVuZXI7Cit9OworCisvLyBDb21wb25lbnQ6OlNpbmsKK3N0cnVjdCBDb21wb25lbnQ6OlNpbmsgOiBwdWJsaWMgSUlucHV0U2luayB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudD4gbUNvbXBvbmVudDsKKyAgICBzcDxJQ29uZmlndXJhYmxlPiBtQ29uZmlndXJhYmxlOworCisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBxdWV1ZShjb25zdCBXb3JrQnVuZGxlJiB3b3JrQnVuZGxlKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtQ29tcG9uZW50LT5xdWV1ZSh3b3JrQnVuZGxlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFJldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gZ2V0Q29uZmlndXJhYmxlKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUNvbmZpZ3VyYWJsZTsKKyAgICB9CisKKyAgICBTaW5rKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnQ+JiBjb21wb25lbnQpOworICAgIHZpcnR1YWwgflNpbmsoKSBvdmVycmlkZTsKKworICAgIC8vIFByb2Nlc3Mtd2lkZSBtYXA6IENvbXBvbmVudDo6U2luayAtPiBDMkNvbXBvbmVudC4KKyAgICBzdGF0aWMgc3RkOjptdXRleCBzU2luazJDb21wb25lbnRNdXRleDsKKyAgICBzdGF0aWMgc3RkOjptYXA8SUlucHV0U2luayosIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+PiBzU2luazJDb21wb25lbnQ7CisKKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBmaW5kTG9jYWxDb21wb25lbnQoCisgICAgICAgICAgICBjb25zdCBzcDxJSW5wdXRTaW5rPiYgc2luayk7Cit9OworCitzdGQ6Om11dGV4CisgICAgICAgIENvbXBvbmVudDo6U2luazo6c1NpbmsyQ29tcG9uZW50TXV0ZXh7fTsKK3N0ZDo6bWFwPElJbnB1dFNpbmsqLCBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50Pj4KKyAgICAgICAgQ29tcG9uZW50OjpTaW5rOjpzU2luazJDb21wb25lbnR7fTsKKworQ29tcG9uZW50OjpTaW5rOjpTaW5rKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnQ+JiBjb21wb25lbnQpCisgICAgICAgIDogbUNvbXBvbmVudHtjb21wb25lbnR9LAorICAgICAgICAgIG1Db25maWd1cmFibGV7WyZjb21wb25lbnRdKCkgLT4gc3A8SUNvbmZpZ3VyYWJsZT4geworICAgICAgICAgICAgICBSZXR1cm48c3A8SUNvbXBvbmVudEludGVyZmFjZT4+IHJldDEgPSBjb21wb25lbnQtPmdldEludGVyZmFjZSgpOworICAgICAgICAgICAgICBpZiAoIXJldDEuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJTaW5rOjpTaW5rIC0tIGNvbXBvbmVudCdzIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiByZXQyID0KKyAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzcDxJQ29tcG9uZW50SW50ZXJmYWNlPj4ocmV0MSktPgorICAgICAgICAgICAgICAgICAgICAgIGdldENvbmZpZ3VyYWJsZSgpOworICAgICAgICAgICAgICBpZiAoIXJldDIuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJTaW5rOjpTaW5rIC0tIGludGVyZmFjZSdzIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHNwPElDb25maWd1cmFibGU+PihyZXQyKTsKKyAgICAgICAgICB9KCl9IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhzU2luazJDb21wb25lbnRNdXRleCk7CisgICAgc1NpbmsyQ29tcG9uZW50LmVtcGxhY2UodGhpcywgY29tcG9uZW50LT5tQ29tcG9uZW50KTsKK30KKworQ29tcG9uZW50OjpTaW5rOjp+U2luaygpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhzU2luazJDb21wb25lbnRNdXRleCk7CisgICAgc1NpbmsyQ29tcG9uZW50LmVyYXNlKHRoaXMpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IENvbXBvbmVudDo6U2luazo6ZmluZExvY2FsQ29tcG9uZW50KAorICAgICAgICBjb25zdCBzcDxJSW5wdXRTaW5rPiYgc2luaykgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHNTaW5rMkNvbXBvbmVudE11dGV4KTsKKyAgICBhdXRvIGkgPSBzU2luazJDb21wb25lbnQuZmluZChzaW5rLmdldCgpKTsKKyAgICBpZiAoaSA9PSBzU2luazJDb21wb25lbnQuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBpLT5zZWNvbmQubG9jaygpOworfQorCisvLyBDb21wb25lbnQKK0NvbXBvbmVudDo6Q29tcG9uZW50KAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBjb25zdCBzcDxDb21wb25lbnRTdG9yZT4mIHN0b3JlLAorICAgICAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6CisgICAgICAgIElDbGllbnRNYW5hZ2VyPiYgY2xpZW50UG9vbE1hbmFnZXIpCisgICAgICA6IG1Db21wb25lbnR7Y29tcG9uZW50fSwKKyAgICAgICAgbUludGVyZmFjZXtuZXcgQ29tcG9uZW50SW50ZXJmYWNlKGNvbXBvbmVudC0+aW50ZigpLCBzdG9yZS5nZXQoKSl9LAorICAgICAgICBtTGlzdGVuZXJ7bGlzdGVuZXJ9LAorICAgICAgICBtU3RvcmV7c3RvcmV9LAorICAgICAgICBtQnVmZmVyUG9vbFNlbmRlcntjbGllbnRQb29sTWFuYWdlcn0geworICAgIC8vIFJldHJpZXZlIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGZyb20gc3RvcmUKKyAgICAvLyBUT0RPOiBXZSBjb3VsZCBjYWNoZSB0aGlzIHBlciBjb21wb25lbnQvaW50ZXJmYWNlIHR5cGUKKyAgICBtSW5pdCA9IG1JbnRlcmZhY2UtPnN0YXR1cygpOworfQorCitjMl9zdGF0dXNfdCBDb21wb25lbnQ6OnN0YXR1cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluaXQ7Cit9CisKKy8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb21wb25lbnQKK1JldHVybjxTdGF0dXM+IENvbXBvbmVudDo6cXVldWUoY29uc3QgV29ya0J1bmRsZSYgd29ya0J1bmRsZSkgeworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gYzJ3b3JrczsKKworICAgIGlmICghb2JqY3B5KCZjMndvcmtzLCB3b3JrQnVuZGxlKSkgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpDT1JSVVBURUQ7CisgICAgfQorCisgICAgLy8gUmVnaXN0ZXIgaW5wdXQgYnVmZmVycy4KKyAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogYzJ3b3JrcykgeworICAgICAgICBpZiAod29yaykgeworICAgICAgICAgICAgSW5wdXRCdWZmZXJNYW5hZ2VyOjoKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJGcmFtZURhdGEobUxpc3RlbmVyLCB3b3JrLT5pbnB1dCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U3RhdHVzPihtQ29tcG9uZW50LT5xdWV1ZV9uYigmYzJ3b3JrcykpOworfQorCitSZXR1cm48dm9pZD4gQ29tcG9uZW50OjpmbHVzaChmbHVzaF9jYiBfaGlkbF9jYikgeworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gYzJmbHVzaGVkV29ya3M7CisgICAgYzJfc3RhdHVzX3QgYzJyZXMgPSBtQ29tcG9uZW50LT5mbHVzaF9zbSgKKyAgICAgICAgICAgIEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsCisgICAgICAgICAgICAmYzJmbHVzaGVkV29ya3MpOworCisgICAgLy8gVW5yZWdpc3RlciBpbnB1dCBidWZmZXJzLgorICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiBjMmZsdXNoZWRXb3JrcykgeworICAgICAgICBpZiAod29yaykgeworICAgICAgICAgICAgaWYgKHdvcmstPndvcmtsZXRzLmVtcHR5KCkKKyAgICAgICAgICAgICAgICAgICAgfHwgIXdvcmstPndvcmtsZXRzLmJhY2soKQorICAgICAgICAgICAgICAgICAgICB8fCAod29yay0+d29ya2xldHMuYmFjaygpLT5vdXRwdXQuZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfSU5DT01QTEVURSkgPT0gMCkgeworICAgICAgICAgICAgICAgIElucHV0QnVmZmVyTWFuYWdlcjo6CisgICAgICAgICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyRnJhbWVEYXRhKG1MaXN0ZW5lciwgd29yay0+aW5wdXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgV29ya0J1bmRsZSBmbHVzaGVkV29ya0J1bmRsZTsKKyAgICBTdGF0dXMgcmVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPihjMnJlcyk7CisgICAgaWYgKGMycmVzID09IEMyX09LKSB7CisgICAgICAgIGlmICghb2JqY3B5KCZmbHVzaGVkV29ya0J1bmRsZSwgYzJmbHVzaGVkV29ya3MsICZtQnVmZmVyUG9vbFNlbmRlcikpIHsKKyAgICAgICAgICAgIHJlcyA9IFN0YXR1czo6Q09SUlVQVEVEOworICAgICAgICB9CisgICAgfQorICAgIF9oaWRsX2NiKHJlcywgZmx1c2hlZFdvcmtCdW5kbGUpOworICAgIHlpZWxkQnVmZmVyUXVldWVCbG9ja3MoYzJmbHVzaGVkV29ya3MsIHRydWUpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjxTdGF0dXM+IENvbXBvbmVudDo6ZHJhaW4oYm9vbCB3aXRoRW9zKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFN0YXR1cz4obUNvbXBvbmVudC0+ZHJhaW5fbmIod2l0aEVvcyA/CisgICAgICAgICAgICBDMkNvbXBvbmVudDo6RFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TIDoKKyAgICAgICAgICAgIEMyQ29tcG9uZW50OjpEUkFJTl9DT01QT05FTlRfTk9fRU9TKSk7Cit9CisKK1JldHVybjxTdGF0dXM+IENvbXBvbmVudDo6c2V0T3V0cHV0U3VyZmFjZSgKKyAgICAgICAgdWludDY0X3QgYmxvY2tQb29sSWQsCisgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXIyPiYgc3VyZmFjZSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcG9vbDsKKyAgICBHZXRDb2RlYzJCbG9ja1Bvb2woYmxvY2tQb29sSWQsIG1Db21wb25lbnQsICZwb29sKTsKKyAgICBpZiAocG9vbCAmJiBwb29sLT5nZXRBbGxvY2F0b3JJZCgpID09IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUUpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w+IGJxUG9vbCA9CisgICAgICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w+KHBvb2wpOworICAgICAgICBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpPblJlbmRlckNhbGxiYWNrIGNiID0KKyAgICAgICAgICAgIFt0aGlzXSh1aW50NjRfdCBwcm9kdWNlciwgaW50MzJfdCBzbG90LCBpbnQ2NF90IG5zZWNzKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogYmF0Y2ggdGhpcworICAgICAgICAgICAgICAgIGhpZGxfdmVjPElDb21wb25lbnRMaXN0ZW5lcjo6UmVuZGVyZWRGcmFtZT4gcmVuZGVyZWQ7CisgICAgICAgICAgICAgICAgcmVuZGVyZWQucmVzaXplKDEpOworICAgICAgICAgICAgICAgIHJlbmRlcmVkWzBdID0geyBwcm9kdWNlciwgc2xvdCwgbnNlY3MgfTsKKyAgICAgICAgICAgICAgICAodm9pZCltTGlzdGVuZXItPm9uRnJhbWVzUmVuZGVyZWQocmVuZGVyZWQpLmlzT2soKTsKKyAgICAgICAgfTsKKyAgICAgICAgaWYgKGJxUG9vbCkgeworICAgICAgICAgICAgYnFQb29sLT5zZXRSZW5kZXJDYWxsYmFjayhjYik7CisgICAgICAgICAgICBicVBvb2wtPmNvbmZpZ3VyZVByb2R1Y2VyKHN1cmZhY2UpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Ok9LOworfQorCitSZXR1cm48dm9pZD4gQ29tcG9uZW50Ojpjb25uZWN0VG9JbnB1dFN1cmZhY2UoCisgICAgICAgIGNvbnN0IHNwPElJbnB1dFN1cmZhY2U+JiBpbnB1dFN1cmZhY2UsCisgICAgICAgIGNvbm5lY3RUb0lucHV0U3VyZmFjZV9jYiBfaGlkbF9jYikgeworICAgIFN0YXR1cyBzdGF0dXM7CisgICAgc3A8SUlucHV0U3VyZmFjZUNvbm5lY3Rpb24+IGNvbm5lY3Rpb247CisgICAgYXV0byB0cmFuc1N0YXR1cyA9IGlucHV0U3VyZmFjZS0+Y29ubmVjdCgKKyAgICAgICAgICAgIGFzSW5wdXRTaW5rKCksCisgICAgICAgICAgICBbJnN0YXR1cywgJmNvbm5lY3Rpb25dKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywgY29uc3Qgc3A8SUlucHV0U3VyZmFjZUNvbm5lY3Rpb24+JiBjKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uID0gYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICBfaGlkbF9jYihzdGF0dXMsIGNvbm5lY3Rpb24pOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDb21wb25lbnQ6OmNvbm5lY3RUb09teElucHV0U3VyZmFjZSgKKyAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcjE+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+PiBDb21wb25lbnRJbnRlcmZhY2U6OmdldENvbmZpZ3VyYWJsZSgpIHsKKyAgICByZXR1cm4gbUNvbmZpZ3VyYWJsZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbXBvbmVudFN0b3JlLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnRTdG9yZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUwYTE5MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnRTdG9yZS5jcHAKQEAgLTAsMCArMSw0MzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLUNvbXBvbmVudFN0b3JlIgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvSW5wdXRTdXJmYWNlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPGN0aW1lPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8b3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOwordXNpbmcgOjphbmRyb2lkOjpHcmFwaGljQnVmZmVyU291cmNlOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjsKKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCitzdHJ1Y3QgU3RvcmVJbnRmIDogcHVibGljIENvbmZpZ3VyYWJsZUMySW50ZiB7CisgICAgU3RvcmVJbnRmKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiYgc3RvcmUpCisgICAgICAgICAgOiBDb25maWd1cmFibGVDMkludGZ7c3RvcmUgPyBzdG9yZS0+Z2V0TmFtZSgpIDogIiIsIDB9LAorICAgICAgICAgICAgbVN0b3Jle3N0b3JlfSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWcoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gKmNvbnN0IGZhaWx1cmVzCisgICAgICAgICAgICApIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gQXNzdW1lIGFsbCBwYXJhbXMgYXJlIGJsb2NraW5nCisgICAgICAgIC8vIFRPRE86IEZpbHRlciBmb3Igc3VwcG9ydGVkIHBhcmFtcworICAgICAgICBpZiAobWF5QmxvY2sgPT0gQzJfRE9OVF9CTE9DSyAmJiBwYXJhbXMuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CTE9DS0lORzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVN0b3JlLT5jb25maWdfc20ocGFyYW1zLCBmYWlsdXJlcyk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpjb25zdCBwYXJhbXMpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgLy8gQXNzdW1lIGFsbCBwYXJhbXMgYXJlIGJsb2NraW5nCisgICAgICAgIC8vIFRPRE86IEZpbHRlciBmb3Igc3VwcG9ydGVkIHBhcmFtcworICAgICAgICBpZiAobWF5QmxvY2sgPT0gQzJfRE9OVF9CTE9DSyAmJiBpbmRpY2VzLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkxPQ0tJTkc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1TdG9yZS0+cXVlcnlfc20oe30sIGluZGljZXMsIHBhcmFtcyk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICpjb25zdCBwYXJhbXMKKyAgICAgICAgICAgICkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbVN0b3JlLT5xdWVyeVN1cHBvcnRlZFBhcmFtc19uYihwYXJhbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIC8vIEFzc3VtZSBhbGwgcGFyYW1zIGFyZSBibG9ja2luZworICAgICAgICAvLyBUT0RPOiBGaWx0ZXIgZm9yIHN1cHBvcnRlZCBwYXJhbXMKKyAgICAgICAgaWYgKG1heUJsb2NrID09IEMyX0RPTlRfQkxPQ0sgJiYgZmllbGRzLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkxPQ0tJTkc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1TdG9yZS0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXNfc20oZmllbGRzKTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gbVN0b3JlOworfTsKKworfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCitDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50U3RvcmUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+JiBzdG9yZSkKKyAgICAgIDogbUNvbmZpZ3VyYWJsZXtuZXcgQ2FjaGVkQ29uZmlndXJhYmxlKHN0ZDo6bWFrZV91bmlxdWU8U3RvcmVJbnRmPihzdG9yZSkpfSwKKyAgICAgICAgbVN0b3Jle3N0b3JlfSB7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gcGxhdGZvcm1TdG9yZSA9IGFuZHJvaWQ6OkdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKTsKKyAgICBTZXRQcmVmZXJyZWRDb2RlYzJDb21wb25lbnRTdG9yZShzdG9yZSk7CisKKyAgICAvLyBSZXRyaWV2ZSBzdHJ1Y3QgZGVzY3JpcHRvcnMKKyAgICBtUGFyYW1SZWZsZWN0b3IgPSBtU3RvcmUtPmdldFBhcmFtUmVmbGVjdG9yKCk7CisKKyAgICAvLyBSZXRyaWV2ZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBmcm9tIHN0b3JlCisgICAgbUluaXQgPSBtQ29uZmlndXJhYmxlLT5pbml0KHRoaXMpOworfQorCitjMl9zdGF0dXNfdCBDb21wb25lbnRTdG9yZTo6c3RhdHVzKCkgY29uc3QgeworICAgIHJldHVybiBtSW5pdDsKK30KKworYzJfc3RhdHVzX3QgQ29tcG9uZW50U3RvcmU6OnZhbGlkYXRlU3VwcG9ydGVkUGFyYW1zKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiYgcGFyYW1zKSB7CisgICAgYzJfc3RhdHVzX3QgcmVzID0gQzJfT0s7CisKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gJmRlc2MgOiBwYXJhbXMpIHsKKyAgICAgICAgaWYgKCFkZXNjKSB7CisgICAgICAgICAgICAvLyBBbGwgZGVzY3JpcHRvcnMgc2hvdWxkIGJlIHZhbGlkCisgICAgICAgICAgICByZXMgPSByZXMgPyByZXMgOiBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggY29yZUluZGV4ID0gZGVzYy0+aW5kZXgoKS5jb3JlSW5kZXgoKTsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cnVjdERlc2NyaXB0b3JzTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbVN0cnVjdERlc2NyaXB0b3JzLmZpbmQoY29yZUluZGV4KTsKKyAgICAgICAgaWYgKGl0ID09IG1TdHJ1Y3REZXNjcmlwdG9ycy5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gc3RydWN0RGVzYyA9CisgICAgICAgICAgICAgICAgICAgIG1QYXJhbVJlZmxlY3Rvci0+ZGVzY3JpYmUoY29yZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghc3RydWN0RGVzYykgeworICAgICAgICAgICAgICAgIC8vIEFsbCBzdXBwb3J0ZWQgcGFyYW1zIG11c3QgYmUgZGVzY3JpYmVkCisgICAgICAgICAgICAgICAgcmVzID0gQzJfQkFEX0lOREVYOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVN0cnVjdERlc2NyaXB0b3JzLmluc2VydCh7IGNvcmVJbmRleCwgc3RydWN0RGVzYyB9KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29tcG9uZW50U3RvcmUKK1JldHVybjx2b2lkPiBDb21wb25lbnRTdG9yZTo6Y3JlYXRlQ29tcG9uZW50KAorICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbmFtZSwKKyAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiYgcG9vbCwKKyAgICAgICAgY3JlYXRlQ29tcG9uZW50X2NiIF9oaWRsX2NiKSB7CisKKyAgICBzcDxDb21wb25lbnQ+IGNvbXBvbmVudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IGMyY29tcG9uZW50OworICAgIFN0YXR1cyBzdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KAorICAgICAgICAgICAgbVN0b3JlLT5jcmVhdGVDb21wb25lbnQobmFtZSwgJmMyY29tcG9uZW50KSk7CisKKyAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgb25JbnRlcmZhY2VMb2FkZWQoYzJjb21wb25lbnQtPmludGYoKSk7CisgICAgICAgIGNvbXBvbmVudCA9IG5ldyBDb21wb25lbnQoYzJjb21wb25lbnQsIGxpc3RlbmVyLCB0aGlzLCBwb29sKTsKKyAgICAgICAgaWYgKCFjb21wb25lbnQpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IFN0YXR1czo6Q09SUlVQVEVEOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVwb3J0Q29tcG9uZW50QmlydGgoY29tcG9uZW50LmdldCgpKTsKKyAgICAgICAgICAgIGlmIChjb21wb25lbnQtPnN0YXR1cygpICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPihjb21wb25lbnQtPnN0YXR1cygpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29tcG9uZW50LT5pbml0TGlzdGVuZXIoY29tcG9uZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LT5zdGF0dXMoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KGNvbXBvbmVudC0+c3RhdHVzKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBfaGlkbF9jYihzdGF0dXMsIGNvbXBvbmVudCk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IENvbXBvbmVudFN0b3JlOjpjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBuYW1lLAorICAgICAgICBjcmVhdGVJbnRlcmZhY2VfY2IgX2hpZGxfY2IpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGMyaW50ZXJmYWNlOworICAgIGMyX3N0YXR1c190IHJlcyA9IG1TdG9yZS0+Y3JlYXRlSW50ZXJmYWNlKG5hbWUsICZjMmludGVyZmFjZSk7CisgICAgc3A8SUNvbXBvbmVudEludGVyZmFjZT4gaW50ZXJmYWNlOworICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgb25JbnRlcmZhY2VMb2FkZWQoYzJpbnRlcmZhY2UpOworICAgICAgICBpbnRlcmZhY2UgPSBuZXcgQ29tcG9uZW50SW50ZXJmYWNlKGMyaW50ZXJmYWNlLCB0aGlzKTsKKyAgICB9CisgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8U3RhdHVzPihyZXMpLCBpbnRlcmZhY2UpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDb21wb25lbnRTdG9yZTo6bGlzdENvbXBvbmVudHMobGlzdENvbXBvbmVudHNfY2IgX2hpZGxfY2IpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+IGMydHJhaXRzID0KKyAgICAgICAgICAgIG1TdG9yZS0+bGlzdENvbXBvbmVudHMoKTsKKyAgICBoaWRsX3ZlYzxJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0cz4gdHJhaXRzKGMydHJhaXRzLnNpemUoKSk7CisgICAgc2l6ZV90IGl4ID0gMDsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPiAmYzJ0cmFpdCA6IGMydHJhaXRzKSB7CisgICAgICAgIGlmIChjMnRyYWl0KSB7CisgICAgICAgICAgICBpZiAob2JqY3B5KCZ0cmFpdHNbaXhdLCAqYzJ0cmFpdCkpIHsKKyAgICAgICAgICAgICAgICArK2l4OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB0cmFpdHMucmVzaXplKGl4KTsKKyAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCB0cmFpdHMpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDb21wb25lbnRTdG9yZTo6Y3JlYXRlSW5wdXRTdXJmYWNlKGNyZWF0ZUlucHV0U3VyZmFjZV9jYiBfaGlkbF9jYikgeworICAgIHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IHNvdXJjZSA9IG5ldyBHcmFwaGljQnVmZmVyU291cmNlKCk7CisgICAgaWYgKHNvdXJjZS0+aW5pdENoZWNrKCkgIT0gT0spIHsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpDT1JSVVBURUQsIG51bGxwdHIpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBzcDxJbnB1dFN1cmZhY2U+IGlucHV0U3VyZmFjZSA9IG5ldyBJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlJlZmxlY3RvckhlbHBlcj4oKSwKKyAgICAgICAgICAgIHNvdXJjZS0+Z2V0SEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpLAorICAgICAgICAgICAgc291cmNlKTsKKyAgICBfaGlkbF9jYihpbnB1dFN1cmZhY2UgPyBTdGF0dXM6Ok9LIDogU3RhdHVzOjpOT19NRU1PUlksCisgICAgICAgICAgICAgaW5wdXRTdXJmYWNlKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCit2b2lkIENvbXBvbmVudFN0b3JlOjpvbkludGVyZmFjZUxvYWRlZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICZpbnRmKSB7CisgICAgLy8gaW52YWxpZGF0ZSB1bnN1cHBvcnRlZCBzdHJ1Y3QgZGVzY3JpcHRvcnMgaWYgYSBuZXcgaW50ZXJmYWNlIGlzIGxvYWRlZCBhcyBpdCBtYXkgaGF2ZQorICAgIC8vIGV4cG9zZWQgbmV3IGRlc2NyaXB0b3JzCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cnVjdERlc2NyaXB0b3JzTXV0ZXgpOworICAgIGlmICghbUxvYWRlZEludGVyZmFjZXMuY291bnQoaW50Zi0+Z2V0TmFtZSgpKSkgeworICAgICAgICBtVW5zdXBwb3J0ZWRTdHJ1Y3REZXNjcmlwdG9ycy5jbGVhcigpOworICAgICAgICBtTG9hZGVkSW50ZXJmYWNlcy5lbXBsYWNlKGludGYtPmdldE5hbWUoKSk7CisgICAgfQorfQorCitSZXR1cm48dm9pZD4gQ29tcG9uZW50U3RvcmU6OmdldFN0cnVjdERlc2NyaXB0b3JzKAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50MzJfdD4mIGluZGljZXMsCisgICAgICAgIGdldFN0cnVjdERlc2NyaXB0b3JzX2NiIF9oaWRsX2NiKSB7CisgICAgaGlkbF92ZWM8U3RydWN0RGVzY3JpcHRvcj4gZGVzY3JpcHRvcnMoaW5kaWNlcy5zaXplKCkpOworICAgIHNpemVfdCBkc3RJeCA9IDA7CisgICAgU3RhdHVzIHJlcyA9IFN0YXR1czo6T0s7CisgICAgZm9yIChzaXplX3Qgc3JjSXggPSAwOyBzcmNJeCA8IGluZGljZXMuc2l6ZSgpOyArK3NyY0l4KSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJ1Y3REZXNjcmlwdG9yc011dGV4KTsKKyAgICAgICAgY29uc3QgQzJQYXJhbTo6Q29yZUluZGV4IGNvcmVJbmRleCA9IEMyUGFyYW06OkNvcmVJbmRleChpbmRpY2VzW3NyY0l4XSkuY29yZUluZGV4KCk7CisgICAgICAgIGNvbnN0IGF1dG8gaXRlbSA9IG1TdHJ1Y3REZXNjcmlwdG9ycy5maW5kKGNvcmVJbmRleCk7CisgICAgICAgIGlmIChpdGVtID09IG1TdHJ1Y3REZXNjcmlwdG9ycy5lbmQoKSkgeworICAgICAgICAgICAgLy8gbm90IGluIHRoZSBjYWNoZSwgYW5kIG5vdCBrbm93biB0byBiZSB1bnN1cHBvcnRlZCwgcXVlcnkgbG9jYWwgcmVmbGVjdG9yCisgICAgICAgICAgICBpZiAoIW1VbnN1cHBvcnRlZFN0cnVjdERlc2NyaXB0b3JzLmNvdW50KGNvcmVJbmRleCkpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBzdHJ1Y3REZXNjID0KKyAgICAgICAgICAgICAgICAgICAgbVBhcmFtUmVmbGVjdG9yLT5kZXNjcmliZShjb3JlSW5kZXgpOworICAgICAgICAgICAgICAgIGlmICghc3RydWN0RGVzYykgeworICAgICAgICAgICAgICAgICAgICBtVW5zdXBwb3J0ZWRTdHJ1Y3REZXNjcmlwdG9ycy5lbXBsYWNlKGNvcmVJbmRleCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0cnVjdERlc2NyaXB0b3JzLmluc2VydCh7IGNvcmVJbmRleCwgc3RydWN0RGVzYyB9KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9iamNweSgmZGVzY3JpcHRvcnNbZHN0SXhdLCAqc3RydWN0RGVzYykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrZHN0SXg7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXMgPSBTdGF0dXM6OkNPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzID0gU3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0gZWxzZSBpZiAoaXRlbS0+c2Vjb25kKSB7CisgICAgICAgICAgICBpZiAob2JqY3B5KCZkZXNjcmlwdG9yc1tkc3RJeF0sICppdGVtLT5zZWNvbmQpKSB7CisgICAgICAgICAgICAgICAgKytkc3RJeDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcyA9IFN0YXR1czo6Q09SUlVQVEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXMgPSBTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGRlc2NyaXB0b3JzLnJlc2l6ZShkc3RJeCk7CisgICAgX2hpZGxfY2IocmVzLCBkZXNjcmlwdG9ycyk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHNwPElDbGllbnRNYW5hZ2VyPj4gQ29tcG9uZW50U3RvcmU6OmdldFBvb2xDbGllbnRNYW5hZ2VyKCkgeworICAgIHJldHVybiBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworfQorCitSZXR1cm48U3RhdHVzPiBDb21wb25lbnRTdG9yZTo6Y29weUJ1ZmZlcihjb25zdCBCdWZmZXImIHNyYywgY29uc3QgQnVmZmVyJiBkc3QpIHsKKyAgICAvLyBUT0RPIGltcGxlbWVudAorICAgICh2b2lkKXNyYzsKKyAgICAodm9pZClkc3Q7CisgICAgcmV0dXJuIFN0YXR1czo6T01JVFRFRDsKK30KKworUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiBDb21wb25lbnRTdG9yZTo6Z2V0Q29uZmlndXJhYmxlKCkgeworICAgIHJldHVybiBtQ29uZmlndXJhYmxlOworfQorCisvLyBDYWxsZWQgZnJvbSBjcmVhdGVDb21wb25lbnQoKSBhZnRlciBhIHN1Y2Nlc3NmdWwgY3JlYXRpb24gb2YgYGNvbXBvbmVudGAuCit2b2lkIENvbXBvbmVudFN0b3JlOjpyZXBvcnRDb21wb25lbnRCaXJ0aChDb21wb25lbnQqIGNvbXBvbmVudCkgeworICAgIENvbXBvbmVudFN0YXR1cyBjb21wb25lbnRTdGF0dXM7CisgICAgY29tcG9uZW50U3RhdHVzLmMyQ29tcG9uZW50ID0gY29tcG9uZW50LT5tQ29tcG9uZW50OworICAgIGNvbXBvbmVudFN0YXR1cy5iaXJ0aFRpbWUgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKKworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Db21wb25lbnRSb3N0ZXJNdXRleCk7CisgICAgbUNvbXBvbmVudFJvc3Rlci5lbXBsYWNlKGNvbXBvbmVudCwgY29tcG9uZW50U3RhdHVzKTsKK30KKworLy8gQ2FsbGVkIGZyb20gd2l0aGluIHRoZSBkZXN0cnVjdG9yIG9mIGBjb21wb25lbnRgLiBObyB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGxzCisvLyBhcmUgbWFkZSBvbiBgY29tcG9uZW50YCBoZXJlLgordm9pZCBDb21wb25lbnRTdG9yZTo6cmVwb3J0Q29tcG9uZW50RGVhdGgoQ29tcG9uZW50KiBjb21wb25lbnQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ29tcG9uZW50Um9zdGVyTXV0ZXgpOworICAgIG1Db21wb25lbnRSb3N0ZXIuZXJhc2UoY29tcG9uZW50KTsKK30KKworLy8gRHVtcHMgY29tcG9uZW50IHRyYWl0cy4KK3N0ZDo6b3N0cmVhbSYgQ29tcG9uZW50U3RvcmU6OmR1bXAoCisgICAgICAgIHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4mIGNvbXApIHsKKworICAgIGNvbnN0ZXhwciBjb25zdCBjaGFyIGluZGVudFtdID0gIiAgICAiOworCisgICAgb3V0IDw8IGluZGVudCA8PCAibmFtZTogIiA8PCBjb21wLT5uYW1lIDw8IHN0ZDo6ZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50IDw8ICJkb21haW46ICIgPDwgY29tcC0+ZG9tYWluIDw8IHN0ZDo6ZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50IDw8ICJraW5kOiAiIDw8IGNvbXAtPmtpbmQgPDwgc3RkOjplbmRsOworICAgIG91dCA8PCBpbmRlbnQgPDwgInJhbms6ICIgPDwgY29tcC0+cmFuayA8PCBzdGQ6OmVuZGw7CisgICAgb3V0IDw8IGluZGVudCA8PCAibWVkaWFUeXBlOiAiIDw8IGNvbXAtPm1lZGlhVHlwZSA8PCBzdGQ6OmVuZGw7CisgICAgb3V0IDw8IGluZGVudCA8PCAiYWxpYXNlczoiOworICAgIGZvciAoY29uc3QgYXV0byYgYWxpYXMgOiBjb21wLT5hbGlhc2VzKSB7CisgICAgICAgIG91dCA8PCAnICcgPDwgYWxpYXM7CisgICAgfQorICAgIG91dCA8PCBzdGQ6OmVuZGw7CisKKyAgICByZXR1cm4gb3V0OworfQorCisvLyBEdW1wcyBjb21wb25lbnQgc3RhdHVzLgorc3RkOjpvc3RyZWFtJiBDb21wb25lbnRTdG9yZTo6ZHVtcCgKKyAgICAgICAgc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgIENvbXBvbmVudFN0YXR1cyYgY29tcFN0YXR1cykgeworCisgICAgY29uc3RleHByIGNvbnN0IGNoYXIgaW5kZW50W10gPSAiICAgICI7CisKKyAgICAvLyBQcmludCBiaXJ0aCB0aW1lLgorICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgbXMgPQorICAgICAgICAgICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4oCisgICAgICAgICAgICAgICAgY29tcFN0YXR1cy5iaXJ0aFRpbWUudGltZV9zaW5jZV9lcG9jaCgpKTsKKyAgICBzdGQ6OnRpbWVfdCBiaXJ0aFRpbWUgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0b190aW1lX3QoCisgICAgICAgICAgICBjb21wU3RhdHVzLmJpcnRoVGltZSk7CisgICAgc3RkOjp0bSB0bSA9ICpzdGQ6OmxvY2FsdGltZSgmYmlydGhUaW1lKTsKKyAgICBvdXQgPDwgaW5kZW50IDw8ICJDcmVhdGlvbiB0aW1lOiAiCisgICAgICAgIDw8IHN0ZDo6cHV0X3RpbWUoJnRtLCAiJVktJW0tJWQgJUg6JU06JVMiKQorICAgICAgICA8PCAnLicgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KDMpIDw8IG1zLmNvdW50KCkgJSAxMDAwCisgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKworICAgIC8vIFByaW50IG5hbWUgYW5kIGlkLgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZiA9IGNvbXBTdGF0dXMuYzJDb21wb25lbnQtPmludGYoKTsKKyAgICBpZiAoIWludGYpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCA8PCAiVW5rbm93biBjb21wb25lbnQgLS0gbnVsbCBpbnRlcmZhY2UiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIG91dDsKKyAgICB9CisgICAgb3V0IDw8IGluZGVudCA8PCAiTmFtZTogIiA8PCBpbnRmLT5nZXROYW1lKCkgPDwgc3RkOjplbmRsOworICAgIG91dCA8PCBpbmRlbnQgPDwgIklkOiAiIDw8IGludGYtPmdldElkKCkgPDwgc3RkOjplbmRsOworCisgICAgcmV0dXJuIG91dDsKK30KKworLy8gRHVtcHMgaW5mb3JtYXRpb24gd2hlbiBsc2hhbCBpcyBjYWxsZWQuCitSZXR1cm48dm9pZD4gQ29tcG9uZW50U3RvcmU6OmRlYnVnKAorICAgICAgICBjb25zdCBoaWRsX2hhbmRsZSYgaGFuZGxlLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4mIC8qIGFyZ3MgKi8pIHsKKyAgICBMT0coSU5GTykgPDwgImRlYnVnIC0tIGR1bXBpbmcuLi4iOworICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaCA9IGhhbmRsZS5nZXROYXRpdmVIYW5kbGUoKTsKKyAgICBpZiAoIWggfHwgaC0+bnVtRmRzICE9IDEpIHsKKyAgICAgICBMT0coRVJST1IpIDw8ICJkZWJ1ZyAtLSBkdW1waW5nIGZhaWxlZCAtLSAiCisgICAgICAgICAgICAgICAiaW52YWxpZCBmaWxlIGRlc2NyaXB0b3IgdG8gZHVtcCB0byI7CisgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKworICAgIHsgLy8gUG9wdWxhdGUgIm91dCIuCisKKyAgICAgICAgY29uc3RleHByIGNvbnN0IGNoYXIgaW5kZW50W10gPSAiICAiOworCisgICAgICAgIC8vIFNob3cgbmFtZS4KKyAgICAgICAgb3V0IDw8ICJCZWdpbm5pbmcgb2YgZHVtcCAtLSBDMkNvbXBvbmVudFN0b3JlOiAiCisgICAgICAgICAgICAgICAgPDwgbVN0b3JlLT5nZXROYW1lKCkgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKworICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgY29tcG9uZW50cy4KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+PiB0cmFpdHNMaXN0ID0KKyAgICAgICAgICAgICAgICBtU3RvcmUtPmxpc3RDb21wb25lbnRzKCk7CisKKyAgICAgICAgLy8gRHVtcCB0aGUgdHJhaXRzIG9mIHN1cHBvcnRlZCBjb21wb25lbnRzLgorICAgICAgICBvdXQgPDwgaW5kZW50IDw8ICJTdXBwb3J0ZWQgY29tcG9uZW50czoiIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisgICAgICAgIGlmICh0cmFpdHNMaXN0LnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50IDw8IGluZGVudCA8PCAiTk9ORSIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgdHJhaXRzIDogdHJhaXRzTGlzdCkgeworICAgICAgICAgICAgICAgIGR1bXAob3V0LCB0cmFpdHMpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIER1bXAgYWN0aXZlIGNvbXBvbmVudHMuCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQgPDwgIkFjdGl2ZSBjb21wb25lbnRzOiIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Db21wb25lbnRSb3N0ZXJNdXRleCk7CisgICAgICAgICAgICBpZiAobUNvbXBvbmVudFJvc3Rlci5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQgPDwgaW5kZW50IDw8ICJOT05FIiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIHBhaXIgOiBtQ29tcG9uZW50Um9zdGVyKSB7CisgICAgICAgICAgICAgICAgICAgIGR1bXAob3V0LCBwYWlyLnNlY29uZCkgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG91dCA8PCAiRW5kIG9mIGR1bXAgLS0gQzJDb21wb25lbnRTdG9yZTogIgorICAgICAgICAgICAgICAgIDw8IG1TdG9yZS0+Z2V0TmFtZSgpIDw8IHN0ZDo6ZW5kbDsKKyAgICB9CisKKyAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OldyaXRlU3RyaW5nVG9GZChvdXQuc3RyKCksIGgtPmRhdGFbMF0pKSB7CisgICAgICAgIFBMT0coV0FSTklORykgPDwgImRlYnVnIC0tIGR1bXBpbmcgZmFpbGVkIC0tIHdyaXRlKCkiOworICAgIH0gZWxzZSB7CisgICAgICAgIExPRyhJTkZPKSA8PCAiZGVidWcgLS0gZHVtcGluZyBzdWNjZWVkZWQiOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db25maWd1cmFibGUuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbmZpZ3VyYWJsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM5YzE3MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db25maWd1cmFibGUuY3BwCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi1Db25maWd1cmFibGUiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db25maWd1cmFibGUuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOworCitDYWNoZWRDb25maWd1cmFibGU6OkNhY2hlZENvbmZpZ3VyYWJsZSgKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENvbmZpZ3VyYWJsZUMySW50Zj4mJiBpbnRmKQorICAgICAgOiBtSW50ZntzdGQ6Om1vdmUoaW50Zil9IHsKK30KKworYzJfc3RhdHVzX3QgQ2FjaGVkQ29uZmlndXJhYmxlOjppbml0KENvbXBvbmVudFN0b3JlKiBzdG9yZSkgeworICAgIC8vIFJldHJpZXZlIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGZyb20gc3RvcmUKKyAgICBjMl9zdGF0dXNfdCBpbml0ID0gbUludGYtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKCZtU3VwcG9ydGVkUGFyYW1zKTsKKyAgICBjMl9zdGF0dXNfdCB2YWxpZGF0ZSA9IHN0b3JlLT52YWxpZGF0ZVN1cHBvcnRlZFBhcmFtcyhtU3VwcG9ydGVkUGFyYW1zKTsKKyAgICByZXR1cm4gaW5pdCA9PSBDMl9PSyA/IEMyX09LIDogdmFsaWRhdGU7Cit9CisKKy8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb25maWd1cmFibGUgZm9sbG93LgorUmV0dXJuPHVpbnQzMl90PiBDYWNoZWRDb25maWd1cmFibGU6OmdldElkKCkgeworICAgIHJldHVybiBtSW50Zi0+Z2V0SWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IENhY2hlZENvbmZpZ3VyYWJsZTo6Z2V0TmFtZShnZXROYW1lX2NiIF9oaWRsX2NiKSB7CisgICAgX2hpZGxfY2IobUludGYtPmdldE5hbWUoKSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IENhY2hlZENvbmZpZ3VyYWJsZTo6cXVlcnkoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQzMl90PiYgaW5kaWNlcywKKyAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgcXVlcnlfY2IgX2hpZGxfY2IpIHsKKyAgICB0eXBlZGVmIEMyUGFyYW06OkluZGV4IEluZGV4OworICAgIHN0ZDo6dmVjdG9yPEluZGV4PiBjMmhlYXBQYXJhbUluZGljZXMoCisgICAgICAgICAgICAoSW5kZXgqKWluZGljZXMuZGF0YSgpLAorICAgICAgICAgICAgKEluZGV4KilpbmRpY2VzLmRhdGEoKSArIGluZGljZXMuc2l6ZSgpKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGMyaGVhcFBhcmFtczsKKyAgICBjMl9zdGF0dXNfdCBjMnJlcyA9IG1JbnRmLT5xdWVyeSgKKyAgICAgICAgICAgIGMyaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgICAgIG1heUJsb2NrID8gQzJfTUFZX0JMT0NLIDogQzJfRE9OVF9CTE9DSywKKyAgICAgICAgICAgICZjMmhlYXBQYXJhbXMpOworCisgICAgaGlkbF92ZWM8dWludDhfdD4gcGFyYW1zOworICAgIGlmICghY3JlYXRlUGFyYW1zQmxvYigmcGFyYW1zLCBjMmhlYXBQYXJhbXMpKSB7CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicXVlcnkgLS0gaW52YWxpZCBvdXRwdXQgcGFyYW1zLiI7CisgICAgfQorICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PFN0YXR1cz4oYzJyZXMpLCBwYXJhbXMpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDYWNoZWRDb25maWd1cmFibGU6OmNvbmZpZygKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGluUGFyYW1zLAorICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICBjb25maWdfY2IgX2hpZGxfY2IpIHsKKyAgICAvLyBpblBhcmFtcyBpcyBub3Qgd3JpdGFibGUsIHNvIGNyZWF0ZSBhIGNvcHkgYXMgY29uZmlnIG1vZGlmaWVzIHRoZSBwYXJhbWV0ZXJzCisgICAgaGlkbF92ZWM8dWludDhfdD4gaW5QYXJhbXNDb3B5ID0gaW5QYXJhbXM7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IGMycGFyYW1zOworICAgIGlmICghcGFyc2VQYXJhbXNCbG9iKCZjMnBhcmFtcywgaW5QYXJhbXNDb3B5KSkgeworICAgICAgICBMT0coV0FSTklORykgPDwgImNvbmZpZyAtLSBpbnZhbGlkIGlucHV0IHBhcmFtcy4iOworICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkNPUlJVUFRFRCwKKyAgICAgICAgICAgICAgICBoaWRsX3ZlYzxTZXR0aW5nUmVzdWx0PigpLAorICAgICAgICAgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+KCkpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICAvLyBUT0RPOiBjaGVjayBpZiBibG9iIHdhcyBpbnZhbGlkCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGMyZmFpbHVyZXM7CisgICAgYzJfc3RhdHVzX3QgYzJyZXMgPSBtSW50Zi0+Y29uZmlnKAorICAgICAgICAgICAgYzJwYXJhbXMsCisgICAgICAgICAgICBtYXlCbG9jayA/IEMyX01BWV9CTE9DSyA6IEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAmYzJmYWlsdXJlcyk7CisgICAgaGlkbF92ZWM8U2V0dGluZ1Jlc3VsdD4gZmFpbHVyZXMoYzJmYWlsdXJlcy5zaXplKCkpOworICAgIHsKKyAgICAgICAgc2l6ZV90IGl4ID0gMDsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiYgYzJyZXN1bHQgOiBjMmZhaWx1cmVzKSB7CisgICAgICAgICAgICBpZiAoYzJyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBpZiAob2JqY3B5KCZmYWlsdXJlc1tpeF0sICpjMnJlc3VsdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKytpeDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJjb25maWcgLS0gaW52YWxpZCBzZXR0aW5nIHJlc3VsdHMuIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZhaWx1cmVzLnJlc2l6ZShpeCk7CisgICAgfQorICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IG91dFBhcmFtczsKKyAgICBpZiAoIWNyZWF0ZVBhcmFtc0Jsb2IoJm91dFBhcmFtcywgYzJwYXJhbXMpKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgImNvbmZpZyAtLSBpbnZhbGlkIG91dHB1dCBwYXJhbXMuIjsKKyAgICB9CisgICAgX2hpZGxfY2IoKFN0YXR1cyljMnJlcywgZmFpbHVyZXMsIG91dFBhcmFtcyk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IENhY2hlZENvbmZpZ3VyYWJsZTo6cXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgIHVpbnQzMl90IHN0YXJ0LAorICAgICAgICB1aW50MzJfdCBjb3VudCwKKyAgICAgICAgcXVlcnlTdXBwb3J0ZWRQYXJhbXNfY2IgX2hpZGxfY2IpIHsKKyAgICBDMkxpbmVhclJhbmdlIHJlcXVlc3QgPSBDMkxpbmVhckNhcGFjaXR5KG1TdXBwb3J0ZWRQYXJhbXMuc2l6ZSgpKS5yYW5nZSgKKyAgICAgICAgICAgIHN0YXJ0LCBjb3VudCk7CisgICAgaGlkbF92ZWM8UGFyYW1EZXNjcmlwdG9yPiBwYXJhbXMocmVxdWVzdC5zaXplKCkpOworICAgIFN0YXR1cyByZXMgPSBTdGF0dXM6Ok9LOworICAgIHNpemVfdCBkc3RJeCA9IDA7CisgICAgZm9yIChzaXplX3Qgc3JjSXggPSByZXF1ZXN0Lm9mZnNldCgpOyBzcmNJeCA8IHJlcXVlc3QuZW5kT2Zmc2V0KCk7ICsrc3JjSXgpIHsKKyAgICAgICAgaWYgKG1TdXBwb3J0ZWRQYXJhbXNbc3JjSXhdKSB7CisgICAgICAgICAgICBpZiAob2JqY3B5KCZwYXJhbXNbZHN0SXhdLCAqbVN1cHBvcnRlZFBhcmFtc1tzcmNJeF0pKSB7CisgICAgICAgICAgICAgICAgKytkc3RJeDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzID0gU3RhdHVzOjpDT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJxdWVyeVN1cHBvcnRlZFBhcmFtcyAtLSBpbnZhbGlkIG91dHB1dCBwYXJhbXMuIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IFN0YXR1czo6QkFEX0lOREVYOworICAgICAgICB9CisgICAgfQorICAgIHBhcmFtcy5yZXNpemUoZHN0SXgpOworICAgIF9oaWRsX2NiKHJlcywgcGFyYW1zKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gQ2FjaGVkQ29uZmlndXJhYmxlOjpxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8RmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4mIGluRmllbGRzLAorICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICBxdWVyeVN1cHBvcnRlZFZhbHVlc19jYiBfaGlkbF9jYikgeworICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gYzJmaWVsZHM7CisgICAgeworICAgICAgICAvLyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgb2JqZWN0cyBhcmUgcmVzdHJpY3RlZCBpbiB0aGF0IHNvbWUKKyAgICAgICAgLy8gbWVtYmVycyBhcmUgY29uc3QuCisgICAgICAgIC8vIEMyUGFyYW1GaWVsZCAtIHJlcXVpcmVkIGZvciBpdHMgY29uc3RydWN0b3IgLSBoYXMgbm8gY29uc3RydWN0b3JzCisgICAgICAgIC8vIGZyb20gZmllbGRzLiBVc2UgQzJQYXJhbUluc3BlY3Rvci4KKyAgICAgICAgZm9yIChjb25zdCBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5ICZxdWVyeSA6IGluRmllbGRzKSB7CisgICAgICAgICAgICBjMmZpZWxkcy5lbXBsYWNlX2JhY2soX0MyUGFyYW1JbnNwZWN0b3I6OkNyZWF0ZVBhcmFtRmllbGQoCisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LmZpZWxkLmluZGV4LAorICAgICAgICAgICAgICAgICAgICBxdWVyeS5maWVsZC5maWVsZElkLm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgcXVlcnkuZmllbGQuZmllbGRJZC5zaXplKSwKKyAgICAgICAgICAgICAgICAgICAgcXVlcnkudHlwZSA9PSBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpUeXBlOjpQT1NTSUJMRSA/CisgICAgICAgICAgICAgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6UE9TU0lCTEUgOgorICAgICAgICAgICAgICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OkNVUlJFTlQpOworICAgICAgICB9CisgICAgfQorICAgIGMyX3N0YXR1c190IGMycmVzID0gbUludGYtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgYzJmaWVsZHMsCisgICAgICAgICAgICBtYXlCbG9jayA/IEMyX01BWV9CTE9DSyA6IEMyX0RPTlRfQkxPQ0spOworICAgIGhpZGxfdmVjPEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQ+IG91dEZpZWxkcyhpbkZpZWxkcy5zaXplKCkpOworICAgIHNpemVfdCBkc3RJeCA9IDA7CisgICAgZm9yIChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgJnJlc3VsdCA6IGMyZmllbGRzKSB7CisgICAgICAgIGlmIChvYmpjcHkoJm91dEZpZWxkc1tkc3RJeF0sIHJlc3VsdCkpIHsKKyAgICAgICAgICAgICsrZHN0SXg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXRGaWVsZHMucmVzaXplKGRzdEl4KTsKKyAgICAgICAgICAgIGMycmVzID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJxdWVyeVN1cHBvcnRlZFZhbHVlcyAtLSBpbnZhbGlkIG91dHB1dCBwYXJhbXMuIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIF9oaWRsX2NiKChTdGF0dXMpYzJyZXMsIG91dEZpZWxkcyk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0QnVmZmVyTWFuYWdlci5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvSW5wdXRCdWZmZXJNYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDIzYTA1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0QnVmZmVyTWFuYWdlci5jcHAKQEAgLTAsMCArMSw0NjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLUlucHV0QnVmZmVyTWFuYWdlciIKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0lucHV0QnVmZmVyTWFuYWdlci5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC90eXBlcy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudExpc3RlbmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisKKyNpbmNsdWRlIDxjaHJvbm8+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ7CisKK3ZvaWQgSW5wdXRCdWZmZXJNYW5hZ2VyOjpyZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgIGNvbnN0IEMyRnJhbWVEYXRhJiBpbnB1dCkgeworICAgIGdldEluc3RhbmNlKCkuX3JlZ2lzdGVyRnJhbWVEYXRhKGxpc3RlbmVyLCBpbnB1dCk7Cit9CisKK3ZvaWQgSW5wdXRCdWZmZXJNYW5hZ2VyOjp1bnJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICBjb25zdCB3cDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KSB7CisgICAgZ2V0SW5zdGFuY2UoKS5fdW5yZWdpc3RlckZyYW1lRGF0YShsaXN0ZW5lciwgaW5wdXQpOworfQorCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6dW5yZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgY29uc3Qgd3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIpIHsKKyAgICBnZXRJbnN0YW5jZSgpLl91bnJlZ2lzdGVyRnJhbWVEYXRhKGxpc3RlbmVyKTsKK30KKwordm9pZCBJbnB1dEJ1ZmZlck1hbmFnZXI6OnNldE5vdGlmaWNhdGlvbkludGVydmFsKAorICAgICAgICBuc2Vjc190IG5vdGlmaWNhdGlvbkludGVydmFsTnMpIHsKKyAgICBnZXRJbnN0YW5jZSgpLl9zZXROb3RpZmljYXRpb25JbnRlcnZhbChub3RpZmljYXRpb25JbnRlcnZhbE5zKTsKK30KKwordm9pZCBJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9yZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgIGNvbnN0IEMyRnJhbWVEYXRhJiBpbnB1dCkgeworICAgIHVpbnQ2NF90IGZyYW1lSW5kZXggPSBpbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICBMT0coVkVSQk9TRSkgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X3JlZ2lzdGVyRnJhbWVEYXRhIC0tIGNhbGxlZCB3aXRoICIKKyAgICAgICAgICAgICAgICAgPDwgImxpc3RlbmVyIEAgMHgiIDw8IHN0ZDo6aGV4IDw8IGxpc3RlbmVyLmdldCgpCisgICAgICAgICAgICAgICAgIDw8ICIsIGZyYW1lSW5kZXggPSAiIDw8IHN0ZDo6ZGVjIDw8IGZyYW1lSW5kZXgKKyAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisKKyAgICBzdGQ6OnNldDxUcmFja2VkQnVmZmVyPiAmYnVmZmVySWRzID0KKyAgICAgICAgICAgIG1UcmFja2VkQnVmZmVyc01hcFtsaXN0ZW5lcl1bZnJhbWVJbmRleF07CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlucHV0LmJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKCFpbnB1dC5idWZmZXJzW2ldKSB7CisgICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X3JlZ2lzdGVyRnJhbWVEYXRhIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiSW5wdXQgYnVmZmVyIGF0IGluZGV4ICIgPDwgaSA8PCAiIGlzIG51bGwuIjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IFRyYWNrZWRCdWZmZXIgJmJ1ZmZlcklkID0KKyAgICAgICAgICAgICAgICAqYnVmZmVySWRzLmVtcGxhY2UobGlzdGVuZXIsIGZyYW1lSW5kZXgsIGksIGlucHV0LmJ1ZmZlcnNbaV0pLgorICAgICAgICAgICAgICAgIGZpcnN0OworCisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGlucHV0LmJ1ZmZlcnNbaV0tPnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KAorICAgICAgICAgICAgICAgIG9uQnVmZmVyRGVzdHJveWVkLAorICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dm9pZCo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KCZidWZmZXJJZCkpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpfcmVnaXN0ZXJGcmFtZURhdGEgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAicmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoKSBmYWlsZWQgIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAiKGxpc3RlbmVyIEAgMHgiIDw8IHN0ZDo6aGV4IDw8IGxpc3RlbmVyLmdldCgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGZyYW1lSW5kZXggPSAiIDw8IHN0ZDo6ZGVjIDw8IGZyYW1lSW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgYnVmZmVySW5kZXggPSAiIDw8IGkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIikgPT4gc3RhdHVzID0gIiA8PCBzdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICB9CisgICAgfQorCisgICAgbURlYXRoTm90aWZpY2F0aW9ucy5lbXBsYWNlKAorICAgICAgICAgICAgbGlzdGVuZXIsCisgICAgICAgICAgICBEZWF0aE5vdGlmaWNhdGlvbnMoCisgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkludGVydmFsTnMubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKSkpOworfQorCisvLyBSZW1vdmUgYSBwYWlyIChsaXN0ZW5lciwgZnJhbWVJbmRleCkgZnJvbSBtVHJhY2tlZEJ1ZmZlcnNNYXAgYW5kCisvLyBtRGVhdGhOb3RpZmljYXRpb25zLiBUaGlzIGltcGxpZXMgYWxsIGJ1ZmZlckluZGljZXMgYXJlIHJlbW92ZWQuCisvLworLy8gVGhpcyBpcyBjYWxsZWQgZnJvbSBvbldvcmtEb25lKCkgYW5kIGZsdXNoKCkuCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6X3VucmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgIGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBjb25zdCBDMkZyYW1lRGF0YSYgaW5wdXQpIHsKKyAgICB1aW50NjRfdCBmcmFtZUluZGV4ID0gaW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgTE9HKFZFUkJPU0UpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol91bnJlZ2lzdGVyRnJhbWVEYXRhIC0tIGNhbGxlZCB3aXRoICIKKyAgICAgICAgICAgICAgICAgPDwgImxpc3RlbmVyIEAgMHgiIDw8IHN0ZDo6aGV4IDw8IGxpc3RlbmVyLnVuc2FmZV9nZXQoKQorICAgICAgICAgICAgICAgICA8PCAiLCBmcmFtZUluZGV4ID0gIiA8PCBzdGQ6OmRlYyA8PCBmcmFtZUluZGV4CisgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworCisgICAgYXV0byBmaW5kTGlzdGVuZXIgPSBtVHJhY2tlZEJ1ZmZlcnNNYXAuZmluZChsaXN0ZW5lcik7CisgICAgaWYgKGZpbmRMaXN0ZW5lciAhPSBtVHJhY2tlZEJ1ZmZlcnNNYXAuZW5kKCkpIHsKKyAgICAgICAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6c2V0PFRyYWNrZWRCdWZmZXI+PiAmZnJhbWVJbmRleDJCdWZmZXJJZHMKKyAgICAgICAgICAgICAgICA9IGZpbmRMaXN0ZW5lci0+c2Vjb25kOworICAgICAgICBhdXRvIGZpbmRGcmFtZUluZGV4ID0gZnJhbWVJbmRleDJCdWZmZXJJZHMuZmluZChmcmFtZUluZGV4KTsKKyAgICAgICAgaWYgKGZpbmRGcmFtZUluZGV4ICE9IGZyYW1lSW5kZXgyQnVmZmVySWRzLmVuZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnNldDxUcmFja2VkQnVmZmVyPiAmYnVmZmVySWRzID0gZmluZEZyYW1lSW5kZXgtPnNlY29uZDsKKyAgICAgICAgICAgIGZvciAoY29uc3QgVHJhY2tlZEJ1ZmZlciYgYnVmZmVySWQgOiBidWZmZXJJZHMpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGJ1ZmZlcklkLmJ1ZmZlci5sb2NrKCk7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBidWZmZXItPnVucmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25CdWZmZXJEZXN0cm95ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDx2b2lkKj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4oJmJ1ZmZlcklkKSkpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol91bnJlZ2lzdGVyRnJhbWVEYXRhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi0tIHVucmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoKSBmYWlsZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKGxpc3RlbmVyIEAgMHgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjpoZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBidWZmZXJJZC5saXN0ZW5lci51bnNhZmVfZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgZnJhbWVJbmRleCA9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmRlYyA8PCBidWZmZXJJZC5mcmFtZUluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGJ1ZmZlckluZGV4ID0gIiA8PCBidWZmZXJJZC5idWZmZXJJbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKSA9PiBzdGF0dXMgPSAiIDw8IHN0YXR1cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZyYW1lSW5kZXgyQnVmZmVySWRzLmVyYXNlKGZpbmRGcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmIChmcmFtZUluZGV4MkJ1ZmZlcklkcy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgbVRyYWNrZWRCdWZmZXJzTWFwLmVyYXNlKGZpbmRMaXN0ZW5lcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdXRvIGZpbmRMaXN0ZW5lckQgPSBtRGVhdGhOb3RpZmljYXRpb25zLmZpbmQobGlzdGVuZXIpOworICAgIGlmIChmaW5kTGlzdGVuZXJEICE9IG1EZWF0aE5vdGlmaWNhdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgRGVhdGhOb3RpZmljYXRpb25zICZkZWF0aE5vdGlmaWNhdGlvbnMgPSBmaW5kTGlzdGVuZXJELT5zZWNvbmQ7CisgICAgICAgIGF1dG8gZmluZEZyYW1lSW5kZXggPSBkZWF0aE5vdGlmaWNhdGlvbnMuaW5kaWNlcy5maW5kKGZyYW1lSW5kZXgpOworICAgICAgICBpZiAoZmluZEZyYW1lSW5kZXggIT0gZGVhdGhOb3RpZmljYXRpb25zLmluZGljZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gJmJ1ZmZlckluZGljZXMgPSBmaW5kRnJhbWVJbmRleC0+c2Vjb25kOworICAgICAgICAgICAgZGVhdGhOb3RpZmljYXRpb25zLmNvdW50IC09IGJ1ZmZlckluZGljZXMuc2l6ZSgpOworICAgICAgICAgICAgZGVhdGhOb3RpZmljYXRpb25zLmluZGljZXMuZXJhc2UoZmluZEZyYW1lSW5kZXgpOworICAgICAgICB9CisgICAgfQorfQorCisvLyBSZW1vdmUgbGlzdGVuZXIgZnJvbSBtVHJhY2tlZEJ1ZmZlcnNNYXAgYW5kIG1EZWF0aE5vdGlmaWNhdGlvbnMuIFRoaXMgaW1wbGllcworLy8gYWxsIGZyYW1lSW5kaWNlcyBhbmQgYnVmZmVySW5kaWNlcyBhcmUgcmVtb3ZlZC4KKy8vCisvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBjb21wb25lbnQgY2xlYW5zIHVwIGFsbCBpbnB1dCBidWZmZXJzLCBpLmUuLCB3aGVuCisvLyByZXNldCgpLCByZWxlYXNlKCksIHN0b3AoKSBvciB+Q29tcG9uZW50KCkgaXMgY2FsbGVkLgordm9pZCBJbnB1dEJ1ZmZlck1hbmFnZXI6Ol91bnJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICBjb25zdCB3cDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lcikgeworICAgIExPRyhWRVJCT1NFKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpfdW5yZWdpc3RlckZyYW1lRGF0YSAtLSBjYWxsZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgIDw8ICJsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleCA8PCBsaXN0ZW5lci51bnNhZmVfZ2V0KCkKKyAgICAgICAgICAgICAgICAgPDwgc3RkOjpkZWMgPDwgIi4iOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisKKyAgICBhdXRvIGZpbmRMaXN0ZW5lciA9IG1UcmFja2VkQnVmZmVyc01hcC5maW5kKGxpc3RlbmVyKTsKKyAgICBpZiAoZmluZExpc3RlbmVyICE9IG1UcmFja2VkQnVmZmVyc01hcC5lbmQoKSkgeworICAgICAgICBzdGQ6Om1hcDx1aW50NjRfdCwgc3RkOjpzZXQ8VHJhY2tlZEJ1ZmZlcj4+ICZmcmFtZUluZGV4MkJ1ZmZlcklkcyA9CisgICAgICAgICAgICAgICAgZmluZExpc3RlbmVyLT5zZWNvbmQ7CisgICAgICAgIGZvciAoYXV0byBmaW5kRnJhbWVJbmRleCA9IGZyYW1lSW5kZXgyQnVmZmVySWRzLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgZmluZEZyYW1lSW5kZXggIT0gZnJhbWVJbmRleDJCdWZmZXJJZHMuZW5kKCk7CisgICAgICAgICAgICAgICAgKytmaW5kRnJhbWVJbmRleCkgeworICAgICAgICAgICAgc3RkOjpzZXQ8VHJhY2tlZEJ1ZmZlcj4gJmJ1ZmZlcklkcyA9IGZpbmRGcmFtZUluZGV4LT5zZWNvbmQ7CisgICAgICAgICAgICBmb3IgKGNvbnN0IFRyYWNrZWRCdWZmZXImIGJ1ZmZlcklkIDogYnVmZmVySWRzKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBidWZmZXJJZC5idWZmZXIubG9jaygpOworICAgICAgICAgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gYnVmZmVyLT51bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQnVmZmVyRGVzdHJveWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dm9pZCo+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KCZidWZmZXJJZCkpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpfdW5yZWdpc3RlckZyYW1lRGF0YSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICItLSB1bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KCkgZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIihsaXN0ZW5lciBAIDB4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6aGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgYnVmZmVySWQubGlzdGVuZXIudW5zYWZlX2dldCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGZyYW1lSW5kZXggPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjpkZWMgPDwgYnVmZmVySWQuZnJhbWVJbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBidWZmZXJJbmRleCA9ICIgPDwgYnVmZmVySWQuYnVmZmVySW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIikgPT4gc3RhdHVzID0gIiA8PCBzdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1UcmFja2VkQnVmZmVyc01hcC5lcmFzZShmaW5kTGlzdGVuZXIpOworICAgIH0KKworICAgIG1EZWF0aE5vdGlmaWNhdGlvbnMuZXJhc2UobGlzdGVuZXIpOworfQorCisvLyBTZXQgbU5vdGlmaWNhdGlvbkludGVydmFsTnMuCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6X3NldE5vdGlmaWNhdGlvbkludGVydmFsKAorICAgICAgICBuc2Vjc190IG5vdGlmaWNhdGlvbkludGVydmFsTnMpIHsKKyAgICBtTm90aWZpY2F0aW9uSW50ZXJ2YWxOcy5zdG9yZSgKKyAgICAgICAgICAgIG5vdGlmaWNhdGlvbkludGVydmFsTnMsCisgICAgICAgICAgICBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKK30KKworLy8gTW92ZSBhIGJ1ZmZlciBmcm9tIG1UcmFja2VkQnVmZmVyc01hcCB0byBtRGVhdGhOb3RpZmljYXRpb25zLgorLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiBhIHJlZ2lzdGVyZWQgQzJCdWZmZXIgb2JqZWN0IGlzIGRlc3Ryb3llZC4KK3ZvaWQgSW5wdXRCdWZmZXJNYW5hZ2VyOjpvbkJ1ZmZlckRlc3Ryb3llZChjb25zdCBDMkJ1ZmZlciogYnVmLCB2b2lkKiBhcmcpIHsKKyAgICBnZXRJbnN0YW5jZSgpLl9vbkJ1ZmZlckRlc3Ryb3llZChidWYsIGFyZyk7Cit9CisKK3ZvaWQgSW5wdXRCdWZmZXJNYW5hZ2VyOjpfb25CdWZmZXJEZXN0cm95ZWQoY29uc3QgQzJCdWZmZXIqIGJ1Ziwgdm9pZCogYXJnKSB7CisgICAgaWYgKCFidWYgfHwgIWFyZykgeworICAgICAgICBMT0coV0FSTklORykgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X29uQnVmZmVyRGVzdHJveWVkIC0tIGNhbGxlZCB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJudWxsIGFyZ3VtZW50IChzKTogIgorICAgICAgICAgICAgICAgICAgICAgPDwgImJ1ZiBAIDB4IiA8PCBzdGQ6OmhleCA8PCBidWYKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGFyZyBAIDB4IiA8PCBzdGQ6OmhleCA8PCBhcmcKKyAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZGVjIDw8ICIuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBUcmFja2VkQnVmZmVyIGlkKCpyZWludGVycHJldF9jYXN0PFRyYWNrZWRCdWZmZXIqPihhcmcpKTsKKyAgICBMT0coVkVSQk9TRSkgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X29uQnVmZmVyRGVzdHJveWVkIC0tIGNhbGxlZCB3aXRoICIKKyAgICAgICAgICAgICAgICAgPDwgImJ1ZiBAIDB4IiA8PCBzdGQ6OmhleCA8PCBidWYKKyAgICAgICAgICAgICAgICAgPDwgIiwgYXJnIEAgMHgiIDw8IHN0ZDo6aGV4IDw8IGFyZworICAgICAgICAgICAgICAgICA8PCBzdGQ6OmRlYyA8PCAiIC0tICIKKyAgICAgICAgICAgICAgICAgPDwgImxpc3RlbmVyIEAgMHgiIDw8IHN0ZDo6aGV4IDw8IGlkLmxpc3RlbmVyLnVuc2FmZV9nZXQoKQorICAgICAgICAgICAgICAgICA8PCAiLCBmcmFtZUluZGV4ID0gIiA8PCBzdGQ6OmRlYyA8PCBpZC5mcmFtZUluZGV4CisgICAgICAgICAgICAgICAgIDw8ICIsIGJ1ZmZlckluZGV4ID0gIiA8PCBpZC5idWZmZXJJbmRleAorICAgICAgICAgICAgICAgICA8PCAiLiI7CisKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworCisgICAgYXV0byBmaW5kTGlzdGVuZXIgPSBtVHJhY2tlZEJ1ZmZlcnNNYXAuZmluZChpZC5saXN0ZW5lcik7CisgICAgaWYgKGZpbmRMaXN0ZW5lciA9PSBtVHJhY2tlZEJ1ZmZlcnNNYXAuZW5kKCkpIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpfb25CdWZmZXJEZXN0cm95ZWQgLS0gIgorICAgICAgICAgICAgICAgICAgIDw8ICJyZWNlaXZlZCBpbnZhbGlkIGxpc3RlbmVyOiAiCisgICAgICAgICAgICAgICAgICAgPDwgImxpc3RlbmVyIEAgMHgiIDw8IHN0ZDo6aGV4IDw8IGlkLmxpc3RlbmVyLnVuc2FmZV9nZXQoKQorICAgICAgICAgICAgICAgICAgIDw8ICIgKGZyYW1lSW5kZXggPSAiIDw8IHN0ZDo6ZGVjIDw8IGlkLmZyYW1lSW5kZXgKKyAgICAgICAgICAgICAgICAgICA8PCAiLCBidWZmZXJJbmRleCA9ICIgPDwgaWQuYnVmZmVySW5kZXgKKyAgICAgICAgICAgICAgICAgICA8PCAiKS4iOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6c2V0PFRyYWNrZWRCdWZmZXI+PiAmZnJhbWVJbmRleDJCdWZmZXJJZHMKKyAgICAgICAgICAgID0gZmluZExpc3RlbmVyLT5zZWNvbmQ7CisgICAgYXV0byBmaW5kRnJhbWVJbmRleCA9IGZyYW1lSW5kZXgyQnVmZmVySWRzLmZpbmQoaWQuZnJhbWVJbmRleCk7CisgICAgaWYgKGZpbmRGcmFtZUluZGV4ID09IGZyYW1lSW5kZXgyQnVmZmVySWRzLmVuZCgpKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X29uQnVmZmVyRGVzdHJveWVkIC0tICIKKyAgICAgICAgICAgICAgICAgICA8PCAicmVjZWl2ZWQgaW52YWxpZCBmcmFtZSBpbmRleDogIgorICAgICAgICAgICAgICAgICAgIDw8ICJmcmFtZUluZGV4ID0gIiA8PCBpZC5mcmFtZUluZGV4CisgICAgICAgICAgICAgICAgICAgPDwgIiAobGlzdGVuZXIgQCAweCIgPDwgc3RkOjpoZXggPDwgaWQubGlzdGVuZXIudW5zYWZlX2dldCgpCisgICAgICAgICAgICAgICAgICAgPDwgIiwgYnVmZmVySW5kZXggPSAiIDw8IHN0ZDo6ZGVjIDw8IGlkLmJ1ZmZlckluZGV4CisgICAgICAgICAgICAgICAgICAgPDwgIikuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6c2V0PFRyYWNrZWRCdWZmZXI+ICZidWZmZXJJZHMgPSBmaW5kRnJhbWVJbmRleC0+c2Vjb25kOworICAgIGF1dG8gZmluZEJ1ZmZlcklkID0gYnVmZmVySWRzLmZpbmQoaWQpOworICAgIGlmIChmaW5kQnVmZmVySWQgPT0gYnVmZmVySWRzLmVuZCgpKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X29uQnVmZmVyRGVzdHJveWVkIC0tICIKKyAgICAgICAgICAgICAgICAgICA8PCAicmVjZWl2ZWQgaW52YWxpZCBidWZmZXIgaW5kZXg6ICIKKyAgICAgICAgICAgICAgICAgICA8PCAiYnVmZmVySW5kZXggPSAiIDw8IGlkLmJ1ZmZlckluZGV4CisgICAgICAgICAgICAgICAgICAgPDwgIiAoZnJhbWVJbmRleCA9ICIgPDwgaWQuZnJhbWVJbmRleAorICAgICAgICAgICAgICAgICAgIDw8ICIsIGxpc3RlbmVyIEAgMHgiIDw8IHN0ZDo6aGV4IDw8IGlkLmxpc3RlbmVyLnVuc2FmZV9nZXQoKQorICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZGVjIDw8ICIpLiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBidWZmZXJJZHMuZXJhc2UoZmluZEJ1ZmZlcklkKTsKKyAgICBpZiAoYnVmZmVySWRzLmVtcHR5KCkpIHsKKyAgICAgICAgZnJhbWVJbmRleDJCdWZmZXJJZHMuZXJhc2UoZmluZEZyYW1lSW5kZXgpOworICAgICAgICBpZiAoZnJhbWVJbmRleDJCdWZmZXJJZHMuZW1wdHkoKSkgeworICAgICAgICAgICAgbVRyYWNrZWRCdWZmZXJzTWFwLmVyYXNlKGZpbmRMaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBEZWF0aE5vdGlmaWNhdGlvbnMgJmRlYXRoTm90aWZpY2F0aW9ucyA9IG1EZWF0aE5vdGlmaWNhdGlvbnNbaWQubGlzdGVuZXJdOworICAgIGRlYXRoTm90aWZpY2F0aW9ucy5pbmRpY2VzW2lkLmZyYW1lSW5kZXhdLmVtcGxhY2VfYmFjayhpZC5idWZmZXJJbmRleCk7CisgICAgKytkZWF0aE5vdGlmaWNhdGlvbnMuY291bnQ7CisgICAgbU9uQnVmZmVyRGVzdHJveWVkLm5vdGlmeV9vbmUoKTsKK30KKworLy8gTm90aWZ5IHRoZSBjbGllbnRzIGFib3V0IGJ1ZmZlciBkZXN0cnVjdGlvbnMuCisvLyBSZXR1cm4gZmFsc2UgaWYgYWxsIGRlc3RydWN0aW9ucyBoYXZlIGJlZW4gbm90aWZpZWQuCisvLyBSZXR1cm4gdHJ1ZSBhbmQgc2V0IHRpbWVUb1JldHJ5IHRvIHRoZSB0aW1lIHBvaW50IHRvIHdhaXQgZm9yIGJlZm9yZQorLy8gcmV0cnlpbmcgaWYgc29tZSBkZXN0cnVjdGlvbnMgaGF2ZSBub3QgYmVlbiBub3RpZmllZC4KK2Jvb2wgSW5wdXRCdWZmZXJNYW5hZ2VyOjpwcm9jZXNzTm90aWZpY2F0aW9ucyhuc2Vjc190KiB0aW1lVG9SZXRyeU5zKSB7CisKKyAgICBzdHJ1Y3QgTm90aWZpY2F0aW9uIHsKKyAgICAgICAgc3A8SUNvbXBvbmVudExpc3RlbmVyPiBsaXN0ZW5lcjsKKyAgICAgICAgaGlkbF92ZWM8SUNvbXBvbmVudExpc3RlbmVyOjpJbnB1dEJ1ZmZlcj4gaW5wdXRCdWZmZXJzOworICAgICAgICBOb3RpZmljYXRpb24oY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbCwgc2l6ZV90IHMpCisgICAgICAgICAgICAgIDogbGlzdGVuZXIobCksIGlucHV0QnVmZmVycyhzKSB7fQorICAgIH07CisgICAgc3RkOjpsaXN0PE5vdGlmaWNhdGlvbj4gbm90aWZpY2F0aW9uczsKKyAgICBuc2Vjc190IG5vdGlmaWNhdGlvbkludGVydmFsTnMgPQorICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkludGVydmFsTnMubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKworICAgIGJvb2wgcmV0cnkgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgICp0aW1lVG9SZXRyeU5zID0gbm90aWZpY2F0aW9uSW50ZXJ2YWxOczsKKyAgICAgICAgbnNlY3NfdCB0aW1lTm93TnMgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1EZWF0aE5vdGlmaWNhdGlvbnMuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBtRGVhdGhOb3RpZmljYXRpb25zLmVuZCgpOyApIHsKKyAgICAgICAgICAgIHNwPElDb21wb25lbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBpdC0+Zmlyc3QucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKCFsaXN0ZW5lcikgeworICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEZWF0aE5vdGlmaWNhdGlvbnMgJmRlYXRoTm90aWZpY2F0aW9ucyA9IGl0LT5zZWNvbmQ7CisKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZVNpbmNlTGFzdE5vdGlmaWVkTnMgPQorICAgICAgICAgICAgICAgICAgICB0aW1lTm93TnMgLSBkZWF0aE5vdGlmaWNhdGlvbnMubGFzdFNlbnROczsKKyAgICAgICAgICAgIC8vIElmIG5vdCBlbm91Z2ggdGltZSBoYXMgcGFzc2VkIHNpbmNlIHRoZSBsYXN0IGNhbGxiYWNrLCBsZWF2ZSB0aGUKKyAgICAgICAgICAgIC8vIG5vdGlmaWNhdGlvbnMgZm9yIHRoaXMgbGlzdGVuZXIgdW50b3VjaGVkIGZvciBub3cgYW5kIHJldHJ5CisgICAgICAgICAgICAvLyBsYXRlci4KKyAgICAgICAgICAgIGlmICh0aW1lU2luY2VMYXN0Tm90aWZpZWROcyA8IG5vdGlmaWNhdGlvbkludGVydmFsTnMpIHsKKyAgICAgICAgICAgICAgICByZXRyeSA9IHRydWU7CisgICAgICAgICAgICAgICAgKnRpbWVUb1JldHJ5TnMgPSBzdGQ6Om1pbigqdGltZVRvUmV0cnlOcywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkludGVydmFsTnMgLSB0aW1lU2luY2VMYXN0Tm90aWZpZWROcyk7CisgICAgICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6OnByb2Nlc3NOb3RpZmljYXRpb25zIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIk5vdGlmaWNhdGlvbnMgZm9yIGxpc3RlbmVyIEAgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjpoZXggPDwgbGlzdGVuZXIuZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiB3aWxsIGJlIHBvc3Rwb25lZC4iOworICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIGVub3VnaCB0aW1lIGhhcyBwYXNzZWQgc2luY2UgdGhlIGxhc3Qgbm90aWZpY2F0aW9uIHRvIHRoaXMKKyAgICAgICAgICAgIC8vIGxpc3RlbmVyIGJ1dCB0aGVyZSBhcmUgY3VycmVudGx5IG5vIHBlbmRpbmcgbm90aWZpY2F0aW9ucywgdGhlCisgICAgICAgICAgICAvLyBsaXN0ZW5lciBjYW4gYmUgcmVtb3ZlZCBmcm9tIG1EZWF0aE5vdGlmaWNhdGlvbnMtLS10aGVyZSBpcyBubworICAgICAgICAgICAgLy8gbmVlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IG5vdGlmaWNhdGlvbiB0aW1lIGFueW1vcmUuCisgICAgICAgICAgICBpZiAoZGVhdGhOb3RpZmljYXRpb25zLmNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBpdCA9IG1EZWF0aE5vdGlmaWNhdGlvbnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGFyZ3VtZW50IGZvciB0aGUgY2FsbGJhY2suCisgICAgICAgICAgICBub3RpZmljYXRpb25zLmVtcGxhY2VfYmFjayhsaXN0ZW5lciwgZGVhdGhOb3RpZmljYXRpb25zLmNvdW50KTsKKyAgICAgICAgICAgIGhpZGxfdmVjPElDb21wb25lbnRMaXN0ZW5lcjo6SW5wdXRCdWZmZXI+ICZpbnB1dEJ1ZmZlcnMgPQorICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25zLmJhY2soKS5pbnB1dEJ1ZmZlcnM7CisgICAgICAgICAgICBzaXplX3QgaSA9IDA7CisgICAgICAgICAgICBmb3IgKHN0ZDo6cGFpcjxjb25zdCB1aW50NjRfdCwgc3RkOjp2ZWN0b3I8c2l6ZV90Pj4mIHAgOgorICAgICAgICAgICAgICAgICAgICBkZWF0aE5vdGlmaWNhdGlvbnMuaW5kaWNlcykgeworICAgICAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXggPSBwLmZpcnN0OworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4gJmJ1ZmZlckluZGljZXMgPSBwLnNlY29uZDsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNpemVfdCYgYnVmZmVySW5kZXggOiBidWZmZXJJbmRpY2VzKSB7CisgICAgICAgICAgICAgICAgICAgIElDb21wb25lbnRMaXN0ZW5lcjo6SW5wdXRCdWZmZXIgJmlucHV0QnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBpbnB1dEJ1ZmZlcnNbaSsrXTsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIuYXJyYXlJbmRleCA9IGJ1ZmZlckluZGV4OworICAgICAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5mcmFtZUluZGV4ID0gZnJhbWVJbmRleDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENsZWFyIGRlYXRoTm90aWZpY2F0aW9ucyBmb3IgdGhpcyBsaXN0ZW5lciBhbmQgc2V0IHJldHJ5IHRvIHRydWUKKyAgICAgICAgICAgIC8vIHNvIHByb2Nlc3NOb3RpZmljYXRpb25zIHdpbGwgYmUgY2FsbGVkIGFnYWluLiBUaGlzIHdpbGwKKyAgICAgICAgICAgIC8vIGd1YXJhbnRlZSB0aGF0IGEgbGlzdGVuZXIgd2l0aCBubyBwZW5kaW5nIG5vdGlmaWNhdGlvbnMgd2lsbAorICAgICAgICAgICAgLy8gZXZlbnR1YWxseSBiZSByZW1vdmVkIGZyb20gbURlYXRoTm90aWZpY2F0aW9ucyBhZnRlcgorICAgICAgICAgICAgLy8gbU5vdGlmaWNhdGlvbkludGVydmFsTnMgbmFub3NlY29uZHMgaGFzIHBhc3NlZC4KKyAgICAgICAgICAgIHJldHJ5ID0gdHJ1ZTsKKyAgICAgICAgICAgIGRlYXRoTm90aWZpY2F0aW9ucy5pbmRpY2VzLmNsZWFyKCk7CisgICAgICAgICAgICBkZWF0aE5vdGlmaWNhdGlvbnMuY291bnQgPSAwOworICAgICAgICAgICAgZGVhdGhOb3RpZmljYXRpb25zLmxhc3RTZW50TnMgPSB0aW1lTm93TnM7CisgICAgICAgICAgICArK2l0OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2FsbCBvbklucHV0QnVmZmVyc1JlbGVhc2VkKCkgb3V0c2lkZSB0aGUgbG9jayB0byBhdm9pZCBkZWFkbG9jay4KKyAgICBmb3IgKGNvbnN0IE5vdGlmaWNhdGlvbiYgbm90aWZpY2F0aW9uIDogbm90aWZpY2F0aW9ucykgeworICAgICAgICBpZiAoIW5vdGlmaWNhdGlvbi5saXN0ZW5lci0+b25JbnB1dEJ1ZmZlcnNSZWxlYXNlZCgKKyAgICAgICAgICAgICAgICBub3RpZmljYXRpb24uaW5wdXRCdWZmZXJzKS5pc09rKCkpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgbWF5IHRyaWdnZXIgaWYgdGhlIGNsaWVudCBoYXMgZGllZC4KKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6cHJvY2Vzc05vdGlmaWNhdGlvbnMgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAiZmFpbGVkIHRvIHNlbmQgZGVhdGggbm90aWZpY2F0aW9ucyB0byAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICJsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgbm90aWZpY2F0aW9uLmxpc3RlbmVyLmdldCgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZGVjIDw8ICIuIjsKKyAgICAgICAgfSBlbHNlIHsKKyNpZiBMT0dfTkRFQlVHID09IDAKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGlucHV0QnVmZmVyTG9nOworICAgICAgICAgICAgZm9yIChjb25zdCBJQ29tcG9uZW50TGlzdGVuZXI6OklucHV0QnVmZmVyJiBpbnB1dEJ1ZmZlciA6CisgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5pbnB1dEJ1ZmZlcnMpIHsKKyAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlckxvZyA8PCAiICgiIDw8IGlucHV0QnVmZmVyLmZyYW1lSW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IGlucHV0QnVmZmVyLmFycmF5SW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6cHJvY2Vzc05vdGlmaWNhdGlvbnMgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJkZWF0aCBub3RpZmljYXRpb25zIHNlbnQgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBub3RpZmljYXRpb24ubGlzdGVuZXIuZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjpkZWMKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHdpdGggdGhlc2UgKGZyYW1lSW5kZXgsIGJ1ZmZlckluZGV4KSBwYWlyczoiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5wdXRCdWZmZXJMb2cuc3RyKCk7CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKyNpZiBMT0dfTkRFQlVHID09IDAKKyAgICBpZiAocmV0cnkpIHsKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6OnByb2Nlc3NOb3RpZmljYXRpb25zIC0tICIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJ3aWxsIHJldHJ5IGFnYWluIGluICIgPDwgKnRpbWVUb1JldHJ5TnMgPDwgIm5zLiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6OnByb2Nlc3NOb3RpZmljYXRpb25zIC0tICIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJubyBwZW5kaW5nIGRlYXRoIG5vdGlmaWNhdGlvbnMuIjsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gcmV0cnk7Cit9CisKK3ZvaWQgSW5wdXRCdWZmZXJNYW5hZ2VyOjptYWluKCkgeworICAgIExPRyhWRVJCT1NFKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyIG1haW4gLS0gc3RhcnRlZC4iOworICAgIG5zZWNzX3QgdGltZVRvUmV0cnlOczsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgd2hpbGUgKG1EZWF0aE5vdGlmaWNhdGlvbnMuZW1wdHkoKSkgeworICAgICAgICAgICAgbU9uQnVmZmVyRGVzdHJveWVkLndhaXQobG9jayk7CisgICAgICAgIH0KKyAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgd2hpbGUgKHByb2Nlc3NOb3RpZmljYXRpb25zKCZ0aW1lVG9SZXRyeU5zKSkgeworICAgICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6bmFub3NlY29uZHModGltZVRvUmV0cnlOcykpOworICAgICAgICB9CisgICAgfQorfQorCitJbnB1dEJ1ZmZlck1hbmFnZXI6OklucHV0QnVmZmVyTWFuYWdlcigpCisgICAgICA6IG1NYWluVGhyZWFkeyZJbnB1dEJ1ZmZlck1hbmFnZXI6Om1haW4sIHRoaXN9IHsKK30KKworSW5wdXRCdWZmZXJNYW5hZ2VyJiBJbnB1dEJ1ZmZlck1hbmFnZXI6OmdldEluc3RhbmNlKCkgeworICAgIHN0YXRpYyBJbnB1dEJ1ZmZlck1hbmFnZXIgaW5zdGFuY2V7fTsKKyAgICByZXR1cm4gaW5zdGFuY2U7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvSW5wdXRTdXJmYWNlLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9JbnB1dFN1cmZhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNGNhODUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvSW5wdXRTdXJmYWNlLmNwcApAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlYzItSW5wdXRTdXJmYWNlIgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvSW5wdXRTdXJmYWNlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDsKKworLy8gRGVyaXZlZCBjbGFzcyBvZiBDMkludGVyZmFjZUhlbHBlcgorY2xhc3MgSW5wdXRTdXJmYWNlOjpJbnRlcmZhY2UgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGVyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Fb3MsIEMyX1BBUkFNS0VZX0lOUFVUX1NVUkZBQ0VfRU9TKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJJbnB1dFN1cmZhY2VFb3NUdW5pbmcoZmFsc2UpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUVvcywgdmFsdWUpLm9uZU9mKHt0cnVlLCBmYWxzZX0pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihFb3NTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgRW9zU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMklucHV0U3VyZmFjZUVvc1R1bmluZz4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICByZXR1cm4gbWUuRihtZS52LnZhbHVlKS52YWxpZGF0ZVBvc3NpYmxlKG1lLnYudmFsdWUpOworICAgIH0KKworICAgIGJvb2wgZW9zKCkgY29uc3QgeyByZXR1cm4gbUVvcy0+dmFsdWU7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJJbnB1dFN1cmZhY2VFb3NUdW5pbmc+IG1Fb3M7Cit9OworCisvLyBEZXJpdmVkIGNsYXNzIG9mIENvbmZpZ3VyYWJsZUMySW50ZgorY2xhc3MgSW5wdXRTdXJmYWNlOjpDb25maWd1cmFibGVJbnRmIDogcHVibGljIENvbmZpZ3VyYWJsZUMySW50ZiB7CitwdWJsaWM6CisgICAgQ29uZmlndXJhYmxlSW50ZigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2U6OkludGVyZmFjZT4gJmludGYsCisgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiAmc291cmNlKQorICAgICAgICA6IENvbmZpZ3VyYWJsZUMySW50ZigiaW5wdXQtc3VyZmFjZSIsIDApLAorICAgICAgICAgIG1JbnRmKGludGYpLAorICAgICAgICAgIG1Tb3VyY2Uoc291cmNlKSB7CisgICAgfQorCisgICAgdmlydHVhbCB+Q29uZmlndXJhYmxlSW50ZigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnkoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgcGFyYW1zCisgICAgICAgICAgICApIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbnRmLT5xdWVyeSh7fSwgaW5kaWNlcywgbWF5QmxvY2ssIHBhcmFtcyk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWcoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzCisgICAgICAgICAgICApIG92ZXJyaWRlIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZyhwYXJhbXMsIG1heUJsb2NrLCBmYWlsdXJlcyk7CisgICAgICAgIGlmIChtSW50Zi0+ZW9zKCkpIHsKKyAgICAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IHNvdXJjZSA9IG1Tb3VyY2UucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxscHRyIHx8IHNvdXJjZS0+c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogcHV0IHNvbWV0aGluZyBpbiB8ZmFpbHVyZXN8CisgICAgICAgICAgICAgICAgZXJyID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVE9ETzogcmVzZXQgZW9zPworICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+KiBjb25zdCBwYXJhbXMKKyAgICAgICAgICAgICkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUludGYtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKHBhcmFtcyk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4mIGZpZWxkcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbnRmLT5xdWVyeVN1cHBvcnRlZFZhbHVlcyhmaWVsZHMsIG1heUJsb2NrKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZTo6SW50ZXJmYWNlPiBtSW50ZjsKKyAgICB3cDxHcmFwaGljQnVmZmVyU291cmNlPiBtU291cmNlOworfTsKKworUmV0dXJuPHNwPElucHV0U3VyZmFjZTo6SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4+IElucHV0U3VyZmFjZTo6Z2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgeworICAgIHJldHVybiBtUHJvZHVjZXI7Cit9CisKK1JldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gSW5wdXRTdXJmYWNlOjpnZXRDb25maWd1cmFibGUoKSB7CisgICAgcmV0dXJuIG1Db25maWd1cmFibGU7Cit9CisKK1JldHVybjx2b2lkPiBJbnB1dFN1cmZhY2U6OmNvbm5lY3QoCisgICAgICAgIGNvbnN0IHNwPElJbnB1dFNpbms+JiBzaW5rLAorICAgICAgICBjb25uZWN0X2NiIF9oaWRsX2NiKSB7CisgICAgU3RhdHVzIHN0YXR1czsKKyAgICBzcDxJbnB1dFN1cmZhY2VDb25uZWN0aW9uPiBjb25uZWN0aW9uOworICAgIGlmICghc2luaykgeworICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkJBRF9WQUxVRSwgbnVsbHB0cik7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gY29tcCA9IENvbXBvbmVudDo6ZmluZExvY2FsQ29tcG9uZW50KHNpbmspOworICAgIGlmIChjb21wKSB7CisgICAgICAgIGNvbm5lY3Rpb24gPSBuZXcgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbihtU291cmNlLCBjb21wLCBtU3RvcmUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbm5lY3Rpb24gPSBuZXcgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbihtU291cmNlLCBzaW5rLCBtU3RvcmUpOworICAgIH0KKyAgICBpZiAoIWNvbm5lY3Rpb24tPmluaXQoKSkgeworICAgICAgICBjb25uZWN0aW9uID0gbnVsbHB0cjsKKyAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpCQURfVkFMVUU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICB9CisgICAgX2hpZGxfY2Ioc3RhdHVzLCBjb25uZWN0aW9uKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCisvLyBDb25zdHJ1Y3RvciBpcyBleGNsdXNpdmUgdG8gQ29tcG9uZW50U3RvcmUuCitJbnB1dFN1cmZhY2U6OklucHV0U3VyZmFjZSgKKyAgICAgICAgY29uc3Qgc3A8Q29tcG9uZW50U3RvcmU+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+PiAqY29uc3QgcGFyYW1zKSBjb25zdCB7CisgICAgLy8gVE9ETzogaW1wbGVtZW50CisgICAgKHZvaWQpcGFyYW1zOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6SW1wbDo6Q29uZmlndXJhYmxlSW50Zjo6cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcywKKyAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3QgeworICAgIC8vIFRPRE86IGltcGxlbWVudAorICAgICh2b2lkKWZpZWxkczsKKyAgICAodm9pZCltYXlCbG9jazsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9DbGllbnRCbG9ja0hlbHBlci5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NsaWVudEJsb2NrSGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU0MjlhYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9DbGllbnRCbG9ja0hlbHBlci5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0xJRU5UX0JMT0NLX0hFTFBFUl9ICisjZGVmaW5lIENMSUVOVF9CTE9DS19IRUxQRVJfSAorCisjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxDMldvcmsuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKworCisvLyBCdWZmZXJRdWV1ZS1CYXNlZCBCbG9jayBPcGVyYXRpb25zCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIENyZWF0ZSBhIEdyYXBoaWNCdWZmZXIgb2JqZWN0IGZyb20gYSBncmFwaGljIGJsb2NrIGFuZCBhdHRhY2ggaXQgdG8gYW4KKy8vIElHcmFwaGljQnVmZmVyUHJvZHVjZXIuCitzdGF0dXNfdCBhdHRhY2hUb0J1ZmZlclF1ZXVlKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogYnFTbG90KTsKKworLy8gUmV0dXJuIGZhbHNlIGlmIGJsb2NrIGRvZXMgbm90IGNvbWUgZnJvbSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrcG9vbC4KKy8vIE90aGVyd2lzZSwgZXh0cmFjdCBnZW5lcmF0aW9uLCBicUlkIGFuZCBicVNsb3QgYW5kIHJldHVybiB0cnVlLgorYm9vbCBnZXRCdWZmZXJRdWV1ZUFzc2lnbm1lbnQoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZ2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiBicUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogYnFTbG90KTsKKworLy8gQXNzaWduIHRoZSBnaXZlbiBibG9jayB0byBhIGJ1ZmZlcnF1ZXVlIHNvIHRoYXQgd2hlbiB0aGUgYmxvY2sgaXMgZGVzdHJveWVkLAorLy8gY2FuY2VsQnVmZmVyKCkgd2lsbCBiZSBjYWxsZWQuCisvLworLy8gSWYgdGhlIGJsb2NrIGRvZXMgbm90IGNvbWUgZnJvbSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrcG9vbCwgdGhpcyBmdW5jdGlvbgorLy8gcmV0dXJucyBmYWxzZS4KKy8vCisvLyBJZiB0aGUgYmxvY2sgYWxyZWFkeSBoYXMgYSBidWZmZXJxdWV1ZSBhc3NpZ25tZW50IHRoYXQgbWF0Y2hlcyB0aGUgZ2l2ZW4gb25lLAorLy8gdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZS4KKy8vCisvLyBJZiB0aGUgYmxvY2sgYWxyZWFkeSBoYXMgYSBidWZmZXJxdWV1ZSBhc3NpZ25tZW50IHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhlCisvLyBnaXZlbiBvbmUsIHRoZSBibG9jayB3aWxsIGJlIHJlYXNzaWduZWQgdG8gdGhlIGdpdmVuIGJ1ZmZlcnF1ZXVlLiBUaGlzCisvLyB3aWxsIGNhbGwgYXR0YWNoQnVmZmVyKCkgb24gdGhlIGdpdmVuIGlnYnAuIFRoZSBmdW5jdGlvbiB0aGVuIHJldHVybnMgdHJ1ZSBvbgorLy8gc3VjY2VzcyBvciBmYWxzZSBvbiBhbnkgZmFpbHVyZSBkdXJpbmcgdGhlIG9wZXJhdGlvbi4KKy8vCisvLyBOb3RlOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgZGV0YWNoQnVmZmVyKCkgb3IgZGVxdWV1ZUJ1ZmZlcigpCisvLyBpcyBjYWxsZWQgbWFudWFsbHkuCitib29sIGhvbGRCdWZmZXJRdWV1ZUJsb2NrKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYnFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbik7CisKKy8vIENhbGwgaG9sZEJ1ZmZlclF1ZXVlQmxvY2soKSBvbiBpbnB1dCBvciBvdXRwdXQgYmxvY2tzIGluIHRoZSBnaXZlbiB3b3JrTGlzdC4KKy8vIFNpbmNlIHRoZSBidWZmZXJxdWV1ZSBhc3NpZ25tZW50IGZvciBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgY2FuIGJlCisvLyBkaWZmZXJlbnQsIHRoaXMgZnVuY3Rpb24gdGFrZXMgZm9ySW5wdXQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGdpdmVuCisvLyBidWZmZXJxdWV1ZSBpcyBmb3IgaW5wdXQgYnVmZmVycyBvciBvdXRwdXQgYnVmZmVycy4gKFRoZSBkZWZhdWx0IHZhbHVlIG9mCisvLyBmb3JJbnB1dCBpcyBmYWxzZS4pCisvLworLy8gSW4gdGhlIChyYXJlKSBjYXNlIHRoYXQgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgYXJlIGJ1ZmZlcnF1ZXVlLWJhc2VkLAorLy8gdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB0d2ljZSwgb25jZSBmb3IgdGhlIGlucHV0IGJ1ZmZlcnMgYW5kIG9uY2UgZm9yCisvLyB0aGUgb3V0cHV0IGJ1ZmZlcnMuCisvLworLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIFdvcmtCdW5kbGUgaGFzIGJlZW4gcmVjZWl2ZWQgZnJvbQorLy8gYW5vdGhlciBwcm9jZXNzLgordm9pZCBob2xkQnVmZmVyUXVldWVCbG9ja3MoY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJxSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JJbnB1dCA9IGZhbHNlKTsKKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDTElFTlRfQkxPQ0tfSEVMUEVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmRjY2QwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudC5oCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09NUE9ORU5UX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT01QT05FTlRfSAorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudEludGVyZmFjZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db25maWd1cmFibGUuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUNsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudEludGVyZmFjZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRMaXN0ZW5lci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lJbnB1dFNpbmsuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPGh3YmluZGVyL0lCaW5kZXIuaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMi5oPgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpJQmluZGVyOwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6d3A7CisKK3N0cnVjdCBDb21wb25lbnRTdG9yZTsKKworc3RydWN0IENvbXBvbmVudCA6IHB1YmxpYyBJQ29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgIHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPENvbXBvbmVudD4geworICAgIENvbXBvbmVudCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4mLAorICAgICAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgICAgICBjb25zdCBzcDxDb21wb25lbnRTdG9yZT4mIHN0b3JlLAorICAgICAgICAgICAgY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OgorICAgICAgICAgICAgICAgIElDbGllbnRNYW5hZ2VyPiYgY2xpZW50UG9vbE1hbmFnZXIpOworICAgIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0OworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyMTsKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjJfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIEhHcmFwaGljQnVmZmVyUHJvZHVjZXIyOworCisgICAgLy8gTWV0aG9kcyBmcm9tIElDb21wb25lbnQgZm9sbG93LgorICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gcXVldWUoY29uc3QgV29ya0J1bmRsZSYgd29ya0J1bmRsZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gZmx1c2goZmx1c2hfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gZHJhaW4oYm9vbCB3aXRoRW9zKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IHNldE91dHB1dFN1cmZhY2UoCisgICAgICAgICAgICB1aW50NjRfdCBibG9ja1Bvb2xJZCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXIyPiYgc3VyZmFjZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY29ubmVjdFRvSW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SUlucHV0U3VyZmFjZT4mIGlucHV0U3VyZmFjZSwKKyAgICAgICAgICAgIGNvbm5lY3RUb0lucHV0U3VyZmFjZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY29ubmVjdFRvT214SW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcjE+JiBwcm9kdWNlciwKKyAgICAgICAgICAgIGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgICAgICBjb25uZWN0VG9PbXhJbnB1dFN1cmZhY2VfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gZGlzY29ubmVjdEZyb21JbnB1dFN1cmZhY2UoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjcmVhdGVCbG9ja1Bvb2woCisgICAgICAgICAgICB1aW50MzJfdCBhbGxvY2F0b3JJZCwKKyAgICAgICAgICAgIGNyZWF0ZUJsb2NrUG9vbF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBkZXN0cm95QmxvY2tQb29sKHVpbnQ2NF90IGJsb2NrUG9vbElkKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IHN0YXJ0KCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBzdG9wKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiByZXNldCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gcmVsZWFzZSgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHNwPElDb21wb25lbnRJbnRlcmZhY2U+PiBnZXRJbnRlcmZhY2UoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxzcDxJSW5wdXRTaW5rPj4gYXNJbnB1dFNpbmsoKSBvdmVycmlkZTsKKworICAgIC8vIFJldHVybnMgYSBDMkNvbXBvbmVudCBhc3NvY2lhdGVkIHRvIHRoZSBnaXZlbiBzaW5rIGlmIHRoZSBzaW5rIGlzIGluZGVlZAorICAgIC8vIGEgbG9jYWwgY29tcG9uZW50LiBSZXR1cm5zIG51bGxwdHIgb3RoZXJ3aXNlLgorICAgIC8vCisgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IElucHV0U3VyZmFjZTo6Y29ubmVjdCgpLgorICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IGZpbmRMb2NhbENvbXBvbmVudCgKKyAgICAgICAgICAgIGNvbnN0IHNwPElJbnB1dFNpbms+JiBzaW5rKTsKKworcHJvdGVjdGVkOgorICAgIGMyX3N0YXR1c190IG1Jbml0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gbUNvbXBvbmVudDsKKyAgICBzcDxDb21wb25lbnRJbnRlcmZhY2U+IG1JbnRlcmZhY2U7CisgICAgc3A8SUNvbXBvbmVudExpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3A8Q29tcG9uZW50U3RvcmU+IG1TdG9yZTsKKyAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OnV0aWxzOjpEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcgorICAgICAgICAgICAgbUJ1ZmZlclBvb2xTZW5kZXI7CisKKyAgICBzdHJ1Y3QgU2luazsKKyAgICBzdGQ6Om11dGV4IG1TaW5rTXV0ZXg7CisgICAgc3A8U2luaz4gbVNpbms7CisKKyAgICBzdGQ6Om11dGV4IG1CbG9ja1Bvb2xzTXV0ZXg7CisgICAgLy8gVGhpcyBtYXAga2VlcHMgQzJCbG9ja1Bvb2wgb2JqZWN0cyB0aGF0IGFyZSBjcmVhdGVkIGJ5IGNyZWF0ZUJsb2NrUG9vbCgpCisgICAgLy8gYWxpdmUuIFRoZXNlIEMyQmxvY2tQb29sIG9iamVjdHMgY2FuIGJlIGRlbGV0ZWQgYnkgY2FsbGluZworICAgIC8vIGRlc3Ryb3lCbG9ja1Bvb2woKSwgcmVzZXQoKSBvciByZWxlYXNlKCksIG9yIGJ5IGRlc3Ryb3lpbmcgdGhlIGNvbXBvbmVudC4KKyAgICBzdGQ6Om1hcDx1aW50NjRfdCwgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPj4gbUJsb2NrUG9vbHM7CisKKyAgICB2b2lkIGluaXRMaXN0ZW5lcihjb25zdCBzcDxDb21wb25lbnQ+JiBzZWxmKTsKKworICAgIHZpcnR1YWwgfkNvbXBvbmVudCgpIG92ZXJyaWRlOworCisgICAgZnJpZW5kIHN0cnVjdCBDb21wb25lbnRTdG9yZTsKKworICAgIHN0cnVjdCBMaXN0ZW5lcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT01QT05FTlRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudEludGVyZmFjZS5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudEludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZDIzNWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50SW50ZXJmYWNlLmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfSAorI2RlZmluZSBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTVBPTkVOVF9JTlRFUkZBQ0VfSAorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbmZpZ3VyYWJsZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC90eXBlcy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudEludGVyZmFjZS5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzIuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBDb21wb25lbnRTdG9yZTsKKworc3RydWN0IENvbXBvbmVudEludGVyZmFjZSA6IHB1YmxpYyBJQ29tcG9uZW50SW50ZXJmYWNlIHsKKyAgICBDb21wb25lbnRJbnRlcmZhY2UoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+JiBpbnRlcmZhY2UsCisgICAgICAgICAgICBDb21wb25lbnRTdG9yZSogc3RvcmUpOworICAgIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0OworICAgIHZpcnR1YWwgUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiBnZXRDb25maWd1cmFibGUoKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gbUludGVyZmFjZTsKKyAgICBzcDxDYWNoZWRDb25maWd1cmFibGU+IG1Db25maWd1cmFibGU7CisgICAgYzJfc3RhdHVzX3QgbUluaXQ7Cit9OworCisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT01QT05FTlRfSU5URVJGQUNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRTdG9yZS5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU4MGM2MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRTdG9yZS5oCkBAIC0wLDAgKzEsMTUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09NUE9ORU5UU1RPUkVfSAorI2RlZmluZSBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTVBPTkVOVFNUT1JFX0gKKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50SW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbmZpZ3VyYWJsZS5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxDMi5oPgorCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklDbGllbnRNYW5hZ2VyOworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworc3RydWN0IENvbXBvbmVudFN0b3JlIDogcHVibGljIElDb21wb25lbnRTdG9yZSB7CisgICAgQ29tcG9uZW50U3RvcmUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+JiBzdG9yZSk7CisgICAgdmlydHVhbCB+Q29tcG9uZW50U3RvcmUoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzdGF0dXMgb2YgdGhlIGNvbnN0cnVjdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IENhY2hlZENvbmZpZ3VyYWJsZTo6aW5pdCgpIHRvIHZhbGlkYXRlCisgICAgICogc3VwcG9ydGVkIHBhcmFtZXRlcnMuCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgdmFsaWRhdGVTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiYgcGFyYW1zKTsKKworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb21wb25lbnRTdG9yZS4KKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+JiBwb29sLAorICAgICAgICAgICAgY3JlYXRlQ29tcG9uZW50X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbmFtZSwKKyAgICAgICAgICAgIGNyZWF0ZUludGVyZmFjZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gbGlzdENvbXBvbmVudHMobGlzdENvbXBvbmVudHNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNyZWF0ZUlucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNyZWF0ZUlucHV0U3VyZmFjZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gZ2V0U3RydWN0RGVzY3JpcHRvcnMoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50MzJfdD4mIGluZGljZXMsCisgICAgICAgICAgICBnZXRTdHJ1Y3REZXNjcmlwdG9yc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48c3A8SUNsaWVudE1hbmFnZXI+PiBnZXRQb29sQ2xpZW50TWFuYWdlcigpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gY29weUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IEJ1ZmZlciYgc3JjLAorICAgICAgICAgICAgY29uc3QgQnVmZmVyJiBkc3QpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiBnZXRDb25maWd1cmFibGUoKSBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIER1bXBzIGluZm9ybWF0aW9uIHdoZW4gbHNoYWwgaXMgY2FsbGVkLgorICAgICAqLworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGRlYnVnKAorICAgICAgICAgICAgY29uc3QgaGlkbF9oYW5kbGUmIGhhbmRsZSwKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPGhpZGxfc3RyaW5nPiYgYXJncykgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICBzcDxDYWNoZWRDb25maWd1cmFibGU+IG1Db25maWd1cmFibGU7CisKKyAgICAvLyBEb2VzIGJvb2trZWVwaW5nIGZvciBhbiBpbnRlcmZhY2UgdGhhdCBoYXMgYmVlbiBsb2FkZWQuCisgICAgdm9pZCBvbkludGVyZmFjZUxvYWRlZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICZpbnRmKTsKKworICAgIGMyX3N0YXR1c190IG1Jbml0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBtU3RvcmU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IG1QYXJhbVJlZmxlY3RvcjsKKworICAgIHN0ZDo6bWFwPEMyUGFyYW06OkNvcmVJbmRleCwgc3RkOjpzaGFyZWRfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4+IG1TdHJ1Y3REZXNjcmlwdG9yczsKKyAgICBzdGQ6OnNldDxDMlBhcmFtOjpDb3JlSW5kZXg+IG1VbnN1cHBvcnRlZFN0cnVjdERlc2NyaXB0b3JzOworICAgIHN0ZDo6c2V0PEMyU3RyaW5nPiBtTG9hZGVkSW50ZXJmYWNlczsKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbVN0cnVjdERlc2NyaXB0b3JzTXV0ZXg7CisKKyAgICAvLyBDb21wb25lbnRTdG9yZSBrZWVwcyB0cmFjayBvZiBsaXZlIENvbXBvbmVudHMuCisKKyAgICBzdHJ1Y3QgQ29tcG9uZW50U3RhdHVzIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBjMkNvbXBvbmVudDsKKyAgICAgICAgc3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jazo6dGltZV9wb2ludCBiaXJ0aFRpbWU7CisgICAgfTsKKworICAgIG11dGFibGUgc3RkOjptdXRleCBtQ29tcG9uZW50Um9zdGVyTXV0ZXg7CisgICAgc3RkOjptYXA8Q29tcG9uZW50KiwgQ29tcG9uZW50U3RhdHVzPiBtQ29tcG9uZW50Um9zdGVyOworCisgICAgLy8gQ2FsbGVkIHdoZW5ldmVyIENvbXBvbmVudCBpcyBjcmVhdGVkLgorICAgIHZvaWQgcmVwb3J0Q29tcG9uZW50QmlydGgoQ29tcG9uZW50KiBjb21wb25lbnQpOworICAgIC8vIENhbGxlZCBvbmx5IGZyb20gdGhlIGRlc3RydWN0b3Igb2YgQ29tcG9uZW50LgorICAgIHZvaWQgcmVwb3J0Q29tcG9uZW50RGVhdGgoQ29tcG9uZW50KiBjb21wb25lbnQpOworCisgICAgZnJpZW5kIENvbXBvbmVudDsKKworICAgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGR1bXBpbmcuCisKKyAgICBzdGQ6Om9zdHJlYW0mIGR1bXAoCisgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPiYgY29tcCk7CisKKyAgICBzdGQ6Om9zdHJlYW0mIGR1bXAoCisgICAgICAgICAgICBzdGQ6Om9zdHJlYW0mIG91dCwKKyAgICAgICAgICAgIENvbXBvbmVudFN0YXR1cyYgY29tcFN0YXR1cyk7CisKK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT01QT05FTlRTVE9SRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29uZmlndXJhYmxlLmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29uZmlndXJhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODA5NTE4NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db25maWd1cmFibGUuaApAQCAtMCwwICsxLDEzOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTkZJR1VSQUJMRV9ICisjZGVmaW5lIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09ORklHVVJBQkxFX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb25maWd1cmFibGUuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8QzIuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworc3RydWN0IENvbXBvbmVudFN0b3JlOworCisvKioKKyAqIENvZGVjMiBvYmplY3RzIG9mIGRpZmZlcmVudCB0eXBlcyBtYXkgaGF2ZSBkaWZmZXJlbnQgcXVlcnlpbmcgYW5kIGNvbmZpZ3VyaW5nCisgKiBmdW5jdGlvbnMsIGJ1dCBhY3Jvc3MgdGhlIFRyZWJsZSBib3VuZGFyeSwgdGhleSBzaGFyZSB0aGUgc2FtZSBISURMCisgKiBpbnRlcmZhY2UsIElDb25maWd1cmFibGUuCisgKgorICogQ29uZmlndXJhYmxlQzJJbnRmIGlzIGFuIGFic3RyYWN0IGNsYXNzIHRoYXQgYSBDb2RlYzIgb2JqZWN0IGNhbiBpbXBsZW1lbnQgdG8KKyAqIGVhc2lseSBleHBvc2UgYW4gSUNvbmZpZ3VyYWJsZSBpbnN0YW5jZS4gU2VlIENhY2hlZENvbmZpZ3VyYWJsZSBiZWxvdy4KKyAqLworc3RydWN0IENvbmZpZ3VyYWJsZUMySW50ZiB7CisgICAgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9CisgICAgdWludDMyX3QgZ2V0SWQoKSBjb25zdCB7IHJldHVybiBtSWQ7IH0KKyAgICAvKiogQzJDb21wb25lbnRJbnRlcmZhY2U6OnF1ZXJ5X3ZiIHNhbnMgc3RhY2sgcGFyYW1zICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBwYXJhbXMpIGNvbnN0ID0gMDsKKyAgICAvKiogQzJDb21wb25lbnRJbnRlcmZhY2U6OmNvbmZpZ192YiAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgPSAwOworICAgIC8qKiBDMkNvbXBvbmVudEludGVyZmFjZTo6cXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4qIGNvbnN0IHBhcmFtcykgY29uc3QgPSAwOworICAgIC8qKiBDMkNvbXBvbmVudEludGVyZmFjZTo6cXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiYgZmllbGRzLCBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIH5Db25maWd1cmFibGVDMkludGYoKSA9IGRlZmF1bHQ7CisKKyAgICBDb25maWd1cmFibGVDMkludGYoY29uc3QgQzJTdHJpbmcmIG5hbWUsIHVpbnQzMl90IGlkKQorICAgICAgICAgIDogbU5hbWV7bmFtZX0sIG1JZHtpZH0ge30KKworcHJvdGVjdGVkOgorICAgIEMyU3RyaW5nIG1OYW1lOyAvKiBjYWNoZWQgY29tcG9uZW50IG5hbWUgKi8KKyAgICB1aW50MzJfdCBtSWQ7Cit9OworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIG9mIHRoZSBJQ29uZmlndXJhYmxlIGludGVyZmFjZSB0aGF0IHN1cHBvcnRzIGNhY2hpbmcgb2YKKyAqIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGZyb20gYSBzdXBwbGllZCBDb21wb25lbnRTdG9yZS4KKyAqCisgKiBDYWNoZWRDb25maWd1cmFibGUgZXNzZW50aWFsbHkgY29udmVydHMgYSBDb25maWd1cmFibGVDMkludGYgaW50byBISURMJ3MKKyAqIElDb25maWd1cmFibGUuIEEgQ29kZWMyIG9iamVjdCBnZW5lcmFsbHkgaW1wbGVtZW50cyBDb25maWd1cmFibGVDMkludGYgYW5kCisgKiBwYXNzZXMgdGhlIGltcGxlbWVudGF0aW9uIHRvIHRoZSBjb25zdHJ1Y3RvciBvZiBDYWNoZWRDb25maWd1cmFibGUuCisgKgorICogTm90ZSB0aGF0IGNhY2hpbmcgaGFwcGVucworICovCitzdHJ1Y3QgQ2FjaGVkQ29uZmlndXJhYmxlIDogcHVibGljIElDb25maWd1cmFibGUgeworICAgIENhY2hlZENvbmZpZ3VyYWJsZShzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlndXJhYmxlQzJJbnRmPiYmIGludGYpOworCisgICAgYzJfc3RhdHVzX3QgaW5pdChDb21wb25lbnRTdG9yZSogc3RvcmUpOworCisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUNvbmZpZ3VyYWJsZQorCisgICAgdmlydHVhbCBSZXR1cm48dWludDMyX3Q+IGdldElkKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBnZXROYW1lKGdldE5hbWVfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gcXVlcnkoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50MzJfdD4mIGluZGljZXMsCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgcXVlcnlfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY29uZmlnKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGluUGFyYW1zLAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgIGNvbmZpZ19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHVpbnQzMl90IHN0YXJ0LAorICAgICAgICAgICAgdWludDMyX3QgY291bnQsCisgICAgICAgICAgICBxdWVyeVN1cHBvcnRlZFBhcmFtc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+JiBpbkZpZWxkcywKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICBxdWVyeVN1cHBvcnRlZFZhbHVlc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBDb21tb24gQ29kZWMyLjAgaW50ZXJmYWNlIHdyYXBwZXIKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlndXJhYmxlQzJJbnRmPiBtSW50ZjsKKworICAgIC8vIENhY2hlZCBzdXBwb3J0ZWQgcGFyYW1zCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gbVN1cHBvcnRlZFBhcmFtczsKK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT05GSUdVUkFCTEVfSAorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvSW5wdXRCdWZmZXJNYW5hZ2VyLmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvSW5wdXRCdWZmZXJNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjY4NTdkNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9JbnB1dEJ1ZmZlck1hbmFnZXIuaApAQCAtMCwwICsxLDI5NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0lOUFVUX0JVRkZFUl9NQU5BR0VSX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVF9CVUZGRVJfTUFOQUdFUl9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50TGlzdGVuZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHRocmVhZD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDsKKworLyoqCisgKiBJbnB1dEJ1ZmZlck1hbmFnZXIKKyAqID09PT09PT09PT09PT09PT09PQorICoKKyAqIElucHV0QnVmZmVyTWFuYWdlciBwcmVzZW50cyBhIHdheSB0byB0cmFjayBhbmQgdW50cmFjayBpbnB1dCBidWZmZXJzIGluIHRoaXMKKyAqIChjb2RlYykgcHJvY2VzcyBhbmQgc2VuZCBhIG5vdGlmaWNhdGlvbiB0byBhIGxpc3RlbmVyLCBwb3NzaWJseSBpbiBhCisgKiBkaWZmZXJlbnQgcHJvY2Vzcywgd2hlbiBhIHRyYWNrZWQgYnVmZmVyIG5vIGxvbmdlciBoYXMgYW55IHJlZmVyZW5jZXMgaW4gdGhpcworICogcHJvY2Vzcy4KKyAqCisgKiBJbnB1dEJ1ZmZlck1hbmFnZXIgaG9sZHMgYSBjb2xsZWN0aW9uIG9mIHJlY29yZHMgcmVwcmVzZW50aW5nIHRyYWNrZWQgYnVmZmVycworICogYW5kIHRoZWlyIGNhbGxiYWNrIGxpc3RlbmVycy4gQ29uY2VwdHVhbGx5LCBvbmUgcmVjb3JkIGlzIGEgdHJpcGxlIChsaXN0ZW5lciwKKyAqIGZyYW1lSW5kZXgsIGJ1ZmZlckluZGV4KSB3aGVyZQorICoKKyAqIC0gKGZyYW1lSW5kZXgsIGJ1ZmZlckluZGV4KSBpcyBhIHBhaXIgb2YgaW5kaWNlcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBidWZmZXIuCisgKiAtIGxpc3RlbmVyIGlzIG9mIHR5cGUgSUNvbXBvbmVudExpc3RlbmVyLiBJdHMgb25JbnB1dEJ1ZmZlcnNSZWxlYXNlZCgpCisgKiAgIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBhc3NvY2lhdGVkIGJ1ZmZlciBkaWVzLiBUaGUgYXJndW1lbnQgb2YKKyAqICAgb25JbnB1dEJ1ZmZlcnNSZWxlYXNlZCgpIGlzIGEgbGlzdCBvZiBJbnB1dEJ1ZmZlciBvYmplY3RzLCBlYWNoIG9mIHdoaWNoCisgKiAgIGhhcyB0aGUgZm9sbG93aW5nIG1lbWJlcnM6CisgKgorICogICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgKKyAqICAgICB1aW50MzJfdCBhcnJheUluZGV4CisgKgorICogV2hlbiBhIHRyYWNrZWQgYnVmZmVyIGFzc29jaWF0ZWQgdG8gdGhlIHRyaXBsZSAobGlzdGVuZXIsIGZyYW1lSW5kZXgsCisgKiBidWZmZXJJbmRleCkgZ29lcyBvdXQgb2Ygc2NvcGUsIGxpc3RlbmVyLT5vbklucHV0QnVmZmVyc1JlbGVhc2VkKCkgd2lsbCBiZQorICogY2FsbGVkIHdpdGggYW4gSW5wdXRCdWZmZXIgb2JqZWN0IHdob3NlIG1lbWJlcnMgYXJlIHNldCBhcyBmb2xsb3dzOgorICoKKyAqICAgICBpbnB1dEJ1ZmZlci5mcmFtZUluZGV4ID0gZnJhbWVJbmRleAorICogICAgIGlucHV0QnVmZmVyLmFycmF5SW5kZXggPSBidWZmZXJJbmRleAorICoKKyAqIElQQyBPcHRpbWl6YXRpb24KKyAqIC0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBTaW5jZSBvbklucHV0QnVmZmVyc1JlbGVhc2VkKCkgaXMgYW4gSVBDIGNhbGwsIElucHV0QnVmZmVyTWFuYWdlciB0cmllcyBub3QKKyAqIHRvIGNhbGwgaXQgdG9vIG9mdGVuLiBBbnkgdHdvIGNhbGxzIHRvIHRoZSBzYW1lIGxpc3RlbmVyIGFyZSBhdCBsZWFzdAorICogbU5vdGlmaWNhdGlvbkludGVydmFsTnMgbmFub3NlY29uZHMgYXBhcnQsIHdoZXJlIG1Ob3RpZmljYXRpb25JbnRlcnZhbE5zIGlzCisgKiBjb25maWd1cmFibGUgdmlhIGNhbGxpbmcgc2V0Tm90aWZpY2F0aW9uSW50ZXJ2YWwoKS4gVGhlIGRlZmF1bHQgdmFsdWUgb2YKKyAqIG1Ob3RpZmljYXRpb25JbnRlcnZhbE5zIGlzIGtEZWZhdWx0Tm90aWZpY2F0aW9uSW50ZXJuYWxOcy4KKyAqCisgKiBQdWJsaWMgTWVtYmVyIEZ1bmN0aW9ucworICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqCisgKiBJbnB1dEJ1ZmZlck1hbmFnZXIgaXMgYSBzaW5nbGV0b24gY2xhc3MuIEl0cyBvbmx5IGluc3RhbmNlIGlzIGFjY2Vzc2libGUgdmlhCisgKiB0aGUgZm9sbG93aW5nIHB1YmxpYyBmdW5jdGlvbnM6CisgKgorICogLSByZWdpc3RlckZyYW1lRGF0YShjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAqICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KQorICoKKyAqIC0gdW5yZWdpc3RlckZyYW1lRGF0YShjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAqICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMkZyYW1lRGF0YSYgaW5wdXQpCisgKgorICogLSB1bnJlZ2lzdGVyRnJhbWVEYXRhKGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyKQorICoKKyAqIC0gc2V0Tm90aWZpY2F0aW9uSW50ZXJ2YWwobnNlY3NfdCBub3RpZmljYXRpb25JbnRlcnZhbE5zKQorICoKKyAqLworCitzdHJ1Y3QgSW5wdXRCdWZmZXJNYW5hZ2VyIHsKKworICAgIC8qKgorICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgdGltZSBpbnRlcnZhbCBiZXR3ZWVuIDIgc3Vic2VxdWVudCBJUENzLgorICAgICAqLworICAgIHN0YXRpYyBjb25zdGV4cHIgbnNlY3NfdCBrRGVmYXVsdE5vdGlmaWNhdGlvbkludGVydmFsTnMgPSAxMDAwMDAwOyAvKiAxbXMgKi8KKworICAgIC8qKgorICAgICAqIFRyYWNrIGFsbCBidWZmZXJzIGluIGEgQzJGcmFtZURhdGEgb2JqZWN0LgorICAgICAqCisgICAgICogaW5wdXQgKEMyRnJhbWVEYXRhKSBoYXMgdGhlIGZvbGxvd2luZyB0d28gbWVtYmVycyB0aGF0IGFyZSBvZiBpbnRlcmVzdDoKKyAgICAgKgorICAgICAqICAgQzJXb3JrT3JkaW5hbCAgICAgICAgICAgICAgICBvcmRpbmFsCisgICAgICogICB2ZWN0b3I8c2hhcmVkX3B0cjxDMkJ1ZmZlcj4+IGJ1ZmZlcnMKKyAgICAgKgorICAgICAqIENhbGxpbmcgcmVnaXN0ZXJGcmFtZURhdGEobGlzdGVuZXIsIGlucHV0KSB3aWxsIHJlZ2lzdGVyIG11bHRpcGxlCisgICAgICogdHJpcGxlcyAobGlzdGVuZXIsIGZyYW1lSW5kZXgsIGJ1ZmZlckluZGV4KSB3aGVyZSBmcmFtZUluZGV4IGlzIGVxdWFsIHRvCisgICAgICogaW5wdXQub3JkaW5hbC5mcmFtZUluZGV4IGFuZCBidWZmZXJJbmRleCBydW5zIHRocm91Z2ggdGhlIGluZGljZXMgb2YKKyAgICAgKiBpbnB1dC5idWZmZXJzIHN1Y2ggdGhhdCBpbnB1dC5idWZmZXJzW2J1ZmZlckluZGV4XSBpcyBub3QgbnVsbC4KKyAgICAgKgorICAgICAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmcm9tIHF1ZXVlKCkuCisgICAgICoKKyAgICAgKiBccGFyYW0gbGlzdGVuZXIgTGlzdGVuZXIgb2YgZGVhdGggbm90aWZpY2F0aW9ucy4KKyAgICAgKiBccGFyYW0gaW5wdXQgSW5wdXQgZnJhbWUgZGF0YSB3aG9zZSBpbnB1dCBidWZmZXJzIGFyZSB0byBiZSB0cmFja2VkLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIHJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgICAgICBjb25zdCBDMkZyYW1lRGF0YSYgaW5wdXQpOworCisgICAgLyoqCisgICAgICogVW50cmFjayBhbGwgYnVmZmVycyBpbiBhIEMyRnJhbWVEYXRhIG9iamVjdC4KKyAgICAgKgorICAgICAqIENhbGxpbmcgdW5yZWdpc3RlckZyYW1lRGF0YShsaXN0ZW5lciwgaW5wdXQpIHdpbGwgdW5yZWdpc3RlciBhbmQgcmVtb3ZlCisgICAgICogcGVuZGluZyBub3RpZmljYXRpb25zIGZvciBhbGwgdHJpcGxlcyAobCwgZmksIGJ1ZmZlckluZGV4KSBzdWNoIHRoYXQKKyAgICAgKiBsID0gbGlzdGVuZXIgYW5kIGZpID0gaW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LgorICAgICAqCisgICAgICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGZyb20gb25Xb3JrRG9uZSgpIGFuZCBmbHVzaCgpLgorICAgICAqCisgICAgICogXHBhcmFtIGxpc3RlbmVyIFByZXZpb3VzbHkgcmVnaXN0ZXJlZCBsaXN0ZW5lci4KKyAgICAgKiBccGFyYW0gaW5wdXQgUHJldmlvdXNseSByZWdpc3RlcmVkIGZyYW1lIGRhdGEuCisgICAgICovCisgICAgc3RhdGljIHZvaWQgdW5yZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KTsKKworICAgIC8qKgorICAgICAqIFVudHJhY2sgYWxsIGJ1ZmZlcnMgYXNzb2NpYXRlZCB0byBhIGdpdmVuIGxpc3RlbmVyLgorICAgICAqCisgICAgICogQ2FsbGluZyB1bnJlZ2lzdGVyRnJhbWVEYXRhKGxpc3RlbmVyKSB3aWxsIHVucmVnaXN0ZXIgYW5kIHJlbW92ZQorICAgICAqIHBlbmRpbmcgbm90aWZpY2F0aW9ucyBmb3IgYWxsIHRyaXBsZXMgKGwsIGZyYW1lSW5kZXgsIGJ1ZmZlckluZGV4KSBzdWNoCisgICAgICogdGhhdCBsID0gbGlzdGVuZXIuCisgICAgICoKKyAgICAgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgY29tcG9uZW50IGNsZWFucyB1cCBhbGwgaW5wdXQgYnVmZmVycywKKyAgICAgKiBpLmUuLCB3aGVuIHJlc2V0KCksIHJlbGVhc2UoKSwgc3RvcCgpIG9yIH5Db21wb25lbnQoKSBpcyBjYWxsZWQuCisgICAgICoKKyAgICAgKiBccGFyYW0gbGlzdGVuZXIgUHJldmlvdXNseSByZWdpc3RlcmVkIGxpc3RlbmVyLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIHVucmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgICAgICBjb25zdCB3cDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lcik7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIG5vdGlmaWNhdGlvbiBpbnRlcnZhbC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBub3RpZmljYXRpb25JbnRlcnZhbE5zIE5ldyBub3RpZmljYXRpb24gaW50ZXJ2YWwsIGluIG5hbm9zZWNvbmRzLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIHNldE5vdGlmaWNhdGlvbkludGVydmFsKG5zZWNzX3Qgbm90aWZpY2F0aW9uSW50ZXJ2YWxOcyk7CisKK3ByaXZhdGU6CisgICAgdm9pZCBfcmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIGNvbnN0IEMyRnJhbWVEYXRhJiBpbnB1dCk7CisgICAgdm9pZCBfdW5yZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KTsKKyAgICB2b2lkIF91bnJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICAgICAgY29uc3Qgd3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIpOworICAgIHZvaWQgX3NldE5vdGlmaWNhdGlvbkludGVydmFsKG5zZWNzX3Qgbm90aWZpY2F0aW9uSW50ZXJ2YWxOcyk7CisKKyAgICAvLyBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdGllZCB0byBDMkJ1ZmZlciBvYmplY3RzLgorICAgIC8vCisgICAgLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgc0luc3RhbmNlIGlzIHRoZSBvbmx5IGluc3RhbmNlIG9mIHRoaXMKKyAgICAvLyAgICAgICBjbGFzcy4KKyAgICBzdGF0aWMgdm9pZCBvbkJ1ZmZlckRlc3Ryb3llZChjb25zdCBDMkJ1ZmZlciogYnVmLCB2b2lkKiBhcmcpOworICAgIHZvaWQgX29uQnVmZmVyRGVzdHJveWVkKGNvbnN0IEMyQnVmZmVyKiBidWYsIHZvaWQqIGFyZyk7CisKKyAgICAvLyBQZXJzaXN0ZW50IGRhdGEgdG8gYmUgcGFzc2VkIGFzICJhcmciIGluIG9uQnVmZmVyRGVzdHJveWVkKCkuCisgICAgLy8gVGhpcyBpcyBlc3NlbnRpYWxseSB0aGUgdHJpcGxlIChsaXN0ZW5lciwgZnJhbWVJbmRleCwgYnVmZmVySW5kZXgpIHBsdXMgYQorICAgIC8vIHdlYWsgcG9pbnRlciB0byB0aGUgQzJCdWZmZXIgb2JqZWN0LgorICAgIC8vCisgICAgLy8gTm90ZSB0aGF0IHRoZSAia2V5IiBpcyBidWZmZXJJbmRleCBhY2NvcmRpbmcgdG8gb3BlcmF0b3I8KCkuIFRoaXMgaXMKKyAgICAvLyBkZXNpZ25lZCB0byB3b3JrIHdpdGggVHJhY2tlZEJ1ZmZlcnNNYXAgZGVmaW5lZCBiZWxvdy4KKyAgICBzdHJ1Y3QgVHJhY2tlZEJ1ZmZlciB7CisgICAgICAgIHdwPElDb21wb25lbnRMaXN0ZW5lcj4gbGlzdGVuZXI7CisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXg7CisgICAgICAgIHNpemVfdCBidWZmZXJJbmRleDsKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyOworICAgICAgICBUcmFja2VkQnVmZmVyKGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlckluZGV4LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIGJ1ZmZlcikKKyAgICAgICAgICAgICAgOiBsaXN0ZW5lcihsaXN0ZW5lciksCisgICAgICAgICAgICAgICAgZnJhbWVJbmRleChmcmFtZUluZGV4KSwKKyAgICAgICAgICAgICAgICBidWZmZXJJbmRleChidWZmZXJJbmRleCksCisgICAgICAgICAgICAgICAgYnVmZmVyKGJ1ZmZlcikge30KKyAgICAgICAgVHJhY2tlZEJ1ZmZlcihjb25zdCBUcmFja2VkQnVmZmVyJikgPSBkZWZhdWx0OworICAgICAgICBib29sIG9wZXJhdG9yPChjb25zdCBUcmFja2VkQnVmZmVyJiBvdGhlcikgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlckluZGV4IDwgb3RoZXIuYnVmZmVySW5kZXg7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLy8gTWFwOiBsaXN0ZW5lciAtPiBmcmFtZUluZGV4IC0+IHNldDxUcmFja2VkQnVmZmVyPi4KKyAgICAvLyBFc3NlbnRpYWxseSwgdGhpcyBpcyB1c2VkIHRvIHN0b3JlIHRyaXBsZXMgKGxpc3RlbmVyLCBmcmFtZUluZGV4LAorICAgIC8vIGJ1ZmZlckluZGV4KSB0aGF0J3Mgc2VhcmNoYWJsZSBieSBsaXN0ZW5lciBhbmQgKGxpc3RlbmVyLCBmcmFtZUluZGV4KS4KKyAgICAvLyBIb3dldmVyLCB0aGUgdmFsdWUgb2YgdGhlIGlubmVybW9zdCBtYXAgaXMgVHJhY2tlZEJ1ZmZlciwgd2hpY2ggYWxzbworICAgIC8vIGNvbnRhaW5zIGFuIGV4dHJhIGNvcHkgb2YgbGlzdGVuZXIgYW5kIGZyYW1lSW5kZXguIFRoaXMgaXMgbmVlZGVkCisgICAgLy8gYmVjYXVzZSBvbkJ1ZmZlckRlc3Ryb3llZCgpIG5lZWRzIHRvIGtub3cgbGlzdGVuZXIgYW5kIGZyYW1lSW5kZXggdG9vLgorICAgIHR5cGVkZWYgc3RkOjptYXA8d3A8SUNvbXBvbmVudExpc3RlbmVyPiwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFwPHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzZXQ8VHJhY2tlZEJ1ZmZlcj4+PiBUcmFja2VkQnVmZmVyc01hcDsKKworICAgIC8vIFN0b3JhZ2UgZm9yIHBlbmRpbmcgKHVuc2VudCkgZGVhdGggbm90aWZpY2F0aW9ucyBmb3Igb25lIGxpc3RlbmVyLgorICAgIC8vIEVhY2ggcGFpciBpbiBtZW1iZXIgbmFtZWQgImluZGljZXMiIGFyZSAoZnJhbWVJbmRleCwgYnVmZmVySW5kZXgpIGZyb20KKyAgICAvLyB0aGUgKGxpc3RlbmVyLCBmcmFtZUluZGV4LCBidWZmZXJJbmRleCkgdHJpcGxlLgorICAgIHN0cnVjdCBEZWF0aE5vdGlmaWNhdGlvbnMgeworCisgICAgICAgIC8vIFRoZSBudW1iZXIgb2YgcGVuZGluZyBub3RpZmljYXRpb25zIGZvciB0aGlzIGxpc3RlbmVyLgorICAgICAgICAvLyBjb3VudCBtYXkgYmUgMCwgaW4gd2hpY2ggY2FzZSB0aGUgRGVhdGhOb3RpZmljYXRpb25zIG9iamVjdCB3aWxsCisgICAgICAgIC8vIHJlbWFpbiB2YWxpZCBmb3Igb25seSBhIHNtYWxsIHBlcmlvZCAoc3BlY2lmaWVkCisgICAgICAgIC8vIG5hbm9zZWNvbmRzKS4KKyAgICAgICAgc2l6ZV90IGNvdW50OworCisgICAgICAgIC8vIFRoZSB0aW1lc3RhbXAgb2YgdGhlIG1vc3QgcmVjZW50IGNhbGxiYWNrIG9uIHRoaXMgbGlzdGVuZXIuIFRoaXMgaXMKKyAgICAgICAgLy8gdXNlZCB0byBndWFyYW50ZWUgdGhhdCBjYWxsYmFja3MgZG8gbm90IG9jY3VyIHRvbyBmcmVxdWVudGx5LCBhbmQKKyAgICAgICAgLy8gYWxzbyB0byB0cmlnZ2VyIGV4cGlyYXRpb24gb2YgYSBEZWF0aE5vdGlmaWNhdGlvbnMgb2JqZWN0IHRoYXQgaGFzCisgICAgICAgIC8vIGNvdW50ID0gMC4KKyAgICAgICAgbnNlY3NfdCBsYXN0U2VudE5zOworCisgICAgICAgIC8vIE1hcDogZnJhbWVJbmRleCAtPiB2ZWN0b3Igb2YgYnVmZmVySW5kaWNlcworICAgICAgICAvLyBUaGlzIGlzIGVzc2VudGlhbGx5IGEgY29sbGVjdGlvbiBvZiAoZnJhbWRlSW5kZXgsIGJ1ZmZlckluZGV4KS4KKyAgICAgICAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6dmVjdG9yPHNpemVfdD4+IGluZGljZXM7CisKKyAgICAgICAgRGVhdGhOb3RpZmljYXRpb25zKAorICAgICAgICAgICAgICAgIG5zZWNzX3Qgbm90aWZpY2F0aW9uSW50ZXJ2YWxOcyA9IGtEZWZhdWx0Tm90aWZpY2F0aW9uSW50ZXJ2YWxOcykKKyAgICAgICAgICAgICAgOiBjb3VudCgwKSwKKyAgICAgICAgICAgICAgICBsYXN0U2VudE5zKHN5c3RlbVRpbWUoKSAtIG5vdGlmaWNhdGlvbkludGVydmFsTnMpLAorICAgICAgICAgICAgICAgIGluZGljZXMoKSB7fQorICAgIH07CisKKyAgICAvLyBUaGUgbWluaW11bSB0aW1lIHBlcmlvZCBiZXR3ZWVuIElQQyBjYWxscyB0byBub3RpZnkgdGhlIGNsaWVudCBhYm91dCB0aGUKKyAgICAvLyBkZXN0cnVjdGlvbiBvZiBpbnB1dCBidWZmZXJzLgorICAgIHN0ZDo6YXRvbWljPG5zZWNzX3Q+IG1Ob3RpZmljYXRpb25JbnRlcnZhbE5ze2tEZWZhdWx0Tm90aWZpY2F0aW9uSW50ZXJ2YWxOc307CisKKyAgICAvLyBNdXRleCBmb3IgdGhlIG1hbmFnZW1lbnQgb2YgYWxsIGlucHV0IGJ1ZmZlcnMuCisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisKKyAgICAvLyBUcmFja2VkIGlucHV0IGJ1ZmZlcnMuCisgICAgVHJhY2tlZEJ1ZmZlcnNNYXAgbVRyYWNrZWRCdWZmZXJzTWFwOworCisgICAgLy8gRGVhdGggbm90aWZpY2F0aW9ucyB0byBiZSBzZW50LgorICAgIC8vCisgICAgLy8gQSBEZWF0aE5vdGlmaWNhdGlvbnMgb2JqZWN0IGlzIGFzc29jaWF0ZWQgdG8gZWFjaCBsaXN0ZW5lci4gQW4gZW50cnkgaW4KKyAgICAvLyB0aGlzIG1hcCB3aWxsIGJlIHJlbW92ZWQgaWYgaXRzIGFzc29jaWF0ZWQgRGVhdGhOb3RpZmljYXRpb25zIGhhcyBjb3VudCA9CisgICAgLy8gMCBhbmQgbGFzdFNlbnROcyA8IHN5c3RlbVRpbWUoKSAtIG1Ob3RpZmljYXRpb25JbnRlcnZhbE5zLgorICAgIHN0ZDo6bWFwPHdwPElDb21wb25lbnRMaXN0ZW5lcj4sIERlYXRoTm90aWZpY2F0aW9ucz4gbURlYXRoTm90aWZpY2F0aW9uczsKKworICAgIC8vIENvbmRpdGlvbiB2YXJpYWJsZSBzaWduYWxlZCB3aGVuIGFuIGVudHJ5IGlzIGFkZGVkIHRvIG1EZWF0aE5vdGlmaWNhdGlvbnMuCisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbU9uQnVmZmVyRGVzdHJveWVkOworCisgICAgLy8gTm90aWZ5IHRoZSBjbGllbnRzIGFib3V0IGJ1ZmZlciBkZXN0cnVjdGlvbnMuCisgICAgLy8gUmV0dXJuIGZhbHNlIGlmIGFsbCBkZXN0cnVjdGlvbnMgaGF2ZSBiZWVuIG5vdGlmaWVkLgorICAgIC8vIFJldHVybiB0cnVlIGFuZCBzZXQgdGltZVRvUmV0cnkgdG8gdGhlIGR1cmF0aW9uIHRvIHdhaXQgZm9yIGJlZm9yZQorICAgIC8vIHJldHJ5aW5nIGlmIHNvbWUgZGVzdHJ1Y3Rpb25zIGhhdmUgbm90IGJlZW4gbm90aWZpZWQuCisgICAgYm9vbCBwcm9jZXNzTm90aWZpY2F0aW9ucyhuc2Vjc190KiB0aW1lVG9SZXRyeU5zKTsKKworICAgIC8vIE1haW4gZnVuY3Rpb24gZm9yIHRoZSBpbnB1dCBidWZmZXIgbWFuYWdlciB0aHJlYWQuCisgICAgdm9pZCBtYWluKCk7CisKKyAgICAvLyBUaGUgdGhyZWFkIHRoYXQgbWFuYWdlcyBub3RpZmljYXRpb25zLgorICAgIC8vCisgICAgLy8gTm90ZTogVGhpcyB2YXJpYWJsZSBpcyBkZWNsYXJlZCBsYXN0IHNvIGl0cyBpbml0aWFsaXphdGlvbiB3aWxsIGhhcHBlbgorICAgIC8vIGFmdGVyIGFsbCBvdGhlciBtZW1iZXIgdmFyaWFibGVzIGhhdmUgYmVlbiBpbml0aWFsaXplZC4KKyAgICBzdGQ6OnRocmVhZCBtTWFpblRocmVhZDsKKworICAgIC8vIFByaXZhdGUgY29uc3RydWN0b3IuCisgICAgSW5wdXRCdWZmZXJNYW5hZ2VyKCk7CisKKyAgICAvLyBUaGUgb25seSBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzLgorICAgIHN0YXRpYyBJbnB1dEJ1ZmZlck1hbmFnZXImIGdldEluc3RhbmNlKCk7CisKK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVF9CVUZGRVJfTUFOQUdFUl9ICisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2UuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOWVkN2ZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZS5oCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVFNVUkZBQ0VfSAorI2RlZmluZSBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0lOUFVUU1VSRkFDRV9ICisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMi4wL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JSW5wdXRTaW5rLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUlucHV0U3VyZmFjZS5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgorCisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworc3RydWN0IElucHV0U3VyZmFjZSA6IHB1YmxpYyBJSW5wdXRTdXJmYWNlIHsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMl8wOjoKKyAgICAgICAgICAgIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjoKKyAgICAgICAgICAgIEdyYXBoaWNCdWZmZXJTb3VyY2UgR3JhcGhpY0J1ZmZlclNvdXJjZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+PiBnZXRHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiBnZXRDb25maWd1cmFibGUoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNvbm5lY3QoCisgICAgICAgICAgICBjb25zdCBzcDxJSW5wdXRTaW5rPiYgc2luaywKKyAgICAgICAgICAgIGNvbm5lY3RfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisKKyAgICBjbGFzcyBJbnRlcmZhY2U7CisgICAgY2xhc3MgQ29uZmlndXJhYmxlSW50ZjsKKworICAgIHNwPENvbXBvbmVudFN0b3JlPiBtU3RvcmU7CisgICAgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbVByb2R1Y2VyOworICAgIHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IG1Tb3VyY2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGVyZmFjZT4gbUludGY7CisgICAgc3A8Q2FjaGVkQ29uZmlndXJhYmxlPiBtQ29uZmlndXJhYmxlOworCisgICAgSW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgY29uc3Qgc3A8Q29tcG9uZW50U3RvcmU+JiBzdG9yZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4mIHJlZmxlY3RvciwKKyAgICAgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBiYXNlLAorICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4mIHNvdXJjZSk7CisKKyAgICB2aXJ0dWFsIH5JbnB1dFN1cmZhY2UoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBmcmllbmQgc3RydWN0IENvbXBvbmVudFN0b3JlOworCit9OworCisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVFNVUkZBQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU4YjZiMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmgKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0lOUFVUU1VSRkFDRUNPTk5FQ1RJT05fSAorI2RlZmluZSBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0lOUFVUU1VSRkFDRUNPTk5FQ1RJT05fSAorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudC5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db25maWd1cmFibGUuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29uZmlndXJhYmxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUlucHV0U3VyZmFjZUNvbm5lY3Rpb24uaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKworI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7Cit1c2luZyA6OmFuZHJvaWQ6OkdyYXBoaWNCdWZmZXJTb3VyY2U7CisKKy8vIEFuIElucHV0U3VyZmFjZUNvbm5lY3Rpb24gY29ubmVjdHMgYW4gSW5wdXRTdXJmYWNlIHRvIGEgc2luaywgd2hpY2ggbWF5IGJlIGFuCisvLyBJSW5wdXRTaW5rIG9yIGEgbG9jYWwgQzJDb21wb25lbnQuIFRoaXMgY2FuIGJlIHNwZWNpZmllZCBieSBjaG9vc2luZyB0aGUKKy8vIGNvcnJlc3BvbmRpbmcgY29uc3RydWN0b3IuIFRoZSByZWFzb24gZm9yIGRpc3Rpbmd1aXNoaW5nIHRoZXNlIHR3byBjYXNlcyBpcworLy8gdGhhdCB3aGVuIGFuIElucHV0U3VyZmFjZUNvbm5lY3Rpb24gbGl2ZXMgaW4gdGhlIHNhbWUgcHJvY2VzcyBhcyB0aGUKKy8vIGNvbXBvbmVudCB0aGF0IHByb2Nlc3NlcyB0aGUgYnVmZmVycywgZGF0YSBwYXJjZWxpbmcgaXMgbm90IG5lZWRlZC4KK3N0cnVjdCBJbnB1dFN1cmZhY2VDb25uZWN0aW9uIDogcHVibGljIElJbnB1dFN1cmZhY2VDb25uZWN0aW9uIHsKKworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gZGlzY29ubmVjdCgpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IGdldENvbmZpZ3VyYWJsZSgpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisKKyAgICBJbnB1dFN1cmZhY2VDb25uZWN0aW9uKAorICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4mIHNvdXJjZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4mIGNvbXAsCisgICAgICAgICAgICBjb25zdCBzcDxDb21wb25lbnRTdG9yZT4mIHN0b3JlKTsKKworICAgIElucHV0U3VyZmFjZUNvbm5lY3Rpb24oCisgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICAgICAgY29uc3Qgc3A8SUlucHV0U2luaz4mIHNpbmssCisgICAgICAgICAgICBjb25zdCBzcDxDb21wb25lbnRTdG9yZT4mIHN0b3JlKTsKKworICAgIGJvb2wgaW5pdCgpOworCisgICAgZnJpZW5kIHN0cnVjdCBJbnB1dFN1cmZhY2U7CisKKyAgICBJbnB1dFN1cmZhY2VDb25uZWN0aW9uKCkgPSBkZWxldGU7CisgICAgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbihjb25zdCBJbnB1dFN1cmZhY2VDb25uZWN0aW9uJikgPSBkZWxldGU7CisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbiYpID0gZGVsZXRlOworCisgICAgc3RydWN0IEltcGw7CisKKyAgICBzdGQ6Om11dGV4IG1JbXBsTXV0ZXg7CisgICAgc3A8SW1wbD4gbUltcGw7CisgICAgc3A8Q2FjaGVkQ29uZmlndXJhYmxlPiBtQ29uZmlndXJhYmxlOworCisgICAgdmlydHVhbCB+SW5wdXRTdXJmYWNlQ29ubmVjdGlvbigpIG92ZXJyaWRlOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0lOUFVUU1VSRkFDRUNPTk5FQ1RJT05fSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL3R5cGVzLmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZGRmZWM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL3R5cGVzLmgKQEAgLTAsMCArMSwzMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0hJRExfVjFfMF9VVElMU19UWVBFU19ICisjZGVmaW5lIENPREVDMl9ISURMX1YxXzBfVVRJTFNfVFlQRVNfSAorCisjaW5jbHVkZSA8YnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9zYWZlX3VuaW9uLzEuMC90eXBlcy5oPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8QzJQYXJhbURlZi5oPgorI2luY2x1ZGUgPEMyV29yay5oPgorI2luY2x1ZGUgPHV0aWwvQzJEZWJ1Zy1iYXNlLmg+CisKKyNpbmNsdWRlIDxjaHJvbm8+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6c3RhdHVzX3Q7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjoKKyAgICAgICAgQ29ubmVjdGlvbklkOworCisvLyBUeXBlcyBvZiBtZXRhZGF0YSBmb3IgQmxvY2tzLgorc3RydWN0IEMySGlkbF9SYW5nZSB7CisgICAgdWludDMyX3Qgb2Zmc2V0OworICAgIHVpbnQzMl90IGxlbmd0aDsgLy8gRG8gbm90IHVzZSAic2l6ZSIgYmVjYXVzZSB0aGUgbmFtZSBjb2xsaWRlcyB3aXRoIEMySW5mbzo6c2l6ZSgpLgorfTsKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMySGlkbF9SYW5nZSwgMD4gQzJIaWRsX1JhbmdlSW5mbzsKKworc3RydWN0IEMySGlkbF9SZWN0IHsKKyAgICB1aW50MzJfdCBsZWZ0OworICAgIHVpbnQzMl90IHRvcDsKKyAgICB1aW50MzJfdCB3aWR0aDsKKyAgICB1aW50MzJfdCBoZWlnaHQ7Cit9OwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJIaWRsX1JlY3QsIDE+IEMySGlkbF9SZWN0SW5mbzsKKworLy8gTWFrZSBhc1N0cmluZygpIGFuZCBvcGVyYXRvcjw8IHdvcmsgd2l0aCBTdGF0dXMgYXMgd2VsbCBhcyBjMl9zdGF0dXNfdC4KK0MyX0RFQ0xBUkVfQVNfU1RSSU5HX0FORF9ERUZJTkVfU1RSRUFNX09VVChTdGF0dXMpOworCisvKioKKyAqIEFsbCBvYmpjcHkoKSBmdW5jdGlvbnMgd2lsbCByZXR1cm4gYSBib29sZWFuIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUKKyAqIGNvbnZlcnNpb24gc3VjY2VlZHMgb3Igbm90LgorICovCisKKy8vIEMyU2V0dGluZ1Jlc3VsdCAtPiBTZXR0aW5nUmVzdWx0Citib29sIG9iamNweSgKKyAgICAgICAgU2V0dGluZ1Jlc3VsdCogZCwKKyAgICAgICAgY29uc3QgQzJTZXR0aW5nUmVzdWx0JiBzKTsKKworLy8gU2V0dGluZ1Jlc3VsdCAtPiBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PgorYm9vbCBvYmpjcHkoCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+KiBkLAorICAgICAgICBjb25zdCBTZXR0aW5nUmVzdWx0JiBzKTsKKworLy8gQzJQYXJhbURlc2NyaXB0b3IgLT4gUGFyYW1EZXNjcmlwdG9yCitib29sIG9iamNweSgKKyAgICAgICAgUGFyYW1EZXNjcmlwdG9yKiBkLAorICAgICAgICBjb25zdCBDMlBhcmFtRGVzY3JpcHRvciYgcyk7CisKKy8vIFBhcmFtRGVzY3JpcHRvciAtPiBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+Citib29sIG9iamNweSgKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiogZCwKKyAgICAgICAgY29uc3QgUGFyYW1EZXNjcmlwdG9yJiBzKTsKKworLy8gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5IC0+IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkKK2Jvb2wgb2JqY3B5KAorICAgICAgICBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KiBkLAorICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHMpOworCisvLyBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5IC0+IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeQorYm9vbCBvYmpjcHkoCisgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSogZCwKKyAgICAgICAgY29uc3QgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSYgcyk7CisKKy8vIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAtPiBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5UmVzdWx0Citib29sIG9iamNweSgKKyAgICAgICAgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdCogZCwKKyAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5JiBzKTsKKworLy8gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSwgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdCAtPiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkKK2Jvb2wgb2JqY3B5KAorICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkqIGQsCisgICAgICAgIGNvbnN0IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHNxLAorICAgICAgICBjb25zdCBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5UmVzdWx0JiBzcik7CisKKy8vIEMyQ29tcG9uZW50OjpUcmFpdHMgLT4gQ29tcG9uZW50VHJhaXRzCitib29sIG9iamNweSgKKyAgICAgICAgSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHMqIGQsCisgICAgICAgIGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHMmIHMpOworCisvLyBDb21wb25lbnRUcmFpdHMgLT4gQzJDb21wb25lbnQ6OlRyYWl0cworYm9vbCBvYmpjcHkoCisgICAgICAgIEMyQ29tcG9uZW50OjpUcmFpdHMqIGQsCisgICAgICAgIGNvbnN0IElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzJiBzKTsKKworLy8gQzJTdHJ1Y3REZXNjcmlwdG9yIC0+IFN0cnVjdERlc2NyaXB0b3IKK2Jvb2wgb2JqY3B5KAorICAgICAgICBTdHJ1Y3REZXNjcmlwdG9yKiBkLAorICAgICAgICBjb25zdCBDMlN0cnVjdERlc2NyaXB0b3ImIHMpOworCisvLyBTdHJ1Y3REZXNjcmlwdG9yIC0+IEMyU3RydWN0RGVzY3JpcHRvcgorYm9vbCBvYmpjcHkoCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+KiBkLAorICAgICAgICBjb25zdCBTdHJ1Y3REZXNjcmlwdG9yJiBzKTsKKworLy8gQWJzdHJhY3QgY2xhc3MgdG8gYmUgdXNlZCBpbgorLy8gb2JqY3B5KHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gLT4gV29ya0J1bmRsZSkuCitzdHJ1Y3QgQnVmZmVyUG9vbFNlbmRlciB7CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6CisgICAgICAgICAgICBSZXN1bHRTdGF0dXMgUmVzdWx0U3RhdHVzOworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OgorICAgICAgICAgICAgQnVmZmVyU3RhdHVzTWVzc2FnZSBCdWZmZXJTdGF0dXNNZXNzYWdlOworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OgorICAgICAgICAgICAgQnVmZmVyUG9vbERhdGEgQnVmZmVyUG9vbERhdGE7CisKKyAgICAvKioKKyAgICAgKiBTZW5kIGJwRGF0YSBhbmQgcmV0dXJuIEJ1ZmZlclN0YXR1c01lc3NhZ2UgdGhhdCBjYW4gYmUgc3VwcGxpZWQgdG8KKyAgICAgKiBJQ2xpZW50TWFuYWdlcjo6cmVjZWl2ZSgpIGluIHRoZSByZWNlaXZpbmcgcHJvY2Vzcy4KKyAgICAgKgorICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgZnJvbSB3aXRoaW4gdGhlIGZ1bmN0aW9uCisgICAgICogb2JqY3B5KHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gLT4gV29ya0J1bmRsZSkuCisgICAgICoKKyAgICAgKiBccGFyYW1baW5dIGJwRGF0YSBCdWZmZXJQb29sRGF0YSBpZGVudGlmeWluZyB0aGUgYnVmZmVyIHRvIHNlbmQuCisgICAgICogXHBhcmFtW291dF0gYnBNZXNzYWdlIEJ1ZmZlclN0YXR1c01lc3NhZ2Ugb2YgdGhlIHRyYW5zYWN0aW9uLiBJbmZvcm1hdGlvbgorICAgICAqICAgIGluc2lkZSBccCBicE1lc3NhZ2Ugc2hvdWxkIGJlIHBhc3NlZCB0byB0aGUgcmVjZWl2aW5nIHByb2Nlc3MgYnkgc29tZQorICAgICAqICAgIG90aGVyIG1lYW5zIHNvIGl0IGNhbiBjYWxsIHJlY2VpdmUoKSBwcm9wZXJseS4KKyAgICAgKiBccmV0dXJuIFJlc3VsdFN0YXR1cyB2YWx1ZSB0aGF0IGRldGVybWluZXMgdGhlIHN1Y2Nlc3Mgb2YgdGhlIG9wZXJhdGlvbi4KKyAgICAgKiAgICAoU2VlIHRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgUmVzdWx0U3RhdHVzIGluCisgICAgICogICAgaGFyZHdhcmUvaW50ZXJmYWNlcy9tZWRpYS9idWZmZXJwb29sLzIuMC90eXBlcy5oYWwuKQorICAgICAqLworICAgIHZpcnR1YWwgUmVzdWx0U3RhdHVzIHNlbmQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+JiBicERhdGEsCisgICAgICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlKiBicE1lc3NhZ2UpID0gMDsKKworICAgIHZpcnR1YWwgfkJ1ZmZlclBvb2xTZW5kZXIoKSA9IGRlZmF1bHQ7Cit9OworCisvLyBEZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIEJ1ZmZlclBvb2xTZW5kZXIuCisvLworLy8gVG8gdXNlIERlZmF1bHRCdWZmZXJQb29sU2VuZGVyLCB0aGUgSUNsaWVudE1hbmFnZXIgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmluZworLy8gcHJvY2VzcyBtdXN0IGJlIHNldCBiZWZvcmUgc2VuZCgpIGNhbiBvcGVyYXRlLiBEZWZhdWx0QnVmZmVyUG9vbFNlbmRlciB3aWxsCisvLyBob2xkIGEgc3Ryb25nIHJlZmVyZW5jZSB0byB0aGUgSUNsaWVudE1hbmFnZXIgaW5zdGFuY2UgYW5kIHVzZSBpdCB0byBjYWxsCisvLyBJQ2xpZW50TWFuYWdlcjo6cmVnaXN0ZXJTZW5kZXIoKSB0byBlc3RhYmxpc2ggdGhlIGJ1ZmZlcnBvb2wgY29ubmVjdGlvbiB3aGVuCisvLyBzZW5kKCkgaXMgY2FsbGVkLgorc3RydWN0IERlZmF1bHRCdWZmZXJQb29sU2VuZGVyIDogQnVmZmVyUG9vbFNlbmRlciB7CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OgorICAgICAgICAgICAgQ2xpZW50TWFuYWdlciBDbGllbnRNYW5hZ2VyOworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OgorICAgICAgICAgICAgSUNsaWVudE1hbmFnZXIgSUNsaWVudE1hbmFnZXI7CisKKyAgICAvLyBTZXQgdGhlIElDbGllbnRNYW5hZ2VyIGluc3RhbmNlIG9mIHRoZSByZWNlaXZpbmcgcHJvY2VzcyBhbmQgdGhlIHJlZnJlc2gKKyAgICAvLyBpbnRlcnZhbCBmb3IgdGhlIGNvbm5lY3Rpb24uIFRoZSBkZWZhdWx0IGludGVydmFsIGlzIDQuNSBzZWNvbmRzLCB3aGljaAorICAgIC8vIGlzIHNsaWdodGx5IHNob3J0ZXIgdGhhbiB0aGUgYW1vdW50IG9mIHRpbWUgdGhlIGJ1ZmZlcnBvb2wgd2lsbCBrZWVwIGFuCisgICAgLy8gaW5hY3RpdmUgY29ubmVjdGlvbiBmb3IuCisgICAgRGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXIoCisgICAgICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4mIHJlY2VpdmVyTWFuYWdlciA9IG51bGxwdHIsCisgICAgICAgICAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpkdXJhdGlvbiByZWZyZXNoSW50ZXJ2YWwgPSA0NTAwbXMpOworCisgICAgLy8gU2V0IHRoZSBJQ2xpZW50TWFuYWdlciBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2aW5nIHByb2Nlc3MgYW5kIHRoZSByZWZyZXNoCisgICAgLy8gaW50ZXJ2YWwgZm9yIHRoZSBjb25uZWN0aW9uLiBUaGUgZGVmYXVsdCBpbnRlcnZhbCBpcyA0LjUgc2Vjb25kcywgd2hpY2gKKyAgICAvLyBpcyBzbGlnaHRseSBzaG9ydGVyIHRoYW4gdGhlIGFtb3VudCBvZiB0aW1lIHRoZSBidWZmZXJwb29sIHdpbGwga2VlcCBhbgorICAgIC8vIGluYWN0aXZlIGNvbm5lY3Rpb24gZm9yLgorICAgIHZvaWQgc2V0UmVjZWl2ZXIoCisgICAgICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4mIHJlY2VpdmVyTWFuYWdlciwKKyAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OmR1cmF0aW9uIHJlZnJlc2hJbnRlcnZhbCA9IDQ1MDBtcyk7CisKKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBCdWZmZXJQb29sU2VuZGVyOjpzZW5kKCkuIHNlbmQoKSB3aWxsIGVzdGFibGlzaCBhCisgICAgLy8gYnVmZmVycG9vbCBjb25uZWN0aW9uIGlmIG5lZWRlZCwgdGhlbiBzZW5kIHRoZSBidWZmZXJwb29sIGRhdGEgb3ZlciB0bworICAgIC8vIHRoZSByZWNlaXZpbmcgcHJvY2Vzcy4KKyAgICB2aXJ0dWFsIFJlc3VsdFN0YXR1cyBzZW5kKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiYgYnBEYXRhLAorICAgICAgICAgICAgQnVmZmVyU3RhdHVzTWVzc2FnZSogYnBNZXNzYWdlKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBzcDxDbGllbnRNYW5hZ2VyPiBtU2VuZGVyTWFuYWdlcjsKKyAgICBzcDxJQ2xpZW50TWFuYWdlcj4gbVJlY2VpdmVyTWFuYWdlcjsKKyAgICBpbnQ2NF90IG1SZWNlaXZlckNvbm5lY3Rpb25JZDsKKyAgICBpbnQ2NF90IG1Tb3VyY2VDb25uZWN0aW9uSWQ7CisgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCBtTGFzdFNlbnQ7CisgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24gbVJlZnJlc2hJbnRlcnZhbDsKK307CisKKy8vIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gLT4gV29ya0J1bmRsZQorLy8gTm90ZTogSWYgYnVmZmVycG9vbCB3aWxsIGJlIHVzZWQsIGJwU2VuZGVyIG11c3Qgbm90IGJlIG51bGwuCitib29sIG9iamNweSgKKyAgICAgICAgV29ya0J1bmRsZSogZCwKKyAgICAgICAgY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgcywKKyAgICAgICAgQnVmZmVyUG9vbFNlbmRlciogYnBTZW5kZXIgPSBudWxscHRyKTsKKworLy8gV29ya0J1bmRsZSAtPiBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+Citib29sIG9iamNweSgKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogZCwKKyAgICAgICAgY29uc3QgV29ya0J1bmRsZSYgcyk7CisKKy8qKgorICogUGFyc2VzIGEgcGFyYW1zIGJsb2IgYW5kIHJldHVybnMgQzJQYXJhbSBwb2ludGVycyB0byBpdHMgcGFyYW1zLiBUaGUgcG9pbnRlcnMKKyAqIHBvaW50IHRvIGxvY2F0aW9ucyBpbnNpZGUgdGhlIHVuZGVybHlpbmcgYnVmZmVyIG9mIFxwIGJsb2IuIElmIFxwIGJsb2IgaXMKKyAqIGRlc3Ryb3llZCwgdGhlIHBvaW50ZXJzIGJlY29tZSBpbnZhbGlkLgorICoKKyAqIFxwYXJhbVtvdXRdIHBhcmFtcyB0YXJnZXQgdmVjdG9yIG9mIEMyUGFyYW0gcG9pbnRlcnMKKyAqIFxwYXJhbVtpbl0gYmxvYiBwYXJhbWV0ZXIgYmxvYiB0byBwYXJzZQorICogXHJldHZhbCB0cnVlIGlmIHRoZSBmdWxsIGJsb2Igd2FzIHBhcnNlZAorICogXHJldHZhbCBmYWxzZSBvdGhlcndpc2UKKyAqLworYm9vbCBwYXJzZVBhcmFtc0Jsb2IoCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAqcGFyYW1zLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiAmYmxvYik7CisKKy8qKgorICogQ29uY2F0ZW5hdGVzIGEgbGlzdCBvZiBDMlBhcmFtcyBpbnRvIGEgcGFyYW1zIGJsb2IuCisgKgorICogXHBhcmFtW291dF0gYmxvYiB0YXJnZXQgYmxvYgorICogXHBhcmFtW2luXSBwYXJhbXMgcGFyYW1ldGVycyB0byBjb25jYXRlbmF0ZQorICogXHJldHZhbCB0cnVlIGlmIHRoZSBibG9iIHdhcyBzdWNjZXNzZnVsbHkgY3JlYXRlZAorICogXHJldHZhbCBmYWxzZSBpZiB0aGUgYmxvYiB3YXMgbm90IHN1Y2Nlc3NmdWwgKHRoaXMgb25seSBoYXBwZW5zIGlmIHRoZQorICogICAgICAgICBwYXJhbWV0ZXJzIHdlcmUgbm90IGNvbnN0KQorICovCitib29sIGNyZWF0ZVBhcmFtc0Jsb2IoCisgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+ICpibG9iLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcyk7Citib29sIGNyZWF0ZVBhcmFtc0Jsb2IoCisgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+ICpibG9iLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZwYXJhbXMpOworYm9vbCBjcmVhdGVQYXJhbXNCbG9iKAorICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+ICZwYXJhbXMpOworYm9vbCBjcmVhdGVQYXJhbXNCbG9iKAorICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyVHVuaW5nPj4gJnBhcmFtcyk7CisKKy8qKgorICogUGFyc2VzIGEgcGFyYW1zIGJsb2IgYW5kIGNyZWF0ZSBhIHZlY3RvciBvZiBDMlBhcmFtcyB3aG9zZSBtZW1iZXJzIGFyZSBjb3BpZXMKKyAqIG9mIHRoZSBwYXJhbXMgaW4gdGhlIGJsb2IuCisgKgorICogXHBhcmFtW291dF0gcGFyYW1zIHRoZSByZXN1bHRpbmcgdmVjdG9yCisgKiBccGFyYW1baW5dIGJsb2IgcGFyYW1ldGVyIGJsb2IgdG8gcGFyc2UKKyAqIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgZnVsbCBibG9iIHdhcyBwYXJzZWQgYW5kIHBhcmFtcyB3YXMgY29uc3RydWN0ZWQKKyAqIFxyZXR2YWwgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KK2Jvb2wgY29weVBhcmFtc0Zyb21CbG9iKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBwYXJhbXMsCisgICAgICAgIFBhcmFtcyBibG9iKTsKK2Jvb2wgY29weVBhcmFtc0Zyb21CbG9iKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJUdW5pbmc+PiogcGFyYW1zLAorICAgICAgICBQYXJhbXMgYmxvYik7CisKKy8qKgorICogUGFyc2VzIGEgcGFyYW1zIGJsb2IgYW5kIGFwcGxpZXMgdXBkYXRlcyB0byBwYXJhbXMuCisgKgorICogXHBhcmFtW2luLG91dF0gcGFyYW1zIHBhcmFtcyB0byBiZSB1cGRhdGVkCisgKiBccGFyYW1baW5dIGJsb2IgcGFyYW1ldGVyIGJsb2IgY29udGFpbmluZyB1cGRhdGVzCisgKiBccmV0dmFsIHRydWUgaWYgdGhlIGZ1bGwgYmxvYiB3YXMgcGFyc2VkIGFuZCBwYXJhbXMgd2FzIHVwZGF0ZWQKKyAqIFxyZXR2YWwgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KK2Jvb2wgdXBkYXRlUGFyYW1zRnJvbUJsb2IoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiYgcGFyYW1zLAorICAgICAgICBjb25zdCBQYXJhbXMmIGJsb2IpOworCisvKioKKyAqIENvbnZlcnRzIGEgQnVmZmVyUG9vbCBzdGF0dXMgdmFsdWUgdG8gYzJfc3RhdHVzX3QuCisgKiBccGFyYW0gQnVmZmVyUG9vbCBzdGF0dXMKKyAqIFxyZXR1cm4gQ29ycmVzcG9uZGluZyBjMl9zdGF0dXNfdAorICovCitjMl9zdGF0dXNfdCB0b0MyU3RhdHVzKDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjoKKyAgICAgICAgUmVzdWx0U3RhdHVzIHJzKTsKKworLy8gQnVmZmVyUXVldWUtQmFzZWQgQmxvY2sgT3BlcmF0aW9ucworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBEaXNhc3NvY2lhdGUgdGhlIGdpdmVuIGJsb2NrIHdpdGggaXRzIGRlc2lnbmF0ZWQgYnVmZmVycXVldWUgc28gdGhhdAorLy8gY2FuY2VsQnVmZmVyKCkgd2lsbCBub3QgYmUgY2FsbGVkIHdoZW4gdGhlIGJsb2NrIGlzIGRlc3Ryb3llZC4gSWYgdGhlIGJsb2NrCisvLyBkb2VzIG5vdCBoYXZlIGEgZGVzaWduYXRlZCBidWZmZXJxdWV1ZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UuCisvLyBPdGhlcndpc2UsIGl0IHJldHVybnMgdHJ1ZS4KKy8vCisvLyBOb3RlOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgYXR0YWNoQnVmZmVyKCkgb3IgcXVldWVCdWZmZXIoKSBpcworLy8gY2FsbGVkIG1hbnVhbGx5LgorYm9vbCB5aWVsZEJ1ZmZlclF1ZXVlQmxvY2soY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2spOworCisvLyBDYWxsIHlpZWxkQnVmZmVyUXVldWVCbG9jaygpIG9uIGJsb2NrcyBpbiB0aGUgZ2l2ZW4gd29ya0xpc3QuIHByb2Nlc3NJbnB1dAorLy8gZGV0ZXJtaW5lcyB3aGV0aGVyIGlucHV0IGJsb2NrcyBhcmUgeWllbGRlZC4gcHJvY2Vzc091dHB1dCB3b3JrcyBzaW1pbGFybHkgb24KKy8vIG91dHB1dCBibG9ja3MuIChUaGUgZGVmYXVsdCB2YWx1ZSBvZiBwcm9jZXNzSW5wdXQgaXMgZmFsc2Ugd2hpbGUgdGhlIGRlZmF1bHQKKy8vIHZhbHVlIG9mIHByb2Nlc3NPdXRwdXQgaXMgdHJ1ZS4gVGhpcyBpbXBsaWVzIHRoYXQgaW4gbW9zdCBjYXNlcywgb25seSBvdXRwdXQKKy8vIGJ1ZmZlcnMgY29udGFpbiBidWZmZXJxdWV1ZS1iYXNlZCBibG9ja3MuKQorLy8KKy8vIE5vdGU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBXb3JrQnVuZGxlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseQorLy8gc2VudCBvdmVyIHRoZSBUcmVibGUgYm91bmRhcnkgdG8gYW5vdGhlciBwcm9jZXNzLgordm9pZCB5aWVsZEJ1ZmZlclF1ZXVlQmxvY2tzKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJvY2Vzc0lucHV0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcm9jZXNzT3V0cHV0ID0gdHJ1ZSk7CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19UWVBFU19ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvdHlwZXMuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL3R5cGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmQyZjkyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL3R5cGVzLmNwcApAQCAtMCwwICsxLDE3OTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLXR5cGVzIgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisjaW5jbHVkZSA8dXRpbC9DMlBhcmFtVXRpbHMuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OkJ1ZmZlclN0YXR1c01lc3NhZ2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjoKKyAgICAgICAgQ2xpZW50TWFuYWdlcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6CisgICAgICAgIFRyYW5zYWN0aW9uSWQ7CisKK2NvbnN0IGNoYXIqIGFzU3RyaW5nKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGNoYXIqIGRlZikgeworICAgIHJldHVybiBhc1N0cmluZyhzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdHVzKSwgZGVmKTsKK30KKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRW51bUNsYXNzPgordHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8RW51bUNsYXNzPjo6dHlwZSB1bmRlcmx5aW5nX3ZhbHVlKAorICAgICAgICBFbnVtQ2xhc3MgeCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDx0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFbnVtQ2xhc3M+Ojp0eXBlPih4KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIENvbW1vbiwgdHlwZW5hbWUgRHN0VmVjdG9yLCB0eXBlbmFtZSBTcmNWZWN0b3I+Cit2b2lkIGNvcHlWZWN0b3IoRHN0VmVjdG9yKiBkLCBjb25zdCBTcmNWZWN0b3ImIHMpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDb21tb24pID09IHNpemVvZihkZWNsdHlwZSgoKmQpWzBdKSksCisgICAgICAgICAgICAiRHN0VmVjdG9yJ3MgY29tcG9uZW50IHNpemUgZG9lcyBub3QgbWF0Y2ggQ29tbW9uIik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQ29tbW9uKSA9PSBzaXplb2YoZGVjbHR5cGUoc1swXSkpLAorICAgICAgICAgICAgIlNyY1ZlY3RvcidzIGNvbXBvbmVudCBzaXplIGRvZXMgbm90IG1hdGNoIENvbW1vbiIpOworICAgIGQtPnJlc2l6ZShzLnNpemUoKSk7CisgICAgc3RkOjpjb3B5KAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDb21tb24qPigmc1swXSksCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IENvbW1vbio+KCZzWzBdICsgcy5zaXplKCkpLAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxDb21tb24qPigmKCpkKVswXSkpOworfQorCisvLyBDMlBhcmFtRmllbGQgLT4gUGFyYW1GaWVsZAorYm9vbCBvYmpjcHkoUGFyYW1GaWVsZCAqZCwgY29uc3QgQzJQYXJhbUZpZWxkICZzKSB7CisgICAgZC0+aW5kZXggPSBzdGF0aWNfY2FzdDxQYXJhbUluZGV4PihfQzJQYXJhbUluc3BlY3Rvcjo6R2V0SW5kZXgocykpOworICAgIGQtPmZpZWxkSWQub2Zmc2V0ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRPZmZzZXQocykpOworICAgIGQtPmZpZWxkSWQuc2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihfQzJQYXJhbUluc3BlY3Rvcjo6R2V0U2l6ZShzKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0cnVjdCBDMlBhcmFtRmllbGRCdWlsZGVyIDogcHVibGljIEMyUGFyYW1GaWVsZCB7CisgICAgQzJQYXJhbUZpZWxkQnVpbGRlcigpIDogQzJQYXJhbUZpZWxkKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QzJQYXJhbTo6SW5kZXg+KHN0YXRpY19jYXN0PHVpbnQzMl90PigwKSksIDAsIDApIHsKKyAgICB9CisgICAgLy8gUGFyYW1GaWVsZCAtPiBDMlBhcmFtRmllbGQKKyAgICBDMlBhcmFtRmllbGRCdWlsZGVyKGNvbnN0IFBhcmFtRmllbGQmIHMpIDogQzJQYXJhbUZpZWxkKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QzJQYXJhbTo6SW5kZXg+KHN0YXRpY19jYXN0PHVpbnQzMl90PihzLmluZGV4KSksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocy5maWVsZElkLm9mZnNldCksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocy5maWVsZElkLnNpemUpKSB7CisgICAgfQorfTsKKworLy8gQzJXb3JrT3JkaW5hbFN0cnVjdCAtPiBXb3JrT3JkaW5hbAorYm9vbCBvYmpjcHkoV29ya09yZGluYWwgKmQsIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgJnMpIHsKKyAgICBkLT5mcmFtZUluZGV4ID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHMuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICBkLT50aW1lc3RhbXBVcyA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihzLnRpbWVzdGFtcC5wZWVrdSgpKTsKKyAgICBkLT5jdXN0b21PcmRpbmFsID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHMuY3VzdG9tT3JkaW5hbC5wZWVrdSgpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gV29ya09yZGluYWwgLT4gQzJXb3JrT3JkaW5hbFN0cnVjdAorYm9vbCBvYmpjcHkoQzJXb3JrT3JkaW5hbFN0cnVjdCAqZCwgY29uc3QgV29ya09yZGluYWwgJnMpIHsKKyAgICBkLT5mcmFtZUluZGV4ID0gYzJfY250cjY0X3Qocy5mcmFtZUluZGV4KTsKKyAgICBkLT50aW1lc3RhbXAgPSBjMl9jbnRyNjRfdChzLnRpbWVzdGFtcFVzKTsKKyAgICBkLT5jdXN0b21PcmRpbmFsID0gYzJfY250cjY0X3Qocy5jdXN0b21PcmRpbmFsKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6cmFuZ2UncyB0eXBlIC0+IFZhbHVlUmFuZ2UKK2Jvb2wgb2JqY3B5KAorICAgICAgICBWYWx1ZVJhbmdlKiBkLAorICAgICAgICBjb25zdCBkZWNsdHlwZShDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpyYW5nZSkmIHMpIHsKKyAgICBkLT5taW4gPSBzdGF0aWNfY2FzdDxQcmltaXRpdmVWYWx1ZT4ocy5taW4udTY0KTsKKyAgICBkLT5tYXggPSBzdGF0aWNfY2FzdDxQcmltaXRpdmVWYWx1ZT4ocy5tYXgudTY0KTsKKyAgICBkLT5zdGVwID0gc3RhdGljX2Nhc3Q8UHJpbWl0aXZlVmFsdWU+KHMuc3RlcC51NjQpOworICAgIGQtPm51bSA9IHN0YXRpY19jYXN0PFByaW1pdGl2ZVZhbHVlPihzLm51bS51NjQpOworICAgIGQtPmRlbm9tID0gc3RhdGljX2Nhc3Q8UHJpbWl0aXZlVmFsdWU+KHMuZGVub20udTY0KTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAtPiBGaWVsZFN1cHBvcnRlZFZhbHVlcworYm9vbCBvYmpjcHkoRmllbGRTdXBwb3J0ZWRWYWx1ZXMgKmQsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnMpIHsKKyAgICBzd2l0Y2ggKHMudHlwZSkgeworICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6RU1QVFk6IHsKKyAgICAgICAgICAgIGQtPmVtcHR5KDo6YW5kcm9pZDo6aGlkbDo6c2FmZV91bmlvbjo6VjFfMDo6TW9ub3N0YXRle30pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlJBTkdFOiB7CisgICAgICAgICAgICBWYWx1ZVJhbmdlIHJhbmdle307CisgICAgICAgICAgICBpZiAoIW9iamNweSgmcmFuZ2UsIHMucmFuZ2UpKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpyYW5nZS4iOworICAgICAgICAgICAgICAgIGQtPnJhbmdlKHJhbmdlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkLT5yYW5nZShyYW5nZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6VkFMVUVTOiB7CisgICAgICAgICAgICBoaWRsX3ZlYzxQcmltaXRpdmVWYWx1ZT4gdmFsdWVzOworICAgICAgICAgICAgY29weVZlY3Rvcjx1aW50NjRfdD4oJnZhbHVlcywgcy52YWx1ZXMpOworICAgICAgICAgICAgZC0+dmFsdWVzKHZhbHVlcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6RkxBR1M6IHsKKyAgICAgICAgICAgIGhpZGxfdmVjPFByaW1pdGl2ZVZhbHVlPiBmbGFnczsKKyAgICAgICAgICAgIGNvcHlWZWN0b3I8dWludDY0X3Q+KCZmbGFncywgcy52YWx1ZXMpOworICAgICAgICAgICAgZC0+ZmxhZ3MoZmxhZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBMT0coREVCVUcpIDw8ICJVbnJlY29nbml6ZWQgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6dHlwZV90ICIKKyAgICAgICAgICAgICAgICAgICA8PCAid2l0aCB1bmRlcmx5aW5nIHZhbHVlICIgPDwgdW5kZXJseWluZ192YWx1ZShzLnR5cGUpCisgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBWYWx1ZVJhbmdlIC0+IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnJhbmdlJ3MgdHlwZQorYm9vbCBvYmpjcHkoCisgICAgICAgIGRlY2x0eXBlKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnJhbmdlKSogZCwKKyAgICAgICAgY29uc3QgVmFsdWVSYW5nZSYgcykgeworICAgIGQtPm1pbi51NjQgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocy5taW4pOworICAgIGQtPm1heC51NjQgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocy5tYXgpOworICAgIGQtPnN0ZXAudTY0ID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHMuc3RlcCk7CisgICAgZC0+bnVtLnU2NCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihzLm51bSk7CisgICAgZC0+ZGVub20udTY0ID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHMuZGVub20pOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBGaWVsZFN1cHBvcnRlZFZhbHVlcyAtPiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzCitib29sIG9iamNweShDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICpkLCBjb25zdCBGaWVsZFN1cHBvcnRlZFZhbHVlcyAmcykgeworICAgIHN3aXRjaCAocy5nZXREaXNjcmltaW5hdG9yKCkpIHsKKyAgICBjYXNlIEZpZWxkU3VwcG9ydGVkVmFsdWVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmVtcHR5OiB7CisgICAgICAgICAgICBkLT50eXBlID0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6RU1QVFk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGNhc2UgRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6cmFuZ2U6IHsKKyAgICAgICAgICAgIGQtPnR5cGUgPSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpSQU5HRTsKKyAgICAgICAgICAgIGlmICghb2JqY3B5KCZkLT5yYW5nZSwgcy5yYW5nZSgpKSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnJhbmdlLiI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZC0+dmFsdWVzLnJlc2l6ZSgwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBGaWVsZFN1cHBvcnRlZFZhbHVlczo6aGlkbF9kaXNjcmltaW5hdG9yOjp2YWx1ZXM6IHsKKyAgICAgICAgICAgIGQtPnR5cGUgPSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpWQUxVRVM7CisgICAgICAgICAgICBjb3B5VmVjdG9yPHVpbnQ2NF90PigmZC0+dmFsdWVzLCBzLnZhbHVlcygpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBGaWVsZFN1cHBvcnRlZFZhbHVlczo6aGlkbF9kaXNjcmltaW5hdG9yOjpmbGFnczogeworICAgICAgICAgICAgZC0+dHlwZSA9IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OkZMQUdTOworICAgICAgICAgICAgY29weVZlY3Rvcjx1aW50NjRfdD4oJmQtPnZhbHVlcywgcy5mbGFncygpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJVbnJlY29nbml6ZWQgRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OmdldERpc2NyaW1pbmF0b3IoKSI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworLy8gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5IC0+IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkKK2Jvb2wgb2JqY3B5KAorICAgICAgICBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KiBkLAorICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHMpIHsKKyAgICBpZiAoIW9iamNweSgmZC0+ZmllbGQsIHMuZmllbGQoKSkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OmZpZWxkLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc3dpdGNoIChzLnR5cGUoKSkgeworICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpQT1NTSUJMRToKKyAgICAgICAgZC0+dHlwZSA9IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlR5cGU6OlBPU1NJQkxFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q1VSUkVOVDoKKyAgICAgICAgZC0+dHlwZSA9IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlR5cGU6OkNVUlJFTlQ7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhERUJVRykgPDwgIlVucmVjb2duaXplZCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OnR5cGVfdCAiCisgICAgICAgICAgICAgICAgICAgPDwgIndpdGggdW5kZXJseWluZyB2YWx1ZSAiIDw8IHVuZGVybHlpbmdfdmFsdWUocy50eXBlKCkpCisgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICBkLT50eXBlID0gc3RhdGljX2Nhc3Q8RmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6VHlwZT4ocy50eXBlKCkpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAtPiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkKK2Jvb2wgb2JqY3B5KAorICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkqIGQsCisgICAgICAgIGNvbnN0IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHMpIHsKKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OnR5cGVfdCBkVHlwZTsKKyAgICBzd2l0Y2ggKHMudHlwZSkgeworICAgIGNhc2UgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6VHlwZTo6UE9TU0lCTEU6CisgICAgICAgIGRUeXBlID0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpQT1NTSUJMRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpUeXBlOjpDVVJSRU5UOgorICAgICAgICBkVHlwZSA9IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q1VSUkVOVDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiVW5yZWNvZ25pemVkIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlR5cGUgIgorICAgICAgICAgICAgICAgICAgIDw8ICJ3aXRoIHVuZGVybHlpbmcgdmFsdWUgIiA8PCB1bmRlcmx5aW5nX3ZhbHVlKHMudHlwZSkKKyAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgIGRUeXBlID0gc3RhdGljX2Nhc3Q8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5Ojp0eXBlX3Q+KHMudHlwZSk7CisgICAgfQorICAgICpkID0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KEMyUGFyYW1GaWVsZEJ1aWxkZXIocy5maWVsZCksIGRUeXBlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5IC0+IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQKK2Jvb2wgb2JqY3B5KAorICAgICAgICBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5UmVzdWx0KiBkLAorICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHMpIHsKKyAgICBkLT5zdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KHMuc3RhdHVzKTsKKyAgICByZXR1cm4gb2JqY3B5KCZkLT52YWx1ZXMsIHMudmFsdWVzKTsKK30KKworLy8gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSwgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdCAtPgorLy8gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5Citib29sIG9iamNweSgKKyAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KiBkLAorICAgICAgICBjb25zdCBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5JiBzcSwKKyAgICAgICAgY29uc3QgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdCYgc3IpIHsKKyAgICBpZiAoIW9iamNweShkLCBzcSkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5LiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZC0+c3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHNyLnN0YXR1cyk7CisgICAgaWYgKCFvYmpjcHkoJmQtPnZhbHVlcywgc3IudmFsdWVzKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQ6OnZhbHVlcy4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkNvbXBvbmVudDo6VHJhaXRzIC0+IElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzCitib29sIG9iamNweSgKKyAgICAgICAgSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHMgKmQsCisgICAgICAgIGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHMgJnMpIHsKKyAgICBkLT5uYW1lID0gcy5uYW1lOworCisgICAgc3dpdGNoIChzLmRvbWFpbikgeworICAgIGNhc2UgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTzoKKyAgICAgICAgZC0+ZG9tYWluID0gSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OkRvbWFpbjo6VklERU87CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTzoKKyAgICAgICAgZC0+ZG9tYWluID0gSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OkRvbWFpbjo6QVVESU87CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJDb21wb25lbnQ6OkRPTUFJTl9JTUFHRToKKyAgICAgICAgZC0+ZG9tYWluID0gSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OkRvbWFpbjo6SU1BR0U7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJDb21wb25lbnQ6OkRPTUFJTl9PVEhFUjoKKyAgICAgICAgZC0+ZG9tYWluID0gSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OkRvbWFpbjo6T1RIRVI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhERUJVRykgPDwgIlVucmVjb2duaXplZCBDMkNvbXBvbmVudDo6ZG9tYWluX3QgIgorICAgICAgICAgICAgICAgICAgIDw8ICJ3aXRoIHVuZGVybHlpbmcgdmFsdWUgIiA8PCB1bmRlcmx5aW5nX3ZhbHVlKHMuZG9tYWluKQorICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgZC0+ZG9tYWluID0gc3RhdGljX2Nhc3Q8SUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OkRvbWFpbj4oCisgICAgICAgICAgICAgICAgcy5kb21haW4pOworICAgIH0KKworICAgIHN3aXRjaCAocy5raW5kKSB7CisgICAgY2FzZSBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSOgorICAgICAgICBkLT5raW5kID0gSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OktpbmQ6OkRFQ09ERVI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjoKKyAgICAgICAgZC0+a2luZCA9IElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpLaW5kOjpFTkNPREVSOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyQ29tcG9uZW50OjpLSU5EX09USEVSOgorICAgICAgICBkLT5raW5kID0gSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OktpbmQ6Ok9USEVSOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0coREVCVUcpIDw8ICJVbnJlY29nbml6ZWQgQzJDb21wb25lbnQ6OmtpbmRfdCAiCisgICAgICAgICAgICAgICAgICAgPDwgIndpdGggdW5kZXJseWluZyB2YWx1ZSAiIDw8IHVuZGVybHlpbmdfdmFsdWUocy5raW5kKQorICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgZC0+a2luZCA9IHN0YXRpY19jYXN0PElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpLaW5kPigKKyAgICAgICAgICAgICAgICBzLmtpbmQpOworICAgIH0KKworICAgIGQtPnJhbmsgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocy5yYW5rKTsKKworICAgIGQtPm1lZGlhVHlwZSA9IHMubWVkaWFUeXBlOworCisgICAgZC0+YWxpYXNlcy5yZXNpemUocy5hbGlhc2VzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaXggPSBzLmFsaWFzZXMuc2l6ZSgpOyBpeCA+IDA7ICkgeworICAgICAgICAtLWl4OworICAgICAgICBkLT5hbGlhc2VzW2l4XSA9IHMuYWxpYXNlc1tpeF07CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBDb21wb25lbnRUcmFpdHMgLT4gQzJDb21wb25lbnQ6OlRyYWl0cywgc3RkOjp1bmlxdWVfcHRyPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4KK2Jvb2wgb2JqY3B5KAorICAgICAgICBDMkNvbXBvbmVudDo6VHJhaXRzKiBkLAorICAgICAgICBjb25zdCBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0cyYgcykgeworICAgIGQtPm5hbWUgPSBzLm5hbWUuY19zdHIoKTsKKworICAgIHN3aXRjaCAocy5kb21haW4pIHsKKyAgICBjYXNlIElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpEb21haW46OlZJREVPOgorICAgICAgICBkLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpEb21haW46OkFVRElPOgorICAgICAgICBkLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpEb21haW46OklNQUdFOgorICAgICAgICBkLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX0lNQUdFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpEb21haW46Ok9USEVSOgorICAgICAgICBkLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX09USEVSOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0coREVCVUcpIDw8ICJVbnJlY29nbml6ZWQgQ29tcG9uZW50VHJhaXRzOjpEb21haW4gIgorICAgICAgICAgICAgICAgICAgIDw8ICJ3aXRoIHVuZGVybHlpbmcgdmFsdWUgIiA8PCB1bmRlcmx5aW5nX3ZhbHVlKHMuZG9tYWluKQorICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgZC0+ZG9tYWluID0gc3RhdGljX2Nhc3Q8QzJDb21wb25lbnQ6OmRvbWFpbl90PihzLmRvbWFpbik7CisgICAgfQorCisgICAgc3dpdGNoIChzLmtpbmQpIHsKKyAgICBjYXNlIElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpLaW5kOjpERUNPREVSOgorICAgICAgICBkLT5raW5kID0gQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0czo6S2luZDo6RU5DT0RFUjoKKyAgICAgICAgZC0+a2luZCA9IEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OktpbmQ6Ok9USEVSOgorICAgICAgICBkLT5raW5kID0gQzJDb21wb25lbnQ6OktJTkRfT1RIRVI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhERUJVRykgPDwgIlVucmVjb2duaXplZCBDb21wb25lbnRUcmFpdHM6OktpbmQgIgorICAgICAgICAgICAgICAgICAgIDw8ICJ3aXRoIHVuZGVybHlpbmcgdmFsdWUgIiA8PCB1bmRlcmx5aW5nX3ZhbHVlKHMua2luZCkKKyAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgIGQtPmtpbmQgPSBzdGF0aWNfY2FzdDxDMkNvbXBvbmVudDo6a2luZF90PihzLmtpbmQpOworICAgIH0KKworICAgIGQtPnJhbmsgPSBzdGF0aWNfY2FzdDxDMkNvbXBvbmVudDo6cmFua190PihzLnJhbmspOworICAgIGQtPm1lZGlhVHlwZSA9IHMubWVkaWFUeXBlLmNfc3RyKCk7CisgICAgZC0+YWxpYXNlcy5yZXNpemUocy5hbGlhc2VzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzLmFsaWFzZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgZC0+YWxpYXNlc1tpXSA9IHMuYWxpYXNlc1tpXTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworLy8gQzJQYXJhbUZpZWxkVmFsdWVzIC0+IFBhcmFtRmllbGRWYWx1ZXMKK2Jvb2wgb2JqY3B5KFBhcmFtRmllbGRWYWx1ZXMgKmQsIGNvbnN0IEMyUGFyYW1GaWVsZFZhbHVlcyAmcykgeworICAgIGlmICghb2JqY3B5KCZkLT5wYXJhbU9yRmllbGQsIHMucGFyYW1PckZpZWxkKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyUGFyYW1GaWVsZFZhbHVlczo6cGFyYW1PckZpZWxkLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHMudmFsdWVzKSB7CisgICAgICAgIGQtPnZhbHVlcy5yZXNpemUoMSk7CisgICAgICAgIGlmICghb2JqY3B5KCZkLT52YWx1ZXNbMF0sICpzLnZhbHVlcykpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJQYXJhbUZpZWxkVmFsdWVzOjp2YWx1ZXMuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZC0+dmFsdWVzLnJlc2l6ZSgwKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gUGFyYW1GaWVsZFZhbHVlcyAtPiBDMlBhcmFtRmllbGRWYWx1ZXMKK2Jvb2wgb2JqY3B5KEMyUGFyYW1GaWVsZFZhbHVlcyAqZCwgY29uc3QgUGFyYW1GaWVsZFZhbHVlcyAmcykgeworICAgIGQtPnBhcmFtT3JGaWVsZCA9IEMyUGFyYW1GaWVsZEJ1aWxkZXIocy5wYXJhbU9yRmllbGQpOworICAgIGlmIChzLnZhbHVlcy5zaXplKCkgPT0gMSkgeworICAgICAgICBkLT52YWx1ZXMgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+KCk7CisgICAgICAgIGlmICghb2JqY3B5KGQtPnZhbHVlcy5nZXQoKSwgcy52YWx1ZXNbMF0pKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFBhcmFtRmllbGRWYWx1ZXM6OnZhbHVlcy4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAocy52YWx1ZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgZC0+dmFsdWVzLnJlc2V0KCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFBhcmFtRmllbGRWYWx1ZXM6ICIKKyAgICAgICAgICAgICAgICAgICJUd28gb3IgbW9yZSBGaWVsZFN1cHBvcnRlZFZhbHVlcyBvYmplY3RzIGV4aXN0IGluICIKKyAgICAgICAgICAgICAgICAgICJQYXJhbUZpZWxkVmFsdWVzLiAiCisgICAgICAgICAgICAgICAgICAiT25seSB6ZXJvIG9yIG9uZSBpcyBhbGxvd2VkLiI7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKKy8vIEMyU2V0dGluZ1Jlc3VsdCAtPiBTZXR0aW5nUmVzdWx0Citib29sIG9iamNweShTZXR0aW5nUmVzdWx0ICpkLCBjb25zdCBDMlNldHRpbmdSZXN1bHQgJnMpIHsKKyAgICBzd2l0Y2ggKHMuZmFpbHVyZSkgeworICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpCQURfVFlQRToKKyAgICAgICAgZC0+ZmFpbHVyZSA9IFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkJBRF9UWVBFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyU2V0dGluZ1Jlc3VsdDo6QkFEX1BPUlQ6CisgICAgICAgIGQtPmZhaWx1cmUgPSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpCQURfUE9SVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMlNldHRpbmdSZXN1bHQ6OkJBRF9JTkRFWDoKKyAgICAgICAgZC0+ZmFpbHVyZSA9IFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkJBRF9JTkRFWDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMlNldHRpbmdSZXN1bHQ6OlJFQURfT05MWToKKyAgICAgICAgZC0+ZmFpbHVyZSA9IFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OlJFQURfT05MWTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMlNldHRpbmdSZXN1bHQ6Ok1JU01BVENIOgorICAgICAgICBkLT5mYWlsdXJlID0gU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6TUlTTUFUQ0g7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpCQURfVkFMVUU6CisgICAgICAgIGQtPmZhaWx1cmUgPSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpCQURfVkFMVUU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpDT05GTElDVDoKKyAgICAgICAgZC0+ZmFpbHVyZSA9IFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkNPTkZMSUNUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyU2V0dGluZ1Jlc3VsdDo6VU5TVVBQT1JURUQ6CisgICAgICAgIGQtPmZhaWx1cmUgPSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpVTlNVUFBPUlRFRDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMlNldHRpbmdSZXN1bHQ6OklORk9fQkFEX1ZBTFVFOgorICAgICAgICBkLT5mYWlsdXJlID0gU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6SU5GT19CQURfVkFMVUU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpJTkZPX0NPTkZMSUNUOgorICAgICAgICBkLT5mYWlsdXJlID0gU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6SU5GT19DT05GTElDVDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiVW5yZWNvZ25pemVkIEMyU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZSAiCisgICAgICAgICAgICAgICAgICAgPDwgIndpdGggdW5kZXJseWluZyB2YWx1ZSAiIDw8IHVuZGVybHlpbmdfdmFsdWUocy5mYWlsdXJlKQorICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgZC0+ZmFpbHVyZSA9IHN0YXRpY19jYXN0PFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU+KHMuZmFpbHVyZSk7CisgICAgfQorICAgIGlmICghb2JqY3B5KCZkLT5maWVsZCwgcy5maWVsZCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMlNldHRpbmdSZXN1bHQ6OmZpZWxkLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZC0+Y29uZmxpY3RzLnJlc2l6ZShzLmNvbmZsaWN0cy5zaXplKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGNvbnN0IEMyUGFyYW1GaWVsZFZhbHVlcyYgc0NvbmZsaWN0IDogcy5jb25mbGljdHMpIHsKKyAgICAgICAgUGFyYW1GaWVsZFZhbHVlcyAmZENvbmZsaWN0ID0gZC0+Y29uZmxpY3RzW2krK107CisgICAgICAgIGlmICghb2JqY3B5KCZkQ29uZmxpY3QsIHNDb25mbGljdCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJTZXR0aW5nUmVzdWx0Ojpjb25mbGljdHNbIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBpIC0gMSA8PCAiXS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBTZXR0aW5nUmVzdWx0IC0+IHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+Citib29sIG9iamNweShzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiAqZCwgY29uc3QgU2V0dGluZ1Jlc3VsdCAmcykgeworICAgICpkID0gc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4obmV3IEMyU2V0dGluZ1Jlc3VsdCB7CisgICAgICAgICAgICAuZmllbGQgPSBDMlBhcmFtRmllbGRWYWx1ZXMoQzJQYXJhbUZpZWxkQnVpbGRlcigpKSB9KTsKKyAgICBpZiAoISpkKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk5vIG1lbW9yeSBmb3IgQzJTZXR0aW5nUmVzdWx0LiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBmYWlsdXJlCisgICAgc3dpdGNoIChzLmZhaWx1cmUpIHsKKyAgICBjYXNlIFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkJBRF9UWVBFOgorICAgICAgICAoKmQpLT5mYWlsdXJlID0gQzJTZXR0aW5nUmVzdWx0OjpCQURfVFlQRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpCQURfUE9SVDoKKyAgICAgICAgKCpkKS0+ZmFpbHVyZSA9IEMyU2V0dGluZ1Jlc3VsdDo6QkFEX1BPUlQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6QkFEX0lOREVYOgorICAgICAgICAoKmQpLT5mYWlsdXJlID0gQzJTZXR0aW5nUmVzdWx0OjpCQURfSU5ERVg7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6UkVBRF9PTkxZOgorICAgICAgICAoKmQpLT5mYWlsdXJlID0gQzJTZXR0aW5nUmVzdWx0OjpSRUFEX09OTFk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6TUlTTUFUQ0g6CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBDMlNldHRpbmdSZXN1bHQ6Ok1JU01BVENIOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkJBRF9WQUxVRToKKyAgICAgICAgKCpkKS0+ZmFpbHVyZSA9IEMyU2V0dGluZ1Jlc3VsdDo6QkFEX1ZBTFVFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkNPTkZMSUNUOgorICAgICAgICAoKmQpLT5mYWlsdXJlID0gQzJTZXR0aW5nUmVzdWx0OjpDT05GTElDVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpVTlNVUFBPUlRFRDoKKyAgICAgICAgKCpkKS0+ZmFpbHVyZSA9IEMyU2V0dGluZ1Jlc3VsdDo6VU5TVVBQT1JURUQ7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6SU5GT19CQURfVkFMVUU6CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBDMlNldHRpbmdSZXN1bHQ6OklORk9fQkFEX1ZBTFVFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OklORk9fQ09ORkxJQ1Q6CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBDMlNldHRpbmdSZXN1bHQ6OklORk9fQ09ORkxJQ1Q7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhERUJVRykgPDwgIlVucmVjb2duaXplZCBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlICIKKyAgICAgICAgICAgICAgICAgICA8PCAid2l0aCB1bmRlcmx5aW5nIHZhbHVlICIgPDwgdW5kZXJseWluZ192YWx1ZShzLmZhaWx1cmUpCisgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICAoKmQpLT5mYWlsdXJlID0gc3RhdGljX2Nhc3Q8QzJTZXR0aW5nUmVzdWx0OjpGYWlsdXJlPihzLmZhaWx1cmUpOworICAgIH0KKworICAgIC8vIGZpZWxkCisgICAgaWYgKCFvYmpjcHkoJigqZCktPmZpZWxkLCBzLmZpZWxkKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFNldHRpbmdSZXN1bHQ6OmZpZWxkLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBjb25mbGljdHMKKyAgICAoKmQpLT5jb25mbGljdHMuY2xlYXIoKTsKKyAgICAoKmQpLT5jb25mbGljdHMucmVzZXJ2ZShzLmNvbmZsaWN0cy5zaXplKCkpOworICAgIGZvciAoY29uc3QgUGFyYW1GaWVsZFZhbHVlcyYgc0NvbmZsaWN0IDogcy5jb25mbGljdHMpIHsKKyAgICAgICAgKCpkKS0+Y29uZmxpY3RzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgICAgICBDMlBhcmFtRmllbGRWYWx1ZXN7IEMyUGFyYW1GaWVsZEJ1aWxkZXIoKSwgbnVsbHB0ciB9KTsKKyAgICAgICAgaWYgKCFvYmpjcHkoJigqZCktPmNvbmZsaWN0cy5iYWNrKCksIHNDb25mbGljdCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgU2V0dGluZ1Jlc3VsdDo6Y29uZmxpY3RzLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEMyUGFyYW1EZXNjcmlwdG9yIC0+IFBhcmFtRGVzY3JpcHRvcgorYm9vbCBvYmpjcHkoUGFyYW1EZXNjcmlwdG9yICpkLCBjb25zdCBDMlBhcmFtRGVzY3JpcHRvciAmcykgeworICAgIGQtPmluZGV4ID0gc3RhdGljX2Nhc3Q8UGFyYW1JbmRleD4ocy5pbmRleCgpKTsKKyAgICBkLT5hdHRyaWIgPSBzdGF0aWNfY2FzdDxoaWRsX2JpdGZpZWxkPFBhcmFtRGVzY3JpcHRvcjo6QXR0cmliPj4oCisgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0QXR0cmliKHMpKTsKKyAgICBkLT5uYW1lID0gcy5uYW1lKCk7CisgICAgY29weVZlY3Rvcjx1aW50MzJfdD4oJmQtPmRlcGVuZGVuY2llcywgcy5kZXBlbmRlbmNpZXMoKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFBhcmFtRGVzY3JpcHRvciAtPiBDMlBhcmFtRGVzY3JpcHRvcgorYm9vbCBvYmpjcHkoc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiAqZCwgY29uc3QgUGFyYW1EZXNjcmlwdG9yICZzKSB7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGREZXBlbmRlbmNpZXM7CisgICAgZERlcGVuZGVuY2llcy5yZXNlcnZlKHMuZGVwZW5kZW5jaWVzLnNpemUoKSk7CisgICAgZm9yIChjb25zdCBQYXJhbUluZGV4JiBzRGVwZW5kZW5jeSA6IHMuZGVwZW5kZW5jaWVzKSB7CisgICAgICAgIGREZXBlbmRlbmNpZXMuZW1wbGFjZV9iYWNrKHN0YXRpY19jYXN0PHVpbnQzMl90PihzRGVwZW5kZW5jeSkpOworICAgIH0KKyAgICAqZCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJQYXJhbURlc2NyaXB0b3I+KAorICAgICAgICAgICAgQzJQYXJhbTo6SW5kZXgoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHMuaW5kZXgpKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEMyUGFyYW1EZXNjcmlwdG9yOjphdHRyaWJfdD4ocy5hdHRyaWIpLAorICAgICAgICAgICAgQzJTdHJpbmcocy5uYW1lLmNfc3RyKCkpLAorICAgICAgICAgICAgc3RkOjptb3ZlKGREZXBlbmRlbmNpZXMpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJTdHJ1Y3REZXNjcmlwdG9yIC0+IFN0cnVjdERlc2NyaXB0b3IKK2Jvb2wgb2JqY3B5KFN0cnVjdERlc2NyaXB0b3IgKmQsIGNvbnN0IEMyU3RydWN0RGVzY3JpcHRvciAmcykgeworICAgIGQtPnR5cGUgPSBzdGF0aWNfY2FzdDxQYXJhbUluZGV4PihzLmNvcmVJbmRleCgpLmNvcmVJbmRleCgpKTsKKyAgICBkLT5maWVsZHMucmVzaXplKHMubnVtRmllbGRzKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHNGaWVsZCA6IHMpIHsKKyAgICAgICAgRmllbGREZXNjcmlwdG9yJiBkRmllbGQgPSBkLT5maWVsZHNbaSsrXTsKKyAgICAgICAgZEZpZWxkLmZpZWxkSWQub2Zmc2V0ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KAorICAgICAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRPZmZzZXQoc0ZpZWxkKSk7CisgICAgICAgIGRGaWVsZC5maWVsZElkLnNpemUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oCisgICAgICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldFNpemUoc0ZpZWxkKSk7CisgICAgICAgIGRGaWVsZC50eXBlID0gc3RhdGljX2Nhc3Q8aGlkbF9iaXRmaWVsZDxGaWVsZERlc2NyaXB0b3I6OlR5cGU+PigKKyAgICAgICAgICAgICAgICBzRmllbGQudHlwZSgpKTsKKyAgICAgICAgZEZpZWxkLmV4dGVudCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzRmllbGQuZXh0ZW50KCkpOworICAgICAgICBkRmllbGQubmFtZSA9IHN0YXRpY19jYXN0PGhpZGxfc3RyaW5nPihzRmllbGQubmFtZSgpKTsKKyAgICAgICAgY29uc3QgYXV0byYgc05hbWVkVmFsdWVzID0gc0ZpZWxkLm5hbWVkVmFsdWVzKCk7CisgICAgICAgIGRGaWVsZC5uYW1lZFZhbHVlcy5yZXNpemUoc05hbWVkVmFsdWVzLnNpemUoKSk7CisgICAgICAgIHNpemVfdCBqID0gMDsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzTmFtZWRWYWx1ZSA6IHNOYW1lZFZhbHVlcykgeworICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlJiBkTmFtZWRWYWx1ZSA9IGRGaWVsZC5uYW1lZFZhbHVlc1tqKytdOworICAgICAgICAgICAgZE5hbWVkVmFsdWUubmFtZSA9IHN0YXRpY19jYXN0PGhpZGxfc3RyaW5nPihzTmFtZWRWYWx1ZS5maXJzdCk7CisgICAgICAgICAgICBkTmFtZWRWYWx1ZS52YWx1ZSA9IHN0YXRpY19jYXN0PFByaW1pdGl2ZVZhbHVlPigKKyAgICAgICAgICAgICAgICAgICAgc05hbWVkVmFsdWUuc2Vjb25kLnU2NCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFN0cnVjdERlc2NyaXB0b3IgLT4gQzJTdHJ1Y3REZXNjcmlwdG9yCitib29sIG9iamNweShzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiAqZCwgY29uc3QgU3RydWN0RGVzY3JpcHRvciAmcykgeworICAgIEMyUGFyYW06OkNvcmVJbmRleCBkSW5kZXggPSBDMlBhcmFtOjpDb3JlSW5kZXgoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHMudHlwZSkpOworICAgIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBkRmllbGRzOworICAgIGRGaWVsZHMucmVzZXJ2ZShzLmZpZWxkcy5zaXplKCkpOworICAgIGZvciAoY29uc3QgYXV0byAmc0ZpZWxkIDogcy5maWVsZHMpIHsKKyAgICAgICAgQzJGaWVsZERlc2NyaXB0b3IgZEZpZWxkID0geworICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNGaWVsZC50eXBlKSwKKyAgICAgICAgICAgIHNGaWVsZC5leHRlbnQsCisgICAgICAgICAgICBzRmllbGQubmFtZSwKKyAgICAgICAgICAgIHNGaWVsZC5maWVsZElkLm9mZnNldCwKKyAgICAgICAgICAgIHNGaWVsZC5maWVsZElkLnNpemUgfTsKKyAgICAgICAgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBuYW1lZFZhbHVlczsKKyAgICAgICAgbmFtZWRWYWx1ZXMucmVzZXJ2ZShzRmllbGQubmFtZWRWYWx1ZXMuc2l6ZSgpKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzTmFtZWRWYWx1ZSA6IHNGaWVsZC5uYW1lZFZhbHVlcykgeworICAgICAgICAgICAgbmFtZWRWYWx1ZXMuZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgICAgIHNOYW1lZFZhbHVlLm5hbWUsCisgICAgICAgICAgICAgICAgQzJWYWx1ZTo6UHJpbWl0aXZlKHN0YXRpY19jYXN0PHVpbnQ2NF90PihzTmFtZWRWYWx1ZS52YWx1ZSkpKTsKKyAgICAgICAgfQorICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6QWRkTmFtZWRWYWx1ZXMoZEZpZWxkLCBzdGQ6Om1vdmUobmFtZWRWYWx1ZXMpKTsKKyAgICAgICAgZEZpZWxkcy5lbXBsYWNlX2JhY2soZEZpZWxkKTsKKyAgICB9CisgICAgKmQgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyU3RydWN0RGVzY3JpcHRvcj4oCisgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6Q3JlYXRlU3RydWN0RGVzY3JpcHRvcihkSW5kZXgsIHN0ZDo6bW92ZShkRmllbGRzKSkpOworICAgIHJldHVybiB0cnVlOworfQorCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKKy8vIEZpbmQgb3IgYWRkIGEgaGlkbCBCYXNlQmxvY2sgb2JqZWN0IGZyb20gYSBnaXZlbiBDMkhhbmRsZSogdG8gYSBsaXN0IGFuZCBhbgorLy8gYXNzb2NpYXRlZCBtYXAuCisvLyBOb3RlOiBUaGUgaGFuZGxlIGlzIG5vdCBjbG9uZWQuCitib29sIF9hZGRCYXNlQmxvY2soCisgICAgICAgIHVpbnQzMl90KiBpbmRleCwKKyAgICAgICAgY29uc3QgQzJIYW5kbGUqIGhhbmRsZSwKKyAgICAgICAgc3RkOjpsaXN0PEJhc2VCbG9jaz4qIGJhc2VCbG9ja3MsCisgICAgICAgIHN0ZDo6bWFwPGNvbnN0IHZvaWQqLCB1aW50MzJfdD4qIGJhc2VCbG9ja0luZGljZXMpIHsKKyAgICBpZiAoIWhhbmRsZSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJhZGRCYXNlQmxvY2sgY2FsbGVkIG9uIGEgbnVsbCBDMkhhbmRsZS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGF1dG8gaXQgPSBiYXNlQmxvY2tJbmRpY2VzLT5maW5kKGhhbmRsZSk7CisgICAgaWYgKGl0ICE9IGJhc2VCbG9ja0luZGljZXMtPmVuZCgpKSB7CisgICAgICAgICppbmRleCA9IGl0LT5zZWNvbmQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmluZGV4ID0gYmFzZUJsb2Nrcy0+c2l6ZSgpOworICAgICAgICBiYXNlQmxvY2tJbmRpY2VzLT5lbXBsYWNlKGhhbmRsZSwgKmluZGV4KTsKKyAgICAgICAgYmFzZUJsb2Nrcy0+ZW1wbGFjZV9iYWNrKCk7CisKKyAgICAgICAgQmFzZUJsb2NrICZkQmFzZUJsb2NrID0gYmFzZUJsb2Nrcy0+YmFjaygpOworICAgICAgICAvLyBUaGlzIGRvZXMgbm90IGNsb25lIHRoZSBoYW5kbGUuCisgICAgICAgIGRCYXNlQmxvY2submF0aXZlQmxvY2soCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBuYXRpdmVfaGFuZGxlX3QqPihoYW5kbGUpKTsKKworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRmluZCBvciBhZGQgYSBoaWRsIEJhc2VCbG9jayBvYmplY3QgZnJvbSBhIGdpdmVuIEJ1ZmZlclBvb2xEYXRhIHRvIGEgbGlzdCBhbmQKKy8vIGFuIGFzc29jaWF0ZWQgbWFwLgorYm9vbCBfYWRkQmFzZUJsb2NrKAorICAgICAgICB1aW50MzJfdCogaW5kZXgsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gYnBEYXRhLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyLAorICAgICAgICBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiogYmFzZUJsb2NrcywKKyAgICAgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiogYmFzZUJsb2NrSW5kaWNlcykgeworICAgIGlmICghYnBEYXRhKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImFkZEJhc2VCbG9jayBjYWxsZWQgb24gYSBudWxsIEJ1ZmZlclBvb2xEYXRhLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYXV0byBpdCA9IGJhc2VCbG9ja0luZGljZXMtPmZpbmQoYnBEYXRhLmdldCgpKTsKKyAgICBpZiAoaXQgIT0gYmFzZUJsb2NrSW5kaWNlcy0+ZW5kKCkpIHsKKyAgICAgICAgKmluZGV4ID0gaXQtPnNlY29uZDsKKyAgICB9IGVsc2UgeworICAgICAgICAqaW5kZXggPSBiYXNlQmxvY2tzLT5zaXplKCk7CisgICAgICAgIGJhc2VCbG9ja0luZGljZXMtPmVtcGxhY2UoYnBEYXRhLmdldCgpLCAqaW5kZXgpOworICAgICAgICBiYXNlQmxvY2tzLT5lbXBsYWNlX2JhY2soKTsKKworICAgICAgICBCYXNlQmxvY2sgJmRCYXNlQmxvY2sgPSBiYXNlQmxvY2tzLT5iYWNrKCk7CisKKyAgICAgICAgaWYgKGJ1ZmZlclBvb2xTZW5kZXIpIHsKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UgcG9vbGVkQmxvY2s7CisgICAgICAgICAgICBSZXN1bHRTdGF0dXMgYnBTdGF0dXMgPSBidWZmZXJQb29sU2VuZGVyLT5zZW5kKAorICAgICAgICAgICAgICAgICAgICBicERhdGEsCisgICAgICAgICAgICAgICAgICAgICZwb29sZWRCbG9jayk7CisKKyAgICAgICAgICAgIGlmIChicFN0YXR1cyAhPSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHNlbmQgYnVmZmVyIHdpdGggQnVmZmVyUG9vbC4gRXJyb3I6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludDMyX3Q+KGJwU3RhdHVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRCYXNlQmxvY2sucG9vbGVkQmxvY2socG9vbGVkQmxvY2spOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIGFkZEJhc2VCbG9jaygKKyAgICAgICAgdWludDMyX3QqIGluZGV4LAorICAgICAgICBjb25zdCBDMkhhbmRsZSogaGFuZGxlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgX0MyQmxvY2tQb29sRGF0YT4mIGJsb2NrUG9vbERhdGEsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgaWYgKCFibG9ja1Bvb2xEYXRhKSB7CisgICAgICAgIC8vIE5vIEJ1ZmZlclBvb2xEYXRhID09PiBOQVRJVkUgYmxvY2suCisgICAgICAgIHJldHVybiBfYWRkQmFzZUJsb2NrKAorICAgICAgICAgICAgICAgIGluZGV4LCBoYW5kbGUsCisgICAgICAgICAgICAgICAgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcyk7CisgICAgfQorICAgIHN3aXRjaCAoYmxvY2tQb29sRGF0YS0+Z2V0VHlwZSgpKSB7CisgICAgY2FzZSBfQzJCbG9ja1Bvb2xEYXRhOjpUWVBFX0JVRkZFUlBPT0w6IHsKKyAgICAgICAgICAgIC8vIEJ1ZmZlclBvb2xEYXRhCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJwRGF0YTsKKyAgICAgICAgICAgIGlmICghX0MyQmxvY2tGYWN0b3J5OjpHZXRCdWZmZXJQb29sRGF0YShibG9ja1Bvb2xEYXRhLCAmYnBEYXRhKQorICAgICAgICAgICAgICAgICAgICB8fCAhYnBEYXRhKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQnVmZmVyUG9vbERhdGEgdW5hdmFpbGFibGUgaW4gYSBibG9jay4iOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBfYWRkQmFzZUJsb2NrKAorICAgICAgICAgICAgICAgICAgICBpbmRleCwgYnBEYXRhLAorICAgICAgICAgICAgICAgICAgICBidWZmZXJQb29sU2VuZGVyLCBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKTsKKyAgICAgICAgfQorICAgIGNhc2UgX0MyQmxvY2tQb29sRGF0YTo6VFlQRV9CVUZGRVJRVUVVRToKKyAgICAgICAgLy8gRG8gdGhlIHNhbWUgdGhpbmcgYXMgYSBOQVRJVkUgYmxvY2suCisgICAgICAgIHJldHVybiBfYWRkQmFzZUJsb2NrKAorICAgICAgICAgICAgICAgIGluZGV4LCBoYW5kbGUsCisgICAgICAgICAgICAgICAgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcyk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5rbm93biBDMkJsb2NrUG9vbERhdGEgdHlwZS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCisvLyBDMkZlbmNlIC0+IGhpZGxfaGFuZGxlCisvLyBOb3RlOiBGaWxlIGRlc2NyaXB0b3JzIGFyZSBub3QgZHVwbGljYXRlZC4gVGhlIG9yaWdpbmFsIGZpbGUgZGVzY3JpcHRvciBtdXN0CisvLyBub3QgYmUgY2xvc2VkIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUuCitib29sIG9iamNweShoaWRsX2hhbmRsZSogZCwgY29uc3QgQzJGZW5jZSYgcykgeworICAgICh2b2lkKXM7IC8vIFRPRE86IGltcGxlbWVudCBzLmZkKCkKKyAgICBpbnQgZmVuY2VGZCA9IC0xOworICAgIGQtPnNldFRvKG51bGxwdHIpOworICAgIGlmIChmZW5jZUZkID49IDApIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICAgICAgaWYgKCFoYW5kbGUpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBjcmVhdGUgYSBuYXRpdmUgaGFuZGxlLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaGFuZGxlLT5kYXRhWzBdID0gZmVuY2VGZDsKKyAgICAgICAgZC0+c2V0VG8oaGFuZGxlLCB0cnVlIC8qIG93bnMgKi8pOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJDb25zdExpbmVhckJsb2NrIC0+IEJsb2NrCisvLyBOb3RlOiBOYXRpdmUgaGFuZGxlcyBhcmUgbm90IGR1cGxpY2F0ZWQuIFRoZSBvcmlnaW5hbCBoYW5kbGVzIG11c3Qgbm90IGJlCisvLyBjbG9zZWQgYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21wbGV0ZS4KK2Jvb2wgb2JqY3B5KEJsb2NrKiBkLCBjb25zdCBDMkNvbnN0TGluZWFyQmxvY2smIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IF9DMkJsb2NrUG9vbERhdGE+IGJwRGF0YSA9CisgICAgICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkdldExpbmVhckJsb2NrUG9vbERhdGEocyk7CisgICAgaWYgKCFhZGRCYXNlQmxvY2soJmQtPmluZGV4LCBzLmhhbmRsZSgpLCBicERhdGEsCisgICAgICAgICAgICBidWZmZXJQb29sU2VuZGVyLCBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIGJsb2NrIGRhdGEgaW4gQzJDb25zdExpbmVhckJsb2NrLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgdGhlIG1ldGFkYXRhLgorICAgIEMySGlkbF9SYW5nZUluZm8gZFJhbmdlSW5mbzsKKyAgICBkUmFuZ2VJbmZvLm9mZnNldCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzLm9mZnNldCgpKTsKKyAgICBkUmFuZ2VJbmZvLmxlbmd0aCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzLnNpemUoKSk7CisgICAgaWYgKCFjcmVhdGVQYXJhbXNCbG9iKCZkLT5tZXRhLCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj57ICZkUmFuZ2VJbmZvIH0pKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgcmFuZ2UgaW5mbyBpbiBDMkNvbnN0TGluZWFyQmxvY2suIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIENvcHkgdGhlIGZlbmNlCisgICAgaWYgKCFvYmpjcHkoJmQtPmZlbmNlLCBzLmZlbmNlKCkpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJDb25zdExpbmVhckJsb2NrOjpmZW5jZS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkNvbnN0R3JhcGhpY0Jsb2NrIC0+IEJsb2NrCisvLyBOb3RlOiBOYXRpdmUgaGFuZGxlcyBhcmUgbm90IGR1cGxpY2F0ZWQuIFRoZSBvcmlnaW5hbCBoYW5kbGVzIG11c3Qgbm90IGJlCisvLyBjbG9zZWQgYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21wbGV0ZS4KK2Jvb2wgb2JqY3B5KEJsb2NrKiBkLCBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBzLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyLAorICAgICAgICBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiogYmFzZUJsb2NrcywKKyAgICAgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiogYmFzZUJsb2NrSW5kaWNlcykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBfQzJCbG9ja1Bvb2xEYXRhPiBicERhdGEgPQorICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpHZXRHcmFwaGljQmxvY2tQb29sRGF0YShzKTsKKyAgICBpZiAoIWFkZEJhc2VCbG9jaygmZC0+aW5kZXgsIHMuaGFuZGxlKCksIGJwRGF0YSwKKyAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsIGJhc2VCbG9ja3MsIGJhc2VCbG9ja0luZGljZXMpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgYmxvY2sgZGF0YSBpbiBDMkNvbnN0R3JhcGhpY0Jsb2NrLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgdGhlIG1ldGFkYXRhLgorICAgIEMySGlkbF9SZWN0SW5mbyBkUmVjdEluZm87CisgICAgQzJSZWN0IHNSZWN0ID0gcy5jcm9wKCk7CisgICAgZFJlY3RJbmZvLmxlZnQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc1JlY3QubGVmdCk7CisgICAgZFJlY3RJbmZvLnRvcCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzUmVjdC50b3ApOworICAgIGRSZWN0SW5mby53aWR0aCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzUmVjdC53aWR0aCk7CisgICAgZFJlY3RJbmZvLmhlaWdodCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzUmVjdC5oZWlnaHQpOworICAgIGlmICghY3JlYXRlUGFyYW1zQmxvYigmZC0+bWV0YSwgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+eyAmZFJlY3RJbmZvIH0pKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgcmVjdCBpbmZvIGluIEMyQ29uc3RHcmFwaGljQmxvY2suIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIENvcHkgdGhlIGZlbmNlCisgICAgaWYgKCFvYmpjcHkoJmQtPmZlbmNlLCBzLmZlbmNlKCkpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJDb25zdEdyYXBoaWNCbG9jazo6ZmVuY2UuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJCdWZmZXJEYXRhIC0+IEJ1ZmZlcgorLy8gVGhpcyBmdW5jdGlvbiBvbmx5IGZpbGxzIGluIGQtPmJsb2Nrcy4KK2Jvb2wgb2JqY3B5KEJ1ZmZlciogZCwgY29uc3QgQzJCdWZmZXJEYXRhJiBzLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyLAorICAgICAgICBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiogYmFzZUJsb2NrcywKKyAgICAgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiogYmFzZUJsb2NrSW5kaWNlcykgeworICAgIGQtPmJsb2Nrcy5yZXNpemUoCisgICAgICAgICAgICBzLmxpbmVhckJsb2NrcygpLnNpemUoKSArCisgICAgICAgICAgICBzLmdyYXBoaWNCbG9ja3MoKS5zaXplKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGNvbnN0IEMyQ29uc3RMaW5lYXJCbG9jayYgbGluZWFyQmxvY2sgOiBzLmxpbmVhckJsb2NrcygpKSB7CisgICAgICAgIEJsb2NrJiBkQmxvY2sgPSBkLT5ibG9ja3NbaSsrXTsKKyAgICAgICAgaWYgKCFvYmpjcHkoCisgICAgICAgICAgICAgICAgJmRCbG9jaywgbGluZWFyQmxvY2ssCisgICAgICAgICAgICAgICAgYnVmZmVyUG9vbFNlbmRlciwgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcykpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJCdWZmZXJEYXRhOjpsaW5lYXJCbG9ja3MuICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIihEZXN0aW5hdGlvbiBpbmRleCA9ICIgPDwgaSAtIDEgPDwgIi4pIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGdyYXBoaWNCbG9jayA6IHMuZ3JhcGhpY0Jsb2NrcygpKSB7CisgICAgICAgIEJsb2NrJiBkQmxvY2sgPSBkLT5ibG9ja3NbaSsrXTsKKyAgICAgICAgaWYgKCFvYmpjcHkoCisgICAgICAgICAgICAgICAgJmRCbG9jaywgZ3JhcGhpY0Jsb2NrLAorICAgICAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsIGJhc2VCbG9ja3MsIGJhc2VCbG9ja0luZGljZXMpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyQnVmZmVyRGF0YTo6Z3JhcGhpY0Jsb2Nrcy4gIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAiKERlc3RpbmF0aW9uIGluZGV4ID0gIiA8PCBpIC0gMSA8PCAiLikiOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkJ1ZmZlciAtPiBCdWZmZXIKK2Jvb2wgb2JqY3B5KEJ1ZmZlciogZCwgY29uc3QgQzJCdWZmZXImIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgaWYgKCFjcmVhdGVQYXJhbXNCbG9iKCZkLT5pbmZvLCBzLmluZm8oKSkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMkJ1ZmZlcjo6aW5mby4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghb2JqY3B5KGQsIHMuZGF0YSgpLCBidWZmZXJQb29sU2VuZGVyLCBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyQnVmZmVyOjpkYXRhLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEMySW5mb0J1ZmZlciAtPiBJbmZvQnVmZmVyCitib29sIG9iamNweShJbmZvQnVmZmVyKiBkLCBjb25zdCBDMkluZm9CdWZmZXImIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgLy8gVE9ETzogQzJJbmZvQnVmZmVyIGlzIG5vdCBpbXBsZW1lbnRlZC4KKyAgICAodm9pZClkOworICAgICh2b2lkKXM7CisgICAgKHZvaWQpYnVmZmVyUG9vbFNlbmRlcjsKKyAgICAodm9pZCliYXNlQmxvY2tzOworICAgICh2b2lkKWJhc2VCbG9ja0luZGljZXM7CisgICAgTE9HKElORk8pIDw8ICJJbmZvQnVmZmVyIG5vdCBpbXBsZW1lbnRlZC4iOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkZyYW1lRGF0YSAtPiBGcmFtZURhdGEKK2Jvb2wgb2JqY3B5KEZyYW1lRGF0YSogZCwgY29uc3QgQzJGcmFtZURhdGEmIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgZC0+ZmxhZ3MgPSBzdGF0aWNfY2FzdDxoaWRsX2JpdGZpZWxkPEZyYW1lRGF0YTo6RmxhZ3M+PihzLmZsYWdzKTsKKyAgICBpZiAoIW9iamNweSgmZC0+b3JkaW5hbCwgcy5vcmRpbmFsKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyRnJhbWVEYXRhOjpvcmRpbmFsLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBkLT5idWZmZXJzLnJlc2l6ZShzLmJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBzQnVmZmVyIDogcy5idWZmZXJzKSB7CisgICAgICAgIEJ1ZmZlciYgZEJ1ZmZlciA9IGQtPmJ1ZmZlcnNbaSsrXTsKKyAgICAgICAgaWYgKCFzQnVmZmVyKSB7CisgICAgICAgICAgICAvLyBBIG51bGwgKHBvaW50ZXIgdG8pIEMyQnVmZmVyIGNvcnJlc3BvbmRzIHRvIGEgQnVmZmVyIHdpdGggZW1wdHkKKyAgICAgICAgICAgIC8vIGluZm8gYW5kIGJsb2Nrcy4KKyAgICAgICAgICAgIGRCdWZmZXIuaW5mby5yZXNpemUoMCk7CisgICAgICAgICAgICBkQnVmZmVyLmJsb2Nrcy5yZXNpemUoMCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW9iamNweSgKKyAgICAgICAgICAgICAgICAmZEJ1ZmZlciwgKnNCdWZmZXIsCisgICAgICAgICAgICAgICAgYnVmZmVyUG9vbFNlbmRlciwgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcykpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJGcmFtZURhdGE6OmJ1ZmZlcnNbIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBpIC0gMSA8PCAiXS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFjcmVhdGVQYXJhbXNCbG9iKCZkLT5jb25maWdVcGRhdGUsIHMuY29uZmlnVXBkYXRlKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyRnJhbWVEYXRhOjpjb25maWdVcGRhdGUuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGQtPmluZm9CdWZmZXJzLnJlc2l6ZShzLmluZm9CdWZmZXJzLnNpemUoKSk7CisgICAgaSA9IDA7CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvQnVmZmVyPiYgc0luZm9CdWZmZXIgOiBzLmluZm9CdWZmZXJzKSB7CisgICAgICAgIEluZm9CdWZmZXImIGRJbmZvQnVmZmVyID0gZC0+aW5mb0J1ZmZlcnNbaSsrXTsKKyAgICAgICAgaWYgKCFzSW5mb0J1ZmZlcikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTnVsbCBDMkZyYW1lRGF0YTo6aW5mb0J1ZmZlcnNbIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBpIC0gMSA8PCAiXS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghb2JqY3B5KCZkSW5mb0J1ZmZlciwgKnNJbmZvQnVmZmVyLAorICAgICAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsIGJhc2VCbG9ja3MsIGJhc2VCbG9ja0luZGljZXMpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyRnJhbWVEYXRhOjppbmZvQnVmZmVyc1siCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGkgLSAxIDw8ICJdLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCisvLyBEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcidzIGltcGxlbWVudGF0aW9uCisKK0RlZmF1bHRCdWZmZXJQb29sU2VuZGVyOjpEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcigKKyAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+JiByZWNlaXZlck1hbmFnZXIsCisgICAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OmR1cmF0aW9uIHJlZnJlc2hJbnRlcnZhbCkKKyAgICA6IG1SZWNlaXZlck1hbmFnZXIocmVjZWl2ZXJNYW5hZ2VyKSwKKyAgICAgIG1Tb3VyY2VDb25uZWN0aW9uSWQoMCksCisgICAgICBtTGFzdFNlbnQoc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkpLAorICAgICAgbVJlZnJlc2hJbnRlcnZhbChyZWZyZXNoSW50ZXJ2YWwpIHsKK30KKwordm9pZCBEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcjo6c2V0UmVjZWl2ZXIoCisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiYgcmVjZWl2ZXJNYW5hZ2VyLAorICAgICAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpkdXJhdGlvbiByZWZyZXNoSW50ZXJ2YWwpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIGlmIChtUmVjZWl2ZXJNYW5hZ2VyICE9IHJlY2VpdmVyTWFuYWdlcikgeworICAgICAgICBtUmVjZWl2ZXJNYW5hZ2VyID0gcmVjZWl2ZXJNYW5hZ2VyOworICAgIH0KKyAgICBtUmVmcmVzaEludGVydmFsID0gcmVmcmVzaEludGVydmFsOworfQorCitSZXN1bHRTdGF0dXMgRGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXI6OnNlbmQoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4mIGJwRGF0YSwKKyAgICAgICAgQnVmZmVyU3RhdHVzTWVzc2FnZSogYnBNZXNzYWdlKSB7CisgICAgaWYgKCFtUmVjZWl2ZXJNYW5hZ2VyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk5vIGFjY2VzcyB0byByZWNlaXZlcidzIEJ1ZmZlclBvb2wuIjsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgIH0KKyAgICBSZXN1bHRTdGF0dXMgcnM7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBpZiAoIW1TZW5kZXJNYW5hZ2VyKSB7CisgICAgICAgIG1TZW5kZXJNYW5hZ2VyID0gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKKyAgICAgICAgaWYgKCFtU2VuZGVyTWFuYWdlcikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJldHJpZXZlIGxvY2FsIEJ1ZmZlclBvb2wgQ2xpZW50TWFuYWdlci4iOworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgaW50NjRfdCBjb25uZWN0aW9uSWQgPSBicERhdGEtPm1Db25uZWN0aW9uSWQ7CisgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCBub3cgPQorICAgICAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CisgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24gaW50ZXJ2YWwgPSBub3cgLSBtTGFzdFNlbnQ7CisgICAgaWYgKG1Tb3VyY2VDb25uZWN0aW9uSWQgPT0gMCB8fAorICAgICAgICAgICAgbVNvdXJjZUNvbm5lY3Rpb25JZCAhPSBjb25uZWN0aW9uSWQgfHwKKyAgICAgICAgICAgIGludGVydmFsID4gbVJlZnJlc2hJbnRlcnZhbCkgeworICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBidWZmZXJwb29sIGNvbm5lY3Rpb24uCisgICAgICAgIG1Tb3VyY2VDb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgIGlmIChtU291cmNlQ29ubmVjdGlvbklkID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaW50NjRfdCByZWNlaXZlckNvbm5lY3Rpb25JZDsKKyAgICAgICAgcnMgPSBtU2VuZGVyTWFuYWdlci0+cmVnaXN0ZXJTZW5kZXIobVJlY2VpdmVyTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjZWl2ZXJDb25uZWN0aW9uSWQpOworICAgICAgICBpZiAoKHJzICE9IFJlc3VsdFN0YXR1czo6T0spICYmIChycyAhPSBSZXN1bHRTdGF0dXM6OkFMUkVBRFlfRVhJU1RTKSkgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJyZWdpc3RlclNlbmRlciAtLSByZXR1cm5lZCBlcnJvcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludDMyX3Q+KHJzKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgICAgIHJldHVybiByczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1SZWNlaXZlckNvbm5lY3Rpb25JZCA9IHJlY2VpdmVyQ29ubmVjdGlvbklkOworICAgICAgICB9CisgICAgfQorCisgICAgdWludDY0X3QgdHJhbnNhY3Rpb25JZDsKKyAgICBpbnQ2NF90IHRpbWVzdGFtcFVzOworICAgIHJzID0gbVNlbmRlck1hbmFnZXItPnBvc3RTZW5kKAorICAgICAgICAgICAgbVJlY2VpdmVyQ29ubmVjdGlvbklkLCBicERhdGEsICZ0cmFuc2FjdGlvbklkLCAmdGltZXN0YW1wVXMpOworICAgIGlmIChycyAhPSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNsaWVudE1hbmFnZXI6OnBvc3RTZW5kIC0tIHJldHVybmVkIGVycm9yOiAiCisgICAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8aW50MzJfdD4ocnMpCisgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICByZXR1cm4gcnM7CisgICAgfQorICAgIGlmICghYnBNZXNzYWdlKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk51bGwgb3V0cHV0IHBhcmFtZXRlciBmb3IgQnVmZmVyU3RhdHVzTWVzc2FnZS4iOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgYnBNZXNzYWdlLT5jb25uZWN0aW9uSWQgPSBtUmVjZWl2ZXJDb25uZWN0aW9uSWQ7CisgICAgYnBNZXNzYWdlLT5idWZmZXJJZCA9IGJwRGF0YS0+bUlkOworICAgIGJwTWVzc2FnZS0+dHJhbnNhY3Rpb25JZCA9IHRyYW5zYWN0aW9uSWQ7CisgICAgYnBNZXNzYWdlLT50aW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgIG1MYXN0U2VudCA9IG5vdzsKKyAgICByZXR1cm4gcnM7Cit9CisKKy8vIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gLT4gV29ya0J1bmRsZQorYm9vbCBvYmpjcHkoCisgICAgICAgIFdvcmtCdW5kbGUqIGQsCisgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIpIHsKKyAgICAvLyBiYXNlQmxvY2tzIGhvbGRzIGEgbGlzdCBvZiBCYXNlQmxvY2sgb2JqZWN0cyB0aGF0IEJsb2NrcyBjYW4gcmVmZXIgdG8uCisgICAgc3RkOjpsaXN0PEJhc2VCbG9jaz4gYmFzZUJsb2NrczsKKworICAgIC8vIGJhc2VCbG9ja0luZGljZXMgbWFwcyBhIHJhdyBwb2ludGVyIHRvIG5hdGl2ZV9oYW5kbGVfdCBvciBCdWZmZXJQb29sRGF0YQorICAgIC8vIGluc2lkZSBiYXNlQmxvY2tzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGluZGV4IGludG8gYmFzZUJsb2Nrcy4gVGhlIGtleXMKKyAgICAvLyAocG9pbnRlcnMpIGFyZSB1c2VkIHRvIGlkZW50aWZ5IGJsb2NrcyB0aGF0IGhhdmUgdGhlIHNhbWUgImJhc2UgYmxvY2siIGluCisgICAgLy8gcywgYSBsaXN0IG9mIEMyV29yayBvYmplY3RzLiBCZWNhdXNlIGJhc2VCbG9ja3Mgd2lsbCBiZSBjb3BpZWQgaW50byBhCisgICAgLy8gaGlkbF92ZWMgZXZlbnR1YWxseSwgdGhlIHZhbHVlcyBvZiBiYXNlQmxvY2tJbmRpY2VzIGFyZSB6ZXJvLWJhc2VkCisgICAgLy8gaW50ZWdlciBpbmRpY2VzIGluc3RlYWQgb2YgbGlzdCBpdGVyYXRvcnMuCisgICAgLy8KKyAgICAvLyBOb3RlIHRoYXQgdGhlIHBvaW50ZXJzIGNhbiBiZSByYXcgYmVjYXVzZSBiYXNlQmxvY2tJbmRpY2VzIGhhcyBhIHNob3J0ZXIKKyAgICAvLyBsaWZlc3BhbiB0aGFuIGFsbCBvZiBiYXNlIGJsb2Nrcy4KKyAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+IGJhc2VCbG9ja0luZGljZXM7CisKKyAgICBkLT53b3Jrcy5yZXNpemUocy5zaXplKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiBzV29yayA6IHMpIHsKKyAgICAgICAgV29yayAmZFdvcmsgPSBkLT53b3Jrc1tpKytdOworICAgICAgICBpZiAoIXNXb3JrKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIk51bGwgQzJXb3JrIGVuY291bnRlcmVkLiI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoYWluIGluZm8gaXMgbm90IGluIHVzZSBjdXJyZW50bHkuCisKKyAgICAgICAgLy8gaW5wdXQKKyAgICAgICAgaWYgKCFvYmpjcHkoJmRXb3JrLmlucHV0LCBzV29yay0+aW5wdXQsCisgICAgICAgICAgICAgICAgYnVmZmVyUG9vbFNlbmRlciwgJmJhc2VCbG9ja3MsICZiYXNlQmxvY2tJbmRpY2VzKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMldvcms6OmlucHV0LiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyB3b3JrbGV0cworICAgICAgICBpZiAoc1dvcmstPndvcmtsZXRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJXb3JrIHdpdGggbm8gd29ya2xldHMuIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFBhcmNlbCB0aGUgd29ya2xldHMuCisgICAgICAgICAgICBoaWRsX3ZlYzxXb3JrbGV0PiAmZFdvcmtsZXRzID0gZFdvcmsud29ya2xldHM7CisgICAgICAgICAgICBkV29ya2xldHMucmVzaXplKHNXb3JrLT53b3JrbGV0cy5zaXplKCkpOworICAgICAgICAgICAgc2l6ZV90IGogPSAwOworICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrbGV0PiYgc1dvcmtsZXQgOiBzV29yay0+d29ya2xldHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFzV29ya2xldCkgeworICAgICAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIk51bGwgQzJXb3JrOjp3b3JrbGV0c1siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBqIDw8ICJdLiI7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBXb3JrbGV0ICZkV29ya2xldCA9IGRXb3JrbGV0c1tqKytdOworCisgICAgICAgICAgICAgICAgLy8gY29tcG9uZW50IGlkCisgICAgICAgICAgICAgICAgZFdvcmtsZXQuY29tcG9uZW50SWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICBzV29ya2xldC0+Y29tcG9uZW50KTsKKworICAgICAgICAgICAgICAgIC8vIHR1bmluZ3MKKyAgICAgICAgICAgICAgICBpZiAoIWNyZWF0ZVBhcmFtc0Jsb2IoJmRXb3JrbGV0LnR1bmluZ3MsIHNXb3JrbGV0LT50dW5pbmdzKSkgeworICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyV29yazo6d29ya2xldHNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGogLSAxIDw8ICJdLT50dW5pbmdzLiI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBmYWlsdXJlcworICAgICAgICAgICAgICAgIGRXb3JrbGV0LmZhaWx1cmVzLnJlc2l6ZShzV29ya2xldC0+ZmFpbHVyZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBzaXplX3QgayA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiYgc0ZhaWx1cmUgOgorICAgICAgICAgICAgICAgICAgICAgICAgc1dvcmtsZXQtPmZhaWx1cmVzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc0ZhaWx1cmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiTnVsbCBDMldvcms6OndvcmtsZXRzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBqIC0gMSA8PCAiXS0+ZmFpbHVyZXNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGsgPDwgIl0uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghb2JqY3B5KCZkV29ya2xldC5mYWlsdXJlc1trKytdLCAqc0ZhaWx1cmUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyV29yazo6d29ya2xldHNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBqIC0gMSA8PCAiXS0+ZmFpbHVyZXNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBrIC0gMSA8PCAiXS4iOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gb3V0cHV0CisgICAgICAgICAgICAgICAgaWYgKCFvYmpjcHkoJmRXb3JrbGV0Lm91dHB1dCwgc1dvcmtsZXQtPm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsICZiYXNlQmxvY2tzLCAmYmFzZUJsb2NrSW5kaWNlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMldvcms6OndvcmtsZXRzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBqIC0gMSA8PCAiXS0+b3V0cHV0LiI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB3b3JrbGV0cyBwcm9jZXNzZWQKKyAgICAgICAgZFdvcmsud29ya2xldHNQcm9jZXNzZWQgPSBzV29yay0+d29ya2xldHNQcm9jZXNzZWQ7CisKKyAgICAgICAgLy8gcmVzdWx0CisgICAgICAgIGRXb3JrLnJlc3VsdCA9IHN0YXRpY19jYXN0PFN0YXR1cz4oc1dvcmstPnJlc3VsdCk7CisgICAgfQorCisgICAgLy8gQ29weSBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiB0byBoaWRsX3ZlYzxCYXNlQmxvY2s+LgorICAgIHsKKyAgICAgICAgZC0+YmFzZUJsb2Nrcy5yZXNpemUoYmFzZUJsb2Nrcy5zaXplKCkpOworICAgICAgICBzaXplX3QgaSA9IDA7CisgICAgICAgIGZvciAoY29uc3QgQmFzZUJsb2NrJiBiYXNlQmxvY2sgOiBiYXNlQmxvY2tzKSB7CisgICAgICAgICAgICBkLT5iYXNlQmxvY2tzW2krK10gPSBiYXNlQmxvY2s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCitzdHJ1Y3QgQzJCYXNlQmxvY2sgeworICAgIGVudW0gdHlwZV90IHsKKyAgICAgICAgTElORUFSLAorICAgICAgICBHUkFQSElDLAorICAgIH07CisgICAgdHlwZV90IHR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGxpbmVhcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGdyYXBoaWM7Cit9OworCisvLyBoaWRsX2hhbmRsZSAtPiBDMkZlbmNlCisvLyBOb3RlOiBGaWxlIGRlc2NyaXB0b3JzIGFyZSBub3QgZHVwbGljYXRlZC4gVGhlIG9yaWdpbmFsIGZpbGUgZGVzY3JpcHRvciBtdXN0CisvLyBub3QgYmUgY2xvc2VkIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUuCitib29sIG9iamNweShDMkZlbmNlKiBkLCBjb25zdCBoaWRsX2hhbmRsZSYgcykgeworICAgIC8vIFRPRE86IEltcGxlbWVudC4KKyAgICAodm9pZClzOworICAgICpkID0gQzJGZW5jZSgpOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkxpbmVhckJsb2NrLCB2ZWN0b3I8QzJQYXJhbSo+LCBDMkZlbmNlIC0+IEMyQnVmZmVyCitib29sIGNyZWF0ZUxpbmVhckJ1ZmZlcigKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiogYnVmZmVyLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4mIGJsb2NrLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4mIG1ldGEsCisgICAgICAgIGNvbnN0IEMyRmVuY2UmIGZlbmNlKSB7CisgICAgLy8gQ2hlY2sgdGhlIGJsb2NrIG1ldGEuIEl0IHNob3VsZCBoYXZlIGV4YWN0bHkgMSBDMkluZm86CisgICAgLy8gQzJIaWRsX1JhbmdlSW5mby4KKyAgICBpZiAoKG1ldGEuc2l6ZSgpICE9IDEpIHx8ICFtZXRhWzBdKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJMaW5lYXJCbG9jazo6bWV0YS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChtZXRhWzBdLT5zaXplKCkgIT0gc2l6ZW9mKEMySGlkbF9SYW5nZUluZm8pKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgcmFuZ2UgaW5mbyBpbiBDMkxpbmVhckJsb2NrLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQzJIaWRsX1JhbmdlSW5mbyAqcmFuZ2VJbmZvID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QzJIaWRsX1JhbmdlSW5mbyo+KG1ldGFbMF0pOworCisgICAgLy8gQ3JlYXRlIEMyQnVmZmVyIGZyb20gQzJMaW5lYXJCbG9jay4KKyAgICAqYnVmZmVyID0gQzJCdWZmZXI6OkNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jay0+c2hhcmUoCisgICAgICAgICAgICByYW5nZUluZm8tPm9mZnNldCwgcmFuZ2VJbmZvLT5sZW5ndGgsCisgICAgICAgICAgICBmZW5jZSkpOworICAgIGlmICghKCpidWZmZXIpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNyZWF0ZUxpbmVhckJ1ZmZlciBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJHcmFwaGljQmxvY2ssIHZlY3RvcjxDMlBhcmFtKj4sIEMyRmVuY2UgLT4gQzJCdWZmZXIKK2Jvb2wgY3JlYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiogYnVmZmVyLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+JiBibG9jaywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+JiBtZXRhLAorICAgICAgICBjb25zdCBDMkZlbmNlJiBmZW5jZSkgeworICAgIC8vIENoZWNrIHRoZSBibG9jayBtZXRhLiBJdCBzaG91bGQgaGF2ZSBleGFjdGx5IDEgQzJJbmZvOgorICAgIC8vIEMySGlkbF9SZWN0SW5mby4KKyAgICBpZiAoKG1ldGEuc2l6ZSgpICE9IDEpIHx8ICFtZXRhWzBdKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJHcmFwaGljQmxvY2s6Om1ldGEuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobWV0YVswXS0+c2l6ZSgpICE9IHNpemVvZihDMkhpZGxfUmVjdEluZm8pKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgcmVjdCBpbmZvIGluIEMyR3JhcGhpY0Jsb2NrLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQzJIaWRsX1JlY3RJbmZvICpyZWN0SW5mbyA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEMySGlkbF9SZWN0SW5mbyo+KG1ldGFbMF0pOworCisgICAgLy8gQ3JlYXRlIEMyQnVmZmVyIGZyb20gQzJHcmFwaGljQmxvY2suCisgICAgKmJ1ZmZlciA9IEMyQnVmZmVyOjpDcmVhdGVHcmFwaGljQnVmZmVyKGJsb2NrLT5zaGFyZSgKKyAgICAgICAgICAgIEMyUmVjdChyZWN0SW5mby0+d2lkdGgsIHJlY3RJbmZvLT5oZWlnaHQpLgorICAgICAgICAgICAgYXQocmVjdEluZm8tPmxlZnQsIHJlY3RJbmZvLT50b3ApLAorICAgICAgICAgICAgZmVuY2UpKTsKKyAgICBpZiAoISgqYnVmZmVyKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDcmVhdGVHcmFwaGljQnVmZmVyIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBCdWZmZXIgLT4gQzJCdWZmZXIKKy8vIE5vdGU6IFRoZSBuYXRpdmUgaGFuZGxlcyB3aWxsIGJlIGNsb25lZC4KK2Jvb2wgb2JqY3B5KHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4qIGQsIGNvbnN0IEJ1ZmZlciYgcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJCYXNlQmxvY2s+JiBiYXNlQmxvY2tzKSB7CisgICAgKmQgPSBudWxscHRyOworCisgICAgLy8gQ3VycmVudGx5LCBhIG5vbi1udWxsIEMyQnVmZmVyIG11c3QgY29udGFpbiBleGFjdGx5IDEgYmxvY2suCisgICAgaWYgKHMuYmxvY2tzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAocy5ibG9ja3Muc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBCdWZmZXI6ICIKKyAgICAgICAgICAgICAgICAgICAgICAiQ3VycmVudGx5LCBhIEMyQnVmZmVyIG11c3QgY29udGFpbiBleGFjdGx5IDEgYmxvY2suIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IEJsb2NrICZzQmxvY2sgPSBzLmJsb2Nrc1swXTsKKyAgICBpZiAoc0Jsb2NrLmluZGV4ID49IGJhc2VCbG9ja3Muc2l6ZSgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQnVmZmVyOjpibG9ja3NbMF0uaW5kZXg6ICIKKyAgICAgICAgICAgICAgICAgICAgICAiQXJyYXkgaW5kZXggb3V0IG9mIHJhbmdlLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY29uc3QgQzJCYXNlQmxvY2sgJmJhc2VCbG9jayA9IGJhc2VCbG9ja3Nbc0Jsb2NrLmluZGV4XTsKKworICAgIC8vIFBhcnNlIG1ldGEuCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHNCbG9ja01ldGE7CisgICAgaWYgKCFwYXJzZVBhcmFtc0Jsb2IoJnNCbG9ja01ldGEsIHNCbG9jay5tZXRhKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEJ1ZmZlcjo6YmxvY2tzWzBdLm1ldGEuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIENvcHkgZmVuY2UuCisgICAgQzJGZW5jZSBkRmVuY2U7CisgICAgaWYgKCFvYmpjcHkoJmRGZW5jZSwgc0Jsb2NrLmZlbmNlKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEJ1ZmZlcjo6YmxvY2tzWzBdLmZlbmNlLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBDb25zdHJ1Y3QgYSBibG9jay4KKyAgICBzd2l0Y2ggKGJhc2VCbG9jay50eXBlKSB7CisgICAgY2FzZSBDMkJhc2VCbG9jazo6TElORUFSOgorICAgICAgICBpZiAoIWNyZWF0ZUxpbmVhckJ1ZmZlcihkLCBiYXNlQmxvY2subGluZWFyLCBzQmxvY2tNZXRhLCBkRmVuY2UpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyQmFzZUJsb2NrOjpsaW5lYXIuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyQmFzZUJsb2NrOjpHUkFQSElDOgorICAgICAgICBpZiAoIWNyZWF0ZUdyYXBoaWNCdWZmZXIoZCwgYmFzZUJsb2NrLmdyYXBoaWMsIHNCbG9ja01ldGEsIGRGZW5jZSkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJCYXNlQmxvY2s6OmdyYXBoaWMuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyQmFzZUJsb2NrOjp0eXBlLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBQYXJzZSBpbmZvCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtczsKKyAgICBpZiAoIXBhcnNlUGFyYW1zQmxvYigmcGFyYW1zLCBzLmluZm8pKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQnVmZmVyOjppbmZvLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChDMlBhcmFtKiBwYXJhbSA6IHBhcmFtcykgeworICAgICAgICBpZiAocGFyYW0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTnVsbCBwYXJhbSBpbiBCdWZmZXI6OmluZm8uIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gYzJwYXJhbXsKKyAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KCpwYXJhbSkucmVsZWFzZSgpfTsKKyAgICAgICAgaWYgKCFjMnBhcmFtKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIHBhcmFtIGluIEJ1ZmZlcjo6aW5mby4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICAgICAgKCpkKS0+c2V0SW5mbyhzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJJbmZvPihjMnBhcmFtKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkMyQnVmZmVyOjpzZXRJbmZvIGZhaWxlZC4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEZyYW1lRGF0YSAtPiBDMkZyYW1lRGF0YQorYm9vbCBvYmpjcHkoQzJGcmFtZURhdGEqIGQsIGNvbnN0IEZyYW1lRGF0YSYgcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJCYXNlQmxvY2s+JiBiYXNlQmxvY2tzKSB7CisgICAgZC0+ZmxhZ3MgPSBzdGF0aWNfY2FzdDxDMkZyYW1lRGF0YTo6ZmxhZ3NfdD4ocy5mbGFncyk7CisgICAgaWYgKCFvYmpjcHkoJmQtPm9yZGluYWwsIHMub3JkaW5hbCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBGcmFtZURhdGE6Om9yZGluYWwuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBkLT5idWZmZXJzLmNsZWFyKCk7CisgICAgZC0+YnVmZmVycy5yZXNlcnZlKHMuYnVmZmVycy5zaXplKCkpOworICAgIGZvciAoY29uc3QgQnVmZmVyJiBzQnVmZmVyIDogcy5idWZmZXJzKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gZEJ1ZmZlcjsKKyAgICAgICAgaWYgKCFvYmpjcHkoJmRCdWZmZXIsIHNCdWZmZXIsIGJhc2VCbG9ja3MpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEZyYW1lRGF0YTo6YnVmZmVycy4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGQtPmJ1ZmZlcnMuZW1wbGFjZV9iYWNrKGRCdWZmZXIpOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBwYXJhbXM7CisgICAgaWYgKCFwYXJzZVBhcmFtc0Jsb2IoJnBhcmFtcywgcy5jb25maWdVcGRhdGUpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgRnJhbWVEYXRhOjpjb25maWdVcGRhdGUuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBkLT5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICBmb3IgKEMyUGFyYW0qIHBhcmFtIDogcGFyYW1zKSB7CisgICAgICAgIGQtPmNvbmZpZ1VwZGF0ZS5lbXBsYWNlX2JhY2soQzJQYXJhbTo6Q29weSgqcGFyYW0pKTsKKyAgICAgICAgaWYgKCFkLT5jb25maWdVcGRhdGUuYmFjaygpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmV4cGVjdGVkIGVycm9yIHdoaWxlIHBhcnNpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiRnJhbWVEYXRhOjpjb25maWdVcGRhdGUuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIG9uY2UgQzJJbmZvQnVmZmVyIGhhcyBjb25zdHJ1Y3RvcnMuCisgICAgZC0+aW5mb0J1ZmZlcnMuY2xlYXIoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQmFzZUJsb2NrIC0+IEMyQmFzZUJsb2NrCitib29sIG9iamNweShDMkJhc2VCbG9jayogZCwgY29uc3QgQmFzZUJsb2NrJiBzKSB7CisgICAgc3dpdGNoIChzLmdldERpc2NyaW1pbmF0b3IoKSkgeworICAgIGNhc2UgQmFzZUJsb2NrOjpoaWRsX2Rpc2NyaW1pbmF0b3I6Om5hdGl2ZUJsb2NrOiB7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIHNIYW5kbGUgPQorICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb25lKHMubmF0aXZlQmxvY2soKSk7CisgICAgICAgICAgICBpZiAoc0hhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTnVsbCBCYXNlQmxvY2s6Om5hdGl2ZUJsb2NrLiI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKnNDMkhhbmRsZSA9CisgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQzJIYW5kbGUqPihzSGFuZGxlKTsKKworICAgICAgICAgICAgZC0+bGluZWFyID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jayhzQzJIYW5kbGUpOworICAgICAgICAgICAgaWYgKGQtPmxpbmVhcikgeworICAgICAgICAgICAgICAgIGQtPnR5cGUgPSBDMkJhc2VCbG9jazo6TElORUFSOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkLT5ncmFwaGljID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soc0MySGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChkLT5ncmFwaGljKSB7CisgICAgICAgICAgICAgICAgZC0+dHlwZSA9IEMyQmFzZUJsb2NrOjpHUkFQSElDOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmtub3duIGhhbmRsZSB0eXBlIGluIEJhc2VCbG9jazo6bmF0aXZlQmxvY2suIjsKKyAgICAgICAgICAgIGlmIChzSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShzSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShzSGFuZGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIGNhc2UgQmFzZUJsb2NrOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnBvb2xlZEJsb2NrOiB7CisgICAgICAgICAgICBjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZicE1lc3NhZ2UgPQorICAgICAgICAgICAgICAgICAgICBzLnBvb2xlZEJsb2NrKCk7CisgICAgICAgICAgICBzcDxDbGllbnRNYW5hZ2VyPiBicCA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJwRGF0YTsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqY0hhbmRsZTsKKyAgICAgICAgICAgIFJlc3VsdFN0YXR1cyBicFN0YXR1cyA9IGJwLT5yZWNlaXZlKAorICAgICAgICAgICAgICAgICAgICBicE1lc3NhZ2UuY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICBicE1lc3NhZ2UudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgYnBNZXNzYWdlLmJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICBicE1lc3NhZ2UudGltZXN0YW1wVXMsCisgICAgICAgICAgICAgICAgICAgICZjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAmYnBEYXRhKTsKKyAgICAgICAgICAgIGlmIChicFN0YXR1cyAhPSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlY2VpdmUgYnVmZmVyIGZyb20gYnVmZmVycG9vbCAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAicmVzdWx0U3RhdHVzID0gIiA8PCB1bmRlcmx5aW5nX3ZhbHVlKGJwU3RhdHVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWJwRGF0YSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk5vIGRhdGEgaW4gYnVmZmVycG9vbCB0cmFuc2FjdGlvbi4iOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZC0+bGluZWFyID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jayhjSGFuZGxlLCBicERhdGEpOworICAgICAgICAgICAgaWYgKGQtPmxpbmVhcikgeworICAgICAgICAgICAgICAgIGQtPnR5cGUgPSBDMkJhc2VCbG9jazo6TElORUFSOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkLT5ncmFwaGljID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soY0hhbmRsZSwgYnBEYXRhKTsKKyAgICAgICAgICAgIGlmIChkLT5ncmFwaGljKSB7CisgICAgICAgICAgICAgICAgZC0+dHlwZSA9IEMyQmFzZUJsb2NrOjpHUkFQSElDOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmtub3duIGhhbmRsZSB0eXBlIGluIEJhc2VCbG9jazo6cG9vbGVkQmxvY2suIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVucmVjb2duaXplZCBCYXNlQmxvY2sncyBkaXNjcmltaW5hdG9yIHdpdGggIgorICAgICAgICAgICAgICAgICAgIDw8ICJ1bmRlcmx5aW5nIHZhbHVlICIKKyAgICAgICAgICAgICAgICAgICA8PCB1bmRlcmx5aW5nX3ZhbHVlKHMuZ2V0RGlzY3JpbWluYXRvcigpKSA8PCAiLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworLy8gV29ya0J1bmRsZSAtPiBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+Citib29sIG9iamNweShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBkLCBjb25zdCBXb3JrQnVuZGxlJiBzKSB7CisgICAgLy8gQ29udmVydCBCYXNlQmxvY2tzIHRvIEMyQmFzZUJsb2Nrcy4KKyAgICBzdGQ6OnZlY3RvcjxDMkJhc2VCbG9jaz4gZEJhc2VCbG9ja3Mocy5iYXNlQmxvY2tzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzLmJhc2VCbG9ja3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKCFvYmpjcHkoJmRCYXNlQmxvY2tzW2ldLCBzLmJhc2VCbG9ja3NbaV0pKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFdvcmtCdW5kbGU6OmJhc2VCbG9ja3NbIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBpIDw8ICJdLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkLT5jbGVhcigpOworICAgIGZvciAoY29uc3QgV29yayYgc1dvcmsgOiBzLndvcmtzKSB7CisgICAgICAgIGQtPmVtcGxhY2VfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPEMyV29yaz4oKSk7CisgICAgICAgIEMyV29yayYgZFdvcmsgPSAqZC0+YmFjaygpOworCisgICAgICAgIC8vIGNoYWluIGluZm8gaXMgbm90IGluIHVzZSBjdXJyZW50bHkuCisKKyAgICAgICAgLy8gaW5wdXQKKyAgICAgICAgaWYgKCFvYmpjcHkoJmRXb3JrLmlucHV0LCBzV29yay5pbnB1dCwgZEJhc2VCbG9ja3MpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFdvcms6OmlucHV0LiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyB3b3JrbGV0KHMpCisgICAgICAgIGRXb3JrLndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgIGZvciAoY29uc3QgV29ya2xldCYgc1dvcmtsZXQgOiBzV29yay53b3JrbGV0cykgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29ya2xldD4gZFdvcmtsZXQgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyV29ya2xldD4oKTsKKworICAgICAgICAgICAgLy8gY29tcG9uZW50IGlkCisgICAgICAgICAgICBkV29ya2xldC0+Y29tcG9uZW50ID0gc3RhdGljX2Nhc3Q8YzJfbm9kZV9pZF90PigKKyAgICAgICAgICAgICAgICAgICAgc1dvcmtsZXQuY29tcG9uZW50SWQpOworCisgICAgICAgICAgICAvLyB0dW5pbmdzCisgICAgICAgICAgICBpZiAoIWNvcHlQYXJhbXNGcm9tQmxvYigmZFdvcmtsZXQtPnR1bmluZ3MsIHNXb3JrbGV0LnR1bmluZ3MpKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBXb3JrbGV0Ojp0dW5pbmdzIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGZhaWx1cmVzCisgICAgICAgICAgICBkV29ya2xldC0+ZmFpbHVyZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIGRXb3JrbGV0LT5mYWlsdXJlcy5yZXNlcnZlKHNXb3JrbGV0LmZhaWx1cmVzLnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IFNldHRpbmdSZXN1bHQmIHNGYWlsdXJlIDogc1dvcmtsZXQuZmFpbHVyZXMpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiBkRmFpbHVyZTsKKyAgICAgICAgICAgICAgICBpZiAoIW9iamNweSgmZEZhaWx1cmUsIHNGYWlsdXJlKSkgeworICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFdvcmtsZXQ6OmZhaWx1cmVzLiI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZFdvcmtsZXQtPmZhaWx1cmVzLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoZEZhaWx1cmUpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gb3V0cHV0CisgICAgICAgICAgICBpZiAoIW9iamNweSgmZFdvcmtsZXQtPm91dHB1dCwgc1dvcmtsZXQub3V0cHV0LCBkQmFzZUJsb2NrcykpIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFdvcmtsZXQ6Om91dHB1dC4iOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZFdvcmsud29ya2xldHMuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShkV29ya2xldCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gd29ya2xldHNQcm9jZXNzZWQKKyAgICAgICAgZFdvcmsud29ya2xldHNQcm9jZXNzZWQgPSBzV29yay53b3JrbGV0c1Byb2Nlc3NlZDsKKworICAgICAgICAvLyByZXN1bHQKKyAgICAgICAgZFdvcmsucmVzdWx0ID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHNXb3JrLnJlc3VsdCk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0ZXhwciBzaXplX3QgUEFSQU1TX0FMSUdOTUVOVCA9IDg7ICAvLyA2NC1iaXQgYWxpZ25tZW50CitzdGF0aWNfYXNzZXJ0KFBBUkFNU19BTElHTk1FTlQgJSBhbGlnbm9mKEMyUGFyYW0pID09IDAsICJDMlBhcmFtIGFsaWdubWVudCBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChQQVJBTVNfQUxJR05NRU5UICUgYWxpZ25vZihDMkluZm8pID09IDAsICJDMlBhcmFtIGFsaWdubWVudCBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChQQVJBTVNfQUxJR05NRU5UICUgYWxpZ25vZihDMlR1bmluZykgPT0gMCwgIkMyUGFyYW0gYWxpZ25tZW50IG1pc21hdGNoIik7CisKKy8vIFBhcmFtcyAtPiBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4KK2Jvb2wgcGFyc2VQYXJhbXNCbG9iKHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAqcGFyYW1zLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiAmYmxvYikgeworICAgIC8vIGFzc3VtaW5nIGJsb2IgaXMgY29uc3QgaGVyZQorICAgIHNpemVfdCBzaXplID0gYmxvYi5zaXplKCk7CisgICAgc2l6ZV90IGl4ID0gMDsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYmxvYi5kYXRhKCk7CisgICAgQzJQYXJhbSAqcCA9IG51bGxwdHI7CisKKyAgICBkbyB7CisgICAgICAgIHAgPSBDMlBhcmFtVXRpbHM6OlBhcnNlRmlyc3QoZGF0YSArIGl4LCBzaXplIC0gaXgpOworICAgICAgICBpZiAocCkgeworICAgICAgICAgICAgcGFyYW1zLT5lbXBsYWNlX2JhY2socCk7CisgICAgICAgICAgICBpeCArPSBwLT5zaXplKCk7CisgICAgICAgICAgICBpeCA9IGFsaWduKGl4LCBQQVJBTVNfQUxJR05NRU5UKTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKHApOworCisgICAgaWYgKGl4ICE9IHNpemUpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAicGFyc2VQYXJhbXNCbG9iIC0tIGluY29uc2lzdGVudCBzaXplcy4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKKy8qKgorICogQ29uY2F0ZW5hdGVzIGEgbGlzdCBvZiBDMlBhcmFtcyBpbnRvIGEgcGFyYW1zIGJsb2IuIFQgaXMgYSBjb250YWluZXIgdHlwZQorICogd2hvc2UgbWVtYmVyIHR5cGUgaXMgY29tcGF0aWJsZSB3aXRoIEMyUGFyYW0qLgorICoKKyAqIFxwYXJhbVtvdXRdIGJsb2IgdGFyZ2V0IGJsb2IKKyAqIFxwYXJhbVtpbl0gcGFyYW1zIHBhcmFtZXRlcnMgdG8gY29uY2F0ZW5hdGUKKyAqIFxyZXR2YWwgQzJfT0sgaWYgdGhlIGJsb2Igd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkCisgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBpZiB0aGUgYmxvYiB3YXMgbm90IHN1Y2Nlc3NmdWwgY3JlYXRlZCAodGhpcyBvbmx5CisgKiAgICAgICAgIGhhcHBlbnMgaWYgdGhlIHBhcmFtZXRlcnMgd2VyZSBub3QgY29uc3QpCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYm9vbCBfY3JlYXRlUGFyYW1zQmxvYihoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwgY29uc3QgVCAmcGFyYW1zKSB7CisgICAgLy8gYXNzdW1pbmcgdGhlIHBhcmFtZXRlciB2YWx1ZXMgYXJlIGNvbnN0CisgICAgc2l6ZV90IHNpemUgPSAwOworICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHBhcmFtcykgeworICAgICAgICBpZiAoIXApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHNpemUgKz0gcC0+c2l6ZSgpOworICAgICAgICBzaXplID0gYWxpZ24oc2l6ZSwgUEFSQU1TX0FMSUdOTUVOVCk7CisgICAgfQorICAgIGJsb2ItPnJlc2l6ZShzaXplKTsKKyAgICBzaXplX3QgaXggPSAwOworICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHBhcmFtcykgeworICAgICAgICBpZiAoIXApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIE5FVkVSIG92ZXJ3cml0ZSBldmVuIGlmIHBhcmFtIHZhbHVlcyAoZS5nLiBzaXplKSBjaGFuZ2VkCisgICAgICAgIHNpemVfdCBwYXJhbVNpemUgPSBzdGQ6Om1pbihwLT5zaXplKCksIHNpemUgLSBpeCk7CisgICAgICAgIHN0ZDo6Y29weSgKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPigmKnApLAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KCYqcCkgKyBwYXJhbVNpemUsCisgICAgICAgICAgICAgICAgJigqYmxvYilbaXhdKTsKKyAgICAgICAgaXggKz0gcGFyYW1TaXplOworICAgICAgICBpeCA9IGFsaWduKGl4LCBQQVJBTVNfQUxJR05NRU5UKTsKKyAgICB9CisgICAgYmxvYi0+cmVzaXplKGl4KTsKKyAgICBpZiAoaXggIT0gc2l6ZSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjcmVhdGVQYXJhbXNCbG9iIC0tIGluY29uc2lzdGVudCBzaXplcy4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvKioKKyAqIFBhcnNlcyBhIHBhcmFtcyBibG9iIGFuZCBjcmVhdGUgYSB2ZWN0b3Igb2YgbmV3IFQgb2JqZWN0cyB0aGF0IGNvbnRhaW4gY29waWVzCisgKiBvZiB0aGUgcGFyYW1zIGluIHRoZSBibG9iLiBUIGlzIEMyUGFyYW0gb3IgaXRzIGNvbXBhdGlibGUgZGVyaXZlZCBjbGFzcy4KKyAqCisgKiBccGFyYW1bb3V0XSBwYXJhbXMgdGhlIHJlc3VsdGluZyB2ZWN0b3IKKyAqIFxwYXJhbVtpbl0gYmxvYiBwYXJhbWV0ZXIgYmxvYiB0byBwYXJzZQorICogXHJldHZhbCBDMl9PSyBpZiB0aGUgZnVsbCBibG9iIHdhcyBwYXJzZWQgYW5kIHBhcmFtcyB3YXMgY29uc3RydWN0ZWQKKyAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIG90aGVyd2lzZQorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2Jvb2wgX2NvcHlQYXJhbXNGcm9tQmxvYigKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFQ+PiogcGFyYW1zLAorICAgICAgICBQYXJhbXMgYmxvYikgeworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtUG9pbnRlcnM7CisgICAgaWYgKCFwYXJzZVBhcmFtc0Jsb2IoJnBhcmFtUG9pbnRlcnMsIGJsb2IpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNvcHlQYXJhbXNGcm9tQmxvYiAtLSBmYWlsZWQgdG8gcGFyc2UuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHBhcmFtcy0+cmVzaXplKHBhcmFtUG9pbnRlcnMuc2l6ZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChDMlBhcmFtKiBjb25zdCYgcGFyYW1Qb2ludGVyIDogcGFyYW1Qb2ludGVycykgeworICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiY29weVBhcmFtc0Zyb21CbG9iIC0tIG51bGwgcGFyYW1Qb2ludGVyLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgKCpwYXJhbXMpW2krK10ucmVzZXQocmVpbnRlcnByZXRfY2FzdDxUKj4oCisgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weSgqcGFyYW1Qb2ludGVyKS5yZWxlYXNlKCkpKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworLy8gc3RkOjp2ZWN0b3I8Y29uc3QgQzJQYXJhbSo+IC0+IFBhcmFtcworYm9vbCBjcmVhdGVQYXJhbXNCbG9iKAorICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgQzJQYXJhbSo+ICZwYXJhbXMpIHsKKyAgICByZXR1cm4gX2NyZWF0ZVBhcmFtc0Jsb2IoYmxvYiwgcGFyYW1zKTsKK30KKworLy8gc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IC0+IFBhcmFtcworYm9vbCBjcmVhdGVQYXJhbXNCbG9iKAorICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMpIHsKKyAgICByZXR1cm4gX2NyZWF0ZVBhcmFtc0Jsb2IoYmxvYiwgcGFyYW1zKTsKK30KKworLy8gc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAtPiBQYXJhbXMKK2Jvb2wgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gJnBhcmFtcykgeworICAgIHJldHVybiBfY3JlYXRlUGFyYW1zQmxvYihibG9iLCBwYXJhbXMpOworfQorCisvLyBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJUdW5pbmc+PiAtPiBQYXJhbXMKK2Jvb2wgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlR1bmluZz4+ICZwYXJhbXMpIHsKKyAgICByZXR1cm4gX2NyZWF0ZVBhcmFtc0Jsb2IoYmxvYiwgcGFyYW1zKTsKK30KKworLy8gc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+IC0+IFBhcmFtcworYm9vbCBjcmVhdGVQYXJhbXNCbG9iKAorICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+ICZwYXJhbXMpIHsKKyAgICByZXR1cm4gX2NyZWF0ZVBhcmFtc0Jsb2IoYmxvYiwgcGFyYW1zKTsKK30KKworLy8gUGFyYW1zIC0+IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4KK2Jvb2wgY29weVBhcmFtc0Zyb21CbG9iKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBwYXJhbXMsCisgICAgICAgIFBhcmFtcyBibG9iKSB7CisgICAgcmV0dXJuIF9jb3B5UGFyYW1zRnJvbUJsb2IocGFyYW1zLCBibG9iKTsKK30KKworLy8gUGFyYW1zIC0+IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlR1bmluZz4+Citib29sIGNvcHlQYXJhbXNGcm9tQmxvYigKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyVHVuaW5nPj4qIHBhcmFtcywKKyAgICAgICAgUGFyYW1zIGJsb2IpIHsKKyAgICByZXR1cm4gX2NvcHlQYXJhbXNGcm9tQmxvYihwYXJhbXMsIGJsb2IpOworfQorCisvLyBQYXJhbXMgLT4gdXBkYXRlIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4KK2Jvb2wgdXBkYXRlUGFyYW1zRnJvbUJsb2IoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiYgcGFyYW1zLAorICAgICAgICBjb25zdCBQYXJhbXMmIGJsb2IpIHsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDMyX3QsIEMyUGFyYW0qPiBpbmRleDJwYXJhbTsKKyAgICBmb3IgKEMyUGFyYW0qIGNvbnN0JiBwYXJhbSA6IHBhcmFtcykgeworICAgICAgICBpZiAoIXBhcmFtKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJ1cGRhdGVQYXJhbXNGcm9tQmxvYiAtLSBudWxsIG91dHB1dCBwYXJhbS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChpbmRleDJwYXJhbS5maW5kKHBhcmFtLT5pbmRleCgpKSA9PSBpbmRleDJwYXJhbS5lbmQoKSkgeworICAgICAgICAgICAgaW5kZXgycGFyYW0uZW1wbGFjZShwYXJhbS0+aW5kZXgoKSwgcGFyYW0pOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtUG9pbnRlcnM7CisgICAgaWYgKCFwYXJzZVBhcmFtc0Jsb2IoJnBhcmFtUG9pbnRlcnMsIGJsb2IpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInVwZGF0ZVBhcmFtc0Zyb21CbG9iIC0tIGZhaWxlZCB0byBwYXJzZS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZm9yIChDMlBhcmFtKiBjb25zdCYgcGFyYW1Qb2ludGVyIDogcGFyYW1Qb2ludGVycykgeworICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAidXBkYXRlUGFyYW1zRnJvbUJsb2IgLS0gbnVsbCBpbnB1dCBwYXJhbS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGRlY2x0eXBlKGluZGV4MnBhcmFtKTo6aXRlcmF0b3IgaSA9IGluZGV4MnBhcmFtLmZpbmQoCisgICAgICAgICAgICAgICAgcGFyYW1Qb2ludGVyLT5pbmRleCgpKTsKKyAgICAgICAgaWYgKGkgPT0gaW5kZXgycGFyYW0uZW5kKCkpIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgInVwZGF0ZVBhcmFtc0Zyb21CbG9iIC0tIGluZGV4ICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgcGFyYW1Qb2ludGVyLT5pbmRleCgpIDw8ICIgbm90IGZvdW5kLiBTa2lwcGluZy4uLiI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWktPnNlY29uZC0+dXBkYXRlRnJvbSgqcGFyYW1Qb2ludGVyKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAidXBkYXRlUGFyYW1zRnJvbUJsb2IgLS0gc2l6ZSBtaXNtYXRjaDogIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBwYXJhbXMuc2l6ZSgpIDw8ICIgdnMgIiA8PCBwYXJhbVBvaW50ZXItPnNpemUoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiIChpbmRleCA9ICIgPDwgaS0+Zmlyc3QgPDwgIikuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQ29udmVydCBCdWZmZXJQb29sIFJlc3VsdFN0YXR1cyB0byBjMl9zdGF0dXNfdC4KK2MyX3N0YXR1c190IHRvQzJTdGF0dXMoUmVzdWx0U3RhdHVzIHJzKSB7CisgICAgc3dpdGNoIChycykgeworICAgIGNhc2UgUmVzdWx0U3RhdHVzOjpPSzoKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIGNhc2UgUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk6CisgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgY2FzZSBSZXN1bHRTdGF0dXM6OkFMUkVBRFlfRVhJU1RTOgorICAgICAgICByZXR1cm4gQzJfRFVQTElDQVRFOworICAgIGNhc2UgUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ6CisgICAgICAgIHJldHVybiBDMl9OT1RfRk9VTkQ7CisgICAgY2FzZSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOgorICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiVW5yZWNvZ25pemVkIEJ1ZmZlclBvb2wgUmVzdWx0U3RhdHVzOiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxpbnQzMl90PihycykgPDwgIi4iOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KK30KKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQmxvY2tQcm9jZXNzb3I+Cit2b2lkIGZvckVhY2hCbG9jayhDMkZyYW1lRGF0YSYgZnJhbWVEYXRhLAorICAgICAgICAgICAgICAgICAgQmxvY2tQcm9jZXNzb3IgcHJvY2VzcykgeworICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiYgYnVmZmVyIDogZnJhbWVEYXRhLmJ1ZmZlcnMpIHsKKyAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgZm9yIChjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jayA6CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKSkgeworICAgICAgICAgICAgICAgIHByb2Nlc3MoYmxvY2spOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQmxvY2tQcm9jZXNzb3I+Cit2b2lkIGZvckVhY2hCbG9jayhjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrTGlzdCwKKyAgICAgICAgICAgICAgICAgIEJsb2NrUHJvY2Vzc29yIHByb2Nlc3MsCisgICAgICAgICAgICAgICAgICBib29sIHByb2Nlc3NJbnB1dCwgYm9vbCBwcm9jZXNzT3V0cHV0KSB7CisgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IHdvcmtMaXN0KSB7CisgICAgICAgIGlmICghd29yaykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByb2Nlc3NJbnB1dCkgeworICAgICAgICAgICAgZm9yRWFjaEJsb2NrKHdvcmstPmlucHV0LCBwcm9jZXNzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJvY2Vzc091dHB1dCkgeworICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrbGV0PiYgd29ya2xldCA6IHdvcmstPndvcmtsZXRzKSB7CisgICAgICAgICAgICAgICAgaWYgKHdvcmtsZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yRWFjaEJsb2NrKHdvcmtsZXQtPm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCitib29sIHlpZWxkQnVmZmVyUXVldWVCbG9jayhjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBkYXRhID0KKyAgICAgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6R2V0R3JhcGhpY0Jsb2NrUG9vbERhdGEoYmxvY2spOworICAgIGlmIChkYXRhICYmIF9DMkJsb2NrRmFjdG9yeTo6R2V0QnVmZmVyUXVldWVEYXRhKGRhdGEpKSB7CisgICAgICAgIF9DMkJsb2NrRmFjdG9yeTo6WWllbGRCbG9ja1RvQnVmZmVyUXVldWUoZGF0YSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgeWllbGRCdWZmZXJRdWV1ZUJsb2NrcygKKyAgICAgICAgY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0xpc3QsCisgICAgICAgIGJvb2wgcHJvY2Vzc0lucHV0LCBib29sIHByb2Nlc3NPdXRwdXQpIHsKKyAgICBmb3JFYWNoQmxvY2sod29ya0xpc3QsIHlpZWxkQnVmZmVyUXVldWVCbG9jaywgcHJvY2Vzc0lucHV0LCBwcm9jZXNzT3V0cHV0KTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9PV05FUlMgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL09XTkVSUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzMzZTBjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9PV05FUlMKQEAgLTAsMCArMSw5IEBACisjIE1lZGlhIHRlYW0KK2xham9zQGdvb2dsZS5jb20KK3Bhd2luQGdvb2dsZS5jb20KK3Rha2xlZUBnb29nbGUuY29tCit3b25zaWtAZ29vZ2xlLmNvbQorCisjIFZUUyB0ZWFtCit5aW1AZ29vZ2xlLmNvbQoremh1b3lhb0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4Nzc1NGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vQW5kcm9pZC5icApAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlZ0c0hpZGxDMlYxXzBUYXJnZXRBdWRpb0RlY1Rlc3QiLAorICAgIGRlZmF1bHRzOiBbIlZ0c01lZGlhQzJWMV8wRGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJWdHNIaWRsQzJWMV8wVGFyZ2V0QXVkaW9EZWNUZXN0LmNwcCIsCisgICAgICAgIC8vIm1lZGlhX2F1ZGlvX2hpZGxfdGVzdF9jb21tb24uY3BwIgorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNIaWRsQzJWMV8wVGFyZ2V0QXVkaW9FbmNUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNNZWRpYUMyVjFfMERlZmF1bHRzIl0sCisgICAgc3JjczogWworICAgICAgICAiVnRzSGlkbEMyVjFfMFRhcmdldEF1ZGlvRW5jVGVzdC5jcHAiLAorICAgICAgICAvLyJtZWRpYV9hdWRpb19oaWRsX3Rlc3RfY29tbW9uLmNwcCIKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL1Z0c0hpZGxDMlYxXzBUYXJnZXRBdWRpb0RlY1Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL1Z0c0hpZGxDMlYxXzBUYXJnZXRBdWRpb0RlY1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0Njk3MzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vVnRzSGlkbEMyVjFfMFRhcmdldEF1ZGlvRGVjVGVzdC5jcHAKQEAgLTAsMCArMSw5MzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjb2RlYzJfaGlkbF9oYWxfYXVkaW9fZGVjX3Rlc3QiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKwordXNpbmcgYW5kcm9pZDo6QzJBbGxvY2F0b3JJb247CisKKyNpbmNsdWRlIDxWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UuaD4KKyNpbmNsdWRlICJtZWRpYV9jMl9hdWRpb19oaWRsX3Rlc3RfY29tbW9uLmgiCisjaW5jbHVkZSAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIgorCitzdHJ1Y3QgRnJhbWVJbmZvIHsKKyAgICBpbnQgYnl0ZXNDb3VudDsKKyAgICB1aW50MzJfdCBmbGFnczsKKyAgICBpbnQ2NF90IHRpbWVzdGFtcDsKK307CisKK2NsYXNzIExpbmVhckJ1ZmZlciA6IHB1YmxpYyBDMkJ1ZmZlciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgTGluZWFyQnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiYgYmxvY2spCisgICAgICAgIDogQzJCdWZmZXIoCisgICAgICAgICAgICAgIHtibG9jay0+c2hhcmUoYmxvY2stPm9mZnNldCgpLCBibG9jay0+c2l6ZSgpLCA6OkMyRmVuY2UoKSl9KSB7fQorfTsKKworc3RhdGljIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCogZ0VudiA9IG51bGxwdHI7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgeworICAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIFN1cGVyOworCisgICBwdWJsaWM6CisgICAgOjpzdGQ6OnN0cmluZyBnZXRUZXN0Q2FzZUluZm8oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiA6OnN0ZDo6c3RyaW5nKCkgKworICAgICAgICAgICAgICAgICJDb21wb25lbnQ6ICIgKyBnRW52LT5nZXRDb21wb25lbnQoKS5jX3N0cigpICsgIiB8ICIgKworICAgICAgICAgICAgICAgICJJbnN0YW5jZTogIiArIGdFbnYtPmdldEluc3RhbmNlKCkuY19zdHIoKSArICIgfCAiICsKKyAgICAgICAgICAgICAgICAiUmVzOiAiICsgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKTsKKyAgICB9CisKKyAgICAvLyBnb29nbGUuY29kZWMyIEF1ZGlvIHRlc3Qgc2V0dXAKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIFN1cGVyOjpTZXRVcCgpOworICAgICAgICBtRGlzYWJsZVRlc3QgPSBmYWxzZTsKKyAgICAgICAgQUxPR1YoIkNvZGVjMkF1ZGlvRGVjSGlkbFRlc3QgU2V0VXAiKTsKKyAgICAgICAgbUNsaWVudCA9IGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkpOworICAgICAgICBBU1NFUlRfTkUobUNsaWVudCwgbnVsbHB0cik7CisgICAgICAgIG1MaXN0ZW5lci5yZXNldChuZXcgQ29kZWNMaXN0ZW5lcigKKyAgICAgICAgICAgIFt0aGlzXShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVXb3JrRG9uZSh3b3JrSXRlbXMpOworICAgICAgICAgICAgfSkpOworICAgICAgICBBU1NFUlRfTkUobUxpc3RlbmVyLCBudWxscHRyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSU5QVVRfQlVGRkVSUzsgKytpKSB7CisgICAgICAgICAgICBtV29ya1F1ZXVlLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrKTsKKyAgICAgICAgfQorICAgICAgICBtQ2xpZW50LT5jcmVhdGVDb21wb25lbnQoZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSwgbUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1Db21wb25lbnQpOworICAgICAgICBBU1NFUlRfTkUobUNvbXBvbmVudCwgbnVsbHB0cik7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IHN0b3JlID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OkdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICAgICAgQ0hFQ0tfRVEoc3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1MaW5lYXJBbGxvY2F0b3IpLAorICAgICAgICAgICAgICAgICBDMl9PSyk7CisgICAgICAgIG1MaW5lYXJQb29sID0gc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4obUxpbmVhckFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQmxvY2tQb29sSWQrKyk7CisgICAgICAgIEFTU0VSVF9ORShtTGluZWFyUG9vbCwgbnVsbHB0cik7CisKKyAgICAgICAgbUNvbXBOYW1lID0gdW5rbm93bl9jb21wOworICAgICAgICBzdHJ1Y3QgU3RyaW5nVG9OYW1lIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIE5hbWU7CisgICAgICAgICAgICBzdGFuZGFyZENvbXAgQ29tcE5hbWU7CisgICAgICAgIH07CisgICAgICAgIGNvbnN0IFN0cmluZ1RvTmFtZSBrU3RyaW5nVG9OYW1lW10gPSB7CisgICAgICAgICAgICB7InhhYWMiLCB4YWFjfSwKKyAgICAgICAgICAgIHsibXAzIiwgbXAzfSwKKyAgICAgICAgICAgIHsiYW1ybmIiLCBhbXJuYn0sCisgICAgICAgICAgICB7ImFtcndiIiwgYW1yd2J9LAorICAgICAgICAgICAgeyJhYWMiLCBhYWN9LAorICAgICAgICAgICAgeyJ2b3JiaXMiLCB2b3JiaXN9LAorICAgICAgICAgICAgeyJvcHVzIiwgb3B1c30sCisgICAgICAgICAgICB7InBjbSIsIHBjbX0sCisgICAgICAgICAgICB7Imc3MTEuYWxhdyIsIGc3MTFhbGF3fSwKKyAgICAgICAgICAgIHsiZzcxMS5tbGF3IiwgZzcxMW1sYXd9LAorICAgICAgICAgICAgeyJnc20iLCBnc219LAorICAgICAgICAgICAgeyJyYXciLCByYXd9LAorICAgICAgICAgICAgeyJmbGFjIiwgZmxhY30sCisgICAgICAgIH07CisgICAgICAgIGNvbnN0IHNpemVfdCBrTnVtU3RyaW5nVG9OYW1lID0KKyAgICAgICAgICAgIHNpemVvZihrU3RyaW5nVG9OYW1lKSAvIHNpemVvZihrU3RyaW5nVG9OYW1lWzBdKTsKKworICAgICAgICAvLyBGaW5kIHRoZSBjb21wb25lbnQgdHlwZQorICAgICAgICBzdGQ6OnN0cmluZyBjb21wID0gc3RkOjpzdHJpbmcoZ0Vudi0+Z2V0Q29tcG9uZW50KCkpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1TdHJpbmdUb05hbWU7ICsraSkgeworICAgICAgICAgICAgaWYgKHN0cmNhc2VzdHIoY29tcC5jX3N0cigpLCBrU3RyaW5nVG9OYW1lW2ldLk5hbWUpKSB7CisgICAgICAgICAgICAgICAgbUNvbXBOYW1lID0ga1N0cmluZ1RvTmFtZVtpXS5Db21wTmFtZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtRW9zID0gZmFsc2U7CisgICAgICAgIG1GcmFtZXNSZWNlaXZlZCA9IDA7CisgICAgICAgIG1UaW1lc3RhbXBVcyA9IDB1OworICAgICAgICBtVGltZXN0YW1wRGV2VGVzdCA9IGZhbHNlOworICAgICAgICBpZiAobUNvbXBOYW1lID09IHVua25vd25fY29tcCkgbURpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgaWYgKG1EaXNhYmxlVGVzdCkgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBEaXNhYmxlZCBcbiI7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAobUNvbXBvbmVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpZiAoOjp0ZXN0aW5nOjpUZXN0OjpIYXNGYXRhbEZhaWx1cmUoKSkgcmV0dXJuOworICAgICAgICAgICAgbUNvbXBvbmVudC0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUNvbXBvbmVudCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgU3VwZXI6OlRlYXJEb3duKCk7CisgICAgfQorCisgICAgc3RydWN0IG91dHB1dE1ldGFEYXRhIHsKKyAgICAgICAgdWludDY0X3QgdGltZXN0YW1wVXM7CisgICAgICAgIHVpbnQzMl90IHJhbmdlTGVuZ3RoOworICAgIH07CisgICAgLy8gY2FsbGJhY2sgZnVuY3Rpb24gdG8gcHJvY2VzcyBvbldvcmtEb25lIHJlY2VpdmVkIGJ5IExpc3RlbmVyCisgICAgdm9pZCBoYW5kbGVXb3JrRG9uZShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IHdvcmtJdGVtcykgeworICAgICAgICAgICAgaWYgKCF3b3JrLT53b3JrbGV0cy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgLy8gRm9yIGRlY29kZXIgY29tcG9uZW50cyBjdXJyZW50IHRpbWVzdGFtcCBhbHdheXMgZXhjZWVkcworICAgICAgICAgICAgICAgIC8vIHByZXZpb3VzIHRpbWVzdGFtcAorICAgICAgICAgICAgICAgIGJvb2wgY29kZWNDb25maWcgPSAoKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwKTsKKyAgICAgICAgICAgICAgICBpZiAoIWNvZGVjQ29uZmlnICYmCisgICAgICAgICAgICAgICAgICAgICF3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIEVYUEVDVF9HRSh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBVcyk7CisgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBVcyA9CisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmFuZ2VMZW5ndGggPQorICAgICAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCkuY2FwYWNpdHkoKTsKKyAgICAgICAgICAgICAgICAgICAgLy9MaXN0IG9mIHRpbWVzdGFtcCB2YWx1ZXMgYW5kIG91dHB1dCBzaXplIHRvIGNhbGN1bGF0ZSB0aW1lc3RhbXAKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1UaW1lc3RhbXBEZXZUZXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRNZXRhRGF0YSBtZXRhID0ge21UaW1lc3RhbXBVcywgcmFuZ2VMZW5ndGh9OworICAgICAgICAgICAgICAgICAgICAgICAgb0J1ZmZlck1ldGFEYXRhLnB1c2hfYmFjayhtZXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBib29sIG1Dc2QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB3b3JrRG9uZShtQ29tcG9uZW50LCB3b3JrLCBtRmx1c2hlZEluZGljZXMsIG1RdWV1ZUxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRW9zLCBtQ3NkLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNSZWNlaXZlZCk7CisgICAgICAgICAgICAgICAgKHZvaWQpbUNzZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGVudW0gc3RhbmRhcmRDb21wIHsKKyAgICAgICAgeGFhYywKKyAgICAgICAgbXAzLAorICAgICAgICBhbXJuYiwKKyAgICAgICAgYW1yd2IsCisgICAgICAgIGFhYywKKyAgICAgICAgdm9yYmlzLAorICAgICAgICBvcHVzLAorICAgICAgICBwY20sCisgICAgICAgIGc3MTFhbGF3LAorICAgICAgICBnNzExbWxhdywKKyAgICAgICAgZ3NtLAorICAgICAgICByYXcsCisgICAgICAgIGZsYWMsCisgICAgICAgIHVua25vd25fY29tcCwKKyAgICB9OworCisgICAgYm9vbCBtRW9zOworICAgIGJvb2wgbURpc2FibGVUZXN0OworICAgIGJvb2wgbVRpbWVzdGFtcERldlRlc3Q7CisgICAgc3RhbmRhcmRDb21wIG1Db21wTmFtZTsKKyAgICB1aW50NjRfdCBtVGltZXN0YW1wVXM7CisgICAgdWludDMyX3QgbUZyYW1lc1JlY2VpdmVkOworICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4gbUZsdXNoZWRJbmRpY2VzOworICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4gbVRpbWVzdGFtcFVzbGlzdDsKKyAgICA6OmFuZHJvaWQ6Okxpc3Q8b3V0cHV0TWV0YURhdGE+IG9CdWZmZXJNZXRhRGF0YTsKKworICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG1CbG9ja1Bvb2xJZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1MaW5lYXJQb29sOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUxpbmVhckFsbG9jYXRvcjsKKworICAgIHN0ZDo6bXV0ZXggbVF1ZXVlTG9jazsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUXVldWVDb25kaXRpb247CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBtV29ya1F1ZXVlOworCisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudD4gbUNsaWVudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gbUNvbXBvbmVudDsKKworICAgcHJvdGVjdGVkOgorICAgIHN0YXRpYyB2b2lkIGRlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdGlvbikgeworICAgICAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgICAgfQorfTsKKwordm9pZCB2YWxpZGF0ZUNvbXBvbmVudCgKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXBOYW1lLCBib29sJiBkaXNhYmxlVGVzdCkgeworICAgIC8vIFZhbGlkYXRlIGl0cyBhIEMyIENvbXBvbmVudAorICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJjMiIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFMT0dFKCJOb3QgYSBjMiBjb21wb25lbnQiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgaXRzIG5vdCBhbiBlbmNvZGVyIGFuZCB0aGUgY29tcG9uZW50IHRvIGJlIHRlc3RlZCBpcyBhdWRpbworICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJlbmNvZGVyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0UoIkV4cGVjdGVkIERlY29kZXIsIGdpdmVuIEVuY29kZXIiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBjMl9zdGF0dXNfdCBjMmVyciA9CisgICAgICAgIGNvbXBvbmVudC0+cXVlcnkoe30sIHtDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6UEFSQU1fVFlQRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywgJnF1ZXJpZWQpOworICAgIGlmIChjMmVyciAhPSBDMl9PSyAmJiBxdWVyaWVkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJRdWVyeSBtZWRpYSB0eXBlIGZhaWxlZCA9PiAlZCIsIGMyZXJyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OnN0cmluZyBpbnB1dERvbWFpbiA9CisgICAgICAgICAgICAoKEMyU3RyZWFtTWVkaWFUeXBlU2V0dGluZzo6aW5wdXQqKXF1ZXJpZWRbMF0uZ2V0KCkpLT5tLnZhbHVlOworICAgICAgICBpZiAoaW5wdXREb21haW4uZmluZCgiYXVkaW8vIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBBdWRpbyBDb21wb25lbnQiKTsKKyAgICAgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFZhbGlkYXRlcyBjb21wb25lbnQgbmFtZQorICAgIGlmIChjb21wTmFtZSA9PSBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0Ojp1bmtub3duX2NvbXApIHsKKyAgICAgICAgQUxPR0UoIkNvbXBvbmVudCBJblZhbGlkIik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigiQ29tcG9uZW50IFZhbGlkIik7Cit9CisKKy8vIFNldCBEZWZhdWx0IGNvbmZpZyBwYXJhbS4KK2Jvb2wgc2V0dXBDb25maWdQYXJhbSgKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgaW50MzJfdCogYml0U3RyZWFtSW5mbykgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQgc2FtcGxlUmF0ZUluZm8oMHUsIGJpdFN0cmVhbUluZm9bMF0pOworICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIGJpdFN0cmVhbUluZm9bMV0pOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IGNvbmZpZ1BhcmFteyZzYW1wbGVSYXRlSW5mbywgJmNoYW5uZWxDb3VudEluZm99OworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgIGNvbXBvbmVudC0+Y29uZmlnKGNvbmZpZ1BhcmFtLCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIGlmIChzdGF0dXMgPT0gQzJfT0sgJiYgZmFpbHVyZXMuc2l6ZSgpID09IDB1KSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIEluIGRlY29kZXIgY29tcG9uZW50cywgb2Z0ZW4gdGhlIGlucHV0IHBhcmFtZXRlcnMgZ2V0IHVwZGF0ZWQgdXBvbgorLy8gcGFyc2luZyB0aGUgaGVhZGVyIG9mIGVsZW1lbnRhcnkgc3RyZWFtLiBDbGllbnQgbmVlZHMgdG8gY29sbGVjdCB0aGlzCisvLyBpbmZvcm1hdGlvbiBhbmQgcmVjb25maWd1cmUKK3ZvaWQgZ2V0SW5wdXRDaGFubmVsSW5mbygKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXBOYW1lLCBpbnQzMl90KiBiaXRTdHJlYW1JbmZvKSB7CisgICAgLy8gcXVlcnkgblNhbXBsZVJhdGUgYW5kIG5DaGFubmVscworICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxDMlBhcmFtOjpJbmRleD4gaW5kaWNlc3sKKyAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKKyAgICB9OworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gaW5QYXJhbXM7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgY29tcG9uZW50LT5xdWVyeSh7fSwgaW5kaWNlcywgQzJfRE9OVF9CTE9DSywgJmluUGFyYW1zKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LICYmIGluUGFyYW1zLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJRdWVyeSBtZWRpYSB0eXBlIGZhaWxlZCA9PiAlZCIsIHN0YXR1cyk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gc2l6ZW9mKEMyUGFyYW0pOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluUGFyYW1zLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBDMlBhcmFtKiBwYXJhbSA9IGluUGFyYW1zW2ldLmdldCgpOworICAgICAgICAgICAgYml0U3RyZWFtSW5mb1tpXSA9ICooaW50MzJfdCopKCh1aW50OF90KilwYXJhbSArIG9mZnNldCk7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoIChjb21wTmFtZSkgeworICAgICAgICAgICAgY2FzZSBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjphbXJuYjogeworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShiaXRTdHJlYW1JbmZvWzBdLCA4MDAwKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoYml0U3RyZWFtSW5mb1sxXSwgMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OmFtcndiOiB7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKGJpdFN0cmVhbUluZm9bMF0sIDE2MDAwKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoYml0U3RyZWFtSW5mb1sxXSwgMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OmdzbTogeworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShiaXRTdHJlYW1JbmZvWzBdLCA4MDAwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIG51bWJlciBvZiBlbGVtZW50YXJ5IHN0cmVhbXMgcGVyIGNvbXBvbmVudAorI2RlZmluZSBTVFJFQU1fQ09VTlQgMgorCisvLyBMb29rVXBUYWJsZSBvZiBjbGlwcyBhbmQgbWV0YWRhdGEgZm9yIGNvbXBvbmVudCB0ZXN0aW5nCit2b2lkIEdldFVSTEZvckNvbXBvbmVudChDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcCwgY2hhciogbVVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGluZm8sIHNpemVfdCBzdHJlYW1JbmRleCA9IDApIHsKKyAgICBzdHJ1Y3QgQ29tcFRvVVJMIHsKKyAgICAgICAgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXA7CisgICAgICAgIGNvbnN0IGNoYXIgbVVSTFtTVFJFQU1fQ09VTlRdWzUxMl07CisgICAgICAgIGNvbnN0IGNoYXIgaW5mb1tTVFJFQU1fQ09VTlRdWzUxMl07CisgICAgfTsKKyAgICBBU1NFUlRfVFJVRShzdHJlYW1JbmRleCA8IFNUUkVBTV9DT1VOVCk7CisKKyAgICBzdGF0aWMgY29uc3QgQ29tcFRvVVJMIGtDb21wVG9VUkxbXSA9IHsKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6eGFhYywKKyAgICAgICAgIHsiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmFhYyIsCisgICAgICAgICAgImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5hYWMifSwKKyAgICAgICAgIHsiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8iLAorICAgICAgICAgICJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHpfbXVsdGlfZnJhbWUuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6bXAzLAorICAgICAgICAgeyJiYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHoubXAzIiwKKyAgICAgICAgICAiYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6Lm1wMyJ9LAorICAgICAgICAgeyJiYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHouaW5mbyIsCisgICAgICAgICAgImJiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoel9tdWx0aV9mcmFtZS5pbmZvIn19LAorICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphYWMsCisgICAgICAgICB7ImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5hYWMiLAorICAgICAgICAgICJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouYWFjIn0sCisgICAgICAgICB7ImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIiwKKyAgICAgICAgICAiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6X211bHRpX2ZyYW1lLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmFtcm5iLAorICAgICAgICAgeyJzaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmFtcm5iIiwKKyAgICAgICAgICAic2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoei5hbXJuYiJ9LAorICAgICAgICAgeyJzaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmluZm8iLAorICAgICAgICAgICJzaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6X211bHRpX2ZyYW1lLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmFtcndiLAorICAgICAgICAgeyJiYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmFtcndiIiwKKyAgICAgICAgICAiYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5hbXJ3YiJ9LAorICAgICAgICAgeyJiYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmluZm8iLAorICAgICAgICAgICJiYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6X211bHRpX2ZyYW1lLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OnZvcmJpcywKKyAgICAgICAgIHsiYmJiX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LnZvcmJpcyIsICIifSwKKyAgICAgICAgIHsiYmJiX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8iLCAiIn19LAorICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpvcHVzLAorICAgICAgICAgeyJiYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6Lm9wdXMiLCAiIn0sCisgICAgICAgICB7ImJiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyIsICIifX0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6Omc3MTFhbGF3LAorICAgICAgICAgeyJiYmJfZzcxMWFsYXdfMWNoXzhraHoucmF3IiwgIiJ9LAorICAgICAgICAgeyJiYmJfZzcxMWFsYXdfMWNoXzhraHouaW5mbyIsICIifX0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6Omc3MTFtbGF3LAorICAgICAgICAgeyJiYmJfZzcxMW11bGF3XzFjaF84a2h6LnJhdyIsICIifSwKKyAgICAgICAgIHsiYmJiX2c3MTFtdWxhd18xY2hfOGtoei5pbmZvIiwgIiJ9fSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6Z3NtLAorICAgICAgICAgeyJiYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5yYXciLCAiIn0sCisgICAgICAgICB7ImJiYl9nc21fMWNoXzhraHpfMTNrYnBzLmluZm8iLCAiIn19LAorICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpyYXcsCisgICAgICAgICB7ImJiYl9yYXdfMWNoXzhraHpfczMybGUucmF3IiwgIiJ9LAorICAgICAgICAgeyJiYmJfcmF3XzFjaF84a2h6X3MzMmxlLmluZm8iLCAiIn19LAorICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpmbGFjLAorICAgICAgICAgeyJiYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmZsYWMiLCAiIn0sCisgICAgICAgICB7ImJiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouaW5mbyIsICIifX0sCisgICAgfTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKGtDb21wVG9VUkwpIC8gc2l6ZW9mKGtDb21wVG9VUkxbMF0pOyArK2kpIHsKKyAgICAgICAgaWYgKGtDb21wVG9VUkxbaV0uY29tcCA9PSBjb21wKSB7CisgICAgICAgICAgICBzdHJjYXQobVVSTCwga0NvbXBUb1VSTFtpXS5tVVJMW3N0cmVhbUluZGV4XSk7CisgICAgICAgICAgICBzdHJjYXQoaW5mbywga0NvbXBUb1VSTFtpXS5pbmZvW3N0cmVhbUluZGV4XSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgZGVjb2RlTkZyYW1lcyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgc3RkOjptdXRleCAmcXVldWVMb2NrLCBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSYgcXVldWVDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4mIGZsdXNoZWRJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIGxpbmVhclBvb2wsCisgICAgICAgICAgICAgICAgICAgc3RkOjppZnN0cmVhbSYgZWxlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+KiBJbmZvLAorICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsIGludCByYW5nZSwgYm9vbCBzaWduYWxFT1MgPSB0cnVlKSB7CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIGludCBmcmFtZUlEID0gb2Zmc2V0OworICAgIGludCBtYXhSZXRyeSA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKGZyYW1lSUQgPT0gKGludClJbmZvLT5zaXplKCkgfHwgZnJhbWVJRCA9PSAob2Zmc2V0ICsgcmFuZ2UpKSBicmVhazsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgICAgICAvLyBQcmVwYXJlIEMyV29yaworICAgICAgICB3aGlsZSAoIXdvcmsgJiYgKG1heFJldHJ5IDwgTUFYX1JFVFJZKSkgeworICAgICAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICAgICAgaWYgKCF3b3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHdvcmsuc3dhcCh3b3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICAgICAgd29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBxdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgICAgICAgICAgbWF4UmV0cnkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXdvcmsgJiYgKG1heFJldHJ5ID49IE1BWF9SRVRSWSkpIHsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAiV2FpdCBmb3IgZ2VuZXJhdGluZyBDMldvcmsgZXhjZWVkZWQgdGltZW91dCI7CisgICAgICAgIH0KKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAgPSAoKkluZm8pW2ZyYW1lSURdLnRpbWVzdGFtcDsKKyAgICAgICAgaWYgKCgqSW5mbylbZnJhbWVJRF0uZmxhZ3MpIGZsYWdzID0gMXUgPDwgKCgqSW5mbylbZnJhbWVJRF0uZmxhZ3MgLSAxKTsKKyAgICAgICAgaWYgKHNpZ25hbEVPUyAmJiAoKGZyYW1lSUQgPT0gKGludClJbmZvLT5zaXplKCkgLSAxKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJhbWVJRCA9PSAob2Zmc2V0ICsgcmFuZ2UgLSAxKSkpKQorICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKworICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IGZyYW1lSUQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgICAgIGZsdXNoZWRJbmRpY2VzLmVtcGxhY2VfYmFjayhmcmFtZUlEKTsKKyAgICAgICAgfQorICAgICAgICBpbnQgc2l6ZSA9ICgqSW5mbylbZnJhbWVJRF0uYnl0ZXNDb3VudDsKKyAgICAgICAgY2hhciogZGF0YSA9IChjaGFyKiltYWxsb2Moc2l6ZSk7CisgICAgICAgIEFTU0VSVF9ORShkYXRhLCBudWxscHRyKTsKKworICAgICAgICBlbGVTdHJlYW0ucmVhZChkYXRhLCBzaXplKTsKKyAgICAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5nY291bnQoKSwgc2l6ZSk7CisKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICBpZiAoc2l6ZSkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgICAgICAgICAgQVNTRVJUX0VRKEMyX09LLAorICAgICAgICAgICAgICAgICAgICBsaW5lYXJQb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSwge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9LAorICAgICAgICAgICAgICAgICAgICAgICAgJmJsb2NrKSk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShibG9jayk7CisKKyAgICAgICAgICAgIC8vIFdyaXRlIFZpZXcKKyAgICAgICAgICAgIEMyV3JpdGVWaWV3IHZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgICAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDMkxpbmVhckJsb2NrOjptYXAoKSBmYWlsZWQgOiAlZCIsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBU1NFUlRfRVEoKHNpemVfdClzaXplLCB2aWV3LmNhcGFjaXR5KCkpOworICAgICAgICAgICAgQVNTRVJUX0VRKDB1LCB2aWV3Lm9mZnNldCgpKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUSgoc2l6ZV90KXNpemUsIHZpZXcuc2l6ZSgpKTsKKworICAgICAgICAgICAgbWVtY3B5KHZpZXcuYmFzZSgpLCBkYXRhLCBzaXplKTsKKworICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5lbXBsYWNlX2JhY2sobmV3IExpbmVhckJ1ZmZlcihibG9jaykpOworICAgICAgICAgICAgZnJlZShkYXRhKTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICAgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisKKyAgICAgICAgLy8gRE8gVEhFIERFQ09ESU5HCisgICAgICAgIEFTU0VSVF9FUShjb21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKyAgICAgICAgQUxPR1YoIkZyYW1lICMlZCBzaXplID0gJWQgcXVldWVkIiwgZnJhbWVJRCwgc2l6ZSk7CisgICAgICAgIGZyYW1lSUQrKzsKKyAgICAgICAgbWF4UmV0cnkgPSAwOworICAgIH0KK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QsIHZhbGlkYXRlQ29tcE5hbWUpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQUxPR1YoIkNoZWNrcyBpZiB0aGUgZ2l2ZW4gY29tcG9uZW50IGlzIGEgdmFsaWQgYXVkaW8gY29tcG9uZW50Iik7CisgICAgdmFsaWRhdGVDb21wb25lbnQobUNvbXBvbmVudCwgbUNvbXBOYW1lLCBtRGlzYWJsZVRlc3QpOworICAgIEFTU0VSVF9FUShtRGlzYWJsZVRlc3QsIGZhbHNlKTsKK30KKworVEVTVF9GKENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QsIGNvbmZpZ0NvbXApIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdHMgY29tcG9uZW50IHNwZWNpZmljIGNvbmZpZ3VyYXRpb24iKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBpbnQzMl90IGJpdFN0cmVhbUluZm9bMl0gPSB7MH07CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbUNvbXBOYW1lLCBiaXRTdHJlYW1JbmZvKSk7CisgICAgc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBiaXRTdHJlYW1JbmZvKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK2NsYXNzIENvZGVjMkF1ZGlvRGVjRGVjb2RlVGVzdAorICAgIDogcHVibGljIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3QsCisgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8c3RkOjpwYWlyPGludDMyX3QsIGJvb2w+PiB7Cit9OworCitURVNUX1AoQ29kZWMyQXVkaW9EZWNEZWNvZGVUZXN0LCBEZWNvZGVUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIkRlY29kZXMgaW5wdXQgZmlsZSIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIHVpbnQzMl90IHN0cmVhbUluZGV4ID0gR2V0UGFyYW0oKS5maXJzdDsKKyAgICBib29sIHNpZ25hbEVPUyA9IEdldFBhcmFtKCkuc2Vjb25kOworICAgIG1UaW1lc3RhbXBEZXZUZXN0ID0gdHJ1ZTsKKyAgICBjaGFyIG1VUkxbNTEyXSwgaW5mb1s1MTJdOworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtLCBlbGVJbmZvOworCisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIHN0cmNweShpbmZvLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvLCBzdHJlYW1JbmRleCk7CisgICAgaWYgKCFzdHJjbXAobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSkpIHsKKyAgICAgICAgQUxPR1YoIkVNUFRZIElOUFVUIGdFbnYtPmdldFJlcygpLmNfc3RyKCkgJXMgbVVSTCAgJXMgIiwKKyAgICAgICAgICAgICAgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSwgbVVSTCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBlbGVJbmZvLm9wZW4oaW5mbyk7CisgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiBJbmZvOworICAgIGludCBieXRlc0NvdW50ID0gMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgdWludDMyX3QgdGltZXN0YW1wID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoIShlbGVJbmZvID4+IGJ5dGVzQ291bnQpKSBicmVhazsKKyAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgZWxlSW5mbyA+PiB0aW1lc3RhbXA7CisgICAgICAgIGJvb2wgY29kZWNDb25maWcgPQorICAgICAgICAgICAgKCgxIDw8IChmbGFncyAtIDEpKSAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMDsKKyAgICAgICAgaWYgKG1UaW1lc3RhbXBEZXZUZXN0ICYmICFjb2RlY0NvbmZpZykKKyAgICAgICAgICAgIG1UaW1lc3RhbXBVc2xpc3QucHVzaF9iYWNrKHRpbWVzdGFtcCk7CisgICAgICAgIEluZm8ucHVzaF9iYWNrKHtieXRlc0NvdW50LCBmbGFncywgdGltZXN0YW1wfSk7CisgICAgfQorICAgIGVsZUluZm8uY2xvc2UoKTsKKyAgICAvLyBSZXNldCB0b3RhbCBubyBvZiBmcmFtZXMgcmVjZWl2ZWQKKyAgICBtRnJhbWVzUmVjZWl2ZWQgPSAwOworICAgIG1UaW1lc3RhbXBVcyA9IDA7CisgICAgaW50MzJfdCBiaXRTdHJlYW1JbmZvWzJdID0gezB9OworICAgIGlmIChtQ29tcE5hbWUgPT0gcmF3KSB7CisgICAgICAgIGJpdFN0cmVhbUluZm9bMF0gPSA4MDAwOworICAgICAgICBiaXRTdHJlYW1JbmZvWzFdID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbUNvbXBOYW1lLCBiaXRTdHJlYW1JbmZvKSk7CisgICAgfQorICAgIGlmICghc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBiaXRTdHJlYW1JbmZvKSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGRlY29kZU5GcmFtZXMoCisgICAgICAgIG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUZsdXNoZWRJbmRpY2VzLAorICAgICAgICBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgMCwgKGludClJbmZvLnNpemUoKSwgc2lnbmFsRU9TKSk7CisKKyAgICAvLyBJZiBFT1MgaXMgbm90IHNlbnQsIHNlbmRpbmcgZW1wdHkgaW5wdXQgd2l0aCBFT1MgZmxhZworICAgIHNpemVfdCBpbmZvU2l6ZSA9IEluZm8uc2l6ZSgpOworICAgIGlmICghc2lnbmFsRU9TKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIDEpKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICB0ZXN0SW5wdXRCdWZmZXIobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNLCBmYWxzZSkpOworICAgICAgICBpbmZvU2l6ZSArPSAxOworICAgIH0KKyAgICAvLyBibG9ja2luZyBjYWxsIHRvIGVuc3VyZXMgYXBwbGljYXRpb24gdG8gV2FpdCB0aWxsIGFsbCB0aGUgaW5wdXRzIGFyZQorICAgIC8vIGNvbnN1bWVkCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgaWYgKG1GcmFtZXNSZWNlaXZlZCAhPSBpbmZvU2l6ZSkgeworICAgICAgICBBTE9HRSgiSW5wdXQgYnVmZmVyIGNvdW50IGFuZCBPdXRwdXQgYnVmZmVyIGNvdW50IG1pc21hdGNoIik7CisgICAgICAgIEFMT0dFKCJmcmFtZXNSZWNlaXZlZCA6ICVkIGlucHV0RnJhbWVzIDogJXp1IiwgbUZyYW1lc1JlY2VpdmVkLAorICAgICAgICAgICAgICBpbmZvU2l6ZSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIGlmIChtVGltZXN0YW1wRGV2VGVzdCkgeworICAgICAgICB1aW50NjRfdCBleHBUczsKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlc1JlY2VpdmVkID0gMDsKKyAgICAgICAgLy8gVXBkYXRlIFNhbXBsZVJhdGUgYW5kIENoYW5uZWxDb3VudAorICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbUNvbXBOYW1lLCBiaXRTdHJlYW1JbmZvKSk7CisgICAgICAgIGludCBuU2FtcGxlUmF0ZSA9IGJpdFN0cmVhbUluZm9bMF07CisgICAgICAgIGludCBuQ2hhbm5lbHMgPSBiaXRTdHJlYW1JbmZvWzFdOworICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBpdEluID0gbVRpbWVzdGFtcFVzbGlzdC5iZWdpbigpOworICAgICAgICBhbmRyb2lkOjpMaXN0PG91dHB1dE1ldGFEYXRhPjo6aXRlcmF0b3IgaXRPdXQgPSBvQnVmZmVyTWV0YURhdGEuYmVnaW4oKTsKKyAgICAgICAgRVhQRUNUX0VRKCppdEluLCBpdE91dC0+dGltZXN0YW1wVXMpOworICAgICAgICBleHBUcyA9ICppdEluOworICAgICAgICB3aGlsZSAoaXRPdXQgIT0gb0J1ZmZlck1ldGFEYXRhLmVuZCgpKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoZXhwVHMsIGl0T3V0LT50aW1lc3RhbXBVcyk7CisgICAgICAgICAgICBpZiAoZXhwVHMgIT0gaXRPdXQtPnRpbWVzdGFtcFVzKSBicmVhazsKKyAgICAgICAgICAgIC8vIGJ1ZmZlciBzYW1wbGVzID0gKCh0b3RhbCBieXRlcykgLyAoYWMgKiAoYml0cyBwZXIgc2FtcGxlIC8gOCkpCisgICAgICAgICAgICBzYW1wbGVzUmVjZWl2ZWQgKz0gKChpdE91dC0+cmFuZ2VMZW5ndGgpIC8gKG5DaGFubmVscyAqIDIpKTsKKyAgICAgICAgICAgIGV4cFRzID0gc2FtcGxlc1JlY2VpdmVkICogMTAwMDAwMGxsIC8gblNhbXBsZVJhdGU7CisgICAgICAgICAgICBpdE91dCsrOworICAgICAgICB9CisgICAgICAgIGl0SW4gPSBtVGltZXN0YW1wVXNsaXN0LmVuZCgpOworICAgICAgICAtLWl0SW47CisgICAgICAgIEVYUEVDVF9HVChleHBUcywgKml0SW4pOworICAgICAgICBvQnVmZmVyTWV0YURhdGEuY2xlYXIoKTsKKyAgICAgICAgbVRpbWVzdGFtcFVzbGlzdC5jbGVhcigpOworICAgIH0KKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisvLyBEZWNvZGVUZXN0IHdpdGggU3RyZWFtSW5kZXggYW5kIEVPUyAvIE5vIEVPUworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU3RyZWFtSW5kZXhBbmRFT1MsIENvZGVjMkF1ZGlvRGVjRGVjb2RlVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKHN0ZDo6bWFrZV9wYWlyKDAsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKDAsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoMSwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoMSwgdHJ1ZSkpKTsKKworLy8gdGh1bWJuYWlsIHRlc3QKK1RFU1RfRihDb2RlYzJBdWRpb0RlY0hpZGxUZXN0LCBUaHVtYm5haWxUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3QgUmVxdWVzdCBmb3IgdGh1bWJuYWlsIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgY2hhciBtVVJMWzUxMl0sIGluZm9bNTEyXTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbSwgZWxlSW5mbzsKKworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBzdHJjcHkoaW5mbywgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbyk7CisKKyAgICBlbGVJbmZvLm9wZW4oaW5mbyk7CisgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiBJbmZvOworICAgIGludCBieXRlc0NvdW50ID0gMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgdWludDMyX3QgdGltZXN0YW1wID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoIShlbGVJbmZvID4+IGJ5dGVzQ291bnQpKSBicmVhazsKKyAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgZWxlSW5mbyA+PiB0aW1lc3RhbXA7CisgICAgICAgIEluZm8ucHVzaF9iYWNrKHtieXRlc0NvdW50LCBmbGFncywgdGltZXN0YW1wfSk7CisgICAgfQorICAgIGVsZUluZm8uY2xvc2UoKTsKKyAgICBpbnQzMl90IGJpdFN0cmVhbUluZm9bMl0gPSB7MH07CisgICAgaWYgKG1Db21wTmFtZSA9PSByYXcpIHsKKyAgICAgICAgYml0U3RyZWFtSW5mb1swXSA9IDgwMDA7CisgICAgICAgIGJpdFN0cmVhbUluZm9bMV0gPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgZ2V0SW5wdXRDaGFubmVsSW5mbyhtQ29tcG9uZW50LCBtQ29tcE5hbWUsIGJpdFN0cmVhbUluZm8pKTsKKyAgICB9CisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIGJpdFN0cmVhbUluZm8pKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisKKyAgICAvLyByZXF1ZXN0IEVPUyBmb3IgdGh1bWJuYWlsCisgICAgLy8gc2lnbmFsIEVPUyBmbGFnIHdpdGggbGFzdCBmcmFtZQorICAgIHNpemVfdCBpID0gLTE7CisgICAgZG8geworICAgICAgICBpKys7CisgICAgICAgIGZsYWdzID0gMDsKKyAgICAgICAgaWYgKEluZm9baV0uZmxhZ3MpIGZsYWdzID0gMXUgPDwgKEluZm9baV0uZmxhZ3MgLSAxKTsKKworICAgIH0gd2hpbGUgKCEoZmxhZ3MgJiBTWU5DX0ZSQU1FKSk7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZGVjb2RlTkZyYW1lcygKKyAgICAgICAgbUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRmx1c2hlZEluZGljZXMsCisgICAgICAgIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sICZJbmZvLCAwLCBpICsgMSkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIEVYUEVDVF9HRShtRnJhbWVzUmVjZWl2ZWQsIDFVKTsKKyAgICBBU1NFUlRfRVEobUVvcywgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCwgRU9TVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0IGVtcHR5IGlucHV0IGJ1ZmZlciB3aXRoIEVPUyBmbGFnIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgLy8gUHJlcGFyZSBDMldvcmsKKyAgICB7CisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGlmICghbVdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICB3b3JrLnN3YXAobVdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgIG1Xb3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIm1Xb3JrUXVldWUgRW1wdHkgYXQgdGhlIHN0YXJ0IG9mIHRlc3QiOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKworICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KUMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSAwOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IDA7CisgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+cXVldWUoJml0ZW1zKSwgQzJfT0spOworCisgICAgeworICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBpZiAobVdvcmtRdWV1ZS5zaXplKCkgIT0gTUFYX0lOUFVUX0JVRkZFUlMpIHsKKyAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtV29ya1F1ZXVlLnNpemUoKSwgKHNpemVfdClNQVhfSU5QVVRfQlVGRkVSUyk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCwgRmx1c2hUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3RzIEZsdXNoIGNhbGxzIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICBjaGFyIG1VUkxbNTEyXSwgaW5mb1s1MTJdOworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtLCBlbGVJbmZvOworCisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIHN0cmNweShpbmZvLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvKTsKKworICAgIGVsZUluZm8ub3BlbihpbmZvKTsKKyAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOworICAgICAgICBlbGVJbmZvID4+IGZsYWdzOworICAgICAgICBlbGVJbmZvID4+IHRpbWVzdGFtcDsKKyAgICAgICAgSW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICB9CisgICAgZWxlSW5mby5jbG9zZSgpOworICAgIGludDMyX3QgYml0U3RyZWFtSW5mb1syXSA9IHswfTsKKyAgICBpZiAobUNvbXBOYW1lID09IHJhdykgeworICAgICAgICBiaXRTdHJlYW1JbmZvWzBdID0gODAwMDsKKyAgICAgICAgYml0U3RyZWFtSW5mb1sxXSA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICBnZXRJbnB1dENoYW5uZWxJbmZvKG1Db21wb25lbnQsIG1Db21wTmFtZSwgYml0U3RyZWFtSW5mbykpOworICAgIH0KKyAgICBpZiAoIXNldHVwQ29uZmlnUGFyYW0obUNvbXBvbmVudCwgYml0U3RyZWFtSW5mbykpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkIFxuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICAvLyBEZWNvZGUgMTI4IGZyYW1lcyBhbmQgZmx1c2guIGhlcmUgMTI4IGlzIGNob3NlbiB0byBlbnN1cmUgdGhlcmUgaXMgYSBrZXkKKyAgICAvLyBmcmFtZSBhZnRlciB0aGlzIHNvIHRoYXQgdGhlIGJlbG93IHNlY3Rpb24gY2FuIGJlIGNvdmVyZWQgZm9yIGFsbAorICAgIC8vIGNvbXBvbmVudHMKKyAgICB1aW50MzJfdCBudW1GcmFtZXNGbHVzaGVkID0gMTI4OworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGRlY29kZU5GcmFtZXMoCisgICAgICAgIG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUZsdXNoZWRJbmRpY2VzLAorICAgICAgICBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgMCwgbnVtRnJhbWVzRmx1c2hlZCwgZmFsc2UpKTsKKyAgICAvLyBmbHVzaAorICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gZmx1c2hlZFdvcms7CisgICAgYzJfc3RhdHVzX3QgZXJyID0KKyAgICAgICAgbUNvbXBvbmVudC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgKHNpemVfdClNQVhfSU5QVVRfQlVGRkVSUyAtIGZsdXNoZWRXb3JrLnNpemUoKSkpOworICAgIHVpbnQ2NF90IGZyYW1lSW5kZXg7CisgICAgeworICAgICAgICAvL1VwZGF0ZSBtRmx1c2hlZEluZGljZXMgYmFzZWQgb24gdGhlIGluZGV4IHJlY2VpdmVkIGZyb20gZmx1c2goKQorICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogZmx1c2hlZFdvcmspIHsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICAgICAgICAgIGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD46Oml0ZXJhdG9yIGZyYW1lSW5kZXhJdCA9CisgICAgICAgICAgICAgICAgc3RkOjpmaW5kKG1GbHVzaGVkSW5kaWNlcy5iZWdpbigpLCBtRmx1c2hlZEluZGljZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lSW5kZXgpOworICAgICAgICAgICAgaWYgKCFtRmx1c2hlZEluZGljZXMuZW1wdHkoKSAmJgorICAgICAgICAgICAgICAgIChmcmFtZUluZGV4SXQgIT0gbUZsdXNoZWRJbmRpY2VzLmVuZCgpKSkgeworICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5lcmFzZShmcmFtZUluZGV4SXQpOworICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gU2VlayB0byBuZXh0IGtleSBmcmFtZSBhbmQgc3RhcnQgZGVjb2RpbmcgdGlsbCB0aGUgZW5kCisgICAgbUZsdXNoZWRJbmRpY2VzLmNsZWFyKCk7CisgICAgaW50IGluZGV4ID0gbnVtRnJhbWVzRmx1c2hlZDsKKyAgICBib29sIGtleUZyYW1lID0gZmFsc2U7CisgICAgZmxhZ3MgPSAwOworICAgIHdoaWxlIChpbmRleCA8IChpbnQpSW5mby5zaXplKCkpIHsKKyAgICAgICAgaWYgKEluZm9baW5kZXhdLmZsYWdzKSBmbGFncyA9IDF1IDw8IChJbmZvW2luZGV4XS5mbGFncyAtIDEpOworICAgICAgICBpZiAoKGZsYWdzICYgU1lOQ19GUkFNRSkgPT0gU1lOQ19GUkFNRSkgeworICAgICAgICAgICAga2V5RnJhbWUgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZmxhZ3MgPSAwOworICAgICAgICBlbGVTdHJlYW0uaWdub3JlKEluZm9baW5kZXhdLmJ5dGVzQ291bnQpOworICAgICAgICBpbmRleCsrOworICAgIH0KKyAgICBpZiAoa2V5RnJhbWUpIHsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICBkZWNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpSW5mby5zaXplKCkgLSBpbmRleCkpOworICAgIH0KKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBlcnIgPQorICAgICAgICBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAoc2l6ZV90KU1BWF9JTlBVVF9CVUZGRVJTIC0gZmx1c2hlZFdvcmsuc2l6ZSgpKSk7CisgICAgeworICAgICAgICAvL1VwZGF0ZSBtRmx1c2hlZEluZGljZXMgYmFzZWQgb24gdGhlIGluZGV4IHJlY2VpdmVkIGZyb20gZmx1c2goKQorICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogZmx1c2hlZFdvcmspIHsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICAgICAgICAgIGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD46Oml0ZXJhdG9yIGZyYW1lSW5kZXhJdCA9CisgICAgICAgICAgICAgICAgc3RkOjpmaW5kKG1GbHVzaGVkSW5kaWNlcy5iZWdpbigpLCBtRmx1c2hlZEluZGljZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lSW5kZXgpOworICAgICAgICAgICAgaWYgKCFtRmx1c2hlZEluZGljZXMuZW1wdHkoKSAmJgorICAgICAgICAgICAgICAgIChmcmFtZUluZGV4SXQgIT0gbUZsdXNoZWRJbmRpY2VzLmVuZCgpKSkgeworICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5lcmFzZShmcmFtZUluZGV4SXQpOworICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK1RFU1RfRihDb2RlYzJBdWRpb0RlY0hpZGxUZXN0LCBEZWNvZGVUZXN0RW1wdHlCdWZmZXJzSW5zZXJ0ZWQpIHsKKyAgICBkZXNjcmlwdGlvbigiRGVjb2RlIHdpdGggbXVsdGlwbGUgZW1wdHkgaW5wdXQgZnJhbWVzIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgY2hhciBtVVJMWzUxMl0sIGluZm9bNTEyXTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbSwgZWxlSW5mbzsKKworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBzdHJjcHkoaW5mbywgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbyk7CisKKyAgICBlbGVJbmZvLm9wZW4oaW5mbyk7CisgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKSA8PCBtVVJMIDw8ICIgLSBmaWxlIG5vdCBmb3VuZCI7CisgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4gSW5mbzsKKyAgICBpbnQgYnl0ZXNDb3VudCA9IDA7CisgICAgdWludDMyX3QgZnJhbWVJZCA9IDA7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CisgICAgYm9vbCBjb2RlY0NvbmZpZyA9IGZhbHNlOworICAgIC8vIFRoaXMgdGVzdCBpbnRyb2R1Y2VzIGVtcHR5IENTRCBhZnRlciBldmVyeSAyMHRoIGZyYW1lCisgICAgLy8gYW5kIGVtcHR5IGlucHV0IGZyYW1lcyBhdCBhbiBpbnRlcnZhbCBvZiA1IGZyYW1lcy4KKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoIShmcmFtZUlkICUgNSkpIHsKKyAgICAgICAgICAgIGlmICghKGZyYW1lSWQgJSAyMCkpIGZsYWdzID0gMzI7CisgICAgICAgICAgICBlbHNlIGZsYWdzID0gMDsKKyAgICAgICAgICAgIGJ5dGVzQ291bnQgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCEoZWxlSW5mbyA+PiBieXRlc0NvdW50KSkgYnJlYWs7CisgICAgICAgICAgICBlbGVJbmZvID4+IGZsYWdzOworICAgICAgICAgICAgZWxlSW5mbyA+PiB0aW1lc3RhbXA7CisgICAgICAgICAgICBjb2RlY0NvbmZpZyA9IGZsYWdzID8KKyAgICAgICAgICAgICAgICAoKDEgPDwgKGZsYWdzIC0gMSkpICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwIDogMDsKKyAgICAgICAgfQorICAgICAgICBJbmZvLnB1c2hfYmFjayh7Ynl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcH0pOworICAgICAgICBmcmFtZUlkKys7CisgICAgfQorICAgIGVsZUluZm8uY2xvc2UoKTsKKyAgICBpbnQzMl90IGJpdFN0cmVhbUluZm9bMl0gPSB7MH07CisgICAgaWYgKG1Db21wTmFtZSA9PSByYXcpIHsKKyAgICAgICAgYml0U3RyZWFtSW5mb1swXSA9IDgwMDA7CisgICAgICAgIGJpdFN0cmVhbUluZm9bMV0gPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgZ2V0SW5wdXRDaGFubmVsSW5mbyhtQ29tcG9uZW50LCBtQ29tcE5hbWUsIGJpdFN0cmVhbUluZm8pKTsKKyAgICB9CisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIGJpdFN0cmVhbUluZm8pKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZGVjb2RlTkZyYW1lcygKKyAgICAgICAgbUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRmx1c2hlZEluZGljZXMsCisgICAgICAgIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sICZJbmZvLCAwLCAoaW50KUluZm8uc2l6ZSgpKSk7CisKKyAgICAvLyBibG9ja2luZyBjYWxsIHRvIGVuc3VyZXMgYXBwbGljYXRpb24gdG8gV2FpdCB0aWxsIGFsbCB0aGUgaW5wdXRzIGFyZQorICAgIC8vIGNvbnN1bWVkCisgICAgaWYgKCFtRW9zKSB7CisgICAgICAgIEFMT0dWKCJXYWl0aW5nIGZvciBpbnB1dCBjb25zdW1wdGlvbiIpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisgICAgfQorCisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgaWYgKG1GcmFtZXNSZWNlaXZlZCAhPSBJbmZvLnNpemUoKSkgeworICAgICAgICBBTE9HRSgiSW5wdXQgYnVmZmVyIGNvdW50IGFuZCBPdXRwdXQgYnVmZmVyIGNvdW50IG1pc21hdGNoIik7CisgICAgICAgIEFMT0dWKCJmcmFtZXNSZWNlaXZlZCA6ICVkIGlucHV0RnJhbWVzIDogJXp1IiwgbUZyYW1lc1JlY2VpdmVkLAorICAgICAgICAgICAgICBJbmZvLnNpemUoKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgZ0VudiA9IG5ldyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBnRW52LT5pbml0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBMT0coSU5GTykgPDwgIkMyIFRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vVnRzSGlkbEMyVjFfMFRhcmdldEF1ZGlvRW5jVGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vVnRzSGlkbEMyVjFfMFRhcmdldEF1ZGlvRW5jVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFiYWY3ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9WdHNIaWRsQzJWMV8wVGFyZ2V0QXVkaW9FbmNUZXN0LmNwcApAQCAtMCwwICsxLDY1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImNvZGVjMl9oaWRsX2hhbF9hdWRpb19lbmNfdGVzdCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgorCit1c2luZyBhbmRyb2lkOjpDMkFsbG9jYXRvcklvbjsKKworI2luY2x1ZGUgPFZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZS5oPgorI2luY2x1ZGUgIm1lZGlhX2MyX2F1ZGlvX2hpZGxfdGVzdF9jb21tb24uaCIKKyNpbmNsdWRlICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgiCisKK2NsYXNzIExpbmVhckJ1ZmZlciA6IHB1YmxpYyBDMkJ1ZmZlciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgTGluZWFyQnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiYgYmxvY2spCisgICAgICAgIDogQzJCdWZmZXIoCisgICAgICAgICAgICAgIHtibG9jay0+c2hhcmUoYmxvY2stPm9mZnNldCgpLCBibG9jay0+c2l6ZSgpLCA6OkMyRmVuY2UoKSl9KSB7fQorfTsKKworc3RhdGljIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCogZ0VudiA9IG51bGxwdHI7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIENvZGVjMkF1ZGlvRW5jSGlkbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgeworICAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIFN1cGVyOworCisgICBwdWJsaWM6CisgICAgOjpzdGQ6OnN0cmluZyBnZXRUZXN0Q2FzZUluZm8oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiA6OnN0ZDo6c3RyaW5nKCkgKworICAgICAgICAgICAgICAgICJDb21wb25lbnQ6ICIgKyBnRW52LT5nZXRDb21wb25lbnQoKS5jX3N0cigpICsgIiB8ICIgKworICAgICAgICAgICAgICAgICJJbnN0YW5jZTogIiArIGdFbnYtPmdldEluc3RhbmNlKCkuY19zdHIoKSArICIgfCAiICsKKyAgICAgICAgICAgICAgICAiUmVzOiAiICsgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKTsKKyAgICB9CisKKyAgICAvLyBnb29nbGUuY29kZWMyIEF1ZGlvIHRlc3Qgc2V0dXAKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIFN1cGVyOjpTZXRVcCgpOworICAgICAgICBtRGlzYWJsZVRlc3QgPSBmYWxzZTsKKyAgICAgICAgQUxPR1YoIkNvZGVjMkF1ZGlvRW5jSGlkbFRlc3QgU2V0VXAiKTsKKyAgICAgICAgbUNsaWVudCA9IGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkpOworICAgICAgICBBU1NFUlRfTkUobUNsaWVudCwgbnVsbHB0cik7CisgICAgICAgIG1MaXN0ZW5lci5yZXNldChuZXcgQ29kZWNMaXN0ZW5lcigKKyAgICAgICAgICAgIFt0aGlzXShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVXb3JrRG9uZSh3b3JrSXRlbXMpOworICAgICAgICAgICAgfSkpOworICAgICAgICBBU1NFUlRfTkUobUxpc3RlbmVyLCBudWxscHRyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSU5QVVRfQlVGRkVSUzsgKytpKSB7CisgICAgICAgICAgICBtV29ya1F1ZXVlLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrKTsKKyAgICAgICAgfQorICAgICAgICBtQ2xpZW50LT5jcmVhdGVDb21wb25lbnQoZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSwgbUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1Db21wb25lbnQpOworICAgICAgICBBU1NFUlRfTkUobUNvbXBvbmVudCwgbnVsbHB0cik7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IHN0b3JlID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OkdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICAgICAgQ0hFQ0tfRVEoc3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1MaW5lYXJBbGxvY2F0b3IpLAorICAgICAgICAgICAgICAgICBDMl9PSyk7CisgICAgICAgIG1MaW5lYXJQb29sID0gc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4obUxpbmVhckFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQmxvY2tQb29sSWQrKyk7CisgICAgICAgIEFTU0VSVF9ORShtTGluZWFyUG9vbCwgbnVsbHB0cik7CisKKyAgICAgICAgbUNvbXBOYW1lID0gdW5rbm93bl9jb21wOworICAgICAgICBzdHJ1Y3QgU3RyaW5nVG9OYW1lIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIE5hbWU7CisgICAgICAgICAgICBzdGFuZGFyZENvbXAgQ29tcE5hbWU7CisgICAgICAgIH07CisgICAgICAgIGNvbnN0IFN0cmluZ1RvTmFtZSBrU3RyaW5nVG9OYW1lW10gPSB7CisgICAgICAgICAgICB7ImFhYyIsIGFhY30sCisgICAgICAgICAgICB7ImZsYWMiLCBmbGFjfSwKKyAgICAgICAgICAgIHsib3B1cyIsIG9wdXN9LAorICAgICAgICAgICAgeyJhbXJuYiIsIGFtcm5ifSwKKyAgICAgICAgICAgIHsiYW1yd2IiLCBhbXJ3Yn0sCisgICAgICAgIH07CisgICAgICAgIGNvbnN0IHNpemVfdCBrTnVtU3RyaW5nVG9OYW1lID0KKyAgICAgICAgICAgIHNpemVvZihrU3RyaW5nVG9OYW1lKSAvIHNpemVvZihrU3RyaW5nVG9OYW1lWzBdKTsKKworICAgICAgICAvLyBGaW5kIHRoZSBjb21wb25lbnQgdHlwZQorICAgICAgICBzdGQ6OnN0cmluZyBjb21wID0gc3RkOjpzdHJpbmcoZ0Vudi0+Z2V0Q29tcG9uZW50KCkpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1TdHJpbmdUb05hbWU7ICsraSkgeworICAgICAgICAgICAgaWYgKHN0cmNhc2VzdHIoY29tcC5jX3N0cigpLCBrU3RyaW5nVG9OYW1lW2ldLk5hbWUpKSB7CisgICAgICAgICAgICAgICAgbUNvbXBOYW1lID0ga1N0cmluZ1RvTmFtZVtpXS5Db21wTmFtZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtRW9zID0gZmFsc2U7CisgICAgICAgIG1Dc2QgPSBmYWxzZTsKKyAgICAgICAgbUZyYW1lc1JlY2VpdmVkID0gMDsKKyAgICAgICAgaWYgKG1Db21wTmFtZSA9PSB1bmtub3duX2NvbXApIG1EaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIGlmIChtRGlzYWJsZVRlc3QpIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgRGlzYWJsZWQgXG4iOworICAgICAgICBnZXRJbnB1dE1heEJ1ZlNpemUoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQ29tcG9uZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmICg6OnRlc3Rpbmc6OlRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47CisgICAgICAgICAgICBtQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQ29tcG9uZW50ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBTdXBlcjo6VGVhckRvd24oKTsKKyAgICB9CisgICAgLy8gY2FsbGJhY2sgZnVuY3Rpb24gdG8gcHJvY2VzcyBvbldvcmtEb25lIHJlY2VpdmVkIGJ5IExpc3RlbmVyCisgICAgdm9pZCBoYW5kbGVXb3JrRG9uZShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IHdvcmtJdGVtcykgeworICAgICAgICAgICAgaWYgKCF3b3JrLT53b3JrbGV0cy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgd29ya0RvbmUobUNvbXBvbmVudCwgd29yaywgbUZsdXNoZWRJbmRpY2VzLCBtUXVldWVMb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUVvcywgbUNzZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzUmVjZWl2ZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVudW0gc3RhbmRhcmRDb21wIHsKKyAgICAgICAgYWFjLAorICAgICAgICBmbGFjLAorICAgICAgICBvcHVzLAorICAgICAgICBhbXJuYiwKKyAgICAgICAgYW1yd2IsCisgICAgICAgIHVua25vd25fY29tcCwKKyAgICB9OworCisgICAgYm9vbCBtRW9zOworICAgIGJvb2wgbUNzZDsKKyAgICBib29sIG1EaXNhYmxlVGVzdDsKKyAgICBzdGFuZGFyZENvbXAgbUNvbXBOYW1lOworICAgIHVpbnQzMl90IG1GcmFtZXNSZWNlaXZlZDsKKyAgICBpbnQzMl90IG1JbnB1dE1heEJ1ZlNpemU7CisgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiBtRmx1c2hlZEluZGljZXM7CisKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBtQmxvY2tQb29sSWQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtTGluZWFyUG9vbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1MaW5lYXJBbGxvY2F0b3I7CisKKyAgICBzdGQ6Om11dGV4IG1RdWV1ZUxvY2s7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbVF1ZXVlQ29uZGl0aW9uOworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gbVdvcmtRdWV1ZTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ+IG1DbGllbnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IG1Db21wb25lbnQ7CisKKyAgIHByb3RlY3RlZDoKKyAgICBzdGF0aWMgdm9pZCBkZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworICAgIH0KKworICAgIC8vIEluIGVuY29kZXIgY29tcG9uZW50cywgZmV0Y2ggdGhlIHNpemUgb2YgaW5wdXQgYnVmZmVyIGFsbG9jYXRlZAorICAgIHZvaWQgZ2V0SW5wdXRNYXhCdWZTaXplKCkgeworICAgICAgICBpbnQzMl90IGJpdFN0cmVhbUluZm9bMV0gPSB7MH07CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gaW5QYXJhbXM7CisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IG1Db21wb25lbnQtPnF1ZXJ5KAorICAgICAgICAgICAge30sIHtDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dDo6UEFSQU1fVFlQRX0sIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAmaW5QYXJhbXMpOworICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LICYmIGluUGFyYW1zLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiUXVlcnkgTWF4QnVmZmVyU2l6ZUluZm8gZmFpbGVkID0+ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSBzaXplb2YoQzJQYXJhbSk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluUGFyYW1zLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgQzJQYXJhbSogcGFyYW0gPSBpblBhcmFtc1tpXS5nZXQoKTsKKyAgICAgICAgICAgICAgICBiaXRTdHJlYW1JbmZvW2ldID0gKihpbnQzMl90KikoKHVpbnQ4X3QqKXBhcmFtICsgb2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtSW5wdXRNYXhCdWZTaXplID0gYml0U3RyZWFtSW5mb1swXTsKKyAgICB9CisKK307CisKK3ZvaWQgdmFsaWRhdGVDb21wb25lbnQoCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgIENvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wTmFtZSwgYm9vbCYgZGlzYWJsZVRlc3QpIHsKKyAgICAvLyBWYWxpZGF0ZSBpdHMgYSBDMiBDb21wb25lbnQKKyAgICBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiYzIiKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBBTE9HRSgiTm90IGEgYzIgY29tcG9uZW50Iik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFZhbGlkYXRlIGl0cyBub3QgYW4gZW5jb2RlciBhbmQgdGhlIGNvbXBvbmVudCB0byBiZSB0ZXN0ZWQgaXMgYXVkaW8KKyAgICBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiZGVjb2RlciIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBFbmNvZGVyLCBnaXZlbiBEZWNvZGVyIik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgYzJfc3RhdHVzX3QgYzJlcnIgPQorICAgICAgICBjb21wb25lbnQtPnF1ZXJ5KHt9LCB7QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ6OlBBUkFNX1RZUEV9LAorICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssICZxdWVyaWVkKTsKKyAgICBpZiAoYzJlcnIgIT0gQzJfT0sgJiYgcXVlcmllZC5zaXplKCkgPT0gMCkgeworICAgICAgICBBTE9HRSgiUXVlcnkgbWVkaWEgdHlwZSBmYWlsZWQgPT4gJWQiLCBjMmVycik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgaW5wdXREb21haW4gPQorICAgICAgICAgICAgKChDMlN0cmVhbU1lZGlhVHlwZVNldHRpbmc6OmlucHV0KilxdWVyaWVkWzBdLmdldCgpKS0+bS52YWx1ZTsKKyAgICAgICAgaWYgKGlucHV0RG9tYWluLmZpbmQoImF1ZGlvLyIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgQXVkaW8gQ29tcG9uZW50Iik7CisgICAgICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZXMgY29tcG9uZW50IG5hbWUKKyAgICBpZiAoY29tcE5hbWUgPT0gQ29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6dW5rbm93bl9jb21wKSB7CisgICAgICAgIEFMT0dFKCJDb21wb25lbnQgSW5WYWxpZCIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1YoIkNvbXBvbmVudCBWYWxpZCIpOworfQorCisvLyBTZXQgRGVmYXVsdCBjb25maWcgcGFyYW0uCitib29sIHNldHVwQ29uZmlnUGFyYW0oCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgIGludDMyX3QgbkNoYW5uZWxzLCBpbnQzMl90IG5TYW1wbGVSYXRlKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgIEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0IHNhbXBsZVJhdGVJbmZvKDB1LCBuU2FtcGxlUmF0ZSk7CisgICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dCBjaGFubmVsQ291bnRJbmZvKDB1LCBuQ2hhbm5lbHMpOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IGNvbmZpZ1BhcmFteyZzYW1wbGVSYXRlSW5mbywgJmNoYW5uZWxDb3VudEluZm99OworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgIGNvbXBvbmVudC0+Y29uZmlnKGNvbmZpZ1BhcmFtLCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIGlmIChzdGF0dXMgPT0gQzJfT0sgJiYgZmFpbHVyZXMuc2l6ZSgpID09IDB1KSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIExvb2tVcFRhYmxlIG9mIGNsaXBzIGFuZCBtZXRhZGF0YSBmb3IgY29tcG9uZW50IHRlc3RpbmcKK3ZvaWQgR2V0VVJMRm9yQ29tcG9uZW50KENvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wLCBjaGFyKiBtVVJMKSB7CisgICAgc3RydWN0IENvbXBUb1VSTCB7CisgICAgICAgIENvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wOworICAgICAgICBjb25zdCBjaGFyKiBtVVJMOworICAgIH07CisgICAgc3RhdGljIGNvbnN0IENvbXBUb1VSTCBrQ29tcFRvVVJMW10gPSB7CisgICAgICAgIHtDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmFhYywKKyAgICAgICAgICJiYmJfcmF3XzJjaF80OGtoel9zMTZsZS5yYXcifSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6YW1ybmIsCisgICAgICAgICAiYmJiX3Jhd18xY2hfOGtoel9zMTZsZS5yYXcifSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6YW1yd2IsCisgICAgICAgICAiYmJiX3Jhd18xY2hfMTZraHpfczE2bGUucmF3In0sCisgICAgICAgIHtDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmZsYWMsCisgICAgICAgICAiYmJiX3Jhd18yY2hfNDhraHpfczE2bGUucmF3In0sCisgICAgICAgIHtDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6Om9wdXMsCisgICAgICAgICAiYmJiX3Jhd18yY2hfNDhraHpfczE2bGUucmF3In0sCisgICAgfTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKGtDb21wVG9VUkwpIC8gc2l6ZW9mKGtDb21wVG9VUkxbMF0pOyArK2kpIHsKKyAgICAgICAgaWYgKGtDb21wVG9VUkxbaV0uY29tcCA9PSBjb21wKSB7CisgICAgICAgICAgICBzdHJjYXQobVVSTCwga0NvbXBUb1VSTFtpXS5tVVJMKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBlbmNvZGVORnJhbWVzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Om11dGV4ICZxdWV1ZUxvY2ssIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlJiBxdWV1ZUNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiYgZmx1c2hlZEluZGljZXMsCisgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgbGluZWFyUG9vbCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omlmc3RyZWFtJiBlbGVTdHJlYW0sIHVpbnQzMl90IG5GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsIGludDMyX3QgbkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgIGludDMyX3QgblNhbXBsZVJhdGUsIGJvb2wgZmx1c2hlZCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgIGJvb2wgc2lnbmFsRU9TID0gdHJ1ZSkgeworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKworICAgIHVpbnQzMl90IGZyYW1lSUQgPSAwOworICAgIHVpbnQzMl90IG1heFJldHJ5ID0gMDsKKyAgICBpbnQgYnl0ZXNDb3VudCA9IHNhbXBsZXNQZXJGcmFtZSAqIG5DaGFubmVscyAqIDI7CisgICAgaW50MzJfdCB0aW1lc3RhbXBJbmNyID0KKyAgICAgICAgKGludCkoKChmbG9hdClzYW1wbGVzUGVyRnJhbWUgLyBuU2FtcGxlUmF0ZSkgKiAxMDAwMDAwKTsKKyAgICB1aW50NjRfdCB0aW1lc3RhbXAgPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmIChuRnJhbWVzID09IDApIGJyZWFrOworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgIC8vIFByZXBhcmUgQzJXb3JrCisgICAgICAgIHdoaWxlICghd29yayAmJiAobWF4UmV0cnkgPCBNQVhfUkVUUlkpKSB7CisgICAgICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgICAgICBpZiAoIXdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgd29yay5zd2FwKHdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgICAgICB3b3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIFRJTUVfT1VUKTsKKyAgICAgICAgICAgICAgICBtYXhSZXRyeSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghd29yayAmJiAobWF4UmV0cnkgPj0gTUFYX1JFVFJZKSkgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJXYWl0IGZvciBnZW5lcmF0aW5nIEMyV29yayBleGNlZWRlZCB0aW1lb3V0IjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2lnbmFsRU9TICYmIChuRnJhbWVzID09IDEpKQorICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgaWYgKGZsdXNoZWQpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IFNZTkNfRlJBTUU7CisgICAgICAgICAgICBmbHVzaGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gdGltZXN0YW1wOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSBmcmFtZUlEOworICAgICAgICB7CisgICAgICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgICAgICBmbHVzaGVkSW5kaWNlcy5lbXBsYWNlX2JhY2soZnJhbWVJRCk7CisgICAgICAgIH0KKyAgICAgICAgY2hhciogZGF0YSA9IChjaGFyKiltYWxsb2MoYnl0ZXNDb3VudCk7CisgICAgICAgIEFTU0VSVF9ORShkYXRhLCBudWxscHRyKTsKKyAgICAgICAgZWxlU3RyZWFtLnJlYWQoZGF0YSwgYnl0ZXNDb3VudCk7CisgICAgICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uZ2NvdW50KCksIGJ5dGVzQ291bnQpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgICAgIEFTU0VSVF9FUShDMl9PSywgbGluZWFyUG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNDb3VudCwge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsb2NrKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGJsb2NrKTsKKyAgICAgICAgLy8gV3JpdGUgVmlldworICAgICAgICBDMldyaXRlVmlldyB2aWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkMyTGluZWFyQmxvY2s6Om1hcCgpIGZhaWxlZCA6ICVkIiwgdmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIEFTU0VSVF9FUSgoc2l6ZV90KWJ5dGVzQ291bnQsIHZpZXcuY2FwYWNpdHkoKSk7CisgICAgICAgIEFTU0VSVF9FUSgwdSwgdmlldy5vZmZzZXQoKSk7CisgICAgICAgIEFTU0VSVF9FUSgoc2l6ZV90KWJ5dGVzQ291bnQsIHZpZXcuc2l6ZSgpKTsKKworICAgICAgICBtZW1jcHkodmlldy5iYXNlKCksIGRhdGEsIGJ5dGVzQ291bnQpOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wbGFjZV9iYWNrKG5ldyBMaW5lYXJCdWZmZXIoYmxvY2spKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworICAgICAgICBmcmVlKGRhdGEpOworCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworCisgICAgICAgIC8vIERPIFRIRSBERUNPRElORworICAgICAgICBBU1NFUlRfRVEoY29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpLCBDMl9PSyk7CisgICAgICAgIEFMT0dWKCJGcmFtZSAjJWQgc2l6ZSA9ICVkIHF1ZXVlZCIsIGZyYW1lSUQsIGJ5dGVzQ291bnQpOworICAgICAgICBuRnJhbWVzLS07CisgICAgICAgIHRpbWVzdGFtcCArPSB0aW1lc3RhbXBJbmNyOworICAgICAgICBmcmFtZUlEKys7CisgICAgICAgIG1heFJldHJ5ID0gMDsKKyAgICB9Cit9CisKK1RFU1RfRihDb2RlYzJBdWRpb0VuY0hpZGxUZXN0LCB2YWxpZGF0ZUNvbXBOYW1lKSB7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIEFMT0dWKCJDaGVja3MgaWYgdGhlIGdpdmVuIGNvbXBvbmVudCBpcyBhIHZhbGlkIGF1ZGlvIGNvbXBvbmVudCIpOworICAgIHZhbGlkYXRlQ29tcG9uZW50KG1Db21wb25lbnQsIG1Db21wTmFtZSwgbURpc2FibGVUZXN0KTsKKyAgICBBU1NFUlRfRVEobURpc2FibGVUZXN0LCBmYWxzZSk7Cit9CisKK2NsYXNzIENvZGVjMkF1ZGlvRW5jRW5jb2RlVGVzdAorICAgIDogcHVibGljIENvZGVjMkF1ZGlvRW5jSGlkbFRlc3QsCisgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8c3RkOjpwYWlyPGJvb2wsIGludDMyX3Q+PiB7Cit9OworCitURVNUX1AoQ29kZWMyQXVkaW9FbmNFbmNvZGVUZXN0LCBFbmNvZGVUZXN0KSB7CisgICAgQUxPR1YoIkVuY29kZVRlc3QiKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgY2hhciBtVVJMWzUxMl07CisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwpOworICAgIGJvb2wgc2lnbmFsRU9TID0gR2V0UGFyYW0oKS5maXJzdDsKKyAgICAvLyBSYXRpbyB3LnIudCB0byBtSW5wdXRNYXhCdWZTaXplCisgICAgaW50MzJfdCBpbnB1dE1heEJ1ZlJhdGlvID0gR2V0UGFyYW0oKS5zZWNvbmQ7CisKKyAgICAvLyBTZXR0aW5nIGRlZmF1bHQgc2FtcGxlUmF0ZQorICAgIGludDMyX3QgbkNoYW5uZWxzID0gMjsKKyAgICBpbnQzMl90IG5TYW1wbGVSYXRlID0gNDQxMDA7CisgICAgc3dpdGNoIChtQ29tcE5hbWUpIHsKKyAgICAgICAgY2FzZSBhYWM6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAyOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGZsYWM6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAyOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIG9wdXM6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAyOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFtcm5iOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gODAwMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFtcndiOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gMTYwMDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUgPQorICAgICAgICAoKG1JbnB1dE1heEJ1ZlNpemUgLyBpbnB1dE1heEJ1ZlJhdGlvKSAvIChuQ2hhbm5lbHMgKiAyKSk7CisgICAgQUxPR1YoInNpZ25hbEVPUyAlZCBtSW5wdXRNYXhCdWZTaXplICVkIHNhbXBsZXNQZXJGcmFtZSAlZCIsIHNpZ25hbEVPUywKKyAgICAgICAgICBtSW5wdXRNYXhCdWZTaXplLCBzYW1wbGVzUGVyRnJhbWUpOworCisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIG5DaGFubmVscywgblNhbXBsZVJhdGUpKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbTsKKyAgICB1aW50MzJfdCBudW1GcmFtZXMgPSAxNjsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgbnVtRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSwgbkNoYW5uZWxzLCBuU2FtcGxlUmF0ZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsRU9TKSk7CisKKyAgICAvLyBJZiBFT1MgaXMgbm90IHNlbnQsIHNlbmRpbmcgZW1wdHkgaW5wdXQgd2l0aCBFT1MgZmxhZworICAgIGlmICghc2lnbmFsRU9TKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIDEpKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICB0ZXN0SW5wdXRCdWZmZXIobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNLCBmYWxzZSkpOworICAgICAgICBudW1GcmFtZXMgKz0gMTsKKyAgICB9CisKKyAgICAvLyBibG9ja2luZyBjYWxsIHRvIGVuc3VyZXMgYXBwbGljYXRpb24gdG8gV2FpdCB0aWxsIGFsbCB0aGUgaW5wdXRzIGFyZQorICAgIC8vIGNvbnN1bWVkCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgaWYgKG1GcmFtZXNSZWNlaXZlZCAhPSBudW1GcmFtZXMpIHsKKyAgICAgICAgQUxPR0UoIklucHV0IGJ1ZmZlciBjb3VudCBhbmQgT3V0cHV0IGJ1ZmZlciBjb3VudCBtaXNtYXRjaCIpOworICAgICAgICBBTE9HRSgiZnJhbWVzUmVjZWl2ZWQgOiAlZCBpbnB1dEZyYW1lcyA6ICV1IiwgbUZyYW1lc1JlY2VpdmVkLCBudW1GcmFtZXMpOworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorICAgIGlmICgobUNvbXBOYW1lID09IGZsYWMgfHwgbUNvbXBOYW1lID09IG9wdXMgfHwgbUNvbXBOYW1lID09IGFhYykpIHsKKyAgICAgICAgaWYgKCFtQ3NkKSB7CisgICAgICAgICAgICBBTE9HRSgiQ1NEIGJ1ZmZlciBtaXNzaW5nIik7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworLy8gRW5jb2RlVGVzdCB3aXRoIEVPUyAvIE5vIEVPUyBhbmQgaW5wdXRNYXhCdWZSYXRpbworLy8gaW5wdXRNYXhCdWZSYXRpbyBpcyByYXRpbyB3LnIudC4gdG8gbUlucHV0TWF4QnVmU2l6ZQorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoRW5jb2RlVGVzdCwgQ29kZWMyQXVkaW9FbmNFbmNvZGVUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoc3RkOjptYWtlX3BhaXIoZmFsc2UsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoZmFsc2UsIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIodHJ1ZSwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcih0cnVlLCAyKSkpOworCisKK1RFU1RfRihDb2RlYzJBdWRpb0VuY0hpZGxUZXN0LCBFT1NUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3QgZW1wdHkgaW5wdXQgYnVmZmVyIHdpdGggRU9TIGZsYWciKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgaWYgKCFtV29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHdvcmsuc3dhcChtV29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgbVdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJtV29ya1F1ZXVlIEVtcHR5IGlzIG5vdCBleHBlY3RlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIHRlc3QiKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IDA7CisgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gMDsKKyAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpLCBDMl9PSyk7CisgICAgdWludDMyX3QgcXVldWVTaXplOworICAgIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgcXVldWVTaXplID0gbVdvcmtRdWV1ZS5zaXplKCk7CisgICAgICAgIGlmIChxdWV1ZVNpemUgPCBNQVhfSU5QVVRfQlVGRkVSUykgeworICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIFRJTUVfT1VUKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfRVEobUVvcywgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyQXVkaW9FbmNIaWRsVGVzdCwgRmx1c2hUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3QgUmVxdWVzdCBmb3IgZmx1c2giKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgY2hhciBtVVJMWzUxMl07CisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwpOworCisgICAgLy8gU2V0dGluZyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyAgICBtRmx1c2hlZEluZGljZXMuY2xlYXIoKTsKKyAgICBpbnQzMl90IG5DaGFubmVscyA9IDI7CisgICAgaW50MzJfdCBuU2FtcGxlUmF0ZSA9IDQ0MTAwOworICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lID0gMTAyNDsKKyAgICBzd2l0Y2ggKG1Db21wTmFtZSkgeworICAgICAgICBjYXNlIGFhYzoKKyAgICAgICAgICAgIG5DaGFubmVscyA9IDI7CisgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDQ4MDAwOworICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lID0gMTAyNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGZsYWM6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAyOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDExNTI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBvcHVzOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMjsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gNDgwMDA7CisgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSA5NjA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhbXJuYjoKKyAgICAgICAgICAgIG5DaGFubmVscyA9IDE7CisgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDgwMDA7CisgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSAxNjA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhbXJ3YjoKKyAgICAgICAgICAgIG5DaGFubmVscyA9IDE7CisgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDE2MDAwOworICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lID0gMTYwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorCisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIG5DaGFubmVscywgblNhbXBsZVJhdGUpKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtOworICAgIHVpbnQzMl90IG51bUZyYW1lc0ZsdXNoZWQgPSAzMDsKKyAgICB1aW50MzJfdCBudW1GcmFtZXMgPSAxMjg7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sIG51bUZyYW1lc0ZsdXNoZWQsCisgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lLCBuQ2hhbm5lbHMsIG5TYW1wbGVSYXRlKSk7CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBmbHVzaGVkV29yazsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAoc2l6ZV90KU1BWF9JTlBVVF9CVUZGRVJTIC0gZmx1c2hlZFdvcmsuc2l6ZSgpKSk7CisgICAgdWludDY0X3QgZnJhbWVJbmRleDsKKyAgICB7CisgICAgICAgIC8vVXBkYXRlIG1GbHVzaGVkSW5kaWNlcyBiYXNlZCBvbiB0aGUgaW5kZXggcmVjZWl2ZWQgZnJvbSBmbHVzaCgpCisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiBmbHVzaGVkV29yaykgeworICAgICAgICAgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgICAgICAgICAgZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90Pjo6aXRlcmF0b3IgZnJhbWVJbmRleEl0ID0KKyAgICAgICAgICAgICAgICBzdGQ6OmZpbmQobUZsdXNoZWRJbmRpY2VzLmJlZ2luKCksIG1GbHVzaGVkSW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVJbmRleCk7CisgICAgICAgICAgICBpZiAoIW1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpICYmCisgICAgICAgICAgICAgICAgKGZyYW1lSW5kZXhJdCAhPSBtRmx1c2hlZEluZGljZXMuZW5kKCkpKSB7CisgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLmVyYXNlKGZyYW1lSW5kZXhJdCk7CisgICAgICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbVdvcmtRdWV1ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtRmx1c2hlZEluZGljZXMuY2xlYXIoKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcyAtIG51bUZyYW1lc0ZsdXNoZWQsIHNhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsIG5TYW1wbGVSYXRlLCB0cnVlKSk7CisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgZXJyID0KKyAgICAgICAgbUNvbXBvbmVudC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgKHNpemVfdClNQVhfSU5QVVRfQlVGRkVSUyAtIGZsdXNoZWRXb3JrLnNpemUoKSkpOworICAgIHsKKyAgICAgICAgLy9VcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBmcmFtZUluZGV4SXQgPQorICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRmx1c2hlZEluZGljZXMuZW1wdHkoKSwgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIGdFbnYgPSBuZXcgQ29tcG9uZW50VGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgZ0Vudi0+aW5pdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgTE9HKElORk8pIDw8ICJDMiBUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL21lZGlhX2MyX2F1ZGlvX2hpZGxfdGVzdF9jb21tb24uaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9tZWRpYV9jMl9hdWRpb19oaWRsX3Rlc3RfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ3NzNjZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9tZWRpYV9jMl9hdWRpb19oaWRsX3Rlc3RfY29tbW9uLmgKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfQzJfQVVESU9fSElETF9URVNUX0NPTU1PTl9ICisjZGVmaW5lIE1FRElBX0MyX0FVRElPX0hJRExfVEVTVF9DT01NT05fSAorCisKKyNlbmRpZiAgLy8gTUVESUFfQzJfQVVESU9fSElETF9URVNUX0NPTU1PTl9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEwMDYxYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vQW5kcm9pZC5icApAQCAtMCwwICsxLDMzIEBACitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogIlZ0c01lZGlhQzJWMV8wQ29tbW9uVXRpbCIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgIlZ0c0hhbFRhcmdldFRlc3REZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzItaGlkbC1jbGllbnQtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2luY2x1ZGUiLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmNwcCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAorfQorCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogIlZ0c01lZGlhQzJWMV8wRGVmYXVsdHMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJWdHNIYWxUYXJnZXRUZXN0RGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyLWhpZGwtY2xpZW50LWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgIlZ0c01lZGlhQzJWMV8wQ29tbW9uVXRpbCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzJfY2xpZW50IiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9SRUFETUUubWQgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGVhYjEwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9SRUFETUUubWQKQEAgLTAsMCArMSwzMSBAQAorIyMgQ29kZWMyIFZUUyBIYWwgQCAxLjAgdGVzdHMgIyMKKy0tLQorIyMjIyBtYXN0ZXIgOgorRnVuY3Rpb25hbGl0eSBvZiBtYXN0ZXIgaXMgdG8gZW51bWVyYXRlIGFsbCB0aGUgQ29kZWMyIGNvbXBvbmVudHMgYXZhaWxhYmxlIGluIEMyIG1lZGlhIHNlcnZpY2UuCisKK3VzYWdlOiBWdHNIaWRsQzJWMVxfMFRhcmdldE1hc3RlclRlc3QgLUkgZGVmYXVsdAorCisjIyMjIGNvbXBvbmVudCA6CitGdW5jdGlvbmFsaXR5IG9mIGNvbXBvbmVudCB0ZXN0IGlzIHRvIHZhbGlkYXRlIGNvbW1vbiBmdW5jdGlvbmFsaXR5IGFjcm9zcyBhbGwgdGhlIENvZGVjMiBjb21wb25lbnRzIGF2YWlsYWJsZSBpbiBDMiBtZWRpYSBzZXJ2aWNlLiBGb3IgYSBzdGFuZGFyZCBDMiBjb21wb25lbnQsIHRoZXNlIHRlc3RzIGFyZSBleHBlY3RlZCB0byBwYXNzLgorCit1c2FnZTogVnRzSGlkbEMyVjFcXzBUYXJnZXRDb21wb25lbnRUZXN0IC1JIHNvZnR3YXJlIC1DIDxjb21wIG5hbWU+CitleGFtcGxlOiBWdHNIaWRsQzJWMVxfMFRhcmdldENvbXBvbmVudFRlc3QgLUkgc29mdHdhcmUgLUMgYzIuYW5kcm9pZC52b3JiaXMuZGVjb2RlcgorCisjIyMjIGF1ZGlvIDoKK0Z1bmN0aW9uYWxpdHkgb2YgYXVkaW8gdGVzdCBpcyB0byB2YWxpZGF0ZSBhdWRpbyBzcGVjaWZpYyBmdW5jdGlvbmFsaXR5IENvZGVjMiBjb21wb25lbnRzLiBUaGUgcmVzb3VyY2UgZmlsZXMgZm9yIHRoaXMgdGVzdCBhcmUgdGFrZW4gZnJvbSBtZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzLiBUaGUgcGF0aCB0byB0aGVzZSBmaWxlcyBvbiB0aGUgZGV2aWNlIGlzIHJlcXVpcmVkIHRvIGJlIGdpdmVuIGZvciBiaXRzdHJlYW0gdGVzdHMuCisKK3VzYWdlOiBWdHNIaWRsQzJWMVxfMFRhcmdldEF1ZGlvRGVjVGVzdCAtSSBkZWZhdWx0IC1DIDxjb21wIG5hbWU+IC1QIC9zZGNhcmQvcmVzLwordXNhZ2U6IFZ0c0hpZGxDMlYxXF8wVGFyZ2V0QXVkaW9FbmNUZXN0IC1JIHNvZnR3YXJlIC1DIDxjb21wIG5hbWU+IC1QIC9zZGNhcmQvcmVzLworCitleGFtcGxlOiBWdHNIaWRsQzJWMVxfMFRhcmdldEF1ZGlvRGVjVGVzdCAtSSBzb2Z0d2FyZSAtQyBjMi5hbmRyb2lkLmZsYWMuZGVjb2RlciAtUCAvc2RjYXJkL3Jlcy8KK2V4YW1wbGU6IFZ0c0hpZGxDMlYxXF8wVGFyZ2V0QXVkaW9FbmNUZXN0IC1JIHNvZnR3YXJlIC1DIGMyLmFuZHJvaWQub3B1cy5lbmNvZGVyIC1QIC9zZGNhcmQvcmVzLworCisjIyMjIHZpZGVvIDoKK0Z1bmN0aW9uYWxpdHkgb2YgdmlkZW8gdGVzdCBpcyB0byB2YWxpZGF0ZSB2aWRlbyBzcGVjaWZpYyBmdW5jdGlvbmFsaXR5IENvZGVjMiBjb21wb25lbnRzLiBUaGUgcmVzb3VyY2UgZmlsZXMgZm9yIHRoaXMgdGVzdCBhcmUgdGFrZW4gZnJvbSBtZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzLiBUaGUgcGF0aCB0byB0aGVzZSBmaWxlcyBvbiB0aGUgZGV2aWNlIGlzIHJlcXVpcmVkIHRvIGJlIGdpdmVuIGZvciBiaXRzdHJlYW0gdGVzdHMuCisKK3VzYWdlOiBWdHNIaWRsQzJWMVxfMFRhcmdldFZpZGVvRGVjVGVzdCAtSSBkZWZhdWx0IC1DIDxjb21wIG5hbWU+IC1QIC9zZGNhcmQvcmVzLwordXNhZ2U6IFZ0c0hpZGxDMlYxXF8wVGFyZ2V0VmlkZW9FbmNUZXN0IC1JIHNvZnR3YXJlIC1DIDxjb21wIG5hbWU+IC1QIC9zZGNhcmQvcmVzLworCitleGFtcGxlOiBWdHNIaWRsQzJWMVxfMFRhcmdldFZpZGVvRGVjVGVzdCAtSSBzb2Z0d2FyZSAtQyBjMi5hbmRyb2lkLmF2Yy5kZWNvZGVyIC1QIC9zZGNhcmQvcmVzLworZXhhbXBsZTogVnRzSGlkbEMyVjFcXzBUYXJnZXRWaWRlb0VuY1Rlc3QgLUkgc29mdHdhcmUgLUMgYzIuYW5kcm9pZC52cDkuZW5jb2RlciAtUCAvc2RjYXJkL3Jlcy8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9tZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vbWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDczYjczMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vbWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5jcHAKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgiCisKKy8vIFRlc3QgdGhlIGNvZGVjcyBmb3IgTnVsbEJ1ZmZlciwgRW1wdHkgSW5wdXQgQnVmZmVyIHdpdGgob3V0KSBmbGFncyBzZXQKK3ZvaWQgdGVzdElucHV0QnVmZmVyKAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBzdGQ6Om11dGV4JiBxdWV1ZUxvY2ssIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtRdWV1ZSwKKyAgICB1aW50MzJfdCBmbGFncywgYm9vbCBpc051bGxCdWZmZXIpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgIHsKKyAgICAgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgIGlmICghd29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHdvcmsuc3dhcCh3b3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICB3b3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIndvcmtRdWV1ZSBFbXB0eSBhdCB0aGUgc3RhcnQgb2YgdGVzdCI7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworCisgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSAwOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IDA7CisgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgIGlmIChpc051bGxCdWZmZXIpIHsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5lbXBsYWNlX2JhY2sobnVsbHB0cik7CisgICAgfQorICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICBBU1NFUlRfRVEoY29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpLCBDMl9PSyk7Cit9CisKKy8vIFdhaXQgZm9yIGFsbCB0aGUgaW5wdXRzIHRvIGJlIGNvbnN1bWVkIGJ5IHRoZSBwbHVnaW4uCit2b2lkIHdhaXRPbklucHV0Q29uc3VtcHRpb24oc3RkOjptdXRleCYgcXVldWVMb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlJiBxdWV1ZUNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlckNvdW50KSB7CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIHVpbnQzMl90IHF1ZXVlU2l6ZTsKKyAgICB1aW50MzJfdCBtYXhSZXRyeSA9IDA7CisgICAgeworICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgIHF1ZXVlU2l6ZSA9IHdvcmtRdWV1ZS5zaXplKCk7CisgICAgfQorICAgIHdoaWxlICgobWF4UmV0cnkgPCBNQVhfUkVUUlkpICYmIChxdWV1ZVNpemUgPCBidWZmZXJDb3VudCkpIHsKKyAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICBpZiAocXVldWVTaXplICE9IHdvcmtRdWV1ZS5zaXplKCkpIHsKKyAgICAgICAgICAgIHF1ZXVlU2l6ZSA9IHdvcmtRdWV1ZS5zaXplKCk7CisgICAgICAgICAgICBtYXhSZXRyeSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBxdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgICAgICBtYXhSZXRyeSsrOworICAgICAgICB9CisgICAgfQorfQorCisvLyBwcm9jZXNzIG9uV29ya0RvbmUgcmVjZWl2ZWQgYnkgTGlzdGVuZXIKK3ZvaWQgd29ya0RvbmUoCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLCBzdGQ6Omxpc3Q8dWludDY0X3Q+JiBmbHVzaGVkSW5kaWNlcywKKyAgICBzdGQ6Om11dGV4JiBxdWV1ZUxvY2ssIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlJiBxdWV1ZUNvbmRpdGlvbiwKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrUXVldWUsIGJvb2wmIGVvcywgYm9vbCYgY3NkLAorICAgIHVpbnQzMl90JiBmcmFtZXNSZWNlaXZlZCkgeworICAgIC8vIGhhbmRsZSBjb25maWd1cmF0aW9uIGNoYW5nZXMgaW4gd29yayBkb25lCisgICAgaWYgKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgQUxPR1YoIkNvbmZpZyBVcGRhdGUiKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiB1cGRhdGVzID0KKyAgICAgICAgICAgIHN0ZDo6bW92ZSh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IGNvbmZpZ1BhcmFtOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdXBkYXRlcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgQzJQYXJhbSogcGFyYW0gPSB1cGRhdGVzW2ldLmdldCgpOworICAgICAgICAgICAgaWYgKHBhcmFtLT5pbmRleCgpID09IEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpIHsKKyAgICAgICAgICAgICAgICBjc2QgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmICgocGFyYW0tPmluZGV4KCkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dDo6UEFSQU1fVFlQRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgKHBhcmFtLT5pbmRleCgpID09CisgICAgICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dDo6UEFSQU1fVFlQRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgKHBhcmFtLT5pbmRleCgpID09CisgICAgICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKSkgeworICAgICAgICAgICAgICAgIGNvbmZpZ1BhcmFtLnB1c2hfYmFjayhwYXJhbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29tcG9uZW50LT5jb25maWcoY29uZmlnUGFyYW0sIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgIEFTU0VSVF9FUShmYWlsdXJlcy5zaXplKCksIDB1KTsKKyAgICB9CisgICAgaWYgKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyAhPSBDMkZyYW1lRGF0YTo6RkxBR19JTkNPTVBMRVRFKSB7CisgICAgICAgIGZyYW1lc1JlY2VpdmVkKys7CisgICAgICAgIGVvcyA9ICh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgJgorICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKyAgICAgICAgYXV0byBmcmFtZUluZGV4SXQgPSBzdGQ6OmZpbmQoZmx1c2hlZEluZGljZXMuYmVnaW4oKSwgZmx1c2hlZEluZGljZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICAgICAgQUxPR1YoIldvcmtEb25lOiBmcmFtZUlEIHJlY2VpdmVkICVkIiwKKyAgICAgICAgICAgICAgKGludCl3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgICAgIHdvcmtRdWV1ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICAgIGlmICghZmx1c2hlZEluZGljZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGZsdXNoZWRJbmRpY2VzLmVyYXNlKGZyYW1lSW5kZXhJdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBxdWV1ZUNvbmRpdGlvbi5ub3RpZnlfYWxsKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIFJldHVybiBjdXJyZW50IHRpbWUgaW4gbWljcm8gc2Vjb25kcworaW50NjRfdCBnZXROb3dVcygpIHsKKyAgICBzdHJ1Y3QgdGltZXZhbCB0djsKKyAgICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKworICAgIHJldHVybiAoaW50NjRfdCl0di50dl91c2VjICsgdHYudHZfc2VjICogMTAwMDAwMGxsOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9tZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL21lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTc3ZGFjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9tZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgKQEAgLTAsMCArMSwyMDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0MyX0hJRExfVEVTVF9DT01NT05fSAorI2RlZmluZSBNRURJQV9DMl9ISURMX1RFU1RfQ09NTU9OX0gKKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxnZXRvcHQuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NdXRleGVkLmg+CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA7Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjp1dGlsczsKKwordXNpbmcgOjphbmRyb2lkOjpNdXRleGVkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CisKKyNpbmNsdWRlIDxWdHNIYWxIaWRsVGFyZ2V0VGVzdEVudkJhc2UuaD4KKworI2RlZmluZSBNQVhfUkVUUlkgMjAKKyNkZWZpbmUgVElNRV9PVVQgNDAwbXMKKyNkZWZpbmUgTUFYX0lOUFVUX0JVRkZFUlMgOAorCisvKgorICogSGFuZGxlIENhbGxiYWNrIGZ1bmN0aW9ucyBvbldvcmtEb25lKCksIG9uVHJpcHBlZCgpLAorICogb25FcnJvcigpLCBvbkRlYXRoKCksIG9uRnJhbWVzUmVuZGVyZWQoKQorICovCitzdHJ1Y3QgQ29kZWNMaXN0ZW5lciA6IHB1YmxpYyBhbmRyb2lkOjpDb2RlYzJDbGllbnQ6Okxpc3RlbmVyIHsKKyAgIHB1YmxpYzoKKyAgICBDb2RlY0xpc3RlbmVyKAorICAgICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKT4gZm4gPQorICAgICAgICAgICAgbnVsbHB0cikKKyAgICAgICAgOiBjYWxsQmFjayhmbikge30KKyAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrRG9uZSgKKyAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXAsCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgb3ZlcnJpZGUgeworICAgICAgICAvKiBUT0RPICovCisgICAgICAgIEFMT0dEKCJvbldvcmtEb25lIGNhbGxlZCIpOworICAgICAgICAodm9pZCljb21wOworICAgICAgICBpZiAoY2FsbEJhY2spIGNhbGxCYWNrKHdvcmtJdGVtcyk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uVHJpcHBlZCgKKyAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXAsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiYgc2V0dGluZ1Jlc3VsdHMpCisgICAgICAgIG92ZXJyaWRlIHsKKyAgICAgICAgLyogVE9ETyAqLworICAgICAgICAodm9pZCljb21wOworICAgICAgICAodm9pZClzZXR0aW5nUmVzdWx0czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25FcnJvcigKKyAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXAsCisgICAgICAgIHVpbnQzMl90IGVycm9yQ29kZSkgb3ZlcnJpZGUgeworICAgICAgICAvKiBUT0RPICovCisgICAgICAgICh2b2lkKWNvbXA7CisgICAgICAgIEFMT0dEKCJvbkVycm9yIGNhbGxlZCIpOworICAgICAgICBpZiAoZXJyb3JDb2RlICE9IDApIEFMT0dFKCJFcnJvciA6ICV1IiwgZXJyb3JDb2RlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25EZWF0aCgKKyAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXApIG92ZXJyaWRlIHsKKyAgICAgICAgLyogVE9ETyAqLworICAgICAgICAodm9pZCljb21wOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbklucHV0QnVmZmVyRG9uZSgKKyAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCwgc2l6ZV90IGFycmF5SW5kZXgpIG92ZXJyaWRlIHsKKyAgICAgICAgLyogVE9ETyAqLworICAgICAgICAodm9pZClmcmFtZUluZGV4OworICAgICAgICAodm9pZClhcnJheUluZGV4OworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lUmVuZGVyZWQoCisgICAgICAgIHVpbnQ2NF90IGJ1ZmZlclF1ZXVlSWQsCisgICAgICAgIGludDMyX3Qgc2xvdElkLAorICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcE5zKSBvdmVycmlkZSB7CisgICAgICAgIC8qIFRPRE8gKi8KKyAgICAgICAgKHZvaWQpYnVmZmVyUXVldWVJZDsKKyAgICAgICAgKHZvaWQpc2xvdElkOworICAgICAgICAodm9pZCl0aW1lc3RhbXBOczsKKyAgICB9CisgICAgLy8gc3RkOjptdXRleCBtUXVldWVMb2NrOworICAgIC8vIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1RdWV1ZUNvbmRpdGlvbjsKKyAgICAvLyBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1Xb3JrUXVldWU7CisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcyk+IGNhbGxCYWNrOworfTsKKworLy8gQSBjbGFzcyBmb3IgdGVzdCBlbnZpcm9ubWVudCBzZXR1cAorY2xhc3MgQ29tcG9uZW50VGVzdEVudmlyb25tZW50IDogcHVibGljIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RFbnZCYXNlIHsKKyAgIHByaXZhdGU6CisgICAgdHlwZWRlZiA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0RW52QmFzZSBTdXBlcjsKKworICAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCByZWdpc3RlclRlc3RTZXJ2aWNlcygpIG92ZXJyaWRlIHsKKyAgICAgICAgcmVnaXN0ZXJUZXN0U2VydmljZTxJQ29tcG9uZW50U3RvcmU+KCk7CisgICAgfQorCisgICAgQ29tcG9uZW50VGVzdEVudmlyb25tZW50KCkgOiByZXMoIi9zZGNhcmQvbWVkaWEvIikge30KKworICAgIHZvaWQgc2V0Q29tcG9uZW50KGNvbnN0IGNoYXIqIF9jb21wb25lbnQpIHsgY29tcG9uZW50ID0gX2NvbXBvbmVudDsgfQorCisgICAgdm9pZCBzZXRJbnN0YW5jZShjb25zdCBjaGFyKiBfaW5zdGFuY2UpIHsgaW5zdGFuY2UgPSBfaW5zdGFuY2U7IH0KKworICAgIHZvaWQgc2V0UmVzKGNvbnN0IGNoYXIqIF9yZXMpIHsgcmVzID0gX3JlczsgfQorCisgICAgY29uc3QgaGlkbF9zdHJpbmcgZ2V0SW5zdGFuY2UoKSBjb25zdCB7IHJldHVybiBpbnN0YW5jZTsgfQorCisgICAgY29uc3QgaGlkbF9zdHJpbmcgZ2V0Q29tcG9uZW50KCkgY29uc3QgeyByZXR1cm4gY29tcG9uZW50OyB9CisKKyAgICBjb25zdCBoaWRsX3N0cmluZyBnZXRSZXMoKSBjb25zdCB7IHJldHVybiByZXM7IH0KKworICAgIGludCBpbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgICAgIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICAgICAgICAgIHsiaW5zdGFuY2UiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0knfSwKKyAgICAgICAgICAgIHsiY29tcG9uZW50IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdDJ30sCisgICAgICAgICAgICB7InJlcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnUCd9LAorICAgICAgICAgICAgezAsIDAsIDAsIDB9fTsKKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgICAgIGludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIkk6QzpQOiIsIG9wdGlvbnMsICZpbmRleCk7CisgICAgICAgICAgICBpZiAoYyA9PSAtMSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgICAgICBjYXNlICdJJzoKKyAgICAgICAgICAgICAgICAgICAgc2V0SW5zdGFuY2Uob3B0YXJnKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnQyc6CisgICAgICAgICAgICAgICAgICAgIHNldENvbXBvbmVudChvcHRhcmcpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdQJzoKKyAgICAgICAgICAgICAgICAgICAgc2V0UmVzKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJz8nOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChvcHRpbmQgPCBhcmdjKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBvcHRpb246ICVzXG5cbiIKKyAgICAgICAgICAgICAgICAgICAgInVzYWdlOiAlcyA8Z3Rlc3Qgb3B0aW9ucz4gPHRlc3Qgb3B0aW9ucz5cblxuIgorICAgICAgICAgICAgICAgICAgICAidGVzdCBvcHRpb25zIGFyZTpcblxuIgorICAgICAgICAgICAgICAgICAgICAiLUksIC0taW5zdGFuY2U6IHNvZnR3YXJlIGZvciBDMiBjb21wb25lbnRzLCBlbHNlIGRlZmF1bHRcbiIKKyAgICAgICAgICAgICAgICAgICAgIi1DLCAtLWNvbXBvbmVudDogQzIgY29tcG9uZW50IHRvIHRlc3RcbiIKKyAgICAgICAgICAgICAgICAgICAgIi1QLCAtLXJlczogUmVzb3VyY2UgZmlsZXMgZGlyZWN0b3J5IGxvY2F0aW9uXG4iLAorICAgICAgICAgICAgICAgICAgICBhcmd2W29wdGluZCA/OiAxXSwgYXJndlswXSk7CisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgaGlkbF9zdHJpbmcgaW5zdGFuY2U7CisgICAgaGlkbF9zdHJpbmcgY29tcG9uZW50OworICAgIGhpZGxfc3RyaW5nIHJlczsKK307CisKKy8qCisgKiBjb21tb24gZnVuY3Rpb25zIGRlY2xhcmF0aW9ucworICovCit2b2lkIHRlc3RJbnB1dEJ1ZmZlcigKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgc3RkOjptdXRleCYgcXVldWVMb2NrLCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrUXVldWUsCisgICAgdWludDMyX3QgZmxhZ3MsIGJvb2wgaXNOdWxsQnVmZmVyKTsKKwordm9pZCB3YWl0T25JbnB1dENvbnN1bXB0aW9uKHN0ZDo6bXV0ZXgmIHF1ZXVlTG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSYgcXVldWVDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJDb3VudCA9IE1BWF9JTlBVVF9CVUZGRVJTKTsKKwordm9pZCB3b3JrRG9uZSgKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssIHN0ZDo6bGlzdDx1aW50NjRfdD4mIGZsdXNoZWRJbmRpY2VzLAorICAgIHN0ZDo6bXV0ZXgmIHF1ZXVlTG9jaywgc3RkOjpjb25kaXRpb25fdmFyaWFibGUmIHF1ZXVlQ29uZGl0aW9uLAorICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtRdWV1ZSwgYm9vbCYgZW9zLCBib29sJiBjc2QsCisgICAgdWludDMyX3QmIGZyYW1lc1JlY2VpdmVkKTsKKworaW50NjRfdCBnZXROb3dVcygpOworCisjZW5kaWYgIC8vIE1FRElBX0MyX0hJRExfVEVTVF9DT01NT05fSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbXBvbmVudC9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbXBvbmVudC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOTEzYjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tcG9uZW50L0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNIaWRsQzJWMV8wVGFyZ2V0Q29tcG9uZW50VGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzTWVkaWFDMlYxXzBEZWZhdWx0cyJdLAorICAgIHNyY3M6IFsiVnRzSGlkbEMyVjFfMFRhcmdldENvbXBvbmVudFRlc3QuY3BwIl0sCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21wb25lbnQvVnRzSGlkbEMyVjFfMFRhcmdldENvbXBvbmVudFRlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbXBvbmVudC9WdHNIaWRsQzJWMV8wVGFyZ2V0Q29tcG9uZW50VGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ1NDhiNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21wb25lbnQvVnRzSGlkbEMyVjFfMFRhcmdldENvbXBvbmVudFRlc3QuY3BwCkBAIC0wLDAgKzEsMzc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjb2RlYzJfaGlkbF9oYWxfY29tcG9uZW50X3Rlc3QiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorCisjaW5jbHVkZSA8VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlLmg+CisjaW5jbHVkZSAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIgorCisvKiBUaW1lX091dCBmb3Igc3RhcnQoKSwgc3RvcCgpLCByZXNldCgpLCByZWxlYXNlKCksIGZsdXNoKCksIHF1ZXVlKCkgYXJlCisgKiBkZWZpbmVkIGluIGhhcmR3YXJlL2ludGVyZmFjZXMvbWVkaWEvYzIvMS4wL0lDb21wb25lbnQuaGFsLiBBZGRpbmcgNTBtcworICogZXh0cmEgaW4gY2FzZSBvZiB0aW1lb3V0IGlzIDUwMG1zLCAxbXMgZXh0cmEgaW4gY2FzZSB0aW1lb3V0IGlzIDFtcy81bXMuIEFsbAorICogdGltZW91dCBpcyBjYWxjdWxhdGVkIGluIHVzLgorICovCisjZGVmaW5lIFNUQVJUX1RJTUVfT1VUICAgICAgICAgICAgICAgICAgNTUwMDAwCisjZGVmaW5lIFNUT1BfVElNRV9PVVQgICAgICAgICAgICAgICAgICAgNTUwMDAwCisjZGVmaW5lIFJFU0VUX1RJTUVfT1VUICAgICAgICAgICAgICAgICAgNTUwMDAwCisjZGVmaW5lIFJFTEVBU0VfVElNRV9PVVQgICAgICAgICAgICAgICAgNTUwMDAwCisjZGVmaW5lIEZMVVNIX1RJTUVfT1VUICAgICAgICAgICAgICAgICAgNjAwMAorI2RlZmluZSBRVUVVRV9USU1FX09VVCAgICAgICAgICAgICAgICAgIDIwMDAKKworLy8gVGltZV9PdXQgZm9yIGNvbmZpZygpLCBxdWVyeSgpLCBxdWVyeVN1cHBvcnRlZFBhcmFtcygpIGFyZSBkZWZpbmVkIGluCisvLyBoYXJkd2FyZS9pbnRlcmZhY2VzL21lZGlhL2MyLzEuMC9JQ29uZmlndXJhYmxlLmhhbC4KKyNkZWZpbmUgQ09ORklHX1RJTUVfT1VUICAgICAgICAgICAgICAgICA2MDAwCisjZGVmaW5lIFFVRVJZX1RJTUVfT1VUICAgICAgICAgICAgICAgICAgNjAwMAorI2RlZmluZSBRVUVSWVNVUFBPUlRFRFBBUkFNU19USU1FX09VVCAgIDIwMDAKKworI2RlZmluZSBDSEVDS19USU1FT1VUKHRpbWVDb25zdW1lZCwgVElNRV9PVVQsIEZ1bmNOYW1lKSAgICAgICAgICBcCisgICAgaWYgKHRpbWVDb25zdW1lZCA+IFRJTUVfT1VUKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR1coICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgIlRJTUVEX09VVCAlcyAgdGltZUNvbnN1bWVkPSUiIFBSSWQ2NCAiIHVzIGlzICIgICAgICBcCisgICAgICAgICAgICAiZ3JlYXRlciB0aGFuIHRocmVzaG9sZCAlZCB1cyIsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEZ1bmNOYW1lLCB0aW1lQ29uc3VtZWQsIFRJTUVfT1VUKTsgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworc3RhdGljIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCogZ0VudiA9IG51bGxwdHI7CisKK25hbWVzcGFjZSB7CisKKy8vIGdvb2dsZS5jb2RlYzIgQ29tcG9uZW50IHRlc3Qgc2V0dXAKK2NsYXNzIENvZGVjMkNvbXBvbmVudEhpZGxUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIHsKKyAgIHByaXZhdGU6CisgICAgdHlwZWRlZiA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSBTdXBlcjsKKworICAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgU3VwZXI6OlNldFVwKCk7CisgICAgICAgIG1Fb3MgPSBmYWxzZTsKKyAgICAgICAgbUNsaWVudCA9IGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkpOworICAgICAgICBBU1NFUlRfTkUobUNsaWVudCwgbnVsbHB0cik7CisgICAgICAgIG1MaXN0ZW5lci5yZXNldChuZXcgQ29kZWNMaXN0ZW5lcigKKyAgICAgICAgICAgIFt0aGlzXShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVXb3JrRG9uZSh3b3JrSXRlbXMpOworICAgICAgICAgICAgfSkpOworICAgICAgICBBU1NFUlRfTkUobUxpc3RlbmVyLCBudWxscHRyKTsKKyAgICAgICAgbUNsaWVudC0+Y3JlYXRlQ29tcG9uZW50KGdFbnYtPmdldENvbXBvbmVudCgpLmNfc3RyKCksIG1MaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ29tcG9uZW50KTsKKyAgICAgICAgQVNTRVJUX05FKG1Db21wb25lbnQsIG51bGxwdHIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9JTlBVVF9CVUZGRVJTOyArK2kpIHsKKyAgICAgICAgICAgIG1Xb3JrUXVldWUuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmspOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAobUNvbXBvbmVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBJZiB5b3UgaGF2ZSBlbmNvdW50ZXJlZCBhIGZhdGFsIGZhaWx1cmUsIGl0IGlzIHBvc3NpYmxlIHRoYXQKKyAgICAgICAgICAgIC8vIGZyZWVOb2RlKCkgd2lsbCBub3QgZ28gdGhyb3VnaC4gSW5zdGVhZCBvZiBoYW5naW5nIHRoZSBhcHAuCisgICAgICAgICAgICAvLyBsZXQgaXQgcGFzcyB0aHJvdWdoIGFuZCByZXBvcnQgZXJyb3JzCisgICAgICAgICAgICBpZiAoOjp0ZXN0aW5nOjpUZXN0OjpIYXNGYXRhbEZhaWx1cmUoKSkgcmV0dXJuOworICAgICAgICAgICAgbUNvbXBvbmVudC0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUNvbXBvbmVudCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgU3VwZXI6OlRlYXJEb3duKCk7CisgICAgfQorICAgIC8vIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHByb2Nlc3Mgb25Xb3JrRG9uZSByZWNlaXZlZCBieSBMaXN0ZW5lcgorICAgIHZvaWQgaGFuZGxlV29ya0RvbmUoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgIGlmICghd29yay0+d29ya2xldHMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGJvb2wgbUNzZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHVpbnQzMl90IG1GcmFtZXNSZWNlaXZlZCA9IDA7CisgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiBtRmx1c2hlZEluZGljZXM7CisgICAgICAgICAgICAgICAgd29ya0RvbmUobUNvbXBvbmVudCwgd29yaywgbUZsdXNoZWRJbmRpY2VzLCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgbVdvcmtRdWV1ZSwgbUVvcywgbUNzZCwgbUZyYW1lc1JlY2VpdmVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgbUVvczsKKyAgICBzdGQ6Om11dGV4IG1RdWV1ZUxvY2s7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbVF1ZXVlQ29uZGl0aW9uOworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gbVdvcmtRdWV1ZTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ+IG1DbGllbnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IG1Db21wb25lbnQ7CisKKyAgIHByb3RlY3RlZDoKKyAgICBzdGF0aWMgdm9pZCBkZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworICAgIH0KK307CisKKy8vIFRlc3QgRW1wdHkgRmx1c2gKK1RFU1RfRihDb2RlYzJDb21wb25lbnRIaWRsVGVzdCwgRW1wdHlGbHVzaCkgeworICAgIEFMT0dWKCJFbXB0eSBGbHVzaCBUZXN0Iik7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUNvbXBvbmVudC0+c3RhcnQoKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGZsdXNoZWRXb3JrOworICAgIGVyciA9IG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgZXJyID0gbUNvbXBvbmVudC0+c3RvcCgpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICAvLyBFbXB0eSBGbHVzaCBzaG91bGQgbm90IHJldHVybiBhbnkgd29yaworICAgIEFTU0VSVF9FUShmbHVzaGVkV29yay5zaXplKCksIDB1KTsKK30KKworLy8gVGVzdCBRdWV1ZSBFbXB0eSBXb3JrCitURVNUX0YoQ29kZWMyQ29tcG9uZW50SGlkbFRlc3QsIFF1ZXVlRW1wdHlXb3JrKSB7CisgICAgQUxPR1YoIlF1ZXVlIEVtcHR5IFdvcmsgVGVzdCIpOworICAgIGMyX3N0YXR1c190IGVyciA9IG1Db21wb25lbnQtPnN0YXJ0KCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgLy8gUXVldWVpbmcgYW4gZW1wdHkgV29ya0J1bmRsZQorICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gd29ya0xpc3Q7CisgICAgZXJyID0gbUNvbXBvbmVudC0+cXVldWUoJndvcmtMaXN0KTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5yZXNldCgpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKK30KKworLy8gVGVzdCBDb21wb25lbnQgQ29uZmlndXJhdGlvbgorVEVTVF9GKENvZGVjMkNvbXBvbmVudEhpZGxUZXN0LCBDb25maWcpIHsKKyAgICBBTE9HVigiQ29uZmlndXJhdGlvbiBUZXN0Iik7CisKKyAgICBDMlN0cmluZyBuYW1lID0gbUNvbXBvbmVudC0+Z2V0TmFtZSgpOworICAgIEVYUEVDVF9ORShuYW1lLmVtcHR5KCksIHRydWUpIDw8ICJJbnZhbGlkIENvbXBvbmVudCBOYW1lIjsKKworICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisKKyAgICAvLyBRdWVyeSBzdXBwb3J0ZWQgcGFyYW1zIGJ5IHRoZSBjb21wb25lbnQKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiBwYXJhbXM7CisgICAgZXJyID0gbUNvbXBvbmVudC0+cXVlcnlTdXBwb3J0ZWRQYXJhbXMoJnBhcmFtcyk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIEFMT0dWKCJOdW1iZXIgb2YgdG90YWwgcGFyYW1zIC0gJXp1IiwgcGFyYW1zLnNpemUoKSk7CisKKyAgICAvLyBRdWVyeSBhbmQgY29uZmlnIGFsbCB0aGUgc3VwcG9ydGVkIHBhcmFtcworICAgIGZvciAoc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiBwIDogcGFyYW1zKSB7CisgICAgICAgIEFMT0dEKCJRdWVyeWluZyBpbmRleCAlZCIsIChpbnQpcC0+aW5kZXgoKSk7CisgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KHt9LCB7cC0+aW5kZXgoKX0sIEMyX0RPTlRfQkxPQ0ssICZxdWVyaWVkKTsKKyAgICAgICAgRVhQRUNUX05FKHF1ZXJpZWQuc2l6ZSgpLCAwdSk7CisgICAgICAgIEVYUEVDVF9FUShlcnIsIEMyX09LKTsKKyAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+Y29uZmlnKHtxdWVyaWVkWzBdLmdldCgpfSwgQzJfRE9OVF9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgICAgICBBU1NFUlRfRVEoZmFpbHVyZXMuc2l6ZSgpLCAwdSk7CisgICAgfQorfQorCisvLyBUZXN0IE11bHRpcGxlIFN0YXJ0IFN0b3AgUmVzZXQgVGVzdAorVEVTVF9GKENvZGVjMkNvbXBvbmVudEhpZGxUZXN0LCBNdWx0aXBsZVN0YXJ0U3RvcFJlc2V0KSB7CisgICAgQUxPR1YoIk11bHRpcGxlIFN0YXJ0IFN0b3AgYW5kIFJlc2V0IFRlc3QiKTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTUFYX1JFVFJZOyBpKyspIHsKKyAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+c3RhcnQoKTsKKyAgICAgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnN0b3AoKTsKKyAgICAgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIH0KKworICAgIGVyciA9IG1Db21wb25lbnQtPnN0YXJ0KCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBNQVhfUkVUUlk7IGkrKykgeworICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5yZXNldCgpOworICAgICAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgfQorCisgICAgZXJyID0gbUNvbXBvbmVudC0+c3RhcnQoKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5zdG9wKCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgLy8gU2Vjb25kIHN0b3Agc2hvdWxkIHJldHVybiBlcnJvcgorICAgIGVyciA9IG1Db21wb25lbnQtPnN0b3AoKTsKKyAgICBBU1NFUlRfTkUoZXJyLCBDMl9PSyk7Cit9CisKKy8vIFRlc3QgQ29tcG9uZW50IFJlbGVhc2UgQVBJCitURVNUX0YoQ29kZWMyQ29tcG9uZW50SGlkbFRlc3QsIE11bHRpcGxlUmVsZWFzZSkgeworICAgIEFMT0dWKCJNdWx0aXBsZSBSZWxlYXNlIFRlc3QiKTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQ29tcG9uZW50LT5zdGFydCgpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgIC8vIFF1ZXJ5IENvbXBvbmVudCBEb21haW4gVHlwZQorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWVyeSh7fSwge0MyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0OjpQQVJBTV9UWVBFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgRVhQRUNUX05FKHF1ZXJpZWQuc2l6ZSgpLCAwdSk7CisKKyAgICAvLyBDb25maWd1cmUgQ29tcG9uZW50IERvbWFpbgorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICBDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dCogcG9ydE1lZGlhVHlwZSA9CisgICAgICAgIEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0OjpGcm9tKHF1ZXJpZWRbMF0uZ2V0KCkpOworICAgIGVyciA9IG1Db21wb25lbnQtPmNvbmZpZyh7cG9ydE1lZGlhVHlwZX0sIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIEFTU0VSVF9FUShmYWlsdXJlcy5zaXplKCksIDB1KTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTUFYX1JFVFJZOyBpKyspIHsKKyAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+cmVsZWFzZSgpOworICAgICAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgfQorfQorCitjbGFzcyBDb2RlYzJDb21wb25lbnRJbnB1dFRlc3RzIDogcHVibGljIENvZGVjMkNvbXBvbmVudEhpZGxUZXN0LAorICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8c3RkOjpwYWlyPHVpbnQzMl90LCBib29sPiA+IHsKK307CisKK1RFU1RfUChDb2RlYzJDb21wb25lbnRJbnB1dFRlc3RzLCBJbnB1dEJ1ZmZlclRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdHMgZm9yIGRpZmZlcmVudCBpbnB1dHMiKTsKKworICAgIHVpbnQzMl90IGZsYWdzID0gR2V0UGFyYW0oKS5maXJzdDsKKyAgICBib29sIGlzTnVsbEJ1ZmZlciA9IEdldFBhcmFtKCkuc2Vjb25kOworICAgIGlmIChpc051bGxCdWZmZXIpIEFMT0dEKCJUZXN0aW5nIGZvciBudWxsIGlucHV0IGJ1ZmZlciB3aXRoIGZsYWcgOiAldSIsIGZsYWdzKTsKKyAgICBlbHNlIEFMT0dEKCJUZXN0aW5nIGZvciBlbXB0eSBpbnB1dCBidWZmZXIgd2l0aCBmbGFnIDogJXUiLCBmbGFncyk7CisgICAgbUVvcyA9IGZhbHNlOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUodGVzdElucHV0QnVmZmVyKAorICAgICAgICBtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtV29ya1F1ZXVlLCBmbGFncywgaXNOdWxsQnVmZmVyKSk7CisKKyAgICBBTE9HRCgiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKworICAgIGlmIChmbGFncyA9PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSBBU1NFUlRfRVEobUVvcywgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5yZXNldCgpLCBDMl9PSyk7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE5vblN0ZElucHV0cywgQ29kZWMyQ29tcG9uZW50SW5wdXRUZXN0cywgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgc3RkOjptYWtlX3BhaXIoMCwgdHJ1ZSksCisgICAgc3RkOjptYWtlX3BhaXIoQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSwgdHJ1ZSksCisgICAgc3RkOjptYWtlX3BhaXIoMCwgZmFsc2UpLAorICAgIHN0ZDo6bWFrZV9wYWlyKEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRywgZmFsc2UpLAorICAgIHN0ZDo6bWFrZV9wYWlyKEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0sIGZhbHNlKSkpOworCisvLyBUZXN0IEFQSSdzIFRpbWVvdXQKK1RFU1RfRihDb2RlYzJDb21wb25lbnRIaWRsVGVzdCwgVGltZW91dCkgeworICAgIEFMT0dWKCJUaW1lb3V0IFRlc3QiKTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKworICAgIGludDY0X3Qgc3RhcnRUaW1lID0gZ2V0Tm93VXMoKTsKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5zdGFydCgpOworICAgIGludDY0X3QgdGltZUNvbnN1bWVkID0gZ2V0Tm93VXMoKSAtIHN0YXJ0VGltZTsKKyAgICBDSEVDS19USU1FT1VUKHRpbWVDb25zdW1lZCwgU1RBUlRfVElNRV9PVVQsICJzdGFydCgpIik7CisgICAgQUxPR1YoIm1Db21wb25lbnQtPnN0YXJ0KCkgdGltZUNvbnN1bWVkPSUiIFBSSWQ2NCAiIHVzIiwgdGltZUNvbnN1bWVkKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisKKyAgICBzdGFydFRpbWUgPSBnZXROb3dVcygpOworICAgIGVyciA9IG1Db21wb25lbnQtPnJlc2V0KCk7CisgICAgdGltZUNvbnN1bWVkID0gZ2V0Tm93VXMoKSAtIHN0YXJ0VGltZTsKKyAgICBDSEVDS19USU1FT1VUKHRpbWVDb25zdW1lZCwgUkVTRVRfVElNRV9PVVQsICJyZXNldCgpIik7CisgICAgQUxPR1YoIm1Db21wb25lbnQtPnJlc2V0KCkgdGltZUNvbnN1bWVkPSUiIFBSSWQ2NCAiIHVzIiwgdGltZUNvbnN1bWVkKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5zdGFydCgpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgIC8vIFF1ZXJ5IHN1cHBvcnRlZCBwYXJhbXMgYnkgdGhlIGNvbXBvbmVudAorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+IHBhcmFtczsKKyAgICBzdGFydFRpbWUgPSBnZXROb3dVcygpOworICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKCZwYXJhbXMpOworICAgIHRpbWVDb25zdW1lZCA9IGdldE5vd1VzKCkgLSBzdGFydFRpbWU7CisgICAgQ0hFQ0tfVElNRU9VVCh0aW1lQ29uc3VtZWQsIFFVRVJZU1VQUE9SVEVEUEFSQU1TX1RJTUVfT1VULAorICAgICAgICAgICAgICAgICAgInF1ZXJ5U3VwcG9ydGVkUGFyYW1zKCkiKTsKKyAgICBBTE9HVigibUNvbXBvbmVudC0+cXVlcnlTdXBwb3J0ZWRQYXJhbXMoKSB0aW1lQ29uc3VtZWQ9JSIgUFJJZDY0ICIgdXMiLAorICAgICAgICAgIHRpbWVDb25zdW1lZCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBxdWVyaWVkOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAvLyBRdWVyeSBhbmQgY29uZmlnIGFsbCB0aGUgc3VwcG9ydGVkIHBhcmFtcworICAgIGZvciAoc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiBwIDogcGFyYW1zKSB7CisgICAgICAgIHN0YXJ0VGltZSA9IGdldE5vd1VzKCk7CisgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KHt9LCB7cC0+aW5kZXgoKX0sIEMyX0RPTlRfQkxPQ0ssICZxdWVyaWVkKTsKKyAgICAgICAgdGltZUNvbnN1bWVkID0gZ2V0Tm93VXMoKSAtIHN0YXJ0VGltZTsKKyAgICAgICAgQ0hFQ0tfVElNRU9VVCh0aW1lQ29uc3VtZWQsIFFVRVJZX1RJTUVfT1VULCAicXVlcnkoKSIpOworICAgICAgICBFWFBFQ1RfTkUocXVlcmllZC5zaXplKCksIDB1KTsKKyAgICAgICAgRVhQRUNUX0VRKGVyciwgQzJfT0spOworICAgICAgICBBTE9HVigibUNvbXBvbmVudC0+cXVlcnkoKSBmb3IgJXMgdGltZUNvbnN1bWVkPSUiIFBSSWQ2NCAiIHVzIiwKKyAgICAgICAgICAgICAgcC0+bmFtZSgpLmNfc3RyKCksIHRpbWVDb25zdW1lZCk7CisKKyAgICAgICAgc3RhcnRUaW1lID0gZ2V0Tm93VXMoKTsKKyAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+Y29uZmlnKHtxdWVyaWVkWzBdLmdldCgpfSwgQzJfRE9OVF9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgdGltZUNvbnN1bWVkID0gZ2V0Tm93VXMoKSAtIHN0YXJ0VGltZTsKKyAgICAgICAgQ0hFQ0tfVElNRU9VVCh0aW1lQ29uc3VtZWQsIENPTkZJR19USU1FX09VVCwgImNvbmZpZygpIik7CisgICAgICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICAgICAgQVNTRVJUX0VRKGZhaWx1cmVzLnNpemUoKSwgMHUpOworICAgICAgICBBTE9HVigibUNvbXBvbmVudC0+Y29uZmlnKCkgZm9yICVzIHRpbWVDb25zdW1lZD0lIiBQUklkNjQgIiB1cyIsCisgICAgICAgICAgICAgIHAtPm5hbWUoKS5jX3N0cigpLCB0aW1lQ29uc3VtZWQpOworICAgIH0KKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gd29ya0xpc3Q7CisgICAgc3RhcnRUaW1lID0gZ2V0Tm93VXMoKTsKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWV1ZSgmd29ya0xpc3QpOworICAgIHRpbWVDb25zdW1lZCA9IGdldE5vd1VzKCkgLSBzdGFydFRpbWU7CisgICAgQUxPR1YoIm1Db21wb25lbnQtPnF1ZXVlKCkgdGltZUNvbnN1bWVkPSUiIFBSSWQ2NCAiIHVzIiwgdGltZUNvbnN1bWVkKTsKKyAgICBDSEVDS19USU1FT1VUKHRpbWVDb25zdW1lZCwgUVVFVUVfVElNRV9PVVQsICJxdWV1ZSgpIik7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgc3RhcnRUaW1lID0gZ2V0Tm93VXMoKTsKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmd29ya0xpc3QpOworICAgIHRpbWVDb25zdW1lZCA9IGdldE5vd1VzKCkgLSBzdGFydFRpbWU7CisgICAgQUxPR1YoIm1Db21wb25lbnQtPmZsdXNoKCkgdGltZUNvbnN1bWVkPSUiIFBSSWQ2NCAiIHVzIiwgdGltZUNvbnN1bWVkKTsKKyAgICBDSEVDS19USU1FT1VUKHRpbWVDb25zdW1lZCwgRkxVU0hfVElNRV9PVVQsICJmbHVzaCgpIik7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgc3RhcnRUaW1lID0gZ2V0Tm93VXMoKTsKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5zdG9wKCk7CisgICAgdGltZUNvbnN1bWVkID0gZ2V0Tm93VXMoKSAtIHN0YXJ0VGltZTsKKyAgICBBTE9HVigibUNvbXBvbmVudC0+c3RvcCgpIHRpbWVDb25zdW1lZD0lIiBQUklkNjQgIiB1cyIsIHRpbWVDb25zdW1lZCk7CisgICAgQ0hFQ0tfVElNRU9VVCh0aW1lQ29uc3VtZWQsIFNUT1BfVElNRV9PVVQsICJzdG9wKCkiKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisKKyAgICBzdGFydFRpbWUgPSBnZXROb3dVcygpOworICAgIGVyciA9IG1Db21wb25lbnQtPnJlbGVhc2UoKTsKKyAgICB0aW1lQ29uc3VtZWQgPSBnZXROb3dVcygpIC0gc3RhcnRUaW1lOworICAgIEFMT0dWKCJtQ29tcG9uZW50LT5yZWxlYXNlKCkgdGltZUNvbnN1bWVkPSUiIFBSSWQ2NCAiIHVzIiwgdGltZUNvbnN1bWVkKTsKKyAgICBDSEVDS19USU1FT1VUKHRpbWVDb25zdW1lZCwgUkVMRUFTRV9USU1FX09VVCwgInJlbGVhc2UoKSIpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKKy8vIFRPRE86IEFkZCB0ZXN0IGZvciBJbnZhbGlkIHdvcmssCisvLyBUT0RPOiBBZGQgdGVzdCBmb3IgSW52YWxpZCBzdGF0ZXMKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIGdFbnYgPSBuZXcgQ29tcG9uZW50VGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgZ0Vudi0+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/Vnz4mb24ejiClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZmJlMzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nc21fMWNoXzhraHpfMTNrYnBzLmluZm8KQEAgLTAsMCArMSwxNyBAQAorOTc1IDEgMAorOTc1IDEgNjAwMDAwCis5NzUgMSAxMjAwMDAwCis5NzUgMSAxODAwMDAwCis5NzUgMSAyNDAwMDAwCis5NzUgMSAzMDAwMDAwCis5NzUgMSAzNjAwMDAwCis5NzUgMSA0MjAwMDAwCis5NzUgMSA0ODAwMDAwCis5NzUgMSA1NDAwMDAwCis5NzUgMSA2MDAwMDAwCis5NzUgMSA2NjAwMDAwCis5NzUgMSA3MjAwMDAwCis5NzUgMSA3ODAwMDAwCis5NzUgMSA4NDAwMDAwCis5NzUgMSA5MDAwMDAwCis1MjAgMSA5NjAwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nc21fMWNoXzhraHpfMTNrYnBzLnJhdyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2dzbV8xY2hfOGtoel8xM2ticHMucmF3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmOTAzYTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nc21fMWNoXzhraHpfMTNrYnBzLnJhdwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oMjYzXzM1MngyODhfMzAwa2Jwc18xMmZwcy5oMjYzIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaDI2MwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTI1ODFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaDI2MwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oMjYzXzM1MngyODhfMzAwa2Jwc18xMmZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWJmY2I2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaW5mbwpAQCAtMCwwICsxLDEyMiBAQAorMjYzNjIgMSAwCisxMjAyMyAwIDgzMzMzCisxMDY0NyAwIDE2NjY2NgorMTAyNjkgMCAyNTAwMDAKKzExMDc2IDAgMzMzMzMzCisxMTEwNCAwIDQxNjY2NgorNTkwOSAwIDUwMDAwMAorNDI5MSAwIDU4MzMzMworNTE0OSAwIDY2NjY2NgorNTM1MyAwIDc1MDAwMAorNTE4NSAwIDgzMzMzMworMjczNiAwIDkxNjY2NgorMjE1NzUgMSAxMDAwMDAwCisyMTk2IDAgMTA4MzMzMworNDM0MCAwIDExNjY2NjYKKzMxMDkgMCAxMjUwMDAwCis0NDEwIDAgMTMzMzMzMworMTczMSAwIDE0MTY2NjYKKzQ1NTcgMCAxNTAwMDAwCiszMzc2IDAgMTU4MzMzMworMTM1MiAwIDE2NjY2NjYKKzI4NDQgMCAxNzUwMDAwCisxNzg3IDAgMTgzMzMzMworMTA4OCAwIDE5MTY2NjYKKzM2ODQzIDEgMjAwMDAwMAorMjUyMCAwIDIwODMzMzMKKzM3NDkgMCAyMTY2NjY2CiszNzg0IDAgMjI1MDAwMAorMzQwMiAwIDIzMzMzMzMKKzM3OTUgMCAyNDE2NjY2CisyMzQ1IDAgMjUwMDAwMAorMzE0MiAwIDI1ODMzMzMKKzI5NDggMCAyNjY2NjY2CisyMDE4IDAgMjc1MDAwMAorNTEzMyAwIDI4MzMzMzMKKzIyNzYgMCAyOTE2NjY2CisyMzQ2OCAxIDMwMDAwMDAKKzE1MjIgMCAzMDgzMzMzCisyMjk5IDAgMzE2NjY2NgorMzI3MyAwIDMyNTAwMDAKKzI2MzAgMCAzMzMzMzMzCisyOTE1IDAgMzQxNjY2NgorMzAzMiAwIDM1MDAwMDAKKzE4OTAgMCAzNTgzMzMzCiszNzE4IDAgMzY2NjY2NgorMTk5MCAwIDM3NTAwMDAKKzMxMzkgMCAzODMzMzMzCisxODA2IDAgMzkxNjY2NgorMjMyMDggMSA0MDAwMDAwCisxNDE5IDAgNDA4MzMzMworMjI2MyAwIDQxNjY2NjYKKzMxMzEgMCA0MjUwMDAwCisyNjQ1IDAgNDMzMzMzMworMTg4MCAwIDQ0MTY2NjYKKzIyMzkgMCA0NTAwMDAwCiszNjM3IDAgNDU4MzMzMworMTk0MSAwIDQ2NjY2NjYKKzE1NzcgMCA0NzUwMDAwCiszNzc3IDAgNDgzMzMzMworMTgxNiAwIDQ5MTY2NjYKKzE5NjAxIDEgNTAwMDAwMAorMTEwNCAwIDUwODMzMzMKKzI4MDggMCA1MTY2NjY2CisyNDExIDAgNTI1MDAwMAorMjE1OSAwIDUzMzMzMzMKKzI0MTEgMCA1NDE2NjY2CisyNDA4IDAgNTUwMDAwMAorMjM4OCAwIDU1ODMzMzMKKzI0MTggMCA1NjY2NjY2CisxNDgxIDAgNTc1MDAwMAorMTkyNiAwIDU4MzMzMzMKKzkwMjIgMSA1OTE2NjY2CisyOTIgMCA2MDAwMDAwCis3MDEgMCA2MDgzMzMzCis3NDcgMCA2MTY2NjY2CisyMDU5IDAgNjI1MDAwMAorMTY5MyAwIDYzMzMzMzMKKzIwNzggMCA2NDE2NjY2CisyOTc1IDAgNjUwMDAwMAorMTMxNyAwIDY1ODMzMzMKKzE3NDIgMCA2NjY2NjY2CisxMDE5IDAgNjc1MDAwMAorMTA1MyAwIDY4MzMzMzMKKzE0MTgzIDEgNjkxNjY2NgorMTQ2NyAwIDcwMDAwMDAKKzk5NCAwIDcwODMzMzMKKzE3MDkgMCA3MTY2NjY2Cis4MzggMCA3MjUwMDAwCisxMzI4IDAgNzMzMzMzMworMjI5MiAwIDc0MTY2NjYKKzE4MjkgMCA3NTAwMDAwCisxNzI4IDAgNzU4MzMzMworMjQzNiAwIDc2NjY2NjYKKzE4NTIgMCA3NzUwMDAwCisyMTkwIDAgNzgzMzMzMworMTUxNjcgMSA3OTE2NjY2CisxMTg4IDAgODAwMDAwMAorMjA3MCAwIDgwODMzMzMKKzMzMTYgMCA4MTY2NjY2CisyNjM2IDAgODI1MDAwMAorOTUwIDAgODMzMzMzMworMTI2MCAwIDg0MTY2NjYKKzkwNiAwIDg1MDAwMDAKKzEyOTQgMCA4NTgzMzMzCisxMjk4IDAgODY2NjY2NgorMTg5NyAwIDg3NTAwMDAKKzEzNDggMCA4ODMzMzMzCisxMzE5NCAxIDg5MTY2NjYKKzEwNDIgMCA5MDAwMDAwCisxMjU4IDAgOTA4MzMzMworMTQ1NyAwIDkxNjY2NjYKKzk5MCAwIDkyNTAwMDAKKzkwMCAwIDkzMzMzMzMKKzk2MyAwIDk0MTY2NjYKKzM0NDggMCA5NTAwMDAwCis3NzQgMCA5NTgzMzMzCisxMDc1IDAgOTY2NjY2NgorNzUwIDAgOTc1MDAwMAorMTA1NCAwIDk4MzMzMzMKKzEzMTM5IDEgOTkxNjY2NgorMzEwNCAwIDEwMDAwMDAwCiszMzY2IDAgMTAwODMzMzMKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2hldmNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmhldmMgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5oZXZjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MjIzNmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5oZXZjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2hldmNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MzU3Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5pbmZvCkBAIC0wLDAgKzEsNjEgQEAKKzE2OTUgMzIgMAorMTkzOCAxIDMzMzMzCis0NzEgMCA4MzMzMworMTUzIDAgNjY2NjYKKzk5IDAgNTAwMDAKKzY1NyAwIDE1MDAwMAorMjYwIDAgMTE2NjY2CisxMTUgMCAxMDAwMDAKKzk5IDAgMTMzMzMzCis2MjIgMCAyMTY2NjYKKzIxMSAwIDE4MzMzMworNzkgMCAxNjY2NjYKKzk1IDAgMjAwMDAwCis1OTcgMCAyODMzMzMKKzI4OCAwIDI1MDAwMAorMTQ1IDAgMjMzMzMzCisxNDcgMCAyNjY2NjYKKzY3NiAwIDM1MDAwMAorMjg0IDAgMzE2NjY2CisxNDQgMCAzMDAwMDAKKzEzMSAwIDMzMzMzMworNjU4IDAgNDE2NjY2CisyNzAgMCAzODMzMzMKKzEwMSAwIDM2NjY2NgorMTUxIDAgNDAwMDAwCis1MjkgMCA0ODMzMzMKKzI1NyAwIDQ1MDAwMAorOTggMCA0MzMzMzMKKzE2MCAwIDQ2NjY2NgorNjY0IDAgNTY2NjY2CisxODYgMCA1MzMzMzMKKzE0NyAwIDUwMDAwMAorNjcgMCA1MTY2NjYKKzc4IDAgNTUwMDAwCis1NzUgMCA2MzMzMzMKKzIzMCAwIDYwMDAwMAorMTM0IDAgNTgzMzMzCisxMTQgMCA2MTY2NjYKKzYyOSAwIDcwMDAwMAorMjI0IDAgNjY2NjY2CisxMzggMCA2NTAwMDAKKzEyOSAwIDY4MzMzMworNjQ1IDAgNzUwMDAwCisyNjQgMCA3MzMzMzMKKzE0NSAwIDcxNjY2NgorNzA1IDAgODE2NjY2CiszNjUgMCA3ODMzMzMKKzE1NiAwIDc2NjY2NgorMTYwIDAgODAwMDAwCis3MjUgMCA4ODMzMzMKKzMzMCAwIDg1MDAwMAorMTM4IDAgODMzMzMzCisxNjIgMCA4NjY2NjYKKzYzOCAwIDk1MDAwMAorMzM3IDAgOTE2NjY2CisxNzAgMCA5MDAwMDAKKzEzMyAwIDkzMzMzMworNDMyIDAgMTAxNjY2NgorMjg3IDAgOTgzMzMzCisxMzAgMCA5NjY2NjYKKzEzNiAwIDEwMDAwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2hldmNfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5oZXZjIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaGV2Y182NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmhldmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUxZjdjZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2hldmNfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5oZXZjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2hldmNfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaGV2Y182NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk5NDkxYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2hldmNfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5pbmZvCkBAIC0wLDAgKzEsMzAyIEBACisxMDc1IDMyIDAKKzEwNzUgMzIgMAorNjg2MTMgMSA2NjY4NworMTkwMjUgMCAxOTk2ODcKKzI0MDUgMCAxMzM2ODcKKzc3NyAwIDk5Njg3Cis2ODEgMCAxNjY2ODcKKzIwMjU0IDAgMzMzNjg3CisyOTI3IDAgMjY2Njg3Cis3NjYgMCAyMzM2ODcKKzY1OCAwIDI5OTY4NworMjA3ODYgMCA0NjY2ODcKKzQyMTQgMCAzOTk2ODcKKzYwOSAwIDM2NjY4NworNjYxIDAgNDMzNjg3CisyMDgzOCAwIDU5OTY4NworNDIwOSAwIDUzMzY4NworNTA2IDAgNDk5Njg3Cis1ODYgMCA1NjY2ODcKKzIwNDE1IDAgNzMzNjg3Cis0MjA3IDAgNjY2Njg3Cis0MjcgMCA2MzM2ODcKKzUxNCAwIDY5OTY4NworMjQ0NTcgMCA4OTk2ODcKKzE5MDQgMCA4MzM2ODcKKzkyMSAwIDc2NjY4NworOTkyIDAgNzk5Njg3Cis1NDMgMCA4NjY2ODcKKzI0MzQyIDAgMTA2NjY4NworMTgyMiAwIDk5OTY4NworODQwIDAgOTMzNjg3Cis4OTIgMCA5NjY2ODcKKzcxNSAwIDEwMzM2ODcKKzIyODkzIDAgMTIzMzY4NworMTYxOCAwIDExNjY2ODcKKzg4MSAwIDEwOTk2ODcKKzg5MCAwIDExMzM2ODcKKzc5NCAwIDExOTk2ODcKKzI0MjkyIDAgMTM5OTY4NworMTY3MyAwIDEzMzM2ODcKKzc1NSAwIDEyNjY2ODcKKzgxMCAwIDEyOTk2ODcKKzU4OCAwIDEzNjY2ODcKKzE5ODI4IDAgMTUzMzY4NworMTUzOCAwIDE0NjY2ODcKKzg5NCAwIDE0MzM2ODcKKzkzMyAwIDE0OTk2ODcKKzE5ODUzIDAgMTY2NjY4NworMjAxMSAwIDE1OTk2ODcKKzk4MSAwIDE1NjY2ODcKKzkwMCAwIDE2MzM2ODcKKzIyODY5IDAgMTgzMzY4NworMTU2MiAwIDE3NjY2ODcKKzg0MiAwIDE2OTk2ODcKKzc2NSAwIDE3MzM2ODcKKzY2NSAwIDE3OTk2ODcKKzIyMzQ2IDAgMTk2NjY4NworMjI0NSAwIDE4OTk2ODcKKzUxNiAwIDE4NjY2ODcKKzYwNCAwIDE5MzM2ODcKKzI0MzMzIDAgMjA5OTY4NworMTc2NSAwIDIwMzM2ODcKKzMxOCAwIDE5OTk2ODcKKzMyMCAwIDIwNjY2ODcKKzE4NTc3IDAgMjE5OTY4NworMTEyMyAwIDIxNjY2ODcKKzMzNyAwIDIxMzM2ODcKKzE3NTA5IDAgMjI5OTY4NworODY5IDAgMjI2NjY4NworOTAxIDAgMjIzMzY4NworMjMzNjYgMCAyNDMzNjg3CisxMjE3IDAgMjM2NjY4NworMzgwIDAgMjMzMzY4NworMzQ3IDAgMjM5OTY4NworMTk1NDIgMCAyNTMzNjg3CisxODg3IDAgMjQ5OTY4NworNDY3IDAgMjQ2NjY4NworMTg5MzkgMCAyNjY2Njg3CisyODYzIDAgMjU5OTY4NworMzE3IDAgMjU2NjY4NworMjcyIDAgMjYzMzY4NworMTkzNTMgMCAyNzk5Njg3CisyMDkyIDAgMjczMzY4NworMjAzIDAgMjY5OTY4NworMzEwIDAgMjc2NjY4NworMTg4MDAgMCAyOTMzNjg3CisyMDM4IDAgMjg2NjY4NworMjQyIDAgMjgzMzY4NworMTk5IDAgMjg5OTY4NworMTc0NTIgMCAzMDk5Njg3CisxMDYwIDAgMzAzMzY4NworMzAxIDAgMjk2NjY4NworNDUyIDAgMjk5OTY4NworMjU2IDAgMzA2NjY4NworMjEzNTIgMCAzMTk5Njg3Cis0MDkgMCAzMTY2Njg3CisxNzMgMCAzMTMzNjg3CisxOTE0MiAwIDMyOTk2ODcKKzY0MiAwIDMyNjY2ODcKKzQ2OCAwIDMyMzM2ODcKKzE5MDY2IDAgMzQzMzY4NworNjM1IDAgMzM2NjY4NworMTk3IDAgMzMzMzY4NworMTkwIDAgMzM5OTY4NworMTg4MTMgMCAzNTY2Njg3Cis5NjkgMCAzNDk5Njg3CisxNjUgMCAzNDY2Njg3CisyMDMgMCAzNTMzNjg3CisxNzM2MiAwIDM3MzM2ODcKKzI0NiAwIDM2NjY2ODcKKzIzNiAwIDM1OTk2ODcKKzE3NCAwIDM2MzM2ODcKKzE2NCAwIDM2OTk2ODcKKzE3MDgxIDAgMzg5OTY4NworMzUzIDAgMzgzMzY4NworMjIyIDAgMzc2NjY4NworMTgxIDAgMzc5OTY4NworMTQ4IDAgMzg2NjY4NworMTA4MzUgMCAzOTk5Njg3CisxODUgMCAzOTY2Njg3CisxMzkgMCAzOTMzNjg3Cis3NTEwIDAgNDEzMzY4NworMTQ5IDAgNDA2NjY4NworMTI5IDAgNDAzMzY4NworMTMyIDAgNDA5OTY4NworMTA2MyAwIDQxNjY2ODcKKzgwNSAwIDQyNjY2ODcKKzE1NyAwIDQyMzM2ODcKKzM5NCAwIDQxOTk2ODcKKzkwODQwIDAgNDM5OTY4NworNjE1OSAwIDQzMzM2ODcKKzE3NTIgMCA0Mjk5Njg3Cis5ODUgMCA0MzY2Njg3CiszMTMzOCAwIDQ1MzM2ODcKKzMzOTAgMCA0NDY2Njg3Cis3NzIgMCA0NDMzNjg3Cis3ODEgMCA0NDk5Njg3CiszMTA4NCAwIDQ2NjY2ODcKKzM0OTggMCA0NTk5Njg3Cis4MTggMCA0NTY2Njg3Cis4ODEgMCA0NjMzNjg3CiszMDQxNiAwIDQ3OTk2ODcKKzMyNjUgMCA0NzMzNjg3Cis4MTUgMCA0Njk5Njg3Cis3OTAgMCA0NzY2Njg3CiszMTA1MyAwIDQ5MzM2ODcKKzMxMDYgMCA0ODY2Njg3Cis3MDggMCA0ODMzNjg3Cis3MTMgMCA0ODk5Njg3CiszMDIzMCAwIDUwNjY2ODcKKzMyMTQgMCA0OTk5Njg3Cis2MzkgMCA0OTY2Njg3Cis3NjggMCA1MDMzNjg3CisyOTY1NyAwIDUxOTk2ODcKKzMwMTMgMCA1MTMzNjg3Cis2MjIgMCA1MDk5Njg3Cis3MjAgMCA1MTY2Njg3CisyOTM0NCAwIDUzMzM2ODcKKzMxOTYgMCA1MjY2Njg3Cis3MTMgMCA1MjMzNjg3Cis3NzUgMCA1Mjk5Njg3CiszMDQyMCAwIDU0NjY2ODcKKzMzNzQgMCA1Mzk5Njg3Cis4MDMgMCA1MzY2Njg3Cis3MTcgMCA1NDMzNjg3CisyOTk2MCAwIDU1OTk2ODcKKzMyODMgMCA1NTMzNjg3Cis3OTMgMCA1NDk5Njg3Cis3OTAgMCA1NTY2Njg3CiszMTAxMSAwIDU3MzM2ODcKKzMzOTcgMCA1NjY2Njg3Cis4MDkgMCA1NjMzNjg3Cis4MzEgMCA1Njk5Njg3CiszMTE5NCAwIDU4NjY2ODcKKzM0MDEgMCA1Nzk5Njg3Cis4MDcgMCA1NzY2Njg3Cis4MjcgMCA1ODMzNjg3CiszMDMyNiAwIDU5OTk2ODcKKzMxODYgMCA1OTMzNjg3Cis4MTggMCA1ODk5Njg3Cis4NjMgMCA1OTY2Njg3CiszMTU1OSAwIDYxMzM2ODcKKzMzNjQgMCA2MDY2Njg3Cis4NDAgMCA2MDMzNjg3Cis5MTkgMCA2MDk5Njg3CiszMjAxMyAwIDYyNjY2ODcKKzM0OTUgMCA2MTk5Njg3Cis4NzEgMCA2MTY2Njg3Cis4MDMgMCA2MjMzNjg3CiszMDI5NCAwIDYzOTk2ODcKKzMxNTMgMCA2MzMzNjg3Cis3MTYgMCA2Mjk5Njg3Cis4MTIgMCA2MzY2Njg3CisyOTk1MiAwIDY1MzM2ODcKKzMyOTkgMCA2NDY2Njg3Cis4MDEgMCA2NDMzNjg3Cis3NDkgMCA2NDk5Njg3CiszMDU5OCAwIDY2NjY2ODcKKzM1MzYgMCA2NTk5Njg3Cis4ODcgMCA2NTY2Njg3Cis4NTAgMCA2NjMzNjg3CisxNzI0NiAwIDY2OTk2ODcKKzMxMTEwIDAgNjgzMzY4NworMzE5OCAwIDY3NjY2ODcKKzgwOSAwIDY3MzM2ODcKKzgzNiAwIDY3OTk2ODcKKzI5Nzg0IDAgNjk2NjY4NworMzE1NSAwIDY4OTk2ODcKKzg1OSAwIDY4NjY2ODcKKzk1OCAwIDY5MzM2ODcKKzMwNjY2IDAgNzA5OTY4NworMzM3MSAwIDcwMzM2ODcKKzg4NiAwIDY5OTk2ODcKKzg2MSAwIDcwNjY2ODcKKzMwNDE2IDAgNzIzMzY4NworMzM1MCAwIDcxNjY2ODcKKzkxNyAwIDcxMzM2ODcKKzk4NyAwIDcxOTk2ODcKKzI5NTA5IDAgNzM2NjY4NworMzU3NCAwIDcyOTk2ODcKKzk3MiAwIDcyNjY2ODcKKzg4NSAwIDczMzM2ODcKKzMwODcyIDAgNzQ5OTY4NworMzM5OSAwIDc0MzM2ODcKKzg5OCAwIDczOTk2ODcKKzEwMjcgMCA3NDY2Njg3CiszMTE1NSAwIDc2MzM2ODcKKzM0NTQgMCA3NTY2Njg3Cis5NjUgMCA3NTMzNjg3Cis4NDEgMCA3NTk5Njg3CisyODQ4NyAwIDc3NjY2ODcKKzM2MTYgMCA3Njk5Njg3Cis5MjEgMCA3NjY2Njg3Cis5OTEgMCA3NzMzNjg3CisyMzIwOCAwIDc4OTk2ODcKKzM1NTEgMCA3ODMzNjg3Cis5MTggMCA3Nzk5Njg3Cis4OTQgMCA3ODY2Njg3CisxNjk4MiAwIDgwMzM2ODcKKzM0NTggMCA3OTY2Njg3Cis4NDQgMCA3OTMzNjg3Cis5NDMgMCA3OTk5Njg3CiszMDM5NiAwIDgxOTk2ODcKKzQ5NjMgMCA4MTMzNjg3CisxNDE2IDAgODA2NjY4NworMTYzOSAwIDgwOTk2ODcKKzUyNCAwIDgxNjY2ODcKKzEzNjggMCA4Mjk5Njg3Cis1NjUgMCA4MjY2Njg3CiszOTIgMCA4MjMzNjg3Cis0MTMxNyAxIDgzOTk2ODcKKzE4NSAwIDgzNjY2ODcKKzQ3NyAwIDgzMzM2ODcKKzUzNDIgMCA4NTMzNjg3CisxMjc1IDAgODQ2NjY4NworMTIxIDAgODQzMzY4NworOTgyIDAgODQ5OTY4NworNjQ2NSAwIDg2OTk2ODcKKzI2MDYgMCA4NjMzNjg3CisxMTYzIDAgODU2NjY4NworOTQzIDAgODU5OTY4NworMTE4NiAwIDg2NjY2ODcKKzExNTkzIDAgODgzMzY4NworMzEyMiAwIDg3NjY2ODcKKzEyNzggMCA4NzMzNjg3CisxNTkzIDAgODc5OTY4NworOTA5OSAwIDg5OTk2ODcKKzk3OCAwIDg5MzM2ODcKKzc0OCAwIDg4NjY2ODcKKzgzNSAwIDg4OTk2ODcKKzM2NCAwIDg5NjY2ODcKKzQ3OTkgMCA5MDk5Njg3CiszNjUgMCA5MDY2Njg3CisyMTUgMCA5MDMzNjg3Cis0MzY3IDAgOTE5OTY4NworMzAyIDAgOTE2NjY4NworNDgwIDAgOTEzMzY4NworNjE4MCAwIDkzMzM2ODcKKzc3MSAwIDkyNjY2ODcKKzI0NiAwIDkyMzM2ODcKKzI4MSAwIDkyOTk2ODcKKzQ2MzYgMCA5Mzk5Njg3CisyMTEgMCA5MzY2Njg3Cis0MDM3IDAgOTQ5OTY4NworMzgyIDAgOTQ2NjY4NworNDg2IDAgOTQzMzY4NworMzk3NSAwIDk1OTk2ODcKKzMxMiAwIDk1NjY2ODcKKzQ3NCAwIDk1MzM2ODcKKzY4ODAgMCA5NzMzNjg3CisxMTE2IDAgOTY2NjY4NworMjA2IDAgOTYzMzY4NworNjk4IDAgOTY5OTY4NworNjI1NCAwIDk4OTk2ODcKKzI1ODEgMCA5ODMzNjg3CisxMzAzIDAgOTc2NjY4NworOTg1IDAgOTc5OTY4NworOTY3IDAgOTg2NjY4NworNjQ4NiAwIDEwMDMzNjg3CiszNTU1IDAgOTk2NjY4NworMTQzMCAwIDk5MzM2ODcKKzE2MDUgMCA5OTk5Njg3CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoei5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHouaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWZiZmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHouaW5mbwpAQCAtMCwwICsxLDQxNCBAQAorNTc2IDEgMAorNTc2IDEgMjQwMDAKKzU3NiAxIDQ4MDAwCis1NzYgMSA3MjAwMAorNTc2IDEgOTYwMDAKKzU3NiAxIDEyMDAwMAorNTc2IDEgMTQ0MDAwCis1NzYgMSAxNjgwMDAKKzU3NiAxIDE5MjAwMAorNTc2IDEgMjE2MDAwCis1NzYgMSAyNDAwMDAKKzU3NiAxIDI2NDAwMAorNTc2IDEgMjg4MDAwCis1NzYgMSAzMTIwMDAKKzU3NiAxIDMzNjAwMAorNTc2IDEgMzYwMDAwCis1NzYgMSAzODQwMDAKKzU3NiAxIDQwODAwMAorNTc2IDEgNDMyMDAwCis1NzYgMSA0NTYwMDAKKzU3NiAxIDQ4MDAwMAorNTc2IDEgNTA0MDAwCis1NzYgMSA1MjgwMDAKKzU3NiAxIDU1MjAwMAorNTc2IDEgNTc2MDAwCis1NzYgMSA2MDAwMDAKKzU3NiAxIDYyNDAwMAorNTc2IDEgNjQ4MDAwCis1NzYgMSA2NzIwMDAKKzU3NiAxIDY5NjAwMAorNTc2IDEgNzIwMDAwCis1NzYgMSA3NDQwMDAKKzU3NiAxIDc2ODAwMAorNTc2IDEgNzkyMDAwCis1NzYgMSA4MTYwMDAKKzU3NiAxIDg0MDAwMAorNTc2IDEgODY0MDAwCis1NzYgMSA4ODgwMDAKKzU3NiAxIDkxMjAwMAorNTc2IDEgOTM2MDAwCis1NzYgMSA5NjAwMDAKKzU3NiAxIDk4NDAwMAorNTc2IDEgMTAwODAwMAorNTc2IDEgMTAzMjAwMAorNTc2IDEgMTA1NjAwMAorNTc2IDEgMTA4MDAwMAorNTc2IDEgMTEwNDAwMAorNTc2IDEgMTEyODAwMAorNTc2IDEgMTE1MjAwMAorNTc2IDEgMTE3NjAwMAorNTc2IDEgMTIwMDAwMAorNTc2IDEgMTIyNDAwMAorNTc2IDEgMTI0ODAwMAorNTc2IDEgMTI3MjAwMAorNTc2IDEgMTI5NjAwMAorNTc2IDEgMTMyMDAwMAorNTc2IDEgMTM0NDAwMAorNTc2IDEgMTM2ODAwMAorNTc2IDEgMTM5MjAwMAorNTc2IDEgMTQxNjAwMAorNTc2IDEgMTQ0MDAwMAorNTc2IDEgMTQ2NDAwMAorNTc2IDEgMTQ4ODAwMAorNTc2IDEgMTUxMjAwMAorNTc2IDEgMTUzNjAwMAorNTc2IDEgMTU2MDAwMAorNTc2IDEgMTU4NDAwMAorNTc2IDEgMTYwODAwMAorNTc2IDEgMTYzMjAwMAorNTc2IDEgMTY1NjAwMAorNTc2IDEgMTY4MDAwMAorNTc2IDEgMTcwNDAwMAorNTc2IDEgMTcyODAwMAorNTc2IDEgMTc1MjAwMAorNTc2IDEgMTc3NjAwMAorNTc2IDEgMTgwMDAwMAorNTc2IDEgMTgyNDAwMAorNTc2IDEgMTg0ODAwMAorNTc2IDEgMTg3MjAwMAorNTc2IDEgMTg5NjAwMAorNTc2IDEgMTkyMDAwMAorNTc2IDEgMTk0NDAwMAorNTc2IDEgMTk2ODAwMAorNTc2IDEgMTk5MjAwMAorNTc2IDEgMjAxNjAwMAorNTc2IDEgMjA0MDAwMAorNTc2IDEgMjA2NDAwMAorNTc2IDEgMjA4ODAwMAorNTc2IDEgMjExMjAwMAorNTc2IDEgMjEzNjAwMAorNTc2IDEgMjE2MDAwMAorNTc2IDEgMjE4NDAwMAorNTc2IDEgMjIwODAwMAorNTc2IDEgMjIzMjAwMAorNTc2IDEgMjI1NjAwMAorNTc2IDEgMjI4MDAwMAorNTc2IDEgMjMwNDAwMAorNTc2IDEgMjMyODAwMAorNTc2IDEgMjM1MjAwMAorNTc2IDEgMjM3NjAwMAorNTc2IDEgMjQwMDAwMAorNTc2IDEgMjQyNDAwMAorNTc2IDEgMjQ0ODAwMAorNTc2IDEgMjQ3MjAwMAorNTc2IDEgMjQ5NjAwMAorNTc2IDEgMjUyMDAwMAorNTc2IDEgMjU0NDAwMAorNTc2IDEgMjU2ODAwMAorNTc2IDEgMjU5MjAwMAorNTc2IDEgMjYxNjAwMAorNTc2IDEgMjY0MDAwMAorNTc2IDEgMjY2NDAwMAorNTc2IDEgMjY4ODAwMAorNTc2IDEgMjcxMjAwMAorNTc2IDEgMjczNjAwMAorNTc2IDEgMjc2MDAwMAorNTc2IDEgMjc4NDAwMAorNTc2IDEgMjgwODAwMAorNTc2IDEgMjgzMjAwMAorNTc2IDEgMjg1NjAwMAorNTc2IDEgMjg4MDAwMAorNTc2IDEgMjkwNDAwMAorNTc2IDEgMjkyODAwMAorNTc2IDEgMjk1MjAwMAorNTc2IDEgMjk3NjAwMAorNTc2IDEgMzAwMDAwMAorNTc2IDEgMzAyNDAwMAorNTc2IDEgMzA0ODAwMAorNTc2IDEgMzA3MjAwMAorNTc2IDEgMzA5NjAwMAorNTc2IDEgMzEyMDAwMAorNTc2IDEgMzE0NDAwMAorNTc2IDEgMzE2ODAwMAorNTc2IDEgMzE5MjAwMAorNTc2IDEgMzIxNjAwMAorNTc2IDEgMzI0MDAwMAorNTc2IDEgMzI2NDAwMAorNTc2IDEgMzI4ODAwMAorNTc2IDEgMzMxMjAwMAorNTc2IDEgMzMzNjAwMAorNTc2IDEgMzM2MDAwMAorNTc2IDEgMzM4NDAwMAorNTc2IDEgMzQwODAwMAorNTc2IDEgMzQzMjAwMAorNTc2IDEgMzQ1NjAwMAorNTc2IDEgMzQ4MDAwMAorNTc2IDEgMzUwNDAwMAorNTc2IDEgMzUyODAwMAorNTc2IDEgMzU1MjAwMAorNTc2IDEgMzU3NjAwMAorNTc2IDEgMzYwMDAwMAorNTc2IDEgMzYyNDAwMAorNTc2IDEgMzY0ODAwMAorNTc2IDEgMzY3MjAwMAorNTc2IDEgMzY5NjAwMAorNTc2IDEgMzcyMDAwMAorNTc2IDEgMzc0NDAwMAorNTc2IDEgMzc2ODAwMAorNTc2IDEgMzc5MjAwMAorNTc2IDEgMzgxNjAwMAorNTc2IDEgMzg0MDAwMAorNTc2IDEgMzg2NDAwMAorNTc2IDEgMzg4ODAwMAorNTc2IDEgMzkxMjAwMAorNTc2IDEgMzkzNjAwMAorNTc2IDEgMzk2MDAwMAorNTc2IDEgMzk4NDAwMAorNTc2IDEgNDAwODAwMAorNTc2IDEgNDAzMjAwMAorNTc2IDEgNDA1NjAwMAorNTc2IDEgNDA4MDAwMAorNTc2IDEgNDEwNDAwMAorNTc2IDEgNDEyODAwMAorNTc2IDEgNDE1MjAwMAorNTc2IDEgNDE3NjAwMAorNTc2IDEgNDIwMDAwMAorNTc2IDEgNDIyNDAwMAorNTc2IDEgNDI0ODAwMAorNTc2IDEgNDI3MjAwMAorNTc2IDEgNDI5NjAwMAorNTc2IDEgNDMyMDAwMAorNTc2IDEgNDM0NDAwMAorNTc2IDEgNDM2ODAwMAorNTc2IDEgNDM5MjAwMAorNTc2IDEgNDQxNjAwMAorNTc2IDEgNDQ0MDAwMAorNTc2IDEgNDQ2NDAwMAorNTc2IDEgNDQ4ODAwMAorNTc2IDEgNDUxMjAwMAorNTc2IDEgNDUzNjAwMAorNTc2IDEgNDU2MDAwMAorNTc2IDEgNDU4NDAwMAorNTc2IDEgNDYwODAwMAorNTc2IDEgNDYzMjAwMAorNTc2IDEgNDY1NjAwMAorNTc2IDEgNDY4MDAwMAorNTc2IDEgNDcwNDAwMAorNTc2IDEgNDcyODAwMAorNTc2IDEgNDc1MjAwMAorNTc2IDEgNDc3NjAwMAorNTc2IDEgNDgwMDAwMAorNTc2IDEgNDgyNDAwMAorNTc2IDEgNDg0ODAwMAorNTc2IDEgNDg3MjAwMAorNTc2IDEgNDg5NjAwMAorNTc2IDEgNDkyMDAwMAorNTc2IDEgNDk0NDAwMAorNTc2IDEgNDk2ODAwMAorNTc2IDEgNDk5MjAwMAorNTc2IDEgNTAxNjAwMAorNTc2IDEgNTA0MDAwMAorNTc2IDEgNTA2NDAwMAorNTc2IDEgNTA4ODAwMAorNTc2IDEgNTExMjAwMAorNTc2IDEgNTEzNjAwMAorNTc2IDEgNTE2MDAwMAorNTc2IDEgNTE4NDAwMAorNTc2IDEgNTIwODAwMAorNTc2IDEgNTIzMjAwMAorNTc2IDEgNTI1NjAwMAorNTc2IDEgNTI4MDAwMAorNTc2IDEgNTMwNDAwMAorNTc2IDEgNTMyODAwMAorNTc2IDEgNTM1MjAwMAorNTc2IDEgNTM3NjAwMAorNTc2IDEgNTQwMDAwMAorNTc2IDEgNTQyNDAwMAorNTc2IDEgNTQ0ODAwMAorNTc2IDEgNTQ3MjAwMAorNTc2IDEgNTQ5NjAwMAorNTc2IDEgNTUyMDAwMAorNTc2IDEgNTU0NDAwMAorNTc2IDEgNTU2ODAwMAorNTc2IDEgNTU5MjAwMAorNTc2IDEgNTYxNjAwMAorNTc2IDEgNTY0MDAwMAorNTc2IDEgNTY2NDAwMAorNTc2IDEgNTY4ODAwMAorNTc2IDEgNTcxMjAwMAorNTc2IDEgNTczNjAwMAorNTc2IDEgNTc2MDAwMAorNTc2IDEgNTc4NDAwMAorNTc2IDEgNTgwODAwMAorNTc2IDEgNTgzMjAwMAorNTc2IDEgNTg1NjAwMAorNTc2IDEgNTg4MDAwMAorNTc2IDEgNTkwNDAwMAorNTc2IDEgNTkyODAwMAorNTc2IDEgNTk1MjAwMAorNTc2IDEgNTk3NjAwMAorNTc2IDEgNjAwMDAwMAorNTc2IDEgNjAyNDAwMAorNTc2IDEgNjA0ODAwMAorNTc2IDEgNjA3MjAwMAorNTc2IDEgNjA5NjAwMAorNTc2IDEgNjEyMDAwMAorNTc2IDEgNjE0NDAwMAorNTc2IDEgNjE2ODAwMAorNTc2IDEgNjE5MjAwMAorNTc2IDEgNjIxNjAwMAorNTc2IDEgNjI0MDAwMAorNTc2IDEgNjI2NDAwMAorNTc2IDEgNjI4ODAwMAorNTc2IDEgNjMxMjAwMAorNTc2IDEgNjMzNjAwMAorNTc2IDEgNjM2MDAwMAorNTc2IDEgNjM4NDAwMAorNTc2IDEgNjQwODAwMAorNTc2IDEgNjQzMjAwMAorNTc2IDEgNjQ1NjAwMAorNTc2IDEgNjQ4MDAwMAorNTc2IDEgNjUwNDAwMAorNTc2IDEgNjUyODAwMAorNTc2IDEgNjU1MjAwMAorNTc2IDEgNjU3NjAwMAorNTc2IDEgNjYwMDAwMAorNTc2IDEgNjYyNDAwMAorNTc2IDEgNjY0ODAwMAorNTc2IDEgNjY3MjAwMAorNTc2IDEgNjY5NjAwMAorNTc2IDEgNjcyMDAwMAorNTc2IDEgNjc0NDAwMAorNTc2IDEgNjc2ODAwMAorNTc2IDEgNjc5MjAwMAorNTc2IDEgNjgxNjAwMAorNTc2IDEgNjg0MDAwMAorNTc2IDEgNjg2NDAwMAorNTc2IDEgNjg4ODAwMAorNTc2IDEgNjkxMjAwMAorNTc2IDEgNjkzNjAwMAorNTc2IDEgNjk2MDAwMAorNTc2IDEgNjk4NDAwMAorNTc2IDEgNzAwODAwMAorNTc2IDEgNzAzMjAwMAorNTc2IDEgNzA1NjAwMAorNTc2IDEgNzA4MDAwMAorNTc2IDEgNzEwNDAwMAorNTc2IDEgNzEyODAwMAorNTc2IDEgNzE1MjAwMAorNTc2IDEgNzE3NjAwMAorNTc2IDEgNzIwMDAwMAorNTc2IDEgNzIyNDAwMAorNTc2IDEgNzI0ODAwMAorNTc2IDEgNzI3MjAwMAorNTc2IDEgNzI5NjAwMAorNTc2IDEgNzMyMDAwMAorNTc2IDEgNzM0NDAwMAorNTc2IDEgNzM2ODAwMAorNTc2IDEgNzM5MjAwMAorNTc2IDEgNzQxNjAwMAorNTc2IDEgNzQ0MDAwMAorNTc2IDEgNzQ2NDAwMAorNTc2IDEgNzQ4ODAwMAorNTc2IDEgNzUxMjAwMAorNTc2IDEgNzUzNjAwMAorNTc2IDEgNzU2MDAwMAorNTc2IDEgNzU4NDAwMAorNTc2IDEgNzYwODAwMAorNTc2IDEgNzYzMjAwMAorNTc2IDEgNzY1NjAwMAorNTc2IDEgNzY4MDAwMAorNTc2IDEgNzcwNDAwMAorNTc2IDEgNzcyODAwMAorNTc2IDEgNzc1MjAwMAorNTc2IDEgNzc3NjAwMAorNTc2IDEgNzgwMDAwMAorNTc2IDEgNzgyNDAwMAorNTc2IDEgNzg0ODAwMAorNTc2IDEgNzg3MjAwMAorNTc2IDEgNzg5NjAwMAorNTc2IDEgNzkyMDAwMAorNTc2IDEgNzk0NDAwMAorNTc2IDEgNzk2ODAwMAorNTc2IDEgNzk5MjAwMAorNTc2IDEgODAxNjAwMAorNTc2IDEgODA0MDAwMAorNTc2IDEgODA2NDAwMAorNTc2IDEgODA4ODAwMAorNTc2IDEgODExMjAwMAorNTc2IDEgODEzNjAwMAorNTc2IDEgODE2MDAwMAorNTc2IDEgODE4NDAwMAorNTc2IDEgODIwODAwMAorNTc2IDEgODIzMjAwMAorNTc2IDEgODI1NjAwMAorNTc2IDEgODI4MDAwMAorNTc2IDEgODMwNDAwMAorNTc2IDEgODMyODAwMAorNTc2IDEgODM1MjAwMAorNTc2IDEgODM3NjAwMAorNTc2IDEgODQwMDAwMAorNTc2IDEgODQyNDAwMAorNTc2IDEgODQ0ODAwMAorNTc2IDEgODQ3MjAwMAorNTc2IDEgODQ5NjAwMAorNTc2IDEgODUyMDAwMAorNTc2IDEgODU0NDAwMAorNTc2IDEgODU2ODAwMAorNTc2IDEgODU5MjAwMAorNTc2IDEgODYxNjAwMAorNTc2IDEgODY0MDAwMAorNTc2IDEgODY2NDAwMAorNTc2IDEgODY4ODAwMAorNTc2IDEgODcxMjAwMAorNTc2IDEgODczNjAwMAorNTc2IDEgODc2MDAwMAorNTc2IDEgODc4NDAwMAorNTc2IDEgODgwODAwMAorNTc2IDEgODgzMjAwMAorNTc2IDEgODg1NjAwMAorNTc2IDEgODg4MDAwMAorNTc2IDEgODkwNDAwMAorNTc2IDEgODkyODAwMAorNTc2IDEgODk1MjAwMAorNTc2IDEgODk3NjAwMAorNTc2IDEgOTAwMDAwMAorNTc2IDEgOTAyNDAwMAorNTc2IDEgOTA0ODAwMAorNTc2IDEgOTA3MjAwMAorNTc2IDEgOTA5NjAwMAorNTc2IDEgOTEyMDAwMAorNTc2IDEgOTE0NDAwMAorNTc2IDEgOTE2ODAwMAorNTc2IDEgOTE5MjAwMAorNTc2IDEgOTIxNjAwMAorNTc2IDEgOTI0MDAwMAorNTc2IDEgOTI2NDAwMAorNTc2IDEgOTI4ODAwMAorNTc2IDEgOTMxMjAwMAorNTc2IDEgOTMzNjAwMAorNTc2IDEgOTM2MDAwMAorNTc2IDEgOTM4NDAwMAorNTc2IDEgOTQwODAwMAorNTc2IDEgOTQzMjAwMAorNTc2IDEgOTQ1NjAwMAorNTc2IDEgOTQ4MDAwMAorNTc2IDEgOTUwNDAwMAorNTc2IDEgOTUyODAwMAorNTc2IDEgOTU1MjAwMAorNTc2IDEgOTU3NjAwMAorNTc2IDEgOTYwMDAwMAorNTc2IDEgOTYyNDAwMAorNTc2IDEgOTY0ODAwMAorNTc2IDEgOTY3MjAwMAorNTc2IDEgOTY5NjAwMAorNTc2IDEgOTcyMDAwMAorNTc2IDEgOTc0NDAwMAorNTc2IDEgOTc2ODAwMAorNTc2IDEgOTc5MjAwMAorNTc2IDEgOTgxNjAwMAorNTc2IDEgOTg0MDAwMAorNTc2IDEgOTg2NDAwMAorNTc2IDEgOTg4ODAwMAorNTc2IDEgOTkxMjAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHoubXAzIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHoubXAzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4M2E0NDEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHoubXAzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6X211bHRpX2ZyYW1lLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoel9tdWx0aV9mcmFtZS5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NWM3NWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoel9tdWx0aV9mcmFtZS5pbmZvCkBAIC0wLDAgKzEsMzg1IEBACis1NzYgMSAwCis1NzYgMSAyNDAwMAorMTE1MiAxIDQ4MDAwCisxMTUyIDEgOTYwMDAKKzExNTIgMSAxNDQwMDAKKzExNTIgMSAxOTIwMDAKKzE3MjggMSAyNDAwMDAKKzE3MjggMSAzMTIwMDAKKzE3MjggMSAzODQwMDAKKzE3MjggMSA0NTYwMDAKKzE3MjggMSA1MjgwMDAKKzIzMDQgMSA2MDAwMDAKKzIzMDQgMSA2OTYwMDAKKzIzMDQgMSA3OTIwMDAKKzIzMDQgMSA4ODgwMDAKKzIzMDQgMSA5ODQwMDAKKzU3NiAxIDEwODAwMDAKKzU3NiAxIDExMDQwMDAKKzU3NiAxIDExMjgwMDAKKzU3NiAxIDExNTIwMDAKKzU3NiAxIDExNzYwMDAKKzU3NiAxIDEyMDAwMDAKKzU3NiAxIDEyMjQwMDAKKzU3NiAxIDEyNDgwMDAKKzU3NiAxIDEyNzIwMDAKKzU3NiAxIDEyOTYwMDAKKzU3NiAxIDEzMjAwMDAKKzU3NiAxIDEzNDQwMDAKKzU3NiAxIDEzNjgwMDAKKzU3NiAxIDEzOTIwMDAKKzU3NiAxIDE0MTYwMDAKKzU3NiAxIDE0NDAwMDAKKzU3NiAxIDE0NjQwMDAKKzU3NiAxIDE0ODgwMDAKKzU3NiAxIDE1MTIwMDAKKzU3NiAxIDE1MzYwMDAKKzU3NiAxIDE1NjAwMDAKKzU3NiAxIDE1ODQwMDAKKzU3NiAxIDE2MDgwMDAKKzU3NiAxIDE2MzIwMDAKKzU3NiAxIDE2NTYwMDAKKzU3NiAxIDE2ODAwMDAKKzU3NiAxIDE3MDQwMDAKKzU3NiAxIDE3MjgwMDAKKzU3NiAxIDE3NTIwMDAKKzU3NiAxIDE3NzYwMDAKKzU3NiAxIDE4MDAwMDAKKzU3NiAxIDE4MjQwMDAKKzU3NiAxIDE4NDgwMDAKKzU3NiAxIDE4NzIwMDAKKzU3NiAxIDE4OTYwMDAKKzU3NiAxIDE5MjAwMDAKKzU3NiAxIDE5NDQwMDAKKzU3NiAxIDE5NjgwMDAKKzU3NiAxIDE5OTIwMDAKKzU3NiAxIDIwMTYwMDAKKzU3NiAxIDIwNDAwMDAKKzU3NiAxIDIwNjQwMDAKKzU3NiAxIDIwODgwMDAKKzU3NiAxIDIxMTIwMDAKKzU3NiAxIDIxMzYwMDAKKzU3NiAxIDIxNjAwMDAKKzU3NiAxIDIxODQwMDAKKzU3NiAxIDIyMDgwMDAKKzU3NiAxIDIyMzIwMDAKKzU3NiAxIDIyNTYwMDAKKzU3NiAxIDIyODAwMDAKKzU3NiAxIDIzMDQwMDAKKzU3NiAxIDIzMjgwMDAKKzU3NiAxIDIzNTIwMDAKKzU3NiAxIDIzNzYwMDAKKzU3NiAxIDI0MDAwMDAKKzU3NiAxIDI0MjQwMDAKKzU3NiAxIDI0NDgwMDAKKzU3NiAxIDI0NzIwMDAKKzU3NiAxIDI0OTYwMDAKKzU3NiAxIDI1MjAwMDAKKzU3NiAxIDI1NDQwMDAKKzU3NiAxIDI1NjgwMDAKKzU3NiAxIDI1OTIwMDAKKzU3NiAxIDI2MTYwMDAKKzU3NiAxIDI2NDAwMDAKKzU3NiAxIDI2NjQwMDAKKzU3NiAxIDI2ODgwMDAKKzU3NiAxIDI3MTIwMDAKKzU3NiAxIDI3MzYwMDAKKzU3NiAxIDI3NjAwMDAKKzU3NiAxIDI3ODQwMDAKKzU3NiAxIDI4MDgwMDAKKzU3NiAxIDI4MzIwMDAKKzU3NiAxIDI4NTYwMDAKKzU3NiAxIDI4ODAwMDAKKzU3NiAxIDI5MDQwMDAKKzU3NiAxIDI5MjgwMDAKKzU3NiAxIDI5NTIwMDAKKzU3NiAxIDI5NzYwMDAKKzU3NiAxIDMwMDAwMDAKKzU3NiAxIDMwMjQwMDAKKzU3NiAxIDMwNDgwMDAKKzU3NiAxIDMwNzIwMDAKKzU3NiAxIDMwOTYwMDAKKzU3NiAxIDMxMjAwMDAKKzU3NiAxIDMxNDQwMDAKKzU3NiAxIDMxNjgwMDAKKzU3NiAxIDMxOTIwMDAKKzU3NiAxIDMyMTYwMDAKKzU3NiAxIDMyNDAwMDAKKzU3NiAxIDMyNjQwMDAKKzU3NiAxIDMyODgwMDAKKzU3NiAxIDMzMTIwMDAKKzU3NiAxIDMzMzYwMDAKKzU3NiAxIDMzNjAwMDAKKzU3NiAxIDMzODQwMDAKKzU3NiAxIDM0MDgwMDAKKzU3NiAxIDM0MzIwMDAKKzU3NiAxIDM0NTYwMDAKKzU3NiAxIDM0ODAwMDAKKzU3NiAxIDM1MDQwMDAKKzU3NiAxIDM1MjgwMDAKKzU3NiAxIDM1NTIwMDAKKzU3NiAxIDM1NzYwMDAKKzU3NiAxIDM2MDAwMDAKKzU3NiAxIDM2MjQwMDAKKzU3NiAxIDM2NDgwMDAKKzU3NiAxIDM2NzIwMDAKKzU3NiAxIDM2OTYwMDAKKzU3NiAxIDM3MjAwMDAKKzU3NiAxIDM3NDQwMDAKKzU3NiAxIDM3NjgwMDAKKzU3NiAxIDM3OTIwMDAKKzU3NiAxIDM4MTYwMDAKKzU3NiAxIDM4NDAwMDAKKzU3NiAxIDM4NjQwMDAKKzU3NiAxIDM4ODgwMDAKKzU3NiAxIDM5MTIwMDAKKzU3NiAxIDM5MzYwMDAKKzU3NiAxIDM5NjAwMDAKKzU3NiAxIDM5ODQwMDAKKzU3NiAxIDQwMDgwMDAKKzU3NiAxIDQwMzIwMDAKKzU3NiAxIDQwNTYwMDAKKzU3NiAxIDQwODAwMDAKKzU3NiAxIDQxMDQwMDAKKzU3NiAxIDQxMjgwMDAKKzU3NiAxIDQxNTIwMDAKKzU3NiAxIDQxNzYwMDAKKzU3NiAxIDQyMDAwMDAKKzU3NiAxIDQyMjQwMDAKKzU3NiAxIDQyNDgwMDAKKzU3NiAxIDQyNzIwMDAKKzU3NiAxIDQyOTYwMDAKKzU3NiAxIDQzMjAwMDAKKzU3NiAxIDQzNDQwMDAKKzU3NiAxIDQzNjgwMDAKKzU3NiAxIDQzOTIwMDAKKzU3NiAxIDQ0MTYwMDAKKzU3NiAxIDQ0NDAwMDAKKzU3NiAxIDQ0NjQwMDAKKzU3NiAxIDQ0ODgwMDAKKzU3NiAxIDQ1MTIwMDAKKzU3NiAxIDQ1MzYwMDAKKzU3NiAxIDQ1NjAwMDAKKzU3NiAxIDQ1ODQwMDAKKzU3NiAxIDQ2MDgwMDAKKzU3NiAxIDQ2MzIwMDAKKzU3NiAxIDQ2NTYwMDAKKzU3NiAxIDQ2ODAwMDAKKzU3NiAxIDQ3MDQwMDAKKzU3NiAxIDQ3MjgwMDAKKzU3NiAxIDQ3NTIwMDAKKzU3NiAxIDQ3NzYwMDAKKzU3NiAxIDQ4MDAwMDAKKzU3NiAxIDQ4MjQwMDAKKzU3NiAxIDQ4NDgwMDAKKzU3NiAxIDQ4NzIwMDAKKzU3NiAxIDQ4OTYwMDAKKzU3NiAxIDQ5MjAwMDAKKzU3NiAxIDQ5NDQwMDAKKzU3NiAxIDQ5NjgwMDAKKzU3NiAxIDQ5OTIwMDAKKzU3NiAxIDUwMTYwMDAKKzU3NiAxIDUwNDAwMDAKKzU3NiAxIDUwNjQwMDAKKzU3NiAxIDUwODgwMDAKKzU3NiAxIDUxMTIwMDAKKzU3NiAxIDUxMzYwMDAKKzU3NiAxIDUxNjAwMDAKKzU3NiAxIDUxODQwMDAKKzU3NiAxIDUyMDgwMDAKKzU3NiAxIDUyMzIwMDAKKzU3NiAxIDUyNTYwMDAKKzU3NiAxIDUyODAwMDAKKzU3NiAxIDUzMDQwMDAKKzU3NiAxIDUzMjgwMDAKKzU3NiAxIDUzNTIwMDAKKzU3NiAxIDUzNzYwMDAKKzU3NiAxIDU0MDAwMDAKKzU3NiAxIDU0MjQwMDAKKzU3NiAxIDU0NDgwMDAKKzU3NiAxIDU0NzIwMDAKKzU3NiAxIDU0OTYwMDAKKzU3NiAxIDU1MjAwMDAKKzU3NiAxIDU1NDQwMDAKKzU3NiAxIDU1NjgwMDAKKzU3NiAxIDU1OTIwMDAKKzU3NiAxIDU2MTYwMDAKKzU3NiAxIDU2NDAwMDAKKzU3NiAxIDU2NjQwMDAKKzU3NiAxIDU2ODgwMDAKKzU3NiAxIDU3MTIwMDAKKzU3NiAxIDU3MzYwMDAKKzU3NiAxIDU3NjAwMDAKKzU3NiAxIDU3ODQwMDAKKzU3NiAxIDU4MDgwMDAKKzU3NiAxIDU4MzIwMDAKKzU3NiAxIDU4NTYwMDAKKzU3NiAxIDU4ODAwMDAKKzU3NiAxIDU5MDQwMDAKKzU3NiAxIDU5MjgwMDAKKzU3NiAxIDU5NTIwMDAKKzU3NiAxIDU5NzYwMDAKKzU3NiAxIDYwMDAwMDAKKzU3NiAxIDYwMjQwMDAKKzU3NiAxIDYwNDgwMDAKKzU3NiAxIDYwNzIwMDAKKzU3NiAxIDYwOTYwMDAKKzU3NiAxIDYxMjAwMDAKKzU3NiAxIDYxNDQwMDAKKzU3NiAxIDYxNjgwMDAKKzU3NiAxIDYxOTIwMDAKKzU3NiAxIDYyMTYwMDAKKzU3NiAxIDYyNDAwMDAKKzU3NiAxIDYyNjQwMDAKKzU3NiAxIDYyODgwMDAKKzU3NiAxIDYzMTIwMDAKKzU3NiAxIDYzMzYwMDAKKzU3NiAxIDYzNjAwMDAKKzU3NiAxIDYzODQwMDAKKzU3NiAxIDY0MDgwMDAKKzU3NiAxIDY0MzIwMDAKKzU3NiAxIDY0NTYwMDAKKzU3NiAxIDY0ODAwMDAKKzU3NiAxIDY1MDQwMDAKKzU3NiAxIDY1MjgwMDAKKzU3NiAxIDY1NTIwMDAKKzU3NiAxIDY1NzYwMDAKKzU3NiAxIDY2MDAwMDAKKzU3NiAxIDY2MjQwMDAKKzU3NiAxIDY2NDgwMDAKKzU3NiAxIDY2NzIwMDAKKzU3NiAxIDY2OTYwMDAKKzU3NiAxIDY3MjAwMDAKKzU3NiAxIDY3NDQwMDAKKzU3NiAxIDY3NjgwMDAKKzU3NiAxIDY3OTIwMDAKKzU3NiAxIDY4MTYwMDAKKzU3NiAxIDY4NDAwMDAKKzU3NiAxIDY4NjQwMDAKKzU3NiAxIDY4ODgwMDAKKzU3NiAxIDY5MTIwMDAKKzU3NiAxIDY5MzYwMDAKKzU3NiAxIDY5NjAwMDAKKzU3NiAxIDY5ODQwMDAKKzU3NiAxIDcwMDgwMDAKKzU3NiAxIDcwMzIwMDAKKzU3NiAxIDcwNTYwMDAKKzU3NiAxIDcwODAwMDAKKzU3NiAxIDcxMDQwMDAKKzU3NiAxIDcxMjgwMDAKKzU3NiAxIDcxNTIwMDAKKzU3NiAxIDcxNzYwMDAKKzU3NiAxIDcyMDAwMDAKKzU3NiAxIDcyMjQwMDAKKzU3NiAxIDcyNDgwMDAKKzU3NiAxIDcyNzIwMDAKKzU3NiAxIDcyOTYwMDAKKzU3NiAxIDczMjAwMDAKKzU3NiAxIDczNDQwMDAKKzU3NiAxIDczNjgwMDAKKzU3NiAxIDczOTIwMDAKKzU3NiAxIDc0MTYwMDAKKzU3NiAxIDc0NDAwMDAKKzU3NiAxIDc0NjQwMDAKKzU3NiAxIDc0ODgwMDAKKzU3NiAxIDc1MTIwMDAKKzU3NiAxIDc1MzYwMDAKKzU3NiAxIDc1NjAwMDAKKzU3NiAxIDc1ODQwMDAKKzU3NiAxIDc2MDgwMDAKKzU3NiAxIDc2MzIwMDAKKzU3NiAxIDc2NTYwMDAKKzU3NiAxIDc2ODAwMDAKKzU3NiAxIDc3MDQwMDAKKzU3NiAxIDc3MjgwMDAKKzU3NiAxIDc3NTIwMDAKKzU3NiAxIDc3NzYwMDAKKzU3NiAxIDc4MDAwMDAKKzU3NiAxIDc4MjQwMDAKKzU3NiAxIDc4NDgwMDAKKzU3NiAxIDc4NzIwMDAKKzU3NiAxIDc4OTYwMDAKKzU3NiAxIDc5MjAwMDAKKzU3NiAxIDc5NDQwMDAKKzU3NiAxIDc5NjgwMDAKKzU3NiAxIDc5OTIwMDAKKzU3NiAxIDgwMTYwMDAKKzU3NiAxIDgwNDAwMDAKKzU3NiAxIDgwNjQwMDAKKzU3NiAxIDgwODgwMDAKKzU3NiAxIDgxMTIwMDAKKzU3NiAxIDgxMzYwMDAKKzU3NiAxIDgxNjAwMDAKKzU3NiAxIDgxODQwMDAKKzU3NiAxIDgyMDgwMDAKKzU3NiAxIDgyMzIwMDAKKzU3NiAxIDgyNTYwMDAKKzU3NiAxIDgyODAwMDAKKzU3NiAxIDgzMDQwMDAKKzU3NiAxIDgzMjgwMDAKKzU3NiAxIDgzNTIwMDAKKzU3NiAxIDgzNzYwMDAKKzU3NiAxIDg0MDAwMDAKKzU3NiAxIDg0MjQwMDAKKzU3NiAxIDg0NDgwMDAKKzU3NiAxIDg0NzIwMDAKKzU3NiAxIDg0OTYwMDAKKzU3NiAxIDg1MjAwMDAKKzU3NiAxIDg1NDQwMDAKKzU3NiAxIDg1NjgwMDAKKzU3NiAxIDg1OTIwMDAKKzU3NiAxIDg2MTYwMDAKKzU3NiAxIDg2NDAwMDAKKzU3NiAxIDg2NjQwMDAKKzU3NiAxIDg2ODgwMDAKKzU3NiAxIDg3MTIwMDAKKzU3NiAxIDg3MzYwMDAKKzU3NiAxIDg3NjAwMDAKKzU3NiAxIDg3ODQwMDAKKzU3NiAxIDg4MDgwMDAKKzU3NiAxIDg4MzIwMDAKKzU3NiAxIDg4NTYwMDAKKzU3NiAxIDg4ODAwMDAKKzU3NiAxIDg5MDQwMDAKKzU3NiAxIDg5MjgwMDAKKzU3NiAxIDg5NTIwMDAKKzU3NiAxIDg5NzYwMDAKKzU3NiAxIDkwMDAwMDAKKzU3NiAxIDkwMjQwMDAKKzU3NiAxIDkwNDgwMDAKKzU3NiAxIDkwNzIwMDAKKzU3NiAxIDkwOTYwMDAKKzU3NiAxIDkxMjAwMDAKKzU3NiAxIDkxNDQwMDAKKzU3NiAxIDkxNjgwMDAKKzU3NiAxIDkxOTIwMDAKKzU3NiAxIDkyMTYwMDAKKzU3NiAxIDkyNDAwMDAKKzU3NiAxIDkyNjQwMDAKKzU3NiAxIDkyODgwMDAKKzU3NiAxIDkzMTIwMDAKKzU3NiAxIDkzMzYwMDAKKzU3NiAxIDkzNjAwMDAKKzU3NiAxIDkzODQwMDAKKzU3NiAxIDk0MDgwMDAKKzU3NiAxIDk0MzIwMDAKKzU3NiAxIDk0NTYwMDAKKzU3NiAxIDk0ODAwMDAKKzU3NiAxIDk1MDQwMDAKKzU3NiAxIDk1MjgwMDAKKzU3NiAxIDk1NTIwMDAKKzU3NiAxIDk1NzYwMDAKKzU3NiAxIDk2MDAwMDAKKzU3NiAxIDk2MjQwMDAKKzU3NiAxIDk2NDgwMDAKKzU3NiAxIDk2NzIwMDAKKzU3NiAxIDk2OTYwMDAKKzU3NiAxIDk3MjAwMDAKKzU3NiAxIDk3NDQwMDAKKzU3NiAxIDk3NjgwMDAKKzU3NiAxIDk3OTIwMDAKKzU3NiAxIDk4MTYwMDAKKzU3NiAxIDk4NDAwMDAKKzU3NiAxIDk4NjQwMDAKKzU3NiAxIDk4ODgwMDAKKzU3NiAxIDk5MTIwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWcyXzE3NngxNDRfMTA1a2Jwc18yNWZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzJfMTc2eDE0NF8xMDVrYnBzXzI1ZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU0MDY0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWcyXzE3NngxNDRfMTA1a2Jwc18yNWZwcy5pbmZvCkBAIC0wLDAgKzEsMjQ5IEBACis2NDU4IDEgNDAwMDAKKzQwNDAgMCA4MDAwMAorMzI1NSAwIDEyMDAwMAorMzAyNiAwIDE2MDAwMAorMzI5MyAwIDIwMDAwMAorMzA4OSAwIDI0MDAwMAorMzMwNSAwIDI4MDAwMAorMTc5NCAwIDMyMDAwMAorMTg0OCAwIDM2MDAwMAorMTI4OCAwIDQwMDAwMAorMTUxMSAwIDQ0MDAwMAorMTUyNyAwIDQ4MDAwMAorNjE0NiAxIDUyMDAwMAorMTI0MyAwIDU2MDAwMAorMTA5OSAwIDYwMDAwMAorMTM1NCAwIDY0MDAwMAorMTM2NiAwIDY4MDAwMAorMTA0MiAwIDcyMDAwMAorMTYwMCAwIDc2MDAwMAorODc1IDAgODAwMDAwCisxNzI4IDAgODQwMDAwCisxMjU0IDAgODgwMDAwCis5OTQgMCA5MjAwMDAKKzE1OTEgMCA5NjAwMDAKKzYyNjUgMSAxMDAwMDAwCisxMDE4IDAgMTA0MDAwMAorODI1IDAgMTA4MDAwMAorODY5IDAgMTEyMDAwMAorOTIxIDAgMTE2MDAwMAorOTc1IDAgMTIwMDAwMAorOTI0IDAgMTI0MDAwMAorODM0IDAgMTI4MDAwMAorMTA2NiAwIDEzMjAwMDAKKzc5MyAwIDEzNjAwMDAKKzg4OSAwIDE0MDAwMDAKKzIwNTAgMCAxNDQwMDAwCis2Mjc2IDEgMTQ4MDAwMAorODgxIDAgMTUyMDAwMAorMjYwIDAgMTU2MDAwMAorNzMwIDAgMTYwMDAwMAorNDMxIDAgMTY0MDAwMAorMzUxIDAgMTY4MDAwMAorMzIxIDAgMTcyMDAwMAorMzgwMiAwIDE3NjAwMDAKKzE0NiAwIDE4MDAwMDAKKzY0NjIgMCAxODQwMDAwCiszMjQ2IDAgMTg4MDAwMAorNTMzIDAgMTkyMDAwMAorNjIzMSAxIDE5NjAwMDAKKzEzNzggMCAyMDAwMDAwCis3MTkgMCAyMDQwMDAwCis4MTggMCAyMDgwMDAwCis4NTYgMCAyMTIwMDAwCis5MzcgMCAyMTYwMDAwCis2MTEgMCAyMjAwMDAwCiszMDMxIDAgMjI0MDAwMAorMTA0MSAwIDIyODAwMDAKKzYwNCAwIDIzMjAwMDAKKzcxNCAwIDIzNjAwMDAKKzEyODMgMCAyNDAwMDAwCis3NTY1IDEgMjQ0MDAwMAorNjAyIDAgMjQ4MDAwMAorNTMwIDAgMjUyMDAwMAorMjU3OSAwIDI1NjAwMDAKKzExNSAwIDI2MDAwMDAKKzEwNTggMCAyNjQwMDAwCis2ODkgMCAyNjgwMDAwCisxMTE5IDAgMjcyMDAwMAorNjk4IDAgMjc2MDAwMAorMTAwNiAwIDI4MDAwMDAKKzU0NSAwIDI4NDAwMDAKKzE2MTcgMCAyODgwMDAwCis5MTIzIDEgMjkyMDAwMAorNTI3IDAgMjk2MDAwMAorMTU3NiAwIDMwMDAwMDAKKzQ2NSAwIDMwNDAwMDAKKzc0MSAwIDMwODAwMDAKKzUyMSAwIDMxMjAwMDAKKzEzMjIgMCAzMTYwMDAwCis3NzUgMCAzMjAwMDAwCis4NjMgMCAzMjQwMDAwCis5MTAgMCAzMjgwMDAwCis5MTUgMCAzMzIwMDAwCis5MjYgMCAzMzYwMDAwCis3NTU2IDEgMzQwMDAwMAorNzQxIDAgMzQ0MDAwMAorNTI3IDAgMzQ4MDAwMAorMjUxNiAwIDM1MjAwMDAKKzQ1OSAwIDM1NjAwMDAKKzQwNCAwIDM2MDAwMDAKKzUwOSAwIDM2NDAwMDAKKzEyMjcgMCAzNjgwMDAwCisxNTYxIDAgMzcyMDAwMAorNDkwIDAgMzc2MDAwMAorNzEyIDAgMzgwMDAwMAorODAzIDAgMzg0MDAwMAorNzUyNCAxIDM4ODAwMDAKKzczMCAwIDM5MjAwMDAKKzQ2MSAwIDM5NjAwMDAKKzI1MjYgMCA0MDAwMDAwCis0NTMgMCA0MDQwMDAwCis2MzIgMCA0MDgwMDAwCis3ODMgMCA0MTIwMDAwCis4NDMgMCA0MTYwMDAwCis5MTggMCA0MjAwMDAwCis5NjEgMCA0MjQwMDAwCis5NDggMCA0MjgwMDAwCis5NTkgMCA0MzIwMDAwCis3NTk4IDEgNDM2MDAwMAorNjc4IDAgNDQwMDAwMAorNTY5IDAgNDQ0MDAwMAorODkzIDAgNDQ4MDAwMAorNjI0IDAgNDUyMDAwMAorNzU1IDAgNDU2MDAwMAorMjIzNCAwIDQ2MDAwMDAKKzU1NiAwIDQ2NDAwMDAKKzk0NCAwIDQ2ODAwMDAKKzczOSAwIDQ3MjAwMDAKKzg2MiAwIDQ3NjAwMDAKKzkzOCAwIDQ4MDAwMDAKKzc1NzQgMSA0ODQwMDAwCis2OTkgMCA0ODgwMDAwCis3MDEgMCA0OTIwMDAwCis1MzAgMCA0OTYwMDAwCis2ODkgMCA1MDAwMDAwCis3NzggMCA1MDQwMDAwCis4NTYgMCA1MDgwMDAwCis5MzAgMCA1MTIwMDAwCis5NzUgMCA1MTYwMDAwCisxMDIxIDAgNTIwMDAwMAorMTA3NCAwIDUyNDAwMDAKKzk3OCAwIDUyODAwMDAKKzgwMjEgMSA1MzIwMDAwCis3MDQgMCA1MzYwMDAwCis2MTAgMCA1NDAwMDAwCis2OTcgMCA1NDQwMDAwCis3MTEgMCA1NDgwMDAwCis4MjAgMCA1NTIwMDAwCis4NDMgMCA1NTYwMDAwCisyNTEgMCA1NjAwMDAwCiszMzY3IDAgNTY0MDAwMAorNTA3IDAgNTY4MDAwMAorMzE2OCAxIDU3MjAwMDAKKzc3OSAwIDU3NjAwMDAKKzMxNiAwIDU4MDAwMDAKKzYzNSAwIDU4NDAwMDAKKzIwNCAwIDU4ODAwMDAKKzk3OCAwIDU5MjAwMDAKKzEyNyAwIDU5NjAwMDAKKzU4OSAwIDYwMDAwMDAKKzYwNCAwIDYwNDAwMDAKKzY2NiAwIDYwODAwMDAKKzU4MiAwIDYxMjAwMDAKKzcyOSAwIDYxNjAwMDAKKzQxNTIgMSA2MjAwMDAwCis4NTggMCA2MjQwMDAwCis3MzkgMCA2MjgwMDAwCis4ODUgMCA2MzIwMDAwCis3NDkgMCA2MzYwMDAwCis5NTAgMCA2NDAwMDAwCis1OTMgMCA2NDQwMDAwCis3NzEgMCA2NDgwMDAwCis2NzggMCA2NTIwMDAwCis1MjkgMCA2NTYwMDAwCis4MzUgMCA2NjAwMDAwCiszOTEgMCA2NjQwMDAwCis0NjkyIDEgNjY4MDAwMAorNDczIDAgNjcyMDAwMAorNzI0IDAgNjc2MDAwMAorMzgxIDAgNjgwMDAwMAorOTA5IDAgNjg0MDAwMAorMzk0IDAgNjg4MDAwMAorNjU5IDAgNjkyMDAwMAorMzY3IDAgNjk2MDAwMAorNjU4IDAgNzAwMDAwMAorNTIzIDAgNzA0MDAwMAorNTU0IDAgNzA4MDAwMAorNTUzIDAgNzEyMDAwMAorNjA4MCAxIDcxNjAwMDAKKzQ5NiAwIDcyMDAwMDAKKzc2MyAwIDcyNDAwMDAKKzkzOSAwIDcyODAwMDAKKzcxNSAwIDczMjAwMDAKKzY3MiAwIDczNjAwMDAKKzYxNCAwIDc0MDAwMDAKKzgxMSAwIDc0NDAwMDAKKzkxNiAwIDc0ODAwMDAKKzExNTMgMCA3NTIwMDAwCis5NDAgMCA3NTYwMDAwCiszMjIgMCA3NjAwMDAwCis2NjEzIDEgNzY0MDAwMAorODUxIDAgNzY4MDAwMAorMTAwNyAwIDc3MjAwMDAKKzUyMCAwIDc3NjAwMDAKKzQ1NiAwIDc4MDAwMDAKKzYzOSAwIDc4NDAwMDAKKzc1OCAwIDc4ODAwMDAKKzg3OSAwIDc5MjAwMDAKKzExNTIgMCA3OTYwMDAwCisxMDYxIDAgODAwMDAwMAorOTQ2IDAgODA0MDAwMAorODU5IDAgODA4MDAwMAorMzYxMCAxIDgxMjAwMDAKKzg3MSAwIDgxNjAwMDAKKzc0NiAwIDgyMDAwMDAKKzM2NyAwIDgyNDAwMDAKKzM5NyAwIDgyODAwMDAKKzkzMCAwIDgzMjAwMDAKKzMzNyAwIDgzNjAwMDAKKzQxOCAwIDg0MDAwMDAKKzc0MCAwIDg0NDAwMDAKKzYzNyAwIDg0ODAwMDAKKzY2NiAwIDg1MjAwMDAKKzYyNyAwIDg1NjAwMDAKKzQzMzggMSA4NjAwMDAwCis3NDUgMCA4NjQwMDAwCis3ODMgMCA4NjgwMDAwCis0NjUgMCA4NzIwMDAwCis0NjAgMCA4NzYwMDAwCis0NTUgMCA4ODAwMDAwCis1MDYgMCA4ODQwMDAwCis0OTIgMCA4ODgwMDAwCis0ODUgMCA4OTIwMDAwCis1MTcgMCA4OTYwMDAwCis1MzQgMCA5MDAwMDAwCiszOTUgMCA5MDQwMDAwCis1NjI2IDEgOTA4MDAwMAorMTE2OSAwIDkxMjAwMDAKKzU2NCAwIDkxNjAwMDAKKzI2MSAwIDkyMDAwMDAKKzMyNyAwIDkyNDAwMDAKKzMwMyAwIDkyODAwMDAKKzExNDUgMCA5MzIwMDAwCisyNTcgMCA5MzYwMDAwCis0OTggMCA5NDAwMDAwCis0NjUgMCA5NDQwMDAwCis0MTQgMCA5NDgwMDAwCis1NTMgMCA5NTIwMDAwCis1NjE3IDEgOTU2MDAwMAorMTA1MiAwIDk2MDAwMDAKKzU5MiAwIDk2NDAwMDAKKzMyMyAwIDk2ODAwMDAKKzQ5NyAwIDk3MjAwMDAKKzQ2NyAwIDk3NjAwMDAKKzcwNSAwIDk4MDAwMDAKKzEwODYgMCA5ODQwMDAwCisxMjUzIDAgOTg4MDAwMAorMTI1MiAwIDk5MjAwMDAKKzc3NiAwIDk5NjAwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWcyXzE3NngxNDRfMTA1a2Jwc18yNWZwcy5tMnYgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMubTJ2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZjkwYzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMubTJ2CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWcyXzM1MngyODhfMW1icHNfNjBmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWcyXzM1MngyODhfMW1icHNfNjBmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTdjYWY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzJfMzUyeDI4OF8xbWJwc182MGZwcy5pbmZvCkBAIC0wLDAgKzEsNjAgQEAKKzE2NjgwIDEgMTY2NjYKKzE3MDE3IDAgMzMzMzMKKzEwNTM0IDAgNTAwMDAKKzEwMjg5IDAgNjY2NjYKKzM2OTggMCA4MzMzMworMjc3NiAwIDEwMDAwMAorMTkzNiAwIDExNjY2NgorMTQ5MyAwIDEzMzMzMworMTIxNyAwIDE1MDAwMAorOTkzIDAgMTY2NjY2Cis4MDUgMCAxODMzMzMKKzg1NyAwIDIwMDAwMAorNTA4MiAxIDIxNjY2NgorODEyIDAgMjMzMzMzCis3MTggMCAyNTAwMDAKKzc0NiAwIDI2NjY2NgorNzYyIDAgMjgzMzMzCis4NjUgMCAzMDAwMDAKKzc4MiAwIDMxNjY2NgorODMzIDAgMzMzMzMzCis3NTAgMCAzNTAwMDAKKzgxOSAwIDM2NjY2NgorODI2IDAgMzgzMzMzCis4NDYgMCA0MDAwMDAKKzQ1MjIgMSA0MTY2NjYKKzY3OCAwIDQzMzMzMworNzE4IDAgNDUwMDAwCis4MDMgMCA0NjY2NjYKKzc2OSAwIDQ4MzMzMworNzYyIDAgNTAwMDAwCis1ODcgMCA1MTY2NjYKKzYzNSAwIDUzMzMzMworNjU4IDAgNTUwMDAwCis3MTQgMCA1NjY2NjYKKzY3NyAwIDU4MzMzMworNjk5IDAgNjAwMDAwCis0NjE2IDEgNjE2NjY2Cis4MDAgMCA2MzMzMzMKKzgzMSAwIDY1MDAwMAorOTI4IDAgNjY2NjY2Cis4NjkgMCA2ODMzMzMKKzkzMSAwIDcwMDAwMAorOTMwIDAgNzE2NjY2Cis5NzQgMCA3MzMzMzMKKzk3OCAwIDc1MDAwMAorOTMyIDAgNzY2NjY2Cis5MTggMCA3ODMzMzMKKzk3OCAwIDgwMDAwMAorNDY1NSAxIDgxNjY2NgorODk3IDAgODMzMzMzCis4OTYgMCA4NTAwMDAKKzg4MyAwIDg2NjY2NgorOTQ5IDAgODgzMzMzCis5NjUgMCA5MDAwMDAKKzk1MSAwIDkxNjY2NgorOTAxIDAgOTMzMzMzCis5NjUgMCA5NTAwMDAKKzk1NSAwIDk2NjY2NgorOTQ4IDAgOTgzMzMzCis5NjggMCAxMDAwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLm0ydiBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWcyXzM1MngyODhfMW1icHNfNjBmcHMubTJ2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNjdjMmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLm0ydgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YmE5YjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMuaW5mbwpAQCAtMCwwICsxLDI0MSBAQAorNDcgMzIgMAorMjExMTUgMSAwCisxNjQ1NiAwIDMzMzMzCisxMTg4MCAwIDY2NjY2CisxMjE1NSAwIDEwMDAwMAorMTE0MDIgMCAxMzMzMzMKKzUzNDUgMCAxNjY2NjYKKzI5ODYgMCAyMDAwMDAKKzE5MjQgMCAyMzMzMzMKKzIyNzUgMCAyNjY2NjYKKzI3OTMgMCAzMDAwMDAKKzI3NTYgMCAzMzMzMzMKKzI5MzMgMCAzNjY2NjYKKzIxMTAwIDEgNDAwMDAwCisxMzAyIDAgNDMzMzMzCisyMjA2IDAgNDY2NjY2CisxNTk5IDAgNTAwMDAwCisyNTU4IDAgNTMzMzMzCisyNzg0IDAgNTY2NjY2CisyNDU4IDAgNjAwMDAwCisyNDgwIDAgNjMzMzMzCisxNDQ2IDAgNjY2NjY2CiszMTA5IDAgNzAwMDAwCis5NDQgMCA3MzMzMzMKKzMxMzQgMCA3NjY2NjYKKzIxMzQyIDEgODAwMDAwCis2NTIgMCA4MzMzMzMKKzE3MDggMCA4NjY2NjYKKzIyMDIgMCA5MDAwMDAKKzE2OTUgMCA5MzMzMzMKKzE2NjEgMCA5NjY2NjYKKzE2NTIgMCAxMDAwMDAwCisxNjc5IDAgMTAzMzMzMworMTY5MCAwIDEwNjY2NjYKKzE4MjQgMCAxMTAwMDAwCisxODAzIDAgMTEzMzMzMworMTU5OCAwIDExNjY2NjYKKzIxNTQwIDEgMTIwMDAwMAorMjA1IDAgMTIzMzMzMworMTEyNCAwIDEyNjY2NjYKKzEwNjkgMCAxMzAwMDAwCis4MzggMCAxMzMzMzMzCis3NjUgMCAxMzY2NjY2Cis0MjY1IDAgMTQwMDAwMAorOTQgMCAxNDMzMzMzCisyMDQ2MyAwIDE0NjY2NjYKKzEwMjggMCAxNTAwMDAwCisxNDc1IDAgMTUzMzMzMworMzYzMCAwIDE1NjY2NjYKKzI4MzczIDEgMTYwMDAwMAorNzI1IDAgMTYzMzMzMworMTExOSAwIDE2NjY2NjYKKzE0MjcgMCAxNzAwMDAwCisxNjc5IDAgMTczMzMzMworMTg2NiAwIDE3NjY2NjYKKzExOTcgMCAxODAwMDAwCisxNTcyIDAgMTgzMzMzMworMTY1MSAwIDE4NjY2NjYKKzE2NzggMCAxOTAwMDAwCisxNjg4IDAgMTkzMzMzMworMTY1OSAwIDE5NjY2NjYKKzE5OTAwIDEgMjAwMDAwMAorNTg0IDAgMjAzMzMzMworMTQ3NSAwIDIwNjY2NjYKKzE2NzggMCAyMTAwMDAwCisxMDEwIDAgMjEzMzMzMworMTQzNSAwIDIxNjY2NjYKKzE2MTIgMCAyMjAwMDAwCisxNjAyIDAgMjIzMzMzMworMTcwOSAwIDIyNjY2NjYKKzE3MzcgMCAyMzAwMDAwCisxODM1IDAgMjMzMzMzMworOTI2IDAgMjM2NjY2NgorMjAwOTAgMSAyNDAwMDAwCis2MzEgMCAyNDMzMzMzCisxNTc2IDAgMjQ2NjY2NgorOTQxIDAgMjUwMDAwMAorMjM0OSAwIDI1MzMzMzMKKzExMTIgMCAyNTY2NjY2CisxNTY2IDAgMjYwMDAwMAorMTc3MyAwIDI2MzMzMzMKKzk3OSAwIDI2NjY2NjYKKzIyNDYgMCAyNzAwMDAwCis5MDQgMCAyNzMzMzMzCisxMzQyIDAgMjc2NjY2NgorMjAxNDcgMSAyODAwMDAwCis2MzAgMCAyODMzMzMzCis5ODIgMCAyODY2NjY2CisyMDg5IDAgMjkwMDAwMAorMTAyMSAwIDI5MzMzMzMKKzE1MDYgMCAyOTY2NjY2CisxNjQyIDAgMzAwMDAwMAorOTY4IDAgMzAzMzMzMworMTI2MiAwIDMwNjY2NjYKKzIyNzAgMCAzMTAwMDAwCis4NjQgMCAzMTMzMzMzCisxMjUyIDAgMzE2NjY2NgorMjAxNDUgMSAzMjAwMDAwCis1OTUgMCAzMjMzMzMzCis5MTggMCAzMjY2NjY2CisxMTY3IDAgMzMwMDAwMAorMTM0NyAwIDMzMzMzMzMKKzE1OTcgMCAzMzY2NjY2CisxNjM2IDAgMzQwMDAwMAorOTQ0IDAgMzQzMzMzMworMTI5NSAwIDM0NjY2NjYKKzEzOTcgMCAzNTAwMDAwCisxNDEzIDAgMzUzMzMzMworMTQzMiAwIDM1NjY2NjYKKzIwMTgwIDEgMzYwMDAwMAorNTI1IDAgMzYzMzMzMworMTA2OCAwIDM2NjY2NjYKKzEyMzAgMCAzNzAwMDAwCisxNDI4IDAgMzczMzMzMworOTE2IDAgMzc2NjY2NgorMTk0OCAwIDM4MDAwMDAKKzk2NiAwIDM4MzMzMzMKKzEzNDIgMCAzODY2NjY2CisxMzM4IDAgMzkwMDAwMAorMTM3OSAwIDM5MzMzMzMKKzEyOTYgMCAzOTY2NjY2CisxNzM3OCAxIDQwMDAwMDAKKzU4MyAwIDQwMzMzMzMKKzkzNiAwIDQwNjY2NjYKKzE3NDUgMCA0MTAwMDAwCis5ODcgMCA0MTMzMzMzCisxMzkzIDAgNDE2NjY2NgorMTQ5NSAwIDQyMDAwMDAKKzg2OSAwIDQyMzMzMzMKKzE5MzggMCA0MjY2NjY2Cis4MjggMCA0MzAwMDAwCisxODUxIDAgNDMzMzMzMworODM0IDAgNDM2NjY2NgorMTcyODAgMSA0NDAwMDAwCis1ODAgMCA0NDMzMzMzCis4NjkgMCA0NDY2NjY2CisxNjA1IDAgNDUwMDAwMAorODQzIDAgNDUzMzMzMworNjE0NyAxIDQ1NjY2NjYKKzIyMCAwIDQ2MDAwMDAKKzExMDYgMCA0NjMzMzMzCiszOTUgMCA0NjY2NjY2CiszMDQgMCA0NzAwMDAwCisxOTQ2IDAgNDczMzMzMworMTU0IDAgNDc2NjY2NgorNDgyIDAgNDgwMDAwMAorOTQ5IDAgNDgzMzMzMworMTA4OCAwIDQ4NjY2NjYKKzk3NCAwIDQ5MDAwMDAKKzg3NiAwIDQ5MzMzMzMKKzkxNjQgMSA0OTY2NjY2CisxMDE5IDAgNTAwMDAwMAorOTgzIDAgNTAzMzMzMworMTM3NSAwIDUwNjY2NjYKKzEwNDEgMCA1MTAwMDAwCis3ODkgMCA1MTMzMzMzCisxMDM3IDAgNTE2NjY2NgorODEyIDAgNTIwMDAwMAorNzMyIDAgNTIzMzMzMworOTcyIDAgNTI2NjY2NgorNzA4IDAgNTMwMDAwMAorNjIzIDAgNTMzMzMzMworMTA2NjcgMSA1MzY2NjY2Cis0NjMgMCA1NDAwMDAwCis5MTEgMCA1NDMzMzMzCis4NjEgMCA1NDY2NjY2Cis1MDcgMCA1NTAwMDAwCisxMDE1IDAgNTUzMzMzMworNTAxIDAgNTU2NjY2NgorOTM0IDAgNTYwMDAwMAorODEyIDAgNTYzMzMzMworODU1IDAgNTY2NjY2NgorODA0IDAgNTcwMDAwMAorNzgzIDAgNTczMzMzMworMTA2MTAgMSA1NzY2NjY2Cis5NTAgMCA1ODAwMDAwCisxMjkyIDAgNTgzMzMzMworMTAwMiAwIDU4NjY2NjYKKzcyOCAwIDU5MDAwMDAKKzk2MCAwIDU5MzMzMzMKKzEyMzAgMCA1OTY2NjY2CisxMzE1IDAgNjAwMDAwMAorMTI0OCAwIDYwMzMzMzMKKzk5NSAwIDYwNjY2NjYKKzE0MDEgMCA2MTAwMDAwCis5MDUgMCA2MTMzMzMzCis5MzI2IDEgNjE2NjY2NgorNzI2IDAgNjIwMDAwMAorNjY3IDAgNjIzMzMzMworODMzIDAgNjI2NjY2NgorMTAwNyAwIDYzMDAwMDAKKzExNzIgMCA2MzMzMzMzCisxOTEwIDAgNjM2NjY2NgorMTk1NCAwIDY0MDAwMDAKKzE0OTggMCA2NDMzMzMzCisxMTg4IDAgNjQ2NjY2NgorNzg0IDAgNjUwMDAwMAorMTAwNSAwIDY1MzMzMzMKKzEwMDMwIDEgNjU2NjY2NgorNDUyIDAgNjYwMDAwMAorNzYzIDAgNjYzMzMzMworNjM5IDAgNjY2NjY2NgorNjcxIDAgNjcwMDAwMAorODY3IDAgNjczMzMzMworOTYzIDAgNjc2NjY2NgorOTgyIDAgNjgwMDAwMAorOTk1IDAgNjgzMzMzMworOTgyIDAgNjg2NjY2NgorNzQ3IDAgNjkwMDAwMAorNTc0IDAgNjkzMzMzMworMTIzNTMgMSA2OTY2NjY2Cis0NzQgMCA3MDAwMDAwCis5NjkgMCA3MDMzMzMzCis2MzMgMCA3MDY2NjY2Cis3MjMgMCA3MTAwMDAwCisxMjIxIDAgNzEzMzMzMworNjc0IDAgNzE2NjY2NgorNzc2IDAgNzIwMDAwMAorNTcyIDAgNzIzMzMzMworOTEyIDAgNzI2NjY2NgorNTY0IDAgNzMwMDAwMAorNTk0IDAgNzMzMzMzMworMTY2NjEgMSA3MzY2NjY2Cis1MTggMCA3NDAwMDAwCis2NTYgMCA3NDMzMzMzCis2MjUgMCA3NDY2NjY2Cis1ODMgMCA3NTAwMDAwCis1ODQgMCA3NTMzMzMzCisxMDI3IDAgNzU2NjY2NgorODEyIDAgNzYwMDAwMAorNzI5IDAgNzYzMzMzMworNzY2IDAgNzY2NjY2NgorOTAxIDAgNzcwMDAwMAorOTYwIDAgNzczMzMzMworMTIzMzYgMSA3NzY2NjY2Cis5NDQgMCA3ODAwMDAwCisxMzk4IDAgNzgzMzMzMworMTYyNSAwIDc4NjY2NjYKKzIxMDMgMCA3OTAwMDAwCisxNjMwIDAgNzkzMzMzMworMTIyOCAwIDc5NjY2NjYKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5tNHYgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMubTR2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZWFkMDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMubTR2CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNlZDEyYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvCkBAIC0wLDAgKzEsNDk5IEBACisxOSAzMiAwCis4IDMyIDAKKzggMzIgMAorNTI5IDEgMAorMzI5IDEgMTM1MDAKKzM0OSAxIDMzNTAwCiszMzYgMSA1MzUwMAorMzgzIDEgNzM1MDAKKzM1OSAxIDkzNTAwCiszNDQgMSAxMTM1MDAKKzM0MyAxIDEzMzUwMAorMzMyIDEgMTUzNTAwCiszMjAgMSAxNzM1MDAKKzMxOSAxIDE5MzUwMAorMzIzIDEgMjEzNTAwCiszMjAgMSAyMzM1MDAKKzMyOCAxIDI1MzUwMAorMzQwIDEgMjczNTAwCiszMTggMSAyOTM1MDAKKzMxOSAxIDMxMzUwMAorMzM1IDEgMzMzNTAwCis1MTEgMSAzNTM1MDAKKzM5NSAxIDM3MzUwMAorMzI3IDEgMzkzNTAwCis0NzkgMSA0MTM1MDAKKzMzMiAxIDQzMzUwMAorMzIwIDEgNDUzNTAwCiszMjEgMSA0NzM1MDAKKzMxMCAxIDQ5MzUwMAorMzEwIDEgNTEzNTAwCiszMTAgMSA1MzM1MDAKKzMyNiAxIDU1MzUwMAorMzMwIDEgNTczNTAwCiszMTggMSA1OTM1MDAKKzMwOSAxIDYxMzUwMAorMzA0IDEgNjMzNTAwCisyOTggMSA2NTM1MDAKKzI5NCAxIDY3MzUwMAorMzAwIDEgNjkzNTAwCiszMTQgMSA3MTM1MDAKKzMwNCAxIDczMzUwMAorMzA3IDEgNzUzNTAwCiszMjEgMSA3NzM1MDAKKzMzMyAxIDc5MzUwMAorMzM1IDEgODEzNTAwCiszMDYgMSA4MzM1MDAKKzMxNSAxIDg1MzUwMAorMzIwIDEgODczNTAwCiszMTUgMSA4OTM1MDAKKzMwOCAxIDkxMzUwMAorMzIwIDEgOTMzNTAwCiszMTEgMSA5NTM1MDAKKzMxMSAxIDk3MzUwMAorMzEzIDEgOTkzNTAwCiszMTQgMSAxMDEzNTAwCiszMDggMSAxMDMzNTAwCiszMDcgMSAxMDUzNTAwCiszMTcgMSAxMDczNTAwCiszMjggMSAxMDkzNTAwCiszMTcgMSAxMTEzNTAwCiszMTIgMSAxMTMzNTAwCiszMDggMSAxMTUzNTAwCiszMTUgMSAxMTczNTAwCiszMjAgMSAxMTkzNTAwCiszMjIgMSAxMjEzNTAwCiszMjMgMSAxMjMzNTAwCiszMjIgMSAxMjUzNTAwCiszMjIgMSAxMjczNTAwCiszMDEgMSAxMjkzNTAwCiszMDMgMSAxMzEzNTAwCiszMDggMSAxMzMzNTAwCisyOTkgMSAxMzUzNTAwCisyOTcgMSAxMzczNTAwCisyOTMgMSAxMzkzNTAwCisyOTUgMSAxNDEzNTAwCisyOTcgMSAxNDMzNTAwCiszMDAgMSAxNDUzNTAwCisyOTQgMSAxNDczNTAwCisyOTkgMSAxNDkzNTAwCisyOTYgMSAxNTEzNTAwCiszMDMgMSAxNTMzNTAwCiszMTMgMSAxNTUzNTAwCiszMDYgMSAxNTczNTAwCiszMDMgMSAxNTkzNTAwCiszMTEgMSAxNjEzNTAwCiszMDcgMSAxNjMzNTAwCiszMTAgMSAxNjUzNTAwCiszMzkgMSAxNjczNTAwCiszMjUgMSAxNjkzNTAwCiszMjAgMSAxNzEzNTAwCiszMTUgMSAxNzMzNTAwCiszMTYgMSAxNzUzNTAwCiszMzggMSAxNzczNTAwCiszMjUgMSAxNzkzNTAwCiszMjUgMSAxODEzNTAwCiszMjggMSAxODMzNTAwCiszMDQgMSAxODUzNTAwCisyOTcgMSAxODczNTAwCiszMjIgMSAxODkzNTAwCiszMTEgMSAxOTEzNTAwCiszMDcgMSAxOTMzNTAwCiszMDAgMSAxOTUzNTAwCiszMDEgMSAxOTczNTAwCiszMDkgMSAxOTkzNTAwCiszMDAgMSAyMDEzNTAwCiszMDYgMSAyMDMzNTAwCiszMDUgMSAyMDUzNTAwCisyOTggMSAyMDczNTAwCisyOTEgMSAyMDkzNTAwCiszMDEgMSAyMTEzNTAwCiszMDAgMSAyMTMzNTAwCis0MzkgMSAyMTUzNTAwCisyOTIgMSAyMTczNTAwCiszMDggMSAyMTkzNTAwCiszMDUgMSAyMjEzNTAwCisyOTggMSAyMjMzNTAwCisyOTcgMSAyMjUzNTAwCisyOTMgMSAyMjczNTAwCis0MDggMSAyMjkzNTAwCisyOTggMSAyMzEzNTAwCis0NTIgMSAyMzMzNTAwCisyOTcgMSAyMzUzNTAwCiszMDMgMSAyMzczNTAwCiszMDAgMSAyMzkzNTAwCiszMTAgMSAyNDEzNTAwCisyOTkgMSAyNDMzNTAwCiszMDYgMSAyNDUzNTAwCiszMTYgMSAyNDczNTAwCiszMDggMSAyNDkzNTAwCiszMTMgMSAyNTEzNTAwCiszMDkgMSAyNTMzNTAwCiszMTAgMSAyNTUzNTAwCiszMTUgMSAyNTczNTAwCiszMDkgMSAyNTkzNTAwCiszMTcgMSAyNjEzNTAwCiszMTEgMSAyNjMzNTAwCiszMjggMSAyNjUzNTAwCiszMzMgMSAyNjczNTAwCiszMjYgMSAyNjkzNTAwCiszMjMgMSAyNzEzNTAwCiszMTYgMSAyNzMzNTAwCiszMjUgMSAyNzUzNTAwCiszMTYgMSAyNzczNTAwCiszMTkgMSAyNzkzNTAwCiszMjYgMSAyODEzNTAwCiszMjAgMSAyODMzNTAwCiszMjggMSAyODUzNTAwCiszMTIgMSAyODczNTAwCiszMTQgMSAyODkzNTAwCiszMDkgMSAyOTEzNTAwCiszMDYgMSAyOTMzNTAwCisyOTUgMSAyOTUzNTAwCiszMDQgMSAyOTczNTAwCiszMjYgMSAyOTkzNTAwCisyOTEgMSAzMDEzNTAwCisyOTkgMSAzMDMzNTAwCisyOTMgMSAzMDUzNTAwCisyODggMSAzMDczNTAwCisyOTQgMSAzMDkzNTAwCisyOTIgMSAzMTEzNTAwCisyOTIgMSAzMTMzNTAwCisyODggMSAzMTUzNTAwCiszMDggMSAzMTczNTAwCiszMDQgMSAzMTkzNTAwCisyOTIgMSAzMjEzNTAwCiszODIgMSAzMjMzNTAwCiszODEgMSAzMjUzNTAwCisyOTkgMSAzMjczNTAwCiszMTYgMSAzMjkzNTAwCiszMDggMSAzMzEzNTAwCiszMDEgMSAzMzMzNTAwCisyOTcgMSAzMzUzNTAwCisyOTkgMSAzMzczNTAwCisyOTQgMSAzMzkzNTAwCisyOTUgMSAzNDEzNTAwCiszMTcgMSAzNDMzNTAwCisyOTcgMSAzNDUzNTAwCiszMDkgMSAzNDczNTAwCiszMTMgMSAzNDkzNTAwCiszMjAgMSAzNTEzNTAwCiszMjkgMSAzNTMzNTAwCiszMzAgMSAzNTUzNTAwCiszMjQgMSAzNTczNTAwCiszMjQgMSAzNTkzNTAwCiszMDkgMSAzNjEzNTAwCiszMDQgMSAzNjMzNTAwCiszMTMgMSAzNjUzNTAwCiszMTIgMSAzNjczNTAwCisyOTkgMSAzNjkzNTAwCisyOTUgMSAzNzEzNTAwCiszMDEgMSAzNzMzNTAwCisyOTUgMSAzNzUzNTAwCisyOTcgMSAzNzczNTAwCiszMDIgMSAzNzkzNTAwCisyOTggMSAzODEzNTAwCisyOTkgMSAzODMzNTAwCisyOTYgMSAzODUzNTAwCisyOTIgMSAzODczNTAwCiszMDcgMSAzODkzNTAwCiszMDMgMSAzOTEzNTAwCiszMTMgMSAzOTMzNTAwCiszMTggMSAzOTUzNTAwCiszMTMgMSAzOTczNTAwCiszNTMgMSAzOTkzNTAwCiszNzEgMSA0MDEzNTAwCisyOTIgMSA0MDMzNTAwCiszMDAgMSA0MDUzNTAwCiszODEgMSA0MDczNTAwCisyOTQgMSA0MDkzNTAwCiszMDEgMSA0MTEzNTAwCiszMDUgMSA0MTMzNTAwCisyOTkgMSA0MTUzNTAwCiszMDUgMSA0MTczNTAwCiszMjIgMSA0MTkzNTAwCiszMTUgMSA0MjEzNTAwCiszMjYgMSA0MjMzNTAwCiszMzggMSA0MjUzNTAwCiszMjAgMSA0MjczNTAwCiszMTkgMSA0MjkzNTAwCiszMjcgMSA0MzEzNTAwCiszMzAgMSA0MzMzNTAwCiszMTAgMSA0MzUzNTAwCiszMDMgMSA0MzczNTAwCisyOTkgMSA0MzkzNTAwCisyOTMgMSA0NDEzNTAwCisyOTMgMSA0NDMzNTAwCisyOTQgMSA0NDUzNTAwCisyOTUgMSA0NDczNTAwCisyOTUgMSA0NDkzNTAwCiszMjMgMSA0NTEzNTAwCiszMDkgMSA0NTMzNTAwCiszMDkgMSA0NTUzNTAwCiszMDEgMSA0NTczNTAwCis0NzMgMSA0NTkzNTAwCisyOTEgMSA0NjEzNTAwCisyOTcgMSA0NjMzNTAwCisyOTQgMSA0NjUzNTAwCisyOTMgMSA0NjczNTAwCiszMDQgMSA0NjkzNTAwCisyOTIgMSA0NzEzNTAwCiszMDIgMSA0NzMzNTAwCisyOTYgMSA0NzUzNTAwCisyOTggMSA0NzczNTAwCiszMDEgMSA0NzkzNTAwCiszMDcgMSA0ODEzNTAwCisyODUgMSA0ODMzNTAwCisyOTQgMSA0ODUzNTAwCiszMDQgMSA0ODczNTAwCisyOTQgMSA0ODkzNTAwCisyOTUgMSA0OTEzNTAwCiszMjUgMSA0OTMzNTAwCiszMTkgMSA0OTUzNTAwCiszMjMgMSA0OTczNTAwCiszMTMgMSA0OTkzNTAwCiszMDMgMSA1MDEzNTAwCisyOTYgMSA1MDMzNTAwCisyOTUgMSA1MDUzNTAwCisyOTAgMSA1MDczNTAwCisyOTcgMSA1MDkzNTAwCisyOTYgMSA1MTEzNTAwCisyOTYgMSA1MTMzNTAwCisyOTIgMSA1MTUzNTAwCisyOTUgMSA1MTczNTAwCisyODcgMSA1MTkzNTAwCisyOTQgMSA1MjEzNTAwCisyOTAgMSA1MjMzNTAwCisyOTcgMSA1MjUzNTAwCisyOTcgMSA1MjczNTAwCisyOTcgMSA1MjkzNTAwCisyOTIgMSA1MzEzNTAwCisyOTcgMSA1MzMzNTAwCisyOTAgMSA1MzUzNTAwCisyOTMgMSA1MzczNTAwCisyOTMgMSA1MzkzNTAwCisyOTEgMSA1NDEzNTAwCisyOTIgMSA1NDMzNTAwCisyOTAgMSA1NDUzNTAwCisyOTEgMSA1NDczNTAwCisyOTYgMSA1NDkzNTAwCisyOTUgMSA1NTEzNTAwCiszMjcgMSA1NTMzNTAwCisyOTMgMSA1NTUzNTAwCisyOTEgMSA1NTczNTAwCisyOTEgMSA1NTkzNTAwCiszMTEgMSA1NjEzNTAwCisyOTEgMSA1NjMzNTAwCisyOTQgMSA1NjUzNTAwCisyOTYgMSA1NjczNTAwCisyOTUgMSA1NjkzNTAwCisyODkgMSA1NzEzNTAwCisyOTUgMSA1NzMzNTAwCisyOTUgMSA1NzUzNTAwCisyOTcgMSA1NzczNTAwCisyOTIgMSA1NzkzNTAwCisyOTcgMSA1ODEzNTAwCisyOTIgMSA1ODMzNTAwCisyOTUgMSA1ODUzNTAwCisyOTYgMSA1ODczNTAwCisyOTUgMSA1ODkzNTAwCiszMDMgMSA1OTEzNTAwCiszMDQgMSA1OTMzNTAwCiszMDEgMSA1OTUzNTAwCiszMDcgMSA1OTczNTAwCiszMDQgMSA1OTkzNTAwCiszMTAgMSA2MDEzNTAwCiszMTAgMSA2MDMzNTAwCiszMDUgMSA2MDUzNTAwCiszMDEgMSA2MDczNTAwCiszMDIgMSA2MDkzNTAwCiszMDUgMSA2MTEzNTAwCisyOTggMSA2MTMzNTAwCiszMDAgMSA2MTUzNTAwCiszMDAgMSA2MTczNTAwCisyOTIgMSA2MTkzNTAwCisyOTcgMSA2MjEzNTAwCiszMDEgMSA2MjMzNTAwCisyOTcgMSA2MjUzNTAwCisyOTcgMSA2MjczNTAwCisyOTggMSA2MjkzNTAwCisyOTcgMSA2MzEzNTAwCiszMDAgMSA2MzMzNTAwCisyOTMgMSA2MzUzNTAwCisyOTMgMSA2MzczNTAwCisyOTcgMSA2MzkzNTAwCisyOTQgMSA2NDEzNTAwCiszMDcgMSA2NDMzNTAwCiszMDIgMSA2NDUzNTAwCiszMDcgMSA2NDczNTAwCiszMjAgMSA2NDkzNTAwCiszMzAgMSA2NTEzNTAwCiszMzMgMSA2NTMzNTAwCiszMzcgMSA2NTUzNTAwCiszMzEgMSA2NTczNTAwCiszMjMgMSA2NTkzNTAwCiszMTIgMSA2NjEzNTAwCiszMjYgMSA2NjMzNTAwCiszMjggMSA2NjUzNTAwCiszMzIgMSA2NjczNTAwCiszMzMgMSA2NjkzNTAwCiszNDAgMSA2NzEzNTAwCiszMzYgMSA2NzMzNTAwCiszMjQgMSA2NzUzNTAwCiszMTIgMSA2NzczNTAwCiszMDEgMSA2NzkzNTAwCisyODkgMSA2ODEzNTAwCiszMDIgMSA2ODMzNTAwCisyOTYgMSA2ODUzNTAwCisyOTkgMSA2ODczNTAwCisyODkgMSA2ODkzNTAwCisyOTUgMSA2OTEzNTAwCisyOTkgMSA2OTMzNTAwCiszNzQgMSA2OTUzNTAwCiszOTEgMSA2OTczNTAwCiszNjUgMSA2OTkzNTAwCiszNDAgMSA3MDEzNTAwCiszMzAgMSA3MDMzNTAwCiszMzcgMSA3MDUzNTAwCiszMjggMSA3MDczNTAwCiszMjkgMSA3MDkzNTAwCiszMTkgMSA3MTEzNTAwCiszMTIgMSA3MTMzNTAwCiszMDggMSA3MTUzNTAwCiszMDQgMSA3MTczNTAwCiszMTIgMSA3MTkzNTAwCiszMTEgMSA3MjEzNTAwCiszMTYgMSA3MjMzNTAwCisyOTkgMSA3MjUzNTAwCiszMzAgMSA3MjczNTAwCiszMzAgMSA3MjkzNTAwCiszMzAgMSA3MzEzNTAwCiszNDIgMSA3MzMzNTAwCis0MzkgMSA3MzUzNTAwCiszMjIgMSA3MzczNTAwCisyOTggMSA3MzkzNTAwCisyOTMgMSA3NDEzNTAwCiszMTAgMSA3NDMzNTAwCiszMDMgMSA3NDUzNTAwCiszMTcgMSA3NDczNTAwCis0NTMgMSA3NDkzNTAwCiszNzcgMSA3NTEzNTAwCiszNzQgMSA3NTMzNTAwCisyOTIgMSA3NTUzNTAwCisyOTUgMSA3NTczNTAwCisyNzQgMSA3NTkzNTAwCisyOTIgMSA3NjEzNTAwCisyOTEgMSA3NjMzNTAwCiszNjcgMSA3NjUzNTAwCisyOTUgMSA3NjczNTAwCisyOTggMSA3NjkzNTAwCisyOTcgMSA3NzEzNTAwCiszMDEgMSA3NzMzNTAwCisyOTIgMSA3NzUzNTAwCiszNDQgMSA3NzczNTAwCisyOTYgMSA3NzkzNTAwCisyOTcgMSA3ODEzNTAwCiszMDYgMSA3ODMzNTAwCiszMDggMSA3ODUzNTAwCiszMDUgMSA3ODczNTAwCiszMTMgMSA3ODkzNTAwCiszMDYgMSA3OTEzNTAwCiszMjIgMSA3OTMzNTAwCiszMTMgMSA3OTUzNTAwCiszMDUgMSA3OTczNTAwCiszMDQgMSA3OTkzNTAwCiszMTMgMSA4MDEzNTAwCiszMjQgMSA4MDMzNTAwCiszMTIgMSA4MDUzNTAwCiszMTggMSA4MDczNTAwCiszMTEgMSA4MDkzNTAwCiszMDIgMSA4MTEzNTAwCiszMDUgMSA4MTMzNTAwCiszMTIgMSA4MTUzNTAwCiszMTMgMSA4MTczNTAwCiszMTIgMSA4MTkzNTAwCiszMzUgMSA4MjEzNTAwCiszMzMgMSA4MjMzNTAwCiszNDYgMSA4MjUzNTAwCiszMzkgMSA4MjczNTAwCiszMzcgMSA4MjkzNTAwCiszNDEgMSA4MzEzNTAwCiszMzUgMSA4MzMzNTAwCiszMjUgMSA4MzUzNTAwCiszMjQgMSA4MzczNTAwCiszMTcgMSA4MzkzNTAwCiszMTUgMSA4NDEzNTAwCiszMDMgMSA4NDMzNTAwCiszMTcgMSA4NDUzNTAwCis0NTIgMSA4NDczNTAwCiszMjQgMSA4NDkzNTAwCiszMjEgMSA4NTEzNTAwCiszMzUgMSA4NTMzNTAwCiszMjcgMSA4NTUzNTAwCiszMTUgMSA4NTczNTAwCiszMjEgMSA4NTkzNTAwCiszMTkgMSA4NjEzNTAwCiszMDggMSA4NjMzNTAwCiszMTQgMSA4NjUzNTAwCiszMjIgMSA4NjczNTAwCiszMjggMSA4NjkzNTAwCiszMjAgMSA4NzEzNTAwCiszMjQgMSA4NzMzNTAwCiszMzEgMSA4NzUzNTAwCiszMzAgMSA4NzczNTAwCiszMjggMSA4NzkzNTAwCiszMTggMSA4ODEzNTAwCiszMTQgMSA4ODMzNTAwCiszMTggMSA4ODUzNTAwCiszMTggMSA4ODczNTAwCiszMjUgMSA4ODkzNTAwCiszMzggMSA4OTEzNTAwCiszNDEgMSA4OTMzNTAwCiszMzMgMSA4OTUzNTAwCiszMzAgMSA4OTczNTAwCiszMzggMSA4OTkzNTAwCiszMzMgMSA5MDEzNTAwCiszMzAgMSA5MDMzNTAwCiszNDQgMSA5MDUzNTAwCis0NzkgMSA5MDczNTAwCis0NzMgMSA5MDkzNTAwCiszMzMgMSA5MTEzNTAwCiszMzcgMSA5MTMzNTAwCis0OTUgMSA5MTUzNTAwCiszNTMgMSA5MTczNTAwCiszNTIgMSA5MTkzNTAwCiszNDQgMSA5MjEzNTAwCiszMzYgMSA5MjMzNTAwCiszMjQgMSA5MjUzNTAwCiszMjEgMSA5MjczNTAwCiszNTAgMSA5MjkzNTAwCiszNDcgMSA5MzEzNTAwCiszNDMgMSA5MzMzNTAwCiszNDUgMSA5MzUzNTAwCiszMzcgMSA5MzczNTAwCiszMzUgMSA5MzkzNTAwCiszMzMgMSA5NDEzNTAwCiszMzYgMSA5NDMzNTAwCiszMzQgMSA5NDUzNTAwCiszMzMgMSA5NDczNTAwCiszMzEgMSA5NDkzNTAwCiszMjkgMSA5NTEzNTAwCiszMTkgMSA5NTMzNTAwCiszMjEgMSA5NTUzNTAwCiszMTYgMSA5NTczNTAwCiszMjIgMSA5NTkzNTAwCis0NDggMSA5NjEzNTAwCiszMTIgMSA5NjMzNTAwCiszMDYgMSA5NjUzNTAwCiszMDEgMSA5NjczNTAwCiszMDMgMSA5NjkzNTAwCisyOTYgMSA5NzEzNTAwCiszMDAgMSA5NzMzNTAwCisyOTUgMSA5NzUzNTAwCiszMDAgMSA5NzczNTAwCisyOTcgMSA5NzkzNTAwCiszMDAgMSA5ODEzNTAwCisyOTcgMSA5ODMzNTAwCis1MTIgMSA5ODUzNTAwCisyOTIgMSA5ODczNTAwCis0NjggMSA5ODkzNTAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoub3B1cyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5vcHVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNmI4NzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoub3B1cwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzE2a2h6X3MxNmxlLnJhdyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3Jhd18xY2hfMTZraHpfczE2bGUucmF3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMmY0MWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzE2a2h6X3MxNmxlLnJhdwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzhraHpfczE2bGUucmF3IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MxNmxlLnJhdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTQ5ZWIyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MxNmxlLnJhdwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzhraHpfczMybGUuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3Jhd18xY2hfOGtoel9zMzJsZS5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZTI0Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzhraHpfczMybGUuaW5mbwpAQCAtMCwwICsxLDEwIEBACisxNjM4NCAxIDAKKzE2Mzg0IDEgMTAyNDAwMAorMTYzODQgMSAyMDQ4MDAwCisxNjM4NCAxIDMwNzIwMDAKKzE2Mzg0IDEgNDA5NjAwMAorMTYzODQgMSA1MTIwMDAwCisxNjM4NCAxIDYxNDQwMDAKKzE2Mzg0IDEgNzE2ODAwMAorMTYzODQgMSA4MTkyMDAwCisxMDkyNCAxIDkyMTYwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3Jhd18xY2hfOGtoel9zMzJsZS5yYXcgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzhraHpfczMybGUucmF3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkOTFiNDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzhraHpfczMybGUucmF3CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3Jhd18yY2hfNDhraHpfczE2bGUucmF3IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzJjaF80OGtoel9zMTZsZS5yYXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk4YjJlYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3Jhd18yY2hfNDhraHpfczE2bGUucmF3CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YTZkMzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvCkBAIC0wLDAgKzEsNTIwIEBACiszMCAzMiAwCis0MTQwIDMyIDAKKzMzIDMyIDAKKzUyIDEgMAorNTggMSAyNjY2Cis2MSAxIDUzMzMKKzU2IDEgODAwMAorNTkgMSAxMDY2NgorNjMgMSAxMzMzMworNjYgMSAxNjAwMAorNzEgMSAxODY2NgorNzYgMSAyMTMzMworMzc0IDEgMjQwMDAKKzM2NiAxIDM2MDAwCiszNzggMSA1NzMzMworMzkzIDEgNzg2NjYKKzM5MyAxIDEwMDAwMAorMzg2IDEgMTIxMzMzCiszNzUgMSAxNDI2NjYKKzM4OCAxIDE2NDAwMAorMzc4IDEgMTg1MzMzCiszNzkgMSAyMDY2NjYKKzM3NCAxIDIyODAwMAorMzU2IDEgMjQ5MzMzCiszNTggMSAyNzA2NjYKKzMzMiAxIDI5MjAwMAorMzM1IDEgMzEzMzMzCiszNjMgMSAzMzQ2NjYKKzM0MSAxIDM1NjAwMAorMzYwIDEgMzc3MzMzCiszNDEgMSAzOTg2NjYKKzMzNSAxIDQyMDAwMAorMzU3IDEgNDQxMzMzCiszNTUgMSA0NjI2NjYKKzM2MyAxIDQ4NDAwMAorMzgyIDEgNTA1MzMzCiszNzEgMSA1MjY2NjYKKzM1NyAxIDU0ODAwMAorMzUzIDEgNTY5MzMzCiszNTAgMSA1OTA2NjYKKzMyNyAxIDYxMjAwMAorMzE1IDEgNjMzMzMzCiszMDcgMSA2NTQ2NjYKKzMwMyAxIDY3NjAwMAorMjk1IDEgNjk3MzMzCiszMTIgMSA3MTg2NjYKKzMxNiAxIDc0MDAwMAorMzE1IDEgNzYxMzMzCiszMTggMSA3ODI2NjYKKzMzMCAxIDgwNDAwMAorMzE4IDEgODI1MzMzCiszMTUgMSA4NDY2NjYKKzMyMiAxIDg2ODAwMAorMzE1IDEgODg5MzMzCiszMTAgMSA5MTA2NjYKKzMxNSAxIDkzMjAwMAorMzE0IDEgOTUzMzMzCiszMDIgMSA5NzQ2NjYKKzMxMyAxIDk5NjAwMAorMzIyIDEgMTAxNzMzMworMzIzIDEgMTAzODY2NgorMzE5IDEgMTA2MDAwMAorMzI1IDEgMTA4MTMzMworMzI4IDEgMTEwMjY2NgorMzMwIDEgMTEyNDAwMAorMzMzIDEgMTE0NTMzMworMzMwIDEgMTE2NjY2NgorMzQ0IDEgMTE4ODAwMAorMzMxIDEgMTIwOTMzMworMzQyIDEgMTIzMDY2NgorMzM5IDEgMTI1MjAwMAorMzE0IDEgMTI3MzMzMworMjg1IDEgMTI5NDY2NgorMjk1IDEgMTMxNjAwMAorMzAyIDEgMTMzNzMzMworMzA1IDEgMTM1ODY2NgorMzA5IDEgMTM4MDAwMAorMzI3IDEgMTQwMTMzMworMzA0IDEgMTQyMjY2NgorMzM2IDEgMTQ0NDAwMAorMzUwIDEgMTQ2NTMzMworMzQ2IDEgMTQ4NjY2NgorMzUyIDEgMTUwODAwMAorMzQxIDEgMTUyOTMzMworMzQzIDEgMTU1MDY2NgorMzUxIDEgMTU3MjAwMAorMzE5IDEgMTU5MzMzMworMzI4IDEgMTYxNDY2NgorMzI4IDEgMTYzNjAwMAorMzI0IDEgMTY1NzMzMworMzM4IDEgMTY3ODY2NgorMzE3IDEgMTcwMDAwMAorMzI4IDEgMTcyMTMzMworMzM1IDEgMTc0MjY2NgorMzQxIDEgMTc2NDAwMAorMzM1IDEgMTc4NTMzMworMzQ4IDEgMTgwNjY2NgorMzYyIDEgMTgyODAwMAorMzYxIDEgMTg0OTMzMworMzQ0IDEgMTg3MDY2NgorMzQwIDEgMTg5MjAwMAorMzMzIDEgMTkxMzMzMworMzI5IDEgMTkzNDY2NgorMzI4IDEgMTk1NjAwMAorMzIzIDEgMTk3NzMzMworMzEwIDEgMTk5ODY2NgorMzE4IDEgMjAyMDAwMAorMzEyIDEgMjA0MTMzMworMjk1IDEgMjA2MjY2NgorMzI5IDEgMjA4NDAwMAorMzE4IDEgMjEwNTMzMworMzExIDEgMjEyNjY2NgorMzE3IDEgMjE0ODAwMAorNjIgMSAyMTY5MzMzCis3NSAxIDIxODEzMzMKKzczIDEgMjE4NDAwMAorMzMyIDEgMjE4NjY2NgorMzI3IDEgMjE5ODY2NgorMzMyIDEgMjIyMDAwMAorMzI1IDEgMjI0MTMzMworMzI5IDEgMjI2MjY2NgorMzMwIDEgMjI4NDAwMAorNjEgMSAyMzA1MzMzCis2MSAxIDIzMTczMzMKKzcwIDEgMjMyMDAwMAorNzAgMSAyMzIyNjY2CiszMTkgMSAyMzI1MzMzCiszMDMgMSAyMzM3MzMzCisyOTIgMSAyMzU4NjY2CiszMTMgMSAyMzgwMDAwCiszMTggMSAyNDAxMzMzCiszNDYgMSAyNDIyNjY2CiszMjggMSAyNDQ0MDAwCiszMTYgMSAyNDY1MzMzCiszNDEgMSAyNDg2NjY2CiszMjggMSAyNTA4MDAwCiszMzggMSAyNTI5MzMzCiszNDEgMSAyNTUwNjY2CiszMzcgMSAyNTcyMDAwCiszNDcgMSAyNTkzMzMzCiszODQgMSAyNjE0NjY2CiszNTggMSAyNjM2MDAwCiszNjMgMSAyNjU3MzMzCiszNjMgMSAyNjc4NjY2CiszNTggMSAyNzAwMDAwCiszMzkgMSAyNzIxMzMzCiszNjkgMSAyNzQyNjY2CiszNDMgMSAyNzY0MDAwCiszNDggMSAyNzg1MzMzCiszNjMgMSAyODA2NjY2CiszNTAgMSAyODI4MDAwCiszNTggMSAyODQ5MzMzCiszNTIgMSAyODcwNjY2CiszMzggMSAyODkyMDAwCiszMzUgMSAyOTEzMzMzCiszNDIgMSAyOTM0NjY2CiszMzggMSAyOTU2MDAwCiszNDAgMSAyOTc3MzMzCisyOTIgMSAyOTk4NjY2CisyNzkgMSAzMDIwMDAwCisyOTkgMSAzMDQxMzMzCiszMDMgMSAzMDYyNjY2CisyOTggMSAzMDg0MDAwCisyOTcgMSAzMTA1MzMzCisyODAgMSAzMTI2NjY2CisyOTcgMSAzMTQ4MDAwCisyOTAgMSAzMTY5MzMzCiszMDYgMSAzMTkwNjY2CiszMDEgMSAzMjEyMDAwCiszMDYgMSAzMjMzMzMzCisyODkgMSAzMjU0NjY2CiszMTEgMSAzMjc2MDAwCiszMTcgMSAzMjk3MzMzCiszNDQgMSAzMzE4NjY2CiszMDggMSAzMzQwMDAwCiszMDQgMSAzMzYxMzMzCiszMDQgMSAzMzgyNjY2CiszMTIgMSAzNDA0MDAwCiszMDUgMSAzNDI1MzMzCisyOTkgMSAzNDQ2NjY2CiszMDEgMSAzNDY4MDAwCiszMTggMSAzNDg5MzMzCiszMTMgMSAzNTEwNjY2CiszMzAgMSAzNTMyMDAwCiszMjUgMSAzNTUzMzMzCiszMjUgMSAzNTc0NjY2CiszMjEgMSAzNTk2MDAwCiszNDkgMSAzNjE3MzMzCisyODggMSAzNjM4NjY2CiszMDAgMSAzNjYwMDAwCiszMTIgMSAzNjgxMzMzCiszMDIgMSAzNzAyNjY2CisyNzggMSAzNzI0MDAwCisyODQgMSAzNzQ1MzMzCisyODYgMSAzNzY2NjY2CisyNzQgMSAzNzg4MDAwCisyOTUgMSAzODA5MzMzCisyODEgMSAzODMwNjY2CisyODggMSAzODUyMDAwCisyNzggMSAzODczMzMzCiszMDYgMSAzODk0NjY2Cis2MiAxIDM5MTYwMDAKKzU5IDEgMzkyODAwMAorNjEgMSAzOTMwNjY2Cis1NSAxIDM5MzMzMzMKKzcwIDEgMzkzNjAwMAorNzIgMSAzOTM4NjY2CiszMjQgMSAzOTQxMzMzCiszMDkgMSAzOTUzMzMzCiszMDEgMSAzOTc0NjY2CiszMDEgMSAzOTk2MDAwCisyOTEgMSA0MDE3MzMzCisyODkgMSA0MDM4NjY2CiszMDYgMSA0MDYwMDAwCiszMDUgMSA0MDgxMzMzCisyODYgMSA0MTAyNjY2CisyOTQgMSA0MTI0MDAwCisyOTAgMSA0MTQ1MzMzCisyOTcgMSA0MTY2NjY2CiszMDggMSA0MTg4MDAwCisyOTYgMSA0MjA5MzMzCisyOTIgMSA0MjMwNjY2CisyODcgMSA0MjUyMDAwCisyOTEgMSA0MjczMzMzCisyOTggMSA0Mjk0NjY2CisyOTUgMSA0MzE2MDAwCisyOTQgMSA0MzM3MzMzCisyOTUgMSA0MzU4NjY2CisyNzUgMSA0MzgwMDAwCisyODAgMSA0NDAxMzMzCisyODggMSA0NDIyNjY2CisyODUgMSA0NDQ0MDAwCisyNzQgMSA0NDY1MzMzCisyOTggMSA0NDg2NjY2CiszMDEgMSA0NTA4MDAwCiszMDAgMSA0NTI5MzMzCiszMDUgMSA0NTUwNjY2CisyOTcgMSA0NTcyMDAwCis1OSAxIDQ1OTMzMzMKKzU2IDEgNDYwNTMzMworNTcgMSA0NjA4MDAwCis1NSAxIDQ2MTA2NjYKKzU4IDEgNDYxMzMzMworNTcgMSA0NjE2MDAwCis1OCAxIDQ2MTg2NjYKKzY4IDEgNDYyMTMzMworNjcgMSA0NjI0MDAwCis3MSAxIDQ2MjY2NjYKKzI4OSAxIDQ2MjkzMzMKKzI4MiAxIDQ2NDEzMzMKKzI3MyAxIDQ2NjI2NjYKKzI3OSAxIDQ2ODQwMDAKKzI4NiAxIDQ3MDUzMzMKKzI4MiAxIDQ3MjY2NjYKKzI4NCAxIDQ3NDgwMDAKKzI3OCAxIDQ3NjkzMzMKKzI4MSAxIDQ3OTA2NjYKKzI4MCAxIDQ4MTIwMDAKKzI2MyAxIDQ4MzMzMzMKKzI2MCAxIDQ4NTQ2NjYKKzI3MSAxIDQ4NzYwMDAKKzI3MyAxIDQ4OTczMzMKKzI4MiAxIDQ5MTg2NjYKKzI3OSAxIDQ5NDAwMDAKKzI5NyAxIDQ5NjEzMzMKKzI5MSAxIDQ5ODI2NjYKKzMwOSAxIDUwMDQwMDAKKzI4MyAxIDUwMjUzMzMKKzI5MiAxIDUwNDY2NjYKKzMwNCAxIDUwNjgwMDAKKzI5NiAxIDUwODkzMzMKKzI5MyAxIDUxMTA2NjYKKzI4MiAxIDUxMzIwMDAKKzI3MyAxIDUxNTMzMzMKKzI4NCAxIDUxNzQ2NjYKKzI4MSAxIDUxOTYwMDAKKzI2NSAxIDUyMTczMzMKKzI3MiAxIDUyMzg2NjYKKzI3NyAxIDUyNjAwMDAKKzI4MCAxIDUyODEzMzMKKzI3NiAxIDUzMDI2NjYKKzI3MyAxIDUzMjQwMDAKKzI3OCAxIDUzNDUzMzMKKzI4MCAxIDUzNjY2NjYKKzI4MCAxIDUzODgwMDAKKzI2OCAxIDU0MDkzMzMKKzI4MiAxIDU0MzA2NjYKKzI3NyAxIDU0NTIwMDAKKzI3NCAxIDU0NzMzMzMKKzI3NSAxIDU0OTQ2NjYKKzI3MCAxIDU1MTYwMDAKKzI4MiAxIDU1MzczMzMKKzI3OSAxIDU1NTg2NjYKKzI2MCAxIDU1ODAwMDAKKzI3MiAxIDU2MDEzMzMKKzI3NSAxIDU2MjI2NjYKKzI3MyAxIDU2NDQwMDAKKzI3NiAxIDU2NjUzMzMKKzI4OCAxIDU2ODY2NjYKKzI5NCAxIDU3MDgwMDAKKzI3MSAxIDU3MjkzMzMKKzI3NyAxIDU3NTA2NjYKKzI4OCAxIDU3NzIwMDAKKzI3NiAxIDU3OTMzMzMKKzI4MiAxIDU4MTQ2NjYKKzI3NiAxIDU4MzYwMDAKKzI3NSAxIDU4NTczMzMKKzI2OCAxIDU4Nzg2NjYKKzI3MCAxIDU5MDAwMDAKKzI2NiAxIDU5MjEzMzMKKzI2OCAxIDU5NDI2NjYKKzI4MiAxIDU5NjQwMDAKKzI3OSAxIDU5ODUzMzMKKzI3OSAxIDYwMDY2NjYKKzI4NyAxIDYwMjgwMDAKKzI4NiAxIDYwNDkzMzMKKzI4MCAxIDYwNzA2NjYKKzI5MCAxIDYwOTIwMDAKKzI2NiAxIDYxMTMzMzMKKzI5MiAxIDYxMzQ2NjYKKzI2NCAxIDYxNTYwMDAKKzI3MSAxIDYxNzczMzMKKzI3NyAxIDYxOTg2NjYKKzI5MiAxIDYyMjAwMDAKKzI5OCAxIDYyNDEzMzMKKzI4NCAxIDYyNjI2NjYKKzI4NyAxIDYyODQwMDAKKzI3NSAxIDYzMDUzMzMKKzI5MSAxIDYzMjY2NjYKKzI4NyAxIDYzNDgwMDAKKzI4MyAxIDYzNjkzMzMKKzI4NCAxIDYzOTA2NjYKKzI3MSAxIDY0MTIwMDAKKzI4MiAxIDY0MzMzMzMKKzI3NyAxIDY0NTQ2NjYKKzI4MiAxIDY0NzYwMDAKKzI4NSAxIDY0OTczMzMKKzI4MCAxIDY1MTg2NjYKKzI3MSAxIDY1NDAwMDAKKzI4OSAxIDY1NjEzMzMKKzI4NyAxIDY1ODI2NjYKKzI5NCAxIDY2MDQwMDAKKzI3NyAxIDY2MjUzMzMKKzI4MSAxIDY2NDY2NjYKKzI3NCAxIDY2NjgwMDAKKzI3MSAxIDY2ODkzMzMKKzI3OSAxIDY3MTA2NjYKKzI4OCAxIDY3MzIwMDAKKzI4MCAxIDY3NTMzMzMKKzI4NCAxIDY3NzQ2NjYKKzI3OCAxIDY3OTYwMDAKKzI3NiAxIDY4MTczMzMKKzI3NSAxIDY4Mzg2NjYKKzI2MyAxIDY4NjAwMDAKKzI2NiAxIDY4ODEzMzMKKzI0NyAxIDY5MDI2NjYKKzI2OSAxIDY5MjQwMDAKKzI2MyAxIDY5NDUzMzMKKzI4MyAxIDY5NjY2NjYKKzI4MCAxIDY5ODgwMDAKKzI4MSAxIDcwMDkzMzMKKzI5OSAxIDcwMzA2NjYKKzI4NSAxIDcwNTIwMDAKKzI4OCAxIDcwNzMzMzMKKzI5OSAxIDcwOTQ2NjYKKzI4OCAxIDcxMTYwMDAKKzI3OSAxIDcxMzczMzMKKzI3NiAxIDcxNTg2NjYKKzI3NyAxIDcxODAwMDAKKzI4MiAxIDcyMDEzMzMKKzI4NSAxIDcyMjI2NjYKKzI5NSAxIDcyNDQwMDAKKzI5NCAxIDcyNjUzMzMKKzMwNCAxIDcyODY2NjYKKzI4MiAxIDczMDgwMDAKKzI5OSAxIDczMjkzMzMKKzI4MyAxIDczNTA2NjYKKzI4MiAxIDczNzIwMDAKKzI4NyAxIDczOTMzMzMKKzMwNiAxIDc0MTQ2NjYKKzMwNCAxIDc0MzYwMDAKKzI4OSAxIDc0NTczMzMKKzI5OSAxIDc0Nzg2NjYKKzI4MSAxIDc1MDAwMDAKKzI4MSAxIDc1MjEzMzMKKzY2IDEgNzU0MjY2NgorNjMgMSA3NTU0NjY2CisyODkgMSA3NTU3MzMzCisyNzAgMSA3NTY5MzMzCisyNTcgMSA3NTkwNjY2CisyNDYgMSA3NjEyMDAwCisyNjQgMSA3NjMzMzMzCisyODAgMSA3NjU0NjY2CisyNzMgMSA3Njc2MDAwCisyODUgMSA3Njk3MzMzCisyNjcgMSA3NzE4NjY2CisyNzUgMSA3NzQwMDAwCisyNzggMSA3NzYxMzMzCisyOTMgMSA3NzgyNjY2CisyODEgMSA3ODA0MDAwCisyOTcgMSA3ODI1MzMzCisyOTQgMSA3ODQ2NjY2CisyODYgMSA3ODY4MDAwCisyOTAgMSA3ODg5MzMzCisyOTAgMSA3OTEwNjY2CisyODkgMSA3OTMyMDAwCisyODYgMSA3OTUzMzMzCisyODIgMSA3OTc0NjY2CiszMDYgMSA3OTk2MDAwCisyODcgMSA4MDE3MzMzCiszMTIgMSA4MDM4NjY2CiszMTIgMSA4MDYwMDAwCiszMDcgMSA4MDgxMzMzCisyOTMgMSA4MTAyNjY2CisyODkgMSA4MTI0MDAwCisyODUgMSA4MTQ1MzMzCisyOTAgMSA4MTY2NjY2CisyODUgMSA4MTg4MDAwCiszMTEgMSA4MjA5MzMzCiszMDcgMSA4MjMwNjY2CiszMTQgMSA4MjUyMDAwCiszMTggMSA4MjczMzMzCiszMTkgMSA4Mjk0NjY2CiszMTUgMSA4MzE2MDAwCiszMDAgMSA4MzM3MzMzCisyOTUgMSA4MzU4NjY2CisyOTEgMSA4MzgwMDAwCisyODIgMSA4NDAxMzMzCisyOTUgMSA4NDIyNjY2CisyOTYgMSA4NDQ0MDAwCisyODggMSA4NDY1MzMzCiszMDQgMSA4NDg2NjY2CisyOTkgMSA4NTA4MDAwCisyOTggMSA4NTI5MzMzCiszMDUgMSA4NTUwNjY2CisyOTUgMSA4NTcyMDAwCisyOTYgMSA4NTkzMzMzCisyOTUgMSA4NjE0NjY2CisyODcgMSA4NjM2MDAwCisyOTIgMSA4NjU3MzMzCiszMDggMSA4Njc4NjY2CisyODcgMSA4NzAwMDAwCiszMDcgMSA4NzIxMzMzCisyOTUgMSA4NzQyNjY2CisyOTIgMSA4NzY0MDAwCisyOTIgMSA4Nzg1MzMzCisyNzkgMSA4ODA2NjY2CisyODkgMSA4ODI4MDAwCiszMDMgMSA4ODQ5MzMzCiszMDcgMSA4ODcwNjY2CiszMTAgMSA4ODkyMDAwCiszMDAgMSA4OTEzMzMzCisyOTkgMSA4OTM0NjY2CisyOTkgMSA4OTU2MDAwCisyODggMSA4OTc3MzMzCisyOTAgMSA4OTk4NjY2CisyOTEgMSA5MDIwMDAwCiszMDQgMSA5MDQxMzMzCisyOTkgMSA5MDYyNjY2CiszMDQgMSA5MDg0MDAwCisyOTAgMSA5MTA1MzMzCiszMDkgMSA5MTI2NjY2CiszMDEgMSA5MTQ4MDAwCisyOTYgMSA5MTY5MzMzCisyODggMSA5MTkwNjY2CiszMDUgMSA5MjEyMDAwCiszMTcgMSA5MjMzMzMzCisyOTIgMSA5MjU0NjY2CiszMDAgMSA5Mjc2MDAwCiszMDEgMSA5Mjk3MzMzCisyOTUgMSA5MzE4NjY2CisyODIgMSA5MzQwMDAwCisyOTYgMSA5MzYxMzMzCisyOTUgMSA5MzgyNjY2CisyODcgMSA5NDA0MDAwCisyOTIgMSA5NDI1MzMzCiszMDEgMSA5NDQ2NjY2CiszMTEgMSA5NDY4MDAwCiszMDEgMSA5NDg5MzMzCiszMDcgMSA5NTEwNjY2CiszMDAgMSA5NTMyMDAwCiszMDkgMSA5NTUzMzMzCisyOTggMSA5NTc0NjY2CiszMDQgMSA5NTk2MDAwCis2MCAxIDk2MTczMzMKKzU5IDEgOTYyOTMzMworNjQgMSA5NjMyMDAwCis2NCAxIDk2MzQ2NjYKKzc3IDEgOTYzNzMzMworNzIgMSA5NjQwMDAwCiszMDYgMSA5NjQyNjY2CisyOTcgMSA5NjU0NjY2CisyOTQgMSA5Njc2MDAwCisyOTUgMSA5Njk3MzMzCiszMDggMSA5NzE4NjY2CiszMDMgMSA5NzQwMDAwCiszMDggMSA5NzYxMzMzCisyODkgMSA5NzgyNjY2CiszMDAgMSA5ODA0MDAwCiszMDQgMSA5ODI1MzMzCiszMDggMSA5ODQ2NjY2Cis2NCAxIDk4NjgwMDAKKzYzIDEgOTg4MDAwMAorNjQgMSA5ODgyNjY2Cis2NCAxIDk4ODUzMzMKKzYwIDEgOTg4ODAwMAorNzQgMSA5ODkwNjY2Cis2OSAxIDk4OTMzMzMKKzY4IDEgOTg5NjAwMAorNjEgMSA5ODk4NjY2Cis3MSAxIDk5MDEzMzMKKzc2IDEgOTkwNDAwMAorNzMgMSA5OTA2NjY2Cis3MCAxIDk5MDkzMzMKKzcyIDEgOTkxMjAwMAorNjAgMSA5OTE0NjY2Cis2OSAxIDk5MTczMzMKKzgyIDEgOTkyMDAwMAorMjc4IDEgOTkyMjY2NgorMzAgMSA5OTM0NjY2CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei52b3JiaXMgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei52b3JiaXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA0YzVmOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LnZvcmJpcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAxZWE0NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMuaW5mbwpAQCAtMCwwICsxLDYwIEBACisxMDI3MSAxIDAKKzEwNiAwIDE3MDAwCisxMzQgMCAzMzAwMAorMTQ5IDAgNTAwMDAKKzE1MiAwIDY3MDAwCisxNTkgMCA4MzAwMAorMTE0IDAgMTAwMDAwCis3MjMgMCAxMTcwMDAKKzE3NSAwIDEzMzAwMAorMTg2IDAgMTUwMDAwCisyMDEgMCAxNjcwMDAKKzI3MCAwIDE4MzAwMAorMzgzIDAgMjAwMDAwCisyNTUgMCAyMTcwMDAKKzI4NiAwIDIzMzAwMAorMjczIDAgMjUwMDAwCisxMjI0IDAgMjY3MDAwCisyMjAgMCAyODMwMDAKKzIzMSAwIDMwMDAwMAorMTkyIDAgMzE3MDAwCisxODIgMCAzMzMwMDAKKzI4OSAwIDM1MDAwMAorMjA0IDAgMzY3MDAwCisyMzcgMCAzODMwMDAKKzE4NyAwIDQwMDAwMAorODk4IDAgNDE3MDAwCisyMzEgMCA0MzMwMDAKKzI2NiAwIDQ1MDAwMAorMjc4IDAgNDY3MDAwCisyMDUgMCA0ODMwMDAKKzI1NSAwIDUwMDAwMAorMTY5IDAgNTE3MDAwCisyMzMgMCA1MzMwMDAKKzEwMTEgMCA1NTAwMDAKKzIwMiAwIDU2NzAwMAorMjUxIDAgNTgzMDAwCisyMjMgMCA2MDAwMDAKKzI4MyAwIDYxNzAwMAorMzYyIDAgNjMzMDAwCisyMTcgMCA2NTAwMDAKKzI0NSAwIDY2NzAwMAorOTYwIDAgNjgzMDAwCisyMzMgMCA3MDAwMDAKKzI4NiAwIDcxNzAwMAorMjcyIDAgNzMzMDAwCisyNTQgMCA3NTAwMDAKKzMzMSAwIDc2NzAwMAorMjE4IDAgNzgzMDAwCisyNjEgMCA4MDAwMDAKKzk4MSAwIDgxNzAwMAorMjI2IDAgODMzMDAwCisyMjYgMCA4NTAwMDAKKzI3OSAwIDg2NzAwMAorMjI1IDAgODgzMDAwCisyOTUgMCA5MDAwMDAKKzE3NSAwIDkxNzAwMAorMjQ5IDAgOTMzMDAwCis5OTYgMCA5NTAwMDAKKzE2OSAwIDk2NzAwMAorMjI0IDAgOTgzMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLnZwOCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMudnA4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYmE1NmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLnZwOApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfNjQweDM2MF8ybWJwc18zMGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzAwYzc3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMuaW5mbwpAQCAtMCwwICsxLDMwMCBAQAorODY5ODAgMSAwCis2NzQxIDAgMzMwMDAKKzk0MzMgMCA2NzAwMAorOTM2MyAwIDEwMDAwMAorODY3MSAwIDEzMzAwMAorOTAwMyAwIDE2NzAwMAorNzc1MSAwIDIwMDAwMAorMTMyMDcgMCAyMzMwMDAKKzg1NDIgMCAyNjcwMDAKKzkzNDQgMCAzMDAwMDAKKzgwNjkgMCAzMzMwMDAKKzg1ODggMCAzNjcwMDAKKzEyMDg3IDAgNDAwMDAwCis3MzE1IDAgNDMzMDAwCis5NjU0IDAgNDY3MDAwCisxMzEwMCAwIDUwMDAwMAorNzgzMiAwIDUzMzAwMAorMTAwNjAgMCA1NjcwMDAKKzg1NDAgMCA2MDAwMDAKKzg2NjcgMCA2MzMwMDAKKzg1MzIgMCA2NjcwMDAKKzYwMTggMCA3MDAwMDAKKzg1MjAgMCA3MzMwMDAKKzE1MzUwIDAgNzY3MDAwCis2MTEwIDAgODAwMDAwCis3ODc2IDAgODMzMDAwCis2MTMzIDAgODY3MDAwCis5NDc2IDAgOTAwMDAwCisxMTAwMiAwIDkzMzAwMAorNzQ4NCAwIDk2NzAwMAorODc2MCAwIDEwMDAwMDAKKzE2NTE1IDAgMTAzMzAwMAorNzQ4MiAwIDEwNjcwMDAKKzY5ODMgMCAxMTAwMDAwCis3NTYxIDAgMTEzMzAwMAorODI2MyAwIDExNjcwMDAKKzEwNjgyIDAgMTIwMDAwMAorODEwOCAwIDEyMzMwMDAKKzc5MjQgMCAxMjY3MDAwCis4NjkzIDAgMTMwMDAwMAorMTQxOTAgMCAxMzMzMDAwCis3MzkzIDAgMTM2NzAwMAorNjg2NCAwIDE0MDAwMDAKKzk0MzEgMCAxNDMzMDAwCis3Njc0IDAgMTQ2NzAwMAorODQ1OCAwIDE1MDAwMDAKKzU4OTkgMCAxNTMzMDAwCis4MjU5IDAgMTU2NzAwMAorNzk2MyAwIDE2MDAwMDAKKzE0Nzc5IDAgMTYzMzAwMAorNjg3NyAwIDE2NjcwMDAKKzcyNjggMCAxNzAwMDAwCis4NTI2IDAgMTczMzAwMAorODQ2NyAwIDE3NjcwMDAKKzExMjAwIDAgMTgwMDAwMAorNzI2MSAwIDE4MzMwMDAKKzgyODAgMCAxODY3MDAwCis2NzE4IDAgMTkwMDAwMAorMTc3NDIgMCAxOTMzMDAwCis1MjA2IDAgMTk2NzAwMAorNTcwMCAwIDIwMDAwMDAKKzU4NzIgMCAyMDMzMDAwCis3OTE1IDAgMjA2NzAwMAorODQ5MyAwIDIxMDAwMDAKKzY1NDUgMCAyMTMzMDAwCis5MDcyIDAgMjE2NzAwMAorMTMyMDAgMCAyMjAwMDAwCis5NjMyIDAgMjIzMzAwMAorMTAwMTYgMCAyMjY3MDAwCis3ODI0IDAgMjMwMDAwMAorMTA2MjggMCAyMzMzMDAwCisxMDQwMSAwIDIzNjcwMDAKKzEwODkyIDAgMjQwMDAwMAorOTAyMyAwIDI0MzMwMDAKKzEwNzM0IDAgMjQ2NzAwMAorMTUwNDUgMCAyNTAwMDAwCis3OTQwIDAgMjUzMzAwMAorOTY1NyAwIDI1NjcwMDAKKzg3NDMgMCAyNjAwMDAwCis4MDc0IDAgMjYzMzAwMAorOTQ0NSAwIDI2NjcwMDAKKzY0OTQgMCAyNzAwMDAwCis4NjAxIDAgMjczMzAwMAorMTM0NzggMCAyNzY3MDAwCis2OTQyIDAgMjgwMDAwMAorODAwMiAwIDI4MzMwMDAKKzc5NDAgMCAyODY3MDAwCis4MzIwIDAgMjkwMDAwMAorMTIyMTUgMCAyOTMzMDAwCis2NjY4IDAgMjk2NzAwMAorMTEzODQgMCAzMDAwMDAwCis4Mzc4IDAgMzAzMzAwMAorMTI5MDggMCAzMDY3MDAwCis4NDIwIDAgMzEwMDAwMAorNzUwMiAwIDMxMzMwMDAKKzg0ODIgMCAzMTY3MDAwCisxMDk2OCAwIDMyMDAwMDAKKzEyMzM4IDAgMzIzMzAwMAorODY1NyAwIDMyNjcwMDAKKzEwNDY4IDAgMzMwMDAwMAorMTM4NzggMCAzMzMzMDAwCis5Mzc0IDAgMzM2NzAwMAorOTg1NyAwIDM0MDAwMDAKKzEwMzgxIDAgMzQzMzAwMAorOTk4NCAwIDM0NjcwMDAKKzk5NTYgMCAzNTAwMDAwCis4OTA1IDAgMzUzMzAwMAorODY3MiAwIDM1NjcwMDAKKzgxMjIgMCAzNjAwMDAwCis5Njc3IDAgMzYzMzAwMAorOTgxMiAwIDM2NjcwMDAKKzk2MjIgMCAzNzAwMDAwCis5MDIzIDAgMzczMzAwMAorNzE0NyAwIDM3NjcwMDAKKzkxNDYgMCAzODAwMDAwCis3NDg4IDAgMzgzMzAwMAorMTA4MTIgMCAzODY3MDAwCis4MzQwIDAgMzkwMDAwMAorMTMyODAgMCAzOTMzMDAwCis1MTY3IDAgMzk2NzAwMAorNjk5MSAwIDQwMDAwMDAKKzY1NDMgMCA0MDMzMDAwCis1OTUyIDAgNDA2NzAwMAorNTE2NCAwIDQxMDAwMDAKKzQwMTEgMCA0MTMzMDAwCiszNzk0IDAgNDE2NzAwMAorMTI5NTkgMCA0MjAwMDAwCis3MTAyMCAxIDQyMzMwMDAKKzUzNTEgMCA0MjY3MDAwCis2MjgzIDAgNDMwMDAwMAorNTA4MCAwIDQzMzMwMDAKKzY3MDcgMCA0MzY3MDAwCis1ODU3IDAgNDQwMDAwMAorNTIyMSAwIDQ0MzMwMDAKKzEwOTcyIDAgNDQ2NzAwMAorNzAyMyAwIDQ1MDAwMDAKKzY5MDcgMCA0NTMzMDAwCis3ODUxIDAgNDU2NzAwMAorNDg0MyAwIDQ2MDAwMDAKKzYwODUgMCA0NjMzMDAwCis0ODY4IDAgNDY2NzAwMAorNTA5MyAwIDQ3MDAwMDAKKzEyODA3IDAgNDczMzAwMAorNjMzMCAwIDQ3NjcwMDAKKzQyMDkgMCA0ODAwMDAwCis0NTk2IDAgNDgzMzAwMAorNjMxNiAwIDQ4NjcwMDAKKzQ5NTQgMCA0OTAwMDAwCis1NTMzIDAgNDkzMzAwMAorNzc0OSAwIDQ5NjcwMDAKKzEyNDg2IDAgNTAwMDAwMAorNTQ2OCAwIDUwMzMwMDAKKzQzNTMgMCA1MDY3MDAwCis1Nzg2IDAgNTEwMDAwMAorNTU1MSAwIDUxMzMwMDAKKzY3MTEgMCA1MTY3MDAwCis1Njg4IDAgNTIwMDAwMAorNjI1OCAwIDUyMzMwMDAKKzEyOTc1IDAgNTI2NzAwMAorNDg3MyAwIDUzMDAwMDAKKzQ1NTIgMCA1MzMzMDAwCis0ODQ0IDAgNTM2NzAwMAorNDc3NCAwIDU0MDAwMDAKKzUwMjUgMCA1NDMzMDAwCis1MjA0IDAgNTQ2NzAwMAorNDgxNCAwIDU1MDAwMDAKKzE0ODM1IDAgNTUzMzAwMAorNTM0MyAwIDU1NjcwMDAKKzQ4MDggMCA1NjAwMDAwCis1MDcxIDAgNTYzMzAwMAorNjMyNCAwIDU2NjcwMDAKKzUyNDMgMCA1NzAwMDAwCis0OTk1IDAgNTczMzAwMAorNTEzNCAwIDU3NjcwMDAKKzExMDU0IDAgNTgwMDAwMAorNDgwNyAwIDU4MzMwMDAKKzUxMTggMCA1ODY3MDAwCis2NDI0IDAgNTkwMDAwMAorNDk4NCAwIDU5MzMwMDAKKzcxODcgMCA1OTY3MDAwCis1NTA1IDAgNjAwMDAwMAorNjk0MSAwIDYwMzMwMDAKKzExNTE3IDAgNjA2NzAwMAorNTY0NiAwIDYxMDAwMDAKKzY4MzIgMCA2MTMzMDAwCis1Mjk0IDAgNjE2NzAwMAorNjIwMCAwIDYyMDAwMDAKKzYzMjggMCA2MjMzMDAwCis0MzQ4IDAgNjI2NzAwMAorNDYwNyAwIDYzMDAwMDAKKzEyOTU4IDAgNjMzMzAwMAorNDMwOCAwIDYzNjcwMDAKKzYwODQgMCA2NDAwMDAwCis0NDk0IDAgNjQzMzAwMAorNTMzOCAwIDY0NjcwMDAKKzU3NDIgMCA2NTAwMDAwCis1NDcyIDAgNjUzMzAwMAorODQ1OSAwIDY1NjcwMDAKKzEzMDc1IDAgNjYwMDAwMAorODk4NiAwIDY2MzMwMDAKKzk1ODMgMCA2NjY3MDAwCis4NzkyIDAgNjcwMDAwMAorOTAwNCAwIDY3MzMwMDAKKzk2MzIgMCA2NzY3MDAwCis5MzkzIDAgNjgwMDAwMAorOTI1OSAwIDY4MzMwMDAKKzExOTI3IDAgNjg2NzAwMAorMTAzMjMgMCA2OTAwMDAwCisxNTI0OCAwIDY5MzMwMDAKKzExMjQ0IDAgNjk2NzAwMAorMTU1NTggMCA3MDAwMDAwCis2MTk3IDAgNzAzMzAwMAorODA0NCAwIDcwNjcwMDAKKzExNDMyIDAgNzEwMDAwMAorODczNyAwIDcxMzMwMDAKKzEzODg1IDAgNzE2NzAwMAorMTExNTggMCA3MjAwMDAwCisxNTE1MiAwIDcyMzMwMDAKKzcwMjUgMCA3MjY3MDAwCis4MDI1IDAgNzMwMDAwMAorMTMzNjIgMCA3MzMzMDAwCis4MDkwIDAgNzM2NzAwMAorMTM2MzcgMCA3NDAwMDAwCis2MTQ4IDAgNzQzMzAwMAorOTI3MCAwIDc0NjcwMDAKKzg2MzMgMCA3NTAwMDAwCisxMDY3MyAwIDc1MzMwMDAKKzE0MjA4IDAgNzU2NzAwMAorODA4NCAwIDc2MDAwMDAKKzEzNzgzIDAgNzYzMzAwMAorMTA2NjAgMCA3NjY3MDAwCis3NDY2IDAgNzcwMDAwMAorMTQ0MzMgMCA3NzMzMDAwCisxMDkzNCAwIDc3NjcwMDAKKzcyMzkgMCA3ODAwMDAwCisxMjU0OCAwIDc4MzMwMDAKKzY1NjQgMCA3ODY3MDAwCisxMDc2MSAwIDc5MDAwMDAKKzEwOTkyIDAgNzkzMzAwMAorMTI5MjQgMCA3OTY3MDAwCisxMjM0OCAwIDgwMDAwMDAKKzY3NzAgMCA4MDMzMDAwCisxNDI4OCAwIDgwNjcwMDAKKzI5MzQ1IDEgODEwMDAwMAorMTgyMiAwIDgxMzMwMDAKKzEwODcgMCA4MTY3MDAwCisxMTA5IDAgODIwMDAwMAorMjAwNyAwIDgyMzMwMDAKKzE3OTggMCA4MjY3MDAwCisxNjM1IDAgODMwMDAwMAorMTk2MDcgMCA4MzMzMDAwCis5MTkgMCA4MzY3MDAwCisyMzU3IDAgODQwMDAwMAorMzU3OCAwIDg0MzMwMDAKKzQ0OTcgMCA4NDY3MDAwCis0MzE0IDAgODUwMDAwMAorMzg1MSAwIDg1MzMwMDAKKzM4MjIgMCA4NTY3MDAwCis0MjUyIDAgODYwMDAwMAorNDc3NSAwIDg2MzMwMDAKKzEyMjAzIDAgODY2NzAwMAorNTA3OCAwIDg3MDAwMDAKKzU4NzYgMCA4NzMzMDAwCis2MTI0IDAgODc2NzAwMAorNDQ5MCAwIDg4MDAwMDAKKzM1MzggMCA4ODMzMDAwCiszNDUwIDAgODg2NzAwMAorMzYxMSAwIDg5MDAwMDAKKzI4NDcgMCA4OTMzMDAwCisyNjA1IDAgODk2NzAwMAorMTIyNDMgMCA5MDAwMDAwCisxOTQ2IDAgOTAzMzAwMAorMTg0NyAwIDkwNjcwMDAKKzIwMzUgMCA5MTAwMDAwCisyNTcyIDAgOTEzMzAwMAorMjMyNiAwIDkxNjcwMDAKKzI2NDUgMCA5MjAwMDAwCisyOTM4IDAgOTIzMzAwMAorMjQ5NSAwIDkyNjcwMDAKKzI2MDkgMCA5MzAwMDAwCis5NzQ0IDAgOTMzMzAwMAorMTc5NiAwIDkzNjcwMDAKKzE5ODUgMCA5NDAwMDAwCisxNzU5IDAgOTQzMzAwMAorMjI1OSAwIDk0NjcwMDAKKzIyMzMgMCA5NTAwMDAwCisyMDQ0IDAgOTUzMzAwMAorMjUwMiAwIDk1NjcwMDAKKzIzMDcgMCA5NjAwMDAwCisyNzM5IDAgOTYzMzAwMAorMTE3MDcgMCA5NjY3MDAwCis1MTY4IDAgOTcwMDAwMAorNDQ4MyAwIDk3MzMwMDAKKzMwNDQgMCA5NzY3MDAwCis0MjQxIDAgOTgwMDAwMAorNDM5MiAwIDk4MzMwMDAKKzQ5MzQgMCA5ODY3MDAwCis1OTM0IDAgOTkwMDAwMAorNTY0NyAwIDk5MzMwMDAKKzUzMjYgMCA5OTY3MDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfNjQweDM2MF8ybWJwc18zMGZwcy52cDggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfNjQweDM2MF8ybWJwc18zMGZwcy52cDgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVjNDYwYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzLnZwOApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ExYTAzYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOV8xNzZ4MTQ0XzI4NWticHNfNjBmcHMuaW5mbwpAQCAtMCwwICsxLDYwIEBACis2OTM5IDEgMAorNjgxOCAwIDE3MDAwCiszMTAgMCAzMzAwMAorMjczIDAgNTAwMDAKKzI2NyAwIDY3MDAwCisyMzkgMCA4MzAwMAorMjMyIDAgMTAwMDAwCisyMjIgMCAxMTcwMDAKKzE4NiAwIDEzMzAwMAorMTk0IDAgMTUwMDAwCisxODkgMCAxNjcwMDAKKzE4IDAgMTgzMDAwCisyMDE0IDAgMjAwMDAwCisyOTcgMCAyMTcwMDAKKzI4NyAwIDIzMzAwMAorMjM3IDAgMjUwMDAwCisyNjMgMCAyNjcwMDAKKzIzOCAwIDI4MzAwMAorMjU3IDAgMzAwMDAwCisyMjkgMCAzMTcwMDAKKzE4NyAwIDMzMzAwMAorMTkxIDAgMzUwMDAwCisxOCAwIDM2NzAwMAorMjIwMyAwIDM4MzAwMAorMjY1IDAgNDAwMDAwCisyMjQgMCA0MTcwMDAKKzI1NCAwIDQzMzAwMAorMjUyIDAgNDUwMDAwCisyNzMgMCA0NjcwMDAKKzIwOCAwIDQ4MzAwMAorMTU0IDAgNTAwMDAwCisxODIgMCA1MTcwMDAKKzEzOCAwIDUzMzAwMAorMTggMCA1NTAwMDAKKzI1MDIgMCA1NjcwMDAKKzI4NiAwIDU4MzAwMAorMzA0IDAgNjAwMDAwCiszNDEgMCA2MTcwMDAKKzI1OSAwIDYzMzAwMAorMjc1IDAgNjUwMDAwCisyMjIgMCA2NjcwMDAKKzI1NCAwIDY4MzAwMAorMjUzIDAgNzAwMDAwCisyMjUgMCA3MTcwMDAKKzE4IDAgNzMzMDAwCisyNTAxIDAgNzUwMDAwCisyODIgMCA3NjcwMDAKKzI5OCAwIDc4MzAwMAorMjUyIDAgODAwMDAwCisyNDIgMCA4MTcwMDAKKzI1MCAwIDgzMzAwMAorMjYwIDAgODUwMDAwCisyMTggMCA4NjcwMDAKKzIxMyAwIDg4MzAwMAorMTQ0IDAgOTAwMDAwCisxOCAwIDkxNzAwMAorMjMzIDAgOTMzMDAwCisyNTQgMCA5NTAwMDAKKzIyOSAwIDk2NzAwMAorMjM5IDAgOTgzMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLnZwOSBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOV8xNzZ4MTQ0XzI4NWticHNfNjBmcHMudnA5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MzNjOGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLnZwOQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDlfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmU5Njc5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbwpAQCAtMCwwICsxLDMwMCBAQAorNTQ5MTggMSAwCis0NjI4MCAwIDMzMDAwCisyMDA2IDAgNjcwMDAKKzI4NDEgMCAxMDAwMDAKKzMwNDQgMCAxMzMwMDAKKzM0MjkgMCAxNjcwMDAKKzMxOTYgMCAyMDAwMDAKKzI5MjYgMCAyMzMwMDAKKzI4MjEgMCAyNjcwMDAKKzExNTAgMCAzMDAwMDAKKzM2IDAgMzMzMDAwCiszODA4NCAwIDM2NzAwMAorMzY4OSAwIDQwMDAwMAorMzQ3MyAwIDQzMzAwMAorMzAxMSAwIDQ2NzAwMAorMzA5MCAwIDUwMDAwMAorMjUxNiAwIDUzMzAwMAorMjc3MSAwIDU2NzAwMAorMzI1MCAwIDYwMDAwMAorMTE1OSAwIDYzMzAwMAorMzQgMCA2NjcwMDAKKzM5NjkwIDAgNzAwMDAwCiszNjE1IDAgNzMzMDAwCisyNDk0IDAgNzY3MDAwCisyODkzIDAgODAwMDAwCiszMzI5IDAgODMzMDAwCisyOTM5IDAgODY3MDAwCisyMzUyIDAgOTAwMDAwCisyNzMyIDAgOTMzMDAwCisxNzQ2IDAgOTY3MDAwCiszMyAwIDEwMDAwMDAKKzQxNTAxIDAgMTAzMzAwMAorMjk5NyAwIDEwNjcwMDAKKzI2NjYgMCAxMTAwMDAwCiszNTgyIDAgMTEzMzAwMAorMjYxNiAwIDExNjcwMDAKKzI5MjMgMCAxMjAwMDAwCisyNjk2IDAgMTIzMzAwMAorMTYyOCAwIDEyNjcwMDAKKzE4ODcgMCAxMzAwMDAwCiszMyAwIDEzMzMwMDAKKzQyODc2IDAgMTM2NzAwMAorMjU4OCAwIDE0MDAwMDAKKzMzMTYgMCAxNDMzMDAwCisyMjg3IDAgMTQ2NzAwMAorMzM3NSAwIDE1MDAwMDAKKzIxMDggMCAxNTMzMDAwCisyOTYxIDAgMTU2NzAwMAorMTczMCAwIDE2MDAwMDAKKzE4MDAgMCAxNjMzMDAwCiszNCAwIDE2NjcwMDAKKzQzNzk3IDAgMTcwMDAwMAorMjQ4NCAwIDE3MzMwMDAKKzI1NTYgMCAxNzY3MDAwCisyNjcxIDAgMTgwMDAwMAorMjMzOCAwIDE4MzMwMDAKKzMxMzMgMCAxODY3MDAwCisyMDAyIDAgMTkwMDAwMAorMTc5NCAwIDE5MzMwMDAKKzEyNzkgMCAxOTY3MDAwCiszMiAwIDIwMDAwMDAKKzQyNjQyIDAgMjAzMzAwMAorMjY4NiAwIDIwNjcwMDAKKzIyMDIgMCAyMTAwMDAwCisyMTQ1IDAgMjEzMzAwMAorMjU2NiAwIDIxNjcwMDAKKzIxOTAgMCAyMjAwMDAwCisxNTgwIDAgMjIzMzAwMAorMTcxMSAwIDIyNjcwMDAKKzY0OCAwIDIzMDAwMDAKKzMyIDAgMjMzMzAwMAorNDA0MDkgMCAyMzY3MDAwCisyNjI4IDAgMjQwMDAwMAorMTk3MyAwIDI0MzMwMDAKKzIzNjAgMCAyNDY3MDAwCiszMDQzIDAgMjUwMDAwMAorMTczMCAwIDI1MzMwMDAKKzE0NTYgMCAyNTY3MDAwCisyMzEyIDAgMjYwMDAwMAorMzY5IDAgMjYzMzAwMAorMzIgMCAyNjY3MDAwCis0MTM5MSAwIDI3MDAwMDAKKzI5NjcgMCAyNzMzMDAwCisyNDU0IDAgMjc2NzAwMAorMTgyNSAwIDI4MDAwMDAKKzE4NTMgMCAyODMzMDAwCisxNzQ2IDAgMjg2NzAwMAorMjM0NyAwIDI5MDAwMDAKKzEzNjIgMCAyOTMzMDAwCis0NDEgMCAyOTY3MDAwCiszNCAwIDMwMDAwMDAKKzQyNTAzIDAgMzAzMzAwMAorMTg3NyAwIDMwNjcwMDAKKzE2OTAgMCAzMTAwMDAwCisxMzY3IDAgMzEzMzAwMAorMTUyMCAwIDMxNjcwMDAKKzEyNDAgMCAzMjAwMDAwCisxMDk0IDAgMzIzMzAwMAorNzM5IDAgMzI2NzAwMAorMzkyIDAgMzMwMDAwMAorMzMgMCAzMzMzMDAwCiszNTEwNCAwIDMzNjcwMDAKKzE0NjMgMCAzNDAwMDAwCisyMDI5IDAgMzQzMzAwMAorMTYyNiAwIDM0NjcwMDAKKzE5NTYgMCAzNTAwMDAwCis3OTkgMCAzNTMzMDAwCis1NTYgMCAzNTY3MDAwCis1ODQgMCAzNjAwMDAwCisxOTEgMCAzNjMzMDAwCiszNiAwIDM2NjcwMDAKKzM3NjUyIDAgMzcwMDAwMAorODYyIDAgMzczMzAwMAorNTI0IDAgMzc2NzAwMAorNjQxIDAgMzgwMDAwMAorNTg0IDAgMzgzMzAwMAorMzYwIDAgMzg2NzAwMAorMzY1IDAgMzkwMDAwMAorMzYxIDAgMzkzMzAwMAorMTU0IDAgMzk2NzAwMAorMzYgMCA0MDAwMDAwCisxMjU3NDAgMCA0MDMzMDAwCiszMzIgMCA0MDY3MDAwCiszODEgMCA0MTAwMDAwCis0MjAgMCA0MTMzMDAwCis0NjQgMCA0MTY3MDAwCisyODggMCA0MjAwMDAwCisyNjYwIDAgNDIzMzAwMAorMTI3NTY0IDEgNDI2NzAwMAorMzA2OTYgMCA0MzAwMDAwCiszNDIzIDAgNDMzMzAwMAorMzMxMCAwIDQzNjcwMDAKKzM1MTMgMCA0NDAwMDAwCiszNzM1IDAgNDQzMzAwMAorMzM1OCAwIDQ0NjcwMDAKKzMxMDggMCA0NTAwMDAwCisyODAwIDAgNDUzMzAwMAorMTc1MSAwIDQ1NjcwMDAKKzQxIDAgNDYwMDAwMAorMzk4NjIgMCA0NjMzMDAwCiszNzM5IDAgNDY2NzAwMAorMzc1NSAwIDQ3MDAwMDAKKzM0MDggMCA0NzMzMDAwCiszNzgzIDAgNDc2NzAwMAorMzQyMyAwIDQ4MDAwMDAKKzI4MDEgMCA0ODMzMDAwCisyNTQ5IDAgNDg2NzAwMAorMTQ2MSAwIDQ5MDAwMDAKKzQwIDAgNDkzMzAwMAorNDE2NjcgMCA0OTY3MDAwCiszNjIzIDAgNTAwMDAwMAorMzM1NiAwIDUwMzMwMDAKKzM0MjQgMCA1MDY3MDAwCiszNTQ4IDAgNTEwMDAwMAorMzExOSAwIDUxMzMwMDAKKzI5MDUgMCA1MTY3MDAwCisyNzcyIDAgNTIwMDAwMAorMTYyMyAwIDUyMzMwMDAKKzQzIDAgNTI2NzAwMAorNDY3ODMgMCA1MzAwMDAwCiszNDYyIDAgNTMzMzAwMAorMzQ3MCAwIDUzNjcwMDAKKzM2NzcgMCA1NDAwMDAwCiszNjg0IDAgNTQzMzAwMAorMzI2NiAwIDU0NjcwMDAKKzMxMjcgMCA1NTAwMDAwCisyODA5IDAgNTUzMzAwMAorMTc1MCAwIDU1NjcwMDAKKzQwIDAgNTYwMDAwMAorNDYyMTUgMCA1NjMzMDAwCiszNTk5IDAgNTY2NzAwMAorMzU1OCAwIDU3MDAwMDAKKzM1NDQgMCA1NzMzMDAwCiszNjMyIDAgNTc2NzAwMAorMzU0OCAwIDU4MDAwMDAKKzI5NjggMCA1ODMzMDAwCisyNzE1IDAgNTg2NzAwMAorMTcyOSAwIDU5MDAwMDAKKzQxIDAgNTkzMzAwMAorNDU5NTggMCA1OTY3MDAwCiszNzc2IDAgNjAwMDAwMAorMzUyNSAwIDYwMzMwMDAKKzM2NDQgMCA2MDY3MDAwCiszNzg2IDAgNjEwMDAwMAorMzIyMiAwIDYxMzMwMDAKKzI5MjMgMCA2MTY3MDAwCisyNzUyIDAgNjIwMDAwMAorMTU5MiAwIDYyMzMwMDAKKzQxIDAgNjI2NzAwMAorNDYwMzEgMCA2MzAwMDAwCiszNTIwIDAgNjMzMzAwMAorMzM4MCAwIDYzNjcwMDAKKzMzNzEgMCA2NDAwMDAwCiszNDI3IDAgNjQzMzAwMAorMzEzNSAwIDY0NjcwMDAKKzI5ODggMCA2NTAwMDAwCisyNzMwIDAgNjUzMzAwMAorMTY3MSAwIDY1NjcwMDAKKzQxIDAgNjYwMDAwMAorNDU4NDYgMCA2NjMzMDAwCiszNTM1IDAgNjY2NzAwMAorMzUwNyAwIDY3MDAwMDAKKzM0MjkgMCA2NzMzMDAwCiszNDkxIDAgNjc2NzAwMAorMzMyNSAwIDY4MDAwMDAKKzI5NzkgMCA2ODMzMDAwCisyODAwIDAgNjg2NzAwMAorMTYxMCAwIDY5MDAwMDAKKzQwIDAgNjkzMzAwMAorNDU5NTggMCA2OTY3MDAwCiszNzYyIDAgNzAwMDAwMAorMzI1NCAwIDcwMzMwMDAKKzM0MDggMCA3MDY3MDAwCiszODYwIDAgNzEwMDAwMAorMzE5OCAwIDcxMzMwMDAKKzI5NjYgMCA3MTY3MDAwCisyODgyIDAgNzIwMDAwMAorMTc2MyAwIDcyMzMwMDAKKzQyIDAgNzI2NzAwMAorNDYxMzAgMCA3MzAwMDAwCiszNTkzIDAgNzMzMzAwMAorMzUyMyAwIDczNjcwMDAKKzM5MzkgMCA3NDAwMDAwCiszOTgwIDAgNzQzMzAwMAorMzQ3MCAwIDc0NjcwMDAKKzMxOTEgMCA3NTAwMDAwCisyOTY5IDAgNzUzMzAwMAorMTc0MCAwIDc1NjcwMDAKKzQxIDAgNzYwMDAwMAorNDYzMDAgMCA3NjMzMDAwCiszNzM5IDAgNzY2NzAwMAorMzc4MSAwIDc3MDAwMDAKKzM5NjQgMCA3NzMzMDAwCis0MDIzIDAgNzc2NzAwMAorMzQ4MCAwIDc4MDAwMDAKKzMwNjUgMCA3ODMzMDAwCisyOTM0IDAgNzg2NzAwMAorMTgwNSAwIDc5MDAwMDAKKzQyIDAgNzkzMzAwMAorMzgxNjYgMCA3OTY3MDAwCis0MDYyIDAgODAwMDAwMAorMzg0NCAwIDgwMzMwMDAKKzQ1NDcgMCA4MDY3MDAwCis5MzQgMCA4MTAwMDAwCiszNjUgMCA4MTMzMDAwCisxODEgMCA4MTY3MDAwCis0NjMgMCA4MjAwMDAwCis0MTkgMCA4MjMzMDAwCiszOCAwIDgyNjcwMDAKKzk3MDIgMCA4MzAwMDAwCiszNDQgMCA4MzMzMDAwCisyNzYgMCA4MzY3MDAwCisxMzUwIDAgODQwMDAwMAorMTcwMyAwIDg0MzMwMDAKKzE4NDMgMCA4NDY3MDAwCisxMjI4IDAgODUwMDAwMAorMzU1ODAgMSA4NTMzMDAwCisyNzQ1OCAwIDg1NjcwMDAKKzIxNDQgMCA4NjAwMDAwCisyNDgyIDAgODYzMzAwMAorMjAwNCAwIDg2NjcwMDAKKzI4MjIgMCA4NzAwMDAwCisyNTcwIDAgODczMzAwMAorMTcyNiAwIDg3NjcwMDAKKzEyNDggMCA4ODAwMDAwCis4NDQgMCA4ODMzMDAwCiszNSAwIDg4NjcwMDAKKzE0MjA3IDAgODkwMDAwMAorMTAzNyAwIDg5MzMwMDAKKzc0OSAwIDg5NjcwMDAKKzgyOSAwIDkwMDAwMDAKKzkxNSAwIDkwMzMwMDAKKzY4NSAwIDkwNjcwMDAKKzc2NyAwIDkxMDAwMDAKKzc5OCAwIDkxMzMwMDAKKzM0MiAwIDkxNjcwMDAKKzMxIDAgOTIwMDAwMAorMTI1OTAgMCA5MjMzMDAwCis5MjMgMCA5MjY3MDAwCis4MTkgMCA5MzAwMDAwCis3NzYgMCA5MzMzMDAwCis4NjMgMCA5MzY3MDAwCis3MjkgMCA5NDAwMDAwCis0NzEgMCA5NDMzMDAwCis2MzggMCA5NDY3MDAwCisyNzYgMCA5NTAwMDAwCiszOCAwIDk1MzMwMDAKKzE3MjcyIDAgOTU2NzAwMAorODU2IDAgOTYwMDAwMAorMTE1OCAwIDk2MzMwMDAKKzIxNzIgMCA5NjY3MDAwCisyNzUxIDAgOTcwMDAwMAorMjE0MiAwIDk3MzMwMDAKKzEyNjcgMCA5NzY3MDAwCisxOTY1IDAgOTgwMDAwMAorMTUxMCAwIDk4MzMwMDAKKzM0IDAgOTg2NzAwMAorMjY5MiAwIDk5MDAwMDAKKzI3NzggMCA5OTMzMDAwCisyNTg1IDAgOTk2NzAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMudnA5IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMudnA5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZTIwMDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDlfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy52cDkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9zaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmFtcm5iIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9zaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmFtcm5iCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYWYyZTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL3NpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouYW1ybmIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9zaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL3NpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzZlODEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9zaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmluZm8KQEAgLTAsMCArMSw4MzMgQEAKKzMyIDEgMAorMzIgMSAyMDAwMAorMzIgMSA0MDAwMAorMzIgMSA2MDAwMAorMzIgMSA4MDAwMAorMzIgMSAxMDAwMDAKKzMyIDEgMTIwMDAwCiszMiAxIDE0MDAwMAorMzIgMSAxNjAwMDAKKzMyIDEgMTgwMDAwCiszMiAxIDIwMDAwMAorMzIgMSAyMjAwMDAKKzMyIDEgMjQwMDAwCiszMiAxIDI2MDAwMAorMzIgMSAyODAwMDAKKzMyIDEgMzAwMDAwCiszMiAxIDMyMDAwMAorMzIgMSAzNDAwMDAKKzMyIDEgMzYwMDAwCiszMiAxIDM4MDAwMAorMzIgMSA0MDAwMDAKKzMyIDEgNDIwMDAwCiszMiAxIDQ0MDAwMAorMzIgMSA0NjAwMDAKKzMyIDEgNDgwMDAwCiszMiAxIDUwMDAwMAorMzIgMSA1MjAwMDAKKzMyIDEgNTQwMDAwCiszMiAxIDU2MDAwMAorMzIgMSA1ODAwMDAKKzMyIDEgNjAwMDAwCiszMiAxIDYyMDAwMAorMzIgMSA2NDAwMDAKKzMyIDEgNjYwMDAwCiszMiAxIDY4MDAwMAorMzIgMSA3MDAwMDAKKzMyIDEgNzIwMDAwCiszMiAxIDc0MDAwMAorMzIgMSA3NjAwMDAKKzMyIDEgNzgwMDAwCiszMiAxIDgwMDAwMAorMzIgMSA4MjAwMDAKKzMyIDEgODQwMDAwCiszMiAxIDg2MDAwMAorMzIgMSA4ODAwMDAKKzMyIDEgOTAwMDAwCiszMiAxIDkyMDAwMAorMzIgMSA5NDAwMDAKKzMyIDEgOTYwMDAwCiszMiAxIDk4MDAwMAorMzIgMSAxMDAwMDAwCiszMiAxIDEwMjAwMDAKKzMyIDEgMTA0MDAwMAorMzIgMSAxMDYwMDAwCiszMiAxIDEwODAwMDAKKzMyIDEgMTEwMDAwMAorMzIgMSAxMTIwMDAwCiszMiAxIDExNDAwMDAKKzMyIDEgMTE2MDAwMAorMzIgMSAxMTgwMDAwCiszMiAxIDEyMDAwMDAKKzMyIDEgMTIyMDAwMAorMzIgMSAxMjQwMDAwCiszMiAxIDEyNjAwMDAKKzMyIDEgMTI4MDAwMAorMzIgMSAxMzAwMDAwCiszMiAxIDEzMjAwMDAKKzMyIDEgMTM0MDAwMAorMzIgMSAxMzYwMDAwCiszMiAxIDEzODAwMDAKKzMyIDEgMTQwMDAwMAorMzIgMSAxNDIwMDAwCiszMiAxIDE0NDAwMDAKKzMyIDEgMTQ2MDAwMAorMzIgMSAxNDgwMDAwCiszMiAxIDE1MDAwMDAKKzMyIDEgMTUyMDAwMAorMzIgMSAxNTQwMDAwCiszMiAxIDE1NjAwMDAKKzMyIDEgMTU4MDAwMAorMzIgMSAxNjAwMDAwCiszMiAxIDE2MjAwMDAKKzMyIDEgMTY0MDAwMAorMzIgMSAxNjYwMDAwCiszMiAxIDE2ODAwMDAKKzMyIDEgMTcwMDAwMAorMzIgMSAxNzIwMDAwCiszMiAxIDE3NDAwMDAKKzMyIDEgMTc2MDAwMAorMzIgMSAxNzgwMDAwCiszMiAxIDE4MDAwMDAKKzMyIDEgMTgyMDAwMAorMzIgMSAxODQwMDAwCiszMiAxIDE4NjAwMDAKKzMyIDEgMTg4MDAwMAorMzIgMSAxOTAwMDAwCiszMiAxIDE5MjAwMDAKKzMyIDEgMTk0MDAwMAorMzIgMSAxOTYwMDAwCiszMiAxIDE5ODAwMDAKKzMyIDEgMjAwMDAwMAorMzIgMSAyMDIwMDAwCiszMiAxIDIwNDAwMDAKKzMyIDEgMjA2MDAwMAorMzIgMSAyMDgwMDAwCiszMiAxIDIxMDAwMDAKKzMyIDEgMjEyMDAwMAorMzIgMSAyMTQwMDAwCiszMiAxIDIxNjAwMDAKKzMyIDEgMjE4MDAwMAorMzIgMSAyMjAwMDAwCiszMiAxIDIyMjAwMDAKKzMyIDEgMjI0MDAwMAorMzIgMSAyMjYwMDAwCiszMiAxIDIyODAwMDAKKzMyIDEgMjMwMDAwMAorMzIgMSAyMzIwMDAwCiszMiAxIDIzNDAwMDAKKzMyIDEgMjM2MDAwMAorMzIgMSAyMzgwMDAwCiszMiAxIDI0MDAwMDAKKzMyIDEgMjQyMDAwMAorMzIgMSAyNDQwMDAwCiszMiAxIDI0NjAwMDAKKzMyIDEgMjQ4MDAwMAorMzIgMSAyNTAwMDAwCiszMiAxIDI1MjAwMDAKKzMyIDEgMjU0MDAwMAorMzIgMSAyNTYwMDAwCiszMiAxIDI1ODAwMDAKKzMyIDEgMjYwMDAwMAorMzIgMSAyNjIwMDAwCiszMiAxIDI2NDAwMDAKKzMyIDEgMjY2MDAwMAorMzIgMSAyNjgwMDAwCiszMiAxIDI3MDAwMDAKKzMyIDEgMjcyMDAwMAorMzIgMSAyNzQwMDAwCiszMiAxIDI3NjAwMDAKKzMyIDEgMjc4MDAwMAorMzIgMSAyODAwMDAwCiszMiAxIDI4MjAwMDAKKzMyIDEgMjg0MDAwMAorMzIgMSAyODYwMDAwCiszMiAxIDI4ODAwMDAKKzMyIDEgMjkwMDAwMAorMzIgMSAyOTIwMDAwCiszMiAxIDI5NDAwMDAKKzMyIDEgMjk2MDAwMAorMzIgMSAyOTgwMDAwCiszMiAxIDMwMDAwMDAKKzMyIDEgMzAyMDAwMAorMzIgMSAzMDQwMDAwCiszMiAxIDMwNjAwMDAKKzMyIDEgMzA4MDAwMAorMzIgMSAzMTAwMDAwCiszMiAxIDMxMjAwMDAKKzMyIDEgMzE0MDAwMAorMzIgMSAzMTYwMDAwCiszMiAxIDMxODAwMDAKKzMyIDEgMzIwMDAwMAorMzIgMSAzMjIwMDAwCiszMiAxIDMyNDAwMDAKKzMyIDEgMzI2MDAwMAorMzIgMSAzMjgwMDAwCiszMiAxIDMzMDAwMDAKKzMyIDEgMzMyMDAwMAorMzIgMSAzMzQwMDAwCiszMiAxIDMzNjAwMDAKKzMyIDEgMzM4MDAwMAorMzIgMSAzNDAwMDAwCiszMiAxIDM0MjAwMDAKKzMyIDEgMzQ0MDAwMAorMzIgMSAzNDYwMDAwCiszMiAxIDM0ODAwMDAKKzMyIDEgMzUwMDAwMAorMzIgMSAzNTIwMDAwCiszMiAxIDM1NDAwMDAKKzMyIDEgMzU2MDAwMAorMzIgMSAzNTgwMDAwCiszMiAxIDM2MDAwMDAKKzMyIDEgMzYyMDAwMAorMzIgMSAzNjQwMDAwCiszMiAxIDM2NjAwMDAKKzMyIDEgMzY4MDAwMAorMzIgMSAzNzAwMDAwCiszMiAxIDM3MjAwMDAKKzMyIDEgMzc0MDAwMAorMzIgMSAzNzYwMDAwCiszMiAxIDM3ODAwMDAKKzMyIDEgMzgwMDAwMAorMzIgMSAzODIwMDAwCiszMiAxIDM4NDAwMDAKKzMyIDEgMzg2MDAwMAorMzIgMSAzODgwMDAwCiszMiAxIDM5MDAwMDAKKzMyIDEgMzkyMDAwMAorMzIgMSAzOTQwMDAwCiszMiAxIDM5NjAwMDAKKzMyIDEgMzk4MDAwMAorMzIgMSA0MDAwMDAwCiszMiAxIDQwMjAwMDAKKzMyIDEgNDA0MDAwMAorMzIgMSA0MDYwMDAwCiszMiAxIDQwODAwMDAKKzMyIDEgNDEwMDAwMAorMzIgMSA0MTIwMDAwCiszMiAxIDQxNDAwMDAKKzMyIDEgNDE2MDAwMAorMzIgMSA0MTgwMDAwCiszMiAxIDQyMDAwMDAKKzMyIDEgNDIyMDAwMAorMzIgMSA0MjQwMDAwCiszMiAxIDQyNjAwMDAKKzMyIDEgNDI4MDAwMAorMzIgMSA0MzAwMDAwCiszMiAxIDQzMjAwMDAKKzMyIDEgNDM0MDAwMAorMzIgMSA0MzYwMDAwCiszMiAxIDQzODAwMDAKKzMyIDEgNDQwMDAwMAorMzIgMSA0NDIwMDAwCiszMiAxIDQ0NDAwMDAKKzMyIDEgNDQ2MDAwMAorMzIgMSA0NDgwMDAwCiszMiAxIDQ1MDAwMDAKKzMyIDEgNDUyMDAwMAorMzIgMSA0NTQwMDAwCiszMiAxIDQ1NjAwMDAKKzMyIDEgNDU4MDAwMAorMzIgMSA0NjAwMDAwCiszMiAxIDQ2MjAwMDAKKzMyIDEgNDY0MDAwMAorMzIgMSA0NjYwMDAwCiszMiAxIDQ2ODAwMDAKKzMyIDEgNDcwMDAwMAorMzIgMSA0NzIwMDAwCiszMiAxIDQ3NDAwMDAKKzMyIDEgNDc2MDAwMAorMzIgMSA0NzgwMDAwCiszMiAxIDQ4MDAwMDAKKzMyIDEgNDgyMDAwMAorMzIgMSA0ODQwMDAwCiszMiAxIDQ4NjAwMDAKKzMyIDEgNDg4MDAwMAorMzIgMSA0OTAwMDAwCiszMiAxIDQ5MjAwMDAKKzMyIDEgNDk0MDAwMAorMzIgMSA0OTYwMDAwCiszMiAxIDQ5ODAwMDAKKzMyIDEgNTAwMDAwMAorMzIgMSA1MDIwMDAwCiszMiAxIDUwNDAwMDAKKzMyIDEgNTA2MDAwMAorMzIgMSA1MDgwMDAwCiszMiAxIDUxMDAwMDAKKzMyIDEgNTEyMDAwMAorMzIgMSA1MTQwMDAwCiszMiAxIDUxNjAwMDAKKzMyIDEgNTE4MDAwMAorMzIgMSA1MjAwMDAwCiszMiAxIDUyMjAwMDAKKzMyIDEgNTI0MDAwMAorMzIgMSA1MjYwMDAwCiszMiAxIDUyODAwMDAKKzMyIDEgNTMwMDAwMAorMzIgMSA1MzIwMDAwCiszMiAxIDUzNDAwMDAKKzMyIDEgNTM2MDAwMAorMzIgMSA1MzgwMDAwCiszMiAxIDU0MDAwMDAKKzMyIDEgNTQyMDAwMAorMzIgMSA1NDQwMDAwCiszMiAxIDU0NjAwMDAKKzMyIDEgNTQ4MDAwMAorMzIgMSA1NTAwMDAwCiszMiAxIDU1MjAwMDAKKzMyIDEgNTU0MDAwMAorMzIgMSA1NTYwMDAwCiszMiAxIDU1ODAwMDAKKzMyIDEgNTYwMDAwMAorMzIgMSA1NjIwMDAwCiszMiAxIDU2NDAwMDAKKzMyIDEgNTY2MDAwMAorMzIgMSA1NjgwMDAwCiszMiAxIDU3MDAwMDAKKzMyIDEgNTcyMDAwMAorMzIgMSA1NzQwMDAwCiszMiAxIDU3NjAwMDAKKzMyIDEgNTc4MDAwMAorMzIgMSA1ODAwMDAwCiszMiAxIDU4MjAwMDAKKzMyIDEgNTg0MDAwMAorMzIgMSA1ODYwMDAwCiszMiAxIDU4ODAwMDAKKzMyIDEgNTkwMDAwMAorMzIgMSA1OTIwMDAwCiszMiAxIDU5NDAwMDAKKzMyIDEgNTk2MDAwMAorMzIgMSA1OTgwMDAwCiszMiAxIDYwMDAwMDAKKzMyIDEgNjAyMDAwMAorMzIgMSA2MDQwMDAwCiszMiAxIDYwNjAwMDAKKzMyIDEgNjA4MDAwMAorMzIgMSA2MTAwMDAwCiszMiAxIDYxMjAwMDAKKzMyIDEgNjE0MDAwMAorMzIgMSA2MTYwMDAwCiszMiAxIDYxODAwMDAKKzMyIDEgNjIwMDAwMAorMzIgMSA2MjIwMDAwCiszMiAxIDYyNDAwMDAKKzMyIDEgNjI2MDAwMAorMzIgMSA2MjgwMDAwCiszMiAxIDYzMDAwMDAKKzMyIDEgNjMyMDAwMAorMzIgMSA2MzQwMDAwCiszMiAxIDYzNjAwMDAKKzMyIDEgNjM4MDAwMAorMzIgMSA2NDAwMDAwCiszMiAxIDY0MjAwMDAKKzMyIDEgNjQ0MDAwMAorMzIgMSA2NDYwMDAwCiszMiAxIDY0ODAwMDAKKzMyIDEgNjUwMDAwMAorMzIgMSA2NTIwMDAwCiszMiAxIDY1NDAwMDAKKzMyIDEgNjU2MDAwMAorMzIgMSA2NTgwMDAwCiszMiAxIDY2MDAwMDAKKzMyIDEgNjYyMDAwMAorMzIgMSA2NjQwMDAwCiszMiAxIDY2NjAwMDAKKzMyIDEgNjY4MDAwMAorMzIgMSA2NzAwMDAwCiszMiAxIDY3MjAwMDAKKzMyIDEgNjc0MDAwMAorMzIgMSA2NzYwMDAwCiszMiAxIDY3ODAwMDAKKzMyIDEgNjgwMDAwMAorMzIgMSA2ODIwMDAwCiszMiAxIDY4NDAwMDAKKzMyIDEgNjg2MDAwMAorMzIgMSA2ODgwMDAwCiszMiAxIDY5MDAwMDAKKzMyIDEgNjkyMDAwMAorMzIgMSA2OTQwMDAwCiszMiAxIDY5NjAwMDAKKzMyIDEgNjk4MDAwMAorMzIgMSA3MDAwMDAwCiszMiAxIDcwMjAwMDAKKzMyIDEgNzA0MDAwMAorMzIgMSA3MDYwMDAwCiszMiAxIDcwODAwMDAKKzMyIDEgNzEwMDAwMAorMzIgMSA3MTIwMDAwCiszMiAxIDcxNDAwMDAKKzMyIDEgNzE2MDAwMAorMzIgMSA3MTgwMDAwCiszMiAxIDcyMDAwMDAKKzMyIDEgNzIyMDAwMAorMzIgMSA3MjQwMDAwCiszMiAxIDcyNjAwMDAKKzMyIDEgNzI4MDAwMAorMzIgMSA3MzAwMDAwCiszMiAxIDczMjAwMDAKKzMyIDEgNzM0MDAwMAorMzIgMSA3MzYwMDAwCiszMiAxIDczODAwMDAKKzMyIDEgNzQwMDAwMAorMzIgMSA3NDIwMDAwCiszMiAxIDc0NDAwMDAKKzMyIDEgNzQ2MDAwMAorMzIgMSA3NDgwMDAwCiszMiAxIDc1MDAwMDAKKzMyIDEgNzUyMDAwMAorMzIgMSA3NTQwMDAwCiszMiAxIDc1NjAwMDAKKzMyIDEgNzU4MDAwMAorMzIgMSA3NjAwMDAwCiszMiAxIDc2MjAwMDAKKzMyIDEgNzY0MDAwMAorMzIgMSA3NjYwMDAwCiszMiAxIDc2ODAwMDAKKzMyIDEgNzcwMDAwMAorMzIgMSA3NzIwMDAwCiszMiAxIDc3NDAwMDAKKzMyIDEgNzc2MDAwMAorMzIgMSA3NzgwMDAwCiszMiAxIDc4MDAwMDAKKzMyIDEgNzgyMDAwMAorMzIgMSA3ODQwMDAwCiszMiAxIDc4NjAwMDAKKzMyIDEgNzg4MDAwMAorMzIgMSA3OTAwMDAwCiszMiAxIDc5MjAwMDAKKzMyIDEgNzk0MDAwMAorMzIgMSA3OTYwMDAwCiszMiAxIDc5ODAwMDAKKzMyIDEgODAwMDAwMAorMzIgMSA4MDIwMDAwCiszMiAxIDgwNDAwMDAKKzMyIDEgODA2MDAwMAorMzIgMSA4MDgwMDAwCiszMiAxIDgxMDAwMDAKKzMyIDEgODEyMDAwMAorMzIgMSA4MTQwMDAwCiszMiAxIDgxNjAwMDAKKzMyIDEgODE4MDAwMAorMzIgMSA4MjAwMDAwCiszMiAxIDgyMjAwMDAKKzMyIDEgODI0MDAwMAorMzIgMSA4MjYwMDAwCiszMiAxIDgyODAwMDAKKzMyIDEgODMwMDAwMAorMzIgMSA4MzIwMDAwCiszMiAxIDgzNDAwMDAKKzMyIDEgODM2MDAwMAorMzIgMSA4MzgwMDAwCiszMiAxIDg0MDAwMDAKKzMyIDEgODQyMDAwMAorMzIgMSA4NDQwMDAwCiszMiAxIDg0NjAwMDAKKzMyIDEgODQ4MDAwMAorMzIgMSA4NTAwMDAwCiszMiAxIDg1MjAwMDAKKzMyIDEgODU0MDAwMAorMzIgMSA4NTYwMDAwCiszMiAxIDg1ODAwMDAKKzMyIDEgODYwMDAwMAorMzIgMSA4NjIwMDAwCiszMiAxIDg2NDAwMDAKKzMyIDEgODY2MDAwMAorMzIgMSA4NjgwMDAwCiszMiAxIDg3MDAwMDAKKzMyIDEgODcyMDAwMAorMzIgMSA4NzQwMDAwCiszMiAxIDg3NjAwMDAKKzMyIDEgODc4MDAwMAorMzIgMSA4ODAwMDAwCiszMiAxIDg4MjAwMDAKKzMyIDEgODg0MDAwMAorMzIgMSA4ODYwMDAwCiszMiAxIDg4ODAwMDAKKzMyIDEgODkwMDAwMAorMzIgMSA4OTIwMDAwCiszMiAxIDg5NDAwMDAKKzMyIDEgODk2MDAwMAorMzIgMSA4OTgwMDAwCiszMiAxIDkwMDAwMDAKKzMyIDEgOTAyMDAwMAorMzIgMSA5MDQwMDAwCiszMiAxIDkwNjAwMDAKKzMyIDEgOTA4MDAwMAorMzIgMSA5MTAwMDAwCiszMiAxIDkxMjAwMDAKKzMyIDEgOTE0MDAwMAorMzIgMSA5MTYwMDAwCiszMiAxIDkxODAwMDAKKzMyIDEgOTIwMDAwMAorMzIgMSA5MjIwMDAwCiszMiAxIDkyNDAwMDAKKzMyIDEgOTI2MDAwMAorMzIgMSA5MjgwMDAwCiszMiAxIDkzMDAwMDAKKzMyIDEgOTMyMDAwMAorMzIgMSA5MzQwMDAwCiszMiAxIDkzNjAwMDAKKzMyIDEgOTM4MDAwMAorMzIgMSA5NDAwMDAwCiszMiAxIDk0MjAwMDAKKzMyIDEgOTQ0MDAwMAorMzIgMSA5NDYwMDAwCiszMiAxIDk0ODAwMDAKKzMyIDEgOTUwMDAwMAorMzIgMSA5NTIwMDAwCiszMiAxIDk1NDAwMDAKKzMyIDEgOTU2MDAwMAorMzIgMSA5NTgwMDAwCiszMiAxIDk2MDAwMDAKKzMyIDEgOTYyMDAwMAorMzIgMSA5NjQwMDAwCiszMiAxIDk2NjAwMDAKKzMyIDEgOTY4MDAwMAorMzIgMSA5NzAwMDAwCiszMiAxIDk3MjAwMDAKKzMyIDEgOTc0MDAwMAorMzIgMSA5NzYwMDAwCiszMiAxIDk3ODAwMDAKKzMyIDEgOTgwMDAwMAorMzIgMSA5ODIwMDAwCiszMiAxIDk4NDAwMDAKKzMyIDEgOTg2MDAwMAorMzIgMSA5ODgwMDAwCiszMiAxIDk5MDAwMDAKKzMyIDEgOTkyMDAwMAorMzIgMSA5OTQwMDAwCiszMiAxIDk5NjAwMDAKKzMyIDEgOTk4MDAwMAorMzIgMSAxMDAwMDAwMAorMzIgMSAxMDAyMDAwMAorMzIgMSAxMDA0MDAwMAorMzIgMSAxMDA2MDAwMAorMzIgMSAxMDA4MDAwMAorMzIgMSAxMDEwMDAwMAorMzIgMSAxMDEyMDAwMAorMzIgMSAxMDE0MDAwMAorMzIgMSAxMDE2MDAwMAorMzIgMSAxMDE4MDAwMAorMzIgMSAxMDIwMDAwMAorMzIgMSAxMDIyMDAwMAorMzIgMSAxMDI0MDAwMAorMzIgMSAxMDI2MDAwMAorMzIgMSAxMDI4MDAwMAorMzIgMSAxMDMwMDAwMAorMzIgMSAxMDMyMDAwMAorMzIgMSAxMDM0MDAwMAorMzIgMSAxMDM2MDAwMAorMzIgMSAxMDM4MDAwMAorMzIgMSAxMDQwMDAwMAorMzIgMSAxMDQyMDAwMAorMzIgMSAxMDQ0MDAwMAorMzIgMSAxMDQ2MDAwMAorMzIgMSAxMDQ4MDAwMAorMzIgMSAxMDUwMDAwMAorMzIgMSAxMDUyMDAwMAorMzIgMSAxMDU0MDAwMAorMzIgMSAxMDU2MDAwMAorMzIgMSAxMDU4MDAwMAorMzIgMSAxMDYwMDAwMAorMzIgMSAxMDYyMDAwMAorMzIgMSAxMDY0MDAwMAorMzIgMSAxMDY2MDAwMAorMzIgMSAxMDY4MDAwMAorMzIgMSAxMDcwMDAwMAorMzIgMSAxMDcyMDAwMAorMzIgMSAxMDc0MDAwMAorMzIgMSAxMDc2MDAwMAorMzIgMSAxMDc4MDAwMAorMzIgMSAxMDgwMDAwMAorMzIgMSAxMDgyMDAwMAorMzIgMSAxMDg0MDAwMAorMzIgMSAxMDg2MDAwMAorMzIgMSAxMDg4MDAwMAorMzIgMSAxMDkwMDAwMAorMzIgMSAxMDkyMDAwMAorMzIgMSAxMDk0MDAwMAorMzIgMSAxMDk2MDAwMAorMzIgMSAxMDk4MDAwMAorMzIgMSAxMTAwMDAwMAorMzIgMSAxMTAyMDAwMAorMzIgMSAxMTA0MDAwMAorMzIgMSAxMTA2MDAwMAorMzIgMSAxMTA4MDAwMAorMzIgMSAxMTEwMDAwMAorMzIgMSAxMTEyMDAwMAorMzIgMSAxMTE0MDAwMAorMzIgMSAxMTE2MDAwMAorMzIgMSAxMTE4MDAwMAorMzIgMSAxMTIwMDAwMAorMzIgMSAxMTIyMDAwMAorMzIgMSAxMTI0MDAwMAorMzIgMSAxMTI2MDAwMAorMzIgMSAxMTI4MDAwMAorMzIgMSAxMTMwMDAwMAorMzIgMSAxMTMyMDAwMAorMzIgMSAxMTM0MDAwMAorMzIgMSAxMTM2MDAwMAorMzIgMSAxMTM4MDAwMAorMzIgMSAxMTQwMDAwMAorMzIgMSAxMTQyMDAwMAorMzIgMSAxMTQ0MDAwMAorMzIgMSAxMTQ2MDAwMAorMzIgMSAxMTQ4MDAwMAorMzIgMSAxMTUwMDAwMAorMzIgMSAxMTUyMDAwMAorMzIgMSAxMTU0MDAwMAorMzIgMSAxMTU2MDAwMAorMzIgMSAxMTU4MDAwMAorMzIgMSAxMTYwMDAwMAorMzIgMSAxMTYyMDAwMAorMzIgMSAxMTY0MDAwMAorMzIgMSAxMTY2MDAwMAorMzIgMSAxMTY4MDAwMAorMzIgMSAxMTcwMDAwMAorMzIgMSAxMTcyMDAwMAorMzIgMSAxMTc0MDAwMAorMzIgMSAxMTc2MDAwMAorMzIgMSAxMTc4MDAwMAorMzIgMSAxMTgwMDAwMAorMzIgMSAxMTgyMDAwMAorMzIgMSAxMTg0MDAwMAorMzIgMSAxMTg2MDAwMAorMzIgMSAxMTg4MDAwMAorMzIgMSAxMTkwMDAwMAorMzIgMSAxMTkyMDAwMAorMzIgMSAxMTk0MDAwMAorMzIgMSAxMTk2MDAwMAorMzIgMSAxMTk4MDAwMAorMzIgMSAxMjAwMDAwMAorMzIgMSAxMjAyMDAwMAorMzIgMSAxMjA0MDAwMAorMzIgMSAxMjA2MDAwMAorMzIgMSAxMjA4MDAwMAorMzIgMSAxMjEwMDAwMAorMzIgMSAxMjEyMDAwMAorMzIgMSAxMjE0MDAwMAorMzIgMSAxMjE2MDAwMAorMzIgMSAxMjE4MDAwMAorMzIgMSAxMjIwMDAwMAorMzIgMSAxMjIyMDAwMAorMzIgMSAxMjI0MDAwMAorMzIgMSAxMjI2MDAwMAorMzIgMSAxMjI4MDAwMAorMzIgMSAxMjMwMDAwMAorMzIgMSAxMjMyMDAwMAorMzIgMSAxMjM0MDAwMAorMzIgMSAxMjM2MDAwMAorMzIgMSAxMjM4MDAwMAorMzIgMSAxMjQwMDAwMAorMzIgMSAxMjQyMDAwMAorMzIgMSAxMjQ0MDAwMAorMzIgMSAxMjQ2MDAwMAorMzIgMSAxMjQ4MDAwMAorMzIgMSAxMjUwMDAwMAorMzIgMSAxMjUyMDAwMAorMzIgMSAxMjU0MDAwMAorMzIgMSAxMjU2MDAwMAorMzIgMSAxMjU4MDAwMAorMzIgMSAxMjYwMDAwMAorMzIgMSAxMjYyMDAwMAorMzIgMSAxMjY0MDAwMAorMzIgMSAxMjY2MDAwMAorMzIgMSAxMjY4MDAwMAorMzIgMSAxMjcwMDAwMAorMzIgMSAxMjcyMDAwMAorMzIgMSAxMjc0MDAwMAorMzIgMSAxMjc2MDAwMAorMzIgMSAxMjc4MDAwMAorMzIgMSAxMjgwMDAwMAorMzIgMSAxMjgyMDAwMAorMzIgMSAxMjg0MDAwMAorMzIgMSAxMjg2MDAwMAorMzIgMSAxMjg4MDAwMAorMzIgMSAxMjkwMDAwMAorMzIgMSAxMjkyMDAwMAorMzIgMSAxMjk0MDAwMAorMzIgMSAxMjk2MDAwMAorMzIgMSAxMjk4MDAwMAorMzIgMSAxMzAwMDAwMAorMzIgMSAxMzAyMDAwMAorMzIgMSAxMzA0MDAwMAorMzIgMSAxMzA2MDAwMAorMzIgMSAxMzA4MDAwMAorMzIgMSAxMzEwMDAwMAorMzIgMSAxMzEyMDAwMAorMzIgMSAxMzE0MDAwMAorMzIgMSAxMzE2MDAwMAorMzIgMSAxMzE4MDAwMAorMzIgMSAxMzIwMDAwMAorMzIgMSAxMzIyMDAwMAorMzIgMSAxMzI0MDAwMAorMzIgMSAxMzI2MDAwMAorMzIgMSAxMzI4MDAwMAorMzIgMSAxMzMwMDAwMAorMzIgMSAxMzMyMDAwMAorMzIgMSAxMzM0MDAwMAorMzIgMSAxMzM2MDAwMAorMzIgMSAxMzM4MDAwMAorMzIgMSAxMzQwMDAwMAorMzIgMSAxMzQyMDAwMAorMzIgMSAxMzQ0MDAwMAorMzIgMSAxMzQ2MDAwMAorMzIgMSAxMzQ4MDAwMAorMzIgMSAxMzUwMDAwMAorMzIgMSAxMzUyMDAwMAorMzIgMSAxMzU0MDAwMAorMzIgMSAxMzU2MDAwMAorMzIgMSAxMzU4MDAwMAorMzIgMSAxMzYwMDAwMAorMzIgMSAxMzYyMDAwMAorMzIgMSAxMzY0MDAwMAorMzIgMSAxMzY2MDAwMAorMzIgMSAxMzY4MDAwMAorMzIgMSAxMzcwMDAwMAorMzIgMSAxMzcyMDAwMAorMzIgMSAxMzc0MDAwMAorMzIgMSAxMzc2MDAwMAorMzIgMSAxMzc4MDAwMAorMzIgMSAxMzgwMDAwMAorMzIgMSAxMzgyMDAwMAorMzIgMSAxMzg0MDAwMAorMzIgMSAxMzg2MDAwMAorMzIgMSAxMzg4MDAwMAorMzIgMSAxMzkwMDAwMAorMzIgMSAxMzkyMDAwMAorMzIgMSAxMzk0MDAwMAorMzIgMSAxMzk2MDAwMAorMzIgMSAxMzk4MDAwMAorMzIgMSAxNDAwMDAwMAorMzIgMSAxNDAyMDAwMAorMzIgMSAxNDA0MDAwMAorMzIgMSAxNDA2MDAwMAorMzIgMSAxNDA4MDAwMAorMzIgMSAxNDEwMDAwMAorMzIgMSAxNDEyMDAwMAorMzIgMSAxNDE0MDAwMAorMzIgMSAxNDE2MDAwMAorMzIgMSAxNDE4MDAwMAorMzIgMSAxNDIwMDAwMAorMzIgMSAxNDIyMDAwMAorMzIgMSAxNDI0MDAwMAorMzIgMSAxNDI2MDAwMAorMzIgMSAxNDI4MDAwMAorMzIgMSAxNDMwMDAwMAorMzIgMSAxNDMyMDAwMAorMzIgMSAxNDM0MDAwMAorMzIgMSAxNDM2MDAwMAorMzIgMSAxNDM4MDAwMAorMzIgMSAxNDQwMDAwMAorMzIgMSAxNDQyMDAwMAorMzIgMSAxNDQ0MDAwMAorMzIgMSAxNDQ2MDAwMAorMzIgMSAxNDQ4MDAwMAorMzIgMSAxNDUwMDAwMAorMzIgMSAxNDUyMDAwMAorMzIgMSAxNDU0MDAwMAorMzIgMSAxNDU2MDAwMAorMzIgMSAxNDU4MDAwMAorMzIgMSAxNDYwMDAwMAorMzIgMSAxNDYyMDAwMAorMzIgMSAxNDY0MDAwMAorMzIgMSAxNDY2MDAwMAorMzIgMSAxNDY4MDAwMAorMzIgMSAxNDcwMDAwMAorMzIgMSAxNDcyMDAwMAorMzIgMSAxNDc0MDAwMAorMzIgMSAxNDc2MDAwMAorMzIgMSAxNDc4MDAwMAorMzIgMSAxNDgwMDAwMAorMzIgMSAxNDgyMDAwMAorMzIgMSAxNDg0MDAwMAorMzIgMSAxNDg2MDAwMAorMzIgMSAxNDg4MDAwMAorMzIgMSAxNDkwMDAwMAorMzIgMSAxNDkyMDAwMAorMzIgMSAxNDk0MDAwMAorMzIgMSAxNDk2MDAwMAorMzIgMSAxNDk4MDAwMAorMzIgMSAxNTAwMDAwMAorMzIgMSAxNTAyMDAwMAorMzIgMSAxNTA0MDAwMAorMzIgMSAxNTA2MDAwMAorMzIgMSAxNTA4MDAwMAorMzIgMSAxNTEwMDAwMAorMzIgMSAxNTEyMDAwMAorMzIgMSAxNTE0MDAwMAorMzIgMSAxNTE2MDAwMAorMzIgMSAxNTE4MDAwMAorMzIgMSAxNTIwMDAwMAorMzIgMSAxNTIyMDAwMAorMzIgMSAxNTI0MDAwMAorMzIgMSAxNTI2MDAwMAorMzIgMSAxNTI4MDAwMAorMzIgMSAxNTMwMDAwMAorMzIgMSAxNTMyMDAwMAorMzIgMSAxNTM0MDAwMAorMzIgMSAxNTM2MDAwMAorMzIgMSAxNTM4MDAwMAorMzIgMSAxNTQwMDAwMAorMzIgMSAxNTQyMDAwMAorMzIgMSAxNTQ0MDAwMAorMzIgMSAxNTQ2MDAwMAorMzIgMSAxNTQ4MDAwMAorMzIgMSAxNTUwMDAwMAorMzIgMSAxNTUyMDAwMAorMzIgMSAxNTU0MDAwMAorMzIgMSAxNTU2MDAwMAorMzIgMSAxNTU4MDAwMAorMzIgMSAxNTYwMDAwMAorMzIgMSAxNTYyMDAwMAorMzIgMSAxNTY0MDAwMAorMzIgMSAxNTY2MDAwMAorMzIgMSAxNTY4MDAwMAorMzIgMSAxNTcwMDAwMAorMzIgMSAxNTcyMDAwMAorMzIgMSAxNTc0MDAwMAorMzIgMSAxNTc2MDAwMAorMzIgMSAxNTc4MDAwMAorMzIgMSAxNTgwMDAwMAorMzIgMSAxNTgyMDAwMAorMzIgMSAxNTg0MDAwMAorMzIgMSAxNTg2MDAwMAorMzIgMSAxNTg4MDAwMAorMzIgMSAxNTkwMDAwMAorMzIgMSAxNTkyMDAwMAorMzIgMSAxNTk0MDAwMAorMzIgMSAxNTk2MDAwMAorMzIgMSAxNTk4MDAwMAorMzIgMSAxNjAwMDAwMAorMzIgMSAxNjAyMDAwMAorMzIgMSAxNjA0MDAwMAorMzIgMSAxNjA2MDAwMAorMzIgMSAxNjA4MDAwMAorMzIgMSAxNjEwMDAwMAorMzIgMSAxNjEyMDAwMAorMzIgMSAxNjE0MDAwMAorMzIgMSAxNjE2MDAwMAorMzIgMSAxNjE4MDAwMAorMzIgMSAxNjIwMDAwMAorMzIgMSAxNjIyMDAwMAorMzIgMSAxNjI0MDAwMAorMzIgMSAxNjI2MDAwMAorMzIgMSAxNjI4MDAwMAorMzIgMSAxNjMwMDAwMAorMzIgMSAxNjMyMDAwMAorMzIgMSAxNjM0MDAwMAorMzIgMSAxNjM2MDAwMAorMzIgMSAxNjM4MDAwMAorMzIgMSAxNjQwMDAwMAorMzIgMSAxNjQyMDAwMAorMzIgMSAxNjQ0MDAwMAorMzIgMSAxNjQ2MDAwMAorMzIgMSAxNjQ4MDAwMAorMzIgMSAxNjUwMDAwMAorMzIgMSAxNjUyMDAwMAorMzIgMSAxNjU0MDAwMAorMzIgMSAxNjU2MDAwMAorMzIgMSAxNjU4MDAwMAorMzIgMSAxNjYwMDAwMAorMzIgMSAxNjYyMDAwMAorMzIgMSAxNjY0MDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9zaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6X211bHRpX2ZyYW1lLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL3NpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHpfbXVsdGlfZnJhbWUuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTc2ZWFmNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvc2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoel9tdWx0aV9mcmFtZS5pbmZvCkBAIC0wLDAgKzEsODA3IEBACiszMiAxIDAKKzMyIDEgMjAwMDAKKzY0IDEgNDAwMDAKKzY0IDEgODAwMDAKKzY0IDEgMTIwMDAwCis5NiAxIDE2MDAwMAorOTYgMSAyMjAwMDAKKzk2IDEgMjgwMDAwCis5NiAxIDM0MDAwMAorMTI4IDEgNDAwMDAwCisxMjggMSA0ODAwMDAKKzEyOCAxIDU2MDAwMAorMTI4IDEgNjQwMDAwCisxMjggMSA3MjAwMDAKKzMyIDEgODAwMDAwCiszMiAxIDgyMDAwMAorMzIgMSA4NDAwMDAKKzMyIDEgODYwMDAwCiszMiAxIDg4MDAwMAorMzIgMSA5MDAwMDAKKzMyIDEgOTIwMDAwCiszMiAxIDk0MDAwMAorMzIgMSA5NjAwMDAKKzMyIDEgOTgwMDAwCiszMiAxIDEwMDAwMDAKKzMyIDEgMTAyMDAwMAorMzIgMSAxMDQwMDAwCiszMiAxIDEwNjAwMDAKKzMyIDEgMTA4MDAwMAorMzIgMSAxMTAwMDAwCiszMiAxIDExMjAwMDAKKzMyIDEgMTE0MDAwMAorMzIgMSAxMTYwMDAwCiszMiAxIDExODAwMDAKKzMyIDEgMTIwMDAwMAorMzIgMSAxMjIwMDAwCiszMiAxIDEyNDAwMDAKKzMyIDEgMTI2MDAwMAorMzIgMSAxMjgwMDAwCiszMiAxIDEzMDAwMDAKKzMyIDEgMTMyMDAwMAorMzIgMSAxMzQwMDAwCiszMiAxIDEzNjAwMDAKKzMyIDEgMTM4MDAwMAorMzIgMSAxNDAwMDAwCiszMiAxIDE0MjAwMDAKKzMyIDEgMTQ0MDAwMAorMzIgMSAxNDYwMDAwCiszMiAxIDE0ODAwMDAKKzMyIDEgMTUwMDAwMAorMzIgMSAxNTIwMDAwCiszMiAxIDE1NDAwMDAKKzMyIDEgMTU2MDAwMAorMzIgMSAxNTgwMDAwCiszMiAxIDE2MDAwMDAKKzMyIDEgMTYyMDAwMAorMzIgMSAxNjQwMDAwCiszMiAxIDE2NjAwMDAKKzMyIDEgMTY4MDAwMAorMzIgMSAxNzAwMDAwCiszMiAxIDE3MjAwMDAKKzMyIDEgMTc0MDAwMAorMzIgMSAxNzYwMDAwCiszMiAxIDE3ODAwMDAKKzMyIDEgMTgwMDAwMAorMzIgMSAxODIwMDAwCiszMiAxIDE4NDAwMDAKKzMyIDEgMTg2MDAwMAorMzIgMSAxODgwMDAwCiszMiAxIDE5MDAwMDAKKzMyIDEgMTkyMDAwMAorMzIgMSAxOTQwMDAwCiszMiAxIDE5NjAwMDAKKzMyIDEgMTk4MDAwMAorMzIgMSAyMDAwMDAwCiszMiAxIDIwMjAwMDAKKzMyIDEgMjA0MDAwMAorMzIgMSAyMDYwMDAwCiszMiAxIDIwODAwMDAKKzMyIDEgMjEwMDAwMAorMzIgMSAyMTIwMDAwCiszMiAxIDIxNDAwMDAKKzMyIDEgMjE2MDAwMAorMzIgMSAyMTgwMDAwCiszMiAxIDIyMDAwMDAKKzMyIDEgMjIyMDAwMAorMzIgMSAyMjQwMDAwCiszMiAxIDIyNjAwMDAKKzMyIDEgMjI4MDAwMAorMzIgMSAyMzAwMDAwCiszMiAxIDIzMjAwMDAKKzMyIDEgMjM0MDAwMAorMzIgMSAyMzYwMDAwCiszMiAxIDIzODAwMDAKKzMyIDEgMjQwMDAwMAorMzIgMSAyNDIwMDAwCiszMiAxIDI0NDAwMDAKKzMyIDEgMjQ2MDAwMAorMzIgMSAyNDgwMDAwCiszMiAxIDI1MDAwMDAKKzMyIDEgMjUyMDAwMAorMzIgMSAyNTQwMDAwCiszMiAxIDI1NjAwMDAKKzMyIDEgMjU4MDAwMAorMzIgMSAyNjAwMDAwCiszMiAxIDI2MjAwMDAKKzMyIDEgMjY0MDAwMAorMzIgMSAyNjYwMDAwCiszMiAxIDI2ODAwMDAKKzMyIDEgMjcwMDAwMAorMzIgMSAyNzIwMDAwCiszMiAxIDI3NDAwMDAKKzMyIDEgMjc2MDAwMAorMzIgMSAyNzgwMDAwCiszMiAxIDI4MDAwMDAKKzMyIDEgMjgyMDAwMAorMzIgMSAyODQwMDAwCiszMiAxIDI4NjAwMDAKKzMyIDEgMjg4MDAwMAorMzIgMSAyOTAwMDAwCiszMiAxIDI5MjAwMDAKKzMyIDEgMjk0MDAwMAorMzIgMSAyOTYwMDAwCiszMiAxIDI5ODAwMDAKKzMyIDEgMzAwMDAwMAorMzIgMSAzMDIwMDAwCiszMiAxIDMwNDAwMDAKKzMyIDEgMzA2MDAwMAorMzIgMSAzMDgwMDAwCiszMiAxIDMxMDAwMDAKKzMyIDEgMzEyMDAwMAorMzIgMSAzMTQwMDAwCiszMiAxIDMxNjAwMDAKKzMyIDEgMzE4MDAwMAorMzIgMSAzMjAwMDAwCiszMiAxIDMyMjAwMDAKKzMyIDEgMzI0MDAwMAorMzIgMSAzMjYwMDAwCiszMiAxIDMyODAwMDAKKzMyIDEgMzMwMDAwMAorMzIgMSAzMzIwMDAwCiszMiAxIDMzNDAwMDAKKzMyIDEgMzM2MDAwMAorMzIgMSAzMzgwMDAwCiszMiAxIDM0MDAwMDAKKzMyIDEgMzQyMDAwMAorMzIgMSAzNDQwMDAwCiszMiAxIDM0NjAwMDAKKzMyIDEgMzQ4MDAwMAorMzIgMSAzNTAwMDAwCiszMiAxIDM1MjAwMDAKKzMyIDEgMzU0MDAwMAorMzIgMSAzNTYwMDAwCiszMiAxIDM1ODAwMDAKKzMyIDEgMzYwMDAwMAorMzIgMSAzNjIwMDAwCiszMiAxIDM2NDAwMDAKKzMyIDEgMzY2MDAwMAorMzIgMSAzNjgwMDAwCiszMiAxIDM3MDAwMDAKKzMyIDEgMzcyMDAwMAorMzIgMSAzNzQwMDAwCiszMiAxIDM3NjAwMDAKKzMyIDEgMzc4MDAwMAorMzIgMSAzODAwMDAwCiszMiAxIDM4MjAwMDAKKzMyIDEgMzg0MDAwMAorMzIgMSAzODYwMDAwCiszMiAxIDM4ODAwMDAKKzMyIDEgMzkwMDAwMAorMzIgMSAzOTIwMDAwCiszMiAxIDM5NDAwMDAKKzMyIDEgMzk2MDAwMAorMzIgMSAzOTgwMDAwCiszMiAxIDQwMDAwMDAKKzMyIDEgNDAyMDAwMAorMzIgMSA0MDQwMDAwCiszMiAxIDQwNjAwMDAKKzMyIDEgNDA4MDAwMAorMzIgMSA0MTAwMDAwCiszMiAxIDQxMjAwMDAKKzMyIDEgNDE0MDAwMAorMzIgMSA0MTYwMDAwCiszMiAxIDQxODAwMDAKKzMyIDEgNDIwMDAwMAorMzIgMSA0MjIwMDAwCiszMiAxIDQyNDAwMDAKKzMyIDEgNDI2MDAwMAorMzIgMSA0MjgwMDAwCiszMiAxIDQzMDAwMDAKKzMyIDEgNDMyMDAwMAorMzIgMSA0MzQwMDAwCiszMiAxIDQzNjAwMDAKKzMyIDEgNDM4MDAwMAorMzIgMSA0NDAwMDAwCiszMiAxIDQ0MjAwMDAKKzMyIDEgNDQ0MDAwMAorMzIgMSA0NDYwMDAwCiszMiAxIDQ0ODAwMDAKKzMyIDEgNDUwMDAwMAorMzIgMSA0NTIwMDAwCiszMiAxIDQ1NDAwMDAKKzMyIDEgNDU2MDAwMAorMzIgMSA0NTgwMDAwCiszMiAxIDQ2MDAwMDAKKzMyIDEgNDYyMDAwMAorMzIgMSA0NjQwMDAwCiszMiAxIDQ2NjAwMDAKKzMyIDEgNDY4MDAwMAorMzIgMSA0NzAwMDAwCiszMiAxIDQ3MjAwMDAKKzMyIDEgNDc0MDAwMAorMzIgMSA0NzYwMDAwCiszMiAxIDQ3ODAwMDAKKzMyIDEgNDgwMDAwMAorMzIgMSA0ODIwMDAwCiszMiAxIDQ4NDAwMDAKKzMyIDEgNDg2MDAwMAorMzIgMSA0ODgwMDAwCiszMiAxIDQ5MDAwMDAKKzMyIDEgNDkyMDAwMAorMzIgMSA0OTQwMDAwCiszMiAxIDQ5NjAwMDAKKzMyIDEgNDk4MDAwMAorMzIgMSA1MDAwMDAwCiszMiAxIDUwMjAwMDAKKzMyIDEgNTA0MDAwMAorMzIgMSA1MDYwMDAwCiszMiAxIDUwODAwMDAKKzMyIDEgNTEwMDAwMAorMzIgMSA1MTIwMDAwCiszMiAxIDUxNDAwMDAKKzMyIDEgNTE2MDAwMAorMzIgMSA1MTgwMDAwCiszMiAxIDUyMDAwMDAKKzMyIDEgNTIyMDAwMAorMzIgMSA1MjQwMDAwCiszMiAxIDUyNjAwMDAKKzMyIDEgNTI4MDAwMAorMzIgMSA1MzAwMDAwCiszMiAxIDUzMjAwMDAKKzMyIDEgNTM0MDAwMAorMzIgMSA1MzYwMDAwCiszMiAxIDUzODAwMDAKKzMyIDEgNTQwMDAwMAorMzIgMSA1NDIwMDAwCiszMiAxIDU0NDAwMDAKKzMyIDEgNTQ2MDAwMAorMzIgMSA1NDgwMDAwCiszMiAxIDU1MDAwMDAKKzMyIDEgNTUyMDAwMAorMzIgMSA1NTQwMDAwCiszMiAxIDU1NjAwMDAKKzMyIDEgNTU4MDAwMAorMzIgMSA1NjAwMDAwCiszMiAxIDU2MjAwMDAKKzMyIDEgNTY0MDAwMAorMzIgMSA1NjYwMDAwCiszMiAxIDU2ODAwMDAKKzMyIDEgNTcwMDAwMAorMzIgMSA1NzIwMDAwCiszMiAxIDU3NDAwMDAKKzMyIDEgNTc2MDAwMAorMzIgMSA1NzgwMDAwCiszMiAxIDU4MDAwMDAKKzMyIDEgNTgyMDAwMAorMzIgMSA1ODQwMDAwCiszMiAxIDU4NjAwMDAKKzMyIDEgNTg4MDAwMAorMzIgMSA1OTAwMDAwCiszMiAxIDU5MjAwMDAKKzMyIDEgNTk0MDAwMAorMzIgMSA1OTYwMDAwCiszMiAxIDU5ODAwMDAKKzMyIDEgNjAwMDAwMAorMzIgMSA2MDIwMDAwCiszMiAxIDYwNDAwMDAKKzMyIDEgNjA2MDAwMAorMzIgMSA2MDgwMDAwCiszMiAxIDYxMDAwMDAKKzMyIDEgNjEyMDAwMAorMzIgMSA2MTQwMDAwCiszMiAxIDYxNjAwMDAKKzMyIDEgNjE4MDAwMAorMzIgMSA2MjAwMDAwCiszMiAxIDYyMjAwMDAKKzMyIDEgNjI0MDAwMAorMzIgMSA2MjYwMDAwCiszMiAxIDYyODAwMDAKKzMyIDEgNjMwMDAwMAorMzIgMSA2MzIwMDAwCiszMiAxIDYzNDAwMDAKKzMyIDEgNjM2MDAwMAorMzIgMSA2MzgwMDAwCiszMiAxIDY0MDAwMDAKKzMyIDEgNjQyMDAwMAorMzIgMSA2NDQwMDAwCiszMiAxIDY0NjAwMDAKKzMyIDEgNjQ4MDAwMAorMzIgMSA2NTAwMDAwCiszMiAxIDY1MjAwMDAKKzMyIDEgNjU0MDAwMAorMzIgMSA2NTYwMDAwCiszMiAxIDY1ODAwMDAKKzMyIDEgNjYwMDAwMAorMzIgMSA2NjIwMDAwCiszMiAxIDY2NDAwMDAKKzMyIDEgNjY2MDAwMAorMzIgMSA2NjgwMDAwCiszMiAxIDY3MDAwMDAKKzMyIDEgNjcyMDAwMAorMzIgMSA2NzQwMDAwCiszMiAxIDY3NjAwMDAKKzMyIDEgNjc4MDAwMAorMzIgMSA2ODAwMDAwCiszMiAxIDY4MjAwMDAKKzMyIDEgNjg0MDAwMAorMzIgMSA2ODYwMDAwCiszMiAxIDY4ODAwMDAKKzMyIDEgNjkwMDAwMAorMzIgMSA2OTIwMDAwCiszMiAxIDY5NDAwMDAKKzMyIDEgNjk2MDAwMAorMzIgMSA2OTgwMDAwCiszMiAxIDcwMDAwMDAKKzMyIDEgNzAyMDAwMAorMzIgMSA3MDQwMDAwCiszMiAxIDcwNjAwMDAKKzMyIDEgNzA4MDAwMAorMzIgMSA3MTAwMDAwCiszMiAxIDcxMjAwMDAKKzMyIDEgNzE0MDAwMAorMzIgMSA3MTYwMDAwCiszMiAxIDcxODAwMDAKKzMyIDEgNzIwMDAwMAorMzIgMSA3MjIwMDAwCiszMiAxIDcyNDAwMDAKKzMyIDEgNzI2MDAwMAorMzIgMSA3MjgwMDAwCiszMiAxIDczMDAwMDAKKzMyIDEgNzMyMDAwMAorMzIgMSA3MzQwMDAwCiszMiAxIDczNjAwMDAKKzMyIDEgNzM4MDAwMAorMzIgMSA3NDAwMDAwCiszMiAxIDc0MjAwMDAKKzMyIDEgNzQ0MDAwMAorMzIgMSA3NDYwMDAwCiszMiAxIDc0ODAwMDAKKzMyIDEgNzUwMDAwMAorMzIgMSA3NTIwMDAwCiszMiAxIDc1NDAwMDAKKzMyIDEgNzU2MDAwMAorMzIgMSA3NTgwMDAwCiszMiAxIDc2MDAwMDAKKzMyIDEgNzYyMDAwMAorMzIgMSA3NjQwMDAwCiszMiAxIDc2NjAwMDAKKzMyIDEgNzY4MDAwMAorMzIgMSA3NzAwMDAwCiszMiAxIDc3MjAwMDAKKzMyIDEgNzc0MDAwMAorMzIgMSA3NzYwMDAwCiszMiAxIDc3ODAwMDAKKzMyIDEgNzgwMDAwMAorMzIgMSA3ODIwMDAwCiszMiAxIDc4NDAwMDAKKzMyIDEgNzg2MDAwMAorMzIgMSA3ODgwMDAwCiszMiAxIDc5MDAwMDAKKzMyIDEgNzkyMDAwMAorMzIgMSA3OTQwMDAwCiszMiAxIDc5NjAwMDAKKzMyIDEgNzk4MDAwMAorMzIgMSA4MDAwMDAwCiszMiAxIDgwMjAwMDAKKzMyIDEgODA0MDAwMAorMzIgMSA4MDYwMDAwCiszMiAxIDgwODAwMDAKKzMyIDEgODEwMDAwMAorMzIgMSA4MTIwMDAwCiszMiAxIDgxNDAwMDAKKzMyIDEgODE2MDAwMAorMzIgMSA4MTgwMDAwCiszMiAxIDgyMDAwMDAKKzMyIDEgODIyMDAwMAorMzIgMSA4MjQwMDAwCiszMiAxIDgyNjAwMDAKKzMyIDEgODI4MDAwMAorMzIgMSA4MzAwMDAwCiszMiAxIDgzMjAwMDAKKzMyIDEgODM0MDAwMAorMzIgMSA4MzYwMDAwCiszMiAxIDgzODAwMDAKKzMyIDEgODQwMDAwMAorMzIgMSA4NDIwMDAwCiszMiAxIDg0NDAwMDAKKzMyIDEgODQ2MDAwMAorMzIgMSA4NDgwMDAwCiszMiAxIDg1MDAwMDAKKzMyIDEgODUyMDAwMAorMzIgMSA4NTQwMDAwCiszMiAxIDg1NjAwMDAKKzMyIDEgODU4MDAwMAorMzIgMSA4NjAwMDAwCiszMiAxIDg2MjAwMDAKKzMyIDEgODY0MDAwMAorMzIgMSA4NjYwMDAwCiszMiAxIDg2ODAwMDAKKzMyIDEgODcwMDAwMAorMzIgMSA4NzIwMDAwCiszMiAxIDg3NDAwMDAKKzMyIDEgODc2MDAwMAorMzIgMSA4NzgwMDAwCiszMiAxIDg4MDAwMDAKKzMyIDEgODgyMDAwMAorMzIgMSA4ODQwMDAwCiszMiAxIDg4NjAwMDAKKzMyIDEgODg4MDAwMAorMzIgMSA4OTAwMDAwCiszMiAxIDg5MjAwMDAKKzMyIDEgODk0MDAwMAorMzIgMSA4OTYwMDAwCiszMiAxIDg5ODAwMDAKKzMyIDEgOTAwMDAwMAorMzIgMSA5MDIwMDAwCiszMiAxIDkwNDAwMDAKKzMyIDEgOTA2MDAwMAorMzIgMSA5MDgwMDAwCiszMiAxIDkxMDAwMDAKKzMyIDEgOTEyMDAwMAorMzIgMSA5MTQwMDAwCiszMiAxIDkxNjAwMDAKKzMyIDEgOTE4MDAwMAorMzIgMSA5MjAwMDAwCiszMiAxIDkyMjAwMDAKKzMyIDEgOTI0MDAwMAorMzIgMSA5MjYwMDAwCiszMiAxIDkyODAwMDAKKzMyIDEgOTMwMDAwMAorMzIgMSA5MzIwMDAwCiszMiAxIDkzNDAwMDAKKzMyIDEgOTM2MDAwMAorMzIgMSA5MzgwMDAwCiszMiAxIDk0MDAwMDAKKzMyIDEgOTQyMDAwMAorMzIgMSA5NDQwMDAwCiszMiAxIDk0NjAwMDAKKzMyIDEgOTQ4MDAwMAorMzIgMSA5NTAwMDAwCiszMiAxIDk1MjAwMDAKKzMyIDEgOTU0MDAwMAorMzIgMSA5NTYwMDAwCiszMiAxIDk1ODAwMDAKKzMyIDEgOTYwMDAwMAorMzIgMSA5NjIwMDAwCiszMiAxIDk2NDAwMDAKKzMyIDEgOTY2MDAwMAorMzIgMSA5NjgwMDAwCiszMiAxIDk3MDAwMDAKKzMyIDEgOTcyMDAwMAorMzIgMSA5NzQwMDAwCiszMiAxIDk3NjAwMDAKKzMyIDEgOTc4MDAwMAorMzIgMSA5ODAwMDAwCiszMiAxIDk4MjAwMDAKKzMyIDEgOTg0MDAwMAorMzIgMSA5ODYwMDAwCiszMiAxIDk4ODAwMDAKKzMyIDEgOTkwMDAwMAorMzIgMSA5OTIwMDAwCiszMiAxIDk5NDAwMDAKKzMyIDEgOTk2MDAwMAorMzIgMSA5OTgwMDAwCiszMiAxIDEwMDAwMDAwCiszMiAxIDEwMDIwMDAwCiszMiAxIDEwMDQwMDAwCiszMiAxIDEwMDYwMDAwCiszMiAxIDEwMDgwMDAwCiszMiAxIDEwMTAwMDAwCiszMiAxIDEwMTIwMDAwCiszMiAxIDEwMTQwMDAwCiszMiAxIDEwMTYwMDAwCiszMiAxIDEwMTgwMDAwCiszMiAxIDEwMjAwMDAwCiszMiAxIDEwMjIwMDAwCiszMiAxIDEwMjQwMDAwCiszMiAxIDEwMjYwMDAwCiszMiAxIDEwMjgwMDAwCiszMiAxIDEwMzAwMDAwCiszMiAxIDEwMzIwMDAwCiszMiAxIDEwMzQwMDAwCiszMiAxIDEwMzYwMDAwCiszMiAxIDEwMzgwMDAwCiszMiAxIDEwNDAwMDAwCiszMiAxIDEwNDIwMDAwCiszMiAxIDEwNDQwMDAwCiszMiAxIDEwNDYwMDAwCiszMiAxIDEwNDgwMDAwCiszMiAxIDEwNTAwMDAwCiszMiAxIDEwNTIwMDAwCiszMiAxIDEwNTQwMDAwCiszMiAxIDEwNTYwMDAwCiszMiAxIDEwNTgwMDAwCiszMiAxIDEwNjAwMDAwCiszMiAxIDEwNjIwMDAwCiszMiAxIDEwNjQwMDAwCiszMiAxIDEwNjYwMDAwCiszMiAxIDEwNjgwMDAwCiszMiAxIDEwNzAwMDAwCiszMiAxIDEwNzIwMDAwCiszMiAxIDEwNzQwMDAwCiszMiAxIDEwNzYwMDAwCiszMiAxIDEwNzgwMDAwCiszMiAxIDEwODAwMDAwCiszMiAxIDEwODIwMDAwCiszMiAxIDEwODQwMDAwCiszMiAxIDEwODYwMDAwCiszMiAxIDEwODgwMDAwCiszMiAxIDEwOTAwMDAwCiszMiAxIDEwOTIwMDAwCiszMiAxIDEwOTQwMDAwCiszMiAxIDEwOTYwMDAwCiszMiAxIDEwOTgwMDAwCiszMiAxIDExMDAwMDAwCiszMiAxIDExMDIwMDAwCiszMiAxIDExMDQwMDAwCiszMiAxIDExMDYwMDAwCiszMiAxIDExMDgwMDAwCiszMiAxIDExMTAwMDAwCiszMiAxIDExMTIwMDAwCiszMiAxIDExMTQwMDAwCiszMiAxIDExMTYwMDAwCiszMiAxIDExMTgwMDAwCiszMiAxIDExMjAwMDAwCiszMiAxIDExMjIwMDAwCiszMiAxIDExMjQwMDAwCiszMiAxIDExMjYwMDAwCiszMiAxIDExMjgwMDAwCiszMiAxIDExMzAwMDAwCiszMiAxIDExMzIwMDAwCiszMiAxIDExMzQwMDAwCiszMiAxIDExMzYwMDAwCiszMiAxIDExMzgwMDAwCiszMiAxIDExNDAwMDAwCiszMiAxIDExNDIwMDAwCiszMiAxIDExNDQwMDAwCiszMiAxIDExNDYwMDAwCiszMiAxIDExNDgwMDAwCiszMiAxIDExNTAwMDAwCiszMiAxIDExNTIwMDAwCiszMiAxIDExNTQwMDAwCiszMiAxIDExNTYwMDAwCiszMiAxIDExNTgwMDAwCiszMiAxIDExNjAwMDAwCiszMiAxIDExNjIwMDAwCiszMiAxIDExNjQwMDAwCiszMiAxIDExNjYwMDAwCiszMiAxIDExNjgwMDAwCiszMiAxIDExNzAwMDAwCiszMiAxIDExNzIwMDAwCiszMiAxIDExNzQwMDAwCiszMiAxIDExNzYwMDAwCiszMiAxIDExNzgwMDAwCiszMiAxIDExODAwMDAwCiszMiAxIDExODIwMDAwCiszMiAxIDExODQwMDAwCiszMiAxIDExODYwMDAwCiszMiAxIDExODgwMDAwCiszMiAxIDExOTAwMDAwCiszMiAxIDExOTIwMDAwCiszMiAxIDExOTQwMDAwCiszMiAxIDExOTYwMDAwCiszMiAxIDExOTgwMDAwCiszMiAxIDEyMDAwMDAwCiszMiAxIDEyMDIwMDAwCiszMiAxIDEyMDQwMDAwCiszMiAxIDEyMDYwMDAwCiszMiAxIDEyMDgwMDAwCiszMiAxIDEyMTAwMDAwCiszMiAxIDEyMTIwMDAwCiszMiAxIDEyMTQwMDAwCiszMiAxIDEyMTYwMDAwCiszMiAxIDEyMTgwMDAwCiszMiAxIDEyMjAwMDAwCiszMiAxIDEyMjIwMDAwCiszMiAxIDEyMjQwMDAwCiszMiAxIDEyMjYwMDAwCiszMiAxIDEyMjgwMDAwCiszMiAxIDEyMzAwMDAwCiszMiAxIDEyMzIwMDAwCiszMiAxIDEyMzQwMDAwCiszMiAxIDEyMzYwMDAwCiszMiAxIDEyMzgwMDAwCiszMiAxIDEyNDAwMDAwCiszMiAxIDEyNDIwMDAwCiszMiAxIDEyNDQwMDAwCiszMiAxIDEyNDYwMDAwCiszMiAxIDEyNDgwMDAwCiszMiAxIDEyNTAwMDAwCiszMiAxIDEyNTIwMDAwCiszMiAxIDEyNTQwMDAwCiszMiAxIDEyNTYwMDAwCiszMiAxIDEyNTgwMDAwCiszMiAxIDEyNjAwMDAwCiszMiAxIDEyNjIwMDAwCiszMiAxIDEyNjQwMDAwCiszMiAxIDEyNjYwMDAwCiszMiAxIDEyNjgwMDAwCiszMiAxIDEyNzAwMDAwCiszMiAxIDEyNzIwMDAwCiszMiAxIDEyNzQwMDAwCiszMiAxIDEyNzYwMDAwCiszMiAxIDEyNzgwMDAwCiszMiAxIDEyODAwMDAwCiszMiAxIDEyODIwMDAwCiszMiAxIDEyODQwMDAwCiszMiAxIDEyODYwMDAwCiszMiAxIDEyODgwMDAwCiszMiAxIDEyOTAwMDAwCiszMiAxIDEyOTIwMDAwCiszMiAxIDEyOTQwMDAwCiszMiAxIDEyOTYwMDAwCiszMiAxIDEyOTgwMDAwCiszMiAxIDEzMDAwMDAwCiszMiAxIDEzMDIwMDAwCiszMiAxIDEzMDQwMDAwCiszMiAxIDEzMDYwMDAwCiszMiAxIDEzMDgwMDAwCiszMiAxIDEzMTAwMDAwCiszMiAxIDEzMTIwMDAwCiszMiAxIDEzMTQwMDAwCiszMiAxIDEzMTYwMDAwCiszMiAxIDEzMTgwMDAwCiszMiAxIDEzMjAwMDAwCiszMiAxIDEzMjIwMDAwCiszMiAxIDEzMjQwMDAwCiszMiAxIDEzMjYwMDAwCiszMiAxIDEzMjgwMDAwCiszMiAxIDEzMzAwMDAwCiszMiAxIDEzMzIwMDAwCiszMiAxIDEzMzQwMDAwCiszMiAxIDEzMzYwMDAwCiszMiAxIDEzMzgwMDAwCiszMiAxIDEzNDAwMDAwCiszMiAxIDEzNDIwMDAwCiszMiAxIDEzNDQwMDAwCiszMiAxIDEzNDYwMDAwCiszMiAxIDEzNDgwMDAwCiszMiAxIDEzNTAwMDAwCiszMiAxIDEzNTIwMDAwCiszMiAxIDEzNTQwMDAwCiszMiAxIDEzNTYwMDAwCiszMiAxIDEzNTgwMDAwCiszMiAxIDEzNjAwMDAwCiszMiAxIDEzNjIwMDAwCiszMiAxIDEzNjQwMDAwCiszMiAxIDEzNjYwMDAwCiszMiAxIDEzNjgwMDAwCiszMiAxIDEzNzAwMDAwCiszMiAxIDEzNzIwMDAwCiszMiAxIDEzNzQwMDAwCiszMiAxIDEzNzYwMDAwCiszMiAxIDEzNzgwMDAwCiszMiAxIDEzODAwMDAwCiszMiAxIDEzODIwMDAwCiszMiAxIDEzODQwMDAwCiszMiAxIDEzODYwMDAwCiszMiAxIDEzODgwMDAwCiszMiAxIDEzOTAwMDAwCiszMiAxIDEzOTIwMDAwCiszMiAxIDEzOTQwMDAwCiszMiAxIDEzOTYwMDAwCiszMiAxIDEzOTgwMDAwCiszMiAxIDE0MDAwMDAwCiszMiAxIDE0MDIwMDAwCiszMiAxIDE0MDQwMDAwCiszMiAxIDE0MDYwMDAwCiszMiAxIDE0MDgwMDAwCiszMiAxIDE0MTAwMDAwCiszMiAxIDE0MTIwMDAwCiszMiAxIDE0MTQwMDAwCiszMiAxIDE0MTYwMDAwCiszMiAxIDE0MTgwMDAwCiszMiAxIDE0MjAwMDAwCiszMiAxIDE0MjIwMDAwCiszMiAxIDE0MjQwMDAwCiszMiAxIDE0MjYwMDAwCiszMiAxIDE0MjgwMDAwCiszMiAxIDE0MzAwMDAwCiszMiAxIDE0MzIwMDAwCiszMiAxIDE0MzQwMDAwCiszMiAxIDE0MzYwMDAwCiszMiAxIDE0MzgwMDAwCiszMiAxIDE0NDAwMDAwCiszMiAxIDE0NDIwMDAwCiszMiAxIDE0NDQwMDAwCiszMiAxIDE0NDYwMDAwCiszMiAxIDE0NDgwMDAwCiszMiAxIDE0NTAwMDAwCiszMiAxIDE0NTIwMDAwCiszMiAxIDE0NTQwMDAwCiszMiAxIDE0NTYwMDAwCiszMiAxIDE0NTgwMDAwCiszMiAxIDE0NjAwMDAwCiszMiAxIDE0NjIwMDAwCiszMiAxIDE0NjQwMDAwCiszMiAxIDE0NjYwMDAwCiszMiAxIDE0NjgwMDAwCiszMiAxIDE0NzAwMDAwCiszMiAxIDE0NzIwMDAwCiszMiAxIDE0NzQwMDAwCiszMiAxIDE0NzYwMDAwCiszMiAxIDE0NzgwMDAwCiszMiAxIDE0ODAwMDAwCiszMiAxIDE0ODIwMDAwCiszMiAxIDE0ODQwMDAwCiszMiAxIDE0ODYwMDAwCiszMiAxIDE0ODgwMDAwCiszMiAxIDE0OTAwMDAwCiszMiAxIDE0OTIwMDAwCiszMiAxIDE0OTQwMDAwCiszMiAxIDE0OTYwMDAwCiszMiAxIDE0OTgwMDAwCiszMiAxIDE1MDAwMDAwCiszMiAxIDE1MDIwMDAwCiszMiAxIDE1MDQwMDAwCiszMiAxIDE1MDYwMDAwCiszMiAxIDE1MDgwMDAwCiszMiAxIDE1MTAwMDAwCiszMiAxIDE1MTIwMDAwCiszMiAxIDE1MTQwMDAwCiszMiAxIDE1MTYwMDAwCiszMiAxIDE1MTgwMDAwCiszMiAxIDE1MjAwMDAwCiszMiAxIDE1MjIwMDAwCiszMiAxIDE1MjQwMDAwCiszMiAxIDE1MjYwMDAwCiszMiAxIDE1MjgwMDAwCiszMiAxIDE1MzAwMDAwCiszMiAxIDE1MzIwMDAwCiszMiAxIDE1MzQwMDAwCiszMiAxIDE1MzYwMDAwCiszMiAxIDE1MzgwMDAwCiszMiAxIDE1NDAwMDAwCiszMiAxIDE1NDIwMDAwCiszMiAxIDE1NDQwMDAwCiszMiAxIDE1NDYwMDAwCiszMiAxIDE1NDgwMDAwCiszMiAxIDE1NTAwMDAwCiszMiAxIDE1NTIwMDAwCiszMiAxIDE1NTQwMDAwCiszMiAxIDE1NTYwMDAwCiszMiAxIDE1NTgwMDAwCiszMiAxIDE1NjAwMDAwCiszMiAxIDE1NjIwMDAwCiszMiAxIDE1NjQwMDAwCiszMiAxIDE1NjYwMDAwCiszMiAxIDE1NjgwMDAwCiszMiAxIDE1NzAwMDAwCiszMiAxIDE1NzIwMDAwCiszMiAxIDE1NzQwMDAwCiszMiAxIDE1NzYwMDAwCiszMiAxIDE1NzgwMDAwCiszMiAxIDE1ODAwMDAwCiszMiAxIDE1ODIwMDAwCiszMiAxIDE1ODQwMDAwCiszMiAxIDE1ODYwMDAwCiszMiAxIDE1ODgwMDAwCiszMiAxIDE1OTAwMDAwCiszMiAxIDE1OTIwMDAwCiszMiAxIDE1OTQwMDAwCiszMiAxIDE1OTYwMDAwCiszMiAxIDE1OTgwMDAwCiszMiAxIDE2MDAwMDAwCiszMiAxIDE2MDIwMDAwCiszMiAxIDE2MDQwMDAwCiszMiAxIDE2MDYwMDAwCiszMiAxIDE2MDgwMDAwCiszMiAxIDE2MTAwMDAwCiszMiAxIDE2MTIwMDAwCiszMiAxIDE2MTQwMDAwCiszMiAxIDE2MTYwMDAwCiszMiAxIDE2MTgwMDAwCiszMiAxIDE2MjAwMDAwCiszMiAxIDE2MjIwMDAwCiszMiAxIDE2MjQwMDAwCiszMiAxIDE2MjYwMDAwCiszMiAxIDE2MjgwMDAwCiszMiAxIDE2MzAwMDAwCiszMiAxIDE2MzIwMDAwCiszMiAxIDE2MzQwMDAwCiszMiAxIDE2MzYwMDAwCiszMiAxIDE2MzgwMDAwCiszMiAxIDE2NDAwMDAwCiszMiAxIDE2NDIwMDAwCiszMiAxIDE2NDQwMDAwCiszMiAxIDE2NDYwMDAwCiszMiAxIDE2NDgwMDAwCiszMiAxIDE2NTAwMDAwCiszMiAxIDE2NTIwMDAwCiszMiAxIDE2NTQwMDAwCiszMiAxIDE2NTYwMDAwCiszMiAxIDE2NTgwMDAwCiszMiAxIDE2NjAwMDAwCiszMiAxIDE2NjIwMDAwCiszMiAxIDE2NjQwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNTdlZTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vQW5kcm9pZC5icApAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlZ0c0hpZGxDMlYxXzBUYXJnZXRWaWRlb0RlY1Rlc3QiLAorICAgIGRlZmF1bHRzOiBbIlZ0c01lZGlhQzJWMV8wRGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbIlZ0c0hpZGxDMlYxXzBUYXJnZXRWaWRlb0RlY1Rlc3QuY3BwIl0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9FbmNUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNNZWRpYUMyVjFfMERlZmF1bHRzIl0sCisgICAgc3JjczogWyJWdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9FbmNUZXN0LmNwcCJdLAorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vVnRzSGlkbEMyVjFfMFRhcmdldFZpZGVvRGVjVGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vVnRzSGlkbEMyVjFfMFRhcmdldFZpZGVvRGVjVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNmYTg0OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9WdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9EZWNUZXN0LmNwcApAQCAtMCwwICsxLDg4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiY29kZWMyX2hpZGxfaGFsX3ZpZGVvX2RlY190ZXN0IgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKwordXNpbmcgYW5kcm9pZDo6QzJBbGxvY2F0b3JJb247CisKKyNpbmNsdWRlIDxWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UuaD4KKyNpbmNsdWRlICJtZWRpYV9jMl92aWRlb19oaWRsX3Rlc3RfY29tbW9uLmgiCisjaW5jbHVkZSAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIgorCitzdHJ1Y3QgRnJhbWVJbmZvIHsKKyAgICBpbnQgYnl0ZXNDb3VudDsKKyAgICB1aW50MzJfdCBmbGFnczsKKyAgICBpbnQ2NF90IHRpbWVzdGFtcDsKK307CisKK2NsYXNzIExpbmVhckJ1ZmZlciA6IHB1YmxpYyBDMkJ1ZmZlciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgTGluZWFyQnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiYgYmxvY2spCisgICAgICAgIDogQzJCdWZmZXIoCisgICAgICAgICAgICAgIHtibG9jay0+c2hhcmUoYmxvY2stPm9mZnNldCgpLCBibG9jay0+c2l6ZSgpLCA6OkMyRmVuY2UoKSl9KSB7fQorfTsKKworc3RhdGljIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCogZ0VudiA9IG51bGxwdHI7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIENvZGVjMlZpZGVvRGVjSGlkbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgeworICAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIFN1cGVyOworCisgICBwdWJsaWM6CisgICAgOjpzdGQ6OnN0cmluZyBnZXRUZXN0Q2FzZUluZm8oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiA6OnN0ZDo6c3RyaW5nKCkgKworICAgICAgICAgICAgICAgICJDb21wb25lbnQ6ICIgKyBnRW52LT5nZXRDb21wb25lbnQoKS5jX3N0cigpICsgIiB8ICIgKworICAgICAgICAgICAgICAgICJJbnN0YW5jZTogIiArIGdFbnYtPmdldEluc3RhbmNlKCkuY19zdHIoKSArICIgfCAiICsKKyAgICAgICAgICAgICAgICAiUmVzOiAiICsgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKTsKKyAgICB9CisKKyAgICAvLyBnb29nbGUuY29kZWMyIFZpZGVvIHRlc3Qgc2V0dXAKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIFN1cGVyOjpTZXRVcCgpOworICAgICAgICBtRGlzYWJsZVRlc3QgPSBmYWxzZTsKKyAgICAgICAgQUxPR1YoIkNvZGVjMlZpZGVvRGVjSGlkbFRlc3QgU2V0VXAiKTsKKyAgICAgICAgbUNsaWVudCA9IGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkpOworICAgICAgICBBU1NFUlRfTkUobUNsaWVudCwgbnVsbHB0cik7CisgICAgICAgIG1MaXN0ZW5lci5yZXNldChuZXcgQ29kZWNMaXN0ZW5lcigKKyAgICAgICAgICAgIFt0aGlzXShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVXb3JrRG9uZSh3b3JrSXRlbXMpOworICAgICAgICAgICAgfSkpOworICAgICAgICBBU1NFUlRfTkUobUxpc3RlbmVyLCBudWxscHRyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSU5QVVRfQlVGRkVSUzsgKytpKSB7CisgICAgICAgICAgICBtV29ya1F1ZXVlLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrKTsKKyAgICAgICAgfQorICAgICAgICBtQ2xpZW50LT5jcmVhdGVDb21wb25lbnQoZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSwgbUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1Db21wb25lbnQpOworICAgICAgICBBU1NFUlRfTkUobUNvbXBvbmVudCwgbnVsbHB0cik7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IHN0b3JlID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OkdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICAgICAgQ0hFQ0tfRVEoc3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1MaW5lYXJBbGxvY2F0b3IpLAorICAgICAgICAgICAgICAgICBDMl9PSyk7CisgICAgICAgIG1MaW5lYXJQb29sID0gc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4obUxpbmVhckFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQmxvY2tQb29sSWQrKyk7CisgICAgICAgIEFTU0VSVF9ORShtTGluZWFyUG9vbCwgbnVsbHB0cik7CisKKyAgICAgICAgbUNvbXBOYW1lID0gdW5rbm93bl9jb21wOworICAgICAgICBzdHJ1Y3QgU3RyaW5nVG9OYW1lIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIE5hbWU7CisgICAgICAgICAgICBzdGFuZGFyZENvbXAgQ29tcE5hbWU7CisgICAgICAgIH07CisKKyAgICAgICAgY29uc3QgU3RyaW5nVG9OYW1lIGtTdHJpbmdUb05hbWVbXSA9IHsKKyAgICAgICAgICAgIHsiaDI2MyIsIGgyNjN9LCB7ImF2YyIsIGF2Y30sIHsibXBlZzIiLCBtcGVnMn0sIHsibXBlZzQiLCBtcGVnNH0sCisgICAgICAgICAgICB7ImhldmMiLCBoZXZjfSwgeyJ2cDgiLCB2cDh9LCB7InZwOSIsIHZwOX0sIHsiYXYxIiwgYXYxfSwKKyAgICAgICAgfTsKKworICAgICAgICBjb25zdCBzaXplX3Qga051bVN0cmluZ1RvTmFtZSA9CisgICAgICAgICAgICBzaXplb2Yoa1N0cmluZ1RvTmFtZSkgLyBzaXplb2Yoa1N0cmluZ1RvTmFtZVswXSk7CisKKyAgICAgICAgLy8gRmluZCB0aGUgY29tcG9uZW50IHR5cGUKKyAgICAgICAgc3RkOjpzdHJpbmcgY29tcCA9IHN0ZDo6c3RyaW5nKGdFbnYtPmdldENvbXBvbmVudCgpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtU3RyaW5nVG9OYW1lOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChzdHJjYXNlc3RyKGNvbXAuY19zdHIoKSwga1N0cmluZ1RvTmFtZVtpXS5OYW1lKSkgeworICAgICAgICAgICAgICAgIG1Db21wTmFtZSA9IGtTdHJpbmdUb05hbWVbaV0uQ29tcE5hbWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUVvcyA9IGZhbHNlOworICAgICAgICBtRnJhbWVzUmVjZWl2ZWQgPSAwOworICAgICAgICBtVGltZXN0YW1wVXMgPSAwdTsKKyAgICAgICAgbVRpbWVzdGFtcERldlRlc3QgPSBmYWxzZTsKKyAgICAgICAgaWYgKG1Db21wTmFtZSA9PSB1bmtub3duX2NvbXApIG1EaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIGlmIChtRGlzYWJsZVRlc3QpIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgRGlzYWJsZWQgXG4iOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1Db21wb25lbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgaWYgKDo6dGVzdGluZzo6VGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpIHJldHVybjsKKyAgICAgICAgICAgIG1Db21wb25lbnQtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1Db21wb25lbnQgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIFN1cGVyOjpUZWFyRG93bigpOworICAgIH0KKworICAgIC8vIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHByb2Nlc3Mgb25Xb3JrRG9uZSByZWNlaXZlZCBieSBMaXN0ZW5lcgorICAgIHZvaWQgaGFuZGxlV29ya0RvbmUoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgIGlmICghd29yay0+d29ya2xldHMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIC8vIEZvciBkZWNvZGVyIGNvbXBvbmVudHMgY3VycmVudCB0aW1lc3RhbXAgYWx3YXlzIGV4Y2VlZHMKKyAgICAgICAgICAgICAgICAvLyBwcmV2aW91cyB0aW1lc3RhbXAKKyAgICAgICAgICAgICAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgICAgICAgICAgICAgYm9vbCBjb2RlY0NvbmZpZyA9ICgod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDApOworICAgICAgICAgICAgICAgIGlmICghY29kZWNDb25maWcgJiYKKyAgICAgICAgICAgICAgICAgICAgIXdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgRVhQRUNUX0dFKAorICAgICAgICAgICAgICAgICAgICAgICAgKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBVcyk7CisgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBVcyA9CisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKTsKKworICAgICAgICAgICAgICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICAgICAgICAgICAgICBpZiAobVRpbWVzdGFtcERldlRlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdHNIaXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD46Oml0ZXJhdG9yIGl0ID0gbVRpbWVzdGFtcFVzbGlzdC5iZWdpbigpOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0ICE9IG1UaW1lc3RhbXBVc2xpc3QuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKml0ID09IG1UaW1lc3RhbXBVcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wVXNsaXN0LmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNIaXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0c0hpdCA9PSBmYWxzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVGltZXN0YW1wVXNsaXN0LmVtcHR5KCkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhQRUNUX0VRKHRzSGl0LCB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlRpbWVTdGFtcCBub3QgcmVjb2duaXplZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgSU5GTyAgIF0gUmVjZWl2ZWQgbm9uLXplcm8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dCAvIFRpbWVTdGFtcCBub3QgcmVjb2duaXplZCBcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJvb2wgbUNzZDsKKyAgICAgICAgICAgICAgICB3b3JrRG9uZShtQ29tcG9uZW50LCB3b3JrLCBtRmx1c2hlZEluZGljZXMsIG1RdWV1ZUxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRW9zLCBtQ3NkLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNSZWNlaXZlZCk7CisgICAgICAgICAgICAgICAgKHZvaWQpbUNzZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGVudW0gc3RhbmRhcmRDb21wIHsKKyAgICAgICAgaDI2MywKKyAgICAgICAgYXZjLAorICAgICAgICBtcGVnMiwKKyAgICAgICAgbXBlZzQsCisgICAgICAgIGhldmMsCisgICAgICAgIHZwOCwKKyAgICAgICAgdnA5LAorICAgICAgICBhdjEsCisgICAgICAgIHVua25vd25fY29tcCwKKyAgICB9OworCisgICAgYm9vbCBtRW9zOworICAgIGJvb2wgbURpc2FibGVUZXN0OworICAgIGJvb2wgbVRpbWVzdGFtcERldlRlc3Q7CisgICAgdWludDY0X3QgbVRpbWVzdGFtcFVzOworICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4gbVRpbWVzdGFtcFVzbGlzdDsKKyAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+IG1GbHVzaGVkSW5kaWNlczsKKyAgICBzdGFuZGFyZENvbXAgbUNvbXBOYW1lOworICAgIHVpbnQzMl90IG1GcmFtZXNSZWNlaXZlZDsKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBtQmxvY2tQb29sSWQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtTGluZWFyUG9vbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1MaW5lYXJBbGxvY2F0b3I7CisKKyAgICBzdGQ6Om11dGV4IG1RdWV1ZUxvY2s7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbVF1ZXVlQ29uZGl0aW9uOworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gbVdvcmtRdWV1ZTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ+IG1DbGllbnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IG1Db21wb25lbnQ7CisKKyAgIHByb3RlY3RlZDoKKyAgICBzdGF0aWMgdm9pZCBkZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworICAgIH0KK307CisKK3ZvaWQgdmFsaWRhdGVDb21wb25lbnQoCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgIENvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wTmFtZSwgYm9vbCYgZGlzYWJsZVRlc3QpIHsKKyAgICAvLyBWYWxpZGF0ZSBpdHMgYSBDMiBDb21wb25lbnQKKyAgICBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiYzIiKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBBTE9HRSgiTm90IGEgYzIgY29tcG9uZW50Iik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFZhbGlkYXRlIGl0cyBub3QgYW4gZW5jb2RlciBhbmQgdGhlIGNvbXBvbmVudCB0byBiZSB0ZXN0ZWQgaXMgdmlkZW8KKyAgICBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiZW5jb2RlciIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBEZWNvZGVyLCBnaXZlbiBFbmNvZGVyIik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgYzJfc3RhdHVzX3QgYzJlcnIgPQorICAgICAgICBjb21wb25lbnQtPnF1ZXJ5KHt9LCB7QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ6OlBBUkFNX1RZUEV9LAorICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssICZxdWVyaWVkKTsKKyAgICBpZiAoYzJlcnIgIT0gQzJfT0sgJiYgcXVlcmllZC5zaXplKCkgPT0gMCkgeworICAgICAgICBBTE9HRSgiUXVlcnkgbWVkaWEgdHlwZSBmYWlsZWQgPT4gJWQiLCBjMmVycik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgaW5wdXREb21haW4gPQorICAgICAgICAgICAgKChDMlN0cmVhbU1lZGlhVHlwZVNldHRpbmc6OmlucHV0KilxdWVyaWVkWzBdLmdldCgpKS0+bS52YWx1ZTsKKyAgICAgICAgaWYgKGlucHV0RG9tYWluLmZpbmQoInZpZGVvLyIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgVmlkZW8gQ29tcG9uZW50Iik7CisgICAgICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZXMgY29tcG9uZW50IG5hbWUKKyAgICBpZiAoY29tcE5hbWUgPT0gQ29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6dW5rbm93bl9jb21wKSB7CisgICAgICAgIEFMT0dFKCJDb21wb25lbnQgSW5WYWxpZCIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1YoIkNvbXBvbmVudCBWYWxpZCIpOworfQorCisvLyBudW1iZXIgb2YgZWxlbWVudGFyeSBzdHJlYW1zIHBlciBjb21wb25lbnQKKyNkZWZpbmUgU1RSRUFNX0NPVU5UIDIKKy8vIExvb2tVcFRhYmxlIG9mIGNsaXBzIGFuZCBtZXRhZGF0YSBmb3IgY29tcG9uZW50IHRlc3RpbmcKK3ZvaWQgR2V0VVJMRm9yQ29tcG9uZW50KENvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wLCBjaGFyKiBtVVJMLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogaW5mbywgc2l6ZV90IHN0cmVhbUluZGV4ID0gMSkgeworICAgIHN0cnVjdCBDb21wVG9VUkwgeworICAgICAgICBDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcDsKKyAgICAgICAgY29uc3QgY2hhciBtVVJMW1NUUkVBTV9DT1VOVF1bNTEyXTsKKyAgICAgICAgY29uc3QgY2hhciBpbmZvW1NUUkVBTV9DT1VOVF1bNTEyXTsKKyAgICB9OworICAgIEFTU0VSVF9UUlVFKHN0cmVhbUluZGV4IDwgU1RSRUFNX0NPVU5UKTsKKworICAgIHN0YXRpYyBjb25zdCBDb21wVG9VUkwga0NvbXBUb1VSTFtdID0geworICAgICAgICB7Q29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjphdmMsCisgICAgICAgICB7ImJiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmgyNjQiLAorICAgICAgICAgICJiYmJfYXZjXzY0MHgzNjBfNzY4a2Jwc18zMGZwcy5oMjY0In0sCisgICAgICAgICB7ImJiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmluZm8iLAorICAgICAgICAgICJiYmJfYXZjXzY0MHgzNjBfNzY4a2Jwc18zMGZwcy5pbmZvIn19LAorICAgICAgICB7Q29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpoZXZjLAorICAgICAgICAgeyJiYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaGV2YyIsCisgICAgICAgICAgImJiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaGV2YyJ9LAorICAgICAgICAgeyJiYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaW5mbyIsCisgICAgICAgICAgImJiYl9oZXZjXzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6bXBlZzIsCisgICAgICAgICB7ImJiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMubTJ2IiwKKyAgICAgICAgICAiYmJiX21wZWcyXzM1MngyODhfMW1icHNfNjBmcHMubTJ2In0sCisgICAgICAgICB7ImJiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMuaW5mbyIsCisgICAgICAgICAgImJiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmgyNjMsCisgICAgICAgICB7IiIsICJiYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaDI2MyJ9LAorICAgICAgICAgeyIiLCAiYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6Om1wZWc0LAorICAgICAgICAgeyIiLCAiYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5tNHYifSwKKyAgICAgICAgIHsiIiwgImJiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6dnA4LAorICAgICAgICAgeyJiYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy52cDgiLAorICAgICAgICAgICJiYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMudnA4In0sCisgICAgICAgICB7ImJiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLmluZm8iLAorICAgICAgICAgICJiYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6dnA5LAorICAgICAgICAgeyJiYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy52cDkiLAorICAgICAgICAgICJiYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMudnA5In0sCisgICAgICAgICB7ImJiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLmluZm8iLAorICAgICAgICAgICJiYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6YXYxLAorICAgICAgICAgeyJiYmJfYXYxXzY0MF8zNjAuYXYxIiwKKyAgICAgICAgICAiYmJiX2F2MV8xNzZfMTQ0LmF2MSJ9LAorICAgICAgICAgeyJiYmJfYXYxXzY0MF8zNjAuaW5mbyIsCisgICAgICAgICAgImJiYl9hdjFfMTc2XzE0NC5pbmZvIn19LAorICAgIH07CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZihrQ29tcFRvVVJMKSAvIHNpemVvZihrQ29tcFRvVVJMWzBdKTsgKytpKSB7CisgICAgICAgIGlmIChrQ29tcFRvVVJMW2ldLmNvbXAgPT0gY29tcCkgeworICAgICAgICAgICAgc3RyY2F0KG1VUkwsIGtDb21wVG9VUkxbaV0ubVVSTFtzdHJlYW1JbmRleF0pOworICAgICAgICAgICAgc3RyY2F0KGluZm8sIGtDb21wVG9VUkxbaV0uaW5mb1tzdHJlYW1JbmRleF0pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGRlY29kZU5GcmFtZXMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bXV0ZXggJnF1ZXVlTG9jaywgc3RkOjpjb25kaXRpb25fdmFyaWFibGUmIHF1ZXVlQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+JiBmbHVzaGVkSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBsaW5lYXJQb29sLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6aWZzdHJlYW0mIGVsZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiogSW5mbywKKyAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0LCBpbnQgcmFuZ2UsIGJvb2wgc2lnbmFsRU9TID0gdHJ1ZSkgeworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICBpbnQgZnJhbWVJRCA9IG9mZnNldDsKKyAgICBpbnQgbWF4UmV0cnkgPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmIChmcmFtZUlEID09IChpbnQpSW5mby0+c2l6ZSgpIHx8IGZyYW1lSUQgPT0gKG9mZnNldCArIHJhbmdlKSkgYnJlYWs7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICAgICAgLy8gUHJlcGFyZSBDMldvcmsKKyAgICAgICAgd2hpbGUgKCF3b3JrICYmIChtYXhSZXRyeSA8IE1BWF9SRVRSWSkpIHsKKyAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgICAgIGlmICghd29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICB3b3JrLnN3YXAod29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgICAgIHdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICAgICAgICAgIG1heFJldHJ5Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF3b3JrICYmIChtYXhSZXRyeSA+PSBNQVhfUkVUUlkpKSB7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIldhaXQgZm9yIGdlbmVyYXRpbmcgQzJXb3JrIGV4Y2VlZGVkIHRpbWVvdXQiOworICAgICAgICB9CisgICAgICAgIGludDY0X3QgdGltZXN0YW1wID0gKCpJbmZvKVtmcmFtZUlEXS50aW1lc3RhbXA7CisgICAgICAgIGlmICgoKkluZm8pW2ZyYW1lSURdLmZsYWdzKSBmbGFncyA9ICgxIDw8ICgoKkluZm8pW2ZyYW1lSURdLmZsYWdzIC0gMSkpOworICAgICAgICBpZiAoc2lnbmFsRU9TICYmICgoZnJhbWVJRCA9PSAoaW50KUluZm8tPnNpemUoKSAtIDEpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIChmcmFtZUlEID09IChvZmZzZXQgKyByYW5nZSAtIDEpKSkpCisgICAgICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworCisgICAgICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gZnJhbWVJRDsKKyAgICAgICAgeworICAgICAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICAgICAgZmx1c2hlZEluZGljZXMuZW1wbGFjZV9iYWNrKGZyYW1lSUQpOworICAgICAgICB9CisKKyAgICAgICAgaW50IHNpemUgPSAoKkluZm8pW2ZyYW1lSURdLmJ5dGVzQ291bnQ7CisgICAgICAgIGNoYXIqIGRhdGEgPSAoY2hhciopbWFsbG9jKHNpemUpOworICAgICAgICBBU1NFUlRfTkUoZGF0YSwgbnVsbHB0cik7CisKKyAgICAgICAgZWxlU3RyZWFtLnJlYWQoZGF0YSwgc2l6ZSk7CisgICAgICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uZ2NvdW50KCksIHNpemUpOworCisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgaWYgKHNpemUpIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICAgICAgICAgIEFTU0VSVF9FUShDMl9PSywKKyAgICAgICAgICAgICAgICAgICAgbGluZWFyUG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUsIHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZibG9jaykpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoYmxvY2spOworCisgICAgICAgICAgICAvLyBXcml0ZSBWaWV3CisgICAgICAgICAgICBDMldyaXRlVmlldyB2aWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICAgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQzJMaW5lYXJCbG9jazo6bWFwKCkgZmFpbGVkIDogJWQiLCB2aWV3LmVycm9yKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQVNTRVJUX0VRKChzaXplX3Qpc2l6ZSwgdmlldy5jYXBhY2l0eSgpKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUSgwdSwgdmlldy5vZmZzZXQoKSk7CisgICAgICAgICAgICBBU1NFUlRfRVEoKHNpemVfdClzaXplLCB2aWV3LnNpemUoKSk7CisKKyAgICAgICAgICAgIG1lbWNweSh2aWV3LmJhc2UoKSwgZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wbGFjZV9iYWNrKG5ldyBMaW5lYXJCdWZmZXIoYmxvY2spKTsKKyAgICAgICAgICAgIGZyZWUoZGF0YSk7CisgICAgICAgIH0KKyAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgICAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKworICAgICAgICAvLyBETyBUSEUgREVDT0RJTkcKKyAgICAgICAgQVNTRVJUX0VRKGNvbXBvbmVudC0+cXVldWUoJml0ZW1zKSwgQzJfT0spOworICAgICAgICBBTE9HVigiRnJhbWUgIyVkIHNpemUgPSAlZCBxdWV1ZWQiLCBmcmFtZUlELCBzaXplKTsKKyAgICAgICAgZnJhbWVJRCsrOworICAgICAgICBtYXhSZXRyeSA9IDA7CisgICAgfQorfQorCitURVNUX0YoQ29kZWMyVmlkZW9EZWNIaWRsVGVzdCwgdmFsaWRhdGVDb21wTmFtZSkgeworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBBTE9HVigiQ2hlY2tzIGlmIHRoZSBnaXZlbiBjb21wb25lbnQgaXMgYSB2YWxpZCB2aWRlbyBjb21wb25lbnQiKTsKKyAgICB2YWxpZGF0ZUNvbXBvbmVudChtQ29tcG9uZW50LCBtQ29tcE5hbWUsIG1EaXNhYmxlVGVzdCk7CisgICAgQVNTRVJUX0VRKG1EaXNhYmxlVGVzdCwgZmFsc2UpOworfQorCitjbGFzcyBDb2RlYzJWaWRlb0RlY0RlY29kZVRlc3QKKyAgICA6IHB1YmxpYyBDb2RlYzJWaWRlb0RlY0hpZGxUZXN0LAorICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPHN0ZDo6cGFpcjxpbnQzMl90LCBib29sPj4geworfTsKKworLy8gQml0c3RyZWFtIFRlc3QKK1RFU1RfUChDb2RlYzJWaWRlb0RlY0RlY29kZVRlc3QsIERlY29kZVRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiRGVjb2RlcyBpbnB1dCBmaWxlIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgdWludDMyX3Qgc3RyZWFtSW5kZXggPSBHZXRQYXJhbSgpLmZpcnN0OworICAgIGJvb2wgc2lnbmFsRU9TID0gR2V0UGFyYW0oKS5zZWNvbmQ7CisgICAgY2hhciBtVVJMWzUxMl0sIGluZm9bNTEyXTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbSwgZWxlSW5mbzsKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgc3RyY3B5KGluZm8sIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwsIGluZm8sIHN0cmVhbUluZGV4KTsKKworICAgIGVsZUluZm8ub3BlbihpbmZvKTsKKyAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpIDw8IG1VUkwgPDwgIiAtIGZpbGUgbm90IGZvdW5kIjsKKyAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiBJbmZvOworICAgIGludCBieXRlc0NvdW50ID0gMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgdWludDMyX3QgdGltZXN0YW1wID0gMDsKKyAgICBtVGltZXN0YW1wRGV2VGVzdCA9IHRydWU7CisgICAgbUZsdXNoZWRJbmRpY2VzLmNsZWFyKCk7CisgICAgbVRpbWVzdGFtcFVzbGlzdC5jbGVhcigpOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOworICAgICAgICBlbGVJbmZvID4+IGZsYWdzOworICAgICAgICBlbGVJbmZvID4+IHRpbWVzdGFtcDsKKyAgICAgICAgYm9vbCBjb2RlY0NvbmZpZyA9IGZsYWdzID8KKyAgICAgICAgICAgICgoMSA8PCAoZmxhZ3MgLSAxKSkgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDAgOiAwOworICAgICAgICBpZiAobVRpbWVzdGFtcERldlRlc3QgJiYgIWNvZGVjQ29uZmlnKQorICAgICAgICAgICAgbVRpbWVzdGFtcFVzbGlzdC5wdXNoX2JhY2sodGltZXN0YW1wKTsKKyAgICAgICAgSW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICB9CisgICAgZWxlSW5mby5jbG9zZSgpOworCisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICAvLyBSZXNldCB0b3RhbCBubyBvZiBmcmFtZXMgcmVjZWl2ZWQKKyAgICBtRnJhbWVzUmVjZWl2ZWQgPSAwOworICAgIG1UaW1lc3RhbXBVcyA9IDA7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGRlY29kZU5GcmFtZXMoCisgICAgICAgIG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUZsdXNoZWRJbmRpY2VzLAorICAgICAgICBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgMCwgKGludClJbmZvLnNpemUoKSwgc2lnbmFsRU9TKSk7CisKKyAgICAvLyBJZiBFT1MgaXMgbm90IHNlbnQsIHNlbmRpbmcgZW1wdHkgaW5wdXQgd2l0aCBFT1MgZmxhZworICAgIHNpemVfdCBpbmZvU2l6ZSA9IEluZm8uc2l6ZSgpOworICAgIGlmICghc2lnbmFsRU9TKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIDEpKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICB0ZXN0SW5wdXRCdWZmZXIobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNLCBmYWxzZSkpOworICAgICAgICBpbmZvU2l6ZSArPSAxOworICAgIH0KKyAgICAvLyBibG9ja2luZyBjYWxsIHRvIGVuc3VyZXMgYXBwbGljYXRpb24gdG8gV2FpdCB0aWxsIGFsbCB0aGUgaW5wdXRzIGFyZQorICAgIC8vIGNvbnN1bWVkCisgICAgaWYgKCFtRW9zKSB7CisgICAgICAgIEFMT0dWKCJXYWl0aW5nIGZvciBpbnB1dCBjb25zdW1wdGlvbiIpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisgICAgfQorCisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgaWYgKG1GcmFtZXNSZWNlaXZlZCAhPSBpbmZvU2l6ZSkgeworICAgICAgICBBTE9HRSgiSW5wdXQgYnVmZmVyIGNvdW50IGFuZCBPdXRwdXQgYnVmZmVyIGNvdW50IG1pc21hdGNoIik7CisgICAgICAgIEFMT0dWKCJmcmFtZXNSZWNlaXZlZCA6ICVkIGlucHV0RnJhbWVzIDogJXp1IiwgbUZyYW1lc1JlY2VpdmVkLAorICAgICAgICAgICAgICBpbmZvU2l6ZSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisKKyAgICBpZiAobVRpbWVzdGFtcERldlRlc3QpIEVYUEVDVF9FUShtVGltZXN0YW1wVXNsaXN0LmVtcHR5KCksIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKy8vIERlY29kZVRlc3Qgd2l0aCBTdHJlYW1JbmRleCBhbmQgRU9TIC8gTm8gRU9TCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChTdHJlYW1JbmRleEFuZEVPUywgQ29kZWMyVmlkZW9EZWNEZWNvZGVUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoc3RkOjptYWtlX3BhaXIoMCwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoMCwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcigxLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcigxLCB0cnVlKSkpOworCisvLyBBZGFwdGl2ZSBUZXN0CitURVNUX0YoQ29kZWMyVmlkZW9EZWNIaWRsVGVzdCwgQWRhcHRpdmVEZWNvZGVUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIkFkYXB0aXZlIERlY29kZSBUZXN0Iik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIGlmICghKG1Db21wTmFtZSA9PSBhdmMgfHwgbUNvbXBOYW1lID09IGhldmMgfHwgbUNvbXBOYW1lID09IHZwOCB8fAorICAgICAgICAgIG1Db21wTmFtZSA9PSB2cDkgfHwgbUNvbXBOYW1lID09IG1wZWcyKSkKKyAgICAgICAgcmV0dXJuOworCisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICBtVGltZXN0YW1wRGV2VGVzdCA9IHRydWU7CisgICAgdWludDMyX3QgdGltZXN0YW1wT2Zmc2V0ID0gMDsKKyAgICB1aW50MzJfdCBvZmZzZXQgPSAwOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IFNUUkVBTV9DT1VOVCAqIDI7IGkrKykgeworICAgICAgICBjaGFyIG1VUkxbNTEyXSwgaW5mb1s1MTJdOworICAgICAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbSwgZWxlSW5mbzsKKworICAgICAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgICAgIHN0cmNweShpbmZvLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICAgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbywgaSAlIFNUUkVBTV9DT1VOVCk7CisKKyAgICAgICAgZWxlSW5mby5vcGVuKGluZm8pOworICAgICAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpIDw8IG1VUkwgPDwgIiAtIGZpbGUgbm90IGZvdW5kIjsKKyAgICAgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CisgICAgICAgIHVpbnQzMl90IHRpbWVzdGFtcE1heCA9IDA7CisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBpZiAoIShlbGVJbmZvID4+IGJ5dGVzQ291bnQpKSBicmVhazsKKyAgICAgICAgICAgIGVsZUluZm8gPj4gZmxhZ3M7CisgICAgICAgICAgICBlbGVJbmZvID4+IHRpbWVzdGFtcDsKKyAgICAgICAgICAgIHRpbWVzdGFtcCArPSB0aW1lc3RhbXBPZmZzZXQ7CisgICAgICAgICAgICBJbmZvLnB1c2hfYmFjayh7Ynl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcH0pOworICAgICAgICAgICAgYm9vbCBjb2RlY0NvbmZpZyA9IGZsYWdzID8KKyAgICAgICAgICAgICAgICAoKDEgPDwgKGZsYWdzIC0gMSkpICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwIDogMDsKKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgICAgICAgICAgaWYgKG1UaW1lc3RhbXBEZXZUZXN0ICYmICFjb2RlY0NvbmZpZykKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFVzbGlzdC5wdXNoX2JhY2sodGltZXN0YW1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aW1lc3RhbXBNYXggPCB0aW1lc3RhbXApIHRpbWVzdGFtcE1heCA9IHRpbWVzdGFtcDsKKyAgICAgICAgfQorICAgICAgICB0aW1lc3RhbXBPZmZzZXQgPSB0aW1lc3RhbXBNYXg7CisgICAgICAgIGVsZUluZm8uY2xvc2UoKTsKKworICAgICAgICAvLyBSZXNldCBUb3RhbCBmcmFtZXMgYmVmb3JlIHNlY29uZCBkZWNvZGUgbG9vcAorICAgICAgICAvLyBtRnJhbWVzUmVjZWl2ZWQgPSAwOworICAgICAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICBkZWNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0LCAoaW50KShJbmZvLnNpemUoKSAtIG9mZnNldCksIGZhbHNlKSk7CisKKyAgICAgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgICAgIG9mZnNldCA9IChpbnQpSW5mby5zaXplKCk7CisgICAgfQorCisgICAgLy8gU2VuZCBFT1MKKyAgICAvLyBUT0RPIEFkZCBmdW5jdGlvbiB0byBzZW5kIEVPUyB3b3JrIGl0ZW0KKyAgICBpbnQgbWF4UmV0cnkgPSAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgd2hpbGUgKCF3b3JrICYmIChtYXhSZXRyeSA8IE1BWF9SRVRSWSkpIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgaWYgKCFtV29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHdvcmsuc3dhcChtV29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgbVdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgICAgICBtYXhSZXRyeSsrOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gMDsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSAwOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKworICAgIC8vIGJsb2NraW5nIGNhbGwgdG8gZW5zdXJlcyBhcHBsaWNhdGlvbiB0byBXYWl0IHRpbGwgYWxsIHRoZSBpbnB1dHMgYXJlCisgICAgLy8gY29uc3VtZWQKKyAgICBBTE9HVigiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKworICAgIGlmIChtRnJhbWVzUmVjZWl2ZWQgIT0gKChJbmZvLnNpemUoKSkgKyAxKSkgeworICAgICAgICBBTE9HRSgiSW5wdXQgYnVmZmVyIGNvdW50IGFuZCBPdXRwdXQgYnVmZmVyIGNvdW50IG1pc21hdGNoIik7CisgICAgICAgIEFMT0dWKCJmcmFtZXNSZWNlaXZlZCA6ICVkIGlucHV0RnJhbWVzIDogJXp1IiwgbUZyYW1lc1JlY2VpdmVkLAorICAgICAgICAgICAgICBJbmZvLnNpemUoKSArIDEpOworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorCisgICAgaWYgKG1UaW1lc3RhbXBEZXZUZXN0KSBFWFBFQ1RfRVEobVRpbWVzdGFtcFVzbGlzdC5lbXB0eSgpLCB0cnVlKTsKK30KKworLy8gdGh1bWJuYWlsIHRlc3QKK1RFU1RfRihDb2RlYzJWaWRlb0RlY0hpZGxUZXN0LCBUaHVtYm5haWxUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3QgUmVxdWVzdCBmb3IgdGh1bWJuYWlsIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgY2hhciBtVVJMWzUxMl0sIGluZm9bNTEyXTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbSwgZWxlSW5mbzsKKworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBzdHJjcHkoaW5mbywgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbyk7CisKKyAgICBlbGVJbmZvLm9wZW4oaW5mbyk7CisgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiBJbmZvOworICAgIGludCBieXRlc0NvdW50ID0gMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgdWludDMyX3QgdGltZXN0YW1wID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoIShlbGVJbmZvID4+IGJ5dGVzQ291bnQpKSBicmVhazsKKyAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgZWxlSW5mbyA+PiB0aW1lc3RhbXA7CisgICAgICAgIEluZm8ucHVzaF9iYWNrKHtieXRlc0NvdW50LCBmbGFncywgdGltZXN0YW1wfSk7CisgICAgfQorICAgIGVsZUluZm8uY2xvc2UoKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTUFYX0lURVJBVElPTlM7IGkrKykgeworICAgICAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworCisgICAgICAgIC8vIHJlcXVlc3QgRU9TIGZvciB0aHVtYm5haWwKKyAgICAgICAgLy8gc2lnbmFsIEVPUyBmbGFnIHdpdGggbGFzdCBmcmFtZQorICAgICAgICBzaXplX3QgaiA9IC0xOworICAgICAgICBkbyB7CisgICAgICAgICAgICBqKys7CisgICAgICAgICAgICBmbGFncyA9IDA7CisgICAgICAgICAgICBpZiAoSW5mb1tqXS5mbGFncykgZmxhZ3MgPSAxdSA8PCAoSW5mb1tqXS5mbGFncyAtIDEpOworCisgICAgICAgIH0gd2hpbGUgKCEoZmxhZ3MgJiBTWU5DX0ZSQU1FKSk7CisgICAgICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZGVjb2RlTkZyYW1lcygKKyAgICAgICAgICAgIG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIDAsIGogKyAxKSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKyAgICAgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgICAgIEVYUEVDVF9HRShtRnJhbWVzUmVjZWl2ZWQsIDFVKTsKKyAgICAgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgICAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5yZWxlYXNlKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMlZpZGVvRGVjSGlkbFRlc3QsIEVPU1Rlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdCBlbXB0eSBpbnB1dCBidWZmZXIgd2l0aCBFT1MgZmxhZyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgIC8vIFByZXBhcmUgQzJXb3JrCisgICAgeworICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBpZiAoIW1Xb3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgd29yay5zd2FwKG1Xb3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICBtV29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJtV29ya1F1ZXVlIEVtcHR5IGF0IHRoZSBzdGFydCBvZiB0ZXN0IjsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisKKyAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gMDsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSAwOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKworICAgIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgaWYgKG1Xb3JrUXVldWUuc2l6ZSgpICE9IE1BWF9JTlBVVF9CVUZGRVJTKSB7CisgICAgICAgICAgICBtUXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobVdvcmtRdWV1ZS5zaXplKCksIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMlZpZGVvRGVjSGlkbFRlc3QsIEZsdXNoVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0cyBGbHVzaCBjYWxscyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBjaGFyIG1VUkxbNTEyXSwgaW5mb1s1MTJdOworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtLCBlbGVJbmZvOworCisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIHN0cmNweShpbmZvLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvKTsKKworICAgIGVsZUluZm8ub3BlbihpbmZvKTsKKyAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOworICAgICAgICBlbGVJbmZvID4+IGZsYWdzOworICAgICAgICBlbGVJbmZvID4+IHRpbWVzdGFtcDsKKyAgICAgICAgSW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICB9CisgICAgZWxlSW5mby5jbG9zZSgpOworCisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIC8vIERlY29kZSAxMjggZnJhbWVzIGFuZCBmbHVzaC4gaGVyZSAxMjggaXMgY2hvc2VuIHRvIGVuc3VyZSB0aGVyZSBpcyBhIGtleQorICAgIC8vIGZyYW1lIGFmdGVyIHRoaXMgc28gdGhhdCB0aGUgYmVsb3cgc2VjdGlvbiBjYW4gYmUgY292ZXJlZCBmb3IgYWxsCisgICAgLy8gY29tcG9uZW50cworICAgIHVpbnQzMl90IG51bUZyYW1lc0ZsdXNoZWQgPSAxMjg7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZGVjb2RlTkZyYW1lcygKKyAgICAgICAgbUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRmx1c2hlZEluZGljZXMsCisgICAgICAgIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sICZJbmZvLCAwLCBudW1GcmFtZXNGbHVzaGVkLCBmYWxzZSkpOworICAgIC8vIGZsdXNoCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBmbHVzaGVkV29yazsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdClNQVhfSU5QVVRfQlVGRkVSUyAtIGZsdXNoZWRXb3JrLnNpemUoKSkpOworCisgICAgeworICAgICAgICAvLyBVcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICBhdXRvIGZyYW1lSW5kZXhJdCA9CisgICAgICAgICAgICAgICAgc3RkOjpmaW5kKG1GbHVzaGVkSW5kaWNlcy5iZWdpbigpLCBtRmx1c2hlZEluZGljZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIFNlZWsgdG8gbmV4dCBrZXkgZnJhbWUgYW5kIHN0YXJ0IGRlY29kaW5nIHRpbGwgdGhlIGVuZAorICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIGludCBpbmRleCA9IG51bUZyYW1lc0ZsdXNoZWQ7CisgICAgYm9vbCBrZXlGcmFtZSA9IGZhbHNlOworICAgIGZsYWdzID0gMDsKKyAgICB3aGlsZSAoaW5kZXggPCAoaW50KUluZm8uc2l6ZSgpKSB7CisgICAgICAgIGlmIChJbmZvW2luZGV4XS5mbGFncykgZmxhZ3MgPSAxdSA8PCAoSW5mb1tpbmRleF0uZmxhZ3MgLSAxKTsKKyAgICAgICAgaWYgKChmbGFncyAmIFNZTkNfRlJBTUUpID09IFNZTkNfRlJBTUUpIHsKKyAgICAgICAgICAgIGtleUZyYW1lID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGZsYWdzID0gMDsKKyAgICAgICAgZWxlU3RyZWFtLmlnbm9yZShJbmZvW2luZGV4XS5ieXRlc0NvdW50KTsKKyAgICAgICAgaW5kZXgrKzsKKyAgICB9CisgICAgaWYgKGtleUZyYW1lKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgZGVjb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KUluZm8uc2l6ZSgpIC0gaW5kZXgpKTsKKyAgICB9CisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgZXJyID0gbUNvbXBvbmVudC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMgLSBmbHVzaGVkV29yay5zaXplKCkpKTsKKyAgICB7CisgICAgICAgIC8vIFVwZGF0ZSBtRmx1c2hlZEluZGljZXMgYmFzZWQgb24gdGhlIGluZGV4IHJlY2VpdmVkIGZyb20gZmx1c2goKQorICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogZmx1c2hlZFdvcmspIHsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD46Oml0ZXJhdG9yIGZyYW1lSW5kZXhJdCA9IHN0ZDo6ZmluZCgKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLCBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRmx1c2hlZEluZGljZXMuZW1wdHkoKSwgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyVmlkZW9EZWNIaWRsVGVzdCwgRGVjb2RlVGVzdEVtcHR5QnVmZmVyc0luc2VydGVkKSB7CisgICAgZGVzY3JpcHRpb24oIkRlY29kZSB3aXRoIG11bHRpcGxlIGVtcHR5IGlucHV0IGZyYW1lcyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW0sIGVsZUluZm87CisKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgc3RyY3B5KGluZm8sIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwsIGluZm8pOworCisgICAgZWxlSW5mby5vcGVuKGluZm8pOworICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSkgPDwgbVVSTCA8PCAiIC0gZmlsZSBub3QgZm91bmQiOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgIHVpbnQzMl90IGZyYW1lSWQgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIGJvb2wgY29kZWNDb25maWcgPSBmYWxzZTsKKyAgICAvLyBUaGlzIHRlc3QgaW50cm9kdWNlcyBlbXB0eSBDU0QgYWZ0ZXIgZXZlcnkgMjB0aCBmcmFtZQorICAgIC8vIGFuZCBlbXB0eSBpbnB1dCBmcmFtZXMgYXQgYW4gaW50ZXJ2YWwgb2YgNSBmcmFtZXMuCisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCEoZnJhbWVJZCAlIDUpKSB7CisgICAgICAgICAgICBpZiAoIShmcmFtZUlkICUgMjApKSBmbGFncyA9IDMyOworICAgICAgICAgICAgZWxzZSBmbGFncyA9IDA7CisgICAgICAgICAgICBieXRlc0NvdW50ID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOworICAgICAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOworICAgICAgICAgICAgY29kZWNDb25maWcgPSBmbGFncyA/CisgICAgICAgICAgICAgICAgKCgxIDw8IChmbGFncyAtIDEpKSAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMCA6IDA7CisgICAgICAgIH0KKyAgICAgICAgSW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICAgICAgZnJhbWVJZCsrOworICAgIH0KKyAgICBlbGVJbmZvLmNsb3NlKCk7CisKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkZWNvZGVORnJhbWVzKAorICAgICAgICBtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIG1GbHVzaGVkSW5kaWNlcywKKyAgICAgICAgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIDAsIChpbnQpSW5mby5zaXplKCkpKTsKKworICAgIC8vIGJsb2NraW5nIGNhbGwgdG8gZW5zdXJlcyBhcHBsaWNhdGlvbiB0byBXYWl0IHRpbGwgYWxsIHRoZSBpbnB1dHMgYXJlCisgICAgLy8gY29uc3VtZWQKKyAgICBpZiAoIW1Fb3MpIHsKKyAgICAgICAgQUxPR1YoIldhaXRpbmcgZm9yIGlucHV0IGNvbnN1bXB0aW9uIik7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKyAgICB9CisKKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBpZiAobUZyYW1lc1JlY2VpdmVkICE9IEluZm8uc2l6ZSgpKSB7CisgICAgICAgIEFMT0dFKCJJbnB1dCBidWZmZXIgY291bnQgYW5kIE91dHB1dCBidWZmZXIgY291bnQgbWlzbWF0Y2giKTsKKyAgICAgICAgQUxPR1YoImZyYW1lc1JlY2VpdmVkIDogJWQgaW5wdXRGcmFtZXMgOiAlenUiLCBtRnJhbWVzUmVjZWl2ZWQsCisgICAgICAgICAgICAgIEluZm8uc2l6ZSgpKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0KK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCisvLyBUT0RPIDogVmlkZW8gc3BlY2lmaWMgY29uZmlndXJhdGlvbiBUZXN0CitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGdFbnYtPmluaXQoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIExPRyhJTkZPKSA8PCAiQzIgVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9WdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9FbmNUZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9WdHNIaWRsQzJWMV8wVGFyZ2V0VmlkZW9FbmNUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmNmODQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL1Z0c0hpZGxDMlYxXzBUYXJnZXRWaWRlb0VuY1Rlc3QuY3BwCkBAIC0wLDAgKzEsNjk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJjb2RlYzJfaGlkbF9oYWxfdmlkZW9fZW5jX3Rlc3QiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgorCit1c2luZyBhbmRyb2lkOjpDMkFsbG9jYXRvcklvbjsKKworI2luY2x1ZGUgPFZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZS5oPgorI2luY2x1ZGUgIm1lZGlhX2MyX3ZpZGVvX2hpZGxfdGVzdF9jb21tb24uaCIKKyNpbmNsdWRlICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgiCisKK2NsYXNzIEdyYXBoaWNCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgeworcHVibGljOgorICBleHBsaWNpdCBHcmFwaGljQnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrKQorICAgICAgOiBDMkJ1ZmZlcih7YmxvY2stPnNoYXJlKEMyUmVjdChibG9jay0+d2lkdGgoKSwgYmxvY2stPmhlaWdodCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OkMyRmVuY2UoKSl9KSB7fQorfTsKKworc3RhdGljIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCogZ0VudiA9IG51bGxwdHI7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIENvZGVjMlZpZGVvRW5jSGlkbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgeworICAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIFN1cGVyOworCisgICBwdWJsaWM6CisgICAgOjpzdGQ6OnN0cmluZyBnZXRUZXN0Q2FzZUluZm8oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiA6OnN0ZDo6c3RyaW5nKCkgKworICAgICAgICAgICAgICAgICJDb21wb25lbnQ6ICIgKyBnRW52LT5nZXRDb21wb25lbnQoKS5jX3N0cigpICsgIiB8ICIgKworICAgICAgICAgICAgICAgICJJbnN0YW5jZTogIiArIGdFbnYtPmdldEluc3RhbmNlKCkuY19zdHIoKSArICIgfCAiICsKKyAgICAgICAgICAgICAgICAiUmVzOiAiICsgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKTsKKyAgICB9CisKKyAgICAvLyBnb29nbGUuY29kZWMyIFZpZGVvIHRlc3Qgc2V0dXAKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIFN1cGVyOjpTZXRVcCgpOworICAgICAgICBtRGlzYWJsZVRlc3QgPSBmYWxzZTsKKyAgICAgICAgQUxPR1YoIkNvZGVjMlZpZGVvRW5jSGlkbFRlc3QgU2V0VXAiKTsKKyAgICAgICAgbUNsaWVudCA9IGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkpOworICAgICAgICBBU1NFUlRfTkUobUNsaWVudCwgbnVsbHB0cik7CisgICAgICAgIG1MaXN0ZW5lci5yZXNldChuZXcgQ29kZWNMaXN0ZW5lcigKKyAgICAgICAgICAgIFt0aGlzXShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVXb3JrRG9uZSh3b3JrSXRlbXMpOworICAgICAgICAgICAgfSkpOworICAgICAgICBBU1NFUlRfTkUobUxpc3RlbmVyLCBudWxscHRyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSU5QVVRfQlVGRkVSUzsgKytpKSB7CisgICAgICAgICAgICBtV29ya1F1ZXVlLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrKTsKKyAgICAgICAgfQorICAgICAgICBtQ2xpZW50LT5jcmVhdGVDb21wb25lbnQoZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSwgbUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1Db21wb25lbnQpOworICAgICAgICBBU1NFUlRfTkUobUNvbXBvbmVudCwgbnVsbHB0cik7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IHN0b3JlID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OkdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICAgICAgQ0hFQ0tfRVEoc3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfR1JBUEhJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtR3JhcGhpY0FsbG9jYXRvciksCisgICAgICAgICAgICAgICAgIEMyX09LKTsKKyAgICAgICAgbUdyYXBoaWNQb29sID0gc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4obUdyYXBoaWNBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xJZCsrKTsKKyAgICAgICAgQVNTRVJUX05FKG1HcmFwaGljUG9vbCwgbnVsbHB0cik7CisKKyAgICAgICAgbUNvbXBOYW1lID0gdW5rbm93bl9jb21wOworICAgICAgICBzdHJ1Y3QgU3RyaW5nVG9OYW1lIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIE5hbWU7CisgICAgICAgICAgICBzdGFuZGFyZENvbXAgQ29tcE5hbWU7CisgICAgICAgIH07CisKKyAgICAgICAgY29uc3QgU3RyaW5nVG9OYW1lIGtTdHJpbmdUb05hbWVbXSA9IHsKKyAgICAgICAgICAgIHsiaDI2MyIsIGgyNjN9LCB7ImF2YyIsIGF2Y30sIHsibXBlZzQiLCBtcGVnNH0sCisgICAgICAgICAgICB7ImhldmMiLCBoZXZjfSwgeyJ2cDgiLCB2cDh9LCB7InZwOSIsIHZwOX0sCisgICAgICAgIH07CisKKyAgICAgICAgY29uc3Qgc2l6ZV90IGtOdW1TdHJpbmdUb05hbWUgPQorICAgICAgICAgICAgc2l6ZW9mKGtTdHJpbmdUb05hbWUpIC8gc2l6ZW9mKGtTdHJpbmdUb05hbWVbMF0pOworCisgICAgICAgIC8vIEZpbmQgdGhlIGNvbXBvbmVudCB0eXBlCisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbXAgPSBzdGQ6OnN0cmluZyhnRW52LT5nZXRDb21wb25lbnQoKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bVN0cmluZ1RvTmFtZTsgKytpKSB7CisgICAgICAgICAgICBpZiAoc3RyY2FzZXN0cihjb21wLmNfc3RyKCksIGtTdHJpbmdUb05hbWVbaV0uTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBtQ29tcE5hbWUgPSBrU3RyaW5nVG9OYW1lW2ldLkNvbXBOYW1lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Fb3MgPSBmYWxzZTsKKyAgICAgICAgbUNzZCA9IGZhbHNlOworICAgICAgICBtRnJhbWVzUmVjZWl2ZWQgPSAwOworICAgICAgICBtRmFpbGVkV29ya1JlY2VpdmVkID0gMDsKKyAgICAgICAgbVRpbWVzdGFtcFVzID0gMHU7CisgICAgICAgIG1UaW1lc3RhbXBEZXZUZXN0ID0gZmFsc2U7CisgICAgICAgIGlmIChtQ29tcE5hbWUgPT0gdW5rbm93bl9jb21wKSBtRGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICBpZiAobURpc2FibGVUZXN0KSBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IERpc2FibGVkIFxuIjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQ29tcG9uZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmICg6OnRlc3Rpbmc6OlRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47CisgICAgICAgICAgICBtQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQ29tcG9uZW50ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBTdXBlcjo6VGVhckRvd24oKTsKKyAgICB9CisKKyAgICBib29sIHNldHVwQ29uZmlnUGFyYW0oaW50MzJfdCBuV2lkdGgsIGludDMyX3QgbkhlaWdodCk7CisKKyAgICAvLyBjYWxsYmFjayBmdW5jdGlvbiB0byBwcm9jZXNzIG9uV29ya0RvbmUgcmVjZWl2ZWQgYnkgTGlzdGVuZXIKKyAgICB2b2lkIGhhbmRsZVdvcmtEb25lKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgeworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogd29ya0l0ZW1zKSB7CisgICAgICAgICAgICBpZiAoIXdvcmstPndvcmtsZXRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBGb3IgZW5jb2RlciBjb21wb25lbnRzIGN1cnJlbnQgdGltZXN0YW1wIGFsd2F5cyBleGNlZWRzCisgICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgdGltZXN0YW1wCisgICAgICAgICAgICAgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgICAgICAgICAgICAgIGlmICghbVRpbWVzdGFtcFVzbGlzdC5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIEVYUEVDVF9HRSgod29yay0+d29ya2xldHMuZnJvbnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBVcyk7CisgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBVcyA9IHdvcmstPndvcmtsZXRzLmZyb250KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCk7CisgICAgICAgICAgICAgICAgICAgIC8vIEN1cnJlbnRseSB0aGlzIGxvY2sgaXMgcmVkdW5kYW50IGFzIG5vIG1UaW1lc3RhbXBVc2xpc3QgaXMgb25seSBpbml0aWFsaXplZAorICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgcXVldWluZyBhbnkgd29yayB0byBjb21wb25lbnQuIE9uY2UgQWRhcHRpdmVUZXN0IGlzIGFkZGVkIHNpbWlsYXIgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG9uZSBpbiB2aWRlbyBkZWNvZGVycywgdGhpcyBpcyBuZWVkZWQuCisgICAgICAgICAgICAgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1UaW1lc3RhbXBEZXZUZXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRzSGl0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBpdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFVzbGlzdC5iZWdpbigpOworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGl0ICE9IG1UaW1lc3RhbXBVc2xpc3QuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKml0ID09IG1UaW1lc3RhbXBVcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wVXNsaXN0LmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHNIaXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0c0hpdCA9PSBmYWxzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVGltZXN0YW1wVXNsaXN0LmVtcHR5KCkgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhQRUNUX0VRKHRzSGl0LCB0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlRpbWVTdGFtcCBub3QgcmVjb2duaXplZCI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjb3V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiWyAgIElORk8gICBdIFJlY2VpdmVkIG5vbi16ZXJvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXQgLyBUaW1lU3RhbXAgbm90IHJlY29nbml6ZWQgXG4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICh3b3JrLT5yZXN1bHQgIT0gQzJfT0spIG1GYWlsZWRXb3JrUmVjZWl2ZWQrKzsKKyAgICAgICAgICAgICAgICB3b3JrRG9uZShtQ29tcG9uZW50LCB3b3JrLCBtRmx1c2hlZEluZGljZXMsIG1RdWV1ZUxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRW9zLCBtQ3NkLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNSZWNlaXZlZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbnVtIHN0YW5kYXJkQ29tcCB7CisgICAgICAgIGgyNjMsCisgICAgICAgIGF2YywKKyAgICAgICAgbXBlZzQsCisgICAgICAgIGhldmMsCisgICAgICAgIHZwOCwKKyAgICAgICAgdnA5LAorICAgICAgICB1bmtub3duX2NvbXAsCisgICAgfTsKKworICAgIGJvb2wgbUVvczsKKyAgICBib29sIG1Dc2Q7CisgICAgYm9vbCBtRGlzYWJsZVRlc3Q7CisgICAgYm9vbCBtQ29uZmlnOworICAgIGJvb2wgbVRpbWVzdGFtcERldlRlc3Q7CisgICAgc3RhbmRhcmRDb21wIG1Db21wTmFtZTsKKyAgICB1aW50MzJfdCBtRnJhbWVzUmVjZWl2ZWQ7CisgICAgdWludDMyX3QgbUZhaWxlZFdvcmtSZWNlaXZlZDsKKyAgICB1aW50NjRfdCBtVGltZXN0YW1wVXM7CisKKyAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+IG1UaW1lc3RhbXBVc2xpc3Q7CisgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiBtRmx1c2hlZEluZGljZXM7CisKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBtQmxvY2tQb29sSWQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtR3JhcGhpY1Bvb2w7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtR3JhcGhpY0FsbG9jYXRvcjsKKworICAgIHN0ZDo6bXV0ZXggbVF1ZXVlTG9jazsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUXVldWVDb25kaXRpb247CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBtV29ya1F1ZXVlOworCisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudD4gbUNsaWVudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gbUNvbXBvbmVudDsKKworICAgcHJvdGVjdGVkOgorICAgIHN0YXRpYyB2b2lkIGRlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdGlvbikgeworICAgICAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgICAgfQorfTsKKwordm9pZCB2YWxpZGF0ZUNvbXBvbmVudCgKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgQ29kZWMyVmlkZW9FbmNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXBOYW1lLCBib29sJiBkaXNhYmxlVGVzdCkgeworICAgIC8vIFZhbGlkYXRlIGl0cyBhIEMyIENvbXBvbmVudAorICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJjMiIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFMT0dFKCJOb3QgYSBjMiBjb21wb25lbnQiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVmFsaWRhdGUgaXRzIG5vdCBhbiBlbmNvZGVyIGFuZCB0aGUgY29tcG9uZW50IHRvIGJlIHRlc3RlZCBpcyB2aWRlbworICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJkZWNvZGVyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0UoIkV4cGVjdGVkIEVuY29kZXIsIGdpdmVuIERlY29kZXIiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBjMl9zdGF0dXNfdCBjMmVyciA9CisgICAgICAgIGNvbXBvbmVudC0+cXVlcnkoe30sIHtDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6UEFSQU1fVFlQRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywgJnF1ZXJpZWQpOworICAgIGlmIChjMmVyciAhPSBDMl9PSyAmJiBxdWVyaWVkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJRdWVyeSBtZWRpYSB0eXBlIGZhaWxlZCA9PiAlZCIsIGMyZXJyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OnN0cmluZyBpbnB1dERvbWFpbiA9CisgICAgICAgICAgICAoKEMyU3RyZWFtTWVkaWFUeXBlU2V0dGluZzo6aW5wdXQqKXF1ZXJpZWRbMF0uZ2V0KCkpLT5tLnZhbHVlOworICAgICAgICBpZiAoaW5wdXREb21haW4uZmluZCgidmlkZW8vIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBWaWRlbyBDb21wb25lbnQiKTsKKyAgICAgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFZhbGlkYXRlcyBjb21wb25lbnQgbmFtZQorICAgIGlmIChjb21wTmFtZSA9PSBDb2RlYzJWaWRlb0VuY0hpZGxUZXN0Ojp1bmtub3duX2NvbXApIHsKKyAgICAgICAgQUxPR0UoIkNvbXBvbmVudCBJblZhbGlkIik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigiQ29tcG9uZW50IFZhbGlkIik7Cit9CisKKy8vIFNldCBEZWZhdWx0IGNvbmZpZyBwYXJhbS4KK2Jvb2wgQ29kZWMyVmlkZW9FbmNIaWRsVGVzdDo6c2V0dXBDb25maWdQYXJhbShpbnQzMl90IG5XaWR0aCwgaW50MzJfdCBuSGVpZ2h0KSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dCBpbnB1dFNpemUoMHUsIG5XaWR0aCwgbkhlaWdodCk7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IGNvbmZpZ1BhcmFteyZpbnB1dFNpemV9OworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgIG1Db21wb25lbnQtPmNvbmZpZyhjb25maWdQYXJhbSwgQzJfRE9OVF9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICBpZiAoc3RhdHVzID09IEMyX09LICYmIGZhaWx1cmVzLnNpemUoKSA9PSAwdSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBMb29rVXBUYWJsZSBvZiBjbGlwcyBmb3IgY29tcG9uZW50IHRlc3RpbmcKK3ZvaWQgR2V0VVJMRm9yQ29tcG9uZW50KGNoYXIqIFVSTCkgeworICAgIHN0cmNhdChVUkwsICJiYmJfMzUyeDI4OF80MjBwXzMwZnBzXzMyZnJhbWVzLnl1diIpOworfQorCit2b2lkIGVuY29kZU5GcmFtZXMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bXV0ZXggJnF1ZXVlTG9jaywgc3RkOjpjb25kaXRpb25fdmFyaWFibGUmIHF1ZXVlQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+JiBmbHVzaGVkSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBncmFwaGljUG9vbCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omlmc3RyZWFtJiBlbGVTdHJlYW0sIHVpbnQzMl90IGZyYW1lSUQsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbkZyYW1lcywgdWludDMyX3QgbldpZHRoLCBpbnQzMl90IG5IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgYm9vbCBmbHVzaGVkID0gZmFsc2UsYm9vbCBzaWduYWxFT1MgPSB0cnVlKSB7CisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworCisgICAgdWludDMyX3QgbWF4UmV0cnkgPSAwOworICAgIGludCBieXRlc0NvdW50ID0gbldpZHRoICogbkhlaWdodCAqIDMgPj4gMTsKKyAgICBpbnQzMl90IHRpbWVzdGFtcEluY3IgPSBFTkNPREVSX1RJTUVTVEFNUF9JTkNSRU1FTlQ7CisgICAgdWludDY0X3QgdGltZXN0YW1wID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAobkZyYW1lcyA9PSAwKSBicmVhazsKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgICAgICAvLyBQcmVwYXJlIEMyV29yaworICAgICAgICB3aGlsZSAoIXdvcmsgJiYgKG1heFJldHJ5IDwgTUFYX1JFVFJZKSkgeworICAgICAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICAgICAgaWYgKCF3b3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHdvcmsuc3dhcCh3b3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICAgICAgd29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBxdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgICAgICAgICAgbWF4UmV0cnkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXdvcmsgJiYgKG1heFJldHJ5ID49IE1BWF9SRVRSWSkpIHsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAiV2FpdCBmb3IgZ2VuZXJhdGluZyBDMldvcmsgZXhjZWVkZWQgdGltZW91dCI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpZ25hbEVPUyAmJiAobkZyYW1lcyA9PSAxKSkKKyAgICAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIGlmIChmbHVzaGVkKSB7CisgICAgICAgICAgICBmbGFncyB8PSBTWU5DX0ZSQU1FOworICAgICAgICAgICAgZmx1c2hlZCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gdGltZXN0YW1wOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSBmcmFtZUlEOworICAgICAgICB7CisgICAgICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgICAgICBmbHVzaGVkSW5kaWNlcy5lbXBsYWNlX2JhY2soZnJhbWVJRCk7CisgICAgICAgIH0KKyAgICAgICAgY2hhciogZGF0YSA9IChjaGFyKiltYWxsb2MoYnl0ZXNDb3VudCk7CisgICAgICAgIEFTU0VSVF9ORShkYXRhLCBudWxscHRyKTsKKyAgICAgICAgbWVtc2V0KGRhdGEsIDAsIGJ5dGVzQ291bnQpOworICAgICAgICBpZiAoZWxlU3RyZWFtLmlzX29wZW4oKSkgeworICAgICAgICAgICAgZWxlU3RyZWFtLnJlYWQoZGF0YSwgYnl0ZXNDb3VudCk7CisgICAgICAgICAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmdjb3VudCgpLCBieXRlc0NvdW50KTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrOworICAgICAgICBBU1NFUlRfRVEoCisgICAgICAgICAgICBDMl9PSywKKyAgICAgICAgICAgIGdyYXBoaWNQb29sLT5mZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgICAgICBuV2lkdGgsIG5IZWlnaHQsIEhBTF9QSVhFTF9GT1JNQVRfWVYxMiwKKyAgICAgICAgICAgICAgICB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX0sICZibG9jaykpOworICAgICAgICBBU1NFUlRfVFJVRShibG9jayk7CisgICAgICAgIC8vIEdyYXBoaWMgVmlldworICAgICAgICBDMkdyYXBoaWNWaWV3IHZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQzJHcmFwaGljQmxvY2s6Om1hcCgpIGZhaWxlZCA6ICVkIiwgdmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgdWludDhfdCogcFkgPSB2aWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgICAgIHVpbnQ4X3QqIHBVID0gdmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgICAgICB1aW50OF90KiBwViA9IHZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKworICAgICAgICBtZW1jcHkocFksIGRhdGEsIG5XaWR0aCAqIG5IZWlnaHQpOworICAgICAgICBtZW1jcHkocFUsIGRhdGEgKyBuV2lkdGggKiBuSGVpZ2h0LCAobldpZHRoICogbkhlaWdodCA+PiAyKSk7CisgICAgICAgIG1lbWNweShwViwgZGF0YSArIChuV2lkdGggKiBuSGVpZ2h0ICogNSA+PiAyKSwgbldpZHRoICogbkhlaWdodCA+PiAyKTsKKworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wbGFjZV9iYWNrKG5ldyBHcmFwaGljQnVmZmVyKGJsb2NrKSk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKyAgICAgICAgZnJlZShkYXRhKTsKKworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgICAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKworICAgICAgICAvLyBETyBUSEUgRU5DT0RJTkcKKyAgICAgICAgQVNTRVJUX0VRKGNvbXBvbmVudC0+cXVldWUoJml0ZW1zKSwgQzJfT0spOworICAgICAgICBBTE9HVigiRnJhbWUgIyVkIHNpemUgPSAlZCBxdWV1ZWQiLCBmcmFtZUlELCBieXRlc0NvdW50KTsKKyAgICAgICAgbkZyYW1lcy0tOworICAgICAgICB0aW1lc3RhbXAgKz0gdGltZXN0YW1wSW5jcjsKKyAgICAgICAgZnJhbWVJRCsrOworICAgICAgICBtYXhSZXRyeSA9IDA7CisgICAgfQorfQorCitURVNUX0YoQ29kZWMyVmlkZW9FbmNIaWRsVGVzdCwgdmFsaWRhdGVDb21wTmFtZSkgeworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBBTE9HVigiQ2hlY2tzIGlmIHRoZSBnaXZlbiBjb21wb25lbnQgaXMgYSB2YWxpZCB2aWRlbyBjb21wb25lbnQiKTsKKyAgICB2YWxpZGF0ZUNvbXBvbmVudChtQ29tcG9uZW50LCBtQ29tcE5hbWUsIG1EaXNhYmxlVGVzdCk7CisgICAgQVNTRVJUX0VRKG1EaXNhYmxlVGVzdCwgZmFsc2UpOworfQorCitjbGFzcyBDb2RlYzJWaWRlb0VuY0VuY29kZVRlc3QgOiBwdWJsaWMgQ29kZWMyVmlkZW9FbmNIaWRsVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxib29sPiB7Cit9OworCitURVNUX1AoQ29kZWMyVmlkZW9FbmNFbmNvZGVUZXN0LCBFbmNvZGVUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIkVuY29kZXMgaW5wdXQgZmlsZSIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIGNoYXIgbVVSTFs1MTJdOworICAgIGludDMyX3QgbldpZHRoID0gRU5DX0RFRkFVTFRfRlJBTUVfV0lEVEg7CisgICAgaW50MzJfdCBuSGVpZ2h0ID0gRU5DX0RFRkFVTFRfRlJBTUVfSEVJR0hUOworICAgIGJvb2wgc2lnbmFsRU9TID0gR2V0UGFyYW0oKTsKKworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobVVSTCk7CisKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbTsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKSA8PCBtVVJMIDw8ICIgZmlsZSBub3QgZm91bmQiOworICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKworICAgIG1UaW1lc3RhbXBVcyA9IDA7CisgICAgbVRpbWVzdGFtcERldlRlc3QgPSB0cnVlOworICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIG1UaW1lc3RhbXBVc2xpc3QuY2xlYXIoKTsKKyAgICB1aW50MzJfdCBpbnB1dEZyYW1lcyA9IEVOQ19OVU1fRlJBTUVTOworICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CisgICAgLy8gQWRkIGlucHV0IHRpbWVzdGFtcCB0byB0aW1lc3RhbXBVc2xpc3QKKyAgICB3aGlsZSAoaW5wdXRGcmFtZXMpIHsKKyAgICAgICAgaWYgKG1UaW1lc3RhbXBEZXZUZXN0KSBtVGltZXN0YW1wVXNsaXN0LnB1c2hfYmFjayh0aW1lc3RhbXApOworICAgICAgICB0aW1lc3RhbXAgKz0gRU5DT0RFUl9USU1FU1RBTVBfSU5DUkVNRU5UOworICAgICAgICBpbnB1dEZyYW1lcy0tOworICAgIH0KKyAgICBpZiAoIXNldHVwQ29uZmlnUGFyYW0obldpZHRoLCBuSGVpZ2h0KSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUdyYXBoaWNQb29sLCBlbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgMCwgRU5DX05VTV9GUkFNRVMsIG5XaWR0aCwgbkhlaWdodCwgZmFsc2UsIHNpZ25hbEVPUykpOworCisgICAgLy8gSWYgRU9TIGlzIG5vdCBzZW50LCBzZW5kaW5nIGVtcHR5IGlucHV0IHdpdGggRU9TIGZsYWcKKyAgICBpbnB1dEZyYW1lcyA9IEVOQ19OVU1fRlJBTUVTOworICAgIGlmICghc2lnbmFsRU9TKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIDEpKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICB0ZXN0SW5wdXRCdWZmZXIobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNLCBmYWxzZSkpOworICAgICAgICBpbnB1dEZyYW1lcyArPSAxOworICAgIH0KKworICAgIC8vIGJsb2NraW5nIGNhbGwgdG8gZW5zdXJlcyBhcHBsaWNhdGlvbiB0byBXYWl0IHRpbGwgYWxsIHRoZSBpbnB1dHMgYXJlCisgICAgLy8gY29uc3VtZWQKKyAgICBBTE9HRCgiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKworICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIGlmIChtRnJhbWVzUmVjZWl2ZWQgIT0gaW5wdXRGcmFtZXMpIHsKKyAgICAgICAgQUxPR0UoIklucHV0IGJ1ZmZlciBjb3VudCBhbmQgT3V0cHV0IGJ1ZmZlciBjb3VudCBtaXNtYXRjaCIpOworICAgICAgICBBTE9HRSgiZnJhbWVzUmVjZWl2ZWQgOiAlZCBpbnB1dEZyYW1lcyA6ICVkIiwgbUZyYW1lc1JlY2VpdmVkLAorICAgICAgICAgICAgICBpbnB1dEZyYW1lcyk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisKKyAgICBpZiAoIW1Dc2QgJiYgKG1Db21wTmFtZSAhPSB2cDggJiYgbUNvbXBOYW1lICE9IHZwOSkpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJDU0QgQnVmZmVyIG5vdCByZWNlaXZlZCI7CisgICAgfQorCisgICAgaWYgKG1Dc2QgJiYgKG1Db21wTmFtZSA9PSB2cDggfHwgbUNvbXBOYW1lID09IHZwOSkpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJDU0QgQnVmZmVyIG5vdCBleHBlY3RlZCI7CisgICAgfQorCisgICAgaWYgKG1UaW1lc3RhbXBEZXZUZXN0KSBFWFBFQ1RfRVEobVRpbWVzdGFtcFVzbGlzdC5lbXB0eSgpLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKKy8vIEVuY29kZVRlc3Qgd2l0aCBFT1MgLyBObyBFT1MKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEVuY29kZVRlc3R3aXRoRU9TLCBDb2RlYzJWaWRlb0VuY0VuY29kZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyh0cnVlLCBmYWxzZSkpOworCitURVNUX0YoQ29kZWMyVmlkZW9FbmNIaWRsVGVzdCwgRU9TVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0IGVtcHR5IGlucHV0IGJ1ZmZlciB3aXRoIEVPUyBmbGFnIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICB7CisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGlmICghbVdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICB3b3JrLnN3YXAobVdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgIG1Xb3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgibVdvcmtRdWV1ZSBFbXB0eSBpcyBub3QgZXhwZWN0ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXN0Iik7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KUMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSAwOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IDA7CisgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+cXVldWUoJml0ZW1zKSwgQzJfT0spOworICAgIHVpbnQzMl90IHF1ZXVlU2l6ZTsKKyAgICB7CisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIHF1ZXVlU2l6ZSA9IG1Xb3JrUXVldWUuc2l6ZSgpOworICAgICAgICBpZiAocXVldWVTaXplIDwgTUFYX0lOUFVUX0JVRkZFUlMpIHsKKyAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMlZpZGVvRW5jSGlkbFRlc3QsIEZsdXNoVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0IFJlcXVlc3QgZm9yIGZsdXNoIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIGNoYXIgbVVSTFs1MTJdOworICAgIGludDMyX3QgbldpZHRoID0gRU5DX0RFRkFVTFRfRlJBTUVfV0lEVEg7CisgICAgaW50MzJfdCBuSGVpZ2h0ID0gRU5DX0RFRkFVTFRfRlJBTUVfSEVJR0hUOworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobVVSTCk7CisKKyAgICBpZiAoIXNldHVwQ29uZmlnUGFyYW0obldpZHRoLCBuSGVpZ2h0KSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICAvLyBTZXR0aW5nIGRlZmF1bHQgY29uZmlndXJhdGlvbgorICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtOworICAgIHVpbnQzMl90IG51bUZyYW1lc0ZsdXNoZWQgPSAxMDsKKyAgICB1aW50MzJfdCBudW1GcmFtZXMgPSBFTkNfTlVNX0ZSQU1FUzsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUdyYXBoaWNQb29sLCBlbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgMCwgbnVtRnJhbWVzRmx1c2hlZCwgbldpZHRoLCBuSGVpZ2h0KSk7CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBmbHVzaGVkV29yazsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAoc2l6ZV90KU1BWF9JTlBVVF9CVUZGRVJTIC0gZmx1c2hlZFdvcmsuc2l6ZSgpKSk7CisgICAgdWludDY0X3QgZnJhbWVJbmRleDsKKyAgICB7CisgICAgICAgIC8vVXBkYXRlIG1GbHVzaGVkSW5kaWNlcyBiYXNlZCBvbiB0aGUgaW5kZXggcmVjZWl2ZWQgZnJvbSBmbHVzaCgpCisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiBmbHVzaGVkV29yaykgeworICAgICAgICAgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgICAgICAgICAgZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90Pjo6aXRlcmF0b3IgZnJhbWVJbmRleEl0ID0gc3RkOjpmaW5kKAorICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5iZWdpbigpLCBtRmx1c2hlZEluZGljZXMuZW5kKCksIGZyYW1lSW5kZXgpOworICAgICAgICAgICAgaWYgKCFtRmx1c2hlZEluZGljZXMuZW1wdHkoKSAmJgorICAgICAgICAgICAgICAgIChmcmFtZUluZGV4SXQgIT0gbUZsdXNoZWRJbmRpY2VzLmVuZCgpKSkgeworICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5lcmFzZShmcmFtZUluZGV4SXQpOworICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbUZsdXNoZWRJbmRpY2VzLmNsZWFyKCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUdyYXBoaWNQb29sLCBlbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzRmx1c2hlZCwgbnVtRnJhbWVzIC0gbnVtRnJhbWVzRmx1c2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICBuV2lkdGgsIG5IZWlnaHQsIHRydWUpKTsKKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAoc2l6ZV90KU1BWF9JTlBVVF9CVUZGRVJTIC0gZmx1c2hlZFdvcmsuc2l6ZSgpKSk7CisgICAgeworICAgICAgICAvL1VwZGF0ZSBtRmx1c2hlZEluZGljZXMgYmFzZWQgb24gdGhlIGluZGV4IHJlY2VpdmVkIGZyb20gZmx1c2goKQorICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogZmx1c2hlZFdvcmspIHsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICAgICAgICAgIGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD46Oml0ZXJhdG9yIGZyYW1lSW5kZXhJdCA9IHN0ZDo6ZmluZCgKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLCBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRmx1c2hlZEluZGljZXMuZW1wdHkoKSwgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyVmlkZW9FbmNIaWRsVGVzdCwgSW52YWxpZEJ1ZmZlclRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdHMgZmVlZGluZyBsYXJnZXIvc21hbGxlciBpbnB1dCBidWZmZXIiKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbTsKKyAgICBpbnQzMl90IG5XaWR0aCA9IEVOQ19ERUZBVUxUX0ZSQU1FX1dJRFRIIC8gMjsKKyAgICBpbnQzMl90IG5IZWlnaHQgPSBFTkNfREVGQVVMVF9GUkFNRV9IRUlHSFQgLyAyOworCisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG5XaWR0aCwgbkhlaWdodCkpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkIFxuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUdyYXBoaWNQb29sLCBlbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgbldpZHRoLCBuSGVpZ2h0LCBmYWxzZSwgZmFsc2UpKTsKKworICAgIC8vIEZlZWQgbGFyZ2VyIGlucHV0IGJ1ZmZlci4KKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtR3JhcGhpY1Bvb2wsIGVsZVN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAxLCAxLCBuV2lkdGgqMiwgbkhlaWdodCoyLCBmYWxzZSwgZmFsc2UpKTsKKworICAgIC8vIEZlZWQgc21hbGxlciBpbnB1dCBidWZmZXIuCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUdyYXBoaWNQb29sLCBlbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgMiwgMSwgbldpZHRoLzIsIG5IZWlnaHQvMiwgZmFsc2UsIHRydWUpKTsKKworICAgIC8vIGJsb2NraW5nIGNhbGwgdG8gZW5zdXJlcyBhcHBsaWNhdGlvbiB0byBXYWl0IHRpbGwgYWxsIHRoZSBpbnB1dHMgYXJlCisgICAgLy8gY29uc3VtZWQKKyAgICBBTE9HRCgiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKworICAgIGlmIChtRnJhbWVzUmVjZWl2ZWQgIT0gMykgeworICAgICAgICBBTE9HRSgiSW5wdXQgYnVmZmVyIGNvdW50IGFuZCBPdXRwdXQgYnVmZmVyIGNvdW50IG1pc21hdGNoIik7CisgICAgICAgIEFMT0dFKCJmcmFtZXNSZWNlaXZlZCA6ICVkIGlucHV0RnJhbWVzIDogMyIsIG1GcmFtZXNSZWNlaXZlZCk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisKKyAgICBpZiAobUZhaWxlZFdvcmtSZWNlaXZlZCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBmYWlsZWQgZnJhbWUgY291bnQgbWlzbWF0Y2giKTsKKyAgICAgICAgQUxPR0UoImZhaWxlZEZyYW1lc1JlY2VpdmVkIDogJWQiLCBtRmFpbGVkV29ya1JlY2VpdmVkKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0KKworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworY2xhc3MgQ29kZWMyVmlkZW9FbmNSZXNvbHV0aW9uVGVzdCA6IHB1YmxpYyBDb2RlYzJWaWRlb0VuY0hpZGxUZXN0LAorICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+ID4geworfTsKKworVEVTVF9QKENvZGVjMlZpZGVvRW5jUmVzb2x1dGlvblRlc3QsIFJlc29sdXRpb25UZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3RzIGVuY29kaW5nIGF0IGRpZmZlcmVudCByZXNvbHV0aW9ucyIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtOworICAgIGludDMyX3QgbldpZHRoID0gR2V0UGFyYW0oKS5maXJzdDsKKyAgICBpbnQzMl90IG5IZWlnaHQgPSBHZXRQYXJhbSgpLnNlY29uZDsKKyAgICBBTE9HRCgiVHJ5aW5nIGVuY29kZSBmb3Igd2lkdGggJWQgaGVpZ2h0ICVkIiwgbldpZHRoLCBuSGVpZ2h0KTsKKyAgICBtRW9zID0gZmFsc2U7CisKKyAgICBpZiAoIXNldHVwQ29uZmlnUGFyYW0obldpZHRoLCBuSGVpZ2h0KSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtR3JhcGhpY1Bvb2wsIGVsZVN0cmVhbSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICBNQVhfSU5QVVRfQlVGRkVSUywgbldpZHRoLCBuSGVpZ2h0KSk7CisKKyAgICBBTE9HRCgiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKworICAgIEFTU0VSVF9FUShtRW9zLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnJlc2V0KCksIEMyX09LKTsKK30KK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE5vblN0ZFNpemVzLCBDb2RlYzJWaWRlb0VuY1Jlc29sdXRpb25UZXN0LCA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICBzdGQ6Om1ha2VfcGFpcig1MiwgMTgpLAorICAgIHN0ZDo6bWFrZV9wYWlyKDM2NSwgMzY1KSwKKyAgICBzdGQ6Om1ha2VfcGFpcig0ODQsIDM2MiksCisgICAgc3RkOjptYWtlX3BhaXIoMjQ0LCA0ODgpKSk7CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgZ0VudiA9IG5ldyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBnRW52LT5pbml0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBMT0coSU5GTykgPDwgIkMyIFRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vbWVkaWFfYzJfdmlkZW9faGlkbF90ZXN0X2NvbW1vbi5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL21lZGlhX2MyX3ZpZGVvX2hpZGxfdGVzdF9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDQ1NTU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL21lZGlhX2MyX3ZpZGVvX2hpZGxfdGVzdF9jb21tb24uaApAQCAtMCwwICsxLDMxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9DMl9WSURFT19ISURMX1RFU1RfQ09NTU9OX0gKKyNkZWZpbmUgTUVESUFfQzJfVklERU9fSElETF9URVNUX0NPTU1PTl9ICisKKyNkZWZpbmUgRU5DT0RFUl9USU1FU1RBTVBfSU5DUkVNRU5UIDQwMDAwCisjZGVmaW5lIEVOQ19OVU1fRlJBTUVTIDMyCisjZGVmaW5lIEVOQ19ERUZBVUxUX0ZSQU1FX1dJRFRIIDM1MgorI2RlZmluZSBFTkNfREVGQVVMVF9GUkFNRV9IRUlHSFQgMjg4CisjZGVmaW5lIE1BWF9JVEVSQVRJT05TIDEyOAorCisvKgorICogQ29tbW9uIHZpZGVvIHV0aWxzCisgKi8KKworCisjZW5kaWYgIC8vIE1FRElBX0MyX1ZJREVPX0hJRExfVEVTVF9DT01NT05fSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDM4YTQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzOCBAQAorY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmNvZGVjMl9jbGllbnQiLAorCisgICAgc3JjczogWworICAgICAgICAiY2xpZW50LmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfaGlkbF9jbGllbnRAMS4wIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl9oaWRsX2NsaWVudEAxLjAiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgIF0sCisKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2NsaWVudC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvY2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWNhNGEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2NsaWVudC5jcHAKQEAgLTAsMCArMSwxNTAxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMkNsaWVudCIKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisKKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxndWkvYnVmZmVycXVldWUvMi4wL0IySEdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGd1aS9idWZmZXJxdWV1ZS8yLjAvSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50SW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudExpc3RlbmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudFN0b3JlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbmZpZ3VyYWJsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tYW5hZ2VyLzEuMi9JU2VydmljZU1hbmFnZXIuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6dXRpbHM7Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA7Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOworCit1c2luZyBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyMSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6CisgICAgICAgIFYxXzA6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit1c2luZyBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyMiA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6CisgICAgICAgIFYyXzA6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit1c2luZyBCMkhHcmFwaGljQnVmZmVyUHJvZHVjZXIyID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjoKKyAgICAgICAgVjJfMDo6dXRpbHM6OkIySEdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3VzaW5nIEgyQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjIgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OgorICAgICAgICBWMl8wOjp1dGlsczo6SDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKKy8vIGMyX3N0YXR1c190IHZhbHVlIHRoYXQgY29ycmVzcG9uZHMgdG8gaHdiaW5kZXIgdHJhbnNhY3Rpb24gZmFpbHVyZS4KK2NvbnN0ZXhwciBjMl9zdGF0dXNfdCBDMl9UUkFOU0FDVElPTl9GQUlMRUQgPSBDMl9DT1JSVVBURUQ7CisKKy8vIFNlYXJjaGVzIGZvciBhIG5hbWUgaW4gR2V0U2VydmljZU5hbWVzKCkgYW5kIHJldHVybnMgdGhlIGluZGV4IGZvdW5kLiBJZiB0aGUKKy8vIG5hbWUgaXMgbm90IGZvdW5kLCB0aGUgcmV0dXJuZWQgaW5kZXggd2lsbCBiZSBlcXVhbCB0bworLy8gR2V0U2VydmljZU5hbWVzKCkuc2l6ZSgpLgorc2l6ZV90IGdldFNlcnZpY2VJbmRleChjaGFyIGNvbnN0KiBuYW1lKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBuYW1lcyA9IENvZGVjMkNsaWVudDo6R2V0U2VydmljZU5hbWVzKCk7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGZvciAoOyBpIDwgbmFtZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKG5hbWUgPT0gbmFtZXNbaV0pIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpOworfQorCit9ICAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCisvLyBUaGlzIGNsYXNzIGNhY2hlcyBhIENvZGVjMkNsaWVudCBvYmplY3QgYW5kIGl0cyBjb21wb25lbnQgdHJhaXRzLiBUaGUgY2xpZW50CisvLyB3aWxsIGJlIGNyZWF0ZWQgdGhlIGZpcnN0IHRpbWUgaXQgaXMgbmVlZGVkLCBhbmQgaXQgY2FuIGJlIHJlZnJlc2hlZCBpZiB0aGUKKy8vIHNlcnZpY2UgZGllcyAoYnkgY2FsbGluZyBpbnZhbGlkYXRlKCkpLiBUaGUgZmlyc3QgdGltZSBsaXN0Q29tcG9uZW50cygpIGlzCisvLyBjYWxsZWQgZnJvbSB0aGUgY2xpZW50LCB0aGUgcmVzdWx0IHdpbGwgYmUgY2FjaGVkLgorY2xhc3MgQ29kZWMyQ2xpZW50OjpDYWNoZSB7CisgICAgLy8gQ2FjaGVkIGNsaWVudAorICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IG1DbGllbnQ7CisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1DbGllbnRNdXRleDsKKworICAgIC8vIENhY2hlZCBjb21wb25lbnQgdHJhaXRzCisgICAgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4gbVRyYWl0czsKKyAgICBzdGQ6Om9uY2VfZmxhZyBtVHJhaXRzSW5pdGlhbGl6YXRpb25GbGFnOworCisgICAgLy8gVGhlIGluZGV4IG9mIHRoZSBzZXJ2aWNlLiBUaGlzIGlzIGJhc2VkIG9uIEdldFNlcnZpY2VOYW1lcygpLgorICAgIHNpemVfdCBtSW5kZXg7CisgICAgLy8gQ2FsbGVkIGJ5IHMoKSBleGFjdGx5IG9uY2UgdG8gaW5pdGlhbGl6ZSB0aGUgY2FjaGUuIFRoZSBpbmRleCBtdXN0IGJlIGEKKyAgICAvLyB2YWxpZCBpbmRleCBpbnRvIHRoZSB2ZWN0b3IgcmV0dXJuZWQgYnkgR2V0U2VydmljZU5hbWVzKCkuIENhbGxpbmcKKyAgICAvLyBpbml0KGluZGV4KSB3aWxsIGFzc29jaWF0ZSB0aGUgY2FjaGUgdG8gdGhlIHNlcnZpY2Ugd2l0aCBuYW1lCisgICAgLy8gR2V0U2VydmljZU5hbWVzKClbaW5kZXhdLgorICAgIHZvaWQgaW5pdChzaXplX3QgaW5kZXgpIHsKKyAgICAgICAgbUluZGV4ID0gaW5kZXg7CisgICAgfQorCitwdWJsaWM6CisgICAgQ2FjaGUoKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBJbml0aWFsaXplcyBtQ2xpZW50IGlmIG5lZWRlZCwgdGhlbiByZXR1cm5zIG1DbGllbnQuCisgICAgLy8gSWYgdGhlIHNlcnZpY2UgaXMgdW5hdmFpbGFibGUgYnV0IGxpc3RlZCBpbiB0aGUgbWFuaWZlc3QsIHRoaXMgZnVuY3Rpb24KKyAgICAvLyB3aWxsIGJsb2NrIGluZGVmaW5pdGVseS4KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBnZXRDbGllbnQoKSB7CisgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttQ2xpZW50TXV0ZXh9OworICAgICAgICBpZiAoIW1DbGllbnQpIHsKKyAgICAgICAgICAgIG1DbGllbnQgPSBDb2RlYzJDbGllbnQ6Ol9DcmVhdGVGcm9tSW5kZXgobUluZGV4KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUNsaWVudDsKKyAgICB9CisKKyAgICAvLyBDYXVzZXMgYSBzdWJzZXF1ZW50IGNhbGwgdG8gZ2V0Q2xpZW50KCkgdG8gY3JlYXRlIGEgbmV3IGNsaWVudC4gVGhpcworICAgIC8vIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIHNlcnZpY2UgZGllcy4KKyAgICAvLworICAgIC8vIE5vdGU6IFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIG9ubHkgYnkgRm9yQWxsU2VydmljZXMoKS4KKyAgICB2b2lkIGludmFsaWRhdGUoKSB7CisgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttQ2xpZW50TXV0ZXh9OworICAgICAgICBtQ2xpZW50ID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICAvLyBSZXR1cm5zIGEgbGlzdCBvZiB0cmFpdHMgZm9yIGNvbXBvbmVudHMgc3VwcG9ydGVkIGJ5IHRoZSBzZXJ2aWNlLiBUaGlzCisgICAgLy8gbGlzdCBpcyBjYWNoZWQuCisgICAgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4gY29uc3QmIGdldFRyYWl0cygpIHsKKyAgICAgICAgc3RkOjpjYWxsX29uY2UobVRyYWl0c0luaXRpYWxpemF0aW9uRmxhZywgW3RoaXNdKCkgeworICAgICAgICAgICAgYm9vbCBzdWNjZXNze2ZhbHNlfTsKKyAgICAgICAgICAgIC8vIFNwaW4gdW50aWwgX2xpc3RDb21wb25lbnRzKCkgaXMgc3VjY2Vzc2Z1bC4KKyAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gY2xpZW50ID0gZ2V0Q2xpZW50KCk7CisgICAgICAgICAgICAgICAgbVRyYWl0cyA9IGNsaWVudC0+X2xpc3RDb21wb25lbnRzKCZzdWNjZXNzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOworICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgYXV0byBrU2VydmljZVJldHJ5UGVyaW9kID0gNXM7CisgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJGYWlsZWQgdG8gcmV0cmlldmUgY29tcG9uZW50IHRyYWl0cyBmcm9tIHNlcnZpY2UgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiIDw8IEdldFNlcnZpY2VOYW1lcygpW21JbmRleF0gPDwgIlwiLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZXRyeWluZy4uLiI7CisgICAgICAgICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKGtTZXJ2aWNlUmV0cnlQZXJpb2QpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIG1UcmFpdHM7CisgICAgfQorCisgICAgLy8gTGlzdCgpIHJldHVybnMgdGhlIGxpc3Qgb2YgYWxsIGNhY2hlcy4KKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8Q2FjaGU+JiBMaXN0KCkgeworICAgICAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8Q2FjaGU+IHNDYWNoZXN7W10oKSB7CisgICAgICAgICAgICBzaXplX3QgbnVtU2VydmljZXMgPSBHZXRTZXJ2aWNlTmFtZXMoKS5zaXplKCk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDYWNoZT4gY2FjaGVzKG51bVNlcnZpY2VzKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU2VydmljZXM7ICsraSkgeworICAgICAgICAgICAgICAgIGNhY2hlc1tpXS5pbml0KGkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGNhY2hlczsKKyAgICAgICAgfSgpfTsKKyAgICAgICAgcmV0dXJuIHNDYWNoZXM7CisgICAgfQorfTsKKworLy8gQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50CisKK2NvbnN0IEMyU3RyaW5nJiBDb2RlYzJDb25maWd1cmFibGVDbGllbnQ6OmdldE5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1OYW1lOworfQorCitDb2RlYzJDb25maWd1cmFibGVDbGllbnQ6OkNvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudCgKKyAgICAgICAgY29uc3Qgc3A8SUNvbmZpZ3VyYWJsZT4mIGJhc2UpCisgICAgICA6IG1CYXNle2Jhc2V9LAorICAgICAgICBtTmFtZXtbYmFzZV0oKSAtPiBDMlN0cmluZyB7CisgICAgICAgICAgICAgICAgQzJTdHJpbmcgb3V0TmFtZTsKKyAgICAgICAgICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBiYXNlLT5nZXROYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgWyZvdXROYW1lXShjb25zdCBoaWRsX3N0cmluZyYgbmFtZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dE5hbWUgPSBuYW1lLmNfc3RyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNTdGF0dXMuaXNPaygpID8gb3V0TmFtZSA6ICIiOworICAgICAgICAgICAgfSgpfSB7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudDo6cXVlcnkoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmc3RhY2tQYXJhbXMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgaGVhcFBhcmFtcykgY29uc3QgeworICAgIGhpZGxfdmVjPFBhcmFtSW5kZXg+IGluZGljZXMoCisgICAgICAgICAgICBzdGFja1BhcmFtcy5zaXplKCkgKyBoZWFwUGFyYW1JbmRpY2VzLnNpemUoKSk7CisgICAgc2l6ZV90IG51bUluZGljZXMgPSAwOworICAgIGZvciAoQzJQYXJhbSogY29uc3QmIHN0YWNrUGFyYW0gOiBzdGFja1BhcmFtcykgeworICAgICAgICBpZiAoIXN0YWNrUGFyYW0pIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicXVlcnkgLS0gbnVsbCBzdGFjayBwYXJhbSBlbmNvdW50ZXJlZC4iOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaW5kaWNlc1tudW1JbmRpY2VzKytdID0gc3RhdGljX2Nhc3Q8UGFyYW1JbmRleD4oc3RhY2tQYXJhbS0+aW5kZXgoKSk7CisgICAgfQorICAgIHNpemVfdCBudW1TdGFja0luZGljZXMgPSBudW1JbmRpY2VzOworICAgIGZvciAoY29uc3QgQzJQYXJhbTo6SW5kZXgmIGluZGV4IDogaGVhcFBhcmFtSW5kaWNlcykgeworICAgICAgICBpbmRpY2VzW251bUluZGljZXMrK10gPQorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtSW5kZXg+KHN0YXRpY19jYXN0PHVpbnQzMl90PihpbmRleCkpOworICAgIH0KKyAgICBpbmRpY2VzLnJlc2l6ZShudW1JbmRpY2VzKTsKKyAgICBpZiAoaGVhcFBhcmFtcykgeworICAgICAgICBoZWFwUGFyYW1zLT5yZXNlcnZlKGhlYXBQYXJhbXMtPnNpemUoKSArIG51bUluZGljZXMpOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbUJhc2UtPnF1ZXJ5KAorICAgICAgICAgICAgaW5kaWNlcywKKyAgICAgICAgICAgIG1heUJsb2NrID09IEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgIFsmc3RhdHVzLCAmbnVtU3RhY2tJbmRpY2VzLCAmc3RhY2tQYXJhbXMsIGhlYXBQYXJhbXNdKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywgY29uc3QgUGFyYW1zJiBwKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0sgJiYgc3RhdHVzICE9IEMyX0JBRF9JTkRFWCkgeworICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJxdWVyeSAtLSBjYWxsIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtUG9pbnRlcnM7CisgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVBhcmFtc0Jsb2IoJnBhcmFtUG9pbnRlcnMsIHApKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXJ5IC0tIGVycm9yIHdoaWxlIHBhcnNpbmcgcGFyYW1zLiI7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzaXplX3QgaSA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gcGFyYW1Qb2ludGVycy5iZWdpbigpOworICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gcGFyYW1Qb2ludGVycy5lbmQoKTsgKSB7CisgICAgICAgICAgICAgICAgICAgIEMyUGFyYW0qIHBhcmFtUG9pbnRlciA9ICppdDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG51bVN0YWNrSW5kaWNlcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC0tbnVtU3RhY2tJbmRpY2VzOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJhbVBvaW50ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgInF1ZXJ5IC0tIG51bGwgc3RhY2sgcGFyYW0uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IGkgPCBzdGFja1BhcmFtcy5zaXplKCkgJiYgIXN0YWNrUGFyYW1zW2ldOyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2k7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA+PSBzdGFja1BhcmFtcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJxdWVyeSAtLSB1bmV4cGVjdGVkIGVycm9yLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFja1BhcmFtc1tpXS0+aW5kZXgoKSAhPSBwYXJhbVBvaW50ZXItPmluZGV4KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgInF1ZXJ5IC0tIHBhcmFtIHNraXBwZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluZGV4ID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGFja1BhcmFtc1tpXS0+aW5kZXgoKSA8PCAiLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tQYXJhbXNbaSsrXS0+aW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdGFja1BhcmFtc1tpKytdLT51cGRhdGVGcm9tKCpwYXJhbVBvaW50ZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJxdWVyeSAtLSBwYXJhbSB1cGRhdGUgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbmRleCA9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcGFyYW1Qb2ludGVyLT5pbmRleCgpIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1Qb2ludGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJxdWVyeSAtLSBudWxsIGhlYXAgcGFyYW0uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoZWFwUGFyYW1zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJxdWVyeSAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1bmV4cGVjdGVkIGV4dHJhIHN0YWNrIHBhcmFtLiI7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBQYXJhbXMtPmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoKnBhcmFtUG9pbnRlcikpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVlcnkgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudDo6Y29uZmlnKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcykgeworICAgIFBhcmFtcyBoaWRsUGFyYW1zOworICAgIGlmICghY3JlYXRlUGFyYW1zQmxvYigmaGlkbFBhcmFtcywgcGFyYW1zKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjb25maWcgLS0gYmFkIGlucHV0LiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+Y29uZmlnKAorICAgICAgICAgICAgaGlkbFBhcmFtcywKKyAgICAgICAgICAgIG1heUJsb2NrID09IEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgIFsmc3RhdHVzLCAmcGFyYW1zLCBmYWlsdXJlc10oCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxTZXR0aW5nUmVzdWx0PiBmLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJhbXMmIG8pIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSyAmJiBzdGF0dXMgIT0gQzJfQkFEX0lOREVYKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgImNvbmZpZyAtLSBjYWxsIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNpemVfdCBpID0gZmFpbHVyZXMtPnNpemUoKTsKKyAgICAgICAgICAgICAgICBmYWlsdXJlcy0+cmVzaXplKGkgKyBmLnNpemUoKSk7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBTZXR0aW5nUmVzdWx0JiBzZiA6IGYpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFvYmpjcHkoJigqZmFpbHVyZXMpW2krK10sIHNmKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiY29uZmlnIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImludmFsaWQgU2V0dGluZ1Jlc3VsdCByZXR1cm5lZC4iOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghdXBkYXRlUGFyYW1zRnJvbUJsb2IocGFyYW1zLCBvKSkgeworICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJjb25maWcgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJmYWlsZWQgdG8gcGFyc2UgcmV0dXJuZWQgcGFyYW1zLiI7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjb25maWcgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudDo6cXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+KiBjb25zdCBwYXJhbXMpIGNvbnN0IHsKKyAgICAvLyBUT0RPOiBDYWNoZSBhbmQgcXVlcnkgcHJvcGVybHkhCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5xdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptaW4oKSwKKyAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKSwKKyAgICAgICAgICAgIFsmc3RhdHVzLCBwYXJhbXNdKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8UGFyYW1EZXNjcmlwdG9yPiYgcCkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgInF1ZXJ5U3VwcG9ydGVkUGFyYW1zIC0tIGNhbGwgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzaXplX3QgaSA9IHBhcmFtcy0+c2l6ZSgpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+cmVzaXplKGkgKyBwLnNpemUoKSk7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBQYXJhbURlc2NyaXB0b3ImIHNwIDogcCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW9iamNweSgmKCpwYXJhbXMpW2krK10sIHNwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVlcnlTdXBwb3J0ZWRQYXJhbXMgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiaW52YWxpZCByZXR1cm5lZCBQYXJhbURlc2NyaXB0b3IuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXJ5U3VwcG9ydGVkUGFyYW1zIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDb25maWd1cmFibGVDbGllbnQ6OnF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+JiBmaWVsZHMsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0IHsKKyAgICBoaWRsX3ZlYzxGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiBpbkZpZWxkcyhmaWVsZHMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoIW9iamNweSgmaW5GaWVsZHNbaV0sIGZpZWxkc1tpXSkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXJ5U3VwcG9ydGVkVmFsdWVzIC0tIGJhZCBpbnB1dCI7CisgICAgICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgICAgICB9CisgICAgfQorCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5xdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIGluRmllbGRzLAorICAgICAgICAgICAgbWF5QmxvY2sgPT0gQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgWyZzdGF0dXMsICZpbkZpZWxkcywgJmZpZWxkc10oCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5UmVzdWx0PiYgcikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgInF1ZXJ5U3VwcG9ydGVkVmFsdWVzIC0tIGNhbGwgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoci5zaXplKCkgIT0gZmllbGRzLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJxdWVyeVN1cHBvcnRlZFZhbHVlcyAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlucHV0IGFuZCBvdXRwdXQgbGlzdHMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYXZlIGRpZmZlcmVudCBzaXplcy4iOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFvYmpjcHkoJmZpZWxkc1tpXSwgaW5GaWVsZHNbaV0sIHJbaV0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJxdWVyeVN1cHBvcnRlZFZhbHVlcyAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHJldHVybmVkIHZhbHVlLiI7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJxdWVyeVN1cHBvcnRlZFZhbHVlcyAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLy8gQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OkhpZGxMaXN0ZW5lcgorc3RydWN0IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpIaWRsTGlzdGVuZXIgOiBwdWJsaWMgSUNvbXBvbmVudExpc3RlbmVyIHsKKyAgICBzdGQ6OndlYWtfcHRyPENvbXBvbmVudD4gY29tcG9uZW50OworICAgIHN0ZDo6d2Vha19wdHI8TGlzdGVuZXI+IGJhc2U7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbldvcmtEb25lKGNvbnN0IFdvcmtCdW5kbGUmIHdvcmtCdW5kbGUpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiB3b3JrSXRlbXM7CisgICAgICAgIGlmICghb2JqY3B5KCZ3b3JrSXRlbXMsIHdvcmtCdW5kbGUpKSB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJvbldvcmtEb25lIC0tIHJlY2VpdmVkIGNvcnJ1cHRlZCBXb3JrQnVuZGxlLiI7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisgICAgICAgIC8vIHJlbGVhc2UgaW5wdXQgYnVmZmVycyBwb3RlbnRpYWxseSBoZWxkIGJ5IHRoZSBjb21wb25lbnQgZnJvbSBxdWV1ZQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IHN0cm9uZ0NvbXBvbmVudCA9CisgICAgICAgICAgICAgICAgY29tcG9uZW50LmxvY2soKTsKKyAgICAgICAgaWYgKHN0cm9uZ0NvbXBvbmVudCkgeworICAgICAgICAgICAgc3Ryb25nQ29tcG9uZW50LT5oYW5kbGVPbldvcmtEb25lKHdvcmtJdGVtcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IGJhc2UubG9jaygpKSB7CisgICAgICAgICAgICBsaXN0ZW5lci0+b25Xb3JrRG9uZShjb21wb25lbnQsIHdvcmtJdGVtcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJvbldvcmtEb25lIC0tIGxpc3RlbmVyIGRpZWQuIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uVHJpcHBlZCgKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPFNldHRpbmdSZXN1bHQ+JiBzZXR0aW5nUmVzdWx0cykgb3ZlcnJpZGUgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gYzJTZXR0aW5nUmVzdWx0cygKKyAgICAgICAgICAgICAgICBzZXR0aW5nUmVzdWx0cy5zaXplKCkpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNldHRpbmdSZXN1bHRzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiBjMlNldHRpbmdSZXN1bHQ7CisgICAgICAgICAgICBpZiAoIW9iamNweSgmYzJTZXR0aW5nUmVzdWx0LCBzZXR0aW5nUmVzdWx0c1tpXSkpIHsKKyAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJvblRyaXBwZWQgLS0gcmVjZWl2ZWQgY29ycnVwdGVkIFNldHRpbmdSZXN1bHQuIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYzJTZXR0aW5nUmVzdWx0c1tpXSA9IHN0ZDo6bW92ZShjMlNldHRpbmdSZXN1bHQpOworICAgICAgICB9CisgICAgICAgIGlmIChzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBiYXNlLmxvY2soKSkgeworICAgICAgICAgICAgbGlzdGVuZXItPm9uVHJpcHBlZChjb21wb25lbnQsIGMyU2V0dGluZ1Jlc3VsdHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAib25UcmlwcGVkIC0tIGxpc3RlbmVyIGRpZWQuIjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uRXJyb3IoU3RhdHVzIHMsIHVpbnQzMl90IGVycm9yQ29kZSkgb3ZlcnJpZGUgeworICAgICAgICBMT0coREVCVUcpIDw8ICJvbkVycm9yIC0tIgorICAgICAgICAgICAgICAgICAgIDw8ICIgc3RhdHVzID0gIiA8PCBzCisgICAgICAgICAgICAgICAgICAgPDwgIiwgZXJyb3JDb2RlID0gIiA8PCBlcnJvckNvZGUKKyAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgIGlmIChzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+IGxpc3RlbmVyID0gYmFzZS5sb2NrKCkpIHsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vbkVycm9yKGNvbXBvbmVudCwgcyA9PSBTdGF0dXM6Ok9LID8KKyAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlIDogc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIm9uRXJyb3IgLS0gbGlzdGVuZXIgZGllZC4iOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25GcmFtZXNSZW5kZXJlZCgKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPFJlbmRlcmVkRnJhbWU+JiByZW5kZXJlZEZyYW1lcykgb3ZlcnJpZGUgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+IGxpc3RlbmVyID0gYmFzZS5sb2NrKCk7CisgICAgICAgIGlmICghbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIm9uRnJhbWVzUmVuZGVyZWQgLS0gbGlzdGVuZXIgZGllZC4iOworICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IFJlbmRlcmVkRnJhbWUmIHJlbmRlcmVkRnJhbWUgOiByZW5kZXJlZEZyYW1lcykgeworICAgICAgICAgICAgbGlzdGVuZXItPm9uRnJhbWVSZW5kZXJlZCgKKyAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWRGcmFtZS5idWZmZXJRdWV1ZUlkLAorICAgICAgICAgICAgICAgICAgICByZW5kZXJlZEZyYW1lLnNsb3RJZCwKKyAgICAgICAgICAgICAgICAgICAgcmVuZGVyZWRGcmFtZS50aW1lc3RhbXBOcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbklucHV0QnVmZmVyc1JlbGVhc2VkKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8SW5wdXRCdWZmZXI+JiBpbnB1dEJ1ZmZlcnMpIG92ZXJyaWRlIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiBsaXN0ZW5lciA9IGJhc2UubG9jaygpOworICAgICAgICBpZiAoIWxpc3RlbmVyKSB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJvbklucHV0QnVmZmVyc1JlbGVhc2VkIC0tIGxpc3RlbmVyIGRpZWQuIjsKKyAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBJbnB1dEJ1ZmZlciYgaW5wdXRCdWZmZXIgOiBpbnB1dEJ1ZmZlcnMpIHsKKyAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAib25JbnB1dEJ1ZmZlcnNSZWxlYXNlZCAtLSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJlY2VpdmVkIGRlYXRoIG5vdGlmaWNhdGlvbiBvZiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGlucHV0IGJ1ZmZlcjoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmcmFtZUluZGV4ID0gIiA8PCBpbnB1dEJ1ZmZlci5mcmFtZUluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgYnVmZmVySW5kZXggPSAiIDw8IGlucHV0QnVmZmVyLmFycmF5SW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgICAgICBsaXN0ZW5lci0+b25JbnB1dEJ1ZmZlckRvbmUoCisgICAgICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLmZyYW1lSW5kZXgsIGlucHV0QnVmZmVyLmFycmF5SW5kZXgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCit9OworCisvLyBDb2RlYzJDbGllbnQKK0NvZGVjMkNsaWVudDo6Q29kZWMyQ2xpZW50KGNvbnN0IHNwPElDb21wb25lbnRTdG9yZT4mIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2VydmljZUluZGV4KQorICAgICAgOiBDb25maWd1cmFibGV7CisgICAgICAgICAgICBbYmFzZV0oKSAtPiBzcDxJQ29uZmlndXJhYmxlPiB7CisgICAgICAgICAgICAgICAgUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiB0cmFuc1Jlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLT5nZXRDb25maWd1cmFibGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNSZXN1bHQuaXNPaygpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNwPElDb25maWd1cmFibGU+Pih0cmFuc1Jlc3VsdCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cjsKKyAgICAgICAgICAgIH0oKQorICAgICAgICB9LAorICAgICAgICBtQmFzZXtiYXNlfSwKKyAgICAgICAgbVNlcnZpY2VJbmRleHtzZXJ2aWNlSW5kZXh9IHsKKyAgICBSZXR1cm48c3A8SUNsaWVudE1hbmFnZXI+PiB0cmFuc1Jlc3VsdCA9IGJhc2UtPmdldFBvb2xDbGllbnRNYW5hZ2VyKCk7CisgICAgaWYgKCF0cmFuc1Jlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiZ2V0UG9vbENsaWVudE1hbmFnZXIgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUhvc3RQb29sTWFuYWdlciA9IHN0YXRpY19jYXN0PHNwPElDbGllbnRNYW5hZ2VyPj4odHJhbnNSZXN1bHQpOworICAgIH0KK30KKworc3A8Q29kZWMyQ2xpZW50OjpCYXNlPiBjb25zdCYgQ29kZWMyQ2xpZW50OjpnZXRCYXNlKCkgY29uc3QgeworICAgIHJldHVybiBtQmFzZTsKK30KKworc3RkOjpzdHJpbmcgY29uc3QmIENvZGVjMkNsaWVudDo6Z2V0U2VydmljZU5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldFNlcnZpY2VOYW1lcygpW21TZXJ2aWNlSW5kZXhdOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OmNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgY29uc3QgQzJTdHJpbmcmIG5hbWUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCkgeworCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIHNwPENvbXBvbmVudDo6SGlkbExpc3RlbmVyPiBoaWRsTGlzdGVuZXIgPSBuZXcgQ29tcG9uZW50OjpIaWRsTGlzdGVuZXJ7fTsKKyAgICBoaWRsTGlzdGVuZXItPmJhc2UgPSBsaXN0ZW5lcjsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+Y3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgIGhpZGxMaXN0ZW5lciwKKyAgICAgICAgICAgIENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCksCisgICAgICAgICAgICBbJnN0YXR1cywgY29tcG9uZW50LCBoaWRsTGlzdGVuZXJdKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudD4mIGMpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpjb21wb25lbnQgPSBzdGQ6Om1ha2Vfc2hhcmVkPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PihjKTsKKyAgICAgICAgICAgICAgICBoaWRsTGlzdGVuZXItPmNvbXBvbmVudCA9ICpjb21wb25lbnQ7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjcmVhdGVDb21wb25lbnQoIiA8PCBuYW1lLmNfc3RyKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiKSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjcmVhdGVDb21wb25lbnQoIiA8PCBuYW1lLmNfc3RyKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiKSAtLSBjYWxsIGZhaWxlZDogIiA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0gZWxzZSBpZiAoISpjb21wb25lbnQpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiY3JlYXRlQ29tcG9uZW50KCIgPDwgbmFtZS5jX3N0cigpCisgICAgICAgICAgICAgICAgICAgPDwgIikgLS0gbnVsbCBjb21wb25lbnQuIjsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICBzdGF0dXMgPSAoKmNvbXBvbmVudCktPnNldERlYXRoTGlzdGVuZXIoKmNvbXBvbmVudCwgbGlzdGVuZXIpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiY3JlYXRlQ29tcG9uZW50KCIgPDwgbmFtZS5jX3N0cigpCisgICAgICAgICAgICAgICAgICAgPDwgIikgLS0gZmFpbGVkIHRvIHNldCB1cCBkZWF0aCBsaXN0ZW5lcjogIgorICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorCisgICAgKCpjb21wb25lbnQpLT5tQnVmZmVyUG9vbFNlbmRlci5zZXRSZWNlaXZlcihtSG9zdFBvb2xNYW5hZ2VyKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OmNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgY29uc3QgQzJTdHJpbmcmIG5hbWUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSkgeworICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+Y3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgIFsmc3RhdHVzLCBpbnRlcmZhY2VdKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudEludGVyZmFjZT4mIGkpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6Om1ha2Vfc2hhcmVkPEludGVyZmFjZT4oaSk7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjcmVhdGVJbnRlcmZhY2UoIiA8PCBuYW1lLmNfc3RyKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiKSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjcmVhdGVDb21wb25lbnQoIiA8PCBuYW1lLmNfc3RyKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiKSAtLSBjYWxsIGZhaWxlZDogIiA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Y3JlYXRlSW5wdXRTdXJmYWNlKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlPiogY29uc3QgaW5wdXRTdXJmYWNlKSB7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5jcmVhdGVJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBbJnN0YXR1cywgaW5wdXRTdXJmYWNlXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElJbnB1dFN1cmZhY2U+JiBpKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqaW5wdXRTdXJmYWNlID0gc3RkOjptYWtlX3NoYXJlZDxJbnB1dFN1cmZhY2U+KGkpOworICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiY3JlYXRlSW5wdXRTdXJmYWNlIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgImNyZWF0ZUlucHV0U3VyZmFjZSAtLSBjYWxsIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+IGNvbnN0JiBDb2RlYzJDbGllbnQ6Omxpc3RDb21wb25lbnRzKCkgY29uc3QgeworICAgIHJldHVybiBDYWNoZTo6TGlzdCgpW21TZXJ2aWNlSW5kZXhdLmdldFRyYWl0cygpOworfQorCitzdGQ6OnZlY3RvcjxDMkNvbXBvbmVudDo6VHJhaXRzPiBDb2RlYzJDbGllbnQ6Ol9saXN0Q29tcG9uZW50cygKKyAgICAgICAgYm9vbCogc3VjY2VzcykgY29uc3QgeworICAgIHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+IHRyYWl0czsKKyAgICBzdGQ6OnN0cmluZyBjb25zdCYgc2VydmljZU5hbWUgPSBnZXRTZXJ2aWNlTmFtZSgpOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5saXN0Q29tcG9uZW50cygKKyAgICAgICAgICAgIFsmdHJhaXRzLCAmc2VydmljZU5hbWVdKFN0YXR1cyBzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzPiYgdCkgeworICAgICAgICAgICAgICAgIGlmIChzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiX2xpc3RDb21wb25lbnRzIC0tIGNhbGwgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0cmFpdHMucmVzaXplKHQuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHQuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFvYmpjcHkoJnRyYWl0c1tpXSwgdFtpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIl9saXN0Q29tcG9uZW50cyAtLSBjb3JydXB0ZWQgb3V0cHV0LiI7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdHJhaXRzW2ldLm93bmVyID0gc2VydmljZU5hbWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiX2xpc3RDb21wb25lbnRzIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICAqc3VjY2VzcyA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgICpzdWNjZXNzID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIHRyYWl0czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50Ojpjb3B5QnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBzcmMsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIGRzdCkgeworICAgIC8vIFRPRE86IEltcGxlbWVudD8KKyAgICAodm9pZClzcmM7CisgICAgKHZvaWQpZHN0OworICAgIExPRyhFUlJPUikgPDwgImNvcHlCdWZmZXIgbm90IGltcGxlbWVudGVkIjsKKyAgICByZXR1cm4gQzJfT01JVFRFRDsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+CisgICAgICAgIENvZGVjMkNsaWVudDo6Z2V0UGFyYW1SZWZsZWN0b3IoKSB7CisgICAgLy8gVE9ETzogdGhpcyBpcyBub3QgbWVhbnQgdG8gYmUgZXhwb3NlZCBhcyBDMlBhcmFtUmVmbGVjdG9yIG9uIHRoZSBjbGllbnQgc2lkZTsgaW5zdGVhZCwgaXQKKyAgICAvLyBzaG91bGQgcmVmbGVjdCB0aGUgSEFMIEFQSS4KKyAgICBzdHJ1Y3QgU2ltcGxlUGFyYW1SZWZsZWN0b3IgOiBwdWJsaWMgQzJQYXJhbVJlZmxlY3RvciB7CisgICAgICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzY3JpYmUoQzJQYXJhbTo6Q29yZUluZGV4IGNvcmVJbmRleCkgY29uc3QgeworICAgICAgICAgICAgaGlkbF92ZWM8UGFyYW1JbmRleD4gaW5kaWNlcygxKTsKKyAgICAgICAgICAgIGluZGljZXNbMF0gPSBzdGF0aWNfY2FzdDxQYXJhbUluZGV4Pihjb3JlSW5kZXguY29yZUluZGV4KCkpOworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzY3JpcHRvcjsKKyAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5nZXRTdHJ1Y3REZXNjcmlwdG9ycygKKyAgICAgICAgICAgICAgICAgICAgaW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgWyZkZXNjcmlwdG9yXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxTdHJ1Y3REZXNjcmlwdG9yPiYgc2QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJTaW1wbGVQYXJhbVJlZmxlY3RvciAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0U3RydWN0RGVzY3JpcHRvcnMoKSBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5yZXNldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZC5zaXplKCkgIT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgIlNpbXBsZVBhcmFtUmVmbGVjdG9yIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXRTdHJ1Y3REZXNjcmlwdG9ycygpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXR1cm5lZCB2ZWN0b3Igb2Ygc2l6ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzZC5zaXplKCkgPDwgIi4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkl0IHNob3VsZCBiZSAxLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5yZXNldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb2JqY3B5KCZkZXNjcmlwdG9yLCBzZFswXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJTaW1wbGVQYXJhbVJlZmxlY3RvciAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0U3RydWN0RGVzY3JpcHRvcnMoKSByZXR1cm5lZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29ycnVwdGVkIGRhdGEuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yOworICAgICAgICB9CisKKyAgICAgICAgU2ltcGxlUGFyYW1SZWZsZWN0b3Ioc3A8QmFzZT4gYmFzZSkKKyAgICAgICAgICAgIDogbUJhc2UoYmFzZSkgeyB9CisKKyAgICAgICAgc3A8QmFzZT4gbUJhc2U7CisgICAgfTsKKworICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZVBhcmFtUmVmbGVjdG9yPihtQmFzZSk7Cit9OworCitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIENvZGVjMkNsaWVudDo6R2V0U2VydmljZU5hbWVzKCkgeworICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc1NlcnZpY2VOYW1lc3tbXSgpIHsKKyAgICAgICAgdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29tcG9uZW50U3RvcmU7CisgICAgICAgIHVzaW5nIDo6YW5kcm9pZDo6aGlkbDo6bWFuYWdlcjo6VjFfMjo6SVNlcnZpY2VNYW5hZ2VyOworCisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNlcnZpY2VNYW5hZ2VyID0gSVNlcnZpY2VNYW5hZ2VyOjpnZXRTZXJ2aWNlKCk7CisgICAgICAgICAgICBDSEVDSyhzZXJ2aWNlTWFuYWdlcikgPDwgIkhhcmR3YXJlIHNlcnZpY2UgbWFuYWdlciBpcyBub3QgcnVubmluZy4iOworCisgICAgICAgICAgICAvLyBUaGVyZSBhcmUgdGhyZWUgY2F0ZWdvcmllcyBvZiBzZXJ2aWNlcyBiYXNlZCBvbiBuYW1lcy4KKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBkZWZhdWx0TmFtZXM7IC8vIFByZWZpeGVkIHdpdGggImRlZmF1bHQiCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdmVuZG9yTmFtZXM7ICAvLyBQcmVmaXhlZCB3aXRoICJ2ZW5kb3IiCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gb3RoZXJOYW1lczsgICAvLyBPdGhlcnMKKyAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdDsKKyAgICAgICAgICAgIHRyYW5zUmVzdWx0ID0gc2VydmljZU1hbmFnZXItPmxpc3RNYW5pZmVzdEJ5SW50ZXJmYWNlKAorICAgICAgICAgICAgICAgICAgICBJQ29tcG9uZW50U3RvcmU6OmRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgIFsmZGVmYXVsdE5hbWVzLCAmdmVuZG9yTmFtZXMsICZvdGhlck5hbWVzXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gY29uc3QmIGluc3RhbmNlTmFtZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaGlkbF9zdHJpbmcgY29uc3QmIGluc3RhbmNlTmFtZSA6IGluc3RhbmNlTmFtZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGNvbnN0KiBuYW1lID0gaW5zdGFuY2VOYW1lLmNfc3RyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cm5jbXAobmFtZSwgImRlZmF1bHQiLCA3KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHROYW1lcy5lbXBsYWNlX2JhY2sobmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKG5hbWUsICJ2ZW5kb3IiLCA2KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvck5hbWVzLmVtcGxhY2VfYmFjayhuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlck5hbWVzLmVtcGxhY2VfYmFjayhuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgaWYgKHRyYW5zUmVzdWx0LmlzT2soKSkgeworICAgICAgICAgICAgICAgIC8vIFNvcnQgc2VydmljZSBuYW1lcyBpbiBlYWNoIGNhdGVnb3J5LgorICAgICAgICAgICAgICAgIHN0ZDo6c29ydChkZWZhdWx0TmFtZXMuYmVnaW4oKSwgZGVmYXVsdE5hbWVzLmVuZCgpKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnNvcnQodmVuZG9yTmFtZXMuYmVnaW4oKSwgdmVuZG9yTmFtZXMuZW5kKCkpOworICAgICAgICAgICAgICAgIHN0ZDo6c29ydChvdGhlck5hbWVzLmJlZ2luKCksIG90aGVyTmFtZXMuZW5kKCkpOworCisgICAgICAgICAgICAgICAgLy8gQ29uY2F0ZW5hdGUgdGhlIHRocmVlIGxpc3RzIGluIHRoaXMgb3JkZXI6IGRlZmF1bHQsIHZlbmRvciwKKyAgICAgICAgICAgICAgICAvLyBvdGhlci4KKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIG5hbWVzID0gZGVmYXVsdE5hbWVzOworICAgICAgICAgICAgICAgIG5hbWVzLnJlc2VydmUobmFtZXMuc2l6ZSgpICsgdmVuZG9yTmFtZXMuc2l6ZSgpICsgb3RoZXJOYW1lcy5zaXplKCkpOworICAgICAgICAgICAgICAgIG5hbWVzLmluc2VydChuYW1lcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX21vdmVfaXRlcmF0b3IodmVuZG9yTmFtZXMuYmVnaW4oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9tb3ZlX2l0ZXJhdG9yKHZlbmRvck5hbWVzLmVuZCgpKSk7CisgICAgICAgICAgICAgICAgbmFtZXMuaW5zZXJ0KG5hbWVzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcihvdGhlck5hbWVzLmJlZ2luKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcihvdGhlck5hbWVzLmVuZCgpKSk7CisKKyAgICAgICAgICAgICAgICAvLyBTdW1tYXJpemUgdG8gbG9nY2F0LgorICAgICAgICAgICAgICAgIGlmIChuYW1lcy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiTm8gQ29kZWMyIHNlcnZpY2VzIGRlY2xhcmVkIGluIHRoZSBtYW5pZmVzdC4iOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHN0cmluZ091dHB1dDsKKyAgICAgICAgICAgICAgICAgICAgc3RyaW5nT3V0cHV0IDw8ICJBdmFpbGFibGUgQ29kZWMyIHNlcnZpY2VzOiI7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUgOiBuYW1lcykgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nT3V0cHV0IDw8ICIgXCIiIDw8IG5hbWUgPDwgIlwiIjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgc3RyaW5nT3V0cHV0LnN0cigpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHJldHVybiBuYW1lczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCByZXRyaWV2ZSB0aGUgbGlzdCBvZiBzZXJ2aWNlIGluc3RhbmNlcyBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IElDb21wb25lbnRTdG9yZTo6ZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICAgICA8PCAiLiBSZXRyeWluZy4uLiI7CisgICAgICAgIH0KKyAgICB9KCl9OworICAgIHJldHVybiBzU2VydmljZU5hbWVzOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKAorICAgICAgICBjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgc2l6ZV90IGluZGV4ID0gZ2V0U2VydmljZUluZGV4KG5hbWUpOworICAgIHJldHVybiBpbmRleCA9PSBHZXRTZXJ2aWNlTmFtZXMoKS5zaXplKCkgPworICAgICAgICAgICAgbnVsbHB0ciA6IF9DcmVhdGVGcm9tSW5kZXgoaW5kZXgpOworfQorCitzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50Pj4gQ29kZWMyQ2xpZW50OjoKKyAgICAgICAgQ3JlYXRlRnJvbUFsbFNlcnZpY2VzKCkgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+PiBjbGllbnRzKAorICAgICAgICAgICAgR2V0U2VydmljZU5hbWVzKCkuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gR2V0U2VydmljZU5hbWVzKCkuc2l6ZSgpOyBpID4gMDsgKSB7CisgICAgICAgIC0taTsKKyAgICAgICAgY2xpZW50c1tpXSA9IF9DcmVhdGVGcm9tSW5kZXgoaSk7CisgICAgfQorICAgIHJldHVybiBjbGllbnRzOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBDb2RlYzJDbGllbnQ6Ol9DcmVhdGVGcm9tSW5kZXgoc2l6ZV90IGluZGV4KSB7CisgICAgc3RkOjpzdHJpbmcgY29uc3QmIG5hbWUgPSBHZXRTZXJ2aWNlTmFtZXMoKVtpbmRleF07CisgICAgTE9HKElORk8pIDw8ICJDcmVhdGluZyBhIENvZGVjMiBjbGllbnQgdG8gc2VydmljZSBcIiIgPDwgbmFtZSA8PCAiXCIiOworICAgIHNwPEJhc2U+IGJhc2VTdG9yZSA9IEJhc2U6OmdldFNlcnZpY2UobmFtZSk7CisgICAgQ0hFQ0soYmFzZVN0b3JlKSA8PCAiQ29kZWMyIHNlcnZpY2UgXCIiIDw8IG5hbWUgPDwgIlwiIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBpbmFjY2Vzc2libGUgZm9yIHVua25vd24gcmVhc29ucy4iOworICAgIExPRyhJTkZPKSA8PCAiQ2xpZW50IHRvIENvZGVjMiBzZXJ2aWNlIFwiIiA8PCBuYW1lIDw8ICJcIiBjcmVhdGVkIjsKKyAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxDb2RlYzJDbGllbnQ+KGJhc2VTdG9yZSwgaW5kZXgpOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkZvckFsbFNlcnZpY2VzKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAma2V5LAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+Jik+CisgICAgICAgICAgICBwcmVkaWNhdGUpIHsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBDMl9OT19JTklUOyAgLy8gbm8gSUNvbXBvbmVudFN0b3JlcyBwcmVzZW50CisKKyAgICAvLyBDYWNoZSB0aGUgbWFwcGluZyBrZXkgLT4gaW5kZXggb2YgQ29kZWMyQ2xpZW50IGluIENhY2hlOjpMaXN0KCkuCisgICAgc3RhdGljIHN0ZDo6bXV0ZXgga2V5MkluZGV4TXV0ZXg7CisgICAgc3RhdGljIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzaXplX3Q+IGtleTJJbmRleDsKKworICAgIC8vIEJ5IGRlZmF1bHQgdHJ5IGFsbCBzdG9yZXMuIEhvd2V2ZXIsIHRyeSB0aGUgbGFzdCBrbm93biBjbGllbnQgZmlyc3QuIElmCisgICAgLy8gdGhlIGxhc3Qga25vd24gY2xpZW50IGZhaWxzLCByZXRyeSBvbmNlLiBXZSBkbyB0aGlzIGJ5IHB1c2hpbmcgdGhlIGxhc3QKKyAgICAvLyBrbm93biBjbGllbnQgaW4gZnJvbnQgb2YgdGhlIGxpc3Qgb2YgYWxsIGNsaWVudHMuCisgICAgc3RkOjpkZXF1ZTxzaXplX3Q+IGluZGljZXM7CisgICAgZm9yIChzaXplX3QgaW5kZXggPSBDYWNoZTo6TGlzdCgpLnNpemUoKTsgaW5kZXggPiAwOyApIHsKKyAgICAgICAgaW5kaWNlcy5wdXNoX2Zyb250KC0taW5kZXgpOworICAgIH0KKworICAgIGJvb2wgd2FzTWFwcGVkID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7a2V5MkluZGV4TXV0ZXh9OworICAgICAgICBhdXRvIGl0ID0ga2V5MkluZGV4LmZpbmQoa2V5KTsKKyAgICAgICAgaWYgKGl0ICE9IGtleTJJbmRleC5lbmQoKSkgeworICAgICAgICAgICAgaW5kaWNlcy5wdXNoX2Zyb250KGl0LT5zZWNvbmQpOworICAgICAgICAgICAgd2FzTWFwcGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoc2l6ZV90IGluZGV4IDogaW5kaWNlcykgeworICAgICAgICBDYWNoZSYgY2FjaGUgPSBDYWNoZTo6TGlzdCgpW2luZGV4XTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gY2xpZW50e2NhY2hlLmdldENsaWVudCgpfTsKKyAgICAgICAgaWYgKGNsaWVudCkgeworICAgICAgICAgICAgc3RhdHVzID0gcHJlZGljYXRlKGNsaWVudCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre2tleTJJbmRleE11dGV4fTsKKyAgICAgICAgICAgICAgICBrZXkySW5kZXhba2V5XSA9IGluZGV4OyAvLyB1cGRhdGUgbGFzdCBrbm93biBjbGllbnQgaW5kZXgKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHdhc01hcHBlZCkgeworICAgICAgICAgICAgTE9HKElORk8pIDw8ICJDb3VsZCBub3QgZmluZCBcIiIgPDwga2V5IDw8ICJcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiIGluIHRoZSBsYXN0IGluc3RhbmNlLiBSZXRyeWluZy4uLiI7CisgICAgICAgICAgICB3YXNNYXBwZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGNhY2hlLmludmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOyAgLy8gcmV0dXJuIHRoZSBsYXN0IHN0YXR1cyBmcm9tIGEgdmFsaWQgY2xpZW50Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4KKyAgICAgICAgQ29kZWMyQ2xpZW50OjpDcmVhdGVDb21wb25lbnRCeU5hbWUoCisgICAgICAgIGNvbnN0IGNoYXIqIGNvbXBvbmVudE5hbWUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50Piogb3duZXIpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiBjb21wb25lbnQ7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gRm9yQWxsU2VydmljZXMoCisgICAgICAgICAgICBjb21wb25lbnROYW1lLAorICAgICAgICAgICAgW293bmVyLCAmY29tcG9uZW50LCBjb21wb25lbnROYW1lLCAmbGlzdGVuZXJdKAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiAmY2xpZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgLT4gYzJfc3RhdHVzX3QgeworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGNsaWVudC0+Y3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBpZiAob3duZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpvd25lciA9IGNsaWVudDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IEMyX05PVF9GT1VORCkgeworICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJJQ29tcG9uZW50U3RvcmUoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBjbGllbnQtPmdldFNlcnZpY2VOYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKTo6Y3JlYXRlQ29tcG9uZW50KFwiIiA8PCBjb21wb25lbnROYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiKSByZXR1cm5lZCBzdGF0dXMgPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0pOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiQ291bGQgbm90IGNyZWF0ZSBjb21wb25lbnQgXCIiIDw8IGNvbXBvbmVudE5hbWUgPDwgIlwiLiAiCisgICAgICAgICAgICAgICAgICAgICAgIlN0YXR1cyA9ICIgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICB9CisgICAgcmV0dXJuIGNvbXBvbmVudDsKK30KKworc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW50ZXJmYWNlPgorICAgICAgICBDb2RlYzJDbGllbnQ6OkNyZWF0ZUludGVyZmFjZUJ5TmFtZSgKKyAgICAgICAgY29uc3QgY2hhciogaW50ZXJmYWNlTmFtZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4qIG93bmVyKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGVyZmFjZT4gaW50ZXJmYWNlOworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IEZvckFsbFNlcnZpY2VzKAorICAgICAgICAgICAgaW50ZXJmYWNlTmFtZSwKKyAgICAgICAgICAgIFtvd25lciwgJmludGVyZmFjZSwgaW50ZXJmYWNlTmFtZV0oCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+ICZjbGllbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAtPiBjMl9zdGF0dXNfdCB7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gY2xpZW50LT5jcmVhdGVJbnRlcmZhY2UoaW50ZXJmYWNlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW50ZXJmYWNlKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChvd25lcikgeworICAgICAgICAgICAgICAgICAgICAgICAgKm93bmVyID0gY2xpZW50OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT0gQzJfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgIklDb21wb25lbnRTdG9yZSgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGNsaWVudC0+Z2V0U2VydmljZU5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpOjpjcmVhdGVJbnRlcmZhY2UoXCIiIDw8IGludGVyZmFjZU5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXCIpIHJldHVybmVkIHN0YXR1cyA9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coREVCVUcpIDw8ICJDb3VsZCBub3QgY3JlYXRlIGludGVyZmFjZSBcIiIgPDwgaW50ZXJmYWNlTmFtZSA8PCAiXCIuICIKKyAgICAgICAgICAgICAgICAgICAgICAiU3RhdHVzID0gIiA8PCBzdGF0dXMgPDwgIi4iOworICAgIH0KKyAgICByZXR1cm4gaW50ZXJmYWNlOworfQorCitzdGQ6OnZlY3RvcjxDMkNvbXBvbmVudDo6VHJhaXRzPiBjb25zdCYgQ29kZWMyQ2xpZW50OjpMaXN0Q29tcG9uZW50cygpIHsKKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4gc0xpc3R7W10oKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+IGxpc3Q7CisgICAgICAgIGZvciAoQ2FjaGUmIGNhY2hlIDogQ2FjaGU6Okxpc3QoKSkgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4gY29uc3QmIHRyYWl0cyA9IGNhY2hlLmdldFRyYWl0cygpOworICAgICAgICAgICAgbGlzdC5pbnNlcnQobGlzdC5lbmQoKSwgdHJhaXRzLmJlZ2luKCksIHRyYWl0cy5lbmQoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxpc3Q7CisgICAgfSgpfTsKKyAgICByZXR1cm4gc0xpc3Q7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZT4gQ29kZWMyQ2xpZW50OjpDcmVhdGVJbnB1dFN1cmZhY2UoCisgICAgICAgIGNoYXIgY29uc3QqIHNlcnZpY2VOYW1lKSB7CisgICAgdWludDMyX3QgaW5wdXRTdXJmYWNlU2V0dGluZyA9IDo6YW5kcm9pZDo6YmFzZTo6R2V0VWludFByb3BlcnR5KAorICAgICAgICAgICAgImRlYnVnLnN0YWdlZnJpZ2h0LmMyaW5wdXRzdXJmYWNlIiwgdWludDMyX3QoMCkpOworICAgIGlmIChpbnB1dFN1cmZhY2VTZXR0aW5nID09IDApIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHNpemVfdCBpbmRleCA9IEdldFNlcnZpY2VOYW1lcygpLnNpemUoKTsKKyAgICBpZiAoc2VydmljZU5hbWUpIHsKKyAgICAgICAgaW5kZXggPSBnZXRTZXJ2aWNlSW5kZXgoc2VydmljZU5hbWUpOworICAgICAgICBpZiAoaW5kZXggPT0gR2V0U2VydmljZU5hbWVzKCkuc2l6ZSgpKSB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJDcmVhdGVJbnB1dFN1cmZhY2UgLS0gaW52YWxpZCBzZXJ2aWNlIG5hbWU6IFwiIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBzZXJ2aWNlTmFtZSA8PCAiXCIiOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlPiBpbnB1dFN1cmZhY2U7CisgICAgaWYgKGluZGV4ICE9IEdldFNlcnZpY2VOYW1lcygpLnNpemUoKSkgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBjbGllbnQgPSBDYWNoZTo6TGlzdCgpW2luZGV4XS5nZXRDbGllbnQoKTsKKyAgICAgICAgaWYgKGNsaWVudC0+Y3JlYXRlSW5wdXRTdXJmYWNlKCZpbnB1dFN1cmZhY2UpID09IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gaW5wdXRTdXJmYWNlOworICAgICAgICB9CisgICAgfQorICAgIExPRyhJTkZPKSA8PCAiQ3JlYXRlSW5wdXRTdXJmYWNlIC0tIGF0dGVtcHRpbmcgdG8gY3JlYXRlIGFuIGlucHV0IHN1cmZhY2UgIgorICAgICAgICAgICAgICAgICAiZnJvbSBhbGwgc2VydmljZXMuLi4iOworICAgIGZvciAoQ2FjaGUmIGNhY2hlIDogQ2FjaGU6Okxpc3QoKSkgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBjbGllbnQgPSBjYWNoZS5nZXRDbGllbnQoKTsKKyAgICAgICAgaWYgKGNsaWVudC0+Y3JlYXRlSW5wdXRTdXJmYWNlKCZpbnB1dFN1cmZhY2UpID09IEMyX09LKSB7CisgICAgICAgICAgICBMT0coSU5GTykgPDwgIkNyZWF0ZUlucHV0U3VyZmFjZSAtLSBpbnB1dCBzdXJmYWNlIG9idGFpbmVkIGZyb20gIgorICAgICAgICAgICAgICAgICAgICAgICAgICJzZXJ2aWNlIFwiIiA8PCBjbGllbnQtPmdldFNlcnZpY2VOYW1lKCkgPDwgIlwiIjsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dFN1cmZhY2U7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HKFdBUk5JTkcpIDw8ICJDcmVhdGVJbnB1dFN1cmZhY2UgLS0gZmFpbGVkIHRvIGNyZWF0ZSBhbiBpbnB1dCBzdXJmYWNlICIKKyAgICAgICAgICAgICAgICAgICAgImZyb20gYWxsIHNlcnZpY2VzIjsKKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworLy8gQ29kZWMyQ2xpZW50OjpMaXN0ZW5lcgorCitDb2RlYzJDbGllbnQ6Okxpc3RlbmVyOjp+TGlzdGVuZXIoKSB7Cit9CisKKy8vIENvZGVjMkNsaWVudDo6SW50ZXJmYWNlCitDb2RlYzJDbGllbnQ6OkludGVyZmFjZTo6SW50ZXJmYWNlKGNvbnN0IHNwPEJhc2U+JiBiYXNlKQorICAgICAgOiBDb25maWd1cmFibGV7CisgICAgICAgICAgICBbYmFzZV0oKSAtPiBzcDxJQ29uZmlndXJhYmxlPiB7CisgICAgICAgICAgICAgICAgUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiB0cmFuc1Jlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLT5nZXRDb25maWd1cmFibGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNSZXN1bHQuaXNPaygpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNwPElDb25maWd1cmFibGU+Pih0cmFuc1Jlc3VsdCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cjsKKyAgICAgICAgICAgIH0oKQorICAgICAgICB9LAorICAgICAgICBtQmFzZXtiYXNlfSB7Cit9CisKKy8vIENvZGVjMkNsaWVudDo6Q29tcG9uZW50CitDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6Q29tcG9uZW50KGNvbnN0IHNwPEJhc2U+JiBiYXNlKQorICAgICAgOiBDb25maWd1cmFibGV7CisgICAgICAgICAgICBbYmFzZV0oKSAtPiBzcDxJQ29uZmlndXJhYmxlPiB7CisgICAgICAgICAgICAgICAgUmV0dXJuPHNwPElDb21wb25lbnRJbnRlcmZhY2U+PiB0cmFuc1Jlc3VsdDEgPQorICAgICAgICAgICAgICAgICAgICAgICAgYmFzZS0+Z2V0SW50ZXJmYWNlKCk7CisgICAgICAgICAgICAgICAgaWYgKCF0cmFuc1Jlc3VsdDEuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IHRyYW5zUmVzdWx0MiA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzcDxJQ29tcG9uZW50SW50ZXJmYWNlPj4odHJhbnNSZXN1bHQxKS0+CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb25maWd1cmFibGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNSZXN1bHQyLmlzT2soKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxzcDxJQ29uZmlndXJhYmxlPj4odHJhbnNSZXN1bHQyKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyOworICAgICAgICAgICAgfSgpCisgICAgICAgIH0sCisgICAgICAgIG1CYXNle2Jhc2V9LAorICAgICAgICBtQnVmZmVyUG9vbFNlbmRlcntudWxscHRyfSB7Cit9CisKK0NvZGVjMkNsaWVudDo6Q29tcG9uZW50Ojp+Q29tcG9uZW50KCkgeworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6Y3JlYXRlQmxvY2tQb29sKAorICAgICAgICBDMkFsbG9jYXRvcjo6aWRfdCBpZCwKKyAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QqIGJsb2NrUG9vbElkLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb25maWd1cmFibGU+KiBjb25maWd1cmFibGUpIHsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbUJhc2UtPmNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihpZCksCisgICAgICAgICAgICBbJnN0YXR1cywgYmxvY2tQb29sSWQsIGNvbmZpZ3VyYWJsZV0oCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLAorICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBwSWQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElDb25maWd1cmFibGU+JiBjKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZS0+cmVzZXQoKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgImNyZWF0ZUJsb2NrUG9vbCAtLSBjYWxsIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKmJsb2NrUG9vbElkID0gc3RhdGljX2Nhc3Q8QzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3Q+KHBJZCk7CisgICAgICAgICAgICAgICAgKmNvbmZpZ3VyYWJsZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q29uZmlndXJhYmxlPihjKTsKKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNyZWF0ZUJsb2NrUG9vbCAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OmRlc3Ryb3lCbG9ja1Bvb2woCisgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGxvY2FsSWQpIHsKKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1Jlc3VsdCA9IG1CYXNlLT5kZXN0cm95QmxvY2tQb29sKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGxvY2FsSWQpKTsKKyAgICBpZiAoIXRyYW5zUmVzdWx0LmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJkZXN0cm95QmxvY2tQb29sIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNSZXN1bHQpKTsKK30KKwordm9pZCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6aGFuZGxlT25Xb3JrRG9uZSgKKyAgICAgICAgY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmd29ya0l0ZW1zKSB7CisgICAgLy8gT3V0cHV0IGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrcycgbGlmZXRpbWUgbWFuYWdlbWVudAorICAgIG1PdXRwdXRCdWZmZXJRdWV1ZU11dGV4LmxvY2soKTsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBpZ2JwID0gbU91dHB1dElnYnA7CisgICAgdWludDY0X3QgYnFJZCA9IG1PdXRwdXRCcUlkOworICAgIHVpbnQzMl90IGdlbmVyYXRpb24gPSBtT3V0cHV0R2VuZXJhdGlvbjsKKyAgICBtT3V0cHV0QnVmZmVyUXVldWVNdXRleC51bmxvY2soKTsKKworICAgIGlmIChpZ2JwKSB7CisgICAgICAgIGhvbGRCdWZmZXJRdWV1ZUJsb2Nrcyh3b3JrSXRlbXMsIGlnYnAsIGJxSWQsIGdlbmVyYXRpb24pOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OnF1ZXVlKAorICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBpdGVtcykgeworICAgIFdvcmtCdW5kbGUgd29ya0J1bmRsZTsKKyAgICBpZiAoIW9iamNweSgmd29ya0J1bmRsZSwgKml0ZW1zLCAmbUJ1ZmZlclBvb2xTZW5kZXIpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXVlIC0tIGJhZCBpbnB1dC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5xdWV1ZSh3b3JrQnVuZGxlKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJxdWV1ZSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zU3RhdHVzKSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coREVCVUcpIDw8ICJxdWV1ZSAtLSBjYWxsIGZhaWxlZDogIiA8PCBzdGF0dXMgPDwgIi4iOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6Zmx1c2goCisgICAgICAgIEMyQ29tcG9uZW50OjpmbHVzaF9tb2RlX3QgbW9kZSwKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgZmx1c2hlZFdvcmspIHsKKyAgICAodm9pZCltb2RlOyAvLyBGbHVzaCBtb2RlIGlzbid0IHN1cHBvcnRlZCBpbiBISURMIHlldC4KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbUJhc2UtPmZsdXNoKAorICAgICAgICAgICAgWyZzdGF0dXMsIGZsdXNoZWRXb3JrXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsIGNvbnN0IFdvcmtCdW5kbGUmIHdiKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiZmx1c2ggLS0gY2FsbCBmYWlsZWQ6ICIgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW9iamNweShmbHVzaGVkV29yaywgd2IpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBDMl9PSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJmbHVzaCAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisKKyAgICAvLyBJbmRpY2VzIG9mIGZsdXNoZWQgd29yayBpdGVtcy4KKyAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gZmx1c2hlZEluZGljZXM7CisgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayA6ICpmbHVzaGVkV29yaykgeworICAgICAgICBpZiAod29yaykgeworICAgICAgICAgICAgaWYgKHdvcmstPndvcmtsZXRzLmVtcHR5KCkKKyAgICAgICAgICAgICAgICAgICAgfHwgIXdvcmstPndvcmtsZXRzLmJhY2soKQorICAgICAgICAgICAgICAgICAgICB8fCAod29yay0+d29ya2xldHMuYmFjaygpLT5vdXRwdXQuZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfSU5DT01QTEVURSkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIGlucHV0IGlzIGNvbXBsZXRlCisgICAgICAgICAgICAgICAgZmx1c2hlZEluZGljZXMuZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gT3V0cHV0IGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrcycgbGlmZXRpbWUgbWFuYWdlbWVudAorICAgIG1PdXRwdXRCdWZmZXJRdWV1ZU11dGV4LmxvY2soKTsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBpZ2JwID0gbU91dHB1dElnYnA7CisgICAgdWludDY0X3QgYnFJZCA9IG1PdXRwdXRCcUlkOworICAgIHVpbnQzMl90IGdlbmVyYXRpb24gPSBtT3V0cHV0R2VuZXJhdGlvbjsKKyAgICBtT3V0cHV0QnVmZmVyUXVldWVNdXRleC51bmxvY2soKTsKKworICAgIGlmIChpZ2JwKSB7CisgICAgICAgIGhvbGRCdWZmZXJRdWV1ZUJsb2NrcygqZmx1c2hlZFdvcmssIGlnYnAsIGJxSWQsIGdlbmVyYXRpb24pOworICAgIH0KKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpkcmFpbihDMkNvbXBvbmVudDo6ZHJhaW5fbW9kZV90IG1vZGUpIHsKKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5kcmFpbigKKyAgICAgICAgICAgIG1vZGUgPT0gQzJDb21wb25lbnQ6OkRSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUyk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiZHJhaW4gLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0cmFuc1N0YXR1cykpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiZHJhaW4gLS0gY2FsbCBmYWlsZWQ6ICIgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OnN0YXJ0KCkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gbUJhc2UtPnN0YXJ0KCk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAic3RhcnQgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0cmFuc1N0YXR1cykpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAic3RhcnQgLS0gY2FsbCBmYWlsZWQ6ICIgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OnN0b3AoKSB7CisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+c3RvcCgpOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInN0b3AgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0cmFuc1N0YXR1cykpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAic3RvcCAtLSBjYWxsIGZhaWxlZDogIiA8PCBzdGF0dXMgPDwgIi4iOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6cmVzZXQoKSB7CisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+cmVzZXQoKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJyZXNldCAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zU3RhdHVzKSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coREVCVUcpIDw8ICJyZXNldCAtLSBjYWxsIGZhaWxlZDogIiA8PCBzdGF0dXMgPDwgIi4iOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6cmVsZWFzZSgpIHsKKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5yZWxlYXNlKCk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAicmVsZWFzZSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zU3RhdHVzKSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coREVCVUcpIDw8ICJyZWxlYXNlIC0tIGNhbGwgZmFpbGVkOiAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpzZXRPdXRwdXRTdXJmYWNlKAorICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBibG9ja1Bvb2xJZCwKKyAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHN1cmZhY2UsCisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24pIHsKKyAgICBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyMj4gaWdicCA9CisgICAgICAgICAgICBzdXJmYWNlLT5nZXRIYWxJbnRlcmZhY2U8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcjI+KCk7CisKKyAgICBpZiAoIWlnYnApIHsKKyAgICAgICAgaWdicCA9IG5ldyBCMkhHcmFwaGljQnVmZmVyUHJvZHVjZXIyKHN1cmZhY2UpOworICAgIH0KKworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gbUJhc2UtPnNldE91dHB1dFN1cmZhY2UoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50NjRfdD4oYmxvY2tQb29sSWQpLCBpZ2JwKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJzZXRPdXRwdXRTdXJmYWNlIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgInNldE91dHB1dFN1cmZhY2UgLS0gY2FsbCBmYWlsZWQ6ICIgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtT3V0cHV0QnVmZmVyUXVldWVNdXRleCk7CisgICAgICAgIGlmIChtT3V0cHV0SWdicCAhPSBzdXJmYWNlKSB7CisgICAgICAgICAgICBtT3V0cHV0SWdicCA9IHN1cmZhY2U7CisgICAgICAgICAgICBpZiAoIXN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICBtT3V0cHV0QnFJZCA9IDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN1cmZhY2UtPmdldFVuaXF1ZUlkKCZtT3V0cHV0QnFJZCkgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJzZXRPdXRwdXRTdXJmYWNlIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYW5ub3Qgb2J0YWluIGJ1ZmZlcnF1ZXVlIGlkLiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbU91dHB1dEdlbmVyYXRpb24gPSBnZW5lcmF0aW9uOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6cXVldWVUb091dHB1dFN1cmZhY2UoCisgICAgICAgIGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrLAorICAgICAgICBjb25zdCBRdWV1ZUJ1ZmZlcklucHV0JiBpbnB1dCwKKyAgICAgICAgUXVldWVCdWZmZXJPdXRwdXQqIG91dHB1dCkgeworICAgIHVpbnQzMl90IGdlbmVyYXRpb247CisgICAgdWludDY0X3QgYnFJZDsKKyAgICBpbnQzMl90IGJxU2xvdDsKKyAgICBpZiAoIWdldEJ1ZmZlclF1ZXVlQXNzaWdubWVudChibG9jaywgJmdlbmVyYXRpb24sICZicUlkLCAmYnFTbG90KSB8fAorICAgICAgICAgICAgYnFJZCA9PSAwKSB7CisgICAgICAgIC8vIEJsb2NrIG5vdCBmcm9tIGJ1ZmZlcnF1ZXVlIC0tIGl0IG11c3QgYmUgYXR0YWNoZWQgYmVmb3JlIHF1ZXVpbmcuCisKKyAgICAgICAgbU91dHB1dEJ1ZmZlclF1ZXVlTXV0ZXgubG9jaygpOworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBvdXRwdXRJZ2JwID0gbU91dHB1dElnYnA7CisgICAgICAgIHVpbnQzMl90IG91dHB1dEdlbmVyYXRpb24gPSBtT3V0cHV0R2VuZXJhdGlvbjsKKyAgICAgICAgbU91dHB1dEJ1ZmZlclF1ZXVlTXV0ZXgudW5sb2NrKCk7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXR0YWNoVG9CdWZmZXJRdWV1ZShibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0SWdicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0R2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJxU2xvdCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicXVldWVUb091dHB1dFN1cmZhY2UgLS0gYXR0YWNoaW5nIGZhaWxlZC4iOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0gb3V0cHV0SWdicC0+cXVldWVCdWZmZXIoc3RhdGljX2Nhc3Q8aW50PihicVNsb3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgb3V0cHV0KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVldWVUb091dHB1dFN1cmZhY2UgLS0gcXVldWVCdWZmZXIoKSBmYWlsZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAib24gbm9uLWJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFcnJvciA9ICIgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIG1PdXRwdXRCdWZmZXJRdWV1ZU11dGV4LmxvY2soKTsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBvdXRwdXRJZ2JwID0gbU91dHB1dElnYnA7CisgICAgdWludDY0X3Qgb3V0cHV0QnFJZCA9IG1PdXRwdXRCcUlkOworICAgIHVpbnQzMl90IG91dHB1dEdlbmVyYXRpb24gPSBtT3V0cHV0R2VuZXJhdGlvbjsKKyAgICBtT3V0cHV0QnVmZmVyUXVldWVNdXRleC51bmxvY2soKTsKKworICAgIGlmICghb3V0cHV0SWdicCkgeworICAgICAgICBMT0coVkVSQk9TRSkgPDwgInF1ZXVlVG9PdXRwdXRTdXJmYWNlIC0tIG91dHB1dCBzdXJmYWNlIGlzIG51bGwuIjsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgaWYgKGJxSWQgIT0gb3V0cHV0QnFJZCB8fCBnZW5lcmF0aW9uICE9IG91dHB1dEdlbmVyYXRpb24pIHsKKyAgICAgICAgaWYgKCFob2xkQnVmZmVyUXVldWVCbG9jayhibG9jaywgbU91dHB1dElnYnAsIG1PdXRwdXRCcUlkLCBtT3V0cHV0R2VuZXJhdGlvbikpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXVlVG9PdXRwdXRTdXJmYWNlIC0tIG1pZ3JhdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWdldEJ1ZmZlclF1ZXVlQXNzaWdubWVudChibG9jaywgJmdlbmVyYXRpb24sICZicUlkLCAmYnFTbG90KSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVldWVUb091dHB1dFN1cmZhY2UgLS0gY29ycnVwdGVkIGJ1ZmZlcnF1ZXVlIGFzc2lnbm1lbnQuIjsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3V0cHV0SWdicC0+cXVldWVCdWZmZXIoc3RhdGljX2Nhc3Q8aW50PihicVNsb3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBvdXRwdXQpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAicXVldWVUb091dHB1dFN1cmZhY2UgLS0gcXVldWVCdWZmZXIoKSBmYWlsZWQgIgorICAgICAgICAgICAgICAgICAgICAgICJvbiBidWZmZXJxdWV1ZS1iYXNlZCBibG9jay4gIgorICAgICAgICAgICAgICAgICAgICAgICJFcnJvciA9ICIgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgaWYgKCF5aWVsZEJ1ZmZlclF1ZXVlQmxvY2soYmxvY2spKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgInF1ZXVlVG9PdXRwdXRTdXJmYWNlIC0tIGNhbm5vdCB5aWVsZCAiCisgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrIHRvIHRoZSBidWZmZXJxdWV1ZS4iOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6Y29ubmVjdFRvSW5wdXRTdXJmYWNlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlPiYgaW5wdXRTdXJmYWNlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4qIGNvbm5lY3Rpb24pIHsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbUJhc2UtPmNvbm5lY3RUb0lucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGlucHV0U3VyZmFjZS0+bUJhc2UsCisgICAgICAgICAgICBbJnN0YXR1cywgY29ubmVjdGlvbl0oCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLCBjb25zdCBzcDxJSW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4mIGMpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJjb25uZWN0VG9JbnB1dFN1cmZhY2UgLS0gY2FsbCBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpjb25uZWN0aW9uID0gc3RkOjptYWtlX3NoYXJlZDxJbnB1dFN1cmZhY2VDb25uZWN0aW9uPihjKTsKKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNvbm5lY3RUb0lucHV0U3VyZmFjZSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQiOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6Y29ubmVjdFRvT214SW5wdXRTdXJmYWNlKAorICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyMT4mIHByb2R1Y2VyLAorICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclNvdXJjZT4mIHNvdXJjZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZUNvbm5lY3Rpb24+KiBjb25uZWN0aW9uKSB7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5jb25uZWN0VG9PbXhJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBwcm9kdWNlciwgc291cmNlLAorICAgICAgICAgICAgWyZzdGF0dXMsIGNvbm5lY3Rpb25dKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywgY29uc3Qgc3A8SUlucHV0U3VyZmFjZUNvbm5lY3Rpb24+JiBjKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiY29ubmVjdFRvT214SW5wdXRTdXJmYWNlIC0tIGNhbGwgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqY29ubmVjdGlvbiA9IHN0ZDo6bWFrZV9zaGFyZWQ8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4oYyk7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjb25uZWN0VG9PbXhJbnB1dFN1cmZhY2UgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpkaXNjb25uZWN0RnJvbUlucHV0U3VyZmFjZSgpIHsKKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5kaXNjb25uZWN0RnJvbUlucHV0U3VyZmFjZSgpOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImRpc2Nvbm5lY3RUb0lucHV0U3VyZmFjZSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zU3RhdHVzKSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coREVCVUcpIDw8ICJkaXNjb25uZWN0RnJvbUlucHV0U3VyZmFjZSAtLSBjYWxsIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpzZXREZWF0aExpc3RlbmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+JiBsaXN0ZW5lcikgeworCisgICAgc3RydWN0IEhpZGxEZWF0aFJlY2lwaWVudCA6IHB1YmxpYyBoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQgeworICAgICAgICBzdGQ6OndlYWtfcHRyPENvbXBvbmVudD4gY29tcG9uZW50OworICAgICAgICBzdGQ6OndlYWtfcHRyPExpc3RlbmVyPiBiYXNlOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXJ2aWNlRGllZCgKKyAgICAgICAgICAgICAgICB1aW50NjRfdCAvKiBjb29raWUgKi8sCisgICAgICAgICAgICAgICAgY29uc3Qgd3A8OjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIC8qIHdobyAqLworICAgICAgICAgICAgICAgICkgb3ZlcnJpZGUgeworICAgICAgICAgICAgaWYgKHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IGJhc2UubG9jaygpKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXItPm9uRGVhdGgoY29tcG9uZW50KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAib25EZWF0aCAtLSBsaXN0ZW5lciBkaWVkLiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgc3A8SGlkbERlYXRoUmVjaXBpZW50PiBkZWF0aFJlY2lwaWVudCA9IG5ldyBIaWRsRGVhdGhSZWNpcGllbnQoKTsKKyAgICBkZWF0aFJlY2lwaWVudC0+YmFzZSA9IGxpc3RlbmVyOworICAgIGRlYXRoUmVjaXBpZW50LT5jb21wb25lbnQgPSBjb21wb25lbnQ7CisKKyAgICBjb21wb25lbnQtPm1EZWF0aFJlY2lwaWVudCA9IGRlYXRoUmVjaXBpZW50OworICAgIFJldHVybjxib29sPiB0cmFuc1Jlc3VsdCA9IGNvbXBvbmVudC0+bUJhc2UtPmxpbmtUb0RlYXRoKAorICAgICAgICAgICAgY29tcG9uZW50LT5tRGVhdGhSZWNpcGllbnQsIDApOworICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInNldERlYXRoTGlzdGVuZXIgLS0gbGlua1RvRGVhdGgoKSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgaWYgKCFzdGF0aWNfY2FzdDxib29sPih0cmFuc1Jlc3VsdCkpIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAic2V0RGVhdGhMaXN0ZW5lciAtLSBsaW5rVG9EZWF0aCgpIGNhbGwgZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworLy8gQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2UKK0NvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlOjpJbnB1dFN1cmZhY2UoY29uc3Qgc3A8SUlucHV0U3VyZmFjZT4mIGJhc2UpCisgICAgICA6IENvbmZpZ3VyYWJsZXsKKyAgICAgICAgICAgIFtiYXNlXSgpIC0+IHNwPElDb25maWd1cmFibGU+IHsKKyAgICAgICAgICAgICAgICBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IHRyYW5zUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UtPmdldENvbmZpZ3VyYWJsZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc1Jlc3VsdC5pc09rKCkgPworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8SUNvbmZpZ3VyYWJsZT4+KHRyYW5zUmVzdWx0KSA6CisgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyOworICAgICAgICAgICAgfSgpCisgICAgICAgIH0sCisgICAgICAgIG1CYXNle2Jhc2V9LAorICAgICAgICBtR3JhcGhpY0J1ZmZlclByb2R1Y2Vye25ldworICAgICAgICAgICAgSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyMihbYmFzZV0oKSAtPiBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyMj4geworICAgICAgICAgICAgICAgIFJldHVybjxzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyMj4+IHRyYW5zUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UtPmdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpOworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc1Jlc3VsdC5pc09rKCkgPworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcjI+Pih0cmFuc1Jlc3VsdCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cjsKKyAgICAgICAgICAgIH0oKSl9IHsKK30KKworc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4KKyAgICAgICAgQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U6OmdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK30KKworc3A8SUlucHV0U3VyZmFjZT4gQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U6OmdldEhhbEludGVyZmFjZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUJhc2U7Cit9CisKKy8vIENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlQ29ubmVjdGlvbgorQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uKAorICAgICAgICBjb25zdCBzcDxJSW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4mIGJhc2UpCisgICAgICA6IENvbmZpZ3VyYWJsZXsKKyAgICAgICAgICAgIFtiYXNlXSgpIC0+IHNwPElDb25maWd1cmFibGU+IHsKKyAgICAgICAgICAgICAgICBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IHRyYW5zUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UtPmdldENvbmZpZ3VyYWJsZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc1Jlc3VsdC5pc09rKCkgPworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8SUNvbmZpZ3VyYWJsZT4+KHRyYW5zUmVzdWx0KSA6CisgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyOworICAgICAgICAgICAgfSgpCisgICAgICAgIH0sCisgICAgICAgIG1CYXNle2Jhc2V9IHsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpkaXNjb25uZWN0KCkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zUmVzdWx0ID0gbUJhc2UtPmRpc2Nvbm5lY3QoKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNSZXN1bHQpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2luY2x1ZGUvY29kZWMyL2hpZGwvY2xpZW50LmggYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvaW5jbHVkZS9jb2RlYzIvaGlkbC9jbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2RiNTE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2luY2x1ZGUvY29kZWMyL2hpZGwvY2xpZW50LmgKQEAgLTAsMCArMSw0MzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0hJRExfQ0xJRU5UX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfQ0xJRU5UX0gKKworI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NsaWVudEJsb2NrSGVscGVyLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyLmg+CisKKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorCisvKioKKyAqIFRoaXMgZmlsZSBjb250YWlucyBtaW5pbWFsIGludGVyZmFjZXMgZm9yIHRoZSBmcmFtZXdvcmsgdG8gYWNjZXNzIENvZGVjMi4wLgorICoKKyAqIENvZGVjMkNsaWVudCBpcyB0aGUgbWFpbiBjbGFzcyB0aGF0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgaW5uZXIgY2xhc3NlczoKKyAqIC0gTGlzdGVuZXIKKyAqIC0gQ29uZmlndXJhYmxlCisgKiAtIEludGVyZmFjZQorICogLSBDb21wb25lbnQKKyAqCisgKiBDbGFzc2VzIGluIENvZGVjMkNsaWVudCwgaW50ZXJmYWNlcyBpbiBDb2RlYzIuMCwgYW5kICBISURMIGludGVyZmFjZXMgYXJlCisgKiByZWxhdGVkIGFzIGZvbGxvd3M6CisgKiAtIENvZGVjMkNsaWVudCA8PT0+IEMyQ29tcG9uZW50U3RvcmUgPD09PiBJQ29tcG9uZW50U3RvcmUKKyAqIC0gQ29kZWMyQ2xpZW50OjpMaXN0ZW5lciA8PT0+IEMyQ29tcG9uZW50OjpMaXN0ZW5lciA8PT0+IElDb21wb25lbnRMaXN0ZW5lcgorICogLSBDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZSA8PT0+IFtObyBlcXVpdmFsZW50XSA8PT0+IElDb25maWd1cmFibGUKKyAqIC0gQ29kZWMyQ2xpZW50OjpJbnRlcmZhY2UgPD09PiBDMkNvbXBvbmVudEludGVyZmFjZSA8PT0+IElDb21wb25lbnRJbnRlcmZhY2UKKyAqIC0gQ29kZWMyQ2xpZW50OjpDb21wb25lbnQgPD09PiBDMkNvbXBvbmVudCA8PT0+IElDb21wb25lbnQKKyAqCisgKiBUaGUgZW50cnkgcG9pbnQgaXMgQ29kZWMyQ2xpZW50OjpDcmVhdGVGcm9tU2VydmljZSgpLCB3aGljaCBjcmVhdGVzIGEKKyAqIENvZGVjMkNsaWVudCBvYmplY3QuIEZyb20gQ29kZWMyQ2xpZW50LCBJbnRlcmZhY2UgYW5kIENvbXBvbmVudCBvYmplY3RzIGNhbgorICogYmUgY3JlYXRlZCBieSBjYWxsaW5nIGNyZWF0ZUNvbXBvbmVudCgpIGFuZCBjcmVhdGVJbnRlcmZhY2UoKS4KKyAqCisgKiBjcmVhdGVDb21wb25lbnQoKSB0YWtlcyBhIExpc3RlbmVyIG9iamVjdCwgd2hpY2ggbXVzdCBiZSBpbXBsZW1lbnRlZCBieSB0aGUKKyAqIHVzZXIuCisgKgorICogQXQgdGhlIHByZXNlbnQsIGNyZWF0ZUJsb2NrUG9vbCgpIGlzIHRoZSBvbmx5IG1ldGhvZCB0aGF0IHlpZWxkcyBhCisgKiBDb25maWd1cmFibGUgb2JqZWN0LiBOb3RlLCBob3dldmVyLCB0aGF0IEludGVyZmFjZSwgQ29tcG9uZW50IGFuZAorICogQ29kZWMyQ2xpZW50IGFyZSBhbGwgc3ViY2xhc3NlcyBvZiBDb25maWd1cmFibGUuCisgKi8KKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiByZWxldmFudCBISURMIGludGVyZmFjZXMKKworbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzAgeworc3RydWN0IElDb25maWd1cmFibGU7CitzdHJ1Y3QgSUNvbXBvbmVudDsKK3N0cnVjdCBJQ29tcG9uZW50SW50ZXJmYWNlOworc3RydWN0IElDb21wb25lbnRTdG9yZTsKK3N0cnVjdCBJSW5wdXRTaW5rOworc3RydWN0IElJbnB1dFN1cmZhY2U7CitzdHJ1Y3QgSUlucHV0U3VyZmFjZUNvbm5lY3Rpb247Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMAorCituYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wIHsKK3N0cnVjdCBJQ2xpZW50TWFuYWdlcjsKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzAKKworbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzAgeworc3RydWN0IElHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit9ICAvLyBhbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wCisKK25hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMCB7CitzdHJ1Y3QgSUdyYXBoaWNCdWZmZXJTb3VyY2U7Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzAKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBUaGlzIGNsYXNzIGlzIHN1cHBvc2VkIHRvIGJlIGNhbGxlZCBDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZSwgYnV0IGZvcndhcmQKKy8vIGRlY2xhcmF0aW9uIG9mIGFuIGlubmVyIGNsYXNzIGlzIG5vdCBwb3NzaWJsZS4KK3N0cnVjdCBDb2RlYzJDb25maWd1cmFibGVDbGllbnQgeworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb25maWd1cmFibGUgQmFzZTsKKworICAgIGNvbnN0IEMyU3RyaW5nJiBnZXROYW1lKCkgY29uc3Q7CisKKyAgICBjMl9zdGF0dXNfdCBxdWVyeSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiYgc3RhY2tQYXJhbXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgaGVhcFBhcmFtcykgY29uc3Q7CisKKyAgICBjMl9zdGF0dXNfdCBjb25maWcoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKTsKKworICAgIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4qIGNvbnN0IHBhcmFtcworICAgICAgICAgICAgKSBjb25zdDsKKworICAgIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiYgZmllbGRzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3Q7CisKKyAgICAvLyBiYXNlIGNhbm5vdCBiZSBudWxsLgorICAgIENvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudChjb25zdCBzcDxCYXNlPiYgYmFzZSk7CisKK3Byb3RlY3RlZDoKKyAgICBzcDxCYXNlPiBtQmFzZTsKKyAgICBDMlN0cmluZyBtTmFtZTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQ29kZWMyQ2xpZW50OworfTsKKworc3RydWN0IENvZGVjMkNsaWVudCA6IHB1YmxpYyBDb2RlYzJDb25maWd1cmFibGVDbGllbnQgeworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb21wb25lbnRTdG9yZSBCYXNlOworCisgICAgc3RydWN0IExpc3RlbmVyOworCisgICAgdHlwZWRlZiBDb2RlYzJDb25maWd1cmFibGVDbGllbnQgQ29uZmlndXJhYmxlOworCisgICAgc3RydWN0IENvbXBvbmVudDsKKworICAgIHN0cnVjdCBJbnRlcmZhY2U7CisKKyAgICBzdHJ1Y3QgSW5wdXRTdXJmYWNlOworCisgICAgc3RydWN0IElucHV0U3VyZmFjZUNvbm5lY3Rpb247CisKKyAgICB0eXBlZGVmIENvZGVjMkNsaWVudCBTdG9yZTsKKworICAgIHNwPEJhc2U+IGNvbnN0JiBnZXRCYXNlKCkgY29uc3Q7CisKKyAgICBzdGQ6OnN0cmluZyBjb25zdCYgZ2V0U2VydmljZU5hbWUoKSBjb25zdDsKKworICAgIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIEMyU3RyaW5nIGNvbnN0JiBuYW1lLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiBjb25zdCYgbGlzdGVuZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiogY29uc3QgY29tcG9uZW50KTsKKworICAgIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIEMyU3RyaW5nIGNvbnN0JiBuYW1lLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSk7CisKKyAgICBjMl9zdGF0dXNfdCBjcmVhdGVJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlPiogY29uc3QgaW5wdXRTdXJmYWNlKTsKKworICAgIHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+IGNvbnN0JiBsaXN0Q29tcG9uZW50cygpIGNvbnN0OworCisgICAgYzJfc3RhdHVzX3QgY29weUJ1ZmZlcigKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gY29uc3QmIHNyYywKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gY29uc3QmIGRzdCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gZ2V0UGFyYW1SZWZsZWN0b3IoKTsKKworICAgIC8vIFJldHVybnMgdGhlIGxpc3Qgb2YgSUNvbXBvbmVudFN0b3JlIHNlcnZpY2UgbmFtZXMgdGhhdCBhcmUgYXZhaWxhYmxlIG9uCisgICAgLy8gdGhlIGRldmljZS4gVGhpcyBsaXN0IGlzIHNwZWNpZmllZCBhdCB0aGUgYnVpbGQgdGltZSBpbiBtYW5pZmVzdCBmaWxlcy4KKyAgICAvLyBOb3RlOiBBIHNvZnR3YXJlIHNlcnZpY2Ugd2lsbCBoYXZlICJfc29mdHdhcmUiIGFzIGEgc3VmZml4LgorICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIEdldFNlcnZpY2VOYW1lcygpOworCisgICAgLy8gQ3JlYXRlIGEgc2VydmljZSB3aXRoIGEgZ2l2ZW4gc2VydmljZSBuYW1lLgorICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBDcmVhdGVGcm9tU2VydmljZShjaGFyIGNvbnN0KiBuYW1lKTsKKworICAgIC8vIEdldCBjbGllbnRzIHRvIGFsbCBzZXJ2aWNlcy4KKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4+IENyZWF0ZUZyb21BbGxTZXJ2aWNlcygpOworCisgICAgLy8gVHJ5IHRvIGNyZWF0ZSBhIGNvbXBvbmVudCB3aXRoIGEgZ2l2ZW4gbmFtZSBmcm9tIGFsbCBrbm93bgorICAgIC8vIElDb21wb25lbnRTdG9yZSBzZXJ2aWNlcy4KKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudD4gQ3JlYXRlQ29tcG9uZW50QnlOYW1lKAorICAgICAgICAgICAgY2hhciBjb25zdCogY29tcG9uZW50TmFtZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gY29uc3QmIGxpc3RlbmVyLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4qIG93bmVyID0gbnVsbHB0cik7CisKKyAgICAvLyBUcnkgdG8gY3JlYXRlIGEgY29tcG9uZW50IGludGVyZmFjZSB3aXRoIGEgZ2l2ZW4gbmFtZSBmcm9tIGFsbCBrbm93bgorICAgIC8vIElDb21wb25lbnRTdG9yZSBzZXJ2aWNlcy4KKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEludGVyZmFjZT4gQ3JlYXRlSW50ZXJmYWNlQnlOYW1lKAorICAgICAgICAgICAgY2hhciBjb25zdCogaW50ZXJmYWNlTmFtZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+KiBvd25lciA9IG51bGxwdHIpOworCisgICAgLy8gTGlzdCB0cmFpdHMgZnJvbSBhbGwga25vd24gSUNvbXBvbmVudFN0b3JlIHNlcnZpY2VzLgorICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkNvbXBvbmVudDo6VHJhaXRzPiBjb25zdCYgTGlzdENvbXBvbmVudHMoKTsKKworICAgIC8vIENyZWF0ZSBhbiBpbnB1dCBzdXJmYWNlLgorICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlPiBDcmVhdGVJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBjaGFyIGNvbnN0KiBzZXJ2aWNlTmFtZSA9IG51bGxwdHIpOworCisgICAgLy8gYmFzZSBjYW5ub3QgYmUgbnVsbC4KKyAgICBDb2RlYzJDbGllbnQoc3A8QmFzZT4gY29uc3QmIGJhc2UsIHNpemVfdCBzZXJ2aWNlSW5kZXgpOworCitwcm90ZWN0ZWQ6CisgICAgc3A8QmFzZT4gbUJhc2U7CisKKyAgICAvLyBGaW5kcyB0aGUgZmlyc3Qgc3RvcmUgd2hlcmUgdGhlIHByZWRpY2F0ZSByZXR1cm5zIE9LLCBhbmQgcmV0dXJucyB0aGUgbGFzdAorICAgIC8vIHByZWRpY2F0ZSByZXN1bHQuIFVzZXMga2V5IHRvIHJlbWVtYmVyIHRoZSBsYXN0IHN0b3JlIGZvdW5kLCBhbmQgaWYgY2FjaGVkLAorICAgIC8vIGl0IHRyaWVzIHRoYXQgc3RvcmUgYmVmb3JlIHRyeWluZyBhbGwgc3RvcmVzIChvbmUgcmV0cnkpLgorICAgIHN0YXRpYyBjMl9zdGF0dXNfdCBGb3JBbGxTZXJ2aWNlcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IGNvbnN0Jik+CisgICAgICAgICAgICAgICAgcHJlZGljYXRlKTsKKworICAgIHNpemVfdCBtU2VydmljZUluZGV4OworICAgIG11dGFibGUgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4gbVRyYWl0c0xpc3Q7CisKKyAgICBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUNsaWVudE1hbmFnZXI+CisgICAgICAgICAgICBtSG9zdFBvb2xNYW5hZ2VyOworCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IF9DcmVhdGVGcm9tSW5kZXgoc2l6ZV90IGluZGV4KTsKKworICAgIHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+IF9saXN0Q29tcG9uZW50cyhib29sKiBzdWNjZXNzKSBjb25zdDsKKworICAgIGNsYXNzIENhY2hlOworfTsKKworc3RydWN0IENvZGVjMkNsaWVudDo6SW50ZXJmYWNlIDogcHVibGljIENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlIHsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29tcG9uZW50SW50ZXJmYWNlIEJhc2U7CisKKyAgICBJbnRlcmZhY2UoY29uc3Qgc3A8QmFzZT4mIGJhc2UpOworCitwcm90ZWN0ZWQ6CisgICAgc3A8QmFzZT4gbUJhc2U7Cit9OworCitzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpMaXN0ZW5lciB7CisKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBjb21wb25lbnQgcHJvZHVjZXMgc29tZSBvdXRwdXQuCisgICAgdmlydHVhbCB2b2lkIG9uV29ya0RvbmUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENvbXBvbmVudD4mIGNvbXAsCisgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpID0gMDsKKworICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGNvbXBvbmVudCBnb2VzIGludG8gYSB0cmlwcGVkIHN0YXRlLgorICAgIHZpcnR1YWwgdm9pZCBvblRyaXBwZWQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENvbXBvbmVudD4mIGNvbXAsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4mIHNldHRpbmdSZXN1bHRzCisgICAgICAgICAgICApID0gMDsKKworICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGNvbXBvbmVudCBlbmNvdW50ZXJzIGFuIGVycm9yLgorICAgIHZpcnR1YWwgdm9pZCBvbkVycm9yKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxDb21wb25lbnQ+JiBjb21wLAorICAgICAgICAgICAgdWludDMyX3QgZXJyb3JDb2RlKSA9IDA7CisKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBwcm9jZXNzIHRoYXQgaG9zdHMgdGhlIGNvbXBvbmVudCBzaHV0cyBkb3duCisgICAgLy8gdW5leHBlY3RlZGx5LgorICAgIHZpcnR1YWwgdm9pZCBvbkRlYXRoKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxDb21wb25lbnQ+JiBjb21wKSA9IDA7CisKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIGFuIGlucHV0IGJ1ZmZlciBpcyBubyBsb25nZXIgaW4gdXNlIGJ5IHRoZSBjb2RlYy4KKyAgICAvLyBJbnB1dCBidWZmZXJzIHRoYXQgaGF2ZSBiZWVuIHJldHVybmVkIGJ5IG9uV29ya0RvbmUoKSBvciBmbHVzaCgpIHdpbGwgbm90CisgICAgLy8gdHJpZ2dlciBhIGNhbGwgdG8gdGhpcyBmdW5jdGlvbi4KKyAgICB2aXJ0dWFsIHZvaWQgb25JbnB1dEJ1ZmZlckRvbmUoCisgICAgICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LCBzaXplX3QgYXJyYXlJbmRleCkgPSAwOworCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgY29tcG9uZW50IGJlY29tZXMgYXdhcmUgb2YgYSBmcmFtZSBiZWluZworICAgIC8vIHJlbmRlcmVkLgorICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lUmVuZGVyZWQoCisgICAgICAgICAgICB1aW50NjRfdCBidWZmZXJRdWV1ZUlkLAorICAgICAgICAgICAgaW50MzJfdCBzbG90SWQsCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcE5zKSA9IDA7CisKKyAgICB2aXJ0dWFsIH5MaXN0ZW5lcigpOworCit9OworCitzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQgOiBwdWJsaWMgQ29kZWMyQ2xpZW50OjpDb25maWd1cmFibGUgeworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb21wb25lbnQgQmFzZTsKKworICAgIGMyX3N0YXR1c190IGNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgICAgIEMyQWxsb2NhdG9yOjppZF90IGlkLAorICAgICAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QqIGJsb2NrUG9vbElkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvbmZpZ3VyYWJsZT4qIGNvbmZpZ3VyYWJsZSk7CisKKyAgICBjMl9zdGF0dXNfdCBkZXN0cm95QmxvY2tQb29sKAorICAgICAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbG9jYWxJZCk7CisKKyAgICBjMl9zdGF0dXNfdCBxdWV1ZSgKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGl0ZW1zKTsKKworICAgIGMyX3N0YXR1c190IGZsdXNoKAorICAgICAgICAgICAgQzJDb21wb25lbnQ6OmZsdXNoX21vZGVfdCBtb2RlLAorICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgZmx1c2hlZFdvcmspOworCisgICAgYzJfc3RhdHVzX3QgZHJhaW4oQzJDb21wb25lbnQ6OmRyYWluX21vZGVfdCBtb2RlKTsKKworICAgIGMyX3N0YXR1c190IHN0YXJ0KCk7CisKKyAgICBjMl9zdGF0dXNfdCBzdG9wKCk7CisKKyAgICBjMl9zdGF0dXNfdCByZXNldCgpOworCisgICAgYzJfc3RhdHVzX3QgcmVsZWFzZSgpOworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworICAgIHR5cGVkZWYgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6CisgICAgICAgICAgICBRdWV1ZUJ1ZmZlcklucHV0IFF1ZXVlQnVmZmVySW5wdXQ7CisgICAgdHlwZWRlZiBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjoKKyAgICAgICAgICAgIFF1ZXVlQnVmZmVyT3V0cHV0IFF1ZXVlQnVmZmVyT3V0cHV0OworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyMTsKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjJfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIEhHcmFwaGljQnVmZmVyUHJvZHVjZXIyOworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclNvdXJjZSBIR3JhcGhpY0J1ZmZlclNvdXJjZTsKKworICAgIC8vIFNldCB0aGUgb3V0cHV0IHN1cmZhY2UgdG8gYmUgdXNlZCB3aXRoIGEgYmxvY2twb29sIHByZXZpb3VzbHkgY3JlYXRlZCBieQorICAgIC8vIGNyZWF0ZUJsb2NrUG9vbCgpLgorICAgIGMyX3N0YXR1c190IHNldE91dHB1dFN1cmZhY2UoCisgICAgICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBibG9ja1Bvb2xJZCwKKyAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBzdXJmYWNlLAorICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbik7CisKKyAgICAvLyBFeHRyYWN0IGEgc2xvdCBudW1iZXIgZnJvbSBvZiB0aGUgYmxvY2ssIHRoZW4gY2FsbAorICAgIC8vIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OnF1ZXVlQnVmZmVyKCkuCisgICAgLy8KKyAgICAvLyBJZiB0aGUgb3V0cHV0IHN1cmZhY2UgaGFzIG5vdCBiZWVuIHNldCwgTk9fSU5JVCB3aWxsIGJlIHJldHVybmVkLgorICAgIC8vCisgICAgLy8gSWYgdGhlIGJsb2NrIGRvZXMgbm90IGNvbWUgZnJvbSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrcG9vbCwKKyAgICAvLyBhdHRhY2hCdWZmZXIoKSB3aWxsIGJlIGNhbGxlZCwgZm9sbG93ZWQgYnkgcXVldWVCdWZmZXIoKS4KKyAgICAvLworICAgIC8vIElmIHRoZSBibG9jayBoYXMgYSBicUlkIHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhlIGlkIG9mIHRoZSBvdXRwdXQgc3VyZmFjZSwKKyAgICAvLyBERUFEX09CSkVDVCB3aWxsIGJlIHJldHVybmVkLgorICAgIC8vCisgICAgLy8gSWYgdGhlIGNhbGwgdG8gcXVldWVCdWZmZXIoKSBpcyBzdWNjZXNzZnVsIGJ1dCB0aGUgYmxvY2sgY2Fubm90IGJlCisgICAgLy8gYXNzb2NpYXRlZCB0byB0aGUgb3V0cHV0IHN1cmZhY2UgZm9yIGF1dG9tYXRpYyBjYW5jZWxsYXRpb24gdXBvbgorICAgIC8vIGRlc3RydWN0aW9uLCBVTktOT1dOX0VSUk9SIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgLy8KKyAgICAvLyBPdGhlcndpc2UsIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBxdWV1ZUJ1ZmZlcigpIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgc3RhdHVzX3QgcXVldWVUb091dHB1dFN1cmZhY2UoCisgICAgICAgICAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgICAgIGNvbnN0IFF1ZXVlQnVmZmVySW5wdXQmIGlucHV0LAorICAgICAgICAgICAgUXVldWVCdWZmZXJPdXRwdXQqIG91dHB1dCk7CisKKyAgICAvLyBDb25uZWN0IHRvIGEgZ2l2ZW4gSW5wdXRTdXJmYWNlLgorICAgIGMyX3N0YXR1c190IGNvbm5lY3RUb0lucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2U+JiBpbnB1dFN1cmZhY2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4qIGNvbm5lY3Rpb24pOworCisgICAgYzJfc3RhdHVzX3QgY29ubmVjdFRvT214SW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcjE+JiBwcm9kdWNlciwKKyAgICAgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZUNvbm5lY3Rpb24+KiBjb25uZWN0aW9uKTsKKworICAgIGMyX3N0YXR1c190IGRpc2Nvbm5lY3RGcm9tSW5wdXRTdXJmYWNlKCk7CisKKyAgICAvLyBiYXNlIGNhbm5vdCBiZSBudWxsLgorICAgIENvbXBvbmVudChjb25zdCBzcDxCYXNlPiYgYmFzZSk7CisKKyAgICB+Q29tcG9uZW50KCk7CisKK3Byb3RlY3RlZDoKKyAgICBzcDxCYXNlPiBtQmFzZTsKKworICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6dXRpbHM6OkRlZmF1bHRCdWZmZXJQb29sU2VuZGVyCisgICAgICAgICAgICBtQnVmZmVyUG9vbFNlbmRlcjsKKworICAgIHN0ZDo6bXV0ZXggbU91dHB1dEJ1ZmZlclF1ZXVlTXV0ZXg7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbU91dHB1dElnYnA7CisgICAgdWludDY0X3QgbU91dHB1dEJxSWQ7CisgICAgdWludDMyX3QgbU91dHB1dEdlbmVyYXRpb247CisKKyAgICBzdGF0aWMgYzJfc3RhdHVzX3Qgc2V0RGVhdGhMaXN0ZW5lcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+JiBsaXN0ZW5lcik7CisgICAgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQ+IG1EZWF0aFJlY2lwaWVudDsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQ29kZWMyQ2xpZW50OworCisgICAgc3RydWN0IEhpZGxMaXN0ZW5lcjsKKyAgICB2b2lkIGhhbmRsZU9uV29ya0RvbmUoY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmd29ya0l0ZW1zKTsKKworfTsKKworc3RydWN0IENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlIDogcHVibGljIENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlIHsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUlucHV0U3VyZmFjZSBCYXNlOworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklJbnB1dFN1cmZhY2VDb25uZWN0aW9uCisgICAgICAgICAgICBDb25uZWN0aW9uQmFzZTsKKworICAgIHR5cGVkZWYgQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uIENvbm5lY3Rpb247CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlciBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgY29uc3Q7CisKKyAgICAvLyBSZXR1cm4gdGhlIHVuZGVybHlpbmcgSUlucHV0U3VyZmFjZS4KKyAgICBzcDxCYXNlPiBnZXRIYWxJbnRlcmZhY2UoKSBjb25zdDsKKworICAgIC8vIGJhc2UgY2Fubm90IGJlIG51bGwuCisgICAgSW5wdXRTdXJmYWNlKGNvbnN0IHNwPEJhc2U+JiBiYXNlKTsKKworcHJvdGVjdGVkOgorICAgIHNwPEJhc2U+IG1CYXNlOworCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQ29kZWMyQ2xpZW50OworICAgIGZyaWVuZCBzdHJ1Y3QgQ29tcG9uZW50OworfTsKKworc3RydWN0IENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlQ29ubmVjdGlvbiA6IHB1YmxpYyBDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZSB7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUlucHV0U3VyZmFjZUNvbm5lY3Rpb24gQmFzZTsKKworICAgIGMyX3N0YXR1c190IGRpc2Nvbm5lY3QoKTsKKworICAgIC8vIGJhc2UgY2Fubm90IGJlIG51bGwuCisgICAgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbihjb25zdCBzcDxCYXNlPiYgYmFzZSk7CisKK3Byb3RlY3RlZDoKKyAgICBzcDxCYXNlPiBtQmFzZTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9ISURMX0NMSUVOVF9ICisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNjUyNWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzkgQEAKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wLXNlcnZpY2UiLAorICAgIGRlZmF1bHRzOiBbImhpZGxfZGVmYXVsdHMiXSwKKyAgICBzb2Nfc3BlY2lmaWM6IHRydWUsCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiaHciLAorICAgIHNyY3M6IFsKKyAgICAgICAgInZlbmRvci5jcHAiLAorICAgIF0sCisKKyAgICBpbml0X3JjOiBbImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wLXNlcnZpY2UucmMiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAorICAgICAgICAibGliYXZzZXJ2aWNlc19taW5pamFpbF92ZW5kb3IiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmNvZGVjMl9oaWRsQDEuMCIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImxpYmh3YmluZGVyIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgYXJjaDogeworICAgICAgICBhcm06IHsKKyAgICAgICAgICAgIHJlcXVpcmVkOiBbImNvZGVjMi52ZW5kb3IuYmFzZS5wb2xpY3kiXSwKKyAgICAgICAgfSwKKyAgICAgICAgeDg2OiB7CisgICAgICAgICAgICByZXF1aXJlZDogWyJjb2RlYzIudmVuZG9yLmJhc2UucG9saWN5Il0sCisgICAgICAgIH0sCisgICAgfSwKKworICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQubWsgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YjI4ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjQgQEAKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworIyB2ZW5kb3Igc2VydmljZSBzZWNjb21wIHBvbGljeQoraWZlcSAoJChUQVJHRVRfQVJDSCksJChmaWx0ZXIgJChUQVJHRVRfQVJDSCksIHg4NiB4ODZfNjQgYXJtIGFybTY0KSkKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGNvZGVjMi52ZW5kb3IuYmFzZS5wb2xpY3kKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX1ZFTkRPUikvZXRjL3NlY2NvbXBfcG9saWN5CitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IGNyYXNoX2R1bXAucG9saWN5CitpZmRlZiBUQVJHRVRfMk5EX0FSQ0gKKyAgICBpZm5lcSAoJChUQVJHRVRfVFJBTlNMQVRFXzJORF9BUkNIKSx0cnVlKQorICAgICAgICBMT0NBTF9TUkNfRklMRVMgOj0gc2VjY29tcF9wb2xpY3kvY29kZWMyLnZlbmRvci5iYXNlLSQoVEFSR0VUXzJORF9BUkNIKS5wb2xpY3kKKyAgICBlbHNlCisgICAgICAgIExPQ0FMX1NSQ19GSUxFUyA6PSBzZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UtJChUQVJHRVRfQVJDSCkucG9saWN5CisgICAgZW5kaWYKK2Vsc2UKKyAgICBMT0NBTF9TUkNfRklMRVMgOj0gc2VjY29tcF9wb2xpY3kvY29kZWMyLnZlbmRvci5iYXNlLSQoVEFSR0VUX0FSQ0gpLnBvbGljeQorZW5kaWYKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKK2VuZGlmCisKK2luY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsICQoTE9DQUxfUEFUSCkpCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL2FuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wLXNlcnZpY2UucmMgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMC1zZXJ2aWNlLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MDZiZDFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAtc2VydmljZS5yYwpAQCAtMCwwICsxLDcgQEAKK3NlcnZpY2UgYW5kcm9pZC1oYXJkd2FyZS1tZWRpYS1jMi1oYWwtMS0wIC92ZW5kb3IvYmluL2h3L2FuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wLXNlcnZpY2UKKyAgICBjbGFzcyBoYWwKKyAgICB1c2VyIG1lZGlhY29kZWMKKyAgICBncm91cCBjYW1lcmEgbWVkaWFkcm0gZHJtcnBjCisgICAgaW9wcmlvIHJ0IDQKKyAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi5zb2Z0d2FyZS5iYXNlLWFybS5wb2xpY3kgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIuc29mdHdhcmUuYmFzZS1hcm0ucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1ODcxZDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIuc29mdHdhcmUuYmFzZS1hcm0ucG9saWN5CkBAIC0wLDAgKzEsNzMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgT3JnYW5pemVkIGJ5IGZyZXF1ZW5jeSBvZiBzeXN0ZW1jYWxsIC0gaW4gZGVzY2VuZGluZyBvcmRlciBmb3IKKyMgYmVzdCBwZXJmb3JtYW5jZS4KK2Z1dGV4OiAxCitpb2N0bDogMQord3JpdGU6IDEKK3ByY3RsOiAxCitjbG9ja19nZXR0aW1lOiAxCitnZXRwcmlvcml0eTogMQorcmVhZDogMQorY2xvc2U6IDEKK3dyaXRldjogMQorZHVwOiAxCitwcG9sbDogMQorbW1hcDI6IDEKK2dldHJhbmRvbTogMQorCisjIG1yZW1hcDogRW5zdXJlIHxmbGFnc3wgYXJlIChNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCkgVE9ETzogT25jZSBtaW5pamFpbAorIyBwYXJzZXIgc3VwcG9ydCBmb3IgJzwnIGlzIGluIHRoaXMgbmVlZHMgdG8gYmUgbW9kaWZpZWQgdG8gYWxzbyBwcmV2ZW50CisjIHxvbGRfYWRkcmVzc3wgYW5kIHxuZXdfYWRkcmVzc3wgZnJvbSB0b3VjaGluZyB0aGUgZXhjZXB0aW9uIHZlY3RvciBwYWdlLCB3aGljaAorIyBvbiBBUk0gaXMgc3RhdGljYWxseSBsb2FkZWQgYXQgMHhmZmZmIDAwMDAuIFNlZQorIyBodHRwOi8vaW5mb2NlbnRlci5hcm0uY29tL2hlbHAvaW5kZXguanNwP3RvcGljPS9jb20uYXJtLmRvYy5kZGkwMjExaC9CYWJmZWVnYS5odG1sCisjIGZvciBtb3JlIGRldGFpbHMuCittcmVtYXA6IGFyZzMgPT0gMworbXVubWFwOiAxCittcHJvdGVjdDogMQorbWFkdmlzZTogMQorb3BlbmF0OiAxCitzaWdhbHRzdGFjazogMQorY2xvbmU6IDEKK3NldHByaW9yaXR5OiAxCitnZXR1aWQzMjogMQorZnN0YXQ2NDogMQorZnN0YXRmczY0OiAxCitwcmVhZDY0OiAxCitmYWNjZXNzYXQ6IDEKK3JlYWRsaW5rYXQ6IDEKK2V4aXQ6IDEKK3J0X3NpZ3Byb2NtYXNrOiAxCitzZXRfdGlkX2FkZHJlc3M6IDEKK3Jlc3RhcnRfc3lzY2FsbDogMQorZXhpdF9ncm91cDogMQorcnRfc2lncmV0dXJuOiAxCitwaXBlMjogMQorZ2V0dGltZW9mZGF5OiAxCitzY2hlZF95aWVsZDogMQorbmFub3NsZWVwOiAxCitsc2VlazogMQorX2xsc2VlazogMQorc2NoZWRfZ2V0X3ByaW9yaXR5X21heDogMQorc2NoZWRfZ2V0X3ByaW9yaXR5X21pbjogMQorc3RhdGZzNjQ6IDEKK3NjaGVkX3NldHNjaGVkdWxlcjogMQorZnN0YXRhdDY0OiAxCit1Z2V0cmxpbWl0OiAxCitnZXRkZW50czY0OiAxCitnZXRyYW5kb206IDEKKworQGluY2x1ZGUgL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC5hcm0ucG9saWN5CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi5zb2Z0d2FyZS5iYXNlLXg4Ni5wb2xpY3kgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIuc29mdHdhcmUuYmFzZS14ODYucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwYzc2MjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIuc29mdHdhcmUuYmFzZS14ODYucG9saWN5CkBAIC0wLDAgKzEsNTcgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3JlYWQ6IDEKK21wcm90ZWN0OiAxCitwcmN0bDogMQorb3BlbmF0OiAxCitnZXR1aWQzMjogMQord3JpdGV2OiAxCitpb2N0bDogMQorY2xvc2U6IDEKK21tYXAyOiAxCitmc3RhdDY0OiAxCittYWR2aXNlOiAxCitmc3RhdGF0NjQ6IDEKK2Z1dGV4OiAxCittdW5tYXA6IDEKK2ZhY2Nlc3NhdDogMQorX2xsc2VlazogMQorbHNlZWs6IDEKK2Nsb25lOiAxCitzaWdhbHRzdGFjazogMQorc2V0cHJpb3JpdHk6IDEKK3Jlc3RhcnRfc3lzY2FsbDogMQorZXhpdDogMQorZXhpdF9ncm91cDogMQorcnRfc2lncmV0dXJuOiAxCit1Z2V0cmxpbWl0OiAxCityZWFkbGlua2F0OiAxCitfbGxzZWVrOiAxCitmc3RhdGZzNjQ6IDEKK3ByZWFkNjQ6IDEKK21yZW1hcDogMQorZHVwOiAxCitzZXRfdGlkX2FkZHJlc3M6IDEKK3dyaXRlOiAxCituYW5vc2xlZXA6IDEKKworIyBSZXF1aXJlZCBieSBBZGRyZXNzU2FuaXRpemVyCitnZXR0aWQ6IDEKK3NjaGVkX3lpZWxkOiAxCitnZXRwaWQ6IDEKK2dldHRpZDogMQorCitAaW5jbHVkZSAvc3lzdGVtL2V0Yy9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLng4Ni5wb2xpY3kKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnZlbmRvci5iYXNlLWFybS5wb2xpY3kgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UtYXJtLnBvbGljeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTg3MWQxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnZlbmRvci5iYXNlLWFybS5wb2xpY3kKQEAgLTAsMCArMSw3MyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIyBPcmdhbml6ZWQgYnkgZnJlcXVlbmN5IG9mIHN5c3RlbWNhbGwgLSBpbiBkZXNjZW5kaW5nIG9yZGVyIGZvcgorIyBiZXN0IHBlcmZvcm1hbmNlLgorZnV0ZXg6IDEKK2lvY3RsOiAxCit3cml0ZTogMQorcHJjdGw6IDEKK2Nsb2NrX2dldHRpbWU6IDEKK2dldHByaW9yaXR5OiAxCityZWFkOiAxCitjbG9zZTogMQord3JpdGV2OiAxCitkdXA6IDEKK3Bwb2xsOiAxCittbWFwMjogMQorZ2V0cmFuZG9tOiAxCisKKyMgbXJlbWFwOiBFbnN1cmUgfGZsYWdzfCBhcmUgKE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVEKSBUT0RPOiBPbmNlIG1pbmlqYWlsCisjIHBhcnNlciBzdXBwb3J0IGZvciAnPCcgaXMgaW4gdGhpcyBuZWVkcyB0byBiZSBtb2RpZmllZCB0byBhbHNvIHByZXZlbnQKKyMgfG9sZF9hZGRyZXNzfCBhbmQgfG5ld19hZGRyZXNzfCBmcm9tIHRvdWNoaW5nIHRoZSBleGNlcHRpb24gdmVjdG9yIHBhZ2UsIHdoaWNoCisjIG9uIEFSTSBpcyBzdGF0aWNhbGx5IGxvYWRlZCBhdCAweGZmZmYgMDAwMC4gU2VlCisjIGh0dHA6Ly9pbmZvY2VudGVyLmFybS5jb20vaGVscC9pbmRleC5qc3A/dG9waWM9L2NvbS5hcm0uZG9jLmRkaTAyMTFoL0JhYmZlZWdhLmh0bWwKKyMgZm9yIG1vcmUgZGV0YWlscy4KK21yZW1hcDogYXJnMyA9PSAzCittdW5tYXA6IDEKK21wcm90ZWN0OiAxCittYWR2aXNlOiAxCitvcGVuYXQ6IDEKK3NpZ2FsdHN0YWNrOiAxCitjbG9uZTogMQorc2V0cHJpb3JpdHk6IDEKK2dldHVpZDMyOiAxCitmc3RhdDY0OiAxCitmc3RhdGZzNjQ6IDEKK3ByZWFkNjQ6IDEKK2ZhY2Nlc3NhdDogMQorcmVhZGxpbmthdDogMQorZXhpdDogMQorcnRfc2lncHJvY21hc2s6IDEKK3NldF90aWRfYWRkcmVzczogMQorcmVzdGFydF9zeXNjYWxsOiAxCitleGl0X2dyb3VwOiAxCitydF9zaWdyZXR1cm46IDEKK3BpcGUyOiAxCitnZXR0aW1lb2ZkYXk6IDEKK3NjaGVkX3lpZWxkOiAxCituYW5vc2xlZXA6IDEKK2xzZWVrOiAxCitfbGxzZWVrOiAxCitzY2hlZF9nZXRfcHJpb3JpdHlfbWF4OiAxCitzY2hlZF9nZXRfcHJpb3JpdHlfbWluOiAxCitzdGF0ZnM2NDogMQorc2NoZWRfc2V0c2NoZWR1bGVyOiAxCitmc3RhdGF0NjQ6IDEKK3VnZXRybGltaXQ6IDEKK2dldGRlbnRzNjQ6IDEKK2dldHJhbmRvbTogMQorCitAaW5jbHVkZSAvc3lzdGVtL2V0Yy9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLmFybS5wb2xpY3kKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnZlbmRvci5iYXNlLXg4Ni5wb2xpY3kgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UteDg2LnBvbGljeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGM3NjI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnZlbmRvci5iYXNlLXg4Ni5wb2xpY3kKQEAgLTAsMCArMSw1NyBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcmVhZDogMQorbXByb3RlY3Q6IDEKK3ByY3RsOiAxCitvcGVuYXQ6IDEKK2dldHVpZDMyOiAxCit3cml0ZXY6IDEKK2lvY3RsOiAxCitjbG9zZTogMQorbW1hcDI6IDEKK2ZzdGF0NjQ6IDEKK21hZHZpc2U6IDEKK2ZzdGF0YXQ2NDogMQorZnV0ZXg6IDEKK211bm1hcDogMQorZmFjY2Vzc2F0OiAxCitfbGxzZWVrOiAxCitsc2VlazogMQorY2xvbmU6IDEKK3NpZ2FsdHN0YWNrOiAxCitzZXRwcmlvcml0eTogMQorcmVzdGFydF9zeXNjYWxsOiAxCitleGl0OiAxCitleGl0X2dyb3VwOiAxCitydF9zaWdyZXR1cm46IDEKK3VnZXRybGltaXQ6IDEKK3JlYWRsaW5rYXQ6IDEKK19sbHNlZWs6IDEKK2ZzdGF0ZnM2NDogMQorcHJlYWQ2NDogMQorbXJlbWFwOiAxCitkdXA6IDEKK3NldF90aWRfYWRkcmVzczogMQord3JpdGU6IDEKK25hbm9zbGVlcDogMQorCisjIFJlcXVpcmVkIGJ5IEFkZHJlc3NTYW5pdGl6ZXIKK2dldHRpZDogMQorc2NoZWRfeWllbGQ6IDEKK2dldHBpZDogMQorZ2V0dGlkOiAxCisKK0BpbmNsdWRlIC9zeXN0ZW0vZXRjL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAueDg2LnBvbGljeQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy92ZW5kb3IuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvdmVuZG9yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjJmOThlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvdmVuZG9yLmNwcApAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMC1zZXJ2aWNlIgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxtaW5pamFpbC5oPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKworLy8gT214U3RvcmUgaXMgYWRkZWQgZm9yIHZpc2liaWxpdHkgYnkgZHVtcHN0YXRlLgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuaD4KKworLy8gVGhpcyBpcyBjcmVhdGVkIGJ5IG1vZHVsZSAiY29kZWMyLnZlbmRvci5iYXNlLnBvbGljeSIuIFRoaXMgY2FuIGJlIG1vZGlmaWVkLgorc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtCYXNlU2VjY29tcFBvbGljeVBhdGhbXSA9CisgICAgICAgICIvdmVuZG9yL2V0Yy9zZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmJhc2UucG9saWN5IjsKKworLy8gQWRkaXRpb25hbCBkZXZpY2Utc3BlY2lmaWMgc2VjY29tcCBwZXJtaXNzaW9ucyBjYW4gYmUgYWRkZWQgaW4gdGhpcyBmaWxlLgorc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtFeHRTZWNjb21wUG9saWN5UGF0aFtdID0KKyAgICAgICAgIi92ZW5kb3IvZXRjL3NlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuZXh0LnBvbGljeSI7CisKK2NsYXNzIER1bW15QzJTdG9yZSA6IHB1YmxpYyBDMkNvbXBvbmVudFN0b3JlIHsKK3B1YmxpYzoKKyAgICBEdW1teUMyU3RvcmUoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIH5EdW1teUMyU3RvcmUoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiAiZGVmYXVsdCI7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBDMlN0cmluZyAvKm5hbWUqLywKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IC8qY29tcG9uZW50Ki8pIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEMyX05PVF9GT1VORDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIEMyU3RyaW5nIC8qIG5hbWUgKi8sCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCAvKiBpbnRlcmZhY2UgKi8pIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEMyX05PVF9GT1VORDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4KKyAgICAgICAgICAgIGxpc3RDb21wb25lbnRzKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4ge307CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb3B5QnVmZmVyKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gLyogc3JjICovLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gLyogZHN0ICovKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlfc20oCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiYgLyogc3RhY2tQYXJhbXMgKi8sCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiYgLyogaGVhcFBhcmFtSW5kaWNlcyAqLywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgLyogaGVhcFBhcmFtcyAqLykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZ19zbSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiYgLyogcGFyYW1zICovLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCAvKiBmYWlsdXJlcyAqLykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBnZXRQYXJhbVJlZmxlY3RvcigpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtc19uYigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+KiBjb25zdCAvKiBwYXJhbXMgKi8pIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlc19zbSgKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4mIC8qIGZpZWxkcyAqLykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9Cit9OworCitpbnQgbWFpbihpbnQgLyogYXJnYyAqLywgY2hhcioqIC8qIGFyZ3YgKi8pIHsKKyAgICBBTE9HRCgiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAtc2VydmljZSBzdGFydGluZy4uLiIpOworCisgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworICAgIGFuZHJvaWQ6OlNldFVwTWluaWphaWwoa0Jhc2VTZWNjb21wUG9saWN5UGF0aCwga0V4dFNlY2NvbXBQb2xpY3lQYXRoKTsKKworICAgIC8vIHZuZGJpbmRlciBpcyBuZWVkZWQgYnkgQnVmZmVyUXVldWUuCisgICAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjppbml0V2l0aERyaXZlcigiL2Rldi92bmRiaW5kZXIiKTsKKyAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CisKKyAgICAvLyBFeHRyYSB0aHJlYWRzIG1heSBiZSBuZWVkZWQgdG8gaGFuZGxlIGEgc3RhY2tlZCBJUEMgc2VxdWVuY2UgdGhhdAorICAgIC8vIGNvbnRhaW5zIGFsdGVybmF0aW5nIGJpbmRlciBhbmQgaHdiaW5kZXIgY2FsbHMuIChTZWUgYi8zNTI4MzQ4MC4pCisgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2woOCwgdHJ1ZSAvKiBjYWxsZXJXaWxsSm9pbiAqLyk7CisKKyAgICAvLyBDcmVhdGUgSUNvbXBvbmVudFN0b3JlIHNlcnZpY2UuCisgICAgeworICAgICAgICB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOworICAgICAgICBhbmRyb2lkOjpzcDxJQ29tcG9uZW50U3RvcmU+IHN0b3JlOworCisgICAgICAgIC8vIFZlbmRvcidzIFRPRE86IFJlcGxhY2UgdGhpcyB3aXRoCisgICAgICAgIC8vIHN0b3JlID0gbmV3IHV0aWxzOjpDb21wb25lbnRTdG9yZSgKKyAgICAgICAgLy8gICAgICAgICAvKiBpbXBsZW1lbnRhdGlvbiBvZiBDMkNvbXBvbmVudFN0b3JlICovKTsKKyAgICAgICAgQUxPR0QoIkluc3RhbnRpYXRpbmcgQ29kZWMyJ3MgZHVtbXkgSUNvbXBvbmVudFN0b3JlIHNlcnZpY2UuLi4iKTsKKyAgICAgICAgc3RvcmUgPSBuZXcgdXRpbHM6OkNvbXBvbmVudFN0b3JlKAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8RHVtbXlDMlN0b3JlPigpKTsKKworICAgICAgICBpZiAoc3RvcmUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBjcmVhdGUgQ29kZWMyJ3MgSUNvbXBvbmVudFN0b3JlIHNlcnZpY2UuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoc3RvcmUtPnJlZ2lzdGVyQXNTZXJ2aWNlKCJkZWZhdWx0IikgIT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IHJlZ2lzdGVyIENvZGVjMidzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJJQ29tcG9uZW50U3RvcmUgc2VydmljZS4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0koIkNvZGVjMidzIElDb21wb25lbnRTdG9yZSBzZXJ2aWNlIGNyZWF0ZWQuIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZWdpc3RlciBJT214U3RvcmUgc2VydmljZS4KKyAgICB7CisgICAgICAgIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOworICAgICAgICBhbmRyb2lkOjpzcDxJT214U3RvcmU+IG9teFN0b3JlID0gbmV3IGltcGxlbWVudGF0aW9uOjpPbXhTdG9yZSgpOworICAgICAgICBpZiAob214U3RvcmUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBjcmVhdGUgSU9teFN0b3JlIEhBTCBzZXJ2aWNlLiIpOworICAgICAgICB9IGVsc2UgaWYgKG9teFN0b3JlLT5yZWdpc3RlckFzU2VydmljZSgpICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IHJlZ2lzdGVyIElPbXhTdG9yZSBIQUwgc2VydmljZS4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpqb2luUnBjVGhyZWFkcG9vbCgpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWU4MGVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1OSBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJzZnBsdWdpbl9jY29kZWMiLAorCisgICAgc3JjczogWworICAgICAgICAiQzJPTVhOb2RlLmNwcCIsCisgICAgICAgICJDQ29kZWMuY3BwIiwKKyAgICAgICAgIkNDb2RlY0J1ZmZlckNoYW5uZWwuY3BwIiwKKyAgICAgICAgIkNDb2RlY0J1ZmZlcnMuY3BwIiwKKyAgICAgICAgIkNDb2RlY0NvbmZpZy5jcHAiLAorICAgICAgICAiQ29kZWMyQnVmZmVyLmNwcCIsCisgICAgICAgICJDb2RlYzJJbmZvQnVpbGRlci5jcHAiLAorICAgICAgICAiUGlwZWxpbmVXYXRjaGVyLmNwcCIsCisgICAgICAgICJSZWZsZWN0ZWRQYXJhbVVwZGF0ZXIuY3BwIiwKKyAgICAgICAgIlNraXBDdXRCdWZmZXIuY3BwIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9pbnRlcm5hbCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX2NsaWVudCIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmhpZGxhbGxvY2F0b3J1dGlscyIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlY191dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9jb2RlY2Jhc2UiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXhfdXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0MyT01YTm9kZS5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGY2MmY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0MyT01YTm9kZS5jcHAKQEAgLTAsMCArMSwzNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZkZWYgX19MUDY0X18KKyNkZWZpbmUgT01YX0FORFJPSURfQ09NUElMRV9BU18zMkJJVF9PTl82NEJJVF9QTEFURk9STVMKKyNlbmRpZgorCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyT01YTm9kZSIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisKKyNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8T01YX0luZGV4Lmg+CisjaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHVpL0ZlbmNlLmg+CisjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgorCisjaW5jbHVkZSAiQzJPTVhOb2RlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgQnVmZmVyMkQgOiBwdWJsaWMgQzJCdWZmZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEJ1ZmZlcjJEKEMyQ29uc3RHcmFwaGljQmxvY2sgYmxvY2spIDogQzJCdWZmZXIoeyBibG9jayB9KSB7fQorfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK0MyT01YTm9kZTo6QzJPTVhOb2RlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXApCisgICAgOiBtQ29tcChjb21wKSwgbUZyYW1lSW5kZXgoMCksIG1XaWR0aCgwKSwgbUhlaWdodCgwKSwgbVVzYWdlKDApLAorICAgICAgbUFkanVzdFRpbWVzdGFtcEdhcFVzKDApLCBtRmlyc3RJbnB1dEZyYW1lKHRydWUpIHsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpmcmVlTm9kZSgpIHsKKyAgICBtQ29tcC5yZXNldCgpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpzZW5kQ29tbWFuZChPTVhfQ09NTUFORFRZUEUgY21kLCBPTVhfUzMyIHBhcmFtKSB7CisgICAgaWYgKGNtZCA9PSBPTVhfQ29tbWFuZFN0YXRlU2V0ICYmIHBhcmFtID09IE9NWF9TdGF0ZUxvYWRlZCkgeworICAgICAgICAvLyBSZXNldCBmaXJzdCBpbnB1dCBmcmFtZSBzbyBpZiBDMk9NWE5vZGUgaXMgcmVjeWNsZWQsIHRoZSB0aW1lc3RhbXAgZG9lcyBub3QgYmVjb21lCisgICAgICAgIC8vIG5lZ2F0aXZlLiBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgSFcgY29kZWNzIHRoYXQgZG8gbm90IGhhbmRsZSB0aW1lc3RhbXAgcm9sbG92ZXIuCisgICAgICAgIG1GaXJzdElucHV0RnJhbWUgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6Z2V0UGFyYW1ldGVyKE9NWF9JTkRFWFRZUEUgaW5kZXgsIHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICBzd2l0Y2ggKCh1aW50MzJfdClpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtQ29uc3VtZXJVc2FnZUJpdHM6IHsKKyAgICAgICAgICAgIE9NWF9VMzIgKnVzYWdlID0gKE9NWF9VMzIgKilwYXJhbXM7CisgICAgICAgICAgICAqdXNhZ2UgPSBtVXNhZ2U7CisgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbjogeworICAgICAgICAgICAgaWYgKHNpemUgPCBzaXplb2YoT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSAqcERlZiA9IChPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICopcGFyYW1zOworICAgICAgICAgICAgLy8gVE9ETzogcmVhZCB0aGVzZSBmcm9tIGludGYoKQorICAgICAgICAgICAgcERlZi0+bkJ1ZmZlckNvdW50QWN0dWFsID0gMTY7CisgICAgICAgICAgICBwRGVmLT5lRG9tYWluID0gT01YX1BvcnREb21haW5WaWRlbzsKKyAgICAgICAgICAgIHBEZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCA9IG1XaWR0aDsKKyAgICAgICAgICAgIHBEZWYtPmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQgPSBtSGVpZ2h0OworICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6c2V0UGFyYW1ldGVyKE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAocGFyYW1zID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3dpdGNoICgodWludDMyX3QpaW5kZXgpIHsKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbU1heEZyYW1lRHVyYXRpb25Gb3JCaXRyYXRlQ29udHJvbDoKKyAgICAgICAgICAgIC8vIGhhbmRsZSBtYXgvZml4ZWQgZnJhbWUgZHVyYXRpb24gY29udHJvbAorICAgICAgICAgICAgaWYgKHNpemUgIT0gc2l6ZW9mKE9NWF9QQVJBTV9VMzJUWVBFKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBUaGUgaW5jb21pbmcgbnVtYmVyIGlzIGFuIGludDMyX3QgY29udGFpbmVkIGluIE9NWF9VMzIuCisgICAgICAgICAgICBtQWRqdXN0VGltZXN0YW1wR2FwVXMgPSAoaW50MzJfdCkoKE9NWF9QQVJBTV9VMzJUWVBFKilwYXJhbXMpLT5uVTMyOworICAgICAgICAgICAgcmV0dXJuIE9LOworCisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1Db25zdW1lclVzYWdlQml0czoKKyAgICAgICAgICAgIGlmIChzaXplICE9IHNpemVvZihPTVhfVTMyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVXNhZ2UgPSAqKChPTVhfVTMyICopcGFyYW1zKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmdldENvbmZpZyhPTVhfSU5ERVhUWVBFIGluZGV4LCB2b2lkICpjb25maWcsIHNpemVfdCBzaXplKSB7CisgICAgKHZvaWQpaW5kZXg7CisgICAgKHZvaWQpY29uZmlnOworICAgICh2b2lkKXNpemU7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnNldENvbmZpZyhPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCB2b2lkICpjb25maWcsIHNpemVfdCBzaXplKSB7CisgICAgKHZvaWQpaW5kZXg7CisgICAgKHZvaWQpY29uZmlnOworICAgICh2b2lkKXNpemU7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnNldFBvcnRNb2RlKE9NWF9VMzIgcG9ydEluZGV4LCBJT01YOjpQb3J0TW9kZSBtb2RlKSB7CisgICAgKHZvaWQpcG9ydEluZGV4OworICAgICh2b2lkKW1vZGU7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrKAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLAorICAgICAgICBPTVhfVTMyIG1heEZyYW1lV2lkdGgsIE9NWF9VMzIgbWF4RnJhbWVIZWlnaHQpIHsKKyAgICAodm9pZClwb3J0SW5kZXg7CisgICAgKHZvaWQpZW5hYmxlOworICAgICh2b2lkKW1heEZyYW1lV2lkdGg7CisgICAgKHZvaWQpbWF4RnJhbWVIZWlnaHQ7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmNvbmZpZ3VyZVZpZGVvVHVubmVsTW9kZSgKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9CT09MIHR1bm5lbGVkLAorICAgICAgICBPTVhfVTMyIGF1ZGlvSHdTeW5jLCBuYXRpdmVfaGFuZGxlX3QgKipzaWRlYmFuZEhhbmRsZSkgeworICAgICh2b2lkKXBvcnRJbmRleDsKKyAgICAodm9pZCl0dW5uZWxlZDsKKyAgICAodm9pZClhdWRpb0h3U3luYzsKKyAgICAqc2lkZWJhbmRIYW5kbGUgPSBudWxscHRyOworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpnZXRHcmFwaGljQnVmZmVyVXNhZ2UoT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9VMzIqIHVzYWdlKSB7CisgICAgKHZvaWQpcG9ydEluZGV4OworICAgICp1c2FnZSA9IDA7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnNldElucHV0U3VyZmFjZShjb25zdCBzcDxJT01YQnVmZmVyU291cmNlPiAmYnVmZmVyU291cmNlKSB7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gR2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpLT5mZXRjaEFsbG9jYXRvcigKKyAgICAgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6R1JBTExPQywKKyAgICAgICAgICAgICZtQWxsb2NhdG9yKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtQnVmZmVyU291cmNlID0gYnVmZmVyU291cmNlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjphbGxvY2F0ZVNlY3VyZUJ1ZmZlcigKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIHNpemVfdCBzaXplLCBidWZmZXJfaWQgKmJ1ZmZlciwKKyAgICAgICAgdm9pZCAqKmJ1ZmZlckRhdGEsIHNwPE5hdGl2ZUhhbmRsZT4gKm5hdGl2ZUhhbmRsZSkgeworICAgICh2b2lkKXBvcnRJbmRleDsKKyAgICAodm9pZClzaXplOworICAgICh2b2lkKW5hdGl2ZUhhbmRsZTsKKyAgICAqYnVmZmVyID0gMDsKKyAgICAqYnVmZmVyRGF0YSA9IG51bGxwdHI7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnVzZUJ1ZmZlcigKKyAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGNvbnN0IE9NWEJ1ZmZlciAmb214QnVmLCBidWZmZXJfaWQgKmJ1ZmZlcikgeworICAgICh2b2lkKXBvcnRJbmRleDsKKyAgICAodm9pZClvbXhCdWY7CisgICAgKmJ1ZmZlciA9IDA7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmZyZWVCdWZmZXIoT01YX1UzMiBwb3J0SW5kZXgsIGJ1ZmZlcl9pZCBidWZmZXIpIHsKKyAgICAodm9pZClwb3J0SW5kZXg7CisgICAgKHZvaWQpYnVmZmVyOworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpmaWxsQnVmZmVyKAorICAgICAgICBidWZmZXJfaWQgYnVmZmVyLCBjb25zdCBPTVhCdWZmZXIgJm9teEJ1ZiwgaW50IGZlbmNlRmQpIHsKKyAgICAodm9pZClidWZmZXI7CisgICAgKHZvaWQpb214QnVmOworICAgICh2b2lkKWZlbmNlRmQ7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmVtcHR5QnVmZmVyKAorICAgICAgICBidWZmZXJfaWQgYnVmZmVyLCBjb25zdCBPTVhCdWZmZXIgJm9teEJ1ZiwKKyAgICAgICAgT01YX1UzMiBmbGFncywgT01YX1RJQ0tTIHRpbWVzdGFtcCwgaW50IGZlbmNlRmQpIHsKKyAgICAvLyBUT0RPOiBiZXR0ZXIgZmVuY2UgaGFuZGxpbmcKKyAgICBpZiAoZmVuY2VGZCA+PSAwKSB7CisgICAgICAgIHNwPEZlbmNlPiBmZW5jZSA9IG5ldyBGZW5jZShmZW5jZUZkKTsKKyAgICAgICAgZmVuY2UtPndhaXRGb3JldmVyKExPR19UQUcpOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXAgPSBtQ29tcC5sb2NrKCk7CisgICAgaWYgKCFjb21wKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHVpbnQzMl90IGMyRmxhZ3MgPSAoZmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpCisgICAgICAgICAgICA/IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0gOiAwOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2s7CisKKyAgICBDMkhhbmRsZSAqaGFuZGxlID0gbnVsbHB0cjsKKyAgICBpZiAob214QnVmLm1CdWZmZXJUeXBlID09IE9NWEJ1ZmZlcjo6a0J1ZmZlclR5cGVBTldCdWZmZXIKKyAgICAgICAgICAgICYmIG9teEJ1Zi5tR3JhcGhpY0J1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgaGFuZGxlID0gV3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoCisgICAgICAgICAgICAgICAgb214QnVmLm1HcmFwaGljQnVmZmVyLT5oYW5kbGUsCisgICAgICAgICAgICAgICAgb214QnVmLm1HcmFwaGljQnVmZmVyLT53aWR0aCwKKyAgICAgICAgICAgICAgICBvbXhCdWYubUdyYXBoaWNCdWZmZXItPmhlaWdodCwKKyAgICAgICAgICAgICAgICBvbXhCdWYubUdyYXBoaWNCdWZmZXItPmZvcm1hdCwKKyAgICAgICAgICAgICAgICBvbXhCdWYubUdyYXBoaWNCdWZmZXItPnVzYWdlLAorICAgICAgICAgICAgICAgIG9teEJ1Zi5tR3JhcGhpY0J1ZmZlci0+c3RyaWRlKTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jYXRvci0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihoYW5kbGUsICZhbGxvYyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soYWxsb2MpOworICAgIH0gZWxzZSBpZiAoIShmbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrKG5ldyBDMldvcmspOworICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWMyRmxhZ3M7CisgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisKKyAgICAvLyBXT1JLQVJPVU5EOiBhZGp1c3QgdGltZXN0YW1wIGJhc2VkIG9uIGdhcFVzCisgICAgeworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWwgPSB0aW1lc3RhbXA7IC8vIHNhdmUgaW5wdXQgdGltZXN0YW1wCisgICAgICAgIGlmIChtRmlyc3RJbnB1dEZyYW1lKSB7CisgICAgICAgICAgICAvLyBncmFiIHRpbWVzdGFtcHMgb24gZmlyc3QgZnJhbWUKKyAgICAgICAgICAgIG1QcmV2SW5wdXRUaW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgICAgICBtUHJldkNvZGVjVGltZXN0YW1wID0gdGltZXN0YW1wOworICAgICAgICAgICAgbUZpcnN0SW5wdXRGcmFtZSA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKG1BZGp1c3RUaW1lc3RhbXBHYXBVcyA+IDApIHsKKyAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0KKyAgICAgICAgICAgICAgICBtUHJldkNvZGVjVGltZXN0YW1wCisgICAgICAgICAgICAgICAgICAgICAgICArIGMyX21pbigodGltZXN0YW1wIC0gbVByZXZJbnB1dFRpbWVzdGFtcCkucGVlaygpLCBtQWRqdXN0VGltZXN0YW1wR2FwVXMpOworICAgICAgICB9IGVsc2UgaWYgKG1BZGp1c3RUaW1lc3RhbXBHYXBVcyA8IDApIHsKKyAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gbVByZXZDb2RlY1RpbWVzdGFtcCAtIG1BZGp1c3RUaW1lc3RhbXBHYXBVczsKKyAgICAgICAgfQorICAgICAgICBtUHJldklucHV0VGltZXN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC5jdXN0b21PcmRpbmFsOworICAgICAgICBtUHJldkNvZGVjVGltZXN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXA7CisgICAgICAgIEFMT0dWKCJhZGp1c3RpbmcgJWxsZCB0byAlbGxkIChnYXA9JWxsZCkiLAorICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWwucGVla2xsKCksCisgICAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWtsbCgpLAorICAgICAgICAgICAgICAobG9uZyBsb25nKW1BZGp1c3RUaW1lc3RhbXBHYXBVcyk7CisgICAgfQorCisgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gbUZyYW1lSW5kZXgrKzsKKyAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgaWYgKGJsb2NrKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYzJCdWZmZXIoCisgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcjJEKGJsb2NrLT5zaGFyZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVjdChibG9jay0+d2lkdGgoKSwgYmxvY2stPmhlaWdodCgpKSwgOjpDMkZlbmNlKCkpKSk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGMyQnVmZmVyKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICB1aW50NjRfdCBpbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworCisgICAgYzJfc3RhdHVzX3QgZXJyID0gY29tcC0+cXVldWUoJml0ZW1zKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG1CdWZmZXJJZHNJblVzZS5sb2NrKCktPmVtcGxhY2UoaW5kZXgsIGJ1ZmZlcik7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmdldEV4dGVuc2lvbkluZGV4KAorICAgICAgICBjb25zdCBjaGFyICpwYXJhbWV0ZXJOYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCkgeworICAgICh2b2lkKXBhcmFtZXRlck5hbWU7CisgICAgKmluZGV4ID0gT01YX0luZGV4TWF4OworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpkaXNwYXRjaE1lc3NhZ2UoY29uc3Qgb214X21lc3NhZ2UmIG1zZykgeworICAgIGlmIChtc2cudHlwZSAhPSBvbXhfbWVzc2FnZTo6RVZFTlQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKyAgICBpZiAobXNnLnUuZXZlbnRfZGF0YS5ldmVudCAhPSBPTVhfRXZlbnREYXRhU3BhY2VDaGFuZ2VkKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlID0gKGFuZHJvaWRfZGF0YXNwYWNlKW1zZy51LmV2ZW50X2RhdGEuZGF0YTE7CisgICAgdWludDMyX3QgcGl4ZWxGb3JtYXQgPSBtc2cudS5ldmVudF9kYXRhLmRhdGEzOworCisgICAgLy8gVE9ETzogc2V0IGRhdGFzcGFjZSBvbiBjb21wb25lbnQgdG8gc2VlIGlmIGl0IGltcGFjdHMgY29sb3IgYXNwZWN0cworICAgIEFMT0dEKCJkYXRhc3BhY2UgY2hhbmdlZCB0byAlI3ggcGl4ZWwgZm9ybWF0OiAlI3giLCBkYXRhU3BhY2UsIHBpeGVsRm9ybWF0KTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3NwPElPTVhCdWZmZXJTb3VyY2U+IEMyT01YTm9kZTo6Z2V0U291cmNlKCkgeworICAgIHJldHVybiBtQnVmZmVyU291cmNlOworfQorCit2b2lkIEMyT01YTm9kZTo6c2V0RnJhbWVTaXplKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKKyAgICBtV2lkdGggPSB3aWR0aDsKKyAgICBtSGVpZ2h0ID0gaGVpZ2h0OworfQorCit2b2lkIEMyT01YTm9kZTo6b25JbnB1dEJ1ZmZlckRvbmUoYzJfY250cjY0X3QgaW5kZXgpIHsKKyAgICBpZiAoIW1CdWZmZXJTb3VyY2UpIHsKKyAgICAgICAgQUxPR0QoIkJ1ZmZlciBzb3VyY2Ugbm90IHNldCAoaW5kZXg9JWxsdSkiLCBpbmRleC5wZWVrdWxsKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCBidWZmZXJJZCA9IDA7CisgICAgeworICAgICAgICBkZWNsdHlwZShtQnVmZmVySWRzSW5Vc2UpOjpMb2NrZWQgYnVmZmVySWRzKG1CdWZmZXJJZHNJblVzZSk7CisgICAgICAgIGF1dG8gaXQgPSBidWZmZXJJZHMtPmZpbmQoaW5kZXgucGVla3UoKSk7CisgICAgICAgIGlmIChpdCA9PSBidWZmZXJJZHMtPmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HVigiVW50cmFja2VkIGlucHV0IGluZGV4ICVsbHUgKG1heWJlIGFscmVhZHkgcmVtb3ZlZCkiLCBpbmRleC5wZWVrdWxsKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJ1ZmZlcklkID0gaXQtPnNlY29uZDsKKyAgICAgICAgKHZvaWQpYnVmZmVySWRzLT5lcmFzZShpdCk7CisgICAgfQorICAgICh2b2lkKW1CdWZmZXJTb3VyY2UtPm9uSW5wdXRCdWZmZXJFbXB0aWVkKGJ1ZmZlcklkLCAtMSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2NhNmMwYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DMk9NWE5vZGUuaApAQCAtMCwwICsxLDEyMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJfT01YX05PREVfSF8KKyNkZWZpbmUgQzJfT01YX05PREVfSF8KKworI2luY2x1ZGUgPGF0b21pYz4KKworI2luY2x1ZGUgPGFuZHJvaWQvSU9NWEJ1ZmZlclNvdXJjZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTXV0ZXhlZC5oPgorI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KKyNpbmNsdWRlIDxtZWRpYS9PTVhCdWZmZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIElPbXhOb2RlIGltcGxlbWVudGF0aW9uIGFyb3VuZCBjb2RlYyAyLjAgY29tcG9uZW50LCBvbmx5IHRvIGJlIHVzZWQgaW4KKyAqIElHcmFwaGljQnVmZmVyU291cmNlOjpjb25maWd1cmUuIE9ubHkgc3Vic2V0IG9mIElPbXhOb2RlIEFQSSBpcyBpbXBsZW1lbnRlZAorICogYW5kIG90aGVycyBhcmUgbGVmdCBhcyBzdHViLiBBcyBhIHJlc3VsdCwgb25lIGNhbm5vdCBleHBlY3QgdGhpcyBJT214Tm9kZQorICogdG8gd29yayBpbiBhbnkgb3RoZXIgdXNhZ2UgdGhhbiBJR3JhcGhpY0J1ZmZlclNvdXJjZS4KKyAqLworc3RydWN0IEMyT01YTm9kZSA6IHB1YmxpYyBCbk9NWE5vZGUgeworICAgIGV4cGxpY2l0IEMyT01YTm9kZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wKTsKKyAgICB+QzJPTVhOb2RlKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgLy8gSU9NWE5vZGUKKyAgICBzdGF0dXNfdCBmcmVlTm9kZSgpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNlbmRDb21tYW5kKE9NWF9DT01NQU5EVFlQRSBjbWQsIE9NWF9TMzIgcGFyYW0pIG92ZXJyaWRlOworICAgIHN0YXR1c190IGdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGdldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldFBvcnRNb2RlKE9NWF9VMzIgcG9ydF9pbmRleCwgSU9NWDo6UG9ydE1vZGUgbW9kZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgcHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2soCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLAorICAgICAgICAgICAgT01YX1UzMiBtYXhGcmFtZVdpZHRoLCBPTVhfVTMyIG1heEZyYW1lSGVpZ2h0KSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBjb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgdHVubmVsZWQsCisgICAgICAgICAgICBPTVhfVTMyIGF1ZGlvSHdTeW5jLCBuYXRpdmVfaGFuZGxlX3QgKipzaWRlYmFuZEhhbmRsZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZ2V0R3JhcGhpY0J1ZmZlclVzYWdlKAorICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfVTMyKiB1c2FnZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc2V0SW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU9NWEJ1ZmZlclNvdXJjZT4gJmJ1ZmZlclNvdXJjZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgYWxsb2NhdGVTZWN1cmVCdWZmZXIoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXgsIHNpemVfdCBzaXplLCBidWZmZXJfaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgIHZvaWQgKipidWZmZXJfZGF0YSwgc3A8TmF0aXZlSGFuZGxlPiAqbmF0aXZlX2hhbmRsZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgdXNlQnVmZmVyKAorICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4LCBjb25zdCBPTVhCdWZmZXIgJm9teEJ1ZiwgYnVmZmVyX2lkICpidWZmZXIpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGZyZWVCdWZmZXIoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXgsIGJ1ZmZlcl9pZCBidWZmZXIpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGZpbGxCdWZmZXIoCisgICAgICAgICAgICBidWZmZXJfaWQgYnVmZmVyLCBjb25zdCBPTVhCdWZmZXIgJm9teEJ1ZiwgaW50IGZlbmNlRmQpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGVtcHR5QnVmZmVyKAorICAgICAgICAgICAgYnVmZmVyX2lkIGJ1ZmZlciwgY29uc3QgT01YQnVmZmVyICZvbXhCdWYsCisgICAgICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wLCBpbnQgZmVuY2VGZCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZ2V0RXh0ZW5zaW9uSW5kZXgoCisgICAgICAgICAgICBjb25zdCBjaGFyICpwYXJhbWV0ZXJfbmFtZSwKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgKmluZGV4KSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBkaXNwYXRjaE1lc3NhZ2UoY29uc3Qgb214X21lc3NhZ2UgJm1zZykgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHVuZGVybHlpbmcgSU9NWEJ1ZmZlclNvdXJjZSBvYmplY3QuCisgICAgICovCisgICAgc3A8SU9NWEJ1ZmZlclNvdXJjZT4gZ2V0U291cmNlKCk7CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmUgdGhlIGZyYW1lIHNpemUuCisgICAgICovCisgICAgdm9pZCBzZXRGcmFtZVNpemUodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCk7CisKKyAgICAvKioKKyAgICAgKiBDbGVhbiB1cCB3b3JrIGl0ZW0gcmVmZXJlbmNlLgorICAgICAqCisgICAgICogXHBhcmFtIGluZGV4IGlucHV0IHdvcmsgaW5kZXgKKyAgICAgKi8KKyAgICB2b2lkIG9uSW5wdXRCdWZmZXJEb25lKGMyX2NudHI2NF90IGluZGV4KTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OndlYWtfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcDsKKyAgICBzcDxJT01YQnVmZmVyU291cmNlPiBtQnVmZmVyU291cmNlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKyAgICBzdGQ6OmF0b21pY191aW50NjRfdCBtRnJhbWVJbmRleDsKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKKyAgICB1aW50NjRfdCBtVXNhZ2U7CisKKyAgICAvLyBXT1JLQVJPVU5EOiB0aW1lc3RhbXAgYWRqdXN0bWVudAorCisgICAgLy8gaWYgPjA6IHRoaXMgaXMgdGhlIG1heCB0aW1lc3RhbXAgZ2FwLCBpZiA8MDogdGhpcyBpcyAtMSB0aW1lcyB0aGUgZml4ZWQgdGltZXN0YW1wIGdhcAorICAgIC8vIGlmIDA6IG5vIHRpbWVzdGFtcCBhZGp1c3RtZW50IGlzIG1hZGUKKyAgICAvLyBub3RlIHRoYXQgQzJPTVhOb2RlIGNhbiBiZSByZWN5Y2xlZCBiZXR3ZWVuIGVuY29kaW5nIHNlc3Npb25zLgorICAgIGludDMyX3QgbUFkanVzdFRpbWVzdGFtcEdhcFVzOworICAgIGJvb2wgbUZpcnN0SW5wdXRGcmFtZTsgLy8gdHJ1ZSBmb3IgZmlyc3QgaW5wdXQKKyAgICBjMl9jbnRyNjRfdCBtUHJldklucHV0VGltZXN0YW1wOyAvLyBpbnB1dCB0aW1lc3RhbXAgZm9yIHByZXZpb3VzIGZyYW1lCisgICAgYzJfY250cjY0X3QgbVByZXZDb2RlY1RpbWVzdGFtcDsgLy8gYWRqdXN0ZWQgKGNvZGVjKSB0aW1lc3RhbXAgZm9yIHByZXZpb3VzIGZyYW1lCisKKyAgICBNdXRleGVkPHN0ZDo6bWFwPHVpbnQ2NF90LCBidWZmZXJfaWQ+PiBtQnVmZmVySWRzSW5Vc2U7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEMyX09NWF9OT0RFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2ZjEzMmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmNwcApAQCAtMCwwICsxLDE4NjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNDb2RlYyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQYXJhbUludGVybmFsLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvSUdyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL0lPTVhCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSUdyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teC5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDxndWkvYnVmZmVycXVldWUvMS4wL0gyQkdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPG1lZGlhL29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9JbmRleEV4dC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0J1ZmZlclByb2R1Y2VyV3JhcHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9QZXJzaXN0ZW50U3VyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJPTVhOb2RlLmgiCisjaW5jbHVkZSAiQ0NvZGVjLmgiCisjaW5jbHVkZSAiQ0NvZGVjQnVmZmVyQ2hhbm5lbC5oIgorI2luY2x1ZGUgIklucHV0U3VyZmFjZVdyYXBwZXIuaCIKKworZXh0ZXJuICJDIiBhbmRyb2lkOjpQZXJzaXN0ZW50U3VyZmFjZSAqQ3JlYXRlSW5wdXRTdXJmYWNlKCk7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vX2xpdGVyYWxzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjp1dGlsczo6SDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOwordXNpbmcgQkdyYXBoaWNCdWZmZXJTb3VyY2UgPSA6OmFuZHJvaWQ6OklHcmFwaGljQnVmZmVyU291cmNlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJSW5wdXRTdXJmYWNlOworCituYW1lc3BhY2UgeworCitjbGFzcyBDQ29kZWNXYXRjaGRvZyA6IHB1YmxpYyBBSGFuZGxlciB7Citwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrV2hhdFdhdGNoLAorICAgIH07CisgICAgY29uc3RleHByIHN0YXRpYyBpbnQ2NF90IGtXYXRjaEludGVydmFsVXMgPSAzMzAwMDAwOyAgLy8gMy4zIHNlY3MKKworcHVibGljOgorICAgIHN0YXRpYyBzcDxDQ29kZWNXYXRjaGRvZz4gZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgIHN0YXRpYyBzcDxDQ29kZWNXYXRjaGRvZz4gaW5zdGFuY2UobmV3IENDb2RlY1dhdGNoZG9nKTsKKyAgICAgICAgc3RhdGljIHN0ZDo6b25jZV9mbGFnIGZsYWc7CisgICAgICAgIC8vIENhbGwgSW5pdCgpIG9ubHkgb25jZS4KKyAgICAgICAgc3RkOjpjYWxsX29uY2UoZmxhZywgSW5pdCwgaW5zdGFuY2UpOworICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgfQorCisgICAgfkNDb2RlY1dhdGNoZG9nKCkgPSBkZWZhdWx0OworCisgICAgdm9pZCB3YXRjaChzcDxDQ29kZWM+IGNvZGVjKSB7CisgICAgICAgIGJvb2wgc2hvdWxkUG9zdCA9IGZhbHNlOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleGVkPHN0ZDo6c2V0PHdwPENDb2RlYz4+Pjo6TG9ja2VkIGNvZGVjcyhtQ29kZWNzVG9XYXRjaCk7CisgICAgICAgICAgICAvLyBJZiBhIHdhdGNoIG1lc3NhZ2UgaXMgaW4gZmxpZ2h0LCBwaWdneS1iYWNrIHRoaXMgaW5zdGFuY2UgYXMgd2VsbC4KKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgcG9zdCBhIG5ldyB3YXRjaCBtZXNzYWdlLgorICAgICAgICAgICAgc2hvdWxkUG9zdCA9IGNvZGVjcy0+ZW1wdHkoKTsKKyAgICAgICAgICAgIGNvZGVjcy0+ZW1wbGFjZShjb2RlYyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNob3VsZFBvc3QpIHsKKyAgICAgICAgICAgIEFMT0dWKCJwb3N0aW5nIHdhdGNoIG1lc3NhZ2UiKTsKKyAgICAgICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRXYXRjaCwgdGhpcykpLT5wb3N0KGtXYXRjaEludGVydmFsVXMpOworICAgICAgICB9CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgICAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgICAgICBjYXNlIGtXaGF0V2F0Y2g6IHsKKyAgICAgICAgICAgICAgICBNdXRleGVkPHN0ZDo6c2V0PHdwPENDb2RlYz4+Pjo6TG9ja2VkIGNvZGVjcyhtQ29kZWNzVG9XYXRjaCk7CisgICAgICAgICAgICAgICAgQUxPR1YoIndhdGNoIGZvciAlenUgY29kZWNzIiwgY29kZWNzLT5zaXplKCkpOworICAgICAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IGNvZGVjcy0+YmVnaW4oKTsgaXQgIT0gY29kZWNzLT5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgICAgICAgICBzcDxDQ29kZWM+IGNvZGVjID0gaXQtPnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNvZGVjLT5pbml0aWF0ZVJlbGVhc2VJZlN0dWNrKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvZGVjcy0+Y2xlYXIoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgIFRSRVNQQVNTKCJDQ29kZWNXYXRjaGRvZzogdW5yZWNvZ25pemVkIG1lc3NhZ2UiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICBDQ29kZWNXYXRjaGRvZygpIDogbUxvb3BlcihuZXcgQUxvb3Blcikge30KKworICAgIHN0YXRpYyB2b2lkIEluaXQoY29uc3Qgc3A8Q0NvZGVjV2F0Y2hkb2c+ICZ0aGl6KSB7CisgICAgICAgIEFMT0dWKCJJbml0Iik7CisgICAgICAgIHRoaXotPm1Mb29wZXItPnNldE5hbWUoIkNDb2RlY1dhdGNoZG9nIik7CisgICAgICAgIHRoaXotPm1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGl6KTsKKyAgICAgICAgdGhpei0+bUxvb3Blci0+c3RhcnQoKTsKKyAgICB9CisKKyAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOworCisgICAgTXV0ZXhlZDxzdGQ6OnNldDx3cDxDQ29kZWM+Pj4gbUNvZGVjc1RvV2F0Y2g7Cit9OworCitjbGFzcyBDMklucHV0U3VyZmFjZVdyYXBwZXIgOiBwdWJsaWMgSW5wdXRTdXJmYWNlV3JhcHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQzJJbnB1dFN1cmZhY2VXcmFwcGVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlPiAmc3VyZmFjZSkgOgorICAgICAgICBtU3VyZmFjZShzdXJmYWNlKSB7CisgICAgfQorCisgICAgfkMySW5wdXRTdXJmYWNlV3JhcHBlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHN0YXR1c190IGNvbm5lY3QoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAobUNvbm5lY3Rpb24gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0b1N0YXR1c1QoY29tcC0+Y29ubmVjdFRvSW5wdXRTdXJmYWNlKG1TdXJmYWNlLCAmbUNvbm5lY3Rpb24pKTsKKyAgICB9CisKKyAgICB2b2lkIGRpc2Nvbm5lY3QoKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtQ29ubmVjdGlvbi0+ZGlzY29ubmVjdCgpOworICAgICAgICAgICAgbUNvbm5lY3Rpb24gPSBudWxscHRyOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhcnQoKSBvdmVycmlkZSB7CisgICAgICAgIC8vIElucHV0U3VyZmFjZSBkb2VzIG5vdCBkaXN0aW5ndWlzaCBzdGFydGVkIHN0YXRlCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgb3ZlcnJpZGUgeworICAgICAgICBDMklucHV0U3VyZmFjZUVvc1R1bmluZyBlb3ModHJ1ZSk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbVN1cmZhY2UtPmNvbmZpZyh7JmVvc30sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0YXR1c190IGNvbmZpZ3VyZShDb25maWcgJmNvbmZpZyBfX3VudXNlZCkgeworICAgICAgICAvLyBUT0RPCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlPiBtU3VyZmFjZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uPiBtQ29ubmVjdGlvbjsKK307CisKK2NsYXNzIEdyYXBoaWNCdWZmZXJTb3VyY2VXcmFwcGVyIDogcHVibGljIElucHV0U3VyZmFjZVdyYXBwZXIgeworcHVibGljOgorLy8gICAgZXhwbGljaXQgR3JhcGhpY0J1ZmZlclNvdXJjZVdyYXBwZXIoY29uc3Qgc3A8QkdyYXBoaWNCdWZmZXJTb3VyY2U+ICZzb3VyY2UpIDogbVNvdXJjZShzb3VyY2UpIHt9CisgICAgR3JhcGhpY0J1ZmZlclNvdXJjZVdyYXBwZXIoCisgICAgICAgICAgICBjb25zdCBzcDxCR3JhcGhpY0J1ZmZlclNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgdWludDY0X3QgdXNhZ2UpCisgICAgICAgIDogbVNvdXJjZShzb3VyY2UpLCBtV2lkdGgod2lkdGgpLCBtSGVpZ2h0KGhlaWdodCkgeworICAgICAgICBtRGF0YVNwYWNlID0gSEFMX0RBVEFTUEFDRV9CVDcwOTsKKyAgICAgICAgbUNvbmZpZy5tVXNhZ2UgPSB1c2FnZTsKKyAgICB9CisgICAgfkdyYXBoaWNCdWZmZXJTb3VyY2VXcmFwcGVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgc3RhdHVzX3QgY29ubmVjdChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wKSBvdmVycmlkZSB7CisgICAgICAgIG1Ob2RlID0gbmV3IEMyT01YTm9kZShjb21wKTsKKyAgICAgICAgbU5vZGUtPnNldEZyYW1lU2l6ZShtV2lkdGgsIG1IZWlnaHQpOworCisgICAgICAgIC8vIFVzYWdlIGlzIHF1ZXJpZWQgZHVyaW5nIGNvbmZpZ3VyZSgpLCBzbyBzZXR0aW5nIGl0IGJlZm9yZWhhbmQuCisgICAgICAgIE9NWF9VMzIgdXNhZ2UgPSBtQ29uZmlnLm1Vc2FnZSAmIDB4RkZGRkZGRkY7CisgICAgICAgICh2b2lkKW1Ob2RlLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1Db25zdW1lclVzYWdlQml0cywKKyAgICAgICAgICAgICAgICAmdXNhZ2UsIHNpemVvZih1c2FnZSkpOworCisgICAgICAgIC8vIE5PVEU6IHdlIGRvIG5vdCB1c2UvcGFzcyB0aHJvdWdoIGNvbG9yIGFzcGVjdHMgZnJvbSBHcmFwaGljQnVmZmVyU291cmNlIGFzIHdlCisgICAgICAgIC8vIGNvbW11bmljYXRlIHRoYXQgZGlyZWN0bHkgdG8gdGhlIGNvbXBvbmVudC4KKyAgICAgICAgbVNvdXJjZS0+Y29uZmlndXJlKG1Ob2RlLCBtRGF0YVNwYWNlKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHZvaWQgZGlzY29ubmVjdCgpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1Ob2RlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzcDxJT01YQnVmZmVyU291cmNlPiBzb3VyY2UgPSBtTm9kZS0+Z2V0U291cmNlKCk7CisgICAgICAgIGlmIChzb3VyY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0QoIkdCU1dyYXBwZXI6OmRpc2Nvbm5lY3Q6IG5vZGUgaXMgbm90IGNvbmZpZ3VyZWQgd2l0aCBPTVhCdWZmZXJTb3VyY2UuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc291cmNlLT5vbk9teElkbGUoKTsKKyAgICAgICAgc291cmNlLT5vbk9teExvYWRlZCgpOworICAgICAgICBtTm9kZS5jbGVhcigpOworICAgIH0KKworICAgIHN0YXR1c190IEdldFN0YXR1cyhjb25zdCBiaW5kZXI6OlN0YXR1cyAmc3RhdHVzKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworICAgICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgIGVyciA9IHN0YXR1cy5zZXJ2aWNlU3BlY2lmaWNFcnJvckNvZGUoKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBzdGF0dXMudHJhbnNhY3Rpb25FcnJvcigpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYmluZGVyIHN0YXR1cyBmYWlsZWQsIGJ1dCB0aGVyZSBpcyBubyBzZXJ2aWUgb3IgdHJhbnNhY3Rpb24gZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGFydCgpIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8SU9NWEJ1ZmZlclNvdXJjZT4gc291cmNlID0gbU5vZGUtPmdldFNvdXJjZSgpOworICAgICAgICBpZiAoc291cmNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisgICAgICAgIGNvbnN0ZXhwciBzaXplX3Qga051bVNsb3RzID0gMTY7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bVNsb3RzOyArK2kpIHsKKyAgICAgICAgICAgIHNvdXJjZS0+b25JbnB1dEJ1ZmZlckFkZGVkKGkpOworICAgICAgICB9CisKKyAgICAgICAgc291cmNlLT5vbk9teEV4ZWN1dGluZygpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEdldFN0YXR1cyhtU291cmNlLT5zaWduYWxFbmRPZklucHV0U3RyZWFtKCkpOworICAgIH0KKworICAgIHN0YXR1c190IGNvbmZpZ3VyZShDb25maWcgJmNvbmZpZykgeworICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzdGF0dXM7CisgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworCisgICAgICAgIC8vIGhhbmRsZSBlYWNoIGNvbmZpZ3VyYXRpb24gZ3JhbnVhbGx5LCBpbiBjYXNlIHdlIG5lZWQgdG8gaGFuZGxlIHBhcnQgb2YgdGhlIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgLy8gZWxzZXdoZXJlCisKKyAgICAgICAgLy8gVFJJQ0tZOiB3ZSBkbyBub3QgdW5zZXQgZnJhbWUgZGVsYXkgcmVwZWF0aW5nCisgICAgICAgIGlmIChjb25maWcubU1pbkZwcyA+IDAgJiYgY29uZmlnLm1NaW5GcHMgIT0gbUNvbmZpZy5tTWluRnBzKSB7CisgICAgICAgICAgICBpbnQ2NF90IHVzID0gMWU2IC8gY29uZmlnLm1NaW5GcHMgKyAwLjU7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBHZXRTdGF0dXMobVNvdXJjZS0+c2V0UmVwZWF0UHJldmlvdXNGcmFtZURlbGF5VXModXMpKTsKKyAgICAgICAgICAgIHN0YXR1cyA8PCAiIG1pbkZwcz0iIDw8IGNvbmZpZy5tTWluRnBzIDw8ICIgPT4gcmVwZWF0RGVsYXlVcz0iIDw8IHVzOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiICg9PiAiIDw8IGFzU3RyaW5nKHJlcykgPDwgIikiOworICAgICAgICAgICAgICAgIGVyciA9IHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db25maWcubU1pbkZwcyA9IGNvbmZpZy5tTWluRnBzOworICAgICAgICB9CisKKyAgICAgICAgLy8gcHRzIGdhcAorICAgICAgICBpZiAoY29uZmlnLm1NaW5BZGp1c3RlZEZwcyA+IDAgfHwgY29uZmlnLm1GaXhlZEFkanVzdGVkRnBzID4gMCkgeworICAgICAgICAgICAgaWYgKG1Ob2RlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBPTVhfUEFSQU1fVTMyVFlQRSBwdHJHYXBQYXJhbSA9IHt9OworICAgICAgICAgICAgICAgIHB0ckdhcFBhcmFtLm5TaXplID0gc2l6ZW9mKE9NWF9QQVJBTV9VMzJUWVBFKTsKKyAgICAgICAgICAgICAgICBmbG9hdCBnYXAgPSAoY29uZmlnLm1NaW5BZGp1c3RlZEZwcyA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICA/IGMyX21pbihJTlQzMl9NQVggKyAwLiwgMWU2IC8gY29uZmlnLm1NaW5BZGp1c3RlZEZwcyArIDAuNSkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogYzJfbWF4KDAuIC0gSU5UMzJfTUFYLCAtMWU2IC8gY29uZmlnLm1GaXhlZEFkanVzdGVkRnBzIC0gMC41KTsKKyAgICAgICAgICAgICAgICAvLyBmbG9hdCAtPiB1aW50MzJfdCBpcyB1bmRlZmluZWQgaWYgdGhlIHZhbHVlIGlzIG5lZ2F0aXZlLgorICAgICAgICAgICAgICAgIC8vIEZpcnN0IGNvbnZlcnQgdG8gaW50MzJfdCB0byBlbnN1cmUgdGhlIGV4cGVjdGVkIGJlaGF2aW9yLgorICAgICAgICAgICAgICAgIHB0ckdhcFBhcmFtLm5VMzIgPSBpbnQzMl90KGdhcCk7CisgICAgICAgICAgICAgICAgKHZvaWQpbU5vZGUtPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtTWF4RnJhbWVEdXJhdGlvbkZvckJpdHJhdGVDb250cm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgJnB0ckdhcFBhcmFtLCBzaXplb2YocHRyR2FwUGFyYW0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIG1heCBmcHMKKyAgICAgICAgLy8gVFJJQ0tZOiB3ZSBkbyBub3QgdW5zZXQgbWF4IGZwcyB0byAwIHVubGVzcyB1c2luZyBmaXhlZCBmcHMKKyAgICAgICAgaWYgKChjb25maWcubU1heEZwcyA+IDAgfHwgKGNvbmZpZy5tRml4ZWRBZGp1c3RlZEZwcyA+IDAgJiYgY29uZmlnLm1NYXhGcHMgPT0gLTEpKQorICAgICAgICAgICAgICAgICYmIGNvbmZpZy5tTWF4RnBzICE9IG1Db25maWcubU1heEZwcykgeworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gR2V0U3RhdHVzKG1Tb3VyY2UtPnNldE1heEZwcyhjb25maWcubU1heEZwcykpOworICAgICAgICAgICAgc3RhdHVzIDw8ICIgbWF4RnBzPSIgPDwgY29uZmlnLm1NYXhGcHM7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzIDw8ICIgKD0+ICIgPDwgYXNTdHJpbmcocmVzKSA8PCAiKSI7CisgICAgICAgICAgICAgICAgZXJyID0gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbmZpZy5tTWF4RnBzID0gY29uZmlnLm1NYXhGcHM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29uZmlnLm1UaW1lT2Zmc2V0VXMgIT0gbUNvbmZpZy5tVGltZU9mZnNldFVzKSB7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBHZXRTdGF0dXMobVNvdXJjZS0+c2V0VGltZU9mZnNldFVzKGNvbmZpZy5tVGltZU9mZnNldFVzKSk7CisgICAgICAgICAgICBzdGF0dXMgPDwgIiB0aW1lT2Zmc2V0ICIgPDwgY29uZmlnLm1UaW1lT2Zmc2V0VXMgPDwgInVzIjsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIiAoPT4gIiA8PCBhc1N0cmluZyhyZXMpIDw8ICIpIjsKKyAgICAgICAgICAgICAgICBlcnIgPSByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29uZmlnLm1UaW1lT2Zmc2V0VXMgPSBjb25maWcubVRpbWVPZmZzZXRVczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb25maWcubUNhcHR1cmVGcHMgIT0gbUNvbmZpZy5tQ2FwdHVyZUZwcyB8fCBjb25maWcubUNvZGVkRnBzICE9IG1Db25maWcubUNvZGVkRnBzKSB7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPQorICAgICAgICAgICAgICAgIEdldFN0YXR1cyhtU291cmNlLT5zZXRUaW1lTGFwc2VDb25maWcoY29uZmlnLm1Db2RlZEZwcywgY29uZmlnLm1DYXB0dXJlRnBzKSk7CisgICAgICAgICAgICBzdGF0dXMgPDwgIiB0aW1lTGFwc2UgIiA8PCBjb25maWcubUNhcHR1cmVGcHMgPDwgImZwcyBhcyAiIDw8IGNvbmZpZy5tQ29kZWRGcHMgPDwgImZwcyI7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzIDw8ICIgKD0+ICIgPDwgYXNTdHJpbmcocmVzKSA8PCAiKSI7CisgICAgICAgICAgICAgICAgZXJyID0gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbmZpZy5tQ2FwdHVyZUZwcyA9IGNvbmZpZy5tQ2FwdHVyZUZwczsKKyAgICAgICAgICAgIG1Db25maWcubUNvZGVkRnBzID0gY29uZmlnLm1Db2RlZEZwczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb25maWcubVN0YXJ0QXRVcyAhPSBtQ29uZmlnLm1TdGFydEF0VXMKKyAgICAgICAgICAgICAgICB8fCAoY29uZmlnLm1TdG9wcGVkICE9IG1Db25maWcubVN0b3BwZWQgJiYgIWNvbmZpZy5tU3RvcHBlZCkpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IEdldFN0YXR1cyhtU291cmNlLT5zZXRTdGFydFRpbWVVcyhjb25maWcubVN0YXJ0QXRVcykpOworICAgICAgICAgICAgc3RhdHVzIDw8ICIgc3RhcnQgYXQgIiA8PCBjb25maWcubVN0YXJ0QXRVcyA8PCAidXMiOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiICg9PiAiIDw8IGFzU3RyaW5nKHJlcykgPDwgIikiOworICAgICAgICAgICAgICAgIGVyciA9IHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db25maWcubVN0YXJ0QXRVcyA9IGNvbmZpZy5tU3RhcnRBdFVzOworICAgICAgICAgICAgbUNvbmZpZy5tU3RvcHBlZCA9IGNvbmZpZy5tU3RvcHBlZDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHN1c3BlbmQtcmVzdW1lCisgICAgICAgIGlmIChjb25maWcubVN1c3BlbmRlZCAhPSBtQ29uZmlnLm1TdXNwZW5kZWQpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IEdldFN0YXR1cyhtU291cmNlLT5zZXRTdXNwZW5kKGNvbmZpZy5tU3VzcGVuZGVkLCBjb25maWcubVN1c3BlbmRBdFVzKSk7CisgICAgICAgICAgICBzdGF0dXMgPDwgIiAiIDw8IChjb25maWcubVN1c3BlbmRlZCA/ICJzdXNwZW5kIiA6ICJyZXN1bWUiKQorICAgICAgICAgICAgICAgICAgICA8PCAiIGF0ICIgPDwgY29uZmlnLm1TdXNwZW5kQXRVcyA8PCAidXMiOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiICg9PiAiIDw8IGFzU3RyaW5nKHJlcykgPDwgIikiOworICAgICAgICAgICAgICAgIGVyciA9IHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db25maWcubVN1c3BlbmRlZCA9IGNvbmZpZy5tU3VzcGVuZGVkOworICAgICAgICAgICAgbUNvbmZpZy5tU3VzcGVuZEF0VXMgPSBjb25maWcubVN1c3BlbmRBdFVzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbmZpZy5tU3RvcHBlZCAhPSBtQ29uZmlnLm1TdG9wcGVkICYmIGNvbmZpZy5tU3RvcHBlZCkgeworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gR2V0U3RhdHVzKG1Tb3VyY2UtPnNldFN0b3BUaW1lVXMoY29uZmlnLm1TdG9wQXRVcykpOworICAgICAgICAgICAgc3RhdHVzIDw8ICIgc3RvcCBhdCAiIDw8IGNvbmZpZy5tU3RvcEF0VXMgPDwgInVzIjsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIiAoPT4gIiA8PCBhc1N0cmluZyhyZXMpIDw8ICIpIjsKKyAgICAgICAgICAgICAgICBlcnIgPSByZXM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiIGRlbGF5VXMiOworICAgICAgICAgICAgICAgIHJlcyA9IEdldFN0YXR1cyhtU291cmNlLT5nZXRTdG9wVGltZU9mZnNldFVzKCZjb25maWcubUlucHV0RGVsYXlVcykpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzIDw8ICIgKD0+ICIgPDwgYXNTdHJpbmcocmVzKSA8PCAiKSI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzIDw8ICI9IiA8PCBjb25maWcubUlucHV0RGVsYXlVcyA8PCAidXMiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ29uZmlnLm1JbnB1dERlbGF5VXMgPSBjb25maWcubUlucHV0RGVsYXlVczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db25maWcubVN0b3BBdFVzID0gY29uZmlnLm1TdG9wQXRVczsKKyAgICAgICAgICAgIG1Db25maWcubVN0b3BwZWQgPSBjb25maWcubVN0b3BwZWQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBjb2xvciBhc3BlY3RzIChhbmRyb2lkLl9jb2xvci1hc3BlY3RzKQorCisgICAgICAgIC8vIGNvbnN1bWVyIHVzYWdlIGlzIHF1ZXJpZWQgZWFybGllci4KKworICAgICAgICBBTE9HRCgiSVNDb25maWclcyIsIHN0YXR1cy5zdHIoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICB2b2lkIG9uSW5wdXRCdWZmZXJEb25lKGMyX2NudHI2NF90IGluZGV4KSBvdmVycmlkZSB7CisgICAgICAgIG1Ob2RlLT5vbklucHV0QnVmZmVyRG9uZShpbmRleCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHNwPEJHcmFwaGljQnVmZmVyU291cmNlPiBtU291cmNlOworICAgIHNwPEMyT01YTm9kZT4gbU5vZGU7CisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CisgICAgQ29uZmlnIG1Db25maWc7Cit9OworCitjbGFzcyBDb2RlYzJDbGllbnRJbnRlcmZhY2VXcmFwcGVyIDogcHVibGljIEMyQ29tcG9uZW50U3RvcmUgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IG1DbGllbnQ7CisKK3B1YmxpYzoKKyAgICBDb2RlYzJDbGllbnRJbnRlcmZhY2VXcmFwcGVyKHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IGNsaWVudCkKKyAgICAgICAgOiBtQ2xpZW50KGNsaWVudCkgeyB9CisKKyAgICB2aXJ0dWFsIH5Db2RlYzJDbGllbnRJbnRlcmZhY2VXcmFwcGVyKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWdfc20oCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtICo+ICZwYXJhbXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gKmNvbnN0IGZhaWx1cmVzKSB7CisgICAgICAgIHJldHVybiBtQ2xpZW50LT5jb25maWcocGFyYW1zLCBDMl9NQVlfQkxPQ0ssIGZhaWx1cmVzKTsKKyAgICB9OworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb3B5QnVmZmVyKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4sCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPikgeworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIEMyU3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+ICpjb25zdCBjb21wb25lbnQpIHsKKyAgICAgICAgY29tcG9uZW50LT5yZXNldCgpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIEMyU3RyaW5nLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICpjb25zdCBpbnRlcmZhY2UpIHsKKyAgICAgICAgaW50ZXJmYWNlLT5yZXNldCgpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5X3NtKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSAqPiAmc3RhY2tQYXJhbXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpjb25zdCBoZWFwUGFyYW1zKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ2xpZW50LT5xdWVyeShzdGFja1BhcmFtcywgaGVhcFBhcmFtSW5kaWNlcywgQzJfTUFZX0JMT0NLLCBoZWFwUGFyYW1zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKmNvbnN0IHBhcmFtcykgY29uc3QgeworICAgICAgICByZXR1cm4gbUNsaWVudC0+cXVlcnlTdXBwb3J0ZWRQYXJhbXMocGFyYW1zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3NtKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ2xpZW50LT5xdWVyeVN1cHBvcnRlZFZhbHVlcyhmaWVsZHMsIEMyX01BWV9CTE9DSyk7CisgICAgfQorCisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNsaWVudC0+Z2V0TmFtZSgpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IGdldFBhcmFtUmVmbGVjdG9yKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNsaWVudC0+Z2V0UGFyYW1SZWZsZWN0b3IoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4gbGlzdENvbXBvbmVudHMoKSB7CisgICAgICAgIHJldHVybiBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+KCk7CisgICAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIENDb2RlYzo6Q2xpZW50TGlzdGVuZXIKKworc3RydWN0IENDb2RlYzo6Q2xpZW50TGlzdGVuZXIgOiBwdWJsaWMgQ29kZWMyQ2xpZW50OjpMaXN0ZW5lciB7CisKKyAgICBleHBsaWNpdCBDbGllbnRMaXN0ZW5lcihjb25zdCB3cDxDQ29kZWM+ICZjb2RlYykgOiBtQ29kZWMoY29kZWMpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrRG9uZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpY29tcG9uZW50OworICAgICAgICBzcDxDQ29kZWM+IGNvZGVjKG1Db2RlYy5wcm9tb3RlKCkpOworICAgICAgICBpZiAoIWNvZGVjKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY29kZWMtPm9uV29ya0RvbmUod29ya0l0ZW1zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25UcmlwcGVkKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiYgc2V0dGluZ1Jlc3VsdAorICAgICAgICAgICAgKSBvdmVycmlkZSB7CisgICAgICAgIC8vIFRPRE8KKyAgICAgICAgKHZvaWQpY29tcG9uZW50OworICAgICAgICAodm9pZClzZXR0aW5nUmVzdWx0OworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbkVycm9yKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICAgICAgICAgIHVpbnQzMl90IGVycm9yQ29kZSkgb3ZlcnJpZGUgeworICAgICAgICAvLyBUT0RPCisgICAgICAgICh2b2lkKWNvbXBvbmVudDsKKyAgICAgICAgKHZvaWQpZXJyb3JDb2RlOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbkRlYXRoKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCkgb3ZlcnJpZGUgeworICAgICAgICB7IC8vIExvZyB0aGUgZGVhdGggb2YgdGhlIGNvbXBvbmVudC4KKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcCA9IGNvbXBvbmVudC5sb2NrKCk7CisgICAgICAgICAgICBpZiAoIWNvbXApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ29kZWMyIGNvbXBvbmVudCBkaWVkLiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ29kZWMyIGNvbXBvbmVudCBcIiVzXCIgZGllZC4iLCBjb21wLT5nZXROYW1lKCkuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXBvcnQgdG8gTWVkaWFDb2RlYy4KKyAgICAgICAgc3A8Q0NvZGVjPiBjb2RlYyhtQ29kZWMucHJvbW90ZSgpKTsKKyAgICAgICAgaWYgKCFjb2RlYyB8fCAhY29kZWMtPm1DYWxsYmFjaykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNvZGVjLT5tQ2FsbGJhY2stPm9uRXJyb3IoREVBRF9PQkpFQ1QsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZVJlbmRlcmVkKHVpbnQ2NF90IGJ1ZmZlclF1ZXVlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNsb3RJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wTnMpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50CisgICAgICAgICh2b2lkKWJ1ZmZlclF1ZXVlSWQ7CisgICAgICAgICh2b2lkKXNsb3RJZDsKKyAgICAgICAgKHZvaWQpdGltZXN0YW1wTnM7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uSW5wdXRCdWZmZXJEb25lKAorICAgICAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCwgc2l6ZV90IGFycmF5SW5kZXgpIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8Q0NvZGVjPiBjb2RlYyhtQ29kZWMucHJvbW90ZSgpKTsKKyAgICAgICAgaWYgKGNvZGVjKSB7CisgICAgICAgICAgICBjb2RlYy0+b25JbnB1dEJ1ZmZlckRvbmUoZnJhbWVJbmRleCwgYXJyYXlJbmRleCk7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgd3A8Q0NvZGVjPiBtQ29kZWM7Cit9OworCisvLyBDQ29kZWNDYWxsYmFja0ltcGwKKworY2xhc3MgQ0NvZGVjQ2FsbGJhY2tJbXBsIDogcHVibGljIENDb2RlY0NhbGxiYWNrIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBDQ29kZWNDYWxsYmFja0ltcGwoQ0NvZGVjICpjb2RlYykgOiBtQ29kZWMoY29kZWMpIHt9CisgICAgfkNDb2RlY0NhbGxiYWNrSW1wbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZvaWQgb25FcnJvcihzdGF0dXNfdCBlcnIsIGVudW0gQWN0aW9uQ29kZSBhY3Rpb25Db2RlKSBvdmVycmlkZSB7CisgICAgICAgIG1Db2RlYy0+bUNhbGxiYWNrLT5vbkVycm9yKGVyciwgYWN0aW9uQ29kZSk7CisgICAgfQorCisgICAgdm9pZCBvbk91dHB1dEZyYW1lc1JlbmRlcmVkKGludDY0X3QgbWVkaWFUaW1lVXMsIG5zZWNzX3QgcmVuZGVyVGltZU5zKSBvdmVycmlkZSB7CisgICAgICAgIG1Db2RlYy0+bUNhbGxiYWNrLT5vbk91dHB1dEZyYW1lc1JlbmRlcmVkKAorICAgICAgICAgICAgICAgIHtSZW5kZXJlZEZyYW1lSW5mbyhtZWRpYVRpbWVVcywgcmVuZGVyVGltZU5zKX0pOworICAgIH0KKworICAgIHZvaWQgb25PdXRwdXRCdWZmZXJzQ2hhbmdlZCgpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNvZGVjLT5tQ2FsbGJhY2stPm9uT3V0cHV0QnVmZmVyc0NoYW5nZWQoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQ0NvZGVjICptQ29kZWM7Cit9OworCisvLyBDQ29kZWMKKworQ0NvZGVjOjpDQ29kZWMoKQorICAgIDogbUNoYW5uZWwobmV3IENDb2RlY0J1ZmZlckNoYW5uZWwoc3RkOjptYWtlX3NoYXJlZDxDQ29kZWNDYWxsYmFja0ltcGw+KHRoaXMpKSkgeworfQorCitDQ29kZWM6On5DQ29kZWMoKSB7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxCdWZmZXJDaGFubmVsQmFzZT4gQ0NvZGVjOjpnZXRCdWZmZXJDaGFubmVsKCkgeworICAgIHJldHVybiBtQ2hhbm5lbDsKK30KKworc3RhdHVzX3QgQ0NvZGVjOjp0cnlBbmRSZXBvcnRPbkVycm9yKHN0ZDo6ZnVuY3Rpb248c3RhdHVzX3QoKT4gam9iKSB7CisgICAgc3RhdHVzX3QgZXJyID0gam9iKCk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IoZXJyLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgfQorICAgIHJldHVybiBlcnI7Cit9CisKK3ZvaWQgQ0NvZGVjOjppbml0aWF0ZUFsbG9jYXRlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgYXV0byBzZXRBbGxvY2F0aW5nID0gW3RoaXNdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IFJFTEVBU0VEKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChBTExPQ0FUSU5HKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH07CisgICAgaWYgKHRyeUFuZFJlcG9ydE9uRXJyb3Ioc2V0QWxsb2NhdGluZykgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPFJlZkJhc2U+IGNvZGVjSW5mbzsKKyAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoImNvZGVjSW5mbyIsICZjb2RlY0luZm8pKTsKKyAgICAvLyBGb3IgQ29kZWMgMi4wIGNvbXBvbmVudHMsIGNvbXBvbmVudE5hbWUgPT0gY29kZWNJbmZvLT5nZXRDb2RlY05hbWUoKS4KKworICAgIHNwPEFNZXNzYWdlPiBhbGxvY01zZyhuZXcgQU1lc3NhZ2Uoa1doYXRBbGxvY2F0ZSwgdGhpcykpOworICAgIGFsbG9jTXNnLT5zZXRPYmplY3QoImNvZGVjSW5mbyIsIGNvZGVjSW5mbyk7CisgICAgYWxsb2NNc2ctPnBvc3QoKTsKK30KKwordm9pZCBDQ29kZWM6OmFsbG9jYXRlKGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiAmY29kZWNJbmZvKSB7CisgICAgaWYgKGNvZGVjSW5mbyA9PSBudWxscHRyKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR0QoImFsbG9jYXRlKCVzKSIsIGNvZGVjSW5mby0+Z2V0Q29kZWNOYW1lKCkpOworICAgIG1DbGllbnRMaXN0ZW5lci5yZXNldChuZXcgQ2xpZW50TGlzdGVuZXIodGhpcykpOworCisgICAgQVN0cmluZyBjb21wb25lbnROYW1lID0gY29kZWNJbmZvLT5nZXRDb2RlY05hbWUoKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBjbGllbnQ7CisKKyAgICAvLyBzZXQgdXAgcHJlZmVycmVkIGNvbXBvbmVudCBzdG9yZSB0byBhY2Nlc3MgdmVuZG9yIHN0b3JlIHBhcmFtZXRlcnMKKyAgICBjbGllbnQgPSBDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKCJkZWZhdWx0Iik7CisgICAgaWYgKGNsaWVudCkgeworICAgICAgICBBTE9HSSgic2V0dGluZyB1cCAnJXMnIGFzIGRlZmF1bHQgKHZlbmRvcikgc3RvcmUiLCBjbGllbnQtPmdldFNlcnZpY2VOYW1lKCkuY19zdHIoKSk7CisgICAgICAgIFNldFByZWZlcnJlZENvZGVjMkNvbXBvbmVudFN0b3JlKAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8Q29kZWMyQ2xpZW50SW50ZXJmYWNlV3JhcHBlcj4oY2xpZW50KSk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wID0KKyAgICAgICAgICAgIENvZGVjMkNsaWVudDo6Q3JlYXRlQ29tcG9uZW50QnlOYW1lKAorICAgICAgICAgICAgY29tcG9uZW50TmFtZS5jX3N0cigpLAorICAgICAgICAgICAgbUNsaWVudExpc3RlbmVyLAorICAgICAgICAgICAgJmNsaWVudCk7CisgICAgaWYgKCFjb21wKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgQ3JlYXRlIGNvbXBvbmVudDogJXMiLCBjb21wb25lbnROYW1lLmNfc3RyKCkpOworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIHN0YXRlLT5zZXQoUkVMRUFTRUQpOworICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgc3RhdGUubG9jaygpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dJKCJDcmVhdGVkIGNvbXBvbmVudCBbJXNdIiwgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICBtQ2hhbm5lbC0+c2V0Q29tcG9uZW50KGNvbXApOworICAgIGF1dG8gc2V0QWxsb2NhdGVkID0gW3RoaXMsIGNvbXAsIGNsaWVudF0geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgIT0gQUxMT0NBVElORykgeworICAgICAgICAgICAgc3RhdGUtPnNldChSRUxFQVNFRCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+c2V0KEFMTE9DQVRFRCk7CisgICAgICAgIHN0YXRlLT5jb21wID0gY29tcDsKKyAgICAgICAgbUNsaWVudCA9IGNsaWVudDsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH07CisgICAgaWYgKHRyeUFuZFJlcG9ydE9uRXJyb3Ioc2V0QWxsb2NhdGVkKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gaW5pdGlhbGl6ZSBjb25maWcgaGVyZSBpbiBjYXNlIHNldFBhcmFtZXRlcnMgaXMgY2FsbGVkIHByaW9yIHRvIGNvbmZpZ3VyZQorICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBjb25maWctPmluaXRpYWxpemUobUNsaWVudCwgY29tcCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGluaXRpYWxpemUgY29uZmlndXJhdGlvbiBzdXBwb3J0Iik7CisgICAgICAgIC8vIFRPRE86IHJlcG9ydCBlcnJvciBvbmNlIHdlIGNvbXBsZXRlIGltcGxlbWVudGF0aW9uLgorICAgIH0KKyAgICBjb25maWctPnF1ZXJ5Q29uZmlndXJhdGlvbihjb21wKTsKKworICAgIG1DYWxsYmFjay0+b25Db21wb25lbnRBbGxvY2F0ZWQoY29tcG9uZW50TmFtZS5jX3N0cigpKTsKK30KKwordm9pZCBDQ29kZWM6OmluaXRpYXRlQ29uZmlndXJlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CisgICAgYXV0byBjaGVja0FsbG9jYXRlZCA9IFt0aGlzXSB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgcmV0dXJuIChzdGF0ZS0+Z2V0KCkgIT0gQUxMT0NBVEVEKSA/IFVOS05PV05fRVJST1IgOiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKGNoZWNrQWxsb2NhdGVkKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IG1zZyhuZXcgQU1lc3NhZ2Uoa1doYXRDb25maWd1cmUsIHRoaXMpKTsKKyAgICBtc2ctPnNldE1lc3NhZ2UoImZvcm1hdCIsIGZvcm1hdCk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpjb25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXA7CisgICAgYXV0byBjaGVja0FsbG9jYXRlZCA9IFt0aGlzLCAmY29tcF0geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgIT0gQUxMT0NBVEVEKSB7CisgICAgICAgICAgICBzdGF0ZS0+c2V0KFJFTEVBU0VEKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNvbXAgPSBzdGF0ZS0+Y29tcDsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH07CisgICAgaWYgKHRyeUFuZFJlcG9ydE9uRXJyb3IoY2hlY2tBbGxvY2F0ZWQpICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIGRvQ29uZmlnID0gW21zZywgY29tcCwgdGhpc10oKSAtPiBzdGF0dXNfdCB7CisgICAgICAgIEFTdHJpbmcgbWltZTsKKyAgICAgICAgaWYgKCFtc2ctPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IGVuY29kZXI7CisgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImVuY29kZXIiLCAmZW5jb2RlcikpIHsKKyAgICAgICAgICAgIGVuY29kZXIgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IHJlYWQgZnJvbSBpbnRmKCkKKyAgICAgICAgaWYgKCghZW5jb2RlcikgIT0gKGNvbXAtPmdldE5hbWUoKS5maW5kKCJlbmNvZGVyIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3Qgc3RvcmVNZXRhOworICAgICAgICBpZiAoZW5jb2RlcgorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEludDMyKCJhbmRyb2lkLl9pbnB1dC1tZXRhZGF0YS1idWZmZXItdHlwZSIsICZzdG9yZU1ldGEpCisgICAgICAgICAgICAgICAgJiYgc3RvcmVNZXRhICE9IGtNZXRhZGF0YUJ1ZmZlclR5cGVJbnZhbGlkKSB7CisgICAgICAgICAgICBpZiAoc3RvcmVNZXRhICE9IGtNZXRhZGF0YUJ1ZmZlclR5cGVBTldCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiT25seSBBTlcgYnVmZmVycyBhcmUgc3VwcG9ydGVkIGZvciBsZWdhY3kgbWV0YWRhdGEgbW9kZSIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2hhbm5lbC0+c2V0TWV0YU1vZGUoQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6TU9ERV9BTlcpOworICAgICAgICB9CisKKyAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlOworICAgICAgICBpZiAobXNnLT5maW5kT2JqZWN0KCJuYXRpdmUtd2luZG93IiwgJm9iaikpIHsKKyAgICAgICAgICAgIHN1cmZhY2UgPSBzdGF0aWNfY2FzdDxTdXJmYWNlICo+KG9iai5nZXQoKSk7CisgICAgICAgICAgICBzZXRTdXJmYWNlKHN1cmZhY2UpOworICAgICAgICB9CisKKyAgICAgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworICAgICAgICBjb25maWctPm1Vc2luZ1N1cmZhY2UgPSBzdXJmYWNlICE9IG51bGxwdHI7CisKKyAgICAgICAgLy8gRW5mb3JjZSByZXF1aXJlZCBwYXJhbWV0ZXJzCisgICAgICAgIGludDMyX3QgaTMyOworICAgICAgICBmbG9hdCBmbHQ7CisgICAgICAgIGlmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0FVRElPKSB7CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKEtFWV9TQU1QTEVfUkFURSwgJmkzMikpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgic2FtcGxlIHJhdGUgaXMgbWlzc2luZywgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIGF1ZGlvIGNvbXBvbmVudHMuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoS0VZX0NIQU5ORUxfQ09VTlQsICZpMzIpKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImNoYW5uZWwgY291bnQgaXMgbWlzc2luZywgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIGF1ZGlvIGNvbXBvbmVudHMuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKQorICAgICAgICAgICAgICAgICAgICAmJiAhbWltZS5lcXVhbHNJZ25vcmVDYXNlKE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpCisgICAgICAgICAgICAgICAgICAgICYmICFtc2ctPmZpbmRJbnQzMihLRVlfQklUX1JBVEUsICZpMzIpCisgICAgICAgICAgICAgICAgICAgICYmICFtc2ctPmZpbmRGbG9hdChLRVlfQklUX1JBVEUsICZmbHQpKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImJpdHJhdGUgaXMgbWlzc2luZywgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIGF1ZGlvIGVuY29kZXJzLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvbmZpZy0+bURvbWFpbiAmIChDb25maWc6OklTX0lNQUdFIHwgQ29uZmlnOjpJU19WSURFTykpIHsKKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoS0VZX1dJRFRILCAmaTMyKSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJ3aWR0aCBpcyBtaXNzaW5nLCB3aGljaCBpcyByZXF1aXJlZCBmb3IgaW1hZ2UvdmlkZW8gY29tcG9uZW50cy4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMihLRVlfSEVJR0hULCAmaTMyKSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJoZWlnaHQgaXMgbWlzc2luZywgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIGltYWdlL3ZpZGVvIGNvbXBvbmVudHMuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKSAmJiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19WSURFTykpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IG1vZGUgPSBCSVRSQVRFX01PREVfVkJSOworICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMihLRVlfQklUUkFURV9NT0RFLCAmbW9kZSkgJiYgbW9kZSA9PSBCSVRSQVRFX01PREVfQ1EpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMihLRVlfUVVBTElUWSwgJmkzMikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJxdWFsaXR5IGlzIG1pc3NpbmcsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciB2aWRlbyBlbmNvZGVycyBpbiBDUS4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKEtFWV9CSVRfUkFURSwgJmkzMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhbXNnLT5maW5kRmxvYXQoS0VZX0JJVF9SQVRFLCAmZmx0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoImJpdHJhdGUgaXMgbWlzc2luZywgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIHZpZGVvIGVuY29kZXJzLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKEtFWV9JX0ZSQU1FX0lOVEVSVkFMLCAmaTMyKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIW1zZy0+ZmluZEZsb2F0KEtFWV9JX0ZSQU1FX0lOVEVSVkFMLCAmZmx0KSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiSSBmcmFtZSBpbnRlcnZhbCBpcyBtaXNzaW5nLCB3aGljaCBpcyByZXF1aXJlZCBmb3IgdmlkZW8gZW5jb2RlcnMuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoS0VZX0ZSQU1FX1JBVEUsICZpMzIpCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAhbXNnLT5maW5kRmxvYXQoS0VZX0ZSQU1FX1JBVEUsICZmbHQpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJmcmFtZSByYXRlIGlzIG1pc3NpbmcsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciB2aWRlbyBlbmNvZGVycy4iKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBIYW5kbGUgaW5wdXQgc3VyZmFjZSBjb25maWd1cmF0aW9uCisgICAgICAgICAqLworICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIChDb25maWc6OklTX1ZJREVPIHwgQ29uZmlnOjpJU19JTUFHRSkpCisgICAgICAgICAgICAgICAgJiYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikpIHsKKyAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLnJlc2V0KG5ldyBJbnB1dFN1cmZhY2VXcmFwcGVyOjpDb25maWd7fSk7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1NaW5GcHMgPSAwOworICAgICAgICAgICAgICAgIGludDY0X3QgdmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDY0KEtFWV9SRVBFQVRfUFJFVklPVVNfRlJBTUVfQUZURVIsICZ2YWx1ZSkgJiYgdmFsdWUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tTWluRnBzID0gMWU2IC8gdmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kRmxvYXQoCisgICAgICAgICAgICAgICAgICAgICAgICBLRVlfTUFYX0ZQU19UT19FTkNPREVSLCAmY29uZmlnLT5tSVNDb25maWctPm1NYXhGcHMpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tTWF4RnBzID0gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tTWluQWRqdXN0ZWRGcHMgPSAwOworICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tRml4ZWRBZGp1c3RlZEZwcyA9IDA7CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDY0KEtFWV9NQVhfUFRTX0dBUF9UT19FTkNPREVSLCAmdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IDAgJiYgdmFsdWUgPj0gSU5UMzJfTUlOKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bUZpeGVkQWRqdXN0ZWRGcHMgPSAtMWU2IC8gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bU1heEZwcyA9IC0xOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID4gMCAmJiB2YWx1ZSA8PSBJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tTWluQWRqdXN0ZWRGcHMgPSAxZTYgLyB2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kRG91YmxlKCJ0aW1lLWxhcHNlLWZwcyIsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1DYXB0dXJlRnBzID0gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKW1zZy0+ZmluZEFzRmxvYXQoS0VZX0ZSQU1FX1JBVEUsICZjb25maWctPm1JU0NvbmZpZy0+bUNvZGVkRnBzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bVN1c3BlbmRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tU3VzcGVuZEF0VXMgPSAtMTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMihLRVlfQ1JFQVRFX0lOUFVUX1NVUkZBQ0VfU1VTUEVOREVELCAmdmFsdWUpICYmIHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tU3VzcGVuZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bVVzYWdlID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIEhhbmRsZSBkZXNpcmVkIGNvbG9yIGZvcm1hdC4KKyAgICAgICAgICovCisgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgKENvbmZpZzo6SVNfVklERU8gfCBDb25maWc6OklTX0lNQUdFKSkpIHsKKyAgICAgICAgICAgIGludDMyX3QgZm9ybWF0ID0gLTE7CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKEtFWV9DT0xPUl9GT1JNQVQsICZmb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBBbHNvIGhhbmRsZSBkZWZhdWx0IGNvbG9yIGZvcm1hdCAoZW5jb2RlcnMgcmVxdWlyZSBjb2xvciBmb3JtYXQsIHNvIHRoaXMgaXMgb25seQorICAgICAgICAgICAgICAgICAqIG5lZWRlZCBmb3IgZGVjb2RlcnMuCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaWYgKCEoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKSkgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSAoc3VyZmFjZSA9PSBudWxscHRyKSA/IENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hciA6IENPTE9SX0Zvcm1hdFN1cmZhY2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoZm9ybWF0ID49IDApIHsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJhbmRyb2lkLl9jb2xvci1mb3JtYXQiLCBmb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBjb25maWdVcGRhdGU7CisgICAgICAgIC8vIE5PVEU6IFdlIHVzZWQgdG8gaWdub3JlICJ2aWRlby1iaXRyYXRlIiBhdCBjb25maWd1cmU7IHJlcGxpY2F0ZQorICAgICAgICAvLyAgICAgICB0aGUgYmVoYXZpb3IgaGVyZS4KKyAgICAgICAgc3A8QU1lc3NhZ2U+IHNka1BhcmFtcyA9IG1zZzsKKyAgICAgICAgaW50MzJfdCB2aWRlb0JpdHJhdGU7CisgICAgICAgIGlmIChzZGtQYXJhbXMtPmZpbmRJbnQzMihQQVJBTUVURVJfS0VZX1ZJREVPX0JJVFJBVEUsICZ2aWRlb0JpdHJhdGUpKSB7CisgICAgICAgICAgICBzZGtQYXJhbXMgPSBtc2ctPmR1cCgpOworICAgICAgICAgICAgc2RrUGFyYW1zLT5yZW1vdmVFbnRyeUF0KHNka1BhcmFtcy0+ZmluZEVudHJ5QnlOYW1lKFBBUkFNRVRFUl9LRVlfVklERU9fQklUUkFURSkpOworICAgICAgICB9CisgICAgICAgIHN0YXR1c190IGVyciA9IGNvbmZpZy0+Z2V0Q29uZmlnVXBkYXRlRnJvbVNka1BhcmFtcygKKyAgICAgICAgICAgICAgICBjb21wLCBzZGtQYXJhbXMsIENvbmZpZzo6SVNfQ09ORklHLCBDMl9ET05UX0JMT0NLLCAmY29uZmlnVXBkYXRlKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coImZhaWxlZCB0byBjb252ZXJ0IGNvbmZpZ3VyYXRpb24gdG8gYzIgcGFyYW1zIik7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IG1heEJmcmFtZXMgPSAwOworICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikKKyAgICAgICAgICAgICAgICAmJiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19WSURFTykKKyAgICAgICAgICAgICAgICAmJiBzZGtQYXJhbXMtPmZpbmRJbnQzMihLRVlfTUFYX0JfRlJBTUVTLCAmbWF4QmZyYW1lcykKKyAgICAgICAgICAgICAgICAmJiBtYXhCZnJhbWVzID4gMCkgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RyZWFtR29wVHVuaW5nOjpvdXRwdXQ+IGdvcCA9CisgICAgICAgICAgICAgICAgQzJTdHJlYW1Hb3BUdW5pbmc6Om91dHB1dDo6QWxsb2NVbmlxdWUoMiAvKiBmbGV4Q291bnQgKi8sIDB1IC8qIHN0cmVhbSAqLyk7CisgICAgICAgICAgICBnb3AtPm0udmFsdWVzWzBdID0geyBQX0ZSQU1FLCBVSU5UMzJfTUFYIH07CisgICAgICAgICAgICBnb3AtPm0udmFsdWVzWzFdID0geworICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdChQX0ZSQU1FIHwgQl9GUkFNRSksCisgICAgICAgICAgICAgICAgdWludDMyX3QobWF4QmZyYW1lcykKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBjb25maWdVcGRhdGUucHVzaF9iYWNrKHN0ZDo6bW92ZShnb3ApKTsKKyAgICAgICAgfQorCisgICAgICAgIGVyciA9IGNvbmZpZy0+c2V0UGFyYW1ldGVycyhjb21wLCBjb25maWdVcGRhdGUsIEMyX0RPTlRfQkxPQ0spOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiZmFpbGVkIHRvIGNvbmZpZ3VyZSBjMiBwYXJhbXMiKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtczsKKyAgICAgICAgQzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQgdXNhZ2UoMHUsIDB1KTsKKyAgICAgICAgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQgbWF4SW5wdXRTaXplKDB1LCAwdSk7CisgICAgICAgIEMyUHJlcGVuZEhlYWRlck1vZGVTZXR0aW5nIHByZXBlbmQoUFJFUEVORF9IRUFERVJfVE9fTk9ORSk7CisKKyAgICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PEMyUGFyYW06OkluZGV4PiBpbmRpY2VzIHsKKyAgICAgICAgfTsKKyAgICAgICAgYzJfc3RhdHVzX3QgYzJlcnIgPSBjb21wLT5xdWVyeSgKKyAgICAgICAgICAgICAgICB7ICZ1c2FnZSwgJm1heElucHV0U2l6ZSwgJnByZXBlbmQgfSwKKyAgICAgICAgICAgICAgICBpbmRpY2VzLAorICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAgICAgJnBhcmFtcyk7CisgICAgICAgIGlmIChjMmVyciAhPSBDMl9PSyAmJiBjMmVyciAhPSBDMl9CQURfSU5ERVgpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcXVlcnkgY29tcG9uZW50IGludGVyZmFjZTogJWQiLCBjMmVycik7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFyYW1zLnNpemUoKSAhPSBpbmRpY2VzLnNpemUoKSkgeworICAgICAgICAgICAgQUxPR0UoIkNvbXBvbmVudCByZXR1cm5zIHdyb25nIG51bWJlciBvZiBwYXJhbXM6IGV4cGVjdGVkICV6dSBhY3R1YWwgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgaW5kaWNlcy5zaXplKCksIHBhcmFtcy5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVzYWdlKSB7CisgICAgICAgICAgICBpZiAodXNhZ2UudmFsdWUgJiBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCkgeworICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5zZXRJbnQzMigidXNpbmctc3ctcmVhZC1vZnRlbiIsIHRydWUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNvbmZpZy0+bUlTQ29uZmlnKSB7CisgICAgICAgICAgICAgICAgQzJBbmRyb2lkTWVtb3J5VXNhZ2UgYW5kcm9pZFVzYWdlKEMyTWVtb3J5VXNhZ2UodXNhZ2UudmFsdWUpKTsKKyAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bVVzYWdlID0gYW5kcm9pZFVzYWdlLmFzR3JhbGxvY1VzYWdlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBOT1RFOiB3ZSBkb24ndCBibGluZGx5IHVzZSBjbGllbnQgc3BlY2lmaWVkIGlucHV0IHNpemUgaWYgc3BlY2lmaWVkIGFzIGNsaWVudHMKKyAgICAgICAgLy8gYXQgdGltZXMgc3BlY2lmeSB0b28gc21hbGwgc2l6ZS4gSW5zdGVhZCwgbWltaWMgdGhlIGJlaGF2aW9yIGZyb20gT01YLCB3aGVyZSB0aGUKKyAgICAgICAgLy8gY2xpZW50IHNwZWNpZmllZCBzaXplIGlzIG9ubHkgdXNlZCB0byBhc2sgZm9yIGJpZ2dlciBidWZmZXJzIHRoYW4gY29tcG9uZW50IHN1Z2dlc3RlZAorICAgICAgICAvLyBzaXplLgorICAgICAgICBpbnQzMl90IGNsaWVudElucHV0U2l6ZSA9IDA7CisgICAgICAgIGJvb2wgY2xpZW50U3BlY2lmaWVkSW5wdXRTaXplID0KKyAgICAgICAgICAgIG1zZy0+ZmluZEludDMyKEtFWV9NQVhfSU5QVVRfU0laRSwgJmNsaWVudElucHV0U2l6ZSkgJiYgY2xpZW50SW5wdXRTaXplID4gMDsKKyAgICAgICAgLy8gVEVNUDogZW5mb3JjZSBtaW5pbXVtIGJ1ZmZlciBzaXplIG9mIDFNQiBmb3IgdmlkZW8gZGVjb2RlcnMKKyAgICAgICAgLy8gYW5kIDE2SyAvIDRLIGZvciBhdWRpbyBlbmNvZGVycy9kZWNvZGVycworICAgICAgICBpZiAobWF4SW5wdXRTaXplLnZhbHVlID09IDApIHsKKyAgICAgICAgICAgIGlmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0FVRElPKSB7CisgICAgICAgICAgICAgICAgbWF4SW5wdXRTaXplLnZhbHVlID0gZW5jb2RlciA/IDE2Mzg0IDogNDA5NjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWVuY29kZXIpIHsKKyAgICAgICAgICAgICAgICBtYXhJbnB1dFNpemUudmFsdWUgPSAxMDQ4NTc2dTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHZlcmlmeSB0aGF0IENTRCBmaXRzIGludG8gdGhpcyBzaXplIChpZiBkZWZpbmVkKQorICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfREVDT0RFUikgJiYgbWF4SW5wdXRTaXplLnZhbHVlID4gMCkgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gY3NkOworICAgICAgICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBtc2ctPmZpbmRCdWZmZXIoU3RyaW5nUHJpbnRmKCJjc2QtJXp1IiwgaXgpLmNfc3RyKCksICZjc2QpOyArK2l4KSB7CisgICAgICAgICAgICAgICAgaWYgKGNzZCAmJiBjc2QtPnNpemUoKSA+IG1heElucHV0U2l6ZS52YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBtYXhJbnB1dFNpemUudmFsdWUgPSBjc2QtPnNpemUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBkbyB0aGlzIGJhc2VkIG9uIGNvbXBvbmVudCByZXF1aXJpbmcgbGluZWFyIGFsbG9jYXRvciBmb3IgaW5wdXQKKyAgICAgICAgaWYgKChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0RFQ09ERVIpIHx8IChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0FVRElPKSkgeworICAgICAgICAgICAgaWYgKGNsaWVudFNwZWNpZmllZElucHV0U2l6ZSkgeworICAgICAgICAgICAgICAgIC8vIFdhcm4gdGhhdCB3ZSdyZSBvdmVycmlkaW5nIGNsaWVudCdzIG1heCBpbnB1dCBzaXplIGlmIG5lY2Vzc2FyeS4KKyAgICAgICAgICAgICAgICBpZiAoKHVpbnQzMl90KWNsaWVudElucHV0U2l6ZSA8IG1heElucHV0U2l6ZS52YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiY2xpZW50IHJlcXVlc3RlZCBtYXggaW5wdXQgc2l6ZSAlZCwgd2hpY2ggaXMgc21hbGxlciB0aGFuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIndoYXQgY29tcG9uZW50IHJlY29tbWVuZGVkICgldSk7IG92ZXJyaWRpbmcgd2l0aCBjb21wb25lbnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAicmVjb21tZW5kYXRpb24uIiwgY2xpZW50SW5wdXRTaXplLCBtYXhJbnB1dFNpemUudmFsdWUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVygiVGhpcyBiZWhhdmlvciBpcyBzdWJqZWN0IHRvIGNoYW5nZS4gSXQgaXMgcmVjb21tZW5kZWQgdGhhdCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhcHAgZGV2ZWxvcGVycyBkb3VibGUgY2hlY2sgd2hldGhlciB0aGUgcmVxdWVzdGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm1heCBpbnB1dCBzaXplIGlzIGluIHJlYXNvbmFibGUgcmFuZ2UuIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4SW5wdXRTaXplLnZhbHVlID0gY2xpZW50SW5wdXRTaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFBhc3MgbWF4IGlucHV0IHNpemUgb24gaW5wdXQgZm9ybWF0IHRvIHRoZSBidWZmZXIgY2hhbm5lbCAoaWYgc3VwcGxpZWQgYnkgdGhlCisgICAgICAgICAgICAvLyBjb21wb25lbnQgb3IgYnkgYSBkZWZhdWx0KQorICAgICAgICAgICAgaWYgKG1heElucHV0U2l6ZS52YWx1ZSkgeworICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5zZXRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgICAgIEtFWV9NQVhfSU5QVVRfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KShjMl9taW4obWF4SW5wdXRTaXplLnZhbHVlLCB1aW50MzJfdChJTlQzMl9NQVgpKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBjbGllbnRQcmVwZW5kOworICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfVklERU8pCisgICAgICAgICAgICAgICAgJiYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRJbnQzMihLRVlfUFJFUEVORF9IRUFERVJTX1RPX1NZTkNfRlJBTUVTLCAmY2xpZW50UHJlcGVuZCkKKyAgICAgICAgICAgICAgICAmJiBjbGllbnRQcmVwZW5kCisgICAgICAgICAgICAgICAgJiYgKCFwcmVwZW5kIHx8IHByZXBlbmQudmFsdWUgIT0gUFJFUEVORF9IRUFERVJfVE9fQUxMX1NZTkMpKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBLRVlfUFJFUEVORF9IRUFERVJTX1RPX1NZTkNfRlJBTUVTIik7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChjb25maWctPm1Eb21haW4gJiAoQ29uZmlnOjpJU19WSURFTyB8IENvbmZpZzo6SVNfSU1BR0UpKSkgeworICAgICAgICAgICAgLy8gcHJvcGFnYXRlIEhEUiBzdGF0aWMgaW5mbyB0byBvdXRwdXQgZm9ybWF0IGZvciBib3RoIGVuY29kZXJzIGFuZCBkZWNvZGVycworICAgICAgICAgICAgLy8gaWYgY29tcG9uZW50IHN1cHBvcnRzIHRoaXMgaW5mbywgd2Ugd2lsbCB1cGRhdGUgZnJvbSBjb21wb25lbnQsIGJ1dCBvbmx5IHRoZSByYXcgcG9ydCwKKyAgICAgICAgICAgIC8vIHNvIGRvbid0IHByb3BhZ2F0ZSBpZiBjb21wb25lbnQgYWxyZWFkeSBmaWxsZWQgaXQgaW4uCisgICAgICAgICAgICBzcDxBQnVmZmVyPiBoZHJJbmZvOworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcihLRVlfSERSX1NUQVRJQ19JTkZPLCAmaGRySW5mbykKKyAgICAgICAgICAgICAgICAgICAgJiYgIWNvbmZpZy0+bU91dHB1dEZvcm1hdC0+ZmluZEJ1ZmZlcihLRVlfSERSX1NUQVRJQ19JTkZPLCAmaGRySW5mbykpIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1PdXRwdXRGb3JtYXQtPnNldEJ1ZmZlcihLRVlfSERSX1NUQVRJQ19JTkZPLCBoZHJJbmZvKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2V0IGRlc2lyZWQgY29sb3IgZm9ybWF0IGZyb20gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIKKyAgICAgICAgICAgIGludDMyX3QgZm9ybWF0OworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJhbmRyb2lkLl9jb2xvci1mb3JtYXQiLCAmZm9ybWF0KSkgeworICAgICAgICAgICAgICAgIGlmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0VOQ09ERVIpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPnNldEludDMyKEtFWV9DT0xPUl9GT1JNQVQsIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfRk9STUFULCBmb3JtYXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHByb3BhZ2F0ZSBlbmNvZGVyIGRlbGF5IGFuZCBwYWRkaW5nIHRvIG91dHB1dCBmb3JtYXQKKyAgICAgICAgaWYgKChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0RFQ09ERVIpICYmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0FVRElPKSkgeworICAgICAgICAgICAgaW50IGRlbGF5ID0gMDsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZW5jb2Rlci1kZWxheSIsICZkZWxheSkpIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1PdXRwdXRGb3JtYXQtPnNldEludDMyKCJlbmNvZGVyLWRlbGF5IiwgZGVsYXkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IHBhZGRpbmcgPSAwOworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJlbmNvZGVyLXBhZGRpbmciLCAmcGFkZGluZykpIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1PdXRwdXRGb3JtYXQtPnNldEludDMyKCJlbmNvZGVyLXBhZGRpbmciLCBwYWRkaW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIHNldCBjaGFubmVsLW1hc2sKKyAgICAgICAgaWYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfQVVESU8pIHsKKyAgICAgICAgICAgIGludDMyX3QgbWFzazsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMihLRVlfQ0hBTk5FTF9NQVNLLCAmbWFzaykpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfQ0hBTk5FTF9NQVNLLCBtYXNrKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb25maWctPm1PdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9DSEFOTkVMX01BU0ssIG1hc2spOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEFMT0dEKCJzZXR1cCBmb3JtYXRzIGlucHV0OiAlcyBhbmQgb3V0cHV0OiAlcyIsCisgICAgICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICBjb25maWctPm1PdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKGRvQ29uZmlnKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworCisgICAgbUNhbGxiYWNrLT5vbkNvbXBvbmVudENvbmZpZ3VyZWQoY29uZmlnLT5tSW5wdXRGb3JtYXQsIGNvbmZpZy0+bU91dHB1dEZvcm1hdCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjppbml0aWF0ZUNyZWF0ZUlucHV0U3VyZmFjZSgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBbdGhpc10geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgIT0gQUxMT0NBVEVEKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiByZWFkIGl0IGZyb20gaW50ZigpIHByb3Blcmx5LgorICAgICAgICBpZiAoc3RhdGUtPmNvbXAtPmdldE5hbWUoKS5maW5kKCJlbmNvZGVyIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfSgpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgbUNhbGxiYWNrLT5vbklucHV0U3VyZmFjZUNyZWF0aW9uRmFpbGVkKGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0Q3JlYXRlSW5wdXRTdXJmYWNlLCB0aGlzKSktPnBvc3QoKTsKK30KKworc3A8UGVyc2lzdGVudFN1cmZhY2U+IENDb2RlYzo6Q3JlYXRlT214SW5wdXRTdXJmYWNlKCkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDsKKyAgICB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA6OnV0aWxzOworICAgIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjp1dGlsczsKKyAgICB0eXBlZGVmIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjpTdGF0dXMgT214U3RhdHVzOworICAgIGFuZHJvaWQ6OnNwPElPbXg+IG9teCA9IElPbXg6OmdldFNlcnZpY2UoKTsKKyAgICB0eXBlZGVmIGFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworICAgIHR5cGVkZWYgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJTb3VyY2UgSEdyYXBoaWNCdWZmZXJTb3VyY2U7CisgICAgT214U3RhdHVzIHM7CisgICAgYW5kcm9pZDo6c3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2JwOworICAgIGFuZHJvaWQ6OnNwPEhHcmFwaGljQnVmZmVyU291cmNlPiBnYnM7CisgICAgdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG9teC0+Y3JlYXRlSW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgWyZzLCAmZ2JwLCAmZ2JzXSgKKyAgICAgICAgICAgICAgICAgICAgT214U3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHByb2R1Y2VyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBhbmRyb2lkOjpzcDxIR3JhcGhpY0J1ZmZlclNvdXJjZT4mIHNvdXJjZSkgeworICAgICAgICAgICAgICAgIHMgPSBzdGF0dXM7CisgICAgICAgICAgICAgICAgZ2JwID0gcHJvZHVjZXI7CisgICAgICAgICAgICAgICAgZ2JzID0gc291cmNlOworICAgICAgICAgICAgfSk7CisgICAgaWYgKHRyYW5zU3RhdHVzLmlzT2soKSAmJiBzID09IE9teFN0YXR1czo6T0spIHsKKyAgICAgICAgcmV0dXJuIG5ldyBQZXJzaXN0ZW50U3VyZmFjZSgKKyAgICAgICAgICAgICAgICBuZXcgSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyKGdicCksCisgICAgICAgICAgICAgICAgc3A8OjphbmRyb2lkOjpJR3JhcGhpY0J1ZmZlclNvdXJjZT4obmV3IExXR3JhcGhpY0J1ZmZlclNvdXJjZShnYnMpKSk7CisgICAgfQorCisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3NwPFBlcnNpc3RlbnRTdXJmYWNlPiBDQ29kZWM6OkNyZWF0ZUNvbXBhdGlibGVJbnB1dFN1cmZhY2UoKSB7CisgICAgc3A8UGVyc2lzdGVudFN1cmZhY2U+IHN1cmZhY2UoQ3JlYXRlSW5wdXRTdXJmYWNlKCkpOworCisgICAgaWYgKHN1cmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICBzdXJmYWNlID0gQ3JlYXRlT214SW5wdXRTdXJmYWNlKCk7CisgICAgfQorCisgICAgcmV0dXJuIHN1cmZhY2U7Cit9CisKK3ZvaWQgQ0NvZGVjOjpjcmVhdGVJbnB1dFN1cmZhY2UoKSB7CisgICAgc3RhdHVzX3QgZXJyOworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGJ1ZmZlclByb2R1Y2VyOworCisgICAgc3A8QU1lc3NhZ2U+IGlucHV0Rm9ybWF0OworICAgIHNwPEFNZXNzYWdlPiBvdXRwdXRGb3JtYXQ7CisgICAgdWludDY0X3QgdXNhZ2UgPSAwOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworICAgICAgICBpbnB1dEZvcm1hdCA9IGNvbmZpZy0+bUlucHV0Rm9ybWF0OworICAgICAgICBvdXRwdXRGb3JtYXQgPSBjb25maWctPm1PdXRwdXRGb3JtYXQ7CisgICAgICAgIHVzYWdlID0gY29uZmlnLT5tSVNDb25maWcgPyBjb25maWctPm1JU0NvbmZpZy0+bVVzYWdlIDogMDsKKyAgICB9CisKKyAgICBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gcGVyc2lzdGVudFN1cmZhY2UgPSBDcmVhdGVDb21wYXRpYmxlSW5wdXRTdXJmYWNlKCk7CisKKyAgICBpZiAocGVyc2lzdGVudFN1cmZhY2UtPmdldEhpZGxUYXJnZXQoKSkgeworICAgICAgICBzcDxJSW5wdXRTdXJmYWNlPiBoaWRsSW5wdXRTdXJmYWNlID0gSUlucHV0U3VyZmFjZTo6Y2FzdEZyb20oCisgICAgICAgICAgICAgICAgcGVyc2lzdGVudFN1cmZhY2UtPmdldEhpZGxUYXJnZXQoKSk7CisgICAgICAgIGlmICghaGlkbElucHV0U3VyZmFjZSkgeworICAgICAgICAgICAgQUxPR0UoIkNvcnJ1cHRlZCBpbnB1dCBzdXJmYWNlIik7CisgICAgICAgICAgICBtQ2FsbGJhY2stPm9uSW5wdXRTdXJmYWNlQ3JlYXRpb25GYWlsZWQoVU5LTk9XTl9FUlJPUik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlPiBpbnB1dFN1cmZhY2UgPQorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8Q29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U+KGhpZGxJbnB1dFN1cmZhY2UpOworICAgICAgICBlcnIgPSBzZXR1cElucHV0U3VyZmFjZShzdGQ6Om1ha2Vfc2hhcmVkPEMySW5wdXRTdXJmYWNlV3JhcHBlcj4oCisgICAgICAgICAgICAgICAgaW5wdXRTdXJmYWNlKSk7CisgICAgICAgIGJ1ZmZlclByb2R1Y2VyID0gaW5wdXRTdXJmYWNlLT5nZXRHcmFwaGljQnVmZmVyUHJvZHVjZXIoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQzMl90IHdpZHRoID0gMDsKKyAgICAgICAgKHZvaWQpb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKTsKKyAgICAgICAgaW50MzJfdCBoZWlnaHQgPSAwOworICAgICAgICAodm9pZClvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCk7CisgICAgICAgIGVyciA9IHNldHVwSW5wdXRTdXJmYWNlKHN0ZDo6bWFrZV9zaGFyZWQ8R3JhcGhpY0J1ZmZlclNvdXJjZVdyYXBwZXI+KAorICAgICAgICAgICAgICAgIHBlcnNpc3RlbnRTdXJmYWNlLT5nZXRCdWZmZXJTb3VyY2UoKSwgd2lkdGgsIGhlaWdodCwgdXNhZ2UpKTsKKyAgICAgICAgYnVmZmVyUHJvZHVjZXIgPSBwZXJzaXN0ZW50U3VyZmFjZS0+Z2V0QnVmZmVyUHJvZHVjZXIoKTsKKyAgICB9CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IHVwIGlucHV0IHN1cmZhY2U6ICVkIiwgZXJyKTsKKyAgICAgICAgbUNhbGxiYWNrLT5vbklucHV0U3VyZmFjZUNyZWF0aW9uRmFpbGVkKGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtQ2FsbGJhY2stPm9uSW5wdXRTdXJmYWNlQ3JlYXRlZCgKKyAgICAgICAgICAgIGlucHV0Rm9ybWF0LAorICAgICAgICAgICAgb3V0cHV0Rm9ybWF0LAorICAgICAgICAgICAgbmV3IEJ1ZmZlclByb2R1Y2VyV3JhcHBlcihidWZmZXJQcm9kdWNlcikpOworfQorCitzdGF0dXNfdCBDQ29kZWM6OnNldHVwSW5wdXRTdXJmYWNlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2VXcmFwcGVyPiAmc3VyZmFjZSkgeworICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICBjb25maWctPm1Vc2luZ1N1cmZhY2UgPSB0cnVlOworCisgICAgLy8gd2UgYXJlIG5vdyB1c2luZyBzdXJmYWNlIC0gYXBwbHkgZGVmYXVsdCBjb2xvciBhc3BlY3RzIHRvIGlucHV0IGZvcm1hdCAtIGFzIHdlbGwgYXMKKyAgICAvLyBnZXQgZGF0YXNwYWNlCisgICAgYm9vbCBpbnB1dEZvcm1hdENoYW5nZWQgPSBjb25maWctPnVwZGF0ZUZvcm1hdHMoY29uZmlnLT5JU19JTlBVVCk7CisgICAgQUxPR0QoImlucHV0IGZvcm1hdCAlcyB0byAlcyIsCisgICAgICAgICAgICBpbnB1dEZvcm1hdENoYW5nZWQgPyAiY2hhbmdlZCIgOiAidW5jaGFuZ2VkIiwKKyAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworCisgICAgLy8gY29uZmlndXJlIGRhdGFzcGFjZQorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKGludDMyX3QpID09IHNpemVvZihhbmRyb2lkX2RhdGFzcGFjZSksICJkYXRhc3BhY2Ugc2l6ZSBtaXNtYXRjaCIpOworICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSA9IEhBTF9EQVRBU1BBQ0VfVU5LTk9XTjsKKyAgICAodm9pZCljb25maWctPm1JbnB1dEZvcm1hdC0+ZmluZEludDMyKCJhbmRyb2lkLl9kYXRhc3BhY2UiLCAoaW50MzJfdCopJmRhdGFTcGFjZSk7CisgICAgc3VyZmFjZS0+c2V0RGF0YVNwYWNlKGRhdGFTcGFjZSk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBtQ2hhbm5lbC0+c2V0SW5wdXRTdXJmYWNlKHN1cmZhY2UpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgLy8gdW5kbyBpbnB1dCBmb3JtYXQgdXBkYXRlCisgICAgICAgIGNvbmZpZy0+bVVzaW5nU3VyZmFjZSA9IGZhbHNlOworICAgICAgICAodm9pZCljb25maWctPnVwZGF0ZUZvcm1hdHMoY29uZmlnLT5JU19JTlBVVCk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorICAgIGNvbmZpZy0+bUlucHV0U3VyZmFjZSA9IHN1cmZhY2U7CisKKyAgICBpZiAoY29uZmlnLT5tSVNDb25maWcpIHsKKyAgICAgICAgc3VyZmFjZS0+Y29uZmlndXJlKCpjb25maWctPm1JU0NvbmZpZyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0QoIklTQ29uZmlnOiBubyBjb25maWd1cmF0aW9uIik7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIENDb2RlYzo6aW5pdGlhdGVTZXRJbnB1dFN1cmZhY2UoY29uc3Qgc3A8UGVyc2lzdGVudFN1cmZhY2U+ICZzdXJmYWNlKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldElucHV0U3VyZmFjZSwgdGhpcyk7CisgICAgbXNnLT5zZXRPYmplY3QoInN1cmZhY2UiLCBzdXJmYWNlKTsKKyAgICBtc2ctPnBvc3QoKTsKK30KKwordm9pZCBDQ29kZWM6OnNldElucHV0U3VyZmFjZShjb25zdCBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gJnN1cmZhY2UpIHsKKyAgICBzcDxBTWVzc2FnZT4gaW5wdXRGb3JtYXQ7CisgICAgc3A8QU1lc3NhZ2U+IG91dHB1dEZvcm1hdDsKKyAgICB1aW50NjRfdCB1c2FnZSA9IDA7CisgICAgeworICAgICAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisgICAgICAgIGlucHV0Rm9ybWF0ID0gY29uZmlnLT5tSW5wdXRGb3JtYXQ7CisgICAgICAgIG91dHB1dEZvcm1hdCA9IGNvbmZpZy0+bU91dHB1dEZvcm1hdDsKKyAgICAgICAgdXNhZ2UgPSBjb25maWctPm1JU0NvbmZpZyA/IGNvbmZpZy0+bUlTQ29uZmlnLT5tVXNhZ2UgOiAwOworICAgIH0KKyAgICBhdXRvIGhpZGxUYXJnZXQgPSBzdXJmYWNlLT5nZXRIaWRsVGFyZ2V0KCk7CisgICAgaWYgKGhpZGxUYXJnZXQpIHsKKyAgICAgICAgc3A8SUlucHV0U3VyZmFjZT4gaW5wdXRTdXJmYWNlID0KKyAgICAgICAgICAgICAgICBJSW5wdXRTdXJmYWNlOjpjYXN0RnJvbShoaWRsVGFyZ2V0KTsKKyAgICAgICAgaWYgKCFpbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IGlucHV0IHN1cmZhY2U6IENvcnJ1cHRlZCBzdXJmYWNlLiIpOworICAgICAgICAgICAgbUNhbGxiYWNrLT5vbklucHV0U3VyZmFjZURlY2xpbmVkKFVOS05PV05fRVJST1IpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN0YXR1c190IGVyciA9IHNldHVwSW5wdXRTdXJmYWNlKHN0ZDo6bWFrZV9zaGFyZWQ8QzJJbnB1dFN1cmZhY2VXcmFwcGVyPigKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlPihpbnB1dFN1cmZhY2UpKSk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IHVwIGlucHV0IHN1cmZhY2U6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25JbnB1dFN1cmZhY2VEZWNsaW5lZChlcnIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50MzJfdCB3aWR0aCA9IDA7CisgICAgICAgICh2b2lkKW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCk7CisgICAgICAgIGludDMyX3QgaGVpZ2h0ID0gMDsKKyAgICAgICAgKHZvaWQpb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cElucHV0U3VyZmFjZShzdGQ6Om1ha2Vfc2hhcmVkPEdyYXBoaWNCdWZmZXJTb3VyY2VXcmFwcGVyPigKKyAgICAgICAgICAgICAgICBzdXJmYWNlLT5nZXRCdWZmZXJTb3VyY2UoKSwgd2lkdGgsIGhlaWdodCwgdXNhZ2UpKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgdXAgaW5wdXQgc3VyZmFjZTogJWQiLCBlcnIpOworICAgICAgICAgICAgbUNhbGxiYWNrLT5vbklucHV0U3VyZmFjZURlY2xpbmVkKGVycik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgbUNhbGxiYWNrLT5vbklucHV0U3VyZmFjZUFjY2VwdGVkKGlucHV0Rm9ybWF0LCBvdXRwdXRGb3JtYXQpOworfQorCit2b2lkIENDb2RlYzo6aW5pdGlhdGVTdGFydCgpIHsKKyAgICBhdXRvIHNldFN0YXJ0aW5nID0gW3RoaXNdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IEFMTE9DQVRFRCkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChTVEFSVElORyk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKHNldFN0YXJ0aW5nKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCB0aGlzKSktPnBvc3QoKTsKK30KKwordm9pZCBDQ29kZWM6OnN0YXJ0KCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcDsKKyAgICBhdXRvIGNoZWNrU3RhcnRpbmcgPSBbdGhpcywgJmNvbXBdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IFNUQVJUSU5HKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjb21wID0gc3RhdGUtPmNvbXA7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKGNoZWNrU3RhcnRpbmcpICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBjb21wLT5zdGFydCgpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKHRvU3RhdHVzVChlcnIsIEMyX09QRVJBVElPTl9Db21wb25lbnRfc3RhcnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPEFNZXNzYWdlPiBpbnB1dEZvcm1hdDsKKyAgICBzcDxBTWVzc2FnZT4gb3V0cHV0Rm9ybWF0OworICAgIHN0YXR1c190IGVycjIgPSBPSzsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICAgICAgaW5wdXRGb3JtYXQgPSBjb25maWctPm1JbnB1dEZvcm1hdDsKKyAgICAgICAgb3V0cHV0Rm9ybWF0ID0gY29uZmlnLT5tT3V0cHV0Rm9ybWF0OworICAgICAgICBpZiAoY29uZmlnLT5tSW5wdXRTdXJmYWNlKSB7CisgICAgICAgICAgICBlcnIyID0gY29uZmlnLT5tSW5wdXRTdXJmYWNlLT5zdGFydCgpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChlcnIyICE9IE9LKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihlcnIyLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZXJyMiA9IG1DaGFubmVsLT5zdGFydChpbnB1dEZvcm1hdCwgb3V0cHV0Rm9ybWF0KTsKKyAgICBpZiAoZXJyMiAhPSBPSykgeworICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IoZXJyMiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBzZXRSdW5uaW5nID0gW3RoaXNdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IFNUQVJUSU5HKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+c2V0KFJVTk5JTkcpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihzZXRSdW5uaW5nKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1DYWxsYmFjay0+b25TdGFydENvbXBsZXRlZCgpOworCisgICAgKHZvaWQpbUNoYW5uZWwtPnJlcXVlc3RJbml0aWFsSW5wdXRCdWZmZXJzKCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjppbml0aWF0ZVNodXRkb3duKGJvb2wga2VlcENvbXBvbmVudEFsbG9jYXRlZCkgeworICAgIGlmIChrZWVwQ29tcG9uZW50QWxsb2NhdGVkKSB7CisgICAgICAgIGluaXRpYXRlU3RvcCgpOworICAgIH0gZWxzZSB7CisgICAgICAgIGluaXRpYXRlUmVsZWFzZSgpOworICAgIH0KK30KKwordm9pZCBDQ29kZWM6OmluaXRpYXRlU3RvcCgpIHsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSA9PSBBTExPQ0FURUQKKyAgICAgICAgICAgICAgICB8fCBzdGF0ZS0+Z2V0KCkgID09IFJFTEVBU0VECisgICAgICAgICAgICAgICAgfHwgc3RhdGUtPmdldCgpID09IFNUT1BQSU5HCisgICAgICAgICAgICAgICAgfHwgc3RhdGUtPmdldCgpID09IFJFTEVBU0lORykgeworICAgICAgICAgICAgLy8gV2UncmUgYWxyZWFkeSBzdG9wcGVkLCByZWxlYXNlZCwgb3IgZG9pbmcgaXQgcmlnaHQgbm93LgorICAgICAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgICAgICBtQ2FsbGJhY2stPm9uU3RvcENvbXBsZXRlZCgpOworICAgICAgICAgICAgc3RhdGUubG9jaygpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5zZXQoU1RPUFBJTkcpOworICAgIH0KKworICAgIG1DaGFubmVsLT5zdG9wKCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0b3AsIHRoaXMpKS0+cG9zdCgpOworfQorCit2b2lkIENDb2RlYzo6c3RvcCgpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXA7CisgICAgeworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgPT0gUkVMRUFTSU5HKSB7CisgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgIC8vIFdlJ3JlIGFscmVhZHkgc3RvcHBlZCBvciByZWxlYXNlIGlzIGluIHByb2dyZXNzLgorICAgICAgICAgICAgbUNhbGxiYWNrLT5vblN0b3BDb21wbGV0ZWQoKTsKKyAgICAgICAgICAgIHN0YXRlLmxvY2soKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS0+Z2V0KCkgIT0gU1RPUFBJTkcpIHsKKyAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgICAgIHN0YXRlLmxvY2soKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjb21wID0gc3RhdGUtPmNvbXA7CisgICAgfQorICAgIHN0YXR1c190IGVyciA9IGNvbXAtPnN0b3AoKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIC8vIFRPRE86IGNvbnZlcnQgZXJyIGludG8gc3RhdHVzX3QKKyAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICAgICAgaWYgKGNvbmZpZy0+bUlucHV0U3VyZmFjZSkgeworICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRTdXJmYWNlLT5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICBjb25maWctPm1JbnB1dFN1cmZhY2UgPSBudWxscHRyOworICAgICAgICB9CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpID09IFNUT1BQSU5HKSB7CisgICAgICAgICAgICBzdGF0ZS0+c2V0KEFMTE9DQVRFRCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbUNhbGxiYWNrLT5vblN0b3BDb21wbGV0ZWQoKTsKK30KKwordm9pZCBDQ29kZWM6OmluaXRpYXRlUmVsZWFzZShib29sIHNlbmRDYWxsYmFjayAvKiA9IHRydWUgKi8pIHsKKyAgICBib29sIGNsZWFySW5wdXRTdXJmYWNlSWZOZWVkZWQgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSA9PSBSRUxFQVNFRCB8fCBzdGF0ZS0+Z2V0KCkgPT0gUkVMRUFTSU5HKSB7CisgICAgICAgICAgICAvLyBXZSdyZSBhbHJlYWR5IHJlbGVhc2VkIG9yIGRvaW5nIGl0IHJpZ2h0IG5vdy4KKyAgICAgICAgICAgIGlmIChzZW5kQ2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2stPm9uUmVsZWFzZUNvbXBsZXRlZCgpOworICAgICAgICAgICAgICAgIHN0YXRlLmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdGUtPmdldCgpID09IEFMTE9DQVRJTkcpIHsKKyAgICAgICAgICAgIHN0YXRlLT5zZXQoUkVMRUFTSU5HKTsKKyAgICAgICAgICAgIC8vIFdpdGggdGhlIGFsdGVyZWQgc3RhdGUgYWxsb2NhdGUoKSB3b3VsZCBmYWlsIGFuZCBjbGVhbiB1cC4KKyAgICAgICAgICAgIGlmIChzZW5kQ2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2stPm9uUmVsZWFzZUNvbXBsZXRlZCgpOworICAgICAgICAgICAgICAgIHN0YXRlLmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdGUtPmdldCgpID09IFNUQVJUSU5HCisgICAgICAgICAgICAgICAgfHwgc3RhdGUtPmdldCgpID09IFJVTk5JTkcKKyAgICAgICAgICAgICAgICB8fCBzdGF0ZS0+Z2V0KCkgPT0gU1RPUFBJTkcpIHsKKyAgICAgICAgICAgIC8vIElucHV0IHN1cmZhY2UgbWF5IGhhdmUgYmVlbiBzdGFydGVkLCBzbyBjbGVhbiB1cCBpcyBuZWVkZWQuCisgICAgICAgICAgICBjbGVhcklucHV0U3VyZmFjZUlmTmVlZGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+c2V0KFJFTEVBU0lORyk7CisgICAgfQorCisgICAgaWYgKGNsZWFySW5wdXRTdXJmYWNlSWZOZWVkZWQpIHsKKyAgICAgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworICAgICAgICBpZiAoY29uZmlnLT5tSW5wdXRTdXJmYWNlKSB7CisgICAgICAgICAgICBjb25maWctPm1JbnB1dFN1cmZhY2UtPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0U3VyZmFjZSA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtQ2hhbm5lbC0+c3RvcCgpOworICAgIC8vIHRoaXogaG9sZHMgc3Ryb25nIHJlZiB0byB0aGlzIHdoaWxlIHRoZSB0aHJlYWQgaXMgcnVubmluZy4KKyAgICBzcDxDQ29kZWM+IHRoaXoodGhpcyk7CisgICAgc3RkOjp0aHJlYWQoW3RoaXosIHNlbmRDYWxsYmFja10geyB0aGl6LT5yZWxlYXNlKHNlbmRDYWxsYmFjayk7IH0pLmRldGFjaCgpOworfQorCit2b2lkIENDb2RlYzo6cmVsZWFzZShib29sIHNlbmRDYWxsYmFjaykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcDsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSA9PSBSRUxFQVNFRCkgeworICAgICAgICAgICAgaWYgKHNlbmRDYWxsYmFjaykgeworICAgICAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgICAgIG1DYWxsYmFjay0+b25SZWxlYXNlQ29tcGxldGVkKCk7CisgICAgICAgICAgICAgICAgc3RhdGUubG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNvbXAgPSBzdGF0ZS0+Y29tcDsKKyAgICB9CisgICAgY29tcC0+cmVsZWFzZSgpOworCisgICAgeworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIHN0YXRlLT5zZXQoUkVMRUFTRUQpOworICAgICAgICBzdGF0ZS0+Y29tcC5yZXNldCgpOworICAgIH0KKyAgICBpZiAoc2VuZENhbGxiYWNrKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25SZWxlYXNlQ29tcGxldGVkKCk7CisgICAgfQorfQorCitzdGF0dXNfdCBDQ29kZWM6OnNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKKyAgICByZXR1cm4gbUNoYW5uZWwtPnNldFN1cmZhY2Uoc3VyZmFjZSk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpzaWduYWxGbHVzaCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBbdGhpc10geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgPT0gRkxVU0hFRCkgeworICAgICAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgIT0gUlVOTklORykgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChGTFVTSElORyk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9KCk7CisgICAgc3dpdGNoIChlcnIpIHsKKyAgICAgICAgY2FzZSBBTFJFQURZX0VYSVNUUzoKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25GbHVzaENvbXBsZXRlZCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICBjYXNlIE9LOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IoZXJyLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUNoYW5uZWwtPnN0b3AoKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0Rmx1c2gsIHRoaXMpKS0+cG9zdCgpOworfQorCit2b2lkIENDb2RlYzo6Zmx1c2goKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wOworICAgIGF1dG8gY2hlY2tGbHVzaGluZyA9IFt0aGlzLCAmY29tcF0geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgIT0gRkxVU0hJTkcpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNvbXAgPSBzdGF0ZS0+Y29tcDsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH07CisgICAgaWYgKHRyeUFuZFJlcG9ydE9uRXJyb3IoY2hlY2tGbHVzaGluZykgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gZmx1c2hlZFdvcms7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gY29tcC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8c3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+Pj46OkxvY2tlZCBxdWV1ZShtV29ya0RvbmVRdWV1ZSk7CisgICAgICAgIGZsdXNoZWRXb3JrLnNwbGljZShmbHVzaGVkV29yay5lbmQoKSwgKnF1ZXVlKTsKKyAgICB9CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAvLyBUT0RPOiBjb252ZXJ0IGVyciBpbnRvIHN0YXR1c190CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgfQorCisgICAgbUNoYW5uZWwtPmZsdXNoKGZsdXNoZWRXb3JrKTsKKworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBzdGF0ZS0+c2V0KEZMVVNIRUQpOworICAgIH0KKyAgICBtQ2FsbGJhY2stPm9uRmx1c2hDb21wbGV0ZWQoKTsKK30KKwordm9pZCBDQ29kZWM6OnNpZ25hbFJlc3VtZSgpIHsKKyAgICBhdXRvIHNldFJlc3VtaW5nID0gW3RoaXNdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IEZMVVNIRUQpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5zZXQoUkVTVU1JTkcpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihzZXRSZXN1bWluZykgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgICh2b2lkKW1DaGFubmVsLT5zdGFydChudWxscHRyLCBudWxscHRyKTsKKworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IFJFU1VNSU5HKSB7CisgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgICAgICBzdGF0ZS5sb2NrKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChSVU5OSU5HKTsKKyAgICB9CisKKyAgICAodm9pZCltQ2hhbm5lbC0+cmVxdWVzdEluaXRpYWxJbnB1dEJ1ZmZlcnMoKTsKK30KKwordm9pZCBDQ29kZWM6OnNpZ25hbFNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXA7CisgICAgYXV0byBjaGVja1N0YXRlID0gW3RoaXMsICZjb21wXSB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSA9PSBSRUxFQVNFRCkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIGNvbXAgPSBzdGF0ZS0+Y29tcDsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH07CisgICAgaWYgKHRyeUFuZFJlcG9ydE9uRXJyb3IoY2hlY2tTdGF0ZSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE5PVEU6IFdlIHVzZWQgdG8gaWdub3JlICJiaXRyYXRlIiBhdCBzZXRQYXJhbWV0ZXJzOyByZXBsaWNhdGUKKyAgICAvLyAgICAgICB0aGUgYmVoYXZpb3IgaGVyZS4KKyAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gbXNnOworICAgIGludDMyX3QgYml0cmF0ZTsKKyAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoS0VZX0JJVF9SQVRFLCAmYml0cmF0ZSkpIHsKKyAgICAgICAgcGFyYW1zID0gbXNnLT5kdXAoKTsKKyAgICAgICAgcGFyYW1zLT5yZW1vdmVFbnRyeUF0KHBhcmFtcy0+ZmluZEVudHJ5QnlOYW1lKEtFWV9CSVRfUkFURSkpOworICAgIH0KKworICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKworICAgIC8qKgorICAgICAqIEhhbmRsZSBpbnB1dCBzdXJmYWNlIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIChDb25maWc6OklTX1ZJREVPIHwgQ29uZmlnOjpJU19JTUFHRSkpCisgICAgICAgICAgICAmJiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKSAmJiBjb25maWctPm1JbnB1dFN1cmZhY2UgJiYgY29uZmlnLT5tSVNDb25maWcpIHsKKyAgICAgICAgKHZvaWQpcGFyYW1zLT5maW5kSW50NjQoUEFSQU1FVEVSX0tFWV9PRkZTRVRfVElNRSwgJmNvbmZpZy0+bUlTQ29uZmlnLT5tVGltZU9mZnNldFVzKTsKKworICAgICAgICBpZiAocGFyYW1zLT5maW5kSW50NjQoInNraXAtZnJhbWVzLWJlZm9yZSIsICZjb25maWctPm1JU0NvbmZpZy0+bVN0YXJ0QXRVcykpIHsKKyAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tU3RvcHBlZCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKHBhcmFtcy0+ZmluZEludDY0KCJzdG9wLXRpbWUtdXMiLCAmY29uZmlnLT5tSVNDb25maWctPm1TdG9wQXRVcykpIHsKKyAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tU3RvcHBlZCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoUEFSQU1FVEVSX0tFWV9TVVNQRU5ELCAmdmFsdWUpKSB7CisgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bVN1c3BlbmRlZCA9IHZhbHVlOworICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1TdXNwZW5kQXRVcyA9IC0xOworICAgICAgICAgICAgKHZvaWQpcGFyYW1zLT5maW5kSW50NjQoUEFSQU1FVEVSX0tFWV9TVVNQRU5EX1RJTUUsICZjb25maWctPm1JU0NvbmZpZy0+bVN1c3BlbmRBdFVzKTsKKyAgICAgICAgfQorCisgICAgICAgICh2b2lkKWNvbmZpZy0+bUlucHV0U3VyZmFjZS0+Y29uZmlndXJlKCpjb25maWctPm1JU0NvbmZpZyk7CisgICAgICAgIGlmIChjb25maWctPm1JU0NvbmZpZy0+bVN0b3BwZWQpIHsKKyAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0Rm9ybWF0LT5zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuX3N0b3AtdGltZS1vZmZzZXQtdXMiLCBjb25maWctPm1JU0NvbmZpZy0+bUlucHV0RGVsYXlVcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGNvbmZpZ1VwZGF0ZTsKKyAgICAodm9pZCljb25maWctPmdldENvbmZpZ1VwZGF0ZUZyb21TZGtQYXJhbXMoCisgICAgICAgICAgICBjb21wLCBwYXJhbXMsIENvbmZpZzo6SVNfUEFSQU0sIEMyX01BWV9CTE9DSywgJmNvbmZpZ1VwZGF0ZSk7CisgICAgLy8gUHJlZmVyIHRvIHBhc3MgcGFyYW1ldGVycyB0byB0aGUgYnVmZmVyIGNoYW5uZWwsIHNvIHRoZXkgY2FuIGJlIHN5bmNocm9uaXplZCB3aXRoIHRoZSBmcmFtZXMuCisgICAgLy8gUGFyYW1ldGVyIHN5bmNocm9uaXphdGlvbiBpcyBub3QgZGVmaW5lZCB3aGVuIHVzaW5nIGlucHV0IHN1cmZhY2UuIEZvciBub3csIHJvdXRlCisgICAgLy8gdGhlc2UgZGlyZWN0bHkgdG8gdGhlIGNvbXBvbmVudC4KKyAgICBpZiAoY29uZmlnLT5tSW5wdXRTdXJmYWNlID09IG51bGxwdHIKKyAgICAgICAgICAgICYmIChwcm9wZXJ0eV9nZXRfYm9vbCgiZGVidWcuc3RhZ2VmcmlnaHQuY2NvZGVjX2RlbGF5ZWRfcGFyYW1zIiwgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgIHx8IGNvbXAtPmdldE5hbWUoKS5maW5kKCJjMi5hbmRyb2lkLiIpID09IDApKSB7CisgICAgICAgIG1DaGFubmVsLT5zZXRQYXJhbWV0ZXJzKGNvbmZpZ1VwZGF0ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKHZvaWQpY29uZmlnLT5zZXRQYXJhbWV0ZXJzKGNvbXAsIGNvbmZpZ1VwZGF0ZSwgQzJfTUFZX0JMT0NLKTsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjOjpzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgeworICAgIG1DYWxsYmFjay0+b25TaWduYWxlZElucHV0RU9TKG1DaGFubmVsLT5zaWduYWxFbmRPZklucHV0U3RyZWFtKCkpOworfQorCit2b2lkIENDb2RlYzo6c2lnbmFsUmVxdWVzdElEUkZyYW1lKCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcDsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSA9PSBSRUxFQVNFRCkgeworICAgICAgICAgICAgQUxPR0QoIm5vIElEUiByZXF1ZXN0IHNlbnQgc2luY2UgY29tcG9uZW50IGlzIHJlbGVhc2VkIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY29tcCA9IHN0YXRlLT5jb21wOworICAgIH0KKyAgICBBTE9HVigicmVxdWVzdCBJRFIiKTsKKyAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CisgICAgcGFyYW1zLnB1c2hfYmFjaygKKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+KDB1LCB0cnVlKSk7CisgICAgY29uZmlnLT5zZXRQYXJhbWV0ZXJzKGNvbXAsIHBhcmFtcywgQzJfTUFZX0JMT0NLKTsKK30KKwordm9pZCBDQ29kZWM6Om9uV29ya0RvbmUoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmd29ya0l0ZW1zKSB7CisgICAgaWYgKCF3b3JrSXRlbXMuZW1wdHkoKSkgeworICAgICAgICBNdXRleGVkPHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4+OjpMb2NrZWQgcXVldWUobVdvcmtEb25lUXVldWUpOworICAgICAgICBxdWV1ZS0+c3BsaWNlKHF1ZXVlLT5lbmQoKSwgd29ya0l0ZW1zKTsKKyAgICB9CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdFdvcmtEb25lLCB0aGlzKSktPnBvc3QoKTsKK30KKwordm9pZCBDQ29kZWM6Om9uSW5wdXRCdWZmZXJEb25lKHVpbnQ2NF90IGZyYW1lSW5kZXgsIHNpemVfdCBhcnJheUluZGV4KSB7CisgICAgbUNoYW5uZWwtPm9uSW5wdXRCdWZmZXJEb25lKGZyYW1lSW5kZXgsIGFycmF5SW5kZXgpOworICAgIGlmIChhcnJheUluZGV4ID09IDApIHsKKyAgICAgICAgLy8gV2UgYWx3YXlzIHB1dCBubyBtb3JlIHRoYW4gb25lIGJ1ZmZlciBwZXIgd29yaywgaWYgd2UgdXNlIGFuIGlucHV0IHN1cmZhY2UuCisgICAgICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICAgICAgaWYgKGNvbmZpZy0+bUlucHV0U3VyZmFjZSkgeworICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRTdXJmYWNlLT5vbklucHV0QnVmZmVyRG9uZShmcmFtZUluZGV4KTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBDQ29kZWM6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgVGltZVBvaW50IG5vdyA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOworICAgIENDb2RlY1dhdGNoZG9nOjpnZXRJbnN0YW5jZSgpLT53YXRjaCh0aGlzKTsKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRBbGxvY2F0ZTogeworICAgICAgICAgICAgLy8gQzJDb21wb25lbnRTdG9yZTo6Y3JlYXRlQ29tcG9uZW50KCkgc2hvdWxkIHJldHVybiB3aXRoaW4gMTAwbXMuCisgICAgICAgICAgICBzZXREZWFkbGluZShub3csIDE1MG1zLCAiYWxsb2NhdGUiKTsKKyAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgiY29kZWNJbmZvIiwgJm9iaikpOworICAgICAgICAgICAgYWxsb2NhdGUoKE1lZGlhQ29kZWNJbmZvICopb2JqLmdldCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRDb25maWd1cmU6IHsKKyAgICAgICAgICAgIC8vIEMyQ29tcG9uZW50Ojpjb21taXRfc20oKSBzaG91bGQgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICAgICAgICBzZXREZWFkbGluZShub3csIDI1MG1zLCAiY29uZmlndXJlIik7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpOworICAgICAgICAgICAgY29uZmlndXJlKGZvcm1hdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0U3RhcnQ6IHsKKyAgICAgICAgICAgIC8vIEMyQ29tcG9uZW50OjpzdGFydCgpIHNob3VsZCByZXR1cm4gd2l0aGluIDUwMG1zLgorICAgICAgICAgICAgc2V0RGVhZGxpbmUobm93LCA1NTBtcywgInN0YXJ0Iik7CisgICAgICAgICAgICBzdGFydCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFN0b3A6IHsKKyAgICAgICAgICAgIC8vIEMyQ29tcG9uZW50OjpzdG9wKCkgc2hvdWxkIHJldHVybiB3aXRoaW4gNTAwbXMuCisgICAgICAgICAgICBzZXREZWFkbGluZShub3csIDU1MG1zLCAic3RvcCIpOworICAgICAgICAgICAgc3RvcCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdEZsdXNoOiB7CisgICAgICAgICAgICAvLyBDMkNvbXBvbmVudDo6Zmx1c2hfc20oKSBzaG91bGQgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICAgICAgICBzZXREZWFkbGluZShub3csIDUwbXMsICJmbHVzaCIpOworICAgICAgICAgICAgZmx1c2goKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRDcmVhdGVJbnB1dFN1cmZhY2U6IHsKKyAgICAgICAgICAgIC8vIFN1cmZhY2Ugb3BlcmF0aW9ucyBtYXkgYmUgYnJpZWZseSBibG9ja2luZy4KKyAgICAgICAgICAgIHNldERlYWRsaW5lKG5vdywgMTAwbXMsICJjcmVhdGVJbnB1dFN1cmZhY2UiKTsKKyAgICAgICAgICAgIGNyZWF0ZUlucHV0U3VyZmFjZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFNldElucHV0U3VyZmFjZTogeworICAgICAgICAgICAgLy8gU3VyZmFjZSBvcGVyYXRpb25zIG1heSBiZSBicmllZmx5IGJsb2NraW5nLgorICAgICAgICAgICAgc2V0RGVhZGxpbmUobm93LCAxMDBtcywgInNldElucHV0U3VyZmFjZSIpOworICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJzdXJmYWNlIiwgJm9iaikpOworICAgICAgICAgICAgc3A8UGVyc2lzdGVudFN1cmZhY2U+IHN1cmZhY2Uoc3RhdGljX2Nhc3Q8UGVyc2lzdGVudFN1cmZhY2UgKj4ob2JqLmdldCgpKSk7CisgICAgICAgICAgICBzZXRJbnB1dFN1cmZhY2Uoc3VyZmFjZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0V29ya0RvbmU6IHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgICAgICBib29sIHNob3VsZFBvc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNdXRleGVkPHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4+OjpMb2NrZWQgcXVldWUobVdvcmtEb25lUXVldWUpOworICAgICAgICAgICAgICAgIGlmIChxdWV1ZS0+ZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd29yay5zd2FwKHF1ZXVlLT5mcm9udCgpKTsKKyAgICAgICAgICAgICAgICBxdWV1ZS0+cG9wX2Zyb250KCk7CisgICAgICAgICAgICAgICAgc2hvdWxkUG9zdCA9ICFxdWV1ZS0+ZW1wdHkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaG91bGRQb3N0KSB7CisgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFdvcmtEb25lLCB0aGlzKSktPnBvc3QoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaGFuZGxlIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBpbiB3b3JrIGRvbmUKKyAgICAgICAgICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICAgICAgICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgQ29uZmlnOjpXYXRjaGVyPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+IGluaXREYXRhID0KKyAgICAgICAgICAgICAgICBjb25maWctPndhdGNoPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+KCk7CisgICAgICAgICAgICBpZiAoIXdvcmstPndvcmtsZXRzLmVtcHR5KCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgQzJGcmFtZURhdGE6OkZMQUdfRElTQ0FSRF9GUkFNRSkgPT0gMCkgeworCisgICAgICAgICAgICAgICAgLy8gY29weSBidWZmZXIgaW5mbyB0byBjb25maWcKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHVwZGF0ZXM7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtCisgICAgICAgICAgICAgICAgICAgICAgICA6IHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlcy5wdXNoX2JhY2soQzJQYXJhbTo6Q29weSgqcGFyYW0pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdW5zaWduZWQgc3RyZWFtID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZiA6IHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4gJmluZm8gOiBidWYtPmluZm8oKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW92ZSBhbGwgaW5mbyBpbnRvIG91dHB1dC1zdHJlYW0gIzAgZG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVzLmVtcGxhY2VfYmFjayhDMlBhcmFtOjpDb3B5QXNTdHJlYW0oKmluZm8sIHRydWUgLyogb3V0cHV0ICovLCBzdHJlYW0pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2sgJmJsb2NrIDogYnVmLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBTE9HVigiZ290IG91dHB1dCBidWZmZXIgd2l0aCBjcm9wICV1LCV1KyV1LCV1IGFuZCBzaXplICV1LCV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgYmxvY2suY3JvcCgpLmxlZnQsIGJsb2NrLmNyb3AoKS50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIGJsb2NrLmNyb3AoKS53aWR0aCwgYmxvY2suY3JvcCgpLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgYmxvY2sud2lkdGgoKSwgYmxvY2suaGVpZ2h0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlcy5lbXBsYWNlX2JhY2sobmV3IEMyU3RyZWFtQ3JvcFJlY3RJbmZvOjpvdXRwdXQoc3RyZWFtLCBibG9jay5jcm9wKCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZXMuZW1wbGFjZV9iYWNrKG5ldyBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIGJsb2NrLmNyb3AoKS53aWR0aCwgYmxvY2suY3JvcCgpLmhlaWdodCkpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIGZvciBub3cgb25seSBkbyB0aGUgZmlyc3QgYmxvY2sKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICArK3N0cmVhbTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gY29uZmlnLT51cGRhdGVDb25maWd1cmF0aW9uKHVwZGF0ZXMsIGNvbmZpZy0+bU91dHB1dERvbWFpbik7CisKKyAgICAgICAgICAgICAgICAvLyBjb3B5IHN0YW5kYXJkIGluZm9zIHRvIGdyYXBoaWMgYnVmZmVycyBpZiBub3QgYWxyZWFkeSBwcmVzZW50IChvdGhlcndpc2UsIHdlCisgICAgICAgICAgICAgICAgLy8gbWF5IG92ZXJ3cml0ZSB0aGUgYWN0dWFsIGludGVybWVkaWF0ZSB2YWx1ZSB3aXRoIGEgZmluYWwgdmFsdWUpCisgICAgICAgICAgICAgICAgc3RyZWFtID0gMDsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IHN0ZEdmeEluZm9zID0geworICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbVJvdGF0aW9uSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1EYXRhU3BhY2VJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbUhkcjEwUGx1c0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1QaXhlbEFzcGVjdFJhdGlvSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbVN1cmZhY2VTY2FsaW5nSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZiA6IHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChidWYtPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEMyUGFyYW06OkluZGV4IGl4IDogc3RkR2Z4SW5mb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJ1Zi0+aGFzSW5mbyhpeCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAqcGFyYW0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5nZXRDb25maWdQYXJhbWV0ZXJWYWx1ZShpeC53aXRoU3RyZWFtKHN0cmVhbSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBpbmZvKEMyUGFyYW06OkNvcHkoKnBhcmFtKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYtPnNldEluZm8oc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMySW5mbz4oaW5mbykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICsrc3RyZWFtOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb25maWctPm1JbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1JbnB1dFN1cmZhY2UtPm9uSW5wdXRCdWZmZXJEb25lKHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2hhbm5lbC0+b25Xb3JrRG9uZSgKKyAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHdvcmspLCBjaGFuZ2VkID8gY29uZmlnLT5tT3V0cHV0Rm9ybWF0IDogbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgaW5pdERhdGEuaGFzQ2hhbmdlZCgpID8gaW5pdERhdGEudXBkYXRlKCkuZ2V0KCkgOiBudWxscHRyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRXYXRjaDogeworICAgICAgICAgICAgLy8gd2F0Y2ggbWVzc2FnZSBhbHJlYWR5IHBvc3RlZDsgbm8tb3AuCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBBTE9HRSgidW5yZWNvZ25pemVkIG1lc3NhZ2UiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHNldERlYWRsaW5lKFRpbWVQb2ludDo6bWF4KCksIDBtcywgIm5vbmUiKTsKK30KKwordm9pZCBDQ29kZWM6OnNldERlYWRsaW5lKAorICAgICAgICBjb25zdCBUaW1lUG9pbnQgJm5vdywKKyAgICAgICAgY29uc3Qgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyAmdGltZW91dCwKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSkgeworICAgIGludDMyX3QgbXVsdCA9IHN0ZDo6bWF4KDEsIHByb3BlcnR5X2dldF9pbnQzMigiZGVidWcuc3RhZ2VmcmlnaHQuY2NvZGVjX3RpbWVvdXRfbXVsdCIsIDEpKTsKKyAgICBNdXRleGVkPE5hbWVkVGltZVBvaW50Pjo6TG9ja2VkIGRlYWRsaW5lKG1EZWFkbGluZSk7CisgICAgZGVhZGxpbmUtPnNldChub3cgKyAodGltZW91dCAqIG11bHQpLCBuYW1lKTsKK30KKwordm9pZCBDQ29kZWM6OmluaXRpYXRlUmVsZWFzZUlmU3R1Y2soKSB7CisgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICBib29sIHBlbmRpbmdEZWFkbGluZSA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxOYW1lZFRpbWVQb2ludD46OkxvY2tlZCBkZWFkbGluZShtRGVhZGxpbmUpOworICAgICAgICBpZiAoZGVhZGxpbmUtPmdldCgpIDwgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkpIHsKKyAgICAgICAgICAgIG5hbWUgPSBkZWFkbGluZS0+Z2V0TmFtZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChkZWFkbGluZS0+Z2V0KCkgIT0gVGltZVBvaW50OjptYXgoKSkgeworICAgICAgICAgICAgcGVuZGluZ0RlYWRsaW5lID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobmFtZS5lbXB0eSgpKSB7CisgICAgICAgIGNvbnN0ZXhwciBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpkdXJhdGlvbiBrV29ya0R1cmF0aW9uVGhyZXNob2xkID0gM3M7CisgICAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OmR1cmF0aW9uIGVsYXBzZWQgPSBtQ2hhbm5lbC0+ZWxhcHNlZCgpOworICAgICAgICBpZiAoZWxhcHNlZCA+PSBrV29ya0R1cmF0aW9uVGhyZXNob2xkKSB7CisgICAgICAgICAgICBuYW1lID0gInF1ZXVlIjsKKyAgICAgICAgfQorICAgICAgICBpZiAoZWxhcHNlZCA+IDBzKSB7CisgICAgICAgICAgICBwZW5kaW5nRGVhZGxpbmUgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIGlmIChuYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gV2UncmUgbm90IHN0dWNrLgorICAgICAgICBpZiAocGVuZGluZ0RlYWRsaW5lKSB7CisgICAgICAgICAgICAvLyBJZiB3ZSBhcmUgbm90IHN0dWNrIHlldCBidXQgc3RpbGwgaGFzIGRlYWRsaW5lIGNvbWluZyB1cCwKKyAgICAgICAgICAgIC8vIHBvc3Qgd2F0Y2ggbWVzc2FnZSB0byBjaGVjayBiYWNrIGxhdGVyLgorICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFdhdGNoLCB0aGlzKSktPnBvc3QoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1coInByZXZpb3VzIGNhbGwgdG8gJXMgZXhjZWVkZWQgdGltZW91dCIsIG5hbWUuY19zdHIoKSk7CisgICAgaW5pdGlhdGVSZWxlYXNlKGZhbHNlKTsKKyAgICBtQ2FsbGJhY2stPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIGFuZHJvaWQ6OkNvZGVjQmFzZSAqQ3JlYXRlQ29kZWMoKSB7CisgICAgcmV0dXJuIG5ldyBhbmRyb2lkOjpDQ29kZWM7Cit9CisKKy8vIENyZWF0ZSBDb2RlYyAyLjAgaW5wdXQgc3VyZmFjZQorZXh0ZXJuICJDIiBhbmRyb2lkOjpQZXJzaXN0ZW50U3VyZmFjZSAqQ3JlYXRlSW5wdXRTdXJmYWNlKCkgeworICAgIC8vIEF0dGVtcHQgdG8gY3JlYXRlIGEgQ29kZWMyJ3MgaW5wdXQgc3VyZmFjZS4KKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U+IGlucHV0U3VyZmFjZSA9CisgICAgICAgICAgICBhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNyZWF0ZUlucHV0U3VyZmFjZSgpOworICAgIGlmICghaW5wdXRTdXJmYWNlKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gbmV3IGFuZHJvaWQ6OlBlcnNpc3RlbnRTdXJmYWNlKAorICAgICAgICAgICAgaW5wdXRTdXJmYWNlLT5nZXRHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPj4oCisgICAgICAgICAgICBpbnB1dFN1cmZhY2UtPmdldEhhbEludGVyZmFjZSgpKSk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWMuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGIzYzRmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlYy5oCkBAIC0wLDAgKzEsMTg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDX0NPREVDX0hfCisjZGVmaW5lIENfQ09ERUNfSF8KKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93Lmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvTWV0YWRhdGFCdWZmZXJUeXBlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NdXRleGVkLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRnJhbWVSZW5kZXJUcmFja2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU2tpcEN1dEJ1ZmZlci5oPgorI2luY2x1ZGUgPHV0aWxzL05hdGl2ZUhhbmRsZS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KKyNpbmNsdWRlIDxuYXRpdmViYXNlL25hdGl2ZWJhc2UuaD4KKworI2luY2x1ZGUgIkNDb2RlY0NvbmZpZy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIENDb2RlY0J1ZmZlckNoYW5uZWw7CitjbGFzcyBJbnB1dFN1cmZhY2VXcmFwcGVyOworc3RydWN0IE1lZGlhQ29kZWNJbmZvOworCitjbGFzcyBDQ29kZWMgOiBwdWJsaWMgQ29kZWNCYXNlIHsKK3B1YmxpYzoKKyAgICBDQ29kZWMoKTsKKworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlckNoYW5uZWxCYXNlPiBnZXRCdWZmZXJDaGFubmVsKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlQWxsb2NhdGVDb21wb25lbnQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZUNvbmZpZ3VyZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlQ3JlYXRlSW5wdXRTdXJmYWNlKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlU2V0SW5wdXRTdXJmYWNlKGNvbnN0IHNwPFBlcnNpc3RlbnRTdXJmYWNlPiAmc3VyZmFjZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlU3RhcnQoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTaHV0ZG93bihib29sIGtlZXBDb21wb25lbnRBbGxvY2F0ZWQgPSBmYWxzZSkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEZsdXNoKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbFJlc3VtZSgpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCB2b2lkIHNpZ25hbFNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZwYXJhbXMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbFJlcXVlc3RJRFJGcmFtZSgpIG92ZXJyaWRlOworCisgICAgdm9pZCBpbml0aWF0ZVJlbGVhc2VJZlN0dWNrKCk7CisgICAgdm9pZCBvbldvcmtEb25lKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJndvcmtJdGVtcyk7CisgICAgdm9pZCBvbklucHV0QnVmZmVyRG9uZSh1aW50NjRfdCBmcmFtZUluZGV4LCBzaXplX3QgYXJyYXlJbmRleCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5DQ29kZWMoKTsKKworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjp0aW1lX3BvaW50IFRpbWVQb2ludDsKKworICAgIHN0YXR1c190IHRyeUFuZFJlcG9ydE9uRXJyb3Ioc3RkOjpmdW5jdGlvbjxzdGF0dXNfdCgpPiBqb2IpOworCisgICAgdm9pZCBpbml0aWF0ZVN0b3AoKTsKKyAgICB2b2lkIGluaXRpYXRlUmVsZWFzZShib29sIHNlbmRDYWxsYmFjayA9IHRydWUpOworCisgICAgdm9pZCBhbGxvY2F0ZShjb25zdCBzcDxNZWRpYUNvZGVjSW5mbz4gJmNvZGVjSW5mbyk7CisgICAgdm9pZCBjb25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgc3RhcnQoKTsKKyAgICB2b2lkIHN0b3AoKTsKKyAgICB2b2lkIGZsdXNoKCk7CisgICAgdm9pZCByZWxlYXNlKGJvb2wgc2VuZENhbGxiYWNrKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gaW5wdXQgc3VyZmFjZSBmb3IgdGhlIGN1cnJlbnQgZGV2aWNlIGNvbmZpZ3VyYXRpb24gY29tcGF0aWJsZSB3aXRoIENDb2RlYy4KKyAgICAgKiBUaGlzIGNvdWxkIGJlIGJhY2tlZCBieSB0aGUgQzIgSEFMIG9yIHRoZSBPTVggSEFMLgorICAgICAqLworICAgIHN0YXRpYyBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gQ3JlYXRlQ29tcGF0aWJsZUlucHV0U3VyZmFjZSgpOworCisgICAgLy8vIENyZWF0ZXMgYW4gaW5wdXQgc3VyZmFjZSB0byB0aGUgT01YIEhBTAorICAgIHN0YXRpYyBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gQ3JlYXRlT214SW5wdXRTdXJmYWNlKCk7CisKKyAgICAvLy8gaGFuZGxlIGEgY3JlYXRlIGlucHV0IHN1cmZhY2UgY2FsbAorICAgIHZvaWQgY3JlYXRlSW5wdXRTdXJmYWNlKCk7CisgICAgdm9pZCBzZXRJbnB1dFN1cmZhY2UoY29uc3Qgc3A8UGVyc2lzdGVudFN1cmZhY2U+ICZzdXJmYWNlKTsKKyAgICBzdGF0dXNfdCBzZXR1cElucHV0U3VyZmFjZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlV3JhcHBlcj4gJnN1cmZhY2UpOworCisgICAgdm9pZCBzZXREZWFkbGluZSgKKyAgICAgICAgICAgIGNvbnN0IFRpbWVQb2ludCAmbm93LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyAmdGltZW91dCwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpOworCisgICAgZW51bSB7CisgICAgICAgIGtXaGF0QWxsb2NhdGUsCisgICAgICAgIGtXaGF0Q29uZmlndXJlLAorICAgICAgICBrV2hhdFN0YXJ0LAorICAgICAgICBrV2hhdEZsdXNoLAorICAgICAgICBrV2hhdFN0b3AsCisgICAgICAgIGtXaGF0UmVsZWFzZSwKKyAgICAgICAga1doYXRDcmVhdGVJbnB1dFN1cmZhY2UsCisgICAgICAgIGtXaGF0U2V0SW5wdXRTdXJmYWNlLAorICAgICAgICBrV2hhdFNldFBhcmFtZXRlcnMsCisKKyAgICAgICAga1doYXRXb3JrRG9uZSwKKyAgICAgICAga1doYXRXYXRjaCwKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICAgIFJFTEVBU0VELAorICAgICAgICBBTExPQ0FURUQsCisgICAgICAgIEZMVVNIRUQsCisgICAgICAgIFJVTk5JTkcsCisKKyAgICAgICAgQUxMT0NBVElORywgIC8vIFJFTEVBU0VEIC0+IEFMTE9DQVRFRAorICAgICAgICBTVEFSVElORywgICAgLy8gQUxMT0NBVEVEIC0+IFJVTk5JTkcKKyAgICAgICAgU1RPUFBJTkcsICAgIC8vIFJVTk5JTkcgLT4gQUxMT0NBVEVECisgICAgICAgIEZMVVNISU5HLCAgICAvLyBSVU5OSU5HIC0+IEZMVVNIRUQKKyAgICAgICAgUkVTVU1JTkcsICAgIC8vIEZMVVNIRUQgLT4gUlVOTklORworICAgICAgICBSRUxFQVNJTkcsICAgLy8ge0FOWSBFWENFUFQgUkVMRUFTRUR9IC0+IFJFTEVBU0VECisgICAgfTsKKworICAgIHN0cnVjdCBTdGF0ZSB7CisgICAgICAgIGlubGluZSBTdGF0ZSgpIDogbVN0YXRlKFJFTEVBU0VEKSB7fQorICAgICAgICBpbmxpbmUgaW50IGdldCgpIGNvbnN0IHsgcmV0dXJuIG1TdGF0ZTsgfQorICAgICAgICBpbmxpbmUgdm9pZCBzZXQoaW50IG5ld1N0YXRlKSB7IG1TdGF0ZSA9IG5ld1N0YXRlOyB9CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wOworICAgIHByaXZhdGU6CisgICAgICAgIGludCBtU3RhdGU7CisgICAgfTsKKworICAgIHN0cnVjdCBOYW1lZFRpbWVQb2ludCB7CisgICAgICAgIE5hbWVkVGltZVBvaW50KCkgOiBtVGltZVBvaW50KFRpbWVQb2ludDo6bWF4KCkpLCBtTmFtZSgiIikge30KKworICAgICAgICBpbmxpbmUgdm9pZCBzZXQoCisgICAgICAgICAgICAgICAgY29uc3QgVGltZVBvaW50ICZ0aW1lUG9pbnQsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSkgeworICAgICAgICAgICAgbVRpbWVQb2ludCA9IHRpbWVQb2ludDsKKyAgICAgICAgICAgIG1OYW1lID0gbmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSBUaW1lUG9pbnQgZ2V0KCkgY29uc3QgeyByZXR1cm4gbVRpbWVQb2ludDsgfQorICAgICAgICBpbmxpbmUgY29uc3QgY2hhciAqZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgVGltZVBvaW50IG1UaW1lUG9pbnQ7CisgICAgICAgIGNvbnN0IGNoYXIgKm1OYW1lOworICAgIH07CisKKyAgICBNdXRleGVkPFN0YXRlPiBtU3RhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPENDb2RlY0J1ZmZlckNoYW5uZWw+IG1DaGFubmVsOworCisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gbUNsaWVudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbUNsaWVudExpc3RlbmVyOworICAgIHN0cnVjdCBDbGllbnRMaXN0ZW5lcjsKKworICAgIE11dGV4ZWQ8TmFtZWRUaW1lUG9pbnQ+IG1EZWFkbGluZTsKKyAgICB0eXBlZGVmIENDb2RlY0NvbmZpZyBDb25maWc7CisgICAgTXV0ZXhlZDxDb25maWc+IG1Db25maWc7CisgICAgTXV0ZXhlZDxzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+PiBtV29ya0RvbmVRdWV1ZTsKKworICAgIGZyaWVuZCBjbGFzcyBDQ29kZWNDYWxsYmFja0ltcGw7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDQ29kZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDX0NPREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIyMGIyMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmNwcApAQCAtMCwwICsxLDE2ODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ0NvZGVjQnVmZmVyQ2hhbm5lbCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG51bWVyaWM+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPEMyQmxvY2tJbnRlcm5hbC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvbmF0aXZlLzEuMC9JRGVzY3JhbWJsZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CisjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfQ29yZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb2t1cC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgorI2luY2x1ZGUgPHN5c3RlbS93aW5kb3cuaD4KKworI2luY2x1ZGUgIkNDb2RlY0J1ZmZlckNoYW5uZWwuaCIKKyNpbmNsdWRlICJDb2RlYzJCdWZmZXIuaCIKKyNpbmNsdWRlICJTa2lwQ3V0QnVmZmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgbmFtZXNwYWNlIGhhcmR3YXJlOjpjYXM6OlYxXzA7Cit1c2luZyBuYW1lc3BhY2UgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOworCit1c2luZyBDYXNTdGF0dXMgPSBoYXJkd2FyZTo6Y2FzOjpWMV8wOjpTdGF0dXM7CisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciBzaXplX3Qga1Ntb290aG5lc3NGYWN0b3IgPSA0OworY29uc3RleHByIHNpemVfdCBrUmVuZGVyaW5nRGVwdGggPSAzOworCisvLyBUaGlzIGlzIGZvciBrZWVwaW5nIElHQlAncyBidWZmZXIgZHJvcHBpbmcgbG9naWMgaW4gbGVnYWN5IG1vZGUgb3RoZXIKKy8vIHRoYW4gbWFraW5nIGl0IG5vbi1ibG9ja2luZy4gRG8gbm90IGNoYW5nZSB0aGlzIHZhbHVlLgorY29uc3Qgc3RhdGljIHNpemVfdCBrRGVxdWV1ZVRpbWVvdXROcyA9IDA7CisKK30gIC8vIG5hbWVzcGFjZQorCitDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZUd1YXJkOjpRdWV1ZUd1YXJkKAorICAgICAgICBDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZVN5bmMgJnN5bmMpIDogbVN5bmMoc3luYykgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1TeW5jLm1HdWFyZExvY2spOworICAgIC8vIEF0IHRoaXMgcG9pbnQgaXQncyBndWFyYW50ZWVkIHRoYXQgbVN5bmMgaXMgbm90IHVuZGVyIHN0YXRlIHRyYW5zaXRpb24sCisgICAgLy8gYXMgd2UgYXJlIGhvbGRpbmcgaXRzIG11dGV4LgorCisgICAgTXV0ZXhlZDxDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZVN5bmM6OkNvdW50ZXI+OjpMb2NrZWQgY291bnQobVN5bmMubUNvdW50KTsKKyAgICBpZiAoY291bnQtPnZhbHVlID09IC0xKSB7CisgICAgICAgIG1SdW5uaW5nID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKytjb3VudC0+dmFsdWU7CisgICAgICAgIG1SdW5uaW5nID0gdHJ1ZTsKKyAgICB9Cit9CisKK0NDb2RlY0J1ZmZlckNoYW5uZWw6OlF1ZXVlR3VhcmQ6On5RdWV1ZUd1YXJkKCkgeworICAgIGlmIChtUnVubmluZykgeworICAgICAgICAvLyBXZSBhcmUgbm90IGhvbGRpbmcgbUd1YXJkTG9jayBhdCB0aGlzIHBvaW50IHNvIHRoYXQgUXVldWVTeW5jOjpzdG9wKCkgY2FuCisgICAgICAgIC8vIGtlZXAgaG9sZGluZyB0aGUgbG9jayB1bnRpbCBtQ291bnQgcmVhY2hlcyB6ZXJvLgorICAgICAgICBNdXRleGVkPENDb2RlY0J1ZmZlckNoYW5uZWw6OlF1ZXVlU3luYzo6Q291bnRlcj46OkxvY2tlZCBjb3VudChtU3luYy5tQ291bnQpOworICAgICAgICAtLWNvdW50LT52YWx1ZTsKKyAgICAgICAgY291bnQtPmNvbmQuYnJvYWRjYXN0KCk7CisgICAgfQorfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OlF1ZXVlU3luYzo6c3RhcnQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUd1YXJkTG9jayk7CisgICAgLy8gSWYgc3RvcHBlZCwgaXQgZ29lcyB0byBydW5uaW5nIHN0YXRlOyBvdGhlcndpc2Ugbm8tb3AuCisgICAgTXV0ZXhlZDxDb3VudGVyPjo6TG9ja2VkIGNvdW50KG1Db3VudCk7CisgICAgaWYgKGNvdW50LT52YWx1ZSA9PSAtMSkgeworICAgICAgICBjb3VudC0+dmFsdWUgPSAwOworICAgIH0KK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpRdWV1ZVN5bmM6OnN0b3AoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUd1YXJkTG9jayk7CisgICAgTXV0ZXhlZDxDb3VudGVyPjo6TG9ja2VkIGNvdW50KG1Db3VudCk7CisgICAgaWYgKGNvdW50LT52YWx1ZSA9PSAtMSkgeworICAgICAgICAvLyBuby1vcAorICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIEhvbGRpbmcgbUd1YXJkTG9jayBoZXJlIGJsb2NrcyBjcmVhdGlvbiBvZiBhZGRpdGlvbmFsIFF1ZXVlR3VhcmQgb2JqZWN0cywgc28KKyAgICAvLyBtQ291bnQgY2FuIG9ubHkgZGVjcmVtZW50LiBJbiBvdGhlciB3b3JkcywgdGhyZWFkcyB0aGF0IGFjcXVpcmVkIHRoZSBsb2NrCisgICAgLy8gYXJlIGFsbG93ZWQgdG8gZmluaXNoIGV4ZWN1dGlvbiBidXQgYWRkaXRpb25hbCB0aHJlYWRzIHRyeWluZyB0byBhY3F1aXJlCisgICAgLy8gdGhlIGxvY2sgYXQgdGhpcyBwb2ludCB3aWxsIGJsb2NrLCBhbmQgdGhlbiBnZXQgUXVldWVHdWFyZCBhdCBTVE9QUEVECisgICAgLy8gc3RhdGUuCisgICAgd2hpbGUgKGNvdW50LT52YWx1ZSAhPSAwKSB7CisgICAgICAgIGNvdW50LndhaXRGb3JDb25kaXRpb24oY291bnQtPmNvbmQpOworICAgIH0KKyAgICBjb3VudC0+dmFsdWUgPSAtMTsKK30KKworLy8gQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoCisKK0NDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6UmVvcmRlclN0YXNoKCkgeworICAgIGNsZWFyKCk7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpjbGVhcigpIHsKKyAgICBtUGVuZGluZy5jbGVhcigpOworICAgIG1TdGFzaC5jbGVhcigpOworICAgIG1EZXB0aCA9IDA7CisgICAgbUtleSA9IEMyQ29uZmlnOjpPUkRJTkFMOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6Zmx1c2goKSB7CisgICAgbVBlbmRpbmcuY2xlYXIoKTsKKyAgICBtU3Rhc2guY2xlYXIoKTsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2g6OnNldERlcHRoKHVpbnQzMl90IGRlcHRoKSB7CisgICAgbVBlbmRpbmcuc3BsaWNlKG1QZW5kaW5nLmVuZCgpLCBtU3Rhc2gpOworICAgIG1EZXB0aCA9IGRlcHRoOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6c2V0S2V5KEMyQ29uZmlnOjpvcmRpbmFsX2tleV90IGtleSkgeworICAgIG1QZW5kaW5nLnNwbGljZShtUGVuZGluZy5lbmQoKSwgbVN0YXNoKTsKKyAgICBtS2V5ID0ga2V5OworfQorCitib29sIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6cG9wKEVudHJ5ICplbnRyeSkgeworICAgIGlmIChtUGVuZGluZy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZW50cnktPmJ1ZmZlciAgICAgPSBtUGVuZGluZy5mcm9udCgpLmJ1ZmZlcjsKKyAgICBlbnRyeS0+dGltZXN0YW1wICA9IG1QZW5kaW5nLmZyb250KCkudGltZXN0YW1wOworICAgIGVudHJ5LT5mbGFncyAgICAgID0gbVBlbmRpbmcuZnJvbnQoKS5mbGFnczsKKyAgICBlbnRyeS0+b3JkaW5hbCAgICA9IG1QZW5kaW5nLmZyb250KCkub3JkaW5hbDsKKyAgICBtUGVuZGluZy5wb3BfZnJvbnQoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2g6OmVtcGxhY2UoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAsCisgICAgICAgIGludDMyX3QgZmxhZ3MsCisgICAgICAgIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgJm9yZGluYWwpIHsKKyAgICBib29sIGVvcyA9IGZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TOworICAgIGlmICghYnVmZmVyICYmIGVvcykgeworICAgICAgICAvLyBUUklDS1k6IHdlIG1heSBiZSB2aW9sYXRpbmcgb3JkZXJpbmcgb2YgdGhlIHN0YXNoIGhlcmUuIEJlY2F1c2Ugd2UKKyAgICAgICAgLy8gZG9uJ3QgZXhwZWN0IGFueSBtb3JlIGVtcGxhY2UoKSBjYWxscyBhZnRlciB0aGlzLCB0aGUgb3JkZXJpbmcgc2hvdWxkCisgICAgICAgIC8vIG5vdCBtYXR0ZXIuCisgICAgICAgIG1TdGFzaC5lbXBsYWNlX2JhY2soYnVmZmVyLCB0aW1lc3RhbXAsIGZsYWdzLCBvcmRpbmFsKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmbGFncyA9IGZsYWdzICYgfk1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUzsKKyAgICAgICAgYXV0byBpdCA9IG1TdGFzaC5iZWdpbigpOworICAgICAgICBmb3IgKDsgaXQgIT0gbVN0YXNoLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBpZiAobGVzcyhvcmRpbmFsLCBpdC0+b3JkaW5hbCkpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtU3Rhc2guZW1wbGFjZShpdCwgYnVmZmVyLCB0aW1lc3RhbXAsIGZsYWdzLCBvcmRpbmFsKTsKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgbVN0YXNoLmJhY2soKS5mbGFncyA9IG1TdGFzaC5iYWNrKCkuZmxhZ3MgfCBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1M7CisgICAgICAgIH0KKyAgICB9CisgICAgd2hpbGUgKCFtU3Rhc2guZW1wdHkoKSAmJiBtU3Rhc2guc2l6ZSgpID4gbURlcHRoKSB7CisgICAgICAgIG1QZW5kaW5nLnB1c2hfYmFjayhtU3Rhc2guZnJvbnQoKSk7CisgICAgICAgIG1TdGFzaC5wb3BfZnJvbnQoKTsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpkZWZlcigKKyAgICAgICAgY29uc3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpFbnRyeSAmZW50cnkpIHsKKyAgICBtUGVuZGluZy5wdXNoX2Zyb250KGVudHJ5KTsKK30KKworYm9vbCBDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2g6Omhhc1BlbmRpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuICFtUGVuZGluZy5lbXB0eSgpOworfQorCitib29sIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6bGVzcygKKyAgICAgICAgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCAmbzEsIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgJm8yKSB7CisgICAgc3dpdGNoIChtS2V5KSB7CisgICAgICAgIGNhc2UgQzJDb25maWc6Ok9SRElOQUw6ICAgcmV0dXJuIG8xLmZyYW1lSW5kZXggPCBvMi5mcmFtZUluZGV4OworICAgICAgICBjYXNlIEMyQ29uZmlnOjpUSU1FU1RBTVA6IHJldHVybiBvMS50aW1lc3RhbXAgPCBvMi50aW1lc3RhbXA7CisgICAgICAgIGNhc2UgQzJDb25maWc6OkNVU1RPTTogICAgcmV0dXJuIG8xLmN1c3RvbU9yZGluYWwgPCBvMi5jdXN0b21PcmRpbmFsOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0QoIlVucmVjb2duaXplZCBrZXk7IGRlZmF1bHQgdG8gdGltZXN0YW1wIik7CisgICAgICAgICAgICByZXR1cm4gbzEuZnJhbWVJbmRleCA8IG8yLmZyYW1lSW5kZXg7CisgICAgfQorfQorCisvLyBJbnB1dAorCitDQ29kZWNCdWZmZXJDaGFubmVsOjpJbnB1dDo6SW5wdXQoKSA6IGV4dHJhQnVmZmVycygiZXh0cmEiKSB7fQorCisvLyBDQ29kZWNCdWZmZXJDaGFubmVsCisKK0NDb2RlY0J1ZmZlckNoYW5uZWw6OkNDb2RlY0J1ZmZlckNoYW5uZWwoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDQ29kZWNDYWxsYmFjaz4gJmNhbGxiYWNrKQorICAgIDogbUhlYXBTZXFOdW0oLTEpLAorICAgICAgbUNDb2RlY0NhbGxiYWNrKGNhbGxiYWNrKSwKKyAgICAgIG1EZWxheSgwKSwKKyAgICAgIG1GcmFtZUluZGV4KDB1KSwKKyAgICAgIG1GaXJzdFZhbGlkRnJhbWVJbmRleCgwdSksCisgICAgICBtTWV0YU1vZGUoTU9ERV9OT05FKSwKKyAgICAgIG1JbnB1dE1ldEVvcyhmYWxzZSkgeworICAgIG1PdXRwdXRTdXJmYWNlLmxvY2soKS0+bWF4RGVxdWV1ZUJ1ZmZlcnMgPSBrU21vb3RobmVzc0ZhY3RvciArIGtSZW5kZXJpbmdEZXB0aDsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8SW5wdXQ+OjpMb2NrZWQgaW5wdXQobUlucHV0KTsKKyAgICAgICAgaW5wdXQtPmJ1ZmZlcnMucmVzZXQobmV3IER1bW15SW5wdXRCdWZmZXJzKCIiKSk7CisgICAgICAgIGlucHV0LT5leHRyYUJ1ZmZlcnMuZmx1c2goKTsKKyAgICAgICAgaW5wdXQtPmlucHV0RGVsYXkgPSAwdTsKKyAgICAgICAgaW5wdXQtPnBpcGVsaW5lRGVsYXkgPSAwdTsKKyAgICAgICAgaW5wdXQtPm51bVNsb3RzID0ga1Ntb290aG5lc3NGYWN0b3I7CisgICAgICAgIGlucHV0LT5udW1FeHRyYVNsb3RzID0gMHU7CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxPdXRwdXQ+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXQpOworICAgICAgICBvdXRwdXQtPm91dHB1dERlbGF5ID0gMHU7CisgICAgICAgIG91dHB1dC0+bnVtU2xvdHMgPSBrU21vb3RobmVzc0ZhY3RvcjsKKyAgICB9Cit9CisKK0NDb2RlY0J1ZmZlckNoYW5uZWw6On5DQ29kZWNCdWZmZXJDaGFubmVsKCkgeworICAgIGlmIChtQ3J5cHRvICE9IG51bGxwdHIgJiYgbURlYWxlciAhPSBudWxscHRyICYmIG1IZWFwU2VxTnVtID49IDApIHsKKyAgICAgICAgbUNyeXB0by0+dW5zZXRIZWFwKG1IZWFwU2VxTnVtKTsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6c2V0Q29tcG9uZW50KAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wb25lbnQpIHsKKyAgICBtQ29tcG9uZW50ID0gY29tcG9uZW50OworICAgIG1Db21wb25lbnROYW1lID0gY29tcG9uZW50LT5nZXROYW1lKCkgKyBTdHJpbmdQcmludGYoIiMlZCIsIGludCh1aW50cHRyX3QoY29tcG9uZW50LmdldCgpKSAlIDk5NykpOworICAgIG1OYW1lID0gbUNvbXBvbmVudE5hbWUuY19zdHIoKTsKK30KKworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6c2V0SW5wdXRTdXJmYWNlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlV3JhcHBlcj4gJnN1cmZhY2UpIHsKKyAgICBBTE9HVigiWyVzXSBzZXRJbnB1dFN1cmZhY2UiLCBtTmFtZSk7CisgICAgbUlucHV0U3VyZmFjZSA9IHN1cmZhY2U7CisgICAgcmV0dXJuIG1JbnB1dFN1cmZhY2UtPmNvbm5lY3QobUNvbXBvbmVudCk7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSB7CisgICAgaWYgKG1JbnB1dFN1cmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHJldHVybiBtSW5wdXRTdXJmYWNlLT5zaWduYWxFbmRPZklucHV0U3RyZWFtKCk7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnF1ZXVlSW5wdXRCdWZmZXJJbnRlcm5hbChzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXIpIHsKKyAgICBpbnQ2NF90IHRpbWVVczsKKyAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CisKKyAgICBpZiAobUlucHV0TWV0RW9zKSB7CisgICAgICAgIEFMT0dEKCJbJXNdIGJ1ZmZlcnMgYWZ0ZXIgRU9TIGlnbm9yZWQgKCVsbGQgdXMpIiwgbU5hbWUsIChsb25nIGxvbmcpdGltZVVzKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGludDMyX3QgZmxhZ3MgPSAwOworICAgIGludDMyX3QgdG1wID0gMDsKKyAgICBib29sIGVvcyA9IGZhbHNlOworICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJlb3MiLCAmdG1wKSAmJiB0bXApIHsKKyAgICAgICAgZW9zID0gdHJ1ZTsKKyAgICAgICAgbUlucHV0TWV0RW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoIlslc10gaW5wdXQgRU9TIiwgbU5hbWUpOworICAgIH0KKyAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiY3NkIiwgJnRtcCkgJiYgdG1wKSB7CisgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRzsKKyAgICB9CisgICAgQUxPR1YoIlslc10gcXVldWVJbnB1dEJ1ZmZlcjogYnVmZmVyLT5zaXplKCkgPSAlenUiLCBtTmFtZSwgYnVmZmVyLT5zaXplKCkpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmsobmV3IEMyV29yayk7CisgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lVXM7CisgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gbUZyYW1lSW5kZXgrKzsKKyAgICAvLyBXT1JLQVJPVU5EOiB1bnRpbCBjb2RlY3Mgc3VwcG9ydCBoYW5kbGluZyB3b3JrIGFmdGVyIEVPUyBhbmQgbWF4IG91dHB1dCBzaXppbmcsIHVzZSB0aW1lc3RhbXAKKyAgICAvLyBtYW5pcHVsYXRpb24gdG8gYWNoaWV2ZSBpbWFnZSBlbmNvZGluZyB2aWEgdmlkZW8gY29kZWMsIGFuZCB0byBjb25zdHJhaW4gZW5jb2RlZCBvdXRwdXQuCisgICAgLy8gS2VlcCBjbGllbnQgdGltZXN0YW1wIGluIGN1c3RvbU9yZGluYWwKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWwgPSB0aW1lVXM7CisgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworCisgICAgdWludDY0X3QgcXVldWVkRnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4+IHF1ZXVlZEJ1ZmZlcnM7CisgICAgc3A8Q29kZWMyQnVmZmVyPiBjb3B5OworCisgICAgaWYgKGJ1ZmZlci0+c2l6ZSgpID4gMHUpIHsKKyAgICAgICAgTXV0ZXhlZDxJbnB1dD46OkxvY2tlZCBpbnB1dChtSW5wdXQpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGMyYnVmZmVyOworICAgICAgICBpZiAoIWlucHV0LT5idWZmZXJzLT5yZWxlYXNlQnVmZmVyKGJ1ZmZlciwgJmMyYnVmZmVyLCBmYWxzZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAtRU5PRU5UOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IHdlIHdhbnQgdG8gZGVsYXkgY29weWluZyBidWZmZXJzLgorICAgICAgICBpZiAoaW5wdXQtPmV4dHJhQnVmZmVycy5udW1Db21wb25lbnRCdWZmZXJzKCkgPCBpbnB1dC0+bnVtRXh0cmFTbG90cykgeworICAgICAgICAgICAgY29weSA9IGlucHV0LT5idWZmZXJzLT5jbG9uZUFuZFJlbGVhc2VCdWZmZXIoYnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChjb3B5ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAodm9pZClpbnB1dC0+ZXh0cmFCdWZmZXJzLmFzc2lnblNsb3QoY29weSk7CisgICAgICAgICAgICAgICAgaWYgKCFpbnB1dC0+ZXh0cmFCdWZmZXJzLnJlbGVhc2VTbG90KGNvcHksICZjMmJ1ZmZlciwgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBib29sIHJlbGVhc2VkID0gaW5wdXQtPmJ1ZmZlcnMtPnJlbGVhc2VCdWZmZXIoYnVmZmVyLCBudWxscHRyLCB0cnVlKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBxdWV1ZUlucHV0QnVmZmVyOiBidWZmZXIgY29waWVkOyAlc3JlbGVhc2VkIiwKKyAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcmVsZWFzZWQgPyAiIiA6ICJub3QgIik7CisgICAgICAgICAgICAgICAgYnVmZmVyLmNsZWFyKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJbJXNdIHF1ZXVlSW5wdXRCdWZmZXI6IGZhaWxlZCB0byBjb3B5IGEgYnVmZmVyOyB0aGlzIG1heSBjYXVzZSBpbnB1dCAiCisgICAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciBzdGFydmF0aW9uIG9uIGNvbXBvbmVudC4iLCBtTmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5wdXNoX2JhY2soYzJidWZmZXIpOworICAgICAgICBxdWV1ZWRCdWZmZXJzLnB1c2hfYmFjayhjMmJ1ZmZlcik7CisgICAgfSBlbHNlIGlmIChlb3MpIHsKKyAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICB9CisgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgLy8gVE9ETzogZmlsbCBpbmZvJ3MKKworICAgIHdvcmstPmlucHV0LmNvbmZpZ1VwZGF0ZSA9IHN0ZDo6bW92ZShtUGFyYW1zVG9CZVNldCk7CisgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgIG1QaXBlbGluZVdhdGNoZXIubG9jaygpLT5vbldvcmtRdWV1ZWQoCisgICAgICAgICAgICBxdWV1ZWRGcmFtZUluZGV4LAorICAgICAgICAgICAgc3RkOjptb3ZlKHF1ZXVlZEJ1ZmZlcnMpLAorICAgICAgICAgICAgUGlwZWxpbmVXYXRjaGVyOjpDbG9jazo6bm93KCkpOworICAgIGMyX3N0YXR1c190IGVyciA9IG1Db21wb25lbnQtPnF1ZXVlKCZpdGVtcyk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBtUGlwZWxpbmVXYXRjaGVyLmxvY2soKS0+b25Xb3JrRG9uZShxdWV1ZWRGcmFtZUluZGV4KTsKKyAgICB9CisKKyAgICBpZiAoZXJyID09IEMyX09LICYmIGVvcyAmJiBidWZmZXItPnNpemUoKSA+IDB1KSB7CisgICAgICAgIHdvcmsucmVzZXQobmV3IEMyV29yayk7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gdGltZVVzOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSBtRnJhbWVJbmRleCsrOworICAgICAgICAvLyBXT1JLQVJPVU5EOiBrZWVwIGNsaWVudCB0aW1lc3RhbXAgaW4gY3VzdG9tT3JkaW5hbAorICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWwgPSB0aW1lVXM7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+aW5wdXQuZmxhZ3MgPSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICAgICAgcXVldWVkRnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgICAgICBxdWV1ZWRCdWZmZXJzLmNsZWFyKCk7CisKKyAgICAgICAgaXRlbXMuY2xlYXIoKTsKKyAgICAgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisKKyAgICAgICAgbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPm9uV29ya1F1ZXVlZCgKKyAgICAgICAgICAgICAgICBxdWV1ZWRGcmFtZUluZGV4LAorICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShxdWV1ZWRCdWZmZXJzKSwKKyAgICAgICAgICAgICAgICBQaXBlbGluZVdhdGNoZXI6OkNsb2NrOjpub3coKSk7CisgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXVlKCZpdGVtcyk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIG1QaXBlbGluZVdhdGNoZXIubG9jaygpLT5vbldvcmtEb25lKHF1ZXVlZEZyYW1lSW5kZXgpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgTXV0ZXhlZDxJbnB1dD46OkxvY2tlZCBpbnB1dChtSW5wdXQpOworICAgICAgICBib29sIHJlbGVhc2VkID0gZmFsc2U7CisgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgIHJlbGVhc2VkID0gaW5wdXQtPmJ1ZmZlcnMtPnJlbGVhc2VCdWZmZXIoYnVmZmVyLCBudWxscHRyLCB0cnVlKTsKKyAgICAgICAgfSBlbHNlIGlmIChjb3B5KSB7CisgICAgICAgICAgICByZWxlYXNlZCA9IGlucHV0LT5leHRyYUJ1ZmZlcnMucmVsZWFzZVNsb3QoY29weSwgbnVsbHB0ciwgdHJ1ZSk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIlslc10gcXVldWVJbnB1dEJ1ZmZlcjogYnVmZmVyJXMgJXNyZWxlYXNlZCIsCisgICAgICAgICAgICAgIG1OYW1lLCAoYnVmZmVyID09IG51bGxwdHIpID8gIihjb3B5KSIgOiAiIiwgcmVsZWFzZWQgPyAiIiA6ICJub3QgIik7CisgICAgfQorCisgICAgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGVJbnRlcm5hbCgpOworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnNldFBhcmFtZXRlcnMoc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmcGFyYW1zKSB7CisgICAgUXVldWVHdWFyZCBndWFyZChtU3luYyk7CisgICAgaWYgKCFndWFyZC5pc1J1bm5pbmcoKSkgeworICAgICAgICBBTE9HRCgiWyVzXSBzZXRQYXJhbWV0ZXJzIGlzIG9ubHkgc3VwcG9ydGVkIGluIHRoZSBydW5uaW5nIHN0YXRlLiIsIG1OYW1lKTsKKyAgICAgICAgcmV0dXJuIC1FTk9TWVM7CisgICAgfQorICAgIG1QYXJhbXNUb0JlU2V0Lmluc2VydChtUGFyYW1zVG9CZVNldC5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX21vdmVfaXRlcmF0b3IocGFyYW1zLmJlZ2luKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcihwYXJhbXMuZW5kKCkpKTsKKyAgICBwYXJhbXMuY2xlYXIoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnF1ZXVlSW5wdXRCdWZmZXIoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcikgeworICAgIFF1ZXVlR3VhcmQgZ3VhcmQobVN5bmMpOworICAgIGlmICghZ3VhcmQuaXNSdW5uaW5nKCkpIHsKKyAgICAgICAgQUxPR0QoIlslc10gTm8gbW9yZSBidWZmZXJzIHNob3VsZCBiZSBxdWV1ZWQgYXQgY3VycmVudCBzdGF0ZS4iLCBtTmFtZSk7CisgICAgICAgIHJldHVybiAtRU5PU1lTOworICAgIH0KKyAgICByZXR1cm4gcXVldWVJbnB1dEJ1ZmZlckludGVybmFsKGJ1ZmZlcik7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnF1ZXVlU2VjdXJlSW5wdXRCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsIGJvb2wgc2VjdXJlLCBjb25zdCB1aW50OF90ICprZXksCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKml2LCBDcnlwdG9QbHVnaW46Ok1vZGUgbW9kZSwgQ3J5cHRvUGx1Z2luOjpQYXR0ZXJuIHBhdHRlcm4sCisgICAgICAgIGNvbnN0IENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlICpzdWJTYW1wbGVzLCBzaXplX3QgbnVtU3ViU2FtcGxlcywKKyAgICAgICAgQVN0cmluZyAqZXJyb3JEZXRhaWxNc2cpIHsKKyAgICBRdWV1ZUd1YXJkIGd1YXJkKG1TeW5jKTsKKyAgICBpZiAoIWd1YXJkLmlzUnVubmluZygpKSB7CisgICAgICAgIEFMT0dEKCJbJXNdIE5vIG1vcmUgYnVmZmVycyBzaG91bGQgYmUgcXVldWVkIGF0IGN1cnJlbnQgc3RhdGUuIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gLUVOT1NZUzsKKyAgICB9CisKKyAgICBpZiAoIWhhc0NyeXB0b09yRGVzY3JhbWJsZXIoKSkgeworICAgICAgICByZXR1cm4gLUVOT1NZUzsKKyAgICB9CisgICAgc3A8RW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXI+IGVuY3J5cHRlZEJ1ZmZlcigoRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXIgKilidWZmZXIuZ2V0KCkpOworCisgICAgc3NpemVfdCByZXN1bHQgPSAtMTsKKyAgICBzc2l6ZV90IGNvZGVjRGF0YU9mZnNldCA9IDA7CisgICAgaWYgKG1DcnlwdG8gIT0gbnVsbHB0cikgeworICAgICAgICBJQ3J5cHRvOjpEZXN0aW5hdGlvbkJ1ZmZlciBkZXN0aW5hdGlvbjsKKyAgICAgICAgaWYgKHNlY3VyZSkgeworICAgICAgICAgICAgZGVzdGluYXRpb24ubVR5cGUgPSBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlTmF0aXZlSGFuZGxlOworICAgICAgICAgICAgZGVzdGluYXRpb24ubUhhbmRsZSA9IGVuY3J5cHRlZEJ1ZmZlci0+aGFuZGxlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkZXN0aW5hdGlvbi5tVHlwZSA9IElDcnlwdG86OmtEZXN0aW5hdGlvblR5cGVTaGFyZWRNZW1vcnk7CisgICAgICAgICAgICBkZXN0aW5hdGlvbi5tU2hhcmVkTWVtb3J5ID0gbURlY3J5cHREZXN0aW5hdGlvbjsKKyAgICAgICAgfQorICAgICAgICBJQ3J5cHRvOjpTb3VyY2VCdWZmZXIgc291cmNlOworICAgICAgICBlbmNyeXB0ZWRCdWZmZXItPmZpbGxTb3VyY2VCdWZmZXIoJnNvdXJjZSk7CisgICAgICAgIHJlc3VsdCA9IG1DcnlwdG8tPmRlY3J5cHQoCisgICAgICAgICAgICAgICAga2V5LCBpdiwgbW9kZSwgcGF0dGVybiwgc291cmNlLCBidWZmZXItPm9mZnNldCgpLAorICAgICAgICAgICAgICAgIHN1YlNhbXBsZXMsIG51bVN1YlNhbXBsZXMsIGRlc3RpbmF0aW9uLCBlcnJvckRldGFpbE1zZyk7CisgICAgICAgIGlmIChyZXN1bHQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGlmIChkZXN0aW5hdGlvbi5tVHlwZSA9PSBJQ3J5cHRvOjprRGVzdGluYXRpb25UeXBlU2hhcmVkTWVtb3J5KSB7CisgICAgICAgICAgICBlbmNyeXB0ZWRCdWZmZXItPmNvcHlEZWNyeXB0ZWRDb250ZW50KG1EZWNyeXB0RGVzdGluYXRpb24sIHJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBIZXJlIHdlIGNhc3QgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUgdG8gaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpTdWJTYW1wbGUKKyAgICAgICAgLy8gZGlyZWN0bHksIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgc2hvdWxkIG1hdGNoIGFzIGNoZWNrZWQgaW4gRGVzY3JhbWJsZXJJbXBsLmNwcC4KKyAgICAgICAgaGlkbF92ZWM8U3ViU2FtcGxlPiBoaWRsU3ViU2FtcGxlczsKKyAgICAgICAgaGlkbFN1YlNhbXBsZXMuc2V0VG9FeHRlcm5hbCgoU3ViU2FtcGxlICopc3ViU2FtcGxlcywgbnVtU3ViU2FtcGxlcywgZmFsc2UgLypvd24qLyk7CisKKyAgICAgICAgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpTaGFyZWRCdWZmZXIgc3JjQnVmZmVyOworICAgICAgICBlbmNyeXB0ZWRCdWZmZXItPmZpbGxTb3VyY2VCdWZmZXIoJnNyY0J1ZmZlcik7CisKKyAgICAgICAgRGVzdGluYXRpb25CdWZmZXIgZHN0QnVmZmVyOworICAgICAgICBpZiAoc2VjdXJlKSB7CisgICAgICAgICAgICBkc3RCdWZmZXIudHlwZSA9IEJ1ZmZlclR5cGU6Ok5BVElWRV9IQU5ETEU7CisgICAgICAgICAgICBkc3RCdWZmZXIuc2VjdXJlTWVtb3J5ID0gaGlkbF9oYW5kbGUoZW5jcnlwdGVkQnVmZmVyLT5oYW5kbGUoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkc3RCdWZmZXIudHlwZSA9IEJ1ZmZlclR5cGU6OlNIQVJFRF9NRU1PUlk7CisgICAgICAgICAgICBkc3RCdWZmZXIubm9uc2VjdXJlTWVtb3J5ID0gc3JjQnVmZmVyOworICAgICAgICB9CisKKyAgICAgICAgQ2FzU3RhdHVzIHN0YXR1cyA9IENhc1N0YXR1czo6T0s7CisgICAgICAgIGhpZGxfc3RyaW5nIGRldGFpbGVkRXJyb3I7CisgICAgICAgIFNjcmFtYmxpbmdDb250cm9sIHNjdHJsID0gU2NyYW1ibGluZ0NvbnRyb2w6OlVOU0NSQU1CTEVEOworCisgICAgICAgIGlmIChrZXkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc2N0cmwgPSAoU2NyYW1ibGluZ0NvbnRyb2wpa2V5WzBdOworICAgICAgICAgICAgLy8gQWRqdXN0IGZvciB0aGUgUEVTIG9mZnNldAorICAgICAgICAgICAgY29kZWNEYXRhT2Zmc2V0ID0ga2V5WzJdIHwgKGtleVszXSA8PCA4KTsKKyAgICAgICAgfQorCisgICAgICAgIGF1dG8gcmV0dXJuVm9pZCA9IG1EZXNjcmFtYmxlci0+ZGVzY3JhbWJsZSgKKyAgICAgICAgICAgICAgICBzY3RybCwKKyAgICAgICAgICAgICAgICBoaWRsU3ViU2FtcGxlcywKKyAgICAgICAgICAgICAgICBzcmNCdWZmZXIsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBbJnN0YXR1cywgJnJlc3VsdCwgJmRldGFpbGVkRXJyb3JdICgKKyAgICAgICAgICAgICAgICAgICAgICAgIENhc1N0YXR1cyBfc3RhdHVzLCB1aW50MzJfdCBfYnl0ZXNXcml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIF9kZXRhaWxlZEVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IF9zdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChzc2l6ZV90KV9ieXRlc1dyaXR0ZW47CisgICAgICAgICAgICAgICAgICAgIGRldGFpbGVkRXJyb3IgPSBfZGV0YWlsZWRFcnJvcjsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBpZiAoIXJldHVyblZvaWQuaXNPaygpIHx8IHN0YXR1cyAhPSBDYXNTdGF0dXM6Ok9LIHx8IHJlc3VsdCA8IDApIHsKKyAgICAgICAgICAgIEFMT0dJKCJbJXNdIGRlc2NyYW1ibGUgZmFpbGVkLCB0cmFucz0lcywgc3RhdHVzPSVkLCByZXN1bHQ9JXpkIiwKKyAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHJldHVyblZvaWQuZGVzY3JpcHRpb24oKS5jX3N0cigpLCBzdGF0dXMsIHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXN1bHQgPCBjb2RlY0RhdGFPZmZzZXQpIHsKKyAgICAgICAgICAgIEFMT0dEKCJpbnZhbGlkIGNvZGVjIGRhdGEgb2Zmc2V0OiAlemQsIHJlc3VsdCAlemQiLCBjb2RlY0RhdGFPZmZzZXQsIHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoIlslc10gZGVzY3JhbWJsZSBzdWNjZWVkZWQsICV6ZCBieXRlcyIsIG1OYW1lLCByZXN1bHQpOworCisgICAgICAgIGlmIChkc3RCdWZmZXIudHlwZSA9PSBCdWZmZXJUeXBlOjpTSEFSRURfTUVNT1JZKSB7CisgICAgICAgICAgICBlbmNyeXB0ZWRCdWZmZXItPmNvcHlEZWNyeXB0ZWRDb250ZW50RnJvbU1lbW9yeShyZXN1bHQpOworICAgICAgICB9CisgICAgfQorCisgICAgYnVmZmVyLT5zZXRSYW5nZShjb2RlY0RhdGFPZmZzZXQsIHJlc3VsdCAtIGNvZGVjRGF0YU9mZnNldCk7CisgICAgcmV0dXJuIHF1ZXVlSW5wdXRCdWZmZXJJbnRlcm5hbChidWZmZXIpOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OmZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlKCkgeworICAgIFF1ZXVlR3VhcmQgZ3VhcmQobVN5bmMpOworICAgIGlmICghZ3VhcmQuaXNSdW5uaW5nKCkpIHsKKyAgICAgICAgQUxPR1YoIlslc10gV2UncmUgbm90IHJ1bm5pbmcgLS0tIG5vIGlucHV0IGJ1ZmZlciByZXBvcnRlZCIsIG1OYW1lKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZUludGVybmFsKCk7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6ZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGVJbnRlcm5hbCgpIHsKKyAgICBpZiAobUlucHV0TWV0RW9zIHx8CisgICAgICAgICAgIG1SZW9yZGVyU3Rhc2gubG9jaygpLT5oYXNQZW5kaW5nKCkgfHwKKyAgICAgICAgICAgbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPnBpcGVsaW5lRnVsbCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgICBNdXRleGVkPE91dHB1dD46OkxvY2tlZCBvdXRwdXQobU91dHB1dCk7CisgICAgICAgIGlmIChvdXRwdXQtPmJ1ZmZlcnMtPm51bUNsaWVudEJ1ZmZlcnMoKSA+PSBvdXRwdXQtPm51bVNsb3RzKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgc2l6ZV90IG51bUlucHV0U2xvdHMgPSBtSW5wdXQubG9jaygpLT5udW1TbG90czsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUlucHV0U2xvdHM7ICsraSkgeworICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBpbkJ1ZmZlcjsKKyAgICAgICAgc2l6ZV90IGluZGV4OworICAgICAgICB7CisgICAgICAgICAgICBNdXRleGVkPElucHV0Pjo6TG9ja2VkIGlucHV0KG1JbnB1dCk7CisgICAgICAgICAgICBpZiAoaW5wdXQtPmJ1ZmZlcnMtPm51bUNsaWVudEJ1ZmZlcnMoKSA+PSBpbnB1dC0+bnVtU2xvdHMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWlucHV0LT5idWZmZXJzLT5yZXF1ZXN0TmV3QnVmZmVyKCZpbmRleCwgJmluQnVmZmVyKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIG5vIG5ldyBidWZmZXIgYXZhaWxhYmxlIiwgbU5hbWUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dWKCJbJXNdIG5ldyBpbnB1dCBpbmRleCA9ICV6dSBbJXBdIiwgbU5hbWUsIGluZGV4LCBpbkJ1ZmZlci5nZXQoKSk7CisgICAgICAgIG1DYWxsYmFjay0+b25JbnB1dEJ1ZmZlckF2YWlsYWJsZShpbmRleCwgaW5CdWZmZXIpOworICAgIH0KK30KKworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6cmVuZGVyT3V0cHV0QnVmZmVyKAorICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLCBpbnQ2NF90IHRpbWVzdGFtcE5zKSB7CisgICAgQUxPR1YoIlslc10gcmVuZGVyT3V0cHV0QnVmZmVyOiAlcCIsIG1OYW1lLCBidWZmZXIuZ2V0KCkpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYzJCdWZmZXI7CisgICAgYm9vbCByZWxlYXNlZCA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxPdXRwdXQ+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXQpOworICAgICAgICBpZiAob3V0cHV0LT5idWZmZXJzKSB7CisgICAgICAgICAgICByZWxlYXNlZCA9IG91dHB1dC0+YnVmZmVycy0+cmVsZWFzZUJ1ZmZlcihidWZmZXIsICZjMkJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gTk9URTogc29tZSBhcHBzIHRyeSB0byByZWxlYXNlT3V0cHV0QnVmZmVyKCkgd2l0aCB0aW1lc3RhbXAgYW5kL29yIHJlbmRlcgorICAgIC8vICAgICAgIHNldCB0byB0cnVlLgorICAgIHNlbmRPdXRwdXRCdWZmZXJzKCk7CisgICAgLy8gaW5wdXQgYnVmZmVyIGZlZWRpbmcgbWF5IGhhdmUgYmVlbiBnYXRlZCBieSBwZW5kaW5nIG91dHB1dCBidWZmZXJzCisgICAgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGUoKTsKKyAgICBpZiAoIWMyQnVmZmVyKSB7CisgICAgICAgIGlmIChyZWxlYXNlZCkgeworICAgICAgICAgICAgc3RkOjpjYWxsX29uY2UobVJlbmRlcldhcm5pbmdGbGFnLCBbdGhpc10geworICAgICAgICAgICAgICAgIEFMT0dXKCJbJXNdIFRoZSBhcHAgaXMgY2FsbGluZyByZWxlYXNlT3V0cHV0QnVmZmVyKCkgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgInRpbWVzdGFtcCBvciByZW5kZXI9dHJ1ZSB3aXRoIG5vbi12aWRlbyBidWZmZXJzLiBBcHBzIHNob3VsZCAiCisgICAgICAgICAgICAgICAgICAgICAgImNhbGwgcmVsZWFzZU91dHB1dEJ1ZmZlcigpIHdpdGggcmVuZGVyPWZhbHNlIGZvciB0aG9zZS4iLAorICAgICAgICAgICAgICAgICAgICAgIG1OYW1lKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyNpZiAwCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+IGluZm9QYXJhbXMgPSBjMkJ1ZmZlci0+aW5mbygpOworICAgIEFMT0dWKCJbJXNdIHF1ZXVpbmcgZ2Z4IGJ1ZmZlciB3aXRoICV6dSBpbmZvcyIsIG1OYW1lLCBpbmZvUGFyYW1zLnNpemUoKSk7CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPiAmaW5mbyA6IGluZm9QYXJhbXMpIHsKKyAgICAgICAgQVN0cmluZyByZXM7CisgICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggKyAzIDwgaW5mby0+c2l6ZSgpOyBpeCArPSA0KSB7CisgICAgICAgICAgICBpZiAoaXgpIHJlcy5hcHBlbmQoIiwgIik7CisgICAgICAgICAgICByZXMuYXBwZW5kKCooKGludDMyX3QqKWluZm8uZ2V0KCkgKyAoaXggLyA0KSkpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCIgIFslc10iLCByZXMuY19zdHIoKSk7CisgICAgfQorI2VuZGlmCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyU3RyZWFtUm90YXRpb25JbmZvOjpvdXRwdXQ+IHJvdGF0aW9uID0KKyAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PGNvbnN0IEMyU3RyZWFtUm90YXRpb25JbmZvOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgIGMyQnVmZmVyLT5nZXRJbmZvKEMyU3RyZWFtUm90YXRpb25JbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpKTsKKyAgICBib29sIGZsaXAgPSByb3RhdGlvbiAmJiAocm90YXRpb24tPmZsaXAgJiAxKTsKKyAgICB1aW50MzJfdCBxdWFydGVycyA9ICgocm90YXRpb24gPyByb3RhdGlvbi0+dmFsdWUgOiAwKSAvIDkwKSAmIDM7CisgICAgdWludDMyX3QgdHJhbnNmb3JtID0gMDsKKyAgICBzd2l0Y2ggKHF1YXJ0ZXJzKSB7CisgICAgICAgIGNhc2UgMDogLy8gbm8gcm90YXRpb24KKyAgICAgICAgICAgIHRyYW5zZm9ybSA9IGZsaXAgPyBIQUxfVFJBTlNGT1JNX0ZMSVBfSCA6IDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOiAvLyA5MCBkZWdyZWVzIGNvdW50ZXItY2xvY2t3aXNlCisgICAgICAgICAgICB0cmFuc2Zvcm0gPSBmbGlwID8gKEhBTF9UUkFOU0ZPUk1fRkxJUF9WIHwgSEFMX1RSQU5TRk9STV9ST1RfOTApCisgICAgICAgICAgICAgICAgICAgIDogSEFMX1RSQU5TRk9STV9ST1RfMjcwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjogLy8gMTgwIGRlZ3JlZXMKKyAgICAgICAgICAgIHRyYW5zZm9ybSA9IGZsaXAgPyBIQUxfVFJBTlNGT1JNX0ZMSVBfViA6IEhBTF9UUkFOU0ZPUk1fUk9UXzE4MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6IC8vIDkwIGRlZ3JlZXMgY2xvY2t3aXNlCisgICAgICAgICAgICB0cmFuc2Zvcm0gPSBmbGlwID8gKEhBTF9UUkFOU0ZPUk1fRkxJUF9IIHwgSEFMX1RSQU5TRk9STV9ST1RfOTApCisgICAgICAgICAgICAgICAgICAgIDogSEFMX1RSQU5TRk9STV9ST1RfOTA7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJTdHJlYW1TdXJmYWNlU2NhbGluZ0luZm86Om91dHB1dD4gc3VyZmFjZVNjYWxpbmcgPQorICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Y29uc3QgQzJTdHJlYW1TdXJmYWNlU2NhbGluZ0luZm86Om91dHB1dD4oCisgICAgICAgICAgICAgICAgYzJCdWZmZXItPmdldEluZm8oQzJTdHJlYW1TdXJmYWNlU2NhbGluZ0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSkpOworICAgIHVpbnQzMl90IHZpZGVvU2NhbGluZ01vZGUgPSBOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19XSU5ET1c7CisgICAgaWYgKHN1cmZhY2VTY2FsaW5nKSB7CisgICAgICAgIHZpZGVvU2NhbGluZ01vZGUgPSBzdXJmYWNlU2NhbGluZy0+dmFsdWU7CisgICAgfQorCisgICAgLy8gVXNlIGRhdGFzcGFjZSBmcm9tIGZvcm1hdCBhcyBpdCBoYXMgdGhlIGRlZmF1bHQgYXNwZWN0cyBhbHJlYWR5IGFwcGxpZWQKKyAgICBhbmRyb2lkX2RhdGFzcGFjZV90IGRhdGFTcGFjZSA9IEhBTF9EQVRBU1BBQ0VfVU5LTk9XTjsgLy8gdGhpcyBpcyAwCisgICAgKHZvaWQpYnVmZmVyLT5mb3JtYXQoKS0+ZmluZEludDMyKCJhbmRyb2lkLl9kYXRhc3BhY2UiLCAoaW50MzJfdCAqKSZkYXRhU3BhY2UpOworCisgICAgLy8gSERSIHN0YXRpYyBpbmZvCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0PiBoZHJTdGF0aWNJbmZvID0KKyAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PGNvbnN0IEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICBjMkJ1ZmZlci0+Z2V0SW5mbyhDMlN0cmVhbUhkclN0YXRpY0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSkpOworCisgICAgLy8gSERSMTAgcGx1cyBpbmZvCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0PiBoZHIxMFBsdXNJbmZvID0KKyAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PGNvbnN0IEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICBjMkJ1ZmZlci0+Z2V0SW5mbyhDMlN0cmVhbUhkcjEwUGx1c0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSkpOworCisgICAgeworICAgICAgICBNdXRleGVkPE91dHB1dFN1cmZhY2U+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXRTdXJmYWNlKTsKKyAgICAgICAgaWYgKG91dHB1dC0+c3VyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HSSgiWyVzXSBjYW5ub3QgcmVuZGVyIGJ1ZmZlciB3aXRob3V0IHN1cmZhY2UiLCBtTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiBibG9ja3MgPSBjMkJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKTsKKyAgICBpZiAoYmxvY2tzLnNpemUoKSAhPSAxdSkgeworICAgICAgICBBTE9HRCgiWyVzXSBleHBlY3RlZCAxIGdyYXBoaWMgYmxvY2ssIGJ1dCBnb3QgJXp1IiwgbU5hbWUsIGJsb2Nrcy5zaXplKCkpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayAmYmxvY2sgPSBibG9ja3MuZnJvbnQoKTsKKworICAgIC8vIFRPRE86IHJldmlzaXQgdGhpcyBhZnRlciBDMkZlbmNlIGltcGxlbWVudGF0aW9uLgorICAgIGFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgcWJpKAorICAgICAgICAgICAgdGltZXN0YW1wTnMsCisgICAgICAgICAgICBmYWxzZSwgLy8gZHJvcHBhYmxlCisgICAgICAgICAgICBkYXRhU3BhY2UsCisgICAgICAgICAgICBSZWN0KGJsb2Nrcy5mcm9udCgpLmNyb3AoKS5sZWZ0LAorICAgICAgICAgICAgICAgICBibG9ja3MuZnJvbnQoKS5jcm9wKCkudG9wLAorICAgICAgICAgICAgICAgICBibG9ja3MuZnJvbnQoKS5jcm9wKCkucmlnaHQoKSwKKyAgICAgICAgICAgICAgICAgYmxvY2tzLmZyb250KCkuY3JvcCgpLmJvdHRvbSgpKSwKKyAgICAgICAgICAgIHZpZGVvU2NhbGluZ01vZGUsCisgICAgICAgICAgICB0cmFuc2Zvcm0sCisgICAgICAgICAgICBGZW5jZTo6Tk9fRkVOQ0UsIDApOworICAgIGlmIChoZHJTdGF0aWNJbmZvIHx8IGhkcjEwUGx1c0luZm8pIHsKKyAgICAgICAgSGRyTWV0YWRhdGEgaGRyOworICAgICAgICBpZiAoaGRyU3RhdGljSW5mbykgeworICAgICAgICAgICAgc3RydWN0IGFuZHJvaWRfc21wdGUyMDg2X21ldGFkYXRhIHNtcHRlMjA4Nl9tZXRhID0geworICAgICAgICAgICAgICAgIC5kaXNwbGF5UHJpbWFyeVJlZCA9IHsKKyAgICAgICAgICAgICAgICAgICAgaGRyU3RhdGljSW5mby0+bWFzdGVyaW5nLnJlZC54LCBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcucmVkLnkKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIC5kaXNwbGF5UHJpbWFyeUdyZWVuID0geworICAgICAgICAgICAgICAgICAgICBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcuZ3JlZW4ueCwgaGRyU3RhdGljSW5mby0+bWFzdGVyaW5nLmdyZWVuLnkKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIC5kaXNwbGF5UHJpbWFyeUJsdWUgPSB7CisgICAgICAgICAgICAgICAgICAgIGhkclN0YXRpY0luZm8tPm1hc3RlcmluZy5ibHVlLngsIGhkclN0YXRpY0luZm8tPm1hc3RlcmluZy5ibHVlLnkKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIC53aGl0ZVBvaW50ID0geworICAgICAgICAgICAgICAgICAgICBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcud2hpdGUueCwgaGRyU3RhdGljSW5mby0+bWFzdGVyaW5nLndoaXRlLnkKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIC5tYXhMdW1pbmFuY2UgPSBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcubWF4THVtaW5hbmNlLAorICAgICAgICAgICAgICAgIC5taW5MdW1pbmFuY2UgPSBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcubWluTHVtaW5hbmNlLAorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgc3RydWN0IGFuZHJvaWRfY3RhODYxXzNfbWV0YWRhdGEgY3RhODYxX21ldGEgPSB7CisgICAgICAgICAgICAgICAgLm1heENvbnRlbnRMaWdodExldmVsID0gaGRyU3RhdGljSW5mby0+bWF4Q2xsLAorICAgICAgICAgICAgICAgIC5tYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsID0gaGRyU3RhdGljSW5mby0+bWF4RmFsbCwKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGhkci52YWxpZFR5cGVzID0gSGRyTWV0YWRhdGE6OlNNUFRFMjA4NiB8IEhkck1ldGFkYXRhOjpDVEE4NjFfMzsKKyAgICAgICAgICAgIGhkci5zbXB0ZTIwODYgPSBzbXB0ZTIwODZfbWV0YTsKKyAgICAgICAgICAgIGhkci5jdGE4NjEzID0gY3RhODYxX21ldGE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhkcjEwUGx1c0luZm8pIHsKKyAgICAgICAgICAgIGhkci52YWxpZFR5cGVzIHw9IEhkck1ldGFkYXRhOjpIRFIxMFBMVVM7CisgICAgICAgICAgICBoZHIuaGRyMTBwbHVzLmFzc2lnbigKKyAgICAgICAgICAgICAgICAgICAgaGRyMTBQbHVzSW5mby0+bS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgaGRyMTBQbHVzSW5mby0+bS52YWx1ZSArIGhkcjEwUGx1c0luZm8tPmZsZXhDb3VudCgpKTsKKyAgICAgICAgfQorICAgICAgICBxYmkuc2V0SGRyTWV0YWRhdGEoaGRyKTsKKyAgICB9CisgICAgLy8gd2UgZG9uJ3QgaGF2ZSBkaXJ0eSByZWdpb25zCisgICAgcWJpLnNldFN1cmZhY2VEYW1hZ2UoUmVnaW9uOjpJTlZBTElEX1JFR0lPTik7CisgICAgYW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgcWJvOworICAgIHN0YXR1c190IHJlc3VsdCA9IG1Db21wb25lbnQtPnF1ZXVlVG9PdXRwdXRTdXJmYWNlKGJsb2NrLCBxYmksICZxYm8pOworICAgIGlmIChyZXN1bHQgIT0gT0spIHsKKyAgICAgICAgQUxPR0koIlslc10gcXVldWVCdWZmZXIgZmFpbGVkOiAlZCIsIG1OYW1lLCByZXN1bHQpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICBBTE9HVigiWyVzXSBxdWV1ZSBidWZmZXIgc3VjY2Vzc2Z1bCIsIG1OYW1lKTsKKworICAgIGludDY0X3QgbWVkaWFUaW1lVXMgPSAwOworICAgICh2b2lkKWJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZtZWRpYVRpbWVVcyk7CisgICAgbUNDb2RlY0NhbGxiYWNrLT5vbk91dHB1dEZyYW1lc1JlbmRlcmVkKG1lZGlhVGltZVVzLCB0aW1lc3RhbXBOcyk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OmRpc2NhcmRCdWZmZXIoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcikgeworICAgIEFMT0dWKCJbJXNdIGRpc2NhcmRCdWZmZXI6ICVwIiwgbU5hbWUsIGJ1ZmZlci5nZXQoKSk7CisgICAgYm9vbCByZWxlYXNlZCA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxJbnB1dD46OkxvY2tlZCBpbnB1dChtSW5wdXQpOworICAgICAgICBpZiAoaW5wdXQtPmJ1ZmZlcnMgJiYgaW5wdXQtPmJ1ZmZlcnMtPnJlbGVhc2VCdWZmZXIoYnVmZmVyLCBudWxscHRyLCB0cnVlKSkgeworICAgICAgICAgICAgcmVsZWFzZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxPdXRwdXQ+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXQpOworICAgICAgICBpZiAob3V0cHV0LT5idWZmZXJzICYmIG91dHB1dC0+YnVmZmVycy0+cmVsZWFzZUJ1ZmZlcihidWZmZXIsIG51bGxwdHIpKSB7CisgICAgICAgICAgICByZWxlYXNlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHJlbGVhc2VkKSB7CisgICAgICAgIHNlbmRPdXRwdXRCdWZmZXJzKCk7CisgICAgICAgIGZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0QoIlslc10gTWVkaWFDb2RlYyBkaXNjYXJkZWQgYW4gdW5rbm93biBidWZmZXIiLCBtTmFtZSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpnZXRJbnB1dEJ1ZmZlckFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSB7CisgICAgYXJyYXktPmNsZWFyKCk7CisgICAgTXV0ZXhlZDxJbnB1dD46OkxvY2tlZCBpbnB1dChtSW5wdXQpOworCisgICAgaWYgKCFpbnB1dC0+YnVmZmVycy0+aXNBcnJheU1vZGUoKSkgeworICAgICAgICBpbnB1dC0+YnVmZmVycyA9IGlucHV0LT5idWZmZXJzLT50b0FycmF5TW9kZShpbnB1dC0+bnVtU2xvdHMpOworICAgIH0KKworICAgIGlucHV0LT5idWZmZXJzLT5nZXRBcnJheShhcnJheSk7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6Z2V0T3V0cHV0QnVmZmVyQXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpIHsKKyAgICBhcnJheS0+Y2xlYXIoKTsKKyAgICBNdXRleGVkPE91dHB1dD46OkxvY2tlZCBvdXRwdXQobU91dHB1dCk7CisKKyAgICBpZiAoIW91dHB1dC0+YnVmZmVycy0+aXNBcnJheU1vZGUoKSkgeworICAgICAgICBvdXRwdXQtPmJ1ZmZlcnMgPSBvdXRwdXQtPmJ1ZmZlcnMtPnRvQXJyYXlNb2RlKG91dHB1dC0+bnVtU2xvdHMpOworICAgIH0KKworICAgIG91dHB1dC0+YnVmZmVycy0+Z2V0QXJyYXkoYXJyYXkpOworfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpzdGFydCgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZpbnB1dEZvcm1hdCwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQpIHsKKyAgICBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjppbnB1dCBpU3RyZWFtRm9ybWF0KDB1KTsKKyAgICBDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQgb1N0cmVhbUZvcm1hdCgwdSk7CisgICAgQzJQb3J0UmVvcmRlckJ1ZmZlckRlcHRoVHVuaW5nOjpvdXRwdXQgcmVvcmRlckRlcHRoOworICAgIEMyUG9ydFJlb3JkZXJLZXlTZXR0aW5nOjpvdXRwdXQgcmVvcmRlcktleTsKKyAgICBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6aW5wdXQgaW5wdXREZWxheSgwKTsKKyAgICBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0IG91dHB1dERlbGF5KDApOworICAgIEMyQWN0dWFsUGlwZWxpbmVEZWxheVR1bmluZyBwaXBlbGluZURlbGF5KDApOworCisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUNvbXBvbmVudC0+cXVlcnkoCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJmlTdHJlYW1Gb3JtYXQsCisgICAgICAgICAgICAgICAgJm9TdHJlYW1Gb3JtYXQsCisgICAgICAgICAgICAgICAgJnJlb3JkZXJEZXB0aCwKKyAgICAgICAgICAgICAgICAmcmVvcmRlcktleSwKKyAgICAgICAgICAgICAgICAmaW5wdXREZWxheSwKKyAgICAgICAgICAgICAgICAmcGlwZWxpbmVEZWxheSwKKyAgICAgICAgICAgICAgICAmb3V0cHV0RGVsYXksCisgICAgICAgICAgICB9LAorICAgICAgICAgICAge30sCisgICAgICAgICAgICBDMl9ET05UX0JMT0NLLAorICAgICAgICAgICAgbnVsbHB0cik7CisgICAgaWYgKGVyciA9PSBDMl9CQURfSU5ERVgpIHsKKyAgICAgICAgaWYgKCFpU3RyZWFtRm9ybWF0IHx8ICFvU3RyZWFtRm9ybWF0KSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxSZW9yZGVyU3Rhc2g+OjpMb2NrZWQgcmVvcmRlcihtUmVvcmRlclN0YXNoKTsKKyAgICAgICAgcmVvcmRlci0+Y2xlYXIoKTsKKyAgICAgICAgaWYgKHJlb3JkZXJEZXB0aCkgeworICAgICAgICAgICAgcmVvcmRlci0+c2V0RGVwdGgocmVvcmRlckRlcHRoLnZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmVvcmRlcktleSkgeworICAgICAgICAgICAgcmVvcmRlci0+c2V0S2V5KHJlb3JkZXJLZXkudmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgdWludDMyX3QgaW5wdXREZWxheVZhbHVlID0gaW5wdXREZWxheSA/IGlucHV0RGVsYXkudmFsdWUgOiAwOworICAgIHVpbnQzMl90IHBpcGVsaW5lRGVsYXlWYWx1ZSA9IHBpcGVsaW5lRGVsYXkgPyBwaXBlbGluZURlbGF5LnZhbHVlIDogMDsKKyAgICB1aW50MzJfdCBvdXRwdXREZWxheVZhbHVlID0gb3V0cHV0RGVsYXkgPyBvdXRwdXREZWxheS52YWx1ZSA6IDA7CisKKyAgICBzaXplX3QgbnVtSW5wdXRTbG90cyA9IGlucHV0RGVsYXlWYWx1ZSArIHBpcGVsaW5lRGVsYXlWYWx1ZSArIGtTbW9vdGhuZXNzRmFjdG9yOworICAgIHNpemVfdCBudW1PdXRwdXRTbG90cyA9IG91dHB1dERlbGF5VmFsdWUgKyBrU21vb3RobmVzc0ZhY3RvcjsKKyAgICBtRGVsYXkgPSBpbnB1dERlbGF5VmFsdWUgKyBwaXBlbGluZURlbGF5VmFsdWUgKyBvdXRwdXREZWxheVZhbHVlOworCisgICAgLy8gVE9ETzogZ2V0IHRoaXMgZnJvbSBpbnB1dCBmb3JtYXQKKyAgICBib29sIHNlY3VyZSA9IG1Db21wb25lbnQtPmdldE5hbWUoKS5maW5kKCIuc2VjdXJlIikgIT0gc3RkOjpzdHJpbmc6Om5wb3M7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gYWxsb2NhdG9yU3RvcmUgPSBHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgICAgaW50IHBvb2xNYXNrID0gcHJvcGVydHlfZ2V0X2ludDMyKAorICAgICAgICAgICAgImRlYnVnLnN0YWdlZnJpZ2h0LmMyLXBvb2xtYXNrIiwKKyAgICAgICAgICAgIDEgPDwgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT04gfAorICAgICAgICAgICAgMSA8PCBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJVRkZFUlFVRVVFKTsKKworICAgIGlmIChpbnB1dEZvcm1hdCAhPSBudWxscHRyKSB7CisgICAgICAgIGJvb2wgZ3JhcGhpYyA9IChpU3RyZWFtRm9ybWF0LnZhbHVlID09IEMyQnVmZmVyRGF0YTo6R1JBUEhJQyk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcG9vbDsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhlZDxCbG9ja1Bvb2xzPjo6TG9ja2VkIHBvb2xzKG1CbG9ja1Bvb2xzKTsKKworICAgICAgICAgICAgLy8gc2V0IGRlZmF1bHQgYWxsb2NhdG9yIElELgorICAgICAgICAgICAgcG9vbHMtPmlucHV0QWxsb2NhdG9ySWQgPSAoZ3JhcGhpYykgPyBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkdSQUxMT0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT047CisKKyAgICAgICAgICAgIC8vIHF1ZXJ5IEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0IGZyb20gY29tcG9uZW50LiBJZiBhbiBhbGxvY2F0b3IgSUQgaXMgb2J0YWluZWQKKyAgICAgICAgICAgIC8vIGZyb20gY29tcG9uZW50LCBjcmVhdGUgdGhlIGlucHV0IGJsb2NrIHBvb2wgd2l0aCBnaXZlbiBJRC4gT3RoZXJ3aXNlLCB1c2UgZGVmYXVsdCBJRHMuCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtczsKKyAgICAgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KHsgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zKTsKKyAgICAgICAgICAgIGlmICgoZXJyICE9IEMyX09LICYmIGVyciAhPSBDMl9CQURfSU5ERVgpIHx8IHBhcmFtcy5zaXplKCkgIT0gMSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIFF1ZXJ5IGlucHV0IGFsbG9jYXRvcnMgcmV0dXJuZWQgJXp1IHBhcmFtcyA9PiAlcyAoJXUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBwYXJhbXMuc2l6ZSgpLCBhc1N0cmluZyhlcnIpLCBlcnIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gQzJfT0sgJiYgcGFyYW1zLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQgKmlucHV0QWxsb2NhdG9ycyA9CisgICAgICAgICAgICAgICAgICAgIEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0OjpGcm9tKHBhcmFtc1swXS5nZXQoKSk7CisgICAgICAgICAgICAgICAgaWYgKGlucHV0QWxsb2NhdG9ycyAmJiBpbnB1dEFsbG9jYXRvcnMtPmZsZXhDb3VudCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jYXRvcjsKKyAgICAgICAgICAgICAgICAgICAgLy8gdmVyaWZ5IGFsbG9jYXRvciBJRHMgYW5kIHJlc29sdmUgZGVmYXVsdCBhbGxvY2F0b3IKKyAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKGlucHV0QWxsb2NhdG9ycy0+bS52YWx1ZXNbMF0sICZhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb2NhdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb29scy0+aW5wdXRBbGxvY2F0b3JJZCA9IGFsbG9jYXRvci0+Z2V0SWQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIGNvbXBvbmVudCByZXF1ZXN0ZWQgaW52YWxpZCBpbnB1dCBhbGxvY2F0b3IgSUQgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgaW5wdXRBbGxvY2F0b3JzLT5tLnZhbHVlc1swXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IHVzZSBDMkNvbXBvbmVudCB3cmFwcGVyIHRvIGFzc29jaWF0ZSB0aGlzIHBvb2wgd2l0aCBvdXJzZWx2ZXMKKyAgICAgICAgICAgIGlmICgocG9vbE1hc2sgPj4gcG9vbHMtPmlucHV0QWxsb2NhdG9ySWQpICYgMSkgeworICAgICAgICAgICAgICAgIGVyciA9IENyZWF0ZUNvZGVjMkJsb2NrUG9vbChwb29scy0+aW5wdXRBbGxvY2F0b3JJZCwgbnVsbHB0ciwgJnBvb2wpOworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIENyZWF0ZWQgaW5wdXQgYmxvY2sgcG9vbCB3aXRoIGFsbG9jYXRvcklEICV1ID0+IHBvb2xJRCAlbGx1IC0gJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcG9vbHMtPmlucHV0QWxsb2NhdG9ySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKShwb29sID8gcG9vbC0+Z2V0TG9jYWxJZCgpIDogMTExMDAwMTExKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKGVyciksIGVycik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVyciA9IEMyX05PVF9GT1VORDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBpbnB1dFBvb2xJZCA9CisgICAgICAgICAgICAgICAgICAgIGdyYXBoaWMgPyBDMkJsb2NrUG9vbDo6QkFTSUNfR1JBUEhJQyA6IEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVI7CisgICAgICAgICAgICAgICAgZXJyID0gR2V0Q29kZWMyQmxvY2tQb29sKGlucHV0UG9vbElkLCBudWxscHRyLCAmcG9vbCk7CisgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gVXNpbmcgYmFzaWMgaW5wdXQgYmxvY2sgcG9vbCB3aXRoIHBvb2xJRCAlbGx1ID0+IGdvdCAlbGx1IC0gJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgKHVuc2lnbmVkIGxvbmcgbG9uZylpbnB1dFBvb2xJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpKHBvb2wgPyBwb29sLT5nZXRMb2NhbElkKCkgOiAxMTEwMDAxMTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcoZXJyKSwgZXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9vbHMtPmlucHV0UG9vbCA9IHBvb2w7CisgICAgICAgIH0KKworICAgICAgICBib29sIGZvcmNlQXJyYXlNb2RlID0gZmFsc2U7CisgICAgICAgIE11dGV4ZWQ8SW5wdXQ+OjpMb2NrZWQgaW5wdXQobUlucHV0KTsKKyAgICAgICAgaW5wdXQtPm51bVNsb3RzID0gbnVtSW5wdXRTbG90czsKKyAgICAgICAgaW5wdXQtPmV4dHJhQnVmZmVycy5mbHVzaCgpOworICAgICAgICBpbnB1dC0+bnVtRXh0cmFTbG90cyA9IDB1OworICAgICAgICBpZiAoZ3JhcGhpYykgeworICAgICAgICAgICAgaWYgKG1JbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICBpbnB1dC0+YnVmZmVycy5yZXNldChuZXcgRHVtbXlJbnB1dEJ1ZmZlcnMobU5hbWUpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobU1ldGFNb2RlID09IE1PREVfQU5XKSB7CisgICAgICAgICAgICAgICAgaW5wdXQtPmJ1ZmZlcnMucmVzZXQobmV3IEdyYXBoaWNNZXRhZGF0YUlucHV0QnVmZmVycyhtTmFtZSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnB1dC0+YnVmZmVycy5yZXNldChuZXcgR3JhcGhpY0lucHV0QnVmZmVycyhudW1JbnB1dFNsb3RzLCBtTmFtZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGhhc0NyeXB0b09yRGVzY3JhbWJsZXIoKSkgeworICAgICAgICAgICAgICAgIGludDMyX3QgY2FwYWNpdHkgPSBrTGluZWFyQnVmZmVyU2l6ZTsKKyAgICAgICAgICAgICAgICAodm9pZClpbnB1dEZvcm1hdC0+ZmluZEludDMyKEtFWV9NQVhfSU5QVVRfU0laRSwgJmNhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICBpZiAoKHNpemVfdCljYXBhY2l0eSA+IGtNYXhMaW5lYXJCdWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJjbGllbnQgcmVxdWVzdGVkICVkLCBjYXBwZWQgdG8gJXp1IiwgY2FwYWNpdHksIGtNYXhMaW5lYXJCdWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHkgPSBrTWF4TGluZWFyQnVmZmVyU2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1EZWFsZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBtRGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbihjYXBhY2l0eSwgTWVtb3J5RGVhbGVyOjpnZXRBbGxvY2F0aW9uQWxpZ25tZW50KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKG51bUlucHV0U2xvdHMgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5jcnlwdGVkTGluZWFySW5wdXRCdWZmZXJzIik7CisgICAgICAgICAgICAgICAgICAgIG1EZWNyeXB0RGVzdGluYXRpb24gPSBtRGVhbGVyLT5hbGxvY2F0ZSgoc2l6ZV90KWNhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1DcnlwdG8gIT0gbnVsbHB0ciAmJiBtSGVhcFNlcU51bSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbUhlYXBTZXFOdW0gPSBtQ3J5cHRvLT5zZXRIZWFwKG1EZWFsZXItPmdldE1lbW9yeUhlYXAoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUhlYXBTZXFOdW0gPSAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5wdXQtPmJ1ZmZlcnMucmVzZXQobmV3IEVuY3J5cHRlZExpbmVhcklucHV0QnVmZmVycygKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyZSwgbURlYWxlciwgbUNyeXB0bywgbUhlYXBTZXFOdW0sIChzaXplX3QpY2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICBudW1JbnB1dFNsb3RzLCBtTmFtZSkpOworICAgICAgICAgICAgICAgIGZvcmNlQXJyYXlNb2RlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5wdXQtPmJ1ZmZlcnMucmVzZXQobmV3IExpbmVhcklucHV0QnVmZmVycyhtTmFtZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlucHV0LT5idWZmZXJzLT5zZXRGb3JtYXQoaW5wdXRGb3JtYXQpOworCisgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIGlucHV0LT5idWZmZXJzLT5zZXRQb29sKHBvb2wpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmb3JjZUFycmF5TW9kZSkgeworICAgICAgICAgICAgaW5wdXQtPmJ1ZmZlcnMgPSBpbnB1dC0+YnVmZmVycy0+dG9BcnJheU1vZGUobnVtSW5wdXRTbG90cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3V0cHV0Rm9ybWF0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gb3V0cHV0U3VyZmFjZTsKKyAgICAgICAgdWludDMyX3Qgb3V0cHV0R2VuZXJhdGlvbjsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhlZDxPdXRwdXRTdXJmYWNlPjo6TG9ja2VkIG91dHB1dChtT3V0cHV0U3VyZmFjZSk7CisgICAgICAgICAgICBvdXRwdXQtPm1heERlcXVldWVCdWZmZXJzID0gbnVtT3V0cHV0U2xvdHMgKyByZW9yZGVyRGVwdGgudmFsdWUgKyBrUmVuZGVyaW5nRGVwdGg7CisgICAgICAgICAgICBvdXRwdXRTdXJmYWNlID0gb3V0cHV0LT5zdXJmYWNlID8KKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5zdXJmYWNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgOiBudWxscHRyOworICAgICAgICAgICAgaWYgKG91dHB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQtPnN1cmZhY2UtPnNldE1heERlcXVldWVkQnVmZmVyQ291bnQob3V0cHV0LT5tYXhEZXF1ZXVlQnVmZmVycyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBvdXRwdXRHZW5lcmF0aW9uID0gb3V0cHV0LT5nZW5lcmF0aW9uOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBncmFwaGljID0gKG9TdHJlYW1Gb3JtYXQudmFsdWUgPT0gQzJCdWZmZXJEYXRhOjpHUkFQSElDKTsKKyAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3Qgb3V0cHV0UG9vbElkXzsKKworICAgICAgICB7CisgICAgICAgICAgICBNdXRleGVkPEJsb2NrUG9vbHM+OjpMb2NrZWQgcG9vbHMobUJsb2NrUG9vbHMpOworCisgICAgICAgICAgICAvLyBzZXQgZGVmYXVsdCBhbGxvY2F0b3IgSUQuCisgICAgICAgICAgICBwb29scy0+b3V0cHV0QWxsb2NhdG9ySWQgPSAoZ3JhcGhpYykgPyBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkdSQUxMT0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6SU9OOworCisgICAgICAgICAgICAvLyBxdWVyeSBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjpvdXRwdXQgZnJvbSBjb21wb25lbnQsIG9yIHVzZSBkZWZhdWx0IGFsbG9jYXRvciBpZgorICAgICAgICAgICAgLy8gdW5zdWNjZXNzZnVsLgorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CisgICAgICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWVyeSh7IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMpOworICAgICAgICAgICAgaWYgKChlcnIgIT0gQzJfT0sgJiYgZXJyICE9IEMyX0JBRF9JTkRFWCkgfHwgcGFyYW1zLnNpemUoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gUXVlcnkgb3V0cHV0IGFsbG9jYXRvcnMgcmV0dXJuZWQgJXp1IHBhcmFtcyA9PiAlcyAoJXUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBwYXJhbXMuc2l6ZSgpLCBhc1N0cmluZyhlcnIpLCBlcnIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gQzJfT0sgJiYgcGFyYW1zLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6b3V0cHV0ICpvdXRwdXRBbGxvY2F0b3JzID0KKyAgICAgICAgICAgICAgICAgICAgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6b3V0cHV0OjpGcm9tKHBhcmFtc1swXS5nZXQoKSk7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dEFsbG9jYXRvcnMgJiYgb3V0cHV0QWxsb2NhdG9ycy0+ZmxleENvdW50KCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gYWxsb2NhdG9yOworICAgICAgICAgICAgICAgICAgICAvLyB2ZXJpZnkgYWxsb2NhdG9yIElEcyBhbmQgcmVzb2x2ZSBkZWZhdWx0IGFsbG9jYXRvcgorICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JTdG9yZS0+ZmV0Y2hBbGxvY2F0b3Iob3V0cHV0QWxsb2NhdG9ycy0+bS52YWx1ZXNbMF0sICZhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb2NhdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb29scy0+b3V0cHV0QWxsb2NhdG9ySWQgPSBhbGxvY2F0b3ItPmdldElkKCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBjb21wb25lbnQgcmVxdWVzdGVkIGludmFsaWQgb3V0cHV0IGFsbG9jYXRvciBJRCAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBvdXRwdXRBbGxvY2F0b3JzLT5tLnZhbHVlc1swXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHVzZSBidWZmZXJxdWV1ZSBpZiBvdXRwdXR0aW5nIHRvIGEgc3VyZmFjZS4KKyAgICAgICAgICAgIC8vIHF1ZXJ5IEMyUG9ydFN1cmZhY2VBbGxvY2F0b3JUdW5pbmc6Om91dHB1dCBmcm9tIGNvbXBvbmVudCwgb3IgdXNlIGRlZmF1bHQgYWxsb2NhdG9yCisgICAgICAgICAgICAvLyBpZiB1bnN1Y2Nlc3NmdWwuCisgICAgICAgICAgICBpZiAob3V0cHV0U3VyZmFjZSkgeworICAgICAgICAgICAgICAgIHBhcmFtcy5jbGVhcigpOworICAgICAgICAgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KHsgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IEMyUG9ydFN1cmZhY2VBbGxvY2F0b3JUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcyk7CisgICAgICAgICAgICAgICAgaWYgKChlcnIgIT0gQzJfT0sgJiYgZXJyICE9IEMyX0JBRF9JTkRFWCkgfHwgcGFyYW1zLnNpemUoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIFF1ZXJ5IG91dHB1dCBzdXJmYWNlIGFsbG9jYXRvciByZXR1cm5lZCAlenUgcGFyYW1zID0+ICVzICgldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBwYXJhbXMuc2l6ZSgpLCBhc1N0cmluZyhlcnIpLCBlcnIpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXJyID09IEMyX09LICYmIHBhcmFtcy5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBDMlBvcnRTdXJmYWNlQWxsb2NhdG9yVHVuaW5nOjpvdXRwdXQgKnN1cmZhY2VBbGxvY2F0b3IgPQorICAgICAgICAgICAgICAgICAgICAgICAgQzJQb3J0U3VyZmFjZUFsbG9jYXRvclR1bmluZzo6b3V0cHV0OjpGcm9tKHBhcmFtc1swXS5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdXJmYWNlQWxsb2NhdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jYXRvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZlcmlmeSBhbGxvY2F0b3IgSURzIGFuZCByZXNvbHZlIGRlZmF1bHQgYWxsb2NhdG9yCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JTdG9yZS0+ZmV0Y2hBbGxvY2F0b3Ioc3VyZmFjZUFsbG9jYXRvci0+dmFsdWUsICZhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsbG9jYXRvcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xzLT5vdXRwdXRBbGxvY2F0b3JJZCA9IGFsbG9jYXRvci0+Z2V0SWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gY29tcG9uZW50IHJlcXVlc3RlZCBpbnZhbGlkIHN1cmZhY2Ugb3V0cHV0IGFsbG9jYXRvciBJRCAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgc3VyZmFjZUFsbG9jYXRvci0+dmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocG9vbHMtPm91dHB1dEFsbG9jYXRvcklkID09IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6R1JBTExPQworICAgICAgICAgICAgICAgICAgICAgICAgJiYgZXJyICE9IEMyX09LCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoKHBvb2xNYXNrID4+IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUUpICYgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcG9vbHMtPm91dHB1dEFsbG9jYXRvcklkID0gQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCVUZGRVJRVUVVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgocG9vbE1hc2sgPj4gcG9vbHMtPm91dHB1dEFsbG9jYXRvcklkKSAmIDEpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5jcmVhdGVCbG9ja1Bvb2woCisgICAgICAgICAgICAgICAgICAgICAgICBwb29scy0+b3V0cHV0QWxsb2NhdG9ySWQsICZwb29scy0+b3V0cHV0UG9vbElkLCAmcG9vbHMtPm91dHB1dFBvb2xJbnRmKTsKKyAgICAgICAgICAgICAgICBBTE9HSSgiWyVzXSBDcmVhdGVkIG91dHB1dCBibG9jayBwb29sIHdpdGggYWxsb2NhdG9ySUQgJXUgPT4gcG9vbElEICVsbHUgLSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcG9vbHMtPm91dHB1dEFsbG9jYXRvcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylwb29scy0+b3V0cHV0UG9vbElkLAorICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcoZXJyKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVyciA9IEMyX05PVF9GT1VORDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAvLyB1c2UgYmFzaWMgcG9vbCBpbnN0ZWFkCisgICAgICAgICAgICAgICAgcG9vbHMtPm91dHB1dFBvb2xJZCA9CisgICAgICAgICAgICAgICAgICAgIGdyYXBoaWMgPyBDMkJsb2NrUG9vbDo6QkFTSUNfR1JBUEhJQyA6IEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENvbmZpZ3VyZSBvdXRwdXQgYmxvY2sgcG9vbCBJRCBhcyBwYXJhbWV0ZXIgQzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0IHRvCisgICAgICAgICAgICAvLyBjb21wb25lbnQuCisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0PiBwb29sSWRzVHVuaW5nID0KKyAgICAgICAgICAgICAgICAgICAgQzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSh7IHBvb2xzLT5vdXRwdXRQb29sSWQgfSk7CisKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgIGVyciA9IG1Db21wb25lbnQtPmNvbmZpZyh7IHBvb2xJZHNUdW5pbmcuZ2V0KCkgfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgQUxPR0QoIlslc10gQ29uZmlndXJlZCBvdXRwdXQgYmxvY2sgcG9vbCBpZHMgJWxsdSA9PiAlcyIsCisgICAgICAgICAgICAgICAgICAgIG1OYW1lLCAodW5zaWduZWQgbG9uZyBsb25nKXBvb2xJZHNUdW5pbmctPm0udmFsdWVzWzBdLCBhc1N0cmluZyhlcnIpKTsKKyAgICAgICAgICAgIG91dHB1dFBvb2xJZF8gPSBwb29scy0+b3V0cHV0UG9vbElkOworICAgICAgICB9CisKKyAgICAgICAgTXV0ZXhlZDxPdXRwdXQ+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXQpOworICAgICAgICBvdXRwdXQtPm51bVNsb3RzID0gbnVtT3V0cHV0U2xvdHM7CisgICAgICAgIGlmIChncmFwaGljKSB7CisgICAgICAgICAgICBpZiAob3V0cHV0U3VyZmFjZSkgeworICAgICAgICAgICAgICAgIG91dHB1dC0+YnVmZmVycy5yZXNldChuZXcgR3JhcGhpY091dHB1dEJ1ZmZlcnMobU5hbWUpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LT5idWZmZXJzLnJlc2V0KG5ldyBSYXdHcmFwaGljT3V0cHV0QnVmZmVycyhudW1PdXRwdXRTbG90cywgbU5hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dHB1dC0+YnVmZmVycy5yZXNldChuZXcgTGluZWFyT3V0cHV0QnVmZmVycyhtTmFtZSkpOworICAgICAgICB9CisgICAgICAgIG91dHB1dC0+YnVmZmVycy0+c2V0Rm9ybWF0KG91dHB1dEZvcm1hdC0+ZHVwKCkpOworCisKKyAgICAgICAgLy8gVHJ5IHRvIHNldCBvdXRwdXQgc3VyZmFjZSB0byBjcmVhdGVkIGJsb2NrIHBvb2wgaWYgZ2l2ZW4uCisgICAgICAgIGlmIChvdXRwdXRTdXJmYWNlKSB7CisgICAgICAgICAgICBtQ29tcG9uZW50LT5zZXRPdXRwdXRTdXJmYWNlKAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRQb29sSWRfLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRTdXJmYWNlLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRHZW5lcmF0aW9uKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvU3RyZWFtRm9ybWF0LnZhbHVlID09IEMyQnVmZmVyRGF0YTo6TElORUFSCisgICAgICAgICAgICAgICAgJiYgbUNvbXBvbmVudE5hbWUuZmluZCgiYzIucXRpLiIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICAvLyBXT1JLQVJPVU5EOiBpZiB3ZSdyZSB1c2luZyBlYXJseSBDU0Qgd29ya2Fyb3VuZCB3ZSBjb252ZXJ0IHRvCisgICAgICAgICAgICAvLyAgICAgICAgICAgICBhcnJheSBtb2RlLCB0byBhcHBlYXNlIGFwcHMgYXNzdW1pbmcgdGhlIG91dHB1dAorICAgICAgICAgICAgLy8gICAgICAgICAgICAgYnVmZmVycyB0byBiZSBvZiB0aGUgc2FtZSBzaXplLgorICAgICAgICAgICAgb3V0cHV0LT5idWZmZXJzID0gb3V0cHV0LT5idWZmZXJzLT50b0FycmF5TW9kZShudW1PdXRwdXRTbG90cyk7CisKKyAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50OworICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlOworICAgICAgICAgICAgaWYgKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKEtFWV9DSEFOTkVMX0NPVU5ULCAmY2hhbm5lbENvdW50KQorICAgICAgICAgICAgICAgICAgICAmJiBvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMihLRVlfU0FNUExFX1JBVEUsICZzYW1wbGVSYXRlKSkgeworICAgICAgICAgICAgICAgIGludDMyX3QgZGVsYXkgPSAwOworICAgICAgICAgICAgICAgIGludDMyX3QgcGFkZGluZyA9IDA7OworICAgICAgICAgICAgICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImVuY29kZXItZGVsYXkiLCAmZGVsYXkpKSB7CisgICAgICAgICAgICAgICAgICAgIGRlbGF5ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiZW5jb2Rlci1wYWRkaW5nIiwgJnBhZGRpbmcpKSB7CisgICAgICAgICAgICAgICAgICAgIHBhZGRpbmcgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZGVsYXkgfHwgcGFkZGluZykgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHdyaXRlIGFjY2VzcyB0byB0aGUgYnVmZmVycywgYW5kIHdlJ3JlIGFscmVhZHkgaW4KKyAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgbW9kZS4KKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5idWZmZXJzLT5pbml0U2tpcEN1dEJ1ZmZlcihkZWxheSwgcGFkZGluZywgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTZXQgdXAgcGlwZWxpbmUgY29udHJvbC4gVGhpcyBoYXMgdG8gYmUgZG9uZSBhZnRlciBtSW5wdXRCdWZmZXJzIGFuZAorICAgIC8vIG1PdXRwdXRCdWZmZXJzIGFyZSBpbml0aWFsaXplZCB0byBtYWtlIHN1cmUgdGhhdCBsaW5nZXJpbmcgY2FsbGJhY2tzCisgICAgLy8gYWJvdXQgYnVmZmVycyBmcm9tIHRoZSBwcmV2aW91cyBnZW5lcmF0aW9uIGRvIG5vdCBpbnRlcmZlcmUgd2l0aCB0aGUKKyAgICAvLyBuZXdseSBpbml0aWFsaXplZCBwaXBlbGluZSBjYXBhY2l0eS4KKworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxQaXBlbGluZVdhdGNoZXI+OjpMb2NrZWQgd2F0Y2hlcihtUGlwZWxpbmVXYXRjaGVyKTsKKyAgICAgICAgd2F0Y2hlci0+aW5wdXREZWxheShpbnB1dERlbGF5VmFsdWUpCisgICAgICAgICAgICAgICAgLnBpcGVsaW5lRGVsYXkocGlwZWxpbmVEZWxheVZhbHVlKQorICAgICAgICAgICAgICAgIC5vdXRwdXREZWxheShvdXRwdXREZWxheVZhbHVlKQorICAgICAgICAgICAgICAgIC5zbW9vdGhuZXNzRmFjdG9yKGtTbW9vdGhuZXNzRmFjdG9yKTsKKyAgICAgICAgd2F0Y2hlci0+Zmx1c2goKTsKKyAgICB9CisKKyAgICBtSW5wdXRNZXRFb3MgPSBmYWxzZTsKKyAgICBtU3luYy5zdGFydCgpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6cmVxdWVzdEluaXRpYWxJbnB1dEJ1ZmZlcnMoKSB7CisgICAgaWYgKG1JbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCBvU3RyZWFtRm9ybWF0KDB1KTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQ29tcG9uZW50LT5xdWVyeSh7ICZvU3RyZWFtRm9ybWF0IH0sIHt9LCBDMl9ET05UX0JMT0NLLCBudWxscHRyKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBzaXplX3QgbnVtSW5wdXRTbG90cyA9IG1JbnB1dC5sb2NrKCktPm51bVNsb3RzOworICAgIHN0ZDo6dmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiB0b0JlUXVldWVkOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtSW5wdXRTbG90czsgKytpKSB7CisgICAgICAgIHNpemVfdCBpbmRleDsKKyAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyOworICAgICAgICB7CisgICAgICAgICAgICBNdXRleGVkPElucHV0Pjo6TG9ja2VkIGlucHV0KG1JbnB1dCk7CisgICAgICAgICAgICBpZiAoIWlucHV0LT5idWZmZXJzLT5yZXF1ZXN0TmV3QnVmZmVyKCZpbmRleCwgJmJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJbJXNdIHN0YXJ0OiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5IGF0IGFsbCIsIG1OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBzdGFydDogY2Fubm90IGFsbG9jYXRlIG1lbW9yeSwgb25seSAlenUgYnVmZmVycyBhbGxvY2F0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgTXV0ZXhlZDxzdGQ6Omxpc3Q8c3A8QUJ1ZmZlcj4+Pjo6TG9ja2VkIGNvbmZpZ3MobUZsdXNoZWRDb25maWdzKTsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIGlucHV0IGJ1ZmZlciAlenUgYXZhaWxhYmxlIiwgbU5hbWUsIGluZGV4KTsKKyAgICAgICAgICAgIGJvb2wgcG9zdCA9IHRydWU7CisgICAgICAgICAgICBpZiAoIWNvbmZpZ3MtPmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiBjb25maWcgPSBjb25maWdzLT5mcm9udCgpOworICAgICAgICAgICAgICAgIGNvbmZpZ3MtPnBvcF9mcm9udCgpOworICAgICAgICAgICAgICAgIGlmIChidWZmZXItPmNhcGFjaXR5KCkgPj0gY29uZmlnLT5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGJ1ZmZlci0+YmFzZSgpLCBjb25maWctPmRhdGEoKSwgY29uZmlnLT5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICBidWZmZXItPnNldFJhbmdlKDAsIGNvbmZpZy0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhKCktPmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiY3NkIiwgMSk7CisgICAgICAgICAgICAgICAgICAgIHBvc3QgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBidWZmZXIgY2FwYWNpdHkgdG9vIHNtYWxsIGZvciB0aGUgY29uZmlnICglenUgPCAlenUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgYnVmZmVyLT5jYXBhY2l0eSgpLCBjb25maWctPnNpemUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmIChvU3RyZWFtRm9ybWF0LnZhbHVlID09IEMyQnVmZmVyRGF0YTo6TElORUFSICYmIGkgPT0gMAorICAgICAgICAgICAgICAgICAgICAmJiBtQ29tcG9uZW50TmFtZS5maW5kKCJjMi5xdGkuIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgICAgICAvLyBXT1JLQVJPVU5EOiBTb21lIGFwcHMgZXhwZWN0IENTRCBhdmFpbGFibGUgd2l0aG91dCBxdWV1ZWluZworICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGFueSBpbnB1dC4gUXVldWUgYW4gZW1wdHkgYnVmZmVyIHRvIGdldCB0aGUgQ1NELgorICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhKCktPmNsZWFyKCk7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKKyAgICAgICAgICAgICAgICBwb3N0ID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocG9zdCkgeworICAgICAgICAgICAgICAgIG1DYWxsYmFjay0+b25JbnB1dEJ1ZmZlckF2YWlsYWJsZShpbmRleCwgYnVmZmVyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdG9CZVF1ZXVlZC5lbXBsYWNlX2JhY2soYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIgOiB0b0JlUXVldWVkKSB7CisgICAgICAgIGlmIChxdWV1ZUlucHV0QnVmZmVySW50ZXJuYWwoYnVmZmVyKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR1YoIlslc10gRXJyb3Igd2hpbGUgcXVldWVpbmcgaW5pdGlhbCBidWZmZXJzIiwgbU5hbWUpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpzdG9wKCkgeworICAgIG1TeW5jLnN0b3AoKTsKKyAgICBtRmlyc3RWYWxpZEZyYW1lSW5kZXggPSBtRnJhbWVJbmRleC5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIGlmIChtSW5wdXRTdXJmYWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUlucHV0U3VyZmFjZS5yZXNldCgpOworICAgIH0KK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpmbHVzaChjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZmbHVzaGVkV29yaykgeworICAgIEFMT0dWKCJbJXNdIGZsdXNoIiwgbU5hbWUpOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxzdGQ6Omxpc3Q8c3A8QUJ1ZmZlcj4+Pjo6TG9ja2VkIGNvbmZpZ3MobUZsdXNoZWRDb25maWdzKTsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBpZiAoISh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkKKyAgICAgICAgICAgICAgICAgICAgfHwgd29yay0+aW5wdXQuYnVmZmVycy5mcm9udCgpLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIG5vIGxpbmVhciBjb2RlYyBjb25maWcgZGF0YSBmb3VuZCIsIG1OYW1lKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEMyUmVhZFZpZXcgdmlldyA9CisgICAgICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuZnJvbnQoKS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgICAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gZmFpbGVkIHRvIG1hcCBmbHVzaGVkIGNvZGVjIGNvbmZpZyBkYXRhOiAlZCIsIG1OYW1lLCB2aWV3LmVycm9yKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uZmlncy0+cHVzaF9iYWNrKEFCdWZmZXI6OkNyZWF0ZUFzQ29weSh2aWV3LmRhdGEoKSwgdmlldy5jYXBhY2l0eSgpKSk7CisgICAgICAgICAgICBBTE9HVigiWyVzXSBzdGFzaGVkIGZsdXNoZWQgY29kZWMgY29uZmlnIGRhdGEgKHNpemU9JXUpIiwgbU5hbWUsIHZpZXcuY2FwYWNpdHkoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPElucHV0Pjo6TG9ja2VkIGlucHV0KG1JbnB1dCk7CisgICAgICAgIGlucHV0LT5idWZmZXJzLT5mbHVzaCgpOworICAgICAgICBpbnB1dC0+ZXh0cmFCdWZmZXJzLmZsdXNoKCk7CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxPdXRwdXQ+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXQpOworICAgICAgICBvdXRwdXQtPmJ1ZmZlcnMtPmZsdXNoKGZsdXNoZWRXb3JrKTsKKyAgICB9CisgICAgbVJlb3JkZXJTdGFzaC5sb2NrKCktPmZsdXNoKCk7CisgICAgbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPmZsdXNoKCk7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6b25Xb3JrRG9uZSgKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yaywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQsCisgICAgICAgIGNvbnN0IEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQgKmluaXREYXRhKSB7CisgICAgaWYgKGhhbmRsZVdvcmsoc3RkOjptb3ZlKHdvcmspLCBvdXRwdXRGb3JtYXQsIGluaXREYXRhKSkgeworICAgICAgICBmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZSgpOworICAgIH0KK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpvbklucHV0QnVmZmVyRG9uZSgKKyAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCwgc2l6ZV90IGFycmF5SW5kZXgpIHsKKyAgICBpZiAobUlucHV0U3VyZmFjZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0KKyAgICAgICAgICAgIG1QaXBlbGluZVdhdGNoZXIubG9jaygpLT5vbklucHV0QnVmZmVyUmVsZWFzZWQoZnJhbWVJbmRleCwgYXJyYXlJbmRleCk7CisgICAgYm9vbCBuZXdJbnB1dFNsb3RBdmFpbGFibGU7CisgICAgeworICAgICAgICBNdXRleGVkPElucHV0Pjo6TG9ja2VkIGlucHV0KG1JbnB1dCk7CisgICAgICAgIG5ld0lucHV0U2xvdEF2YWlsYWJsZSA9IGlucHV0LT5idWZmZXJzLT5leHBpcmVDb21wb25lbnRCdWZmZXIoYnVmZmVyKTsKKyAgICAgICAgaWYgKCFuZXdJbnB1dFNsb3RBdmFpbGFibGUpIHsKKyAgICAgICAgICAgICh2b2lkKWlucHV0LT5leHRyYUJ1ZmZlcnMuZXhwaXJlQ29tcG9uZW50QnVmZmVyKGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG5ld0lucHV0U2xvdEF2YWlsYWJsZSkgeworICAgICAgICBmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZSgpOworICAgIH0KK30KKworYm9vbCBDQ29kZWNCdWZmZXJDaGFubmVsOjpoYW5kbGVXb3JrKAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrLAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCwKKyAgICAgICAgY29uc3QgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dCAqaW5pdERhdGEpIHsKKyAgICBpZiAoKHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCAtIG1GaXJzdFZhbGlkRnJhbWVJbmRleC5sb2FkKCkpLnBlZWsoKSA8IDApIHsKKyAgICAgICAgLy8gRGlzY2FyZCBmcmFtZXMgZnJvbSBwcmV2aW91cyBnZW5lcmF0aW9uLgorICAgICAgICBBTE9HRCgiWyVzXSBEaXNjYXJkIGZyYW1lcyBmcm9tIHByZXZpb3VzIGdlbmVyYXRpb24uIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1JbnB1dFN1cmZhY2UgPT0gbnVsbHB0ciAmJiAod29yay0+d29ya2xldHMuc2l6ZSgpICE9IDF1CisgICAgICAgICAgICB8fCAhd29yay0+d29ya2xldHMuZnJvbnQoKQorICAgICAgICAgICAgfHwgISh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19JTkNPTVBMRVRFKSkpIHsKKyAgICAgICAgbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPm9uV29ya0RvbmUod29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworICAgIH0KKworICAgIGlmICh3b3JrLT5yZXN1bHQgPT0gQzJfTk9UX0ZPVU5EKSB7CisgICAgICAgIEFMT0dEKCJbJXNdIGZsdXNoZWQgd29yazsgaWdub3JlZC4iLCBtTmFtZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmICh3b3JrLT5yZXN1bHQgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoIlslc10gd29yayBmYWlsZWQgdG8gY29tcGxldGU6ICVkIiwgbU5hbWUsIHdvcmstPnJlc3VsdCk7CisgICAgICAgIG1DQ29kZWNDYWxsYmFjay0+b25FcnJvcih3b3JrLT5yZXN1bHQsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIE5PVEU6IE1lZGlhQ29kZWMgdXNhZ2Ugc3VwcG9zZWRseSBoYXZlIG9ubHkgb25lIHdvcmtsZXQKKyAgICBpZiAod29yay0+d29ya2xldHMuc2l6ZSgpICE9IDF1KSB7CisgICAgICAgIEFMT0dJKCJbJXNdIG9uV29ya0RvbmU6IGluY29ycmVjdCBudW1iZXIgb2Ygd29ya2xldHM6ICV6dSIsCisgICAgICAgICAgICAgICAgbU5hbWUsIHdvcmstPndvcmtsZXRzLnNpemUoKSk7CisgICAgICAgIG1DQ29kZWNDYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrbGV0PiAmd29ya2xldCA9IHdvcmstPndvcmtsZXRzLmZyb250KCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlcjsKKyAgICAvLyBOT1RFOiBNZWRpYUNvZGVjIHVzYWdlIHN1cHBvc2VkbHkgaGF2ZSBvbmx5IG9uZSBvdXRwdXQgc3RyZWFtLgorICAgIGlmICh3b3JrbGV0LT5vdXRwdXQuYnVmZmVycy5zaXplKCkgPiAxdSkgeworICAgICAgICBBTE9HSSgiWyVzXSBvbldvcmtEb25lOiBpbmNvcnJlY3QgbnVtYmVyIG9mIG91dHB1dCBidWZmZXJzOiAlenUiLAorICAgICAgICAgICAgICAgIG1OYW1lLCB3b3JrbGV0LT5vdXRwdXQuYnVmZmVycy5zaXplKCkpOworICAgICAgICBtQ0NvZGVjQ2FsbGJhY2stPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIGlmICh3b3JrbGV0LT5vdXRwdXQuYnVmZmVycy5zaXplKCkgPT0gMXUpIHsKKyAgICAgICAgYnVmZmVyID0gd29ya2xldC0+b3V0cHV0LmJ1ZmZlcnNbMF07CisgICAgICAgIGlmICghYnVmZmVyKSB7CisgICAgICAgICAgICBBTE9HRCgiWyVzXSBvbldvcmtEb25lOiBudWxscHRyIGZvdW5kIGluIGJ1ZmZlcnM7IGlnbm9yZWQuIiwgbU5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjpvcHRpb25hbDx1aW50MzJfdD4gbmV3SW5wdXREZWxheSwgbmV3UGlwZWxpbmVEZWxheTsKKyAgICB3aGlsZSAoIXdvcmtsZXQtPm91dHB1dC5jb25maWdVcGRhdGUuZW1wdHkoKSkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gcGFyYW07CisgICAgICAgIHdvcmtsZXQtPm91dHB1dC5jb25maWdVcGRhdGUuYmFjaygpLnN3YXAocGFyYW0pOworICAgICAgICB3b3JrbGV0LT5vdXRwdXQuY29uZmlnVXBkYXRlLnBvcF9iYWNrKCk7CisgICAgICAgIHN3aXRjaCAocGFyYW0tPmNvcmVJbmRleCgpLmNvcmVJbmRleCgpKSB7CisgICAgICAgICAgICBjYXNlIEMyUG9ydFJlb3JkZXJCdWZmZXJEZXB0aFR1bmluZzo6Q09SRV9JTkRFWDogeworICAgICAgICAgICAgICAgIEMyUG9ydFJlb3JkZXJCdWZmZXJEZXB0aFR1bmluZzo6b3V0cHV0IHJlb3JkZXJEZXB0aDsKKyAgICAgICAgICAgICAgICBpZiAocmVvcmRlckRlcHRoLnVwZGF0ZUZyb20oKnBhcmFtKSkgeworICAgICAgICAgICAgICAgICAgICBtUmVvcmRlclN0YXNoLmxvY2soKS0+c2V0RGVwdGgocmVvcmRlckRlcHRoLnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogdXBkYXRlZCByZW9yZGVyIGRlcHRoIHRvICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHJlb3JkZXJEZXB0aC52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1PdXRwdXRTbG90cyA9IG1PdXRwdXQubG9jaygpLT5udW1TbG90czsKKyAgICAgICAgICAgICAgICAgICAgTXV0ZXhlZDxPdXRwdXRTdXJmYWNlPjo6TG9ja2VkIG91dHB1dChtT3V0cHV0U3VyZmFjZSk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC0+bWF4RGVxdWV1ZUJ1ZmZlcnMgPQorICAgICAgICAgICAgICAgICAgICAgICAgbnVtT3V0cHV0U2xvdHMgKyByZW9yZGVyRGVwdGgudmFsdWUgKyBrUmVuZGVyaW5nRGVwdGg7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXQtPnN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC0+c3VyZmFjZS0+c2V0TWF4RGVxdWV1ZWRCdWZmZXJDb3VudChvdXRwdXQtPm1heERlcXVldWVCdWZmZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIG9uV29ya0RvbmU6IGZhaWxlZCB0byByZWFkIHJlb3JkZXIgZGVwdGgiLCBtTmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBDMlBvcnRSZW9yZGVyS2V5U2V0dGluZzo6Q09SRV9JTkRFWDogeworICAgICAgICAgICAgICAgIEMyUG9ydFJlb3JkZXJLZXlTZXR0aW5nOjpvdXRwdXQgcmVvcmRlcktleTsKKyAgICAgICAgICAgICAgICBpZiAocmVvcmRlcktleS51cGRhdGVGcm9tKCpwYXJhbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbVJlb3JkZXJTdGFzaC5sb2NrKCktPnNldEtleShyZW9yZGVyS2V5LnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogdXBkYXRlZCByZW9yZGVyIGtleSB0byAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCByZW9yZGVyS2V5LnZhbHVlKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBvbldvcmtEb25lOiBmYWlsZWQgdG8gcmVhZCByZW9yZGVyIGtleSIsIG1OYW1lKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjpDT1JFX0lOREVYOiB7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtLT5pc0dsb2JhbCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEMyQWN0dWFsUGlwZWxpbmVEZWxheVR1bmluZyBwaXBlbGluZURlbGF5OworICAgICAgICAgICAgICAgICAgICBpZiAocGlwZWxpbmVEZWxheS51cGRhdGVGcm9tKCpwYXJhbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IHVwZGF0aW5nIHBpcGVsaW5lIGRlbGF5ICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBwaXBlbGluZURlbGF5LnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BpcGVsaW5lRGVsYXkgPSBwaXBlbGluZURlbGF5LnZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPnBpcGVsaW5lRGVsYXkocGlwZWxpbmVEZWxheS52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtLT5mb3JJbnB1dCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjppbnB1dCBpbnB1dERlbGF5OworICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXREZWxheS51cGRhdGVGcm9tKCpwYXJhbSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IHVwZGF0aW5nIGlucHV0IGRlbGF5ICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBpbnB1dERlbGF5LnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0lucHV0RGVsYXkgPSBpbnB1dERlbGF5LnZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPmlucHV0RGVsYXkoaW5wdXREZWxheS52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtLT5mb3JPdXRwdXQoKSkgeworICAgICAgICAgICAgICAgICAgICBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0IG91dHB1dERlbGF5OworICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVsYXkudXBkYXRlRnJvbSgqcGFyYW0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiB1cGRhdGluZyBvdXRwdXQgZGVsYXkgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIG91dHB1dERlbGF5LnZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKW1QaXBlbGluZVdhdGNoZXIubG9jaygpLT5vdXRwdXREZWxheShvdXRwdXREZWxheS52YWx1ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3V0cHV0QnVmZmVyc0NoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE11dGV4ZWQ8T3V0cHV0Pjo6TG9ja2VkIG91dHB1dChtT3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC0+b3V0cHV0RGVsYXkgPSBvdXRwdXREZWxheS52YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1PdXRwdXRTbG90cyA9IG91dHB1dERlbGF5LnZhbHVlICsga1Ntb290aG5lc3NGYWN0b3I7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0LT5udW1TbG90cyA8IG51bU91dHB1dFNsb3RzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5udW1TbG90cyA9IG51bU91dHB1dFNsb3RzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXQtPmJ1ZmZlcnMtPmlzQXJyYXlNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0QnVmZmVyc0FycmF5ICphcnJheSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT3V0cHV0QnVmZmVyc0FycmF5ICopb3V0cHV0LT5idWZmZXJzLmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiBncm93aW5nIG91dHB1dCBidWZmZXIgYXJyYXkgdG8gJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIG51bU91dHB1dFNsb3RzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXktPmdyb3cobnVtT3V0cHV0U2xvdHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJzQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnVubG9jaygpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0QnVmZmVyc0NoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ0NvZGVjQ2FsbGJhY2stPm9uT3V0cHV0QnVmZmVyc0NoYW5nZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogdW5yZWNvZ25pemVkIGNvbmZpZyB1cGRhdGUgKCUwOFgpIiwKKyAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcGFyYW0tPmluZGV4KCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChuZXdJbnB1dERlbGF5IHx8IG5ld1BpcGVsaW5lRGVsYXkpIHsKKyAgICAgICAgTXV0ZXhlZDxJbnB1dD46OkxvY2tlZCBpbnB1dChtSW5wdXQpOworICAgICAgICBzaXplX3QgbmV3TnVtU2xvdHMgPQorICAgICAgICAgICAgbmV3SW5wdXREZWxheS52YWx1ZV9vcihpbnB1dC0+aW5wdXREZWxheSkgKworICAgICAgICAgICAgbmV3UGlwZWxpbmVEZWxheS52YWx1ZV9vcihpbnB1dC0+cGlwZWxpbmVEZWxheSkgKworICAgICAgICAgICAga1Ntb290aG5lc3NGYWN0b3I7CisgICAgICAgIGlmIChpbnB1dC0+YnVmZmVycy0+aXNBcnJheU1vZGUoKSkgeworICAgICAgICAgICAgaWYgKGlucHV0LT5udW1TbG90cyA+PSBuZXdOdW1TbG90cykgeworICAgICAgICAgICAgICAgIGlucHV0LT5udW1FeHRyYVNsb3RzID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5wdXQtPm51bUV4dHJhU2xvdHMgPSBuZXdOdW1TbG90cyAtIGlucHV0LT5udW1TbG90czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IHVwZGF0ZWQgbnVtYmVyIG9mIGV4dHJhIHNsb3RzIHRvICV6dSAoaW5wdXQgYXJyYXkgbW9kZSkiLAorICAgICAgICAgICAgICAgICAgbU5hbWUsIGlucHV0LT5udW1FeHRyYVNsb3RzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlucHV0LT5udW1TbG90cyA9IG5ld051bVNsb3RzOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG91dHB1dEZvcm1hdCAhPSBudWxscHRyKSB7CisgICAgICAgIE11dGV4ZWQ8T3V0cHV0Pjo6TG9ja2VkIG91dHB1dChtT3V0cHV0KTsKKyAgICAgICAgQUxPR0QoIlslc10gb25Xb3JrRG9uZTogb3V0cHV0IGZvcm1hdCBjaGFuZ2VkIHRvICVzIiwKKyAgICAgICAgICAgICAgICBtTmFtZSwgb3V0cHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICBvdXRwdXQtPmJ1ZmZlcnMtPnNldEZvcm1hdChvdXRwdXRGb3JtYXQpOworCisgICAgICAgIEFTdHJpbmcgbWVkaWFUeXBlOworICAgICAgICBpZiAob3V0cHV0Rm9ybWF0LT5maW5kU3RyaW5nKEtFWV9NSU1FLCAmbWVkaWFUeXBlKQorICAgICAgICAgICAgICAgICYmIG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9BVURJT19SQVcpIHsKKyAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50OworICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlOworICAgICAgICAgICAgaWYgKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKEtFWV9DSEFOTkVMX0NPVU5ULCAmY2hhbm5lbENvdW50KQorICAgICAgICAgICAgICAgICAgICAmJiBvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMihLRVlfU0FNUExFX1JBVEUsICZzYW1wbGVSYXRlKSkgeworICAgICAgICAgICAgICAgIG91dHB1dC0+YnVmZmVycy0+dXBkYXRlU2tpcEN1dEJ1ZmZlcihzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmtsZXQtPm91dHB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZmxhZ3MgfD0gTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TOworICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiBvdXRwdXQgRU9TIiwgbU5hbWUpOworICAgIH0KKworICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IG91dEJ1ZmZlcjsKKyAgICBzaXplX3QgaW5kZXg7CisKKyAgICAvLyBXT1JLQVJPVU5EOiBhZGp1c3Qgb3V0cHV0IHRpbWVzdGFtcCBiYXNlZCBvbiBjbGllbnQgaW5wdXQgdGltZXN0YW1wIGFuZCBjb2RlYworICAgIC8vIGlucHV0IHRpbWVzdGFtcC4gQ29kZWMgb3V0cHV0IHRpbWVzdGFtcCAoaW4gdGhlIHRpbWVzdGFtcCBmaWVsZCkgc2hhbGwgY29ycmVzcG9uZCB0bworICAgIC8vIHRoZSBjb2RlYyBpbnB1dCB0aW1lc3RhbXAsIGJ1dCBjbGllbnQgb3V0cHV0IHRpbWVzdGFtcCBzaG91bGQgKHJlcG9ydGVkIGluIHRpbWVVcykKKyAgICAvLyBzaGFsbCBjb3JyZXNwb25kIHRvIHRoZSBjbGllbnQgaW5wdXQgdGltZXNhbXAgKGluIGN1c3RvbU9yZGluYWwpLiBCeSB1c2luZyB0aGUKKyAgICAvLyBkZWx0YSBiZXR3ZWVuIHRoZSB0d28sIHRoaXMgYWxsb3dzIGZvciBzb21lIHRpbWVzdGFtcCBkZXZpYXRpb24gLSBlLmcuIGlmIG9uZSBpbnB1dAorICAgIC8vIHByb2R1Y2VzIG11bHRpcGxlIG91dHB1dC4KKyAgICBjMl9jbnRyNjRfdCB0aW1lc3RhbXAgPQorICAgICAgICB3b3JrbGV0LT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgKyB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWwKKyAgICAgICAgICAgICAgICAtIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wOworICAgIGlmIChtSW5wdXRTdXJmYWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gV2hlbiB1c2luZyBpbnB1dCBzdXJmYWNlIHdlIG5lZWQgdG8gcmVzdG9yZSB0aGUgb3JpZ2luYWwgaW5wdXQgdGltZXN0YW1wLgorICAgICAgICB0aW1lc3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWw7CisgICAgfQorICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IGlucHV0ICVsbGQsIGNvZGVjICVsbGQgPT4gb3V0cHV0ICVsbGQgPT4gJWxsZCIsCisgICAgICAgICAgbU5hbWUsCisgICAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5jdXN0b21PcmRpbmFsLnBlZWtsbCgpLAorICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWtsbCgpLAorICAgICAgICAgIHdvcmtsZXQtPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrbGwoKSwKKyAgICAgICAgICB0aW1lc3RhbXAucGVla2xsKCkpOworCisgICAgaWYgKGluaXREYXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgTXV0ZXhlZDxPdXRwdXQ+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXQpOworICAgICAgICBpZiAob3V0cHV0LT5idWZmZXJzLT5yZWdpc3RlckNzZChpbml0RGF0YSwgJmluZGV4LCAmb3V0QnVmZmVyKSA9PSBPSykgeworICAgICAgICAgICAgb3V0QnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lc3RhbXAucGVlaygpKTsKKyAgICAgICAgICAgIG91dEJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiZmxhZ3MiLCBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19DT0RFQ0NPTkZJRyk7CisgICAgICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiBjc2QgaW5kZXggPSAlenUgWyVwXSIsIG1OYW1lLCBpbmRleCwgb3V0QnVmZmVyLmdldCgpKTsKKworICAgICAgICAgICAgb3V0cHV0LnVubG9jaygpOworICAgICAgICAgICAgbUNhbGxiYWNrLT5vbk91dHB1dEJ1ZmZlckF2YWlsYWJsZShpbmRleCwgb3V0QnVmZmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dEKCJbJXNdIG9uV29ya0RvbmU6IHVuYWJsZSB0byByZWdpc3RlciBjc2QiLCBtTmFtZSk7CisgICAgICAgICAgICBvdXRwdXQudW5sb2NrKCk7CisgICAgICAgICAgICBtQ0NvZGVjQ2FsbGJhY2stPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFidWZmZXIgJiYgIWZsYWdzKSB7CisgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IE5vdCByZXBvcnRpbmcgb3V0cHV0IGJ1ZmZlciAoJWxsZCkiLAorICAgICAgICAgICAgICBtTmFtZSwgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1bGwoKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPiAmaW5mbyA6IGJ1ZmZlci0+aW5mbygpKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBwcm9wZXJseSB0cmFuc2xhdGUgdGhlc2UgdG8gbWV0YWRhdGEKKyAgICAgICAgICAgIHN3aXRjaCAoaW5mby0+Y29yZUluZGV4KCkuY29yZUluZGV4KCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEMyU3RyZWFtUGljdHVyZVR5cGVNYXNrSW5mbzo6Q09SRV9JTkRFWDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoQzJTdHJlYW1QaWN0dXJlVHlwZU1hc2tJbmZvICopaW5mby5nZXQoKSktPnZhbHVlICYgQzJDb25maWc6OlNZTkNfRlJBTUUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX1NZTkNGUkFNRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxSZW9yZGVyU3Rhc2g+OjpMb2NrZWQgcmVvcmRlcihtUmVvcmRlclN0YXNoKTsKKyAgICAgICAgcmVvcmRlci0+ZW1wbGFjZShidWZmZXIsIHRpbWVzdGFtcC5wZWVrKCksIGZsYWdzLCB3b3JrbGV0LT5vdXRwdXQub3JkaW5hbCk7CisgICAgICAgIGlmIChmbGFncyAmIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUykgeworICAgICAgICAgICAgLy8gRmx1c2ggcmVvcmRlciBzdGFzaAorICAgICAgICAgICAgcmVvcmRlci0+c2V0RGVwdGgoMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgc2VuZE91dHB1dEJ1ZmZlcnMoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpzZW5kT3V0cHV0QnVmZmVycygpIHsKKyAgICBSZW9yZGVyU3Rhc2g6OkVudHJ5IGVudHJ5OworICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IG91dEJ1ZmZlcjsKKyAgICBzaXplX3QgaW5kZXg7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBNdXRleGVkPFJlb3JkZXJTdGFzaD46OkxvY2tlZCByZW9yZGVyKG1SZW9yZGVyU3Rhc2gpOworICAgICAgICBpZiAoIXJlb3JkZXItPmhhc1BlbmRpbmcoKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFyZW9yZGVyLT5wb3AoJmVudHJ5KSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBNdXRleGVkPE91dHB1dD46OkxvY2tlZCBvdXRwdXQobU91dHB1dCk7CisgICAgICAgIHN0YXR1c190IGVyciA9IG91dHB1dC0+YnVmZmVycy0+cmVnaXN0ZXJCdWZmZXIoZW50cnkuYnVmZmVyLCAmaW5kZXgsICZvdXRCdWZmZXIpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBib29sIG91dHB1dEJ1ZmZlcnNDaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoZXJyICE9IFdPVUxEX0JMT0NLKSB7CisgICAgICAgICAgICAgICAgaWYgKCFvdXRwdXQtPmJ1ZmZlcnMtPmlzQXJyYXlNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5idWZmZXJzID0gb3V0cHV0LT5idWZmZXJzLT50b0FycmF5TW9kZShvdXRwdXQtPm51bVNsb3RzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgT3V0cHV0QnVmZmVyc0FycmF5ICphcnJheSA9IChPdXRwdXRCdWZmZXJzQXJyYXkgKilvdXRwdXQtPmJ1ZmZlcnMuZ2V0KCk7CisgICAgICAgICAgICAgICAgYXJyYXktPnJlYWxsb2MoZW50cnkuYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJzQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiWyVzXSBzZW5kT3V0cHV0QnVmZmVyczogdW5hYmxlIHRvIHJlZ2lzdGVyIG91dHB1dCBidWZmZXIiLCBtTmFtZSk7CisgICAgICAgICAgICByZW9yZGVyLT5kZWZlcihlbnRyeSk7CisKKyAgICAgICAgICAgIG91dHB1dC51bmxvY2soKTsKKyAgICAgICAgICAgIHJlb3JkZXIudW5sb2NrKCk7CisKKyAgICAgICAgICAgIGlmIChvdXRwdXRCdWZmZXJzQ2hhbmdlZCkgeworICAgICAgICAgICAgICAgIG1DQ29kZWNDYWxsYmFjay0+b25PdXRwdXRCdWZmZXJzQ2hhbmdlZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG91dHB1dC51bmxvY2soKTsKKyAgICAgICAgcmVvcmRlci51bmxvY2soKTsKKworICAgICAgICBvdXRCdWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIGVudHJ5LnRpbWVzdGFtcCk7CisgICAgICAgIG91dEJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiZmxhZ3MiLCBlbnRyeS5mbGFncyk7CisgICAgICAgIEFMT0dWKCJbJXNdIHNlbmRPdXRwdXRCdWZmZXJzOiBvdXQgYnVmZmVyIGluZGV4ID0gJXp1IFslcF0gPT4gJXAgKyAlenUgKCVsbGQpIiwKKyAgICAgICAgICAgICAgICBtTmFtZSwgaW5kZXgsIG91dEJ1ZmZlci5nZXQoKSwgb3V0QnVmZmVyLT5kYXRhKCksIG91dEJ1ZmZlci0+c2l6ZSgpLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZW50cnkudGltZXN0YW1wKTsKKyAgICAgICAgbUNhbGxiYWNrLT5vbk91dHB1dEJ1ZmZlckF2YWlsYWJsZShpbmRleCwgb3V0QnVmZmVyKTsKKyAgICB9Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJm5ld1N1cmZhY2UpIHsKKyAgICBzdGF0aWMgc3RkOjphdG9taWNfdWludDMyX3Qgc3VyZmFjZUdlbmVyYXRpb257MH07CisgICAgdWludDMyX3QgZ2VuZXJhdGlvbiA9IChnZXRwaWQoKSA8PCAxMCkgfAorICAgICAgICAgICAgKChzdXJmYWNlR2VuZXJhdGlvbi5mZXRjaF9hZGQoMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkgKyAxKQorICAgICAgICAgICAgICAgICYgKCgxIDw8IDEwKSAtIDEpKTsKKworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHByb2R1Y2VyOworICAgIGlmIChuZXdTdXJmYWNlKSB7CisgICAgICAgIG5ld1N1cmZhY2UtPnNldFNjYWxpbmdNb2RlKE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX1NDQUxFX1RPX1dJTkRPVyk7CisgICAgICAgIG5ld1N1cmZhY2UtPnNldERlcXVldWVUaW1lb3V0KGtEZXF1ZXVlVGltZW91dE5zKTsKKyAgICAgICAgcHJvZHVjZXIgPSBuZXdTdXJmYWNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CisgICAgICAgIHByb2R1Y2VyLT5zZXRHZW5lcmF0aW9uTnVtYmVyKGdlbmVyYXRpb24pOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJbJXNdIHNldHRpbmcgb3V0cHV0IHN1cmZhY2UgdG8gbnVsbCIsIG1OYW1lKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZT4gb3V0cHV0UG9vbEludGY7CisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3Qgb3V0cHV0UG9vbElkOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxCbG9ja1Bvb2xzPjo6TG9ja2VkIHBvb2xzKG1CbG9ja1Bvb2xzKTsKKyAgICAgICAgb3V0cHV0UG9vbElkID0gcG9vbHMtPm91dHB1dFBvb2xJZDsKKyAgICAgICAgb3V0cHV0UG9vbEludGYgPSBwb29scy0+b3V0cHV0UG9vbEludGY7CisgICAgfQorCisgICAgaWYgKG91dHB1dFBvb2xJbnRmKSB7CisgICAgICAgIGlmIChtQ29tcG9uZW50LT5zZXRPdXRwdXRTdXJmYWNlKAorICAgICAgICAgICAgICAgIG91dHB1dFBvb2xJZCwKKyAgICAgICAgICAgICAgICBwcm9kdWNlciwKKyAgICAgICAgICAgICAgICBnZW5lcmF0aW9uKSAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0koIlslc10gc2V0U3VyZmFjZTogY29tcG9uZW50IHNldE91dHB1dFN1cmZhY2UgZmFpbGVkIiwgbU5hbWUpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleGVkPE91dHB1dFN1cmZhY2U+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXRTdXJmYWNlKTsKKyAgICAgICAgbmV3U3VyZmFjZS0+c2V0TWF4RGVxdWV1ZWRCdWZmZXJDb3VudChvdXRwdXQtPm1heERlcXVldWVCdWZmZXJzKTsKKyAgICAgICAgb3V0cHV0LT5zdXJmYWNlID0gbmV3U3VyZmFjZTsKKyAgICAgICAgb3V0cHV0LT5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK1BpcGVsaW5lV2F0Y2hlcjo6Q2xvY2s6OmR1cmF0aW9uIENDb2RlY0J1ZmZlckNoYW5uZWw6OmVsYXBzZWQoKSB7CisgICAgLy8gV2hlbiBjbGllbnQgcHVzaGVkIEVPUywgd2Ugd2FudCBhbGwgdGhlIHdvcmsgdG8gYmUgZG9uZSBxdWlja2x5LgorICAgIC8vIE90aGVyd2lzZSwgY29tcG9uZW50IG1heSBoYXZlIHN0YWxsZWQgd29yayBkdWUgdG8gaW5wdXQgc3RhcnZhdGlvbiB1cCB0bworICAgIC8vIHRoZSBzdW0gb2YgdGhlIGRlbGF5IGluIHRoZSBwaXBlbGluZS4KKyAgICBzaXplX3QgbiA9IG1JbnB1dE1ldEVvcyA/IDAgOiBtRGVsYXk7CisgICAgcmV0dXJuIG1QaXBlbGluZVdhdGNoZXIubG9jaygpLT5lbGFwc2VkKFBpcGVsaW5lV2F0Y2hlcjo6Q2xvY2s6Om5vdygpLCBuKTsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpzZXRNZXRhTW9kZShNZXRhTW9kZSBtb2RlKSB7CisgICAgbU1ldGFNb2RlID0gbW9kZTsKK30KKworc3RhdHVzX3QgdG9TdGF0dXNUKGMyX3N0YXR1c190IGMycywgYzJfb3BlcmF0aW9uX3QgYzJvcCkgeworICAgIC8vIEMyX09LIGlzIGFsd2F5cyB0cmFuc2xhdGVkIHRvIE9LLgorICAgIGlmIChjMnMgPT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIC8vIE9wZXJhdGlvbi1kZXBlbmRlbnQgdHJhbnNsYXRpb24KKyAgICAvLyBUT0RPOiBBZGQgYXMgbmVjZXNzYXJ5CisgICAgc3dpdGNoIChjMm9wKSB7CisgICAgY2FzZSBDMl9PUEVSQVRJT05fQ29tcG9uZW50X3N0YXJ0OgorICAgICAgICBzd2l0Y2ggKGMycykgeworICAgICAgICBjYXNlIEMyX05PX01FTU9SWToKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIEJhY2t1cCBvcGVyYXRpb24tYWdub3N0aWMgdHJhbnNsYXRpb24KKyAgICBzd2l0Y2ggKGMycykgeworICAgIGNhc2UgQzJfQkFEX0lOREVYOgorICAgICAgICByZXR1cm4gQkFEX0lOREVYOworICAgIGNhc2UgQzJfQkFEX1ZBTFVFOgorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIGNhc2UgQzJfQkxPQ0tJTkc6CisgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICBjYXNlIEMyX0RVUExJQ0FURToKKyAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgIGNhc2UgQzJfTk9fSU5JVDoKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgY2FzZSBDMl9OT19NRU1PUlk6CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgY2FzZSBDMl9OT1RfRk9VTkQ6CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICBjYXNlIEMyX1RJTUVEX09VVDoKKyAgICAgICAgcmV0dXJuIFRJTUVEX09VVDsKKyAgICBjYXNlIEMyX0JBRF9TVEFURToKKyAgICBjYXNlIEMyX0NBTkNFTEVEOgorICAgIGNhc2UgQzJfQ0FOTk9UX0RPOgorICAgIGNhc2UgQzJfQ09SUlVQVEVEOgorICAgIGNhc2UgQzJfT01JVFRFRDoKKyAgICBjYXNlIEMyX1JFRlVTRUQ6CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAtc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KGMycyk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlckNoYW5uZWwuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU1NzY3OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmgKQEAgLTAsMCArMSwzNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENDT0RFQ19CVUZGRVJfQ0hBTk5FTF9IXworCisjZGVmaW5lIENDT0RFQ19CVUZGRVJfQ0hBTk5FTF9IXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8Q29kZWMyTWFwcGVyLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL011dGV4ZWQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisKKyNpbmNsdWRlICJDQ29kZWNCdWZmZXJzLmgiCisjaW5jbHVkZSAiSW5wdXRTdXJmYWNlV3JhcHBlci5oIgorI2luY2x1ZGUgIlBpcGVsaW5lV2F0Y2hlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lbW9yeURlYWxlcjsKKworY2xhc3MgQ0NvZGVjQ2FsbGJhY2sgeworcHVibGljOgorICAgIHZpcnR1YWwgfkNDb2RlY0NhbGxiYWNrKCkgPSBkZWZhdWx0OworICAgIHZpcnR1YWwgdm9pZCBvbkVycm9yKHN0YXR1c190IGVyciwgZW51bSBBY3Rpb25Db2RlIGFjdGlvbkNvZGUpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgb25PdXRwdXRGcmFtZXNSZW5kZXJlZChpbnQ2NF90IG1lZGlhVGltZVVzLCBuc2Vjc190IHJlbmRlclRpbWVOcykgPSAwOworICAgIHZpcnR1YWwgdm9pZCBvbk91dHB1dEJ1ZmZlcnNDaGFuZ2VkKCkgPSAwOworfTsKKworLyoqCisgKiBCdWZmZXJDaGFubmVsQmFzZSBpbXBsZW1lbnRhdGlvbiBmb3IgQ0NvZGVjLgorICovCitjbGFzcyBDQ29kZWNCdWZmZXJDaGFubmVsCisgICAgOiBwdWJsaWMgQnVmZmVyQ2hhbm5lbEJhc2UsIHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPENDb2RlY0J1ZmZlckNoYW5uZWw+IHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBDQ29kZWNCdWZmZXJDaGFubmVsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDQ29kZWNDYWxsYmFjaz4gJmNhbGxiYWNrKTsKKyAgICB2aXJ0dWFsIH5DQ29kZWNCdWZmZXJDaGFubmVsKCk7CisKKyAgICAvLyBCdWZmZXJDaGFubmVsQmFzZSBpbnRlcmZhY2UKKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXVlSW5wdXRCdWZmZXIoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBxdWV1ZVNlY3VyZUlucHV0QnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIGJvb2wgc2VjdXJlLAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqa2V5LAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaXYsCisgICAgICAgICAgICBDcnlwdG9QbHVnaW46Ok1vZGUgbW9kZSwKKyAgICAgICAgICAgIENyeXB0b1BsdWdpbjo6UGF0dGVybiBwYXR0ZXJuLAorICAgICAgICAgICAgY29uc3QgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUgKnN1YlNhbXBsZXMsCisgICAgICAgICAgICBzaXplX3QgbnVtU3ViU2FtcGxlcywKKyAgICAgICAgICAgIEFTdHJpbmcgKmVycm9yRGV0YWlsTXNnKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbmRlck91dHB1dEJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsIGludDY0X3QgdGltZXN0YW1wTnMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzY2FyZEJ1ZmZlcihjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0SW5wdXRCdWZmZXJBcnJheShWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICphcnJheSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIGdldE91dHB1dEJ1ZmZlckFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSBvdmVycmlkZTsKKworICAgIC8vIE1ldGhvZHMgYmVsb3cgYXJlIGludGVyZmFjZSBmb3IgQ0NvZGVjIHRvIHVzZS4KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29tcG9uZW50IG9iamVjdCBmb3IgYnVmZmVyIHByb2Nlc3NpbmcuCisgICAgICovCisgICAgdm9pZCBzZXRDb21wb25lbnQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50KTsKKworICAgIC8qKgorICAgICAqIFNldCBvdXRwdXQgZ3JhcGhpYyBzdXJmYWNlIGZvciByZW5kZXJpbmcuCisgICAgICovCisgICAgc3RhdHVzX3Qgc2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgR3JhcGhpY0J1ZmZlclNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0aGUgY29tcG9uZW50IGV4dHJhY3RzIGlucHV0CisgICAgICogYnVmZmVycy4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRJbnB1dFN1cmZhY2UoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZVdyYXBwZXI+ICZzdXJmYWNlKTsKKworICAgIC8qKgorICAgICAqIFNpZ25hbCBFT1MgdG8gaW5wdXQgc3VyZmFjZS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzaWduYWxFbmRPZklucHV0U3RyZWFtKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gJnBhcmFtcyk7CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBxdWV1ZWluZyBidWZmZXJzIHRvIHRoZSBjb21wb25lbnQuIFRoaXMgb2JqZWN0IHNob3VsZCBuZXZlciBxdWV1ZQorICAgICAqIGJ1ZmZlcnMgYmVmb3JlIHRoaXMgY2FsbCBoYXMgY29tcGxldGVkLgorICAgICAqLworICAgIHN0YXR1c190IHN0YXJ0KGNvbnN0IHNwPEFNZXNzYWdlPiAmaW5wdXRGb3JtYXQsIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0KTsKKworICAgIC8qKgorICAgICAqIFJlcXVlc3QgaW5pdGlhbCBpbnB1dCBidWZmZXJzIHRvIGJlIGZpbGxlZCBieSBjbGllbnQuCisgICAgICovCisgICAgc3RhdHVzX3QgcmVxdWVzdEluaXRpYWxJbnB1dEJ1ZmZlcnMoKTsKKworICAgIC8qKgorICAgICAqIFN0b3AgcXVldWVpbmcgYnVmZmVycyB0byB0aGUgY29tcG9uZW50LiBUaGlzIG9iamVjdCBzaG91bGQgbmV2ZXIgcXVldWUKKyAgICAgKiBidWZmZXJzIGFmdGVyIHRoaXMgY2FsbCwgdW50aWwgc3RhcnQoKSBpcyBjYWxsZWQuCisgICAgICovCisgICAgdm9pZCBzdG9wKCk7CisKKyAgICB2b2lkIGZsdXNoKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJmZsdXNoZWRXb3JrKTsKKworICAgIC8qKgorICAgICAqIE5vdGlmeSBpbnB1dCBjbGllbnQgYWJvdXQgd29yayBkb25lLgorICAgICAqCisgICAgICogQHBhcmFtIHdvcmtJdGVtcyAgIGZpbmlzaGVkIHdvcmsgaXRlbS4KKyAgICAgKiBAcGFyYW0gb3V0cHV0Rm9ybWF0IG5ldyBvdXRwdXQgZm9ybWF0IGlmIGl0IGhhcyBjaGFuZ2VkLCBvdGhlcndpc2UgbnVsbHB0cgorICAgICAqIEBwYXJhbSBpbml0RGF0YSAgICBuZXcgaW5pdCBkYXRhIChDU0QpIGlmIGl0IGhhcyBjaGFuZ2VkLCBvdGhlcndpc2UgbnVsbHB0cgorICAgICAqLworICAgIHZvaWQgb25Xb3JrRG9uZSgKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmssIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0LAorICAgICAgICAgICAgY29uc3QgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dCAqaW5pdERhdGEpOworCisgICAgLyoqCisgICAgICogTWFrZSBhbiBpbnB1dCBidWZmZXIgYXZhaWxhYmxlIGZvciB0aGUgY2xpZW50IGFzIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQKKyAgICAgKiBieSB0aGUgY29kZWMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhbWVJbmRleCBUaGUgaW5kZXggb2YgaW5wdXQgd29yaworICAgICAqIEBwYXJhbSBhcnJheUluZGV4IFRoZSBpbmRleCBvZiBidWZmZXIgaW4gdGhlIGlucHV0IHdvcmsgYnVmZmVycy4KKyAgICAgKi8KKyAgICB2b2lkIG9uSW5wdXRCdWZmZXJEb25lKHVpbnQ2NF90IGZyYW1lSW5kZXgsIHNpemVfdCBhcnJheUluZGV4KTsKKworICAgIFBpcGVsaW5lV2F0Y2hlcjo6Q2xvY2s6OmR1cmF0aW9uIGVsYXBzZWQoKTsKKworICAgIGVudW0gTWV0YU1vZGUgeworICAgICAgICBNT0RFX05PTkUsCisgICAgICAgIE1PREVfQU5XLAorICAgIH07CisKKyAgICB2b2lkIHNldE1ldGFNb2RlKE1ldGFNb2RlIG1vZGUpOworCitwcml2YXRlOgorICAgIGNsYXNzIFF1ZXVlR3VhcmQ7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWFsIG11dGV4LWxpa2Ugb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgorICAgICAqCisgICAgICogLSBBdCBTVE9QUEVEIHN0YXRlIChpbml0aWFsLCBvciBhZnRlciBzdG9wKCkpCisgICAgICogICAtIFF1ZXVlR3VhcmQgb2JqZWN0IGdldHMgY3JlYXRlZCBhdCBTVE9QUEVEIHN0YXRlLCBhbmQgdGhlIGNsaWVudCBpcworICAgICAqICAgICBzdXBwb3NlZCB0byByZXR1cm4gaW1tZWRpYXRlbHkuCisgICAgICogLSBBdCBSVU5OSU5HIHN0YXRlIChhZnRlciBzdGFydCgpKQorICAgICAqICAgLSBFYWNoIFF1ZXVlR3VhcmQgb2JqZWN0CisgICAgICovCisgICAgY2xhc3MgUXVldWVTeW5jIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8qKgorICAgICAgICAgKiBBdCBjb25zdHJ1Y3Rpb24gdGhlIHN5bmMgb2JqZWN0IGlzIGluIFNUT1BQRUQgc3RhdGUuCisgICAgICAgICAqLworICAgICAgICBpbmxpbmUgUXVldWVTeW5jKCkge30KKyAgICAgICAgflF1ZXVlU3luYygpID0gZGVmYXVsdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVHJhbnNpdGlvbiB0byBSVU5OSU5HIHN0YXRlIHdoZW4gc3RvcHBlZC4gTm8tb3AgaWYgYWxyZWFkeSBpbiBSVU5OSU5HCisgICAgICAgICAqIHN0YXRlLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBzdGFydCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBdCBSVU5OSU5HIHN0YXRlLCB3YWl0IHVudGlsIGFsbCBRdWV1ZUd1YXJkIG9iamVjdCBjcmVhdGVkIGR1cmluZworICAgICAgICAgKiBSVU5OSU5HIHN0YXRlIGFyZSBkZXN0cm95ZWQsIGFuZCB0aGVuIHRyYW5zaXRpb24gdG8gU1RPUFBFRCBzdGF0ZS4KKyAgICAgICAgICogTm8tb3AgaWYgYWxyZWFkeSBpbiBTVE9QUEVEIHN0YXRlLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBzdG9wKCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBNdXRleCBtR3VhcmRMb2NrOworCisgICAgICAgIHN0cnVjdCBDb3VudGVyIHsKKyAgICAgICAgICAgIGlubGluZSBDb3VudGVyKCkgOiB2YWx1ZSgtMSkge30KKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBDb25kaXRpb24gY29uZDsKKyAgICAgICAgfTsKKyAgICAgICAgTXV0ZXhlZDxDb3VudGVyPiBtQ291bnQ7CisKKyAgICAgICAgZnJpZW5kIGNsYXNzIENDb2RlY0J1ZmZlckNoYW5uZWw6OlF1ZXVlR3VhcmQ7CisgICAgfTsKKworICAgIGNsYXNzIFF1ZXVlR3VhcmQgeworICAgIHB1YmxpYzoKKyAgICAgICAgUXVldWVHdWFyZChRdWV1ZVN5bmMgJnN5bmMpOworICAgICAgICB+UXVldWVHdWFyZCgpOworICAgICAgICBpbmxpbmUgYm9vbCBpc1J1bm5pbmcoKSB7IHJldHVybiBtUnVubmluZzsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgUXVldWVTeW5jICZtU3luYzsKKyAgICAgICAgYm9vbCBtUnVubmluZzsKKyAgICB9OworCisgICAgdm9pZCBmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZSgpOworICAgIHZvaWQgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGVJbnRlcm5hbCgpOworICAgIHN0YXR1c190IHF1ZXVlSW5wdXRCdWZmZXJJbnRlcm5hbChzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXIpOworICAgIGJvb2wgaGFuZGxlV29yaygKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmssIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0LAorICAgICAgICAgICAgY29uc3QgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dCAqaW5pdERhdGEpOworICAgIHZvaWQgc2VuZE91dHB1dEJ1ZmZlcnMoKTsKKworICAgIFF1ZXVlU3luYyBtU3luYzsKKyAgICBzcDxNZW1vcnlEZWFsZXI+IG1EZWFsZXI7CisgICAgc3A8SU1lbW9yeT4gbURlY3J5cHREZXN0aW5hdGlvbjsKKyAgICBpbnQzMl90IG1IZWFwU2VxTnVtOworCisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcG9uZW50OworICAgIHN0ZDo6c3RyaW5nIG1Db21wb25lbnROYW1lOyAvLy88IGNvbXBvbmVudCBuYW1lIGZvciBkZWJ1Z2dpbmcKKyAgICBjb25zdCBjaGFyICptTmFtZTsgLy8vPCBDLXN0cmluZyB2ZXJzaW9uIG9mIGNvbXBvbmVudCBuYW1lCisgICAgc3RkOjpzaGFyZWRfcHRyPENDb2RlY0NhbGxiYWNrPiBtQ0NvZGVjQ2FsbGJhY2s7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtSW5wdXRBbGxvY2F0b3I7CisgICAgUXVldWVTeW5jIG1RdWV1ZVN5bmM7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBtUGFyYW1zVG9CZVNldDsKKworICAgIHNpemVfdCBtRGVsYXk7CisKKyAgICBzdHJ1Y3QgSW5wdXQgeworICAgICAgICBJbnB1dCgpOworCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnM+IGJ1ZmZlcnM7CisgICAgICAgIHNpemVfdCBudW1TbG90czsKKyAgICAgICAgRmxleEJ1ZmZlcnNJbXBsIGV4dHJhQnVmZmVyczsKKyAgICAgICAgc2l6ZV90IG51bUV4dHJhU2xvdHM7CisgICAgICAgIHVpbnQzMl90IGlucHV0RGVsYXk7CisgICAgICAgIHVpbnQzMl90IHBpcGVsaW5lRGVsYXk7CisgICAgfTsKKyAgICBNdXRleGVkPElucHV0PiBtSW5wdXQ7CisgICAgc3RydWN0IE91dHB1dCB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzPiBidWZmZXJzOworICAgICAgICBzaXplX3QgbnVtU2xvdHM7CisgICAgICAgIHVpbnQzMl90IG91dHB1dERlbGF5OworICAgIH07CisgICAgTXV0ZXhlZDxPdXRwdXQ+IG1PdXRwdXQ7CisgICAgTXV0ZXhlZDxzdGQ6Omxpc3Q8c3A8QUJ1ZmZlcj4+PiBtRmx1c2hlZENvbmZpZ3M7CisKKyAgICBzdGQ6OmF0b21pY191aW50NjRfdCBtRnJhbWVJbmRleDsKKyAgICBzdGQ6OmF0b21pY191aW50NjRfdCBtRmlyc3RWYWxpZEZyYW1lSW5kZXg7CisKKyAgICBzcDxNZW1vcnlEZWFsZXI+IG1ha2VNZW1vcnlEZWFsZXIoc2l6ZV90IGhlYXBTaXplKTsKKworICAgIHN0cnVjdCBPdXRwdXRTdXJmYWNlIHsKKyAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZTsKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgaW50IG1heERlcXVldWVCdWZmZXJzOworICAgIH07CisgICAgTXV0ZXhlZDxPdXRwdXRTdXJmYWNlPiBtT3V0cHV0U3VyZmFjZTsKKworICAgIHN0cnVjdCBCbG9ja1Bvb2xzIHsKKyAgICAgICAgQzJBbGxvY2F0b3I6OmlkX3QgaW5wdXRBbGxvY2F0b3JJZDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBpbnB1dFBvb2w7CisgICAgICAgIEMyQWxsb2NhdG9yOjppZF90IG91dHB1dEFsbG9jYXRvcklkOworICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBvdXRwdXRQb29sSWQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZT4gb3V0cHV0UG9vbEludGY7CisgICAgfTsKKyAgICBNdXRleGVkPEJsb2NrUG9vbHM+IG1CbG9ja1Bvb2xzOworCisgICAgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZVdyYXBwZXI+IG1JbnB1dFN1cmZhY2U7CisKKyAgICBNZXRhTW9kZSBtTWV0YU1vZGU7CisKKyAgICBNdXRleGVkPFBpcGVsaW5lV2F0Y2hlcj4gbVBpcGVsaW5lV2F0Y2hlcjsKKworICAgIGNsYXNzIFJlb3JkZXJTdGFzaCB7CisgICAgcHVibGljOgorICAgICAgICBzdHJ1Y3QgRW50cnkgeworICAgICAgICAgICAgaW5saW5lIEVudHJ5KCkgOiBidWZmZXIobnVsbHB0ciksIHRpbWVzdGFtcCgwKSwgZmxhZ3MoMCksIG9yZGluYWwoezAsIDAsIDB9KSB7fQorICAgICAgICAgICAgaW5saW5lIEVudHJ5KAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZiLAorICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHQsCisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCAmbykKKyAgICAgICAgICAgICAgICA6IGJ1ZmZlcihiKSwgdGltZXN0YW1wKHQpLCBmbGFncyhmKSwgb3JkaW5hbChvKSB7fQorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXI7CisgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcDsKKyAgICAgICAgICAgIGludDMyX3QgZmxhZ3M7CisgICAgICAgICAgICBDMldvcmtPcmRpbmFsU3RydWN0IG9yZGluYWw7CisgICAgICAgIH07CisKKyAgICAgICAgUmVvcmRlclN0YXNoKCk7CisKKyAgICAgICAgdm9pZCBjbGVhcigpOworICAgICAgICB2b2lkIGZsdXNoKCk7CisgICAgICAgIHZvaWQgc2V0RGVwdGgodWludDMyX3QgZGVwdGgpOworICAgICAgICB2b2lkIHNldEtleShDMkNvbmZpZzo6b3JkaW5hbF9rZXlfdCBrZXkpOworICAgICAgICBib29sIHBvcChFbnRyeSAqZW50cnkpOworICAgICAgICB2b2lkIGVtcGxhY2UoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wLAorICAgICAgICAgICAgICAgIGludDMyX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCAmb3JkaW5hbCk7CisgICAgICAgIHZvaWQgZGVmZXIoY29uc3QgRW50cnkgJmVudHJ5KTsKKyAgICAgICAgYm9vbCBoYXNQZW5kaW5nKCkgY29uc3Q7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6Omxpc3Q8RW50cnk+IG1QZW5kaW5nOworICAgICAgICBzdGQ6Omxpc3Q8RW50cnk+IG1TdGFzaDsKKyAgICAgICAgdWludDMyX3QgbURlcHRoOworICAgICAgICBDMkNvbmZpZzo6b3JkaW5hbF9rZXlfdCBtS2V5OworCisgICAgICAgIGJvb2wgbGVzcyhjb25zdCBDMldvcmtPcmRpbmFsU3RydWN0ICZvMSwgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCAmbzIpOworICAgIH07CisgICAgTXV0ZXhlZDxSZW9yZGVyU3Rhc2g+IG1SZW9yZGVyU3Rhc2g7CisKKyAgICBzdGQ6OmF0b21pY19ib29sIG1JbnB1dE1ldEVvczsKKyAgICBzdGQ6Om9uY2VfZmxhZyBtUmVuZGVyV2FybmluZ0ZsYWc7CisKKyAgICBpbmxpbmUgYm9vbCBoYXNDcnlwdG9PckRlc2NyYW1ibGVyKCkgeworICAgICAgICByZXR1cm4gbUNyeXB0byAhPSBudWxscHRyIHx8IG1EZXNjcmFtYmxlciAhPSBudWxscHRyOworICAgIH0KK307CisKKy8vIENvbnZlcnNpb24gb2YgYSBjMl9zdGF0dXNfdCB2YWx1ZSB0byBhIHN0YXR1c190IHZhbHVlIG1heSBkZXBlbmQgb24gdGhlCisvLyBvcGVyYXRpb24gdGhhdCByZXR1cm5zIHRoZSBjMl9zdGF0dXNfdCB2YWx1ZS4KK2VudW0gYzJfb3BlcmF0aW9uX3QgeworICAgIEMyX09QRVJBVElPTl9OT05FLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfY29ubmVjdFRvT214SW5wdXRTdXJmYWNlLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfY3JlYXRlQmxvY2tQb29sLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfZGVzdHJveUJsb2NrUG9vbCwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X2Rpc2Nvbm5lY3RGcm9tSW5wdXRTdXJmYWNlLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfZHJhaW4sCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9mbHVzaCwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X3F1ZXVlLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfcmVsZWFzZSwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X3Jlc2V0LAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfc2V0T3V0cHV0U3VyZmFjZSwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X3N0YXJ0LAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfc3RvcCwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50U3RvcmVfY29weUJ1ZmZlciwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50U3RvcmVfY3JlYXRlQ29tcG9uZW50LAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRTdG9yZV9jcmVhdGVJbnB1dFN1cmZhY2UsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudFN0b3JlX2NyZWF0ZUludGVyZmFjZSwKKyAgICBDMl9PUEVSQVRJT05fQ29uZmlndXJhYmxlX2NvbmZpZywKKyAgICBDMl9PUEVSQVRJT05fQ29uZmlndXJhYmxlX3F1ZXJ5LAorICAgIEMyX09QRVJBVElPTl9Db25maWd1cmFibGVfcXVlcnlTdXBwb3J0ZWRQYXJhbXMsCisgICAgQzJfT1BFUkFUSU9OX0NvbmZpZ3VyYWJsZV9xdWVyeVN1cHBvcnRlZFZhbHVlcywKKyAgICBDMl9PUEVSQVRJT05fSW5wdXRTdXJmYWNlX2Nvbm5lY3RUb0NvbXBvbmVudCwKKyAgICBDMl9PUEVSQVRJT05fSW5wdXRTdXJmYWNlQ29ubmVjdGlvbl9kaXNjb25uZWN0LAorfTsKKworc3RhdHVzX3QgdG9TdGF0dXNUKGMyX3N0YXR1c190IGMycywgYzJfb3BlcmF0aW9uX3QgYzJvcCA9IEMyX09QRVJBVElPTl9OT05FKTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDQ09ERUNfQlVGRkVSX0NIQU5ORUxfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJzLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWJkNWJkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlcnMuY3BwCkBAIC0wLDAgKzEsMTA1NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDQ29kZWNCdWZmZXJzIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorCisjaW5jbHVkZSAiQ0NvZGVjQnVmZmVycy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK3NwPEdyYXBoaWNCbG9ja0J1ZmZlcj4gQWxsb2NhdGVHcmFwaGljQnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgdWludDMyX3QgcGl4ZWxGb3JtYXQsCisgICAgICAgIGNvbnN0IEMyTWVtb3J5VXNhZ2UgJnVzYWdlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TG9jYWxCdWZmZXJQb29sPiAmbG9jYWxCdWZmZXJQb29sKSB7CisgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSB8fCAhZm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKSB7CisgICAgICAgIEFMT0dEKCJmb3JtYXQgbGFja3Mgd2lkdGggb3IgaGVpZ2h0Iik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2s7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBwaXhlbEZvcm1hdCwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgiZmV0Y2ggZ3JhcGhpYyBibG9jayBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGUoCisgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICBibG9jaywKKyAgICAgICAgICAgIFtsb2NhbEJ1ZmZlclBvb2xdKHNpemVfdCBjYXBhY2l0eSkgeworICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbEJ1ZmZlclBvb2wtPm5ld0J1ZmZlcihjYXBhY2l0eSk7CisgICAgICAgICAgICB9KTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIENDb2RlY0J1ZmZlcnMKKwordm9pZCBDQ29kZWNCdWZmZXJzOjpzZXRGb3JtYXQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKKyAgICBDSEVDSyhmb3JtYXQgIT0gbnVsbHB0cik7CisgICAgbUZvcm1hdCA9IGZvcm1hdDsKK30KKworc3A8QU1lc3NhZ2U+IENDb2RlY0J1ZmZlcnM6OmR1cEZvcm1hdCgpIHsKKyAgICByZXR1cm4gbUZvcm1hdCAhPSBudWxscHRyID8gbUZvcm1hdC0+ZHVwKCkgOiBudWxscHRyOworfQorCit2b2lkIENDb2RlY0J1ZmZlcnM6OmhhbmRsZUltYWdlRGF0YShjb25zdCBzcDxDb2RlYzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBzcDxBQnVmZmVyPiBpbWFnZURhdGFDYW5kaWRhdGUgPSBidWZmZXItPmdldEltYWdlRGF0YSgpOworICAgIGlmIChpbWFnZURhdGFDYW5kaWRhdGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPEFCdWZmZXI+IGltYWdlRGF0YTsKKyAgICBpZiAoIW1Gb3JtYXQtPmZpbmRCdWZmZXIoImltYWdlLWRhdGEiLCAmaW1hZ2VEYXRhKQorICAgICAgICAgICAgfHwgaW1hZ2VEYXRhQ2FuZGlkYXRlLT5zaXplKCkgIT0gaW1hZ2VEYXRhLT5zaXplKCkKKyAgICAgICAgICAgIHx8IG1lbWNtcChpbWFnZURhdGFDYW5kaWRhdGUtPmRhdGEoKSwgaW1hZ2VEYXRhLT5kYXRhKCksIGltYWdlRGF0YS0+c2l6ZSgpKSAhPSAwKSB7CisgICAgICAgIEFMT0dEKCJbJXNdIHVwZGF0aW5nIGltYWdlLWRhdGEiLCBtTmFtZSk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBuZXdGb3JtYXQgPSBkdXBGb3JtYXQoKTsKKyAgICAgICAgbmV3Rm9ybWF0LT5zZXRCdWZmZXIoImltYWdlLWRhdGEiLCBpbWFnZURhdGFDYW5kaWRhdGUpOworICAgICAgICBNZWRpYUltYWdlMiAqaW1nID0gKE1lZGlhSW1hZ2UyKilpbWFnZURhdGFDYW5kaWRhdGUtPmRhdGEoKTsKKyAgICAgICAgaWYgKGltZy0+bU51bVBsYW5lcyA+IDAgJiYgaW1nLT5tVHlwZSAhPSBpbWctPk1FRElBX0lNQUdFX1RZUEVfVU5LTk9XTikgeworICAgICAgICAgICAgaW50MzJfdCBzdHJpZGUgPSBpbWctPm1QbGFuZVswXS5tUm93SW5jOworICAgICAgICAgICAgbmV3Rm9ybWF0LT5zZXRJbnQzMihLRVlfU1RSSURFLCBzdHJpZGUpOworICAgICAgICAgICAgQUxPR0QoIlslc10gdXBkYXRpbmcgc3RyaWRlID0gJWQiLCBtTmFtZSwgc3RyaWRlKTsKKyAgICAgICAgICAgIGlmIChpbWctPm1OdW1QbGFuZXMgPiAxICYmIHN0cmlkZSA+IDApIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHZzdHJpZGUgPSAoaW1nLT5tUGxhbmVbMV0ubU9mZnNldCAtIGltZy0+bVBsYW5lWzBdLm1PZmZzZXQpIC8gc3RyaWRlOworICAgICAgICAgICAgICAgIG5ld0Zvcm1hdC0+c2V0SW50MzIoS0VZX1NMSUNFX0hFSUdIVCwgdnN0cmlkZSk7CisgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gdXBkYXRpbmcgdnN0cmlkZSA9ICVkIiwgbU5hbWUsIHZzdHJpZGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHNldEZvcm1hdChuZXdGb3JtYXQpOworICAgICAgICBidWZmZXItPnNldEZvcm1hdChuZXdGb3JtYXQpOworICAgIH0KK30KKworLy8gSW5wdXRCdWZmZXJzCisKK3NwPENvZGVjMkJ1ZmZlcj4gSW5wdXRCdWZmZXJzOjpjbG9uZUFuZFJlbGVhc2VCdWZmZXIoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcikgeworICAgIHNwPENvZGVjMkJ1ZmZlcj4gY29weSA9IGNyZWF0ZU5ld0J1ZmZlcigpOworICAgIGlmIChjb3B5ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYzJidWZmZXI7CisgICAgaWYgKCFyZWxlYXNlQnVmZmVyKGJ1ZmZlciwgJmMyYnVmZmVyLCB0cnVlKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKCFjb3B5LT5jYW5Db3B5KGMyYnVmZmVyKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKCFjb3B5LT5jb3B5KGMyYnVmZmVyKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIGNvcHk7Cit9CisKKy8vIE91dHB1dEJ1ZmZlcnMKKwordm9pZCBPdXRwdXRCdWZmZXJzOjppbml0U2tpcEN1dEJ1ZmZlcigKKyAgICAgICAgaW50MzJfdCBkZWxheSwgaW50MzJfdCBwYWRkaW5nLCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgY2hhbm5lbENvdW50KSB7CisgICAgQ0hFQ0sobVNraXBDdXRCdWZmZXIgPT0gbnVsbHB0cik7CisgICAgbURlbGF5ID0gZGVsYXk7CisgICAgbVBhZGRpbmcgPSBwYWRkaW5nOworICAgIG1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKKyAgICBzZXRTa2lwQ3V0QnVmZmVyKGRlbGF5LCBwYWRkaW5nLCBjaGFubmVsQ291bnQpOworfQorCit2b2lkIE91dHB1dEJ1ZmZlcnM6OnVwZGF0ZVNraXBDdXRCdWZmZXIoaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IGNoYW5uZWxDb3VudCkgeworICAgIGlmIChtU2tpcEN1dEJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW50MzJfdCBkZWxheSA9IG1EZWxheTsKKyAgICBpbnQzMl90IHBhZGRpbmcgPSBtUGFkZGluZzsKKyAgICBpZiAoc2FtcGxlUmF0ZSAhPSBtU2FtcGxlUmF0ZSkgeworICAgICAgICBkZWxheSA9ICgoaW50NjRfdClkZWxheSAqIHNhbXBsZVJhdGUpIC8gbVNhbXBsZVJhdGU7CisgICAgICAgIHBhZGRpbmcgPSAoKGludDY0X3QpcGFkZGluZyAqIHNhbXBsZVJhdGUpIC8gbVNhbXBsZVJhdGU7CisgICAgfQorICAgIHNldFNraXBDdXRCdWZmZXIoZGVsYXksIHBhZGRpbmcsIGNoYW5uZWxDb3VudCk7Cit9CisKK3ZvaWQgT3V0cHV0QnVmZmVyczo6c3VibWl0KGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBpZiAobVNraXBDdXRCdWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICBtU2tpcEN1dEJ1ZmZlci0+c3VibWl0KGJ1ZmZlcik7CisgICAgfQorfQorCit2b2lkIE91dHB1dEJ1ZmZlcnM6OnRyYW5zZmVyU2tpcEN1dEJ1ZmZlcihjb25zdCBzcDxTa2lwQ3V0QnVmZmVyPiAmc2NiKSB7CisgICAgbVNraXBDdXRCdWZmZXIgPSBzY2I7Cit9CisKK3ZvaWQgT3V0cHV0QnVmZmVyczo6c2V0U2tpcEN1dEJ1ZmZlcihpbnQzMl90IHNraXAsIGludDMyX3QgY3V0LCBpbnQzMl90IGNoYW5uZWxDb3VudCkgeworICAgIGlmIChtU2tpcEN1dEJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgIHNpemVfdCBwcmV2U2l6ZSA9IG1Ta2lwQ3V0QnVmZmVyLT5zaXplKCk7CisgICAgICAgIGlmIChwcmV2U2l6ZSAhPSAwdSkgeworICAgICAgICAgICAgQUxPR0QoIlslc10gUmVwbGFjaW5nIFNraXBDdXRCdWZmZXIgaG9sZGluZyAlenUgYnl0ZXMiLCBtTmFtZSwgcHJldlNpemUpOworICAgICAgICB9CisgICAgfQorICAgIG1Ta2lwQ3V0QnVmZmVyID0gbmV3IFNraXBDdXRCdWZmZXIoc2tpcCwgY3V0LCBjaGFubmVsQ291bnQpOworfQorCisvLyBMb2NhbEJ1ZmZlclBvb2wKKworc3RkOjpzaGFyZWRfcHRyPExvY2FsQnVmZmVyUG9vbD4gTG9jYWxCdWZmZXJQb29sOjpDcmVhdGUoc2l6ZV90IHBvb2xDYXBhY2l0eSkgeworICAgIHJldHVybiBzdGQ6OnNoYXJlZF9wdHI8TG9jYWxCdWZmZXJQb29sPihuZXcgTG9jYWxCdWZmZXJQb29sKHBvb2xDYXBhY2l0eSkpOworfQorCitzcDxBQnVmZmVyPiBMb2NhbEJ1ZmZlclBvb2w6Om5ld0J1ZmZlcihzaXplX3QgY2FwYWNpdHkpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOworICAgIGF1dG8gaXQgPSBzdGQ6OmZpbmRfaWYoCisgICAgICAgICAgICBtUG9vbC5iZWdpbigpLCBtUG9vbC5lbmQoKSwKKyAgICAgICAgICAgIFtjYXBhY2l0eV0oY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnZlYykgeworICAgICAgICAgICAgICAgIHJldHVybiB2ZWMuY2FwYWNpdHkoKSA+PSBjYXBhY2l0eTsKKyAgICAgICAgICAgIH0pOworICAgIGlmIChpdCAhPSBtUG9vbC5lbmQoKSkgeworICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgVmVjdG9yQnVmZmVyKHN0ZDo6bW92ZSgqaXQpLCBzaGFyZWRfZnJvbV90aGlzKCkpOworICAgICAgICBtUG9vbC5lcmFzZShpdCk7CisgICAgICAgIHJldHVybiBidWZmZXI7CisgICAgfQorICAgIGlmIChtVXNlZFNpemUgKyBjYXBhY2l0eSA+IG1Qb29sQ2FwYWNpdHkpIHsKKyAgICAgICAgd2hpbGUgKCFtUG9vbC5lbXB0eSgpKSB7CisgICAgICAgICAgICBtVXNlZFNpemUgLT0gbVBvb2wuYmFjaygpLmNhcGFjaXR5KCk7CisgICAgICAgICAgICBtUG9vbC5wb3BfYmFjaygpOworICAgICAgICB9CisgICAgICAgIGlmIChtVXNlZFNpemUgKyBjYXBhY2l0eSA+IG1Qb29sQ2FwYWNpdHkpIHsKKyAgICAgICAgICAgIEFMT0dEKCJtVXNlZFNpemUgPSAlenUsIGNhcGFjaXR5ID0gJXp1LCBtUG9vbENhcGFjaXR5ID0gJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgbVVzZWRTaXplLCBjYXBhY2l0eSwgbVBvb2xDYXBhY2l0eSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWMoY2FwYWNpdHkpOworICAgIG1Vc2VkU2l6ZSArPSB2ZWMuY2FwYWNpdHkoKTsKKyAgICByZXR1cm4gbmV3IFZlY3RvckJ1ZmZlcihzdGQ6Om1vdmUodmVjKSwgc2hhcmVkX2Zyb21fdGhpcygpKTsKK30KKworTG9jYWxCdWZmZXJQb29sOjpWZWN0b3JCdWZmZXI6OlZlY3RvckJ1ZmZlcigKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gJiZ2ZWMsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMb2NhbEJ1ZmZlclBvb2w+ICZwb29sKQorICAgIDogQUJ1ZmZlcih2ZWMuZGF0YSgpLCB2ZWMuY2FwYWNpdHkoKSksCisgICAgICBtVmVjKHN0ZDo6bW92ZSh2ZWMpKSwKKyAgICAgIG1Qb29sKHBvb2wpIHsKK30KKworTG9jYWxCdWZmZXJQb29sOjpWZWN0b3JCdWZmZXI6On5WZWN0b3JCdWZmZXIoKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPExvY2FsQnVmZmVyUG9vbD4gcG9vbCA9IG1Qb29sLmxvY2soKTsKKyAgICBpZiAocG9vbCkgeworICAgICAgICAvLyBJZiBwb29sIGlzIGFsaXZlLCByZXR1cm4gdGhlIHZlY3RvciBiYWNrIHRvIHRoZSBwb29sIHNvIHRoYXQKKyAgICAgICAgLy8gaXQgY2FuIGJlIHJlY3ljbGVkLgorICAgICAgICBwb29sLT5yZXR1cm5WZWN0b3Ioc3RkOjptb3ZlKG1WZWMpKTsKKyAgICB9Cit9CisKK3ZvaWQgTG9jYWxCdWZmZXJQb29sOjpyZXR1cm5WZWN0b3Ioc3RkOjp2ZWN0b3I8dWludDhfdD4gJiZ2ZWMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOworICAgIG1Qb29sLnB1c2hfZnJvbnQoc3RkOjptb3ZlKHZlYykpOworfQorCisvLyBGbGV4QnVmZmVyc0ltcGwKKworc2l6ZV90IEZsZXhCdWZmZXJzSW1wbDo6YXNzaWduU2xvdChjb25zdCBzcDxDb2RlYzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1CdWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChtQnVmZmVyc1tpXS5jbGllbnRCdWZmZXIgPT0gbnVsbHB0cgorICAgICAgICAgICAgICAgICYmIG1CdWZmZXJzW2ldLmNvbXBCdWZmZXIuZXhwaXJlZCgpKSB7CisgICAgICAgICAgICBtQnVmZmVyc1tpXS5jbGllbnRCdWZmZXIgPSBidWZmZXI7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtQnVmZmVycy5wdXNoX2JhY2soeyBidWZmZXIsIHN0ZDo6d2Vha19wdHI8QzJCdWZmZXI+KCkgfSk7CisgICAgcmV0dXJuIG1CdWZmZXJzLnNpemUoKSAtIDE7Cit9CisKK2Jvb2wgRmxleEJ1ZmZlcnNJbXBsOjpyZWxlYXNlU2xvdCgKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIsCisgICAgICAgIGJvb2wgcmVsZWFzZSkgeworICAgIHNwPENvZGVjMkJ1ZmZlcj4gY2xpZW50QnVmZmVyOworICAgIHNpemVfdCBpbmRleCA9IG1CdWZmZXJzLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1CdWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChtQnVmZmVyc1tpXS5jbGllbnRCdWZmZXIgPT0gYnVmZmVyKSB7CisgICAgICAgICAgICBjbGllbnRCdWZmZXIgPSBtQnVmZmVyc1tpXS5jbGllbnRCdWZmZXI7CisgICAgICAgICAgICBpZiAocmVsZWFzZSkgeworICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlci5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGNsaWVudEJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dWKCJbJXNdICVzOiBObyBtYXRjaGluZyBidWZmZXIgZm91bmQiLCBtTmFtZSwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gcmVzdWx0ID0gbUJ1ZmZlcnNbaW5kZXhdLmNvbXBCdWZmZXIubG9jaygpOworICAgIGlmICghcmVzdWx0KSB7CisgICAgICAgIHJlc3VsdCA9IGNsaWVudEJ1ZmZlci0+YXNDMkJ1ZmZlcigpOworICAgICAgICBtQnVmZmVyc1tpbmRleF0uY29tcEJ1ZmZlciA9IHJlc3VsdDsKKyAgICB9CisgICAgaWYgKGMyYnVmZmVyKSB7CisgICAgICAgICpjMmJ1ZmZlciA9IHJlc3VsdDsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRmxleEJ1ZmZlcnNJbXBsOjpleHBpcmVDb21wb25lbnRCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYzJidWZmZXIpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1CdWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gY29tcEJ1ZmZlciA9CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0uY29tcEJ1ZmZlci5sb2NrKCk7CisgICAgICAgIGlmICghY29tcEJ1ZmZlciB8fCBjb21wQnVmZmVyICE9IGMyYnVmZmVyKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBtQnVmZmVyc1tpXS5jb21wQnVmZmVyLnJlc2V0KCk7CisgICAgICAgIEFMT0dWKCJbJXNdIGNvZGVjIHJlbGVhc2VkIGJ1ZmZlciAjJXp1IiwgbU5hbWUsIGkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgQUxPR1YoIlslc10gY29kZWMgcmVsZWFzZWQgYW4gdW5rbm93biBidWZmZXIiLCBtTmFtZSk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEZsZXhCdWZmZXJzSW1wbDo6Zmx1c2goKSB7CisgICAgQUxPR1YoIlslc10gYnVmZmVycyBhcmUgZmx1c2hlZCAlenUiLCBtTmFtZSwgbUJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICBtQnVmZmVycy5jbGVhcigpOworfQorCitzaXplX3QgRmxleEJ1ZmZlcnNJbXBsOjpudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgeworICAgIHJldHVybiBzdGQ6OmNvdW50X2lmKAorICAgICAgICAgICAgbUJ1ZmZlcnMuYmVnaW4oKSwgbUJ1ZmZlcnMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBFbnRyeSAmZW50cnkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGVudHJ5LmNsaWVudEJ1ZmZlciAhPSBudWxscHRyKTsKKyAgICAgICAgICAgIH0pOworfQorCitzaXplX3QgRmxleEJ1ZmZlcnNJbXBsOjpudW1Db21wb25lbnRCdWZmZXJzKCkgY29uc3QgeworICAgIHJldHVybiBzdGQ6OmNvdW50X2lmKAorICAgICAgICAgICAgbUJ1ZmZlcnMuYmVnaW4oKSwgbUJ1ZmZlcnMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBFbnRyeSAmZW50cnkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gIWVudHJ5LmNvbXBCdWZmZXIuZXhwaXJlZCgpOworICAgICAgICAgICAgfSk7Cit9CisKKy8vIEJ1ZmZlcnNBcnJheUltcGwKKwordm9pZCBCdWZmZXJzQXJyYXlJbXBsOjppbml0aWFsaXplKAorICAgICAgICBjb25zdCBGbGV4QnVmZmVyc0ltcGwgJmltcGwsCisgICAgICAgIHNpemVfdCBtaW5TaXplLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjMkJ1ZmZlcj4oKT4gYWxsb2NhdGUpIHsKKyAgICBtSW1wbE5hbWUgPSBpbXBsLm1JbXBsTmFtZSArICJbTl0iOworICAgIG1OYW1lID0gbUltcGxOYW1lLmNfc3RyKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbXBsLm1CdWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gY2xpZW50QnVmZmVyID0gaW1wbC5tQnVmZmVyc1tpXS5jbGllbnRCdWZmZXI7CisgICAgICAgIGJvb2wgb3duZWRCeUNsaWVudCA9IChjbGllbnRCdWZmZXIgIT0gbnVsbHB0cik7CisgICAgICAgIGlmICghb3duZWRCeUNsaWVudCkgeworICAgICAgICAgICAgY2xpZW50QnVmZmVyID0gYWxsb2NhdGUoKTsKKyAgICAgICAgfQorICAgICAgICBtQnVmZmVycy5wdXNoX2JhY2soeyBjbGllbnRCdWZmZXIsIGltcGwubUJ1ZmZlcnNbaV0uY29tcEJ1ZmZlciwgb3duZWRCeUNsaWVudCB9KTsKKyAgICB9CisgICAgQUxPR1YoIlslc10gY29udmVydGVkICV6dSBidWZmZXJzIHRvIGFycmF5IG1vZGUgb2YgJXp1IiwgbU5hbWUsIG1CdWZmZXJzLnNpemUoKSwgbWluU2l6ZSk7CisgICAgZm9yIChzaXplX3QgaSA9IGltcGwubUJ1ZmZlcnMuc2l6ZSgpOyBpIDwgbWluU2l6ZTsgKytpKSB7CisgICAgICAgIG1CdWZmZXJzLnB1c2hfYmFjayh7IGFsbG9jYXRlKCksIHN0ZDo6d2Vha19wdHI8QzJCdWZmZXI+KCksIGZhbHNlIH0pOworICAgIH0KK30KKworc3RhdHVzX3QgQnVmZmVyc0FycmF5SW1wbDo6Z3JhYkJ1ZmZlcigKKyAgICAgICAgc2l6ZV90ICppbmRleCwKKyAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiAqYnVmZmVyLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3Qgc3A8Q29kZWMyQnVmZmVyPiAmKT4gbWF0Y2gpIHsKKyAgICAvLyBhbGxCdWZmZXJzRG9udE1hdGNoIHJlbWFpbnMgdHJ1ZSBpZiBhbGwgYnVmZmVycyBhcmUgYXZhaWxhYmxlIGJ1dAorICAgIC8vIG1hdGNoKCkgcmV0dXJucyBmYWxzZSBmb3IgZXZlcnkgYnVmZmVyLgorICAgIGJvb2wgYWxsQnVmZmVyc0RvbnRNYXRjaCA9IHRydWU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoIW1CdWZmZXJzW2ldLm93bmVkQnlDbGllbnQgJiYgbUJ1ZmZlcnNbaV0uY29tcEJ1ZmZlci5leHBpcmVkKCkpIHsKKyAgICAgICAgICAgIGlmIChtYXRjaChtQnVmZmVyc1tpXS5jbGllbnRCdWZmZXIpKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0ub3duZWRCeUNsaWVudCA9IHRydWU7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAoKmJ1ZmZlciktPm1ldGEoKS0+Y2xlYXIoKTsKKyAgICAgICAgICAgICAgICAoKmJ1ZmZlciktPnNldFJhbmdlKDAsICgqYnVmZmVyKS0+Y2FwYWNpdHkoKSk7CisgICAgICAgICAgICAgICAgKmluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhbGxCdWZmZXJzRG9udE1hdGNoID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGFsbEJ1ZmZlcnNEb250TWF0Y2ggPyBOT19NRU1PUlkgOiBXT1VMRF9CTE9DSzsKK30KKworYm9vbCBCdWZmZXJzQXJyYXlJbXBsOjpyZXR1cm5CdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyLAorICAgICAgICBib29sIHJlbGVhc2UpIHsKKyAgICBzcDxDb2RlYzJCdWZmZXI+IGNsaWVudEJ1ZmZlcjsKKyAgICBzaXplX3QgaW5kZXggPSBtQnVmZmVycy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQnVmZmVycy5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAobUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyID09IGJ1ZmZlcikgeworICAgICAgICAgICAgaWYgKCFtQnVmZmVyc1tpXS5vd25lZEJ5Q2xpZW50KSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gQ2xpZW50IHJldHVybmVkIGEgYnVmZmVyIGl0IGRvZXMgbm90IG93biBhY2NvcmRpbmcgdG8gb3VyIHJlY29yZDogJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjbGllbnRCdWZmZXIgPSBtQnVmZmVyc1tpXS5jbGllbnRCdWZmZXI7CisgICAgICAgICAgICBpZiAocmVsZWFzZSkgeworICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldLm93bmVkQnlDbGllbnQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluZGV4ID0gaTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjbGllbnRCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVigiWyVzXSAlczogTm8gbWF0Y2hpbmcgYnVmZmVyIGZvdW5kIiwgbU5hbWUsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBBTE9HVigiWyVzXSAlczogbWF0Y2hpbmcgYnVmZmVyIGZvdW5kIChpbmRleD0lenUpIiwgbU5hbWUsIF9fZnVuY19fLCBpbmRleCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiByZXN1bHQgPSBtQnVmZmVyc1tpbmRleF0uY29tcEJ1ZmZlci5sb2NrKCk7CisgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgcmVzdWx0ID0gY2xpZW50QnVmZmVyLT5hc0MyQnVmZmVyKCk7CisgICAgICAgIG1CdWZmZXJzW2luZGV4XS5jb21wQnVmZmVyID0gcmVzdWx0OworICAgIH0KKyAgICBpZiAoYzJidWZmZXIpIHsKKyAgICAgICAgKmMyYnVmZmVyID0gcmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBCdWZmZXJzQXJyYXlJbXBsOjpleHBpcmVDb21wb25lbnRCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYzJidWZmZXIpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1CdWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gY29tcEJ1ZmZlciA9CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0uY29tcEJ1ZmZlci5sb2NrKCk7CisgICAgICAgIGlmICghY29tcEJ1ZmZlcikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGMyYnVmZmVyID09IGNvbXBCdWZmZXIpIHsKKyAgICAgICAgICAgIGlmIChtQnVmZmVyc1tpXS5vd25lZEJ5Q2xpZW50KSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBjb2RlYyByZWxlYXNlZCBhIGJ1ZmZlciBvd25lZCBieSBjbGllbnQgIgorICAgICAgICAgICAgICAgICAgICAgICIoaW5kZXggJXp1KSIsIG1OYW1lLCBpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CdWZmZXJzW2ldLmNvbXBCdWZmZXIucmVzZXQoKTsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIGNvZGVjIHJlbGVhc2VkIGJ1ZmZlciAjJXp1KGFycmF5IG1vZGUpIiwgbU5hbWUsIGkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoIlslc10gY29kZWMgcmVsZWFzZWQgYW4gdW5rbm93biBidWZmZXIgKGFycmF5IG1vZGUpIiwgbU5hbWUpOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBCdWZmZXJzQXJyYXlJbXBsOjpnZXRBcnJheShWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICphcnJheSkgY29uc3QgeworICAgIGFycmF5LT5jbGVhcigpOworICAgIGZvciAoY29uc3QgRW50cnkgJmVudHJ5IDogbUJ1ZmZlcnMpIHsKKyAgICAgICAgYXJyYXktPnB1c2goZW50cnkuY2xpZW50QnVmZmVyKTsKKyAgICB9Cit9CisKK3ZvaWQgQnVmZmVyc0FycmF5SW1wbDo6Zmx1c2goKSB7CisgICAgZm9yIChFbnRyeSAmZW50cnkgOiBtQnVmZmVycykgeworICAgICAgICBlbnRyeS5vd25lZEJ5Q2xpZW50ID0gZmFsc2U7CisgICAgfQorfQorCit2b2lkIEJ1ZmZlcnNBcnJheUltcGw6OnJlYWxsb2Moc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+KCk+IGFsbG9jKSB7CisgICAgc2l6ZV90IHNpemUgPSBtQnVmZmVycy5zaXplKCk7CisgICAgbUJ1ZmZlcnMuY2xlYXIoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICBtQnVmZmVycy5wdXNoX2JhY2soeyBhbGxvYygpLCBzdGQ6OndlYWtfcHRyPEMyQnVmZmVyPigpLCBmYWxzZSB9KTsKKyAgICB9Cit9CisKK3ZvaWQgQnVmZmVyc0FycmF5SW1wbDo6Z3JvdygKKyAgICAgICAgc2l6ZV90IG5ld1NpemUsIHN0ZDo6ZnVuY3Rpb248c3A8Q29kZWMyQnVmZmVyPigpPiBhbGxvYykgeworICAgIENIRUNLX0xUKG1CdWZmZXJzLnNpemUoKSwgbmV3U2l6ZSk7CisgICAgd2hpbGUgKG1CdWZmZXJzLnNpemUoKSA8IG5ld1NpemUpIHsKKyAgICAgICAgbUJ1ZmZlcnMucHVzaF9iYWNrKHsgYWxsb2MoKSwgc3RkOjp3ZWFrX3B0cjxDMkJ1ZmZlcj4oKSwgZmFsc2UgfSk7CisgICAgfQorfQorCitzaXplX3QgQnVmZmVyc0FycmF5SW1wbDo6bnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjpjb3VudF9pZigKKyAgICAgICAgICAgIG1CdWZmZXJzLmJlZ2luKCksIG1CdWZmZXJzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgRW50cnkgJmVudHJ5KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVudHJ5Lm93bmVkQnlDbGllbnQ7CisgICAgICAgICAgICB9KTsKK30KKworLy8gSW5wdXRCdWZmZXJzQXJyYXkKKwordm9pZCBJbnB1dEJ1ZmZlcnNBcnJheTo6aW5pdGlhbGl6ZSgKKyAgICAgICAgY29uc3QgRmxleEJ1ZmZlcnNJbXBsICZpbXBsLAorICAgICAgICBzaXplX3QgbWluU2l6ZSwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+KCk+IGFsbG9jYXRlKSB7CisgICAgbUFsbG9jYXRlID0gYWxsb2NhdGU7CisgICAgbUltcGwuaW5pdGlhbGl6ZShpbXBsLCBtaW5TaXplLCBhbGxvY2F0ZSk7Cit9CisKK3ZvaWQgSW5wdXRCdWZmZXJzQXJyYXk6OmdldEFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSBjb25zdCB7CisgICAgbUltcGwuZ2V0QXJyYXkoYXJyYXkpOworfQorCitib29sIElucHV0QnVmZmVyc0FycmF5OjpyZXF1ZXN0TmV3QnVmZmVyKHNpemVfdCAqaW5kZXgsIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpidWZmZXIpIHsKKyAgICBzcDxDb2RlYzJCdWZmZXI+IGMyQnVmZmVyOworICAgIHN0YXR1c190IGVyciA9IG1JbXBsLmdyYWJCdWZmZXIoaW5kZXgsICZjMkJ1ZmZlcik7CisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBjMkJ1ZmZlci0+c2V0Rm9ybWF0KG1Gb3JtYXQpOworICAgICAgICBoYW5kbGVJbWFnZURhdGEoYzJCdWZmZXIpOworICAgICAgICAqYnVmZmVyID0gYzJCdWZmZXI7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgSW5wdXRCdWZmZXJzQXJyYXk6OnJlbGVhc2VCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyLAorICAgICAgICBib29sIHJlbGVhc2UpIHsKKyAgICByZXR1cm4gbUltcGwucmV0dXJuQnVmZmVyKGJ1ZmZlciwgYzJidWZmZXIsIHJlbGVhc2UpOworfQorCitib29sIElucHV0QnVmZmVyc0FycmF5OjpleHBpcmVDb21wb25lbnRCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmMyYnVmZmVyKSB7CisgICAgcmV0dXJuIG1JbXBsLmV4cGlyZUNvbXBvbmVudEJ1ZmZlcihjMmJ1ZmZlcik7Cit9CisKK3ZvaWQgSW5wdXRCdWZmZXJzQXJyYXk6OmZsdXNoKCkgeworICAgIG1JbXBsLmZsdXNoKCk7Cit9CisKK3NpemVfdCBJbnB1dEJ1ZmZlcnNBcnJheTo6bnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwubnVtQ2xpZW50QnVmZmVycygpOworfQorCitzcDxDb2RlYzJCdWZmZXI+IElucHV0QnVmZmVyc0FycmF5OjpjcmVhdGVOZXdCdWZmZXIoKSB7CisgICAgcmV0dXJuIG1BbGxvY2F0ZSgpOworfQorCisvLyBMaW5lYXJJbnB1dEJ1ZmZlcnMKKworYm9vbCBMaW5lYXJJbnB1dEJ1ZmZlcnM6OnJlcXVlc3ROZXdCdWZmZXIoc2l6ZV90ICppbmRleCwgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmJ1ZmZlcikgeworICAgIHNwPENvZGVjMkJ1ZmZlcj4gbmV3QnVmZmVyID0gY3JlYXRlTmV3QnVmZmVyKCk7CisgICAgaWYgKG5ld0J1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgKmluZGV4ID0gbUltcGwuYXNzaWduU2xvdChuZXdCdWZmZXIpOworICAgICpidWZmZXIgPSBuZXdCdWZmZXI7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTGluZWFySW5wdXRCdWZmZXJzOjpyZWxlYXNlQnVmZmVyKAorICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlciwKKyAgICAgICAgYm9vbCByZWxlYXNlKSB7CisgICAgcmV0dXJuIG1JbXBsLnJlbGVhc2VTbG90KGJ1ZmZlciwgYzJidWZmZXIsIHJlbGVhc2UpOworfQorCitib29sIExpbmVhcklucHV0QnVmZmVyczo6ZXhwaXJlQ29tcG9uZW50QnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgeworICAgIHJldHVybiBtSW1wbC5leHBpcmVDb21wb25lbnRCdWZmZXIoYzJidWZmZXIpOworfQorCit2b2lkIExpbmVhcklucHV0QnVmZmVyczo6Zmx1c2goKSB7CisgICAgLy8gVGhpcyBpcyBuby1vcCBieSBkZWZhdWx0IHVubGVzcyB3ZSdyZSBpbiBhcnJheSBtb2RlIHdoZXJlIHdlIG5lZWQgdG8ga2VlcAorICAgIC8vIHRyYWNrIG9mIHRoZSBmbHVzaGVkIHdvcmsuCisgICAgbUltcGwuZmx1c2goKTsKK30KKworc3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4gTGluZWFySW5wdXRCdWZmZXJzOjp0b0FycmF5TW9kZShzaXplX3Qgc2l6ZSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnNBcnJheT4gYXJyYXkoCisgICAgICAgICAgICBuZXcgSW5wdXRCdWZmZXJzQXJyYXkobUNvbXBvbmVudE5hbWUuY19zdHIoKSwgIjFELUlucHV0W05dIikpOworICAgIGFycmF5LT5zZXRQb29sKG1Qb29sKTsKKyAgICBhcnJheS0+c2V0Rm9ybWF0KG1Gb3JtYXQpOworICAgIGFycmF5LT5pbml0aWFsaXplKAorICAgICAgICAgICAgbUltcGwsCisgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgW3Bvb2wgPSBtUG9vbCwgZm9ybWF0ID0gbUZvcm1hdF0gKCkgLT4gc3A8Q29kZWMyQnVmZmVyPiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFsbG9jKHBvb2wsIGZvcm1hdCk7CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gc3RkOjptb3ZlKGFycmF5KTsKK30KKworc2l6ZV90IExpbmVhcklucHV0QnVmZmVyczo6bnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwubnVtQ2xpZW50QnVmZmVycygpOworfQorCisvLyBzdGF0aWMKK3NwPENvZGVjMkJ1ZmZlcj4gTGluZWFySW5wdXRCdWZmZXJzOjpBbGxvYygKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKKyAgICBpbnQzMl90IGNhcGFjaXR5ID0ga0xpbmVhckJ1ZmZlclNpemU7CisgICAgKHZvaWQpZm9ybWF0LT5maW5kSW50MzIoS0VZX01BWF9JTlBVVF9TSVpFLCAmY2FwYWNpdHkpOworICAgIGlmICgoc2l6ZV90KWNhcGFjaXR5ID4ga01heExpbmVhckJ1ZmZlclNpemUpIHsKKyAgICAgICAgQUxPR0QoImNsaWVudCByZXF1ZXN0ZWQgJWQsIGNhcHBlZCB0byAlenUiLCBjYXBhY2l0eSwga01heExpbmVhckJ1ZmZlclNpemUpOworICAgICAgICBjYXBhY2l0eSA9IGtNYXhMaW5lYXJCdWZmZXJTaXplOworICAgIH0KKworICAgIC8vIFRPRE86IHJlYWQgdXNhZ2UgZnJvbSBpbnRmCisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soY2FwYWNpdHksIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIExpbmVhckJsb2NrQnVmZmVyOjpBbGxvY2F0ZShmb3JtYXQsIGJsb2NrKTsKK30KKworc3A8Q29kZWMyQnVmZmVyPiBMaW5lYXJJbnB1dEJ1ZmZlcnM6OmNyZWF0ZU5ld0J1ZmZlcigpIHsKKyAgICByZXR1cm4gQWxsb2MobVBvb2wsIG1Gb3JtYXQpOworfQorCisvLyBFbmNyeXB0ZWRMaW5lYXJJbnB1dEJ1ZmZlcnMKKworRW5jcnlwdGVkTGluZWFySW5wdXRCdWZmZXJzOjpFbmNyeXB0ZWRMaW5lYXJJbnB1dEJ1ZmZlcnMoCisgICAgICAgIGJvb2wgc2VjdXJlLAorICAgICAgICBjb25zdCBzcDxNZW1vcnlEZWFsZXI+ICZkZWFsZXIsCisgICAgICAgIGNvbnN0IHNwPElDcnlwdG8+ICZjcnlwdG8sCisgICAgICAgIGludDMyX3QgaGVhcFNlcU51bSwKKyAgICAgICAgc2l6ZV90IGNhcGFjaXR5LAorICAgICAgICBzaXplX3QgbnVtSW5wdXRTbG90cywKKyAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSkKKyAgICA6IExpbmVhcklucHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSwKKyAgICAgIG1Vc2FnZSh7MCwgMH0pLAorICAgICAgbURlYWxlcihkZWFsZXIpLAorICAgICAgbUNyeXB0byhjcnlwdG8pLAorICAgICAgbU1lbW9yeVZlY3RvcihuZXcgc3RkOjp2ZWN0b3I8RW50cnk+KXsKKyAgICBpZiAoc2VjdXJlKSB7CisgICAgICAgIG1Vc2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6UkVBRF9QUk9URUNURUQsIDAgfTsKKyAgICB9IGVsc2UgeworICAgICAgICBtVXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1JbnB1dFNsb3RzOyArK2kpIHsKKyAgICAgICAgc3A8SU1lbW9yeT4gbWVtb3J5ID0gbURlYWxlci0+YWxsb2NhdGUoY2FwYWNpdHkpOworICAgICAgICBpZiAobWVtb3J5ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dEKCJbJXNdIEZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZnJvbSBkZWFsZXI6IG9ubHkgJXp1IHNsb3RzIGFsbG9jYXRlZCIsCisgICAgICAgICAgICAgICAgICBtTmFtZSwgaSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBtTWVtb3J5VmVjdG9yLT5wdXNoX2JhY2soe3N0ZDo6d2Vha19wdHI8QzJMaW5lYXJCbG9jaz4oKSwgbWVtb3J5LCBoZWFwU2VxTnVtfSk7CisgICAgfQorfQorCitzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPiBFbmNyeXB0ZWRMaW5lYXJJbnB1dEJ1ZmZlcnM6OnRvQXJyYXlNb2RlKHNpemVfdCBzaXplKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVyc0FycmF5PiBhcnJheSgKKyAgICAgICAgICAgIG5ldyBJbnB1dEJ1ZmZlcnNBcnJheShtQ29tcG9uZW50TmFtZS5jX3N0cigpLCAiMUQtRW5jcnlwdGVkSW5wdXRbTl0iKSk7CisgICAgYXJyYXktPnNldFBvb2wobVBvb2wpOworICAgIGFycmF5LT5zZXRGb3JtYXQobUZvcm1hdCk7CisgICAgYXJyYXktPmluaXRpYWxpemUoCisgICAgICAgICAgICBtSW1wbCwKKyAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICBbcG9vbCA9IG1Qb29sLAorICAgICAgICAgICAgIGZvcm1hdCA9IG1Gb3JtYXQsCisgICAgICAgICAgICAgdXNhZ2UgPSBtVXNhZ2UsCisgICAgICAgICAgICAgbWVtb3J5VmVjdG9yID0gbU1lbW9yeVZlY3Rvcl0gKCkgLT4gc3A8Q29kZWMyQnVmZmVyPiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFsbG9jKHBvb2wsIGZvcm1hdCwgdXNhZ2UsIG1lbW9yeVZlY3Rvcik7CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gc3RkOjptb3ZlKGFycmF5KTsKK30KKworCisvLyBzdGF0aWMKK3NwPENvZGVjMkJ1ZmZlcj4gRW5jcnlwdGVkTGluZWFySW5wdXRCdWZmZXJzOjpBbGxvYygKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3RvcjxFbmNyeXB0ZWRMaW5lYXJJbnB1dEJ1ZmZlcnM6OkVudHJ5Pj4gJm1lbW9yeVZlY3RvcikgeworICAgIGludDMyX3QgY2FwYWNpdHkgPSBrTGluZWFyQnVmZmVyU2l6ZTsKKyAgICAodm9pZClmb3JtYXQtPmZpbmRJbnQzMihLRVlfTUFYX0lOUFVUX1NJWkUsICZjYXBhY2l0eSk7CisgICAgaWYgKChzaXplX3QpY2FwYWNpdHkgPiBrTWF4TGluZWFyQnVmZmVyU2l6ZSkgeworICAgICAgICBBTE9HRCgiY2xpZW50IHJlcXVlc3RlZCAlZCwgY2FwcGVkIHRvICV6dSIsIGNhcGFjaXR5LCBrTWF4TGluZWFyQnVmZmVyU2l6ZSk7CisgICAgICAgIGNhcGFjaXR5ID0ga01heExpbmVhckJ1ZmZlclNpemU7CisgICAgfQorCisgICAgc3A8SU1lbW9yeT4gbWVtb3J5OworICAgIHNpemVfdCBzbG90ID0gMDsKKyAgICBpbnQzMl90IGhlYXBTZXFOdW0gPSAtMTsKKyAgICBmb3IgKDsgc2xvdCA8IG1lbW9yeVZlY3Rvci0+c2l6ZSgpOyArK3Nsb3QpIHsKKyAgICAgICAgaWYgKG1lbW9yeVZlY3Rvci0+YXQoc2xvdCkuYmxvY2suZXhwaXJlZCgpKSB7CisgICAgICAgICAgICBtZW1vcnkgPSBtZW1vcnlWZWN0b3ItPmF0KHNsb3QpLm1lbW9yeTsKKyAgICAgICAgICAgIGhlYXBTZXFOdW0gPSBtZW1vcnlWZWN0b3ItPmF0KHNsb3QpLmhlYXBTZXFOdW07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobWVtb3J5ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soY2FwYWNpdHksIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0sgfHwgYmxvY2sgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBtZW1vcnlWZWN0b3ItPmF0KHNsb3QpLmJsb2NrID0gYmxvY2s7CisgICAgcmV0dXJuIG5ldyBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcihmb3JtYXQsIGJsb2NrLCBtZW1vcnksIGhlYXBTZXFOdW0pOworfQorCitzcDxDb2RlYzJCdWZmZXI+IEVuY3J5cHRlZExpbmVhcklucHV0QnVmZmVyczo6Y3JlYXRlTmV3QnVmZmVyKCkgeworICAgIC8vIFRPRE86IGFuZHJvaWRfMjAyMAorICAgIHJldHVybiBudWxscHRyOworfQorCisvLyBHcmFwaGljTWV0YWRhdGFJbnB1dEJ1ZmZlcnMKKworR3JhcGhpY01ldGFkYXRhSW5wdXRCdWZmZXJzOjpHcmFwaGljTWV0YWRhdGFJbnB1dEJ1ZmZlcnMoCisgICAgICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUpCisgICAgOiBJbnB1dEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSksCisgICAgICBtSW1wbChtTmFtZSksCisgICAgICBtU3RvcmUoR2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpKSB7IH0KKworYm9vbCBHcmFwaGljTWV0YWRhdGFJbnB1dEJ1ZmZlcnM6OnJlcXVlc3ROZXdCdWZmZXIoCisgICAgICAgIHNpemVfdCAqaW5kZXgsIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpidWZmZXIpIHsKKyAgICBzcDxDb2RlYzJCdWZmZXI+IG5ld0J1ZmZlciA9IGNyZWF0ZU5ld0J1ZmZlcigpOworICAgIGlmIChuZXdCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgICppbmRleCA9IG1JbXBsLmFzc2lnblNsb3QobmV3QnVmZmVyKTsKKyAgICAqYnVmZmVyID0gbmV3QnVmZmVyOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEdyYXBoaWNNZXRhZGF0YUlucHV0QnVmZmVyczo6cmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIsCisgICAgICAgIGJvb2wgcmVsZWFzZSkgeworICAgIHJldHVybiBtSW1wbC5yZWxlYXNlU2xvdChidWZmZXIsIGMyYnVmZmVyLCByZWxlYXNlKTsKK30KKworYm9vbCBHcmFwaGljTWV0YWRhdGFJbnB1dEJ1ZmZlcnM6OmV4cGlyZUNvbXBvbmVudEJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYzJidWZmZXIpIHsKKyAgICByZXR1cm4gbUltcGwuZXhwaXJlQ29tcG9uZW50QnVmZmVyKGMyYnVmZmVyKTsKK30KKwordm9pZCBHcmFwaGljTWV0YWRhdGFJbnB1dEJ1ZmZlcnM6OmZsdXNoKCkgeworICAgIC8vIFRoaXMgaXMgbm8tb3AgYnkgZGVmYXVsdCB1bmxlc3Mgd2UncmUgaW4gYXJyYXkgbW9kZSB3aGVyZSB3ZSBuZWVkIHRvIGtlZXAKKyAgICAvLyB0cmFjayBvZiB0aGUgZmx1c2hlZCB3b3JrLgorfQorCitzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPiBHcmFwaGljTWV0YWRhdGFJbnB1dEJ1ZmZlcnM6OnRvQXJyYXlNb2RlKAorICAgICAgICBzaXplX3Qgc2l6ZSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gYWxsb2M7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbVN0b3JlLT5mZXRjaEFsbG9jYXRvcihtUG9vbC0+Z2V0QWxsb2NhdG9ySWQoKSwgJmFsbG9jKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzQXJyYXk+IGFycmF5KAorICAgICAgICAgICAgbmV3IElucHV0QnVmZmVyc0FycmF5KG1Db21wb25lbnROYW1lLmNfc3RyKCksICIyRC1NZXRhSW5wdXRbTl0iKSk7CisgICAgYXJyYXktPnNldFBvb2wobVBvb2wpOworICAgIGFycmF5LT5zZXRGb3JtYXQobUZvcm1hdCk7CisgICAgYXJyYXktPmluaXRpYWxpemUoCisgICAgICAgICAgICBtSW1wbCwKKyAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICBbZm9ybWF0ID0gbUZvcm1hdCwgYWxsb2NdKCkgLT4gc3A8Q29kZWMyQnVmZmVyPiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBHcmFwaGljTWV0YWRhdGFCdWZmZXIoZm9ybWF0LCBhbGxvYyk7CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gc3RkOjptb3ZlKGFycmF5KTsKK30KKworc2l6ZV90IEdyYXBoaWNNZXRhZGF0YUlucHV0QnVmZmVyczo6bnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwubnVtQ2xpZW50QnVmZmVycygpOworfQorCitzcDxDb2RlYzJCdWZmZXI+IEdyYXBoaWNNZXRhZGF0YUlucHV0QnVmZmVyczo6Y3JlYXRlTmV3QnVmZmVyKCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gYWxsb2M7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbVN0b3JlLT5mZXRjaEFsbG9jYXRvcihtUG9vbC0+Z2V0QWxsb2NhdG9ySWQoKSwgJmFsbG9jKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gbmV3IEdyYXBoaWNNZXRhZGF0YUJ1ZmZlcihtRm9ybWF0LCBhbGxvYyk7Cit9CisKKy8vIEdyYXBoaWNJbnB1dEJ1ZmZlcnMKKworR3JhcGhpY0lucHV0QnVmZmVyczo6R3JhcGhpY0lucHV0QnVmZmVycygKKyAgICAgICAgc2l6ZV90IG51bUlucHV0U2xvdHMsIGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUpCisgICAgOiBJbnB1dEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSksCisgICAgICBtSW1wbChtTmFtZSksCisgICAgICBtTG9jYWxCdWZmZXJQb29sKExvY2FsQnVmZmVyUG9vbDo6Q3JlYXRlKAorICAgICAgICAgICAgICBrTWF4TGluZWFyQnVmZmVyU2l6ZSAqIG51bUlucHV0U2xvdHMpKSB7IH0KKworYm9vbCBHcmFwaGljSW5wdXRCdWZmZXJzOjpyZXF1ZXN0TmV3QnVmZmVyKHNpemVfdCAqaW5kZXgsIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpidWZmZXIpIHsKKyAgICBzcDxDb2RlYzJCdWZmZXI+IG5ld0J1ZmZlciA9IGNyZWF0ZU5ld0J1ZmZlcigpOworICAgIGlmIChuZXdCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgICppbmRleCA9IG1JbXBsLmFzc2lnblNsb3QobmV3QnVmZmVyKTsKKyAgICBoYW5kbGVJbWFnZURhdGEobmV3QnVmZmVyKTsKKyAgICAqYnVmZmVyID0gbmV3QnVmZmVyOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEdyYXBoaWNJbnB1dEJ1ZmZlcnM6OnJlbGVhc2VCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyLAorICAgICAgICBib29sIHJlbGVhc2UpIHsKKyAgICByZXR1cm4gbUltcGwucmVsZWFzZVNsb3QoYnVmZmVyLCBjMmJ1ZmZlciwgcmVsZWFzZSk7Cit9CisKK2Jvb2wgR3JhcGhpY0lucHV0QnVmZmVyczo6ZXhwaXJlQ29tcG9uZW50QnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgeworICAgIHJldHVybiBtSW1wbC5leHBpcmVDb21wb25lbnRCdWZmZXIoYzJidWZmZXIpOworfQorCit2b2lkIEdyYXBoaWNJbnB1dEJ1ZmZlcnM6OmZsdXNoKCkgeworICAgIC8vIFRoaXMgaXMgbm8tb3AgYnkgZGVmYXVsdCB1bmxlc3Mgd2UncmUgaW4gYXJyYXkgbW9kZSB3aGVyZSB3ZSBuZWVkIHRvIGtlZXAKKyAgICAvLyB0cmFjayBvZiB0aGUgZmx1c2hlZCB3b3JrLgorfQorCitzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPiBHcmFwaGljSW5wdXRCdWZmZXJzOjp0b0FycmF5TW9kZShzaXplX3Qgc2l6ZSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnNBcnJheT4gYXJyYXkoCisgICAgICAgICAgICBuZXcgSW5wdXRCdWZmZXJzQXJyYXkobUNvbXBvbmVudE5hbWUuY19zdHIoKSwgIjJELUJCLUlucHV0W05dIikpOworICAgIGFycmF5LT5zZXRQb29sKG1Qb29sKTsKKyAgICBhcnJheS0+c2V0Rm9ybWF0KG1Gb3JtYXQpOworICAgIGFycmF5LT5pbml0aWFsaXplKAorICAgICAgICAgICAgbUltcGwsCisgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgW3Bvb2wgPSBtUG9vbCwgZm9ybWF0ID0gbUZvcm1hdCwgbGJwID0gbUxvY2FsQnVmZmVyUG9vbF0oKSAtPiBzcDxDb2RlYzJCdWZmZXI+IHsKKyAgICAgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgICAgICAgICAgcmV0dXJuIEFsbG9jYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvb2wsIGZvcm1hdCwgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyLCB1c2FnZSwgbGJwKTsKKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBzdGQ6Om1vdmUoYXJyYXkpOworfQorCitzaXplX3QgR3JhcGhpY0lucHV0QnVmZmVyczo6bnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwubnVtQ2xpZW50QnVmZmVycygpOworfQorCitzcDxDb2RlYzJCdWZmZXI+IEdyYXBoaWNJbnB1dEJ1ZmZlcnM6OmNyZWF0ZU5ld0J1ZmZlcigpIHsKKyAgICAvLyBUT0RPOiByZWFkIHVzYWdlIGZyb20gaW50ZgorICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICByZXR1cm4gQWxsb2NhdGVHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgbVBvb2wsIG1Gb3JtYXQsIEhBTF9QSVhFTF9GT1JNQVRfWVYxMiwgdXNhZ2UsIG1Mb2NhbEJ1ZmZlclBvb2wpOworfQorCisvLyBPdXRwdXRCdWZmZXJzQXJyYXkKKwordm9pZCBPdXRwdXRCdWZmZXJzQXJyYXk6OmluaXRpYWxpemUoCisgICAgICAgIGNvbnN0IEZsZXhCdWZmZXJzSW1wbCAmaW1wbCwKKyAgICAgICAgc2l6ZV90IG1pblNpemUsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3A8Q29kZWMyQnVmZmVyPigpPiBhbGxvY2F0ZSkgeworICAgIG1BbGxvYyA9IGFsbG9jYXRlOworICAgIG1JbXBsLmluaXRpYWxpemUoaW1wbCwgbWluU2l6ZSwgYWxsb2NhdGUpOworfQorCitzdGF0dXNfdCBPdXRwdXRCdWZmZXJzQXJyYXk6OnJlZ2lzdGVyQnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIsCisgICAgICAgIHNpemVfdCAqaW5kZXgsCisgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpjbGllbnRCdWZmZXIpIHsKKyAgICBzcDxDb2RlYzJCdWZmZXI+IGMyQnVmZmVyOworICAgIHN0YXR1c190IGVyciA9IG1JbXBsLmdyYWJCdWZmZXIoCisgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICZjMkJ1ZmZlciwKKyAgICAgICAgICAgIFtidWZmZXJdKGNvbnN0IHNwPENvZGVjMkJ1ZmZlcj4gJmNsaWVudEJ1ZmZlcikgeworICAgICAgICAgICAgICAgIHJldHVybiBjbGllbnRCdWZmZXItPmNhbkNvcHkoYnVmZmVyKTsKKyAgICAgICAgICAgIH0pOworICAgIGlmIChlcnIgPT0gV09VTERfQkxPQ0spIHsKKyAgICAgICAgQUxPR1YoIlslc10gYnVmZmVycyB0ZW1wb3JhcmlseSBub3QgYXZhaWxhYmxlIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dEKCJbJXNdIGdyYWJCdWZmZXIgZmFpbGVkOiAlZCIsIG1OYW1lLCBlcnIpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBjMkJ1ZmZlci0+c2V0Rm9ybWF0KG1Gb3JtYXQpOworICAgIGlmICghYzJCdWZmZXItPmNvcHkoYnVmZmVyKSkgeworICAgICAgICBBTE9HRCgiWyVzXSBjb3B5IGJ1ZmZlciBmYWlsZWQiLCBtTmFtZSk7CisgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICB9CisgICAgc3VibWl0KGMyQnVmZmVyKTsKKyAgICBoYW5kbGVJbWFnZURhdGEoYzJCdWZmZXIpOworICAgICpjbGllbnRCdWZmZXIgPSBjMkJ1ZmZlcjsKKyAgICBBTE9HVigiWyVzXSBncmFiYmVkIGJ1ZmZlciAlenUiLCBtTmFtZSwgKmluZGV4KTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE91dHB1dEJ1ZmZlcnNBcnJheTo6cmVnaXN0ZXJDc2QoCisgICAgICAgIGNvbnN0IEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQgKmNzZCwKKyAgICAgICAgc2l6ZV90ICppbmRleCwKKyAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmNsaWVudEJ1ZmZlcikgeworICAgIHNwPENvZGVjMkJ1ZmZlcj4gYzJCdWZmZXI7CisgICAgc3RhdHVzX3QgZXJyID0gbUltcGwuZ3JhYkJ1ZmZlcigKKyAgICAgICAgICAgIGluZGV4LAorICAgICAgICAgICAgJmMyQnVmZmVyLAorICAgICAgICAgICAgW2NzZF0oY29uc3Qgc3A8Q29kZWMyQnVmZmVyPiAmY2xpZW50QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNsaWVudEJ1ZmZlci0+YmFzZSgpICE9IG51bGxwdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGNsaWVudEJ1ZmZlci0+Y2FwYWNpdHkoKSA+PSBjc2QtPmZsZXhDb3VudCgpOworICAgICAgICAgICAgfSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBtZW1jcHkoYzJCdWZmZXItPmJhc2UoKSwgY3NkLT5tLnZhbHVlLCBjc2QtPmZsZXhDb3VudCgpKTsKKyAgICBjMkJ1ZmZlci0+c2V0UmFuZ2UoMCwgY3NkLT5mbGV4Q291bnQoKSk7CisgICAgYzJCdWZmZXItPnNldEZvcm1hdChtRm9ybWF0KTsKKyAgICAqY2xpZW50QnVmZmVyID0gYzJCdWZmZXI7CisgICAgcmV0dXJuIE9LOworfQorCitib29sIE91dHB1dEJ1ZmZlcnNBcnJheTo6cmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIpIHsKKyAgICByZXR1cm4gbUltcGwucmV0dXJuQnVmZmVyKGJ1ZmZlciwgYzJidWZmZXIsIHRydWUpOworfQorCit2b2lkIE91dHB1dEJ1ZmZlcnNBcnJheTo6Zmx1c2goY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmZmx1c2hlZFdvcmspIHsKKyAgICAodm9pZClmbHVzaGVkV29yazsKKyAgICBtSW1wbC5mbHVzaCgpOworICAgIGlmIChtU2tpcEN1dEJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgIG1Ta2lwQ3V0QnVmZmVyLT5jbGVhcigpOworICAgIH0KK30KKwordm9pZCBPdXRwdXRCdWZmZXJzQXJyYXk6OmdldEFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSBjb25zdCB7CisgICAgbUltcGwuZ2V0QXJyYXkoYXJyYXkpOworfQorCitzaXplX3QgT3V0cHV0QnVmZmVyc0FycmF5OjpudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC5udW1DbGllbnRCdWZmZXJzKCk7Cit9CisKK3ZvaWQgT3V0cHV0QnVmZmVyc0FycmF5OjpyZWFsbG9jKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmMyYnVmZmVyKSB7CisgICAgc3dpdGNoIChjMmJ1ZmZlci0+ZGF0YSgpLnR5cGUoKSkgeworICAgICAgICBjYXNlIEMyQnVmZmVyRGF0YTo6TElORUFSOiB7CisgICAgICAgICAgICB1aW50MzJfdCBzaXplID0ga0xpbmVhckJ1ZmZlclNpemU7CisgICAgICAgICAgICBjb25zdCBDMkNvbnN0TGluZWFyQmxvY2sgJmJsb2NrID0gYzJidWZmZXItPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpOworICAgICAgICAgICAgaWYgKGJsb2NrLnNpemUoKSA8IGtNYXhMaW5lYXJCdWZmZXJTaXplIC8gMikgeworICAgICAgICAgICAgICAgIHNpemUgPSBibG9jay5zaXplKCkgKiAyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzaXplID0ga01heExpbmVhckJ1ZmZlclNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQWxsb2MgPSBbZm9ybWF0ID0gbUZvcm1hdCwgc2l6ZV0geworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTG9jYWxMaW5lYXJCdWZmZXIoZm9ybWF0LCBuZXcgQUJ1ZmZlcihzaXplKSk7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydAorICAgICAgICBjYXNlIEMyQnVmZmVyRGF0YTo6R1JBUEhJQzogICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisKKyAgICAgICAgY2FzZSBDMkJ1ZmZlckRhdGE6OklOVkFMSUQ6ICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICBjYXNlIEMyQnVmZmVyRGF0YTo6TElORUFSX0NIVU5LUzogICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgIGNhc2UgQzJCdWZmZXJEYXRhOjpHUkFQSElDX0NIVU5LUzogIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dEKCJVbnN1cHBvcnRlZCB0eXBlOiAlZCIsIChpbnQpYzJidWZmZXItPmRhdGEoKS50eXBlKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtSW1wbC5yZWFsbG9jKG1BbGxvYyk7Cit9CisKK3ZvaWQgT3V0cHV0QnVmZmVyc0FycmF5Ojpncm93KHNpemVfdCBuZXdTaXplKSB7CisgICAgbUltcGwuZ3JvdyhuZXdTaXplLCBtQWxsb2MpOworfQorCisvLyBGbGV4T3V0cHV0QnVmZmVycworCitzdGF0dXNfdCBGbGV4T3V0cHV0QnVmZmVyczo6cmVnaXN0ZXJCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgc2l6ZV90ICppbmRleCwKKyAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmNsaWVudEJ1ZmZlcikgeworICAgIHNwPENvZGVjMkJ1ZmZlcj4gbmV3QnVmZmVyID0gd3JhcChidWZmZXIpOworICAgIGlmIChuZXdCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKyAgICBuZXdCdWZmZXItPnNldEZvcm1hdChtRm9ybWF0KTsKKyAgICAqaW5kZXggPSBtSW1wbC5hc3NpZ25TbG90KG5ld0J1ZmZlcik7CisgICAgaGFuZGxlSW1hZ2VEYXRhKG5ld0J1ZmZlcik7CisgICAgKmNsaWVudEJ1ZmZlciA9IG5ld0J1ZmZlcjsKKyAgICBBTE9HVigiWyVzXSByZWdpc3RlcmVkIGJ1ZmZlciAlenUiLCBtTmFtZSwgKmluZGV4KTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEZsZXhPdXRwdXRCdWZmZXJzOjpyZWdpc3RlckNzZCgKKyAgICAgICAgY29uc3QgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dCAqY3NkLAorICAgICAgICBzaXplX3QgKmluZGV4LAorICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqY2xpZW50QnVmZmVyKSB7CisgICAgc3A8Q29kZWMyQnVmZmVyPiBuZXdCdWZmZXIgPSBuZXcgTG9jYWxMaW5lYXJCdWZmZXIoCisgICAgICAgICAgICBtRm9ybWF0LCBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoY3NkLT5tLnZhbHVlLCBjc2QtPmZsZXhDb3VudCgpKSk7CisgICAgKmluZGV4ID0gbUltcGwuYXNzaWduU2xvdChuZXdCdWZmZXIpOworICAgICpjbGllbnRCdWZmZXIgPSBuZXdCdWZmZXI7CisgICAgcmV0dXJuIE9LOworfQorCitib29sIEZsZXhPdXRwdXRCdWZmZXJzOjpyZWxlYXNlQnVmZmVyKAorICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlcikgeworICAgIHJldHVybiBtSW1wbC5yZWxlYXNlU2xvdChidWZmZXIsIGMyYnVmZmVyLCB0cnVlKTsKK30KKwordm9pZCBGbGV4T3V0cHV0QnVmZmVyczo6Zmx1c2goCisgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJmZsdXNoZWRXb3JrKSB7CisgICAgKHZvaWQpIGZsdXNoZWRXb3JrOworICAgIC8vIFRoaXMgaXMgbm8tb3AgYnkgZGVmYXVsdCB1bmxlc3Mgd2UncmUgaW4gYXJyYXkgbW9kZSB3aGVyZSB3ZSBuZWVkIHRvIGtlZXAKKyAgICAvLyB0cmFjayBvZiB0aGUgZmx1c2hlZCB3b3JrLgorfQorCitzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0QnVmZmVycz4gRmxleE91dHB1dEJ1ZmZlcnM6OnRvQXJyYXlNb2RlKHNpemVfdCBzaXplKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnNBcnJheT4gYXJyYXkobmV3IE91dHB1dEJ1ZmZlcnNBcnJheShtQ29tcG9uZW50TmFtZS5jX3N0cigpKSk7CisgICAgYXJyYXktPnNldEZvcm1hdChtRm9ybWF0KTsKKyAgICBhcnJheS0+dHJhbnNmZXJTa2lwQ3V0QnVmZmVyKG1Ta2lwQ3V0QnVmZmVyKTsKKyAgICBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjMkJ1ZmZlcj4oKT4gYWxsb2MgPSBnZXRBbGxvYygpOworICAgIGFycmF5LT5pbml0aWFsaXplKG1JbXBsLCBzaXplLCBhbGxvYyk7CisgICAgcmV0dXJuIHN0ZDo6bW92ZShhcnJheSk7Cit9CisKK3NpemVfdCBGbGV4T3V0cHV0QnVmZmVyczo6bnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwubnVtQ2xpZW50QnVmZmVycygpOworfQorCisvLyBMaW5lYXJPdXRwdXRCdWZmZXJzCisKK3ZvaWQgTGluZWFyT3V0cHV0QnVmZmVyczo6Zmx1c2goCisgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJmZsdXNoZWRXb3JrKSB7CisgICAgaWYgKG1Ta2lwQ3V0QnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVNraXBDdXRCdWZmZXItPmNsZWFyKCk7CisgICAgfQorICAgIEZsZXhPdXRwdXRCdWZmZXJzOjpmbHVzaChmbHVzaGVkV29yayk7Cit9CisKK3NwPENvZGVjMkJ1ZmZlcj4gTGluZWFyT3V0cHV0QnVmZmVyczo6d3JhcChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1YoIlslc10gdXNpbmcgYSBkdW1teSBidWZmZXIiLCBtTmFtZSk7CisgICAgICAgIHJldHVybiBuZXcgTG9jYWxMaW5lYXJCdWZmZXIobUZvcm1hdCwgbmV3IEFCdWZmZXIoMCkpOworICAgIH0KKyAgICBpZiAoYnVmZmVyLT5kYXRhKCkudHlwZSgpICE9IEMyQnVmZmVyRGF0YTo6TElORUFSKSB7CisgICAgICAgIEFMT0dWKCJbJXNdIG5vbi1saW5lYXIgYnVmZmVyICVkIiwgbU5hbWUsIGJ1ZmZlci0+ZGF0YSgpLnR5cGUoKSk7CisgICAgICAgIC8vIFdlIGV4cGVjdCBsaW5lYXIgb3V0cHV0IGJ1ZmZlcnMgZnJvbSB0aGUgY29tcG9uZW50LgorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLnNpemUoKSAhPSAxdSkgeworICAgICAgICBBTE9HVigiWyVzXSBubyBsaW5lYXIgYnVmZmVycyIsIG1OYW1lKTsKKyAgICAgICAgLy8gV2UgZXhwZWN0IG9uZSBhbmQgb25seSBvbmUgbGluZWFyIGJsb2NrIGZyb20gdGhlIGNvbXBvbmVudC4KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHNwPENvZGVjMkJ1ZmZlcj4gY2xpZW50QnVmZmVyID0gQ29uc3RMaW5lYXJCbG9ja0J1ZmZlcjo6QWxsb2NhdGUobUZvcm1hdCwgYnVmZmVyKTsKKyAgICBpZiAoY2xpZW50QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIlslc10gQ29uc3RMaW5lYXJCbG9ja0J1ZmZlcjo6QWxsb2NhdGUgZmFpbGVkIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3VibWl0KGNsaWVudEJ1ZmZlcik7CisgICAgcmV0dXJuIGNsaWVudEJ1ZmZlcjsKK30KKworc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+KCk+IExpbmVhck91dHB1dEJ1ZmZlcnM6OmdldEFsbG9jKCkgeworICAgIHJldHVybiBbZm9ybWF0ID0gbUZvcm1hdF17CisgICAgICAgIC8vIFRPRE86IHByb3BlciBtYXggb3V0cHV0IHNpemUKKyAgICAgICAgcmV0dXJuIG5ldyBMb2NhbExpbmVhckJ1ZmZlcihmb3JtYXQsIG5ldyBBQnVmZmVyKGtMaW5lYXJCdWZmZXJTaXplKSk7CisgICAgfTsKK30KKworLy8gR3JhcGhpY091dHB1dEJ1ZmZlcnMKKworc3A8Q29kZWMyQnVmZmVyPiBHcmFwaGljT3V0cHV0QnVmZmVyczo6d3JhcChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICByZXR1cm4gbmV3IER1bW15Q29udGFpbmVyQnVmZmVyKG1Gb3JtYXQsIGJ1ZmZlcik7Cit9CisKK3N0ZDo6ZnVuY3Rpb248c3A8Q29kZWMyQnVmZmVyPigpPiBHcmFwaGljT3V0cHV0QnVmZmVyczo6Z2V0QWxsb2MoKSB7CisgICAgcmV0dXJuIFtmb3JtYXQgPSBtRm9ybWF0XXsKKyAgICAgICAgcmV0dXJuIG5ldyBEdW1teUNvbnRhaW5lckJ1ZmZlcihmb3JtYXQpOworICAgIH07Cit9CisKKy8vIFJhd0dyYXBoaWNPdXRwdXRCdWZmZXJzCisKK1Jhd0dyYXBoaWNPdXRwdXRCdWZmZXJzOjpSYXdHcmFwaGljT3V0cHV0QnVmZmVycygKKyAgICAgICAgc2l6ZV90IG51bU91dHB1dFNsb3RzLCBjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lKQorICAgIDogRmxleE91dHB1dEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSksCisgICAgICBtTG9jYWxCdWZmZXJQb29sKExvY2FsQnVmZmVyUG9vbDo6Q3JlYXRlKAorICAgICAgICAgICAgICBrTWF4TGluZWFyQnVmZmVyU2l6ZSAqIG51bU91dHB1dFNsb3RzKSkgeyB9CisKK3NwPENvZGVjMkJ1ZmZlcj4gUmF3R3JhcGhpY091dHB1dEJ1ZmZlcnM6OndyYXAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gYzJidWZmZXIgPSBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGVFbXB0eSgKKyAgICAgICAgICAgICAgICBtRm9ybWF0LAorICAgICAgICAgICAgICAgIFtsYnAgPSBtTG9jYWxCdWZmZXJQb29sXShzaXplX3QgY2FwYWNpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxicC0+bmV3QnVmZmVyKGNhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKGMyYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dEKCJbJXNdIENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpBbGxvY2F0ZUVtcHR5IGZhaWxlZCIsIG1OYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGMyYnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKKyAgICAgICAgcmV0dXJuIGMyYnVmZmVyOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGUoCisgICAgICAgICAgICAgICAgbUZvcm1hdCwKKyAgICAgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICAgICAgW2xicCA9IG1Mb2NhbEJ1ZmZlclBvb2xdKHNpemVfdCBjYXBhY2l0eSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGJwLT5uZXdCdWZmZXIoY2FwYWNpdHkpOworICAgICAgICAgICAgICAgIH0pOworICAgIH0KK30KKworc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+KCk+IFJhd0dyYXBoaWNPdXRwdXRCdWZmZXJzOjpnZXRBbGxvYygpIHsKKyAgICByZXR1cm4gW2Zvcm1hdCA9IG1Gb3JtYXQsIGxicCA9IG1Mb2NhbEJ1ZmZlclBvb2xdeworICAgICAgICByZXR1cm4gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlRW1wdHkoCisgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgIFtsYnBdKHNpemVfdCBjYXBhY2l0eSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGJwLT5uZXdCdWZmZXIoY2FwYWNpdHkpOworICAgICAgICAgICAgICAgIH0pOworICAgIH07Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVycy5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNGYyODA5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlcnMuaApAQCAtMCwwICsxLDg3MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0NPREVDX0JVRkZFUlNfSF8KKworI2RlZmluZSBDQ09ERUNfQlVGRkVSU19IXworCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgorCisjaW5jbHVkZSAiQ29kZWMyQnVmZmVyLmgiCisjaW5jbHVkZSAiU2tpcEN1dEJ1ZmZlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0ZXhwciBzaXplX3Qga0xpbmVhckJ1ZmZlclNpemUgPSAxMDQ4NTc2OworLy8gVGhpcyBjYW4gZml0IDRLIFJHQkEgZnJhbWUsIGFuZCBtb3N0IGxpa2VseSBjbGllbnQgd29uJ3QgbmVlZCBtb3JlIHRoYW4gdGhpcy4KK2NvbnN0ZXhwciBzaXplX3Qga01heExpbmVhckJ1ZmZlclNpemUgPSA0MDk2ICogMjMwNCAqIDQ7CisKKy8qKgorICogQmFzZSBjbGFzcyBmb3IgcmVwcmVzZW50YXRpb24gb2YgYnVmZmVycyBhdCBvbmUgcG9ydC4KKyAqLworY2xhc3MgQ0NvZGVjQnVmZmVycyB7CitwdWJsaWM6CisgICAgQ0NvZGVjQnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIkJ1ZmZlcnMiKQorICAgICAgICA6IG1Db21wb25lbnROYW1lKGNvbXBvbmVudE5hbWUpLAorICAgICAgICAgIG1DaGFubmVsTmFtZShzdGQ6OnN0cmluZyhjb21wb25lbnROYW1lKSArICI6IiArIG5hbWUpLAorICAgICAgICAgIG1OYW1lKG1DaGFubmVsTmFtZS5jX3N0cigpKSB7CisgICAgfQorICAgIHZpcnR1YWwgfkNDb2RlY0J1ZmZlcnMoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBTZXQgZm9ybWF0IGZvciBNZWRpYUNvZGVjLWZhY2luZyBidWZmZXJzLgorICAgICAqLworICAgIHZvaWQgc2V0Rm9ybWF0KGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGNvcHkgb2YgY3VycmVudCBmb3JtYXQuCisgICAgICovCisgICAgc3A8QU1lc3NhZ2U+IGR1cEZvcm1hdCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBidWZmZXJzIGFyZSBvcGVyYXRpbmcgdW5kZXIgYXJyYXkgbW9kZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgaXNBcnJheU1vZGUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgICAgLyoqCisgICAgICogRmlsbHMgdGhlIHZlY3RvciB3aXRoIE1lZGlhQ29kZWNCdWZmZXIncyBpZiBpbiBhcnJheSBtb2RlOyBvdGhlcndpc2UsCisgICAgICogbm8tb3AuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIGdldEFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKikgY29uc3Qge30KKworICAgIC8qKgorICAgICAqIFJldHVybiBudW1iZXIgb2YgYnVmZmVycyB0aGUgY2xpZW50IG93bnMuCisgICAgICovCisgICAgdmlydHVhbCBzaXplX3QgbnVtQ2xpZW50QnVmZmVycygpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEV4YW1pbmUgaW1hZ2UgZGF0YSBmcm9tIHRoZSBidWZmZXIgYW5kIHVwZGF0ZSB0aGUgZm9ybWF0IGlmIG5lY2Vzc2FyeS4KKyAgICAgKi8KKyAgICB2b2lkIGhhbmRsZUltYWdlRGF0YShjb25zdCBzcDxDb2RlYzJCdWZmZXI+ICZidWZmZXIpOworCitwcm90ZWN0ZWQ6CisgICAgc3RkOjpzdHJpbmcgbUNvbXBvbmVudE5hbWU7IC8vLzwgbmFtZSBvZiBjb21wb25lbnQgZm9yIGRlYnVnZ2luZworICAgIHN0ZDo6c3RyaW5nIG1DaGFubmVsTmFtZTsgLy8vPCBuYW1lIG9mIGNoYW5uZWwgZm9yIGRlYnVnZ2luZworICAgIGNvbnN0IGNoYXIgKm1OYW1lOyAvLy88IEMtc3RyaW5nIHZlcnNpb24gb2YgY2hhbm5lbCBuYW1lCisgICAgLy8gRm9ybWF0IHRvIGJlIHVzZWQgZm9yIGNyZWF0aW5nIE1lZGlhQ29kZWMtZmFjaW5nIGJ1ZmZlcnMuCisgICAgc3A8QU1lc3NhZ2U+IG1Gb3JtYXQ7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ0NvZGVjQnVmZmVycyk7Cit9OworCitjbGFzcyBJbnB1dEJ1ZmZlcnMgOiBwdWJsaWMgQ0NvZGVjQnVmZmVycyB7CitwdWJsaWM6CisgICAgSW5wdXRCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiSW5wdXRbXSIpCisgICAgICAgIDogQ0NvZGVjQnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKyAgICB2aXJ0dWFsIH5JbnB1dEJ1ZmZlcnMoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYSBibG9jayBwb29sIHRvIG9idGFpbiBpbnB1dCBtZW1vcnkgYmxvY2tzLgorICAgICAqLworICAgIHZvaWQgc2V0UG9vbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7IG1Qb29sID0gcG9vbDsgfQorCisgICAgLyoqCisgICAgICogR2V0IGEgbmV3IE1lZGlhQ29kZWNCdWZmZXIgZm9yIGlucHV0IGFuZCBpdHMgY29ycmVzcG9uZGluZyBpbmRleC4KKyAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIG5vIG5ldyBidWZmZXIgY2FuIGJlIG9idGFpbmVkIGF0IHRoZSBtb21lbnQuCisgICAgICovCisgICAgdmlydHVhbCBib29sIHJlcXVlc3ROZXdCdWZmZXIoc2l6ZV90ICppbmRleCwgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmJ1ZmZlcikgPSAwOworCisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGUgYnVmZmVyIG9idGFpbmVkIGZyb20gcmVxdWVzdE5ld0J1ZmZlcigpIGFuZCBnZXQgdGhlCisgICAgICogYXNzb2NpYXRlZCBDMkJ1ZmZlciBvYmplY3QgYmFjay4gUmV0dXJucyB0cnVlIGlmIHRoZSBidWZmZXIgd2FzIG9uIGZpbGUKKyAgICAgKiBhbmQgcmVsZWFzZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCByZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyLAorICAgICAgICAgICAgYm9vbCByZWxlYXNlKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIHRoZSBidWZmZXIgdGhhdCBpcyBubyBsb25nZXIgdXNlZCBieSB0aGUgY29kZWMgcHJvY2Vzcy4gUmV0dXJuCisgICAgICogdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgYnVmZmVyIHdhcyBvbiBmaWxlIGFuZCByZWxlYXNlZCBzdWNjZXNzZnVsbHkuCisgICAgICovCisgICAgdmlydHVhbCBib29sIGV4cGlyZUNvbXBvbmVudEJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmMyYnVmZmVyKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBGbHVzaCBpbnRlcm5hbCBzdGF0ZS4gQWZ0ZXIgdGhpcyBjYWxsLCBubyBpbmRleCBvciBidWZmZXIgcHJldmlvdXNseQorICAgICAqIHJldHVybmVkIGZyb20gcmVxdWVzdE5ld0J1ZmZlcigpIGlzIHZhbGlkLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBmbHVzaCgpID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhcnJheS1iYWNrZWQgdmVyc2lvbiBvZiBpbnB1dCBidWZmZXJzLiBUaGUgcmV0dXJuZWQgb2JqZWN0CisgICAgICogc2hhbGwgcmV0YWluIHRoZSBpbnRlcm5hbCBzdGF0ZSBzbyB0aGF0IGl0IHdpbGwgaG9ub3IgaW5kZXggYW5kCisgICAgICogYnVmZmVyIGZyb20gcHJldmlvdXMgY2FsbHMgb2YgcmVxdWVzdE5ld0J1ZmZlcigpLgorICAgICAqLworICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4gdG9BcnJheU1vZGUoc2l6ZV90IHNpemUpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgdGhlIGJ1ZmZlciBvYnRhaW5lZCBmcm9tIHJlcXVlc3ROZXdCdWZmZXIoKSwgYW5kIGNyZWF0ZSBhIGRlZXAKKyAgICAgKiBjb3B5IGNsb25lIG9mIHRoZSBidWZmZXIuCisgICAgICoKKyAgICAgKiBccmV0dXJuICB0aGUgZGVlcCBjb3B5IGNsb25lIG9mIHRoZSBidWZmZXI7IG51bGxwdHIgaWYgY2xvbmluZyBpcyBub3QKKyAgICAgKiAgICAgICAgICBwb3NzaWJsZS4KKyAgICAgKi8KKyAgICBzcDxDb2RlYzJCdWZmZXI+IGNsb25lQW5kUmVsZWFzZUJ1ZmZlcihjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgc3A8Q29kZWMyQnVmZmVyPiBjcmVhdGVOZXdCdWZmZXIoKSA9IDA7CisKKyAgICAvLyBQb29sIHRvIG9idGFpbiBibG9ja3MgZm9yIGlucHV0IGJ1ZmZlcnMuCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtUG9vbDsKKworcHJpdmF0ZToKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJbnB1dEJ1ZmZlcnMpOworfTsKKworY2xhc3MgT3V0cHV0QnVmZmVycyA6IHB1YmxpYyBDQ29kZWNCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBPdXRwdXRCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiT3V0cHV0IikKKyAgICAgICAgOiBDQ29kZWNCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpIHsgfQorICAgIHZpcnR1YWwgfk91dHB1dEJ1ZmZlcnMoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBvdXRwdXQgQzJCdWZmZXIgZnJvbSB0aGUgY29tcG9uZW50IGFuZCBvYnRhaW4gY29ycmVzcG9uZGluZworICAgICAqIGluZGV4IGFuZCBNZWRpYUNvZGVjQnVmZmVyIG9iamVjdC4gUmV0dXJucyBmYWxzZSBpZiByZWdpc3RyYXRpb24KKyAgICAgKiBmYWlscy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgc2l6ZV90ICppbmRleCwKKyAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpjbGllbnRCdWZmZXIpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGNvZGVjIHNwZWNpZmljIGRhdGEgYXMgYSBidWZmZXIgdG8gYmUgY29uc2lzdGVudCB3aXRoCisgICAgICogTWVkaWFDb2RlYyBiZWhhdmlvci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyQ3NkKAorICAgICAgICAgICAgY29uc3QgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dCAqIC8qIGNzZCAqLywKKyAgICAgICAgICAgIHNpemVfdCAqIC8qIGluZGV4ICovLAorICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKiAvKiBjbGllbnRCdWZmZXIgKi8pID0gMDsKKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgdGhlIGJ1ZmZlciBvYnRhaW5lZCBmcm9tIHJlZ2lzdGVyQnVmZmVyKCkgYW5kIGdldCB0aGUKKyAgICAgKiBhc3NvY2lhdGVkIEMyQnVmZmVyIG9iamVjdCBiYWNrLiBSZXR1cm5zIHRydWUgaWYgdGhlIGJ1ZmZlciB3YXMgb24gZmlsZQorICAgICAqIGFuZCByZWxlYXNlZCBzdWNjZXNzZnVsbHkuCisgICAgICovCisgICAgdmlydHVhbCBib29sIHJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlcikgPSAwOworCisgICAgLyoqCisgICAgICogRmx1c2ggaW50ZXJuYWwgc3RhdGUuIEFmdGVyIHRoaXMgY2FsbCwgbm8gaW5kZXggb3IgYnVmZmVyIHByZXZpb3VzbHkKKyAgICAgKiByZXR1cm5lZCBmcm9tIHJlZ2lzdGVyQnVmZmVyKCkgaXMgdmFsaWQuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIGZsdXNoKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJmZsdXNoZWRXb3JrKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYXJyYXktYmFja2VkIHZlcnNpb24gb2Ygb3V0cHV0IGJ1ZmZlcnMuIFRoZSByZXR1cm5lZCBvYmplY3QKKyAgICAgKiBzaGFsbCByZXRhaW4gdGhlIGludGVybmFsIHN0YXRlIHNvIHRoYXQgaXQgd2lsbCBob25vciBpbmRleCBhbmQKKyAgICAgKiBidWZmZXIgZnJvbSBwcmV2aW91cyBjYWxscyBvZiByZWdpc3RlckJ1ZmZlcigpLgorICAgICAqLworICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKHNpemVfdCBzaXplKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIFNraXBDdXRCdWZmZXIgb2JqZWN0LgorICAgICAqLworICAgIHZvaWQgaW5pdFNraXBDdXRCdWZmZXIoCisgICAgICAgICAgICBpbnQzMl90IGRlbGF5LCBpbnQzMl90IHBhZGRpbmcsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgLyoqCisgICAgICogVXBkYXRlIHRoZSBTa2lwQ3V0QnVmZmVyIG9iamVjdC4gTm8tb3AgaWYgaXQncyBuZXZlciBpbml0aWFsaXplZC4KKyAgICAgKi8KKyAgICB2b2lkIHVwZGF0ZVNraXBDdXRCdWZmZXIoaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICAvKioKKyAgICAgKiBTdWJtaXQgYnVmZmVyIHRvIFNraXBDdXRCdWZmZXIgb2JqZWN0LCBpZiBpbml0aWFsaXplZC4KKyAgICAgKi8KKyAgICB2b2lkIHN1Ym1pdChjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKTsKKworICAgIC8qKgorICAgICAqIFRyYW5zZmVyIFNraXBDdXRCdWZmZXIgb2JqZWN0IHRvIHRoZSBvdGhlciBCdWZmZXJzIG9iamVjdC4KKyAgICAgKi8KKyAgICB2b2lkIHRyYW5zZmVyU2tpcEN1dEJ1ZmZlcihjb25zdCBzcDxTa2lwQ3V0QnVmZmVyPiAmc2NiKTsKKworcHJvdGVjdGVkOgorICAgIHNwPFNraXBDdXRCdWZmZXI+IG1Ta2lwQ3V0QnVmZmVyOworCitwcml2YXRlOgorICAgIGludDMyX3QgbURlbGF5OworICAgIGludDMyX3QgbVBhZGRpbmc7CisgICAgaW50MzJfdCBtU2FtcGxlUmF0ZTsKKworICAgIHZvaWQgc2V0U2tpcEN1dEJ1ZmZlcihpbnQzMl90IHNraXAsIGludDMyX3QgY3V0LCBpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhPdXRwdXRCdWZmZXJzKTsKK307CisKKy8qKgorICogU2ltcGxlIGxvY2FsIGJ1ZmZlciBwb29sIGJhY2tlZCBieSBzdGQ6OnZlY3Rvci4KKyAqLworY2xhc3MgTG9jYWxCdWZmZXJQb29sIDogcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8TG9jYWxCdWZmZXJQb29sPiB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbmV3IExvY2FsQnVmZmVyUG9vbCBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gcG9vbENhcGFjaXR5ICBtYXggdG90YWwgc2l6ZSBvZiBidWZmZXJzIG1hbmFnZWQgYnkgdGhpcyBwb29sLgorICAgICAqCisgICAgICogXHJldHVybiAgYSBuZXdseSBjcmVhdGVkIHBvb2wgb2JqZWN0LgorICAgICAqLworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8TG9jYWxCdWZmZXJQb29sPiBDcmVhdGUoc2l6ZV90IHBvb2xDYXBhY2l0eSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYW4gQUJ1ZmZlciBvYmplY3Qgd2hvc2Ugc2l6ZSBpcyBhdCBsZWFzdCB8Y2FwYWNpdHl8LgorICAgICAqCisgICAgICogXHBhcmFtICAgY2FwYWNpdHkgIHJlcXVlc3RlZCBjYXBhY2l0eQorICAgICAqIFxyZXR1cm4gIG51bGxwdHIgaWYgdGhlIHBvb2wgY2FwYWNpdHkgaXMgcmVhY2hlZAorICAgICAqICAgICAgICAgIGFuIEFCdWZmZXIgb2JqZWN0IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBzcDxBQnVmZmVyPiBuZXdCdWZmZXIoc2l6ZV90IGNhcGFjaXR5KTsKKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBBQnVmZmVyIGJhY2tlZCBieSBzdGQ6OnZlY3Rvci4KKyAgICAgKi8KKyAgICBjbGFzcyBWZWN0b3JCdWZmZXIgOiBwdWJsaWMgOjphbmRyb2lkOjpBQnVmZmVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3QgYSBWZWN0b3JCdWZmZXIgYnkgdGFraW5nIHRoZSBvd25lcnNoaXAgb2Ygc3VwcGxpZWQgdmVjdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gdmVjICAgYmFja2luZyB2ZWN0b3Igb2YgdGhlIGJ1ZmZlci4gdGhpcyBvYmplY3QgdGFrZXMKKyAgICAgICAgICogICAgICAgICAgICAgIG93bmVyc2hpcCBhdCBjb25zdHJ1Y3Rpb24uCisgICAgICAgICAqIFxwYXJhbSBwb29sICBhIExvY2FsQnVmZmVyUG9vbCBvYmplY3QgdG8gcmV0dXJuIHRoZSB2ZWN0b3IgYXQKKyAgICAgICAgICogICAgICAgICAgICAgIGRlc3RydWN0aW9uLgorICAgICAgICAgKi8KKyAgICAgICAgVmVjdG9yQnVmZmVyKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICYmdmVjLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TG9jYWxCdWZmZXJQb29sPiAmcG9vbCk7CisKKyAgICAgICAgflZlY3RvckJ1ZmZlcigpIG92ZXJyaWRlOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gbVZlYzsKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxMb2NhbEJ1ZmZlclBvb2w+IG1Qb29sOworICAgIH07CisKKyAgICBNdXRleCBtTXV0ZXg7CisgICAgc2l6ZV90IG1Qb29sQ2FwYWNpdHk7CisgICAgc2l6ZV90IG1Vc2VkU2l6ZTsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp2ZWN0b3I8dWludDhfdD4+IG1Qb29sOworCisgICAgLyoqCisgICAgICogUHJpdmF0ZSBjb25zdHJ1Y3RvciB0byBwcmV2ZW50IGNvbnN0cnVjdGluZyBub24tbWFuYWdlZCBMb2NhbEJ1ZmZlclBvb2wuCisgICAgICovCisgICAgZXhwbGljaXQgTG9jYWxCdWZmZXJQb29sKHNpemVfdCBwb29sQ2FwYWNpdHkpCisgICAgICAgIDogbVBvb2xDYXBhY2l0eShwb29sQ2FwYWNpdHkpLCBtVXNlZFNpemUoMCkgeworICAgIH0KKworICAgIC8qKgorICAgICAqIFRha2UgYmFjayB0aGUgb3duZXJzaGlwIG9mIHZlYyBmcm9tIHRoZSBkZXN0cnVjdGVkIFZlY3RvckJ1ZmZlciBhbmQgcHV0CisgICAgICogaXQgaW4gZnJvbnQgb2YgdGhlIHBvb2wuCisgICAgICovCisgICAgdm9pZCByZXR1cm5WZWN0b3Ioc3RkOjp2ZWN0b3I8dWludDhfdD4gJiZ2ZWMpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTG9jYWxCdWZmZXJQb29sKTsKK307CisKK2NsYXNzIEJ1ZmZlcnNBcnJheUltcGw7CisKKy8qKgorICogRmxleGlibGUgYnVmZmVyIHNsb3RzIGltcGxlbWVudGF0aW9uLgorICovCitjbGFzcyBGbGV4QnVmZmVyc0ltcGwgeworcHVibGljOgorICAgIEZsZXhCdWZmZXJzSW1wbChjb25zdCBjaGFyICpuYW1lKQorICAgICAgICA6IG1JbXBsTmFtZShzdGQ6OnN0cmluZyhuYW1lKSArICIuSW1wbCIpLAorICAgICAgICAgIG1OYW1lKG1JbXBsTmFtZS5jX3N0cigpKSB7IH0KKworICAgIC8qKgorICAgICAqIEFzc2lnbiBhbiBlbXB0eSBzbG90IGZvciBhIGJ1ZmZlciBhbmQgcmV0dXJuIHRoZSBpbmRleC4gSWYgdGhlcmUncyBubworICAgICAqIGVtcHR5IHNsb3QsIGp1c3QgYWRkIG9uZSBhdCB0aGUgZW5kIGFuZCByZXR1cm4gaXQuCisgICAgICoKKyAgICAgKiBccGFyYW0gYnVmZmVyW2luXSAgYSBuZXcgYnVmZmVyIHRvIGFzc2lnbiBhIHNsb3QuCisgICAgICogXHJldHVybiAgICAgICAgICAgIGluZGV4IG9mIHRoZSBhc3NpZ25lZCBzbG90LgorICAgICAqLworICAgIHNpemVfdCBhc3NpZ25TbG90KGNvbnN0IHNwPENvZGVjMkJ1ZmZlcj4gJmJ1ZmZlcik7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIHRoZSBzbG90IGZyb20gdGhlIGNsaWVudCwgYW5kIGdldCB0aGUgQzJCdWZmZXIgb2JqZWN0IGJhY2sgZnJvbQorICAgICAqIHRoZSBwcmV2aW91c2x5IGFzc2lnbmVkIGJ1ZmZlci4gTm90ZSB0aGF0IHRoZSBzbG90IGlzIG5vdCBjb21wbGV0ZWx5IGZyZWUKKyAgICAgKiB1bnRpbCB0aGUgcmV0dXJuZWQgQzJCdWZmZXIgb2JqZWN0IGlzIGZyZWVkLgorICAgICAqCisgICAgICogXHBhcmFtICAgYnVmZmVyW2luXSAgICAgICAgdGhlIGJ1ZmZlciBwcmV2aW91c2x5IGFzc2lnbmVkIGEgc2xvdC4KKyAgICAgKiBccGFyYW0gICBjMmJ1ZmZlcltpbixvdXRdICBwb2ludGVyIHRvIEMyQnVmZmVyIHRvIGJlIHBvcHVsYXRlZC4gSWdub3JlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG51bGwuCisgICAgICogXHJldHVybiAgdHJ1ZSAgaWYgdGhlIGJ1ZmZlciBpcyBzdWNjZXNzZnVsbHkgcmVsZWFzZWQgZnJvbSBhIHNsb3QKKyAgICAgKiAgICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBib29sIHJlbGVhc2VTbG90KAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyLAorICAgICAgICAgICAgYm9vbCByZWxlYXNlKTsKKworICAgIC8qKgorICAgICAqIEV4cGlyZSB0aGUgQzJCdWZmZXIgb2JqZWN0IGluIHRoZSBzbG90LgorICAgICAqCisgICAgICogXHBhcmFtICAgYzJidWZmZXJbaW5dICBDMkJ1ZmZlciBvYmplY3Qgd2hpY2ggdGhlIGNvbXBvbmVudCByZWxlYXNlZC4KKyAgICAgKiBccmV0dXJuICB0cnVlICBpZiB0aGUgYnVmZmVyIGlzIGZvdW5kIGluIG9uZSBvZiB0aGUgc2xvdHMgYW5kCisgICAgICogICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bGx5IHJlbGVhc2VkCisgICAgICogICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgYm9vbCBleHBpcmVDb21wb25lbnRCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYzJidWZmZXIpOworCisgICAgLyoqCisgICAgICogVGhlIGNsaWVudCBhYmFuZG9uZWQgYWxsIGtub3duIGJ1ZmZlcnMsIHNvIHJlY2xhaW0gdGhlIG93bmVyc2hpcC4KKyAgICAgKi8KKyAgICB2b2lkIGZsdXNoKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBidWZmZXJzIHRoYXQgYXJlIHNlbnQgdG8gdGhlIGNsaWVudCBidXQgbm90IHJlbGVhc2VkCisgICAgICogeWV0LgorICAgICAqLworICAgIHNpemVfdCBudW1DbGllbnRCdWZmZXJzKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIG51bWJlciBvZiBidWZmZXJzIHRoYXQgYXJlIHNlbnQgdG8gdGhlIGNvbXBvbmVudCBidXQgbm90CisgICAgICogcmV0dXJuZWQgYmFjayB5ZXQuCisgICAgICovCisgICAgc2l6ZV90IG51bUNvbXBvbmVudEJ1ZmZlcnMoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgQnVmZmVyc0FycmF5SW1wbDsKKworICAgIHN0ZDo6c3RyaW5nIG1JbXBsTmFtZTsgLy8vPCBuYW1lIGZvciBkZWJ1Z2dpbmcKKyAgICBjb25zdCBjaGFyICptTmFtZTsgLy8vPCBDLXN0cmluZyB2ZXJzaW9uIG9mIG5hbWUKKworICAgIHN0cnVjdCBFbnRyeSB7CisgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gY2xpZW50QnVmZmVyOworICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQnVmZmVyPiBjb21wQnVmZmVyOworICAgIH07CisgICAgc3RkOjp2ZWN0b3I8RW50cnk+IG1CdWZmZXJzOworfTsKKworLyoqCisgKiBTdGF0aWMgYnVmZmVyIHNsb3RzIGltcGxlbWVudGF0aW9uIGJhc2VkIG9uIGEgZml4ZWQtc2l6ZSBhcnJheS4KKyAqLworY2xhc3MgQnVmZmVyc0FycmF5SW1wbCB7CitwdWJsaWM6CisgICAgQnVmZmVyc0FycmF5SW1wbCgpCisgICAgICAgIDogbUltcGxOYW1lKCJCdWZmZXJzQXJyYXlJbXBsIiksCisgICAgICAgICAgbU5hbWUobUltcGxOYW1lLmNfc3RyKCkpIHsgfQorCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBidWZmZXIgYXJyYXkgZnJvbSB0aGUgb3JpZ2luYWwgfGltcGx8LiBUaGUgYnVmZmVycyBrbm93biBieQorICAgICAqIHRoZSBjbGllbnQgaXMgcHJlc2VydmVkLCBhbmQgdGhlIGVtcHR5IHNsb3RzIGFyZSBwb3B1bGF0ZWQgc28gdGhhdCB0aGUKKyAgICAgKiBhcnJheSBzaXplIGlzIGF0IGxlYXN0IHxtaW5TaXplfC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpbXBsW2luXSAgICAgIEZsZXhCdWZmZXJzSW1wbCBvYmplY3QgdXNlZCBzbyBmYXIuCisgICAgICogXHBhcmFtIG1pblNpemVbaW5dICAgbWluaW11bSBzaXplIG9mIHRoZSBidWZmZXIgYXJyYXkuCisgICAgICogXHBhcmFtIGFsbG9jYXRlW2luXSAgZnVuY3Rpb24gdG8gYWxsb2NhdGUgYSBjbGllbnQgYnVmZmVyIGZvciBhbiBlbXB0eSBzbG90LgorICAgICAqLworICAgIHZvaWQgaW5pdGlhbGl6ZSgKKyAgICAgICAgICAgIGNvbnN0IEZsZXhCdWZmZXJzSW1wbCAmaW1wbCwKKyAgICAgICAgICAgIHNpemVfdCBtaW5TaXplLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+KCk+IGFsbG9jYXRlKTsKKworICAgIC8qKgorICAgICAqIEdyYWIgYSBidWZmZXIgZnJvbSB0aGUgdW5kZXJseWluZyBhcnJheSB3aGljaCBtYXRjaGVzIHRoZSBjcml0ZXJpYS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpbmRleFtvdXRdICAgIGluZGV4IG9mIHRoZSBzbG90LgorICAgICAqIFxwYXJhbSBidWZmZXJbb3V0XSAgIHRoZSBtYXRjaGluZyBidWZmZXIuCisgICAgICogXHBhcmFtIG1hdGNoW2luXSAgICAgYSBmdW5jdGlvbiB0byB0ZXN0IHdoZXRoZXIgdGhlIGJ1ZmZlciBtYXRjaGVzIHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlhIG9yIG5vdC4KKyAgICAgKiBccmV0dXJuIE9LICAgICAgICAgICBpZiBzdWNjZXNzZnVsLAorICAgICAqICAgICAgICAgV09VTERfQkxPQ0sgIGlmIHNsb3RzIGFyZSBiZWluZyB1c2VkLAorICAgICAqICAgICAgICAgTk9fTUVNT1JZICAgIGlmIG5vIHNsb3QgbWF0Y2hlcyB0aGUgY3JpdGVyaWEsIGV2ZW4gdGhvdWdoIGl0J3MKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBncmFiQnVmZmVyKAorICAgICAgICAgICAgc2l6ZV90ICppbmRleCwKKyAgICAgICAgICAgIHNwPENvZGVjMkJ1ZmZlcj4gKmJ1ZmZlciwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBzcDxDb2RlYzJCdWZmZXI+ICYpPiBtYXRjaCA9CisgICAgICAgICAgICAgICAgW10oY29uc3Qgc3A8Q29kZWMyQnVmZmVyPiAmKSB7IHJldHVybiB0cnVlOyB9KTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgYnVmZmVyIGZyb20gdGhlIGNsaWVudCwgYW5kIGdldCB0aGUgQzJCdWZmZXIgb2JqZWN0IGJhY2sgZnJvbQorICAgICAqIHRoZSBidWZmZXIuIE5vdGUgdGhhdCB0aGUgc2xvdCBpcyBub3QgY29tcGxldGVseSBmcmVlIHVudGlsIHRoZSByZXR1cm5lZAorICAgICAqIEMyQnVmZmVyIG9iamVjdCBpcyBmcmVlZC4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGJ1ZmZlcltpbl0gICAgICAgIHRoZSBidWZmZXIgcHJldmlvdXNseSBncmFiYmVkLgorICAgICAqIFxwYXJhbSAgIGMyYnVmZmVyW2luLG91dF0gIHBvaW50ZXIgdG8gQzJCdWZmZXIgdG8gYmUgcG9wdWxhdGVkLiBJZ25vcmVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgbnVsbC4KKyAgICAgKiBccmV0dXJuICB0cnVlICBpZiB0aGUgYnVmZmVyIGlzIHN1Y2Nlc3NmdWxseSByZXR1cm5lZAorICAgICAqICAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgcmV0dXJuQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyLAorICAgICAgICAgICAgYm9vbCByZWxlYXNlKTsKKworICAgIC8qKgorICAgICAqIEV4cGlyZSB0aGUgQzJCdWZmZXIgb2JqZWN0IGluIHRoZSBzbG90LgorICAgICAqCisgICAgICogXHBhcmFtICAgYzJidWZmZXJbaW5dICBDMkJ1ZmZlciBvYmplY3Qgd2hpY2ggdGhlIGNvbXBvbmVudCByZWxlYXNlZC4KKyAgICAgKiBccmV0dXJuICB0cnVlICBpZiB0aGUgYnVmZmVyIGlzIGZvdW5kIGluIG9uZSBvZiB0aGUgc2xvdHMgYW5kCisgICAgICogICAgICAgICAgICAgICAgc3VjY2Vzc2Z1bGx5IHJlbGVhc2VkCisgICAgICogICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgYm9vbCBleHBpcmVDb21wb25lbnRCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYzJidWZmZXIpOworCisgICAgLyoqCisgICAgICogUG9wdWxhdGUgfGFycmF5fCB3aXRoIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlciBhcnJheS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBhcnJheVtvdXRdICBhbiBhcnJheSB0byBiZSBmaWxsZWQgd2l0aCB0aGUgdW5kZXJseWluZyBidWZmZXIgYXJyYXkuCisgICAgICovCisgICAgdm9pZCBnZXRBcnJheShWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICphcnJheSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY2xpZW50IGFiYW5kb25lZCBhbGwga25vd24gYnVmZmVycywgc28gcmVjbGFpbSB0aGUgb3duZXJzaGlwLgorICAgICAqLworICAgIHZvaWQgZmx1c2goKTsKKworICAgIC8qKgorICAgICAqIFJlYWxsb2NhdGUgdGhlIGFycmF5IHdpdGggdGhlIGdpdmVuIGFsbG9jYXRpb24gZnVuY3Rpb24uCisgICAgICoKKyAgICAgKiBccGFyYW0gYWxsb2NbaW5dIHRoZSBhbGxvY2F0aW9uIGZ1bmN0aW9uIGZvciBjbGllbnQgYnVmZmVycy4KKyAgICAgKi8KKyAgICB2b2lkIHJlYWxsb2Moc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+KCk+IGFsbG9jKTsKKworICAgIC8qKgorICAgICAqIEdyb3cgdGhlIGFycmF5IHRvIHRoZSBuZXcgc2l6ZS4gSXQgaXMgYSBwcm9ncmFtbWluZyBlcnJvciB0byBzdXBwbHkKKyAgICAgKiBzbWFsbGVyIHNpemUgYXMgdGhlIG5ldyBzaXplLgorICAgICAqCisgICAgICogXHBhcmFtIG5ld1NpemVbaW5dIG5ldyBzaXplIG9mIHRoZSBhcnJheS4KKyAgICAgKiBccGFyYW0gYWxsb2NbaW5dICAgdGhlIGFsbGxvY2F0aW9uIGZ1bmN0aW9uIGZvciBjbGllbnQgYnVmZmVycyB0byBmaWxsCisgICAgICogICAgICAgICAgICAgICAgICAgIHRoZSBuZXcgZW1wdHkgc2xvdHMuCisgICAgICovCisgICAgdm9pZCBncm93KHNpemVfdCBuZXdTaXplLCBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjMkJ1ZmZlcj4oKT4gYWxsb2MpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnVmZmVycyB0aGF0IGFyZSBzZW50IHRvIHRoZSBjbGllbnQgYnV0IG5vdCByZWxlYXNlZAorICAgICAqIHlldC4KKyAgICAgKi8KKyAgICBzaXplX3QgbnVtQ2xpZW50QnVmZmVycygpIGNvbnN0OworCitwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nIG1JbXBsTmFtZTsgLy8vPCBuYW1lIGZvciBkZWJ1Z2dpbmcKKyAgICBjb25zdCBjaGFyICptTmFtZTsgLy8vPCBDLXN0cmluZyB2ZXJzaW9uIG9mIG5hbWUKKworICAgIHN0cnVjdCBFbnRyeSB7CisgICAgICAgIGNvbnN0IHNwPENvZGVjMkJ1ZmZlcj4gY2xpZW50QnVmZmVyOworICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQnVmZmVyPiBjb21wQnVmZmVyOworICAgICAgICBib29sIG93bmVkQnlDbGllbnQ7CisgICAgfTsKKyAgICBzdGQ6OnZlY3RvcjxFbnRyeT4gbUJ1ZmZlcnM7Cit9OworCitjbGFzcyBJbnB1dEJ1ZmZlcnNBcnJheSA6IHB1YmxpYyBJbnB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIElucHV0QnVmZmVyc0FycmF5KGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiSW5wdXRbTl0iKQorICAgICAgICA6IElucHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKyAgICB+SW5wdXRCdWZmZXJzQXJyYXkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoaXMgb2JqZWN0IGZyb20gdGhlIG5vbi1hcnJheSBzdGF0ZS4gV2Uga2VlcCBleGlzdGluZyBzbG90cworICAgICAqIGF0IHRoZSBzYW1lIGluZGV4LCBhbmQgZm9yIGVtcHR5IHNsb3RzIHdlIGFsbG9jYXRlIGNsaWVudCBidWZmZXJzIHdpdGgKKyAgICAgKiB0aGUgZ2l2ZW4gYWxsb2NhdGUgZnVuY3Rpb24uIElmIHRoZSBudW1iZXIgb2Ygc2xvdHMgaXMgbGVzcyB0aGFuIG1pblNpemUsCisgICAgICogd2UgZmlsbCB0aGUgYXJyYXkgdG8gdGhlIG1pbmltdW0gc2l6ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpbXBsW2luXSAgICAgIGV4aXN0aW5nIG5vbi1hcnJheSBzdGF0ZQorICAgICAqIFxwYXJhbSBtaW5TaXplW2luXSAgIG1pbmltdW0gc2l6ZSBvZiB0aGUgYXJyYXkKKyAgICAgKiBccGFyYW0gYWxsb2NhdGVbaW5dICBhbGxvY2F0ZSBmdW5jdGlvbiB0byBmaWxsIGVtcHR5IHNsb3RzCisgICAgICovCisgICAgdm9pZCBpbml0aWFsaXplKAorICAgICAgICAgICAgY29uc3QgRmxleEJ1ZmZlcnNJbXBsICZpbXBsLAorICAgICAgICAgICAgc2l6ZV90IG1pblNpemUsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjMkJ1ZmZlcj4oKT4gYWxsb2NhdGUpOworCisgICAgYm9vbCBpc0FycmF5TW9kZSgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIHRydWU7IH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKHNpemVfdCkgZmluYWwgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICB2b2lkIGdldEFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSBjb25zdCBmaW5hbDsKKworICAgIGJvb2wgcmVxdWVzdE5ld0J1ZmZlcihzaXplX3QgKmluZGV4LCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqYnVmZmVyKSBvdmVycmlkZTsKKworICAgIGJvb2wgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlciwKKyAgICAgICAgICAgIGJvb2wgcmVsZWFzZSkgb3ZlcnJpZGU7CisKKyAgICBib29sIGV4cGlyZUNvbXBvbmVudEJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmMyYnVmZmVyKSBvdmVycmlkZTsKKworICAgIHZvaWQgZmx1c2goKSBvdmVycmlkZTsKKworICAgIHNpemVfdCBudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgZmluYWw7CisKK3Byb3RlY3RlZDoKKyAgICBzcDxDb2RlYzJCdWZmZXI+IGNyZWF0ZU5ld0J1ZmZlcigpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIEJ1ZmZlcnNBcnJheUltcGwgbUltcGw7CisgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+KCk+IG1BbGxvY2F0ZTsKK307CisKK2NsYXNzIExpbmVhcklucHV0QnVmZmVycyA6IHB1YmxpYyBJbnB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIExpbmVhcklucHV0QnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIjFELUlucHV0IikKKyAgICAgICAgOiBJbnB1dEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSksCisgICAgICAgICAgbUltcGwobU5hbWUpIHsgfQorICAgIH5MaW5lYXJJbnB1dEJ1ZmZlcnMoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBib29sIHJlcXVlc3ROZXdCdWZmZXIoc2l6ZV90ICppbmRleCwgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmJ1ZmZlcikgb3ZlcnJpZGU7CisKKyAgICBib29sIHJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIsCisgICAgICAgICAgICBib29sIHJlbGVhc2UpIG92ZXJyaWRlOworCisgICAgYm9vbCBleHBpcmVDb21wb25lbnRCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGZsdXNoKCkgb3ZlcnJpZGU7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPiB0b0FycmF5TW9kZShzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisKKyAgICBzaXplX3QgbnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IGZpbmFsOworCitwcm90ZWN0ZWQ6CisgICAgc3A8Q29kZWMyQnVmZmVyPiBjcmVhdGVOZXdCdWZmZXIoKSBvdmVycmlkZTsKKworICAgIEZsZXhCdWZmZXJzSW1wbCBtSW1wbDsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgc3A8Q29kZWMyQnVmZmVyPiBBbGxvYygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKK307CisKK2NsYXNzIEVuY3J5cHRlZExpbmVhcklucHV0QnVmZmVycyA6IHB1YmxpYyBMaW5lYXJJbnB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIEVuY3J5cHRlZExpbmVhcklucHV0QnVmZmVycygKKyAgICAgICAgICAgIGJvb2wgc2VjdXJlLAorICAgICAgICAgICAgY29uc3Qgc3A8TWVtb3J5RGVhbGVyPiAmZGVhbGVyLAorICAgICAgICAgICAgY29uc3Qgc3A8SUNyeXB0bz4gJmNyeXB0bywKKyAgICAgICAgICAgIGludDMyX3QgaGVhcFNlcU51bSwKKyAgICAgICAgICAgIHNpemVfdCBjYXBhY2l0eSwKKyAgICAgICAgICAgIHNpemVfdCBudW1JbnB1dFNsb3RzLAorICAgICAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICJFbmNyeXB0ZWRJbnB1dCIpOworCisgICAgfkVuY3J5cHRlZExpbmVhcklucHV0QnVmZmVycygpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKHNpemVfdCBzaXplKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIHNwPENvZGVjMkJ1ZmZlcj4gY3JlYXRlTmV3QnVmZmVyKCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RydWN0IEVudHJ5IHsKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICAgICAgc3A8SU1lbW9yeT4gbWVtb3J5OworICAgICAgICBpbnQzMl90IGhlYXBTZXFOdW07CisgICAgfTsKKworICAgIHN0YXRpYyBzcDxDb2RlYzJCdWZmZXI+IEFsbG9jKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3RvcjxFbnRyeT4+ICZtZW1vcnlWZWN0b3IpOworCisgICAgQzJNZW1vcnlVc2FnZSBtVXNhZ2U7CisgICAgc3A8TWVtb3J5RGVhbGVyPiBtRGVhbGVyOworICAgIHNwPElDcnlwdG8+IG1DcnlwdG87CisgICAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPEVudHJ5Pj4gbU1lbW9yeVZlY3RvcjsKK307CisKK2NsYXNzIEdyYXBoaWNNZXRhZGF0YUlucHV0QnVmZmVycyA6IHB1YmxpYyBJbnB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIEdyYXBoaWNNZXRhZGF0YUlucHV0QnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIjJELU1ldGFJbnB1dCIpOworICAgIH5HcmFwaGljTWV0YWRhdGFJbnB1dEJ1ZmZlcnMoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBib29sIHJlcXVlc3ROZXdCdWZmZXIoc2l6ZV90ICppbmRleCwgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmJ1ZmZlcikgb3ZlcnJpZGU7CisKKyAgICBib29sIHJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIsCisgICAgICAgICAgICBib29sIHJlbGVhc2UpIG92ZXJyaWRlOworCisgICAgYm9vbCBleHBpcmVDb21wb25lbnRCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGZsdXNoKCkgb3ZlcnJpZGU7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPiB0b0FycmF5TW9kZShzaXplX3Qgc2l6ZSkgZmluYWw7CisKKyAgICBzaXplX3QgbnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IGZpbmFsOworCitwcm90ZWN0ZWQ6CisgICAgc3A8Q29kZWMyQnVmZmVyPiBjcmVhdGVOZXdCdWZmZXIoKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBGbGV4QnVmZmVyc0ltcGwgbUltcGw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IG1TdG9yZTsKK307CisKK2NsYXNzIEdyYXBoaWNJbnB1dEJ1ZmZlcnMgOiBwdWJsaWMgSW5wdXRCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBHcmFwaGljSW5wdXRCdWZmZXJzKAorICAgICAgICAgICAgc2l6ZV90IG51bUlucHV0U2xvdHMsIGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiMkQtQkItSW5wdXQiKTsKKyAgICB+R3JhcGhpY0lucHV0QnVmZmVycygpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIGJvb2wgcmVxdWVzdE5ld0J1ZmZlcihzaXplX3QgKmluZGV4LCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqYnVmZmVyKSBvdmVycmlkZTsKKworICAgIGJvb2wgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlciwKKyAgICAgICAgICAgIGJvb2wgcmVsZWFzZSkgb3ZlcnJpZGU7CisKKyAgICBib29sIGV4cGlyZUNvbXBvbmVudEJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmMyYnVmZmVyKSBvdmVycmlkZTsKKworICAgIHZvaWQgZmx1c2goKSBvdmVycmlkZTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKAorICAgICAgICAgICAgc2l6ZV90IHNpemUpIGZpbmFsOworCisgICAgc2l6ZV90IG51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCBmaW5hbDsKKworcHJvdGVjdGVkOgorICAgIHNwPENvZGVjMkJ1ZmZlcj4gY3JlYXRlTmV3QnVmZmVyKCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgRmxleEJ1ZmZlcnNJbXBsIG1JbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxMb2NhbEJ1ZmZlclBvb2w+IG1Mb2NhbEJ1ZmZlclBvb2w7Cit9OworCitjbGFzcyBEdW1teUlucHV0QnVmZmVycyA6IHB1YmxpYyBJbnB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIER1bW15SW5wdXRCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiMkQtSW5wdXQiKQorICAgICAgICA6IElucHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKyAgICB+RHVtbXlJbnB1dEJ1ZmZlcnMoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBib29sIHJlcXVlc3ROZXdCdWZmZXIoc2l6ZV90ICosIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICopIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICYsIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKiwgYm9vbCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBleHBpcmVDb21wb25lbnRCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdm9pZCBmbHVzaCgpIG92ZXJyaWRlIHsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPiB0b0FycmF5TW9kZShzaXplX3QpIGZpbmFsIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgYm9vbCBpc0FycmF5TW9kZSgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIHRydWU7IH0KKworICAgIHZvaWQgZ2V0QXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpIGNvbnN0IGZpbmFsIHsKKyAgICAgICAgYXJyYXktPmNsZWFyKCk7CisgICAgfQorCisgICAgc2l6ZV90IG51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCBmaW5hbCB7CisgICAgICAgIHJldHVybiAwdTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBzcDxDb2RlYzJCdWZmZXI+IGNyZWF0ZU5ld0J1ZmZlcigpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorfTsKKworY2xhc3MgT3V0cHV0QnVmZmVyc0FycmF5IDogcHVibGljIE91dHB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIE91dHB1dEJ1ZmZlcnNBcnJheShjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIk91dHB1dFtOXSIpCisgICAgICAgIDogT3V0cHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKyAgICB+T3V0cHV0QnVmZmVyc0FycmF5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGlzIG9iamVjdCBmcm9tIHRoZSBub24tYXJyYXkgc3RhdGUuIFdlIGtlZXAgZXhpc3Rpbmcgc2xvdHMKKyAgICAgKiBhdCB0aGUgc2FtZSBpbmRleCwgYW5kIGZvciBlbXB0eSBzbG90cyB3ZSBhbGxvY2F0ZSBjbGllbnQgYnVmZmVycyB3aXRoCisgICAgICogdGhlIGdpdmVuIGFsbG9jYXRlIGZ1bmN0aW9uLiBJZiB0aGUgbnVtYmVyIG9mIHNsb3RzIGlzIGxlc3MgdGhhbiBtaW5TaXplLAorICAgICAqIHdlIGZpbGwgdGhlIGFycmF5IHRvIHRoZSBtaW5pbXVtIHNpemUuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW1wbFtpbl0gICAgICBleGlzdGluZyBub24tYXJyYXkgc3RhdGUKKyAgICAgKiBccGFyYW0gbWluU2l6ZVtpbl0gICBtaW5pbXVtIHNpemUgb2YgdGhlIGFycmF5CisgICAgICogXHBhcmFtIGFsbG9jYXRlW2luXSAgYWxsb2NhdGUgZnVuY3Rpb24gdG8gZmlsbCBlbXB0eSBzbG90cworICAgICAqLworICAgIHZvaWQgaW5pdGlhbGl6ZSgKKyAgICAgICAgICAgIGNvbnN0IEZsZXhCdWZmZXJzSW1wbCAmaW1wbCwKKyAgICAgICAgICAgIHNpemVfdCBtaW5TaXplLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+KCk+IGFsbG9jYXRlKTsKKworICAgIGJvb2wgaXNBcnJheU1vZGUoKSBjb25zdCBmaW5hbCB7IHJldHVybiB0cnVlOyB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0QnVmZmVycz4gdG9BcnJheU1vZGUoc2l6ZV90KSBmaW5hbCB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHN0YXR1c190IHJlZ2lzdGVyQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgc2l6ZV90ICppbmRleCwKKyAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpjbGllbnRCdWZmZXIpIGZpbmFsOworCisgICAgc3RhdHVzX3QgcmVnaXN0ZXJDc2QoCisgICAgICAgICAgICBjb25zdCBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0ICpjc2QsCisgICAgICAgICAgICBzaXplX3QgKmluZGV4LAorICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmNsaWVudEJ1ZmZlcikgZmluYWw7CisKKyAgICBib29sIHJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlcikgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGZsdXNoKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJmZsdXNoZWRXb3JrKSBvdmVycmlkZTsKKworICAgIHZvaWQgZ2V0QXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpIGNvbnN0IGZpbmFsOworCisgICAgc2l6ZV90IG51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCBmaW5hbDsKKworICAgIC8qKgorICAgICAqIFJlYWxsb2NhdGUgdGhlIGFycmF5LCBmaWxsZWQgd2l0aCBidWZmZXJzIHdpdGggdGhlIHNhbWUgc2l6ZSBhcyBnaXZlbgorICAgICAqIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIFxwYXJhbSBjMmJ1ZmZlcltpbl0gdGhlIHJlZmVyZW5jZSBidWZmZXIKKyAgICAgKi8KKyAgICB2b2lkIHJlYWxsb2MoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYzJidWZmZXIpOworCisgICAgLyoqCisgICAgICogR3JvdyB0aGUgYXJyYXkgdG8gdGhlIG5ldyBzaXplLiBJdCBpcyBhIHByb2dyYW1taW5nIGVycm9yIHRvIHN1cHBseQorICAgICAqIHNtYWxsZXIgc2l6ZSBhcyB0aGUgbmV3IHNpemUuCisgICAgICoKKyAgICAgKiBccGFyYW0gbmV3U2l6ZVtpbl0gbmV3IHNpemUgb2YgdGhlIGFycmF5LgorICAgICAqLworICAgIHZvaWQgZ3JvdyhzaXplX3QgbmV3U2l6ZSk7CisKK3ByaXZhdGU6CisgICAgQnVmZmVyc0FycmF5SW1wbCBtSW1wbDsKKyAgICBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjMkJ1ZmZlcj4oKT4gbUFsbG9jOworfTsKKworY2xhc3MgRmxleE91dHB1dEJ1ZmZlcnMgOiBwdWJsaWMgT3V0cHV0QnVmZmVycyB7CitwdWJsaWM6CisgICAgRmxleE91dHB1dEJ1ZmZlcnMoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICJPdXRwdXRbXSIpCisgICAgICAgIDogT3V0cHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSwKKyAgICAgICAgICBtSW1wbChtTmFtZSkgeyB9CisKKyAgICBzdGF0dXNfdCByZWdpc3RlckJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHNpemVfdCAqaW5kZXgsCisgICAgICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqY2xpZW50QnVmZmVyKSBvdmVycmlkZTsKKworICAgIHN0YXR1c190IHJlZ2lzdGVyQ3NkKAorICAgICAgICAgICAgY29uc3QgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dCAqY3NkLAorICAgICAgICAgICAgc2l6ZV90ICppbmRleCwKKyAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpjbGllbnRCdWZmZXIpIGZpbmFsOworCisgICAgYm9vbCByZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyKSBvdmVycmlkZTsKKworICAgIHZvaWQgZmx1c2goCisgICAgICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZmbHVzaGVkV29yaykgb3ZlcnJpZGU7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0QnVmZmVycz4gdG9BcnJheU1vZGUoc2l6ZV90IHNpemUpIG92ZXJyaWRlOworCisgICAgc2l6ZV90IG51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCBmaW5hbDsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBhcHByb3ByaWF0ZSBDb2RlYzJCdWZmZXIgb2JqZWN0IGZvciB0aGUgdHlwZSBvZiBidWZmZXJzLgorICAgICAqCisgICAgICogXHBhcmFtIGJ1ZmZlciAgQzJCdWZmZXIgb2JqZWN0IHRvIHdyYXAuCisgICAgICoKKyAgICAgKiBccmV0dXJuICBhcHByb3ByaWF0ZSBDb2RlYzJCdWZmZXIgb2JqZWN0IHRvIHdyYXAgfGJ1ZmZlcnwuCisgICAgICovCisgICAgdmlydHVhbCBzcDxDb2RlYzJCdWZmZXI+IHdyYXAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBmdW5jdGlvbiB0aGF0IGFsbG9jYXRlcyBhbiBhcHByb3ByaWF0ZSBDb2RlYzJCdWZmZXIgb2JqZWN0IGZvcgorICAgICAqIHRoZSB0eXBlIG9mIGJ1ZmZlcnMsIHRvIGJlIHVzZWQgYXMgYW4gZW1wdHkgYXJyYXkgYnVmZmVyLiBUaGUgZnVuY3Rpb24KKyAgICAgKiBtdXN0IG5vdCByZWZlciB0byB0aGlzIHBvaW50ZXIsIHNpbmNlIGl0IG1heSBiZSB1c2VkIGFmdGVyIHRoaXMgb2JqZWN0CisgICAgICogZGVzdHJ1Y3RzLgorICAgICAqCisgICAgICogXHJldHVybiAgYSBmdW5jdGlvbiB0aGF0IGFsbG9jYXRlcyBhcHByb3ByaWF0ZSBDb2RlYzJCdWZmZXIgb2JqZWN0LAorICAgICAqICAgICAgICAgIHdoaWNoIGNhbiBjb3B5KCkgZnJvbSBDMkJ1ZmZlcnMuCisgICAgICovCisgICAgdmlydHVhbCBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjMkJ1ZmZlcj4oKT4gZ2V0QWxsb2MoKSA9IDA7CisKK3ByaXZhdGU6CisgICAgRmxleEJ1ZmZlcnNJbXBsIG1JbXBsOworfTsKKworY2xhc3MgTGluZWFyT3V0cHV0QnVmZmVycyA6IHB1YmxpYyBGbGV4T3V0cHV0QnVmZmVycyB7CitwdWJsaWM6CisgICAgTGluZWFyT3V0cHV0QnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIjFELU91dHB1dCIpCisgICAgICAgIDogRmxleE91dHB1dEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSkgeyB9CisKKyAgICB2b2lkIGZsdXNoKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmZmx1c2hlZFdvcmspIG92ZXJyaWRlOworCisgICAgc3A8Q29kZWMyQnVmZmVyPiB3cmFwKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgb3ZlcnJpZGU7CisKKyAgICBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjMkJ1ZmZlcj4oKT4gZ2V0QWxsb2MoKSBvdmVycmlkZTsKK307CisKK2NsYXNzIEdyYXBoaWNPdXRwdXRCdWZmZXJzIDogcHVibGljIEZsZXhPdXRwdXRCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBHcmFwaGljT3V0cHV0QnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIjJELU91dHB1dCIpCisgICAgICAgIDogRmxleE91dHB1dEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSkgeyB9CisKKyAgICBzcDxDb2RlYzJCdWZmZXI+IHdyYXAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBvdmVycmlkZTsKKworICAgIHN0ZDo6ZnVuY3Rpb248c3A8Q29kZWMyQnVmZmVyPigpPiBnZXRBbGxvYygpIG92ZXJyaWRlOworfTsKKworY2xhc3MgUmF3R3JhcGhpY091dHB1dEJ1ZmZlcnMgOiBwdWJsaWMgRmxleE91dHB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIFJhd0dyYXBoaWNPdXRwdXRCdWZmZXJzKAorICAgICAgICAgICAgc2l6ZV90IG51bU91dHB1dFNsb3RzLCBjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIjJELUJCLU91dHB1dCIpOworICAgIH5SYXdHcmFwaGljT3V0cHV0QnVmZmVycygpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHNwPENvZGVjMkJ1ZmZlcj4gd3JhcChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIG92ZXJyaWRlOworCisgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+KCk+IGdldEFsbG9jKCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPExvY2FsQnVmZmVyUG9vbD4gbUxvY2FsQnVmZmVyUG9vbDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ0NPREVDX0JVRkZFUlNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc3YTkxZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuY3BwCkBAIC0wLDAgKzEsMTYxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ0NvZGVjQ29uZmlnIgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKworI2luY2x1ZGUgIkNDb2RlY0NvbmZpZy5oIgorI2luY2x1ZGUgIkNvZGVjMk1hcHBlci5oIgorCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwgNjQgIC8qIDY0Ki0wLjI1ZEIgPSAtMTYgZEIgYmVsb3cgZnVsbCBzY2FsZSBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQgICAxMjcgLyogbWF4aW11bSBjb21wcmVzc2lvbiBvZiBkeW5hbWljIHJhbmdlIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0JPT1NUIDEyNyAvKiBtYXhpbXVtIGNvbXByZXNzaW9uIG9mIGR5bmFtaWMgcmFuZ2UgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfSEVBVlkgMSAgIC8qIHN3aXRjaCBmb3IgaGVhdnkgY29tcHJlc3Npb24gZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfRUZGRUNUIDMgIC8qIE1QRUctRCBEUkMgZWZmZWN0IHR5cGU7IDMgPT4gTGltaXRlZCBwbGF5YmFjayByYW5nZSAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRU5DX0xFVkVMICgtMSkgLyogZW5jb2RlciB0YXJnZXQgbGV2ZWw7IC0xID0+IHRoZSB2YWx1ZSBpcyB1bmtub3duLCBvdGhlcndpc2UgZEIgc3RlcCB2YWx1ZSAoZS5nLiA2NCBmb3IgLTE2IGRCKSAqLworLy8gbmFtZXMgb2YgcHJvcGVydGllcyB0aGF0IGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IERSQyBzZXR0aW5ncworI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9SRUZfTEVWRUwgICJhYWNfZHJjX3JlZmVyZW5jZV9sZXZlbCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfQ1VUICAgICAgICAiYWFjX2RyY19jdXQiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0JPT1NUICAgICAgImFhY19kcmNfYm9vc3QiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0hFQVZZICAgICAgImFhY19kcmNfaGVhdnkiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0VOQ19MRVZFTCAgImFhY19kcmNfZW5jX3RhcmdldF9sZXZlbCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfRUZGRUNUICAgICAicm8uYWFjX2RyY19lZmZlY3RfdHlwZSIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBDQ29kZWNDb25maWcKKworbmFtZXNwYWNlIHsKKworLyoqCisgKiBtYXBwaW5nIGJldHdlZW4gU0RLIGFuZCBDb2RlYyAyLjAgY29uZmlndXJhdGlvbnMuCisgKi8KK3N0cnVjdCBDb25maWdNYXBwZXIgeworICAgIC8qKgorICAgICAqIFZhbHVlIG1hcHBlciAoQzJWYWx1ZSA9PiBDMlZhbHVlKQorICAgICAqLworICAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjxDMlZhbHVlKEMyVmFsdWUpPiBNYXBwZXI7CisKKyAgICAvLy8gc2hvcnRoYW5kCisgICAgdHlwZWRlZiBDQ29kZWNDb25maWc6OkRvbWFpbiBEb21haW47CisKKyAgICBDb25maWdNYXBwZXIoc3RkOjpzdHJpbmcgbWVkaWFLZXksIEMyU3RyaW5nIGMyc3RydWN0LCBDMlN0cmluZyBjMmZpZWxkKQorICAgICAgICA6IG1Eb21haW4oRG9tYWluOjpBTEwpLCBtTWVkaWFLZXkobWVkaWFLZXkpLCBtU3RydWN0KGMyc3RydWN0KSwgbUZpZWxkKGMyZmllbGQpIHsgfQorCisgICAgLy8vIExpbWl0cyB0aGlzIHBhcmFtZXRlciB0byB0aGUgZ2l2ZW4gZG9tYWluCisgICAgQ29uZmlnTWFwcGVyICZsaW1pdFRvKHVpbnQzMl90IGRvbWFpbikgeworICAgICAgICBDMl9DSEVDSyhkb21haW4gJiBEb21haW46OkdVQVJEX0JJVCk7CisgICAgICAgIG1Eb21haW4gPSBEb21haW4obURvbWFpbiAmIGRvbWFpbik7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLy8gQWRkcyBTREsgPT4gQ29kZWMgMi4wIG1hcHBlciAoc2hvdWxkIG5vdCBiZSBpbiB0aGUgU0RLIGZvcm1hdCkKKyAgICBDb25maWdNYXBwZXIgJndpdGhNYXBwZXIoTWFwcGVyIG1hcHBlcikgeworICAgICAgICBDMl9DSEVDSyghbU1hcHBlcik7CisgICAgICAgIEMyX0NIRUNLKCFtUmV2ZXJzZSk7CisgICAgICAgIG1NYXBwZXIgPSBtYXBwZXI7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLy8gQWRkcyBTREsgPD0+IENvZGVjIDIuMCB2YWx1ZSBtYXBwZXJzCisgICAgQ29uZmlnTWFwcGVyICZ3aXRoTWFwcGVycyhNYXBwZXIgbWFwcGVyLCBNYXBwZXIgcmV2ZXJzZSkgeworICAgICAgICBDMl9DSEVDSyghbU1hcHBlcik7CisgICAgICAgIEMyX0NIRUNLKCFtUmV2ZXJzZSk7CisgICAgICAgIG1NYXBwZXIgPSBtYXBwZXI7CisgICAgICAgIG1SZXZlcnNlID0gcmV2ZXJzZTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8vLyBBZGRzIFNESyA8PT4gQ29kZWMgMi4wIHZhbHVlIG1hcHBlcnMgYmFzZWQgb24gQzJNYXBwZXIKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDMlR5cGUsIHR5cGVuYW1lIFNka1R5cGU9aW50MzJfdD4KKyAgICBDb25maWdNYXBwZXIgJndpdGhDMk1hcHBlcnMoKSB7CisgICAgICAgIEMyX0NIRUNLKCFtTWFwcGVyKTsKKyAgICAgICAgQzJfQ0hFQ0soIW1SZXZlcnNlKTsKKyAgICAgICAgbU1hcHBlciA9IFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBTZGtUeXBlIHNka1ZhbHVlOworICAgICAgICAgICAgQzJUeXBlIGMyVmFsdWU7CisgICAgICAgICAgICBpZiAodi5nZXQoJnNka1ZhbHVlKSAmJiBDMk1hcHBlcjo6bWFwKHNka1ZhbHVlLCAmYzJWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYzJWYWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH07CisgICAgICAgIG1SZXZlcnNlID0gW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIFNka1R5cGUgc2RrVmFsdWU7CisgICAgICAgICAgICBDMlR5cGUgYzJWYWx1ZTsKKyAgICAgICAgICAgIHVzaW5nIEMyVmFsdWVUeXBlPXR5cGVuYW1lIF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGU8QzJUeXBlPjo6dHlwZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgoQzJWYWx1ZVR5cGUqKSZjMlZhbHVlKSAmJiBDMk1hcHBlcjo6bWFwKGMyVmFsdWUsICZzZGtWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2RrVmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8vIE1hcHMgZnJvbSBTREsgdmFsdWVzIGluIGFuIEFNZXNzYWdlIHRvIGEgc3VpdGFibGUgQzJWYWx1ZS4KKyAgICBDMlZhbHVlIG1hcEZyb21NZXNzYWdlKGNvbnN0IEFNZXNzYWdlOjpJdGVtRGF0YSAmaXRlbSkgY29uc3QgeworICAgICAgICBDMlZhbHVlIHZhbHVlOworICAgICAgICBpbnQzMl90IGludDMyVmFsdWU7CisgICAgICAgIGludDY0X3QgaW50NjRWYWx1ZTsKKyAgICAgICAgZmxvYXQgZmxvYXRWYWx1ZTsKKyAgICAgICAgZG91YmxlIGRvdWJsZVZhbHVlOworICAgICAgICBpZiAoaXRlbS5maW5kKCZpbnQzMlZhbHVlKSkgeworICAgICAgICAgICAgdmFsdWUgPSBpbnQzMlZhbHVlOworICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uZmluZCgmaW50NjRWYWx1ZSkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gaW50NjRWYWx1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChpdGVtLmZpbmQoJmZsb2F0VmFsdWUpKSB7CisgICAgICAgICAgICB2YWx1ZSA9IGZsb2F0VmFsdWU7CisgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5maW5kKCZkb3VibGVWYWx1ZSkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gKGZsb2F0KWRvdWJsZVZhbHVlOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZS50eXBlKCkgIT0gQzJWYWx1ZTo6Tk9fSU5JVCAmJiBtTWFwcGVyKSB7CisgICAgICAgICAgICB2YWx1ZSA9IG1NYXBwZXIodmFsdWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvLy8gTWFwcyBmcm9tIGEgQzJWYWx1ZSB0byBhbiBTREsgdmFsdWUgaW4gYW4gQU1lc3NhZ2UuCisgICAgQU1lc3NhZ2U6Okl0ZW1EYXRhIG1hcFRvTWVzc2FnZShDMlZhbHVlIHZhbHVlKSBjb25zdCB7CisgICAgICAgIEFNZXNzYWdlOjpJdGVtRGF0YSBpdGVtOworICAgICAgICBpbnQzMl90IGludDMyVmFsdWU7CisgICAgICAgIHVpbnQzMl90IHVpbnQzMlZhbHVlOworICAgICAgICBpbnQ2NF90IGludDY0VmFsdWU7CisgICAgICAgIHVpbnQ2NF90IHVpbnQ2NFZhbHVlOworICAgICAgICBmbG9hdCBmbG9hdFZhbHVlOworICAgICAgICBpZiAodmFsdWUudHlwZSgpICE9IEMyVmFsdWU6Ok5PX0lOSVQgJiYgbVJldmVyc2UpIHsKKyAgICAgICAgICAgIHZhbHVlID0gbVJldmVyc2UodmFsdWUpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZS5nZXQoJmludDMyVmFsdWUpKSB7CisgICAgICAgICAgICBpdGVtLnNldChpbnQzMlZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5nZXQoJnVpbnQzMlZhbHVlKSAmJiB1aW50MzJWYWx1ZSA8PSB1aW50MzJfdChJTlQzMl9NQVgpKSB7CisgICAgICAgICAgICAvLyBTREsgZG9lcyBub3Qgc3VwcG9ydCB1bnNpZ25lZCB2YWx1ZXMKKyAgICAgICAgICAgIGl0ZW0uc2V0KChpbnQzMl90KXVpbnQzMlZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5nZXQoJmludDY0VmFsdWUpKSB7CisgICAgICAgICAgICBpdGVtLnNldChpbnQ2NFZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5nZXQoJnVpbnQ2NFZhbHVlKSAmJiB1aW50NjRWYWx1ZSA8PSB1aW50NjRfdChJTlQ2NF9NQVgpKSB7CisgICAgICAgICAgICAvLyBTREsgZG9lcyBub3Qgc3VwcG9ydCB1bnNpZ25lZCB2YWx1ZXMKKyAgICAgICAgICAgIGl0ZW0uc2V0KChpbnQ2NF90KXVpbnQ2NFZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5nZXQoJmZsb2F0VmFsdWUpKSB7CisgICAgICAgICAgICBpdGVtLnNldChmbG9hdFZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXRlbTsKKyAgICB9CisKKyAgICBEb21haW4gZG9tYWluKCkgY29uc3QgeyByZXR1cm4gbURvbWFpbjsgfQorICAgIHN0ZDo6c3RyaW5nIG1lZGlhS2V5KCkgY29uc3QgeyByZXR1cm4gbU1lZGlhS2V5OyB9CisgICAgc3RkOjpzdHJpbmcgcGF0aCgpIGNvbnN0IHsgcmV0dXJuIG1GaWVsZC5zaXplKCkgPyBtU3RydWN0ICsgJy4nICsgbUZpZWxkIDogbVN0cnVjdDsgfQorICAgIE1hcHBlciBtYXBwZXIoKSBjb25zdCB7IHJldHVybiBtTWFwcGVyOyB9CisgICAgTWFwcGVyIHJldmVyc2UoKSBjb25zdCB7IHJldHVybiBtUmV2ZXJzZTsgfQorCitwcml2YXRlOgorICAgIERvbWFpbiBtRG9tYWluOyAgICAgICAgIC8vLzwgcGFyYW1ldGVyIGRvbWFpbiAobWFzaykgY29udGFpbmluZyBwb3J0LCBraW5kIGFuZCBjb25maWcgZG9tYWlucworICAgIHN0ZDo6c3RyaW5nIG1NZWRpYUtleTsgIC8vLzwgU0RLIGtleQorICAgIEMyU3RyaW5nIG1TdHJ1Y3Q7ICAgICAgIC8vLzwgQ29kZWMgMi4wIHN0cnVjdCBuYW1lCisgICAgQzJTdHJpbmcgbUZpZWxkOyAgICAgICAgLy8vPCBDb2RlYyAyLjAgZmllbGQgbmFtZQorICAgIE1hcHBlciBtTWFwcGVyOyAgICAgICAgIC8vLzwgb3B0aW9uYWwgU0RLID0+IENvZGVjIDIuMCB2YWx1ZSBtYXBwZXIKKyAgICBNYXBwZXIgbVJldmVyc2U7ICAgICAgICAvLy88IG9wdGlvbmFsIENvZGVjIDIuMCA9PiBTREsgdmFsdWUgbWFwcGVyCit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUE9SVCwgdHlwZW5hbWUgU1RSRUFNPgorQVN0cmluZyBRdWVyeU1lZGlhVHlwZUltcGwoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCkgeworICAgIEFTdHJpbmcgbWVkaWFUeXBlOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBjMl9zdGF0dXNfdCBjMmVyciA9IGNvbXBvbmVudC0+cXVlcnkoCisgICAgICAgICAgICB7fSwgeyBQT1JUOjpQQVJBTV9UWVBFLCBTVFJFQU06OlBBUkFNX1RZUEUgfSwgQzJfRE9OVF9CTE9DSywgJnF1ZXJpZWQpOworICAgIGlmIChjMmVyciAhPSBDMl9PSyAmJiBxdWVyaWVkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dEKCJRdWVyeSBtZWRpYSB0eXBlIGZhaWxlZCA9PiAlcyIsIGFzU3RyaW5nKGMyZXJyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUE9SVCAqcG9ydE1lZGlhVHlwZSA9CisgICAgICAgICAgICBQT1JUOjpGcm9tKHF1ZXJpZWRbMF0uZ2V0KCkpOworICAgICAgICBpZiAocG9ydE1lZGlhVHlwZSkgeworICAgICAgICAgICAgbWVkaWFUeXBlID0gQVN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgcG9ydE1lZGlhVHlwZS0+bS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgc3Rybmxlbihwb3J0TWVkaWFUeXBlLT5tLnZhbHVlLCBwb3J0TWVkaWFUeXBlLT5mbGV4Q291bnQoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU1RSRUFNICpzdHJlYW1NZWRpYVR5cGUgPSBTVFJFQU06OkZyb20ocXVlcmllZFswXS5nZXQoKSk7CisgICAgICAgICAgICBpZiAoc3RyZWFtTWVkaWFUeXBlKSB7CisgICAgICAgICAgICAgICAgbWVkaWFUeXBlID0gQVN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbU1lZGlhVHlwZS0+bS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5sZW4oc3RyZWFtTWVkaWFUeXBlLT5tLnZhbHVlLCBzdHJlYW1NZWRpYVR5cGUtPmZsZXhDb3VudCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR0QoInJlYWQgbWVkaWEgdHlwZTogJXMiLCBtZWRpYVR5cGUuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBtZWRpYVR5cGU7Cit9CisKK0FTdHJpbmcgUXVlcnlNZWRpYVR5cGUoCisgICAgICAgIGJvb2wgaW5wdXQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCkgeworICAgIHR5cGVkZWYgQzJQb3J0TWVkaWFUeXBlU2V0dGluZyBQOworICAgIHR5cGVkZWYgQzJTdHJlYW1NZWRpYVR5cGVTZXR0aW5nIFM7CisgICAgaWYgKGlucHV0KSB7CisgICAgICAgIHJldHVybiBRdWVyeU1lZGlhVHlwZUltcGw8UDo6aW5wdXQsIFM6OmlucHV0Pihjb21wb25lbnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBRdWVyeU1lZGlhVHlwZUltcGw8UDo6b3V0cHV0LCBTOjpvdXRwdXQ+KGNvbXBvbmVudCk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UKKworLyoqCisgKiBTZXQgb2Ygc3RhbmRhcmQgcGFyYW1ldGVycyB1c2VkIGJ5IENDb2RlYyB0aGF0IGFyZSBleHBvc2VkIHRvIE1lZGlhQ29kZWMuCisgKi8KK3N0cnVjdCBTdGFuZGFyZFBhcmFtcyB7CisgICAgdHlwZWRlZiBDQ29kZWNDb25maWc6OkRvbWFpbiBEb21haW47CisKKyAgICAvLyBzdGFuZGFyZCAoTWVkaWFDb2RlYykgcGFyYW1zIGFyZSBrZXllZCBieSBtZWRpYSBmb3JtYXQga2V5CisgICAgdHlwZWRlZiBzdGQ6OnN0cmluZyBTZGtLZXk7CisKKyAgICAvLy8gdXNlZCB0byByZXR1cm4gcmVmZXJlbmNlIHRvIG5vIGNvbmZpZyBtYXBwZXJzIGluIGdldENvbmZpZ01hcHBlcnNGb3JTZGtLZXkKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPiBOT19NQVBQRVJTOworCisgICAgLy8vIFJldHVybnMgQ29kZWMgMi4wIGVxdWl2YWxlbnQgcGFyYW1ldGVycyBmb3IgYW4gU0RLIGZvcm1hdCBrZXkuCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPiAmZ2V0Q29uZmlnTWFwcGVyc0ZvclNka0tleShzdGQ6OnN0cmluZyBrZXkpIGNvbnN0IHsKKyAgICAgICAgYXV0byBpdCA9IG1Db25maWdNYXBwZXJzLmZpbmQoa2V5KTsKKyAgICAgICAgaWYgKGl0ID09IG1Db25maWdNYXBwZXJzLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HRCgibm8gYzIgZXF1aXZhbGVudHMgZm9yICVzIiwga2V5LmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIE5PX01BUFBFUlM7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImZvdW5kICV6dSBlcXMgZm9yICVzIiwgaXQtPnNlY29uZC5zaXplKCksIGtleS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIFNESyA8PT4gQ29kZWMgMi4wIHBhcmFtZXRlciBtYXBwaW5nLiBNdWx0aXBsZSBDb2RlYyAyLjAgcGFyYW1ldGVycyBtYXkgbWFwIHRvIGEKKyAgICAgKiBzaW5nbGUgU0RLIGtleSwgaW4gd2hpY2ggY2FzZSB0aGV5IHNoYWxsIGJlIG9yZGVyZWQgZnJvbSBsZWFzdCBhdXRob3JpdGF0aXZlIHRvIG1vc3QKKyAgICAgKiBhdXRob3JpdGF0aXZlLiBXaGVuIGNvbnN0cnVjdGluZyBTREsgZm9ybWF0cywgdGhlIGxhc3QgbWFwcGVkIENvZGVjIDIuMCBwYXJhbWV0ZXIgdGhhdAorICAgICAqIGlzIHN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50IHdpbGwgZGV0ZXJtaW5lIHRoZSBleHBvc2VkIHZhbHVlLiAoVE9ETzogcGVyaGFwcyByZXN0cmljdCB0aGlzCisgICAgICogYnkgZG9tYWluLikKKyAgICAgKi8KKyAgICB2b2lkIGFkZChjb25zdCBDb25maWdNYXBwZXIgJmNtKSB7CisgICAgICAgIGF1dG8gaXQgPSBtQ29uZmlnTWFwcGVycy5maW5kKGNtLm1lZGlhS2V5KCkpOworICAgICAgICBBTE9HVigiJWMlYyVjJWMgJWMlYyVjICUwNHggJTlzICVzID0+ICVzIiwKKyAgICAgICAgICAgICAgKChjbS5kb21haW4oKSAmIERvbWFpbjo6SVNfSU5QVVQpID8gJ0knIDogJyAnKSwKKyAgICAgICAgICAgICAgKChjbS5kb21haW4oKSAmIERvbWFpbjo6SVNfT1VUUFVUKSA/ICdPJyA6ICcgJyksCisgICAgICAgICAgICAgICgoY20uZG9tYWluKCkgJiBEb21haW46OklTX0NPREVEKSA/ICdDJyA6ICcgJyksCisgICAgICAgICAgICAgICgoY20uZG9tYWluKCkgJiBEb21haW46OklTX1JBVykgPyAnUicgOiAnICcpLAorICAgICAgICAgICAgICAoKGNtLmRvbWFpbigpICYgRG9tYWluOjpJU19DT05GSUcpID8gJ2MnIDogJyAnKSwKKyAgICAgICAgICAgICAgKChjbS5kb21haW4oKSAmIERvbWFpbjo6SVNfUEFSQU0pID8gJ3AnIDogJyAnKSwKKyAgICAgICAgICAgICAgKChjbS5kb21haW4oKSAmIERvbWFpbjo6SVNfUkVBRCkgPyAncicgOiAnICcpLAorICAgICAgICAgICAgICBjbS5kb21haW4oKSwKKyAgICAgICAgICAgICAgaXQgPT0gbUNvbmZpZ01hcHBlcnMuZW5kKCkgPyAiYWRkaW5nIiA6ICJleHRlbmRpbmciLAorICAgICAgICAgICAgICBjbS5tZWRpYUtleSgpLmNfc3RyKCksIGNtLnBhdGgoKS5jX3N0cigpKTsKKyAgICAgICAgaWYgKGl0ID09IG1Db25maWdNYXBwZXJzLmVuZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDb25maWdNYXBwZXI+IGVxcyA9IHsgY20gfTsKKyAgICAgICAgICAgIG1Db25maWdNYXBwZXJzLmVtcGxhY2UoY20ubWVkaWFLZXkoKSwgZXFzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGl0LT5zZWNvbmQucHVzaF9iYWNrKGNtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYWxsIHBhdGhzIGZvciBhIHNwZWNpZmljIGRvbWFpbi4KKyAgICAgKgorICAgICAqIFxwYXJhbSBhbnkgbWF4aW11bSBkb21haW4gbWFzay4gUmV0dXJuZWQgcGFyYW1ldGVycyBtdXN0IG1hdGNoIGF0IGxlYXN0IG9uZSBvZiB0aGUgZG9tYWlucworICAgICAqICAgICAgICAgICAgaW4gdGhlIG1hc2suCisgICAgICogXHBhcmFtIGFsbCBtaW5pbXVtIGRvbWFpbiBtYXNrLiBSZXR1cm5lZCBwYXJhbWV0ZXJzIG11c3QgbWF0Y2ggYWxsIG9mIHRoZSBkb21haW5zIGluIHRoZQorICAgICAqICAgICAgICAgICAgbWFzay4gVGhpcyBpcyByZXN0cmljdGVkIHRvIHRoZSBiaXRzIG9mIHRoZSBtYXhpbXVtIG1hc2suCisgICAgICovCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGdldFBhdGhzRm9yRG9tYWluKAorICAgICAgICAgICAgRG9tYWluIGFueSwgRG9tYWluIGFsbCA9IERvbWFpbjo6QUxMKSBjb25zdCB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByZXM7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvcjxDb25maWdNYXBwZXI+PiAmZWwgOiBtQ29uZmlnTWFwcGVycykgeworICAgICAgICAgICAgZm9yIChjb25zdCBDb25maWdNYXBwZXIgJmNtIDogZWwuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImZpbHRlcmluZyAlcyAleCAleCAleCAleCIsIGNtLnBhdGgoKS5jX3N0cigpLCBjbS5kb21haW4oKSwgYW55LAorICAgICAgICAgICAgICAgICAgICAgICAgKGNtLmRvbWFpbigpICYgYW55KSwgKGNtLmRvbWFpbigpICYgYW55ICYgYWxsKSk7CisgICAgICAgICAgICAgICAgaWYgKChjbS5kb21haW4oKSAmIGFueSkgJiYgKChjbS5kb21haW4oKSAmIGFueSAmIGFsbCkgPT0gKGFueSAmIGFsbCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcy5wdXNoX2JhY2soY20ucGF0aCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIFNESyA8PT4gQ29kZWMgMi4wIG1hcHBpbmdzLgorICAgICAqCisgICAgICogVE9ETzogcmVwbGFjZSB0aGVzZSB3aXRoIGJldHRlciBtZXRob2RzIGFzIHRoaXMgZXhwb3NlcyB0aGUgaW5uZXIgc3RydWN0dXJlLgorICAgICAqLworICAgIGNvbnN0IHN0ZDo6bWFwPFNka0tleSwgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPj4gZ2V0S2V5cygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Db25maWdNYXBwZXJzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6Om1hcDxTZGtLZXksIHN0ZDo6dmVjdG9yPENvbmZpZ01hcHBlcj4+IG1Db25maWdNYXBwZXJzOworfTsKKworY29uc3Qgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPiBTdGFuZGFyZFBhcmFtczo6Tk9fTUFQUEVSUzsKKworCitDQ29kZWNDb25maWc6OkNDb2RlY0NvbmZpZygpCisgICAgOiBtSW5wdXRGb3JtYXQobmV3IEFNZXNzYWdlKSwKKyAgICAgIG1PdXRwdXRGb3JtYXQobmV3IEFNZXNzYWdlKSwKKyAgICAgIG1Vc2luZ1N1cmZhY2UoZmFsc2UpIHsgfQorCit2b2lkIENDb2RlY0NvbmZpZzo6aW5pdGlhbGl6ZVN0YW5kYXJkUGFyYW1zKCkgeworICAgIHR5cGVkZWYgRG9tYWluIEQ7CisgICAgbVN0YW5kYXJkUGFyYW1zID0gc3RkOjptYWtlX3NoYXJlZDxTdGFuZGFyZFBhcmFtcz4oKTsKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQ29uZmlnTWFwcGVyICYpPiBhZGQgPQorICAgICAgICBbcGFyYW1zID0gbVN0YW5kYXJkUGFyYW1zXShjb25zdCBDb25maWdNYXBwZXIgJmNtKSB7CisgICAgICAgICAgICBwYXJhbXMtPmFkZChjbSk7CisgICAgfTsKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgQ29uZmlnTWFwcGVyICYpPiBkZXByZWNhdGVkID0gYWRkOworCisgICAgLy8gYWxsb3cgaW50MzIgb3IgZmxvYXQgU0RLIHZhbHVlcyBhbmQgcmVwcmVzZW50IHRoZW0gYXMgZmxvYXQKKyAgICBDb25maWdNYXBwZXI6Ok1hcHBlciBtYWtlRmxvYXQgPSBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAvLyBjb252ZXJ0IGZyb20gaTMyIHRvIGZsb2F0CisgICAgICAgIGludDMyX3QgaTMyVmFsdWU7CisgICAgICAgIGZsb2F0IGZwVmFsdWU7CisgICAgICAgIGlmICh2LmdldCgmaTMyVmFsdWUpKSB7CisgICAgICAgICAgICByZXR1cm4gKGZsb2F0KWkzMlZhbHVlOworICAgICAgICB9IGVsc2UgaWYgKHYuZ2V0KCZmcFZhbHVlKSkgeworICAgICAgICAgICAgcmV0dXJuIGZwVmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICB9OworCisgICAgQ29uZmlnTWFwcGVyOjpNYXBwZXIgbmVnYXRlID0gW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiAtdmFsdWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICB9OworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTUlNRSwgICAgIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUsICAgICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OklOUFVUICYgRDo6UkVBRCkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX01JTUUsICAgICBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSwgICAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpPVVRQVVQgJiBEOjpSRUFEKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9CSVRfUkFURSwgQzJfUEFSQU1LRVlfQklUUkFURSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6Ok9VVFBVVCkpOworICAgIC8vIHdlIGFsc28gbmVlZCB0byBwdXQgdGhlIGJpdHJhdGUgaW4gdGhlIG1heCBiaXRyYXRlIGZpZWxkCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTUFYX0JJVF9SQVRFLCBDMl9QQVJBTUtFWV9CSVRSQVRFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6UkVBRCAmIEQ6Ok9VVFBVVCkpOworICAgIGFkZChDb25maWdNYXBwZXIoUEFSQU1FVEVSX0tFWV9WSURFT19CSVRSQVRFLCBDMl9QQVJBTUtFWV9CSVRSQVRFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6VklERU8gJiBEOjpQQVJBTSkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0JJVFJBVEVfTU9ERSwgQzJfUEFSQU1LRVlfQklUUkFURV9NT0RFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6Q09ERUQpCisgICAgICAgIC53aXRoQzJNYXBwZXJzPEMyQ29uZmlnOjpiaXRyYXRlX21vZGVfdD4oKSk7CisgICAgLy8gcmVtb3ZlIHdoZW4gY29kZWNzIHN3aXRjaCB0byBQQVJBTUtFWSBhbmQgbmV3IG1vZGVzCisgICAgZGVwcmVjYXRlZChDb25maWdNYXBwZXIoS0VZX0JJVFJBVEVfTU9ERSwgImNvZGVkLmJpdHJhdGUtbW9kZSIsICJ2YWx1ZSIpCisgICAgICAgICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfRlJBTUVfUkFURSwgQzJfUEFSQU1LRVlfRlJBTUVfUkFURSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8pCisgICAgICAgIC53aXRoTWFwcGVycyhtYWtlRmxvYXQsIFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICAvLyByZWFkIGJhY2sgYWx3YXlzIGFzIGludAorICAgICAgICAgICAgZmxvYXQgdmFsdWU7CisgICAgICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoaW50MzJfdCl2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX01BWF9JTlBVVF9TSVpFLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OklOUFVUKSk7CisgICAgLy8gcmVtb3ZlIHdoZW4gY29kZWNzIHN3aXRjaCB0byBQQVJBTUtFWQorICAgIGRlcHJlY2F0ZWQoQ29uZmlnTWFwcGVyKEtFWV9NQVhfSU5QVVRfU0laRSwgImNvZGVkLm1heC1mcmFtZS1zaXplIiwgInZhbHVlIikKKyAgICAgICAgICAgICAgIC5saW1pdFRvKEQ6OklOUFVUKSk7CisKKyAgICAvLyBSb3RhdGlvbgorICAgIC8vIE5vdGU6IFNESyByb3RhdGlvbiBpcyBjbG9jay13aXNlLCB3aGlsZSBDMiByb3RhdGlvbiBpcyBjb3VudGVyLWNsb2NrLXdpc2UKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9ST1RBVElPTiwgQzJfUEFSQU1LRVlfVlVJX1JPVEFUSU9OLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyAmIEQ6OkNPREVEKQorICAgICAgICAud2l0aE1hcHBlcnMobmVnYXRlLCBuZWdhdGUpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9ST1RBVElPTiwgQzJfUEFSQU1LRVlfUk9UQVRJT04sICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6UkFXKQorICAgICAgICAud2l0aE1hcHBlcnMobmVnYXRlLCBuZWdhdGUpKTsKKworICAgIC8vIGFuZHJvaWQgJ3ZpZGVvLXNjYWxpbmcnCisgICAgYWRkKENvbmZpZ01hcHBlcigiYW5kcm9pZC5fdmlkZW8tc2NhbGluZyIsIEMyX1BBUkFNS0VZX1NVUkZBQ0VfU0NBTElOR19NT0RFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyAmIEQ6OkRFQ09ERVIgJiBEOjpSQVcpKTsKKworICAgIC8vIENvbG9yIEFzcGVjdHMKKyAgICAvLworICAgIC8vIGNvbmZpZ3VyZSBkZWZhdWx0IGZvciBkZWNvZGVycworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NPTE9SX1JBTkdFLCAgICAgICBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMsICAgInJhbmdlIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpDT0RFRCAmIChEOjpDT05GSUcgfCBEOjpQQVJBTSkpCisgICAgICAgIC53aXRoQzJNYXBwZXJzPEMyQ29sb3I6OnJhbmdlX3Q+KCkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NPTE9SX1RSQU5TRkVSLCAgICBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMsICAgInRyYW5zZmVyIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpDT0RFRCAmIChEOjpDT05GSUcgfCBEOjpQQVJBTSkpCisgICAgICAgIC53aXRoQzJNYXBwZXJzPEMyQ29sb3I6OnRyYW5zZmVyX3Q+KCkpOworICAgIGFkZChDb25maWdNYXBwZXIoImNvbG9yLXByaW1hcmllcyIsICAgICBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMsICAgInByaW1hcmllcyIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6Q09ERUQgJiAoRDo6Q09ORklHIHwgRDo6UEFSQU0pKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItbWF0cml4IiwgICAgICAgIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUywgICAibWF0cml4IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpDT0RFRCAmIChEOjpDT05GSUcgfCBEOjpQQVJBTSkpKTsKKworICAgIC8vIHJlYWQgYmFjayBmaW5hbCBmb3IgZGVjb2RlciBvdXRwdXQgKGFsc28sIGNvbmZpZ3VyZSBmaW5hbCBhc3BlY3RzIGFzIHdlbGwuIFRoaXMgc2hvdWxkIGJlCisgICAgLy8gb3ZlcndyaXR0ZW4gYmFzZWQgb24gY29kZWQvZGVmYXVsdCB2YWx1ZXMgaWYgY29tcG9uZW50IHN1cHBvcnRzIGNvbG9yIGFzcGVjdHMsIGJ1dCBpcyB1c2VkCisgICAgLy8gYXMgZmluYWwgdmFsdWVzIGlmIGNvbXBvbmVudCBkb2VzIG5vdCBzdXBwb3J0IGFzcGVjdHMgYXQgYWxsKQorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NPTE9SX1JBTkdFLCAgICAgICBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTLCAgICJyYW5nZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6UkFXKQorICAgICAgICAud2l0aEMyTWFwcGVyczxDMkNvbG9yOjpyYW5nZV90PigpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DT0xPUl9UUkFOU0ZFUiwgICAgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUywgICAidHJhbnNmZXIiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OlJBVykKKyAgICAgICAgLndpdGhDMk1hcHBlcnM8QzJDb2xvcjo6dHJhbnNmZXJfdD4oKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItcHJpbWFyaWVzIiwgICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgInByaW1hcmllcyIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItbWF0cml4IiwgICAgICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgIm1hdHJpeCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6UkFXKSk7CisKKyAgICAvLyBjb25maWd1cmUgc291cmNlIGFzcGVjdHMgZm9yIGVuY29kZXJzIGFuZCByZWFkIHRoZW0gYmFjayBvbiB0aGUgY29kZWQoISkgcG9ydC4KKyAgICAvLyBUaGlzIGlzIHRvIGVuc3VyZSBtdXhpbmcgdGhlIGRlc2lyZWQgYXNwZWN0cyBpbnRvIHRoZSBjb250YWluZXIuCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ09MT1JfUkFOR0UsICAgICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgInJhbmdlIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6RU5DT0RFUiAgJiBEOjpDT0RFRCkKKyAgICAgICAgLndpdGhDMk1hcHBlcnM8QzJDb2xvcjo6cmFuZ2VfdD4oKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ09MT1JfVFJBTlNGRVIsICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgInRyYW5zZmVyIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6RU5DT0RFUiAgJiBEOjpDT0RFRCkKKyAgICAgICAgLndpdGhDMk1hcHBlcnM8QzJDb2xvcjo6dHJhbnNmZXJfdD4oKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItcHJpbWFyaWVzIiwgICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgInByaW1hcmllcyIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkVOQ09ERVIgICYgRDo6Q09ERUQpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjb2xvci1tYXRyaXgiLCAgICAgICAgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUywgICAibWF0cml4IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6RU5DT0RFUiAgJiBEOjpDT0RFRCkpOworCisgICAgLy8gcmVhZCBiYWNrIGNvZGVkIGFzcGVjdHMgZm9yIGVuY29kZXJzIChvbiB0aGUgcmF3IHBvcnQpLCBidXQgYWxzbyBjb25maWd1cmUKKyAgICAvLyBkZXNpcmVkIGFzcGVjdHMgaGVyZS4KKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DT0xPUl9SQU5HRSwgICAgICAgQzJfUEFSQU1LRVlfVlVJX0NPTE9SX0FTUEVDVFMsICAgInJhbmdlIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6RU5DT0RFUiAgJiBEOjpSQVcpCisgICAgICAgIC53aXRoQzJNYXBwZXJzPEMyQ29sb3I6OnJhbmdlX3Q+KCkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NPTE9SX1RSQU5TRkVSLCAgICBDMl9QQVJBTUtFWV9WVUlfQ09MT1JfQVNQRUNUUywgICAidHJhbnNmZXIiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpFTkNPREVSICAmIEQ6OlJBVykKKyAgICAgICAgLndpdGhDMk1hcHBlcnM8QzJDb2xvcjo6dHJhbnNmZXJfdD4oKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItcHJpbWFyaWVzIiwgICAgIEMyX1BBUkFNS0VZX1ZVSV9DT0xPUl9BU1BFQ1RTLCAgICJwcmltYXJpZXMiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpFTkNPREVSICAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoImNvbG9yLW1hdHJpeCIsICAgICAgICBDMl9QQVJBTUtFWV9WVUlfQ09MT1JfQVNQRUNUUywgICAibWF0cml4IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6RU5DT0RFUiAgJiBEOjpSQVcpKTsKKworICAgIC8vIERhdGFzcGFjZQorICAgIGFkZChDb25maWdNYXBwZXIoImFuZHJvaWQuX2RhdGFzcGFjZSIsIEMyX1BBUkFNS0VZX0RBVEFfU1BBQ0UsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworCisgICAgLy8gSERSCisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2LnJlZC54IiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLnJlZC54IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2LnJlZC55IiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLnJlZC55IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2LmdyZWVuLngiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcuZ3JlZW4ueCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni5ncmVlbi55IiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLmdyZWVuLnkiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYuYmx1ZS54IiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLmJsdWUueCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni5ibHVlLnkiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcuYmx1ZS55IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2LndoaXRlLngiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcud2hpdGUueCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni53aGl0ZS55IiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLndoaXRlLnkiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYubWF4LWx1bWluYW5jZSIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1hc3RlcmluZy5tYXgtbHVtaW5hbmNlIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2Lm1pbi1sdW1pbmFuY2UiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcubWluLWx1bWluYW5jZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoImN0YTg2MS5tYXgtY2xsIiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWF4LWNsbCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoImN0YTg2MS5tYXgtZmFsbCIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1heC1mYWxsIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKHN0ZDo6c3RyaW5nKEtFWV9GRUFUVVJFXykgKyBGRUFUVVJFX1NlY3VyZVBsYXliYWNrLAorICAgICAgICAgICAgICAgICAgICAgQzJfUEFSQU1LRVlfU0VDVVJFX01PREUsICJ2YWx1ZSIpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1BSRVBFTkRfSEVBREVSU19UT19TWU5DX0ZSQU1FUywKKyAgICAgICAgICAgICAgICAgICAgIEMyX1BBUkFNS0VZX1BSRVBFTkRfSEVBREVSX01PREUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIgJiBEOjpWSURFTykKKyAgICAgICAgLndpdGhNYXBwZXJzKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgPyBDMlZhbHVlKEMyQ29uZmlnOjpQUkVQRU5EX0hFQURFUl9UT19BTExfU1lOQykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDMlZhbHVlKEMyQ29uZmlnOjpQUkVQRU5EX0hFQURFUl9UT19OT05FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0sIFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBDMkNvbmZpZzo6cHJlcGVuZF9oZWFkZXJfbW9kZV90IHZhbHVlOworICAgICAgICAgICAgdXNpbmcgQzJWYWx1ZVR5cGU9dHlwZW5hbWUgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZTxkZWNsdHlwZSh2YWx1ZSk+Ojp0eXBlOworICAgICAgICAgICAgaWYgKHYuZ2V0KChDMlZhbHVlVHlwZSAqKSZ2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJDb25maWc6OlBSRVBFTkRfSEVBREVSX1RPX05PTkU6ICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJDb25maWc6OlBSRVBFTkRfSEVBREVSX1RPX0FMTF9TWU5DOiAgcmV0dXJuIDE7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJDb25maWc6OlBSRVBFTkRfSEVBREVSX09OX0NIQU5HRTogICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworICAgIC8vIHJlbW92ZSB3aGVuIGNvZGVjcyBzd2l0Y2ggdG8gUEFSQU1LRVkKKyAgICBkZXByZWNhdGVkKENvbmZpZ01hcHBlcihLRVlfUFJFUEVORF9IRUFERVJTX1RPX1NZTkNfRlJBTUVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2RpbmcuYWRkLWNzZC10by1zeW5jLWZyYW1lcyIsICJ2YWx1ZSIpCisgICAgICAgICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6VklERU8pKTsKKyAgICAvLyBjb252ZXJ0IHRvIHRpbWVzdGFtcCBiYXNlCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfSV9GUkFNRV9JTlRFUlZBTCwgQzJfUEFSQU1LRVlfU1lOQ19GUkFNRV9JTlRFUlZBTCwgInZhbHVlIikKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIC8vIGNvbnZlcnQgZnJvbSBpMzIgdG8gZmxvYXQKKyAgICAgICAgICAgIGludDMyX3QgaTMyVmFsdWU7CisgICAgICAgICAgICBmbG9hdCBmcFZhbHVlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZpMzJWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW50NjRfdCgxMDAwMDAwKSAqIGkzMlZhbHVlOworICAgICAgICAgICAgfSBlbHNlIGlmICh2LmdldCgmZnBWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW50NjRfdChjMl9taW4oMTAwMDAwMCAqIGZwVmFsdWUgKyAwLjUsIChkb3VibGUpSU5UNjRfTUFYKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9KSk7CisgICAgLy8gcmVtb3ZlIHdoZW4gY29kZWNzIHN3aXRjaCB0byBwcm9wZXIgY29kaW5nLmdvcCAoYWRkIHN1cHBvcnQgZm9yIGNhbGN1bGF0aW5nIGdvcCkKKyAgICBkZXByZWNhdGVkKENvbmZpZ01hcHBlcigiaS1mcmFtZS1wZXJpb2QiLCAiY29kaW5nLmdvcCIsICJpbnRyYS1wZXJpb2QiKQorICAgICAgICAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6OlZJREVPKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfSU5UUkFfUkVGUkVTSF9QRVJJT0QsIEMyX1BBUkFNS0VZX0lOVFJBX1JFRlJFU0gsICJwZXJpb2QiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyAmIEQ6OkVOQ09ERVIpCisgICAgICAgIC53aXRoTWFwcGVycyhtYWtlRmxvYXQsIFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICAvLyByZWFkIGJhY2sgYWx3YXlzIGFzIGludAorICAgICAgICAgICAgZmxvYXQgdmFsdWU7CisgICAgICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoaW50MzJfdCl2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKyAgICBkZXByZWNhdGVkKENvbmZpZ01hcHBlcihQQVJBTUVURVJfS0VZX1JFUVVFU1RfU1lOQ19GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICJjb2RpbmcucmVxdWVzdC1zeW5jIiwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6UEFSQU0gJiBEOjpFTkNPREVSKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlKSAtPiBDMlZhbHVlIHsgcmV0dXJuIHVpbnQzMl90KDEpOyB9KSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihQQVJBTUVURVJfS0VZX1JFUVVFU1RfU1lOQ19GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgIEMyX1BBUkFNS0VZX1JFUVVFU1RfU1lOQ19GUkFNRSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6UEFSQU0gJiBEOjpFTkNPREVSKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlKSAtPiBDMlZhbHVlIHsgcmV0dXJuIHVpbnQzMl90KDEpOyB9KSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9PUEVSQVRJTkdfUkFURSwgICBDMl9QQVJBTUtFWV9PUEVSQVRJTkdfUkFURSwgICAgICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlBBUkFNIHwgRDo6Q09ORklHKSAvLyB3cml0ZS1vbmx5CisgICAgICAgIC53aXRoTWFwcGVyKG1ha2VGbG9hdCkpOworICAgIC8vIEMyIHByaW9yaXRpZXMgYXJlIGludmVydGVkCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUFJJT1JJVFksICAgICAgICAgQzJfUEFSQU1LRVlfUFJJT1JJVFksICAgICAgICAgICAidmFsdWUiKQorICAgICAgICAud2l0aE1hcHBlcnMobmVnYXRlLCBuZWdhdGUpKTsKKyAgICAvLyByZW1vdmUgd2hlbiBjb2RlY3Mgc3dpdGNoIHRvIFBBUkFNS0VZCisgICAgZGVwcmVjYXRlZChDb25maWdNYXBwZXIoS0VZX09QRVJBVElOR19SQVRFLCAgICJjdHJsLm9wZXJhdGluZy1yYXRlIiwgICAgICJ2YWx1ZSIpCisgICAgICAgICAgICAgICAud2l0aE1hcHBlcihtYWtlRmxvYXQpKTsKKyAgICBkZXByZWNhdGVkKENvbmZpZ01hcHBlcihLRVlfUFJJT1JJVFksICAgICAgICAgImN0cmwucHJpb3JpdHkiLCAgICAgICAgICAgInZhbHVlIikpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfV0lEVEgsICAgICAgICAgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFLCAgICAgICAid2lkdGgiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyB8IEQ6OklNQUdFKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfSEVJR0hULCAgICAgICAgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFLCAgICAgICAiaGVpZ2h0IikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gfCBEOjpJTUFHRSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcigiY3JvcC1sZWZ0IiwgICAgICAgQzJfUEFSQU1LRVlfQ1JPUF9SRUNULCAgICAgICAibGVmdCIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPIHwgRDo6SU1BR0UpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjcm9wLXRvcCIsICAgICAgICBDMl9QQVJBTUtFWV9DUk9QX1JFQ1QsICAgICAgICJ0b3AiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyB8IEQ6OklNQUdFKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY3JvcC13aWR0aCIsICAgICAgQzJfUEFSQU1LRVlfQ1JPUF9SRUNULCAgICAgICAid2lkdGgiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyB8IEQ6OklNQUdFKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY3JvcC1oZWlnaHQiLCAgICAgQzJfUEFSQU1LRVlfQ1JPUF9SRUNULCAgICAgICAiaGVpZ2h0IikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gfCBEOjpJTUFHRSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTUFYX1dJRFRILCAgICAgQzJfUEFSQU1LRVlfTUFYX1BJQ1RVUkVfU0laRSwgICAgIndpZHRoIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTUFYX0hFSUdIVCwgICAgQzJfUEFSQU1LRVlfTUFYX1BJQ1RVUkVfU0laRSwgICAgImhlaWdodCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworCisgICAgYWRkKENvbmZpZ01hcHBlcigiY3NkLTAiLCAgICAgICAgICAgQzJfUEFSQU1LRVlfSU5JVF9EQVRBLCAgICAgICAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpPVVRQVVQgJiBEOjpSRUFEKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9IRFIxMF9QTFVTX0lORk8sIEMyX1BBUkFNS0VZX0lOUFVUX0hEUjEwX1BMVVNfSU5GTywgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gJiBEOjpQQVJBTSAmIEQ6OklOUFVUKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9IRFIxMF9QTFVTX0lORk8sIEMyX1BBUkFNS0VZX09VVFBVVF9IRFIxMF9QTFVTX0lORk8sICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6T1VUUFVUKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCBDMl9QQVJBTUtFWV9URU1QT1JBTF9MQVlFUklORywgIiIpCisgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIgJiBEOjpWSURFTyAmIEQ6Ok9VVFBVVCkpOworCisgICAgLy8gUGl4ZWwgRm9ybWF0ICh1c2UgbG9jYWwga2V5IGZvciBhY3R1YWwgcGl4ZWwgZm9ybWF0IGFzIHdlIGRvbid0IGRpc3Rpbmd1aXNoIGJldHdlZW4KKyAgICAvLyBTREsgbGF5b3V0cyBmb3IgZmxleGlibGUgZm9ybWF0IGFuZCB3ZSBuZWVkIHRoZSBhY3R1YWwgU0RLIGNvbG9yIGZvcm1hdCBpbiB0aGUgbWVkaWEgZm9ybWF0KQorICAgIGFkZChDb25maWdNYXBwZXIoImFuZHJvaWQuX2NvbG9yLWZvcm1hdCIsICBDMl9QQVJBTUtFWV9QSVhFTF9GT1JNQVQsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykKKyAgICAgICAgLndpdGhNYXBwZXJzKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0U3VyZmFjZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodWludDMyX3QpSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOworICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1aW50MzJfdClIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODg7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHVpbnQzMl90KUhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgc29tZSBzb3J0IG9mIHBhc3N0aHJvdWdoCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9LCBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgdWludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ09MT1JfRm9ybWF0U3VyZmFjZTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lWMTI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBzb21lIHNvcnQgb2YgcGFzc3Rocm91Z2gKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NIQU5ORUxfQ09VTlQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQsICAgICAgICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPKSk7IC8vIHJlYWQgYmFjayB0byBib3RoIGZvcm1hdHMKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DSEFOTkVMX0NPVU5ULCBDMl9QQVJBTUtFWV9DT0RFRF9DSEFOTkVMX0NPVU5ULCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkNPREVEKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9TQU1QTEVfUkFURSwgICBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSwgICAgICAgICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPKSk7IC8vIHJlYWQgYmFjayB0byBib3RoIHBvcnQgZm9ybWF0cworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1NBTVBMRV9SQVRFLCAgIEMyX1BBUkFNS0VZX0NPREVEX1NBTVBMRV9SQVRFLCAgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpDT0RFRCkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUENNX0VOQ09ESU5HLCAgQzJfUEFSQU1LRVlfUENNX0VOQ09ESU5HLCAgICAgICAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTykKKyAgICAgICAgLndpdGhNYXBwZXJzKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgQzJDb25maWc6OnBjbV9lbmNvZGluZ190IHRvOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkgJiYgQzJNYXBwZXI6Om1hcCh2YWx1ZSwgJnRvKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0bzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0sIFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QgdmFsdWU7CisgICAgICAgICAgICBpbnQzMl90IHRvOworICAgICAgICAgICAgdXNpbmcgQzJWYWx1ZVR5cGU9dHlwZW5hbWUgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZTxkZWNsdHlwZSh2YWx1ZSk+Ojp0eXBlOworICAgICAgICAgICAgaWYgKHYuZ2V0KChDMlZhbHVlVHlwZSopJnZhbHVlKSAmJiBDMk1hcHBlcjo6bWFwKHZhbHVlLCAmdG8pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRvOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfSVNfQURUUywgQzJfUEFSQU1LRVlfQUFDX1BBQ0tBR0lORywgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpDT0RFRCkKKyAgICAgICAgLndpdGhNYXBwZXJzKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkgJiYgdmFsdWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJDb25maWc6OkFBQ19QQUNLQUdJTkdfQURUUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0sIFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgmdmFsdWUpICYmIHZhbHVlID09IEMyQ29uZmlnOjpBQUNfUEFDS0FHSU5HX0FEVFMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGludDMyX3QpMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk1hcHBlcjo6UHJvZmlsZUxldmVsTWFwcGVyPiBtYXBwZXIgPQorICAgICAgICBDMk1hcHBlcjo6R2V0UHJvZmlsZUxldmVsTWFwcGVyKG1Db2RpbmdNZWRpYVR5cGUpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUFJPRklMRSwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCwgInByb2ZpbGUiKQorICAgICAgICAubGltaXRUbyhEOjpDT0RFRCkKKyAgICAgICAgLndpdGhNYXBwZXJzKFttYXBwZXJdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBDMkNvbmZpZzo6cHJvZmlsZV90IGMyID0gUFJPRklMRV9VTlVTRUQ7CisgICAgICAgICAgICBpbnQzMl90IHNkazsKKyAgICAgICAgICAgIGlmIChtYXBwZXIgJiYgdi5nZXQoJnNkaykgJiYgbWFwcGVyLT5tYXBQcm9maWxlKHNkaywgJmMyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBjMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBQUk9GSUxFX1VOVVNFRDsKKyAgICAgICAgfSwgW21hcHBlcl0oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpwcm9maWxlX3QgYzI7CisgICAgICAgICAgICBpbnQzMl90IHNkazsKKyAgICAgICAgICAgIHVzaW5nIEMyVmFsdWVUeXBlPXR5cGVuYW1lIF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGU8ZGVjbHR5cGUoYzIpPjo6dHlwZTsKKyAgICAgICAgICAgIGlmIChtYXBwZXIgJiYgdi5nZXQoKEMyVmFsdWVUeXBlKikmYzIpICYmIG1hcHBlci0+bWFwUHJvZmlsZShjMiwgJnNkaykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2RrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTEVWRUwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwsICJsZXZlbCIpCisgICAgICAgIC5saW1pdFRvKEQ6OkNPREVEKQorICAgICAgICAud2l0aE1hcHBlcnMoW21hcHBlcl0oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpsZXZlbF90IGMyID0gTEVWRUxfVU5VU0VEOworICAgICAgICAgICAgaW50MzJfdCBzZGs7CisgICAgICAgICAgICBpZiAobWFwcGVyICYmIHYuZ2V0KCZzZGspICYmIG1hcHBlci0+bWFwTGV2ZWwoc2RrLCAmYzIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGMyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIExFVkVMX1VOVVNFRDsKKyAgICAgICAgfSwgW21hcHBlcl0oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpsZXZlbF90IGMyOworICAgICAgICAgICAgaW50MzJfdCBzZGs7CisgICAgICAgICAgICB1c2luZyBDMlZhbHVlVHlwZT10eXBlbmFtZSBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlPGRlY2x0eXBlKGMyKT46OnR5cGU7CisgICAgICAgICAgICBpZiAobWFwcGVyICYmIHYuZ2V0KChDMlZhbHVlVHlwZSopJmMyKSAmJiBtYXBwZXItPm1hcExldmVsKGMyLCAmc2RrKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzZGs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9KSk7CisKKyAgICAvLyBjb252ZXJ0IHRvIGRCRlMgYW5kIGFkZCBkZWZhdWx0CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX0RSQ19UQVJHRVRfUkVGRVJFTkNFX0xFVkVMLCBDMl9QQVJBTUtFWV9EUkNfVEFSR0VUX1JFRkVSRU5DRV9MRVZFTCwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpERUNPREVSKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICghdi5nZXQoJnZhbHVlKSB8fCB2YWx1ZSA8IDApIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHByb3BlcnR5X2dldF9pbnQzMihQUk9QX0RSQ19PVkVSUklERV9SRUZfTEVWRUwsIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZsb2F0KC0wLjI1ICogYzJfbWluKHZhbHVlLCAxMjcpKTsKKyAgICAgICAgfSkpOworCisgICAgLy8gY29udmVydCB0byAwLTEgKCUpIGFuZCBhZGQgZGVmYXVsdAorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0FBQ19EUkNfQVRURU5VQVRJT05fRkFDVE9SLCBDMl9QQVJBTUtFWV9EUkNfQVRURU5VQVRJT05fRkFDVE9SLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkRFQ09ERVIpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKCF2LmdldCgmdmFsdWUpIHx8IHZhbHVlIDwgMCkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gcHJvcGVydHlfZ2V0X2ludDMyKFBST1BfRFJDX09WRVJSSURFX0NVVCwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZsb2F0KGMyX21pbih2YWx1ZSwgMTI3KSAvIDEyNy4pOworICAgICAgICB9KSk7CisKKyAgICAvLyBjb252ZXJ0IHRvIDAtMSAoJSkgYW5kIGFkZCBkZWZhdWx0CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX0RSQ19CT09TVF9GQUNUT1IsIEMyX1BBUkFNS0VZX0RSQ19CT09TVF9GQUNUT1IsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6REVDT0RFUikKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAoIXYuZ2V0KCZ2YWx1ZSkgfHwgdmFsdWUgPCAwKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBwcm9wZXJ0eV9nZXRfaW50MzIoUFJPUF9EUkNfT1ZFUlJJREVfQk9PU1QsIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQk9PU1QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZsb2F0KGMyX21pbih2YWx1ZSwgMTI3KSAvIDEyNy4pOworICAgICAgICB9KSk7CisKKyAgICAvLyBjb252ZXJ0IHRvIGNvbXByZXNzaW9uIHR5cGUgYW5kIGFkZCBkZWZhdWx0CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX0RSQ19IRUFWWV9DT01QUkVTU0lPTiwgQzJfUEFSQU1LRVlfRFJDX0NPTVBSRVNTSU9OX01PREUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6REVDT0RFUikKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAoIXYuZ2V0KCZ2YWx1ZSkgfHwgdmFsdWUgPCAwKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBwcm9wZXJ0eV9nZXRfaW50MzIoUFJPUF9EUkNfT1ZFUlJJREVfSEVBVlksIERSQ19ERUZBVUxUX01PQklMRV9EUkNfSEVBVlkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09IDEgPyBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZIDogQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9MSUdIVDsKKyAgICAgICAgfSkpOworCisgICAgLy8gY29udmVydCB0byBkQkZTIGFuZCBhZGQgZGVmYXVsdAorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0FBQ19FTkNPREVEX1RBUkdFVF9MRVZFTCwgQzJfUEFSQU1LRVlfRFJDX0VOQ09ERURfVEFSR0VUX0xFVkVMLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkRFQ09ERVIpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKCF2LmdldCgmdmFsdWUpIHx8IHZhbHVlIDwgMCkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gcHJvcGVydHlfZ2V0X2ludDMyKFBST1BfRFJDX09WRVJSSURFX0VOQ19MRVZFTCwgRFJDX0RFRkFVTFRfTU9CSUxFX0VOQ19MRVZFTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmxvYXQoLTAuMjUgKiBjMl9taW4odmFsdWUsIDEyNykpOworICAgICAgICB9KSk7CisKKyAgICAvLyBjb252ZXJ0IHRvIGVmZmVjdCB0eXBlICh0aGVzZSBtYXAgdG8gU0RLIHZhbHVlcykgYW5kIGFkZCBkZWZhdWx0CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX0RSQ19FRkZFQ1RfVFlQRSwgQzJfUEFSQU1LRVlfRFJDX0VGRkVDVF9UWVBFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkRFQ09ERVIpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKCF2LmdldCgmdmFsdWUpIHx8IHZhbHVlIDwgLTEgfHwgdmFsdWUgPiA4KSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBwcm9wZXJ0eV9nZXRfaW50MzIoUFJPUF9EUkNfT1ZFUlJJREVfRUZGRUNULCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0VGRkVDVCk7CisgICAgICAgICAgICAgICAgLy8gZW5zdXJlIHZhbHVlIGlzIHdpdGhpbiByYW5nZQorICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IC0xIHx8IHZhbHVlID4gOCkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IERSQ19ERUZBVUxUX01PQklMRV9EUkNfRUZGRUNUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX01BWF9PVVRQVVRfQ0hBTk5FTF9DT1VOVCwgQzJfUEFSQU1LRVlfTUFYX0NIQU5ORUxfQ09VTlQsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9BQUNfU0JSX01PREUsIEMyX1BBUkFNS0VZX0FBQ19TQlJfTU9ERSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpFTkNPREVSICYgRDo6Q09ORklHKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICghdi5nZXQoJnZhbHVlKSB8fCB2YWx1ZSA8IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJDb25maWc6OkFBQ19TQlJfQVVUTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBDMkNvbmZpZzo6QUFDX1NCUl9PRkY7CisgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gQzJDb25maWc6OkFBQ19TQlJfU0lOR0xFX1JBVEU7CisgICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gQzJDb25maWc6OkFBQ19TQlJfRFVBTF9SQVRFOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBDMkNvbmZpZzo6QUFDX1NCUl9BVVRPICsgMTsgLy8gaW52YWxpZCB2YWx1ZQorICAgICAgICAgICAgfQorICAgICAgICB9KSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9RVUFMSVRZLCBDMl9QQVJBTUtFWV9RVUFMSVRZLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgKEQ6OkNPTkZJRyB8IEQ6OlBBUkFNKSkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0ZMQUNfQ09NUFJFU1NJT05fTEVWRUwsIEMyX1BBUkFNS0VZX0NPTVBMRVhJVFksICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6RU5DT0RFUikpOworICAgIGFkZChDb25maWdNYXBwZXIoImNvbXBsZXhpdHkiLCBDMl9QQVJBTUtFWV9DT01QTEVYSVRZLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgKEQ6OkNPTkZJRyB8IEQ6OlBBUkFNKSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfR1JJRF9DT0xVTU5TLCBDMl9QQVJBTUtFWV9USUxFX0xBWU9VVCwgImNvbHVtbnMiKQorICAgICAgICAubGltaXRUbyhEOjpJTUFHRSkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0dSSURfUk9XUywgQzJfUEFSQU1LRVlfVElMRV9MQVlPVVQsICJyb3dzIikKKyAgICAgICAgLmxpbWl0VG8oRDo6SU1BR0UpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9USUxFX1dJRFRILCBDMl9QQVJBTUtFWV9USUxFX0xBWU9VVCwgInRpbGUud2lkdGgiKQorICAgICAgICAubGltaXRUbyhEOjpJTUFHRSkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1RJTEVfSEVJR0hULCBDMl9QQVJBTUtFWV9USUxFX0xBWU9VVCwgInRpbGUuaGVpZ2h0IikKKyAgICAgICAgLmxpbWl0VG8oRDo6SU1BR0UpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0xBVEVOQ1ksIEMyX1BBUkFNS0VZX1BJUEVMSU5FX0RFTEFZX1JFUVVFU1QsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6RU5DT0RFUikpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihDMl9QQVJBTUtFWV9JTlBVVF9USU1FX1NUUkVUQ0gsIEMyX1BBUkFNS0VZX0lOUFVUX1RJTUVfU1RSRVRDSCwgInZhbHVlIikpOworCisgICAgLyogc3RpbGwgdG8gZG8KKyAgICBjb25zdGV4cHIgY2hhciBLRVlfUFVTSF9CTEFOS19CVUZGRVJTX09OX1NUT1BbXSA9ICJwdXNoLWJsYW5rLWJ1ZmZlcnMtb24tc2h1dGRvd24iOworCisgICAgICAgbm90IHlldCB1c2VkIGJ5IE1lZGlhQ29kZWMsIGJ1dCBkZWZpbmVkIGFzIE1lZGlhRm9ybWF0CisgICAgS0VZX0FVRElPX1NFU1NJT05fSUQgLy8gd2UgdXNlICJhdWRpby1ody1zeW5jIgorICAgIEtFWV9PVVRQVVRfUkVPUkRFUl9ERVBUSAorICAgICovCit9CisKK3N0YXR1c190IENDb2RlY0NvbmZpZzo6aW5pdGlhbGl6ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gJmNsaWVudCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50KSB7CisgICAgQzJDb21wb25lbnREb21haW5TZXR0aW5nIGRvbWFpbihDMkNvbXBvbmVudDo6RE9NQUlOX09USEVSKTsKKyAgICBDMkNvbXBvbmVudEtpbmRTZXR0aW5nIGtpbmQoQzJDb21wb25lbnQ6OktJTkRfT1RIRVIpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBxdWVyaWVkOworICAgIGMyX3N0YXR1c190IGMyZXJyID0gY29tcG9uZW50LT5xdWVyeSh7ICZkb21haW4sICZraW5kIH0sIHt9LCBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgaWYgKGMyZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJRdWVyeSBkb21haW4gJiBraW5kIGZhaWxlZCA9PiAlcyIsIGFzU3RyaW5nKGMyZXJyKSk7CisgICAgICAgIC8vIFRFTVA6IGRldGVybWluZSBraW5kIGZyb20gY29tcG9uZW50IG5hbWUKKyAgICAgICAgaWYgKGtpbmQudmFsdWUgPT0gQzJDb21wb25lbnQ6OktJTkRfT1RIRVIpIHsKKyAgICAgICAgICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJlbmNvZGVyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgICAgICBraW5kLnZhbHVlID0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiZGVjb2RlciIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICAgICAga2luZC52YWx1ZSA9IEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBURU1QOiBkZXRlcm1pbmUgZG9tYWluIGZyb20gbWVkaWEgdHlwZSAocG9ydCAocHJlZmVycmVkKSBvciBzdHJlYW0gIzApCisgICAgICAgIGlmIChkb21haW4udmFsdWUgPT0gQzJDb21wb25lbnQ6OkRPTUFJTl9PVEhFUikgeworICAgICAgICAgICAgQVN0cmluZyBtZWRpYVR5cGUgPSBRdWVyeU1lZGlhVHlwZSh0cnVlIC8qIGlucHV0ICovLCBjb21wb25lbnQpOworICAgICAgICAgICAgaWYgKG1lZGlhVHlwZS5zdGFydHNXaXRoKCJhdWRpby8iKSkgeworICAgICAgICAgICAgICAgIGRvbWFpbi52YWx1ZSA9IEMyQ29tcG9uZW50OjpET01BSU5fQVVESU87CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgeworICAgICAgICAgICAgICAgIGRvbWFpbi52YWx1ZSA9IEMyQ29tcG9uZW50OjpET01BSU5fVklERU87CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZS5zdGFydHNXaXRoKCJpbWFnZS8iKSkgeworICAgICAgICAgICAgICAgIGRvbWFpbi52YWx1ZSA9IEMyQ29tcG9uZW50OjpET01BSU5fSU1BR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtRG9tYWluID0gKGRvbWFpbi52YWx1ZSA9PSBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPID8gRG9tYWluOjpJU19WSURFTyA6CisgICAgICAgICAgICAgICBkb21haW4udmFsdWUgPT0gQzJDb21wb25lbnQ6OkRPTUFJTl9JTUFHRSA/IERvbWFpbjo6SVNfSU1BR0UgOgorICAgICAgICAgICAgICAgZG9tYWluLnZhbHVlID09IEMyQ29tcG9uZW50OjpET01BSU5fQVVESU8gPyBEb21haW46OklTX0FVRElPIDogRG9tYWluOjpPVEhFUl9ET01BSU4pCisgICAgICAgICAgICB8IChraW5kLnZhbHVlID09IEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIgPyBEb21haW46OklTX0RFQ09ERVIgOgorICAgICAgICAgICAgICAga2luZC52YWx1ZSA9PSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSID8gRG9tYWluOjpJU19FTkNPREVSIDogRG9tYWluOjpPVEhFUl9LSU5EKTsKKworICAgIG1JbnB1dERvbWFpbiA9IERvbWFpbigoKG1Eb21haW4gJiBJU19ERUNPREVSKSA/IElTX0NPREVEIDogSVNfUkFXKSB8IElTX0lOUFVUKTsKKyAgICBtT3V0cHV0RG9tYWluID0gRG9tYWluKCgobURvbWFpbiAmIElTX0VOQ09ERVIpID8gSVNfQ09ERUQgOiBJU19SQVcpIHwgSVNfT1VUUFVUKTsKKworICAgIEFMT0dWKCJkb21haW4gaXMgJSN4ICgldSAldSkiLCBtRG9tYWluLCBkb21haW4udmFsdWUsIGtpbmQudmFsdWUpOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IHBhcmFtSW5kaWNlczsKKyAgICBzd2l0Y2ggKGtpbmQudmFsdWUpIHsKKyAgICBjYXNlIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVI6CisgICAgICAgIG1Db2RpbmdNZWRpYVR5cGUgPSBRdWVyeU1lZGlhVHlwZSh0cnVlIC8qIGlucHV0ICovLCBjb21wb25lbnQpLmNfc3RyKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjoKKyAgICAgICAgbUNvZGluZ01lZGlhVHlwZSA9IFF1ZXJ5TWVkaWFUeXBlKGZhbHNlIC8qIGlucHV0ICovLCBjb21wb25lbnQpLmNfc3RyKCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIG1Db2RpbmdNZWRpYVR5cGUgPSAiIjsKKyAgICB9CisKKyAgICBjMmVyciA9IGNvbXBvbmVudC0+cXVlcnlTdXBwb3J0ZWRQYXJhbXMoJm1QYXJhbURlc2NzKTsKKyAgICBpZiAoYzJlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoIlF1ZXJ5IHN1cHBvcnRlZCBwYXJhbXMgZmFpbGVkIGFmdGVyIHJldHVybmluZyAlenUgdmFsdWVzID0+ICVzIiwKKyAgICAgICAgICAgICAgICBtUGFyYW1EZXNjcy5zaXplKCksIGFzU3RyaW5nKGMyZXJyKSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gJmRlc2MgOiBtUGFyYW1EZXNjcykgeworICAgICAgICBtU3VwcG9ydGVkSW5kaWNlcy5lbXBsYWNlKGRlc2MtPmluZGV4KCkpOworICAgIH0KKworICAgIG1SZWZsZWN0b3IgPSBjbGllbnQtPmdldFBhcmFtUmVmbGVjdG9yKCk7CisgICAgaWYgKG1SZWZsZWN0b3IgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBwYXJhbSByZWZsZWN0b3IiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgLy8gZW51bWVyYXRlIGFsbCBmaWVsZHMKKyAgICBtUGFyYW1VcGRhdGVyID0gc3RkOjptYWtlX3NoYXJlZDxSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI+KCk7CisgICAgbVBhcmFtVXBkYXRlci0+Y2xlYXIoKTsKKyAgICBtUGFyYW1VcGRhdGVyLT5zdXBwb3J0V2hvbGVQYXJhbSgKKyAgICAgICAgICAgIEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6OkNPUkVfSU5ERVgpOworICAgIG1QYXJhbVVwZGF0ZXItPmFkZFBhcmFtRGVzYyhtUmVmbGVjdG9yLCBtUGFyYW1EZXNjcyk7CisKKyAgICAvLyBURU1QOiBhZGQgc29tZSBzdGFuZGFyZCBmaWVsZHMgZXZlbiBpZiBub3QgcmVmbGVjdGVkCisgICAgaWYgKGtpbmQudmFsdWUgPT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUikgeworICAgICAgICBtUGFyYW1VcGRhdGVyLT5hZGRTdGFuZGFyZFBhcmFtPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+KEMyX1BBUkFNS0VZX0lOSVRfREFUQSk7CisgICAgfQorICAgIGlmIChkb21haW4udmFsdWUgPT0gQzJDb21wb25lbnQ6OkRPTUFJTl9JTUFHRSB8fCBkb21haW4udmFsdWUgPT0gQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTykgeworICAgICAgICBpZiAoa2luZC52YWx1ZSAhPSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSKSB7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+KEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSk7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtPEMyU3RyZWFtQ3JvcFJlY3RJbmZvOjpvdXRwdXQ+KEMyX1BBUkFNS0VZX0NST1BfUkVDVCk7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtKAorICAgICAgICAgICAgICAgICAgICBuZXcgQzJTdHJlYW1QaXhlbEFzcGVjdFJhdGlvSW5mbzo6b3V0cHV0KDB1LCAxdSwgMXUpLAorICAgICAgICAgICAgICAgICAgICBDMl9QQVJBTUtFWV9QSVhFTF9BU1BFQ1RfUkFUSU8pOworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbShuZXcgQzJTdHJlYW1Sb3RhdGlvbkluZm86Om91dHB1dCgwdSwgMCksIEMyX1BBUkFNS0VZX1JPVEFUSU9OKTsKKyAgICAgICAgICAgIGFkZExvY2FsUGFyYW0obmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0KDB1KSwgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUyk7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtPEMyU3RyZWFtRGF0YVNwYWNlSW5mbzo6b3V0cHV0PihDMl9QQVJBTUtFWV9EQVRBX1NQQUNFKTsKKyAgICAgICAgICAgIGFkZExvY2FsUGFyYW08QzJTdHJlYW1IZHJTdGF0aWNJbmZvOjpvdXRwdXQ+KEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTyk7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtKG5ldyBDMlN0cmVhbVN1cmZhY2VTY2FsaW5nSW5mbzo6b3V0cHV0KDB1LCBWSURFT19TQ0FMSU5HX01PREVfU0NBTEVfVE9fRklUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJfUEFSQU1LRVlfU1VSRkFDRV9TQ0FMSU5HX01PREUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbShuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dCgwdSksIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMpOworICAgICAgICB9CisgICAgfQorCisgICAgaW5pdGlhbGl6ZVN0YW5kYXJkUGFyYW1zKCk7CisKKyAgICAvLyBzdWJzY3JpYmUgdG8gYWxsIHN1cHBvcnRlZCBzdGFuZGFyZCAoZXhwb3NlZCkgcGFyYW1zCisgICAgLy8gVE9ETzogbGltaXQgdGhpcyB0byBwYXJhbXMgdGhhdCBhcmUgYWN0dWFsbHkgaW4gdGhlIGRvbWFpbgorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBmb3JtYXRLZXlzID0gbVN0YW5kYXJkUGFyYW1zLT5nZXRQYXRoc0ZvckRvbWFpbihEb21haW4oMSA8PCAzMCkpOworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBpbmRpY2VzOworICAgIG1QYXJhbVVwZGF0ZXItPmdldFBhcmFtSW5kaWNlc0ZvcktleXMoZm9ybWF0S2V5cywgJmluZGljZXMpOworICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5pbnNlcnQoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpKTsKKworICAgIC8vIGFsc28gc3Vic2NyaWJlIHRvIHNvbWUgbm9uLVNESyBzdGFuZGFyZCBwYXJhbWV0ZXJzCisgICAgLy8gZm9yIG51bWJlciBvZiBpbnB1dC9vdXRwdXQgYnVmZmVycworICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5lbXBsYWNlKEMyUG9ydFN1Z2dlc3RlZEJ1ZmZlckNvdW50VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSk7CisgICAgbVN1YnNjcmliZWRJbmRpY2VzLmVtcGxhY2UoQzJQb3J0U3VnZ2VzdGVkQnVmZmVyQ291bnRUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisgICAgbVN1YnNjcmliZWRJbmRpY2VzLmVtcGxhY2UoQzJBY3R1YWxQaXBlbGluZURlbGF5VHVuaW5nOjpQQVJBTV9UWVBFKTsKKyAgICBtU3Vic2NyaWJlZEluZGljZXMuZW1wbGFjZShDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5lbXBsYWNlKEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworICAgIC8vIGZvciBvdXRwdXQgYnVmZmVyIGFycmF5IGFsbG9jYXRpb24KKyAgICBtU3Vic2NyaWJlZEluZGljZXMuZW1wbGFjZShDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworICAgIC8vIGluaXQgZGF0YSAoQ1NEKQorICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5lbXBsYWNlKEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDQ29kZWNDb25maWc6OnN1YnNjcmliZVRvQ29uZmlnVXBkYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wb25lbnQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaW5kaWNlcywKKyAgICAgICAgYzJfYmxvY2tpbmdfdCBibG9ja2luZykgeworICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5pbnNlcnQoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpKTsKKyAgICAvLyBUT0RPOiBlbmFibGUgdGhpcyB3aGVuIGNvbXBvbmVudHMgbm8gbG9uZ2VyIGNyYXNoIG9uIHRoaXMgY29uZmlnCisgICAgaWYgKG1TdWJzY3JpYmVkSW5kaWNlcy5zaXplKCkgIT0gbVN1YnNjcmliZWRJbmRpY2VzU2l6ZSAmJiBmYWxzZSkgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gaW5kaWNlczsKKyAgICAgICAgZm9yIChDMlBhcmFtOjpJbmRleCBpeCA6IG1TdWJzY3JpYmVkSW5kaWNlcykgeworICAgICAgICAgICAgaW5kaWNlcy5wdXNoX2JhY2soaXgpOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN1YnNjcmliZWRQYXJhbUluZGljZXNUdW5pbmc+IHN1YnNjcmliZVR1bmluZyA9CisgICAgICAgICAgICBDMlN1YnNjcmliZWRQYXJhbUluZGljZXNUdW5pbmc6OkFsbG9jVW5pcXVlKGluZGljZXMpOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gcmVzdWx0czsKKyAgICAgICAgYzJfc3RhdHVzX3QgYzJFcnIgPSBjb21wb25lbnQtPmNvbmZpZyh7IHN1YnNjcmliZVR1bmluZy5nZXQoKSB9LCBibG9ja2luZywgJnJlc3VsdHMpOworICAgICAgICBpZiAoYzJFcnIgIT0gQzJfT0sgJiYgYzJFcnIgIT0gQzJfQkFEX0lOREVYKSB7CisgICAgICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIHN1YnNjcmliZSB0byBwYXJhbWV0ZXJzID0+ICVzIiwgYXNTdHJpbmcoYzJFcnIpKTsKKyAgICAgICAgICAgIC8vIFRPRE86IGVycm9yCisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIlN1YnNjcmliZWQgdG8gJXp1IHBhcmFtcyIsIG1TdWJzY3JpYmVkSW5kaWNlcy5zaXplKCkpOworICAgICAgICBtU3Vic2NyaWJlZEluZGljZXNTaXplID0gbVN1YnNjcmliZWRJbmRpY2VzLnNpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDQ29kZWNDb25maWc6OnF1ZXJ5Q29uZmlndXJhdGlvbigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50KSB7CisgICAgLy8gcXVlcnkgYWxsIHN1YnNjcmliZWQgcGFyYW1ldGVycworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBpbmRpY2VzKG1TdWJzY3JpYmVkSW5kaWNlcy5iZWdpbigpLCBtU3Vic2NyaWJlZEluZGljZXMuZW5kKCkpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBjMl9zdGF0dXNfdCBjMkVyciA9IGNvbXBvbmVudC0+cXVlcnkoe30sIGluZGljZXMsIEMyX01BWV9CTE9DSywgJnF1ZXJpZWQpOworICAgIGlmIChjMkVyciAhPSBPSykgeworICAgICAgICBBTE9HSSgicXVlcnkgZmFpbGVkIGFmdGVyIHJldHVybmluZyAlenUgdmFsdWVzICglcykiLCBxdWVyaWVkLnNpemUoKSwgYXNTdHJpbmcoYzJFcnIpKTsKKyAgICAgICAgLy8gVE9ETzogZXJyb3IKKyAgICB9CisKKyAgICB1cGRhdGVDb25maWd1cmF0aW9uKHF1ZXJpZWQsIEFMTCk7CisgICAgcmV0dXJuIE9LOworfQorCitib29sIENDb2RlY0NvbmZpZzo6dXBkYXRlQ29uZmlndXJhdGlvbigKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmY29uZmlnVXBkYXRlLCBEb21haW4gZG9tYWluKSB7CisgICAgQUxPR1YoInVwZGF0aW5nIGNvbmZpZ3VyYXRpb24gd2l0aCAlenUgcGFyYW1zIiwgY29uZmlnVXBkYXRlLnNpemUoKSk7CisgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnAgOiBjb25maWdVcGRhdGUpIHsKKyAgICAgICAgaWYgKHAgJiYgKnApIHsKKyAgICAgICAgICAgIGF1dG8gaW5zZXJ0aW9uID0gbUN1cnJlbnRDb25maWcuZW1wbGFjZShwLT5pbmRleCgpLCBudWxscHRyKTsKKyAgICAgICAgICAgIGlmIChpbnNlcnRpb24uc2Vjb25kIHx8ICppbnNlcnRpb24uZmlyc3QtPnNlY29uZCAhPSAqcCkgeworICAgICAgICAgICAgICAgIGlmIChtU3VwcG9ydGVkSW5kaWNlcy5jb3VudChwLT5pbmRleCgpKSB8fCBtTG9jYWxQYXJhbXMuY291bnQocC0+aW5kZXgoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gb25seSB0cmFjayBjaGFuZ2VzIGluIHN1cHBvcnRlZCAocmVmbGVjdGVkIG9yIGxvY2FsKSBpbmRpY2VzCisgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJhbiB1bmxpc3RlZCBjb25maWcgd2FzICVzOiAlI3giLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGlvbi5zZWNvbmQgPyAiYWRkZWQiIDogInVwZGF0ZWQiLCBwLT5pbmRleCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnNlcnRpb24uZmlyc3QtPnNlY29uZCA9IHN0ZDo6bW92ZShwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJ1cGRhdGVkIGNvbmZpZ3VyYXRpb24gaGFzICV6dSBwYXJhbXMgKCVzKSIsIG1DdXJyZW50Q29uZmlnLnNpemUoKSwKKyAgICAgICAgICAgIGNoYW5nZWQgPyAiQ0hBTkdFRCIgOiAibm8gY2hhbmdlIik7CisgICAgaWYgKGNoYW5nZWQpIHsKKyAgICAgICAgcmV0dXJuIHVwZGF0ZUZvcm1hdHMoZG9tYWluKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENDb2RlY0NvbmZpZzo6dXBkYXRlRm9ybWF0cyhEb21haW4gZG9tYWluKSB7CisgICAgLy8gZ2V0IGFkZHJlc3NlcyBvZiBwYXJhbXMgaW4gdGhlIGN1cnJlbnQgY29uZmlnCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtUG9pbnRlcnM7CisgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IG1DdXJyZW50Q29uZmlnKSB7CisgICAgICAgIHBhcmFtUG9pbnRlcnMucHVzaF9iYWNrKGl0LnNlY29uZC5nZXQoKSk7CisgICAgfQorCisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0IHJlZmxlY3RlZCA9IG1QYXJhbVVwZGF0ZXItPmdldFBhcmFtcyhwYXJhbVBvaW50ZXJzKTsKKyAgICBBTE9HRCgiYzIgY29uZmlnIGlzICVzIiwgcmVmbGVjdGVkLmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisKKyAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICBpZiAoZG9tYWluICYgbUlucHV0RG9tYWluKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBvbGRGb3JtYXQgPSBtSW5wdXRGb3JtYXQ7CisgICAgICAgIG1JbnB1dEZvcm1hdCA9IG1JbnB1dEZvcm1hdC0+ZHVwKCk7IC8vIHRyaWdnZXIgZm9ybWF0IGNoYW5nZWQKKyAgICAgICAgbUlucHV0Rm9ybWF0LT5leHRlbmQoZ2V0U2RrRm9ybWF0Rm9yRG9tYWluKHJlZmxlY3RlZCwgbUlucHV0RG9tYWluKSk7CisgICAgICAgIGlmIChtSW5wdXRGb3JtYXQtPmNvdW50RW50cmllcygpICE9IG9sZEZvcm1hdC0+Y291bnRFbnRyaWVzKCkKKyAgICAgICAgICAgICAgICB8fCBtSW5wdXRGb3JtYXQtPmNoYW5nZXNGcm9tKG9sZEZvcm1hdCktPmNvdW50RW50cmllcygpID4gMCkgeworICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtSW5wdXRGb3JtYXQgPSBvbGRGb3JtYXQ7IC8vIG5vIGNoYW5nZQorICAgICAgICB9CisgICAgfQorICAgIGlmIChkb21haW4gJiBtT3V0cHV0RG9tYWluKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBvbGRGb3JtYXQgPSBtT3V0cHV0Rm9ybWF0OworICAgICAgICBtT3V0cHV0Rm9ybWF0ID0gbU91dHB1dEZvcm1hdC0+ZHVwKCk7IC8vIHRyaWdnZXIgb3V0cHV0IGZvcm1hdCBjaGFuZ2VkCisgICAgICAgIG1PdXRwdXRGb3JtYXQtPmV4dGVuZChnZXRTZGtGb3JtYXRGb3JEb21haW4ocmVmbGVjdGVkLCBtT3V0cHV0RG9tYWluKSk7CisgICAgICAgIGlmIChtT3V0cHV0Rm9ybWF0LT5jb3VudEVudHJpZXMoKSAhPSBvbGRGb3JtYXQtPmNvdW50RW50cmllcygpCisgICAgICAgICAgICAgICAgfHwgbU91dHB1dEZvcm1hdC0+Y2hhbmdlc0Zyb20ob2xkRm9ybWF0KS0+Y291bnRFbnRyaWVzKCkgPiAwKSB7CisgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1PdXRwdXRGb3JtYXQgPSBvbGRGb3JtYXQ7IC8vIG5vIGNoYW5nZQorICAgICAgICB9CisgICAgfQorICAgIEFMT0dWX0lGKGNoYW5nZWQsICJmb3JtYXQocykgY2hhbmdlZCIpOworICAgIHJldHVybiBjaGFuZ2VkOworfQorCitzcDxBTWVzc2FnZT4gQ0NvZGVjQ29uZmlnOjpnZXRTZGtGb3JtYXRGb3JEb21haW4oCisgICAgICAgIGNvbnN0IFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCAmcmVmbGVjdGVkLCBEb21haW4gcG9ydERvbWFpbikgY29uc3QgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2U7CisgICAgZm9yIChjb25zdCBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPENvbmZpZ01hcHBlcj4+ICZlbCA6IG1TdGFuZGFyZFBhcmFtcy0+Z2V0S2V5cygpKSB7CisgICAgICAgIGZvciAoY29uc3QgQ29uZmlnTWFwcGVyICZjbSA6IGVsLnNlY29uZCkgeworICAgICAgICAgICAgaWYgKChjbS5kb21haW4oKSAmIHBvcnREb21haW4pID09IDAgLy8gaW5wdXQtb3V0cHV0LWNvZGVkLXJhdworICAgICAgICAgICAgICAgIHx8IChjbS5kb21haW4oKSAmIG1Eb21haW4pICE9IG1Eb21haW4gLy8gY29tcG9uZW50IGRvbWFpbiArIGtpbmQgKHRoZXNlIG11c3QgbWF0Y2gpCisgICAgICAgICAgICAgICAgfHwgKGNtLmRvbWFpbigpICYgSVNfUkVBRCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0byBpdCA9IHJlZmxlY3RlZC5maW5kKGNtLnBhdGgoKSk7CisgICAgICAgICAgICBpZiAoaXQgPT0gcmVmbGVjdGVkLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDMlZhbHVlIGMyVmFsdWU7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZWYWx1ZTsKKyAgICAgICAgICAgIEFTdHJpbmcgc3RyVmFsdWU7CisgICAgICAgICAgICBBTWVzc2FnZTo6SXRlbURhdGEgaXRlbTsKKyAgICAgICAgICAgIGlmIChpdC0+c2Vjb25kLmZpbmQoJmMyVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgaXRlbSA9IGNtLm1hcFRvTWVzc2FnZShjMlZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXQtPnNlY29uZC5maW5kKCZidWZWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBpdGVtLnNldChidWZWYWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGl0LT5zZWNvbmQuZmluZCgmc3RyVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgaXRlbS5zZXQoc3RyVmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgidW5leHBlY3RlZCB1bnR5cGVkIHF1ZXJ5IHZhbHVlIGZvciBrZXk6ICVzIiwgY20ucGF0aCgpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbXNnLT5zZXRJdGVtKGVsLmZpcnN0LmNfc3RyKCksIGl0ZW0pOworICAgICAgICB9CisgICAgfQorCisgICAgeyAvLyBjb252ZXJ0IGZyb20gQ29kZWMgMi4wIHJlY3QgdG8gTWVkaWFGb3JtYXQgcmVjdCBhbmQgYWRkIGNyb3AgcmVjdCBpZiBub3QgcHJlc2VudAorICAgICAgICBpbnQzMl90IGxlZnQsIHRvcCwgd2lkdGgsIGhlaWdodDsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJjcm9wLWxlZnQiLCAmbGVmdCkgJiYgbXNnLT5maW5kSW50MzIoImNyb3Atd2lkdGgiLCAmd2lkdGgpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kSW50MzIoImNyb3AtdG9wIiwgJnRvcCkgJiYgbXNnLT5maW5kSW50MzIoImNyb3AtaGVpZ2h0IiwgJmhlaWdodCkKKyAgICAgICAgICAgICAgICAmJiBsZWZ0ID49IDAgJiYgd2lkdGggPj0wICYmIHdpZHRoIDw9IElOVDMyX01BWCAtIGxlZnQKKyAgICAgICAgICAgICAgICAmJiB0b3AgPj0gMCAmJiBoZWlnaHQgPj0wICYmIGhlaWdodCA8PSBJTlQzMl9NQVggLSB0b3ApIHsKKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiY3JvcC1sZWZ0IikpOworICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJjcm9wLXRvcCIpKTsKKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiY3JvcC13aWR0aCIpKTsKKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiY3JvcC1oZWlnaHQiKSk7CisgICAgICAgICAgICBtc2ctPnNldFJlY3QoImNyb3AiLCBsZWZ0LCB0b3AsIGxlZnQgKyB3aWR0aCAtIDEsIHRvcCArIGhlaWdodCAtIDEpOworICAgICAgICB9IGVsc2UgaWYgKG1zZy0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkgJiYgbXNnLT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKSB7CisgICAgICAgICAgICBtc2ctPnNldFJlY3QoImNyb3AiLCAwLCAwLCB3aWR0aCAtIDEsIGhlaWdodCAtIDEpOworICAgICAgICB9CisgICAgfQorCisgICAgeyAvLyBjb252ZXJ0IHRlbXBvcmFsIGxheWVyaW5nIHRvIHNjaGVtYQorICAgICAgICBzcDxBQnVmZmVyPiB0bXA7CisgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoQzJfUEFSQU1LRVlfVEVNUE9SQUxfTEFZRVJJTkcsICZ0bXApICYmIHRtcCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmcgKmxheWVyaW5nID0KKyAgICAgICAgICAgICAgICBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6OkZyb20oQzJQYXJhbTo6RnJvbSh0bXAtPmRhdGEoKSwgdG1wLT5zaXplKCkpKTsKKyAgICAgICAgICAgIGlmIChsYXllcmluZyAmJiBsYXllcmluZy0+bS5sYXllckNvdW50ID4gMAorICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+bS5iTGF5ZXJDb3VudCA8IGxheWVyaW5nLT5tLmxheWVyQ291bnQpIHsKKyAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGlzIGlzIHdlYnJ0YyBjb21wYXRpYmxlCisgICAgICAgICAgICAgICAgQVN0cmluZyBtaW1lOworICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRTdHJpbmcoS0VZX01JTUUsICZtaW1lKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbWltZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX1ZQOCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyaW5nLT5tLmJMYXllckNvdW50ID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChsYXllcmluZy0+bS5sYXllckNvdW50ID09IDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGxheWVyaW5nLT5tLmxheWVyQ291bnQgPT0gMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5mbGV4Q291bnQoKSA+PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPm0uYml0cmF0ZVJhdGlvc1swXSA9PSAuNmYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChsYXllcmluZy0+bS5sYXllckNvdW50ID09IDMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+ZmxleENvdW50KCkgPj0gMgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5tLmJpdHJhdGVSYXRpb3NbMF0gPT0gLjRmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPm0uYml0cmF0ZVJhdGlvc1sxXSA9PSAuNmYpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChsYXllcmluZy0+bS5sYXllckNvdW50ID09IDQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+ZmxleENvdW50KCkgPj0gMworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5tLmJpdHJhdGVSYXRpb3NbMF0gPT0gLjI1ZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5tLmJpdHJhdGVSYXRpb3NbMV0gPT0gLjRmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPm0uYml0cmF0ZVJhdGlvc1syXSA9PSAuNmYpKSkgeworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFN0cmluZyhLRVlfVEVNUE9SQUxfTEFZRVJJTkcsIEFTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndlYnJ0Yy52cDguJXUtbGF5ZXIiLCBsYXllcmluZy0+bS5sYXllckNvdW50KSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXllcmluZy0+bS5iTGF5ZXJDb3VudCkgeworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFN0cmluZyhLRVlfVEVNUE9SQUxfTEFZRVJJTkcsIEFTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuZ2VuZXJpYy4ldSsldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJpbmctPm0ubGF5ZXJDb3VudCAtIGxheWVyaW5nLT5tLmJMYXllckNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyaW5nLT5tLmJMYXllckNvdW50KSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXllcmluZy0+bS5iTGF5ZXJDb3VudCkgeworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFN0cmluZyhLRVlfVEVNUE9SQUxfTEFZRVJJTkcsIEFTdHJpbmdQcmludGYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQuZ2VuZXJpYy4ldSIsIGxheWVyaW5nLT5tLmxheWVyQ291bnQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoQzJfUEFSQU1LRVlfVEVNUE9SQUxfTEFZRVJJTkcpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHsgLy8gY29udmVydCBjb2xvciBpbmZvCisgICAgICAgIEMyQ29sb3I6OnByaW1hcmllc190IHByaW1hcmllczsKKyAgICAgICAgQzJDb2xvcjo6bWF0cml4X3QgbWF0cml4OworICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImNvbG9yLXByaW1hcmllcyIsIChpbnQzMl90KikmcHJpbWFyaWVzKQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEludDMyKCJjb2xvci1tYXRyaXgiLCAoaW50MzJfdCopJm1hdHJpeCkpIHsKKyAgICAgICAgICAgIGludDMyX3Qgc3RhbmRhcmQ7CisKKyAgICAgICAgICAgIGlmIChDMk1hcHBlcjo6bWFwKHByaW1hcmllcywgbWF0cml4LCAmc3RhbmRhcmQpKSB7CisgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMihLRVlfQ09MT1JfU1RBTkRBUkQsIHN0YW5kYXJkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJjb2xvci1wcmltYXJpZXMiKSk7CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImNvbG9yLW1hdHJpeCIpKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgLy8gY2FsY3VsYXRlIGRhdGFzcGFjZSBmb3IgcmF3IGdyYXBoaWMgYnVmZmVycyBpZiBub3Qgc3BlY2lmaWVkIGJ5IGNvbXBvbmVudCwgb3IgaWYKKyAgICAgICAgLy8gdXNpbmcgc3VyZmFjZSB3aXRoIHVuc3BlY2lmaWVkIGFzcGVjdHMgKGFzIHRob3NlIG11c3QgYmUgZGVmYXVsdGVkIHdoaWNoIG1heSBjaGFuZ2UKKyAgICAgICAgLy8gdGhlIGRhdGFzcGFjZSkKKyAgICAgICAgaWYgKChwb3J0RG9tYWluICYgSVNfUkFXKSAmJiAobURvbWFpbiAmIChJU19JTUFHRSB8IElTX1ZJREVPKSkpIHsKKyAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFzcGFjZTsKKyAgICAgICAgICAgIENvbG9yQXNwZWN0cyBhc3BlY3RzID0geworICAgICAgICAgICAgICAgIENvbG9yQXNwZWN0czo6UmFuZ2VVbnNwZWNpZmllZCwgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNVbnNwZWNpZmllZCwKKyAgICAgICAgICAgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyVW5zcGVjaWZpZWQsIENvbG9yQXNwZWN0czo6TWF0cml4VW5zcGVjaWZpZWQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBDb2xvclV0aWxzOjpnZXRDb2xvckFzcGVjdHNGcm9tRm9ybWF0KG1zZywgYXNwZWN0cyk7CisgICAgICAgICAgICBDb2xvckFzcGVjdHMgb3JpZ0FzcGVjdHMgPSBhc3BlY3RzOworICAgICAgICAgICAgaWYgKG1Vc2luZ1N1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICAvLyBnZXQgaW1hZ2Ugc2l6ZSAoZGVmYXVsdCB0byBIRCkKKyAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoID0gMTI4MDsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGhlaWdodCA9IDcyMDsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbTsKKyAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kUmVjdCgiY3JvcCIsICZsZWZ0LCAmdG9wLCAmcmlnaHQsICZib3R0b20pKSB7CisgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gcmlnaHQgLSBsZWZ0ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gYm90dG9tIC0gdG9wICsgMTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAodm9pZCltc2ctPmZpbmRJbnQzMihLRVlfV0lEVEgsICZ3aWR0aCk7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKW1zZy0+ZmluZEludDMyKEtFWV9IRUlHSFQsICZoZWlnaHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjpzZXREZWZhdWx0Q29kZWNDb2xvckFzcGVjdHNJZk5lZWRlZChhc3BlY3RzLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBDb2xvclV0aWxzOjpzZXRDb2xvckFzcGVjdHNJbnRvRm9ybWF0KGFzcGVjdHMsIG1zZyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImFuZHJvaWQuX2RhdGFzcGFjZSIsIChpbnQzMl90KikmZGF0YXNwYWNlKQorICAgICAgICAgICAgICAgICAgICB8fCBhc3BlY3RzLm1SYW5nZSAhPSBvcmlnQXNwZWN0cy5tUmFuZ2UKKyAgICAgICAgICAgICAgICAgICAgfHwgYXNwZWN0cy5tUHJpbWFyaWVzICE9IG9yaWdBc3BlY3RzLm1QcmltYXJpZXMKKyAgICAgICAgICAgICAgICAgICAgfHwgYXNwZWN0cy5tVHJhbnNmZXIgIT0gb3JpZ0FzcGVjdHMubVRyYW5zZmVyCisgICAgICAgICAgICAgICAgICAgIHx8IGFzcGVjdHMubU1hdHJpeENvZWZmcyAhPSBvcmlnQXNwZWN0cy5tTWF0cml4Q29lZmZzKSB7CisgICAgICAgICAgICAgICAgZGF0YXNwYWNlID0gQ29sb3JVdGlsczo6Z2V0RGF0YVNwYWNlRm9yQ29sb3JBc3BlY3RzKGFzcGVjdHMsIHRydWUgLyogbWF5RXhwYW5kICovKTsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJhbmRyb2lkLl9kYXRhc3BhY2UiLCBkYXRhc3BhY2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gSERSIHN0YXRpYyBpbmZvCisKKyAgICAgICAgQzJIZHJTdGF0aWNNZXRhZGF0YVN0cnVjdCBoZHI7CisgICAgICAgIGlmIChtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2LnJlZC54IiwgJmhkci5tYXN0ZXJpbmcucmVkLngpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni5yZWQueSIsICZoZHIubWFzdGVyaW5nLnJlZC55KQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYuZ3JlZW4ueCIsICZoZHIubWFzdGVyaW5nLmdyZWVuLngpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni5ncmVlbi55IiwgJmhkci5tYXN0ZXJpbmcuZ3JlZW4ueSkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2LmJsdWUueCIsICZoZHIubWFzdGVyaW5nLmJsdWUueCkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2LmJsdWUueSIsICZoZHIubWFzdGVyaW5nLmJsdWUueSkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2LndoaXRlLngiLCAmaGRyLm1hc3RlcmluZy53aGl0ZS54KQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYud2hpdGUueSIsICZoZHIubWFzdGVyaW5nLndoaXRlLnkpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni5tYXgtbHVtaW5hbmNlIiwgJmhkci5tYXN0ZXJpbmcubWF4THVtaW5hbmNlKQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYubWluLWx1bWluYW5jZSIsICZoZHIubWFzdGVyaW5nLm1pbkx1bWluYW5jZSkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgiY3RhODYxLm1heC1jbGwiLCAmaGRyLm1heENsbCkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgiY3RhODYxLm1heC1mYWxsIiwgJmhkci5tYXhGYWxsKSkgeworICAgICAgICAgICAgaWYgKGhkci5tYXN0ZXJpbmcucmVkLnggPj0gMCAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLnJlZC54IDw9IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5yZWQueSA+PSAwICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5yZWQueSA8PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcuZ3JlZW4ueCA+PSAwICAgICAgICYmIGhkci5tYXN0ZXJpbmcuZ3JlZW4ueCA8PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcuZ3JlZW4ueSA+PSAwICAgICAgICYmIGhkci5tYXN0ZXJpbmcuZ3JlZW4ueSA8PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcuYmx1ZS54ID49IDAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcuYmx1ZS54IDw9IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5ibHVlLnkgPj0gMCAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5ibHVlLnkgPD0gMQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLndoaXRlLnggPj0gMCAgICAgICAmJiBoZHIubWFzdGVyaW5nLndoaXRlLnggPD0gMQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLndoaXRlLnkgPj0gMCAgICAgICAmJiBoZHIubWFzdGVyaW5nLndoaXRlLnkgPD0gMQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLm1heEx1bWluYW5jZSA+PSAwICAmJiBoZHIubWFzdGVyaW5nLm1heEx1bWluYW5jZSA8PSA2NTUzNQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLm1pbkx1bWluYW5jZSA+PSAwICAmJiBoZHIubWFzdGVyaW5nLm1pbkx1bWluYW5jZSA8PSA2LjU1MzUKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1heENsbCA+PSAwICAgICAgICAgICAgICAgICAgJiYgaGRyLm1heENsbCA8PSA2NTUzNQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWF4RmFsbCA+PSAwICAgICAgICAgICAgICAgICAmJiBoZHIubWF4RmFsbCA8PSA2NTUzNSkgeworICAgICAgICAgICAgICAgIEhEUlN0YXRpY0luZm8gbWV0YTsKKyAgICAgICAgICAgICAgICBtZXRhLm1JRCA9IG1ldGEua1R5cGUxOworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1SLnggPSBoZHIubWFzdGVyaW5nLnJlZC54IC8gMC4wMDAwMiArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tUi55ID0gaGRyLm1hc3RlcmluZy5yZWQueSAvIDAuMDAwMDIgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubUcueCA9IGhkci5tYXN0ZXJpbmcuZ3JlZW4ueCAvIDAuMDAwMDIgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubUcueSA9IGhkci5tYXN0ZXJpbmcuZ3JlZW4ueSAvIDAuMDAwMDIgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubUIueCA9IGhkci5tYXN0ZXJpbmcuYmx1ZS54IC8gMC4wMDAwMiArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tQi55ID0gaGRyLm1hc3RlcmluZy5ibHVlLnkgLyAwLjAwMDAyICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1XLnggPSBoZHIubWFzdGVyaW5nLndoaXRlLnggLyAwLjAwMDAyICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1XLnkgPSBoZHIubWFzdGVyaW5nLndoaXRlLnkgLyAwLjAwMDAyICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1NYXhEaXNwbGF5THVtaW5hbmNlID0gaGRyLm1hc3RlcmluZy5tYXhMdW1pbmFuY2UgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubU1pbkRpc3BsYXlMdW1pbmFuY2UgPSBoZHIubWFzdGVyaW5nLm1pbkx1bWluYW5jZSAvIDAuMDAwMSArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tTWF4Q29udGVudExpZ2h0TGV2ZWwgPSBoZHIubWF4Q2xsICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1NYXhGcmFtZUF2ZXJhZ2VMaWdodExldmVsID0gaGRyLm1heEZhbGwgKyAwLjU7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYucmVkLngiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYucmVkLnkiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYuZ3JlZW4ueCIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni5ncmVlbi55IikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LmJsdWUueCIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni5ibHVlLnkiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYud2hpdGUueCIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni53aGl0ZS55IikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2Lm1heC1sdW1pbmFuY2UiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYubWluLWx1bWluYW5jZSIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImN0YTg2MS5tYXgtY2xsIikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiY3RhODYxLm1heC1mYWxsIikpOworICAgICAgICAgICAgICAgIG1zZy0+c2V0QnVmZmVyKEtFWV9IRFJfU1RBVElDX0lORk8sIEFCdWZmZXI6OkNyZWF0ZUFzQ29weSgmbWV0YSwgc2l6ZW9mKG1ldGEpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dEKCJmb3VuZCBpbnZhbGlkIEhEUiBzdGF0aWMgbWV0YWRhdGEgJXMiLCBtc2ctPmRlYnVnU3RyaW5nKDgpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoImNvbnZlcnRlZCB0byBTREsgdmFsdWVzIGFzICVzIiwgbXNnLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOworICAgIHJldHVybiBtc2c7Cit9CisKKy8vLyBjb252ZXJ0cyBhbiBBTWVzc2FnZSB2YWx1ZSB0byBhIFBhcmFtVXBkYXRlciB2YWx1ZQorc3RhdGljIHZvaWQgY29udmVydChjb25zdCBBTWVzc2FnZTo6SXRlbURhdGEgJmZyb20sIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6VmFsdWUgKnRvKSB7CisgICAgaW50MzJfdCBpbnQzMlZhbHVlOworICAgIGludDY0X3QgaW50NjRWYWx1ZTsKKyAgICBzcDxBQnVmZmVyPiBidWZWYWx1ZTsKKyAgICBBU3RyaW5nIHN0clZhbHVlOworICAgIGZsb2F0IGZsb2F0VmFsdWU7CisgICAgZG91YmxlIGRvdWJsZVZhbHVlOworCisgICAgaWYgKGZyb20uZmluZCgmaW50MzJWYWx1ZSkpIHsKKyAgICAgICAgdG8tPnNldChpbnQzMlZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGZyb20uZmluZCgmaW50NjRWYWx1ZSkpIHsKKyAgICAgICAgdG8tPnNldChpbnQ2NFZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGZyb20uZmluZCgmYnVmVmFsdWUpKSB7CisgICAgICAgIHRvLT5zZXQoYnVmVmFsdWUpOworICAgIH0gZWxzZSBpZiAoZnJvbS5maW5kKCZzdHJWYWx1ZSkpIHsKKyAgICAgICAgdG8tPnNldChzdHJWYWx1ZSk7CisgICAgfSBlbHNlIGlmIChmcm9tLmZpbmQoJmZsb2F0VmFsdWUpKSB7CisgICAgICAgIHRvLT5zZXQoQzJWYWx1ZShmbG9hdFZhbHVlKSk7CisgICAgfSBlbHNlIGlmIChmcm9tLmZpbmQoJmRvdWJsZVZhbHVlKSkgeworICAgICAgICAvLyBjb252ZXJ0IGRvdWJsZSB0byBmbG9hdAorICAgICAgICB0by0+c2V0KEMyVmFsdWUoKGZsb2F0KWRvdWJsZVZhbHVlKSk7CisgICAgfQorICAgIC8vIGlnbm9yZSBhbGwgb3RoZXIgQU1lc3NhZ2UgdHlwZXMKK30KKworLy8vIHJlbGF4ZXMgQ29kZWMgMi4wIHNwZWNpZmljIHZhbHVlIHR5cGVzIHRvIFNESyB0eXBlcyAobWFpbmx5IHJlbW92ZXMgc2lnbmVkbmVzcyBhbmQgY291bnRlcm5lc3MKKy8vLyBmcm9tIDMyLzY0LWJpdCB2YWx1ZXMuKQorc3RhdGljIHZvaWQgcmVsYXhWYWx1ZXMoUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpWYWx1ZSAmaXRlbSkgeworICAgIEMyVmFsdWUgYzJWYWx1ZTsKKyAgICBpbnQzMl90IGludDMyVmFsdWU7CisgICAgaW50NjRfdCBpbnQ2NFZhbHVlOworICAgICh2b2lkKWl0ZW0uZmluZCgmYzJWYWx1ZSk7CisgICAgaWYgKGMyVmFsdWUuZ2V0KCZpbnQzMlZhbHVlKSB8fCBjMlZhbHVlLmdldCgodWludDMyX3QqKSZpbnQzMlZhbHVlKQorICAgICAgICAgICAgfHwgYzJWYWx1ZS5nZXQoKGMyX2NudHIzMl90KikmaW50MzJWYWx1ZSkpIHsKKyAgICAgICAgaXRlbS5zZXQoaW50MzJWYWx1ZSk7CisgICAgfSBlbHNlIGlmIChjMlZhbHVlLmdldCgmaW50NjRWYWx1ZSkKKyAgICAgICAgICAgIHx8IGMyVmFsdWUuZ2V0KCh1aW50NjRfdCopJmludDY0VmFsdWUpCisgICAgICAgICAgICB8fCBjMlZhbHVlLmdldCgoYzJfY250cjY0X3QqKSZpbnQ2NFZhbHVlKSkgeworICAgICAgICBpdGVtLnNldChpbnQ2NFZhbHVlKTsKKyAgICB9Cit9CisKK1JlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCBDQ29kZWNDb25maWc6OmdldFJlZmxlY3RlZEZvcm1hdCgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZwYXJhbXNfLCBEb21haW4gY29uZmlnRG9tYWluKSBjb25zdCB7CisgICAgLy8gY3JlYXRlIGEgbW9kaWZpYWJsZSBjb3B5IG9mIHBhcmFtcworICAgIHNwPEFNZXNzYWdlPiBwYXJhbXMgPSBwYXJhbXNfLT5kdXAoKTsKKyAgICBBTE9HVigiZmlsdGVyaW5nIHdpdGggY29uZmlnIGRvbWFpbiAleCIsIGNvbmZpZ0RvbWFpbik7CisKKyAgICAvLyBjb252ZXJ0IHNvbWUgbWFjcm8gcGFyYW1ldGVycyB0byBDb2RlYyAyLjAgc3BlY2lmaWMgZXhwcmVzc2lvbnMKKworICAgIHsgLy8gbWFrZSBpLWZyYW1lLWludGVydmFsIGZyYW1lIGJhc2VkCisgICAgICAgIGZsb2F0IGlGcmFtZUludGVydmFsOworICAgICAgICBpZiAocGFyYW1zLT5maW5kQXNGbG9hdChLRVlfSV9GUkFNRV9JTlRFUlZBTCwgJmlGcmFtZUludGVydmFsKSkgeworICAgICAgICAgICAgZmxvYXQgZnJhbWVSYXRlOworICAgICAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEFzRmxvYXQoS0VZX0ZSQU1FX1JBVEUsICZmcmFtZVJhdGUpKSB7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQzMigiaS1mcmFtZS1wZXJpb2QiLAorICAgICAgICAgICAgICAgICAgICAgICAgKGZyYW1lUmF0ZSA8PSAwIHx8IGlGcmFtZUludGVydmFsIDwgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gLTEgLyogbm8gc3luYyBmcmFtZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGludDMyX3QpYzJfbWluKGlGcmFtZUludGVydmFsICogZnJhbWVSYXRlICsgMC41LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0KUlOVDMyX01BWCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1Eb21haW4gPT0gKElTX1ZJREVPIHwgSVNfRU5DT0RFUikpIHsKKyAgICAgICAgLy8gY29udmVydCBjYXB0dXJlLXJhdGUgaW50byBpbnB1dC10aW1lLXN0cmV0Y2gKKyAgICAgICAgZmxvYXQgZnJhbWVSYXRlLCBjYXB0dXJlUmF0ZTsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEFzRmxvYXQoS0VZX0ZSQU1FX1JBVEUsICZmcmFtZVJhdGUpKSB7CisgICAgICAgICAgICBpZiAoIXBhcmFtcy0+ZmluZEFzRmxvYXQoInRpbWUtbGFwc2UtZnBzIiwgJmNhcHR1cmVSYXRlKQorICAgICAgICAgICAgICAgICAgICAmJiAhcGFyYW1zLT5maW5kQXNGbG9hdChLRVlfQ0FQVFVSRV9SQVRFLCAmY2FwdHVyZVJhdGUpKSB7CisgICAgICAgICAgICAgICAgY2FwdHVyZVJhdGUgPSBmcmFtZVJhdGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY2FwdHVyZVJhdGUgPiAwICYmIGZyYW1lUmF0ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KEMyX1BBUkFNS0VZX0lOUFVUX1RJTUVfU1RSRVRDSCwgY2FwdHVyZVJhdGUgLyBmcmFtZVJhdGUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgeyAgIC8vIHJlZmxlY3QgdGVtcG9yYWwgbGF5ZXJpbmcgaW50byBhIGJpbmFyeSBibG9iCisgICAgICAgIEFTdHJpbmcgc2NoZW1hOworICAgICAgICBpZiAocGFyYW1zLT5maW5kU3RyaW5nKEtFWV9URU1QT1JBTF9MQVlFUklORywgJnNjaGVtYSkpIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1MYXllcnMgPSAwOworICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bUJMYXllcnMgPSAwOworICAgICAgICAgICAgaW50IHRhZ3M7CisgICAgICAgICAgICBjaGFyIGR1bW15OworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0PiBsYXllcmluZzsKKyAgICAgICAgICAgIGlmIChzc2NhbmYoc2NoZW1hLmNfc3RyKCksICJ3ZWJydGMudnA4LiV1LWxheWVyJWMiLCAmbnVtTGF5ZXJzLCAmZHVtbXkpID09IDEKKyAgICAgICAgICAgICAgICAmJiBudW1MYXllcnMgPiAwKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChudW1MYXllcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJpbmcgPSBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dDo6QWxsb2NVbmlxdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt9LCAwdSwgMXUsIDB1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICBsYXllcmluZyA9IEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuNmYgfSwgMHUsIDJ1LCAwdSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJpbmcgPSBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dDo6QWxsb2NVbmlxdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLjRmLCAuNmYgfSwgMHUsIDN1LCAwdSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyaW5nID0gQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC4yNWYsIC40ZiwgLjZmIH0sIDB1LCA0dSwgMHUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmICgodGFncyA9IHNzY2FuZihzY2hlbWEuY19zdHIoKSwgImFuZHJvaWQuZ2VuZXJpYy4ldSVjJXUlYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAmbnVtTGF5ZXJzLCAmZHVtbXksICZudW1CTGF5ZXJzLCAmZHVtbXkpKQorICAgICAgICAgICAgICAgICYmICh0YWdzID09IDEgfHwgKHRhZ3MgPT0gMyAmJiBkdW1teSA9PSAnKycpKQorICAgICAgICAgICAgICAgICYmIG51bUxheWVycyA+IDAgJiYgbnVtTGF5ZXJzIDwgVUlOVDMyX01BWCAtIG51bUJMYXllcnMpIHsKKyAgICAgICAgICAgICAgICBsYXllcmluZyA9IEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHt9LCAwdSwgbnVtTGF5ZXJzICsgbnVtQkxheWVycywgbnVtQkxheWVycyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dEKCJJZ25vcmluZyB1bnN1cHBvcnRlZCB0cy1zY2hlbWEgWyVzXSIsIHNjaGVtYS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsYXllcmluZykgeworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0QnVmZmVyKEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFCdWZmZXI6OkNyZWF0ZUFzQ29weShsYXllcmluZy5nZXQoKSwgbGF5ZXJpbmctPnNpemUoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgeyAvLyBjb252ZXJ0IGZyb20gTWVkaWFGb3JtYXQgcmVjdCB0byBDb2RlYyAyLjAgcmVjdAorICAgICAgICBpbnQzMl90IG9mZnNldDsKKyAgICAgICAgaW50MzJfdCBlbmQ7CisgICAgICAgIEFNZXNzYWdlOjpJdGVtRGF0YSBpdGVtOworICAgICAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoImNyb3AtbGVmdCIsICZvZmZzZXQpICYmIHBhcmFtcy0+ZmluZEludDMyKCJjcm9wLXJpZ2h0IiwgJmVuZCkKKyAgICAgICAgICAgICAgICAmJiBvZmZzZXQgPj0gMCAmJiBlbmQgPj0gb2Zmc2V0IC0gMSkgeworICAgICAgICAgICAgc2l6ZV90IGl4ID0gcGFyYW1zLT5maW5kRW50cnlCeU5hbWUoImNyb3AtcmlnaHQiKTsKKyAgICAgICAgICAgIHBhcmFtcy0+c2V0RW50cnlOYW1lQXQoaXgsICJjcm9wLXdpZHRoIik7CisgICAgICAgICAgICBpdGVtLnNldChlbmQgLSBvZmZzZXQgKyAxKTsKKyAgICAgICAgICAgIHBhcmFtcy0+c2V0RW50cnlBdChpeCwgaXRlbSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJjcm9wLXRvcCIsICZvZmZzZXQpICYmIHBhcmFtcy0+ZmluZEludDMyKCJjcm9wLWJvdHRvbSIsICZlbmQpCisgICAgICAgICAgICAgICAgJiYgb2Zmc2V0ID49IDAgJiYgZW5kID49IG9mZnNldCAtIDEpIHsKKyAgICAgICAgICAgIHNpemVfdCBpeCA9IHBhcmFtcy0+ZmluZEVudHJ5QnlOYW1lKCJjcm9wLWJvdHRvbSIpOworICAgICAgICAgICAgcGFyYW1zLT5zZXRFbnRyeU5hbWVBdChpeCwgImNyb3AtaGVpZ2h0Iik7CisgICAgICAgICAgICBpdGVtLnNldChlbmQgLSBvZmZzZXQgKyAxKTsKKyAgICAgICAgICAgIHBhcmFtcy0+c2V0RW50cnlBdChpeCwgaXRlbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7IC8vIGNvbnZlcnQgY29sb3IgaW5mbworICAgICAgICBpbnQzMl90IHN0YW5kYXJkOworICAgICAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoS0VZX0NPTE9SX1NUQU5EQVJELCAmc3RhbmRhcmQpKSB7CisgICAgICAgICAgICBDMkNvbG9yOjpwcmltYXJpZXNfdCBwcmltYXJpZXM7CisgICAgICAgICAgICBDMkNvbG9yOjptYXRyaXhfdCBtYXRyaXg7CisKKyAgICAgICAgICAgIGlmIChDMk1hcHBlcjo6bWFwKHN0YW5kYXJkLCAmcHJpbWFyaWVzLCAmbWF0cml4KSkgeworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoImNvbG9yLXByaW1hcmllcyIsIHByaW1hcmllcyk7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQzMigiY29sb3ItbWF0cml4IiwgbWF0cml4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNwPEFCdWZmZXI+IGhkck1ldGE7CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRCdWZmZXIoS0VZX0hEUl9TVEFUSUNfSU5GTywgJmhkck1ldGEpCisgICAgICAgICAgICAgICAgJiYgaGRyTWV0YS0+c2l6ZSgpID09IHNpemVvZihIRFJTdGF0aWNJbmZvKSkgeworICAgICAgICAgICAgSERSU3RhdGljSW5mbyAqbWV0YSA9IChIRFJTdGF0aWNJbmZvKiloZHJNZXRhLT5kYXRhKCk7CisgICAgICAgICAgICBpZiAobWV0YS0+bUlEID09IG1ldGEtPmtUeXBlMSkgeworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni5yZWQueCIsIG1ldGEtPnNUeXBlMS5tUi54ICogMC4wMDAwMik7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgic21wdGUyMDg2LnJlZC55IiwgbWV0YS0+c1R5cGUxLm1SLnkgKiAwLjAwMDAyKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYuZ3JlZW4ueCIsIG1ldGEtPnNUeXBlMS5tRy54ICogMC4wMDAwMik7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgic21wdGUyMDg2LmdyZWVuLnkiLCBtZXRhLT5zVHlwZTEubUcueSAqIDAuMDAwMDIpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni5ibHVlLngiLCBtZXRhLT5zVHlwZTEubUIueCAqIDAuMDAwMDIpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni5ibHVlLnkiLCBtZXRhLT5zVHlwZTEubUIueSAqIDAuMDAwMDIpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni53aGl0ZS54IiwgbWV0YS0+c1R5cGUxLm1XLnggKiAwLjAwMDAyKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYud2hpdGUueSIsIG1ldGEtPnNUeXBlMS5tVy55ICogMC4wMDAwMik7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgic21wdGUyMDg2Lm1heC1sdW1pbmFuY2UiLCBtZXRhLT5zVHlwZTEubU1heERpc3BsYXlMdW1pbmFuY2UpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni5taW4tbHVtaW5hbmNlIiwgbWV0YS0+c1R5cGUxLm1NaW5EaXNwbGF5THVtaW5hbmNlICogMC4wMDAxKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJjdGE4NjEubWF4LWNsbCIsIG1ldGEtPnNUeXBlMS5tTWF4Q29udGVudExpZ2h0TGV2ZWwpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoImN0YTg2MS5tYXgtZmFsbCIsIG1ldGEtPnNUeXBlMS5tTWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB0aGlzIGlzIHRvIHZlcmlmeSB0aGF0IHdlIHNldCBwcm9wZXIgc2lnbmVkbmVzcyBmb3Igc3RhbmRhcmQgcGFyYW1ldGVycworICAgIGJvb2wgYmVWZXJ5U3RyaWN0ID0gcHJvcGVydHlfZ2V0X2Jvb2woImRlYnVnLnN0YWdlZnJpZ2h0LmNjb2RlY19zdHJpY3RfdHlwZSIsIGZhbHNlKTsKKyAgICAvLyB0aGlzIGlzIHRvIGFsbG93IHZlbmRvcnMgdG8gdXNlIHRoZSB3cm9uZyBzaWduZWRuZXNzIGZvciBzdGFuZGFyZCBwYXJhbWV0ZXJzCisgICAgYm9vbCBiZVZlcnlMYXggPSBwcm9wZXJ0eV9nZXRfYm9vbCgiZGVidWcuc3RhZ2VmcmlnaHQuY2NvZGVjX2xheF90eXBlIiwgZmFsc2UpOworCisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0IGZpbHRlcmVkOworICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBwYXJhbXMtPmNvdW50RW50cmllcygpOyArK2l4KSB7CisgICAgICAgIEFNZXNzYWdlOjpUeXBlIHR5cGU7CisgICAgICAgIEFTdHJpbmcgbmFtZSA9IHBhcmFtcy0+Z2V0RW50cnlOYW1lQXQoaXgsICZ0eXBlKTsKKyAgICAgICAgQU1lc3NhZ2U6Okl0ZW1EYXRhIG1zZ0l0ZW0gPSBwYXJhbXMtPmdldEVudHJ5QXQoaXgpOworICAgICAgICBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OlZhbHVlIGl0ZW07CisgICAgICAgIGNvbnZlcnQobXNnSXRlbSwgJml0ZW0pOyAvLyBjb252ZXJ0IGl0ZW0gdG8gcGFyYW0gdXBkYXRlciBpdGVtCisKKyAgICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgidmVuZG9yLiIpKSB7CisgICAgICAgICAgICAvLyB2ZW5kb3IgcGFyYW1zIHBhc3MgdGhyb3VnaCBhcyBpcworICAgICAgICAgICAgZmlsdGVyZWQuZW1wbGFjZShuYW1lLmNfc3RyKCksIGl0ZW0pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gc3RhbmRhcmQgcGFyYW1ldGVycyBtYXkgZ2V0IG1vZGlmaWVkLCBmaWx0ZXJlZCBvciBkdXBsaWNhdGVkCisgICAgICAgIGZvciAoY29uc3QgQ29uZmlnTWFwcGVyICZjbSA6IG1TdGFuZGFyZFBhcmFtcy0+Z2V0Q29uZmlnTWFwcGVyc0ZvclNka0tleShuYW1lLmNfc3RyKCkpKSB7CisgICAgICAgICAgICAvLyBub3RlOiB3ZSBpZ25vcmUgcG9ydCBkb21haW4gZm9yIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICAgIGlmICgoY20uZG9tYWluKCkgJiBjb25maWdEb21haW4pCisgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudCBkb21haW4gKyBraW5kICh0aGVzZSBtdXN0IG1hdGNoKQorICAgICAgICAgICAgICAgICAgICAmJiAoY20uZG9tYWluKCkgJiBtRG9tYWluKSA9PSBtRG9tYWluKSB7CisgICAgICAgICAgICAgICAgLy8gbWFwIGFyaXRobWV0aWMgdmFsdWVzLCBwYXNzIHRocm91Z2ggc3RyaW5nIG9yIGJ1ZmZlcgorICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUJ1ZmZlcjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVTdHJpbmc6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVJbnQzMjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVJbnQ2NDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVGbG9hdDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVEb3VibGU6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3Igbm93IG9ubHkgbWFwIHNldHRpbmdzIHdpdGggbWFwcGVycyBhcyB3ZSBhcmUgbm90IGNyZWF0aW5nCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzaWduZWQgPD0+IHVuc2lnbmVkIG1hcHBlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGJlIHByZWNpc2UgYWJvdXQgc2lnbmVkIHVuc2lnbmVkCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmVWZXJ5U3RyaWN0IHx8IGNtLm1hcHBlcigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5zZXQoY20ubWFwRnJvbU1lc3NhZ2UocGFyYW1zLT5nZXRFbnRyeUF0KGl4KSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsc28gYWxsb3cgdG8gcmVsYXggdHlwZSBzdHJpY3RuZXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJlVmVyeUxheCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxheFZhbHVlcyhpdGVtKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmaWx0ZXJlZC5lbXBsYWNlKGNtLnBhdGgoKSwgaXRlbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoImZpbHRlcmVkICVzIHRvICVzIiwgcGFyYW1zLT5kZWJ1Z1N0cmluZyg0KS5jX3N0cigpLAorICAgICAgICAgICAgZmlsdGVyZWQuZGVidWdTdHJpbmcoNCkuY19zdHIoKSk7CisgICAgcmV0dXJuIGZpbHRlcmVkOworfQorCitzdGF0dXNfdCBDQ29kZWNDb25maWc6OmdldENvbmZpZ1VwZGF0ZUZyb21TZGtQYXJhbXMoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJnNka1BhcmFtcywgRG9tYWluIGNvbmZpZ0RvbWFpbiwKKyAgICAgICAgYzJfYmxvY2tpbmdfdCBibG9ja2luZywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uZmlnVXBkYXRlKSBjb25zdCB7CisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0IHBhcmFtcyA9IGdldFJlZmxlY3RlZEZvcm1hdChzZGtQYXJhbXMsIGNvbmZpZ0RvbWFpbik7CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlczsKKyAgICBtUGFyYW1VcGRhdGVyLT5nZXRQYXJhbUluZGljZXNGcm9tTWVzc2FnZShwYXJhbXMsICZpbmRpY2VzKTsKKyAgICBpZiAoaW5kaWNlcy5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dEKCJubyByZWNvZ25pemVkIHBhcmFtcyBpbjogJXMiLCBwYXJhbXMuZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGNvbmZpZ1VwZGF0ZS0+Y2xlYXIoKTsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gc3VwcG9ydGVkSW5kaWNlczsKKyAgICBmb3IgKEMyUGFyYW06OkluZGV4IGl4IDogaW5kaWNlcykgeworICAgICAgICBpZiAobVN1cHBvcnRlZEluZGljZXMuY291bnQoaXgpKSB7CisgICAgICAgICAgICBzdXBwb3J0ZWRJbmRpY2VzLnB1c2hfYmFjayhpeCk7CisgICAgICAgIH0gZWxzZSBpZiAobUxvY2FsUGFyYW1zLmNvdW50KGl4KSkgeworICAgICAgICAgICAgLy8gcXVlcnkgbG9jYWwgcGFyYW1ldGVyIGhlcmUKKyAgICAgICAgICAgIGF1dG8gaXQgPSBtQ3VycmVudENvbmZpZy5maW5kKGl4KTsKKyAgICAgICAgICAgIGlmIChpdCAhPSBtQ3VycmVudENvbmZpZy5lbmQoKSkgeworICAgICAgICAgICAgICAgIGNvbmZpZ1VwZGF0ZS0+ZW1wbGFjZV9iYWNrKEMyUGFyYW06OkNvcHkoKml0LT5zZWNvbmQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGMyX3N0YXR1c190IGVyciA9IGNvbXBvbmVudC0+cXVlcnkoeyB9LCBzdXBwb3J0ZWRJbmRpY2VzLCBibG9ja2luZywgY29uZmlnVXBkYXRlKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJxdWVyeSBmYWlsZWQgYWZ0ZXIgcmV0dXJuaW5nICV6dSBwYXJhbXMgPT4gJXMiLCBjb25maWdVcGRhdGUtPnNpemUoKSwgYXNTdHJpbmcoZXJyKSk7CisgICAgfQorCisgICAgaWYgKGNvbmZpZ1VwZGF0ZS0+c2l6ZSgpKSB7CisgICAgICAgIG1QYXJhbVVwZGF0ZXItPnVwZGF0ZVBhcmFtc0Zyb21NZXNzYWdlKHBhcmFtcywgY29uZmlnVXBkYXRlKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDQ29kZWNDb25maWc6OnNldFBhcmFtZXRlcnMoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZjb25maWdVcGRhdGUsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgYmxvY2tpbmcpIHsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBPSzsKKyAgICBpZiAoY29uZmlnVXBkYXRlLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBpbmRpY2VzOworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0gKj4gcGFyYW1WZWN0b3I7CisgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtIDogY29uZmlnVXBkYXRlKSB7CisgICAgICAgIGlmIChtU3VwcG9ydGVkSW5kaWNlcy5jb3VudChwYXJhbS0+aW5kZXgoKSkpIHsKKyAgICAgICAgICAgIC8vIGNvbXBvbmVudCBwYXJhbWV0ZXIKKyAgICAgICAgICAgIHBhcmFtVmVjdG9yLnB1c2hfYmFjayhwYXJhbS5nZXQoKSk7CisgICAgICAgICAgICBpbmRpY2VzLnB1c2hfYmFjayhwYXJhbS0+aW5kZXgoKSk7CisgICAgICAgIH0gZWxzZSBpZiAobUxvY2FsUGFyYW1zLmNvdW50KHBhcmFtLT5pbmRleCgpKSkgeworICAgICAgICAgICAgLy8gaGFuZGxlIGxvY2FsIHBhcmFtZXRlciBoZXJlCisgICAgICAgICAgICBMb2NhbFBhcmFtVmFsaWRhdG9yIHZhbGlkYXRvciA9IG1Mb2NhbFBhcmFtcy5maW5kKHBhcmFtLT5pbmRleCgpKS0+c2Vjb25kOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gQzJfT0s7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gY29weSA9IEMyUGFyYW06OkNvcHkoKnBhcmFtKTsKKyAgICAgICAgICAgIGlmICh2YWxpZGF0b3IpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSB2YWxpZGF0b3IoY29weSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInVwZGF0ZWQgbG9jYWwgcGFyYW1ldGVyIHZhbHVlIGZvciAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBtUGFyYW1VcGRhdGVyLT5nZXRQYXJhbU5hbWUocGFyYW0tPmluZGV4KCkpLmNfc3RyKCkpOworCisgICAgICAgICAgICAgICAgbUN1cnJlbnRDb25maWdbcGFyYW0tPmluZGV4KCldID0gc3RkOjptb3ZlKGNvcHkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiZmFpbGVkIHRvIHNldCBwYXJhbWV0ZXIgdmFsdWUgZm9yICVzID0+ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QYXJhbVVwZGF0ZXItPmdldFBhcmFtTmFtZShwYXJhbS0+aW5kZXgoKSkuY19zdHIoKSwgYXNTdHJpbmcoZXJyKSk7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIC8vIHVwZGF0ZSBzdWJzY3JpYmVkIHBhcmFtIGluZGljZXMKKyAgICBzdWJzY3JpYmVUb0NvbmZpZ1VwZGF0ZShjb21wb25lbnQsIGluZGljZXMsIGJsb2NraW5nKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBjb21wb25lbnQtPmNvbmZpZyhwYXJhbVZlY3RvciwgYmxvY2tpbmcsICZmYWlsdXJlcyk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgiY29uZmlnIGZhaWxlZCA9PiAlcyIsIGFzU3RyaW5nKGVycikpOworICAgICAgICAvLyBUaGlzIGlzIG5vbi1mYXRhbC4KKyAgICB9CisgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiAmZmFpbHVyZSA6IGZhaWx1cmVzKSB7CisgICAgICAgIHN3aXRjaCAoZmFpbHVyZS0+ZmFpbHVyZSkgeworICAgICAgICAgICAgY2FzZSBDMlNldHRpbmdSZXN1bHQ6OkJBRF9WQUxVRToKKyAgICAgICAgICAgICAgICBBTE9HRCgiQmFkIHBhcmFtZXRlciB2YWx1ZSIpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR1YoImZhaWx1cmUgPSAlZCIsIGludChmYWlsdXJlLT5mYWlsdXJlKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBSZS1xdWVyeSBwYXJhbWV0ZXIgdmFsdWVzIGluIGNhc2UgY29uZmlnIGNvdWxkIG5vdCB1cGRhdGUgdGhlbSBhbmQgdXBkYXRlIHRoZSBjdXJyZW50CisgICAgLy8gY29uZmlndXJhdGlvbi4KKyAgICBjb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICBlcnIgPSBjb21wb25lbnQtPnF1ZXJ5KHt9LCBpbmRpY2VzLCBibG9ja2luZywgJmNvbmZpZ1VwZGF0ZSk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgicXVlcnkgZmFpbGVkIGFmdGVyIHJldHVybmluZyAlenUgcGFyYW1zID0+ICVzIiwgY29uZmlnVXBkYXRlLnNpemUoKSwgYXNTdHJpbmcoZXJyKSk7CisgICAgfQorICAgICh2b2lkKXVwZGF0ZUNvbmZpZ3VyYXRpb24oY29uZmlnVXBkYXRlLCBBTEwpOworCisgICAgLy8gVE9ETzogZXJyb3IgdmFsdWUKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitjb25zdCBDMlBhcmFtICpDQ29kZWNDb25maWc6OmdldENvbmZpZ1BhcmFtZXRlclZhbHVlKEMyUGFyYW06OkluZGV4IGluZGV4KSBjb25zdCB7CisgICAgYXV0byBpdCA9IG1DdXJyZW50Q29uZmlnLmZpbmQoaW5kZXgpOworICAgIGlmIChpdCA9PSBtQ3VycmVudENvbmZpZy5lbmQoKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gaXQtPnNlY29uZC5nZXQoKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JhZmUzZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuaApAQCAtMCwwICsxLDM0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ19DT0RFQ19DT05GSUdfSF8KKyNkZWZpbmUgQ19DT0RFQ19DT05GSUdfSF8KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisKKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKKyNpbmNsdWRlICJJbnB1dFN1cmZhY2VXcmFwcGVyLmgiCisjaW5jbHVkZSAiUmVmbGVjdGVkUGFyYW1VcGRhdGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFNZXNzYWdlOworc3RydWN0IFN0YW5kYXJkUGFyYW1zOworCisvKioKKyAqIFN0cnVjdCBtYW5hZ2luZyB0aGUgY29kZWMgY29uZmlndXJhdGlvbiBmb3IgQ0NvZGVjLgorICovCitzdHJ1Y3QgQ0NvZGVjQ29uZmlnIHsKKworICAgIC8qKgorICAgICAqIERvbWFpbiBjb25zaXN0cyBvZiBhIGJpdG1hc2sgZGl2aWRlZCBpbnRvIGZpZWxkcywgYW5kIHNwZWNpZmllcnMgd29yayBieSBleGNsdWRpbmcgb3RoZXIKKyAgICAgKiB2YWx1ZXMgaW4gdGhvc2UgZG9tYWlucy4KKyAgICAgKgorICAgICAqIENvbXBvbmVudCBkb21haW5zIGFyZSBjb21wb3NlZCBieSBvci1pbmcgdGhlIGluZGl2aWR1YWwgSVNfIGNvbnN0YW50cywgZS5nLgorICAgICAqIElTX0RFQ09ERVIgfCBJU19BVURJTy4KKyAgICAgKgorICAgICAqIENvbmZpZyBzcGVjaWZpZXJzIGFyZSBjb21wb3NlZCBieSBvci1pbmcgdGhlIGluZGl2aWR1YWwgbWFzayBjb25zdGFudHMsIGFuZAorICAgICAqIGFuZC1pbmcgdGhlc2UgZ3JvdXBzOiBlLmcuIChERUNPREVSIHwgRU5DT0RFUikgJiBBVURJTy4KKyAgICAgKgorICAgICAqIFRoZSBuYW1pbmcgb2YgdGhlc2UgY29uc3RhbnRzIHdhcyB0byBsaW1pdCB0aGUgbGVuZ3RoIG9mIG1hc2sgbmFtZXMgYXMgdGhlc2UgYXJlIHVzZWQgbW9yZQorICAgICAqIGNvbW1vbmx5IGFzIG1hc2tzLgorICAgICAqLworICAgIGVudW0gRG9tYWluIDogdWludDMyX3QgeworICAgICAgICAvLyBjb21wb25lbnQgZG9tYWluIChkb21haW4gJiBraW5kKQorICAgICAgICBHVUFSRF9CSVQgICA9ICgxIDw8IDEpLCAgIC8vLzwgdGhpcyBpcyB0byBwcmV2ZW50IGFnYWluc3QgYWNjaWRlbnRhbCAmJiBvciB8fCB1c2FnZQorICAgICAgICBJU19BVURJTyAgICA9ICgxIDw8IDIpLCAgIC8vLzwgZm9yIGF1ZGlvIGNvZGVjcworICAgICAgICBJU19WSURFTyAgICA9ICgxIDw8IDMpLCAgIC8vLzwgZm9yIHZpZGVvIGNvZGVjcworICAgICAgICBJU19JTUFHRSAgICA9ICgxIDw8IDQpLCAgIC8vLzwgZm9yIGltYWdlIGNvZGVjcworICAgICAgICBPVEhFUl9ET01BSU4gPSAoMSA8PCA1KSwgIC8vLzwgZm9yIG90aGVyIGRvbWFpbnMKKworICAgICAgICBJU19FTkNPREVSICA9ICgxIDw8IDYpLCAgIC8vLzwgZm9yIGVuY29kZXJzCisgICAgICAgIElTX0RFQ09ERVIgID0gKDEgPDwgNyksICAgLy8vPCBmb3IgZGVjb2RlcnMKKyAgICAgICAgT1RIRVJfS0lORCAgPSAoMSA8PCA4KSwgICAvLy88IGZvciBvdGhlciBkb21haW5zCisKKyAgICAgICAgLy8gY29uZmlnIGRvbWFpbgorICAgICAgICBJU19QQVJBTSAgICA9ICgxIDw8IDkpLCAgIC8vLzwgZm9yIHNldFBhcmFtZXRlcgorICAgICAgICBJU19DT05GSUcgICA9ICgxIDw8IDEwKSwgIC8vLzwgZm9yIGNvbmZpZ3VyZQorICAgICAgICBJU19SRUFEICAgICA9ICgxIDw8IDExKSwgIC8vLzwgZm9yIGdldEZvcm1hdAorCisgICAgICAgIC8vIHBvcnQgZG9tYWluCisgICAgICAgIElTX0lOUFVUICAgID0gKDEgPDwgMTIpLCAgLy8vPCBmb3IgaW5wdXQgcG9ydCAoZ2V0Rm9ybWF0KQorICAgICAgICBJU19PVVRQVVQgICA9ICgxIDw8IDEzKSwgIC8vLzwgZm9yIG91dHB1dCBwb3J0IChnZXRGb3JtYXQpCisgICAgICAgIElTX1JBVyAgICAgID0gKDEgPDwgMTQpLCAgLy8vPCBmb3IgcmF3IHBvcnQgKGlucHV0LWVuY29kZXIsIG91dHB1dC1kZWNvZGVyKQorICAgICAgICBJU19DT0RFRCAgICA9ICgxIDw8IDE1KSwgIC8vLzwgZm9yIGNvZGVkIHBvcnQgKGlucHV0LWRlY29kZXIsIG91dHB1dC1lbmNvZGVyKQorCisgICAgICAgIEFMTCAgICAgPSB+MFUsCisgICAgICAgIE5PTkUgICAgPSAwLAorCisgICAgICAgIEFVRElPICAgPSB+KElTX0lNQUdFIHwgSVNfVklERU8gfCBPVEhFUl9ET01BSU4pLAorICAgICAgICBWSURFTyAgID0gfihJU19BVURJTyB8IElTX0lNQUdFIHwgT1RIRVJfRE9NQUlOKSwKKyAgICAgICAgSU1BR0UgICA9IH4oSVNfQVVESU8gfCBJU19WSURFTyB8IE9USEVSX0RPTUFJTiksCisKKyAgICAgICAgREVDT0RFUiA9IH4oSVNfRU5DT0RFUiB8IE9USEVSX0tJTkQpLAorICAgICAgICBFTkNPREVSID0gfihJU19ERUNPREVSIHwgT1RIRVJfS0lORCksCisKKyAgICAgICAgUEFSQU0gICA9IH4oSVNfQ09ORklHIHwgSVNfUkVBRCksCisgICAgICAgIENPTkZJRyAgPSB+KElTX1BBUkFNICB8IElTX1JFQUQpLAorICAgICAgICBSRUFEICAgID0gfihJU19DT05GSUcgfCBJU19QQVJBTSksCisKKyAgICAgICAgSU5QVVQgICA9IH4oSVNfT1VUUFVUIHwgSVNfUkFXICAgIHwgSVNfQ09ERUQpLAorICAgICAgICBPVVRQVVQgID0gfihJU19JTlBVVCAgfCBJU19SQVcgICAgfCBJU19DT0RFRCksCisgICAgICAgIFJBVyAgICAgPSB+KElTX0lOUFVUICB8IElTX09VVFBVVCB8IElTX0NPREVEKSwKKyAgICAgICAgQ09ERUQgICA9IH4oSVNfSU5QVVQgIHwgSVNfUkFXICAgIHwgSVNfT1VUUFVUKSwKKyAgICB9OworCisgICAgLy8gdGhpbmdzIHJlcXVpcmVkIHRvIG1hbmFnZSBmb3JtYXRzCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gbVBhcmFtRGVzY3M7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IG1SZWZsZWN0b3I7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8UmVmbGVjdGVkUGFyYW1VcGRhdGVyPiBtUGFyYW1VcGRhdGVyOworCisgICAgRG9tYWluIG1Eb21haW47IC8vIGNvbXBvbmVudCBkb21haW4KKyAgICBEb21haW4gbUlucHV0RG9tYWluOyAvLyBpbnB1dCBwb3J0IGRvbWFpbgorICAgIERvbWFpbiBtT3V0cHV0RG9tYWluOyAvLyBvdXRwdXQgcG9ydCBkb21haW4KKyAgICBzdGQ6OnN0cmluZyBtQ29kaW5nTWVkaWFUeXBlOyAgLy8gbWVkaWEgdHlwZSBvZiB0aGUgY29kZWQgc3RyZWFtCisKKyAgICAvLyBzdGFuZGFyZCBNZWRpYUNvZGVjIHRvIENvZGVjIDIuMCBwYXJhbXMgbWFwcGluZworICAgIHN0ZDo6c2hhcmVkX3B0cjxTdGFuZGFyZFBhcmFtcz4gbVN0YW5kYXJkUGFyYW1zOworCisgICAgc3RkOjpzZXQ8QzJQYXJhbTo6SW5kZXg+IG1TdXBwb3J0ZWRJbmRpY2VzOyAvLy88IGluZGljZXMgc3VwcG9ydGVkIGJ5IHRoZSBjb21wb25lbnQKKyAgICBzdGQ6OnNldDxDMlBhcmFtOjpJbmRleD4gbVN1YnNjcmliZWRJbmRpY2VzOyAvLy88IGluZGljZXMgdG8gc3Vic2NyaWJlIHRvCisgICAgc2l6ZV90IG1TdWJzY3JpYmVkSW5kaWNlc1NpemU7IC8vLzwgY291bnQgb2YgY3VycmVudGx5IHN1YnNjcmliZWQgaW5kaWNlcworCisgICAgc3A8QU1lc3NhZ2U+IG1JbnB1dEZvcm1hdDsKKyAgICBzcDxBTWVzc2FnZT4gbU91dHB1dEZvcm1hdDsKKworICAgIGJvb2wgbVVzaW5nU3VyZmFjZTsgLy8vPCB1c2luZyBpbnB1dCBvciBvdXRwdXQgc3VyZmFjZQorCisgICAgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZVdyYXBwZXI+IG1JbnB1dFN1cmZhY2U7CisgICAgc3RkOjp1bmlxdWVfcHRyPElucHV0U3VyZmFjZVdyYXBwZXI6OkNvbmZpZz4gbUlTQ29uZmlnOworCisgICAgLy8vIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uIFVwZGF0ZWQgYWZ0ZXIgY29uZmlndXJlKCkgYW5kIGJhc2VkIG9uIGNvbmZpZ1VwZGF0ZSBpbgorICAgIC8vLyBvbldvcmtEb25lCisgICAgc3RkOjptYXA8QzJQYXJhbTo6SW5kZXgsIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gbUN1cnJlbnRDb25maWc7CisKKyAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3Qoc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+Jik+IExvY2FsUGFyYW1WYWxpZGF0b3I7CisKKyAgICAvLy8gUGFyYW1ldGVyIGluZGljZXMgdHJhY2tlZCBpbiBjdXJyZW50IGNvbmZpZyB0aGF0IGFyZSBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjb21wb25lbnQuCisgICAgLy8vIHRoZXNlIGFyZSBwcm92aWRlZCBzbyB0aGF0IG9wdGlvbmFsIHBhcmFtZXRlcnMgY2FuIHJlbWFpbiBpbiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLgorICAgIC8vLyBhcyBzdWNoLCB0aGVzZSBwYXJhbWV0ZXJzIGhhdmUgbm8gZGVwZW5kZW5jaWVzLiBUT0RPOiB1c2UgQzJJbnRlcmZhY2VIZWxwZXIgZm9yIHRoaXMuCisgICAgLy8vIEZvciBub3cgc3VwcG9ydCBhIHZhbGlkYXRpb24gZnVuY3Rpb24uCisgICAgc3RkOjptYXA8QzJQYXJhbTo6SW5kZXgsIExvY2FsUGFyYW1WYWxpZGF0b3I+IG1Mb2NhbFBhcmFtczsKKworICAgIENDb2RlY0NvbmZpZygpOworCisgICAgLy8vIGluaXRpYWxpemVzIHRoZSBtZW1iZXJzIHJlcXVpcmVkIHRvIG1hbmFnZSB0aGUgZm9ybWF0OiBkZXNjcmlwdG9ycywgcmVmbGVjdG9yLAorICAgIC8vLyByZWZsZWN0ZWQgcGFyYW0gaGVscGVyLCBkb21haW4sIHN0YW5kYXJkIHBhcmFtcywgYW5kIHN1YnNjcmliZXMgdG8gc3RhbmRhcmQKKyAgICAvLy8gaW5kaWNlcy4KKyAgICBzdGF0dXNfdCBpbml0aWFsaXplKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gJmNsaWVudCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCk7CisKKworICAgIC8qKgorICAgICAqIEFkZHMgYSBsb2NhbGx5IG1haW50YWluZWQgcGFyYW1ldGVyLiBUaGlzIGlzIHVzZWQgZm9yIG91dHB1dCBjb25maWd1cmF0aW9uIHRoYXQgY2FuIGJlCisgICAgICogYXBwZW5kZWQgdG8gdGhlIG91dHB1dCBidWZmZXJzIGluIGNhc2UgaXQgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50LgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgYm9vbCBhZGRMb2NhbFBhcmFtKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsCisgICAgICAgICAgICBDMlBhcmFtRGVzY3JpcHRvcjo6YXR0cmliX3QgYXR0cmliID0gQzJQYXJhbURlc2NyaXB0b3I6OklTX1JFQURfT05MWSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3Qoc3RkOjp1bmlxdWVfcHRyPFQ+Jik+IHZhbGlkYXRvcl8gPQorICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3Qoc3RkOjp1bmlxdWVfcHRyPFQ+Jik+KCkpIHsKKyAgICAgICAgQzJQYXJhbTo6SW5kZXggaW5kZXggPSBUOjpQQVJBTV9UWVBFOworICAgICAgICBpZiAobVN1cHBvcnRlZEluZGljZXMuY291bnQoaW5kZXgpIHx8IG1Mb2NhbFBhcmFtcy5jb3VudChpbmRleCkpIHsKKyAgICAgICAgICAgIGlmIChtU3VwcG9ydGVkSW5kaWNlcy5jb3VudChpbmRleCkpIHsKKyAgICAgICAgICAgICAgICBtU3Vic2NyaWJlZEluZGljZXMuZW1wbGFjZShpbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HRCgiaWdub3JpbmcgbG9jYWwgcGFyYW0gJXMgKCUjeCkgYXMgaXQgaXMgYWxyZWFkeSAlcyIsCisgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSwgKHVpbnQzMl90KWluZGV4LCBtU3VwcG9ydGVkSW5kaWNlcy5jb3VudChpbmRleCkgPyAic3VwcG9ydGVkIiA6ICJsb2NhbCIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBhbHJlYWR5IHN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50IG9yIGFscmVhZHkgYWRkZWQKKyAgICAgICAgfQorCisgICAgICAgIC8vIHdyYXAgdHlwZWQgdmFsaWRhdG9yIGludG8gdW50eXBlZCB2YWxpZGF0b3IKKyAgICAgICAgTG9jYWxQYXJhbVZhbGlkYXRvciB2YWxpZGF0b3I7CisgICAgICAgIGlmICh2YWxpZGF0b3JfKSB7CisgICAgICAgICAgICB2YWxpZGF0b3IgPSBbdmFsaWRhdG9yX10oc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+JiBwKXsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCByZXMgPSBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFQ+IHR5cGVkKHN0YXRpY19jYXN0PFQqPihwLnJlbGVhc2UoKSkpOworICAgICAgICAgICAgICAgIC8vIGlmIHBhcmFtZXRlciBpcyBjb3JyZWN0bHkgdHlwZWQKKyAgICAgICAgICAgICAgICBpZiAoVDo6RnJvbSh0eXBlZC5nZXQoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gdmFsaWRhdG9yXyh0eXBlZCk7CisgICAgICAgICAgICAgICAgICAgIHAucmVzZXQodHlwZWQucmVsZWFzZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH07CisgICAgICAgIH0KKworICAgICAgICBtTG9jYWxQYXJhbXMuZW1wbGFjZShpbmRleCwgdmFsaWRhdG9yKTsKKyAgICAgICAgbVBhcmFtVXBkYXRlci0+YWRkU3RhbmRhcmRQYXJhbTxUPihuYW1lLCBhdHRyaWIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbG9jYWxseSBtYWludGFpbmVkIHBhcmFtZXRlciB3aXRoIGEgZGVmYXVsdCB2YWx1ZS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGJvb2wgYWRkTG9jYWxQYXJhbSgKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiBkZWZhdWx0XywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAorICAgICAgICAgICAgQzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90IGF0dHJpYiA9IEMyUGFyYW1EZXNjcmlwdG9yOjpJU19SRUFEX09OTFksCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6dW5pcXVlX3B0cjxUPiYpPiB2YWxpZGF0b3JfID0KKyAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6dW5pcXVlX3B0cjxUPiYpPigpKSB7CisgICAgICAgIGlmIChhZGRMb2NhbFBhcmFtPFQ+KG5hbWUsIGF0dHJpYiwgdmFsaWRhdG9yXykpIHsKKyAgICAgICAgICAgIGlmICh2YWxpZGF0b3JfKSB7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gdmFsaWRhdG9yXyhkZWZhdWx0Xyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiZGVmYXVsdCB2YWx1ZSBmb3IgJXMgaXMgaW52YWxpZCA9PiAlcyIsIG5hbWUuY19zdHIoKSwgYXNTdHJpbmcoZXJyKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ3VycmVudENvbmZpZ1tUOjpQQVJBTV9UWVBFXSA9IHN0ZDo6bW92ZShkZWZhdWx0Xyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBib29sIGFkZExvY2FsUGFyYW0oCisgICAgICAgICAgICBUICpkZWZhdWx0XywgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsCisgICAgICAgICAgICBDMlBhcmFtRGVzY3JpcHRvcjo6YXR0cmliX3QgYXR0cmliID0gQzJQYXJhbURlc2NyaXB0b3I6OklTX1JFQURfT05MWSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3Qoc3RkOjp1bmlxdWVfcHRyPFQ+Jik+IHZhbGlkYXRvcl8gPQorICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3Qoc3RkOjp1bmlxdWVfcHRyPFQ+Jik+KCkpIHsKKyAgICAgICAgcmV0dXJuIGFkZExvY2FsUGFyYW0oc3RkOjp1bmlxdWVfcHRyPFQ+KGRlZmF1bHRfKSwgbmFtZSwgYXR0cmliLCB2YWxpZGF0b3JfKTsKKyAgICB9CisKKyAgICAvLy8gQXBwbGllcyBjb25maWd1cmF0aW9uIHVwZGF0ZXMsIGFuZCB1cGRhdGVzIGZvcm1hdCBpbiB0aGUgc3BlY2lmaWMgZG9tYWluLgorICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgZm9ybWF0cyB3ZXJlIHVwZGF0ZWQKKyAgICAvLy8gXHBhcmFtIGRvbWFpbiBpbnB1dC9vdXRwdXQgYml0bWFzaworICAgIGJvb2wgdXBkYXRlQ29uZmlndXJhdGlvbigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gJmNvbmZpZ1VwZGF0ZSwgRG9tYWluIGRvbWFpbik7CisKKyAgICAvLy8gVXBkYXRlcyBmb3JtYXRzIGluIHRoZSBzcGVjaWZpYyBkb21haW4uIFJldHVybnMgdHJ1ZSBpZiBhbnkgb2YgdGhlIGZvcm1hdHMgaGF2ZSBjaGFuZ2VkLgorICAgIC8vLyBccGFyYW0gZG9tYWluIGlucHV0L291dHB1dCBiaXRtYXNrCisgICAgYm9vbCB1cGRhdGVGb3JtYXRzKERvbWFpbiBkb21haW4pOworCisgICAgLyoqCisgICAgICogQXBwbGllcyBTREsgY29uZmlndXJhdGlvbnMgaW4gYSBzcGVjaWZpYyBjb25maWd1cmF0aW9uIGRvbWFpbi4KKyAgICAgKiBVcGRhdGVzIHJlbGV2YW50IGlucHV0L291dHB1dCBmb3JtYXRzIGFuZCBzdWJzY3JpYmVzIHRvIHBhcmFtZXRlcnMgc3BlY2lmaWVkIGluIHRoZQorICAgICAqIGNvbmZpZ3VyYXRpb24uCisgICAgICogXHBhcmFtIGRvbWFpbiBjb25maWcvc2V0UGFyYW0gYml0bWFzaworICAgICAqIFxwYXJhbSBibG9ja2luZyBibG9ja2luZyBtb2RlIHRvIHVzZSB3aXRoIHRoZSBjb21wb25lbnQKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBnZXRDb25maWdVcGRhdGVGcm9tU2RrUGFyYW1zKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJnNka1BhcmFtcywgRG9tYWluIGRvbWFpbiwKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgYmxvY2tpbmcsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpjb25maWdVcGRhdGUpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQXBwbGllcyBhIGNvbmZpZ3VyYXRpb24gdXBkYXRlIHRvIHRoZSBjb21wb25lbnQuCisgICAgICogVXBkYXRlcyByZWxldmFudCBpbnB1dC9vdXRwdXQgZm9ybWF0cyBhbmQgc3Vic2NyaWJlcyB0byBwYXJhbWV0ZXJzIHNwZWNpZmllZCBpbiB0aGUKKyAgICAgKiBjb25maWd1cmF0aW9uLgorICAgICAqIFxwYXJhbSBibG9ja2luZyBibG9ja2luZyBtb2RlIHRvIHVzZSB3aXRoIHRoZSBjb21wb25lbnQKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZjb25maWdVcGRhdGUsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IGJsb2NraW5nKTsKKworICAgIC8vLyBRdWVyaWVzIHN1YnNjcmliZWQgaW5kaWNlcyAod2hpY2ggY29udGFpbnMgYWxsIFNESy1leHBvc2VkIHZhbHVlcykgYW5kIHVwZGF0ZXMKKyAgICAvLy8gaW5wdXQvb3V0cHV0IGZvcm1hdHMuCisgICAgc3RhdHVzX3QgcXVlcnlDb25maWd1cmF0aW9uKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50KTsKKworICAgIC8vLyBRdWVyaWVzIGEgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgdmFsdWUuIFJldHVybnMgbnVsbHB0ciBpZiB0aGUgcGFyYW1ldGVyIGlzIG5vdAorICAgIC8vLyBwYXJ0IG9mIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24KKyAgICBjb25zdCBDMlBhcmFtICpnZXRDb25maWdQYXJhbWV0ZXJWYWx1ZShDMlBhcmFtOjpJbmRleCBpbmRleCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBPYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFuZCBpZiB0aGV5IGNoYW5nZS4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBXYXRjaGVyIHsKKyAgICAgICAgfldhdGNoZXIoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUgb2YgdGhpcyBjb25maWd1cmF0aW9uIGhhcyBjaGFuZ2VkCisgICAgICAgIGJvb2wgaGFzQ2hhbmdlZCgpIGNvbnN0IHsKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gKnZhbHVlID0gbVBhcmVudC0+Z2V0Q29uZmlnUGFyYW1ldGVyVmFsdWUobUluZGV4KTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSAmJiBtVmFsdWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKnZhbHVlICE9ICptVmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZSAhPSBtVmFsdWUuZ2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLy8gdXBkYXRlcyB0aGUgY3VycmVudCB2YWx1ZSBhbmQgcmV0dXJucyBpdAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVD4gdXBkYXRlKCkgeworICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAqdmFsdWUgPSBtUGFyZW50LT5nZXRDb25maWdQYXJhbWV0ZXJWYWx1ZShtSW5kZXgpOworICAgICAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgICAgICAgbVZhbHVlID0gc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFQ+KFQ6OkZyb20oQzJQYXJhbTo6Q29weSgqdmFsdWUpLnJlbGVhc2UoKSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1WYWx1ZTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgV2F0Y2hlcihDMlBhcmFtOjpJbmRleCBpbmRleCwgY29uc3QgQ0NvZGVjQ29uZmlnICpwYXJlbnQpCisgICAgICAgICAgICA6IG1QYXJlbnQocGFyZW50KSwgbUluZGV4KGluZGV4KSB7CisgICAgICAgICAgICB1cGRhdGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgQ0NvZGVjQ29uZmlnOworCisgICAgICAgIGNvbnN0IENDb2RlY0NvbmZpZyAqbVBhcmVudDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFQ+IG1WYWx1ZTsKKyAgICAgICAgQzJQYXJhbTo6SW5kZXggbUluZGV4OworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgd2F0Y2hlciBvYmplY3QgZm9yIGEgcGFyYW1ldGVyLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgV2F0Y2hlcjxUPiB3YXRjaChDMlBhcmFtOjpJbmRleCBpbmRleCA9IFQ6OlBBUkFNX1RZUEUpIGNvbnN0IHsKKyAgICAgICAgaWYgKGluZGV4LnR5cGUoKSAhPSBUOjpQQVJBTV9UWVBFKSB7CisgICAgICAgICAgICBfX2J1aWx0aW5fdHJhcCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBXYXRjaGVyPFQ+KGluZGV4LCB0aGlzKTsKKyAgICB9CisKK3ByaXZhdGU6CisKKyAgICAvLy8gaW5pdGlhbGl6ZXMgdGhlIHN0YW5kYXJkIE1lZGlhQ29kZWMgdG8gQ29kZWMgMi4wIHBhcmFtcyBtYXBwaW5nCisgICAgdm9pZCBpbml0aWFsaXplU3RhbmRhcmRQYXJhbXMoKTsKKworICAgIC8vLyBBZGRzIGluZGljZXMgdG8gdGhlIHN1YnNjcmliZWQgaW5kaWNlcywgYW5kIHVwZGF0ZWQgc3Vic2NyaXB0aW9uIHRvIGNvbXBvbmVudAorICAgIC8vLyBccGFyYW0gYmxvY2tpbmcgYmxvY2tpbmcgbW9kZSB0byB1c2Ugd2l0aCB0aGUgY29tcG9uZW50CisgICAgc3RhdHVzX3Qgc3Vic2NyaWJlVG9Db25maWdVcGRhdGUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wb25lbnQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IGJsb2NraW5nID0gQzJfRE9OVF9CTE9DSyk7CisKKyAgICAvLy8gR2V0cyBTREsgZm9ybWF0IGZyb20gY29kZWMgMi4wIHJlZmxlY3RlZCBjb25maWd1cmF0aW9uCisgICAgLy8vIFxwYXJhbSBkb21haW4gaW5wdXQvb3V0cHV0IGJpdG1hc2sKKyAgICBzcDxBTWVzc2FnZT4gZ2V0U2RrRm9ybWF0Rm9yRG9tYWluKAorICAgICAgICAgICAgY29uc3QgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0ICZyZWZsZWN0ZWQsIERvbWFpbiBkb21haW4pIGNvbnN0OworCisgICAgLyoqCisgICAgICogQ29udmVydHMgYSBzZXQgb2YgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGluIGFuIEFNZXNzYWdlIHRvIGEgbGlzdCBvZiBwYXRoLWJhc2VkIENvZGVjCisgICAgICogMi4wIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBkb21haW4gY29uZmlnL3NldFBhcmFtIGJpdG1hc2sKKyAgICAgKi8KKyAgICBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QgZ2V0UmVmbGVjdGVkRm9ybWF0KAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZjb25maWcsIERvbWFpbiBkb21haW4pIGNvbnN0OworfTsKKworREVGSU5FX0VOVU1fT1BFUkFUT1JTKENDb2RlY0NvbmZpZzo6RG9tYWluKQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENfQ09ERUNfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMyQnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDJhZDZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5jcHAKQEAgLTAsMCArMSw4MDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyQnVmZmVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8aGlkbG1lbW9yeS9GcmFtZXdvcmtVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG5hdGl2ZWJhc2UvbmF0aXZlYmFzZS5oPgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJCbG9ja0ludGVybmFsLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorCisjaW5jbHVkZSAiQ29kZWMyQnVmZmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gQ29kZWMyQnVmZmVyCisKK2Jvb2wgQ29kZWMyQnVmZmVyOjpjYW5Db3B5TGluZWFyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgY29uc3QgeworICAgIGlmIChjb25zdF9jYXN0PENvZGVjMkJ1ZmZlciAqPih0aGlzKS0+YmFzZSgpID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICAvLyBOb3RoaW5nIHRvIGNvcHksIHNvIHdlIGNhbiBjb3B5IGJ5IGRvaW5nIG5vdGhpbmcuCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoYnVmZmVyLT5kYXRhKCkudHlwZSgpICE9IEMyQnVmZmVyRGF0YTo6TElORUFSKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLnNpemUoKSA9PSAwdSkgeworICAgICAgICAvLyBOb3RoaW5nIHRvIGNvcHksIHNvIHdlIGNhbiBjb3B5IGJ5IGRvaW5nIG5vdGhpbmcuCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoYnVmZmVyLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuc2l6ZSgpID4gMXUpIHsKKyAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyBob3cgdG8gY29weSBtb3JlIHRoYW4gb25lIGJsb2Nrcy4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoYnVmZmVyLT5kYXRhKCkubGluZWFyQmxvY2tzKClbMF0uc2l6ZSgpID4gY2FwYWNpdHkoKSkgeworICAgICAgICAvLyBJdCB3b24ndCBmaXQuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29kZWMyQnVmZmVyOjpjb3B5TGluZWFyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIC8vIFdlIGFzc3VtZSB0aGF0IGFsbCBjYW5Db3B5TGluZWFyKCkgY2hlY2tzIHBhc3NlZC4KKyAgICBpZiAoIWJ1ZmZlciB8fCBidWZmZXItPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5zaXplKCkgPT0gMHUKKyAgICAgICAgICAgIHx8IGJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpWzBdLnNpemUoKSA9PSAwdSkgeworICAgICAgICBzZXRSYW5nZSgwLCAwKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIEMyUmVhZFZpZXcgdmlldyA9IGJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpWzBdLm1hcCgpLmdldCgpOworICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoIkVycm9yIHdoaWxlIG1hcHBpbmc6ICVkIiwgdmlldy5lcnJvcigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAodmlldy5jYXBhY2l0eSgpID4gY2FwYWNpdHkoKSkgeworICAgICAgICBBTE9HRCgiQzJDb25zdExpbmVhckJsb2NrIGxpZWQgLS0tIGl0IGFjdHVhbGx5IGRvZXNuJ3QgZml0OiB2aWV3KCV1KSA+IHRoaXMoJXp1KSIsCisgICAgICAgICAgICAgICAgdmlldy5jYXBhY2l0eSgpLCBjYXBhY2l0eSgpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtZW1jcHkoYmFzZSgpLCB2aWV3LmRhdGEoKSwgdmlldy5jYXBhY2l0eSgpKTsKKyAgICBzZXRSYW5nZSgwLCB2aWV3LmNhcGFjaXR5KCkpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIENvZGVjMkJ1ZmZlcjo6c2V0SW1hZ2VEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZpbWFnZURhdGEpIHsKKyAgICBtSW1hZ2VEYXRhID0gaW1hZ2VEYXRhOworfQorCisvLyBMb2NhbExpbmVhckJ1ZmZlcgorCitib29sIExvY2FsTGluZWFyQnVmZmVyOjpjYW5Db3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgY29uc3QgeworICAgIHJldHVybiBjYW5Db3B5TGluZWFyKGJ1ZmZlcik7Cit9CisKK2Jvb2wgTG9jYWxMaW5lYXJCdWZmZXI6OmNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgcmV0dXJuIGNvcHlMaW5lYXIoYnVmZmVyKTsKK30KKworLy8gRHVtbXlDb250YWluZXJCdWZmZXIKKworc3RhdGljIHVpbnQ4X3Qgc0R1bW15Qnl0ZVsxXSA9IHsgMCB9OworCitEdW1teUNvbnRhaW5lckJ1ZmZlcjo6RHVtbXlDb250YWluZXJCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpCisgICAgOiBDb2RlYzJCdWZmZXIoZm9ybWF0LCBuZXcgQUJ1ZmZlcihzRHVtbXlCeXRlLCAxKSksCisgICAgICBtQnVmZmVyUmVmKGJ1ZmZlcikgeworICAgIHNldFJhbmdlKDAsIGJ1ZmZlciA/IDEgOiAwKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBEdW1teUNvbnRhaW5lckJ1ZmZlcjo6YXNDMkJ1ZmZlcigpIHsKKyAgICByZXR1cm4gc3RkOjptb3ZlKG1CdWZmZXJSZWYpOworfQorCitib29sIER1bW15Q29udGFpbmVyQnVmZmVyOjpjYW5Db3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJikgY29uc3QgeworICAgIHJldHVybiAhbUJ1ZmZlclJlZjsKK30KKworYm9vbCBEdW1teUNvbnRhaW5lckJ1ZmZlcjo6Y29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBtQnVmZmVyUmVmID0gYnVmZmVyOworICAgIHNldFJhbmdlKDAsIG1CdWZmZXJSZWYgPyAxIDogMCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIExpbmVhckJsb2NrQnVmZmVyCisKKy8vIHN0YXRpYworc3A8TGluZWFyQmxvY2tCdWZmZXI+IExpbmVhckJsb2NrQnVmZmVyOjpBbGxvY2F0ZSgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2spIHsKKyAgICBDMldyaXRlVmlldyB3cml0ZVZpZXcoYmxvY2stPm1hcCgpLmdldCgpKTsKKyAgICBpZiAod3JpdGVWaWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBuZXcgTGluZWFyQmxvY2tCdWZmZXIoZm9ybWF0LCBzdGQ6Om1vdmUod3JpdGVWaWV3KSwgYmxvY2spOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IExpbmVhckJsb2NrQnVmZmVyOjphc0MyQnVmZmVyKCkgeworICAgIHJldHVybiBDMkJ1ZmZlcjo6Q3JlYXRlTGluZWFyQnVmZmVyKG1CbG9jay0+c2hhcmUob2Zmc2V0KCksIHNpemUoKSwgQzJGZW5jZSgpKSk7Cit9CisKK2Jvb2wgTGluZWFyQmxvY2tCdWZmZXI6OmNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCB7CisgICAgcmV0dXJuIGNhbkNvcHlMaW5lYXIoYnVmZmVyKTsKK30KKworYm9vbCBMaW5lYXJCbG9ja0J1ZmZlcjo6Y29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICByZXR1cm4gY29weUxpbmVhcihidWZmZXIpOworfQorCitMaW5lYXJCbG9ja0J1ZmZlcjo6TGluZWFyQmxvY2tCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBDMldyaXRlVmlldyYmIHdyaXRlVmlldywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jaykKKyAgICA6IENvZGVjMkJ1ZmZlcihmb3JtYXQsIG5ldyBBQnVmZmVyKHdyaXRlVmlldy5kYXRhKCksIHdyaXRlVmlldy5zaXplKCkpKSwKKyAgICAgIG1Xcml0ZVZpZXcod3JpdGVWaWV3KSwKKyAgICAgIG1CbG9jayhibG9jaykgeworfQorCisvLyBDb25zdExpbmVhckJsb2NrQnVmZmVyCisKKy8vIHN0YXRpYworc3A8Q29uc3RMaW5lYXJCbG9ja0J1ZmZlcj4gQ29uc3RMaW5lYXJCbG9ja0J1ZmZlcjo6QWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBpZiAoIWJ1ZmZlcgorICAgICAgICAgICAgfHwgYnVmZmVyLT5kYXRhKCkudHlwZSgpICE9IEMyQnVmZmVyRGF0YTo6TElORUFSCisgICAgICAgICAgICB8fCBidWZmZXItPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5zaXplKCkgIT0gMXUpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIEMyUmVhZFZpZXcgcmVhZFZpZXcoYnVmZmVyLT5kYXRhKCkubGluZWFyQmxvY2tzKClbMF0ubWFwKCkuZ2V0KCkpOworICAgIGlmIChyZWFkVmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gbmV3IENvbnN0TGluZWFyQmxvY2tCdWZmZXIoZm9ybWF0LCBzdGQ6Om1vdmUocmVhZFZpZXcpLCBidWZmZXIpOworfQorCitDb25zdExpbmVhckJsb2NrQnVmZmVyOjpDb25zdExpbmVhckJsb2NrQnVmZmVyKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgQzJSZWFkVmlldyYmIHJlYWRWaWV3LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpCisgICAgOiBDb2RlYzJCdWZmZXIoZm9ybWF0LCBuZXcgQUJ1ZmZlcigKKyAgICAgICAgICAgIC8vIE5PVEU6IEFCdWZmZXIgb25seSB0YWtlcyBub24tY29uc3QgcG9pbnRlciBidXQgdGhpcyBkYXRhIGlzCisgICAgICAgICAgICAvLyAgICAgICBzdXBwb3NlZCB0byBiZSByZWFkLW9ubHkuCisgICAgICAgICAgICBjb25zdF9jYXN0PHVpbnQ4X3QgKj4ocmVhZFZpZXcuZGF0YSgpKSwgcmVhZFZpZXcuY2FwYWNpdHkoKSkpLAorICAgICAgbVJlYWRWaWV3KHJlYWRWaWV3KSwKKyAgICAgIG1CdWZmZXJSZWYoYnVmZmVyKSB7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gQ29uc3RMaW5lYXJCbG9ja0J1ZmZlcjo6YXNDMkJ1ZmZlcigpIHsKKyAgICByZXR1cm4gc3RkOjptb3ZlKG1CdWZmZXJSZWYpOworfQorCisvLyBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyCisKK25hbWVzcGFjZSB7CisKK2NsYXNzIEdyYXBoaWNWaWV3Mk1lZGlhSW1hZ2VDb252ZXJ0ZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBDMkdyYXBoaWNWaWV3IDw9PiBNZWRpYUltYWdlIGNvbnZlcnRlcgorICAgICAqCisgICAgICogXHBhcmFtIHZpZXcgQzJHcmFwaGljVmlldyBvYmplY3QKKyAgICAgKiBccGFyYW0gY29sb3JGb3JtYXQgZGVzaXJlZCBTREsgY29sb3IgZm9ybWF0IGZvciB0aGUgTWVkaWFJbWFnZSAoaWYgdGhpcyBpcyBhIGZsZXhpYmxlIGZvcm1hdCwKKyAgICAgKiAgICAgICAgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHNpbXBseSByZXByZXNlbnQgdGhlIGdyYXBoaWMgdmlldyBhcyBhIGZsZXhpYmxlIFNESyBmb3JtYXQKKyAgICAgKiAgICAgICAgd2l0aG91dCBhIG1lbWNweSkKKyAgICAgKiBccGFyYW0gY29weSB3aGV0aGVyIHRoZSBjb252ZXJ0ZXIgaXMgdXNlZCBmb3IgY29weSBvciBub3QKKyAgICAgKi8KKyAgICBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyKAorICAgICAgICAgICAgY29uc3QgQzJHcmFwaGljVmlldyAmdmlldywgaW50MzJfdCBjb2xvckZvcm1hdCwgYm9vbCBjb3B5KQorICAgICAgICA6IG1Jbml0Q2hlY2soTk9fSU5JVCksCisgICAgICAgICAgbVZpZXcodmlldyksCisgICAgICAgICAgbVdpZHRoKHZpZXcud2lkdGgoKSksCisgICAgICAgICAgbUhlaWdodCh2aWV3LmhlaWdodCgpKSwKKyAgICAgICAgICBtQ29sb3JGb3JtYXQoY29sb3JGb3JtYXQpLAorICAgICAgICAgIG1BbGxvY2F0ZWREZXB0aCgwKSwKKyAgICAgICAgICBtQmFja0J1ZmZlclNpemUoMCksCisgICAgICAgICAgbU1lZGlhSW1hZ2UobmV3IEFCdWZmZXIoc2l6ZW9mKE1lZGlhSW1hZ2UyKSkpIHsKKyAgICAgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlcjogdmlldy5lcnJvcigpID0gJWQiLCB2aWV3LmVycm9yKCkpOworICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBNZWRpYUltYWdlMiAqbWVkaWFJbWFnZSA9IChNZWRpYUltYWdlMiAqKW1NZWRpYUltYWdlLT5iYXNlKCk7CisgICAgICAgIGNvbnN0IEMyUGxhbmFyTGF5b3V0ICZsYXlvdXQgPSB2aWV3LmxheW91dCgpOworICAgICAgICBpZiAobGF5b3V0Lm51bVBsYW5lcyA9PSAwKSB7CisgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiAwIHBsYW5lcyIpOworICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtZW1zZXQobWVkaWFJbWFnZSwgMCwgc2l6ZW9mKCptZWRpYUltYWdlKSk7CisgICAgICAgIG1BbGxvY2F0ZWREZXB0aCA9IGxheW91dC5wbGFuZXNbMF0uYWxsb2NhdGVkRGVwdGg7CisgICAgICAgIHVpbnQzMl90IGJpdERlcHRoID0gbGF5b3V0LnBsYW5lc1swXS5iaXREZXB0aDsKKworICAgICAgICAvLyBhbGlnbiB3aWR0aCBhbmQgaGVpZ2h0IHRvIHN1cHBvcnQgc3Vic2FtcGxpbmcgY2xlYW5seQorICAgICAgICB1aW50MzJfdCBzdHJpZGUgPSBhbGlnbih2aWV3LmNyb3AoKS53aWR0aCwgMikgKiBkaXZVcChsYXlvdXQucGxhbmVzWzBdLmFsbG9jYXRlZERlcHRoLCA4dSk7CisgICAgICAgIHVpbnQzMl90IHZTdHJpZGUgPSBhbGlnbih2aWV3LmNyb3AoKS5oZWlnaHQsIDIpOworCisgICAgICAgIHN3aXRjaCAobGF5b3V0LnR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWOgorICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1UeXBlID0gTWVkaWFJbWFnZTI6Ok1FRElBX0lNQUdFX1RZUEVfWVVWOworICAgICAgICAgICAgICAgIGlmIChsYXlvdXQubnVtUGxhbmVzICE9IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlcjogJWQgcGxhbmVzIGZvciBZVVYgbGF5b3V0IiwgbGF5b3V0Lm51bVBsYW5lcyk7CisgICAgICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxheW91dC5wbGFuZXNbMF0uY2hhbm5lbCAhPSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9ZCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBsYXlvdXQucGxhbmVzWzFdLmNoYW5uZWwgIT0gQzJQbGFuZUluZm86OkNIQU5ORUxfQ0IKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxheW91dC5wbGFuZXNbMl0uY2hhbm5lbCAhPSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DUgorICAgICAgICAgICAgICAgICAgICAgICAgfHwgbGF5b3V0LnBsYW5lc1swXS5jb2xTYW1wbGluZyAhPSAxCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBsYXlvdXQucGxhbmVzWzBdLnJvd1NhbXBsaW5nICE9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxheW91dC5wbGFuZXNbMV0uY29sU2FtcGxpbmcgIT0gMgorICAgICAgICAgICAgICAgICAgICAgICAgfHwgbGF5b3V0LnBsYW5lc1sxXS5yb3dTYW1wbGluZyAhPSAyCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBsYXlvdXQucGxhbmVzWzJdLmNvbFNhbXBsaW5nICE9IDIKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxheW91dC5wbGFuZXNbMl0ucm93U2FtcGxpbmcgIT0gMikgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiBub3QgWVVWNDIwIGZvciBZVVYgbGF5b3V0Iik7CisgICAgICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3dpdGNoIChtQ29sb3JGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29weSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyeSB0byBtYXAgZGlyZWN0bHkuIGNoZWNrIGlmIHRoZSBwbGFuZXMgYXJlIG5lYXIgb25lIGFub3RoZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICptaW5QdHIgPSBtVmlldy5kYXRhKClbMF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbWF4UHRyID0gbVZpZXcuZGF0YSgpWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGxhbmVTaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbGF5b3V0Lm51bVBsYW5lczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUGxhbmVJbmZvICZwbGFuZSA9IGxheW91dC5wbGFuZXNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgbWluT2Zmc2V0ID0gcGxhbmUubWluT2Zmc2V0KG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgbWF4T2Zmc2V0ID0gcGxhbmUubWF4T2Zmc2V0KG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaW5QdHIgPiBtVmlldy5kYXRhKClbaV0gKyBtaW5PZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblB0ciA9IG1WaWV3LmRhdGEoKVtpXSArIG1pbk9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF4UHRyIDwgbVZpZXcuZGF0YSgpW2ldICsgbWF4T2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhQdHIgPSBtVmlldy5kYXRhKClbaV0gKyBtYXhPZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVTaXplICs9IHN0ZDo6YWJzKHBsYW5lLnJvd0luYykgKiBhbGlnbihtSGVpZ2h0LCA2NCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIHBsYW5lLnJvd1NhbXBsaW5nIC8gcGxhbmUuY29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGRpdlVwKG1BbGxvY2F0ZWREZXB0aCwgOHUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobWF4UHRyIC0gbWluUHRyICsgMSkgPD0gcGxhbmVTaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB0aGlzIGlzIHJpc2t5IGFzIHJlYWRpbmcvd3JpdGluZyBkYXRhIG91dCBvZiBib3VuZCByZXN1bHRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICBpbiBhbiB1bmRlZmluZWQgYmVoYXZpb3IsIGJ1dCBncmFsbG9jIGRvZXMgYXNzdW1lIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIGNvbnRpZ3VvdXMgbWFwcGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbGF5b3V0Lm51bVBsYW5lczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlBsYW5lSW5mbyAmcGxhbmUgPSBsYXlvdXQucGxhbmVzW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW2ldLm1PZmZzZXQgPSBtVmlldy5kYXRhKClbaV0gLSBtaW5QdHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbaV0ubUNvbEluYyA9IHBsYW5lLmNvbEluYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVtpXS5tUm93SW5jID0gcGxhbmUucm93SW5jOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW2ldLm1Ib3JpelN1YnNhbXBsaW5nID0gcGxhbmUuY29sU2FtcGxpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbaV0ubVZlcnRTdWJzYW1wbGluZyA9IHBsYW5lLnJvd1NhbXBsaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XcmFwcGVkID0gbmV3IEFCdWZmZXIoY29uc3RfY2FzdDx1aW50OF90ICo+KG1pblB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UHRyIC0gbWluUHRyICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubU9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubUNvbEluYyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubVJvd0luYyA9IHN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5ZXS5tSG9yaXpTdWJzYW1wbGluZyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubVZlcnRTdWJzYW1wbGluZyA9IDE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tT2Zmc2V0ID0gc3RyaWRlICogdlN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tQ29sSW5jID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tUm93SW5jID0gc3RyaWRlIC8gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tSG9yaXpTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubVZlcnRTdWJzYW1wbGluZyA9IDI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tT2Zmc2V0ID0gc3RyaWRlICogdlN0cmlkZSAqIDUgLyA0OworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1Db2xJbmMgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1Sb3dJbmMgPSBzdHJpZGUgLyAyOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1Ib3JpelN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tVmVydFN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1PZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1Db2xJbmMgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1Sb3dJbmMgPSBzdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubUhvcml6U3Vic2FtcGxpbmcgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1WZXJ0U3Vic2FtcGxpbmcgPSAxOworCisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubU9mZnNldCA9IHN0cmlkZSAqIHZTdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubUNvbEluYyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubVJvd0luYyA9IHN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tSG9yaXpTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubVZlcnRTdWJzYW1wbGluZyA9IDI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tT2Zmc2V0ID0gc3RyaWRlICogdlN0cmlkZSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubUNvbEluYyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubVJvd0luYyA9IHN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tSG9yaXpTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubVZlcnRTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlcjogaW5jb21wYWN0aWJsZSBjb2xvciBmb3JtYXQgKCVkKSBmb3IgWVVWIGxheW91dCIsIG1Db2xvckZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWQToKKyAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1lVVkE7CisgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhbiBTREsgWVVWQSBmb3JtYXQKKyAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiBpbmNvbXBhY3RpYmxlIGNvbG9yIGZvcm1hdCAoJWQpIGZvciBZVVZBIGxheW91dCIsIG1Db2xvckZvcm1hdCk7CisgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQjoKKyAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1JHQjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1Db2xvckZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIG1lZGlhIGltYWdlCisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0UkdCRmxleGlibGU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MjRiaXRCR1I4ODg6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MjRiaXRSR0I4ODg6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXI6IGluY29tcGFjdGlibGUgY29sb3IgZm9ybWF0ICglZCkgZm9yIFJHQiBsYXlvdXQiLCBtQ29sb3JGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxheW91dC5udW1QbGFuZXMgIT0gMykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiAlZCBwbGFuZXMgZm9yIFJHQiBsYXlvdXQiLCBsYXlvdXQubnVtUGxhbmVzKTsKKyAgICAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCQToKKyAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1JHQkE7CisgICAgICAgICAgICAgICAgc3dpdGNoIChtQ29sb3JGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBtZWRpYSBpbWFnZQorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFJHQkFGbGV4aWJsZToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQzMmJpdEFCR1I4ODg4OgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDMyYml0QVJHQjg4ODg6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4ODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkluY29tcGFjdGlibGUgY29sb3IgZm9ybWF0ICglZCkgZm9yIFJHQkEgbGF5b3V0IiwgbUNvbG9yRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsYXlvdXQubnVtUGxhbmVzICE9IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlcjogJWQgcGxhbmVzIGZvciBSR0JBIGxheW91dCIsIGxheW91dC5udW1QbGFuZXMpOworICAgICAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1VOS05PV047CisgICAgICAgICAgICAgICAgQUxPR0QoIlVua25vd24gbGF5b3V0Iik7CisgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbWVkaWFJbWFnZS0+bU51bVBsYW5lcyA9IGxheW91dC5udW1QbGFuZXM7CisgICAgICAgIG1lZGlhSW1hZ2UtPm1XaWR0aCA9IHZpZXcuY3JvcCgpLndpZHRoOworICAgICAgICBtZWRpYUltYWdlLT5tSGVpZ2h0ID0gdmlldy5jcm9wKCkuaGVpZ2h0OworICAgICAgICBtZWRpYUltYWdlLT5tQml0RGVwdGggPSBiaXREZXB0aDsKKyAgICAgICAgbWVkaWFJbWFnZS0+bUJpdERlcHRoQWxsb2NhdGVkID0gbUFsbG9jYXRlZERlcHRoOworCisgICAgICAgIHVpbnQzMl90IGJ1ZmZlclNpemUgPSAwOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbGF5b3V0Lm51bVBsYW5lczsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBDMlBsYW5lSW5mbyAmcGxhbmUgPSBsYXlvdXQucGxhbmVzW2ldOworICAgICAgICAgICAgaWYgKHBsYW5lLmFsbG9jYXRlZERlcHRoIDwgcGxhbmUuYml0RGVwdGgKKyAgICAgICAgICAgICAgICAgICAgfHwgcGxhbmUucmlnaHRTaGlmdCAhPSBwbGFuZS5hbGxvY2F0ZWREZXB0aCAtIHBsYW5lLmJpdERlcHRoKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoInJpZ2h0U2hpZnQgdmFsdWUgb2YgJXUgdW5zdXBwb3J0ZWQiLCBwbGFuZS5yaWdodFNoaWZ0KTsKKyAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwbGFuZS5hbGxvY2F0ZWREZXB0aCA+IDggJiYgcGxhbmUuZW5kaWFubmVzcyAhPSBDMlBsYW5lSW5mbzo6TkFUSVZFKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImVuZGlhbm5lc3MgdmFsdWUgb2YgJXUgdW5zdXBwb3J0ZWQiLCBwbGFuZS5lbmRpYW5uZXNzKTsKKyAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwbGFuZS5hbGxvY2F0ZWREZXB0aCAhPSBtQWxsb2NhdGVkRGVwdGggfHwgcGxhbmUuYml0RGVwdGggIT0gYml0RGVwdGgpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiZGlmZmVyZW50IGFsbG9jYXRlZERlcHRoL2JpdERlcHRoIHBlciBwbGFuZSB1bnN1cHBvcnRlZCIpOworICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZmVyU2l6ZSArPSBzdHJpZGUgKiB2U3RyaWRlCisgICAgICAgICAgICAgICAgICAgIC8gcGxhbmUucm93U2FtcGxpbmcgLyBwbGFuZS5jb2xTYW1wbGluZzsKKyAgICAgICAgfQorCisgICAgICAgIG1CYWNrQnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemU7CisgICAgICAgIG1Jbml0Q2hlY2sgPSBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdCB7IHJldHVybiBtSW5pdENoZWNrOyB9CisKKyAgICB1aW50MzJfdCBiYWNrQnVmZmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1CYWNrQnVmZmVyU2l6ZTsgfQorCisgICAgLyoqCisgICAgICogV3JhcCBDMkdyYXBoaWNWaWV3IHVzaW5nIGEgTWVkaWFJbWFnZTIuIE5vdGUgdGhhdCBpZiBub3Qgd3JhcHBlZCwgdGhlIGNvbnRlbnQgaXMgbm90IG1hcHBlZAorICAgICAqIGluIHRoaXMgZnVuY3Rpb24gLS0tIHRoZSBjYWxsZXIgc2hvdWxkIHVzZSBDb3B5R3JhcGhpY1ZpZXcyTWVkaWFJbWFnZSgpIGZ1bmN0aW9uIHRvIGNvcHkgdGhlCisgICAgICogZGF0YSBpbnRvIGEgYmFja2luZyBidWZmZXIgZXhwbGljaXRseS4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gbWVkaWEgYnVmZmVyLiBUaGlzIGlzIG51bGwgaWYgd3JhcHBpbmcgZmFpbGVkLgorICAgICAqLworICAgIHNwPEFCdWZmZXI+IHdyYXAoKSBjb25zdCB7CisgICAgICAgIGlmIChtQmFja0J1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbVdyYXBwZWQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgYm9vbCBzZXRCYWNrQnVmZmVyKGNvbnN0IHNwPEFCdWZmZXI+ICZiYWNrQnVmZmVyKSB7CisgICAgICAgIGlmIChiYWNrQnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYmFja0J1ZmZlci0+Y2FwYWNpdHkoKSA8IG1CYWNrQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGJhY2tCdWZmZXItPnNldFJhbmdlKDAsIG1CYWNrQnVmZmVyU2l6ZSk7CisgICAgICAgIG1CYWNrQnVmZmVyID0gYmFja0J1ZmZlcjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29weSBDMkdyYXBoaWNWaWV3IHRvIE1lZGlhSW1hZ2UyLgorICAgICAqLworICAgIHN0YXR1c190IGNvcHlUb01lZGlhSW1hZ2UoKSB7CisgICAgICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gSW1hZ2VDb3B5KG1CYWNrQnVmZmVyLT5iYXNlKCksIGdldE1lZGlhSW1hZ2UoKSwgbVZpZXcpOworICAgIH0KKworICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZpbWFnZURhdGEoKSBjb25zdCB7IHJldHVybiBtTWVkaWFJbWFnZTsgfQorCitwcml2YXRlOgorICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CisKKyAgICBjb25zdCBDMkdyYXBoaWNWaWV3IG1WaWV3OworICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIGludDMyX3QgbUNvbG9yRm9ybWF0OyAgLy8vPCBTREsgY29sb3IgZm9ybWF0IGZvciBNZWRpYUltYWdlCisgICAgc3A8QUJ1ZmZlcj4gbVdyYXBwZWQ7ICAvLy88IHdyYXBwZWQgYnVmZmVyIChpZiB3ZSBjYW4gbWFwIEMyQnVmZmVyIHRvIGFuIEFCdWZmZXIpCisgICAgdWludDMyX3QgbUFsbG9jYXRlZERlcHRoOworICAgIHVpbnQzMl90IG1CYWNrQnVmZmVyU2l6ZTsKKyAgICBzcDxBQnVmZmVyPiBtTWVkaWFJbWFnZTsKKyAgICBzdGQ6OmZ1bmN0aW9uPHNwPEFCdWZmZXI+KHNpemVfdCk+IG1BbGxvYzsKKworICAgIHNwPEFCdWZmZXI+IG1CYWNrQnVmZmVyOyAgICAvLy88IGJhY2tpbmcgYnVmZmVyIGlmIHdlIGhhdmUgdG8gY29weSBDMkJ1ZmZlciA8PT4gQUJ1ZmZlcgorCisgICAgTWVkaWFJbWFnZTIgKmdldE1lZGlhSW1hZ2UoKSB7CisgICAgICAgIHJldHVybiAoTWVkaWFJbWFnZTIgKiltTWVkaWFJbWFnZS0+YmFzZSgpOworICAgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBHcmFwaGljQmxvY2tCdWZmZXIKKworLy8gc3RhdGljCitzcDxHcmFwaGljQmxvY2tCdWZmZXI+IEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaywKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxBQnVmZmVyPihzaXplX3QpPiBhbGxvYykgeworICAgIEMyR3JhcGhpY1ZpZXcgdmlldyhibG9jay0+bWFwKCkuZ2V0KCkpOworICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoIkMyR3JhcGhpY0Jsb2NrOjptYXAgZmFpbGVkOiAlZCIsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGludDMyX3QgY29sb3JGb3JtYXQgPSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKKyAgICAodm9pZClmb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0KTsKKworICAgIEdyYXBoaWNWaWV3Mk1lZGlhSW1hZ2VDb252ZXJ0ZXIgY29udmVydGVyKHZpZXcsIGNvbG9yRm9ybWF0LCBmYWxzZSAvKiBjb3B5ICovKTsKKyAgICBpZiAoY29udmVydGVyLmluaXRDaGVjaygpICE9IE9LKSB7CisgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXIgaW5pdCBmYWlsZWQ6ICVkIiwgY29udmVydGVyLmluaXRDaGVjaygpKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGJvb2wgd3JhcHBlZCA9IHRydWU7CisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gY29udmVydGVyLndyYXAoKTsKKyAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgYnVmZmVyID0gYWxsb2MoY29udmVydGVyLmJhY2tCdWZmZXJTaXplKCkpOworICAgICAgICBpZiAoIWNvbnZlcnRlci5zZXRCYWNrQnVmZmVyKGJ1ZmZlcikpIHsKKyAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXIgZmFpbGVkIHRvIHNldCBiYWNrIGJ1ZmZlciIpOworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgd3JhcHBlZCA9IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gbmV3IEdyYXBoaWNCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgIHN0ZDo6bW92ZSh2aWV3KSwKKyAgICAgICAgICAgIGJsb2NrLAorICAgICAgICAgICAgY29udmVydGVyLmltYWdlRGF0YSgpLAorICAgICAgICAgICAgd3JhcHBlZCk7Cit9CisKK0dyYXBoaWNCbG9ja0J1ZmZlcjo6R3JhcGhpY0Jsb2NrQnVmZmVyKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgQzJHcmFwaGljVmlldyAmJnZpZXcsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrLAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmaW1hZ2VEYXRhLAorICAgICAgICBib29sIHdyYXBwZWQpCisgICAgOiBDb2RlYzJCdWZmZXIoZm9ybWF0LCBidWZmZXIpLAorICAgICAgbVZpZXcodmlldyksCisgICAgICBtQmxvY2soYmxvY2spLAorICAgICAgbVdyYXBwZWQod3JhcHBlZCkgeworICAgIHNldEltYWdlRGF0YShpbWFnZURhdGEpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IEdyYXBoaWNCbG9ja0J1ZmZlcjo6YXNDMkJ1ZmZlcigpIHsKKyAgICB1aW50MzJfdCB3aWR0aCA9IG1WaWV3LndpZHRoKCk7CisgICAgdWludDMyX3QgaGVpZ2h0ID0gbVZpZXcuaGVpZ2h0KCk7CisgICAgaWYgKCFtV3JhcHBlZCkgeworICAgICAgICAodm9pZClJbWFnZUNvcHkobVZpZXcsIGJhc2UoKSwgaW1hZ2VEYXRhKCkpOworICAgIH0KKyAgICByZXR1cm4gQzJCdWZmZXI6OkNyZWF0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICBtQmxvY2stPnNoYXJlKEMyUmVjdCh3aWR0aCwgaGVpZ2h0KSwgQzJGZW5jZSgpKSk7Cit9CisKKy8vIEdyYXBoaWNNZXRhZGF0YUJ1ZmZlcgorR3JhcGhpY01ldGFkYXRhQnVmZmVyOjpHcmFwaGljTWV0YWRhdGFCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvYykKKyAgICA6IENvZGVjMkJ1ZmZlcihmb3JtYXQsIG5ldyBBQnVmZmVyKHNpemVvZihWaWRlb05hdGl2ZU1ldGFkYXRhKSkpLAorICAgICAgbUFsbG9jKGFsbG9jKSB7CisgICAgKChWaWRlb05hdGl2ZU1ldGFkYXRhICopYmFzZSgpKS0+cEJ1ZmZlciA9IG51bGxwdHI7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gR3JhcGhpY01ldGFkYXRhQnVmZmVyOjphc0MyQnVmZmVyKCkgeworI2lmbmRlZiBfX0xQNjRfXworICAgIFZpZGVvTmF0aXZlTWV0YWRhdGEgKm1ldGEgPSAoVmlkZW9OYXRpdmVNZXRhZGF0YSAqKWJhc2UoKTsKKyAgICBBTmF0aXZlV2luZG93QnVmZmVyICpidWZmZXIgPSAoQU5hdGl2ZVdpbmRvd0J1ZmZlciAqKW1ldGEtPnBCdWZmZXI7CisgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJWaWRlb05hdGl2ZU1ldGFkYXRhIGNvbnRhaW5zIG51bGwgYnVmZmVyIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIEFMT0dWKCJWaWRlb05hdGl2ZU1ldGFkYXRhOiAlZHglZCIsIGJ1ZmZlci0+d2lkdGgsIGJ1ZmZlci0+aGVpZ2h0KTsKKyAgICBDMkhhbmRsZSAqaGFuZGxlID0gV3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoCisgICAgICAgICAgICBidWZmZXItPmhhbmRsZSwKKyAgICAgICAgICAgIGJ1ZmZlci0+d2lkdGgsCisgICAgICAgICAgICBidWZmZXItPmhlaWdodCwKKyAgICAgICAgICAgIGJ1ZmZlci0+Zm9ybWF0LAorICAgICAgICAgICAgYnVmZmVyLT51c2FnZSwKKyAgICAgICAgICAgIGJ1ZmZlci0+c3RyaWRlKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jLT5wcmlvckdyYXBoaWNBbGxvY2F0aW9uKGhhbmRsZSwgJmFsbG9jKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gd3JhcCBWaWRlb05hdGl2ZU1ldGFkYXRhIGludG8gQzJHcmFwaGljQWxsb2NhdGlvbiIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jKTsKKworICAgIG1ldGEtPnBCdWZmZXIgPSAwOworICAgIC8vIFRPRE86IGZlbmNlCisgICAgcmV0dXJuIEMyQnVmZmVyOjpDcmVhdGVHcmFwaGljQnVmZmVyKAorICAgICAgICAgICAgYmxvY2stPnNoYXJlKEMyUmVjdChidWZmZXItPndpZHRoLCBidWZmZXItPmhlaWdodCksIEMyRmVuY2UoKSkpOworI2Vsc2UKKyAgICBBTE9HRSgiR3JhcGhpY01ldGFkYXRhQnVmZmVyIGRvZXMgbm90IHdvcmsgb24gNjQtYml0IGFyY2giKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyNlbmRpZgorfQorCisvLyBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcgorCisvLyBzdGF0aWMKK3NwPENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyPiBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3A8QUJ1ZmZlcj4oc2l6ZV90KT4gYWxsb2MpIHsKKyAgICBpZiAoIWJ1ZmZlcgorICAgICAgICAgICAgfHwgYnVmZmVyLT5kYXRhKCkudHlwZSgpICE9IEMyQnVmZmVyRGF0YTo6R1JBUEhJQworICAgICAgICAgICAgfHwgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLnNpemUoKSAhPSAxdSkgeworICAgICAgICBBTE9HRCgiQzJCdWZmZXIgcHJlY29uZCBmYWlsIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJHcmFwaGljVmlldz4gdmlldyhzdGQ6Om1ha2VfdW5pcXVlPGNvbnN0IEMyR3JhcGhpY1ZpZXc+KAorICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpWzBdLm1hcCgpLmdldCgpKSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IGhvbGRlcjsKKworICAgIGludDMyX3QgY29sb3JGb3JtYXQgPSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKKyAgICAodm9pZClmb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0KTsKKworICAgIEdyYXBoaWNWaWV3Mk1lZGlhSW1hZ2VDb252ZXJ0ZXIgY29udmVydGVyKCp2aWV3LCBjb2xvckZvcm1hdCwgZmFsc2UgLyogY29weSAqLyk7CisgICAgaWYgKGNvbnZlcnRlci5pbml0Q2hlY2soKSAhPSBPSykgeworICAgICAgICBBTE9HRCgiQ29udmVydGVyIGluaXQgZmFpbGVkOiAlZCIsIGNvbnZlcnRlci5pbml0Q2hlY2soKSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBib29sIHdyYXBwZWQgPSB0cnVlOworICAgIHNwPEFCdWZmZXI+IGFCdWZmZXIgPSBjb252ZXJ0ZXIud3JhcCgpOworICAgIGlmIChhQnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgYUJ1ZmZlciA9IGFsbG9jKGNvbnZlcnRlci5iYWNrQnVmZmVyU2l6ZSgpKTsKKyAgICAgICAgaWYgKCFjb252ZXJ0ZXIuc2V0QmFja0J1ZmZlcihhQnVmZmVyKSkgeworICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlciBmYWlsZWQgdG8gc2V0IGJhY2sgYnVmZmVyIik7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICB3cmFwcGVkID0gZmFsc2U7CisgICAgICAgIGNvbnZlcnRlci5jb3B5VG9NZWRpYUltYWdlKCk7CisgICAgICAgIC8vIFdlIGRvbid0IG5lZWQgdGhlIHZpZXcuCisgICAgICAgIGhvbGRlciA9IHN0ZDo6bW92ZSh2aWV3KTsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgIGFCdWZmZXIsCisgICAgICAgICAgICBzdGQ6Om1vdmUodmlldyksCisgICAgICAgICAgICBidWZmZXIsCisgICAgICAgICAgICBjb252ZXJ0ZXIuaW1hZ2VEYXRhKCksCisgICAgICAgICAgICB3cmFwcGVkKTsKK30KKworLy8gc3RhdGljCitzcDxDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcj4gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlRW1wdHkoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPEFCdWZmZXI+KHNpemVfdCk+IGFsbG9jKSB7CisgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKQorICAgICAgICAgICAgfHwgIWZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgeworICAgICAgICBBTE9HRCgiZm9ybWF0IGhhZCBubyB3aWR0aCAvIGhlaWdodCIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgLy8gTk9URTogd2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCBZVVY0MjAgZm9ybWF0cyBmb3IgYnl0ZS1idWZmZXIgbW9kZS4KKyAgICBzcDxBQnVmZmVyPiBhQnVmZmVyKGFsbG9jKGFsaWduKHdpZHRoLCAxNikgKiBhbGlnbihoZWlnaHQsIDE2KSAqIDMgLyAyKSk7CisgICAgcmV0dXJuIG5ldyBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgIGFCdWZmZXIsCisgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICBmYWxzZSk7Cit9CisKK0NvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcigKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZhQnVmZmVyLAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJHcmFwaGljVmlldz4gJiZ2aWV3LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIsCisgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZpbWFnZURhdGEsCisgICAgICAgIGJvb2wgd3JhcHBlZCkKKyAgICA6IENvZGVjMkJ1ZmZlcihmb3JtYXQsIGFCdWZmZXIpLAorICAgICAgbVZpZXcoc3RkOjptb3ZlKHZpZXcpKSwKKyAgICAgIG1CdWZmZXJSZWYoYnVmZmVyKSwKKyAgICAgIG1XcmFwcGVkKHdyYXBwZWQpIHsKKyAgICBzZXRJbWFnZURhdGEoaW1hZ2VEYXRhKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6YXNDMkJ1ZmZlcigpIHsKKyAgICBtVmlldy5yZXNldCgpOworICAgIHJldHVybiBzdGQ6Om1vdmUobUJ1ZmZlclJlZik7Cit9CisKK2Jvb2wgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCB7CisgICAgaWYgKG1XcmFwcGVkIHx8IG1CdWZmZXJSZWYpIHsKKyAgICAgICAgQUxPR0QoIkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpjYW5Db3B5OiAlc3dyYXBwZWQgOyBidWZmZXIgcmVmICVzIiwKKyAgICAgICAgICAgICAgICBtV3JhcHBlZCA/ICIiIDogIm5vdCAiLCBtQnVmZmVyUmVmID8gImV4aXN0cyIgOiAiZG9lc24ndCBleGlzdCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghYnVmZmVyKSB7CisgICAgICAgIC8vIE5vdGhpbmcgdG8gY29weSwgc28gd2UgY2FuIGNvcHkgYnkgZG9pbmcgbm90aGluZy4KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChidWZmZXItPmRhdGEoKS50eXBlKCkgIT0gQzJCdWZmZXJEYXRhOjpHUkFQSElDKSB7CisgICAgICAgIEFMT0dEKCJDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6Y2FuQ29weTogYnVmZmVyIHByZWNvbmRpdGlvbiB1bnNhdGlzZmllZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChidWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChidWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuc2l6ZSgpICE9IDF1KSB7CisgICAgICAgIEFMT0dEKCJDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6Y2FuQ29weTogdG9vIG1hbnkgYmxvY2tzIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CisgICAgLy8gRklYTUU6IGZvcm1hdCgpIGlzIG5vdCBjb25zdCwgYnV0IHdlIGNhbm5vdCBjaGFuZ2UgaXQsIHNvIGRvIGEgY29uc3QgY2FzdCBoZXJlCisgICAgY29uc3RfY2FzdDxDb25zdEdyYXBoaWNCbG9ja0J1ZmZlciAqPih0aGlzKS0+Zm9ybWF0KCktPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0KTsKKworICAgIEdyYXBoaWNWaWV3Mk1lZGlhSW1hZ2VDb252ZXJ0ZXIgY29udmVydGVyKAorICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpWzBdLm1hcCgpLmdldCgpLCBjb2xvckZvcm1hdCwgdHJ1ZSAvKiBjb3B5ICovKTsKKyAgICBpZiAoY29udmVydGVyLmluaXRDaGVjaygpICE9IE9LKSB7CisgICAgICAgIEFMT0dEKCJDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6Y2FuQ29weTogY29udmVydGVyIGluaXQgZmFpbGVkOiAlZCIsIGNvbnZlcnRlci5pbml0Q2hlY2soKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGNvbnZlcnRlci5iYWNrQnVmZmVyU2l6ZSgpID4gY2FwYWNpdHkoKSkgeworICAgICAgICBBTE9HRCgiQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNhbkNvcHk6IGluc3VmZmljaWVudCBjYXBhY2l0eTogcmVxICV1IGhhcyAlenUiLAorICAgICAgICAgICAgICAgIGNvbnZlcnRlci5iYWNrQnVmZmVyU2l6ZSgpLCBjYXBhY2l0eSgpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6Y29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBpZiAoIWJ1ZmZlciB8fCBidWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuc2l6ZSgpID09IDApIHsKKyAgICAgICAgc2V0UmFuZ2UoMCwgMCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CisgICAgZm9ybWF0KCktPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0KTsKKworICAgIEdyYXBoaWNWaWV3Mk1lZGlhSW1hZ2VDb252ZXJ0ZXIgY29udmVydGVyKAorICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpWzBdLm1hcCgpLmdldCgpLCBjb2xvckZvcm1hdCwgdHJ1ZSAvKiBjb3B5ICovKTsKKyAgICBpZiAoY29udmVydGVyLmluaXRDaGVjaygpICE9IE9LKSB7CisgICAgICAgIEFMT0dEKCJDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6Y29weTogY29udmVydGVyIGluaXQgZmFpbGVkOiAlZCIsIGNvbnZlcnRlci5pbml0Q2hlY2soKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc3A8QUJ1ZmZlcj4gYUJ1ZmZlciA9IG5ldyBBQnVmZmVyKGJhc2UoKSwgY2FwYWNpdHkoKSk7CisgICAgaWYgKCFjb252ZXJ0ZXIuc2V0QmFja0J1ZmZlcihhQnVmZmVyKSkgeworICAgICAgICBBTE9HRCgiQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNvcHk6IHNldCBiYWNrIGJ1ZmZlciBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzZXRSYW5nZSgwLCBhQnVmZmVyLT5zaXplKCkpOyAgLy8gYWxpZ24gc2l6ZSBpbmZvCisgICAgY29udmVydGVyLmNvcHlUb01lZGlhSW1hZ2UoKTsKKyAgICBzZXRJbWFnZURhdGEoY29udmVydGVyLmltYWdlRGF0YSgpKTsKKyAgICBtQnVmZmVyUmVmID0gYnVmZmVyOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcgorCitFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcjo6RW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrLAorICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiAmbWVtb3J5LAorICAgICAgICBpbnQzMl90IGhlYXBTZXFOdW0pCisgICAgOiBDb2RlYzJCdWZmZXIoZm9ybWF0LCBuZXcgQUJ1ZmZlcihtZW1vcnktPnBvaW50ZXIoKSwgbWVtb3J5LT5zaXplKCkpKSwKKyAgICAgIG1CbG9jayhibG9jayksCisgICAgICBtTWVtb3J5KG1lbW9yeSksCisgICAgICBtSGVhcFNlcU51bShoZWFwU2VxTnVtKSB7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXI6OmFzQzJCdWZmZXIoKSB7CisgICAgcmV0dXJuIEMyQnVmZmVyOjpDcmVhdGVMaW5lYXJCdWZmZXIobUJsb2NrLT5zaGFyZShvZmZzZXQoKSwgc2l6ZSgpLCBDMkZlbmNlKCkpKTsKK30KKwordm9pZCBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcjo6ZmlsbFNvdXJjZUJ1ZmZlcigKKyAgICAgICAgSUNyeXB0bzo6U291cmNlQnVmZmVyICpzb3VyY2UpIHsKKyAgICBzb3VyY2UtPm1TaGFyZWRNZW1vcnkgPSBtTWVtb3J5OworICAgIHNvdXJjZS0+bUhlYXBTZXFOdW0gPSBtSGVhcFNlcU51bTsKK30KKwordm9pZCBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcjo6ZmlsbFNvdXJjZUJ1ZmZlcigKKyAgICAgICAgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpTaGFyZWRCdWZmZXIgKnNvdXJjZSkgeworICAgIHNzaXplX3Qgb2Zmc2V0OworICAgIHNpemVfdCBzaXplOworCisgICAgbUhpZGxNZW1vcnkgPSBoYXJkd2FyZTo6ZnJvbUhlYXAobU1lbW9yeS0+Z2V0TWVtb3J5KCZvZmZzZXQsICZzaXplKSk7CisgICAgc291cmNlLT5oZWFwQmFzZSA9ICptSGlkbE1lbW9yeTsKKyAgICBzb3VyY2UtPm9mZnNldCA9IG9mZnNldDsKKyAgICBzb3VyY2UtPnNpemUgPSBzaXplOworfQorCitib29sIEVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyOjpjb3B5RGVjcnlwdGVkQ29udGVudCgKKyAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4gJmRlY3J5cHRlZCwgc2l6ZV90IGxlbmd0aCkgeworICAgIEMyV3JpdGVWaWV3IHZpZXcgPSBtQmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAodmlldy5zaXplKCkgPCBsZW5ndGgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtZW1jcHkodmlldy5kYXRhKCksIGRlY3J5cHRlZC0+cG9pbnRlcigpLCBsZW5ndGgpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyOjpjb3B5RGVjcnlwdGVkQ29udGVudEZyb21NZW1vcnkoc2l6ZV90IGxlbmd0aCkgeworICAgIHJldHVybiBjb3B5RGVjcnlwdGVkQ29udGVudChtTWVtb3J5LCBsZW5ndGgpOworfQorCituYXRpdmVfaGFuZGxlX3QgKkVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyOjpoYW5kbGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KG1CbG9jay0+aGFuZGxlKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZGNhYjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMyQnVmZmVyLmgKQEAgLTAsMCArMSw0MDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9CVUZGRVJfSF8KKworI2RlZmluZSBDT0RFQzJfQlVGRkVSX0hfCisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvbmF0aXZlLzEuMC90eXBlcy5oPgorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogQ29waWVzIGEgZ3JhcGhpYyB2aWV3IGludG8gYSBtZWRpYSBpbWFnZS4KKyAqCisgKiBccGFyYW0gaW1nQmFzZSBiYXNlIG9mIE1lZGlhSW1hZ2UKKyAqIFxwYXJhbSBpbWcgTWVkaWFJbWFnZSBkYXRhCisgKiBccGFyYW0gdmlldyBncmFwaGljIHZpZXcKKyAqCisgKiBccmV0dXJuIE9LIG9uIHN1Y2Nlc3MKKyAqLworc3RhdHVzX3QgSW1hZ2VDb3B5KHVpbnQ4X3QgKmltZ0Jhc2UsIGNvbnN0IE1lZGlhSW1hZ2UyICppbWcsIGNvbnN0IEMyR3JhcGhpY1ZpZXcgJnZpZXcpOworCisvKioKKyAqIENvcGllcyBhIG1lZGlhIGltYWdlIGludG8gYSBncmFwaGljIHZpZXcuCisgKgorICogXHBhcmFtIHZpZXcgZ3JhcGhpYyB2aWV3CisgKiBccGFyYW0gaW1nQmFzZSBiYXNlIG9mIE1lZGlhSW1hZ2UKKyAqIFxwYXJhbSBpbWcgTWVkaWFJbWFnZSBkYXRhCisgKgorICogXHJldHVybiBPSyBvbiBzdWNjZXNzCisgKi8KK3N0YXR1c190IEltYWdlQ29weShDMkdyYXBoaWNWaWV3ICZ2aWV3LCBjb25zdCB1aW50OF90ICppbWdCYXNlLCBjb25zdCBNZWRpYUltYWdlMiAqaW1nKTsKKworY2xhc3MgQ29kZWMyQnVmZmVyIDogcHVibGljIE1lZGlhQ29kZWNCdWZmZXIgeworcHVibGljOgorICAgIHVzaW5nIE1lZGlhQ29kZWNCdWZmZXI6Ok1lZGlhQ29kZWNCdWZmZXI7CisgICAgfkNvZGVjMkJ1ZmZlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIFxyZXR1cm4gIEMyQnVmZmVyIG9iamVjdCByZXByZXNlbnRzIHRoaXMgYnVmZmVyLgorICAgICAqLworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBhc0MyQnVmZmVyKCkgPSAwOworCisgICAgLyoqCisgICAgICogVGVzdCBpZiB3ZSBjYW4gY29weSB0aGUgY29udGVudCBvZiB8YnVmZmVyfCBpbnRvIHRoaXMgb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtICAgYnVmZmVyICBDMkJ1ZmZlciBvYmplY3QgdG8gY29weS4KKyAgICAgKiBccmV0dXJuICB0cnVlICAgIGlmIHRoZSBjb250ZW50IG9mIGJ1ZmZlciBjYW4gYmUgY29waWVkIG92ZXIgdG8gdGhpcyBidWZmZXIKKyAgICAgKiAgICAgICAgICBmYWxzZSAgIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgY2FuQ29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIGNvbnN0IHsKKyAgICAgICAgKHZvaWQpYnVmZmVyOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29weSB0aGUgY29udGVudCBvZiB8YnVmZmVyfCBpbnRvIHRoaXMgb2JqZWN0LiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQKKyAgICAgKiBjYW5Db3B5KCkgY2hlY2sgYWxyZWFkeSBwYXNzZWQuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBidWZmZXIgIEMyQnVmZmVyIG9iamVjdCB0byBjb3B5LgorICAgICAqIFxyZXR1cm4gIHRydWUgICAgaWYgc3VjY2Vzc2Z1bAorICAgICAqICAgICAgICAgIGZhbHNlICAgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBjb3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgICAgICAodm9pZClidWZmZXI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBnZXRJbWFnZURhdGEoKSBjb25zdCB7IHJldHVybiBtSW1hZ2VEYXRhOyB9CisKK3Byb3RlY3RlZDoKKyAgICAvKioKKyAgICAgKiBjYW5Db3B5KCkgaW1wbGVtZW50YXRpb24gZm9yIGxpbmVhciBidWZmZXJzLgorICAgICAqLworICAgIGJvb2wgY2FuQ29weUxpbmVhcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIGNvbnN0OworCisgICAgLyoqCisgICAgICogY29weSgpIGltcGxlbWVudGF0aW9uIGZvciBsaW5lYXIgYnVmZmVycy4KKyAgICAgKi8KKyAgICBib29sIGNvcHlMaW5lYXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKTsKKworICAgIC8qKgorICAgICAqIHNldHMgTWVkaWFJbWFnZSBkYXRhIGZvciBmbGV4aWJsZSBncmFwaGljIGJ1ZmZlcnMKKyAgICAgKi8KKyAgICB2b2lkIHNldEltYWdlRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmaW1hZ2VEYXRhKTsKKworICAgIHNwPEFCdWZmZXI+IG1JbWFnZURhdGE7Cit9OworCisvKioKKyAqIE1lZGlhQ29kZWNCdWZmZXIgaW1wbGVtZW50YXRpb24gb24gdG9wIG9mIGxvY2FsIGxpbmVhciBidWZmZXIuIFRoaXMgY2Fubm90CisgKiBjcm9zcyBwcm9jZXNzIGJvdW5kYXJ5IHNvIGFzQzJCdWZmZXIoKSByZXR1cm5zIG9ubHkgbnVsbHB0ci4KKyAqLworY2xhc3MgTG9jYWxMaW5lYXJCdWZmZXIgOiBwdWJsaWMgQ29kZWMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICB1c2luZyBDb2RlYzJCdWZmZXI6OkNvZGVjMkJ1ZmZlcjsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpIG92ZXJyaWRlIHsgcmV0dXJuIG51bGxwdHI7IH0KKyAgICBib29sIGNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sIGNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBvdmVycmlkZTsKK307CisKKy8qKgorICogTWVkaWFDb2RlY0J1ZmZlciBpbXBsZW1lbnRhdGlvbiB0byBiZSB1c2VkIG9ubHkgYXMgYSBkdW1teSB3cmFwcGVyIGFyb3VuZCBhCisgKiBDMkJ1ZmZlciBvYmplY3QuCisgKi8KK2NsYXNzIER1bW15Q29udGFpbmVyQnVmZmVyIDogcHVibGljIENvZGVjMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgRHVtbXlDb250YWluZXJCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciA9IG51bGxwdHIpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBhc0MyQnVmZmVyKCkgb3ZlcnJpZGU7CisgICAgYm9vbCBjYW5Db3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbCBjb3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBtQnVmZmVyUmVmOworfTsKKworLyoqCisgKiBNZWRpYUNvZGVjQnVmZmVyIGltcGxlbWVudGF0aW9uIHdyYXBzIGFyb3VuZCBDMkxpbmVhckJsb2NrLgorICovCitjbGFzcyBMaW5lYXJCbG9ja0J1ZmZlciA6IHB1YmxpYyBDb2RlYzJCdWZmZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIEFsbG9jYXRlIGEgbmV3IExpbmVhckJ1ZmZlckJsb2NrIHdyYXBwaW5nIGFyb3VuZCBDMkxpbmVhckJsb2NrIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGZvcm1hdCAgbWFuZGF0b3J5IGJ1ZmZlciBmb3JtYXQgZm9yIE1lZGlhQ29kZWNCdWZmZXIKKyAgICAgKiBccGFyYW0gICBibG9jayAgIEMyTGluZWFyQmxvY2sgb2JqZWN0IHRvIHdyYXAgYXJvdW5kLgorICAgICAqIFxyZXR1cm4gICAgICAgICAgTGluZWFyQmxvY2tCdWZmZXIgb2JqZWN0IHdpdGggd3JpdGFibGUgbWFwcGluZy4KKyAgICAgKiAgICAgICAgICAgICAgICAgIG51bGxwdHIgaWYgdW5zdWNjZXNzZnVsLgorICAgICAqLworICAgIHN0YXRpYyBzcDxMaW5lYXJCbG9ja0J1ZmZlcj4gQWxsb2NhdGUoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jayk7CisKKyAgICB2aXJ0dWFsIH5MaW5lYXJCbG9ja0J1ZmZlcigpID0gZGVmYXVsdDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpIG92ZXJyaWRlOworICAgIGJvb2wgY2FuQ29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIGNvbnN0IG92ZXJyaWRlOworICAgIGJvb2wgY29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIExpbmVhckJsb2NrQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBDMldyaXRlVmlldyAmJndyaXRlVmlldywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2spOworICAgIExpbmVhckJsb2NrQnVmZmVyKCkgPSBkZWxldGU7CisKKyAgICBDMldyaXRlVmlldyBtV3JpdGVWaWV3OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBtQmxvY2s7Cit9OworCisvKioKKyAqIE1lZGlhQ29kZWNCdWZmZXIgaW1wbGVtZW50YXRpb24gd3JhcHMgYXJvdW5kIEMyQ29uc3RMaW5lYXJCbG9jay4KKyAqLworY2xhc3MgQ29uc3RMaW5lYXJCbG9ja0J1ZmZlciA6IHB1YmxpYyBDb2RlYzJCdWZmZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIEFsbG9jYXRlIGEgbmV3IENvbnN0TGluZWFyQmxvY2tCdWZmZXIgd3JhcHBpbmcgYXJvdW5kIEMyQnVmZmVyIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGZvcm1hdCAgbWFuZGF0b3J5IGJ1ZmZlciBmb3JtYXQgZm9yIE1lZGlhQ29kZWNCdWZmZXIKKyAgICAgKiBccGFyYW0gICBidWZmZXIgIGxpbmVhciBDMkJ1ZmZlciBvYmplY3QgdG8gd3JhcCBhcm91bmQuCisgICAgICogXHJldHVybiAgICAgICAgICBDb25zdExpbmVhckJsb2NrQnVmZmVyIG9iamVjdCB3aXRoIHJlYWRhYmxlIG1hcHBpbmcuCisgICAgICogICAgICAgICAgICAgICAgICBudWxscHRyIGlmIHVuc3VjY2Vzc2Z1bC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8Q29uc3RMaW5lYXJCbG9ja0J1ZmZlcj4gQWxsb2NhdGUoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKTsKKworICAgIHZpcnR1YWwgfkNvbnN0TGluZWFyQmxvY2tCdWZmZXIoKSA9IGRlZmF1bHQ7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGFzQzJCdWZmZXIoKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBDb25zdExpbmVhckJsb2NrQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBDMlJlYWRWaWV3ICYmcmVhZFZpZXcsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpOworICAgIENvbnN0TGluZWFyQmxvY2tCdWZmZXIoKSA9IGRlbGV0ZTsKKworICAgIEMyUmVhZFZpZXcgbVJlYWRWaWV3OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gbUJ1ZmZlclJlZjsKK307CisKKy8qKgorICogTWVkaWFDb2RlY0J1ZmZlciBpbXBsZW1lbnRhdGlvbiB3cmFwcyBhcm91bmQgQzJHcmFwaGljQmxvY2suCisgKgorICogVGhpcyBvYmplY3QgZXhwb3NlcyB0aGUgdW5kZXJseWluZyBiaXRzIHZpYSBhY2Nlc3NvciBBUElzIGFuZCAiaW1hZ2UtZGF0YSIKKyAqIG1ldGFkYXRhLCBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYXQgYWxsb2NhdGlvbiB0aW1lLgorICovCitjbGFzcyBHcmFwaGljQmxvY2tCdWZmZXIgOiBwdWJsaWMgQ29kZWMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhIG5ldyBHcmFwaGljQmxvY2tCdWZmZXIgd3JhcHBpbmcgYXJvdW5kIEMyR3JhcGhpY0Jsb2NrIG9iamVjdC4KKyAgICAgKiBJZiB8YmxvY2t8IGlzIG5vdCBpbiBnb29kIGNvbG9yIGZvcm1hdHMsIGl0IGFsbG9jYXRlcyBZVjEyIGxvY2FsIGJ1ZmZlcgorICAgICAqIGFuZCBjb3BpZXMgdGhlIGNvbnRlbnQgb3ZlciBhdCBhc0MyQnVmZmVyKCkuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBmb3JtYXQgIG1hbmRhdG9yeSBidWZmZXIgZm9ybWF0IGZvciBNZWRpYUNvZGVjQnVmZmVyCisgICAgICogXHBhcmFtICAgYmxvY2sgICBDMkdyYXBoaWNCbG9jayBvYmplY3QgdG8gd3JhcCBhcm91bmQuCisgICAgICogXHBhcmFtICAgYWxsb2MgICBhIGZ1bmN0aW9uIHRvIGFsbG9jYXRlIGJhY2tpbmcgQUJ1ZmZlciBpZiBuZWVkZWQuCisgICAgICogXHJldHVybiAgICAgICAgICBHcmFwaGljQmxvY2tCdWZmZXIgb2JqZWN0IHdpdGggd3JpdGFibGUgbWFwcGluZy4KKyAgICAgKiAgICAgICAgICAgICAgICAgIG51bGxwdHIgaWYgdW5zdWNjZXNzZnVsLgorICAgICAqLworICAgIHN0YXRpYyBzcDxHcmFwaGljQmxvY2tCdWZmZXI+IEFsbG9jYXRlKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaywKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3A8QUJ1ZmZlcj4oc2l6ZV90KT4gYWxsb2MpOworCisgICAgdmlydHVhbCB+R3JhcGhpY0Jsb2NrQnVmZmVyKCkgPSBkZWZhdWx0OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBhc0MyQnVmZmVyKCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgR3JhcGhpY0Jsb2NrQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgQzJHcmFwaGljVmlldyAmJnZpZXcsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaywKKyAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZpbWFnZURhdGEsCisgICAgICAgICAgICBib29sIHdyYXBwZWQpOworICAgIEdyYXBoaWNCbG9ja0J1ZmZlcigpID0gZGVsZXRlOworCisgICAgaW5saW5lIE1lZGlhSW1hZ2UyICppbWFnZURhdGEoKSB7IHJldHVybiAoTWVkaWFJbWFnZTIgKiltSW1hZ2VEYXRhLT5kYXRhKCk7IH0KKworICAgIEMyR3JhcGhpY1ZpZXcgbVZpZXc7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBtQmxvY2s7CisgICAgY29uc3QgYm9vbCBtV3JhcHBlZDsKK307CisKKy8qKgorICogTWVkaWFDb2RlY0J1ZmZlciBpbXBsZW1lbnRhdGlvbiB3cmFwcyBhcm91bmQgVmlkZW9OYXRpdmVNZXRhZGF0YS4KKyAqLworY2xhc3MgR3JhcGhpY01ldGFkYXRhQnVmZmVyIDogcHVibGljIENvZGVjMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IEdyYXBoaWNNZXRhZGF0YUJ1ZmZlciB3aXRoIGxvY2FsIGxpbmVhciBidWZmZXIgZm9yCisgICAgICogVmlkZW9OYXRpdmVNZXRhZGF0YS4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGZvcm1hdCAgICAgIG1hbmRhdG9yeSBidWZmZXIgZm9ybWF0IGZvciBNZWRpYUNvZGVjQnVmZmVyCisgICAgICovCisgICAgR3JhcGhpY01ldGFkYXRhQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jKTsKKyAgICB2aXJ0dWFsIH5HcmFwaGljTWV0YWRhdGFCdWZmZXIoKSA9IGRlZmF1bHQ7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGFzQzJCdWZmZXIoKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBHcmFwaGljTWV0YWRhdGFCdWZmZXIoKSA9IGRlbGV0ZTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jOworfTsKKworLyoqCisgKiBNZWRpYUNvZGVjQnVmZmVyIGltcGxlbWVudGF0aW9uIHdyYXBzIGFyb3VuZCBncmFwaGljIEMyQnVmZmVyIG9iamVjdC4KKyAqCisgKiBUaGlzIG9iamVjdCBleHBvc2VzIHRoZSB1bmRlcmx5aW5nIGJpdHMgdmlhIGFjY2Vzc29yIEFQSXMgYW5kICJpbWFnZS1kYXRhIgorICogbWV0YWRhdGEsIGNyZWF0ZWQgYXV0b21hdGljYWxseSBhdCBhbGxvY2F0aW9uIHRpbWUuCisgKi8KK2NsYXNzIENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyIDogcHVibGljIENvZGVjMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQWxsb2NhdGUgYSBuZXcgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIgd3JhcHBpbmcgYXJvdW5kIEMyQnVmZmVyIG9iamVjdC4KKyAgICAgKiBJZiB8YnVmZmVyfCBpcyBub3QgaW4gZ29vZCBjb2xvciBmb3JtYXRzLCBpdCBhbGxvY2F0ZXMgWVYxMiBsb2NhbCBidWZmZXIKKyAgICAgKiBhbmQgY29waWVzIHRoZSBjb250ZW50IG9mIHxidWZmZXJ8IG92ZXIgdG8gZXhwb3NlLgorICAgICAqCisgICAgICogXHBhcmFtICAgZm9ybWF0ICBtYW5kYXRvcnkgYnVmZmVyIGZvcm1hdCBmb3IgTWVkaWFDb2RlY0J1ZmZlcgorICAgICAqIFxwYXJhbSAgIGJ1ZmZlciAgZ3JhcGhpYyBDMkJ1ZmZlciBvYmplY3QgdG8gd3JhcCBhcm91bmQuCisgICAgICogXHBhcmFtICAgYWxsb2MgICBhIGZ1bmN0aW9uIHRvIGFsbG9jYXRlIGJhY2tpbmcgQUJ1ZmZlciBpZiBuZWVkZWQuCisgICAgICogXHJldHVybiAgICAgICAgICBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlciBvYmplY3Qgd2l0aCByZWFkYWJsZSBtYXBwaW5nLgorICAgICAqICAgICAgICAgICAgICAgICAgbnVsbHB0ciBpZiB1bnN1Y2Nlc3NmdWwuCisgICAgICovCisgICAgc3RhdGljIHNwPENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyPiBBbGxvY2F0ZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxBQnVmZmVyPihzaXplX3QpPiBhbGxvYyk7CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhIG5ldyBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlciB3aGljaCBhbGxvY2F0ZXMgWVYxMiBsb2NhbCBidWZmZXIKKyAgICAgKiBhbmQgY29waWVzIHRoZSBjb250ZW50IG9mIHxidWZmZXJ8IG92ZXIgdG8gZXhwb3NlLgorICAgICAqCisgICAgICogXHBhcmFtICAgZm9ybWF0ICBtYW5kYXRvcnkgYnVmZmVyIGZvcm1hdCBmb3IgTWVkaWFDb2RlY0J1ZmZlcgorICAgICAqIFxwYXJhbSAgIGFsbG9jICAgYSBmdW5jdGlvbiB0byBhbGxvY2F0ZSBiYWNraW5nIEFCdWZmZXIgaWYgbmVlZGVkLgorICAgICAqIFxyZXR1cm4gICAgICAgICAgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIgb2JqZWN0IHdpdGggbm8gd3JhcHBpbmcgYnVmZmVyLgorICAgICAqLworICAgIHN0YXRpYyBzcDxDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcj4gQWxsb2NhdGVFbXB0eSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxBQnVmZmVyPihzaXplX3QpPiBhbGxvYyk7CisKKyAgICB2aXJ0dWFsIH5Db25zdEdyYXBoaWNCbG9ja0J1ZmZlcigpID0gZGVmYXVsdDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpIG92ZXJyaWRlOworICAgIGJvb2wgY2FuQ29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIGNvbnN0IG92ZXJyaWRlOworICAgIGJvb2wgY29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYUJ1ZmZlciwKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMkdyYXBoaWNWaWV3PiAmJnZpZXcsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmaW1hZ2VEYXRhLAorICAgICAgICAgICAgYm9vbCB3cmFwcGVkKTsKKyAgICBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcigpID0gZGVsZXRlOworCisgICAgc3A8QUJ1ZmZlcj4gbUltYWdlRGF0YTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJHcmFwaGljVmlldz4gbVZpZXc7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBtQnVmZmVyUmVmOworICAgIGNvbnN0IGJvb2wgbVdyYXBwZWQ7Cit9OworCisvKioKKyAqIE1lZGlhQ29kZWNCdWZmZXIgaW1wbGVtZW50YXRpb24gd3JhcHMgYXJvdW5kIEMyTGluZWFyQmxvY2sgZm9yIGNvbXBvbmVudAorICogYW5kIElNZW1vcnkgZm9yIGNsaWVudC4gVW5kZXJseWluZyBDMkxpbmVhckJsb2NrIHdvbid0IGJlIG1hcHBlZCBmb3Igc2VjdXJlCisgKiB1c2VjYXNlcy4uCisgKi8KK2NsYXNzIEVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyIDogcHVibGljIENvZGVjMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGEgbmV3IEVuY3J5cHRlZExpbmVhckJ1ZmZlckJsb2NrIHdyYXBwaW5nIGFyb3VuZCBDMkxpbmVhckJsb2NrCisgICAgICogb2JqZWN0IGFuZCB3cml0YWJsZSBJTWVtb3J5IHJlZ2lvbi4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGZvcm1hdCAgICAgIG1hbmRhdG9yeSBidWZmZXIgZm9ybWF0IGZvciBNZWRpYUNvZGVjQnVmZmVyCisgICAgICogXHBhcmFtICAgYmxvY2sgICAgICAgQzJMaW5lYXJCbG9jayBvYmplY3QgdG8gd3JhcCBhcm91bmQuCisgICAgICogXHBhcmFtICAgbWVtb3J5ICAgICAgSU1lbW9yeSBvYmplY3QgdG8gc3RvcmUgZW5jcnlwdGVkIGNvbnRlbnQuCisgICAgICogXHBhcmFtICAgaGVhcFNlcU51bSAgSGVhcCBzZXF1ZW5jZSBudW1iZXIgZnJvbSBJQ3J5cHRvOyAtMSBpZiBOL0EKKyAgICAgKi8KKyAgICBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jaywKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+ICZtZW1vcnksCisgICAgICAgICAgICBpbnQzMl90IGhlYXBTZXFOdW0gPSAtMSk7CisgICAgRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXIoKSA9IGRlbGV0ZTsKKworICAgIHZpcnR1YWwgfkVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyKCkgPSBkZWZhdWx0OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBhc0MyQnVmZmVyKCkgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBGaWxsIHRoZSBzb3VyY2UgYnVmZmVyIHN0cnVjdHVyZSB3aXRoIGFwcHJvcHJpYXRlIHZhbHVlIGJhc2VkIG9uCisgICAgICogaW50ZXJuYWwgSU1lbW9yeSBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gc291cmNlICBzb3VyY2UgYnVmZmVyIHN0cnVjdHVyZSB0byBmaWxsLgorICAgICAqLworICAgIHZvaWQgZmlsbFNvdXJjZUJ1ZmZlcihJQ3J5cHRvOjpTb3VyY2VCdWZmZXIgKnNvdXJjZSk7CisgICAgdm9pZCBmaWxsU291cmNlQnVmZmVyKAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhczo6bmF0aXZlOjpWMV8wOjpTaGFyZWRCdWZmZXIgKnNvdXJjZSk7CisKKyAgICAvKioKKyAgICAgKiBDb3B5IHRoZSBjb250ZW50IG9mIHxkZWNyeXB0ZWR8IGludG8gQzJMaW5lYXJCbG9jayBpbnNpZGUuIFRoaXMgc2hhbGwKKyAgICAgKiBvbmx5IGJlIGNhbGxlZCBpbiBub24tc2VjdXJlIHVzZWNhc2VzLgorICAgICAqCisgICAgICogXHBhcmFtICAgZGVjcnlwdGVkICAgZGVjcnlwdGVkIGNvbnRlbnQgdG8gY29weSBmcm9tLgorICAgICAqIFxwYXJhbSAgIGxlbmd0aCAgICAgIGxlbmd0aCBvZiB0aGUgY29udGVudAorICAgICAqIFxyZXR1cm4gIHRydWUgICAgICAgIGlmIHN1Y2Nlc3NmdWwKKyAgICAgKiAgICAgICAgICBmYWxzZSAgICAgICBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbCBjb3B5RGVjcnlwdGVkQ29udGVudChjb25zdCBzcDxJTWVtb3J5PiAmZGVjcnlwdGVkLCBzaXplX3QgbGVuZ3RoKTsKKworICAgIC8qKgorICAgICAqIENvcHkgdGhlIGNvbnRlbnQgb2YgaW50ZXJuYWwgSU1lbW9yeSBvYmplY3QgaW50byBDMkxpbmVhckJsb2NrIGluc2lkZS4KKyAgICAgKiBUaGlzIHNoYWxsIG9ubHkgYmUgY2FsbGVkIGluIG5vbi1zZWN1cmUgdXNlY2FzZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBsZW5ndGggICAgICBsZW5ndGggb2YgdGhlIGNvbnRlbnQKKyAgICAgKiBccmV0dXJuICB0cnVlICAgICAgICBpZiBzdWNjZXNzZnVsCisgICAgICogICAgICAgICAgZmFsc2UgICAgICAgb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2wgY29weURlY3J5cHRlZENvbnRlbnRGcm9tTWVtb3J5KHNpemVfdCBsZW5ndGgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIG5hdGl2ZSBoYW5kbGUgb2Ygc2VjdXJlIGJ1ZmZlciB1bmRlcnN0b29kIGJ5IElDcnlwdG8uCisgICAgICoKKyAgICAgKiBccmV0dXJuIHNlY3VyZSBidWZmZXIgaGFuZGxlCisgICAgICovCisgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUoKSBjb25zdDsKKworcHJpdmF0ZToKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBtQmxvY2s7CisgICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKKyAgICBzcDxoYXJkd2FyZTo6SGlkbE1lbW9yeT4gbUhpZGxNZW1vcnk7CisgICAgaW50MzJfdCBtSGVhcFNlcU51bTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0JVRkZFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkluZm9CdWlsZGVyLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJJbmZvQnVpbGRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU0YzYwMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJJbmZvQnVpbGRlci5jcHAKQEAgLTAsMCArMSw1NTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMkluZm9CdWlsZGVyIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPHN0cmluZ3MuaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDb2RlYzJNYXBwZXIuaD4KKworI2luY2x1ZGUgPE9NWF9BdWRpby5oPgorI2luY2x1ZGUgPE9NWF9BdWRpb0V4dC5oPgorI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgorI2luY2x1ZGUgPE9NWF9UeXBlcy5oPgorI2luY2x1ZGUgPE9NWF9WaWRlby5oPgorI2luY2x1ZGUgPE9NWF9WaWRlb0V4dC5oPgorI2luY2x1ZGUgPE9NWF9Bc1N0cmluZy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXguaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teE9ic2VydmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXhOb2RlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8bWVkaWEvb214LzEuMC9XT214Tm9kZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29rdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgorCisjaW5jbHVkZSAiQ29kZWMySW5mb0J1aWxkZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBUcmFpdHMgPSBDMkNvbXBvbmVudDo6VHJhaXRzOworCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK2Jvb2wgaGFzUHJlZml4KGNvbnN0IHN0ZDo6c3RyaW5nJiBzLCBjb25zdCBjaGFyKiBwcmVmaXgpIHsKKyAgICBzaXplX3QgcHJlZml4TGVuID0gc3RybGVuKHByZWZpeCk7CisgICAgcmV0dXJuIHMuY29tcGFyZSgwLCBwcmVmaXhMZW4sIHByZWZpeCkgPT0gMDsKK30KKworYm9vbCBoYXNTdWZmaXgoY29uc3Qgc3RkOjpzdHJpbmcmIHMsIGNvbnN0IGNoYXIqIHN1ZmZpeCkgeworICAgIHNpemVfdCBzdWZmaXhMZW4gPSBzdHJsZW4oc3VmZml4KTsKKyAgICByZXR1cm4gc3VmZml4TGVuID4gcy5zaXplKCkgPyBmYWxzZSA6CisgICAgICAgICAgICBzLmNvbXBhcmUocy5zaXplKCkgLSBzdWZmaXhMZW4sIHN1ZmZpeExlbiwgc3VmZml4KSA9PSAwOworfQorCit2b2lkIGFkZFN1cHBvcnRlZFByb2ZpbGVMZXZlbHMoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkludGVyZmFjZT4gaW50ZiwKKyAgICAgICAgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlciAqY2FwcywKKyAgICAgICAgY29uc3QgVHJhaXRzJiB0cmFpdCwgY29uc3Qgc3RkOjpzdHJpbmcgJm1lZGlhVHlwZSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk1hcHBlcjo6UHJvZmlsZUxldmVsTWFwcGVyPiBtYXBwZXIgPQorICAgICAgICBDMk1hcHBlcjo6R2V0UHJvZmlsZUxldmVsTWFwcGVyKHRyYWl0Lm1lZGlhVHlwZSk7CisgICAgLy8gaWYgd2UgZG9uJ3Qga25vdyB0aGUgbWVkaWEgdHlwZSwgcGFzcyB0aHJvdWdoIGFsbCB2YWx1ZXMgdW5tYXBwZWQKKworICAgIC8vIFRPRE86IHdlIGNhbm5vdCBmaW5kIGxldmVscyB0aGF0IGFyZSBsb2NhbCAnbWF4aW1hJyB3aXRob3V0IGtub3dpbmcgdGhlIGNvZGluZworICAgIC8vIGUuZy4gSC4yNjMgbGV2ZWwgNDUgYW5kIGxldmVsIDMwIGNvdWxkIGJlIHR3byB2YWx1ZXMgZm9yIGhpZ2hlc3QgbGV2ZWwgYXMKKyAgICAvLyB0aGV5IGRvbid0IGluY2x1ZGUgb25lIGFub3RoZXIuIEZvciBub3cgd2UgdXNlIHRoZSBsYXN0IHN1cHBvcnRlZCB2YWx1ZS4KKyAgICBib29sIGVuY29kZXIgPSB0cmFpdC5raW5kID09IEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVI7CisgICAgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvIHBsKGVuY29kZXIgLyogb3V0cHV0ICovLCAwdSk7CisgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiBwcm9maWxlUXVlcnkgPSB7CisgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6UG9zc2libGUoQzJQYXJhbUZpZWxkKCZwbCwgJnBsLnByb2ZpbGUpKQorICAgIH07CisKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBpbnRmLT5xdWVyeVN1cHBvcnRlZFZhbHVlcyhwcm9maWxlUXVlcnksIEMyX0RPTlRfQkxPQ0spOworICAgIEFMT0dWKCJxdWVyeSBzdXBwb3J0ZWQgcHJvZmlsZXMgLT4gJXMgfCAlcyIsIGFzU3RyaW5nKGVyciksIGFzU3RyaW5nKHByb2ZpbGVRdWVyeVswXS5zdGF0dXMpKTsKKyAgICBpZiAoZXJyICE9IEMyX09LIHx8IHByb2ZpbGVRdWVyeVswXS5zdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIHdlIG9ubHkgaGFuZGxlIGVudW1lcmF0ZWQgdmFsdWVzCisgICAgaWYgKHByb2ZpbGVRdWVyeVswXS52YWx1ZXMudHlwZSAhPSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpWQUxVRVMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGRldGVybWluZSBpZiBjb2RlYyBzdXBwb3J0cyBIRFIKKyAgICBib29sIHN1cHBvcnRzSGRyID0gZmFsc2U7CisgICAgYm9vbCBzdXBwb3J0c0hkcjEwUGx1cyA9IGZhbHNlOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gcGFyYW1EZXNjczsKKyAgICBjMl9zdGF0dXNfdCBlcnIxID0gaW50Zi0+cXVlcnlTdXBwb3J0ZWRQYXJhbXMoJnBhcmFtRGVzY3MpOworICAgIGlmIChlcnIxID09IEMyX09LKSB7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiAmZGVzYyA6IHBhcmFtRGVzY3MpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoKHVpbnQzMl90KWRlc2MtPmluZGV4KCkpIHsKKyAgICAgICAgICAgIGNhc2UgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEU6CisgICAgICAgICAgICAgICAgc3VwcG9ydHNIZHIxMFBsdXMgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDMlN0cmVhbUhkclN0YXRpY0luZm86Om91dHB1dDo6UEFSQU1fVFlQRToKKyAgICAgICAgICAgICAgICBzdXBwb3J0c0hkciA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gRm9yIFZQOSwgdGhlIHN0YXRpYyBpbmZvIGlzIGFsd2F5cyBwcm9wYWdhdGVkIGJ5IGZyYW1ld29yay4KKyAgICBzdXBwb3J0c0hkciB8PSAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX1ZQOSk7CisKKyAgICBmb3IgKEMyVmFsdWU6OlByaW1pdGl2ZSBwcm9maWxlIDogcHJvZmlsZVF1ZXJ5WzBdLnZhbHVlcy52YWx1ZXMpIHsKKyAgICAgICAgcGwucHJvZmlsZSA9IChDMkNvbmZpZzo6cHJvZmlsZV90KXByb2ZpbGUucmVmPHVpbnQzMl90PigpOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgIGVyciA9IGludGYtPmNvbmZpZyh7JnBsfSwgQzJfRE9OVF9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgQUxPR1YoInNldCBwcm9maWxlIHRvICV1IC0+ICVzIiwgcGwucHJvZmlsZSwgYXNTdHJpbmcoZXJyKSk7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gbGV2ZWxRdWVyeSA9IHsKKyAgICAgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q3VycmVudChDMlBhcmFtRmllbGQoJnBsLCAmcGwubGV2ZWwpKQorICAgICAgICB9OworICAgICAgICBlcnIgPSBpbnRmLT5xdWVyeVN1cHBvcnRlZFZhbHVlcyhsZXZlbFF1ZXJ5LCBDMl9ET05UX0JMT0NLKTsKKyAgICAgICAgQUxPR1YoInF1ZXJ5IHN1cHBvcnRlZCBsZXZlbHMgLT4gJXMgfCAlcyIsIGFzU3RyaW5nKGVyciksIGFzU3RyaW5nKGxldmVsUXVlcnlbMF0uc3RhdHVzKSk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0sgfHwgbGV2ZWxRdWVyeVswXS5zdGF0dXMgIT0gQzJfT0sKKyAgICAgICAgICAgICAgICB8fCBsZXZlbFF1ZXJ5WzBdLnZhbHVlcy50eXBlICE9IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUworICAgICAgICAgICAgICAgIHx8IGxldmVsUXVlcnlbMF0udmFsdWVzLnZhbHVlcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBDMlZhbHVlOjpQcmltaXRpdmUgbGV2ZWwgPSBsZXZlbFF1ZXJ5WzBdLnZhbHVlcy52YWx1ZXMuYmFjaygpOworICAgICAgICBwbC5sZXZlbCA9IChDMkNvbmZpZzo6bGV2ZWxfdClsZXZlbC5yZWY8dWludDMyX3Q+KCk7CisgICAgICAgIEFMT0dWKCJzdXBwb3J0aW5nIGxldmVsOiAldSIsIHBsLmxldmVsKTsKKyAgICAgICAgaW50MzJfdCBzZGtQcm9maWxlLCBzZGtMZXZlbDsKKyAgICAgICAgaWYgKG1hcHBlciAmJiBtYXBwZXItPm1hcFByb2ZpbGUocGwucHJvZmlsZSwgJnNka1Byb2ZpbGUpCisgICAgICAgICAgICAgICAgJiYgbWFwcGVyLT5tYXBMZXZlbChwbC5sZXZlbCwgJnNka0xldmVsKSkgeworICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKCh1aW50MzJfdClzZGtQcm9maWxlLCAodWludDMyX3Qpc2RrTGV2ZWwpOworICAgICAgICAgICAgLy8gYWxzbyBsaXN0IEhEUiBwcm9maWxlcyBpZiBjb21wb25lbnQgc3VwcG9ydHMgSERSCisgICAgICAgICAgICBpZiAoc3VwcG9ydHNIZHIpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGhkck1hcHBlciA9IEMyTWFwcGVyOjpHZXRIZHJQcm9maWxlTGV2ZWxNYXBwZXIodHJhaXQubWVkaWFUeXBlKTsKKyAgICAgICAgICAgICAgICBpZiAoaGRyTWFwcGVyICYmIGhkck1hcHBlci0+bWFwUHJvZmlsZShwbC5wcm9maWxlLCAmc2RrUHJvZmlsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKCh1aW50MzJfdClzZGtQcm9maWxlLCAodWludDMyX3Qpc2RrTGV2ZWwpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydHNIZHIxMFBsdXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaGRyTWFwcGVyID0gQzJNYXBwZXI6OkdldEhkclByb2ZpbGVMZXZlbE1hcHBlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdC5tZWRpYVR5cGUsIHRydWUgLyppc0hkcjEwUGx1cyovKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhkck1hcHBlciAmJiBoZHJNYXBwZXItPm1hcFByb2ZpbGUocGwucHJvZmlsZSwgJnNka1Byb2ZpbGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoKHVpbnQzMl90KXNka1Byb2ZpbGUsICh1aW50MzJfdClzZGtMZXZlbCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIW1hcHBlcikgeworICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKHBsLnByb2ZpbGUsIHBsLmxldmVsKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGZvciBILjI2MyBhbHNvIGFkdmVydGlzZSB0aGUgc2Vjb25kIGhpZ2hlc3QgbGV2ZWwgaWYgdGhlCisgICAgICAgIC8vIGNvZGVjIHN1cHBvcnRzIGxldmVsIDQ1LCBhcyBsZXZlbCA0NSBvbmx5IGNvdmVycyBsZXZlbCAxMAorICAgICAgICAvLyBUT0RPOiBtb3ZlIHRoaXMgdG8gc29tZSBmb3JtIG9mIGEgc2V0dGluZyBzbyBpdCBkb2VzIG5vdAorICAgICAgICAvLyBoYXZlIHRvIGJlIGhlcmUKKyAgICAgICAgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19IMjYzKSB7CisgICAgICAgICAgICBDMkNvbmZpZzo6bGV2ZWxfdCBuZXh0TGV2ZWwgPSBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEOworICAgICAgICAgICAgZm9yIChDMlZhbHVlOjpQcmltaXRpdmUgdiA6IGxldmVsUXVlcnlbMF0udmFsdWVzLnZhbHVlcykgeworICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpsZXZlbF90IGxldmVsID0gKEMyQ29uZmlnOjpsZXZlbF90KXYucmVmPHVpbnQzMl90PigpOworICAgICAgICAgICAgICAgIGlmIChsZXZlbCA8IEMyQ29uZmlnOjpMRVZFTF9IMjYzXzQ1ICYmIGxldmVsID4gbmV4dExldmVsKSB7CisgICAgICAgICAgICAgICAgICAgIG5leHRMZXZlbCA9IGxldmVsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChuZXh0TGV2ZWwgIT0gQzJDb25maWc6OkxFVkVMX1VOVVNFRAorICAgICAgICAgICAgICAgICAgICAmJiBuZXh0TGV2ZWwgIT0gcGwubGV2ZWwKKyAgICAgICAgICAgICAgICAgICAgJiYgbWFwcGVyCisgICAgICAgICAgICAgICAgICAgICYmIG1hcHBlci0+bWFwUHJvZmlsZShwbC5wcm9maWxlLCAmc2RrUHJvZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgJiYgbWFwcGVyLT5tYXBMZXZlbChuZXh0TGV2ZWwsICZzZGtMZXZlbCkpIHsKKyAgICAgICAgICAgICAgICBjYXBzLT5hZGRQcm9maWxlTGV2ZWwoCisgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3Qpc2RrUHJvZmlsZSwgKHVpbnQzMl90KXNka0xldmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBhZGRTdXBwb3J0ZWRDb2xvckZvcm1hdHMoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkludGVyZmFjZT4gaW50ZiwKKyAgICAgICAgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlciAqY2FwcywKKyAgICAgICAgY29uc3QgVHJhaXRzJiB0cmFpdCwgY29uc3Qgc3RkOjpzdHJpbmcgJm1lZGlhVHlwZSkgeworICAgICh2b2lkKWludGY7CisKKyAgICAvLyBUT0RPOiBnZXQgdGhpcyBmcm9tIGludGYoKSBhcyB3ZWxsLCBidXQgaG93IGRvIHdlIG1hcCB0aGVtIHRvCisgICAgLy8gTWVkaWFDb2RlYyBjb2xvciBmb3JtYXRzPworICAgIGJvb2wgZW5jb2RlciA9IHRyYWl0LmtpbmQgPT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjsKKyAgICBpZiAobWVkaWFUeXBlLmZpbmQoInZpZGVvIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgLy8gdmVuZG9yIHZpZGVvIGNvZGVjcyBwcmVmZXIgb3BhcXVlIGZvcm1hdAorICAgICAgICBpZiAodHJhaXQubmFtZS5maW5kKCJhbmRyb2lkIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFN1cmZhY2UpOworICAgICAgICB9CisgICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlKTsKKyAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKTsKKyAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcik7CisgICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFBsYW5hcik7CisgICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIpOworICAgICAgICAvLyBmcmFtZXdvcmsgdmlkZW8gZW5jb2RlcnMgbXVzdCBzdXBwb3J0IHN1cmZhY2UgZm9ybWF0LCB0aG91Z2ggaXQgaXMgdW5jbGVhcgorICAgICAgICAvLyB0aGF0IHRoZXkgd2lsbCBiZSBhYmxlIHRvIG1hcCBpdCBpZiBpdCBpcyBvcGFxdWUKKyAgICAgICAgaWYgKGVuY29kZXIgJiYgdHJhaXQubmFtZS5maW5kKCJhbmRyb2lkIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIGNhcHMtPmFkZENvbG9yRm9ybWF0KENPTE9SX0Zvcm1hdFN1cmZhY2UpOworICAgICAgICB9CisgICAgfQorfQorCitjbGFzcyBTd2l0Y2ggeworICAgIGVudW0gRmxhZ3MgOiB1aW50OF90IHsKKyAgICAgICAgLy8gZmxhZ3MKKyAgICAgICAgSVNfRU5BQkxFRCA9ICgxIDw8IDApLAorICAgICAgICBCWV9ERUZBVUxUID0gKDEgPDwgMSksCisgICAgfTsKKworICAgIGNvbnN0ZXhwciBTd2l0Y2godWludDhfdCBmbGFncykgOiBtRmxhZ3MoZmxhZ3MpIHt9CisKKyAgICB1aW50OF90IG1GbGFnczsKKworcHVibGljOgorICAgIC8vIGhhdmUgdG8gY3JlYXRlIGNsYXNzIGR1ZSB0byB0aGlzIGJvb2wgY29udmVyc2lvbiBvcGVyYXRvci4uLgorICAgIGNvbnN0ZXhwciBvcGVyYXRvciBib29sKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUZsYWdzICYgSVNfRU5BQkxFRDsKKyAgICB9CisKKyAgICBjb25zdGV4cHIgU3dpdGNoIG9wZXJhdG9yISgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIFN3aXRjaChtRmxhZ3MgXiBJU19FTkFCTEVEKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3RleHByIFN3aXRjaCBESVNBQkxFRCgpIHsgcmV0dXJuIDA7IH07CisgICAgc3RhdGljIGNvbnN0ZXhwciBTd2l0Y2ggRU5BQkxFRCgpIHsgcmV0dXJuIElTX0VOQUJMRUQ7IH07CisgICAgc3RhdGljIGNvbnN0ZXhwciBTd2l0Y2ggRElTQUJMRURfQllfREVGQVVMVCgpIHsgcmV0dXJuIEJZX0RFRkFVTFQ7IH07CisgICAgc3RhdGljIGNvbnN0ZXhwciBTd2l0Y2ggRU5BQkxFRF9CWV9ERUZBVUxUKCkgeyByZXR1cm4gSVNfRU5BQkxFRCB8IEJZX0RFRkFVTFQ7IH07CisKKyAgICBjb25zdCBjaGFyICp0b1N0cmluZyhjb25zdCBjaGFyICpkZWYgPSAiPz8iKSBjb25zdCB7CisgICAgICAgIHN3aXRjaCAobUZsYWdzKSB7CisgICAgICAgIGNhc2UgMDogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICIwIjsKKyAgICAgICAgY2FzZSBJU19FTkFCTEVEOiAgICAgICAgICAgICAgICByZXR1cm4gIjEiOworICAgICAgICBjYXNlIEJZX0RFRkFVTFQ6ICAgICAgICAgICAgICAgIHJldHVybiAiKDApIjsKKyAgICAgICAgY2FzZSBJU19FTkFCTEVEIHwgQllfREVGQVVMVDogICByZXR1cm4gIigxKSI7CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiBkZWY7CisgICAgICAgIH0KKyAgICB9CisKK307CisKK2NvbnN0IGNoYXIgKmFzU3RyaW5nKGNvbnN0IFN3aXRjaCAmcywgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHJldHVybiBzLnRvU3RyaW5nKGRlZik7Cit9CisKK1N3aXRjaCBpc1NldHRpbmdFbmFibGVkKAorICAgICAgICBzdGQ6OnN0cmluZyBzZXR0aW5nLCBjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwICZzZXR0aW5ncywKKyAgICAgICAgU3dpdGNoIGRlZiA9IFN3aXRjaDo6RElTQUJMRURfQllfREVGQVVMVCgpKSB7CisgICAgY29uc3QgYXV0byBlbmFibGVtZW50ID0gc2V0dGluZ3MuZmluZChzZXR0aW5nKTsKKyAgICBpZiAoZW5hYmxlbWVudCA9PSBzZXR0aW5ncy5lbmQoKSkgeworICAgICAgICByZXR1cm4gZGVmOworICAgIH0KKyAgICByZXR1cm4gZW5hYmxlbWVudC0+c2Vjb25kID09ICIxIiA/IFN3aXRjaDo6RU5BQkxFRCgpIDogU3dpdGNoOjpESVNBQkxFRCgpOworfQorCitTd2l0Y2ggaXNWYXJpYW50RW5hYmxlZCgKKyAgICAgICAgc3RkOjpzdHJpbmcgdmFyaWFudCwgY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkF0dHJpYnV0ZU1hcCAmc2V0dGluZ3MpIHsKKyAgICByZXR1cm4gaXNTZXR0aW5nRW5hYmxlZCgidmFyaWFudC0iICsgdmFyaWFudCwgc2V0dGluZ3MpOworfQorCitTd2l0Y2ggaXNWYXJpYW50RXhwcmVzc2lvbkVuYWJsZWQoCisgICAgICAgIHN0ZDo6c3RyaW5nIGV4cCwgY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkF0dHJpYnV0ZU1hcCAmc2V0dGluZ3MpIHsKKyAgICBpZiAoIWV4cC5lbXB0eSgpICYmIGV4cC5hdCgwKSA9PSAnIScpIHsKKyAgICAgICAgcmV0dXJuICFpc1ZhcmlhbnRFbmFibGVkKGV4cC5zdWJzdHIoMSwgZXhwLnNpemUoKSAtIDEpLCBzZXR0aW5ncyk7CisgICAgfQorICAgIHJldHVybiBpc1ZhcmlhbnRFbmFibGVkKGV4cCwgc2V0dGluZ3MpOworfQorCitTd2l0Y2ggaXNEb21haW5FbmFibGVkKAorICAgICAgICBzdGQ6OnN0cmluZyBkb21haW4sIGNvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpBdHRyaWJ1dGVNYXAgJnNldHRpbmdzKSB7CisgICAgcmV0dXJuIGlzU2V0dGluZ0VuYWJsZWQoImRvbWFpbi0iICsgZG9tYWluLCBzZXR0aW5ncyk7Cit9CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworc3RhdHVzX3QgQ29kZWMySW5mb0J1aWxkZXI6OmJ1aWxkTWVkaWFDb2RlY0xpc3QoTWVkaWFDb2RlY0xpc3RXcml0ZXIqIHdyaXRlcikgeworICAgIC8vIFRPRE86IFJlbW92ZSBydW4tdGltZSBjb25maWd1cmF0aW9ucyBvbmNlIGFsbCBjb2RlY3MgYXJlIHdvcmtpbmcKKyAgICAvLyBwcm9wZXJseS4gKEFzc3VtZSAiZnVsbCIgYmVoYXZpb3IgZXZlbnR1YWxseS4pCisgICAgLy8KKyAgICAvLyBkZWJ1Zy5zdGFnZWZyaWdodC5jY29kZWMgc3VwcG9ydHMgNSB2YWx1ZXMuCisgICAgLy8gICAwIC0gTm8gQ29kZWMgMi4wIGNvbXBvbmVudHMgYXJlIGF2YWlsYWJsZS4KKyAgICAvLyAgIDEgLSBBdWRpbyBkZWNvZGVycyBhbmQgZW5jb2RlcnMgd2l0aCBwcmVmaXggImMyLmFuZHJvaWQuIiBhcmUgYXZhaWxhYmxlCisgICAgLy8gICAgICAgYW5kIHJhbmtlZCBmaXJzdC4KKyAgICAvLyAgICAgICBBbGwgb3RoZXIgY29tcG9uZW50cyB3aXRoIHByZWZpeCAiYzIuYW5kcm9pZC4iIGFyZSBhdmFpbGFibGUgd2l0aAorICAgIC8vICAgICAgIHRoZWlyIG5vcm1hbCByYW5rcy4KKyAgICAvLyAgICAgICBDb21wb25lbnRzIHdpdGggcHJlZml4ICJjMi52ZGEuIiBhcmUgYXZhaWxhYmxlIHdpdGggdGhlaXIgbm9ybWFsCisgICAgLy8gICAgICAgcmFua3MuCisgICAgLy8gICAgICAgQWxsIG90aGVyIGNvbXBvbmVudHMgd2l0aCBzdWZmaXggIi5hdmMuZGVjb2RlciIgb3IgIi5hdmMuZW5jb2RlciIKKyAgICAvLyAgICAgICBhcmUgYXZhaWxhYmxlIGJ1dCByYW5rZWQgbGFzdC4KKyAgICAvLyAgIDIgLSBDb21wb25lbnRzIHdpdGggcHJlZml4ICJjMi5hbmRyb2lkLiIgYXJlIGF2YWlsYWJsZSBhbmQgcmFua2VkCisgICAgLy8gICAgICAgZmlyc3QuCisgICAgLy8gICAgICAgQ29tcG9uZW50cyB3aXRoIHByZWZpeCAiYzIudmRhLiIgYXJlIGF2YWlsYWJsZSB3aXRoIHRoZWlyIG5vcm1hbAorICAgIC8vICAgICAgIHJhbmtzLgorICAgIC8vICAgICAgIEFsbCBvdGhlciBjb21wb25lbnRzIHdpdGggc3VmZml4ICIuYXZjLmRlY29kZXIiIG9yICIuYXZjLmVuY29kZXIiCisgICAgLy8gICAgICAgYXJlIGF2YWlsYWJsZSBidXQgcmFua2VkIGxhc3QuCisgICAgLy8gICAzIC0gQ29tcG9uZW50cyB3aXRoIHByZWZpeCAiYzIuYW5kcm9pZC4iIGFyZSBhdmFpbGFibGUgYW5kIHJhbmtlZAorICAgIC8vICAgICAgIGZpcnN0LgorICAgIC8vICAgICAgIEFsbCBvdGhlciBjb21wb25lbnRzIGFyZSBhdmFpbGFibGUgd2l0aCB0aGVpciBub3JtYWwgcmFua3MuCisgICAgLy8gICA0IC0gQWxsIGNvbXBvbmVudHMgYXJlIGF2YWlsYWJsZSB3aXRoIHRoZWlyIG5vcm1hbCByYW5rcy4KKyAgICAvLworICAgIC8vIFRoZSBkZWZhdWx0IHZhbHVlIChib290IHRpbWUpIGlzIDEuCisgICAgLy8KKyAgICAvLyBOb3RlOiBDdXJyZW50bHksIE9NWCBjb21wb25lbnRzIGhhdmUgZGVmYXVsdCByYW5rIDB4MTAwLCB3aGlsZSBhbGwKKyAgICAvLyBDb2RlYzIuMCBzb2Z0d2FyZSBjb21wb25lbnRzIGhhdmUgZGVmYXVsdCByYW5rIDB4MjAwLgorICAgIGludCBvcHRpb24gPSA6OmFuZHJvaWQ6OmJhc2U6OkdldEludFByb3BlcnR5KCJkZWJ1Zy5zdGFnZWZyaWdodC5jY29kZWMiLCA0KTsKKworICAgIC8vIE9idGFpbiBDb2RlYzJDbGllbnQKKyAgICBzdGQ6OnZlY3RvcjxUcmFpdHM+IHRyYWl0cyA9IENvZGVjMkNsaWVudDo6TGlzdENvbXBvbmVudHMoKTsKKworICAgIC8vIHBhcnNlIEFQRVggWE1MIGZpcnN0LCBmb2xsb3dlZCBieSB2ZW5kb3IgWE1MCisgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXIgcGFyc2VyOworICAgIHBhcnNlci5wYXJzZVhtbEZpbGVzSW5TZWFyY2hEaXJzKAorICAgICAgICAgICAgcGFyc2VyLmdldERlZmF1bHRYbWxOYW1lcygpLAorICAgICAgICAgICAgeyAiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy9ldGMiIH0pOworCisgICAgLy8gVE9ETzogcmVtb3ZlIHRoZXNlIGMyLXNwZWNpZmljIGZpbGVzIG9uY2UgcHJvZHVjdCBtb3ZlZCB0byBkZWZhdWx0IGZpbGUgbmFtZXMKKyAgICBwYXJzZXIucGFyc2VYbWxGaWxlc0luU2VhcmNoRGlycygKKyAgICAgICAgICAgIHsgIm1lZGlhX2NvZGVjc19jMi54bWwiLCAibWVkaWFfY29kZWNzX3BlcmZvcm1hbmNlX2MyLnhtbCIgfSk7CisKKyAgICAvLyBwYXJzZSBkZWZhdWx0IFhNTCBmaWxlcworICAgIHBhcnNlci5wYXJzZVhtbEZpbGVzSW5TZWFyY2hEaXJzKCk7CisKKyAgICBpZiAocGFyc2VyLmdldFBhcnNpbmdTdGF0dXMoKSAhPSBPSykgeworICAgICAgICBBTE9HRCgiWE1MIHBhcnNlciBubyBnb29kIik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwIHNldHRpbmdzID0gcGFyc2VyLmdldFNlcnZpY2VBdHRyaWJ1dGVNYXAoKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnYgOiBzZXR0aW5ncykgeworICAgICAgICBpZiAoIWhhc1ByZWZpeCh2LmZpcnN0LCAibWVkaWEtdHlwZS0iKQorICAgICAgICAgICAgICAgICYmICFoYXNQcmVmaXgodi5maXJzdCwgImRvbWFpbi0iKQorICAgICAgICAgICAgICAgICYmICFoYXNQcmVmaXgodi5maXJzdCwgInZhcmlhbnQtIikpIHsKKyAgICAgICAgICAgIHdyaXRlci0+YWRkR2xvYmFsU2V0dGluZyh2LmZpcnN0LmNfc3RyKCksIHYuc2Vjb25kLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChjb25zdCBUcmFpdHMmIHRyYWl0IDogdHJhaXRzKSB7CisgICAgICAgIEMyQ29tcG9uZW50OjpyYW5rX3QgcmFuayA9IHRyYWl0LnJhbms7CisKKyAgICAgICAgLy8gSW50ZXJmYWNlIG11c3QgYmUgYWNjZXNzaWJsZSBmb3IgdXMgdG8gbGlzdCB0aGUgY29tcG9uZW50LCBhbmQgdGhlcmUgYWxzbworICAgICAgICAvLyBtdXN0IGJlIGFuIFhNTCBlbnRyeSBmb3IgdGhlIGNvZGVjLiBDb2RlYyBhbGlhc2VzIGxpc3RlZCBpbiB0aGUgdHJhaXRzCisgICAgICAgIC8vIGFsbG93IGFkZGl0aW9uYWwgWE1MIGVudHJpZXMgdG8gYmUgc3BlY2lmaWVkIGZvciBlYWNoIGFsaWFzLiBUaGVzZSB3aWxsCisgICAgICAgIC8vIGJlIGxpc3RlZCBhcyBzZXBhcmF0ZSBjb2RlY3MuIElmIG5vIFhNTCBlbnRyeSBpcyBzcGVjaWZpZWQgZm9yIGFuIGFsaWFzLAorICAgICAgICAvLyB0aG9zZSB3aWxsIGJlIHRyZWF0ZWQgYXMgYW4gYWRkaXRpb25hbCBhbGlhcyBzcGVjaWZpZWQgaW4gdGhlIFhNTCBlbnRyeQorICAgICAgICAvLyBmb3IgdGhlIGludGVyZmFjZSBuYW1lLgorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbmFtZUFuZEFsaWFzZXMgPSB0cmFpdC5hbGlhc2VzOworICAgICAgICBuYW1lQW5kQWxpYXNlcy5pbnNlcnQobmFtZUFuZEFsaWFzZXMuYmVnaW4oKSwgdHJhaXQubmFtZSk7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWVPckFsaWFzIDogbmFtZUFuZEFsaWFzZXMpIHsKKyAgICAgICAgICAgIGJvb2wgaXNBbGlhcyA9IHRyYWl0Lm5hbWUgIT0gbmFtZU9yQWxpYXM7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnRlcmZhY2U+IGludGYgPQorICAgICAgICAgICAgICAgIENvZGVjMkNsaWVudDo6Q3JlYXRlSW50ZXJmYWNlQnlOYW1lKG5hbWVPckFsaWFzLmNfc3RyKCkpOworICAgICAgICAgICAgaWYgKCFpbnRmKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImNvdWxkIG5vdCBjcmVhdGUgaW50ZXJmYWNlIGZvciAlcyclcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgaXNBbGlhcyA/ICJhbGlhcyAiIDogIiIsCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lT3JBbGlhcy5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJzZXIuZ2V0Q29kZWNNYXAoKS5jb3VudChuYW1lT3JBbGlhcykgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChpc0FsaWFzKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mb1dyaXRlcj4gYmFzZUNvZGVjSW5mbyA9CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXItPmZpbmRNZWRpYUNvZGVjSW5mbyh0cmFpdC5uYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWJhc2VDb2RlY0luZm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJhbGlhcyAnJXMnIG5vdCBmb3VuZCBpbiB4bWwgYnV0IGNhbm9uaWNhbCBjb2RlYyBpbmZvICclcycgbWlzc2luZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVPckFsaWFzLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0Lm5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiYWxpYXMgJyVzJyBub3QgZm91bmQgaW4geG1sOyB1c2UgYW4gWE1MIDxBbGlhcz4gdGFnIGZvciB0aGlzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZU9yQWxpYXMuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXJnZSBhbGlhcyBpbnRvIGV4aXN0aW5nIGNvZGVjCisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlQ29kZWNJbmZvLT5hZGRBbGlhcyhuYW1lT3JBbGlhcy5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJjb21wb25lbnQgJyVzJyBub3QgZm91bmQgaW4geG1sIiwgdHJhaXQubmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBjYW5vbk5hbWUgPSB0cmFpdC5uYW1lOworCisgICAgICAgICAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBibG9jayBvbmNlIGFsbCBjb2RlY3MgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdC4KKyAgICAgICAgICAgIHN3aXRjaCAob3B0aW9uKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgaWYgKGhhc1ByZWZpeChjYW5vbk5hbWUsICJjMi52ZGEuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChoYXNQcmVmaXgoY2Fub25OYW1lLCAiYzIuYW5kcm9pZC4iKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodHJhaXQuZG9tYWluID09IEMyQ29tcG9uZW50OjpET01BSU5fQVVESU8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhbmsgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChoYXNTdWZmaXgoY2Fub25OYW1lLCAiLmF2Yy5kZWNvZGVyIikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhc1N1ZmZpeChjYW5vbk5hbWUsICIuYXZjLmVuY29kZXIiKSkgeworICAgICAgICAgICAgICAgICAgICByYW5rID0gc3RkOjpudW1lcmljX2xpbWl0czxkZWNsdHlwZShyYW5rKT46Om1heCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgaWYgKGhhc1ByZWZpeChjYW5vbk5hbWUsICJjMi52ZGEuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChoYXNQcmVmaXgoY2Fub25OYW1lLCAiYzIuYW5kcm9pZC4iKSkgeworICAgICAgICAgICAgICAgICAgICByYW5rID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChoYXNTdWZmaXgoY2Fub25OYW1lLCAiLmF2Yy5kZWNvZGVyIikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhc1N1ZmZpeChjYW5vbk5hbWUsICIuYXZjLmVuY29kZXIiKSkgeworICAgICAgICAgICAgICAgICAgICByYW5rID0gc3RkOjpudW1lcmljX2xpbWl0czxkZWNsdHlwZShyYW5rKT46Om1heCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgaWYgKGhhc1ByZWZpeChjYW5vbk5hbWUsICJjMi5hbmRyb2lkLiIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJhbmsgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkNvZGVjUHJvcGVydGllcyAmY29kZWMgPQorICAgICAgICAgICAgICAgIHBhcnNlci5nZXRDb2RlY01hcCgpLmF0KG5hbWVPckFsaWFzKTsKKworICAgICAgICAgICAgLy8gdmVyaWZ5IHRoYXQgZWl0aGVyIHRoZSBjb2RlYyBpcyBleHBsaWNpdGx5IGVuYWJsZWQsIG9yIG9uZSBvZiBpdHMgZG9tYWlucyBpcworICAgICAgICAgICAgYm9vbCBjb2RlY0VuYWJsZWQgPSBjb2RlYy5xdWlya1NldC5maW5kKCJhdHRyaWJ1dGU6OmRpc2FibGVkIikgPT0gY29kZWMucXVpcmtTZXQuZW5kKCk7CisgICAgICAgICAgICBpZiAoIWNvZGVjRW5hYmxlZCkgeworICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzdHJpbmcgJmRvbWFpbiA6IGNvZGVjLmRvbWFpblNldCkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBTd2l0Y2ggZW5hYmxlZCA9IGlzRG9tYWluRW5hYmxlZChkb21haW4sIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNvZGVjIGVudHJ5ICclcycgaXMgaW4gZG9tYWluICclcycgdGhhdCBpcyAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lT3JBbGlhcy5jX3N0cigpLCBkb21haW4uY19zdHIoKSwgYXNTdHJpbmcoZW5hYmxlZCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNFbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gaWYgY29kZWMgaGFzIHZhcmlhbnRzLCBhbHNvIGNoZWNrIHRoYXQgYXQgbGVhc3Qgb25lIG9mIHRoZW0gaXMgZW5hYmxlZAorICAgICAgICAgICAgYm9vbCB2YXJpYW50RW5hYmxlZCA9IGNvZGVjLnZhcmlhbnRTZXQuZW1wdHkoKTsKKyAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzdHJpbmcgJnZhcmlhbnQgOiBjb2RlYy52YXJpYW50U2V0KSB7CisgICAgICAgICAgICAgICAgY29uc3QgU3dpdGNoIGVuYWJsZWQgPSBpc1ZhcmlhbnRFeHByZXNzaW9uRW5hYmxlZCh2YXJpYW50LCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgQUxPR1YoImNvZGVjIGVudHJ5ICclcycgaGFzIGEgdmFyaWFudCAnJXMnIHRoYXQgaXMgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lT3JBbGlhcy5jX3N0cigpLCB2YXJpYW50LmNfc3RyKCksIGFzU3RyaW5nKGVuYWJsZWQpKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICAgICAgICAgICAgICB2YXJpYW50RW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghY29kZWNFbmFibGVkIHx8ICF2YXJpYW50RW5hYmxlZCkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJjb2RlYyBlbnRyeSBmb3IgJyVzJyBpcyBkaXNhYmxlZCIsIG5hbWVPckFsaWFzLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTE9HVigiYWRkaW5nIGNvZGVjIGVudHJ5IGZvciAnJXMnIiwgbmFtZU9yQWxpYXMuY19zdHIoKSk7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+IGNvZGVjSW5mbyA9IHdyaXRlci0+YWRkTWVkaWFDb2RlY0luZm8oKTsKKyAgICAgICAgICAgIGNvZGVjSW5mby0+c2V0TmFtZShuYW1lT3JBbGlhcy5jX3N0cigpKTsKKyAgICAgICAgICAgIGNvZGVjSW5mby0+c2V0T3duZXIoKCJjb2RlYzI6OiIgKyB0cmFpdC5vd25lcikuY19zdHIoKSk7CisKKyAgICAgICAgICAgIGJvb2wgZW5jb2RlciA9IHRyYWl0LmtpbmQgPT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjsKKyAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPE1lZGlhQ29kZWNJbmZvOjpBdHRyaWJ1dGVzPjo6dHlwZSBhdHRycyA9IDA7CisKKyAgICAgICAgICAgIGlmIChlbmNvZGVyKSB7CisgICAgICAgICAgICAgICAgYXR0cnMgfD0gTWVkaWFDb2RlY0luZm86OmtGbGFnSXNFbmNvZGVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRyYWl0Lm93bmVyID09ICJzb2Z0d2FyZSIpIHsKKyAgICAgICAgICAgICAgICBhdHRycyB8PSBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc1NvZnR3YXJlT25seTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXR0cnMgfD0gTWVkaWFDb2RlY0luZm86OmtGbGFnSXNWZW5kb3I7CisgICAgICAgICAgICAgICAgaWYgKHRyYWl0Lm93bmVyID09ICJ2ZW5kb3Itc29mdHdhcmUiKSB7CisgICAgICAgICAgICAgICAgICAgIGF0dHJzIHw9IE1lZGlhQ29kZWNJbmZvOjprRmxhZ0lzU29mdHdhcmVPbmx5OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZWMucXVpcmtTZXQuZmluZCgiYXR0cmlidXRlOjpzb2Z0d2FyZS1jb2RlYyIpCisgICAgICAgICAgICAgICAgICAgICAgICA9PSBjb2RlYy5xdWlya1NldC5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBhdHRycyB8PSBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc0hhcmR3YXJlQWNjZWxlcmF0ZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY29kZWNJbmZvLT5zZXRBdHRyaWJ1dGVzKGF0dHJzKTsKKyAgICAgICAgICAgIGlmICghY29kZWMucmFuay5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgeG1sUmFuazsKKyAgICAgICAgICAgICAgICBjaGFyIGR1bW15OworICAgICAgICAgICAgICAgIGlmIChzc2NhbmYoY29kZWMucmFuay5jX3N0cigpLCAiJXUlYyIsICZ4bWxSYW5rLCAmZHVtbXkpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmFuayA9IHhtbFJhbms7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoInJhbms6ICV1IiwgKHVuc2lnbmVkKXJhbmspOworICAgICAgICAgICAgY29kZWNJbmZvLT5zZXRSYW5rKHJhbmspOworCisgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nICZhbGlhcyA6IGNvZGVjLmFsaWFzZXMpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiYWRkaW5nIGFsaWFzICclcyciLCBhbGlhcy5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb2RlY0luZm8tPmFkZEFsaWFzKGFsaWFzLmNfc3RyKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGF1dG8gdHlwZUl0ID0gY29kZWMudHlwZU1hcC5iZWdpbigpOyB0eXBlSXQgIT0gY29kZWMudHlwZU1hcC5lbmQoKTsgKyt0eXBlSXQpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbWVkaWFUeXBlID0gdHlwZUl0LT5maXJzdDsKKyAgICAgICAgICAgICAgICBjb25zdCBTd2l0Y2ggdHlwZUVuYWJsZWQgPSBpc1NldHRpbmdFbmFibGVkKAorICAgICAgICAgICAgICAgICAgICAgICAgIm1lZGlhLXR5cGUtIiArIG1lZGlhVHlwZSwgc2V0dGluZ3MsIFN3aXRjaDo6RU5BQkxFRF9CWV9ERUZBVUxUKCkpOworICAgICAgICAgICAgICAgIGNvbnN0IFN3aXRjaCBkb21haW5UeXBlRW5hYmxlZCA9IGlzU2V0dGluZ0VuYWJsZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAibWVkaWEtdHlwZS0iICsgbWVkaWFUeXBlICsgKGVuY29kZXIgPyAiLWVuY29kZXIiIDogIi1kZWNvZGVyIiksCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncywgU3dpdGNoOjpFTkFCTEVEX0JZX0RFRkFVTFQoKSk7CisgICAgICAgICAgICAgICAgQUxPR1YoInR5cGUgJyVzLSVzJyBpcyAnJXMvJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5jX3N0cigpLCAoZW5jb2RlciA/ICJlbmNvZGVyIiA6ICJkZWNvZGVyIiksCisgICAgICAgICAgICAgICAgICAgICAgICBhc1N0cmluZyh0eXBlRW5hYmxlZCksIGFzU3RyaW5nKGRvbWFpblR5cGVFbmFibGVkKSk7CisgICAgICAgICAgICAgICAgaWYgKCF0eXBlRW5hYmxlZCB8fCAhZG9tYWluVHlwZUVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIm1lZGlhIHR5cGUgJyVzJyBmb3IgY29kZWMgZW50cnkgJyVzJyBpcyBkaXNhYmxlZCIsIG1lZGlhVHlwZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVPckFsaWFzLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBBTE9HSSgiYWRkaW5nIHR5cGUgJyVzJyIsIHR5cGVJdC0+Zmlyc3QuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkF0dHJpYnV0ZU1hcCAmYXR0ck1hcCA9IHR5cGVJdC0+c2Vjb25kOworICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyPiBjYXBzID0KKyAgICAgICAgICAgICAgICAgICAgY29kZWNJbmZvLT5hZGRNZWRpYVR5cGUobWVkaWFUeXBlLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmdiA6IGF0dHJNYXApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2V5ID0gdi5maXJzdDsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdmFsdWUgPSB2LnNlY29uZDsKKworICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyaWFudFNlcCA9IGtleS5maW5kKCI6OjoiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhcmlhbnRTZXAgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZhcmlhbnQgPSBrZXkuc3Vic3RyKDAsIHZhcmlhbnRTZXApOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3dpdGNoIGVuYWJsZWQgPSBpc1ZhcmlhbnRFeHByZXNzaW9uRW5hYmxlZCh2YXJpYW50LCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigidmFyaWFudCAnJXMnIGlzICclcyciLCB2YXJpYW50LmNfc3RyKCksIGFzU3RyaW5nKGVuYWJsZWQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW5hYmxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0ga2V5LnN1YnN0cih2YXJpYW50U2VwICsgMyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmZpbmQoImZlYXR1cmUtIikgPT0gMCAmJiBrZXkuZmluZCgiZmVhdHVyZS1iaXRyYXRlLW1vZGVzIikgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbnRWYWx1ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgdHJhaWxpbmcgYmFkIGNoYXJhY3RlcnMgYW5kIGRlZmF1bHQgdG8gMC4KKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKXNzY2FuZih2YWx1ZS5jX3N0cigpLCAiJWQiLCAmaW50VmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkRGV0YWlsKGtleS5jX3N0cigpLCBpbnRWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGREZXRhaWwoa2V5LmNfc3RyKCksIHZhbHVlLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYWRkU3VwcG9ydGVkUHJvZmlsZUxldmVscyhpbnRmLCBjYXBzLmdldCgpLCB0cmFpdCwgbWVkaWFUeXBlKTsKKyAgICAgICAgICAgICAgICBhZGRTdXBwb3J0ZWRDb2xvckZvcm1hdHMoaW50ZiwgY2Fwcy5nZXQoKSwgdHJhaXQsIG1lZGlhVHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIGFuZHJvaWQ6Ok1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2UgKkNyZWF0ZUJ1aWxkZXIoKSB7CisgICAgcmV0dXJuIG5ldyBhbmRyb2lkOjpDb2RlYzJJbmZvQnVpbGRlcjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJJbmZvQnVpbGRlci5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkluZm9CdWlsZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBjMTg5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJJbmZvQnVpbGRlci5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9JTkZPX0JVSUxERVJfSF8KKyNkZWZpbmUgQ09ERUMyX0lORk9fQlVJTERFUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDb2RlYzJJbmZvQnVpbGRlciA6IHB1YmxpYyBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlIHsKK3B1YmxpYzoKKyAgICBDb2RlYzJJbmZvQnVpbGRlcigpID0gZGVmYXVsdDsKKyAgICB+Q29kZWMySW5mb0J1aWxkZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisgICAgc3RhdHVzX3QgYnVpbGRNZWRpYUNvZGVjTGlzdChNZWRpYUNvZGVjTGlzdFdyaXRlciogd3JpdGVyKSBvdmVycmlkZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0lORk9fQlVJTERFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0lucHV0U3VyZmFjZVdyYXBwZXIuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9JbnB1dFN1cmZhY2VXcmFwcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIzNTc2MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9JbnB1dFN1cmZhY2VXcmFwcGVyLmgKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOUFVUX1NVUkZBQ0VfV1JBUFBFUl9IXworI2RlZmluZSBJTlBVVF9TVVJGQUNFX1dSQVBQRVJfSF8KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorI2luY2x1ZGUgPHN5c3RlbS9ncmFwaGljcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogV3JhcHBlciBpbnRlcmZhY2UgYXJvdW5kIElucHV0U3VyZmFjZS4KKyAqLworY2xhc3MgSW5wdXRTdXJmYWNlV3JhcHBlciB7CitwdWJsaWM6CisgICAgSW5wdXRTdXJmYWNlV3JhcHBlcigpCisgICAgICAgIDogbURhdGFTcGFjZShIQUxfREFUQVNQQUNFX1VOS05PV04pIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5JbnB1dFN1cmZhY2VXcmFwcGVyKCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogQ29ubmVjdCB0aGUgc3VyZmFjZSB3aXRoIHxjb21wfC4gQSBzdXJmYWNlIGNhbgorICAgICAqIGNvbm5lY3QgdG8gYXQgbW9zdCBvbmUgY29tcG9uZW50IGF0IGEgdGltZS4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gT0sgICAgICAgICAgICAgICBzdWNjZXNzZnVsbHkgY29ubmVjdGVkIHRvIHxjb21wfAorICAgICAqIFxyZXR1cm4gQUxSRUFEWV9FWElTVFMgICBhbHJlYWR5IGNvbm5lY3RlZCB0byBhbm90aGVyIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3QoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBEaXNjb25uZWN0IHRoZSBzdXJmYWNlIGZyb20gdGhlIGNvbXBvbmVudCBpZiBhbnkuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBwdXNoaW5nIGJ1ZmZlcnMgdG8gdGhlIHN1cmZhY2UuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlZjogR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSA9IDA7CisKKyAgICAvLy8gSW5wdXQgU3VyZmFjZSBjb25maWd1cmF0aW9uCisgICAgc3RydWN0IENvbmZpZyB7CisgICAgICAgIC8vIElOIFBBUkFNUyAoR0JTKQorICAgICAgICBmbG9hdCBtTWluRnBzOyAvLyBtaW5pbXVtIGZwcyAocmVwZWF0IGZyYW1lIHRvIGFjaGlldmUgdGhpcykKKyAgICAgICAgZmxvYXQgbU1heEZwczsgLy8gbWF4IGZwcyAodmlhIGZyYW1lIGRyb3ApCisgICAgICAgIGZsb2F0IG1DYXB0dXJlRnBzOyAvLyBjYXB0dXJlIGZwcworICAgICAgICBmbG9hdCBtQ29kZWRGcHM7ICAgLy8gY29kZWQgZnBzCisgICAgICAgIGJvb2wgbVN1c3BlbmRlZDsgLy8gc3VzcGVuZGVkCisgICAgICAgIGludDY0X3QgbVRpbWVPZmZzZXRVczsgLy8gdGltZSBvZmZzZXQgKGlucHV0ID0+IGNvZGVjKQorICAgICAgICBpbnQ2NF90IG1TdXNwZW5kQXRVczsgLy8gc3VzcGVuZC9yZXN1bWUgdGltZQorICAgICAgICBpbnQ2NF90IG1TdGFydEF0VXM7IC8vIHN0YXJ0IHRpbWUKKyAgICAgICAgYm9vbCBtU3RvcHBlZDsgLy8gc3RvcHBlZAorICAgICAgICBpbnQ2NF90IG1TdG9wQXRVczsgLy8gc3RvcCB0aW1lCisKKyAgICAgICAgLy8gT1VUIFBBUkFNUyAoR0JTKQorICAgICAgICBpbnQ2NF90IG1JbnB1dERlbGF5VXM7IC8vIGRlbGF5IGJldHdlZW4gZW5jb2RlciBpbnB1dCBhbmQgc3VyZmFjZSBpbnB1dAorCisgICAgICAgIC8vIElOIFBBUkFNUyAoQ09ERUMgV1JBUFBFUikKKyAgICAgICAgZmxvYXQgbUZpeGVkQWRqdXN0ZWRGcHM7IC8vIGZpeGVkIGZwcyB2aWEgUFRTIG1hbmlwdWxhdGlvbgorICAgICAgICBmbG9hdCBtTWluQWRqdXN0ZWRGcHM7IC8vIG1pbmltdW0gZnBzIHZpYSBQVFMgbWFuaXB1bGF0aW9uCisgICAgICAgIHVpbnQ2NF90IG1Vc2FnZTsgLy8gY29uc3VtZXIgdXNhZ2UKKyAgICB9OworCisgICAgLyoqCisgICAgICogQ29uZmlndXJlcyBpbnB1dCBzdXJmYWNlLgorICAgICAqCisgICAgICogXHBhcmFtIGNvbmZpZyBjb25maWd1cmF0aW9uLiBUaGlzIGNhbiBiZSB1cGRhdGVkIGR1cmluZyB0aGlzIGNhbGwgdG8gcHJvdmlkZSBvdXRwdXQKKyAgICAgKiAgICAgICAgICAgICAgIHBhcmFtZXRlcnMsIGJ1dCBub3QgdG8gcHJvdmlkZSBjb25maWd1cmVkIHBhcmFtZXRlcnMgKHRvIGF2b2lkIGNvbnRpbnVhbGx5CisgICAgICogICAgICAgICAgICAgICByZWNvbmZpZ3VyaW5nKQorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlKENvbmZpZyAmY29uZmlnKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmVzIGRlc2lyZWQgZGF0YSBzcGFjZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBkYXRhU3BhY2UgZGVzaXJlZCBkYXRhIHNwYWNlCisgICAgICovCisgICAgaW5saW5lIHZvaWQgc2V0RGF0YVNwYWNlKGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSkgeworICAgICAgICBtRGF0YVNwYWNlID0gZGF0YVNwYWNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFuIHVwIEMyV29yayByZWxhdGVkIHJlZmVyZW5jZXMgaWYgbmVjZXNzYXJ5LiBOby1vcCBieSBkZWZhdWx0LgorICAgICAqCisgICAgICogXHBhcmFtIGluZGV4IGluZGV4IG9mIGlucHV0IHdvcmsuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIG9uSW5wdXRCdWZmZXJEb25lKGMyX2NudHI2NF90IC8qIGluZGV4ICovKSB7fQorCitwcm90ZWN0ZWQ6CisgICAgYW5kcm9pZF9kYXRhc3BhY2UgbURhdGFTcGFjZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gSU5QVVRfU1VSRkFDRV9XUkFQUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUGlwZWxpbmVXYXRjaGVyLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9QaXBlbGluZVdhdGNoZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0ZDE0ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUGlwZWxpbmVXYXRjaGVyLmNwcApAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJQaXBlbGluZVdhdGNoZXIiCisKKyNpbmNsdWRlIDxudW1lcmljPgorCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSAiUGlwZWxpbmVXYXRjaGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworUGlwZWxpbmVXYXRjaGVyICZQaXBlbGluZVdhdGNoZXI6OmlucHV0RGVsYXkodWludDMyX3QgdmFsdWUpIHsKKyAgICBtSW5wdXREZWxheSA9IHZhbHVlOworICAgIHJldHVybiAqdGhpczsKK30KKworUGlwZWxpbmVXYXRjaGVyICZQaXBlbGluZVdhdGNoZXI6OnBpcGVsaW5lRGVsYXkodWludDMyX3QgdmFsdWUpIHsKKyAgICBtUGlwZWxpbmVEZWxheSA9IHZhbHVlOworICAgIHJldHVybiAqdGhpczsKK30KKworUGlwZWxpbmVXYXRjaGVyICZQaXBlbGluZVdhdGNoZXI6Om91dHB1dERlbGF5KHVpbnQzMl90IHZhbHVlKSB7CisgICAgbU91dHB1dERlbGF5ID0gdmFsdWU7CisgICAgcmV0dXJuICp0aGlzOworfQorCitQaXBlbGluZVdhdGNoZXIgJlBpcGVsaW5lV2F0Y2hlcjo6c21vb3RobmVzc0ZhY3Rvcih1aW50MzJfdCB2YWx1ZSkgeworICAgIG1TbW9vdGhuZXNzRmFjdG9yID0gdmFsdWU7CisgICAgcmV0dXJuICp0aGlzOworfQorCit2b2lkIFBpcGVsaW5lV2F0Y2hlcjo6b25Xb3JrUXVldWVkKAorICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+PiAmJmJ1ZmZlcnMsCisgICAgICAgIGNvbnN0IENsb2NrOjp0aW1lX3BvaW50ICZxdWV1ZWRBdCkgeworICAgIEFMT0dWKCJvbldvcmtRdWV1ZWQoZnJhbWVJbmRleD0lbGx1LCBidWZmZXJzKHNpemU9JXp1KSwgcXVldWVkQXQ9JWxsZCkiLAorICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZnJhbWVJbmRleCwKKyAgICAgICAgICBidWZmZXJzLnNpemUoKSwKKyAgICAgICAgICAobG9uZyBsb25nKXF1ZXVlZEF0LnRpbWVfc2luY2VfZXBvY2goKS5jb3VudCgpKTsKKyAgICBhdXRvIGl0ID0gbUZyYW1lc0luUGlwZWxpbmUuZmluZChmcmFtZUluZGV4KTsKKyAgICBpZiAoaXQgIT0gbUZyYW1lc0luUGlwZWxpbmUuZW5kKCkpIHsKKyAgICAgICAgQUxPR0QoIm9uV29ya1F1ZXVlZDogRHVwbGljYXRlIGZyYW1lIGluZGV4ICglbGx1KTsgcHJldmlvdXMgZW50cnkgcmVtb3ZlZCIsCisgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZnJhbWVJbmRleCk7CisgICAgICAgICh2b2lkKW1GcmFtZXNJblBpcGVsaW5lLmVyYXNlKGl0KTsKKyAgICB9CisgICAgKHZvaWQpbUZyYW1lc0luUGlwZWxpbmUudHJ5X2VtcGxhY2UoZnJhbWVJbmRleCwgc3RkOjptb3ZlKGJ1ZmZlcnMpLCBxdWV1ZWRBdCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gUGlwZWxpbmVXYXRjaGVyOjpvbklucHV0QnVmZmVyUmVsZWFzZWQoCisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsIHNpemVfdCBhcnJheUluZGV4KSB7CisgICAgQUxPR1YoIm9uSW5wdXRCdWZmZXJSZWxlYXNlZChmcmFtZUluZGV4PSVsbHUsIGFycmF5SW5kZXg9JXp1KSIsCisgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylmcmFtZUluZGV4LCBhcnJheUluZGV4KTsKKyAgICBhdXRvIGl0ID0gbUZyYW1lc0luUGlwZWxpbmUuZmluZChmcmFtZUluZGV4KTsKKyAgICBpZiAoaXQgPT0gbUZyYW1lc0luUGlwZWxpbmUuZW5kKCkpIHsKKyAgICAgICAgQUxPR0QoIm9uSW5wdXRCdWZmZXJSZWxlYXNlZDogZnJhbWVJbmRleCBub3QgZm91bmQgKCVsbHUpOyBpZ25vcmVkIiwKKyAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylmcmFtZUluZGV4KTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGlmIChpdC0+c2Vjb25kLmJ1ZmZlcnMuc2l6ZSgpIDw9IGFycmF5SW5kZXgpIHsKKyAgICAgICAgQUxPR0QoIm9uSW5wdXRCdWZmZXJSZWxlYXNlZDogYnVmZmVycyBhdCAlbGx1OiBzaXplICV6dSwgcmVxdWVzdGVkIGluZGV4OiAlenUiLAorICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWZyYW1lSW5kZXgsIGl0LT5zZWNvbmQuYnVmZmVycy5zaXplKCksIGFycmF5SW5kZXgpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIoc3RkOjptb3ZlKGl0LT5zZWNvbmQuYnVmZmVyc1thcnJheUluZGV4XSkpOworICAgIEFMT0dEX0lGKCFidWZmZXIsICJvbklucHV0QnVmZmVyUmVsZWFzZWQ6IGJ1ZmZlciBhbHJlYWR5IHJlbGVhc2VkICglbGx1OiV6dSkiLAorICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZnJhbWVJbmRleCwgYXJyYXlJbmRleCk7CisgICAgcmV0dXJuIGJ1ZmZlcjsKK30KKwordm9pZCBQaXBlbGluZVdhdGNoZXI6Om9uV29ya0RvbmUodWludDY0X3QgZnJhbWVJbmRleCkgeworICAgIEFMT0dWKCJvbldvcmtEb25lKGZyYW1lSW5kZXg9JWxsdSkiLCAodW5zaWduZWQgbG9uZyBsb25nKWZyYW1lSW5kZXgpOworICAgIGF1dG8gaXQgPSBtRnJhbWVzSW5QaXBlbGluZS5maW5kKGZyYW1lSW5kZXgpOworICAgIGlmIChpdCA9PSBtRnJhbWVzSW5QaXBlbGluZS5lbmQoKSkgeworICAgICAgICBBTE9HRCgib25Xb3JrRG9uZTogZnJhbWVJbmRleCBub3QgZm91bmQgKCVsbHUpOyBpZ25vcmVkIiwKKyAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylmcmFtZUluZGV4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAodm9pZCltRnJhbWVzSW5QaXBlbGluZS5lcmFzZShpdCk7Cit9CisKK3ZvaWQgUGlwZWxpbmVXYXRjaGVyOjpmbHVzaCgpIHsKKyAgICBtRnJhbWVzSW5QaXBlbGluZS5jbGVhcigpOworfQorCitib29sIFBpcGVsaW5lV2F0Y2hlcjo6cGlwZWxpbmVGdWxsKCkgY29uc3QgeworICAgIGlmIChtRnJhbWVzSW5QaXBlbGluZS5zaXplKCkgPj0KKyAgICAgICAgICAgIG1JbnB1dERlbGF5ICsgbVBpcGVsaW5lRGVsYXkgKyBtT3V0cHV0RGVsYXkgKyBtU21vb3RobmVzc0ZhY3RvcikgeworICAgICAgICBBTE9HVigicGlwZWxpbmVGdWxsOiB0b28gbWFueSBmcmFtZXMgaW4gcGlwZWxpbmUgKCV6dSkiLCBtRnJhbWVzSW5QaXBlbGluZS5zaXplKCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgc2l6ZV90IHNpemVXaXRoSW5wdXRSZWxlYXNlZCA9IHN0ZDo6Y291bnRfaWYoCisgICAgICAgICAgICBtRnJhbWVzSW5QaXBlbGluZS5iZWdpbigpLAorICAgICAgICAgICAgbUZyYW1lc0luUGlwZWxpbmUuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBkZWNsdHlwZShtRnJhbWVzSW5QaXBlbGluZSk6OnZhbHVlX3R5cGUgJnZhbHVlKSB7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIgOiB2YWx1ZS5zZWNvbmQuYnVmZmVycykgeworICAgICAgICAgICAgICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoc2l6ZVdpdGhJbnB1dFJlbGVhc2VkID49CisgICAgICAgICAgICBtUGlwZWxpbmVEZWxheSArIG1PdXRwdXREZWxheSArIG1TbW9vdGhuZXNzRmFjdG9yKSB7CisgICAgICAgIEFMT0dWKCJwaXBlbGluZUZ1bGw6IHRvbyBtYW55IGZyYW1lcyBpbiBwaXBlbGluZSwgd2l0aCBpbnB1dCByZWxlYXNlZCAoJXp1KSIsCisgICAgICAgICAgICAgIHNpemVXaXRoSW5wdXRSZWxlYXNlZCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHNpemVfdCBzaXplV2l0aElucHV0c1BlbmRpbmcgPSBtRnJhbWVzSW5QaXBlbGluZS5zaXplKCkgLSBzaXplV2l0aElucHV0UmVsZWFzZWQ7CisgICAgaWYgKHNpemVXaXRoSW5wdXRzUGVuZGluZyA+IG1QaXBlbGluZURlbGF5ICsgbUlucHV0RGVsYXkgKyBtU21vb3RobmVzc0ZhY3RvcikgeworICAgICAgICBBTE9HVigicGlwZWxpbmVGdWxsOiB0b28gbWFueSBpbnB1dHMgcGVuZGluZyAoJXp1KSBpbiBwaXBlbGluZSwgd2l0aCBpbnB1dHMgcmVsZWFzZWQgKCV6dSkiLAorICAgICAgICAgICAgICBzaXplV2l0aElucHV0c1BlbmRpbmcsIHNpemVXaXRoSW5wdXRSZWxlYXNlZCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBBTE9HVigicGlwZWxpbmUgaGFzIHJvb20gKHRvdGFsOiAlenUsIGlucHV0IHJlbGVhc2VkOiAlenUpIiwKKyAgICAgICAgICBtRnJhbWVzSW5QaXBlbGluZS5zaXplKCksIHNpemVXaXRoSW5wdXRSZWxlYXNlZCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCitQaXBlbGluZVdhdGNoZXI6OkNsb2NrOjpkdXJhdGlvbiBQaXBlbGluZVdhdGNoZXI6OmVsYXBzZWQoCisgICAgICAgIGNvbnN0IFBpcGVsaW5lV2F0Y2hlcjo6Q2xvY2s6OnRpbWVfcG9pbnQgJm5vdywgc2l6ZV90IG4pIGNvbnN0IHsKKyAgICBpZiAobUZyYW1lc0luUGlwZWxpbmUuc2l6ZSgpIDw9IG4pIHsKKyAgICAgICAgcmV0dXJuIENsb2NrOjpkdXJhdGlvbjo6emVybygpOworICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxDbG9jazo6ZHVyYXRpb24+IGR1cmF0aW9uczsKKyAgICBmb3IgKGNvbnN0IGRlY2x0eXBlKG1GcmFtZXNJblBpcGVsaW5lKTo6dmFsdWVfdHlwZSAmdmFsdWUgOiBtRnJhbWVzSW5QaXBlbGluZSkgeworICAgICAgICBDbG9jazo6ZHVyYXRpb24gZWxhcHNlZCA9IG5vdyAtIHZhbHVlLnNlY29uZC5xdWV1ZWRBdDsKKyAgICAgICAgQUxPR1YoImVsYXBzZWQ6IGZyYW1lSW5kZXggPSAlbGx1IGVsYXBzZWQgPSAlbGxkbXMiLAorICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXZhbHVlLmZpcnN0LAorICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6ZHVyYXRpb25fY2FzdDxzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzPihlbGFwc2VkKS5jb3VudCgpKTsKKyAgICAgICAgZHVyYXRpb25zLnB1c2hfYmFjayhlbGFwc2VkKTsKKyAgICB9CisgICAgc3RkOjpudGhfZWxlbWVudChkdXJhdGlvbnMuYmVnaW4oKSwgZHVyYXRpb25zLmVuZCgpLCBkdXJhdGlvbnMuYmVnaW4oKSArIG4sCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OmdyZWF0ZXI8Q2xvY2s6OmR1cmF0aW9uPigpKTsKKyAgICByZXR1cm4gZHVyYXRpb25zW25dOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1BpcGVsaW5lV2F0Y2hlci5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1BpcGVsaW5lV2F0Y2hlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMjMxNDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUGlwZWxpbmVXYXRjaGVyLmgKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgUElQRUxJTkVfV0FUQ0hFUl9IXworI2RlZmluZSBQSVBFTElORV9XQVRDSEVSX0hfCisKKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPEMyV29yay5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogUGlwZWxpbmVXYXRjaGVyIHdhdGNoZXMgdGhlIHBpcGVsaW5lIGFuZCBpbmZlcnMgdGhlIHN0YXR1cyBvZiB3b3JrIGl0ZW1zIGZyb20KKyAqIGV2ZW50cy4KKyAqLworY2xhc3MgUGlwZWxpbmVXYXRjaGVyIHsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2sgQ2xvY2s7CisKKyAgICBQaXBlbGluZVdhdGNoZXIoKQorICAgICAgICA6IG1JbnB1dERlbGF5KDApLAorICAgICAgICAgIG1QaXBlbGluZURlbGF5KDApLAorICAgICAgICAgIG1PdXRwdXREZWxheSgwKSwKKyAgICAgICAgICBtU21vb3RobmVzc0ZhY3RvcigwKSB7fQorICAgIH5QaXBlbGluZVdhdGNoZXIoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIG5ldyBpbnB1dCBkZWxheSB2YWx1ZQorICAgICAqIFxyZXR1cm4gIHRoaXMgb2JqZWN0CisgICAgICovCisgICAgUGlwZWxpbmVXYXRjaGVyICZpbnB1dERlbGF5KHVpbnQzMl90IHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgbmV3IHBpcGVsaW5lIGRlbGF5IHZhbHVlCisgICAgICogXHJldHVybiAgdGhpcyBvYmplY3QKKyAgICAgKi8KKyAgICBQaXBlbGluZVdhdGNoZXIgJnBpcGVsaW5lRGVsYXkodWludDMyX3QgdmFsdWUpOworCisgICAgLyoqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSBuZXcgb3V0cHV0IGRlbGF5IHZhbHVlCisgICAgICogXHJldHVybiAgdGhpcyBvYmplY3QKKyAgICAgKi8KKyAgICBQaXBlbGluZVdhdGNoZXIgJm91dHB1dERlbGF5KHVpbnQzMl90IHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgbmV3IHNtb290aG5lc3MgZmFjdG9yIHZhbHVlCisgICAgICogXHJldHVybiAgdGhpcyBvYmplY3QKKyAgICAgKi8KKyAgICBQaXBlbGluZVdhdGNoZXIgJnNtb290aG5lc3NGYWN0b3IodWludDMyX3QgdmFsdWUpOworCisgICAgLyoqCisgICAgICogQ2xpZW50IHF1ZXVlZCBhIHdvcmsgaXRlbSB0byB0aGUgY29tcG9uZW50LgorICAgICAqCisgICAgICogXHBhcmFtIGZyYW1lSW5kZXggIGlucHV0IGZyYW1lIGluZGV4IG9mIHRoaXMgd29yaworICAgICAqIFxwYXJhbSBidWZmZXJzICAgICBpbnB1dCBidWZmZXJzIG9mIHRoZSBxdWV1ZWQgd29yayBpdGVtCisgICAgICogXHBhcmFtIHF1ZXVlZEF0ICAgIHRpbWUgd2hlbiB0aGUgY2xpZW50IHF1ZXVlZCB0aGUgYnVmZmVyCisgICAgICovCisgICAgdm9pZCBvbldvcmtRdWV1ZWQoCisgICAgICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPj4gJiZidWZmZXJzLAorICAgICAgICAgICAgY29uc3QgQ2xvY2s6OnRpbWVfcG9pbnQgJnF1ZXVlZEF0KTsKKworICAgIC8qKgorICAgICAqIFRoZSBjb21wb25lbnQgcmVsZWFzZWQgaW5wdXQgYnVmZmVycyBmcm9tIGEgd29yayBpdGVtLgorICAgICAqCisgICAgICogXHBhcmFtIGZyYW1lSW5kZXggIGlucHV0IGZyYW1lIGluZGV4CisgICAgICogXHBhcmFtIGFycmF5SW5kZXggIGluZGV4IG9mIHRoZSBidWZmZXIgYXQgdGhlIG9yaWdpbmFsIHxidWZmZXJzfCBpbgorICAgICAqICAgICAgICAgICAgICAgICAgICBvbldvcmtRdWV1ZWQoKS4KKyAgICAgKiBccmV0dXJuICBidWZmZXJzW2FycmF5SW5kZXhdCisgICAgICovCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBvbklucHV0QnVmZmVyUmVsZWFzZWQoCisgICAgICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LCBzaXplX3QgYXJyYXlJbmRleCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29tcG9uZW50IGZpbmlzaGVkIHByb2Nlc3NpbmcgYSB3b3JrIGl0ZW0uCisgICAgICoKKyAgICAgKiBccGFyYW0gZnJhbWVJbmRleCAgaW5wdXQgZnJhbWUgaW5kZXgKKyAgICAgKi8KKyAgICB2b2lkIG9uV29ya0RvbmUodWludDY0X3QgZnJhbWVJbmRleCk7CisKKyAgICAvKioKKyAgICAgKiBGbHVzaCB0aGUgcGlwZWxpbmUuCisgICAgICovCisgICAgdm9pZCBmbHVzaCgpOworCisgICAgLyoqCisgICAgICogXHJldHVybiAgdHJ1ZSAgaWYgcGlwZWxpbmUgZG9lcyBub3QgbmVlZCBtb3JlIHdvcmsgaXRlbXMgdG8gcHJvY2VlZAorICAgICAqICAgICAgICAgICAgICAgIHNtb290aGx5LCBjb25zaWRlcmluZyBkZWxheXMgYW5kIHNtb290aG5lc3MgZmFjdG9yOworICAgICAqICAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sIHBpcGVsaW5lRnVsbCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJuIGVsYXBzZWQgcHJvY2Vzc2luZyB0aW1lIG9mIGEgd29yayBpdGVtLCBudGggZnJvbSB0aGUgbG9uZ2VzdAorICAgICAqIHByb2Nlc3NpbmcgdGltZSB0byB0aGUgc2hvcnRlc3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gbm93IGN1cnJlbnQgdGltZXN0YW1wCisgICAgICogXHBhcmFtIG4gICBudGggd29yayBpdGVtLCBmcm9tIHRoZSBsb25nZXN0IHByb2Nlc3NpbmcgdGltZSB0byB0aGUKKyAgICAgKiAgICAgICAgICAgIHNob3J0ZXN0LiBJdCdzIGEgMC1iYXNlZCBpbmRleC4KKyAgICAgKiBccmV0dXJuICBlbGFwc2VkIHByb2Nlc3NpbmcgdGltZSBvZiBudGggd29yayBpdGVtLgorICAgICAqLworICAgIENsb2NrOjpkdXJhdGlvbiBlbGFwc2VkKGNvbnN0IENsb2NrOjp0aW1lX3BvaW50ICZub3csIHNpemVfdCBuKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICB1aW50MzJfdCBtSW5wdXREZWxheTsKKyAgICB1aW50MzJfdCBtUGlwZWxpbmVEZWxheTsKKyAgICB1aW50MzJfdCBtT3V0cHV0RGVsYXk7CisgICAgdWludDMyX3QgbVNtb290aG5lc3NGYWN0b3I7CisKKyAgICBzdHJ1Y3QgRnJhbWUgeworICAgICAgICBGcmFtZShzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+PiAmJmIsCisgICAgICAgICAgICAgIGNvbnN0IENsb2NrOjp0aW1lX3BvaW50ICZxKQorICAgICAgICAgICAgOiBidWZmZXJzKGIpLAorICAgICAgICAgICAgICBxdWV1ZWRBdChxKSB7fQorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+PiBidWZmZXJzOworICAgICAgICBjb25zdCBDbG9jazo6dGltZV9wb2ludCBxdWV1ZWRBdDsKKyAgICB9OworICAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBGcmFtZT4gbUZyYW1lc0luUGlwZWxpbmU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFBJUEVMSU5FX1dBVENIRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9SZWZsZWN0ZWRQYXJhbVVwZGF0ZXIuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1JlZmxlY3RlZFBhcmFtVXBkYXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTViMGVjOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9SZWZsZWN0ZWRQYXJhbVVwZGF0ZXIuY3BwCkBAIC0wLDAgKzEsNTgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJSZWZsZWN0ZWRQYXJhbVVwZGF0ZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3N0cmVhbT4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBhcmFtSW50ZXJuYWwuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisKKyNpbmNsdWRlICJSZWZsZWN0ZWRQYXJhbVVwZGF0ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGQ6OnN0cmluZyBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3Q6OmRlYnVnU3RyaW5nKHNpemVfdCBpbmRlbnRfKSBjb25zdCB7CisgICAgc3RkOjpzdHJpbmcgaW5kZW50KGluZGVudF8sICcgJyk7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gczsKKyAgICBzIDw8ICJEaWN0IHsiIDw8IHN0ZDo6ZW5kbDsKKworICAgIGZvciAoY29uc3QgYXV0byAmaXQgOiAqdGhpcykgeworICAgICAgICBzIDw8IGluZGVudCA8PCAiICAiOworCisgICAgICAgIEMyVmFsdWUgYzJWYWx1ZTsKKyAgICAgICAgaW50MzJfdCBpbnQzMlZhbHVlOworICAgICAgICB1aW50MzJfdCB1aW50MzJWYWx1ZTsKKyAgICAgICAgaW50NjRfdCBpbnQ2NFZhbHVlOworICAgICAgICB1aW50NjRfdCB1aW50NjRWYWx1ZTsKKyAgICAgICAgZmxvYXQgZmxvYXRWYWx1ZTsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmVmFsdWU7CisgICAgICAgIEFTdHJpbmcgc3RyVmFsdWU7CisgICAgICAgIGlmIChpdC5zZWNvbmQuZmluZCgmYzJWYWx1ZSkpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoYzJWYWx1ZS50eXBlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OklOVDMyOgorICAgICAgICAgICAgICAgICAgICAodm9pZCljMlZhbHVlLmdldCgmaW50MzJWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHMgPDwgImMyOjppMzIgIiA8PCBpdC5maXJzdCA8PCAiID0gIiA8PCBpbnQzMlZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OlVJTlQzMjoKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpYzJWYWx1ZS5nZXQoJnVpbnQzMlZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcyA8PCAiYzI6OnUzMiAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IHVpbnQzMlZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OkNOVFIzMjoKKyAgICAgICAgICAgICAgICAgICAgLy8gZHVtcCBjb3VudGVyIHZhbHVlIGFzIHVuc2lnbmVkCisgICAgICAgICAgICAgICAgICAgICh2b2lkKWMyVmFsdWUuZ2V0KChjMl9jbnRyMzJfdCopJnVpbnQzMlZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcyA8PCAiYzI6OmMzMiAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IHVpbnQzMlZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OklOVDY0OgorICAgICAgICAgICAgICAgICAgICAodm9pZCljMlZhbHVlLmdldCgmaW50NjRWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHMgPDwgImMyOjppNjQgIiA8PCBpdC5maXJzdCA8PCAiID0gIiA8PCBpbnQ2NFZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OlVJTlQ2NDoKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpYzJWYWx1ZS5nZXQoJnVpbnQ2NFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcyA8PCAiYzI6OnU2NCAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IHVpbnQ2NFZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OkNOVFI2NDoKKyAgICAgICAgICAgICAgICAgICAgLy8gZHVtcCBjb3VudGVyIHZhbHVlIGFzIHVuc2lnbmVkCisgICAgICAgICAgICAgICAgICAgICh2b2lkKWMyVmFsdWUuZ2V0KChjMl9jbnRyNjRfdCopJnVpbnQ2NFZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcyA8PCAiYzI6OmM2NCAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IHVpbnQ2NFZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyVmFsdWU6OkZMT0FUOgorICAgICAgICAgICAgICAgICAgICAodm9pZCljMlZhbHVlLmdldCgmZmxvYXRWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHMgPDwgImMyOjpmbG9hdCAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IGZsb2F0VmFsdWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIC8vIGR1bXAgdW5zdXBwb3J0ZWQgdmFsdWVzIGZvciBkZWJ1Z2dpbmcsIHRoZXNlIHNob3VsZCBub3QgYmUgdXNlZAorICAgICAgICAgICAgICAgICAgICBzIDw8ICJjMjo6dW5zdXBwb3J0ZWQgIiA8PCBpdC5maXJzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChpdC5zZWNvbmQuZmluZCgmaW50MzJWYWx1ZSkpIHsKKyAgICAgICAgICAgIHMgPDwgImludDMyX3QgIiA8PCBpdC5maXJzdCA8PCAiID0gIiA8PCBpbnQzMlZhbHVlOworICAgICAgICB9IGVsc2UgaWYgKGl0LnNlY29uZC5maW5kKCZpbnQ2NFZhbHVlKSkgeworICAgICAgICAgICAgcyA8PCAiaW50NjRfdCAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiIDw8IGludDY0VmFsdWU7CisgICAgICAgIH0gZWxzZSBpZiAoaXQuc2Vjb25kLmZpbmQoJnN0clZhbHVlKSkgeworICAgICAgICAgICAgcyA8PCAic3RyaW5nICIgPDwgaXQuZmlyc3QgPDwgIiA9IFwiIiA8PCBzdHJWYWx1ZS5jX3N0cigpIDw8ICJcIiI7CisgICAgICAgIH0gZWxzZSBpZiAoaXQuc2Vjb25kLmZpbmQoJmJ1ZlZhbHVlKSkgeworICAgICAgICAgICAgcyA8PCAiQnVmZmVyICIgPDwgaXQuZmlyc3QgPDwgIiA9ICI7CisgICAgICAgICAgICBpZiAoYnVmVmFsdWUgIT0gbnVsbHB0ciAmJiBidWZWYWx1ZS0+ZGF0YSgpICE9IG51bGxwdHIgJiYgYnVmVmFsdWUtPnNpemUoKSA8PSA2NCkgeworICAgICAgICAgICAgICAgIHMgPDwgInsiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgICAgICBBU3RyaW5nIHRtcDsKKyAgICAgICAgICAgICAgICBoZXhkdW1wKGJ1ZlZhbHVlLT5kYXRhKCksIGJ1ZlZhbHVlLT5zaXplKCksIGluZGVudF8gKyA0LCAmdG1wKTsKKyAgICAgICAgICAgICAgICBzIDw8IHRtcC5jX3N0cigpIDw8IGluZGVudCA8PCAiICB9IjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcyA8PCAodm9pZCopYnVmVmFsdWUuZ2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBkdW1wIHVuc3VwcG9ydGVkIHZhbHVlcyBmb3IgZGVidWdnaW5nLCB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4uCisgICAgICAgICAgICBzIDw8ICJ1bnN1cHBvcnRlZCAiIDw8IGl0LmZpcnN0OworICAgICAgICB9CisgICAgICAgIHMgPDwgc3RkOjplbmRsOworICAgIH0KKyAgICBzIDw8IGluZGVudCA8PCAifSI7CisKKyAgICByZXR1cm4gcy5zdHIoKTsKK30KKwordm9pZCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OmFkZFBhcmFtRGVzYygKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICZwYXJhbURlc2NzKSB7CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+ICZkZXNjIDogcGFyYW1EZXNjcykgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBzdHJ1Y3REZXNjID0gcmVmbGVjdG9yLT5kZXNjcmliZSgKKyAgICAgICAgICAgICAgICBkZXNjLT5pbmRleCgpLmNvcmVJbmRleCgpKTsKKyAgICAgICAgaWYgKHN0cnVjdERlc2MgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCBkZXNjcmliZSAlcyIsIGRlc2MtPm5hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGFkZFBhcmFtRGVzYyhkZXNjLCAqc3RydWN0RGVzYywgcmVmbGVjdG9yLCB0cnVlIC8qIG1hcmtWZW5kb3IgKi8pOworICAgIH0KKworICAgIC8vIFRFTVA6IGFsc28gYWRkIHZlbmRvciBwYXJhbWV0ZXJzIGFzIG5vbi12ZW5kb3IKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gJmRlc2MgOiBwYXJhbURlc2NzKSB7CisgICAgICAgIGlmICghZGVzYy0+aW5kZXgoKS5pc1ZlbmRvcigpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBzdHJ1Y3REZXNjID0gcmVmbGVjdG9yLT5kZXNjcmliZSgKKyAgICAgICAgICAgICAgICBkZXNjLT5pbmRleCgpLmNvcmVJbmRleCgpKTsKKyAgICAgICAgaWYgKHN0cnVjdERlc2MpIHsKKyAgICAgICAgICAgIGFkZFBhcmFtRGVzYyhkZXNjLCAqc3RydWN0RGVzYywgcmVmbGVjdG9yLCBmYWxzZSAvKiBtYXJrVmVuZG9yICovKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OmFkZFBhcmFtU3RydWN0RGVzYygKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiBkZXNjLAorICAgICAgICBDMlN0cmluZyBwYXRoLAorICAgICAgICBzaXplX3Qgb2Zmc2V0LAorICAgICAgICBjb25zdCBDMlN0cnVjdERlc2NyaXB0b3IgJnN0cnVjdERlc2MsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKSB7CisgICAgZm9yIChhdXRvIGl0ID0gc3RydWN0RGVzYy5iZWdpbigpOyBpdCAhPSBzdHJ1Y3REZXNjLmVuZCgpOyArK2l0KSB7CisgICAgICAgIEMyU3RyaW5nIGZpZWxkTmFtZSA9IHBhdGggKyAiLiIgKyBpdC0+bmFtZSgpOworICAgICAgICBpZiAoaXQtPnR5cGUoKSAmIEMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRykgeworICAgICAgICAgICAgaWYgKHJlZmxlY3RvciA9PSBudWxscHRyIHx8IGl0LT5leHRlbnQoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImlnbm9yZWQgc3RydWN0IGZpZWxkICVzIiwgZmllbGROYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gc3RydWN0RGVzY18gPSByZWZsZWN0b3ItPmRlc2NyaWJlKAorICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXgoaXQtPnR5cGUoKSkuY29yZUluZGV4KCkpOworICAgICAgICAgICAgaWYgKHN0cnVjdERlc2NfID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiQ291bGQgbm90IGRlc2NyaWJlIHN0cnVjdHVyZSBvZiAlcyIsIGZpZWxkTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZFBhcmFtU3RydWN0RGVzYyhkZXNjLCBmaWVsZE5hbWUsIG9mZnNldCArIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRPZmZzZXQoKml0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RydWN0RGVzY18sIHJlZmxlY3Rvcik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZlcmlmeSBleHRlbnQgYW5kIHR5cGUKKyAgICAgICAgc3dpdGNoIChpdC0+dHlwZSgpKSB7CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQzMjoKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQzMjoKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkNOVFIzMjoKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDY0OgorICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDY0OgorICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6Q05UUjY0OgorICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6RkxPQVQ6CisgICAgICAgICAgICAgICAgaWYgKGl0LT5leHRlbnQoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJleHRlbnQoKSAhPSAxIGZvciBzaW5nbGUgdmFsdWUgdHlwZTogJXMiLCBmaWVsZE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlNUUklORzoKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkJMT0I6CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0QoIlVucmVjb2duaXplZCB0eXBlOiAlcyIsIGZpZWxkTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCIlcyByZWdpc3RlcmVkIiwgZmllbGROYW1lLmNfc3RyKCkpOworICAgICAgICAvLyBUT0RPOiBnZXQgdGhlIHByb3BlciBzaXplIGJ5IGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBmaWVsZHMuCisgICAgICAgIC8vIG9ubHkgaW5zZXJ0IGZpZWxkcyB0aGUgdmVyeSBmaXJzdCB0aW1lCisgICAgICAgIG1NYXAuZW1wbGFjZShmaWVsZE5hbWUsIEZpZWxkRGVzYyB7CisgICAgICAgICAgICBkZXNjLAorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDMkZpZWxkRGVzY3JpcHRvcj4oCisgICAgICAgICAgICAgICAgICAgIGl0LT50eXBlKCksIGl0LT5leHRlbnQoKSwgaXQtPm5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldCgqaXQpLAorICAgICAgICAgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0U2l6ZSgqaXQpKSwKKyAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgfSk7CisgICAgfQorfQorCit2b2lkIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6YWRkUGFyYW1EZXNjKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+IGRlc2MsIGNvbnN0IEMyU3RydWN0RGVzY3JpcHRvciAmc3RydWN0RGVzYywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IsIGJvb2wgbWFya1ZlbmRvcikgeworICAgIEMyU3RyaW5nIHBhcmFtTmFtZSA9IGRlc2MtPm5hbWUoKTsKKworICAgIC8vIERvIG5vdCByZWZsZWN0IHJlcXVlc3RlZCBwYXJhbWV0ZXJzCisgICAgLy8gVE9ETzogc3BsaXQgdGhlc2Ugb25jZSBhbGlhc2VzIGFyZSBpbnRyb2R1Y2VkIGludG8gJy5hY3R1YWwnIGFuZCAnLnJlcXVlc3RlZCcgYW5kIGFsaWFzCisgICAgLy8gdGhlIG5hbWUgdG8gJy5hY3R1YWwnLgorICAgIGlmIChkZXNjLT5pbmRleCgpICYgQzJQYXJhbTo6Q29yZUluZGV4OjpJU19SRVFVRVNUX0ZMQUcpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIHByZWZpeCB2ZW5kb3IgcGFyYW1ldGVycworICAgIGlmIChkZXNjLT5pbmRleCgpLmlzVmVuZG9yKCkgJiYgbWFya1ZlbmRvcikgeworICAgICAgICBwYXJhbU5hbWUgPSAidmVuZG9yLiIgKyBwYXJhbU5hbWU7CisgICAgfQorICAgIG1QYXJhbU5hbWVzLmVtcGxhY2UoZGVzYy0+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+KHBhcmFtc1swXSktPm0udTY0KTsKKyAgICBFWFBFQ1RfU1RSRVEoIjE1MTYiLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLnN0cik7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM4ZjAyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDAgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGlic2ZwbHVnaW5fY2NvZGVjX3V0aWxzIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiQ29kZWMyQnVmZmVyVXRpbHMuY3BwIiwKKyAgICAgICAgIkNvZGVjMk1hcHBlci5jcHAiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICIuIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJ5dXZfc3RhdGljIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYyYTA3ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5jcHAKQEAgLTAsMCArMSw1MzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyQnVmZmVyVXRpbHMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxsaWJ5dXYuaD4KKworI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bXV0ZXg+CisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisKKyNpbmNsdWRlICJDb2RlYzJCdWZmZXJVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKKy8qKgorICogQSBmbGlwcGFibGUsIG9wdGltaXphYmxlIG1lbWNweS4gQ29uc3RydWN0cyBzdWNoIGFzIChmcm9tID8gc3JjIDogZHN0KSBkbyBub3Qgd29yayBhcyB0aGUgcmVzdWx0cyBhcmUKKyAqIGFsd2F5cyBjb25zdC4KKyAqLwordGVtcGxhdGU8Ym9vbCBUb0EsIHNpemVfdCBTPgorc3RydWN0IE1lbUNvcGllciB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4KKyAgICBpbmxpbmUgc3RhdGljIHZvaWQgY29weShBICphLCBjb25zdCBCICpiLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBfX2J1aWx0aW5fbWVtY3B5KGEsIGIsIHNpemUpOworICAgIH0KK307CisKK3RlbXBsYXRlPHNpemVfdCBTPgorc3RydWN0IE1lbUNvcGllcjxmYWxzZSwgUz4geworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+CisgICAgaW5saW5lIHN0YXRpYyB2b2lkIGNvcHkoY29uc3QgQSAqYSwgQiAqYiwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgTWVtQ29waWVyPHRydWUsIFM+Ojpjb3B5KGIsIGEsIHNpemUpOworICAgIH0KK307CisKKy8qKgorICogQ29waWVzIGJldHdlZW4gYSBNZWRpYUltYWdlIGFuZCBhIGdyYXBoaWMgdmlldy4KKyAqCisgKiBccGFyYW0gVG9NZWRpYUltYWdlIHdoZXRoZXIgdG8gY29weSB0byAob3IgZnJvbSkgdGhlIE1lZGlhSW1hZ2UKKyAqIFxwYXJhbSB2aWV3IGdyYXBoaWMgdmlldyAoY291bGQgYmUgQ29uc3RHcmFwaGljVmlldyBvciBHcmFwaGljVmlldyBkZXBlbmRpbmcgb24gZGlyZWN0aW9uKQorICogXHBhcmFtIGltZyBNZWRpYUltYWdlIGRhdGEKKyAqIFxwYXJhbSBpbWdCYXNlIGJhc2Ugb2YgTWVkaWFJbWFnZSAoY291bGQgYmUgY29uc3QgdWludDhfdCogb3IgdWludDhfdCogZGVwZW5kaW5nIG9uIGRpcmVjdGlvbikKKyAqLwordGVtcGxhdGU8Ym9vbCBUb01lZGlhSW1hZ2UsIHR5cGVuYW1lIFZpZXcsIHR5cGVuYW1lIEltYWdlUGl4ZWw+CitzdGF0aWMgc3RhdHVzX3QgX0ltYWdlQ29weShWaWV3ICZ2aWV3LCBjb25zdCBNZWRpYUltYWdlMiAqaW1nLCBJbWFnZVBpeGVsICppbWdCYXNlKSB7CisgICAgLy8gVE9ETzogbW9yZSBlZmZpY2llbnQgY29weWluZyAtLS0gZS5nLiBjb3B5IGludGVybGVhdmVkIHBsYW5lcyB0b2dldGhlciwgZXRjLgorICAgIGNvbnN0IEMyUGxhbmFyTGF5b3V0ICZsYXlvdXQgPSB2aWV3LmxheW91dCgpOworICAgIGNvbnN0IHNpemVfdCBicHAgPSBkaXZVcChpbWctPm1CaXREZXB0aEFsbG9jYXRlZCwgOHUpOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGxheW91dC5udW1QbGFuZXM7ICsraSkgeworICAgICAgICB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPFRvTWVkaWFJbWFnZSwgdWludDhfdCwgY29uc3QgdWludDhfdD46OnR5cGUgKmltZ1JvdyA9CisgICAgICAgICAgICBpbWdCYXNlICsgaW1nLT5tUGxhbmVbaV0ubU9mZnNldDsKKyAgICAgICAgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxUb01lZGlhSW1hZ2UsIGNvbnN0IHVpbnQ4X3QsIHVpbnQ4X3Q+Ojp0eXBlICp2aWV3Um93ID0KKyAgICAgICAgICAgIHZpZXdSb3cgPSB2aWV3LmRhdGEoKVtpXTsKKyAgICAgICAgY29uc3QgQzJQbGFuZUluZm8gJnBsYW5lID0gbGF5b3V0LnBsYW5lc1tpXTsKKyAgICAgICAgaWYgKHBsYW5lLmNvbFNhbXBsaW5nICE9IGltZy0+bVBsYW5lW2ldLm1Ib3JpelN1YnNhbXBsaW5nCisgICAgICAgICAgICAgICAgfHwgcGxhbmUucm93U2FtcGxpbmcgIT0gaW1nLT5tUGxhbmVbaV0ubVZlcnRTdWJzYW1wbGluZworICAgICAgICAgICAgICAgIHx8IHBsYW5lLmFsbG9jYXRlZERlcHRoICE9IGltZy0+bUJpdERlcHRoQWxsb2NhdGVkCisgICAgICAgICAgICAgICAgfHwgcGxhbmUuYWxsb2NhdGVkRGVwdGggPCBwbGFuZS5iaXREZXB0aAorICAgICAgICAgICAgICAgIC8vIE1lZGlhSW1hZ2Ugb25seSBzdXBwb3J0cyBNU0IgdmFsdWVzCisgICAgICAgICAgICAgICAgfHwgcGxhbmUucmlnaHRTaGlmdCAhPSBwbGFuZS5hbGxvY2F0ZWREZXB0aCAtIHBsYW5lLmJpdERlcHRoCisgICAgICAgICAgICAgICAgfHwgKGJwcCA+IDEgJiYgcGxhbmUuZW5kaWFubmVzcyAhPSBwbGFuZS5OQVRJVkUpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3QgcGxhbmVXID0gaW1nLT5tV2lkdGggLyBwbGFuZS5jb2xTYW1wbGluZzsKKyAgICAgICAgdWludDMyX3QgcGxhbmVIID0gaW1nLT5tSGVpZ2h0IC8gcGxhbmUucm93U2FtcGxpbmc7CisKKyAgICAgICAgYm9vbCBjYW5Db3B5QnlSb3cgPSAocGxhbmUuY29sSW5jID09IDEpICYmIChpbWctPm1QbGFuZVtpXS5tQ29sSW5jID09IDEpOworICAgICAgICBib29sIGNhbkNvcHlCeVBsYW5lID0gY2FuQ29weUJ5Um93ICYmIChwbGFuZS5yb3dJbmMgPT0gaW1nLT5tUGxhbmVbaV0ubVJvd0luYyk7CisgICAgICAgIGlmIChjYW5Db3B5QnlQbGFuZSkgeworICAgICAgICAgICAgTWVtQ29waWVyPFRvTWVkaWFJbWFnZSwgMD46OmNvcHkoaW1nUm93LCB2aWV3Um93LCBwbGFuZS5yb3dJbmMgKiBwbGFuZUgpOworICAgICAgICB9IGVsc2UgaWYgKGNhbkNvcHlCeVJvdykgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCByb3cgPSAwOyByb3cgPCBwbGFuZUg7ICsrcm93KSB7CisgICAgICAgICAgICAgICAgTWVtQ29waWVyPFRvTWVkaWFJbWFnZSwgMD46OmNvcHkoCisgICAgICAgICAgICAgICAgICAgICAgICBpbWdSb3csIHZpZXdSb3csIHN0ZDo6bWluKHBsYW5lLnJvd0luYywgaW1nLT5tUGxhbmVbaV0ubVJvd0luYykpOworICAgICAgICAgICAgICAgIGltZ1JvdyArPSBpbWctPm1QbGFuZVtpXS5tUm93SW5jOworICAgICAgICAgICAgICAgIHZpZXdSb3cgKz0gcGxhbmUucm93SW5jOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCByb3cgPSAwOyByb3cgPCBwbGFuZUg7ICsrcm93KSB7CisgICAgICAgICAgICAgICAgZGVjbHR5cGUoaW1nUm93KSBpbWdQdHIgPSBpbWdSb3c7CisgICAgICAgICAgICAgICAgZGVjbHR5cGUodmlld1Jvdykgdmlld1B0ciA9IHZpZXdSb3c7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBjb2wgPSAwOyBjb2wgPCBwbGFuZVc7ICsrY29sKSB7CisgICAgICAgICAgICAgICAgICAgIE1lbUNvcGllcjxUb01lZGlhSW1hZ2UsIDA+Ojpjb3B5KGltZ1B0ciwgdmlld1B0ciwgYnBwKTsKKyAgICAgICAgICAgICAgICAgICAgaW1nUHRyICs9IGltZy0+bVBsYW5lW2ldLm1Db2xJbmM7CisgICAgICAgICAgICAgICAgICAgIHZpZXdQdHIgKz0gcGxhbmUuY29sSW5jOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbWdSb3cgKz0gaW1nLT5tUGxhbmVbaV0ubVJvd0luYzsKKyAgICAgICAgICAgICAgICB2aWV3Um93ICs9IHBsYW5lLnJvd0luYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitzdGF0dXNfdCBJbWFnZUNvcHkodWludDhfdCAqaW1nQmFzZSwgY29uc3QgTWVkaWFJbWFnZTIgKmltZywgY29uc3QgQzJHcmFwaGljVmlldyAmdmlldykgeworICAgIGlmICh2aWV3LmNyb3AoKS53aWR0aCAhPSBpbWctPm1XaWR0aCB8fCB2aWV3LmNyb3AoKS5oZWlnaHQgIT0gaW1nLT5tSGVpZ2h0KSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmICgoSXNOVjEyKHZpZXcpICYmIElzSTQyMChpbWcpKSB8fCAoSXNJNDIwKHZpZXcpICYmIElzTlYxMihpbWcpKSkgeworICAgICAgICAvLyBUYWtlIHNob3J0Y3V0cyB0byB1c2UgbGlieXV2IGZ1bmN0aW9ucyBiZXR3ZWVuIE5WMTIgYW5kIEk0MjAgY29udmVyc2lvbi4KKyAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3kgPSB2aWV3LmRhdGEoKVswXTsKKyAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3UgPSB2aWV3LmRhdGEoKVsxXTsKKyAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3YgPSB2aWV3LmRhdGEoKVsyXTsKKyAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlX3kgPSB2aWV3LmxheW91dCgpLnBsYW5lc1swXS5yb3dJbmM7CisgICAgICAgIGludDMyX3Qgc3JjX3N0cmlkZV91ID0gdmlldy5sYXlvdXQoKS5wbGFuZXNbMV0ucm93SW5jOworICAgICAgICBpbnQzMl90IHNyY19zdHJpZGVfdiA9IHZpZXcubGF5b3V0KCkucGxhbmVzWzJdLnJvd0luYzsKKyAgICAgICAgdWludDhfdCogZHN0X3kgPSBpbWdCYXNlICsgaW1nLT5tUGxhbmVbMF0ubU9mZnNldDsKKyAgICAgICAgdWludDhfdCogZHN0X3UgPSBpbWdCYXNlICsgaW1nLT5tUGxhbmVbMV0ubU9mZnNldDsKKyAgICAgICAgdWludDhfdCogZHN0X3YgPSBpbWdCYXNlICsgaW1nLT5tUGxhbmVbMl0ubU9mZnNldDsKKyAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlX3kgPSBpbWctPm1QbGFuZVswXS5tUm93SW5jOworICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGVfdSA9IGltZy0+bVBsYW5lWzFdLm1Sb3dJbmM7CisgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZV92ID0gaW1nLT5tUGxhbmVbMl0ubVJvd0luYzsKKyAgICAgICAgaWYgKElzTlYxMih2aWV3KSAmJiBJc0k0MjAoaW1nKSkgeworICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Ok5WMTJUb0k0MjAoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3UsIHNyY19zdHJpZGVfdSwgZHN0X3ksIGRzdF9zdHJpZGVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF91LCBkc3Rfc3RyaWRlX3UsIGRzdF92LCBkc3Rfc3RyaWRlX3YsIHZpZXcuY3JvcCgpLndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlldy5jcm9wKCkuaGVpZ2h0KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghbGlieXV2OjpJNDIwVG9OVjEyKHNyY195LCBzcmNfc3RyaWRlX3ksIHNyY191LCBzcmNfc3RyaWRlX3UsIHNyY192LCBzcmNfc3RyaWRlX3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfeSwgZHN0X3N0cmlkZV95LCBkc3RfdSwgZHN0X3N0cmlkZV91LCB2aWV3LmNyb3AoKS53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuY3JvcCgpLmhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9JbWFnZUNvcHk8dHJ1ZT4odmlldywgaW1nLCBpbWdCYXNlKTsKK30KKworc3RhdHVzX3QgSW1hZ2VDb3B5KEMyR3JhcGhpY1ZpZXcgJnZpZXcsIGNvbnN0IHVpbnQ4X3QgKmltZ0Jhc2UsIGNvbnN0IE1lZGlhSW1hZ2UyICppbWcpIHsKKyAgICBpZiAodmlldy5jcm9wKCkud2lkdGggIT0gaW1nLT5tV2lkdGggfHwgdmlldy5jcm9wKCkuaGVpZ2h0ICE9IGltZy0+bUhlaWdodCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoKElzTlYxMihpbWcpICYmIElzSTQyMCh2aWV3KSkgfHwgKElzSTQyMChpbWcpICYmIElzTlYxMih2aWV3KSkpIHsKKyAgICAgICAgLy8gVGFrZSBzaG9ydGN1dHMgdG8gdXNlIGxpYnl1diBmdW5jdGlvbnMgYmV0d2VlbiBOVjEyIGFuZCBJNDIwIGNvbnZlcnNpb24uCisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY195ID0gaW1nQmFzZSArIGltZy0+bVBsYW5lWzBdLm1PZmZzZXQ7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY191ID0gaW1nQmFzZSArIGltZy0+bVBsYW5lWzFdLm1PZmZzZXQ7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY192ID0gaW1nQmFzZSArIGltZy0+bVBsYW5lWzJdLm1PZmZzZXQ7CisgICAgICAgIGludDMyX3Qgc3JjX3N0cmlkZV95ID0gaW1nLT5tUGxhbmVbMF0ubVJvd0luYzsKKyAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlX3UgPSBpbWctPm1QbGFuZVsxXS5tUm93SW5jOworICAgICAgICBpbnQzMl90IHNyY19zdHJpZGVfdiA9IGltZy0+bVBsYW5lWzJdLm1Sb3dJbmM7CisgICAgICAgIHVpbnQ4X3QqIGRzdF95ID0gdmlldy5kYXRhKClbMF07CisgICAgICAgIHVpbnQ4X3QqIGRzdF91ID0gdmlldy5kYXRhKClbMV07CisgICAgICAgIHVpbnQ4X3QqIGRzdF92ID0gdmlldy5kYXRhKClbMl07CisgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZV95ID0gdmlldy5sYXlvdXQoKS5wbGFuZXNbMF0ucm93SW5jOworICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGVfdSA9IHZpZXcubGF5b3V0KCkucGxhbmVzWzFdLnJvd0luYzsKKyAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlX3YgPSB2aWV3LmxheW91dCgpLnBsYW5lc1syXS5yb3dJbmM7CisgICAgICAgIGlmIChJc05WMTIoaW1nKSAmJiBJc0k0MjAodmlldykpIHsKKyAgICAgICAgICAgIGlmICghbGlieXV2OjpOVjEyVG9JNDIwKHNyY195LCBzcmNfc3RyaWRlX3ksIHNyY191LCBzcmNfc3RyaWRlX3UsIGRzdF95LCBkc3Rfc3RyaWRlX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfdSwgZHN0X3N0cmlkZV91LCBkc3RfdiwgZHN0X3N0cmlkZV92LCB2aWV3LndpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3LmhlaWdodCgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghbGlieXV2OjpJNDIwVG9OVjEyKHNyY195LCBzcmNfc3RyaWRlX3ksIHNyY191LCBzcmNfc3RyaWRlX3UsIHNyY192LCBzcmNfc3RyaWRlX3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfeSwgZHN0X3N0cmlkZV95LCBkc3RfdSwgZHN0X3N0cmlkZV91LCB2aWV3LndpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3LmhlaWdodCgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX0ltYWdlQ29weTxmYWxzZT4odmlldywgaW1nLCBpbWdCYXNlKTsKK30KKworYm9vbCBJc1lVVjQyMChjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KSB7CisgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQgJmxheW91dCA9IHZpZXcubGF5b3V0KCk7CisgICAgcmV0dXJuIChsYXlvdXQubnVtUGxhbmVzID09IDMKKyAgICAgICAgICAgICYmIGxheW91dC50eXBlID09IEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0uY2hhbm5lbCA9PSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9ZCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9ZXS5hbGxvY2F0ZWREZXB0aCA9PSA4CisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9ZXS5iaXREZXB0aCA9PSA4CisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9ZXS5yaWdodFNoaWZ0ID09IDAKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLmNvbFNhbXBsaW5nID09IDEKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLnJvd1NhbXBsaW5nID09IDEKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLmNoYW5uZWwgPT0gQzJQbGFuZUluZm86OkNIQU5ORUxfQ0IKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLmFsbG9jYXRlZERlcHRoID09IDgKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLmJpdERlcHRoID09IDgKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLnJpZ2h0U2hpZnQgPT0gMAorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uY29sU2FtcGxpbmcgPT0gMgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0ucm93U2FtcGxpbmcgPT0gMgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uY2hhbm5lbCA9PSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DUgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uYWxsb2NhdGVkRGVwdGggPT0gOAorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uYml0RGVwdGggPT0gOAorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0ucmlnaHRTaGlmdCA9PSAwCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5jb2xTYW1wbGluZyA9PSAyCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5yb3dTYW1wbGluZyA9PSAyKTsKK30KKworYm9vbCBJc05WMTIoY29uc3QgQzJHcmFwaGljVmlldyAmdmlldykgeworICAgIGlmICghSXNZVVY0MjAodmlldykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjb25zdCBDMlBsYW5hckxheW91dCAmbGF5b3V0ID0gdmlldy5sYXlvdXQoKTsKKyAgICByZXR1cm4gKGxheW91dC5yb290UGxhbmVzID09IDIKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLmNvbEluYyA9PSAyCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5yb290SXggPT0gbGF5b3V0LlBMQU5FX1UKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLm9mZnNldCA9PSAwCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5jb2xJbmMgPT0gMgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0ucm9vdEl4ID09IGxheW91dC5QTEFORV9VCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5vZmZzZXQgPT0gMSk7Cit9CisKK2Jvb2wgSXNJNDIwKGNvbnN0IEMyR3JhcGhpY1ZpZXcgJnZpZXcpIHsKKyAgICBpZiAoIUlzWVVWNDIwKHZpZXcpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQgJmxheW91dCA9IHZpZXcubGF5b3V0KCk7CisgICAgcmV0dXJuIChsYXlvdXQucm9vdFBsYW5lcyA9PSAzCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5jb2xJbmMgPT0gMQorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0ucm9vdEl4ID09IGxheW91dC5QTEFORV9VCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5vZmZzZXQgPT0gMAorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uY29sSW5jID09IDEKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLnJvb3RJeCA9PSBsYXlvdXQuUExBTkVfVgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0ub2Zmc2V0ID09IDApOworfQorCitib29sIElzWVVWNDIwKGNvbnN0IE1lZGlhSW1hZ2UyICppbWcpIHsKKyAgICByZXR1cm4gKGltZy0+bVR5cGUgPT0gTWVkaWFJbWFnZTI6Ok1FRElBX0lNQUdFX1RZUEVfWVVWCisgICAgICAgICAgICAmJiBpbWctPm1OdW1QbGFuZXMgPT0gMworICAgICAgICAgICAgJiYgaW1nLT5tQml0RGVwdGggPT0gOAorICAgICAgICAgICAgJiYgaW1nLT5tQml0RGVwdGhBbGxvY2F0ZWQgPT0gOAorICAgICAgICAgICAgJiYgaW1nLT5tUGxhbmVbMF0ubUhvcml6U3Vic2FtcGxpbmcgPT0gMQorICAgICAgICAgICAgJiYgaW1nLT5tUGxhbmVbMF0ubVZlcnRTdWJzYW1wbGluZyA9PSAxCisgICAgICAgICAgICAmJiBpbWctPm1QbGFuZVsxXS5tSG9yaXpTdWJzYW1wbGluZyA9PSAyCisgICAgICAgICAgICAmJiBpbWctPm1QbGFuZVsxXS5tVmVydFN1YnNhbXBsaW5nID09IDIKKyAgICAgICAgICAgICYmIGltZy0+bVBsYW5lWzJdLm1Ib3JpelN1YnNhbXBsaW5nID09IDIKKyAgICAgICAgICAgICYmIGltZy0+bVBsYW5lWzJdLm1WZXJ0U3Vic2FtcGxpbmcgPT0gMik7Cit9CisKK2Jvb2wgSXNOVjEyKGNvbnN0IE1lZGlhSW1hZ2UyICppbWcpIHsKKyAgICBpZiAoIUlzWVVWNDIwKGltZykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gKGltZy0+bVBsYW5lWzFdLm1Db2xJbmMgPT0gMgorICAgICAgICAgICAgJiYgaW1nLT5tUGxhbmVbMl0ubUNvbEluYyA9PSAyCisgICAgICAgICAgICAmJiAoaW1nLT5tUGxhbmVbMl0ubU9mZnNldCAtIGltZy0+bVBsYW5lWzFdLm1PZmZzZXQgPT0gMSkpOworfQorCitib29sIElzSTQyMChjb25zdCBNZWRpYUltYWdlMiAqaW1nKSB7CisgICAgaWYgKCFJc1lVVjQyMChpbWcpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIChpbWctPm1QbGFuZVsxXS5tQ29sSW5jID09IDEKKyAgICAgICAgICAgICYmIGltZy0+bVBsYW5lWzJdLm1Db2xJbmMgPT0gMQorICAgICAgICAgICAgJiYgaW1nLT5tUGxhbmVbMl0ubU9mZnNldCA+IGltZy0+bVBsYW5lWzFdLm1PZmZzZXQpOworfQorCitNZWRpYUltYWdlMiBDcmVhdGVZVVY0MjBQbGFuYXJNZWRpYUltYWdlMigKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3Qgc3RyaWRlLCB1aW50MzJfdCB2c3RyaWRlKSB7CisgICAgcmV0dXJuIE1lZGlhSW1hZ2UyIHsKKyAgICAgICAgLm1UeXBlID0gTWVkaWFJbWFnZTI6Ok1FRElBX0lNQUdFX1RZUEVfWVVWLAorICAgICAgICAubU51bVBsYW5lcyA9IDMsCisgICAgICAgIC5tV2lkdGggPSB3aWR0aCwKKyAgICAgICAgLm1IZWlnaHQgPSBoZWlnaHQsCisgICAgICAgIC5tQml0RGVwdGggPSA4LAorICAgICAgICAubUJpdERlcHRoQWxsb2NhdGVkID0gOCwKKyAgICAgICAgLm1QbGFuZSA9IHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAubU9mZnNldCA9IDAsCisgICAgICAgICAgICAgICAgLm1Db2xJbmMgPSAxLAorICAgICAgICAgICAgICAgIC5tUm93SW5jID0gKGludDMyX3Qpc3RyaWRlLAorICAgICAgICAgICAgICAgIC5tSG9yaXpTdWJzYW1wbGluZyA9IDEsCisgICAgICAgICAgICAgICAgLm1WZXJ0U3Vic2FtcGxpbmcgPSAxLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAubU9mZnNldCA9IHN0cmlkZSAqIHZzdHJpZGUsCisgICAgICAgICAgICAgICAgLm1Db2xJbmMgPSAxLAorICAgICAgICAgICAgICAgIC5tUm93SW5jID0gKGludDMyX3Qpc3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAubUhvcml6U3Vic2FtcGxpbmcgPSAyLAorICAgICAgICAgICAgICAgIC5tVmVydFN1YnNhbXBsaW5nID0gMiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLm1PZmZzZXQgPSBzdHJpZGUgKiB2c3RyaWRlICogNSAvIDQsCisgICAgICAgICAgICAgICAgLm1Db2xJbmMgPSAxLAorICAgICAgICAgICAgICAgIC5tUm93SW5jID0gKGludDMyX3Qpc3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAubUhvcml6U3Vic2FtcGxpbmcgPSAyLAorICAgICAgICAgICAgICAgIC5tVmVydFN1YnNhbXBsaW5nID0gMiwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICB9OworfQorCitNZWRpYUltYWdlMiBDcmVhdGVZVVY0MjBTZW1pUGxhbmFyTWVkaWFJbWFnZTIoCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IHN0cmlkZSwgdWludDMyX3QgdnN0cmlkZSkgeworICAgIHJldHVybiBNZWRpYUltYWdlMiB7CisgICAgICAgIC5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1lVViwKKyAgICAgICAgLm1OdW1QbGFuZXMgPSAzLAorICAgICAgICAubVdpZHRoID0gd2lkdGgsCisgICAgICAgIC5tSGVpZ2h0ID0gaGVpZ2h0LAorICAgICAgICAubUJpdERlcHRoID0gOCwKKyAgICAgICAgLm1CaXREZXB0aEFsbG9jYXRlZCA9IDgsCisgICAgICAgIC5tUGxhbmUgPSB7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLm1PZmZzZXQgPSAwLAorICAgICAgICAgICAgICAgIC5tQ29sSW5jID0gMSwKKyAgICAgICAgICAgICAgICAubVJvd0luYyA9IChpbnQzMl90KXN0cmlkZSwKKyAgICAgICAgICAgICAgICAubUhvcml6U3Vic2FtcGxpbmcgPSAxLAorICAgICAgICAgICAgICAgIC5tVmVydFN1YnNhbXBsaW5nID0gMSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLm1PZmZzZXQgPSBzdHJpZGUgKiB2c3RyaWRlLAorICAgICAgICAgICAgICAgIC5tQ29sSW5jID0gMiwKKyAgICAgICAgICAgICAgICAubVJvd0luYyA9IChpbnQzMl90KXN0cmlkZSwKKyAgICAgICAgICAgICAgICAubUhvcml6U3Vic2FtcGxpbmcgPSAyLAorICAgICAgICAgICAgICAgIC5tVmVydFN1YnNhbXBsaW5nID0gMiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLm1PZmZzZXQgPSBzdHJpZGUgKiB2c3RyaWRlICsgMSwKKyAgICAgICAgICAgICAgICAubUNvbEluYyA9IDIsCisgICAgICAgICAgICAgICAgLm1Sb3dJbmMgPSAoaW50MzJfdClzdHJpZGUsCisgICAgICAgICAgICAgICAgLm1Ib3JpelN1YnNhbXBsaW5nID0gMiwKKyAgICAgICAgICAgICAgICAubVZlcnRTdWJzYW1wbGluZyA9IDIsCisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgfTsKK30KKworc3RhdHVzX3QgQ29udmVydFJHQlRvUGxhbmFyWVVWKAorICAgICAgICB1aW50OF90ICpkc3RZLCBzaXplX3QgZHN0U3RyaWRlLCBzaXplX3QgZHN0VlN0cmlkZSwgc2l6ZV90IGJ1ZmZlclNpemUsCisgICAgICAgIGNvbnN0IEMyR3JhcGhpY1ZpZXcgJnNyYykgeworICAgIENIRUNLKGRzdFkgIT0gbnVsbHB0cik7CisgICAgQ0hFQ0soKHNyYy53aWR0aCgpICYgMSkgPT0gMCk7CisgICAgQ0hFQ0soKHNyYy5oZWlnaHQoKSAmIDEpID09IDApOworCisgICAgaWYgKGRzdFN0cmlkZSAqIGRzdFZTdHJpZGUgKiAzIC8gMiA+IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgQUxPR0QoImNvbnZlcnNpb24gYnVmZmVyIGlzIHRvbyBzbWFsbCBmb3IgY29udmVydGluZyBmcm9tIFJHQiB0byBZVVYiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICB1aW50OF90ICpkc3RVID0gZHN0WSArIGRzdFN0cmlkZSAqIGRzdFZTdHJpZGU7CisgICAgdWludDhfdCAqZHN0ViA9IGRzdFUgKyAoZHN0U3RyaWRlID4+IDEpICogKGRzdFZTdHJpZGUgPj4gMSk7CisKKyAgICBjb25zdCBDMlBsYW5hckxheW91dCAmbGF5b3V0ID0gc3JjLmxheW91dCgpOworICAgIGNvbnN0IHVpbnQ4X3QgKnBSZWQgICA9IHNyYy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1JdOworICAgIGNvbnN0IHVpbnQ4X3QgKnBHcmVlbiA9IHNyYy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0ddOworICAgIGNvbnN0IHVpbnQ4X3QgKnBCbHVlICA9IHNyYy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0JdOworCisjZGVmaW5lIENMSVAzKHgseSx6KSAoKCh6KSA8ICh4KSkgPyAoeCkgOiAoKCh6KSA+ICh5KSkgPyAoeSkgOiAoeikpKQorICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgc3JjLmhlaWdodCgpOyArK3kpIHsKKyAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCBzcmMud2lkdGgoKTsgKyt4KSB7CisgICAgICAgICAgICB1aW50OF90IHJlZCA9ICpwUmVkOworICAgICAgICAgICAgdWludDhfdCBncmVlbiA9ICpwR3JlZW47CisgICAgICAgICAgICB1aW50OF90IGJsdWUgPSAqcEJsdWU7CisKKyAgICAgICAgICAgIC8vIHVzaW5nIElUVS1SIEJULjYwMSBjb252ZXJzaW9uIG1hdHJpeAorICAgICAgICAgICAgdW5zaWduZWQgbHVtYSA9CisgICAgICAgICAgICAgICAgQ0xJUDMoMCwgKCgocmVkICogNjYgKyBncmVlbiAqIDEyOSArIGJsdWUgKiAyNSkgPj4gOCkgKyAxNiksIDI1NSk7CisKKyAgICAgICAgICAgIGRzdFlbeF0gPSBsdW1hOworCisgICAgICAgICAgICBpZiAoKHggJiAxKSA9PSAwICYmICh5ICYgMSkgPT0gMCkgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIFUgPQorICAgICAgICAgICAgICAgICAgICBDTElQMygwLCAoKCgtcmVkICogMzggLSBncmVlbiAqIDc0ICsgYmx1ZSAqIDExMikgPj4gOCkgKyAxMjgpLCAyNTUpOworCisgICAgICAgICAgICAgICAgdW5zaWduZWQgViA9CisgICAgICAgICAgICAgICAgICAgIENMSVAzKDAsICgoKHJlZCAqIDExMiAtIGdyZWVuICogOTQgLSBibHVlICogMTgpID4+IDgpICsgMTI4KSwgMjU1KTsKKworICAgICAgICAgICAgICAgIGRzdFVbeCA+PiAxXSA9IFU7CisgICAgICAgICAgICAgICAgZHN0Vlt4ID4+IDFdID0gVjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBSZWQgICArPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9SXS5jb2xJbmM7CisgICAgICAgICAgICBwR3JlZW4gKz0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfR10uY29sSW5jOworICAgICAgICAgICAgcEJsdWUgICs9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0JdLmNvbEluYzsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoeSAmIDEpID09IDApIHsKKyAgICAgICAgICAgIGRzdFUgKz0gZHN0U3RyaWRlID4+IDE7CisgICAgICAgICAgICBkc3RWICs9IGRzdFN0cmlkZSA+PiAxOworICAgICAgICB9CisKKyAgICAgICAgcFJlZCAgIC09IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1JdLmNvbEluYyAqIHNyYy53aWR0aCgpOworICAgICAgICBwR3JlZW4gLT0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfR10uY29sSW5jICogc3JjLndpZHRoKCk7CisgICAgICAgIHBCbHVlICAtPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9CXS5jb2xJbmMgKiBzcmMud2lkdGgoKTsKKyAgICAgICAgcFJlZCAgICs9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1JdLnJvd0luYzsKKyAgICAgICAgcEdyZWVuICs9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0ddLnJvd0luYzsKKyAgICAgICAgcEJsdWUgICs9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0JdLnJvd0luYzsKKworICAgICAgICBkc3RZICs9IGRzdFN0cmlkZTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCituYW1lc3BhY2UgeworCisvKioKKyAqIEEgYmxvY2sgb2YgcmF3IGFsbG9jYXRlZCBtZW1vcnkuCisgKi8KK3N0cnVjdCBNZW1vcnlCbG9ja1Bvb2xCbG9jayB7CisgICAgTWVtb3J5QmxvY2tQb29sQmxvY2soc2l6ZV90IHNpemUpCisgICAgICAgIDogbURhdGEobmV3IHVpbnQ4X3Rbc2l6ZV0pLCBtU2l6ZShtRGF0YSA/IHNpemUgOiAwKSB7IH0KKworICAgIH5NZW1vcnlCbG9ja1Bvb2xCbG9jaygpIHsKKyAgICAgICAgZGVsZXRlW10gbURhdGE7CisgICAgfQorCisgICAgY29uc3QgdWludDhfdCAqZGF0YSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1EYXRhOworICAgIH0KKworICAgIHNpemVfdCBzaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVNpemU7CisgICAgfQorCisgICAgQzJfRE9fTk9UX0NPUFkoTWVtb3J5QmxvY2tQb29sQmxvY2spOworCitwcml2YXRlOgorICAgIHVpbnQ4X3QgKm1EYXRhOworICAgIHNpemVfdCBtU2l6ZTsKK307CisKKy8qKgorICogQSBzaW1wbGUgcmF3IG1lbW9yeSBibG9jayBwb29sIGltcGxlbWVudGF0aW9uLgorICovCitzdHJ1Y3QgTWVtb3J5QmxvY2tQb29sSW1wbCB7CisgICAgdm9pZCByZWxlYXNlKHN0ZDo6bGlzdDxNZW1vcnlCbG9ja1Bvb2xCbG9jaz46OmNvbnN0X2l0ZXJhdG9yIGJsb2NrKSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIC8vIHJldHVybiBibG9jayB0byBmcmVlIGJsb2NrcyBpZiBpdCBpcyB0aGUgY3VycmVudCBzaXplOyBvdGhlcndpc2UsIGRpc2NhcmQKKyAgICAgICAgaWYgKGJsb2NrLT5zaXplKCkgPT0gbUN1cnJlbnRTaXplKSB7CisgICAgICAgICAgICBtRnJlZUJsb2Nrcy5zcGxpY2UobUZyZWVCbG9ja3MuYmVnaW4oKSwgbUJsb2Nrc0luVXNlLCBibG9jayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQmxvY2tzSW5Vc2UuZXJhc2UoYmxvY2spOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjpsaXN0PE1lbW9yeUJsb2NrUG9vbEJsb2NrPjo6Y29uc3RfaXRlcmF0b3IgZmV0Y2goc2l6ZV90IHNpemUpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgbUZyZWVCbG9ja3MucmVtb3ZlX2lmKFtzaXplXShjb25zdCBNZW1vcnlCbG9ja1Bvb2xCbG9jayAmYmxvY2spIC0+IGJvb2wgeworICAgICAgICAgICAgcmV0dXJuIGJsb2NrLnNpemUoKSAhPSBzaXplOworICAgICAgICB9KTsKKyAgICAgICAgbUN1cnJlbnRTaXplID0gc2l6ZTsKKyAgICAgICAgaWYgKG1GcmVlQmxvY2tzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIG1CbG9ja3NJblVzZS5lbXBsYWNlX2Zyb250KHNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUJsb2Nrc0luVXNlLnNwbGljZShtQmxvY2tzSW5Vc2UuYmVnaW4oKSwgbUZyZWVCbG9ja3MsIG1GcmVlQmxvY2tzLmJlZ2luKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtQmxvY2tzSW5Vc2UuYmVnaW4oKTsKKyAgICB9CisKKyAgICBNZW1vcnlCbG9ja1Bvb2xJbXBsKCkgPSBkZWZhdWx0OworCisgICAgQzJfRE9fTk9UX0NPUFkoTWVtb3J5QmxvY2tQb29sSW1wbCk7CisKK3ByaXZhdGU6CisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgc3RkOjpsaXN0PE1lbW9yeUJsb2NrUG9vbEJsb2NrPiBtRnJlZUJsb2NrczsKKyAgICBzdGQ6Omxpc3Q8TWVtb3J5QmxvY2tQb29sQmxvY2s+IG1CbG9ja3NJblVzZTsKKyAgICBzaXplX3QgbUN1cnJlbnRTaXplOworfTsKKworfSAvLyBuYW1lc3BhY2UKKworc3RydWN0IE1lbW9yeUJsb2NrUG9vbDo6SW1wbCA6IE1lbW9yeUJsb2NrUG9vbEltcGwgeworfTsKKworc3RydWN0IE1lbW9yeUJsb2NrOjpJbXBsIHsKKyAgICBJbXBsKHN0ZDo6bGlzdDxNZW1vcnlCbG9ja1Bvb2xCbG9jaz46OmNvbnN0X2l0ZXJhdG9yIGJsb2NrLAorICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPE1lbW9yeUJsb2NrUG9vbEltcGw+IHBvb2wpCisgICAgICAgIDogbUJsb2NrKGJsb2NrKSwgbVBvb2wocG9vbCkgeworICAgIH0KKworICAgIH5JbXBsKCkgeworICAgICAgICBtUG9vbC0+cmVsZWFzZShtQmxvY2spOworICAgIH0KKworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQmxvY2stPmRhdGEoKTsKKyAgICB9CisKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1CbG9jay0+c2l6ZSgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6Omxpc3Q8TWVtb3J5QmxvY2tQb29sQmxvY2s+Ojpjb25zdF9pdGVyYXRvciBtQmxvY2s7CisgICAgc3RkOjpzaGFyZWRfcHRyPE1lbW9yeUJsb2NrUG9vbEltcGw+IG1Qb29sOworfTsKKworTWVtb3J5QmxvY2sgTWVtb3J5QmxvY2tQb29sOjpmZXRjaChzaXplX3Qgc2l6ZSkgeworICAgIHN0ZDo6bGlzdDxNZW1vcnlCbG9ja1Bvb2xCbG9jaz46OmNvbnN0X2l0ZXJhdG9yIHBvb2xCbG9jayA9IG1JbXBsLT5mZXRjaChzaXplKTsKKyAgICByZXR1cm4gTWVtb3J5QmxvY2soc3RkOjptYWtlX3NoYXJlZDxNZW1vcnlCbG9jazo6SW1wbD4oCisgICAgICAgICAgICBwb29sQmxvY2ssIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxNZW1vcnlCbG9ja1Bvb2xJbXBsPihtSW1wbCkpKTsKK30KKworTWVtb3J5QmxvY2tQb29sOjpNZW1vcnlCbG9ja1Bvb2woKQorICAgIDogbUltcGwoc3RkOjptYWtlX3NoYXJlZDxNZW1vcnlCbG9ja1Bvb2w6OkltcGw+KCkpIHsKK30KKworTWVtb3J5QmxvY2s6Ok1lbW9yeUJsb2NrKHN0ZDo6c2hhcmVkX3B0cjxNZW1vcnlCbG9jazo6SW1wbD4gaW1wbCkKKyAgICA6IG1JbXBsKGltcGwpIHsKK30KKworTWVtb3J5QmxvY2s6Ok1lbW9yeUJsb2NrKCkgPSBkZWZhdWx0OworCitNZW1vcnlCbG9jazo6fk1lbW9yeUJsb2NrKCkgPSBkZWZhdWx0OworCitjb25zdCB1aW50OF90KiBNZW1vcnlCbG9jazo6ZGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwgPyBtSW1wbC0+ZGF0YSgpIDogbnVsbHB0cjsKK30KKworc2l6ZV90IE1lbW9yeUJsb2NrOjpzaXplKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbCA/IG1JbXBsLT5zaXplKCkgOiAwOworfQorCitNZW1vcnlCbG9jayBNZW1vcnlCbG9jazo6QWxsb2NhdGUoc2l6ZV90IHNpemUpIHsKKyAgICByZXR1cm4gTWVtb3J5QmxvY2tQb29sKCkuZmV0Y2goc2l6ZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyQnVmZmVyVXRpbHMuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYWRmMDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyQnVmZmVyVXRpbHMuaApAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0JVRkZFUl9VVElMU19IXworI2RlZmluZSBDT0RFQzJfQlVGRkVSX1VUSUxTX0hfCisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyUGFyYW1EZWYuaD4KKworI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBDb252ZXJ0cyBhbiBSR0IgdmlldyB0byBwbGFuYXIgWVVWIDQyMCBtZWRpYSBpbWFnZS4KKyAqCisgKiBccGFyYW0gZHN0WSAgICAgICBwb2ludGVyIHRvIG1lZGlhIGltYWdlIGJ1ZmZlcgorICogXHBhcmFtIGRzdFN0cmlkZSAgc3RyaWRlIGluIGJ5dGVzCisgKiBccGFyYW0gZHN0VlN0cmlkZSB2ZXJ0aWNhbCBzdHJpZGUgaW4gcGl4ZWxzCisgKiBccGFyYW0gYnVmZmVyU2l6ZSBtZWRpYSBpbWFnZSBidWZmZXIgc2l6ZQorICogXHBhcmFtIHNyYyBzb3VyY2UgaW1hZ2UKKyAqCisgKiBccmV0dmFsIE5PX01FTU9SWSBtZWRpYSBpbWFnZSBpcyB0b28gc21hbGwKKyAqIFxyZXR2YWwgT0sgb24gc3VjY2VzcworICovCitzdGF0dXNfdCBDb252ZXJ0UkdCVG9QbGFuYXJZVVYoCisgICAgICAgIHVpbnQ4X3QgKmRzdFksIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCBkc3RWU3RyaWRlLCBzaXplX3QgYnVmZmVyU2l6ZSwKKyAgICAgICAgY29uc3QgQzJHcmFwaGljVmlldyAmc3JjKTsKKworLyoqCisgKiBSZXR1cm5zIGEgcGxhbmFyIFlVViA0MjAgOC1iaXQgbWVkaWEgaW1hZ2UgZGVzY3JpcHRvci4KKyAqCisgKiBccGFyYW0gd2lkdGggd2lkdGggb2YgaW1hZ2UgaW4gcGl4ZWxzCisgKiBccGFyYW0gaGVpZ2h0IGhlaWdodCBvZiBpbWFnZSBpbiBwaXhlbHMKKyAqIFxwYXJhbSBzdHJpZGUgc3RyaWRlIG9mIGltYWdlIGluIHBpeGVscworICogXHBhcmFtIHZzdHJpZGUgdmVydGljYWwgc3RyaWRlIG9mIGltYWdlIGluIHBpeGVscworICovCitNZWRpYUltYWdlMiBDcmVhdGVZVVY0MjBQbGFuYXJNZWRpYUltYWdlMigKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3Qgc3RyaWRlLCB1aW50MzJfdCB2c3RyaWRlKTsKKworLyoqCisgKiBSZXR1cm5zIGEgc2VtaXBsYW5hciBZVVYgNDIwIDgtYml0IG1lZGlhIGltYWdlIGRlc2NyaXB0b3IuCisgKgorICogXHBhcmFtIHdpZHRoIHdpZHRoIG9mIGltYWdlIGluIHBpeGVscworICogXHBhcmFtIGhlaWdodCBoZWlnaHQgb2YgaW1hZ2UgaW4gcGl4ZWxzCisgKiBccGFyYW0gc3RyaWRlIHN0cmlkZSBvZiBpbWFnZSBpbiBwaXhlbHMKKyAqIFxwYXJhbSB2c3RyaWRlIHZlcnRpY2FsIHN0cmlkZSBvZiBpbWFnZSBpbiBwaXhlbHMKKyAqLworTWVkaWFJbWFnZTIgQ3JlYXRlWVVWNDIwU2VtaVBsYW5hck1lZGlhSW1hZ2UyKAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBzdHJpZGUsIHVpbnQzMl90IHZzdHJpZGUpOworCisvKioKKyAqIENvcGllcyBhIGdyYXBoaWMgdmlldyBpbnRvIGEgbWVkaWEgaW1hZ2UuCisgKgorICogXHBhcmFtIGltZ0Jhc2UgYmFzZSBvZiBNZWRpYUltYWdlCisgKiBccGFyYW0gaW1nIE1lZGlhSW1hZ2UgZGF0YQorICogXHBhcmFtIHZpZXcgZ3JhcGhpYyB2aWV3CisgKgorICogXHJldHVybiBPSyBvbiBzdWNjZXNzCisgKi8KK3N0YXR1c190IEltYWdlQ29weSh1aW50OF90ICppbWdCYXNlLCBjb25zdCBNZWRpYUltYWdlMiAqaW1nLCBjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KTsKKworLyoqCisgKiBDb3BpZXMgYSBtZWRpYSBpbWFnZSBpbnRvIGEgZ3JhcGhpYyB2aWV3LgorICoKKyAqIFxwYXJhbSB2aWV3IGdyYXBoaWMgdmlldworICogXHBhcmFtIGltZ0Jhc2UgYmFzZSBvZiBNZWRpYUltYWdlCisgKiBccGFyYW0gaW1nIE1lZGlhSW1hZ2UgZGF0YQorICoKKyAqIFxyZXR1cm4gT0sgb24gc3VjY2VzcworICovCitzdGF0dXNfdCBJbWFnZUNvcHkoQzJHcmFwaGljVmlldyAmdmlldywgY29uc3QgdWludDhfdCAqaW1nQmFzZSwgY29uc3QgTWVkaWFJbWFnZTIgKmltZyk7CisKKy8qKgorICogUmV0dXJucyB0cnVlIGlmZiBhIHZpZXcgaGFzIGEgWVVWIDQyMCA4ODggbGF5b3V0LgorICovCitib29sIElzWVVWNDIwKGNvbnN0IEMyR3JhcGhpY1ZpZXcgJnZpZXcpOworCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZmYgYSB2aWV3IGhhcyBhIE5WMTIgbGF5b3V0LgorICovCitib29sIElzTlYxMihjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KTsKKworLyoqCisgKiBSZXR1cm5zIHRydWUgaWZmIGEgdmlldyBoYXMgYSBJNDIwIGxheW91dC4KKyAqLworYm9vbCBJc0k0MjAoY29uc3QgQzJHcmFwaGljVmlldyAmdmlldyk7CisKKy8qKgorICogUmV0dXJucyB0cnVlIGlmZiBhIE1lZGlhSW1hZ2UyIGhhcyBhIFlVViA0MjAgODg4IGxheW91dC4KKyAqLworYm9vbCBJc1lVVjQyMChjb25zdCBNZWRpYUltYWdlMiAqaW1nKTsKKworLyoqCisgKiBSZXR1cm5zIHRydWUgaWZmIGEgTWVkaWFJbWFnZTIgaGFzIGEgTlYxMiBsYXlvdXQuCisgKi8KK2Jvb2wgSXNOVjEyKGNvbnN0IE1lZGlhSW1hZ2UyICppbWcpOworCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZmYgYSBNZWRpYUltYWdlMiBoYXMgYSBJNDIwIGxheW91dC4KKyAqLworYm9vbCBJc0k0MjAoY29uc3QgTWVkaWFJbWFnZTIgKmltZyk7CisKKy8qKgorICogQSByYXcgbWVtb3J5IGJsb2NrIHRvIHVzZSBmb3IgaW50ZXJuYWwgYnVmZmVycy4KKyAqCisgKiBUT0RPOiByZXBsYWNlIHRoaXMgd2l0aCBDMkxpbmVhckJsb2NrcyBmcm9tIGEgcHJpdmF0ZSBDMkJsb2NrUG9vbAorICovCitzdHJ1Y3QgTWVtb3J5QmxvY2sgOiBwdWJsaWMgQzJNZW1vcnlCbG9jazx1aW50OF90PiB7CisgICAgdmlydHVhbCBjb25zdCB1aW50OF90KiBkYXRhKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgaW5saW5lIHVpbnQ4X3QgKmRhdGEoKSB7CisgICAgICAgIHJldHVybiBjb25zdF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PGNvbnN0IE1lbW9yeUJsb2NrKj4odGhpcyktPmRhdGEoKSk7CisgICAgfQorCisgICAgLy8gYWxsb2NhdGVzIGFuIHVubWFuYWdlZCBibG9jayAobm90IGluIGEgcG9vbCkKKyAgICBzdGF0aWMgTWVtb3J5QmxvY2sgQWxsb2NhdGUoc2l6ZV90KTsKKworICAgIC8vIG1lbW9yeSBibG9jayB3aXRoIG5vIGFjdHVhbCBtZW1vcnkgKHNpemUgaXMgMCwgZGF0YSBpcyBudWxsKQorICAgIE1lbW9yeUJsb2NrKCk7CisKKyAgICBzdHJ1Y3QgSW1wbDsKKyAgICBNZW1vcnlCbG9jayhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCk7CisgICAgdmlydHVhbCB+TWVtb3J5QmxvY2soKTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7Cit9OworCisvKioKKyAqIEEgcmF3IG1lbW9yeSBtaW5pLXBvb2wuCisgKi8KK3N0cnVjdCBNZW1vcnlCbG9ja1Bvb2wgeworICAgIC8qKgorICAgICAqIEZldGNoZXMgYSBibG9jayB3aXRoIGEgZ2l2ZW4gc2l6ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzaXplIHNpemUgaW4gYnl0ZXMKKyAgICAgKi8KKyAgICBNZW1vcnlCbG9jayBmZXRjaChzaXplX3Qgc2l6ZSk7CisKKyAgICBNZW1vcnlCbG9ja1Bvb2woKTsKKyAgICB+TWVtb3J5QmxvY2tQb29sKCkgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0cnVjdCBJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQzJfQlVGRkVSX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyTWFwcGVyLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJNYXBwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMTYwYzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyTWFwcGVyLmNwcApAQCAtMCwwICsxLDk0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMk1hcHBlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29rdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+ICAvLyBmb3IgSU5UMzJfTUFYCisKKyNpbmNsdWRlICJDb2RlYzJNYXBwZXIuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK25hbWVzcGFjZSB7CisKK0FMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc0FhY1Byb2ZpbGVzID0geworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xDLCAgICAgICAgIEFBQ09iamVjdExDIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTUFJTiwgICAgICAgQUFDT2JqZWN0TWFpbiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQUFDX1NTUiwgICAgICAgIEFBQ09iamVjdFNTUiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xUUCwgICAgICAgIEFBQ09iamVjdExUUCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQUFDX0hFLCAgICAgICAgIEFBQ09iamVjdEhFIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfU0NBTEFCTEUsICAgQUFDT2JqZWN0U2NhbGFibGUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FUl9MQywgICAgICBBQUNPYmplY3RFUkxDIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfRVJfU0NBTEFCTEUsIEFBQ09iamVjdEVSU2NhbGFibGUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MRCwgICAgICAgICBBQUNPYmplY3RMRCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQUFDX0hFX1BTLCAgICAgIEFBQ09iamVjdEhFX1BTIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfRUxELCAgICAgICAgQUFDT2JqZWN0RUxEIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfWEhFLCAgICAgICAgQUFDT2JqZWN0WEhFIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpsZXZlbF90LCBpbnQzMl90PiBzQXZjTGV2ZWxzID0geworICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ18xLCAgICBBVkNMZXZlbDEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfMUIsICAgQVZDTGV2ZWwxYiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ18xXzEsICBBVkNMZXZlbDExIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzFfMiwgIEFWQ0xldmVsMTIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfMV8zLCAgQVZDTGV2ZWwxMyB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ18yLCAgICBBVkNMZXZlbDIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfMl8xLCAgQVZDTGV2ZWwyMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ18yXzIsICBBVkNMZXZlbDIyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzMsICAgIEFWQ0xldmVsMyB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ18zXzEsICBBVkNMZXZlbDMxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzNfMiwgIEFWQ0xldmVsMzIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfNCwgICAgQVZDTGV2ZWw0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzRfMSwgIEFWQ0xldmVsNDEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfNF8yLCAgQVZDTGV2ZWw0MiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ181LCAgICBBVkNMZXZlbDUgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfNV8xLCAgQVZDTGV2ZWw1MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ181XzIsICBBVkNMZXZlbDUyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzYsICAgIEFWQ0xldmVsNiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ182XzEsICBBVkNMZXZlbDYxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzZfMiwgIEFWQ0xldmVsNjIgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc0F2Y1Byb2ZpbGVzID0geworICAgIC8vIHRyZWF0IHJlc3RyaWN0ZWQgcHJvZmlsZXMgYXMgZnVsbCBwcm9maWxlIGlmIHRoZXJlIGlzIG5vIGVxdWl2YWxlbnQgLSB3aGljaCB3b3JrcyBmb3IKKyAgICAvLyBkZWNvZGVycywgYnV0IG5vdCBmb3IgZW5jb2RlcnMKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19CQVNFTElORSwgICAgICAgICAgICAgICBBVkNQcm9maWxlQmFzZWxpbmUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORSwgICBBVkNQcm9maWxlQ29uc3RyYWluZWRCYXNlbGluZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX01BSU4sICAgICAgICAgICAgICAgICAgIEFWQ1Byb2ZpbGVNYWluIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfRVhURU5ERUQsICAgICAgICAgICAgICAgQVZDUHJvZmlsZUV4dGVuZGVkIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSCwgICAgICAgICAgICAgICAgICAgQVZDUHJvZmlsZUhpZ2ggfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19QUk9HUkVTU0lWRV9ISUdILCAgICAgICBBVkNQcm9maWxlSGlnaCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0hJR0gsICAgICAgIEFWQ1Byb2ZpbGVDb25zdHJhaW5lZEhpZ2ggfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzEwLCAgICAgICAgICAgICAgICBBVkNQcm9maWxlSGlnaDEwIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfUFJPR1JFU1NJVkVfSElHSF8xMCwgICAgQVZDUHJvZmlsZUhpZ2gxMCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfNDIyLCAgICAgICAgICAgICAgIEFWQ1Byb2ZpbGVIaWdoNDIyIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSF80NDRfUFJFRElDVElWRSwgICAgQVZDUHJvZmlsZUhpZ2g0NDQgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzEwX0lOVFJBLCAgICAgICAgICBBVkNQcm9maWxlSGlnaDEwIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSF80MjJfSU5UUkEsICAgICAgICAgQVZDUHJvZmlsZUhpZ2g0MjIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzQ0NF9JTlRSQSwgICAgICAgICBBVkNQcm9maWxlSGlnaDQ0NCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0NBVkxDXzQ0NF9JTlRSQSwgICAgICAgIEFWQ1Byb2ZpbGVIaWdoNDQ0IH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpiaXRyYXRlX21vZGVfdCwgaW50MzJfdD4gc0JpdHJhdGVNb2RlcyA9IHsKKyAgICB7IEMyQ29uZmlnOjpCSVRSQVRFX0NPTlNULCAgICAgIEJJVFJBVEVfTU9ERV9DQlIgfSwKKyAgICB7IEMyQ29uZmlnOjpCSVRSQVRFX1ZBUklBQkxFLCAgIEJJVFJBVEVfTU9ERV9WQlIgfSwKKyAgICB7IEMyQ29uZmlnOjpCSVRSQVRFX0lHTk9SRSwgICAgIEJJVFJBVEVfTU9ERV9DUSB9LAorfTsKKworQUxvb2t1cDxDMkNvbG9yOjptYXRyaXhfdCwgQ29sb3JBc3BlY3RzOjpNYXRyaXhDb2VmZnM+IHNDb2xvck1hdHJpY2VzU2YgPSB7CisgICAgeyBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgICBDb2xvckFzcGVjdHM6Ok1hdHJpeFVuc3BlY2lmaWVkIH0sCisgICAgeyBDMkNvbG9yOjpNQVRSSVhfQlQ3MDksICAgICAgICAgICBDb2xvckFzcGVjdHM6Ok1hdHJpeEJUNzA5XzUgfSwKKyAgICB7IEMyQ29sb3I6Ok1BVFJJWF9GQ0M0N183M182ODIsICAgIENvbG9yQXNwZWN0czo6TWF0cml4QlQ0NzBfNk0gfSwKKyAgICB7IEMyQ29sb3I6Ok1BVFJJWF9CVDYwMSwgICAgICAgICAgIENvbG9yQXNwZWN0czo6TWF0cml4QlQ2MDFfNiB9LAorICAgIHsgQzJDb2xvcjo6TUFUUklYXzI0ME0sICAgICAgIENvbG9yQXNwZWN0czo6TWF0cml4U01QVEUyNDBNIH0sCisgICAgeyBDMkNvbG9yOjpNQVRSSVhfQlQyMDIwLCAgICAgICAgICBDb2xvckFzcGVjdHM6Ok1hdHJpeEJUMjAyMCB9LAorICAgIHsgQzJDb2xvcjo6TUFUUklYX0JUMjAyMF9DT05TVEFOVCwgQ29sb3JBc3BlY3RzOjpNYXRyaXhCVDIwMjBDb25zdGFudCB9LAorICAgIHsgQzJDb2xvcjo6TUFUUklYX09USEVSLCAgICAgICAgICAgQ29sb3JBc3BlY3RzOjpNYXRyaXhPdGhlciB9LAorfTsKKworQUxvb2t1cDxDMkNvbG9yOjpwcmltYXJpZXNfdCwgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXM+IHNDb2xvclByaW1hcmllc1NmID0geworICAgIHsgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNVbnNwZWNpZmllZCB9LAorICAgIHsgQzJDb2xvcjo6UFJJTUFSSUVTX0JUNzA5LCAgICAgICAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNCVDcwOV81IH0sCisgICAgeyBDMkNvbG9yOjpQUklNQVJJRVNfQlQ0NzBfTSwgICAgICBDb2xvckFzcGVjdHM6OlByaW1hcmllc0JUNDcwXzZNIH0sCisgICAgeyBDMkNvbG9yOjpQUklNQVJJRVNfQlQ2MDFfNjI1LCAgICBDb2xvckFzcGVjdHM6OlByaW1hcmllc0JUNjAxXzZfNjI1IH0sCisgICAgeyBDMkNvbG9yOjpQUklNQVJJRVNfQlQ2MDFfNTI1LCAgICBDb2xvckFzcGVjdHM6OlByaW1hcmllc0JUNjAxXzZfNTI1IH0sCisgICAgeyBDMkNvbG9yOjpQUklNQVJJRVNfR0VORVJJQ19GSUxNLCBDb2xvckFzcGVjdHM6OlByaW1hcmllc0dlbmVyaWNGaWxtIH0sCisgICAgeyBDMkNvbG9yOjpQUklNQVJJRVNfQlQyMDIwLCAgICAgICBDb2xvckFzcGVjdHM6OlByaW1hcmllc0JUMjAyMCB9LAorLy8gICAgeyBDMkNvbG9yOjpQUklNQVJJRVNfUlA0MzEsICAgICAgICBDb2xvckFzcGVjdHM6OlByaW1hcmllcy4uLiB9LAorLy8gICAgeyBDMkNvbG9yOjpQUklNQVJJRVNfRUc0MzIsICAgICAgICBDb2xvckFzcGVjdHM6OlByaW1hcmllcy4uLiB9LAorLy8gICAgeyBDMkNvbG9yOjpQUklNQVJJRVNfRUJVMzIxMywgICAgICBDb2xvckFzcGVjdHM6OlByaW1hcmllcy4uLiB9LAorICAgIHsgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSLCAgICAgICAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNPdGhlciB9LAorfTsKKworQUxvb2t1cDxDMkNvbG9yOjpyYW5nZV90LCBpbnQzMl90PiBzQ29sb3JSYW5nZXMgPSB7CisgICAgeyBDMkNvbG9yOjpSQU5HRV9GVUxMLCAgICBDT0xPUl9SQU5HRV9GVUxMIH0sCisgICAgeyBDMkNvbG9yOjpSQU5HRV9MSU1JVEVELCBDT0xPUl9SQU5HRV9MSU1JVEVEIH0sCit9OworCitBTG9va3VwPEMyQ29sb3I6OnJhbmdlX3QsIENvbG9yQXNwZWN0czo6UmFuZ2U+IHNDb2xvclJhbmdlc1NmID0geworICAgIHsgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIENvbG9yQXNwZWN0czo6UmFuZ2VVbnNwZWNpZmllZCB9LAorICAgIHsgQzJDb2xvcjo6UkFOR0VfRlVMTCwgICAgICAgIENvbG9yQXNwZWN0czo6UmFuZ2VGdWxsIH0sCisgICAgeyBDMkNvbG9yOjpSQU5HRV9MSU1JVEVELCAgICAgQ29sb3JBc3BlY3RzOjpSYW5nZUxpbWl0ZWQgfSwKKyAgICB7IEMyQ29sb3I6OlJBTkdFX09USEVSLCAgICAgICBDb2xvckFzcGVjdHM6OlJhbmdlT3RoZXIgfSwKK307CisKK0FMb29rdXA8QzJDb2xvcjo6dHJhbnNmZXJfdCwgaW50MzJfdD4gc0NvbG9yVHJhbnNmZXJzID0geworICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfTElORUFSLCBDT0xPUl9UUkFOU0ZFUl9MSU5FQVIgfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSXzE3ME0sICAgQ09MT1JfVFJBTlNGRVJfU0RSX1ZJREVPIH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9TVDIwODQsIENPTE9SX1RSQU5TRkVSX1NUMjA4NCB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfSExHLCAgICBDT0xPUl9UUkFOU0ZFUl9ITEcgfSwKK307CisKK0FMb29rdXA8QzJDb2xvcjo6dHJhbnNmZXJfdCwgQ29sb3JBc3BlY3RzOjpUcmFuc2Zlcj4gc0NvbG9yVHJhbnNmZXJzU2YgPSB7CisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclVuc3BlY2lmaWVkIH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9MSU5FQVIsICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlckxpbmVhciB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfU1JHQiwgICAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJTUkdCIH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl8xNzBNLCAgICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclNNUFRFMTcwTSB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfR0FNTUEyMiwgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJHYW1tYTIyIH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9HQU1NQTI4LCAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlckdhbW1hMjggfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX1NUMjA4NCwgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyU1QyMDg0IH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9ITEcsICAgICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlckhMRyB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfMjQwTSwgICAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJTTVBURTI0ME0gfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX1hWWUNDLCAgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyWHZZQ0MgfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX0JUMTM2MSwgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyQlQxMzYxIH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9TVDQyOCwgICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclNUNDI4IH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiwgICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2Zlck90aGVyIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpsZXZlbF90LCBpbnQzMl90PiBzRG9sYnlWaXNpb25MZXZlbHMgPSB7CisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfTUFJTl9IRF8yNCwgIERvbGJ5VmlzaW9uTGV2ZWxIZDI0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfTUFJTl9IRF8zMCwgIERvbGJ5VmlzaW9uTGV2ZWxIZDMwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfTUFJTl9GSERfMjQsIERvbGJ5VmlzaW9uTGV2ZWxGaGQyNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX01BSU5fRkhEXzMwLCBEb2xieVZpc2lvbkxldmVsRmhkMzAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9NQUlOX0ZIRF82MCwgRG9sYnlWaXNpb25MZXZlbEZoZDYwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfTUFJTl9VSERfMjQsIERvbGJ5VmlzaW9uTGV2ZWxVaGQyNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX01BSU5fVUhEXzMwLCBEb2xieVZpc2lvbkxldmVsVWhkMzAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9NQUlOX1VIRF80OCwgRG9sYnlWaXNpb25MZXZlbFVoZDQ4IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfTUFJTl9VSERfNjAsIERvbGJ5VmlzaW9uTGV2ZWxVaGQ2MCB9LAorCisgICAgLy8gaGlnaCB0aWVycyBhcmUgbm90IHlldCBzdXBwb3J0ZWQgb24gYW5kcm9pZCwgZm9yIG5vdyBtYXAgdGhlbSB0byBtYWluIHRpZXIKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9ISUdIX0hEXzI0LCAgRG9sYnlWaXNpb25MZXZlbEhkMjQgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9ISUdIX0hEXzMwLCAgRG9sYnlWaXNpb25MZXZlbEhkMzAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9ISUdIX0ZIRF8yNCwgRG9sYnlWaXNpb25MZXZlbEZoZDI0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF9GSERfMzAsIERvbGJ5VmlzaW9uTGV2ZWxGaGQzMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfRkhEXzYwLCBEb2xieVZpc2lvbkxldmVsRmhkNjAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9ISUdIX1VIRF8yNCwgRG9sYnlWaXNpb25MZXZlbFVoZDI0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF9VSERfMzAsIERvbGJ5VmlzaW9uTGV2ZWxVaGQzMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfVUhEXzQ4LCBEb2xieVZpc2lvbkxldmVsVWhkNDggfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9ISUdIX1VIRF82MCwgRG9sYnlWaXNpb25MZXZlbFVoZDYwIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3Q+IHNEb2xieVZpc2lvblByb2ZpbGVzID0geworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfRFZfQVZfUEVSLCBEb2xieVZpc2lvblByb2ZpbGVEdmF2UGVyIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9EVl9BVl9QRU4sIERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZQZW4gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0RWX0hFX0RFUiwgRG9sYnlWaXNpb25Qcm9maWxlRHZoZURlciB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfRFZfSEVfREVOLCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRGVuIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9EVl9IRV8wNCwgRG9sYnlWaXNpb25Qcm9maWxlRHZoZUR0ciB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfRFZfSEVfMDUsIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdG4gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0RWX0hFX0RUSCwgRG9sYnlWaXNpb25Qcm9maWxlRHZoZUR0aCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfRFZfSEVfMDcsIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEdGIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0RWX0hFXzA4LCBEb2xieVZpc2lvblByb2ZpbGVEdmhlU3QgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0RWX0FWXzA5LCBEb2xieVZpc2lvblByb2ZpbGVEdmF2U2UgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmxldmVsX3QsIGludDMyX3Q+IHNIMjYzTGV2ZWxzID0geworICAgIHsgQzJDb25maWc6OkxFVkVMX0gyNjNfMTAsIEgyNjNMZXZlbDEwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSDI2M18yMCwgSDI2M0xldmVsMjAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IMjYzXzMwLCBIMjYzTGV2ZWwzMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0gyNjNfNDAsIEgyNjNMZXZlbDQwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSDI2M180NSwgSDI2M0xldmVsNDUgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IMjYzXzUwLCBIMjYzTGV2ZWw1MCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0gyNjNfNjAsIEgyNjNMZXZlbDYwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSDI2M183MCwgSDI2M0xldmVsNzAgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc0gyNjNQcm9maWxlcyA9IHsKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfQkFTRUxJTkUsICAgICAgICAgIEgyNjNQcm9maWxlQmFzZWxpbmUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSDMyMCwgICAgICAgICAgICAgIEgyNjNQcm9maWxlSDMyMENvZGluZyB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSDI2M19WMUJDLCAgICAgICAgICAgICAgSDI2M1Byb2ZpbGVCYWNrd2FyZENvbXBhdGlibGUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSVNXVjIsICAgICAgICAgICAgIEgyNjNQcm9maWxlSVNXVjIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSVNXVjMsICAgICAgICAgICAgIEgyNjNQcm9maWxlSVNXVjMgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSElHSF9DT01QUkVTU0lPTiwgIEgyNjNQcm9maWxlSGlnaENvbXByZXNzaW9uIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0lOVEVSTkVULCAgICAgICAgICBIMjYzUHJvZmlsZUludGVybmV0IH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0lOVEVSTEFDRSwgICAgICAgICBIMjYzUHJvZmlsZUludGVybGFjZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSDI2M19ISUdIX0xBVEVOQ1ksICAgICAgSDI2M1Byb2ZpbGVIaWdoTGF0ZW5jeSB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdD4gc0hldmNMZXZlbHMgPSB7CisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzEsICAgICAgSEVWQ01haW5UaWVyTGV2ZWwxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzIsICAgICAgSEVWQ01haW5UaWVyTGV2ZWwyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzJfMSwgICAgSEVWQ01haW5UaWVyTGV2ZWwyMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8zLCAgICAgIEhFVkNNYWluVGllckxldmVsMyB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8zXzEsICAgIEhFVkNNYWluVGllckxldmVsMzEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNCwgICAgICBIRVZDTWFpblRpZXJMZXZlbDQgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNF8xLCAgICBIRVZDTWFpblRpZXJMZXZlbDQxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzUsICAgICAgSEVWQ01haW5UaWVyTGV2ZWw1IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzVfMSwgICAgSEVWQ01haW5UaWVyTGV2ZWw1MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl81XzIsICAgIEhFVkNNYWluVGllckxldmVsNTIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNiwgICAgICBIRVZDTWFpblRpZXJMZXZlbDYgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNl8xLCAgICBIRVZDTWFpblRpZXJMZXZlbDYxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzZfMiwgICAgSEVWQ01haW5UaWVyTGV2ZWw2MiB9LAorCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzQsICAgICAgSEVWQ0hpZ2hUaWVyTGV2ZWw0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzRfMSwgICAgSEVWQ0hpZ2hUaWVyTGV2ZWw0MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF81LCAgICAgIEhFVkNIaWdoVGllckxldmVsNSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF81XzEsICAgIEhFVkNIaWdoVGllckxldmVsNTEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNV8yLCAgICBIRVZDSGlnaFRpZXJMZXZlbDUyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzYsICAgICAgSEVWQ0hpZ2hUaWVyTGV2ZWw2IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzZfMSwgICAgSEVWQ0hpZ2hUaWVyTGV2ZWw2MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF82XzIsICAgIEhFVkNIaWdoVGllckxldmVsNjIgfSwKKworICAgIC8vIG1hcCBoaWdoIHRpZXIgbGV2ZWxzIGJlbG93IDQgdG8gbWFpbiB0aWVyCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzEsICAgICAgSEVWQ0hpZ2hUaWVyTGV2ZWwxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzIsICAgICAgSEVWQ0hpZ2hUaWVyTGV2ZWwyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzJfMSwgICAgSEVWQ0hpZ2hUaWVyTGV2ZWwyMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8zLCAgICAgIEhFVkNIaWdoVGllckxldmVsMyB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8zXzEsICAgIEhFVkNIaWdoVGllckxldmVsMzEgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc0hldmNQcm9maWxlcyA9IHsKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTiwgSEVWQ1Byb2ZpbGVNYWluIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fMTAsIEhFVkNQcm9maWxlTWFpbjEwIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fU1RJTEwsIEhFVkNQcm9maWxlTWFpblN0aWxsIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fSU5UUkEsIEhFVkNQcm9maWxlTWFpbiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzEwX0lOVFJBLCBIRVZDUHJvZmlsZU1haW4xMCB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzSGV2Y0hkclByb2ZpbGVzID0geworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzEwLCBIRVZDUHJvZmlsZU1haW4xMEhEUjEwIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3Q+IHNIZXZjSGRyMTBQbHVzUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fMTAsIEhFVkNQcm9maWxlTWFpbjEwSERSMTBQbHVzIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpsZXZlbF90LCBpbnQzMl90PiBzTXBlZzJMZXZlbHMgPSB7CisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVAyVl9MT1csICAgICAgICAgTVBFRzJMZXZlbExMIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVAyVl9NQUlOLCAgICAgICAgTVBFRzJMZXZlbE1MIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdIXzE0NDAsICAgTVBFRzJMZXZlbEgxNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX01QMlZfSElHSCwgICAgICAgIE1QRUcyTGV2ZWxITCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX01QMlZfSElHSFAsICAgICAgIE1QRUcyTGV2ZWxIUCB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzTXBlZzJQcm9maWxlcyA9IHsKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfU0lNUExFLCAgICAgICAgICAgICAgICBNUEVHMlByb2ZpbGVTaW1wbGUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfTUFJTiwgICAgICAgICAgICAgICAgICBNUEVHMlByb2ZpbGVNYWluIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX1NOUl9TQ0FMQUJMRSwgICAgICAgICAgTVBFRzJQcm9maWxlU05SIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX1NQQVRJQUxMWV9TQ0FMQUJMRSwgICAgTVBFRzJQcm9maWxlU3BhdGlhbCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9ISUdILCAgICAgICAgICAgICAgICAgIE1QRUcyUHJvZmlsZUhpZ2ggfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfNDIyLCAgICAgICAgICAgICAgICAgICBNUEVHMlByb2ZpbGU0MjIgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmxldmVsX3QsIGludDMyX3Q+IHNNcGVnNExldmVscyA9IHsKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDRWXzAsICAgTVBFRzRMZXZlbDAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDRWXzBCLCAgTVBFRzRMZXZlbDBiIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8xLCAgIE1QRUc0TGV2ZWwxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8yLCAgIE1QRUc0TGV2ZWwyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8zLCAgIE1QRUc0TGV2ZWwzIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8zQiwgIE1QRUc0TGV2ZWwzYiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX01QNFZfNCwgICBNUEVHNExldmVsNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX01QNFZfNEEsICBNUEVHNExldmVsNGEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDRWXzUsICAgTVBFRzRMZXZlbDUgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDRWXzYsICAgTVBFRzRMZXZlbDYgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc01wZWc0UHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX1NJTVBMRSwgICAgICAgICAgICBNUEVHNFByb2ZpbGVTaW1wbGUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfU0lNUExFX1NDQUxBQkxFLCAgIE1QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX0NPUkUsICAgICAgICAgICAgICBNUEVHNFByb2ZpbGVDb3JlIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX01BSU4sICAgICAgICAgICAgICBNUEVHNFByb2ZpbGVNYWluIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX05CSVQsICAgICAgICAgICAgICBNUEVHNFByb2ZpbGVOYml0IH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX0FSVFMsICAgICAgICAgICAgICBNUEVHNFByb2ZpbGVBZHZhbmNlZFJlYWxUaW1lIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX0NPUkVfU0NBTEFCTEUsICAgICBNUEVHNFByb2ZpbGVDb3JlU2NhbGFibGUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQUNFLCAgICAgICAgICAgICAgIE1QRUc0UHJvZmlsZUFkdmFuY2VkQ29kaW5nIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX0FEVkFOQ0VEX0NPUkUsICAgICBNUEVHNFByb2ZpbGVBZHZhbmNlZENvcmUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQURWQU5DRURfU0lNUExFLCAgIE1QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdCwgaW50MzJfdD4gc1BjbUVuY29kaW5ncyA9IHsKKyAgICB7IEMyQ29uZmlnOjpQQ01fOCwga0F1ZGlvRW5jb2RpbmdQY204Yml0IH0sCisgICAgeyBDMkNvbmZpZzo6UENNXzE2LCBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0IH0sCisgICAgeyBDMkNvbmZpZzo6UENNX0ZMT0FULCBrQXVkaW9FbmNvZGluZ1BjbUZsb2F0IH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpsZXZlbF90LCBpbnQzMl90PiBzVnA5TGV2ZWxzID0geworICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV8xLCAgICBWUDlMZXZlbDEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9WUDlfMV8xLCAgVlA5TGV2ZWwxMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV8yLCAgICBWUDlMZXZlbDIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9WUDlfMl8xLCAgVlA5TGV2ZWwyMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV8zLCAgICBWUDlMZXZlbDMgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9WUDlfM18xLCAgVlA5TGV2ZWwzMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV80LCAgICBWUDlMZXZlbDQgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9WUDlfNF8xLCAgVlA5TGV2ZWw0MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV81LCAgICBWUDlMZXZlbDUgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9WUDlfNV8xLCAgVlA5TGV2ZWw1MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV81XzIsICBWUDlMZXZlbDUyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzYsICAgIFZQOUxldmVsNiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV82XzEsICBWUDlMZXZlbDYxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzZfMiwgIFZQOUxldmVsNjIgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc1ZwOVByb2ZpbGVzID0geworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfVlA5XzAsIFZQOVByb2ZpbGUwIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMSwgVlA5UHJvZmlsZTEgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8yLCBWUDlQcm9maWxlMiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfVlA5XzMsIFZQOVByb2ZpbGUzIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMiwgVlA5UHJvZmlsZTJIRFIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8zLCBWUDlQcm9maWxlM0hEUiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfVlA5XzIsIFZQOVByb2ZpbGUySERSMTBQbHVzIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMywgVlA5UHJvZmlsZTNIRFIxMFBsdXMgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc1ZwOUhkclByb2ZpbGVzID0geworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfVlA5XzIsIFZQOVByb2ZpbGUySERSIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMywgVlA5UHJvZmlsZTNIRFIgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc1ZwOUhkcjEwUGx1c1Byb2ZpbGVzID0geworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfVlA5XzIsIFZQOVByb2ZpbGUySERSMTBQbHVzIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMywgVlA5UHJvZmlsZTNIRFIxMFBsdXMgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmxldmVsX3QsIGludDMyX3Q+IHNBdjFMZXZlbHMgPSB7CisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzIsICAgIEFWMUxldmVsMiAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfMl8xLCAgQVYxTGV2ZWwyMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV8yXzIsICBBVjFMZXZlbDIyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzJfMywgIEFWMUxldmVsMjMgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfMywgICAgQVYxTGV2ZWwzICB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV8zXzEsICBBVjFMZXZlbDMxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzNfMiwgIEFWMUxldmVsMzIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfM18zLCAgQVYxTGV2ZWwzMyB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV80LCAgICBBVjFMZXZlbDQgIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzRfMSwgIEFWMUxldmVsNDEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfNF8yLCAgQVYxTGV2ZWw0MiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV80XzMsICBBVjFMZXZlbDQzIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzUsICAgIEFWMUxldmVsNSAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfNV8xLCAgQVYxTGV2ZWw1MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV81XzIsICBBVjFMZXZlbDUyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzVfMywgIEFWMUxldmVsNTMgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfNiwgICAgQVYxTGV2ZWw2ICB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV82XzEsICBBVjFMZXZlbDYxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzZfMiwgIEFWMUxldmVsNjIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfNl8zLCAgQVYxTGV2ZWw2MyB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV83LCAgICBBVjFMZXZlbDcgIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzdfMSwgIEFWMUxldmVsNzEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfN18yLCAgQVYxTGV2ZWw3MiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV83XzMsICBBVjFMZXZlbDczIH0sCit9OworCisKK0FMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc0F2MVByb2ZpbGVzID0geworICAgIC8vIFRPRE86IHdpbGwgbmVlZCB0byBkaXNhbWJpZ3VhdGUgYmV0d2VlbiBNYWluOCBhbmQgTWFpbjEwCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCwgQVYxUHJvZmlsZU1haW44IH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCwgQVYxUHJvZmlsZU1haW4xMCB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzQXYxSGRyUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCwgQVYxUHJvZmlsZU1haW4xMCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVYxXzAsIEFWMVByb2ZpbGVNYWluMTBIRFIxMCB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzQXYxSGRyMTBQbHVzUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCwgQVYxUHJvZmlsZU1haW4xMEhEUjEwUGx1cyB9LAorfTsKKworLyoqCisgKiBBIGhlbHBlciB0aGF0IHBhc3NlcyB0aHJvdWdoIHZlbmRvciBleHRlbnNpb24gcHJvZmlsZSBhbmQgbGV2ZWwgdmFsdWVzLgorICovCitzdHJ1Y3QgUHJvZmlsZUxldmVsTWFwcGVySGVscGVyIDogQzJNYXBwZXI6OlByb2ZpbGVMZXZlbE1hcHBlciB7CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6bGV2ZWxfdCBmcm9tLCBpbnQzMl90ICp0bykgPSAwOworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6bGV2ZWxfdCAqdG8pID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpwcm9maWxlX3QgZnJvbSwgaW50MzJfdCAqdG8pID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pID0gMDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CisgICAgYm9vbCBwYXNzVGhyb3VnaE1hcChUIGZyb20sIFUgKnRvKSB7CisgICAgICAgIC8vIGFsbG93IChhbmQgcGFzcyB0aHJvdWdoKSB2ZW5kb3IgZXh0ZW5zaW9ucworICAgICAgICBpZiAoZnJvbSA+PSAoVClDMl9QUk9GSUxFX0xFVkVMX1ZFTkRPUl9TVEFSVCAmJiBmcm9tIDwgKFQpSU5UMzJfTUFYKSB7CisgICAgICAgICAgICAqdG8gPSAoVSlmcm9tOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNpbXBsZU1hcChmcm9tLCB0byk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIG1hcExldmVsKEMyQ29uZmlnOjpsZXZlbF90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBwYXNzVGhyb3VnaE1hcChmcm9tLCB0byk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIG1hcExldmVsKGludDMyX3QgZnJvbSwgQzJDb25maWc6OmxldmVsX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBwYXNzVGhyb3VnaE1hcChmcm9tLCB0byk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIG1hcFByb2ZpbGUoQzJDb25maWc6OnByb2ZpbGVfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gcGFzc1Rocm91Z2hNYXAoZnJvbSwgdG8pOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBtYXBQcm9maWxlKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHBhc3NUaHJvdWdoTWFwKGZyb20sIHRvKTsKKyAgICB9Cit9OworCisvLyBBQUMgb25seSB1c2VzIHByb2ZpbGVzLCBtYXAgYWxsIGxldmVscyB0byB1bnVzZWQgb3IgMAorc3RydWN0IEFhY1Byb2ZpbGVMZXZlbE1hcHBlciA6IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciB7CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgKnRvID0gMDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCwgQzJDb25maWc6OmxldmVsX3QgKnRvKSB7CisgICAgICAgICp0byA9IEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpwcm9maWxlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNBYWNQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNBYWNQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KK307CisKK3N0cnVjdCBBdmNQcm9maWxlTGV2ZWxNYXBwZXIgOiBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgeworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNBdmNMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgeworICAgICAgICByZXR1cm4gc0F2Y0xldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpwcm9maWxlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNBdmNQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNBdmNQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KK307CisKK3N0cnVjdCBEb2xieVZpc2lvblByb2ZpbGVMZXZlbE1hcHBlciA6IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciB7CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6bGV2ZWxfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gc0RvbGJ5VmlzaW9uTGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6bGV2ZWxfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNEb2xieVZpc2lvbkxldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpwcm9maWxlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNEb2xieVZpc2lvblByb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6cHJvZmlsZV90ICp0bykgeworICAgICAgICByZXR1cm4gc0RvbGJ5VmlzaW9uUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgSDI2M1Byb2ZpbGVMZXZlbE1hcHBlciA6IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciB7CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6bGV2ZWxfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gc0gyNjNMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgeworICAgICAgICByZXR1cm4gc0gyNjNMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzSDI2M1Byb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6cHJvZmlsZV90ICp0bykgeworICAgICAgICByZXR1cm4gc0gyNjNQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KK307CisKK3N0cnVjdCBIZXZjUHJvZmlsZUxldmVsTWFwcGVyIDogUHJvZmlsZUxldmVsTWFwcGVySGVscGVyIHsKKyAgICBIZXZjUHJvZmlsZUxldmVsTWFwcGVyKGJvb2wgaXNIZHIgPSBmYWxzZSwgYm9vbCBpc0hkcjEwUGx1cyA9IGZhbHNlKSA6CisgICAgICAgIFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlcigpLAorICAgICAgICBtSXNIZHIoaXNIZHIpLCBtSXNIZHIxMFBsdXMoaXNIZHIxMFBsdXMpIHt9CisKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpsZXZlbF90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzSGV2Y0xldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OmxldmVsX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzSGV2Y0xldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpwcm9maWxlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIG1Jc0hkcjEwUGx1cyA/IHNIZXZjSGRyMTBQbHVzUHJvZmlsZXMubWFwKGZyb20sIHRvKSA6CisgICAgICAgICAgICAgICAgICAgICBtSXNIZHIgPyBzSGV2Y0hkclByb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0hldmNQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIG1Jc0hkcjEwUGx1cyA/IHNIZXZjSGRyMTBQbHVzUHJvZmlsZXMubWFwKGZyb20sIHRvKSA6CisgICAgICAgICAgICAgICAgICAgICBtSXNIZHIgPyBzSGV2Y0hkclByb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0hldmNQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKworcHJpdmF0ZToKKyAgICBib29sIG1Jc0hkcjsKKyAgICBib29sIG1Jc0hkcjEwUGx1czsKK307CisKK3N0cnVjdCBNcGVnMlByb2ZpbGVMZXZlbE1hcHBlciA6IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciB7CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6bGV2ZWxfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gc01wZWcyTGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6bGV2ZWxfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNNcGVnMkxldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpwcm9maWxlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNNcGVnMlByb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6cHJvZmlsZV90ICp0bykgeworICAgICAgICByZXR1cm4gc01wZWcyUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgTXBlZzRQcm9maWxlTGV2ZWxNYXBwZXIgOiBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgeworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNNcGVnNExldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OmxldmVsX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzTXBlZzRMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzTXBlZzRQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNNcGVnNFByb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorfTsKKworLy8gVlA4IGhhcyBubyBwcm9maWxlcyBhbmQgbGV2ZWxzIGluIENvZGVjIDIuMCwgYnV0IHdlIHVzZSBtYWluIHByb2ZpbGUgYW5kIGxldmVsIDAgaW4gTWVkaWFDb2RlYworLy8gbWFwIGFsbCBwcm9maWxlcyBhbmQgbGV2ZWxzIHRvIHRoYXQuCitzdHJ1Y3QgVnA4UHJvZmlsZUxldmVsTWFwcGVyIDogUHJvZmlsZUxldmVsTWFwcGVySGVscGVyIHsKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpsZXZlbF90LCBpbnQzMl90ICp0bykgeworICAgICAgICAqdG8gPSBWUDhMZXZlbF9WZXJzaW9uMDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCwgQzJDb25maWc6OmxldmVsX3QgKnRvKSB7CisgICAgICAgICp0byA9IEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3QgKnRvKSB7CisgICAgICAgICp0byA9IFZQOFByb2ZpbGVNYWluOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90LCBDMkNvbmZpZzo6cHJvZmlsZV90ICp0bykgeworICAgICAgICAqdG8gPSBDMkNvbmZpZzo6UFJPRklMRV9VTlVTRUQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK307CisKK3N0cnVjdCBWcDlQcm9maWxlTGV2ZWxNYXBwZXIgOiBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgeworICAgIFZwOVByb2ZpbGVMZXZlbE1hcHBlcihib29sIGlzSGRyID0gZmFsc2UsIGJvb2wgaXNIZHIxMFBsdXMgPSBmYWxzZSkgOgorICAgICAgICBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIoKSwKKyAgICAgICAgbUlzSGRyKGlzSGRyKSwgbUlzSGRyMTBQbHVzKGlzSGRyMTBQbHVzKSB7fQorCisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6bGV2ZWxfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gc1ZwOUxldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OmxldmVsX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzVnA5TGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OnByb2ZpbGVfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gbUlzSGRyMTBQbHVzID8gc1ZwOUhkcjEwUGx1c1Byb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICAgbUlzSGRyID8gc1ZwOUhkclByb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1ZwOVByb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6cHJvZmlsZV90ICp0bykgeworICAgICAgICByZXR1cm4gbUlzSGRyMTBQbHVzID8gc1ZwOUhkcjEwUGx1c1Byb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICAgbUlzSGRyID8gc1ZwOUhkclByb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1ZwOVByb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorCitwcml2YXRlOgorICAgIGJvb2wgbUlzSGRyOworICAgIGJvb2wgbUlzSGRyMTBQbHVzOworfTsKKworc3RydWN0IEF2MVByb2ZpbGVMZXZlbE1hcHBlciA6IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciB7CisgICAgQXYxUHJvZmlsZUxldmVsTWFwcGVyKGJvb2wgaXNIZHIgPSBmYWxzZSwgYm9vbCBpc0hkcjEwUGx1cyA9IGZhbHNlKSA6CisgICAgICAgIFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlcigpLAorICAgICAgICBtSXNIZHIoaXNIZHIpLCBtSXNIZHIxMFBsdXMoaXNIZHIxMFBsdXMpIHt9CisKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpsZXZlbF90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzQXYxTGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6bGV2ZWxfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNBdjFMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBtSXNIZHIxMFBsdXMgPyBzQXYxSGRyMTBQbHVzUHJvZmlsZXMubWFwKGZyb20sIHRvKSA6CisgICAgICAgICAgICAgICAgICAgICBtSXNIZHIgPyBzQXYxSGRyUHJvZmlsZXMubWFwKGZyb20sIHRvKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQXYxUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBtSXNIZHIxMFBsdXMgPyBzQXYxSGRyMTBQbHVzUHJvZmlsZXMubWFwKGZyb20sIHRvKSA6CisgICAgICAgICAgICAgICAgICAgICBtSXNIZHIgPyBzQXYxSGRyUHJvZmlsZXMubWFwKGZyb20sIHRvKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQXYxUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgYm9vbCBtSXNIZHI7CisgICAgYm9vbCBtSXNIZHIxMFBsdXM7Cit9OworCit9IC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK3N0ZDo6c2hhcmVkX3B0cjxDMk1hcHBlcjo6UHJvZmlsZUxldmVsTWFwcGVyPgorQzJNYXBwZXI6OkdldFByb2ZpbGVMZXZlbE1hcHBlcihzdGQ6OnN0cmluZyBtZWRpYVR5cGUpIHsKKyAgICBzdGQ6OnRyYW5zZm9ybShtZWRpYVR5cGUuYmVnaW4oKSwgbWVkaWFUeXBlLmJlZ2luKCksIG1lZGlhVHlwZS5lbmQoKSwgOjp0b2xvd2VyKTsKKyAgICBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX0FVRElPX0FBQykgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxBYWNQcm9maWxlTGV2ZWxNYXBwZXI+KCk7CisgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fQVZDKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEF2Y1Byb2ZpbGVMZXZlbE1hcHBlcj4oKTsKKyAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04pIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8RG9sYnlWaXNpb25Qcm9maWxlTGV2ZWxNYXBwZXI+KCk7CisgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fSDI2MykgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxIMjYzUHJvZmlsZUxldmVsTWFwcGVyPigpOworICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX0hFVkMpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8SGV2Y1Byb2ZpbGVMZXZlbE1hcHBlcj4oKTsKKyAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19NUEVHMikgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxNcGVnMlByb2ZpbGVMZXZlbE1hcHBlcj4oKTsKKyAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19NUEVHNCkgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxNcGVnNFByb2ZpbGVMZXZlbE1hcHBlcj4oKTsKKyAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19WUDgpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8VnA4UHJvZmlsZUxldmVsTWFwcGVyPigpOworICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX1ZQOSkgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxWcDlQcm9maWxlTGV2ZWxNYXBwZXI+KCk7CisgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fQVYxKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEF2MVByb2ZpbGVMZXZlbE1hcHBlcj4oKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKKy8vIHN0YXRpYworc3RkOjpzaGFyZWRfcHRyPEMyTWFwcGVyOjpQcm9maWxlTGV2ZWxNYXBwZXI+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+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgICAgICAgICAga0NhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICAgICAgICAgJmJsb2NrKSk7CisgICAgICAgICAgICB3Vmlld3MucHVzaF9iYWNrKGJsb2NrLT5tYXAoKS5nZXQoKSk7CisgICAgICAgICAgICBDMkNvbnN0TGluZWFyQmxvY2sgY0Jsb2NrID0gYmxvY2stPnNoYXJlKDAsIGtDYXBhY2l0eSAvIDIsIEMyRmVuY2UoKSk7CisgICAgICAgICAgICByVmlld3MucHVzaF9iYWNrKGNCbG9jay5tYXAoKS5nZXQoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvdm5kay9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhNjk4MTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTAzIEBACitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfaW50ZXJuYWwiLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW50ZXJuYWwiLAorICAgIF0sCisKKyAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyB3aGVuIHRoaXMgbW9kdWxlIGlzIG1vdmVkIGJhY2sgdG8gZnJhbWV3b3Jrcy9hdi4KKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorfQorCisvLyAhISFETyBOT1QgREVQRU5EIE9OIFRISVMgU0hBUkVEIExJQlJBUlkgRElSRUNUTFkhISEKKy8vIHVzZSBsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyBpbnN0ZWFkCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl92bmRrIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiQzJBbGxvY2F0b3JJb24uY3BwIiwKKyAgICAgICAgIkMyQWxsb2NhdG9yR3JhbGxvYy5jcHAiLAorICAgICAgICAiQzJCdWZmZXIuY3BwIiwKKyAgICAgICAgIkMyQ29uZmlnLmNwcCIsCisgICAgICAgICJDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIuY3BwIiwKKyAgICAgICAgIkMyU3RvcmUuY3BwIiwKKyAgICAgICAgInBsYXRmb3JtL0MyQnFCdWZmZXIuY3BwIiwKKyAgICAgICAgInR5cGVzLmNwcCIsCisgICAgICAgICJ1dGlsL0MyRGVidWcuY3BwIiwKKyAgICAgICAgInV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuY3BwIiwKKyAgICAgICAgInV0aWwvQzJJbnRlcmZhY2VVdGlscy5jcHAiLAorICAgICAgICAidXRpbC9DMlBhcmFtVXRpbHMuY3BwIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCIsCisgICAgXSwKKworICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW50ZXJuYWwiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAorICAgICAgICAibGliY29kZWMyX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5hbGxvY2F0b3JAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MubWFwcGVyQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJkbCIsCisgICAgICAgICJsaWJoYXJkd2FyZSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJpb24iLAorICAgICAgICAibGliZm1xIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMCIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKK30KKworLy8gcHVibGljIGRlcGVuZGVuY3kgZm9yIGltcGxlbWVudGluZyBDb2RlYyAyIGNvbXBvbmVudHMKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGliY29kZWMyLWltcGwtZGVmYXVsdHMiLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLCAvLyBmb3IgQzJfTE9HCisgICAgICAgICJsaWJsb2ciLCAvLyBmb3IgQUxPRworICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorfQorCisvLyBwdWJsaWMgZGVwZW5kZW5jeSBmb3IgaW1wbGVtZW50aW5nIENvZGVjIDIgZnJhbWV3b3JrIHV0aWxpdGllcworLy8gVEhJUyBJUyBPTkxZIEZPUiBGUkFNRVdPUksgVVNFIE9OTFkKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGliY29kZWMyLWludGVybmFsLWRlZmF1bHRzIiwKKyAgICBkZWZhdWx0czogWyJsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsIC8vIGZvciBwcm9wZXJ0aWVzCisgICAgXSwKKworICAgIC8vIFRPRE86IHNlcGFyYXRlIGludGVybmFsIGhlYWRlcnMgc28gdGhleSBjYW4gYmUgZXhwb3NlZCBoZXJlCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9yR3JhbGxvYy5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkFsbG9jYXRvckdyYWxsb2MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2OThiZjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkFsbG9jYXRvckdyYWxsb2MuY3BwCkBAIC0wLDAgKzEsODQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMkFsbG9jYXRvckdyYWxsb2MiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2FsbG9jYXRvci8yLjAvSUFsbG9jYXRvci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvbWFwcGVyLzIuMC9JTWFwcGVyLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9ncmFsbG9jLmg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKyAgICBlbnVtIDogdWludDY0X3QgeworICAgICAgICAvKioKKyAgICAgICAgICogVXNhZ2UgbWFzayB0aGF0IGlzIHBhc3NlZCB0aHJvdWdoIGZyb20gZ3JhbGxvYyB0byBDb2RlYyAyLjAgdXNhZ2UuCisgICAgICAgICAqLworICAgICAgICBQQVNTVEhST1VHSF9VU0FHRV9NQVNLID0KKyAgICAgICAgICAgIH4oR1JBTExPQ19VU0FHRV9TV19SRUFEX01BU0sgfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX01BU0sgfCBHUkFMTE9DX1VTQUdFX1BST1RFQ1RFRCkKKyAgICB9OworCisgICAgLy8gdmVyaWZ5IHRoYXQgcGFzc3Rocm91Z2ggbWFzayBpcyB3aXRoaW4gdGhlIHBsYXRmb3JtIG1hc2sKKyAgICBzdGF0aWNfYXNzZXJ0KCh+QzJNZW1vcnlVc2FnZTo6UExBVEZPUk1fTUFTSyAmIFBBU1NUSFJPVUdIX1VTQUdFX01BU0spID09IDAsICIiKTsKK30KKworQzJNZW1vcnlVc2FnZSBDMkFuZHJvaWRNZW1vcnlVc2FnZTo6RnJvbUdyYWxsb2NVc2FnZSh1aW50NjRfdCB1c2FnZSkgeworICAgIC8vIGdyYWxsb2MgZG9lcyBub3Qgc3VwcG9ydCBXUklURV9QUk9URUNURUQKKyAgICByZXR1cm4gQzJNZW1vcnlVc2FnZSgKKyAgICAgICAgICAgICgodXNhZ2UgJiBHUkFMTE9DX1VTQUdFX1NXX1JFQURfTUFTSykgPyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCA6IDApIHwKKyAgICAgICAgICAgICgodXNhZ2UgJiBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX01BU0spID8gQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIDogMCkgfAorICAgICAgICAgICAgKCh1c2FnZSAmIEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVEKSA/IEMyTWVtb3J5VXNhZ2U6OlJFQURfUFJPVEVDVEVEIDogMCkgfAorICAgICAgICAgICAgKHVzYWdlICYgUEFTU1RIUk9VR0hfVVNBR0VfTUFTSykpOworfQorCit1aW50NjRfdCBDMkFuZHJvaWRNZW1vcnlVc2FnZTo6YXNHcmFsbG9jVXNhZ2UoKSBjb25zdCB7CisgICAgLy8gZ3JhbGxvYyBkb2VzIG5vdCBzdXBwb3J0IFdSSVRFX1BST1RFQ1RFRAorICAgIHJldHVybiAoKChleHBlY3RlZCAmIEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEKSA/IEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTiA6IDApIHwKKyAgICAgICAgICAgICgoZXhwZWN0ZWQgJiBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUpID8gR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiA6IDApIHwKKyAgICAgICAgICAgICgoZXhwZWN0ZWQgJiBDMk1lbW9yeVVzYWdlOjpSRUFEX1BST1RFQ1RFRCkgPyBHUkFMTE9DX1VTQUdFX1BST1RFQ1RFRCA6IDApIHwKKyAgICAgICAgICAgIChleHBlY3RlZCAmIFBBU1NUSFJPVUdIX1VTQUdFX01BU0spKTsKK30KKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmFsbG9jYXRvcjo6VjJfMDo6SUFsbG9jYXRvcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OkJ1ZmZlclVzYWdlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6bWFwcGVyOjpWMl8wOjpCdWZmZXJEZXNjcmlwdG9yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6Om1hcHBlcjo6VjJfMDo6RXJyb3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6bWFwcGVyOjpWMl8wOjpJTWFwcGVyOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6Om1hcHBlcjo6VjJfMDo6WUNiQ3JMYXlvdXQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOworCituYW1lc3BhY2UgeworCitzdHJ1Y3QgQnVmZmVyRGVzY3JpcHRvckluZm8geworICAgIElNYXBwZXI6OkJ1ZmZlckRlc2NyaXB0b3JJbmZvIG1hcHBlckluZm87CisgICAgdWludDMyX3Qgc3RyaWRlOworfTsKKworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEdSQUxMT0MgQUxMT0NBVElPTiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK3N0YXRpYyBjMl9zdGF0dXNfdCBtYXBlcnIyZXJyb3IoRXJyb3IgbWFwZXJyKSB7CisgICAgc3dpdGNoIChtYXBlcnIpIHsKKyAgICAgICAgY2FzZSBFcnJvcjo6Tk9ORTogICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgY2FzZSBFcnJvcjo6QkFEX0RFU0NSSVBUT1I6IHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgIGNhc2UgRXJyb3I6OkJBRF9CVUZGRVI6ICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICBjYXNlIEVycm9yOjpCQURfVkFMVUU6ICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgY2FzZSBFcnJvcjo6Tk9fUkVTT1VSQ0VTOiAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgICAgIGNhc2UgRXJyb3I6OlVOU1VQUE9SVEVEOiAgICByZXR1cm4gQzJfQ0FOTk9UX0RPOworICAgIH0KKyAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworfQorCitzdGF0aWMKK2Jvb2wgbmF0aXZlX2hhbmRsZV9pc19pbnZhbGlkKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqY29uc3QgaGFuZGxlKSB7CisgICAgLy8gcGVyZm9ybSBiYXNpYyB2YWxpZGF0aW9uIG9mIGEgbmF0aXZlIGhhbmRsZQorICAgIGlmIChoYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICAvLyBudWxsIGhhbmRsZSBpcyBjb25zaWRlcmVkIHZhbGlkCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuICgoc2l6ZV90KWhhbmRsZS0+dmVyc2lvbiAhPSBzaXplb2YobmF0aXZlX2hhbmRsZV90KSB8fAorICAgICAgICAgICAgaGFuZGxlLT5udW1GZHMgPCAwIHx8CisgICAgICAgICAgICBoYW5kbGUtPm51bUludHMgPCAwIHx8CisgICAgICAgICAgICAvLyBmb3Igc2FuaXR5IGFzc3VtZSBoYW5kbGVzIG11c3Qgb2NjdXB5IGxlc3MgbWVtb3J5IHRoYW4gSU5UX01BWCBieXRlcworICAgICAgICAgICAgaGFuZGxlLT5udW1GZHMgPiBpbnQoKElOVF9NQVggLSBoYW5kbGUtPnZlcnNpb24pIC8gc2l6ZW9mKGludCkpIC0gaGFuZGxlLT5udW1JbnRzKTsKK30KKworY2xhc3MgQzJIYW5kbGVHcmFsbG9jIDogcHVibGljIEMySGFuZGxlIHsKK3ByaXZhdGU6CisgICAgc3RydWN0IEV4dHJhRGF0YSB7CisgICAgICAgIHVpbnQzMl90IHdpZHRoOworICAgICAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgICAgIHVpbnQzMl90IGZvcm1hdDsKKyAgICAgICAgdWludDMyX3QgdXNhZ2VfbG87CisgICAgICAgIHVpbnQzMl90IHVzYWdlX2hpOworICAgICAgICB1aW50MzJfdCBzdHJpZGU7CisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgIHVpbnQzMl90IGlnYnBfaWRfbG87CisgICAgICAgIHVpbnQzMl90IGlnYnBfaWRfaGk7CisgICAgICAgIHVpbnQzMl90IGlnYnBfc2xvdDsKKyAgICAgICAgdWludDMyX3QgbWFnaWM7CisgICAgfTsKKworICAgIGVudW0geworICAgICAgICBOVU1fSU5UUyA9IHNpemVvZihFeHRyYURhdGEpIC8gc2l6ZW9mKGludCksCisgICAgfTsKKyAgICBjb25zdCBzdGF0aWMgdWludDMyX3QgTUFHSUMgPSAnXHhjMmdyXHgwMCc7CisKKyAgICBzdGF0aWMKKyAgICBjb25zdCBFeHRyYURhdGEqIGdldEV4dHJhRGF0YShjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlKSB7CisgICAgICAgIGlmIChoYW5kbGUgPT0gbnVsbHB0cgorICAgICAgICAgICAgICAgIHx8IG5hdGl2ZV9oYW5kbGVfaXNfaW52YWxpZChoYW5kbGUpCisgICAgICAgICAgICAgICAgfHwgaGFuZGxlLT5udW1JbnRzIDwgTlVNX0lOVFMpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IEV4dHJhRGF0YSo+KAorICAgICAgICAgICAgICAgICZoYW5kbGUtPmRhdGFbaGFuZGxlLT5udW1GZHMgKyBoYW5kbGUtPm51bUludHMgLSBOVU1fSU5UU10pOworICAgIH0KKworICAgIHN0YXRpYworICAgIEV4dHJhRGF0YSAqZ2V0RXh0cmFEYXRhKEMySGFuZGxlICpjb25zdCBoYW5kbGUpIHsKKyAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RXh0cmFEYXRhICo+KGdldEV4dHJhRGF0YShjb25zdF9jYXN0PGNvbnN0IEMySGFuZGxlICpjb25zdD4oaGFuZGxlKSkpOworICAgIH0KKworcHVibGljOgorICAgIHZvaWQgZ2V0SWdicERhdGEodWludDMyX3QgKmdlbmVyYXRpb24sIHVpbnQ2NF90ICppZ2JwX2lkLCB1aW50MzJfdCAqaWdicF9zbG90KSBjb25zdCB7CisgICAgICAgIGNvbnN0IEV4dHJhRGF0YSAqZWQgPSBnZXRFeHRyYURhdGEodGhpcyk7CisgICAgICAgICpnZW5lcmF0aW9uID0gZWQtPmdlbmVyYXRpb247CisgICAgICAgICppZ2JwX2lkID0gdW5zaWduZWQoZWQtPmlnYnBfaWRfbG8pIHwgdWludDY0X3QodW5zaWduZWQoZWQtPmlnYnBfaWRfaGkpKSA8PCAzMjsKKyAgICAgICAgKmlnYnBfc2xvdCA9IGVkLT5pZ2JwX3Nsb3Q7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBDMkhhbmRsZSAqY29uc3QgbykgeworICAgICAgICBpZiAobyA9PSBudWxscHRyKSB7IC8vIG51bGwgaGFuZGxlIGlzIGFsd2F5cyB2YWxpZAorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgRXh0cmFEYXRhICp4ZCA9IGdldEV4dHJhRGF0YShvKTsKKyAgICAgICAgLy8gd2UgY2Fubm90IHZhbGlkYXRlIHdpZHRoL2hlaWdodC9mb3JtYXQvdXNhZ2Ugd2l0aG91dCBhY2Nlc3NpbmcgZ3JhbGxvYyBkcml2ZXIKKyAgICAgICAgcmV0dXJuIHhkICE9IG51bGxwdHIgJiYgeGQtPm1hZ2ljID09IE1BR0lDOworICAgIH0KKworICAgIHN0YXRpYyBDMkhhbmRsZUdyYWxsb2MqIFdyYXBBbmRNb3ZlTmF0aXZlSGFuZGxlKAorICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpjb25zdCBoYW5kbGUsCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQsIHVpbnQ2NF90IHVzYWdlLAorICAgICAgICAgICAgdWludDMyX3Qgc3RyaWRlLCB1aW50MzJfdCBnZW5lcmF0aW9uLCB1aW50NjRfdCBpZ2JwX2lkID0gMCwgdWludDMyX3QgaWdicF9zbG90ID0gMCkgeworICAgICAgICAvL0NIRUNLKGhhbmRsZSAhPSBudWxscHRyKTsKKyAgICAgICAgaWYgKG5hdGl2ZV9oYW5kbGVfaXNfaW52YWxpZChoYW5kbGUpIHx8CisgICAgICAgICAgICBoYW5kbGUtPm51bUludHMgPiBpbnQoKElOVF9NQVggLSBoYW5kbGUtPnZlcnNpb24pIC8gc2l6ZW9mKGludCkpIC0gTlVNX0lOVFMgLSBoYW5kbGUtPm51bUZkcykgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgRXh0cmFEYXRhIHhkID0geworICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1aW50MzJfdCh1c2FnZSAmIDB4RkZGRkZGRkYpLCB1aW50MzJfdCh1c2FnZSA+PiAzMiksCisgICAgICAgICAgICBzdHJpZGUsIGdlbmVyYXRpb24sIHVpbnQzMl90KGlnYnBfaWQgJiAweEZGRkZGRkZGKSwgdWludDMyX3QoaWdicF9pZCA+PiAzMiksCisgICAgICAgICAgICBpZ2JwX3Nsb3QsIE1BR0lDCisgICAgICAgIH07CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqcmVzID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoaGFuZGxlLT5udW1GZHMsIGhhbmRsZS0+bnVtSW50cyArIE5VTV9JTlRTKTsKKyAgICAgICAgaWYgKHJlcyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtZW1jcHkoJnJlcy0+ZGF0YSwgJmhhbmRsZS0+ZGF0YSwgc2l6ZW9mKGludCkgKiAoaGFuZGxlLT5udW1GZHMgKyBoYW5kbGUtPm51bUludHMpKTsKKyAgICAgICAgICAgICpnZXRFeHRyYURhdGEocmVzKSA9IHhkOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEMySGFuZGxlR3JhbGxvYyAqPihyZXMpOworICAgIH0KKworICAgIHN0YXRpYyBDMkhhbmRsZUdyYWxsb2MqIFdyYXBOYXRpdmVIYW5kbGUoCisgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwgdWludDY0X3QgdXNhZ2UsCisgICAgICAgICAgICB1aW50MzJfdCBzdHJpZGUsIHVpbnQzMl90IGdlbmVyYXRpb24sIHVpbnQ2NF90IGlnYnBfaWQgPSAwLCB1aW50MzJfdCBpZ2JwX3Nsb3QgPSAwKSB7CisgICAgICAgIGlmIChoYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpjbG9uZSA9IG5hdGl2ZV9oYW5kbGVfY2xvbmUoaGFuZGxlKTsKKyAgICAgICAgaWYgKGNsb25lID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIEMySGFuZGxlR3JhbGxvYyAqcmVzID0gV3JhcEFuZE1vdmVOYXRpdmVIYW5kbGUoCisgICAgICAgICAgICAgICAgY2xvbmUsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsIHN0cmlkZSwgZ2VuZXJhdGlvbiwgaWdicF9pZCwgaWdicF9zbG90KTsKKyAgICAgICAgaWYgKHJlcyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKGNsb25lKTsKKyAgICAgICAgfQorICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShjbG9uZSk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIG5hdGl2ZV9oYW5kbGVfdCogVW53cmFwTmF0aXZlSGFuZGxlKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSkgeworICAgICAgICBjb25zdCBFeHRyYURhdGEgKnhkID0gZ2V0RXh0cmFEYXRhKGhhbmRsZSk7CisgICAgICAgIGlmICh4ZCA9PSBudWxscHRyIHx8IHhkLT5tYWdpYyAhPSBNQUdJQykgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpyZXMgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZShoYW5kbGUtPm51bUZkcywgaGFuZGxlLT5udW1JbnRzIC0gTlVNX0lOVFMpOworICAgICAgICBpZiAocmVzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1lbWNweSgmcmVzLT5kYXRhLCAmaGFuZGxlLT5kYXRhLCBzaXplb2YoaW50KSAqIChyZXMtPm51bUZkcyArIHJlcy0+bnVtSW50cykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIG5hdGl2ZV9oYW5kbGVfdCogVW53cmFwTmF0aXZlSGFuZGxlKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgICAgIHVpbnQzMl90ICpnZW5lcmF0aW9uLCB1aW50NjRfdCAqaWdicF9pZCwgdWludDMyX3QgKmlnYnBfc2xvdCkgeworICAgICAgICBjb25zdCBFeHRyYURhdGEgKnhkID0gZ2V0RXh0cmFEYXRhKGhhbmRsZSk7CisgICAgICAgIGlmICh4ZCA9PSBudWxscHRyIHx8IHhkLT5tYWdpYyAhPSBNQUdJQykgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgKmdlbmVyYXRpb24gPSB4ZC0+Z2VuZXJhdGlvbjsKKyAgICAgICAgKmlnYnBfaWQgPSB1bnNpZ25lZCh4ZC0+aWdicF9pZF9sbykgfCB1aW50NjRfdCh1bnNpZ25lZCh4ZC0+aWdicF9pZF9oaSkpIDw8IDMyOworICAgICAgICAqaWdicF9zbG90ID0geGQtPmlnYnBfc2xvdDsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpyZXMgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZShoYW5kbGUtPm51bUZkcywgaGFuZGxlLT5udW1JbnRzIC0gTlVNX0lOVFMpOworICAgICAgICBpZiAocmVzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1lbWNweSgmcmVzLT5kYXRhLCAmaGFuZGxlLT5kYXRhLCBzaXplb2YoaW50KSAqIChyZXMtPm51bUZkcyArIHJlcy0+bnVtSW50cykpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IEMySGFuZGxlR3JhbGxvYyogSW1wb3J0KAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgICAgIHVpbnQzMl90ICp3aWR0aCwgdWludDMyX3QgKmhlaWdodCwgdWludDMyX3QgKmZvcm1hdCwKKyAgICAgICAgICAgIHVpbnQ2NF90ICp1c2FnZSwgdWludDMyX3QgKnN0cmlkZSwKKyAgICAgICAgICAgIHVpbnQzMl90ICpnZW5lcmF0aW9uLCB1aW50NjRfdCAqaWdicF9pZCwgdWludDMyX3QgKmlnYnBfc2xvdCkgeworICAgICAgICBjb25zdCBFeHRyYURhdGEgKnhkID0gZ2V0RXh0cmFEYXRhKGhhbmRsZSk7CisgICAgICAgIGlmICh4ZCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICAqd2lkdGggPSB4ZC0+d2lkdGg7CisgICAgICAgICpoZWlnaHQgPSB4ZC0+aGVpZ2h0OworICAgICAgICAqZm9ybWF0ID0geGQtPmZvcm1hdDsKKyAgICAgICAgKnVzYWdlID0geGQtPnVzYWdlX2xvIHwgKHVpbnQ2NF90KHhkLT51c2FnZV9oaSkgPDwgMzIpOworICAgICAgICAqc3RyaWRlID0geGQtPnN0cmlkZTsKKyAgICAgICAgKmdlbmVyYXRpb24gPSB4ZC0+Z2VuZXJhdGlvbjsKKyAgICAgICAgKmlnYnBfaWQgPSB4ZC0+aWdicF9pZF9sbyB8ICh1aW50NjRfdCh4ZC0+aWdicF9pZF9oaSkgPDwgMzIpOworICAgICAgICAqaWdicF9zbG90ID0geGQtPmlnYnBfc2xvdDsKKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQzJIYW5kbGVHcmFsbG9jICo+KGhhbmRsZSk7CisgICAgfQorfTsKKworbmF0aXZlX2hhbmRsZV90ICpVbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlKGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUpIHsKKyAgICByZXR1cm4gQzJIYW5kbGVHcmFsbG9jOjpVbndyYXBOYXRpdmVIYW5kbGUoaGFuZGxlKTsKK30KKworbmF0aXZlX2hhbmRsZV90ICpVbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlLAorICAgICAgICB1aW50MzJfdCAqZ2VuZXJhdGlvbiwgdWludDY0X3QgKmlnYnBfaWQsIHVpbnQzMl90ICppZ2JwX3Nsb3QpIHsKKyAgICByZXR1cm4gQzJIYW5kbGVHcmFsbG9jOjpVbndyYXBOYXRpdmVIYW5kbGUoaGFuZGxlLCBnZW5lcmF0aW9uLCBpZ2JwX2lkLCBpZ2JwX3Nsb3QpOworfQorCitDMkhhbmRsZSAqV3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqY29uc3QgaGFuZGxlLAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQsIHVpbnQ2NF90IHVzYWdlLCB1aW50MzJfdCBzdHJpZGUsCisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sIHVpbnQ2NF90IGlnYnBfaWQsIHVpbnQzMl90IGlnYnBfc2xvdCkgeworICAgIHJldHVybiBDMkhhbmRsZUdyYWxsb2M6OldyYXBOYXRpdmVIYW5kbGUoaGFuZGxlLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCBzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uLCBpZ2JwX2lkLCBpZ2JwX3Nsb3QpOworfQorCitjbGFzcyBDMkFsbG9jYXRpb25HcmFsbG9jIDogcHVibGljIEMyR3JhcGhpY0FsbG9jYXRpb24geworcHVibGljOgorICAgIHZpcnR1YWwgfkMyQWxsb2NhdGlvbkdyYWxsb2MoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbWFwKAorICAgICAgICAgICAgQzJSZWN0IHJlY3QsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIEMyRmVuY2UgKmZlbmNlLAorICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQgKmxheW91dCAvKiBub25udWxsICovLCB1aW50OF90ICoqYWRkciAvKiBub25udWxsICovKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHVubWFwKAorICAgICAgICAgICAgdWludDhfdCAqKmFkZHIgLyogbm9ubnVsbCAqLywgQzJSZWN0IHJlY3QsIEMyRmVuY2UgKmZlbmNlIC8qIG51bGxhYmxlICovKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbUFsbG9jYXRvcklkOyB9CisgICAgdmlydHVhbCBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbUxvY2tlZEhhbmRsZSA/IDogbUhhbmRsZTsgfQorICAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyR3JhcGhpY0FsbG9jYXRpb24+ICZvdGhlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLyBpbnRlcm5hbCBtZXRob2RzCisgICAgLy8gfGhhbmRsZXwgd2lsbCBiZSBtb3ZlZC4KKyAgICBDMkFsbG9jYXRpb25HcmFsbG9jKAorICAgICAgICAgICAgICBjb25zdCBCdWZmZXJEZXNjcmlwdG9ySW5mbyAmaW5mbywKKyAgICAgICAgICAgICAgY29uc3Qgc3A8SU1hcHBlcj4gJm1hcHBlciwKKyAgICAgICAgICAgICAgaGlkbF9oYW5kbGUgJmhpZGxIYW5kbGUsCisgICAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlR3JhbGxvYyAqY29uc3QgaGFuZGxlLAorICAgICAgICAgICAgICBDMkFsbG9jYXRvcjo6aWRfdCBhbGxvY2F0b3JJZCk7CisgICAgaW50IGR1cCgpIGNvbnN0OworICAgIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0OworCitwcml2YXRlOgorICAgIGNvbnN0IEJ1ZmZlckRlc2NyaXB0b3JJbmZvIG1JbmZvOworICAgIGNvbnN0IHNwPElNYXBwZXI+IG1NYXBwZXI7CisgICAgY29uc3QgaGlkbF9oYW5kbGUgbUhpZGxIYW5kbGU7CisgICAgY29uc3QgQzJIYW5kbGVHcmFsbG9jICptSGFuZGxlOworICAgIGJ1ZmZlcl9oYW5kbGVfdCBtQnVmZmVyOworICAgIGNvbnN0IEMySGFuZGxlR3JhbGxvYyAqbUxvY2tlZEhhbmRsZTsKKyAgICBib29sIG1Mb2NrZWQ7CisgICAgQzJBbGxvY2F0b3I6OmlkX3QgbUFsbG9jYXRvcklkOworICAgIHN0ZDo6bXV0ZXggbU1hcHBlZExvY2s7Cit9OworCitDMkFsbG9jYXRpb25HcmFsbG9jOjpDMkFsbG9jYXRpb25HcmFsbG9jKAorICAgICAgICAgIGNvbnN0IEJ1ZmZlckRlc2NyaXB0b3JJbmZvICZpbmZvLAorICAgICAgICAgIGNvbnN0IHNwPElNYXBwZXI+ICZtYXBwZXIsCisgICAgICAgICAgaGlkbF9oYW5kbGUgJmhpZGxIYW5kbGUsCisgICAgICAgICAgY29uc3QgQzJIYW5kbGVHcmFsbG9jICpjb25zdCBoYW5kbGUsCisgICAgICAgICAgQzJBbGxvY2F0b3I6OmlkX3QgYWxsb2NhdG9ySWQpCisgICAgOiBDMkdyYXBoaWNBbGxvY2F0aW9uKGluZm8ubWFwcGVySW5mby53aWR0aCwgaW5mby5tYXBwZXJJbmZvLmhlaWdodCksCisgICAgICBtSW5mbyhpbmZvKSwKKyAgICAgIG1NYXBwZXIobWFwcGVyKSwKKyAgICAgIG1IaWRsSGFuZGxlKHN0ZDo6bW92ZShoaWRsSGFuZGxlKSksCisgICAgICBtSGFuZGxlKGhhbmRsZSksCisgICAgICBtQnVmZmVyKG51bGxwdHIpLAorICAgICAgbUxvY2tlZEhhbmRsZShudWxscHRyKSwKKyAgICAgIG1Mb2NrZWQoZmFsc2UpLAorICAgICAgbUFsbG9jYXRvcklkKGFsbG9jYXRvcklkKSB7Cit9CisKK0MyQWxsb2NhdGlvbkdyYWxsb2M6On5DMkFsbG9jYXRpb25HcmFsbG9jKCkgeworICAgIGlmIChtQnVmZmVyICYmIG1Mb2NrZWQpIHsKKyAgICAgICAgLy8gaW1wbGVtZW50YXRpb24gaWdub3JlcyBhZGRyZXNzcyBhbmQgcmVjdAorICAgICAgICB1aW50OF90KiBhZGRyW0MyUGxhbmFyTGF5b3V0OjpNQVhfTlVNX1BMQU5FU10gPSB7fTsKKyAgICAgICAgdW5tYXAoYWRkciwgQzJSZWN0KCksIG51bGxwdHIpOworICAgIH0KKyAgICBpZiAobUJ1ZmZlcikgeworICAgICAgICBtTWFwcGVyLT5mcmVlQnVmZmVyKGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KG1CdWZmZXIpKTsKKyAgICB9CisgICAgaWYgKG1IYW5kbGUpIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoCisgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBuYXRpdmVfaGFuZGxlX3QgKj4obUhhbmRsZSkpKTsKKyAgICB9CisgICAgaWYgKG1Mb2NrZWRIYW5kbGUpIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoCisgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4oCisgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqPihtTG9ja2VkSGFuZGxlKSkpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0aW9uR3JhbGxvYzo6bWFwKAorICAgICAgICBDMlJlY3QgcmVjdCwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UsCisgICAgICAgIEMyUGxhbmFyTGF5b3V0ICpsYXlvdXQgLyogbm9ubnVsbCAqLywgdWludDhfdCAqKmFkZHIgLyogbm9ubnVsbCAqLykgeworICAgIHVpbnQ2NF90IGdyYWxsb2NVc2FnZSA9IHN0YXRpY19jYXN0PEMyQW5kcm9pZE1lbW9yeVVzYWdlPih1c2FnZSkuYXNHcmFsbG9jVXNhZ2UoKTsKKyAgICBBTE9HVigibWFwcGluZyBidWZmZXIgd2l0aCB1c2FnZSAlI2xseCA9PiAlI2xseCIsCisgICAgICAgICAgKGxvbmcgbG9uZyl1c2FnZS5leHBlY3RlZCwgKGxvbmcgbG9uZylncmFsbG9jVXNhZ2UpOworCisgICAgLy8gVE9ETworICAgICh2b2lkKSBmZW5jZTsKKworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NYXBwZWRMb2NrKTsKKyAgICBpZiAobUJ1ZmZlciAmJiBtTG9ja2VkKSB7CisgICAgICAgIEFMT0dEKCJhbHJlYWR5IG1hcHBlZCIpOworICAgICAgICByZXR1cm4gQzJfRFVQTElDQVRFOworICAgIH0KKyAgICBpZiAoIWxheW91dCB8fCAhYWRkcikgeworICAgICAgICBBTE9HRCgid3JvbmcgcGFyYW0iKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKyAgICBpZiAoIW1CdWZmZXIpIHsKKyAgICAgICAgbU1hcHBlci0+aW1wb3J0QnVmZmVyKAorICAgICAgICAgICAgICAgIG1IaWRsSGFuZGxlLCBbJmVyciwgdGhpc10oY29uc3QgYXV0byAmbWFwZXJyLCBjb25zdCBhdXRvICZidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbWFwZXJyMmVycm9yKG1hcGVycik7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBzdGF0aWNfY2FzdDxidWZmZXJfaGFuZGxlX3Q+KGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0QoImltcG9ydEJ1ZmZlciBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1CdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0QoImltcG9ydEJ1ZmZlciByZXR1cm5lZCBudWxsIGJ1ZmZlciIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uID0gMDsKKyAgICAgICAgdWludDY0X3QgaWdicF9pZCA9IDA7CisgICAgICAgIHVpbnQzMl90IGlnYnBfc2xvdCA9IDA7CisgICAgICAgIGlmIChtSGFuZGxlKSB7CisgICAgICAgICAgICBtSGFuZGxlLT5nZXRJZ2JwRGF0YSgmZ2VuZXJhdGlvbiwgJmlnYnBfaWQsICZpZ2JwX3Nsb3QpOworICAgICAgICB9CisgICAgICAgIG1Mb2NrZWRIYW5kbGUgPSBDMkhhbmRsZUdyYWxsb2M6OldyYXBBbmRNb3ZlTmF0aXZlSGFuZGxlKAorICAgICAgICAgICAgICAgIG1CdWZmZXIsIG1JbmZvLm1hcHBlckluZm8ud2lkdGgsIG1JbmZvLm1hcHBlckluZm8uaGVpZ2h0LAorICAgICAgICAgICAgICAgICh1aW50MzJfdCltSW5mby5tYXBwZXJJbmZvLmZvcm1hdCwgbUluZm8ubWFwcGVySW5mby51c2FnZSwgbUluZm8uc3RyaWRlLAorICAgICAgICAgICAgICAgIGdlbmVyYXRpb24sIGlnYnBfaWQsIGlnYnBfc2xvdCk7CisgICAgfQorCisgICAgc3dpdGNoIChtSW5mby5tYXBwZXJJbmZvLmZvcm1hdCkgeworICAgICAgICBjYXNlIFBpeGVsRm9ybWF0OjpSR0JBXzEwMTAxMDI6IHsKKyAgICAgICAgICAgIC8vIFRSSUNLWTogdGhpcyBpcyB1c2VkIGZvciBtZWRpYSBhcyBZVVY0NDQgaW4gdGhlIGNhc2Ugd2hlbiBpdCBpcyBxdWV1ZWQgZGlyZWN0bHkgdG8gYQorICAgICAgICAgICAgLy8gU3VyZmFjZS4gSW4gYWxsIG90aGVyIGNhc2VzIGl0IGlzIFJHQkEuIFdlIGRvbid0IGtub3cgd2hpY2ggY2FzZSBpdCBpcyBoZXJlLCBzbworICAgICAgICAgICAgLy8gZGVmYXVsdCB0byBZVVYgZm9yIG5vdy4KKyAgICAgICAgICAgIHZvaWQgKnBvaW50ZXIgPSBudWxscHRyOworICAgICAgICAgICAgbU1hcHBlci0+bG9jaygKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4obUJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgIGdyYWxsb2NVc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgeyAoaW50MzJfdClyZWN0LmxlZnQsIChpbnQzMl90KXJlY3QudG9wLCAoaW50MzJfdClyZWN0LndpZHRoLCAoaW50MzJfdClyZWN0LmhlaWdodCB9LAorICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmZW5jZQorICAgICAgICAgICAgICAgICAgICBoaWRsX2hhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICBbJmVyciwgJnBvaW50ZXJdKGNvbnN0IGF1dG8gJm1hcGVyciwgY29uc3QgYXV0byAmbWFwUG9pbnRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gbWFwZXJyMmVycm9yKG1hcGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciA9IG1hcFBvaW50ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIEFMT0dEKCJsb2NrIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB0cmVhdCBhcyAzMi1iaXQgdmFsdWVzCisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSA9ICh1aW50OF90ICopcG9pbnRlcjsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdID0gKHVpbnQ4X3QgKilwb2ludGVyOworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVl0gPSAodWludDhfdCAqKXBvaW50ZXI7CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9BXSA9ICh1aW50OF90ICopcG9pbnRlcjsKKyAgICAgICAgICAgIGxheW91dC0+dHlwZSA9IEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVkE7CisgICAgICAgICAgICBsYXlvdXQtPm51bVBsYW5lcyA9IDQ7CisgICAgICAgICAgICBsYXlvdXQtPnJvb3RQbGFuZXMgPSAxOworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX1ksICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgNCAqIChpbnQzMl90KW1JbmZvLnN0cmlkZSwgICAgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAxMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TElUVExFX0VORCwgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfWSwgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX0NCLCAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIDQgKiAoaW50MzJfdCltSW5mby5zdHJpZGUsICAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICAxMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkxJVFRMRV9FTkQsICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ksICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DUiwgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICA0ICogKGludDMyX3QpbUluZm8uc3RyaWRlLCAgICAgIC8vIHJvd0luYworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgMTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDIwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpMSVRUTEVfRU5ELCAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9ZLCAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfQV0gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfQSwgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICA0ICogKGludDMyX3QpbUluZm8uc3RyaWRlLCAgICAgIC8vIHJvd0luYworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDMwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpMSVRUTEVfRU5ELCAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9ZLCAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQ6OlJHQkFfODg4ODoKKyAgICAgICAgICAgIC8vIFRPRE86IGFscGhhIGNoYW5uZWwKKyAgICAgICAgICAgIC8vIGZhbGwtdGhyb3VnaAorICAgICAgICBjYXNlIFBpeGVsRm9ybWF0OjpSR0JYXzg4ODg6IHsKKyAgICAgICAgICAgIHZvaWQgKnBvaW50ZXIgPSBudWxscHRyOworICAgICAgICAgICAgbU1hcHBlci0+bG9jaygKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4obUJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgIGdyYWxsb2NVc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgeyAoaW50MzJfdClyZWN0LmxlZnQsIChpbnQzMl90KXJlY3QudG9wLCAoaW50MzJfdClyZWN0LndpZHRoLCAoaW50MzJfdClyZWN0LmhlaWdodCB9LAorICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmZW5jZQorICAgICAgICAgICAgICAgICAgICBoaWRsX2hhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICBbJmVyciwgJnBvaW50ZXJdKGNvbnN0IGF1dG8gJm1hcGVyciwgY29uc3QgYXV0byAmbWFwUG9pbnRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gbWFwZXJyMmVycm9yKG1hcGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciA9IG1hcFBvaW50ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIEFMT0dEKCJsb2NrIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9SXSA9ICh1aW50OF90ICopcG9pbnRlcjsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0ddID0gKHVpbnQ4X3QgKilwb2ludGVyICsgMTsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0JdID0gKHVpbnQ4X3QgKilwb2ludGVyICsgMjsKKyAgICAgICAgICAgIGxheW91dC0+dHlwZSA9IEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQjsKKyAgICAgICAgICAgIGxheW91dC0+bnVtUGxhbmVzID0gMzsKKyAgICAgICAgICAgIGxheW91dC0+cm9vdFBsYW5lcyA9IDE7CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfUl0gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfUiwgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICA0ICogKGludDMyX3QpbUluZm8uc3RyaWRlLCAgICAgIC8vIHJvd0luYworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpOQVRJVkUsICAgICAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9SLCAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfR10gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfRywgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICA0ICogKGludDMyX3QpbUluZm8uc3RyaWRlLCAgICAgIC8vIHJvd0luYworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpOQVRJVkUsICAgICAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9SLCAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfQl0gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfQiwgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICA0ICogKGludDMyX3QpbUluZm8uc3RyaWRlLCAgICAgIC8vIHJvd0luYworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpOQVRJVkUsICAgICAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9SLCAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQ6OllDQkNSXzQyMF84ODg6CisgICAgICAgICAgICAvLyBmYWxsLXRocm91Z2gKKyAgICAgICAgY2FzZSBQaXhlbEZvcm1hdDo6WVYxMjoKKyAgICAgICAgICAgIC8vIGZhbGwtdGhyb3VnaAorICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBZQ2JDckxheW91dCB5Y2JjckxheW91dDsKKyAgICAgICAgICAgIG1NYXBwZXItPmxvY2tZQ2JDcigKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4obUJ1ZmZlciksIGdyYWxsb2NVc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgeyAoaW50MzJfdClyZWN0LmxlZnQsIChpbnQzMl90KXJlY3QudG9wLCAoaW50MzJfdClyZWN0LndpZHRoLCAoaW50MzJfdClyZWN0LmhlaWdodCB9LAorICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmZW5jZQorICAgICAgICAgICAgICAgICAgICBoaWRsX2hhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICBbJmVyciwgJnljYmNyTGF5b3V0XShjb25zdCBhdXRvICZtYXBlcnIsIGNvbnN0IGF1dG8gJm1hcExheW91dCkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gbWFwZXJyMmVycm9yKG1hcGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWNiY3JMYXlvdXQgPSBtYXBMYXlvdXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIEFMT0dEKCJsb2NrWUNiQ3IgZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldID0gKHVpbnQ4X3QgKil5Y2JjckxheW91dC55OworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVV0gPSAodWludDhfdCAqKXljYmNyTGF5b3V0LmNiOworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVl0gPSAodWludDhfdCAqKXljYmNyTGF5b3V0LmNyOworICAgICAgICAgICAgbGF5b3V0LT50eXBlID0gQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWOworICAgICAgICAgICAgbGF5b3V0LT5udW1QbGFuZXMgPSAzOworICAgICAgICAgICAgbGF5b3V0LT5yb290UGxhbmVzID0gMzsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9ZLCAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIChpbnQzMl90KXljYmNyTGF5b3V0LnlTdHJpZGUsICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwgICAgICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ksICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DQiwgICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIChpbnQzMl90KXljYmNyTGF5b3V0LmNocm9tYVN0ZXAsICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICAoaW50MzJfdCl5Y2JjckxheW91dC5jU3RyaWRlLCAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpOQVRJVkUsICAgICAgICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1UsICAgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfQ1IsICAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAoaW50MzJfdCl5Y2JjckxheW91dC5jaHJvbWFTdGVwLCAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgKGludDMyX3QpeWNiY3JMYXlvdXQuY1N0cmlkZSwgICAgIC8vIHJvd0luYworICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TkFUSVZFLCAgICAgICAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9WLCAgICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgLy8gaGFuZGxlIGludGVybGVhdmVkIGZvcm1hdHMKKyAgICAgICAgICAgIGludHB0cl90IHV2T2Zmc2V0ID0gYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVl0gLSBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICAgICAgICAgIGlmICh1dk9mZnNldCA+IDAgJiYgdXZPZmZzZXQgPCAoaW50cHRyX3QpeWNiY3JMYXlvdXQuY2hyb21hU3RlcCkgeworICAgICAgICAgICAgICAgIGxheW91dC0+cm9vdFBsYW5lcyA9IDI7CisgICAgICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdLnJvb3RJeCA9IEMyUGxhbmFyTGF5b3V0OjpQTEFORV9VOworICAgICAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXS5vZmZzZXQgPSB1dk9mZnNldDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodXZPZmZzZXQgPCAwICYmIHV2T2Zmc2V0ID4gLShpbnRwdHJfdCl5Y2JjckxheW91dC5jaHJvbWFTdGVwKSB7CisgICAgICAgICAgICAgICAgbGF5b3V0LT5yb290UGxhbmVzID0gMjsKKyAgICAgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ucm9vdEl4ID0gQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1Y7CisgICAgICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdLm9mZnNldCA9IC11dk9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIG1Mb2NrZWQgPSB0cnVlOworCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRpb25HcmFsbG9jOjp1bm1hcCgKKyAgICAgICAgdWludDhfdCAqKmFkZHIsIEMyUmVjdCByZWN0LCBDMkZlbmNlICpmZW5jZSAvKiBudWxsYWJsZSAqLykgeworICAgIC8vIFRPRE86IGNoZWNrIGFkZHIgYW5kIHNpemUsIHVzZSBmZW5jZQorICAgICh2b2lkKWFkZHI7CisgICAgKHZvaWQpcmVjdDsKKworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NYXBwZWRMb2NrKTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKyAgICBtTWFwcGVyLT51bmxvY2soCisgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQnVmZmVyKSwKKyAgICAgICAgICAgIFsmZXJyLCAmZmVuY2VdKGNvbnN0IGF1dG8gJm1hcGVyciwgY29uc3QgYXV0byAmcmVsZWFzZUZlbmNlKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETworICAgICAgICAgICAgICAgICh2b2lkKSBmZW5jZTsKKyAgICAgICAgICAgICAgICAodm9pZCkgcmVsZWFzZUZlbmNlOworICAgICAgICAgICAgICAgIGVyciA9IG1hcGVycjJlcnJvcihtYXBlcnIpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgIG1Mb2NrZWQgPSBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworYm9vbCBDMkFsbG9jYXRpb25HcmFsbG9jOjplcXVhbHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyR3JhcGhpY0FsbG9jYXRpb24+ICZvdGhlcikgY29uc3QgeworICAgIHJldHVybiBvdGhlciAmJiBvdGhlci0+aGFuZGxlKCkgPT0gaGFuZGxlKCk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gR1JBTExPQyBBTExPQ0FUT1IgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitjbGFzcyBDMkFsbG9jYXRvckdyYWxsb2M6OkltcGwgeworcHVibGljOgorICAgIEltcGwoaWRfdCBpZCwgYm9vbCBidWZmZXJRdWV1ZSk7CisKKyAgICBpZF90IGdldElkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRyYWl0cy0+aWQ7CisgICAgfQorCisgICAgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UcmFpdHMtPm5hbWU7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQWxsb2NhdG9yOjpUcmFpdHM+IGdldFRyYWl0cygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UcmFpdHM7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgbmV3R3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQsIGNvbnN0IEMyTWVtb3J5VXNhZ2UgJnVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uKTsKKworICAgIGMyX3N0YXR1c190IHByaW9yR3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uKTsKKworICAgIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0IHsgcmV0dXJuIG1Jbml0OyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yOjpUcmFpdHM+IG1UcmFpdHM7CisgICAgYzJfc3RhdHVzX3QgbUluaXQ7CisgICAgc3A8SUFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKyAgICBzcDxJTWFwcGVyPiBtTWFwcGVyOworICAgIGNvbnN0IGJvb2wgbUJ1ZmZlclF1ZXVlOworfTsKKwordm9pZCBfVW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY01ldGFkYXRhKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlLAorICAgICAgICB1aW50MzJfdCAqd2lkdGgsIHVpbnQzMl90ICpoZWlnaHQsIHVpbnQzMl90ICpmb3JtYXQsdWludDY0X3QgKnVzYWdlLCB1aW50MzJfdCAqc3RyaWRlLAorICAgICAgICB1aW50MzJfdCAqZ2VuZXJhdGlvbiwgdWludDY0X3QgKmlnYnBfaWQsIHVpbnQzMl90ICppZ2JwX3Nsb3QpIHsKKyAgICAodm9pZClDMkhhbmRsZUdyYWxsb2M6OkltcG9ydChoYW5kbGUsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uLCBpZ2JwX2lkLCBpZ2JwX3Nsb3QpOworfQorCitDMkFsbG9jYXRvckdyYWxsb2M6OkltcGw6OkltcGwoaWRfdCBpZCwgYm9vbCBidWZmZXJRdWV1ZSkKKyAgICA6IG1Jbml0KEMyX09LKSwgbUJ1ZmZlclF1ZXVlKGJ1ZmZlclF1ZXVlKSB7CisgICAgLy8gVE9ETzogZ2V0IHRoaXMgZnJvbSBhbGxvY2F0b3IKKyAgICBDMk1lbW9yeVVzYWdlIG1pblVzYWdlID0geyAwLCAwIH0sIG1heFVzYWdlID0geyB+KHVpbnQ2NF90KTAsIH4odWludDY0X3QpMCB9OworICAgIFRyYWl0cyB0cmFpdHMgPSB7ICJhbmRyb2lkLmFsbG9jYXRvci5ncmFsbG9jIiwgaWQsIEMyQWxsb2NhdG9yOjpHUkFQSElDLCBtaW5Vc2FnZSwgbWF4VXNhZ2UgfTsKKyAgICBtVHJhaXRzID0gc3RkOjptYWtlX3NoYXJlZDxDMkFsbG9jYXRvcjo6VHJhaXRzPih0cmFpdHMpOworCisgICAgLy8gZ3JhbGxvYyBhbGxvY2F0b3IgaXMgYSBzaW5nbGV0b24sIHNvIGFsbCBvYmplY3RzIHNoYXJlIGEgZ2xvYmFsIHNlcnZpY2UKKyAgICBtQWxsb2NhdG9yID0gSUFsbG9jYXRvcjo6Z2V0U2VydmljZSgpOworICAgIG1NYXBwZXIgPSBJTWFwcGVyOjpnZXRTZXJ2aWNlKCk7CisgICAgaWYgKG1BbGxvY2F0b3IgPT0gbnVsbHB0ciB8fCBtTWFwcGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgbUluaXQgPSBDMl9DT1JSVVBURUQ7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRvckdyYWxsb2M6OkltcGw6Om5ld0dyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQsIGNvbnN0IEMyTWVtb3J5VXNhZ2UgJnVzYWdlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIHsKKyAgICB1aW50NjRfdCBncmFsbG9jVXNhZ2UgPSBzdGF0aWNfY2FzdDxDMkFuZHJvaWRNZW1vcnlVc2FnZT4odXNhZ2UpLmFzR3JhbGxvY1VzYWdlKCk7CisgICAgQUxPR1YoImFsbG9jYXRpbmcgYnVmZmVyIHdpdGggdXNhZ2UgJSNsbHggPT4gJSNsbHgiLAorICAgICAgICAgIChsb25nIGxvbmcpdXNhZ2UuZXhwZWN0ZWQsIChsb25nIGxvbmcpZ3JhbGxvY1VzYWdlKTsKKworICAgIEJ1ZmZlckRlc2NyaXB0b3JJbmZvIGluZm8gPSB7CisgICAgICAgIHsKKyAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgaGVpZ2h0LAorICAgICAgICAgICAgMXUsICAvLyBsYXllckNvdW50CisgICAgICAgICAgICAoUGl4ZWxGb3JtYXQpZm9ybWF0LAorICAgICAgICAgICAgZ3JhbGxvY1VzYWdlLAorICAgICAgICB9LAorICAgICAgICAwdSwgIC8vIHN0cmlkZSBwbGFjZWhvbGRlcgorICAgIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gQzJfT0s7CisgICAgQnVmZmVyRGVzY3JpcHRvciBkZXNjOworICAgIG1NYXBwZXItPmNyZWF0ZURlc2NyaXB0b3IoCisgICAgICAgICAgICBpbmZvLm1hcHBlckluZm8sIFsmZXJyLCAmZGVzY10oY29uc3QgYXV0byAmbWFwZXJyLCBjb25zdCBhdXRvICZkZXNjcmlwdG9yKSB7CisgICAgICAgICAgICAgICAgZXJyID0gbWFwZXJyMmVycm9yKG1hcGVycik7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBkZXNjID0gZGVzY3JpcHRvcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgLy8gSUFsbG9jYXRvciBzaGFyZXMgSU1hcHBlciBlcnJvciBjb2Rlcy4KKyAgICBoaWRsX2hhbmRsZSBidWZmZXI7CisgICAgbUFsbG9jYXRvci0+YWxsb2NhdGUoCisgICAgICAgICAgICBkZXNjLAorICAgICAgICAgICAgMXUsCisgICAgICAgICAgICBbJmVyciwgJmJ1ZmZlciwgJmluZm9dKGNvbnN0IGF1dG8gJm1hcGVyciwgY29uc3QgYXV0byAmc3RyaWRlLCBhdXRvICZidWZmZXJzKSB7CisgICAgICAgICAgICAgICAgZXJyID0gbWFwZXJyMmVycm9yKG1hcGVycik7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChidWZmZXJzLnNpemUoKSAhPSAxdSkgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5mby5zdHJpZGUgPSBzdHJpZGU7CisgICAgICAgICAgICAgICAgYnVmZmVyID0gYnVmZmVyc1swXTsKKyAgICAgICAgICAgIH0pOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKworICAgIGFsbG9jYXRpb24tPnJlc2V0KG5ldyBDMkFsbG9jYXRpb25HcmFsbG9jKAorICAgICAgICAgICAgaW5mbywgbU1hcHBlciwgYnVmZmVyLAorICAgICAgICAgICAgQzJIYW5kbGVHcmFsbG9jOjpXcmFwQW5kTW92ZU5hdGl2ZUhhbmRsZSgKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLmdldE5hdGl2ZUhhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICBpbmZvLm1hcHBlckluZm8ud2lkdGgsIGluZm8ubWFwcGVySW5mby5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClpbmZvLm1hcHBlckluZm8uZm9ybWF0LCBpbmZvLm1hcHBlckluZm8udXNhZ2UsIGluZm8uc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAwLCAwLCBtQnVmZmVyUXVldWUgPyB+MCA6IDApLAorICAgICAgICAgICAgbVRyYWl0cy0+aWQpKTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdG9yR3JhbGxvYzo6SW1wbDo6cHJpb3JHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uKSB7CisgICAgQnVmZmVyRGVzY3JpcHRvckluZm8gaW5mbzsKKyAgICBpbmZvLm1hcHBlckluZm8ubGF5ZXJDb3VudCA9IDF1OworICAgIHVpbnQzMl90IGdlbmVyYXRpb247CisgICAgdWludDY0X3QgaWdicF9pZDsKKyAgICB1aW50MzJfdCBpZ2JwX3Nsb3Q7CisgICAgY29uc3QgQzJIYW5kbGVHcmFsbG9jICpncmFsbG9jSGFuZGxlID0gQzJIYW5kbGVHcmFsbG9jOjpJbXBvcnQoCisgICAgICAgICAgICBoYW5kbGUsCisgICAgICAgICAgICAmaW5mby5tYXBwZXJJbmZvLndpZHRoLCAmaW5mby5tYXBwZXJJbmZvLmhlaWdodCwKKyAgICAgICAgICAgICh1aW50MzJfdCAqKSZpbmZvLm1hcHBlckluZm8uZm9ybWF0LCAodWludDY0X3QgKikmaW5mby5tYXBwZXJJbmZvLnVzYWdlLCAmaW5mby5zdHJpZGUsCisgICAgICAgICAgICAmZ2VuZXJhdGlvbiwgJmlnYnBfaWQsICZpZ2JwX3Nsb3QpOworICAgIGlmIChncmFsbG9jSGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICBoaWRsX2hhbmRsZSBoaWRsSGFuZGxlOworICAgIGhpZGxIYW5kbGUuc2V0VG8oQzJIYW5kbGVHcmFsbG9jOjpVbndyYXBOYXRpdmVIYW5kbGUoZ3JhbGxvY0hhbmRsZSksIHRydWUpOworCisgICAgYWxsb2NhdGlvbi0+cmVzZXQobmV3IEMyQWxsb2NhdGlvbkdyYWxsb2MoaW5mbywgbU1hcHBlciwgaGlkbEhhbmRsZSwgZ3JhbGxvY0hhbmRsZSwgbVRyYWl0cy0+aWQpKTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK0MyQWxsb2NhdG9yR3JhbGxvYzo6QzJBbGxvY2F0b3JHcmFsbG9jKGlkX3QgaWQsIGJvb2wgYnVmZmVyUXVldWUpCisgICAgICAgIDogbUltcGwobmV3IEltcGwoaWQsIGJ1ZmZlclF1ZXVlKSkge30KKworQzJBbGxvY2F0b3JHcmFsbG9jOjp+QzJBbGxvY2F0b3JHcmFsbG9jKCkgeyBkZWxldGUgbUltcGw7IH0KKworQzJBbGxvY2F0b3I6OmlkX3QgQzJBbGxvY2F0b3JHcmFsbG9jOjpnZXRJZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldElkKCk7Cit9CisKK0MyU3RyaW5nIEMyQWxsb2NhdG9yR3JhbGxvYzo6Z2V0TmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldE5hbWUoKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQWxsb2NhdG9yOjpUcmFpdHM+IEMyQWxsb2NhdG9yR3JhbGxvYzo6Z2V0VHJhaXRzKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0VHJhaXRzKCk7Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdG9yR3JhbGxvYzo6bmV3R3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uKSB7CisgICAgcmV0dXJuIG1JbXBsLT5uZXdHcmFwaGljQWxsb2NhdGlvbih3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCBhbGxvY2F0aW9uKTsKK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0b3JHcmFsbG9jOjpwcmlvckdyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIHsKKyAgICByZXR1cm4gbUltcGwtPnByaW9yR3JhcGhpY0FsbG9jYXRpb24oaGFuZGxlLCBhbGxvY2F0aW9uKTsKK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0b3JHcmFsbG9jOjpzdGF0dXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5zdGF0dXMoKTsKK30KKworYm9vbCBDMkFsbG9jYXRvckdyYWxsb2M6OmlzVmFsaWQoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pIHsKKyAgICByZXR1cm4gQzJIYW5kbGVHcmFsbG9jOjppc1ZhbGlkKG8pOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9DMkFsbG9jYXRvcklvbi5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMkFsbG9jYXRvcklvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzUyYmM0NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9ySW9uLmNwcApAQCAtMCwwICsxLDY0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJBbGxvY2F0b3JJb24iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxsaXN0PgorCisjaW5jbHVkZSA8aW9uL2lvbi5oPgorI2luY2x1ZGUgPHN5cy9tbWFuLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+IC8vIGdldHBhZ2VzaXplLCBzaXplX3QsIGNsb3NlLCBkdXAKKworI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJFcnJub1V0aWxzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKyAgICBjb25zdGV4cHIgc2l6ZV90IFVTQUdFX0xSVV9DQUNIRV9TSVpFID0gMTAyNDsKK30KKworLyogc2l6ZV90IDw9PiBpbnQobG8pLCBpbnQoaGkpIGNvbnZlcnNpb25zICovCitjb25zdGV4cHIgaW5saW5lIGludCBzaXplMmludExvKHNpemVfdCBzKSB7CisgICAgcmV0dXJuIGludChzICYgMHhGRkZGRkZGRik7Cit9CisKK2NvbnN0ZXhwciBpbmxpbmUgaW50IHNpemUyaW50SGkoc2l6ZV90IHMpIHsKKyAgICAvLyBjYXN0IHRvIHVpbnQ2NF90IGFzIHNpemVfdCBtYXkgYmUgMzIgYml0cyB3aWRlCisgICAgcmV0dXJuIGludCgodWludDY0X3QocykgPj4gMzIpICYgMHhGRkZGRkZGRik7Cit9CisKK2NvbnN0ZXhwciBpbmxpbmUgc2l6ZV90IGludHMyc2l6ZShpbnQgaW50TG8sIGludCBpbnRIaSkgeworICAgIC8vIGNvbnZlcnQgaW4gMiBzdGFnZXMgdG8gNjQgYml0cyBhcyBpbnRIaSBtYXkgYmUgbmVnYXRpdmUKKyAgICByZXR1cm4gc2l6ZV90KHVuc2lnbmVkKGludExvKSkgfCBzaXplX3QodWludDY0X3QodW5zaWduZWQoaW50SGkpKSA8PCAzMik7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IElPTiBIQU5ETEUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyoqCisgKiBJT04gaGFuZGxlCisgKgorICogVGhlcmUgY2FuIGJlIG9ubHkgYSBzb2xlIGlvbiBjbGllbnQgcGVyIHByb2Nlc3MsIHRoaXMgaXMgY2FwdHVyZWQgaW4gdGhlIGlvbiBmZCB0aGF0IGlzIHBhc3NlZAorICogdG8gdGhlIGNvbnN0cnVjdG9yLCBidXQgdGhpcyBzaG91bGQgYmUgbWFuYWdlZCBieSB0aGUgaW9uIGJ1ZmZlciBhbGxvY2F0b3IvbWFwcGVyLgorICoKKyAqIGlvbiB1c2VzIGlvbl91c2VyX2hhbmRsZV90IGZvciBidWZmZXJzLiBXZSBkb24ndCBzdG9yZSB0aGlzIGluIHRoZSBuYXRpdmUgaGFuZGxlIGFzCisgKiBpdCByZXF1aXJlcyBhbiBpb25fZnJlZSB0byBkZWNyZWYuIEluc3RlYWQsIHdlIHNoYXJlIHRoZSBidWZmZXIgdG8gZ2V0IGFuIGZkIHRoYXQgYWxzbyBob2xkcworICogYSByZWZjb3VudC4KKyAqCisgKiBUaGlzIGhhbmRsZSB3aWxsIG5vdCBjYXB0dXJlIG1hcHBlZCBmZC1zIGFzIHVwZGF0aW5nIHRoYXQgd291bGQgcmVxdWlyZSBhIGdsb2JhbCBtdXRleC4KKyAqLworCitzdHJ1Y3QgQzJIYW5kbGVJb24gOiBwdWJsaWMgQzJIYW5kbGUgeworICAgIC8vIGlvbiBoYW5kbGUgb3ducyBpb25GZCghKSBhbmQgYnVmZmVyRmQKKyAgICBDMkhhbmRsZUlvbihpbnQgYnVmZmVyRmQsIHNpemVfdCBzaXplKQorICAgICAgICA6IEMySGFuZGxlKGNIZWFkZXIpLAorICAgICAgICAgIG1GZHN7IGJ1ZmZlckZkIH0sCisgICAgICAgICAgbUludHN7IGludChzaXplICYgMHhGRkZGRkZGRiksIGludCgodWludDY0X3Qoc2l6ZSkgPj4gMzIpICYgMHhGRkZGRkZGRiksIGtNYWdpYyB9IHsgfQorCisgICAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBDMkhhbmRsZSAqIGNvbnN0IG8pOworCisgICAgaW50IGJ1ZmZlckZkKCkgY29uc3QgeyByZXR1cm4gbUZkcy5tQnVmZmVyOyB9CisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzaXplX3QodW5zaWduZWQobUludHMubVNpemVMbykpCisgICAgICAgICAgICAgICAgfCBzaXplX3QodWludDY0X3QodW5zaWduZWQobUludHMubVNpemVIaSkpIDw8IDMyKTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBzdHJ1Y3QgeworICAgICAgICBpbnQgbUJ1ZmZlcjsgLy8gc2hhcmVkIGlvbiBidWZmZXIKKyAgICB9IG1GZHM7CisgICAgc3RydWN0IHsKKyAgICAgICAgaW50IG1TaXplTG87IC8vIGxvdyAzMi1iaXRzIG9mIHNpemUKKyAgICAgICAgaW50IG1TaXplSGk7IC8vIGhpZ2ggMzItYml0cyBvZiBzaXplCisgICAgICAgIGludCBtTWFnaWM7CisgICAgfSBtSW50czsKKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIEMySGFuZGxlSW9uIF90eXBlOworICAgIGVudW0geworICAgICAgICBrTWFnaWMgPSAnXHhjMmlvXHgwMCcsCisgICAgICAgIG51bUZkcyA9IHNpemVvZihtRmRzKSAvIHNpemVvZihpbnQpLAorICAgICAgICBudW1JbnRzID0gc2l6ZW9mKG1JbnRzKSAvIHNpemVvZihpbnQpLAorICAgICAgICB2ZXJzaW9uID0gc2l6ZW9mKEMySGFuZGxlKQorICAgIH07CisgICAgLy9jb25zdGV4cHIgc3RhdGljIEMySGFuZGxlIGNIZWFkZXIgPSB7IHZlcnNpb24sIG51bUZkcywgbnVtSW50cywge30gfTsKKyAgICBjb25zdCBzdGF0aWMgQzJIYW5kbGUgY0hlYWRlcjsKK307CisKK2NvbnN0IEMySGFuZGxlIEMySGFuZGxlSW9uOjpjSGVhZGVyID0geworICAgIEMySGFuZGxlSW9uOjp2ZXJzaW9uLAorICAgIEMySGFuZGxlSW9uOjpudW1GZHMsCisgICAgQzJIYW5kbGVJb246Om51bUludHMsCisgICAge30KK307CisKKy8vIHN0YXRpYworYm9vbCBDMkhhbmRsZUlvbjo6aXNWYWxpZChjb25zdCBDMkhhbmRsZSAqIGNvbnN0IG8pIHsKKyAgICBpZiAoIW8gfHwgbWVtY21wKG8sICZjSGVhZGVyLCBzaXplb2YoY0hlYWRlcikpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY29uc3QgQzJIYW5kbGVJb24gKm90aGVyID0gc3RhdGljX2Nhc3Q8Y29uc3QgQzJIYW5kbGVJb24qPihvKTsKKyAgICByZXR1cm4gb3RoZXItPm1JbnRzLm1NYWdpYyA9PSBrTWFnaWM7Cit9CisKKy8vIFRPRE86IGlzIHRoZSBkdXAgb2YgYW4gaW9uIGZkIGlkZW50aWNhbCB0byBpb25fc2hhcmU/CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJT04gQUxMT0NBVElPTiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworY2xhc3MgQzJBbGxvY2F0aW9uSW9uIDogcHVibGljIEMyTGluZWFyQWxsb2NhdGlvbiB7CitwdWJsaWM6CisgICAgLyogSW50ZXJmYWNlIG1ldGhvZHMgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG1hcCgKKyAgICAgICAgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIEMyRmVuY2UgKmZlbmNlLAorICAgICAgICB2b2lkICoqYWRkciAvKiBub25udWxsICovKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHVubWFwKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplLCBDMkZlbmNlICpmZW5jZUZkKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIH5DMkFsbG9jYXRpb25Jb24oKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGNvbnN0IEMySGFuZGxlICpoYW5kbGUoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJvb2wgZXF1YWxzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICZvdGhlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLyBpbnRlcm5hbCBtZXRob2RzCisgICAgQzJBbGxvY2F0aW9uSW9uKGludCBpb25GZCwgc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbiwgdW5zaWduZWQgaGVhcE1hc2ssIHVuc2lnbmVkIGZsYWdzLCBDMkFsbG9jYXRvcjo6aWRfdCBpZCk7CisgICAgQzJBbGxvY2F0aW9uSW9uKGludCBpb25GZCwgc2l6ZV90IHNpemUsIGludCBzaGFyZUZkLCBDMkFsbG9jYXRvcjo6aWRfdCBpZCk7CisKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMoKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAgIGNsYXNzIEltcGw7CisgICAgY2xhc3MgSW1wbFYyOworICAgIEltcGwgKm1JbXBsOworCisgICAgLy8gVE9ETzogd2UgY291bGQgbWFrZSB0aGlzIGVuY2Fwc3VsYXRlIHNoYXJlZF9wdHIgYW5kIGNvcGlhYmxlCisgICAgQzJfRE9fTk9UX0NPUFkoQzJBbGxvY2F0aW9uSW9uKTsKK307CisKK2NsYXNzIEMyQWxsb2NhdGlvbklvbjo6SW1wbCB7Citwcm90ZWN0ZWQ6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBpb24gYWxsb2NhdGlvbi4KKyAgICAgKgorICAgICAqIFxub3RlIFdlIGFsd2F5cyBjcmVhdGUgYW4gaW9uIGFsbG9jYXRpb24sIGV2ZW4gaWYgdGhlIGFsbG9jYXRpb24gb3IgaW1wb3J0IGZhaWxzCisgICAgICogc28gdGhhdCB3ZSBjYW4gY2FwdHVyZSB0aGUgZXJyb3IuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW9uRmQgICAgIGlvbiBjbGllbnQgKG93bmVyc2hpcCB0cmFuc2ZlcnJlZCB0byBjcmVhdGVkIG9iamVjdCkKKyAgICAgKiBccGFyYW0gY2FwYWNpdHkgIHNpemUgb2YgYWxsb2NhdGlvbgorICAgICAqIFxwYXJhbSBidWZmZXJGZCAgYnVmZmVyIGhhbmRsZSAob3duZXJzaGlwIHRyYW5zZmVycmVkIHRvIGNyZWF0ZWQgb2JqZWN0KS4gTXVzdCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgaW52YWxpZCBpZiBlcnIgaXMgbm90IDAuCisgICAgICogXHBhcmFtIGJ1ZmZlciAgICBpb24gYnVmZmVyIHVzZXIgaGFuZGxlIChvd25lcnNoaXAgdHJhbnNmZXJyZWQgdG8gY3JlYXRlZCBvYmplY3QpLiBNdXN0IGJlCisgICAgICogICAgICAgICAgICAgICAgICBpbnZhbGlkIGlmIGVyciBpcyBub3QgMC4KKyAgICAgKiBccGFyYW0gZXJyICAgICAgIGVycm5vIGR1cmluZyBidWZmZXIgYWxsb2NhdGlvbiBvciBpbXBvcnQKKyAgICAgKi8KKyAgICBJbXBsKGludCBpb25GZCwgc2l6ZV90IGNhcGFjaXR5LCBpbnQgYnVmZmVyRmQsIGlvbl91c2VyX2hhbmRsZV90IGJ1ZmZlciwgQzJBbGxvY2F0b3I6OmlkX3QgaWQsIGludCBlcnIpCisgICAgICAgIDogbUlvbkZkKGlvbkZkKSwKKyAgICAgICAgICBtSGFuZGxlKGJ1ZmZlckZkLCBjYXBhY2l0eSksCisgICAgICAgICAgbUJ1ZmZlcihidWZmZXIpLAorICAgICAgICAgIG1JZChpZCksCisgICAgICAgICAgbUluaXQoYzJfbWFwX2Vycm5vPEVOT01FTSwgRUFDQ0VTLCBFSU5WQUw+KGVycikpLAorICAgICAgICAgIG1NYXBGZCgtMSkgeworICAgICAgICBpZiAobUluaXQgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIC8vIGNsb3NlIGlvbkZkIG5vdyBvbiBlcnJvcgorICAgICAgICAgICAgaWYgKG1Jb25GZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgY2xvc2UobUlvbkZkKTsKKyAgICAgICAgICAgICAgICBtSW9uRmQgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEMyX0NIRUNLKGJ1ZmZlckZkIDwgMCk7CisgICAgICAgICAgICAvLyBDMl9DSEVDSyhidWZmZXIgPCAwKTsKKyAgICAgICAgfQorICAgIH0KKworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gaW9uIGFsbG9jYXRpb24gYnkgaW1wb3J0aW5nIGEgc2hhcmVkIGJ1ZmZlciBmZC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpb25GZCAgICAgaW9uIGNsaWVudCAob3duZXJzaGlwIHRyYW5zZmVycmVkIHRvIGNyZWF0ZWQgb2JqZWN0KQorICAgICAqIFxwYXJhbSBjYXBhY2l0eSAgc2l6ZSBvZiBhbGxvY2F0aW9uCisgICAgICogXHBhcmFtIGJ1ZmZlckZkICBidWZmZXIgaGFuZGxlIChvd25lcnNoaXAgdHJhbnNmZXJyZWQgdG8gY3JlYXRlZCBvYmplY3QpCisgICAgICoKKyAgICAgKiBccmV0dXJuIGNyZWF0ZWQgaW9uIGFsbG9jYXRpb24gKGltcGxlbWVudGF0aW9uKSB3aGljaCBtYXkgYmUgaW52YWxpZCBpZiB0aGUKKyAgICAgKiBpbXBvcnQgZmFpbGVkLgorICAgICAqLworICAgIHN0YXRpYyBJbXBsICpJbXBvcnQoaW50IGlvbkZkLCBzaXplX3QgY2FwYWNpdHksIGludCBidWZmZXJGZCwgQzJBbGxvY2F0b3I6OmlkX3QgaWQpOworCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBpb24gYWxsb2NhdGlvbiBieSBhbGxvY2F0aW5nIGFuIGlvbiBidWZmZXIuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW9uRmQgICAgIGlvbiBjbGllbnQgKG93bmVyc2hpcCB0cmFuc2ZlcnJlZCB0byBjcmVhdGVkIG9iamVjdCkKKyAgICAgKiBccGFyYW0gc2l6ZSAgICAgIHNpemUgb2YgYWxsb2NhdGlvbgorICAgICAqIFxwYXJhbSBhbGlnbiAgICAgZGVzaXJlZCBhbGlnbm1lbnQgb2YgYWxsb2NhdGlvbgorICAgICAqIFxwYXJhbSBoZWFwTWFzayAgbWFzayBvZiBoZWFwcyBjb25zaWRlcmVkCisgICAgICogXHBhcmFtIGZsYWdzICAgICBpb24gYWxsb2NhdGlvbiBmbGFncworICAgICAqCisgICAgICogXHJldHVybiBjcmVhdGVkIGlvbiBhbGxvY2F0aW9uIChpbXBsZW1lbnRhdGlvbikgd2hpY2ggbWF5IGJlIGludmFsaWQgaWYgdGhlCisgICAgICogYWxsb2NhdGlvbiBmYWlsZWQuCisgICAgICovCisgICAgc3RhdGljIEltcGwgKkFsbG9jKGludCBpb25GZCwgc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbiwgdW5zaWduZWQgaGVhcE1hc2ssIHVuc2lnbmVkIGZsYWdzLCBDMkFsbG9jYXRvcjo6aWRfdCBpZCk7CisKKyAgICBjMl9zdGF0dXNfdCBtYXAoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIEMyRmVuY2UgKmZlbmNlLCB2b2lkICoqYWRkcikgeworICAgICAgICAodm9pZClmZW5jZTsgLy8gVE9ETzogd2FpdCBmb3IgZmVuY2UKKyAgICAgICAgKmFkZHIgPSBudWxscHRyOworICAgICAgICBpZiAoIW1NYXBwaW5ncy5lbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HVigibXVsdGlwbGUgbWFwIik7CisgICAgICAgICAgICAvLyBUT0RPOiB0ZWNobmljYWxseSB3ZSBzaG91bGQgcmV0dXJuIERVUExJQ0FURSBoZXJlLCBidXQgb3VyIGJsb2NrIHZpZXdzIGRvbid0CisgICAgICAgICAgICAvLyBhY3R1YWxseSB1bm1hcCwgc28gd2UgZW5kIHVwIHJlbWFwcGluZyBhbiBpb24gYnVmZmVyIG11bHRpcGxlIHRpbWVzLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIHJldHVybiBDMl9EVVBMSUNBVEU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBwcm90ID0gUFJPVF9OT05FOworICAgICAgICBpbnQgZmxhZ3MgPSBNQVBfU0hBUkVEOworICAgICAgICBpZiAodXNhZ2UuZXhwZWN0ZWQgJiBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCkgeworICAgICAgICAgICAgcHJvdCB8PSBQUk9UX1JFQUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVzYWdlLmV4cGVjdGVkICYgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFKSB7CisgICAgICAgICAgICBwcm90IHw9IFBST1RfV1JJVEU7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgYWxpZ25tZW50Qnl0ZXMgPSBvZmZzZXQgJSBQQUdFX1NJWkU7CisgICAgICAgIHNpemVfdCBtYXBPZmZzZXQgPSBvZmZzZXQgLSBhbGlnbm1lbnRCeXRlczsKKyAgICAgICAgc2l6ZV90IG1hcFNpemUgPSBzaXplICsgYWxpZ25tZW50Qnl0ZXM7CisgICAgICAgIE1hcHBpbmcgbWFwID0geyBudWxscHRyLCBhbGlnbm1lbnRCeXRlcywgbWFwU2l6ZSB9OworCisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1hcEludGVybmFsKG1hcFNpemUsIG1hcE9mZnNldCwgYWxpZ25tZW50Qnl0ZXMsIHByb3QsIGZsYWdzLCAmKG1hcC5hZGRyKSwgYWRkcik7CisgICAgICAgIGlmIChtYXAuYWRkcikgeworICAgICAgICAgICAgbU1hcHBpbmdzLnB1c2hfYmFjayhtYXApOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgdW5tYXAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUsIEMyRmVuY2UgKmZlbmNlKSB7CisgICAgICAgIGlmIChtTWFwcGluZ3MuZW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR0QoInRyaWVkIHRvIHVubWFwIHVubWFwcGVkIGJ1ZmZlciIpOworICAgICAgICAgICAgcmV0dXJuIEMyX05PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGF1dG8gaXQgPSBtTWFwcGluZ3MuYmVnaW4oKTsgaXQgIT0gbU1hcHBpbmdzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBpZiAoYWRkciAhPSAodWludDhfdCAqKWl0LT5hZGRyICsgaXQtPmFsaWdubWVudEJ5dGVzIHx8CisgICAgICAgICAgICAgICAgICAgIHNpemUgKyBpdC0+YWxpZ25tZW50Qnl0ZXMgIT0gaXQtPnNpemUpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBlcnIgPSBtdW5tYXAoaXQtPmFkZHIsIGl0LT5zaXplKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJtdW5tYXAgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGMyX21hcF9lcnJubzxFSU5WQUw+KGVycm5vKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmZW5jZSkgeworICAgICAgICAgICAgICAgICpmZW5jZSA9IEMyRmVuY2UoKTsgLy8gbm90IHVzaW5nIGZlbmNlcworICAgICAgICAgICAgfQorICAgICAgICAgICAgKHZvaWQpbU1hcHBpbmdzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIEFMT0dWKCJzdWNjZXNzZnVsbHkgdW5tYXBwZWQ6ICVkIiwgbUhhbmRsZS5idWZmZXJGZCgpKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgfQorICAgICAgICBBTE9HRCgidW5tYXAgZmFpbGVkIHRvIGZpbmQgc3BlY2lmaWVkIG1hcCIpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIHZpcnR1YWwgfkltcGwoKSB7CisgICAgICAgIGlmICghbU1hcHBpbmdzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dEKCJEYW5nbGluZyBtYXBwaW5ncyEiKTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgTWFwcGluZyAmbWFwIDogbU1hcHBpbmdzKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpbXVubWFwKG1hcC5hZGRyLCBtYXAuc2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1NYXBGZCA+PSAwKSB7CisgICAgICAgICAgICBjbG9zZShtTWFwRmQpOworICAgICAgICAgICAgbU1hcEZkID0gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Jbml0ID09IEMyX09LKSB7CisgICAgICAgICAgICBpZiAobUJ1ZmZlciA+PSAwKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpaW9uX2ZyZWUobUlvbkZkLCBtQnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoJm1IYW5kbGUpOworICAgICAgICB9CisgICAgICAgIGlmIChtSW9uRmQgPj0gMCkgeworICAgICAgICAgICAgY2xvc2UobUlvbkZkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Jbml0OworICAgIH0KKworICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAmbUhhbmRsZTsKKyAgICB9CisKKyAgICBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1JZDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGlvbl91c2VyX2hhbmRsZV90IGlvbkhhbmRsZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1CdWZmZXI7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBtYXBJbnRlcm5hbChzaXplX3QgbWFwU2l6ZSwgc2l6ZV90IG1hcE9mZnNldCwgc2l6ZV90IGFsaWdubWVudEJ5dGVzLAorICAgICAgICAgICAgaW50IHByb3QsIGludCBmbGFncywgdm9pZCoqIGJhc2UsIHZvaWQqKiBhZGRyKSB7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOworICAgICAgICBpZiAobU1hcEZkID09IC0xKSB7CisgICAgICAgICAgICBpbnQgcmV0ID0gaW9uX21hcChtSW9uRmQsIG1CdWZmZXIsIG1hcFNpemUsIHByb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgbWFwT2Zmc2V0LCAodW5zaWduZWQgY2hhcioqKWJhc2UsICZtTWFwRmQpOworICAgICAgICAgICAgQUxPR1YoImlvbl9tYXAoaW9uRmQgPSAlZCwgaGFuZGxlID0gJWQsIHNpemUgPSAlenUsIHByb3QgPSAlZCwgZmxhZ3MgPSAlZCwgIgorICAgICAgICAgICAgICAgICAgIm9mZnNldCA9ICV6dSkgcmV0dXJuZWQgKCVkKSIsCisgICAgICAgICAgICAgICAgICBtSW9uRmQsIG1CdWZmZXIsIG1hcFNpemUsIHByb3QsIGZsYWdzLCBtYXBPZmZzZXQsIHJldCk7CisgICAgICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICAgICAgbU1hcEZkID0gLTE7CisgICAgICAgICAgICAgICAgKmJhc2UgPSAqYWRkciA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgZXJyID0gYzJfbWFwX2Vycm5vPEVJTlZBTD4oLXJldCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICphZGRyID0gKHVpbnQ4X3QgKikqYmFzZSArIGFsaWdubWVudEJ5dGVzOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmJhc2UgPSBtbWFwKG51bGxwdHIsIG1hcFNpemUsIHByb3QsIGZsYWdzLCBtTWFwRmQsIG1hcE9mZnNldCk7CisgICAgICAgICAgICBBTE9HVigibW1hcChzaXplID0gJXp1LCBwcm90ID0gJWQsIGZsYWdzID0gJWQsIG1hcEZkID0gJWQsIG9mZnNldCA9ICV6dSkgIgorICAgICAgICAgICAgICAgICAgInJldHVybmVkICglZCkiLAorICAgICAgICAgICAgICAgICAgbWFwU2l6ZSwgcHJvdCwgZmxhZ3MsIG1NYXBGZCwgbWFwT2Zmc2V0LCBlcnJubyk7CisgICAgICAgICAgICBpZiAoKmJhc2UgPT0gTUFQX0ZBSUxFRCkgeworICAgICAgICAgICAgICAgICpiYXNlID0gKmFkZHIgPSBudWxscHRyOworICAgICAgICAgICAgICAgIGVyciA9IGMyX21hcF9lcnJubzxFSU5WQUw+KGVycm5vKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmFkZHIgPSAodWludDhfdCAqKSpiYXNlICsgYWxpZ25tZW50Qnl0ZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbnQgbUlvbkZkOworICAgIEMySGFuZGxlSW9uIG1IYW5kbGU7CisgICAgaW9uX3VzZXJfaGFuZGxlX3QgbUJ1ZmZlcjsKKyAgICBDMkFsbG9jYXRvcjo6aWRfdCBtSWQ7CisgICAgYzJfc3RhdHVzX3QgbUluaXQ7CisgICAgaW50IG1NYXBGZDsgLy8gb25seSBvbmUgZm9yIG5vdworICAgIHN0cnVjdCBNYXBwaW5nIHsKKyAgICAgICAgdm9pZCAqYWRkcjsKKyAgICAgICAgc2l6ZV90IGFsaWdubWVudEJ5dGVzOworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICB9OworICAgIHN0ZDo6bGlzdDxNYXBwaW5nPiBtTWFwcGluZ3M7Cit9OworCitjbGFzcyBDMkFsbG9jYXRpb25Jb246OkltcGxWMiA6IHB1YmxpYyBDMkFsbG9jYXRpb25Jb246OkltcGwgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gaW9uIGFsbG9jYXRpb24gZm9yIHBsYXRmb3JtcyB3aXRoIG5ldyAoaW9uXzQuMTIuaCkgYXBpCisgICAgICoKKyAgICAgKiBcbm90ZSBXZSBhbHdheXMgY3JlYXRlIGFuIGlvbiBhbGxvY2F0aW9uLCBldmVuIGlmIHRoZSBhbGxvY2F0aW9uIG9yIGltcG9ydCBmYWlscworICAgICAqIHNvIHRoYXQgd2UgY2FuIGNhcHR1cmUgdGhlIGVycm9yLgorICAgICAqCisgICAgICogXHBhcmFtIGlvbkZkICAgICBpb24gY2xpZW50IChvd25lcnNoaXAgdHJhbnNmZXJyZWQgdG8gY3JlYXRlZCBvYmplY3QpCisgICAgICogXHBhcmFtIGNhcGFjaXR5ICBzaXplIG9mIGFsbG9jYXRpb24KKyAgICAgKiBccGFyYW0gYnVmZmVyRmQgIGJ1ZmZlciBoYW5kbGUgKG93bmVyc2hpcCB0cmFuc2ZlcnJlZCB0byBjcmVhdGVkIG9iamVjdCkuIE11c3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgIGludmFsaWQgaWYgZXJyIGlzIG5vdCAwLgorICAgICAqIFxwYXJhbSBlcnIgICAgICAgZXJybm8gZHVyaW5nIGJ1ZmZlciBhbGxvY2F0aW9uIG9yIGltcG9ydAorICAgICAqLworICAgIEltcGxWMihpbnQgaW9uRmQsIHNpemVfdCBjYXBhY2l0eSwgaW50IGJ1ZmZlckZkLCBDMkFsbG9jYXRvcjo6aWRfdCBpZCwgaW50IGVycikKKyAgICAgICAgOiBJbXBsKGlvbkZkLCBjYXBhY2l0eSwgYnVmZmVyRmQsIC0xIC8qYnVmZmVyKi8sIGlkLCBlcnIpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5JbXBsVjIoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIGlvbl91c2VyX2hhbmRsZV90IGlvbkhhbmRsZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1IYW5kbGUuYnVmZmVyRmQoKTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG1hcEludGVybmFsKHNpemVfdCBtYXBTaXplLCBzaXplX3QgbWFwT2Zmc2V0LCBzaXplX3QgYWxpZ25tZW50Qnl0ZXMsCisgICAgICAgICAgICBpbnQgcHJvdCwgaW50IGZsYWdzLCB2b2lkKiogYmFzZSwgdm9pZCoqIGFkZHIpIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gQzJfT0s7CisgICAgICAgICpiYXNlID0gbW1hcChudWxscHRyLCBtYXBTaXplLCBwcm90LCBmbGFncywgbUhhbmRsZS5idWZmZXJGZCgpLCBtYXBPZmZzZXQpOworICAgICAgICBBTE9HVigibW1hcFYyKHNpemUgPSAlenUsIHByb3QgPSAlZCwgZmxhZ3MgPSAlZCwgbWFwRmQgPSAlZCwgb2Zmc2V0ID0gJXp1KSAiCisgICAgICAgICAgICAgICJyZXR1cm5lZCAoJWQpIiwKKyAgICAgICAgICAgICAgbWFwU2l6ZSwgcHJvdCwgZmxhZ3MsIG1IYW5kbGUuYnVmZmVyRmQoKSwgbWFwT2Zmc2V0LCBlcnJubyk7CisgICAgICAgIGlmICgqYmFzZSA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgICAgICAqYmFzZSA9ICphZGRyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGVyciA9IGMyX21hcF9lcnJubzxFSU5WQUw+KGVycm5vKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICphZGRyID0gKHVpbnQ4X3QgKikqYmFzZSArIGFsaWdubWVudEJ5dGVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCit9OworCitDMkFsbG9jYXRpb25Jb246OkltcGwgKkMyQWxsb2NhdGlvbklvbjo6SW1wbDo6SW1wb3J0KGludCBpb25GZCwgc2l6ZV90IGNhcGFjaXR5LCBpbnQgYnVmZmVyRmQsCisgICAgICAgIEMyQWxsb2NhdG9yOjppZF90IGlkKSB7CisgICAgaW50IHJldCA9IDA7CisgICAgaWYgKGlvbl9pc19sZWdhY3koaW9uRmQpKSB7CisgICAgICAgIGlvbl91c2VyX2hhbmRsZV90IGJ1ZmZlciA9IC0xOworICAgICAgICByZXQgPSBpb25faW1wb3J0KGlvbkZkLCBidWZmZXJGZCwgJmJ1ZmZlcik7CisgICAgICAgIHJldHVybiBuZXcgSW1wbChpb25GZCwgY2FwYWNpdHksIGJ1ZmZlckZkLCBidWZmZXIsIGlkLCByZXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBuZXcgSW1wbFYyKGlvbkZkLCBjYXBhY2l0eSwgYnVmZmVyRmQsIGlkLCByZXQpOworICAgIH0KK30KKworQzJBbGxvY2F0aW9uSW9uOjpJbXBsICpDMkFsbG9jYXRpb25Jb246OkltcGw6OkFsbG9jKGludCBpb25GZCwgc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbiwKKyAgICAgICAgdW5zaWduZWQgaGVhcE1hc2ssIHVuc2lnbmVkIGZsYWdzLCBDMkFsbG9jYXRvcjo6aWRfdCBpZCkgeworICAgIGludCBidWZmZXJGZCA9IC0xOworICAgIGlvbl91c2VyX2hhbmRsZV90IGJ1ZmZlciA9IC0xOworICAgIHNpemVfdCBhbGlnbmVkU2l6ZSA9IGFsaWduID09IDAgPyBzaXplIDogKHNpemUgKyBhbGlnbiAtIDEpICYgfihhbGlnbiAtIDEpOworICAgIGludCByZXQ7CisKKyAgICBpZiAoaW9uX2lzX2xlZ2FjeShpb25GZCkpIHsKKyAgICAgICAgcmV0ID0gaW9uX2FsbG9jKGlvbkZkLCBhbGlnbmVkU2l6ZSwgYWxpZ24sIGhlYXBNYXNrLCBmbGFncywgJmJ1ZmZlcik7CisgICAgICAgIEFMT0dWKCJpb25fYWxsb2MoaW9uRmQgPSAlZCwgc2l6ZSA9ICV6dSwgYWxpZ24gPSAlenUsIHByb3QgPSAlZCwgZmxhZ3MgPSAlZCkgIgorICAgICAgICAgICAgICAicmV0dXJuZWQgKCVkKSA7IGJ1ZmZlciA9ICVkIiwKKyAgICAgICAgICAgICAgaW9uRmQsIGFsaWduZWRTaXplLCBhbGlnbiwgaGVhcE1hc2ssIGZsYWdzLCByZXQsIGJ1ZmZlcik7CisgICAgICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICAgICAgLy8gZ2V0IGJ1ZmZlciBmZCBmb3IgbmF0aXZlIGhhbmRsZSBjb25zdHJ1Y3RvcgorICAgICAgICAgICAgcmV0ID0gaW9uX3NoYXJlKGlvbkZkLCBidWZmZXIsICZidWZmZXJGZCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBpb25fZnJlZShpb25GZCwgYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmV3IEltcGwoaW9uRmQsIGFsaWduZWRTaXplLCBidWZmZXJGZCwgYnVmZmVyLCBpZCwgcmV0KTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIHJldCA9IGlvbl9hbGxvY19mZChpb25GZCwgYWxpZ25lZFNpemUsIGFsaWduLCBoZWFwTWFzaywgZmxhZ3MsICZidWZmZXJGZCk7CisgICAgICAgIEFMT0dWKCJpb25fYWxsb2NfZmQoaW9uRmQgPSAlZCwgc2l6ZSA9ICV6dSwgYWxpZ24gPSAlenUsIHByb3QgPSAlZCwgZmxhZ3MgPSAlZCkgIgorICAgICAgICAgICAgICAicmV0dXJuZWQgKCVkKSA7IGJ1ZmZlckZkID0gJWQiLAorICAgICAgICAgICAgICBpb25GZCwgYWxpZ25lZFNpemUsIGFsaWduLCBoZWFwTWFzaywgZmxhZ3MsIHJldCwgYnVmZmVyRmQpOworCisgICAgICAgIHJldHVybiBuZXcgSW1wbFYyKGlvbkZkLCBhbGlnbmVkU2l6ZSwgYnVmZmVyRmQsIGlkLCByZXQpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0aW9uSW9uOjptYXAoCisgICAgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIEMyRmVuY2UgKmZlbmNlLCB2b2lkICoqYWRkcikgeworICAgIHJldHVybiBtSW1wbC0+bWFwKG9mZnNldCwgc2l6ZSwgdXNhZ2UsIGZlbmNlLCBhZGRyKTsKK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0aW9uSW9uOjp1bm1hcCh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSwgQzJGZW5jZSAqZmVuY2UpIHsKKyAgICByZXR1cm4gbUltcGwtPnVubWFwKGFkZHIsIHNpemUsIGZlbmNlKTsKK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0aW9uSW9uOjpzdGF0dXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5zdGF0dXMoKTsKK30KKworQzJBbGxvY2F0b3I6OmlkX3QgQzJBbGxvY2F0aW9uSW9uOjpnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldEFsbG9jYXRvcklkKCk7Cit9CisKK2Jvb2wgQzJBbGxvY2F0aW9uSW9uOjplcXVhbHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gJm90aGVyKSBjb25zdCB7CisgICAgaWYgKCFvdGhlciB8fCBvdGhlci0+Z2V0QWxsb2NhdG9ySWQoKSAhPSBnZXRBbGxvY2F0b3JJZCgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gZ2V0IHVzZXIgaGFuZGxlIHRvIGNvbXBhcmUgb2JqZWN0cworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRpb25Jb24+IG90aGVyQXNJb24gPSBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJBbGxvY2F0aW9uSW9uPihvdGhlcik7CisgICAgcmV0dXJuIG1JbXBsLT5pb25IYW5kbGUoKSA9PSBvdGhlckFzSW9uLT5tSW1wbC0+aW9uSGFuZGxlKCk7Cit9CisKK2NvbnN0IEMySGFuZGxlICpDMkFsbG9jYXRpb25Jb246OmhhbmRsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmhhbmRsZSgpOworfQorCitDMkFsbG9jYXRpb25Jb246On5DMkFsbG9jYXRpb25Jb24oKSB7CisgICAgZGVsZXRlIG1JbXBsOworfQorCitDMkFsbG9jYXRpb25Jb246OkMyQWxsb2NhdGlvbklvbihpbnQgaW9uRmQsIHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBoZWFwTWFzaywgdW5zaWduZWQgZmxhZ3MsIEMyQWxsb2NhdG9yOjppZF90IGlkKQorICAgIDogQzJMaW5lYXJBbGxvY2F0aW9uKHNpemUpLAorICAgICAgbUltcGwoSW1wbDo6QWxsb2MoaW9uRmQsIHNpemUsIGFsaWduLCBoZWFwTWFzaywgZmxhZ3MsIGlkKSkgeyB9CisKK0MyQWxsb2NhdGlvbklvbjo6QzJBbGxvY2F0aW9uSW9uKGludCBpb25GZCwgc2l6ZV90IHNpemUsIGludCBzaGFyZUZkLCBDMkFsbG9jYXRvcjo6aWRfdCBpZCkKKyAgICA6IEMyTGluZWFyQWxsb2NhdGlvbihzaXplKSwKKyAgICAgIG1JbXBsKEltcGw6OkltcG9ydChpb25GZCwgc2l6ZSwgc2hhcmVGZCwgaWQpKSB7IH0KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IElPTiBBTExPQ0FUT1IgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK0MyQWxsb2NhdG9ySW9uOjpDMkFsbG9jYXRvcklvbihpZF90IGlkKQorICAgIDogbUluaXQoQzJfT0spLAorICAgICAgbUlvbkZkKGlvbl9vcGVuKCkpIHsKKyAgICBpZiAobUlvbkZkIDwgMCkgeworICAgICAgICBzd2l0Y2ggKGVycm5vKSB7CisgICAgICAgIGNhc2UgRU5PRU5UOiAgICBtSW5pdCA9IEMyX09NSVRURUQ7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiAgICAgICAgbUluaXQgPSBjMl9tYXBfZXJybm88RUFDQ0VTPihlcnJubyk7IGJyZWFrOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQzJNZW1vcnlVc2FnZSBtaW5Vc2FnZSA9IHsgMCwgMCB9OworICAgICAgICBDMk1lbW9yeVVzYWdlIG1heFVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgIFRyYWl0cyB0cmFpdHMgPSB7ICJhbmRyb2lkLmFsbG9jYXRvci5pb24iLCBpZCwgTElORUFSLCBtaW5Vc2FnZSwgbWF4VXNhZ2UgfTsKKyAgICAgICAgbVRyYWl0cyA9IHN0ZDo6bWFrZV9zaGFyZWQ8VHJhaXRzPih0cmFpdHMpOworICAgICAgICBtQmxvY2tTaXplID0gOjpnZXRwYWdlc2l6ZSgpOworICAgIH0KK30KKworQzJBbGxvY2F0b3JJb246On5DMkFsbG9jYXRvcklvbigpIHsKKyAgICBpZiAobUluaXQgPT0gQzJfT0spIHsKKyAgICAgICAgaW9uX2Nsb3NlKG1Jb25GZCk7CisgICAgfQorfQorCitDMkFsbG9jYXRvcjo6aWRfdCBDMkFsbG9jYXRvcklvbjo6Z2V0SWQoKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVzYWdlTWFwcGVyTG9jayk7CisgICAgcmV0dXJuIG1UcmFpdHMtPmlkOworfQorCitDMlN0cmluZyBDMkFsbG9jYXRvcklvbjo6Z2V0TmFtZSgpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXNhZ2VNYXBwZXJMb2NrKTsKKyAgICByZXR1cm4gbVRyYWl0cy0+bmFtZTsKK30KKworc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQWxsb2NhdG9yOjpUcmFpdHM+IEMyQWxsb2NhdG9ySW9uOjpnZXRUcmFpdHMoKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVzYWdlTWFwcGVyTG9jayk7CisgICAgcmV0dXJuIG1UcmFpdHM7Cit9CisKK3ZvaWQgQzJBbGxvY2F0b3JJb246OnNldFVzYWdlTWFwcGVyKAorICAgICAgICBjb25zdCBVc2FnZU1hcHBlckZuICZtYXBwZXIsIHVpbnQ2NF90IG1pblVzYWdlLCB1aW50NjRfdCBtYXhVc2FnZSwgdWludDY0X3QgYmxvY2tTaXplKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVzYWdlTWFwcGVyTG9jayk7CisgICAgbVVzYWdlTWFwcGVyQ2FjaGUuY2xlYXIoKTsKKyAgICBtVXNhZ2VNYXBwZXJMcnUuY2xlYXIoKTsKKyAgICBtVXNhZ2VNYXBwZXIgPSBtYXBwZXI7CisgICAgVHJhaXRzIHRyYWl0cyA9IHsKKyAgICAgICAgbVRyYWl0cy0+bmFtZSwgbVRyYWl0cy0+aWQsIExJTkVBUiwKKyAgICAgICAgQzJNZW1vcnlVc2FnZShtaW5Vc2FnZSksIEMyTWVtb3J5VXNhZ2UobWF4VXNhZ2UpCisgICAgfTsKKyAgICBtVHJhaXRzID0gc3RkOjptYWtlX3NoYXJlZDxUcmFpdHM+KHRyYWl0cyk7CisgICAgbUJsb2NrU2l6ZSA9IGJsb2NrU2l6ZTsKK30KKworc3RkOjpzaXplX3QgQzJBbGxvY2F0b3JJb246Ok1hcHBlcktleUhhc2g6Om9wZXJhdG9yKCkoY29uc3QgTWFwcGVyS2V5ICZrKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6aGFzaDx1aW50NjRfdD57fShrLmZpcnN0KSBeIHN0ZDo6aGFzaDxzaXplX3Q+e30oay5zZWNvbmQpOworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRvcklvbjo6bWFwVXNhZ2UoCisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIHNpemVfdCBjYXBhY2l0eSwgc2l6ZV90ICphbGlnbiwgdW5zaWduZWQgKmhlYXBNYXNrLCB1bnNpZ25lZCAqZmxhZ3MpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXNhZ2VNYXBwZXJMb2NrKTsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBDMl9PSzsKKyAgICAvLyBhbGlnbiBjYXBhY2l0eQorICAgIGNhcGFjaXR5ID0gKGNhcGFjaXR5ICsgbUJsb2NrU2l6ZSAtIDEpICYgfihtQmxvY2tTaXplIC0gMSk7CisgICAgTWFwcGVyS2V5IGtleSA9IHN0ZDo6bWFrZV9wYWlyKHVzYWdlLmV4cGVjdGVkLCBjYXBhY2l0eSk7CisgICAgYXV0byBlbnRyeSA9IG1Vc2FnZU1hcHBlckNhY2hlLmZpbmQoa2V5KTsKKyAgICBpZiAoZW50cnkgPT0gbVVzYWdlTWFwcGVyQ2FjaGUuZW5kKCkpIHsKKyAgICAgICAgaWYgKG1Vc2FnZU1hcHBlcikgeworICAgICAgICAgICAgcmVzID0gbVVzYWdlTWFwcGVyKHVzYWdlLCBjYXBhY2l0eSwgYWxpZ24sIGhlYXBNYXNrLCBmbGFncyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqYWxpZ24gPSAwOyAvLyBUT0RPIG1ha2UgdGhpcyAxCisgICAgICAgICAgICAqaGVhcE1hc2sgPSB+MDsgLy8gZGVmYXVsdCBtYXNrCisgICAgICAgICAgICBpZiAodXNhZ2UuZXhwZWN0ZWQgJiAoQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQgfCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUpKSB7CisgICAgICAgICAgICAgICAgKmZsYWdzID0gSU9OX0ZMQUdfQ0FDSEVEOyAvLyBjYWNoZSBDUFUgYWNjZXNzZWQgYnVmZmVycworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqZmxhZ3MgPSAwOyAgLy8gZGVmYXVsdCBmbGFncworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzID0gQzJfTk9fSU5JVDsKKyAgICAgICAgfQorICAgICAgICAvLyBhZGQgdXNhZ2UgdG8gY2FjaGUKKyAgICAgICAgTWFwcGVyVmFsdWUgdmFsdWUgPSBzdGQ6Om1ha2VfdHVwbGUoKmFsaWduLCAqaGVhcE1hc2ssICpmbGFncywgcmVzKTsKKyAgICAgICAgbVVzYWdlTWFwcGVyTHJ1LmVtcGxhY2VfZnJvbnQoa2V5LCB2YWx1ZSk7CisgICAgICAgIG1Vc2FnZU1hcHBlckNhY2hlLmVtcGxhY2Uoc3RkOjptYWtlX3BhaXIoa2V5LCBtVXNhZ2VNYXBwZXJMcnUuYmVnaW4oKSkpOworICAgICAgICBpZiAobVVzYWdlTWFwcGVyQ2FjaGUuc2l6ZSgpID4gVVNBR0VfTFJVX0NBQ0hFX1NJWkUpIHsKKyAgICAgICAgICAgIC8vIHJlbW92ZSBMUlUgZW50cnkKKyAgICAgICAgICAgIE1hcHBlcktleSBscnVLZXkgPSBtVXNhZ2VNYXBwZXJMcnUuZnJvbnQoKS5maXJzdDsKKyAgICAgICAgICAgIG1Vc2FnZU1hcHBlckNhY2hlLmVyYXNlKGxydUtleSk7CisgICAgICAgICAgICBtVXNhZ2VNYXBwZXJMcnUucG9wX2JhY2soKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIG1vdmUgZW50cnkgdG8gTVJVCisgICAgICAgIG1Vc2FnZU1hcHBlckxydS5zcGxpY2UobVVzYWdlTWFwcGVyTHJ1LmJlZ2luKCksIG1Vc2FnZU1hcHBlckxydSwgZW50cnktPnNlY29uZCk7CisgICAgICAgIGNvbnN0IE1hcHBlclZhbHVlICZ2YWx1ZSA9IGVudHJ5LT5zZWNvbmQtPnNlY29uZDsKKyAgICAgICAgc3RkOjp0aWUoKmFsaWduLCAqaGVhcE1hc2ssICpmbGFncywgcmVzKSA9IHZhbHVlOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRvcklvbjo6bmV3TGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgdWludDMyX3QgY2FwYWNpdHksIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICphbGxvY2F0aW9uKSB7CisgICAgaWYgKGFsbG9jYXRpb24gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIGFsbG9jYXRpb24tPnJlc2V0KCk7CisgICAgaWYgKG1Jbml0ICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICB9CisKKyAgICBzaXplX3QgYWxpZ24gPSAwOworICAgIHVuc2lnbmVkIGhlYXBNYXNrID0gfjA7CisgICAgdW5zaWduZWQgZmxhZ3MgPSAwOworICAgIGMyX3N0YXR1c190IHJldCA9IG1hcFVzYWdlKHVzYWdlLCBjYXBhY2l0eSwgJmFsaWduLCAmaGVhcE1hc2ssICZmbGFncyk7CisgICAgaWYgKHJldCAmJiByZXQgIT0gQzJfTk9fSU5JVCkgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRpb25Jb24+IGFsbG9jCisgICAgICAgID0gc3RkOjptYWtlX3NoYXJlZDxDMkFsbG9jYXRpb25Jb24+KGR1cChtSW9uRmQpLCBjYXBhY2l0eSwgYWxpZ24sIGhlYXBNYXNrLCBmbGFncywgbVRyYWl0cy0+aWQpOworICAgIHJldCA9IGFsbG9jLT5zdGF0dXMoKTsKKyAgICBpZiAocmV0ID09IEMyX09LKSB7CisgICAgICAgICphbGxvY2F0aW9uID0gYWxsb2M7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdG9ySW9uOjpwcmlvckxpbmVhckFsbG9jYXRpb24oCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICphbGxvY2F0aW9uKSB7CisgICAgKmFsbG9jYXRpb24gPSBudWxscHRyOworICAgIGlmIChtSW5pdCAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgfQorCisgICAgaWYgKCFDMkhhbmRsZUlvbjo6aXNWYWxpZChoYW5kbGUpKSB7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gVE9ETzogZ2V0IGNhcGFjaXR5IGFuZCB2YWxpZGF0ZSBpdAorICAgIGNvbnN0IEMySGFuZGxlSW9uICpoID0gc3RhdGljX2Nhc3Q8Y29uc3QgQzJIYW5kbGVJb24qPihoYW5kbGUpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRpb25Jb24+IGFsbG9jCisgICAgICAgID0gc3RkOjptYWtlX3NoYXJlZDxDMkFsbG9jYXRpb25Jb24+KGR1cChtSW9uRmQpLCBoLT5zaXplKCksIGgtPmJ1ZmZlckZkKCksIG1UcmFpdHMtPmlkKTsKKyAgICBjMl9zdGF0dXNfdCByZXQgPSBhbGxvYy0+c3RhdHVzKCk7CisgICAgaWYgKHJldCA9PSBDMl9PSykgeworICAgICAgICAqYWxsb2NhdGlvbiA9IGFsbG9jOworICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCo+KAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgbmF0aXZlX2hhbmRsZV90Kj4oaGFuZGxlKSkpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitib29sIEMyQWxsb2NhdG9ySW9uOjppc1ZhbGlkKGNvbnN0IEMySGFuZGxlKiBjb25zdCBvKSB7CisgICAgcmV0dXJuIEMySGFuZGxlSW9uOjppc1ZhbGlkKG8pOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyQnVmZmVyLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL0MyQnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTBiNTM2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJCdWZmZXIuY3BwCkBAIC0wLDAgKzEsMTMwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJCdWZmZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJCdWZmZXJQcml2Lmg+CisjaW5jbHVkZSA8QzJCbG9ja0ludGVybmFsLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmg+CisKK25hbWVzcGFjZSB7CisKK3VzaW5nIGFuZHJvaWQ6OkMyQWxsb2NhdG9yR3JhbGxvYzsKK3VzaW5nIGFuZHJvaWQ6OkMyQWxsb2NhdG9ySW9uOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpCdWZmZXJQb29sRGF0YTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6QnVmZmVyUG9vbEFsbG9jYXRpb247Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpCdWZmZXJQb29sQWxsb2NhdG9yOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6Q2xpZW50TWFuYWdlcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkNvbm5lY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OklOVkFMSURfQ09OTkVDVElPTklEOworCisvLyBUaGlzIGFub255bW91cyBuYW1lc3BhY2UgY29udGFpbnMgdGhlIGhlbHBlciBjbGFzc2VzIHRoYXQgYWxsb3cgb3VyIGltcGxlbWVudGF0aW9uIHRvIGNyZWF0ZQorLy8gYmxvY2svYnVmZmVyIG9iamVjdHMuCisvLworLy8gSW5oZXJpdCBmcm9tIHRoZSBwYXJlbnQsIHNoYXJlIHdpdGggdGhlIGZyaWVuZC4KK2NsYXNzIFJlYWRWaWV3QnVkZHkgOiBwdWJsaWMgQzJSZWFkVmlldyB7CisgICAgdXNpbmcgQzJSZWFkVmlldzo6QzJSZWFkVmlldzsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkNvbnN0TGluZWFyQmxvY2s7Cit9OworCitjbGFzcyBXcml0ZVZpZXdCdWRkeSA6IHB1YmxpYyBDMldyaXRlVmlldyB7CisgICAgdXNpbmcgQzJXcml0ZVZpZXc6OkMyV3JpdGVWaWV3OworICAgIGZyaWVuZCBjbGFzcyA6OkMyTGluZWFyQmxvY2s7Cit9OworCitjbGFzcyBDb25zdExpbmVhckJsb2NrQnVkZHkgOiBwdWJsaWMgQzJDb25zdExpbmVhckJsb2NrIHsKKyAgICB1c2luZyBDMkNvbnN0TGluZWFyQmxvY2s6OkMyQ29uc3RMaW5lYXJCbG9jazsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkxpbmVhckJsb2NrOworfTsKKworY2xhc3MgTGluZWFyQmxvY2tCdWRkeSA6IHB1YmxpYyBDMkxpbmVhckJsb2NrIHsKKyAgICB1c2luZyBDMkxpbmVhckJsb2NrOjpDMkxpbmVhckJsb2NrOworICAgIGZyaWVuZCBjbGFzcyA6OkMyQmFzaWNMaW5lYXJCbG9ja1Bvb2w7Cit9OworCitjbGFzcyBBY3F1aXJhYmxlUmVhZFZpZXdCdWRkeSA6IHB1YmxpYyBDMkFjcXVpcmFibGU8QzJSZWFkVmlldz4geworICAgIHVzaW5nIEMyQWNxdWlyYWJsZTo6QzJBY3F1aXJhYmxlOworICAgIGZyaWVuZCBjbGFzcyA6OkMyQ29uc3RMaW5lYXJCbG9jazsKK307CisKK2NsYXNzIEFjcXVpcmFibGVXcml0ZVZpZXdCdWRkeSA6IHB1YmxpYyBDMkFjcXVpcmFibGU8QzJXcml0ZVZpZXc+IHsKKyAgICB1c2luZyBDMkFjcXVpcmFibGU6OkMyQWNxdWlyYWJsZTsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkxpbmVhckJsb2NrOworfTsKKworY2xhc3MgR3JhcGhpY1ZpZXdCdWRkeSA6IHB1YmxpYyBDMkdyYXBoaWNWaWV3IHsKKyAgICB1c2luZyBDMkdyYXBoaWNWaWV3OjpDMkdyYXBoaWNWaWV3OworICAgIGZyaWVuZCBjbGFzcyA6OkMyQ29uc3RHcmFwaGljQmxvY2s7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJHcmFwaGljQmxvY2s7Cit9OworCitjbGFzcyBBY3F1aXJhYmxlQ29uc3RHcmFwaGljVmlld0J1ZGR5IDogcHVibGljIEMyQWNxdWlyYWJsZTxjb25zdCBDMkdyYXBoaWNWaWV3PiB7CisgICAgdXNpbmcgQzJBY3F1aXJhYmxlOjpDMkFjcXVpcmFibGU7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJDb25zdEdyYXBoaWNCbG9jazsKK307CisKK2NsYXNzIEFjcXVpcmFibGVHcmFwaGljVmlld0J1ZGR5IDogcHVibGljIEMyQWNxdWlyYWJsZTxDMkdyYXBoaWNWaWV3PiB7CisgICAgdXNpbmcgQzJBY3F1aXJhYmxlOjpDMkFjcXVpcmFibGU7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJHcmFwaGljQmxvY2s7Cit9OworCitjbGFzcyBDb25zdEdyYXBoaWNCbG9ja0J1ZGR5IDogcHVibGljIEMyQ29uc3RHcmFwaGljQmxvY2sgeworICAgIHVzaW5nIEMyQ29uc3RHcmFwaGljQmxvY2s6OkMyQ29uc3RHcmFwaGljQmxvY2s7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJHcmFwaGljQmxvY2s7Cit9OworCitjbGFzcyBHcmFwaGljQmxvY2tCdWRkeSA6IHB1YmxpYyBDMkdyYXBoaWNCbG9jayB7CisgICAgdXNpbmcgQzJHcmFwaGljQmxvY2s6OkMyR3JhcGhpY0Jsb2NrOworICAgIGZyaWVuZCBjbGFzcyA6OkMyQmFzaWNHcmFwaGljQmxvY2tQb29sOworfTsKKworY2xhc3MgQnVmZmVyRGF0YUJ1ZGR5IDogcHVibGljIEMyQnVmZmVyRGF0YSB7CisgICAgdXNpbmcgQzJCdWZmZXJEYXRhOjpDMkJ1ZmZlckRhdGE7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJCdWZmZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IDFEIEJMT0NLID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgYWxsIDFEIGJsb2NrIGFuZCB2aWV3IGltcGxlbWVudGF0aW9ucy4KKyAqCisgKiBUaGlzIGlzIGJhc2ljYWxseSBqdXN0IGEgcGxhY2Vob2xkZXIgZm9yIHRoZSB1bmRlcmx5aW5nIDFEIGFsbG9jYXRpb24gYW5kIHRoZSByYW5nZSBvZiB0aGUKKyAqIGFsbG90ZWQgcG9ydGlvbiB0byB0aGlzIGJsb2NrLiBUaGVyZSBpcyBhbHNvIGEgcGxhY2Vob2xkZXIgZm9yIGEgYmxvY2twb29sIGRhdGEuCisgKi8KK2NsYXNzIEMyX0hJREUgX0MyQmxvY2sxREltcGwgOiBwdWJsaWMgX0MyTGluZWFyUmFuZ2VBc3BlY3QgeworcHVibGljOgorICAgIF9DMkJsb2NrMURJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiAmcG9vbERhdGEgPSBudWxscHRyLAorICAgICAgICAgICAgc2l6ZV90IG9mZnNldCA9IDAsIHNpemVfdCBzaXplID0gfihzaXplX3QpMCkKKyAgICAgICAgOiBfQzJMaW5lYXJSYW5nZUFzcGVjdChhbGxvYy5nZXQoKSwgb2Zmc2V0LCBzaXplKSwKKyAgICAgICAgICBtQWxsb2NhdGlvbihhbGxvYyksCisgICAgICAgICAgbVBvb2xEYXRhKHBvb2xEYXRhKSB7IH0KKworICAgIF9DMkJsb2NrMURJbXBsKGNvbnN0IF9DMkJsb2NrMURJbXBsICZvdGhlciwgc2l6ZV90IG9mZnNldCA9IDAsIHNpemVfdCBzaXplID0gfihzaXplX3QpMCkKKyAgICAgICAgOiBfQzJMaW5lYXJSYW5nZUFzcGVjdCgmb3RoZXIsIG9mZnNldCwgc2l6ZSksCisgICAgICAgICAgbUFsbG9jYXRpb24ob3RoZXIubUFsbG9jYXRpb24pLAorICAgICAgICAgIG1Qb29sRGF0YShvdGhlci5tUG9vbERhdGEpIHsgfQorCisgICAgLyoqIHJldHVybnMgcG9vbCBkYXRhICAqLworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Qb29sRGF0YTsKKyAgICB9CisKKyAgICAvKiogcmV0dXJucyBuYXRpdmUgaGFuZGxlICovCisgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uID8gbUFsbG9jYXRpb24tPmhhbmRsZSgpIDogbnVsbHB0cjsKKyAgICB9CisKKyAgICAvKiogcmV0dXJucyB0aGUgYWxsb2NhdG9yJ3MgSUQgKi8KKyAgICBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IHsKKyAgICAgICAgLy8gQkFEX0lEIGNhbiBvbmx5IGhhcHBlbiBpZiB0aGlzIEltcGwgY2xhc3MgaXMgaW5pdGlhbGl6ZWQgZm9yIGEgdmlldyAtIG5ldmVyIGZvciBhIGJsb2NrLgorICAgICAgICByZXR1cm4gbUFsbG9jYXRpb24gPyBtQWxsb2NhdGlvbi0+Z2V0QWxsb2NhdG9ySWQoKSA6IEMyQWxsb2NhdG9yOjpCQURfSUQ7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gZ2V0QWxsb2NhdGlvbigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBtQWxsb2NhdGlvbjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gbVBvb2xEYXRhOworfTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHRoZSBtYXBwZWQgZGF0YSBwb2ludGVyLCBhbmQgdGhlIHBvdGVudGlhbCBlcnJvci4KKyAqCisgKiByYW5nZSBpcyB0aGUgbWFwcGVkIHJhbmdlIG9mIHRoZSB1bmRlcmx5aW5nIGFsbG9jYXRpb24gKHdoaWNoIGlzIHBhcnQgb2YgdGhlIGFsbG90dGVkCisgKiByYW5nZSkuCisgKi8KK2NsYXNzIEMyX0hJREUgX0MyTWFwcGVkQmxvY2sxREltcGwgOiBwdWJsaWMgX0MyQmxvY2sxREltcGwgeworcHVibGljOgorICAgIF9DMk1hcHBlZEJsb2NrMURJbXBsKGNvbnN0IF9DMkJsb2NrMURJbXBsICZibG9jaywgdWludDhfdCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMCwgc2l6ZV90IHNpemUgPSB+KHNpemVfdCkwKQorICAgICAgICA6IF9DMkJsb2NrMURJbXBsKGJsb2NrLCBvZmZzZXQsIHNpemUpLCBtRGF0YShkYXRhKSwgbUVycm9yKEMyX09LKSB7IH0KKworICAgIF9DMk1hcHBlZEJsb2NrMURJbXBsKGMyX3N0YXR1c190IGVycm9yKQorICAgICAgICA6IF9DMkJsb2NrMURJbXBsKG51bGxwdHIpLCBtRGF0YShudWxscHRyKSwgbUVycm9yKGVycm9yKSB7CisgICAgICAgIC8vIENIRUNLKGVycm9yICE9IEMyX09LKTsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpkYXRhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURhdGE7CisgICAgfQorCisgICAgdWludDhfdCAqZGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIG1EYXRhOworICAgIH0KKworICAgIGMyX3N0YXR1c190IGVycm9yKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUVycm9yOworICAgIH0KKworcHJpdmF0ZToKKyAgICB1aW50OF90ICptRGF0YTsKKyAgICBjMl9zdGF0dXNfdCBtRXJyb3I7Cit9OworCisvKioKKyAqIEJsb2NrIGltcGxlbWVudGF0aW9uLgorICovCitjbGFzcyBDMkJsb2NrMUQ6OkltcGwgOiBwdWJsaWMgX0MyQmxvY2sxREltcGwgeworICAgIHVzaW5nIF9DMkJsb2NrMURJbXBsOjpfQzJCbG9jazFESW1wbDsKK307CisKK2NvbnN0IEMySGFuZGxlICpDMkJsb2NrMUQ6OmhhbmRsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmhhbmRsZSgpOworfTsKKworQzJBbGxvY2F0b3I6OmlkX3QgQzJCbG9jazFEOjpnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldEFsbG9jYXRvcklkKCk7Cit9OworCitDMkJsb2NrMUQ6OkMyQmxvY2sxRChzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyTGluZWFyUmFuZ2VBc3BlY3QgJnJhbmdlKQorICAgIC8vIGFsd2F5cyBjbGFtcCBzdWJyYW5nZSB0byBwYXJlbnQgKGltcGwpIHJhbmdlIGZvciBzYWZldHkKKyAgICA6IF9DMkxpbmVhclJhbmdlQXNwZWN0KGltcGwuZ2V0KCksIHJhbmdlLm9mZnNldCgpLCByYW5nZS5zaXplKCkpLCBtSW1wbChpbXBsKSB7Cit9CisKKy8qKgorICogUmVhZCB2aWV3IGltcGxlbWVudGF0aW9uLgorICoKKyAqIHJhbmdlIG9mIEltcGwgaXMgdGhlIG1hcHBlZCByYW5nZSBvZiB0aGUgdW5kZXJseWluZyBhbGxvY2F0aW9uICh3aGljaCBpcyBwYXJ0IG9mIHRoZSBhbGxvdHRlZAorICogcmFuZ2UpLiByYW5nZSBvZiBWaWV3IGlzIDAgdG8gY2FwYWNpdHkoKSAobm90IHJlcHJlc2VudGVkIGFzIGFuIGFjdHVhbCByYW5nZSkuIFRoaXMgbWFwcyB0byBhCisgKiBzdWJyYW5nZSBvZiBJbXBsIHJhbmdlIHN0YXJ0aW5nIGF0IG1JbXBsLT5vZmZzZXQoKSArIF9tT2Zmc2V0LgorICovCitjbGFzcyBDMlJlYWRWaWV3OjpJbXBsIDogcHVibGljIF9DMk1hcHBlZEJsb2NrMURJbXBsIHsKKyAgICB1c2luZyBfQzJNYXBwZWRCbG9jazFESW1wbDo6X0MyTWFwcGVkQmxvY2sxREltcGw7Cit9OworCitDMlJlYWRWaWV3OjpDMlJlYWRWaWV3KHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IHNpemUpCisgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChDMkxpbmVhckNhcGFjaXR5KGltcGwtPnNpemUoKSkucmFuZ2Uob2Zmc2V0LCBzaXplKS5zaXplKCkpLAorICAgICAgbUltcGwoaW1wbCksCisgICAgICBtT2Zmc2V0KEMyTGluZWFyQ2FwYWNpdHkoaW1wbC0+c2l6ZSgpKS5yYW5nZShvZmZzZXQsIHNpemUpLm9mZnNldCgpKSB7IH0KKworQzJSZWFkVmlldzo6QzJSZWFkVmlldyhjMl9zdGF0dXNfdCBlcnJvcikKKyAgICA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KDB1KSwgbUltcGwoc3RkOjptYWtlX3NoYXJlZDxJbXBsPihlcnJvcikpLCBtT2Zmc2V0KDB1KSB7CisgICAgLy8gQ0hFQ0soZXJyb3IgIT0gQzJfT0spOworfQorCitjb25zdCB1aW50OF90ICpDMlJlYWRWaWV3OjpkYXRhKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+ZXJyb3IoKSA/IG51bGxwdHIgOiBtSW1wbC0+ZGF0YSgpICsgbU9mZnNldDsKK30KKworYzJfc3RhdHVzX3QgQzJSZWFkVmlldzo6ZXJyb3IoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5lcnJvcigpOworfQorCitDMlJlYWRWaWV3IEMyUmVhZFZpZXc6OnN1YlZpZXcoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIGNvbnN0IHsKKyAgICBDMkxpbmVhclJhbmdlIHN1YlJhbmdlKCp0aGlzLCBvZmZzZXQsIHNpemUpOworICAgIHJldHVybiBDMlJlYWRWaWV3KG1JbXBsLCBtT2Zmc2V0ICsgc3ViUmFuZ2Uub2Zmc2V0KCksIHN1YlJhbmdlLnNpemUoKSk7Cit9CisKKy8qKgorICogV3JpdGUgdmlldyBpbXBsZW1lbnRhdGlvbi4KKyAqLworY2xhc3MgQzJXcml0ZVZpZXc6OkltcGwgOiBwdWJsaWMgX0MyTWFwcGVkQmxvY2sxREltcGwgeworICAgIHVzaW5nIF9DMk1hcHBlZEJsb2NrMURJbXBsOjpfQzJNYXBwZWRCbG9jazFESW1wbDsKK307CisKK0MyV3JpdGVWaWV3OjpDMldyaXRlVmlldyhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCkKKy8vIFVHTFk6IF9DMkxpbmVhclJhbmdlQXNwZWN0IHJlcXVpcmVzIGEgYm9uYS1maWRlIG9iamVjdCBmb3IgY2FwYWNpdHkgdG8gcHJldmVudCBzcG9vZmluZywgc28KKy8vIHRoaXMgaXMgd2hhdCB3ZSBoYXZlIHRvIGRvLgorLy8gVE9ETzogdXNlIGNoaWxkUmFuZ2UKKyAgICA6IF9DMkVkaXRhYmxlTGluZWFyUmFuZ2VBc3BlY3Qoc3RkOjptYWtlX3VuaXF1ZTxDMkxpbmVhckNhcGFjaXR5PihpbXBsLT5zaXplKCkpLmdldCgpKSwgbUltcGwoaW1wbCkgeyB9CisKK0MyV3JpdGVWaWV3OjpDMldyaXRlVmlldyhjMl9zdGF0dXNfdCBlcnJvcikKKyAgICA6IF9DMkVkaXRhYmxlTGluZWFyUmFuZ2VBc3BlY3QobnVsbHB0ciksIG1JbXBsKHN0ZDo6bWFrZV9zaGFyZWQ8SW1wbD4oZXJyb3IpKSB7fQorCit1aW50OF90ICpDMldyaXRlVmlldzo6YmFzZSgpIHsgcmV0dXJuIG1JbXBsLT5kYXRhKCk7IH0KKwordWludDhfdCAqQzJXcml0ZVZpZXc6OmRhdGEoKSB7IHJldHVybiBtSW1wbC0+ZGF0YSgpICsgb2Zmc2V0KCk7IH0KKworYzJfc3RhdHVzX3QgQzJXcml0ZVZpZXc6OmVycm9yKCkgY29uc3QgeyByZXR1cm4gbUltcGwtPmVycm9yKCk7IH0KKworLyoqCisgKiBDb25zdCBsaW5lYXIgYmxvY2sgaW1wbGVtZW50YXRpb24uCisgKi8KK0MyQ29uc3RMaW5lYXJCbG9jazo6QzJDb25zdExpbmVhckJsb2NrKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJMaW5lYXJSYW5nZUFzcGVjdCAmcmFuZ2UsIEMyRmVuY2UgZmVuY2UpCisgICAgOiBDMkJsb2NrMUQoaW1wbCwgcmFuZ2UpLCBtRmVuY2UoZmVuY2UpIHsgfQorCitDMkFjcXVpcmFibGU8QzJSZWFkVmlldz4gQzJDb25zdExpbmVhckJsb2NrOjptYXAoKSBjb25zdCB7CisgICAgdm9pZCAqYmFzZSA9IG51bGxwdHI7CisgICAgdWludDMyX3QgbGVuID0gc2l6ZSgpOworICAgIGMyX3N0YXR1c190IGVycm9yID0gbUltcGwtPmdldEFsbG9jYXRpb24oKS0+bWFwKAorICAgICAgICAgICAgb2Zmc2V0KCksIGxlbiwgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgMCB9LCBudWxscHRyLCAmYmFzZSk7CisgICAgLy8gVE9ETzogd2FpdCBvbiBmZW5jZQorICAgIGlmIChlcnJvciA9PSBDMl9PSykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVhZFZpZXdCdWRkeTo6SW1wbD4gcnZpID0gc3RkOjpzaGFyZWRfcHRyPFJlYWRWaWV3QnVkZHk6OkltcGw+KAorICAgICAgICAgICAgICAgIG5ldyBSZWFkVmlld0J1ZGR5OjpJbXBsKCptSW1wbCwgKHVpbnQ4X3QgKiliYXNlLCBvZmZzZXQoKSwgbGVuKSwKKyAgICAgICAgICAgICAgICBbYmFzZSwgbGVuXShSZWFkVmlld0J1ZGR5OjpJbXBsICppKSB7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKWktPmdldEFsbG9jYXRpb24oKS0+dW5tYXAoYmFzZSwgbGVuLCBudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGk7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gQWNxdWlyYWJsZVJlYWRWaWV3QnVkZHkoZXJyb3IsIEMyRmVuY2UoKSwgUmVhZFZpZXdCdWRkeShydmksIDAsIGxlbikpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBBY3F1aXJhYmxlUmVhZFZpZXdCdWRkeShlcnJvciwgQzJGZW5jZSgpLCBSZWFkVmlld0J1ZGR5KGVycm9yKSk7CisgICAgfQorfQorCitDMkNvbnN0TGluZWFyQmxvY2sgQzJDb25zdExpbmVhckJsb2NrOjpzdWJCbG9jayhzaXplX3Qgb2Zmc2V0Xywgc2l6ZV90IHNpemVfKSBjb25zdCB7CisgICAgQzJMaW5lYXJSYW5nZSBzdWJSYW5nZSgqbUltcGwsIG9mZnNldF8sIHNpemVfKTsKKyAgICByZXR1cm4gQzJDb25zdExpbmVhckJsb2NrKG1JbXBsLCBzdWJSYW5nZSwgbUZlbmNlKTsKK30KKworLyoqCisgKiBMaW5lYXIgYmxvY2sgaW1wbGVtZW50YXRpb24uCisgKi8KK0MyTGluZWFyQmxvY2s6OkMyTGluZWFyQmxvY2soc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICZyYW5nZSkKKyAgICA6IEMyQmxvY2sxRChpbXBsLCByYW5nZSkgeyB9CisKK0MyQWNxdWlyYWJsZTxDMldyaXRlVmlldz4gQzJMaW5lYXJCbG9jazo6bWFwKCkgeworICAgIHZvaWQgKmJhc2UgPSBudWxscHRyOworICAgIHVpbnQzMl90IGxlbiA9IHNpemUoKTsKKyAgICBjMl9zdGF0dXNfdCBlcnJvciA9IG1JbXBsLT5nZXRBbGxvY2F0aW9uKCktPm1hcCgKKyAgICAgICAgICAgIG9mZnNldCgpLCBsZW4sIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LCBudWxscHRyLCAmYmFzZSk7CisgICAgLy8gVE9ETzogd2FpdCBvbiBmZW5jZQorICAgIGlmIChlcnJvciA9PSBDMl9PSykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8V3JpdGVWaWV3QnVkZHk6OkltcGw+IHJ2aSA9IHN0ZDo6c2hhcmVkX3B0cjxXcml0ZVZpZXdCdWRkeTo6SW1wbD4oCisgICAgICAgICAgICAgICAgbmV3IFdyaXRlVmlld0J1ZGR5OjpJbXBsKCptSW1wbCwgKHVpbnQ4X3QgKiliYXNlLCAwLCBsZW4pLAorICAgICAgICAgICAgICAgIFtiYXNlLCBsZW5dKFdyaXRlVmlld0J1ZGR5OjpJbXBsICppKSB7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKWktPmdldEFsbG9jYXRpb24oKS0+dW5tYXAoYmFzZSwgbGVuLCBudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGk7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gQWNxdWlyYWJsZVdyaXRlVmlld0J1ZGR5KGVycm9yLCBDMkZlbmNlKCksIFdyaXRlVmlld0J1ZGR5KHJ2aSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBBY3F1aXJhYmxlV3JpdGVWaWV3QnVkZHkoZXJyb3IsIEMyRmVuY2UoKSwgV3JpdGVWaWV3QnVkZHkoZXJyb3IpKTsKKyAgICB9Cit9CisKK0MyQ29uc3RMaW5lYXJCbG9jayBDMkxpbmVhckJsb2NrOjpzaGFyZShzaXplX3Qgb2Zmc2V0Xywgc2l6ZV90IHNpemVfLCBDMkZlbmNlIGZlbmNlKSB7CisgICAgcmV0dXJuIENvbnN0TGluZWFyQmxvY2tCdWRkeShtSW1wbCwgQzJMaW5lYXJSYW5nZSgqdGhpcywgb2Zmc2V0Xywgc2l6ZV8pLCBmZW5jZSk7Cit9CisKK0MyQmFzaWNMaW5lYXJCbG9ja1Bvb2w6OkMyQmFzaWNMaW5lYXJCbG9ja1Bvb2woCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jYXRvcikKKyAgOiBtQWxsb2NhdG9yKGFsbG9jYXRvcikgeyB9CisKK2MyX3N0YXR1c190IEMyQmFzaWNMaW5lYXJCbG9ja1Bvb2w6OmZldGNoTGluZWFyQmxvY2soCisgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LAorICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICBibG9jay0+cmVzZXQoKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+IGFsbG9jOworICAgIGMyX3N0YXR1c190IGVyciA9IG1BbGxvY2F0b3ItPm5ld0xpbmVhckFsbG9jYXRpb24oY2FwYWNpdHksIHVzYWdlLCAmYWxsb2MpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICAqYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUxpbmVhckJsb2NrKGFsbG9jKTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RydWN0IEMyX0hJREUgQzJQb29sZWRCbG9ja1Bvb2xEYXRhIDogX0MyQmxvY2tQb29sRGF0YSB7CisKKyAgICB2aXJ0dWFsIHR5cGVfdCBnZXRUeXBlKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gVFlQRV9CVUZGRVJQT09MOworICAgIH0KKworICAgIHZvaWQgZ2V0QnVmZmVyUG9vbERhdGEoc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqZGF0YSkgY29uc3QgeworICAgICAgICAqZGF0YSA9IG1EYXRhOworICAgIH0KKworICAgIEMyUG9vbGVkQmxvY2tQb29sRGF0YShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZkYXRhKSA6IG1EYXRhKGRhdGEpIHt9CisKKyAgICB2aXJ0dWFsIH5DMlBvb2xlZEJsb2NrUG9vbERhdGEoKSBvdmVycmlkZSB7fQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gbURhdGE7Cit9OworCitib29sIF9DMkJsb2NrRmFjdG9yeTo6R2V0QnVmZmVyUG9vbERhdGEoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBfQzJCbG9ja1Bvb2xEYXRhPiAmZGF0YSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyUG9vbERhdGEpIHsKKyAgICBpZiAoZGF0YSAmJiBkYXRhLT5nZXRUeXBlKCkgPT0gX0MyQmxvY2tQb29sRGF0YTo6VFlQRV9CVUZGRVJQT09MKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlBvb2xlZEJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Y29uc3QgQzJQb29sZWRCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICAgICAgcG9vbERhdGEtPmdldEJ1ZmZlclBvb2xEYXRhKGJ1ZmZlclBvb2xEYXRhKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlTGluZWFyQmxvY2soCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+ICZkYXRhLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrMUQ6OkltcGw+IGltcGwgPQorICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyQmxvY2sxRDo6SW1wbD4oYWxsb2MsIGRhdGEsIG9mZnNldCwgc2l6ZSk7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPihuZXcgQzJMaW5lYXJCbG9jayhpbXBsLCAqaW1wbCkpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gX0MyQmxvY2tGYWN0b3J5OjpHZXRMaW5lYXJCbG9ja1Bvb2xEYXRhKAorICAgICAgICBjb25zdCBDMkJsb2NrMUQgJmJsb2NrKSB7CisgICAgaWYgKGJsb2NrLm1JbXBsKSB7CisgICAgICAgIHJldHVybiBibG9jay5tSW1wbC0+cG9vbERhdGEoKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUxpbmVhckJsb2NrKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKSB7CisgICAgLy8gVE9ETzogZ2V0IHByb3BlciBhbGxvY2F0b3I/IGFuZCBtdXRleD8KKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyQWxsb2NhdG9ySW9uPiBzQWxsb2NhdG9yID0gc3RkOjptYWtlX3VuaXF1ZTxDMkFsbG9jYXRvcklvbj4oMCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICBpZiAoQzJBbGxvY2F0b3JJb246OmlzVmFsaWQoaGFuZGxlKSkgeworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBzQWxsb2NhdG9yLT5wcmlvckxpbmVhckFsbG9jYXRpb24oaGFuZGxlLCAmYWxsb2MpOworICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUxpbmVhckJsb2NrKGFsbG9jKTsKKyAgICAgICAgICAgIHJldHVybiBibG9jazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlTGluZWFyQmxvY2soCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpjSGFuZGxlLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZkYXRhKSB7CisgICAgLy8gVE9ETzogZ2V0IHByb3BlciBhbGxvY2F0b3I/IGFuZCBtdXRleD8KKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyQWxsb2NhdG9ySW9uPiBzQWxsb2NhdG9yID0gc3RkOjptYWtlX3VuaXF1ZTxDMkFsbG9jYXRvcklvbj4oMCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICBpZiAoQzJBbGxvY2F0b3JJb246OmlzVmFsaWQoY0hhbmRsZSkpIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2Nsb25lKGNIYW5kbGUpOworICAgICAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBzQWxsb2NhdG9yLT5wcmlvckxpbmVhckFsbG9jYXRpb24oaGFuZGxlLCAmYWxsb2MpOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUG9vbGVkQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sRGF0YT4oZGF0YSk7CisgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LICYmIHBvb2xEYXRhKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogY29uZmlnIHBhcmFtcz8KKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2sgPQorICAgICAgICAgICAgICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jayhhbGxvYywgcG9vbERhdGEpOworICAgICAgICAgICAgICAgIHJldHVybiBibG9jazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK307CisKKy8qKgorICogV3JhcHBlZCBDMkFsbG9jYXRvciB3aGljaCBpcyBpbmplY3RlZCB0byBidWZmZXIgcG9vbCBvbiBiZWhhbGYgb2YKKyAqIEMyQmxvY2tQb29sLgorICovCitjbGFzcyBfQzJCdWZmZXJQb29sQWxsb2NhdG9yIDogcHVibGljIEJ1ZmZlclBvb2xBbGxvY2F0b3IgeworcHVibGljOgorICAgIF9DMkJ1ZmZlclBvb2xBbGxvY2F0b3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yKQorICAgICAgICA6IG1BbGxvY2F0b3IoYWxsb2NhdG9yKSB7fQorCisgICAgfl9DMkJ1ZmZlclBvb2xBbGxvY2F0b3IoKSBvdmVycmlkZSB7fQorCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gKmFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmFsbG9jU2l6ZSkgb3ZlcnJpZGU7CisKKyAgICBib29sIGNvbXBhdGlibGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm5ld1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm9sZFBhcmFtcykgb3ZlcnJpZGU7CisKKyAgICAvLyBNZXRob2RzIGZvciBjb2RlYzIgY29tcG9uZW50IChDMkJsb2NrUG9vbCkuCisgICAgLyoqCisgICAgICogVHJhbnNmb3JtcyBsaW5lYXIgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzIGZvciBDMkFsbG9jYXRvciB0byBwYXJhbWV0ZXJzCisgICAgICogZm9yIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGNhcGFjaXR5ICAgICAgc2l6ZSBvZiBsaW5lYXIgYWxsb2NhdGlvbgorICAgICAqIEBwYXJhbSB1c2FnZSAgICAgICAgIG1lbW9yeSB1c2FnZSBwYXR0ZXJuIGZvciBsaW5lYXIgYWxsb2NhdGlvbgorICAgICAqIEBwYXJhbSBwYXJhbXMgICAgICAgIGFsbG9jYXRpb24gcGFyYW1ldGVycyBmb3IgYnVmZmVyIHBvb2wKKyAgICAgKi8KKyAgICB2b2lkIGdldExpbmVhclBhcmFtcyh1aW50MzJfdCBjYXBhY2l0eSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcGFyYW1zKTsKKworICAgIC8qKgorICAgICAqIFRyYW5zZm9ybXMgZ3JhcGhpYyBhbGxvY2F0aW9uIHBhcmFtZXRlcnMgZm9yIEMyQWxsb2NhdG9yIHRvIHBhcmFtZXRlcnMKKyAgICAgKiBmb3IgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gd2lkdGggICAgICAgICB3aWR0aCBvZiBncmFwaGljIGFsbG9jYXRpb24KKyAgICAgKiBAcGFyYW0gaGVpZ2h0ICAgICAgICBoZWlnaHQgb2YgZ3JhcGhpYyBhbGxvY2F0aW9uCisgICAgICogQHBhcmFtIGZvcm1hdCAgICAgICAgY29sb3IgZm9ybWF0IG9mIGdyYXBoaWMgYWxsb2NhdGlvbgorICAgICAqIEBwYXJhbSBwYXJhbXMgICAgICAgIGFsbG9jYXRpb24gcGFyYW1ldGVyIGZvciBidWZmZXIgcG9vbAorICAgICAqLworICAgIHZvaWQgZ2V0R3JhcGhpY1BhcmFtcyh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3JtYXQsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpwYXJhbXMpOworCisgICAgLyoqCisgICAgICogVHJhbnNmb3JtcyBhbiBleGlzdGluZyBuYXRpdmUgaGFuZGxlIHRvIGFuIEMyTGluZWFyQWxsY2F0aW9uLgorICAgICAqIFdyYXBwZXIgdG8gQzJBbGxvY2F0b3IjcHJpb3JMaW5lYXJBbGxvY2F0aW9uCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgcHJpb3JMaW5lYXJBbGxvY2F0aW9uKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICpjMkFsbG9jYXRpb24pOworCisgICAgLyoqCisgICAgICogVHJhbnNmb3JtcyBhbiBleGlzdGluZyBuYXRpdmUgaGFuZGxlIHRvIGFuIEMyR3JhcGhpY0FsbGNhdGlvbi4KKyAgICAgKiBXcmFwcGVyIHRvIEMyQWxsb2NhdG9yI3ByaW9yR3JhcGhpY0FsbG9jYXRpb24KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBwcmlvckdyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYzJBbGxvY2F0aW9uKTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgY29uc3RleHByIGludCBrTWF4SW50UGFyYW1zID0gNTsgLy8gbGFyZ2UgZW5vdWdoIG51bWJlcjsKKworICAgIGVudW0gQWxsb2NUeXBlIDogdWludDhfdCB7CisgICAgICAgIEFMTE9DX05PTkUgPSAwLAorCisgICAgICAgIEFMTE9DX0xJTkVBUiwKKyAgICAgICAgQUxMT0NfR1JBUEhJQywKKyAgICB9OworCisgICAgdW5pb24gQWxsb2NQYXJhbXMgeworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgQWxsb2NUeXBlIGFsbG9jVHlwZTsKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2U7CisgICAgICAgICAgICB1aW50MzJfdCBwYXJhbXNba01heEludFBhcmFtc107CisgICAgICAgIH0gZGF0YTsKKyAgICAgICAgdWludDhfdCBhcnJheVswXTsKKworICAgICAgICBBbGxvY1BhcmFtcygpIDogZGF0YXtBTExPQ19OT05FLCB7MCwgMH0sIHswfX0ge30KKyAgICAgICAgQWxsb2NQYXJhbXMoQzJNZW1vcnlVc2FnZSB1c2FnZSwgdWludDMyX3QgY2FwYWNpdHkpCisgICAgICAgICAgICA6IGRhdGF7QUxMT0NfTElORUFSLCB1c2FnZSwge1swXSA9IGNhcGFjaXR5fX0ge30KKyAgICAgICAgQWxsb2NQYXJhbXMoCisgICAgICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQpCisgICAgICAgICAgICAgICAgOiBkYXRhe0FMTE9DX0dSQVBISUMsIHVzYWdlLCB7d2lkdGgsIGhlaWdodCwgZm9ybWF0fX0ge30KKyAgICB9OworCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworfTsKKworc3RydWN0IExpbmVhckFsbG9jYXRpb25EdG9yIHsKKyAgICBMaW5lYXJBbGxvY2F0aW9uRHRvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAmYWxsb2MpCisgICAgICAgIDogbUFsbG9jYXRpb24oYWxsb2MpIHt9CisKKyAgICB2b2lkIG9wZXJhdG9yKCkoQnVmZmVyUG9vbEFsbG9jYXRpb24gKnBvb2xBbGxvYykgeyBkZWxldGUgcG9vbEFsbG9jOyB9CisKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBtQWxsb2NhdGlvbjsKK307CisKK3N0cnVjdCBHcmFwaGljQWxsb2NhdGlvbkR0b3IgeworICAgIEdyYXBoaWNBbGxvY2F0aW9uRHRvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gJmFsbG9jKQorICAgICAgICA6IG1BbGxvY2F0aW9uKGFsbG9jKSB7fQorCisgICAgdm9pZCBvcGVyYXRvcigpKEJ1ZmZlclBvb2xBbGxvY2F0aW9uICpwb29sQWxsb2MpIHsgZGVsZXRlIHBvb2xBbGxvYzsgfQorCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IG1BbGxvY2F0aW9uOworfTsKKworUmVzdWx0U3RhdHVzIF9DMkJ1ZmZlclBvb2xBbGxvY2F0b3I6OmFsbG9jYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAgJnBhcmFtcywKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAqYWxsb2MsCisgICAgICAgIHNpemVfdCAqYWxsb2NTaXplKSB7CisgICAgQWxsb2NQYXJhbXMgYzJQYXJhbXM7CisgICAgbWVtY3B5KCZjMlBhcmFtcywgcGFyYW1zLmRhdGEoKSwgc3RkOjptaW4oc2l6ZW9mKEFsbG9jUGFyYW1zKSwgcGFyYW1zLnNpemUoKSkpOworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IEMyX0JBRF9WQUxVRTsKKyAgICBzd2l0Y2goYzJQYXJhbXMuZGF0YS5hbGxvY1R5cGUpIHsKKyAgICAgICAgY2FzZSBBTExPQ19OT05FOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQUxMT0NfTElORUFSOiB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBjMkxpbmVhcjsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1BbGxvY2F0b3ItPm5ld0xpbmVhckFsbG9jYXRpb24oCisgICAgICAgICAgICAgICAgICAgIGMyUGFyYW1zLmRhdGEucGFyYW1zWzBdLCBjMlBhcmFtcy5kYXRhLnVzYWdlLCAmYzJMaW5lYXIpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBDMl9PSyAmJiBjMkxpbmVhcikgeworICAgICAgICAgICAgICAgIEJ1ZmZlclBvb2xBbGxvY2F0aW9uICpwdHIgPSBuZXcgQnVmZmVyUG9vbEFsbG9jYXRpb24oYzJMaW5lYXItPmhhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAocHRyKSB7CisgICAgICAgICAgICAgICAgICAgICphbGxvYyA9IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyLCBMaW5lYXJBbGxvY2F0aW9uRHRvcihjMkxpbmVhcikpOworICAgICAgICAgICAgICAgICAgICBpZiAoKmFsbG9jKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqYWxsb2NTaXplID0gKHNpemVfdCljMlBhcmFtcy5kYXRhLnBhcmFtc1swXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwdHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQUxMT0NfR1JBUEhJQzogeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IGMyR3JhcGhpYzsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1BbGxvY2F0b3ItPm5ld0dyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICAgICAgICAgICAgICBjMlBhcmFtcy5kYXRhLnBhcmFtc1swXSwKKyAgICAgICAgICAgICAgICAgICAgYzJQYXJhbXMuZGF0YS5wYXJhbXNbMV0sCisgICAgICAgICAgICAgICAgICAgIGMyUGFyYW1zLmRhdGEucGFyYW1zWzJdLAorICAgICAgICAgICAgICAgICAgICBjMlBhcmFtcy5kYXRhLnVzYWdlLCAmYzJHcmFwaGljKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQzJfT0sgJiYgYzJHcmFwaGljKSB7CisgICAgICAgICAgICAgICAgQnVmZmVyUG9vbEFsbG9jYXRpb24gKnB0ciA9IG5ldyBCdWZmZXJQb29sQWxsb2NhdGlvbihjMkdyYXBoaWMtPmhhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAocHRyKSB7CisgICAgICAgICAgICAgICAgICAgICphbGxvYyA9IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyLCBHcmFwaGljQWxsb2NhdGlvbkR0b3IoYzJHcmFwaGljKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgqYWxsb2MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICphbGxvY1NpemUgPSBjMlBhcmFtcy5kYXRhLnBhcmFtc1swXSAqIGMyUGFyYW1zLmRhdGEucGFyYW1zWzFdOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHB0cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworYm9vbCBfQzJCdWZmZXJQb29sQWxsb2NhdG9yOjpjb21wYXRpYmxlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAgJm5ld1BhcmFtcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gICZvbGRQYXJhbXMpIHsKKyAgICBBbGxvY1BhcmFtcyBuZXdBbGxvYzsKKyAgICBBbGxvY1BhcmFtcyBvbGRBbGxvYzsKKyAgICBtZW1jcHkoJm5ld0FsbG9jLCBuZXdQYXJhbXMuZGF0YSgpLCBzdGQ6Om1pbihzaXplb2YoQWxsb2NQYXJhbXMpLCBuZXdQYXJhbXMuc2l6ZSgpKSk7CisgICAgbWVtY3B5KCZvbGRBbGxvYywgb2xkUGFyYW1zLmRhdGEoKSwgc3RkOjptaW4oc2l6ZW9mKEFsbG9jUGFyYW1zKSwgb2xkUGFyYW1zLnNpemUoKSkpOworCisgICAgLy8gVE9ETzogc3VwcG9ydCBub3QgZXhhY3QgbWF0Y2hpbmcuIGUuZykgbmV3Q2FwYWNpdHkgPCBvbGRDYXBhY2l0eQorICAgIGlmIChuZXdBbGxvYy5kYXRhLmFsbG9jVHlwZSA9PSBvbGRBbGxvYy5kYXRhLmFsbG9jVHlwZSAmJgorICAgICAgICAgICAgbmV3QWxsb2MuZGF0YS51c2FnZS5leHBlY3RlZCA9PSBvbGRBbGxvYy5kYXRhLnVzYWdlLmV4cGVjdGVkKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga01heEludFBhcmFtczsgKytpKSB7CisgICAgICAgICAgICBpZiAobmV3QWxsb2MuZGF0YS5wYXJhbXNbaV0gIT0gb2xkQWxsb2MuZGF0YS5wYXJhbXNbaV0pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBfQzJCdWZmZXJQb29sQWxsb2NhdG9yOjpnZXRMaW5lYXJQYXJhbXMoCisgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LCBDMk1lbW9yeVVzYWdlIHVzYWdlLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcGFyYW1zKSB7CisgICAgQWxsb2NQYXJhbXMgYzJQYXJhbXModXNhZ2UsIGNhcGFjaXR5KTsKKyAgICBwYXJhbXMtPmFzc2lnbihjMlBhcmFtcy5hcnJheSwgYzJQYXJhbXMuYXJyYXkgKyBzaXplb2YoQWxsb2NQYXJhbXMpKTsKK30KKwordm9pZCBfQzJCdWZmZXJQb29sQWxsb2NhdG9yOjpnZXRHcmFwaGljUGFyYW1zKAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpwYXJhbXMpIHsKKyAgICBBbGxvY1BhcmFtcyBjMlBhcmFtcyh1c2FnZSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0KTsKKyAgICBwYXJhbXMtPmFzc2lnbihjMlBhcmFtcy5hcnJheSwgYzJQYXJhbXMuYXJyYXkgKyBzaXplb2YoQWxsb2NQYXJhbXMpKTsKK30KKworYzJfc3RhdHVzX3QgX0MyQnVmZmVyUG9vbEFsbG9jYXRvcjo6cHJpb3JMaW5lYXJBbGxvY2F0aW9uKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAqYzJBbGxvY2F0aW9uKSB7CisgICAgcmV0dXJuIG1BbGxvY2F0b3ItPnByaW9yTGluZWFyQWxsb2NhdGlvbihoYW5kbGUsIGMyQWxsb2NhdGlvbik7Cit9CisKK2MyX3N0YXR1c190IF9DMkJ1ZmZlclBvb2xBbGxvY2F0b3I6OnByaW9yR3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYzJBbGxvY2F0aW9uKSB7CisgICAgcmV0dXJuIG1BbGxvY2F0b3ItPnByaW9yR3JhcGhpY0FsbG9jYXRpb24oaGFuZGxlLCBjMkFsbG9jYXRpb24pOworfQorCitjbGFzcyBDMlBvb2xlZEJsb2NrUG9vbDo6SW1wbCB7CitwdWJsaWM6CisgICAgSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IpCisgICAgICAgICAgICA6IG1Jbml0KEMyX09LKSwKKyAgICAgICAgICAgICAgbUJ1ZmZlclBvb2xNYW5hZ2VyKENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCkpLAorICAgICAgICAgICAgICBtQWxsb2NhdG9yKHN0ZDo6bWFrZV9zaGFyZWQ8X0MyQnVmZmVyUG9vbEFsbG9jYXRvcj4oYWxsb2NhdG9yKSkgeworICAgICAgICBpZiAobUFsbG9jYXRvciAmJiBtQnVmZmVyUG9vbE1hbmFnZXIpIHsKKyAgICAgICAgICAgIGlmIChtQnVmZmVyUG9vbE1hbmFnZXItPmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgbUFsbG9jYXRvciwgJm1Db25uZWN0aW9uSWQpID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUluaXQgPSBDMl9OT19JTklUOworICAgIH0KKworICAgIH5JbXBsKCkgeworICAgICAgICBpZiAobUluaXQgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIG1CdWZmZXJQb29sTWFuYWdlci0+Y2xvc2UobUNvbm5lY3Rpb25JZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBmZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHksIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgYmxvY2stPnJlc2V0KCk7CisgICAgICAgIGlmIChtSW5pdCAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIG1Jbml0OworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHBhcmFtczsKKyAgICAgICAgbUFsbG9jYXRvci0+Z2V0TGluZWFyUGFyYW1zKGNhcGFjaXR5LCB1c2FnZSwgJnBhcmFtcyk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gYnVmZmVyUG9vbERhdGE7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqY0hhbmRsZSA9IG51bGxwdHI7CisgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtQnVmZmVyUG9vbE1hbmFnZXItPmFsbG9jYXRlKAorICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIHBhcmFtcywgJmNIYW5kbGUsICZidWZmZXJQb29sRGF0YSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2Nsb25lKGNIYW5kbGUpOworICAgICAgICAgICAgaWYgKGhhbmRsZSkgeworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+IGFsbG9jOworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvb2xlZEJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2xEYXRhPihidWZmZXJQb29sRGF0YSk7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jYXRvci0+cHJpb3JMaW5lYXJBbGxvY2F0aW9uKGhhbmRsZSwgJmFsbG9jKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LICYmIHBvb2xEYXRhICYmIGFsbG9jKSB7CisgICAgICAgICAgICAgICAgICAgICpibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlTGluZWFyQmxvY2soYWxsb2MsIHBvb2xEYXRhLCAwLCBjYXBhY2l0eSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgqYmxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWSkgeworICAgICAgICAgICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIGMyX3N0YXR1c190IGZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrKSB7CisgICAgICAgIGJsb2NrLT5yZXNldCgpOworICAgICAgICBpZiAobUluaXQgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYXJhbXM7CisgICAgICAgIG1BbGxvY2F0b3ItPmdldEdyYXBoaWNQYXJhbXMod2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJnBhcmFtcyk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gYnVmZmVyUG9vbERhdGE7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqY0hhbmRsZSA9IG51bGxwdHI7CisgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtQnVmZmVyUG9vbE1hbmFnZXItPmFsbG9jYXRlKAorICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIHBhcmFtcywgJmNIYW5kbGUsICZidWZmZXJQb29sRGF0YSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2Nsb25lKGNIYW5kbGUpOworICAgICAgICAgICAgaWYgKGhhbmRsZSkgeworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb29sZWRCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2xEYXRhPihidWZmZXJQb29sRGF0YSk7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jYXRvci0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZSwgJmFsbG9jKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LICYmIHBvb2xEYXRhICYmIGFsbG9jKSB7CisgICAgICAgICAgICAgICAgICAgICpibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jLCBwb29sRGF0YSwgQzJSZWN0KHdpZHRoLCBoZWlnaHQpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpibG9jaykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgQ29ubmVjdGlvbklkIGdldENvbm5lY3Rpb25JZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0ICE9IEMyX09LID8gSU5WQUxJRF9DT05ORUNUSU9OSUQgOiBtQ29ubmVjdGlvbklkOworICAgIH0KKworcHJpdmF0ZToKKyAgICBjMl9zdGF0dXNfdCBtSW5pdDsKKyAgICBjb25zdCBhbmRyb2lkOjpzcDxDbGllbnRNYW5hZ2VyPiBtQnVmZmVyUG9vbE1hbmFnZXI7CisgICAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7IC8vIGxvY2FsbHkKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQnVmZmVyUG9vbEFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKK307CisKK0MyUG9vbGVkQmxvY2tQb29sOjpDMlBvb2xlZEJsb2NrUG9vbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yLCBjb25zdCBsb2NhbF9pZF90IGxvY2FsSWQpCisgICAgICAgIDogbUFsbG9jYXRvcihhbGxvY2F0b3IpLCBtTG9jYWxJZChsb2NhbElkKSwgbUltcGwobmV3IEltcGwoYWxsb2NhdG9yKSkge30KKworQzJQb29sZWRCbG9ja1Bvb2w6On5DMlBvb2xlZEJsb2NrUG9vbCgpIHsKK30KKworYzJfc3RhdHVzX3QgQzJQb29sZWRCbG9ja1Bvb2w6OmZldGNoTGluZWFyQmxvY2soCisgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LAorICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5mZXRjaExpbmVhckJsb2NrKGNhcGFjaXR5LCB1c2FnZSwgYmxvY2spOworICAgIH0KKyAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlBvb2xlZEJsb2NrUG9vbDo6ZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAqYmxvY2spIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5mZXRjaEdyYXBoaWNCbG9jayh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCBibG9jayk7CisgICAgfQorICAgIHJldHVybiBDMl9DT1JSVVBURUQ7Cit9CisKK2ludDY0X3QgQzJQb29sZWRCbG9ja1Bvb2w6OmdldENvbm5lY3Rpb25JZCgpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5nZXRDb25uZWN0aW9uSWQoKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAyRCBCTE9DSyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIEltcGxlbWVudGF0aW9uIHRoYXQgaXMgc2hhcmVkIGJldHdlZW4gYWxsIDJEIGJsb2NrcyBhbmQgdmlld3MuCisgKgorICogRm9yIGJsb2NrcycgSW1wbCdzIGNyb3AgaXMgYWx3YXlzIHRoZSBhbGxvdHRlZCBjcm9wLCBldmVuIGlmIGl0IGlzIGEgc3ViIGJsb2NrLgorICoKKyAqIEZvciB2aWV3cycgSW1wbCdzIGNyb3AgaXMgdGhlIG1hcHBlZCBwb3J0aW9uIC0gd2hpY2ggZm9yIG5vdyBpcyBhbHdheXMgdGhlCisgKiBhbGxvdHRlZCBjcm9wLgorICovCitjbGFzcyBDMl9ISURFIF9DMkJsb2NrMkRJbXBsIDogcHVibGljIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgeworcHVibGljOgorICAgIC8qKgorICAgICAqIEltcGwncyBjcm9wIGlzIGFsd2F5cyB0aGUgb3IgcGFydCBvZiB0aGUgYWxsb3R0ZWQgY3JvcCBvZiB0aGUgYWxsb2NhdGlvbi4KKyAgICAgKi8KKyAgICBfQzJCbG9jazJESW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+ICZwb29sRGF0YSA9IG51bGxwdHIsCisgICAgICAgICAgICBjb25zdCBDMlJlY3QgJmFsbG90dGVkQ3JvcCA9IEMyUmVjdCh+MHUsIH4wdSkpCisgICAgICAgIDogX0MyUGxhbmFyU2VjdGlvbkFzcGVjdChhbGxvYy5nZXQoKSwgYWxsb3R0ZWRDcm9wKSwKKyAgICAgICAgICBtQWxsb2NhdGlvbihhbGxvYyksCisgICAgICAgICAgbVBvb2xEYXRhKHBvb2xEYXRhKSB7IH0KKworICAgIHZpcnR1YWwgfl9DMkJsb2NrMkRJbXBsKCkgPSBkZWZhdWx0OworCisgICAgLyoqIHJldHVybnMgcG9vbCBkYXRhICAqLworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Qb29sRGF0YTsKKyAgICB9CisKKyAgICAvKiogcmV0dXJucyBuYXRpdmUgaGFuZGxlICovCisgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uID8gbUFsbG9jYXRpb24tPmhhbmRsZSgpIDogbnVsbHB0cjsKKyAgICB9CisKKyAgICAvKiogcmV0dXJucyB0aGUgYWxsb2NhdG9yJ3MgSUQgKi8KKyAgICBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IHsKKyAgICAgICAgLy8gQkFEX0lEIGNhbiBvbmx5IGhhcHBlbiBpZiB0aGlzIEltcGwgY2xhc3MgaXMgaW5pdGlhbGl6ZWQgZm9yIGEgdmlldyAtIG5ldmVyIGZvciBhIGJsb2NrLgorICAgICAgICByZXR1cm4gbUFsbG9jYXRpb24gPyBtQWxsb2NhdGlvbi0+Z2V0QWxsb2NhdG9ySWQoKSA6IEMyQWxsb2NhdG9yOjpCQURfSUQ7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IGdldEFsbG9jYXRpb24oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdGlvbjsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IG1BbGxvY2F0aW9uOworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBtUG9vbERhdGE7Cit9OworCitjbGFzcyBDMl9ISURFIF9DMk1hcHBpbmdCbG9jazJESW1wbAorICAgIDogcHVibGljIF9DMkJsb2NrMkRJbXBsLCBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxfQzJNYXBwaW5nQmxvY2syREltcGw+IHsKK3B1YmxpYzoKKyAgICB1c2luZyBfQzJCbG9jazJESW1wbDo6X0MyQmxvY2syREltcGw7CisKKyAgICB2aXJ0dWFsIH5fQzJNYXBwaW5nQmxvY2syREltcGwoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHRoZSBtYXBwZWQgZGF0YSBwb2ludGVyLCBhbmQgdGhlIHBvdGVudGlhbCBlcnJvci4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgTWFwcGVkIHsKKyAgICBwcml2YXRlOgorICAgICAgICBmcmllbmQgY2xhc3MgX0MyTWFwcGluZ0Jsb2NrMkRJbXBsOworCisgICAgICAgIE1hcHBlZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2syREltcGw+ICZpbXBsLCBib29sIHdyaXRhYmxlLCBDMkZlbmNlICpmZW5jZSBfX3VudXNlZCkKKyAgICAgICAgICAgIDogbUltcGwoaW1wbCksIG1Xcml0YWJsZSh3cml0YWJsZSkgeworICAgICAgICAgICAgbWVtc2V0KG1EYXRhLCAwLCBzaXplb2YobURhdGEpKTsKKyAgICAgICAgICAgIGNvbnN0IEMyUmVjdCBjcm9wID0gbUltcGwtPmNyb3AoKTsKKyAgICAgICAgICAgIC8vIGdyYWxsb2MgcmVxdWlyZXMgbWFwcGluZyB0aGUgd2hvbGUgcmVnaW9uIG9mIGludGVyZXN0IGFzIHdlIGNhbm5vdAorICAgICAgICAgICAgLy8gbWFwIG11bHRpcGxlIHJlZ2lvbnMKKyAgICAgICAgICAgIG1FcnJvciA9IG1JbXBsLT5nZXRBbGxvY2F0aW9uKCktPm1hcCgKKyAgICAgICAgICAgICAgICAgICAgY3JvcCwKKyAgICAgICAgICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgd3JpdGFibGUgPyBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgOiAwIH0sCisgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICZtTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICBtRGF0YSk7CisgICAgICAgICAgICBpZiAobUVycm9yICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgbWVtc2V0KCZtTGF5b3V0LCAwLCBzaXplb2YobUxheW91dCkpOworICAgICAgICAgICAgICAgIG1lbXNldChtRGF0YSwgMCwgc2l6ZW9mKG1EYXRhKSk7CisgICAgICAgICAgICAgICAgbWVtc2V0KG1PZmZzZXREYXRhLCAwLCBzaXplb2YobURhdGEpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogdmFsaWRhdGUgcGxhbmUgbGF5b3V0IGFuZAorICAgICAgICAgICAgICAgIC8vIGFkanVzdCBkYXRhIHBvaW50ZXJzIHRvIHRoZSBjcm9wIHJlZ2lvbidzIHRvcCBsZWZ0IGNvcm5lci4KKyAgICAgICAgICAgICAgICAvLyBmYWlsIGlmIGl0IGlzIG5vdCBvbiBhIHN1YnNhbXBsaW5nIGJvdW5kYXJ5CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgcGxhbmVJeCA9IDA7IHBsYW5lSXggPCBtTGF5b3V0Lm51bVBsYW5lczsgKytwbGFuZUl4KSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNvbFNhbXBsaW5nID0gbUxheW91dC5wbGFuZXNbcGxhbmVJeF0uY29sU2FtcGxpbmc7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHJvd1NhbXBsaW5nID0gbUxheW91dC5wbGFuZXNbcGxhbmVJeF0ucm93U2FtcGxpbmc7CisgICAgICAgICAgICAgICAgICAgIGlmIChjcm9wLmxlZnQgJSBjb2xTYW1wbGluZyB8fCBjcm9wLnJpZ2h0KCkgJSBjb2xTYW1wbGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNyb3AudG9wICUgcm93U2FtcGxpbmcgfHwgY3JvcC5ib3R0b20oKSAlIHJvd1NhbXBsaW5nKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYW5ub3QgY2FsY3VsYXRlIGRhdGEgcG9pbnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgbUltcGwtPmdldEFsbG9jYXRpb24oKS0+dW5tYXAobURhdGEsIGNyb3AsIG51bGxwdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KCZtTGF5b3V0LCAwLCBzaXplb2YobUxheW91dCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KG1EYXRhLCAwLCBzaXplb2YobURhdGEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChtT2Zmc2V0RGF0YSwgMCwgc2l6ZW9mKG1EYXRhKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRXJyb3IgPSBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbU9mZnNldERhdGFbcGxhbmVJeF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgbURhdGFbcGxhbmVJeF0gKyAoc3NpemVfdCljcm9wLmxlZnQgKiBtTGF5b3V0LnBsYW5lc1twbGFuZUl4XS5jb2xJbmMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoc3NpemVfdCljcm9wLnRvcCAqIG1MYXlvdXQucGxhbmVzW3BsYW5lSXhdLnJvd0luYzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBleHBsaWNpdCBNYXBwZWQoYzJfc3RhdHVzX3QgZXJyb3IpCisgICAgICAgICAgICA6IG1JbXBsKG51bGxwdHIpLCBtV3JpdGFibGUoZmFsc2UpLCBtRXJyb3IoZXJyb3IpIHsKKyAgICAgICAgICAgIC8vIENIRUNLKGVycm9yICE9IEMyX09LKTsKKyAgICAgICAgICAgIG1lbXNldCgmbUxheW91dCwgMCwgc2l6ZW9mKG1MYXlvdXQpKTsKKyAgICAgICAgICAgIG1lbXNldChtRGF0YSwgMCwgc2l6ZW9mKG1EYXRhKSk7CisgICAgICAgICAgICBtZW1zZXQobU9mZnNldERhdGEsIDAsIHNpemVvZihtRGF0YSkpOworICAgICAgICB9CisKKyAgICBwdWJsaWM6CisgICAgICAgIH5NYXBwZWQoKSB7CisgICAgICAgICAgICBpZiAobURhdGFbMF0gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG1JbXBsLT5nZXRBbGxvY2F0aW9uKCktPnVubWFwKG1EYXRhLCBtSW1wbC0+Y3JvcCgpLCBudWxscHRyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qKiByZXR1cm5zIG1hcHBpbmcgc3RhdHVzICovCisgICAgICAgIGMyX3N0YXR1c190IGVycm9yKCkgY29uc3QgeyByZXR1cm4gbUVycm9yOyB9CisKKyAgICAgICAgLyoqIHJldHVybnMgZGF0YSBwb2ludGVyICovCisgICAgICAgIHVpbnQ4X3QgKmNvbnN0ICpkYXRhKCkgY29uc3QgeyByZXR1cm4gbU9mZnNldERhdGE7IH0KKworICAgICAgICAvKiogcmV0dXJucyB0aGUgcGxhbmUgbGF5b3V0ICovCisgICAgICAgIEMyUGxhbmFyTGF5b3V0IGxheW91dCgpIGNvbnN0IHsgcmV0dXJuIG1MYXlvdXQ7IH0KKworICAgICAgICAvKiogcmV0dXJucyB3aGV0aGVyIHRoZSBtYXBwaW5nIGlzIHdyaXRhYmxlICovCisgICAgICAgIGJvb2wgd3JpdGFibGUoKSBjb25zdCB7IHJldHVybiBtV3JpdGFibGU7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9jazJESW1wbD4gbUltcGw7CisgICAgICAgIGJvb2wgbVdyaXRhYmxlOworICAgICAgICBjMl9zdGF0dXNfdCBtRXJyb3I7CisgICAgICAgIHVpbnQ4X3QgKm1EYXRhW0MyUGxhbmFyTGF5b3V0OjpNQVhfTlVNX1BMQU5FU107CisgICAgICAgIHVpbnQ4X3QgKm1PZmZzZXREYXRhW0MyUGxhbmFyTGF5b3V0OjpNQVhfTlVNX1BMQU5FU107CisgICAgICAgIEMyUGxhbmFyTGF5b3V0IG1MYXlvdXQ7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIE1hcHMgdGhlIGFsbG90dGVkIHJlZ2lvbi4KKyAgICAgKgorICAgICAqIElmIGFscmVhZHkgbWFwcGVkIGFuZCBpdCBpcyBjdXJyZW50bHkgaW4gdXNlLCByZXR1cm5zIHRoZSBleGlzdGluZyBtYXBwaW5nLgorICAgICAqIElmIGZlbmNlIGlzIHByb3ZpZGVkLCBhbiBhY3F1aXJlIGZlbmNlIGlzIHN0b3JlZCB0aGVyZS4KKyAgICAgKi8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8TWFwcGVkPiBtYXAoYm9vbCB3cml0YWJsZSwgQzJGZW5jZSAqZmVuY2UpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU1hcHBlZExvY2spOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8TWFwcGVkPiBleGlzdGluZyA9IG1NYXBwZWQubG9jaygpOworICAgICAgICBpZiAoIWV4aXN0aW5nKSB7CisgICAgICAgICAgICBleGlzdGluZyA9IHN0ZDo6c2hhcmVkX3B0cjxNYXBwZWQ+KG5ldyBNYXBwZWQoc2hhcmVkX2Zyb21fdGhpcygpLCB3cml0YWJsZSwgZmVuY2UpKTsKKyAgICAgICAgICAgIG1NYXBwZWQgPSBleGlzdGluZzsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGlmIHdlIG1hcHBlZCB0aGUgcmVnaW9uIHJlYWQtb25seSwgd2UgY2Fubm90IHJlbWFwIGl0IHJlYWQtd3JpdGUKKyAgICAgICAgICAgIGlmICh3cml0YWJsZSAmJiAhZXhpc3RpbmctPndyaXRhYmxlKCkpIHsKKyAgICAgICAgICAgICAgICBleGlzdGluZyA9IHN0ZDo6c2hhcmVkX3B0cjxNYXBwZWQ+KG5ldyBNYXBwZWQoQzJfQ0FOTk9UX0RPKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoZmVuY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICpmZW5jZSA9IEMyRmVuY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXhpc3Rpbmc7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6d2Vha19wdHI8TWFwcGVkPiBtTWFwcGVkOworICAgIHN0ZDo6bXV0ZXggbU1hcHBlZExvY2s7Cit9OworCitjbGFzcyBDMl9ISURFIF9DMk1hcHBlZEJsb2NrMkRJbXBsIDogcHVibGljIF9DMkJsb2NrMkRJbXBsIHsKK3B1YmxpYzoKKyAgICBfQzJNYXBwZWRCbG9jazJESW1wbChjb25zdCBfQzJCbG9jazJESW1wbCAmaW1wbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyTWFwcGluZ0Jsb2NrMkRJbXBsOjpNYXBwZWQ+IG1hcHBpbmcpCisgICAgICAgIDogX0MyQmxvY2syREltcGwoaW1wbCksIG1NYXBwaW5nKG1hcHBpbmcpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5fQzJNYXBwZWRCbG9jazJESW1wbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJNYXBwaW5nQmxvY2syREltcGw6Ok1hcHBlZD4gbWFwcGluZygpIGNvbnN0IHsgcmV0dXJuIG1NYXBwaW5nOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMk1hcHBpbmdCbG9jazJESW1wbDo6TWFwcGVkPiBtTWFwcGluZzsKK307CisKKy8qKgorICogQmxvY2sgaW1wbGVtZW50YXRpb24uCisgKi8KK2NsYXNzIEMyQmxvY2syRDo6SW1wbCA6IHB1YmxpYyBfQzJNYXBwaW5nQmxvY2syREltcGwgeworcHVibGljOgorICAgIHVzaW5nIF9DMk1hcHBpbmdCbG9jazJESW1wbDo6X0MyTWFwcGluZ0Jsb2NrMkRJbXBsOworICAgIHZpcnR1YWwgfkltcGwoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Cit9OworCitjb25zdCBDMkhhbmRsZSAqQzJCbG9jazJEOjpoYW5kbGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5oYW5kbGUoKTsKK30KKworQzJBbGxvY2F0b3I6OmlkX3QgQzJCbG9jazJEOjpnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldEFsbG9jYXRvcklkKCk7Cit9CisKK0MyQmxvY2syRDo6QzJCbG9jazJEKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0ICZzZWN0aW9uKQorICAgIC8vIGFsd2F5cyBjbGFtcCBzdWJzZWN0aW9uIHRvIHBhcmVudCAoaW1wbCkgY3JvcCBmb3Igc2FmZXR5CisgICAgOiBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0KGltcGwuZ2V0KCksIHNlY3Rpb24uY3JvcCgpKSwgbUltcGwoaW1wbCkgeworfQorCisvKioKKyAqIEdyYXBoaWMgdmlldyBpbXBsZW1lbnRhdGlvbi4KKyAqCisgKiByYW5nZSBvZiBJbXBsIGlzIHRoZSBtYXBwZWQgcmFuZ2Ugb2YgdGhlIHVuZGVybHlpbmcgYWxsb2NhdGlvbi4gcmFuZ2Ugb2YgVmlldyBpcyB0aGUgY3VycmVudAorICogY3JvcC4KKyAqLworY2xhc3MgQzJHcmFwaGljVmlldzo6SW1wbCA6IHB1YmxpYyBfQzJNYXBwZWRCbG9jazJESW1wbCB7CitwdWJsaWM6CisgICAgdXNpbmcgX0MyTWFwcGVkQmxvY2syREltcGw6Ol9DMk1hcHBlZEJsb2NrMkRJbXBsOworICAgIHZpcnR1YWwgfkltcGwoKSBvdmVycmlkZSA9IGRlZmF1bHQ7Cit9OworCitDMkdyYXBoaWNWaWV3OjpDMkdyYXBoaWNWaWV3KHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0ICZzZWN0aW9uKQorICAgIDogX0MyRWRpdGFibGVQbGFuYXJTZWN0aW9uQXNwZWN0KGltcGwuZ2V0KCksIHNlY3Rpb24uY3JvcCgpKSwgbUltcGwoaW1wbCkgeworfQorCitjb25zdCB1aW50OF90ICpjb25zdCAqQzJHcmFwaGljVmlldzo6ZGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPm1hcHBpbmcoKS0+ZGF0YSgpOworfQorCit1aW50OF90ICpjb25zdCAqQzJHcmFwaGljVmlldzo6ZGF0YSgpIHsKKyAgICByZXR1cm4gbUltcGwtPm1hcHBpbmcoKS0+ZGF0YSgpOworfQorCitjb25zdCBDMlBsYW5hckxheW91dCBDMkdyYXBoaWNWaWV3OjpsYXlvdXQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5tYXBwaW5nKCktPmxheW91dCgpOworfQorCitjb25zdCBDMkdyYXBoaWNWaWV3IEMyR3JhcGhpY1ZpZXc6OnN1YlZpZXcoY29uc3QgQzJSZWN0ICZyZWN0KSBjb25zdCB7CisgICAgcmV0dXJuIEMyR3JhcGhpY1ZpZXcobUltcGwsIEMyUGxhbmFyU2VjdGlvbigqbUltcGwsIHJlY3QpKTsKK30KKworQzJHcmFwaGljVmlldyBDMkdyYXBoaWNWaWV3OjpzdWJWaWV3KGNvbnN0IEMyUmVjdCAmcmVjdCkgeworICAgIHJldHVybiBDMkdyYXBoaWNWaWV3KG1JbXBsLCBDMlBsYW5hclNlY3Rpb24oKm1JbXBsLCByZWN0KSk7Cit9CisKK2MyX3N0YXR1c190IEMyR3JhcGhpY1ZpZXc6OmVycm9yKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+bWFwcGluZygpLT5lcnJvcigpOworfQorCisvKioKKyAqIENvbnN0IGdyYXBoaWMgYmxvY2sgaW1wbGVtZW50YXRpb24uCisgKi8KK0MyQ29uc3RHcmFwaGljQmxvY2s6OkMyQ29uc3RHcmFwaGljQmxvY2soCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0ICZzZWN0aW9uLCBDMkZlbmNlIGZlbmNlKQorICAgIDogQzJCbG9jazJEKGltcGwsIHNlY3Rpb24pLCBtRmVuY2UoZmVuY2UpIHsgfQorCitDMkFjcXVpcmFibGU8Y29uc3QgQzJHcmFwaGljVmlldz4gQzJDb25zdEdyYXBoaWNCbG9jazo6bWFwKCkgY29uc3QgeworICAgIEMyRmVuY2UgZmVuY2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMk1hcHBpbmdCbG9jazJESW1wbDo6TWFwcGVkPiBtYXBwaW5nID0KKyAgICAgICAgbUltcGwtPm1hcChmYWxzZSAvKiB3cml0YWJsZSAqLywgJmZlbmNlKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8R3JhcGhpY1ZpZXdCdWRkeTo6SW1wbD4gZ3ZpID0KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEdyYXBoaWNWaWV3QnVkZHk6OkltcGw+KG5ldyBHcmFwaGljVmlld0J1ZGR5OjpJbXBsKCptSW1wbCwgbWFwcGluZykpOworICAgIHJldHVybiBBY3F1aXJhYmxlQ29uc3RHcmFwaGljVmlld0J1ZGR5KAorICAgICAgICAgICAgbWFwcGluZy0+ZXJyb3IoKSwgZmVuY2UsIEdyYXBoaWNWaWV3QnVkZHkoZ3ZpLCBDMlBsYW5hclNlY3Rpb24oKm1JbXBsLCBjcm9wKCkpKSk7Cit9CisKK0MyQ29uc3RHcmFwaGljQmxvY2sgQzJDb25zdEdyYXBoaWNCbG9jazo6c3ViQmxvY2soY29uc3QgQzJSZWN0ICZyZWN0KSBjb25zdCB7CisgICAgcmV0dXJuIEMyQ29uc3RHcmFwaGljQmxvY2sobUltcGwsIEMyUGxhbmFyU2VjdGlvbigqbUltcGwsIGNyb3AoKS5pbnRlcnNlY3QocmVjdCkpLCBtRmVuY2UpOworfQorCisvKioKKyAqIEdyYXBoaWMgYmxvY2sgaW1wbGVtZW50YXRpb24uCisgKi8KK0MyR3JhcGhpY0Jsb2NrOjpDMkdyYXBoaWNCbG9jaygKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCAmc2VjdGlvbikKKyAgICA6IEMyQmxvY2syRChpbXBsLCBzZWN0aW9uKSB7IH0KKworQzJBY3F1aXJhYmxlPEMyR3JhcGhpY1ZpZXc+IEMyR3JhcGhpY0Jsb2NrOjptYXAoKSB7CisgICAgQzJGZW5jZSBmZW5jZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyTWFwcGluZ0Jsb2NrMkRJbXBsOjpNYXBwZWQ+IG1hcHBpbmcgPQorICAgICAgICBtSW1wbC0+bWFwKHRydWUgLyogd3JpdGFibGUgKi8sICZmZW5jZSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEdyYXBoaWNWaWV3QnVkZHk6OkltcGw+IGd2aSA9CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxHcmFwaGljVmlld0J1ZGR5OjpJbXBsPihuZXcgR3JhcGhpY1ZpZXdCdWRkeTo6SW1wbCgqbUltcGwsIG1hcHBpbmcpKTsKKyAgICByZXR1cm4gQWNxdWlyYWJsZUdyYXBoaWNWaWV3QnVkZHkoCisgICAgICAgICAgICBtYXBwaW5nLT5lcnJvcigpLCBmZW5jZSwgR3JhcGhpY1ZpZXdCdWRkeShndmksIEMyUGxhbmFyU2VjdGlvbigqbUltcGwsIGNyb3AoKSkpKTsKK30KKworQzJDb25zdEdyYXBoaWNCbG9jayBDMkdyYXBoaWNCbG9jazo6c2hhcmUoY29uc3QgQzJSZWN0ICZjcm9wLCBDMkZlbmNlIGZlbmNlKSB7CisgICAgcmV0dXJuIENvbnN0R3JhcGhpY0Jsb2NrQnVkZHkobUltcGwsIEMyUGxhbmFyU2VjdGlvbigqbUltcGwsIGNyb3ApLCBmZW5jZSk7Cit9CisKKy8qKgorICogQmFzaWMgYmxvY2sgcG9vbCBpbXBsZW1lbnRhdGlvbnMuCisgKi8KK0MyQmFzaWNHcmFwaGljQmxvY2tQb29sOjpDMkJhc2ljR3JhcGhpY0Jsb2NrUG9vbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yKQorICA6IG1BbGxvY2F0b3IoYWxsb2NhdG9yKSB7fQorCitjMl9zdGF0dXNfdCBDMkJhc2ljR3JhcGhpY0Jsb2NrUG9vbDo6ZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgeworICAgIGJsb2NrLT5yZXNldCgpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IGFsbG9jOworICAgIGMyX3N0YXR1c190IGVyciA9IG1BbGxvY2F0b3ItPm5ld0dyYXBoaWNBbGxvY2F0aW9uKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZhbGxvYyk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgICpibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jKTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jaygKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+ICZkYXRhLCBjb25zdCBDMlJlY3QgJmFsbG90dGVkQ3JvcCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrMkQ6OkltcGw+IGltcGwgPQorICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyQmxvY2syRDo6SW1wbD4oYWxsb2MsIGRhdGEsIGFsbG90dGVkQ3JvcCk7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4obmV3IEMyR3JhcGhpY0Jsb2NrKGltcGwsICppbXBsKSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBfQzJCbG9ja0ZhY3Rvcnk6OkdldEdyYXBoaWNCbG9ja1Bvb2xEYXRhKAorICAgICAgICBjb25zdCBDMkJsb2NrMkQgJmJsb2NrKSB7CisgICAgaWYgKGJsb2NrLm1JbXBsKSB7CisgICAgICAgIHJldHVybiBibG9jay5tSW1wbC0+cG9vbERhdGEoKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpjSGFuZGxlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZkYXRhKSB7CisgICAgLy8gVE9ETzogZ2V0IHByb3BlciBhbGxvY2F0b3I/IGFuZCBtdXRleD8KKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyQWxsb2NhdG9yR3JhbGxvYz4gc0FsbG9jYXRvciA9IHN0ZDo6bWFrZV91bmlxdWU8QzJBbGxvY2F0b3JHcmFsbG9jPigwKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICBpZiAoQzJBbGxvY2F0b3JHcmFsbG9jOjppc1ZhbGlkKGNIYW5kbGUpKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jbG9uZShjSGFuZGxlKTsKKyAgICAgICAgaWYgKGhhbmRsZSkgeworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gc0FsbG9jYXRvci0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihoYW5kbGUsICZhbGxvYyk7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQb29sZWRCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0sgJiYgcG9vbERhdGEpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBjb25maWcgc2V0dXA/CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jayA9CisgICAgICAgICAgICAgICAgICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jayhhbGxvYywgcG9vbERhdGEpOworICAgICAgICAgICAgICAgIHJldHVybiBibG9jazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK307CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEJVRkZFUiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitjbGFzcyBDMkJ1ZmZlckRhdGE6OkltcGwgeworcHVibGljOgorICAgIGV4cGxpY2l0IEltcGwoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKQorICAgICAgICA6IG1UeXBlKGJsb2Nrcy5zaXplKCkgPT0gMSA/IExJTkVBUiA6IExJTkVBUl9DSFVOS1MpLAorICAgICAgICAgIG1MaW5lYXJCbG9ja3MoYmxvY2tzKSB7CisgICAgfQorCisgICAgZXhwbGljaXQgSW1wbChjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiAmYmxvY2tzKQorICAgICAgICA6IG1UeXBlKGJsb2Nrcy5zaXplKCkgPT0gMSA/IEdSQVBISUMgOiBHUkFQSElDX0NIVU5LUyksCisgICAgICAgICAgbUdyYXBoaWNCbG9ja3MoYmxvY2tzKSB7CisgICAgfQorCisgICAgdHlwZV90IHR5cGUoKSBjb25zdCB7IHJldHVybiBtVHlwZTsgfQorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmxpbmVhckJsb2NrcygpIGNvbnN0IHsgcmV0dXJuIG1MaW5lYXJCbG9ja3M7IH0KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiAmZ3JhcGhpY0Jsb2NrcygpIGNvbnN0IHsgcmV0dXJuIG1HcmFwaGljQmxvY2tzOyB9CisKK3ByaXZhdGU6CisgICAgdHlwZV90IG1UeXBlOworICAgIHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gbUxpbmVhckJsb2NrczsKKyAgICBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiBtR3JhcGhpY0Jsb2NrczsKK307CisKK0MyQnVmZmVyRGF0YTo6QzJCdWZmZXJEYXRhKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmJsb2NrcykgOiBtSW1wbChuZXcgSW1wbChibG9ja3MpKSB7fQorQzJCdWZmZXJEYXRhOjpDMkJ1ZmZlckRhdGEoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gJmJsb2NrcykgOiBtSW1wbChuZXcgSW1wbChibG9ja3MpKSB7fQorCitDMkJ1ZmZlckRhdGE6OnR5cGVfdCBDMkJ1ZmZlckRhdGE6OnR5cGUoKSBjb25zdCB7IHJldHVybiBtSW1wbC0+dHlwZSgpOyB9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gQzJCdWZmZXJEYXRhOjpsaW5lYXJCbG9ja3MoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5saW5lYXJCbG9ja3MoKTsKK30KKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gQzJCdWZmZXJEYXRhOjpncmFwaGljQmxvY2tzKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z3JhcGhpY0Jsb2NrcygpOworfQorCitjbGFzcyBDMkJ1ZmZlcjo6SW1wbCB7CitwdWJsaWM6CisgICAgSW1wbChDMkJ1ZmZlciAqdGhpeiwgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKQorICAgICAgICA6IG1UaGlzKHRoaXopLCBtRGF0YShibG9ja3MpIHt9CisgICAgSW1wbChDMkJ1ZmZlciAqdGhpeiwgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gJmJsb2NrcykKKyAgICAgICAgOiBtVGhpcyh0aGl6KSwgbURhdGEoYmxvY2tzKSB7fQorCisgICAgfkltcGwoKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcGFpciA6IG1Ob3RpZnkpIHsKKyAgICAgICAgICAgIHBhaXIuZmlyc3QobVRoaXMsIHBhaXIuc2Vjb25kKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IEMyQnVmZmVyRGF0YSAmZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1EYXRhOyB9CisKKyAgICBjMl9zdGF0dXNfdCByZWdpc3Rlck9uRGVzdHJveU5vdGlmeShPbkRlc3Ryb3lOb3RpZnkgb25EZXN0cm95Tm90aWZ5LCB2b2lkICphcmcpIHsKKyAgICAgICAgYXV0byBpdCA9IHN0ZDo6ZmluZF9pZigKKyAgICAgICAgICAgICAgICBtTm90aWZ5LmJlZ2luKCksIG1Ob3RpZnkuZW5kKCksCisgICAgICAgICAgICAgICAgW29uRGVzdHJveU5vdGlmeSwgYXJnXSAoY29uc3QgYXV0byAmcGFpcikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFpci5maXJzdCA9PSBvbkRlc3Ryb3lOb3RpZnkgJiYgcGFpci5zZWNvbmQgPT0gYXJnOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoaXQgIT0gbU5vdGlmeS5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIEMyX0RVUExJQ0FURTsKKyAgICAgICAgfQorICAgICAgICBtTm90aWZ5LmVtcGxhY2VfYmFjayhvbkRlc3Ryb3lOb3RpZnksIGFyZyk7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCB1bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KE9uRGVzdHJveU5vdGlmeSBvbkRlc3Ryb3lOb3RpZnksIHZvaWQgKmFyZykgeworICAgICAgICBhdXRvIGl0ID0gc3RkOjpmaW5kX2lmKAorICAgICAgICAgICAgICAgIG1Ob3RpZnkuYmVnaW4oKSwgbU5vdGlmeS5lbmQoKSwKKyAgICAgICAgICAgICAgICBbb25EZXN0cm95Tm90aWZ5LCBhcmddIChjb25zdCBhdXRvICZwYWlyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYWlyLmZpcnN0ID09IG9uRGVzdHJveU5vdGlmeSAmJiBwYWlyLnNlY29uZCA9PSBhcmc7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmIChpdCA9PSBtTm90aWZ5LmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIG1Ob3RpZnkuZXJhc2UoaXQpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+IGluZm8oKSBjb25zdCB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+PiByZXN1bHQobUluZm9zLnNpemUoKSk7CisgICAgICAgIHN0ZDo6dHJhbnNmb3JtKAorICAgICAgICAgICAgICAgIG1JbmZvcy5iZWdpbigpLCBtSW5mb3MuZW5kKCksIHJlc3VsdC5iZWdpbigpLAorICAgICAgICAgICAgICAgIFtdIChjb25zdCBhdXRvICZlbGVtKSB7IHJldHVybiBlbGVtLnNlY29uZDsgfSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3Qgc2V0SW5mbyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPiAmaW5mbykgeworICAgICAgICAvLyBUbyAidXBkYXRlIiB5b3UgbmVlZCB0byBlcmFzZSB0aGUgZXhpc3Rpbmcgb25lIGlmIGFueSwgYW5kIHRoZW4gaW5zZXJ0LgorICAgICAgICAodm9pZCkgbUluZm9zLmVyYXNlKGluZm8tPmNvcmVJbmRleCgpKTsKKyAgICAgICAgKHZvaWQpIG1JbmZvcy5pbnNlcnQoeyBpbmZvLT5jb3JlSW5kZXgoKSwgaW5mbyB9KTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIGJvb2wgaGFzSW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSW5mb3MuY291bnQoaW5kZXguY29yZUluZGV4KCkpID4gMDsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPiBnZXRJbmZvKEMyUGFyYW06OlR5cGUgaW5kZXgpIGNvbnN0IHsKKyAgICAgICAgYXV0byBpdCA9IG1JbmZvcy5maW5kKGluZGV4LmNvcmVJbmRleCgpKTsKKyAgICAgICAgaWYgKGl0ID09IG1JbmZvcy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0ZDo6Y29uc3RfcG9pbnRlcl9jYXN0PGNvbnN0IEMySW5mbz4oaXQtPnNlY29uZCk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gcmVtb3ZlSW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KSB7CisgICAgICAgIGF1dG8gaXQgPSBtSW5mb3MuZmluZChpbmRleC5jb3JlSW5kZXgoKSk7CisgICAgICAgIGlmIChpdCA9PSBtSW5mb3MuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+IHJldCA9IGl0LT5zZWNvbmQ7CisgICAgICAgICh2b2lkKSBtSW5mb3MuZXJhc2UoaXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworcHJpdmF0ZToKKyAgICBDMkJ1ZmZlciAqIGNvbnN0IG1UaGlzOworICAgIEJ1ZmZlckRhdGFCdWRkeSBtRGF0YTsKKyAgICBzdGQ6Om1hcDxDMlBhcmFtOjpDb3JlSW5kZXgsIHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+PiBtSW5mb3M7CisgICAgc3RkOjpsaXN0PHN0ZDo6cGFpcjxPbkRlc3Ryb3lOb3RpZnksIHZvaWQgKj4+IG1Ob3RpZnk7Cit9OworCitDMkJ1ZmZlcjo6QzJCdWZmZXIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKQorICAgIDogbUltcGwobmV3IEltcGwodGhpcywgYmxvY2tzKSkge30KKworQzJCdWZmZXI6OkMyQnVmZmVyKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+ICZibG9ja3MpCisgICAgOiBtSW1wbChuZXcgSW1wbCh0aGlzLCBibG9ja3MpKSB7fQorCitjb25zdCBDMkJ1ZmZlckRhdGEgQzJCdWZmZXI6OmRhdGEoKSBjb25zdCB7IHJldHVybiBtSW1wbC0+ZGF0YSgpOyB9CisKK2MyX3N0YXR1c190IEMyQnVmZmVyOjpyZWdpc3Rlck9uRGVzdHJveU5vdGlmeShPbkRlc3Ryb3lOb3RpZnkgb25EZXN0cm95Tm90aWZ5LCB2b2lkICphcmcpIHsKKyAgICByZXR1cm4gbUltcGwtPnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KG9uRGVzdHJveU5vdGlmeSwgYXJnKTsKK30KKworYzJfc3RhdHVzX3QgQzJCdWZmZXI6OnVucmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoT25EZXN0cm95Tm90aWZ5IG9uRGVzdHJveU5vdGlmeSwgdm9pZCAqYXJnKSB7CisgICAgcmV0dXJuIG1JbXBsLT51bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KG9uRGVzdHJveU5vdGlmeSwgYXJnKTsKK30KKworY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+IEMyQnVmZmVyOjppbmZvKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+aW5mbygpOworfQorCitjMl9zdGF0dXNfdCBDMkJ1ZmZlcjo6c2V0SW5mbyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPiAmaW5mbykgeworICAgIHJldHVybiBtSW1wbC0+c2V0SW5mbyhpbmZvKTsKK30KKworYm9vbCBDMkJ1ZmZlcjo6aGFzSW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5oYXNJbmZvKGluZGV4KTsKK30KKworc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4gQzJCdWZmZXI6OmdldEluZm8oQzJQYXJhbTo6VHlwZSBpbmRleCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0SW5mbyhpbmRleCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkluZm8+IEMyQnVmZmVyOjpyZW1vdmVJbmZvKEMyUGFyYW06OlR5cGUgaW5kZXgpIHsKKyAgICByZXR1cm4gbUltcGwtPnJlbW92ZUluZm8oaW5kZXgpOworfQorCisvLyBzdGF0aWMKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gQzJCdWZmZXI6OkNyZWF0ZUxpbmVhckJ1ZmZlcihjb25zdCBDMkNvbnN0TGluZWFyQmxvY2sgJmJsb2NrKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4obmV3IEMyQnVmZmVyKHsgYmxvY2sgfSkpOworfQorCisvLyBzdGF0aWMKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gQzJCdWZmZXI6OkNyZWF0ZUdyYXBoaWNCdWZmZXIoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayAmYmxvY2spIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPihuZXcgQzJCdWZmZXIoeyBibG9jayB9KSk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyQ29uZmlnLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL0MyQ29uZmlnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDY4MGE3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJDb25maWcuY3BwCkBAIC0wLDAgKzEsMjYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMkNvbmZpZyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworLyoqCisgKiBEZWZpbmUgYW5kIGluaXRpYWxpemUgZ2xvYmFsIGNvbmZpZyBmaWVsZCBkZXNjcmlwdG9ycyBpbiB0aGlzIGNwcCBmaWxlCisgKi8KKyNkZWZpbmUgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fCisjaW5jbHVkZSA8QzJDb25maWcuaD4KKworREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihDMkNvbmZpZzo6cHJvZmlsZV90LCAoeworICAgICAgICB7ICJ1bnVzZWQiLCBDMkNvbmZpZzo6UFJPRklMRV9VTlVTRUQgfSwKKyAgICAgICAgeyAiYWFjLWxjIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xDIH0sCisgICAgICAgIHsgImFhYy1tYWluIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX01BSU4gfSwKKyAgICAgICAgeyAiYWFjLXNzciIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19TU1IgfSwKKyAgICAgICAgeyAiYWFjLWx0cCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MVFAgfSwKKyAgICAgICAgeyAiYWFjLWhlIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX0hFIH0sCisgICAgICAgIHsgImFhYy1zY2FsYWJsZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19TQ0FMQUJMRSB9LAorICAgICAgICB7ICJhYWMtZXItbGMiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfRVJfTEMgfSwKKyAgICAgICAgeyAiYWFjLWVyLXNjYWxhYmxlIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX0VSX1NDQUxBQkxFIH0sCisgICAgICAgIHsgImFhYy1sZCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MRCB9LAorICAgICAgICB7ICJhYWMtaGUtcHMiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEVfUFMgfSwKKyAgICAgICAgeyAiYWFjLWVsZCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FTEQgfSwKKyAgICAgICAgeyAiYWFjLXhoZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19YSEUgfSwKKyAgICAgICAgeyAibXAydi1zaW1wbGUiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX1NJTVBMRSB9LAorICAgICAgICB7ICJtcDJ2LW1haW4iLCBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX01BSU4gfSwKKyAgICAgICAgeyAibXAydi1zbnItc2NhbGFibGUiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX1NOUl9TQ0FMQUJMRSB9LAorICAgICAgICB7ICJtcDJ2LXNwYXRpYWxseS1zY2FsYWJsZSIsIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfU1BBVElBTExZX1NDQUxBQkxFIH0sCisgICAgICAgIHsgIm1wMnYtaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfSElHSCB9LAorICAgICAgICB7ICJtcDJ2LTQyMiIsIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfNDIyIH0sCisgICAgICAgIHsgIm1wMnYtbXVsdGl2aWV3IiwgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9NVUxUSVZJRVcgfSwKKyAgICAgICAgeyAiaDI2My1iYXNlbGluZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfQkFTRUxJTkUgfSwKKyAgICAgICAgeyAiaDI2My1oMzIwIiwgQzJDb25maWc6OlBST0ZJTEVfSDI2M19IMzIwIH0sCisgICAgICAgIHsgImgyNjMtdjFiYyIsIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfVjFCQyB9LAorICAgICAgICB7ICJoMjYzLWlzd3YyIiwgQzJDb25maWc6OlBST0ZJTEVfSDI2M19JU1dWMiB9LAorICAgICAgICB7ICJoMjYzLWlzd3YzIiwgQzJDb25maWc6OlBST0ZJTEVfSDI2M19JU1dWMyB9LAorICAgICAgICB7ICJoMjYzLWhpZ2gtY29tcHJlc3Npb24iLCBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0hJR0hfQ09NUFJFU1NJT04gfSwKKyAgICAgICAgeyAiaDI2My1pbnRlcm5ldCIsIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSU5URVJORVQgfSwKKyAgICAgICAgeyAiaDI2My1pbnRlcmxhY2UiLCBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0lOVEVSTEFDRSB9LAorICAgICAgICB7ICJoMjYzLWhpZ2gtbGF0ZW5jeSIsIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSElHSF9MQVRFTkNZIH0sCisgICAgICAgIHsgIm1wNHYtc2ltcGxlIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9TSU1QTEUgfSwKKyAgICAgICAgeyAibXA0di1zaW1wbGUtc2NhbGFibGUiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX1NJTVBMRV9TQ0FMQUJMRSB9LAorICAgICAgICB7ICJtcDR2LWNvcmUiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX0NPUkUgfSwKKyAgICAgICAgeyAibXA0di1tYWluIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9NQUlOIH0sCisgICAgICAgIHsgIm1wNHYtbmJpdCIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfTkJJVCB9LAorICAgICAgICB7ICJtcDR2LWFydHMiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX0FSVFMgfSwKKyAgICAgICAgeyAibXA0di1jb3JlLXNjYWxhYmxlIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9DT1JFX1NDQUxBQkxFIH0sCisgICAgICAgIHsgIm1wNHYtYWNlIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9BQ0UgfSwKKyAgICAgICAgeyAibXA0di1hZHZhbmNlZC1jb3JlIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9BRFZBTkNFRF9DT1JFIH0sCisgICAgICAgIHsgIm1wNHYtc2ltcGxlLXN0dWRpbyIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfU0lNUExFX1NUVURJTyB9LAorICAgICAgICB7ICJtcDR2LWNvcmUtc3R1ZGlvIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9DT1JFX1NUVURJTyB9LAorICAgICAgICB7ICJtcDR2LWFkdmFuY2VkLXNpbXBsZSIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQURWQU5DRURfU0lNUExFIH0sCisgICAgICAgIHsgIm1wNHYtZmdzIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9GR1MgfSwKKyAgICAgICAgeyAiYXZjLWJhc2VsaW5lIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0JBU0VMSU5FIH0sCisgICAgICAgIHsgImF2Yy1jb25zdHJhaW5lZC1iYXNlbGluZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORSB9LAorICAgICAgICB7ICJhdmMtbWFpbiIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19NQUlOIH0sCisgICAgICAgIHsgImF2Yy1leHRlbmRlZCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19FWFRFTkRFRCB9LAorICAgICAgICB7ICJhdmMtaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIIH0sCisgICAgICAgIHsgImF2Yy1wcm9ncmVzc2l2ZS1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX1BST0dSRVNTSVZFX0hJR0ggfSwKKyAgICAgICAgeyAiYXZjLWNvbnN0cmFpbmVkLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQ09OU1RSQUlORURfSElHSCB9LAorICAgICAgICB7ICJhdmMtaGlnaC0xMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzEwIH0sCisgICAgICAgIHsgImF2Yy1wcm9ncmVzc2l2ZS1oaWdoLTEwIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX1BST0dSRVNTSVZFX0hJR0hfMTAgfSwKKyAgICAgICAgeyAiYXZjLWhpZ2gtNDIyIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfNDIyIH0sCisgICAgICAgIHsgImF2Yy1oaWdoLTQ0NC1wcmVkaWN0aXZlIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfNDQ0X1BSRURJQ1RJVkUgfSwKKyAgICAgICAgeyAiYXZjLWhpZ2gtMTAtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSF8xMF9JTlRSQSB9LAorICAgICAgICB7ICJhdmMtaGlnaC00MjItaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSF80MjJfSU5UUkEgfSwKKyAgICAgICAgeyAiYXZjLWhpZ2gtNDQ0LWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfNDQ0X0lOVFJBIH0sCisgICAgICAgIHsgImF2Yy1jYXZsYy00NDQtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQ0FWTENfNDQ0X0lOVFJBIH0sCisgICAgICAgIHsgImF2Yy1zY2FsYWJsZS1iYXNlbGluZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19TQ0FMQUJMRV9CQVNFTElORSB9LAorICAgICAgICB7ICJhdmMtc2NhbGFibGUtY29uc3RyYWluZWQtYmFzZWxpbmUiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfU0NBTEFCTEVfQ09OU1RSQUlORURfQkFTRUxJTkUgfSwKKyAgICAgICAgeyAiYXZjLXNjYWxhYmxlLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfU0NBTEFCTEVfSElHSCB9LAorICAgICAgICB7ICJhdmMtc2NhbGFibGUtY29uc3RyYWluZWQtaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19TQ0FMQUJMRV9DT05TVFJBSU5FRF9ISUdIIH0sCisgICAgICAgIHsgImF2Yy1zY2FsYWJsZS1oaWdoLWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX1NDQUxBQkxFX0hJR0hfSU5UUkEgfSwKKyAgICAgICAgeyAiYXZjLW11bHRpdmlldy1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX01VTFRJVklFV19ISUdIIH0sCisgICAgICAgIHsgImF2Yy1zdGVyZW8taGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19TVEVSRU9fSElHSCB9LAorICAgICAgICB7ICJhdmMtbWZjLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfTUZDX0hJR0ggfSwKKyAgICAgICAgeyAiYXZjLW11bHRpdmlldy1kZXB0aC1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX01VTFRJVklFV19ERVBUSF9ISUdIIH0sCisgICAgICAgIHsgImF2Yy1tZmMtZGVwdGgtaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19NRkNfREVQVEhfSElHSCB9LAorICAgICAgICB7ICJhdmMtZW5oYW5jZWQtbXVsdGl2aWV3LWRlcHRoLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfRU5IQU5DRURfTVVMVElWSUVXX0RFUFRIX0hJR0ggfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOIH0sCisgICAgICAgIHsgImhldmMtbWFpbi0xMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl8xMCB9LAorICAgICAgICB7ICJoZXZjLW1haW4tc3RpbGwiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fU1RJTEwgfSwKKyAgICAgICAgeyAiaGV2Yy1tb25vIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NT05PIH0sCisgICAgICAgIHsgImhldmMtbW9uby0xMiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTU9OT18xMiB9LAorICAgICAgICB7ICJoZXZjLW1vbm8tMTYiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01PTk9fMTYgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTEyIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzEyIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00MjItMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDIyXzEwIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00MjItMTIiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDIyXzEyIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0IH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0XzEwIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtMTIiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0XzEyIH0sCisgICAgICAgIHsgImhldmMtbWFpbi1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl9JTlRSQSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tMTAtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fMTBfSU5UUkEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTEyLWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzEyX0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00MjItMTAtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDIyXzEwX0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00MjItMTItaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDIyXzEyX0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0X0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtMTAtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0XzEwX0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtMTItaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0XzEyX0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtMTYtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0XzE2X0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtc3RpbGwiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0X1NUSUxMIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtMTYtc3RpbGwiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0XzE2X1NUSUxMIH0sCisgICAgICAgIHsgImhldmMtaGlnaC00NDQiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX0hJR0hfNDQ0IH0sCisgICAgICAgIHsgImhldmMtaGlnaC00NDQtMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX0hJR0hfNDQ0XzEwIH0sCisgICAgICAgIHsgImhldmMtaGlnaC00NDQtMTQiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX0hJR0hfNDQ0XzE0IH0sCisgICAgICAgIHsgImhldmMtaGlnaC00NDQtMTYtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX0hJR0hfNDQ0XzE2X0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtc3gtbWFpbiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU1hfTUFJTiB9LAorICAgICAgICB7ICJoZXZjLXN4LW1haW4tMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NYX01BSU5fMTAgfSwKKyAgICAgICAgeyAiaGV2Yy1zeC1tYWluLTQ0NCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU1hfTUFJTl80NDQgfSwKKyAgICAgICAgeyAiaGV2Yy1zeC1tYWluLTQ0NC0xMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU1hfTUFJTl80NDRfMTAgfSwKKyAgICAgICAgeyAiaGV2Yy1zeC1oaWdoLTQ0NCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU1hfSElHSF80NDQgfSwKKyAgICAgICAgeyAiaGV2Yy1zeC1oaWdoLTQ0NC0xMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU1hfSElHSF80NDRfMTAgfSwKKyAgICAgICAgeyAiaGV2Yy1zeC1oaWdoLTQ0NC0xNCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU1hfSElHSF80NDRfMTQgfSwKKyAgICAgICAgeyAiaGV2Yy1tdWx0aXZpZXctbWFpbiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTVVMVElWSUVXX01BSU4gfSwKKyAgICAgICAgeyAiaGV2Yy1zY2FsYWJsZS1tYWluIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TQ0FMQUJMRV9NQUlOIH0sCisgICAgICAgIHsgImhldmMtc2NhbGFibGUtbWFpbi0xMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU0NBTEFCTEVfTUFJTl8xMCB9LAorICAgICAgICB7ICJoZXZjLXNjYWxhYmxlLW1vbm8iLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NDQUxBQkxFX01PTk8gfSwKKyAgICAgICAgeyAiaGV2Yy1zY2FsYWJsZS1tb25vLTEyIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TQ0FMQUJMRV9NT05PXzEyIH0sCisgICAgICAgIHsgImhldmMtc2NhbGFibGUtbW9uby0xNiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU0NBTEFCTEVfTU9OT18xNiB9LAorICAgICAgICB7ICJoZXZjLXNjYWxhYmxlLW1haW4tNDQ0IiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TQ0FMQUJMRV9NQUlOXzQ0NCB9LAorICAgICAgICB7ICJoZXZjLTNkLW1haW4iLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDXzNEX01BSU4gfSwKKyAgICAgICAgeyAidnA5LTAiLCBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMCB9LAorICAgICAgICB7ICJ2cDktMSIsIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8xIH0sCisgICAgICAgIHsgInZwOS0yIiwgQzJDb25maWc6OlBST0ZJTEVfVlA5XzIgfSwKKyAgICAgICAgeyAidnA5LTMiLCBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMyB9LAorICAgICAgICB7ICJhdjEtMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWMV8wIH0sCisgICAgICAgIHsgImF2MS0xIiwgQzJDb25maWc6OlBST0ZJTEVfQVYxXzEgfSwKKyAgICAgICAgeyAiYXYxLTIiLCBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMiB9LAorfSkpCisKK0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIoQzJDb25maWc6OmxldmVsX3QsICh7CisgICAgICAgIHsgInVudXNlZCIsIEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQgfSwKKyAgICAgICAgeyAibXAydi1sb3ciLCBDMkNvbmZpZzo6TEVWRUxfTVAyVl9MT1cgfSwKKyAgICAgICAgeyAibXAydi1tYWluIiwgQzJDb25maWc6OkxFVkVMX01QMlZfTUFJTiB9LAorICAgICAgICB7ICJtcDJ2LWhpZ2gtMTQ0MCIsIEMyQ29uZmlnOjpMRVZFTF9NUDJWX0hJR0hfMTQ0MCB9LAorICAgICAgICB7ICJtcDJ2LWhpZ2giLCBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdIIH0sCisgICAgICAgIHsgIm1wMnYtaGlnaHAiLCBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdIUCB9LAorICAgICAgICB7ICJoMjYzLTEwIiwgQzJDb25maWc6OkxFVkVMX0gyNjNfMTAgfSwKKyAgICAgICAgeyAiaDI2My0yMCIsIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzIwIH0sCisgICAgICAgIHsgImgyNjMtMzAiLCBDMkNvbmZpZzo6TEVWRUxfSDI2M18zMCB9LAorICAgICAgICB7ICJoMjYzLTQwIiwgQzJDb25maWc6OkxFVkVMX0gyNjNfNDAgfSwKKyAgICAgICAgeyAiaDI2My00NSIsIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzQ1IH0sCisgICAgICAgIHsgImgyNjMtNTAiLCBDMkNvbmZpZzo6TEVWRUxfSDI2M181MCB9LAorICAgICAgICB7ICJoMjYzLTYwIiwgQzJDb25maWc6OkxFVkVMX0gyNjNfNjAgfSwKKyAgICAgICAgeyAiaDI2My03MCIsIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzcwIH0sCisgICAgICAgIHsgIm1wNHYtMCIsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzAgfSwKKyAgICAgICAgeyAibXA0di0wYiIsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzBCIH0sCisgICAgICAgIHsgIm1wNHYtMSIsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzEgfSwKKyAgICAgICAgeyAibXA0di0yIiwgQzJDb25maWc6OkxFVkVMX01QNFZfMiB9LAorICAgICAgICB7ICJtcDR2LTMiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8zIH0sCisgICAgICAgIHsgIm1wNHYtM2IiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8zQiB9LAorICAgICAgICB7ICJtcDR2LTQiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl80IH0sCisgICAgICAgIHsgIm1wNHYtNGEiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl80QSB9LAorICAgICAgICB7ICJtcDR2LTUiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl81IH0sCisgICAgICAgIHsgIm1wNHYtNiIsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzYgfSwKKyAgICAgICAgeyAiYXZjLTEiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzEgfSwKKyAgICAgICAgeyAiYXZjLTFiIiwgQzJDb25maWc6OkxFVkVMX0FWQ18xQiB9LAorICAgICAgICB7ICJhdmMtMS4xIiwgQzJDb25maWc6OkxFVkVMX0FWQ18xXzEgfSwKKyAgICAgICAgeyAiYXZjLTEuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMV8yIH0sCisgICAgICAgIHsgImF2Yy0xLjMiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzFfMyB9LAorICAgICAgICB7ICJhdmMtMiIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMiB9LAorICAgICAgICB7ICJhdmMtMi4xIiwgQzJDb25maWc6OkxFVkVMX0FWQ18yXzEgfSwKKyAgICAgICAgeyAiYXZjLTIuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMl8yIH0sCisgICAgICAgIHsgImF2Yy0zIiwgQzJDb25maWc6OkxFVkVMX0FWQ18zIH0sCisgICAgICAgIHsgImF2Yy0zLjEiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzNfMSB9LAorICAgICAgICB7ICJhdmMtMy4yIiwgQzJDb25maWc6OkxFVkVMX0FWQ18zXzIgfSwKKyAgICAgICAgeyAiYXZjLTQiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzQgfSwKKyAgICAgICAgeyAiYXZjLTQuMSIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNF8xIH0sCisgICAgICAgIHsgImF2Yy00LjIiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzRfMiB9LAorICAgICAgICB7ICJhdmMtNSIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNSB9LAorICAgICAgICB7ICJhdmMtNS4xIiwgQzJDb25maWc6OkxFVkVMX0FWQ181XzEgfSwKKyAgICAgICAgeyAiYXZjLTUuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNV8yIH0sCisgICAgICAgIHsgImF2Yy02IiwgQzJDb25maWc6OkxFVkVMX0FWQ182IH0sCisgICAgICAgIHsgImF2Yy02LjEiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzZfMSB9LAorICAgICAgICB7ICJhdmMtNi4yIiwgQzJDb25maWc6OkxFVkVMX0FWQ182XzIgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTEiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTIiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzIgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTIuMSIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMl8xIH0sCisgICAgICAgIHsgImhldmMtbWFpbi0zIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8zIH0sCisgICAgICAgIHsgImhldmMtbWFpbi0zLjEiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzNfMSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNCIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNCB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNC4xIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl80XzEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTUiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzUgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTUuMSIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNV8xIH0sCisgICAgICAgIHsgImhldmMtbWFpbi01LjIiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzVfMiB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNiIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNiB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNi4xIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl82XzEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTYuMiIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNl8yIH0sCisgICAgICAgIHsgImhldmMtaGlnaC00IiwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF80IH0sCisgICAgICAgIHsgImhldmMtaGlnaC00LjEiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzRfMSB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNSIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNSB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNS4xIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF81XzEgfSwKKyAgICAgICAgeyAiaGV2Yy1oaWdoLTUuMiIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNV8yIH0sCisgICAgICAgIHsgImhldmMtaGlnaC02IiwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF82IH0sCisgICAgICAgIHsgImhldmMtaGlnaC02LjEiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzZfMSB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNi4yIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF82XzIgfSwKKyAgICAgICAgeyAidnA5LTEiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzEgfSwKKyAgICAgICAgeyAidnA5LTEuMSIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfMV8xIH0sCisgICAgICAgIHsgInZwOS0yIiwgQzJDb25maWc6OkxFVkVMX1ZQOV8yIH0sCisgICAgICAgIHsgInZwOS0yLjEiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzJfMSB9LAorICAgICAgICB7ICJ2cDktMyIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfMyB9LAorICAgICAgICB7ICJ2cDktMy4xIiwgQzJDb25maWc6OkxFVkVMX1ZQOV8zXzEgfSwKKyAgICAgICAgeyAidnA5LTQiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzQgfSwKKyAgICAgICAgeyAidnA5LTQuMSIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfNF8xIH0sCisgICAgICAgIHsgInZwOS01IiwgQzJDb25maWc6OkxFVkVMX1ZQOV81IH0sCisgICAgICAgIHsgInZwOS01LjEiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzVfMSB9LAorICAgICAgICB7ICJ2cDktNS4yIiwgQzJDb25maWc6OkxFVkVMX1ZQOV81XzIgfSwKKyAgICAgICAgeyAidnA5LTYiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzYgfSwKKyAgICAgICAgeyAidnA5LTYuMSIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfNl8xIH0sCisgICAgICAgIHsgInZwOS02LjIiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzZfMiB9LAorICAgICAgICB7ICJhdjEtMiIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfMiB9LAorICAgICAgICB7ICJhdjEtMi4xIiwgQzJDb25maWc6OkxFVkVMX0FWMV8yXzEgfSwKKyAgICAgICAgeyAiYXYxLTIuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfMl8yIH0sCisgICAgICAgIHsgImF2MS0yLjMiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzJfMyB9LAorICAgICAgICB7ICJhdjEtMyIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfMyB9LAorICAgICAgICB7ICJhdjEtMy4xIiwgQzJDb25maWc6OkxFVkVMX0FWMV8zXzEgfSwKKyAgICAgICAgeyAiYXYxLTMuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfM18yIH0sCisgICAgICAgIHsgImF2MS0zLjMiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzNfMyB9LAorICAgICAgICB7ICJhdjEtNCIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfNCB9LAorICAgICAgICB7ICJhdjEtNC4xIiwgQzJDb25maWc6OkxFVkVMX0FWMV80XzEgfSwKKyAgICAgICAgeyAiYXYxLTQuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfNF8yIH0sCisgICAgICAgIHsgImF2MS00LjMiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzRfMyB9LAorICAgICAgICB7ICJhdjEtNSIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfNSB9LAorICAgICAgICB7ICJhdjEtNS4xIiwgQzJDb25maWc6OkxFVkVMX0FWMV81XzEgfSwKKyAgICAgICAgeyAiYXYxLTUuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfNV8yIH0sCisgICAgICAgIHsgImF2MS01LjMiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzVfMyB9LAorICAgICAgICB7ICJhdjEtNiIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfNiB9LAorICAgICAgICB7ICJhdjEtNi4xIiwgQzJDb25maWc6OkxFVkVMX0FWMV82XzEgfSwKKyAgICAgICAgeyAiYXYxLTYuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfNl8yIH0sCisgICAgICAgIHsgImF2MS02LjMiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzZfMyB9LAorICAgICAgICB7ICJhdjEtNyIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfNyB9LAorICAgICAgICB7ICJhdjEtNy4xIiwgQzJDb25maWc6OkxFVkVMX0FWMV83XzEgfSwKKyAgICAgICAgeyAiYXYxLTcuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfN18yIH0sCisgICAgICAgIHsgImF2MS03LjMiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzdfMyB9LAorfSkpCisKK0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIoQzJCdWZmZXJEYXRhOjp0eXBlX3QsICh7CisgICAgICAgIHsgImludmFsaWQiLCAgICAgICAgQzJCdWZmZXJEYXRhOjpJTlZBTElEIH0sCisgICAgICAgIHsgImxpbmVhciIsICAgICAgICAgQzJCdWZmZXJEYXRhOjpMSU5FQVIgfSwKKyAgICAgICAgeyAibGluZWFyLWNodW5rcyIsICBDMkJ1ZmZlckRhdGE6OkxJTkVBUl9DSFVOS1MgfSwKKyAgICAgICAgeyAiZ3JhcGhpYyIsICAgICAgICBDMkJ1ZmZlckRhdGE6OkdSQVBISUMgfSwKKyAgICAgICAgeyAiZ3JhcGhpYy1jaHVua3MiLCBDMkJ1ZmZlckRhdGE6OkdSQVBISUNfQ0hVTktTIH0sCit9KSkKKworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9DMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzMzMGU1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmNwcApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIiCisKKyNpbmNsdWRlIDxkbGZjbi5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIuaCIKKworLyogc3RhdGljICovIGFuZHJvaWQ6Ok11dGV4IEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcjo6c011dGV4OworLyogc3RhdGljICovIHN0ZDo6dW5pcXVlX3B0cjxDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI+IEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcjo6c0luc3RhbmNlOworCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK2NvbnN0ZXhwciBjb25zdCBjaGFyIGtTdG9yZVBsdWdpblBhdGhbXSA9ICJsaWJjMnBsdWdpbl9zdG9yZS5zbyI7CisKK30gIC8vIHVubmFtZWQKKworQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyOjpDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIoY29uc3QgY2hhciAqbGliUGF0aCkKKyAgICA6IG1DcmVhdGVCbG9ja1Bvb2wobnVsbHB0cikgeworICAgIG1MaWJIYW5kbGUgPSBkbG9wZW4obGliUGF0aCwgUlRMRF9OT1cgfCBSVExEX05PREVMRVRFKTsKKyAgICBpZiAobUxpYkhhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gbG9hZCBsaWJyYXJ5OiAlcyAoJXMpIiwgbGliUGF0aCwgZGxlcnJvcigpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQ3JlYXRlQmxvY2tQb29sID0gKENyZWF0ZUJsb2NrUG9vbEZ1bmMpZGxzeW0obUxpYkhhbmRsZSwgIkNyZWF0ZUJsb2NrUG9vbCIpOworICAgIGlmIChtQ3JlYXRlQmxvY2tQb29sID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIkZhaWxlZCB0byBmaW5kIHN5bWJvbDogQ3JlYXRlQmxvY2tQb29sICglcykiLCBkbGVycm9yKCkpOworICAgIH0KKyAgICBtQ3JlYXRlQWxsb2NhdG9yID0gKENyZWF0ZUFsbG9jYXRvckZ1bmMpZGxzeW0obUxpYkhhbmRsZSwgIkNyZWF0ZUFsbG9jYXRvciIpOworICAgIGlmIChtQ3JlYXRlQWxsb2NhdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIkZhaWxlZCB0byBmaW5kIHN5bWJvbDogQ3JlYXRlQWxsb2NhdG9yICglcykiLCBkbGVycm9yKCkpOworICAgIH0KK30KKworQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyOjp+QzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyKCkgeworICAgIGlmIChtTGliSGFuZGxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1YoIkNsb3NpbmcgaGFuZGxlIik7CisgICAgICAgIGRsY2xvc2UobUxpYkhhbmRsZSk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI6OmNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgOjpDMkFsbG9jYXRvcjo6aWRfdCBhbGxvY2F0b3JJZCwgOjpDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBibG9ja1Bvb2xJZCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiogcG9vbCkgeworICAgIGlmIChtQ3JlYXRlQmxvY2tQb29sID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIkhhbmRsZSBvciBDcmVhdGVCbG9ja1Bvb2wgc3ltYm9sIGlzIG51bGwiKTsKKyAgICAgICAgcmV0dXJuIEMyX05PVF9GT1VORDsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8OjpDMkJsb2NrUG9vbD4gcHRyKG1DcmVhdGVCbG9ja1Bvb2woYWxsb2NhdG9ySWQsIGJsb2NrUG9vbElkKSk7CisgICAgaWYgKHB0cikgeworICAgICAgICAqcG9vbCA9IHB0cjsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBBTE9HRCgiRmFpbGVkIHRvIENyZWF0ZUJsb2NrUG9vbCBieSBhbGxvY2F0b3IgaWQ6ICV1IiwgYWxsb2NhdG9ySWQpOworICAgIHJldHVybiBDMl9CQURfSU5ERVg7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcjo6Y3JlYXRlQWxsb2NhdG9yKAorICAgICAgICA6OkMyQWxsb2NhdG9yOjppZF90IGFsbG9jYXRvcklkLCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+KiBjb25zdCBhbGxvY2F0b3IpIHsKKyAgICBpZiAobUNyZWF0ZUFsbG9jYXRvciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJIYW5kbGUgb3IgQ3JlYXRlQWxsb2NhdG9yIHN5bWJvbCBpcyBudWxsIik7CisgICAgICAgIHJldHVybiBDMl9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgcmVzID0gQzJfQ09SUlVQVEVEOworICAgIGFsbG9jYXRvci0+cmVzZXQobUNyZWF0ZUFsbG9jYXRvcihhbGxvY2F0b3JJZCwgJnJlcykpOworICAgIGlmIChyZXMgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoIkZhaWxlZCB0byBDcmVhdGVBbGxvY2F0b3IgYnkgaWQ6ICV1LCByZXM6ICVkIiwgYWxsb2NhdG9ySWQsIHJlcyk7CisgICAgICAgIGFsbG9jYXRvci0+cmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCisvLyBzdGF0aWMKK2NvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI+JiBDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI6OkdldEluc3RhbmNlKCkgeworICAgIGFuZHJvaWQ6Ok11dGV4OjpBdXRvbG9jayBfbChzTXV0ZXgpOworICAgIGlmICghc0luc3RhbmNlKSB7CisgICAgICAgIEFMT0dWKCJMb2FkaW5nIGxpYnJhcnkiKTsKKyAgICAgICAgc0luc3RhbmNlLnJlc2V0KG5ldyBDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIoa1N0b3JlUGx1Z2luUGF0aCkpOworICAgIH0KKyAgICByZXR1cm4gc0luc3RhbmNlOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJTdG9yZS5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMlN0b3JlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGFmYTdjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJTdG9yZS5jcHAKQEAgLTAsMCArMSw5OTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkMyU3RvcmUiCisjZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMkJxQnVmZmVyUHJpdi5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+IC8vIGdldHBhZ2VzaXplCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogUmV0dXJucyB0aGUgcHJlZmVycmVkIGNvbXBvbmVudCBzdG9yZSBpbiB0aGlzIHByb2Nlc3MgdG8gYWNjZXNzIGl0cyBpbnRlcmZhY2UuCisgKi8KK3N0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBHZXRQcmVmZXJyZWRDb2RlYzJDb21wb25lbnRTdG9yZSgpOworCisvKioKKyAqIFRoZSBwbGF0Zm9ybSBhbGxvY2F0b3Igc3RvcmUgcHJvdmlkZXMgYmFzaWMgYWxsb2NhdG9yLXR5cGVzIGZvciB0aGUgZnJhbWV3b3JrIGJhc2VkIG9uIGlvbiBhbmQKKyAqIGdyYWxsb2MuIEFsbG9jYXRvcnMgYXJlIG5vdCBtZWFudCB0byBiZSB1cGRhdGFibGUuCisgKgorICogXHRvZG8gUHJvdmlkZSBhbGxvY2F0b3IgYmFzZWQgb24gYXNobWVtCisgKiBcdG9kbyBNb3ZlIGlvbiBhbGxvY2F0aW9uIGludG8gaXRzIEhJREwgb3IgcHJvdmlkZSBzb21lIG1hcHBpbmcgZnJvbSBtZW1vcnkgdXNhZ2UgdG8gaW9uIGZsYWdzCisgKiBcdG9kbyBNYWtlIHRoaXMgYWxsb2NhdG9yIHN0b3JlIGV4dGVuZGFibGUKKyAqLworY2xhc3MgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbCA6IHB1YmxpYyBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUgeworcHVibGljOgorICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGwoKTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hBbGxvY2F0b3IoCisgICAgICAgICAgICBpZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICpjb25zdCBhbGxvY2F0b3IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJBbGxvY2F0b3I6OlRyYWl0cz4+IGxpc3RBbGxvY2F0b3JzX25iKCkKKyAgICAgICAgICAgIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkFsbG9jYXRvcjo6VHJhaXRzPj4oKTsgLy8vIFx0b2RvCisgICAgfQorCisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gImFuZHJvaWQuYWxsb2NhdG9yLXN0b3JlIjsKKyAgICB9CisKKyAgICB2b2lkIHNldENvbXBvbmVudFN0b3JlKHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBzdG9yZSk7CisKKyAgICB+QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICAvLy8gcmV0dXJucyBhIHNoYXJlZC1zaW5nbGV0b24gaW9uIGFsbG9jYXRvcgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gZmV0Y2hJb25BbGxvY2F0b3IoKTsKKworICAgIC8vLyByZXR1cm5zIGEgc2hhcmVkLXNpbmdsZXRvbiBncmFsbG9jIGFsbG9jYXRvcgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gZmV0Y2hHcmFsbG9jQWxsb2NhdG9yKCk7CisKKyAgICAvLy8gcmV0dXJucyBhIHNoYXJlZC1zaW5nbGV0b24gYnVmZmVycXVldWUgc3VwcG9ydGluZyBncmFsbG9jIGFsbG9jYXRvcgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gZmV0Y2hCdWZmZXJRdWV1ZUFsbG9jYXRvcigpOworCisgICAgLy8vIGNvbXBvbmVudCBzdG9yZSB0byB1c2UKKyAgICBzdGQ6Om11dGV4IF9tQ29tcG9uZW50U3RvcmVTZXRMb2NrOyAvLyBwcm90ZWN0cyB0aGUgZW50aXJlIHVwZGF0aW5nIF9tQ29tcG9uZW50U3RvcmUgYW5kIGl0cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlcGVuZGVuY2llcworICAgIHN0ZDo6bXV0ZXggX21Db21wb25lbnRTdG9yZVJlYWRMb2NrOyAvLyBtdXN0IHByb3RlY3Qgb25seSByZWFkL3dyaXRlIG9mIF9tQ29tcG9uZW50U3RvcmUKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gX21Db21wb25lbnRTdG9yZTsKK307CisKK0MyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw6OkMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGwoKSB7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw6OmZldGNoQWxsb2NhdG9yKAorICAgICAgICBpZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICpjb25zdCBhbGxvY2F0b3IpIHsKKyAgICBhbGxvY2F0b3ItPnJlc2V0KCk7CisgICAgc3dpdGNoIChpZCkgeworICAgIC8vIFRPRE86IHNob3VsZCB3ZSBpbXBsZW1lbnQgYSBnZW5lcmljIHJlZ2lzdHJ5IGZvciBhbGwsIGFuZCB1c2UgdGhhdD8KKyAgICBjYXNlIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6SU9OOgorICAgIGNhc2UgQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVI6CisgICAgICAgICphbGxvY2F0b3IgPSBmZXRjaElvbkFsbG9jYXRvcigpOworICAgICAgICBicmVhazsKKworICAgIGNhc2UgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpHUkFMTE9DOgorICAgIGNhc2UgQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9HUkFQSElDOgorICAgICAgICAqYWxsb2NhdG9yID0gZmV0Y2hHcmFsbG9jQWxsb2NhdG9yKCk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJVRkZFUlFVRVVFOgorICAgICAgICAqYWxsb2NhdG9yID0gZmV0Y2hCdWZmZXJRdWV1ZUFsbG9jYXRvcigpOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIC8vIFRyeSB0byBjcmVhdGUgYWxsb2NhdG9yIGZyb20gcGxhdGZvcm0gc3RvcmUgcGx1Z2lucy4KKyAgICAgICAgYzJfc3RhdHVzX3QgcmVzID0KKyAgICAgICAgICAgICAgICBDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI6OkdldEluc3RhbmNlKCktPmNyZWF0ZUFsbG9jYXRvcihpZCwgYWxsb2NhdG9yKTsKKyAgICAgICAgaWYgKHJlcyAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKCphbGxvY2F0b3IgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK25hbWVzcGFjZSB7CisKK3N0ZDo6bXV0ZXggZ0lvbkFsbG9jYXRvck11dGV4Oworc3RkOjp3ZWFrX3B0cjxDMkFsbG9jYXRvcklvbj4gZ0lvbkFsbG9jYXRvcjsKKwordm9pZCBVc2VDb21wb25lbnRTdG9yZUZvcklvbkFsbG9jYXRvcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9ySW9uPiBhbGxvY2F0b3IsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBzdG9yZSkgeworICAgIEMyQWxsb2NhdG9ySW9uOjpVc2FnZU1hcHBlckZuIG1hcHBlcjsKKyAgICB1aW50NjRfdCBtaW5Vc2FnZSA9IDA7CisgICAgdWludDY0X3QgbWF4VXNhZ2UgPSBDMk1lbW9yeVVzYWdlKEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUpLmV4cGVjdGVkOworICAgIHNpemVfdCBibG9ja1NpemUgPSBnZXRwYWdlc2l6ZSgpOworCisgICAgLy8gcXVlcnkgbWluIGFuZCBtYXggdXNhZ2UgYXMgd2VsbCBhcyBibG9jayBzaXplIHZpYSBzdXBwb3J0ZWQgdmFsdWVzCisgICAgQzJTdG9yZUlvblVzYWdlSW5mbyB1c2FnZUluZm87CisgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiBxdWVyeSA9IHsKKyAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpQb3NzaWJsZShDMlBhcmFtRmllbGQ6Ok1ha2UodXNhZ2VJbmZvLCB1c2FnZUluZm8udXNhZ2UpKSwKKyAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpQb3NzaWJsZShDMlBhcmFtRmllbGQ6Ok1ha2UodXNhZ2VJbmZvLCB1c2FnZUluZm8uY2FwYWNpdHkpKSwKKyAgICB9OworICAgIGMyX3N0YXR1c190IHJlcyA9IHN0b3JlLT5xdWVyeVN1cHBvcnRlZFZhbHVlc19zbShxdWVyeSk7CisgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICBpZiAocXVlcnlbMF0uc3RhdHVzID09IEMyX09LKSB7CisgICAgICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZmc3YgPSBxdWVyeVswXS52YWx1ZXM7CisgICAgICAgICAgICBpZiAoZnN2LnR5cGUgPT0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6RkxBR1MgJiYgIWZzdi52YWx1ZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG1pblVzYWdlID0gZnN2LnZhbHVlc1swXS51NjQ7CisgICAgICAgICAgICAgICAgbWF4VXNhZ2UgPSAwOworICAgICAgICAgICAgICAgIGZvciAoQzJWYWx1ZTo6UHJpbWl0aXZlIHYgOiBmc3YudmFsdWVzKSB7CisgICAgICAgICAgICAgICAgICAgIG1heFVzYWdlIHw9IHYudTY0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocXVlcnlbMV0uc3RhdHVzID09IEMyX09LKSB7CisgICAgICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZmc3YgPSBxdWVyeVsxXS52YWx1ZXM7CisgICAgICAgICAgICBpZiAoZnN2LnR5cGUgPT0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UkFOR0UgJiYgZnN2LnJhbmdlLnN0ZXAudTMyID4gMCkgeworICAgICAgICAgICAgICAgIGJsb2NrU2l6ZSA9IGZzdi5yYW5nZS5zdGVwLnUzMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1hcHBlciA9IFtzdG9yZV0oQzJNZW1vcnlVc2FnZSB1c2FnZSwgc2l6ZV90IGNhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqYWxpZ24sIHVuc2lnbmVkICpoZWFwTWFzaywgdW5zaWduZWQgKmZsYWdzKSAtPiBjMl9zdGF0dXNfdCB7CisgICAgICAgICAgICBpZiAoY2FwYWNpdHkgPiBVSU5UMzJfTUFYKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEMyU3RvcmVJb25Vc2FnZUluZm8gdXNhZ2VJbmZvID0geyB1c2FnZS5leHBlY3RlZCwgY2FwYWNpdHkgfTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsgLy8gVE9ETzogcmVtb3ZlCisgICAgICAgICAgICBjMl9zdGF0dXNfdCByZXMgPSBzdG9yZS0+Y29uZmlnX3NtKHsmdXNhZ2VJbmZvfSwgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAqYWxpZ24gPSB1c2FnZUluZm8ubWluQWxpZ25tZW50OworICAgICAgICAgICAgICAgICpoZWFwTWFzayA9IHVzYWdlSW5mby5oZWFwTWFzazsKKyAgICAgICAgICAgICAgICAqZmxhZ3MgPSB1c2FnZUluZm8uYWxsb2NGbGFnczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH07CisgICAgfQorCisgICAgYWxsb2NhdG9yLT5zZXRVc2FnZU1hcHBlcihtYXBwZXIsIG1pblVzYWdlLCBtYXhVc2FnZSwgYmxvY2tTaXplKTsKK30KKworfQorCit2b2lkIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw6OnNldENvbXBvbmVudFN0b3JlKHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBzdG9yZSkgeworICAgIC8vIHRlY2huaWNhbGx5IHRoaXMgc2V0IGxvY2sgaXMgbm90IG5lZWRlZCwgYnV0IGlzIGhlcmUgZm9yIHNhZmV0eSBpbiBjYXNlIHdlIGFkZCBtb3JlCisgICAgLy8gZ2V0dGVyIG9yZGVycworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKF9tQ29tcG9uZW50U3RvcmVTZXRMb2NrKTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKF9tQ29tcG9uZW50U3RvcmVSZWFkTG9jayk7CisgICAgICAgIF9tQ29tcG9uZW50U3RvcmUgPSBzdG9yZTsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9ySW9uPiBhbGxvY2F0b3I7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhnSW9uQWxsb2NhdG9yTXV0ZXgpOworICAgICAgICBhbGxvY2F0b3IgPSBnSW9uQWxsb2NhdG9yLmxvY2soKTsKKyAgICB9CisgICAgaWYgKGFsbG9jYXRvcikgeworICAgICAgICBVc2VDb21wb25lbnRTdG9yZUZvcklvbkFsbG9jYXRvcihhbGxvY2F0b3IsIHN0b3JlKTsKKyAgICB9Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbDo6ZmV0Y2hJb25BbGxvY2F0b3IoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZ0lvbkFsbG9jYXRvck11dGV4KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JJb24+IGFsbG9jYXRvciA9IGdJb25BbGxvY2F0b3IubG9jaygpOworICAgIGlmIChhbGxvY2F0b3IgPT0gbnVsbHB0cikgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gY29tcG9uZW50U3RvcmU7CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKF9tQ29tcG9uZW50U3RvcmVSZWFkTG9jayk7CisgICAgICAgICAgICBjb21wb25lbnRTdG9yZSA9IF9tQ29tcG9uZW50U3RvcmU7CisgICAgICAgIH0KKyAgICAgICAgYWxsb2NhdG9yID0gc3RkOjptYWtlX3NoYXJlZDxDMkFsbG9jYXRvcklvbj4oQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT04pOworICAgICAgICBVc2VDb21wb25lbnRTdG9yZUZvcklvbkFsbG9jYXRvcihhbGxvY2F0b3IsIGNvbXBvbmVudFN0b3JlKTsKKyAgICAgICAgZ0lvbkFsbG9jYXRvciA9IGFsbG9jYXRvcjsKKyAgICB9CisgICAgcmV0dXJuIGFsbG9jYXRvcjsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsOjpmZXRjaEdyYWxsb2NBbGxvY2F0b3IoKSB7CisgICAgc3RhdGljIHN0ZDo6bXV0ZXggbXV0ZXg7CisgICAgc3RhdGljIHN0ZDo6d2Vha19wdHI8QzJBbGxvY2F0b3I+IGdyYWxsb2NBbGxvY2F0b3I7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gYWxsb2NhdG9yID0gZ3JhbGxvY0FsbG9jYXRvci5sb2NrKCk7CisgICAgaWYgKGFsbG9jYXRvciA9PSBudWxscHRyKSB7CisgICAgICAgIGFsbG9jYXRvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJBbGxvY2F0b3JHcmFsbG9jPihDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkdSQUxMT0MpOworICAgICAgICBncmFsbG9jQWxsb2NhdG9yID0gYWxsb2NhdG9yOworICAgIH0KKyAgICByZXR1cm4gYWxsb2NhdG9yOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw6OmZldGNoQnVmZmVyUXVldWVBbGxvY2F0b3IoKSB7CisgICAgc3RhdGljIHN0ZDo6bXV0ZXggbXV0ZXg7CisgICAgc3RhdGljIHN0ZDo6d2Vha19wdHI8QzJBbGxvY2F0b3I+IGdyYWxsb2NBbGxvY2F0b3I7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gYWxsb2NhdG9yID0gZ3JhbGxvY0FsbG9jYXRvci5sb2NrKCk7CisgICAgaWYgKGFsbG9jYXRvciA9PSBudWxscHRyKSB7CisgICAgICAgIGFsbG9jYXRvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJBbGxvY2F0b3JHcmFsbG9jPigKKyAgICAgICAgICAgICAgICBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJVRkZFUlFVRVVFLCB0cnVlKTsKKyAgICAgICAgZ3JhbGxvY0FsbG9jYXRvciA9IGFsbG9jYXRvcjsKKyAgICB9CisgICAgcmV0dXJuIGFsbG9jYXRvcjsKK30KKworbmFtZXNwYWNlIHsKKyAgICBzdGQ6Om11dGV4IGdQcmVmZXJyZWRDb21wb25lbnRTdG9yZU11dGV4OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBnUHJlZmVycmVkQ29tcG9uZW50U3RvcmU7CisKKyAgICBzdGQ6Om11dGV4IGdQbGF0Zm9ybUFsbG9jYXRvclN0b3JlTXV0ZXg7CisgICAgc3RkOjp3ZWFrX3B0cjxDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsPiBnUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IEdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZ1BsYXRmb3JtQWxsb2NhdG9yU3RvcmVNdXRleCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw+IHN0b3JlID0gZ1BsYXRmb3JtQWxsb2NhdG9yU3RvcmUubG9jaygpOworICAgIGlmIChzdG9yZSA9PSBudWxscHRyKSB7CisgICAgICAgIHN0b3JlID0gc3RkOjptYWtlX3NoYXJlZDxDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsPigpOworICAgICAgICBzdG9yZS0+c2V0Q29tcG9uZW50U3RvcmUoR2V0UHJlZmVycmVkQ29kZWMyQ29tcG9uZW50U3RvcmUoKSk7CisgICAgICAgIGdQbGF0Zm9ybUFsbG9jYXRvclN0b3JlID0gc3RvcmU7CisgICAgfQorICAgIHJldHVybiBzdG9yZTsKK30KKwordm9pZCBTZXRQcmVmZXJyZWRDb2RlYzJDb21wb25lbnRTdG9yZShzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gY29tcG9uZW50U3RvcmUpIHsKKyAgICBzdGF0aWMgc3RkOjptdXRleCBtdXRleDsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtdXRleCk7IC8vIGRvbid0IGludGVybGV2ZSBzZXQtcworCisgICAgLy8gdXBkYXRlIHByZWZlcnJlZCBzdG9yZQorICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZ1ByZWZlcnJlZENvbXBvbmVudFN0b3JlTXV0ZXgpOworICAgICAgICBnUHJlZmVycmVkQ29tcG9uZW50U3RvcmUgPSBjb21wb25lbnRTdG9yZTsKKyAgICB9CisKKyAgICAvLyB1cGRhdGUgcGxhdGZvcm0gYWxsb2NhdG9yJ3Mgc3RvcmUgYXMgd2VsbCBpZiBpdCBpcyBhbGl2ZQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsPiBhbGxvY2F0b3JTdG9yZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGdQbGF0Zm9ybUFsbG9jYXRvclN0b3JlTXV0ZXgpOworICAgICAgICBhbGxvY2F0b3JTdG9yZSA9IGdQbGF0Zm9ybUFsbG9jYXRvclN0b3JlLmxvY2soKTsKKyAgICB9CisgICAgaWYgKGFsbG9jYXRvclN0b3JlKSB7CisgICAgICAgIGFsbG9jYXRvclN0b3JlLT5zZXRDb21wb25lbnRTdG9yZShjb21wb25lbnRTdG9yZSk7CisgICAgfQorfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gR2V0UHJlZmVycmVkQ29kZWMyQ29tcG9uZW50U3RvcmUoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZ1ByZWZlcnJlZENvbXBvbmVudFN0b3JlTXV0ZXgpOworICAgIHJldHVybiBnUHJlZmVycmVkQ29tcG9uZW50U3RvcmUgPyBnUHJlZmVycmVkQ29tcG9uZW50U3RvcmUgOiBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCk7Cit9CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIF9DMkJsb2NrUG9vbENhY2hlIHsKK3B1YmxpYzoKKyAgICBfQzJCbG9ja1Bvb2xDYWNoZSgpIDogbUJsb2NrUG9vbFNlcUlkKEMyQmxvY2tQb29sOjpQTEFURk9STV9TVEFSVCArIDEpIHt9CisKKyAgICBjMl9zdGF0dXNfdCBfY3JlYXRlQmxvY2tQb29sKAorICAgICAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjppZF90IGFsbG9jYXRvcklkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBwb29sSWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICpwb29sKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBhbGxvY2F0b3JTdG9yZSA9CisgICAgICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jYXRvcjsKKyAgICAgICAgYzJfc3RhdHVzX3QgcmVzID0gQzJfTk9UX0ZPVU5EOworCisgICAgICAgIHN3aXRjaChhbGxvY2F0b3JJZCkgeworICAgICAgICAgICAgY2FzZSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OklPTjoKKyAgICAgICAgICAgIGNhc2UgQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVI6CisgICAgICAgICAgICAgICAgcmVzID0gYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVIsICZhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBwdHIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2w+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yLCBwb29sSWQpOworICAgICAgICAgICAgICAgICAgICAqcG9vbCA9IHB0cjsKKyAgICAgICAgICAgICAgICAgICAgbUJsb2NrUG9vbHNbcG9vbElkXSA9IHB0cjsKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudHNbcG9vbElkXSA9IGNvbXBvbmVudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6R1JBTExPQzoKKyAgICAgICAgICAgIGNhc2UgQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9HUkFQSElDOgorICAgICAgICAgICAgICAgIHJlcyA9IGFsbG9jYXRvclN0b3JlLT5mZXRjaEFsbG9jYXRvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfR1JBUEhJQywgJmFsbG9jYXRvcik7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IHB0ciA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sPihhbGxvY2F0b3IsIHBvb2xJZCk7CisgICAgICAgICAgICAgICAgICAgICpwb29sID0gcHRyOworICAgICAgICAgICAgICAgICAgICBtQmxvY2tQb29sc1twb29sSWRdID0gcHRyOworICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50c1twb29sSWRdID0gY29tcG9uZW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCVUZGRVJRVUVVRToKKyAgICAgICAgICAgICAgICByZXMgPSBhbGxvY2F0b3JTdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJVRkZFUlFVRVVFLCAmYWxsb2NhdG9yKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcHRyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yLCBwb29sSWQpOworICAgICAgICAgICAgICAgICAgICAqcG9vbCA9IHB0cjsKKyAgICAgICAgICAgICAgICAgICAgbUJsb2NrUG9vbHNbcG9vbElkXSA9IHB0cjsKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudHNbcG9vbElkXSA9IGNvbXBvbmVudDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIC8vIFRyeSB0byBjcmVhdGUgYmxvY2sgcG9vbCBmcm9tIHBsYXRmb3JtIHN0b3JlIHBsdWdpbnMuCisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBwdHI7CisgICAgICAgICAgICAgICAgcmVzID0gQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyOjpHZXRJbnN0YW5jZSgpLT5jcmVhdGVCbG9ja1Bvb2woCisgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3JJZCwgcG9vbElkLCAmcHRyKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICpwb29sID0gcHRyOworICAgICAgICAgICAgICAgICAgICBtQmxvY2tQb29sc1twb29sSWRdID0gcHRyOworICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50c1twb29sSWRdID0gY29tcG9uZW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGMyX3N0YXR1c190IGNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6aWRfdCBhbGxvY2F0b3JJZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCkgeworICAgICAgICByZXR1cm4gX2NyZWF0ZUJsb2NrUG9vbChhbGxvY2F0b3JJZCwgY29tcG9uZW50LCBtQmxvY2tQb29sU2VxSWQrKywgcG9vbCk7CisgICAgfQorCisgICAgYm9vbCBnZXRCbG9ja1Bvb2woCisgICAgICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBibG9ja1Bvb2xJZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCkgeworICAgICAgICAvLyBUT0RPOiB1c2Ugb25lIGl0ZXJhdG9yIGZvciBtdWx0aXBsZSBibG9ja3Bvb2wgdHlwZSBzY2FsYWJpbGl0eS4KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBwdHI7CisgICAgICAgIGF1dG8gaXQgPSBtQmxvY2tQb29scy5maW5kKGJsb2NrUG9vbElkKTsKKyAgICAgICAgaWYgKGl0ICE9IG1CbG9ja1Bvb2xzLmVuZCgpKSB7CisgICAgICAgICAgICBwdHIgPSBpdC0+c2Vjb25kLmxvY2soKTsKKyAgICAgICAgICAgIGlmICghcHRyKSB7CisgICAgICAgICAgICAgICAgbUJsb2NrUG9vbHMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIG1Db21wb25lbnRzLmVyYXNlKGJsb2NrUG9vbElkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXV0byBmb3VuZCA9IG1Db21wb25lbnRzLmZpbmQoYmxvY2tQb29sSWQpOworICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQgPT0gZm91bmQtPnNlY29uZC5sb2NrKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKnBvb2wgPSBwdHI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCitwcml2YXRlOgorICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG1CbG9ja1Bvb2xTZXFJZDsKKworICAgIHN0ZDo6bWFwPEMyQmxvY2tQb29sOjpsb2NhbF9pZF90LCBzdGQ6OndlYWtfcHRyPEMyQmxvY2tQb29sPj4gbUJsb2NrUG9vbHM7CisgICAgc3RkOjptYXA8QzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QsIHN0ZDo6d2Vha19wdHI8Y29uc3QgQzJDb21wb25lbnQ+PiBtQ29tcG9uZW50czsKK307CisKK3N0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8X0MyQmxvY2tQb29sQ2FjaGU+IHNCbG9ja1Bvb2xDYWNoZSA9CisgICAgc3RkOjptYWtlX3VuaXF1ZTxfQzJCbG9ja1Bvb2xDYWNoZT4oKTsKK3N0YXRpYyBzdGQ6Om11dGV4IHNCbG9ja1Bvb2xDYWNoZU11dGV4OworCit9IC8vIGFueW55bW91cyBuYW1lc3BhY2UKKworYzJfc3RhdHVzX3QgR2V0Q29kZWMyQmxvY2tQb29sKAorICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gKnBvb2wpIHsKKyAgICBwb29sLT5yZXNldCgpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHNCbG9ja1Bvb2xDYWNoZU11dGV4KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gYWxsb2NhdG9yU3RvcmUgPSBHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBhbGxvY2F0b3I7CisgICAgYzJfc3RhdHVzX3QgcmVzID0gQzJfTk9UX0ZPVU5EOworCisgICAgaWYgKGlkID49IEMyQmxvY2tQb29sOjpQTEFURk9STV9TVEFSVCkgeworICAgICAgICBpZiAoc0Jsb2NrUG9vbENhY2hlLT5nZXRCbG9ja1Bvb2woaWQsIGNvbXBvbmVudCwgcG9vbCkpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaCAoaWQpIHsKKyAgICBjYXNlIEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVI6CisgICAgICAgIHJlcyA9IGFsbG9jYXRvclN0b3JlLT5mZXRjaEFsbG9jYXRvcihDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUiwgJmFsbG9jYXRvcik7CisgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICpwb29sID0gc3RkOjptYWtlX3NoYXJlZDxDMkJhc2ljTGluZWFyQmxvY2tQb29sPihhbGxvY2F0b3IpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJCbG9ja1Bvb2w6OkJBU0lDX0dSQVBISUM6CisgICAgICAgIHJlcyA9IGFsbG9jYXRvclN0b3JlLT5mZXRjaEFsbG9jYXRvcihDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0dSQVBISUMsICZhbGxvY2F0b3IpOworICAgICAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgICAgICAqcG9vbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJCYXNpY0dyYXBoaWNCbG9ja1Bvb2w+KGFsbG9jYXRvcik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMuIHRoaXMgaXMgdGVtcG9yYXJ5CisgICAgY2FzZSBDMkJsb2NrUG9vbDo6UExBVEZPUk1fU1RBUlQ6CisgICAgICAgIHJlcyA9IHNCbG9ja1Bvb2xDYWNoZS0+X2NyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgICAgICAgICBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJVRkZFUlFVRVVFLCBjb21wb25lbnQsIGlkLCBwb29sKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK2MyX3N0YXR1c190IENyZWF0ZUNvZGVjMkJsb2NrUG9vbCgKKyAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjppZF90IGFsbG9jYXRvcklkLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCkgeworICAgIHBvb2wtPnJlc2V0KCk7CisKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhzQmxvY2tQb29sQ2FjaGVNdXRleCk7CisgICAgcmV0dXJuIHNCbG9ja1Bvb2xDYWNoZS0+Y3JlYXRlQmxvY2tQb29sKGFsbG9jYXRvcklkLCBjb21wb25lbnQsIHBvb2wpOworfQorCitjbGFzcyBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUgOiBwdWJsaWMgQzJDb21wb25lbnRTdG9yZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+IGxpc3RDb21wb25lbnRzKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gZ2V0UGFyYW1SZWZsZWN0b3IoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3NtKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKmNvbnN0IHBhcmFtcykgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeV9zbSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmc3RhY2tQYXJhbXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpjb25zdCBoZWFwUGFyYW1zKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIEMyU3RyaW5nIG5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gKmNvbnN0IGludGVyZmFjZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBDMlN0cmluZyBuYW1lLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+ICpjb25zdCBjb21wb25lbnQpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29weUJ1ZmZlcigKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+IHNyYywgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gZHN0KSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZ19zbSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+ICpjb25zdCBmYWlsdXJlcykgb3ZlcnJpZGU7CisgICAgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCk7CisKKyAgICB2aXJ0dWFsIH5DMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisKKyAgICAvKioKKyAgICAgKiBBbiBvYmplY3QgZW5jYXBzdWxhdGluZyBhIGxvYWRlZCBjb21wb25lbnQgbW9kdWxlLgorICAgICAqCisgICAgICogXHRvZG8gcHJvdmlkZSBhIHdheSB0byBhZGQgdHJhaXRzIHRvIGtub3duIGNvbXBvbmVudHMgaGVyZSB0byBhdm9pZCBsb2FkaW5nIHRoZSAuc28tcworICAgICAqIGZvciBsaXN0Q29tcG9uZW50cworICAgICAqLworICAgIHN0cnVjdCBDb21wb25lbnRNb2R1bGUgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5LAorICAgICAgICAgICAgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8Q29tcG9uZW50TW9kdWxlPiB7CisgICAgICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiAqY29tcG9uZW50LAorICAgICAgICAgICAgICAgIENvbXBvbmVudERlbGV0ZXIgZGVsZXRlciA9IHN0ZDo6ZGVmYXVsdF9kZWxldGU8QzJDb21wb25lbnQ+KCkpIG92ZXJyaWRlOworICAgICAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gKmludGVyZmFjZSwKKyAgICAgICAgICAgICAgICBJbnRlcmZhY2VEZWxldGVyIGRlbGV0ZXIgPSBzdGQ6OmRlZmF1bHRfZGVsZXRlPEMyQ29tcG9uZW50SW50ZXJmYWNlPigpKSBvdmVycmlkZTsKKworICAgICAgICAvKioKKyAgICAgICAgICogXHJldHVybnMgdGhlIHRyYWl0cyBvZiB0aGUgY29tcG9uZW50IGluIHRoaXMgbW9kdWxlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+IGdldFRyYWl0cygpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGFuIHVuaW5pdGlhbGl6ZWQgY29tcG9uZW50IG1vZHVsZS4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIG5hbWVbaW5dICBjb21wb25lbnQgbmFtZS4KKyAgICAgICAgICoKKyAgICAgICAgICogXG5vdGUgT25seSB1c2VkIGJ5IENvbXBvbmVudExvYWRlci4KKyAgICAgICAgICovCisgICAgICAgIENvbXBvbmVudE1vZHVsZSgpCisgICAgICAgICAgICA6IG1Jbml0KEMyX05PX0lOSVQpLAorICAgICAgICAgICAgICBtTGliSGFuZGxlKG51bGxwdHIpLAorICAgICAgICAgICAgICBjcmVhdGVGYWN0b3J5KG51bGxwdHIpLAorICAgICAgICAgICAgICBkZXN0cm95RmFjdG9yeShudWxscHRyKSwKKyAgICAgICAgICAgICAgbUNvbXBvbmVudEZhY3RvcnkobnVsbHB0cikgeworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEluaXRpYWxpemVzIGEgY29tcG9uZW50IG1vZHVsZSB3aXRoIGEgZ2l2ZW4gbGlicmFyeSBwYXRoLiBNdXN0IGJlIGNhbGxlZCBleGFjdGx5IG9uY2UuCisgICAgICAgICAqCisgICAgICAgICAqIFxub3RlIE9ubHkgdXNlZCBieSBDb21wb25lbnRMb2FkZXIuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSBsaWJQYXRoW2luXSBsaWJyYXJ5IHBhdGgKKyAgICAgICAgICoKKyAgICAgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBtb2R1bGUgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGxvYWRlZAorICAgICAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBsb2FkaW5nIHRoZSBjb21wb25lbnQgbW9kdWxlCisgICAgICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIGNvdWxkIG5vdCBsb2NhdGUgdGhlIGNvbXBvbmVudCBtb2R1bGUKKyAgICAgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgdGhlIGNvbXBvbmVudCBtb2R1bGUgY291bGQgbm90IGJlIGxvYWRlZCAodW5leHBlY3RlZCkKKyAgICAgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgcGVybWlzc2lvbiBkZW5pZWQgdG8gbG9hZCB0aGUgY29tcG9uZW50IG1vZHVsZSAodW5leHBlY3RlZCkKKyAgICAgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IGxvYWQgdGhlIG1vZHVsZSB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICAgICAqLworICAgICAgICBjMl9zdGF0dXNfdCBpbml0KHN0ZDo6c3RyaW5nIGxpYlBhdGgpOworCisgICAgICAgIHZpcnR1YWwgfkNvbXBvbmVudE1vZHVsZSgpIG92ZXJyaWRlOworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBzdGQ6OnJlY3Vyc2l2ZV9tdXRleCBtTG9jazsgLy8vPCBsb2NrIHByb3RlY3RpbmcgbVRyYWl0cworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6OlRyYWl0cz4gbVRyYWl0czsgLy8vPCBjYWNoZWQgY29tcG9uZW50IHRyYWl0cworCisgICAgICAgIGMyX3N0YXR1c190IG1Jbml0OyAvLy88IGluaXRpYWxpemF0aW9uIHJlc3VsdAorCisgICAgICAgIHZvaWQgKm1MaWJIYW5kbGU7IC8vLzwgbG9hZGVkIGxpYnJhcnkgaGFuZGxlCisgICAgICAgIEMyQ29tcG9uZW50RmFjdG9yeTo6Q3JlYXRlQ29kZWMyRmFjdG9yeUZ1bmMgY3JlYXRlRmFjdG9yeTsgLy8vPCBsb2FkZWQgY3JlYXRlIGZ1bmN0aW9uCisgICAgICAgIEMyQ29tcG9uZW50RmFjdG9yeTo6RGVzdHJveUNvZGVjMkZhY3RvcnlGdW5jIGRlc3Ryb3lGYWN0b3J5OyAvLy88IGxvYWRlZCBkZXN0cm95IGZ1bmN0aW9uCisgICAgICAgIEMyQ29tcG9uZW50RmFjdG9yeSAqbUNvbXBvbmVudEZhY3Rvcnk7IC8vLzwgbG9hZGVkL2NyZWF0ZWQgY29tcG9uZW50IGZhY3RvcnkKKyAgICB9OworCisgICAgLyoqCisgICAgICogQW4gb2JqZWN0IGVuY2Fwc3VsYXRpbmcgYSBsb2FkYWJsZSBjb21wb25lbnQgbW9kdWxlLgorICAgICAqCisgICAgICogXHRvZG8gbWFrZSB0aGlzIGFsc28gd29yayBmb3IgZW51bWVyYXRpb25zCisgICAgICovCisgICAgc3RydWN0IENvbXBvbmVudExvYWRlciB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBMb2FkIHRoZSBjb21wb25lbnQgbW9kdWxlLgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIG1ldGhvZCBzaW1wbHkgcmV0dXJucyB0aGUgY29tcG9uZW50IG1vZHVsZSBpZiBpdCBpcyBhbHJlYWR5IGN1cnJlbnRseSBsb2FkZWQsIG9yCisgICAgICAgICAqIGF0dGVtcHRzIHRvIGxvYWQgaXQgaWYgaXQgaXMgbm90LgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gbW9kdWxlW291dF0gcG9pbnRlciB0byB0aGUgc2hhcmVkIHBvaW50ZXIgd2hlcmUgdGhlIGxvYWRlZCBtb2R1bGUgc2hhbGwgYmUgc3RvcmVkLgorICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgVGhpcyB3aWxsIGJlIG51bGxwdHIgb24gZXJyb3IuCisgICAgICAgICAqCisgICAgICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgbW9kdWxlIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBsb2FkZWQKKyAgICAgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gbG9hZGluZyB0aGUgY29tcG9uZW50IG1vZHVsZQorICAgICAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCBjb3VsZCBub3QgbG9jYXRlIHRoZSBjb21wb25lbnQgbW9kdWxlCisgICAgICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHRoZSBjb21wb25lbnQgbW9kdWxlIGNvdWxkIG5vdCBiZSBsb2FkZWQKKyAgICAgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgcGVybWlzc2lvbiBkZW5pZWQgdG8gbG9hZCB0aGUgY29tcG9uZW50IG1vZHVsZQorICAgICAgICAgKi8KKyAgICAgICAgYzJfc3RhdHVzX3QgZmV0Y2hNb2R1bGUoc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gKm1vZHVsZSkgeworICAgICAgICAgICAgYzJfc3RhdHVzX3QgcmVzID0gQzJfT0s7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gbG9jYWxNb2R1bGUgPSBtTW9kdWxlLmxvY2soKTsKKyAgICAgICAgICAgIGlmIChsb2NhbE1vZHVsZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgbG9jYWxNb2R1bGUgPSBzdGQ6Om1ha2Vfc2hhcmVkPENvbXBvbmVudE1vZHVsZT4oKTsKKyAgICAgICAgICAgICAgICByZXMgPSBsb2NhbE1vZHVsZS0+aW5pdChtTGliUGF0aCk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBtTW9kdWxlID0gbG9jYWxNb2R1bGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKm1vZHVsZSA9IGxvY2FsTW9kdWxlOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgY29tcG9uZW50IGxvYWRlciBmb3IgYSBzcGVjaWZpYyBsaWJyYXJ5IHBhdGggKG9yIG5hbWUpLgorICAgICAgICAgKi8KKyAgICAgICAgQ29tcG9uZW50TG9hZGVyKHN0ZDo6c3RyaW5nIGxpYlBhdGgpCisgICAgICAgICAgICA6IG1MaWJQYXRoKGxpYlBhdGgpIHt9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6Om11dGV4IG1NdXRleDsgLy8vPCBtdXRleCBndWFyZGluZyB0aGUgbW9kdWxlCisgICAgICAgIHN0ZDo6d2Vha19wdHI8Q29tcG9uZW50TW9kdWxlPiBtTW9kdWxlOyAvLy88IHdlYWsgcmVmZXJlbmNlIHRvIHRoZSBsb2FkZWQgbW9kdWxlCisgICAgICAgIHN0ZDo6c3RyaW5nIG1MaWJQYXRoOyAvLy88IGxpYnJhcnkgcGF0aAorICAgIH07CisKKyAgICBzdHJ1Y3QgSW50ZXJmYWNlIDogcHVibGljIEMySW50ZXJmYWNlSGVscGVyIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RvcmVJb25Vc2FnZUluZm8+IG1Jb25Vc2FnZUluZm87CisKKyAgICAgICAgSW50ZXJmYWNlKHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gcmVmbGVjdG9yKQorICAgICAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihyZWZsZWN0b3IpIHsKKyAgICAgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICAgICAgc3RydWN0IFNldHRlciB7CisgICAgICAgICAgICAgICAgc3RhdGljIEMyUiBzZXRJb25Vc2FnZShib29sIC8qIG1heUJsb2NrICovLCBDMlA8QzJTdG9yZUlvblVzYWdlSW5mbz4gJm1lKSB7CisgICAgICAgICAgICAgICAgICAgIG1lLnNldCgpLmhlYXBNYXNrID0gfjA7CisgICAgICAgICAgICAgICAgICAgIG1lLnNldCgpLmFsbG9jRmxhZ3MgPSAwOworICAgICAgICAgICAgICAgICAgICBtZS5zZXQoKS5taW5BbGlnbm1lbnQgPSAwOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW9uVXNhZ2VJbmZvLCAiaW9uLXVzYWdlIikKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RvcmVJb25Vc2FnZUluZm8oKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtSW9uVXNhZ2VJbmZvLCB1c2FnZSkuZmxhZ3Moe0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEIHwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtSW9uVXNhZ2VJbmZvLCBjYXBhY2l0eSkuaW5SYW5nZSgwLCBVSU5UMzJfTUFYLCAxMDI0KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Jb25Vc2FnZUluZm8sIGhlYXBNYXNrKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Jb25Vc2FnZUluZm8sIGFsbG9jRmxhZ3MpLmZsYWdzKHt9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Jb25Vc2FnZUluZm8sIG1pbkFsaWdubWVudCkuZXF1YWxUbygwKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyOjpzZXRJb25Vc2FnZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgICAgIH0KKyAgICB9OworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBjb21wb25lbnQgbW9kdWxlIGZvciBhIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBtb2R1bGUgcG9pbnRlciB0byBhIHNoYXJlZF9wb2ludGVyIHdoZXJlIHRoZSBjb21wb25lbnQgbW9kdWxlIHdpbGwgYmUgc3RvcmVkIG9uCisgICAgICogICAgICAgICAgICAgICBzdWNjZXNzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBsb2FkZXIgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHJldHJpZXZlZAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGxvY2F0ZSB0aGUgY29tcG9uZW50IGxvYWRlcgorICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIGNvdWxkIG5vdCBsb2NhdGUgdGhlIGNvbXBvbmVudCB0byBiZSBsb2FkZWQKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCB0aGUgY29tcG9uZW50IGxvYWRlciBjb3VsZCBub3QgYmUgaWRlbnRpZmllZCBkdWUgdG8gc29tZSBtb2R1bGVzIGJlaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgY29ycnVwdGVkICh0aGlzIGNhbiBoYXBwZW4gaWYgdGhlIG5hbWUgZG9lcyBub3QgcmVmZXIgdG8gYW4gYWxyZWFkeQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZWQgY29tcG9uZW50IGJ1dCBzb21lIGNvbXBvbmVudHMgY291bGQgbm90IGJlIGxvYWRlZCBkdWUgdG8KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBiYWQgbGlicmFyeSkKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBwZXJtaXNzaW9uIGRlbmllZCB0byBmaW5kIHRoZSBjb21wb25lbnQgbG9hZGVyIGZvciB0aGUgbmFtZWQgY29tcG9uZW50CisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgbmFtZSBkb2VzIG5vdCByZWZlciB0byBhbiBhbHJlYWR5IGlkZW50aWZpZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgYnV0IHNvbWUgY29tcG9uZW50cyBjb3VsZCBub3QgYmUgbG9hZGVkIGR1ZSB0byBsYWNrIG9mCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcGVybWlzc2lvbnMpCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgZmluZENvbXBvbmVudChDMlN0cmluZyBuYW1lLCBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50TW9kdWxlPiAqbW9kdWxlKTsKKworICAgIC8qKgorICAgICAqIExvYWRzIGVhY2ggY29tcG9uZW50IG1vZHVsZSBhbmQgZGlzY292ZXIgaXRzIGNvbnRlbnRzLgorICAgICAqLworICAgIHZvaWQgdmlzaXRDb21wb25lbnRzKCk7CisKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsgLy8vPCBtdXRleCBndWFyZGluZyB0aGUgY29tcG9uZW50IGxpc3RzIGR1cmluZyBjb25zdHJ1Y3Rpb24KKyAgICBib29sIG1WaXNpdGVkOyAvLy88IGNvbXBvbmVudCBtb2R1bGVzIHZpc2l0ZWQKKyAgICBzdGQ6Om1hcDxDMlN0cmluZywgQ29tcG9uZW50TG9hZGVyPiBtQ29tcG9uZW50czsgLy8vPCBwYXRoIC0+IGNvbXBvbmVudCBtb2R1bGUKKyAgICBzdGQ6Om1hcDxDMlN0cmluZywgQzJTdHJpbmc+IG1Db21wb25lbnROYW1lVG9QYXRoOyAvLy88IG5hbWUgLT4gcGF0aAorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4gbUNvbXBvbmVudExpc3Q7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1SZWZsZWN0b3I7CisgICAgSW50ZXJmYWNlIG1JbnRlcmZhY2U7Cit9OworCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudE1vZHVsZTo6aW5pdCgKKyAgICAgICAgc3RkOjpzdHJpbmcgbGliUGF0aCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBBTE9HVigibG9hZGluZyBkbGwiKTsKKyAgICBtTGliSGFuZGxlID0gZGxvcGVuKGxpYlBhdGguY19zdHIoKSwgUlRMRF9OT1d8UlRMRF9OT0RFTEVURSk7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtTGliSGFuZGxlID09IG51bGxwdHIsCisgICAgICAgICAgICAiY291bGQgbm90IGRsb3BlbiAlczogJXMiLCBsaWJQYXRoLmNfc3RyKCksIGRsZXJyb3IoKSk7CisKKyAgICBjcmVhdGVGYWN0b3J5ID0KKyAgICAgICAgKEMyQ29tcG9uZW50RmFjdG9yeTo6Q3JlYXRlQ29kZWMyRmFjdG9yeUZ1bmMpZGxzeW0obUxpYkhhbmRsZSwgIkNyZWF0ZUNvZGVjMkZhY3RvcnkiKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGNyZWF0ZUZhY3RvcnkgPT0gbnVsbHB0ciwKKyAgICAgICAgICAgICJjcmVhdGVGYWN0b3J5IGlzIG51bGwgaW4gJXMiLCBsaWJQYXRoLmNfc3RyKCkpOworCisgICAgZGVzdHJveUZhY3RvcnkgPQorICAgICAgICAoQzJDb21wb25lbnRGYWN0b3J5OjpEZXN0cm95Q29kZWMyRmFjdG9yeUZ1bmMpZGxzeW0obUxpYkhhbmRsZSwgIkRlc3Ryb3lDb2RlYzJGYWN0b3J5Iik7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihkZXN0cm95RmFjdG9yeSA9PSBudWxscHRyLAorICAgICAgICAgICAgImRlc3Ryb3lGYWN0b3J5IGlzIG51bGwgaW4gJXMiLCBsaWJQYXRoLmNfc3RyKCkpOworCisgICAgbUNvbXBvbmVudEZhY3RvcnkgPSBjcmVhdGVGYWN0b3J5KCk7CisgICAgaWYgKG1Db21wb25lbnRGYWN0b3J5ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoImNvdWxkIG5vdCBjcmVhdGUgZmFjdG9yeSBpbiAlcyIsIGxpYlBhdGguY19zdHIoKSk7CisgICAgICAgIG1Jbml0ID0gQzJfTk9fTUVNT1JZOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Jbml0ID0gQzJfT0s7CisgICAgfQorCisgICAgaWYgKG1Jbml0ICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGY7CisgICAgYzJfc3RhdHVzX3QgcmVzID0gY3JlYXRlSW50ZXJmYWNlKDAsICZpbnRmKTsKKyAgICBpZiAocmVzICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJmYWlsZWQgdG8gY3JlYXRlIGludGVyZmFjZTogJWQiLCByZXMpOworICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpUcmFpdHM+IHRyYWl0cyhuZXcgKHN0ZDo6bm90aHJvdykgQzJDb21wb25lbnQ6OlRyYWl0cyk7CisgICAgaWYgKHRyYWl0cykgeworICAgICAgICB0cmFpdHMtPm5hbWUgPSBpbnRmLT5nZXROYW1lKCk7CisKKyAgICAgICAgQzJDb21wb25lbnRLaW5kU2V0dGluZyBraW5kOworICAgICAgICBDMkNvbXBvbmVudERvbWFpblNldHRpbmcgZG9tYWluOworICAgICAgICByZXMgPSBpbnRmLT5xdWVyeV92Yih7ICZraW5kLCAmZG9tYWluIH0sIHt9LCBDMl9NQVlfQkxPQ0ssIG51bGxwdHIpOworICAgICAgICBib29sIGZpeERvbWFpbiA9IHJlcyAhPSBDMl9PSzsKKyAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAgICAgdHJhaXRzLT5raW5kID0ga2luZC52YWx1ZTsKKyAgICAgICAgICAgIHRyYWl0cy0+ZG9tYWluID0gZG9tYWluLnZhbHVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgZmFsbC1iYWNrCisgICAgICAgICAgICBBTE9HRCgiZmFpbGVkIHRvIHF1ZXJ5IGludGVyZmFjZSBmb3Iga2luZCBhbmQgZG9tYWluOiAlZCIsIHJlcyk7CisKKyAgICAgICAgICAgIHRyYWl0cy0+a2luZCA9CisgICAgICAgICAgICAgICAgKHRyYWl0cy0+bmFtZS5maW5kKCJlbmNvZGVyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpID8gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUiA6CisgICAgICAgICAgICAgICAgKHRyYWl0cy0+bmFtZS5maW5kKCJkZWNvZGVyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpID8gQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUiA6CisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfT1RIRVI7CisgICAgICAgIH0KKworICAgICAgICB1aW50MzJfdCBtZWRpYVR5cGVJbmRleCA9CisgICAgICAgICAgICAgICAgdHJhaXRzLT5raW5kID09IEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVIgPyBDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUKKyAgICAgICAgICAgICAgICA6IEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0OjpQQVJBTV9UWVBFOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtczsKKyAgICAgICAgcmVzID0gaW50Zi0+cXVlcnlfdmIoe30sIHsgbWVkaWFUeXBlSW5kZXggfSwgQzJfTUFZX0JMT0NLLCAmcGFyYW1zKTsKKyAgICAgICAgaWYgKHJlcyAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0QoImZhaWxlZCB0byBxdWVyeSBpbnRlcmZhY2U6ICVkIiwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICAgICAgfQorICAgICAgICBpZiAocGFyYW1zLnNpemUoKSAhPSAxdSkgeworICAgICAgICAgICAgQUxPR0QoImZhaWxlZCB0byBxdWVyeSBpbnRlcmZhY2U6IHVuZXhwZWN0ZWQgdmVjdG9yIHNpemU6ICV6dSIsIHBhcmFtcy5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuIG1Jbml0OworICAgICAgICB9CisgICAgICAgIEMyUG9ydE1lZGlhVHlwZVNldHRpbmcgKm1lZGlhVHlwZUNvbmZpZyA9IEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OkZyb20ocGFyYW1zWzBdLmdldCgpKTsKKyAgICAgICAgaWYgKG1lZGlhVHlwZUNvbmZpZyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRCgiZmFpbGVkIHRvIHF1ZXJ5IG1lZGlhIHR5cGUiKTsKKyAgICAgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICAgICAgfQorICAgICAgICB0cmFpdHMtPm1lZGlhVHlwZSA9CisgICAgICAgICAgICBzdGQ6OnN0cmluZyhtZWRpYVR5cGVDb25maWctPm0udmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJubGVuKG1lZGlhVHlwZUNvbmZpZy0+bS52YWx1ZSwgbWVkaWFUeXBlQ29uZmlnLT5mbGV4Q291bnQoKSkpOworCisgICAgICAgIGlmIChmaXhEb21haW4pIHsKKyAgICAgICAgICAgIGlmIChzdHJuY21wKHRyYWl0cy0+bWVkaWFUeXBlLmNfc3RyKCksICJhdWRpby8iLCA2KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdHJhaXRzLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKHRyYWl0cy0+bWVkaWFUeXBlLmNfc3RyKCksICJ2aWRlby8iLCA2KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdHJhaXRzLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKHRyYWl0cy0+bWVkaWFUeXBlLmNfc3RyKCksICJpbWFnZS8iLCA2KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgdHJhaXRzLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX0lNQUdFOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0cmFpdHMtPmRvbWFpbiA9IEMyQ29tcG9uZW50OjpET01BSU5fT1RIRVI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBnZXQgdGhpcyBwcm9wZXJseSBmcm9tIHRoZSBzdG9yZSBkdXJpbmcgZW1wbGFjZQorICAgICAgICBzd2l0Y2ggKHRyYWl0cy0+ZG9tYWluKSB7CisgICAgICAgIGNhc2UgQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTzoKKyAgICAgICAgICAgIHRyYWl0cy0+cmFuayA9IDg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHRyYWl0cy0+cmFuayA9IDUxMjsKKyAgICAgICAgfQorCisgICAgICAgIHBhcmFtcy5jbGVhcigpOworICAgICAgICByZXMgPSBpbnRmLT5xdWVyeV92Yih7fSwgeyBDMkNvbXBvbmVudEFsaWFzZXNTZXR0aW5nOjpQQVJBTV9UWVBFIH0sIEMyX01BWV9CTE9DSywgJnBhcmFtcyk7CisgICAgICAgIGlmIChyZXMgPT0gQzJfT0sgJiYgcGFyYW1zLnNpemUoKSA9PSAxdSkgeworICAgICAgICAgICAgQzJDb21wb25lbnRBbGlhc2VzU2V0dGluZyAqYWxpYXNlc1NldHRpbmcgPQorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50QWxpYXNlc1NldHRpbmc6OkZyb20ocGFyYW1zWzBdLmdldCgpKTsKKyAgICAgICAgICAgIGlmIChhbGlhc2VzU2V0dGluZykgeworICAgICAgICAgICAgICAgIC8vIFNwbGl0IGFsaWFzZXMgb24gJywnCisgICAgICAgICAgICAgICAgLy8gVGhpcyBsb29rcyBzaW1wbGVyIGluIHBsYWluIEMgYW5kIGV2ZW4gc3RkOjpzdHJpbmcgd291bGQgc3RpbGwgbWFrZSBhIGNvcHkuCisgICAgICAgICAgICAgICAgY2hhciAqYWxpYXNlcyA9IDo6c3RybmR1cChhbGlhc2VzU2V0dGluZy0+bS52YWx1ZSwgYWxpYXNlc1NldHRpbmctPmZsZXhDb3VudCgpKTsKKyAgICAgICAgICAgICAgICBBTE9HRCgiJyVzJyBoYXMgYWxpYXNlczogJyVzJyIsIGludGYtPmdldE5hbWUoKS5jX3N0cigpLCBhbGlhc2VzKTsKKworICAgICAgICAgICAgICAgIGZvciAoY2hhciAqdG9rLCAqcHRyLCAqc3RyID0gYWxpYXNlczsgKHRvayA9IDo6c3RydG9rX3Ioc3RyLCAiLCIsICZwdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ciA9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhaXRzLT5hbGlhc2VzLnB1c2hfYmFjayh0b2spOworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiYWRkaW5nIGFsaWFzOiAnJXMnIiwgdG9rKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZnJlZShhbGlhc2VzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtVHJhaXRzID0gdHJhaXRzOworCisgICAgcmV0dXJuIG1Jbml0OworfQorCitDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudE1vZHVsZTo6fkNvbXBvbmVudE1vZHVsZSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgaWYgKGRlc3Ryb3lGYWN0b3J5ICYmIG1Db21wb25lbnRGYWN0b3J5KSB7CisgICAgICAgIGRlc3Ryb3lGYWN0b3J5KG1Db21wb25lbnRGYWN0b3J5KTsKKyAgICB9CisgICAgaWYgKG1MaWJIYW5kbGUpIHsKKyAgICAgICAgQUxPR1YoInVubG9hZGluZyBkbGwiKTsKKyAgICAgICAgZGxjbG9zZShtTGliSGFuZGxlKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Q29tcG9uZW50TW9kdWxlOjpjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAqaW50ZXJmYWNlLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoOjpDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSB7CisgICAgaW50ZXJmYWNlLT5yZXNldCgpOworICAgIGlmIChtSW5pdCAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnRNb2R1bGU+IG1vZHVsZSA9IHNoYXJlZF9mcm9tX3RoaXMoKTsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBtQ29tcG9uZW50RmFjdG9yeS0+Y3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgaWQsIGludGVyZmFjZSwgW21vZHVsZSwgZGVsZXRlcl0oQzJDb21wb25lbnRJbnRlcmZhY2UgKnApIG11dGFibGUgeworICAgICAgICAgICAgICAgIC8vIGNhcHR1cmUgbW9kdWxlIHNvIHRoYXQgd2UgZW5zdXJlIHdlIHN0aWxsIGhhdmUgaXQgd2hpbGUgZGVsZXRpbmcgaW50ZXJmYWNlCisgICAgICAgICAgICAgICAgZGVsZXRlcihwKTsgLy8gZGVsZXRlIGludGVyZmFjZSBmaXJzdAorICAgICAgICAgICAgICAgIG1vZHVsZS5yZXNldCgpOyAvLyByZW1vdmUgbW9kdWxlIHJlZiAobm90IHRlY2huaWNhbGx5IG5lZWRlZCkKKyAgICB9KTsKKyAgICByZXR1cm4gcmVzOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudE1vZHVsZTo6Y3JlYXRlQ29tcG9uZW50KAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gKmNvbXBvbmVudCwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKDo6QzJDb21wb25lbnQqKT4gZGVsZXRlcikgeworICAgIGNvbXBvbmVudC0+cmVzZXQoKTsKKyAgICBpZiAobUluaXQgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0OworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50TW9kdWxlPiBtb2R1bGUgPSBzaGFyZWRfZnJvbV90aGlzKCk7CisgICAgYzJfc3RhdHVzX3QgcmVzID0gbUNvbXBvbmVudEZhY3RvcnktPmNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGlkLCBjb21wb25lbnQsIFttb2R1bGUsIGRlbGV0ZXJdKEMyQ29tcG9uZW50ICpwKSBtdXRhYmxlIHsKKyAgICAgICAgICAgICAgICAvLyBjYXB0dXJlIG1vZHVsZSBzbyB0aGF0IHdlIGVuc3VyZSB3ZSBzdGlsbCBoYXZlIGl0IHdoaWxlIGRlbGV0aW5nIGNvbXBvbmVudAorICAgICAgICAgICAgICAgIGRlbGV0ZXIocCk7IC8vIGRlbGV0ZSBjb21wb25lbnQgZmlyc3QKKyAgICAgICAgICAgICAgICBtb2R1bGUucmVzZXQoKTsgLy8gcmVtb3ZlIG1vZHVsZSByZWYgKG5vdCB0ZWNobmljYWxseSBuZWVkZWQpCisgICAgfSk7CisgICAgcmV0dXJuIHJlczsKK30KKworc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Q29tcG9uZW50TW9kdWxlOjpnZXRUcmFpdHMoKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6OnJlY3Vyc2l2ZV9tdXRleD4gbG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1UcmFpdHM7Cit9CisKK0MyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6QzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCkKKyAgICA6IG1WaXNpdGVkKGZhbHNlKSwKKyAgICAgIG1SZWZsZWN0b3Ioc3RkOjptYWtlX3NoYXJlZDxDMlJlZmxlY3RvckhlbHBlcj4oKSksCisgICAgICBtSW50ZXJmYWNlKG1SZWZsZWN0b3IpIHsKKworICAgIGF1dG8gZW1wbGFjZSA9IFt0aGlzXShjb25zdCBjaGFyICpsaWJQYXRoKSB7CisgICAgICAgIG1Db21wb25lbnRzLmVtcGxhY2UobGliUGF0aCwgbGliUGF0aCk7CisgICAgfTsKKworICAgIC8vIFRPRE86IG1vdmUgdGhpcyBhbHNvIGludG8gYSAuc28gc28gaXQgY2FuIGJlIHVwZGF0ZWQKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9hYWNkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9hYWNlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9hbXJuYmRlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2Ftcm5iZW5jLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfYW1yd2JkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9hbXJ3YmVuYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2F2MWRlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2F2Y2RlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2F2Y2VuYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2ZsYWNkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9mbGFjZW5jLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfZzcxMWFsYXdkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9nNzExbWxhd2RlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2dzbWRlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2gyNjNkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9oMjYzZW5jLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfaGV2Y2RlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2hldmNlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9tcDNkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9tcGVnMmRlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X21wZWc0ZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfbXBlZzRlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9vcHVzZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfb3B1c2VuYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X3Jhd2RlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X3ZvcmJpc2RlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X3ZwOGRlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X3ZwOGVuYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X3ZwOWRlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X3ZwOWVuYy5zbyIpOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OmNvcHlCdWZmZXIoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+IHNyYywgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gZHN0KSB7CisgICAgKHZvaWQpc3JjOworICAgICh2b2lkKWRzdDsKKyAgICByZXR1cm4gQzJfT01JVFRFRDsKK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpxdWVyeV9zbSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpjb25zdCBoZWFwUGFyYW1zKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbnRlcmZhY2UucXVlcnkoc3RhY2tQYXJhbXMsIGhlYXBQYXJhbUluZGljZXMsIEMyX01BWV9CTE9DSywgaGVhcFBhcmFtcyk7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Y29uZmlnX3NtKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+ICpjb25zdCBmYWlsdXJlcykgeworICAgIHJldHVybiBtSW50ZXJmYWNlLmNvbmZpZyhwYXJhbXMsIEMyX01BWV9CTE9DSywgZmFpbHVyZXMpOworfQorCit2b2lkIEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6dmlzaXRDb21wb25lbnRzKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgaWYgKG1WaXNpdGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvICZwYXRoQW5kTG9hZGVyIDogbUNvbXBvbmVudHMpIHsKKyAgICAgICAgY29uc3QgQzJTdHJpbmcgJnBhdGggPSBwYXRoQW5kTG9hZGVyLmZpcnN0OworICAgICAgICBDb21wb25lbnRMb2FkZXIgJmxvYWRlciA9IHBhdGhBbmRMb2FkZXIuc2Vjb25kOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50TW9kdWxlPiBtb2R1bGU7CisgICAgICAgIGlmIChsb2FkZXIuZmV0Y2hNb2R1bGUoJm1vZHVsZSkgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPiB0cmFpdHMgPSBtb2R1bGUtPmdldFRyYWl0cygpOworICAgICAgICAgICAgaWYgKHRyYWl0cykgeworICAgICAgICAgICAgICAgIG1Db21wb25lbnRMaXN0LnB1c2hfYmFjayh0cmFpdHMpOworICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lVG9QYXRoLmVtcGxhY2UodHJhaXRzLT5uYW1lLCBwYXRoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IEMyU3RyaW5nICZhbGlhcyA6IHRyYWl0cy0+YWxpYXNlcykgeworICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZVRvUGF0aC5lbXBsYWNlKGFsaWFzLCBwYXRoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbVZpc2l0ZWQgPSB0cnVlOworfQorCitzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6bGlzdENvbXBvbmVudHMoKSB7CisgICAgLy8gVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiA1MDBtcy4KKyAgICB2aXNpdENvbXBvbmVudHMoKTsKKyAgICByZXR1cm4gbUNvbXBvbmVudExpc3Q7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6ZmluZENvbXBvbmVudCgKKyAgICAgICAgQzJTdHJpbmcgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gKm1vZHVsZSkgeworICAgICgqbW9kdWxlKS5yZXNldCgpOworICAgIHZpc2l0Q29tcG9uZW50cygpOworCisgICAgYXV0byBwb3MgPSBtQ29tcG9uZW50TmFtZVRvUGF0aC5maW5kKG5hbWUpOworICAgIGlmIChwb3MgIT0gbUNvbXBvbmVudE5hbWVUb1BhdGguZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIG1Db21wb25lbnRzLmF0KHBvcy0+c2Vjb25kKS5mZXRjaE1vZHVsZShtb2R1bGUpOworICAgIH0KKyAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OmNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgQzJTdHJpbmcgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiAqY29uc3QgY29tcG9uZW50KSB7CisgICAgLy8gVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiAxMDBtcy4KKyAgICBjb21wb25lbnQtPnJlc2V0KCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gbW9kdWxlOworICAgIGMyX3N0YXR1c190IHJlcyA9IGZpbmRDb21wb25lbnQobmFtZSwgJm1vZHVsZSk7CisgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAvLyBUT0RPOiBnZXQgYSB1bmlxdWUgbm9kZSBJRAorICAgICAgICByZXMgPSBtb2R1bGUtPmNyZWF0ZUNvbXBvbmVudCgwLCBjb21wb25lbnQpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OmNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgQzJTdHJpbmcgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAqY29uc3QgaW50ZXJmYWNlKSB7CisgICAgLy8gVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiAxMDBtcy4KKyAgICBpbnRlcmZhY2UtPnJlc2V0KCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gbW9kdWxlOworICAgIGMyX3N0YXR1c190IHJlcyA9IGZpbmRDb21wb25lbnQobmFtZSwgJm1vZHVsZSk7CisgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAvLyBUT0RPOiBnZXQgYSB1bmlxdWUgbm9kZSBJRAorICAgICAgICByZXMgPSBtb2R1bGUtPmNyZWF0ZUludGVyZmFjZSgwLCBpbnRlcmZhY2UpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OnF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbnRlcmZhY2UucXVlcnlTdXBwb3J0ZWRQYXJhbXMocGFyYW1zKTsKK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpxdWVyeVN1cHBvcnRlZFZhbHVlc19zbSgKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbnRlcmZhY2UucXVlcnlTdXBwb3J0ZWRWYWx1ZXMoZmllbGRzLCBDMl9NQVlfQkxPQ0spOworfQorCitDMlN0cmluZyBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OmdldE5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuICJhbmRyb2lkLmNvbXBvbmVudFN0b3JlLnBsYXRmb3JtIjsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Z2V0UGFyYW1SZWZsZWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIG1SZWZsZWN0b3I7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCkgeworICAgIHN0YXRpYyBzdGQ6Om11dGV4IG11dGV4OworICAgIHN0YXRpYyBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50U3RvcmU+IHBsYXRmb3JtU3RvcmU7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBzdG9yZSA9IHBsYXRmb3JtU3RvcmUubG9jaygpOworICAgIGlmIChzdG9yZSA9PSBudWxscHRyKSB7CisgICAgICAgIHN0b3JlID0gc3RkOjptYWtlX3NoYXJlZDxDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU+KCk7CisgICAgICAgIHBsYXRmb3JtU3RvcmUgPSBzdG9yZTsKKyAgICB9CisgICAgcmV0dXJuIHN0b3JlOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQWxsb2NhdG9yR3JhbGxvYy5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvckdyYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWQ5ODllCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvckdyYWxsb2MuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTVEFHRUZSSUdIVF9DT0RFQzJfQUxMT0NBVE9SX0dSQUxMT0NfSF8KKyNkZWZpbmUgU1RBR0VGUklHSFRfQ09ERUMyX0FMTE9DQVRPUl9HUkFMTE9DX0hfCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFVud3JhcCB0aGUgbmF0aXZlIGhhbmRsZSBmcm9tIGEgQ29kZWMyIGhhbmRsZSBhbGxvY2F0ZWQgYnkgQzJBbGxvY2F0b3JHcmFsbG9jLgorICoKKyAqIEBwYXJhbSBoYW5kbGUgYSBoYW5kbGUgYWxsb2NhdGVkIGJ5IEMyQWxsb2NhdG9yR3JhbGxvYy4gVGhpcyBpbmNsdWRlcyBoYW5kbGVzIHJldHVybmVkIGZvciBhCisgKiBncmFwaGljIGJsb2NrIGFsbG9jYXRpb24gaGFuZGxlIHJldHVybmVkLgorICoKKyAqIEByZXR1cm4gYSBuZXcgTk9OLU9XTklORyBuYXRpdmUgaGFuZGxlIHRoYXQgbXVzdCBiZSBkZWxldGVkIHVzaW5nIG5hdGl2ZV9oYW5kbGVfZGVsZXRlLgorICovCituYXRpdmVfaGFuZGxlX3QgKlVud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSk7CisKKy8qKgorICogV3JhcCB0aGUgZ3JhbGxvYyBoYW5kbGUgYW5kIG1ldGFkYXRhIGludG8gQ29kZWMyIGhhbmRsZSByZWNvZ25pemVkIGJ5CisgKiBDMkFsbG9jYXRvckdyYWxsb2MuCisgKgorICogQHJldHVybiBhIG5ldyBOT04tT1dOSU5HIEMySGFuZGxlIHRoYXQgbXVzdCBiZSBkZWxldGVkIHVzaW5nIG5hdGl2ZV9oYW5kbGVfZGVsZXRlLgorICovCitDMkhhbmRsZSAqV3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqY29uc3QgaGFuZGxlLAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQsIHVpbnQ2NF90IHVzYWdlLCB1aW50MzJfdCBzdHJpZGUsCisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24gPSAwLCB1aW50NjRfdCBpZ2JwX2lkID0gMCwgdWludDMyX3QgaWdicF9zbG90ID0gMCk7CisKKy8qKgorICogXHRvZG8gR2V0IHRoaXMgZnJvbSB0aGUgYnVmZmVyCisgKi8KK3ZvaWQgX1Vud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NNZXRhZGF0YSgKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgdWludDMyX3QgKndpZHRoLCB1aW50MzJfdCAqaGVpZ2h0LCB1aW50MzJfdCAqZm9ybWF0LCB1aW50NjRfdCAqdXNhZ2UsIHVpbnQzMl90ICpzdHJpZGUsCisgICAgICAgIHVpbnQzMl90ICpnZW5lcmF0aW9uLCB1aW50NjRfdCAqaWdicF9pZCwgdWludDMyX3QgKmlnYnBfc2xvdCk7CisKK2NsYXNzIEMyQWxsb2NhdG9yR3JhbGxvYyA6IHB1YmxpYyBDMkFsbG9jYXRvciB7CitwdWJsaWM6CisgICAgdmlydHVhbCBpZF90IGdldElkKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRyYWl0cz4gZ2V0VHJhaXRzKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG5ld0dyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LCBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcHJpb3JHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIG92ZXJyaWRlOworCisgICAgQzJBbGxvY2F0b3JHcmFsbG9jKGlkX3QgaWQsIGJvb2wgYnVmZmVyUXVldWUgPSBmYWxzZSk7CisKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMoKSBjb25zdDsKKworICAgIHZpcnR1YWwgfkMyQWxsb2NhdG9yR3JhbGxvYygpIG92ZXJyaWRlOworCisgICAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBDMkhhbmRsZSogY29uc3Qgbyk7CisKK3ByaXZhdGU6CisgICAgY2xhc3MgSW1wbDsKKyAgICBJbXBsICptSW1wbDsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIFNUQUdFRlJJR0hUX0NPREVDMl9BTExPQ0FUT1JfR1JBTExPQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvcklvbi5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvcklvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiMjA1MWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQWxsb2NhdG9ySW9uLmgKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNUQUdFRlJJR0hUX0NPREVDMl9BTExPQ0FUT1JfSU9OX0hfCisjZGVmaW5lIFNUQUdFRlJJR0hUX0NPREVDMl9BTExPQ0FUT1JfSU9OX0hfCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQzJBbGxvY2F0b3JJb24gOiBwdWJsaWMgQzJBbGxvY2F0b3IgeworcHVibGljOgorICAgIC8vIFVzYWdlIG1hcHBlciBmdW5jdGlvbiB1c2VkIGJ5IHRoZSBhbGxvY2F0b3IKKyAgICAvLyAgICh1c2FnZSwgY2FwYWNpdHkpID0+IChhbGlnbiwgaGVhcE1hc2ssIGZsYWdzKQorICAgIC8vCisgICAgLy8gY2FwYWNpdHkgaXMgYWxpZ25lZCB0byB0aGUgZGVmYXVsdCBibG9jay1zaXplIChkZWZhdWx0cyB0byBwYWdlIHNpemUpIHRvIHJlZHVjZSBjYWNoaW5nCisgICAgLy8gb3ZlcmhlYWQKKyAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248YzJfc3RhdHVzX3QoQzJNZW1vcnlVc2FnZSwgc2l6ZV90LAorICAgICAgICAgICAgICAgICAgICAgIC8qID0+ICovIHNpemVfdCosIHVuc2lnbmVkKiwgdW5zaWduZWQqKT4gVXNhZ2VNYXBwZXJGbjsKKworICAgIHZpcnR1YWwgaWRfdCBnZXRJZCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUcmFpdHM+IGdldFRyYWl0cygpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBuZXdMaW5lYXJBbGxvY2F0aW9uKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHksIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHByaW9yTGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgb3ZlcnJpZGU7CisKKyAgICBDMkFsbG9jYXRvcklvbihpZF90IGlkKTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbUluaXQ7IH0KKworICAgIHZpcnR1YWwgfkMyQWxsb2NhdG9ySW9uKCkgb3ZlcnJpZGU7CisKKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkKGNvbnN0IEMySGFuZGxlKiBjb25zdCBvKTsKKworICAgIC8qKgorICAgICAqIFVwZGF0ZXMgdGhlIHVzYWdlIG1hcHBlciBmb3Igc3Vic2VxdWVudCBuZXcgYWxsb2NhdGlvbnMsIGFzIHdlbGwgYXMgdGhlIHN1cHBvcnRlZAorICAgICAqIG1pbmltdW0gYW5kIG1heGltdW0gdXNhZ2UgbWFza3MgYW5kIGRlZmF1bHQgYmxvY2stc2l6ZSB0byB1c2UgZm9yIHRoZSBtYXBwZXIuCisgICAgICoKKyAgICAgKiBccGFyYW0gbWFwcGVyIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB0byBtYXAgQ29kZWMgMi4wIGJ1ZmZlciB1c2FnZSB0byBpb24gZmxhZ3MKKyAgICAgKiAgICAgICAgcmVxdWlyZWQgYnkgdGhlIGlvbiBkZXZpY2UKKyAgICAgKiBccGFyYW0gbWluVXNhZ2UgbWluaW11bSBidWZmZXIgdXNhZ2UgcmVxdWlyZWQgZm9yIHN1cHBvcnRlZCBhbGxvY2F0aW9ucyAoZGVmYXVsdHMgdG8gMCkKKyAgICAgKiBccGFyYW0gbWF4VXNhZ2UgbWF4aW11bSBidWZmZXIgdXNhZ2Ugc3VwcG9ydGVkIGJ5IHRoZSBpb24gYWxsb2NhdG9yIChkZWZhdWx0cyB0byBTV19SRUFECisgICAgICogICAgICAgIHwgU1dfV1JJVEUpCisgICAgICogXHBhcmFtIGJsb2NrU2l6ZSBhbGlnbm1lbnQgdXNlZCBwcmlvciB0byBjYWxsaW5nIHxtYXBwZXJ8IGZvciB0aGUgYnVmZmVyIGNhcGFjaXR5LgorICAgICAqICAgICAgICBUaGlzIGFsc28gaGVscHMgcmVkdWNlIHRoZSBzaXplIG9mIGNhY2hlIHJlcXVpcmVkIGZvciBjYWNoaW5nIG1hcHBlciByZXN1bHRzLgorICAgICAqICAgICAgICAoZGVmYXVsdHMgdG8gdGhlIHBhZ2Ugc2l6ZSkKKyAgICAgKi8KKyAgICB2b2lkIHNldFVzYWdlTWFwcGVyKAorICAgICAgICAgICAgY29uc3QgVXNhZ2VNYXBwZXJGbiAmbWFwcGVyLCB1aW50NjRfdCBtaW5Vc2FnZSwgdWludDY0X3QgbWF4VXNhZ2UsIHVpbnQ2NF90IGJsb2NrU2l6ZSk7CisKK3ByaXZhdGU6CisgICAgYzJfc3RhdHVzX3QgbWFwVXNhZ2UoQzJNZW1vcnlVc2FnZSB1c2FnZSwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAvKiA9PiAqLyBzaXplX3QgKmFsaWduLCB1bnNpZ25lZCAqaGVhcE1hc2ssIHVuc2lnbmVkICpmbGFncyk7CisKKyAgICBjMl9zdGF0dXNfdCBtSW5pdDsKKyAgICBpbnQgbUlvbkZkOworCisgICAgLy8gdGhpcyBsb2NrcyBtVHJhaXRzLCBtQmxvY2tTaXplLCBtVXNhZ2VNYXBwZXIsIG1Vc2FnZU1hcHBlckxydSBhbmQgbVVzYWdlTWFwcGVyQ2FjaGUKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbVVzYWdlTWFwcGVyTG9jazsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVHJhaXRzPiBtVHJhaXRzOworICAgIHNpemVfdCBtQmxvY2tTaXplOworICAgIFVzYWdlTWFwcGVyRm4gbVVzYWdlTWFwcGVyOworICAgIHR5cGVkZWYgc3RkOjpwYWlyPHVpbnQ2NF90LCBzaXplX3Q+IE1hcHBlcktleTsKKyAgICBzdHJ1Y3QgTWFwcGVyS2V5SGFzaCB7CisgICAgICAgIHN0ZDo6c2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgTWFwcGVyS2V5ICYpIGNvbnN0OworICAgIH07CisgICAgdHlwZWRlZiBzdGQ6OnR1cGxlPHNpemVfdCwgdW5zaWduZWQsIHVuc2lnbmVkLCBjMl9zdGF0dXNfdD4gTWFwcGVyVmFsdWU7CisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8TWFwcGVyS2V5LCBNYXBwZXJWYWx1ZT4gTWFwcGVyS2V5VmFsdWU7CisgICAgdHlwZWRlZiBzdGQ6Omxpc3Q8TWFwcGVyS2V5VmFsdWU+OjppdGVyYXRvciBNYXBwZXJLZXlWYWx1ZVBvaW50ZXI7CisgICAgc3RkOjpsaXN0PE1hcHBlcktleVZhbHVlPiBtVXNhZ2VNYXBwZXJMcnU7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPE1hcHBlcktleSwgTWFwcGVyS2V5VmFsdWVQb2ludGVyLCBNYXBwZXJLZXlIYXNoPiBtVXNhZ2VNYXBwZXJDYWNoZTsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIFNUQUdFRlJJR0hUX0NPREVDMl9BTExPQ0FUT1JfSU9OX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQnFCdWZmZXJQcml2LmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQnFCdWZmZXJQcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFhODEzOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJCcUJ1ZmZlclByaXYuaApAQCAtMCwwICsxLDgwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTVEFHRUZSSUdIVF9DT0RFQzJfQlFfQlVGRkVSX1BSSVZfSF8KKyNkZWZpbmUgU1RBR0VGUklHSFRfQ09ERUMyX0JRX0JVRkZFUl9QUklWX0hfCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2J1ZmZlcnF1ZXVlLzIuMC9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworY2xhc3MgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbCA6IHB1YmxpYyBDMkJsb2NrUG9vbCB7CitwdWJsaWM6CisgICAgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IsIGNvbnN0IGxvY2FsX2lkX3QgbG9jYWxJZCk7CisKKyAgICB2aXJ0dWFsIH5DMkJ1ZmZlclF1ZXVlQmxvY2tQb29sKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUFsbG9jYXRvci0+Z2V0SWQoKTsKKyAgICB9OworCisgICAgdmlydHVhbCBsb2NhbF9pZF90IGdldExvY2FsSWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtTG9jYWxJZDsKKyAgICB9OworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOworCisgICAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQodWludDY0X3QgcHJvZHVjZXIsIGludDMyX3Qgc2xvdCwgaW50NjRfdCBuc2Vjcyk+IE9uUmVuZGVyQ2FsbGJhY2s7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHJlbmRlciBjYWxsYmFjay4KKyAgICAgKgorICAgICAqIFxwYXJhbSByZW5kZXJDYWxsYmFrIGNhbGxiYWNrIHRvIGNhbGwgZm9yIGFsbCBkZXF1ZXVlIGJ1ZmZlci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgc2V0UmVuZGVyQ2FsbGJhY2soY29uc3QgT25SZW5kZXJDYWxsYmFjayAmcmVuZGVyQ2FsbGJhY2sgPSBPblJlbmRlckNhbGxiYWNrKCkpOworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYyXzA6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworICAgIC8qKgorICAgICAqIENvbmZpZ3VyZXMgYW4gSUdCUCBpbiBvcmRlciB0byBjcmVhdGUgYmxvY2tzLiBBIG5ld2x5IGNyZWF0ZWQgYmxvY2sgaXMKKyAgICAgKiBkZXF1ZXVlZCBmcm9tIHRoZSBjb25maWd1cmVkIElHQlAuIFVuaXF1ZSBJZCBvZiBJR0JQIGFuZCB0aGUgc2xvdCBudW1iZXIgb2YKKyAgICAgKiBibG9ja3MgYXJlIHBhc3NlZCB2aWEgbmF0aXZlX2hhbmRsZS4gTWFuYWdpbmcgSUdCUCBpcyByZXNwb25zaWJpbGl0eSBvZiBjYWxsZXIuCisgICAgICogV2hlbiBJR0JQIGlzIG5vdCBjb25maWd1cmVkLCBibG9jayB3aWxsIGJlIGNyZWF0ZWQgdmlhIGFsbG9jYXRvci4KKyAgICAgKiBTaW5jZSB6ZXJvIGlzIG5vdCB1c2VkIGZvciBVbmlxdWUgSWQgb2YgSUdCUCwgaWYgSUdCUCBpcyBub3QgY29uZmlndXJlZCBvciBwcm9kdWNlcgorICAgICAqIGlzIGNvbmZpZ3VyZWQgYXMgbnVsbHB0ciwgdW5pcXVlIGlkIHdoaWNoIGlzIGJ1bmRsZWQgaW4gbmF0aXZlX2hhbmRsZSBpcyB6ZXJvLgorICAgICAqCisgICAgICogXHBhcmFtIHByb2R1Y2VyICAgICAgdGhlIElHQlAsIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBmZXRjaCBibG9ja3MKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgY29uZmlndXJlUHJvZHVjZXIoY29uc3QgYW5kcm9pZDo6c3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gJnByb2R1Y2VyKTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+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+IEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKTsKKworLyoqCisgKiBTZXRzIHRoZSBwcmVmZXJyZWQgY29tcG9uZW50IHN0b3JlIGluIHRoaXMgcHJvY2VzcyBmb3IgdGhlIHNvbGUgcHVycG9zZSBvZiBhY2Nlc3NpbmcgaXRzCisgKiBpbnRlcmZhY2UuIElmIHRoaXMgaXMgbm90IGNhbGxlZCwgdGhlIGRlZmF1bHQgSUNvbXBvbmVudFN0b3JlIEhBTCAoaWYgZXhpc3RzKSBpcyB0aGUgcHJlZmVycmVkCisgKiBzdG9yZSBmb3IgdGhpcyBwdXJwb3NlLiBJZiB0aGUgZGVmYXVsdCBJQ29tcG9uZW50U3RvcmUgSEFMIGlzIG5vdCBwcmVzZW50LCB0aGUgcGxhdGZvcm0KKyAqIGNvbXBvbmVudCBzdG9yZSBpcyB1c2VkLgorICovCit2b2lkIFNldFByZWZlcnJlZENvZGVjMkNvbXBvbmVudFN0b3JlKHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBzdG9yZSk7CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIFNUQUdFRlJJR0hUX0NPREVDMl9QTEFURk9STV9TVVBQT1JUX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL2FuZHJvaWQtQzJEZWJ1Zy1sb2cuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvYW5kcm9pZC1DMkRlYnVnLWxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MTAyMjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL2FuZHJvaWQtQzJEZWJ1Zy1sb2cuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX0FORFJPSURfREVCVUdfTE9HX0hfCisjZGVmaW5lIEMyVVRJTFNfQU5EUk9JRF9ERUJVR19MT0dfSF8KKworLyoKKyAqIEFuZHJvaWQgcHJvdmlkZXMgbG9nZ2luZyBhbmQgZGVidWcgbWFjcm9zLiBSZWRlZmluZSB0aGVtIHdpdGggQzIgcHJlZml4IGFuZCBhZGQgc3VwcG9ydCBmb3IKKyAqIG9wdGluZyBvdXQgb2YgdmVyYm9zZSBsb2dzLgorICovCisKKyNpZmRlZiBDMl9MT0dfVEFHCisjZGVmaW5lIExPR19UQUcgQzJfTE9HX1RBRworI2VuZGlmCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaWZkZWYgQzJfTE9HX1ZFUkJPU0UKKyNkZWZpbmUgQzJfTE9HKExFVkVMKSBMT0coOjphbmRyb2lkOjpiYXNlOjpMRVZFTCkKKyNlbHNlCisvKioKKyAqIFVzZSBhcyBmb2xsb3dzOgorICoKKyAqICNkZWZpbmUgQzJfTE9HX1RBRyAidGFnIgorICogLy8jZGVmaW5lIEMyX0xPR19WRVJCT1NFICAvLyBlbmFibGUgdmVyYm9zZSBsb2dzIGluIHRoaXMgZmlsZQorICogI2luY2x1ZGUgPEMyRGVidWcuaD4KKyAqCisgKiBDMl9MT0coREVCVUcpIDw8IGV4cHIgLi4uOworICoKKyAqIExvZyBsZXZlbHMgYXJlOiBWRVJCT1NFLCBERUJVRywgSU5GTywgV0FSTklORywgRVJST1IsIEZBVEFMIChhYm9ydHMpLgorICoKKyAqIE5vIGVuZGwgaXMgcmVxdWlyZWQuCisgKi8KKyNkZWZpbmUgQzJfTE9HKExFVkVMKSBcCisgICAgICAgICg6OmFuZHJvaWQ6OmJhc2U6OkxFVkVMICE9IDo6YW5kcm9pZDo6YmFzZTo6VkVSQk9TRSkgJiYgTE9HKDo6YW5kcm9pZDo6YmFzZTo6TEVWRUwpCisjZW5kaWYKKworI2RlZmluZSBDMl9DSEVDSyAgICBDSEVDSworI2RlZmluZSBDMl9DSEVDS19MVCBDSEVDS19MVAorI2RlZmluZSBDMl9DSEVDS19MRSBDSEVDS19MRQorI2RlZmluZSBDMl9DSEVDS19FUSBDSEVDS19FUQorI2RlZmluZSBDMl9DSEVDS19HRSBDSEVDS19HRQorI2RlZmluZSBDMl9DSEVDS19HVCBDSEVDS19HVAorI2RlZmluZSBDMl9DSEVDS19ORSBDSEVDS19ORQorCisjZGVmaW5lIEMyX0RDSEVDSyAgICBEQ0hFQ0sKKyNkZWZpbmUgQzJfRENIRUNLX0xUIERDSEVDS19MVAorI2RlZmluZSBDMl9EQ0hFQ0tfTEUgRENIRUNLX0xFCisjZGVmaW5lIEMyX0RDSEVDS19FUSBEQ0hFQ0tfRVEKKyNkZWZpbmUgQzJfRENIRUNLX0dFIERDSEVDS19HRQorI2RlZmluZSBDMl9EQ0hFQ0tfR1QgRENIRUNLX0dUCisjZGVmaW5lIEMyX0RDSEVDS19ORSBEQ0hFQ0tfTkUKKworI2VuZGlmICAvLyBDMlVUSUxTX0FORFJPSURfREVCVUdfTE9HX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3R5cGVzLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQxZDNmOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdHlwZXMuaApAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfVk5ES19UWVBFU19ICisjZGVmaW5lIENPREVDMl9WTkRLX1RZUEVTX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9jb21tb24vMS4yL3R5cGVzLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPHVpL0ZlbmNlLmg+CisjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgorI2luY2x1ZGUgPHVpL1JlZ2lvbi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGdyYXBoaWNzIHsKK25hbWVzcGFjZSBidWZmZXJxdWV1ZSB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCisvLyBTdGF0dXMKKy8vID09PT09PQorCit1c2luZyBIU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMl8wOjoKKyAgICAgICAgU3RhdHVzOworCisvLyBBIHN0YXR1c190IHZhbHVlIG1heSBoYXZlIGZsYWdzIGVuY29kZWQuIFRoZXNlIGZsYWdzIGFyZSBkZWNvZGVkIGludG8gYm9vbGVhbgorLy8gdmFsdWVzIGlmIHRoZWlyIGNvcnJlc3BvbmRpbmcgb3V0cHV0IHBvaW50ZXJzIGFyZSBub3QgbnVsbC4KK2Jvb2wgYjJoKHN0YXR1c190IGZyb20sIEhTdGF0dXMqIHRvLAorICAgICAgICAgYm9vbCogYnVmZmVyTmVlZHNSZWFsbG9jYXRpb24gPSBudWxscHRyLAorICAgICAgICAgYm9vbCogcmVsZWFzZUFsbEJ1ZmZlcnMgPSBudWxscHRyKTsKKy8vIFNpbXBsZSAxLXRvLTEgbWFwcGluZy4gSWYgQlVGRkVSX05FRURTX1JFQUxMT0NBVElPTiBvciBSRUxFQVNFX0FMTF9CVUZGRVJTCisvLyBuZWVkcyB0byBiZSBhZGRlZCwgaXQgbXVzdCBiZSBkb25lIG1hbnVhbGx5IGFmdGVyd2FyZHMuCitib29sIGgyYihIU3RhdHVzIGZyb20sIHN0YXR1c190KiB0byk7CisKKy8vIEZlbmNlCisvLyA9PT09PQorCit1c2luZyBCRmVuY2UgPSA6OmFuZHJvaWQ6OkZlbmNlOworLy8gVGhpcyBjbGFzcyBtYW5hZ2VzIHRoZSBsaWZldGltZSBvZiBhIGNvcGllZCBoYW5kbGUuIEl0cyBkZXN0cnVjdG9yIGNhbGxzCisvLyBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpIGJ1dCBub3QgbmF0aXZlX2hhbmRsZV9jbG9zZSgpLgorc3RydWN0IEhGZW5jZVdyYXBwZXIgeworICAgIEhGZW5jZVdyYXBwZXIoKSA9IGRlZmF1bHQ7CisgICAgLy8gU2V0cyBtSGFuZGxlIHRvIGEgbmV3IHZhbHVlLgorICAgIEhGZW5jZVdyYXBwZXIobmF0aXZlX2hhbmRsZV90KiBoKTsKKyAgICAvLyBEZWxldGVzIG1IYW5kbGUgd2l0aG91dCBjbG9zaW5nLgorICAgIH5IRmVuY2VXcmFwcGVyKCk7CisgICAgLy8gRGVsZXRlcyBtSGFuZGxlIHdpdGhvdXQgY2xvc2luZywgdGhlbiBzZXRzIG1IYW5kbGUgdG8gYSBuZXcgdmFsdWUuCisgICAgSEZlbmNlV3JhcHBlciYgc2V0KG5hdGl2ZV9oYW5kbGVfdCogaCk7CisgICAgSEZlbmNlV3JhcHBlciYgb3BlcmF0b3I9KG5hdGl2ZV9oYW5kbGVfdCogaCk7CisgICAgLy8gUmV0dXJucyBhIG5vbi1vd25pbmcgaGlkbF9oYW5kbGUgcG9pbnRpbmcgdG8gbUhhbmRsZS4KKyAgICBoaWRsX2hhbmRsZSBnZXRIYW5kbGUoKSBjb25zdDsKKyAgICBvcGVyYXRvciBoaWRsX2hhbmRsZSgpIGNvbnN0OworcHJvdGVjdGVkOgorICAgIG5hdGl2ZV9oYW5kbGVfdCogbUhhbmRsZXtudWxscHRyfTsKK307CisKKy8vIERvZXMgbm90IGNsb25lIHRoZSBmZC0tLW9ubHkgY29weSB0aGUgZmQuIFRoZSByZXR1cm5lZCBIRmVuY2VXcmFwcGVyIHNob3VsZAorLy8gbm90IG91dGxpdmUgdGhlIGlucHV0IEZlbmNlIG9iamVjdC4KK2Jvb2wgYjJoKHNwPEJGZW5jZT4gY29uc3QmIGZyb20sIEhGZW5jZVdyYXBwZXIqIHRvKTsKKy8vIENsb25lcyB0aGUgZmQgYW5kIHB1dHMgaXQgaW4gYSBuZXcgRmVuY2Ugb2JqZWN0LgorYm9vbCBoMmIobmF0aXZlX2hhbmRsZV90IGNvbnN0KiBmcm9tLCBzcDxCRmVuY2U+KiB0byk7CisKKy8vIENvbm5lY3Rpb25UeXBlCisvLyA9PT09PT09PT09PT09PQorCit1c2luZyBIQ29ubmVjdGlvblR5cGUgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYyXzA6OgorICAgICAgICBDb25uZWN0aW9uVHlwZTsKKworYm9vbCBiMmgoaW50IGZyb20sIEhDb25uZWN0aW9uVHlwZSogdG8pOworYm9vbCBoMmIoSENvbm5lY3Rpb25UeXBlIGZyb20sIGludCogdG8pOworCisvLyBSZWN0CisvLyA9PT09CisKK3VzaW5nIEJSZWN0ID0gOjphbmRyb2lkOjpSZWN0OwordXNpbmcgSFJlY3QgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8yOjpSZWN0OworCitib29sIGIyaChCUmVjdCBjb25zdCYgZnJvbSwgSFJlY3QqIHRvKTsKK2Jvb2wgaDJiKEhSZWN0IGNvbnN0JiBmcm9tLCBCUmVjdCogdG8pOworCisvLyBSZWdpb24KKy8vID09PT09PQorCit1c2luZyBCUmVnaW9uID0gOjphbmRyb2lkOjpSZWdpb247Cit1c2luZyBIUmVnaW9uID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM8SFJlY3Q+OworCitib29sIGIyaChCUmVnaW9uIGNvbnN0JiBmcm9tLCBIUmVnaW9uKiB0byk7Citib29sIGgyYihIUmVnaW9uIGNvbnN0JiBmcm9tLCBCUmVnaW9uKiB0byk7CisKKy8vIEdyYXBoaWNCdWZmZXIKKy8vID09PT09PT09PT09PT0KKwordXNpbmcgSGFyZHdhcmVCdWZmZXIgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8yOjoKKyAgICAgICAgSGFyZHdhcmVCdWZmZXI7Cit1c2luZyBIYXJkd2FyZUJ1ZmZlckRlc2NyaXB0aW9uID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMjo6CisgICAgICAgIEhhcmR3YXJlQnVmZmVyRGVzY3JpcHRpb247CisKKy8vIERvZXMgbm90IGNsb25lIHRoZSBoYW5kbGUuIFRoZSByZXR1cm5lZCBIYXJkd2FyZUJ1ZmZlciBzaG91bGQgbm90IG91dGxpdmUgdGhlCisvLyBpbnB1dCBHcmFwaGljQnVmZmVyLiBOb3RlIHRoYXQgSGFyZHdhcmVCdWZmZXIgZG9lcyBub3QgY2FycnkgdGhlIGdlbmVyYXRpb24KKy8vIG51bWJlciwgc28gdGhpcyBmdW5jdGlvbiBuZWVkcyBhbm90aGVyIG91dHB1dCBhcmd1bWVudC4KK2Jvb2wgYjJoKHNwPEdyYXBoaWNCdWZmZXI+IGNvbnN0JiBmcm9tLCBIYXJkd2FyZUJ1ZmZlciogdG8sCisgICAgICAgICB1aW50MzJfdCogdG9HZW5lcmF0aW9uTnVtYmVyID0gbnVsbHB0cik7CisvLyBDbG9uZXMgdGhlIGhhbmRsZSBhbmQgY3JlYXRlcyBhIG5ldyBHcmFwaGljQnVmZmVyIGZyb20gdGhlIGNsb25lZCBoYW5kbGUuCisvLyBOb3RlIHRoYXQgdGhlIGdlbmVyYXRpb24gbnVtYmVyIG9mIHRoZSBHcmFwaGljQnVmZmVyIGhhcyB0byBiZSBzZXQgbWFudWFsbHkKKy8vIGFmdGVyd2FyZHMgYmVjYXVzZSBIYXJkd2FyZUJ1ZmZlciBkb2VzIG5vdCBoYXZlIHN1Y2ggaW5mb3JtYXRpb24uCitib29sIGgyYihIYXJkd2FyZUJ1ZmZlciBjb25zdCYgZnJvbSwgc3A8R3JhcGhpY0J1ZmZlcj4qIHRvKTsKKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnF1ZXVlCit9ICAvLyBuYW1lc3BhY2UgZ3JhcGhpY3MKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQzJfVk5ES19UWVBFU19ICisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWJhc2UuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDQwZTQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctYmFzZS5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfREVCVUdfQkFTRV9IXworI2RlZmluZSBDMlVUSUxTX0RFQlVHX0JBU0VfSF8KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisvKioKKyAqIERlYnVnIHByaW50IHV0aWxpdGllcyBmb3IgQ29kZWMgMi4wIGJhc2Ugb2JqZWN0cy4KKyAqLworCisjZGVmaW5lIEMyX0RFQ0xBUkVfQVNfU1RSSU5HX0FORF9ERUZJTkVfU1RSRUFNX09VVCh0eXBlKSBcCitjb25zdCBjaGFyICphc1N0cmluZyh0eXBlIGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpOyBcCitpbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IHR5cGUgJmkpIHsgXAorICAgIHJldHVybiBvcyA8PCBhc1N0cmluZyhpKTsgXAorfQorCitDMl9ERUNMQVJFX0FTX1NUUklOR19BTkRfREVGSU5FX1NUUkVBTV9PVVQoYzJfc3RhdHVzX3QpCisKKworI2VuZGlmICAvLyBDMlVUSUxTX0RFQlVHX0JBU0VfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctaW50ZXJmYWNlLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjMxODc1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctaW50ZXJmYWNlLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19ERUJVR19JTlRFUkZBQ0VfSF8KKyNkZWZpbmUgQzJVVElMU19ERUJVR19JTlRFUkZBQ0VfSF8KKworI2luY2x1ZGUgPHV0aWwvQzJEZWJ1Zy1iYXNlLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZVV0aWxzLmg+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPFQ+ICZpKTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+ICZpKTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+ICZpKTsKKworI2VuZGlmICAvLyBDMlVUSUxTX0RFQlVHX0lOVEVSRkFDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctbG9nLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1sb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTVjNGMxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctbG9nLmgKQEAgLTAsMCArMSwyNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19ERUJVR19MT0dfSF8KKyNkZWZpbmUgQzJVVElMU19ERUJVR19MT0dfSF8KKworLy8gUGxhdGZvcm0gc3BlY2lmaWMgZGVidWcgdXRpbGl0aWVzCisjaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlIDxhbmRyb2lkLUMyRGVidWctbG9nLmg+CisjZWxzZQorLy8gVE9ETzogaW1wbGVtZW50IGJhc2UgZGVidWcgdXRpbHMKKyNlbmRpZgorCisjZW5kaWYgIC8vIEMyVVRJTFNfREVCVUdfTE9HX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1wYXJhbS5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctcGFyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWMxZGUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctcGFyYW0uaApAQCAtMCwwICsxLDM3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX0RFQlVHX1BBUkFNX0hfCisjZGVmaW5lIEMyVVRJTFNfREVCVUdfUEFSQU1fSF8KKworI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctYmFzZS5oPgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKy8qKgorICogRGVidWcvcHJpbnQgZGVjbGFyYXRpb25zIGZvciBvYmplY3RzIGRlZmluZWQgaW4gQzJQYXJhbS5oCisgKi8KK0MyX0RFQ0xBUkVfQVNfU1RSSU5HX0FORF9ERUZJTkVfU1RSRUFNX09VVChDMkZpZWxkRGVzY3JpcHRvcjo6dHlwZV90KQorCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJQYXJhbTo6Q29yZUluZGV4ICZpKTsKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtOjpUeXBlICZpKTsKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtOjpJbmRleCAmaSk7CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgX0MyRmllbGRJZCAmaSk7CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmkpOworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW1GaWVsZCAmaSk7CisKKyNlbmRpZiAgLy8gQzJVVElMU19ERUJVR19QQVJBTV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MySW50ZXJmYWNlSGVscGVyLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmI0M2FmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MySW50ZXJmYWNlSGVscGVyLmgKQEAgLTAsMCArMSw3NTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfSU5URVJGQUNFX0hFTFBFUl9IXworI2RlZmluZSBDMlVUSUxTX0lOVEVSRkFDRV9IRUxQRVJfSF8KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZVV0aWxzLmg+CisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKy8qKgorICogSW50ZXJmYWNlIEhlbHBlcgorICovCit1c2luZyBDMlIgPSBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcjsKKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgYm9vbCBFPXN0ZDo6aXNfZW51bTxUPjo6dmFsdWU+CitzdHJ1Y3QgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZSB7CisgICAgdHlwZWRlZiBUIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGU8VCwgdHJ1ZT4geworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8VD46OnR5cGUgdHlwZTsKK307CisKKy8qKgorICogSGVscGVyIGNsYXNzIHRvIGltcGxlbWVudCBwYXJhbWV0ZXIgcmVmbGVjdG9ycy4gVGhpcyBjbGFzcyBpcyBkeW5hbWljIGFuZCBpcyBkZXNpZ25lZCB0byBiZQorICogc2hhcmVkIGJ5IG11bHRpcGxlIGludGVyZmFjZXMuIFRoaXMgYWxsb3dzIGludGVyZmFjZXMgdG8gYWRkIHN0cnVjdHVyZSBkZXNjcmlwdG9ycyBhcyBuZWVkZWQuCisgKi8KK2NsYXNzIEMyUmVmbGVjdG9ySGVscGVyIDogcHVibGljIEMyUGFyYW1SZWZsZWN0b3IgeworcHVibGljOgorICAgIEMyUmVmbGVjdG9ySGVscGVyKCkgPSBkZWZhdWx0OworICAgIHZpcnR1YWwgfkMyUmVmbGVjdG9ySGVscGVyKCkgPSBkZWZhdWx0OworICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzY3JpYmUoCisgICAgICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggcGFyYW1JbmRleCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHN1cHBvcnQgZm9yIGRlc2NyaWJpbmcgdGhlIGdpdmVuIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBccGFyYW0gUGFyYW1zIHR5cGVzIG9mIGNvZGVjIDIuMCBzdHJ1Y3RzIChvciBwYXJhbWV0ZXJzKSB0byBkZXNjcmliZQorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lLi4uIFBhcmFtcz4KKyAgICBDMl9JTkxJTkUgdm9pZCBhZGRTdHJ1Y3REZXNjcmlwdG9ycygpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJ1Y3REZXNjcmlwdG9yPiBzdHJ1Y3RzOworICAgICAgICBhZGRTdHJ1Y3REZXNjcmlwdG9ycyhzdHJ1Y3RzLCAoX1R1cGxlPFBhcmFtcy4uLj4gKiludWxscHRyKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBBZGRzIHN1cHBvcnQgZm9yIGRlc2NyaWJpbmcgYSBzcGVjaWZpYyBzdHJ1Y3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gc3RydWt0IGRlc2NyaXB0b3IgZm9yIHRoZSBzdHJ1Y3QgdGhhdCB3aWxsIGJlIG1vdmVkIG91dC4KKyAgICAgKi8KKyAgICB2b2lkIGFkZFN0cnVjdERlc2NyaXB0b3IoQzJTdHJ1Y3REZXNjcmlwdG9yICYmc3RydWt0KTsKKworcHJpdmF0ZToKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBQYXJhbXM+CisgICAgY2xhc3MgQzJfSElERSBfVHVwbGUgeyB9OworCisgICAgLyoqCisgICAgICogQWRkcyBzdXBwb3J0IGZvciBkZXNjcmliaW5nIHRoZSBnaXZlbiBkZXNjcmlwdG9ycy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzdHJ1Y3RzIExpc3Qgb2Ygc3RydWN0dXJlIGRlc2NyaXB0b3JzIHRvIGFkZCBzdXBwb3J0IGZvcgorICAgICAqLworICAgIHZvaWQgYWRkU3RydWN0RGVzY3JpcHRvcnMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cnVjdERlc2NyaXB0b3I+ICZzdHJ1Y3RzLCBfVHVwbGU8PiAqKTsKKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgbWV0aG9kIHRoYXQgYWRkcyBzdXBwb3J0IGZvciBkZXNjcmliaW5nIHRoZSBnaXZlbiBkZXNjcmlwdG9ycyBpbiBhIHJlY3Vyc2l2ZSBtYW5uZXIKKyAgICAgKiBvbmUgc3RydWN0dXJlIGF0IGEgdGltZSB1c2luZyBhIGxpc3Qgb2Ygc3RydWN0dXJlIGRlc2NyaXB0b3JzIHRlbXBvcmFyeS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBUIHRoZSB0eXBlIG9mIGNvZGVjIDIuMCBzdHJ1Y3QgdG8gZGVzY3JpYmUKKyAgICAgKiBccGFyYW0gUGFyYW1zIHJlc3Qgb2YgdGhlIHN0cnVjdHMKKyAgICAgKiBccGFyYW0gc3RydWN0cyBUZW1wb3JhcnkgbGlzdCBvZiBzdHJ1Y3R1cmUgZGVzY3JpcHRvcnMgdXNlZCB0byBvcHRpbWl6ZSB0aGUgb3BlcmF0aW9uLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFBhcmFtcz4KKyAgICBDMl9JTkxJTkUgdm9pZCBhZGRTdHJ1Y3REZXNjcmlwdG9ycygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyU3RydWN0RGVzY3JpcHRvcj4gJnN0cnVjdHMsIF9UdXBsZTxULCBQYXJhbXMuLi4+ICopIHsKKyAgICAgICAgc3RydWN0cy5lbXBsYWNlX2JhY2soKFQqKW51bGxwdHIpOworICAgICAgICBhZGRTdHJ1Y3REZXNjcmlwdG9ycyhzdHJ1Y3RzLCAoX1R1cGxlPFBhcmFtcy4uLj4gKiludWxscHRyKTsKKyAgICB9CisKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggX21NdXRleDsKKyAgICBzdGQ6Om1hcDxDMlBhcmFtOjpDb3JlSW5kZXgsIGNvbnN0IEMyU3RydWN0RGVzY3JpcHRvcj4gX21TdHJ1Y3RzOyAvLy88IGRlc2NyaXB0b3JzCit9OworCisvKioKKyAqIFV0aWxpdHkgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBjb2RlYyAyLjAgaW50ZXJmYWNlIEFQSS1zIGZvciBzb21lIHBhcmFtZXRlcnMuCisgKgorICogVGhpcyBjbGFzcyBtdXN0IGJlIHN1YmNsYXNzZWQuCisgKi8KK2NsYXNzIEMySW50ZXJmYWNlSGVscGVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBiYXNlIG9mZnNldCBvZiBhIGZpZWxkIGF0IHxvZmZzZXR8IHRoYXQgY291bGQgYmUgcGFydCBvZiBhbiBhcnJheSBvciBwYXJ0IG9mIGEKKyAgICAgKiBzdWItc3RydWN0dXJlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgZG9lcyBub3QgZG8gZmllbGQgc2l6ZSB2ZXJpZmljYXRpb24sIGUuZy4gaWYgb2Zmc2V0IGlmIG9idGFpbmVkIGZyb20gYSBzdHJ1Y3R1cmUsCisgICAgICogaXQgd2lsbCBub3Qgc3RvcCBhdCB0aGUgc3RydWN0dXJlIGJvdW5kYXJ5IC0gdGhpcyBpcyBva2F5LCBhcyB3ZSBqdXN0IHdhbnQgdGhlIGJhc2Ugb2Zmc2V0CisgICAgICogaGVyZSwgd2hpY2ggaXMgdGhlIHNhbWUuCisgICAgICovCisgICAgc3RhdGljCisgICAgc2l6ZV90IEdldEJhc2VPZmZzZXQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCwgc2l6ZV90IG9mZnNldCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgaW50ZXJmYWNlIGhlbHBlciBjbGFzcyB1c2VzIHJlZmVyZW5jZXMgdG8gc3RkOjpzaGFyZWRfcHRyPFQ+IGNvbmZpZyBwYXJhbWV0ZXJzLgorICAgICAqIEludGVybmFsbHksIHRoZXNlIG5lZWQgdG8gYmUgZ2VuZXJhbGl6ZWQgdG8gc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IHJlZnMsIGJ1dCB0aGUgY2FzdCBpcworICAgICAqIG5vdCBhbGxvd2VkIChhcyB0aGVzZSBhcmUgcmVmZXJlbmNlcykuIEFzIHN1Y2gsIHRoaXMgY2xhc3MgbmV2ZXIgcmV0dXJucyBwb2ludGVyIHRvIHRoZQorICAgICAqIHNoYXJlZF9wdHJzLgorICAgICAqLworICAgIHN0cnVjdCBQYXJhbVJlZiB7CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIGVuYWJsZT0KKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnZlcnRpYmxlPFQsIEMyUGFyYW0+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIGlubGluZSBDMl9ISURFIFBhcmFtUmVmKHN0ZDo6c2hhcmVkX3B0cjxUPiAmcGFyYW0pCisgICAgICAgICAgICA6IF9tUmVmKHJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+Kj4oJnBhcmFtKSkgeyB9CisKKyAgICAgICAgLy8gdXNlZCBieSBjb21wYXJpc29uIG9wZXJhdG9yIGZvciBjb250YWluZXJzCisgICAgICAgIG9wZXJhdG9yIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiAqKCkgY29uc3QgeyByZXR1cm4gX21SZWY7IH0KKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyBhIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBwYXJhbWV0ZXIuCisgICAgICAgICAqLworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gZ2V0KCkgY29uc3QgeyByZXR1cm4gKl9tUmVmOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gKl9tUmVmOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBGaWVsZCBoZWxwZXIuCisgICAgICoKKyAgICAgKiBDb250YWlucyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgZmllbGQ6IHBvc3NpYmxlIHZhbHVlcywgYW5kIGN1cnJlbnRseSBzdXBwb3J0ZWQKKyAgICAgKiB2YWx1ZXMuCisgICAgICovCisgICAgY2xhc3MgRmllbGRIZWxwZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgaGVscGVyIGZvciBhIGZpZWxkIHdpdGggZ2l2ZW4gcG9zc2libGUgdmFsdWVzLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gcGFyYW0gcGFyYW1ldGVyIHJlZmVyZW5jZS4gVGhlIHBhcmFtZXRlciBkb2VzIG5vdCBoYXZlIHRvIGJlIGluaXRpYWxpemVkIGF0IHRoaXMKKyAgICAgICAgICogICAgICAgIHBvaW50LgorICAgICAgICAgKiBccGFyYW0gZmllbGQgZmllbGQgaWRlbnRpZmllcgorICAgICAgICAgKiBccGFyYW0gdmFsdWVzIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIGZpZWxkCisgICAgICAgICAqLworICAgICAgICBGaWVsZEhlbHBlcihjb25zdCBQYXJhbVJlZiAmcGFyYW0sIGNvbnN0IF9DMkZpZWxkSWQgJmZpZWxkLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gJiZ2YWx1ZXMpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgcGFyYW0tZmllbGQgaWRlbnRpZmllciBmb3IgdGhpcyBmaWVsZC4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIHRoZQorICAgICAgICAgKiB1bmRlcmx5aW5nIHBhcmFtZXRlciBoYXMgYmVlbiBpbml0aWFsaXplZC4KKyAgICAgICAgICoKKyAgICAgICAgICogXGFyYW0gaW5kZXgKKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiBDMlBhcmFtRmllbGQKKyAgICAgICAgICovCisgICAgICAgIEMyUGFyYW1GaWVsZCBtYWtlUGFyYW1GaWVsZChDMlBhcmFtOjpJbmRleCBpbmRleCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHMgdGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIGZvciB0aGlzIGZpZWxkLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gdmFsdWVzIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIHRoYXQgd2lsbCBiZSBtb3ZlZCBvdXQKKyAgICAgICAgICovCisgICAgICAgIHZvaWQgc2V0U3VwcG9ydGVkVmFsdWVzKHN0ZDo6dW5pcXVlX3B0cjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPiAmJnZhbHVlcyk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIGZvciB0aGlzIGZpZWxkLiBUaGlzIGRlZmF1bHRzIHRvIHRoZSBwb3NzaWJsZSB2YWx1ZXMKKyAgICAgICAgICogaWYgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgd2VyZSBuZXZlciBzZXQuCisgICAgICAgICAqLworICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICpnZXRTdXBwb3J0ZWRWYWx1ZXMoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogR2V0cyB0aGUgcG9zc2libGUgdmFsdWVzIGZvciB0aGlzIGZpZWxkLgorICAgICAgICAgKi8KKyAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAqZ2V0UG9zc2libGVWYWx1ZXMoKSBjb25zdDsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgLy8gVE9ETzogbW92ZSB0byBpbXBsIGZvciBzYWZldHkKKyAgICAgICAgUGFyYW1SZWYgbVBhcmFtOworICAgICAgICBfQzJGaWVsZElkIG1GaWVsZElkOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gbVBvc3NpYmxlOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gbVN1cHBvcnRlZDsgLy8vPCBpZiBkaWZmZXJlbnQgZnJvbSBwb3NzaWJsZQorICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBDMl9ISURFIFBhcmFtOworICAgIGNsYXNzIFBhcmFtSGVscGVyOworCisgICAgLyoqCisgICAgICogRmFjdG9yeSBpcyBhbiBpbnRlcmZhY2UgdG8gZ2V0IHRoZSBwYXJhbWV0ZXIgaGVscGVycyBmcm9tIGEgc3RkOjpzaGFyZWRfcHRyPFQ+ICYuCisgICAgICovCisgICAgY2xhc3MgRmFjdG9yeSB7CisgICAgICAgIC8vIFx0b2RvIHRoaXMgbWF5IGJlIGFscmVhZHkgaW4gUGFyYW1IZWxwZXIKKyAgICAgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gZ2V0UmVmbGVjdG9yKCkgY29uc3QgPSAwOworCisgICAgICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBnZXRQYXJhbUhlbHBlcihjb25zdCBQYXJhbVJlZiAmcGFyYW0pIGNvbnN0ID0gMDsKKworICAgIHB1YmxpYzoKKyAgICAgICAgdmlydHVhbCB+RmFjdG9yeSgpID0gZGVmYXVsdDsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICBQYXJhbTxUPiBnZXQoc3RkOjpzaGFyZWRfcHRyPFQ+ICZwYXJhbSwgc3RkOjpzaGFyZWRfcHRyPFQ+IGFsdFZhbHVlID0gbnVsbHB0cikgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIFBhcmFtPFQ+KGdldFBhcmFtSGVscGVyKFBhcmFtUmVmKHBhcmFtKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWx0VmFsdWUgPT0gbnVsbHB0ciA/IHBhcmFtIDogYWx0VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmVmbGVjdG9yKCkpOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFR5cGVkIGZpZWxkIGhlbHBlci4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBGaWVsZCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBDb25zdHJ1Y3Rvci4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIGhlbHBlciBoZWxwZXIgZm9yIHRoaXMgZmllbGQKKyAgICAgICAgICogXHBhcmFtIGluZGV4ICBwYXJhbWV0ZXIgaW5kZXggKHRoaXMgaXMgbmVlZGVkIGFzIGl0IGlzIG5vdCBhdmFpbGFibGUgZHVyaW5nIHBhcmFtZXRlcgorICAgICAgICAgKiAgICAgICAgY29uc3RydWN0aW9uKSBcdG9kbyByZW1vdmUKKyAgICAgICAgICovCisgICAgICAgIEZpZWxkKHN0ZDo6c2hhcmVkX3B0cjxGaWVsZEhlbHBlcj4gaGVscGVyLCBDMlBhcmFtOjpJbmRleCBpbmRleCk7CisKKyAgICAgICAgYm9vbCBzdXBwb3J0c0F0QWxsKFQgdmFsdWUpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KCpfbUhlbHBlci0+Z2V0UG9zc2libGVWYWx1ZXMoKSkuc3VwcG9ydHModmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBzdXBwb3J0c05vdyhUIHZhbHVlKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPigqX21IZWxwZXItPmdldFN1cHBvcnRlZFZhbHVlcygpKS5zdXBwb3J0cyh2YWx1ZSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIGNvbmZsaWN0IHJlc29sdXRpb24gc3VnZ2VzdGlvbiBidWlsZGVyIGZvciB0aGlzIGZpZWxkLgorICAgICAgICAgKi8KKyAgICAgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiBzaG91bGRCZSgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGEgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgYnVpbGRlciBmb3IgdGhpcyBmaWVsZC4gVGhpcyBpcyBvbmx5IHN1cHBvcnRlZAorICAgICAgICAgKiBmb3Igbm9uLWNvbnN0IGZpZWxkcyB0byBkaXNhbGxvdyBzZXR0aW5nIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIGRlcGVuZGVuY2llcy4KKyAgICAgICAgICovCisgICAgICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gbXVzdEJlKCk7CisKKyAgICAgICAgb3BlcmF0b3IgQzJQYXJhbUZpZWxkKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIF9tRmllbGQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPCisgICAgICAgIEMyUiB2YWxpZGF0ZVBvc3NpYmxlKGNvbnN0IFQgJnZhbHVlIF9fdW51c2VkKSBjb25zdCB7CisgICAgICAgICAgICAvLy8gVE9ETworICAgICAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEZpZWxkSGVscGVyPiBfbUhlbHBlcjsKKyAgICAgICAgQzJQYXJhbUZpZWxkIF9tRmllbGQ7CisgICAgfTsKKworICAgIGNsYXNzIFBhcmFtSGVscGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIFBhcmFtSGVscGVyKFBhcmFtUmVmIHBhcmFtLCBDMlN0cmluZ0xpdGVyYWwgbmFtZSwgQzJTdHJ1Y3REZXNjcmlwdG9yICYmKTsKKyAgICAgICAgUGFyYW1IZWxwZXIoUGFyYW1IZWxwZXIgJiYpOworICAgICAgICB+UGFyYW1IZWxwZXIoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogRmluZHMgYSBmaWVsZCBkZXNjcmlwdG9yLgorICAgICAgICAgKi8KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEZpZWxkSGVscGVyPiBmaW5kRmllbGQoc2l6ZV90IGJhc2VPZmZzLCBzaXplX3QgYmFzZVNpemUpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBwYXJhbWV0ZXIgcmVmIGZvciB0aGlzIHBhcmFtZXRlcgorICAgICAgICBjb25zdCBQYXJhbVJlZiByZWYoKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGlzIHBhcmFtZXRlciBhcyBtb2RpZmlhYmxlLiBUaGUgY29uc3RuZXNzIG9mIHRoaXMKKyAgICAgICAgLy8vIG9iamVjdCBkZXRlcm1pbmVzIHRoZSBjb25zdG5lc3Mgb2YgdGhlIHJldHVybmVkIHZhbHVlLgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gdmFsdWUoKTsKKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGlzIHBhcmFtZXRlciBhcyBjb25zdAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJQYXJhbT4gdmFsdWUoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUGVyZm9ybXMgYSBjb25maWd1cmF0aW9uIGNoYW5nZSByZXF1ZXN0IGZvciB0aGlzIHBhcmFtZXRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIHZhbHVlICAgIHRoZSB2YWx1ZSB0aGF0IGlzIGJlaW5nIGFzc2lnbmVkIHRvIHRoaXMgcGFyYW1ldGVyLgorICAgICAgICAgKiAgICAgICAgICAgICAgICAgVGhpcyBjb3VsZCBiZSBwb2ludGluZyB0byB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUKKyAgICAgICAgICogICAgICAgICAgICAgICAgIHBhcmFtZXRlci4gVGhpcyBtdXN0IG5vdCBjaGFuZ2UuCisgICAgICAgICAqIFxwYXJhbSBtYXlCbG9jayB3aGV0aGVyIGJsb2NraW5nIGlzIGFsbG93ZWQKKyAgICAgICAgICogXHBhcmFtIGVuZFZhbHVlIHRoZSByZXN1bHRpbmcgdmFsdWUKKyAgICAgICAgICogXHBhcmFtIGZhY3RvcnkgIHBhcmFtZXRlciBmYWN0b3J5ICh0byBhY2Nlc3MgZGVwZW5kZW5jaWVzKQorICAgICAgICAgKiBccGFyYW0gZmFpbHVyZXMgdmVjdG9yIG9mIGZhaWx1cmVzIHRvIGFwcGVuZCBhbnkgZmFpbHVyZXMgZnJvbSB0aGlzCisgICAgICAgICAqICAgICAgICAgICAgICAgICBvcGVyYXRpb24KKyAgICAgICAgICoKKyAgICAgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgY29uZmlndXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSB2YWx1ZSBpcyBpbmNvcnJlY3QgKFRCRCkKKyAgICAgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gcGVyZm9ybSB0aGUgYXNzaWdubWVudAorICAgICAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb25maWd1cmF0aW9uIHRpbWVkIG91dAorICAgICAgICAgKiBccmV0dmFsIEMyX0JMT0NLSU5HICBjb25maWd1cmF0aW9uIHJlcXVpcmVzIGJsb2NraW5nIHRvIGJlIGFsbG93ZWQKKyAgICAgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgaW50ZXJmYWNlIGlzIGNvcnJ1cHRlZAorICAgICAgICAgKi8KKyAgICAgICAgYzJfc3RhdHVzX3QgdHJ5U2V0KAorICAgICAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gKnZhbHVlLCBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgICAgIGJvb2wgKmNoYW5nZWQsCisgICAgICAgICAgICAgICAgRmFjdG9yeSAmZmFjdG9yeSwKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKTsKKworICAgICAgICAvLy8gcmV0dXJucyBwYXJhbWV0ZXIgaW5kaWNlcyB0aGF0IGRlcGVuZCBvbiB0aGlzIHBhcmFtZXRlcgorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gZ2V0RG93bkRlcGVuZGVuY2llcygpIGNvbnN0OworCisgICAgICAgIC8vLyBhZGRzIGEgZGVwZW5kZW50IHBhcmFtZXRlcgorICAgICAgICB2b2lkIGFkZERvd25EZXBlbmRlbmN5KEMyUGFyYW06OkluZGV4IGluZGV4KTsKKworICAgICAgICAvLy8gcmV0dXJucyB0aGF0IHBhcmFtZXRlciByZWZzIGZvciBwYXJhbWV0ZXJzIHRoYXQgZGVwZW5kIG9uIHRoaXMKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UGFyYW1SZWY+IGdldERlcGVuZGVuY2llc0FzUmVmcygpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIGFuZCBtb3ZlcyBvdXQgc3RvcmVkIHN0cnVjdCBkZXNjcmlwdG9yCisgICAgICAgIEMyU3RydWN0RGVzY3JpcHRvciByZXRyaWV2ZVN0cnVjdERlc2NyaXB0b3IoKTsKKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIHBhcmFtZXRlcgorICAgICAgICBDMlN0cmluZyBuYW1lKCkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIGluZGV4IG9mIHRoaXMgcGFyYW1ldGVyCisgICAgICAgIEMyUGFyYW06OkluZGV4IGluZGV4KCkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIHBhcmFtZXRlciBkZXNjcmlwdG9yCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlBhcmFtRGVzY3JpcHRvcj4gZ2V0RGVzY3JpcHRvcigpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBWYWxpZGF0ZXMgcGFyYW0gaGVscGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBGb3Igbm93LCB0aGlzIGZpbGxzIGZpZWxkIGluZm8gZm9yIGNvbnN0IHBhcmFtcy4KKyAgICAgICAgICoKKyAgICAgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgdGhlIHBhcmFtZXRlciBjYW5ub3QgYmUgYWRkZWQgYXMgc3VjaAorICAgICAgICAgKi8KKyAgICAgICAgYzJfc3RhdHVzX3QgdmFsaWRhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpOworCisgICAgcHJvdGVjdGVkOgorICAgICAgICB0eXBlZGVmIEMyUGFyYW1EZXNjcmlwdG9yOjphdHRyaWJfdCBhdHRyaWJfdDsKKyAgICAgICAgYXR0cmliX3QmIGF0dHJpYigpOworCisgICAgICAgIC8vLyBzZXRzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgcGFyYW1ldGVyCisgICAgICAgIHZvaWQgc2V0RGVmYXVsdFZhbHVlKHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBkZWZhdWx0Xyk7CisKKyAgICAgICAgLy8vIHNldHMgdGhlIHNldHRlciBtZXRob2QKKyAgICAgICAgdm9pZCBzZXRTZXR0ZXIoc3RkOjpmdW5jdGlvbjxDMlIoY29uc3QgQzJQYXJhbSAqLCBib29sLCBib29sICosIEZhY3RvcnkgJik+IHNldHRlcik7CisKKyAgICAgICAgLy8vIHNldHMgdGhlIGdldHRlciBtZXRob2QKKyAgICAgICAgdm9pZCBzZXRHZXR0ZXIoc3RkOjpmdW5jdGlvbjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4oYm9vbCk+IGdldHRlcik7CisKKyAgICAgICAgLy8vIHNldHMgdGhlIGRlcGVuZGVuY2llcworICAgICAgICB2b2lkIHNldERlcGVuZGVuY2llcyhzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlcywgc3RkOjp2ZWN0b3I8UGFyYW1SZWY+IHJlZnMpOworCisgICAgICAgIC8vLyBzZXRzIHRoZSBmaWVsZHMgYW5kIHRoZWlyIHN1cHBvcnRlZCB2YWx1ZXMKKyAgICAgICAgdm9pZCBzZXRGaWVsZHMoc3RkOjp2ZWN0b3I8QzJQYXJhbUZpZWxkVmFsdWVzPiAmJmZpZWxkcyk7CisKKyAgICAgICAgLy8vIGJ1aWxkIHRoaXMgaW50byBhIGZpbmFsIFBhcmFtSGVscGVyIG9iamVjdAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IGJ1aWxkKCk7CisKKyAgICAgICAgY2xhc3MgSW1wbDsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEltcGw+IG1JbXBsOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUeXBlZCBwYXJhbWV0ZXIgaGVscGVyLiBUaGlzIHByb3ZpZGVzIGFjY2VzcyB0byBtZW1iZXJzIGFzIHdlbGwgYXMgZmllbGQgaGVscGVycy4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0cnVjdCBDMl9ISURFIFBhcmFtIHsKKyAgICAgICAgUGFyYW0oCisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBoZWxwZXIsIHN0ZDo6c2hhcmVkX3B0cjxUPiAmcGFyYW0sCisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IHJlZmxlY3RvcikKKyAgICAgICAgICAgIDogdigqcGFyYW0uZ2V0KCkpLAorICAgICAgICAgICAgICBfbVR5cGVkUGFyYW0ocGFyYW0pLAorICAgICAgICAgICAgICBfbUhlbHBlcihoZWxwZXIpLAorICAgICAgICAgICAgICBfbVJlZmxlY3RvcihyZWZsZWN0b3IpIHsgfQorCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFM+CisgICAgICAgIHVzaW5nIEZpZWxkVHlwZSA9IEZpZWxkPAorICAgICAgICAgICAgICAgIHR5cGVuYW1lIF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGU8CisgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9jb25zdDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PFM+Ojp0eXBlPjo6dHlwZT46OnR5cGU+OworCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFM+CisgICAgICAgIEZpZWxkVHlwZTxTPiBGKFMgJmZpZWxkKSB7CisgICAgICAgICAgICBzaXplX3Qgb2ZmcyA9ICh1aW50cHRyX3QpJmZpZWxkIC0gKHVpbnRwdHJfdCkmZ2V0KCk7CisgICAgICAgICAgICAvLyB0aGlzIG11c3QgZmFsbCBlaXRoZXIgd2l0aGluIHNpemVvZihUKSArIEZMRVhfU0laRSBvciBwYXJhbS0+c2l6ZSgpCisgICAgICAgICAgICAvLyBzaXplX3Qgc2l6ZSA9IHNpemVvZihmaWVsZCk7CisgICAgICAgICAgICAvLyBtUGFyYW0gbWF5IGJlIG51bGwKKyAgICAgICAgICAgIHNpemVfdCBiYXNlU2l6ZSA9IHNpemVvZih0eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8Uz46OnR5cGUpOworICAgICAgICAgICAgc2l6ZV90IGJhc2VPZmZzID0gR2V0QmFzZU9mZnNldCgKKyAgICAgICAgICAgICAgICAgICAgX21SZWZsZWN0b3IsIFQ6OkNPUkVfSU5ERVgsIG9mZnMgLSBzaXplb2YoQzJQYXJhbSkpOworICAgICAgICAgICAgaWYgKH5iYXNlT2ZmcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gQzJfTE9HKEZBVEFMKSA8PCAidW5rbm93biBmaWVsZCBhdCBvZmZzZXQgIiA8PCBvZmZzIDw8ICIgc2l6ZSAiIDw8IHNpemVvZihTKQorICAgICAgICAgICAgICAgIC8vICAgICAgIDw8ICIgYmFzZS1zaXplICIgPDwgYmFzZVNpemU7CisgICAgICAgICAgICAgICAgLy8gX19idWlsdGluX3RyYXAoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYmFzZU9mZnMgKz0gc2l6ZW9mKEMyUGFyYW0pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8RmllbGRIZWxwZXI+IGhlbHBlciA9IF9tSGVscGVyLT5maW5kRmllbGQoYmFzZU9mZnMsIGJhc2VTaXplKTsKKyAgICAgICAgICAgIHJldHVybiBGaWVsZFR5cGU8Uz4oaGVscGVyLCBfbVR5cGVkUGFyYW0tPmluZGV4KCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY29uc3QgUGFyYW0gaGF2ZSBjb25zdCBGaWVsZHM7IGhvd2V2ZXIsIHJlbW92ZSBjb25zdCBmcm9tIFMKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgUz4KKyAgICAgICAgY29uc3QgRmllbGRUeXBlPFM+IEYoUyAmZmllbGQpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBjb25zdF9jYXN0PGNvbnN0IEZpZWxkVHlwZTxTPj4oY29uc3RfY2FzdDxQYXJhbSAqPih0aGlzKS0+RihmaWVsZCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIFJldHVybnMgYSBjb25zdCByZWYgdmFsdWUgb2YgdGhpcyBjb25zdCBwYXJhbS4KKyAgICAgICAgY29uc3QgVCAmZ2V0KCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuICpfbVR5cGVkUGFyYW0uZ2V0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gUmV0dXJucyBhIG1vZGlmaWFibGUgcmVmIHZhbHVlIG9mIHRoaXMgbm9uLWNvbnN0IHBhcmFtLgorICAgICAgICBUICZzZXQoKSB7CisgICAgICAgICAgICByZXR1cm4gKl9tVHlwZWRQYXJhbS5nZXQoKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyBDb25zdC1yZWZlcmVuY2UgdG8gdGhlIHZhbHVlLnMKKyAgICAgICAgVCBjb25zdCAmdjsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUPiBfbVR5cGVkUGFyYW07CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gX21IZWxwZXI7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBfbVJlZmxlY3RvcjsKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICB1c2luZyBDMlAgPSBQYXJhbTxUPjsKKworICAgIC8qKgorICAgICAqIFRlbXBsYXRlZCBtb3ZlIGJ1aWxkZXIgY2xhc3MgZm9yIGEgcGFyYW1ldGVyIGhlbHBlci4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGNsYXNzIEMyX0hJREUgUGFyYW1CdWlsZGVyIDogcHJpdmF0ZSBQYXJhbUhlbHBlciB7CisgICAgcHVibGljOgorICAgICAgICAvKiogQ29uc3RydWN0IHRoZSBwYXJhbWV0ZXIgYnVpbGRlciBmcm9tIG1pbmltYWwgaW5mbyByZXF1aXJlZC4gKi8KKyAgICAgICAgUGFyYW1CdWlsZGVyKHN0ZDo6c2hhcmVkX3B0cjxUPiAmcGFyYW0sIEMyU3RyaW5nTGl0ZXJhbCBuYW1lKQorICAgICAgICAgICAgOiBQYXJhbUhlbHBlcihwYXJhbSwgbmFtZSwgQzJTdHJ1Y3REZXNjcmlwdG9yKChUKiludWxscHRyKSksCisgICAgICAgICAgICAgIG1UeXBlZFBhcmFtKCZwYXJhbSkgeworICAgICAgICAgICAgYXR0cmliKCkgPSBhdHRyaWJfdDo6SVNfUEVSU0lTVEVOVDsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBNYWtlcyB0aGlzIHBhcmFtZXRlciByZXF1aXJlZC4gKi8KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmcmVxdWlyZWQoKSB7CisgICAgICAgICAgICBhdHRyaWIoKSB8PSBhdHRyaWJfdDo6SVNfUkVRVUlSRUQ7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKiogTWFrZXMgdGhpcyBwYXJhbWV0ZXIgdHJhbnNpZW50IChub3QgcGVyc2lzdGVudCkuICovCisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJnRyYW5zaWVudCgpIHsKKyAgICAgICAgICAgIGF0dHJpYigpICY9IH5hdHRyaWJfdDo6SVNfUEVSU0lTVEVOVDsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBNYWtlcyB0aGlzIHBhcmFtZXRlciBoaWRkZW4gKG5vdCBleHBvc2VkIGluIEpBVkEgQVBJKS4gKi8KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmaGlkZGVuKCkgeworICAgICAgICAgICAgYXR0cmliKCkgfD0gYXR0cmliX3Q6OklTX0hJRERFTjsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBNYWtlcyB0aGlzIHBhcmFtZXRlciBpbnRlcm5hbCAobm90IGV4cG9zZWQgdG8gcXVlcnkvc2V0dGluZ3MpLiAqLworICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZpbnRlcm5hbCgpIHsKKyAgICAgICAgICAgIGF0dHJpYigpIHw9IGF0dHJpYl90OjpJU19JTlRFUk5BTDsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBBZGRzIGRlZmF1bHQgdmFsdWUuIE11c3QgYmUgYWRkZWQgZXhhY3RseSBvbmNlLiAqLworICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZ3aXRoRGVmYXVsdChzdGQ6OnNoYXJlZF9wdHI8VD4gZGVmYXVsdF8pIHsKKyAgICAgICAgICAgIC8vIENIRUNLKCFtRGVmYXVsdFZhbHVlKTsKKyAgICAgICAgICAgIC8vIFdBUk5fSUYoIWRlZmF1bHRfKTsgLy8gY291bGQgYmUgbnVsbHB0ciBpZiBPT00KKyAgICAgICAgICAgIC8vIHRlY2huaWNhbGx5LCB0aGlzIGNvdWxkIGJlIGluIHRoZSBwYXJlbnQKKyAgICAgICAgICAgICptVHlwZWRQYXJhbSA9IHN0ZDo6c2hhcmVkX3B0cjxUPihUOjpGcm9tKEMyUGFyYW06OkNvcHkoKmRlZmF1bHRfKS5yZWxlYXNlKCkpKTsKKyAgICAgICAgICAgIHNldERlZmF1bHRWYWx1ZShkZWZhdWx0Xyk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gKnR5cGVkUGFyYW0gPSBtVHlwZWRQYXJhbTsKKyAgICAgICAgICAgIHNldEdldHRlcihbdHlwZWRQYXJhbV0oYm9vbCkgLT4gc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUGFyYW0+KCp0eXBlZFBhcmFtKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqIEFkZHMgZGVmYXVsdCB2YWx1ZS4gTXVzdCBiZSBhZGRlZCBleGFjdGx5IG9uY2UuICovCisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJndpdGhEZWZhdWx0KFQgKmRlZmF1bHRfKSB7CisgICAgICAgICAgICByZXR1cm4gd2l0aERlZmF1bHQoc3RkOjpzaGFyZWRfcHRyPFQ+KGRlZmF1bHRfKSk7CisgICAgICAgIH0KKworICAgICAgICAvKiogQWRkcyBhbGwgZmllbGRzIHRvIHRoaXMgcGFyYW1ldGVyIHdpdGggdGhlaXIgcG9zc2libGUgdmFsdWVzLiAqLworICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZ3aXRoRmllbGRzKHN0ZDo6dmVjdG9yPEMyUGFyYW1GaWVsZFZhbHVlcz4gJiZmaWVsZHNfKSB7CisgICAgICAgICAgICBzZXRGaWVsZHMoc3RkOjptb3ZlKGZpZWxkc18pKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGRzIGEgY29uc3RhbnQgdmFsdWUgKGFsc28gYXMgZGVmYXVsdCkuIE11c3QgYmUgYWRkZWQgZXhhY3RseSBvbmNlLgorICAgICAgICAgKgorICAgICAgICAgKiBDb25zdCBwYXJhbWV0ZXJzIGJ5IGRlZmluaXRpb24gaGF2ZSBubyBkZXBlbmRlbmNpZXMuCisgICAgICAgICAqLworICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZ3aXRoQ29uc3RWYWx1ZShzdGQ6OnNoYXJlZF9wdHI8VD4gZGVmYXVsdF8pIHsKKyAgICAgICAgICAgIGF0dHJpYigpIHw9IGF0dHJpYl90OjpJU19DT05TVDsKKyAgICAgICAgICAgIHNldFNldHRlcihbZGVmYXVsdF9dKAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlBhcmFtICp2YWx1ZSwgYm9vbCBtYXlCbG9jayBfX3VudXNlZCwgYm9vbCAqY2hhbmdlZCwgRmFjdG9yeSAmKSAtPiBDMlIgeworICAgICAgICAgICAgICAgICpjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgY29uc3QgVCAqdHlwZWRWYWx1ZSA9IFQ6OkZyb20odmFsdWUpOworICAgICAgICAgICAgICAgIGlmICh0eXBlZFZhbHVlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyUjo6Q29ycnVwdGVkKCk7IC8vIFRPRE8gQmFkVmFsdWUvSW52YWxpZC4gVGhpcyBzaG91bGQgbm90IGhhcHBlbiBoZXJlLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKnR5cGVkVmFsdWUgIT0gKmRlZmF1bHRfKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMlI6OkNvcnJ1cHRlZCgpOyAvLyBUT0RPIFJlYWRPbmx5KCpkZWZhdWx0Xyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIHdpdGhEZWZhdWx0KGRlZmF1bHRfKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBBZGRzIGNvbnN0YW50IHZhbHVlIChhbHNvIGFzIGRlZmF1bHQpLiBNdXN0IGJlIGFkZGVkIGV4YWN0bHkgb25jZS4gKi8KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmd2l0aENvbnN0VmFsdWUoVCAqZGVmYXVsdF8pIHsKKyAgICAgICAgICAgIHJldHVybiB3aXRoQ29uc3RWYWx1ZShzdGQ6OnNoYXJlZF9wdHI8VD4oZGVmYXVsdF8pKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2UgYSBzdHJpY3Qgc2V0dGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gZm4gICBzdHJpY3Qgc2V0dGVyCisgICAgICAgICAqIFxwYXJhbSBkZXBzIGRlcGVuZGVuY2llcyAocmVmZXJlbmNlcykKKyAgICAgICAgICovCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLiBEZXBzPgorICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZ3aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgIEMyUiAoKmZuKShib29sLCBjb25zdCBDMlA8VD4gJiwgQzJQPFQ+ICYsIGNvbnN0IEMyUDxEZXBzPiAmLi4uKSwKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8RGVwcz4mIC4uLiBkZXBzKSB7CisgICAgICAgICAgICBhdHRyaWIoKSB8PSBhdHRyaWJfdDo6SVNfU1RSSUNUOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFQ+ICp0eXBlZFBhcmFtID0gbVR5cGVkUGFyYW07CisgICAgICAgICAgICBzZXRTZXR0ZXIoW3R5cGVkUGFyYW0sIGZuLCAmZGVwcy4uLl0oCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gKnZhbHVlLCBib29sIG1heUJsb2NrLCBib29sICpjaGFuZ2VkLCBGYWN0b3J5ICZmYWN0b3J5KSAtPiBDMlIgeworICAgICAgICAgICAgICAgICpjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgY29uc3QgVCAqdHlwZWRWYWx1ZSA9IFQ6OkZyb20odmFsdWUpOworICAgICAgICAgICAgICAgIGlmICh0eXBlZFZhbHVlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyUjo6Q29ycnVwdGVkKCk7IC8vIFRPRE8gQmFkVmFsdWUvSW52YWxpZC4gVGhpcyBzaG91bGQgbm90IGhhcHBlbiBoZXJlLgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBEbyBjb3B5LW9uLWNoYW5nZSBmb3IgcGFyYW1ldGVycyBpbiB0aGlzIGhlbHBlciBzbyBjaGFuZ2UgY2FuIGJlIGRldGVjdGVkIGJ5CisgICAgICAgICAgICAgICAgLy8gYSBjaGFuZ2Ugb2YgdGhlIHBvaW50ZXIuIERvIHRoaXMgYnkgd29ya2luZyBvbiBhIHByb3Bvc2VkIHZhbHVlLgorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUPiBwcm9wb3NlZFZhbHVlID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFQ+KFQ6OkZyb20oQzJQYXJhbTo6Q29weSgqdmFsdWUpLnJlbGVhc2UoKSkpOworICAgICAgICAgICAgICAgIGlmIChwcm9wb3NlZFZhbHVlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyUjo6Tm9NZW1vcnkodmFsdWUtPmluZGV4KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDMlA8VD4gb2xkVmFsdWUgPSBmYWN0b3J5LmdldCgqdHlwZWRQYXJhbSk7CisgICAgICAgICAgICAgICAgLy8gR2V0IGEgcGFyYW1ldGVyIGhlbHBlciB3aXRoIHZhbHVlIHBvaW50aW5nIHRvIHByb3Bvc2VkVmFsdWUKKyAgICAgICAgICAgICAgICBDMlA8VD4gaGVscGVyID0gZmFjdG9yeS5nZXQoKnR5cGVkUGFyYW0sIHByb3Bvc2VkVmFsdWUpOworICAgICAgICAgICAgICAgIEMyUiByZXN1bHQgPSBmbihtYXlCbG9jaywgb2xkVmFsdWUsIGhlbHBlciwgZmFjdG9yeS5nZXQoZGVwcykuLi4pOworCisgICAgICAgICAgICAgICAgLy8gSWYgdmFsdWUgY2hhbmdlZCwgY29weSByZXN1bHQgdG8gY3VycmVudCB2YWx1ZQorICAgICAgICAgICAgICAgIGlmIChoZWxwZXIuZ2V0KCkgIT0gKnR5cGVkUGFyYW0tPmdldCgpKSB7CisgICAgICAgICAgICAgICAgICAgICp0eXBlZFBhcmFtID0gcHJvcG9zZWRWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgKmNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBzZXREZXBlbmRlbmNpZXMoc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+eyBkZXBzLT5pbmRleCgpLi4uIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UGFyYW1SZWY+eyBQYXJhbVJlZihkZXBzKS4uLiB9KTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2UgYSBub24tc3RyaWN0IHNldHRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIGZuICAgbm9uLXN0cmljdCBzZXR0ZXIKKyAgICAgICAgICogXHBhcmFtIGRlcHMgZGVwZW5kZW5jaWVzIChyZWZlcmVuY2VzKQorICAgICAgICAgKi8KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uIERlcHM+CisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJndpdGhTZXR0ZXIoCisgICAgICAgICAgICAgICAgQzJSICgqZm4pKGJvb2wsIEMyUDxUPiAmLCBjb25zdCBDMlA8RGVwcz4gJi4uLiksIHN0ZDo6c2hhcmVkX3B0cjxEZXBzPiYgLi4uIGRlcHMpIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUPiAqdHlwZWRQYXJhbSA9IG1UeXBlZFBhcmFtOworICAgICAgICAgICAgc2V0U2V0dGVyKFt0eXBlZFBhcmFtLCBmbiwgJmRlcHMuLi5dKAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlBhcmFtICp2YWx1ZSwgYm9vbCBtYXlCbG9jaywgYm9vbCAqY2hhbmdlZCwgRmFjdG9yeSAmZmFjdG9yeSkgLT4gQzJSIHsKKyAgICAgICAgICAgICAgICAqY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGNvbnN0IFQgKnR5cGVkVmFsdWUgPSBUOjpGcm9tKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZWRWYWx1ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMlI6OkNvcnJ1cHRlZCgpOyAvLyBUT0RPIEJhZFZhbHVlL0ludmFsaWQuIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gaGVyZS4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gRG8gY29weS1vbi1jaGFuZ2UgZm9yIHBhcmFtZXRlcnMgaW4gdGhpcyBoZWxwZXIgc28gY2hhbmdlIGNhbiBiZSBkZXRlY3RlZCBieQorICAgICAgICAgICAgICAgIC8vIGEgY2hhbmdlIG9mIHRoZSBwb2ludGVyLiBEbyB0aGlzIGJ5IHdvcmtpbmcgb24gYSBwcm9wb3NlZCB2YWx1ZS4KKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gcHJvcG9zZWRWYWx1ZSA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUPihUOjpGcm9tKEMyUGFyYW06OkNvcHkoKnZhbHVlKS5yZWxlYXNlKCkpKTsKKyAgICAgICAgICAgICAgICBpZiAocHJvcG9zZWRWYWx1ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMlI6Ok5vTWVtb3J5KHZhbHVlLT5pbmRleCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gR2V0IGEgcGFyYW1ldGVyIGhlbHBlciB3aXRoIHZhbHVlIHBvaW50aW5nIHRvIHByb3Bvc2VkVmFsdWUKKyAgICAgICAgICAgICAgICBDMlA8VD4gaGVscGVyID0gZmFjdG9yeS5nZXQoKnR5cGVkUGFyYW0sIHByb3Bvc2VkVmFsdWUpOworICAgICAgICAgICAgICAgIEMyUiByZXN1bHQgPSBmbihtYXlCbG9jaywgaGVscGVyLCBmYWN0b3J5LmdldChkZXBzKS4uLik7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB2YWx1ZSBjaGFuZ2VkLCBjb3B5IHJlc3VsdCB0byBjdXJyZW50IHZhbHVlCisgICAgICAgICAgICAgICAgaWYgKGhlbHBlci5nZXQoKSAhPSAqdHlwZWRQYXJhbS0+Z2V0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKnR5cGVkUGFyYW0gPSBwcm9wb3NlZFZhbHVlOworICAgICAgICAgICAgICAgICAgICAqY2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHNldERlcGVuZGVuY2llcyhzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD57IGRlcHMtPmluZGV4KCkuLi4gfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQYXJhbVJlZj57IFBhcmFtUmVmKGRlcHMpLi4uIH0pOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIE1hcmtzIHRoaXMgYSBjYWxjdWxhdGVkIChyZWFkLW9ubHkpIGZpZWxkLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gZm4gICBub24tc3RyaWN0IHNldHRlciAoY2FsY3VsYXRvcikKKyAgICAgICAgICogXHBhcmFtIGRlcHMgZGVwZW5kZW5jaWVzIChyZWZlcmVuY2VzKQorICAgICAgICAgKi8KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uIERlcHM+CisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJmNhbGN1bGF0ZWRBcygKKyAgICAgICAgICAgICAgICBDMlIgKCpmbikoYm9vbCwgQzJQPFQ+ICYsIGNvbnN0IEMyUDxEZXBzPiAmLi4uKSwgc3RkOjpzaGFyZWRfcHRyPERlcHM+JiAuLi4gZGVwcykgeworICAgICAgICAgICAgYXR0cmliKCkgfD0gYXR0cmliX3Q6OklTX1JFQURfT05MWTsKKyAgICAgICAgICAgIHJldHVybiB3aXRoU2V0dGVyKGZuLCBzdGQ6OmZvcndhcmQ8ZGVjbHR5cGUoZGVwcyk+KGRlcHMpLi4uKTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IGJ1aWxkKCkgeworICAgICAgICAgICAgcmV0dXJuIFBhcmFtSGVscGVyOjpidWlsZCgpOworICAgICAgICB9CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUPiAqbVR5cGVkUGFyYW07CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RhdGljIFBhcmFtQnVpbGRlcjxUPiBEZWZpbmVQYXJhbShzdGQ6OnNoYXJlZF9wdHI8VD4gJnBhcmFtLCBDMlN0cmluZ0xpdGVyYWwgbmFtZSkgeworICAgICAgICByZXR1cm4gUGFyYW1CdWlsZGVyPFQ+KHBhcmFtLCBuYW1lKTsKKyAgICB9CisKK3B1YmxpYzoKKyAgICBjMl9zdGF0dXNfdCBxdWVyeSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmc3RhY2tQYXJhbXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgaGVhcFBhcmFtcykgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgaW1wbGVtZW50aW5nIGNvbmZpZyBjYWxscyBhcyB3ZWxsIGFzIG90aGVyIGNvbmZpZ3VyYXRpb24gdXBkYXRlcy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGlzIHZpcnR1YWwsIHNvIGltcGxlbWVudGF0aW9ucyBtYXkgcHJvdmlkZSB3cmFwcGVycyBhcm91bmQgaXQgKGFuZCBwZXJmb3JtCisgICAgICogYWN0aW9ucyBqdXN0IGJlZm9yZSBhbmQgYWZ0ZXIgYSBjb25maWd1cmF0aW9uKS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwYXJhbXMKKyAgICAgKiBccGFyYW0gbWF5QmxvY2sKKyAgICAgKiBccGFyYW0gZmFpbHVyZXMKKyAgICAgKiBccGFyYW0gdXBkYXRlUGFyYW1zIGlmIHRydWUsIHRoZSB1cGRhdGVkIHBhcmFtZXRlciB2YWx1ZXMgYXJlIGNvcGllZCBiYWNrIGludG8gdGhlIGFyZ3VtZW50cworICAgICAqICAgICAgICAgICAgICAgICAgICAgcGFzc2VkIGluIHxwYXJhbXN8CisgICAgICogXHBhcmFtIGNoYW5nZXMgICAgICBwb2ludGVkIHRvIGEgdmVjdG9yIHRvIHJlY2VpdmUgc2V0dGluZ3Mgd2l0aCB0aGVpciB2YWx1ZXMgY2hhbmdlZC4gSWYgbm90CisgICAgICogICAgICAgICAgICAgICAgICAgICBudWxsLCBzZXR0aW5ncyB3aXRoIHRoZWlyIHZhbHVlcyBjaGFuZ2VkIGFyZSBhZGRlZCB0byB0aGlzLgorICAgICAqIFxyZXR1cm4gcmVzdWx0IGZyb20gY29uZmlnCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWcoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMsCisgICAgICAgICAgICBib29sIHVwZGF0ZVBhcmFtcyA9IHRydWUsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4+ICpjaGFuZ2VzID0gbnVsbHB0cik7CisKKyAgICBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICpjb25zdCBwYXJhbXMpIGNvbnN0OworCisgICAgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMsIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBnZXRSZWZsZWN0b3IoKSB7CisgICAgICAgIHJldHVybiBtUmVmbGVjdG9yOworICAgIH0KKworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBMb2NrOworCisgICAgLyoqCisgICAgICogTG9ja3MgdGhlIGludGVyZmFjZSBhbmQgcmV0dXJucyBhIGxvY2suIFRoaXMgbG9jayBtdXN0IGJlIHVubG9ja2VkIG9yIHJlbGVhc2VkIHdpdGhvdXQKKyAgICAgKiBjYWxsaW5nIGFueSBvdGhlciBibG9ja2luZyBjYWxsLgorICAgICAqLworICAgIExvY2sgbG9jaygpIGNvbnN0OworCitwcml2YXRlOgorICAgIHZvaWQgc2V0SW50ZXJmYWNlQWRkcmVzc0JvdW5kcyh1aW50cHRyX3Qgc3RhcnQsIHVpbnRwdHJfdCBlbmQpIHsKKyAgICAgICAgLy8gVE9ETzogZXhjbHVkZSB0aGlzIGhlbHBlcgorICAgICAgICAodm9pZClzdGFydDsKKyAgICAgICAgKHZvaWQpZW5kOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIG11dGFibGUgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtUmVmbGVjdG9yOworICAgIHN0cnVjdCBGYWN0b3J5SW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8RmFjdG9yeUltcGw+IF9tRmFjdG9yeTsKKworICAgIEMySW50ZXJmYWNlSGVscGVyKHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gcmVmbGVjdG9yKTsKKworICAgIC8qKgorICAgICAqIEFkZHMgYSBwYXJhbWV0ZXIgdG8gdGhpcyBpbnRlcmZhY2UuCisgICAgICogXG5vdGUgVGhpcyBtZXRob2QgQ0hFQ0tzLgorICAgICAqCisgICAgICogXHBhcmFtIHBhcmFtIHBhcmFtZXRlciB0byBhZGQuCisgICAgICovCisgICAgdm9pZCBhZGRQYXJhbWV0ZXIoc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBwYXJhbSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkZXBlbmRlbmN5IGluZGV4IGZvciBhIHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpeCB0aGUgaW5kZXggb2YgdGhlIHBhcmFtZXRlcgorICAgICAqLworICAgIHNpemVfdCBnZXREZXBlbmRlbmN5SW5kZXhfbChDMlBhcmFtOjpJbmRleCBpeCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIH5DMkludGVyZmFjZUhlbHBlcigpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIFNldHMgc3ViY2xhc3MgaW5zdGFuY2UncyBhZGRyZXNzIGFuZCBzaXplLgorICAgICAqCisgICAgICogXHRvZG8gYWxsb3cgc3ViY2xhc3MgdG8gc3BlY2lmeSBwYXJhbWV0ZXIgYWRkcmVzcyByYW5nZSBkaXJlY3RseSAoZS5nLiBkbyBub3QgYXNzdW1lIHRoYXQKKyAgICAgKiAgICAgICB0aGV5IGFyZSBsb2NhbCB0byB0aGUgc3ViY2xhc3MgaW5zdGFuY2UpCisgICAgICoKKyAgICAgKiBccGFyYW0gVCB0eXBlIG9mIHRoZSBkZXJpdmVkIGluc3RhbmNlCisgICAgICogXHBhcmFtIGluc3RhbmNlIHBvaW50ZXIgdG8gdGhlIGRlcml2ZWQgaW5zdGFuY2UKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBDMl9ISURFIHZvaWQgc2V0RGVyaXZlZEluc3RhbmNlKFQgKmluc3RhbmNlKSB7CisgICAgICAgIHNldEludGVyZmFjZUFkZHJlc3NCb3VuZHMoKHVpbnRwdHJfdClpbnN0YW5jZSwgKHVpbnRwdHJfdCkoaW5zdGFuY2UgKyAxKSk7CisgICAgfQorCisgICAgQzJfRE9fTk9UX0NPUFkoQzJJbnRlcmZhY2VIZWxwZXIpOworfTsKKworLyoqCisgKiBDcmVhdGVzIGEgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlciBjbGFzcyBmb3IgYSBmaWVsZCBvZiBhIHBhcmFtZXRlcgorICoKKyAqIFxwYXJhbSBzcFBhcmFtIGEgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgaW4gYW4gaW50ZXJmYWNlIGNsYXNzIHN1YmNsYXNzZWQgZnJvbSBDMkludGVyZmFjZUhlbHBlci4KKyAqIFxwYXJhbSBmaWVsZCAgIGEgZmllbGQgb2Ygc3VjaCBwYXJhbWV0ZXIKKyAqLworI2RlZmluZSBDMkYoc3BQYXJhbSwgZmllbGQpIFwKKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPCBcCisgICAgICAgICAgICB0eXBlbmFtZSBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlPCBcCisgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbHR5cGUoc3BQYXJhbS0+ZmllbGQpPjo6dHlwZT46OnR5cGU+Ojp0eXBlPiggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtRmllbGQoc3BQYXJhbS5nZXQoKSwgJnNwUGFyYW0tPmZpZWxkKSkKKworI2VuZGlmICAvLyBDMlVUSUxTX0lOVEVSRkFDRV9IRUxQRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkludGVyZmFjZVV0aWxzLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJJbnRlcmZhY2VVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MDM3ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJJbnRlcmZhY2VVdGlscy5oCkBAIC0wLDAgKzEsMTEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19JTlRFUkZBQ0VfVVRJTFNfSF8KKyNkZWZpbmUgQzJVVElMU19JTlRFUkZBQ0VfVVRJTFNfSF8KKworI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxDMldvcmsuaD4KKworI2luY2x1ZGUgPGNtYXRoPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworLyoqCisgKiBIZWxwZXIgY2xhc3MgdG8gbWFwIHVuZGVybHlpbmcgdHlwZXMgdG8gQzJWYWx1ZSB0eXBlcyBhcyB3ZWxsIGFzIHRvIHByaW50IGZpZWxkIHZhbHVlcy4gVGhpcyBpcworICogZ2VuZXJhbGx5IHRoZSBzYW1lIGFzIHNpbXBseSB0aGUgdW5kZXJseWluZyB0eXBlIGV4Y2VwdCBmb3IgY2hhcmFjdGVycyAoU1RSSU5HKSBhbmQgYnl0ZXMgKEJMT0IpLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IEMyX0hJREUgX0MyRmllbGRWYWx1ZUhlbHBlciB7CisgICAgdHlwZWRlZiBUIFZhbHVlVHlwZTsKKyAgICBpbmxpbmUgc3RhdGljIHN0ZDo6b3N0cmVhbSYgcHV0KHN0ZDo6b3N0cmVhbSAmb3MsIGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcCkgeworICAgICAgICByZXR1cm4gb3MgPDwgcC5yZWY8VD4oKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgQzJfSElERSBfQzJGaWVsZFZhbHVlSGVscGVyPHVpbnQ4X3Q+IHsKKyAgICB0eXBlZGVmIHVpbnQzMl90IFZhbHVlVHlwZTsKKyAgICBzdGF0aWMgc3RkOjpvc3RyZWFtJiBwdXQoc3RkOjpvc3RyZWFtICZvcywgY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZwKTsKK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBDMl9ISURFIF9DMkZpZWxkVmFsdWVIZWxwZXI8Y2hhcj4geworICAgIHR5cGVkZWYgaW50MzJfdCBWYWx1ZVR5cGU7CisgICAgc3RhdGljIHN0ZDo6b3N0cmVhbSYgcHV0KHN0ZDo6b3N0cmVhbSAmb3MsIGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcCk7Cit9OworCisvKioKKyAqIFN1cHBvcnRlZCB2YWx1ZSByYW5nZSB1dGlsaXR5IGZvciBhIGZpZWxkIG9mIGEgZ2l2ZW4gdHlwZS4KKyAqCisgKiBUaGlzIG1pbWljcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWUgZm9yIFJBTkdFIHR5cGUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDMlN1cHBvcnRlZFJhbmdlIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OlZhbHVlVHlwZSBWYWx1ZVR5cGU7CisKKy8vcHJpdmF0ZToKKyAgICBjb25zdGV4cHIgc3RhdGljIFQgTUlOX1ZBTFVFID0gc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWluKCk7CisgICAgY29uc3RleHByIHN0YXRpYyBUIE1BWF9WQUxVRSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1heCgpOworICAgIGNvbnN0ZXhwciBzdGF0aWMgVCBNSU5fU1RFUCA9IHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlID8gMCA6IDE7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IHJhbmdlIHdpdGggbm8gc3VwcG9ydGVkIHZhbHVlcy4KKyAgICAgKgorICAgICAqIFxub3RlIFRoaXMgaXMgYSBzcGVjaWFsaXphdGVkIHN1cHBvcnRlZCByYW5nZSByZXByZXNlbnRhdGlvbiB0aGF0IGlzIG9ubHkgdXNlZCBmb3IKKyAgICAgKiB0aGlzIG9iamVjdCAtIGl0IGlzIGVxdWl2YWxlbnQgdG8gdGhlIEVNUFRZIHR5cGUgaW4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlcy4KKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciBDMlN1cHBvcnRlZFJhbmdlPFQ+IE5vbmUoKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFJhbmdlKE1BWF9WQUxVRSwgTUlOX1ZBTFVFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugd2l0aCBhbGwgdmFsdWVzIHN1cHBvcnRlZC4KKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciBDMlN1cHBvcnRlZFJhbmdlPFQ+IEFueSgpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkUmFuZ2UoTUlOX1ZBTFVFLCBNQVhfVkFMVUUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSB3aXRoIGEgc2luZ2xlIHN1cHBvcnRlZCB2YWx1ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgc29sZSBzdXBwb3J0ZWQgdmFsdWUKKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciBDMlN1cHBvcnRlZFJhbmdlPFQ+IEVxdWFsVG8oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRSYW5nZSh2YWx1ZSwgdmFsdWUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSB3aXRoIHN1cHBvcnRlZCB2YWx1ZXMgZ3JlYXRlciB0aGFuIGEgZ2l2ZW4gdmFsdWUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIGdpdmVuIHZhbHVlCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBDMlN1cHBvcnRlZFJhbmdlPFQ+IEdyZWF0ZXJUaGFuKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuICh2YWx1ZSA9PSBNQVhfVkFMVUUgPyBOb25lKCkgOgorICAgICAgICAgICAgICAgIHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlID8KKyAgICAgICAgICAgICAgICAgICAgICAgIEMyU3VwcG9ydGVkUmFuZ2Uoc3RkOjpuZXh0YWZ0ZXIodmFsdWUsIE1BWF9WQUxVRSksIE1BWF9WQUxVRSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdXBwb3J0ZWRSYW5nZSh2YWx1ZSArIE1JTl9TVEVQLCBNQVhfVkFMVUUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugd2l0aCBzdXBwb3J0ZWQgdmFsdWVzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBhIGdpdmVuIHZhbHVlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSBnaXZlbiB2YWx1ZQorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByIEMyU3VwcG9ydGVkUmFuZ2U8VD4gR3JlYXRlclRoYW5PckVxdWFsVG8oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRSYW5nZSh2YWx1ZSwgTUFYX1ZBTFVFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugd2l0aCBzdXBwb3J0ZWQgdmFsdWVzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAoYWthIG5vdCBsZXNzIHRoYW4pIGEgZ2l2ZW4KKyAgICAgKiB2YWx1ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgZ2l2ZW4gdmFsdWUKKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciBDMlN1cHBvcnRlZFJhbmdlPFQ+IE5vdExlc3NUaGFuKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIEdyZWF0ZXJUaGFuT3JFcXVhbFRvKHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugd2l0aCBzdXBwb3J0ZWQgdmFsdWVzIGxlc3MgdGhhbiBvciBlcXVhbCB0byBhIGdpdmVuIHZhbHVlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSBnaXZlbiB2YWx1ZQorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByIEMyU3VwcG9ydGVkUmFuZ2U8VD4gTGVzc1RoYW5PckVxdWFsVG8oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRSYW5nZShNSU5fVkFMVUUsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugd2l0aCBzdXBwb3J0ZWQgdmFsdWVzIGxlc3MgdGhhbiBvciBlcXVhbCB0byAoYWthIG5vdCBncmVhdGVyIHRoYW4pIGEgZ2l2ZW4KKyAgICAgKiB2YWx1ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgZ2l2ZW4gdmFsdWUKKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciBDMlN1cHBvcnRlZFJhbmdlPFQ+IE5vdEdyZWF0ZXJUaGFuKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIExlc3NUaGFuT3JFcXVhbFRvKHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugd2l0aCBzdXBwb3J0ZWQgdmFsdWVzIGxlc3MgdGhhbiBhIGdpdmVuIHZhbHVlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSBnaXZlbiB2YWx1ZQorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgQzJTdXBwb3J0ZWRSYW5nZTxUPiBMZXNzVGhhbihUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiAodmFsdWUgPT0gTUlOX1ZBTFVFID8gTm9uZSgpIDoKKyAgICAgICAgICAgICAgICBzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZSA/CisgICAgICAgICAgICAgICAgICAgICAgICBDMlN1cHBvcnRlZFJhbmdlKE1JTl9WQUxVRSwgc3RkOjpuZXh0YWZ0ZXIodmFsdWUsIE1JTl9WQUxVRSkpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyU3VwcG9ydGVkUmFuZ2UoTUlOX1ZBTFVFLCB2YWx1ZSAtIE1JTl9TVEVQKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGNvbnRpbnVvdXMgb3IgYXJpdGhtZXRpYyByYW5nZSBiZXR3ZWVuIHR3byB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gbWluIHRoZSBsb3dlciB2YWx1ZQorICAgICAqIFxwYXJhbSBtYXggdGhlIGhpZ2hlciB2YWx1ZSAoaWYgdGhpcyBpcyBsb3dlciB0aGFuIHxtaW58IHRoZSByYW5nZSB3aWxsIGJlIGVtcHR5KQorICAgICAqIFxwYXJhbSBzdGVwIHRoZSBzdGVwIG9mIHRoZSBhcml0aG1ldGljIHJhbmdlLiAoSWYgdGhpcyBpcyAwIGZvciBmbG9hdGluZyBwb2ludCB0eXBlcyBvciAxIGZvcgorICAgICAqICAgICAgICBpbnRlZ2VyIHR5cGVzLCB0aGUgY29uc3RydWN0ZWQgcmFuZ2UgaXMgY29udGludW91cykKKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwcgorICAgIEMyU3VwcG9ydGVkUmFuZ2U8VD4gSW5SYW5nZShUIG1pbiwgVCBtYXgsIFQgc3RlcCA9IE1JTl9TVEVQKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFJhbmdlKG1pbiwgbWF4LCBzdGVwKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugb3ZlciBhIGdlb21ldHJpYyBzZXJpZXMgYmV0d2VlbiB0d28gdmFsdWVzLgorICAgICAqCisgICAgICogXHBhcmFtIG1pbiB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIHJhbmdlLiBUaGlzIHZhbHVlIGlzIGFsd2F5cyBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZCByYW5nZQorICAgICAqICAgICAgICBhcyBsb25nIGFzIGl0IGlzIG5vdCBncmVhdGVyIHRoYW4gfG1heHwuCisgICAgICogXHBhcmFtIG1heCB0aGUgdXBwZXIgYm91bmQgb2YgdGhlIHJhbmdlLiBUaGlzIHZhbHVlIGlzIG9ubHkgcGFydCBvZiB0aGUgY29uc3RydWN0ZWQKKyAgICAgKiAgICAgICAgcmFuZ2UgaWYgaXQgaXMgcGFydCBvZiB0aGUgZ2VvbWV0cmljIHNlcmllcy4KKyAgICAgKiBccGFyYW0gbnVtIHRoZSBudW1lcmF0b3Igb2YgdGhlIGdlb21ldHJpYyBzZXJpZXMuCisgICAgICogXHBhcmFtIGRlbm9tIHRoZSBkZW5vbWluYXRvciBvZiB0aGUgZ2VvbWV0cmljIHNlcmllcy4KKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwcgorICAgIEMyU3VwcG9ydGVkUmFuZ2U8VD4gSW5TZXJpZXMoVCBtaW4sIFQgbWF4LCBUIG51bSwgVCBkZW5vbSkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRSYW5nZShtaW4sIG1heCwgMCwgbnVtLCBkZW5vbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIG92ZXIgYSBtdWx0aXBseS1hY2N1bXVsYXRlIHNlcmllcyBiZXR3ZWVuIHR3byB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gbWluIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgcmFuZ2UuIFRoaXMgdmFsdWUgaXMgYWx3YXlzIHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkIHJhbmdlCisgICAgICogICAgICAgIGFzIGxvbmcgYXMgaXQgaXMgbm90IGdyZWF0ZXIgdGhhbiB8bWF4fC4KKyAgICAgKiBccGFyYW0gbWF4IHRoZSB1cHBlciBib3VuZCBvZiB0aGUgcmFuZ2UuIFRoaXMgdmFsdWUgaXMgb25seSBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZAorICAgICAqICAgICAgICByYW5nZSBpZiBpdCBpcyBwYXJ0IG9mIHRoZSBzZXJpZXMuCisgICAgICogXHBhcmFtIHN0ZXAgdGhlIGFjY3VtdWxhdG9yIG9mIHRoZSBtdWx0aXBseS1hY2N1bXVsYXRlIHNlcmllcworICAgICAqIFxwYXJhbSBudW0gdGhlIG51bWVyYXRvciBvZiB0aGUgbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMuCisgICAgICogXHBhcmFtIGRlbm9tIHRoZSBkZW5vbWluYXRvciBvZiB0aGUgbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMuCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIKKyAgICBDMlN1cHBvcnRlZFJhbmdlPFQ+IEluTWFjU2VyaWVzKFQgbWluLCBUIG1heCwgVCBzdGVwLCBUIG51bSwgVCBkZW5vbSkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRSYW5nZShtaW4sIG1heCwgc3RlcCwgbnVtLCBkZW5vbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIGZyb20gYSBnZW5lcmljIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgb2JqZWN0LiBUaGlzIHdpbGwgYmUgYW4gZW1wdHkKKyAgICAgKiByYW5nZSBpZiB0aGUgc3VwcG9ydGVkIHZhbHVlcyBhcmUgbm90IG9mIFJBTkdFIHR5cGUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWVzIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIG9iamVjdAorICAgICAqLworICAgIEMyU3VwcG9ydGVkUmFuZ2UoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsdWVzKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHJhbmdlIGlzIGVtcHR5LgorICAgICAqLworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBpc0VtcHR5KCkgY29uc3QgeworICAgICAgICByZXR1cm4gX21NaW4gPiBfbU1heDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyByYW5nZSBpcyB2YWxpZC4KKyAgICAgKgorICAgICAqIFJhbmdlcyBhcmUgdmFsaWQgaWYgdGhleSBhcmUgY29udGludW91cyBvciBtb25vdG9uaWMuCisgICAgICovCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIGlzVmFsaWQoKSBjb25zdCB7CisgICAgICAgIC8vIFRPRE86IGhhbmRsZSBvdmVyZmxvdyBvciBuZWdhdGl2ZSBzZXJpZXMKKyAgICAgICAgcmV0dXJuIF9tRGVub20gPiAwICYmIF9tTnVtID49IF9tRGVub20gJiYgX21NaW4gKiAoX21EZW5vbSAtIF9tTnVtKSA8IF9tU3RlcCAqIF9tRGVub207CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIGEgdmFsdWUgaXMgcGFydCBvZiB0aGlzIHJhbmdlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgKi8KKyAgICBib29sIGNvbnRhaW5zKFQgdmFsdWUpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5ldyByYW5nZSB0aGF0IGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhpcyByYW5nZSBhbmQgYW5vdGhlciwgaWYgaXQgaXMKKyAgICAgKiByZXByZXNlbnRhYmxlIGFzIGEgcmFuZ2Ugb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIGxpbWl0IHRoZSBvdGhlciByYW5nZQorICAgICAqLworICAgIEMyU3VwcG9ydGVkUmFuZ2U8VD4gbGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8VD4gJmxpbWl0KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyBvYmplY3QuCisgICAgICovCisgICAgaW5saW5lIG9wZXJhdG9yIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKF9tTWluLCBfbU1heCwgX21TdGVwLCBfbU51bSwgX21EZW5vbSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbG93ZXIgYm91bmQgYW5kIHN0YXJ0aW5nIHBvaW50IG9mIHRoaXMgcmFuZ2UuCisgICAgICovCisgICAgaW5saW5lIEMyX0hJREUgY29uc3RleHByIFQgbWluKCkgY29uc3QgICB7IHJldHVybiBfbU1pbjsgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB1cHBlciBib3VuZCBvZiB0aGlzIHJhbmdlLgorICAgICAqLworICAgIGlubGluZSBDMl9ISURFIGNvbnN0ZXhwciBUIG1heCgpIGNvbnN0ICAgeyByZXR1cm4gX21NYXg7ICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3RlcCBvZiB0aGlzIHJhbmdlLgorICAgICAqLworICAgIGlubGluZSBDMl9ISURFIGNvbnN0ZXhwciBUIHN0ZXAoKSBjb25zdCAgeyByZXR1cm4gX21TdGVwOyAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbnVtZXJhdG9yIG9mIHRoaXMgcmFuZ2UuCisgICAgICovCisgICAgaW5saW5lIEMyX0hJREUgY29uc3RleHByIFQgbnVtKCkgY29uc3QgICB7IHJldHVybiBfbU51bTsgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkZW5vbWluYXRvciBvZiB0aGlzIHJhbmdlLgorICAgICAqLworICAgIGlubGluZSBDMl9ISURFIGNvbnN0ZXhwciBUIGRlbm9tKCkgY29uc3QgeyByZXR1cm4gX21EZW5vbTsgfQorCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB4W2kuLi5dIGlzIGFsbCB2YWx1ZXMgYmV0d2VlbiBfbU1pbiBhbmQgX21NYXguCisgICAgICovCisgICAgaW5saW5lIEMyX0hJREUgY29uc3RleHByIGJvb2wgaXNTaW1wbGVSYW5nZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tU3RlcCA9PSBNSU5fU1RFUCAmJiBfbU51bSA9PSAxICYmIF9tRGVub20gPT0gMTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgeFtpLi4uXSBpcyBkZWZpbmVkIGFzIHN1Y2g6CisgICAgICogeFtpICsgMV0gPSB4W2ldICsgX21TdGVwLCB3aGVyZSBfbVN0ZXAgPiAwIGFuZCBfbU1pbiA8PSB4W2ldIDw9IF9tTWF4CisgICAgICovCisgICAgaW5saW5lIEMyX0hJREUgY29uc3RleHByIGJvb2wgaXNBcml0aG1ldGljU2VyaWVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gX21TdGVwID4gTUlOX1NURVAgJiYgX21OdW0gPT0gMSAmJiBfbURlbm9tID09IDE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHhbaS4uLl0gaXMgZGVmaW5lZCBhcyBzdWNoOgorICAgICAqIHhbaV0gPSB4WzBdICogKF9tTnVtIC8gX21EZW5vbSkgXiBpICh3aXRoIHJvdW5kaW5nKSwgd2hlcmUgX21OdW0gPiBfbURlbm9tID4gMCBhbmQgeFswXSA+IDAKKyAgICAgKi8KKyAgICBpbmxpbmUgQzJfSElERSBjb25zdGV4cHIgYm9vbCBpc0dlb21ldHJpY1NlcmllcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tTWluID4gMCAmJiBfbVN0ZXAgPT0gMCAmJiBfbU51bSA+IF9tRGVub20gJiYgX21EZW5vbSA+IDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHhbaS4uLl0gaXMgZGVmaW5lZCBhcyBzdWNoOgorICAgICAqIHhbaSArIDFdID0geFtpXSAqIF9tTnVtIC8gX21EZW5vbSArIF9tU3RlcCAod2l0aCByb3VuZGluZyksIHdoaWxlIHhbaSArIDFdID4geFtpXSwgd2hlcmUKKyAgICAgKiBfbVN0ZXAgIT0gMCwgX21EZW5vbSA+IDAgYW5kIF9tTnVtID4gMAorICAgICAqLworICAgIGlubGluZSBDMl9ISURFIGNvbnN0ZXhwciBib29sIGlzTWFjU2VyaWVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gX21TdGVwICE9IDAgJiYgX21OdW0gPiAwICYmIF9tRGVub20gPiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gYXJpdGhtZXRpYyBvciBjb250aW51b3VzIHJhbmdlLgorICAgICAqCisgICAgICogXHBhcmFtIG1pbiB0aGUgbG93ZXIgdmFsdWUKKyAgICAgKiBccGFyYW0gbWF4IHRoZSBoaWdoZXIgdmFsdWUgKGlmIHRoaXMgaXMgbG93ZXIgdGhhbiB8bWlufCB0aGUgcmFuZ2Ugd2lsbCBiZSBlbXB0eSkKKyAgICAgKiBccGFyYW0gc3RlcCB0aGUgc3RlcCBvZiB0aGUgYXJpdGhtZXRpYyByYW5nZS4gKElmIHRoaXMgaXMgMCBmb3IgZmxvYXRpbmcgcG9pbnQgdHlwZXMgb3IgMSBmb3IKKyAgICAgKiAgICAgICAgaW50ZWdlciB0eXBlcywgdGhlIGNvbnN0cnVjdGVkIHJhbmdlIGlzIGNvbnRpbnVvdXMpCisgICAgICovCisgICAgY29uc3RleHByIEMyX0hJREUgQzJTdXBwb3J0ZWRSYW5nZShUIG1pbiwgVCBtYXgsIFQgc3RlcCA9IFQoc3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWUgPyAwIDogMSkpCisgICAgICAgIDogX21NaW4obWluKSwgX21NYXgobWF4KSwgX21TdGVwKHN0ZXApLCBfbU51bSgxKSwgX21EZW5vbSgxKSB7IH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSBvdmVyIGEgZ2VvbWVydGljIHNvciBtdWx0aXBseS1hY2N1bXVsYXRlIHNlcmllcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBtaW4gdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSByYW5nZS4gVGhpcyB2YWx1ZSBpcyBhbHdheXMgcGFydCBvZiB0aGUgY29uc3RydWN0ZWQgcmFuZ2UKKyAgICAgKiAgICAgICAgYXMgbG9uZyBhcyBpdCBpcyBub3QgZ3JlYXRlciB0aGFuIHxtYXh8LgorICAgICAqIFxwYXJhbSBtYXggdGhlIHVwcGVyIGJvdW5kIG9mIHRoZSByYW5nZS4gVGhpcyB2YWx1ZSBpcyBvbmx5IHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkCisgICAgICogICAgICAgIHJhbmdlIGlmIGl0IGlzIHBhcnQgb2YgdGhlIGdlb21ldHJpYyBzZXJpZXMuCisgICAgICogXHBhcmFtIHN0ZXAgdGhlIGFjY3VtdWxhdG9yIG9mIHRoZSBtdWx0aXBseS1hY2N1bXVsYXRlIHNlcmllcy4gVGhpcyBpcyAwIGZvciBhIHB1cmUgZ2VvbWV0cmljCisgICAgICogICAgICAgIHNlcmllcworICAgICAqIFxwYXJhbSBudW0gdGhlIG51bWVyYXRvciBvZiB0aGUgZ2VvbWV0cmljIHNlcmllcy4KKyAgICAgKiBccGFyYW0gZGVub20gdGhlIGRlbm9taW5hdG9yIG9mIHRoZSBnZW9tZXRyaWMgc2VyaWVzLgorICAgICAqLworICAgIGNvbnN0ZXhwciBDMl9ISURFIEMyU3VwcG9ydGVkUmFuZ2UoVCBtaW4sIFQgbWF4LCBUIHN0ZXAsIFQgbnVtLCBUIGRlbikKKyAgICAgICAgOiBfbU1pbihtaW4pLCBfbU1heChtYXgpLCBfbVN0ZXAoc3RlcCksIF9tTnVtKG51bSksIF9tRGVub20oZGVuKSB7IH0KKworICAgIFQgX21NaW47IC8vLzwgbG93ZXIgYm91bmQgYW5kIHN0YXJ0aW5nIHBvaW50CisgICAgVCBfbU1heDsgLy8vPCB1cHBlciBib3VuZAorICAgIFQgX21TdGVwOyAvLy88IHN0ZXAgb2YgYW4gYXJpdGhtZXRpYyBzZXJpZXMgKDAgaWYgY29udGludW91cyBmbG9hdGluZyBwb2ludCByYW5nZSkKKyAgICBUIF9tTnVtOyAvLy88IG51bWVyYXRvciBvZiBhIGdlb21ldHJpYyBzZXJpZXMKKyAgICBUIF9tRGVub207IC8vLzwgZGVub21pbmF0b3Igb2YgYSBnZW9tZXRyaWMgc2VyaWVzCit9OworCisvKioKKyAqIE9yZGVyZWQgc3VwcG9ydGVkIGZsYWcgc2V0IGZvciBhIGZpZWxkIG9mIGEgZ2l2ZW4gdHlwZS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEMyU3VwcG9ydGVkRmxhZ3MgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0MyRmllbGRWYWx1ZUhlbHBlcjxUPjo6VmFsdWVUeXBlIFZhbHVlVHlwZTsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gZW1wdHkgZmxhZyBzZXQuCisgICAgICoKKyAgICAgKiBcbm90ZSBUaGlzIGlzIGEgc3BlY2lhbGl6YXRlZCBzdXBwb3J0ZWQgZmxhZ3MgcmVwcmVzZW50YXRpb24gdGhhdCBpcyBvbmx5IHVzZWQgZm9yCisgICAgICogdGhpcyBvYmplY3QgLSBpdCBpcyBlcXVpdmFsZW50IHRvIHRoZSBFTVBUWSB0eXBlIGluIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMuCisgICAgICovCisgICAgc3RhdGljIGlubGluZSBDMlN1cHBvcnRlZEZsYWdzPFQ+IE5vbmUoKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZEZsYWdzKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxDMlZhbHVlOjpQcmltaXRpdmU+KCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBmbGFncyBzZXQgb2YgZ2l2ZW4gZmxhZ3MuCisgICAgICoKKyAgICAgKiBccGFyYW0gZmxhZ3MgdGhlIG9yZGVyZWQgc2V0IG9mIGZsYWdzIGFzIGFuIGluaXRpYWxpemVyIGxpc3QuCisgICAgICogXHBhcmFtIG1pbiBtaW5pbXVtIHNldCBvZiBmbGFncyB0byBiZSBzZXQuCisgICAgICovCisgICAgc3RhdGljIGlubGluZSBDMlN1cHBvcnRlZEZsYWdzPFQ+IEZsYWdzKGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiBmbGFncywgVCBtaW4gPSBUKDApKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZEZsYWdzKG1pbiwgZmxhZ3MpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBmbGFncyBzZXQgb2YgZ2l2ZW4gZmxhZ3MuCisgICAgICoKKyAgICAgKiBccGFyYW0gZmxhZ3MgdGhlIG9yZGVyZWQgc2V0IG9mIGZsYWdzLgorICAgICAqIFxwYXJhbSBtaW4gbWluaW11bSBzZXQgb2YgZmxhZ3MgdG8gYmUgc2V0LgorICAgICAqLworICAgIHN0YXRpYyBpbmxpbmUgQzJTdXBwb3J0ZWRGbGFnczxUPiBGbGFncyhjb25zdCBzdGQ6OnZlY3RvcjxUPiAmZmxhZ3MsIFQgbWluID0gVCgwKSkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRGbGFncyhtaW4sIGZsYWdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgZmxhZyBzZXQgZnJvbSBhIGdlbmVyaWMgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyBvYmplY3QuIFRoaXMgd2lsbCBiZSBhbiBlbXB0eQorICAgICAqIHNldCBpZiB0aGUgc3VwcG9ydGVkIHZhbHVlcyBhcmUgbm90IG9mIEZMQUdTIHR5cGUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWVzIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIG9iamVjdAorICAgICAqLworICAgIEMyU3VwcG9ydGVkRmxhZ3M8VD4oY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsdWVzKSB7CisgICAgICAgIGlmICh2YWx1ZXMudHlwZSA9PSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpGTEFHUykgeworICAgICAgICAgICAgX21WYWx1ZXMuaW5zZXJ0KF9tVmFsdWVzLmVuZCgpLCB2YWx1ZXMudmFsdWVzLmJlZ2luKCksIHZhbHVlcy52YWx1ZXMuZW5kKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgc2V0IGlzIGVtcHR5LgorICAgICAqLworICAgIGNvbnN0ZXhwciBib29sIGlzRW1wdHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbVZhbHVlcy5lbXB0eSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBhIHZhbHVlIGlzIHBhcnQgb2YgdGhpcyBzZXQuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIHZhbHVlIHRvIGNoZWNrLgorICAgICAqLworICAgIGJvb2wgY29udGFpbnMoVCB2YWx1ZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IGZsYWcgc2V0IHRoYXQgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIHNldCBhbmQgYW5vdGhlci4KKyAgICAgKgorICAgICAqIFxwYXJhbSBsaW1pdCB0aGUgb3RoZXIgdmFsdWUgc2V0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRGbGFnczxUPiBsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxUPiAmbGltaXQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIG9iamVjdC4KKyAgICAgKi8KKyAgICBvcGVyYXRvciBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyghaXNFbXB0eSgpIC8qIGZsYWdzICovLCBfbVZhbHVlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgb3JkZXJlZCBzZXQgb2YgZmxhZ3Mgb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VD4gZmxhZ3MoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG1pbmltdW0gc2V0IG9mIGZsYWdzIGZvciB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICBUIG1pbigpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoaXMgc3VwcG9ydGVkIHZhbHVlIHNldC4KKyAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgX21WYWx1ZXMuY2xlYXIoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGZsYWcgc2V0IGRpcmVjdGx5IGZyb20gYW4gaW50ZXJuYWwgcmVwcmVzZW50YXRpb24uCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWVzIGEgdmVjdG9yIGNvbnRhaW5pbmcgdGhlIG1pbmltdW0gZmxhZyBzZXQgZm9sbG93ZWQgYnkgdGhlIHNldCBvZiBmbGFncworICAgICAqLworICAgIEMyU3VwcG9ydGVkRmxhZ3Moc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiAmJnZhbHVlcykKKyAgICAgICAgOiBfbVZhbHVlcyh2YWx1ZXMpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgZmxhZyBzZXQgZnJvbSBhIHNldCBvZiBmbGFncyBhbmQgYSBtaW5pbXVtIGZsYWcgc2V0LgorICAgICAqCisgICAgICogXHBhcmFtIGZsYWdzIHRoZSBzZXQKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZEZsYWdzKFQgbWluLCBjb25zdCBzdGQ6OnZlY3RvcjxUPiAmZmxhZ3MpIHsKKyAgICAgICAgX21WYWx1ZXMuZW1wbGFjZV9iYWNrKG1pbik7CisgICAgICAgIGZvciAoVCBlbGVtIDogZmxhZ3MpIHsKKyAgICAgICAgICAgIF9tVmFsdWVzLmVtcGxhY2VfYmFjayhlbGVtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBmbGFnIHNldCBmcm9tIGEgc2V0IG9mIGluaXRpYWxpemVyIGxpc3QgdmFsdWVzIGFuZCBhIG1pbmltdW0gZmxhZyBzZXQKKyAgICAgKgorICAgICAqIFxwYXJhbSBmbGFncyB0aGUgc2V0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRGbGFncyhUIG1pbiwgY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IGZsYWdzKSB7CisgICAgICAgIF9tVmFsdWVzLmVtcGxhY2VfYmFjayhtaW4pOworICAgICAgICBmb3IgKFQgZWxlbSA6IGZsYWdzKSB7CisgICAgICAgICAgICBfbVZhbHVlcy5lbXBsYWNlX2JhY2soZWxlbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IF9tVmFsdWVzOyAvLy88IHRoZSBtaW5pbXVtIGZsYWcgc2V0IGZvbGxvd2VkIGJ5IHRoZSBzZXQgb2YgZmxhZ3MKK307CisKKy8qKgorICogT3JkZXJlZCBzdXBwb3J0ZWQgdmFsdWUgc2V0IGZvciBhIGZpZWxkIG9mIGEgZ2l2ZW4gdHlwZS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEMyU3VwcG9ydGVkVmFsdWVTZXQgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0MyRmllbGRWYWx1ZUhlbHBlcjxUPjo6VmFsdWVUeXBlIFZhbHVlVHlwZTsKKworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYW4gZW1wdHkgdmFsdWUgc2V0LgorICAgICAqCisgICAgICogXG5vdGUgVGhpcyBpcyBhIHNwZWNpYWxpemF0ZWQgc3VwcG9ydGVkIHJhbmdlIHJlcHJlc2VudGF0aW9uIHRoYXQgaXMgb25seSB1c2VkIGZvcgorICAgICAqIHRoaXMgb2JqZWN0IC0gaXQgaXMgZXF1aXZhbGVudCB0byB0aGUgRU1QVFkgdHlwZSBpbiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzLgorICAgICAqLworICAgIHN0YXRpYyBpbmxpbmUgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBOb25lKCkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRWYWx1ZVNldCh7IH0pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSB2YWx1ZSBzZXQgb2YgZ2l2ZW4gdmFsdWVzLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlcyB0aGUgb3JkZXJlZCBzZXQgb2YgdmFsdWVzIGFzIGFuIGluaXRpYWxpemVyIGxpc3QuCisgICAgICovCisgICAgc3RhdGljIGlubGluZSBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+IE9uZU9mKGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiB2YWx1ZXMpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkVmFsdWVTZXQodmFsdWVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgdmFsdWUgc2V0IG9mIGdpdmVuIHZhbHVlcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZXMgdGhlIG9yZGVyZWQgc2V0IG9mIHZhbHVlcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW5saW5lIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gT25lT2YoY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJnZhbHVlcykgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRWYWx1ZVNldCh2YWx1ZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSB2YWx1ZSBzZXQgZnJvbSBhIGdlbmVyaWMgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyBvYmplY3QuIFRoaXMgd2lsbCBiZSBhbiBlbXB0eQorICAgICAqIHNldCBpZiB0aGUgc3VwcG9ydGVkIHZhbHVlcyBhcmUgbm90IG9mIFZBTFVFUyB0eXBlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlcyB0aGUgc3VwcG9ydGVkIHZhbHVlcyBvYmplY3QKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+KGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbHVlcykgeworICAgICAgICBpZiAodmFsdWVzLnR5cGUgPT0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6VkFMVUVTKSB7CisgICAgICAgICAgICBfbVZhbHVlcy5pbnNlcnQoX21WYWx1ZXMuZW5kKCksIHZhbHVlcy52YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLnZhbHVlcy5lbmQoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyByYW5nZSBpcyBlbXB0eS4KKyAgICAgKi8KKyAgICBjb25zdGV4cHIgYm9vbCBpc0VtcHR5KCkgY29uc3QgeworICAgICAgICByZXR1cm4gX21WYWx1ZXMuZW1wdHkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSB2YWx1ZSBpcyBwYXJ0IG9mIHRoaXMgc2V0LgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgKi8KKyAgICBib29sIGNvbnRhaW5zKFQgdmFsdWUpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5ldyB2YWx1ZSBzZXQgdGhhdCBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgc2V0IGFuZCBhbm90aGVyLgorICAgICAqCisgICAgICogXHBhcmFtIGxpbWl0IHRoZSBvdGhlciB2YWx1ZSBzZXQKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+IGxpbWl0ZWRUbyhjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+ICZsaW1pdCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgbmV3IHZhbHVlIHNldCB0aGF0IGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhpcyBzZXQgYW5kIGEgdmFsdWUgcmFuZ2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gbGltaXQgdGhlIG90aGVyIHJhbmdlCisgICAgICovCisgICAgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxUPiAmbGltaXQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5ldyB2YWx1ZSBzZXQgdGhhdCBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgc2V0IGFuZCBhIGZsYWcgc2V0LgorICAgICAqCisgICAgICogXHBhcmFtIGxpbWl0IHRoZSBvdGhlciBmbGFnIHNldAorICAgICAqLworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gbGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8VD4gJmxpbWl0KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyBvYmplY3QuCisgICAgICovCisgICAgb3BlcmF0b3IgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoZmFsc2UgLyogZmxhZ3MgKi8sIF9tVmFsdWVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBvcmRlcmVkIHNldCBvZiB2YWx1ZXMgb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VD4gdmFsdWVzKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBDbGVhcnMgdGhpcyBzdXBwb3J0ZWQgdmFsdWUgc2V0LgorICAgICAqLworICAgIGlubGluZSB2b2lkIGNsZWFyKCkgeworICAgICAgICBfbVZhbHVlcy5jbGVhcigpOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgdmFsdWUgc2V0IGZyb20gYSBzZXQgb2YgQzJWYWx1ZTo6UHJpbWl0aXZlIHZhbHVlcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZXMgdGhlIHNldAorICAgICAqLworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQoc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiAmJnZhbHVlcykKKyAgICAgICAgOiBfbVZhbHVlcyh2YWx1ZXMpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgdmFsdWUgc2V0IGZyb20gYSBzZXQgb2YgdmFsdWVzLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlcyB0aGUgc2V0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRWYWx1ZVNldChjb25zdCBzdGQ6OnZlY3RvcjxUPiAmdmFsdWVzKSB7CisgICAgICAgIGZvciAoVCBlbGVtIDogdmFsdWVzKSB7CisgICAgICAgICAgICBfbVZhbHVlcy5lbXBsYWNlX2JhY2soZWxlbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgdmFsdWUgc2V0IGZyb20gYSBzZXQgb2YgaW5pdGlhbGl6ZXIgbGlzdCB2YWx1ZXMKKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZXMgdGhlIHNldAorICAgICAqLworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQoY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IHZhbHVlcykgeworICAgICAgICBmb3IgKFQgZWxlbSA6IHZhbHVlcykgeworICAgICAgICAgICAgX21WYWx1ZXMuZW1wbGFjZV9iYWNrKGVsZW0pOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiBfbVZhbHVlczsgLy8vPCB0aGUgc3VwcG9ydGVkIHNldCBvZiB2YWx1ZXMKK307CisKKy8qKgorICogSGVscGVyIGNsYXNzIHRvIGhhbmRsZSBDMkZpZWxkU3VwcG9ydGVWYWx1ZXMgb2JqZWN0IGZvciBmaWVsZHMgb2YgdmFyaW91cyB0eXBlcy4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI7CisKKy8vIHRlbXBsYXRlZCBvcGVyYXRvciBtdXN0IGJlIHByZWRlY2xhcmVkIGZvciBmcmllbmQgZGVjbGFyYXRpb24KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPiAmaSk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgaGVscGVyIGZvciBhIHNwZWNpZmljIHR5cGUgZnJvbSBhIGdlbmVyaWMgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyBzdHJ1Y3QuCisgICAgICovCisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcihjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWx1ZXMpOworCisgICAgLy8gVFJJQ0tZOiBuZWVkZWQgZm9yIHN0ZDo6dW5pcXVlX3B0cjxJbXBsPiBkZWNsYXJhdGlvbgorICAgIH5DMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyKCk7CisKKyAgICAvLyBzdXBwb3J0IGNvcHkgY29uc3RydWN0b3Ivb3BlcmF0b3IKKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIgJik7CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlciYgb3BlcmF0b3I9KGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIgJik7CisKKyAgICBib29sIHN1cHBvcnRzKFQgdmFsdWUpIGNvbnN0OworCitwcml2YXRlOgorICAgIC8vIHVzZSBwaW1wbCBhcyBpbXBsZW1lbnRhdGlvbiBtYXkgY2hhbmdlIGluIHRoZSBmdXR1cmUKKyAgICBzdHJ1Y3QgSW1wbDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW1wbD4gX21JbXBsOworCisgICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCA8VD4oc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPiAmaSk7CisgICAgLy9mcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIgJmkpOworfTsKKworLyoqCisgKiBCdWlsZGVyIGZvciBzdXBwb3J0ZWQgdmFsdWVzIGZvciBhIGZpZWxkIG9mIGEgZ2l2ZW4gdHlwZS4KKyAqCisgKiBUaGlzIGJ1aWxkZXIgY2FuIGJlIHVzZWQgdG8gc3VjY2Vzc2l2ZWx5IHJlc3RyaWN0IHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGZvciBhIGZpZWxkLiBVcG9uCisgKiBjcmVhdGlvbiwgdGhlcmUgYXJlIG5vIHN1cHBvcnRlZCB2YWx1ZXMgc3BlY2lmaWVkIC0gd2hpY2ggZm9yIHRoaXMgYnVpbGRlciBtZWFucyB0aGF0IGFsbAorICogdmFsdWVzIGFyZSBzdXBwb3J0ZWQuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgYnVpbGRlciB3aXRoIG5vIGRlZmluZWQgdmFsdWVzIC0gYnV0IGltcGxpY2l0bHkgYW55IHZhbHVlIGFsbG93ZWQuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcihjb25zdCBDMlBhcmFtRmllbGQgJmZpZWxkKTsKKworICAgIC8qKgorICAgICAqIEdldCBDMlBhcmFtRmllbGRWYWx1ZXMgZnJvbSB0aGlzIGJ1aWxkZXIuCisgICAgICovCisgICAgb3BlcmF0b3IgQzJQYXJhbUZpZWxkVmFsdWVzKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBEZWZpbmUgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXMgdGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIG9mIHRoaXMgYnVpbGRlci4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZhbnkoKTsKKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIG5vbmUuCisgICAgICoKKyAgICAgKiBcbm90ZSBUaGlzIHJlYWxseSBzaG91bGQgbm90IGJlIHVzZWQgZnJvbSB0aGUgYnVpbGRlciBhcyBhbGwgcGFyYW1zIG11c3QgaGF2ZSBzdXBwb3J0ZWQKKyAgICAgKiAgICAgICB2YWx1ZXMsIGJ1dCBpcyBoZXJlIGluIGNhc2UgdGhpcyBpcyByZWFsbHkgdGhlIGNhc2UuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmbm9uZSgpOworCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gfHZhbHVlfCBhbG9uZS4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZlcXVhbFRvKFQgdmFsdWUpOworCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGdyZWF0ZXIgdGhhbiB8dmFsdWV8LgorICAgICAqLworICAgIGlubGluZSBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZncmVhdGVyVGhhbihUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkUmFuZ2U8VD46OkdyZWF0ZXJUaGFuKHZhbHVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB8dmFsdWV8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmdyZWF0ZXJUaGFuT3JFcXVhbFRvKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRSYW5nZTxUPjo6R3JlYXRlclRoYW5PckVxdWFsVG8odmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHx2YWx1ZXwuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmbm90TGVzc1RoYW4oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpOb3RMZXNzVGhhbih2YWx1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gfHZhbHVlfC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZsZXNzVGhhbk9yRXF1YWxUbyhUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkUmFuZ2U8VD46Okxlc3NUaGFuT3JFcXVhbFRvKHZhbHVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB8dmFsdWV8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJm5vdEdyZWF0ZXJUaGFuKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRSYW5nZTxUPjo6Tm90R3JlYXRlclRoYW4odmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgbGVzcyB0aGFuIHx2YWx1ZXwuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmbGVzc1RoYW4oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpMZXNzVGhhbih2YWx1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBpbiB0aGUgcmFuZ2Ugb2YgWyB8bWlufCwgfG1heHwgXQorICAgICAqIHdpdGggb3B0aW9uYWwgfHN0ZXB8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmluUmFuZ2UoCisgICAgICAgICAgICBUIG1pbiwgVCBtYXgsIFQgc3RlcCA9IHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlID8gVCgwKSA6IFQoMSkpICB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkUmFuZ2U8VD46OkluUmFuZ2UobWluLCBtYXgsIHN0ZXApKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgaW4gdGhlIGdlb21ldHJpYyBzZXJpZXMgc3RhcnRpbmcKKyAgICAgKiBmcm9tIHxtaW58IHdpdGggZmFjdG9yIHxudW18IC8gfGRlbm9tfCwgbm90IGdyZWF0ZXIgdGhhbiB8bWF4fC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZpblNlcmllcyhUIG1pbiwgVCBtYXgsIFQgbnVtLCBUIGRlbm9tKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkUmFuZ2U8VD46OkluU2VyaWVzKG1pbiwgbWF4LCBudW0sIGRlbm9tKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGluIHRoZSBtdWx0aXBseS1hY2N1bXVsYXRlIHNlcmllcworICAgICAqIHN0YXJ0aW5nIGZyb20gfG1pbnwgd2l0aCBmYWN0b3IgfG51bXwgLyB8ZGVub218IGFuZCB8c3RlcHwsIG5vdCBncmVhdGVyIHRoYW4gfG1heHwuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmaW5NYWNTZXJpZXMoVCBtaW4sIFQgbWF4LCBUIHN0ZXAsIFQgbnVtLCBUIGRlbm9tKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkUmFuZ2U8VD46OkluTWFjU2VyaWVzKG1pbiwgbWF4LCBzdGVwLCBudW0sIGRlbm9tKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGluIHx2YWx1ZXN8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJm9uZU9mKGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiB2YWx1ZXMpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPjo6T25lT2YodmFsdWVzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGluIHx2YWx1ZXN8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJm9uZU9mKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZ2YWx1ZXMpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPjo6T25lT2YodmFsdWVzKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gZmxhZ3MgaW4gfGZsYWdzfCB3aXRoIGF0IGxlYXN0IHxtaW58CisgICAgICogc2V0LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmZsYWdzKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZmbGFncywgVCBtaW4gPSBUKDApKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkRmxhZ3M8VD46OkZsYWdzKGZsYWdzLCBtaW4pKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byBmbGFncyBpbiB8dmFsdWVzfCB3aXRoIGF0IGxlYXN0IHxtaW58CisgICAgICogc2V0LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmZsYWdzKGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiBmbGFncywgVCBtaW4gPSBUKDApKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkRmxhZ3M8VD46OkZsYWdzKGZsYWdzLCBtaW4pKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyKCk7CisKKyAgICAvLyBzdXBwb3J0IGNvcHkgY29uc3RydWN0b3Ivb3BlcmF0b3IKKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyKGNvbnN0IEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIgJik7CisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlciYgb3BlcmF0b3I9KGNvbnN0IEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIgJik7CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gYSB2YWx1ZSBzZXQuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmbGltaXRUbyhjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+ICZsaW1pdCk7CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byBhIHZhbHVlIHNldC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZsaW1pdFRvKGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8VD4gJmxpbWl0KTsKKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIGEgcmFuZ2UuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmbGltaXRUbyhjb25zdCBDMlN1cHBvcnRlZFJhbmdlPFQ+ICZsaW1pdCk7CisKKyAgICBzdHJ1Y3QgSW1wbDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW1wbD4gX21JbXBsOworfTsKKworLyoqCisgKiBCdWlsZGVyIGZvciBhIGxpc3Qgb2Ygc2V0dGluZyBjb25mbGljdHMuCisgKi8KK2NsYXNzIEMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgbGlzdCBvZiBzZXR0aW5nIGNvbmZsaWN0cy4KKyAgICAgKi8KKyAgICBDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgbGlzdCBjb250YWluaW5nIGEgc2luZ2xlIHNldHRpbmcgY29uZmxpY3QuCisgICAgICovCisgICAgQzJTZXR0aW5nQ29uZmxpY3RzQnVpbGRlcihDMlBhcmFtRmllbGRWYWx1ZXMgJiZjb25mbGljdCk7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgY29uZmxpY3QgdG8gdGhlIGN1cnJlbnQgbGlzdCBvZiBjb25mbGljdHMgYW5kIHJldHVybnMgdGhpcworICAgICAqLworICAgIEMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXImIHdpdGgoQzJQYXJhbUZpZWxkVmFsdWVzICYmY29uZmxpY3QpOworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgY3VycmVudCBsaXN0IG9mIGNvbmZsaWN0cyAoYW5kIG1vdmVzIHRoZW0gb3V0IG9mIHRoaXMgYnVpbGRlci4pCisgICAgICogKHRoaXMgaXMgd2h5IGl0IGlzIG5vdCBjb25zdCkKKyAgICAgKi8KKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtRmllbGRWYWx1ZXM+IHJldHJpZXZlQ29uZmxpY3RzKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgbGlzdCBpcyBlbXB0eS4KKyAgICAgKi8KKyAgICBpbmxpbmUgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIF9tQ29uZmxpY3RzLmVtcHR5KCk7IH0KKworICAgIGlubGluZSBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gZW1wdHkoKTsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW1GaWVsZFZhbHVlcz4gX21Db25mbGljdHM7Cit9OworCisvKioKKyAqIFNldHRpbmcgcmVzdWx0IGJ1aWxkZXIgZm9yIGEgcGFyYW1ldGVyLgorICovCitzdHJ1Y3QgQzJTZXR0aW5nUmVzdWx0QnVpbGRlciB7CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHJlYWQtb25seSBzZXR0aW5nIHJlc3VsdCBmYWlsdXJlLgorICAgICAqCisgICAgICogVGhpcyBkb2VzIG5vdCB0YWtlIEZTViBhcyBvbmx5IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBmaWVsZCBpcyBzdXBwb3J0ZWQuCisgICAgICovCisgICAgc3RhdGljIEMyU2V0dGluZ1Jlc3VsdCBSZWFkT25seShjb25zdCBDMlBhcmFtRmllbGQgJnBhcmFtKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBiYWQtdmFsdWUgb3IgaW5mb2luZm9ybWF0aW9uYWwgYmFkLXZhbHVlIHNldHRpbmcgcmVzdWx0IGZhaWx1cmUuCisgICAgICoKKyAgICAgKiBUaGlzIGRvZXMgbm90IHRha2UgRlNWIGFzIHRoZSB2YWx1ZSBpcyBvdXRzaWRlIG9mIHRoZSBwb3NzaWJsZSB2YWx1ZXMuIEFzIHN1Y2gsIHRoZXJlIGFyZSBubworICAgICAqIGNvbmZsaWN0cyBmb3IgdGhpcyBjYXNlIGVpdGhlci4KKyAgICAgKi8KKyAgICBzdGF0aWMgQzJTZXR0aW5nUmVzdWx0IEJhZFZhbHVlKGNvbnN0IEMyUGFyYW1GaWVsZCAmcGFyYW1GaWVsZCwgYm9vbCBpc0luZm8gPSBmYWxzZSk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgY29uZmxpY3QgKG9yIGluZm9ybWF0aW9uYWwgY29uZmxpY3QpIHNldHRpbmcgcmVzdWx0IGZhaWx1cmUuCisgICAgICoKKyAgICAgKiBUaGlzIHRha2VzIEZTViBzbyB1c2UgcGFyYW1GaWVsZFZhbHVlcyBhbmQgb3B0aW9uYWwgY29uZmxpY3RzLgorICAgICAqLworICAgIHN0YXRpYyBDMlNldHRpbmdSZXN1bHQgQ29uZmxpY3QoCisgICAgICAgICAgICBDMlBhcmFtRmllbGRWYWx1ZXMgJiZwYXJhbUZpZWxkVmFsdWVzLCBDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyICZjb25mbGljdHMsCisgICAgICAgICAgICBib29sIGlzSW5mbyA9IGZhbHNlKTsKKworICAgIC8vIFRPRE86IHJldHJpZXZlIHJlc3VsdHMKKworCitwcml2YXRlOgorICAgIEMyUGFyYW1GaWVsZCBfbVBhcmFtRmllbGQ7CisgICAgQzJTZXR0aW5nUmVzdWx0IF9tUmVzdWx0OworCisgICAgQzJTZXR0aW5nUmVzdWx0QnVpbGRlcihjb25zdCBDMlNldHRpbmdSZXN1bHRCdWlsZGVyICYpID0gZGVsZXRlOworfTsKKworLyoqCisgKiBTZXR0aW5nIHJlc3VsdHMgKFBMVVJBTCkgYnVpbGRlci4KKyAqCisgKiBTZXR0aW5nIHJlc3VsdHMgY29udGFpbiBhIGZhaWx1cmUgc3RhdHVzIGFsb25nIHdpdGggYSBsaXN0IG9mIGZhaWxpbmcgZmllbGRzIG9yIHBhcmFtcy4KKyAqLworc3RydWN0IEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyIHsKKyAgICBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihjb25zdCBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciYpID0gZGVsZXRlOworICAgIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyJiYpID0gZGVmYXVsdDsKKyAgICBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciAmb3BlcmF0b3I9KEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyJiYpID0gZGVmYXVsdDsKKworICAgIC8qKiBccmV0dXJucyAoZGVmYXVsdCkgc3VjY2Vzc2Z1bCByZXN1bHQgd2l0aCBubyBkZXRhaWxzLiAqLworICAgIGlubGluZSBzdGF0aWMgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIgT2soKSB7CisgICAgICAgIHJldHVybiBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihDMl9PSyk7CisgICAgfQorCisgICAgLyoqIFxyZXR1cm5zIEludGVyZmFjZSBpcyBpbiBiYWQgc3RhdGUsIHdpdGggbm8gZnVydGhlciBkZXRhaWxzLiAqLworICAgIGlubGluZSBzdGF0aWMgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIgQmFkU3RhdGUoKSB7CisgICAgICAgIHJldHVybiBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihDMl9CQURfU1RBVEUpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyBJbnRlcmZhY2UgY29ubmVjdGlvbiB0aW1lZCBvdXQsIHdpdGggbm8gZnVydGhlciBkZXRhaWxzLiAqLworICAgIGlubGluZSBzdGF0aWMgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIgVGltZWRPdXQoKSB7CisgICAgICAgIHJldHVybiBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihDMl9USU1FRF9PVVQpOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyBJbnRlcmZhY2UgY29ubmVjdGlvbiBpcyBjb3JydXB0ZWQsIHdpdGggbm8gZnVydGhlciBkZXRhaWxzLiAqLworICAgIGlubGluZSBzdGF0aWMgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIgQ29ycnVwdGVkKCkgeworICAgICAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoQzJfQ09SUlVQVEVEKTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyIE5vTWVtb3J5KEMyUGFyYW06OkluZGV4IGluZGV4XyBfX3VudXNlZCkgeworICAgICAgICAvLyBUT0RPOiB0cnkgdG8gYWRkIGZhaWx1cmUgcmVzdWx0CisgICAgICAgIHJldHVybiBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihDMl9OT19NRU1PUlkpOworICAgIH0KKworICAgIC8vIFRPRE86IHRoaXMgc2hvdWxkIG5vdCBiZSBhIGNvbnN0cnVjdG9yCisgICAgLyoqIENyZWF0ZXMgYSBidWlsZGVyIHdpdGggYSBzaW5nbGUgYmFkIHZhbHVlIHNldHRpbmcgcmVzdWx0LiAqLworICAgIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKEMyU2V0dGluZ1Jlc3VsdCAmJnJlc3VsdCk7CisKKyAgICAvKiogQ29tYmluZXMgdGhpcyByZXN1bHRzIHdpdGggb3RoZXIgcmVzdWx0cy4gKi8KKyAgICBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciBwbHVzKEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyJiYgcmVzdWx0cyk7CisKKyAgICAvKiogUmV0cmlldmUgKGdldCBhbmQgbW92ZSBvdXQpIGZhaWx1cmVzIGFuZCByZXR1cm4gdGhlIGZhaWx1cmUgc3RhdHVzLiAqLworICAgIGMyX3N0YXR1c190IHJldHJpZXZlRmFpbHVyZXMoc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcyk7CisKK3ByaXZhdGU6CisgICAgLyoqIFNldHRpbmcgcmVzdWx0cyBiYXNlZCBvbiBhIHNpbmdsZSBzdGF0dXMuIFRoaXMgaXMgdXNlZCB3aGVuIGFjdHVhbCBzZXR0aW5nIGNvdWxkIG5vdCBiZQorICAgICAqICBhdHRlbXB0ZWQgdG8gZ2V0IGEgc2luZ2xlIEMyU2V0dGluZ1Jlc3VsdCwgb3Igd2hlbiBhIHNldHRpbmcgc3VjY2VlZGVkIHdpdGhvdXQKKyAgICAgKiAgJ2NvbXBsYWludHMnLiAqLworICAgIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKGMyX3N0YXR1c190IHN0YXR1cyk7CisgICAgICAgIC8vIHN0YXR1cyBtdXN0IGJlIG9uZSBvZiBPSywgQkFEX1NUQVRFLCBUSU1FRF9PVVQsIENPUlJVUFRFRCBvciBOT19NRU1PUlkKKyAgICAgICAgLy8gbWFpbmx5OiBCTE9DS0lORywgQkFEX0lOREVYLCBCQURfVkFMVUUgYW5kIE5PX01FTU9SWSByZXF1aXJlcyBhIHNldHRpbmcgYXR0ZW1wdCwgYnV0CisgICAgICAgIC8vIE5PX01FTU9SWSBtYXkgbm90IGFsbG93IHVzIHRvIGNyZWF0ZSBhIHJlc3VsdHMgc3RydWN0dXJlLgorCisgICAgLyoqCisgICAgICogT25lIG9mIE9LLCBCQURfSU5ERVgsIEJBRF9WQUxVRSwgQkFEX1NUQVRFLCBOT19NRU1PUlksIFRJTUVEX09VVCwgQkxPQ0tJTkcgb3IgQ09SUlVQVEVELgorICAgICAqLworICAgIGMyX3N0YXR1c190IF9tU3RhdHVzIF9fdW51c2VkOworCisgICAgLyoqCisgICAgICogVmVjdG9yIG9mIGluZGl2aWR1YWwgc2V0dGluZyByZXN1bHQgZGV0YWlscy4KKyAgICAgKi8KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gX21SZXN1bHRzOworfTsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHRvIGVudW1lcmF0ZSBmaWVsZHMgb2YgcGFyYW1ldGVycy4KKyAqLworc3RydWN0IEMyRmllbGRVdGlscyB7CisgICAgc3RydWN0IF9JbnNwZWN0b3I7CisKKyAgICAvKioKKyAgICAgKiBBbiBleHRlbmRlZCBmaWVsZCBkZXNjcmlwdG9yIG9iamVjdCB3aXRoIHN0cnVjdHVyYWwgaW5mb3JtYXRpb24gKGxpbmVhZ2UgYmFjayB0byB0aGUgcm9vdCBvZgorICAgICAqIHRoZSBwYXJhbSkuCisgICAgICovCisgICAgc3RydWN0IEluZm8geworICAgICAgICB0eXBlZGVmIEMyRmllbGREZXNjcmlwdG9yOjp0eXBlX3QgdHlwZV90OyAvLy88IGZpZWxkIHR5cGUKKyAgICAgICAgdHlwZWRlZiBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIE5hbWVkVmFsdWVzVHlwZTsgLy8vPCBuYW1lZCB2YWx1ZXMgbGlzdCB0eXBlCisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkCisgICAgICAgIEMyU3RyaW5nIG5hbWUoKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgdHlwZSBvZiB0aGlzIGZpZWxkCisgICAgICAgIHR5cGVfdCB0eXBlKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIGRlZmluZWQgbmFtZS12YWx1ZSBwYWlyaW5ncyBmb3IgdGhpcyBmaWVsZC4gVGhlIHJldHVybmVkIHJlZmVyZW5jZSBpcworICAgICAgICAgKiBvbmx5IHZhbGlkIGR1cmluZyB0aGUgdmFsaWRpdHkgb2YgdGhpcyBvYmplY3QKKyAgICAgICAgICovCisgICAgICAgIGNvbnN0IE5hbWVkVmFsdWVzVHlwZSAmbmFtZWRWYWx1ZXMoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIGluZGV4IG9mIHRoaXMgZmllbGQuIEUuZy4gcGFyYW0uZmllbGQgb3IgcGFyYW0uZmllbGRbMF0gaGFzIGFuIGluZGV4IG9mIDAsIGFuZAorICAgICAgICAgKiBwYXJhbS5zdHJ1Y3RbMl0uZmllbGRbM10gaGFzIGFuIGluZGV4IG9mIDMuCisgICAgICAgICAqLworICAgICAgICBzaXplX3QgaW5kZXgoKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBmaWVsZCBpbiBjYXNlIGl0IGlzIGFuIGFycmF5LiBSZXR1cm5zIDAgZm9yCisgICAgICAgIC8vLyBUW10gYXJyYXlzIGlmIHRoaXMgaW5mbyBjb21lcyBmcm9tIGEgQzJQYXJhbTo6SW5kZXggb2JqZWN0LCBhbmQgdGhlIGN1cnJlbnRseSB1c2VkCisgICAgICAgIC8vLyBleHRlbnQgaWYgaXQgY29tZXMgZnJvbSBhIEMyUGFyYW0gb2JqZWN0LiBSZXR1cm5zIDEgZm9yIFRbMV0gYXJyYXlzIGFzIHdlbGwgYXMgaWYgdGhlCisgICAgICAgIC8vLyBmaWVsZCBpcyBub3QgYW4gYXJyYXkuCisgICAgICAgIHNpemVfdCBleHRlbnQoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIChzdHJ1Y3R1cmFsKSBkZXB0aCBvZiB0aGlzIGZpZWxkLiBFLmcuIHBhcmFtLmZpZWxkIG9yIHBhcmFtLmZpZWxkWzBdIGhhcyBhIGRlcHRoIG9mCisgICAgICAgICAqICAwLCBhbmQgcGFyYW0uc3RydWN0LmZpZWxkIG9yIHBhcmFtLnN0cnVjdFswXS5maWVsZFswXSBoYXMgYSBkZXB0aCBvZiAxLgorICAgICAgICAgKi8KKyAgICAgICAgc2l6ZV90IGRlcHRoKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIG9mZnNldCBvZiB0aGlzIGZpZWxkIGluIHRoZSBwYXJhbWV0ZXIgaW4gYnl0ZXMuCisgICAgICAgICAqLworICAgICAgICBzaXplX3Qgb2Zmc2V0KCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhpcyBmaWVsZCBpbiBieXRlcy4KKyAgICAgICAgICovCisgICAgICAgIHNpemVfdCBzaXplKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBvZmZzZXQgb2YgdGhpcyBmaWVsZCdzIGFycmF5LiBFLmcuIGZvciBwYXJhbS5zdHJ1Y3RbMl0uZmllbGRbM10gdGhpcyBpcyB0aGUgb2Zmc2V0CisgICAgICAgICAqIG9mIGl0cyBzbWFsbGVzdCBzaWJsaW5nOiBwYXJhbS5zdHJ1Y3RbMl0uZmllbGRbMF0uCisgICAgICAgICAqLworICAgICAgICBzaXplX3QgYXJyYXlPZmZzZXQoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGlzIGZpZWxkJ3MgYXJyYXkuIFRoaXMgaXMgZXF1aXZhbGVudCB0byBleHRlbnQoKSAqIHNpemUoKQorICAgICAgICAgKi8KKyAgICAgICAgc2l6ZV90IGFycmF5U2l6ZSgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgb2Zmc2V0IG9mIHRoZSBiYXNlIGZpZWxkLiBUaGUgYmFzZSBmaWVsZCBpcyBhIGNvdXNpbiBvZiB0aGUgY3VycmVudCBmaWVsZCB3aGVyZQorICAgICAgICAgKiBhbGwgaW5kaWNlcyBhcmUgMC4gRS5nLiB0aGUgdGhlIGJhc2UgZmllbGQgZm9yIHBhcmFtLnN0cnVjdFsyXS5maWVsZFszXSBpcworICAgICAgICAgKiBwYXJhbS5zdHJ1Y3RbMF0uZmllbGRbMF0uIEJhc2UgZmllbGRzIGFyZSB1c2VkIHRvIHNwZWNpZnkgc3VwcG9ydGVkIHZhbHVlcyBmb3IKKyAgICAgICAgICogYWxsIGNvdXNpbiBmaWVsZHMuCisgICAgICAgICAqLworICAgICAgICBzaXplX3QgYmFzZUZpZWxkT2Zmc2V0KCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGZpZWxkIGlzIGFuIGFyaXRobWV0aWMgKGludGVncmFsLCBjb3VudGVyIG9yIGZsb2F0KSBmaWVsZC4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaXNBcml0aG1ldGljKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIGZpZWxkIGNhbiBoYXZlIGEgZmxleGlibGUgZXh0ZW50LiBleHRlbnQoKSByZXR1cm5zIHRoZSBjdXJyZW50CisgICAgICAgICAqIGV4dGVudC4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaXNGbGV4aWJsZSgpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIHdoZXRoZXIgdGhpcyBpbmZvIGlzIHZhbGlkCisgICAgICAgIGlubGluZSBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBfbUltcGwgIT0gbnVsbHB0cjsgfQorCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBpbmZvIGZvciB0aGUgcGFyZW50IG9mIHRoaXMgZmllbGQsIG9yIGFuIGludmFsaWQgSW5mbyBvYmplY3QgaWYgaXQgaGFzIG5vCisgICAgICAgIC8vLyBwYXJlbnRzCisgICAgICAgIEluZm8gcGFyZW50KCkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgd2hldGhlciB0aGlzIGluZm8gaXMgdmFsaWQKKyAgICAgICAgaW5saW5lIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBpc1ZhbGlkKCk7IH0KKworICAgICAgICBzdHJ1Y3QgSW1wbDsKKyAgICAgICAgSW5mbyhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4pOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IF9tSW1wbDsKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBfSW5zcGVjdG9yOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBBbiAoaW5wdXQpIGl0ZXJhdG9yIG9iamVjdCBvdmVyIGZpZWxkcyB1c2luZyBJbmZvIG9iamVjdHMuCisgICAgICovCisgICAgc3RydWN0IEl0ZXJhdG9yIHsKKyAgICAgICAgdHlwZWRlZiBJbmZvIGNvbnN0IHZhbHVlX3R5cGU7CisgICAgICAgIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKKyAgICAgICAgdHlwZWRlZiBJbmZvIGNvbnN0ICogcG9pbnRlcjsKKyAgICAgICAgdHlwZWRlZiBJbmZvIGNvbnN0IHJlZmVyZW5jZTsKKyAgICAgICAgdHlwZWRlZiBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZyBpdGVyYXRvcl9jYXRlZ29yeTsKKworICAgICAgICAvLy8gcmV0dXJuIEluZm8gYXQgY3VycmVudCBwb3NpdGlvbgorICAgICAgICB2aXJ0dWFsIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdDsKKworICAgICAgICAvLy8gbW92ZSB0byB0aGUgbmV4dCBmaWVsZAorICAgICAgICB2aXJ0dWFsIEl0ZXJhdG9yJiBvcGVyYXRvcisrKCk7CisKKyAgICAgICAgdmlydHVhbCBib29sIG9wZXJhdG9yPT0oY29uc3QgSXRlcmF0b3IgJikgY29uc3Q7CisgICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgSXRlcmF0b3IgJm90aGVyKSBjb25zdCB7IHJldHVybiAhb3BlcmF0b3I9PShvdGhlcik7IH0KKworICAgICAgICB2aXJ0dWFsIH5JdGVyYXRvcigpID0gZGVmYXVsdDsKKworICAgICAgICBzdHJ1Y3QgSW1wbDsKKyAgICAgICAgSXRlcmF0b3Ioc3RkOjpzaGFyZWRfcHRyPEltcGw+KTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBBbiAoaW5wdXQpIGl0ZXJhYmxlIG9iamVjdCByZXByZXNlbnRpbmcgYSBsaXN0IG9mIGZpZWxkcy4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgTGlzdCB7CisgICAgICAgIC8vLyByZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpc3QKKyAgICAgICAgdmlydHVhbCBJdGVyYXRvciBiZWdpbigpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QKKyAgICAgICAgdmlydHVhbCBJdGVyYXRvciBlbmQoKSBjb25zdDsKKworICAgICAgICB2aXJ0dWFsIH5MaXN0KCkgPSBkZWZhdWx0OworCisgICAgICAgIHN0cnVjdCBJbXBsOworICAgICAgICBMaXN0KHN0ZDo6c2hhcmVkX3B0cjxJbXBsPik7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKKyAgICB9OworCisgICAgLyoqCisgICAgICogRW51bWVyYXRlcyBhbGwgKGJhc2UpIGZpZWxkcyBhdCBpbmRleCAwIG9mIHRoZSBwYXJhbWV0ZXIuIFRoZSBvcmRlciBvZiBpdGVyYXRpb24gaXMgdGhlCisgICAgICogZm9sbG93aW5nOgorICAgICAqICAgRmllbGRzIG9mIGEgc3RydWN0dXJlIGFyZSBlbnVtZXJhdGVkIGluIGZpZWxkIG9yZGVyLiBIb3dldmVyLCBzdWItZmllbGRzIG9mIGEgc3RydWN0dXJlCisgICAgICogICBhcmUgZW51bWVyYXRlZCBkaXJlY3RseSBhZnRlciB0aGUgc3RydWN0dXJlIGZpZWxkLCBhbmQgcHJpb3IgdG8gc2libGluZyBmaWVsZHMuCisgICAgICoKKyAgICAgKiBJbiBlc3NlbmNlIHRoZSBvcmRlciBvZiBlbnVtZXJhdGlvbiBpcyBmaXJzdCBieSBpbmNyZWFzaW5nIG9mZnNldCwgdGhlbiBieSBkZWNyZWFzaW5nIHNpemUuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW0gcGFyYW1ldGVyIHRvIGVudW1lcmF0ZSBpdHMgZmllbGRzCisgICAgICogXHBhcmFtIHJlZmxlY3RvciBwYXJhbWV0ZXIgcmVmbGVjdG9yIHVzZWQgZm9yIGVudW1lcmF0aW9uCisgICAgICoKKyAgICAgKiBccmV0dXJuIGFuIGl0ZXJhYmxlIG9iamVjdAorICAgICAqLworICAgIHN0YXRpYyBMaXN0IGVudW1lcmF0ZUZpZWxkcygKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gJnBhcmFtLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpOworCisgICAgLyoqCisgICAgICogRW51bWVyYXRlcyBhbGwgY291c2luIGZpZWxkcyB1cCB0byBkZXB0aCAtIGxldmVsIGZvciBhIGZpZWxkLiBJZiBsZXZlbCBpcyAwLCBpdCBlbnVtZXJhdGVzCisgICAgICogb25seSB0aGUgZmllbGQuIEZvciBsZXZlbCAxLCBpdCBlbnVtZXJhdGVzIGFsbCBmaWVsZHMgaW4gaXRzIGN1cnJlbnQgYXJyYXkgKHdoaWNoIG1heSBiZQorICAgICAqIGl0c2VsZiBpZiBleHRlbnQgaXMgMSkuIFRoZSBvcmRlciBvZiBpdGVyYXRpb24gaXMgYnkgaW5jcmVhc2luZyBmaWVsZCBvZmZzZXQuCisgICAgICovCisgICAgc3RhdGljIExpc3QgZW51bWVyYXRlQ291c2lucygKKyAgICAgICAgICAgIGNvbnN0IEluZm8gJmZpZWxkLAorICAgICAgICAgICAgdWludDMyX3QgbGV2ZWwgPSB+MCk7CisKKyAgICAvKioKKyAgICAgKiBMb2NhdGVzIHRoZSBmaWVsZCBpbiBhIHBhcmFtZXRlciBhbmQgcmV0dXJucyBhIGxpc3Qgb2YgMiBlbGVtZW50cyAtIHRoZSBtb3N0LXNwZWNpZmljIGZpZWxkCisgICAgICogYXJyYXkgb2YgdGhlIHBhcmFtZXRlciB0aGF0IGNvbnRhaW5zIHRoZSBlbnRpcmUgZmllbGQuIElmIHRoZSBmaWVsZCBpcyBub3QgYSB2YWxpZCBmaWVsZAorICAgICAqIHNwZWNpZmllciBmb3IgdGhpcyBwYXJhbWV0ZXIgKGUuZy4gaXQgaXMgb3V0c2lkZSB0aGUgYm91bmRzIG9mIHRoZSBwYXJhbWV0ZXIpLCBpdCByZXR1cm5zCisgICAgICogYW4gZW1wdHkgbGlzdC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8SW5mbz4gbG9jYXRlRmllbGQoCisgICAgICAgICAgICBjb25zdCBDMlBhcmFtICZwYXJhbSwgY29uc3QgX0MyRmllbGRJZCAmZmllbGQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3Rvcik7CisKKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8SW5mbz4gbG9jYXRlRmllbGQoCisgICAgICAgICAgICBjb25zdCBDMlBhcmFtRmllbGQgJnBmLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3Rvcik7CisKK307CisKKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctaW50ZXJmYWNlLmg+CisKKyNlbmRpZiAgLy8gQzJVVElMU19JTlRFUkZBQ0VfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMlBhcmFtVXRpbHMuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMlBhcmFtVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTFiZDk0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyUGFyYW1VdGlscy5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfUEFSQU1fVVRJTFNfSF8KKyNkZWZpbmUgQzJVVElMU19QQVJBTV9VVElMU19IXworCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8qKiBcZmlsZQorICogVXRpbGl0aWVzIGZvciBwYXJhbWV0ZXIgaGFuZGxpbmcgdG8gYmUgdXNlZCBieSBDb2RlYzIgaW1wbGVtZW50YXRpb25zLgorICovCisKKy8vLyBcY29uZCBJTlRFUk5BTAorCitzdHJ1Y3QgQzJQYXJhbTsKKworY2xhc3MgQzJQYXJhbVV0aWxzIHsKKyAgICBmcmllbmQgY2xhc3MgQzJVdGlsVGVzdF9QYXJhbVV0aWxzVGVzdF9UZXN0OworCitwdWJsaWM6CisKKyAgICAvLy8gc2FmZShyKSBwYXJzaW5nIGZyb20gcGFyYW1ldGVyIGJsb2IKKyAgICBzdGF0aWMKKyAgICBDMlBhcmFtICpQYXJzZUZpcnN0KGNvbnN0IHVpbnQ4X3QgKmJsb2IsIHNpemVfdCBzaXplKTsKK307CisKKy8vLyBcZW5kY29uZAorCisjZW5kaWYgIC8vIEMyVVRJTFNfUEFSQU1fVVRJTFNfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW50ZXJuYWwvQzJCbG9ja0ludGVybmFsLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbnRlcm5hbC9DMkJsb2NrSW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGNlNzBhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW50ZXJuYWwvQzJCbG9ja0ludGVybmFsLmgKQEAgLTAsMCArMSwzMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU1RBR0VGUklHSFRfQzJCTE9DS19JTlRFUk5BTF9IXworI2RlZmluZSBBTkRST0lEX1NUQUdFRlJJR0hUX0MyQkxPQ0tfSU5URVJOQUxfSF8KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMi4wL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworCitzdHJ1Y3QgQnVmZmVyUG9vbERhdGE7CisKK30KK30KK30KK30KKworLyoqCisgKiBTdG9yZXMgaW5mb3JtYXRpb25zIGZyb20gQzJCbG9ja1Bvb2wgaW1wbGVtZW50YXRpb25zIHdoaWNoIGFyZSByZXF1aXJlZCBieSBDMkJsb2NrLgorICovCitzdHJ1Y3QgQzJfSElERSBfQzJCbG9ja1Bvb2xEYXRhIHsKKyAgICBlbnVtIHR5cGVfdCA6IGludCB7CisgICAgICAgIFRZUEVfQlVGRkVSUE9PTCA9IDAsCisgICAgICAgIFRZUEVfQlVGRkVSUVVFVUUsCisgICAgfTsKKworICAgIHZpcnR1YWwgdHlwZV90IGdldFR5cGUoKSBjb25zdCA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICBfQzJCbG9ja1Bvb2xEYXRhKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCB+X0MyQmxvY2tQb29sRGF0YSgpID0gZGVmYXVsdDsKK307CisKK3N0cnVjdCBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YTsKKworLyoqCisgKiBJbnRlcm5hbCBvbmx5IGludGVyZmFjZSBmb3IgY3JlYXRpbmcgYmxvY2tzIGJ5IGJsb2NrIHBvb2wvYnVmZmVyIHBhc3NpbmcgaW1wbGVtZW50YXRpb25zLgorICoKKyAqIFx0b2RvIHRoaXMgbXVzdCBiZSBoaWRkZW4KKyAqLworc3RydWN0IF9DMkJsb2NrRmFjdG9yeSB7CisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbGluZWFyIGJsb2NrIGZyb20gYW4gYWxsb2NhdGlvbiBmb3IgYW4gYWxsb3R0ZWQgcmFuZ2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gYWxsb2MgcGFyZW50IGFsbG9jYXRpb24KKyAgICAgKiBccGFyYW0gZGF0YSAgYmxvY2twb29sIGRhdGEKKyAgICAgKiBccGFyYW0gb2Zmc2V0IGFsbG90dGVkIHJhbmdlIG9mZnNldAorICAgICAqIFxwYXJhbSBzaXplICBhbGxvdHRlZCBzaXplCisgICAgICoKKyAgICAgKiBccmV0dXJuIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBsaW5lYXIgYmxvY2suIG51bGxwdHIgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvCisgICAgICogICAgICAgICBjcmVhdGUgdGhpcyBibG9jay4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gQ3JlYXRlTGluZWFyQmxvY2soCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gJmRhdGEgPSBudWxscHRyLAorICAgICAgICAgICAgc2l6ZV90IG9mZnNldCA9IDAsCisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IH4oc2l6ZV90KTApOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZ3JhcGhpYyBibG9jayBmcm9tIGFuIGFsbG9jYXRpb24gZm9yIGFuIGFsbG90dGVkIHNlY3Rpb24uCisgICAgICoKKyAgICAgKiBccGFyYW0gYWxsb2MgcGFyZW50IGFsbG9jYXRpb24KKyAgICAgKiBccGFyYW0gZGF0YSAgYmxvY2twb29sIGRhdGEKKyAgICAgKiBccGFyYW0gY3JvcCAgYWxsb3R0ZWQgY3JvcCByZWdpb24KKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGdyYXBoaWMgYmxvY2suIG51bGxwdHIgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvCisgICAgICogICAgICAgICBjcmVhdGUgdGhpcyBibG9jay4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IENyZWF0ZUdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gJmRhdGEgPSBudWxscHRyLAorICAgICAgICAgICAgY29uc3QgQzJSZWN0ICZhbGxvdHRlZENyb3AgPSBDMlJlY3QofjB1LCB+MHUpKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGJsb2NrIHBvb2wgZGF0YSBmcm9tIDFEIGJsb2NrLgorICAgICAqCisgICAgICogXHBhcmFtIHNoYXJlZCBwb2ludGVyIHRvIHRoZSAxRCBibG9jayB3aGljaCBpcyBhbHJlYWR5IGNyZWF0ZWQuCisgICAgICovCisgICAgc3RhdGljCisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IEdldExpbmVhckJsb2NrUG9vbERhdGEoCisgICAgICAgICAgICBjb25zdCBDMkJsb2NrMUQmIGJsb2NrKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhIGJsb2NrIHBvb2wgZGF0YSBmcm9tIDJEIGJsb2NrLgorICAgICAqCisgICAgICogXHBhcmFtIHNoYXJlZCBwb2ludGVyIHRvIHRoZSAyRCBibG9jayB3aGljaCBpcyBhbHJlYWR5IGNyZWF0ZWQuCisgICAgICovCisgICAgc3RhdGljCisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IEdldEdyYXBoaWNCbG9ja1Bvb2xEYXRhKAorICAgICAgICAgICAgY29uc3QgQzJCbG9jazJEJiBibG9jayk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBsaW5lYXIgYmxvY2sgZnJvbSB0aGUgcmVjZWl2ZWQgbmF0aXZlIGhhbmRsZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBoYW5kbGUgICAgbmF0aXZlIGhhbmRsZSB0byBhIGxpbmVhciBibG9jaworICAgICAqCisgICAgICogXHJldHVybiBzaGFyZWQgcG9pbnRlciB0byB0aGUgbGluZWFyIGJsb2NrLiBudWxscHRyIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0bworICAgICAqICAgICAgICAgY3JlYXRlIHRoaXMgYmxvY2suCisgICAgICovCisgICAgc3RhdGljCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IENyZWF0ZUxpbmVhckJsb2NrKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBncmFwaGljIGJsb2NrIGZyb20gdGhlIHJlY2VpdmVkIG5hdGl2ZSBoYW5kbGUuCisgICAgICoKKyAgICAgKiBccGFyYW0gaGFuZGxlICAgIG5hdGl2ZSBoYW5kbGUgdG8gYSBncmFwaGljIGJsb2NrCisgICAgICoKKyAgICAgKiBccmV0dXJuIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBncmFwaGljIGJsb2NrLiBudWxscHRyIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0bworICAgICAqICAgICAgICAgY3JlYXRlIHRoaXMgYmxvY2suCisgICAgICovCisgICAgc3RhdGljCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBDcmVhdGVHcmFwaGljQmxvY2soCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGxpbmVhciBibG9jayBmcm9tIHRoZSByZWNlaXZlZCBidWZmZXJwb29sIGRhdGEuCisgICAgICoKKyAgICAgKiBccGFyYW0gZGF0YSAgYnVmZmVycG9vbCBkYXRhIHRvIGEgbGluZWFyIGJsb2NrCisgICAgICoKKyAgICAgKiBccmV0dXJuIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBsaW5lYXIgYmxvY2suIG51bGxwdHIgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvCisgICAgICogICAgICAgICBjcmVhdGUgdGhpcyBibG9jay4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gQ3JlYXRlTGluZWFyQmxvY2soCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6QnVmZmVyUG9vbERhdGE+ICZkYXRhKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGdyYXBoaWMgYmxvY2sgZnJvbSB0aGUgcmVjZWl2ZWQgYnVmZmVycG9vbCBkYXRhLgorICAgICAqCisgICAgICogXHBhcmFtIGRhdGEgIGJ1ZmZlcnBvb2wgZGF0YSB0byBhIGdyYXBoaWMgYmxvY2sKKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGdyYXBoaWMgYmxvY2suIG51bGxwdHIgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvCisgICAgICogICAgICAgICBjcmVhdGUgdGhpcyBibG9jay4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IENyZWF0ZUdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpCdWZmZXJQb29sRGF0YT4gJmRhdGEpOworCisgICAgLyoqCisgICAgICogR2V0IGJ1ZmZlcnBvb2wgZGF0YSBmcm9tIHRoZSBibG9ja3Bvb2wgZGF0YS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwb29sRGF0YSAgICAgICAgICBibG9ja3Bvb2wgZGF0YQorICAgICAqIFxwYXJhbSBidWZmZXJQb29sRGF0YSAgICBwb2ludGVyIHRvIGJ1ZmZlcnBvb2wgZGF0YSB3aGVyZSB0aGUgYnVmZmVycG9vbAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhIGlzIHN0b3JlZC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4ge1xjb2RlIHRydWV9IHdoZW4gdGhlcmUgaXMgdmFsaWQgYnVmZmVycG9vbCBkYXRhLCB7XGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBib29sIEdldEJ1ZmZlclBvb2xEYXRhKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IF9DMkJsb2NrUG9vbERhdGE+ICZwb29sRGF0YSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyUG9vbERhdGEpOworCisgICAgLyoKKyAgICAgKiBMaWZlIEN5Y2xlIE1hbmFnZW1lbnQgb2YgQnVmZmVyUXVldWUtQmFzZWQgQmxvY2tzCisgICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAqCisgICAgICogQSBibG9jayB0aGF0IGlzIGNyZWF0ZWQgYnkgYSBidWZmZXJxdWV1ZS1iYXNlZCBibG9ja3Bvb2wgcmVxdWlyZXMgc29tZQorICAgICAqIHNwZWNpYWwgdHJlYXRtZW50IHdoZW4gaXQgaXMgZGVzdHJveWVkLiBJbiBwYXJ0aWN1bGFyLCBpZiB0aGUgYmxvY2sKKyAgICAgKiBjb3JyZXNwb25kcyB0byBhIGhlbGQgKGRlcXVldWVkL2F0dGFjaGVkKSBHcmFwaGljQnVmZmVyIGluIGEgc2xvdCBvZiBhCisgICAgICogYnVmZmVycXVldWUsIGl0cyBkZXN0cnVjdGlvbiBzaG91bGQgdHJpZ2dlciBhIGNhbGwgdG8KKyAgICAgKiBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpjYW5jZWxCdWZmZXIoKS4gT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoZQorICAgICAqIEdyYXBoaWNCdWZmZXIgaXMgbm90IGhlbGQsIGkuZS4sIGlmIGl0IGhhcyBiZWVuIHF1ZXVlZCBvciBkZXRhY2hlZCwKKyAgICAgKiBjYW5jZWxCdWZmZXIoKSBzaG91bGQgbm90IGJlIGNhbGxlZCB1cG9uIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGUgYmxvY2suCisgICAgICoKKyAgICAgKiBfQzJCbG9ja1Bvb2xEYXRhIGNyZWF0ZWQgYnkgYSBidWZmZXJxdWV1ZS1iYXNlZCBibG9ja3Bvb2wgaW5jbHVkZXMgdHdvCisgICAgICogbWFpbiBwaWVjZXMgb2YgaW5mb3JtYXRpb246CisgICAgICogICAtICJoZWxkIiBzdGF0dXM6IFdoZXRoZXIgY2FuY2VsQnVmZmVyKCkgc2hvdWxkIGJlIGNhbGxlZCB1cG9uCisgICAgICogICAgIGRlc3RydWN0aW9uIG9mIHRoZSBibG9jay4KKyAgICAgKiAgIC0gYnVmZmVycXVldWUgYXNzaWdubWVudDogVGhlIHF1YWRydXBsZSAoaWdicCwgZ2VuZXJhdGlvbiwgYnFJZCwKKyAgICAgKiAgICAgYnFTbG90KSwgd2hlcmUgaWdicCBpcyB0aGUgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBpbnN0YW5jZSBvZiB0aGUKKyAgICAgKiAgICAgYnVmZmVycXVldWUsIGdlbmVyYXRpb24gaXMgdGhlIGxhdGVzdCBnZW5lcmF0aW9uIG51bWJlciwgb2YgdGhlCisgICAgICogICAgIGJ1ZmZlcnF1ZXVlLCBicUlkIGlzIHRoZSBnbG9iYWxseSB1bmlxdWUgaWQgb2YgdGhlIGJ1ZmZlcnF1ZXVlLCBhbmQKKyAgICAgKiAgICAgYnFTbG90IGlzIHRoZSBzbG90IGluIHRoZSBidWZmZXJxdWV1ZS4KKyAgICAgKgorICAgICAqIGlnYnAgaXMgdGhlIGluc3RhbmNlIG9mIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgb24gd2hpY2ggY2FuY2VsQnVmZmVyKCkKKyAgICAgKiB3aWxsIGJlIGNhbGxlZCBpZiAiaGVsZCIgc3RhdHVzIGlzIHRydWUgd2hlbiB0aGUgYmxvY2sgaXMgZGVzdHJveWVkLgorICAgICAqIChicVNsb3QgaXMgYW4gaW5wdXQgdG8gY2FuY2VsQnVmZmVyKCkuKSBIb3dldmVyLCBvbmx5IGdlbmVyYXRpb24sIGJxSWQKKyAgICAgKiBhbmQgYnFTbG90IGFyZSByZXRhaW5lZCB3aGVuIGEgYmxvY2sgaXMgdHJhbnNmZXJyZWQgZnJvbSBvbmUgcHJvY2VzcyB0bworICAgICAqIGFub3RoZXIuIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiBib3RoIHRoZSBzZW5kaW5nIGFuZCByZWNlaXZpbmcKKyAgICAgKiBwcm9jZXNzZXMgdG8gbWFpbnRhaW4gY29uc2lzdGVuY3kgb2YgImhlbGQiIHN0YXR1cyBhbmQgaWdicC4gQmVsb3cgYXJlCisgICAgICogZnVuY3Rpb25zIHByb3ZpZGVkIGZvciB0aGlzIHB1cnBvc2U6CisgICAgICoKKyAgICAgKiAgIC0gR2V0QnVmZmVyUXVldWVEYXRhKCk6IFJldHVybnMgZ2VuZXJhdGlvbiwgYnFJZCBhbmQgYnFTbG90LgorICAgICAqICAgLSBIb2xkQmxvY2tGcm9tQnVmZmVyUXVldWUoKTogU2V0cyAiaGVsZCIgc3RhdHVzIHRvIHRydWUuCisgICAgICogICAtIFlpZWxkQmxvY2tUb0J1ZmZlclF1ZXVlKCk6IFNldHMgImhlbGQiIHN0YXR1cyB0byBmYWxzZS4KKyAgICAgKiAgIC0gQXNzaWduQmxvY2tUb0J1ZmZlclF1ZXVlKCk6IFNldHMgdGhlIGJ1ZmZlcnF1ZXVlIGFzc2lnbm1lbnQgYW5kCisgICAgICogICAgICJoZWxkIiBzdGF0dXMuCisgICAgICoKKyAgICAgKiBBbGwgdGhlc2UgZnVuY3Rpb25zIG9wZXJhdGUgb24gX0MyQmxvY2tQb29sRGF0YSwgd2hpY2ggY2FuIGJlIG9idGFpbmVkIGJ5CisgICAgICogY2FsbGluZyBHZXRHcmFwaGljQmxvY2tQb29sRGF0YSgpLgorICAgICAqCisgICAgICogSG9sZEJsb2NrRnJvbUJ1ZmZlclF1ZXVlKCkgd2lsbCBtYXJrIHRoZSBibG9jayBhcyBoZWxkLCB3aGlsZQorICAgICAqIFlpZWxkQmxvY2tUb0J1ZmZlclF1ZXVlKCkgd2lsbCBkbyB0aGUgb3Bwb3NpdGUuIFRoZXNlIHR3byBmdW5jdGlvbnMgZG8KKyAgICAgKiBub3QgbW9kaWZ5IHRoZSBidWZmZXJxdWV1ZSBhc3NpZ25tZW50LCBzbyBpdCBpcyBub3Qgd3JvbmcgdG8gY2FsbAorICAgICAqIEhvbGRCbG9ja0Zyb21CdWZmZXJRdWV1ZSgpIGFmdGVyIFlpZWxkQmxvY2tUb0J1ZmZlclF1ZXVlKCkgaWYgaXQgY2FuIGJlCisgICAgICogZ3VhcmFudGVlZCB0aGF0IHRoZSBibG9jayBpcyBub3QgZGVzdHJveWVkIGR1cmluZyB0aGUgcGVyaW9kIGJldHdlZW4gdGhlCisgICAgICogdHdvIGNhbGxzLgorICAgICAqCisgICAgICogQXNzaW5nQmxvY2tUb0J1ZmZlclF1ZXVlKCkgaGFzIGEgImhlbGQiIHN0YXR1cyBhcyBhbiBvcHRpb25hbCBhcmd1bWVudC4KKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLgorICAgICAqCisgICAgICogTWFpbnRhaW5pbmcgQ29uc2lzdGVuY3kgd2l0aCBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIE9wZXJhdGlvbnMKKyAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAqCisgICAgICogZGVxdWV1ZUJ1ZmZlcigpCisgICAgICogICAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBibG9ja3Bvb2wuIEl0IHNob3VsZCBub3QgYmUgY2FsbGVkCisgICAgICogICAgIG1hbnVhbGx5LiBUaGUgYmxvY2twb29sIHdpbGwgYXV0b21hdGljYWxseSBnZW5lcmF0ZSB0aGUgY29ycmVjdAorICAgICAqICAgICBpbmZvcm1hdGlvbiBmb3IgX0MyQmxvY2tQb29sRGF0YSwgd2l0aCAiaGVsZCIgc3RhdHVzIHNldCB0byB0cnVlLgorICAgICAqCisgICAgICogcXVldWVCdWZmZXIoKQorICAgICAqICAgLSBBZnRlciBxdWV1ZUJ1ZmZlcigpIGlzIGNhbGxlZCwgWWllbGRCbG9ja1RvQnVmZmVyUXVldWUoKSBzaG91bGQgYmUKKyAgICAgKiAgICAgY2FsbGVkLgorICAgICAqCisgICAgICogYXR0YWNoQnVmZmVyKCkKKyAgICAgKiAgIC0gQWZ0ZXIgYXR0YWNoQnVmZmVyKCkgaXMgY2FsbGVkLCBBc3NpZ25CbG9ja1RvQnVmZmVyUXVldWUoKSBzaG91bGQgYmUKKyAgICAgKiAgICAgY2FsbGVkIHdpdGggImhlbGQiIHN0YXR1cyBzZXQgdG8gdHJ1ZS4KKyAgICAgKgorICAgICAqIGRldGFjaEJ1ZmZlcigpCisgICAgICogICAtIEFmdGVyIGRldGFjaEJ1ZmZlcigpIGlzIGNhbGxlZCwgSG9sZEJsb2NrRnJvbUJ1ZmZlclF1ZXVlKCkgc2hvdWxkIGJlCisgICAgICogICAgIGNhbGxlZC4KKyAgICAgKi8KKworICAgIC8qKgorICAgICAqIEdldCBidWZmZXJxdWV1ZSBkYXRhIGZyb20gdGhlIGJsb2NrcG9vbCBkYXRhLgorICAgICAqCisgICAgICogQ2FsbGluZyB0aGlzIGZ1bmN0aW9uIHdpdGggXHAgZ2VuZXJhdGlvbiBzZXQgdG8gbnVsbHB0ciB3aWxsIHJldHVybgorICAgICAqIHdoZXRoZXIgdGhlIGJsb2NrIGNvbWVzIGZyb20gYSBidWZmZXJxdWV1ZS1iYXNlZCBibG9ja3Bvb2wsIGJ1dCB3aWxsIG5vdAorICAgICAqIGZpbGwgaW4gdGhlIHZhbHVlcyBmb3IgXHAgZ2VuZXJhdGlvbiwgXHAgYnFJZCBvciBccCBicVNsb3QuCisgICAgICoKKyAgICAgKiBccGFyYW1baW5dICBwb29sRGF0YSAgIGJsb2NrcG9vbCBkYXRhLgorICAgICAqIFxwYXJhbVtvdXRdIGdlbmVyYXRpb24gR2VuZXJhdGlvbiBudW1iZXIgYXR0YWNoZWQgdG8gdGhlIGJ1ZmZlci4KKyAgICAgKiBccGFyYW1bb3V0XSBicUlkICAgICAgIElkIG9mIHRoZSBidWZmZXJxdWV1ZSBvd25pbmcgdGhlIGJ1ZmZlciAoYmxvY2spLgorICAgICAqIFxwYXJhbVtvdXRdIGJxU2xvdCAgICAgU2xvdCBudW1iZXIgb2YgdGhlIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gXGMgdHJ1ZSB3aGVuIHRoZXJlIGlzIHZhbGlkIGJ1ZmZlcnF1ZXVlIGRhdGE7CisgICAgICogICAgICAgICBcYyBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgc3RhdGljCisgICAgYm9vbCBHZXRCdWZmZXJRdWV1ZURhdGEoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIHBvb2xEYXRhLAorICAgICAgICAgICAgdWludDMyX3QqIGdlbmVyYXRpb24gPSBudWxscHRyLAorICAgICAgICAgICAgdWludDY0X3QqIGJxSWQgPSBudWxscHRyLAorICAgICAgICAgICAgaW50MzJfdCogYnFTbG90ID0gbnVsbHB0cik7CisKKyAgICAvKioKKyAgICAgKiBTZXQgYnVmZmVycXVldWUgYXNzaWdubWVudCBhbmQgImhlbGQiIHN0YXR1cyB0byBhIGJsb2NrIGNyZWF0ZWQgYnkgYQorICAgICAqIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrcG9vbC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwb29sRGF0YSBibG9ja3Bvb2wgZGF0YSBhc3NvY2lhdGVkIHRvIHRoZSBibG9jay4KKyAgICAgKiBccGFyYW0gaWdicCAgICAgICBcYyBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGluc3RhbmNlIGZyb20gdGhlIGRlc2lnbmF0ZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICBidWZmZXJxdWV1ZS4KKyAgICAgKiBccGFyYW0gZ2VuZXJhdGlvbiBHZW5lcmF0aW9uIG51bWJlciB0aGF0IHRoZSBidWZmZXIgYmVsb25ncyB0by4KKyAgICAgKiBccGFyYW0gYnFJZCAgICAgICBJZCBvZiB0aGUgYnVmZmVycXVldWUgdGhhdCB3aWxsIG93biB0aGUgYnVmZmVyIChibG9jaykuCisgICAgICogXHBhcmFtIGJxU2xvdCAgICAgU2xvdCBudW1iZXIgb2YgdGhlIGJ1ZmZlci4KKyAgICAgKiBccGFyYW0gaGVsZCAgICAgICBXaGV0aGVyIHRoZSBibG9jayBpcyBoZWxkLiBUaGlzICJoZWxkIiBzdGF0dXMgY2FuIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgY2hhbmdlZCBsYXRlciBieSBjYWxsaW5nIFlpZWxkQmxvY2tUb0J1ZmZlclF1ZXVlKCkgb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICBIb2xkQmxvY2tGcm9tQnVmZmVyUXVldWUoKS4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gXGMgdHJ1ZSBpZiBccCBwb29sRGF0YSBpcyB2YWxpZCBidWZmZXJxdWV1ZSBkYXRhOworICAgICAqICAgICAgICAgXGMgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogTm90ZTogXHAgZ2VuZXJhdGlvbiBzaG91bGQgbWF0Y2ggdGhlIGxhdGVzdCBnZW5lcmF0aW9uIG51bWJlciBzZXQgb24gdGhlCisgICAgICogYnVmZmVycXVldWUsIGFuZCBccCBicUlkIHNob3VsZCBtYXRjaCB0aGUgdW5pcXVlIGlkIGZvciB0aGUgYnVmZmVycXVldWUKKyAgICAgKiAob2J0YWluYWJsZSBieSBjYWxsaW5nIGlnYnAtPmdldFVuaXF1ZUlkKCkpLgorICAgICAqLworICAgIHN0YXRpYworICAgIGJvb2wgQXNzaWduQmxvY2tUb0J1ZmZlclF1ZXVlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+JiBwb29sRGF0YSwKKyAgICAgICAgICAgIGNvbnN0IDo6YW5kcm9pZDo6c3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjJfMDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnAsCisgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLAorICAgICAgICAgICAgdWludDY0X3QgYnFJZCwKKyAgICAgICAgICAgIGludDMyX3QgYnFTbG90LAorICAgICAgICAgICAgYm9vbCBoZWxkID0gdHJ1ZSk7CisKKyAgICAvKioKKyAgICAgKiBIb2xkIGEgYmxvY2sgZnJvbSB0aGUgZGVzaWduYXRlZCBidWZmZXJxdWV1ZS4gVGhpcyBjYXVzZXMgdGhlIGRlc3RydWN0aW9uCisgICAgICogb2YgdGhlIGJsb2NrIHRvIHRyaWdnZXIgYSBjYWxsIHRvIGNhbmNlbEJ1ZmZlcigpLgorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgXHAgcG9vbERhdGEgY29tZXMgZnJvbSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkCisgICAgICogYmxvY2suIEl0IGRvZXMgbm90IGNoZWNrIGlmIHRoYXQgaXMgdGhlIGNhc2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gcG9vbERhdGEgYmxvY2twb29sIGRhdGEgYXNzb2NpYXRlZCB0byB0aGUgYmxvY2suCisgICAgICogXHBhcmFtIGlnYnAgICAgIFxjIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgaW5zdGFuY2UgdG8gYmUgYXNzaWduZWQgdG8gdGhlCisgICAgICogICAgICAgICAgICAgICAgIGJsb2NrLiBUaGlzIGlzIG5vdCBuZWVkZWQgd2hlbiB0aGUgYmxvY2sgaXMgbG9jYWwuCisgICAgICoKKyAgICAgKiBccmV0dXJuIFRoZSBwcmV2aW91cyBoZWxkIHN0YXR1cy4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBib29sIEhvbGRCbG9ja0Zyb21CdWZmZXJRdWV1ZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiYgcG9vbERhdGEsCisgICAgICAgICAgICBjb25zdCA6OmFuZHJvaWQ6OnNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFYyXzA6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwID0gbnVsbHB0cik7CisKKyAgICAvKioKKyAgICAgKiBZaWVsZCBhIGJsb2NrIHRvIHRoZSBkZXNpZ25hdGVkIGJ1ZmZlcnF1ZXVlLiBUaGlzIGNhdXNlcyB0aGUgZGVzdHJ1Y3Rpb24KKyAgICAgKiBvZiB0aGUgYmxvY2sgbm90IHRvIHRyaWdnZXIgYSBjYWxsIHRvIGNhbmNlbEJ1ZmZlcigpOworICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgXHAgcG9vbERhdGEgY29tZXMgZnJvbSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkCisgICAgICogYmxvY2suIEl0IGRvZXMgbm90IGNoZWNrIGlmIHRoYXQgaXMgdGhlIGNhc2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gcG9vbERhdGEgYmxvY2twb29sIGRhdGEgYXNzb2NpYXRlZCB0byB0aGUgYmxvY2suCisgICAgICoKKyAgICAgKiBccmV0dXJuIFRoZSBwcmV2aW91cyBoZWxkIHN0YXR1cy4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBib29sIFlpZWxkQmxvY2tUb0J1ZmZlclF1ZXVlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+JiBwb29sRGF0YSk7CisKK307CisKKyNlbmRpZiAvLyBBTkRST0lEX1NUQUdFRlJJR0hUX0MyQkxPQ0tfSU5URVJOQUxfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW50ZXJuYWwvQzJQYXJhbUludGVybmFsLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbnRlcm5hbC9DMlBhcmFtSW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGE4ZjI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW50ZXJuYWwvQzJQYXJhbUludGVybmFsLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU1RBR0VGUklHSFRfQzJQQVJBTV9JTlRFUk5BTF9IXworI2RlZmluZSBBTkRST0lEX1NUQUdFRlJJR0hUX0MyUEFSQU1fSU5URVJOQUxfSF8KKworI2luY2x1ZGUgPEMyUGFyYW0uaD4KKworc3RydWN0IEMyX0hJREUgX0MyUGFyYW1JbnNwZWN0b3IgeworICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgR2V0T2Zmc2V0KGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmZCkgeworICAgICAgICByZXR1cm4gZmQuX21GaWVsZElkLl9tT2Zmc2V0OworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdm9pZCBTZXRPZmZzZXQoQzJGaWVsZERlc2NyaXB0b3IgJmZkLCB1aW50MzJfdCBvZmZzZXQpIHsKKyAgICAgICAgZmQuX21GaWVsZElkLl9tT2Zmc2V0ID0gb2Zmc2V0OworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgR2V0RW5kT2Zmc2V0KGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmZCwgdWludDMyX3QgcGFyYW1TaXplID0gMCkgeworICAgICAgICB1aW50MzJfdCBlbmRPZmZzZXQgPSBmZC5fbUZpZWxkSWQuX21PZmZzZXQgKyBmZC5fbUV4dGVudCAqIGZkLl9tRmllbGRJZC5fbVNpemU7CisgICAgICAgIC8vLyBmb3IgZmxleCBwYXJhbWV0ZXJzIHJldHVybiBwYXJhbVNpemUgaWYgZ2l2ZW4KKyAgICAgICAgcmV0dXJuIGZkLl9tRXh0ZW50ID8gZW5kT2Zmc2V0IDogc3RkOjptYXgoZW5kT2Zmc2V0LCBwYXJhbVNpemUpOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgR2V0U2l6ZShjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmQpIHsKKyAgICAgICAgcmV0dXJuIGZkLl9tRmllbGRJZC5fbVNpemU7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBHZXRJbmRleChjb25zdCBDMlBhcmFtRmllbGQgJnBmKSB7CisgICAgICAgIHJldHVybiBwZi5fbUluZGV4OworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgR2V0T2Zmc2V0KGNvbnN0IEMyUGFyYW1GaWVsZCAmcGYpIHsKKyAgICAgICAgcmV0dXJuIHBmLl9tRmllbGRJZC5fbU9mZnNldDsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldFNpemUoY29uc3QgQzJQYXJhbUZpZWxkICZwZikgeworICAgICAgICByZXR1cm4gcGYuX21GaWVsZElkLl9tU2l6ZTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldE9mZnNldChjb25zdCBfQzJGaWVsZElkICZmKSB7CisgICAgICAgIHJldHVybiBmLl9tT2Zmc2V0OworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgR2V0U2l6ZShjb25zdCBfQzJGaWVsZElkICZmKSB7CisgICAgICAgIHJldHVybiBmLl9tU2l6ZTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIF9DMkZpZWxkSWQgR2V0RmllbGQoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZkKSB7CisgICAgICAgIHJldHVybiBmZC5fbUZpZWxkSWQ7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBHZXRBdHRyaWIoY29uc3QgQzJQYXJhbURlc2NyaXB0b3IgJnBkKSB7CisgICAgICAgIHJldHVybiBwZC5fbUF0dHJpYjsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIF9DMkZpZWxkSWQgR2V0RmllbGQoY29uc3QgQzJQYXJhbUZpZWxkICZwZikgeworICAgICAgICByZXR1cm4gcGYuX21GaWVsZElkOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMKKyAgICBDMlBhcmFtRmllbGQgQ3JlYXRlUGFyYW1GaWVsZChDMlBhcmFtOjpJbmRleCBpbmRleCwgdWludDMyX3Qgb2Zmc2V0LCB1aW50MzJfdCBzaXplKSB7CisgICAgICAgIHJldHVybiBDMlBhcmFtRmllbGQoaW5kZXgsIG9mZnNldCwgc2l6ZSk7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYworICAgIEMyUGFyYW1GaWVsZCBDcmVhdGVQYXJhbUZpZWxkKEMyUGFyYW06OkluZGV4IGluZGV4LCBfQzJGaWVsZElkIGZpZWxkKSB7CisgICAgICAgIHJldHVybiBDMlBhcmFtRmllbGQoaW5kZXgsIGZpZWxkLl9tT2Zmc2V0LCBmaWVsZC5fbVNpemUpOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMKKyAgICB2b2lkIFRyaW1QYXJhbShDMlBhcmFtICpwYXJhbSwgdWludDMyX3QgbmV3U2l6ZSkgeworICAgICAgICBpZiAocGFyYW0gJiYgKnBhcmFtICYmIHBhcmFtLT5zaXplKCkgPiBuZXdTaXplICYmIG5ld1NpemUgPj0gc2l6ZW9mKEMyUGFyYW0pKSB7CisgICAgICAgICAgICBwYXJhbS0+X21TaXplID0gbmV3U2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdm9pZCBBZGROYW1lZFZhbHVlcygKKyAgICAgICAgICAgIEMyRmllbGREZXNjcmlwdG9yICZmZCwgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSAmJm5hbWVkVmFsdWVzKSB7CisgICAgICAgIGZkLl9tTmFtZWRWYWx1ZXMgPSBzdGQ6Om1vdmUobmFtZWRWYWx1ZXMpOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMKKyAgICBDMlN0cnVjdERlc2NyaXB0b3IgQ3JlYXRlU3RydWN0RGVzY3JpcHRvcihDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+ICYmZmllbGRzKSB7CisgICAgICAgIHJldHVybiBDMlN0cnVjdERlc2NyaXB0b3IoaW5kZXgsIHN0ZDo6bW92ZShmaWVsZHMpKTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljCisgICAgQzJGaWVsZERlc2NyaXB0b3IgT2Zmc2V0RmllbGREZXNjcmlwdG9yKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmZCwgc2l6ZV90IG9mZnNldCkgeworICAgICAgICByZXR1cm4gQzJGaWVsZERlc2NyaXB0b3IoZmQsIG9mZnNldCk7CisgICAgfQorCisgICAgLy8gZXhwb3NlIGF0dHJpYnV0ZXMKKyAgICB0eXBlZGVmIEMyUGFyYW1EZXNjcmlwdG9yOjphdHRyaWJfdCBhdHRyaWJfdDsKK307CisKKyNlbmRpZiAvLyBBTkRST0lEX1NUQUdFRlJJR0hUX0MyUEFSQU1fSU5URVJOQUxfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvcGxhdGZvcm0vQzJCcUJ1ZmZlci5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9wbGF0Zm9ybS9DMkJxQnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjQwZTU2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvcGxhdGZvcm0vQzJCcUJ1ZmZlci5jcHAKQEAgLTAsMCArMSw1MDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyQnFCdWZmZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDx1aS9CdWZmZXJRdWV1ZURlZnMuaD4KKyNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+CisjaW5jbHVkZSA8dWkvRmVuY2UuaD4KKworI2luY2x1ZGUgPHR5cGVzLmg+CisKKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJxQnVmZmVyUHJpdi5oPgorI2luY2x1ZGUgPEMyQmxvY2tJbnRlcm5hbC5oPgorCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bXV0ZXg+CisKK3VzaW5nIDo6YW5kcm9pZDo6QnVmZmVyUXVldWVEZWZzOjpOVU1fQlVGRkVSX1NMT1RTOwordXNpbmcgOjphbmRyb2lkOjpDMkFsbG9jYXRvckdyYWxsb2M7Cit1c2luZyA6OmFuZHJvaWQ6OkMyQW5kcm9pZE1lbW9yeVVzYWdlOwordXNpbmcgOjphbmRyb2lkOjpGZW5jZTsKK3VzaW5nIDo6YW5kcm9pZDo6R3JhcGhpY0J1ZmZlcjsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7Cit1c2luZyA6OmFuZHJvaWQ6OnN0YXR1c190OwordXNpbmcgOjphbmRyb2lkOjp3cDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOworCit1c2luZyBIQnVmZmVyID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMjo6SGFyZHdhcmVCdWZmZXI7Cit1c2luZyBIU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMl8wOjpTdGF0dXM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYyXzA6OnV0aWxzOjpiMmg7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYyXzA6OnV0aWxzOjpoMmI7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYyXzA6OnV0aWxzOjpIRmVuY2VXcmFwcGVyOworCit1c2luZyBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMl8wCisgICAgICAgIDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKworc3RydWN0IEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhIDogcHVibGljIF9DMkJsb2NrUG9vbERhdGEgeworCisgICAgYm9vbCBoZWxkOworICAgIGJvb2wgbG9jYWw7CisgICAgdWludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICB1aW50NjRfdCBicUlkOworICAgIGludDMyX3QgYnFTbG90OworICAgIHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGlnYnA7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OkltcGw+IGxvY2FsUG9vbDsKKworICAgIHZpcnR1YWwgdHlwZV90IGdldFR5cGUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBUWVBFX0JVRkZFUlFVRVVFOworICAgIH0KKworICAgIC8vIENyZWF0ZSBhIHJlbW90ZSBCbG9ja1Bvb2xEYXRhLgorICAgIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhKAorICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgYnFJZCwgaW50MzJfdCBicVNsb3QsCisgICAgICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgcHJvZHVjZXIgPSBudWxscHRyKTsKKworICAgIC8vIENyZWF0ZSBhIGxvY2FsIEJsb2NrUG9vbERhdGEuCisgICAgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGEoCisgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLCB1aW50NjRfdCBicUlkLCBpbnQzMl90IGJxU2xvdCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpJbXBsPiYgcG9vbCk7CisKKyAgICB2aXJ0dWFsIH5DMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgpIG92ZXJyaWRlOworCit9OworCitib29sIF9DMkJsb2NrRmFjdG9yeTo6R2V0QnVmZmVyUXVldWVEYXRhKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIGRhdGEsCisgICAgICAgIHVpbnQzMl90KiBnZW5lcmF0aW9uLCB1aW50NjRfdCogYnFJZCwgaW50MzJfdCogYnFTbG90KSB7CisgICAgaWYgKGRhdGEgJiYgZGF0YS0+Z2V0VHlwZSgpID09IF9DMkJsb2NrUG9vbERhdGE6OlRZUEVfQlVGRkVSUVVFVUUpIHsKKyAgICAgICAgaWYgKGdlbmVyYXRpb24pIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KGRhdGEpOworICAgICAgICAgICAgKmdlbmVyYXRpb24gPSBwb29sRGF0YS0+Z2VuZXJhdGlvbjsKKyAgICAgICAgICAgIGlmIChicUlkKSB7CisgICAgICAgICAgICAgICAgKmJxSWQgPSBwb29sRGF0YS0+YnFJZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChicVNsb3QpIHsKKyAgICAgICAgICAgICAgICAqYnFTbG90ID0gcG9vbERhdGEtPmJxU2xvdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIF9DMkJsb2NrRmFjdG9yeTo6QXNzaWduQmxvY2tUb0J1ZmZlclF1ZXVlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIGRhdGEsCisgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwLAorICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLAorICAgICAgICB1aW50NjRfdCBicUlkLAorICAgICAgICBpbnQzMl90IGJxU2xvdCwKKyAgICAgICAgYm9vbCBoZWxkKSB7CisgICAgaWYgKGRhdGEgJiYgZGF0YS0+Z2V0VHlwZSgpID09IF9DMkJsb2NrUG9vbERhdGE6OlRZUEVfQlVGRkVSUVVFVUUpIHsKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICAgICAgcG9vbERhdGEtPmlnYnAgPSBpZ2JwOworICAgICAgICBwb29sRGF0YS0+Z2VuZXJhdGlvbiA9IGdlbmVyYXRpb247CisgICAgICAgIHBvb2xEYXRhLT5icUlkID0gYnFJZDsKKyAgICAgICAgcG9vbERhdGEtPmJxU2xvdCA9IGJxU2xvdDsKKyAgICAgICAgcG9vbERhdGEtPmhlbGQgPSBoZWxkOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIF9DMkJsb2NrRmFjdG9yeTo6SG9sZEJsb2NrRnJvbUJ1ZmZlclF1ZXVlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIGRhdGEsCisgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwKSB7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KGRhdGEpOworICAgIGlmICghcG9vbERhdGEtPmxvY2FsKSB7CisgICAgICAgIHBvb2xEYXRhLT5pZ2JwID0gaWdicDsKKyAgICB9CisgICAgaWYgKHBvb2xEYXRhLT5oZWxkKSB7CisgICAgICAgIHBvb2xEYXRhLT5oZWxkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBwb29sRGF0YS0+aGVsZCA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgX0MyQmxvY2tGYWN0b3J5OjpZaWVsZEJsb2NrVG9CdWZmZXJRdWV1ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+JiBkYXRhKSB7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KGRhdGEpOworICAgIGlmICghcG9vbERhdGEtPmhlbGQpIHsKKyAgICAgICAgcG9vbERhdGEtPmhlbGQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBwb29sRGF0YS0+aGVsZCA9IGZhbHNlOworICAgIHJldHVybiB0cnVlOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKSB7CisgICAgLy8gVE9ETzogZ2V0IHByb3BlciBhbGxvY2F0b3I/IGFuZCBtdXRleD8KKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyQWxsb2NhdG9yR3JhbGxvYz4gc0FsbG9jYXRvciA9IHN0ZDo6bWFrZV91bmlxdWU8QzJBbGxvY2F0b3JHcmFsbG9jPigwKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICBpZiAoQzJBbGxvY2F0b3JHcmFsbG9jOjppc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICAgICAgdWludDMyX3Qgd2lkdGg7CisgICAgICAgIHVpbnQzMl90IGhlaWdodDsKKyAgICAgICAgdWludDMyX3QgZm9ybWF0OworICAgICAgICB1aW50NjRfdCB1c2FnZTsKKyAgICAgICAgdWludDMyX3Qgc3RyaWRlOworICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICB1aW50NjRfdCBicUlkOworICAgICAgICB1aW50MzJfdCBicVNsb3Q7CisgICAgICAgIGFuZHJvaWQ6Ol9VbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jTWV0YWRhdGEoCisgICAgICAgICAgICAgICAgaGFuZGxlLCAmd2lkdGgsICZoZWlnaHQsICZmb3JtYXQsICZ1c2FnZSwgJnN0cmlkZSwgJmdlbmVyYXRpb24sICZicUlkLCAmYnFTbG90KTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gc0FsbG9jYXRvci0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihoYW5kbGUsICZhbGxvYyk7CisgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2s7CisgICAgICAgICAgICBpZiAoYnFJZCB8fCBicVNsb3QpIHsKKyAgICAgICAgICAgICAgICAvLyBCUUJCUAorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4oZ2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJxSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClicVNsb3QpOworICAgICAgICAgICAgICAgIGJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soYWxsb2MsIHBvb2xEYXRhKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jayhhbGxvYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gYmxvY2s7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK2NsYXNzIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OkltcGwKKyAgICAgICAgOiBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpJbXBsPiB7Citwcml2YXRlOgorICAgIGMyX3N0YXR1c190IGZldGNoRnJvbUlnYnBfbCgKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgLy8gV2UgaGF2ZSBhbiBJR0JQIG5vdy4KKyAgICAgICAgQzJBbmRyb2lkTWVtb3J5VXNhZ2UgYW5kcm9pZFVzYWdlID0gdXNhZ2U7CisgICAgICAgIHN0YXR1c190IHN0YXR1c3t9OworICAgICAgICBpbnQgc2xvdHt9OworICAgICAgICBib29sIGJ1ZmZlck5lZWRzUmVhbGxvY2F0aW9ue307CisgICAgICAgIHNwPEZlbmNlPiBmZW5jZSA9IG5ldyBGZW5jZSgpOworICAgICAgICBBTE9HVigidHJpZXMgdG8gZGVxdWV1ZSBidWZmZXIiKTsKKworICAgICAgICB7IC8vIENhbGwgZGVxdWV1ZUJ1ZmZlcigpLgorICAgICAgICAgICAgdXNpbmcgSW5wdXQgPSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEZXF1ZXVlQnVmZmVySW5wdXQ7CisgICAgICAgICAgICB1c2luZyBPdXRwdXQgPSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEZXF1ZXVlQnVmZmVyT3V0cHV0OworICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gbVByb2R1Y2VyLT5kZXF1ZXVlQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBJbnB1dHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZFVzYWdlLmFzR3JhbGxvY1VzYWdlKCl9LAorICAgICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJnNsb3QsICZidWZmZXJOZWVkc1JlYWxsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICZmZW5jZV0oSFN0YXR1cyBoU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhTbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXQgY29uc3QmIGhPdXRwdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QgPSBzdGF0aWNfY2FzdDxpbnQ+KGhTbG90KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaDJiKGhTdGF0dXMsICZzdGF0dXMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFoMmIoaE91dHB1dC5mZW5jZSwgJmZlbmNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJOZWVkc1JlYWxsb2NhdGlvbiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoT3V0cHV0LmJ1ZmZlck5lZWRzUmVhbGxvY2F0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpIHx8IHN0YXR1cyAhPSBhbmRyb2lkOjpPSykgeworICAgICAgICAgICAgICAgIGlmICh0cmFuc1Jlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBhbmRyb2lkOjpJTlZBTElEX09QRVJBVElPTiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID09IGFuZHJvaWQ6OlRJTUVEX09VVCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID09IGFuZHJvaWQ6OldPVUxEX0JMT0NLKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZXF1ZXVlIGJ1ZmZlciBpcyBibG9ja2VkIHRlbXBvcmFyaWx5LiBSZXRyeWluZyBpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZWQuCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkxPQ0tJTkc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR0QoImNhbm5vdCBkZXF1ZXVlIGJ1ZmZlciAlZCIsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBIRmVuY2VXcmFwcGVyIGhGZW5jZVdyYXBwZXJ7fTsKKyAgICAgICAgaWYgKCFiMmgoZmVuY2UsICZoRmVuY2VXcmFwcGVyKSkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgZmVuY2UgcmVjZWl2ZWQgZnJvbSBkZXF1ZXVlQnVmZmVyLiIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiZGVxdWV1ZWQgYSBidWZmZXIgc3VjY2Vzc2Z1bGx5Iik7CisgICAgICAgIGlmIChmZW5jZSkgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0ZlbmNlV2FpdFRpbWVNcyA9IDEwOworCisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBmZW5jZS0+d2FpdChrRmVuY2VXYWl0VGltZU1zKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gLUVUSU1FKSB7CisgICAgICAgICAgICAgICAgLy8gZmVuY2UgaXMgbm90IHNpZ25hbGxlZCB5ZXQuCisgICAgICAgICAgICAgICAgKHZvaWQpbVByb2R1Y2VyLT5jYW5jZWxCdWZmZXIoc2xvdCwgaEZlbmNlV3JhcHBlci5nZXRIYW5kbGUoKSkuaXNPaygpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CTE9DS0lORzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gYW5kcm9pZDo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiYnVmZmVyIGZlbmNlIHdhaXQgZXJyb3IgJWQiLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICh2b2lkKW1Qcm9kdWNlci0+Y2FuY2VsQnVmZmVyKHNsb3QsIGhGZW5jZVdyYXBwZXIuZ2V0SGFuZGxlKCkpLmlzT2soKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfSBlbHNlIGlmIChtUmVuZGVyQ2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICBuc2Vjc190IHNpZ25hbFRpbWUgPSBmZW5jZS0+Z2V0U2lnbmFsVGltZSgpOworICAgICAgICAgICAgICAgIGlmIChzaWduYWxUaW1lID49IDAgJiYgc2lnbmFsVGltZSA8IElOVDY0X01BWCkgeworICAgICAgICAgICAgICAgICAgICBtUmVuZGVyQ2FsbGJhY2sobVByb2R1Y2VySWQsIHNsb3QsIHNpZ25hbFRpbWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJnb3QgZmVuY2Ugc2lnbmFsIHRpbWUgb2YgJWxsZCIsIChsb25nIGxvbmcpc2lnbmFsVGltZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gJnNsb3RCdWZmZXIgPSBtQnVmZmVyc1tzbG90XTsKKyAgICAgICAgaWYgKGJ1ZmZlck5lZWRzUmVhbGxvY2F0aW9uIHx8ICFzbG90QnVmZmVyKSB7CisgICAgICAgICAgICBpZiAoIXNsb3RCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBzbG90QnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE4uQi4gVGhpcyBhc3N1bWVzIHJlcXVlc3RCdWZmZXIjIHJldHVybnMgYW4gZXhpc3RpbmcgYWxsb2NhdGlvbgorICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBhIG5ldyBhbGxvY2F0aW9uLgorICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gbVByb2R1Y2VyLT5yZXF1ZXN0QnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBzbG90LAorICAgICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJnNsb3RCdWZmZXJdKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhTdGF0dXMgaFN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQnVmZmVyIGNvbnN0JiBoQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb25OdW1iZXIpeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGgyYihoU3RhdHVzLCAmc3RhdHVzKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoMmIoaEJ1ZmZlciwgJnNsb3RCdWZmZXIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyLT5zZXRHZW5lcmF0aW9uTnVtYmVyKGdlbmVyYXRpb25OdW1iZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBhbmRyb2lkOjpCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgaWYgKCF0cmFuc1Jlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgIT0gYW5kcm9pZDo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBzbG90QnVmZmVyLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgKHZvaWQpbVByb2R1Y2VyLT5jYW5jZWxCdWZmZXIoc2xvdCwgaEZlbmNlV3JhcHBlci5nZXRIYW5kbGUoKSkuaXNPaygpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNsb3RCdWZmZXIpIHsKKyAgICAgICAgICAgIEFMT0dWKCJidWZmZXIgd3JhcHMgJWxsdSAlZCIsICh1bnNpZ25lZCBsb25nIGxvbmcpbVByb2R1Y2VySWQsIHNsb3QpOworICAgICAgICAgICAgQzJIYW5kbGUgKmMySGFuZGxlID0gYW5kcm9pZDo6V3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoCisgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci0+d2lkdGgsCisgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci0+Zm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyLT51c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci0+c3RyaWRlLAorICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyLT5nZXRHZW5lcmF0aW9uTnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgIG1Qcm9kdWNlcklkLCBzbG90KTsKKyAgICAgICAgICAgIGlmIChjMkhhbmRsZSkgeworICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQWxsb2NhdG9yLT5wcmlvckdyYXBoaWNBbGxvY2F0aW9uKGMySGFuZGxlLCAmYWxsb2MpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci0+Z2V0R2VuZXJhdGlvbk51bWJlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJvZHVjZXJJZCwgc2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX2Zyb21fdGhpcygpKTsKKyAgICAgICAgICAgICAgICAqYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jayhhbGxvYywgcG9vbERhdGEpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEJsb2NrIHdhcyBub3QgY3JlYXRlZC4gY2FsbCByZXF1ZXN0QnVmZmVyIyBhZ2FpbiBuZXh0IHRpbWUuCisgICAgICAgICAgICBzbG90QnVmZmVyLmNsZWFyKCk7CisgICAgICAgICAgICAodm9pZCltUHJvZHVjZXItPmNhbmNlbEJ1ZmZlcihzbG90LCBoRmVuY2VXcmFwcGVyLmdldEhhbmRsZSgpKS5pc09rKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKK3B1YmxpYzoKKyAgICBJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jYXRvcikKKyAgICAgICAgOiBtSW5pdChDMl9PSyksIG1Qcm9kdWNlcklkKDApLCBtQWxsb2NhdG9yKGFsbG9jYXRvcikgeworICAgIH0KKworICAgIH5JbXBsKCkgeworICAgICAgICBib29sIG5vSW5pdCA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9CVUZGRVJfU0xPVFM7ICsraSkgeworICAgICAgICAgICAgaWYgKCFub0luaXQgJiYgbVByb2R1Y2VyKSB7CisgICAgICAgICAgICAgICAgUmV0dXJuPEhTdGF0dXM+IHRyYW5zUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9kdWNlci0+ZGV0YWNoQnVmZmVyKHN0YXRpY19jYXN0PGludDMyX3Q+KGkpKTsKKyAgICAgICAgICAgICAgICBub0luaXQgPSAhdHJhbnNSZXN1bHQuaXNPaygpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFN0YXR1cz4odHJhbnNSZXN1bHQpID09IEhTdGF0dXM6Ok5PX0lOSVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQnVmZmVyc1tpXS5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSB7CisgICAgICAgIGJsb2NrLT5yZXNldCgpOworICAgICAgICBpZiAobUluaXQgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBpbnQga01heElnYnBSZXRyeURlbGF5VXMgPSAxMDAwMDsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgaWYgKG1Qcm9kdWNlcklkID09IDApIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1BbGxvY2F0b3ItPm5ld0dyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCAmYWxsb2MpOworICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgKHVpbnQ2NF90KTAsIH4wLCBzaGFyZWRfZnJvbV90aGlzKCkpOworICAgICAgICAgICAgKmJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soYWxsb2MsIHBvb2xEYXRhKTsKKyAgICAgICAgICAgIEFMT0dWKCJhbGxvY2F0ZWQgYSBidWZmZXIgc3VjY2Vzc2Z1bGx5Iik7CisKKyAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgfQorICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBmZXRjaEZyb21JZ2JwX2wod2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgYmxvY2spOworICAgICAgICBpZiAoc3RhdHVzID09IEMyX0JMT0NLSU5HKSB7CisgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgLy8gaW4gb3JkZXIgbm90IHRvIGRyYWluIGNwdSBmcm9tIGNvbXBvbmVudCdzIHNwaW5uaW5nCisgICAgICAgICAgICA6OnVzbGVlcChrTWF4SWdicFJldHJ5RGVsYXlVcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2b2lkIHNldFJlbmRlckNhbGxiYWNrKGNvbnN0IE9uUmVuZGVyQ2FsbGJhY2sgJnJlbmRlckNhbGxiYWNrKSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIG1SZW5kZXJDYWxsYmFjayA9IHJlbmRlckNhbGxiYWNrOworICAgIH0KKworICAgIHZvaWQgY29uZmlndXJlUHJvZHVjZXIoY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gJnByb2R1Y2VyKSB7CisgICAgICAgIHVpbnQ2NF90IHByb2R1Y2VySWQgPSAwOworICAgICAgICBpZiAocHJvZHVjZXIpIHsKKyAgICAgICAgICAgIFJldHVybjx1aW50NjRfdD4gdHJhbnNSZXN1bHQgPSBwcm9kdWNlci0+Z2V0VW5pcXVlSWQoKTsKKyAgICAgICAgICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImNvbmZpZ3VyZVByb2R1Y2VyIC0tIGZhaWxlZCB0byBjb25uZWN0IHRvIHRoZSBwcm9kdWNlciIpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb2R1Y2VySWQgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4odHJhbnNSZXN1bHQpOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgICAgICBib29sIG5vSW5pdCA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fQlVGRkVSX1NMT1RTOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW5vSW5pdCAmJiBtUHJvZHVjZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgUmV0dXJuPEhTdGF0dXM+IHRyYW5zUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJvZHVjZXItPmRldGFjaEJ1ZmZlcihzdGF0aWNfY2FzdDxpbnQzMl90PihpKSk7CisgICAgICAgICAgICAgICAgICAgIG5vSW5pdCA9ICF0cmFuc1Jlc3VsdC5pc09rKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFN0YXR1cz4odHJhbnNSZXN1bHQpID09IEhTdGF0dXM6Ok5PX0lOSVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocHJvZHVjZXIpIHsKKyAgICAgICAgICAgICAgICBtUHJvZHVjZXIgPSBwcm9kdWNlcjsKKyAgICAgICAgICAgICAgICBtUHJvZHVjZXJJZCA9IHByb2R1Y2VySWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1Qcm9kdWNlciA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgbVByb2R1Y2VySWQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE7CisKKyAgICB2b2lkIGNhbmNlbCh1aW50NjRfdCBpZ2JwX2lkLCBpbnQzMl90IGlnYnBfc2xvdCkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBpZiAoaWdicF9pZCA9PSBtUHJvZHVjZXJJZCAmJiBtUHJvZHVjZXIpIHsKKyAgICAgICAgICAgICh2b2lkKW1Qcm9kdWNlci0+Y2FuY2VsQnVmZmVyKGlnYnBfc2xvdCwgaGlkbF9oYW5kbGV7fSkuaXNPaygpOworICAgICAgICB9CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgbUluaXQ7CisgICAgdWludDY0X3QgbVByb2R1Y2VySWQ7CisgICAgT25SZW5kZXJDYWxsYmFjayBtUmVuZGVyQ2FsbGJhY2s7CisKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBtUHJvZHVjZXI7CisKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBtQnVmZmVyc1tOVU1fQlVGRkVSX1NMT1RTXTsKK307CisKK0MyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOjpDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgYnFJZCwgaW50MzJfdCBicVNsb3QsCisgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBwcm9kdWNlcikgOgorICAgICAgICBoZWxkKHByb2R1Y2VyICYmIGJxSWQgIT0gMCksIGxvY2FsKGZhbHNlKSwKKyAgICAgICAgZ2VuZXJhdGlvbihnZW5lcmF0aW9uKSwgYnFJZChicUlkKSwgYnFTbG90KGJxU2xvdCksCisgICAgICAgIGlnYnAocHJvZHVjZXIpLAorICAgICAgICBsb2NhbFBvb2woKSB7Cit9CisKK0MyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOjpDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgYnFJZCwgaW50MzJfdCBicVNsb3QsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpJbXBsPiYgcG9vbCkgOgorICAgICAgICBoZWxkKHRydWUpLCBsb2NhbCh0cnVlKSwKKyAgICAgICAgZ2VuZXJhdGlvbihnZW5lcmF0aW9uKSwgYnFJZChicUlkKSwgYnFTbG90KGJxU2xvdCksCisgICAgICAgIGlnYnAocG9vbCA/IHBvb2wtPm1Qcm9kdWNlciA6IG51bGxwdHIpLAorICAgICAgICBsb2NhbFBvb2wocG9vbCkgeworfQorCitDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YTo6fkMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhKCkgeworICAgIGlmICghaGVsZCB8fCBicUlkID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAobG9jYWwgJiYgbG9jYWxQb29sKSB7CisgICAgICAgIGxvY2FsUG9vbC0+Y2FuY2VsKGJxSWQsIGJxU2xvdCk7CisgICAgfSBlbHNlIGlmIChpZ2JwKSB7CisgICAgICAgIGlnYnAtPmNhbmNlbEJ1ZmZlcihicVNsb3QsIGhpZGxfaGFuZGxle30pLmlzT2soKTsKKyAgICB9Cit9CisKK0MyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OkMyQnVmZmVyUXVldWVCbG9ja1Bvb2woCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jYXRvciwgY29uc3QgbG9jYWxfaWRfdCBsb2NhbElkKQorICAgICAgICA6IG1BbGxvY2F0b3IoYWxsb2NhdG9yKSwgbUxvY2FsSWQobG9jYWxJZCksIG1JbXBsKG5ldyBJbXBsKGFsbG9jYXRvcikpIHt9CisKK0MyQnVmZmVyUXVldWVCbG9ja1Bvb2w6On5DMkJ1ZmZlclF1ZXVlQmxvY2tQb29sKCkge30KKworYzJfc3RhdHVzX3QgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6ZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICB1aW50MzJfdCBoZWlnaHQsCisgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmZldGNoR3JhcGhpY0Jsb2NrKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsIGJsb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKK30KKwordm9pZCBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpjb25maWd1cmVQcm9kdWNlcihjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmcHJvZHVjZXIpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgbUltcGwtPmNvbmZpZ3VyZVByb2R1Y2VyKHByb2R1Y2VyKTsKKyAgICB9Cit9CisKK3ZvaWQgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6c2V0UmVuZGVyQ2FsbGJhY2soY29uc3QgT25SZW5kZXJDYWxsYmFjayAmcmVuZGVyQ2FsbGJhY2spIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgbUltcGwtPnNldFJlbmRlckNhbGxiYWNrKHJlbmRlckNhbGxiYWNrKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay90eXBlcy5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay90eXBlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTliMWU5YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL3R5cGVzLmNwcApAQCAtMCwwICsxLDMwOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8dWkvQnVmZmVyUXVldWVEZWZzLmg+CisjaW5jbHVkZSA8dHlwZXMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+CisjaW5jbHVkZSA8dm5kay9oYXJkd2FyZV9idWZmZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBncmFwaGljcyB7CituYW1lc3BhY2UgYnVmZmVycXVldWUgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKworLy8gVE9ETzogbW92ZSB0aGlzIGludG8gdWkvQnVmZmVyUXVldWVEZWZzLmggc28gdGhhdCB3ZSBkb24ndCBuZWVkCisvLyB0byBpbmNsdWRlIGhlYWRlcnMgZnJvbSBsaWJndWkuCitlbnVtIHsKKyAgICAvLyBUaGUgQVBJIG51bWJlciB1c2VkIHRvIGluZGljYXRlIHRoZSBjdXJyZW50bHkgY29ubmVjdGVkIHByb2R1Y2VyCisgICAgQ1VSUkVOVExZX0NPTk5FQ1RFRF9BUEkgPSAtMSwKKyAgICAvLyBUaGUgQVBJIG51bWJlciB1c2VkIHRvIGluZGljYXRlIHRoYXQgbm8gcHJvZHVjZXIgaXMgY29ubmVjdGVkCisgICAgTk9fQ09OTkVDVEVEX0FQSSAgICAgICAgPSAwLAorfTsKKworLy8gU3RhdHVzCisvLyA9PT09PT0KKworYm9vbCBiMmgoc3RhdHVzX3QgZnJvbSwgSFN0YXR1cyogdG8sCisgICAgICAgICBib29sKiBidWZmZXJOZWVkc1JlYWxsb2NhdGlvbiwgYm9vbCogcmVsZWFzZUFsbEJ1ZmZlcnMpIHsKKyAgICBzd2l0Y2ggKGZyb20pIHsKKyAgICBjYXNlIE9LOgorICAgICAgICAqdG8gPSBIU3RhdHVzOjpPSzsgYnJlYWs7CisgICAgY2FzZSBOT19NRU1PUlk6CisgICAgICAgICp0byA9IEhTdGF0dXM6Ok5PX01FTU9SWTsgYnJlYWs7CisgICAgY2FzZSBOT19JTklUOgorICAgICAgICAqdG8gPSBIU3RhdHVzOjpOT19JTklUOyBicmVhazsKKyAgICBjYXNlIEJBRF9WQUxVRToKKyAgICAgICAgKnRvID0gSFN0YXR1czo6QkFEX1ZBTFVFOyBicmVhazsKKyAgICBjYXNlIERFQURfT0JKRUNUOgorICAgICAgICAqdG8gPSBIU3RhdHVzOjpERUFEX09CSkVDVDsgYnJlYWs7CisgICAgY2FzZSBJTlZBTElEX09QRVJBVElPTjoKKyAgICAgICAgKnRvID0gSFN0YXR1czo6SU5WQUxJRF9PUEVSQVRJT047IGJyZWFrOworICAgIGNhc2UgVElNRURfT1VUOgorICAgICAgICAqdG8gPSBIU3RhdHVzOjpUSU1FRF9PVVQ7IGJyZWFrOworICAgIGNhc2UgV09VTERfQkxPQ0s6CisgICAgICAgICp0byA9IEhTdGF0dXM6OldPVUxEX0JMT0NLOyBicmVhazsKKyAgICBjYXNlIFVOS05PV05fRVJST1I6CisgICAgICAgICp0byA9IEhTdGF0dXM6OlVOS05PV05fRVJST1I7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHN0YXR1c190IG1hc2sgPQorICAgICAgICAgICAgICAgIChidWZmZXJOZWVkc1JlYWxsb2NhdGlvbiA/IEJ1ZmZlclF1ZXVlRGVmczo6QlVGRkVSX05FRURTX1JFQUxMT0NBVElPTiA6IDApCisgICAgICAgICAgICAgICAgfCAocmVsZWFzZUFsbEJ1ZmZlcnMgPyBCdWZmZXJRdWV1ZURlZnM6OlJFTEVBU0VfQUxMX0JVRkZFUlMgOiAwKTsKKyAgICAgICAgaWYgKGZyb20gJiB+bWFzaykgeworICAgICAgICAgICAgKnRvID0gc3RhdGljX2Nhc3Q8SFN0YXR1cz4oZnJvbSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqdG8gPSBIU3RhdHVzOjpPSzsKKyAgICAgICAgICAgIGlmIChidWZmZXJOZWVkc1JlYWxsb2NhdGlvbikgeworICAgICAgICAgICAgICAgICpidWZmZXJOZWVkc1JlYWxsb2NhdGlvbiA9IGZyb20gJiBCdWZmZXJRdWV1ZURlZnM6OkJVRkZFUl9ORUVEU19SRUFMTE9DQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVsZWFzZUFsbEJ1ZmZlcnMpIHsKKyAgICAgICAgICAgICAgICAqcmVsZWFzZUFsbEJ1ZmZlcnMgPSBmcm9tICYgQnVmZmVyUXVldWVEZWZzOjpSRUxFQVNFX0FMTF9CVUZGRVJTOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIGgyYihIU3RhdHVzIGZyb20sIHN0YXR1c190KiB0bykgeworICAgIHN3aXRjaCAoZnJvbSkgeworICAgIGNhc2UgSFN0YXR1czo6T0s6CisgICAgICAgICp0byA9IE9LOyBicmVhazsKKyAgICBjYXNlIEhTdGF0dXM6Ok5PX01FTU9SWToKKyAgICAgICAgKnRvID0gTk9fTUVNT1JZOyBicmVhazsKKyAgICBjYXNlIEhTdGF0dXM6Ok5PX0lOSVQ6CisgICAgICAgICp0byA9IE5PX0lOSVQ7IGJyZWFrOworICAgIGNhc2UgSFN0YXR1czo6QkFEX1ZBTFVFOgorICAgICAgICAqdG8gPSBCQURfVkFMVUU7IGJyZWFrOworICAgIGNhc2UgSFN0YXR1czo6REVBRF9PQkpFQ1Q6CisgICAgICAgICp0byA9IERFQURfT0JKRUNUOyBicmVhazsKKyAgICBjYXNlIEhTdGF0dXM6OklOVkFMSURfT1BFUkFUSU9OOgorICAgICAgICAqdG8gPSBJTlZBTElEX09QRVJBVElPTjsgYnJlYWs7CisgICAgY2FzZSBIU3RhdHVzOjpUSU1FRF9PVVQ6CisgICAgICAgICp0byA9IFRJTUVEX09VVDsgYnJlYWs7CisgICAgY2FzZSBIU3RhdHVzOjpXT1VMRF9CTE9DSzoKKyAgICAgICAgKnRvID0gV09VTERfQkxPQ0s7IGJyZWFrOworICAgIGNhc2UgSFN0YXR1czo6VU5LTk9XTl9FUlJPUjoKKyAgICAgICAgKnRvID0gVU5LTk9XTl9FUlJPUjsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgKnRvID0gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KGZyb20pOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRmVuY2UKKy8vID09PT09CisKK0hGZW5jZVdyYXBwZXI6OkhGZW5jZVdyYXBwZXIobmF0aXZlX2hhbmRsZV90KiBoKSA6IG1IYW5kbGV7aH0geworfQorCitIRmVuY2VXcmFwcGVyOjp+SEZlbmNlV3JhcHBlcigpIHsKKyAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShtSGFuZGxlKTsKK30KKworSEZlbmNlV3JhcHBlciYgSEZlbmNlV3JhcHBlcjo6c2V0KG5hdGl2ZV9oYW5kbGVfdCogaCkgeworICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG1IYW5kbGUpOworICAgIG1IYW5kbGUgPSBoOworICAgIHJldHVybiAqdGhpczsKK30KKworSEZlbmNlV3JhcHBlciYgSEZlbmNlV3JhcHBlcjo6b3BlcmF0b3I9KG5hdGl2ZV9oYW5kbGVfdCogaCkgeworICAgIHJldHVybiBzZXQoaCk7Cit9CisKK2hpZGxfaGFuZGxlIEhGZW5jZVdyYXBwZXI6OmdldEhhbmRsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaGlkbF9oYW5kbGV7bUhhbmRsZX07Cit9CisKK0hGZW5jZVdyYXBwZXI6Om9wZXJhdG9yIGhpZGxfaGFuZGxlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRIYW5kbGUoKTsKK30KKworYm9vbCBiMmgoc3A8QkZlbmNlPiBjb25zdCYgZnJvbSwgSEZlbmNlV3JhcHBlciogdG8pIHsKKyAgICBpZiAoIWZyb20pIHsKKyAgICAgICAgdG8tPnNldChudWxscHRyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGludCBmZW5jZUZkID0gZnJvbS0+Z2V0KCk7CisgICAgaWYgKGZlbmNlRmQgPT0gLTEpIHsKKyAgICAgICAgdG8tPnNldChudWxscHRyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIG5hdGl2ZV9oYW5kbGVfdCogbmggPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICBpZiAoIW5oKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbmgtPmRhdGFbMF0gPSBmZW5jZUZkOworICAgIHRvLT5zZXQobmgpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIGgyYihuYXRpdmVfaGFuZGxlX3QgY29uc3QqIGZyb20sIHNwPEJGZW5jZT4qIHRvKSB7CisgICAgaWYgKCFmcm9tIHx8IGZyb20tPm51bUZkcyA9PSAwKSB7CisgICAgICAgICp0byA9IG5ldyA6OmFuZHJvaWQ6OkZlbmNlKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoZnJvbS0+bnVtRmRzICE9IDEgfHwgZnJvbS0+bnVtSW50cyAhPSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgKnRvID0gbmV3IEJGZW5jZShkdXAoZnJvbS0+ZGF0YVswXSkpOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBDb25uZWN0aW9uVHlwZQorLy8gPT09PT09PT09PT09PT0KKworYm9vbCBiMmgoaW50IGZyb20sIEhDb25uZWN0aW9uVHlwZSogdG8pIHsKKyAgICAqdG8gPSBzdGF0aWNfY2FzdDxIQ29ubmVjdGlvblR5cGU+KGZyb20pOworICAgIHN3aXRjaCAoZnJvbSkgeworICAgIGNhc2UgQ1VSUkVOVExZX0NPTk5FQ1RFRF9BUEk6CisgICAgICAgICp0byA9IEhDb25uZWN0aW9uVHlwZTo6Q1VSUkVOVExZX0NPTk5FQ1RFRDsgYnJlYWs7CisgICAgY2FzZSBOQVRJVkVfV0lORE9XX0FQSV9FR0w6CisgICAgICAgICp0byA9IEhDb25uZWN0aW9uVHlwZTo6RUdMOyBicmVhazsKKyAgICBjYXNlIE5BVElWRV9XSU5ET1dfQVBJX0NQVToKKyAgICAgICAgKnRvID0gSENvbm5lY3Rpb25UeXBlOjpDUFU7IGJyZWFrOworICAgIGNhc2UgTkFUSVZFX1dJTkRPV19BUElfTUVESUE6CisgICAgICAgICp0byA9IEhDb25uZWN0aW9uVHlwZTo6TUVESUE7IGJyZWFrOworICAgIGNhc2UgTkFUSVZFX1dJTkRPV19BUElfQ0FNRVJBOgorICAgICAgICAqdG8gPSBIQ29ubmVjdGlvblR5cGU6OkNBTUVSQTsgYnJlYWs7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIGgyYihIQ29ubmVjdGlvblR5cGUgZnJvbSwgaW50KiB0bykgeworICAgICp0byA9IHN0YXRpY19jYXN0PGludD4oZnJvbSk7CisgICAgc3dpdGNoIChmcm9tKSB7CisgICAgY2FzZSBIQ29ubmVjdGlvblR5cGU6OkNVUlJFTlRMWV9DT05ORUNURUQ6CisgICAgICAgICp0byA9IENVUlJFTlRMWV9DT05ORUNURURfQVBJOyBicmVhazsKKyAgICBjYXNlIEhDb25uZWN0aW9uVHlwZTo6RUdMOgorICAgICAgICAqdG8gPSBOQVRJVkVfV0lORE9XX0FQSV9FR0w7IGJyZWFrOworICAgIGNhc2UgSENvbm5lY3Rpb25UeXBlOjpDUFU6CisgICAgICAgICp0byA9IE5BVElWRV9XSU5ET1dfQVBJX0NQVTsgYnJlYWs7CisgICAgY2FzZSBIQ29ubmVjdGlvblR5cGU6Ok1FRElBOgorICAgICAgICAqdG8gPSBOQVRJVkVfV0lORE9XX0FQSV9NRURJQTsgYnJlYWs7CisgICAgY2FzZSBIQ29ubmVjdGlvblR5cGU6OkNBTUVSQToKKyAgICAgICAgKnRvID0gTkFUSVZFX1dJTkRPV19BUElfQ0FNRVJBOyBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFJlY3QKKy8vID09PT0KKworYm9vbCBiMmgoQlJlY3QgY29uc3QmIGZyb20sIEhSZWN0KiB0bykgeworICAgIEJSZWN0KiBkc3QgPSByZWludGVycHJldF9jYXN0PEJSZWN0Kj4odG8tPmRhdGEoKSk7CisgICAgZHN0LT5sZWZ0ID0gZnJvbS5sZWZ0OworICAgIGRzdC0+dG9wID0gZnJvbS50b3A7CisgICAgZHN0LT5yaWdodCA9IGZyb20ucmlnaHQ7CisgICAgZHN0LT5ib3R0b20gPSBmcm9tLmJvdHRvbTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBoMmIoSFJlY3QgY29uc3QmIGZyb20sIEJSZWN0KiB0bykgeworICAgIEJSZWN0IGNvbnN0KiBzcmMgPSByZWludGVycHJldF9jYXN0PEJSZWN0IGNvbnN0Kj4oZnJvbS5kYXRhKCkpOworICAgIHRvLT5sZWZ0ID0gc3JjLT5sZWZ0OworICAgIHRvLT50b3AgPSBzcmMtPnRvcDsKKyAgICB0by0+cmlnaHQgPSBzcmMtPnJpZ2h0OworICAgIHRvLT5ib3R0b20gPSBzcmMtPmJvdHRvbTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gUmVnaW9uCisvLyA9PT09PT0KKworYm9vbCBiMmgoQlJlZ2lvbiBjb25zdCYgZnJvbSwgSFJlZ2lvbiogdG8pIHsKKyAgICBzaXplX3QgbnVtUmVjdHM7CisgICAgQlJlY3QgY29uc3QqIHJlY3RBcnJheSA9IGZyb20uZ2V0QXJyYXkoJm51bVJlY3RzKTsKKyAgICB0by0+cmVzaXplKG51bVJlY3RzKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVJlY3RzOyArK2kpIHsKKyAgICAgICAgaWYgKCFiMmgocmVjdEFycmF5W2ldLCAmKCp0bylbaV0pKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgaDJiKEhSZWdpb24gY29uc3QmIGZyb20sIEJSZWdpb24qIHRvKSB7CisgICAgaWYgKGZyb20uc2l6ZSgpID4gMCkgeworICAgICAgICBCUmVjdCBiUmVjdDsKKyAgICAgICAgaWYgKCFoMmIoZnJvbVswXSwgJmJSZWN0KSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRvLT5zZXQoYlJlY3QpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IGZyb20uc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmICghaDJiKGZyb21baV0sICZiUmVjdCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0by0+YWRkUmVjdFVuY2hlY2tlZCgKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihiUmVjdC5sZWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihiUmVjdC50b3ApLAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGJSZWN0LnJpZ2h0KSwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihiUmVjdC5ib3R0b20pKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHRvLT5jbGVhcigpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gR3JhcGhpY0J1ZmZlcgorLy8gPT09PT09PT09PT09PQorCisvLyBUaGUgaGFuZGxlIGlzIG5vdCBjbG9uZWQuIEl0cyBsaWZldGltZSBpcyB0aWVkIHRvIHRoZSBvcmlnaW5hbCBHcmFwaGljQnVmZmVyLgorYm9vbCBiMmgoc3A8R3JhcGhpY0J1ZmZlcj4gY29uc3QmIGZyb20sIEhhcmR3YXJlQnVmZmVyKiB0bywKKyAgICAgICAgIHVpbnQzMl90KiB0b0dlbmVyYXRpb25OdW1iZXIpIHsKKyAgICBpZiAoIWZyb20pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBBSGFyZHdhcmVCdWZmZXIqIGh3QnVmZmVyID0gZnJvbS0+dG9BSGFyZHdhcmVCdWZmZXIoKTsKKyAgICB0by0+bmF0aXZlSGFuZGxlLnNldFRvKAorICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90Kj4oCisgICAgICAgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9nZXROYXRpdmVIYW5kbGUoaHdCdWZmZXIpKSwKKyAgICAgICAgICBmYWxzZSk7CisgICAgQUhhcmR3YXJlQnVmZmVyX2Rlc2NyaWJlKAorICAgICAgICAgICAgaHdCdWZmZXIsCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEFIYXJkd2FyZUJ1ZmZlcl9EZXNjKj4odG8tPmRlc2NyaXB0aW9uLmRhdGEoKSkpOworICAgIGlmICh0b0dlbmVyYXRpb25OdW1iZXIpIHsKKyAgICAgICAgKnRvR2VuZXJhdGlvbk51bWJlciA9IGZyb20tPmdldEdlbmVyYXRpb25OdW1iZXIoKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFRoZSBoYW5kbGUgaXMgY2xvbmVkLgorYm9vbCBoMmIoSGFyZHdhcmVCdWZmZXIgY29uc3QmIGZyb20sIHNwPEdyYXBoaWNCdWZmZXI+KiB0bykgeworICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjIGNvbnN0KiBkZXNjID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QUhhcmR3YXJlQnVmZmVyX0Rlc2MgY29uc3QqPigKKyAgICAgICAgICAgIGZyb20uZGVzY3JpcHRpb24uZGF0YSgpKTsKKyAgICBuYXRpdmVfaGFuZGxlX3QgY29uc3QqIGhhbmRsZSA9IGZyb20ubmF0aXZlSGFuZGxlOworICAgIEFIYXJkd2FyZUJ1ZmZlciogaHdCdWZmZXI7CisgICAgaWYgKEFIYXJkd2FyZUJ1ZmZlcl9jcmVhdGVGcm9tSGFuZGxlKAorICAgICAgICAgICAgZGVzYywgaGFuZGxlLCBBSEFSRFdBUkVCVUZGRVJfQ1JFQVRFX0ZST01fSEFORExFX01FVEhPRF9DTE9ORSwKKyAgICAgICAgICAgICZod0J1ZmZlcikgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAqdG8gPSBHcmFwaGljQnVmZmVyOjpmcm9tQUhhcmR3YXJlQnVmZmVyKGh3QnVmZmVyKTsKKyAgICBBSGFyZHdhcmVCdWZmZXJfcmVsZWFzZShod0J1ZmZlcik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJxdWV1ZQorfSAgLy8gbmFtZXNwYWNlIGdyYXBoaWNzCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJEZWJ1Zy5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MyRGVidWcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YWE3MTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MyRGVidWcuY3BwCkBAIC0wLDAgKzEsMjc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgorI2luY2x1ZGUgPHV0aWwvQzJEZWJ1Zy1pbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctcGFyYW0uaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlVXRpbHMuaD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorCit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGFzU3RyaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2NvbnN0IGNoYXIgKmFzU3RyaW5nKGMyX3N0YXR1c190IGksIGNvbnN0IGNoYXIgKmRlZikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEMyX09LOiAgICAgICAgcmV0dXJuICJPSyI7CisgICAgICAgIGNhc2UgQzJfQkFEX1ZBTFVFOiByZXR1cm4gIkJBRF9WQUxVRSI7CisgICAgICAgIGNhc2UgQzJfQkFEX0lOREVYOiByZXR1cm4gIkJBRF9JTkRFWCI7CisgICAgICAgIGNhc2UgQzJfQ0FOTk9UX0RPOiByZXR1cm4gIkNBTk5PVF9ETyI7CisgICAgICAgIGNhc2UgQzJfRFVQTElDQVRFOiByZXR1cm4gIkRVUExJQ0FURSI7CisgICAgICAgIGNhc2UgQzJfTk9UX0ZPVU5EOiByZXR1cm4gIk5PVF9GT1VORCI7CisgICAgICAgIGNhc2UgQzJfQkFEX1NUQVRFOiByZXR1cm4gIkJBRF9TVEFURSI7CisgICAgICAgIGNhc2UgQzJfQkxPQ0tJTkc6ICByZXR1cm4gIkJMT0NLSU5HIjsKKyAgICAgICAgY2FzZSBDMl9DQU5DRUxFRDogIHJldHVybiAiQ0FOQ0VMRUQiOworICAgICAgICBjYXNlIEMyX05PX01FTU9SWTogcmV0dXJuICJOT19NRU1PUlkiOworICAgICAgICBjYXNlIEMyX1JFRlVTRUQ6ICAgcmV0dXJuICJSRUZVU0VEIjsKKyAgICAgICAgY2FzZSBDMl9USU1FRF9PVVQ6IHJldHVybiAiVElNRURfT1VUIjsKKyAgICAgICAgY2FzZSBDMl9PTUlUVEVEOiAgIHJldHVybiAiT01JVFRFRCI7CisgICAgICAgIGNhc2UgQzJfQ09SUlVQVEVEOiByZXR1cm4gIkNPUlJVUFRFRCI7CisgICAgICAgIGNhc2UgQzJfTk9fSU5JVDogICByZXR1cm4gIk5PX0lOSVQiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKK2NvbnN0IGNoYXIgKmFzU3RyaW5nKEMyRmllbGREZXNjcmlwdG9yOjp0eXBlX3QgaSwgY29uc3QgY2hhciAqZGVmKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkJMT0I6ICAgcmV0dXJuICJ1OCI7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkNOVFIzMjogcmV0dXJuICJjMzIiOworICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSNjQ6IHJldHVybiAiYzY0IjsKKyAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6RkxPQVQ6ICByZXR1cm4gImZwIjsKKyAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UMzI6ICByZXR1cm4gImkzMiI7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDY0OiAgcmV0dXJuICJpNjQiOworICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpTVFJJTkc6IHJldHVybiAiY2hyIjsKKyAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDMyOiByZXR1cm4gInUzMiI7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQ2NDogcmV0dXJuICJ1NjQiOworICAgICAgICBkZWZhdWx0OiByZXR1cm4gKGkgJiBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcpID8gInN0cnVjdCIgOiBkZWY7CisgICAgfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJQYXJhbUZpZWxkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgc3RkOjpzdHJpbmcgYXR0cmliUGFyYW1Db3JlSW5kZXgoY29uc3QgQzJQYXJhbTo6Q29yZUluZGV4ICZpKSB7CisgICAgcmV0dXJuIFN0cmluZ1ByaW50ZigiJWMlYyUwM3giLAorICAgICAgICAgICAgaS5pc0ZsZXhpYmxlKCkgPyAnRicgOiAnLScsCisgICAgICAgICAgICBpLmlzVmVuZG9yKCkgPyAnVicgOiAnLScsCisgICAgICAgICAgICBpLmNvcmVJbmRleCgpKTsKK30KKworc3RhdGljIHN0ZDo6c3RyaW5nIGF0dHJpYlBhcmFtSW5kZXgoCisgICAgICAgIGNvbnN0IEMyUGFyYW06OlR5cGUgJmksIGJvb2wgYWRkU3RyZWFtLCB1bnNpZ25lZCBzdHJlYW1JZCkgeworICAgIHN0ZDo6c3RyaW5nIHYgPSBTdHJpbmdQcmludGYoIiVjJWMiLAorICAgICAgICAgICAgaS5mb3JJbnB1dCgpID8gJ0knIDogaS5mb3JPdXRwdXQoKSA/ICdPJyA6ICctJywKKyAgICAgICAgICAgIGkuZm9yU3RyZWFtKCkgPyAnUycgOiBpLmZvclBvcnQoKSA/ICdQJyA6ICdHJyk7CisgICAgaWYgKGFkZFN0cmVhbSkgeworICAgICAgICBpZiAoaS5mb3JTdHJlYW0oKSkgeworICAgICAgICAgICAgdiArPSBTdHJpbmdQcmludGYoIiUwMmQiLCBzdHJlYW1JZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2ICs9ICItLSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdgorICAgICAgICAgICAgKyBTdHJpbmdQcmludGYoIiVjICIsCisgICAgICAgICAgICAgICAgICAgICAgIGkua2luZCgpID09IEMyUGFyYW06OlNUUlVDVCAgPyAnUycgOgorICAgICAgICAgICAgICAgICAgICAgICBpLmtpbmQoKSA9PSBDMlBhcmFtOjpJTkZPICAgID8gJ2knIDoKKyAgICAgICAgICAgICAgICAgICAgICAgaS5raW5kKCkgPT0gQzJQYXJhbTo6VFVOSU5HICA/ICd0JyA6CisgICAgICAgICAgICAgICAgICAgICAgIGkua2luZCgpID09IEMyUGFyYW06OlNFVFRJTkcgPyAncycgOgorICAgICAgICAgICAgICAgICAgICAgICBpLmtpbmQoKSA9PSBDMlBhcmFtOjpOT05FICAgID8gJy0nIDogJz8nKQorICAgICAgICAgICAgKyBhdHRyaWJQYXJhbUNvcmVJbmRleChpKTsKK30KKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW06OkNvcmVJbmRleCAmaSkgeworICAgIHJldHVybiBvcyA8PCAiUGFyYW06OkNvcmVJbmRleCgiIDw8IGF0dHJpYlBhcmFtQ29yZUluZGV4KGkpIDw8ICIpIjsKK30KKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW06OlR5cGUgJmkpIHsKKyAgICByZXR1cm4gb3MgPDwgU3RyaW5nUHJpbnRmKCJQYXJhbTo6VHlwZSglMDh4OiAiLCBpLnR5cGUoKSkKKyAgICAgICAgICAgIDw8IGF0dHJpYlBhcmFtSW5kZXgoaSwgZmFsc2UsIDApIDw8ICIpIjsKK30KKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW06OkluZGV4ICZpKSB7CisgICAgcmV0dXJuIG9zIDw8IFN0cmluZ1ByaW50ZigiUGFyYW06OkluZGV4KCUwOHg6ICIsICh1aW50MzJfdClpKQorICAgICAgICAgICAgPDwgYXR0cmliUGFyYW1JbmRleChpLCB0cnVlLCBpLnN0cmVhbSgpKSA8PCAiKSI7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBhdHRyaWJGaWVsZElkKGNvbnN0IF9DMkZpZWxkSWQgJmkpIHsKKyAgICByZXR1cm4gU3RyaW5nUHJpbnRmKCJGaWVsZChAJTAyeCslMDJ4KSIsCisgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KGkpLAorICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldFNpemUoaSkpOworfQorCisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBfQzJGaWVsZElkICZpKSB7CisgICAgcmV0dXJuIG9zIDw8ICI8IiA8PCBhdHRyaWJGaWVsZElkKGkpIDw8ICI+IjsKK30KKworCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmkpIHsKKyAgICBvcyA8PCBhdHRyaWJGaWVsZElkKF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRGaWVsZChpKSkgPDwgIiAiOworICAgIGlmIChpLm5hbWVkVmFsdWVzKCkuc2l6ZSgpKSB7CisgICAgICAgIG9zIDw8ICJlbnVtICI7CisgICAgfQorICAgIHJldHVybiBvcyA8PCBhc1N0cmluZyhpLnR5cGUoKSkgPDwgIiAiIDw8IGkubmFtZSgpCisgICAgICAgICAgICA8PCBTdHJpbmdQcmludGYoIlslenVdIiwgaS5leHRlbnQoKSk7Cit9CisKKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW1GaWVsZCAmaSkgeworICAgIG9zIDw8ICI8IiA8PCBDMlBhcmFtOjpJbmRleChfQzJQYXJhbUluc3BlY3Rvcjo6R2V0SW5kZXgoaSkpCisgICAgICAgICAgICA8PCBTdHJpbmdQcmludGYoIjo6RmllbGQoQCUwMngrJTAyeCk+IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRTaXplKGkpKTsKKyAgICByZXR1cm4gb3M7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gX0MyRmllbGRWYWx1ZUhlbHBlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGQ6Om9zdHJlYW0mIF9DMkZpZWxkVmFsdWVIZWxwZXI8Y2hhcj46OnB1dChzdGQ6Om9zdHJlYW0gJm9zLCBjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnApIHsKKyAgICBpZiAoaXNwcmludChwLmkzMikpIHsKKyAgICAgICAgcmV0dXJuIG9zIDw8IFN0cmluZ1ByaW50ZigiJyVjJyIsIHAuaTMyKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gb3MgPDwgU3RyaW5nUHJpbnRmKCInXFx4JTAyeCciLCAodWludDMyX3QpcC5pMzIpOworICAgIH0KK30KKworc3RkOjpvc3RyZWFtJiBfQzJGaWVsZFZhbHVlSGVscGVyPHVpbnQ4X3Q+OjpwdXQoc3RkOjpvc3RyZWFtICZvcywgY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZwKSB7CisgICAgcmV0dXJuIG9zIDw8IFN0cmluZ1ByaW50ZigiMHglMDJ4IiwgcC51MzIpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSAmb3MsIGNvbnN0IGMyX2NudHJfdDxUPiAmdikgeworICAgIHJldHVybiBvcyA8PCAiY3RyKCIgPDwgdi5wZWVrdSgpIDw8ICIpIjsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPFQ+ICZpKSB7CisgICAgb3MgPDwgIlJhbmdlKCI7CisgICAgX0MyRmllbGRWYWx1ZUhlbHBlcjxUPjo6cHV0KG9zLCBpLm1pbigpKTsKKyAgICBvcyA8PCAiLi4iOworICAgIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OnB1dChvcywgaS5tYXgoKSk7CisgICAgb3MgPDwgIiAqPSAiIDw8IGkubnVtKCkgPDwgIiAvPSAiIDw8IGkuZGVub20oKSA8PCAiICs9ICIgPDwgaS5zdGVwKCkgPDwgIikiOworICAgIHJldHVybiBvczsKK30KK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPGNoYXI+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPHVpbnQ4X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPGludDMyX3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPHVpbnQzMl90PiAmaSk7CisvL3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPGMyX2NudHIzMl90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxpbnQ2NF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTx1aW50NjRfdD4gJmkpOworLy90ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxjMl9jbnRyNjRfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8ZmxvYXQ+ICZpKTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPFQ+ICZpKSB7CisgICAgb3MgPDwgIkZsYWdzWyI7CisgICAgaWYgKCFpLmlzRW1wdHkoKSkgeworICAgICAgICBvcyA8PCAibWluPSI7CisgICAgICAgIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OnB1dChvcywgaS5taW4oKSk7CisgICAgfQorICAgIGJvb2wgY29tbWEgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IFQgJnYgOiBpLmZsYWdzKCkpIHsKKyAgICAgICAgaWYgKGNvbW1hKSB7CisgICAgICAgICAgICBvcyA8PCAiLCAiOworICAgICAgICB9CisgICAgICAgIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OnB1dChvcywgdik7CisgICAgICAgIGNvbW1hID0gdHJ1ZTsKKyAgICB9CisgICAgb3MgPDwgIl0iOworICAgIHJldHVybiBvczsKK30KK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPGNoYXI+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPHVpbnQ4X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPGludDMyX3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPHVpbnQzMl90PiAmaSk7CisvL3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPGMyX2NudHIzMl90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxpbnQ2NF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczx1aW50NjRfdD4gJmkpOworLy90ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxjMl9jbnRyNjRfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8ZmxvYXQ+ICZpKTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+ICZpKSB7CisgICAgb3MgPDwgIlZhbHVlc1siOworICAgIGJvb2wgY29tbWEgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IFQgJnYgOiBpLnZhbHVlcygpKSB7CisgICAgICAgIGlmIChjb21tYSkgeworICAgICAgICAgICAgb3MgPDwgIiwgIjsKKyAgICAgICAgfQorICAgICAgICBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpwdXQob3MsIHYpOworICAgICAgICBjb21tYSA9IHRydWU7CisgICAgfQorICAgIG9zIDw8ICJdIjsKKyAgICByZXR1cm4gb3M7Cit9Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxjaGFyPiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDx1aW50OF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxpbnQzMl90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDx1aW50MzJfdD4gJmkpOworLy90ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxjMl9jbnRyMzJfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8aW50NjRfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8dWludDY0X3Q+ICZpKTsKKy8vdGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8YzJfY250cjY0X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PGZsb2F0PiAmaSk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6SW1wbCB7CisgICAgSW1wbChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWx1ZXMpOworCitwcml2YXRlOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgX0MyRmllbGRWYWx1ZUhlbHBlcjxUPjo6VmFsdWVUeXBlIFZhbHVlVHlwZTsKKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjp0eXBlX3QgX21UeXBlOworICAgIEMyU3VwcG9ydGVkUmFuZ2U8VmFsdWVUeXBlPiBfbVJhbmdlOworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VmFsdWVUeXBlPiBfbVZhbHVlczsKKyAgICBDMlN1cHBvcnRlZEZsYWdzPFZhbHVlVHlwZT4gX21GbGFnczsKKworcHVibGljOgorLy8gICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCA8VD4oc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6SW1wbCAmaSk7CisvLyAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEltcGwgJmkpOworICAgIHN0ZDo6b3N0cmVhbSYgc3RyZWFtT3V0KHN0ZDo6b3N0cmVhbSYgb3MpIGNvbnN0OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6SW1wbDo6c3RyZWFtT3V0KHN0ZDo6b3N0cmVhbSYgb3MpIGNvbnN0IHsKKyAgICBpZiAoX21UeXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlJBTkdFKSB7CisgICAgICAgIG9zIDw8IF9tUmFuZ2U7CisgICAgfSBlbHNlIGlmIChfbVR5cGUgPT0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6VkFMVUVTKSB7CisgICAgICAgIG9zIDw8IF9tVmFsdWVzOworICAgIH0gZWxzZSBpZiAoX21UeXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OkZMQUdTKSB7CisgICAgICAgIG9zIDw8IF9tRmxhZ3M7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3MgPDwgIlVua25vd24gRlNWIHR5cGU6ICIgPDwgKHVpbnQzMl90KV9tVHlwZTsKKyAgICB9CisgICAgcmV0dXJuIG9zOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4gJmkpIHsKKyAgICByZXR1cm4gaS5fbUltcGwtPnN0cmVhbU91dChvcyk7Cit9Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxjaGFyPiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjx1aW50OF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxpbnQzMl90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjx1aW50MzJfdD4gJmkpOworLy90ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxjMl9jbnRyMzJfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8aW50NjRfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8dWludDY0X3Q+ICZpKTsKKy8vdGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8YzJfY250cjY0X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPGZsb2F0PiAmaSk7CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJJbnRlcmZhY2VIZWxwZXIuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkludGVyZmFjZUhlbHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWViNTJkMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJJbnRlcmZhY2VIZWxwZXIuY3BwCkBAIC0wLDAgKzEsODc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBhcmFtSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+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+PiBkZXBlbmRlbmNpZXM7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtUmVxdWVzdHM7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IGxhdGVSZWFkUGFyYW1zOworCisgICAgLy8gd2UgY2Fubm90IGRldGVybWluZSB0aGUgbGFzdCB2YWxpZCBwYXJhbWV0ZXIsIHNvIGFkZCBhbiBleHRyYQorICAgIC8vIGxvb3AgaXRlcmF0aW9uIGFmdGVyIHRoZSBsYXN0IHBhcmFtZXRlcgorICAgIGZvciAoc2l6ZV90IHBfaXggPSAwOyBwX2l4IDw9IHBhcmFtcy5zaXplKCk7ICsrcF9peCkgeworICAgICAgICBDMlBhcmFtICpwID0gbnVsbHB0cjsKKyAgICAgICAgQzJQYXJhbTo6SW5kZXggcGFyYW1JeCA9IDB1OworICAgICAgICBzaXplX3QgcGFyYW1EZXBJeCA9IFNJWkVfTUFYOworICAgICAgICBib29sIGxhc3QgPSBwX2l4ID09IHBhcmFtcy5zaXplKCk7CisgICAgICAgIGlmICghbGFzdCkgeworICAgICAgICAgICAgcCA9IHBhcmFtc1twX2l4XTsKKyAgICAgICAgICAgIGlmICghKnApIHsKKyAgICAgICAgICAgICAgICBwYXJhbVdhc0ludmFsaWQgPSB0cnVlOworICAgICAgICAgICAgICAgIHAtPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGFyYW1JeCA9IHAtPmluZGV4KCk7CisKKyAgICAgICAgICAgIC8vIGNvbnZlcnQgcGFyYW1ldGVyIHRvIHJlcXVlc3QgaW4gY2FzZSB0aGlzIGlzIGEgc3BsaXQgcGFyYW1ldGVyCisgICAgICAgICAgICBDMlBhcmFtOjpJbmRleCByZXF1ZXN0UGFyYW1JeCA9IHBhcmFtSXggfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX1JFUVVFU1RfRkxBRzsKKworICAgICAgICAgICAgLy8gc2V0dGluZyBhIHJlcXVlc3QgZGlyZWN0bHkgaXMgaGFuZGxlZCBhcyBub3JtYWwKKyAgICAgICAgICAgIGlmIChwYXJhbUl4ICE9IHJlcXVlc3RQYXJhbUl4KSB7CisgICAgICAgICAgICAgICAgcGFyYW1EZXBJeCA9IGdldERlcGVuZGVuY3lJbmRleF9sKHJlcXVlc3RQYXJhbUl4KTsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW1EZXBJeCA9PSBTSVpFX01BWCkgeworICAgICAgICAgICAgICAgICAgICAvLyBub3QgYSBzcGxpdCBwYXJhbWV0ZXIsIGhhbmRsZSBpdCBub3JtYWxseQorICAgICAgICAgICAgICAgICAgICBwYXJhbURlcEl4ID0gZ2V0RGVwZW5kZW5jeUluZGV4X2wocGFyYW1JeCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gc3BsaXQgcGFyYW1ldGVyIC0gcmVwbGFjZSB3aXRoIHNldHRpbmcgZm9yIHRoZSByZXF1ZXN0IC0gYW5kIHF1ZXVlIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIHJlYWQgYmFjayBhY3R1YWwgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogcmVhZCBsYXRlIHBhcmFtcyBhdCB0aGUgcmlnaHQgdGltZQorICAgICAgICAgICAgICAgICAgICBsYXRlUmVhZFBhcmFtcy5lbXBsYWNlX2JhY2socCk7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiByZXF1ZXN0KEMyUGFyYW06OkNvcHlBc1JlcXVlc3QoKnApKTsKKyAgICAgICAgICAgICAgICAgICAgcCA9IHJlcXVlc3QuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtUmVxdWVzdHMuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShyZXF1ZXN0KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocGFyYW1EZXBJeCA9PSBTSVpFX01BWCkgeworICAgICAgICAgICAgICAgIC8vIHVuc3VwcG9ydGVkIHBhcmFtZXRlcgorICAgICAgICAgICAgICAgIHBhcmFtTm90Rm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gZmlyc3QgaW5zZXJ0IC0gbWFyayBub3QgZGlydHkKKyAgICAgICAgICAgIC8vIGl0IG1heSBoYXZlIGJlZW4gbWFya2VkIGRpcnR5IGJ5IGEgZGVwZW5kZW5jeSB1cGRhdGUKKyAgICAgICAgICAgIC8vIHRoaXMgZG9lcyBub3Qgb3ZlcnJ3cml0ZSghKQorICAgICAgICAgICAgKHZvaWQpZGVwZW5kZW5jaWVzLmluc2VydCh7IHBhcmFtRGVwSXgsIHsgcGFyYW1JeCwgZmFsc2UgLyogZGlydHkgKi8gfX0pOworICAgICAgICAgICAgYXV0byBpdCA9IGRlcGVuZGVuY2llcy5maW5kKHBhcmFtRGVwSXgpOworICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJtYXJraW5nIGRlcGVuZGVuY3kgZm9yIHNldHRpbmcgYXQgIyIgPDwgcGFyYW1EZXBJeCA8PCAiOiAiCisgICAgICAgICAgICAgICAgICAgIDw8IGl0LT5zZWNvbmQuZmlyc3QgPDwgIiwgdXBkYXRlICIKKyAgICAgICAgICAgICAgICAgICAgPDwgKGl0LT5zZWNvbmQuc2Vjb25kID8gImFsd2F5cyAoZGlydHkpIiA6ICJvbmx5IGlmIGNoYW5nZWQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHByb2Nlc3MgYW55IHJlbWFpbmluZyBkZXBlbmRlbmNpZXMKKyAgICAgICAgICAgIGlmIChkZXBlbmRlbmNpZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJoYW5kbGluZyBkaXJ0eSBkb3duIGRlcGVuZGVuY2llcyBhZnRlciBsYXN0IHNldHRpbmciOworICAgICAgICB9CisKKyAgICAgICAgLy8gcHJvY2VzcyBhbnkgZGlydGllZCBkb3duLWRlcGVuZGVuY2llcyB1bnRpbCB0aGUgbmV4dCBwYXJhbQorICAgICAgICB3aGlsZSAoZGVwZW5kZW5jaWVzLnNpemUoKSAmJiBkZXBlbmRlbmNpZXMuYmVnaW4oKS0+Zmlyc3QgPD0gcGFyYW1EZXBJeCkgeworICAgICAgICAgICAgYXV0byBtaW4gPSBkZXBlbmRlbmNpZXMuYmVnaW4oKTsKKyAgICAgICAgICAgIEMyUGFyYW06OkluZGV4IGl4ID0gbWluLT5zZWNvbmQuZmlyc3Q7CisgICAgICAgICAgICBib29sIGRpcnR5ID0gbWluLT5zZWNvbmQuc2Vjb25kOworICAgICAgICAgICAgZGVwZW5kZW5jaWVzLmVyYXNlKG1pbik7CisKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gcGFyYW0gPSBfbUZhY3RvcnktPmdldFBhcmFtKGl4KTsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAib2xkIHZhbHVlICIgPDwgYXNTdHJpbmcocGFyYW0tPnZhbHVlKCkuZ2V0KCkpOworICAgICAgICAgICAgaWYgKCFsYXN0KSB7CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJuZXcgdmFsdWUgIiA8PCBhc1N0cmluZyhwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbGFzdCAmJiAhZGlydHkgJiYgaXggPT0gcGFyYW1JeCAmJiAqcGFyYW0tPnZhbHVlKCkgPT0gKnApIHsKKyAgICAgICAgICAgICAgICAvLyBubyBjaGFuZ2UgaW4gdmFsdWUgLSBhbmQgZGVwZW5kZW5jaWVzIHdlcmUgbm90IHVwZGF0ZWQKKyAgICAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIHVwZGF0ZQorICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiaWdub3Jpbmcgc2V0dGluZyB1bmNoYW5nZWQgcGFyYW0gIiA8PCBpeDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gYXBwbHkgc2V0dGluZworICAgICAgICAgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgInNldHRpbmcgcGFyYW0gIiA8PCBpeDsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBvbGRWYWx1ZSA9IHBhcmFtLT52YWx1ZSgpOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgcmVzID0gcGFyYW0tPnRyeVNldCgKKyAgICAgICAgICAgICAgICAgICAgKCFsYXN0ICYmIHBhcmFtSXggPT0gaXgpID8gcCA6IHBhcmFtLT52YWx1ZSgpLmdldCgpLCBtYXlCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgJmNoYW5nZWQsICpfbUZhY3RvcnksIGZhaWx1cmVzKTsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBuZXdWYWx1ZSA9IHBhcmFtLT52YWx1ZSgpOworICAgICAgICAgICAgQzJfQ0hFQ0tfRVEob2xkVmFsdWUgPT0gbmV3VmFsdWUsICpvbGRWYWx1ZSA9PSAqbmV3VmFsdWUpOworICAgICAgICAgICAgc3dpdGNoIChyZXMpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEMyX09LOiBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyX0JBRF9WQUxVRTogcGFyYW1CYWRWYWx1ZSA9IHRydWU7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJfTk9fTUVNT1JZOiBwYXJhbU5vTWVtb3J5ID0gdHJ1ZTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMl9USU1FRF9PVVQ6IHBhcmFtVGltZWRPdXQgPSB0cnVlOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyX0JMT0NLSU5HOiAgcGFyYW1CbG9ja2luZyA9IHRydWU7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJfQ09SUlVQVEVEOiBwYXJhbUNvcnJ1cHRlZCA9IHRydWU7IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IDsvLyBUT0RPIGZhdGFsCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNvcHkgYmFjayByZXN1bHQgZm9yIGNvbmZpZ3VyZWQgdmFsdWVzIChvciBpbnZhbGlkYXRlIGlmIGl0IGRvZXMgbm90IGZpdCBvciBtYXRjaCkKKyAgICAgICAgICAgIGlmICh1cGRhdGVQYXJhbXMgJiYgIWxhc3QgJiYgcGFyYW1JeCA9PSBpeCkgeworICAgICAgICAgICAgICAgIGlmICghcC0+dXBkYXRlRnJvbSgqcGFyYW0tPnZhbHVlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHAtPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNvbXBhcmUgcHRycyBhcyBwYXJhbXMgYXJlIGNvcHkgb24gd3JpdGUKKyAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJwYXJhbSAiIDw8IGl4IDw8ICIgdmFsdWUgY2hhbmdlZCI7CisgICAgICAgICAgICAgICAgLy8gdmFsdWUgY2hhbmdlZCB1cGRhdGUgZG93bi1kZXBlbmRlbmNpZXMgYW5kIG1hcmsgdGhlbSBkaXJ0eQorICAgICAgICAgICAgICAgIGZvciAoY29uc3QgQzJQYXJhbTo6SW5kZXggaXggOiBwYXJhbS0+Z2V0RG93bkRlcGVuZGVuY2llcygpKSB7CisgICAgICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAxOworICAgICAgICAgICAgICAgICAgICBhdXRvIGluc2VydF9yZXMgPSBkZXBlbmRlbmNpZXMuaW5zZXJ0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgZ2V0RGVwZW5kZW5jeUluZGV4X2woaXgpLCB7IGl4LCB0cnVlIC8qIGRpcnR5ICovIH19KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpbnNlcnRfcmVzLnNlY29uZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgKCppbnNlcnRfcmVzLmZpcnN0KS5zZWNvbmQuc2Vjb25kID0gdHJ1ZTsgLy8gbWFyayBkaXJ0eQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYXV0byBpdCA9IGRlcGVuZGVuY2llcy5maW5kKGdldERlcGVuZGVuY3lJbmRleF9sKGl4KSk7CisgICAgICAgICAgICAgICAgICAgIEMyX0NIRUNLKGl0LT5zZWNvbmQuc2Vjb25kKTsKKyAgICAgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJtYXJraW5nIGRvd24gZGVwZW5kZW5jaWVzIHRvIHVwZGF0ZSBhdCAjIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGdldERlcGVuZGVuY3lJbmRleF9sKGl4KSA8PCAiOiAiIDw8IGl0LT5zZWNvbmQuZmlyc3Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gZ2V0IGxhdGUgcmVhZCBwYXJhbWV0ZXJzCisgICAgZm9yIChDMlBhcmFtICpwIDogbGF0ZVJlYWRQYXJhbXMpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IHZhbHVlID0gX21GYWN0b3J5LT5nZXRQYXJhbVZhbHVlKHAtPmluZGV4KCkpOworICAgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgICAgIHAtPnVwZGF0ZUZyb20oKnZhbHVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHAtPmludmFsaWRhdGUoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAocGFyYW1Db3JydXB0ZWQgPyBDMl9DT1JSVVBURUQgOgorICAgICAgICAgICAgcGFyYW1CbG9ja2luZyA/IEMyX0JMT0NLSU5HIDoKKyAgICAgICAgICAgIHBhcmFtVGltZWRPdXQgPyBDMl9USU1FRF9PVVQgOgorICAgICAgICAgICAgcGFyYW1Ob01lbW9yeSA/IEMyX05PX01FTU9SWSA6CisgICAgICAgICAgICAocGFyYW1CYWRWYWx1ZSB8fCBwYXJhbVdhc0ludmFsaWQpID8gQzJfQkFEX1ZBTFVFIDoKKyAgICAgICAgICAgIHBhcmFtTm90Rm91bmQgPyBDMl9CQURfSU5ERVggOiBDMl9PSyk7Cit9CisKK3NpemVfdCBDMkludGVyZmFjZUhlbHBlcjo6Z2V0RGVwZW5kZW5jeUluZGV4X2woQzJQYXJhbTo6SW5kZXggaXgpIGNvbnN0IHsKKyAgICByZXR1cm4gX21GYWN0b3J5LT5nZXREZXBlbmRlbmN5SW5kZXgoaXgpOworfQorCitjMl9zdGF0dXNfdCBDMkludGVyZmFjZUhlbHBlcjo6cXVlcnkoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmc3RhY2tQYXJhbXMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jayBfX3VudXNlZCAvKiBUT0RPICovLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBib29sIHBhcmFtV2FzSW52YWxpZCA9IGZhbHNlOworICAgIGJvb2wgcGFyYW1Ob3RGb3VuZCA9IGZhbHNlOworICAgIGJvb2wgcGFyYW1EaWROb3RGaXQgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtTm9NZW1vcnkgPSBmYWxzZTsKKworICAgIGZvciAoQzJQYXJhbSogY29uc3QgcCA6IHN0YWNrUGFyYW1zKSB7CisgICAgICAgIGlmICghKnApIHsKKyAgICAgICAgICAgIHBhcmFtV2FzSW52YWxpZCA9IHRydWU7CisgICAgICAgICAgICBwLT5pbnZhbGlkYXRlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gdmFsdWUgPSBfbUZhY3RvcnktPmdldFBhcmFtVmFsdWUocC0+aW5kZXgoKSk7CisgICAgICAgICAgICBpZiAoIXZhbHVlKSB7CisgICAgICAgICAgICAgICAgcGFyYW1Ob3RGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgcC0+aW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfSBlbHNlIGlmICghcC0+dXBkYXRlRnJvbSgqdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcGFyYW1EaWROb3RGaXQgPSB0cnVlOworICAgICAgICAgICAgICAgIHAtPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoY29uc3QgQzJQYXJhbTo6SW5kZXggaXggOiBoZWFwUGFyYW1JbmRpY2VzKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiB2YWx1ZSA9IF9tRmFjdG9yeS0+Z2V0UGFyYW1WYWx1ZShpeCk7CisgICAgICAgIGlmICh2YWx1ZSkgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IHAgPSBDMlBhcmFtOjpDb3B5KCp2YWx1ZSk7CisgICAgICAgICAgICBpZiAocCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgaGVhcFBhcmFtcy0+cHVzaF9iYWNrKHN0ZDo6bW92ZShwKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGhlYXBQYXJhbXMtPnB1c2hfYmFjayhudWxscHRyKTsKKyAgICAgICAgICAgICAgICBwYXJhbU5vTWVtb3J5ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGhlYXBQYXJhbXMtPnB1c2hfYmFjayhudWxscHRyKTsKKyAgICAgICAgICAgIHBhcmFtTm90Rm91bmQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHBhcmFtTm9NZW1vcnkgPyBDMl9OT19NRU1PUlkgOgorICAgICAgICAgICBwYXJhbU5vdEZvdW5kID8gQzJfQkFEX0lOREVYIDoKKyAgICAgICAgICAgLy8gdGhlIGZvbGxvd2luZyBlcnJvcnMgYXJlIG5vdCBtYXJrZWQgaW4gdGhlIHJldHVybiB2YWx1ZQorICAgICAgICAgICBwYXJhbURpZE5vdEZpdCA/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+c2l6ZSgpID4gc2l6ZSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIHBhcmFtOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb21tb25fdGltZS9BbmRyb2lkLm1rIGIvbWVkaWEvY29tbW9uX3RpbWUvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFhMGRiMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9jb21tb25fdGltZS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0jCi0jIGxpYmNvbW1vbl90aW1lX2NsaWVudAotIyAoYmluZGVyIG1hcnNoYWxlcnMgZm9yIElDb21tb25DbG9jayBhcyB3ZWxsIGFzIGNvbW1vbiBjbG9jayBhbmQgbG9jYWwgY2xvY2sKLSMgaGVscGVyIGNvZGUpCi0jCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gbGliY29tbW9uX3RpbWVfY2xpZW50Ci1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotTE9DQUxfU1JDX0ZJTEVTIDo9IGNjX2hlbHBlci5jcHAgXAotICAgICAgICAgICAgICAgICAgIGxvY2FsX2Nsb2NrLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgSUNvbW1vbkNsb2NrLmNwcCBcCi0gICAgICAgICAgICAgICAgICAgSUNvbW1vblRpbWVDb25maWcuY3BwIFwKLSAgICAgICAgICAgICAgICAgICB1dGlscy5jcHAKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYmluZGVyIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbGliaGFyZHdhcmUgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBsaWJ1dGlscyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGxpYmxvZwotCi1MT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9jb21tb25fdGltZS9JQ29tbW9uQ2xvY2suY3BwIGIvbWVkaWEvY29tbW9uX3RpbWUvSUNvbW1vbkNsb2NrLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFmMWZjYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9jb21tb25fdGltZS9JQ29tbW9uQ2xvY2suY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotCi0jaW5jbHVkZSA8Y29tbW9uX3RpbWUvSUNvbW1vbkNsb2NrLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotCi0jaW5jbHVkZSAidXRpbHMuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKioqKiogSUNvbW1vbkNsb2NrICoqKioqLwotCi1lbnVtIHsKLSAgICBJU19DT01NT05fVElNRV9WQUxJRCA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCi0gICAgQ09NTU9OX1RJTUVfVE9fTE9DQUxfVElNRSwKLSAgICBMT0NBTF9USU1FX1RPX0NPTU1PTl9USU1FLAotICAgIEdFVF9DT01NT05fVElNRSwKLSAgICBHRVRfQ09NTU9OX0ZSRVEsCi0gICAgR0VUX0xPQ0FMX1RJTUUsCi0gICAgR0VUX0xPQ0FMX0ZSRVEsCi0gICAgR0VUX0VTVElNQVRFRF9FUlJPUiwKLSAgICBHRVRfVElNRUxJTkVfSUQsCi0gICAgR0VUX1NUQVRFLAotICAgIEdFVF9NQVNURVJfQUREUkVTUywKLSAgICBSRUdJU1RFUl9MSVNURU5FUiwKLSAgICBVTlJFR0lTVEVSX0xJU1RFTkVSLAotfTsKLQotY29uc3QgU3RyaW5nMTYgSUNvbW1vbkNsb2NrOjprU2VydmljZU5hbWUoImNvbW1vbl90aW1lLmNsb2NrIik7Ci1jb25zdCB1aW50NjRfdCBJQ29tbW9uQ2xvY2s6OmtJbnZhbGlkVGltZWxpbmVJRCA9IDA7Ci1jb25zdCBpbnQzMl90IElDb21tb25DbG9jazo6a0Vycm9yRXN0aW1hdGVVbmtub3duID0gMHg3RkZGRkZGRjsKLQotY2xhc3MgQnBDb21tb25DbG9jayA6IHB1YmxpYyBCcEludGVyZmFjZTxJQ29tbW9uQ2xvY2s+Ci17Ci0gIHB1YmxpYzoKLSAgICBleHBsaWNpdCBCcENvbW1vbkNsb2NrKGNvbnN0IHNwPElCaW5kZXI+JiBpbXBsKQotICAgICAgICA6IEJwSW50ZXJmYWNlPElDb21tb25DbG9jaz4oaW1wbCkge30KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgaXNDb21tb25UaW1lVmFsaWQoYm9vbCogdmFsaWQsIHVpbnQzMl90KiB0aW1lbGluZUlEKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDb21tb25DbG9jazo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KElTX0NPTU1PTl9USU1FX1ZBTElELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgICAgICp2YWxpZCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgICAgICp0aW1lbGluZUlEID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNvbW1vblRpbWVUb0xvY2FsVGltZShpbnQ2NF90IGNvbW1vblRpbWUsCi0gICAgICAgICAgICBpbnQ2NF90KiBsb2NhbFRpbWUpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNvbW1vbkNsb2NrOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50NjQoY29tbW9uVGltZSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChDT01NT05fVElNRV9UT19MT0NBTF9USU1FLAotICAgICAgICAgICAgICAgIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgICAgICpsb2NhbFRpbWUgPSByZXBseS5yZWFkSW50NjQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgbG9jYWxUaW1lVG9Db21tb25UaW1lKGludDY0X3QgbG9jYWxUaW1lLAotICAgICAgICAgICAgaW50NjRfdCogY29tbW9uVGltZSkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ29tbW9uQ2xvY2s6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQ2NChsb2NhbFRpbWUpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTE9DQUxfVElNRV9UT19DT01NT05fVElNRSwKLSAgICAgICAgICAgICAgICBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAqY29tbW9uVGltZSA9IHJlcGx5LnJlYWRJbnQ2NCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDb21tb25UaW1lKGludDY0X3QqIGNvbW1vblRpbWUpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNvbW1vbkNsb2NrOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0NPTU1PTl9USU1FLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAqY29tbW9uVGltZSA9IHJlcGx5LnJlYWRJbnQ2NCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDb21tb25GcmVxKHVpbnQ2NF90KiBmcmVxKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDb21tb25DbG9jazo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9DT01NT05fRlJFUSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgKmZyZXEgPSByZXBseS5yZWFkSW50NjQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TG9jYWxUaW1lKGludDY0X3QqIGxvY2FsVGltZSkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ29tbW9uQ2xvY2s6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfTE9DQUxfVElNRSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgKmxvY2FsVGltZSA9IHJlcGx5LnJlYWRJbnQ2NCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMb2NhbEZyZXEodWludDY0X3QqIGZyZXEpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNvbW1vbkNsb2NrOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0xPQ0FMX0ZSRVEsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgICAgICpmcmVxID0gcmVwbHkucmVhZEludDY0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVzdGltYXRlZEVycm9yKGludDMyX3QqIGVzdGltYXRlKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDb21tb25DbG9jazo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9FU1RJTUFURURfRVJST1IsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgICAgICplc3RpbWF0ZSA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUaW1lbGluZUlEKHVpbnQ2NF90KiBpZCkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ29tbW9uQ2xvY2s6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfVElNRUxJTkVfSUQsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgICAgICppZCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihyZXBseS5yZWFkSW50NjQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN0YXRlKFN0YXRlKiBzdGF0ZSkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ29tbW9uQ2xvY2s6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfU1RBVEUsIGRhdGEsICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgICAgICpzdGF0ZSA9IHN0YXRpY19jYXN0PFN0YXRlPihyZXBseS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3RlckFkZHIoc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UqIGFkZHIpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNvbW1vbkNsb2NrOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX01BU1RFUl9BRERSRVNTLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spCi0gICAgICAgICAgICAgICAgZGVzZXJpYWxpemVTb2NrYWRkcigmcmVwbHksIGFkZHIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3Rlckxpc3RlbmVyKAotICAgICAgICAgICAgY29uc3Qgc3A8SUNvbW1vbkNsb2NrTGlzdGVuZXI+JiBsaXN0ZW5lcikgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ29tbW9uQ2xvY2s6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIobGlzdGVuZXIpKTsKLQotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVHSVNURVJfTElTVEVORVIsIGRhdGEsICZyZXBseSk7Ci0KLSAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3Rlckxpc3RlbmVyKAotICAgICAgICAgICAgY29uc3Qgc3A8SUNvbW1vbkNsb2NrTGlzdGVuZXI+JiBsaXN0ZW5lcikgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ29tbW9uQ2xvY2s6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIobGlzdGVuZXIpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFVOUkVHSVNURVJfTElTVEVORVIsIGRhdGEsICZyZXBseSk7Ci0KLSAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLX07Ci0KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShDb21tb25DbG9jaywgImFuZHJvaWQub3MuSUNvbW1vbkNsb2NrIik7Ci0KLXN0YXR1c190IEJuQ29tbW9uQ2xvY2s6Om9uVHJhbnNhY3QodWludDMyX3QgY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsJiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncykgewotICAgIHN3aXRjaChjb2RlKSB7Ci0gICAgICAgIGNhc2UgSVNfQ09NTU9OX1RJTUVfVkFMSUQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ29tbW9uQ2xvY2ssIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGJvb2wgdmFsaWQ7Ci0gICAgICAgICAgICB1aW50MzJfdCB0aW1lbGluZUlEOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaXNDb21tb25UaW1lVmFsaWQoJnZhbGlkLCAmdGltZWxpbmVJRCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHZhbGlkKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMih0aW1lbGluZUlEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIENPTU1PTl9USU1FX1RPX0xPQ0FMX1RJTUU6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ29tbW9uQ2xvY2ssIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGludDY0X3QgY29tbW9uVGltZSA9IGRhdGEucmVhZEludDY0KCk7Ci0gICAgICAgICAgICBpbnQ2NF90IGxvY2FsVGltZTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNvbW1vblRpbWVUb0xvY2FsVGltZShjb21tb25UaW1lLCAmbG9jYWxUaW1lKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50NjQobG9jYWxUaW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIExPQ0FMX1RJTUVfVE9fQ09NTU9OX1RJTUU6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ29tbW9uQ2xvY2ssIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGludDY0X3QgbG9jYWxUaW1lID0gZGF0YS5yZWFkSW50NjQoKTsKLSAgICAgICAgICAgIGludDY0X3QgY29tbW9uVGltZTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGxvY2FsVGltZVRvQ29tbW9uVGltZShsb2NhbFRpbWUsICZjb21tb25UaW1lKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50NjQoY29tbW9uVGltZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBHRVRfQ09NTU9OX1RJTUU6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ29tbW9uQ2xvY2ssIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGludDY0X3QgY29tbW9uVGltZTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldENvbW1vblRpbWUoJmNvbW1vblRpbWUpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQ2NChjb21tb25UaW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIEdFVF9DT01NT05fRlJFUTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDb21tb25DbG9jaywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgdWludDY0X3QgZnJlcTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldENvbW1vbkZyZXEoJmZyZXEpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQ2NChmcmVxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIEdFVF9MT0NBTF9USU1FOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNvbW1vbkNsb2NrLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQ2NF90IGxvY2FsVGltZTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldExvY2FsVGltZSgmbG9jYWxUaW1lKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50NjQobG9jYWxUaW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIEdFVF9MT0NBTF9GUkVROiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNvbW1vbkNsb2NrLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICB1aW50NjRfdCBmcmVxOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0TG9jYWxGcmVxKCZmcmVxKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50NjQoZnJlcSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBHRVRfRVNUSU1BVEVEX0VSUk9SOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNvbW1vbkNsb2NrLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQzMl90IGVycm9yOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0RXN0aW1hdGVkRXJyb3IoJmVycm9yKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXJyb3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgR0VUX1RJTUVMSU5FX0lEOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNvbW1vbkNsb2NrLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICB1aW50NjRfdCBpZDsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldFRpbWVsaW5lSUQoJmlkKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50NjQoc3RhdGljX2Nhc3Q8aW50NjRfdD4oaWQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIEdFVF9TVEFURTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDb21tb25DbG9jaywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgU3RhdGUgc3RhdGU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRTdGF0ZSgmc3RhdGUpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0ZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgR0VUX01BU1RFUl9BRERSRVNTOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNvbW1vbkNsb2NrLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0TWFzdGVyQWRkcigmYWRkcik7Ci0KLSAgICAgICAgICAgIGlmICgoc3RhdHVzID09IE9LKSAmJiAhY2FuU2VyaWFsaXplU29ja2FkZHIoJmFkZHIpKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLQotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgICAgIHNlcmlhbGl6ZVNvY2thZGRyKHJlcGx5LCAmYWRkcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIFJFR0lTVEVSX0xJU1RFTkVSOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNvbW1vbkNsb2NrLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzcDxJQ29tbW9uQ2xvY2tMaXN0ZW5lcj4gbGlzdGVuZXIgPQotICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElDb21tb25DbG9ja0xpc3RlbmVyPihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZWdpc3Rlckxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBVTlJFR0lTVEVSX0xJU1RFTkVSOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNvbW1vbkNsb2NrLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzcDxJQ29tbW9uQ2xvY2tMaXN0ZW5lcj4gbGlzdGVuZXIgPQotICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElDb21tb25DbG9ja0xpc3RlbmVyPihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSB1bnJlZ2lzdGVyTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfSBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLX0KLQotLyoqKioqIElDb21tb25DbG9ja0xpc3RlbmVyICoqKioqLwotCi1lbnVtIHsKLSAgICBPTl9USU1FTElORV9DSEFOR0VEID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKLX07Ci0KLWNsYXNzIEJwQ29tbW9uQ2xvY2tMaXN0ZW5lciA6IHB1YmxpYyBCcEludGVyZmFjZTxJQ29tbW9uQ2xvY2tMaXN0ZW5lcj4KLXsKLSAgcHVibGljOgotICAgIGV4cGxpY2l0IEJwQ29tbW9uQ2xvY2tMaXN0ZW5lcihjb25zdCBzcDxJQmluZGVyPiYgaW1wbCkKLSAgICAgICAgOiBCcEludGVyZmFjZTxJQ29tbW9uQ2xvY2tMaXN0ZW5lcj4oaW1wbCkge30KLQotICAgIHZpcnR1YWwgdm9pZCBvblRpbWVsaW5lQ2hhbmdlZCh1aW50NjRfdCB0aW1lbGluZUlEKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKAotICAgICAgICAgICAgICAgIElDb21tb25DbG9ja0xpc3RlbmVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBkYXRhLndyaXRlSW50NjQodGltZWxpbmVJRCk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChPTl9USU1FTElORV9DSEFOR0VELCBkYXRhLCAmcmVwbHkpOwotICAgIH0KLX07Ci0KLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShDb21tb25DbG9ja0xpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLm9zLklDb21tb25DbG9ja0xpc3RlbmVyIik7Ci0KLXN0YXR1c190IEJuQ29tbW9uQ2xvY2tMaXN0ZW5lcjo6b25UcmFuc2FjdCgKLSAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncykgewotICAgIHN3aXRjaChjb2RlKSB7Ci0gICAgICAgIGNhc2UgT05fVElNRUxJTkVfQ0hBTkdFRDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDb21tb25DbG9ja0xpc3RlbmVyLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICB1aW50MzJfdCB0aW1lbGluZUlEID0gZGF0YS5yZWFkSW50NjQoKTsKLSAgICAgICAgICAgIG9uVGltZWxpbmVDaGFuZ2VkKHRpbWVsaW5lSUQpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9IGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb21tb25fdGltZS9JQ29tbW9uVGltZUNvbmZpZy5jcHAgYi9tZWRpYS9jb21tb25fdGltZS9JQ29tbW9uVGltZUNvbmZpZy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1ODdiMzkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvY29tbW9uX3RpbWUvSUNvbW1vblRpbWVDb25maWcuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTA5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotCi0jaW5jbHVkZSA8Y29tbW9uX3RpbWUvSUNvbW1vblRpbWVDb25maWcuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0KLSNpbmNsdWRlICJ1dGlscy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8qKioqKiBJQ29tbW9uVGltZUNvbmZpZyAqKioqKi8KLQotZW51bSB7Ci0gICAgR0VUX01BU1RFUl9FTEVDVElPTl9QUklPUklUWSA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCi0gICAgU0VUX01BU1RFUl9FTEVDVElPTl9QUklPUklUWSwKLSAgICBHRVRfTUFTVEVSX0VMRUNUSU9OX0VORFBPSU5ULAotICAgIFNFVF9NQVNURVJfRUxFQ1RJT05fRU5EUE9JTlQsCi0gICAgR0VUX01BU1RFUl9FTEVDVElPTl9HUk9VUF9JRCwKLSAgICBTRVRfTUFTVEVSX0VMRUNUSU9OX0dST1VQX0lELAotICAgIEdFVF9JTlRFUkZBQ0VfQklORElORywKLSAgICBTRVRfSU5URVJGQUNFX0JJTkRJTkcsCi0gICAgR0VUX01BU1RFUl9BTk5PVU5DRV9JTlRFUlZBTCwKLSAgICBTRVRfTUFTVEVSX0FOTk9VTkNFX0lOVEVSVkFMLAotICAgIEdFVF9DTElFTlRfU1lOQ19JTlRFUlZBTCwKLSAgICBTRVRfQ0xJRU5UX1NZTkNfSU5URVJWQUwsCi0gICAgR0VUX1BBTklDX1RIUkVTSE9MRCwKLSAgICBTRVRfUEFOSUNfVEhSRVNIT0xELAotICAgIEdFVF9BVVRPX0RJU0FCTEUsCi0gICAgU0VUX0FVVE9fRElTQUJMRSwKLSAgICBGT1JDRV9ORVRXT1JLTEVTU19NQVNURVJfTU9ERSwKLX07Ci0KLWNvbnN0IFN0cmluZzE2IElDb21tb25UaW1lQ29uZmlnOjprU2VydmljZU5hbWUoImNvbW1vbl90aW1lLmNvbmZpZyIpOwotCi1jbGFzcyBCcENvbW1vblRpbWVDb25maWcgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SUNvbW1vblRpbWVDb25maWc+Ci17Ci0gIHB1YmxpYzoKLSAgICBleHBsaWNpdCBCcENvbW1vblRpbWVDb25maWcoY29uc3Qgc3A8SUJpbmRlcj4mIGltcGwpCi0gICAgICAgIDogQnBJbnRlcmZhY2U8SUNvbW1vblRpbWVDb25maWc+KGltcGwpIHt9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3RlckVsZWN0aW9uUHJpb3JpdHkodWludDhfdCAqcHJpb3JpdHkpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNvbW1vblRpbWVDb25maWc6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfTUFTVEVSX0VMRUNUSU9OX1BSSU9SSVRZLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgICAgICpwcmlvcml0eSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJFbGVjdGlvblByaW9yaXR5KHVpbnQ4X3QgcHJpb3JpdHkpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNvbW1vblRpbWVDb25maWc6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90Pihwcmlvcml0eSkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX01BU1RFUl9FTEVDVElPTl9QUklPUklUWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJFbGVjdGlvbkVuZHBvaW50KHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDb21tb25UaW1lQ29uZmlnOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX01BU1RFUl9FTEVDVElPTl9FTkRQT0lOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgICAgICBkZXNlcmlhbGl6ZVNvY2thZGRyKCZyZXBseSwgYWRkcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyRWxlY3Rpb25FbmRwb2ludCgKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlICphZGRyKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDb21tb25UaW1lQ29uZmlnOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBpZiAoIWNhblNlcmlhbGl6ZVNvY2thZGRyKGFkZHIpKQotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgaWYgKE5VTEwgPT0gYWRkcikgewotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOwotICAgICAgICAgICAgc2VyaWFsaXplU29ja2FkZHIoJmRhdGEsIGFkZHIpOwotICAgICAgICB9Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfTUFTVEVSX0VMRUNUSU9OX0VORFBPSU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3RlckVsZWN0aW9uR3JvdXBJZCh1aW50NjRfdCAqaWQpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNvbW1vblRpbWVDb25maWc6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfTUFTVEVSX0VMRUNUSU9OX0dST1VQX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseSk7Ci0KLSAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgKmlkID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHJlcGx5LnJlYWRJbnQ2NCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJFbGVjdGlvbkdyb3VwSWQodWludDY0X3QgaWQpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNvbW1vblRpbWVDb25maWc6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQ2NChpZCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfTUFTVEVSX0VMRUNUSU9OX0dST1VQX0lELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseSk7Ci0KLSAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW50ZXJmYWNlQmluZGluZyhTdHJpbmcxNiYgaWZhY2VOYW1lKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDb21tb25UaW1lQ29uZmlnOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0lOVEVSRkFDRV9CSU5ESU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXBseSk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgICAgIGlmYWNlTmFtZSA9IHJlcGx5LnJlYWRTdHJpbmcxNigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEludGVyZmFjZUJpbmRpbmcoY29uc3QgU3RyaW5nMTYmIGlmYWNlTmFtZSkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ29tbW9uVGltZUNvbmZpZzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KGlmYWNlTmFtZSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfSU5URVJGQUNFX0JJTkRJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyQW5ub3VuY2VJbnRlcnZhbChpbnQgKmludGVydmFsKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElDb21tb25UaW1lQ29uZmlnOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX01BU1RFUl9BTk5PVU5DRV9JTlRFUlZBTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAqaW50ZXJ2YWwgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJBbm5vdW5jZUludGVydmFsKGludCBpbnRlcnZhbCkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ29tbW9uVGltZUNvbmZpZzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGludGVydmFsKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9NQVNURVJfQU5OT1VOQ0VfSU5URVJWQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2xpZW50U3luY0ludGVydmFsKGludCAqaW50ZXJ2YWwpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNvbW1vblRpbWVDb25maWc6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQ0xJRU5UX1NZTkNfSU5URVJWQUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgKmludGVydmFsID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2xpZW50U3luY0ludGVydmFsKGludCBpbnRlcnZhbCkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ29tbW9uVGltZUNvbmZpZzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGludGVydmFsKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9DTElFTlRfU1lOQ19JTlRFUlZBTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYW5pY1RocmVzaG9sZChpbnQgKnRocmVzaG9sZCkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ29tbW9uVGltZUNvbmZpZzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9QQU5JQ19USFJFU0hPTEQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgKnRocmVzaG9sZCA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhbmljVGhyZXNob2xkKGludCB0aHJlc2hvbGQpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNvbW1vblRpbWVDb25maWc6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMih0aHJlc2hvbGQpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1BBTklDX1RIUkVTSE9MRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHkpOwotICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdXRvRGlzYWJsZShib29sICphdXRvRGlzYWJsZSkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQ29tbW9uVGltZUNvbmZpZzo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9BVVRPX0RJU0FCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5KTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgKmF1dG9EaXNhYmxlID0gKDAgIT0gcmVwbHkucmVhZEludDMyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1dG9EaXNhYmxlKGJvb2wgYXV0b0Rpc2FibGUpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNvbW1vblRpbWVDb25maWc6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihhdXRvRGlzYWJsZSA/IDEgOiAwKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9BVVRPX0RJU0FCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5KTsKLQotICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBmb3JjZU5ldHdvcmtsZXNzTWFzdGVyTW9kZSgpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUNvbW1vblRpbWVDb25maWc6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChGT1JDRV9ORVRXT1JLTEVTU19NQVNURVJfTU9ERSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHkpOwotCi0gICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci19OwotCi1JTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoQ29tbW9uVGltZUNvbmZpZywgImFuZHJvaWQub3MuSUNvbW1vblRpbWVDb25maWciKTsKLQotc3RhdHVzX3QgQm5Db21tb25UaW1lQ29uZmlnOjpvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MpIHsKLSAgICBzd2l0Y2goY29kZSkgewotICAgICAgICBjYXNlIEdFVF9NQVNURVJfRUxFQ1RJT05fUFJJT1JJVFk6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ29tbW9uVGltZUNvbmZpZywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgdWludDhfdCBwcmlvcml0eTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldE1hc3RlckVsZWN0aW9uUHJpb3JpdHkoJnByaW9yaXR5KTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4ocHJpb3JpdHkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIFNFVF9NQVNURVJfRUxFQ1RJT05fUFJJT1JJVFk6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ29tbW9uVGltZUNvbmZpZywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgdWludDhfdCBwcmlvcml0eSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0TWFzdGVyRWxlY3Rpb25Qcmlvcml0eShwcmlvcml0eSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgR0VUX01BU1RFUl9FTEVDVElPTl9FTkRQT0lOVDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDb21tb25UaW1lQ29uZmlnLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSBhZGRyOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0TWFzdGVyRWxlY3Rpb25FbmRwb2ludCgmYWRkcik7Ci0KLSAgICAgICAgICAgIGlmICgoc3RhdHVzID09IE9LKSAmJiAhY2FuU2VyaWFsaXplU29ja2FkZHIoJmFkZHIpKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLQotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgICAgIHNlcmlhbGl6ZVNvY2thZGRyKHJlcGx5LCAmYWRkcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIFNFVF9NQVNURVJfRUxFQ1RJT05fRU5EUE9JTlQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ29tbW9uVGltZUNvbmZpZywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UgYWRkcjsKLSAgICAgICAgICAgIGludCBoYXNBZGRyID0gZGF0YS5yZWFkSW50MzIoKTsKLQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgICAgICAgICAgaWYgKGhhc0FkZHIpIHsKLSAgICAgICAgICAgICAgICBkZXNlcmlhbGl6ZVNvY2thZGRyKCZkYXRhLCAmYWRkcik7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gc2V0TWFzdGVyRWxlY3Rpb25FbmRwb2ludCgmYWRkcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHNldE1hc3RlckVsZWN0aW9uRW5kcG9pbnQoJmFkZHIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgR0VUX01BU1RFUl9FTEVDVElPTl9HUk9VUF9JRDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDb21tb25UaW1lQ29uZmlnLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICB1aW50NjRfdCBpZDsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldE1hc3RlckVsZWN0aW9uR3JvdXBJZCgmaWQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQ2NChpZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTRVRfTUFTVEVSX0VMRUNUSU9OX0dST1VQX0lEOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNvbW1vblRpbWVDb25maWcsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIHVpbnQ2NF90IGlkID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGRhdGEucmVhZEludDY0KCkpOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0TWFzdGVyRWxlY3Rpb25Hcm91cElkKGlkKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBHRVRfSU5URVJGQUNFX0JJTkRJTkc6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ29tbW9uVGltZUNvbmZpZywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgU3RyaW5nMTYgcmV0OwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0SW50ZXJmYWNlQmluZGluZyhyZXQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJpbmcxNihyZXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU0VUX0lOVEVSRkFDRV9CSU5ESU5HOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNvbW1vblRpbWVDb25maWcsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIFN0cmluZzE2IGlmYWNlTmFtZTsKLSAgICAgICAgICAgIGlmYWNlTmFtZSA9IGRhdGEucmVhZFN0cmluZzE2KCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRJbnRlcmZhY2VCaW5kaW5nKGlmYWNlTmFtZSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgR0VUX01BU1RFUl9BTk5PVU5DRV9JTlRFUlZBTDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDb21tb25UaW1lQ29uZmlnLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQgaW50ZXJ2YWw7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRNYXN0ZXJBbm5vdW5jZUludGVydmFsKCZpbnRlcnZhbCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGludGVydmFsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIFNFVF9NQVNURVJfQU5OT1VOQ0VfSU5URVJWQUw6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ29tbW9uVGltZUNvbmZpZywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50IGludGVydmFsID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldE1hc3RlckFubm91bmNlSW50ZXJ2YWwoaW50ZXJ2YWwpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIEdFVF9DTElFTlRfU1lOQ19JTlRFUlZBTDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDb21tb25UaW1lQ29uZmlnLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQgaW50ZXJ2YWw7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRDbGllbnRTeW5jSW50ZXJ2YWwoJmludGVydmFsKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaW50ZXJ2YWwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU0VUX0NMSUVOVF9TWU5DX0lOVEVSVkFMOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNvbW1vblRpbWVDb25maWcsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGludCBpbnRlcnZhbCA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRDbGllbnRTeW5jSW50ZXJ2YWwoaW50ZXJ2YWwpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIEdFVF9QQU5JQ19USFJFU0hPTEQ6IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQ29tbW9uVGltZUNvbmZpZywgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgaW50IHRocmVzaG9sZDsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldFBhbmljVGhyZXNob2xkKCZ0aHJlc2hvbGQpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMih0aHJlc2hvbGQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgU0VUX1BBTklDX1RIUkVTSE9MRDogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDb21tb25UaW1lQ29uZmlnLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBpbnQgdGhyZXNob2xkID0gZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldFBhbmljVGhyZXNob2xkKHRocmVzaG9sZCk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9IGJyZWFrOwotCi0gICAgICAgIGNhc2UgR0VUX0FVVE9fRElTQUJMRTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDb21tb25UaW1lQ29uZmlnLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBib29sIGF1dG9EaXNhYmxlOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXV0b0Rpc2FibGUoJmF1dG9EaXNhYmxlKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoYXV0b0Rpc2FibGUgPyAxIDogMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTRVRfQVVUT19ESVNBQkxFOiB7Ci0gICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUNvbW1vblRpbWVDb25maWcsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGJvb2wgYXV0b0Rpc2FibGUgPSAoMCAhPSBkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldEF1dG9EaXNhYmxlKGF1dG9EaXNhYmxlKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBGT1JDRV9ORVRXT1JLTEVTU19NQVNURVJfTU9ERTogewotICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElDb21tb25UaW1lQ29uZmlnLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBmb3JjZU5ldHdvcmtsZXNzTWFzdGVyTW9kZSgpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfSBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29tbW9uX3RpbWUvY2NfaGVscGVyLmNwcCBiL21lZGlhL2NvbW1vbl90aW1lL2NjX2hlbHBlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhN2RlNzQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvY29tbW9uX3RpbWUvY2NfaGVscGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8Y29tbW9uX3RpbWUvY2NfaGVscGVyLmg+Ci0jaW5jbHVkZSA8Y29tbW9uX3RpbWUvSUNvbW1vbkNsb2NrLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLU11dGV4IENDSGVscGVyOjpsb2NrXzsKLXNwPElDb21tb25DbG9jaz4gQ0NIZWxwZXI6OmNvbW1vbl9jbG9ja187Ci1zcDxJQ29tbW9uQ2xvY2tMaXN0ZW5lcj4gQ0NIZWxwZXI6OmNvbW1vbl9jbG9ja19saXN0ZW5lcl87Ci11aW50MzJfdCBDQ0hlbHBlcjo6cmVmX2NvdW50XyA9IDA7Ci0KLWJvb2wgQ0NIZWxwZXI6OnZlcmlmeUNsb2NrX2woKSB7Ci0gICAgYm9vbCByZXQgPSBmYWxzZTsKLQotICAgIGlmIChjb21tb25fY2xvY2tfID09IE5VTEwpIHsKLSAgICAgICAgY29tbW9uX2Nsb2NrXyA9IElDb21tb25DbG9jazo6Z2V0SW5zdGFuY2UoKTsKLSAgICAgICAgaWYgKGNvbW1vbl9jbG9ja18gPT0gTlVMTCkKLSAgICAgICAgICAgIGdvdG8gYmFpbG91dDsKLSAgICB9Ci0KLSAgICBpZiAocmVmX2NvdW50XyA+IDApIHsKLSAgICAgICAgaWYgKGNvbW1vbl9jbG9ja19saXN0ZW5lcl8gPT0gTlVMTCkgewotICAgICAgICAgICAgY29tbW9uX2Nsb2NrX2xpc3RlbmVyXyA9IG5ldyBDb21tb25DbG9ja0xpc3RlbmVyKCk7Ci0gICAgICAgICAgICBpZiAoY29tbW9uX2Nsb2NrX2xpc3RlbmVyXyA9PSBOVUxMKQotICAgICAgICAgICAgICAgIGdvdG8gYmFpbG91dDsKLQotICAgICAgICAgICAgaWYgKE9LICE9IGNvbW1vbl9jbG9ja18tPnJlZ2lzdGVyTGlzdGVuZXIoY29tbW9uX2Nsb2NrX2xpc3RlbmVyXykpCi0gICAgICAgICAgICAgICAgZ290byBiYWlsb3V0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0ID0gdHJ1ZTsKLQotYmFpbG91dDoKLSAgICBpZiAoIXJldCkgewotICAgICAgICBjb21tb25fY2xvY2tfbGlzdGVuZXJfID0gTlVMTDsKLSAgICAgICAgY29tbW9uX2Nsb2NrXyA9IE5VTEw7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLUNDSGVscGVyOjpDQ0hlbHBlcigpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbG9ja18pOwotICAgIHJlZl9jb3VudF8rKzsKLSAgICB2ZXJpZnlDbG9ja19sKCk7Ci19Ci0KLUNDSGVscGVyOjp+Q0NIZWxwZXIoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soJmxvY2tfKTsKLQotICAgIGFzc2VydChyZWZfY291bnRfID4gMCk7Ci0gICAgcmVmX2NvdW50Xy0tOwotCi0gICAgLy8gSWYgd2Ugd2VyZSB0aGUgbGFzdCBDQ0hlbHBlciBpbnN0YW5jZSBpbiB0aGUgc3lzdGVtLCBhbmQgd2UgaGFkCi0gICAgLy8gcHJldmlvdXNseSByZWdpc3RlciBhIGxpc3RlbmVyLCB1bnJlZ2lzdGVyIGl0IG5vdyBzbyB0aGF0IHRoZSBjb21tb24gdGltZQotICAgIC8vIHNlcnZpY2UgaGFzIHRoZSBjaGFuY2UgdG8gZ28gaW50byBhdXRvLWRpc2FibGVkIG1vZGUuCi0gICAgaWYgKCFyZWZfY291bnRfICYmCi0gICAgICAgKGNvbW1vbl9jbG9ja18gIT0gTlVMTCkgJiYKLSAgICAgICAoY29tbW9uX2Nsb2NrX2xpc3RlbmVyXyAhPSBOVUxMKSkgewotICAgICAgICBjb21tb25fY2xvY2tfLT51bnJlZ2lzdGVyTGlzdGVuZXIoY29tbW9uX2Nsb2NrX2xpc3RlbmVyXyk7Ci0gICAgICAgIGNvbW1vbl9jbG9ja19saXN0ZW5lcl8gPSBOVUxMOwotICAgIH0KLX0KLQotdm9pZCBDQ0hlbHBlcjo6Q29tbW9uQ2xvY2tMaXN0ZW5lcjo6b25UaW1lbGluZUNoYW5nZWQodWludDY0X3QgLyp0aW1lbGluZUlEKi8pIHsKLSAgICAvLyBkbyBub3RoaW5nOyBsaXN0ZW5lciBpcyBvbmx5IHJlYWxseSB1c2VkIGFzIGEgdG9rZW4gc28gdGhlIHNlcnZlciBjYW4KLSAgICAvLyBmaW5kIG91dCB3aGVuIGNsaWVudHMgZGllLgotfQotCi0vLyBIZWxwZXIgbWV0aG9kcyB3aGljaCBhdHRlbXB0cyB0byBtYWtlIGNhbGxzIHRvIHRoZSBjb21tb24gdGltZSBiaW5kZXIKLS8vIHNlcnZpY2UuICBJZiB0aGUgZmlyc3QgYXR0ZW1wdCBmYWlscyB3aXRoIERFQURfT0JKRUNULCB0aGUgaGVscGVycyB3aWxsCi0vLyBhdHRlbXB0IHRvIG1ha2UgYSBjb25uZWN0aW9uIHRvIHRoZSBzZXJ2aWNlIGFnYWluIChhc3N1bWluZyB0aGF0IHRoZSBwcm9jZXNzCi0vLyBob3N0aW5nIHRoZSBzZXJ2aWNlIGhhZCBjcmFzaGVkIGFuZCB0aGUgY2xpZW50IHByb3h5IHdlIGFyZSBob2xkaW5nIGlzIGRlYWQpCi0vLyBJZiB0aGUgc2Vjb25kIGF0dGVtcHQgZmFpbHMsIG9yIG5vIGNvbm5lY3Rpb24gY2FuIGJlIG1hZGUsIHRoZSB3ZSBsZXQgdGhlCi0vLyBlcnJvciBwcm9wYWdhdGUgdXAgdGhlIHN0YWNrIGFuZCBsZXQgdGhlIGNhbGxlciBkZWFsIHdpdGggdGhlIHNpdHVhdGlvbiBhcwotLy8gYmVzdCB0aGV5IGNhbi4KLSNkZWZpbmUgQ0NIRUxQRVJfTUVUSE9EKGRlY2wsIGNhbGwpICAgICAgICAgICAgICAgICBcCi0gICAgc3RhdHVzX3QgQ0NIZWxwZXI6OmRlY2wgeyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jaygmbG9ja18pOyAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmICghdmVyaWZ5Q2xvY2tfbCgpKSAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGNvbW1vbl9jbG9ja18tPmNhbGw7ICAgICAgXAotICAgICAgICBpZiAoREVBRF9PQkpFQ1QgPT0gc3RhdHVzKSB7ICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGlmICghdmVyaWZ5Q2xvY2tfbCgpKSAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOyAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgc3RhdHVzID0gY29tbW9uX2Nsb2NrXy0+Y2FsbDsgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9Ci0KLSNkZWZpbmUgVkVSSUZZX0NMT0NLKCkKLQotQ0NIRUxQRVJfTUVUSE9EKGlzQ29tbW9uVGltZVZhbGlkKGJvb2wqIHZhbGlkLCB1aW50MzJfdCogdGltZWxpbmVJRCksCi0gICAgICAgICAgICAgICAgaXNDb21tb25UaW1lVmFsaWQodmFsaWQsIHRpbWVsaW5lSUQpKQotQ0NIRUxQRVJfTUVUSE9EKGNvbW1vblRpbWVUb0xvY2FsVGltZShpbnQ2NF90IGNvbW1vblRpbWUsIGludDY0X3QqIGxvY2FsVGltZSksCi0gICAgICAgICAgICAgICAgY29tbW9uVGltZVRvTG9jYWxUaW1lKGNvbW1vblRpbWUsIGxvY2FsVGltZSkpCi1DQ0hFTFBFUl9NRVRIT0QobG9jYWxUaW1lVG9Db21tb25UaW1lKGludDY0X3QgbG9jYWxUaW1lLCBpbnQ2NF90KiBjb21tb25UaW1lKSwKLSAgICAgICAgICAgICAgICBsb2NhbFRpbWVUb0NvbW1vblRpbWUobG9jYWxUaW1lLCBjb21tb25UaW1lKSkKLUNDSEVMUEVSX01FVEhPRChnZXRDb21tb25UaW1lKGludDY0X3QqIGNvbW1vblRpbWUpLAotICAgICAgICAgICAgICAgIGdldENvbW1vblRpbWUoY29tbW9uVGltZSkpCi1DQ0hFTFBFUl9NRVRIT0QoZ2V0Q29tbW9uRnJlcSh1aW50NjRfdCogZnJlcSksCi0gICAgICAgICAgICAgICAgZ2V0Q29tbW9uRnJlcShmcmVxKSkKLUNDSEVMUEVSX01FVEhPRChnZXRMb2NhbFRpbWUoaW50NjRfdCogbG9jYWxUaW1lKSwKLSAgICAgICAgICAgICAgICBnZXRMb2NhbFRpbWUobG9jYWxUaW1lKSkKLUNDSEVMUEVSX01FVEhPRChnZXRMb2NhbEZyZXEodWludDY0X3QqIGZyZXEpLAotICAgICAgICAgICAgICAgIGdldExvY2FsRnJlcShmcmVxKSkKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvbW1vbl90aW1lL2xvY2FsX2Nsb2NrLmNwcCBiL21lZGlhL2NvbW1vbl90aW1lL2xvY2FsX2Nsb2NrLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdjNjFmYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9jb21tb25fdGltZS9sb2NhbF9jbG9jay5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJjb21tb25fdGltZSIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8Y29tbW9uX3RpbWUvbG9jYWxfY2xvY2suaD4KLSNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2xvY2FsX3RpbWVfaGFsLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLU11dGV4IExvY2FsQ2xvY2s6OmRldl9sb2NrXzsKLWxvY2FsX3RpbWVfaHdfZGV2aWNlX3QqIExvY2FsQ2xvY2s6OmRldl8gPSBOVUxMOwotCi1Mb2NhbENsb2NrOjpMb2NhbENsb2NrKCkgewotICAgIGludCByZXM7Ci0gICAgY29uc3QgaHdfbW9kdWxlX3QqIG1vZDsKLQotICAgIEF1dG9NdXRleCBsb2NrKCZkZXZfbG9ja18pOwotCi0gICAgaWYgKGRldl8gIT0gTlVMTCkKLSAgICAgICAgcmV0dXJuOwotCi0gICAgcmVzID0gaHdfZ2V0X21vZHVsZV9ieV9jbGFzcyhMT0NBTF9USU1FX0hBUkRXQVJFX01PRFVMRV9JRCwgTlVMTCwgJm1vZCk7Ci0gICAgaWYgKHJlcykgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9wZW4gbG9jYWwgdGltZSBIQUwgbW9kdWxlIChyZXMgPSAlZCkiLCByZXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlcyA9IGxvY2FsX3RpbWVfaHdfZGV2aWNlX29wZW4obW9kLCAmZGV2Xyk7Ci0gICAgICAgIGlmIChyZXMpIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb3BlbiBsb2NhbCB0aW1lIEhBTCBkZXZpY2UgKHJlcyA9ICVkKSIsIHJlcyk7Ci0gICAgICAgICAgICBkZXZfID0gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLX0KLQotYm9vbCBMb2NhbENsb2NrOjppbml0Q2hlY2soKSB7Ci0gICAgcmV0dXJuIChOVUxMICE9IGRldl8pOwotfQotCi1pbnQ2NF90IExvY2FsQ2xvY2s6OmdldExvY2FsVGltZSgpIHsKLSAgICBhc3NlcnQoTlVMTCAhPSBkZXZfKTsKLSAgICBhc3NlcnQoTlVMTCAhPSBkZXZfLT5nZXRfbG9jYWxfdGltZSk7Ci0KLSAgICByZXR1cm4gZGV2Xy0+Z2V0X2xvY2FsX3RpbWUoZGV2Xyk7Ci19Ci0KLXVpbnQ2NF90IExvY2FsQ2xvY2s6OmdldExvY2FsRnJlcSgpIHsKLSAgICBhc3NlcnQoTlVMTCAhPSBkZXZfKTsKLSAgICBhc3NlcnQoTlVMTCAhPSBkZXZfLT5nZXRfbG9jYWxfZnJlcSk7Ci0KLSAgICByZXR1cm4gZGV2Xy0+Z2V0X2xvY2FsX2ZyZXEoZGV2Xyk7Ci19Ci0KLXN0YXR1c190IExvY2FsQ2xvY2s6OnNldExvY2FsU2xldyhpbnQxNl90IHJhdGUpIHsKLSAgICBhc3NlcnQoTlVMTCAhPSBkZXZfKTsKLQotICAgIGlmICghZGV2Xy0+c2V0X2xvY2FsX3NsZXcpCi0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLQotICAgIHJldHVybiBzdGF0aWNfY2FzdDxzdGF0dXNfdD4oZGV2Xy0+c2V0X2xvY2FsX3NsZXcoZGV2XywgcmF0ZSkpOwotfQotCi1pbnQzMl90IExvY2FsQ2xvY2s6OmdldERlYnVnTG9nKHN0cnVjdCBsb2NhbF90aW1lX2RlYnVnX2V2ZW50KiByZWNvcmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X3JlY29yZHMpIHsKLSAgICBhc3NlcnQoTlVMTCAhPSBkZXZfKTsKLQotICAgIGlmICghZGV2Xy0+Z2V0X2RlYnVnX2xvZykKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotCi0gICAgcmV0dXJuIGRldl8tPmdldF9kZWJ1Z19sb2coZGV2XywgcmVjb3JkcywgbWF4X3JlY29yZHMpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29tbW9uX3RpbWUvdXRpbHMuY3BwIGIvbWVkaWEvY29tbW9uX3RpbWUvdXRpbHMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWNmMmZkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2NvbW1vbl90aW1lL3V0aWxzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YXJwYS9pbmV0Lmg+Ci0jaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotYm9vbCBjYW5TZXJpYWxpemVTb2NrYWRkcihjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSogYWRkcikgewotICAgIHN3aXRjaCAoYWRkci0+c3NfZmFtaWx5KSB7Ci0gICAgICAgIGNhc2UgQUZfSU5FVDoKLSAgICAgICAgY2FzZSBBRl9JTkVUNjoKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotdm9pZCBzZXJpYWxpemVTb2NrYWRkcihQYXJjZWwqIHAsIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKiBhZGRyKSB7Ci0gICAgc3dpdGNoIChhZGRyLT5zc19mYW1pbHkpIHsKLSAgICAgICAgY2FzZSBBRl9JTkVUOiB7Ci0gICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4qIHMgPQotICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3RydWN0IHNvY2thZGRyX2luKj4oYWRkcik7Ci0gICAgICAgICAgICBwLT53cml0ZUludDMyKEFGX0lORVQpOwotICAgICAgICAgICAgcC0+d3JpdGVJbnQzMihudG9obChzLT5zaW5fYWRkci5zX2FkZHIpKTsKLSAgICAgICAgICAgIHAtPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obnRvaHMocy0+c2luX3BvcnQpKSk7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBBRl9JTkVUNjogewotICAgICAgICAgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX2luNiogcyA9Ci0gICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW42Kj4oYWRkcik7Ci0gICAgICAgICAgICBjb25zdCBpbnQzMl90KiBhID0KLSAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGludDMyX3QqPihzLT5zaW42X2FkZHIuczZfYWRkcik7Ci0gICAgICAgICAgICBwLT53cml0ZUludDMyKEFGX0lORVQ2KTsKLSAgICAgICAgICAgIHAtPndyaXRlSW50MzIobnRvaGwoYVswXSkpOwotICAgICAgICAgICAgcC0+d3JpdGVJbnQzMihudG9obChhWzFdKSk7Ci0gICAgICAgICAgICBwLT53cml0ZUludDMyKG50b2hsKGFbMl0pKTsKLSAgICAgICAgICAgIHAtPndyaXRlSW50MzIobnRvaGwoYVszXSkpOwotICAgICAgICAgICAgcC0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihudG9ocyhzLT5zaW42X3BvcnQpKSk7Ci0gICAgICAgICAgICBwLT53cml0ZUludDMyKG50b2hsKHMtPnNpbjZfZmxvd2luZm8pKTsKLSAgICAgICAgICAgIHAtPndyaXRlSW50MzIobnRvaGwocy0+c2luNl9zY29wZV9pZCkpOwotICAgICAgICB9IGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBkZXNlcmlhbGl6ZVNvY2thZGRyKGNvbnN0IFBhcmNlbCogcCwgc3RydWN0IHNvY2thZGRyX3N0b3JhZ2UqIGFkZHIpIHsKLSAgICBtZW1zZXQoYWRkciwgMCwgc2l6ZW9mKCphZGRyKSk7Ci0KLSAgICBhZGRyLT5zc19mYW1pbHkgPSBwLT5yZWFkSW50MzIoKTsKLSAgICBzd2l0Y2goYWRkci0+c3NfZmFtaWx5KSB7Ci0gICAgICAgIGNhc2UgQUZfSU5FVDogewotICAgICAgICAgICAgc3RydWN0IHNvY2thZGRyX2luKiBzID0KLSAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHN0cnVjdCBzb2NrYWRkcl9pbio+KGFkZHIpOwotICAgICAgICAgICAgcy0+c2luX2FkZHIuc19hZGRyID0gaHRvbmwocC0+cmVhZEludDMyKCkpOwotICAgICAgICAgICAgcy0+c2luX3BvcnQgPSBodG9ucyhzdGF0aWNfY2FzdDx1aW50MTZfdD4ocC0+cmVhZEludDMyKCkpKTsKLSAgICAgICAgfSBicmVhazsKLQotICAgICAgICBjYXNlIEFGX0lORVQ2OiB7Ci0gICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW42KiBzID0KLSAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHN0cnVjdCBzb2NrYWRkcl9pbjYqPihhZGRyKTsKLSAgICAgICAgICAgIGludDMyX3QqIGEgPSByZWludGVycHJldF9jYXN0PGludDMyX3QqPihzLT5zaW42X2FkZHIuczZfYWRkcik7Ci0KLSAgICAgICAgICAgIGFbMF0gPSBodG9ubChwLT5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBhWzFdID0gaHRvbmwocC0+cmVhZEludDMyKCkpOwotICAgICAgICAgICAgYVsyXSA9IGh0b25sKHAtPnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIGFbM10gPSBodG9ubChwLT5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBzLT5zaW42X3BvcnQgPSBodG9ucyhzdGF0aWNfY2FzdDx1aW50MTZfdD4ocC0+cmVhZEludDMyKCkpKTsKLSAgICAgICAgICAgIHMtPnNpbjZfZmxvd2luZm8gPSBodG9ubChwLT5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBzLT5zaW42X3Njb3BlX2lkID0gaHRvbmwocC0+cmVhZEludDMyKCkpOwotICAgICAgICB9IGJyZWFrOwotICAgIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvbW1vbl90aW1lL3V0aWxzLmggYi9tZWRpYS9jb21tb25fdGltZS91dGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTc5ZDBkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2NvbW1vbl90aW1lL3V0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0xJQkNPTU1PTkNMT0NLX1VUSUxTX0gKLSNkZWZpbmUgQU5EUk9JRF9MSUJDT01NT05DTE9DS19VVElMU19ICi0KLSNpbmNsdWRlIDxsaW51eC9zb2NrZXQuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1leHRlcm4gYm9vbCBjYW5TZXJpYWxpemVTb2NrYWRkcihjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc3RvcmFnZSogYWRkcik7Ci1leHRlcm4gdm9pZCBzZXJpYWxpemVTb2NrYWRkcihQYXJjZWwqIHAsIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKiBhZGRyKTsKLWV4dGVybiBzdGF0dXNfdCBkZXNlcmlhbGl6ZVNvY2thZGRyKGNvbnN0IFBhcmNlbCogcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9zdG9yYWdlKiBhZGRyKTsKLQotfTsgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQU5EUk9JRF9MSUJDT01NT05DTE9DS19VVElMU19ICmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4MTc2Y2YuLjAwMDAwMDAKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi1zdWJkaXJzID0gWwotICAgICIqIiwKLV0KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FBQ0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuY3BwCmluZGV4IDlmYzVhNzYuLjlkMTgzZDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FBQ0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmNwcApAQCAtMTksNDggKzE5LDQ1IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJBQUNFeHRyYWN0b3IuaCIKLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBBQUNTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CitjbGFzcyBBQUNTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiBwdWJsaWM6CiAgICAgQUFDU291cmNlKAotICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50NjRfdD4gJm9mZnNldF92ZWN0b3IsCiAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lX2R1cmF0aW9uX3VzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UmKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldEZvcm1hdChBTWVkaWFGb3JtYXQqKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFBQ1NvdXJjZSgpOwogCiBwcml2YXRlOgogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heEZyYW1lU2l6ZTsKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7Ci0gICAgTWV0YURhdGFCYXNlIG1NZXRhOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOworICAgIEFNZWRpYUZvcm1hdCAqbU1ldGE7CiAKICAgICBvZmY2NF90IG1PZmZzZXQ7CiAgICAgaW50NjRfdCBtQ3VycmVudFRpbWVVczsKICAgICBib29sIG1TdGFydGVkOwotICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1Hcm91cDsKIAogICAgIFZlY3Rvcjx1aW50NjRfdD4gbU9mZnNldFZlY3RvcjsKICAgICBpbnQ2NF90IG1GcmFtZUR1cmF0aW9uVXM7CkBAIC05Miw3ICs4OSw3IEBACiAvLyBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgdGhlIEFBQyBmcmFtZSBzaXplIHdpdGggdGhlIEFEVFMgaGVhZGVyIGxlbmd0aCAocmVnYXJkbGVzcyBvZgogLy8gICAgIHRoZSBwcmVzZW5jZSBvZiB0aGUgQ1JDKS4KIC8vIElmIGhlYWRlclNpemUgaXMgbm9uLU5VTEwsIGl0IHdpbGwgYmUgdXNlZCB0byByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGhlYWRlciBvZiB0aGlzIEFEVFMgZnJhbWUuCi1zdGF0aWMgc2l6ZV90IGdldEFkdHNGcmFtZUxlbmd0aChEYXRhU291cmNlQmFzZSAqc291cmNlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90KiBoZWFkZXJTaXplKSB7CitzdGF0aWMgc2l6ZV90IGdldEFkdHNGcmFtZUxlbmd0aChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3QqIGhlYWRlclNpemUpIHsKIAogICAgIGNvbnN0IHNpemVfdCBrQWR0c0hlYWRlckxlbmd0aE5vQ3JjID0gNzsKICAgICBjb25zdCBzaXplX3Qga0FkdHNIZWFkZXJMZW5ndGhXaXRoQ3JjID0gOTsKQEAgLTEzMyw3ICsxMzAsNyBAQAogfQogCiBBQUNFeHRyYWN0b3I6OkFBQ0V4dHJhY3RvcigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgb2ZmNjRfdCBvZmZzZXQpCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgb2ZmNjRfdCBvZmZzZXQpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbUluaXRDaGVjayhOT19JTklUKSwKICAgICAgIG1GcmFtZUR1cmF0aW9uVXMoMCkgewpAQCAtMTUxLDcgKzE0OCw5IEBACiAgICAgfQogICAgIGNoYW5uZWwgPSAoaGVhZGVyWzBdICYgMHgxKSA8PCAyIHwgKGhlYWRlclsxXSA+PiA2KTsKIAorICAgIG1NZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOwogICAgIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YShtTWV0YSwgcHJvZmlsZSwgc2ZfaW5kZXgsIGNoYW5uZWwpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9BQUNfUFJPRklMRSwgcHJvZmlsZSArIDEpOwogCiAgICAgb2ZmNjRfdCBzdHJlYW1TaXplLCBudW1GcmFtZXMgPSAwOwogICAgIHNpemVfdCBmcmFtZVNpemUgPSAwOwpAQCAtMTc0LDI5ICsxNzMsMzAgQEAKICAgICAgICAgLy8gUm91bmQgdXAgYW5kIGdldCB0aGUgZHVyYXRpb24KICAgICAgICAgbUZyYW1lRHVyYXRpb25VcyA9ICgxMDI0ICogMTAwMDAwMGxsICsgKHNyIC0gMSkpIC8gc3I7CiAgICAgICAgIGR1cmF0aW9uID0gbnVtRnJhbWVzICogbUZyYW1lRHVyYXRpb25VczsKLSAgICAgICAgbU1ldGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvbik7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgZHVyYXRpb24pOwogICAgIH0KIAogICAgIG1Jbml0Q2hlY2sgPSBPSzsKIH0KIAogQUFDRXh0cmFjdG9yOjp+QUFDRXh0cmFjdG9yKCkgeworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobU1ldGEpOwogfQogCi1zdGF0dXNfdCBBQUNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEuY2xlYXIoKTsKK21lZGlhX3N0YXR1c190IEFBQ0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1ldGEpOwogICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7Ci0gICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTKTsKICAgICB9CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogc2l6ZV90IEFBQ0V4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7CiAgICAgcmV0dXJuIG1Jbml0Q2hlY2sgPT0gT0sgPyAxIDogMDsKIH0KIAotTWVkaWFUcmFjayAqQUFDRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKK01lZGlhVHJhY2tIZWxwZXIgKkFBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0yMDQsMTMgKzIwNCwxMiBAQAogICAgIHJldHVybiBuZXcgQUFDU291cmNlKG1EYXRhU291cmNlLCBtTWV0YSwgbU9mZnNldFZlY3RvciwgbUZyYW1lRHVyYXRpb25Vcyk7CiB9CiAKLXN0YXR1c190IEFBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKK21lZGlhX3N0YXR1c190IEFBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCi0gICAgbWV0YSA9IG1NZXRhOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbU1ldGEpOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtMjE5LDggKzIxOCw4IEBACiBjb25zdCBzaXplX3QgQUFDU291cmNlOjprTWF4RnJhbWVTaXplID0gODE5MjsKIAogQUFDU291cmNlOjpBQUNTb3VyY2UoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50NjRfdD4gJm9mZnNldF92ZWN0b3IsCiAgICAgICAgIGludDY0X3QgZnJhbWVfZHVyYXRpb25fdXMpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLApAQCAtMjI4LDcgKzIyNyw2IEBACiAgICAgICBtT2Zmc2V0KDApLAogICAgICAgbUN1cnJlbnRUaW1lVXMoMCksCiAgICAgICBtU3RhcnRlZChmYWxzZSksCi0gICAgICBtR3JvdXAoTlVMTCksCiAgICAgICBtT2Zmc2V0VmVjdG9yKG9mZnNldF92ZWN0b3IpLAogICAgICAgbUZyYW1lRHVyYXRpb25VcyhmcmFtZV9kdXJhdGlvbl91cykgewogfQpAQCAtMjM5LDcgKzIzNyw3IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBBQUNTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqIC8qIHBhcmFtcyAqLykgeworbWVkaWFfc3RhdHVzX3QgQUFDU291cmNlOjpzdGFydCgpIHsKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogCiAgICAgaWYgKG1PZmZzZXRWZWN0b3IuZW1wdHkoKSkgewpAQCAtMjQ5LDMwICsyNDcsMjUgQEAKICAgICB9CiAKICAgICBtQ3VycmVudFRpbWVVcyA9IDA7Ci0gICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0gICAgbUdyb3VwLT5hZGRfYnVmZmVyKE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKGtNYXhGcmFtZVNpemUpKTsKKyAgICBtQnVmZmVyR3JvdXAtPmFkZF9idWZmZXIoa01heEZyYW1lU2l6ZSk7CiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IEFBQ1NvdXJjZTo6c3RvcCgpIHsKK21lZGlhX3N0YXR1c190IEFBQ1NvdXJjZTo6c3RvcCgpIHsKICAgICBDSEVDSyhtU3RhcnRlZCk7CiAKLSAgICBkZWxldGUgbUdyb3VwOwotICAgIG1Hcm91cCA9IE5VTEw7Ci0KICAgICBtU3RhcnRlZCA9IGZhbHNlOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBBQUNTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhID0gbU1ldGE7Ci0gICAgcmV0dXJuIE9LOworbWVkaWFfc3RhdHVzX3QgQUFDU291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1NZXRhKTsKIH0KIAotc3RhdHVzX3QgQUFDU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CittZWRpYV9zdGF0dXNfdCBBQUNTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICpvdXQgPSBOVUxMOwogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwpAQCAtMjgyLDcgKzI3NSw3IEBACiAgICAgICAgICAgICBpbnQ2NF90IHNlZWtGcmFtZSA9IHNlZWtUaW1lVXMgLyBtRnJhbWVEdXJhdGlvblVzOwogICAgICAgICAgICAgaWYgKHNlZWtGcmFtZSA8IDAgfHwgc2Vla0ZyYW1lID49IChpbnQ2NF90KW1PZmZzZXRWZWN0b3Iuc2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI3MDIzOTUwNyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtQ3VycmVudFRpbWVVcyA9IHNlZWtGcmFtZSAqIG1GcmFtZUR1cmF0aW9uVXM7CiAKQEAgLTI5MiwxMyArMjg1LDEzIEBACiAKICAgICBzaXplX3QgZnJhbWVTaXplLCBmcmFtZVNpemVXaXRob3V0SGVhZGVyLCBoZWFkZXJTaXplOwogICAgIGlmICgoZnJhbWVTaXplID0gZ2V0QWR0c0ZyYW1lTGVuZ3RoKG1EYXRhU291cmNlLCBtT2Zmc2V0LCAmaGVhZGVyU2l6ZSkpID09IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICB9CiAKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKLSAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOworICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXI7CisgICAgc3RhdHVzX3QgZXJyID0gbUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICBmcmFtZVNpemVXaXRob3V0SGVhZGVyID0gZnJhbWVTaXplIC0gaGVhZGVyU2l6ZTsKQEAgLTMwNywzNyArMzAwLDM5IEBACiAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICBidWZmZXIgPSBOVUxMOwogCi0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICB9CiAKICAgICBidWZmZXItPnNldF9yYW5nZSgwLCBmcmFtZVNpemVXaXRob3V0SGVhZGVyKTsKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCBtQ3VycmVudFRpbWVVcyk7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgbUN1cnJlbnRUaW1lVXMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogCiAgICAgbU9mZnNldCArPSBmcmFtZVNpemU7CiAgICAgbUN1cnJlbnRUaW1lVXMgKz0gbUZyYW1lRHVyYXRpb25VczsKIAogICAgICpvdXQgPSBidWZmZXI7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLXN0YXRpYyBNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorc3RhdGljIENNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAogICAgICAgICB2b2lkICptZXRhKSB7CiAgICAgb2ZmNjRfdCBvZmZzZXQgPSAqc3RhdGljX2Nhc3Q8b2ZmNjRfdCo+KG1ldGEpOwotICAgIHJldHVybiBuZXcgQUFDRXh0cmFjdG9yKHNvdXJjZSwgb2Zmc2V0KTsKKyAgICByZXR1cm4gd3JhcChuZXcgQUFDRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKHNvdXJjZSksIG9mZnNldCkpOwogfQogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIFNuaWZmKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsCi0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKmZyZWVNZXRhKSB7CitzdGF0aWMgQ3JlYXRvckZ1bmMgU25pZmYoCisgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlLCB2b2lkICoqbWV0YSwKKyAgICAgICAgRnJlZU1ldGFGdW5jICpmcmVlTWV0YSkgewogICAgIG9mZjY0X3QgcG9zID0gMDsKIAorICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKHNvdXJjZSk7CiAgICAgZm9yICg7OykgewogICAgICAgICB1aW50OF90IGlkM2hlYWRlclsxMF07Ci0gICAgICAgIGlmIChzb3VyY2UtPnJlYWRBdChwb3MsIGlkM2hlYWRlciwgc2l6ZW9mKGlkM2hlYWRlcikpCisgICAgICAgIGlmIChoZWxwZXIucmVhZEF0KHBvcywgaWQzaGVhZGVyLCBzaXplb2YoaWQzaGVhZGVyKSkKICAgICAgICAgICAgICAgICA8IChzc2l6ZV90KXNpemVvZihpZDNoZWFkZXIpKSB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQpAQCAtMzY0LDcgKzM1OSw3IEBACiAKICAgICB1aW50OF90IGhlYWRlclsyXTsKIAotICAgIGlmIChzb3VyY2UtPnJlYWRBdChwb3MsICZoZWFkZXIsIDIpICE9IDIpIHsKKyAgICBpZiAoaGVscGVyLnJlYWRBdChwb3MsICZoZWFkZXIsIDIpICE9IDIpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC0zODMsMTcgKzM3OCwyMSBAQAogICAgIHJldHVybiBOVUxMOwogfQogCitzdGF0aWMgY29uc3QgY2hhciAqZXh0ZW5zaW9uc1tdID0geworICAgICJhYWMiLAorICAgIE5VTEwKK307CiAKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT04sCiAgICAgICAgIFVVSUQoIjRmZDgwZWFlLTAzZDItNGQ3Mi05ZWI5LTQ4ZmE2YmI1NDYxMyIpLAogICAgICAgICAxLCAvLyB2ZXJzaW9uCiAgICAgICAgICJBQUMgRXh0cmFjdG9yIiwKLSAgICAgICAgU25pZmYKKyAgICAgICAgeyAudjMgPSB7U25pZmYsIGV4dGVuc2lvbnN9IH0sCiAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuaAppbmRleCA5ZGFkYmVkLi42NDNkM2Y0IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuaApAQCAtMTgsOCArMTgsOSBAQAogCiAjZGVmaW5lIEFBQ19FWFRSQUNUT1JfSF8KIAotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAKICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIApAQCAtMjgsMjMgKzI5LDIzIEBACiBzdHJ1Y3QgQU1lc3NhZ2U7CiBjbGFzcyBTdHJpbmc4OwogCi1jbGFzcyBBQUNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworY2xhc3MgQUFDRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKIHB1YmxpYzoKLSAgICBBQUNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgb2ZmNjRfdCBvZmZzZXQpOworICAgIEFBQ0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIG9mZjY0X3Qgb2Zmc2V0KTsKIAogICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlciAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJBQUNFeHRyYWN0b3IiOyB9CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BQUNFeHRyYWN0b3IoKTsKIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7Ci0gICAgTWV0YURhdGFCYXNlIG1NZXRhOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOworICAgIEFNZWRpYUZvcm1hdCAqbU1ldGE7CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKIAogICAgIFZlY3Rvcjx1aW50NjRfdD4gbU9mZnNldFZlY3RvcjsKQEAgLTU1LDcgKzU2LDcgQEAKIH07CiAKIGJvb2wgU25pZmZBQUMoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIFN0cmluZzggKm1pbWVUeXBlLCBmbG9hdCAqY29uZmlkZW5jZSwgb2ZmNjRfdCAqb2Zmc2V0KTsKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsIG9mZjY0X3QgKm9mZnNldCk7CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwCmluZGV4IDVmMDViNDIuLmE1ODE2N2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQW5kcm9pZC5icApAQCAtOCw3ICs4LDcgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlibWVkaWFuZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwpAQCAtMzUsOSArMzUsNiBAQAogICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiAKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FNUkV4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuY3BwCmluZGV4IGY1NmQ1ZWYuLmZmZWZmNDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FNUkV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQU1SRXh0cmFjdG9yLmNwcApAQCAtMjAsOCArMjAsNiBAQAogCiAjaW5jbHVkZSAiQU1SRXh0cmFjdG9yLmgiCiAKLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KQEAgLTMxLDI5ICsyOSwyOSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIEFNUlNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKK2NsYXNzIEFNUlNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyIHsKIHB1YmxpYzoKICAgICBBTVJTb3VyY2UoCi0gICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICAgICAgYm9vbCBpc1dpZGUsCiAgICAgICAgICAgICBjb25zdCBvZmY2NF90ICpvZmZzZXRfdGFibGUsCiAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0X3RhYmxlX2xlbmd0aCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICYpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFNUlNvdXJjZSgpOwogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKLSAgICBNZXRhRGF0YUJhc2UgbU1ldGE7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0ICptTWV0YTsKICAgICBib29sIG1Jc1dpZGU7CiAKICAgICBvZmY2NF90IG1PZmZzZXQ7CkBAIC05OCwyNyArOTYsMjcgQEAKICAgICByZXR1cm4gZnJhbWVTaXplOwogfQogCi1zdGF0aWMgc3RhdHVzX3QgZ2V0RnJhbWVTaXplQnlPZmZzZXQoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKK3N0YXRpYyBtZWRpYV9zdGF0dXNfdCBnZXRGcmFtZVNpemVCeU9mZnNldChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsCiAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0LCBib29sIGlzV2lkZSwgc2l6ZV90ICpmcmFtZVNpemUpIHsKICAgICB1aW50OF90IGhlYWRlcjsKICAgICBzc2l6ZV90IGNvdW50ID0gc291cmNlLT5yZWFkQXQob2Zmc2V0LCAmaGVhZGVyLCAxKTsKICAgICBpZiAoY291bnQgPT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgIH0gZWxzZSBpZiAoY291bnQgPCAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICB9CiAKICAgICB1bnNpZ25lZCBGVCA9IChoZWFkZXIgPj4gMykgJiAweDBmOwogCiAgICAgKmZyYW1lU2l6ZSA9IGdldEZyYW1lU2l6ZShpc1dpZGUsIEZUKTsKICAgICBpZiAoKmZyYW1lU2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogc3RhdGljIGJvb2wgU25pZmZBTVIoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGJvb2wgKmlzV2lkZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBib29sICppc1dpZGUsIGZsb2F0ICpjb25maWRlbmNlKSB7CiAgICAgY2hhciBoZWFkZXJbOV07CiAKICAgICBpZiAoc291cmNlLT5yZWFkQXQoMCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgIT0gc2l6ZW9mKGhlYWRlcikpIHsKQEAgLTE0NCw3ICsxNDIsNyBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotQU1SRXh0cmFjdG9yOjpBTVJFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKK0FNUkV4dHJhY3Rvcjo6QU1SRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICBtSW5pdENoZWNrKE5PX0lOSVQpLAogICAgICAgbU9mZnNldFRhYmxlTGVuZ3RoKDApIHsKQEAgLTE1MywxMiArMTUxLDEyIEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBtTWV0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAga0tleU1JTUVUeXBlLCBtSXNXaWRlID8gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIpOworICAgIG1NZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwKKyAgICAgICAgICAgIG1Jc1dpZGUgPyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IgOiBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIpOwogCi0gICAgbU1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgMSk7Ci0gICAgbU1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1Jc1dpZGUgPyAxNjAwMCA6IDgwMDApOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCAxKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIG1Jc1dpZGUgPyAxNjAwMCA6IDgwMDApOwogCiAgICAgb2ZmNjRfdCBvZmZzZXQgPSBtSXNXaWRlID8gOSA6IDY7CiAgICAgb2ZmNjRfdCBzdHJlYW1TaXplOwpAQCAtMTY2LDExICsxNjQsMTEgQEAKICAgICBpbnQ2NF90IGR1cmF0aW9uID0gMDsKIAogICAgIGlmIChtRGF0YVNvdXJjZS0+Z2V0U2l6ZSgmc3RyZWFtU2l6ZSkgPT0gT0spIHsKLSAgICAgICAgIHdoaWxlIChvZmZzZXQgPCBzdHJlYW1TaXplKSB7Ci0gICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0RnJhbWVTaXplQnlPZmZzZXQoc291cmNlLCBvZmZzZXQsIG1Jc1dpZGUsICZmcmFtZVNpemUpOwotICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICB3aGlsZSAob2Zmc2V0IDwgc3RyZWFtU2l6ZSkgeworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0RnJhbWVTaXplQnlPZmZzZXQoc291cmNlLCBvZmZzZXQsIG1Jc1dpZGUsICZmcmFtZVNpemUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIApAQCAtMTg1LDMwICsxODMsMzMgQEAKICAgICAgICAgICAgIG51bUZyYW1lcyArKzsKICAgICAgICAgfQogCi0gICAgICAgIG1NZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb24pOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uKTsKICAgICB9CiAKICAgICBtSW5pdENoZWNrID0gT0s7CiB9CiAKIEFNUkV4dHJhY3Rvcjo6fkFNUkV4dHJhY3RvcigpIHsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtTWV0YSk7CiB9CiAKLXN0YXR1c190IEFNUkV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgbWV0YS5jbGVhcigpOworbWVkaWFfc3RhdHVzX3QgQU1SRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpIHsKKyAgICBBTWVkaWFGb3JtYXRfY2xlYXIobWV0YSk7CiAKICAgICBpZiAobUluaXRDaGVjayA9PSBPSykgewotICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtSXNXaWRlID8gImF1ZGlvL2Ftci13YiIgOiAiYXVkaW8vYW1yIik7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIG1Jc1dpZGUgPyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IgOiAiYXVkaW8vYW1yIik7CiAgICAgfQogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHNpemVfdCBBTVJFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtSW5pdENoZWNrID09IE9LID8gMSA6IDA7CiB9CiAKLU1lZGlhVHJhY2sgKkFNUkV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpBTVJFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMjE3LDE5ICsyMTgsMTggQEAKICAgICAgICAgICAgIG1PZmZzZXRUYWJsZSwgbU9mZnNldFRhYmxlTGVuZ3RoKTsKIH0KIAotc3RhdHVzX3QgQU1SRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgeworbWVkaWFfc3RhdHVzX3QgQU1SRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKLSAgICBtZXRhID0gbU1ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtTWV0YSk7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIEFNUlNvdXJjZTo6QU1SU291cmNlKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBib29sIGlzV2lkZSwgY29uc3Qgb2ZmNjRfdCAqb2Zmc2V0X3RhYmxlLCBzaXplX3Qgb2Zmc2V0X3RhYmxlX2xlbmd0aCkKICAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICBtTWV0YShtZXRhKSwKQEAgLTI1MCw0MyArMjUwLDM4IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBBTVJTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqIC8qIHBhcmFtcyAqLykgeworbWVkaWFfc3RhdHVzX3QgQU1SU291cmNlOjpzdGFydCgpIHsKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogCiAgICAgbU9mZnNldCA9IG1Jc1dpZGUgPyA5IDogNjsKICAgICBtQ3VycmVudFRpbWVVcyA9IDA7Ci0gICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0gICAgbUdyb3VwLT5hZGRfYnVmZmVyKE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKDEyOCkpOworICAgIG1CdWZmZXJHcm91cC0+YWRkX2J1ZmZlcigxMjgpOwogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBBTVJTb3VyY2U6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBBTVJTb3VyY2U6OnN0b3AoKSB7CiAgICAgQ0hFQ0sobVN0YXJ0ZWQpOwogCi0gICAgZGVsZXRlIG1Hcm91cDsKLSAgICBtR3JvdXAgPSBOVUxMOwotCiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgQU1SU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgbWV0YSA9IG1NZXRhOwotICAgIHJldHVybiBPSzsKK21lZGlhX3N0YXR1c190IEFNUlNvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtTWV0YSk7CiB9CiAKLXN0YXR1c190IEFNUlNvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworbWVkaWFfc3RhdHVzX3QgQU1SU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICAqb3V0ID0gTlVMTDsKIAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKICAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKICAgICBpZiAobU9mZnNldFRhYmxlTGVuZ3RoID4gMCAmJiBvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CiAgICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBpbnQ2NF90IHNlZWtGcmFtZSA9IHNlZWtUaW1lVXMgLyAyMDAwMGxsOyAgLy8gMjBtcyBwZXIgZnJhbWUuCi0gICAgICAgIG1DdXJyZW50VGltZVVzID0gc2Vla0ZyYW1lICogMjAwMDBsbDsKKyAgICAgICAgaW50NjRfdCBzZWVrRnJhbWUgPSBzZWVrVGltZVVzIC8gMjAwMDBMTDsgIC8vIDIwbXMgcGVyIGZyYW1lLgorICAgICAgICBtQ3VycmVudFRpbWVVcyA9IHNlZWtGcmFtZSAqIDIwMDAwTEw7CiAKICAgICAgICAgc2l6ZV90IGluZGV4ID0gc2Vla0ZyYW1lIDwgMCA/IDAgOiBzZWVrRnJhbWUgLyA1MDsKICAgICAgICAgaWYgKGluZGV4ID49IG1PZmZzZXRUYWJsZUxlbmd0aCkgewpAQCAtMjk2LDcgKzI5MSw3IEBACiAgICAgICAgIG1PZmZzZXQgPSBtT2Zmc2V0VGFibGVbaW5kZXhdICsgKG1Jc1dpZGUgPyA5IDogNik7CiAKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGk8IHNlZWtGcmFtZSAtIGluZGV4ICogNTA7IGkrKykgewotICAgICAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyOwogICAgICAgICAgICAgaWYgKChlcnIgPSBnZXRGcmFtZVNpemVCeU9mZnNldChtRGF0YVNvdXJjZSwgbU9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSXNXaWRlLCAmc2l6ZSkpICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTMwOSw3ICszMDQsNyBAQAogICAgIHNzaXplX3QgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQobU9mZnNldCwgJmhlYWRlciwgMSk7CiAKICAgICBpZiAobiA8IDEpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICB9CiAKICAgICBpZiAoaGVhZGVyICYgMHg4MykgewpAQCAtMzE3LDIwICszMTIsMjAgQEAKIAogICAgICAgICBBTE9HRSgicGFkZGluZyBiaXRzIG11c3QgYmUgMCwgaGVhZGVyIGlzIDB4JTAyeCIsIGhlYWRlcik7CiAKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCiAgICAgdW5zaWduZWQgRlQgPSAoaGVhZGVyID4+IDMpICYgMHgwZjsKIAogICAgIHNpemVfdCBmcmFtZVNpemUgPSBnZXRGcmFtZVNpemUobUlzV2lkZSwgRlQpOwogICAgIGlmIChmcmFtZVNpemUgPT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKLSAgICBzdGF0dXNfdCBlcnIgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOworICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXI7CisgICAgc3RhdHVzX3QgZXJyID0gbUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICBuID0gbURhdGFTb3VyY2UtPnJlYWRBdChtT2Zmc2V0LCBidWZmZXItPmRhdGEoKSwgZnJhbWVTaXplKTsKQEAgLTM0MCw1MCArMzM1LDYzIEBACiAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CiAKICAgICAgICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gb25seSBwYXJ0aWFsIGZyYW1lIGlzIGF2YWlsYWJsZSwgdHJlYXQgaXQgYXMgRU9TLgogICAgICAgICAgICAgbU9mZnNldCArPSBuOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgICAgIH0KICAgICB9CiAKICAgICBidWZmZXItPnNldF9yYW5nZSgwLCBmcmFtZVNpemUpOwotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIG1DdXJyZW50VGltZVVzKTsKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCBtQ3VycmVudFRpbWVVcyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAKICAgICBtT2Zmc2V0ICs9IGZyYW1lU2l6ZTsKICAgICBtQ3VycmVudFRpbWVVcyArPSAyMDAwMDsgIC8vIEVhY2ggZnJhbWUgaXMgMjBtcwogCiAgICAgKm91dCA9IGJ1ZmZlcjsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCitzdGF0aWMgY29uc3QgY2hhciAqZXh0ZW5zaW9uc1tdID0geworICAgICJhbXIiLAorICAgICJhd2IiLAorICAgIE5VTEwKK307CisKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT04sCiAgICAgICAgIFVVSUQoImM4NjYzOWM5LTJmMzEtNDBhYy1hNzE1LWZhMDFiNDQ5M2FhZiIpLAogICAgICAgICAxLAogICAgICAgICAiQU1SIEV4dHJhY3RvciIsCi0gICAgICAgIFtdKAotICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCi0gICAgICAgICAgICAgICAgdm9pZCAqKiwKLSAgICAgICAgICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICopIC0+IE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyB7Ci0gICAgICAgICAgICBpZiAoU25pZmZBTVIoc291cmNlLCBudWxscHRyLCBjb25maWRlbmNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBbXSgKLSAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IE1lZGlhRXh0cmFjdG9yKiB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQU1SRXh0cmFjdG9yKHNvdXJjZSk7fTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgLnYzID0geworICAgICAgICAgICAgICAgW10oCisgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgICAgICAgICAgICB2b2lkICoqLAorICAgICAgICAgICAgICAgICAgIEZyZWVNZXRhRnVuYyAqKSAtPiBDcmVhdG9yRnVuYyB7CisgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciBoZWxwZXIoc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICBpZiAoU25pZmZBTVIoJmhlbHBlciwgbnVsbHB0ciwgY29uZmlkZW5jZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBDTWVkaWFFeHRyYWN0b3IqIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwKG5ldyBBTVJFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSkpO307CisgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgIGV4dGVuc2lvbnMKKyAgICAgICAgICAgfSwKKyAgICAgICAgfSwKICAgICB9OwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FNUkV4dHJhY3Rvci5oCmluZGV4IGM5MGIzMjUuLmI3NmVlOWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FNUkV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FNUkV4dHJhY3Rvci5oCkBAIC0xOSw4ICsxOSw5IEBACiAjZGVmaW5lIEFNUl9FWFRSQUNUT1JfSF8KIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMjgsMjMgKzI5LDIzIEBACiBjbGFzcyBTdHJpbmc4OwogI2RlZmluZSBPRkZTRVRfVEFCTEVfTEVOICAgIDMwMAogCi1jbGFzcyBBTVJFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworY2xhc3MgQU1SRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBBTVJFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CisgICAgZXhwbGljaXQgQU1SRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiQU1SRXh0cmFjdG9yIjsgfQogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QU1SRXh0cmFjdG9yKCk7CiAKIHByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOwotICAgIE1ldGFEYXRhQmFzZSBtTWV0YTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAgICAgYm9vbCBtSXNXaWRlOwogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Ftci9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQW5kcm9pZC5icAppbmRleCBkOTYyYjkzLi40YmQ5MzNkIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2Ftci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FuZHJvaWQuYnAKQEAgLTgsNyArOCw3IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKQEAgLTMzLDkgKzMzLDYgQEAKICAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAogCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9BbmRyb2lkLmJwCmluZGV4IDYyODI3OTMuLjNhM2QwNTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9BbmRyb2lkLmJwCkBAIC04LDEzICs4LDE3IEBACiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXJfbmRrIiwKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKICAgICAgICAgImxpYkZMQUMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogCiAgICAgbmFtZTogImxpYmZsYWNleHRyYWN0b3IiLApAQCAtMzUsOSArMzksNiBAQAogICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiAKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmNwcAppbmRleCBlM2RhMjU5Li41MzI5YmQxIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0ZMQUNFeHRyYWN0b3IuY3BwCkBAIC0xOCw0NSArMTgsNjIgQEAKICNkZWZpbmUgTE9HX1RBRyAiRkxBQ0V4dHJhY3RvciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPHN0ZGludC5oPgorCiAjaW5jbHVkZSAiRkxBQ0V4dHJhY3Rvci5oIgogLy8gbGliRkxBQyBwYXJzZXIKICNpbmNsdWRlICJGTEFDL3N0cmVhbV9kZWNvZGVyLmgiCiAKLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KLSNpbmNsdWRlIDxtZWRpYS9Wb3JiaXNDb21tZW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPiAvLyBmb3IgQUlCaW5kZXJfZ2V0Q2FsbGluZ1VpZAorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oPgorI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPiAvLyBmb3IgQUlEX01FRElBCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorLy8gTWVkaWFTZXJ2ZXIgaXMgY2FwYWJsZSBvZiBoYW5kbGluZyBmbG9hdCBleHRyYWN0b3Igb3V0cHV0LCBidXQgZ2VuZXJhbCBwcm9jZXNzZXMKKy8vIG1heSBub3QgYmUgYWJsZSB0byBkbyBzby4KKy8vIFRPRE86IEltcHJvdmUgQVBJIHRvIHNldCBleHRyYWN0b3IgZmxvYXQgb3V0cHV0LgorLy8gKE5vdGU6IGR1cGxpY2F0ZWQgd2l0aCBXQVZFeHRyYWN0b3IuY3BwKQorc3RhdGljIGlubGluZSBib29sIHNob3VsZEV4dHJhY3Rvck91dHB1dEZsb2F0KGludCBiaXRzUGVyU2FtcGxlKQoreworICAgIHJldHVybiBiaXRzUGVyU2FtcGxlID4gMTYgJiYgQUlCaW5kZXJfZ2V0Q2FsbGluZ1VpZCgpID09IEFJRF9NRURJQTsKK30KKwogY2xhc3MgRkxBQ1BhcnNlcjsKIAotY2xhc3MgRkxBQ1NvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKK2NsYXNzIEZMQUNTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiAKIHB1YmxpYzoKICAgICBGTEFDU291cmNlKAotICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEpOworICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqZGF0YVNvdXJjZSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKKyAgICAgICAgICAgIGJvb2wgb3V0cHV0RmxvYXQpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkZMQUNTb3VyY2UoKTsKIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7Ci0gICAgTWV0YURhdGFCYXNlIG1UcmFja01ldGFkYXRhOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOworICAgIEFNZWRpYUZvcm1hdCAqbVRyYWNrTWV0YWRhdGE7CisgICAgY29uc3QgYm9vbCBtT3V0cHV0RmxvYXQ7CiAgICAgRkxBQ1BhcnNlciAqbVBhcnNlcjsKICAgICBib29sIG1Jbml0Q2hlY2s7CiAgICAgYm9vbCBtU3RhcnRlZDsKQEAgLTczLDE0ICs5MCwxNSBAQAogCiBwdWJsaWM6CiAgICAgZW51bSB7Ci0gICAgICAgIGtNYXhDaGFubmVscyA9IDgsCisgICAgICAgIGtNYXhDaGFubmVscyA9IEZDQ184LAogICAgIH07CiAKICAgICBleHBsaWNpdCBGTEFDUGFyc2VyKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqZGF0YVNvdXJjZSwKKyAgICAgICAgYm9vbCBvdXRwdXRGbG9hdCwKICAgICAgICAgLy8gSWYgbWV0YWRhdGEgcG9pbnRlcnMgYXJlbid0IHByb3ZpZGVkLCB3ZSBkb24ndCBmaWxsIHRoZW0KLSAgICAgICAgTWV0YURhdGFCYXNlICpmaWxlTWV0YWRhdGEgPSAwLAotICAgICAgICBNZXRhRGF0YUJhc2UgKnRyYWNrTWV0YWRhdGEgPSAwKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmaWxlTWV0YWRhdGEgPSAwLAorICAgICAgICBBTWVkaWFGb3JtYXQgKnRyYWNrTWV0YWRhdGEgPSAwKTsKIAogICAgIHZpcnR1YWwgfkZMQUNQYXJzZXIoKTsKIApAQCAtMTA2LDI1ICsxMjQsMjYgQEAKICAgICB9CiAKICAgICAvLyBtZWRpYSBidWZmZXJzCi0gICAgdm9pZCBhbGxvY2F0ZUJ1ZmZlcnMoKTsKKyAgICB2b2lkIGFsbG9jYXRlQnVmZmVycyhNZWRpYUJ1ZmZlckdyb3VwSGVscGVyICpncm91cCk7CiAgICAgdm9pZCByZWxlYXNlQnVmZmVycygpOwotICAgIE1lZGlhQnVmZmVyQmFzZSAqcmVhZEJ1ZmZlcigpIHsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqcmVhZEJ1ZmZlcigpIHsKICAgICAgICAgcmV0dXJuIHJlYWRCdWZmZXIoZmFsc2UsIDBMTCk7CiAgICAgfQotICAgIE1lZGlhQnVmZmVyQmFzZSAqcmVhZEJ1ZmZlcihGTEFDX191aW50NjQgc2FtcGxlKSB7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKnJlYWRCdWZmZXIoRkxBQ19fdWludDY0IHNhbXBsZSkgewogICAgICAgICByZXR1cm4gcmVhZEJ1ZmZlcih0cnVlLCBzYW1wbGUpOwogICAgIH0KIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7Ci0gICAgTWV0YURhdGFCYXNlICptRmlsZU1ldGFkYXRhOwotICAgIE1ldGFEYXRhQmFzZSAqbVRyYWNrTWV0YWRhdGE7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CisgICAgY29uc3QgYm9vbCBtT3V0cHV0RmxvYXQ7CisgICAgQU1lZGlhRm9ybWF0ICptRmlsZU1ldGFkYXRhOworICAgIEFNZWRpYUZvcm1hdCAqbVRyYWNrTWV0YWRhdGE7CiAgICAgYm9vbCBtSW5pdENoZWNrOwogCiAgICAgLy8gbWVkaWEgYnVmZmVycwogICAgIHNpemVfdCBtTWF4QnVmZmVyU2l6ZTsKLSAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7Ci0gICAgdm9pZCAoKm1Db3B5KShzaG9ydCAqZHN0LCBjb25zdCBpbnQgKiBzcmNba01heENoYW5uZWxzXSwgdW5zaWduZWQgblNhbXBsZXMsIHVuc2lnbmVkIG5DaGFubmVscyk7CisgICAgTWVkaWFCdWZmZXJHcm91cEhlbHBlciAqbUdyb3VwOworICAgIHZvaWQgKCptQ29weSkoaW50MTZfdCAqZHN0LCBjb25zdCBpbnQgKiBzcmNba01heENoYW5uZWxzXSwgdW5zaWduZWQgblNhbXBsZXMsIHVuc2lnbmVkIG5DaGFubmVscyk7CiAKICAgICAvLyBoYW5kbGUgdG8gdW5kZXJseWluZyBsaWJGTEFDIHBhcnNlcgogICAgIEZMQUNfX1N0cmVhbURlY29kZXIgKm1EZWNvZGVyOwpAQCAtMTQ3LDcgKzE2Niw3IEBACiAgICAgRkxBQ19fU3RyZWFtRGVjb2RlckVycm9yU3RhdHVzIG1FcnJvclN0YXR1czsKIAogICAgIHN0YXR1c190IGluaXQoKTsKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKnJlYWRCdWZmZXIoYm9vbCBkb1NlZWssIEZMQUNfX3VpbnQ2NCBzYW1wbGUpOworICAgIE1lZGlhQnVmZmVySGVscGVyICpyZWFkQnVmZmVyKGJvb2wgZG9TZWVrLCBGTEFDX191aW50NjQgc2FtcGxlKTsKIAogICAgIC8vIG5vIGNvcHkgY29uc3RydWN0b3Igb3IgYXNzaWdubWVudAogICAgIEZMQUNQYXJzZXIoY29uc3QgRkxBQ1BhcnNlciAmKTsKQEAgLTE2Nyw2ICsxODYsNyBAQAogICAgICAgICAgICAgY29uc3QgRkxBQ19fRnJhbWUgKmZyYW1lLCBjb25zdCBGTEFDX19pbnQzMiAqIGNvbnN0IGJ1ZmZlcltdKTsKICAgICB2b2lkIG1ldGFkYXRhQ2FsbGJhY2soY29uc3QgRkxBQ19fU3RyZWFtTWV0YWRhdGEgKm1ldGFkYXRhKTsKICAgICB2b2lkIGVycm9yQ2FsbGJhY2soRkxBQ19fU3RyZWFtRGVjb2RlckVycm9yU3RhdHVzIHN0YXR1cyk7CisgICAgc2l6ZV90IGdldE91dHB1dFNhbXBsZVNpemUoKSBjb25zdCB7IHJldHVybiBtT3V0cHV0RmxvYXQgPyBzaXplb2YoZmxvYXQpIDogc2l6ZW9mKGludDE2X3QpOyB9CiAKICAgICAvLyBGTEFDIHBhcnNlciBjYWxsYmFja3MgYXMgQy1jYWxsYWJsZSBmdW5jdGlvbnMKICAgICBzdGF0aWMgRkxBQ19fU3RyZWFtRGVjb2RlclJlYWRTdGF0dXMgcmVhZF9jYWxsYmFjaygKQEAgLTM2Miw5ICszODIsOCBAQAogICAgIGNhc2UgRkxBQ19fTUVUQURBVEFfVFlQRV9QSUNUVVJFOgogICAgICAgICBpZiAobUZpbGVNZXRhZGF0YSAhPSAwKSB7CiAgICAgICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1NZXRhZGF0YV9QaWN0dXJlICpwID0gJm1ldGFkYXRhLT5kYXRhLnBpY3R1cmU7Ci0gICAgICAgICAgICBtRmlsZU1ldGFkYXRhLT5zZXREYXRhKGtLZXlBbGJ1bUFydCwKLSAgICAgICAgICAgICAgICAgICAgTWV0YURhdGE6OlRZUEVfTk9ORSwgcC0+ZGF0YSwgcC0+ZGF0YV9sZW5ndGgpOwotICAgICAgICAgICAgbUZpbGVNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5QWxidW1BcnRNSU1FLCBwLT5taW1lX3R5cGUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtRmlsZU1ldGFkYXRhLCBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJULAorICAgICAgICAgICAgICAgICAgIHAtPmRhdGEsIHAtPmRhdGFfbGVuZ3RoKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgpAQCAtMzc5LDEyMiArMzk4LDYxIEBACiAgICAgbUVycm9yU3RhdHVzID0gc3RhdHVzOwogfQogCi0vLyBDb3B5IHNhbXBsZXMgZnJvbSBGTEFDIG5hdGl2ZSAzMi1iaXQgbm9uLWludGVybGVhdmVkIHRvIDE2LWJpdCBpbnRlcmxlYXZlZC4KKy8vIENvcHkgc2FtcGxlcyBmcm9tIEZMQUMgbmF0aXZlIDMyLWJpdCBub24taW50ZXJsZWF2ZWQgdG8gMTYtYml0IHNpZ25lZAorLy8gb3IgMzItYml0IGZsb2F0IGludGVybGVhdmVkLgorLy8gVE9ETzogQ29uc2lkZXIgbW92aW5nIHRvIGF1ZGlvX3V0aWxzLgogLy8gVGhlc2UgYXJlIGNhbmRpZGF0ZXMgZm9yIG9wdGltaXphdGlvbiBpZiBuZWVkZWQuCi0KLXN0YXRpYyB2b2lkIGNvcHlNb25vOCgKK3N0YXRpYyB2b2lkIGNvcHlUbzE2U2lnbmVkKAogICAgICAgICBzaG9ydCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwKKyAgICAgICAgY29uc3QgaW50ICpjb25zdCAqc3JjLAogICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldIDw8IDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5U3RlcmVvOCgKLSAgICAgICAgc2hvcnQgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPDwgODsKLSAgICAgICAgKmRzdCsrID0gc3JjWzFdW2ldIDw8IDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5TXVsdGlDaDgoc2hvcnQgKmRzdCwgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpCi17Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7Ci0gICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV0gPDwgODsKKyAgICAgICAgdW5zaWduZWQgbkNoYW5uZWxzLAorICAgICAgICB1bnNpZ25lZCBiaXRzUGVyU2FtcGxlKSB7CisgICAgY29uc3QgaW50IGxlZnRTaGlmdCA9IDE2IC0gKGludCliaXRzUGVyU2FtcGxlOyAvLyBjYXN0IHRvIGludCB0byBwcmV2ZW50IHVuc2lnbmVkIG92ZXJmbG93LgorICAgIGlmIChsZWZ0U2hpZnQgPj0gMCkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgeworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gc3JjW2NdW2ldIDw8IGxlZnRTaGlmdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGludCByaWdodFNoaWZ0ID0gLWxlZnRTaGlmdDsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBuQ2hhbm5lbHM7ICsrYykgeworICAgICAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXSA+PiByaWdodFNoaWZ0OworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjb3B5TW9ubzE2KAotICAgICAgICBzaG9ydCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwKK3N0YXRpYyB2b2lkIGNvcHlUb0Zsb2F0KAorICAgICAgICBmbG9hdCAqZHN0LAorICAgICAgICBjb25zdCBpbnQgKmNvbnN0ICpzcmMsCiAgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV07Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5U3RlcmVvMTYoCi0gICAgICAgIHNob3J0ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldOwotICAgICAgICAqZHN0KysgPSBzcmNbMV1baV07Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5TXVsdGlDaDE2KHNob3J0ICpkc3QsIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKQoteworICAgICAgICB1bnNpZ25lZCBuQ2hhbm5lbHMsCisgICAgICAgIHVuc2lnbmVkIGJpdHNQZXJTYW1wbGUpIHsKKyAgICBjb25zdCB1bnNpZ25lZCBsZWZ0U2hpZnQgPSAzMiAtIGJpdHNQZXJTYW1wbGU7CiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKICAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7Ci0gICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV07CisgICAgICAgICAgICAqZHN0KysgPSBmbG9hdF9mcm9tX2kzMihzcmNbY11baV0gPDwgbGVmdFNoaWZ0KTsKICAgICAgICAgfQogICAgIH0KIH0KIAotLy8gMjQtYml0IHZlcnNpb25zIHNob3VsZCBkbyBkaXRoZXJpbmcgb3Igbm9pc2Utc2hhcGluZywgaGVyZSBvciBpbiBBdWRpb0ZsaW5nZXIKLQotc3RhdGljIHZvaWQgY29weU1vbm8yNCgKLSAgICAgICAgc2hvcnQgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPj4gODsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlTdGVyZW8yNCgKLSAgICAgICAgc2hvcnQgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPj4gODsKLSAgICAgICAgKmRzdCsrID0gc3JjWzFdW2ldID4+IDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5TXVsdGlDaDI0KHNob3J0ICpkc3QsIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKQotewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBuQ2hhbm5lbHM7ICsrYykgewotICAgICAgICAgICAgKmRzdCsrID0gc3JjW2NdW2ldID4+IDg7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlUcmVzcGFzcygKLSAgICAgICAgc2hvcnQgKiAvKiBkc3QgKi8sCi0gICAgICAgIGNvbnN0IGludCAqW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10gLyogc3JjICovLAotICAgICAgICB1bnNpZ25lZCAvKiBuU2FtcGxlcyAqLywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgVFJFU1BBU1MoKTsKLX0KLQogLy8gRkxBQ1BhcnNlcgogCiBGTEFDUGFyc2VyOjpGTEFDUGFyc2VyKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKLSAgICAgICAgTWV0YURhdGFCYXNlICpmaWxlTWV0YWRhdGEsCi0gICAgICAgIE1ldGFEYXRhQmFzZSAqdHJhY2tNZXRhZGF0YSkKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqZGF0YVNvdXJjZSwKKyAgICAgICAgYm9vbCBvdXRwdXRGbG9hdCwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmaWxlTWV0YWRhdGEsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tNZXRhZGF0YSkKICAgICA6IG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAorICAgICAgbU91dHB1dEZsb2F0KG91dHB1dEZsb2F0KSwKICAgICAgIG1GaWxlTWV0YWRhdGEoZmlsZU1ldGFkYXRhKSwKICAgICAgIG1UcmFja01ldGFkYXRhKHRyYWNrTWV0YWRhdGEpLAogICAgICAgbUluaXRDaGVjayhmYWxzZSksCiAgICAgICBtTWF4QnVmZmVyU2l6ZSgwKSwKICAgICAgIG1Hcm91cChOVUxMKSwKLSAgICAgIG1Db3B5KGNvcHlUcmVzcGFzcyksCiAgICAgICBtRGVjb2RlcihOVUxMKSwKICAgICAgIG1DdXJyZW50UG9zKDBMTCksCiAgICAgICBtRU9GKGZhbHNlKSwKQEAgLTU2NSw4OCArNTIzLDU5IEBACiAgICAgICAgIGNhc2UgODoKICAgICAgICAgY2FzZSAxNjoKICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgY2FzZSAzMjogLy8gZ2VuZXJhbGx5IG5vdCBleHBlY3RlZCBmb3IgRkxBQwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBOb3RlOiBpbnRlcm5hbGx5IHRoZSBGTEFDIGV4dHJhY3RvciBzdXBwb3J0cyAyLTMyIGJpdHMuCiAgICAgICAgICAgICBBTE9HRSgidW5zdXBwb3J0ZWQgYml0cyBwZXIgc2FtcGxlICV1IiwgZ2V0Qml0c1BlclNhbXBsZSgpKTsKICAgICAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgICAgICB9CiAgICAgICAgIC8vIGNoZWNrIHNhbXBsZSByYXRlCi0gICAgICAgIHN3aXRjaCAoZ2V0U2FtcGxlUmF0ZSgpKSB7Ci0gICAgICAgIGNhc2UgIDgwMDA6Ci0gICAgICAgIGNhc2UgMTEwMjU6Ci0gICAgICAgIGNhc2UgMTIwMDA6Ci0gICAgICAgIGNhc2UgMTYwMDA6Ci0gICAgICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgIGNhc2UgMjQwMDA6Ci0gICAgICAgIGNhc2UgMzIwMDA6Ci0gICAgICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgIGNhc2UgNDgwMDA6Ci0gICAgICAgIGNhc2UgODgyMDA6Ci0gICAgICAgIGNhc2UgOTYwMDA6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgLy8gTm90ZTogZmxhYyBzdXBwb3J0cyBhcmJpdHJhcnkgc2FtcGxlIHJhdGVzIHVwIHRvIDY1NTM1MCBIeiwgYnV0IEFuZHJvaWQKKyAgICAgICAgLy8gc3VwcG9ydHMgc2FtcGxlIHJhdGVzIGZyb20gOGtIeiB0byAxOTJrSHosIHNvIHVzZSB0aGF0IGFzIHRoZSBsaW1pdC4KKyAgICAgICAgaWYgKGdldFNhbXBsZVJhdGUoKSA8IDgwMDAgfHwgZ2V0U2FtcGxlUmF0ZSgpID4gMTkyMDAwKSB7CiAgICAgICAgICAgICBBTE9HRSgidW5zdXBwb3J0ZWQgc2FtcGxlIHJhdGUgJXUiLCBnZXRTYW1wbGVSYXRlKCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgICAgIH0KLSAgICAgICAgLy8gY29uZmlndXJlIHRoZSBhcHByb3ByaWF0ZSBjb3B5IGZ1bmN0aW9uLCBkZWZhdWx0aW5nIHRvIHRyZXNwYXNzCi0gICAgICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewotICAgICAgICAgICAgdW5zaWduZWQgbUNoYW5uZWxzOwotICAgICAgICAgICAgdW5zaWduZWQgbUJpdHNQZXJTYW1wbGU7Ci0gICAgICAgICAgICB2b2lkICgqbUNvcHkpKHNob3J0ICpkc3QsIGNvbnN0IGludCAqIHNyY1trTWF4Q2hhbm5lbHNdLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKTsKLSAgICAgICAgfSB0YWJsZVtdID0gewotICAgICAgICAgICAgeyAxLCAgOCwgY29weU1vbm84ICAgIH0sCi0gICAgICAgICAgICB7IDIsICA4LCBjb3B5U3RlcmVvOCAgfSwKLSAgICAgICAgICAgIHsgOCwgIDgsIGNvcHlNdWx0aUNoOCAgfSwKLSAgICAgICAgICAgIHsgMSwgMTYsIGNvcHlNb25vMTYgICB9LAotICAgICAgICAgICAgeyAyLCAxNiwgY29weVN0ZXJlbzE2IH0sCi0gICAgICAgICAgICB7IDgsIDE2LCBjb3B5TXVsdGlDaDE2IH0sCi0gICAgICAgICAgICB7IDEsIDI0LCBjb3B5TW9ubzI0ICAgfSwKLSAgICAgICAgICAgIHsgMiwgMjQsIGNvcHlTdGVyZW8yNCB9LAotICAgICAgICAgICAgeyA4LCAyNCwgY29weU11bHRpQ2gyNCB9LAotICAgICAgICB9OwotICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgc2l6ZW9mKHRhYmxlKS9zaXplb2YodGFibGVbMF0pOyArK2kpIHsKLSAgICAgICAgICAgIGlmICh0YWJsZVtpXS5tQ2hhbm5lbHMgPj0gZ2V0Q2hhbm5lbHMoKSAmJgotICAgICAgICAgICAgICAgICAgICB0YWJsZVtpXS5tQml0c1BlclNhbXBsZSA9PSBnZXRCaXRzUGVyU2FtcGxlKCkpIHsKLSAgICAgICAgICAgICAgICBtQ29weSA9IHRhYmxlW2ldLm1Db3B5OwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9CiAgICAgICAgIC8vIHBvcHVsYXRlIHRyYWNrIG1ldGFkYXRhCiAgICAgICAgIGlmIChtVHJhY2tNZXRhZGF0YSAhPSAwKSB7Ci0gICAgICAgICAgICBtVHJhY2tNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7Ci0gICAgICAgICAgICBtVHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgZ2V0Q2hhbm5lbHMoKSk7Ci0gICAgICAgICAgICBtVHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIGdldFNhbXBsZVJhdGUoKSk7Ci0gICAgICAgICAgICBtVHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleVBjbUVuY29kaW5nLCBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0KTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobVRyYWNrTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtVHJhY2tNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBnZXRDaGFubmVscygpKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtVHJhY2tNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgZ2V0U2FtcGxlUmF0ZSgpKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtVHJhY2tNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUsIGdldEJpdHNQZXJTYW1wbGUoKSk7CiAgICAgICAgICAgICAvLyBzYW1wbGUgcmF0ZSBpcyBub24temVybywgc28gZGl2aXNpb24gYnkgemVybyBub3QgcG9zc2libGUKLSAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIChnZXRUb3RhbFNhbXBsZXMoKSAqIDEwMDAwMDBMTCkgLyBnZXRTYW1wbGVSYXRlKCkpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1UcmFja01ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAoZ2V0VG90YWxTYW1wbGVzKCkgKiAxMDAwMDAwTEwpIC8gZ2V0U2FtcGxlUmF0ZSgpKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dFKCJtaXNzaW5nIFNUUkVBTUlORk8iKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIGlmIChtRmlsZU1ldGFkYXRhICE9IDApIHsKLSAgICAgICAgbUZpbGVNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKTsKICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIEZMQUNQYXJzZXI6OmFsbG9jYXRlQnVmZmVycygpCit2b2lkIEZMQUNQYXJzZXI6OmFsbG9jYXRlQnVmZmVycyhNZWRpYUJ1ZmZlckdyb3VwSGVscGVyICpncm91cCkKIHsKICAgICBDSEVDSyhtR3JvdXAgPT0gTlVMTCk7Ci0gICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0gICAgbU1heEJ1ZmZlclNpemUgPSBnZXRNYXhCbG9ja1NpemUoKSAqIGdldENoYW5uZWxzKCkgKiBzaXplb2Yoc2hvcnQpOwotICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShtTWF4QnVmZmVyU2l6ZSkpOworICAgIG1Hcm91cCA9IGdyb3VwOworICAgIG1NYXhCdWZmZXJTaXplID0gZ2V0TWF4QmxvY2tTaXplKCkgKiBnZXRDaGFubmVscygpICogZ2V0T3V0cHV0U2FtcGxlU2l6ZSgpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtVHJhY2tNZXRhZGF0YSwgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwgbU1heEJ1ZmZlclNpemUpOworICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihtTWF4QnVmZmVyU2l6ZSk7CiB9CiAKIHZvaWQgRkxBQ1BhcnNlcjo6cmVsZWFzZUJ1ZmZlcnMoKQogewotICAgIENIRUNLKG1Hcm91cCAhPSBOVUxMKTsKLSAgICBkZWxldGUgbUdyb3VwOwotICAgIG1Hcm91cCA9IE5VTEw7CiB9CiAKLU1lZGlhQnVmZmVyQmFzZSAqRkxBQ1BhcnNlcjo6cmVhZEJ1ZmZlcihib29sIGRvU2VlaywgRkxBQ19fdWludDY0IHNhbXBsZSkKK01lZGlhQnVmZmVySGVscGVyICpGTEFDUGFyc2VyOjpyZWFkQnVmZmVyKGJvb2wgZG9TZWVrLCBGTEFDX191aW50NjQgc2FtcGxlKQogewogICAgIG1Xcml0ZVJlcXVlc3RlZCA9IHRydWU7CiAgICAgbVdyaXRlQ29tcGxldGVkID0gZmFsc2U7CkBAIC02ODMsNDEgKzYxMiw1MyBAQAogICAgIH0KICAgICAvLyBhY3F1aXJlIGEgbWVkaWEgYnVmZmVyCiAgICAgQ0hFQ0sobUdyb3VwICE9IE5VTEwpOwotICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOworICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXI7CiAgICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBzaXplX3QgYnVmZmVyU2l6ZSA9IGJsb2Nrc2l6ZSAqIGdldENoYW5uZWxzKCkgKiBzaXplb2Yoc2hvcnQpOworICAgIGNvbnN0IHNpemVfdCBidWZmZXJTaXplID0gYmxvY2tzaXplICogZ2V0Q2hhbm5lbHMoKSAqIGdldE91dHB1dFNhbXBsZVNpemUoKTsKICAgICBDSEVDSyhidWZmZXJTaXplIDw9IG1NYXhCdWZmZXJTaXplKTsKLSAgICBzaG9ydCAqZGF0YSA9IChzaG9ydCAqKSBidWZmZXItPmRhdGEoKTsKICAgICBidWZmZXItPnNldF9yYW5nZSgwLCBidWZmZXJTaXplKTsKICAgICAvLyBjb3B5IFBDTSBmcm9tIEZMQUMgd3JpdGUgYnVmZmVyIHRvIG91ciBtZWRpYSBidWZmZXIsIHdpdGggaW50ZXJsZWF2aW5nCi0gICAgKCptQ29weSkoZGF0YSwgbVdyaXRlQnVmZmVyLCBibG9ja3NpemUsIGdldENoYW5uZWxzKCkpOworICAgIGNvbnN0IHVuc2lnbmVkIGJpdHNQZXJTYW1wbGUgPSBnZXRCaXRzUGVyU2FtcGxlKCk7CisgICAgaWYgKG1PdXRwdXRGbG9hdCkgeworICAgICAgICBjb3B5VG9GbG9hdChyZWludGVycHJldF9jYXN0PGZsb2F0Kj4oYnVmZmVyLT5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICBtV3JpdGVCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgIGJsb2Nrc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgZ2V0Q2hhbm5lbHMoKSwKKyAgICAgICAgICAgICAgICAgICAgYml0c1BlclNhbXBsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29weVRvMTZTaWduZWQocmVpbnRlcnByZXRfY2FzdDxzaG9ydCo+KGJ1ZmZlci0+ZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgbVdyaXRlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBibG9ja3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGdldENoYW5uZWxzKCksCisgICAgICAgICAgICAgICAgICAgICAgIGJpdHNQZXJTYW1wbGUpOworICAgIH0KICAgICAvLyBmaWxsIGluIGJ1ZmZlciBtZXRhZGF0YQogICAgIENIRUNLKG1Xcml0ZUhlYWRlci5udW1iZXJfdHlwZSA9PSBGTEFDX19GUkFNRV9OVU1CRVJfVFlQRV9TQU1QTEVfTlVNQkVSKTsKICAgICBGTEFDX191aW50NjQgc2FtcGxlTnVtYmVyID0gbVdyaXRlSGVhZGVyLm51bWJlci5zYW1wbGVfbnVtYmVyOwogICAgIGludDY0X3QgdGltZVVzID0gKDEwMDAwMDBMTCAqIHNhbXBsZU51bWJlcikgLyBnZXRTYW1wbGVSYXRlKCk7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCB0aW1lVXMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogICAgIHJldHVybiBidWZmZXI7CiB9CiAKIC8vIEZMQUNzb3VyY2UKIAogRkxBQ1NvdXJjZTo6RkxBQ1NvdXJjZSgKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmdHJhY2tNZXRhZGF0YSkKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqZGF0YVNvdXJjZSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICp0cmFja01ldGFkYXRhLAorICAgICAgICBib29sIG91dHB1dEZsb2F0KQogICAgIDogbURhdGFTb3VyY2UoZGF0YVNvdXJjZSksCiAgICAgICBtVHJhY2tNZXRhZGF0YSh0cmFja01ldGFkYXRhKSwKLSAgICAgIG1QYXJzZXIoMCksCi0gICAgICBtSW5pdENoZWNrKGZhbHNlKSwKKyAgICAgIG1PdXRwdXRGbG9hdChvdXRwdXRGbG9hdCksCisgICAgICBtUGFyc2VyKG5ldyBGTEFDUGFyc2VyKG1EYXRhU291cmNlLCBvdXRwdXRGbG9hdCwgMCwgbVRyYWNrTWV0YWRhdGEpKSwKKyAgICAgIG1Jbml0Q2hlY2sobVBhcnNlci0+aW5pdENoZWNrKCkpLAogICAgICAgbVN0YXJ0ZWQoZmFsc2UpCiB7CiAgICAgQUxPR1YoIkZMQUNTb3VyY2U6OkZMQUNTb3VyY2UiKTsKLSAgICAvLyByZS11c2UgdGhlIHNhbWUgdHJhY2sgbWV0YWRhdGEgcGFzc2VkIGludG8gY29uc3RydWN0b3IgZnJvbSBGTEFDRXh0cmFjdG9yCi0gICAgbVBhcnNlciA9IG5ldyBGTEFDUGFyc2VyKG1EYXRhU291cmNlKTsKLSAgICBtSW5pdENoZWNrICA9IG1QYXJzZXItPmluaXRDaGVjaygpOwogfQogCiBGTEFDU291cmNlOjp+RkxBQ1NvdXJjZSgpCkBAIC03MjksMTggKzY3MCwxOCBAQAogICAgIGRlbGV0ZSBtUGFyc2VyOwogfQogCi1zdGF0dXNfdCBGTEFDU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKiAvKiBwYXJhbXMgKi8pCittZWRpYV9zdGF0dXNfdCBGTEFDU291cmNlOjpzdGFydCgpCiB7CiAgICAgQUxPR1YoIkZMQUNTb3VyY2U6OnN0YXJ0Iik7CiAKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwotICAgIG1QYXJzZXItPmFsbG9jYXRlQnVmZmVycygpOworICAgIG1QYXJzZXItPmFsbG9jYXRlQnVmZmVycyhtQnVmZmVyR3JvdXApOwogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBGTEFDU291cmNlOjpzdG9wKCkKK21lZGlhX3N0YXR1c190IEZMQUNTb3VyY2U6OnN0b3AoKQogewogICAgIEFMT0dWKCJGTEFDU291cmNlOjpzdG9wIik7CiAKQEAgLTc0OCwxOSArNjg5LDIzIEBACiAgICAgbVBhcnNlci0+cmVsZWFzZUJ1ZmZlcnMoKTsKICAgICBtU3RhcnRlZCA9IGZhbHNlOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IEZMQUNTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpCittZWRpYV9zdGF0dXNfdCBGTEFDU291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKQogewotICAgIG1ldGEgPSBtVHJhY2tNZXRhZGF0YTsKLSAgICByZXR1cm4gT0s7CisgICAgY29uc3QgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbVRyYWNrTWV0YWRhdGEpOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HLAorICAgICAgICAgICAgICAgIG1PdXRwdXRGbG9hdCA/IGtBdWRpb0VuY29kaW5nUGNtRmxvYXQgOiBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0KTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgRkxBQ1NvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0QnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykKK21lZGlhX3N0YXR1c190IEZMQUNTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0QnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykKIHsKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyOwogICAgIC8vIHByb2Nlc3MgYW4gb3B0aW9uYWwgc2VlayByZXF1ZXN0CiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwogICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwpAQCAtNzgxLDIwICs3MjYsMjIgQEAKICAgICAgICAgYnVmZmVyID0gbVBhcnNlci0+cmVhZEJ1ZmZlcigpOwogICAgIH0KICAgICAqb3V0QnVmZmVyID0gYnVmZmVyOwotICAgIHJldHVybiBidWZmZXIgIT0gTlVMTCA/IChzdGF0dXNfdCkgT0sgOiAoc3RhdHVzX3QpIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgcmV0dXJuIGJ1ZmZlciAhPSBOVUxMID8gQU1FRElBX09LIDogQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiB9CiAKIC8vIEZMQUNFeHRyYWN0b3IKIAogRkxBQ0V4dHJhY3Rvcjo6RkxBQ0V4dHJhY3RvcigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UpCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKmRhdGFTb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKICAgICAgIG1QYXJzZXIobnVsbHB0ciksCiAgICAgICBtSW5pdENoZWNrKGZhbHNlKQogewogICAgIEFMT0dWKCJGTEFDRXh0cmFjdG9yOjpGTEFDRXh0cmFjdG9yIik7CiAgICAgLy8gRkxBQ1BhcnNlciB3aWxsIGZpbGwgaW4gdGhlIG1ldGFkYXRhIGZvciB1cwotICAgIG1QYXJzZXIgPSBuZXcgRkxBQ1BhcnNlcihtRGF0YVNvdXJjZSwgJm1GaWxlTWV0YWRhdGEsICZtVHJhY2tNZXRhZGF0YSk7CisgICAgbUZpbGVNZXRhZGF0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBtVHJhY2tNZXRhZGF0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBtUGFyc2VyID0gbmV3IEZMQUNQYXJzZXIobURhdGFTb3VyY2UsIGZhbHNlIC8qIG91dHB1dEZsb2F0ICovLCBtRmlsZU1ldGFkYXRhLCBtVHJhY2tNZXRhZGF0YSk7CiAgICAgbUluaXRDaGVjayA9IG1QYXJzZXItPmluaXRDaGVjaygpOwogfQogCkBAIC04MDIsNiArNzQ5LDkgQEAKIHsKICAgICBBTE9HVigifkZMQUNFeHRyYWN0b3I6OkZMQUNFeHRyYWN0b3IiKTsKICAgICBkZWxldGUgbVBhcnNlcjsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtRmlsZU1ldGFkYXRhKTsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1UcmFja01ldGFkYXRhKTsKIH0KIAogc2l6ZV90IEZMQUNFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkKQEAgLTgwOSw0MiArNzU5LDc2IEBACiAgICAgcmV0dXJuIG1Jbml0Q2hlY2sgPT0gT0sgPyAxIDogMDsKIH0KIAotTWVkaWFUcmFjayAqRkxBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KQorTWVkaWFUcmFja0hlbHBlciAqRkxBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KQogewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ID4gMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgcmV0dXJuIG5ldyBGTEFDU291cmNlKG1EYXRhU291cmNlLCBtVHJhY2tNZXRhZGF0YSk7CisKKyAgICByZXR1cm4gbmV3IEZMQUNTb3VyY2UoCisgICAgICAgICAgICBtRGF0YVNvdXJjZSwgbVRyYWNrTWV0YWRhdGEsIHNob3VsZEV4dHJhY3Rvck91dHB1dEZsb2F0KG1QYXJzZXItPmdldEJpdHNQZXJTYW1wbGUoKSkpOwogfQogCi1zdGF0dXNfdCBGTEFDRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCittZWRpYV9zdGF0dXNfdCBGTEFDRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCA+IDApIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9Ci0gICAgbWV0YSA9IG1UcmFja01ldGFkYXRhOwotICAgIHJldHVybiBPSzsKKyAgICBjb25zdCBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtVHJhY2tNZXRhZGF0YSk7CisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9QQ01fRU5DT0RJTkcsCisgICAgICAgICAgICAgICAgc2hvdWxkRXh0cmFjdG9yT3V0cHV0RmxvYXQobVBhcnNlci0+Z2V0Qml0c1BlclNhbXBsZSgpKQorICAgICAgICAgICAgICAgICAgICAgICAgPyBrQXVkaW9FbmNvZGluZ1BjbUZsb2F0IDoga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IEZMQUNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkKK21lZGlhX3N0YXR1c190IEZMQUNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkKIHsKLSAgICBtZXRhID0gbUZpbGVNZXRhZGF0YTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1GaWxlTWV0YWRhdGEpOwogfQogCiAvLyBTbmlmZmVyCiAKLWJvb2wgU25pZmZGTEFDKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKQorYm9vbCBTbmlmZkZMQUMoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkKIHsKLSAgICAvLyBmaXJzdCA0IGlzIHRoZSBzaWduYXR1cmUgd29yZAotICAgIC8vIHNlY29uZCA0IGlzIHRoZSBzaXplb2YgU1RSRUFNSU5GTwotICAgIC8vIDA0MiBpcyB0aGUgbWFuZGF0b3J5IFNUUkVBTUlORk8KLSAgICAvLyBubyBuZWVkIHRvIHJlYWQgcmVzdCBvZiB0aGUgaGVhZGVyLCBhcyBhIHByZW1hdHVyZSBFT0Ygd2lsbCBiZSBjYXVnaHQgbGF0ZXIKLSAgICB1aW50OF90IGhlYWRlcls0KzRdOwotICAgIGlmIChzb3VyY2UtPnJlYWRBdCgwLCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKSAhPSBzaXplb2YoaGVhZGVyKQotICAgICAgICAgICAgfHwgbWVtY21wKCJmTGFDXDBcMFwwXDA0MiIsIGhlYWRlciwgNCs0KSkKLSAgICB7CisgICAgLy8gU2tpcCBJRDMgdGFncworICAgIG9mZjY0X3QgcG9zID0gMDsKKyAgICB1aW50OF90IGhlYWRlclsxMF07CisgICAgZm9yICg7OykgeworICAgICAgICBpZiAoc291cmNlLT5yZWFkQXQocG9zLCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKSAhPSBzaXplb2YoaGVhZGVyKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAvLyBubyBtb3JlIGZpbGUgdG8gcmVhZC4KKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoZWNrIGZvciBJRDMgdGFnCisgICAgICAgIGlmIChtZW1jbXAoIklEMyIsIGhlYWRlciwgMykgIT0gMCkgeworICAgICAgICAgICAgYnJlYWs7IC8vIG5vdCBhbiBJRDMgdGFnLgorICAgICAgICB9CisKKyAgICAgICAgLy8gc2tpcCB0aGUgSUQzdjIgZGF0YSBhbmQgY2hlY2sgYWdhaW4KKyAgICAgICAgY29uc3QgdW5zaWduZWQgaWQzTGVuID0gMTAgKworICAgICAgICAgICAgICAgICgoKGhlYWRlcls2XSAmIDB4N2YpIDw8IDIxKQorICAgICAgICAgICAgICAgICB8ICgoaGVhZGVyWzddICYgMHg3ZikgPDwgMTQpCisgICAgICAgICAgICAgICAgIHwgKChoZWFkZXJbOF0gJiAweDdmKSA8PCA3KQorICAgICAgICAgICAgICAgICB8IChoZWFkZXJbOV0gJiAweDdmKSk7CisgICAgICAgIHBvcyArPSBpZDNMZW47CisKKyAgICAgICAgQUxPR1YoInNraXBwZWQgSUQzIHRhZyBvZiBsZW4gJXUgbmV3IHN0YXJ0aW5nIG9mZnNldCBpcyAlIzAxNmxseCIsCisgICAgICAgICAgICAgICAgaWQzTGVuLCAobG9uZyBsb25nKXBvcyk7CisgICAgfQorCisgICAgLy8gQ2hlY2sgRkxBQyBoZWFkZXIuCisgICAgLy8gaHR0cHM6Ly94aXBoLm9yZy9mbGFjL2Zvcm1hdC5odG1sI3N0cmVhbQorICAgIC8vCisgICAgLy8gTm90ZTogY29udGVudCBzdG9yZWQgYmlnIGVuZGlhbi4KKyAgICAvLyBieXRlIG9mZnNldCAgYml0IHNpemUgIGNvbnRlbnQKKyAgICAvLyAwICAgICAgICAgICAgMzIgICAgICAgIGZMYUMKKyAgICAvLyA0ICAgICAgICAgICAgOCAgICAgICAgIG1ldGFkYXRhIHR5cGUgU1RSRUFNSU5GTyAoMCkgKG5vdGU6IE9SIHdpdGggMHg4MCBpZiBsYXN0IG1ldGFkYXRhKQorICAgIC8vIDUgICAgICAgICAgICAyNCAgICAgICAgc2l6ZSBvZiBtZXRhZGF0YSwgZm9yIFNUUkVBTUlORk8gKDB4MjIpLgorCisgICAgaWYgKG1lbWNtcCgiZkxhQ1x4MDBceDAwXHgwMFx4MjIiLCBoZWFkZXIsIDgpICE9IDAgJiYKKyAgICAgICAgbWVtY21wKCJmTGFDXHg4MFx4MDBceDAwXHgyMiIsIGhlYWRlciwgOCkgIT0gMCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC04NTMsMjkgKzgzNyw0MCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCitzdGF0aWMgY29uc3QgY2hhciAqZXh0ZW5zaW9uc1tdID0geworICAgICJmbGFjIiwKKyAgICAiZmwiLAorICAgIE5VTEwKK307CiAKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICAgICAgVVVJRCgiMTM2NGIwNDgtY2M0NS00ZmRhLTk5MzQtMzI3ZDBlYmY5ODI5IiksCiAgICAgICAgICAgICAxLAogICAgICAgICAgICAgIkZMQUMgRXh0cmFjdG9yIiwKLSAgICAgICAgICAgIFtdKAotICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAqKiwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSAtPiBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgewotICAgICAgICAgICAgICAgIGlmIChTbmlmZkZMQUMoc291cmNlLCBjb25maWRlbmNlKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IE1lZGlhRXh0cmFjdG9yKiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZMQUNFeHRyYWN0b3Ioc291cmNlKTt9OworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC52MyA9IHsKKyAgICAgICAgICAgICAgICAgICAgW10oCisgICAgICAgICAgICAgICAgICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqLAorICAgICAgICAgICAgICAgICAgICAgICAgRnJlZU1ldGFGdW5jICopIC0+IENyZWF0b3JGdW5jIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKHNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoU25pZmZGTEFDKCZoZWxwZXIsIGNvbmZpZGVuY2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gQ01lZGlhRXh0cmFjdG9yKiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwKG5ldyBGTEFDRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKHNvdXJjZSkpKTt9OworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICB9LAogICAgICB9OwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0ZMQUNFeHRyYWN0b3IuaAppbmRleCA3ZmI2ZWM2Li41YTczZDIwIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmgKQEAgLTE4LDQ1ICsxOCw0NCBAQAogI2RlZmluZSBGTEFDX0VYVFJBQ1RPUl9IXwogCiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBGTEFDUGFyc2VyOwogCi1jbGFzcyBGTEFDRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK2NsYXNzIEZMQUNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgewogCiBwdWJsaWM6Ci0gICAgZXhwbGljaXQgRkxBQ0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKyAgICBleHBsaWNpdCBGTEFDRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiRkxBQ0V4dHJhY3RvciI7IH0KIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkZMQUNFeHRyYWN0b3IoKTsKIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAgICAgRkxBQ1BhcnNlciAqbVBhcnNlcjsKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwotICAgIE1ldGFEYXRhQmFzZSBtRmlsZU1ldGFkYXRhOworICAgIEFNZWRpYUZvcm1hdCAqbUZpbGVNZXRhZGF0YTsKIAogICAgIC8vIFRoZXJlIGlzIG9ubHkgb25lIHRyYWNrCi0gICAgTWV0YURhdGFCYXNlIG1UcmFja01ldGFkYXRhOworICAgIEFNZWRpYUZvcm1hdCAqbVRyYWNrTWV0YWRhdGE7CiAKICAgICBGTEFDRXh0cmFjdG9yKGNvbnN0IEZMQUNFeHRyYWN0b3IgJik7CiAgICAgRkxBQ0V4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IEZMQUNFeHRyYWN0b3IgJik7CiAKIH07CiAKLWJvb2wgU25pZmZGTEFDKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKTsKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBGTEFDX0VYVFJBQ1RPUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9taWRpL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21pZGkvQW5kcm9pZC5icAppbmRleCBmZGUwOWRmMTguLjdkNDJlNzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9BbmRyb2lkLmJwCkBAIC04LDcgKzgsNyBAQAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCkBAIC0zNCw5ICszNCw2IEBACiAgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKIAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01pZGlFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01pZGlFeHRyYWN0b3IuY3BwCmluZGV4IGEzMGI2ZjguLjlmNGY5ZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21pZGkvTWlkaUV4dHJhY3Rvci5jcHAKQEAgLTI0LDM1ICsyNCwzNCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bGlic29uaXZveC9lYXNfcmV2ZXJiLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotLy8gaG93IG1hbnkgU29uaXZveCBvdXRwdXQgYnVmZmVycyB0byBhZ2dyZWdhdGUgaW50byBvbmUgTWVkaWFCdWZmZXJCYXNlCisvLyBob3cgbWFueSBTb25pdm94IG91dHB1dCBidWZmZXJzIHRvIGFnZ3JlZ2F0ZSBpbnRvIG9uZSBNZWRpYUJ1ZmZlcgogc3RhdGljIGNvbnN0IGludCBOVU1fQ09NQklORV9CVUZGRVJTID0gNDsKIAotY2xhc3MgTWlkaVNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKK2NsYXNzIE1pZGlTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiAKIHB1YmxpYzoKICAgICBNaWRpU291cmNlKAogICAgICAgICAgICAgTWlkaUVuZ2luZSAmZW5naW5lLAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICZ0cmFja01ldGFkYXRhKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tNZXRhZGF0YSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UmKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICopOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TWlkaVNvdXJjZSgpOwogCiBwcml2YXRlOgogICAgIE1pZGlFbmdpbmUgJm1FbmdpbmU7Ci0gICAgTWV0YURhdGFCYXNlICZtVHJhY2tNZXRhZGF0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1UcmFja01ldGFkYXRhOwogICAgIGJvb2wgbUluaXRDaGVjazsKICAgICBib29sIG1TdGFydGVkOwogCkBAIC02OSw3ICs2OCw3IEBACiAKIE1pZGlTb3VyY2U6Ok1pZGlTb3VyY2UoCiAgICAgICAgIE1pZGlFbmdpbmUgJmVuZ2luZSwKLSAgICAgICAgTWV0YURhdGFCYXNlICZ0cmFja01ldGFkYXRhKQorICAgICAgICBBTWVkaWFGb3JtYXQgKnRyYWNrTWV0YWRhdGEpCiAgICAgOiBtRW5naW5lKGVuZ2luZSksCiAgICAgICBtVHJhY2tNZXRhZGF0YSh0cmFja01ldGFkYXRhKSwKICAgICAgIG1Jbml0Q2hlY2soZmFsc2UpLApAQCAtODcsMTcgKzg2LDE3IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBNaWRpU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKiAvKiBwYXJhbXMgKi8pCittZWRpYV9zdGF0dXNfdCBNaWRpU291cmNlOjpzdGFydCgpCiB7CiAgICAgQUxPR1YoIk1pZGlTb3VyY2U6OnN0YXJ0Iik7CiAKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogICAgIG1TdGFydGVkID0gdHJ1ZTsKLSAgICBtRW5naW5lLmFsbG9jYXRlQnVmZmVycygpOwotICAgIHJldHVybiBPSzsKKyAgICBtRW5naW5lLmFsbG9jYXRlQnVmZmVycyhtQnVmZmVyR3JvdXApOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1pZGlTb3VyY2U6OnN0b3AoKQorbWVkaWFfc3RhdHVzX3QgTWlkaVNvdXJjZTo6c3RvcCgpCiB7CiAgICAgQUxPR1YoIk1pZGlTb3VyY2U6OnN0b3AiKTsKIApAQCAtMTA1LDIwICsxMDQsMTkgQEAKICAgICBtU3RhcnRlZCA9IGZhbHNlOwogICAgIG1FbmdpbmUucmVsZWFzZUJ1ZmZlcnMoKTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNaWRpU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKQorbWVkaWFfc3RhdHVzX3QgTWlkaVNvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkKIHsKLSAgICBtZXRhID0gbVRyYWNrTWV0YWRhdGE7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtVHJhY2tNZXRhZGF0YSk7CiB9CiAKLXN0YXR1c190IE1pZGlTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dEJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpCittZWRpYV9zdGF0dXNfdCBNaWRpU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKm91dEJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpCiB7CiAgICAgQUxPR1YoIk1pZGlTb3VyY2U6OnJlYWQiKTsKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyOwogICAgIC8vIHByb2Nlc3MgYW4gb3B0aW9uYWwgc2VlayByZXF1ZXN0CiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwogICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwpAQCAtMTMxLDcgKzEyOSw3IEBACiAgICAgYnVmZmVyID0gbUVuZ2luZS5yZWFkQnVmZmVyKCk7CiAgICAgKm91dEJ1ZmZlciA9IGJ1ZmZlcjsKICAgICBBTE9HVigiTWlkaVNvdXJjZTo6cmVhZCAlcCBkb25lIiwgdGhpcyk7Ci0gICAgcmV0dXJuIGJ1ZmZlciAhPSBOVUxMID8gKHN0YXR1c190KSBPSyA6IChzdGF0dXNfdCkgRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICByZXR1cm4gYnVmZmVyICE9IE5VTEwgPyBBTUVESUFfT0sgOiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKIH0KIAogc3RhdHVzX3QgTWlkaVNvdXJjZTo6aW5pdCgpCkBAIC0xNDIsMTAgKzE0MCw5IEBACiAKIC8vIE1pZGlFbmdpbmUKIAotTWlkaUVuZ2luZTo6TWlkaUVuZ2luZShEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKLSAgICAgICAgTWV0YURhdGFCYXNlICpmaWxlTWV0YWRhdGEsCi0gICAgICAgIE1ldGFEYXRhQmFzZSAqdHJhY2tNZXRhZGF0YSkgOgotICAgICAgICAgICAgbUdyb3VwKE5VTEwpLAorTWlkaUVuZ2luZTo6TWlkaUVuZ2luZShDRGF0YVNvdXJjZSAqZGF0YVNvdXJjZSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmaWxlTWV0YWRhdGEsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tNZXRhZGF0YSkgOgogICAgICAgICAgICAgbUVhc0RhdGEoTlVMTCksCiAgICAgICAgICAgICBtRWFzSGFuZGxlKE5VTEwpLAogICAgICAgICAgICAgbUVhc0NvbmZpZyhOVUxMKSwKQEAgLTE3MCwxNiArMTY3LDIwIEBACiAgICAgfQogCiAgICAgaWYgKGZpbGVNZXRhZGF0YSAhPSBOVUxMKSB7Ci0gICAgICAgIGZpbGVNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01JREkpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKGZpbGVNZXRhZGF0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NSURJKTsKICAgICB9CiAKICAgICBpZiAodHJhY2tNZXRhZGF0YSAhPSBOVUxMKSB7Ci0gICAgICAgIHRyYWNrTWV0YWRhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOwotICAgICAgICB0cmFja01ldGFkYXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIDEwMDBsbCAqIHRlbXApOyAvLyBtaWxsaS0+bWljcm8KKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyh0cmFja01ldGFkYXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICB0cmFja01ldGFkYXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAxMDAwbGwgKiB0ZW1wKTsgLy8gbWlsbGktPm1pY3JvCiAgICAgICAgIG1FYXNDb25maWcgPSBFQVNfQ29uZmlnKCk7Ci0gICAgICAgIHRyYWNrTWV0YWRhdGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtRWFzQ29uZmlnLT5zYW1wbGVSYXRlKTsKLSAgICAgICAgdHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbUVhc0NvbmZpZy0+bnVtQ2hhbm5lbHMpOwotICAgICAgICB0cmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5UGNtRW5jb2RpbmcsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoCisgICAgICAgICAgICAgICAgdHJhY2tNZXRhZGF0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgbUVhc0NvbmZpZy0+c2FtcGxlUmF0ZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMigKKyAgICAgICAgICAgICAgICB0cmFja01ldGFkYXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIG1FYXNDb25maWctPm51bUNoYW5uZWxzKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKAorICAgICAgICAgICAgICAgIHRyYWNrTWV0YWRhdGEsIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HLCBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0KTsKICAgICB9CiAgICAgbUlzSW5pdGlhbGl6ZWQgPSB0cnVlOwogfQpAQCAtMTkxLDcgKzE5Miw2IEBACiAgICAgaWYgKG1FYXNEYXRhKSB7CiAgICAgICAgIEVBU19TaHV0ZG93bihtRWFzRGF0YSk7CiAgICAgfQotICAgIGRlbGV0ZSBtR3JvdXA7CiAgICAgZGVsZXRlIG1Jb1dyYXBwZXI7CiB9CiAKQEAgLTE5OSwyMiArMTk5LDIwIEBACiAgICAgcmV0dXJuIG1Jc0luaXRpYWxpemVkID8gT0sgOiBVTktOT1dOX0VSUk9SOwogfQogCi1zdGF0dXNfdCBNaWRpRW5naW5lOjphbGxvY2F0ZUJ1ZmZlcnMoKSB7CitzdGF0dXNfdCBNaWRpRW5naW5lOjphbGxvY2F0ZUJ1ZmZlcnMoTWVkaWFCdWZmZXJHcm91cEhlbHBlciAqZ3JvdXApIHsKICAgICAvLyBzZWxlY3QgcmV2ZXJiIHByZXNldCBhbmQgZW5hYmxlCiAgICAgRUFTX1NldFBhcmFtZXRlcihtRWFzRGF0YSwgRUFTX01PRFVMRV9SRVZFUkIsIEVBU19QQVJBTV9SRVZFUkJfUFJFU0VULCBFQVNfUEFSQU1fUkVWRVJCX0NIQU1CRVIpOwogICAgIEVBU19TZXRQYXJhbWV0ZXIobUVhc0RhdGEsIEVBU19NT0RVTEVfUkVWRVJCLCBFQVNfUEFSQU1fUkVWRVJCX0JZUEFTUywgRUFTX0ZBTFNFKTsKIAotICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOwogICAgIGludCBidWZzaXplID0gc2l6ZW9mKEVBU19QQ00pCiAgICAgICAgICAgICAqIG1FYXNDb25maWctPm1peEJ1ZmZlclNpemUgKiBtRWFzQ29uZmlnLT5udW1DaGFubmVscyAqIE5VTV9DT01CSU5FX0JVRkZFUlM7CiAgICAgQUxPR1YoInVzaW5nICVkIGJ5dGUgYnVmZmVyIiwgYnVmc2l6ZSk7Ci0gICAgbUdyb3VwLT5hZGRfYnVmZmVyKE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKGJ1ZnNpemUpKTsKKyAgICBtR3JvdXAgPSBncm91cDsKKyAgICBtR3JvdXAtPmFkZF9idWZmZXIoYnVmc2l6ZSk7CiAgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBNaWRpRW5naW5lOjpyZWxlYXNlQnVmZmVycygpIHsKLSAgICBkZWxldGUgbUdyb3VwOwotICAgIG1Hcm91cCA9IE5VTEw7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0yMjQsMTMgKzIyMiwxMyBAQAogICAgIHJldHVybiByZXN1bHQgPT0gRUFTX1NVQ0NFU1MgPyBPSyA6IFVOS05PV05fRVJST1I7CiB9CiAKLU1lZGlhQnVmZmVyQmFzZSogTWlkaUVuZ2luZTo6cmVhZEJ1ZmZlcigpIHsKK01lZGlhQnVmZmVySGVscGVyKiBNaWRpRW5naW5lOjpyZWFkQnVmZmVyKCkgewogICAgIEVBU19TVEFURSBzdGF0ZTsKICAgICBFQVNfU3RhdGUobUVhc0RhdGEsIG1FYXNIYW5kbGUsICZzdGF0ZSk7CiAgICAgaWYgKChzdGF0ZSA9PSBFQVNfU1RBVEVfU1RPUFBFRCkgfHwgKHN0YXRlID09IEVBU19TVEFURV9FUlJPUikpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOworICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXI7CiAgICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCJyZWFkQnVmZmVyOiBubyBidWZmZXIiKTsKQEAgLTIzOSw3ICsyMzcsOSBAQAogICAgIEVBU19JMzIgdGltZU1zOwogICAgIEVBU19HZXRMb2NhdGlvbihtRWFzRGF0YSwgbUVhc0hhbmRsZSwgJnRpbWVNcyk7CiAgICAgaW50NjRfdCB0aW1lVXMgPSAxMDAwbGwgKiB0aW1lTXM7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIHRpbWVVcyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAKICAgICBFQVNfUENNKiBwID0gKEVBU19QQ00qKSBidWZmZXItPmRhdGEoKTsKICAgICBpbnQgbnVtQnl0ZXNPdXRwdXQgPSAwOwpAQCAtMjYzLDE4ICsyNjMsMjMgQEAKIC8vIE1pZGlFeHRyYWN0b3IKIAogTWlkaUV4dHJhY3Rvcjo6TWlkaUV4dHJhY3RvcigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UpCisgICAgICAgIENEYXRhU291cmNlICpkYXRhU291cmNlKQogICAgIDogbURhdGFTb3VyY2UoZGF0YVNvdXJjZSksCiAgICAgICBtSW5pdENoZWNrKGZhbHNlKQogewogICAgIEFMT0dWKCJNaWRpRXh0cmFjdG9yIGN0b3IiKTsKLSAgICBtRW5naW5lID0gbmV3IE1pZGlFbmdpbmUobURhdGFTb3VyY2UsICZtRmlsZU1ldGFkYXRhLCAmbVRyYWNrTWV0YWRhdGEpOworICAgIG1GaWxlTWV0YWRhdGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgbVRyYWNrTWV0YWRhdGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgbUVuZ2luZSA9IG5ldyBNaWRpRW5naW5lKG1EYXRhU291cmNlLCBtRmlsZU1ldGFkYXRhLCBtVHJhY2tNZXRhZGF0YSk7CiAgICAgbUluaXRDaGVjayA9IG1FbmdpbmUtPmluaXRDaGVjaygpOwogfQogCiBNaWRpRXh0cmFjdG9yOjp+TWlkaUV4dHJhY3RvcigpCiB7CiAgICAgQUxPR1YoIk1pZGlFeHRyYWN0b3IgZHRvciIpOworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobUZpbGVNZXRhZGF0YSk7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtVHJhY2tNZXRhZGF0YSk7CisgICAgZGVsZXRlIG1FbmdpbmU7CiB9CiAKIHNpemVfdCBNaWRpRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpCkBAIC0yODIsNyArMjg3LDcgQEAKICAgICByZXR1cm4gbUluaXRDaGVjayA9PSBPSyA/IDEgOiAwOwogfQogCi1NZWRpYVRyYWNrICpNaWRpRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpCitNZWRpYVRyYWNrSGVscGVyICpNaWRpRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpCiB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggPiAwKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMjkwLDI3ICsyOTUsMjUgQEAKICAgICByZXR1cm4gbmV3IE1pZGlTb3VyY2UoKm1FbmdpbmUsIG1UcmFja01ldGFkYXRhKTsKIH0KIAotc3RhdHVzX3QgTWlkaUV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorbWVkaWFfc3RhdHVzX3QgTWlkaUV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgQUxPR1YoIk1pZGlFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEiKTsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCA+IDApIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9Ci0gICAgbWV0YSA9IG1UcmFja01ldGFkYXRhOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbVRyYWNrTWV0YWRhdGEpOwogfQogCi1zdGF0dXNfdCBNaWRpRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpCittZWRpYV9zdGF0dXNfdCBNaWRpRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpCiB7CiAgICAgQUxPR1YoIk1pZGlFeHRyYWN0b3I6OmdldE1ldGFEYXRhIik7Ci0gICAgbWV0YSA9IG1GaWxlTWV0YWRhdGE7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtRmlsZU1ldGFkYXRhKTsKIH0KIAogLy8gU25pZmZlcgogCi1ib29sIFNuaWZmTWlkaShEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkKK2Jvb2wgU25pZmZNaWRpKENEYXRhU291cmNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKQogewogICAgIE1pZGlFbmdpbmUgcChzb3VyY2UsIE5VTEwsIE5VTEwpOwogICAgIGlmIChwLmluaXRDaGVjaygpID09IE9LKSB7CkBAIC0zMjMsMjggKzMyNiw0NiBAQAogCiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICpleHRlbnNpb25zW10gPSB7CisgICAgImlteSIsCisgICAgIm1pZCIsCisgICAgIm1pZGkiLAorICAgICJteG1mIiwKKyAgICAib3RhIiwKKyAgICAicnR0dGwiLAorICAgICJydHgiLAorICAgICJzbWYiLAorICAgICJ4bWYiLAorICAgIE5VTEwKK307CisKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT04sCiAgICAgICAgIFVVSUQoImVmNmNjYTBhLWY4YTItNDNlNi1iYTVmLWRmY2Q3YzlhN2VmMiIpLAogICAgICAgICAxLAogICAgICAgICAiTUlESSBFeHRyYWN0b3IiLAotICAgICAgICBbXSgKLSAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICB7CisgICAgICAgICAgICAudjMgPSB7CisgICAgICAgICAgICAgICAgW10oCisgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKICAgICAgICAgICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKICAgICAgICAgICAgICAgICB2b2lkICoqLAotICAgICAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKikgLT4gTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIHsKLSAgICAgICAgICAgIGlmIChTbmlmZk1pZGkoc291cmNlLCBjb25maWRlbmNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBbXSgKLSAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IE1lZGlhRXh0cmFjdG9yKiB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWlkaUV4dHJhY3Rvcihzb3VyY2UpO307CisgICAgICAgICAgICAgICAgRnJlZU1ldGFGdW5jICopIC0+IENyZWF0b3JGdW5jIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFNuaWZmTWlkaShzb3VyY2UsIGNvbmZpZGVuY2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gQ01lZGlhRXh0cmFjdG9yKiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAobmV3IE1pZGlFeHRyYWN0b3Ioc291cmNlKSk7fTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9CisgICAgICAgIH0sCiAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01pZGlFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmgKaW5kZXggMjQ0ZGQwZi4uMmU3ODA4NiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01pZGlFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21pZGkvTWlkaUV4dHJhY3Rvci5oCkBAIC0xOCwxMSArMTgsMTIgQEAKICNkZWZpbmUgTUlESV9FWFRSQUNUT1JfSF8KIAogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL01pZGlJb1dyYXBwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDxsaWJzb25pdm94L2Vhcy5oPgogCkBAIC0zMCw0OCArMzEsNDggQEAKIAogY2xhc3MgTWlkaUVuZ2luZSB7CiBwdWJsaWM6Ci0gICAgZXhwbGljaXQgTWlkaUVuZ2luZShEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAqZmlsZU1ldGFkYXRhLAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICp0cmFja01ldGFkYXRhKTsKKyAgICBleHBsaWNpdCBNaWRpRW5naW5lKENEYXRhU291cmNlICpkYXRhU291cmNlLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICpmaWxlTWV0YWRhdGEsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKnRyYWNrTWV0YWRhdGEpOwogICAgIH5NaWRpRW5naW5lKCk7CiAKICAgICBzdGF0dXNfdCBpbml0Q2hlY2soKTsKIAotICAgIHN0YXR1c190IGFsbG9jYXRlQnVmZmVycygpOworICAgIHN0YXR1c190IGFsbG9jYXRlQnVmZmVycyhNZWRpYUJ1ZmZlckdyb3VwSGVscGVyICpncm91cCk7CiAgICAgc3RhdHVzX3QgcmVsZWFzZUJ1ZmZlcnMoKTsKICAgICBzdGF0dXNfdCBzZWVrVG8oaW50NjRfdCBwb3NpdGlvblVzKTsKLSAgICBNZWRpYUJ1ZmZlckJhc2UqIHJlYWRCdWZmZXIoKTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciogcmVhZEJ1ZmZlcigpOwogcHJpdmF0ZToKICAgICBNaWRpSW9XcmFwcGVyICptSW9XcmFwcGVyOwotICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1Hcm91cDsKKyAgICBNZWRpYUJ1ZmZlckdyb3VwSGVscGVyICptR3JvdXA7CiAgICAgRUFTX0RBVEFfSEFORExFIG1FYXNEYXRhOwogICAgIEVBU19IQU5ETEUgbUVhc0hhbmRsZTsKICAgICBjb25zdCBTX0VBU19MSUJfQ09ORklHKiBtRWFzQ29uZmlnOwogICAgIGJvb2wgbUlzSW5pdGlhbGl6ZWQ7CiB9OwogCi1jbGFzcyBNaWRpRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK2NsYXNzIE1pZGlFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgewogCiBwdWJsaWM6Ci0gICAgZXhwbGljaXQgTWlkaUV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKyAgICBleHBsaWNpdCBNaWRpRXh0cmFjdG9yKENEYXRhU291cmNlICpzb3VyY2UpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk1pZGlFeHRyYWN0b3IiOyB9CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NaWRpRXh0cmFjdG9yKCk7CiAKIHByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIENEYXRhU291cmNlICptRGF0YVNvdXJjZTsKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwotICAgIE1ldGFEYXRhQmFzZSBtRmlsZU1ldGFkYXRhOworICAgIEFNZWRpYUZvcm1hdCAqbUZpbGVNZXRhZGF0YTsKIAogICAgIC8vIFRoZXJlIGlzIG9ubHkgb25lIHRyYWNrCi0gICAgTWV0YURhdGFCYXNlIG1UcmFja01ldGFkYXRhOworICAgIEFNZWRpYUZvcm1hdCAqbVRyYWNrTWV0YWRhdGE7CiAKICAgICBNaWRpRW5naW5lICptRW5naW5lOwogCkBAIC04OCw3ICs4OSw3IEBACiAKIH07CiAKLWJvb2wgU25pZmZNaWRpKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKTsKK2Jvb2wgU25pZmZNaWRpKENEYXRhU291cmNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L0FuZHJvaWQuYnAKaW5kZXggNjgxZmQzNS4uMTc0NGQzZCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9BbmRyb2lkLmJwCkBAIC0xMSw3ICsxMSw3IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKQEAgLTQwLDkgKzQwLDYgQEAKICAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAogCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKaW5kZXggZDY1NzU4Mi4uMjMwMjJlNCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmNwcApAQCAtMjAsMjEgKzIwLDIwIEBACiAKICNpbmNsdWRlICJGTEFDRGVjb2Rlci5oIgogI2luY2x1ZGUgIk1hdHJvc2thRXh0cmFjdG9yLmgiCisjaW5jbHVkZSAiY29tbW9uL3dlYm1pZHMuaCIKIAogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvRXh0cmFjdG9yVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgpAQCAtNDQsNyArNDMsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgRGF0YVNvdXJjZUJhc2VSZWFkZXIgOiBwdWJsaWMgbWt2cGFyc2VyOjpJTWt2UmVhZGVyIHsKLSAgICBleHBsaWNpdCBEYXRhU291cmNlQmFzZVJlYWRlcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorICAgIGV4cGxpY2l0IERhdGFTb3VyY2VCYXNlUmVhZGVyKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKICAgICAgICAgOiBtU291cmNlKHNvdXJjZSkgewogICAgIH0KIApAQCAtNjgsOCArNjcsMTIgQEAKICAgICB2aXJ0dWFsIGludCBMZW5ndGgobG9uZyBsb25nKiB0b3RhbCwgbG9uZyBsb25nKiBhdmFpbGFibGUpIHsKICAgICAgICAgb2ZmNjRfdCBzaXplOwogICAgICAgICBpZiAobVNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSkgIT0gT0spIHsKLSAgICAgICAgICAgICp0b3RhbCA9IC0xOwotICAgICAgICAgICAgKmF2YWlsYWJsZSA9IChsb25nIGxvbmcpKCgxdWxsIDw8IDYzKSAtIDEpOworICAgICAgICAgICAgaWYgKHRvdGFsKSB7CisgICAgICAgICAgICAgICAgKnRvdGFsID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXZhaWxhYmxlKSB7CisgICAgICAgICAgICAgICAgKmF2YWlsYWJsZSA9IChsb25nIGxvbmcpKCgxdWxsIDw8IDYzKSAtIDEpOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgfQpAQCAtODYsNyArODksNyBAQAogICAgIH0KIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptU291cmNlOwogCiAgICAgRGF0YVNvdXJjZUJhc2VSZWFkZXIoY29uc3QgRGF0YVNvdXJjZUJhc2VSZWFkZXIgJik7CiAgICAgRGF0YVNvdXJjZUJhc2VSZWFkZXIgJm9wZXJhdG9yPShjb25zdCBEYXRhU291cmNlQmFzZVJlYWRlciAmKTsKQEAgLTExOCwyMiArMTIxLDI1IEBACiAgICAgY29uc3QgbWt2cGFyc2VyOjpCbG9ja0VudHJ5ICptQmxvY2tFbnRyeTsKICAgICBsb25nIG1CbG9ja0VudHJ5SW5kZXg7CiAKKyAgICB1bnNpZ25lZCBsb25nIG1UcmFja1R5cGU7CisgICAgdm9pZCBzZWVrd2l0aG91dGN1ZV9sKGludDY0X3Qgc2Vla1RpbWVVcywgaW50NjRfdCAqYWN0dWFsRnJhbWVUaW1lVXMpOworCiAgICAgdm9pZCBhZHZhbmNlX2woKTsKIAogICAgIEJsb2NrSXRlcmF0b3IoY29uc3QgQmxvY2tJdGVyYXRvciAmKTsKICAgICBCbG9ja0l0ZXJhdG9yICZvcGVyYXRvcj0oY29uc3QgQmxvY2tJdGVyYXRvciAmKTsKIH07CiAKLXN0cnVjdCBNYXRyb3NrYVNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKK3N0cnVjdCBNYXRyb3NrYVNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyIHsKICAgICBNYXRyb3NrYVNvdXJjZShNYXRyb3NrYUV4dHJhY3RvciAqZXh0cmFjdG9yLCBzaXplX3QgaW5kZXgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICYpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NYXRyb3NrYVNvdXJjZSgpOwpAQCAtMTQzLDYgKzE0OSw5IEBACiAgICAgICAgIEFWQywKICAgICAgICAgQUFDLAogICAgICAgICBIRVZDLAorICAgICAgICBNUDMsCisgICAgICAgIFBDTSwKKyAgICAgICAgVk9SQklTLAogICAgICAgICBPVEhFUgogICAgIH07CiAKQEAgLTE1MywxMiArMTYyLDIxIEBACiAgICAgQmxvY2tJdGVyYXRvciBtQmxvY2tJdGVyOwogICAgIHNzaXplX3QgbU5BTFNpemVMZW47ICAvLyBmb3IgdHlwZSBBVkMgb3IgSEVWQwogCi0gICAgTGlzdDxNZWRpYUJ1ZmZlckJhc2UgKj4gbVBlbmRpbmdGcmFtZXM7CisgICAgTGlzdDxNZWRpYUJ1ZmZlckhlbHBlciAqPiBtUGVuZGluZ0ZyYW1lczsKKworICAgIGludDY0X3QgbUN1cnJlbnRUUzsgLy8gYWRkIGZvciBtcDMKKyAgICB1aW50MzJfdCBtTVAzSGVhZGVyOworCisgICAgbWVkaWFfc3RhdHVzX3QgZmluZE1QM0hlYWRlcih1aW50MzJfdCAqIGhlYWRlciwKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YVNvdXJjZSwgaW50IGxlbmd0aCwgaW50ICpvdXRTdGFydFBvcyk7CisgICAgbWVkaWFfc3RhdHVzX3QgbXAzRnJhbWVSZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zLAorICAgICAgICAgICAgaW50NjRfdCB0YXJnZXRTYW1wbGVUaW1lVXMpOwogCiAgICAgc3RhdHVzX3QgYWR2YW5jZSgpOwogCi0gICAgc3RhdHVzX3Qgc2V0V2VibUJsb2NrQ3J5cHRvSW5mbyhNZWRpYUJ1ZmZlckJhc2UgKm1idWYpOwotICAgIHN0YXR1c190IHJlYWRCbG9jaygpOworICAgIHN0YXR1c190IHNldFdlYm1CbG9ja0NyeXB0b0luZm8oTWVkaWFCdWZmZXJIZWxwZXIgKm1idWYpOworICAgIG1lZGlhX3N0YXR1c190IHJlYWRCbG9jaygpOwogICAgIHZvaWQgY2xlYXJQZW5kaW5nRnJhbWVzKCk7CiAKICAgICBNYXRyb3NrYVNvdXJjZShjb25zdCBNYXRyb3NrYVNvdXJjZSAmKTsKQEAgLTIyMSw0NyArMjM5LDQzIEBACiAgICAgICBtQmxvY2tJdGVyKG1FeHRyYWN0b3IsCiAgICAgICAgICAgICAgICAgIG1FeHRyYWN0b3ItPm1UcmFja3MuaXRlbUF0KGluZGV4KS5tVHJhY2tOdW0sCiAgICAgICAgICAgICAgICAgIGluZGV4KSwKLSAgICAgIG1OQUxTaXplTGVuKC0xKSB7Ci0gICAgTWV0YURhdGFCYXNlICZtZXRhID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5lZGl0SXRlbUF0KGluZGV4KS5tTWV0YTsKKyAgICAgIG1OQUxTaXplTGVuKC0xKSwKKyAgICAgIG1DdXJyZW50VFMoMCksCisgICAgICBtTVAzSGVhZGVyKDApIHsKKyAgICBNYXRyb3NrYUV4dHJhY3Rvcjo6VHJhY2tJbmZvICZ0cmFja0luZm8gPSBtRXh0cmFjdG9yLT5tVHJhY2tzLmVkaXRJdGVtQXQoaW5kZXgpOworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IHRyYWNrSW5mby5tTWV0YTsKIAogICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgQ0hFQ0sobWV0YS5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSk7CiAKICAgICBtSXNBdWRpbyA9ICFzdHJuY2FzZWNtcCgiYXVkaW8vIiwgbWltZSwgNik7CiAKICAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSkgewogICAgICAgICBtVHlwZSA9IEFWQzsKIAotICAgICAgICB1aW50MzJfdCBkdW1teTsKLSAgICAgICAgY29uc3QgdWludDhfdCAqYXZjYzsKLSAgICAgICAgc2l6ZV90IGF2Y2NTaXplOwotICAgICAgICBpbnQzMl90IG5hbFNpemVMZW4gPSAwOwotICAgICAgICBpZiAobWV0YS5maW5kSW50MzIoa0tleU5hbExlbmd0aFNpemUsICZuYWxTaXplTGVuKSkgewotICAgICAgICAgICAgaWYgKG5hbFNpemVMZW4gPj0gMCAmJiBuYWxTaXplTGVuIDw9IDQpIHsKLSAgICAgICAgICAgICAgICBtTkFMU2l6ZUxlbiA9IG5hbFNpemVMZW47Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobWV0YS5maW5kRGF0YShrS2V5QVZDQywgJmR1bW15LCAoY29uc3Qgdm9pZCAqKikmYXZjYywgJmF2Y2NTaXplKQotICAgICAgICAgICAgICAgICYmIGF2Y2NTaXplID49IDV1KSB7Ci0gICAgICAgICAgICBtTkFMU2l6ZUxlbiA9IDEgKyAoYXZjY1s0XSAmIDMpOwotICAgICAgICAgICAgQUxPR1YoIm1OQUxTaXplTGVuID0gJXpkIiwgbU5BTFNpemVMZW4pOworICAgICAgICBpbnQzMl90IG5hbFNpemVMZW4gPSB0cmFja0luZm8ubU5hbExlbmd0aFNpemU7CisgICAgICAgIGlmIChuYWxTaXplTGVuID49IDAgJiYgbmFsU2l6ZUxlbiA8PSA0KSB7CisgICAgICAgICAgICBtTkFMU2l6ZUxlbiA9IG5hbFNpemVMZW47CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiTm8gbU5BTFNpemVMZW4iKTsKKyAgICAgICAgICAgIEFMT0dFKCJObyBBVkMgbU5BTFNpemVMZW4iKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQykpIHsKICAgICAgICAgbVR5cGUgPSBIRVZDOwogCi0gICAgICAgIHVpbnQzMl90IGR1bW15OwotICAgICAgICBjb25zdCB1aW50OF90ICpodmNjOwotICAgICAgICBzaXplX3QgaHZjY1NpemU7Ci0gICAgICAgIGlmIChtZXRhLmZpbmREYXRhKGtLZXlIVkNDLCAmZHVtbXksIChjb25zdCB2b2lkICoqKSZodmNjLCAmaHZjY1NpemUpCi0gICAgICAgICAgICAgICAgJiYgaHZjY1NpemUgPj0gMjJ1KSB7Ci0gICAgICAgICAgICBtTkFMU2l6ZUxlbiA9IDEgKyAoaHZjY1sxNCs3XSAmIDMpOwotICAgICAgICAgICAgQUxPR1YoIm1OQUxTaXplTGVuID0gJXp1IiwgbU5BTFNpemVMZW4pOworICAgICAgICBpbnQzMl90IG5hbFNpemVMZW4gPSB0cmFja0luZm8ubU5hbExlbmd0aFNpemU7CisgICAgICAgIGlmIChuYWxTaXplTGVuID49IDAgJiYgbmFsU2l6ZUxlbiA8PSA0KSB7CisgICAgICAgICAgICBtTkFMU2l6ZUxlbiA9IG5hbFNpemVMZW47CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiTm8gbU5BTFNpemVMZW4iKTsKKyAgICAgICAgICAgIEFMT0dFKCJObyBIRVZDIG1OQUxTaXplTGVuIik7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpIHsKICAgICAgICAgbVR5cGUgPSBBQUM7CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKSkgeworICAgICAgICBtVHlwZSA9IE1QMzsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykpIHsKKyAgICAgICAgbVR5cGUgPSBQQ007CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpKSB7CisgICAgICAgIG1UeXBlID0gVk9SQklTOwogICAgIH0KIH0KIApAQCAtMjY5LDI1ICsyODMsMzYgQEAKICAgICBjbGVhclBlbmRpbmdGcmFtZXMoKTsKIH0KIAotc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqIC8qIHBhcmFtcyAqLykgeworbWVkaWFfc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnN0YXJ0KCkgewogICAgIGlmIChtVHlwZSA9PSBBVkMgJiYgbU5BTFNpemVMZW4gPCAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAorICAgIC8vIGFsbG9jYXRlIG9uZSBzbWFsbCBpbml0aWFsIGJ1ZmZlciwgYnV0IGxlYXZlIHBsZW50eSBvZiByb29tIHRvIGdyb3cKKyAgICBtQnVmZmVyR3JvdXAtPmluaXQoMSAvKiBudW1iZXIgb2YgYnVmZmVycyAqLywgMTAyNCAvKiBidWZmZXIgc2l6ZSAqLywgNjQgLyogZ3Jvd3RoIGxpbWl0ICovKTsKICAgICBtQmxvY2tJdGVyLnJlc2V0KCk7CiAKLSAgICByZXR1cm4gT0s7CisgICAgaWYgKG1UeXBlID09IE1QMyAmJiBtTVAzSGVhZGVyID09IDApIHsKKyAgICAgICAgaW50IHN0YXJ0ID0gLTE7CisgICAgICAgIG1lZGlhX3N0YXR1c190IGVyciA9IGZpbmRNUDNIZWFkZXIoJm1NUDNIZWFkZXIsIE5VTEwsIDAsICZzdGFydCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJObyBtcDMgaGVhZGVyIGZvdW5kIik7CisgICAgICAgICAgICBjbGVhclBlbmRpbmdGcmFtZXMoKTsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6c3RvcCgpIHsKK21lZGlhX3N0YXR1c190IE1hdHJvc2thU291cmNlOjpzdG9wKCkgewogICAgIGNsZWFyUGVuZGluZ0ZyYW1lcygpOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1hdHJvc2thU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgbWV0YSA9IG1FeHRyYWN0b3ItPm1UcmFja3MuaXRlbUF0KG1UcmFja0luZGV4KS5tTWV0YTsKLSAgICByZXR1cm4gT0s7CittZWRpYV9zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtRXh0cmFjdG9yLT5tVHJhY2tzLml0ZW1BdChtVHJhY2tJbmRleCkubU1ldGEpOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtMzAwLDYgKzMyNSw3IEBACiAgICAgICBtQ2x1c3RlcihOVUxMKSwKICAgICAgIG1CbG9ja0VudHJ5KE5VTEwpLAogICAgICAgbUJsb2NrRW50cnlJbmRleCgwKSB7CisgICAgbVRyYWNrVHlwZSA9IG1FeHRyYWN0b3ItPm1TZWdtZW50LT5HZXRUcmFja3MoKS0+R2V0VHJhY2tCeU51bWJlcih0cmFja051bSktPkdldFR5cGUoKTsKICAgICByZXNldCgpOwogfQogCkBAIC00NDIsNyArNDY4LDcgQEAKICAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IGNvdW50OyBpbmRleCsrKSB7CiAgICAgICAgICAgICBwRW50cnkgPSBwU0gtPkdldEVudHJ5KGluZGV4KTsKIAotICAgICAgICAgICAgaWYgKHBFbnRyeS0+aWQgPT0gMHgwQzUzQkI2QikgeyAvLyBDdWVzIElECisgICAgICAgICAgICBpZiAocEVudHJ5LT5pZCA9PSBsaWJ3ZWJtOjprTWt2Q3VlcykgeyAvLyBDdWVzIElECiAgICAgICAgICAgICAgICAgbG9uZyBsZW47IGxvbmcgbG9uZyBwb3M7CiAgICAgICAgICAgICAgICAgcFNlZ21lbnQtPlBhcnNlQ3VlcyhwRW50cnktPnBvcywgcG9zLCBsZW4pOwogICAgICAgICAgICAgICAgIHBDdWVzID0gcFNlZ21lbnQtPkdldEN1ZXMoKTsKQEAgLTQ1MiwxMiArNDc4LDE0IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIXBDdWVzKSB7Ci0gICAgICAgICAgICBBTE9HRSgiTm8gQ3VlcyBpbiBmaWxlIik7CisgICAgICAgICAgICBBTE9HVigiTm8gQ3VlcyBpbiBmaWxlLHNlZWsgd2l0aG91dCBjdWUgZGF0YSIpOworICAgICAgICAgICAgc2Vla3dpdGhvdXRjdWVfbChzZWVrVGltZVVzLCBhY3R1YWxGcmFtZVRpbWVVcyk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICB9CiAgICAgZWxzZSBpZiAoIXBTSCkgewotICAgICAgICBBTE9HRSgiTm8gU2Vla0hlYWQiKTsKKyAgICAgICAgQUxPR1YoIk5vIFNlZWtIZWFkLCBzZWVrIHdpdGhvdXQgY3VlIGRhdGEiKTsKKyAgICAgICAgc2Vla3dpdGhvdXRjdWVfbChzZWVrVGltZVVzLCBhY3R1YWxGcmFtZVRpbWVVcyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTQ2Niw3ICs0OTQsOSBAQAogICAgIHdoaWxlICghcEN1ZXMtPkRvbmVQYXJzaW5nKCkpIHsKICAgICAgICAgcEN1ZXMtPkxvYWRDdWVQb2ludCgpOwogICAgICAgICBwQ1AgPSBwQ3Vlcy0+R2V0TGFzdCgpOwotICAgICAgICBDSEVDSyhwQ1ApOworICAgICAgICBBTE9HVigicENQID0gJXMiLCBwQ1AgPT0gTlVMTCA/ICJOVUxMIiA6ICJub3QgTlVMTCIpOworICAgICAgICBpZiAocENQID09IE5VTEwpCisgICAgICAgICAgICBjb250aW51ZTsKIAogICAgICAgICBzaXplX3QgdHJhY2tDb3VudCA9IG1FeHRyYWN0b3ItPm1UcmFja3Muc2l6ZSgpOwogICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgdHJhY2tDb3VudDsgKytpbmRleCkgewpAQCAtNTA0LDYgKzUzNCw3IEBACiAgICAgLy8gQWx3YXlzICpzZWFyY2gqIGJhc2VkIG9uIHRoZSB2aWRlbyB0cmFjaywgYnV0IGZpbmFsaXplIGJhc2VkIG9uIG1UcmFja051bQogICAgIGlmICghcFRQKSB7CiAgICAgICAgIEFMT0dFKCJEaWQgbm90IGxvY2F0ZSB0aGUgdmlkZW8gdHJhY2sgZm9yIHNlZWtpbmciKTsKKyAgICAgICAgc2Vla3dpdGhvdXRjdWVfbChzZWVrVGltZVVzLCBhY3R1YWxGcmFtZVRpbWVVcyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTU0Nyw2ICs1NzgsMzEgQEAKICAgICByZXR1cm4gKG1CbG9ja0VudHJ5LT5HZXRCbG9jaygpLT5HZXRUaW1lKG1DbHVzdGVyKSArIDUwMGxsKSAvIDEwMDBsbDsKIH0KIAordm9pZCBCbG9ja0l0ZXJhdG9yOjpzZWVrd2l0aG91dGN1ZV9sKGludDY0X3Qgc2Vla1RpbWVVcywgaW50NjRfdCAqYWN0dWFsRnJhbWVUaW1lVXMpIHsKKyAgICBtQ2x1c3RlciA9IG1FeHRyYWN0b3ItPm1TZWdtZW50LT5GaW5kQ2x1c3RlcihzZWVrVGltZVVzICogMTAwMGxsKTsKKyAgICBjb25zdCBsb25nIHN0YXR1cyA9IG1DbHVzdGVyLT5HZXRGaXJzdChtQmxvY2tFbnRyeSk7CisgICAgaWYgKHN0YXR1cyA8IDApIHsgIC8vIGVycm9yCisgICAgICAgIEFMT0dFKCJnZXQgbGFzdCBibG9ja2VucnkgZmFpbGVkISIpOworICAgICAgICBtQ2x1c3RlciA9IE5VTEw7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUJsb2NrRW50cnlJbmRleCA9IDA7CisgICAgd2hpbGUgKCFlb3MoKSAmJiAoKGJsb2NrKCktPkdldFRyYWNrTnVtYmVyKCkgIT0gbVRyYWNrTnVtKSB8fCAoYmxvY2tUaW1lVXMoKSA8IHNlZWtUaW1lVXMpKSkgeworICAgICAgICBhZHZhbmNlX2woKTsKKyAgICB9CisKKyAgICAvLyB2aWRlbyB0cmFjayB3aWxsIHNlZWsgdG8gdGhlIG5leHQga2V5IGZyYW1lLgorICAgIGlmIChtVHJhY2tUeXBlID09IDEpIHsKKyAgICAgICAgd2hpbGUgKCFlb3MoKSAmJiAoKGJsb2NrKCktPkdldFRyYWNrTnVtYmVyKCkgIT0gbVRyYWNrTnVtKSB8fAorICAgICAgICAgICAgICAgICAgICAgICFtQmxvY2tFbnRyeS0+R2V0QmxvY2soKS0+SXNLZXkoKSkpIHsKKyAgICAgICAgICAgIGFkdmFuY2VfbCgpOworICAgICAgICB9CisgICAgfQorICAgICphY3R1YWxGcmFtZVRpbWVVcyA9IGJsb2NrVGltZVVzKCk7CisgICAgIEFMT0dWKCJzZWVrVGltZVVzOiVsbGQsIGFjdHVhbEZyYW1lVGltZVVzOiVsbGQsIHRyYWNrbnVtOiVsbGQiLAorICAgICAgICAgICAgICAobG9uZyBsb25nKXNlZWtUaW1lVXMsIChsb25nIGxvbmcpKmFjdHVhbEZyYW1lVGltZVVzLCAobG9uZyBsb25nKW1UcmFja051bSk7Cit9CisKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIHN0YXRpYyB1bnNpZ25lZCBVMjRfQVQoY29uc3QgdWludDhfdCAqcHRyKSB7CkBAIC01NzksNyArNjM1LDcgQEAKIAogdm9pZCBNYXRyb3NrYVNvdXJjZTo6Y2xlYXJQZW5kaW5nRnJhbWVzKCkgewogICAgIHdoaWxlICghbVBlbmRpbmdGcmFtZXMuZW1wdHkoKSkgewotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmZyYW1lID0gKm1QZW5kaW5nRnJhbWVzLmJlZ2luKCk7CisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICpmcmFtZSA9ICptUGVuZGluZ0ZyYW1lcy5iZWdpbigpOwogICAgICAgICBtUGVuZGluZ0ZyYW1lcy5lcmFzZShtUGVuZGluZ0ZyYW1lcy5iZWdpbigpKTsKIAogICAgICAgICBmcmFtZS0+cmVsZWFzZSgpOwpAQCAtNTg3LDcgKzY0Myw3IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6c2V0V2VibUJsb2NrQ3J5cHRvSW5mbyhNZWRpYUJ1ZmZlckJhc2UgKm1idWYpIHsKK3N0YXR1c190IE1hdHJvc2thU291cmNlOjpzZXRXZWJtQmxvY2tDcnlwdG9JbmZvKE1lZGlhQnVmZmVySGVscGVyICptYnVmKSB7CiAgICAgaWYgKG1idWYtPnJhbmdlX2xlbmd0aCgpIDwgMSB8fCBtYnVmLT5yYW5nZV9sZW5ndGgoKSAtIDEgPiBJTlQzMl9NQVgpIHsKICAgICAgICAgLy8gMS1ieXRlIHNpZ25hbAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwpAQCAtNjAxLDE3ICs2NTcsMTcgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKLSAgICBNZXRhRGF0YUJhc2UgJm1ldGEgPSBtYnVmLT5tZXRhX2RhdGEoKTsKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBtYnVmLT5tZXRhX2RhdGEoKTsKICAgICBpZiAoZW5jcnlwdGVkKSB7CiAgICAgICAgIHVpbnQ4X3QgY3RyQ291bnRlclsxNl0gPSB7IDAgfTsKLSAgICAgICAgdWludDMyX3QgdHlwZTsKICAgICAgICAgY29uc3QgdWludDhfdCAqa2V5SWQ7CiAgICAgICAgIHNpemVfdCBrZXlJZFNpemU7Ci0gICAgICAgIGNvbnN0IE1ldGFEYXRhQmFzZSAmdHJhY2tNZXRhID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQobVRyYWNrSW5kZXgpLm1NZXRhOwotICAgICAgICBDSEVDSyh0cmFja01ldGEuZmluZERhdGEoa0tleUNyeXB0b0tleSwgJnR5cGUsIChjb25zdCB2b2lkICoqKSZrZXlJZCwgJmtleUlkU2l6ZSkpOwotICAgICAgICBtZXRhLnNldERhdGEoa0tleUNyeXB0b0tleSwgMCwga2V5SWQsIGtleUlkU2l6ZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tNZXRhID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQobVRyYWNrSW5kZXgpLm1NZXRhOworICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKHRyYWNrTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fS0VZLAorICAgICAgICAgICAgICAgICh2b2lkKiopJmtleUlkLCAma2V5SWRTaXplKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksIGtleUlkLCBrZXlJZFNpemUpOwogICAgICAgICBtZW1jcHkoY3RyQ291bnRlciwgZGF0YSArIDEsIDgpOwotICAgICAgICBtZXRhLnNldERhdGEoa0tleUNyeXB0b0lWLCAwLCBjdHJDb3VudGVyLCAxNik7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fSVYsIGN0ckNvdW50ZXIsIDE2KTsKICAgICAgICAgaWYgKHBhcnRpdGlvbmVkKSB7CiAgICAgICAgICAgICAvKiAgMCAgICAgICAgICAgICAgICAgICAxICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgICAgICAgMwogICAgICAgICAgICAgICogIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQpAQCAtNjY0LDggKzcyMCwxMCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgdWludDMyX3Qgc2l6ZW9mUGxhaW5TaXplcyA9IHNpemVvZih1aW50MzJfdCkgKiBwbGFpblNpemVzLnNpemUoKTsKICAgICAgICAgICAgIHVpbnQzMl90IHNpemVvZkVuY3J5cHRlZFNpemVzID0gc2l6ZW9mKHVpbnQzMl90KSAqIGVuY3J5cHRlZFNpemVzLnNpemUoKTsKLSAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5UGxhaW5TaXplcywgMCwgcGxhaW5TaXplcy5kYXRhKCksIHNpemVvZlBsYWluU2l6ZXMpOwotICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgMCwgZW5jcnlwdGVkU2l6ZXMuZGF0YSgpLCBzaXplb2ZFbmNyeXB0ZWRTaXplcyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1BMQUlOX1NJWkVTLAorICAgICAgICAgICAgICAgICAgICBwbGFpblNpemVzLmRhdGEoKSwgc2l6ZW9mUGxhaW5TaXplcyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9TSVpFUywKKyAgICAgICAgICAgICAgICAgICAgZW5jcnlwdGVkU2l6ZXMuZGF0YSgpLCBzaXplb2ZFbmNyeXB0ZWRTaXplcyk7CiAgICAgICAgICAgICBtYnVmLT5zZXRfcmFuZ2UoZnJhbWVPZmZzZXQsIG1idWYtPnJhbmdlX2xlbmd0aCgpIC0gZnJhbWVPZmZzZXQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLyoKQEAgLTY4NSw4ICs3NDMsMTAgQEAKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgaW50MzJfdCBwbGFpblNpemVzW10gPSB7IDAgfTsKICAgICAgICAgICAgIGludDMyX3QgZW5jcnlwdGVkU2l6ZXNbXSA9IHsgc3RhdGljX2Nhc3Q8aW50MzJfdD4obWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSA5KSB9OwotICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlQbGFpblNpemVzLCAwLCBwbGFpblNpemVzLCBzaXplb2YocGxhaW5TaXplcykpOwotICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgMCwgZW5jcnlwdGVkU2l6ZXMsIHNpemVvZihlbmNyeXB0ZWRTaXplcykpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19QTEFJTl9TSVpFUywKKyAgICAgICAgICAgICAgICAgICAgcGxhaW5TaXplcywgc2l6ZW9mKHBsYWluU2l6ZXMpKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX1NJWkVTLAorICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWRTaXplcywgc2l6ZW9mKGVuY3J5cHRlZFNpemVzKSk7CiAgICAgICAgICAgICBtYnVmLT5zZXRfcmFuZ2UoOSwgbWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSA5KTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CkBAIC03MDMsMTkgKzc2MywyMSBAQAogICAgICAgICAgKi8KICAgICAgICAgaW50MzJfdCBwbGFpblNpemVzW10gPSB7IHN0YXRpY19jYXN0PGludDMyX3Q+KG1idWYtPnJhbmdlX2xlbmd0aCgpIC0gMSkgfTsKICAgICAgICAgaW50MzJfdCBlbmNyeXB0ZWRTaXplc1tdID0geyAwIH07Ci0gICAgICAgIG1ldGEuc2V0RGF0YShrS2V5UGxhaW5TaXplcywgMCwgcGxhaW5TaXplcywgc2l6ZW9mKHBsYWluU2l6ZXMpKTsKLSAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgMCwgZW5jcnlwdGVkU2l6ZXMsIHNpemVvZihlbmNyeXB0ZWRTaXplcykpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1BMQUlOX1NJWkVTLAorICAgICAgICAgICAgICAgIHBsYWluU2l6ZXMsIHNpemVvZihwbGFpblNpemVzKSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX1NJWkVTLAorICAgICAgICAgICAgICAgIGVuY3J5cHRlZFNpemVzLCBzaXplb2YoZW5jcnlwdGVkU2l6ZXMpKTsKICAgICAgICAgbWJ1Zi0+c2V0X3JhbmdlKDEsIG1idWYtPnJhbmdlX2xlbmd0aCgpIC0gMSk7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6cmVhZEJsb2NrKCkgeworbWVkaWFfc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnJlYWRCbG9jaygpIHsKICAgICBDSEVDSyhtUGVuZGluZ0ZyYW1lcy5lbXB0eSgpKTsKIAogICAgIGlmIChtQmxvY2tJdGVyLmVvcygpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgfQogCiAgICAgY29uc3QgbWt2cGFyc2VyOjpCbG9jayAqYmxvY2sgPSBtQmxvY2tJdGVyLmJsb2NrKCk7CkBAIC03MjcsMTggKzc4OSw0MSBAQAogICAgICAgICBjb25zdCBta3ZwYXJzZXI6OkJsb2NrOjpGcmFtZSAmZnJhbWUgPSBibG9jay0+R2V0RnJhbWUoaSk7CiAgICAgICAgIHNpemVfdCBsZW4gPSBmcmFtZS5sZW47CiAgICAgICAgIGlmIChTSVpFX01BWCAtIGxlbiA8IHRyYWNrSW5mby0+bUhlYWRlckxlbikgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAKICAgICAgICAgbGVuICs9IHRyYWNrSW5mby0+bUhlYWRlckxlbjsKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICptYnVmID0gTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUobGVuKTsKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKm1idWY7CisgICAgICAgIG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJm1idWYsIGZhbHNlIC8qIG5vbmJsb2NraW5nICovLCBsZW4gLyogcmVxdWVzdGVkIHNpemUgKi8pOworICAgICAgICBtYnVmLT5zZXRfcmFuZ2UoMCwgbGVuKTsKICAgICAgICAgdWludDhfdCAqZGF0YSA9IHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4obWJ1Zi0+ZGF0YSgpKTsKICAgICAgICAgaWYgKHRyYWNrSW5mby0+bUhlYWRlcikgewogICAgICAgICAgICAgbWVtY3B5KGRhdGEsIHRyYWNrSW5mby0+bUhlYWRlciwgdHJhY2tJbmZvLT5tSGVhZGVyTGVuKTsKICAgICAgICAgfQogCi0gICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOwotICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIGJsb2NrLT5Jc0tleSgpKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gbWJ1Zi0+bWV0YV9kYXRhKCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIHRpbWVVcyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIGJsb2NrLT5Jc0tleSgpKTsKKworICAgICAgICBpZiAobVR5cGUgPT0gVk9SQklTKSB7CisgICAgICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGU7CisgICAgICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMih0cmFja0luZm8tPm1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNhbXBsZVJhdGUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQ2NCh0cmFja0luZm8tPm1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR1cmF0aW9uVXMpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBUT0RPOiBFeHBsb3JlIGlmIHRoaXMgY2FuIGJlIGhhbmRsZWQgc2ltaWxhciB0byBNUEVHNCBleHRyYWN0b3Igd2hlcmUgcGFkZGluZyBpcworICAgICAgICAgICAgLy8gc2lnbmFsbGVkIGluc3RlYWQgb2YgVkFMSURfU0FNUExFUworICAgICAgICAgICAgLy8gUmVtYWluaW5nIHZhbGlkIHNhbXBsZXMgaW4gVm9yYmlzIHRyYWNrCisgICAgICAgICAgICBpZiAoZHVyYXRpb25VcyA+IHRpbWVVcykgeworICAgICAgICAgICAgICAgIGludDMyX3QgdmFsaWRTYW1wbGVzID0gKChkdXJhdGlvblVzIC0gdGltZVVzKSAqIHNhbXBsZVJhdGUpIC8gMTAwMDAwMGxsOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1ZBTElEX1NBTVBMRVMsIHZhbGlkU2FtcGxlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAogICAgICAgICBzdGF0dXNfdCBlcnIgPSBmcmFtZS5SZWFkKG1FeHRyYWN0b3ItPm1SZWFkZXIsIGRhdGEgKyB0cmFja0luZm8tPm1IZWFkZXJMZW4pOwogICAgICAgICBpZiAoZXJyID09IE9LCkBAIC03NTIsNyArODM3LDcgQEAKIAogICAgICAgICAgICAgbUJsb2NrSXRlci5hZHZhbmNlKCk7CiAgICAgICAgICAgICBtYnVmLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICB9CiAKICAgICAgICAgbVBlbmRpbmdGcmFtZXMucHVzaF9iYWNrKG1idWYpOwpAQCAtNzYwLDExICs4NDUsMTkzIEBACiAKICAgICBtQmxvY2tJdGVyLmFkdmFuY2UoKTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworLy90aGUgdmFsdWUgb2Yga01QM0hlYWRlck1hc2sgaXMgZnJvbSBNUDNFeHRyYWN0b3IKK3N0YXRpYyBjb25zdCB1aW50MzJfdCBrTVAzSGVhZGVyTWFzayA9IDB4ZmZmZTBjMDA7CisKK21lZGlhX3N0YXR1c190IE1hdHJvc2thU291cmNlOjpmaW5kTVAzSGVhZGVyKHVpbnQzMl90ICogaGVhZGVyLAorICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhU291cmNlLCBpbnQgbGVuZ3RoLCBpbnQgKm91dFN0YXJ0UG9zKSB7CisgICAgaWYgKE5VTEwgPT0gaGVhZGVyKSB7CisgICAgICAgIEFMT0dFKCJoZWFkZXIgaXMgbnVsbCEiKTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0KKworICAgIC8vdG8gZmluZCBoZWFkZXIgc3RhcnQgcG9zaXRpb24KKyAgICBpZiAoMCAhPSAqaGVhZGVyKSB7CisgICAgICAgIGlmIChOVUxMID09IGRhdGFTb3VyY2UpIHsKKyAgICAgICAgICAgICpvdXRTdGFydFBvcyA9IC0xOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICAgICAgfQorICAgICAgICB1aW50MzJfdCB0bXBDb2RlID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworICAgICAgICAgICAgdG1wQ29kZSA9ICh0bXBDb2RlIDw8IDgpICsgZGF0YVNvdXJjZVtpXTsKKyAgICAgICAgICAgIGlmICgodG1wQ29kZSAmIGtNUDNIZWFkZXJNYXNrKSA9PSAoKmhlYWRlciAmIGtNUDNIZWFkZXJNYXNrKSkgeworICAgICAgICAgICAgICAgICpvdXRTdGFydFBvcyA9IGkgLSAzOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKm91dFN0YXJ0UG9zID0gLTE7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgfQorCisgICAgLy90byBmaW5kIG1wMyBoZWFkZXIKKyAgICB1aW50MzJfdCBjb2RlID0gMDsKKyAgICB3aGlsZSAoMCA9PSAqaGVhZGVyKSB7CisgICAgICAgIHdoaWxlIChtUGVuZGluZ0ZyYW1lcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSByZWFkQmxvY2soKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBjbGVhclBlbmRpbmdGcmFtZXMoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICpmcmFtZSA9ICptUGVuZGluZ0ZyYW1lcy5iZWdpbigpOworICAgICAgICBzaXplX3Qgc2l6ZSA9IGZyYW1lLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgc2l6ZV90IG9mZnNldCA9IGZyYW1lLT5yYW5nZV9vZmZzZXQoKTsKKyAgICAgICAgc2l6ZV90IGk7CisgICAgICAgIHNpemVfdCBmcmFtZV9zaXplOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBBTE9HVigiZGF0YVslenVdPSV4IiwgaSwgKigodWludDhfdCopZnJhbWUtPmRhdGEoKSArIG9mZnNldCArIGkpKTsKKyAgICAgICAgICAgIGNvZGUgPSAoY29kZSA8PCA4KSArICooKHVpbnQ4X3QqKWZyYW1lLT5kYXRhKCkgKyBvZmZzZXQgKyBpKTsKKyAgICAgICAgICAgIGlmIChHZXRNUEVHQXVkaW9GcmFtZVNpemUoY29kZSwgJmZyYW1lX3NpemUsIE5VTEwsIE5VTEwsIE5VTEwpKSB7CisgICAgICAgICAgICAgICAgKmhlYWRlciA9IGNvZGU7CisgICAgICAgICAgICAgICAgbUJsb2NrSXRlci5yZXNldCgpOworICAgICAgICAgICAgICAgIGNsZWFyUGVuZGluZ0ZyYW1lcygpOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07Cit9CisKK21lZGlhX3N0YXR1c190IE1hdHJvc2thU291cmNlOjptcDNGcmFtZVJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucywKKyAgICAgICAgaW50NjRfdCB0YXJnZXRTYW1wbGVUaW1lVXMpIHsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqZnJhbWUgPSAqbVBlbmRpbmdGcmFtZXMuYmVnaW4oKTsKKyAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CisgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CisgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKKyAgICAgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDY0KGZyYW1lLT5tZXRhX2RhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCAmbUN1cnJlbnRUUykpOworICAgICAgICBpZiAobUN1cnJlbnRUUyA8IDApIHsKKyAgICAgICAgICAgIG1DdXJyZW50VFMgPSAwOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGZyYW1lLT5tZXRhX2RhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCBtQ3VycmVudFRTKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludDMyX3Qgc3RhcnQgPSAtMTsKKyAgICB3aGlsZSAoc3RhcnQgPCAwKSB7CisgICAgICAgIC8vZmluZCBoZWFkZXIgc3RhcnQgcG9zaXRpb24KKyAgICAgICAgZmluZE1QM0hlYWRlcigmbU1QM0hlYWRlciwKKyAgICAgICAgICAgIChjb25zdCB1aW50OF90KilmcmFtZS0+ZGF0YSgpICsgZnJhbWUtPnJhbmdlX29mZnNldCgpLAorICAgICAgICAgICAgZnJhbWUtPnJhbmdlX2xlbmd0aCgpLCAmc3RhcnQpOworICAgICAgICBBTE9HVigic3RhcnQ9JWQsIGZyYW1lLT5yYW5nZV9sZW5ndGgoKSA9ICV6dSwgZnJhbWUtPnJhbmdlX29mZnNldCgpID0lenUiLAorICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBmcmFtZS0+cmFuZ2VfbGVuZ3RoKCksIGZyYW1lLT5yYW5nZV9vZmZzZXQoKSk7CisgICAgICAgIGlmIChzdGFydCA+PSAwKQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGZyYW1lLT5yZWxlYXNlKCk7CisgICAgICAgIG1QZW5kaW5nRnJhbWVzLmVyYXNlKG1QZW5kaW5nRnJhbWVzLmJlZ2luKCkpOworICAgICAgICB3aGlsZSAobVBlbmRpbmdGcmFtZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gcmVhZEJsb2NrKCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgY2xlYXJQZW5kaW5nRnJhbWVzKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmcmFtZSA9ICptUGVuZGluZ0ZyYW1lcy5iZWdpbigpOworICAgIH0KKworICAgIGZyYW1lLT5zZXRfcmFuZ2UoZnJhbWUtPnJhbmdlX29mZnNldCgpICsgc3RhcnQsIGZyYW1lLT5yYW5nZV9sZW5ndGgoKSAtIHN0YXJ0KTsKKworICAgIHVpbnQzMl90IGhlYWRlciA9ICoodWludDMyX3QqKSgodWludDhfdCopZnJhbWUtPmRhdGEoKSArIGZyYW1lLT5yYW5nZV9vZmZzZXQoKSk7CisgICAgaGVhZGVyID0gKChoZWFkZXIgPj4gMjQpICYgMHhmZikgfCAoKGhlYWRlciA+PiA4KSAmIDB4ZmYwMCkgfAorICAgICAgICAgICAgICAgICAgICAoKGhlYWRlciA8PCA4KSAmIDB4ZmYwMDAwKSB8ICgoaGVhZGVyIDw8IDI0KSAmIDB4ZmYwMDAwMDApOworICAgIHNpemVfdCBmcmFtZV9zaXplOworICAgIGludCBvdXRfc2FtcGxpbmdfcmF0ZTsKKyAgICBpbnQgb3V0X2NoYW5uZWxzOworICAgIGludCBvdXRfYml0cmF0ZTsKKyAgICBpZiAoIUdldE1QRUdBdWRpb0ZyYW1lU2l6ZShoZWFkZXIsICZmcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRfc2FtcGxpbmdfcmF0ZSwgJm91dF9jaGFubmVscywgJm91dF9iaXRyYXRlKSkgeworICAgICAgICBBTE9HRSgiTVAzIEhlYWRlciByZWFkIGZhaWwhISIpOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXI7CisgICAgbUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyLCBmYWxzZSAvKiBub25ibG9ja2luZyAqLywgZnJhbWVfc2l6ZSAvKiByZXF1ZXN0ZWQgc2l6ZSAqLyk7CisgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgZnJhbWVfc2l6ZSk7CisKKyAgICB1aW50OF90ICpkYXRhID0gc3RhdGljX2Nhc3Q8dWludDhfdCAqPihidWZmZXItPmRhdGEoKSk7CisgICAgQUxPR1YoIk1QMyBmcmFtZSAlenUgZnJhbWUtPnJhbmdlX2xlbmd0aCgpICV6dSIsIGZyYW1lX3NpemUsIGZyYW1lLT5yYW5nZV9sZW5ndGgoKSk7CisKKyAgICBpZiAoZnJhbWVfc2l6ZSA+IGZyYW1lLT5yYW5nZV9sZW5ndGgoKSkgeworICAgICAgICBtZW1jcHkoZGF0YSwgKHVpbnQ4X3QqKShmcmFtZS0+ZGF0YSgpKSArIGZyYW1lLT5yYW5nZV9vZmZzZXQoKSwgZnJhbWUtPnJhbmdlX2xlbmd0aCgpKTsKKyAgICAgICAgc2l6ZV90IHN1bVNpemUgPSAwOworICAgICAgICBzdW1TaXplICs9IGZyYW1lLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgc2l6ZV90IG5lZWRTaXplID0gZnJhbWVfc2l6ZSAtIGZyYW1lLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgZnJhbWUtPnJlbGVhc2UoKTsKKyAgICAgICAgbVBlbmRpbmdGcmFtZXMuZXJhc2UobVBlbmRpbmdGcmFtZXMuYmVnaW4oKSk7CisgICAgICAgIHdoaWxlIChtUGVuZGluZ0ZyYW1lcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSByZWFkQmxvY2soKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBjbGVhclBlbmRpbmdGcmFtZXMoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZyYW1lID0gKm1QZW5kaW5nRnJhbWVzLmJlZ2luKCk7CisgICAgICAgIHNpemVfdCBvZmZzZXQgPSBmcmFtZS0+cmFuZ2Vfb2Zmc2V0KCk7CisgICAgICAgIHNpemVfdCBzaXplID0gZnJhbWUtPnJhbmdlX2xlbmd0aCgpOworCisgICAgICAgIC8vIHRoZSBuZXh0IGJ1ZmZlciBmcmFtZSBpcyBub3QgZW5vdWdoIHRvIGZ1bGxmaWxsIG1wMyBmcmFtZSwKKyAgICAgICAgLy8gd2UgaGF2ZSB0byByZWFkIHVudGlsIG1wMyBmcmFtZSBpcyBjb21wbGV0ZWQuCisgICAgICAgIHdoaWxlIChzaXplIDwgbmVlZFNpemUpIHsKKyAgICAgICAgICAgIG1lbWNweShkYXRhICsgc3VtU2l6ZSwgKHVpbnQ4X3QqKShmcmFtZS0+ZGF0YSgpKSArIG9mZnNldCwgc2l6ZSk7CisgICAgICAgICAgICBuZWVkU2l6ZSAtPSBzaXplOworICAgICAgICAgICAgc3VtU2l6ZSArPSBzaXplOworICAgICAgICAgICAgZnJhbWUtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1QZW5kaW5nRnJhbWVzLmVyYXNlKG1QZW5kaW5nRnJhbWVzLmJlZ2luKCkpOworICAgICAgICAgICAgd2hpbGUgKG1QZW5kaW5nRnJhbWVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSByZWFkQmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIGNsZWFyUGVuZGluZ0ZyYW1lcygpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyYW1lID0gKm1QZW5kaW5nRnJhbWVzLmJlZ2luKCk7CisgICAgICAgICAgICBvZmZzZXQgPSBmcmFtZS0+cmFuZ2Vfb2Zmc2V0KCk7CisgICAgICAgICAgICBzaXplID0gZnJhbWUtPnJhbmdlX2xlbmd0aCgpOworICAgICAgICB9CisgICAgICAgIG1lbWNweShkYXRhICsgc3VtU2l6ZSwgKHVpbnQ4X3QqKShmcmFtZS0+ZGF0YSgpKSArIG9mZnNldCwgbmVlZFNpemUpOworICAgICAgICBmcmFtZS0+c2V0X3JhbmdlKG9mZnNldCArIG5lZWRTaXplLCBzaXplIC0gbmVlZFNpemUpOworICAgICB9IGVsc2UgeworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gZnJhbWUtPnJhbmdlX29mZnNldCgpOworICAgICAgICBzaXplX3Qgc2l6ZSA9IGZyYW1lLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgbWVtY3B5KGRhdGEsICh1aW50OF90KikoZnJhbWUtPmRhdGEoKSkgKyBvZmZzZXQsIGZyYW1lX3NpemUpOworICAgICAgICBmcmFtZS0+c2V0X3JhbmdlKG9mZnNldCArIGZyYW1lX3NpemUsIHNpemUgLSBmcmFtZV9zaXplKTsKKyAgICB9CisgICAgaWYgKGZyYW1lLT5yYW5nZV9sZW5ndGgoKSA8IDQpIHsKKyAgICAgICAgZnJhbWUtPnJlbGVhc2UoKTsKKyAgICAgICAgZnJhbWUgPSBOVUxMOworICAgICAgICBtUGVuZGluZ0ZyYW1lcy5lcmFzZShtUGVuZGluZ0ZyYW1lcy5iZWdpbigpKTsKKyAgICB9CisgICAgQUxPR1YoIk1hdHJvc2thU291cmNlOjpyZWFkIE1QMyBmcmFtZSBrS2V5VGltZT0lbGxkLGtLZXlUYXJnZXRUaW1lPSVsbGQiLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1DdXJyZW50VFMsIChsb25nIGxvbmcpdGFyZ2V0U2FtcGxlVGltZVVzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmZmVyLT5tZXRhX2RhdGEoKSwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgbUN1cnJlbnRUUyk7CisgICAgbUN1cnJlbnRUUyArPSAoaW50NjRfdClmcmFtZV9zaXplICogODAwMGxsIC8gb3V0X2JpdHJhdGU7CisKKyAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDBsbCkKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGJ1ZmZlci0+bWV0YV9kYXRhKCksCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9UQVJHRVRfVElNRSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKKyAgICAqb3V0ID0gYnVmZmVyOworICAgIEFMT0dWKCJNYXRyb3NrYVNvdXJjZTo6cmVhZCBNUDMsIGtleVRpbWU9JWxsZCBmb3IgbmV4dCBmcmFtZSIsIChsb25nIGxvbmcpbUN1cnJlbnRUUyk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKworbWVkaWFfc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICpvdXQgPSBOVUxMOwogCiAgICAgaW50NjRfdCB0YXJnZXRTYW1wbGVUaW1lVXMgPSAtMWxsOwpAQCAtNzczLDcgKzEwNDAsNyBAQAogICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwogICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CiAgICAgICAgIGlmIChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX0ZSQU1FX0lOREVYKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFtRXh0cmFjdG9yLT5pc0xpdmVTdHJlYW1pbmcoKSkgewpAQCAtNzkxLDcgKzEwNTgsNyBAQAogICAgIH0KIAogICAgIHdoaWxlIChtUGVuZGluZ0ZyYW1lcy5lbXB0eSgpKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IHJlYWRCbG9jaygpOworICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSByZWFkQmxvY2soKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBjbGVhclBlbmRpbmdGcmFtZXMoKTsKQEAgLTgwMCwxOCArMTA2Nyw0MyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgTWVkaWFCdWZmZXJCYXNlICpmcmFtZSA9ICptUGVuZGluZ0ZyYW1lcy5iZWdpbigpOworICAgIGlmIChtVHlwZSA9PSBNUDMpIHsKKyAgICAgICAgcmV0dXJuIG1wM0ZyYW1lUmVhZChvdXQsIG9wdGlvbnMsIHRhcmdldFNhbXBsZVRpbWVVcyk7CisgICAgfQorCisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmZyYW1lID0gKm1QZW5kaW5nRnJhbWVzLmJlZ2luKCk7CiAgICAgbVBlbmRpbmdGcmFtZXMuZXJhc2UobVBlbmRpbmdGcmFtZXMuYmVnaW4oKSk7CiAKICAgICBpZiAoKG1UeXBlICE9IEFWQyAmJiBtVHlwZSAhPSBIRVZDKSB8fCBtTkFMU2l6ZUxlbiA9PSAwKSB7CiAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMGxsKSB7Ci0gICAgICAgICAgICBmcmFtZS0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCB0YXJnZXRTYW1wbGVUaW1lVXMpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGZyYW1lLT5tZXRhX2RhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9UQVJHRVRfVElNRSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtVHlwZSA9PSBQQ00pIHsKKyAgICAgICAgICAgIGludDMyX3QgYml0UGVyRnJhbWUgPSAxNjsKKyAgICAgICAgICAgIGludDMyX3QgYmlnRW5kaWFuID0gMDsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICAgICAgICAgIGlmIChnZXRGb3JtYXQobWV0YSkgPT0gQU1FRElBX09LICYmIG1ldGEgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSwgJmJpdFBlckZyYW1lKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9QQ01fQklHX0VORElBTiwgJmJpZ0VuZGlhbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1ldGEpOworICAgICAgICAgICAgaWYgKGJpZ0VuZGlhbiA9PSAxICYmIGJpdFBlckZyYW1lID09IDE2KSB7CisgICAgICAgICAgICAgICAgLy8gQmlnLWVuZGlhbiAtPiBsaXR0bGUtZW5kaWFuCisgICAgICAgICAgICAgICAgdWludDE2X3QgKmRzdERhdGEgPSAodWludDE2X3QgKilmcmFtZS0+ZGF0YSgpICsgZnJhbWUtPnJhbmdlX29mZnNldCgpOworICAgICAgICAgICAgICAgIHVpbnQxNl90ICpzcmNEYXRhID0gKHVpbnQxNl90ICopZnJhbWUtPmRhdGEoKSArIGZyYW1lLT5yYW5nZV9vZmZzZXQoKTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZyYW1lLT5yYW5nZV9sZW5ndGgoKSAvIDI7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBkc3REYXRhW2ldID0gbnRvaHMoc3JjRGF0YVtpXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgKm91dCA9IGZyYW1lOwogCi0gICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKICAgICB9CiAKICAgICAvLyBFYWNoIGlucHV0IGZyYW1lIGNvbnRhaW5zIG9uZSBvciBtb3JlIE5BTCBmcmFnbWVudHMsIGVhY2ggZnJhZ21lbnQKQEAgLTgyOSw3ICsxMTIxLDcgQEAKICAgICBzaXplX3Qgc3JjU2l6ZSA9IGZyYW1lLT5yYW5nZV9sZW5ndGgoKTsKIAogICAgIHNpemVfdCBkc3RTaXplID0gMDsKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciA9IE5VTEw7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlciA9IE5VTEw7CiAgICAgdWludDhfdCAqZHN0UHRyID0gTlVMTDsKIAogICAgIGZvciAoaW50MzJfdCBwYXNzID0gMDsgcGFzcyA8IDI7ICsrcGFzcykgewpAQCAtODUwLDcgKzExNDIsNyBAQAogICAgICAgICAgICAgICAgIGZyYW1lLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgZnJhbWUgPSBOVUxMOwogCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjT2Zmc2V0ICsgbU5BTFNpemVMZW4gKyBOQUxzaXplID4gc3JjU2l6ZSkgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtODc4LDcgKzExNzAsNyBAQAogICAgICAgICAgICAgZnJhbWUtPnJlbGVhc2UoKTsKICAgICAgICAgICAgIGZyYW1lID0gTlVMTDsKIAotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHBhc3MgPT0gMCkgewpAQCAtODg5LDE2ICsxMTgxLDIwIEBACiAgICAgICAgICAgICAgICAgLy8gZWFjaCA0LWJ5dGUgbmFsIHNpemUgd2l0aCBhIDQtYnl0ZSBzdGFydCBjb2RlCiAgICAgICAgICAgICAgICAgYnVmZmVyID0gZnJhbWU7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1ZmZlciA9IE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKGRzdFNpemUpOworICAgICAgICAgICAgICAgIG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyLCBmYWxzZSAvKiBub25ibG9ja2luZyAqLywgZHN0U2l6ZSAvKiByZXF1ZXN0ZWQgc2l6ZSAqLyk7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgZHN0U2l6ZSk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqZnJhbWVNZXRhID0gZnJhbWUtPm1ldGFfZGF0YSgpOwogICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgICAgICBDSEVDSyhmcmFtZS0+bWV0YV9kYXRhKCkuZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CisgICAgICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50NjQoZnJhbWVNZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsICZ0aW1lVXMpKTsKICAgICAgICAgICAgIGludDMyX3QgaXNTeW5jOwotICAgICAgICAgICAgQ0hFQ0soZnJhbWUtPm1ldGFfZGF0YSgpLmZpbmRJbnQzMihrS2V5SXNTeW5jRnJhbWUsICZpc1N5bmMpKTsKKyAgICAgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmcmFtZU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgJmlzU3luYykpOwogCi0gICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOwotICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIGlzU3luYyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKmJ1Zk1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGJ1Zk1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdGltZVVzKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihidWZNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIGlzU3luYyk7CiAKICAgICAgICAgICAgIGRzdFB0ciA9ICh1aW50OF90ICopYnVmZmVyLT5kYXRhKCk7CiAgICAgICAgIH0KQEAgLTkxMCwxOCArMTIwNiwxMTYgQEAKICAgICB9CiAKICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDBsbCkgewotICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCB0YXJnZXRTYW1wbGVUaW1lVXMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmZmVyLT5tZXRhX2RhdGEoKSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FLCB0YXJnZXRTYW1wbGVUaW1lVXMpOwogICAgIH0KIAogICAgICpvdXQgPSBidWZmZXI7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotTWF0cm9za2FFeHRyYWN0b3I6Ok1hdHJvc2thRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCitlbnVtIFdhdmVJRCB7CisgICAgTUtWX1JJRkZfV0FWRV9GT1JNQVRfUENNID0gMHgwMDAxLAorICAgIE1LVl9SSUZGX1dBVkVfRk9STUFUX0FEUENNX21zID0gMHgwMDAyLAorICAgIE1LVl9SSUZGX1dBVkVfRk9STUFUX0FEUENNX2ltYV93YXYgPSAweDAwMTEsCisgICAgTUtWX1JJRkZfV0FWRV9GT1JNQVRfTVBFR0wxMiA9IDB4MDA1MCwKKyAgICBNS1ZfUklGRl9XQVZFX0ZPUk1BVF9NUEVHTDMgPSAweDAwNTUsCisgICAgTUtWX1JJRkZfV0FWRV9GT1JNQVRfV01BVjEgPSAweDAxNjAsCisgICAgTUtWX1JJRkZfV0FWRV9GT1JNQVRfV01BVjIgPSAweDAxNjEsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqTUtWV2F2ZTJNSU1FKHVpbnQxNl90IGlkKSB7CisgICAgc3dpdGNoIChpZCkgeworICAgICAgICBjYXNlICBNS1ZfUklGRl9XQVZFX0ZPUk1BVF9NUEVHTDEyOgorICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUdfTEFZRVJfSUk7CisKKyAgICAgICAgY2FzZSAgTUtWX1JJRkZfV0FWRV9GT1JNQVRfTVBFR0wzOgorICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUc7CisKKyAgICAgICAgY2FzZSBNS1ZfUklGRl9XQVZFX0ZPUk1BVF9QQ006CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXOworCisgICAgICAgIGNhc2UgTUtWX1JJRkZfV0FWRV9GT1JNQVRfQURQQ01fbXM6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fTVNfQURQQ007CisgICAgICAgIGNhc2UgTUtWX1JJRkZfV0FWRV9GT1JNQVRfQURQQ01faW1hX3dhdjoKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19EVklfSU1BX0FEUENNOworCisgICAgICAgIGNhc2UgTUtWX1JJRkZfV0FWRV9GT1JNQVRfV01BVjE6CisgICAgICAgIGNhc2UgTUtWX1JJRkZfV0FWRV9GT1JNQVRfV01BVjI6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fV01BOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1coInVua25vd24gd2F2ZSAleCIsIGlkKTsKKyAgICAgICAgICAgIHJldHVybiAiIjsKKyAgICB9OworfQorCitzdGF0aWMgYm9vbCBpc01rdkF1ZGlvQ3NkU2l6ZU9LKGNvbnN0IGNoYXIqIG1pbWUsIHNpemVfdCBjc2RTaXplKSB7CisgICAgaWYgKCghc3RyY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX01TX0FEUENNKSAmJiBjc2RTaXplIDwgNTApIHx8CisgICAgICAgICghc3RyY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0RWSV9JTUFfQURQQ00pICYmIGNzZFNpemUgPCAyMCkgfHwKKyAgICAgICAgKCFzdHJjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fV01BKSAmJiBjc2RTaXplIDwgMjgpIHx8CisgICAgICAgICghc3RyY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpICYmIGNzZFNpemUgPCAzMCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gdHJhbnMgYWxsIEZPVVJDQyAgdG8gbG93ZXIgY2hhcgorc3RhdGljIHVpbnQzMl90IEZvdXJDQ3RvTG93ZXIodWludDMyX3QgZm91cmNjKSB7CisgICAgdWludDhfdCBjaF8xID0gdG9sb3dlcigoZm91cmNjID4+IDI0KSAmIDB4ZmYpOworICAgIHVpbnQ4X3QgY2hfMiA9IHRvbG93ZXIoKGZvdXJjYyA+PiAxNikgJiAweGZmKTsKKyAgICB1aW50OF90IGNoXzMgPSB0b2xvd2VyKChmb3VyY2MgPj4gOCkgJiAweGZmKTsKKyAgICB1aW50OF90IGNoXzQgPSB0b2xvd2VyKChmb3VyY2MpICYgMHhmZik7CisgICAgdWludDMyX3QgZm91cmNjX291dCA9IGNoXzEgPDwgMjQgfCBjaF8yIDw8IDE2IHwgY2hfMyA8PCA4IHwgY2hfNDsKKworICAgIHJldHVybiBmb3VyY2Nfb3V0OworfQorCitzdGF0aWMgY29uc3QgY2hhciAqTUtWRm91ckNDMk1JTUUodWludDMyX3QgZm91cmNjKSB7CisgICAgQUxPR1YoIk1LVkZvdXJDQzJNSU1FIGZvdXJjYyAweCU4Ljh4IiwgZm91cmNjKTsKKyAgICB1aW50MzJfdCBsb3dlckZvdXJjYyA9IEZvdXJDQ3RvTG93ZXIoZm91cmNjKTsKKyAgICBzd2l0Y2ggKGxvd2VyRm91cmNjKSB7CisgICAgICAgIGNhc2UgRk9VUkNDKCJtcDR2Iik6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQ7CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoInMyNjMiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImgyNjMiKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19IMjYzOworCisgICAgICAgIGNhc2UgRk9VUkNDKCJhdmMxIik6CisgICAgICAgIGNhc2UgRk9VUkNDKCJoMjY0Iik6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fQVZDOworCisgICAgICAgIGNhc2UgRk9VUkNDKCJtcGcyIik6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzI7CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoInh2aWQiKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19YVklEOworCisgICAgICAgIGNhc2UgRk9VUkNDKCJkaXZ4Iik6CisgICAgICAgIGNhc2UgRk9VUkNDKCJkeDUwIik6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fRElWWDsKKworICAgICAgICBjYXNlIEZPVVJDQygiZGl2MyIpOgorICAgICAgICBjYXNlIEZPVVJDQygiZGl2NCIpOgorICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX0RJVlgzOworCisgICAgICAgIGNhc2UgRk9VUkNDKCJtanBnIik6CisgICAgICAgIGNhc2UgRk9VUkNDKCJtcHBnIik6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fTUpQRUc7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGNoYXIgZm91cmNjU3RyaW5nWzVdOworICAgICAgICAgICAgTWFrZUZvdXJDQ1N0cmluZyhmb3VyY2MsIGZvdXJjY1N0cmluZyk7CisgICAgICAgICAgICBBTE9HVygibWt2IHVuc3VwcG9ydCBmb3VyY2MgJXMiLCBmb3VyY2NTdHJpbmcpOworICAgICAgICAgICAgcmV0dXJuICIiOworICAgIH0KK30KKworCitNYXRyb3NrYUV4dHJhY3Rvcjo6TWF0cm9za2FFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1SZWFkZXIobmV3IERhdGFTb3VyY2VCYXNlUmVhZGVyKG1EYXRhU291cmNlKSksCiAgICAgICBtU2VnbWVudChOVUxMKSwKQEAgLTk1MywxNyArMTM0Nyw1NiBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgLy8gZnJvbSBta3ZwYXJzZXI6OlNlZ21lbnQ6OkxvYWQoKSwgYnV0IHN0b3AgYXQgZmlyc3QgY2x1c3RlcgotICAgIHJldCA9IG1TZWdtZW50LT5QYXJzZUhlYWRlcnMoKTsKLSAgICBpZiAocmV0ID09IDApIHsKLSAgICAgICAgbG9uZyBsZW47Ci0gICAgICAgIHJldCA9IG1TZWdtZW50LT5Mb2FkQ2x1c3Rlcihwb3MsIGxlbik7Ci0gICAgICAgIGlmIChyZXQgPj0gMSkgewotICAgICAgICAgICAgLy8gbm8gbW9yZSBjbHVzdGVycwotICAgICAgICAgICAgcmV0ID0gMDsKKyAgICBpZiAobUlzTGl2ZVN0cmVhbWluZykgeworICAgICAgICAvLyBmcm9tIG1rdnBhcnNlcjo6U2VnbWVudDo6TG9hZCgpLCBidXQgc3RvcCBhdCBmaXJzdCBjbHVzdGVyCisgICAgICAgIHJldCA9IG1TZWdtZW50LT5QYXJzZUhlYWRlcnMoKTsKKyAgICAgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgICAgICBsb25nIGxlbjsKKyAgICAgICAgICAgIHJldCA9IG1TZWdtZW50LT5Mb2FkQ2x1c3Rlcihwb3MsIGxlbik7CisgICAgICAgICAgICBpZiAocmV0ID49IDEpIHsKKyAgICAgICAgICAgICAgICAvLyBubyBtb3JlIGNsdXN0ZXJzCisgICAgICAgICAgICAgICAgcmV0ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7CisgICAgICAgICAgICByZXQgPSBta3ZwYXJzZXI6OkVfQlVGRkVSX05PVF9GVUxMOwogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7Ci0gICAgICAgIHJldCA9IG1rdnBhcnNlcjo6RV9CVUZGRVJfTk9UX0ZVTEw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gbVNlZ21lbnQtPlBhcnNlSGVhZGVycygpOworICAgICAgICBpZiAocmV0IDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIlNlZ21lbnQgcGFyc2UgaGVhZGVyIHJldHVybiBmYWlsICVsbGQiLCByZXQpOworICAgICAgICAgICAgZGVsZXRlIG1TZWdtZW50OworICAgICAgICAgICAgbVNlZ21lbnQgPSBOVUxMOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKHJldCA9PSAwKSB7CisgICAgICAgICAgICBjb25zdCBta3ZwYXJzZXI6OkN1ZXMqIG1DdWVzID0gbVNlZ21lbnQtPkdldEN1ZXMoKTsKKyAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6U2Vla0hlYWQqIG1TSCA9IG1TZWdtZW50LT5HZXRTZWVrSGVhZCgpOworICAgICAgICAgICAgaWYgKChtQ3VlcyA9PSBOVUxMKSAmJiAobVNIICE9IE5VTEwpKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IGNvdW50ID0gbVNILT5HZXRDb3VudCgpOworICAgICAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6U2Vla0hlYWQ6OkVudHJ5KiBtRW50cnk7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IGNvdW50OyBpbmRleCsrKSB7CisgICAgICAgICAgICAgICAgICAgIG1FbnRyeSA9IG1TSC0+R2V0RW50cnkoaW5kZXgpOworICAgICAgICAgICAgICAgICAgICBpZiAobUVudHJ5LT5pZCA9PSBsaWJ3ZWJtOjprTWt2Q3VlcykgeyAvLyBDdWVzIElECisgICAgICAgICAgICAgICAgICAgICAgICBsb25nIGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbG9uZyBwb3M7CisgICAgICAgICAgICAgICAgICAgICAgICBtU2VnbWVudC0+UGFyc2VDdWVzKG1FbnRyeS0+cG9zLCBwb3MsIGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ3VlcyA9IG1TZWdtZW50LT5HZXRDdWVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiZmluZCBjdWUgZGF0YSBieSBzZWVraGVhZCIpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtQ3VlcykgeworICAgICAgICAgICAgICAgIGxvbmcgbGVuOworICAgICAgICAgICAgICAgIHJldCA9IG1TZWdtZW50LT5Mb2FkQ2x1c3Rlcihwb3MsIGxlbik7CisgICAgICAgICAgICAgICAgQUxPR1YoImhhcyBDdWUgZGF0YSwgQ2x1c3RlciBudW09JWxkIiwgbVNlZ21lbnQtPkdldENvdW50KCkpOworICAgICAgICAgICAgfSBlbHNlICB7CisgICAgICAgICAgICAgICAgbG9uZyBzdGF0dXNfTG9hZCA9IG1TZWdtZW50LT5Mb2FkKCk7CisgICAgICAgICAgICAgICAgQUxPR1coIm5vIEN1ZSBkYXRhLFNlZ21lbnQgTG9hZCBzdGF0dXM6JWxkIixzdGF0dXNfTG9hZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAocmV0ID4gMCkgeworICAgICAgICAgICAgcmV0ID0gbWt2cGFyc2VyOjpFX0JVRkZFUl9OT1RfRlVMTDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChyZXQgPCAwKSB7CkBAIC05OTQsMTMgKzE0MjcsMjIgQEAKIAogICAgIGRlbGV0ZSBtUmVhZGVyOwogICAgIG1SZWFkZXIgPSBOVUxMOworCisgICAgZGVsZXRlIG1EYXRhU291cmNlOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQoaSk7CisgICAgICAgIGlmIChpbmZvLT5tTWV0YSkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShpbmZvLT5tTWV0YSk7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIHNpemVfdCBNYXRyb3NrYUV4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7CiAgICAgcmV0dXJuIG1UcmFja3Muc2l6ZSgpOwogfQogCi1NZWRpYVRyYWNrICpNYXRyb3NrYUV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpNYXRyb3NrYUV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CiAgICAgaWYgKGluZGV4ID49IG1UcmFja3Muc2l6ZSgpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTEwMDgsMTEgKzE0NTAsMTEgQEAKICAgICByZXR1cm4gbmV3IE1hdHJvc2thU291cmNlKHRoaXMsIGluZGV4KTsKIH0KIAotc3RhdHVzX3QgTWF0cm9za2FFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IE1hdHJvc2thRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKICAgICBpZiAoaW5kZXggPj0gbVRyYWNrcy5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICBpZiAoKGZsYWdzICYga0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YSkgJiYgIW1FeHRyYWN0ZWRUaHVtYm5haWxzCkBAIC0xMDIxLDggKzE0NjMsNyBAQAogICAgICAgICBtRXh0cmFjdGVkVGh1bWJuYWlscyA9IHRydWU7CiAgICAgfQogCi0gICAgbWV0YSA9IG1UcmFja3MuaXRlbUF0KGluZGV4KS5tTWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1UcmFja3MuaXRlbUF0KGluZGV4KS5tTWV0YSk7CiB9CiAKIGJvb2wgTWF0cm9za2FFeHRyYWN0b3I6OmlzTGl2ZVN0cmVhbWluZygpIGNvbnN0IHsKQEAgLTEwNTcsNyArMTQ5OCw3IEBACiB9CiAKIHN0YXRpYyB2b2lkIGFkZEVTRFNGcm9tQ29kZWNQcml2YXRlKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgYm9vbCBpc0F1ZGlvLCBjb25zdCB2b2lkICpwcml2LCBzaXplX3QgcHJpdlNpemUpIHsKIAogICAgIGludCBwcml2U2l6ZUJ5dGVzUmVxdWlyZWQgPSBieXRlc0ZvclNpemUocHJpdlNpemUpOwpAQCAtMTA4NSwxNCArMTUyNiwxNCBAQAogICAgIHN0b3JlU2l6ZShlc2RzLCBpZHgsIHByaXZTaXplKTsKICAgICBtZW1jcHkoZXNkcyArIGlkeCwgcHJpdiwgcHJpdlNpemUpOwogCi0gICAgbWV0YS5zZXREYXRhKGtLZXlFU0RTLCAwLCBlc2RzLCBlc2RzU2l6ZSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBwcml2LCBwcml2U2l6ZSk7CiAKICAgICBkZWxldGVbXSBlc2RzOwogICAgIGVzZHMgPSBOVUxMOwogfQogCiBzdGF0dXNfdCBhZGRWb3JiaXNDb2RlY0luZm8oCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBjb25zdCB2b2lkICpfY29kZWNQcml2YXRlLCBzaXplX3QgY29kZWNQcml2YXRlU2l6ZSkgewogICAgIC8vIGhleGR1bXAoX2NvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CiAKQEAgLTExNTAsNyArMTU5MSw4IEBACiAgICAgaWYgKGNvZGVjUHJpdmF0ZVtvZmZzZXRdICE9IDB4MDEpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9Ci0gICAgbWV0YS5zZXREYXRhKGtLZXlWb3JiaXNJbmZvLCAwLCAmY29kZWNQcml2YXRlW29mZnNldF0sIGxlbjEpOworICAgIC8vIGZvcm1lcmx5IGtLZXlWb3JiaXNJbmZvCisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCAmY29kZWNQcml2YXRlW29mZnNldF0sIGxlbjEpOwogCiAgICAgb2Zmc2V0ICs9IGxlbjE7CiAgICAgaWYgKGNvZGVjUHJpdmF0ZVtvZmZzZXRdICE9IDB4MDMpIHsKQEAgLTExNjIsMTkgKzE2MDQsMjAgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKLSAgICBtZXRhLnNldERhdGEoCi0gICAgICAgICAgICBrS2V5Vm9yYmlzQm9va3MsIDAsICZjb2RlY1ByaXZhdGVbb2Zmc2V0XSwKLSAgICAgICAgICAgIGNvZGVjUHJpdmF0ZVNpemUgLSBvZmZzZXQpOworICAgIC8vIGZvcm1lcmx5IGtLZXlWb3JiaXNCb29rcworICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMSwKKyAgICAgICAgICAgICZjb2RlY1ByaXZhdGVbb2Zmc2V0XSwgY29kZWNQcml2YXRlU2l6ZSAtIG9mZnNldCk7CiAKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXRpYyBzdGF0dXNfdCBhZGRGbGFjTWV0YWRhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBjb25zdCB2b2lkICpjb2RlY1ByaXZhdGUsIHNpemVfdCBjb2RlY1ByaXZhdGVTaXplKSB7CiAgICAgLy8gaGV4ZHVtcChjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwogCi0gICAgbWV0YS5zZXREYXRhKGtLZXlGbGFjTWV0YWRhdGEsIDAsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgLy8gZm9ybWVybHkga0tleUZsYWNNZXRhZGF0YQorICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKIAogICAgIGludDMyX3QgbWF4SW5wdXRTaXplID0gNjQgPDwgMTA7CiAgICAgRkxBQ0RlY29kZXIgKmZsYWNEZWNvZGVyID0gRkxBQ0RlY29kZXI6OkNyZWF0ZSgpOwpAQCAtMTE5Niw3ICsxNjM5LDcgQEAKICAgICAgICAgICAgICAgICAqIHN0cmVhbUluZm8ubWF4X2Jsb2Nrc2l6ZSAqIHN0cmVhbUluZm8uY2hhbm5lbHM7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbWV0YS5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBtYXhJbnB1dFNpemUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFLCBtYXhJbnB1dFNpemUpOwogCiAgICAgZGVsZXRlIGZsYWNEZWNvZGVyOwogICAgIHJldHVybiBPSzsKQEAgLTEyMjUsMTAgKzE2NjgsOTMgQEAKICAgICB9CiAKICAgICAvLyBPdmVycmlkZSB0aGUgc3ludGhlc2l6ZWQgbmFsIGxlbmd0aCBzaXplLCB3aGljaCBpcyBhcmJpdHJhcnkKLSAgICB0cmFja0luZm8tPm1NZXRhLnNldEludDMyKGtLZXlOYWxMZW5ndGhTaXplLCAwKTsKKyAgICB0cmFja0luZm8tPm1OYWxMZW5ndGhTaXplID0gMDsKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IE1hdHJvc2thRXh0cmFjdG9yOjpzeW50aGVzaXplTVBFRzIoVHJhY2tJbmZvICp0cmFja0luZm8sIHNpemVfdCBpbmRleCkgeworICAgIEFMT0dWKCJzeW50aGVzaXplTVBFRzIiKTsKKyAgICBCbG9ja0l0ZXJhdG9yIGl0ZXIodGhpcywgdHJhY2tJbmZvLT5tVHJhY2tOdW0sIGluZGV4KTsKKyAgICBpZiAoaXRlci5lb3MoKSkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGNvbnN0IG1rdnBhcnNlcjo6QmxvY2sgKmJsb2NrID0gaXRlci5ibG9jaygpOworICAgIGlmIChibG9jay0+R2V0RnJhbWVDb3VudCgpIDw9IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBjb25zdCBta3ZwYXJzZXI6OkJsb2NrOjpGcmFtZSAmZnJhbWUgPSBibG9jay0+R2V0RnJhbWUoMCk7CisgICAgYXV0byB0bXBEYXRhID0gaGVhcGJ1ZmZlcjx1bnNpZ25lZCBjaGFyPihmcmFtZS5sZW4pOworICAgIGxvbmcgbiA9IGZyYW1lLlJlYWQobVJlYWRlciwgdG1wRGF0YS5nZXQoKSk7CisgICAgaWYgKG4gIT0gMCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHNpemVfdCBoZWFkZXJfc3RhcnQgPSAwOworICAgIHNpemVfdCBoZWFkZXJfbGVudGggPSAwOworICAgIGZvciAoaGVhZGVyX3N0YXJ0ID0gMDsgaGVhZGVyX3N0YXJ0IDwgZnJhbWUubGVuIC0gNDsgaGVhZGVyX3N0YXJ0KyspIHsKKyAgICAgICAgaWYgKG50b2hsKDB4MDAwMDAxYjMpID09ICoodWludDMyX3QqKSgodWludDhfdCopdG1wRGF0YS5nZXQoKSArIGhlYWRlcl9zdGFydCkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgaXNDb21wbGV0ZV9jc2QgPSBmYWxzZTsKKyAgICBmb3IgKGhlYWRlcl9sZW50aCA9IDA7IGhlYWRlcl9sZW50aCA8IGZyYW1lLmxlbiAtIDQgLSBoZWFkZXJfc3RhcnQ7IGhlYWRlcl9sZW50aCsrKSB7CisgICAgICAgIGlmIChudG9obCgweDAwMDAwMWI4KSA9PSAqKHVpbnQzMl90KikoKHVpbnQ4X3QqKXRtcERhdGEuZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBoZWFkZXJfc3RhcnQgKyBoZWFkZXJfbGVudGgpKSB7CisgICAgICAgICAgICBpc0NvbXBsZXRlX2NzZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIWlzQ29tcGxldGVfY3NkKSB7CisgICAgICAgIEFMT0dFKCJjYW4ndCBwYXJzZSBjb21wbGV0ZSBjc2QgZm9yIE1QRUcyISIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICBhZGRFU0RTRnJvbUNvZGVjUHJpdmF0ZSh0cmFja0luZm8tPm1NZXRhLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KikodG1wRGF0YS5nZXQoKSkgKyBoZWFkZXJfc3RhcnQsIGhlYWRlcl9sZW50aCk7CisKKyAgICByZXR1cm4gT0s7CisKK30KKworc3RhdHVzX3QgTWF0cm9za2FFeHRyYWN0b3I6OnN5bnRoZXNpemVNUEVHNChUcmFja0luZm8gKnRyYWNrSW5mbywgc2l6ZV90IGluZGV4KSB7CisgICAgQUxPR1YoInN5bnRoZXNpemVNUEVHNCIpOworICAgIEJsb2NrSXRlcmF0b3IgaXRlcih0aGlzLCB0cmFja0luZm8tPm1UcmFja051bSwgaW5kZXgpOworICAgIGlmIChpdGVyLmVvcygpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgY29uc3QgbWt2cGFyc2VyOjpCbG9jayAqYmxvY2sgPSBpdGVyLmJsb2NrKCk7CisgICAgaWYgKGJsb2NrLT5HZXRGcmFtZUNvdW50KCkgPD0gMCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGNvbnN0IG1rdnBhcnNlcjo6QmxvY2s6OkZyYW1lICZmcmFtZSA9IGJsb2NrLT5HZXRGcmFtZSgwKTsKKyAgICBhdXRvIHRtcERhdGEgPSBoZWFwYnVmZmVyPHVuc2lnbmVkIGNoYXI+KGZyYW1lLmxlbik7CisgICAgbG9uZyBuID0gZnJhbWUuUmVhZChtUmVhZGVyLCB0bXBEYXRhLmdldCgpKTsKKyAgICBpZiAobiAhPSAwKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgIHNpemVfdCB2b3NlbmQ7CisgICAgIGJvb2wgaXNDb21wbGV0ZV9jc2QgPSBmYWxzZTsKKyAgICAgZm9yICh2b3NlbmQgPSAwOyAobG9uZyl2b3NlbmQgPCBmcmFtZS5sZW4gLSA0OyB2b3NlbmQrKykgeworICAgICAgICAgaWYgKG50b2hsKDB4MDAwMDAxYjYpID09ICoodWludDMyX3QqKSgodWludDhfdCopdG1wRGF0YS5nZXQoKSArIHZvc2VuZCkpIHsKKyAgICAgICAgICAgICBpc0NvbXBsZXRlX2NzZCA9IHRydWU7CisgICAgICAgICAgICAgYnJlYWs7ICAvLyBTZW5kIFZPUyB1bnRpbCBWT1AKKyAgICAgICAgIH0KKyAgICAgfQorICAgICBpZiAoIWlzQ29tcGxldGVfY3NkKSB7CisgICAgICAgICBBTE9HRSgiY2FuJ3QgcGFyc2UgY29tcGxldGUgY3NkIGZvciBNUEVHNCEiKTsKKyAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgIH0KKyAgICAgYWRkRVNEU0Zyb21Db2RlY1ByaXZhdGUodHJhY2tJbmZvLT5tTWV0YSwgZmFsc2UsIHRtcERhdGEuZ2V0KCksIHZvc2VuZCk7CisKKyAgICByZXR1cm4gT0s7CisKK30KKworCiBzdGF0aWMgaW5saW5lIGJvb2wgaXNWYWxpZEludDMyQ29sb3VyVmFsdWUobG9uZyBsb25nIHZhbHVlKSB7CiAgICAgcmV0dXJuIHZhbHVlICE9IG1rdnBhcnNlcjo6Q29sb3VyOjprVmFsdWVOb3RQcmVzZW50CiAgICAgICAgICAgICAmJiB2YWx1ZSA+PSBJTlQzMl9NSU4KQEAgLTEyNDcsNyArMTc3Myw3IEBACiB9CiAKIHZvaWQgTWF0cm9za2FFeHRyYWN0b3I6OmdldENvbG9ySW5mb3JtYXRpb24oCi0gICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VmlkZW9UcmFjayAqdnRyYWNrLCBNZXRhRGF0YUJhc2UgJm1ldGEpIHsKKyAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpWaWRlb1RyYWNrICp2dHJhY2ssIEFNZWRpYUZvcm1hdCAqbWV0YSkgewogICAgIGNvbnN0IG1rdnBhcnNlcjo6Q29sb3VyICpjb2xvciA9IHZ0cmFjay0+R2V0Q29sb3VyKCk7CiAgICAgaWYgKGNvbG9yID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtMTI1Niw3ICsxNzgyLDcgQEAKICAgICAvLyBDb2xvciBBc3BlY3RzCiAgICAgewogICAgICAgICBpbnQzMl90IHByaW1hcmllcyA9IDI7IC8vIElTTyB1bnNwZWNpZmllZAotICAgICAgICBpbnQzMl90IHRyYW5zZmVyID0gMjsgLy8gSVNPIHVuc3BlY2lmaWVkCisgICAgICAgIGludDMyX3QgaXNvdHJhbnNmZXIgPSAyOyAvLyBJU08gdW5zcGVjaWZpZWQKICAgICAgICAgaW50MzJfdCBjb2VmZnMgPSAyOyAvLyBJU08gdW5zcGVjaWZpZWQKICAgICAgICAgYm9vbCBmdWxsUmFuZ2UgPSBmYWxzZTsgLy8gZGVmYXVsdAogICAgICAgICBib29sIHJhbmdlU3BlY2lmaWVkID0gZmFsc2U7CkBAIC0xMjY1LDcgKzE3OTEsNyBAQAogICAgICAgICAgICAgcHJpbWFyaWVzID0gY29sb3ItPnByaW1hcmllczsKICAgICAgICAgfQogICAgICAgICBpZiAoaXNWYWxpZEludDMyQ29sb3VyVmFsdWUoY29sb3ItPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljcykpIHsKLSAgICAgICAgICAgIHRyYW5zZmVyID0gY29sb3ItPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljczsKKyAgICAgICAgICAgIGlzb3RyYW5zZmVyID0gY29sb3ItPnRyYW5zZmVyX2NoYXJhY3RlcmlzdGljczsKICAgICAgICAgfQogICAgICAgICBpZiAoaXNWYWxpZEludDMyQ29sb3VyVmFsdWUoY29sb3ItPm1hdHJpeF9jb2VmZmljaWVudHMpKSB7CiAgICAgICAgICAgICBjb2VmZnMgPSBjb2xvci0+bWF0cml4X2NvZWZmaWNpZW50czsKQEAgLTEyNzgsMTQgKzE4MDQsMjEgQEAKICAgICAgICAgICAgIHJhbmdlU3BlY2lmaWVkID0gdHJ1ZTsKICAgICAgICAgfQogCi0gICAgICAgIENvbG9yQXNwZWN0cyBhc3BlY3RzOwotICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMoCi0gICAgICAgICAgICAgICAgcHJpbWFyaWVzLCB0cmFuc2ZlciwgY29lZmZzLCBmdWxsUmFuZ2UsIGFzcGVjdHMpOwotICAgICAgICBtZXRhLnNldEludDMyKGtLZXlDb2xvclByaW1hcmllcywgYXNwZWN0cy5tUHJpbWFyaWVzKTsKLSAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5VHJhbnNmZXJGdW5jdGlvbiwgYXNwZWN0cy5tVHJhbnNmZXIpOwotICAgICAgICBtZXRhLnNldEludDMyKGtLZXlDb2xvck1hdHJpeCwgYXNwZWN0cy5tTWF0cml4Q29lZmZzKTsKLSAgICAgICAgbWV0YS5zZXRJbnQzMigKLSAgICAgICAgICAgICAgICBrS2V5Q29sb3JSYW5nZSwgcmFuZ2VTcGVjaWZpZWQgPyBhc3BlY3RzLm1SYW5nZSA6IENvbG9yQXNwZWN0czo6UmFuZ2VVbnNwZWNpZmllZCk7CisgICAgICAgIGludDMyX3QgcmFuZ2UgPSAwOworICAgICAgICBpbnQzMl90IHN0YW5kYXJkID0gMDsKKyAgICAgICAgaW50MzJfdCB0cmFuc2ZlciA9IDA7CisgICAgICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb1BsYXRmb3JtQXNwZWN0cygKKyAgICAgICAgICAgICAgICBwcmltYXJpZXMsIGlzb3RyYW5zZmVyLCBjb2VmZnMsIGZ1bGxSYW5nZSwKKyAgICAgICAgICAgICAgICAmcmFuZ2UsICZzdGFuZGFyZCwgJnRyYW5zZmVyKTsKKyAgICAgICAgaWYgKHJhbmdlICE9IDApIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1JBTkdFLCByYW5nZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YW5kYXJkICE9IDApIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1NUQU5EQVJELCBzdGFuZGFyZCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRyYW5zZmVyICE9IDApIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1RSQU5TRkVSLCB0cmFuc2Zlcik7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBIRFIgU3RhdGljIEluZm8KQEAgLTEzMjksMjYgKzE4NjIsMjggQEAKICAgICAgICAgLy8gT25seSBhZHZlcnRpc2Ugc3RhdGljIGluZm8gaWYgYXQgbGVhc3Qgb25lIG9mIHRoZSBncm91cHMgaGF2ZSBiZWVuIHNwZWNpZmllZC4KICAgICAgICAgaWYgKG1lbWNtcCgmaW5mbywgJm51bGxJbmZvLCBzaXplb2YoaW5mbykpICE9IDApIHsKICAgICAgICAgICAgIGluZm8ubUlEID0gSERSU3RhdGljSW5mbzo6a1R5cGUxOwotICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlIZHJTdGF0aWNJbmZvLCAnaGRyUycsICZpbmZvLCBzaXplb2YoaW5mbykpOworICAgICAgICAgICAgQ29sb3JVdGlsczo6c2V0SERSU3RhdGljSW5mb0ludG9BTWVkaWFGb3JtYXQoaW5mbywgbWV0YSk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKIHN0YXR1c190IE1hdHJvc2thRXh0cmFjdG9yOjppbml0VHJhY2tJbmZvKAotICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrICp0cmFjaywgTWV0YURhdGFCYXNlICZtZXRhLCBUcmFja0luZm8gKnRyYWNrSW5mbykgeworICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrICp0cmFjaywgQU1lZGlhRm9ybWF0ICptZXRhLCBUcmFja0luZm8gKnRyYWNrSW5mbykgewogICAgIHRyYWNrSW5mby0+bVRyYWNrTnVtID0gdHJhY2stPkdldE51bWJlcigpOwogICAgIHRyYWNrSW5mby0+bU1ldGEgPSBtZXRhOwogICAgIHRyYWNrSW5mby0+bUV4dHJhY3RvciA9IHRoaXM7CiAgICAgdHJhY2tJbmZvLT5tRW5jcnlwdGVkID0gZmFsc2U7CiAgICAgdHJhY2tJbmZvLT5tSGVhZGVyID0gTlVMTDsKICAgICB0cmFja0luZm8tPm1IZWFkZXJMZW4gPSAwOworICAgIHRyYWNrSW5mby0+bU5hbExlbmd0aFNpemUgPSAtMTsKIAogICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCB0cmFjay0+R2V0Q29udGVudEVuY29kaW5nQ291bnQoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q29udGVudEVuY29kaW5nICplbmNvZGluZyA9IHRyYWNrLT5HZXRDb250ZW50RW5jb2RpbmdCeUluZGV4KGkpOwogICAgICAgICBmb3Ioc2l6ZV90IGogPSAwOyBqIDwgZW5jb2RpbmctPkdldEVuY3J5cHRpb25Db3VudCgpOyBqKyspIHsKICAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q29udGVudEVuY29kaW5nOjpDb250ZW50RW5jcnlwdGlvbiAqZW5jcnlwdGlvbjsKICAgICAgICAgICAgIGVuY3J5cHRpb24gPSBlbmNvZGluZy0+R2V0RW5jcnlwdGlvbkJ5SW5kZXgoaik7Ci0gICAgICAgICAgICB0cmFja0luZm8tPm1NZXRhLnNldERhdGEoa0tleUNyeXB0b0tleSwgMCwgZW5jcnlwdGlvbi0+a2V5X2lkLCBlbmNyeXB0aW9uLT5rZXlfaWRfbGVuKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIodHJhY2tJbmZvLT5tTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fS0VZLCBlbmNyeXB0aW9uLT5rZXlfaWQsIGVuY3J5cHRpb24tPmtleV9pZF9sZW4pOwogICAgICAgICAgICAgdHJhY2tJbmZvLT5tRW5jcnlwdGVkID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMzczLDYgKzE5MDgsOCBAQAogdm9pZCBNYXRyb3NrYUV4dHJhY3Rvcjo6YWRkVHJhY2tzKCkgewogICAgIGNvbnN0IG1rdnBhcnNlcjo6VHJhY2tzICp0cmFja3MgPSBtU2VnbWVudC0+R2V0VHJhY2tzKCk7CiAKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBudWxscHRyOworCiAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHRyYWNrcy0+R2V0VHJhY2tzQ291bnQoKTsgKytpbmRleCkgewogICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrICp0cmFjayA9IHRyYWNrcy0+R2V0VHJhY2tCeUluZGV4KGluZGV4KTsKIApAQCAtMTM5Nyw5ICsxOTM0LDE2IEBACiAKICAgICAgICAgZW51bSB7IFZJREVPX1RSQUNLID0gMSwgQVVESU9fVFJBQ0sgPSAyIH07CiAKLSAgICAgICAgTWV0YURhdGFCYXNlIG1ldGE7CisgICAgICAgIGlmIChtZXRhKSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfY2xlYXIobWV0YSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgICAgICB9CiAKICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgICAgIGludDMyX3QgbmFsU2l6ZSA9IC0xOworCisgICAgICAgIGJvb2wgaXNTZXRDc2RGcm9tMXN0RnJhbWUgPSBmYWxzZTsKIAogICAgICAgICBzd2l0Y2ggKHRyYWNrLT5HZXRUeXBlKCkpIHsKICAgICAgICAgICAgIGNhc2UgVklERU9fVFJBQ0s6CkBAIC0xNDA4LDM3ICsxOTUyLDk1IEBACiAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IG1rdnBhcnNlcjo6VmlkZW9UcmFjayAqPih0cmFjayk7CiAKICAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcCgiVl9NUEVHNC9JU08vQVZDIiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlBVkNDLCAwLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZWNQcml2YXRlU2l6ZSA+IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbFNpemUgPSAxICsgKGNvZGVjUHJpdmF0ZVs0XSAmIDMpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJWX01QRUdIL0lTTy9IRVZDIiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjUHJpdmF0ZVNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleUhWQ0MsIGtUeXBlSFZDQywgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF9IRVZDLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjUHJpdmF0ZVNpemUgPiAxNCArIDcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYWxTaXplID0gMSArIChjb2RlY1ByaXZhdGVbMTQgKyA3XSAmIDMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIkhFVkMgaXMgZGV0ZWN0ZWQsIGJ1dCBkb2VzIG5vdCBoYXZlIGNvbmZpZ3VyYXRpb24uIik7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiVl9NUEVHNC9JU08vQVNQIiwgY29kZWNJRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpOwogICAgICAgICAgICAgICAgICAgICBpZiAoY29kZWNQcml2YXRlU2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFU0RTRnJvbUNvZGVjUHJpdmF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgZmFsc2UsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMgaXMgZGV0ZWN0ZWQsIGJ1dCBkb2VzIG5vdCBoYXZlIGNvbmZpZ3VyYXRpb24uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNJRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzU2V0Q3NkRnJvbTFzdEZyYW1lID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiVl9WUDgiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19WUDgpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfVklERU9fVlA4KTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIlZfVlA5IiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fVlA5KTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlY1ByaXZhdGVTaXplID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgIC8vICdjc2QtMCcgZm9yIFZQOSBpcyB0aGUgQmxvYiBvZiBDb2RlYyBQcml2YXRlIGRhdGEgYXMKICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWZpZWQgaW4gaHR0cDovL3d3dy53ZWJtcHJvamVjdC5vcmcvdnA5L3Byb2ZpbGVzLy4KLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlWcDlDb2RlY1ByaXZhdGUsIDAsIGNvZGVjUHJpdmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiVl9BVjEiLCBjb2RlY0lEKSkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVYxKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjUHJpdmF0ZVNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyAnY3NkLTAnIGZvciBBVjEgaXMgdGhlIEJsb2Igb2YgQ29kZWMgUHJpdmF0ZSBkYXRhIGFzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWZpZWQgaW4gaHR0cHM6Ly9hb21lZGlhY29kZWMuZ2l0aHViLmlvL2F2MS1pc29ibWZmLy4KKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIlZfTVBFRzIiLCBjb2RlY0lEKSB8fCAhc3RyY21wKCJWX01QRUcxIiwgY29kZWNJRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29kZWNQcml2YXRlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFU0RTRnJvbUNvZGVjUHJpdmF0ZShtZXRhLCBmYWxzZSwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIk5vIHNwZWNpZmljIGNvZGVjIHByaXZhdGUgZGF0YSwgZmluZCBpdCBmcm9tIHRoZSBmaXJzdCBmcmFtZSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2V0Q3NkRnJvbTFzdEZyYW1lID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIlZfTUpQRUciLCBjb2RlY0lEKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX01KUEVHKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIlZfTVMvVkZXL0ZPVVJDQyIsIGNvZGVjSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChOVUxMID09IGNvZGVjUHJpdmF0ZSB8fGNvZGVjUHJpdmF0ZVNpemUgPCAyMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlZfTVMvVkZXL0ZPVVJDQyBoYXMgbm8gdmFsaWQgcHJpdmF0ZSBkYXRhKCVwKSxjb2RlY1ByaXZhdGVTaXplOiV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBmb3VyY2MgPSAqKHVpbnQzMl90ICopKGNvZGVjUHJpdmF0ZSArIDE2KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvdXJjYyA9IG50b2hsKGZvdXJjYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtaW1lID0gTUtWRm91ckNDMk1JTUUoZm91cmNjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJWX01TL1ZGVy9GT1VSQ0MgdHlwZSBpcyAlcyIsIG1pbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgbWltZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJWX01TL1ZGVy9GT1VSQ0MgY29udGludWUsdW5zdXBwb3J0IHZpZGVvIHR5cGU9JXMsZm91cmNjPTB4JTA4eC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWltZSwgZm91cmNjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RyY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fWFZJRCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0RJVlgpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19ESVZYMykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NldENzZEZyb20xc3RGcmFtZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJGb3VyQ0MgaGF2ZSB1bnN1cHBvcnQgY29kZWMsIHR5cGU9JXMsZm91cmNjPTB4JTA4eC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWUsIGZvdXJjYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMgaXMgbm90IHN1cHBvcnRlZC4iLCBjb2RlY0lEKTsKQEAgLTE0NTUsOCArMjA1Nyw4IEBACiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJ0cmFjayBoZWlnaHQgZXhjZWVkcyBpbnQzMl90LCAlbGxkIiwgaGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleVdpZHRoLCAoaW50MzJfdCl3aWR0aCk7Ci0gICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5SGVpZ2h0LCAoaW50MzJfdCloZWlnaHQpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCAoaW50MzJfdCl3aWR0aCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULCAoaW50MzJfdCloZWlnaHQpOwogCiAgICAgICAgICAgICAgICAgLy8gc2V0dGluZyBkaXNwbGF5IHdpZHRoL2hlaWdodCBpcyBvcHRpb25hbAogICAgICAgICAgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBkaXNwbGF5VW5pdCA9IHZ0cmFjay0+R2V0RGlzcGxheVVuaXQoKTsKQEAgLTE0NjYsOCArMjA2OCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGlzcGxheUhlaWdodCA+IDAgJiYgZGlzcGxheUhlaWdodCA8PSBJTlQzMl9NQVgpIHsKICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChkaXNwbGF5VW5pdCkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IC8vIHBpeGVscwotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5RGlzcGxheVdpZHRoLCAoaW50MzJfdClkaXNwbGF5V2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5RGlzcGxheUhlaWdodCwgKGludDMyX3QpZGlzcGxheUhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX1dJRFRILCAoaW50MzJfdClkaXNwbGF5V2lkdGgpOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9IRUlHSFQsIChpbnQzMl90KWRpc3BsYXlIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTogLy8gY2VudGltZXRlcnMKICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOiAvLyBpbmNoZXMKQEAgLTE0ODEsOCArMjA4NSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9uZyBsb25nIGNvbXB1dGVkSGVpZ2h0ID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXgoaGVpZ2h0LCB3aWR0aCAqIGRpc3BsYXlIZWlnaHQgLyBkaXNwbGF5V2lkdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXB1dGVkV2lkdGggPD0gSU5UMzJfTUFYICYmIGNvbXB1dGVkSGVpZ2h0IDw9IElOVDMyX01BWCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleURpc3BsYXlXaWR0aCwgKGludDMyX3QpY29tcHV0ZWRXaWR0aCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5RGlzcGxheUhlaWdodCwgKGludDMyX3QpY29tcHV0ZWRIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX1dJRFRILCAoaW50MzJfdCljb21wdXRlZFdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9IRUlHSFQsIChpbnQzMl90KWNvbXB1dGVkSGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0xNTAyLDM0ICsyMTA4LDc3IEBACiAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IG1rdnBhcnNlcjo6QXVkaW9UcmFjayAqPih0cmFjayk7CiAKICAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcCgiQV9BQUMiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhjb2RlY1ByaXZhdGVTaXplID49IDIpOwotCisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOworICAgICAgICAgICAgICAgICAgICBpZiAoY29kZWNQcml2YXRlU2l6ZSA8IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJJbmNvbXBsZXRlIEFBQyBDb2RlYyBJbmZvICV6dSBieXRlIiwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBhZGRFU0RTRnJvbUNvZGVjUHJpdmF0ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCB0cnVlLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiQV9WT1JCSVMiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKTsKIAogICAgICAgICAgICAgICAgICAgICBlcnIgPSBhZGRWb3JiaXNDb2RlY0luZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIkFfT1BVUyIsIGNvZGVjSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpOwotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleU9wdXNIZWFkZXIsIDAsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50NjQoa0tleU9wdXNDb2RlY0RlbGF5LCB0cmFjay0+R2V0Q29kZWNEZWxheSgpKTsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQ2NChrS2V5T3B1c1NlZWtQcmVSb2xsLCB0cmFjay0+R2V0U2Vla1ByZVJvbGwoKSk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjb2RlY0RlbGF5ID0gdHJhY2stPkdldENvZGVjRGVsYXkoKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzEsICZjb2RlY0RlbGF5LCBzaXplb2YoY29kZWNEZWxheSkpOwogICAgICAgICAgICAgICAgICAgICBtU2Vla1ByZVJvbGxOcyA9IHRyYWNrLT5HZXRTZWVrUHJlUm9sbCgpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMiwgJm1TZWVrUHJlUm9sbE5zLCBzaXplb2YobVNlZWtQcmVSb2xsTnMpKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIkFfTVBFRy9MMyIsIGNvZGVjSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRyk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJBX0ZMQUMiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpOwogICAgICAgICAgICAgICAgICAgICBlcnIgPSBhZGRGbGFjTWV0YWRhdGEobWV0YSwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIkFfTVBFRy9MMiIsIGNvZGVjSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUdfTEFZRVJfSUkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiQV9QQ00vSU5UL0xJVCIsIGNvZGVjSUQpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcCgiQV9QQ00vSU5UL0JJRyIsIGNvZGVjSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYmlnRW5kaWFuID0gIXN0cmNtcCgiQV9QQ00vSU5UL0JJRyIsIGNvZGVjSUQpID8gMTogMDsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9QQ01fQklHX0VORElBTiwgYmlnRW5kaWFuKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCghc3RyY21wKCJBX01TL0FDTSIsIGNvZGVjSUQpKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKE5VTEwgPT0gY29kZWNQcml2YXRlKSB8fCAoY29kZWNQcml2YXRlU2l6ZSA8IDE4KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coInVuc3VwcG9ydGVkIGF1ZGlvOiBBX01TL0FDTSBoYXMgbm8gdmFsaWQgcHJpdmF0ZSBkYXRhOiAlcywgc2l6ZTogJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY1ByaXZhdGUgPT0gTlVMTCA/ICJudWxsIiA6ICJub24tbnVsbCIsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBJRCA9ICoodWludDE2X3QgKiljb2RlY1ByaXZhdGU7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtaW1lID0gTUtWV2F2ZTJNSU1FKElEKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBX01TL0FDTSB0eXBlIGlzICVzIiwgbWltZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKCJhdWRpby8iLCBtaW1lLCA2KSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc01rdkF1ZGlvQ3NkU2l6ZU9LKG1pbWUsIGNvZGVjUHJpdmF0ZVNpemUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIG1pbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQV9NUy9BQ00gY29udGludWUsIHVuc3VwcG9ydGVkIGF1ZGlvIHR5cGU9JXMsIGNzZFNpemU6JXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWltZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19XTUEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRVNEU0Zyb21Db2RlY1ByaXZhdGUobWV0YSwgdHJ1ZSwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19NU19BRFBDTSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRFZJX0lNQV9BRFBDTSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBibG9ja0FsaWduID0gKih1aW50MTZfdCopKGNvZGVjUHJpdmF0ZSArIDEyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFU0RTRnJvbUNvZGVjUHJpdmF0ZShtZXRhLCB0cnVlLCAmYmxvY2tBbGlnbiwgc2l6ZW9mKGJsb2NrQWxpZ24pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBpcyBub3Qgc3VwcG9ydGVkLiIsIGNvZGVjSUQpOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBhdHJhY2stPkdldFNhbXBsaW5nUmF0ZSgpKTsKLSAgICAgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGF0cmFjay0+R2V0Q2hhbm5lbHMoKSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIGF0cmFjay0+R2V0U2FtcGxpbmdSYXRlKCkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIGF0cmFjay0+R2V0Q2hhbm5lbHMoKSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQklUU19QRVJfU0FNUExFLCBhdHJhY2stPkdldEJpdERlcHRoKCkpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC0xNTQyLDcgKzIxOTEsNyBAQAogICAgICAgICAgICBjaGFyIGxhbmdbNF07CiAgICAgICAgICAgIHN0cm5jcHkobGFuZywgbGFuZ3VhZ2UsIDMpOwogICAgICAgICAgICBsYW5nWzNdID0gJ1wwJzsKLSAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNZWRpYUxhbmd1YWdlLCBsYW5nKTsKKyAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0xBTkdVQUdFLCBsYW5nKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTE1NTEsMjAgKzIyMDAsNTQgQEAKICAgICAgICAgfQogCiAgICAgICAgIGxvbmcgbG9uZyBkdXJhdGlvbk5zID0gbVNlZ21lbnQtPkdldER1cmF0aW9uKCk7Ci0gICAgICAgIG1ldGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCAoZHVyYXRpb25OcyArIDUwMCkgLyAxMDAwKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIChkdXJhdGlvbk5zICsgNTAwKSAvIDEwMDApOworCisgICAgICAgIGNvbnN0IGNoYXIgKm1pbWV0eXBlID0gIiI7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1ldHlwZSkpIHsKKyAgICAgICAgICAgIC8vIGRvIG5vdCBhZGQgdGhpcyB0cmFjayB0byB0aGUgdHJhY2sgbGlzdAorICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nIHRyYWNrIHdpdGggdW5rbm93biBtaW1lIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQogCiAgICAgICAgIG1UcmFja3MucHVzaCgpOwogICAgICAgICBzaXplX3QgbiA9IG1UcmFja3Muc2l6ZSgpIC0gMTsKICAgICAgICAgVHJhY2tJbmZvICp0cmFja0luZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KG4pOwogICAgICAgICBpbml0VHJhY2tJbmZvKHRyYWNrLCBtZXRhLCB0cmFja0luZm8pOworICAgICAgICB0cmFja0luZm8tPm1OYWxMZW5ndGhTaXplID0gbmFsU2l6ZTsKIAotICAgICAgICBpZiAoIXN0cmNtcCgiVl9NUEVHNC9JU08vQVZDIiwgY29kZWNJRCkgJiYgY29kZWNQcml2YXRlU2l6ZSA9PSAwKSB7CisgICAgICAgIGlmICgoIXN0cmNtcCgiVl9NUEVHNC9JU08vQVZDIiwgY29kZWNJRCkgJiYgY29kZWNQcml2YXRlU2l6ZSA9PSAwKSB8fAorICAgICAgICAgICAgKCFzdHJjbXAobWltZXR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykgJiYgaXNTZXRDc2RGcm9tMXN0RnJhbWUpKSB7CiAgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIHJlY292ZXIgZnJvbSBBVkMgdHJhY2sgd2l0aG91dCBjb2RlYyBwcml2YXRlIGRhdGEKICAgICAgICAgICAgIGVyciA9IHN5bnRoZXNpemVBVkNDKHRyYWNrSW5mbywgbik7CiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgbVRyYWNrcy5wb3AoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgoIXN0cmNtcCgiVl9NUEVHMiIsIGNvZGVjSUQpICYmIGNvZGVjUHJpdmF0ZVNpemUgPT0gMCkgfHwKKyAgICAgICAgICAgICghc3RyY21wKG1pbWV0eXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMikgJiYgaXNTZXRDc2RGcm9tMXN0RnJhbWUpKSB7CisgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIHJlY292ZXIgZnJvbSBNUEVHMiB0cmFjayB3aXRob3V0IGNvZGVjIHByaXZhdGUgZGF0YQorICAgICAgICAgICAgZXJyID0gc3ludGhlc2l6ZU1QRUcyKHRyYWNrSW5mbywgbik7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgbVRyYWNrcy5wb3AoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICgoIXN0cmNtcCgiVl9NUEVHNC9JU08vQVNQIiwgY29kZWNJRCkgJiYgY29kZWNQcml2YXRlU2l6ZSA9PSAwKSB8fAorICAgICAgICAgICAgKCFzdHJjbXAobWltZXR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KSAmJiBpc1NldENzZEZyb20xc3RGcmFtZSkgfHwKKyAgICAgICAgICAgICghc3RyY21wKG1pbWV0eXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19YVklEKSAmJiBpc1NldENzZEZyb20xc3RGcmFtZSkgfHwKKyAgICAgICAgICAgICghc3RyY21wKG1pbWV0eXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19ESVZYKSAmJiBpc1NldENzZEZyb20xc3RGcmFtZSkgfHwKKyAgICAgICAgICAgICghc3RyY21wKG1pbWV0eXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19ESVZYMykgJiYgaXNTZXRDc2RGcm9tMXN0RnJhbWUpKSB7CisgICAgICAgICAgICAvLyBBdHRlbXB0IHRvIHJlY292ZXIgZnJvbSBNUEVHNCB0cmFjayB3aXRob3V0IGNvZGVjIHByaXZhdGUgZGF0YQorICAgICAgICAgICAgZXJyID0gc3ludGhlc2l6ZU1QRUc0KHRyYWNrSW5mbywgbik7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgbVRyYWNrcy5wb3AoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICAvLyB0aGUgVHJhY2tJbmZvIG93bnMgdGhlIG1ldGFkYXRhIG5vdworICAgICAgICBtZXRhID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKG1ldGEpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtZXRhKTsKICAgICB9CiB9CiAKQEAgLTE1NzMsNyArMjI1Niw3IEBACiAgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQoaSk7CiAKICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgQ0hFQ0soaW5mby0+bU1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKGluZm8tPm1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSk7CiAKICAgICAgICAgaWYgKHN0cm5jYXNlY21wKG1pbWUsICJ2aWRlby8iLCA2KSkgewogICAgICAgICAgICAgY29udGludWU7CkBAIC0xNTk5LDE2ICsyMjgyLDE2IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpdGVyLmFkdmFuY2UoKTsKICAgICAgICAgfQotICAgICAgICBpbmZvLT5tTWV0YS5zZXRJbnQ2NChrS2V5VGh1bWJuYWlsVGltZSwgdGh1bWJuYWlsVGltZVVzKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGluZm8tPm1NZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1RJTUUsIHRodW1ibmFpbFRpbWVVcyk7CiAgICAgfQogfQogCi1zdGF0dXNfdCBNYXRyb3NrYUV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgbWV0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAga0tleU1JTUVUeXBlLAotICAgICAgICAgICAgbUlzV2VibSA/ICJ2aWRlby93ZWJtIiA6IE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NQVRST1NLQSk7CittZWRpYV9zdGF0dXNfdCBNYXRyb3NrYUV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBtSXNXZWJtID8gInZpZGVvL3dlYm0iIDogTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01BVFJPU0tBKTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiB1aW50MzJfdCBNYXRyb3NrYUV4dHJhY3Rvcjo6ZmxhZ3MoKSBjb25zdCB7CkBAIC0xNjIxLDcgKzIzMDQsNyBAQAogfQogCiBib29sIFNuaWZmTWF0cm9za2EoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKICAgICBEYXRhU291cmNlQmFzZVJlYWRlciByZWFkZXIoc291cmNlKTsKICAgICBta3ZwYXJzZXI6OkVCTUxIZWFkZXIgZWJtbEhlYWRlcjsKICAgICBsb25nIGxvbmcgcG9zOwpAQCAtMTYzNCwyOCArMjMxNyw0MCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCitzdGF0aWMgY29uc3QgY2hhciAqZXh0ZW5zaW9uc1tdID0geworICAgICJta2EiLAorICAgICJta3YiLAorICAgICJ3ZWJtIiwKKyAgICBOVUxMCit9OwogCiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICBVVUlEKCJhYmJlZGQ5Mi0zOGM0LTQ5MDQtYTRjMS1iM2Y0NWY4OTk5ODAiKSwKICAgICAgICAgMSwKICAgICAgICAgIk1hdHJvc2thIEV4dHJhY3RvciIsCi0gICAgICAgIFtdKAotICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCi0gICAgICAgICAgICAgICAgdm9pZCAqKiwKLSAgICAgICAgICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICopIC0+IE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyB7Ci0gICAgICAgICAgICBpZiAoU25pZmZNYXRyb3NrYShzb3VyY2UsIGNvbmZpZGVuY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFtdKAotICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gTWVkaWFFeHRyYWN0b3IqIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNYXRyb3NrYUV4dHJhY3Rvcihzb3VyY2UpO307CisgICAgICAgIHsKKyAgICAgICAgICAgIC52MyA9IHsKKyAgICAgICAgICAgICAgICBbXSgKKyAgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKiosCisgICAgICAgICAgICAgICAgICAgIEZyZWVNZXRhRnVuYyAqKSAtPiBDcmVhdG9yRnVuYyB7CisgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKHNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChTbmlmZk1hdHJvc2thKCZoZWxwZXIsIGNvbmZpZGVuY2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gQ01lZGlhRXh0cmFjdG9yKiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAobmV3IE1hdHJvc2thRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKHNvdXJjZSkpKTt9OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KICAgICB9OwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmgKaW5kZXggMzU2OGVhMS4uOTlmYWQxNyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5oCkBAIC0yMCw4ICsyMCw5IEBACiAKICNpbmNsdWRlICJta3ZwYXJzZXIvbWt2cGFyc2VyLmgiCiAKLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KIApAQCAtMzQsMTYgKzM1LDE2IEBACiBzdHJ1Y3QgRGF0YVNvdXJjZUJhc2VSZWFkZXI7CiBzdHJ1Y3QgTWF0cm9za2FTb3VyY2U7CiAKLXN0cnVjdCBNYXRyb3NrYUV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7Ci0gICAgZXhwbGljaXQgTWF0cm9za2FFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CitzdHJ1Y3QgTWF0cm9za2FFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgeworICAgIGV4cGxpY2l0IE1hdHJvc2thRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwogCi0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlciAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKIAogICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKIApAQCAtNTcsOSArNTgsMTUgQEAKICAgICBmcmllbmQgc3RydWN0IEJsb2NrSXRlcmF0b3I7CiAKICAgICBzdHJ1Y3QgVHJhY2tJbmZvIHsKKyAgICAgICAgVHJhY2tJbmZvKCkgeworICAgICAgICAgICAgbU1ldGEgPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgflRyYWNrSW5mbygpIHsKKyAgICAgICAgfQogICAgICAgICB1bnNpZ25lZCBsb25nIG1UcmFja051bTsKICAgICAgICAgYm9vbCBtRW5jcnlwdGVkOwotICAgICAgICBNZXRhRGF0YUJhc2UgbU1ldGE7CisgICAgICAgIEFNZWRpYUZvcm1hdCAqbU1ldGE7CiAgICAgICAgIGNvbnN0IE1hdHJvc2thRXh0cmFjdG9yICptRXh0cmFjdG9yOwogICAgICAgICBWZWN0b3I8Y29uc3QgbWt2cGFyc2VyOjpDdWVQb2ludCo+IG1DdWVQb2ludHM7CiAKQEAgLTY4LDYgKzc1LDcgQEAKICAgICAgICAgLy8gaW4gfk1hdHJvc2thRXh0cmFjdG9yLgogICAgICAgICB1bnNpZ25lZCBjaGFyICptSGVhZGVyOwogICAgICAgICBzaXplX3QgbUhlYWRlckxlbjsKKyAgICAgICAgaW50MzJfdCBtTmFsTGVuZ3RoU2l6ZTsKIAogICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrKiBnZXRUcmFjaygpIGNvbnN0OwogICAgICAgICBjb25zdCBta3ZwYXJzZXI6OkN1ZVBvaW50OjpUcmFja1Bvc2l0aW9uICpmaW5kKGxvbmcgbG9uZyB0aW1lTnMpIGNvbnN0OwpAQCAtNzYsNyArODQsNyBAQAogICAgIE11dGV4IG1Mb2NrOwogICAgIFZlY3RvcjxUcmFja0luZm8+IG1UcmFja3M7CiAKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAgICAgRGF0YVNvdXJjZUJhc2VSZWFkZXIgKm1SZWFkZXI7CiAgICAgbWt2cGFyc2VyOjpTZWdtZW50ICptU2VnbWVudDsKICAgICBib29sIG1FeHRyYWN0ZWRUaHVtYm5haWxzOwpAQCAtODUsMTUgKzkzLDE3IEBACiAgICAgaW50NjRfdCBtU2Vla1ByZVJvbGxOczsKIAogICAgIHN0YXR1c190IHN5bnRoZXNpemVBVkNDKFRyYWNrSW5mbyAqdHJhY2tJbmZvLCBzaXplX3QgaW5kZXgpOworICAgIHN0YXR1c190IHN5bnRoZXNpemVNUEVHMihUcmFja0luZm8gKnRyYWNrSW5mbywgc2l6ZV90IGluZGV4KTsKKyAgICBzdGF0dXNfdCBzeW50aGVzaXplTVBFRzQoVHJhY2tJbmZvICp0cmFja0luZm8sIHNpemVfdCBpbmRleCk7CiAgICAgc3RhdHVzX3QgaW5pdFRyYWNrSW5mbygKICAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VHJhY2sgKnRyYWNrLAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICAgICAgVHJhY2tJbmZvICp0cmFja0luZm8pOwogICAgIHZvaWQgYWRkVHJhY2tzKCk7CiAgICAgdm9pZCBmaW5kVGh1bWJuYWlscygpOwogICAgIHZvaWQgZ2V0Q29sb3JJbmZvcm1hdGlvbigKICAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VmlkZW9UcmFjayAqdnRyYWNrLAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAgICAgYm9vbCBpc0xpdmVTdHJlYW1pbmcoKSBjb25zdDsKIAogICAgIE1hdHJvc2thRXh0cmFjdG9yKGNvbnN0IE1hdHJvc2thRXh0cmFjdG9yICYpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL0FuZHJvaWQuYnAKaW5kZXggYTNhZWFjYS4uNGUyZjI0OCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9BbmRyb2lkLmJwCkBAIC0xMiwxMyArMTIsMTMgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9pZDMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgXSwKIAogICAgIG5hbWU6ICJsaWJtcDNleHRyYWN0b3IiLApAQCAtMzksOSArMzksNiBAQAogICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiAKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL01QM0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuY3BwCmluZGV4IDMzY2ZmOTYuLmE4MzhhZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL01QM0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvTVAzRXh0cmFjdG9yLmNwcApAQCAtMjQsOCArMjQsNiBAQAogI2luY2x1ZGUgIlZCUklTZWVrZXIuaCIKICNpbmNsdWRlICJYSU5HU2Vla2VyLmgiCiAKLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgpAQCAtNDYsNyArNDQsNyBAQAogc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYXNrID0gMHhmZmZlMGMwMDsKIAogc3RhdGljIGJvb2wgUmVzeW5jKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCB1aW50MzJfdCBtYXRjaF9oZWFkZXIsCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgdWludDMyX3QgbWF0Y2hfaGVhZGVyLAogICAgICAgICBvZmY2NF90ICppbm91dF9wb3MsIG9mZjY0X3QgKnBvc3RfaWQzX3BvcywgdWludDMyX3QgKm91dF9oZWFkZXIpIHsKICAgICBpZiAocG9zdF9pZDNfcG9zICE9IE5VTEwpIHsKICAgICAgICAgKnBvc3RfaWQzX3BvcyA9IDA7CkBAIC0yMDksMzUgKzIwNywzNCBAQAogICAgIHJldHVybiB2YWxpZDsKIH0KIAotY2xhc3MgTVAzU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworY2xhc3MgTVAzU291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogcHVibGljOgogICAgIE1QM1NvdXJjZSgKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAogICAgICAgICAgICAgb2ZmNjRfdCBmaXJzdF9mcmFtZV9wb3MsIHVpbnQzMl90IGZpeGVkX2hlYWRlciwKICAgICAgICAgICAgIE1QM1NlZWtlciAqc2Vla2VyKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NUDNTb3VyY2UoKTsKIAogcHJpdmF0ZToKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhGcmFtZVNpemU7Ci0gICAgTWV0YURhdGFCYXNlICZtTWV0YTsKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0ICptTWV0YTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICBvZmY2NF90IG1GaXJzdEZyYW1lUG9zOwogICAgIHVpbnQzMl90IG1GaXhlZEhlYWRlcjsKICAgICBvZmY2NF90IG1DdXJyZW50UG9zOwogICAgIGludDY0X3QgbUN1cnJlbnRUaW1lVXM7CiAgICAgYm9vbCBtU3RhcnRlZDsKICAgICBNUDNTZWVrZXIgKm1TZWVrZXI7Ci0gICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOwogCiAgICAgaW50NjRfdCBtQmFzaXNUaW1lVXM7CiAgICAgaW50NjRfdCBtU2FtcGxlc1JlYWQ7CkBAIC0yNTMsNyArMjUwLDcgQEAKIH07CiAKIE1QM0V4dHJhY3Rvcjo6TVAzRXh0cmFjdG9yKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBNcDNNZXRhICptZXRhKQorICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIE1wM01ldGEgKm1ldGEpCiAgICAgOiBtSW5pdENoZWNrKE5PX0lOSVQpLAogICAgICAgbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1GaXJzdEZyYW1lUG9zKC0xKSwKQEAgLTI4NSw2ICsyODIsNyBAQAogICAgIG1GaXhlZEhlYWRlciA9IGhlYWRlcjsKICAgICBYSU5HU2Vla2VyICpzZWVrZXIgPSBYSU5HU2Vla2VyOjpDcmVhdGVGcm9tU291cmNlKG1EYXRhU291cmNlLCBtRmlyc3RGcmFtZVBvcyk7CiAKKyAgICBtTWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKICAgICBpZiAoc2Vla2VyID09IE5VTEwpIHsKICAgICAgICAgbVNlZWtlciA9IFZCUklTZWVrZXI6OkNyZWF0ZUZyb21Tb3VyY2UobURhdGFTb3VyY2UsIHBvc3RfaWQzX3Bvcyk7CiAgICAgfSBlbHNlIHsKQEAgLTI5Miw4ICsyOTAsOCBAQAogICAgICAgICBpbnQgZW5jZCA9IHNlZWtlci0+Z2V0RW5jb2RlckRlbGF5KCk7CiAgICAgICAgIGludCBlbmNwID0gc2Vla2VyLT5nZXRFbmNvZGVyUGFkZGluZygpOwogICAgICAgICBpZiAoZW5jZCAhPSAwIHx8IGVuY3AgIT0gMCkgewotICAgICAgICAgICAgbU1ldGEuc2V0SW50MzIoa0tleUVuY29kZXJEZWxheSwgZW5jZCk7Ci0gICAgICAgICAgICBtTWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlclBhZGRpbmcsIGVuY3ApOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfREVMQVksIGVuY2QpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfUEFERElORywgZW5jcCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTMyOSwyMSArMzI3LDIzIEBACiAKICAgICBzd2l0Y2ggKGxheWVyKSB7CiAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIG1NZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0kpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0kpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIG1NZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0lJKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobU1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JSSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgbU1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgVFJFU1BBU1MoKTsKICAgICB9CiAKLSAgICBtTWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlX3JhdGUpOwotICAgIG1NZXRhLnNldEludDMyKGtLZXlCaXRSYXRlLCBiaXRyYXRlICogMTAwMCk7Ci0gICAgbU1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtX2NoYW5uZWxzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZV9yYXRlKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsIGJpdHJhdGUgKiAxMDAwKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbnVtX2NoYW5uZWxzKTsKIAogICAgIGludDY0X3QgZHVyYXRpb25VczsKIApAQCAtMzYzLDcgKzM2Myw3IEBACiAgICAgfQogCiAgICAgaWYgKGR1cmF0aW9uVXMgPj0gMCkgewotICAgICAgICBtTWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uVXMpOwogICAgIH0KIAogICAgIG1Jbml0Q2hlY2sgPSBPSzsKQEAgLTM3MSw3ICszNzEsOCBAQAogICAgIC8vIEdldCBpVHVuZXMtc3R5bGUgZ2FwbGVzcyBpbmZvIGlmIHByZXNlbnQuCiAgICAgLy8gV2hlbiBnZXR0aW5nIHRoZSBpZDMgdGFnLCBza2lwIHRoZSBWMSB0YWdzIHRvIHByZXZlbnQgdGhlIHNvdXJjZSBjYWNoZQogICAgIC8vIGZyb20gYmVpbmcgaXRlcmF0ZWQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZS4KLSAgICBJRDMgaWQzKG1EYXRhU291cmNlLCB0cnVlKTsKKyAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihtRGF0YVNvdXJjZSk7CisgICAgSUQzIGlkMygmaGVscGVyLCB0cnVlKTsKICAgICBpZiAoaWQzLmlzVmFsaWQoKSkgewogICAgICAgICBJRDM6Okl0ZXJhdG9yICpjb20gPSBuZXcgSUQzOjpJdGVyYXRvcihpZDMsICJDT00iKTsKICAgICAgICAgaWYgKGNvbS0+ZG9uZSgpKSB7CkBAIC0zOTAsOCArMzkxLDggQEAKIAogICAgICAgICAgICAgICAgIGludDMyX3QgZGVsYXksIHBhZGRpbmc7CiAgICAgICAgICAgICAgICAgaWYgKHNzY2FuZih2YWx1ZSwgIiAlKnggJXggJXggJSp4IiwgJmRlbGF5LCAmcGFkZGluZykgPT0gMikgewotICAgICAgICAgICAgICAgICAgICBtTWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlckRlbGF5LCBkZWxheSk7Ci0gICAgICAgICAgICAgICAgICAgIG1NZXRhLnNldEludDMyKGtLZXlFbmNvZGVyUGFkZGluZywgcGFkZGluZyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX0RFTEFZLCBkZWxheSk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX1BBRERJTkcsIHBhZGRpbmcpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTQwNCwxMyArNDA1LDE1IEBACiAKIE1QM0V4dHJhY3Rvcjo6fk1QM0V4dHJhY3RvcigpIHsKICAgICBkZWxldGUgbVNlZWtlcjsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtTWV0YSk7CiB9CiAKIHNpemVfdCBNUDNFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtSW5pdENoZWNrICE9IE9LID8gMCA6IDE7CiB9CiAKLU1lZGlhVHJhY2sgKk1QM0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpNUDNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtNDIwLDE0ICs0MjMsMTQgQEAKICAgICAgICAgICAgIG1TZWVrZXIpOwogfQogCi1zdGF0dXNfdCBNUDNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IE1QM0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KLSAgICBtZXRhID0gbU1ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1NZXRhKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtNDQwLDcgKzQ0Myw3IEBACiAvLyBTZXQgb3VyIG1heCBmcmFtZSBzaXplIHRvIHRoZSBuZWFyZXN0IHBvd2VyIG9mIDIgYWJvdmUgdGhpcyBzaXplIChha2EsIDRrQikKIGNvbnN0IHNpemVfdCBNUDNTb3VyY2U6OmtNYXhGcmFtZVNpemUgPSAoMSA8PCAxMik7IC8qIDQwOTYgYnl0ZXMgKi8KIE1QM1NvdXJjZTo6TVAzU291cmNlKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAogICAgICAgICBvZmY2NF90IGZpcnN0X2ZyYW1lX3BvcywgdWludDMyX3QgZml4ZWRfaGVhZGVyLAogICAgICAgICBNUDNTZWVrZXIgKnNlZWtlcikKICAgICA6IG1NZXRhKG1ldGEpLApAQCAtNDUxLDcgKzQ1NCw2IEBACiAgICAgICBtQ3VycmVudFRpbWVVcygwKSwKICAgICAgIG1TdGFydGVkKGZhbHNlKSwKICAgICAgIG1TZWVrZXIoc2Vla2VyKSwKLSAgICAgIG1Hcm91cChOVUxMKSwKICAgICAgIG1CYXNpc1RpbWVVcygwKSwKICAgICAgIG1TYW1wbGVzUmVhZCgwKSB7CiB9CkBAIC00NjIsMTIgKzQ2NCwxMCBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgTVAzU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKikgeworbWVkaWFfc3RhdHVzX3QgTVAzU291cmNlOjpzdGFydCgpIHsKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogCi0gICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0KLSAgICBtR3JvdXAtPmFkZF9idWZmZXIoTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoa01heEZyYW1lU2l6ZSkpOworICAgIG1CdWZmZXJHcm91cC0+YWRkX2J1ZmZlcihrTWF4RnJhbWVTaXplKTsKIAogICAgIG1DdXJyZW50UG9zID0gbUZpcnN0RnJhbWVQb3M7CiAgICAgbUN1cnJlbnRUaW1lVXMgPSAwOwpAQCAtNDc3LDI3ICs0NzcsMjMgQEAKIAogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNUDNTb3VyY2U6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBNUDNTb3VyY2U6OnN0b3AoKSB7CiAgICAgQ0hFQ0sobVN0YXJ0ZWQpOwogCi0gICAgZGVsZXRlIG1Hcm91cDsKLSAgICBtR3JvdXAgPSBOVUxMOwotCiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNUDNTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhID0gbU1ldGE7Ci0gICAgcmV0dXJuIE9LOworbWVkaWFfc3RhdHVzX3QgTVAzU291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1NZXRhKTsKIH0KIAotc3RhdHVzX3QgTVAzU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CittZWRpYV9zdGF0dXNfdCBNUDNTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICpvdXQgPSBOVUxMOwogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwpAQCAtNTA5LDExICs1MDUsMTEgQEAKICAgICAgICAgaWYgKG1TZWVrZXIgPT0gTlVMTAogICAgICAgICAgICAgICAgIHx8ICFtU2Vla2VyLT5nZXRPZmZzZXRGb3JUaW1lKCZhY3R1YWxTZWVrVGltZVVzLCAmbUN1cnJlbnRQb3MpKSB7CiAgICAgICAgICAgICBpbnQzMl90IGJpdHJhdGU7Ci0gICAgICAgICAgICBpZiAoIW1NZXRhLmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmJpdHJhdGUpKSB7CisgICAgICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwgJmJpdHJhdGUpKSB7CiAgICAgICAgICAgICAgICAgLy8gYml0cmF0ZSBpcyBpbiBiaXRzL3NlYy4KICAgICAgICAgICAgICAgICBBTE9HSSgibm8gYml0cmF0ZSIpOwogCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1DdXJyZW50VGltZVVzID0gc2Vla1RpbWVVczsKQEAgLTUyNywxMCArNTIzLDEwIEBACiAgICAgICAgIG1TYW1wbGVzUmVhZCA9IDA7CiAgICAgfQogCi0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyOworICAgIHN0YXR1c190IGVyciA9IG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgc2l6ZV90IGZyYW1lX3NpemU7CkBAIC01NDMsNyArNTM5LDggQEAKICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKIAotICAgICAgICAgICAgcmV0dXJuIChuIDwgMCA/IG4gOiBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgICAgIHJldHVybiAoKG4gPCAwICYmIG4gIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgPworICAgICAgICAgICAgICAgICAgICBBTUVESUFfRVJST1JfVU5LTk9XTiA6IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNKTsKICAgICAgICAgfQogCiAgICAgICAgIHVpbnQzMl90IGhlYWRlciA9IFUzMl9BVCgoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpKTsKQEAgLTU3Miw3ICs1NjksNyBAQAogICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwogCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgfQogCiAgICAgICAgIG1DdXJyZW50UG9zID0gcG9zOwpAQCAtNTg3LDEzICs1ODQsMTUgQEAKICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgcmV0dXJuIChuIDwgMCA/IG4gOiBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgcmV0dXJuICgobiA8IDAgJiYgbiAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSA/CisgICAgICAgICAgICAgICAgQU1FRElBX0VSUk9SX1VOS05PV04gOiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSk7CiAgICAgfQogCiAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgZnJhbWVfc2l6ZSk7CiAKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCBtQ3VycmVudFRpbWVVcyk7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgbUN1cnJlbnRUaW1lVXMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogCiAgICAgbUN1cnJlbnRQb3MgKz0gZnJhbWVfc2l6ZTsKIApAQCAtNjAyLDM5ICs2MDEsNDAgQEAKIAogICAgICpvdXQgPSBidWZmZXI7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTVAzRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhLmNsZWFyKCk7CittZWRpYV9zdGF0dXNfdCBNUDNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIEFNZWRpYUZvcm1hdF9jbGVhcihtZXRhKTsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KLSAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCAiYXVkaW8vbXBlZyIpOworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKIAotICAgIElEMyBpZDMobURhdGFTb3VyY2UpOworICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKG1EYXRhU291cmNlKTsKKyAgICBJRDMgaWQzKCZoZWxwZXIpOwogCiAgICAgaWYgKCFpZDMuaXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKICAgICB9CiAKICAgICBzdHJ1Y3QgTWFwIHsKLSAgICAgICAgaW50IGtleTsKKyAgICAgICAgY29uc3QgY2hhciAqa2V5OwogICAgICAgICBjb25zdCBjaGFyICp0YWcxOwogICAgICAgICBjb25zdCBjaGFyICp0YWcyOwogICAgIH07CiAgICAgc3RhdGljIGNvbnN0IE1hcCBrTWFwW10gPSB7Ci0gICAgICAgIHsga0tleUFsYnVtLCAiVEFMQiIsICJUQUwiIH0sCi0gICAgICAgIHsga0tleUFydGlzdCwgIlRQRTEiLCAiVFAxIiB9LAotICAgICAgICB7IGtLZXlBbGJ1bUFydGlzdCwgIlRQRTIiLCAiVFAyIiB9LAotICAgICAgICB7IGtLZXlDb21wb3NlciwgIlRDT00iLCAiVENNIiB9LAotICAgICAgICB7IGtLZXlHZW5yZSwgIlRDT04iLCAiVENPIiB9LAotICAgICAgICB7IGtLZXlUaXRsZSwgIlRJVDIiLCAiVFQyIiB9LAotICAgICAgICB7IGtLZXlZZWFyLCAiVFlFIiwgIlRZRVIiIH0sCi0gICAgICAgIHsga0tleUF1dGhvciwgIlRYVCIsICJURVhUIiB9LAotICAgICAgICB7IGtLZXlDRFRyYWNrTnVtYmVyLCAiVFJLIiwgIlRSQ0siIH0sCi0gICAgICAgIHsga0tleURpc2NOdW1iZXIsICJUUEEiLCAiVFBPUyIgfSwKLSAgICAgICAgeyBrS2V5Q29tcGlsYXRpb24sICJUQ1AiLCAiVENNUCIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0FMQlVNLCAiVEFMQiIsICJUQUwiIH0sCisgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9BUlRJU1QsICJUUEUxIiwgIlRQMSIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUSVNULCAiVFBFMiIsICJUUDIiIH0sCisgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9DT01QT1NFUiwgIlRDT00iLCAiVENNIiB9LAorICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfR0VOUkUsICJUQ09OIiwgIlRDTyIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX1RJVExFLCAiVElUMiIsICJUVDIiIH0sCisgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9ZRUFSLCAiVFlFIiwgIlRZRVIiIH0sCisgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9BVVRIT1IsICJUWFQiLCAiVEVYVCIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0NEVFJBQ0tOVU1CRVIsICJUUksiLCAiVFJDSyIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0RJU0NOVU1CRVIsICJUUEEiLCAiVFBPUyIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0NPTVBJTEFUSU9OLCAiVENQIiwgIlRDTVAiIH0sCiAgICAgfTsKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1NYXBFbnRyaWVzID0gc2l6ZW9mKGtNYXApIC8gc2l6ZW9mKGtNYXBbMF0pOwogCkBAIC02NTQsNyArNjU0LDcgQEAKICAgICAgICAgaXQtPmdldFN0cmluZygmcyk7CiAgICAgICAgIGRlbGV0ZSBpdDsKIAotICAgICAgICBtZXRhLnNldENTdHJpbmcoa01hcFtpXS5rZXksIHMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIGtNYXBbaV0ua2V5LCBzLnN0cmluZygpKTsKICAgICB9CiAKICAgICBzaXplX3QgZGF0YVNpemU7CkBAIC02NjIsMjggKzY2MiwyOCBAQAogICAgIGNvbnN0IHZvaWQgKmRhdGEgPSBpZDMuZ2V0QWxidW1BcnQoJmRhdGFTaXplLCAmbWltZSk7CiAKICAgICBpZiAoZGF0YSkgewotICAgICAgICBtZXRhLnNldERhdGEoa0tleUFsYnVtQXJ0LCBNZXRhRGF0YTo6VFlQRV9OT05FLCBkYXRhLCBkYXRhU2l6ZSk7Ci0gICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5QWxidW1BcnRNSU1FLCBtaW1lLnN0cmluZygpKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJULCBkYXRhLCBkYXRhU2l6ZSk7CiAgICAgfQogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXRpYyBNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorc3RhdGljIENNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAogICAgICAgICB2b2lkICptZXRhKSB7CiAgICAgTXAzTWV0YSAqbWV0YURhdGEgPSBzdGF0aWNfY2FzdDxNcDNNZXRhICo+KG1ldGEpOwotICAgIHJldHVybiBuZXcgTVAzRXh0cmFjdG9yKHNvdXJjZSwgbWV0YURhdGEpOworICAgIHJldHVybiB3cmFwKG5ldyBNUDNFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSwgbWV0YURhdGEpKTsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBTbmlmZigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiptZXRhLAotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICpmcmVlTWV0YSkgeworc3RhdGljIENyZWF0b3JGdW5jIFNuaWZmKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsCisgICAgICAgIEZyZWVNZXRhRnVuYyAqZnJlZU1ldGEpIHsKICAgICBvZmY2NF90IHBvcyA9IDA7CiAgICAgb2ZmNjRfdCBwb3N0X2lkM19wb3M7CiAgICAgdWludDMyX3QgaGVhZGVyOwogICAgIHVpbnQ4X3QgbXBlZ19oZWFkZXJbNV07Ci0gICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIG1wZWdfaGVhZGVyLCBzaXplb2YobXBlZ19oZWFkZXIpKSA8IChzc2l6ZV90KXNpemVvZihtcGVnX2hlYWRlcikpIHsKKyAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihzb3VyY2UpOworICAgIGlmIChoZWxwZXIucmVhZEF0KDAsIG1wZWdfaGVhZGVyLCBzaXplb2YobXBlZ19oZWFkZXIpKSA8IChzc2l6ZV90KXNpemVvZihtcGVnX2hlYWRlcikpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC02OTEsNyArNjkxLDcgQEAKICAgICAgICAgQUxPR1YoIk1QRUcxUFMgY29udGFpbmVyIGlzIG5vdCBzdXBwb3J0ZWQhIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBpZiAoIVJlc3luYyhzb3VyY2UsIDAsICZwb3MsICZwb3N0X2lkM19wb3MsICZoZWFkZXIpKSB7CisgICAgaWYgKCFSZXN5bmMoJmhlbHBlciwgMCwgJnBvcywgJnBvc3RfaWQzX3BvcywgJmhlYWRlcikpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC03MDcsMTYgKzcwNywyNSBAQAogICAgIHJldHVybiBDcmVhdGVFeHRyYWN0b3I7CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICpleHRlbnNpb25zW10gPSB7CisgICAgIm1wMiIsCisgICAgIm1wMyIsCisgICAgIm1wZWciLAorICAgICJtcGciLAorICAgICJtcGdhIiwKKyAgICBOVUxMCit9OworCiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICBVVUlEKCI4MTJhM2Y2Yy1jOGNmLTQ2ZGUtYjUyOS0zNzc0YjE0MTAzZDQiKSwKICAgICAgICAgMSwgLy8gdmVyc2lvbgogICAgICAgICAiTVAzIEV4dHJhY3RvciIsCi0gICAgICAgIFNuaWZmCisgICAgICAgIHsgLnYzID0ge1NuaWZmLCBleHRlbnNpb25zfSB9CiAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvTVAzRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuaAppbmRleCA0ODViMGNhLi4xZTM4YWI3IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuaApAQCAtMTksMzUgKzE5LDM3IEBACiAjZGVmaW5lIE1QM19FWFRSQUNUT1JfSF8KIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY2xhc3MgRGF0YVNvdXJjZUhlbHBlcjsKKwogc3RydWN0IEFNZXNzYWdlOwotY2xhc3MgRGF0YVNvdXJjZUJhc2U7CiBzdHJ1Y3QgTVAzU2Vla2VyOwogY2xhc3MgU3RyaW5nODsKIHN0cnVjdCBNcDNNZXRhOwogCi1jbGFzcyBNUDNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworY2xhc3MgTVAzRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKIHB1YmxpYzoKLSAgICBNUDNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgTXAzTWV0YSAqbWV0YSk7CisgICAgTVAzRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgTXAzTWV0YSAqbWV0YSk7CiAgICAgfk1QM0V4dHJhY3RvcigpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk1QM0V4dHJhY3RvciI7IH0KIAogcHJpdmF0ZToKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwogCi0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIG9mZjY0X3QgbUZpcnN0RnJhbWVQb3M7Ci0gICAgTWV0YURhdGFCYXNlIG1NZXRhOworICAgIEFNZWRpYUZvcm1hdCAqbU1ldGE7CiAgICAgdWludDMyX3QgbUZpeGVkSGVhZGVyOwogICAgIE1QM1NlZWtlciAqbVNlZWtlcjsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvVkJSSVNlZWtlci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmNwcAppbmRleCA1MjNmMTRjLi5jYTUxYjg4IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmNwcApAQCAtMjcsNyArMjcsOSBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzcsNyArMzksNyBAQAogCiAvLyBzdGF0aWMKIFZCUklTZWVrZXIgKlZCUklTZWVrZXI6OkNyZWF0ZUZyb21Tb3VyY2UoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3QgcG9zdF9pZDNfcG9zKSB7CisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgb2ZmNjRfdCBwb3N0X2lkM19wb3MpIHsKICAgICBvZmY2NF90IHBvcyA9IHBvc3RfaWQzX3BvczsKIAogICAgIHVpbnQ4X3QgaGVhZGVyWzRdOwpAQCAtNjksNyArNzEsNyBAQAogICAgIHNpemVfdCBudW1GcmFtZXMgPSBVMzJfQVQoJnZicmlIZWFkZXJbMTRdKTsKIAogICAgIGludDY0X3QgZHVyYXRpb25VcyA9Ci0gICAgICAgIG51bUZyYW1lcyAqIDEwMDAwMDBsbCAqIChzYW1wbGVSYXRlID49IDMyMDAwID8gMTE1MiA6IDU3NikgLyBzYW1wbGVSYXRlOworICAgICAgICBudW1GcmFtZXMgKiAxMDAwMDAwTEwgKiAoc2FtcGxlUmF0ZSA+PSAzMjAwMCA/IDExNTIgOiA1NzYpIC8gc2FtcGxlUmF0ZTsKIAogICAgIEFMT0dWKCJkdXJhdGlvbiA9ICUuMmYgc2VjcyIsIGR1cmF0aW9uVXMgLyAxRTYpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmggYi9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmgKaW5kZXggOTIxM2Y2ZS4uNTA3ODk5YyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvVkJSSVNlZWtlci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL1ZCUklTZWVrZXIuaApAQCAtMjQsMTEgKzI0LDExIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitjbGFzcyBEYXRhU291cmNlSGVscGVyOwogCiBzdHJ1Y3QgVkJSSVNlZWtlciA6IHB1YmxpYyBNUDNTZWVrZXIgewogICAgIHN0YXRpYyBWQlJJU2Vla2VyICpDcmVhdGVGcm9tU291cmNlKAotICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgb2ZmNjRfdCBwb3N0X2lkM19wb3MpOworICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBvZmY2NF90IHBvc3RfaWQzX3Bvcyk7CiAKICAgICB2aXJ0dWFsIGJvb2wgZ2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25Vcyk7CiAgICAgdmlydHVhbCBib29sIGdldE9mZnNldEZvclRpbWUoaW50NjRfdCAqdGltZVVzLCBvZmY2NF90ICpwb3MpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9YSU5HU2Vla2VyLmNwcAppbmRleCA5NWNhNTU2Li45ZjFmZDdhIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wMy9YSU5HU2Vla2VyLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9YSU5HU2Vla2VyLmNwcApAQCAtMjEsNyArMjEsOSBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDQsNyArNDYsNyBAQAogfQogCiBib29sIFhJTkdTZWVrZXI6OmdldE9mZnNldEZvclRpbWUoaW50NjRfdCAqdGltZVVzLCBvZmY2NF90ICpwb3MpIHsKLSAgICBpZiAobVNpemVCeXRlcyA9PSAwIHx8ICFtVE9DVmFsaWQgfHwgbUR1cmF0aW9uVXMgPCAwKSB7CisgICAgaWYgKG1TaXplQnl0ZXMgPT0gMCB8fCBtRHVyYXRpb25VcyA8IDApIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtNTQsNyArNTYsNyBAQAogICAgICAgICBmeCA9IDAuMGY7CiAgICAgfSBlbHNlIGlmKCBwZXJjZW50ID49IDEwMC4wZiApIHsKICAgICAgICAgZnggPSAyNTYuMGY7Ci0gICAgfSBlbHNlIHsKKyAgICB9IGVsc2UgaWYgKG1UT0NWYWxpZCkgewogICAgICAgICBpbnQgYSA9IChpbnQpcGVyY2VudDsKICAgICAgICAgZmxvYXQgZmEsIGZiOwogICAgICAgICBpZiAoIGEgPT0gMCApIHsKQEAgLTY4LDYgKzcwLDggQEAKICAgICAgICAgICAgIGZiID0gMjU2LjBmOwogICAgICAgICB9CiAgICAgICAgIGZ4ID0gZmEgKyAoZmItZmEpKihwZXJjZW50LWEpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZ4ID0gcGVyY2VudCAqIDIuNTZmOwogICAgIH0KIAogICAgICpwb3MgPSAoaW50KSgoMS4wZi8yNTYuMGYpKmZ4Km1TaXplQnl0ZXMpICsgbUZpcnN0RnJhbWVQb3M7CkBAIC03Nyw3ICs4MSw3IEBACiAKIC8vIHN0YXRpYwogWElOR1NlZWtlciAqWElOR1NlZWtlcjo6Q3JlYXRlRnJvbVNvdXJjZSgKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgb2ZmNjRfdCBmaXJzdF9mcmFtZV9wb3MpIHsKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBvZmY2NF90IGZpcnN0X2ZyYW1lX3BvcykgewogCiAgICAgdWludDhfdCBidWZmZXJbNF07CiAgICAgaW50IG9mZnNldCA9IGZpcnN0X2ZyYW1lX3BvczsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL1hJTkdTZWVrZXIuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXAzL1hJTkdTZWVrZXIuaAppbmRleCA1ODY3ZWFlLi45YWNlZTM4IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wMy9YSU5HU2Vla2VyLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5oCkBAIC0yMiwxMSArMjIsMTEgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBEYXRhU291cmNlQmFzZTsKK2NsYXNzIERhdGFTb3VyY2VIZWxwZXI7CiAKIHN0cnVjdCBYSU5HU2Vla2VyIDogcHVibGljIE1QM1NlZWtlciB7CiAgICAgc3RhdGljIFhJTkdTZWVrZXIgKkNyZWF0ZUZyb21Tb3VyY2UoCi0gICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBvZmY2NF90IGZpcnN0X2ZyYW1lX3Bvcyk7CisgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIG9mZjY0X3QgZmlyc3RfZnJhbWVfcG9zKTsKIAogICAgIHZpcnR1YWwgYm9vbCBnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKTsKICAgICB2aXJ0dWFsIGJvb2wgZ2V0T2Zmc2V0Rm9yVGltZShpbnQ2NF90ICp0aW1lVXMsIG9mZjY0X3QgKnBvcyk7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9BQzRQYXJzZXIuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQUM0UGFyc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xM2Q2MGM4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQUM0UGFyc2VyLmNwcApAQCAtMCwwICsxLDYyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQUM0UGFyc2VyIgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisKKyNpbmNsdWRlICJBQzRQYXJzZXIuaCIKKworI2RlZmluZSBCT09MU1RSKGEpICAoKGEpPyJ0cnVlIjoiZmFsc2UiKQorI2RlZmluZSBCWVRFX0FMSUdOIG1CaXRSZWFkZXIuc2tpcEJpdHMobUJpdFJlYWRlci5udW1CaXRzTGVmdCgpICUgOCkKKyNkZWZpbmUgQ0hFQ0tfQklUU19MRUZUKG4pIGlmIChtQml0UmVhZGVyLm51bUJpdHNMZWZ0KCkgPCBuKSB7cmV0dXJuIGZhbHNlO30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitBQzRQYXJzZXI6OkFDNFBhcnNlcigpIHsKK30KKworQUM0RFNJUGFyc2VyOjpBQzREU0lQYXJzZXIoQUJpdFJlYWRlciAmYnIpCisgICAgOiBtQml0UmVhZGVyKGJyKXsKKworICAgIG1EU0lTaXplID0gbUJpdFJlYWRlci5udW1CaXRzTGVmdCgpOworfQorCisvLyBFVFNJIFRTIDEwMyAxOTAtMiBWMS4xLjEgKDIwMTUtMDkpIFRhYmxlIDc5OiBjaGFubmVsX21vZGUKK3N0YXRpYyBjb25zdCBjaGFyICpDaGFubmVsTW9kZXNbXSA9IHsKKyAgICAibW9ubyIsCisgICAgInN0ZXJlbyIsCisgICAgIjMuMCIsCisgICAgIjUuMCIsCisgICAgIjUuMSIsCisgICAgIjcuMCAoMy80LzApIiwKKyAgICAiNy4xICgzLzQvMC4xKSIsCisgICAgIjcuMCAoNS8yLzApIiwKKyAgICAiNy4xICg1LzIvMC4xKSIsCisgICAgIjcuMCAoMy8yLzIpIiwKKyAgICAiNy4xICgzLzIvMi4xKSIsCisgICAgIjcuMC40IiwKKyAgICAiNy4xLjQiLAorICAgICI5LjAuNCIsCisgICAgIjkuMS40IiwKKyAgICAiMjIuMiIKK307CisKK3N0YXRpYyBjb25zdCBjaGFyKiBDb250ZW50Q2xhc3NpZmllcltdID0geworICAgICJDb21wbGV0ZSBNYWluIiwKKyAgICAiTXVzaWMgYW5kIEVmZmVjdHMiLAorICAgICJWaXN1YWxseSBJbXBhaXJlZCIsCisgICAgIkhlYXJpbmcgSW1wYWlyZWQiLAorICAgICJEaWFsb2ciLAorICAgICJDb21tZW50YXJ5IiwKKyAgICAiRW1lcmdlbmN5IiwKKyAgICAiVm9pY2UgT3ZlciIKK307CisKK2Jvb2wgQUM0RFNJUGFyc2VyOjpwYXJzZUxhbmd1YWdlVGFnKHVpbnQzMl90IHByZXNlbnRhdGlvbklELCB1aW50MzJfdCBzdWJzdHJlYW1JRCl7CisgICAgQ0hFQ0tfQklUU19MRUZUKDYpOworICAgIHVpbnQzMl90IG5fbGFuZ3VhZ2VfdGFnX2J5dGVzID0gbUJpdFJlYWRlci5nZXRCaXRzKDYpOworICAgIGlmIChuX2xhbmd1YWdlX3RhZ19ieXRlcyA8IDIgfHwgbl9sYW5ndWFnZV90YWdfYnl0ZXMgPj0gNDIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBDSEVDS19CSVRTX0xFRlQobl9sYW5ndWFnZV90YWdfYnl0ZXMgKiA4KTsKKyAgICBjaGFyIGxhbmd1YWdlX3RhZ19ieXRlc1s0Ml07IC8vIFRTIDEwMyAxOTAgcGFydCAxIDQuMy4zLjguNworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuX2xhbmd1YWdlX3RhZ19ieXRlczsgaSsrKSB7CisgICAgICAgIGxhbmd1YWdlX3RhZ19ieXRlc1tpXSA9IChjaGFyKW1CaXRSZWFkZXIuZ2V0Qml0cyg4KTsKKyAgICB9CisgICAgbGFuZ3VhZ2VfdGFnX2J5dGVzW25fbGFuZ3VhZ2VfdGFnX2J5dGVzXSA9IDA7CisgICAgQUxPR1YoIiV1LiV1OiBsYW5ndWFnZV90YWcgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIHN1YnN0cmVhbUlELCBsYW5ndWFnZV90YWdfYnl0ZXMpOworCisgICAgc3RkOjpzdHJpbmcgbGFuZ3VhZ2UobGFuZ3VhZ2VfdGFnX2J5dGVzLCBuX2xhbmd1YWdlX3RhZ19ieXRlcyk7CisgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uSURdLm1MYW5ndWFnZSA9IGxhbmd1YWdlOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFRTIDEwMyAxOTAtMSB2MS4yLjEgRS41IGFuZCBUUyAxMDMgMTkwLTIgdjEuMS4xIEUuOQorYm9vbCBBQzREU0lQYXJzZXI6OnBhcnNlU3Vic3RyZWFtRFNJKHVpbnQzMl90IHByZXNlbnRhdGlvbklELCB1aW50MzJfdCBzdWJzdHJlYW1JRCl7CisgICAgQ0hFQ0tfQklUU19MRUZUKDUpOworICAgIHVpbnQzMl90IGNoYW5uZWxfbW9kZSA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg1KTsKKyAgICBDSEVDS19CSVRTX0xFRlQoMik7CisgICAgdWludDMyX3QgZHNpX3NmX211bHRpcGxpZXIgPSBtQml0UmVhZGVyLmdldEJpdHMoMik7CisgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgIGJvb2wgYl9zdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgIEFMT0dWKCIldS4ldTogY2hhbm5lbF9tb2RlID0gJXUgKCVzKVxuIiwgcHJlc2VudGF0aW9uSUQsIHN1YnN0cmVhbUlELCBjaGFubmVsX21vZGUsCisgICAgY2hhbm5lbF9tb2RlIDwgTkVMRU0oQ2hhbm5lbE1vZGVzKSA/IENoYW5uZWxNb2Rlc1tjaGFubmVsX21vZGVdIDogInJlc2VydmVkIik7CisgICAgQUxPR1YoIiV1LiV1OiBkc2lfc2ZfbXVsdGlwbGllciA9ICV1XG4iLCBwcmVzZW50YXRpb25JRCwKKyAgICAgICAgc3Vic3RyZWFtSUQsIGRzaV9zZl9tdWx0aXBsaWVyKTsKKyAgICBBTE9HVigiJXUuJXU6IGJfc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yID0gJXNcbiIsIHByZXNlbnRhdGlvbklELAorICAgICAgICBzdWJzdHJlYW1JRCwgQk9PTFNUUihiX3N1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvcikpOworCisgICAgaWYgKGJfc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yKSB7CisgICAgICAgIENIRUNLX0JJVFNfTEVGVCg1KTsKKyAgICAgICAgdWludDMyX3Qgc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgICAgICBBTE9HVigiJXUuJXU6IHN1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvciA9ICV1XG4iLCBwcmVzZW50YXRpb25JRCwgc3Vic3RyZWFtSUQsCisgICAgICAgICAgICBzdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IpOworICAgIH0KKyAgICBpZiAoY2hhbm5lbF9tb2RlID49IDcgJiYgY2hhbm5lbF9tb2RlIDw9IDEwKSB7CisgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgdWludDMyX3QgYWRkX2NoX2Jhc2UgPSBtQml0UmVhZGVyLmdldEJpdHMoMSk7CisgICAgICAgIEFMT0dWKCIldS4ldTogYWRkX2NoX2Jhc2UgPSAldVxuIiwgcHJlc2VudGF0aW9uSUQsIHN1YnN0cmVhbUlELCBhZGRfY2hfYmFzZSk7CisgICAgfQorICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICBib29sIGJfY29udGVudF90eXBlID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICBBTE9HVigiJXUuJXU6IGJfY29udGVudF90eXBlID0gJXNcbiIsIHByZXNlbnRhdGlvbklELCBzdWJzdHJlYW1JRCwgQk9PTFNUUihiX2NvbnRlbnRfdHlwZSkpOworICAgIGlmIChiX2NvbnRlbnRfdHlwZSkgeworICAgICAgICBDSEVDS19CSVRTX0xFRlQoMyk7CisgICAgICAgIHVpbnQzMl90IGNvbnRlbnRfY2xhc3NpZmllciA9IG1CaXRSZWFkZXIuZ2V0Qml0cygzKTsKKyAgICAgICAgQUxPR1YoIiV1LiV1OiBjb250ZW50X2NsYXNzaWZpZXIgPSAldSAoJXMpXG4iLCBwcmVzZW50YXRpb25JRCwgc3Vic3RyZWFtSUQsCisgICAgICAgICAgICBjb250ZW50X2NsYXNzaWZpZXIsIENvbnRlbnRDbGFzc2lmaWVyW2NvbnRlbnRfY2xhc3NpZmllcl0pOworCisgICAgICAgIC8vIEZvciBzdHJlYW1zIGJhc2VkIG9uIFRTIDEwMyAxOTAgcGFydCAxIHRoZSBwcmVzZW50YXRpb24gbGV2ZWwgY2hhbm5lbF9tb2RlIGRvZXNuJ3QKKyAgICAgICAgLy8gZXhpc3QgYW5kIHNvIHdlIHVzZSB0aGUgY2hhbm5lbF9tb2RlIGZyb20gZWl0aGVyIHRoZSBDTSBvciBNJkUgc3Vic3RyZWFtCisgICAgICAgIC8vICh0aGV5IGFyZSBtdXR1YWxseSBleGNsdXNpdmUpCisgICAgICAgIGlmIChtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25JRF0ubUNoYW5uZWxNb2RlID09IC0xICYmCisgICAgICAgICAgICAoY29udGVudF9jbGFzc2lmaWVyID09IDAgfHwgY29udGVudF9jbGFzc2lmaWVyID09IDEpKSB7CisgICAgICAgICAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25JRF0ubUNoYW5uZWxNb2RlID0gY2hhbm5lbF9tb2RlOworICAgICAgICB9CisgICAgICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbklEXS5tQ29udGVudENsYXNzaWZpZXIgPSBjb250ZW50X2NsYXNzaWZpZXI7CisgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgYm9vbCBiX2xhbmd1YWdlX2luZGljYXRvciA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgIEFMT0dWKCIldS4ldTogYl9sYW5ndWFnZV9pbmRpY2F0b3IgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIHN1YnN0cmVhbUlELAorICAgICAgICAgICAgQk9PTFNUUihiX2xhbmd1YWdlX2luZGljYXRvcikpOworICAgICAgICBpZiAoYl9sYW5ndWFnZV9pbmRpY2F0b3IpIHsKKyAgICAgICAgICAgIGlmICghcGFyc2VMYW5ndWFnZVRhZyhwcmVzZW50YXRpb25JRCwgc3Vic3RyZWFtSUQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEVUU0kgVFMgMTAzIDE5MC0yIHYxLjEuMSBzZWN0aW9uIEUuMTEKK2Jvb2wgQUM0RFNJUGFyc2VyOjpwYXJzZVN1YnN0cmVhbUdyb3VwRFNJKHVpbnQzMl90IHByZXNlbnRhdGlvbklELCB1aW50MzJfdCBncm91cElEKQoreworICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICBib29sIGJfc3Vic3RyZWFtc19wcmVzZW50ID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgYm9vbCBiX2hzZl9leHQgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICBib29sIGJfY2hhbm5lbF9jb2RlZCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgQ0hFQ0tfQklUU19MRUZUKDgpOworICAgIHVpbnQzMl90IG5fc3Vic3RyZWFtcyA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg4KTsKKyAgICBBTE9HVigiJXUuJXU6IGJfc3Vic3RyZWFtc19wcmVzZW50ID0gJXNcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELAorICAgICAgICBCT09MU1RSKGJfc3Vic3RyZWFtc19wcmVzZW50KSk7CisgICAgQUxPR1YoIiV1LiV1OiBiX2hzZl9leHQgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIEJPT0xTVFIoYl9oc2ZfZXh0KSk7CisgICAgQUxPR1YoIiV1LiV1OiBiX2NoYW5uZWxfY29kZWQgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIEJPT0xTVFIoYl9jaGFubmVsX2NvZGVkKSk7CisgICAgQUxPR1YoIiV1LiV1OiBuX3N1YnN0cmVhbXMgPSAldVxuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIG5fc3Vic3RyZWFtcyk7CisKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbl9zdWJzdHJlYW1zOyBpKyspIHsKKyAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDIpOworICAgICAgICB1aW50MzJfdCBkc2lfc2ZfbXVsdGlwbGllciA9IG1CaXRSZWFkZXIuZ2V0Qml0cygyKTsKKyAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICBib29sIGJfc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgQUxPR1YoIiV1LiV1LiV1OiBkc2lfc2ZfbXVsdGlwbGllciA9ICV1XG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgaSwgZHNpX3NmX211bHRpcGxpZXIpOworICAgICAgICBBTE9HVigiJXUuJXUuJXU6IGJfc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yID0gJXNcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBpLAorICAgICAgICAgICAgQk9PTFNUUihiX3N1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvcikpOworCisgICAgICAgIGlmIChiX3N1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvcikgeworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDUpOworICAgICAgICAgICAgdWludDMyX3Qgc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgICAgICAgICAgQUxPR1YoIiV1LiV1LiV1OiBzdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IgPSAldVxuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIGksCisgICAgICAgICAgICAgICAgc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYl9jaGFubmVsX2NvZGVkKSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMjQpOworICAgICAgICAgICAgdWludDMyX3QgZHNpX3N1YnN0cmVhbV9jaGFubmVsX21hc2sgPSBtQml0UmVhZGVyLmdldEJpdHMoMjQpOworICAgICAgICAgICAgQUxPR1YoIiV1LiV1LiV1OiBkc2lfc3Vic3RyZWFtX2NoYW5uZWxfbWFzayA9IDB4JTA2eFxuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIGksCisgICAgICAgICAgICAgICAgZHNpX3N1YnN0cmVhbV9jaGFubmVsX21hc2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgYm9vbCBiX2Fqb2MgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgQUxPR1YoIiV1LiV1LiV1OiBiX2Fqb2MgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIGksIEJPT0xTVFIoYl9ham9jKSk7CisgICAgICAgICAgICBpZiAoYl9ham9jKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgICAgIGJvb2wgYl9zdGF0aWNfZG14ID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXUuJXUuJXU6IGJfc3RhdGljX2RteCA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgaSwKKyAgICAgICAgICAgICAgICAgICAgQk9PTFNUUihiX3N0YXRpY19kbXgpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWJfc3RhdGljX2RteCkgeworICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNCk7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5fZG14X29iamVjdHNfbWludXMxID0gbUJpdFJlYWRlci5nZXRCaXRzKDQpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXUuJXUuJXU6IG5fZG14X29iamVjdHNfbWludXMxID0gJXVcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgbl9kbXhfb2JqZWN0c19taW51czEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNik7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgbl91bXhfb2JqZWN0c19taW51czEgPSBtQml0UmVhZGVyLmdldEJpdHMoNik7CisgICAgICAgICAgICAgICAgQUxPR1YoIiV1LiV1LiV1OiBuX3VteF9vYmplY3RzX21pbnVzMSA9ICV1XG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgaSwKKyAgICAgICAgICAgICAgICAgICAgbl91bXhfb2JqZWN0c19taW51czEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDQpOworICAgICAgICAgICAgbUJpdFJlYWRlci5za2lwQml0cyg0KTsgLy8gb2JqZWN0c19hc3NpZ25tZW50X21hc2sKKyAgICAgICAgfQorICAgIH0KKworICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICBib29sIGJfY29udGVudF90eXBlID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICBBTE9HVigiJXUuJXU6IGJfY29udGVudF90eXBlID0gJXNcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBCT09MU1RSKGJfY29udGVudF90eXBlKSk7CisgICAgaWYgKGJfY29udGVudF90eXBlKSB7CisgICAgICAgIENIRUNLX0JJVFNfTEVGVCgzKTsKKyAgICAgICAgdWludDMyX3QgY29udGVudF9jbGFzc2lmaWVyID0gbUJpdFJlYWRlci5nZXRCaXRzKDMpOworICAgICAgICBBTE9HVigiJXUuJXU6IGNvbnRlbnRfY2xhc3NpZmllciA9ICVzICgldSlcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELAorICAgICAgICAgICAgQ29udGVudENsYXNzaWZpZXJbY29udGVudF9jbGFzc2lmaWVyXSwgY29udGVudF9jbGFzc2lmaWVyKTsKKworICAgICAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25JRF0ubUNvbnRlbnRDbGFzc2lmaWVyID0gY29udGVudF9jbGFzc2lmaWVyOworCisgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgYm9vbCBiX2xhbmd1YWdlX2luZGljYXRvciA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgIEFMT0dWKCIldS4ldTogYl9sYW5ndWFnZV9pbmRpY2F0b3IgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsCisgICAgICAgICAgICBCT09MU1RSKGJfbGFuZ3VhZ2VfaW5kaWNhdG9yKSk7CisKKyAgICAgICAgaWYgKGJfbGFuZ3VhZ2VfaW5kaWNhdG9yKSB7CisgICAgICAgICAgICBpZiAoIXBhcnNlTGFuZ3VhZ2VUYWcocHJlc2VudGF0aW9uSUQsIGdyb3VwSUQpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQUM0RFNJUGFyc2VyOjpwYXJzZUJpdHJhdGVEc2koKSB7CisgICAgQ0hFQ0tfQklUU19MRUZUKDIgKyAzMiArIDMyKTsKKyAgICBtQml0UmVhZGVyLnNraXBCaXRzKDIpOyAvLyBiaXRfcmF0ZV9tb2RlCisgICAgbUJpdFJlYWRlci5za2lwQml0cygzMik7IC8vIGJpdF9yYXRlCisgICAgbUJpdFJlYWRlci5za2lwQml0cygzMik7IC8vIGJpdF9yYXRlX3ByZWNpc2lvbgorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFRTIDEwMyAxOTAtMSBzZWN0aW9uIEUuNCAoYWM0X2RzaSkgYW5kIFRTIDEwMyAxOTAtMiBzZWN0aW9uIEUuNiAoYWM0X2RzaV92MSkKK2Jvb2wgQUM0RFNJUGFyc2VyOjpwYXJzZSgpIHsKKyAgICBDSEVDS19CSVRTX0xFRlQoMyk7CisgICAgdWludDMyX3QgYWM0X2RzaV92ZXJzaW9uID0gbUJpdFJlYWRlci5nZXRCaXRzKDMpOworICAgIGlmIChhYzRfZHNpX3ZlcnNpb24gPiAxKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciB3aGlsZSBwYXJzaW5nIGFjLTQgZHNpOiBvbmx5IHZlcnNpb25zIDAgYW5kIDEgYXJlIHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQ0hFQ0tfQklUU19MRUZUKDcgKyAxICsgNCArIDkpOworICAgIHVpbnQzMl90IGJpdHN0cmVhbV92ZXJzaW9uID0gbUJpdFJlYWRlci5nZXRCaXRzKDcpOworICAgIG1CaXRSZWFkZXIuc2tpcEJpdHMoMSk7IC8vIGZzX2luZGV4CisgICAgbUJpdFJlYWRlci5za2lwQml0cyg0KTsgLy8gZnJhbWVfcmF0ZV9pbmRleAorICAgIHVpbnQzMl90IG5fcHJlc2VudGF0aW9ucyA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg5KTsKKworICAgIGludDMyX3Qgc2hvcnRfcHJvZ3JhbV9pZCA9IC0xOworICAgIGlmIChiaXRzdHJlYW1fdmVyc2lvbiA+IDEpIHsKKyAgICAgICAgaWYgKGFjNF9kc2lfdmVyc2lvbiA9PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiaW52YWxpZCBhYzQgZHNpIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICBib29sIGJfcHJvZ3JhbV9pZCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgIGlmIChiX3Byb2dyYW1faWQpIHsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxNiArIDEpOworICAgICAgICAgICAgc2hvcnRfcHJvZ3JhbV9pZCA9IG1CaXRSZWFkZXIuZ2V0Qml0cygxNik7CisgICAgICAgICAgICBib29sIGJfdXVpZCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICBpZiAoYl91dWlkKSB7CisgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qga0FDNFVVSURTaXplSW5CeXRlcyA9IDE2OworICAgICAgICAgICAgICAgIGNoYXIgcHJvZ3JhbV91dWlkW2tBQzRVVUlEU2l6ZUluQnl0ZXNdOworICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVChrQUM0VVVJRFNpemVJbkJ5dGVzICogOCk7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGtBQzRVVUlEU2l6ZUluQnl0ZXM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBwcm9ncmFtX3V1aWRbaV0gPSAoY2hhcikobUJpdFJlYWRlci5nZXRCaXRzKDgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoIlVVSUQgPSAlcyIsIHByb2dyYW1fdXVpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYWM0X2RzaV92ZXJzaW9uID09IDEpIHsKKyAgICAgICAgaWYgKCFwYXJzZUJpdHJhdGVEc2koKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIEJZVEVfQUxJR047CisgICAgfQorCisgICAgZm9yICh1aW50MzJfdCBwcmVzZW50YXRpb24gPSAwOyBwcmVzZW50YXRpb24gPCBuX3ByZXNlbnRhdGlvbnM7IHByZXNlbnRhdGlvbisrKSB7CisgICAgICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbl0ubVByb2dyYW1JRCA9IHNob3J0X3Byb2dyYW1faWQ7CisgICAgICAgIC8vIGtub3duIGFzIGJfc2luZ2xlX3N1YnN0cmVhbSBpbiBhYzRfZHNpX3ZlcnNpb24gMAorICAgICAgICBib29sIGJfc2luZ2xlX3N1YnN0cmVhbV9ncm91cCA9IGZhbHNlOworICAgICAgICB1aW50MzJfdCBwcmVzZW50YXRpb25fY29uZmlnID0gMCwgcHJlc2VudGF0aW9uX3ZlcnNpb24gPSAwOworICAgICAgICB1aW50MzJfdCBwcmVzX2J5dGVzID0gMDsKKyAgICAgICAgdWludDY0X3Qgc3RhcnQgPSAwOworCisgICAgICAgIGlmIChhYzRfZHNpX3ZlcnNpb24gPT0gMCkgeworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEgKyA1ICsgNSk7CisgICAgICAgICAgICBiX3NpbmdsZV9zdWJzdHJlYW1fZ3JvdXAgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgcHJlc2VudGF0aW9uX2NvbmZpZyA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg1KTsKKyAgICAgICAgICAgIHByZXNlbnRhdGlvbl92ZXJzaW9uID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgICAgICB9IGVsc2UgaWYgKGFjNF9kc2lfdmVyc2lvbiA9PSAxKSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoOCArIDgpOworICAgICAgICAgICAgcHJlc2VudGF0aW9uX3ZlcnNpb24gPSBtQml0UmVhZGVyLmdldEJpdHMoOCk7CisgICAgICAgICAgICBwcmVzX2J5dGVzID0gbUJpdFJlYWRlci5nZXRCaXRzKDgpOworICAgICAgICAgICAgaWYgKHByZXNfYnl0ZXMgPT0gMHhmZikgeworICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxNik7CisgICAgICAgICAgICAgICAgcHJlc19ieXRlcyArPSBtQml0UmVhZGVyLmdldEJpdHMoMTYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIiV1OiBwcmVzX2J5dGVzID0gJXVcbiIsIHByZXNlbnRhdGlvbiwgcHJlc19ieXRlcyk7CisgICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPiAyKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKHByZXNfYnl0ZXMgKiA4KTsKKyAgICAgICAgICAgICAgICBtQml0UmVhZGVyLnNraXBCaXRzKHByZXNfYnl0ZXMgKiA4KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIHJlY29yZCBhIG1hcmtlciwgbGVzcyB0aGUgc2l6ZSBvZiB0aGUgcHJlc2VudGF0aW9uX2NvbmZpZyAqLworICAgICAgICAgICAgc3RhcnQgPSAobURTSVNpemUgLSBtQml0UmVhZGVyLm51bUJpdHNMZWZ0KCkpIC8gODsKKyAgICAgICAgICAgIC8vIGFjNF9wcmVzZW50YXRpb25fdjBfZHNpKCksIGFjNF9wcmVzZW50YXRpb25fdjFfZHNpKCkgYW5kIGFjNF9wcmVzZW50YXRpb25fdjJfZHNpKCkKKyAgICAgICAgICAgIC8vIGFsbCBzdGFydCB3aXRoIGEgcHJlc2VudGF0aW9uX2NvbmZpZyBvZiA1IGJpdHMKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg1KTsKKyAgICAgICAgICAgIHByZXNlbnRhdGlvbl9jb25maWcgPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgICAgICBiX3NpbmdsZV9zdWJzdHJlYW1fZ3JvdXAgPSAocHJlc2VudGF0aW9uX2NvbmZpZyA9PSAweDFmKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyICpQcmVzZW50YXRpb25Db25maWdbXSA9IHsKKyAgICAgICAgICAgICJNdXNpYyZFZmZlY3RzICsgRGlhbG9nIiwKKyAgICAgICAgICAgICJNYWluICsgREUiLAorICAgICAgICAgICAgIk1haW4gKyBBc3NvY2lhdGUiLAorICAgICAgICAgICAgIk11c2ljJkVmZmVjdHMgKyBEaWFsb2cgKyBBc3NvY2lhdGUiLAorICAgICAgICAgICAgIk1haW4gKyBERSArIEFzc29jaWF0ZSIsCisgICAgICAgICAgICAiQXJiaXRyYXJ5IHN1YnN0cmVhbSBncm91cHMiLAorICAgICAgICAgICAgIkVNREYgb25seSIKKyAgICAgICAgfTsKKyAgICAgICAgQUxPR1YoIiV1OiBiX3NpbmdsZV9zdWJzdHJlYW0vZ3JvdXAgPSAlc1xuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgQk9PTFNUUihiX3NpbmdsZV9zdWJzdHJlYW1fZ3JvdXApKTsKKyAgICAgICAgQUxPR1YoIiV1OiBwcmVzZW50YXRpb25fdmVyc2lvbiA9ICV1XG4iLCBwcmVzZW50YXRpb24sIHByZXNlbnRhdGlvbl92ZXJzaW9uKTsKKyAgICAgICAgQUxPR1YoIiV1OiBwcmVzZW50YXRpb25fY29uZmlnID0gJXUgKCVzKVxuIiwgcHJlc2VudGF0aW9uLCBwcmVzZW50YXRpb25fY29uZmlnLAorICAgICAgICAgICAgKHByZXNlbnRhdGlvbl9jb25maWcgPj0gTkVMRU0oUHJlc2VudGF0aW9uQ29uZmlnKSA/CisgICAgICAgICAgICAicmVzZXJ2ZWQiIDogUHJlc2VudGF0aW9uQ29uZmlnW3ByZXNlbnRhdGlvbl9jb25maWddKSk7CisKKyAgICAgICAgYm9vbCBiX2FkZF9lbWRmX3N1YnN0cmVhbXMgPSBmYWxzZTsKKyAgICAgICAgaWYgKCFiX3NpbmdsZV9zdWJzdHJlYW1fZ3JvdXAgJiYgcHJlc2VudGF0aW9uX2NvbmZpZyA9PSA2KSB7CisgICAgICAgICAgICBiX2FkZF9lbWRmX3N1YnN0cmVhbXMgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoIiV1OiBiX2FkZF9lbWRmX3N1YnN0cmVhbXMgPSAlc1xuIiwgcHJlc2VudGF0aW9uLCBCT09MU1RSKGJfYWRkX2VtZGZfc3Vic3RyZWFtcykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDMgKyAxKTsKKyAgICAgICAgICAgIHVpbnQzMl90IG1kY29tcGF0ID0gbUJpdFJlYWRlci5nZXRCaXRzKDMpOworICAgICAgICAgICAgQUxPR1YoIiV1OiBtZGNvbXBhdCA9ICVkXG4iLCBwcmVzZW50YXRpb24sIG1kY29tcGF0KTsKKworICAgICAgICAgICAgYm9vbCBiX3ByZXNlbnRhdGlvbl9ncm91cF9pbmRleCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICBBTE9HVigiJXU6IGJfcHJlc2VudGF0aW9uX2dyb3VwX2luZGV4ID0gJXNcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICBCT09MU1RSKGJfcHJlc2VudGF0aW9uX2dyb3VwX2luZGV4KSk7CisgICAgICAgICAgICBpZiAoYl9wcmVzZW50YXRpb25fZ3JvdXBfaW5kZXgpIHsKKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNSk7CisgICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uXS5tR3JvdXBJbmRleCA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg1KTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXU6IHByZXNlbnRhdGlvbl9ncm91cF9pbmRleCA9ICVkXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbl0ubUdyb3VwSW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDIpOworICAgICAgICAgICAgdWludDMyX3QgZHNpX2ZyYW1lX3JhdGVfbXVsdGlwbHlfaW5mbyA9IG1CaXRSZWFkZXIuZ2V0Qml0cygyKTsKKyAgICAgICAgICAgIEFMT0dWKCIldTogZHNpX2ZyYW1lX3JhdGVfbXVsdGlwbHlfaW5mbyA9ICVkXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgZHNpX2ZyYW1lX3JhdGVfbXVsdGlwbHlfaW5mbyk7CisgICAgICAgICAgICBpZiAoYWM0X2RzaV92ZXJzaW9uID09IDEgJiYgKHByZXNlbnRhdGlvbl92ZXJzaW9uID09IDEgfHwgcHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMikpIHsKKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMik7CisgICAgICAgICAgICAgICAgdWludDMyX3QgZHNpX2ZyYW1lX3JhdGVfZnJhY3Rpb25faW5mbyA9IG1CaXRSZWFkZXIuZ2V0Qml0cygyKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXU6IGRzaV9mcmFtZV9yYXRlX2ZyYWN0aW9uX2luZm8gPSAlZFxuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICBkc2lfZnJhbWVfcmF0ZV9mcmFjdGlvbl9pbmZvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg1ICsgMTApOworICAgICAgICAgICAgdWludDMyX3QgcHJlc2VudGF0aW9uX2VtZGZfdmVyc2lvbiA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg1KTsKKyAgICAgICAgICAgIHVpbnQzMl90IHByZXNlbnRhdGlvbl9rZXlfaWQgPSBtQml0UmVhZGVyLmdldEJpdHMoMTApOworICAgICAgICAgICAgQUxPR1YoIiV1OiBwcmVzZW50YXRpb25fZW1kZl92ZXJzaW9uID0gJWRcbiIsIHByZXNlbnRhdGlvbiwgcHJlc2VudGF0aW9uX2VtZGZfdmVyc2lvbik7CisgICAgICAgICAgICBBTE9HVigiJXU6IHByZXNlbnRhdGlvbl9rZXlfaWQgPSAlZFxuIiwgcHJlc2VudGF0aW9uLCBwcmVzZW50YXRpb25fa2V5X2lkKTsKKworICAgICAgICAgICAgaWYgKGFjNF9kc2lfdmVyc2lvbiA9PSAxKSB7CisgICAgICAgICAgICAgICAgYm9vbCBiX3ByZXNlbnRhdGlvbl9jaGFubmVsX2NvZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbl92ZXJzaW9uID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYl9wcmVzZW50YXRpb25fY2hhbm5lbF9jb2RlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgICAgICAgICBiX3ByZXNlbnRhdGlvbl9jaGFubmVsX2NvZGVkID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBiX3ByZXNlbnRhdGlvbl9jaGFubmVsX2NvZGVkID0gJXNcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgQk9PTFNUUihiX3ByZXNlbnRhdGlvbl9jaGFubmVsX2NvZGVkKSk7CisgICAgICAgICAgICAgICAgaWYgKGJfcHJlc2VudGF0aW9uX2NoYW5uZWxfY29kZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbl92ZXJzaW9uID09IDEgfHwgcHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMikgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDUpOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZHNpX3ByZXNlbnRhdGlvbl9jaF9tb2RlID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgICAgICAgICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uXS5tQ2hhbm5lbE1vZGUgPSBkc2lfcHJlc2VudGF0aW9uX2NoX21vZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXU6IGRzaV9wcmVzZW50YXRpb25fY2hfbW9kZSA9ICVkICglcylcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc2lfcHJlc2VudGF0aW9uX2NoX21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHNpX3ByZXNlbnRhdGlvbl9jaF9tb2RlIDwgTkVMRU0oQ2hhbm5lbE1vZGVzKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbE1vZGVzW2RzaV9wcmVzZW50YXRpb25fY2hfbW9kZV0gOiAicmVzZXJ2ZWQiKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRzaV9wcmVzZW50YXRpb25fY2hfbW9kZSA+PSAxMSAmJiBkc2lfcHJlc2VudGF0aW9uX2NoX21vZGUgPD0gMTQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSArIDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZXNfYl80X2JhY2tfY2hhbm5lbHNfcHJlc2VudCA9IG1CaXRSZWFkZXIuZ2V0Qml0cygxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVzX3RvcF9jaGFubmVsX3BhaXJzID0gbUJpdFJlYWRlci5nZXRCaXRzKDIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogcHJlc19iXzRfYmFja19jaGFubmVsc19wcmVzZW50ID0gJXNcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTFNUUihwcmVzX2JfNF9iYWNrX2NoYW5uZWxzX3ByZXNlbnQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXU6IHByZXNfdG9wX2NoYW5uZWxfcGFpcnMgPSAlZFxuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVzX3RvcF9jaGFubmVsX3BhaXJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBwcmVzZW50YXRpb25fY2hhbm5lbF9tYXNrIGluIGFjNF9wcmVzZW50YXRpb25fdjBfZHNpKCkKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDI0KTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlc2VudGF0aW9uX2NoYW5uZWxfbWFza192MSA9IG1CaXRSZWFkZXIuZ2V0Qml0cygyNCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogcHJlc2VudGF0aW9uX2NoYW5uZWxfbWFza192MSA9IDB4JTA2eFxuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uX2NoYW5uZWxfbWFza192MSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAxIHx8IHByZXNlbnRhdGlvbl92ZXJzaW9uID09IDIpIHsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgICAgICAgICBib29sIGJfcHJlc2VudGF0aW9uX2NvcmVfZGlmZmVycyA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogYl9wcmVzZW50YXRpb25fY29yZV9kaWZmZXJzID0gJXNcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJPT0xTVFIoYl9wcmVzZW50YXRpb25fY29yZV9kaWZmZXJzKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChiX3ByZXNlbnRhdGlvbl9jb3JlX2RpZmZlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9wcmVzZW50YXRpb25fY29yZV9jaGFubmVsX2NvZGVkID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiX3ByZXNlbnRhdGlvbl9jb3JlX2NoYW5uZWxfY29kZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJpdFJlYWRlci5za2lwQml0cygyKTsgLy8gZHNpX3ByZXNlbnRhdGlvbl9jaGFubmVsX21vZGVfY29yZQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBiX3ByZXNlbnRhdGlvbl9maWx0ZXIgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXU6IGJfcHJlc2VudGF0aW9uX2ZpbHRlciA9ICVzXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBCT09MU1RSKGJfcHJlc2VudGF0aW9uX2ZpbHRlcikpOworICAgICAgICAgICAgICAgICAgICBpZiAoYl9wcmVzZW50YXRpb25fZmlsdGVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSArIDgpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX2VuYWJsZV9wcmVzZW50YXRpb24gPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFiX2VuYWJsZV9wcmVzZW50YXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25dLm1FbmFibGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXU6IGJfZW5hYmxlX3ByZXNlbnRhdGlvbiA9ICVzXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTFNUUihiX2VuYWJsZV9wcmVzZW50YXRpb24pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5fZmlsdGVyX2J5dGVzID0gbUJpdFJlYWRlci5nZXRCaXRzKDgpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKG5fZmlsdGVyX2J5dGVzICogOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbl9maWx0ZXJfYnl0ZXM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CaXRSZWFkZXIuc2tpcEJpdHMoOCk7IC8vIGZpbHRlcl9kYXRhCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IC8qIGFjNF9kc2lfdmVyc2lvbiA9PSAxICovCisKKyAgICAgICAgICAgIGlmIChiX3NpbmdsZV9zdWJzdHJlYW1fZ3JvdXApIHsKKyAgICAgICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtRFNJKHByZXNlbnRhdGlvbiwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1Hcm91cERTSShwcmVzZW50YXRpb24sIDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChhYzRfZHNpX3ZlcnNpb24gPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9tdWx0aV9waWQgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXU6IGJfbXVsdGlfcGlkID0gJXNcbiIsIHByZXNlbnRhdGlvbiwgQk9PTFNUUihiX211bHRpX3BpZCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBiX2hzZl9leHQgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXU6IGJfaHNmX2V4dCA9ICVzXG4iLCBwcmVzZW50YXRpb24sIEJPT0xTVFIoYl9oc2ZfZXh0KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN3aXRjaCAocHJlc2VudGF0aW9uX2NvbmZpZykgeworICAgICAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbURTSShwcmVzZW50YXRpb24sIDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbURTSShwcmVzZW50YXRpb24sIDEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbUdyb3VwRFNJKHByZXNlbnRhdGlvbiwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtR3JvdXBEU0kocHJlc2VudGF0aW9uLCAxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbURTSShwcmVzZW50YXRpb24sIDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbURTSShwcmVzZW50YXRpb24sIDEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbURTSShwcmVzZW50YXRpb24sIDIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbUdyb3VwRFNJKHByZXNlbnRhdGlvbiwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtR3JvdXBEU0kocHJlc2VudGF0aW9uLCAxKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1Hcm91cERTSShwcmVzZW50YXRpb24sIDIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNToKKyAgICAgICAgICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbl92ZXJzaW9uID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1EU0kocHJlc2VudGF0aW9uLCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5fc3Vic3RyZWFtX2dyb3Vwc19taW51czIgPSBtQml0UmVhZGVyLmdldEJpdHMoMyk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXU6IG5fc3Vic3RyZWFtX2dyb3Vwc19taW51czIgPSAlZFxuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fc3Vic3RyZWFtX2dyb3Vwc19taW51czIpOworICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBzZyA9IDA7IHNnIDwgbl9zdWJzdHJlYW1fZ3JvdXBzX21pbnVzMiArIDI7IHNnKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtR3JvdXBEU0kocHJlc2VudGF0aW9uLCBzZykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNyk7CisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG5fc2tpcF9ieXRlcyA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg3KTsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKG5fc2tpcF9ieXRlcyAqIDgpCisgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBuX3NraXBfYnl0ZXM7IGorKykgeworICAgICAgICAgICAgICAgICAgICAgICAgbUJpdFJlYWRlci5nZXRCaXRzKDgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxICsgMSk7CisgICAgICAgICAgICBib29sIGJfcHJlX3ZpcnR1YWxpemVkID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbl0ubVByZVZpcnR1YWxpemVkID0gYl9wcmVfdmlydHVhbGl6ZWQ7CisgICAgICAgICAgICBiX2FkZF9lbWRmX3N1YnN0cmVhbXMgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgQUxPR1YoIiV1OiBiX3ByZV92aXJ0dWFsaXplZCA9ICVzXG4iLCBwcmVzZW50YXRpb24sIEJPT0xTVFIoYl9wcmVfdmlydHVhbGl6ZWQpKTsKKyAgICAgICAgICAgIEFMT0dWKCIldTogYl9hZGRfZW1kZl9zdWJzdHJlYW1zID0gJXNcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICBCT09MU1RSKGJfYWRkX2VtZGZfc3Vic3RyZWFtcykpOworICAgICAgICB9CisgICAgICAgIGlmIChiX2FkZF9lbWRmX3N1YnN0cmVhbXMpIHsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg3KTsKKyAgICAgICAgICAgIHVpbnQzMl90IG5fYWRkX2VtZGZfc3Vic3RyZWFtcyA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg3KTsKKyAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBuX2FkZF9lbWRmX3N1YnN0cmVhbXM7IGorKykgeworICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg1ICsgMTApOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHN1YnN0cmVhbV9lbWRmX3ZlcnNpb24gPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgc3Vic3RyZWFtX2tleV9pZCA9IG1CaXRSZWFkZXIuZ2V0Qml0cygxMCk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBlbWRmX3N1YnN0cmVhbVslZF06IHZlcnNpb249JWQsIGtleV9pZD0lZFxuIiwgcHJlc2VudGF0aW9uLCBqLAorICAgICAgICAgICAgICAgICAgICBzdWJzdHJlYW1fZW1kZl92ZXJzaW9uLCBzdWJzdHJlYW1fa2V5X2lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgYl9wcmVzZW50YXRpb25fYml0cmF0ZV9pbmZvID0gZmFsc2U7CisgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA+IDApIHsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgICAgIGJfcHJlc2VudGF0aW9uX2JpdHJhdGVfaW5mbyA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigiYl9wcmVzZW50YXRpb25fYml0cmF0ZV9pbmZvID0gJXNcbiIsIEJPT0xTVFIoYl9wcmVzZW50YXRpb25fYml0cmF0ZV9pbmZvKSk7CisgICAgICAgIGlmIChiX3ByZXNlbnRhdGlvbl9iaXRyYXRlX2luZm8pIHsKKyAgICAgICAgICAgIGlmICghcGFyc2VCaXRyYXRlRHNpKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPiAwKSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgICAgICBib29sIGJfYWx0ZXJuYXRpdmUgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgQUxPR1YoImJfYWx0ZXJuYXRpdmUgPSAlc1xuIiwgQk9PTFNUUihiX2FsdGVybmF0aXZlKSk7CisgICAgICAgICAgICBpZiAoYl9hbHRlcm5hdGl2ZSkgeworICAgICAgICAgICAgICAgIEJZVEVfQUxJR047CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDE2KTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBuYW1lX2xlbiA9IG1CaXRSZWFkZXIuZ2V0Qml0cygxNik7CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKG5hbWVfbGVuICogOCk7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJnByZXNlbnRhdGlvbl9uYW1lID0KKyAgICAgICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uXS5tRGVzY3JpcHRpb247CisgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uX25hbWUuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBwcmVzZW50YXRpb25fbmFtZS5yZXNpemUobmFtZV9sZW4pOworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuYW1lX2xlbjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbl9uYW1lW2ldID0gKGNoYXIpKG1CaXRSZWFkZXIuZ2V0Qml0cyg4KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg1KTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBuX3RhcmdldHMgPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKG5fdGFyZ2V0cyAqICgzICsgOCkpOworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuX3RhcmdldHM7IGkrKyl7CisgICAgICAgICAgICAgICAgICAgIG1CaXRSZWFkZXIuc2tpcEJpdHMoMyk7IC8vIHRhcmdldF9tZF9jb21wYXQKKyAgICAgICAgICAgICAgICAgICAgbUJpdFJlYWRlci5za2lwQml0cyg4KTsgLy8gdGFyZ2V0X2RldmljZV9jYXRlZ29yeQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEJZVEVfQUxJR047CisKKyAgICAgICAgaWYgKGFjNF9kc2lfdmVyc2lvbiA9PSAxKSB7CisgICAgICAgICAgICB1aW50NjRfdCBlbmQgPSAobURTSVNpemUgLSBtQml0UmVhZGVyLm51bUJpdHNMZWZ0KCkpIC8gODsKKyAgICAgICAgICAgIHVpbnQ2NF90IHByZXNlbnRhdGlvbl9ieXRlcyA9IGVuZCAtIHN0YXJ0OworICAgICAgICAgICAgdWludDY0X3Qgc2tpcF9ieXRlcyA9IHByZXNfYnl0ZXMgLSBwcmVzZW50YXRpb25fYnl0ZXM7CisgICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgPSAlIiBQUkl1NjQgIiBieXRlcyIsIHNraXBfYnl0ZXMpOworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKHNraXBfYnl0ZXMgKiA4KTsKKyAgICAgICAgICAgIG1CaXRSZWFkZXIuc2tpcEJpdHMoc2tpcF9ieXRlcyAqIDgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gd2Ugc2hvdWxkIGtub3cgdGhpcyBvciBzb21ldGhpbmcgaXMgcHJvYmFibHkgd3JvbmcKKyAgICAgICAgLy8gd2l0aCB0aGUgYml0c3RyZWFtIChvciB3ZSBkb24ndCBzdXBwb3J0IGl0KQorICAgICAgICBpZiAobVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uXS5tQ2hhbm5lbE1vZGUgPT0gLTEpIHsKKyAgICAgICAgICAgIEFMT0dFKCJjb3VsZCBub3QgZGV0ZXJtaW5nIGNoYW5uZWwgbW9kZSBvZiBwcmVzZW50YXRpb24gJWQiLCBwcmVzZW50YXRpb24pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfSAvKiBlYWNoIHByZXNlbnRhdGlvbiAqLworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK307CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9BQzRQYXJzZXIuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FDNFBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYjZlMzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9BQzRQYXJzZXIuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQUM0X1BBUlNFUl9IXworI2RlZmluZSBBQzRfUEFSU0VSX0hfCisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBBQzRQYXJzZXIgeworcHVibGljOgorICAgIEFDNFBhcnNlcigpOworICAgIHZpcnR1YWwgfkFDNFBhcnNlcigpIHsgfQorCisgICAgdmlydHVhbCBib29sIHBhcnNlKCkgPSAwOworCisgICAgc3RydWN0IEFDNFByZXNlbnRhdGlvbiB7CisgICAgICAgIGludDMyX3QgbUNoYW5uZWxNb2RlID0gLTE7CisgICAgICAgIGludDMyX3QgbVByb2dyYW1JRCA9IC0xOworICAgICAgICBpbnQzMl90IG1Hcm91cEluZGV4ID0gLTE7CisKKyAgICAgICAgLy8gVFMgMTAzIDE5MC0xIHYxLjIuMSA0LjMuMy44LjEKKyAgICAgICAgZW51bSBDb250ZW50Q2xhc3NpZmllcnMgeworICAgICAgICAgICAga0NvbXBsZXRlTWFpbiwKKyAgICAgICAgICAgIGtNdXNpY0FuZEVmZmVjdHMsCisgICAgICAgICAgICBrVmlzdWFsbHlJbXBhaXJlZCwKKyAgICAgICAgICAgIGtIZWFyaW5nSW1wYWlyZWQsCisgICAgICAgICAgICBrRGlhbG9nLAorICAgICAgICAgICAga0NvbW1lbnRhcnksCisgICAgICAgICAgICBrRW1lcmdlbmN5LAorICAgICAgICAgICAga1ZvaWNlT3ZlcgorICAgICAgICB9OworCisgICAgICAgIHVpbnQzMl90IG1Db250ZW50Q2xhc3NpZmllciA9IGtDb21wbGV0ZU1haW47CisKKyAgICAgICAgLy8gRVRTSSBUUyAxMDMgMTkwLTIgVjEuMS4xICgyMDE1LTA5KSBUYWJsZSA3OTogY2hhbm5lbF9tb2RlCisgICAgICAgIGVudW0gSW5wdXRDaGFubmVsTW9kZSB7CisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfTW9ubywKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV9TdGVyZW8sCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfM18wLAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzVfMCwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV81XzEsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfN18wXzM0LAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzdfMV8zNCwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV83XzBfNTIsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfN18xXzUyLAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzdfMF8zMjIsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfN18xXzMyMiwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV83XzBfNCwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV83XzFfNCwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV85XzBfNCwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV85XzFfNCwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV8yMl8yLAorICAgICAgICAgICAga0NoYW5uZWxNb2RlX1Jlc2VydmVkLAorICAgICAgICB9OworCisgICAgICAgIGJvb2wgbUhhc0RpYWxvZ0VuaGFuY2VtZW50cyA9IGZhbHNlOworICAgICAgICBib29sIG1QcmVWaXJ0dWFsaXplZCA9IGZhbHNlOworICAgICAgICBib29sIG1FbmFibGVkID0gdHJ1ZTsKKworICAgICAgICBzdGQ6OnN0cmluZyBtTGFuZ3VhZ2U7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1EZXNjcmlwdGlvbjsKKyAgICB9OworICAgIHR5cGVkZWYgc3RkOjptYXA8dWludDMyX3QsIEFDNFByZXNlbnRhdGlvbj4gQUM0UHJlc2VudGF0aW9uczsKKworICAgIGNvbnN0IEFDNFByZXNlbnRhdGlvbnMmIGdldFByZXNlbnRhdGlvbnMoKSBjb25zdCB7IHJldHVybiBtUHJlc2VudGF0aW9uczsgfQorCitwcm90ZWN0ZWQ6CisgICAgQUM0UHJlc2VudGF0aW9ucyBtUHJlc2VudGF0aW9uczsKK307CisKK2NsYXNzIEFDNERTSVBhcnNlcjogcHVibGljIEFDNFBhcnNlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQUM0RFNJUGFyc2VyKEFCaXRSZWFkZXIgJmJyKTsKKyAgICB2aXJ0dWFsIH5BQzREU0lQYXJzZXIoKSB7IH0KKworICAgIGJvb2wgcGFyc2UoKTsKKworcHJpdmF0ZToKKyAgICBib29sIHBhcnNlU3Vic3RyZWFtRFNJKHVpbnQzMl90IHByZXNlbnRhdGlvbklELCB1aW50MzJfdCBzdWJzdHJlYW1JRCk7CisgICAgYm9vbCBwYXJzZVN1YnN0cmVhbUdyb3VwRFNJKHVpbnQzMl90IHByZXNlbnRhdGlvbklELCB1aW50MzJfdCBncm91cElEKTsKKyAgICBib29sIHBhcnNlTGFuZ3VhZ2VUYWcodWludDMyX3QgcHJlc2VudGF0aW9uSUQsIHVpbnQzMl90IHN1YnN0cmVhbUlEKTsKKyAgICBib29sIHBhcnNlQml0cmF0ZURzaSgpOworCisgICAgdWludDY0X3QgbURTSVNpemU7CisgICAgQUJpdFJlYWRlciYgbUJpdFJlYWRlcjsKK307CisKK307CisKKyNlbmRpZiAgLy8gQUM0X1BBUlNFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FuZHJvaWQuYnAKaW5kZXggZmE3MzllOC4uMWIzMDhhYSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9BbmRyb2lkLmJwCkBAIC0yLDYgKzIsNyBAQAogICAgIG5hbWU6ICJsaWJtcDRleHRyYWN0b3JfZGVmYXVsdHMiLAogCiAgICAgc3JjczogWworICAgICAgICAiQUM0UGFyc2VyLmNwcCIsCiAgICAgICAgICJJdGVtVGFibGUuY3BwIiwKICAgICAgICAgIk1QRUc0RXh0cmFjdG9yLmNwcCIsCiAgICAgICAgICJTYW1wbGVJdGVyYXRvci5jcHAiLApAQCAtMTQsNyArMTUsNyBAQAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYW5kayIKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKQEAgLTQ2LDkgKzQ3LDYgQEAKICAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAogCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmNwcAppbmRleCBjYTlkZWFiLi44YzhlNmQxIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5jcHAKQEAgLTE3LDggKzE3LDExIEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkl0ZW1UYWJsZSIKIAorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKICNpbmNsdWRlIDxJdGVtVGFibGUuaD4KLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CkBAIC00Nyw3ICs1MCw3IEBACiAgICAgICAgICAgICBvZmZzZXQoMCksIHNpemUoMCksIG5leHRUaWxlSW5kZXgoMCkge30KIAogICAgIGJvb2wgaXNHcmlkKCkgY29uc3QgewotICAgICAgICByZXR1cm4gdHlwZSA9PSBGT1VSQ0MoJ2cnLCAncicsICdpJywgJ2QnKTsKKyAgICAgICAgcmV0dXJuIHR5cGUgPT0gRk9VUkNDKCJncmlkIik7CiAgICAgfQogCiAgICAgc3RhdHVzX3QgZ2V0TmV4dFRpbGVJdGVtSWQodWludDMyX3QgKm5leHRUaWxlSXRlbUlkLCBib29sIHJlc2V0KSB7CkBAIC05Miw3ICs5NSw3IEBACiAKIHN0cnVjdCBCb3ggewogcHJvdGVjdGVkOgotICAgIEJveChEYXRhU291cmNlQmFzZSAqc291cmNlLCB1aW50MzJfdCB0eXBlKSA6CisgICAgQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgdWludDMyX3QgdHlwZSkgOgogICAgICAgICBtRGF0YVNvdXJjZShzb3VyY2UpLCBtVHlwZSh0eXBlKSB7fQogCiAgICAgdmlydHVhbCB+Qm94KCkge30KQEAgLTEwNCwxNCArMTA3LDE0IEBACiAKICAgICBpbmxpbmUgdWludDMyX3QgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1UeXBlOyB9CiAKLSAgICBpbmxpbmUgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIG1EYXRhU291cmNlOyB9CisgICAgaW5saW5lIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIG1EYXRhU291cmNlOyB9CiAKICAgICBzdGF0dXNfdCBwYXJzZUNodW5rKG9mZjY0X3QgKm9mZnNldCk7CiAKICAgICBzdGF0dXNfdCBwYXJzZUNodW5rcyhvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICB1aW50MzJfdCBtVHlwZTsKIH07CiAKQEAgLTE4Niw3ICsxODksNyBAQAogCiBzdHJ1Y3QgRnVsbEJveCA6IHB1YmxpYyBCb3ggewogcHJvdGVjdGVkOgotICAgIEZ1bGxCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgdWludDMyX3QgdHlwZSkgOgorICAgIEZ1bGxCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCB1aW50MzJfdCB0eXBlKSA6CiAgICAgICAgIEJveChzb3VyY2UsIHR5cGUpLCBtVmVyc2lvbigwKSwgbUZsYWdzKDApIHt9CiAKICAgICBpbmxpbmUgdWludDhfdCB2ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbVZlcnNpb247IH0KQEAgLTIyMSw4ICsyMjQsOCBAQAogLy8KIAogc3RydWN0IFBpdG1Cb3ggOiBwdWJsaWMgRnVsbEJveCB7Ci0gICAgUGl0bUJveChEYXRhU291cmNlQmFzZSAqc291cmNlKSA6Ci0gICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoJ3AnLCAnaScsICd0JywgJ20nKSkge30KKyAgICBQaXRtQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkgOgorICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCJwaXRtIikpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUsIHVpbnQzMl90ICpwcmltYXJ5SXRlbUlkKTsKIH07CkBAIC0zMDEsOCArMzA0LDggQEAKIH07CiAKIHN0cnVjdCBJbG9jQm94IDogcHVibGljIEZ1bGxCb3ggewotICAgIElsb2NCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgS2V5ZWRWZWN0b3I8dWludDMyX3QsIEl0ZW1Mb2M+ICppdGVtTG9jcykgOgotICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ2wnLCAnbycsICdjJykpLAorICAgIElsb2NCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBLZXllZFZlY3Rvcjx1aW50MzJfdCwgSXRlbUxvYz4gKml0ZW1Mb2NzKSA6CisgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoImlsb2MiKSksCiAgICAgICAgIG1JdGVtTG9jcyhpdGVtTG9jcyksIG1IYXNDb25zdHJ1Y3RNZXRob2QxKGZhbHNlKSB7fQogCiAgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKQEAgLTQyMywxMCArNDI2LDggQEAKICAgICAgICAgfQogICAgICAgICBBTE9HVigiZXh0ZW50X2NvdW50ICVkIiwgZXh0ZW50X2NvdW50KTsKIAotICAgICAgICBpZiAoZXh0ZW50X2NvdW50ID4gMSAmJiAob2Zmc2V0X3NpemUgPT0gMCB8fCBsZW5ndGhfc2l6ZSA9PSAwKSkgewotICAgICAgICAgICAgLy8gaWYgdGhlIGl0ZW0gaXMgZGl2aWRlYyBpbnRvIG1vcmUgdGhhbiBvbmUgZXh0ZW50cywgb2Zmc2V0IGFuZAotICAgICAgICAgICAgLy8gbGVuZ3RoIG11c3QgYmUgcHJlc2VudC4KLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIGlmIChleHRlbnRfY291bnQgPiAxKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgICAgIH0KICAgICAgICAgb2Zmc2V0ICs9IDI7CiAKQEAgLTQ3MSw3ICs0NzIsNyBAQAogLy8KIAogc3RydWN0IEl0ZW1SZWZlcmVuY2UgOiBwdWJsaWMgQm94LCBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgSXRlbVJlZmVyZW5jZShEYXRhU291cmNlQmFzZSAqc291cmNlLCB1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBpdGVtSWRTaXplKSA6CisgICAgSXRlbVJlZmVyZW5jZShEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIHVpbnQzMl90IHR5cGUsIHVpbnQzMl90IGl0ZW1JZFNpemUpIDoKICAgICAgICAgQm94KHNvdXJjZSwgdHlwZSksIG1JdGVtSWQoMCksIG1SZWZJZFNpemUoaXRlbUlkU2l6ZSkge30KIAogICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CkBAIC00OTYsNyArNDk3LDcgQEAKICAgICBBTE9HVigiYXR0YWNoIHJlZmVyZW5jZSB0eXBlIDB4JXggdG8gaXRlbSBpZCAlZCkiLCB0eXBlKCksIG1JdGVtSWQpOwogCiAgICAgc3dpdGNoKHR5cGUoKSkgewotICAgIGNhc2UgRk9VUkNDKCdkJywgJ2knLCAnbScsICdnJyk6IHsKKyAgICBjYXNlIEZPVVJDQygiZGltZyIpOiB7CiAgICAgICAgIHNzaXplX3QgaXRlbUluZGV4ID0gaXRlbUlkVG9JdGVtTWFwLmluZGV4T2ZLZXkobUl0ZW1JZCk7CiAKICAgICAgICAgLy8gaWdub3JlIG5vbi1pbWFnZSBpdGVtcwpAQCAtNTI0LDcgKzUyNSw3IEBACiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIGNhc2UgRk9VUkNDKCd0JywgJ2gnLCAnbScsICdiJyk6IHsKKyAgICBjYXNlIEZPVVJDQygidGhtYiIpOiB7CiAgICAgICAgIHNzaXplX3QgaXRlbUluZGV4ID0gaXRlbUlkVG9JdGVtTWFwLmluZGV4T2ZLZXkobUl0ZW1JZCk7CiAKICAgICAgICAgLy8gaWdub3JlIG5vbi1pbWFnZSBpdGVtcwpAQCAtNTUzLDcgKzU1NCw3IEBACiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgfQotICAgIGNhc2UgRk9VUkNDKCdjJywgJ2QnLCAncycsICdjJyk6IHsKKyAgICBjYXNlIEZPVVJDQygiY2RzYyIpOiB7CiAgICAgICAgIHNzaXplX3QgaXRlbUluZGV4ID0gaXRlbUlkVG9FeGlmTWFwLmluZGV4T2ZLZXkobUl0ZW1JZCk7CiAKICAgICAgICAgLy8gaWdub3JlIG5vbi1leGlmIGJsb2NrIGl0ZW1zCkBAIC01NzQsNyArNTc1LDcgQEAKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICB9Ci0gICAgY2FzZSBGT1VSQ0MoJ2EnLCAndScsICd4JywgJ2wnKTogeworICAgIGNhc2UgRk9VUkNDKCJhdXhsIik6IHsKICAgICAgICAgc3NpemVfdCBpdGVtSW5kZXggPSBpdGVtSWRUb0l0ZW1NYXAuaW5kZXhPZktleShtSXRlbUlkKTsKIAogICAgICAgICAvLyBpZ25vcmUgbm9uLWltYWdlIGl0ZW1zCkBAIC02MjYsOCArNjI3LDggQEAKIH0KIAogc3RydWN0IElyZWZCb3ggOiBwdWJsaWMgRnVsbEJveCB7Ci0gICAgSXJlZkJveChEYXRhU291cmNlQmFzZSAqc291cmNlLCBWZWN0b3I8c3A8SXRlbVJlZmVyZW5jZT4gPiAqaXRlbVJlZnMpIDoKLSAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygnaScsICdyJywgJ2UnLCAnZicpKSwgbVJlZklkU2l6ZSgwKSwgbUl0ZW1SZWZzKGl0ZW1SZWZzKSB7fQorICAgIElyZWZCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBWZWN0b3I8c3A8SXRlbVJlZmVyZW5jZT4gPiAqaXRlbVJlZnMpIDoKKyAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygiaXJlZiIpKSwgbVJlZklkU2l6ZSgwKSwgbUl0ZW1SZWZzKGl0ZW1SZWZzKSB7fQogCiAgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKTsKIApAQCAtNjg4LDggKzY4OSw4IEBACiB9OwogCiBzdHJ1Y3QgSXNwZUJveCA6IHB1YmxpYyBGdWxsQm94LCBwdWJsaWMgSXRlbVByb3BlcnR5IHsKLSAgICBJc3BlQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIDoKLSAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygnaScsICdzJywgJ3AnLCAnZScpKSwgbVdpZHRoKDApLCBtSGVpZ2h0KDApIHt9CisgICAgSXNwZUJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UpIDoKKyAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygiaXNwZSIpKSwgbVdpZHRoKDApLCBtSGVpZ2h0KDApIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOwogCkBAIC03MjQsOCArNzI1LDggQEAKIH0KIAogc3RydWN0IEh2Y2NCb3ggOiBwdWJsaWMgQm94LCBwdWJsaWMgSXRlbVByb3BlcnR5IHsKLSAgICBIdmNjQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIDoKLSAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCdoJywgJ3YnLCAnYycsICdDJykpIHt9CisgICAgSHZjY0JveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UpIDoKKyAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCJodmNDIikpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOwogCkBAIC03NTcsOCArNzU4LDggQEAKIH0KIAogc3RydWN0IElyb3RCb3ggOiBwdWJsaWMgQm94LCBwdWJsaWMgSXRlbVByb3BlcnR5IHsKLSAgICBJcm90Qm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIDoKLSAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ3InLCAnbycsICd0JykpLCBtQW5nbGUoMCkge30KKyAgICBJcm90Qm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkgOgorICAgICAgICBCb3goc291cmNlLCBGT1VSQ0MoImlyb3QiKSksIG1BbmdsZSgwKSB7fQogCiAgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKIApAQCAtNzg2LDggKzc4Nyw4IEBACiB9CiAKIHN0cnVjdCBDb2xyQm94IDogcHVibGljIEJveCwgcHVibGljIEl0ZW1Qcm9wZXJ0eSB7Ci0gICAgQ29sckJveChEYXRhU291cmNlQmFzZSAqc291cmNlKSA6Ci0gICAgICAgIEJveChzb3VyY2UsIEZPVVJDQygnYycsICdvJywgJ2wnLCAncicpKSB7fQorICAgIENvbHJCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKSA6CisgICAgICAgIEJveChzb3VyY2UsIEZPVVJDQygiY29sciIpKSB7fQogCiAgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKIApAQCAtODExLDExICs4MTIsMTEgQEAKICAgICB9CiAgICAgb2Zmc2V0ICs9IDQ7CiAgICAgc2l6ZSAtPSA0OwotICAgIGlmIChjb2xvdXJfdHlwZSA9PSBGT1VSQ0MoJ24nLCAnYycsICdsJywgJ3gnKSkgeworICAgIGlmIChjb2xvdXJfdHlwZSA9PSBGT1VSQ0MoIm5jbHgiKSkgewogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQotICAgIGlmICgoY29sb3VyX3R5cGUgIT0gRk9VUkNDKCdyJywgJ0knLCAnQycsICdDJykpICYmCi0gICAgICAgIChjb2xvdXJfdHlwZSAhPSBGT1VSQ0MoJ3AnLCAncicsICdvJywgJ2YnKSkpIHsKKyAgICBpZiAoKGNvbG91cl90eXBlICE9IEZPVVJDQygicklDQyIpKSAmJgorICAgICAgICAoY29sb3VyX3R5cGUgIT0gRk9VUkNDKCJwcm9mIikpKSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCkBAIC04MzQsOCArODM1LDggQEAKIH0KIAogc3RydWN0IElwbWFCb3ggOiBwdWJsaWMgRnVsbEJveCB7Ci0gICAgSXBtYUJveChEYXRhU291cmNlQmFzZSAqc291cmNlLCBWZWN0b3I8QXNzb2NpYXRpb25FbnRyeT4gKmFzc29jaWF0aW9ucykgOgotICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ3AnLCAnbScsICdhJykpLCBtQXNzb2NpYXRpb25zKGFzc29jaWF0aW9ucykge30KKyAgICBJcG1hQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgVmVjdG9yPEFzc29jaWF0aW9uRW50cnk+ICphc3NvY2lhdGlvbnMpIDoKKyAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygiaXBtYSIpKSwgbUFzc29jaWF0aW9ucyhhc3NvY2lhdGlvbnMpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwogcHJpdmF0ZToKQEAgLTkwOCw4ICs5MDksOCBAQAogfQogCiBzdHJ1Y3QgSXBjb0JveCA6IHB1YmxpYyBCb3ggewotICAgIElwY29Cb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgVmVjdG9yPHNwPEl0ZW1Qcm9wZXJ0eT4gPiAqcHJvcGVydGllcykgOgotICAgICAgICBCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAncCcsICdjJywgJ28nKSksIG1JdGVtUHJvcGVydGllcyhwcm9wZXJ0aWVzKSB7fQorICAgIElwY29Cb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBWZWN0b3I8c3A8SXRlbVByb3BlcnR5PiA+ICpwcm9wZXJ0aWVzKSA6CisgICAgICAgIEJveChzb3VyY2UsIEZPVVJDQygiaXBjbyIpKSwgbUl0ZW1Qcm9wZXJ0aWVzKHByb3BlcnRpZXMpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwogcHJvdGVjdGVkOgpAQCAtOTI5LDIyICs5MzAsMjIgQEAKIHN0YXR1c190IElwY29Cb3g6Om9uQ2h1bmtEYXRhKHVpbnQzMl90IHR5cGUsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewogICAgIHNwPEl0ZW1Qcm9wZXJ0eT4gaXRlbVByb3BlcnR5OwogICAgIHN3aXRjaCh0eXBlKSB7Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ3YnLCAnYycsICdDJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJodmNDIik6CiAgICAgICAgIHsKICAgICAgICAgICAgIGl0ZW1Qcm9wZXJ0eSA9IG5ldyBIdmNjQm94KHNvdXJjZSgpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ3MnLCAncCcsICdlJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJpc3BlIik6CiAgICAgICAgIHsKICAgICAgICAgICAgIGl0ZW1Qcm9wZXJ0eSA9IG5ldyBJc3BlQm94KHNvdXJjZSgpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ3InLCAnbycsICd0Jyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJpcm90Iik6CiAgICAgICAgIHsKICAgICAgICAgICAgIGl0ZW1Qcm9wZXJ0eSA9IG5ldyBJcm90Qm94KHNvdXJjZSgpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdjJywgJ28nLCAnbCcsICdyJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJjb2xyIik6CiAgICAgICAgIHsKICAgICAgICAgICAgIGl0ZW1Qcm9wZXJ0eSA9IG5ldyBDb2xyQm94KHNvdXJjZSgpKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtOTY1LDEwICs5NjYsMTAgQEAKIH0KIAogc3RydWN0IElwcnBCb3ggOiBwdWJsaWMgQm94IHsKLSAgICBJcHJwQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgSXBycEJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsCiAgICAgICAgICAgICBWZWN0b3I8c3A8SXRlbVByb3BlcnR5PiA+ICpwcm9wZXJ0aWVzLAogICAgICAgICAgICAgVmVjdG9yPEFzc29jaWF0aW9uRW50cnk+ICphc3NvY2lhdGlvbnMpIDoKLSAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCdpJywgJ3AnLCAncicsICdwJykpLAorICAgICAgICBCb3goc291cmNlLCBGT1VSQ0MoImlwcnAiKSksCiAgICAgICAgIG1Qcm9wZXJ0aWVzKHByb3BlcnRpZXMpLCBtQXNzb2NpYXRpb25zKGFzc29jaWF0aW9ucykge30KIAogICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CkBAIC05OTIsMTIgKzk5MywxMiBAQAogCiBzdGF0dXNfdCBJcHJwQm94OjpvbkNodW5rRGF0YSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKICAgICBzd2l0Y2godHlwZSkgewotICAgICAgICBjYXNlIEZPVVJDQygnaScsICdwJywgJ2MnLCAnbycpOgorICAgICAgICBjYXNlIEZPVVJDQygiaXBjbyIpOgogICAgICAgICB7CiAgICAgICAgICAgICBJcGNvQm94IGlwY29Cb3goc291cmNlKCksIG1Qcm9wZXJ0aWVzKTsKICAgICAgICAgICAgIHJldHVybiBpcGNvQm94LnBhcnNlKG9mZnNldCwgc2l6ZSk7CiAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAncCcsICdtJywgJ2EnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImlwbWEiKToKICAgICAgICAgewogICAgICAgICAgICAgSXBtYUJveCBpcG1hQm94KHNvdXJjZSgpLCBtQXNzb2NpYXRpb25zKTsKICAgICAgICAgICAgIHJldHVybiBpcG1hQm94LnBhcnNlKG9mZnNldCwgc2l6ZSk7CkBAIC0xMDIyLDggKzEwMjMsOCBAQAogfTsKIAogc3RydWN0IEluZmVCb3ggOiBwdWJsaWMgRnVsbEJveCB7Ci0gICAgSW5mZUJveChEYXRhU291cmNlQmFzZSAqc291cmNlKSA6Ci0gICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoJ2knLCAnbicsICdmJywgJ2UnKSkge30KKyAgICBJbmZlQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkgOgorICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCJpbmZlIikpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUsIEl0ZW1JbmZvICppdGVtSW5mbyk7CiAKQEAgLTExMDMsNyArMTEwNCw3IEBACiAgICAgICAgIH0KICAgICAgICAgQUxPR1YoIml0ZW1fbmFtZSAlcyIsIGl0ZW1fbmFtZS5jX3N0cigpKTsKIAotICAgICAgICBpZiAoaXRlbV90eXBlID09IEZPVVJDQygnbScsICdpJywgJ20nLCAnZScpKSB7CisgICAgICAgIGlmIChpdGVtX3R5cGUgPT0gRk9VUkNDKCJtaW1lIikpIHsKICAgICAgICAgICAgIFN0cmluZzggY29udGVudF90eXBlOwogICAgICAgICAgICAgaWYgKCFwYXJzZU51bGxUZXJtaW5hdGVkU3RyaW5nKCZvZmZzZXQsICZzaXplLCAmY29udGVudF90eXBlKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CkBAIC0xMTE2LDcgKzExMTcsNyBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChpdGVtX3R5cGUgPT0gRk9VUkNDKCd1JywgJ3InLCAnaScsICcgJykpIHsKKyAgICAgICAgfSBlbHNlIGlmIChpdGVtX3R5cGUgPT0gRk9VUkNDKCJ1cmkgIikpIHsKICAgICAgICAgICAgIFN0cmluZzggaXRlbV91cmlfdHlwZTsKICAgICAgICAgICAgIGlmICghcGFyc2VOdWxsVGVybWluYXRlZFN0cmluZygmb2Zmc2V0LCAmc2l6ZSwgJml0ZW1fdXJpX3R5cGUpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKQEAgLTExMjcsMjAgKzExMjgsMTkgQEAKIH0KIAogc3RydWN0IElpbmZCb3ggOiBwdWJsaWMgRnVsbEJveCB7Ci0gICAgSWluZkJveChEYXRhU291cmNlQmFzZSAqc291cmNlLCBWZWN0b3I8SXRlbUluZm8+ICppdGVtSW5mb3MpIDoKLSAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygnaScsICdpJywgJ24nLCAnZicpKSwKLSAgICAgICAgbUl0ZW1JbmZvcyhpdGVtSW5mb3MpLCBtSGFzR3JpZHMoZmFsc2UpIHt9CisgICAgSWluZkJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIFZlY3RvcjxJdGVtSW5mbz4gKml0ZW1JbmZvcykgOgorICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCJpaW5mIikpLCBtSXRlbUluZm9zKGl0ZW1JbmZvcykge30KIAogICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CiAKLSAgICBib29sIGhhc0dyaWRzKCkgeyByZXR1cm4gbUhhc0dyaWRzOyB9CisgICAgYm9vbCBoYXNGb3VyQ0ModWludDMyX3QgdHlwZSkgeyByZXR1cm4gbUZvdXJDQ1NlZW4uY291bnQodHlwZSkgPiAwOyB9CiAKIHByb3RlY3RlZDoKICAgICBzdGF0dXNfdCBvbkNodW5rRGF0YSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOwogCiBwcml2YXRlOgogICAgIFZlY3RvcjxJdGVtSW5mbz4gKm1JdGVtSW5mb3M7Ci0gICAgYm9vbCBtSGFzR3JpZHM7CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVpbnQzMl90PiBtRm91ckNDU2VlbjsKIH07CiAKIHN0YXR1c190IElpbmZCb3g6OnBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewpAQCAtMTE3OCw3ICsxMTc4LDcgQEAKIH0KIAogc3RhdHVzX3QgSWluZkJveDo6b25DaHVua0RhdGEodWludDMyX3QgdHlwZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKHR5cGUgIT0gRk9VUkNDKCdpJywgJ24nLCAnZicsICdlJykpIHsKKyAgICBpZiAodHlwZSAhPSBGT1VSQ0MoImluZmUiKSkgewogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCkBAIC0xMTg3LDcgKzExODcsNyBAQAogICAgIHN0YXR1c190IGVyciA9IGluZmVCb3gucGFyc2Uob2Zmc2V0LCBzaXplLCAmaXRlbUluZm8pOwogICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgbUl0ZW1JbmZvcy0+cHVzaF9iYWNrKGl0ZW1JbmZvKTsKLSAgICAgICAgbUhhc0dyaWRzIHw9IChpdGVtSW5mby5pdGVtVHlwZSA9PSBGT1VSQ0MoJ2cnLCAncicsICdpJywgJ2QnKSk7CisgICAgICAgIG1Gb3VyQ0NTZWVuLmluc2VydChpdGVtSW5mby5pdGVtVHlwZSk7CiAgICAgfQogICAgIC8vIEluZmVCb3ggcGFyc2UgcmV0dXJucyBFUlJPUl9VTlNVUFBPUlRFRCBpZiB0aGUgYm94IGlmIGFuIHVuc3VwcG9ydGVkCiAgICAgLy8gdmVyc2lvbi4gSWdub3JlIHRoaXMgZXJyb3IgYXMgaXQncyBub3QgZmF0YWwuCkBAIC0xMTk2LDcgKzExOTYsNyBAQAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotSXRlbVRhYmxlOjpJdGVtVGFibGUoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKK0l0ZW1UYWJsZTo6SXRlbVRhYmxlKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICBtUHJpbWFyeUl0ZW1JZCgwKSwKICAgICAgIG1JZGF0T2Zmc2V0KDApLApAQCAtMTIxMywzMSArMTIxMywzMSBAQAogCiBzdGF0dXNfdCBJdGVtVGFibGU6OnBhcnNlKHVpbnQzMl90IHR5cGUsIG9mZjY0X3QgZGF0YV9vZmZzZXQsIHNpemVfdCBjaHVua19kYXRhX3NpemUpIHsKICAgICBzd2l0Y2godHlwZSkgewotICAgICAgICBjYXNlIEZPVVJDQygnaScsICdsJywgJ28nLCAnYycpOgorICAgICAgICBjYXNlIEZPVVJDQygiaWxvYyIpOgogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gcGFyc2VJbG9jQm94KGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwogICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ2knLCAnbicsICdmJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJpaW5mIik6CiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBwYXJzZUlpbmZCb3goZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CiAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAncCcsICdyJywgJ3AnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImlwcnAiKToKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIHBhcnNlSXBycEJveChkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKICAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygncCcsICdpJywgJ3QnLCAnbScpOgorICAgICAgICBjYXNlIEZPVVJDQygicGl0bSIpOgogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gcGFyc2VQaXRtQm94KGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwogICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdpJywgJ2QnLCAnYScsICd0Jyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJpZGF0Iik6CiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBwYXJzZUlkYXRCb3goZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CiAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAncicsICdlJywgJ2YnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImlyZWYiKToKICAgICAgICAgewogICAgICAgICAgICAgcmV0dXJuIHBhcnNlSXJlZkJveChkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKICAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygnaScsICdwJywgJ3InLCAnbycpOgorICAgICAgICBjYXNlIEZPVVJDQygiaXBybyIpOgogICAgICAgICB7CiAgICAgICAgICAgICBBTE9HVygiaXBybyBib3ggbm90IHN1cHBvcnRlZCEiKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTI3Niw3ICsxMjc2LDcgQEAKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICBpZiAoaWluZkJveC5oYXNHcmlkcygpKSB7CisgICAgaWYgKGlpbmZCb3guaGFzRm91ckNDKEZPVVJDQygiZ3JpZCIpKSB8fCBpaW5mQm94Lmhhc0ZvdXJDQyhGT1VSQ0MoIkV4aWYiKSkpIHsKICAgICAgICAgbVJlcXVpcmVkQm94ZXMuaW5zZXJ0KCdpcmVmJyk7CiAgICAgfQogCkBAIC0xMzU0LDkgKzEzNTQsOSBAQAogICAgICAgICAvLyAgICdncmlkJzogZGVyaXZlZCBpbWFnZSBmcm9tIHRpbGVzCiAgICAgICAgIC8vICAgJ2h2YzEnOiBjb2RlZCBpbWFnZSAob3IgdGlsZSkKICAgICAgICAgLy8gICAnRXhpZic6IEVYSUYgbWV0YWRhdGEKLSAgICAgICAgaWYgKGluZm8uaXRlbVR5cGUgIT0gRk9VUkNDKCdnJywgJ3InLCAnaScsICdkJykgJiYKLSAgICAgICAgICAgIGluZm8uaXRlbVR5cGUgIT0gRk9VUkNDKCdoJywgJ3YnLCAnYycsICcxJykgJiYKLSAgICAgICAgICAgIGluZm8uaXRlbVR5cGUgIT0gRk9VUkNDKCdFJywgJ3gnLCAnaScsICdmJykpIHsKKyAgICAgICAgaWYgKGluZm8uaXRlbVR5cGUgIT0gRk9VUkNDKCJncmlkIikgJiYKKyAgICAgICAgICAgIGluZm8uaXRlbVR5cGUgIT0gRk9VUkNDKCJodmMxIikgJiYKKyAgICAgICAgICAgIGluZm8uaXRlbVR5cGUgIT0gRk9VUkNDKCJFeGlmIikpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAKQEAgLTEzNzksNyArMTM3OSw3IEBACiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKGluZm8uaXRlbVR5cGUgPT0gRk9VUkNDKCdFJywgJ3gnLCAnaScsICdmJykpIHsKKyAgICAgICAgaWYgKGluZm8uaXRlbVR5cGUgPT0gRk9VUkNDKCJFeGlmIikpIHsKICAgICAgICAgICAgIC8vIE9ubHkgYWRkIGlmIHRoZSBFeGlmIGRhdGEgaXMgbm9uLWVtcHR5LiBUaGUgZmlyc3QgNCBieXRlcyBjb250YWluCiAgICAgICAgICAgICAvLyB0aGUgb2Zmc2V0IHRvIFRJRkYgaGVhZGVyLCB3aGljaCB0aGUgRXhpZiBwYXJzZXIgZG9lc24ndCB1c2UuCiAgICAgICAgICAgICBpZiAoc2l6ZSA+IDQpIHsKQEAgLTE0NzYsNyArMTQ3Niw3IEBACiAgICAgcmV0dXJuIG1JbWFnZUl0ZW1zVmFsaWQgPyBtRGlzcGxheWFibGVzLnNpemUoKSA6IDA7CiB9CiAKLXNwPE1ldGFEYXRhPiBJdGVtVGFibGU6OmdldEltYWdlTWV0YShjb25zdCB1aW50MzJfdCBpbWFnZUluZGV4KSB7CitBTWVkaWFGb3JtYXQgKkl0ZW1UYWJsZTo6Z2V0SW1hZ2VNZXRhKGNvbnN0IHVpbnQzMl90IGltYWdlSW5kZXgpIHsKICAgICBpZiAoIW1JbWFnZUl0ZW1zVmFsaWQpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMTUwMSw2NCArMTUwMSw4MCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgc3A8TWV0YURhdGE+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+aWNjLT5zaXplKCkpOwogICAgIH0KICAgICByZXR1cm4gbWV0YTsKIH0KQEAgLTE2NzEsOCArMTY4NywzMSBAQAogICAgIH0KIAogICAgIC8vIHNraXAgdGhlIGZpcnN0IDQtYnl0ZSBvZiB0aGUgb2Zmc2V0IHRvIFRJRkYgaGVhZGVyCi0gICAgKm9mZnNldCA9IG1JdGVtSWRUb0V4aWZNYXBbZXhpZkluZGV4XS5vZmZzZXQgKyA0OwotICAgICpzaXplID0gbUl0ZW1JZFRvRXhpZk1hcFtleGlmSW5kZXhdLnNpemUgLSA0OworICAgIHVpbnQzMl90IHRpZmZPZmZzZXQ7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgbUl0ZW1JZFRvRXhpZk1hcFtleGlmSW5kZXhdLm9mZnNldCwgJnRpZmZPZmZzZXQsIDQpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisKKyAgICAvLyBXZSBuZWVkICdFeGlmXDBcMCcgYmVmb3JlIHRoZSB0aWZmIGhlYWRlcgorICAgIHRpZmZPZmZzZXQgPSBudG9obCh0aWZmT2Zmc2V0KTsKKyAgICBpZiAodGlmZk9mZnNldCA8IDYpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgLy8gVGhlIGZpcnN0IDQtYnl0ZSBvZiB0aGUgaXRlbSBpcyB0aGUgb2Zmc2V0IG9mIHRoZSB0aWZmIGhlYWRlciB3aXRoaW4gdGhlCisgICAgLy8gZXhpZiBkYXRhLiBUaGUgc2l6ZSBvZiB0aGUgaXRlbSBzaG91bGQgYmUgPiA0IGZvciBhIG5vbi1lbXB0eSBleGlmICh0aGlzCisgICAgLy8gd2FzIGFscmVhZHkgY2hlY2tlZCB3aGVuIHRoZSBpdGVtIHdhcyBhZGRlZCkuIEFsc28gY2hlY2sgdGhhdCB0aGUgdGlmZgorICAgIC8vIGhlYWRlciBvZmZzZXQgaXMgdmFsaWQuCisgICAgaWYgKG1JdGVtSWRUb0V4aWZNYXBbZXhpZkluZGV4XS5zaXplIDw9IDQgfHwKKyAgICAgICAgICAgIHRpZmZPZmZzZXQgPiBtSXRlbUlkVG9FeGlmTWFwW2V4aWZJbmRleF0uc2l6ZSAtIDQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICAvLyBPZmZzZXQgb2YgJ0V4aWZcMFwwJyByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mICdFeGlmJyBpdGVtCisgICAgLy8gKGZpcnN0IDQtYnl0ZSBpcyB0aGUgdGlmZiBoZWFkZXIgb2Zmc2V0KQorICAgIHVpbnQzMl90IGV4aWZPZmZzZXQgPSA0ICsgdGlmZk9mZnNldCAtIDY7CisgICAgKm9mZnNldCA9IG1JdGVtSWRUb0V4aWZNYXBbZXhpZkluZGV4XS5vZmZzZXQgKyBleGlmT2Zmc2V0OworICAgICpzaXplID0gbUl0ZW1JZFRvRXhpZk1hcFtleGlmSW5kZXhdLnNpemUgLSBleGlmT2Zmc2V0OwogICAgIHJldHVybiBPSzsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmggYi9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuaAppbmRleCA1MzZkY2IwLi5iZTgxYjU5IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuaApAQCAtMTksMTMgKzE5LDE1IEBACiAKICNpbmNsdWRlIDxzZXQ+CiAKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgorCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBEYXRhU291cmNlQmFzZTsKK2NsYXNzIERhdGFTb3VyY2VIZWxwZXI7CiBjbGFzcyBNZXRhRGF0YTsKIAogbmFtZXNwYWNlIGhlaWYgewpAQCAtNDUsMTMgKzQ3LDEzIEBACiAKIGNsYXNzIEl0ZW1UYWJsZSA6IHB1YmxpYyBSZWZCYXNlIHsKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBJdGVtVGFibGUoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CisgICAgZXhwbGljaXQgSXRlbVRhYmxlKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAKICAgICBzdGF0dXNfdCBwYXJzZSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwogCiAgICAgYm9vbCBpc1ZhbGlkKCkgeyByZXR1cm4gbUltYWdlSXRlbXNWYWxpZDsgfQogICAgIHVpbnQzMl90IGNvdW50SW1hZ2VzKCkgY29uc3Q7Ci0gICAgc3A8TWV0YURhdGE+IGdldEltYWdlTWV0YShjb25zdCB1aW50MzJfdCBpbWFnZUluZGV4KTsKKyAgICBBTWVkaWFGb3JtYXQgKmdldEltYWdlTWV0YShjb25zdCB1aW50MzJfdCBpbWFnZUluZGV4KTsKICAgICBzdGF0dXNfdCBmaW5kSW1hZ2VJdGVtKGNvbnN0IHVpbnQzMl90IGltYWdlSW5kZXgsIHVpbnQzMl90ICppdGVtSW5kZXgpOwogICAgIHN0YXR1c190IGZpbmRUaHVtYm5haWxJdGVtKGNvbnN0IHVpbnQzMl90IGltYWdlSW5kZXgsIHVpbnQzMl90ICppdGVtSW5kZXgpOwogICAgIHN0YXR1c190IGdldEltYWdlT2Zmc2V0QW5kU2l6ZSgKQEAgLTYyLDcgKzY0LDcgQEAKICAgICB+SXRlbVRhYmxlKCk7CiAKIHByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogCiAgICAgS2V5ZWRWZWN0b3I8dWludDMyX3QsIEl0ZW1Mb2M+IG1JdGVtTG9jczsKICAgICBWZWN0b3I8SXRlbUluZm8+IG1JdGVtSW5mb3M7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5jcHAKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCA3YjNiODFkLi45ZDU4OTBjCi0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5jcHAKQEAgLTI0LDI4ICsyNCwzMSBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCisjaW5jbHVkZSA8bG9nL2xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSAiQUM0UGFyc2VyLmgiCiAjaW5jbHVkZSAiTVBFRzRFeHRyYWN0b3IuaCIKICNpbmNsdWRlICJTYW1wbGVUYWJsZS5oIgogI2luY2x1ZGUgIkl0ZW1UYWJsZS5oIgogI2luY2x1ZGUgImluY2x1ZGUvRVNEUy5oIgogCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9FeHRyYWN0b3JVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogI2luY2x1ZGUgPGJ5dGVzd2FwLmg+CkBAIC01NSw2ICs1OCw4IEBACiAjZGVmaW5lIFVJTlQzMl9NQVggICAgICAgKDQyOTQ5NjcyOTVVKQogI2VuZGlmCiAKKyNkZWZpbmUgQUxBQ19TUEVDSUZJQ19JTkZPX1NJWkUgKDM2KQorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGVudW0gewpAQCAtNjYsMzUgKzcxLDM4IEBACiAgICAga01heEF0b21TaXplID0gNjQgKiAxMDI0ICogMTAyNCwKIH07CiAKLWNsYXNzIE1QRUc0U291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworY2xhc3MgTVBFRzRTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CitzdGF0aWMgY29uc3Qgc2l6ZV90ICBrTWF4UGNtRnJhbWVTaXplID0gODE5MjsKIHB1YmxpYzoKICAgICAvLyBDYWxsZXIgcmV0YWlucyBvd25lcnNoaXAgb2YgYm90aCAiZGF0YVNvdXJjZSIgYW5kICJzYW1wbGVUYWJsZSIuCi0gICAgTVBFRzRTb3VyY2UoTWV0YURhdGFCYXNlICZmb3JtYXQsCi0gICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCisgICAgTVBFRzRTb3VyY2UoQU1lZGlhRm9ybWF0ICpmb3JtYXQsCisgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqZGF0YVNvdXJjZSwKICAgICAgICAgICAgICAgICBpbnQzMl90IHRpbWVTY2FsZSwKICAgICAgICAgICAgICAgICBjb25zdCBzcDxTYW1wbGVUYWJsZT4gJnNhbXBsZVRhYmxlLAogICAgICAgICAgICAgICAgIFZlY3RvcjxTaWR4RW50cnk+ICZzaWR4LAogICAgICAgICAgICAgICAgIGNvbnN0IFRyZXggKnRyZXgsCiAgICAgICAgICAgICAgICAgb2ZmNjRfdCBmaXJzdE1vb2ZPZmZzZXQsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3A8SXRlbVRhYmxlPiAmaXRlbVRhYmxlKTsKKyAgICAgICAgICAgICAgICBjb25zdCBzcDxJdGVtVGFibGU+ICZpdGVtVGFibGUsCisgICAgICAgICAgICAgICAgdWludDY0X3QgZWxzdFNoaWZ0U3RhcnRUaWNrcyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0KCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICYpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBib29sIHN1cHBvcnROb25ibG9ja2luZ1JlYWQoKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBmcmFnbWVudGVkUmVhZChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIGJvb2wgc3VwcG9ydHNOb25CbG9ja2luZ1JlYWQoKSBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBmcmFnbWVudGVkUmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogCiAgICAgdmlydHVhbCB+TVBFRzRTb3VyY2UoKTsKIAogcHJpdmF0ZToKICAgICBNdXRleCBtTG9jazsKIAotICAgIE1ldGFEYXRhQmFzZSAmbUZvcm1hdDsKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0ICptRm9ybWF0OworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIGludDMyX3QgbVRpbWVzY2FsZTsKICAgICBzcDxTYW1wbGVUYWJsZT4gbVNhbXBsZVRhYmxlOwogICAgIHVpbnQzMl90IG1DdXJyZW50U2FtcGxlSW5kZXg7CkBAIC0xMDQsNyArMTEyLDcgQEAKICAgICBvZmY2NF90IG1GaXJzdE1vb2ZPZmZzZXQ7CiAgICAgb2ZmNjRfdCBtQ3VycmVudE1vb2ZPZmZzZXQ7CiAgICAgb2ZmNjRfdCBtTmV4dE1vb2ZPZmZzZXQ7Ci0gICAgdWludDMyX3QgbUN1cnJlbnRUaW1lOworICAgIHVpbnQzMl90IG1DdXJyZW50VGltZTsgLy8gaW4gbWVkaWEgdGltZXNjYWxlIHRpY2tzCiAgICAgaW50MzJfdCBtTGFzdFBhcnNlZFRyYWNrSWQ7CiAgICAgaW50MzJfdCBtVHJhY2tJZDsKIApAQCAtMTI1LDIxICsxMzMsMjQgQEAKIAogICAgIGJvb2wgbUlzQVZDOwogICAgIGJvb2wgbUlzSEVWQzsKKyAgICBib29sIG1Jc0FDNDsKKyAgICBib29sIG1Jc1BjbTsKICAgICBzaXplX3QgbU5BTExlbmd0aFNpemU7CiAKICAgICBib29sIG1TdGFydGVkOwogCi0gICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOwotCi0gICAgTWVkaWFCdWZmZXJCYXNlICptQnVmZmVyOwotCi0gICAgYm9vbCBtV2FudHNOQUxGcmFnbWVudHM7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKm1CdWZmZXI7CiAKICAgICB1aW50OF90ICptU3JjQnVmZmVyOwogCiAgICAgYm9vbCBtSXNIZWlmOworICAgIGJvb2wgbUlzQXVkaW87CiAgICAgc3A8SXRlbVRhYmxlPiBtSXRlbVRhYmxlOwogCisgICAgLy8gU3RhcnQgb2Zmc2V0IGZyb20gY29tcG9zaXRpb24gdGltZSB0byBwcmVzZW50YXRpb24gdGltZS4KKyAgICAvLyBTdXBwb3J0IHNoaWZ0IG9ubHkgZm9yIHZpZGVvIHRyYWNrcyB0aHJvdWdoIG1FbHN0U2hpZnRTdGFydFRpY2tzIGZvciBub3cuCisgICAgdWludDY0X3QgbUVsc3RTaGlmdFN0YXJ0VGlja3M7CisKICAgICBzaXplX3QgcGFyc2VOQUxTaXplKGNvbnN0IHVpbnQ4X3QgKmRhdGEpIGNvbnN0OwogICAgIHN0YXR1c190IHBhcnNlQ2h1bmsob2ZmNjRfdCAqb2Zmc2V0KTsKICAgICBzdGF0dXNfdCBwYXJzZVRyYWNrRnJhZ21lbnRIZWFkZXIob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3Qgc2l6ZSk7CkBAIC0xNDgsNiArMTU5LDggQEAKICAgICBzdGF0dXNfdCBwYXJzZVNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uT2Zmc2V0cyhvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBzaXplKTsKICAgICBzdGF0dXNfdCBwYXJzZUNsZWFyRW5jcnlwdGVkU2l6ZXMob2ZmNjRfdCBvZmZzZXQsIGJvb2wgaXNTdWJzYW1wbGVFbmNyeXB0aW9uLCB1aW50MzJfdCBmbGFncyk7CiAgICAgc3RhdHVzX3QgcGFyc2VTYW1wbGVFbmNyeXB0aW9uKG9mZjY0X3Qgb2Zmc2V0KTsKKyAgICAvLyByZXR1cm5zIC0xIGZvciBpbnZhbGlkIGxheWVyIElECisgICAgaW50MzJfdCBwYXJzZUhFVkNMYXllcklkKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKTsKIAogICAgIHN0cnVjdCBUcmFja0ZyYWdtZW50SGVhZGVySW5mbyB7CiAgICAgICAgIGVudW0gRmxhZ3MgewpAQCAtMTkzLDE0ICsyMDYsMTQgQEAKIC8vIHBvc3NpYmx5IHdyYXBwaW5nIG11bHRpcGxlIHRpbWVzIHRvIGNvdmVyIGFsbCB0cmFja3MsIGkuZS4KIC8vIEVhY2ggQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSBjYWNoZXMgdGhlIHNhbXBsZXRhYmxlIG1ldGFkYXRhIGZvciBhIHNpbmdsZSB0cmFjay4KIAotc3RydWN0IENhY2hlZFJhbmdlZERhdGFTb3VyY2UgOiBwdWJsaWMgRGF0YVNvdXJjZUJhc2UgewotICAgIGV4cGxpY2l0IENhY2hlZFJhbmdlZERhdGFTb3VyY2UoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CitjbGFzcyBDYWNoZWRSYW5nZWREYXRhU291cmNlIDogcHVibGljIERhdGFTb3VyY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IENhY2hlZFJhbmdlZERhdGFTb3VyY2UoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKTsKICAgICB2aXJ0dWFsIH5DYWNoZWRSYW5nZWREYXRhU291cmNlKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7Ci0gICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOworICAgIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKSBvdmVycmlkZTsKKyAgICB1aW50MzJfdCBmbGFncygpIG92ZXJyaWRlOwogCiAgICAgc3RhdHVzX3Qgc2V0Q2FjaGVkUmFuZ2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBib29sIGFzc3VtZVNvdXJjZU93bmVyc2hpcE9uU3VjY2Vzcyk7CiAKQEAgLTIwOCw3ICsyMjEsNyBAQAogcHJpdmF0ZToKICAgICBNdXRleCBtTG9jazsKIAotICAgIERhdGFTb3VyY2VCYXNlICptU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1Tb3VyY2U7CiAgICAgYm9vbCBtT3duc0RhdGFTb3VyY2U7CiAgICAgb2ZmNjRfdCBtQ2FjaGVkT2Zmc2V0OwogICAgIHNpemVfdCBtQ2FjaGVkU2l6ZTsKQEAgLTIyMCw4ICsyMzMsOSBAQAogICAgIENhY2hlZFJhbmdlZERhdGFTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBDYWNoZWRSYW5nZWREYXRhU291cmNlICYpOwogfTsKIAotQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZTo6Q2FjaGVkUmFuZ2VkRGF0YVNvdXJjZShEYXRhU291cmNlQmFzZSAqc291cmNlKQotICAgIDogbVNvdXJjZShzb3VyY2UpLAorQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZTo6Q2FjaGVkUmFuZ2VkRGF0YVNvdXJjZShEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCisgICAgOiBEYXRhU291cmNlSGVscGVyKHNvdXJjZSksCisgICAgICBtU291cmNlKHNvdXJjZSksCiAgICAgICBtT3duc0RhdGFTb3VyY2UoZmFsc2UpLAogICAgICAgbUNhY2hlZE9mZnNldCgwKSwKICAgICAgIG1DYWNoZWRTaXplKDApLApAQCAtMjMxLDcgKzI0NSw3IEBACiBDYWNoZWRSYW5nZWREYXRhU291cmNlOjp+Q2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSgpIHsKICAgICBjbGVhckNhY2hlKCk7CiAgICAgaWYgKG1Pd25zRGF0YVNvdXJjZSkgewotICAgICAgICBkZWxldGUgKENhY2hlZFJhbmdlZERhdGFTb3VyY2UqKW1Tb3VyY2U7CisgICAgICAgIGRlbGV0ZSBtU291cmNlOwogICAgIH0KIH0KIApAQCAtMjQ1LDEwICsyNTksNiBAQAogICAgIG1DYWNoZWRTaXplID0gMDsKIH0KIAotc3RhdHVzX3QgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZTo6aW5pdENoZWNrKCkgY29uc3QgewotICAgIHJldHVybiBtU291cmNlLT5pbml0Q2hlY2soKTsKLX0KLQogc3NpemVfdCBDYWNoZWRSYW5nZWREYXRhU291cmNlOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIApAQCAtMzAxLDI5ICszMTEsNDkgQEAKIAogc3RhdGljIGNvbnN0IGNoYXIgKkZvdXJDQzJNSU1FKHVpbnQzMl90IGZvdXJjYykgewogICAgIHN3aXRjaCAoZm91cmNjKSB7Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICdhJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJtcDRhIik6CiAgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDOwogCi0gICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ2EnLCAnbScsICdyJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJzYW1yIik6CiAgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05COwogCi0gICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ2EnLCAndycsICdiJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJzYXdiIik6CiAgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCOwogCi0gICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ3AnLCAnNCcsICd2Jyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJlYy0zIik6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMzsKKworICAgICAgICBjYXNlIEZPVVJDQygibXA0diIpOgogICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0OwogCi0gICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJzInLCAnNicsICczJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJzInLCAnNicsICczJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdIJywgJzInLCAnNicsICczJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJzMjYzIik6CisgICAgICAgIGNhc2UgRk9VUkNDKCJoMjYzIik6CisgICAgICAgIGNhc2UgRk9VUkNDKCJIMjYzIik6CiAgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MzsKIAotICAgICAgICBjYXNlIEZPVVJDQygnYScsICd2JywgJ2MnLCAnMScpOgorICAgICAgICBjYXNlIEZPVVJDQygiYXZjMSIpOgogICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQzsKIAotICAgICAgICBjYXNlIEZPVVJDQygnaCcsICd2JywgJ2MnLCAnMScpOgotICAgICAgICBjYXNlIEZPVVJDQygnaCcsICdlJywgJ3YnLCAnMScpOgorICAgICAgICBjYXNlIEZPVVJDQygiaHZjMSIpOgorICAgICAgICBjYXNlIEZPVVJDQygiaGV2MSIpOgogICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkM7CisgICAgICAgIGNhc2UgRk9VUkNDKCJhYy00Iik6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0OworICAgICAgICBjYXNlIEZPVVJDQygiT3B1cyIpOgorICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVM7CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoInR3b3MiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInNvd3QiKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19SQVc7CisgICAgICAgIGNhc2UgRk9VUkNDKCJhbGFjIik6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fQUxBQzsKKyAgICAgICAgY2FzZSBGT1VSQ0MoImZMYUMiKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDOworICAgICAgICBjYXNlIEZPVVJDQygiYXYwMSIpOgorICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMTsKKyAgICAgICAgY2FzZSBGT1VSQ0MoIi5tcDMiKToKKyAgICAgICAgY2FzZSAweDZENzMwMDU1OiAvLyAibXMgVSIgbXAzIGF1ZGlvCisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRzsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dXKCJVbmtub3duIGZvdXJjYzogJWMlYyVjJWMiLAogICAgICAgICAgICAgICAgICAgIChmb3VyY2MgPj4gMjQpICYgMHhmZiwKQEAgLTM1MCwxMiArMzgwLDExIEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1NUEVHNEV4dHJhY3Rvcjo6TVBFRzRFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgY29uc3QgY2hhciAqbWltZSkKK01QRUc0RXh0cmFjdG9yOjpNUEVHNEV4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpCiAgICAgOiBtTW9vZk9mZnNldCgwKSwKICAgICAgIG1Nb29mRm91bmQoZmFsc2UpLAogICAgICAgbU1kYXRGb3VuZChmYWxzZSksCiAgICAgICBtRGF0YVNvdXJjZShzb3VyY2UpLAotICAgICAgbUNhY2hlZFNvdXJjZShOVUxMKSwKICAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCiAgICAgICBtSGVhZGVyVGltZXNjYWxlKDApLAogICAgICAgbUlzUVQoZmFsc2UpLApAQCAtMzY1LDYgKzM5NCw3IEBACiAgICAgICBtRmlyc3RUcmFjayhOVUxMKSwKICAgICAgIG1MYXN0VHJhY2soTlVMTCkgewogICAgIEFMT0dWKCJtaW1lPSVzLCBtUHJlZmVySGVpZj0lZCIsIG1pbWUsIG1QcmVmZXJIZWlmKTsKKyAgICBtRmlsZU1ldGFEYXRhID0gQU1lZGlhRm9ybWF0X25ldygpOwogfQogCiBNUEVHNEV4dHJhY3Rvcjo6fk1QRUc0RXh0cmFjdG9yKCkgewpAQCAtMzgyLDcgKzQxMiw4IEBACiAgICAgfQogICAgIG1Qc3NoLmNsZWFyKCk7CiAKLSAgICBkZWxldGUgbUNhY2hlZFNvdXJjZTsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtRmlsZU1ldGFEYXRhKTsKIH0KIAogdWludDMyX3QgTVBFRzRFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgewpAQCAtMzkxLDEzICs0MjIsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgKENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9TRUVLKSA6IDApOwogfQogCi1zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CiAgICAgc3RhdHVzX3QgZXJyOwogICAgIGlmICgoZXJyID0gcmVhZE1ldGFEYXRhKCkpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQotICAgIG1ldGEgPSBtRmlsZU1ldGFEYXRhOwotICAgIHJldHVybiBPSzsKKyAgICBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtRmlsZU1ldGFEYXRhKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiBzaXplX3QgTVBFRzRFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewpAQCAtNDE4LDE4ICs0NDksMTggQEAKICAgICByZXR1cm4gbjsKIH0KIAotc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKICAgICBzdGF0dXNfdCBlcnI7CiAgICAgaWYgKChlcnIgPSByZWFkTWV0YURhdGEoKSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICBUcmFjayAqdHJhY2sgPSBtRmlyc3RUcmFjazsKICAgICB3aGlsZSAoaW5kZXggPiAwKSB7CiAgICAgICAgIGlmICh0cmFjayA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogCiAgICAgICAgIHRyYWNrID0gdHJhY2stPm5leHQ7CkBAIC00MzcsMTYgKzQ2OCwxOCBAQAogICAgIH0KIAogICAgIGlmICh0cmFjayA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgWz1dIHsKICAgICAgICAgaW50NjRfdCBkdXJhdGlvbjsKICAgICAgICAgaW50MzJfdCBzYW1wbGVyYXRlOworICAgICAgICAvLyBPbmx5IGZvciBhdWRpbyB0cmFjay4KICAgICAgICAgaWYgKHRyYWNrLT5oYXNfZWxzdCAmJiBtSGVhZGVyVGltZXNjYWxlICE9IDAgJiYKLSAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb24pICYmCi0gICAgICAgICAgICAgICAgdHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlcmF0ZSkpIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50NjQodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICZkdXJhdGlvbikgJiYKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsICZzYW1wbGVyYXRlKSkgewogCisgICAgICAgICAgICAvLyBFbHN0IGhhcyB0byBiZSBwcm9jZXNzZWQgb25seSB0aGUgZmlyc3QgdGltZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KICAgICAgICAgICAgIHRyYWNrLT5oYXNfZWxzdCA9IGZhbHNlOwogCiAgICAgICAgICAgICBpZiAodHJhY2stPmVsc3Rfc2VnbWVudF9kdXJhdGlvbiA+IElOVDY0X01BWCkgewpAQCAtNDU0LDY1ICs0ODcsODQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGludDY0X3Qgc2VnbWVudF9kdXJhdGlvbiA9IHRyYWNrLT5lbHN0X3NlZ21lbnRfZHVyYXRpb247CiAgICAgICAgICAgICBpbnQ2NF90IG1lZGlhX3RpbWUgPSB0cmFjay0+ZWxzdF9tZWRpYV90aW1lOwotICAgICAgICAgICAgaW50NjRfdCBoYWxmc2NhbGUgPSBtSGVhZGVyVGltZXNjYWxlIC8gMjsKLSAgICAgICAgICAgIEFMT0dWKCJzZWdtZW50X2R1cmF0aW9uID0gJSIgUFJJZDY0ICIsIG1lZGlhX3RpbWUgPSAlIiBQUklkNjQKLSAgICAgICAgICAgICAgICAgICIsIGhhbGZzY2FsZSA9ICUiIFBSSWQ2NCAiLCB0aW1lc2NhbGUgPSAlZCIsCi0gICAgICAgICAgICAgICAgICBzZWdtZW50X2R1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgbWVkaWFfdGltZSwKLSAgICAgICAgICAgICAgICAgIGhhbGZzY2FsZSwKLSAgICAgICAgICAgICAgICAgIG1IZWFkZXJUaW1lc2NhbGUpOworICAgICAgICAgICAgaW50NjRfdCBoYWxmc2NhbGUgPSB0cmFjay0+dGltZXNjYWxlIC8gMjsKIAotICAgICAgICAgICAgaW50NjRfdCBkZWxheTsKLSAgICAgICAgICAgIC8vIGRlbGF5ID0gKChtZWRpYV90aW1lICogc2FtcGxlcmF0ZSkgKyBoYWxmc2NhbGUpIC8gbUhlYWRlclRpbWVzY2FsZTsKLSAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KG1lZGlhX3RpbWUsIHNhbXBsZXJhdGUsICZkZWxheSkgfHwKLSAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhkZWxheSwgaGFsZnNjYWxlLCAmZGVsYXkpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChkZWxheSAvPSBtSGVhZGVyVGltZXNjYWxlLCBmYWxzZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgZGVsYXkgPiBJTlQzMl9NQVggfHwKLSAgICAgICAgICAgICAgICAgICAgZGVsYXkgPCBJTlQzMl9NSU4pIHsKLSAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBBTE9HVigic2VnbWVudF9kdXJhdGlvbiA9ICUiIFBSSWQ2NCAiLCBtZWRpYV90aW1lID0gJSIgUFJJZDY0CisgICAgICAgICAgICAgICAgICAiLCBoYWxmc2NhbGUgPSAlIiBQUklkNjQgIiwgbWRoZF90aW1lc2NhbGUgPSAlZCwgdHJhY2tfdGltZXNjYWxlID0gJXUiLAorICAgICAgICAgICAgICAgICAgc2VnbWVudF9kdXJhdGlvbiwgbWVkaWFfdGltZSwKKyAgICAgICAgICAgICAgICAgIGhhbGZzY2FsZSwgbUhlYWRlclRpbWVzY2FsZSwgdHJhY2stPnRpbWVzY2FsZSk7CisKKyAgICAgICAgICAgIGlmICgodWludDMyX3Qpc2FtcGxlcmF0ZSAhPSB0cmFjay0+dGltZXNjYWxlKXsKKyAgICAgICAgICAgICAgICBBTE9HVigic2FtcGxlcmF0ZTolIiBQUklkMzIgIiwgdHJhY2stPnRpbWVzY2FsZSBhbmQgc2FtcGxlcmF0ZSBhcmUgZGlmZmVyZW50ISIsCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZXJhdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQm90aCBkZWxheSBhbmQgcGFkZGluZ3NhbXBsZXMgaGF2ZSB0byBiZSBzZXQgaW5vcmRlciBmb3IgZWl0aGVyIHRvIGJlCisgICAgICAgICAgICAvLyBlZmZlY3RpdmUgaW4gdGhlIGxvd2VyIGxheWVycy4KKyAgICAgICAgICAgIGludDY0X3QgZGVsYXkgPSAwOworICAgICAgICAgICAgaWYgKG1lZGlhX3RpbWUgPiAwKSB7IC8vIEdhcGxlc3MgcGxheWJhY2sKKyAgICAgICAgICAgICAgICAvLyBkZWxheSA9ICgobWVkaWFfdGltZSAqIHNhbXBsZXJhdGUpICsgaGFsZnNjYWxlKSAvIHRyYWNrLT50aW1lc2NhbGU7CisgICAgICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cobWVkaWFfdGltZSwgc2FtcGxlcmF0ZSwgJmRlbGF5KSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhkZWxheSwgaGFsZnNjYWxlLCAmZGVsYXkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoZGVsYXkgLz0gdHJhY2stPnRpbWVzY2FsZSwgZmFsc2UpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBkZWxheSA+IElOVDMyX01BWCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXkgPCBJTlQzMl9NSU4pIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nIGVkaXQgbGlzdCB3aXRoIGJvZ3VzIHZhbHVlcyIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1YoImRlbGF5ID0gJSIgUFJJZDY0LCBkZWxheSk7Ci0gICAgICAgICAgICB0cmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlckRlbGF5LCBkZWxheSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9ERUxBWSwgZGVsYXkpOwogCi0gICAgICAgICAgICBpbnQ2NF90IHNjYWxlZF9kdXJhdGlvbjsKLSAgICAgICAgICAgIC8vIHNjYWxlZF9kdXJhdGlvbiA9IGR1cmF0aW9uICogbUhlYWRlclRpbWVzY2FsZTsKLSAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KGR1cmF0aW9uLCBtSGVhZGVyVGltZXNjYWxlLCAmc2NhbGVkX2R1cmF0aW9uKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJzY2FsZWRfZHVyYXRpb24gPSAlIiBQUklkNjQsIHNjYWxlZF9kdXJhdGlvbik7CisgICAgICAgICAgICBpbnQ2NF90IHBhZGRpbmdzYW1wbGVzID0gMDsKKyAgICAgICAgICAgIGlmIChzZWdtZW50X2R1cmF0aW9uID4gMCkgeworICAgICAgICAgICAgICAgIGludDY0X3Qgc2NhbGVkX2R1cmF0aW9uOworICAgICAgICAgICAgICAgIC8vIHNjYWxlZF9kdXJhdGlvbiA9IGR1cmF0aW9uICogbUhlYWRlclRpbWVzY2FsZTsKKyAgICAgICAgICAgICAgICBpZiAoX19idWlsdGluX211bF9vdmVyZmxvdyhkdXJhdGlvbiwgbUhlYWRlclRpbWVzY2FsZSwgJnNjYWxlZF9kdXJhdGlvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigic2NhbGVkX2R1cmF0aW9uID0gJSIgUFJJZDY0LCBzY2FsZWRfZHVyYXRpb24pOwogCi0gICAgICAgICAgICBpbnQ2NF90IHNlZ21lbnRfZW5kOwotICAgICAgICAgICAgaW50NjRfdCBwYWRkaW5nOwotICAgICAgICAgICAgLy8gcGFkZGluZyA9IHNjYWxlZF9kdXJhdGlvbiAtICgoc2VnbWVudF9kdXJhdGlvbiArIG1lZGlhX3RpbWUpICogMTAwMDAwMCk7Ci0gICAgICAgICAgICBpZiAoX19idWlsdGluX2FkZF9vdmVyZmxvdyhzZWdtZW50X2R1cmF0aW9uLCBtZWRpYV90aW1lLCAmc2VnbWVudF9lbmQpIHx8Ci0gICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3coc2VnbWVudF9lbmQsIDEwMDAwMDAsICZzZWdtZW50X2VuZCkgfHwKLSAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX3N1Yl9vdmVyZmxvdyhzY2FsZWRfZHVyYXRpb24sIHNlZ21lbnRfZW5kLCAmcGFkZGluZykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigic2VnbWVudF9lbmQgPSAlIiBQUklkNjQgIiwgcGFkZGluZyA9ICUiIFBSSWQ2NCwgc2VnbWVudF9lbmQsIHBhZGRpbmcpOwotCi0gICAgICAgICAgICBpZiAocGFkZGluZyA8IDApIHsKLSAgICAgICAgICAgICAgICAvLyB0cmFjayBkdXJhdGlvbiBmcm9tIG1lZGlhIGhlYWRlciAod2hpY2ggaXMgd2hhdCBrS2V5RHVyYXRpb24gaXMpIG1pZ2h0Ci0gICAgICAgICAgICAgICAgLy8gYmUgc2xpZ2h0bHkgc2hvcnRlciB0aGFuIHRoZSBzZWdtZW50IGR1cmF0aW9uLCB3aGljaCB3b3VsZCBtYWtlIHRoZQorICAgICAgICAgICAgICAgIGludDY0X3Qgc2VnbWVudF9lbmQ7CisgICAgICAgICAgICAgICAgaW50NjRfdCBwYWRkaW5nOworICAgICAgICAgICAgICAgIGludDY0X3Qgc2VnbWVudF9kdXJhdGlvbl9lNjsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IG1lZGlhX3RpbWVfc2NhbGVkX2U2OworICAgICAgICAgICAgICAgIGludDY0X3QgbWVkaWFfdGltZV9zY2FsZWQ7CisgICAgICAgICAgICAgICAgLy8gcGFkZGluZyA9IHNjYWxlZF9kdXJhdGlvbiAtICgoc2VnbWVudF9kdXJhdGlvbiAqIDEwMDAwMDApICsKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICgobWVkaWFfdGltZSAqIG1IZWFkZXJUaW1lc2NhbGUgKiAxMDAwMDAwKS90cmFjay0+dGltZXNjYWxlKSApCisgICAgICAgICAgICAgICAgLy8gc2VnbWVudF9kdXJhdGlvbiBpcyBiYXNlZCBvbiB0aW1lc2NhbGUgaW4gbW92aWUgaGVhZGVyIGJveChtZGhkKQorICAgICAgICAgICAgICAgIC8vIG1lZGlhX3RpbWUgaXMgYmFzZWQgb24gdGltZXNjYWxlIHRyYWNrIGhlYWRlci9tZWRpYSB0aW1lc2NhbGUKKyAgICAgICAgICAgICAgICBpZiAoX19idWlsdGluX211bF9vdmVyZmxvdyhzZWdtZW50X2R1cmF0aW9uLCAxMDAwMDAwLCAmc2VnbWVudF9kdXJhdGlvbl9lNikgfHwKKyAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhtZWRpYV90aW1lLCBtSGVhZGVyVGltZXNjYWxlLCAmbWVkaWFfdGltZV9zY2FsZWQpIHx8CisgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cobWVkaWFfdGltZV9zY2FsZWQsIDEwMDAwMDAsICZtZWRpYV90aW1lX3NjYWxlZF9lNikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtZWRpYV90aW1lX3NjYWxlZF9lNiAvPSB0cmFjay0+dGltZXNjYWxlOworICAgICAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fYWRkX292ZXJmbG93KHNlZ21lbnRfZHVyYXRpb25fZTYsIG1lZGlhX3RpbWVfc2NhbGVkX2U2LCAmc2VnbWVudF9lbmQpCisgICAgICAgICAgICAgICAgICAgIHx8IF9fYnVpbHRpbl9zdWJfb3ZlcmZsb3coc2NhbGVkX2R1cmF0aW9uLCBzZWdtZW50X2VuZCwgJnBhZGRpbmcpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoInNlZ21lbnRfZW5kID0gJSIgUFJJZDY0ICIsIHBhZGRpbmcgPSAlIiBQUklkNjQsIHNlZ21lbnRfZW5kLCBwYWRkaW5nKTsKKyAgICAgICAgICAgICAgICAvLyB0cmFjayBkdXJhdGlvbiBmcm9tIG1lZGlhIGhlYWRlciAod2hpY2ggaXMgd2hhdCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OIGlzKQorICAgICAgICAgICAgICAgIC8vIG1pZ2h0IGJlIHNsaWdodGx5IHNob3J0ZXIgdGhhbiB0aGUgc2VnbWVudCBkdXJhdGlvbiwgd2hpY2ggd291bGQgbWFrZSB0aGUKICAgICAgICAgICAgICAgICAvLyBwYWRkaW5nIG5lZ2F0aXZlLiBDbGFtcCB0byB6ZXJvLgotICAgICAgICAgICAgICAgIHBhZGRpbmcgPSAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQ2NF90IHBhZGRpbmdzYW1wbGVzOwotICAgICAgICAgICAgaW50NjRfdCBoYWxmc2NhbGVfZTY7Ci0gICAgICAgICAgICBpbnQ2NF90IHRpbWVzY2FsZV9lNjsKLSAgICAgICAgICAgIC8vIHBhZGRpbmdzYW1wbGVzID0gKChwYWRkaW5nICogc2FtcGxlcmF0ZSkgKyAoaGFsZnNjYWxlICogMTAwMDAwMCkpCi0gICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAvIChtSGVhZGVyVGltZXNjYWxlICogMTAwMDAwMCk7Ci0gICAgICAgICAgICBpZiAoX19idWlsdGluX211bF9vdmVyZmxvdyhwYWRkaW5nLCBzYW1wbGVyYXRlLCAmcGFkZGluZ3NhbXBsZXMpIHx8Ci0gICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3coaGFsZnNjYWxlLCAxMDAwMDAwLCAmaGFsZnNjYWxlX2U2KSB8fAotICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fbXVsX292ZXJmbG93KG1IZWFkZXJUaW1lc2NhbGUsIDEwMDAwMDAsICZ0aW1lc2NhbGVfZTYpIHx8Ci0gICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3cocGFkZGluZ3NhbXBsZXMsIGhhbGZzY2FsZV9lNiwgJnBhZGRpbmdzYW1wbGVzKSB8fAotICAgICAgICAgICAgICAgICAgICAocGFkZGluZ3NhbXBsZXMgLz0gdGltZXNjYWxlX2U2LCBmYWxzZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgcGFkZGluZ3NhbXBsZXMgPiBJTlQzMl9NQVgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgaWYgKHBhZGRpbmcgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgaGFsZnNjYWxlX21odCA9IG1IZWFkZXJUaW1lc2NhbGUgLyAyOworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGhhbGZzY2FsZV9lNjsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc2NhbGVfZTY7CisgICAgICAgICAgICAgICAgICAgIC8vIHBhZGRpbmdzYW1wbGVzID0gKChwYWRkaW5nICogc2FtcGxlcmF0ZSkgKyAoaGFsZnNjYWxlX21odCAqIDEwMDAwMDApKQorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAvIChtSGVhZGVyVGltZXNjYWxlICogMTAwMDAwMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KHBhZGRpbmcsIHNhbXBsZXJhdGUsICZwYWRkaW5nc2FtcGxlcykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fbXVsX292ZXJmbG93KGhhbGZzY2FsZV9taHQsIDEwMDAwMDAsICZoYWxmc2NhbGVfZTYpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhtSGVhZGVyVGltZXNjYWxlLCAxMDAwMDAwLCAmdGltZXNjYWxlX2U2KSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3cocGFkZGluZ3NhbXBsZXMsIGhhbGZzY2FsZV9lNiwgJnBhZGRpbmdzYW1wbGVzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWRkaW5nc2FtcGxlcyAvPSB0aW1lc2NhbGVfZTYsIGZhbHNlKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmdzYW1wbGVzID4gSU5UMzJfTUFYKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigicGFkZGluZ3NhbXBsZXMgPSAlIiBQUklkNjQsIHBhZGRpbmdzYW1wbGVzKTsKLSAgICAgICAgICAgIHRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlFbmNvZGVyUGFkZGluZywgcGFkZGluZ3NhbXBsZXMpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfUEFERElORywgcGFkZGluZ3NhbXBsZXMpOwogICAgICAgICB9CiAgICAgfSgpOwogCkBAIC01MjEsNyArNTczLDcgQEAKICAgICAgICAgdHJhY2stPmluY2x1ZGVzX2V4cGVuc2l2ZV9tZXRhZGF0YSA9IHRydWU7CiAKICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgQ0hFQ0sodHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSk7CiAgICAgICAgIGlmICghc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUsIDYpKSB7CiAgICAgICAgICAgICAvLyBNUEVHMiB0cmFja3MgZG8gbm90IHByb3ZpZGUgQ1NELCBzbyByZWFkIHRoZSBzdHJlYW0gaGVhZGVyCiAgICAgICAgICAgICBpZiAoIXN0cmNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMikpIHsKQEAgLTUzNCwzNiArNTg2LDM4IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBoZWFkZXJba01heFRyYWNrSGVhZGVyU2l6ZV07CiAgICAgICAgICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgJmhlYWRlciwgc2l6ZSkgPT0gKHNzaXplX3Qpc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0RGF0YShrS2V5U3RyZWFtSGVhZGVyLCAnbWRhdCcsIGhlYWRlciwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKHRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01QRUcyX1NUUkVBTV9IRUFERVIsIGhlYWRlciwgc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtTW9vZk9mZnNldCA+IDApIHsKICAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uOwotICAgICAgICAgICAgICAgIGlmICh0cmFjay0+bWV0YS5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb24pKSB7CisgICAgICAgICAgICAgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRJbnQ2NCh0cmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICZkdXJhdGlvbikpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyBmYW5jeSwganVzdCBwaWNrIGEgZnJhbWUgbmVhciAxLzR0aCBvZiB0aGUgZHVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleVRodW1ibmFpbFRpbWUsIGR1cmF0aW9uIC8gNCk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCh0cmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9USU1FLCBkdXJhdGlvbiAvIDQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXg7Ci0gICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlVGltZTsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBzYW1wbGVUaW1lOwogICAgICAgICAgICAgICAgIGlmICh0cmFjay0+dGltZXNjYWxlICE9IDAgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zYW1wbGVUYWJsZS0+ZmluZFRodW1ibmFpbFNhbXBsZSgmc2FtcGxlSW5kZXgpID09IE9LCiAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0cmFjay0+c2FtcGxlVGFibGUtPmdldE1ldGFEYXRhRm9yU2FtcGxlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUluZGV4LCBOVUxMIC8qIG9mZnNldCAqLywgTlVMTCAvKiBzaXplICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lKSA9PSBPSykgewotICAgICAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VGh1bWJuYWlsVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludDY0X3Qpc2FtcGxlVGltZSAqIDEwMDAwMDApIC8gdHJhY2stPnRpbWVzY2FsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQodHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1RJTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50NjRfdClzYW1wbGVUaW1lICogMTAwMDAwMCkgLyB0cmFjay0+dGltZXNjYWxlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBtZXRhID0gdHJhY2stPm1ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIHRyYWNrLT5tZXRhKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiBzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cmVhZE1ldGFEYXRhKCkgewpAQCAtNTk4LDEyICs2NTIsMTQgQEAKICAgICAgICAgb2ZmNjRfdCBleGlmT2Zmc2V0OwogICAgICAgICBzaXplX3QgZXhpZlNpemU7CiAgICAgICAgIGlmIChtSXRlbVRhYmxlLT5nZXRFeGlmT2Zmc2V0QW5kU2l6ZSgmZXhpZk9mZnNldCwgJmV4aWZTaXplKSA9PSBPSykgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRJbnQ2NChrS2V5RXhpZk9mZnNldCwgKGludDY0X3QpZXhpZk9mZnNldCk7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldEludDY0KGtLZXlFeGlmU2l6ZSwgKGludDY0X3QpZXhpZlNpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9PRkZTRVQsIChpbnQ2NF90KWV4aWZPZmZzZXQpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9TSVpFLCAoaW50NjRfdClleGlmU2l6ZSk7CiAgICAgICAgIH0KICAgICAgICAgZm9yICh1aW50MzJfdCBpbWFnZUluZGV4ID0gMDsKICAgICAgICAgICAgICAgICBpbWFnZUluZGV4IDwgbUl0ZW1UYWJsZS0+Y291bnRJbWFnZXMoKTsgaW1hZ2VJbmRleCsrKSB7Ci0gICAgICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1JdGVtVGFibGUtPmdldEltYWdlTWV0YShpbWFnZUluZGV4KTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IG1JdGVtVGFibGUtPmdldEltYWdlTWV0YShpbWFnZUluZGV4KTsKICAgICAgICAgICAgIGlmIChtZXRhID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiaGVpZiBpbWFnZSAldSBoYXMgbm8gbWV0YSEiLCBpbWFnZUluZGV4KTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTYyMCw3ICs2NzYsNiBAQAogCiAgICAgICAgICAgICBBTE9HVigiYWRkaW5nIEhFSUYgaW1hZ2UgdHJhY2sgJXUiLCBpbWFnZUluZGV4KTsKICAgICAgICAgICAgIFRyYWNrICp0cmFjayA9IG5ldyBUcmFjazsKLSAgICAgICAgICAgIHRyYWNrLT5uZXh0ID0gTlVMTDsKICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5uZXh0ID0gdHJhY2s7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNjI4LDI2ICs2ODMsMjYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1MYXN0VHJhY2sgPSB0cmFjazsKIAotICAgICAgICAgICAgdHJhY2stPm1ldGEgPSAqKG1ldGEuZ2V0KCkpOwotICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVRyYWNrSUQsIGltYWdlSW5kZXgpOwotICAgICAgICAgICAgdHJhY2stPmluY2x1ZGVzX2V4cGVuc2l2ZV9tZXRhZGF0YSA9IGZhbHNlOwotICAgICAgICAgICAgdHJhY2stPnNraXBUcmFjayA9IGZhbHNlOworICAgICAgICAgICAgdHJhY2stPm1ldGEgPSBtZXRhOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCBpbWFnZUluZGV4KTsKICAgICAgICAgICAgIHRyYWNrLT50aW1lc2NhbGUgPSAxMDAwMDAwOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKG1Jbml0Q2hlY2sgPT0gT0spIHsKICAgICAgICAgaWYgKGZpbmRUcmFja0J5TWltZVByZWZpeCgidmlkZW8vIikgIT0gTlVMTCkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUc0KTsKICAgICAgICAgfSBlbHNlIGlmIChmaW5kVHJhY2tCeU1pbWVQcmVmaXgoImF1ZGlvLyIpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsICJhdWRpby9tcDQiKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAiYXVkaW8vbXA0Iik7CiAgICAgICAgIH0gZWxzZSBpZiAoZmluZFRyYWNrQnlNaW1lUHJlZml4KAogICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQykgIT0gTlVMTCkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9IRUlGKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfSEVJRik7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUluaXRDaGVjayA9IGVycjsKQEAgLTY3Miw3ICs3MjcsNyBAQAogICAgICAgICAgICAgbWVtY3B5KHB0ciArIDIwLCBtUHNzaFtpXS5kYXRhLCBtUHNzaFtpXS5kYXRhbGVuKTsKICAgICAgICAgICAgIHB0ciArPSAoMjAgKyBtUHNzaFtpXS5kYXRhbGVuKTsKICAgICAgICAgfQotICAgICAgICBtRmlsZU1ldGFEYXRhLnNldERhdGEoa0tleVBzc2gsICdwc3NoJywgYnVmLCBwc3Noc2l6ZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9QU1NILCBidWYsIHBzc2hzaXplKTsKICAgICAgICAgZnJlZShidWYpOwogICAgIH0KIApAQCAtNjk4LDIxICs3NTMsMjEgQEAKIAogc3RhdGljIGJvb2wgdW5kZXJNZXRhRGF0YVBhdGgoY29uc3QgVmVjdG9yPHVpbnQzMl90PiAmcGF0aCkgewogICAgIHJldHVybiBwYXRoLnNpemUoKSA+PSA1Ci0gICAgICAgICYmIHBhdGhbMF0gPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICd2JykKLSAgICAgICAgJiYgcGF0aFsxXSA9PSBGT1VSQ0MoJ3UnLCAnZCcsICd0JywgJ2EnKQotICAgICAgICAmJiBwYXRoWzJdID09IEZPVVJDQygnbScsICdlJywgJ3QnLCAnYScpCi0gICAgICAgICYmIHBhdGhbM10gPT0gRk9VUkNDKCdpJywgJ2wnLCAncycsICd0Jyk7CisgICAgICAgICYmIHBhdGhbMF0gPT0gRk9VUkNDKCJtb292IikKKyAgICAgICAgJiYgcGF0aFsxXSA9PSBGT1VSQ0MoInVkdGEiKQorICAgICAgICAmJiBwYXRoWzJdID09IEZPVVJDQygibWV0YSIpCisgICAgICAgICYmIHBhdGhbM10gPT0gRk9VUkNDKCJpbHN0Iik7CiB9CiAKIHN0YXRpYyBib29sIHVuZGVyUVRNZXRhUGF0aChjb25zdCBWZWN0b3I8dWludDMyX3Q+ICZwYXRoLCBpbnQzMl90IGRlcHRoKSB7CiAgICAgcmV0dXJuIHBhdGguc2l6ZSgpID49IDIKLSAgICAgICAgICAgICYmIHBhdGhbMF0gPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICd2JykKLSAgICAgICAgICAgICYmIHBhdGhbMV0gPT0gRk9VUkNDKCdtJywgJ2UnLCAndCcsICdhJykKKyAgICAgICAgICAgICYmIHBhdGhbMF0gPT0gRk9VUkNDKCJtb292IikKKyAgICAgICAgICAgICYmIHBhdGhbMV0gPT0gRk9VUkNDKCJtZXRhIikKICAgICAgICAgICAgICYmIChkZXB0aCA9PSAyCiAgICAgICAgICAgICB8fCAoZGVwdGggPT0gMwotICAgICAgICAgICAgICAgICAgICAmJiAocGF0aFsyXSA9PSBGT1VSQ0MoJ2gnLCAnZCcsICdsJywgJ3InKQotICAgICAgICAgICAgICAgICAgICB8fCAgcGF0aFsyXSA9PSBGT1VSQ0MoJ2knLCAnbCcsICdzJywgJ3QnKQotICAgICAgICAgICAgICAgICAgICB8fCAgcGF0aFsyXSA9PSBGT1VSQ0MoJ2snLCAnZScsICd5JywgJ3MnKSkpKTsKKyAgICAgICAgICAgICAgICAgICAgJiYgKHBhdGhbMl0gPT0gRk9VUkNDKCJoZGxyIikKKyAgICAgICAgICAgICAgICAgICAgfHwgIHBhdGhbMl0gPT0gRk9VUkNDKCJpbHN0IikKKyAgICAgICAgICAgICAgICAgICAgfHwgIHBhdGhbMl0gPT0gRk9VUkNDKCJrZXlzIikpKSk7CiB9CiAKIC8vIEdpdmVuIGEgdGltZSBpbiBzZWNvbmRzIHNpbmNlIEphbiAxIDE5MDQsIHByb2R1Y2UgYSBodW1hbi1yZWFkYWJsZSBzdHJpbmcuCkBAIC04MTYsNyArODcxLDcgQEAKICAgICAgICAgQUxPR0UoImIvMjM1NDA5MTQiKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9Ci0gICAgaWYgKGNodW5rX3R5cGUgIT0gRk9VUkNDKCdtJywgJ2QnLCAnYScsICd0JykgJiYgY2h1bmtfZGF0YV9zaXplID4ga01heEF0b21TaXplKSB7CisgICAgaWYgKGNodW5rX3R5cGUgIT0gRk9VUkNDKCJtZGF0IikgJiYgY2h1bmtfZGF0YV9zaXplID4ga01heEF0b21TaXplKSB7CiAgICAgICAgIGNoYXIgZXJyTXNnWzEwMF07CiAgICAgICAgIHNwcmludGYoZXJyTXNnLCAiJXMgYXRvbSBoYXMgc2l6ZSAlIiBQUklkNjQsIGNodW5rLCBjaHVua19kYXRhX3NpemUpOwogICAgICAgICBBTE9HRSgiJXMgKGIvMjg2MTU0NDgpIiwgZXJyTXNnKTsKQEAgLTgyNCw4ICs4NzksOCBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIGlmIChjaHVua190eXBlICE9IEZPVVJDQygnYycsICdwJywgJ3InLCAndCcpCi0gICAgICAgICAgICAmJiBjaHVua190eXBlICE9IEZPVVJDQygnYycsICdvJywgJ3YnLCAncicpCisgICAgaWYgKGNodW5rX3R5cGUgIT0gRk9VUkNDKCJjcHJ0IikKKyAgICAgICAgICAgICYmIGNodW5rX3R5cGUgIT0gRk9VUkNDKCJjb3ZyIikKICAgICAgICAgICAgICYmIG1QYXRoLnNpemUoKSA9PSA1ICYmIHVuZGVyTWV0YURhdGFQYXRoKG1QYXRoKSkgewogICAgICAgICBvZmY2NF90IHN0b3Bfb2Zmc2V0ID0gKm9mZnNldCArIGNodW5rX3NpemU7CiAgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldDsKQEAgLTg0NCw0MCArODk5LDQwIEBACiAgICAgfQogCiAgICAgc3dpdGNoKGNodW5rX3R5cGUpIHsKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ3YnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAncicsICdhJywgJ2snKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZCcsICdpJywgJ2EnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnaScsICduJywgJ2YnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2QnLCAnaScsICduJywgJ2YnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAndCcsICdiJywgJ2wnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAndicsICdlJywgJ3gnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ2YnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAncicsICdhJywgJ2YnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZicsICdyJywgJ2EnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3UnLCAnZCcsICd0JywgJ2EnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2knLCAnbCcsICdzJywgJ3QnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnaScsICduJywgJ2YnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAnYycsICdoJywgJ2knKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2UnLCAnZCcsICd0JywgJ3MnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3cnLCAnYScsICd2JywgJ2UnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIm1vb3YiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInRyYWsiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIm1kaWEiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIm1pbmYiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImRpbmYiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInN0YmwiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIm12ZXgiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIm1vb2YiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInRyYWYiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIm1mcmEiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInVkdGEiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImlsc3QiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInNpbmYiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInNjaGkiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImVkdHMiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIndhdmUiKToKICAgICAgICAgewotICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICd2JykgJiYgZGVwdGggIT0gMCkgeworICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCJtb292IikgJiYgZGVwdGggIT0gMCkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJtb292OiBkZXB0aCAlZCIsIGRlcHRoKTsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ3YnKSAmJiBtSW5pdENoZWNrID09IE9LKSB7CisgICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoIm1vb3YiKSAmJiBtSW5pdENoZWNrID09IE9LKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImR1cGxpY2F0ZSBtb292Iik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICdmJykgJiYgIW1Nb29mRm91bmQpIHsKKyAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygibW9vZiIpICYmICFtTW9vZkZvdW5kKSB7CiAgICAgICAgICAgICAgICAgLy8gc3RvcmUgdGhlIG9mZnNldCBvZiB0aGUgZmlyc3Qgc2VnbWVudAogICAgICAgICAgICAgICAgIG1Nb29mRm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgIG1Nb29mT2Zmc2V0ID0gKm9mZnNldDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdzJywgJ3QnLCAnYicsICdsJykpIHsKKyAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygic3RibCIpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoInNhbXBsZVRhYmxlIGNodW5rIGlzICUiIFBSSXU2NCAiIGJ5dGVzIGxvbmcuIiwgY2h1bmtfc2l6ZSk7CiAKICAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPmZsYWdzKCkKQEAgLTg4OCw4ICs5NDMsOCBAQAogCiAgICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZWRTb3VyY2UtPnNldENhY2hlZFJhbmdlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICpvZmZzZXQsIGNodW5rX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhY2hlZFNvdXJjZSAhPSBOVUxMIC8qIGFzc3VtZSBvd25lcnNoaXAgb24gc3VjY2VzcyAqLykgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EYXRhU291cmNlID0gbUNhY2hlZFNvdXJjZSA9IGNhY2hlZFNvdXJjZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGFzc3VtZSBvd25lcnNoaXAgb24gc3VjY2VzcyAqLykgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EYXRhU291cmNlID0gY2FjaGVkU291cmNlOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNhY2hlZFNvdXJjZTsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtOTAzLDcgKzk1OCw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJvb2wgaXNUcmFjayA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCd0JywgJ3InLCAnYScsICdrJykpIHsKKyAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygidHJhayIpKSB7CiAgICAgICAgICAgICAgICAgaWYgKGRlcHRoICE9IDEpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoInRyYWs6IGRlcHRoICVkIiwgZGVwdGgpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwpAQCAtOTEyLDcgKzk2Nyw2IEBACiAKICAgICAgICAgICAgICAgICBBTE9HVigiYWRkaW5nIG5ldyB0cmFjayIpOwogICAgICAgICAgICAgICAgIFRyYWNrICp0cmFjayA9IG5ldyBUcmFjazsKLSAgICAgICAgICAgICAgICB0cmFjay0+bmV4dCA9IE5VTEw7CiAgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2spIHsKICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bmV4dCA9IHRyYWNrOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC05MjAsMTcgKzk3NCwzMCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrID0gdHJhY2s7CiAKLSAgICAgICAgICAgICAgICB0cmFjay0+aW5jbHVkZXNfZXhwZW5zaXZlX21ldGFkYXRhID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgdHJhY2stPnNraXBUcmFjayA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHRyYWNrLT50aW1lc2NhbGUgPSAwOwotICAgICAgICAgICAgICAgIHRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7Ci0gICAgICAgICAgICAgICAgdHJhY2stPmhhc19lbHN0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgdHJhY2stPnN1YnNhbXBsZV9lbmNyeXB0aW9uID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdHJhY2stPm1ldGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyh0cmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBvZmY2NF90IHN0b3Bfb2Zmc2V0ID0gKm9mZnNldCArIGNodW5rX3NpemU7CiAgICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQ7CiAgICAgICAgICAgICB3aGlsZSAoKm9mZnNldCA8IHN0b3Bfb2Zmc2V0KSB7CisKKyAgICAgICAgICAgICAgICAvLyBwYXNzIHVkYXRhIHRlcm1pbmF0ZQorICAgICAgICAgICAgICAgIGlmIChtSXNRVCAmJiBzdG9wX29mZnNldCAtICpvZmZzZXQgPT0gNCAmJiBjaHVua190eXBlID09IEZPVVJDQygidWR0YSIpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZSB0aGUgY2FzZSB0aGF0IHVkdGEgdGVybWluYXRlcyB3aXRoIHRlcm1pbmF0ZSBjb2RlIHgwMDAwMDAwMAorICAgICAgICAgICAgICAgICAgICAvLyBub3RlIHRoYXQgMCB0ZXJtaW5hdG9yIGlzIG9wdGlvbmFsIGFuZCB3ZSBqdXN0IGhhbmRsZSB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRlcm1pbmF0ZV9jb2RlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgbURhdGFTb3VyY2UtPnJlYWRBdCgqb2Zmc2V0LCAmdGVybWluYXRlX2NvZGUsIDQpOworICAgICAgICAgICAgICAgICAgICBpZiAoMCA9PSB0ZXJtaW5hdGVfY29kZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgKm9mZnNldCArPSA0OworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlRlcm1pbmFsIGNvZGUgZm9yIHVkdGEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImludmFsaWQgdWR0YSBUZXJtaW5hbCBjb2RlIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNodW5rKG9mZnNldCwgZGVwdGggKyAxKTsKICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpc1RyYWNrKSB7CkBAIC05NDcsOCArMTAxNCwxMCBAQAogCiAgICAgICAgICAgICBpZiAoaXNUcmFjaykgewogICAgICAgICAgICAgICAgIGludDMyX3QgdHJhY2tJZDsKLSAgICAgICAgICAgICAgICAvLyBUaGVyZSBtdXN0IGJlIGV4YWN0IG9uZSB0cmFjayBoZWFkZXIgcGVyIHRyYWNrLgotICAgICAgICAgICAgICAgIGlmICghbUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleVRyYWNrSUQsICZ0cmFja0lkKSkgeworICAgICAgICAgICAgICAgIC8vIFRoZXJlIG11c3QgYmUgZXhhY3RseSBvbmUgdHJhY2sgaGVhZGVyIHBlciB0cmFjay4KKworICAgICAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCAmdHJhY2tJZCkpIHsKICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2tpcFRyYWNrID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTk1Nyw2ICsxMDI2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2tpcFRyYWNrID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAKKwogICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrLT5za2lwVHJhY2spIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInNraXBwaW5nIHRoaXMgdHJhY2suLi4iKTsKICAgICAgICAgICAgICAgICAgICAgVHJhY2sgKmN1ciA9IG1GaXJzdFRyYWNrOwpAQCAtOTc3LDcgKzEwNDcsMjIgQEAKIAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChjaHVua190eXBlID09IEZPVVJDQygnbScsICdvJywgJ28nLCAndicpKSB7CisKKyAgICAgICAgICAgICAgICAvLyBwbGFjZSB0aGluZ3Mgd2UgYnVpbHQgZWxzZXdoZXJlIGludG8gdGhlaXIgZmluYWwgbG9jYXRpb25zCisKKyAgICAgICAgICAgICAgICAvLyBwdXQgYWdncmVnYXRlZCB0eDNnIGRhdGEgaW50byB0aGUgbWV0YWRhdGEKKyAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjay0+bVR4M2dGaWxsZWQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJQdXR0aW5nICV6dSBieXRlcyBvZiB0eDNnIGRhdGEgaW50byBtZXRhIGRhdGEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tVHgzZ0ZpbGxlZCk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEVYVF9GT1JNQVRfREFUQSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1UeDNnQnVmZmVyLCBtTGFzdFRyYWNrLT5tVHgzZ0ZpbGxlZCk7CisgICAgICAgICAgICAgICAgICAgIC8vIGRyb3AgaXQgbm93IHRvIHJlZHVjZSBvdXIgZm9vdHByaW50CisgICAgICAgICAgICAgICAgICAgIGZyZWUobUxhc3RUcmFjay0+bVR4M2dCdWZmZXIpOworICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tVHgzZ0J1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9IGVsc2UgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCJtb292IikpIHsKICAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gT0s7CiAKICAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsgIC8vIFJldHVybiBhIGR1bW15IGVycm9yLgpAQCAtOTg1LDcgKzEwNzAsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygncycsICdjJywgJ2gnLCAnbScpOgorICAgICAgICBjYXNlIEZPVVJDQygic2NobSIpOgogICAgICAgICB7CiAKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKQEAgLTEwMDAsMjMgKzEwODUsMjMgQEAKICAgICAgICAgICAgIHNjaGVtZV90eXBlID0gbnRvaGwoc2NoZW1lX3R5cGUpOwogICAgICAgICAgICAgaW50MzJfdCBtb2RlID0ga0NyeXB0b01vZGVVbmVuY3J5cHRlZDsKICAgICAgICAgICAgIHN3aXRjaChzY2hlbWVfdHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdjJywgJ2InLCAnYycsICcxJyk6CisgICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0MoImNiYzEiKToKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBrQ3J5cHRvTW9kZUFlc0NiYzsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdjJywgJ2InLCAnYycsICdzJyk6CisgICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0MoImNiY3MiKToKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIG1vZGUgPSBrQ3J5cHRvTW9kZUFlc0NiYzsKICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c3Vic2FtcGxlX2VuY3J5cHRpb24gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ2MnLCAnZScsICduJywgJ2MnKToKKyAgICAgICAgICAgICAgICBjYXNlIEZPVVJDQygiY2VuYyIpOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IGtDcnlwdG9Nb2RlQWVzQ3RyOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ2MnLCAnZScsICduJywgJ3MnKToKKyAgICAgICAgICAgICAgICBjYXNlIEZPVVJDQygiY2VucyIpOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IGtDcnlwdG9Nb2RlQWVzQ3RyOwogICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zdWJzYW1wbGVfZW5jcnlwdGlvbiA9IHRydWU7CkBAIC0xMDI0LDEzICsxMTA5LDEzIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1vZGUgIT0ga0NyeXB0b01vZGVVbmVuY3J5cHRlZCkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b01vZGUsIG1vZGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCBtb2RlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKIAotICAgICAgICBjYXNlIEZPVVJDQygnZScsICdsJywgJ3MnLCAndCcpOgorICAgICAgICBjYXNlIEZPVVJDQygiZWxzdCIpOgogICAgICAgICB7CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAKQEAgLTEwNTEsNiArMTEzNiw3IEBACiAKICAgICAgICAgICAgIGlmIChlbnRyeV9jb3VudCAhPSAxKSB7CiAgICAgICAgICAgICAgICAgLy8gd2Ugb25seSBzdXBwb3J0IGEgc2luZ2xlIGVudHJ5IGF0IHRoZSBtb21lbnQsIGZvciBnYXBsZXNzIHBsYXliYWNrCisgICAgICAgICAgICAgICAgLy8gb3Igc3RhcnQgb2Zmc2V0CiAgICAgICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nIGVkaXQgbGlzdCB3aXRoICVkIGVudHJpZXMiLCBlbnRyeV9jb3VudCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG9mZjY0X3QgZW50cmllc29mZnNldCA9IGRhdGFfb2Zmc2V0ICsgODsKQEAgLTEwODUsNyArMTE3MSw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2UgRk9VUkNDKCdmJywgJ3InLCAnbScsICdhJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJmcm1hIik6CiAgICAgICAgIHsKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKIApAQCAtMTEwMCwxNyArMTE4NiwzMSBAQAogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIEZvdXJDQzJNSU1FKG9yaWdpbmFsX2ZvdXJjYykpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIEZvdXJDQzJNSU1FKG9yaWdpbmFsX2ZvdXJjYykpOwogICAgICAgICAgICAgdWludDMyX3QgbnVtX2NoYW5uZWxzID0gMDsKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZV9yYXRlID0gMDsKICAgICAgICAgICAgIGlmIChBZGp1c3RDaGFubmVsc0FuZFJhdGUob3JpZ2luYWxfZm91cmNjLCAmbnVtX2NoYW5uZWxzLCAmc2FtcGxlX3JhdGUpKSB7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBudW1fY2hhbm5lbHMpOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbnVtX2NoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZV9yYXRlKTsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFtSXNRVCAmJiBvcmlnaW5hbF9mb3VyY2MgPT0gRk9VUkNDKCJhbGFjIikpIHsKKyAgICAgICAgICAgICAgICBvZmY2NF90IHRtcE9mZnNldCA9ICpvZmZzZXQ7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VBTEFDU2FtcGxlRW50cnkoJnRtcE9mZnNldCk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgicGFyc2VBTEFDU2FtcGxlRW50cnkgZXJyOiVkIExpbmU6JWQiLCBlcnIsIF9fTElORV9fKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKm9mZnNldCA9IHRtcE9mZnNldCArIDg7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAnZScsICduJywgJ2MnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInRlbmMiKToKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCkBAIC0xMjAyLDIxICsxMzAyLDI4IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludDMyX3QgdG1wQWxnb3JpdGhtSWQ7Ci0gICAgICAgICAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlDcnlwdG9Nb2RlLCAmdG1wQWxnb3JpdGhtSWQpKSB7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgZGVmYXVsdEFsZ29yaXRobUlkKTsKKyAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX01PREUsICZ0bXBBbGdvcml0aG1JZCkpIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX01PREUsIGRlZmF1bHRBbGdvcml0aG1JZCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b0RlZmF1bHRJVlNpemUsIGRlZmF1bHRJVlNpemUpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKGtLZXlDcnlwdG9LZXksICd0ZW5jJywgZGVmYXVsdEtleUlkLCAxNik7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlFbmNyeXB0ZWRCeXRlQmxvY2ssIGRlZmF1bHRFbmNyeXB0ZWRCeXRlQmxvY2spOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5U2tpcEJ5dGVCbG9jaywgZGVmYXVsdFNraXBCeXRlQmxvY2spOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0RFRkFVTFRfSVZfU0laRSwgZGVmYXVsdElWU2l6ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSwgZGVmYXVsdEtleUlkLCAxNik7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX0JZVEVfQkxPQ0ssIGRlZmF1bHRFbmNyeXB0ZWRCeXRlQmxvY2spOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1NLSVBfQllURV9CTE9DSywgZGVmYXVsdFNraXBCeXRlQmxvY2spOwogICAgICAgICAgICAgaWYgKGRlZmF1bHRDb25zdGFudEl2ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldERhdGEoa0tleUNyeXB0b0lWLCAnZGNpdicsIGRlZmF1bHRDb25zdGFudEl2LT5kYXRhKCksIGRlZmF1bHRDb25zdGFudEl2LT5zaXplKCkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fSVYsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q29uc3RhbnRJdi0+ZGF0YSgpLCBkZWZhdWx0Q29uc3RhbnRJdi0+c2l6ZSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAnaycsICdoJywgJ2QnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInRraGQiKToKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCkBAIC0xMjI4LDcgKzEzMzUsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygndCcsICdyJywgJ2UnLCAnZicpOgorICAgICAgICBjYXNlIEZPVVJDQygidHJlZiIpOgogICAgICAgICB7CiAgICAgICAgICAgICBvZmY2NF90IHN0b3Bfb2Zmc2V0ID0gKm9mZnNldCArIGNodW5rX3NpemU7CiAgICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQ7CkBAIC0xMjQ0LDcgKzEzNTEsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygndCcsICdoJywgJ20nLCAnYicpOgorICAgICAgICBjYXNlIEZPVVJDQygidGhtYiIpOgogICAgICAgICB7CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAKQEAgLTEyNjEsNyArMTM2OCw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2UgRk9VUkNDKCdwJywgJ3MnLCAncycsICdoJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJwc3NoIik6CiAgICAgICAgIHsKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKIApAQCAtMTI5Nyw3ICsxNDA0LDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZCcsICdoJywgJ2QnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIm1kaGQiKToKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCkBAIC0xMzYwLDggKzE0NjcsMTMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gMCAmJiBtTGFzdFRyYWNrLT50aW1lc2NhbGUgIT0gMCkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sIChkdXJhdGlvbiAqIDEwMDAwMDApIC8gbUxhc3RUcmFjay0+dGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICBsb25nIGRvdWJsZSBkdXJhdGlvblVzID0gKChsb25nIGRvdWJsZSlkdXJhdGlvbiAqIDEwMDAwMDApIC8gbUxhc3RUcmFjay0+dGltZXNjYWxlOworICAgICAgICAgICAgICAgIGlmIChkdXJhdGlvblVzIDwgMCB8fCBkdXJhdGlvblVzID4gSU5UNjRfTUFYKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJjYW5ub3QgcmVwcmVzZW50ICVsbGQgKiAxMDAwMDAwIC8gJWxsZCBpbiA2NCBiaXRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgZHVyYXRpb24sIChsb25nIGxvbmcpIG1MYXN0VHJhY2stPnRpbWVzY2FsZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCBkdXJhdGlvblVzKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdWludDhfdCBsYW5nWzJdOwpAQCAtMTM4OCwxMyArMTUwMCwxMiBAQAogICAgICAgICAgICAgbGFuZ19jb2RlWzJdID0gKGxhbmdbMV0gJiAweDFmKSArIDB4NjA7CiAgICAgICAgICAgICBsYW5nX2NvZGVbM10gPSAnXDAnOwogCi0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldENTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlNZWRpYUxhbmd1YWdlLCBsYW5nX2NvZGUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0xBTkdVQUdFLCBsYW5nX2NvZGUpOwogCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ3QnLCAncycsICdkJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJzdHNkIik6CiAgICAgICAgIHsKICAgICAgICAgICAgIHVpbnQ4X3QgYnVmZmVyWzhdOwogICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IChvZmY2NF90KXNpemVvZihidWZmZXIpKSB7CkBAIC0xNDIzLDcgKzE1MzQsNyBAQAogICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKLSAgICAgICAgICAgICAgICBDSEVDSyhtTGFzdFRyYWNrLT5tZXRhLmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICAgICAgICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKTsKICAgICAgICAgICAgICAgICBpZiAoc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApICYmCiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJjYXNlY21wKG1pbWUsICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKSkgewogICAgICAgICAgICAgICAgICAgICAvLyBGb3Igbm93IHdlIG9ubHkgc3VwcG9ydCBhIHNpbmdsZSB0eXBlIG9mIG1lZGlhIHBlciB0cmFjay4KQEAgLTE0NDYsNyArMTU1Nyw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygnbScsICdlJywgJ3QnLCAndCcpOgorICAgICAgICBjYXNlIEZPVVJDQygibWV0dCIpOgogICAgICAgICB7CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAKQEAgLTE0NjMsMjAgKzE1NzQsNjggQEAKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIFN0cmluZzggbWltZUZvcm1hdCgoY29uc3QgY2hhciAqKShidWZmZXIuZ2V0KCkpLCBjaHVua19kYXRhX3NpemUpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbWltZUZvcm1hdC5zdHJpbmcoKSk7CisgICAgICAgICAgICAvLyBQcmlvciB0byBBUEkgMjksIHRoZSBtZXRhZGF0YSB0cmFjayB3YXMgbm90IGNvbXBsaWFudCB3aXRoIElTTy9JRUMKKyAgICAgICAgICAgIC8vIDE0NDk2LTEyLTIwMTUuIFRoaXMgbGVkIHRvIHNvbWUgSVNPLWNvbXBsaWFudCBwYXJzZXJzIGZhaWxpbmcgdG8gcmVhZCB0aGUKKyAgICAgICAgICAgIC8vIG1ldGF0cmFjay4gQXMgb2YgQVBJIDI5IGFuZCBvbndhcmRzLCBhIGNoYW5nZSB3YXMgbWFkZSB0byBtZXRhZGF0YSB0cmFjayB0bworICAgICAgICAgICAgLy8gbWFrZSBpdCBjb21wbGlhbnQgd2l0aCB0aGUgc3RhbmRhcmQuIFRoZSB3b3JrYXJvdW5kIGlzIHRvIHdyaXRlIHRoZQorICAgICAgICAgICAgLy8gbnVsbC10ZXJtaW5hdGVkIG1pbWVfZm9ybWF0IHN0cmluZyB0d2ljZS4gVGhpcyBhbGxvd3MgY29tcGxpYW50IHBhcnNlcnMgdG8KKyAgICAgICAgICAgIC8vIHJlYWQgdGhlIG1pc3NpbmcgcmVzZXJ2ZWQsIGRhdGFfcmVmZXJlbmNlX2luZGV4LCBhbmQgY29udGVudF9lbmNvZGluZyBmaWVsZHMKKyAgICAgICAgICAgIC8vIGZyb20gdGhlIGZpcnN0IG1pbWVfdHlwZSBzdHJpbmcuIFRoZSBhY3R1YWwgbWltZV9mb3JtYXQgZmllbGQgd291bGQgdGhlbiBiZQorICAgICAgICAgICAgLy8gcmVhZCBjb3JyZWN0bHkgZnJvbSB0aGUgc2Vjb25kIHN0cmluZy4gVGhlIG5vbi1jb21wbGlhbnQgQW5kcm9pZCBmcmFtZXdvcmtzCisgICAgICAgICAgICAvLyBmcm9tIEFQSSAyOCBhbmQgZWFybGllciB3b3VsZCBzdGlsbCBiZSBhYmxlIHRvIHJlYWQgdGhlIG1pbWVfZm9ybWF0IGNvcnJlY3RseQorICAgICAgICAgICAgLy8gYXMgaXQgd291bGQgb25seSByZWFkIHRoZSBmaXJzdCBudWxsLXRlcm1pbmF0ZWQgbWltZV9mb3JtYXQgc3RyaW5nLiBUbyBlbmFibGUKKyAgICAgICAgICAgIC8vIHJlYWRpbmcgbWV0YWRhdGEgdHJhY2tzIGdlbmVyYXRlZCBmcm9tIGJvdGggdGhlIG5vbi1jb21wbGlhbnQgYW5kIGNvbXBsaWFudAorICAgICAgICAgICAgLy8gZm9ybWF0cywgYSBjaGVjayBuZWVkcyB0byBiZSBkb25lIHRvIHNlZSB3aGljaCBmb3JtYXQgaXMgdXNlZC4KKyAgICAgICAgICAgIGludCBudWxsX3BvcyA9IDA7CisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpzdHIgPSBidWZmZXIuZ2V0KCk7CisgICAgICAgICAgICB3aGlsZSAobnVsbF9wb3MgPCBjaHVua19kYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgaWYgKCooc3RyICsgbnVsbF9wb3MpID09ICdcMCcpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICArK251bGxfcG9zOworICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAobnVsbF9wb3MgPT0gY2h1bmtfZGF0YV9zaXplIC0gMSkgeworICAgICAgICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIHN0YW5kYXJkIG9tcGxpYW50IG1ldGFkYXRhIHRyYWNrLgorICAgICAgICAgICAgICBTdHJpbmc4IG1pbWVGb3JtYXQoKGNvbnN0IGNoYXIgKikoYnVmZmVyLmdldCgpKSwgY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBtaW1lRm9ybWF0LnN0cmluZygpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBzdGFuZGFyZCBjb21wbGlhbnQgbWV0YWRhdGEgdHJhY2suCisgICAgICAgICAgICAgIFN0cmluZzggY29udGVudEVuY29kaW5nKChjb25zdCBjaGFyICopKGJ1ZmZlci5nZXQoKSArIDgpKTsKKyAgICAgICAgICAgICAgU3RyaW5nOCBtaW1lRm9ybWF0KChjb25zdCBjaGFyICopKGJ1ZmZlci5nZXQoKSArIDggKyBjb250ZW50RW5jb2Rpbmcuc2l6ZSgpICsgMSksCisgICAgICAgICAgICAgICAgICBjaHVua19kYXRhX3NpemUgLSA4IC0gY29udGVudEVuY29kaW5nLnNpemUoKSAtIDEpOworICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIG1pbWVGb3JtYXQuc3RyaW5nKCkpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygnbScsICdwJywgJzQnLCAnYScpOgotICAgICAgICBjYXNlIEZPVVJDQygnZScsICduJywgJ2MnLCAnYScpOgotICAgICAgICBjYXNlIEZPVVJDQygncycsICdhJywgJ20nLCAncicpOgotICAgICAgICBjYXNlIEZPVVJDQygncycsICdhJywgJ3cnLCAnYicpOgorICAgICAgICBjYXNlIEZPVVJDQygibXA0YSIpOgorICAgICAgICBjYXNlIEZPVVJDQygiZW5jYSIpOgorICAgICAgICBjYXNlIEZPVVJDQygic2FtciIpOgorICAgICAgICBjYXNlIEZPVVJDQygic2F3YiIpOgorICAgICAgICBjYXNlIEZPVVJDQygiT3B1cyIpOgorICAgICAgICBjYXNlIEZPVVJDQygidHdvcyIpOgorICAgICAgICBjYXNlIEZPVVJDQygic293dCIpOgorICAgICAgICBjYXNlIEZPVVJDQygiYWxhYyIpOgorICAgICAgICBjYXNlIEZPVVJDQygiZkxhQyIpOgorICAgICAgICBjYXNlIEZPVVJDQygiLm1wMyIpOgorICAgICAgICBjYXNlIDB4NkQ3MzAwNTU6IC8vICJtcyBVIiBtcDMgYXVkaW8KICAgICAgICAgewotICAgICAgICAgICAgaWYgKG1Jc1FUICYmIGNodW5rX3R5cGUgPT0gRk9VUkNDKCdtJywgJ3AnLCAnNCcsICdhJykKLSAgICAgICAgICAgICAgICAgICAgJiYgZGVwdGggPj0gMSAmJiBtUGF0aFtkZXB0aCAtIDFdID09IEZPVVJDQygndycsICdhJywgJ3YnLCAnZScpKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWdub3JlIG1wNGEgZW1iZWRkZWQgaW4gUVQgd2F2ZSBhdG9tCisgICAgICAgICAgICBpZiAobUlzUVQgJiYgZGVwdGggPj0gMSAmJiBtUGF0aFtkZXB0aCAtIDFdID09IEZPVVJDQygid2F2ZSIpKSB7CisKKyAgICAgICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoImFsYWMiKSkgeworICAgICAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldFRtcCA9ICpvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQUxBQ1NhbXBsZUVudHJ5KCZvZmZzZXRUbXApOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgicGFyc2VBTEFDU2FtcGxlRW50cnkgZXJyOiVkIExpbmU6JWQiLCBlcnIsIF9fTElORV9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUgYWxsIGF0b21zIGVtYmVkZGVkIGluIFFUIHdhdmUgYXRvbQorICAgICAgICAgICAgICAgIEFMT0dWKCJJZ25vcmUgYWxsIGF0b21zIGVtYmVkZGVkIGluIFFUIHdhdmUgYXRvbSIpOwogICAgICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTE1MDUsNyArMTY2NCw3IEBACiAgICAgICAgICAgICBvZmY2NF90IHN0b3Bfb2Zmc2V0ID0gKm9mZnNldCArIGNodW5rX3NpemU7CiAgICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQgKyBzaXplb2YoYnVmZmVyKTsKIAotICAgICAgICAgICAgaWYgKG1Jc1FUICYmIGNodW5rX3R5cGUgPT0gRk9VUkNDKCdtJywgJ3AnLCAnNCcsICdhJykpIHsKKyAgICAgICAgICAgIGlmIChtSXNRVCkgewogICAgICAgICAgICAgICAgIGlmICh2ZXJzaW9uID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgYnVmZmVyLCAxNikgPCAxNikgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwpAQCAtMTUzOCwxNSArMTY5NywxMTcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChjaHVua190eXBlICE9IEZPVVJDQygnZScsICduJywgJ2MnLCAnYScpKSB7CisgICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSAhPSBGT1VSQ0MoImVuY2EiKSkgewogICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBjaHVuayB0eXBlIGlzIGVuY2EsIHdlJ2xsIGdldCB0aGUgdHlwZSBmcm9tIHRoZSBmcm1hIGJveCBsYXRlcgotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIEZvdXJDQzJNSU1FKGNodW5rX3R5cGUpKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIEZvdXJDQzJNSU1FKGNodW5rX3R5cGUpKTsKICAgICAgICAgICAgICAgICBBZGp1c3RDaGFubmVsc0FuZFJhdGUoY2h1bmtfdHlwZSwgJm51bV9jaGFubmVscywgJnNhbXBsZV9yYXRlKTsKKworICAgICAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19SQVcsIEZvdXJDQzJNSU1FKGNodW5rX3R5cGUpKSkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSwgc2FtcGxlX3NpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoInR3b3MiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfUENNX0JJR19FTkRJQU4sIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1YoIioqKiBjb2Rpbmc9JyVzJyAlZCBjaGFubmVscywgc2l6ZSAlZCwgcmF0ZSAlZFxuIiwKICAgICAgICAgICAgICAgICAgICBjaHVuaywgbnVtX2NoYW5uZWxzLCBzYW1wbGVfc2l6ZSwgc2FtcGxlX3JhdGUpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBudW1fY2hhbm5lbHMpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlX3JhdGUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbnVtX2NoYW5uZWxzKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBzYW1wbGVfcmF0ZSk7CisKKyAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygiT3B1cyIpKSB7CisgICAgICAgICAgICAgICAgdWludDhfdCBvcHVzSW5mb1tBT1BVU19PUFVTSEVBRF9NQVhTSVpFXTsKKyAgICAgICAgICAgICAgICBkYXRhX29mZnNldCArPSBzaXplb2YoYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBzaXplX3Qgb3B1c0luZm9TaXplID0gY2h1bmtfZGF0YV9zaXplIC0gc2l6ZW9mKGJ1ZmZlcik7CisKKyAgICAgICAgICAgICAgICBpZiAob3B1c0luZm9TaXplIDwgQU9QVVNfT1BVU0hFQURfTUlOU0laRSB8fAorICAgICAgICAgICAgICAgICAgICBvcHVzSW5mb1NpemUgPiBBT1BVU19PUFVTSEVBRF9NQVhTSVpFKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIFJlYWQgT3B1cyBIZWFkZXIKKyAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBvcHVzSW5mbywgb3B1c0luZm9TaXplKSA8IG9wdXNJbmZvU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gT3B1c0hlYWRlciBtdXN0IHN0YXJ0IHdpdGggdGhpcyBtYWdpYyBzZXF1ZW5jZSwgb3ZlcndyaXRlIGZpcnN0IDggYnl0ZXMKKyAgICAgICAgICAgICAgICAvLyBodHRwOi8vd2lraS54aXBoLm9yZy9PZ2dPcHVzI0lEX0hlYWRlcgorICAgICAgICAgICAgICAgIHN0cm5jcHkoKGNoYXIgKilvcHVzSW5mbywgIk9wdXNIZWFkIiwgOCk7CisKKyAgICAgICAgICAgICAgICAvLyBWZXJzaW9uIHNoYWxsIGJlIDAgYXMgcGVyIG1wNCBPcHVzIFNwZWNpZmljIEJveAorICAgICAgICAgICAgICAgIC8vIChodHRwczovL29wdXMtY29kZWMub3JnL2RvY3Mvb3B1c19pbl9pc29ibWZmLmh0bWwjNC4zLjIpCisgICAgICAgICAgICAgICAgaWYgKG9wdXNJbmZvWzhdKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEZvcmNlIHZlcnNpb24gdG8gMSBhcyBwZXIgT3B1c0hlYWQgZGVmaW5pdGlvbgorICAgICAgICAgICAgICAgIC8vIChodHRwOi8vd2lraS54aXBoLm9yZy9PZ2dPcHVzI0lEX0hlYWRlcikKKyAgICAgICAgICAgICAgICBvcHVzSW5mb1s4XSA9IDE7CisKKyAgICAgICAgICAgICAgICAvLyBSZWFkIE9wdXMgU3BlY2lmaWMgQm94IHZhbHVlcworICAgICAgICAgICAgICAgIHNpemVfdCBvcHVzT2Zmc2V0ID0gMTA7CisgICAgICAgICAgICAgICAgdWludDE2X3QgcHJlX3NraXAgPSBVMTZfQVQoJm9wdXNJbmZvW29wdXNPZmZzZXRdKTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVfcmF0ZSA9IFUzMl9BVCgmb3B1c0luZm9bb3B1c09mZnNldCArIDJdKTsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBvdXRfZ2FpbiA9IFUxNl9BVCgmb3B1c0luZm9bb3B1c09mZnNldCArIDZdKTsKKworICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgT3B1cyBTcGVjaWZpYyBCb3ggdmFsdWVzLiBQYXJzZU9wdXNIZWFkZXIgZXhwZWN0cworICAgICAgICAgICAgICAgIC8vIHRoZSB2YWx1ZXMgaW4gTEUsIGhvd2V2ZXIgTVA0IHN0b3JlcyB0aGVzZSB2YWx1ZXMgYXMgQkUKKyAgICAgICAgICAgICAgICAvLyBodHRwczovL29wdXMtY29kZWMub3JnL2RvY3Mvb3B1c19pbl9pc29ibWZmLmh0bWwjNC4zLjIKKyAgICAgICAgICAgICAgICBtZW1jcHkoJm9wdXNJbmZvW29wdXNPZmZzZXRdLCAmcHJlX3NraXAsIHNpemVvZihwcmVfc2tpcCkpOworICAgICAgICAgICAgICAgIG1lbWNweSgmb3B1c0luZm9bb3B1c09mZnNldCArIDJdLCAmc2FtcGxlX3JhdGUsIHNpemVvZihzYW1wbGVfcmF0ZSkpOworICAgICAgICAgICAgICAgIG1lbWNweSgmb3B1c0luZm9bb3B1c09mZnNldCArIDZdLCAmb3V0X2dhaW4sIHNpemVvZihvdXRfZ2FpbikpOworCisgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga1NlZWtQcmVSb2xsTnMgPSA4MDAwMDAwMDsgIC8vIEZpeGVkIDgwIG1zZWMKKyAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrT3B1c1NhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGNvZGVjRGVsYXkgPSBwcmVfc2tpcCAqIDEwMDAwMDAwMDBsbCAvIGtPcHVzU2FtcGxlUmF0ZTsKKworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBvcHVzSW5mbywgb3B1c0luZm9TaXplKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8xLCAmY29kZWNEZWxheSwgc2l6ZW9mKGNvZGVjRGVsYXkpKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8yLCAma1NlZWtQcmVSb2xsTnMsIHNpemVvZihrU2Vla1ByZVJvbGxOcykpOworCisgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQgKz0gb3B1c0luZm9TaXplOworICAgICAgICAgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldDsKKyAgICAgICAgICAgICAgICBDSEVDS19FUSgqb2Zmc2V0LCBzdG9wX29mZnNldCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghbUlzUVQgJiYgY2h1bmtfdHlwZSA9PSBGT1VSQ0MoImFsYWMiKSkgeworICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICs9IHNpemVvZihidWZmZXIpOworCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VBTEFDU2FtcGxlRW50cnkoJmRhdGFfb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJwYXJzZUFMQUNTYW1wbGVFbnRyeSBlcnI6JWQgTGluZTolZCIsIGVyciwgX19MSU5FX18pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQ7CisgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoKm9mZnNldCwgc3RvcF9vZmZzZXQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoImZMYUMiKSkgeworCisgICAgICAgICAgICAgICAgLy8gRnJvbSBodHRwczovL2dpdGh1Yi5jb20veGlwaC9mbGFjL2Jsb2IvbWFzdGVyL2RvYy9pc29mbGFjLnR4dAorICAgICAgICAgICAgICAgIC8vIDQgZm9yIG1pbWUsIDQgZm9yIGJsb2NrVHlwZSBhbmQgQmxvY2tMZW4sIDM0IGZvciBtZXRhZGF0YQorICAgICAgICAgICAgICAgIHVpbnQ4X3QgZmxhY0luZm9bNCArIDQgKyAzNF07CisgICAgICAgICAgICAgICAgLy8gc2tpcHBpbmcgZEZsYSwgdmVyc2lvbgorICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0ICs9IHNpemVvZihidWZmZXIpICsgMTI7CisgICAgICAgICAgICAgICAgc2l6ZV90IGZsYWNPZmZzZXQgPSA0OworICAgICAgICAgICAgICAgIC8vIEFkZCBmbGFDIGhlYWRlciBtaW1lIHR5cGUgdG8gQ1NECisgICAgICAgICAgICAgICAgc3RybmNweSgoY2hhciAqKWZsYWNJbmZvLCAiZkxhQyIsIDQpOworICAgICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGZsYWNJbmZvICsgZmxhY09mZnNldCwgc2l6ZW9mKGZsYWNJbmZvKSAtIGZsYWNPZmZzZXQpIDwKKyAgICAgICAgICAgICAgICAgICAgICAgIChzc2l6ZV90KXNpemVvZihmbGFjSW5mbykgLSBmbGFjT2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQgKz0gc2l6ZW9mKGZsYWNJbmZvKSAtIGZsYWNPZmZzZXQ7CisKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIGZsYWNJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGZsYWNJbmZvKSk7CisgICAgICAgICAgICAgICAgKm9mZnNldCA9IGRhdGFfb2Zmc2V0OworICAgICAgICAgICAgICAgIENIRUNLX0VRKCpvZmZzZXQsIHN0b3Bfb2Zmc2V0KTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgd2hpbGUgKCpvZmZzZXQgPCBzdG9wX29mZnNldCkgewogICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsob2Zmc2V0LCBkZXB0aCArIDEpOwpAQCAtMTU2MSwxNCArMTgyMiwxNSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygnbScsICdwJywgJzQnLCAndicpOgotICAgICAgICBjYXNlIEZPVVJDQygnZScsICduJywgJ2MnLCAndicpOgotICAgICAgICBjYXNlIEZPVVJDQygncycsICcyJywgJzYnLCAnMycpOgotICAgICAgICBjYXNlIEZPVVJDQygnSCcsICcyJywgJzYnLCAnMycpOgotICAgICAgICBjYXNlIEZPVVJDQygnaCcsICcyJywgJzYnLCAnMycpOgotICAgICAgICBjYXNlIEZPVVJDQygnYScsICd2JywgJ2MnLCAnMScpOgotICAgICAgICBjYXNlIEZPVVJDQygnaCcsICd2JywgJ2MnLCAnMScpOgotICAgICAgICBjYXNlIEZPVVJDQygnaCcsICdlJywgJ3YnLCAnMScpOgorICAgICAgICBjYXNlIEZPVVJDQygibXA0diIpOgorICAgICAgICBjYXNlIEZPVVJDQygiZW5jdiIpOgorICAgICAgICBjYXNlIEZPVVJDQygiczI2MyIpOgorICAgICAgICBjYXNlIEZPVVJDQygiSDI2MyIpOgorICAgICAgICBjYXNlIEZPVVJDQygiaDI2MyIpOgorICAgICAgICBjYXNlIEZPVVJDQygiYXZjMSIpOgorICAgICAgICBjYXNlIEZPVVJDQygiaHZjMSIpOgorICAgICAgICBjYXNlIEZPVVJDQygiaGV2MSIpOgorICAgICAgICBjYXNlIEZPVVJDQygiYXYwMSIpOgogICAgICAgICB7CiAgICAgICAgICAgICB1aW50OF90IGJ1ZmZlcls3OF07CiAgICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplIDwgKHNzaXplX3Qpc2l6ZW9mKGJ1ZmZlcikpIHsKQEAgLTE1OTgsMTIgKzE4NjAsMTMgQEAKICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgIT0gRk9VUkNDKCdlJywgJ24nLCAnYycsICd2JykpIHsKKyAgICAgICAgICAgIGlmIChjaHVua190eXBlICE9IEZPVVJDQygiZW5jdiIpKSB7CiAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNodW5rIHR5cGUgaXMgZW5jdiwgd2UnbGwgZ2V0IHRoZSB0eXBlIGZyb20gdGhlIGZybWEgYm94IGxhdGVyCi0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCB3aWR0aCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsIGhlaWdodCk7CiAKICAgICAgICAgICAgIG9mZjY0X3Qgc3RvcF9vZmZzZXQgPSAqb2Zmc2V0ICsgY2h1bmtfc2l6ZTsKICAgICAgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldCArIHNpemVvZihidWZmZXIpOwpAQCAtMTYyMCw4ICsxODgzLDggQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAndCcsICdjJywgJ28nKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2MnLCAnbycsICc2JywgJzQnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInN0Y28iKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImNvNjQiKToKICAgICAgICAgewogICAgICAgICAgICAgaWYgKChtTGFzdFRyYWNrID09IE5VTEwpIHx8IChtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZSA9PSBOVUxMKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CkBAIC0xNjQwLDcgKzE5MDMsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3MnLCAnYycpOgorICAgICAgICBjYXNlIEZPVVJDQygic3RzYyIpOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoKG1MYXN0VHJhY2sgPT0gTlVMTCkgfHwgKG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlID09IE5VTEwpKQogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CkBAIC0xNjU4LDggKzE5MjEsOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3MnLCAneicpOgotICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3onLCAnMicpOgorICAgICAgICBjYXNlIEZPVVJDQygic3RzeiIpOgorICAgICAgICBjYXNlIEZPVVJDQygic3R6MiIpOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoKG1MYXN0VHJhY2sgPT0gTlVMTCkgfHwgKG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlID09IE5VTEwpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKQEAgLTE2NzUsNiArMTkzOCw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgYWRqdXN0UmF3RGVmYXVsdEZyYW1lU2l6ZSgpOworCiAgICAgICAgICAgICBzaXplX3QgbWF4X3NpemU7CiAgICAgICAgICAgICBlcnIgPSBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+Z2V0TWF4U2FtcGxlU2l6ZSgmbWF4X3NpemUpOwogCkBAIC0xNjkxLDEyICsxOTU2LDE1IEBACiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJtYXggc2FtcGxlIHNpemUgdG9vIGJpZzogJXp1IiwgbWF4X3NpemUpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIG1heF9zaXplICsgMTAgKiAyKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsIG1heF9zaXplICsgMTAgKiAyKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gTm8gc2l6ZSB3YXMgc3BlY2lmaWVkLiBQaWNrIGEgY29uc2VydmF0aXZlbHkgbGFyZ2Ugc2l6ZS4KICAgICAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgaGVpZ2h0OwotICAgICAgICAgICAgICAgIGlmICghbUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleVdpZHRoLCAoaW50MzJfdCopJndpZHRoKSB8fAotICAgICAgICAgICAgICAgICAgICAhbUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleUhlaWdodCwoaW50MzJfdCopICZoZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsIChpbnQzMl90Kikmd2lkdGgpIHx8CisgICAgICAgICAgICAgICAgICAgICFBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwoaW50MzJfdCopICZoZWlnaHQpKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJObyB3aWR0aCBvciBoZWlnaHQsIGFzc3VtaW5nIHdvcnN0IGNhc2UgMTA4MHAiKTsKICAgICAgICAgICAgICAgICAgICAgd2lkdGggPSAxOTIwOwogICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSAxMDgwOwpAQCAtMTcxMSw3ICsxOTc5LDcgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICAgICAgICAgIENIRUNLKG1MYXN0VHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICAgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpOwogICAgICAgICAgICAgICAgIGlmICghc3RybmNtcChtaW1lLCAiYXVkaW8vIiwgNikpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGF1ZGlvLCB1c2UgMTI4S0IKICAgICAgICAgICAgICAgICAgICAgbWF4X3NpemUgPSAxMDI0ICogMTI4OwpAQCAtMTcyOCwyNiArMTk5NiwyOCBAQAogICAgICAgICAgICAgICAgIC8vIEhBQ0s6IGFsbG93IDEwJSBvdmVyaGVhZAogICAgICAgICAgICAgICAgIC8vIFRPRE86IHJlYWQgc2FtcGxlIHNpemUgZnJvbSB0cmFmIGF0b20gZm9yIGZyYWdtZW50ZWQgTVBFRzQuCiAgICAgICAgICAgICAgICAgbWF4X3NpemUgKz0gbWF4X3NpemUgLyAxMDsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIG1heF9zaXplKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwgbWF4X3NpemUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBOT1RFOiBzZXR0aW5nIGFub3RoZXIgcGllY2Ugb2YgbWV0YWRhdGEgaW52YWxpZGF0ZXMgYW55IHBvaW50ZXJzIChzdWNoIGFzIHRoZQogICAgICAgICAgICAgLy8gbWltZXR5cGUpIHByZXZpb3VzbHkgb2J0YWluZWQsIHNvIGRvbid0IGNhY2hlIHRoZW0uCiAgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICAgICAgQ0hFQ0sobUxhc3RUcmFjay0+bWV0YS5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisgICAgICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKTsKICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBhdmVyYWdlIGZyYW1lIHJhdGUuCiAgICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKCJ2aWRlby8iLCBtaW1lLCA2KSkgewogICAgICAgICAgICAgICAgIHNpemVfdCBuU2FtcGxlcyA9IG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5jb3VudFNhbXBsZXMoKTsKICAgICAgICAgICAgICAgICBpZiAoblNhbXBsZXMgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHRyYWNrSWQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrLT5tZXRhLmZpbmRJbnQzMihrS2V5VHJhY2tJRCwgJnRyYWNrSWQpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCAmdHJhY2tJZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyZXguc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmV4ICp0ID0gJm1UcmV4LmVkaXRJdGVtQXQoaSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQtPnRyYWNrX0lEID09ICh1aW50MzJfdCkgdHJhY2tJZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC0+ZGVmYXVsdF9zYW1wbGVfZHVyYXRpb24gPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lUmF0ZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnRpbWVzY2FsZSAvIHQtPmRlZmF1bHRfc2FtcGxlX2R1cmF0aW9uOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RnJhbWVSYXRlLCBmcmFtZVJhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURSwgZnJhbWVSYXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0xNzU1LDI4ICsyMDI1LDM4IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrLT5tZXRhLmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvblVzKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDY0KG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgJmR1cmF0aW9uVXMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHVyYXRpb25VcyA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lUmF0ZSA9IChuU2FtcGxlcyAqIDEwMDAwMDBMTCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGR1cmF0aW9uVXMgPj4gMSkpIC8gZHVyYXRpb25VczsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlGcmFtZVJhdGUsIGZyYW1lUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX1JBVEUsIGZyYW1lUmF0ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgQUxPR1YoInNldHRpbmcgZnJhbWUgY291bnQgJXp1IiwgblNhbXBsZXMpOwotICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlGcmFtZUNvdW50LCBuU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfQ09VTlQsIG5TYW1wbGVzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3MnLCAndCcsICd0JywgJ3MnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInN0dHMiKToKICAgICAgICAgewogICAgICAgICAgICAgaWYgKChtTGFzdFRyYWNrID09IE5VTEwpIHx8IChtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZSA9PSBOVUxMKSkKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAKKyAgICAgICAgICAgIGlmIChkZXB0aCA+PSAxICYmIG1QYXRoW2RlcHRoIC0gMV0gIT0gRk9VUkNDKCJzdGJsIikpIHsKKyAgICAgICAgICAgICAgICBjaGFyIGNodW5rWzVdOworICAgICAgICAgICAgICAgIE1ha2VGb3VyQ0NTdHJpbmcobVBhdGhbZGVwdGggLSAxXSwgY2h1bmspOworICAgICAgICAgICAgICAgIEFMT0dXKCJzdHRzJ3MgcGFyZW50IGJveCAoJXMpIGlzIG5vdCBzdGJsLCBza2lwIGl0LiIsIGNodW5rKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0KICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5zYW1wbGVUYWJsZS0+c2V0VGltZVRvU2FtcGxlUGFyYW1zKAogICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSk7CkBAIC0xNzg4LDcgKzIwNjgsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygnYycsICd0JywgJ3QnLCAncycpOgorICAgICAgICBjYXNlIEZPVVJDQygiY3R0cyIpOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoKG1MYXN0VHJhY2sgPT0gTlVMTCkgfHwgKG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlID09IE5VTEwpKQogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CkBAIC0xODA2LDcgKzIwODYsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygncycsICd0JywgJ3MnLCAncycpOgorICAgICAgICBjYXNlIEZPVVJDQygic3RzcyIpOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoKG1MYXN0VHJhY2sgPT0gTlVMTCkgfHwgKG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlID09IE5VTEwpKQogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CkBAIC0xODI1LDcgKzIxMDUsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gXHhBOXh5egotICAgICAgICBjYXNlIEZPVVJDQygweEE5LCAneCcsICd5JywgJ3onKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIlwyNTF4eXoiKToKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCkBAIC0xODcxLDExICsyMTUxLDExIEBACiAgICAgICAgICAgICBpZiAoYnVmZmVyW2xlbiAtIDFdICE9ICcvJykgewogICAgICAgICAgICAgICAgIGJ1ZmZlcltsZW5dID0gJy8nOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlMb2NhdGlvbiwgJmJ1ZmZlclswXSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfTE9DQVRJT04sICZidWZmZXJbMF0pOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygnZScsICdzJywgJ2QnLCAncycpOgorICAgICAgICBjYXNlIEZPVVJDQygiZXNkcyIpOgogICAgICAgICB7CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAKQEAgLTE4ODMsOSArMjE2MywxMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHVpbnQ4X3QgYnVmZmVyWzI1Nl07Ci0gICAgICAgICAgICBpZiAoY2h1bmtfZGF0YV9zaXplID4gKG9mZjY0X3Qpc2l6ZW9mKGJ1ZmZlcikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfQlVGRkVSX1RPT19TTUFMTDsKKyAgICAgICAgICAgIGF1dG8gdG1wID0gaGVhcGJ1ZmZlcjx1aW50OF90PihjaHVua19kYXRhX3NpemUpOworICAgICAgICAgICAgdWludDhfdCAqYnVmZmVyID0gdG1wLmdldCgpOworICAgICAgICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KApAQCAtMTkwMSwxMSArMjE4MiwxMSBAQAogICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCi0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldERhdGEoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlFU0RTLCBrVHlwZUVTRFMsICZidWZmZXJbNF0sIGNodW5rX2RhdGFfc2l6ZSAtIDQpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLCAKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9FU0RTLCAmYnVmZmVyWzRdLCBjaHVua19kYXRhX3NpemUgLSA0KTsKIAogICAgICAgICAgICAgaWYgKG1QYXRoLnNpemUoKSA+PSAyCi0gICAgICAgICAgICAgICAgICAgICYmIG1QYXRoW21QYXRoLnNpemUoKSAtIDJdID09IEZPVVJDQygnbScsICdwJywgJzQnLCAnYScpKSB7CisgICAgICAgICAgICAgICAgICAgICYmIG1QYXRoW21QYXRoLnNpemUoKSAtIDJdID09IEZPVVJDQygibXA0YSIpKSB7CiAgICAgICAgICAgICAgICAgLy8gSW5mb3JtYXRpb24gZnJvbSB0aGUgRVNEUyBtdXN0IGJlIHJlbGllZCBvbiBmb3IgcHJvcGVyCiAgICAgICAgICAgICAgICAgLy8gc2V0dXAgb2Ygc2FtcGxlIHJhdGUgYW5kIGNoYW5uZWwgY291bnQgZm9yIE1QRUc0IEF1ZGlvLgogICAgICAgICAgICAgICAgIC8vIFRoZSBnZW5lcmljIGhlYWRlciBhcHBlYXJzIHRvIG9ubHkgY29udGFpbiBnZW5lcmljCkBAIC0xOTE5LDIxICsyMjAwLDIyIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKG1QYXRoLnNpemUoKSA+PSAyCi0gICAgICAgICAgICAgICAgICAgICYmIG1QYXRoW21QYXRoLnNpemUoKSAtIDJdID09IEZPVVJDQygnbScsICdwJywgJzQnLCAndicpKSB7CisgICAgICAgICAgICAgICAgICAgICYmIG1QYXRoW21QYXRoLnNpemUoKSAtIDJdID09IEZPVVJDQygibXA0diIpKSB7CiAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZpZGVvIGlzIE1QRUcyCiAgICAgICAgICAgICAgICAgRVNEUyBlc2RzKCZidWZmZXJbNF0sIGNodW5rX2RhdGFfc2l6ZSAtIDQpOwogCiAgICAgICAgICAgICAgICAgdWludDhfdCBvYmplY3RUeXBlSW5kaWNhdGlvbjsKICAgICAgICAgICAgICAgICBpZiAoZXNkcy5nZXRPYmplY3RUeXBlSW5kaWNhdGlvbigmb2JqZWN0VHlwZUluZGljYXRpb24pID09IE9LKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChvYmplY3RUeXBlSW5kaWNhdGlvbiA+PSAweDYwICYmIG9iamVjdFR5cGVJbmRpY2F0aW9uIDw9IDB4NjUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2UgRk9VUkNDKCdiJywgJ3QnLCAncicsICd0Jyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJidHJ0Iik6CiAgICAgICAgIHsKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpIHsKQEAgLTE5NTMsMTUgKzIyMzUsMTcgQEAKICAgICAgICAgICAgIHVpbnQzMl90IG1heEJpdHJhdGUgPSBVMzJfQVQoJmJ1ZmZlcls0XSk7CiAgICAgICAgICAgICB1aW50MzJfdCBhdmdCaXRyYXRlID0gVTMyX0FUKCZidWZmZXJbOF0pOwogICAgICAgICAgICAgaWYgKG1heEJpdHJhdGUgPiAwICYmIG1heEJpdHJhdGUgPCBJTlQzMl9NQVgpIHsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlNYXhCaXRSYXRlLCAoaW50MzJfdCltYXhCaXRyYXRlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0JJVF9SQVRFLCAoaW50MzJfdCltYXhCaXRyYXRlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChhdmdCaXRyYXRlID4gMCAmJiBhdmdCaXRyYXRlIDwgSU5UMzJfTUFYKSB7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgKGludDMyX3QpYXZnQml0cmF0ZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFLCAoaW50MzJfdClhdmdCaXRyYXRlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAndicsICdjJywgJ0MnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImF2Y0MiKToKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCkBAIC0xOTgwLDEyICsyMjY0LDEyIEBACiAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleUFWQ0MsIGtUeXBlQVZDQywgYnVmZmVyLmdldCgpLCBjaHVua19kYXRhX3NpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLCAKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDLCBidWZmZXIuZ2V0KCksIGNodW5rX2RhdGFfc2l6ZSk7CiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdoJywgJ3YnLCAnYycsICdDJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJodmNDIik6CiAgICAgICAgIHsKICAgICAgICAgICAgIGF1dG8gYnVmZmVyID0gaGVhcGJ1ZmZlcjx1aW50OF90PihjaHVua19kYXRhX3NpemUpOwogCkBAIC0yMDAyLDE0ICsyMjg2LDM2IEBACiAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleUhWQ0MsIGtUeXBlSFZDQywgYnVmZmVyLmdldCgpLCBjaHVua19kYXRhX3NpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLCAKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQywgYnVmZmVyLmdldCgpLCBjaHVua19kYXRhX3NpemUpOwogCiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygiYXYxQyIpOgorICAgICAgICB7CisgICAgICAgICAgICBhdXRvIGJ1ZmZlciA9IGhlYXBidWZmZXI8dWludDhfdD4oY2h1bmtfZGF0YV9zaXplKTsKIAotICAgICAgICBjYXNlIEZPVVJDQygnZCcsICcyJywgJzYnLCAnMycpOgorICAgICAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImIvMjg0NzEyMDYiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBidWZmZXIuZ2V0KCksIGNodW5rX2RhdGFfc2l6ZSkgPCBjaHVua19kYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIGJ1ZmZlci5nZXQoKSwgY2h1bmtfZGF0YV9zaXplKTsKKworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBGT1VSQ0MoImQyNjMiKToKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogICAgICAgICAgICAgLyoKQEAgLTIwMzgsMTIgKzIzNDQsMTMgQEAKICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKGtLZXlEMjYzLCBrVHlwZUQyNjMsIGJ1ZmZlciwgY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9EMjYzLCBidWZmZXIsIGNodW5rX2RhdGFfc2l6ZSk7CiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnZScsICd0JywgJ2EnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIm1ldGEiKToKICAgICAgICAgewogICAgICAgICAgICAgb2ZmNjRfdCBzdG9wX29mZnNldCA9ICpvZmZzZXQgKyBjaHVua19zaXplOwogICAgICAgICAgICAgKm9mZnNldCA9IGRhdGFfb2Zmc2V0OwpAQCAtMjA4NywxMyArMjM5NCwxMyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygnaScsICdsJywgJ28nLCAnYycpOgotICAgICAgICBjYXNlIEZPVVJDQygnaScsICdpJywgJ24nLCAnZicpOgotICAgICAgICBjYXNlIEZPVVJDQygnaScsICdwJywgJ3InLCAncCcpOgotICAgICAgICBjYXNlIEZPVVJDQygncCcsICdpJywgJ3QnLCAnbScpOgotICAgICAgICBjYXNlIEZPVVJDQygnaScsICdkJywgJ2EnLCAndCcpOgotICAgICAgICBjYXNlIEZPVVJDQygnaScsICdyJywgJ2UnLCAnZicpOgotICAgICAgICBjYXNlIEZPVVJDQygnaScsICdwJywgJ3InLCAnbycpOgorICAgICAgICBjYXNlIEZPVVJDQygiaWxvYyIpOgorICAgICAgICBjYXNlIEZPVVJDQygiaWluZiIpOgorICAgICAgICBjYXNlIEZPVVJDQygiaXBycCIpOgorICAgICAgICBjYXNlIEZPVVJDQygicGl0bSIpOgorICAgICAgICBjYXNlIEZPVVJDQygiaWRhdCIpOgorICAgICAgICBjYXNlIEZPVVJDQygiaXJlZiIpOgorICAgICAgICBjYXNlIEZPVVJDQygiaXBybyIpOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAobUlzSGVpZikgewogICAgICAgICAgICAgICAgIGlmIChtSXRlbVRhYmxlID09IE5VTEwpIHsKQEAgLTIxMDksOSArMjQxNiw5IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2UnLCAnYScsICduJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCduJywgJ2EnLCAnbScsICdlJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdkJywgJ2EnLCAndCcsICdhJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJtZWFuIik6CisgICAgICAgIGNhc2UgRk9VUkNDKCJuYW1lIik6CisgICAgICAgIGNhc2UgRk9VUkNDKCJkYXRhIik6CiAgICAgICAgIHsKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKIApAQCAtMjEyNiw3ICsyNDMzLDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAndicsICdoJywgJ2QnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIm12aGQiKToKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCkBAIC0yMTY2LDE5ICsyNDczLDE5IEBACiAgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBkMzI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gMCAmJiBtSGVhZGVyVGltZXNjYWxlICE9IDAgJiYgZHVyYXRpb24gPCBVSU5UNjRfTUFYIC8gMTAwMDAwMCkgewotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvbiAqIDEwMDAwMDAgLyBtSGVhZGVyVGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uICogMTAwMDAwMCAvIG1IZWFkZXJUaW1lc2NhbGUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBTdHJpbmc4IHM7CiAgICAgICAgICAgICBpZiAoY29udmVydFRpbWVUb0RhdGUoY3JlYXRpb25UaW1lLCAmcykpIHsKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleURhdGUsIHMuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9EQVRFLCBzLnN0cmluZygpKTsKICAgICAgICAgICAgIH0KIAotCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ2UnLCAnaCcsICdkJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJtZWhkIik6CiAgICAgICAgIHsKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKIApAQCAtMjIxNiwxMyArMjUyMywxNCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gMCAmJiBtSGVhZGVyVGltZXNjYWxlICE9IDApIHsKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb24gKiAxMDAwMDAwIC8gbUhlYWRlclRpbWVzY2FsZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCBkdXJhdGlvbiAqIDEwMDAwMDAgLyBtSGVhZGVyVGltZXNjYWxlKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygnbScsICdkJywgJ2EnLCAndCcpOgorICAgICAgICBjYXNlIEZPVVJDQygibWRhdCIpOgogICAgICAgICB7CiAgICAgICAgICAgICBtTWRhdEZvdW5kID0gdHJ1ZTsKIApAQCAtMjIzMCw3ICsyNTM4LDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2gnLCAnZCcsICdsJywgJ3InKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImhkbHIiKToKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCkBAIC0yMjQ4LDE2ICsyNTU2LDE3IEBACiAgICAgICAgICAgICAvLyBGb3IgdGhlIDNHUFAgZmlsZSBmb3JtYXQsIHRoZSBoYW5kbGVyLXR5cGUgd2l0aGluIHRoZSAnaGRscicgYm94CiAgICAgICAgICAgICAvLyBzaGFsbCBiZSAndGV4dCcuIFdlIGFsc28gd2FudCB0byBzdXBwb3J0ICdzYnRsJyBoYW5kbGVyIHR5cGUKICAgICAgICAgICAgIC8vIGZvciBhIHByYWN0aWNhbCByZWFzb24gYXMgdmFyaW91cyBNUEVHNCBjb250YWluZXJzIHVzZSBpdC4KLSAgICAgICAgICAgIGlmICh0eXBlID09IEZPVVJDQygndCcsICdlJywgJ3gnLCAndCcpIHx8IHR5cGUgPT0gRk9VUkNDKCdzJywgJ2InLCAndCcsICdsJykpIHsKKyAgICAgICAgICAgIGlmICh0eXBlID09IEZPVVJDQygidGV4dCIpIHx8IHR5cGUgPT0gRk9VUkNDKCJzYnRsIikpIHsKICAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2UgRk9VUkNDKCdrJywgJ2UnLCAneScsICdzJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJrZXlzIik6CiAgICAgICAgIHsKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKIApAQCAtMjI3MCw3ICsyNTc5LDcgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAncicsICdlJywgJ3gnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInRyZXgiKToKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCkBAIC0yMjg5LDUyICsyNTk4LDY1IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ3gnLCAnMycsICdnJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJ0eDNnIik6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgICAgICAgICAgdWludDMyX3QgdHlwZTsKLSAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7Ci0gICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IDA7Ci0gICAgICAgICAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEuZmluZERhdGEoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUZXh0Rm9ybWF0RGF0YSwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICBzaXplID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKChjaHVua19zaXplID4gU0laRV9NQVgpIHx8IChTSVpFX01BWCAtIGNodW5rX3NpemUgPD0gc2l6ZSkpIHsKKyAgICAgICAgICAgIC8vIGNvbXBsYWluIGFib3V0IHJpZGljdWxvdXMgY2h1bmtzCisgICAgICAgICAgICBpZiAoY2h1bmtfc2l6ZSA+IGtNYXhBdG9tU2l6ZSkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W3NpemUgKyBjaHVua19zaXplXTsKLSAgICAgICAgICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgLy8gY29tcGxhaW4gYWJvdXQgZW1wdHkgYXRvbXMKKyAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPD0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJiLzEyNDMzMDIwNCIpOworICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTI0MzMwMjA0Iik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KGJ1ZmZlciwgZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICAvLyBzaG91bGQgZmlsbCBidWZmZXIgYmFzZWQgb24gImRhdGFfb2Zmc2V0IiBhbmQgImNodW5rX2RhdGFfc2l6ZSIKKyAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgKm9mZnNldCBhbmQgY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgIC8vIGJ1dCB3ZSd2ZSBiZWVuIGZlZWRpbmcgdGhlIGV4dHJhIGRhdGEgdG8gY29uc3VtZXJzIGZvciBtdWx0aXBsZSByZWxlYXNlcyBhbmQKKyAgICAgICAgICAgIC8vIGlmIHRob3NlIGFwcHMgYXJlIGNvbXBlbnNhdGluZyBmb3IgaXQsIHdlJ2QgYnJlYWsgdGhlbSB3aXRoIHN1Y2ggYSBjaGFuZ2UKKyAgICAgICAgICAgIC8vCisKKyAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrLT5tVHgzZ1NpemUgLSBtTGFzdFRyYWNrLT5tVHgzZ0ZpbGxlZCA8IGNodW5rX3NpemUpIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgZ3Jvd3RoID0ga1R4M2dHcm93dGg7CisgICAgICAgICAgICAgICAgaWYgKGdyb3d0aCA8IGNodW5rX3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgZ3Jvd3RoID0gY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gYWx0aG91Z2ggdGhpcyBkaXNhbGxvd3MgMiB0eDNnIGF0b21zIG9mIG5lYXJseSBrTWF4QXRvbVNpemUuLi4KKyAgICAgICAgICAgICAgICBpZiAoKHVpbnQ2NF90KSBtTGFzdFRyYWNrLT5tVHgzZ1NpemUgKyBncm93dGggPiBrTWF4QXRvbVNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImIvMTI0MzMwMjA0IC0gdG9vIG11Y2ggc3BhY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMjQzMzAyMDQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdWludDhfdCAqdXBkYXRlZCA9ICh1aW50OF90ICopcmVhbGxvYyhtTGFzdFRyYWNrLT5tVHgzZ0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1UeDNnU2l6ZSArIGdyb3d0aCk7CisgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZWQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tVHgzZ0J1ZmZlciA9IHVwZGF0ZWQ7CisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bVR4M2dTaXplICs9IGdyb3d0aDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKChzaXplX3QpKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgYnVmZmVyICsgc2l6ZSwgY2h1bmtfc2l6ZSkpCisgICAgICAgICAgICBpZiAoKHNpemVfdCkobURhdGFTb3VyY2UtPnJlYWRBdCgqb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bVR4M2dCdWZmZXIgKyBtTGFzdFRyYWNrLT5tVHgzZ0ZpbGxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX3NpemUpKQogICAgICAgICAgICAgICAgICAgICA8IGNodW5rX3NpemUpIHsKLSAgICAgICAgICAgICAgICBkZWxldGVbXSBidWZmZXI7Ci0gICAgICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKIAogICAgICAgICAgICAgICAgIC8vIGFkdmFuY2UgcmVhZCBwb2ludGVyIHNvIHdlIGRvbid0IGVuZCB1cCByZWFkaW5nIHRoaXMgYWdhaW4KICAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldERhdGEoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUZXh0Rm9ybWF0RGF0YSwgMCwgYnVmZmVyLCBzaXplICsgY2h1bmtfc2l6ZSk7Ci0KLSAgICAgICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKLQorICAgICAgICAgICAgbUxhc3RUcmFjay0+bVR4M2dGaWxsZWQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2MnLCAnbycsICd2JywgJ3InKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImNvdnIiKToKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCkBAIC0yMzU4LDE5ICsyNjgwLDE5IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXREYXRhKAotICAgICAgICAgICAgICAgIGtLZXlBbGJ1bUFydCwgTWV0YURhdGE6OlRZUEVfTk9ORSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJULAogICAgICAgICAgICAgICAgIGJ1ZmZlci5nZXQoKSArIGtTa2lwQnl0ZXNPZkRhdGFCb3gsIGNodW5rX2RhdGFfc2l6ZSAtIGtTa2lwQnl0ZXNPZkRhdGFCb3gpOwogCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2UgRk9VUkNDKCdjJywgJ28nLCAnbCcsICdyJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJjb2xyIik6CiAgICAgICAgIHsKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIC8vIHRoaXMgbXVzdCBiZSBpbiBhIFZpc3VhbFNhbXBsZUVudHJ5IGJveCB1bmRlciB0aGUgU2FtcGxlIERlc2NyaXB0aW9uIEJveCAoJ3N0c2QnKQogICAgICAgICAgICAgLy8gaWdub3JlIG90aGVyd2lzZQotICAgICAgICAgICAgaWYgKGRlcHRoID49IDIgJiYgbVBhdGhbZGVwdGggLSAyXSA9PSBGT1VSQ0MoJ3MnLCAndCcsICdzJywgJ2QnKSkgeworICAgICAgICAgICAgaWYgKGRlcHRoID49IDIgJiYgbVBhdGhbZGVwdGggLSAyXSA9PSBGT1VSQ0MoInN0c2QiKSkgewogICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ29sb3JJbmZvKGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwogICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTIzODAsMTIgKzI3MDIsMTIgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAnaScsICd0JywgJ2wnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3AnLCAnZScsICdyJywgJ2YnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAndScsICd0JywgJ2gnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2cnLCAnbicsICdyJywgJ2UnKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2EnLCAnbCcsICdiJywgJ20nKToKLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3knLCAncicsICdyJywgJ2MnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInRpdGwiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInBlcmYiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImF1dGgiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImducmUiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImFsYm0iKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInlycmMiKToKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwogCkBAIC0yMzk4LDcgKzI3MjAsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygnSScsICdEJywgJzMnLCAnMicpOgorICAgICAgICBjYXNlIEZPVVJDQygiSUQzMiIpOgogICAgICAgICB7CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAKQEAgLTI0MTEsNyArMjczMyw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2UgRk9VUkNDKCctJywgJy0nLCAnLScsICctJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCItLS0tIik6CiAgICAgICAgIHsKICAgICAgICAgICAgIG1MYXN0Q29tbWVudE1lYW4uY2xlYXIoKTsKICAgICAgICAgICAgIG1MYXN0Q29tbWVudE5hbWUuY2xlYXIoKTsKQEAgLTI0MjAsNyArMjc0Miw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ2knLCAnZCcsICd4Jyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJzaWR4Iik6CiAgICAgICAgIHsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlU2VnbWVudEluZGV4KGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpOwogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtMjQzMCwxMyArMjc1Miw0NiBAQAogICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7IC8vIHN0b3AgcGFyc2luZyBhZnRlciBzaWR4CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygnYScsICdjJywgJy0nLCAnMycpOgorICAgICAgICBjYXNlIEZPVVJDQygiYWMtMyIpOgogICAgICAgICB7CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7Ci0gICAgICAgICAgICByZXR1cm4gcGFyc2VBQzNTYW1wbGVFbnRyeShkYXRhX29mZnNldCk7CisgICAgICAgICAgICAvLyBieXBhc3MgYWMtMyBpZiBwYXJzZSBmYWlsCisgICAgICAgICAgICBpZiAocGFyc2VBQzNTcGVjaWZpY0JveChkYXRhX29mZnNldCkgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJGYWlsIHRvIHBhcnNlIGFjLTMiKTsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+c2tpcFRyYWNrID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygnZicsICd0JywgJ3knLCAncCcpOgorICAgICAgICBjYXNlIEZPVVJDQygiZWMtMyIpOgorICAgICAgICB7CisgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CisgICAgICAgICAgICAvLyBieXBhc3MgZWMtMyBpZiBwYXJzZSBmYWlsCisgICAgICAgICAgICBpZiAocGFyc2VFQUMzU3BlY2lmaWNCb3goZGF0YV9vZmZzZXQpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiRmFpbCB0byBwYXJzZSBlYy0zIik7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNraXBUcmFjayA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoImFjLTQiKToKKyAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgLy8gYnlwYXNzIGFjLTQgaWYgcGFyc2UgZmFpbAorICAgICAgICAgICAgaWYgKHBhcnNlQUM0U3BlY2lmaWNCb3goZGF0YV9vZmZzZXQpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiRmFpbCB0byBwYXJzZSBhYy00Iik7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNraXBUcmFjayA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoImZ0eXAiKToKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IDggfHwgZGVwdGggIT0gMCkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CkBAIC0yNDYxLDE2ICsyODE2LDE2IEBACiAgICAgICAgICAgICAgICAgYnJhbmRTZXQuaW5zZXJ0KGJyYW5kKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGJyYW5kU2V0LmNvdW50KEZPVVJDQygncScsICd0JywgJyAnLCAnICcpKSA+IDApIHsKKyAgICAgICAgICAgIGlmIChicmFuZFNldC5jb3VudChGT1VSQ0MoInF0ICAiKSkgPiAwKSB7CiAgICAgICAgICAgICAgICAgbUlzUVQgPSB0cnVlOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoYnJhbmRTZXQuY291bnQoRk9VUkNDKCdtJywgJ2knLCAnZicsICcxJykpID4gMAotICAgICAgICAgICAgICAgICAmJiBicmFuZFNldC5jb3VudChGT1VSQ0MoJ2gnLCAnZScsICdpJywgJ2MnKSkgPiAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGJyYW5kU2V0LmNvdW50KEZPVVJDQygibWlmMSIpKSA+IDAKKyAgICAgICAgICAgICAgICAgJiYgYnJhbmRTZXQuY291bnQoRk9VUkNDKCJoZWljIikpID4gMCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigiaWRlbnRpZmllZCBIRUlGIGltYWdlIik7CiAKICAgICAgICAgICAgICAgICAgICAgbUlzSGVpZiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyYW5kU2V0LmVyYXNlKEZPVVJDQygnbScsICdpJywgJ2YnLCAnMScpKTsKLSAgICAgICAgICAgICAgICAgICAgYnJhbmRTZXQuZXJhc2UoRk9VUkNDKCdoJywgJ2UnLCAnaScsICdjJykpOworICAgICAgICAgICAgICAgICAgICBicmFuZFNldC5lcmFzZShGT1VSQ0MoIm1pZjEiKSk7CisgICAgICAgICAgICAgICAgICAgIGJyYW5kU2V0LmVyYXNlKEZPVVJDQygiaGVpYyIpKTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAoIWJyYW5kU2V0LmVtcHR5KCkpIHsKQEAgLTI1MDcsMzYgKzI4NjIsMzMwIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VBQzNTYW1wbGVFbnRyeShvZmY2NF90IG9mZnNldCkgeworc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlQ2hhbm5lbENvdW50U2FtcGxlUmF0ZSgKKyAgICAgICAgb2ZmNjRfdCAqb2Zmc2V0LCB1aW50MTZfdCAqY2hhbm5lbENvdW50LCB1aW50MTZfdCAqc2FtcGxlUmF0ZSkgewogICAgIC8vIHNraXAgMTYgYnl0ZXM6CiAgICAgLy8gICsgNi1ieXRlIHJlc2VydmVkLAogICAgIC8vICArIDItYnl0ZSBkYXRhIHJlZmVyZW5jZSBpbmRleCwKICAgICAvLyAgKyA4LWJ5dGUgcmVzZXJ2ZWQKLSAgICBvZmZzZXQgKz0gMTY7Ci0gICAgdWludDE2X3QgY2hhbm5lbENvdW50OwotICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQxNihvZmZzZXQsICZjaGFubmVsQ291bnQpKSB7CisgICAgKm9mZnNldCArPSAxNjsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MTYoKm9mZnNldCwgY2hhbm5lbENvdW50KSkgeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgc2FtcGxlIGVudHJ5IGJveDogY2Fubm90IHJlYWQgY2hhbm5lbCBjb3VudCIpOwogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KICAgICAvLyBza2lwIDggYnl0ZXM6CiAgICAgLy8gICsgMi1ieXRlIGNoYW5uZWxDb3VudCwKICAgICAvLyAgKyAyLWJ5dGUgc2FtcGxlIHNpemUsCiAgICAgLy8gICsgNC1ieXRlIHJlc2VydmVkCi0gICAgb2Zmc2V0ICs9IDg7Ci0gICAgdWludDE2X3Qgc2FtcGxlUmF0ZTsKLSAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MTYob2Zmc2V0LCAmc2FtcGxlUmF0ZSkpIHsKLSAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGFjLTMgYmxvY2s6IGNhbm5vdCByZWFkIHNhbXBsZSByYXRlIik7CisgICAgKm9mZnNldCArPSA4OworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQxNigqb2Zmc2V0LCBzYW1wbGVSYXRlKSkgeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgc2FtcGxlIGVudHJ5IGJveDogY2Fubm90IHJlYWQgc2FtcGxlIHJhdGUiKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9Ci0KICAgICAvLyBza2lwIDQgYnl0ZXM6CiAgICAgLy8gICsgMi1ieXRlIHNhbXBsZVJhdGUsCiAgICAgLy8gICsgMi1ieXRlIHJlc2VydmVkCi0gICAgb2Zmc2V0ICs9IDQ7Ci0gICAgcmV0dXJuIHBhcnNlQUMzU3BlY2lmaWNCb3gob2Zmc2V0LCBzYW1wbGVSYXRlKTsKKyAgICAqb2Zmc2V0ICs9IDQ7CisgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VBQzNTcGVjaWZpY0JveCgKLSAgICAgICAgb2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90IHNhbXBsZVJhdGUpIHsKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZUFDNFNwZWNpZmljQm94KG9mZjY0X3Qgb2Zmc2V0KSB7CisgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVpbnQxNl90IHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudDsKKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgaWYgKChzdGF0dXMgPSBwYXJzZUNoYW5uZWxDb3VudFNhbXBsZVJhdGUoJm9mZnNldCwgJmNoYW5uZWxDb3VudCwgJnNhbXBsZVJhdGUpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICB1aW50MzJfdCBzaXplOworICAgIC8vICsgNC1ieXRlIHNpemUKKyAgICAvLyArIDQtYnl0ZSB0eXBlCisgICAgLy8gKyAzLWJ5dGUgcGF5bG9hZAorICAgIGNvbnN0IHVpbnQzMl90IGtBQzRNaW5pbXVtQm94U2l6ZSA9IDQgKyA0ICsgMzsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmc2l6ZSkgfHwgc2l6ZSA8IGtBQzRNaW5pbXVtQm94U2l6ZSkgeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgYWMtNCBibG9jazogY2Fubm90IHJlYWQgc3BlY2lmaWMgYm94IHNpemUiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICAvLyArIDQtYnl0ZSBzaXplCisgICAgb2Zmc2V0ICs9IDQ7CisgICAgdWludDMyX3QgdHlwZTsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmdHlwZSkgfHwgdHlwZSAhPSBGT1VSQ0MoImRhYzQiKSkgeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgYWMtNCBzcGVjaWZpYyBibG9jazogaGVhZGVyIG5vdCBkYWM0Iik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgLy8gKyA0LWJ5dGUgdHlwZQorICAgIG9mZnNldCArPSA0OworICAgIGNvbnN0IHVpbnQzMl90IGtBQzRTcGVjaWZpY0JveFBheWxvYWRTaXplID0gMTE3NjsKKyAgICB1aW50OF90IGNodW5rW2tBQzRTcGVjaWZpY0JveFBheWxvYWRTaXplXTsKKyAgICBzc2l6ZV90IGRzaVNpemUgPSBzaXplIC0gODsgLy8gc2l6ZSBvZiBib3ggLSBzaXplIGFuZCB0eXBlIGZpZWxkcworICAgIGlmIChkc2lTaXplID49IChzc2l6ZV90KWtBQzRTcGVjaWZpY0JveFBheWxvYWRTaXplIHx8CisgICAgICAgIG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBjaHVuaywgZHNpU2l6ZSkgIT0gZHNpU2l6ZSkgeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgYWMtNCBzcGVjaWZpYyBibG9jazogYml0c3RyZWFtIGZpZWxkcyIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICAvLyArIHNpemUtYnl0ZSBwYXlsb2FkCisgICAgb2Zmc2V0ICs9IGRzaVNpemU7CisgICAgQUJpdFJlYWRlciBicihjaHVuaywgZHNpU2l6ZSk7CisgICAgQUM0RFNJUGFyc2VyIHBhcnNlcihicik7CisgICAgaWYgKCFwYXJzZXIucGFyc2UoKSl7CisgICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcGFyc2luZyBhYy00IHNwZWNpZmljIGJsb2NrIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FDNCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgY2hhbm5lbENvdW50KTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgc2FtcGxlUmF0ZSk7CisKKyAgICBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb24gcHJlc2VudGF0aW9uczsKKyAgICAvLyB0cmFuc2xhdGUgdGhlIEFDNCBwcmVzZW50YXRpb24gaW5mb3JtYXRpb24gdG8gYXVkaW8gcHJlc2VudGF0aW9ucyBmb3IgdGhpcyB0cmFjaworICAgIEFDNERTSVBhcnNlcjo6QUM0UHJlc2VudGF0aW9ucyBhYzRQcmVzZW50YXRpb25zID0gcGFyc2VyLmdldFByZXNlbnRhdGlvbnMoKTsKKyAgICBpZiAoIWFjNFByZXNlbnRhdGlvbnMuZW1wdHkoKSkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGFjNFByZXNlbnRhdGlvbiA6IGFjNFByZXNlbnRhdGlvbnMpIHsKKyAgICAgICAgICAgIGF1dG8mIHByZXNlbnRhdGlvbiA9IGFjNFByZXNlbnRhdGlvbi5zZWNvbmQ7CisgICAgICAgICAgICBpZiAoIXByZXNlbnRhdGlvbi5tRW5hYmxlZCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQXVkaW9QcmVzZW50YXRpb25WMSBhcDsKKyAgICAgICAgICAgIGFwLm1QcmVzZW50YXRpb25JZCA9IHByZXNlbnRhdGlvbi5tR3JvdXBJbmRleDsKKyAgICAgICAgICAgIGFwLm1Qcm9ncmFtSWQgPSBwcmVzZW50YXRpb24ubVByb2dyYW1JRDsKKyAgICAgICAgICAgIGFwLm1MYW5ndWFnZSA9IHByZXNlbnRhdGlvbi5tTGFuZ3VhZ2U7CisgICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uLm1QcmVWaXJ0dWFsaXplZCkgeworICAgICAgICAgICAgICAgIGFwLm1NYXN0ZXJpbmdJbmRpY2F0aW9uID0gTUFTVEVSRURfRk9SX0hFQURQSE9ORTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3dpdGNoIChwcmVzZW50YXRpb24ubUNoYW5uZWxNb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV9Nb25vOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfU3RlcmVvOgorICAgICAgICAgICAgICAgICAgICAgICAgYXAubU1hc3RlcmluZ0luZGljYXRpb24gPSBNQVNURVJFRF9GT1JfU1RFUkVPOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV8zXzA6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV81XzA6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV81XzE6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV83XzBfMzQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV83XzFfMzQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV83XzBfNTI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV83XzFfNTI6CisgICAgICAgICAgICAgICAgICAgICAgICBhcC5tTWFzdGVyaW5nSW5kaWNhdGlvbiA9IE1BU1RFUkVEX0ZPUl9TVVJST1VORDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfN18wXzMyMjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzdfMV8zMjI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV83XzBfNDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzdfMV80OgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfOV8wXzQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV85XzFfNDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzIyXzI6CisgICAgICAgICAgICAgICAgICAgICAgICBhcC5tTWFzdGVyaW5nSW5kaWNhdGlvbiA9IE1BU1RFUkVEX0ZPUl8zRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgY2hhbm5lbCBtb2RlIGluIEFDNCBwcmVzZW50YXRpb24iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhcC5tQXVkaW9EZXNjcmlwdGlvbkF2YWlsYWJsZSA9IChwcmVzZW50YXRpb24ubUNvbnRlbnRDbGFzc2lmaWVyID09CisgICAgICAgICAgICAgICAgICAgIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprVmlzdWFsbHlJbXBhaXJlZCk7CisgICAgICAgICAgICBhcC5tU3Bva2VuU3VidGl0bGVzQXZhaWxhYmxlID0gKHByZXNlbnRhdGlvbi5tQ29udGVudENsYXNzaWZpZXIgPT0KKyAgICAgICAgICAgICAgICAgICAgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtWb2ljZU92ZXIpOworICAgICAgICAgICAgYXAubURpYWxvZ3VlRW5oYW5jZW1lbnRBdmFpbGFibGUgPSBwcmVzZW50YXRpb24ubUhhc0RpYWxvZ0VuaGFuY2VtZW50czsKKyAgICAgICAgICAgIGlmICghYXAubUxhbmd1YWdlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBhcC5tTGFiZWxzLmVtcGxhY2UoYXAubUxhbmd1YWdlLCBwcmVzZW50YXRpb24ubURlc2NyaXB0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByZXNlbnRhdGlvbnMucHVzaF9iYWNrKHN0ZDo6bW92ZShhcCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHByZXNlbnRhdGlvbnMuZW1wdHkoKSkgeworICAgICAgICAvLyBDbGVhciBhdWRpbyBwcmVzZW50YXRpb24gaW5mbyBpbiBtZXRhZGF0YS4KKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcigKKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9JTkZPLCBudWxscHRyLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3V0U3RyZWFtKHN0ZDo6aW9zOjpvdXQpOworICAgICAgICBzZXJpYWxpemVBdWRpb1ByZXNlbnRhdGlvbnMocHJlc2VudGF0aW9ucywgJm91dFN0cmVhbSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoCisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9BVURJT19QUkVTRU5UQVRJT05fSU5GTywKKyAgICAgICAgICAgICAgICBvdXRTdHJlYW0uc3RyKCkuZGF0YSgpLCBvdXRTdHJlYW0uc3RyKCkuc2l6ZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VFQUMzU3BlY2lmaWNCb3gob2ZmNjRfdCBvZmZzZXQpIHsKKyAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdWludDE2X3Qgc2FtcGxlUmF0ZSwgY2hhbm5lbHM7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICgoc3RhdHVzID0gcGFyc2VDaGFubmVsQ291bnRTYW1wbGVSYXRlKCZvZmZzZXQsICZjaGFubmVscywgJnNhbXBsZVJhdGUpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICB1aW50MzJfdCBzaXplOworICAgIC8vICsgNC1ieXRlIHNpemUKKyAgICAvLyArIDQtYnl0ZSB0eXBlCisgICAgLy8gKyAzLWJ5dGUgcGF5bG9hZAorICAgIGNvbnN0IHVpbnQzMl90IGtFQUMzU3BlY2lmaWNCb3hNaW5TaXplID0gMTE7CisgICAgLy8gMTMgKyAzICsgKDggKiAoMiArIDUgKyA1ICsgMyArIDEgKyAzICsgNCArICgxNCAqIDkgKyAxKSkpIGJpdHMgPT0gMTUyIGJ5dGVzIHRoZW9yZXRpY2FsIG1heAorICAgIC8vIGNhbGN1bGF0ZWQgZnJvbSB0aGUgcmVxdWlyZWQgYml0cyByZWFkIGJlbG93IGFzIHdlbGwgYXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGluZGVwZW5kZW50CisgICAgLy8gYW5kIGRlcGVuZGFudCBzdWIgc3RyZWFtcyB5b3UgY2FuIGhhdmUKKyAgICBjb25zdCB1aW50MzJfdCBrRUFDM1NwZWNpZmljQm94TWF4U2l6ZSA9IDE1MjsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmc2l6ZSkgfHwKKyAgICAgICAgc2l6ZSA8IGtFQUMzU3BlY2lmaWNCb3hNaW5TaXplIHx8CisgICAgICAgIHNpemUgPiBrRUFDM1NwZWNpZmljQm94TWF4U2l6ZSkgeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgZWFjLTMgYmxvY2s6IGNhbm5vdCByZWFkIHNwZWNpZmljIGJveCBzaXplIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgb2Zmc2V0ICs9IDQ7CisgICAgdWludDMyX3QgdHlwZTsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmdHlwZSkgfHwgdHlwZSAhPSBGT1VSQ0MoImRlYzMiKSkgeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgZWFjLTMgc3BlY2lmaWMgYmxvY2s6IGhlYWRlciBub3QgZGVjMyIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIG9mZnNldCArPSA0OworICAgIHVpbnQ4X3QqIGNodW5rID0gbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3Rbc2l6ZV07CisgICAgaWYgKGNodW5rID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGNodW5rLCBzaXplKSAhPSAoc3NpemVfdClzaXplKSB7CisgICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcmVhZGluZyBlYWMtMyBzcGVjaWZpYyBibG9jazogYml0c3RyZWFtIGZpZWxkcyIpOworICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBBQml0UmVhZGVyIGJyKGNodW5rLCBzaXplKTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhbm5lbENvdW50VGFibGVbXSA9IHsyLCAxLCAyLCAzLCAzLCA0LCA0LCA1fTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2FtcGxlUmF0ZVRhYmxlW10gPSB7NDgwMDAsIDQ0MTAwLCAzMjAwMH07CisKKyAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDE2KSB7CisgICAgICAgIGRlbGV0ZVtdIGNodW5rOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICB1bnNpZ25lZCBkYXRhX3JhdGUgPSBici5nZXRCaXRzKDEzKTsKKyAgICBBTE9HVigiRUFDMyBkYXRhIHJhdGUgPSAlZCIsIGRhdGFfcmF0ZSk7CisKKyAgICB1bnNpZ25lZCBudW1faW5kX3N1YiA9IGJyLmdldEJpdHMoMykgKyAxOworICAgIEFMT0dWKCJFQUMzIGluZGVwZW5kYW50IHN1YnN0cmVhbXMgPSAlZCIsIG51bV9pbmRfc3ViKTsKKyAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IChudW1faW5kX3N1YiAqIDIzKSkgeworICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBjaGFubmVsQ291bnQgPSAwOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1faW5kX3N1YjsgaSsrKSB7CisgICAgICAgIHVuc2lnbmVkIGZzY29kID0gYnIuZ2V0Qml0cygyKTsKKyAgICAgICAgaWYgKGZzY29kID09IDMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbmNvcnJlY3QgZnNjb2QgKDMpIGluIEVBQzMgaGVhZGVyIik7CisgICAgICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgdW5zaWduZWQgYm94U2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGVUYWJsZVtmc2NvZF07CisgICAgICAgIGlmIChib3hTYW1wbGVSYXRlICE9IHNhbXBsZVJhdGUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJzYW1wbGUgcmF0ZSBtaXNtYXRjaDogYm94U2FtcGxlUmF0ZSA9ICVkLCBzYW1wbGVSYXRlID0gJWQiLAorICAgICAgICAgICAgICAgIGJveFNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOworICAgICAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgdW5zaWduZWQgYnNpZCA9IGJyLmdldEJpdHMoNSk7CisgICAgICAgIGlmIChic2lkID09IDkgfHwgYnNpZCA9PSAxMCkgeworICAgICAgICAgICAgQUxPR1coIkVBQzMgc3RyZWFtIChic2lkPSVkKSBtYXkgYmUgc2lsZW5jZWQgYnkgdGhlIGRlY29kZXIiLCBic2lkKTsKKyAgICAgICAgfSBlbHNlIGlmIChic2lkID4gMTYpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFQUMzIHN0cmVhbSAoYnNpZD0lZCkgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBFVFNJIFRTIDEwMiAzNjYgdjEuNC4xIiwgYnNpZCk7CisgICAgICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBza2lwCisgICAgICAgIGJyLnNraXBCaXRzKDIpOworICAgICAgICB1bnNpZ25lZCBic21vZCA9IGJyLmdldEJpdHMoMyk7CisgICAgICAgIHVuc2lnbmVkIGFjbW9kID0gYnIuZ2V0Qml0cygzKTsKKyAgICAgICAgdW5zaWduZWQgbGZlb24gPSBici5nZXRCaXRzKDEpOworICAgICAgICAvLyB3ZSBjdXJyZW50bHkgb25seSBzdXBwb3J0IHRoZSBmaXJzdCBzdHJlYW0KKyAgICAgICAgaWYgKGkgPT0gMCkKKyAgICAgICAgICAgIGNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudFRhYmxlW2FjbW9kXSArIGxmZW9uOworICAgICAgICBBTE9HVigiYnNtb2QgPSAlZCwgYWNtb2QgPSAlZCwgbGZlb24gPSAlZCIsIGJzbW9kLCBhY21vZCwgbGZlb24pOworCisgICAgICAgIGJyLnNraXBCaXRzKDMpOworICAgICAgICB1bnNpZ25lZCBudW1fZGVwX3N1YiA9IGJyLmdldEJpdHMoNCk7CisgICAgICAgIEFMT0dWKCJFQUMzIGRlcGVuZGFudCBzdWJzdHJlYW1zID0gJWQiLCBudW1fZGVwX3N1Yik7CisgICAgICAgIGlmIChudW1fZGVwX3N1YiAhPSAwKSB7CisgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDkpIHsKKyAgICAgICAgICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGNoYW5fbG9jX3RibFtdID0geyAiTGMvUmMiLCJMcnMvUnJzIiwiQ3MiLCJUcyIsIkxzZC9Sc2QiLAorICAgICAgICAgICAgICAgICJMdy9SdyIsIkx2aC9SdmgiLCJDdmgiLCJMZmUyIiB9OworICAgICAgICAgICAgdW5zaWduZWQgY2hhbl9sb2MgPSBici5nZXRCaXRzKDkpOworICAgICAgICAgICAgdW5zaWduZWQgbWFzayA9IDE7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGogPSAwOyBqIDwgOTsgaisrLCBtYXNrIDw8PSAxKSB7CisgICAgICAgICAgICAgICAgaWYgKChjaGFuX2xvYyAmIG1hc2spICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCB0aGUgZmlyc3Qgc3RyZWFtCisgICAgICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2UgYXJlIDIgY2hhbm5lbHMgaW4gdGhlIG1hc2sKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqID09IDAgfHwgaiA9PSAxIHx8IGogPT0gNCB8fCBqID09IDUgfHwgaiA9PSA2KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiAlcyIsIGNoYW5fbG9jX3RibFtqXSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGRlbGV0ZVtdIGNodW5rOworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBici5za2lwQml0cygxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChici5udW1CaXRzTGVmdCgpICE9IDApIHsKKyAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA4KSB7CisgICAgICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgdW5zaWduZWQgbWFzayA9IGJyLmdldEJpdHMoOCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCA4OyBpKyspIHsKKyAgICAgICAgICAgIGlmICgoKDB4MSA8PCBpKSAmJiBtYXNrKSA9PSAwKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgICAgICBpZiAoYnIubnVtQml0c0xlZnQoKSA8IDgpIHsKKyAgICAgICAgICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3dpdGNoIChpKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOiB7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNvbXBsZXhpdHkgPSBici5nZXRCaXRzKDgpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiRm91bmQgYSBKT0Mgc3RyZWFtIHdpdGggY29tcGxleGl0eSA9ICVkIiwgY29tcGxleGl0eSk7CisgICAgICAgICAgICAgICAgfWJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoOCk7CisgICAgICAgICAgICAgICAgfWJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBjaGFubmVsQ291bnQpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBzYW1wbGVSYXRlKTsKKworICAgIGRlbGV0ZVtdIGNodW5rOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlQUMzU3BlY2lmaWNCb3gob2ZmNjRfdCBvZmZzZXQpIHsKKyAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdWludDE2X3Qgc2FtcGxlUmF0ZSwgY2hhbm5lbHM7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICgoc3RhdHVzID0gcGFyc2VDaGFubmVsQ291bnRTYW1wbGVSYXRlKCZvZmZzZXQsICZjaGFubmVscywgJnNhbXBsZVJhdGUpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KICAgICB1aW50MzJfdCBzaXplOwogICAgIC8vICsgNC1ieXRlIHNpemUKICAgICAvLyArIDQtYnl0ZSB0eXBlCkBAIC0yNTQ5LDcgKzMxOTgsNyBAQAogCiAgICAgb2Zmc2V0ICs9IDQ7CiAgICAgdWludDMyX3QgdHlwZTsKLSAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MzIob2Zmc2V0LCAmdHlwZSkgfHwgdHlwZSAhPSBGT1VSQ0MoJ2QnLCAnYScsICdjJywgJzMnKSkgeworICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQsICZ0eXBlKSB8fCB0eXBlICE9IEZPVVJDQygiZGFjMyIpKSB7CiAgICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcmVhZGluZyBhYy0zIHNwZWNpZmljIGJsb2NrOiBoZWFkZXIgbm90IGRhYzMiKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CkBAIC0yNTkxLDEyICszMjQwLDQ4IEBACiAgICAgdW5zaWduZWQgbGZlb24gPSBici5nZXRCaXRzKDEpOwogICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudFRhYmxlW2FjbW9kXSArIGxmZW9uOwogCi0gICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkgeworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQzMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIGNoYW5uZWxDb3VudCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZVJhdGUpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlQUxBQ1NhbXBsZUVudHJ5KG9mZjY0X3QgKm9mZnNldCkgeworICAgIC8vIFNlZSAnZXh0ZXJuYWwvYWxhYy9BTEFDTWFnaWNDb29raWVEZXNjcmlwdGlvbi50eHQgZm9yIHRoZSBkZXRhaWwnLgorICAgIC8vIFN0b3JlIEFMQUMgbWFnaWMgY29va2llIChkZWNvZGVyIG5lZWRzIGl0KS4KKyAgICB1aW50OF90IGFsYWNJbmZvWzEyXTsKKyAgICBvZmY2NF90IGRhdGFfb2Zmc2V0ID0gKm9mZnNldDsKKworICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGFsYWNJbmZvLCBzaXplb2YoYWxhY0luZm8pKSA8IChzc2l6ZV90KXNpemVvZihhbGFjSW5mbykpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKyAgICB1aW50MzJfdCBzaXplID0gVTMyX0FUKCZhbGFjSW5mb1swXSk7CisgICAgaWYgKChzaXplICE9IEFMQUNfU1BFQ0lGSUNfSU5GT19TSVpFKSB8fAorICAgICAgICAgICAgKFUzMl9BVCgmYWxhY0luZm9bNF0pICE9IEZPVVJDQygiYWxhYyIpKSB8fAorICAgICAgICAgICAgKFUzMl9BVCgmYWxhY0luZm9bOF0pICE9IDApKSB7CisgICAgICAgIEFMT0dWKCJTaXplOiV1LCBVMzJfQVQoJmFsYWNJbmZvWzRdKToldSwgVTMyX0FUKCZhbGFjSW5mb1s4XSk6JXUiLAorICAgICAgICAgICAgc2l6ZSwgVTMyX0FUKCZhbGFjSW5mb1s0XSksIFUzMl9BVCgmYWxhY0luZm9bOF0pKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9Ci0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUMzKTsKLSAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGNoYW5uZWxDb3VudCk7Ci0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CisgICAgZGF0YV9vZmZzZXQgKz0gc2l6ZW9mKGFsYWNJbmZvKTsKKyAgICB1aW50OF90IGNvb2tpZVtzaXplIC0gc2l6ZW9mKGFsYWNJbmZvKV07CisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICBkYXRhX29mZnNldCwgY29va2llLCBzaXplb2YoY29va2llKSkgPCAoc3NpemVfdClzaXplb2YoY29va2llKSkgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfQorCisgICAgdWludDhfdCBiaXRzUGVyU2FtcGxlID0gY29va2llWzVdOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUsIGJpdHNQZXJTYW1wbGUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBjb29raWVbOV0pOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgVTMyX0FUKCZjb29raWVbMjBdKSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgY29va2llLCBzaXplb2YoY29va2llKSk7CisgICAgZGF0YV9vZmZzZXQgKz0gc2l6ZW9mKGNvb2tpZSk7CisgICAgKm9mZnNldCA9IGRhdGFfb2Zmc2V0OwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMjcxNiw4ICszNDAxLDkgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAogICAgIGludDY0X3QgbWV0YUR1cmF0aW9uOwotICAgIGlmICghbUxhc3RUcmFjay0+bWV0YS5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmbWV0YUR1cmF0aW9uKSB8fCBtZXRhRHVyYXRpb24gPT0gMCkgewotICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgc2lkeER1cmF0aW9uKTsKKyAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQ2NChtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICZtZXRhRHVyYXRpb24pIHx8IG1ldGFEdXJhdGlvbiA9PSAwKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCBzaWR4RHVyYXRpb24pOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CkBAIC0yNzUzLDcgKzM0MzksNyBAQAogCiAgICAgICAgIHVpbnQzMl90IHR5cGU7CiAgICAgICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihrZXlPZmZzZXQgKyA0LCAmdHlwZSkKLSAgICAgICAgICAgICAgICB8fCB0eXBlICE9IEZPVVJDQygnbScsICdkJywgJ3QnLCAnYScpKSB7CisgICAgICAgICAgICAgICAgfHwgdHlwZSAhPSBGT1VSQ0MoIm1kdGEiKSkgewogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogCkBAIC0yNzk1LDcgKzM0ODEsNyBAQAogICAgIH0KICAgICB1aW50MzJfdCBhdG9tRm91ckNDOwogICAgIGlmICghbURhdGFTb3VyY2UtPmdldFVJbnQzMihvZmZzZXQgKyA0LCAmYXRvbUZvdXJDQykKLSAgICAgICAgICAgIHx8IGF0b21Gb3VyQ0MgIT0gRk9VUkNDKCdkJywgJ2EnLCAndCcsICdhJykpIHsKKyAgICAgICAgICAgIHx8IGF0b21Gb3VyQ0MgIT0gRk9VUkNDKCJkYXRhIikpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAgICAgdWludDMyX3QgZGF0YVR5cGU7CkBAIC0yODE1LDcgKzM1MDEsNyBAQAogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgICAgICBpZiAoIXN0cmNhc2VjbXAobU1ldGFLZXlNYXBbaW5kZXhdLmNfc3RyKCksICJjb20uYW5kcm9pZC5jYXB0dXJlLmZwcyIpKSB7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldEZsb2F0KGtLZXlDYXB0dXJlRnJhbWVyYXRlLCAqKGZsb2F0ICopJnZhbCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0RmxvYXQobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9DQVBUVVJFX1JBVEUsICooZmxvYXQgKikmdmFsKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgPT0gNjcgJiYgZGF0YVNpemUgPj0gNCkgewogICAgICAgICAvLyBCRSBzaWduZWQgaW50MzIKQEAgLTI4MjQsNyArMzUxMCw4IEBACiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgICAgIGlmICghc3RyY2FzZWNtcChtTWV0YUtleU1hcFtpbmRleF0uY19zdHIoKSwgImNvbS5hbmRyb2lkLnZpZGVvLnRlbXBvcmFsX2xheWVyc19jb3VudCIpKSB7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldEludDMyKGtLZXlUZW1wb3JhbExheWVyQ291bnQsIHZhbCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9DT1VOVCwgdmFsKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIGFkZCBtb3JlIGtleXMgaWYgbmVlZGVkCkBAIC0yODc4LDcgKzM1NjUsNyBAQAogICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKLSAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlUcmFja0lELCBpZCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQsIGlkKTsKIAogICAgIHNpemVfdCBtYXRyaXhPZmZzZXQgPSBkeW5TaXplICsgMTY7CiAgICAgaW50MzJfdCBhMDAgPSBVMzJfQVQoJmJ1ZmZlclttYXRyaXhPZmZzZXRdKTsKQEAgLTI5MTQsMTUgKzM2MDEsMTUgQEAKICAgICB9CiAKICAgICBpZiAocm90YXRpb25EZWdyZWVzICE9IDApIHsKLSAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Um90YXRpb24sIHJvdGF0aW9uRGVncmVlcyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1JPVEFUSU9OLCByb3RhdGlvbkRlZ3JlZXMpOwogICAgIH0KIAogICAgIC8vIEhhbmRsZSBwcmVzZW50YXRpb24gZGlzcGxheSBzaXplLCB3aGljaCBjb3VsZCBiZSBkaWZmZXJlbnQKLSAgICAvLyBmcm9tIHRoZSBpbWFnZSBzaXplIGluZGljYXRlZCBieSBrS2V5V2lkdGggYW5kIGtLZXlIZWlnaHQuCisgICAgLy8gZnJvbSB0aGUgaW1hZ2Ugc2l6ZSBpbmRpY2F0ZWQgYnkgQU1FRElBRk9STUFUX0tFWV9XSURUSCBhbmQgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQuCiAgICAgdWludDMyX3Qgd2lkdGggPSBVMzJfQVQoJmJ1ZmZlcltkeW5TaXplICsgNTJdKTsKICAgICB1aW50MzJfdCBoZWlnaHQgPSBVMzJfQVQoJmJ1ZmZlcltkeW5TaXplICsgNTZdKTsKLSAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlEaXNwbGF5V2lkdGgsIHdpZHRoID4+IDE2KTsKLSAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlEaXNwbGF5SGVpZ2h0LCBoZWlnaHQgPj4gMTYpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfV0lEVEgsIHdpZHRoID4+IDE2KTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX0hFSUdIVCwgaGVpZ2h0ID4+IDE2KTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTI5NTAsNjggKzM2MzcsNjQgQEAKIAogICAgIHVpbnQzMl90IGZsYWdzID0gVTMyX0FUKGJ1ZmZlcik7CiAKLSAgICB1aW50MzJfdCBtZXRhZGF0YUtleSA9IDA7CisgICAgY29uc3QgY2hhciAqbWV0YWRhdGFLZXkgPSBudWxscHRyOwogICAgIGNoYXIgY2h1bmtbNV07CiAgICAgTWFrZUZvdXJDQ1N0cmluZyhtUGF0aFs0XSwgY2h1bmspOwogICAgIEFMT0dWKCJtZXRhOiAlcyBAICVsbGQiLCBjaHVuaywgKGxvbmcgbG9uZylvZmZzZXQpOwogICAgIHN3aXRjaCAoKGludDMyX3QpbVBhdGhbNF0pIHsKLSAgICAgICAgY2FzZSBGT1VSQ0MoMHhhOSwgJ2EnLCAnbCcsICdiJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJcMjUxYWxiIik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFsYnVtOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAiYWxidW0iOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoMHhhOSwgJ0EnLCAnUicsICdUJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJcMjUxQVJUIik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFydGlzdDsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gImFydGlzdCI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygnYScsICdBJywgJ1InLCAnVCcpOgorICAgICAgICBjYXNlIEZPVVJDQygiYUFSVCIpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlBbGJ1bUFydGlzdDsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gImFsYnVtYXJ0aXN0IjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKDB4YTksICdkJywgJ2EnLCAneScpOgorICAgICAgICBjYXNlIEZPVVJDQygiXDI1MWRheSIpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlZZWFyOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAieWVhciI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygweGE5LCAnbicsICdhJywgJ20nKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIlwyNTFuYW0iKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5VGl0bGU7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJ0aXRsZSI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygweGE5LCAndycsICdyJywgJ3QnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIlwyNTF3cnQiKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5V3JpdGVyOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAid3JpdGVyIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdjJywgJ28nLCAndicsICdyJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJjb3ZyIik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFsYnVtQXJ0OworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAiYWxidW1hcnQiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ2cnLCAnbicsICdyJywgJ2UnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImducmUiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIlwyNTFnZW4iKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5R2VucmU7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJnZW5yZSI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygweGE5LCAnZycsICdlJywgJ24nKToKLSAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5R2VucmU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygnYycsICdwJywgJ2knLCAnbCcpOgorICAgICAgICBjYXNlIEZPVVJDQygiY3BpbCIpOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoc2l6ZSA9PSA5ICYmIGZsYWdzID09IDIxKSB7CiAgICAgICAgICAgICAgICAgY2hhciB0bXBbMTZdOwogICAgICAgICAgICAgICAgIHNwcmludGYodG1wLCAiJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgKGludClidWZmZXJbc2l6ZSAtIDFdKTsKIAotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5Q29tcGlsYXRpb24sIHRtcCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX0NPTVBJTEFUSU9OLCB0bXApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAncicsICdrJywgJ24nKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInRya24iKToKICAgICAgICAgewogICAgICAgICAgICAgaWYgKHNpemUgPT0gMTYgJiYgZmxhZ3MgPT0gMCkgewogICAgICAgICAgICAgICAgIGNoYXIgdG1wWzE2XTsKQEAgLTMwMTksMTEgKzM3MDIsMTEgQEAKICAgICAgICAgICAgICAgICB1aW50MTZfdCogcFRvdGFsVHJhY2tzID0gKHVpbnQxNl90KikmYnVmZmVyWzEyXTsKICAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiVkLyVkIiwgbnRvaHMoKnBUcmFjayksIG50b2hzKCpwVG90YWxUcmFja3MpKTsKIAotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5Q0RUcmFja051bWJlciwgdG1wKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfQ0RUUkFDS05VTUJFUiwgdG1wKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdkJywgJ2knLCAncycsICdrJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJkaXNrIik6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICgoc2l6ZSA9PSAxNCB8fCBzaXplID09IDE2KSAmJiBmbGFncyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgY2hhciB0bXBbMTZdOwpAQCAtMzAzMSwyMSArMzcxNCwyMSBAQAogICAgICAgICAgICAgICAgIHVpbnQxNl90KiBwVG90YWxEaXNjcyA9ICh1aW50MTZfdCopJmJ1ZmZlclsxMl07CiAgICAgICAgICAgICAgICAgc3ByaW50Zih0bXAsICIlZC8lZCIsIG50b2hzKCpwRGlzYyksIG50b2hzKCpwVG90YWxEaXNjcykpOwogCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlEaXNjTnVtYmVyLCB0bXApOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9ESVNDTlVNQkVSLCB0bXApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJy0nLCAnLScsICctJywgJy0nKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIi0tLS0iKToKICAgICAgICAgewogICAgICAgICAgICAgYnVmZmVyW3NpemVdID0gJ1wwJzsKICAgICAgICAgICAgIHN3aXRjaCAobVBhdGhbNV0pIHsKLSAgICAgICAgICAgICAgICBjYXNlIEZPVVJDQygnbScsICdlJywgJ2EnLCAnbicpOgorICAgICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCJtZWFuIik6CiAgICAgICAgICAgICAgICAgICAgIG1MYXN0Q29tbWVudE1lYW4uc2V0VG8oKGNvbnN0IGNoYXIgKilidWZmZXIgKyA0KTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ24nLCAnYScsICdtJywgJ2UnKToKKyAgICAgICAgICAgICAgICBjYXNlIEZPVVJDQygibmFtZSIpOgogICAgICAgICAgICAgICAgICAgICBtTGFzdENvbW1lbnROYW1lLnNldFRvKChjb25zdCBjaGFyICopYnVmZmVyICsgNCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRk9VUkNDKCdkJywgJ2EnLCAndCcsICdhJyk6CisgICAgICAgICAgICAgICAgY2FzZSBGT1VSQ0MoImRhdGEiKToKICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPCA4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVbXSBidWZmZXI7CiAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwpAQCAtMzA3NSw4ICszNzU4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlckRlbGF5LCBkZWxheSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlFbmNvZGVyUGFkZGluZywgcGFkZGluZyk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX0RFTEFZLCBkZWxheSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX1BBRERJTkcsIHBhZGRpbmcpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCkBAIC0zMDkxLDEyICszNzc2LDE2IEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBpZiAoc2l6ZSA+PSA4ICYmIG1ldGFkYXRhS2V5ICYmICFtRmlsZU1ldGFEYXRhLmhhc0RhdGEobWV0YWRhdGFLZXkpKSB7Ci0gICAgICAgIGlmIChtZXRhZGF0YUtleSA9PSBrS2V5QWxidW1BcnQpIHsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleUFsYnVtQXJ0LCBNZXRhRGF0YTo6VFlQRV9OT05FLAorICAgIHZvaWQgKnRtcERhdGE7CisgICAgc2l6ZV90IHRtcERhdGFTaXplOworICAgIGNvbnN0IGNoYXIgKnM7CisgICAgaWYgKHNpemUgPj0gOCAmJiBtZXRhZGF0YUtleSAmJgorICAgICAgICAgICAgIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIobUZpbGVNZXRhRGF0YSwgbWV0YWRhdGFLZXksICZ0bXBEYXRhLCAmdG1wRGF0YVNpemUpICYmCisgICAgICAgICAgICAhQU1lZGlhRm9ybWF0X2dldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBtZXRhZGF0YUtleSwgJnMpKSB7CisgICAgICAgIGlmICghc3RyY21wKG1ldGFkYXRhS2V5LCAiYWxidW1hcnQiKSkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtRmlsZU1ldGFEYXRhLCBtZXRhZGF0YUtleSwKICAgICAgICAgICAgICAgICAgICAgYnVmZmVyICsgOCwgc2l6ZSAtIDgpOwotICAgICAgICB9IGVsc2UgaWYgKG1ldGFkYXRhS2V5ID09IGtLZXlHZW5yZSkgeworICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobWV0YWRhdGFLZXksICJnZW5yZSIpKSB7CiAgICAgICAgICAgICBpZiAoZmxhZ3MgPT0gMCkgewogICAgICAgICAgICAgICAgIC8vIHVpbnQ4X3QgZ2VucmUgY29kZSwgaVR1bmVzIGdlbnJlIGNvZGVzIGFyZQogICAgICAgICAgICAgICAgIC8vIHRoZSBzdGFuZGFyZCBpZDMgY29kZXMsIGV4Y2VwdCB0aGV5IHN0YXJ0CkBAIC0zMTEwLDE4ICszNzk5LDE4IEBACiAgICAgICAgICAgICAgICAgY2hhciBnZW5yZVsxMF07CiAgICAgICAgICAgICAgICAgc3ByaW50ZihnZW5yZSwgIiVkIiwgZ2VucmVjb2RlKTsKIAotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhtZXRhZGF0YUtleSwgZ2VucmUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgbWV0YWRhdGFLZXksIGdlbnJlKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgPT0gMSkgewogICAgICAgICAgICAgICAgIC8vIGN1c3RvbSBnZW5yZSBzdHJpbmcKICAgICAgICAgICAgICAgICBidWZmZXJbc2l6ZV0gPSAnXDAnOwogCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKAorICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgCiAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YUtleSwgKGNvbnN0IGNoYXIgKilidWZmZXIgKyA4KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGJ1ZmZlcltzaXplXSA9ICdcMCc7CiAKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZygKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgCiAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhS2V5LCAoY29uc3QgY2hhciAqKWJ1ZmZlciArIDgpOwogICAgICAgICB9CiAgICAgfQpAQCAtMzE0OSwyMyArMzgzOCwzMyBAQAogICAgIH0KIAogICAgIGludDMyX3QgdHlwZSA9IFUzMl9BVCgmYnVmZmVyWzBdKTsKLSAgICBpZiAoKHR5cGUgPT0gRk9VUkNDKCduJywgJ2MnLCAnbCcsICd4JykgJiYgc2l6ZSA+PSAxMSkKLSAgICAgICAgICAgIHx8ICh0eXBlID09IEZPVVJDQygnbicsICdjJywgJ2wnLCAnYycpICYmIHNpemUgPj0gMTApKSB7Ci0gICAgICAgIGludDMyX3QgcHJpbWFyaWVzID0gVTE2X0FUKCZidWZmZXJbNF0pOwotICAgICAgICBpbnQzMl90IHRyYW5zZmVyID0gVTE2X0FUKCZidWZmZXJbNl0pOwotICAgICAgICBpbnQzMl90IGNvZWZmcyA9IFUxNl9BVCgmYnVmZmVyWzhdKTsKLSAgICAgICAgYm9vbCBmdWxsUmFuZ2UgPSAodHlwZSA9PSBGT1VSQ0MoJ24nLCAnYycsICdsJywgJ3gnKSkgJiYgKGJ1ZmZlclsxMF0gJiAxMjgpOwotCi0gICAgICAgIENvbG9yQXNwZWN0cyBhc3BlY3RzOwotICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMoCi0gICAgICAgICAgICAgICAgcHJpbWFyaWVzLCB0cmFuc2ZlciwgY29lZmZzLCBmdWxsUmFuZ2UsIGFzcGVjdHMpOwotCisgICAgaWYgKCh0eXBlID09IEZPVVJDQygibmNseCIpICYmIHNpemUgPj0gMTEpCisgICAgICAgICAgICB8fCAodHlwZSA9PSBGT1VSQ0MoIm5jbGMiKSAmJiBzaXplID49IDEwKSkgewogICAgICAgICAvLyBvbmx5IHN0b3JlIHRoZSBmaXJzdCBjb2xvciBzcGVjaWZpY2F0aW9uCi0gICAgICAgIGlmICghbUxhc3RUcmFjay0+bWV0YS5oYXNEYXRhKGtLZXlDb2xvclByaW1hcmllcykpIHsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNvbG9yUHJpbWFyaWVzLCBhc3BlY3RzLm1QcmltYXJpZXMpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5VHJhbnNmZXJGdW5jdGlvbiwgYXNwZWN0cy5tVHJhbnNmZXIpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q29sb3JNYXRyaXgsIGFzcGVjdHMubU1hdHJpeENvZWZmcyk7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDb2xvclJhbmdlLCBhc3BlY3RzLm1SYW5nZSk7CisgICAgICAgIGludDMyX3QgZXhpc3RpbmdDb2xvcjsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1JBTkdFLCAmZXhpc3RpbmdDb2xvcikpIHsKKyAgICAgICAgICAgIGludDMyX3QgcHJpbWFyaWVzID0gVTE2X0FUKCZidWZmZXJbNF0pOworICAgICAgICAgICAgaW50MzJfdCBpc290cmFuc2ZlciA9IFUxNl9BVCgmYnVmZmVyWzZdKTsKKyAgICAgICAgICAgIGludDMyX3QgY29lZmZzID0gVTE2X0FUKCZidWZmZXJbOF0pOworICAgICAgICAgICAgYm9vbCBmdWxsUmFuZ2UgPSAodHlwZSA9PSBGT1VSQ0MoIm5jbHgiKSkgJiYgKGJ1ZmZlclsxMF0gJiAxMjgpOworCisgICAgICAgICAgICBpbnQzMl90IHJhbmdlID0gMDsKKyAgICAgICAgICAgIGludDMyX3Qgc3RhbmRhcmQgPSAwOworICAgICAgICAgICAgaW50MzJfdCB0cmFuc2ZlciA9IDA7CisgICAgICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9QbGF0Zm9ybUFzcGVjdHMoCisgICAgICAgICAgICAgICAgICAgIHByaW1hcmllcywgaXNvdHJhbnNmZXIsIGNvZWZmcywgZnVsbFJhbmdlLAorICAgICAgICAgICAgICAgICAgICAmcmFuZ2UsICZzdGFuZGFyZCwgJnRyYW5zZmVyKTsKKworICAgICAgICAgICAgaWYgKHJhbmdlICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9SQU5HRSwgcmFuZ2UpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YW5kYXJkICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9TVEFOREFSRCwgc3RhbmRhcmQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRyYW5zZmVyICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9UUkFOU0ZFUiwgdHJhbnNmZXIpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0zMTkyLDQxICszODkxLDQxIEBACiAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICB9CiAKLSAgICB1aW50MzJfdCBtZXRhZGF0YUtleSA9IDA7CisgICAgY29uc3QgY2hhciAqbWV0YWRhdGFLZXkgPSBudWxscHRyOwogICAgIHN3aXRjaCAobVBhdGhbZGVwdGhdKSB7Ci0gICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ2knLCAndCcsICdsJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJ0aXRsIik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleVRpdGxlOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAidGl0bGUiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgY2FzZSBGT1VSQ0MoJ3AnLCAnZScsICdyJywgJ2YnKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoInBlcmYiKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5QXJ0aXN0OworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAiYXJ0aXN0IjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ3UnLCAndCcsICdoJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJhdXRoIik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleVdyaXRlcjsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gIndyaXRlciI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygnZycsICduJywgJ3InLCAnZScpOgorICAgICAgICBjYXNlIEZPVVJDQygiZ25yZSIpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlHZW5yZTsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gImdlbnJlIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdhJywgJ2wnLCAnYicsICdtJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJhbGJtIik6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChidWZmZXJbc2l6ZSAtIDFdICE9ICdcMCcpIHsKICAgICAgICAgICAgICAgY2hhciB0bXBbNF07CiAgICAgICAgICAgICAgIHNwcmludGYodG1wLCAiJXUiLCBidWZmZXJbc2l6ZSAtIDFdKTsKIAotICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleUNEVHJhY2tOdW1iZXIsIHRtcCk7CisgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9DRFRSQUNLTlVNQkVSLCB0bXApOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlBbGJ1bTsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gImFsYnVtIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGNhc2UgRk9VUkNDKCd5JywgJ3InLCAncicsICdjJyk6CisgICAgICAgIGNhc2UgRk9VUkNDKCJ5cnJjIik6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChzaXplIDwgNikgewogICAgICAgICAgICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKQEAgLTMyNDEsNyArMzk0MCw3IEBACiAgICAgICAgICAgICBpZiAoeWVhciA8IDEwMDAwKSB7CiAgICAgICAgICAgICAgICAgc3ByaW50Zih0bXAsICIldSIsIHllYXIpOwogCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlZZWFyLCB0bXApOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9ZRUFSLCB0bXApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTMyNTAsNyArMzk0OSw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBpZiAobWV0YWRhdGFLZXkgPiAwKSB7CisgICAgaWYgKG1ldGFkYXRhS2V5KSB7CiAgICAgICAgIGJvb2wgaXNVVEY4ID0gdHJ1ZTsgLy8gQ29tbW9uIGNhc2UKICAgICAgICAgY2hhcjE2X3QgKmZyYW1lZGF0YSA9IE5VTEw7CiAgICAgICAgIGludCBsZW4xNiA9IDA7IC8vIE51bWJlciBvZiBVVEYtMTYgY2hhcmFjdGVycwpAQCAtMzI4NiwxMSArMzk4NSwxMSBAQAogCiAgICAgICAgIGlmIChpc1VURjgpIHsKICAgICAgICAgICAgIGJ1ZmZlcltzaXplXSA9IDA7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcobWV0YWRhdGFLZXksIChjb25zdCBjaGFyICopYnVmZmVyICsgNik7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIG1ldGFkYXRhS2V5LCAoY29uc3QgY2hhciAqKWJ1ZmZlciArIDYpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gQ29udmVydCBmcm9tIFVURi0xNiBzdHJpbmcgdG8gVVRGLTggc3RyaW5nLgogICAgICAgICAgICAgU3RyaW5nOCB0bXBVVEY4c3RyKGZyYW1lZGF0YSwgbGVuMTYpOwotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKG1ldGFkYXRhS2V5LCB0bXBVVEY4c3RyLnN0cmluZygpKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgbWV0YWRhdGFLZXksIHRtcFVURjhzdHIuc3RyaW5nKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zMzA1LDI3ICs0MDA0LDI4IEBACiAKICAgICBpZiAoaWQzLmlzVmFsaWQoKSkgewogICAgICAgICBzdHJ1Y3QgTWFwIHsKLSAgICAgICAgICAgIGludCBrZXk7CisgICAgICAgICAgICBjb25zdCBjaGFyICprZXk7CiAgICAgICAgICAgICBjb25zdCBjaGFyICp0YWcxOwogICAgICAgICAgICAgY29uc3QgY2hhciAqdGFnMjsKICAgICAgICAgfTsKICAgICAgICAgc3RhdGljIGNvbnN0IE1hcCBrTWFwW10gPSB7Ci0gICAgICAgICAgICB7IGtLZXlBbGJ1bSwgIlRBTEIiLCAiVEFMIiB9LAotICAgICAgICAgICAgeyBrS2V5QXJ0aXN0LCAiVFBFMSIsICJUUDEiIH0sCi0gICAgICAgICAgICB7IGtLZXlBbGJ1bUFydGlzdCwgIlRQRTIiLCAiVFAyIiB9LAotICAgICAgICAgICAgeyBrS2V5Q29tcG9zZXIsICJUQ09NIiwgIlRDTSIgfSwKLSAgICAgICAgICAgIHsga0tleUdlbnJlLCAiVENPTiIsICJUQ08iIH0sCi0gICAgICAgICAgICB7IGtLZXlUaXRsZSwgIlRJVDIiLCAiVFQyIiB9LAotICAgICAgICAgICAgeyBrS2V5WWVhciwgIlRZRSIsICJUWUVSIiB9LAotICAgICAgICAgICAgeyBrS2V5QXV0aG9yLCAiVFhUIiwgIlRFWFQiIH0sCi0gICAgICAgICAgICB7IGtLZXlDRFRyYWNrTnVtYmVyLCAiVFJLIiwgIlRSQ0siIH0sCi0gICAgICAgICAgICB7IGtLZXlEaXNjTnVtYmVyLCAiVFBBIiwgIlRQT1MiIH0sCi0gICAgICAgICAgICB7IGtLZXlDb21waWxhdGlvbiwgIlRDUCIsICJUQ01QIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0FMQlVNLCAiVEFMQiIsICJUQUwiIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQVJUSVNULCAiVFBFMSIsICJUUDEiIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlRJU1QsICJUUEUyIiwgIlRQMiIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9DT01QT1NFUiwgIlRDT00iLCAiVENNIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0dFTlJFLCAiVENPTiIsICJUQ08iIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfVElUTEUsICJUSVQyIiwgIlRUMiIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9ZRUFSLCAiVFlFIiwgIlRZRVIiIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQVVUSE9SLCAiVFhUIiwgIlRFWFQiIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQ0RUUkFDS05VTUJFUiwgIlRSSyIsICJUUkNLIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0RJU0NOVU1CRVIsICJUUEEiLCAiVFBPUyIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9DT01QSUxBVElPTiwgIlRDUCIsICJUQ01QIiB9LAogICAgICAgICB9OwogICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1NYXBFbnRyaWVzID0gc2l6ZW9mKGtNYXApIC8gc2l6ZW9mKGtNYXBbMF0pOwogCiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bU1hcEVudHJpZXM7ICsraSkgewotICAgICAgICAgICAgaWYgKCFtRmlsZU1ldGFEYXRhLmhhc0RhdGEoa01hcFtpXS5rZXkpKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpzczsKKyAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBrTWFwW2ldLmtleSwgJnNzKSkgewogICAgICAgICAgICAgICAgIElEMzo6SXRlcmF0b3IgKml0ID0gbmV3IElEMzo6SXRlcmF0b3IoaWQzLCBrTWFwW2ldLnRhZzEpOwogICAgICAgICAgICAgICAgIGlmIChpdC0+ZG9uZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpdDsKQEAgLTMzNDEsNyArNDA0MSw3IEBACiAgICAgICAgICAgICAgICAgaXQtPmdldFN0cmluZygmcyk7CiAgICAgICAgICAgICAgICAgZGVsZXRlIGl0OwogCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtNYXBbaV0ua2V5LCBzKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIGtNYXBbaV0ua2V5LCBzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0zMzUwLDEzICs0MDUwLDEyIEBACiAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEgPSBpZDMuZ2V0QWxidW1BcnQoJmRhdGFTaXplLCAmbWltZSk7CiAKICAgICAgICAgaWYgKGRhdGEpIHsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0RGF0YShrS2V5QWxidW1BcnQsIE1ldGFEYXRhOjpUWVBFX05PTkUsIGRhdGEsIGRhdGFTaXplKTsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5QWxidW1BcnRNSU1FLCBtaW1lLnN0cmluZygpKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCwgZGF0YSwgZGF0YVNpemUpOwogICAgICAgICB9CiAgICAgfQogfQogCi1NZWRpYVRyYWNrICpNUEVHNEV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpNUEVHNEV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CiAgICAgc3RhdHVzX3QgZXJyOwogICAgIGlmICgoZXJyID0gcmVhZE1ldGFEYXRhKCkpICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMzM3OSw3ICs0MDc4LDcgQEAKIAogICAgIFRyZXggKnRyZXggPSBOVUxMOwogICAgIGludDMyX3QgdHJhY2tJZDsKLSAgICBpZiAodHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlUcmFja0lELCAmdHJhY2tJZCkpIHsKKyAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDMyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCAmdHJhY2tJZCkpIHsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJleC5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgVHJleCAqdCA9ICZtVHJleC5lZGl0SXRlbUF0KGkpOwogICAgICAgICAgICAgaWYgKHQtPnRyYWNrX0lEID09ICh1aW50MzJfdCkgdHJhY2tJZCkgewpAQCAtMzM5NSwxNiArNDA5NCwxNSBAQAogICAgIEFMT0dWKCJnZXRUcmFjayBjYWxsZWQsIHBzc2g6ICV6dSIsIG1Qc3NoLnNpemUoKSk7CiAKICAgICBjb25zdCBjaGFyICptaW1lOwotICAgIGlmICghdHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpIHsKKyAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIHNwPEl0ZW1UYWJsZT4gaXRlbVRhYmxlOwogICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7Ci0gICAgICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgIHZvaWQgKmRhdGE7CiAgICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQywgJmRhdGEsICZzaXplKSkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KIApAQCAtMzQxNSwxMCArNDExMyw5IEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpCiAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpKSB7Ci0gICAgICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgIHZvaWQgKmRhdGE7CiAgICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0hFVkMsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKQEAgLTM0MzAsMTEgKzQxMjcsMjkgQEAKICAgICAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQykpIHsKICAgICAgICAgICAgIGl0ZW1UYWJsZSA9IG1JdGVtVGFibGU7CiAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSkpIHsKKyAgICAgICAgdm9pZCAqZGF0YTsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CisKKyAgICAgICAgaWYgKHNpemUgPCA1IHx8IHB0clswXSAhPSAweDgxKSB7ICAvLyBjb25maWd1cmF0aW9uVmVyc2lvbiA9PSAxCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0cmFjay0+aGFzX2Vsc3QgYW5kICFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikgYW5kIHRyYWNrLT5lbHN0X21lZGlhX3RpbWUgPiAwKSB7CisgICAgICAgIHRyYWNrLT5lbHN0U2hpZnRTdGFydFRpY2tzID0gdHJhY2stPmVsc3RfbWVkaWFfdGltZTsKKyAgICAgICAgQUxPR1YoInZpZGVvIHRyYWNrLT5lbHN0U2hpZnRTdGFydFRpY2tzIDolIiBQUkl1NjQsIHRyYWNrLT5lbHN0U2hpZnRTdGFydFRpY2tzKTsKICAgICB9CiAKICAgICBNUEVHNFNvdXJjZSAqc291cmNlID0gIG5ldyBNUEVHNFNvdXJjZSgKICAgICAgICAgICAgIHRyYWNrLT5tZXRhLCBtRGF0YVNvdXJjZSwgdHJhY2stPnRpbWVzY2FsZSwgdHJhY2stPnNhbXBsZVRhYmxlLAotICAgICAgICAgICAgbVNpZHhFbnRyaWVzLCB0cmV4LCBtTW9vZk9mZnNldCwgaXRlbVRhYmxlKTsKKyAgICAgICAgICAgIG1TaWR4RW50cmllcywgdHJleCwgbU1vb2ZPZmZzZXQsIGl0ZW1UYWJsZSwKKyAgICAgICAgICAgIHRyYWNrLT5lbHN0U2hpZnRTdGFydFRpY2tzKTsKICAgICBpZiAoc291cmNlLT5pbml0KCkgIT0gT0spIHsKICAgICAgICAgZGVsZXRlIHNvdXJjZTsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0zNDQ1LDI2ICs0MTYwLDI2IEBACiAvLyBzdGF0aWMKIHN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjp2ZXJpZnlUcmFjayhUcmFjayAqdHJhY2spIHsKICAgICBjb25zdCBjaGFyICptaW1lOwotICAgIENIRUNLKHRyYWNrLT5tZXRhLmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSk7CiAKLSAgICB1aW50MzJfdCB0eXBlOwotICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgdm9pZCAqZGF0YTsKICAgICBzaXplX3Qgc2l6ZTsKICAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSkgewotICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKQotICAgICAgICAgICAgICAgIHx8IHR5cGUgIT0ga1R5cGVBVkNDKSB7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDLCAmZGF0YSwgJnNpemUpKSB7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSkgewotICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKQotICAgICAgICAgICAgICAgICAgICB8fCB0eXBlICE9IGtUeXBlSFZDQykgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0hFVkMsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSkpIHsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCAmZGF0YSwgJnNpemUpKSB7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCkKICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKQogICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSkgewotICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLmZpbmREYXRhKGtLZXlFU0RTLCAmdHlwZSwgJmRhdGEsICZzaXplKQotICAgICAgICAgICAgICAgIHx8IHR5cGUgIT0ga1R5cGVFU0RTKSB7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9FU0RTLCAmZGF0YSwgJnNpemUpKSB7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgfQpAQCAtMzU0OSwxNiArNDI2NCwxNCBAQAogICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19RQ0VMUCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19RQ0VMUCk7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICBpZiAob2JqZWN0VHlwZUluZGljYXRpb24gID09IDB4NmIpIHsKLSAgICAgICAgLy8gVGhlIG1lZGlhIHN1YnR5cGUgaXMgTVAzIGF1ZGlvCi0gICAgICAgIC8vIE91ciBzb2Z0d2FyZSBNUDMgYXVkaW8gZGVjb2RlciBtYXkgbm90IGJlIGFibGUgdG8gaGFuZGxlCi0gICAgICAgIC8vIHBhY2tldGl6ZWQgTVAzIGF1ZGlvOyBmb3Igbm93LCBsZXRzIGp1c3QgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVECi0gICAgICAgIEFMT0dFKCJNUDMgdHJhY2sgaW4gTVA0LzNHUFAgZmlsZSBpcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICBpZiAob2JqZWN0VHlwZUluZGljYXRpb24gPT0gMHg2QiB8fCBvYmplY3RUeXBlSW5kaWNhdGlvbiA9PSAweDY5KSB7CisgICAgICAgIC8vIG1wMyBhdWRpbworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKKyAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAogICAgIGlmIChtTGFzdFRyYWNrICE9IE5VTEwpIHsKQEAgLTM1NjYsMTAgKzQyNzksMTIgQEAKICAgICAgICAgdWludDMyX3QgYXZnQml0cmF0ZSA9IDA7CiAgICAgICAgIGVzZHMuZ2V0Qml0UmF0ZSgmbWF4Qml0cmF0ZSwgJmF2Z0JpdHJhdGUpOwogICAgICAgICBpZiAobWF4Qml0cmF0ZSA+IDAgJiYgbWF4Qml0cmF0ZSA8IElOVDMyX01BWCkgewotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5TWF4Qml0UmF0ZSwgKGludDMyX3QpbWF4Qml0cmF0ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfQklUX1JBVEUsIChpbnQzMl90KW1heEJpdHJhdGUpOwogICAgICAgICB9CiAgICAgICAgIGlmIChhdmdCaXRyYXRlID4gMCAmJiBhdmdCaXRyYXRlIDwgSU5UMzJfTUFYKSB7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlCaXRSYXRlLCAoaW50MzJfdClhdmdCaXRyYXRlKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFLCAoaW50MzJfdClhdmdCaXRyYXRlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzU5Nyw2ICs0MzEyLDc3IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCisgICAgaWYgKG9iamVjdFR5cGVJbmRpY2F0aW9uID09IDB4ZGQpIHsKKyAgICAgICAgLy8gdm9yYmlzIGF1ZGlvCisgICAgICAgIGlmIChjc2RbMF0gIT0gMHgwMikgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNvZGVjSW5mbyBzdGFydHMgd2l0aCB0d28gbGVuZ3RocywgbGVuMSBhbmQgbGVuMiwgdGhhdCBhcmUKKyAgICAgICAgLy8gIlhpcGgtc3R5bGUtbGFjaW5nIGVuY29kZWQiLi4KKworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMTsKKyAgICAgICAgc2l6ZV90IGxlbjEgPSAwOworICAgICAgICB3aGlsZSAob2Zmc2V0IDwgY3NkX3NpemUgJiYgY3NkW29mZnNldF0gPT0gMHhmZikgeworICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3cobGVuMSwgMHhmZiwgJmxlbjEpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrb2Zmc2V0OworICAgICAgICB9CisgICAgICAgIGlmIChvZmZzZXQgPj0gY3NkX3NpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3cobGVuMSwgY3NkW29mZnNldF0sICZsZW4xKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICArK29mZnNldDsKKyAgICAgICAgaWYgKGxlbjEgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBsZW4yID0gMDsKKyAgICAgICAgd2hpbGUgKG9mZnNldCA8IGNzZF9zaXplICYmIGNzZFtvZmZzZXRdID09IDB4ZmYpIHsKKyAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fYWRkX292ZXJmbG93KGxlbjIsIDB4ZmYsICZsZW4yKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK29mZnNldDsKKyAgICAgICAgfQorICAgICAgICBpZiAob2Zmc2V0ID49IGNzZF9zaXplKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIGlmIChfX2J1aWx0aW5fYWRkX292ZXJmbG93KGxlbjIsIGNzZFtvZmZzZXRdLCAmbGVuMikpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgKytvZmZzZXQ7CisgICAgICAgIGlmIChsZW4yID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9mZnNldCA+PSBjc2Rfc2l6ZSB8fCBjc2Rbb2Zmc2V0XSAhPSAweDAxKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIC8vIGZvcm1lcmx5IGtLZXlWb3JiaXNJbmZvCisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCAmY3NkW29mZnNldF0sIGxlbjEpOworCisgICAgICAgIGlmIChfX2J1aWx0aW5fYWRkX292ZXJmbG93KG9mZnNldCwgbGVuMSwgJm9mZnNldCkgfHwKKyAgICAgICAgICAgICAgICBvZmZzZXQgPj0gY3NkX3NpemUgfHwgY3NkW29mZnNldF0gIT0gMHgwMykgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfX2J1aWx0aW5fYWRkX292ZXJmbG93KG9mZnNldCwgbGVuMiwgJm9mZnNldCkgfHwKKyAgICAgICAgICAgICAgICBvZmZzZXQgPj0gY3NkX3NpemUgfHwgY3NkW29mZnNldF0gIT0gMHgwNSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGZvcm1lcmx5IGtLZXlWb3JiaXNCb29rcworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMSwgJmNzZFtvZmZzZXRdLCBjc2Rfc2l6ZSAtIG9mZnNldCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUyk7CisKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKwogICAgIHN0YXRpYyB1aW50MzJfdCBrU2FtcGxpbmdSYXRlW10gPSB7CiAgICAgICAgIDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsIDI0MDAwLCAyMjA1MCwKICAgICAgICAgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMCwgNzM1MApAQCAtMzYxMyw3ICs0Mzk5LDcgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAogICAgIC8va2VlcCBBT1QgdHlwZQotICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUFBQ0FPVCwgb2JqZWN0VHlwZSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQUFDX1BST0ZJTEUsIG9iamVjdFR5cGUpOwogCiAgICAgdWludDMyX3QgZnJlcUluZGV4ID0gYnIuZ2V0Qml0cyg0KTsKIApAQCAtMzYzNCw3ICs0NDIwLDcgQEAKICAgICAgICAgc2FtcGxlUmF0ZSA9IGtTYW1wbGluZ1JhdGVbZnJlcUluZGV4XTsKICAgICB9CiAKLSAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfU0JSIHx8IG9iamVjdFR5cGUgPT0gQU9UX1BTKSB7Ly9TQlIgc3BlY2lmaWMgY29uZmlnIHBlciAxNDQ5Ni0zIHRhYmxlIDEuMTMKKyAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfU0JSIHx8IG9iamVjdFR5cGUgPT0gQU9UX1BTKSB7Ly9TQlIgc3BlY2lmaWMgY29uZmlnIHBlciAxNDQ5Ni0zIHRibCAxLjEzCiAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgdWludDMyX3QgZXh0RnJlcUluZGV4ID0gYnIuZ2V0Qml0cyg0KTsKICAgICAgICAgaW50MzJfdCBleHRTYW1wbGVSYXRlIF9fdW51c2VkOwpAQCAtMzY1MSw3ICs0NDM3LDcgQEAKICAgICAgICAgICAgIGV4dFNhbXBsZVJhdGUgPSBrU2FtcGxpbmdSYXRlW2V4dEZyZXFJbmRleF07CiAgICAgICAgIH0KICAgICAgICAgLy9UT0RPOiBzYXZlIHRoZSBleHRlbnNpb24gc2FtcGxpbmcgcmF0ZSB2YWx1ZSBpbiBtZXRhIGRhdGEgPT4KLSAgICAgICAgLy8gICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlFeHRTYW1wbGVSYXRlLCBleHRTYW1wbGVSYXRlKTsKKyAgICAgICAgLy8gICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwga0tleUV4dFNhbXBsZVJhdGUsIGV4dFNhbXBsZVJhdGUpOwogICAgIH0KIAogICAgIHN3aXRjaCAobnVtQ2hhbm5lbHMpIHsKQEAgLTM4MDQsMzkgKzQ1OTAsNTUgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAogICAgIGludDMyX3QgcHJldlNhbXBsZVJhdGU7Ci0gICAgQ0hFQ0sobUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZwcmV2U2FtcGxlUmF0ZSkpOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCAmcHJldlNhbXBsZVJhdGUpKTsKIAogICAgIGlmIChwcmV2U2FtcGxlUmF0ZSAhPSBzYW1wbGVSYXRlKSB7CiAgICAgICAgIEFMT0dWKCJtcGVnNCBhdWRpbyBzYW1wbGUgcmF0ZSBkaWZmZXJlbnQgZnJvbSBwcmV2aW91cyBzZXR0aW5nLiAiCiAgICAgICAgICAgICAgIndhczogJWQsIG5vdzogJWQiLCBwcmV2U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CiAgICAgfQogCi0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZVJhdGUpOwogCiAgICAgaW50MzJfdCBwcmV2Q2hhbm5lbENvdW50OwotICAgIENIRUNLKG1MYXN0VHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZwcmV2Q2hhbm5lbENvdW50KSk7CisgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsICZwcmV2Q2hhbm5lbENvdW50KSk7CiAKICAgICBpZiAocHJldkNoYW5uZWxDb3VudCAhPSBudW1DaGFubmVscykgewogICAgICAgICBBTE9HVigibXBlZzQgYXVkaW8gY2hhbm5lbCBjb3VudCBkaWZmZXJlbnQgZnJvbSBwcmV2aW91cyBzZXR0aW5nLiAiCiAgICAgICAgICAgICAgIndhczogJWQsIG5vdzogJWQiLCBwcmV2Q2hhbm5lbENvdW50LCBudW1DaGFubmVscyk7CiAgICAgfQogCi0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBudW1DaGFubmVscyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbnVtQ2hhbm5lbHMpOwogCiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIE1QRUc0RXh0cmFjdG9yOjphZGp1c3RSYXdEZWZhdWx0RnJhbWVTaXplKCkgeworICAgIGludDMyX3QgY2hhbkNvdW50ID0gMDsKKyAgICBpbnQzMl90IGJpdFdpZHRoID0gMDsKKyAgICBjb25zdCBjaGFyICptaW1lU3RyID0gTlVMTDsKKworICAgIGlmKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZVN0cikgJiYKKyAgICAgICAgIXN0cmNhc2VjbXAobWltZVN0ciwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSAmJgorICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCAmY2hhbkNvdW50KSAmJgorICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUsICZiaXRXaWR0aCkpIHsKKyAgICAgICAgLy8gc2FtcGxlc2l6ZSBpbiBzdHN6IG1heSBub3QgcmlnaHQgLCBzbyB1cGRhZGUgZGVmYXVsdCBzYW1wbGVzaXplCisgICAgICAgIG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5zZXRQcmVkaWN0U2FtcGxlU2l6ZShjaGFuQ291bnQgKiBiaXRXaWR0aCAvIDgpOworICAgIH0KK30KKwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogTVBFRzRTb3VyY2U6Ok1QRUc0U291cmNlKAotICAgICAgICBNZXRhRGF0YUJhc2UgJmZvcm1hdCwKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqZm9ybWF0LAorICAgICAgICBEYXRhU291cmNlSGVscGVyICpkYXRhU291cmNlLAogICAgICAgICBpbnQzMl90IHRpbWVTY2FsZSwKICAgICAgICAgY29uc3Qgc3A8U2FtcGxlVGFibGU+ICZzYW1wbGVUYWJsZSwKICAgICAgICAgVmVjdG9yPFNpZHhFbnRyeT4gJnNpZHgsCiAgICAgICAgIGNvbnN0IFRyZXggKnRyZXgsCiAgICAgICAgIG9mZjY0X3QgZmlyc3RNb29mT2Zmc2V0LAotICAgICAgICBjb25zdCBzcDxJdGVtVGFibGU+ICZpdGVtVGFibGUpCisgICAgICAgIGNvbnN0IHNwPEl0ZW1UYWJsZT4gJml0ZW1UYWJsZSwKKyAgICAgICAgdWludDY0X3QgZWxzdFNoaWZ0U3RhcnRUaWNrcykKICAgICA6IG1Gb3JtYXQoZm9ybWF0KSwKICAgICAgIG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAogICAgICAgbVRpbWVzY2FsZSh0aW1lU2NhbGUpLApAQCAtMzg1Nyw0NSArNDY1OSw1MCBAQAogICAgICAgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0cyhOVUxMKSwKICAgICAgIG1Jc0FWQyhmYWxzZSksCiAgICAgICBtSXNIRVZDKGZhbHNlKSwKKyAgICAgIG1Jc0FDNChmYWxzZSksCisgICAgICBtSXNQY20oZmFsc2UpLAogICAgICAgbU5BTExlbmd0aFNpemUoMCksCiAgICAgICBtU3RhcnRlZChmYWxzZSksCi0gICAgICBtR3JvdXAoTlVMTCksCiAgICAgICBtQnVmZmVyKE5VTEwpLAotICAgICAgbVdhbnRzTkFMRnJhZ21lbnRzKGZhbHNlKSwKICAgICAgIG1TcmNCdWZmZXIoTlVMTCksCiAgICAgICBtSXNIZWlmKGl0ZW1UYWJsZSAhPSBOVUxMKSwKLSAgICAgIG1JdGVtVGFibGUoaXRlbVRhYmxlKSB7CisgICAgICBtSXRlbVRhYmxlKGl0ZW1UYWJsZSksCisgICAgICBtRWxzdFNoaWZ0U3RhcnRUaWNrcyhlbHN0U2hpZnRTdGFydFRpY2tzKSB7CiAKICAgICBtZW1zZXQoJm1UcmFja0ZyYWdtZW50SGVhZGVySW5mbywgMCwgc2l6ZW9mKG1UcmFja0ZyYWdtZW50SGVhZGVySW5mbykpOwogCi0gICAgbUZvcm1hdC5maW5kSW50MzIoa0tleUNyeXB0b01vZGUsICZtQ3J5cHRvTW9kZSk7CisgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsCisgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCAmbUNyeXB0b01vZGUpOwogICAgIG1EZWZhdWx0SVZTaXplID0gMDsKLSAgICBtRm9ybWF0LmZpbmRJbnQzMihrS2V5Q3J5cHRvRGVmYXVsdElWU2l6ZSwgJm1EZWZhdWx0SVZTaXplKTsKLSAgICB1aW50MzJfdCBrZXl0eXBlOwotICAgIGNvbnN0IHZvaWQgKmtleTsKKyAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0RFRkFVTFRfSVZfU0laRSwgJm1EZWZhdWx0SVZTaXplKTsKKyAgICB2b2lkICprZXk7CiAgICAgc2l6ZV90IGtleXNpemU7Ci0gICAgaWYgKG1Gb3JtYXQuZmluZERhdGEoa0tleUNyeXB0b0tleSwgJmtleXR5cGUsICZrZXksICZrZXlzaXplKSkgeworICAgIGlmIChBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKG1Gb3JtYXQsCisgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksICZrZXksICZrZXlzaXplKSkgewogICAgICAgICBDSEVDSyhrZXlzaXplIDw9IDE2KTsKICAgICAgICAgbWVtc2V0KG1DcnlwdG9LZXksIDAsIDE2KTsKICAgICAgICAgbWVtY3B5KG1DcnlwdG9LZXksIGtleSwga2V5c2l6ZSk7CiAgICAgfQogCi0gICAgbUZvcm1hdC5maW5kSW50MzIoa0tleUVuY3J5cHRlZEJ5dGVCbG9jaywgJm1EZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKLSAgICBtRm9ybWF0LmZpbmRJbnQzMihrS2V5U2tpcEJ5dGVCbG9jaywgJm1EZWZhdWx0U2tpcEJ5dGVCbG9jayk7CisgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsCisgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfQllURV9CTE9DSywgJm1EZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKKyAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1NLSVBfQllURV9CTE9DSywgJm1EZWZhdWx0U2tpcEJ5dGVCbG9jayk7CiAKICAgICBjb25zdCBjaGFyICptaW1lOwotICAgIGJvb2wgc3VjY2VzcyA9IG1Gb3JtYXQuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CisgICAgYm9vbCBzdWNjZXNzID0gQU1lZGlhRm9ybWF0X2dldFN0cmluZyhtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKTsKICAgICBDSEVDSyhzdWNjZXNzKTsKIAogICAgIG1Jc0FWQyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CiAgICAgbUlzSEVWQyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpIHx8CiAgICAgICAgICAgICAgICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQyk7CisgICAgbUlzQUM0ID0gIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0KTsKIAogICAgIGlmIChtSXNBVkMpIHsKLSAgICAgICAgdWludDMyX3QgdHlwZTsKLSAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICAgICAgdm9pZCAqZGF0YTsKICAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgIENIRUNLKGZvcm1hdC5maW5kRGF0YShrS2V5QVZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpOworICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDLCAmZGF0YSwgJnNpemUpKTsKIAogICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CiAKQEAgLTM5MDUsMTAgKzQ3MTIsOSBAQAogICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgdG8gZW5jb2RlIHRoZSBsZW5ndGggb2YgYSBOQUwgdW5pdC4KICAgICAgICAgbU5BTExlbmd0aFNpemUgPSAxICsgKHB0cls0XSAmIDMpOwogICAgIH0gZWxzZSBpZiAobUlzSEVWQykgewotICAgICAgICB1aW50MzJfdCB0eXBlOwotICAgICAgICBjb25zdCB2b2lkICpkYXRhOworICAgICAgICB2b2lkICpkYXRhOwogICAgICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgICAgQ0hFQ0soZm9ybWF0LmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSk7CisgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRCdWZmZXIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NTRF9IRVZDLCAmZGF0YSwgJnNpemUpKTsKIAogICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CiAKQEAgLTM5MTgsMTYgKzQ3MjQsNjAgQEAKICAgICAgICAgbU5BTExlbmd0aFNpemUgPSAxICsgKHB0clsxNCArIDddICYgMyk7CiAgICAgfQogCi0gICAgQ0hFQ0soZm9ybWF0LmZpbmRJbnQzMihrS2V5VHJhY2tJRCwgJm1UcmFja0lkKSk7CisgICAgbUlzUGNtID0gIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKKyAgICBtSXNBdWRpbyA9ICFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNik7CisKKyAgICBpZiAobUlzUGNtKSB7CisgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMgPSAwOworICAgICAgICBpbnQzMl90IGJpdHNQZXJTYW1wbGUgPSAwOworICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUsICZiaXRzUGVyU2FtcGxlKSk7CisgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsICZudW1DaGFubmVscykpOworCisgICAgICAgIGludDMyX3QgYnl0ZXNQZXJTYW1wbGUgPSBiaXRzUGVyU2FtcGxlID4+IDM7CisgICAgICAgIGludDMyX3QgcGNtU2FtcGxlU2l6ZSA9IGJ5dGVzUGVyU2FtcGxlICogbnVtQ2hhbm5lbHM7CisKKyAgICAgICAgc2l6ZV90IG1heFNhbXBsZVNpemU7CisgICAgICAgIHN0YXR1c190IGVyciA9IG1TYW1wbGVUYWJsZS0+Z2V0TWF4U2FtcGxlU2l6ZSgmbWF4U2FtcGxlU2l6ZSk7CisgICAgICAgIGlmIChlcnIgIT0gT0sgfHwgbWF4U2FtcGxlU2l6ZSAhPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBjbVNhbXBsZVNpemUpCisgICAgICAgICAgICAgICB8fCBiaXRzUGVyU2FtcGxlICE9IDE2KSB7CisgICAgICAgICAgICAvLyBOb3Qgc3VwcG9ydGVkCisgICAgICAgICAgICBtSXNQY20gPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFLCBwY21TYW1wbGVTaXplICoga01heFBjbUZyYW1lU2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCAmbVRyYWNrSWQpKTsKIAogfQogCiBzdGF0dXNfdCBNUEVHNFNvdXJjZTo6aW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpOwogICAgIGlmIChtRmlyc3RNb29mT2Zmc2V0ICE9IDApIHsKICAgICAgICAgb2ZmNjRfdCBvZmZzZXQgPSBtRmlyc3RNb29mT2Zmc2V0OwotICAgICAgICByZXR1cm4gcGFyc2VDaHVuaygmb2Zmc2V0KTsKKyAgICAgICAgZXJyID0gcGFyc2VDaHVuaygmb2Zmc2V0KTsKKyAgICAgICAgaWYoZXJyID09IE9LICYmICFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikKKyAgICAgICAgICAgICYmICFtQ3VycmVudFNhbXBsZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAvLyBTdGFydCBvZmZzZXQgc2hvdWxkIGJlIGxlc3Mgb3IgZXF1YWwgdG8gY29tcG9zaXRpb24gdGltZSBvZiBmaXJzdCBzYW1wbGUuCisgICAgICAgICAgICAvLyBJU08gOiBzYW1wbGVfY29tcG9zaXRpb25fdGltZV9vZmZzZXQsIHZlcnNpb24gMCAodW5zaWduZWQpIGZvciBtYWpvciBicmFuZHMuCisgICAgICAgICAgICBtRWxzdFNoaWZ0U3RhcnRUaWNrcyA9IHN0ZDo6bWluKG1FbHN0U2hpZnRTdGFydFRpY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDY0X3QpKCptQ3VycmVudFNhbXBsZXMuYmVnaW4oKSkuY29tcG9zaXRpb25PZmZzZXQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQotICAgIHJldHVybiBPSzsKKworICAgIGlmICghc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUsIDYpKSB7CisgICAgICAgIHVpbnQ2NF90IGZpcnN0U2FtcGxlQ1RTID0gMDsKKyAgICAgICAgZXJyID0gbVNhbXBsZVRhYmxlLT5nZXRNZXRhRGF0YUZvclNhbXBsZSgwLCBOVUxMLCBOVUxMLCAmZmlyc3RTYW1wbGVDVFMpOworICAgICAgICAvLyBTdGFydCBvZmZzZXQgc2hvdWxkIGJlIGxlc3Mgb3IgZXF1YWwgdG8gY29tcG9zaXRpb24gdGltZSBvZiBmaXJzdCBzYW1wbGUuCisgICAgICAgIC8vIENvbXBvc2l0aW9uIHRpbWUgc3RhbXAgb2YgZmlyc3Qgc2FtcGxlIGNhbm5vdCBiZSBuZWdhdGl2ZS4KKyAgICAgICAgbUVsc3RTaGlmdFN0YXJ0VGlja3MgPSBzdGQ6Om1pbihtRWxzdFNoaWZ0U3RhcnRUaWNrcywgZmlyc3RTYW1wbGVDVFMpOworICAgIH0KKworICAgIHJldHVybiBlcnI7CiB9CiAKIE1QRUc0U291cmNlOjp+TVBFRzRTb3VyY2UoKSB7CkBAIC0zOTM4LDIxICs0Nzg4LDEzIEBACiAgICAgZnJlZShtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzKTsKIH0KIAotc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHNFNvdXJjZTo6c3RhcnQoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIENIRUNLKCFtU3RhcnRlZCk7CiAKLSAgICBpbnQzMl90IHZhbDsKLSAgICBpZiAocGFyYW1zICYmIHBhcmFtcy0+ZmluZEludDMyKGtLZXlXYW50c05BTEZyYWdtZW50cywgJnZhbCkKLSAgICAgICAgJiYgdmFsICE9IDApIHsKLSAgICAgICAgbVdhbnRzTkFMRnJhZ21lbnRzID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBtV2FudHNOQUxGcmFnbWVudHMgPSBmYWxzZTsKLSAgICB9Ci0KICAgICBpbnQzMl90IHRtcDsKLSAgICBDSEVDSyhtRm9ybWF0LmZpbmRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCAmdG1wKSk7CisgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsICZ0bXApKTsKICAgICBzaXplX3QgbWF4X3NpemUgPSB0bXA7CiAKICAgICAvLyBBIHNvbWV3aGF0IGFyYml0cmFyeSBsaW1pdCB0aGF0IHNob3VsZCBiZSBzdWZmaWNpZW50IGZvciA4ayB2aWRlbyBmcmFtZXMKQEAgLTM5NjAsMzIgKzQ4MDIsMzAgQEAKICAgICBjb25zdCBzaXplX3Qga01heEJ1ZmZlclNpemUgPSA2NCAqIDEwMjQgKiAxMDI0OwogICAgIGlmIChtYXhfc2l6ZSA+IGtNYXhCdWZmZXJTaXplKSB7CiAgICAgICAgIEFMT0dFKCJib2d1cyBtYXggaW5wdXQgc2l6ZTogJXp1ID4gJXp1IiwgbWF4X3NpemUsIGtNYXhCdWZmZXJTaXplKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogICAgIGlmIChtYXhfc2l6ZSA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCJ6ZXJvIG1heCBpbnB1dCBzaXplIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAogICAgIC8vIEFsbG93IHVwIHRvIGtNYXhCdWZmZXJzLCBidXQgbm90IGlmIHRoZSB0b3RhbCBleGNlZWRzIGtNYXhCdWZmZXJTaXplLgogICAgIGNvbnN0IHNpemVfdCBrSW5pdGlhbEJ1ZmZlcnMgPSAyOwogICAgIGNvbnN0IHNpemVfdCBrTWF4QnVmZmVycyA9IDg7CiAgICAgY29uc3Qgc2l6ZV90IHJlYWxNYXhCdWZmZXJzID0gbWluKGtNYXhCdWZmZXJTaXplIC8gbWF4X3NpemUsIGtNYXhCdWZmZXJzKTsKLSAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cChrSW5pdGlhbEJ1ZmZlcnMsIG1heF9zaXplLCByZWFsTWF4QnVmZmVycyk7CisgICAgbUJ1ZmZlckdyb3VwLT5pbml0KGtJbml0aWFsQnVmZmVycywgbWF4X3NpemUsIHJlYWxNYXhCdWZmZXJzKTsKICAgICBtU3JjQnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3RbbWF4X3NpemVdOwogICAgIGlmIChtU3JjQnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgLy8gZmlsZSBwcm9iYWJseSBzcGVjaWZpZWQgYSBiYWQgbWF4IHNpemUKLSAgICAgICAgZGVsZXRlIG1Hcm91cDsKLSAgICAgICAgbUdyb3VwID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1QRUc0U291cmNlOjpzdG9wKCkgeworbWVkaWFfc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnN0b3AoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIENIRUNLKG1TdGFydGVkKTsKQEAgLTM5OTgsMTMgKzQ4MzgsMTAgQEAKICAgICBkZWxldGVbXSBtU3JjQnVmZmVyOwogICAgIG1TcmNCdWZmZXIgPSBOVUxMOwogCi0gICAgZGVsZXRlIG1Hcm91cDsKLSAgICBtR3JvdXAgPSBOVUxMOwotCiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKICAgICBtQ3VycmVudFNhbXBsZUluZGV4ID0gMDsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiBzdGF0dXNfdCBNUEVHNFNvdXJjZTo6cGFyc2VDaHVuayhvZmY2NF90ICpvZmZzZXQpIHsKQEAgLTQwNDAsOCArNDg3Nyw4IEBACiAKICAgICBzd2l0Y2goY2h1bmtfdHlwZSkgewogCi0gICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ3InLCAnYScsICdmJyk6Ci0gICAgICAgIGNhc2UgRk9VUkNDKCdtJywgJ28nLCAnbycsICdmJyk6IHsKKyAgICAgICAgY2FzZSBGT1VSQ0MoInRyYWYiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIm1vb2YiKTogewogICAgICAgICAgICAgb2ZmNjRfdCBzdG9wX29mZnNldCA9ICpvZmZzZXQgKyBjaHVua19zaXplOwogICAgICAgICAgICAgKm9mZnNldCA9IGRhdGFfb2Zmc2V0OwogICAgICAgICAgICAgd2hpbGUgKCpvZmZzZXQgPCBzdG9wX29mZnNldCkgewpAQCAtNDA1MCw3ICs0ODg3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2h1bmtfdHlwZSA9PSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ2YnKSkgeworICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCJtb29mIikpIHsKICAgICAgICAgICAgICAgICAvLyAqb2Zmc2V0IHBvaW50cyB0byB0aGUgYm94IGZvbGxvd2luZyB0aGlzIG1vb2YuIEZpbmQgdGhlIG5leHQgbW9vZiBmcm9tIHRoZXJlLgogCiAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKQEAgLTQwNzksNyArNDkxNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCdtJywgJ28nLCAnbycsICdmJykpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCJtb29mIikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1OZXh0TW9vZk9mZnNldCA9ICpvZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaHVua19zaXplID09IDApIHsKQEAgLTQwOTEsNyArNDkyOCw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ2YnLCAnaCcsICdkJyk6IHsKKyAgICAgICAgY2FzZSBGT1VSQ0MoInRmaGQiKTogewogICAgICAgICAgICAgICAgIHN0YXR1c190IGVycjsKICAgICAgICAgICAgICAgICBpZiAoKGVyciA9IHBhcnNlVHJhY2tGcmFnbWVudEhlYWRlcihkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKSkgIT0gT0spIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTQxMDAsNyArNDkzNyw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygndCcsICdyJywgJ3UnLCAnbicpOiB7CisgICAgICAgIGNhc2UgRk9VUkNDKCJ0cnVuIik6IHsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CiAgICAgICAgICAgICAgICAgaWYgKG1MYXN0UGFyc2VkVHJhY2tJZCA9PSBtVHJhY2tJZCkgewogICAgICAgICAgICAgICAgICAgICBpZiAoKGVyciA9IHBhcnNlVHJhY2tGcmFnbWVudFJ1bihkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKSkgIT0gT0spIHsKQEAgLTQxMTIsNyArNDk0OSw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygncycsICdhJywgJ2knLCAneicpOiB7CisgICAgICAgIGNhc2UgRk9VUkNDKCJzYWl6Iik6IHsKICAgICAgICAgICAgIHN0YXR1c190IGVycjsKICAgICAgICAgICAgIGlmICgoZXJyID0gcGFyc2VTYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvblNpemVzKGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpKSAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CkBAIC00MTIwLDE2ICs0OTU3LDE3IEBACiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBjYXNlIEZPVVJDQygncycsICdhJywgJ2knLCAnbycpOiB7CisgICAgICAgIGNhc2UgRk9VUkNDKCJzYWlvIik6IHsKICAgICAgICAgICAgIHN0YXR1c190IGVycjsKLSAgICAgICAgICAgIGlmICgoZXJyID0gcGFyc2VTYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvbk9mZnNldHMoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSkpICE9IE9LKSB7CisgICAgICAgICAgICBpZiAoKGVyciA9IHBhcnNlU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25PZmZzZXRzKGRhdGFfb2Zmc2V0LCBjaHVua19kYXRhX3NpemUpKQorICAgICAgICAgICAgICAgICAgICAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIGNhc2UgRk9VUkNDKCdzJywgJ2UnLCAnbicsICdjJyk6IHsKKyAgICAgICAgY2FzZSBGT1VSQ0MoInNlbmMiKTogewogICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwogICAgICAgICAgICAgaWYgKChlcnIgPSBwYXJzZVNhbXBsZUVuY3J5cHRpb24oZGF0YV9vZmZzZXQpKSAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CkBAIC00MTM4LDcgKzQ5NzYsNyBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBjYXNlIEZPVVJDQygnbScsICdkJywgJ2EnLCAndCcpOiB7CisgICAgICAgIGNhc2UgRk9VUkNDKCJtZGF0Iik6IHsKICAgICAgICAgICAgIC8vIHBhcnNlIERSTSBpbmZvIGlmIHByZXNlbnQKICAgICAgICAgICAgIEFMT0dWKCJNUEVHNFNvdXJjZTo6cGFyc2VDaHVuayBtZGF0Iik7CiAgICAgICAgICAgICAvLyBpZiBzYWl6L3Nhb2kgd2FzIHByZXZpb3VzbHkgb2JzZXJ2ZWQsIGRvIHNvbWV0aGluZyB3aXRoIHRoZSBzYW1wbGVpbmZvcwpAQCAtNDI1Myw3ICs1MDkxLDggQEAKICAgICBpZiAoZW50cnljb3VudCA+IG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHNBbGxvY1NpemUpIHsKICAgICAgICAgdWludDY0X3QgKm5ld1B0ciA9ICh1aW50NjRfdCAqKXJlYWxsb2MobUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0cywgZW50cnljb3VudCAqIDgpOwogICAgICAgICBpZiAobmV3UHRyID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gcmVhbGxvYyAldSAtPiAldSIsIG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHNBbGxvY1NpemUsIGVudHJ5Y291bnQgKiA4KTsKKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gcmVhbGxvYyAldSAtPiAldSIsCisgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHNBbGxvY1NpemUsIGVudHJ5Y291bnQgKiA4KTsKICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgICAgIH0KICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0cyA9IG5ld1B0cjsKQEAgLTQyOTIsMTAgKzUxMzEsMTMgQEAKICAgICByZXR1cm4gcGFyc2VDbGVhckVuY3J5cHRlZFNpemVzKGRybW9mZnNldCwgZmFsc2UsIDApOwogfQogCi1zdGF0dXNfdCBNUEVHNFNvdXJjZTo6cGFyc2VDbGVhckVuY3J5cHRlZFNpemVzKG9mZjY0X3Qgb2Zmc2V0LCBib29sIGlzU3Vic2FtcGxlRW5jcnlwdGlvbiwgdWludDMyX3QgZmxhZ3MpIHsKK3N0YXR1c190IE1QRUc0U291cmNlOjpwYXJzZUNsZWFyRW5jcnlwdGVkU2l6ZXMoCisgICAgICAgIG9mZjY0X3Qgb2Zmc2V0LCBib29sIGlzU3Vic2FtcGxlRW5jcnlwdGlvbiwgdWludDMyX3QgZmxhZ3MpIHsKIAotICAgIGludCBpdmxlbmd0aDsKLSAgICBDSEVDSyhtRm9ybWF0LmZpbmRJbnQzMihrS2V5Q3J5cHRvRGVmYXVsdElWU2l6ZSwgJml2bGVuZ3RoKSk7CisgICAgaW50MzJfdCBpdmxlbmd0aDsKKyAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19ERUZBVUxUX0lWX1NJWkUsICZpdmxlbmd0aCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CiAKICAgICAvLyBvbmx5IDAsIDggYW5kIDE2IGJ5dGUgaW5pdGlhbGl6YXRpb24gdmVjdG9ycyBhcmUgc3VwcG9ydGVkCiAgICAgaWYgKGl2bGVuZ3RoICE9IDAgJiYgaXZsZW5ndGggIT0gOCAmJiBpdmxlbmd0aCAhPSAxNikgewpAQCAtNDQ3OCw3ICs1MzIwLDcgQEAKIAogc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnBhcnNlVHJhY2tGcmFnbWVudFJ1bihvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBzaXplKSB7CiAKLSAgICBBTE9HVigiTVBFRzRFeHRyYWN0b3I6OnBhcnNlVHJhY2tGcmFnbWVudFJ1biIpOworICAgIEFMT0dWKCJNUEVHNFNvdXJjZTo6cGFyc2VUcmFja0ZyYWdtZW50UnVuIik7CiAgICAgaWYgKHNpemUgPCA4KSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KQEAgLTQ1ODUsOCArNTQyNywzMCBAQAogICAgICAgICBzYW1wbGVDdHNPZmZzZXQgPSAwOwogICAgIH0KIAotICAgIGlmIChzaXplIDwgKG9mZjY0X3QpKHNhbXBsZUNvdW50ICogYnl0ZXNQZXJTYW1wbGUpKSB7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOworICAgIGlmIChieXRlc1BlclNhbXBsZSAhPSAwKSB7CisgICAgICAgIGlmIChzaXplIDwgKG9mZjY0X3Qpc2FtcGxlQ291bnQgKiBieXRlc1BlclNhbXBsZSkgeworICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoc2FtcGxlRHVyYXRpb24gPT0gMCkgeworICAgICAgICAgICAgQUxPR1coImIvMTIzMzg5ODgxIHNhbXBsZUR1cmF0aW9uID09IDAiKTsKKyAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTI0Mzg5ODgxIHplcm8iKTsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisKKyAgICAgICAgLy8gYXBwbHkgc29tZSBzYW5pdHkgKHZzIHN0cmljdCBsZWdhbGl0eSkgY2hlY2tzCisgICAgICAgIC8vCisgICAgICAgIC8vIGNsYW1wIHRoZSBjb3VudCBvZiBlbnRyaWVzIGluIHRoZSB0cnVuIGJveCwgdG8gYXZvaWQgc3BlbmRpbmcgZm9yZXZlciBwYXJzaW5nCisgICAgICAgIC8vIHRoaXMgYm94LiBDbGFtcGluZyAodnMgZXJyb3IpIGxldHMgdXMgcGxheSAqc29tZXRoaW5nKi4KKyAgICAgICAgLy8gMSBtaWxsaW9uIGlzIGFib3V0IDQwMCBtc2VjcyBvbiBhIFBpeGVsMywgc2hvdWxkIGJlIG5vIG1vcmUgdGhhbiBhIGNvdXBsZSBzZWNvbmRzCisgICAgICAgIC8vIG9uIHRoZSBzbG93ZXN0IGRldmljZXMuCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3Qga01heFRydW5TYW1wbGVDb3VudCA9IDEwMDAwMDA7CisgICAgICAgIGlmIChzYW1wbGVDb3VudCA+IGtNYXhUcnVuU2FtcGxlQ291bnQpIHsKKyAgICAgICAgICAgIEFMT0dXKCJiLzEyMzM4OTg4MSBjbGFtcCBzYW1wbGVDb3VudCgldSkgQCBrTWF4VHJ1blNhbXBsZUNvdW50KCV1KSIsCisgICAgICAgICAgICAgICAgICBzYW1wbGVDb3VudCwga01heFRydW5TYW1wbGVDb3VudCk7CisgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjEyNDM4OTg4MSBjb3VudCIpOworCisgICAgICAgIH0KICAgICB9CiAKICAgICBTYW1wbGUgdG1wOwpAQCAtNDYyMCwxMCArNTQ4NCwxMCBAQAogICAgICAgICB9CiAKICAgICAgICAgQUxPR1YoImFkZGluZyBzYW1wbGUgJWQgYXQgb2Zmc2V0IDB4JTA4IiBQUkl4NjQgIiwgc2l6ZSAldSwgZHVyYXRpb24gJXUsICIKLSAgICAgICAgICAgICAgIiBmbGFncyAweCUwOHgiLCBpICsgMSwKKyAgICAgICAgICAgICAgIiBmbGFncyAweCUwOHggY3RzT2Zmc2V0ICUiIFBSSXUzMiwgaSArIDEsCiAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwgc2FtcGxlU2l6ZSwgc2FtcGxlRHVyYXRpb24sCiAgICAgICAgICAgICAgICAgKGZsYWdzICYga0ZpcnN0U2FtcGxlRmxhZ3NQcmVzZW50KSAmJiBpID09IDAKLSAgICAgICAgICAgICAgICAgICAgPyBmaXJzdFNhbXBsZUZsYWdzIDogc2FtcGxlRmxhZ3MpOworICAgICAgICAgICAgICAgICAgICA/IGZpcnN0U2FtcGxlRmxhZ3MgOiBzYW1wbGVGbGFncywgc2FtcGxlQ3RzT2Zmc2V0KTsKICAgICAgICAgdG1wLm9mZnNldCA9IGRhdGFPZmZzZXQ7CiAgICAgICAgIHRtcC5zaXplID0gc2FtcGxlU2l6ZTsKICAgICAgICAgdG1wLmR1cmF0aW9uID0gc2FtcGxlRHVyYXRpb247CkBAIC00NjM5LDEwICs1NTAzLDEwIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBNUEVHNFNvdXJjZTo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgeworbWVkaWFfc3RhdHVzX3QgTVBFRzRTb3VyY2U6OmdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIG1ldGEgPSBtRm9ybWF0OwotICAgIHJldHVybiBPSzsKKyAgICBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtRm9ybWF0KTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiBzaXplX3QgTVBFRzRTb3VyY2U6OnBhcnNlTkFMU2l6ZShjb25zdCB1aW50OF90ICpkYXRhKSBjb25zdCB7CkBAIC00NjY0LDE1ICs1NTI4LDQ2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXR1c190IE1QRUc0U291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CitpbnQzMl90IE1QRUc0U291cmNlOjpwYXJzZUhFVkNMYXllcklkKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKGRhdGEgPT0gbnVsbHB0ciB8fCBzaXplIDwgbU5BTExlbmd0aFNpemUgKyAyKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvLyBIRVZDIE5BTC1oZWFkZXIgKDE2LWJpdCkKKyAgICAvLyAgMSAgIDYgICAgICA2ICAgICAzCisgICAgLy8gfC18dXV1dXV1fC0tLS0tLXxpaWl8CisgICAgLy8gICAgICBeICAgICAgICAgICAgXgorICAgIC8vICBOQUxfdHlwZSAgICAgICAgbGF5ZXJfaWQgKyAxCisgICAgLy8KKyAgICAvLyBMYXllci1pZCBpcyBub24temVybyBvbmx5IGZvciBUZW1wb3JhbCBTdWItbGF5ZXIgQWNjZXNzIHBpY3R1cmVzIChUU0EpCisgICAgZW51bSB7CisgICAgICAgIFRTQV9OID0gMiwKKyAgICAgICAgVFNBX1IgPSAzLAorICAgICAgICBTVFNBX04gPSA0LAorICAgICAgICBTVFNBX1IgPSA1LAorICAgIH07CisKKyAgICBkYXRhICs9IG1OQUxMZW5ndGhTaXplOworICAgIHVpbnQxNl90IG5hbEhlYWRlciA9IGRhdGFbMF0gPDwgOCB8IGRhdGFbMV07CisKKyAgICB1aW50MTZfdCBuYWxUeXBlID0gKG5hbEhlYWRlciA+PiA5KSAmIDB4M0Z1OworICAgIGlmIChuYWxUeXBlID09IFRTQV9OIHx8IG5hbFR5cGUgPT0gVFNBX1IgfHwgbmFsVHlwZSA9PSBTVFNBX04gfHwgbmFsVHlwZSA9PSBTVFNBX1IpIHsKKyAgICAgICAgaW50MzJfdCBsYXllcklkUGx1c09uZSA9IG5hbEhlYWRlciAmIDB4N3U7CisgICAgICAgIEFMT0dEX0lGKGxheWVySWRQbHVzT25lID09IDAsICJnb3QgbGF5ZXJJZCAwIGZvciBUU0EgcGljdHVyZSIpOworICAgICAgICByZXR1cm4gbGF5ZXJJZFBsdXNPbmUgLSAxOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworbWVkaWFfc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBDSEVDSyhtU3RhcnRlZCk7CiAKLSAgICBpZiAob3B0aW9ucyAhPSBudWxscHRyICYmIG9wdGlvbnMtPmdldE5vbkJsb2NraW5nKCkgJiYgIW1Hcm91cC0+aGFzX2J1ZmZlcnMoKSkgeworICAgIGlmIChvcHRpb25zICE9IG51bGxwdHIgJiYgb3B0aW9ucy0+Z2V0Tm9uQmxvY2tpbmcoKSAmJiAhbUJ1ZmZlckdyb3VwLT5oYXNfYnVmZmVycygpKSB7CiAgICAgICAgICpvdXQgPSBudWxscHRyOwotICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfV09VTERfQkxPQ0s7CiAgICAgfQogCiAgICAgaWYgKG1GaXJzdE1vb2ZPZmZzZXQgPiAwKSB7CkBAIC00Njg2LDEyICs1NTgxLDEzIEBACiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwogICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwogICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CisKICAgICAgICAgaWYgKG1Jc0hlaWYpIHsKICAgICAgICAgICAgIENIRUNLKG1TYW1wbGVUYWJsZSA9PSBOVUxMKTsKICAgICAgICAgICAgIENIRUNLKG1JdGVtVGFibGUgIT0gTlVMTCk7CiAgICAgICAgICAgICBpbnQzMl90IGltYWdlSW5kZXg7Ci0gICAgICAgICAgICBpZiAoIW1Gb3JtYXQuZmluZEludDMyKGtLZXlUcmFja0lELCAmaW1hZ2VJbmRleCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9UUkFDS19JRCwgJmltYWdlSW5kZXgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHN0YXR1c190IGVycjsKQEAgLTQ3MDEsNyArNTU5Nyw3IEBACiAgICAgICAgICAgICAgICAgZXJyID0gbUl0ZW1UYWJsZS0+ZmluZFRodW1ibmFpbEl0ZW0oaW1hZ2VJbmRleCwgJm1DdXJyZW50U2FtcGxlSW5kZXgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdWludDMyX3QgZmluZEZsYWdzID0gMDsKQEAgLTQ3MjMsNiArNTYxOSw5IEBACiAgICAgICAgICAgICAgICAgICAgIENIRUNLKCEiU2hvdWxkIG5vdCBiZSBoZXJlLiIpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBtb2RlICE9IFJlYWRPcHRpb25zOjpTRUVLX0ZSQU1FX0lOREVYKSB7CisgICAgICAgICAgICAgICAgc2Vla1RpbWVVcyArPSAoKGxvbmcgZG91YmxlKW1FbHN0U2hpZnRTdGFydFRpY2tzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleDsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG1TYW1wbGVUYWJsZS0+ZmluZFNhbXBsZUF0VGltZSgKQEAgLTQ3MzcsMTMgKzU2MzYsMTYgQEAKICAgICAgICAgICAgICAgICBmaW5kRmxhZ3MgPSBTYW1wbGVUYWJsZTo6a0ZsYWdCZWZvcmU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHVpbnQzMl90IHN5bmNTYW1wbGVJbmRleDsKLSAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHN5bmNTYW1wbGVJbmRleCA9IHNhbXBsZUluZGV4OworICAgICAgICAgICAgLy8gYXNzdW1lIGV2ZXJ5IGF1ZGlvIHNhbXBsZSBpcyBhIHN5bmMgc2FtcGxlLiBUaGlzIHdvcmtzIGFyb3VuZAorICAgICAgICAgICAgLy8gc2VlayBpc3N1ZXMgd2l0aCBmaWxlcyB0aGF0IHdlcmUgaW5jb3JyZWN0bHkgd3JpdHRlbiB3aXRoIGFuCisgICAgICAgICAgICAvLyBlbXB0eSBvciBzaW5nbGUtc2FtcGxlIHN0c3MgYmxvY2sgZm9yIHRoZSBhdWRpbyB0cmFjaworICAgICAgICAgICAgaWYgKGVyciA9PSBPSyAmJiAhbUlzQXVkaW8pIHsKICAgICAgICAgICAgICAgICBlcnIgPSBtU2FtcGxlVGFibGUtPmZpbmRTeW5jU2FtcGxlTmVhcigKICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUluZGV4LCAmc3luY1NhbXBsZUluZGV4LCBmaW5kRmxhZ3MpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVUaW1lOworICAgICAgICAgICAgdWludDY0X3Qgc2FtcGxlVGltZTsKICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKICAgICAgICAgICAgICAgICBlcnIgPSBtU2FtcGxlVGFibGUtPmdldE1ldGFEYXRhRm9yU2FtcGxlKAogICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlSW5kZXgsIE5VTEwsIE5VTEwsICZzYW1wbGVUaW1lKTsKQEAgLTQ3NTYsMTQgKzU2NTgsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBhbGwgdGhlIHdheSB0byB0aGUgTWVkaWFQbGF5ZXIgd291bGQgY2F1c2UgYWJub3JtYWwKICAgICAgICAgICAgICAgICAgICAgLy8gdGVybWluYXRpb24uIExlZ2FjeSBiZWhhdmlvdXIgYXBwZWFycyB0byBiZSB0byBiZWhhdmUgYXMgaWYKICAgICAgICAgICAgICAgICAgICAgLy8gd2UgaGFkIHNlZWtlZCB0byB0aGUgZW5kIG9mIHN0cmVhbSwgZW5kaW5nIG5vcm1hbGx5LgotICAgICAgICAgICAgICAgICAgICBlcnIgPSBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIEFMT0dWKCJlbmQgb2Ygc3RyZWFtIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QKICAgICAgICAgICAgICAgICB8fCBtb2RlID09IFJlYWRPcHRpb25zOjpTRUVLX0ZSQU1FX0lOREVYKSB7CisgICAgICAgICAgICAgICAgc2FtcGxlVGltZSAtPSBtRWxzdFNoaWZ0U3RhcnRUaWNrczsKICAgICAgICAgICAgICAgICB0YXJnZXRTYW1wbGVUaW1lVXMgPSAoc2FtcGxlVGltZSAqIDEwMDAwMDBsbCkgLyBtVGltZXNjYWxlOwogICAgICAgICAgICAgfQogCkBAIC00NzkyLDcgKzU2OTUsNyBAQAogCiAgICAgb2ZmNjRfdCBvZmZzZXQgPSAwOwogICAgIHNpemVfdCBzaXplID0gMDsKLSAgICB1aW50MzJfdCBjdHMsIHN0dHM7CisgICAgdWludDY0X3QgY3RzLCBzdHRzOwogICAgIGJvb2wgaXNTeW5jU2FtcGxlOwogICAgIGJvb2wgbmV3QnVmZmVyID0gZmFsc2U7CiAgICAgaWYgKG1CdWZmZXIgPT0gTlVMTCkgewpAQCAtNDgwMiw2ICs1NzA1LDE0IEBACiAgICAgICAgIGlmICghbUlzSGVpZikgewogICAgICAgICAgICAgZXJyID0gbVNhbXBsZVRhYmxlLT5nZXRNZXRhRGF0YUZvclNhbXBsZSgKICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCwgJm9mZnNldCwgJnNpemUsICZjdHMsICZpc1N5bmNTYW1wbGUsICZzdHRzKTsKKyAgICAgICAgICAgIGlmKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgIC8qIENvbXBvc2l0aW9uIFRpbWUgU3RhbXAgY2Fubm90IGJlIG5lZ2F0aXZlLiBTb21lIGZpbGVzIGhhdmUgdmlkZW8gU2FtcGxlCisgICAgICAgICAgICAgICAgKiBUaW1lKFNUVFMpZGVsdGEgd2l0aCB6ZXJvIHZhbHVlKGIvMTE3NDAyNDIwKS4gIEhlbmNlIHN1YnRyYWN0IG9ubHkKKyAgICAgICAgICAgICAgICAqIG1pbihjdHMsIG1FbHN0U2hpZnRTdGFydFRpY2tzKSwgc28gdGhhdCBhdWRpbyB0cmFja3MgY2FuIGJlIHBsYXllZC4KKyAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGN0cyAtPSBzdGQ6Om1pbihjdHMsIG1FbHN0U2hpZnRTdGFydFRpY2tzKTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZXJyID0gbUl0ZW1UYWJsZS0+Z2V0SW1hZ2VPZmZzZXRBbmRTaXplKAogICAgICAgICAgICAgICAgICAgICBvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpID8KQEAgLTQ4MTMsMTkxICs1NzI0LDE1NiBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogCi0gICAgICAgIGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJm1CdWZmZXIpOworICAgICAgICBlcnIgPSBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZtQnVmZmVyKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBDSEVDSyhtQnVmZmVyID09IE5VTEwpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogICAgICAgICBpZiAoc2l6ZSA+IG1CdWZmZXItPnNpemUoKSkgewogICAgICAgICAgICAgQUxPR0UoImJ1ZmZlciB0b28gc21hbGw6ICV6dSA+ICV6dSIsIHNpemUsIG1CdWZmZXItPnNpemUoKSk7CiAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9CVUZGRVJfVE9PX1NNQUxMOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOyAvLyBFUlJPUl9CVUZGRVJfVE9PX1NNQUxMCiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoKCFtSXNBVkMgJiYgIW1Jc0hFVkMpIHx8IG1XYW50c05BTEZyYWdtZW50cykgeworICAgIGlmICghbUlzQVZDICYmICFtSXNIRVZDICYmICFtSXNBQzQpIHsKICAgICAgICAgaWYgKG5ld0J1ZmZlcikgewotICAgICAgICAgICAgc3NpemVfdCBudW1fYnl0ZXNfcmVhZCA9Ci0gICAgICAgICAgICAgICAgbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsICh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpLCBzaXplKTsKKyAgICAgICAgICAgIGlmIChtSXNQY20pIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgdHdvcycgUENNIGJsb2NrIHJlYWRlciBhc3N1bWVzIHRoYXQgYWxsIHNhbXBsZXMgaGFzIHRoZSBzYW1lIHNpemUuCiAKLSAgICAgICAgICAgIGlmIChudW1fYnl0ZXNfcmVhZCA8IChzc2l6ZV90KXNpemUpIHsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlc1RvUmVhZCA9IG1TYW1wbGVUYWJsZS0+Z2V0TGFzdFNhbXBsZUluZGV4SW5DaHVuaygpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1DdXJyZW50U2FtcGxlSW5kZXggKyAxOworICAgICAgICAgICAgICAgIGlmIChzYW1wbGVzVG9SZWFkID4ga01heFBjbUZyYW1lU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBzYW1wbGVzVG9SZWFkID0ga01heFBjbUZyYW1lU2l6ZTsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICAgICAgQUxPR1YoIlJlYWRpbmcgJWQgUENNIGZyYW1lcyBvZiBzaXplICV6dSBhdCBpbmRleCAlZCB0byBzdG9wIG9mIGNodW5rIGF0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzVG9SZWFkLCBzaXplLCBtQ3VycmVudFNhbXBsZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVUYWJsZS0+Z2V0TGFzdFNhbXBsZUluZGV4SW5DaHVuaygpKTsKKworICAgICAgICAgICAgICAgc2l6ZV90IHRvdGFsU2l6ZSA9IHNhbXBsZXNUb1JlYWQgKiBzaXplOworICAgICAgICAgICAgICAgIHVpbnQ4X3QqIGJ1ZiA9ICh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpOworICAgICAgICAgICAgICAgIHNzaXplX3QgYnl0ZXNSZWFkID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGJ1ZiwgdG90YWxTaXplKTsKKyAgICAgICAgICAgICAgICBpZiAoYnl0ZXNSZWFkIDwgKHNzaXplX3QpdG90YWxTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBtQnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfY2xlYXIobWV0YSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgKChsb25nIGRvdWJsZSljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOworCisgICAgICAgICAgICAgICAgaW50MzJfdCBieXRlT3JkZXI7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1BDTV9CSUdfRU5ESUFOLCAmYnl0ZU9yZGVyKTsKKworICAgICAgICAgICAgICAgIGlmIChieXRlT3JkZXIgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICAvLyBCaWctZW5kaWFuIC0+IGxpdHRsZS1lbmRpYW4KKyAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgKmRzdERhdGEgPSAodWludDE2X3QgKilidWY7CisgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpzcmNEYXRhID0gKHVpbnQxNl90ICopYnVmOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgYnl0ZXNSZWFkIC8gc2l6ZW9mKHVpbnQxNl90KTsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgZHN0RGF0YVtqXSA9IG50b2hzKHNyY0RhdGFbal0pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCArPSBzYW1wbGVzVG9SZWFkOworICAgICAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCB0b3RhbFNpemUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzc2l6ZV90IG51bV9ieXRlc19yZWFkID0KKyAgICAgICAgICAgICAgICAgICAgbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsICh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpLCBzaXplKTsKKworICAgICAgICAgICAgICAgIGlmIChudW1fYnl0ZXNfcmVhZCA8IChzc2l6ZV90KXNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IG1CdWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9jbGVhcihtZXRhKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsICgobG9uZyBkb3VibGUpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAoKGxvbmcgZG91YmxlKXN0dHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworCisgICAgICAgICAgICAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FLCB0YXJnZXRTYW1wbGVUaW1lVXMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChpc1N5bmNTYW1wbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CisgICAgICAgICAgICAgICAgfQorIAorICAgICAgICAgICAgICAgICsrbUN1cnJlbnRTYW1wbGVJbmRleDsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBzaXplKTsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLmNsZWFyKCk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAga0tleVRpbWUsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwotICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlEdXJhdGlvbiwgKChpbnQ2NF90KXN0dHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwotCi0gICAgICAgICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDApIHsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCB0YXJnZXRTYW1wbGVUaW1lVXMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaXNTeW5jU2FtcGxlKSB7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgKyttQ3VycmVudFNhbXBsZUluZGV4OwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFtSXNBVkMgJiYgIW1Jc0hFVkMpIHsKLSAgICAgICAgICAgICpvdXQgPSBtQnVmZmVyOwotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisgICAgICAgICpvdXQgPSBtQnVmZmVyOworICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAKLSAgICAgICAgLy8gRWFjaCBOQUwgdW5pdCBpcyBzcGxpdCB1cCBpbnRvIGl0cyBjb25zdGl0dWVudCBmcmFnbWVudHMgYW5kCi0gICAgICAgIC8vIGVhY2ggb25lIG9mIHRoZW0gcmV0dXJuZWQgaW4gaXRzIG93biBidWZmZXIuCi0KLSAgICAgICAgQ0hFQ0sobUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPj0gbU5BTExlbmd0aFNpemUpOwotCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9Ci0gICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSArIG1CdWZmZXItPnJhbmdlX29mZnNldCgpOwotCi0gICAgICAgIHNpemVfdCBuYWxfc2l6ZSA9IHBhcnNlTkFMU2l6ZShzcmMpOwotICAgICAgICBpZiAobU5BTExlbmd0aFNpemUgPiBTSVpFX01BWCAtIG5hbF9zaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiYi8yNDQ0MTU1MywgYi8yNDQ0NTEyMiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIG1OQUxMZW5ndGhTaXplIDwgbmFsX3NpemUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJpbmNvbXBsZXRlIE5BTCB1bml0LiIpOwotCi0gICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLQotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqY2xvbmUgPSBtQnVmZmVyLT5jbG9uZSgpOwotICAgICAgICBDSEVDSyhjbG9uZSAhPSBOVUxMKTsKLSAgICAgICAgY2xvbmUtPnNldF9yYW5nZShtQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIG1OQUxMZW5ndGhTaXplLCBuYWxfc2l6ZSk7Ci0KKyAgICB9IGVsc2UgaWYgKG1Jc0FDNCkgewogICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwotICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoCi0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkgKyBtTkFMTGVuZ3RoU2l6ZSArIG5hbF9zaXplLAotICAgICAgICAgICAgICAgIG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gbU5BTExlbmd0aFNpemUgLSBuYWxfc2l6ZSk7Ci0KLSAgICAgICAgaWYgKG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgKm91dCA9IGNsb25lOwotCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBXaG9sZSBOQUwgdW5pdHMgYXJlIHJldHVybmVkIGJ1dCBlYWNoIGZyYWdtZW50IGlzIHByZWZpeGVkIGJ5Ci0gICAgICAgIC8vIHRoZSBzdGFydCBjb2RlICgweDAwIDAwIDAwIDAxKS4KLSAgICAgICAgc3NpemVfdCBudW1fYnl0ZXNfcmVhZCA9IDA7Ci0gICAgICAgIGludDMyX3QgZHJtID0gMDsKLSAgICAgICAgYm9vbCB1c2VzRFJNID0gKG1Gb3JtYXQuZmluZEludDMyKGtLZXlJc0RSTSwgJmRybSkgJiYgZHJtICE9IDApOwotICAgICAgICBpZiAodXNlc0RSTSkgewotICAgICAgICAgICAgbnVtX2J5dGVzX3JlYWQgPQotICAgICAgICAgICAgICAgIG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCAodWludDhfdCopbUJ1ZmZlci0+ZGF0YSgpLCBzaXplKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG51bV9ieXRlc19yZWFkID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIG1TcmNCdWZmZXIsIHNpemUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG51bV9ieXRlc19yZWFkIDwgKHNzaXplX3Qpc2l6ZSkgeworICAgICAgICAvLyBNYWtlIHN1cmUgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIHRvIHdyaXRlIHRoZSBzeW5jIGhlYWRlciBhbmQgdGhlIHJhdyBmcmFtZQorICAgICAgICBpZiAobUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPCAoNyArIHNpemUpKSB7CiAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh1c2VzRFJNKSB7Ci0gICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwotICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUpOworICAgICAgICB1aW50OF90ICpkc3REYXRhID0gKHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCk7CisgICAgICAgIHNpemVfdCBkc3RPZmZzZXQgPSAwOworICAgICAgICAvLyBBZGQgQUMtNCBzeW5jIGhlYWRlciB0byBNUEVHNCBlbmNhcHN1bGF0ZWQgQUMtNCByYXcgZnJhbWUKKyAgICAgICAgLy8gQUM0MCBzeW5jIHdvcmQsIG1lYW5pbmcgbm8gQ1JDIGF0IHRoZSBlbmQgb2YgdGhlIGZyYW1lCisgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMHhBQzsKKyAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAweDQwOworICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDB4RkY7CisgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMHhGRjsKKyAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAodWludDhfdCkoKHNpemUgPj4gMTYpICYgMHhGRik7CisgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gKHVpbnQ4X3QpKChzaXplID4+IDgpICYgMHhGRik7CisgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gKHVpbnQ4X3QpKChzaXplID4+IDApICYgMHhGRik7CiAKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgKmRzdERhdGEgPSAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKTsKLSAgICAgICAgICAgIHNpemVfdCBzcmNPZmZzZXQgPSAwOwotICAgICAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7CisgICAgICAgIHNzaXplX3QgbnVtQnl0ZXNSZWFkID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGRzdERhdGEgKyBkc3RPZmZzZXQsIHNpemUpOworICAgICAgICBpZiAobnVtQnl0ZXNSZWFkICE9IChzc2l6ZV90KXNpemUpIHsKKyAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCi0gICAgICAgICAgICB3aGlsZSAoc3JjT2Zmc2V0IDwgc2l6ZSkgewotICAgICAgICAgICAgICAgIGJvb2wgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbU5BTExlbmd0aFNpemUpOwotICAgICAgICAgICAgICAgIHNpemVfdCBuYWxMZW5ndGggPSAwOwotICAgICAgICAgICAgICAgIGlmICghaXNNYWxGb3JtZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbmFsTGVuZ3RoID0gcGFyc2VOQUxTaXplKCZtU3JjQnVmZmVyW3NyY09mZnNldF0pOwotICAgICAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbU5BTExlbmd0aFNpemU7Ci0gICAgICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG5hbExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzTWFsRm9ybWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJWaWRlbyBpcyBtYWxmb3JtZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFsTGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGRzdE9mZnNldCA+IFNJWkVfTUFYIC0gNCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCA+IFNJWkVfTUFYIC0gbmFsTGVuZ3RoIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKyA0ICsgbmFsTGVuZ3RoID4gbUJ1ZmZlci0+c2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJiLzI3MjA4NjIxIDogJXp1ICV6dSIsIGRzdE9mZnNldCwgbUJ1ZmZlci0+c2l6ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzIwODYyMSIpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7Ci0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOwotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoJmRzdERhdGFbZHN0T2Zmc2V0XSwgJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSwgbmFsTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbmFsTGVuZ3RoOwotICAgICAgICAgICAgICAgIGRzdE9mZnNldCArPSBuYWxMZW5ndGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDSEVDS19FUShzcmNPZmZzZXQsIHNpemUpOwotICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBkc3RPZmZzZXQpOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgfQogCi0gICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLmNsZWFyKCk7Ci0gICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKLSAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoKGludDY0X3Qpc3R0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBkc3RPZmZzZXQgKyBzaXplKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gbUJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9jbGVhcihtZXRhKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgKChsb25nIGRvdWJsZSljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoCisgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgKChsb25nIGRvdWJsZSlzdHRzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKIAogICAgICAgICBpZiAodGFyZ2V0U2FtcGxlVGltZVVzID49IDApIHsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICBrS2V5VGFyZ2V0VGltZSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSXNBVkMpIHsKLSAgICAgICAgICAgIHVpbnQzMl90IGxheWVySWQgPSBGaW5kQVZDTGF5ZXJJZCgKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlUZW1wb3JhbExheWVySWQsIGxheWVySWQpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FLCB0YXJnZXRTYW1wbGVUaW1lVXMpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKGlzU3luY1NhbXBsZSkgewotICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogICAgICAgICB9CiAKICAgICAgICAgKyttQ3VycmVudFNhbXBsZUluZGV4OwpAQCAtNTAwNSwxMiArNTg4MSwxMDUgQEAKICAgICAgICAgKm91dCA9IG1CdWZmZXI7CiAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCi0gICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBXaG9sZSBOQUwgdW5pdHMgYXJlIHJldHVybmVkIGJ1dCBlYWNoIGZyYWdtZW50IGlzIHByZWZpeGVkIGJ5CisgICAgICAgIC8vIHRoZSBzdGFydCBjb2RlICgweDAwIDAwIDAwIDAxKS4KKyAgICAgICAgc3NpemVfdCBudW1fYnl0ZXNfcmVhZCA9IDA7CisgICAgICAgIG51bV9ieXRlc19yZWFkID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIG1TcmNCdWZmZXIsIHNpemUpOworCisgICAgICAgIGlmIChudW1fYnl0ZXNfcmVhZCA8IChzc2l6ZV90KXNpemUpIHsKKyAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworCisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOworICAgICAgICB9CisKKyAgICAgICAgdWludDhfdCAqZHN0RGF0YSA9ICh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpOworICAgICAgICBzaXplX3Qgc3JjT2Zmc2V0ID0gMDsKKyAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7CisKKyAgICAgICAgd2hpbGUgKHNyY09mZnNldCA8IHNpemUpIHsKKyAgICAgICAgICAgIGJvb2wgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbU5BTExlbmd0aFNpemUpOworICAgICAgICAgICAgc2l6ZV90IG5hbExlbmd0aCA9IDA7CisgICAgICAgICAgICBpZiAoIWlzTWFsRm9ybWVkKSB7CisgICAgICAgICAgICAgICAgbmFsTGVuZ3RoID0gcGFyc2VOQUxTaXplKCZtU3JjQnVmZmVyW3NyY09mZnNldF0pOworICAgICAgICAgICAgICAgIHNyY09mZnNldCArPSBtTkFMTGVuZ3RoU2l6ZTsKKyAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBuYWxMZW5ndGgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoaXNNYWxGb3JtZWQpIHsKKyAgICAgICAgICAgICAgICAvL2lmIG5hbGxlbmd0aCBhYm5vcm1hbCxpZ25vcmUgaXQuCisgICAgICAgICAgICAgICAgQUxPR1coImFibm9ybWFsIG5hbGxlbmd0aCwgaWdub3JlIHRoaXMgTkFMIik7CisgICAgICAgICAgICAgICAgc3JjT2Zmc2V0ID0gc2l6ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG5hbExlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkc3RPZmZzZXQgPiBTSVpFX01BWCAtIDQgfHwKKyAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCA+IFNJWkVfTUFYIC0gbmFsTGVuZ3RoIHx8CisgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCArIDQgKyBuYWxMZW5ndGggPiBtQnVmZmVyLT5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYi8yNzIwODYyMSA6ICV6dSAlenUiLCBkc3RPZmZzZXQsIG1CdWZmZXItPnNpemUoKSk7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNzIwODYyMSIpOworICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAxOworICAgICAgICAgICAgbWVtY3B5KCZkc3REYXRhW2RzdE9mZnNldF0sICZtU3JjQnVmZmVyW3NyY09mZnNldF0sIG5hbExlbmd0aCk7CisgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbmFsTGVuZ3RoOworICAgICAgICAgICAgZHN0T2Zmc2V0ICs9IG5hbExlbmd0aDsKKyAgICAgICAgfQorICAgICAgICBDSEVDS19FUShzcmNPZmZzZXQsIHNpemUpOworICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOworICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgZHN0T2Zmc2V0KTsKKworICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBtQnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1ldGEpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoCisgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCAoKGxvbmcgZG91YmxlKWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAoKGxvbmcgZG91YmxlKXN0dHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworCisgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FLCB0YXJnZXRTYW1wbGVUaW1lVXMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Jc0FWQykgeworICAgICAgICAgICAgdWludDMyX3QgbGF5ZXJJZCA9IEZpbmRBVkNMYXllcklkKAorICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfSUQsIGxheWVySWQpOworICAgICAgICB9IGVsc2UgaWYgKG1Jc0hFVkMpIHsKKyAgICAgICAgICAgIGludDMyX3QgbGF5ZXJJZCA9IHBhcnNlSEVWQ0xheWVySWQoCisgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgICAgICBpZiAobGF5ZXJJZCA+PSAwKSB7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfSUQsIGxheWVySWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGlzU3luY1NhbXBsZSkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CisgICAgICAgIH0KKworICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CisKKyAgICAgICAgKm91dCA9IG1CdWZmZXI7CisgICAgICAgIG1CdWZmZXIgPSBOVUxMOworCisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAgICAgfQogfQogCi1zdGF0dXNfdCBNUEVHNFNvdXJjZTo6ZnJhZ21lbnRlZFJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKK21lZGlhX3N0YXR1c190IE1QRUc0U291cmNlOjpmcmFnbWVudGVkUmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAKICAgICBBTE9HVigiTVBFRzRTb3VyY2U6OmZyYWdtZW50ZWRSZWFkIik7CiAKQEAgLTUwMjQsNiArNTk5MywxMCBAQAogICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwogICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJm1vZGUpKSB7CiAKKyAgICAgICAgc2Vla1RpbWVVcyArPSAoKGxvbmcgZG91YmxlKW1FbHN0U2hpZnRTdGFydFRpY2tzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlOworICAgICAgICBBTE9HVigic2hpZnRlZCBzZWVrVGltZVVzIDolIiBQUklkNjQgIiwgbUVsc3RTaGlmdFN0YXJ0VGlja3M6JSIgUFJJdTY0LCBzZWVrVGltZVVzLAorICAgICAgICAgICAgICBtRWxzdFNoaWZ0U3RhcnRUaWNrcyk7CisKICAgICAgICAgaW50IG51bVNpZHhFbnRyaWVzID0gbVNlZ21lbnRzLnNpemUoKTsKICAgICAgICAgaWYgKG51bVNpZHhFbnRyaWVzICE9IDApIHsKICAgICAgICAgICAgIGludDY0X3QgdG90YWxUaW1lID0gMDsKQEAgLTUwNTEsNyArNjAyNCw3IEBACiAgICAgICAgICAgICBtQ3VycmVudFNhbXBsZUluZGV4ID0gMDsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsoJnRvdGFsT2Zmc2V0KTsKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1DdXJyZW50VGltZSA9IHRvdGFsVGltZSAqIG1UaW1lc2NhbGUgLyAxMDAwMDAwbGw7CiAgICAgICAgIH0gZWxzZSB7CkBAIC01MDYzLDcgKzYwMzYsNyBAQAogICAgICAgICAgICAgb2ZmNjRfdCB0bXAgPSBtQ3VycmVudE1vb2ZPZmZzZXQ7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNodW5rKCZ0bXApOwogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUN1cnJlbnRUaW1lID0gMDsKICAgICAgICAgfQpAQCAtNTA3OCwxNiArNjA1MSwyMCBAQAogCiAgICAgb2ZmNjRfdCBvZmZzZXQgPSAwOwogICAgIHNpemVfdCBzaXplID0gMDsKLSAgICB1aW50MzJfdCBjdHMgPSAwOworICAgIHVpbnQ2NF90IGN0cyA9IDA7CiAgICAgYm9vbCBpc1N5bmNTYW1wbGUgPSBmYWxzZTsKICAgICBib29sIG5ld0J1ZmZlciA9IGZhbHNlOwotICAgIGlmIChtQnVmZmVyID09IE5VTEwpIHsKKyAgICBpZiAobUJ1ZmZlciA9PSBOVUxMIHx8IG1DdXJyZW50U2FtcGxlSW5kZXggPj0gbUN1cnJlbnRTYW1wbGVzLnNpemUoKSkgewogICAgICAgICBuZXdCdWZmZXIgPSB0cnVlOwogCisgICAgICAgIGlmIChtQnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICB9CiAgICAgICAgIGlmIChtQ3VycmVudFNhbXBsZUluZGV4ID49IG1DdXJyZW50U2FtcGxlcy5zaXplKCkpIHsKICAgICAgICAgICAgIC8vIG1vdmUgdG8gbmV4dCBmcmFnbWVudCBpZiB0aGVyZSBpcyBvbmUKICAgICAgICAgICAgIGlmIChtTmV4dE1vb2ZPZmZzZXQgPD0gbUN1cnJlbnRNb29mT2Zmc2V0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgb2ZmNjRfdCBuZXh0TW9vZiA9IG1OZXh0TW9vZk9mZnNldDsKICAgICAgICAgICAgIG1DdXJyZW50TW9vZk9mZnNldCA9IG5leHRNb29mOwpAQCAtNTA5NSwxMCArNjA3MiwxMCBAQAogICAgICAgICAgICAgbUN1cnJlbnRTYW1wbGVJbmRleCA9IDA7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUNodW5rKCZuZXh0TW9vZik7CiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobUN1cnJlbnRTYW1wbGVJbmRleCA+PSBtQ3VycmVudFNhbXBsZXMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTUxMDYsNTkgKzYwODMsNjUgQEAKICAgICAgICAgb2Zmc2V0ID0gc21wbC0+b2Zmc2V0OwogICAgICAgICBzaXplID0gc21wbC0+c2l6ZTsKICAgICAgICAgY3RzID0gbUN1cnJlbnRUaW1lICsgc21wbC0+Y29tcG9zaXRpb25PZmZzZXQ7Ci0gICAgICAgIG1DdXJyZW50VGltZSArPSBzbXBsLT5kdXJhdGlvbjsKLSAgICAgICAgaXNTeW5jU2FtcGxlID0gKG1DdXJyZW50U2FtcGxlSW5kZXggPT0gMCk7IC8vIFhYWAorICAgICAgICAvKiBDb21wb3NpdGlvbiBUaW1lIFN0YW1wIGNhbm5vdCBiZSBuZWdhdGl2ZS4gU29tZSBmaWxlcyBoYXZlIHZpZGVvIFNhbXBsZQorICAgICAgICAqIFRpbWUoU1RUUylkZWx0YSB3aXRoIHplcm8gdmFsdWUoYi8xMTc0MDI0MjApLiAgSGVuY2Ugc3VidHJhY3Qgb25seQorICAgICAgICAqIG1pbihjdHMsIG1FbHN0U2hpZnRTdGFydFRpY2tzKSwgc28gdGhhdCBhdWRpbyB0cmFja3MgY2FuIGJlIHBsYXllZC4KKyAgICAgICAgKi8KKyAgICAgICAgY3RzIC09IHN0ZDo6bWluKGN0cywgbUVsc3RTaGlmdFN0YXJ0VGlja3MpOwogCi0gICAgICAgIHN0YXR1c190IGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJm1CdWZmZXIpOworICAgICAgICBtQ3VycmVudFRpbWUgKz0gc21wbC0+ZHVyYXRpb247CisgICAgICAgIGlzU3luY1NhbXBsZSA9IChtQ3VycmVudFNhbXBsZUluZGV4ID09IDApOworCisgICAgICAgIHN0YXR1c190IGVyciA9IG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJm1CdWZmZXIpOwogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgPT0gTlVMTCk7CiAgICAgICAgICAgICBBTE9HVigiYWNxdWlyZV9idWZmZXIgcmV0dXJuZWQgJWQiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogICAgICAgICBpZiAoc2l6ZSA+IG1CdWZmZXItPnNpemUoKSkgewogICAgICAgICAgICAgQUxPR0UoImJ1ZmZlciB0b28gc21hbGw6ICV6dSA+ICV6dSIsIHNpemUsIG1CdWZmZXItPnNpemUoKSk7CiAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9CVUZGRVJfVE9PX1NNQUxMOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICB9CiAgICAgfQogCiAgICAgY29uc3QgU2FtcGxlICpzbXBsID0gJm1DdXJyZW50U2FtcGxlc1ttQ3VycmVudFNhbXBsZUluZGV4XTsKLSAgICBNZXRhRGF0YUJhc2UgJmJ1Zm1ldGEgPSBtQnVmZmVyLT5tZXRhX2RhdGEoKTsKLSAgICBidWZtZXRhLmNsZWFyKCk7CisgICAgQU1lZGlhRm9ybWF0ICpidWZtZXRhID0gbUJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0X2NsZWFyKGJ1Zm1ldGEpOwogICAgIGlmIChzbXBsLT5lbmNyeXB0ZWRzaXplcy5zaXplKCkpIHsKICAgICAgICAgLy8gc3RvcmUgY2xlYXIvZW5jcnlwdGVkIGxlbmd0aHMgaW4gbWV0YWRhdGEKLSAgICAgICAgYnVmbWV0YS5zZXREYXRhKGtLZXlQbGFpblNpemVzLCAwLAorICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1BMQUlOX1NJWkVTLAogICAgICAgICAgICAgICAgIHNtcGwtPmNsZWFyc2l6ZXMuYXJyYXkoKSwgc21wbC0+Y2xlYXJzaXplcy5zaXplKCkgKiA0KTsKLSAgICAgICAgYnVmbWV0YS5zZXREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgMCwKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfU0laRVMsCiAgICAgICAgICAgICAgICAgc21wbC0+ZW5jcnlwdGVkc2l6ZXMuYXJyYXkoKSwgc21wbC0+ZW5jcnlwdGVkc2l6ZXMuc2l6ZSgpICogNCk7Ci0gICAgICAgIGJ1Zm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b0RlZmF1bHRJVlNpemUsIG1EZWZhdWx0SVZTaXplKTsKLSAgICAgICAgYnVmbWV0YS5zZXRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgbUNyeXB0b01vZGUpOwotICAgICAgICBidWZtZXRhLnNldERhdGEoa0tleUNyeXB0b0tleSwgMCwgbUNyeXB0b0tleSwgMTYpOwotICAgICAgICBidWZtZXRhLnNldEludDMyKGtLZXlFbmNyeXB0ZWRCeXRlQmxvY2ssIG1EZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKLSAgICAgICAgYnVmbWV0YS5zZXRJbnQzMihrS2V5U2tpcEJ5dGVCbG9jaywgbURlZmF1bHRTa2lwQnl0ZUJsb2NrKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0RFRkFVTFRfSVZfU0laRSwgbURlZmF1bHRJVlNpemUpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fTU9ERSwgbUNyeXB0b01vZGUpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSwgbUNyeXB0b0tleSwgMTYpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoYnVmbWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfQllURV9CTE9DSywgbURlZmF1bHRFbmNyeXB0ZWRCeXRlQmxvY2spOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoYnVmbWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19TS0lQX0JZVEVfQkxPQ0ssIG1EZWZhdWx0U2tpcEJ5dGVCbG9jayk7CiAKLSAgICAgICAgdWludDMyX3QgdHlwZSA9IDA7Ci0gICAgICAgIGNvbnN0IHZvaWQgKml2ID0gTlVMTDsKKyAgICAgICAgdm9pZCAqaXYgPSBOVUxMOwogICAgICAgICBzaXplX3QgaXZsZW5ndGggPSAwOwotICAgICAgICBpZiAoIW1Gb3JtYXQuZmluZERhdGEoCi0gICAgICAgICAgICAgICAga0tleUNyeXB0b0lWLCAmdHlwZSwgJml2LCAmaXZsZW5ndGgpKSB7Ci0gICAgICAgICAgICBpdiA9IHNtcGwtPml2OworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIobUZvcm1hdCwKKyAgICAgICAgICAgICAgICAiY3J5cHRvLWl2IiwgJml2LCAmaXZsZW5ndGgpKSB7CisgICAgICAgICAgICBpdiA9ICh2b2lkICopIHNtcGwtPml2OwogICAgICAgICAgICAgaXZsZW5ndGggPSAxNjsgLy8gdXNlIDE2IG9yIHRoZSBhY3R1YWwgc2l6ZT8KICAgICAgICAgfQotICAgICAgICBidWZtZXRhLnNldERhdGEoa0tleUNyeXB0b0lWLCAwLCBpdiwgaXZsZW5ndGgpOwotCisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fSVYsIGl2LCBpdmxlbmd0aCk7CiAgICAgfQogCi0gICAgaWYgKCghbUlzQVZDICYmICFtSXNIRVZDKXx8IG1XYW50c05BTEZyYWdtZW50cykgeworICAgIGlmICghbUlzQVZDICYmICFtSXNIRVZDKSB7CiAgICAgICAgIGlmIChuZXdCdWZmZXIpIHsKICAgICAgICAgICAgIGlmICghaXNJblJhbmdlKChzaXplX3QpMHUsIG1CdWZmZXItPnNpemUoKSwgc2l6ZSkpIHsKICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKICAgICAgICAgICAgICAgICBBTE9HRSgiZnJhZ21lbnRlZFJlYWQgRVJST1JfTUFMRk9STUVEIHNpemUgJXp1Iiwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3NpemVfdCBudW1fYnl0ZXNfcmVhZCA9CkBAIC01MTY5LDEwMyArNjE1Miw1NyBAQAogICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCiAgICAgICAgICAgICAgICAgQUxPR0UoImkvbyBlcnJvciIpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwogICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUpOwotICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICgoaW50NjRfdClzbXBsLT5kdXJhdGlvbiAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmbWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCAoKGxvbmcgZG91YmxlKWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmbWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgKChsb25nIGRvdWJsZSlzbXBsLT5kdXJhdGlvbiAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CiAKICAgICAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgewotICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgICAgICAgICAga0tleVRhcmdldFRpbWUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtSXNBVkMpIHsKICAgICAgICAgICAgICAgICB1aW50MzJfdCBsYXllcklkID0gRmluZEFWQ0xheWVySWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlUZW1wb3JhbExheWVySWQsIGxheWVySWQpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0lELCBsYXllcklkKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobUlzSEVWQykgeworICAgICAgICAgICAgICAgIGludDMyX3QgbGF5ZXJJZCA9IHBhcnNlSEVWQ0xheWVySWQoCisgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIGlmIChsYXllcklkID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfSUQsIGxheWVySWQpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKGlzU3luY1NhbXBsZSkgewotICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICsrbUN1cnJlbnRTYW1wbGVJbmRleDsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghbUlzQVZDICYmICFtSXNIRVZDKSB7Ci0gICAgICAgICAgICAqb3V0ID0gbUJ1ZmZlcjsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICAqb3V0ID0gbUJ1ZmZlcjsKKyAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQorICAgICAgICByZXR1cm4gQU1FRElBX09LOwogCi0gICAgICAgIC8vIEVhY2ggTkFMIHVuaXQgaXMgc3BsaXQgdXAgaW50byBpdHMgY29uc3RpdHVlbnQgZnJhZ21lbnRzIGFuZAotICAgICAgICAvLyBlYWNoIG9uZSBvZiB0aGVtIHJldHVybmVkIGluIGl0cyBvd24gYnVmZmVyLgotCi0gICAgICAgIENIRUNLKG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpID49IG1OQUxMZW5ndGhTaXplKTsKLQotICAgICAgICBjb25zdCB1aW50OF90ICpzcmMgPQotICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCkgKyBtQnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKLQotICAgICAgICBzaXplX3QgbmFsX3NpemUgPSBwYXJzZU5BTFNpemUoc3JjKTsKLSAgICAgICAgaWYgKG1OQUxMZW5ndGhTaXplID4gU0laRV9NQVggLSBuYWxfc2l6ZSkgewotICAgICAgICAgICAgQUxPR0UoImIvMjQ0NDE1NTMsIGIvMjQ0NDUxMjIiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIG1OQUxMZW5ndGhTaXplIDwgbmFsX3NpemUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJpbmNvbXBsZXRlIE5BTCB1bml0LiIpOwotCi0gICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLQotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgfQotCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqY2xvbmUgPSBtQnVmZmVyLT5jbG9uZSgpOwotICAgICAgICBDSEVDSyhjbG9uZSAhPSBOVUxMKTsKLSAgICAgICAgY2xvbmUtPnNldF9yYW5nZShtQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIG1OQUxMZW5ndGhTaXplLCBuYWxfc2l6ZSk7Ci0KLSAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKAotICAgICAgICAgICAgICAgIG1CdWZmZXItPnJhbmdlX29mZnNldCgpICsgbU5BTExlbmd0aFNpemUgKyBuYWxfc2l6ZSwKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIG1OQUxMZW5ndGhTaXplIC0gbmFsX3NpemUpOwotCi0gICAgICAgIGlmIChtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgICpvdXQgPSBjbG9uZTsKLQotICAgICAgICByZXR1cm4gT0s7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1YoIndob2xlIE5BTCIpOwogICAgICAgICAvLyBXaG9sZSBOQUwgdW5pdHMgYXJlIHJldHVybmVkIGJ1dCBlYWNoIGZyYWdtZW50IGlzIHByZWZpeGVkIGJ5CiAgICAgICAgIC8vIHRoZSBzdGFydCBjb2RlICgweDAwIDAwIDAwIDAxKS4KICAgICAgICAgc3NpemVfdCBudW1fYnl0ZXNfcmVhZCA9IDA7Ci0gICAgICAgIGludDMyX3QgZHJtID0gMDsKLSAgICAgICAgYm9vbCB1c2VzRFJNID0gKG1Gb3JtYXQuZmluZEludDMyKGtLZXlJc0RSTSwgJmRybSkgJiYgZHJtICE9IDApOwogICAgICAgICB2b2lkICpkYXRhID0gTlVMTDsKICAgICAgICAgYm9vbCBpc01hbEZvcm1lZCA9IGZhbHNlOwotICAgICAgICBpZiAodXNlc0RSTSkgewotICAgICAgICAgICAgaWYgKG1CdWZmZXIgPT0gTlVMTCB8fCAhaXNJblJhbmdlKChzaXplX3QpMHUsIG1CdWZmZXItPnNpemUoKSwgc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRhdGEgPSBtQnVmZmVyLT5kYXRhKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgIGludDMyX3QgbWF4X3NpemU7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsICZtYXhfc2l6ZSkKKyAgICAgICAgICAgICAgICB8fCAhaXNJblJhbmdlKChzaXplX3QpMHUsIChzaXplX3QpbWF4X3NpemUsIHNpemUpKSB7CisgICAgICAgICAgICBpc01hbEZvcm1lZCA9IHRydWU7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQzMl90IG1heF9zaXplOwotICAgICAgICAgICAgaWYgKCFtRm9ybWF0LmZpbmRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCAmbWF4X3NpemUpCi0gICAgICAgICAgICAgICAgICAgIHx8ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgKHNpemVfdCltYXhfc2l6ZSwgc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRhdGEgPSBtU3JjQnVmZmVyOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgZGF0YSA9IG1TcmNCdWZmZXI7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaXNNYWxGb3JtZWQgfHwgZGF0YSA9PSBOVUxMKSB7CkBAIC01Mjc0LDcgKzYyMTEsNyBAQAogICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgICAgICBudW1fYnl0ZXNfcmVhZCA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBkYXRhLCBzaXplKTsKIApAQCAtNTI4Myw3NSArNjIyMCw2OSBAQAogICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKICAgICAgICAgICAgIEFMT0dFKCJpL28gZXJyb3IiKTsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CiAgICAgICAgIH0KIAotICAgICAgICBpZiAodXNlc0RSTSkgewotICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciAhPSBOVUxMKTsKLSAgICAgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBzaXplKTsKKyAgICAgICAgdWludDhfdCAqZHN0RGF0YSA9ICh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpOworICAgICAgICBzaXplX3Qgc3JjT2Zmc2V0ID0gMDsKKyAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7CiAKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVpbnQ4X3QgKmRzdERhdGEgPSAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKTsKLSAgICAgICAgICAgIHNpemVfdCBzcmNPZmZzZXQgPSAwOwotICAgICAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7Ci0KLSAgICAgICAgICAgIHdoaWxlIChzcmNPZmZzZXQgPCBzaXplKSB7Ci0gICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbU5BTExlbmd0aFNpemUpOwotICAgICAgICAgICAgICAgIHNpemVfdCBuYWxMZW5ndGggPSAwOwotICAgICAgICAgICAgICAgIGlmICghaXNNYWxGb3JtZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbmFsTGVuZ3RoID0gcGFyc2VOQUxTaXplKCZtU3JjQnVmZmVyW3NyY09mZnNldF0pOwotICAgICAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbU5BTExlbmd0aFNpemU7Ci0gICAgICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG5hbExlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhaXNJblJhbmdlKChzaXplX3QpMHUsIG1CdWZmZXItPnNpemUoKSwgZHN0T2Zmc2V0LCAoc2l6ZV90KTR1KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgbUJ1ZmZlci0+c2l6ZSgpLCBkc3RPZmZzZXQgKyA0LCBuYWxMZW5ndGgpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc01hbEZvcm1lZCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVmlkZW8gaXMgbWFsZm9ybWVkOyBuYWxMZW5ndGggJXp1IiwgbmFsTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobmFsTGVuZ3RoID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGRzdE9mZnNldCA+IFNJWkVfTUFYIC0gNCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCA+IFNJWkVfTUFYIC0gbmFsTGVuZ3RoIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKyA0ICsgbmFsTGVuZ3RoID4gbUJ1ZmZlci0+c2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJiLzI2MzY1MzQ5IDogJXp1ICV6dSIsIGRzdE9mZnNldCwgbUJ1ZmZlci0+c2l6ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNjM2NTM0OSIpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7Ci0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOwotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMTsKLSAgICAgICAgICAgICAgICBtZW1jcHkoJmRzdERhdGFbZHN0T2Zmc2V0XSwgJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSwgbmFsTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbmFsTGVuZ3RoOwotICAgICAgICAgICAgICAgIGRzdE9mZnNldCArPSBuYWxMZW5ndGg7CisgICAgICAgIHdoaWxlIChzcmNPZmZzZXQgPCBzaXplKSB7CisgICAgICAgICAgICBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBtTkFMTGVuZ3RoU2l6ZSk7CisgICAgICAgICAgICBzaXplX3QgbmFsTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGlmICghaXNNYWxGb3JtZWQpIHsKKyAgICAgICAgICAgICAgICBuYWxMZW5ndGggPSBwYXJzZU5BTFNpemUoJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSk7CisgICAgICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG1OQUxMZW5ndGhTaXplOworICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG5hbExlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgbUJ1ZmZlci0+c2l6ZSgpLCBkc3RPZmZzZXQsIChzaXplX3QpNHUpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAhaXNJblJhbmdlKChzaXplX3QpMHUsIG1CdWZmZXItPnNpemUoKSwgZHN0T2Zmc2V0ICsgNCwgbmFsTGVuZ3RoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENIRUNLX0VRKHNyY09mZnNldCwgc2l6ZSk7Ci0gICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwotICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIGRzdE9mZnNldCk7Ci0gICAgICAgIH0KIAotICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICBrS2V5VGltZSwgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7Ci0gICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgIGtLZXlEdXJhdGlvbiwgKChpbnQ2NF90KXNtcGwtPmR1cmF0aW9uICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgICAgIGlmIChpc01hbEZvcm1lZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJWaWRlbyBpcyBtYWxmb3JtZWQ7IG5hbExlbmd0aCAlenUiLCBuYWxMZW5ndGgpOworICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG5hbExlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkc3RPZmZzZXQgPiBTSVpFX01BWCAtIDQgfHwKKyAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCA+IFNJWkVfTUFYIC0gbmFsTGVuZ3RoIHx8CisgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCArIDQgKyBuYWxMZW5ndGggPiBtQnVmZmVyLT5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYi8yNjM2NTM0OSA6ICV6dSAlenUiLCBkc3RPZmZzZXQsIG1CdWZmZXItPnNpemUoKSk7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIyNjM2NTM0OSIpOworICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOworICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAxOworICAgICAgICAgICAgbWVtY3B5KCZkc3REYXRhW2RzdE9mZnNldF0sICZtU3JjQnVmZmVyW3NyY09mZnNldF0sIG5hbExlbmd0aCk7CisgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbmFsTGVuZ3RoOworICAgICAgICAgICAgZHN0T2Zmc2V0ICs9IG5hbExlbmd0aDsKKyAgICAgICAgfQorICAgICAgICBDSEVDS19FUShzcmNPZmZzZXQsIHNpemUpOworICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOworICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgZHN0T2Zmc2V0KTsKKworICAgICAgICBBTWVkaWFGb3JtYXQgKmJ1Zm1ldGEgPSBtQnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGJ1Zm1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCAoKGxvbmcgZG91YmxlKWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChidWZtZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICgobG9uZyBkb3VibGUpc21wbC0+ZHVyYXRpb24gKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwogCiAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgewotICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCB0YXJnZXRTYW1wbGVUaW1lVXMpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaXNTeW5jU2FtcGxlKSB7Ci0gICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAgICAgICAgIH0KIAogICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CkBAIC01MzU5LDE1ICs2MjkwLDE3IEBACiAgICAgICAgICpvdXQgPSBtQnVmZmVyOwogICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAotICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAgICAgfQorCisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogTVBFRzRFeHRyYWN0b3I6OlRyYWNrICpNUEVHNEV4dHJhY3Rvcjo6ZmluZFRyYWNrQnlNaW1lUHJlZml4KAogICAgICAgICBjb25zdCBjaGFyICptaW1lUHJlZml4KSB7CiAgICAgZm9yIChUcmFjayAqdHJhY2sgPSBtRmlyc3RUcmFjazsgdHJhY2sgIT0gTlVMTDsgdHJhY2sgPSB0cmFjay0+bmV4dCkgewogICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICBpZiAodHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkKKyAgICAgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpCiAgICAgICAgICAgICAgICAgJiYgIXN0cm5jYXNlY21wKG1pbWUsIG1pbWVQcmVmaXgsIHN0cmxlbihtaW1lUHJlZml4KSkpIHsKICAgICAgICAgICAgIHJldHVybiB0cmFjazsKICAgICAgICAgfQpAQCAtNTM3Niw3ICs2MzA5LDcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotc3RhdGljIGJvb2wgTGVnYWN5U25pZmZNUEVHNChEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworc3RhdGljIGJvb2wgTGVnYWN5U25pZmZNUEVHNChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CiAgICAgdWludDhfdCBoZWFkZXJbOF07CiAKICAgICBzc2l6ZV90IG4gPSBzb3VyY2UtPnJlYWRBdCg0LCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKTsKQEAgLTU0MDIsMjcgKzYzMzUsMzAgQEAKIAogc3RhdGljIGJvb2wgaXNDb21wYXRpYmxlQnJhbmQodWludDMyX3QgZm91cmNjKSB7CiAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtDb21wYXRpYmxlQnJhbmRzW10gPSB7Ci0gICAgICAgIEZPVVJDQygnaScsICdzJywgJ28nLCAnbScpLAotICAgICAgICBGT1VSQ0MoJ2knLCAncycsICdvJywgJzInKSwKLSAgICAgICAgRk9VUkNDKCdhJywgJ3YnLCAnYycsICcxJyksCi0gICAgICAgIEZPVVJDQygnaCcsICd2JywgJ2MnLCAnMScpLAotICAgICAgICBGT1VSQ0MoJ2gnLCAnZScsICd2JywgJzEnKSwKLSAgICAgICAgRk9VUkNDKCczJywgJ2cnLCAncCcsICc0JyksCi0gICAgICAgIEZPVVJDQygnbScsICdwJywgJzQnLCAnMScpLAotICAgICAgICBGT1VSQ0MoJ20nLCAncCcsICc0JywgJzInKSwKLSAgICAgICAgRk9VUkNDKCdkJywgJ2EnLCAncycsICdoJyksCisgICAgICAgIEZPVVJDQygiaXNvbSIpLAorICAgICAgICBGT1VSQ0MoImlzbzIiKSwKKyAgICAgICAgRk9VUkNDKCJhdmMxIiksCisgICAgICAgIEZPVVJDQygiaHZjMSIpLAorICAgICAgICBGT1VSQ0MoImhldjEiKSwKKyAgICAgICAgRk9VUkNDKCJhdjAxIiksCisgICAgICAgIEZPVVJDQygiM2dwNCIpLAorICAgICAgICBGT1VSQ0MoIm1wNDEiKSwKKyAgICAgICAgRk9VUkNDKCJtcDQyIiksCisgICAgICAgIEZPVVJDQygiZGFzaCIpLAorICAgICAgICBGT1VSQ0MoIm52cjEiKSwKIAogICAgICAgICAvLyBXb24ndCBwcm9taXNlIHRoYXQgdGhlIGZvbGxvd2luZyBmaWxlIHR5cGVzIGNhbiBiZSBwbGF5ZWQuCiAgICAgICAgIC8vIEp1c3QgZ2l2ZSB0aGVzZSBmaWxlIHR5cGVzIGEgY2hhbmNlLgotICAgICAgICBGT1VSQ0MoJ3EnLCAndCcsICcgJywgJyAnKSwgIC8vIEFwcGxlJ3MgUXVpY2tUaW1lCi0gICAgICAgIEZPVVJDQygnTScsICdTJywgJ04nLCAnVicpLCAgLy8gU29ueSdzIFBTUAorICAgICAgICBGT1VSQ0MoInF0ICAiKSwgIC8vIEFwcGxlJ3MgUXVpY2tUaW1lCisgICAgICAgIEZPVVJDQygiTVNOViIpLCAgLy8gU29ueSdzIFBTUAorICAgICAgICBGT1VSQ0MoIndtZiAiKSwKIAotICAgICAgICBGT1VSQ0MoJzMnLCAnZycsICcyJywgJ2EnKSwgIC8vIDNHUFAyCi0gICAgICAgIEZPVVJDQygnMycsICdnJywgJzInLCAnYicpLAotICAgICAgICBGT1VSQ0MoJ20nLCAnaScsICdmJywgJzEnKSwgIC8vIEhFSUYgaW1hZ2UKLSAgICAgICAgRk9VUkNDKCdoJywgJ2UnLCAnaScsICdjJyksICAvLyBIRUlGIGltYWdlCi0gICAgICAgIEZPVVJDQygnbScsICdzJywgJ2YnLCAnMScpLCAgLy8gSEVJRiBpbWFnZSBzZXF1ZW5jZQotICAgICAgICBGT1VSQ0MoJ2gnLCAnZScsICd2JywgJ2MnKSwgIC8vIEhFSUYgaW1hZ2Ugc2VxdWVuY2UKKyAgICAgICAgRk9VUkNDKCIzZzJhIiksICAvLyAzR1BQMgorICAgICAgICBGT1VSQ0MoIjNnMmIiKSwKKyAgICAgICAgRk9VUkNDKCJtaWYxIiksICAvLyBIRUlGIGltYWdlCisgICAgICAgIEZPVVJDQygiaGVpYyIpLCAgLy8gSEVJRiBpbWFnZQorICAgICAgICBGT1VSQ0MoIm1zZjEiKSwgIC8vIEhFSUYgaW1hZ2Ugc2VxdWVuY2UKKyAgICAgICAgRk9VUkNDKCJoZXZjIiksICAvLyBIRUlGIGltYWdlIHNlcXVlbmNlCiAgICAgfTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOwpAQCAtNTQ0MSw3ICs2Mzc3LDcgQEAKIC8vIEFsc28gdHJ5IHRvIGlkZW50aWZ5IHdoZXJlIHRoaXMgZmlsZSdzIG1ldGFkYXRhIGVuZHMKIC8vIChlbmQgb2YgdGhlICdtb292JyBhdG9tKSBhbmQgcmVwb3J0IGl0IHRvIHRoZSBjYWxsZXIgYXMgcGFydCBvZgogLy8gdGhlIG1ldGFkYXRhLgotc3RhdGljIGJvb2wgQmV0dGVyU25pZmZNUEVHNChEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworc3RhdGljIGJvb2wgQmV0dGVyU25pZmZNUEVHNChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CiAgICAgLy8gV2Ugc2NhbiB1cCB0byAxMjggYnl0ZXMgdG8gaWRlbnRpZnkgdGhpcyBmaWxlIGFzIGFuIE1QNC4KICAgICBzdGF0aWMgY29uc3Qgb2ZmNjRfdCBrTWF4U2Nhbk9mZnNldCA9IDEyOGxsOwogCkBAIC01NDg3LDkgKzY0MjMsMTAgQEAKIAogICAgICAgICBjaGFyIGNodW5rc3RyaW5nWzVdOwogICAgICAgICBNYWtlRm91ckNDU3RyaW5nKGNodW5rVHlwZSwgY2h1bmtzdHJpbmcpOwotICAgICAgICBBTE9HVigic2F3IGNodW5rIHR5cGUgJXMsIHNpemUgJSIgUFJJdTY0ICIgQCAlbGxkIiwgY2h1bmtzdHJpbmcsIGNodW5rU2l6ZSwgKGxvbmcgbG9uZylvZmZzZXQpOworICAgICAgICBBTE9HVigic2F3IGNodW5rIHR5cGUgJXMsIHNpemUgJSIgUFJJdTY0ICIgQCAlbGxkIiwKKyAgICAgICAgICAgICAgICBjaHVua3N0cmluZywgY2h1bmtTaXplLCAobG9uZyBsb25nKW9mZnNldCk7CiAgICAgICAgIHN3aXRjaCAoY2h1bmtUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIEZPVVJDQygnZicsICd0JywgJ3knLCAncCcpOgorICAgICAgICAgICAgY2FzZSBGT1VSQ0MoImZ0eXAiKToKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICBpZiAoY2h1bmtEYXRhU2l6ZSA8IDgpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNTUyNCw3ICs2NDYxLDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ20nLCAnbycsICdvJywgJ3YnKToKKyAgICAgICAgICAgIGNhc2UgRk9VUkNDKCJtb292Iik6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgbW9vdkF0b21FbmRPZmZzZXQgPSBvZmZzZXQgKyBjaHVua1NpemU7CiAKQEAgLTU1NDgsMTggKzY0ODUsMTkgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yKiBDcmVhdGVFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgdm9pZCAqKSB7Ci0gICAgcmV0dXJuIG5ldyBNUEVHNEV4dHJhY3Rvcihzb3VyY2UpOworc3RhdGljIENNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKENEYXRhU291cmNlICpzb3VyY2UsIHZvaWQgKikgeworICAgIHJldHVybiB3cmFwKG5ldyBNUEVHNEV4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpKSk7CiB9CiAKLXN0YXRpYyBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgU25pZmYoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlLCB2b2lkICoqLAotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICopIHsKLSAgICBpZiAoQmV0dGVyU25pZmZNUEVHNChzb3VyY2UsIGNvbmZpZGVuY2UpKSB7CitzdGF0aWMgQ3JlYXRvckZ1bmMgU25pZmYoCisgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlLCB2b2lkICoqLAorICAgICAgICBGcmVlTWV0YUZ1bmMgKikgeworICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKHNvdXJjZSk7CisgICAgaWYgKEJldHRlclNuaWZmTVBFRzQoJmhlbHBlciwgY29uZmlkZW5jZSkpIHsKICAgICAgICAgcmV0dXJuIENyZWF0ZUV4dHJhY3RvcjsKICAgICB9CiAKLSAgICBpZiAoTGVnYWN5U25pZmZNUEVHNChzb3VyY2UsIGNvbmZpZGVuY2UpKSB7CisgICAgaWYgKExlZ2FjeVNuaWZmTVBFRzQoJmhlbHBlciwgY29uZmlkZW5jZSkpIHsKICAgICAgICAgQUxPR1coIklkZW50aWZpZWQgc3VwcG9ydGVkIG1wZWc0IHRocm91Z2ggTGVnYWN5U25pZmZNUEVHNC4iKTsKICAgICAgICAgcmV0dXJuIENyZWF0ZUV4dHJhY3RvcjsKICAgICB9CkBAIC01NTY3LDE2ICs2NTA1LDMxIEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICpleHRlbnNpb25zW10gPSB7CisgICAgIjNnMiIsCisgICAgIjNnYSIsCisgICAgIjNncCIsCisgICAgIjNncHAiLAorICAgICIzZ3BwMiIsCisgICAgIm00YSIsCisgICAgIm00ciIsCisgICAgIm00diIsCisgICAgIm1vdiIsCisgICAgIm1wNCIsCisgICAgInF0IiwKKyAgICBOVUxMCit9OworCiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICBVVUlEKCIyNzU3NWM2Ny00NDE3LTRjNTQtOGQzZC04ZTYyNjk4NWExNjQiKSwKLSAgICAgICAgMSwgLy8gdmVyc2lvbgorICAgICAgICAyLCAvLyB2ZXJzaW9uCiAgICAgICAgICJNUDQgRXh0cmFjdG9yIiwKLSAgICAgICAgU25pZmYKKyAgICAgICAgeyAudjMgPSB7U25pZmYsIGV4dGVuc2lvbnN9IH0sCiAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmgKaW5kZXggM2VhMDk2My4uZmNkZGJiOCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5oCkBAIC0yMCw5ICsyMCw5IEBACiAKICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KIAotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KQEAgLTMxLDggKzMxLDggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogc3RydWN0IEFNZXNzYWdlOwotY2xhc3MgRGF0YVNvdXJjZUJhc2U7Ci1zdHJ1Y3QgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZTsKK3N0cnVjdCBDRGF0YVNvdXJjZTsKK2NsYXNzIERhdGFTb3VyY2VIZWxwZXI7CiBjbGFzcyBTYW1wbGVUYWJsZTsKIGNsYXNzIFN0cmluZzg7CiBuYW1lc3BhY2UgaGVpZiB7CkBAIC01MywxNSArNTMsMTUgQEAKICAgICB1aW50MzJfdCBkZWZhdWx0X3NhbXBsZV9mbGFnczsKIH07CiAKLWNsYXNzIE1QRUc0RXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK2NsYXNzIE1QRUc0RXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBNUEVHNEV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlLCBjb25zdCBjaGFyICptaW1lID0gTlVMTCk7CisgICAgZXhwbGljaXQgTVBFRzRFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBjb25zdCBjaGFyICptaW1lID0gTlVMTCk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk1QRUc0RXh0cmFjdG9yIjsgfQogCkBAIC03NywxNyArNzcsNTMgQEAKICAgICB9OwogICAgIHN0cnVjdCBUcmFjayB7CiAgICAgICAgIFRyYWNrICpuZXh0OwotICAgICAgICBNZXRhRGF0YUJhc2UgbWV0YTsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhOwogICAgICAgICB1aW50MzJfdCB0aW1lc2NhbGU7CiAgICAgICAgIHNwPFNhbXBsZVRhYmxlPiBzYW1wbGVUYWJsZTsKICAgICAgICAgYm9vbCBpbmNsdWRlc19leHBlbnNpdmVfbWV0YWRhdGE7CiAgICAgICAgIGJvb2wgc2tpcFRyYWNrOwogICAgICAgICBib29sIGhhc19lbHN0OworICAgICAgICAvKiBzaWduZWQgaW50LCBJU08gU3BlYyBhbGxvd3MgbWVkaWFfdGltZSA9IC0xIGZvciBvdGhlciB1c2UgY2FzZXMuCisgICAgICAgICAqIGJ1dCB3ZSBkb24ndCBzdXBwb3J0IGVtcHR5IGVkaXRzIGZvciBub3cuCisgICAgICAgICAqLwogICAgICAgICBpbnQ2NF90IGVsc3RfbWVkaWFfdGltZTsKICAgICAgICAgdWludDY0X3QgZWxzdF9zZWdtZW50X2R1cmF0aW9uOworICAgICAgICAvLyB1bnNpZ25lZCBpbnQsIHNoaWZ0IHN0YXJ0IG9mZnNldCBvbmx5IHdoZW4gbWVkaWFfdGltZSA+IDAuCisgICAgICAgIHVpbnQ2NF90IGVsc3RTaGlmdFN0YXJ0VGlja3M7CiAgICAgICAgIGJvb2wgc3Vic2FtcGxlX2VuY3J5cHRpb247CisKKyAgICAgICAgdWludDhfdCAqbVR4M2dCdWZmZXI7CisgICAgICAgIHNpemVfdCBtVHgzZ1NpemUsIG1UeDNnRmlsbGVkOworCisKKyAgICAgICAgVHJhY2soKSB7CisgICAgICAgICAgICBuZXh0ID0gTlVMTDsKKyAgICAgICAgICAgIG1ldGEgPSBOVUxMOworICAgICAgICAgICAgdGltZXNjYWxlID0gMDsKKyAgICAgICAgICAgIGluY2x1ZGVzX2V4cGVuc2l2ZV9tZXRhZGF0YSA9IGZhbHNlOworICAgICAgICAgICAgc2tpcFRyYWNrID0gZmFsc2U7CisgICAgICAgICAgICBoYXNfZWxzdCA9IGZhbHNlOworICAgICAgICAgICAgZWxzdF9tZWRpYV90aW1lID0gMDsKKyAgICAgICAgICAgIGVsc3RTaGlmdFN0YXJ0VGlja3MgPSAwOworICAgICAgICAgICAgc3Vic2FtcGxlX2VuY3J5cHRpb24gPSBmYWxzZTsKKyAgICAgICAgICAgIG1UeDNnQnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIG1UeDNnU2l6ZSA9IG1UeDNnRmlsbGVkID0gMDsKKyAgICAgICAgfQorICAgICAgICB+VHJhY2soKSB7CisgICAgICAgICAgICBpZiAobWV0YSkgeworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobWV0YSk7CisgICAgICAgICAgICAgICAgbWV0YSA9IE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmcmVlIChtVHgzZ0J1ZmZlcik7CisgICAgICAgICAgICBtVHgzZ0J1ZmZlciA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVHJhY2spOwogICAgIH07CiAKKyAgICBzdGF0aWMgY29uc3QgaW50IGtUeDNnR3Jvd3RoID0gMTYgKiAxMDI0OworCiAgICAgVmVjdG9yPFNpZHhFbnRyeT4gbVNpZHhFbnRyaWVzOwogICAgIG9mZjY0X3QgbU1vb2ZPZmZzZXQ7CiAgICAgYm9vbCBtTW9vZkZvdW5kOwpAQCAtOTcsOCArMTMzLDcgQEAKIAogICAgIFZlY3RvcjxUcmV4PiBtVHJleDsKIAotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKLSAgICBDYWNoZWRSYW5nZWREYXRhU291cmNlICptQ2FjaGVkU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAgICAgdWludDMyX3QgbUhlYWRlclRpbWVzY2FsZTsKICAgICBib29sIG1Jc1FUOwpAQCAtMTA4LDcgKzE0Myw3IEBACiAKICAgICBUcmFjayAqbUZpcnN0VHJhY2ssICptTGFzdFRyYWNrOwogCi0gICAgTWV0YURhdGFCYXNlIG1GaWxlTWV0YURhdGE7CisgICAgQU1lZGlhRm9ybWF0ICptRmlsZU1ldGFEYXRhOwogCiAgICAgVmVjdG9yPHVpbnQzMl90PiBtUGF0aDsKICAgICBTdHJpbmc4IG1MYXN0Q29tbWVudE1lYW47CkBAIC0xMzksMTcgKzE3NCwxOCBAQAogCiAgICAgVHJhY2sgKmZpbmRUcmFja0J5TWltZVByZWZpeChjb25zdCBjaGFyICptaW1lUHJlZml4KTsKIAotICAgIHN0YXR1c190IHBhcnNlQUMzU2FtcGxlRW50cnkob2ZmNjRfdCBvZmZzZXQpOwotICAgIHN0YXR1c190IHBhcnNlQUMzU3BlY2lmaWNCb3gob2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90IHNhbXBsZVJhdGUpOworICAgIHN0YXR1c190IHBhcnNlQ2hhbm5lbENvdW50U2FtcGxlUmF0ZSgKKyAgICAgICAgICAgIG9mZjY0X3QgKm9mZnNldCwgdWludDE2X3QgKmNoYW5uZWxDb3VudCwgdWludDE2X3QgKnNhbXBsZVJhdGUpOworICAgIHN0YXR1c190IHBhcnNlQUMzU3BlY2lmaWNCb3gob2ZmNjRfdCBvZmZzZXQpOworICAgIHN0YXR1c190IHBhcnNlRUFDM1NwZWNpZmljQm94KG9mZjY0X3Qgb2Zmc2V0KTsKKyAgICBzdGF0dXNfdCBwYXJzZUFDNFNwZWNpZmljQm94KG9mZjY0X3Qgb2Zmc2V0KTsKKyAgICBzdGF0dXNfdCBwYXJzZUFMQUNTYW1wbGVFbnRyeShvZmY2NF90ICpvZmZzZXQpOworICAgIHZvaWQgYWRqdXN0UmF3RGVmYXVsdEZyYW1lU2l6ZSgpOwogCiAgICAgTVBFRzRFeHRyYWN0b3IoY29uc3QgTVBFRzRFeHRyYWN0b3IgJik7CiAgICAgTVBFRzRFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBNUEVHNEV4dHJhY3RvciAmKTsKIH07CiAKLWJvb2wgU25pZmZNUEVHNCgKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICBzcDxBTWVzc2FnZT4gKik7Ci0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gTVBFRzRfRVhUUkFDVE9SX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVJdGVyYXRvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVJdGVyYXRvci5jcHAKaW5kZXggOTNlZTdjNi4uMjg5MGIyNiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlSXRlcmF0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZUl0ZXJhdG9yLmNwcApAQCAtMTExLDggKzExMSwxNSBAQAogICAgICAgICAgICAgaWYgKChlcnIgPSBnZXRTYW1wbGVTaXplRGlyZWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0Q2h1bmtTYW1wbGVJbmRleCArIGksICZzYW1wbGVTaXplKSkgIT0gT0spIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0U2FtcGxlU2l6ZURpcmVjdCByZXR1cm4gZXJyb3IiKTsKLSAgICAgICAgICAgICAgICBtQ3VycmVudENodW5rU2FtcGxlU2l6ZXMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIC8vIHN0c2Mgc2FtcGxlIGNvdW50IGlzIG5vdCBzeW5jIHdpdGggc3RzeiBzYW1wbGUgY291bnQKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX09VVF9PRl9SQU5HRSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygic3RzYyBzYW1wbGVzKCVkKSBub3Qgc3luYyB3aXRoIHN0c3ogc2FtcGxlcyglZCkiLCBtU2FtcGxlc1BlckNodW5rLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgbVNhbXBsZXNQZXJDaHVuayA9IGk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0gZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRDaHVua1NhbXBsZVNpemVzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtQ3VycmVudENodW5rU2FtcGxlU2l6ZXMucHVzaChzYW1wbGVTaXplKTsKQEAgLTMwMSw3ICszMDgsNyBAQAogfQogCiBzdGF0dXNfdCBTYW1wbGVJdGVyYXRvcjo6ZmluZFNhbXBsZVRpbWVBbmREdXJhdGlvbigKLSAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXgsIHVpbnQzMl90ICp0aW1lLCB1aW50MzJfdCAqZHVyYXRpb24pIHsKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXgsIHVpbnQ2NF90ICp0aW1lLCB1aW50NjRfdCAqZHVyYXRpb24pIHsKICAgICBpZiAoc2FtcGxlSW5kZXggPj0gbVRhYmxlLT5tTnVtU2FtcGxlU2l6ZXMpIHsKICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKICAgICB9CkBAIC0zMTQsOCArMzIxLDggQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGlmIChtVGltZVRvU2FtcGxlSW5kZXggPT0gbVRhYmxlLT5tVGltZVRvU2FtcGxlQ291bnQgfHwKLSAgICAgICAgICAgIChtVFRTRHVyYXRpb24gIT0gMCAmJiBtVFRTQ291bnQgPiBVSU5UMzJfTUFYIC8gbVRUU0R1cmF0aW9uKSB8fAotICAgICAgICAgICAgbVRUU1NhbXBsZVRpbWUgPiBVSU5UMzJfTUFYIC0gKG1UVFNDb3VudCAqIG1UVFNEdXJhdGlvbikpIHsKKyAgICAgICAgICAgIChtVFRTRHVyYXRpb24gIT0gMCAmJiBtVFRTQ291bnQgPiBVSU5UNjRfTUFYIC8gbVRUU0R1cmF0aW9uKSB8fAorICAgICAgICAgICAgbVRUU1NhbXBsZVRpbWUgPiBVSU5UNjRfTUFYIC0gKG1UVFNDb3VudCAqIG1UVFNEdXJhdGlvbikpIHsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgICAgIH0KIApAQCAtMzI4LDE5ICszMzUsMjcgQEAKICAgICAgICAgKyttVGltZVRvU2FtcGxlSW5kZXg7CiAgICAgfQogCi0gICAgKnRpbWUgPSBtVFRTU2FtcGxlVGltZSArIG1UVFNEdXJhdGlvbiAqIChzYW1wbGVJbmRleCAtIG1UVFNTYW1wbGVJbmRleCk7CisgICAgLy8gYmVsb3cgaXMgZXF1aXZhbGVudCB0bzoKKyAgICAvLyAqdGltZSA9IG1UVFNTYW1wbGVUaW1lICsgbVRUU0R1cmF0aW9uICogKHNhbXBsZUluZGV4IC0gbVRUU1NhbXBsZUluZGV4KTsKKyAgICB1aW50NjRfdCB0bXA7CisgICAgaWYgKF9fYnVpbHRpbl9zdWJfb3ZlcmZsb3coc2FtcGxlSW5kZXgsIG1UVFNTYW1wbGVJbmRleCwgJnRtcCkgfHwKKyAgICAgICAgICAgIF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cobVRUU0R1cmF0aW9uLCB0bXAsICZ0bXApIHx8CisgICAgICAgICAgICBfX2J1aWx0aW5fYWRkX292ZXJmbG93KG1UVFNTYW1wbGVUaW1lLCB0bXAsICZ0bXApKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CisgICAgfQorICAgICp0aW1lID0gdG1wOwogCiAgICAgaW50MzJfdCBvZmZzZXQgPSBtVGFibGUtPmdldENvbXBvc2l0aW9uVGltZU9mZnNldChzYW1wbGVJbmRleCk7CiAgICAgaWYgKChvZmZzZXQgPCAwICYmICp0aW1lIDwgKG9mZnNldCA9PSBJTlQzMl9NSU4gPwotICAgICAgICAgICAgSU5UMzJfTUFYIDogdWludDMyX3QoLW9mZnNldCkpKSB8fAotICAgICAgICAgICAgKG9mZnNldCA+IDAgJiYgKnRpbWUgPiBVSU5UMzJfTUFYIC0gb2Zmc2V0KSkgewotICAgICAgICBBTE9HRSgiJXUgKyAlZCB3b3VsZCBvdmVyZmxvdyIsICp0aW1lLCBvZmZzZXQpOworICAgICAgICAgICAgSU5UNjRfTUFYIDogdWludDY0X3QoLW9mZnNldCkpKSB8fAorICAgICAgICAgICAgKG9mZnNldCA+IDAgJiYgKnRpbWUgPiBVSU5UNjRfTUFYIC0gb2Zmc2V0KSkgeworICAgICAgICBBTE9HRSgiJWxsdSArICVkIHdvdWxkIG92ZXJmbG93IiwgKHVuc2lnbmVkIGxvbmcgbG9uZykgKnRpbWUsIG9mZnNldCk7CiAgICAgICAgIHJldHVybiBFUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgfQogICAgIGlmIChvZmZzZXQgPiAwKSB7CiAgICAgICAgICp0aW1lICs9IG9mZnNldDsKICAgICB9IGVsc2UgewotICAgICAgICAqdGltZSAtPSAob2Zmc2V0ID09IElOVDMyX01JTiA/IElOVDMyX01BWCA6ICgtb2Zmc2V0KSk7CisgICAgICAgICp0aW1lIC09IChvZmZzZXQgPT0gSU5UNjRfTUlOID8gSU5UNjRfTUFYIDogKC1vZmZzZXQpKTsKICAgICB9CiAKICAgICAqZHVyYXRpb24gPSBtVFRTRHVyYXRpb247CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVJdGVyYXRvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlSXRlcmF0b3IuaAppbmRleCA2YTNmZDNiLi41YTBlYTc2IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVJdGVyYXRvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZUl0ZXJhdG9yLmgKQEAgLTMzLDggKzMzLDEzIEBACiAgICAgdWludDMyX3QgZ2V0RGVzY0luZGV4KCkgY29uc3QgeyByZXR1cm4gbUNodW5rRGVzYzsgfQogICAgIG9mZjY0X3QgZ2V0U2FtcGxlT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gbUN1cnJlbnRTYW1wbGVPZmZzZXQ7IH0KICAgICBzaXplX3QgZ2V0U2FtcGxlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1DdXJyZW50U2FtcGxlU2l6ZTsgfQotICAgIHVpbnQzMl90IGdldFNhbXBsZVRpbWUoKSBjb25zdCB7IHJldHVybiBtQ3VycmVudFNhbXBsZVRpbWU7IH0KLSAgICB1aW50MzJfdCBnZXRTYW1wbGVEdXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1DdXJyZW50U2FtcGxlRHVyYXRpb247IH0KKyAgICB1aW50NjRfdCBnZXRTYW1wbGVUaW1lKCkgY29uc3QgeyByZXR1cm4gbUN1cnJlbnRTYW1wbGVUaW1lOyB9CisgICAgdWludDY0X3QgZ2V0U2FtcGxlRHVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtQ3VycmVudFNhbXBsZUR1cmF0aW9uOyB9CisKKyAgICB1aW50MzJfdCBnZXRMYXN0U2FtcGxlSW5kZXhJbkNodW5rKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUN1cnJlbnRTYW1wbGVJbmRleCArIG1TYW1wbGVzUGVyQ2h1bmsgLQorICAgICAgICAgICAgICAgICgobUN1cnJlbnRTYW1wbGVJbmRleCAtIG1GaXJzdENodW5rU2FtcGxlSW5kZXgpICUgbVNhbXBsZXNQZXJDaHVuaykgLSAxOworICAgIH0KIAogICAgIHN0YXR1c190IGdldFNhbXBsZVNpemVEaXJlY3QoCiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleCwgc2l6ZV90ICpzaXplKTsKQEAgLTU4LDIwICs2MywyMCBAQAogCiAgICAgdWludDMyX3QgbVRpbWVUb1NhbXBsZUluZGV4OwogICAgIHVpbnQzMl90IG1UVFNTYW1wbGVJbmRleDsKLSAgICB1aW50MzJfdCBtVFRTU2FtcGxlVGltZTsKKyAgICB1aW50NjRfdCBtVFRTU2FtcGxlVGltZTsKICAgICB1aW50MzJfdCBtVFRTQ291bnQ7Ci0gICAgdWludDMyX3QgbVRUU0R1cmF0aW9uOworICAgIHVpbnQ2NF90IG1UVFNEdXJhdGlvbjsKIAogICAgIHVpbnQzMl90IG1DdXJyZW50U2FtcGxlSW5kZXg7CiAgICAgb2ZmNjRfdCBtQ3VycmVudFNhbXBsZU9mZnNldDsKICAgICBzaXplX3QgbUN1cnJlbnRTYW1wbGVTaXplOwotICAgIHVpbnQzMl90IG1DdXJyZW50U2FtcGxlVGltZTsKLSAgICB1aW50MzJfdCBtQ3VycmVudFNhbXBsZUR1cmF0aW9uOworICAgIHVpbnQ2NF90IG1DdXJyZW50U2FtcGxlVGltZTsKKyAgICB1aW50NjRfdCBtQ3VycmVudFNhbXBsZUR1cmF0aW9uOwogCiAgICAgdm9pZCByZXNldCgpOwogICAgIHN0YXR1c190IGZpbmRDaHVua1JhbmdlKHVpbnQzMl90IHNhbXBsZUluZGV4KTsKICAgICBzdGF0dXNfdCBnZXRDaHVua09mZnNldCh1aW50MzJfdCBjaHVuaywgb2ZmNjRfdCAqb2Zmc2V0KTsKLSAgICBzdGF0dXNfdCBmaW5kU2FtcGxlVGltZUFuZER1cmF0aW9uKHVpbnQzMl90IHNhbXBsZUluZGV4LCB1aW50MzJfdCAqdGltZSwgdWludDMyX3QgKmR1cmF0aW9uKTsKKyAgICBzdGF0dXNfdCBmaW5kU2FtcGxlVGltZUFuZER1cmF0aW9uKHVpbnQzMl90IHNhbXBsZUluZGV4LCB1aW50NjRfdCAqdGltZSwgdWludDY0X3QgKmR1cmF0aW9uKTsKIAogICAgIFNhbXBsZUl0ZXJhdG9yKGNvbnN0IFNhbXBsZUl0ZXJhdG9yICYpOwogICAgIFNhbXBsZUl0ZXJhdG9yICZvcGVyYXRvcj0oY29uc3QgU2FtcGxlSXRlcmF0b3IgJik7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5jcHAKaW5kZXggODFjMzUzZS4uYmYyOWJmMSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZVRhYmxlLmNwcApAQCAtMjUsNyArMjUsNyBAQAogCiAjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgogCkBAIC0zNywxMyArMzcsMTMgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gc3RhdGljCi1jb25zdCB1aW50MzJfdCBTYW1wbGVUYWJsZTo6a0NodW5rT2Zmc2V0VHlwZTMyID0gRk9VUkNDKCdzJywgJ3QnLCAnYycsICdvJyk7Citjb25zdCB1aW50MzJfdCBTYW1wbGVUYWJsZTo6a0NodW5rT2Zmc2V0VHlwZTMyID0gRk9VUkNDKCJzdGNvIik7CiAvLyBzdGF0aWMKLWNvbnN0IHVpbnQzMl90IFNhbXBsZVRhYmxlOjprQ2h1bmtPZmZzZXRUeXBlNjQgPSBGT1VSQ0MoJ2MnLCAnbycsICc2JywgJzQnKTsKK2NvbnN0IHVpbnQzMl90IFNhbXBsZVRhYmxlOjprQ2h1bmtPZmZzZXRUeXBlNjQgPSBGT1VSQ0MoImNvNjQiKTsKIC8vIHN0YXRpYwotY29uc3QgdWludDMyX3QgU2FtcGxlVGFibGU6OmtTYW1wbGVTaXplVHlwZTMyID0gRk9VUkNDKCdzJywgJ3QnLCAncycsICd6Jyk7Citjb25zdCB1aW50MzJfdCBTYW1wbGVUYWJsZTo6a1NhbXBsZVNpemVUeXBlMzIgPSBGT1VSQ0MoInN0c3oiKTsKIC8vIHN0YXRpYwotY29uc3QgdWludDMyX3QgU2FtcGxlVGFibGU6OmtTYW1wbGVTaXplVHlwZUNvbXBhY3QgPSBGT1VSQ0MoJ3MnLCAndCcsICd6JywgJzInKTsKK2NvbnN0IHVpbnQzMl90IFNhbXBsZVRhYmxlOjprU2FtcGxlU2l6ZVR5cGVDb21wYWN0ID0gRk9VUkNDKCJzdHoyIik7CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKQEAgLTExNCw3ICsxMTQsNyBAQAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1TYW1wbGVUYWJsZTo6U2FtcGxlVGFibGUoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKK1NhbXBsZVRhYmxlOjpTYW1wbGVUYWJsZShEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbUNodW5rT2Zmc2V0T2Zmc2V0KC0xKSwKICAgICAgIG1DaHVua09mZnNldFR5cGUoMCksCkBAIC02MTQsNyArNjE0LDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXVpbnQzMl90IGFic19kaWZmZXJlbmNlKHVpbnQzMl90IHRpbWUxLCB1aW50MzJfdCB0aW1lMikgewordWludDMyX3QgYWJzX2RpZmZlcmVuY2UodWludDY0X3QgdGltZTEsIHVpbnQ2NF90IHRpbWUyKSB7CiAgICAgcmV0dXJuIHRpbWUxID4gdGltZTIgPyB0aW1lMSAtIHRpbWUyIDogdGltZTIgLSB0aW1lMTsKIH0KIApAQCAtNjYyLDcgKzY2Miw3IEBACiAgICAgfQogCiAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXggPSAwOwotICAgIHVpbnQzMl90IHNhbXBsZVRpbWUgPSAwOworICAgIHVpbnQ2NF90IHNhbXBsZVRpbWUgPSAwOwogCiAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1UaW1lVG9TYW1wbGVDb3VudDsgKytpKSB7CiAgICAgICAgIHVpbnQzMl90IG4gPSBtVGltZVRvU2FtcGxlWzIgKiBpXTsKQEAgLTY4NCwxMyArNjg0LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAoY29tcFRpbWVEZWx0YSA9PSBJTlQzMl9NSU4gPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMl9NQVggOiB1aW50MzJfdCgtY29tcFRpbWVEZWx0YSkpKQogICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGNvbXBUaW1lRGVsdGEgPiAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUgPiBVSU5UMzJfTUFYIC0gY29tcFRpbWVEZWx0YSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiV1ICsgJWQgd291bGQgb3ZlcmZsb3csIGNsYW1waW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lLCBjb21wVGltZURlbHRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSA+IFVJTlQ2NF9NQVggLSBjb21wVGltZURlbHRhKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJWxsdSArICVkIHdvdWxkIG92ZXJmbG93LCBjbGFtcGluZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykgc2FtcGxlVGltZSwgY29tcFRpbWVEZWx0YSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wVGltZURlbHRhIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSA9IDA7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lID0gVUlOVDMyX01BWDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUgPSBVSU5UNjRfTUFYOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGNvbXBUaW1lRGVsdGEgPSAwOwogICAgICAgICAgICAgICAgIH0KQEAgLTcwMSwxMCArNzAxLDEwIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICsrc2FtcGxlSW5kZXg7Ci0gICAgICAgICAgICBpZiAoc2FtcGxlVGltZSA+IFVJTlQzMl9NQVggLSBkZWx0YSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIldSArICV1IHdvdWxkIG92ZXJmbG93LCBjbGFtcGluZyIsCi0gICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUsIGRlbHRhKTsKLSAgICAgICAgICAgICAgICBzYW1wbGVUaW1lID0gVUlOVDMyX01BWDsKKyAgICAgICAgICAgIGlmIChzYW1wbGVUaW1lID4gVUlOVDY0X01BWCAtIGRlbHRhKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVsbHUgKyAldSB3b3VsZCBvdmVyZmxvdywgY2xhbXBpbmciLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBzYW1wbGVUaW1lLCBkZWx0YSk7CisgICAgICAgICAgICAgICAgc2FtcGxlVGltZSA9IFVJTlQ2NF9NQVg7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUgKz0gZGVsdGE7CiAgICAgICAgICAgICB9CkBAIC04NzAsMTkgKzg3MCwxOSBAQAogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOworICAgICAgICAgICAgdWludDY0X3Qgc2FtcGxlX3RpbWUgPSBtU2FtcGxlSXRlcmF0b3ItPmdldFNhbXBsZVRpbWUoKTsKIAogICAgICAgICAgICAgZXJyID0gbVNhbXBsZUl0ZXJhdG9yLT5zZWVrVG8obVN5bmNTYW1wbGVzW2xlZnRdKTsKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgdWludDMyX3QgdXBwZXJfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOworICAgICAgICAgICAgdWludDY0X3QgdXBwZXJfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOwogCiAgICAgICAgICAgICBlcnIgPSBtU2FtcGxlSXRlcmF0b3ItPnNlZWtUbyhtU3luY1NhbXBsZXNbbGVmdCAtIDFdKTsKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgdWludDMyX3QgbG93ZXJfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOworICAgICAgICAgICAgdWludDY0X3QgbG93ZXJfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOwogCiAgICAgICAgICAgICAvLyB1c2UgYWJzX2RpZmZlcmVuY2UgZm9yIHNhZmV0eQogICAgICAgICAgICAgaWYgKGFic19kaWZmZXJlbmNlKHVwcGVyX3RpbWUsIHNhbXBsZV90aW1lKSA+CkBAIC05NDYsMTMgKzk0NiwxOCBAQAogICAgICAgICAgICAgc2FtcGxlSW5kZXgsIHNhbXBsZVNpemUpOwogfQogCit1aW50MzJfdCBTYW1wbGVUYWJsZTo6Z2V0TGFzdFNhbXBsZUluZGV4SW5DaHVuaygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiBtU2FtcGxlSXRlcmF0b3ItPmdldExhc3RTYW1wbGVJbmRleEluQ2h1bmsoKTsKK30KKwogc3RhdHVzX3QgU2FtcGxlVGFibGU6OmdldE1ldGFEYXRhRm9yU2FtcGxlKAogICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleCwKICAgICAgICAgb2ZmNjRfdCAqb2Zmc2V0LAogICAgICAgICBzaXplX3QgKnNpemUsCi0gICAgICAgIHVpbnQzMl90ICpjb21wb3NpdGlvblRpbWUsCisgICAgICAgIHVpbnQ2NF90ICpjb21wb3NpdGlvblRpbWUsCiAgICAgICAgIGJvb2wgKmlzU3luY1NhbXBsZSwKLSAgICAgICAgdWludDMyX3QgKnNhbXBsZUR1cmF0aW9uKSB7CisgICAgICAgIHVpbnQ2NF90ICpzYW1wbGVEdXJhdGlvbikgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBzdGF0dXNfdCBlcnI7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuaAppbmRleCBlNGU5NzRiLi4wNzZmNGMzIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZVRhYmxlLmgKQEAgLTIxLDE4ICsyMSwxOSBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgogCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitjbGFzcyBEYXRhU291cmNlSGVscGVyOwogc3RydWN0IFNhbXBsZUl0ZXJhdG9yOwogCiBjbGFzcyBTYW1wbGVUYWJsZSA6IHB1YmxpYyBSZWZCYXNlIHsKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBTYW1wbGVUYWJsZShEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKyAgICBleHBsaWNpdCBTYW1wbGVUYWJsZShEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3Q7CiAKQEAgLTY1LDkgKzY2LDEyIEBACiAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleCwKICAgICAgICAgICAgIG9mZjY0X3QgKm9mZnNldCwKICAgICAgICAgICAgIHNpemVfdCAqc2l6ZSwKLSAgICAgICAgICAgIHVpbnQzMl90ICpjb21wb3NpdGlvblRpbWUsCisgICAgICAgICAgICB1aW50NjRfdCAqY29tcG9zaXRpb25UaW1lLAogICAgICAgICAgICAgYm9vbCAqaXNTeW5jU2FtcGxlID0gTlVMTCwKLSAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVEdXJhdGlvbiA9IE5VTEwpOworICAgICAgICAgICAgdWludDY0X3QgKnNhbXBsZUR1cmF0aW9uID0gTlVMTCk7CisKKyAgICAvLyBjYWxsIG9ubHkgYWZ0ZXIgZ2V0TWV0YURhdGFGb3JTYW1wbGUgaGFzIGJlZW4gY2FsbGVkIHN1Y2Nlc3NmdWxseS4KKyAgICB1aW50MzJfdCBnZXRMYXN0U2FtcGxlSW5kZXhJbkNodW5rKCk7CiAKICAgICBlbnVtIHsKICAgICAgICAga0ZsYWdCZWZvcmUsCkBAIC04NSw2ICs4OSwxMCBAQAogCiAgICAgc3RhdHVzX3QgZmluZFRodW1ibmFpbFNhbXBsZSh1aW50MzJfdCAqc2FtcGxlX2luZGV4KTsKIAorICAgIHZvaWQgc2V0UHJlZGljdFNhbXBsZVNpemUodWludDMyX3Qgc2FtcGxlU2l6ZSkgeworICAgICAgICBtRGVmYXVsdFNhbXBsZVNpemUgPSBzYW1wbGVTaXplOworICAgIH0KKwogcHJvdGVjdGVkOgogICAgIH5TYW1wbGVUYWJsZSgpOwogCkBAIC05OSw3ICsxMDcsNyBAQAogICAgIC8vIExpbWl0IHRoZSB0b3RhbCBzaXplIG9mIGFsbCBpbnRlcm5hbCB0YWJsZXMgdG8gMjAwTWlCLgogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heFRvdGFsU2l6ZSA9IDIwMCAqICgxIDw8IDIwKTsKIAotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICBNdXRleCBtTG9jazsKIAogICAgIG9mZjY0X3QgbUNodW5rT2Zmc2V0T2Zmc2V0OwpAQCAtMTIwLDcgKzEyOCw3IEBACiAKICAgICBzdHJ1Y3QgU2FtcGxlVGltZUVudHJ5IHsKICAgICAgICAgdWludDMyX3QgbVNhbXBsZUluZGV4OwotICAgICAgICB1aW50MzJfdCBtQ29tcG9zaXRpb25UaW1lOworICAgICAgICB1aW50NjRfdCBtQ29tcG9zaXRpb25UaW1lOwogICAgIH07CiAgICAgU2FtcGxlVGltZUVudHJ5ICptU2FtcGxlVGltZUVudHJpZXM7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvQW5kcm9pZC5icAppbmRleCA1ZTRhNTkyLi4wZjBjNzJjIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9BbmRyb2lkLmJwCkBAIC0xNSwxOSArMTUsMjYgQEAKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGlkbC50b2tlbkAxLjAtdXRpbHMiLAotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYmNyeXB0byIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGliaGlkbGFsbG9jYXRvcnV0aWxzIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKKyAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlibWVkaWFuZGsiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl93aXRob3V0X2ltZW1vcnkiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0IiwKICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wZWcyZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAogICAgIF0sCiAKICAgICBuYW1lOiAibGlibXBlZzJleHRyYWN0b3IiLApAQCAtNDgsOSArNTUsNiBAQAogICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiAKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvRXh0cmFjdG9yQnVuZGxlLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvRXh0cmFjdG9yQnVuZGxlLmNwcAppbmRleCA4YTBmYTAzLi5hN2M3NTZiIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0V4dHJhY3RvckJ1bmRsZS5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9FeHRyYWN0b3JCdW5kbGUuY3BwCkBAIC0xOCwzOSArMTgsNTYgQEAKICNkZWZpbmUgTE9HX1RBRyAiTVBFRzJFeHRyYWN0b3JCdW5kbGUiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSAiTVBFRzJQU0V4dHJhY3Rvci5oIgogI2luY2x1ZGUgIk1QRUcyVFNFeHRyYWN0b3IuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdHJ1Y3QgQ0RhdGFTb3VyY2U7CisKK3N0YXRpYyBjb25zdCBjaGFyICpleHRlbnNpb25zW10gPSB7CisgICAibTJwIiwKKyAgICJtMnRzIiwKKyAgICJtdHMiLAorICAgInRzIiwKKyAgIE5VTEwKK307CisKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT04sCiAgICAgICAgIFVVSUQoIjNkMWRjZmViLWU0MGEtNDM2ZC1hNTc0LWMyNDM4YTU1NWU1ZiIpLAogICAgICAgICAxLAogICAgICAgICAiTVBFRzItUFMvVFMgRXh0cmFjdG9yIiwKLSAgICAgICAgW10oCi0gICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgICAgICAgICB2b2lkICoqLAotICAgICAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKikgLT4gTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIHsKLSAgICAgICAgICAgIGlmIChTbmlmZk1QRUcyVFMoc291cmNlLCBjb25maWRlbmNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBbXSgKLSAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IE1lZGlhRXh0cmFjdG9yKiB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTVBFRzJUU0V4dHJhY3Rvcihzb3VyY2UpO307Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKFNuaWZmTVBFRzJQUyhzb3VyY2UsIGNvbmZpZGVuY2UpKSB7CisgICAgICAgIHsKKyAgICAgICAgICAgIC52MyA9IHsKKyAgICAgICAgICAgICAgICBbXSgKKyAgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKiosCisgICAgICAgICAgICAgICAgICAgIEZyZWVNZXRhRnVuYyAqKSAtPiBDcmVhdG9yRnVuYyB7CisgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKHNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChTbmlmZk1QRUcyVFMoJmhlbHBlciwgY29uZmlkZW5jZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBNZWRpYUV4dHJhY3RvciogewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTVBFRzJQU0V4dHJhY3Rvcihzb3VyY2UpO307CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gQ01lZGlhRXh0cmFjdG9yKiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAobmV3IE1QRUcyVFNFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSkpO307CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoU25pZmZNUEVHMlBTKCZoZWxwZXIsIGNvbmZpZGVuY2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gQ01lZGlhRXh0cmFjdG9yKiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAobmV3IE1QRUcyUFNFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSkpO307CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICBleHRlbnNpb25zCiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQorICAgICAgICB9LAogICAgIH07CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJQU0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuY3BwCmluZGV4IDY5ODBiODIuLjczMTU4NGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJQU0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmNwcApAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgIm1wZWcydHMvRVNRdWV1ZS5oIgogCiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTM0LDIyICszMywyMyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrIDogcHVibGljIE1lZGlhVHJhY2ssIHB1YmxpYyBSZWZCYXNlIHsKK3N0cnVjdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjayA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyIHsKICAgICBUcmFjayhNUEVHMlBTRXh0cmFjdG9yICpleHRyYWN0b3IsCiAgICAgICAgICAgdW5zaWduZWQgc3RyZWFtX2lkLCB1bnNpZ25lZCBzdHJlYW1fdHlwZSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5UcmFjaygpOwpAQCAtNzIsMjkgKzcyLDI5IEBACiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVHJhY2spOwogfTsKIAotc3RydWN0IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjayA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKLSAgICBXcmFwcGVkVHJhY2soTVBFRzJQU0V4dHJhY3RvciAqZXh0cmFjdG9yLCBjb25zdCBzcDxUcmFjaz4gJnRyYWNrKTsKK3N0cnVjdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2sgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CisgICAgV3JhcHBlZFRyYWNrKE1QRUcyUFNFeHRyYWN0b3IgKmV4dHJhY3RvciwgVHJhY2sgKnRyYWNrKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICopOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfldyYXBwZWRUcmFjaygpOwogCiBwcml2YXRlOgogICAgIE1QRUcyUFNFeHRyYWN0b3IgKm1FeHRyYWN0b3I7Ci0gICAgc3A8TVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s+IG1UcmFjazsKKyAgICBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjayAqbVRyYWNrOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoV3JhcHBlZFRyYWNrKTsKIH07CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLU1QRUcyUFNFeHRyYWN0b3I6Ok1QRUcyUFNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKK01QRUcyUFNFeHRyYWN0b3I6Ok1QRUcyUFNFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1PZmZzZXQoMCksCiAgICAgICBtRmluYWxSZXN1bHQoT0spLApAQCAtMTA4LDI1ICsxMDgsMjcgQEAKICAgICB9CiAKICAgICAvLyBSZW1vdmUgYWxsIHRyYWNrcyB0aGF0IHdlcmUgdW5hYmxlIHRvIGRldGVybWluZSB0aGVpciBmb3JtYXQuCi0gICAgTWV0YURhdGFCYXNlIG1ldGE7CisgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOwogICAgIGZvciAoc2l6ZV90IGkgPSBtVHJhY2tzLnNpemUoKTsgaSA+IDA7KSB7CiAgICAgICAgIGktLTsKLSAgICAgICAgaWYgKG1UcmFja3MudmFsdWVBdChpKS0+Z2V0Rm9ybWF0KG1ldGEpICE9IE9LKSB7CisgICAgICAgIGlmIChtVHJhY2tzLnZhbHVlQXQoaSktPmdldEZvcm1hdChtZXRhKSAhPSBBTUVESUFfT0spIHsKICAgICAgICAgICAgIG1UcmFja3MucmVtb3ZlSXRlbXNBdChpKTsKICAgICAgICAgfQogICAgIH0KKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1ldGEpOwogCiAgICAgbVNjYW5uaW5nID0gZmFsc2U7CiB9CiAKIE1QRUcyUFNFeHRyYWN0b3I6On5NUEVHMlBTRXh0cmFjdG9yKCkgeworICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKIH0KIAogc2l6ZV90IE1QRUcyUFNFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtVHJhY2tzLnNpemUoKTsKIH0KIAotTWVkaWFUcmFjayAqTVBFRzJQU0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpNUEVHMlBTRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKICAgICBpZiAoaW5kZXggPj0gbVRyYWNrcy5zaXplKCkpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMTM0LDIwICsxMzYsMjAgQEAKICAgICByZXR1cm4gbmV3IFdyYXBwZWRUcmFjayh0aGlzLCBtVHJhY2tzLnZhbHVlQXQoaW5kZXgpKTsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorbWVkaWFfc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKGluZGV4ID49IG1UcmFja3Muc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgcmV0dXJuIG1UcmFja3MudmFsdWVBdChpbmRleCktPmdldEZvcm1hdChtZXRhKTsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyUFMpOworbWVkaWFfc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlBTKTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiB1aW50MzJfdCBNUEVHMlBTRXh0cmFjdG9yOjpmbGFncygpIGNvbnN0IHsKQEAgLTYzNSw0MiArNjM3LDU1IEBACiAgICAgbVF1ZXVlID0gTlVMTDsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6c3RhcnQoKSB7CiAgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAotICAgIHJldHVybiBtU291cmNlLT5zdGFydChOVUxMKTsgLy8gQW5vdGhlclBhY2tldFNvdXJjZTo6c3RhcnQgZG9lc24ndCB1c2UgaXRzIGFyZ3VtZW50CisgICAgLy8gaW5pdGlhbGl6ZSB3aXRoIG9uZSBzbWFsbCBidWZmZXIsIGJ1dCBhbGxvdyBncm93dGgKKyAgICBtQnVmZmVyR3JvdXAtPmluaXQoMSAvKiBvbmUgYnVmZmVyICovLCAyNTYgLyogYnVmZmVyIHNpemUgKi8sIDY0IC8qIG1heCBudW1iZXIgb2YgYnVmZmVycyAqLyk7CisKKyAgICBpZiAobVNvdXJjZS0+c3RhcnQoTlVMTCkgPT0gT0spIHsgLy8gQW5vdGhlclBhY2tldFNvdXJjZTo6c3RhcnQgZG9lc24ndCB1c2UgaXRzIGFyZ3VtZW50CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgfQorICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6c3RvcCgpIHsKICAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCi0gICAgcmV0dXJuIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICBpZiAobVNvdXJjZS0+c3RvcCgpID09IE9LKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgfQorICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKK3ZvaWQgY29weUFNZXNzYWdlVG9BTWVkaWFGb3JtYXQoQU1lZGlhRm9ybWF0ICpmb3JtYXQsIHNwPEFNZXNzYWdlPiBtc2cpOworCittZWRpYV9zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgewogICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICBzcDxNZXRhRGF0YT4gc291cmNlTWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOwotICAgIG1ldGEgPSAqc291cmNlTWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgc3A8QU1lc3NhZ2U+IG1zZzsKKyAgICBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2Uoc291cmNlTWV0YSwgJm1zZyk7CisgICAgY29weUFNZXNzYWdlVG9BTWVkaWFGb3JtYXQobWV0YSwgbXNnKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworbWVkaWFfc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKICAgICB3aGlsZSAoIW1Tb3VyY2UtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZmluYWxSZXN1bHQpKSB7CiAgICAgICAgIGlmIChmaW5hbFJlc3VsdCAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgICAgIH0KIAogICAgICAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5mZWVkTW9yZSgpOwpAQCAtNjgwLDcgKzY5NSw1MCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIG1Tb3VyY2UtPnJlYWQoYnVmZmVyLCBvcHRpb25zKTsKKyAgICBNZWRpYUJ1ZmZlckJhc2UgKm1idWY7CisgICAgbVNvdXJjZS0+cmVhZCgmbWJ1ZiwgKE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zKikgb3B0aW9ucyk7CisgICAgc2l6ZV90IGxlbmd0aCA9IG1idWYtPnJhbmdlX2xlbmd0aCgpOworICAgIE1lZGlhQnVmZmVySGVscGVyICpvdXRidWY7CisgICAgbUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmb3V0YnVmLCBmYWxzZSwgbGVuZ3RoKTsKKyAgICBtZW1jcHkob3V0YnVmLT5kYXRhKCksIG1idWYtPmRhdGEoKSwgbGVuZ3RoKTsKKyAgICBvdXRidWYtPnNldF9yYW5nZSgwLCBsZW5ndGgpOworICAgICpidWZmZXIgPSBvdXRidWY7CisgICAgTWV0YURhdGFCYXNlICZpbk1ldGEgPSBtYnVmLT5tZXRhX2RhdGEoKTsKKyAgICBBTWVkaWFGb3JtYXQgKm91dE1ldGEgPSBvdXRidWYtPm1ldGFfZGF0YSgpOworICAgIGludDY0X3QgdmFsNjQ7CisgICAgaWYgKGluTWV0YS5maW5kSW50NjQoa0tleVRpbWUsICZ2YWw2NCkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdmFsNjQpOworICAgIH0KKyAgICBpbnQzMl90IHZhbDMyOworICAgIGlmIChpbk1ldGEuZmluZEludDMyKGtLZXlJc1N5bmNGcmFtZSwgJnZhbDMyKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCB2YWwzMik7CisgICAgfQorICAgIGlmIChpbk1ldGEuZmluZEludDMyKGtLZXlDcnlwdG9Nb2RlLCAmdmFsMzIpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCB2YWwzMik7CisgICAgfQorICAgIHVpbnQzMl90IGJ1ZlR5cGU7CisgICAgY29uc3Qgdm9pZCAqYnVmRGF0YTsKKyAgICBzaXplX3QgYnVmU2l6ZTsKKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlDcnlwdG9JViwgJmJ1ZlR5cGUsICZidWZEYXRhLCAmYnVmU2l6ZSkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19JViwgYnVmRGF0YSwgYnVmU2l6ZSk7CisgICAgfQorICAgIGlmIChpbk1ldGEuZmluZERhdGEoa0tleUNyeXB0b0tleSwgJmJ1ZlR5cGUsICZidWZEYXRhLCAmYnVmU2l6ZSkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlQbGFpblNpemVzLCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1BMQUlOX1NJWkVTLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kRGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsICZidWZUeXBlLCAmYnVmRGF0YSwgJmJ1ZlNpemUpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX1NJWkVTLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kRGF0YShrS2V5U0VJLCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0VJLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kRGF0YShrS2V5QXVkaW9QcmVzZW50YXRpb25JbmZvLCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX0lORk8sIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBtYnVmLT5yZWxlYXNlKCk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2s6OmFwcGVuZFBFU0RhdGEoCkBAIC03MjYsNyArNzg0LDcgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6V3JhcHBlZFRyYWNrKAotICAgICAgICBNUEVHMlBTRXh0cmFjdG9yICpleHRyYWN0b3IsIGNvbnN0IHNwPFRyYWNrPiAmdHJhY2spCisgICAgICAgIE1QRUcyUFNFeHRyYWN0b3IgKmV4dHJhY3RvciwgVHJhY2sgKnRyYWNrKQogICAgIDogbUV4dHJhY3RvcihleHRyYWN0b3IpLAogICAgICAgbVRyYWNrKHRyYWNrKSB7CiB9CkBAIC03MzQsMjcgKzc5MiwyOCBAQAogTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjp+V3JhcHBlZFRyYWNrKCkgewogfQogCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zKSB7Ci0gICAgcmV0dXJuIG1UcmFjay0+c3RhcnQocGFyYW1zKTsKK21lZGlhX3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6c3RhcnQoKSB7CisgICAgbVRyYWNrLT5tQnVmZmVyR3JvdXAgPSBtQnVmZmVyR3JvdXA7CisgICAgcmV0dXJuIG1UcmFjay0+c3RhcnQoKTsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpzdG9wKCkgeworbWVkaWFfc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpzdG9wKCkgewogICAgIHJldHVybiBtVHJhY2stPnN0b3AoKTsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6OmdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpIHsKICAgICByZXR1cm4gbVRyYWNrLT5nZXRGb3JtYXQobWV0YSk7CiB9CiAKLXN0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworbWVkaWFfc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICByZXR1cm4gbVRyYWNrLT5yZWFkKGJ1ZmZlciwgb3B0aW9ucyk7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIGJvb2wgU25pZmZNUEVHMlBTKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CiAgICAgdWludDhfdCBoZWFkZXJbNV07CiAgICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuaAppbmRleCA4YjlkYWQ5Li5lNWQ1OTFmIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuaApAQCAtMTksNyArMTksOCBAQAogI2RlZmluZSBNUEVHMl9QU19FWFRSQUNUT1JfSF8KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KQEAgLTMxLDE0ICszMiwxNCBAQAogc3RydWN0IFRyYWNrOwogY2xhc3MgU3RyaW5nODsKIAotc3RydWN0IE1QRUcyUFNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewotICAgIGV4cGxpY2l0IE1QRUcyUFNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CitzdHJ1Y3QgTVBFRzJQU0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciB7CisgICAgZXhwbGljaXQgTVBFRzJQU0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKIAogICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk1QRUcyUFNFeHRyYWN0b3IiOyB9CkBAIC01MSwxMiArNTIsMTIgQEAKICAgICBzdHJ1Y3QgV3JhcHBlZFRyYWNrOwogCiAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAKICAgICBvZmY2NF90IG1PZmZzZXQ7CiAgICAgc3RhdHVzX3QgbUZpbmFsUmVzdWx0OwogICAgIHNwPEFCdWZmZXI+IG1CdWZmZXI7Ci0gICAgS2V5ZWRWZWN0b3I8dW5zaWduZWQsIHNwPFRyYWNrPiA+IG1UcmFja3M7CisgICAgS2V5ZWRWZWN0b3I8dW5zaWduZWQsIFRyYWNrKiA+IG1UcmFja3M7CiAgICAgYm9vbCBtU2Nhbm5pbmc7CiAKICAgICBib29sIG1Qcm9ncmFtU3RyZWFtTWFwVmFsaWQ7CkBAIC03Miw3ICs3Myw3IEBACiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTVBFRzJQU0V4dHJhY3Rvcik7CiB9OwogCi1ib29sIFNuaWZmTVBFRzJQUyhEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSk7Citib29sIFNuaWZmTVBFRzJQUyhEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5jcHAKaW5kZXggYzgzZjdjZS4uNTBjZTY1NyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuY3BwCkBAIC0yMCwxMSArMjAsMTIgQEAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgorCiAjaW5jbHVkZSAiTVBFRzJUU0V4dHJhY3Rvci5oIgogCiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JU3RyZWFtU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CkBAIC0zMyw2ICszNCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiAjaW5jbHVkZSAibXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgiCkBAIC00OSwxOSArNTEsMTkgQEAKIHN0YXRpYyBjb25zdCBpbnQga01heER1cmF0aW9uUmVhZFNpemUgPSAyNTAwMDBMTDsKIHN0YXRpYyBjb25zdCBpbnQga01heER1cmF0aW9uUmV0cnkgPSA2OwogCi1zdHJ1Y3QgTVBFRzJUU1NvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKK3N0cnVjdCBNUEVHMlRTU291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogICAgIE1QRUcyVFNTb3VyY2UoCiAgICAgICAgICAgICBNUEVHMlRTRXh0cmFjdG9yICpleHRyYWN0b3IsCiAgICAgICAgICAgICBjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCwKICAgICAgICAgICAgIGJvb2wgZG9lc1NlZWspOwogICAgIHZpcnR1YWwgfk1QRUcyVFNTb3VyY2UoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKIAogcHJpdmF0ZToKICAgICBNUEVHMlRTRXh0cmFjdG9yICptRXh0cmFjdG9yOwpAQCAtODYsNTYgKzg4LDE3NCBAQAogTVBFRzJUU1NvdXJjZTo6fk1QRUcyVFNTb3VyY2UoKSB7CiB9CiAKLXN0YXR1c190IE1QRUcyVFNTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqKSB7Ci0gICAgcmV0dXJuIG1JbXBsLT5zdGFydChOVUxMKTsgLy8gQW5vdGhlclBhY2tldFNvdXJjZTo6c3RhcnQoKSBkb2Vzbid0IHVzZSBpdHMgYXJndW1lbnQKK21lZGlhX3N0YXR1c190IE1QRUcyVFNTb3VyY2U6OnN0YXJ0KCkgeworICAgIC8vIGluaXRpYWxpemUgd2l0aCBvbmUgc21hbGwgYnVmZmVyLCBidXQgYWxsb3cgZ3Jvd3RoCisgICAgbUJ1ZmZlckdyb3VwLT5pbml0KDEgLyogb25lIGJ1ZmZlciAqLywgMjU2IC8qIGJ1ZmZlciBzaXplICovLCA2NCAvKiBtYXggbnVtYmVyIG9mIGJ1ZmZlcnMgKi8pOworCisgICAgaWYgKCFtSW1wbC0+c3RhcnQoTlVMTCkpIHsgLy8gQW5vdGhlclBhY2tldFNvdXJjZTo6c3RhcnQoKSBkb2Vzbid0IHVzZSBpdHMgYXJndW1lbnQKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9CisgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogfQogCi1zdGF0dXNfdCBNUEVHMlRTU291cmNlOjpzdG9wKCkgewotICAgIHJldHVybiBtSW1wbC0+c3RvcCgpOworbWVkaWFfc3RhdHVzX3QgTVBFRzJUU1NvdXJjZTo6c3RvcCgpIHsKKyAgICBpZiAoIW1JbXBsLT5zdG9wKCkpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9CisgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogfQogCi1zdGF0dXNfdCBNUEVHMlRTU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7Cit2b2lkIGNvcHlBTWVzc2FnZVRvQU1lZGlhRm9ybWF0KEFNZWRpYUZvcm1hdCAqZm9ybWF0LCBzcDxBTWVzc2FnZT4gbXNnKSB7CisgICAgc2l6ZV90IG51bUVudHJpZXMgPSBtc2ctPmNvdW50RW50cmllcygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtRW50cmllczsgaSsrKSB7CisgICAgICAgIEFNZXNzYWdlOjpUeXBlIHR5cGU7CisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBtc2ctPmdldEVudHJ5TmFtZUF0KGksICZ0eXBlKTsKKyAgICAgICAgQU1lc3NhZ2U6Okl0ZW1EYXRhIGlkID0gbXNnLT5nZXRFbnRyeUF0KGkpOworCisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVJbnQzMjoKKyAgICAgICAgICAgICAgICBpbnQzMl90IHZhbDMyOworICAgICAgICAgICAgICAgIGlmIChpZC5maW5kKCZ2YWwzMikpIHsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGZvcm1hdCwgbmFtZSwgdmFsMzIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlSW50NjQ6CisgICAgICAgICAgICAgICAgaW50NjRfdCB2YWw2NDsKKyAgICAgICAgICAgICAgICBpZiAoaWQuZmluZCgmdmFsNjQpKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChmb3JtYXQsIG5hbWUsIHZhbDY0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUZsb2F0OgorICAgICAgICAgICAgICAgIGZsb2F0IHZhbGZsb2F0OworICAgICAgICAgICAgICAgIGlmIChpZC5maW5kKCZ2YWxmbG9hdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEZsb2F0KGZvcm1hdCwgbmFtZSwgdmFsZmxvYXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlRG91YmxlOgorICAgICAgICAgICAgICAgIGRvdWJsZSB2YWxkb3VibGU7CisgICAgICAgICAgICAgICAgaWYgKGlkLmZpbmQoJnZhbGRvdWJsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldERvdWJsZShmb3JtYXQsIG5hbWUsIHZhbGRvdWJsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVTdHJpbmc6CisgICAgICAgICAgICAgICAgaWYgKEFTdHJpbmcgczsgaWQuZmluZCgmcykpIHsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhmb3JtYXQsIG5hbWUsIHMuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVCdWZmZXI6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworICAgICAgICAgICAgICAgIGlmIChpZC5maW5kKCZidWZmZXIpKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoZm9ybWF0LCBuYW1lLCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nIHVuc3VwcG9ydGVkIHR5cGUgJWQgJyVzJyIsIHR5cGUsIG5hbWUpOworICAgICAgICB9CisgICAgfQorfQorCittZWRpYV9zdGF0dXNfdCBNUEVHMlRTU291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CiAgICAgc3A8TWV0YURhdGE+IGltcGxNZXRhID0gbUltcGwtPmdldEZvcm1hdCgpOwotICAgIG1ldGEgPSAqaW1wbE1ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIHNwPEFNZXNzYWdlPiBtc2c7CisgICAgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKGltcGxNZXRhLCAmbXNnKTsKKyAgICBjb3B5QU1lc3NhZ2VUb0FNZWRpYUZvcm1hdChtZXRhLCBtc2cpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1QRUcyVFNTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKK21lZGlhX3N0YXR1c190IE1QRUcyVFNTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICpvdXQgPSBOVUxMOwogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwogICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBzZWVrTW9kZTsKICAgICBpZiAobURvZXNTZWVrICYmIG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmc2Vla01vZGUpKSB7CiAgICAgICAgIC8vIHNlZWsgaXMgbmVlZGVkCi0gICAgICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPnNlZWsoc2Vla1RpbWVVcywgc2Vla01vZGUpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5zZWVrKHNlZWtUaW1lVXMsIChSZWFkT3B0aW9uczo6U2Vla01vZGUpc2Vla01vZGUpOworICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChtRXh0cmFjdG9yLT5mZWVkVW50aWxCdWZmZXJBdmFpbGFibGUobUltcGwpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgfQogCi0gICAgcmV0dXJuIG1JbXBsLT5yZWFkKG91dCwgb3B0aW9ucyk7CisgICAgTWVkaWFCdWZmZXJCYXNlICptYnVmOworICAgIG1JbXBsLT5yZWFkKCZtYnVmLCAoTWVkaWFUcmFjazo6UmVhZE9wdGlvbnMqKSBvcHRpb25zKTsKKyAgICBzaXplX3QgbGVuZ3RoID0gbWJ1Zi0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKm91dGJ1ZjsKKyAgICBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZvdXRidWYsIGZhbHNlLCBsZW5ndGgpOworICAgIG1lbWNweShvdXRidWYtPmRhdGEoKSwgbWJ1Zi0+ZGF0YSgpLCBsZW5ndGgpOworICAgIG91dGJ1Zi0+c2V0X3JhbmdlKDAsIGxlbmd0aCk7CisgICAgKm91dCA9IG91dGJ1ZjsKKyAgICBNZXRhRGF0YUJhc2UgJmluTWV0YSA9IG1idWYtPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdCAqb3V0TWV0YSA9IG91dGJ1Zi0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG91dE1ldGEpOworICAgIGludDY0X3QgdmFsNjQ7CisgICAgaWYgKGluTWV0YS5maW5kSW50NjQoa0tleVRpbWUsICZ2YWw2NCkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdmFsNjQpOworICAgIH0KKyAgICBpbnQzMl90IHZhbDMyOworICAgIGlmIChpbk1ldGEuZmluZEludDMyKGtLZXlJc1N5bmNGcmFtZSwgJnZhbDMyKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCB2YWwzMik7CisgICAgfQorICAgIGlmIChpbk1ldGEuZmluZEludDMyKGtLZXlDcnlwdG9Nb2RlLCAmdmFsMzIpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCB2YWwzMik7CisgICAgfQorICAgIHVpbnQzMl90IGJ1ZlR5cGU7CisgICAgY29uc3Qgdm9pZCAqYnVmRGF0YTsKKyAgICBzaXplX3QgYnVmU2l6ZTsKKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlDcnlwdG9JViwgJmJ1ZlR5cGUsICZidWZEYXRhLCAmYnVmU2l6ZSkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19JViwgYnVmRGF0YSwgYnVmU2l6ZSk7CisgICAgfQorICAgIGlmIChpbk1ldGEuZmluZERhdGEoa0tleUNyeXB0b0tleSwgJmJ1ZlR5cGUsICZidWZEYXRhLCAmYnVmU2l6ZSkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlQbGFpblNpemVzLCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1BMQUlOX1NJWkVTLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kRGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsICZidWZUeXBlLCAmYnVmRGF0YSwgJmJ1ZlNpemUpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX1NJWkVTLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kRGF0YShrS2V5U0VJLCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0VJLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kRGF0YShrS2V5QXVkaW9QcmVzZW50YXRpb25JbmZvLCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX0lORk8sIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBtYnVmLT5yZWxlYXNlKCk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotTVBFRzJUU0V4dHJhY3Rvcjo6TVBFRzJUU0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorTVBFRzJUU0V4dHJhY3Rvcjo6TVBFRzJUU0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbVBhcnNlcihuZXcgQVRTUGFyc2VyKSwKICAgICAgIG1MYXN0U3luY0V2ZW50KDApLAogICAgICAgbU9mZnNldCgwKSB7CisgICAgY2hhciBoZWFkZXI7CisgICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsICZoZWFkZXIsIDEpID09IDEgJiYgaGVhZGVyID09IDB4NDcpIHsKKyAgICAgICAgbUhlYWRlclNraXAgPSAwOworICAgIH0gZWxzZSB7CisgICAgICAgIG1IZWFkZXJTa2lwID0gNDsKKyAgICB9CiAgICAgaW5pdCgpOwogfQogCitNUEVHMlRTRXh0cmFjdG9yOjp+TVBFRzJUU0V4dHJhY3RvcigpIHsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7Cit9CisKIHNpemVfdCBNUEVHMlRTRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKICAgICByZXR1cm4gbVNvdXJjZUltcGxzLnNpemUoKTsKIH0KIAotTWVkaWFUcmFjayAqTVBFRzJUU0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpNUEVHMlRTRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKICAgICBpZiAoaW5kZXggPj0gbVNvdXJjZUltcGxzLnNpemUoKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0xNDYsMjIgKzI2NiwyMyBAQAogICAgICAgICAgICAgKG1TZWVrU3luY1BvaW50cyA9PSAmbVN5bmNQb2ludHMuZWRpdEl0ZW1BdChpbmRleCkpKTsKIH0KIAotc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorbWVkaWFfc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgc3A8TWV0YURhdGE+IGltcGxNZXRhID0gaW5kZXggPCBtU291cmNlSW1wbHMuc2l6ZSgpCiAgICAgICAgID8gbVNvdXJjZUltcGxzLmVkaXRJdGVtQXQoaW5kZXgpLT5nZXRGb3JtYXQoKSA6IE5VTEw7CiAgICAgaWYgKGltcGxNZXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9Ci0gICAgbWV0YSA9ICppbXBsTWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZTsKKyAgICBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UoaW1wbE1ldGEsICZtc2cpOworICAgIGNvcHlBTWVzc2FnZVRvQU1lZGlhRm9ybWF0KG1ldGEsIG1zZyk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyVFMpOwotCi0gICAgcmV0dXJuIE9LOworbWVkaWFfc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlRTKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiAvL3N0YXRpYwpAQCAtMTcyLDcgKzI5Myw3IEBACiAgICAgICAgICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX1NDUkFNQkxFRCwgbWltZSkpOwogfQogCi1zdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiBjYXNUb2tlbiwgc2l6ZV90IHNpemUpIHsKK21lZGlhX3N0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OnNldE1lZGlhQ2FzKGNvbnN0IHVpbnQ4X3QqIGNhc1Rva2VuLCBzaXplX3Qgc2l6ZSkgewogICAgIEhhbFRva2VuIGhhbFRva2VuOwogICAgIGhhbFRva2VuLnNldFRvRXh0ZXJuYWwoKHVpbnQ4X3QqKWNhc1Rva2VuLCBzaXplKTsKICAgICBzcDxJQ2FzPiBjYXMgPSBJQ2FzOjpjYXN0RnJvbShyZXRyaWV2ZUhhbEludGVyZmFjZShoYWxUb2tlbikpOwpAQCAtMTgyLDIwICszMDMsMjYgQEAKICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgIEFMT0dJKCJBbGwgdHJhY2tzIG5vdyBoYXZlIGRlc2NyYW1ibGVycyIpOwogICAgICAgICBpbml0KCk7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAgICAgfQotICAgIHJldHVybiBlcnI7CisgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOworfQorCitzdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpmaW5kSW5kZXhPZlNvdXJjZShjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCwgc2l6ZV90ICppbmRleCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNvdXJjZUltcGxzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtU291cmNlSW1wbHNbaV0gPT0gaW1wbCkgeworICAgICAgICAgICAgKmluZGV4ID0gaTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CiB9CiAKIHZvaWQgTVBFRzJUU0V4dHJhY3Rvcjo6YWRkU291cmNlKGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsKSB7Ci0gICAgYm9vbCBmb3VuZCA9IGZhbHNlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNvdXJjZUltcGxzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChtU291cmNlSW1wbHNbaV0gPT0gaW1wbCkgewotICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFmb3VuZCkgeworICAgIHNpemVfdCBpbmRleDsKKyAgICBpZiAoZmluZEluZGV4T2ZTb3VyY2UoaW1wbCwgJmluZGV4KSAhPSBPSykgewogICAgICAgICBtU291cmNlSW1wbHMucHVzaChpbXBsKTsKKyAgICAgICAgbVN5bmNQb2ludHMucHVzaCgpOwogICAgIH0KIH0KIApAQCAtMjAzLDYgKzMzMCw3IEBACiAgICAgYm9vbCBoYXZlQXVkaW8gPSBmYWxzZTsKICAgICBib29sIGhhdmVWaWRlbyA9IGZhbHNlOwogICAgIGludDY0X3Qgc3RhcnRUaW1lID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICBzaXplX3QgaW5kZXg7CiAKICAgICBzdGF0dXNfdCBlcnI7CiAgICAgd2hpbGUgKChlcnIgPSBmZWVkTW9yZSh0cnVlIC8qIGlzSW5pdCAqLykpID09IE9LCkBAIC0yMjEsOCArMzQ5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgaGF2ZVZpZGVvID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgYWRkU291cmNlKGltcGwpOwogICAgICAgICAgICAgICAgICAgICBpZiAoIWlzU2NyYW1ibGVkRm9ybWF0KCooZm9ybWF0LmdldCgpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TeW5jUG9pbnRzLnB1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWVrU3luY1BvaW50cyA9ICZtU3luY1BvaW50cy5lZGl0VG9wKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluZEluZGV4T2ZTb3VyY2UoaW1wbCwgJmluZGV4KSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWVrU3luY1BvaW50cyA9ICZtU3luY1BvaW50cy5lZGl0SXRlbUF0KGluZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTIzNiwxMCArMzY1LDkgQEAKICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgaGF2ZUF1ZGlvID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgYWRkU291cmNlKGltcGwpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIWlzU2NyYW1ibGVkRm9ybWF0KCooZm9ybWF0LmdldCgpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TeW5jUG9pbnRzLnB1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGF2ZVZpZGVvKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlZWtTeW5jUG9pbnRzID0gJm1TeW5jUG9pbnRzLmVkaXRUb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1NjcmFtYmxlZEZvcm1hdCgqKGZvcm1hdC5nZXQoKSkpICYmICFoYXZlVmlkZW8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaW5kSW5kZXhPZlNvdXJjZShpbXBsLCAmaW5kZXgpID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlZWtTeW5jUG9pbnRzID0gJm1TeW5jUG9pbnRzLmVkaXRJdGVtQXQoaW5kZXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQpAQCAtMjYwLDIyICszODgsMTkgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIFdhaXQgb25seSBmb3IgMiBzZWNvbmRzIHRvIGRldGVjdCBhdWRpby92aWRlbyBzdHJlYW1zLgotICAgICAgICBpZiAoQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZSA+IDIwMDAwMDBsbCkgeworICAgICAgICBpZiAoQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZSA+IDIwMDAwMDBMTCkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBvZmY2NF90IHNpemU7CiAgICAgaWYgKG1EYXRhU291cmNlLT5nZXRTaXplKCZzaXplKSA9PSBPSyAmJiAoaGF2ZUF1ZGlvIHx8IGhhdmVWaWRlbykpIHsKLSAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gaW1wbCA9IGhhdmVWaWRlbwotICAgICAgICAgICAgICAgID8gbVBhcnNlci0+Z2V0U291cmNlKEFUU1BhcnNlcjo6VklERU8pCi0gICAgICAgICAgICAgICAgOiBtUGFyc2VyLT5nZXRTb3VyY2UoQVRTUGFyc2VyOjpBVURJTyk7CiAgICAgICAgIHNpemVfdCBwcmV2U3luY1NpemUgPSAxOwogICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSAtMTsKICAgICAgICAgTGlzdDxpbnQ2NF90PiBkdXJhdGlvbnM7CiAgICAgICAgIC8vIEVzdGltYXRlIGR1cmF0aW9uIC0tLSBzdGFiaWxpemUgdW50aWwgeW91IGdldCA8NTAwbXMgZGV2aWF0aW9uLgogICAgICAgICB3aGlsZSAoZmVlZE1vcmUoKSA9PSBPSwotICAgICAgICAgICAgICAgICYmIEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWUgPD0gMjAwMDAwMGxsKSB7CisgICAgICAgICAgICAgICAgJiYgQUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZSA8PSAyMDAwMDAwTEwpIHsKICAgICAgICAgICAgIGlmIChtU2Vla1N5bmNQb2ludHMtPnNpemUoKSA+IHByZXZTeW5jU2l6ZSkgewogICAgICAgICAgICAgICAgIHByZXZTeW5jU2l6ZSA9IG1TZWVrU3luY1BvaW50cy0+c2l6ZSgpOwogICAgICAgICAgICAgICAgIGludDY0X3QgZGlmZlVzID0gbVNlZWtTeW5jUG9pbnRzLT5rZXlBdChwcmV2U3luY1NpemUgLSAxKQpAQCAtMzAzLDE3ICs0MjgsMzIgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgc3RhdHVzX3QgZXJyOwotICAgICAgICBpbnQ2NF90IGJ1ZmZlcmVkRHVyYXRpb25VczsKLSAgICAgICAgYnVmZmVyZWREdXJhdGlvblVzID0gaW1wbC0+Z2V0QnVmZmVyZWREdXJhdGlvblVzKCZlcnIpOwotICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgICAgIGR1cmF0aW9uVXMgPSBidWZmZXJlZER1cmF0aW9uVXM7CisKKyAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEFUU1BhcnNlcjo6TlVNX1NPVVJDRV9UWVBFUzsgKytpKSB7CisgICAgICAgICAgICBBVFNQYXJzZXI6OlNvdXJjZVR5cGUgdHlwZSA9IHN0YXRpY19jYXN0PEFUU1BhcnNlcjo6U291cmNlVHlwZT4oaSk7CisgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBpbXBsID0gbVBhcnNlci0+Z2V0U291cmNlKHR5cGUpOworICAgICAgICAgICAgaWYgKGltcGwgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQ2NF90IHRyYWNrRHVyYXRpb25VcyA9IGR1cmF0aW9uVXM7CisKKyAgICAgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgICAgIGludDY0X3QgYnVmZmVyZWREdXJhdGlvblVzID0gaW1wbC0+Z2V0QnVmZmVyZWREdXJhdGlvblVzKCZlcnIpOworICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICAgICAgdHJhY2tEdXJhdGlvblVzID0gYnVmZmVyZWREdXJhdGlvblVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRyYWNrRHVyYXRpb25VcyA+IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiW1NvdXJjZVR5cGUlZF0gZHVyYXRpb25Vcz0lIiBQUklkNjQgIiIsIHR5cGUsIHRyYWNrRHVyYXRpb25Vcyk7CisgICAgICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+IG1ldGEgPSBpbXBsLT5nZXRGb3JtYXQoKTsKKyAgICAgICAgICAgICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIHRyYWNrRHVyYXRpb25Vcyk7CisgICAgICAgICAgICAgICAgaW1wbC0+c2V0Rm9ybWF0KG1ldGEpOworCisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmIChkdXJhdGlvblVzID4gMCkgewotICAgICAgICAgICAgY29uc3Qgc3A8TWV0YURhdGE+IG1ldGEgPSBpbXBsLT5nZXRGb3JtYXQoKTsKLSAgICAgICAgICAgIG1ldGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7Ci0gICAgICAgICAgICBpbXBsLT5zZXRGb3JtYXQobWV0YSk7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghZm91bmQpIHsKICAgICAgICAgICAgIGVzdGltYXRlRHVyYXRpb25zRnJvbVRpbWVzVXNBdEVuZCgpOwogICAgICAgICB9CiAgICAgfQpAQCAtMzI2LDcgKzQ2Niw3IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIHVpbnQ4X3QgcGFja2V0W2tUU1BhY2tldFNpemVdOwotICAgIHNzaXplX3QgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQobU9mZnNldCwgcGFja2V0LCBrVFNQYWNrZXRTaXplKTsKKyAgICBzc2l6ZV90IG4gPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG1PZmZzZXQgKyBtSGVhZGVyU2tpcCwgcGFja2V0LCBrVFNQYWNrZXRTaXplKTsKIAogICAgIGlmIChuIDwgKHNzaXplX3Qpa1RTUGFja2V0U2l6ZSkgewogICAgICAgICBpZiAobiA+PSAwKSB7CkBAIC0zMzYsNyArNDc2LDcgQEAKICAgICB9CiAKICAgICBBVFNQYXJzZXI6OlN5bmNFdmVudCBldmVudChtT2Zmc2V0KTsKLSAgICBtT2Zmc2V0ICs9IG47CisgICAgbU9mZnNldCArPSBtSGVhZGVyU2tpcCArIG47CiAgICAgc3RhdHVzX3QgZXJyID0gbVBhcnNlci0+ZmVlZFRTUGFja2V0KHBhY2tldCwga1RTUGFja2V0U2l6ZSwgJmV2ZW50KTsKICAgICBpZiAoZXZlbnQuaGFzUmV0dXJuZWREYXRhKCkpIHsKICAgICAgICAgaWYgKGlzSW5pdCkgewpAQCAtNDA1LDE1ICs1NDUsMTUgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgc3NpemVfdCBuID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIHBhY2tldCwga1RTUGFja2V0U2l6ZSk7CisgICAgICAgICAgICBzc2l6ZV90IG4gPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCttSGVhZGVyU2tpcCwgcGFja2V0LCBrVFNQYWNrZXRTaXplKTsKICAgICAgICAgICAgIGlmIChuIDwgMCkgewogICAgICAgICAgICAgICAgIHJldHVybiBuOwogICAgICAgICAgICAgfSBlbHNlIGlmIChuIDwgKHNzaXplX3Qpa1RTUGFja2V0U2l6ZSkgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBvZmZzZXQgKz0ga1RTUGFja2V0U2l6ZTsKLSAgICAgICAgICAgIGJ5dGVzUmVhZCArPSBrVFNQYWNrZXRTaXplOworICAgICAgICAgICAgb2Zmc2V0ICs9IGtUU1BhY2tldFNpemUgKyBtSGVhZGVyU2tpcDsKKyAgICAgICAgICAgIGJ5dGVzUmVhZCArPSBrVFNQYWNrZXRTaXplICsgbUhlYWRlclNraXA7CiAgICAgICAgICAgICBlcnIgPSBwYXJzZXItPmZlZWRUU1BhY2tldChwYWNrZXQsIGtUU1BhY2tldFNpemUsICZldik7CiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKQEAgLTQ3Nyw3ICs2MTcsNyBAQAogfQogCiBzdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpzZWVrKGludDY0X3Qgc2Vla1RpbWVVcywKLSAgICAgICAgY29uc3QgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlICZzZWVrTW9kZSkgeworICAgICAgICBjb25zdCBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgJnNlZWtNb2RlKSB7CiAgICAgaWYgKG1TZWVrU3luY1BvaW50cyA9PSBOVUxMIHx8IG1TZWVrU3luY1BvaW50cy0+aXNFbXB0eSgpKSB7CiAgICAgICAgIEFMT0dXKCJObyBzeW5jIHBvaW50IHRvIHNlZWsgdG8uIik7CiAgICAgICAgIC8vIC4uLiBhbmQgdGhlcmVmb3JlIHdlIGhhdmUgbm90aGluZyB1c2VmdWwgdG8gZG8gaGVyZS4KQEAgLTQ5OCwxOCArNjM4LDE4IEBACiAgICAgfQogCiAgICAgc3dpdGNoIChzZWVrTW9kZSkgewotICAgICAgICBjYXNlIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQzoKKyAgICAgICAgY2FzZSBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9uczo6U0VFS19ORVhUX1NZTkM6CiAgICAgICAgICAgICBpZiAoaW5kZXggPT0gbVNlZWtTeW5jUG9pbnRzLT5zaXplKCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiTmV4dCBzeW5jIG5vdCBmb3VuZDsgc3RhcnRpbmcgZnJvbSB0aGUgbGF0ZXN0IHN5bmMuIik7CiAgICAgICAgICAgICAgICAgLS1pbmRleDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQzoKLSAgICAgICAgY2FzZSBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUOgorICAgICAgICBjYXNlIE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1RfU1lOQzoKKyAgICAgICAgY2FzZSBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUOgogICAgICAgICAgICAgQUxPR1coInNlZWtNb2RlIG5vdCBzdXBwb3J0ZWQ6ICVkOyBmYWxsaW5nIGJhY2sgdG8gUFJFVklPVVNfU1lOQyIsCiAgICAgICAgICAgICAgICAgICAgIHNlZWtNb2RlKTsKLSAgICAgICAgICAgIC8vIGZhbGwtdGhyb3VnaAotICAgICAgICBjYXNlIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM6CisgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKKyAgICAgICAgY2FzZSBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DOgogICAgICAgICAgICAgaWYgKGluZGV4ID09IDApIHsKICAgICAgICAgICAgICAgICBBTE9HVygiUHJldmlvdXMgc3luYyBub3QgZm91bmQ7IHN0YXJ0aW5nIGZyb20gdGhlIGVhcmxpZXN0ICIKICAgICAgICAgICAgICAgICAgICAgICAgICJzeW5jLiIpOwpAQCAtNjUyLDEyICs3OTIsMjIgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotYm9vbCBTbmlmZk1QRUcyVFMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKK2Jvb2wgU25pZmZNUEVHMlRTKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgewogICAgICAgICBjaGFyIGhlYWRlcjsKICAgICAgICAgaWYgKHNvdXJjZS0+cmVhZEF0KGtUU1BhY2tldFNpemUgKiBpLCAmaGVhZGVyLCAxKSAhPSAxCiAgICAgICAgICAgICAgICAgfHwgaGVhZGVyICE9IDB4NDcpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIC8vIG5vdCB0cyBmaWxlLCBjaGVjayBpZiBtMnRzIGZpbGUKKyAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgNTsgKytqKSB7CisgICAgICAgICAgICAgICAgY2hhciBoZWFkZXJzWzVdOworICAgICAgICAgICAgICAgIGlmIChzb3VyY2UtPnJlYWRBdCgoa1RTUGFja2V0U2l6ZSArIDQpICogaiwgJmhlYWRlcnMsIDUpICE9IDUKKyAgICAgICAgICAgICAgICAgICAgfHwgaGVhZGVyc1s0XSAhPSAweDQ3KSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBtMnRzIGZpbGUgdG9vLCByZXR1cm4KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJ0aGlzIGlzIG0ydHMgZmlsZVxuIik7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuaAppbmRleCBjYmRkM2NiLi5kY2QxZTdiIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuaApAQCAtMjAsOCArMjAsOCBAQAogI2RlZmluZSBNUEVHMl9UU19FWFRSQUNUT1JfSF8KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CkBAIC0zNCwzMCArMzQsMzMgQEAKIHN0cnVjdCBBTWVzc2FnZTsKIHN0cnVjdCBBbm90aGVyUGFja2V0U291cmNlOwogc3RydWN0IEFUU1BhcnNlcjsKLWNsYXNzIERhdGFTb3VyY2VCYXNlOworc3RydWN0IENEYXRhU291cmNlOwogc3RydWN0IE1QRUcyVFNTb3VyY2U7CiBjbGFzcyBTdHJpbmc4OwogCi1zdHJ1Y3QgTVBFRzJUU0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7Ci0gICAgZXhwbGljaXQgTVBFRzJUU0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKTsKK3N0cnVjdCBNUEVHMlRTRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKKyAgICBleHBsaWNpdCBNUEVHMlRTRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiAvKmNhc1Rva2VuKi8sIHNpemVfdCAvKnNpemUqLykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiAvKmNhc1Rva2VuKi8sIHNpemVfdCAvKnNpemUqLykgb3ZlcnJpZGU7CiAKICAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJNUEVHMlRTRXh0cmFjdG9yIjsgfQogCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TVBFRzJUU0V4dHJhY3RvcigpOworCiBwcml2YXRlOgogICAgIGZyaWVuZCBzdHJ1Y3QgTVBFRzJUU1NvdXJjZTsKIAogICAgIG11dGFibGUgTXV0ZXggbUxvY2s7CiAKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAKICAgICBzcDxBVFNQYXJzZXI+IG1QYXJzZXI7CiAKQEAgLTgxLDI3ICs4NCwyOSBAQAogICAgIC8vIFRyeSB0byBmZWVkIG1vcmUgZGF0YSBmcm9tIHNvdXJjZSB0byBwYXJzZXIuCiAgICAgLy8gfGlzSW5pdHwgbWVhbnMgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgaW5zaWRlIGluaXQoKS4gVGhpcyBpcyBhIHNpZ25hbCB0bwogICAgIC8vIHNhdmUgU3luY0V2ZW50IHNvIHRoYXQgaW5pdCgpIGNhbiBhZGQgU3luY1BvaW50IGFmdGVyIGl0IHVwZGF0ZXMgfG1Tb3VyY2VJbXBsc3wuCi0gICAgLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIE9LIGlmIGV4cGVjdGVkIGFtb3VudCBvZiBkYXRhIGlzIGZlZCBmcm9tIERhdGFTb3VyY2VCYXNlIHRvCisgICAgLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIE9LIGlmIGV4cGVjdGVkIGFtb3VudCBvZiBkYXRhIGlzIGZlZCBmcm9tIERhdGFTb3VyY2VIZWxwZXIgdG8KICAgICAvLyBwYXJzZXIgYW5kIGlzIHN1Y2Nlc3NmdWxseSBwYXJzZWQuIE90aGVyd2lzZSwgdmFyaW91cyBlcnJvciBjb2RlcyBjb3VsZCBiZQotICAgIC8vIHJldHVybmVkLCBlLmcuLCBFUlJPUl9FTkRfT0ZfU1RSRUFNLCBvciBubyBkYXRhIGF2YWlsYWxiZSBmcm9tIERhdGFTb3VyY2VCYXNlLCBvcgorICAgIC8vIHJldHVybmVkLCBlLmcuLCBFUlJPUl9FTkRfT0ZfU1RSRUFNLCBvciBubyBkYXRhIGF2YWlsYWxiZSBmcm9tIERhdGFTb3VyY2VIZWxwZXIsIG9yCiAgICAgLy8gdGhlIGRhdGEgaGFzIHN5bnRheCBlcnJvciBkdXJpbmcgcGFyc2luZywgZXRjLgogICAgIHN0YXR1c190IGZlZWRNb3JlKGJvb2wgaXNJbml0ID0gZmFsc2UpOwogICAgIHN0YXR1c190IHNlZWsoaW50NjRfdCBzZWVrVGltZVVzLAotICAgICAgICAgICAgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSYgc2Vla01vZGUpOworICAgICAgICAgICAgY29uc3QgTWVkaWFUcmFja0hlbHBlcjo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlJiBzZWVrTW9kZSk7CiAgICAgc3RhdHVzX3QgcXVldWVEaXNjb250aW51aXR5Rm9yU2VlayhpbnQ2NF90IGFjdHVhbFNlZWtUaW1lVXMpOwogICAgIHN0YXR1c190IHNlZWtCZXlvbmQoaW50NjRfdCBzZWVrVGltZVVzKTsKIAogICAgIHN0YXR1c190IGZlZWRVbnRpbEJ1ZmZlckF2YWlsYWJsZShjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCk7CisgICAgc3RhdHVzX3QgZmluZEluZGV4T2ZTb3VyY2UoY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwsIHNpemVfdCAqaW5kZXgpOwogCiAgICAgLy8gQWRkIGEgU3luUG9pbnQgZGVyaXZlZCBmcm9tIHxldmVudHwuCiAgICAgdm9pZCBhZGRTeW5jUG9pbnRfbChjb25zdCBBVFNQYXJzZXI6OlN5bmNFdmVudCAmZXZlbnQpOwogCiAgICAgc3RhdHVzX3QgIGVzdGltYXRlRHVyYXRpb25zRnJvbVRpbWVzVXNBdEVuZCgpOwogCisgICAgc2l6ZV90IG1IZWFkZXJTa2lwOwogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1QRUcyVFNFeHRyYWN0b3IpOwogfTsKIAotYm9vbCBTbmlmZk1QRUcyVFMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpOworYm9vbCBTbmlmZk1QRUcyVFMoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSk7CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL29nZy9BbmRyb2lkLmJwCmluZGV4IDdjNmZjNzUuLjYwNGVjNTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvQW5kcm9pZC5icApAQCAtNywxMyArNywxOCBAQAogICAgICAgICAiZXh0ZXJuYWwvdHJlbW9sbyIsCiAgICAgXSwKIAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb19zeXN0ZW1faGVhZGVycyIsCisgICAgXSwKKwogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlibWVkaWFuZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYnZvcmJpc2lkZWMiLAogICAgIF0sCkBAIC0zNiw5ICs0MSw2IEBACiAgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKIAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvT2dnRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5jcHAKaW5kZXggYjJmZTY5Yy4uNzJiOTRiYiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvT2dnRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL29nZy9PZ2dFeHRyYWN0b3IuY3BwCkBAIC0yMSwxOSArMjEsMTcgQEAKICNpbmNsdWRlICJPZ2dFeHRyYWN0b3IuaCIKIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9FeHRyYWN0b3JVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KLSNpbmNsdWRlIDxtZWRpYS9Wb3JiaXNDb21tZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogZXh0ZXJuICJDIiB7CkBAIC00NywxNiArNDUsMTYgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgT2dnU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworc3RydWN0IE9nZ1NvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyIHsKICAgICBleHBsaWNpdCBPZ2dTb3VyY2UoT2dnRXh0cmFjdG9yICpleHRyYWN0b3IpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICYpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5PZ2dTb3VyY2UoKTsKQEAgLTcxLDI4ICs2OSwzMCBAQAogCiBzdHJ1Y3QgTXlPZ2dFeHRyYWN0b3IgewogICAgIE15T2dnRXh0cmFjdG9yKAotICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKKyAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWVUeXBlLAogICAgICAgICAgICAgc2l6ZV90IG51bUhlYWRlcnMsCiAgICAgICAgICAgICBpbnQ2NF90IHNlZWtQcmVSb2xsVXMpOwogICAgIHZpcnR1YWwgfk15T2dnRXh0cmFjdG9yKCk7CiAKLSAgICBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICYpIGNvbnN0OworICAgIG1lZGlhX3N0YXR1c190IGdldEZvcm1hdChBTWVkaWFGb3JtYXQgKikgY29uc3Q7CiAKICAgICAvLyBSZXR1cm5zIGFuIGFwcHJveGltYXRlIGJpdHJhdGUgaW4gYml0cyBwZXIgc2Vjb25kLgogICAgIHZpcnR1YWwgdWludDY0X3QgYXBwcm94Qml0cmF0ZSgpIGNvbnN0ID0gMDsKIAogICAgIHN0YXR1c190IHNlZWtUb1RpbWUoaW50NjRfdCB0aW1lVXMpOwogICAgIHN0YXR1c190IHNlZWtUb09mZnNldChvZmY2NF90IG9mZnNldCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIpID0gMDsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyKSA9IDA7CiAKICAgICBzdGF0dXNfdCBpbml0KCk7CiAKLSAgICBzdGF0dXNfdCBnZXRGaWxlTWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgICAgIG1ldGEgPSBtRmlsZU1ldGE7Ci0gICAgICAgIHJldHVybiBPSzsKKyAgICBtZWRpYV9zdGF0dXNfdCBnZXRGaWxlTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtRmlsZU1ldGEpOwogICAgIH0KIAorICAgIHZvaWQgc2V0QnVmZmVyR3JvdXAoTWVkaWFCdWZmZXJHcm91cEhlbHBlciAqZ3JvdXApIHsKKyAgICAgICAgbUJ1ZmZlckdyb3VwID0gZ3JvdXA7CisgICAgfQogcHJvdGVjdGVkOgogICAgIHN0cnVjdCBQYWdlIHsKICAgICAgICAgdWludDY0X3QgbUdyYW51bGVQb3NpdGlvbjsKQEAgLTExMCw3ICsxMTAsOCBAQAogICAgICAgICBpbnQ2NF90IG1UaW1lVXM7CiAgICAgfTsKIAotICAgIERhdGFTb3VyY2VCYXNlICptU291cmNlOworICAgIE1lZGlhQnVmZmVyR3JvdXBIZWxwZXIgKm1CdWZmZXJHcm91cDsKKyAgICBEYXRhU291cmNlSGVscGVyICptU291cmNlOwogICAgIG9mZjY0X3QgbU9mZnNldDsKICAgICBQYWdlIG1DdXJyZW50UGFnZTsKICAgICB1aW50NjRfdCBtQ3VyR3JhbnVsZVBvc2l0aW9uOwpAQCAtMTI5LDExICsxMzAsMTMgQEAKICAgICB2b3JiaXNfaW5mbyBtVmk7CiAgICAgdm9yYmlzX2NvbW1lbnQgbVZjOwogCi0gICAgTWV0YURhdGFCYXNlIG1NZXRhOwotICAgIE1ldGFEYXRhQmFzZSBtRmlsZU1ldGE7CisgICAgQU1lZGlhRm9ybWF0ICptTWV0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1GaWxlTWV0YTsKIAogICAgIFZlY3RvcjxUT0NFbnRyeT4gbVRhYmxlT2ZDb250ZW50czsKIAorICAgIGludDMyX3QgbUhhcHRpY0NoYW5uZWxDb3VudDsKKwogICAgIHNzaXplX3QgcmVhZFBhZ2Uob2ZmNjRfdCBvZmZzZXQsIFBhZ2UgKnBhZ2UpOwogICAgIHN0YXR1c190IGZpbmROZXh0UGFnZShvZmY2NF90IHN0YXJ0T2Zmc2V0LCBvZmY2NF90ICpwYWdlT2Zmc2V0KTsKIApAQCAtMTQ2LDcgKzE0OSw3IEBACiAgICAgLy8gMSAtIGJpdHN0cmVhbSBpZGVudGlmaWNhdGlvbiBoZWFkZXIKICAgICAvLyAzIC0gY29tbWVudCBoZWFkZXIKICAgICAvLyA1IC0gY29kZWMgc2V0dXAgaGVhZGVyIChWb3JiaXMgb25seSkKLSAgICB2aXJ0dWFsIHN0YXR1c190IHZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciwgdWludDhfdCB0eXBlKSA9IDA7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCB2ZXJpZnlIZWFkZXIoTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlciwgdWludDhfdCB0eXBlKSA9IDA7CiAKICAgICAvLyBSZWFkIHRoZSBuZXh0IG9nZyBwYWNrZXQgZnJvbSB0aGUgdW5kZXJseWluZyBkYXRhIHNvdXJjZTsgb3B0aW9uYWxseQogICAgIC8vIGNhbGN1bGF0ZSB0aGUgdGltZXN0YW1wIGZvciB0aGUgb3V0cHV0IHBhY2tldCB3aGlsc3QgcHJldGVuZGluZwpAQCAtMTU0LDkgKzE1Nyw5IEBACiAgICAgLy8KICAgICAvLyAqYnVmZmVyIGlzIE5VTEwnZWQgb3V0IGltbWVkaWF0ZWx5IHVwb24gZW50cnksIGFuZCBpZiBzdWNjZXNzZnVsIGEgbmV3IGJ1ZmZlciBpcyBhbGxvY2F0ZWQ7CiAgICAgLy8gY2xpZW50cyBhcmUgcmVzcG9uc2libGUgZm9yIHJlbGVhc2luZyB0aGUgb3JpZ2luYWwgYnVmZmVyLgotICAgIHN0YXR1c190IF9yZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGJvb2wgY2FsY1ZvcmJpc1RpbWVzdGFtcCk7CisgICAgbWVkaWFfc3RhdHVzX3QgX3JlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBib29sIGNhbGNWb3JiaXNUaW1lc3RhbXApOwogCi0gICAgaW50MzJfdCBnZXRQYWNrZXRCbG9ja1NpemUoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpOworICAgIGludDMyX3QgZ2V0UGFja2V0QmxvY2tTaXplKE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIpOwogCiAgICAgdm9pZCBwYXJzZUZpbGVNZXRhRGF0YSgpOwogCkBAIC0xNjQsMTIgKzE2NywxNCBAQAogCiAgICAgdm9pZCBidWlsZFRhYmxlT2ZDb250ZW50cygpOwogCisgICAgdm9pZCBzZXRDaGFubmVsTWFzayhpbnQgY2hhbm5lbENvdW50KTsKKwogICAgIE15T2dnRXh0cmFjdG9yKGNvbnN0IE15T2dnRXh0cmFjdG9yICYpOwogICAgIE15T2dnRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgTXlPZ2dFeHRyYWN0b3IgJik7CiB9OwogCiBzdHJ1Y3QgTXlWb3JiaXNFeHRyYWN0b3IgOiBwdWJsaWMgTXlPZ2dFeHRyYWN0b3IgewotICAgIGV4cGxpY2l0IE15Vm9yYmlzRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCisgICAgZXhwbGljaXQgTXlWb3JiaXNFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgICAgICA6IE15T2dnRXh0cmFjdG9yKHNvdXJjZSwKICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMsCiAgICAgICAgICAgICAgICAgLyogbnVtSGVhZGVycyAqLyAzLApAQCAtMTc4LDcgKzE4Myw3IEBACiAKICAgICB2aXJ0dWFsIHVpbnQ2NF90IGFwcHJveEJpdHJhdGUoKSBjb25zdDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyKSB7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlcikgewogICAgICAgICByZXR1cm4gX3JlYWROZXh0UGFja2V0KGJ1ZmZlciwgLyogY2FsY1ZvcmJpc1RpbWVzdGFtcCA9ICovIHRydWUpOwogICAgIH0KIApAQCAtMTkwLDE0ICsxOTUsMTQgQEAKICAgICAgICAgcmV0dXJuIGdyYW51bGVQb3MgKiAxMDAwMDAwbGwgLyBtVmkucmF0ZTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciwgdWludDhfdCB0eXBlKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyLCB1aW50OF90IHR5cGUpOwogfTsKIAogc3RydWN0IE15T3B1c0V4dHJhY3RvciA6IHB1YmxpYyBNeU9nZ0V4dHJhY3RvciB7CiAgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga09wdXNTYW1wbGVSYXRlID0gNDgwMDA7CiAgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga09wdXNTZWVrUHJlUm9sbFVzID0gODAwMDA7IC8vIDgwIG1zCiAKLSAgICBleHBsaWNpdCBNeU9wdXNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKKyAgICBleHBsaWNpdCBNeU9wdXNFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgICAgICA6IE15T2dnRXh0cmFjdG9yKHNvdXJjZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUywgLypudW1IZWFkZXJzKi8gMiwga09wdXNTZWVrUHJlUm9sbFVzKSwKICAgICAgICAgICBtQ2hhbm5lbENvdW50KDApLAogICAgICAgICAgIG1Db2RlY0RlbGF5KDApLApAQCAtMjA4LDE2ICsyMTMsMTYgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCBpbnQ2NF90IGdldFRpbWVVc09mR3JhbnVsZSh1aW50NjRfdCBncmFudWxlUG9zKSBjb25zdDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciwgdWludDhfdCB0eXBlKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyLCB1aW50OF90IHR5cGUpOwogCiBwcml2YXRlOgotICAgIHN0YXR1c190IHZlcmlmeU9wdXNIZWFkZXIoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpOwotICAgIHN0YXR1c190IHZlcmlmeU9wdXNDb21tZW50cyhNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7Ci0gICAgdWludDMyX3QgZ2V0TnVtU2FtcGxlc0luUGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSBjb25zdDsKKyAgICBtZWRpYV9zdGF0dXNfdCB2ZXJpZnlPcHVzSGVhZGVyKE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIpOworICAgIG1lZGlhX3N0YXR1c190IHZlcmlmeU9wdXNDb21tZW50cyhNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyKTsKKyAgICB1aW50MzJfdCBnZXROdW1TYW1wbGVzSW5QYWNrZXQoTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcikgY29uc3Q7CiAKICAgICB1aW50OF90IG1DaGFubmVsQ291bnQ7CiAgICAgdWludDE2X3QgbUNvZGVjRGVsYXk7CkBAIC0yMzcsMjggKzI0MiwzMCBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgT2dnU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7CittZWRpYV9zdGF0dXNfdCBPZ2dTb3VyY2U6OmdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpIHsKICAgICByZXR1cm4gbUV4dHJhY3Rvci0+bUltcGwtPmdldEZvcm1hdChtZXRhKTsKIH0KIAotc3RhdHVzX3QgT2dnU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKiAvKiBwYXJhbXMgKi8pIHsKK21lZGlhX3N0YXR1c190IE9nZ1NvdXJjZTo6c3RhcnQoKSB7CiAgICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0KKyAgICAvLyBpbml0aWFsaXplIGJ1ZmZlciBncm91cCB3aXRoIGEgc2luZ2xlIHNtYWxsIGJ1ZmZlciwgYnV0IGEgZ2VuZXJvdXMgdXBwZXIgbGltaXQKKyAgICBtQnVmZmVyR3JvdXAtPmluaXQoMSAvKiBudW1iZXIgb2YgYnVmZmVycyAqLywgMTI4IC8qIHNpemUgKi8sIDY0IC8qIG1heCBudW1iZXIgb2YgYnVmZmVycyAqLyk7CisgICAgbUV4dHJhY3Rvci0+bUltcGwtPnNldEJ1ZmZlckdyb3VwKG1CdWZmZXJHcm91cCk7CiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE9nZ1NvdXJjZTo6c3RvcCgpIHsKK21lZGlhX3N0YXR1c190IE9nZ1NvdXJjZTo6c3RvcCgpIHsKICAgICBtU3RhcnRlZCA9IGZhbHNlOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE9nZ1NvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworbWVkaWFfc3RhdHVzX3QgT2dnU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICAqb3V0ID0gTlVMTDsKIAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKQEAgLTI2Niw0MSArMjczLDQzIEBACiAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+bUltcGwtPnNlZWtUb1RpbWUoc2Vla1RpbWVVcyk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKnBhY2tldDsKLSAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5tSW1wbC0+cmVhZE5leHRQYWNrZXQoJnBhY2tldCk7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKnBhY2tldDsKKyAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5tSW1wbC0+cmVhZE5leHRQYWNrZXQoJnBhY2tldCk7CiAKLSAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgaWYgKGVyciAhPSBBTUVESUFfT0spIHsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBwYWNrZXQtPm1ldGFfZGF0YSgpOwogI2lmIDAKICAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBpZiAocGFja2V0LT5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKSB7CisgICAgaWYgKEFNZWRpYUZvcm1hdF9maW5kSW50NjQobWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCB0aW1lU3RhbXBVcykpIHsKICAgICAgICAgQUxPR0koImZvdW5kIHRpbWUgPSAlbGxkIHVzIiwgdGltZVVzKTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HSSgiTk8gdGltZSIpOwogICAgIH0KICNlbmRpZgogCi0gICAgcGFja2V0LT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogCiAgICAgKm91dCA9IHBhY2tldDsKLQotICAgIHJldHVybiBPSzsKKyAgICBBTE9HVigicmV0dXJuaW5nIGJ1ZmZlciAlcCIsIHBhY2tldCk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogTXlPZ2dFeHRyYWN0b3I6Ok15T2dnRXh0cmFjdG9yKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsCiAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWVUeXBlLAogICAgICAgICBzaXplX3QgbnVtSGVhZGVycywKICAgICAgICAgaW50NjRfdCBzZWVrUHJlUm9sbFVzKQotICAgIDogbVNvdXJjZShzb3VyY2UpLAorICAgIDogbUJ1ZmZlckdyb3VwKE5VTEwpLAorICAgICAgbVNvdXJjZShzb3VyY2UpLAogICAgICAgbU9mZnNldCgwKSwKICAgICAgIG1DdXJHcmFudWxlUG9zaXRpb24oMCksCiAgICAgICBtUHJldkdyYW51bGVQb3NpdGlvbigwKSwKQEAgLTMxMSwyMSArMzIwLDI2IEBACiAgICAgICBtTWltZVR5cGUobWltZVR5cGUpLAogICAgICAgbU51bUhlYWRlcnMobnVtSGVhZGVycyksCiAgICAgICBtU2Vla1ByZVJvbGxVcyhzZWVrUHJlUm9sbFVzKSwKLSAgICAgIG1GaXJzdERhdGFPZmZzZXQoLTEpIHsKKyAgICAgIG1GaXJzdERhdGFPZmZzZXQoLTEpLAorICAgICAgbUhhcHRpY0NoYW5uZWxDb3VudCgwKSB7CiAgICAgbUN1cnJlbnRQYWdlLm1OdW1TZWdtZW50cyA9IDA7CisgICAgbUN1cnJlbnRQYWdlLm1GbGFncyA9IDA7CiAKICAgICB2b3JiaXNfaW5mb19pbml0KCZtVmkpOwogICAgIHZvcmJpc19jb21tZW50X2luaXQoJm1WYyk7CisgICAgbU1ldGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgbUZpbGVNZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOwogfQogCiBNeU9nZ0V4dHJhY3Rvcjo6fk15T2dnRXh0cmFjdG9yKCkgeworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobUZpbGVNZXRhKTsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1NZXRhKTsKICAgICB2b3JiaXNfY29tbWVudF9jbGVhcigmbVZjKTsKICAgICB2b3JiaXNfaW5mb19jbGVhcigmbVZpKTsKIH0KIAotc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIGNvbnN0IHsKLSAgICBtZXRhID0gbU1ldGE7Ci0gICAgcmV0dXJuIE9LOworbWVkaWFfc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6OmdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpIGNvbnN0IHsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbU1ldGEpOwogfQogCiBzdGF0dXNfdCBNeU9nZ0V4dHJhY3Rvcjo6ZmluZE5leHRQYWdlKApAQCAtMzUxLDcgKzM2NSwxMyBAQAogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAKLSAgICAgICAgKysqcGFnZU9mZnNldDsKKyAgICAgICAgLy8gc2VlIGhvdyBmYXIgYWhlYWQgdG8gc2tpcDsgYXZvaWQgc29tZSBmcnVpdGxlc3MgY29tcGFyaXNvbnMKKyAgICAgICAgdW5zaWduZWQgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCA0IDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoc2lnbmF0dXJlW2ldID09ICdPJykKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAqcGFnZU9mZnNldCArPSBpOwogICAgIH0KIH0KIApAQCAtMzk1LDE5ICs0MTUsMTggQEAKIAogICAgIEFMT0dWKCJwcmV2UGFnZU9mZnNldCBhdCAlbGxkLCBwYWdlT2Zmc2V0IGF0ICVsbGQiLAogICAgICAgICAgICAgKGxvbmcgbG9uZylwcmV2UGFnZU9mZnNldCwgKGxvbmcgbG9uZylwYWdlT2Zmc2V0KTsKLQorICAgIHVpbnQ4X3QgZmxhZyA9IDA7CiAgICAgZm9yICg7OykgewogICAgICAgICBQYWdlIHByZXZQYWdlOwogICAgICAgICBzc2l6ZV90IG4gPSByZWFkUGFnZShwcmV2UGFnZU9mZnNldCwgJnByZXZQYWdlKTsKIAogICAgICAgICBpZiAobiA8PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gKHN0YXR1c190KW47CisgICAgICAgICAgICByZXR1cm4gKGZsYWcgJiAweDQpID8gT0sgOiAoc3RhdHVzX3QpbjsKICAgICAgICAgfQotCisgICAgICAgIGZsYWcgPSBwcmV2UGFnZS5tRmxhZ3M7CiAgICAgICAgIHByZXZQYWdlT2Zmc2V0ICs9IG47Ci0KKyAgICAgICAgKmdyYW51bGVQb3MgPSBwcmV2UGFnZS5tR3JhbnVsZVBvc2l0aW9uOwogICAgICAgICBpZiAocHJldlBhZ2VPZmZzZXQgPT0gcGFnZU9mZnNldCkgewotICAgICAgICAgICAgKmdyYW51bGVQb3MgPSBwcmV2UGFnZS5tR3JhbnVsZVBvc2l0aW9uOwogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAgICAgfQpAQCAtNTAyLDMwICs1MjEsMzAgQEAKICAgICAgICAgQUxPR1YoImZhaWxlZCB0byByZWFkICV6dSBieXRlcyBhdCBvZmZzZXQgJSMwMTZsbHgsIGdvdCAlemQgYnl0ZXMiLAogICAgICAgICAgICAgICAgIHNpemVvZihoZWFkZXIpLCAobG9uZyBsb25nKW9mZnNldCwgbik7CiAKLSAgICAgICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbjsKLSAgICAgICAgfSBlbHNlIGlmIChuID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICBpZiAobiA9PSAwIHx8IG4gPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICB9IGVsc2UgaWYgKG4gPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKG1lbWNtcChoZWFkZXIsICJPZ2dTIiwgNCkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCiAgICAgaWYgKGhlYWRlcls0XSAhPSAwKSB7CiAgICAgICAgIC8vIFdyb25nIHZlcnNpb24uCiAKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOwogICAgIH0KIAogICAgIHBhZ2UtPm1GbGFncyA9IGhlYWRlcls1XTsKIAogICAgIGlmIChwYWdlLT5tRmxhZ3MgJiB+NykgewogICAgICAgICAvLyBPbmx5IGJpdHMgMC0yIGFyZSBkZWZpbmVkIGluIHZlcnNpb24gMC4KLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCiAgICAgcGFnZS0+bUdyYW51bGVQb3NpdGlvbiA9IFU2NExFX0FUKCZoZWFkZXJbNl0pOwpAQCAtNTQyLDcgKzU2MSw3IEBACiAgICAgaWYgKG1Tb3VyY2UtPnJlYWRBdCgKICAgICAgICAgICAgICAgICBvZmZzZXQgKyBzaXplb2YoaGVhZGVyKSwgcGFnZS0+bUxhY2UsIHBhZ2UtPm1OdW1TZWdtZW50cykKICAgICAgICAgICAgIDwgKHNzaXplX3QpcGFnZS0+bU51bVNlZ21lbnRzKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICB9CiAKICAgICBzaXplX3QgdG90YWxTaXplID0gMDs7CkBAIC01NjUsMjIgKzU4NCwyMiBAQAogICAgIHJldHVybiBzaXplb2YoaGVhZGVyKSArIHBhZ2UtPm1OdW1TZWdtZW50cyArIHRvdGFsU2l6ZTsKIH0KIAotc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjpyZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKipvdXQpIHsKK21lZGlhX3N0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6cmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQpIHsKICAgICBpZiAobU9mZnNldCA8PSBtRmlyc3REYXRhT2Zmc2V0ICYmIG1TdGFydEdyYW51bGVQb3NpdGlvbiA8IDApIHsKICAgICAgICAgLy8gVGhlIGZpcnN0IHNhbXBsZSBtaWdodCBub3Qgc3RhcnQgYXQgdGltZSAwOyBmaW5kIG91dCB3aGVyZSBieSBzdWJ0cmFjdGluZwogICAgICAgICAvLyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgb24gdGhlIGZpcnN0IHBhZ2UgZnJvbSB0aGUgZ3JhbnVsZSBwb3NpdGlvbgogICAgICAgICAvLyAocG9zaXRpb24gb2YgbGFzdCBjb21wbGV0ZSBzYW1wbGUpIG9mIHRoZSBmaXJzdCBwYWdlLiBUaGlzIGhhcHBlbnMKICAgICAgICAgLy8gdGhlIGZpcnN0IHRpbWUgYmVmb3JlIHdlIGF0dGVtcHQgdG8gcmVhZCBhIHBhY2tldCBmcm9tIHRoZSBmaXJzdCBwYWdlLgotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKm1CdWY7CisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICptQnVmOwogICAgICAgICB1aW50MzJfdCBudW1TYW1wbGVzID0gMDsKICAgICAgICAgdWludDY0X3QgY3VyR3JhbnVsZVBvc2l0aW9uID0gMDsKICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IF9yZWFkTmV4dFBhY2tldCgmbUJ1ZiwgLyogY2FsY1ZvcmJpc1RpbWVzdGFtcCA9ICovZmFsc2UpOwotICAgICAgICAgICAgaWYgKGVyciAhPSBPSyAmJiBlcnIgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gX3JlYWROZXh0UGFja2V0KCZtQnVmLCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi9mYWxzZSk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEFNRURJQV9PSyAmJiBlcnIgIT0gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU0pIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gRmlyc3QgdHdvIHBhZ2VzIGFyZSBoZWFkZXIgcGFnZXMuCi0gICAgICAgICAgICBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0gfHwgbUN1cnJlbnRQYWdlLm1QYWdlTm8gPiAyKSB7CisgICAgICAgICAgICBpZiAoZXJyID09IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNIHx8IG1DdXJyZW50UGFnZS5tUGFnZU5vID4gMikgewogICAgICAgICAgICAgICAgIGlmIChtQnVmICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgbUJ1Zi0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgICAgICBtQnVmID0gTlVMTDsKQEAgLTYwMSwzMiArNjIwLDMzIEBACiAgICAgICAgIHNlZWtUb09mZnNldCgwKTsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBlcnIgPSBfcmVhZE5leHRQYWNrZXQob3V0LCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi9mYWxzZSk7Ci0gICAgaWYgKGVyciAhPSBPSykgeworICAgIG1lZGlhX3N0YXR1c190IGVyciA9IF9yZWFkTmV4dFBhY2tldChvdXQsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqL2ZhbHNlKTsKKyAgICBpZiAoZXJyICE9IEFNRURJQV9PSykgewogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAogICAgIGludDMyX3QgY3VycmVudFBhZ2VTYW1wbGVzOwogICAgIC8vIENhbGN1bGF0ZSB0aW1lc3RhbXBzIGJ5IGFjY3VtdWxhdGluZyBkdXJhdGlvbnMgc3RhcnRpbmcgZnJvbSB0aGUgZmlyc3Qgc2FtcGxlIG9mIGEgcGFnZTsKICAgICAvLyBXZSBhc3N1bWUgdGhhdCB3ZSBvbmx5IHNlZWsgdG8gcGFnZSBib3VuZGFyaWVzLgotICAgIGlmICgoKm91dCktPm1ldGFfZGF0YSgpLmZpbmRJbnQzMihrS2V5VmFsaWRTYW1wbGVzLCAmY3VycmVudFBhZ2VTYW1wbGVzKSkgeworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9ICgqb3V0KS0+bWV0YV9kYXRhKCk7CisgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1ZBTElEX1NBTVBMRVMsICZjdXJyZW50UGFnZVNhbXBsZXMpKSB7CiAgICAgICAgIC8vIGZpcnN0IHBhY2tldCBpbiBwYWdlCiAgICAgICAgIGlmIChtT2Zmc2V0ID09IG1GaXJzdERhdGFPZmZzZXQpIHsKICAgICAgICAgICAgIGN1cnJlbnRQYWdlU2FtcGxlcyAtPSBtU3RhcnRHcmFudWxlUG9zaXRpb247Ci0gICAgICAgICAgICAoKm91dCktPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlWYWxpZFNhbXBsZXMsIGN1cnJlbnRQYWdlU2FtcGxlcyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9WQUxJRF9TQU1QTEVTLCBjdXJyZW50UGFnZVNhbXBsZXMpOwogICAgICAgICB9CiAgICAgICAgIG1DdXJHcmFudWxlUG9zaXRpb24gPSBtQ3VycmVudFBhZ2UubUdyYW51bGVQb3NpdGlvbiAtIGN1cnJlbnRQYWdlU2FtcGxlczsKICAgICB9CiAKICAgICBpbnQ2NF90IHRpbWVVcyA9IGdldFRpbWVVc09mR3JhbnVsZShtQ3VyR3JhbnVsZVBvc2l0aW9uKTsKLSAgICAoKm91dCktPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIHRpbWVVcyk7CiAKICAgICB1aW50MzJfdCBmcmFtZXMgPSBnZXROdW1TYW1wbGVzSW5QYWNrZXQoKm91dCk7CiAgICAgbUN1ckdyYW51bGVQb3NpdGlvbiArPSBmcmFtZXM7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXVpbnQzMl90IE15T3B1c0V4dHJhY3Rvcjo6Z2V0TnVtU2FtcGxlc0luUGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSBjb25zdCB7Cit1aW50MzJfdCBNeU9wdXNFeHRyYWN0b3I6OmdldE51bVNhbXBsZXNJblBhY2tldChNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyKSBjb25zdCB7CiAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMIHx8IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPCAxKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KQEAgLTY2OCwxNCArNjg4LDcwIEBACiAgICAgICAgIFRSRVNQQVNTKCk7CiAgICAgfQogCi0gICAgdWludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lU2l6ZVVzICogbnVtRnJhbWVzICoga09wdXNTYW1wbGVSYXRlIC8gMTAwMDAwMDsKKyAgICB1aW50MzJfdCBudW1TYW1wbGVzID0gKHVpbnQzMl90KSgodWludDY0X3QpZnJhbWVTaXplVXMgKiBudW1GcmFtZXMgKiBrT3B1c1NhbXBsZVJhdGUpIC8gMTAwMDAwMDsKICAgICByZXR1cm4gbnVtU2FtcGxlczsKIH0KIAotc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6Ol9yZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGJvb2wgY2FsY1ZvcmJpc1RpbWVzdGFtcCkgeworLyoKKyAqIGJhc2ljIG1lZGlhYnVmZmVyIGltcGxlbWVudGF0aW9uIHVzZWQgZHVyaW5nIGluaXRpYWwgcGFyc2luZyBvZiB0aGUKKyAqIGhlYWRlciBwYWNrZXRzLCB3aGljaCBoYXBwZW5zIGJlZm9yZSB3ZSBoYXZlIGEgYnVmZmVyIGdyb3VwCisgKi8KK2NsYXNzIFN0YW5kQWxvbmVNZWRpYUJ1ZmZlciA6IHB1YmxpYyBNZWRpYUJ1ZmZlckhlbHBlciB7Citwcml2YXRlOgorICAgIHZvaWQgKm1EYXRhOworICAgIHNpemVfdCBtU2l6ZTsKKyAgICBzaXplX3QgbU9mZnNldDsKKyAgICBzaXplX3QgbUxlbmd0aDsKKyAgICBBTWVkaWFGb3JtYXQgKm1Gb3JtYXQ7CitwdWJsaWM6CisgICAgU3RhbmRBbG9uZU1lZGlhQnVmZmVyKHNpemVfdCBzaXplKSA6IE1lZGlhQnVmZmVySGVscGVyKE5VTEwpIHsKKyAgICAgICAgbVNpemUgPSBzaXplOworICAgICAgICBtRGF0YSA9IG1hbGxvYyhtU2l6ZSk7CisgICAgICAgIG1PZmZzZXQgPSAwOworICAgICAgICBtTGVuZ3RoID0gbVNpemU7CisgICAgICAgIG1Gb3JtYXQgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgICAgIEFMT0dWKCJjcmVhdGVkIHN0YW5kYWxvbmUgbWVkaWEgYnVmZmVyICVwIG9mIHNpemUgJXp1IiwgdGhpcywgbVNpemUpOworICAgIH0KKworICAgIH5TdGFuZEFsb25lTWVkaWFCdWZmZXIoKSBvdmVycmlkZSB7CisgICAgICAgIGZyZWUobURhdGEpOworICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1Gb3JtYXQpOworICAgICAgICBBTE9HVigiZGVsZXRlZCBzdGFuZGFsb25lIG1lZGlhIGJ1ZmZlciAlcCBvZiBzaXplICV6dSIsIHRoaXMsIG1TaXplKTsKKyAgICB9CisKKyAgICB2b2lkIHJlbGVhc2UoKSBvdmVycmlkZSB7CisgICAgICAgIGRlbGV0ZSB0aGlzOworICAgIH0KKworICAgIHZvaWQqIGRhdGEoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtRGF0YTsKKyAgICB9CisKKyAgICBzaXplX3Qgc2l6ZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1TaXplOworICAgIH0KKworICAgIHNpemVfdCByYW5nZV9vZmZzZXQoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtT2Zmc2V0OworICAgIH0KKworICAgIHNpemVfdCByYW5nZV9sZW5ndGgoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtTGVuZ3RoOworICAgIH0KKworICAgIHZvaWQgc2V0X3JhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpIG92ZXJyaWRlIHsKKyAgICAgICAgbU9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgbUxlbmd0aCA9IGxlbmd0aDsKKyAgICB9CisgICAgQU1lZGlhRm9ybWF0ICptZXRhX2RhdGEoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtRm9ybWF0OworICAgIH0KK307CisKK21lZGlhX3N0YXR1c190IE15T2dnRXh0cmFjdG9yOjpfcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQsIGJvb2wgY2FsY1ZvcmJpc1RpbWVzdGFtcCkgewogICAgICpvdXQgPSBOVUxMOwogCi0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIgPSBOVUxMOworICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIgPSBOVUxMOwogICAgIGludDY0X3QgdGltZVVzID0gLTE7CiAKICAgICBmb3IgKDs7KSB7CkBAIC03MDksMTYgKzc4NSwyMyBAQAogICAgICAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR0UoImIvMzY1OTIyMDIiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICp0bXAgPSBNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShmdWxsU2l6ZSk7CisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqdG1wOworICAgICAgICAgICAgaWYgKG1CdWZmZXJHcm91cCkgeworICAgICAgICAgICAgICAgIG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJnRtcCwgZmFsc2UsIGZ1bGxTaXplKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiYWNxdWlyZWQgYnVmZmVyICVwIGZyb20gZ3JvdXAiLCB0bXApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0bXAgPSBuZXcgU3RhbmRBbG9uZU1lZGlhQnVmZmVyKGZ1bGxTaXplKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICh0bXAgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGlmIChidWZmZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR0UoImIvMzY1OTIyMDIiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2NsZWFyKHRtcC0+bWV0YV9kYXRhKCkpOwogICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgbWVtY3B5KHRtcC0+ZGF0YSgpLCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CiAgICAgICAgICAgICAgICAgdG1wLT5zZXRfcmFuZ2UoMCwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CkBAIC03MzcsNyArODIwLDcgQEAKICAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICBBTE9HVigiZmFpbGVkIHRvIHJlYWQgJXp1IGJ5dGVzIGF0ICUjMDE2bGx4LCBnb3QgJXpkIGJ5dGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHBhY2tldFNpemUsIChsb25nIGxvbmcpZGF0YU9mZnNldCwgbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIGZ1bGxTaXplKTsKQEAgLTc0OCw4ICs4MzEsOSBAQAogICAgICAgICAgICAgICAgIC8vIFdlJ3ZlIGp1c3QgcmVhZCB0aGUgZW50aXJlIHBhY2tldC4KIAogICAgICAgICAgICAgICAgIGlmIChtRmlyc3RQYWNrZXRJblBhZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VmFsaWRTYW1wbGVzLCBtQ3VycmVudFBhZ2VTYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVkFMSURfU0FNUExFUywgbUN1cnJlbnRQYWdlU2FtcGxlcyk7CiAgICAgICAgICAgICAgICAgICAgIG1GaXJzdFBhY2tldEluUGFnZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgIH0KIApAQCAtNzcwLDExICs4NTQsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50UGFnZS5tUHJldlBhY2tldFBvcyArPSBhY3R1YWxCbG9ja1NpemUgLyAyOwogICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRQYWdlLm1QcmV2UGFja2V0U2l6ZSA9IGN1ckJsb2NrU2l6ZTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lVXMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCB0aW1lVXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAqb3V0ID0gYnVmZmVyOwogCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaCwgdGhlIGJ1ZmZlciBub3cgY29udGFpbnMgdGhlIHN0YXJ0IG9mIHRoZSBwYWNrZXQuCkBAIC03ODMsNiArODY4LDcgQEAKICAgICAgICAgQ0hFQ0tfRVEobU5leHRMYWNlSW5kZXgsIG1DdXJyZW50UGFnZS5tTnVtU2VnbWVudHMpOwogCiAgICAgICAgIG1PZmZzZXQgKz0gbUN1cnJlbnRQYWdlU2l6ZTsKKyAgICAgICAgdWludDhfdCBmbGFnID0gbUN1cnJlbnRQYWdlLm1GbGFnczsKICAgICAgICAgc3NpemVfdCBuID0gcmVhZFBhZ2UobU9mZnNldCwgJm1DdXJyZW50UGFnZSk7CiAKICAgICAgICAgaWYgKG4gPD0gMCkgewpAQCAtNzkzLDcgKzg3OSw4IEBACiAKICAgICAgICAgICAgIEFMT0dWKCJyZWFkUGFnZSByZXR1cm5lZCAlemQiLCBuKTsKIAotICAgICAgICAgICAgcmV0dXJuIG4gPCAwID8gbiA6IChzdGF0dXNfdClFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgaWYgKGZsYWcgJiAweDA0KSByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICByZXR1cm4gKG1lZGlhX3N0YXR1c190KSBuOwogICAgICAgICB9CiAKICAgICAgICAgLy8gUHJldmVudCBhIGhhcm1sZXNzIHVuc2lnbmVkIGludGVnZXIgb3ZlcmZsb3cgYnkgY2xhbXBpbmcgdG8gMApAQCAtODE2LDM2ICs5MDMsMzggQEAKICAgICAgICAgICAgICAgICAvLyBpcyBhbHJlYWR5IGNvbXBsZXRlLgogCiAgICAgICAgICAgICAgICAgaWYgKHRpbWVVcyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIHRpbWVVcyk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlWYWxpZFNhbXBsZXMsIG1DdXJyZW50UGFnZVNhbXBsZXMpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKAorICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9WQUxJRF9TQU1QTEVTLCBtQ3VycmVudFBhZ2VTYW1wbGVzKTsKICAgICAgICAgICAgICAgICBtRmlyc3RQYWNrZXRJblBhZ2UgPSBmYWxzZTsKIAogICAgICAgICAgICAgICAgICpvdXQgPSBidWZmZXI7CiAKLSAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KIAogc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6OmluaXQoKSB7Ci0gICAgbU1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIG1NaW1lVHlwZSk7CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBtTWltZVR5cGUpOwogCi0gICAgc3RhdHVzX3QgZXJyOwotICAgIE1lZGlhQnVmZmVyQmFzZSAqcGFja2V0OworICAgIG1lZGlhX3N0YXR1c190IGVycjsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqcGFja2V0OwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bUhlYWRlcnM7ICsraSkgewogICAgICAgICAvLyBpZ25vcmUgdGltZXN0YW1wIGZvciBjb25maWd1cmF0aW9uIHBhY2tldHMKLSAgICAgICAgaWYgKChlcnIgPSBfcmVhZE5leHRQYWNrZXQoJnBhY2tldCwgLyogY2FsY1ZvcmJpc1RpbWVzdGFtcCA9ICovIGZhbHNlKSkgIT0gT0spIHsKKyAgICAgICAgaWYgKChlcnIgPSBfcmVhZE5leHRQYWNrZXQoJnBhY2tldCwgLyogY2FsY1ZvcmJpc1RpbWVzdGFtcCA9ICovIGZhbHNlKSkgIT0gQU1FRElBX09LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgICAgIEFMT0dWKCJyZWFkIHBhY2tldCBvZiBzaXplICV6dVxuIiwgcGFja2V0LT5yYW5nZV9sZW5ndGgoKSk7CiAgICAgICAgIGVyciA9IHZlcmlmeUhlYWRlcihwYWNrZXQsIC8qIHR5cGUgPSAqLyBpICogMiArIDEpOwogICAgICAgICBwYWNrZXQtPnJlbGVhc2UoKTsKICAgICAgICAgcGFja2V0ID0gTlVMTDsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBpZiAoZXJyICE9IEFNRURJQV9PSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogICAgIH0KQEAgLTg2NSwxMiArOTU0LDEyIEBACiAKICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzID0gZ2V0VGltZVVzT2ZHcmFudWxlKGxhc3RHcmFudWxlUG9zaXRpb24pOwogCi0gICAgICAgIG1NZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgZHVyYXRpb25Vcyk7CiAKICAgICAgICAgYnVpbGRUYWJsZU9mQ29udGVudHMoKTsKICAgICB9CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogdm9pZCBNeU9nZ0V4dHJhY3Rvcjo6YnVpbGRUYWJsZU9mQ29udGVudHMoKSB7CkBAIC05MDIsNyArOTkxLDcgQEAKICAgICAgICAgc2l6ZV90IGRlbm9tID0gbnVtZXJhdG9yIC0ga01heE51bVRPQ0VudHJpZXM7CiAKICAgICAgICAgc2l6ZV90IGFjY3VtID0gMDsKLSAgICAgICAgZm9yIChzc2l6ZV90IGkgPSBtVGFibGVPZkNvbnRlbnRzLnNpemUoKSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgICAgIGZvciAoc3NpemVfdCBpID0gbVRhYmxlT2ZDb250ZW50cy5zaXplKCk7IGkgPiAwOyAtLWkpIHsKICAgICAgICAgICAgIGFjY3VtICs9IGRlbm9tOwogICAgICAgICAgICAgaWYgKGFjY3VtID49IG51bWVyYXRvcikgewogICAgICAgICAgICAgICAgIG1UYWJsZU9mQ29udGVudHMucmVtb3ZlQXQoaSk7CkBAIC05MTIsNyArMTAwMSw3IEBACiAgICAgfQogfQogCi1pbnQzMl90IE15T2dnRXh0cmFjdG9yOjpnZXRQYWNrZXRCbG9ja1NpemUoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIHsKK2ludDMyX3QgTXlPZ2dFeHRyYWN0b3I6OmdldFBhY2tldEJsb2NrU2l6ZShNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyKSB7CiAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9CiAgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOwogCkBAIC05NTIsNyArMTA0MSw3IEBACiAgICAgcmV0dXJuIHBjbVNhbXBsZVBvc2l0aW9uICogMTAwMDAwMGxsIC8ga09wdXNTYW1wbGVSYXRlOwogfQogCi1zdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciwgdWludDhfdCB0eXBlKSB7CittZWRpYV9zdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyLCB1aW50OF90IHR5cGUpIHsKICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICAgLy8gdGhlcmUgYXJlIGFjdHVhbGx5IG5vIGhlYWRlciB0eXBlcyBkZWZpbmVkIGluIHRoZSBPcHVzIHNwZWM7IHdlIGNob29zZSAxIGFuZCAzIHRvIG1lYW4KICAgICAgICAgLy8gaGVhZGVyIGFuZCBjb21tZW50cyBzdWNoIHRoYXQgd2UgY2FuIHNoYXJlIGNvZGUgd2l0aCBNeVZvcmJpc0V4dHJhY3Rvci4KQEAgLTk2MSwxMSArMTA1MCwxMSBAQAogICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICByZXR1cm4gdmVyaWZ5T3B1c0NvbW1lbnRzKGJ1ZmZlcik7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIH0KIAotc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjp2ZXJpZnlPcHVzSGVhZGVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSB7CittZWRpYV9zdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnZlcmlmeU9wdXNIZWFkZXIoTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcikgewogICAgIGNvbnN0IHNpemVfdCBrT3B1c0hlYWRlclNpemUgPSAxOTsKICAgICBjb25zdCB1aW50OF90ICpkYXRhID0KICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CkBAIC05NzUsMjkgKzEwNjQsMzEgQEAKICAgICBpZiAoc2l6ZSA8IGtPcHVzSGVhZGVyU2l6ZQogICAgICAgICAgICAgfHwgbWVtY21wKGRhdGEsICJPcHVzSGVhZCIsIDgpCiAgICAgICAgICAgICB8fCAvKiB2ZXJzaW9uID0gKi8gZGF0YVs4XSAhPSAxKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAogICAgIG1DaGFubmVsQ291bnQgPSBkYXRhWzldOwogICAgIG1Db2RlY0RlbGF5ID0gVTE2TEVfQVQoJmRhdGFbMTBdKTsKIAotICAgIG1NZXRhLnNldERhdGEoa0tleU9wdXNIZWFkZXIsIDAsIGRhdGEsIHNpemUpOwotICAgIG1NZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBrT3B1c1NhbXBsZVJhdGUpOwotICAgIG1NZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG1DaGFubmVsQ291bnQpOwotICAgIG1NZXRhLnNldEludDY0KGtLZXlPcHVzU2Vla1ByZVJvbGwgLyogbnMgKi8sIGtPcHVzU2Vla1ByZVJvbGxVcyAqIDEwMDAgLyogPSA4MCBtcyovKTsKLSAgICBtTWV0YS5zZXRJbnQ2NChrS2V5T3B1c0NvZGVjRGVsYXkgLyogbnMgKi8sCi0gICAgICAgICAgICBtQ29kZWNEZWxheSAvKiBzYW1wbGUvcyAqLyAqIDEwMDAwMDAwMDBsbCAvIGtPcHVzU2FtcGxlUmF0ZSk7CisgICAgLy8ga0tleU9wdXNIZWFkZXIgaXMgY3NkLTAKKyAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBkYXRhLCBzaXplKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIGtPcHVzU2FtcGxlUmF0ZSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIG1DaGFubmVsQ291bnQpOworICAgIGludDY0X3QgY29kZWNkZWxheSA9IG1Db2RlY0RlbGF5IC8qIHNhbXBsZS9zICovICogMTAwMDAwMDAwMGxsIC8ga09wdXNTYW1wbGVSYXRlOworICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzEsICZjb2RlY2RlbGF5LCBzaXplb2YoY29kZWNkZWxheSkpOworICAgIGludDY0X3QgcHJlcm9sbCA9IGtPcHVzU2Vla1ByZVJvbGxVcyAqIDEwMDAgLyogPSA4MCBtcyovOworICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzIsICZwcmVyb2xsLCBzaXplb2YocHJlcm9sbCkpOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6dmVyaWZ5T3B1c0NvbW1lbnRzKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSB7CittZWRpYV9zdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnZlcmlmeU9wdXNDb21tZW50cyhNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyKSB7CiAgICAgLy8gYWRkIGFydGlmaWNpYWwgZnJhbWluZyBiaXQgc28gd2UgY2FuIHJldXNlIF92b3JiaXNfdW5wYWNrX2NvbW1lbnQKICAgICBpbnQzMl90IGNvbW1lbnRTaXplID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSArIDE7CiAgICAgYXV0byB0bXAgPSBoZWFwYnVmZmVyPHVpbnQ4X3Q+KGNvbW1lbnRTaXplKTsKICAgICB1aW50OF90ICpjb21tZW50RGF0YSA9IHRtcC5nZXQoKTsKICAgICBpZiAoY29tbWVudERhdGEgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICBtZW1jcHkoY29tbWVudERhdGEsCkBAIC0xMDI2LDE0ICsxMTE3LDE0IEBACiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoZWFkZXJMZW47ICsraSkgewogICAgICAgICBjaGFyIGNociA9IG9nZ3BhY2tfcmVhZCgmYml0cywgOCk7CiAgICAgICAgIGlmIChjaHIgIT0gT3B1c1RhZ3NbaV0pIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgIH0KIAogICAgIGludDMyX3QgdmVuZG9yTGVuID0gb2dncGFja19yZWFkKCZiaXRzLCAzMik7CiAgICAgZnJhbWluZ0JpdE9mZnNldCArPSA0OwogICAgIGlmICh2ZW5kb3JMZW4gPCAwIHx8IHZlbmRvckxlbiA+IGNvbW1lbnRTaXplIC0gOCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAgICAgLy8gc2tpcCB2ZW5kb3Igc3RyaW5nCiAgICAgZnJhbWluZ0JpdE9mZnNldCArPSB2ZW5kb3JMZW47CkBAIC0xMDQ0LDEzICsxMTM1LDEzIEBACiAgICAgaW50MzJfdCBuID0gb2dncGFja19yZWFkKCZiaXRzLCAzMik7CiAgICAgZnJhbWluZ0JpdE9mZnNldCArPSA0OwogICAgIGlmIChuIDwgMCB8fCBuID4gKChjb21tZW50U2l6ZSAtIG9nZ3BhY2tfYnl0ZXMoJmJpdHMpKSA+PiAyKSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgaW50MzJfdCBsZW4gPSBvZ2dwYWNrX3JlYWQoJmJpdHMsIDMyKTsKICAgICAgICAgZnJhbWluZ0JpdE9mZnNldCArPSA0OwogICAgICAgICBpZiAobGVuICA8IDAgfHwgbGVuICA+IChjb21tZW50U2l6ZSAtIG9nZ3BhY2tfYnl0ZXMoJmJpdHMpKSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgICAgIGZyYW1pbmdCaXRPZmZzZXQgKz0gbGVuOwogICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGxlbjsgKytqKSB7CkBAIC0xMDU4LDcgKzExNDksNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmIChmcmFtaW5nQml0T2Zmc2V0IDwgMCB8fCBmcmFtaW5nQml0T2Zmc2V0ID49IGNvbW1lbnRTaXplKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KICAgICBjb21tZW50RGF0YVtmcmFtaW5nQml0T2Zmc2V0XSA9IDE7CiAKQEAgLTEwNzUsMjIgKzExNjYsMjMgQEAKICAgICBvZ2dwYWNrX3JlYWRpbml0KCZiaXRzLCAmcmVmKTsKICAgICBpbnQgZXJyID0gX3ZvcmJpc191bnBhY2tfY29tbWVudCgmbVZjLCAmYml0cyk7CiAgICAgaWYgKDAgIT0gZXJyKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAogICAgIHBhcnNlRmlsZU1ldGFEYXRhKCk7Ci0gICAgcmV0dXJuIE9LOworICAgIHNldENoYW5uZWxNYXNrKG1DaGFubmVsQ291bnQpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE15Vm9yYmlzRXh0cmFjdG9yOjp2ZXJpZnlIZWFkZXIoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyLCB1aW50OF90IHR5cGUpIHsKK21lZGlhX3N0YXR1c190IE15Vm9yYmlzRXh0cmFjdG9yOjp2ZXJpZnlIZWFkZXIoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIsIHVpbnQ4X3QgdHlwZSkgewogICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPQogICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKIAogICAgIHNpemVfdCBzaXplID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKIAogICAgIGlmIChzaXplIDwgNyB8fCBkYXRhWzBdICE9IHR5cGUgfHwgbWVtY21wKCZkYXRhWzFdLCAidm9yYmlzIiwgNikpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCiAgICAgb2dnX2J1ZmZlciBidWY7CkBAIC0xMTA5LDcgKzEyMDEsNyBAQAogICAgIG9nZ3BhY2tfcmVhZGluaXQoJmJpdHMsICZyZWYpOwogCiAgICAgaWYgKG9nZ3BhY2tfcmVhZCgmYml0cywgOCkgIT0gdHlwZSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCA2OyArK2kpIHsKICAgICAgICAgb2dncGFja19yZWFkKCZiaXRzLCA4KTsgIC8vIHNraXAgJ3ZvcmJpcycKQEAgLTExMTksMTMgKzEyMTEsMTMgQEAKICAgICAgICAgY2FzZSAxOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoMCAhPSBfdm9yYmlzX3VucGFja19pbmZvKCZtVmksICZiaXRzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1NZXRhLnNldERhdGEoa0tleVZvcmJpc0luZm8sIDAsIGRhdGEsIHNpemUpOwotICAgICAgICAgICAgbU1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1WaS5yYXRlKTsKLSAgICAgICAgICAgIG1NZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG1WaS5jaGFubmVscyk7Ci0gICAgICAgICAgICBtTWV0YS5zZXRJbnQzMihrS2V5Qml0UmF0ZSwgbVZpLmJpdHJhdGVfbm9taW5hbCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBkYXRhLCBzaXplKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgbVZpLnJhdGUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIG1WaS5jaGFubmVscyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsIG1WaS5iaXRyYXRlX25vbWluYWwpOwogCiAgICAgICAgICAgICBBTE9HVigibG93ZXItYml0cmF0ZSA9ICVsZCIsIG1WaS5iaXRyYXRlX2xvd2VyKTsKICAgICAgICAgICAgIEFMT0dWKCJ1cHBlci1iaXRyYXRlID0gJWxkIiwgbVZpLmJpdHJhdGVfdXBwZXIpOwpAQCAtMTE0MCw3ICsxMjMyLDcgQEAKICAgICAgICAgICAgIGlmIChtU291cmNlLT5nZXRTaXplKCZzaXplKSA9PSBPSykgewogICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJwcyA9IGFwcHJveEJpdHJhdGUoKTsKICAgICAgICAgICAgICAgICBpZiAoYnBzICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbU1ldGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBzaXplICogODAwMDAwMGxsIC8gYnBzKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCBzaXplICogODAwMDAwMGxsIC8gYnBzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTExNDksMjUgKzEyNDEsMjYgQEAKICAgICAgICAgY2FzZSAzOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoMCAhPSBfdm9yYmlzX3VucGFja19jb21tZW50KCZtVmMsICZiaXRzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHBhcnNlRmlsZU1ldGFEYXRhKCk7CisgICAgICAgICAgICBzZXRDaGFubmVsTWFzayhtVmkuY2hhbm5lbHMpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIDU6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICgwICE9IF92b3JiaXNfdW5wYWNrX2Jvb2tzKCZtVmksICZiaXRzKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1NZXRhLnNldERhdGEoa0tleVZvcmJpc0Jvb2tzLCAwLCBkYXRhLCBzaXplKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzEsIGRhdGEsIHNpemUpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogdWludDY0X3QgTXlWb3JiaXNFeHRyYWN0b3I6OmFwcHJveEJpdHJhdGUoKSBjb25zdCB7CkBAIC0xMTgwLDIwICsxMjczLDQ1IEBACiAKIAogdm9pZCBNeU9nZ0V4dHJhY3Rvcjo6cGFyc2VGaWxlTWV0YURhdGEoKSB7Ci0gICAgbUZpbGVNZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfT0dHKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfT0dHKTsKIAogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVZjLmNvbW1lbnRzOyArK2kpIHsKICAgICAgICAgY29uc3QgY2hhciAqY29tbWVudCA9IG1WYy51c2VyX2NvbW1lbnRzW2ldOwogICAgICAgICBzaXplX3QgY29tbWVudExlbmd0aCA9IG1WYy5jb21tZW50X2xlbmd0aHNbaV07Ci0gICAgICAgIHBhcnNlVm9yYmlzQ29tbWVudCgmbUZpbGVNZXRhLCBjb21tZW50LCBjb21tZW50TGVuZ3RoKTsKKyAgICAgICAgcGFyc2VWb3JiaXNDb21tZW50KG1GaWxlTWV0YSwgY29tbWVudCwgY29tbWVudExlbmd0aCk7CiAgICAgICAgIC8vQUxPR0koImNvbW1lbnQgIyVkOiAnJXMnIiwgaSArIDEsIG1WYy51c2VyX2NvbW1lbnRzW2ldKTsKICAgICB9CisKKyAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZpbGVNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0hBUFRJQ19DSEFOTkVMX0NPVU5ULCAmbUhhcHRpY0NoYW5uZWxDb3VudCk7Cit9CisKK3ZvaWQgTXlPZ2dFeHRyYWN0b3I6OnNldENoYW5uZWxNYXNrKGludCBjaGFubmVsQ291bnQpIHsKKyAgICAvLyBTZXQgY2hhbm5lbCBtYXNrIGFjY29yZGluZyB0byBjaGFubmVsIGNvdW50LiBXaGVuIGhhcHRpYyBjaGFubmVsIGNvdW50IGlzIGZvdW5kIGluCisgICAgLy8gZmlsZSBtZXRhLCBzZXQgaGFwdGljIGNoYW5uZWwgbWFzayB0byB0cnkgaGFwdGljIHBsYXliYWNrLgorICAgIGlmIChtSGFwdGljQ2hhbm5lbENvdW50ID4gMCkgeworICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBoYXB0aWNDaGFubmVsTWFzayA9CisgICAgICAgICAgICAgICAgaGFwdGljX2NoYW5uZWxfbWFza19mcm9tX2NvdW50KG1IYXB0aWNDaGFubmVsQ291bnQpOworICAgICAgICBjb25zdCBpbnQzMl90IGF1ZGlvQ2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50IC0gbUhhcHRpY0NoYW5uZWxDb3VudDsKKyAgICAgICAgaWYgKGhhcHRpY0NoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5WQUxJRAorICAgICAgICAgICAgICAgIHx8IGF1ZGlvQ2hhbm5lbENvdW50IDw9IDAgfHwgYXVkaW9DaGFubmVsQ291bnQgPiBGQ0NfOCkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgaGFwdGljIGNoYW5uZWwgY291bnQgZm91bmQgaW4gbWV0YWRhdGE6ICVkIiwgbUhhcHRpY0NoYW5uZWxDb3VudCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudCgKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9DaGFubmVsQ291bnQpIHwgaGFwdGljQ2hhbm5lbE1hc2s7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9NQVNLLCBjaGFubmVsTWFzayk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoCisgICAgICAgICAgICAgICAgICAgIG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0hBUFRJQ19DSEFOTkVMX0NPVU5ULCBtSGFwdGljQ2hhbm5lbENvdW50KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX01BU0ssCisgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KGNoYW5uZWxDb3VudCkpOworICAgIH0KIH0KIAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1PZ2dFeHRyYWN0b3I6Ok9nZ0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorT2dnRXh0cmFjdG9yOjpPZ2dFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCiAgICAgICBtSW1wbChOVUxMKSB7CkBAIC0xMjIwLDEzICsxMzM4LDE0IEBACiBPZ2dFeHRyYWN0b3I6On5PZ2dFeHRyYWN0b3IoKSB7CiAgICAgZGVsZXRlIG1JbXBsOwogICAgIG1JbXBsID0gTlVMTDsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CiB9CiAKIHNpemVfdCBPZ2dFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtSW5pdENoZWNrICE9IE9LID8gMCA6IDE7CiB9CiAKLU1lZGlhVHJhY2sgKk9nZ0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpPZ2dFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIGlmIChpbmRleCA+PSAxKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTEyMzQsMzMgKzEzNTMsMzQgQEAKICAgICByZXR1cm4gbmV3IE9nZ1NvdXJjZSh0aGlzKTsKIH0KIAotc3RhdHVzX3QgT2dnRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCittZWRpYV9zdGF0dXNfdCBPZ2dFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIGlmIChpbmRleCA+PSAxKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgcmV0dXJuIG1JbXBsLT5nZXRGb3JtYXQobWV0YSk7CiB9CiAKLXN0YXR1c190IE9nZ0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhKSB7CittZWRpYV9zdGF0dXNfdCBPZ2dFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgewogICAgIHJldHVybiBtSW1wbC0+Z2V0RmlsZU1ldGFEYXRhKG1ldGEpOwogfQogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3IqIENyZWF0ZUV4dHJhY3RvcigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKK3N0YXRpYyBDTWVkaWFFeHRyYWN0b3IqIENyZWF0ZUV4dHJhY3RvcigKKyAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKICAgICAgICAgdm9pZCAqKSB7Ci0gICAgcmV0dXJuIG5ldyBPZ2dFeHRyYWN0b3Ioc291cmNlKTsKKyAgICByZXR1cm4gd3JhcChuZXcgT2dnRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKHNvdXJjZSkpKTsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBTbmlmZigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKK3N0YXRpYyBDcmVhdG9yRnVuYyBTbmlmZigKKyAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCiAgICAgICAgIHZvaWQgKiosCi0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKikgeworICAgICAgICBGcmVlTWV0YUZ1bmMgKikgeworICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKHNvdXJjZSk7CiAgICAgY2hhciB0bXBbNF07Ci0gICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIHRtcCwgNCkgPCA0IHx8IG1lbWNtcCh0bXAsICJPZ2dTIiwgNCkpIHsKKyAgICBpZiAoaGVscGVyLnJlYWRBdCgwLCB0bXAsIDQpIDwgNCB8fCBtZW1jbXAodG1wLCAiT2dnUyIsIDQpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtMTI2OSwxNiArMTM4OSwyMyBAQAogICAgIHJldHVybiBDcmVhdGVFeHRyYWN0b3I7CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICpleHRlbnNpb25zW10gPSB7CisgICAgIm9nYSIsCisgICAgIm9nZyIsCisgICAgIm9wdXMiLAorICAgIE5VTEwKK307CisKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT04sCiAgICAgICAgIFVVSUQoIjhjYzVjZDA2LWY3NzItNDk1ZS04YTYyLWNiYTk2NDkzNzRlOSIpLAogICAgICAgICAxLCAvLyB2ZXJzaW9uCiAgICAgICAgICJPZ2cgRXh0cmFjdG9yIiwKLSAgICAgICAgU25pZmYKKyAgICAgICAgeyAudjMgPSB7U25pZmYsIGV4dGVuc2lvbnN9IH0sCiAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvT2dnRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL29nZy9PZ2dFeHRyYWN0b3IuaAppbmRleCA5ZmUyOTQ0Li5jNzVkZmE5IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL29nZy9PZ2dFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL29nZy9PZ2dFeHRyYWN0b3IuaApAQCAtMTksMjUgKzE5LDI2IEBACiAjZGVmaW5lIE9HR19FWFRSQUNUT1JfSF8KIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFNZXNzYWdlOwotY2xhc3MgRGF0YVNvdXJjZUJhc2U7CiBjbGFzcyBTdHJpbmc4OwogCiBzdHJ1Y3QgTXlPZ2dFeHRyYWN0b3I7CiBzdHJ1Y3QgT2dnU291cmNlOwogCi1zdHJ1Y3QgT2dnRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKLSAgICBleHBsaWNpdCBPZ2dFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CitzdHJ1Y3QgT2dnRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKKyAgICBleHBsaWNpdCBPZ2dFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKTsKIAogICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlciAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJPZ2dFeHRyYWN0b3IiOyB9CiAKIHByb3RlY3RlZDoKQEAgLTQ2LDcgKzQ3LDcgQEAKIHByaXZhdGU6CiAgICAgZnJpZW5kIHN0cnVjdCBPZ2dTb3VyY2U7CiAKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKIAogICAgIE15T2dnRXh0cmFjdG9yICptSW1wbDsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvd2F2L0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9BbmRyb2lkLmJwCmluZGV4IDA2NzkzM2UuLjdlODkyNzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvd2F2L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy93YXYvQW5kcm9pZC5icApAQCAtNywxMSArNywxMyBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyX25kayIsCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlibWVkaWFuZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCiAgICAgICAgICJsaWJmaWZvIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgIF0sCkBAIC0zNCw5ICszNiw2IEBACiAgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKIAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L1dBVkV4dHJhY3Rvci5jcHAKaW5kZXggZjVhMWIwMS4uNGZhN2YyNyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuY3BwCkBAIC0yMCwyMSArMjAsMzIgQEAKIAogI2luY2x1ZGUgIldBVkV4dHJhY3Rvci5oIgogCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPiAvLyBmb3IgQUlCaW5kZXJfZ2V0Q2FsbGluZ1VpZAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+IC8vIGZvciBBSURfTUVESUEKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2JpdG9wcy5oPgogCiAjZGVmaW5lIENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUiAwCiAKKy8vIE5PVEU6IFRoaXMgY29kZSBhc3N1bWVzIHRoZSBkZXZpY2UgcHJvY2Vzc29yIGlzIGxpdHRsZSBlbmRpYW4uCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorLy8gTWVkaWFTZXJ2ZXIgaXMgY2FwYWJsZSBvZiBoYW5kbGluZyBmbG9hdCBleHRyYWN0b3Igb3V0cHV0LCBidXQgZ2VuZXJhbCBwcm9jZXNzZXMKKy8vIG1heSBub3QgYmUgYWJsZSB0byBkbyBzby4KKy8vIFRPRE86IEltcHJvdmUgQVBJIHRvIHNldCBleHRyYWN0b3IgZmxvYXQgb3V0cHV0LgorLy8gKE5vdGU6IGR1cGxpY2F0ZWQgd2l0aCBGTEFDRXh0cmFjdG9yLmNwcCkKK3N0YXRpYyBpbmxpbmUgYm9vbCBzaG91bGRFeHRyYWN0b3JPdXRwdXRGbG9hdChpbnQgYml0c1BlclNhbXBsZSkKK3sKKyAgICByZXR1cm4gYml0c1BlclNhbXBsZSA+IDE2ICYmIEFJQmluZGVyX2dldENhbGxpbmdVaWQoKSA9PSBBSURfTUVESUE7Cit9CisKIGVudW0gewogICAgIFdBVkVfRk9STUFUX1BDTSAgICAgICAgPSAweDAwMDEsCiAgICAgV0FWRV9GT1JNQVRfSUVFRV9GTE9BVCA9IDB4MDAwMywKQEAgLTU1LDIyICs2NiwyMiBAQAogICAgIHJldHVybiBwdHJbMV0gPDwgOCB8IHB0clswXTsKIH0KIAotc3RydWN0IFdBVlNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKK3N0cnVjdCBXQVZTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiAgICAgV0FWU291cmNlKAotICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyICpkYXRhU291cmNlLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICAgICAgdWludDE2X3Qgd2F2ZUZvcm1hdCwKLSAgICAgICAgICAgIGludDMyX3QgYml0c1BlclNhbXBsZSwKKyAgICAgICAgICAgIGJvb2wgb3V0cHV0RmxvYXQsCiAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKLSAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydE5vbmJsb2NraW5nUmVhZCgpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBib29sIHN1cHBvcnRzTm9uQmxvY2tpbmdSZWFkKCkgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfldBVlNvdXJjZSgpOwpAQCAtNzgsNjQgKzg5LDcyIEBACiBwcml2YXRlOgogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heEZyYW1lU2l6ZTsKIAotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKLSAgICBNZXRhRGF0YUJhc2UgJm1NZXRhOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOworICAgIEFNZWRpYUZvcm1hdCAqbU1ldGE7CiAgICAgdWludDE2X3QgbVdhdmVGb3JtYXQ7CisgICAgY29uc3QgYm9vbCBtT3V0cHV0RmxvYXQ7CiAgICAgaW50MzJfdCBtU2FtcGxlUmF0ZTsKICAgICBpbnQzMl90IG1OdW1DaGFubmVsczsKICAgICBpbnQzMl90IG1CaXRzUGVyU2FtcGxlOwogICAgIG9mZjY0X3QgbU9mZnNldDsKICAgICBzaXplX3QgbVNpemU7CiAgICAgYm9vbCBtU3RhcnRlZDsKLSAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7CiAgICAgb2ZmNjRfdCBtQ3VycmVudFBvczsKIAogICAgIFdBVlNvdXJjZShjb25zdCBXQVZTb3VyY2UgJik7CiAgICAgV0FWU291cmNlICZvcGVyYXRvcj0oY29uc3QgV0FWU291cmNlICYpOwogfTsKIAotV0FWRXh0cmFjdG9yOjpXQVZFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKK1dBVkV4dHJhY3Rvcjo6V0FWRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICBtVmFsaWRGb3JtYXQoZmFsc2UpLAogICAgICAgbUNoYW5uZWxNYXNrKENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUikgeworICAgIG1UcmFja01ldGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CiAgICAgbUluaXRDaGVjayA9IGluaXQoKTsKIH0KIAogV0FWRXh0cmFjdG9yOjp+V0FWRXh0cmFjdG9yKCkgeworICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1UcmFja01ldGEpOwogfQogCi1zdGF0dXNfdCBXQVZFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEuY2xlYXIoKTsKK21lZGlhX3N0YXR1c190IFdBVkV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1ldGEpOwogICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7Ci0gICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9XQVYpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dBVik7CiAgICAgfQogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHNpemVfdCBXQVZFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtSW5pdENoZWNrID09IE9LID8gMSA6IDA7CiB9CiAKLU1lZGlhVHJhY2sgKldBVkV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpXQVZFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ID4gMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICByZXR1cm4gbmV3IFdBVlNvdXJjZSgKICAgICAgICAgICAgIG1EYXRhU291cmNlLCBtVHJhY2tNZXRhLAotICAgICAgICAgICAgbVdhdmVGb3JtYXQsIG1CaXRzUGVyU2FtcGxlLCBtRGF0YU9mZnNldCwgbURhdGFTaXplKTsKKyAgICAgICAgICAgIG1XYXZlRm9ybWF0LCBzaG91bGRFeHRyYWN0b3JPdXRwdXRGbG9hdChtQml0c1BlclNhbXBsZSksIG1EYXRhT2Zmc2V0LCBtRGF0YVNpemUpOwogfQogCi1zdGF0dXNfdCBXQVZFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IFdBVkV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggPiAwKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCi0gICAgbWV0YSA9IG1UcmFja01ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIGNvbnN0IG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1UcmFja01ldGEpOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HLAorICAgICAgICAgICAgICAgIHNob3VsZEV4dHJhY3Rvck91dHB1dEZsb2F0KG1CaXRzUGVyU2FtcGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgPyBrQXVkaW9FbmNvZGluZ1BjbUZsb2F0IDoga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IFdBVkV4dHJhY3Rvcjo6aW5pdCgpIHsKQEAgLTE4NSw3ICsyMDQsNyBAQAogICAgICAgICAgICAgICAgICAgICAmJiBtV2F2ZUZvcm1hdCAhPSBXQVZFX0ZPUk1BVF9NVUxBVwogICAgICAgICAgICAgICAgICAgICAmJiBtV2F2ZUZvcm1hdCAhPSBXQVZFX0ZPUk1BVF9NU0dTTQogICAgICAgICAgICAgICAgICAgICAmJiBtV2F2ZUZvcm1hdCAhPSBXQVZFX0ZPUk1BVF9FWFRFTlNJQkxFKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHVpbnQ4X3QgZm10U2l6ZSA9IDE2OwpAQCAtMTk4LDEzICsyMTcsMTMgQEAKIAogICAgICAgICAgICAgbU51bUNoYW5uZWxzID0gVTE2X0xFX0FUKCZmb3JtYXRTcGVjWzJdKTsKIAotICAgICAgICAgICAgaWYgKG1OdW1DaGFubmVscyA8IDEgfHwgbU51bUNoYW5uZWxzID4gOCkgeworICAgICAgICAgICAgaWYgKG1OdW1DaGFubmVscyA8IDEgfHwgbU51bUNoYW5uZWxzID4gRkNDXzgpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGNoYW5uZWxzICglZCkiLCBtTnVtQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobVdhdmVGb3JtYXQgIT0gV0FWRV9GT1JNQVRfRVhURU5TSUJMRSkgewotICAgICAgICAgICAgICAgIGlmIChtTnVtQ2hhbm5lbHMgIT0gMSAmJiBtTnVtQ2hhbm5lbHMgIT0gMikgeworICAgICAgICAgICAgICAgIGlmIChtTnVtQ2hhbm5lbHMgIT0gMSAmJiBtTnVtQ2hhbm5lbHMgIT0gRkNDXzIpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coIk1vcmUgdGhhbiAyIGNoYW5uZWxzICglZCkgaW4gbm9uLVdBVkVfRVhULCB1bmtub3duIGNoYW5uZWwgbWFzayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bUNoYW5uZWxzKTsKICAgICAgICAgICAgICAgICB9CkBAIC0yMjQsNyArMjQzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkQml0c1BlclNhbXBsZSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgidmFsaWRCaXRzKCVkKSAhPSBiaXRzUGVyU2FtcGxlKCVkKSBhcmUgbm90IHN1cHBvcnRlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkQml0c1BlclNhbXBsZSwgbUJpdHNQZXJTYW1wbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgc3VwcG9ydCB2YWxpdEJpdHNQZXJTYW1wbGUgPT0gYml0c1BlclNhbXBsZSBidXQgc29tZSBXQVZfRVhUCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZXJzIGRvbid0IGNvcnJlY3RseSBzZXQgdGhlIHZhbGlkIGJpdHMgdmFsdWUsIGFuZCBsZWF2ZSBpdCBhdCAwLgpAQCAtMjg0LDM0ICszMDMsMzMgQEAKICAgICAgICAgICAgICAgICBtRGF0YU9mZnNldCA9IG9mZnNldDsKICAgICAgICAgICAgICAgICBtRGF0YVNpemUgPSBjaHVua1NpemU7CiAKLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1UcmFja01ldGEpOwogCiAgICAgICAgICAgICAgICAgc3dpdGNoIChtV2F2ZUZvcm1hdCkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIFdBVkVfRk9STUFUX1BDTToKICAgICAgICAgICAgICAgICAgICAgY2FzZSBXQVZFX0ZPUk1BVF9JRUVFX0ZMT0FUOgotICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1UcmFja01ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIFdBVkVfRk9STUFUX0FMQVc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldENTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobVRyYWNrTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0FWRV9GT1JNQVRfTVNHU006Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldENTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVNHU00pOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtVHJhY2tNZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX01TR1NNKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobVdhdmVGb3JtYXQsICh1aW50MTZfdClXQVZFX0ZPUk1BVF9NVUxBVyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldENTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobVRyYWNrTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBtTnVtQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxNYXNrLCBtQ2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlKTsKLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldEludDMyKGtLZXlQY21FbmNvZGluZywga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCk7Ci0KKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobVRyYWNrTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBtTnVtQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtVHJhY2tNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfTUFTSywgbUNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobVRyYWNrTWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgbVNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtVHJhY2tNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSwgbUJpdHNQZXJTYW1wbGUpOwogICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VcyA9IDA7CiAgICAgICAgICAgICAgICAgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX01TR1NNKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIDY1IGJ5dGVzIGRlY29kZSB0byAzMjAgOGtIeiBzYW1wbGVzCkBAIC0zMjEsMTggKzMzOSwxOCBAQAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnl0ZXNQZXJTYW1wbGUgPSBtQml0c1BlclNhbXBsZSA+PiAzOwogCiAgICAgICAgICAgICAgICAgICAgIGlmICghYnl0ZXNQZXJTYW1wbGUgfHwgIW1OdW1DaGFubmVscykKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKIAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtX3NhbXBsZXMgPSBtRGF0YVNpemUgLyAobU51bUNoYW5uZWxzICogYnl0ZXNQZXJTYW1wbGUpOwogCiAgICAgICAgICAgICAgICAgICAgIGlmICghbVNhbXBsZVJhdGUpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAKICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25VcyA9CiAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwTEwgKiBudW1fc2FtcGxlcyAvIG1TYW1wbGVSYXRlOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobVRyYWNrTWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgZHVyYXRpb25Vcyk7CiAKICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgICAgICB9CkBAIC0zNDcsMjUgKzM2NSwyMSBAQAogY29uc3Qgc2l6ZV90IFdBVlNvdXJjZTo6a01heEZyYW1lU2l6ZSA9IDMyNzY4OwogCiBXQVZTb3VyY2U6OldBVlNvdXJjZSgKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqZGF0YVNvdXJjZSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICB1aW50MTZfdCB3YXZlRm9ybWF0LAotICAgICAgICBpbnQzMl90IGJpdHNQZXJTYW1wbGUsCisgICAgICAgIGJvb2wgb3V0cHV0RmxvYXQsCiAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkKICAgICA6IG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAogICAgICAgbU1ldGEobWV0YSksCiAgICAgICBtV2F2ZUZvcm1hdCh3YXZlRm9ybWF0KSwKLSAgICAgIG1TYW1wbGVSYXRlKDApLAotICAgICAgbU51bUNoYW5uZWxzKDApLAotICAgICAgbUJpdHNQZXJTYW1wbGUoYml0c1BlclNhbXBsZSksCisgICAgICBtT3V0cHV0RmxvYXQob3V0cHV0RmxvYXQpLAogICAgICAgbU9mZnNldChvZmZzZXQpLAogICAgICAgbVNpemUoc2l6ZSksCi0gICAgICBtU3RhcnRlZChmYWxzZSksCi0gICAgICBtR3JvdXAoTlVMTCkgewotICAgIENIRUNLKG1NZXRhLmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJm1TYW1wbGVSYXRlKSk7Ci0gICAgQ0hFQ0sobU1ldGEuZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZtTnVtQ2hhbm5lbHMpKTsKLQotICAgIG1NZXRhLnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIGtNYXhGcmFtZVNpemUpOworICAgICAgbVN0YXJ0ZWQoZmFsc2UpIHsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsICZtU2FtcGxlUmF0ZSkpOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCAmbU51bUNoYW5uZWxzKSk7CisgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSwgJm1CaXRzUGVyU2FtcGxlKSk7CiB9CiAKIFdBVlNvdXJjZTo6fldBVlNvdXJjZSgpIHsKQEAgLTM3NCw1MiArMzg4LDUxIEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBXQVZTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqIC8qIHBhcmFtcyAqLykgeworbWVkaWFfc3RhdHVzX3QgV0FWU291cmNlOjpzdGFydCgpIHsKICAgICBBTE9HVigiV0FWU291cmNlOjpzdGFydCIpOwogCiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKIAogICAgIC8vIHNvbWUgV0FWIGZpbGVzIG1heSBoYXZlIGxhcmdlIGF1ZGlvIGJ1ZmZlcnMgdGhhdCB1c2Ugc2hhcmVkIG1lbW9yeSB0cmFuc2Zlci4KLSAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cCg0IC8qIGJ1ZmZlcnMgKi8sIGtNYXhGcmFtZVNpemUpOwotCi0gICAgaWYgKG1CaXRzUGVyU2FtcGxlID09IDgpIHsKLSAgICAgICAgLy8gQXMgYSB0ZW1wb3JhcnkgYnVmZmVyIGZvciA4LT4xNiBiaXQgY29udmVyc2lvbi4KLSAgICAgICAgbUdyb3VwLT5hZGRfYnVmZmVyKE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKGtNYXhGcmFtZVNpemUpKTsKKyAgICBpZiAoIW1CdWZmZXJHcm91cC0+aW5pdCg0IC8qIGJ1ZmZlcnMgKi8sIGtNYXhGcmFtZVNpemUpKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICBtQ3VycmVudFBvcyA9IG1PZmZzZXQ7CiAKICAgICBtU3RhcnRlZCA9IHRydWU7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgV0FWU291cmNlOjpzdG9wKCkgeworbWVkaWFfc3RhdHVzX3QgV0FWU291cmNlOjpzdG9wKCkgewogICAgIEFMT0dWKCJXQVZTb3VyY2U6OnN0b3AiKTsKIAogICAgIENIRUNLKG1TdGFydGVkKTsKIAotICAgIGRlbGV0ZSBtR3JvdXA7Ci0gICAgbUdyb3VwID0gTlVMTDsKLQogICAgIG1TdGFydGVkID0gZmFsc2U7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgV0FWU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7CittZWRpYV9zdGF0dXNfdCBXQVZTb3VyY2U6OmdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpIHsKICAgICBBTE9HVigiV0FWU291cmNlOjpnZXRGb3JtYXQiKTsKIAotICAgIG1ldGEgPSBtTWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgY29uc3QgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbU1ldGEpOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsIGtNYXhGcmFtZVNpemUpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9QQ01fRU5DT0RJTkcsCisgICAgICAgICAgICAgICAgbU91dHB1dEZsb2F0ID8ga0F1ZGlvRW5jb2RpbmdQY21GbG9hdCA6IGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBXQVZTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKK21lZGlhX3N0YXR1c190IFdBVlNvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgKm91dCA9IE5VTEw7CiAKLSAgICBpZiAob3B0aW9ucyAhPSBudWxscHRyICYmIG9wdGlvbnMtPmdldE5vbkJsb2NraW5nKCkgJiYgIW1Hcm91cC0+aGFzX2J1ZmZlcnMoKSkgewotICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CisgICAgaWYgKG9wdGlvbnMgIT0gbnVsbHB0ciAmJiBvcHRpb25zLT5nZXROb25CbG9ja2luZygpICYmICFtQnVmZmVyR3JvdXAtPmhhc19idWZmZXJzKCkpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9XT1VMRF9CTE9DSzsKICAgICB9CiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CkBAIC00NDEsMTggKzQ1NCwyMiBAQAogICAgICAgICBtQ3VycmVudFBvcyA9IHBvcyArIG1PZmZzZXQ7CiAgICAgfQogCi0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyOworICAgIG1lZGlhX3N0YXR1c190IGVyciA9IG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIC8vIG1ha2Ugc3VyZSB0aGF0IG1heEJ5dGVzVG9SZWFkIGlzIG11bHRpcGxlIG9mIDMsIGluIDI0LWJpdCBjYXNlCi0gICAgc2l6ZV90IG1heEJ5dGVzVG9SZWFkID0KLSAgICAgICAgbUJpdHNQZXJTYW1wbGUgPT0gOCA/IGtNYXhGcmFtZVNpemUgLyAyIDogCi0gICAgICAgIChtQml0c1BlclNhbXBsZSA9PSAyNCA/IDMqKGtNYXhGcmFtZVNpemUvMyk6IGtNYXhGcmFtZVNpemUpOworICAgIC8vIG1heEJ5dGVzVG9SZWFkIG1heSBiZSByZWR1Y2VkIHNvIHRoYXQgaW4tcGxhY2UgZGF0YSBjb252ZXJzaW9uIHdpbGwgZml0IGluIGJ1ZmZlciBzaXplLgorICAgIGNvbnN0IHNpemVfdCBidWZmZXJTaXplID0gc3RkOjptaW4oYnVmZmVyLT5zaXplKCksIGtNYXhGcmFtZVNpemUpOworICAgIHNpemVfdCBtYXhCeXRlc1RvUmVhZDsKKyAgICBpZiAobU91dHB1dEZsb2F0KSB7IC8vIGRlc3RpbmF0aW9uIGlzIGZsb2F0IGF0IDQgYnl0ZXMgcGVyIHNhbXBsZSwgc291cmNlIG1heSBiZSBsZXNzLgorICAgICAgICBtYXhCeXRlc1RvUmVhZCA9IChtQml0c1BlclNhbXBsZSAvIDgpICogKGJ1ZmZlclNpemUgLyA0KTsKKyAgICB9IGVsc2UgeyAvLyBkZXN0aW5hdGlvbiBpcyBpbnQxNl90IGF0IDIgYnl0ZXMgcGVyIHNhbXBsZSwgb25seSBzb3VyY2Ugb2YgOCBiaXRzIGlzIGxlc3MuCisgICAgICAgIG1heEJ5dGVzVG9SZWFkID0gbUJpdHNQZXJTYW1wbGUgPT0gOCA/IGJ1ZmZlclNpemUgLyAyIDogYnVmZmVyU2l6ZTsKKyAgICB9CiAKLSAgICBzaXplX3QgbWF4Qnl0ZXNBdmFpbGFibGUgPQorICAgIGNvbnN0IHNpemVfdCBtYXhCeXRlc0F2YWlsYWJsZSA9CiAgICAgICAgIChtQ3VycmVudFBvcyAtIG1PZmZzZXQgPj0gKG9mZjY0X3QpbVNpemUpCiAgICAgICAgICAgICA/IDAgOiBtU2l6ZSAtIChtQ3VycmVudFBvcyAtIG1PZmZzZXQpOwogCkBAIC00ODEsNDUgKzQ5OCw1OSBAQAogICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgYnVmZmVyID0gTlVMTDsKIAotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgIH0KIAogICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIG4pOwogCiAgICAgLy8gVE9ETzogYWRkIGNhcGFiaWxpdHkgdG8gcmV0dXJuIGRhdGEgYXMgZmxvYXQgUENNIGluc3RlYWQgb2YgMTYgYml0IFBDTS4KICAgICBpZiAobVdhdmVGb3JtYXQgPT0gV0FWRV9GT1JNQVRfUENNKSB7Ci0gICAgICAgIGlmIChtQml0c1BlclNhbXBsZSA9PSA4KSB7Ci0gICAgICAgICAgICAvLyBDb252ZXJ0IDgtYml0IHVuc2lnbmVkIHNhbXBsZXMgdG8gMTYtYml0IHNpZ25lZC4KLQotICAgICAgICAgICAgLy8gQ3JlYXRlIG5ldyBidWZmZXIgd2l0aCAyIGJ5dGUgd2lkZSBzYW1wbGVzCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKnRtcDsKLSAgICAgICAgICAgIENIRUNLX0VRKG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJnRtcCksIChzdGF0dXNfdClPSyk7Ci0gICAgICAgICAgICB0bXAtPnNldF9yYW5nZSgwLCAyICogbik7Ci0KLSAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV91OCgoaW50MTZfdCAqKXRtcC0+ZGF0YSgpLCAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBuKTsKLSAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgYnVmZmVyID0gdG1wOwotICAgICAgICB9IGVsc2UgaWYgKG1CaXRzUGVyU2FtcGxlID09IDI0KSB7Ci0gICAgICAgICAgICAvLyBDb252ZXJ0IDI0LWJpdCBzaWduZWQgc2FtcGxlcyB0byAxNi1iaXQgc2lnbmVkIGluIHBsYWNlCi0gICAgICAgICAgICBjb25zdCBzaXplX3QgbnVtU2FtcGxlcyA9IG4gLyAzOwotCi0gICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fcDI0KChpbnQxNl90ICopYnVmZmVyLT5kYXRhKCksIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOworICAgICAgICBjb25zdCBzaXplX3QgYnl0ZXNQZXJGcmFtZSA9IChtQml0c1BlclNhbXBsZSA+PiAzKSAqIG1OdW1DaGFubmVsczsKKyAgICAgICAgY29uc3Qgc2l6ZV90IG51bUZyYW1lcyA9IG4gLyBieXRlc1BlckZyYW1lOworICAgICAgICBjb25zdCBzaXplX3QgbnVtU2FtcGxlcyA9IG51bUZyYW1lcyAqIG1OdW1DaGFubmVsczsKKyAgICAgICAgaWYgKG1PdXRwdXRGbG9hdCkgeworICAgICAgICAgICAgZmxvYXQgKmZkZXN0ID0gKGZsb2F0ICopYnVmZmVyLT5kYXRhKCk7CisgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCA0ICogbnVtU2FtcGxlcyk7CisgICAgICAgICAgICBzd2l0Y2ggKG1CaXRzUGVyU2FtcGxlKSB7CisgICAgICAgICAgICBjYXNlIDg6IHsKKyAgICAgICAgICAgICAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV91OChmZGVzdCwgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNjogeworICAgICAgICAgICAgICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kxNihmZGVzdCwgKGNvbnN0IGludDE2X3QgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNDogeworICAgICAgICAgICAgICAgIG1lbWNweV90b19mbG9hdF9mcm9tX3AyNChmZGVzdCwgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSAzMjogeyAvLyBidWZmZXIgcmFuZ2UgaXMgY29ycmVjdAorICAgICAgICAgICAgICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kzMihmZGVzdCwgKGNvbnN0IGludDMyX3QgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50MTZfdCAqaWRlc3QgPSAoaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpOwogICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgMiAqIG51bVNhbXBsZXMpOwotICAgICAgICB9ICBlbHNlIGlmIChtQml0c1BlclNhbXBsZSA9PSAzMikgewotICAgICAgICAgICAgLy8gQ29udmVydCAzMi1iaXQgc2lnbmVkIHNhbXBsZXMgdG8gMTYtYml0IHNpZ25lZCBpbiBwbGFjZQotICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bVNhbXBsZXMgPSBuIC8gNDsKLQotICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2kzMigoaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpLCAoY29uc3QgaW50MzJfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKLSAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDIgKiBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgIHN3aXRjaCAobUJpdHNQZXJTYW1wbGUpIHsKKyAgICAgICAgICAgIGNhc2UgODogeworICAgICAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV91OChpZGVzdCwgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNjoKKyAgICAgICAgICAgICAgICAvLyBubyBjb252ZXJzaW9uIG5lZWRlZAorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyNDogeworICAgICAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9wMjQoaWRlc3QsIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzI6IHsKKyAgICAgICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21faTMyKGlkZXN0LCAoY29uc3QgaW50MzJfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX0lFRUVfRkxPQVQpIHsKLSAgICAgICAgaWYgKG1CaXRzUGVyU2FtcGxlID09IDMyKSB7Ci0gICAgICAgICAgICAvLyBDb252ZXJ0IDMyLWJpdCBmbG9hdCBzYW1wbGVzIHRvIDE2LWJpdCBzaWduZWQgaW4gcGxhY2UKKyAgICAgICAgaWYgKCFtT3V0cHV0RmxvYXQpIHsgLy8gbUJpdHNQZXJTYW1wbGUgPT0gMzIKKyAgICAgICAgICAgIGludDE2X3QgKmlkZXN0ID0gKGludDE2X3QgKilidWZmZXItPmRhdGEoKTsKICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBudW1TYW1wbGVzID0gbiAvIDQ7Ci0KLSAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdCgoaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpLCAoY29uc3QgZmxvYXQgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7CisgICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQoaWRlc3QsIChjb25zdCBmbG9hdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKICAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDIgKiBudW1TYW1wbGVzKTsKICAgICAgICAgfQorICAgICAgICAvLyBOb3RlOiBpZiBvdXRwdXQgZW5jb2RpbmcgaXMgZmxvYXQsIG5vIG5lZWQgdG8gY29udmVydCBpZiBzb3VyY2UgaXMgZmxvYXQuCiAgICAgfQogCiAgICAgaW50NjRfdCB0aW1lU3RhbXBVcyA9IDA7CkBAIC01MzIsMzkgKzU2Myw0MyBAQAogICAgICAgICAgICAgICAgIC8gKG1OdW1DaGFubmVscyAqIGJ5dGVzUGVyU2FtcGxlKSAvIG1TYW1wbGVSYXRlOwogICAgIH0KIAotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIHRpbWVTdGFtcFVzKTsKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIHRpbWVTdGFtcFVzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKIAotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKICAgICBtQ3VycmVudFBvcyArPSBuOwogCiAgICAgKm91dCA9IGJ1ZmZlcjsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3IqIENyZWF0ZUV4dHJhY3RvcigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKK3N0YXRpYyBDTWVkaWFFeHRyYWN0b3IqIENyZWF0ZUV4dHJhY3RvcigKKyAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKICAgICAgICAgdm9pZCAqKSB7Ci0gICAgcmV0dXJuIG5ldyBXQVZFeHRyYWN0b3Ioc291cmNlKTsKKyAgICByZXR1cm4gd3JhcChuZXcgV0FWRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKHNvdXJjZSkpKTsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBTbmlmZigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKK3N0YXRpYyBDcmVhdG9yRnVuYyBTbmlmZigKKyAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCiAgICAgICAgIHZvaWQgKiosCi0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKikgeworICAgICAgICBGcmVlTWV0YUZ1bmMgKikgeworICAgIERhdGFTb3VyY2VIZWxwZXIgKmhlbHBlciA9IG5ldyBEYXRhU291cmNlSGVscGVyKHNvdXJjZSk7CiAgICAgY2hhciBoZWFkZXJbMTJdOwotICAgIGlmIChzb3VyY2UtPnJlYWRBdCgwLCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKSA8IChzc2l6ZV90KXNpemVvZihoZWFkZXIpKSB7CisgICAgaWYgKGhlbHBlci0+cmVhZEF0KDAsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpIDwgKHNzaXplX3Qpc2l6ZW9mKGhlYWRlcikpIHsKKyAgICAgICAgZGVsZXRlIGhlbHBlcjsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCiAgICAgaWYgKG1lbWNtcChoZWFkZXIsICJSSUZGIiwgNCkgfHwgbWVtY21wKCZoZWFkZXJbOF0sICJXQVZFIiwgNCkpIHsKKyAgICAgICAgZGVsZXRlIGhlbHBlcjsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgTWVkaWFFeHRyYWN0b3IgKmV4dHJhY3RvciA9IG5ldyBXQVZFeHRyYWN0b3Ioc291cmNlKTsKKyAgICBXQVZFeHRyYWN0b3IgKmV4dHJhY3RvciA9IG5ldyBXQVZFeHRyYWN0b3IoaGVscGVyKTsgLy8gZXh0cmFjdG9yIG93bnMgdGhlIGhlbHBlcgogICAgIGludCBudW1UcmFja3MgPSBleHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CiAgICAgZGVsZXRlIGV4dHJhY3RvcjsKICAgICBpZiAobnVtVHJhY2tzID09IDApIHsKQEAgLTU3NiwxNiArNjExLDIxIEBACiAgICAgcmV0dXJuIENyZWF0ZUV4dHJhY3RvcjsKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNbXSA9IHsKKyAgICAid2F2IiwKKyAgICBOVUxMCit9OworCiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICBVVUlEKCI3ZDYxMzg1OC01ODM3LTRhMzgtODRjNS0zMzJkMWNkZGVlMjciKSwKICAgICAgICAgMSwgLy8gdmVyc2lvbgogICAgICAgICAiV0FWIEV4dHJhY3RvciIsCi0gICAgICAgIFNuaWZmCisgICAgICAgIHsgLnYzID0ge1NuaWZmLCBleHRlbnNpb25zfSB9LAogICAgIH07CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvd2F2L1dBVkV4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmgKaW5kZXggNDY3ZDBiNy4uYjUxNDE5NiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmgKQEAgLTE5LDMwICsxOSwzMSBAQAogI2RlZmluZSBXQVZfRVhUUkFDVE9SX0hfCiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBBTWVzc2FnZTsKLWNsYXNzIERhdGFTb3VyY2VCYXNlOworc3RydWN0IENEYXRhU291cmNlOwogY2xhc3MgU3RyaW5nODsKIAotY2xhc3MgV0FWRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK2NsYXNzIFdBVkV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciB7CiBwdWJsaWM6Ci0gICAgZXhwbGljaXQgV0FWRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworICAgIGV4cGxpY2l0IFdBVkV4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIldBVkV4dHJhY3RvciI7IH0KIAogICAgIHZpcnR1YWwgfldBVkV4dHJhY3RvcigpOwogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwogICAgIGJvb2wgbVZhbGlkRm9ybWF0OwogICAgIHVpbnQxNl90IG1XYXZlRm9ybWF0OwpAQCAtNTIsNyArNTMsNyBAQAogICAgIHVpbnQxNl90IG1CaXRzUGVyU2FtcGxlOwogICAgIG9mZjY0X3QgbURhdGFPZmZzZXQ7CiAgICAgc2l6ZV90IG1EYXRhU2l6ZTsKLSAgICBNZXRhRGF0YUJhc2UgbVRyYWNrTWV0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1UcmFja01ldGE7CiAKICAgICBzdGF0dXNfdCBpbml0KCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9EbmdVdGlscy5oIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0RuZ1V0aWxzLmgKaW5kZXggZGU4ZjEyMC4uODgxOWY4NyAxMDA2NDQKLS0tIGEvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0RuZ1V0aWxzLmgKKysrIGIvbWVkaWEvaW1nX3V0aWxzL2luY2x1ZGUvaW1nX3V0aWxzL0RuZ1V0aWxzLmgKQEAgLTQ5LDYgKzQ5LDcgQEAKICAgICAgICAgICAgIENGQV9SR0dCLAogICAgICAgICAgICAgQ0ZBX0JHR1IsCiAgICAgICAgICAgICBDRkFfR0JSRywKKyAgICAgICAgICAgIENGQV9OT05FLAogICAgICAgICB9OwogCiAgICAgICAgIE9wY29kZUxpc3RCdWlsZGVyKCk7CkBAIC04OSw3ICs5MCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZmFMYXlvdXQgY2ZhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGxlbnNTaGFkaW5nTWFwKTsKIAotCiAgICAgICAgIC8qKgogICAgICAgICAgKiBBZGQgYSBHYWluTWFwIG9wY29kZSB3aXRoIHRoZSBnaXZlbiBmaWVsZHMuICBUaGUgbWFwR2FpbnMgYXJyYXkKICAgICAgICAgICogbXVzdCBoYXZlIG1hcFBvaW50c1YgKiBtYXBQb2ludHNIICogbWFwUGxhbmVzIGVsZW1lbnRzLgpAQCAtMTk3LDYgKzE5NywzMyBAQAogCiAgICAgICAgIHN0YXR1c190IGFkZE9wY29kZVByZWFtYmxlKHVpbnQzMl90IG9wY29kZUlkKTsKIAorICAgIHByaXZhdGU6CisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgQmF5ZXIgR2Fpbk1hcCBvcGNvZGUocykgZm9yIHRoZSBnaXZlbiBtZXRhZGF0YSBwYXJhbWV0ZXJzLgorICAgICAgICAgKiBDRkEgbGF5b3V0IG11c3QgbWF0Y2ggdGhlIGxheW91dCBvZiB0aGUgc2hhZGluZyBtYXAgcGFzc2VkIGludG8gdGhlCisgICAgICAgICAqIGxlbnNTaGFkaW5nTWFwIHBhcmFtZXRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICBzdGF0dXNfdCBhZGRCYXllckdhaW5NYXBzRm9yTWV0YWRhdGEodWludDMyX3QgbHNtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsc21IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2ZhTGF5b3V0IGNmYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBsZW5zU2hhZGluZ01hcCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZCBCYXllciBHYWluTWFwIG9wY29kZShzKSBmb3IgdGhlIGdpdmVuIG1ldGFkYXRhIHBhcmFtZXRlcnMuCisgICAgICAgICAqIENGQSBsYXlvdXQgbXVzdCBtYXRjaCB0aGUgbGF5b3V0IG9mIHRoZSBzaGFkaW5nIG1hcCBwYXNzZWQgaW50byB0aGUKKyAgICAgICAgICogbGVuc1NoYWRpbmdNYXAgcGFyYW1ldGVyLgorICAgICAgICAgKgorICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgICAgICovCisgICAgICAgIHN0YXR1c190IGFkZE1vbm9jaHJvbWVHYWluTWFwc0Zvck1ldGFkYXRhKHVpbnQzMl90IGxzbVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbHNtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBsZW5zU2hhZGluZ01hcCk7CiB9OwogCiB9IC8qbmFtZXNwYWNlIGltZ191dGlscyovCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvc3JjL0RuZ1V0aWxzLmNwcCBiL21lZGlhL2ltZ191dGlscy9zcmMvRG5nVXRpbHMuY3BwCmluZGV4IDlhYzdlMmEuLjc5MTQwMzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2ltZ191dGlscy9zcmMvRG5nVXRpbHMuY3BwCisrKyBiL21lZGlhL2ltZ191dGlscy9zcmMvRG5nVXRpbHMuY3BwCkBAIC02MCwzNCArNjAsMzYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFSaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENmYUxheW91dCBjZmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbGVuc1NoYWRpbmdNYXApIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKICAgICB1aW50MzJfdCBhY3RpdmVBcmVhV2lkdGggPSBhY3RpdmVBcmVhUmlnaHQgLSBhY3RpdmVBcmVhTGVmdDsKICAgICB1aW50MzJfdCBhY3RpdmVBcmVhSGVpZ2h0ID0gYWN0aXZlQXJlYUJvdHRvbSAtIGFjdGl2ZUFyZWFUb3A7Ci0gICAgZG91YmxlIHNwYWNpbmdWID0gMS4wIC8gc3RkOjptYXgoMXUsIGxzbUhlaWdodCAtIDEpOwotICAgIGRvdWJsZSBzcGFjaW5nSCA9IDEuMCAvIHN0ZDo6bWF4KDF1LCBsc21XaWR0aCAtIDEpOwogCi0gICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHJlZE1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7Ci0gICAgZmxvYXQgKnJlZE1hcCA9IHJlZE1hcFZlY3Rvci5kYXRhKCk7Ci0KLSAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gZ3JlZW5FdmVuTWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKLSAgICBmbG9hdCAqZ3JlZW5FdmVuTWFwID0gZ3JlZW5FdmVuTWFwVmVjdG9yLmRhdGEoKTsKLQotICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBncmVlbk9kZE1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7Ci0gICAgZmxvYXQgKmdyZWVuT2RkTWFwID0gZ3JlZW5PZGRNYXBWZWN0b3IuZGF0YSgpOwotCi0gICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGJsdWVNYXBWZWN0b3IobHNtV2lkdGggKiBsc21IZWlnaHQpOwotICAgIGZsb2F0ICpibHVlTWFwID0gYmx1ZU1hcFZlY3Rvci5kYXRhKCk7Ci0KLSAgICBzaXplX3QgbHNtTWFwU2l6ZSA9IGxzbVdpZHRoICogbHNtSGVpZ2h0ICogNDsKLQotICAgIC8vIFNwbGl0IGxlbnMgc2hhZGluZyBtYXAgY2hhbm5lbHMgaW50byBzZXBhcmF0ZSBhcnJheXMKLSAgICBzaXplX3QgaiA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsc21NYXBTaXplOyBpICs9IDQsICsraikgewotICAgICAgICByZWRNYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX1JfSU5EXTsKLSAgICAgICAgZ3JlZW5FdmVuTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9HRV9JTkRdOwotICAgICAgICBncmVlbk9kZE1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fR09fSU5EXTsKLSAgICAgICAgYmx1ZU1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fQl9JTkRdOworICAgIHN3aXRjaCAoY2ZhKSB7CisgICAgICAgIGNhc2UgQ0ZBX1JHR0I6CisgICAgICAgIGNhc2UgQ0ZBX0dSQkc6CisgICAgICAgIGNhc2UgQ0ZBX0dCUkc6CisgICAgICAgIGNhc2UgQ0ZBX0JHR1I6CisgICAgICAgICAgICBlcnIgPSBhZGRCYXllckdhaW5NYXBzRm9yTWV0YWRhdGEobHNtV2lkdGgsIGxzbUhlaWdodCwgYWN0aXZlQXJlYVdpZHRoLAorICAgICAgICAgICAgICAgICAgICBhY3RpdmVBcmVhSGVpZ2h0LCBjZmEsIGxlbnNTaGFkaW5nTWFwKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENGQV9OT05FOgorICAgICAgICAgICAgZXJyID0gYWRkTW9ub2Nocm9tZUdhaW5NYXBzRm9yTWV0YWRhdGEobHNtV2lkdGgsIGxzbUhlaWdodCwgYWN0aXZlQXJlYVdpZHRoLAorICAgICAgICAgICAgICAgICAgICBhY3RpdmVBcmVhSGVpZ2h0LCBsZW5zU2hhZGluZ01hcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5rbm93biBDRkEgbGF5b3V0ICVkIiwgX19GVU5DVElPTl9fLCBjZmEpOworICAgICAgICAgICAgZXJyID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgYnJlYWs7CiAgICAgfQorICAgIHJldHVybiBlcnI7Cit9CiAKK3N0YXR1c190IE9wY29kZUxpc3RCdWlsZGVyOjphZGRCYXllckdhaW5NYXBzRm9yTWV0YWRhdGEodWludDMyX3QgbHNtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsc21IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2ZhTGF5b3V0IGNmYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBsZW5zU2hhZGluZ01hcCkgewogICAgIHVpbnQzMl90IHJlZFRvcCA9IDA7CiAgICAgdWludDMyX3QgcmVkTGVmdCA9IDA7CiAgICAgdWludDMyX3QgZ3JlZW5FdmVuVG9wID0gMDsKQEAgLTE0MywxMCArMTQ1LDM2IEBACiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAorICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiByZWRNYXBWZWN0b3IobHNtV2lkdGggKiBsc21IZWlnaHQpOworICAgIGZsb2F0ICpyZWRNYXAgPSByZWRNYXBWZWN0b3IuZGF0YSgpOworCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGdyZWVuRXZlbk1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7CisgICAgZmxvYXQgKmdyZWVuRXZlbk1hcCA9IGdyZWVuRXZlbk1hcFZlY3Rvci5kYXRhKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gZ3JlZW5PZGRNYXBWZWN0b3IobHNtV2lkdGggKiBsc21IZWlnaHQpOworICAgIGZsb2F0ICpncmVlbk9kZE1hcCA9IGdyZWVuT2RkTWFwVmVjdG9yLmRhdGEoKTsKKworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBibHVlTWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKKyAgICBmbG9hdCAqYmx1ZU1hcCA9IGJsdWVNYXBWZWN0b3IuZGF0YSgpOworCisgICAgZG91YmxlIHNwYWNpbmdWID0gMS4wIC8gc3RkOjptYXgoMXUsIGxzbUhlaWdodCAtIDEpOworICAgIGRvdWJsZSBzcGFjaW5nSCA9IDEuMCAvIHN0ZDo6bWF4KDF1LCBsc21XaWR0aCAtIDEpOworCisgICAgc2l6ZV90IGxzbU1hcFNpemUgPSBsc21XaWR0aCAqIGxzbUhlaWdodCAqIDQ7CisKKyAgICAvLyBTcGxpdCBsZW5zIHNoYWRpbmcgbWFwIGNoYW5uZWxzIGludG8gc2VwYXJhdGUgYXJyYXlzCisgICAgc2l6ZV90IGogPSAwOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbHNtTWFwU2l6ZTsgaSArPSA0LCArK2opIHsKKyAgICAgICAgcmVkTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9SX0lORF07CisgICAgICAgIGdyZWVuRXZlbk1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fR0VfSU5EXTsKKyAgICAgICAgZ3JlZW5PZGRNYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX0dPX0lORF07CisgICAgICAgIGJsdWVNYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX0JfSU5EXTsKKyAgICB9CisKICAgICBzdGF0dXNfdCBlcnIgPSBhZGRHYWluTWFwKC8qdG9wKi9yZWRUb3AsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmxlZnQqL3JlZExlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmJvdHRvbSovYWN0aXZlQXJlYUhlaWdodCAtIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnJpZ2h0Ki9hY3RpdmVBcmVhV2lkdGggLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypib3R0b20qL2FjdGl2ZUFyZWFIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnJpZ2h0Ki9hY3RpdmVBcmVhV2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnBsYW5lKi8wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypwbGFuZXMqLzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnJvd1BpdGNoKi8yLApAQCAtMTYzLDggKzE5MSw4IEBACiAKICAgICBlcnIgPSBhZGRHYWluTWFwKC8qdG9wKi9ncmVlbkV2ZW5Ub3AsCiAgICAgICAgICAgICAgICAgICAgICAvKmxlZnQqL2dyZWVuRXZlbkxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAvKmJvdHRvbSovYWN0aXZlQXJlYUhlaWdodCAtIDEsCi0gICAgICAgICAgICAgICAgICAgICAvKnJpZ2h0Ki9hY3RpdmVBcmVhV2lkdGggLSAxLAorICAgICAgICAgICAgICAgICAgICAgLypib3R0b20qL2FjdGl2ZUFyZWFIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAvKnJpZ2h0Ki9hY3RpdmVBcmVhV2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAvKnBsYW5lKi8wLAogICAgICAgICAgICAgICAgICAgICAgLypwbGFuZXMqLzEsCiAgICAgICAgICAgICAgICAgICAgICAvKnJvd1BpdGNoKi8yLApAQCAtMTgxLDggKzIwOSw4IEBACiAKICAgICBlcnIgPSBhZGRHYWluTWFwKC8qdG9wKi9ncmVlbk9kZFRvcCwKICAgICAgICAgICAgICAgICAgICAgIC8qbGVmdCovZ3JlZW5PZGRMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgLypib3R0b20qL2FjdGl2ZUFyZWFIZWlnaHQgLSAxLAotICAgICAgICAgICAgICAgICAgICAgLypyaWdodCovYWN0aXZlQXJlYVdpZHRoIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgIC8qYm90dG9tKi9hY3RpdmVBcmVhSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgLypyaWdodCovYWN0aXZlQXJlYVdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgLypwbGFuZSovMCwKICAgICAgICAgICAgICAgICAgICAgIC8qcGxhbmVzKi8xLAogICAgICAgICAgICAgICAgICAgICAgLypyb3dQaXRjaCovMiwKQEAgLTE5OSw4ICsyMjcsOCBAQAogCiAgICAgZXJyID0gYWRkR2Fpbk1hcCgvKnRvcCovYmx1ZVRvcCwKICAgICAgICAgICAgICAgICAgICAgIC8qbGVmdCovYmx1ZUxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAvKmJvdHRvbSovYWN0aXZlQXJlYUhlaWdodCAtIDEsCi0gICAgICAgICAgICAgICAgICAgICAvKnJpZ2h0Ki9hY3RpdmVBcmVhV2lkdGggLSAxLAorICAgICAgICAgICAgICAgICAgICAgLypib3R0b20qL2FjdGl2ZUFyZWFIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAvKnJpZ2h0Ki9hY3RpdmVBcmVhV2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAvKnBsYW5lKi8wLAogICAgICAgICAgICAgICAgICAgICAgLypwbGFuZXMqLzEsCiAgICAgICAgICAgICAgICAgICAgICAvKnJvd1BpdGNoKi8yLApAQCAtMjE2LDYgKzI0NCw0NiBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKK3N0YXR1c190IE9wY29kZUxpc3RCdWlsZGVyOjphZGRNb25vY2hyb21lR2Fpbk1hcHNGb3JNZXRhZGF0YSh1aW50MzJfdCBsc21XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxzbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbGVuc1NoYWRpbmdNYXApIHsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gbWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKKyAgICBmbG9hdCAqbWFwID0gbWFwVmVjdG9yLmRhdGEoKTsKKworICAgIGRvdWJsZSBzcGFjaW5nViA9IDEuMCAvIHN0ZDo6bWF4KDF1LCBsc21IZWlnaHQgLSAxKTsKKyAgICBkb3VibGUgc3BhY2luZ0ggPSAxLjAgLyBzdGQ6Om1heCgxdSwgbHNtV2lkdGggLSAxKTsKKworICAgIHNpemVfdCBsc21NYXBTaXplID0gbHNtV2lkdGggKiBsc21IZWlnaHQgKiA0OworCisgICAgLy8gU3BsaXQgbGVucyBzaGFkaW5nIG1hcCBjaGFubmVscyBpbnRvIHNlcGFyYXRlIGFycmF5cworICAgIHNpemVfdCBqID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxzbU1hcFNpemU7IGkgKz0gNCwgKytqKSB7CisgICAgICAgIG1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2ldOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IGFkZEdhaW5NYXAoLyp0b3AqLzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmxlZnQqLzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmJvdHRvbSovYWN0aXZlQXJlYUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcmlnaHQqL2FjdGl2ZUFyZWFXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcGxhbmUqLzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnBsYW5lcyovMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcm93UGl0Y2gqLzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKmNvbFBpdGNoKi8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBQb2ludHNWKi9sc21IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcFBvaW50c0gqL2xzbVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBTcGFjaW5nViovc3BhY2luZ1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcFNwYWNpbmdIKi9zcGFjaW5nSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwT3JpZ2luViovMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwT3JpZ2luSCovMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwUGxhbmVzKi8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBHYWlucyovbWFwKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgcmV0dXJuIGVycjsKK30KKwogc3RhdHVzX3QgT3Bjb2RlTGlzdEJ1aWxkZXI6OmFkZEdhaW5NYXAodWludDMyX3QgdG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbGVmdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGJvdHRvbSwKQEAgLTI5Niw4ICszNjQsOCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIGRvdWJsZSBub3JtYWxpemVkT0NYID0gb3B0aWNhbENlbnRlclggLyBzdGF0aWNfY2FzdDxkb3VibGU+KGFjdGl2ZUFycmF5V2lkdGggLSAxKTsKLSAgICBkb3VibGUgbm9ybWFsaXplZE9DWSA9IG9wdGljYWxDZW50ZXJZIC8gc3RhdGljX2Nhc3Q8ZG91YmxlPihhY3RpdmVBcnJheUhlaWdodCAtIDEpOworICAgIGRvdWJsZSBub3JtYWxpemVkT0NYID0gb3B0aWNhbENlbnRlclggLyBzdGF0aWNfY2FzdDxkb3VibGU+KGFjdGl2ZUFycmF5V2lkdGgpOworICAgIGRvdWJsZSBub3JtYWxpemVkT0NZID0gb3B0aWNhbENlbnRlclkgLyBzdGF0aWNfY2FzdDxkb3VibGU+KGFjdGl2ZUFycmF5SGVpZ2h0KTsKIAogICAgIG5vcm1hbGl6ZWRPQ1ggPSBDTEFNUChub3JtYWxpemVkT0NYLCAwLCAxKTsKICAgICBub3JtYWxpemVkT0NZID0gQ0xBTVAobm9ybWFsaXplZE9DWSwgMCwgMSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vQW5kcm9pZC5icCBiL21lZGlhL2xpYmFhdWRpby9BbmRyb2lkLmJwCmluZGV4IGYwMGY3YTguLjE2OTU4ZjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmFhdWRpby9BbmRyb2lkLmJwCkBAIC0zMiw2ICszMiw2IEBACiBjY19saWJyYXJ5X2hlYWRlcnMgewogICAgIG5hbWU6ICJsaWJhYXVkaW9faGVhZGVycyIsCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgdmVyc2lvbl9zY3JpcHQ6ICJsaWJhYXVkaW8ubWFwLnR4dCIsCiB9CiAKLXN1YmRpcnMgPSBbIioiXQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvQW5kcm9pZC5icAppbmRleCA2MzlmYWIyLi40OWJkNWVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvQW5kcm9pZC5icApAQCAtMSw1ICsxLDMgQEAKLXN1YmRpcnMgPSBbIioiXQotCiBjY19saWJyYXJ5X2hlYWRlcnMgewogICAgIG5hbWU6ICJsaWJhYXVkaW9fZXhhbXBsZV91dGlscyIsCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJ1dGlscyJdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3IvQW5kcm9pZC5icCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL0FuZHJvaWQuYnAKaW5kZXggZDhjNTg0My4uNWQzOTliNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3IvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9BbmRyb2lkLmJwCkBAIC01LDYgKzUsNyBAQAogICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCiAgICAgc2hhcmVkX2xpYnM6IFsibGliYWF1ZGlvIl0sCiAgICAgaGVhZGVyX2xpYnM6IFsibGliYWF1ZGlvX2V4YW1wbGVfdXRpbHMiXSwKKyAgICBwYWNrX3JlbG9jYXRpb25zOiBmYWxzZSwKIH0KIAogY2NfdGVzdCB7CkBAIC0xNCw0ICsxNSw1IEBACiAgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKICAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKICAgICBoZWFkZXJfbGliczogWyJsaWJhYXVkaW9fZXhhbXBsZV91dGlscyJdLAorICAgIHBhY2tfcmVsb2NhdGlvbnM6IGZhbHNlLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivam5pL0FuZHJvaWQubWsgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9qbmkvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBiOTgxYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9qbmkvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vc3JjIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscwotCi0jIE5ESyByZWNvbW1lbmRzIHVzaW5nIHRoaXMga2luZCBvZiByZWxhdGl2ZSBwYXRoIGluc3RlYWQgb2YgYW4gYWJzb2x1dGUgcGF0aC4KLUxPQ0FMX1NSQ19GSUxFUzo9IC4uL3NyYy9pbnB1dF9tb25pdG9yLmNwcAotTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvCi1MT0NBTF9NT0RVTEUgOj0gaW5wdXRfbW9uaXRvcgotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IC4uL3NyYy9pbnB1dF9tb25pdG9yX2NhbGxiYWNrLmNwcAotTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvCi1MT0NBTF9NT0RVTEUgOj0gaW5wdXRfbW9uaXRvcl9jYWxsYmFjawotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IGxpYmFhdWRpb19wcmVidWlsdAotTE9DQUxfU1JDX0ZJTEVTIDo9IGxpYmFhdWRpby5zbwotTE9DQUxfRVhQT1JUX0NfSU5DTFVERVMgOj0gJChMT0NBTF9QQVRIKS9pbmNsdWRlCi1pbmNsdWRlICQoUFJFQlVJTFRfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9qbmkvQXBwbGljYXRpb24ubWsgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9qbmkvQXBwbGljYXRpb24ubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3NDQ3NWMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3Ivam5pL0FwcGxpY2F0aW9uLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi0jIFRPRE8gcmVtb3ZlIHRoZW4gd2hlbiB3ZSBzdXBwb3J0IG90aGVyIGFyY2hpdGVjdHVyZXMKLUFQUF9BQkkgOj0gYXJtNjQtdjhhCi1BUFBfQ1BQRkxBR1MgKz0gLXN0ZD1jKysxMQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svQW5kcm9pZC5icAppbmRleCA1YjdkOTU2Li41M2U1MDIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svQW5kcm9pZC5icApAQCAtOSw0ICs5LDUgQEAKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAogICAgICAgICBdLAogICAgIGhlYWRlcl9saWJzOiBbImxpYmFhdWRpb19leGFtcGxlX3V0aWxzIl0sCisgICAgcGFja19yZWxvY2F0aW9uczogZmFsc2UsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svam5pL0FuZHJvaWQubWsgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svam5pL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYmU4NzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL2puaS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscwotCi0jIE5ESyByZWNvbW1lbmRzIHVzaW5nIHRoaXMga2luZCBvZiByZWxhdGl2ZSBwYXRoIGluc3RlYWQgb2YgYW4gYWJzb2x1dGUgcGF0aC4KLUxPQ0FMX1NSQ19GSUxFUzo9IC4uL3NyYy9sb29wYmFjay5jcHAKLUxPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IGxpYnNuZGZpbGUKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGliYWF1ZGlvIGxpYmF1ZGlvdXRpbHMKLUxPQ0FMX01PRFVMRSA6PSBhYXVkaW9fbG9vcGJhY2sKLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL2puaS9BcHBsaWNhdGlvbi5tayBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9qbmkvQXBwbGljYXRpb24ubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNDRmMzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL2puaS9BcHBsaWNhdGlvbi5taworKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLUFQUF9DUFBGTEFHUyArPSAtc3RkPWMrKzExCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svc3JjL0xvb3BiYWNrQW5hbHl6ZXIuaCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvTG9vcGJhY2tBbmFseXplci5oCmluZGV4IGVmOWE3NTMuLjhlYjcwYjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvTG9vcGJhY2tBbmFseXplci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvTG9vcGJhY2tBbmFseXplci5oCkBAIC0zNCwxMiArMzQsMTIzIEBACiAKIC8vIFRhZyBmb3IgbWFjaGluZSByZWFkYWJsZSByZXN1bHRzIGFzIHByb3BlcnR5ID0gdmFsdWUgcGFpcnMKICNkZWZpbmUgTE9PUEJBQ0tfUkVTVUxUX1RBRyAgICAgICJSRVNVTFQ6ICIKLSNkZWZpbmUgTE9PUEJBQ0tfU0FNUExFX1JBVEUgICAgIDQ4MDAwCiAKLSNkZWZpbmUgTUlMTElTX1BFUl9TRUNPTkQgICAgICAgIDEwMDAKK2NvbnN0ZXhwciBpbnQzMl90IGtEZWZhdWx0U2FtcGxlUmF0ZSA9IDQ4MDAwOworY29uc3RleHByIGludDMyX3Qga01pbGxpc1BlclNlY29uZCAgID0gMTAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtNaW5MYXRlbmN5TWlsbGlzICA9IDQ7ICAgIC8vIGFyYml0cmFyeSBhbmQgdmVyeSBsb3cKK2NvbnN0ZXhwciBpbnQzMl90IGtNYXhMYXRlbmN5TWlsbGlzICA9IDQwMDsgIC8vIGFyYml0cmFyeSBhbmQgZ2VuZXJvdXMKK2NvbnN0ZXhwciBkb3VibGUgIGtNYXhFY2hvR2FpbiAgICAgICA9IDEwLjA7IC8vIGJhc2VkIG9uIGV4cGVyaW1lbnRzLCBvdGhlcndpc2UgdG9vIG5vaXN5Citjb25zdGV4cHIgZG91YmxlICBrTWluaW11bUNvbmZpZGVuY2UgPSAwLjU7CiAKLSNkZWZpbmUgTUFYX1pFUk9USF9QQVJUSUFMX0JJTlMgIDQwCi1jb25zdGV4cHIgZG91YmxlIE1BWF9FQ0hPX0dBSU4gPSAxMC4wOyAvLyBiYXNlZCBvbiBleHBlcmltZW50cywgb3RoZXJ3aXNlIGF1dG9jb3JyZWxhdGlvbiB0b28gbm9pc3kKK3N0YXRpYyB2b2lkIHByaW50QXVkaW9TY29wZShmbG9hdCBzYW1wbGUpIHsKKyAgICBjb25zdCBpbnQgbWF4U3RhcnMgPSA4MDsgLy8gYXJiaXRyYXJ5LCBmaXRzIG9uIG9uZSBsaW5lCisgICAgY2hhciBjID0gJyonOworICAgIGlmIChzYW1wbGUgPCAtMS4wKSB7CisgICAgICAgIHNhbXBsZSA9IC0xLjA7CisgICAgICAgIGMgPSAnJCc7CisgICAgfSBlbHNlIGlmIChzYW1wbGUgPiAxLjApIHsKKyAgICAgICAgc2FtcGxlID0gMS4wOworICAgICAgICBjID0gJyQnOworICAgIH0KKyAgICBpbnQgbnVtU3BhY2VzID0gKGludCkgKCgoc2FtcGxlICsgMS4wKSAqIDAuNSkgKiBtYXhTdGFycyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TcGFjZXM7IGkrKykgeworICAgICAgICBwdXRjaGFyKCcgJyk7CisgICAgfQorICAgIHByaW50ZigiJWNcbiIsIGMpOworfQorCisvKgorCitGSVIgZmlsdGVyIGRlc2lnbmVkIHdpdGgKK2h0dHA6Ly90LWZpbHRlci5hcHBzcG90LmNvbQorCitzYW1wbGluZyBmcmVxdWVuY3k6IDQ4MDAwIEh6CisKKyogMCBIeiAtIDgwMDAgSHoKKyAgZ2FpbiA9IDEuMgorICBkZXNpcmVkIHJpcHBsZSA9IDUgZEIKKyAgYWN0dWFsIHJpcHBsZSA9IDUuNTk1MjY2MTY5NzAzNjkzIGRCCisKKyogMTIwMDAgSHogLSAyMDAwMCBIegorICBnYWluID0gMAorICBkZXNpcmVkIGF0dGVudWF0aW9uID0gLTQwIGRCCisgIGFjdHVhbCBhdHRlbnVhdGlvbiA9IC0zNy41ODY5MTU2NjU3MTkxNCBkQgorCisqLworCisjZGVmaW5lIEZJTFRFUl9UQVBfTlVNIDExCisKK3N0YXRpYyBjb25zdCBmbG9hdCBzRmlsdGVyVGFwczgwMDBbRklMVEVSX1RBUF9OVU1dID0geworICAgICAgICAtMC4wNTk0NDIxOTM1MzM0MzE4OWYsCisgICAgICAgIC0wLjA3MzAzNDM0ODM5NTAzMjA4ZiwKKyAgICAgICAgLTAuMDM3NjkwNDg3NjcyNjg5MDY2ZiwKKyAgICAgICAgMC4xODcwNDgwNTA2NTk2NTEyZiwKKyAgICAgICAgMC4zOTEwMzM3MzU3ODM2ODMzZiwKKyAgICAgICAgMC41MzMzNjcyMzg1NDI1NjM3ZiwKKyAgICAgICAgMC4zOTEwMzM3MzU3ODM2ODMzZiwKKyAgICAgICAgMC4xODcwNDgwNTA2NTk2NTEyZiwKKyAgICAgICAgLTAuMDM3NjkwNDg3NjcyNjg5MDY2ZiwKKyAgICAgICAgLTAuMDczMDM0MzQ4Mzk1MDMyMDhmLAorICAgICAgICAtMC4wNTk0NDIxOTM1MzM0MzE4OWYKK307CisKK2NsYXNzIExvd1Bhc3NGaWx0ZXIgeworcHVibGljOgorCisgICAgLyoKKyAgICAgKiBGaWx0ZXIgb25lIGlucHV0IHNhbXBsZS4KKyAgICAgKiBAcmV0dXJuIGZpbHRlcmVkIG91dHB1dAorICAgICAqLworICAgIGZsb2F0IGZpbHRlcihmbG9hdCBpbnB1dCkgeworICAgICAgICBmbG9hdCBvdXRwdXQgPSAwLjBmOworICAgICAgICBtWFttQ3Vyc29yXSA9IGlucHV0OworICAgICAgICAvLyBJbmRleCBiYWNrd2FyZHMgb3ZlciB4LgorICAgICAgICBpbnQgeEluZGV4ID0gbUN1cnNvciArIEZJTFRFUl9UQVBfTlVNOworICAgICAgICAvLyBXcml0ZSB0d2ljZSBzbyB3ZSBhdm9pZCBoYXZpbmcgdG8gd3JhcCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBjb252b2x1dGlvbi4KKyAgICAgICAgbVhbeEluZGV4XSA9IGlucHV0OworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJTFRFUl9UQVBfTlVNOyBpKyspIHsKKyAgICAgICAgICAgIG91dHB1dCArPSBzRmlsdGVyVGFwczgwMDBbaV0gKiBtWFt4SW5kZXgtLV07CisgICAgICAgIH0KKyAgICAgICAgaWYgKCsrbUN1cnNvciA+PSBGSUxURVJfVEFQX05VTSkgeworICAgICAgICAgICAgbUN1cnNvciA9IDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG91dHB1dDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgUEFTU0VECisgICAgICovCisgICAgYm9vbCB0ZXN0KCkgeworICAgICAgICAvLyBNZWFzdXJlIHRoZSBpbXB1bHNlIG9mIHRoZSBmaWx0ZXIgYXQgZGlmZmVyZW50IHBoYXNlcyBzbyB3ZSBleGVyY2lzZQorICAgICAgICAvLyBhbGwgdGhlIHdyYXBhcm91bmQgY2FzZXMgaW4gdGhlIEZJUi4KKyAgICAgICAgZm9yIChpbnQgb2Zmc2V0ID0gMDsgb2Zmc2V0IDwgKEZJTFRFUl9UQVBfTlVNICogMik7IG9mZnNldCsrICkgeworICAgICAgICAgICAgLy8gcHJpbnRmKCJMb3dQYXNzRmlsdGVyOiBjdXJzb3IgPSAlZFxuIiwgbUN1cnNvcik7CisgICAgICAgICAgICAvLyBPZmZzZXQgYnkgb25lIGVhY2ggdGltZS4KKyAgICAgICAgICAgIGlmIChmaWx0ZXIoMC4wZikgIT0gMC4wZikgeworICAgICAgICAgICAgICAgIHByaW50ZigiRVJST1I6IGZpbHRlciBzaG91bGQgcmV0dXJuIDAuMCBiZWZvcmUgaW1wdWxzZSByZXNwb25zZVxuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSUxURVJfVEFQX05VTTsgaSsrKSB7CisgICAgICAgICAgICAgICAgZmxvYXQgb3V0cHV0ID0gZmlsdGVyKChpID09IDApID8gMS4wZiA6IDAuMGYpOyAvLyBpbXB1bHNlCisgICAgICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBzRmlsdGVyVGFwczgwMDBbaV0pIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJFUlJPUjogZmlsdGVyIHNob3VsZCByZXR1cm4gaW1wdWxzZSByZXNwb25zZVxuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJTFRFUl9UQVBfTlVNOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlsdGVyKDAuMGYpICE9IDAuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJFUlJPUjogZmlsdGVyIHNob3VsZCByZXR1cm4gMC4wIGFmdGVyIGltcHVsc2UgcmVzcG9uc2VcbiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworcHJpdmF0ZToKKyAgICBmbG9hdCAgIG1YW0ZJTFRFUl9UQVBfTlVNICogMl17fTsgLy8gdHdpY2UgYXMgYmlnIGFzIG5lZWRlZCB0byBhdm9pZCB3cmFwcGluZworICAgIGludDMyX3QgbUN1cnNvciA9IDA7Cit9OwogCiAvLyBBIG5hcnJvdyBpbXB1bHNlIHNlZW1zIHRvIGhhdmUgYmV0dGVyIGltbXVuaXR5IGFnYWluc3Qgb3ZlciBlc3RpbWF0aW5nIHRoZQogLy8gbGF0ZW5jeSBkdWUgdG8gZGV0ZWN0aW5nIHN1Ymhhcm1vbmljcyBieSB0aGUgYXV0by1jb3JyZWxhdG9yLgpAQCAtNzgsNiArMTg5LDEyIEBACiAgICAgaW50NjRfdCBtU2VlZCA9IDk5ODg3NzY2OwogfTsKIAorCit0eXBlZGVmIHN0cnVjdCBMYXRlbmN5UmVwb3J0X3MgeworICAgIGRvdWJsZSBsYXRlbmN5SW5GcmFtZXM7CisgICAgZG91YmxlIGNvbmZpZGVuY2U7Cit9IExhdGVuY3lSZXBvcnQ7CisKIHN0YXRpYyBkb3VibGUgY2FsY3VsYXRlQ29ycmVsYXRpb24oY29uc3QgZmxvYXQgKmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICpiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2luZG93U2l6ZSkKQEAgLTEwMSwxMzAgKzIxOCw3NSBAQAogICAgIHJldHVybiBjb3JyZWxhdGlvbjsKIH0KIAotc3RhdGljIGludCBjYWxjdWxhdGVDb3JyZWxhdGlvbnMoY29uc3QgZmxvYXQgKmhheXN0YWNrLCBpbnQgaGF5c3RhY2tTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKm5lZWRsZSwgaW50IG5lZWRsZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqcmVzdWx0cywgaW50IHJlc3VsdFNpemUpCi17Ci0gICAgaW50IG1heENvcnJlbGF0aW9ucyA9IGhheXN0YWNrU2l6ZSAtIG5lZWRsZVNpemU7Ci0gICAgaW50IG51bUNvcnJlbGF0aW9ucyA9IHN0ZDo6bWluKG1heENvcnJlbGF0aW9ucywgcmVzdWx0U2l6ZSk7Ci0KLSAgICBmb3IgKGludCBpYyA9IDA7IGljIDwgbnVtQ29ycmVsYXRpb25zOyBpYysrKSB7Ci0gICAgICAgIGRvdWJsZSBjb3JyZWxhdGlvbiA9IGNhbGN1bGF0ZUNvcnJlbGF0aW9uKCZoYXlzdGFja1tpY10sIG5lZWRsZSwgbmVlZGxlU2l6ZSk7Ci0gICAgICAgIHJlc3VsdHNbaWNdID0gY29ycmVsYXRpb247Ci0gICAgfQotCi0gICAgcmV0dXJuIG51bUNvcnJlbGF0aW9uczsKLX0KLQotLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwotLyoqCi0gKiBTY2FuIHVudGlsIHdlIGdldCBhIGNvcnJlbGF0aW9uIG9mIGEgc2luZ2xlIHNjYW4gdGhhdCBnb2VzIG92ZXIgdGhlIHRvbGVyYW5jZSBsZXZlbCwKLSAqIHBlYWtzIHRoZW4gZHJvcHMgYmFjayBkb3duLgotICovCi1zdGF0aWMgZG91YmxlIGZpbmRGaXJzdE1hdGNoKGNvbnN0IGZsb2F0ICpoYXlzdGFjaywgaW50IGhheXN0YWNrU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKm5lZWRsZSwgaW50IG5lZWRsZVNpemUsIGRvdWJsZSB0aHJlc2hvbGQgICkKLXsKLSAgICBpbnQgaWM7Ci0gICAgLy8gSG93IG1hbnkgY29ycmVsYXRpb25zIGNhbiB3ZSBjYWxjdWxhdGU/Ci0gICAgaW50IG51bUNvcnJlbGF0aW9ucyA9IGhheXN0YWNrU2l6ZSAtIG5lZWRsZVNpemU7Ci0gICAgZG91YmxlIG1heENvcnJlbGF0aW9uID0gMC4wOwotICAgIGludCBwZWFrSW5kZXggPSAtMTsKLSAgICBkb3VibGUgbG9jYXRpb24gPSAtMS4wOwotICAgIGNvbnN0IGRvdWJsZSBiYWNrVGhyZXNob2xkU2NhbGVyID0gMC41OwotCi0gICAgZm9yIChpYyA9IDA7IGljIDwgbnVtQ29ycmVsYXRpb25zOyBpYysrKSB7Ci0gICAgICAgIGRvdWJsZSBjb3JyZWxhdGlvbiA9IGNhbGN1bGF0ZUNvcnJlbGF0aW9uKCZoYXlzdGFja1tpY10sIG5lZWRsZSwgbmVlZGxlU2l6ZSk7Ci0KLSAgICAgICAgaWYoIChjb3JyZWxhdGlvbiA+IG1heENvcnJlbGF0aW9uKSApIHsKLSAgICAgICAgICAgIG1heENvcnJlbGF0aW9uID0gY29ycmVsYXRpb247Ci0gICAgICAgICAgICBwZWFrSW5kZXggPSBpYzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vcHJpbnRmKCJQYVFhX0ZpbmRGaXJzdE1hdGNoOiBpYyA9ICU0ZCwgY29ycmVsYXRpb24gPSAlOGYsIG1heFN1bSA9ICU4ZlxuIiwKLSAgICAgICAgLy8gICAgaWMsIGNvcnJlbGF0aW9uLCBtYXhTdW0gKTsKLSAgICAgICAgLy8gQXJlIHdlIHBhc3Qgd2hhdCB3ZSB3ZXJlIGxvb2tpbmcgZm9yPwotICAgICAgICBpZigobWF4Q29ycmVsYXRpb24gPiB0aHJlc2hvbGQpICYmIChjb3JyZWxhdGlvbiA8IGJhY2tUaHJlc2hvbGRTY2FsZXIgKiBtYXhDb3JyZWxhdGlvbikpIHsKLSAgICAgICAgICAgIGxvY2F0aW9uID0gcGVha0luZGV4OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbG9jYXRpb247Ci19Ci0KLXR5cGVkZWYgc3RydWN0IExhdGVuY3lSZXBvcnRfcyB7Ci0gICAgZG91YmxlIGxhdGVuY3lJbkZyYW1lczsKLSAgICBkb3VibGUgY29uZmlkZW5jZTsKLX0gTGF0ZW5jeVJlcG9ydDsKLQotLy8gQXBwbHkgYSB0ZWNobmlxdWUgc2ltaWxhciB0byBIYXJtb25pYyBQcm9kdWN0IFNwZWN0cnVtIEFuYWx5c2lzIHRvIGZpbmQgZWNobyBmdW5kYW1lbnRhbC4KLS8vIFVzaW5nIGZpcnN0IGVjaG8gaW5zdGVhZCBvZiB0aGUgb3JpZ2luYWwgaW1wdWxzZSBmb3IgYSBiZXR0ZXIgbWF0Y2guCi1zdGF0aWMgaW50IG1lYXN1cmVMYXRlbmN5RnJvbUVjaG9zKGNvbnN0IGZsb2F0ICpoYXlzdGFjaywgaW50IGhheXN0YWNrU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCAqbmVlZGxlLCBpbnQgbmVlZGxlU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXRlbmN5UmVwb3J0ICpyZXBvcnQpIHsKLSAgICBjb25zdCBkb3VibGUgdGhyZXNob2xkID0gMC4xOwotICAgIHByaW50ZigibWVhc3VyZUxhdGVuY3lGcm9tRWNob3M6IGhheXN0YWNrU2l6ZSA9ICVkLCBuZWVkbGVTaXplID0gJWRcbiIsCi0gICAgICAgICAgIGhheXN0YWNrU2l6ZSwgbmVlZGxlU2l6ZSk7Ci0KLSAgICAvLyBGaW5kIGZpcnN0IHBlYWsKLSAgICBpbnQgZmlyc3QgPSAoaW50KSAoZmluZEZpcnN0TWF0Y2goaGF5c3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhheXN0YWNrU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkbGVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGQpICsgMC41KTsKLQotICAgIC8vIFVzZSBmaXJzdCBlY2hvIGFzIHRoZSBuZWVkbGUgZm9yIHRoZSBvdGhlciBlY2hvcyBiZWNhdXNlCi0gICAgLy8gaXQgd2lsbCBiZSBtb3JlIHNpbWlsYXIuCi0gICAgbmVlZGxlID0gJmhheXN0YWNrW2ZpcnN0XTsKLSAgICBpbnQgYWdhaW4gPSAoaW50KSAoZmluZEZpcnN0TWF0Y2goaGF5c3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhheXN0YWNrU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVlZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkbGVTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJlc2hvbGQpICsgMC41KTsKLQotICAgIHByaW50ZigibWVhc3VyZUxhdGVuY3lGcm9tRWNob3M6IGZpcnN0ID0gJWQsIGFnYWluIGF0ICVkXG4iLCBmaXJzdCwgYWdhaW4pOwotICAgIGZpcnN0ID0gYWdhaW47Ci0KK3N0YXRpYyBpbnQgbWVhc3VyZUxhdGVuY3lGcm9tRWNob3MoY29uc3QgZmxvYXQgKmRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRmxvYXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhdGVuY3lSZXBvcnQgKnJlcG9ydCkgewogICAgIC8vIEFsbG9jYXRlIHJlc3VsdHMgYXJyYXkKLSAgICBpbnQgcmVtYWluaW5nID0gaGF5c3RhY2tTaXplIC0gZmlyc3Q7Ci0gICAgY29uc3QgaW50IG1heFJlYXNvbmFibGVMYXRlbmN5RnJhbWVzID0gNDgwMDAgKiAyOyAvLyBhcmJpdHJhcnkgYnV0IGdlbmVyb3VzIHZhbHVlCi0gICAgaW50IG51bUNvcnJlbGF0aW9ucyA9IHN0ZDo6bWluKHJlbWFpbmluZywgbWF4UmVhc29uYWJsZUxhdGVuY3lGcmFtZXMpOwotICAgIGZsb2F0ICpjb3JyZWxhdGlvbnMgPSBuZXcgZmxvYXRbbnVtQ29ycmVsYXRpb25zXTsKLSAgICBmbG9hdCAqaGFybW9uaWNTdW1zID0gbmV3IGZsb2F0W251bUNvcnJlbGF0aW9uc10oKTsgLy8gc2V0IHRvIHplcm8KKyAgICBjb25zdCBpbnQgbWluUmVhc29uYWJsZUxhdGVuY3lGcmFtZXMgPSBzYW1wbGVSYXRlICoga01pbkxhdGVuY3lNaWxsaXMgLyBrTWlsbGlzUGVyU2Vjb25kOworICAgIGNvbnN0IGludCBtYXhSZWFzb25hYmxlTGF0ZW5jeUZyYW1lcyA9IHNhbXBsZVJhdGUgKiBrTWF4TGF0ZW5jeU1pbGxpcyAvIGtNaWxsaXNQZXJTZWNvbmQ7CisgICAgaW50MzJfdCBtYXhDb3JyZWxhdGlvblNpemUgPSBtYXhSZWFzb25hYmxlTGF0ZW5jeUZyYW1lcyAqIDM7CisgICAgaW50IG51bUNvcnJlbGF0aW9ucyA9IHN0ZDo6bWluKG51bUZsb2F0cywgbWF4Q29ycmVsYXRpb25TaXplKTsKKyAgICBmbG9hdCAqY29ycmVsYXRpb25zID0gbmV3IGZsb2F0W251bUNvcnJlbGF0aW9uc117fTsKKyAgICBmbG9hdCAqaGFybW9uaWNTdW1zID0gbmV3IGZsb2F0W251bUNvcnJlbGF0aW9uc117fTsKIAotICAgIC8vIEdlbmVyYXRlIGNvcnJlbGF0aW9uIGZvciBldmVyeSBwb3NpdGlvbi4KLSAgICBudW1Db3JyZWxhdGlvbnMgPSBjYWxjdWxhdGVDb3JyZWxhdGlvbnMoJmhheXN0YWNrW2ZpcnN0XSwgcmVtYWluaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWVkbGUsIG5lZWRsZVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvcnJlbGF0aW9ucywgbnVtQ29ycmVsYXRpb25zKTsKKyAgICAvLyBQZXJmb3JtIHNsaWRpbmcgYXV0by1jb3JyZWxhdGlvbi4KKyAgICAvLyBTa2lwIGZpcnN0IGZyYW1lcyB0byBhdm9pZCBodWdlIHBlYWsgYXQgemVybyBvZmZzZXQuCisgICAgZm9yIChpbnQgaSA9IG1pblJlYXNvbmFibGVMYXRlbmN5RnJhbWVzOyBpIDwgbnVtQ29ycmVsYXRpb25zOyBpKyspIHsKKyAgICAgICAgaW50MzJfdCByZW1haW5pbmcgPSBudW1GbG9hdHMgLSBpOworICAgICAgICBmbG9hdCBjb3JyZWxhdGlvbiA9IChmbG9hdCkgY2FsY3VsYXRlQ29ycmVsYXRpb24oJmRhdGFbaV0sIGRhdGEsIHJlbWFpbmluZyk7CisgICAgICAgIGNvcnJlbGF0aW9uc1tpXSA9IGNvcnJlbGF0aW9uOworICAgICAgICAvLyBwcmludGYoImNvcnJlbGF0aW9uWyVkXSA9ICVmXG4iLCBpYywgY29ycmVsYXRpb24pOworICAgIH0KIAotICAgIC8vIEFkZCBoaWdoZXIgaGFybW9uaWNzIG1hcHBlZCBvbnRvIGxvd2VyIGhhcm1vbmljcy4KLSAgICAvLyBUaGlzIHJlaW5mb3JjZXMgdGhlICJmdW5kYW1lbnRhbCIgZWNoby4KLSAgICBjb25zdCBpbnQgbnVtRWNob2VzID0gMTA7CisgICAgLy8gQXBwbHkgYSB0ZWNobmlxdWUgc2ltaWxhciB0byBIYXJtb25pYyBQcm9kdWN0IFNwZWN0cnVtIEFuYWx5c2lzIHRvIGZpbmQgZWNobyBmdW5kYW1lbnRhbC4KKyAgICAvLyBBZGQgaGlnaGVyIGhhcm1vbmljcyBtYXBwZWQgb250byBsb3dlciBoYXJtb25pY3MuIFRoaXMgcmVpbmZvcmNlcyB0aGUgImZ1bmRhbWVudGFsIiBlY2hvLgorICAgIGNvbnN0IGludCBudW1FY2hvZXMgPSA4OwogICAgIGZvciAoaW50IHBhcnRpYWwgPSAxOyBwYXJ0aWFsIDwgbnVtRWNob2VzOyBwYXJ0aWFsKyspIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Db3JyZWxhdGlvbnM7IGkrKykgeworICAgICAgICBmb3IgKGludCBpID0gbWluUmVhc29uYWJsZUxhdGVuY3lGcmFtZXM7IGkgPCBudW1Db3JyZWxhdGlvbnM7IGkrKykgewogICAgICAgICAgICAgaGFybW9uaWNTdW1zW2kgLyBwYXJ0aWFsXSArPSBjb3JyZWxhdGlvbnNbaV0gLyBwYXJ0aWFsOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gRmluZCBoaWdoZXN0IHBlYWsgaW4gY29ycmVsYXRpb24gYXJyYXkuCiAgICAgZmxvYXQgbWF4Q29ycmVsYXRpb24gPSAwLjA7Ci0gICAgZmxvYXQgc3VtT2ZQZWFrcyA9IDAuMDsKICAgICBpbnQgcGVha0luZGV4ID0gMDsKLSAgICBjb25zdCBpbnQgc2tpcCA9IE1BWF9aRVJPVEhfUEFSVElBTF9CSU5TOyAvLyBza2lwIGxvdyBiaW5zCi0gICAgZm9yIChpbnQgaSA9IHNraXA7IGkgPCBudW1Db3JyZWxhdGlvbnM7IGkrKykgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ29ycmVsYXRpb25zOyBpKyspIHsKICAgICAgICAgaWYgKGhhcm1vbmljU3Vtc1tpXSA+IG1heENvcnJlbGF0aW9uKSB7CiAgICAgICAgICAgICBtYXhDb3JyZWxhdGlvbiA9IGhhcm1vbmljU3Vtc1tpXTsKLSAgICAgICAgICAgIHN1bU9mUGVha3MgKz0gbWF4Q29ycmVsYXRpb247CiAgICAgICAgICAgICBwZWFrSW5kZXggPSBpOwotICAgICAgICAgICAgcHJpbnRmKCJtYXhDb3JyZWxhdGlvbiA9ICVmIGF0ICVkXG4iLCBtYXhDb3JyZWxhdGlvbiwgcGVha0luZGV4KTsKKyAgICAgICAgICAgIC8vIHByaW50ZigibWF4Q29ycmVsYXRpb24gPSAlZiBhdCAlZFxuIiwgbWF4Q29ycmVsYXRpb24sIHBlYWtJbmRleCk7CiAgICAgICAgIH0KICAgICB9Ci0KICAgICByZXBvcnQtPmxhdGVuY3lJbkZyYW1lcyA9IHBlYWtJbmRleDsKLSAgICBpZiAoc3VtT2ZQZWFrcyA8IDAuMDAwMSkgeworLyoKKyAgICB7CisgICAgICAgIGludDMyX3QgdG9wUGVhayA9IHBlYWtJbmRleCAqIDcgLyAyOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvcFBlYWs7IGkrKykgeworICAgICAgICAgICAgZmxvYXQgc2FtcGxlID0gaGFybW9uaWNTdW1zW2ldOworICAgICAgICAgICAgcHJpbnRmKCIlNGQ6ICU3LjVmICIsIGksIHNhbXBsZSk7CisgICAgICAgICAgICBwcmludEF1ZGlvU2NvcGUoc2FtcGxlKTsKKyAgICAgICAgfQorICAgIH0KKyovCisKKyAgICAvLyBDYWxjdWxhdGUgY29uZmlkZW5jZS4KKyAgICBpZiAobWF4Q29ycmVsYXRpb24gPCAwLjAwMSkgewogICAgICAgICByZXBvcnQtPmNvbmZpZGVuY2UgPSAwLjA7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVwb3J0LT5jb25maWRlbmNlID0gbWF4Q29ycmVsYXRpb24gLyBzdW1PZlBlYWtzOworICAgICAgICAvLyBDb21wYXJlIHBlYWsgdG8gYXZlcmFnZSB2YWx1ZSBhcm91bmQgcGVhay4KKyAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzID0gc3RkOjptaW4obnVtQ29ycmVsYXRpb25zLCBwZWFrSW5kZXggKiAyKTsKKyAgICAgICAgaWYgKG51bVNhbXBsZXMgPD0gMCkgeworICAgICAgICAgICAgcmVwb3J0LT5jb25maWRlbmNlID0gMC4wOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZG91YmxlIHN1bSA9IDAuMDsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgc3VtICs9IGhhcm1vbmljU3Vtc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBhdmVyYWdlID0gc3VtIC8gbnVtU2FtcGxlczsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSByYXRpbyA9IGF2ZXJhZ2UgLyBtYXhDb3JyZWxhdGlvbjsgLy8gd2lsbCBiZSA8IDEuMAorICAgICAgICAgICAgcmVwb3J0LT5jb25maWRlbmNlID0gMS4wIC0gc3FydChyYXRpbyk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBkZWxldGVbXSBjb3JyZWxhdGlvbnM7CkBAIC0yNDgsNyArMzEwLDcgQEAKICAgICB9CiAKICAgICAvLyBXcml0ZSBTSE9SVCBkYXRhIGZyb20gdGhlIGZpcnN0IGNoYW5uZWwuCi0gICAgaW50IHdyaXRlKGludDE2X3QgKmlucHV0RGF0YSwgaW50IGlucHV0Q2hhbm5lbENvdW50LCBpbnQgbnVtRnJhbWVzKSB7CisgICAgaW50MzJfdCB3cml0ZShpbnQxNl90ICppbnB1dERhdGEsIGludDMyX3QgaW5wdXRDaGFubmVsQ291bnQsIGludDMyX3QgbnVtRnJhbWVzKSB7CiAgICAgICAgIC8vIHN0b3AgYXQgZW5kIG9mIGJ1ZmZlcgogICAgICAgICBpZiAoKG1GcmFtZUNvdW50ZXIgKyBudW1GcmFtZXMpID4gbU1heEZyYW1lcykgewogICAgICAgICAgICAgbnVtRnJhbWVzID0gbU1heEZyYW1lcyAtIG1GcmFtZUNvdW50ZXI7CkBAIC0yNjAsNyArMzIyLDcgQEAKICAgICB9CiAKICAgICAvLyBXcml0ZSBGTE9BVCBkYXRhIGZyb20gdGhlIGZpcnN0IGNoYW5uZWwuCi0gICAgaW50IHdyaXRlKGZsb2F0ICppbnB1dERhdGEsIGludCBpbnB1dENoYW5uZWxDb3VudCwgaW50IG51bUZyYW1lcykgeworICAgIGludDMyX3Qgd3JpdGUoZmxvYXQgKmlucHV0RGF0YSwgaW50MzJfdCBpbnB1dENoYW5uZWxDb3VudCwgaW50MzJfdCBudW1GcmFtZXMpIHsKICAgICAgICAgLy8gc3RvcCBhdCBlbmQgb2YgYnVmZmVyCiAgICAgICAgIGlmICgobUZyYW1lQ291bnRlciArIG51bUZyYW1lcykgPiBtTWF4RnJhbWVzKSB7CiAgICAgICAgICAgICBudW1GcmFtZXMgPSBtTWF4RnJhbWVzIC0gbUZyYW1lQ291bnRlcjsKQEAgLTI3MSw3ICszMzMsNyBAQAogICAgICAgICByZXR1cm4gbnVtRnJhbWVzOwogICAgIH0KIAotICAgIGludCBzaXplKCkgeworICAgIGludDMyX3Qgc2l6ZSgpIHsKICAgICAgICAgcmV0dXJuIG1GcmFtZUNvdW50ZXI7CiAgICAgfQogCkBAIC0zMjAsNyArMzgyLDkgQEAKICAgICAgICAgfQogCiAgICAgICAgIGFzc2VydChpbmZvLmNoYW5uZWxzID09IDEpOworICAgICAgICBhc3NlcnQoaW5mby5mb3JtYXQgPT0gU0ZfRk9STUFUX0ZMT0FUKTsKIAorICAgICAgICBzZXRTYW1wbGVSYXRlKGluZm8uc2FtcGxlcmF0ZSk7CiAgICAgICAgIGFsbG9jYXRlKGluZm8uZnJhbWVzKTsKICAgICAgICAgbUZyYW1lQ291bnRlciA9IHNmX3JlYWRmX2Zsb2F0KHNuZEZpbGUsIG1EYXRhLCBpbmZvLmZyYW1lcyk7CiAKQEAgLTMyOCwxMSArMzkyLDQ5IEBACiAgICAgICAgIHJldHVybiBtRnJhbWVDb3VudGVyOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFNxdWFyZSB0aGUgc2FtcGxlcyBzbyB0aGV5IGFyZSBhbGwgcG9zaXRpdmUgYW5kIHNvIHRoZSBwZWFrcyBhcmUgZW1waGFzaXplZC4KKyAgICAgKi8KKyAgICB2b2lkIHNxdWFyZSgpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtRnJhbWVDb3VudGVyOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IHNhbXBsZSA9IG1EYXRhW2ldOworICAgICAgICAgICAgbURhdGFbaV0gPSBzYW1wbGUgKiBzYW1wbGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBMb3cgcGFzcyBmaWx0ZXIgdGhlIHJlY29yZGluZyB1c2luZyBhIHNpbXBsZSBGSVIgZmlsdGVyLgorICAgICAqIE5vdGUgdGhhdCB0aGUgbG93cGFzcyBmaWx0ZXIgY3V0b2ZmIHRyYWNrcyB0aGUgc2FtcGxlIHJhdGUuCisgICAgICogVGhhdCBpcyBPSyBiZWNhdXNlIHRoZSBpbXB1bHNlIHdpZHRoIGlzIGEgZml4ZWQgbnVtYmVyIG9mIHNhbXBsZXMuCisgICAgICovCisgICAgdm9pZCBsb3dQYXNzRmlsdGVyKCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1GcmFtZUNvdW50ZXI7IGkrKykgeworICAgICAgICAgICAgbURhdGFbaV0gPSBtTG93UGFzc0ZpbHRlci5maWx0ZXIobURhdGFbaV0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVtb3ZlIERDIG9mZnNldCB1c2luZyBhIG9uZS1wb2xlIG9uZS16ZXJvIElJUiBmaWx0ZXIuCisgICAgICovCisgICAgdm9pZCBkY0Jsb2NrZXIoKSB7CisgICAgICAgIGNvbnN0IGZsb2F0IFIgPSAwLjk5NjsgLy8gbmFycm93IG5vdGNoIGF0IHplcm8gSHoKKyAgICAgICAgZmxvYXQgeDEgPSAwLjA7CisgICAgICAgIGZsb2F0IHkxID0gMC4wOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1GcmFtZUNvdW50ZXI7IGkrKykgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgeCA9IG1EYXRhW2ldOworICAgICAgICAgICAgY29uc3QgZmxvYXQgeSA9IHggLSB4MSArIChSICogeTEpOworICAgICAgICAgICAgbURhdGFbaV0gPSB5OworICAgICAgICAgICAgeTEgPSB5OworICAgICAgICAgICAgeDEgPSB4OworICAgICAgICB9CisgICAgfQorCiBwcml2YXRlOgotICAgIGZsb2F0ICAqbURhdGEgPSBudWxscHRyOwotICAgIGludDMyX3QgbUZyYW1lQ291bnRlciA9IDA7Ci0gICAgaW50MzJfdCBtTWF4RnJhbWVzID0gMDsKLSAgICBpbnQzMl90IG1TYW1wbGVSYXRlID0gNDgwMDA7IC8vIGNvbW1vbiBkZWZhdWx0CisgICAgZmxvYXQgICAgICAgICptRGF0YSA9IG51bGxwdHI7CisgICAgaW50MzJfdCAgICAgICBtRnJhbWVDb3VudGVyID0gMDsKKyAgICBpbnQzMl90ICAgICAgIG1NYXhGcmFtZXMgPSAwOworICAgIGludDMyX3QgICAgICAgbVNhbXBsZVJhdGUgPSBrRGVmYXVsdFNhbXBsZVJhdGU7IC8vIGNvbW1vbiBkZWZhdWx0CisgICAgTG93UGFzc0ZpbHRlciBtTG93UGFzc0ZpbHRlcjsKIH07CiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMzQxLDkgKzQ0MywxNCBAQAogICAgIHZpcnR1YWwgfkxvb3BiYWNrUHJvY2Vzc29yKCkgPSBkZWZhdWx0OwogCiAKKyAgICBlbnVtIHByb2Nlc3NfcmVzdWx0IHsKKyAgICAgICAgUFJPQ0VTU19SRVNVTFRfT0ssCisgICAgICAgIFBST0NFU1NfUkVTVUxUX0dMSVRDSAorICAgIH07CisKICAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKSB7fQogCi0gICAgdmlydHVhbCB2b2lkIHByb2Nlc3MoZmxvYXQgKmlucHV0RGF0YSwgaW50IGlucHV0Q2hhbm5lbENvdW50LAorICAgIHZpcnR1YWwgcHJvY2Vzc19yZXN1bHQgcHJvY2VzcyhmbG9hdCAqaW5wdXREYXRhLCBpbnQgaW5wdXRDaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgIGZsb2F0ICpvdXRwdXREYXRhLCBpbnQgb3V0cHV0Q2hhbm5lbENvdW50LAogICAgICAgICAgICAgICAgICBpbnQgbnVtRnJhbWVzKSA9IDA7CiAKQEAgLTM1Miw4ICs0NTksMTIgQEAKIAogICAgIHZpcnR1YWwgdm9pZCBwcmludFN0YXR1cygpIHt9OwogCi0gICAgdmlydHVhbCBpbnQgZ2V0UmVzdWx0KCkgewotICAgICAgICByZXR1cm4gLTE7CisgICAgaW50MzJfdCBnZXRSZXN1bHQoKSB7CisgICAgICAgIHJldHVybiBtUmVzdWx0OworICAgIH0KKworICAgIHZvaWQgc2V0UmVzdWx0KGludDMyX3QgcmVzdWx0KSB7CisgICAgICAgIG1SZXN1bHQgPSByZXN1bHQ7CiAgICAgfQogCiAgICAgdmlydHVhbCBib29sIGlzRG9uZSgpIHsKQEAgLTM4Miw3ICs0OTMsNyBAQAogICAgIHN0YXRpYyBmbG9hdCBtZWFzdXJlUGVha0FtcGxpdHVkZShmbG9hdCAqaW5wdXREYXRhLCBpbnQgaW5wdXRDaGFubmVsQ291bnQsIGludCBudW1GcmFtZXMpIHsKICAgICAgICAgZmxvYXQgcGVhayA9IDAuMGY7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRnJhbWVzOyBpKyspIHsKLSAgICAgICAgICAgIGZsb2F0IHBvcyA9IGZhYnMoKmlucHV0RGF0YSk7CisgICAgICAgICAgICBjb25zdCBmbG9hdCBwb3MgPSBmYWJzKCppbnB1dERhdGEpOwogICAgICAgICAgICAgaWYgKHBvcyA+IHBlYWspIHsKICAgICAgICAgICAgICAgICBwZWFrID0gcG9zOwogICAgICAgICAgICAgfQpAQCAtMzkzLDcgKzUwNCw4IEBACiAKIAogcHJpdmF0ZToKLSAgICBpbnQzMl90IG1TYW1wbGVSYXRlID0gTE9PUEJBQ0tfU0FNUExFX1JBVEU7CisgICAgaW50MzJfdCBtU2FtcGxlUmF0ZSA9IGtEZWZhdWx0U2FtcGxlUmF0ZTsKKyAgICBpbnQzMl90IG1SZXN1bHQgPSAwOwogfTsKIAogY2xhc3MgUGVha0RldGVjdG9yIHsKQEAgLTQxMiwyNCArNTI0LDYgQEAKICAgICBmbG9hdCAgbVByZXZpb3VzID0gMC4wZjsKIH07CiAKLQotc3RhdGljIHZvaWQgcHJpbnRBdWRpb1Njb3BlKGZsb2F0IHNhbXBsZSkgewotICAgIGNvbnN0IGludCBtYXhTdGFycyA9IDgwOyAvLyBhcmJpdHJhcnksIGZpdHMgb24gb25lIGxpbmUKLSAgICBjaGFyIGMgPSAnKic7Ci0gICAgaWYgKHNhbXBsZSA8IC0xLjApIHsKLSAgICAgICAgc2FtcGxlID0gLTEuMDsKLSAgICAgICAgYyA9ICckJzsKLSAgICB9IGVsc2UgaWYgKHNhbXBsZSA+IDEuMCkgewotICAgICAgICBzYW1wbGUgPSAxLjA7Ci0gICAgICAgIGMgPSAnJCc7Ci0gICAgfQotICAgIGludCBudW1TcGFjZXMgPSAoaW50KSAoKChzYW1wbGUgKyAxLjApICogMC41KSAqIG1heFN0YXJzKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNwYWNlczsgaSsrKSB7Ci0gICAgICAgIHB1dGNoYXIoJyAnKTsKLSAgICB9Ci0gICAgcHJpbnRmKCIlY1xuIiwgYyk7Ci19Ci0KIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLyoqCiAgKiBNZWFzdXJlIGxhdGVuY3kgZ2l2ZW4gYSBsb29wYmFjayBzdHJlYW0gZGF0YS4KQEAgLTQ1MCwxNyArNTQ0LDEzIEBACiAgICAgfQogCiAgICAgdm9pZCByZXNldCgpIG92ZXJyaWRlIHsKLSAgICAgICAgbURvd25Db3VudGVyID0gMjAwOworICAgICAgICBtRG93bkNvdW50ZXIgPSBnZXRTYW1wbGVSYXRlKCkgLyAyOwogICAgICAgICBtTG9vcENvdW50ZXIgPSAwOwogICAgICAgICBtTWVhc3VyZWRMb29wR2FpbiA9IDAuMGY7CiAgICAgICAgIG1FY2hvR2FpbiA9IDEuMGY7CiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0lOSVRJQUxfU0lMRU5DRTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIGludCBnZXRSZXN1bHQoKSB7Ci0gICAgICAgIHJldHVybiBtU3RhdGUgPT0gU1RBVEVfRE9ORSA/IDAgOiAtMTsKLSAgICB9Ci0KICAgICB2aXJ0dWFsIGJvb2wgaXNEb25lKCkgewogICAgICAgICByZXR1cm4gbVN0YXRlID09IFNUQVRFX0RPTkUgfHwgbVN0YXRlID09IFNUQVRFX0ZBSUxFRDsKICAgICB9CkBAIC00NzMsMjcgKzU2Myw1NyBAQAogICAgICAgICByZXR1cm4gbUVjaG9HYWluOwogICAgIH0KIAotICAgIHZvaWQgcmVwb3J0KCkgb3ZlcnJpZGUgeworICAgIGJvb2wgdGVzdExvd1Bhc3NGaWx0ZXIoKSB7CisgICAgICAgIExvd1Bhc3NGaWx0ZXIgZmlsdGVyOworICAgICAgICByZXR1cm4gZmlsdGVyLnRlc3QoKTsKKyAgICB9CiAKKyAgICB2b2lkIHJlcG9ydCgpIG92ZXJyaWRlIHsKICAgICAgICAgcHJpbnRmKCJFY2hvQW5hbHl6ZXIgLS0tLS0tLS0tLS0tLS0tXG4iKTsKLSAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgIm1lYXN1cmVkLmdhaW4gICAgICAgICAgPSAlZlxuIiwgbU1lYXN1cmVkTG9vcEdhaW4pOwotICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAiZWNoby5nYWluICAgICAgICAgICAgICA9ICVmXG4iLCBtRWNob0dhaW4pOwotICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAidGVzdC5zdGF0ZSAgICAgICAgICAgICA9ICVkXG4iLCBtU3RhdGUpOwotICAgICAgICBpZiAobU1lYXN1cmVkTG9vcEdhaW4gPj0gMC45OTk5KSB7CisgICAgICAgIGlmIChnZXRSZXN1bHQoKSAhPSAwKSB7CisgICAgICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAicmVzdWx0ICAgICAgICAgID0gJWRcbiIsIGdldFJlc3VsdCgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHByaW50ZigiTG93UGFzc0ZpbHRlciB0ZXN0ICVzXG4iLCB0ZXN0TG93UGFzc0ZpbHRlcigpID8gIlBBU1NFRCIgOiAiRkFJTEVEIik7CisKKyAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgIm1lYXN1cmVkLmdhaW4gICAgICAgICAgPSAlOGZcbiIsIG1NZWFzdXJlZExvb3BHYWluKTsKKyAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgImVjaG8uZ2FpbiAgICAgICAgICAgICAgPSAlOGZcbiIsIG1FY2hvR2Fpbik7CisgICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJ0ZXN0LnN0YXRlICAgICAgICAgICAgID0gJThkXG4iLCBtU3RhdGUpOworICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAidGVzdC5zdGF0ZS5uYW1lICAgICAgICA9ICU4c1xuIiwgY29udmVydFN0YXRlVG9UZXh0KG1TdGF0ZSkpOworCisgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfV0FJVElOR19GT1JfU0lMRU5DRSkgeworICAgICAgICAgICAgcHJpbnRmKCJXQVJOSU5HIC0gU3R1Y2sgd2FpdGluZyBmb3Igc2lsZW5jZS4gSW5wdXQgbWF5IGJlIHRvbyBub2lzeSFcbiIpOworICAgICAgICAgICAgc2V0UmVzdWx0KEVSUk9SX05PSVNZKTsKKyAgICAgICAgfSBlbHNlIGlmIChtTWVhc3VyZWRMb29wR2FpbiA+PSAwLjk5OTkpIHsKICAgICAgICAgICAgIHByaW50ZigiICAgRVJST1IgLSBjbGlwcGluZywgdHVybiBkb3duIHZvbHVtZSBzbGlnaHRseVxuIik7CisgICAgICAgICAgICBzZXRSZXN1bHQoRVJST1JfQ0xJUFBJTkcpOworICAgICAgICB9IGVsc2UgaWYgKG1TdGF0ZSAhPSBTVEFURV9ET05FICYmIG1TdGF0ZSAhPSBTVEFURV9HQVRIRVJJTkdfRUNIT1MpIHsKKyAgICAgICAgICAgIHByaW50ZigiV0FSTklORyAtIEJhZCBzdGF0ZS4gQ2hlY2sgdm9sdW1lIG9uIGRldmljZS5cbiIpOworICAgICAgICAgICAgc2V0UmVzdWx0KEVSUk9SX0lOVkFMSURfU1RBVEUpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29uc3QgZmxvYXQgKm5lZWRsZSA9IHNfSW1wdWxzZTsKLSAgICAgICAgICAgIGludCBuZWVkbGVTaXplID0gKGludCkgKHNpemVvZihzX0ltcHVsc2UpIC8gc2l6ZW9mKGZsb2F0KSk7Ci0gICAgICAgICAgICBmbG9hdCAqaGF5c3RhY2sgPSBtQXVkaW9SZWNvcmRpbmcuZ2V0RGF0YSgpOwotICAgICAgICAgICAgaW50IGhheXN0YWNrU2l6ZSA9IG1BdWRpb1JlY29yZGluZy5zaXplKCk7Ci0gICAgICAgICAgICBtZWFzdXJlTGF0ZW5jeUZyb21FY2hvcyhoYXlzdGFjaywgaGF5c3RhY2tTaXplLCBuZWVkbGUsIG5lZWRsZVNpemUsICZtTGF0ZW5jeVJlcG9ydCk7Ci0gICAgICAgICAgICBpZiAobUxhdGVuY3lSZXBvcnQuY29uZmlkZW5jZSA8IDAuMDEpIHsKLSAgICAgICAgICAgICAgICBwcmludGYoIiAgIEVSUk9SIC0gY29uZmlkZW5jZSB0b28gbG93ID0gJWZcbiIsIG1MYXRlbmN5UmVwb3J0LmNvbmZpZGVuY2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkb3VibGUgbGF0ZW5jeU1pbGxpcyA9IDEwMDAuMCAqIG1MYXRlbmN5UmVwb3J0LmxhdGVuY3lJbkZyYW1lcyAvIGdldFNhbXBsZVJhdGUoKTsKLSAgICAgICAgICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAibGF0ZW5jeS5mcmFtZXMgICAgICAgID0gJTguMmZcbiIsIG1MYXRlbmN5UmVwb3J0LmxhdGVuY3lJbkZyYW1lcyk7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgImxhdGVuY3kubXNlYyAgICAgICAgICA9ICU4LjJmXG4iLCBsYXRlbmN5TWlsbGlzKTsKLSAgICAgICAgICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAibGF0ZW5jeS5jb25maWRlbmNlICAgID0gJTguNmZcbiIsIG1MYXRlbmN5UmVwb3J0LmNvbmZpZGVuY2UpOworICAgICAgICAgICAgLy8gQ2xlYW51cCB0aGUgc2lnbmFsIHRvIGltcHJvdmUgdGhlIGF1dG8tY29ycmVsYXRpb24uCisgICAgICAgICAgICBtQXVkaW9SZWNvcmRpbmcuZGNCbG9ja2VyKCk7CisgICAgICAgICAgICBtQXVkaW9SZWNvcmRpbmcuc3F1YXJlKCk7CisgICAgICAgICAgICBtQXVkaW9SZWNvcmRpbmcubG93UGFzc0ZpbHRlcigpOworCisgICAgICAgICAgICBwcmludGYoIlBsZWFzZSB3YWl0IHNldmVyYWwgc2Vjb25kcyBmb3IgYXV0by1jb3JyZWxhdGlvbiB0byBjb21wbGV0ZS5cbiIpOworICAgICAgICAgICAgbWVhc3VyZUxhdGVuY3lGcm9tRWNob3MobUF1ZGlvUmVjb3JkaW5nLmdldERhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1JlY29yZGluZy5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRTYW1wbGVSYXRlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUxhdGVuY3lSZXBvcnQpOworCisgICAgICAgICAgICBkb3VibGUgbGF0ZW5jeU1pbGxpcyA9IGtNaWxsaXNQZXJTZWNvbmQgKiAoZG91YmxlKSBtTGF0ZW5jeVJlcG9ydC5sYXRlbmN5SW5GcmFtZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyBnZXRTYW1wbGVSYXRlKCk7CisgICAgICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAibGF0ZW5jeS5mcmFtZXMgICAgICAgICA9ICU4LjJmXG4iLAorICAgICAgICAgICAgICAgICAgIG1MYXRlbmN5UmVwb3J0LmxhdGVuY3lJbkZyYW1lcyk7CisgICAgICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAibGF0ZW5jeS5tc2VjICAgICAgICAgICA9ICU4LjJmXG4iLAorICAgICAgICAgICAgICAgICAgIGxhdGVuY3lNaWxsaXMpOworICAgICAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgImxhdGVuY3kuY29uZmlkZW5jZSAgICAgPSAlOC42ZlxuIiwKKyAgICAgICAgICAgICAgICAgICBtTGF0ZW5jeVJlcG9ydC5jb25maWRlbmNlKTsKKyAgICAgICAgICAgIGlmIChtTGF0ZW5jeVJlcG9ydC5jb25maWRlbmNlIDwga01pbmltdW1Db25maWRlbmNlKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgICBFUlJPUiAtIGNvbmZpZGVuY2UgdG9vIGxvdyFcbiIpOworICAgICAgICAgICAgICAgIHNldFJlc3VsdChFUlJPUl9DT05GSURFTkNFKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTUxOSw3ICs2MzksMTIgQEAKICAgICAgICAgc2VuZEltcHVsc2VzKG91dHB1dERhdGEsIG91dHB1dENoYW5uZWxDb3VudCwga0ltcHVsc2VTaXplSW5GcmFtZXMpOwogICAgIH0KIAotICAgIHZvaWQgcHJvY2VzcyhmbG9hdCAqaW5wdXREYXRhLCBpbnQgaW5wdXRDaGFubmVsQ291bnQsCisgICAgLy8gQHJldHVybiBudW1iZXIgb2YgZnJhbWVzIGZvciBhIHR5cGljYWwgYmxvY2sgb2YgcHJvY2Vzc2luZworICAgIGludDMyX3QgZ2V0QmxvY2tGcmFtZXMoKSB7CisgICAgICAgIHJldHVybiBnZXRTYW1wbGVSYXRlKCkgLyA4OworICAgIH0KKworICAgIHByb2Nlc3NfcmVzdWx0IHByb2Nlc3MoZmxvYXQgKmlucHV0RGF0YSwgaW50IGlucHV0Q2hhbm5lbENvdW50LAogICAgICAgICAgICAgICAgICBmbG9hdCAqb3V0cHV0RGF0YSwgaW50IG91dHB1dENoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgaW50IG51bUZyYW1lcykgb3ZlcnJpZGUgewogICAgICAgICBpbnQgY2hhbm5lbHNWYWxpZCA9IHN0ZDo6bWluKGlucHV0Q2hhbm5lbENvdW50LCBvdXRwdXRDaGFubmVsQ291bnQpOwpAQCAtNTI3LDcgKzY1Miw3IEBACiAgICAgICAgIGludCBudW1Xcml0dGVuOwogICAgICAgICBpbnQgbnVtU2FtcGxlczsKIAotICAgICAgICBlY2hvX3N0YXRlX3QgbmV4dFN0YXRlID0gbVN0YXRlOworICAgICAgICBlY2hvX3N0YXRlIG5leHRTdGF0ZSA9IG1TdGF0ZTsKIAogICAgICAgICBzd2l0Y2ggKG1TdGF0ZSkgewogICAgICAgICAgICAgY2FzZSBTVEFURV9JTklUSUFMX1NJTEVOQ0U6CkBAIC01MzYsMTAgKzY2MSwxMSBAQAogICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIG91dHB1dERhdGFbaV0gPSAwOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobURvd25Db3VudGVyLS0gPD0gMCkgeworICAgICAgICAgICAgICAgIG1Eb3duQ291bnRlciAtPSBudW1GcmFtZXM7CisgICAgICAgICAgICAgICAgaWYgKG1Eb3duQ291bnRlciA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIG5leHRTdGF0ZSA9IFNUQVRFX01FQVNVUklOR19HQUlOOwogICAgICAgICAgICAgICAgICAgICAvL3ByaW50ZigiJTVkOiBzd2l0Y2ggdG8gU1RBVEVfTUVBU1VSSU5HX0dBSU5cbiIsIG1Mb29wQ291bnRlcik7Ci0gICAgICAgICAgICAgICAgICAgIG1Eb3duQ291bnRlciA9IDg7CisgICAgICAgICAgICAgICAgICAgIG1Eb3duQ291bnRlciA9IGdldEJsb2NrRnJhbWVzKCkgKiAyOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKIApAQCAtNTQ4LDE0ICs2NzQsMTYgQEAKICAgICAgICAgICAgICAgICBwZWFrID0gbWVhc3VyZVBlYWtBbXBsaXR1ZGUoaW5wdXREYXRhLCBpbnB1dENoYW5uZWxDb3VudCwgbnVtRnJhbWVzKTsKICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBnZXQgc2V2ZXJhbCBpbiBhIHJvdyB0aGVuIGdvIHRvIG5leHQgc3RhdGUuCiAgICAgICAgICAgICAgICAgaWYgKHBlYWsgPiBtUHVsc2VUaHJlc2hvbGQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Eb3duQ291bnRlci0tIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbURvd25Db3VudGVyIC09IG51bUZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Eb3duQ291bnRlciA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50ZigiJTVkOiBzd2l0Y2ggdG8gU1RBVEVfV0FJVElOR19GT1JfU0lMRU5DRSwgbWVhc3VyZWQgcGVhayA9ICVmXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgbUxvb3BDb3VudGVyLCBwZWFrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Eb3duQ291bnRlciA9IDg7CisgICAgICAgICAgICAgICAgICAgICAgICBtRG93bkNvdW50ZXIgPSBnZXRCbG9ja0ZyYW1lcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgbU1lYXN1cmVkTG9vcEdhaW4gPSBwZWFrOyAgLy8gYXNzdW1lcyBvcmlnaW5hbCBwdWxzZSBhbXBsaXR1ZGUgaXMgb25lCisgICAgICAgICAgICAgICAgICAgICAgICBtU2lsZW5jZVRocmVzaG9sZCA9IHBlYWsgKiAwLjE7IC8vIHNjYWxlIHNpbGVuY2UgdG8gbWVhc3VyZWQgcHVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBnYWluIHRoYXQgd2lsbCBnaXZlIHVzIGEgbmljZSBkZWNheWluZyBlY2hvLgogICAgICAgICAgICAgICAgICAgICAgICAgbUVjaG9HYWluID0gbURlc2lyZWRFY2hvR2FpbiAvIG1NZWFzdXJlZExvb3BHYWluOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1FY2hvR2FpbiA+IE1BWF9FQ0hPX0dBSU4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRWNob0dhaW4gPiBrTWF4RWNob0dhaW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gbG9vcCBnYWluIHRvbyBsb3cuIEluY3JlYXNlIHRoZSB2b2x1bWUuXG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0U3RhdGUgPSBTVEFURV9GQUlMRUQ7CiAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNTYzLDcgKzY5MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG51bUZyYW1lcyA+IGtJbXB1bHNlU2l6ZUluRnJhbWVzKXsgLy8gaWdub3JlIHNob3J0IGNhbGxiYWNrcwotICAgICAgICAgICAgICAgICAgICBtRG93bkNvdW50ZXIgPSA4OworICAgICAgICAgICAgICAgICAgICBtRG93bkNvdW50ZXIgPSBnZXRCbG9ja0ZyYW1lcygpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKIApAQCAtNTc2LDEzICs3MDQsMTQgQEAKICAgICAgICAgICAgICAgICBwZWFrID0gbWVhc3VyZVBlYWtBbXBsaXR1ZGUoaW5wdXREYXRhLCBpbnB1dENoYW5uZWxDb3VudCwgbnVtRnJhbWVzKTsKICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBnZXQgc2V2ZXJhbCBpbiBhIHJvdyB0aGVuIGdvIHRvIG5leHQgc3RhdGUuCiAgICAgICAgICAgICAgICAgaWYgKHBlYWsgPCBtU2lsZW5jZVRocmVzaG9sZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobURvd25Db3VudGVyLS0gPD0gMCkgeworICAgICAgICAgICAgICAgICAgICBtRG93bkNvdW50ZXIgLT0gbnVtRnJhbWVzOworICAgICAgICAgICAgICAgICAgICBpZiAobURvd25Db3VudGVyIDw9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG5leHRTdGF0ZSA9IFNUQVRFX1NFTkRJTkdfUFVMU0U7CiAgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50ZigiJTVkOiBzd2l0Y2ggdG8gU1RBVEVfU0VORElOR19QVUxTRVxuIiwgbUxvb3BDb3VudGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Eb3duQ291bnRlciA9IDg7CisgICAgICAgICAgICAgICAgICAgICAgICBtRG93bkNvdW50ZXIgPSBnZXRCbG9ja0ZyYW1lcygpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbURvd25Db3VudGVyID0gODsKKyAgICAgICAgICAgICAgICAgICAgbURvd25Db3VudGVyID0gZ2V0QmxvY2tGcmFtZXMoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKQEAgLTYxNSwxNyArNzQ0LDE4IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChudW1Xcml0dGVuICA8IG51bUZyYW1lcykgewogICAgICAgICAgICAgICAgICAgICBuZXh0U3RhdGUgPSBTVEFURV9ET05FOwotICAgICAgICAgICAgICAgICAgICAvL3ByaW50ZigiJTVkOiBzd2l0Y2ggdG8gU1RBVEVfRE9ORVxuIiwgbUxvb3BDb3VudGVyKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgICAgIGNhc2UgU1RBVEVfRE9ORToKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfRkFJTEVEOgogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIG1TdGF0ZSA9IG5leHRTdGF0ZTsKICAgICAgICAgbUxvb3BDb3VudGVyKys7CisgICAgICAgIHJldHVybiBQUk9DRVNTX1JFU1VMVF9PSzsKICAgICB9CiAKICAgICBpbnQgc2F2ZShjb25zdCBjaGFyICpmaWxlTmFtZSkgb3ZlcnJpZGUgewpAQCAtNjMzLDEyICs3NjMsMjMgQEAKICAgICB9CiAKICAgICBpbnQgbG9hZChjb25zdCBjaGFyICpmaWxlTmFtZSkgb3ZlcnJpZGUgewotICAgICAgICByZXR1cm4gbUF1ZGlvUmVjb3JkaW5nLmxvYWQoZmlsZU5hbWUpOworICAgICAgICBpbnQgcmVzdWx0ID0gbUF1ZGlvUmVjb3JkaW5nLmxvYWQoZmlsZU5hbWUpOworICAgICAgICBzZXRTYW1wbGVSYXRlKG1BdWRpb1JlY29yZGluZy5nZXRTYW1wbGVSYXRlKCkpOworICAgICAgICBtU3RhdGUgPSBTVEFURV9ET05FOworICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAogcHJpdmF0ZToKIAotICAgIGVudW0gZWNob19zdGF0ZV90IHsKKyAgICBlbnVtIGVycm9yX2NvZGUgeworICAgICAgICBFUlJPUl9PSyA9IDAsCisgICAgICAgIEVSUk9SX05PSVNZID0gLTk5LAorICAgICAgICBFUlJPUl9DTElQUElORywKKyAgICAgICAgRVJST1JfQ09ORklERU5DRSwKKyAgICAgICAgRVJST1JfSU5WQUxJRF9TVEFURQorICAgIH07CisKKyAgICBlbnVtIGVjaG9fc3RhdGUgewogICAgICAgICBTVEFURV9JTklUSUFMX1NJTEVOQ0UsCiAgICAgICAgIFNUQVRFX01FQVNVUklOR19HQUlOLAogICAgICAgICBTVEFURV9XQUlUSU5HX0ZPUl9TSUxFTkNFLApAQCAtNjQ4LDYgKzc4OSwzNSBAQAogICAgICAgICBTVEFURV9GQUlMRUQKICAgICB9OwogCisgICAgY29uc3QgY2hhciAqY29udmVydFN0YXRlVG9UZXh0KGVjaG9fc3RhdGUgc3RhdGUpIHsKKyAgICAgICAgY29uc3QgY2hhciAqcmVzdWx0ID0gIlVua25vd24iOworICAgICAgICBzd2l0Y2goc3RhdGUpIHsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfSU5JVElBTF9TSUxFTkNFOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9ICJJTklUIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfTUVBU1VSSU5HX0dBSU46CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gIkdBSU4iOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTVEFURV9XQUlUSU5HX0ZPUl9TSUxFTkNFOgorICAgICAgICAgICAgICAgIHJlc3VsdCA9ICJTSUxFTkNFIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfU0VORElOR19QVUxTRToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAiUFVMU0UiOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTVEFURV9HQVRIRVJJTkdfRUNIT1M6CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gIkVDSE9TIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU1RBVEVfRE9ORToKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAiRE9ORSI7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFNUQVRFX0ZBSUxFRDoKKyAgICAgICAgICAgICAgICByZXN1bHQgPSAiRkFJTEVEIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworCiAgICAgaW50MzJfdCAgICAgICAgIG1Eb3duQ291bnRlciA9IDUwMDsKICAgICBpbnQzMl90ICAgICAgICAgbUxvb3BDb3VudGVyID0gMDsKICAgICBpbnQzMl90ICAgICAgICAgbVNhbXBsZUluZGV4ID0gMDsKQEAgLTY1Niw3ICs4MjYsNyBAQAogICAgIGZsb2F0ICAgICAgICAgICBtTWVhc3VyZWRMb29wR2FpbiA9IDAuMGY7CiAgICAgZmxvYXQgICAgICAgICAgIG1EZXNpcmVkRWNob0dhaW4gPSAwLjk1ZjsKICAgICBmbG9hdCAgICAgICAgICAgbUVjaG9HYWluID0gMS4wZjsKLSAgICBlY2hvX3N0YXRlX3QgICAgbVN0YXRlID0gU1RBVEVfSU5JVElBTF9TSUxFTkNFOworICAgIGVjaG9fc3RhdGUgICAgICBtU3RhdGUgPSBTVEFURV9JTklUSUFMX1NJTEVOQ0U7CiAKICAgICBBdWRpb1JlY29yZGluZyAgbUF1ZGlvUmVjb3JkaW5nOyAvLyBjb250YWlucyBvbmx5IHRoZSBpbnB1dCBhZnRlciB0aGUgZ2FpbiBkZXRlY3Rpb24gYnVyc3QKICAgICBMYXRlbmN5UmVwb3J0ICAgbUxhdGVuY3lSZXBvcnQ7CkBAIC02NzQsMjcgKzg0NCwzOCBAQAogY2xhc3MgU2luZUFuYWx5emVyIDogcHVibGljIExvb3BiYWNrUHJvY2Vzc29yIHsKIHB1YmxpYzoKIAotICAgIHZpcnR1YWwgaW50IGdldFJlc3VsdCgpIHsKLSAgICAgICAgcmV0dXJuIG1TdGF0ZSA9PSBTVEFURV9MT0NLRUQgPyAwIDogLTE7Ci0gICAgfQotCiAgICAgdm9pZCByZXBvcnQoKSBvdmVycmlkZSB7CiAgICAgICAgIHByaW50ZigiU2luZUFuYWx5emVyIC0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0gICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJwZWFrLmFtcGxpdHVkZSAgICAgPSAlNy41ZlxuIiwgbVBlYWtBbXBsaXR1ZGUpOwotICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAic2luZS5tYWduaXR1ZGUgICAgID0gJTcuNWZcbiIsIG1NYWduaXR1ZGUpOwotICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAicGhhc2Uub2Zmc2V0ICAgICAgID0gJTcuNWZcbiIsIG1QaGFzZU9mZnNldCk7Ci0gICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJyZWYucGhhc2UgICAgICAgICAgPSAlNy41ZlxuIiwgbVBoYXNlKTsKLSAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgImZyYW1lcy5hY2N1bXVsYXRlZCA9ICU2ZFxuIiwgbUZyYW1lc0FjY3VtdWxhdGVkKTsKLSAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgInNpbmUucGVyaW9kICAgICAgICA9ICU2ZFxuIiwgbVNpbmVQZXJpb2QpOwotICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAidGVzdC5zdGF0ZSAgICAgICAgID0gJTZkXG4iLCBtU3RhdGUpOwotICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAiZnJhbWUuY291bnQgICAgICAgID0gJTZkXG4iLCBtRnJhbWVDb3VudGVyKTsKKyAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgInBlYWsuYW1wbGl0dWRlICAgICA9ICU4ZlxuIiwgbVBlYWtBbXBsaXR1ZGUpOworICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAic2luZS5tYWduaXR1ZGUgICAgID0gJThmXG4iLCBtTWFnbml0dWRlKTsKKyAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgInBlYWsubm9pc2UgICAgICAgICA9ICU4ZlxuIiwgbVBlYWtOb2lzZSk7CisgICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJybXMubm9pc2UgICAgICAgICAgPSAlOGZcbiIsIG1Sb290TWVhblNxdWFyZU5vaXNlKTsKKyAgICAgICAgZmxvYXQgYW1wbGl0dWRlUmF0aW8gPSBtTWFnbml0dWRlIC8gbVBlYWtOb2lzZTsKKyAgICAgICAgZmxvYXQgc2lnbmFsVG9Ob2lzZSA9IGFtcGxpdHVkZVJhdGlvICogYW1wbGl0dWRlUmF0aW87CisgICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJzaWduYWwudG8ubm9pc2UgICAgPSAlOC4yZlxuIiwgc2lnbmFsVG9Ob2lzZSk7CisgICAgICAgIGZsb2F0IHNpZ25hbFRvTm9pc2VEQiA9IDEwLjAgKiBsb2coc2lnbmFsVG9Ob2lzZSk7CisgICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJzaWduYWwudG8ubm9pc2UuZGIgPSAlOC4yZlxuIiwgc2lnbmFsVG9Ob2lzZURCKTsKKyAgICAgICAgaWYgKHNpZ25hbFRvTm9pc2VEQiA8IE1JTl9TTlJBVElPX0RCKSB7CisgICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gc2lnbmFsIHRvIG5vaXNlIHJhdGlvIGlzIHRvbyBsb3chIDwgJWQgZEIuIEFkanVzdCB2b2x1bWUuXG4iLCBNSU5fU05SQVRJT19EQik7CisgICAgICAgICAgICBzZXRSZXN1bHQoRVJST1JfTk9JU1kpOworICAgICAgICB9CisgICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJmcmFtZXMuYWNjdW11bGF0ZWQgPSAlOGRcbiIsIG1GcmFtZXNBY2N1bXVsYXRlZCk7CisgICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJzaW5lLnBlcmlvZCAgICAgICAgPSAlOGRcbiIsIG1TaW5lUGVyaW9kKTsKKyAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgInRlc3Quc3RhdGUgICAgICAgICA9ICU4ZFxuIiwgbVN0YXRlKTsKKyAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgImZyYW1lLmNvdW50ICAgICAgICA9ICU4ZFxuIiwgbUZyYW1lQ291bnRlcik7CiAgICAgICAgIC8vIERpZCB3ZSBldmVyIGdldCBhIGxvY2s/CiAgICAgICAgIGJvb2wgZ290TG9jayA9IChtU3RhdGUgPT0gU1RBVEVfTE9DS0VEKSB8fCAobUdsaXRjaENvdW50ID4gMCk7CiAgICAgICAgIGlmICghZ290TG9jaykgewogICAgICAgICAgICAgcHJpbnRmKCJFUlJPUiAtIGZhaWxlZCB0byBsb2NrIG9uIHJlZmVyZW5jZSBzaW5lIHRvbmVcbiIpOworICAgICAgICAgICAgc2V0UmVzdWx0KEVSUk9SX05PX0xPQ0spOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gT25seSBwcmludCBpZiBtZWFuaW5nZnVsLgotICAgICAgICAgICAgcHJpbnRmKExPT1BCQUNLX1JFU1VMVF9UQUcgImdsaXRjaC5jb3VudCAgICAgICA9ICU2ZFxuIiwgbUdsaXRjaENvdW50KTsKKyAgICAgICAgICAgIHByaW50ZihMT09QQkFDS19SRVNVTFRfVEFHICJnbGl0Y2guY291bnQgICAgICAgPSAlOGRcbiIsIG1HbGl0Y2hDb3VudCk7CisgICAgICAgICAgICBwcmludGYoTE9PUEJBQ0tfUkVTVUxUX1RBRyAibWF4LmdsaXRjaCAgICAgICAgID0gJThmXG4iLCBtTWF4R2xpdGNoRGVsdGEpOworICAgICAgICAgICAgaWYgKG1HbGl0Y2hDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gbnVtYmVyIG9mIGdsaXRjaGVzID4gMFxuIik7CisgICAgICAgICAgICAgICAgc2V0UmVzdWx0KEVSUk9SX0dMSVRDSEVTKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtNzIxLDkgKzkwMiwxMCBAQAogICAgICAqIEBwYXJhbSBpbnB1dERhdGEgY29udGFpbnMgbWljcm9waG9uZSBkYXRhIHdpdGggc2luZSBzaWduYWwgZmVlZGJhY2sKICAgICAgKiBAcGFyYW0gb3V0cHV0RGF0YSBjb250YWlucyB0aGUgcmVmZXJlbmNlIHNpbmUgd2F2ZQogICAgICAqLwotICAgIHZvaWQgcHJvY2VzcyhmbG9hdCAqaW5wdXREYXRhLCBpbnQgaW5wdXRDaGFubmVsQ291bnQsCisgICAgcHJvY2Vzc19yZXN1bHQgcHJvY2VzcyhmbG9hdCAqaW5wdXREYXRhLCBpbnQgaW5wdXRDaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgIGZsb2F0ICpvdXRwdXREYXRhLCBpbnQgb3V0cHV0Q2hhbm5lbENvdW50LAogICAgICAgICAgICAgICAgICBpbnQgbnVtRnJhbWVzKSBvdmVycmlkZSB7CisgICAgICAgIHByb2Nlc3NfcmVzdWx0IHJlc3VsdCA9IFBST0NFU1NfUkVTVUxUX09LOwogICAgICAgICBtUHJvY2Vzc0NvdW50Kys7CiAKICAgICAgICAgZmxvYXQgcGVhayA9IG1lYXN1cmVQZWFrQW1wbGl0dWRlKGlucHV0RGF0YSwgaW5wdXRDaGFubmVsQ291bnQsIG51bUZyYW1lcyk7CkBAIC03MzIsMTUgKzkxNCw0OCBAQAogICAgICAgICB9CiAKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgeworICAgICAgICAgICAgYm9vbCBzaW5lRW5hYmxlZCA9IHRydWU7CiAgICAgICAgICAgICBmbG9hdCBzYW1wbGUgPSBpbnB1dERhdGFbaSAqIGlucHV0Q2hhbm5lbENvdW50XTsKIAogICAgICAgICAgICAgZmxvYXQgc2luT3V0ID0gc2luZihtUGhhc2UpOwogCiAgICAgICAgICAgICBzd2l0Y2ggKG1TdGF0ZSkgewogICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfSURMRToKLSAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX0lNTVVORToKLSAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1dBSVRJTkdfRk9SX1NJR05BTDoKKyAgICAgICAgICAgICAgICAgICAgc2luZUVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgbURvd25Db3VudGVyLS07CisgICAgICAgICAgICAgICAgICAgIGlmIChtRG93bkNvdW50ZXIgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfTUVBU1VSRV9OT0lTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Eb3duQ291bnRlciA9IE5PSVNFX0ZSQU1FX0NPVU5UOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfTUVBU1VSRV9OT0lTRToKKyAgICAgICAgICAgICAgICAgICAgc2luZUVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgbVBlYWtOb2lzZSA9IHN0ZDo6bWF4KGFicyhzYW1wbGUpLCBtUGVha05vaXNlKTsKKyAgICAgICAgICAgICAgICAgICAgbU5vaXNlU3VtU3F1YXJlZCArPSBzYW1wbGUgKiBzYW1wbGU7CisgICAgICAgICAgICAgICAgICAgIG1Eb3duQ291bnRlci0tOworICAgICAgICAgICAgICAgICAgICBpZiAobURvd25Db3VudGVyIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1dBSVRJTkdfRk9SX1NJR05BTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Sb290TWVhblNxdWFyZU5vaXNlID0gc3FydChtTm9pc2VTdW1TcXVhcmVkIC8gTk9JU0VfRlJBTUVfQ09VTlQpOworICAgICAgICAgICAgICAgICAgICAgICAgbVRvbGVyYW5jZSA9IHN0ZDo6bWF4KE1JTl9UT0xFUkFOQ0UsIG1QZWFrTm9pc2UgKiAyLjBmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QaGFzZSA9IDAuMDsgLy8gcHJldmVudCBzcGlrZSBhdCBzdGFydAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBTVEFURV9JTU1VTkU6CisgICAgICAgICAgICAgICAgICAgIG1Eb3duQ291bnRlci0tOworICAgICAgICAgICAgICAgICAgICBpZiAobURvd25Db3VudGVyIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1dBSVRJTkdfRk9SX1NJR05BTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgU1RBVEVfV0FJVElOR19GT1JfU0lHTkFMOgorICAgICAgICAgICAgICAgICAgICBpZiAocGVhayA+IG1UaHJlc2hvbGQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1dBSVRJTkdfRk9SX0xPQ0s7CisgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50ZigiJTVkOiBzd2l0Y2ggdG8gU1RBVEVfV0FJVElOR19GT1JfTE9DS1xuIiwgbUZyYW1lQ291bnRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXNldEFjY3VtdWxhdG9yKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKICAgICAgICAgICAgICAgICBjYXNlIFNUQVRFX1dBSVRJTkdfRk9SX0xPQ0s6CiAgICAgICAgICAgICAgICAgICAgIG1TaW5BY2N1bXVsYXRvciArPSBzYW1wbGUgKiBzaW5PdXQ7CiAgICAgICAgICAgICAgICAgICAgIG1Db3NBY2N1bXVsYXRvciArPSBzYW1wbGUgKiBjb3NmKG1QaGFzZSk7CkBAIC03NjYsMTMgKzk4MSwxNSBAQAogICAgICAgICAgICAgICAgICAgICAvLyBwcmludGYoIiAgICBwcmVkaWN0ZWQgPSAlZiwgYWN0dWFsID0gJWZcbiIsIHByZWRpY3RlZCwgc2FtcGxlKTsKIAogICAgICAgICAgICAgICAgICAgICBmbG9hdCBkaWZmID0gcHJlZGljdGVkIC0gc2FtcGxlOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmFicyhkaWZmKSA+IG1Ub2xlcmFuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgYWJzRGlmZiA9IGZhYnMoZGlmZik7CisgICAgICAgICAgICAgICAgICAgIG1NYXhHbGl0Y2hEZWx0YSA9IHN0ZDo6bWF4KG1NYXhHbGl0Y2hEZWx0YSwgYWJzRGlmZik7CisgICAgICAgICAgICAgICAgICAgIGlmIChhYnNEaWZmID4gbVRvbGVyYW5jZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbUdsaXRjaENvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBQUk9DRVNTX1JFU1VMVF9HTElUQ0g7CiAgICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50ZigiJTVkOiBHb3QgYSBnbGl0Y2ggIyAlZCwgcHJlZGljdGVkID0gJWYsIGFjdHVhbCA9ICVmXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgbUZyYW1lQ291bnRlciwgbUdsaXRjaENvdW50LCBwcmVkaWN0ZWQsIHNhbXBsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9JTU1VTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvL3ByaW50ZigiJTVkOiBzd2l0Y2ggdG8gU1RBVEVfSU1NVU5FXG4iLCBtRnJhbWVDb3VudGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Eb3duQ291bnRlciA9IG1TaW5lUGVyaW9kOyAgLy8gU2V0IGR1cmF0aW9uIG9mIElNTVVORSBzdGF0ZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1Eb3duQ291bnRlciA9IG1TaW5lUGVyaW9kICogUEVSSU9EU19JTU1VTkU7CiAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAvLyBUcmFjayBpbmNvbWluZyBzaWduYWwgYW5kIHNsb3dseSBhZGp1c3QgbWFnbml0dWRlIHRvIGFjY291bnQKQEAgLTc5Miw0NCArMTAwOSwyNCBAQAogICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGZsb2F0IG91dHB1dCA9IDAuMGY7CiAgICAgICAgICAgICAvLyBPdXRwdXQgc2luZSB3YXZlIHNvIHdlIGNhbiBtZWFzdXJlIGl0LgotICAgICAgICAgICAgb3V0cHV0RGF0YVtpICogb3V0cHV0Q2hhbm5lbENvdW50XSA9IChzaW5PdXQgKiBtT3V0cHV0QW1wbGl0dWRlKQotICAgICAgICAgICAgICAgICAgICArIChtV2hpdGVOb2lzZS5uZXh0UmFuZG9tRG91YmxlKCkgKiBtTm9pc2VBbXBsaXR1ZGUpOwotICAgICAgICAgICAgLy8gcHJpbnRmKCIlNWQ6IHNpbiglZikgPSAlZiwgJWZcbiIsIGksIG1QaGFzZSwgc2luT3V0LCAgbVBoYXNlSW5jcmVtZW50KTsKLQotICAgICAgICAgICAgLy8gYWR2YW5jZSBhbmQgd3JhcCBwaGFzZQotICAgICAgICAgICAgbVBoYXNlICs9IG1QaGFzZUluY3JlbWVudDsKLSAgICAgICAgICAgIGlmIChtUGhhc2UgPiBNX1BJKSB7Ci0gICAgICAgICAgICAgICAgbVBoYXNlIC09ICgyLjAgKiBNX1BJKTsKKyAgICAgICAgICAgIGlmIChzaW5lRW5hYmxlZCkgeworICAgICAgICAgICAgICAgIG91dHB1dCA9IChzaW5PdXQgKiBtT3V0cHV0QW1wbGl0dWRlKQorICAgICAgICAgICAgICAgICAgICAgICAgICsgKG1XaGl0ZU5vaXNlLm5leHRSYW5kb21Eb3VibGUoKSAqIG1Ob2lzZUFtcGxpdHVkZSk7CisgICAgICAgICAgICAgICAgLy8gcHJpbnRmKCIlNWQ6IHNpbiglZikgPSAlZiwgJWZcbiIsIGksIG1QaGFzZSwgc2luT3V0LCAgbVBoYXNlSW5jcmVtZW50KTsKKyAgICAgICAgICAgICAgICAvLyBhZHZhbmNlIGFuZCB3cmFwIHBoYXNlCisgICAgICAgICAgICAgICAgbVBoYXNlICs9IG1QaGFzZUluY3JlbWVudDsKKyAgICAgICAgICAgICAgICBpZiAobVBoYXNlID4gTV9QSSkgeworICAgICAgICAgICAgICAgICAgICBtUGhhc2UgLT0gKDIuMCAqIE1fUEkpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dHB1dERhdGFbaSAqIG91dHB1dENoYW5uZWxDb3VudF0gPSBvdXRwdXQ7CisKIAogICAgICAgICAgICAgbUZyYW1lQ291bnRlcisrOwogICAgICAgICB9Ci0KLSAgICAgICAgLy8gRG8gdGhlc2Ugb25jZSBwZXIgYnVmZmVyLgotICAgICAgICBzd2l0Y2ggKG1TdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBTVEFURV9JRExFOgotICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0lNTVVORTsgLy8gc28gd2UgY2FuIHRlbGwgd2hlbgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTVEFURV9JTU1VTkU6Ci0gICAgICAgICAgICAgICAgbURvd25Db3VudGVyIC09IG51bUZyYW1lczsKLSAgICAgICAgICAgICAgICBpZiAobURvd25Db3VudGVyIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfV0FJVElOR19GT1JfU0lHTkFMOwotICAgICAgICAgICAgICAgICAgICAvL3ByaW50ZigiJTVkOiBzd2l0Y2ggdG8gU1RBVEVfV0FJVElOR19GT1JfU0lHTkFMXG4iLCBtRnJhbWVDb3VudGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX1dBSVRJTkdfRk9SX1NJR05BTDoKLSAgICAgICAgICAgICAgICBpZiAocGVhayA+IG1UaHJlc2hvbGQpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfV0FJVElOR19GT1JfTE9DSzsKLSAgICAgICAgICAgICAgICAgICAgLy9wcmludGYoIiU1ZDogc3dpdGNoIHRvIFNUQVRFX1dBSVRJTkdfRk9SX0xPQ0tcbiIsIG1GcmFtZUNvdW50ZXIpOwotICAgICAgICAgICAgICAgICAgICByZXNldEFjY3VtdWxhdG9yKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTVEFURV9XQUlUSU5HX0ZPUl9MT0NLOgotICAgICAgICAgICAgY2FzZSBTVEFURV9MT0NLRUQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQorICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAogICAgIHZvaWQgcmVzZXRBY2N1bXVsYXRvcigpIHsKQEAgLTg0MCwxOCArMTAzNywzMSBAQAogCiAgICAgdm9pZCByZXNldCgpIG92ZXJyaWRlIHsKICAgICAgICAgbUdsaXRjaENvdW50ID0gMDsKLSAgICAgICAgbVN0YXRlID0gU1RBVEVfSU1NVU5FOwotICAgICAgICBtRG93bkNvdW50ZXIgPSBJTU1VTkVfRlJBTUVfQ09VTlQ7CisgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0lETEU7CisgICAgICAgIG1Eb3duQ291bnRlciA9IElETEVfRlJBTUVfQ09VTlQ7CiAgICAgICAgIG1QaGFzZUluY3JlbWVudCA9IDIuMCAqIE1fUEkgLyBtU2luZVBlcmlvZDsKICAgICAgICAgcHJpbnRmKCJwaGFzZUluYyA9ICVmIGZvciBwZXJpb2QgJWRcbiIsIG1QaGFzZUluY3JlbWVudCwgbVNpbmVQZXJpb2QpOwogICAgICAgICByZXNldEFjY3VtdWxhdG9yKCk7CiAgICAgICAgIG1Qcm9jZXNzQ291bnQgPSAwOworICAgICAgICBtUGVha05vaXNlID0gMC4wZjsKKyAgICAgICAgbU5vaXNlU3VtU3F1YXJlZCA9IDAuMDsKKyAgICAgICAgbVJvb3RNZWFuU3F1YXJlTm9pc2UgPSAwLjA7CisgICAgICAgIG1QaGFzZSA9IDAuMGY7CisgICAgICAgIG1NYXhHbGl0Y2hEZWx0YSA9IDAuMDsKICAgICB9CiAKIHByaXZhdGU6CiAKKyAgICBlbnVtIGVycm9yX2NvZGUgeworICAgICAgICBPSywKKyAgICAgICAgRVJST1JfTk9fTE9DSyA9IC04MCwKKyAgICAgICAgRVJST1JfR0xJVENIRVMsCisgICAgICAgIEVSUk9SX05PSVNZCisgICAgfTsKKwogICAgIGVudW0gc2luZV9zdGF0ZV90IHsKICAgICAgICAgU1RBVEVfSURMRSwKKyAgICAgICAgU1RBVEVfTUVBU1VSRV9OT0lTRSwKICAgICAgICAgU1RBVEVfSU1NVU5FLAogICAgICAgICBTVEFURV9XQUlUSU5HX0ZPUl9TSUdOQUwsCiAgICAgICAgIFNUQVRFX1dBSVRJTkdfRk9SX0xPQ0ssCkBAIC04NTksMTAgKzEwNjksMTYgQEAKICAgICB9OwogCiAgICAgZW51bSBjb25zdGFudHMgewotICAgICAgICBJTU1VTkVfRlJBTUVfQ09VTlQgPSA0OCAqIDUwMCwKLSAgICAgICAgUEVSSU9EU19ORUVERURfRk9SX0xPQ0sgPSA4CisgICAgICAgIC8vIEFyYml0cmFyeSBkdXJhdGlvbnMsIGFzc3VtaW5nIDQ4MDAwIEh6CisgICAgICAgIElETEVfRlJBTUVfQ09VTlQgPSA0OCAqIDEwMCwKKyAgICAgICAgTk9JU0VfRlJBTUVfQ09VTlQgPSA0OCAqIDYwMCwKKyAgICAgICAgUEVSSU9EU19ORUVERURfRk9SX0xPQ0sgPSA4LAorICAgICAgICBQRVJJT0RTX0lNTVVORSA9IDIsCisgICAgICAgIE1JTl9TTlJBVElPX0RCID0gNjUKICAgICB9OwogCisgICAgc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBNSU5fVE9MRVJBTkNFID0gMC4wMTsKKwogICAgIGludCAgICAgbVNpbmVQZXJpb2QgPSA3OTsKICAgICBkb3VibGUgIG1QaGFzZUluY3JlbWVudCA9IDAuMDsKICAgICBkb3VibGUgIG1QaGFzZSA9IDAuMDsKQEAgLTg3MCwyNSArMTA4NiwyOSBAQAogICAgIGRvdWJsZSAgbVByZXZpb3VzUGhhc2VPZmZzZXQgPSAwLjA7CiAgICAgZG91YmxlICBtTWFnbml0dWRlID0gMC4wOwogICAgIGRvdWJsZSAgbVRocmVzaG9sZCA9IDAuMDA1OwotICAgIGRvdWJsZSAgbVRvbGVyYW5jZSA9IDAuMDE7CisgICAgZG91YmxlICBtVG9sZXJhbmNlID0gTUlOX1RPTEVSQU5DRTsKICAgICBpbnQzMl90IG1GcmFtZXNBY2N1bXVsYXRlZCA9IDA7CiAgICAgaW50MzJfdCBtUHJvY2Vzc0NvdW50ID0gMDsKICAgICBkb3VibGUgIG1TaW5BY2N1bXVsYXRvciA9IDAuMDsKICAgICBkb3VibGUgIG1Db3NBY2N1bXVsYXRvciA9IDAuMDsKKyAgICBmbG9hdCAgIG1NYXhHbGl0Y2hEZWx0YSA9IDAuMGY7CiAgICAgaW50MzJfdCBtR2xpdGNoQ291bnQgPSAwOwogICAgIGRvdWJsZSAgbVBlYWtBbXBsaXR1ZGUgPSAwLjA7Ci0gICAgaW50ICAgICBtRG93bkNvdW50ZXIgPSBJTU1VTkVfRlJBTUVfQ09VTlQ7CisgICAgaW50ICAgICBtRG93bkNvdW50ZXIgPSBJRExFX0ZSQU1FX0NPVU5UOwogICAgIGludDMyX3QgbUZyYW1lQ291bnRlciA9IDA7CiAgICAgZmxvYXQgICBtT3V0cHV0QW1wbGl0dWRlID0gMC43NTsKIAorICAgIC8vIG1lYXN1cmUgYmFja2dyb3VuZCBub2lzZQorICAgIGZsb2F0ICAgbVBlYWtOb2lzZSA9IDAuMGY7CisgICAgZG91YmxlICBtTm9pc2VTdW1TcXVhcmVkID0gMC4wOworICAgIGRvdWJsZSAgbVJvb3RNZWFuU3F1YXJlTm9pc2UgPSAwLjA7CisKICAgICBQc2V1ZG9SYW5kb20gIG1XaGl0ZU5vaXNlOwogICAgIGZsb2F0ICAgbU5vaXNlQW1wbGl0dWRlID0gMC4wMDsgLy8gVXNlZCB0byBleHBlcmltZW50IHdpdGggd2FyYmxpbmcgY2F1c2VkIGJ5IERSQy4KIAogICAgIHNpbmVfc3RhdGVfdCAgbVN0YXRlID0gU1RBVEVfSURMRTsKIH07CiAKLQotI3VuZGVmIExPT1BCQUNLX1NBTVBMRV9SQVRFCiAjdW5kZWYgTE9PUEJBQ0tfUkVTVUxUX1RBRwogCiAjZW5kaWYgLyogQUFVRElPX0VYQU1QTEVTX0xPT1BCQUNLX0FOQUxZU0VSX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvbG9vcGJhY2suY3BwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9sb29wYmFjay5jcHAKaW5kZXggOTFlYmY3My4uNDlkOTIxZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9sb29wYmFjay5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9sb29wYmFjay5jcHAKQEAgLTM0LDIxICszNCwzMiBAQAogI2luY2x1ZGUgIkFBdWRpb1NpbXBsZVJlY29yZGVyLmgiCiAjaW5jbHVkZSAiQUF1ZGlvRXhhbXBsZVV0aWxzLmgiCiAjaW5jbHVkZSAiTG9vcGJhY2tBbmFseXplci5oIgorI2luY2x1ZGUgIi4uLy4uL3V0aWxzL0FBdWRpb0V4YW1wbGVVdGlscy5oIgorCisvLyBWMC40LjAwID0gcmVjdGlmeSBhbmQgbG93LXBhc3MgZmlsdGVyIHRoZSBlY2hvcywgYXV0by1jb3JyZWxhdGUgZW50aXJlIGVjaG8KKy8vIFYwLjQuMDEgPSBhZGQgLWggaGFuZyBvcHRpb24KKy8vICAgICAgICAgICBmaXggLW4gb3B0aW9uIHRvIHNldCBvdXRwdXQgYnVmZmVyIGZvciAtdG0KKy8vICAgICAgICAgICBwbG90IGZpcnN0IGdsaXRjaAorLy8gVjAuNC4wMiA9IGFsbG93IC1uMCBmb3IgbWluaW1hbCBidWZmZXIgc2l6ZQorI2RlZmluZSBBUFBfVkVSU0lPTiAgICAgICAgICAgICAiMC40LjAyIgogCiAvLyBUYWcgZm9yIG1hY2hpbmUgcmVhZGFibGUgcmVzdWx0cyBhcyBwcm9wZXJ0eSA9IHZhbHVlIHBhaXJzCiAjZGVmaW5lIFJFU1VMVF9UQUcgICAgICAgICAgICAgICJSRVNVTFQ6ICIKLSNkZWZpbmUgTlVNX1NFQ09ORFMgICAgICAgICAgICAgNQotI2RlZmluZSBQRVJJT0RfTUlMTElTICAgICAgICAgICAxMDAwCi0jZGVmaW5lIE5VTV9JTlBVVF9DSEFOTkVMUyAgICAgIDEKICNkZWZpbmUgRklMRU5BTUVfQUxMICAgICAgICAgICAgIi9kYXRhL2xvb3BiYWNrX2FsbC53YXYiCiAjZGVmaW5lIEZJTEVOQU1FX0VDSE9TICAgICAgICAgICIvZGF0YS9sb29wYmFja19lY2hvcy53YXYiCi0jZGVmaW5lIEFQUF9WRVJTSU9OICAgICAgICAgICAgICIwLjIuMDQiCisjZGVmaW5lIEZJTEVOQU1FX1BST0NFU1NFRCAgICAgICIvZGF0YS9sb29wYmFja19wcm9jZXNzZWQud2F2IgogCitjb25zdGV4cHIgaW50IGtMb2dQZXJpb2RNaWxsaXMgICAgICAgPSAxMDAwOworY29uc3RleHByIGludCBrTnVtSW5wdXRDaGFubmVscyAgICAgID0gMTsKIGNvbnN0ZXhwciBpbnQga051bUNhbGxiYWNrc1RvRHJhaW4gICA9IDIwOworY29uc3RleHByIGludCBrTnVtQ2FsbGJhY2tzVG9Ob3RSZWFkID0gMDsgLy8gbGV0IGlucHV0IGZpbGwgYmFjayB1cAogY29uc3RleHByIGludCBrTnVtQ2FsbGJhY2tzVG9EaXNjYXJkID0gMjA7Citjb25zdGV4cHIgaW50IGtEZWZhdWx0SGFuZ1RpbWVNaWxsaXMgPSA1MDsKK2NvbnN0ZXhwciBpbnQga01heEdsaXRjaEV2ZW50c1RvU2F2ZSA9IDMyOwogCiBzdHJ1Y3QgTG9vcGJhY2tEYXRhIHsKICAgICBBQXVkaW9TdHJlYW0gICAgICAqaW5wdXRTdHJlYW0gPSBudWxscHRyOworICAgIEFBdWRpb1N0cmVhbSAgICAgICpvdXRwdXRTdHJlYW0gPSBudWxscHRyOwogICAgIGludDMyX3QgICAgICAgICAgICBpbnB1dEZyYW1lc01heGltdW0gPSAwOwogICAgIGludDE2X3QgICAgICAgICAgICppbnB1dFNob3J0RGF0YSA9IG51bGxwdHI7CiAgICAgZmxvYXQgICAgICAgICAgICAgKmlucHV0RmxvYXREYXRhID0gbnVsbHB0cjsKQEAgLTU2LDYgKzY3LDcgQEAKICAgICBpbnQzMl90ICAgICAgICAgICAgYWN0dWFsSW5wdXRDaGFubmVsQ291bnQgPSAwOwogICAgIGludDMyX3QgICAgICAgICAgICBhY3R1YWxPdXRwdXRDaGFubmVsQ291bnQgPSAwOwogICAgIGludDMyX3QgICAgICAgICAgICBudW1DYWxsYmFja3NUb0RyYWluID0ga051bUNhbGxiYWNrc1RvRHJhaW47CisgICAgaW50MzJfdCAgICAgICAgICAgIG51bUNhbGxiYWNrc1RvTm90UmVhZCA9IGtOdW1DYWxsYmFja3NUb05vdFJlYWQ7CiAgICAgaW50MzJfdCAgICAgICAgICAgIG51bUNhbGxiYWNrc1RvRGlzY2FyZCA9IGtOdW1DYWxsYmFja3NUb0Rpc2NhcmQ7CiAgICAgaW50MzJfdCAgICAgICAgICAgIG1pbk51bUZyYW1lcyA9IElOVDMyX01BWDsKICAgICBpbnQzMl90ICAgICAgICAgICAgbWF4TnVtRnJhbWVzID0gMDsKQEAgLTYzLDYgKzc1LDkgQEAKICAgICBpbnQzMl90ICAgICAgICAgICAgaW5zdWZmaWNpZW50UmVhZEZyYW1lcyA9IDA7CiAgICAgaW50MzJfdCAgICAgICAgICAgIGZyYW1lc1JlYWRUb3RhbCA9IDA7CiAgICAgaW50MzJfdCAgICAgICAgICAgIGZyYW1lc1dyaXR0ZW5Ub3RhbCA9IDA7CisgICAgaW50MzJfdCAgICAgICAgICAgIGhhbmdQZXJpb2RNaWxsaXMgPSA1ICogMTAwMDsgLy8gdGltZSBiZXR3ZWVuIGhhbmdzCisgICAgaW50MzJfdCAgICAgICAgICAgIGhhbmdDb3VudGRvd25GcmFtZXMgPSA1ICogNDgwMDA7IC8vIGZyYW1lcyB0aWwgbmV4dCBoYW5nCisgICAgaW50MzJfdCAgICAgICAgICAgIGhhbmdUaW1lTWlsbGlzID0gMDsgLy8gMCBmb3Igbm8gaGFuZwogICAgIGJvb2wgICAgICAgICAgICAgICBpc0RvbmUgPSBmYWxzZTsKIAogICAgIGFhdWRpb19yZXN1bHRfdCAgICBpbnB1dEVycm9yID0gQUFVRElPX09LOwpAQCAtNzIsNiArODcsMjkgQEAKICAgICBFY2hvQW5hbHl6ZXIgICAgICAgZWNob0FuYWx5emVyOwogICAgIEF1ZGlvUmVjb3JkaW5nICAgICBhdWRpb1JlY29yZGluZzsKICAgICBMb29wYmFja1Byb2Nlc3NvciAqbG9vcGJhY2tQcm9jZXNzb3I7CisKKyAgICBpbnQzMl90ICAgICAgICAgICAgZ2xpdGNoRnJhbWVzW2tNYXhHbGl0Y2hFdmVudHNUb1NhdmVdOworICAgIGludDMyX3QgICAgICAgICAgICBudW1HbGl0Y2hFdmVudHMgPSAwOworCisgICAgdm9pZCBoYW5nSWZSZXF1ZXN0ZWQoaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICAgICAgaWYgKGhhbmdUaW1lTWlsbGlzID4gMCkgeworICAgICAgICAgICAgaGFuZ0NvdW50ZG93bkZyYW1lcyAtPSBudW1GcmFtZXM7CisgICAgICAgICAgICBpZiAoaGFuZ0NvdW50ZG93bkZyYW1lcyA8PSAwKSB7CisgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBzdGFydE5hbm9zID0gZ2V0TmFub3NlY29uZHMoKTsKKyAgICAgICAgICAgICAgICB1c2xlZXAoaGFuZ1RpbWVNaWxsaXMgKiAxMDAwKTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGVuZE5hbm9zID0gZ2V0TmFub3NlY29uZHMoKTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGVsYXBzZWRNaWNyb3MgPSAoaW50MzJfdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICgoZW5kTmFub3MgLSBzdGFydE5hbm9zKSAvIDEwMDApOworICAgICAgICAgICAgICAgIHByaW50ZigiY2FsbGJhY2sgaGFuZ2luZyBmb3IgJWQgbWlsbGlzLCBhY3R1YWwgPSAlZCBtaWNyb3NcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGhhbmdUaW1lTWlsbGlzLCBlbGFwc2VkTWljcm9zKTsKKyAgICAgICAgICAgICAgICBoYW5nQ291bnRkb3duRnJhbWVzID0gKGludDY0X3QpIGhhbmdQZXJpb2RNaWxsaXMKKyAgICAgICAgICAgICAgICAgICAgICAgICogQUF1ZGlvU3RyZWFtX2dldFNhbXBsZVJhdGUob3V0cHV0U3RyZWFtKQorICAgICAgICAgICAgICAgICAgICAgICAgLyAxMDAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKworICAgIH0KIH07CiAKIHN0YXRpYyB2b2lkIGNvbnZlcnRQY20xNlRvRmxvYXQoY29uc3QgaW50MTZfdCAqc291cmNlLApAQCAtMTAzLDkgKzE0MSwxNCBAQAogICAgICAgICBhc3NlcnQoZmFsc2UpOwogICAgIH0KICAgICBpZiAoZnJhbWVzUmVhZCA8IDApIHsKLSAgICAgICAgbXlEYXRhLT5pbnB1dEVycm9yID0gZnJhbWVzUmVhZDsKLSAgICAgICAgcHJpbnRmKCJFUlJPUiBpbiByZWFkID0gJWQgPSAlc1xuIiwgZnJhbWVzUmVhZCwKLSAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KGZyYW1lc1JlYWQpKTsKKyAgICAgICAgLy8gRXhwZWN0IElOVkFMSURfU1RBVEUgaWYgU1RBVEVfU1RBUlRJTkcKKyAgICAgICAgaWYgKG15RGF0YS0+ZnJhbWVzUmVhZFRvdGFsID4gMCkgeworICAgICAgICAgICAgbXlEYXRhLT5pbnB1dEVycm9yID0gZnJhbWVzUmVhZDsKKyAgICAgICAgICAgIHByaW50ZigiRVJST1IgaW4gcmVhZCA9ICVkID0gJXNcbiIsIGZyYW1lc1JlYWQsCisgICAgICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQoZnJhbWVzUmVhZCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZnJhbWVzUmVhZCA9IDA7CisgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBteURhdGEtPmZyYW1lc1JlYWRUb3RhbCArPSBmcmFtZXNSZWFkOwogICAgIH0KQEAgLTE0Nyw4ICsxOTAsMTAgQEAKICAgICAgICAgaW50MzJfdCB0b3RhbEZyYW1lc1JlYWQgPSAwOwogICAgICAgICBkbyB7CiAgICAgICAgICAgICBhY3R1YWxGcmFtZXNSZWFkID0gcmVhZEZvcm1hdHRlZERhdGEobXlEYXRhLCBudW1GcmFtZXMpOwotICAgICAgICAgICAgaWYgKGFjdHVhbEZyYW1lc1JlYWQpIHsKKyAgICAgICAgICAgIGlmIChhY3R1YWxGcmFtZXNSZWFkID4gMCkgewogICAgICAgICAgICAgICAgIHRvdGFsRnJhbWVzUmVhZCArPSBhY3R1YWxGcmFtZXNSZWFkOworICAgICAgICAgICAgfSBlbHNlIGlmIChhY3R1YWxGcmFtZXNSZWFkIDwgMCkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIElnbm9yZSBlcnJvcnMgYmVjYXVzZSBpbnB1dCBzdHJlYW0gbWF5IG5vdCBiZSBzdGFydGVkIHlldC4KICAgICAgICAgfSB3aGlsZSAoYWN0dWFsRnJhbWVzUmVhZCA+IDApOwpAQCAtMTU3LDYgKzIwMiw5IEBACiAgICAgICAgICAgICBteURhdGEtPm51bUNhbGxiYWNrc1RvRHJhaW4tLTsKICAgICAgICAgfQogCisgICAgfSBlbHNlIGlmIChteURhdGEtPm51bUNhbGxiYWNrc1RvTm90UmVhZCA+IDApIHsKKyAgICAgICAgLy8gTGV0IHRoZSBpbnB1dCBmaWxsIHVwIGEgYml0IHNvIHdlIGFyZSBub3Qgc28gY2xvc2UgdG8gdGhlIHdyaXRlIHBvaW50ZXIuCisgICAgICAgIG15RGF0YS0+bnVtQ2FsbGJhY2tzVG9Ob3RSZWFkLS07CiAgICAgfSBlbHNlIGlmIChteURhdGEtPm51bUNhbGxiYWNrc1RvRGlzY2FyZCA+IDApIHsKICAgICAgICAgLy8gSWdub3JlLiBBbGxvdyB0aGUgaW5wdXQgdG8gZmlsbCBiYWNrIHVwIHRvIGVxdWlsaWJyaXVtIHdpdGggdGhlIG91dHB1dC4KICAgICAgICAgYWN0dWFsRnJhbWVzUmVhZCA9IHJlYWRGb3JtYXR0ZWREYXRhKG15RGF0YSwgbnVtRnJhbWVzKTsKQEAgLTE2Niw2ICsyMTQsNyBAQAogICAgICAgICBteURhdGEtPm51bUNhbGxiYWNrc1RvRGlzY2FyZC0tOwogCiAgICAgfSBlbHNlIHsKKyAgICAgICAgbXlEYXRhLT5oYW5nSWZSZXF1ZXN0ZWQobnVtRnJhbWVzKTsKIAogICAgICAgICBpbnQzMl90IG51bUlucHV0Qnl0ZXMgPSBudW1GcmFtZXMgKiBteURhdGEtPmFjdHVhbElucHV0Q2hhbm5lbENvdW50ICogc2l6ZW9mKGZsb2F0KTsKICAgICAgICAgbWVtc2V0KG15RGF0YS0+aW5wdXRGbG9hdERhdGEsIDAgLyogdmFsdWUgKi8sIG51bUlucHV0Qnl0ZXMpOwpAQCAtMTc0LDE0ICsyMjMsMTUgQEAKICAgICAgICAgaW50NjRfdCBpbnB1dEZyYW1lc1dyaXR0ZW4gPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihteURhdGEtPmlucHV0U3RyZWFtKTsKICAgICAgICAgaW50NjRfdCBpbnB1dEZyYW1lc1JlYWQgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChteURhdGEtPmlucHV0U3RyZWFtKTsKICAgICAgICAgaW50NjRfdCBmcmFtZXNBdmFpbGFibGUgPSBpbnB1dEZyYW1lc1dyaXR0ZW4gLSBpbnB1dEZyYW1lc1JlYWQ7Ci0gICAgICAgIGFjdHVhbEZyYW1lc1JlYWQgPSByZWFkRm9ybWF0dGVkRGF0YShteURhdGEsIG51bUZyYW1lcyk7CisKKyAgICAgICAgYWN0dWFsRnJhbWVzUmVhZCA9IHJlYWRGb3JtYXR0ZWREYXRhKG15RGF0YSwgbnVtRnJhbWVzKTsgLy8gUkVBRAogICAgICAgICBpZiAoYWN0dWFsRnJhbWVzUmVhZCA8IDApIHsKICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUDsKICAgICAgICAgfSBlbHNlIHsKIAogICAgICAgICAgICAgaWYgKGFjdHVhbEZyYW1lc1JlYWQgPCBudW1GcmFtZXMpIHsKICAgICAgICAgICAgICAgICBpZihhY3R1YWxGcmFtZXNSZWFkIDwgKGludDMyX3QpIGZyYW1lc0F2YWlsYWJsZSkgewotICAgICAgICAgICAgICAgICAgICBwcmludGYoImluc3VmZmljaWVudCBidXQgbnVtRnJhbWVzID0gJWQiCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiaW5zdWZmaWNpZW50IGZvciBubyByZWFzb24sIG51bUZyYW1lcyA9ICVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBhY3R1YWxGcmFtZXNSZWFkID0gJWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIGlucHV0RnJhbWVzV3JpdHRlbiA9ICVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBpbnB1dEZyYW1lc1JlYWQgPSAlZCIKQEAgLTE5NCw2ICsyNDQsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBteURhdGEtPmluc3VmZmljaWVudFJlYWRDb3VudCsrOwogICAgICAgICAgICAgICAgIG15RGF0YS0+aW5zdWZmaWNpZW50UmVhZEZyYW1lcyArPSBudW1GcmFtZXMgLSBhY3R1YWxGcmFtZXNSZWFkOyAvLyBkZWZpY2l0CisgICAgICAgICAgICAgICAgLy8gcHJpbnRmKCJFcnJvciBpbnN1ZmZpY2llbnRSZWFkQ291bnQgPSAlZFxuIiwoaW50KW15RGF0YS0+aW5zdWZmaWNpZW50UmVhZENvdW50KTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzID0gYWN0dWFsRnJhbWVzUmVhZCAqIG15RGF0YS0+YWN0dWFsSW5wdXRDaGFubmVsQ291bnQ7CkBAIC0yMDEsMTYgKzI1MiwyNSBAQAogICAgICAgICAgICAgaWYgKG15RGF0YS0+YWN0dWFsSW5wdXRGb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7CiAgICAgICAgICAgICAgICAgY29udmVydFBjbTE2VG9GbG9hdChteURhdGEtPmlucHV0U2hvcnREYXRhLCBteURhdGEtPmlucHV0RmxvYXREYXRhLCBudW1TYW1wbGVzKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFNhdmUgZm9yIGxhdGVyLgotICAgICAgICAgICAgbXlEYXRhLT5hdWRpb1JlY29yZGluZy53cml0ZShteURhdGEtPmlucHV0RmxvYXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteURhdGEtPmFjdHVhbElucHV0Q2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMpOworCiAgICAgICAgICAgICAvLyBBbmFseXplIHRoZSBkYXRhLgotICAgICAgICAgICAgbXlEYXRhLT5sb29wYmFja1Byb2Nlc3Nvci0+cHJvY2VzcyhteURhdGEtPmlucHV0RmxvYXREYXRhLAorICAgICAgICAgICAgTG9vcGJhY2tQcm9jZXNzb3I6OnByb2Nlc3NfcmVzdWx0IHByb2NSZXN1bHQgPSBteURhdGEtPmxvb3BiYWNrUHJvY2Vzc29yLT5wcm9jZXNzKG15RGF0YS0+aW5wdXRGbG9hdERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15RGF0YS0+YWN0dWFsSW5wdXRDaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15RGF0YS0+YWN0dWFsT3V0cHV0Q2hhbm5lbENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMpOworCisgICAgICAgICAgICBpZiAocHJvY1Jlc3VsdCA9PSBMb29wYmFja1Byb2Nlc3Nvcjo6UFJPQ0VTU19SRVNVTFRfR0xJVENIKSB7CisgICAgICAgICAgICAgICAgaWYgKG15RGF0YS0+bnVtR2xpdGNoRXZlbnRzIDwga01heEdsaXRjaEV2ZW50c1RvU2F2ZSkgeworICAgICAgICAgICAgICAgICAgICBteURhdGEtPmdsaXRjaEZyYW1lc1tteURhdGEtPm51bUdsaXRjaEV2ZW50cysrXSA9IG15RGF0YS0+YXVkaW9SZWNvcmRpbmcuc2l6ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gU2F2ZSBmb3IgbGF0ZXIuCisgICAgICAgICAgICBteURhdGEtPmF1ZGlvUmVjb3JkaW5nLndyaXRlKG15RGF0YS0+aW5wdXRGbG9hdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15RGF0YS0+YWN0dWFsSW5wdXRDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbEZyYW1lc1JlYWQpOworCiAgICAgICAgICAgICBteURhdGEtPmlzRG9uZSA9IG15RGF0YS0+bG9vcGJhY2tQcm9jZXNzb3ItPmlzRG9uZSgpOwogICAgICAgICAgICAgaWYgKG15RGF0YS0+aXNEb25lKSB7CiAgICAgICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QOwpAQCAtMjM2LDggKzI5NiwxMCBAQAogICAgIEFBdWRpb0FyZ3NQYXJzZXI6OnVzYWdlKCk7CiAgICAgcHJpbnRmKCIgICAgICAtQntmcmFtZXN9ICAgICAgICBpbnB1dCBjYXBhY2l0eSBpbiBmcmFtZXNcbiIpOwogICAgIHByaW50ZigiICAgICAgLUN7Y2hhbm5lbHN9ICAgICAgbnVtYmVyIG9mIGlucHV0IGNoYW5uZWxzXG4iKTsKKyAgICBwcmludGYoIiAgICAgIC1Ee2RldmljZUlkfSAgICAgIGlucHV0IGRldmljZSBJRFxuIik7CiAgICAgcHJpbnRmKCIgICAgICAtRnswLDEsMn0gICAgICAgICBpbnB1dCBmb3JtYXQsIDE9STE2LCAyPUZMT0FUXG4iKTsKICAgICBwcmludGYoIiAgICAgIC1ne2dhaW59ICAgICAgICAgIHJlY2lyY3VsYXRpbmcgbG9vcGJhY2sgZ2FpblxuIik7CisgICAgcHJpbnRmKCIgICAgICAtaHtoYW5nTWlsbGlzfSAgICBvY2Nhc2lvbmFsbHkgaGFuZyBpbiB0aGUgY2FsbGJhY2tcbiIpOwogICAgIHByaW50ZigiICAgICAgLVB7aW5QZXJmfSAgICAgICAgc2V0IGlucHV0IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFKlxuIik7CiAgICAgcHJpbnRmKCIgICAgICAgICAgbiBmb3IgX05PTkVcbiIpOwogICAgIHByaW50ZigiICAgICAgICAgIGwgZm9yIF9MQVRFTkNZXG4iKTsKQEAgLTI5Niw5ICszNTgsNyBAQAogICAgIHJldHVybiB0ZXN0TW9kZTsKIH0KIAotdm9pZCBwcmludEF1ZGlvR3JhcGgoQXVkaW9SZWNvcmRpbmcgJnJlY29yZGluZywgaW50IG51bVNhbXBsZXMpIHsKLSAgICBpbnQzMl90IHN0YXJ0ID0gcmVjb3JkaW5nLnNpemUoKSAvIDI7Ci0gICAgaW50MzJfdCBlbmQgPSBzdGFydCArIG51bVNhbXBsZXM7Cit2b2lkIHByaW50QXVkaW9HcmFwaFJlZ2lvbihBdWRpb1JlY29yZGluZyAmcmVjb3JkaW5nLCBpbnQzMl90IHN0YXJ0LCBpbnQzMl90IGVuZCkgewogICAgIGlmIChlbmQgPj0gcmVjb3JkaW5nLnNpemUoKSkgewogICAgICAgICBlbmQgPSByZWNvcmRpbmcuc2l6ZSgpIC0gMTsKICAgICB9CkBAIC0zMzUsMTMgKzM5NSwxNCBAQAogICAgIEFBdWRpb1N0cmVhbSAgICAgICAgICpvdXRwdXRTdHJlYW0gICAgICAgICAgICAgICA9IG51bGxwdHI7CiAKICAgICBhYXVkaW9fcmVzdWx0X3QgICAgICAgcmVzdWx0ID0gQUFVRElPX09LOworICAgIGludDMyX3QgICAgICAgICAgICAgICByZXF1ZXN0ZWRJbnB1dERldmljZUlkICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3QgcmVxdWVzdGVkSW5wdXRTaGFyaW5nTW9kZSAgPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkSW5wdXRDaGFubmVsQ291bnQgPSBOVU1fSU5QVVRfQ0hBTk5FTFM7CisgICAgaW50ICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZElucHV0Q2hhbm5lbENvdW50ID0ga051bUlucHV0Q2hhbm5lbHM7CiAgICAgYWF1ZGlvX2Zvcm1hdF90ICAgICAgIHJlcXVlc3RlZElucHV0Rm9ybWF0ICAgICAgID0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDsKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgcmVxdWVzdGVkSW5wdXRDYXBhY2l0eSAgICAgPSAtMTsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgcmVxdWVzdGVkSW5wdXRDYXBhY2l0eSAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBpbnB1dFBlcmZvcm1hbmNlTGV2ZWwgID0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1k7CiAKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgb3V0cHV0RnJhbWVzUGVyQnVyc3QgPSAwOworICAgIGludDMyX3QgICAgICAgICAgICAgICBvdXRwdXRGcmFtZXNQZXJCdXJzdCAgICAgICA9IDA7CiAKICAgICBhYXVkaW9fZm9ybWF0X3QgICAgICAgYWN0dWFsT3V0cHV0Rm9ybWF0ICAgICAgICAgPSBBQVVESU9fRk9STUFUX0lOVkFMSUQ7CiAgICAgaW50MzJfdCAgICAgICAgICAgICAgIGFjdHVhbFNhbXBsZVJhdGUgICAgICAgICAgID0gMDsKQEAgLTM0OSw2ICs0MTAsNyBAQAogCiAgICAgaW50ICAgICAgICAgICAgICAgICAgIHRlc3RNb2RlICAgICAgICAgICAgICAgICAgID0gVEVTVF9FQ0hPX0xBVEVOQ1k7CiAgICAgZG91YmxlICAgICAgICAgICAgICAgIGdhaW4gICAgICAgICAgICAgICAgICAgICAgID0gMS4wOworICAgIGludCAgICAgICAgICAgICAgICAgICBoYW5nVGltZU1pbGxpcyAgICAgICAgICAgICA9IDA7CiAKICAgICAvLyBNYWtlIHByaW50ZiBwcmludCBpbW1lZGlhdGVseSBzbyB0aGF0IGRlYnVnIGluZm8gaXMgbm90IHN0dWNrCiAgICAgLy8gaW4gYSBidWZmZXIgaWYgd2UgaGFuZyBvciBjcmFzaC4KQEAgLTM1Niw2ICs0MTgsOSBAQAogCiAgICAgcHJpbnRmKCIlcyAtIEF1ZGlvIGxvb3BiYWNrIHVzaW5nIEFBdWRpbyBWIiBBUFBfVkVSU0lPTiAiXG4iLCBhcmd2WzBdKTsKIAorICAgIC8vIFVzZSBMT1dfTEFURU5DWSBhcyB0aGUgZGVmYXVsdCB0byBtYXRjaCBpbnB1dCBkZWZhdWx0LgorICAgIGFyZ1BhcnNlci5zZXRQZXJmb3JtYW5jZU1vZGUoQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kpOworCiAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKICAgICAgICAgY29uc3QgY2hhciAqYXJnID0gYXJndltpXTsKICAgICAgICAgaWYgKGFyZ1BhcnNlci5wYXJzZUFyZyhhcmcpKSB7CkBAIC0zNjksMTIgKzQzNCwyNCBAQAogICAgICAgICAgICAgICAgICAgICBjYXNlICdDJzoKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZElucHV0Q2hhbm5lbENvdW50ID0gYXRvaSgmYXJnWzJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdEJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZElucHV0RGV2aWNlSWQgPSBhdG9pKCZhcmdbMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0YnOgogICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkSW5wdXRGb3JtYXQgPSBhdG9pKCZhcmdbMl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2cnOgogICAgICAgICAgICAgICAgICAgICAgICAgZ2FpbiA9IGF0b2YoJmFyZ1syXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnaCc6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBXYXMgdGhlcmUgYSBudW1iZXIgYWZ0ZXIgdGhlICItaCI/CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnWzJdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZ1RpbWVNaWxsaXMgPSBhdG9pKCZhcmdbMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBubyBudW1iZXIgdGhlbiB1c2UgdGhlIGRlZmF1bHQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZ1RpbWVNaWxsaXMgPSBrRGVmYXVsdEhhbmdUaW1lTWlsbGlzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1AnOgogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQZXJmb3JtYW5jZUxldmVsID0gcGFyc2VQZXJmb3JtYW5jZU1vZGUoYXJnWzJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNDA0LDEwICs0ODEsMTIgQEAKICAgICB9CiAKICAgICBpbnQzMl90IHJlcXVlc3RlZER1cmF0aW9uID0gYXJnUGFyc2VyLmdldER1cmF0aW9uU2Vjb25kcygpOwotICAgIGludDMyX3QgcmVxdWVzdGVkRHVyYXRpb25NaWxsaXMgPSByZXF1ZXN0ZWREdXJhdGlvbiAqIE1JTExJU19QRVJfU0VDT05EOworICAgIGludDMyX3QgcmVxdWVzdGVkRHVyYXRpb25NaWxsaXMgPSByZXF1ZXN0ZWREdXJhdGlvbiAqIGtNaWxsaXNQZXJTZWNvbmQ7CiAgICAgaW50MzJfdCB0aW1lTWlsbGlzID0gMDsKICAgICBpbnQzMl90IHJlY29yZGluZ0R1cmF0aW9uID0gc3RkOjptaW4oNjAgKiA1LCByZXF1ZXN0ZWREdXJhdGlvbik7CiAKKyAgICBpbnQzMl90IHJlcXVlc3RlZE91dHB1dEJ1cnN0cyA9IGFyZ1BhcnNlci5nZXROdW1iZXJPZkJ1cnN0cygpOworCiAgICAgc3dpdGNoKHRlc3RNb2RlKSB7CiAgICAgICAgIGNhc2UgVEVTVF9TSU5FX01BR05JVFVERToKICAgICAgICAgICAgIGxvb3BiYWNrRGF0YS5sb29wYmFja1Byb2Nlc3NvciA9ICZsb29wYmFja0RhdGEuc2luZUFuYWx5emVyOwpAQCAtNDIxLDkgKzUwMCwxMSBAQAogCiAgICAgICAgICAgICBsb29wYmFja0RhdGEubG9vcGJhY2tQcm9jZXNzb3IgPSAmbG9vcGJhY2tEYXRhLmVjaG9BbmFseXplcjsKICAgICAgICAgICAgIGludCByZWFkID0gbG9vcGJhY2tEYXRhLmxvb3BiYWNrUHJvY2Vzc29yLT5sb2FkKEZJTEVOQU1FX0VDSE9TKTsKLSAgICAgICAgICAgIHByaW50ZigibWFpbigpIHJlYWQgJWQgbW9ubyBzYW1wbGVzIGZyb20gJXMgb24gQW5kcm9pZCBkZXZpY2VcbiIsIHJlYWQsIEZJTEVOQU1FX0VDSE9TKTsKKyAgICAgICAgICAgIHByaW50ZigibWFpbigpIHJlYWQgJWQgbW9ubyBzYW1wbGVzIGZyb20gJXMgb24gQW5kcm9pZCBkZXZpY2UsIHJhdGUgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICByZWFkLCBGSUxFTkFNRV9FQ0hPUywKKyAgICAgICAgICAgICAgICAgICBsb29wYmFja0RhdGEubG9vcGJhY2tQcm9jZXNzb3ItPmdldFNhbXBsZVJhdGUoKSk7CiAgICAgICAgICAgICBsb29wYmFja0RhdGEubG9vcGJhY2tQcm9jZXNzb3ItPnJlcG9ydCgpOwotICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICBnb3RvIHJlcG9ydF9yZXN1bHQ7CiAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgpAQCAtNDM3LDcgKzUxOCw3IEBACiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgLSAgcGxheWVyLm9wZW4oKSByZXR1cm5lZCAlZFxuIiwgcmVzdWx0KTsKICAgICAgICAgZXhpdCgxKTsKICAgICB9Ci0gICAgb3V0cHV0U3RyZWFtID0gcGxheWVyLmdldFN0cmVhbSgpOworICAgIG91dHB1dFN0cmVhbSA9IGxvb3BiYWNrRGF0YS5vdXRwdXRTdHJlYW0gPSBwbGF5ZXIuZ2V0U3RyZWFtKCk7CiAKICAgICBhY3R1YWxPdXRwdXRGb3JtYXQgPSBBQXVkaW9TdHJlYW1fZ2V0Rm9ybWF0KG91dHB1dFN0cmVhbSk7CiAgICAgaWYgKGFjdHVhbE91dHB1dEZvcm1hdCAhPSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewpAQCAtNDU0LDIwICs1MzUsMTYgQEAKIAogICAgIHByaW50ZigiSU5QVVQgIHN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKICAgICAvLyBVc2UgZGlmZmVyZW50IHBhcmFtZXRlcnMgZm9yIHRoZSBpbnB1dC4KLSAgICBhcmdQYXJzZXIuc2V0TnVtYmVyT2ZCdXJzdHMoQUFVRElPX1VOU1BFQ0lGSUVEKTsKKyAgICBhcmdQYXJzZXIuc2V0RGV2aWNlSWQocmVxdWVzdGVkSW5wdXREZXZpY2VJZCk7CisgICAgYXJnUGFyc2VyLnNldE51bWJlck9mQnVyc3RzKEFBdWRpb1BhcmFtZXRlcnM6OmtEZWZhdWx0TnVtYmVyT2ZCdXJzdHMpOwogICAgIGFyZ1BhcnNlci5zZXRGb3JtYXQocmVxdWVzdGVkSW5wdXRGb3JtYXQpOwogICAgIGFyZ1BhcnNlci5zZXRQZXJmb3JtYW5jZU1vZGUoaW5wdXRQZXJmb3JtYW5jZUxldmVsKTsKICAgICBhcmdQYXJzZXIuc2V0Q2hhbm5lbENvdW50KHJlcXVlc3RlZElucHV0Q2hhbm5lbENvdW50KTsKICAgICBhcmdQYXJzZXIuc2V0U2hhcmluZ01vZGUocmVxdWVzdGVkSW5wdXRTaGFyaW5nTW9kZSk7Ci0KLSAgICAvLyBNYWtlIHN1cmUgdGhlIGlucHV0IGJ1ZmZlciBoYXMgcGxlbnR5IG9mIGNhcGFjaXR5LgotICAgIC8vIEV4dHJhIGNhcGFjaXR5IG9uIGlucHV0IHNob3VsZCBub3QgaW5jcmVhc2UgbGF0ZW5jeSBpZiB3ZSBrZWVwIGl0IGRyYWluZWQuCi0gICAgaW50MzJfdCBpbnB1dEJ1ZmZlckNhcGFjaXR5ID0gcmVxdWVzdGVkSW5wdXRDYXBhY2l0eTsKLSAgICBpZiAoaW5wdXRCdWZmZXJDYXBhY2l0eSA8IDApIHsKLSAgICAgICAgaW50MzJfdCBvdXRwdXRCdWZmZXJDYXBhY2l0eSA9IEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKG91dHB1dFN0cmVhbSk7Ci0gICAgICAgIGlucHV0QnVmZmVyQ2FwYWNpdHkgPSAyICogb3V0cHV0QnVmZmVyQ2FwYWNpdHk7CisgICAgaWYgKHJlcXVlc3RlZElucHV0Q2FwYWNpdHkgIT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CisgICAgICAgIHByaW50ZigiV2FybmluZyEgSWYgeW91IHNldCBpbnB1dCBjYXBhY2l0eSB0aGVuIG1heWJlIG5vIEZBU1QgdHJhY2sgb24gTGVnYWN5IHBhdGghXG4iKTsKICAgICB9Ci0gICAgYXJnUGFyc2VyLnNldEJ1ZmZlckNhcGFjaXR5KGlucHV0QnVmZmVyQ2FwYWNpdHkpOworICAgIGFyZ1BhcnNlci5zZXRCdWZmZXJDYXBhY2l0eShyZXF1ZXN0ZWRJbnB1dENhcGFjaXR5KTsKIAogICAgIHJlc3VsdCA9IHJlY29yZGVyLm9wZW4oYXJnUGFyc2VyKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewpAQCAtNDc4LDI0ICs1NTUsMjkgQEAKIAogICAgIHsKICAgICAgICAgaW50MzJfdCBhY3R1YWxDYXBhY2l0eSA9IEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKGlucHV0U3RyZWFtKTsKLSAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcyhpbnB1dFN0cmVhbSwgYWN0dWFsQ2FwYWNpdHkpOwotICAgICAgICBpZiAocmVzdWx0IDwgMCkgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiAtICBBQXVkaW9TdHJlYW1fc2V0QnVmZmVyU2l6ZUluRnJhbWVzKCkgcmV0dXJuZWQgJWRcbiIsIHJlc3VsdCk7Ci0gICAgICAgICAgICBnb3RvIGZpbmlzaDsKLSAgICAgICAgfSBlbHNlIHt9Ci0gICAgfQorICAgICAgICAodm9pZCkgQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcyhpbnB1dFN0cmVhbSwgYWN0dWFsQ2FwYWNpdHkpOwogCi0gICAgYXJnUGFyc2VyLmNvbXBhcmVXaXRoU3RyZWFtKGlucHV0U3RyZWFtKTsKKyAgICAgICAgaWYgKHRlc3RNb2RlID09IFRFU1RfU0lORV9NQUdOSVRVREUKKyAgICAgICAgICAgICAgICAmJiByZXF1ZXN0ZWRPdXRwdXRCdXJzdHMgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CisgICAgICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1fc2V0QnVmZmVyU2l6ZUluRnJhbWVzKG91dHB1dFN0cmVhbSwgYWN0dWFsQ2FwYWNpdHkpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA8IDApIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gIEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMob3V0cHV0KSByZXR1cm5lZCAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCk7CisgICAgICAgICAgICAgICAgZ290byBmaW5pc2g7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByaW50ZigiT3V0cHV0IGJ1ZmZlciBzaXplIHNldCB0byBtYXRjaCBpbnB1dCBjYXBhY2l0eSA9ICVkIGZyYW1lcyFcbiIsIHJlc3VsdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KIAotICAgIC8vIElmIHRoZSBpbnB1dCBzdHJlYW0gaXMgdG9vIHNtYWxsIHRoZW4gd2UgY2Fubm90IHNhdGlzZnkgdGhlIG91dHB1dCBjYWxsYmFjay4KLSAgICB7Ci0gICAgICAgIGludDMyX3QgYWN0dWFsQ2FwYWNpdHkgPSBBQXVkaW9TdHJlYW1fZ2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyhpbnB1dFN0cmVhbSk7CisgICAgICAgIC8vIElmIHRoZSBpbnB1dCBzdHJlYW0gaXMgdG9vIHNtYWxsIHRoZW4gd2UgY2Fubm90IHNhdGlzZnkgdGhlIG91dHB1dCBjYWxsYmFjay4KICAgICAgICAgaWYgKGFjdHVhbENhcGFjaXR5IDwgMiAqIG91dHB1dEZyYW1lc1BlckJ1cnN0KSB7CiAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gaW5wdXQgY2FwYWNpdHkgPCAyICogb3V0cHV0RnJhbWVzUGVyQnVyc3RcbiIpOwogICAgICAgICAgICAgZ290byBmaW5pc2g7CiAgICAgICAgIH0KICAgICB9CiAKKyAgICBhcmdQYXJzZXIuY29tcGFyZVdpdGhTdHJlYW0oaW5wdXRTdHJlYW0pOworCiAgICAgLy8gLS0tLS0tLSBTZXR1cCBsb29wYmFja0RhdGEgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICBsb29wYmFja0RhdGEuYWN0dWFsSW5wdXRGb3JtYXQgPSBBQXVkaW9TdHJlYW1fZ2V0Rm9ybWF0KGlucHV0U3RyZWFtKTsKIApAQCAtNTE0LDE4ICs1OTYsMTYgQEAKIAogICAgIGxvb3BiYWNrRGF0YS5sb29wYmFja1Byb2Nlc3Nvci0+cmVzZXQoKTsKIAorICAgIGxvb3BiYWNrRGF0YS5oYW5nVGltZU1pbGxpcyA9IGhhbmdUaW1lTWlsbGlzOworCiAgICAgLy8gU3RhcnQgT1VUUFVUIGZpcnN0IHNvIElOUFVUIGRvZXMgbm90IG92ZXJmbG93LgogICAgIHJlc3VsdCA9IHBsYXllci5zdGFydCgpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgIHByaW50ZigiRVJST1IgLSBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KG91dHB1dCkgcmV0dXJuZWQgJWQgPSAlc1xuIiwKLSAgICAgICAgICAgICAgIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CiAgICAgICAgIGdvdG8gZmluaXNoOwogICAgIH0KIAogICAgIHJlc3VsdCA9IHJlY29yZGVyLnN0YXJ0KCk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgcHJpbnRmKCJFUlJPUiAtIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoaW5wdXQpIHJldHVybmVkICVkID0gJXNcbiIsCi0gICAgICAgICAgICAgICByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOwogICAgICAgICBnb3RvIGZpbmlzaDsKICAgICB9CiAKQEAgLTU2OCw3ICs2NDgsNyBAQAogICAgICAgICAgICAgICAgICAgIEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQob3V0cHV0U3RyZWFtKQogICAgICAgICAgICAgKTsKICAgICAgICAgfQotICAgICAgICBpbnQzMl90IHBlcmlvZE1pbGxpcyA9ICh0aW1lTWlsbGlzIDwgMjAwMCkgPyBQRVJJT0RfTUlMTElTIC8gNCA6IFBFUklPRF9NSUxMSVM7CisgICAgICAgIGludDMyX3QgcGVyaW9kTWlsbGlzID0gKHRpbWVNaWxsaXMgPCAyMDAwKSA/IGtMb2dQZXJpb2RNaWxsaXMgLyA0IDoga0xvZ1BlcmlvZE1pbGxpczsKICAgICAgICAgdXNsZWVwKHBlcmlvZE1pbGxpcyAqIDEwMDApOwogICAgICAgICB0aW1lTWlsbGlzICs9IHBlcmlvZE1pbGxpczsKICAgICB9CkBAIC01OTAsNDUgKzY3MCw2IEBACiAgICAgcHJpbnRmKCJpbnB1dCBlcnJvciA9ICVkID0gJXNcbiIsCiAgICAgICAgICAgIGxvb3BiYWNrRGF0YS5pbnB1dEVycm9yLCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChsb29wYmFja0RhdGEuaW5wdXRFcnJvcikpOwogCi0gICAgaWYgKGxvb3BiYWNrRGF0YS5pbnB1dEVycm9yID09IEFBVURJT19PSykgewotICAgICAgICBpZiAodGVzdE1vZGUgPT0gVEVTVF9TSU5FX01BR05JVFVERSkgewotICAgICAgICAgICAgcHJpbnRBdWRpb0dyYXBoKGxvb3BiYWNrRGF0YS5hdWRpb1JlY29yZGluZywgMjAwKTsKLSAgICAgICAgfQotICAgICAgICAvLyBQcmludCBhZ2FpbiBzbyB3ZSBkb24ndCBoYXZlIHRvIHNjcm9sbCBwYXN0IHdhdmVmb3JtLgotICAgICAgICBwcmludGYoIk9VVFBVVCBTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0gICAgICAgIGFyZ1BhcnNlci5jb21wYXJlV2l0aFN0cmVhbShvdXRwdXRTdHJlYW0pOwotICAgICAgICBwcmludGYoIklOUFVUICBTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Ci0gICAgICAgIGFyZ1BhcnNlci5jb21wYXJlV2l0aFN0cmVhbShpbnB1dFN0cmVhbSk7Ci0KLSAgICAgICAgbG9vcGJhY2tEYXRhLmxvb3BiYWNrUHJvY2Vzc29yLT5yZXBvcnQoKTsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIGludDMyX3QgZnJhbWVzUmVhZCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKGlucHV0U3RyZWFtKTsKLSAgICAgICAgaW50MzJfdCBmcmFtZXNXcml0dGVuID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4oaW5wdXRTdHJlYW0pOwotICAgICAgICBwcmludGYoIkNhbGxiYWNrIFJlc3VsdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJTlBVVFxuIik7Ci0gICAgICAgIHByaW50ZigiICBpbnB1dCBvdmVycnVucyAgID0gJWRcbiIsIEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQoaW5wdXRTdHJlYW0pKTsKLSAgICAgICAgcHJpbnRmKCIgIGZyYW1lc1dyaXR0ZW4gICAgPSAlOGRcbiIsIGZyYW1lc1dyaXR0ZW4pOwotICAgICAgICBwcmludGYoIiAgZnJhbWVzUmVhZCAgICAgICA9ICU4ZFxuIiwgZnJhbWVzUmVhZCk7Ci0gICAgICAgIHByaW50ZigiICBteUZyYW1lc1JlYWQgICAgID0gJThkXG4iLCAoaW50KSBsb29wYmFja0RhdGEuZnJhbWVzUmVhZFRvdGFsKTsKLSAgICAgICAgcHJpbnRmKCIgIHdyaXR0ZW4gLSByZWFkICAgPSAlOGRcbiIsIChpbnQpIChmcmFtZXNXcml0dGVuIC0gZnJhbWVzUmVhZCkpOwotICAgICAgICBwcmludGYoIiAgaW5zdWZmaWNpZW50ICMgICA9ICU4ZFxuIiwgKGludCkgbG9vcGJhY2tEYXRhLmluc3VmZmljaWVudFJlYWRDb3VudCk7Ci0gICAgICAgIGlmIChsb29wYmFja0RhdGEuaW5zdWZmaWNpZW50UmVhZENvdW50ID4gMCkgewotICAgICAgICAgICAgcHJpbnRmKCIgIGluc3VmZmljaWVudCBmcmFtZXMgPSAlOGRcbiIsIChpbnQpIGxvb3BiYWNrRGF0YS5pbnN1ZmZpY2llbnRSZWFkRnJhbWVzKTsKLSAgICAgICAgfQotICAgIH0KLSAgICB7Ci0gICAgICAgIGludDMyX3QgZnJhbWVzUmVhZCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKG91dHB1dFN0cmVhbSk7Ci0gICAgICAgIGludDMyX3QgZnJhbWVzV3JpdHRlbiA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKG91dHB1dFN0cmVhbSk7Ci0gICAgICAgIHByaW50ZigiQ2FsbGJhY2sgUmVzdWx0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE9VVFBVVFxuIik7Ci0gICAgICAgIHByaW50ZigiICBvdXRwdXQgdW5kZXJydW5zID0gJWRcbiIsIEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQob3V0cHV0U3RyZWFtKSk7Ci0gICAgICAgIHByaW50ZigiICBteUZyYW1lc1dyaXR0ZW4gID0gJThkXG4iLCAoaW50KSBsb29wYmFja0RhdGEuZnJhbWVzV3JpdHRlblRvdGFsKTsKLSAgICAgICAgcHJpbnRmKCIgIGZyYW1lc1dyaXR0ZW4gICAgPSAlOGRcbiIsIGZyYW1lc1dyaXR0ZW4pOwotICAgICAgICBwcmludGYoIiAgZnJhbWVzUmVhZCAgICAgICA9ICU4ZFxuIiwgZnJhbWVzUmVhZCk7Ci0gICAgICAgIHByaW50ZigiICBtaW4gbnVtRnJhbWVzICAgID0gJThkXG4iLCAoaW50KSBsb29wYmFja0RhdGEubWluTnVtRnJhbWVzKTsKLSAgICAgICAgcHJpbnRmKCIgIG1heCBudW1GcmFtZXMgICAgPSAlOGRcbiIsIChpbnQpIGxvb3BiYWNrRGF0YS5tYXhOdW1GcmFtZXMpOwotICAgIH0KLQogICAgIHdyaXR0ZW4gPSBsb29wYmFja0RhdGEubG9vcGJhY2tQcm9jZXNzb3ItPnNhdmUoRklMRU5BTUVfRUNIT1MpOwogICAgIGlmICh3cml0dGVuID4gMCkgewogICAgICAgICBwcmludGYoIm1haW4oKSB3cm90ZSAlOGQgbW9ubyBzYW1wbGVzIHRvIFwiJXNcIiBvbiBBbmRyb2lkIGRldmljZVxuIiwKQEAgLTY0MSwxMCArNjgyLDU2IEBACiAgICAgICAgICAgICAgICB3cml0dGVuLCBGSUxFTkFNRV9BTEwpOwogICAgIH0KIAotICAgIGlmIChsb29wYmFja0RhdGEubG9vcGJhY2tQcm9jZXNzb3ItPmdldFJlc3VsdCgpIDwgMCkgewotICAgICAgICBwcmludGYoIkVSUk9SOiBMT09QQkFDSyBQUk9DRVNTSU5HIEZBSUxFRC4gTWF5YmUgYmVjYXVzZSB0aGUgdm9sdW1lIHdhcyB0b28gbG93LlxuIik7Ci0gICAgICAgIHJlc3VsdCA9IGxvb3BiYWNrRGF0YS5sb29wYmFja1Byb2Nlc3Nvci0+Z2V0UmVzdWx0KCk7CisgICAgaWYgKGxvb3BiYWNrRGF0YS5pbnB1dEVycm9yID09IEFBVURJT19PSykgeworICAgICAgICBpZiAodGVzdE1vZGUgPT0gVEVTVF9TSU5FX01BR05JVFVERSkgeworICAgICAgICAgICAgaWYgKGxvb3BiYWNrRGF0YS5udW1HbGl0Y2hFdmVudHMgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gR3JhcGggYXJvdW5kIHRoZSBmaXJzdCBnbGl0Y2ggaWYgdGhlcmUgaXMgb25lLgorICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc3RhcnQgPSBsb29wYmFja0RhdGEuZ2xpdGNoRnJhbWVzWzBdIC0gODsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGVuZCA9IHN0YXJ0ICsgb3V0cHV0RnJhbWVzUGVyQnVyc3QgKyA4ICsgODsKKyAgICAgICAgICAgICAgICBwcmludEF1ZGlvR3JhcGhSZWdpb24obG9vcGJhY2tEYXRhLmF1ZGlvUmVjb3JkaW5nLCBzdGFydCwgZW5kKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gT3IgZ3JhcGggdGhlIG1pZGRsZSBvZiB0aGUgc2lnbmFsLgorICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc3RhcnQgPSBsb29wYmFja0RhdGEuYXVkaW9SZWNvcmRpbmcuc2l6ZSgpIC8gMjsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGVuZCA9IHN0YXJ0ICsgMjAwOworICAgICAgICAgICAgICAgIHByaW50QXVkaW9HcmFwaFJlZ2lvbihsb29wYmFja0RhdGEuYXVkaW9SZWNvcmRpbmcsIHN0YXJ0LCBlbmQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbG9vcGJhY2tEYXRhLmxvb3BiYWNrUHJvY2Vzc29yLT5yZXBvcnQoKTsKICAgICB9CisKKyAgICB7CisgICAgICAgIGludDMyX3QgZnJhbWVzUmVhZCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKGlucHV0U3RyZWFtKTsKKyAgICAgICAgaW50MzJfdCBmcmFtZXNXcml0dGVuID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4oaW5wdXRTdHJlYW0pOworICAgICAgICBjb25zdCBpbnQ2NF90IGZyYW1lc0F2YWlsYWJsZSA9IGZyYW1lc1dyaXR0ZW4gLSBmcmFtZXNSZWFkOworICAgICAgICBwcmludGYoIkNhbGxiYWNrIFJlc3VsdHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBJTlBVVFxuIik7CisgICAgICAgIHByaW50ZigiICBpbnB1dCBvdmVycnVucyAgID0gJThkXG4iLCBBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50KGlucHV0U3RyZWFtKSk7CisgICAgICAgIHByaW50ZigiICBmcmFtZXNXcml0dGVuICAgID0gJThkXG4iLCBmcmFtZXNXcml0dGVuKTsKKyAgICAgICAgcHJpbnRmKCIgIGZyYW1lc1JlYWQgICAgICAgPSAlOGRcbiIsIGZyYW1lc1JlYWQpOworICAgICAgICBwcmludGYoIiAgbXlGcmFtZXNSZWFkICAgICA9ICU4ZFxuIiwgKGludCkgbG9vcGJhY2tEYXRhLmZyYW1lc1JlYWRUb3RhbCk7CisgICAgICAgIHByaW50ZigiICB3cml0dGVuIC0gcmVhZCAgID0gJThkXG4iLCAoaW50KSBmcmFtZXNBdmFpbGFibGUpOworICAgICAgICBwcmludGYoIiAgaW5zdWZmaWNpZW50ICMgICA9ICU4ZFxuIiwgKGludCkgbG9vcGJhY2tEYXRhLmluc3VmZmljaWVudFJlYWRDb3VudCk7CisgICAgICAgIGlmIChsb29wYmFja0RhdGEuaW5zdWZmaWNpZW50UmVhZENvdW50ID4gMCkgeworICAgICAgICAgICAgcHJpbnRmKCIgIGluc3VmZmljLiBmcmFtZXMgPSAlOGRcbiIsIChpbnQpIGxvb3BiYWNrRGF0YS5pbnN1ZmZpY2llbnRSZWFkRnJhbWVzKTsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IGFjdHVhbElucHV0Q2FwYWNpdHkgPSBBQXVkaW9TdHJlYW1fZ2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyhpbnB1dFN0cmVhbSk7CisgICAgICAgIGlmIChmcmFtZXNBdmFpbGFibGUgPiAyICogYWN0dWFsSW5wdXRDYXBhY2l0eSkgeworICAgICAgICAgICAgcHJpbnRmKCIgIFdBUk5JTkc6IHdyaXR0ZW4gLSByZWFkID4gMipjYXBhY2l0eSAhXG4iKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHsKKyAgICAgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQob3V0cHV0U3RyZWFtKTsKKyAgICAgICAgaW50MzJfdCBmcmFtZXNXcml0dGVuID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4ob3V0cHV0U3RyZWFtKTsKKyAgICAgICAgcHJpbnRmKCJDYWxsYmFjayBSZXN1bHRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT1VUUFVUXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgIG91dHB1dCB1bmRlcnJ1bnMgPSAlOGRcbiIsIEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQob3V0cHV0U3RyZWFtKSk7CisgICAgICAgIHByaW50ZigiICBteUZyYW1lc1dyaXR0ZW4gID0gJThkXG4iLCAoaW50KSBsb29wYmFja0RhdGEuZnJhbWVzV3JpdHRlblRvdGFsKTsKKyAgICAgICAgcHJpbnRmKCIgIGZyYW1lc1dyaXR0ZW4gICAgPSAlOGRcbiIsIGZyYW1lc1dyaXR0ZW4pOworICAgICAgICBwcmludGYoIiAgZnJhbWVzUmVhZCAgICAgICA9ICU4ZFxuIiwgZnJhbWVzUmVhZCk7CisgICAgICAgIHByaW50ZigiICBtaW4gbnVtRnJhbWVzICAgID0gJThkXG4iLCAoaW50KSBsb29wYmFja0RhdGEubWluTnVtRnJhbWVzKTsKKyAgICAgICAgcHJpbnRmKCIgIG1heCBudW1GcmFtZXMgICAgPSAlOGRcbiIsIChpbnQpIGxvb3BiYWNrRGF0YS5tYXhOdW1GcmFtZXMpOworICAgIH0KKwogICAgIGlmIChsb29wYmFja0RhdGEuaW5zdWZmaWNpZW50UmVhZENvdW50ID4gMykgewogICAgICAgICBwcmludGYoIkVSUk9SOiBMT09QQkFDSyBQUk9DRVNTSU5HIEZBSUxFRC4gaW5zdWZmaWNpZW50UmVhZENvdW50IHRvbyBoaWdoXG4iKTsKICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOwpAQCAtNjU2LDE0ICs3NDMsMjggQEAKICAgICBkZWxldGVbXSBsb29wYmFja0RhdGEuaW5wdXRGbG9hdERhdGE7CiAgICAgZGVsZXRlW10gbG9vcGJhY2tEYXRhLmlucHV0U2hvcnREYXRhOwogCityZXBvcnRfcmVzdWx0OgorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsb29wYmFja0RhdGEubnVtR2xpdGNoRXZlbnRzOyBpKyspIHsKKyAgICAgICAgcHJpbnRmKCIgIGdsaXRjaCBhdCBmcmFtZSAlZFxuIiwgbG9vcGJhY2tEYXRhLmdsaXRjaEZyYW1lc1tpXSk7CisgICAgfQorCisgICAgd3JpdHRlbiA9IGxvb3BiYWNrRGF0YS5sb29wYmFja1Byb2Nlc3Nvci0+c2F2ZShGSUxFTkFNRV9QUk9DRVNTRUQpOworICAgIGlmICh3cml0dGVuID4gMCkgeworICAgICAgICBwcmludGYoIm1haW4oKSB3cm90ZSAlOGQgcHJvY2Vzc2VkIHNhbXBsZXMgdG8gXCIlc1wiIG9uIEFuZHJvaWQgZGV2aWNlXG4iLAorICAgICAgICAgICAgICAgd3JpdHRlbiwgRklMRU5BTUVfUFJPQ0VTU0VEKTsKKyAgICB9CisKKyAgICBpZiAobG9vcGJhY2tEYXRhLmxvb3BiYWNrUHJvY2Vzc29yLT5nZXRSZXN1bHQoKSA8IDApIHsKKyAgICAgICAgcmVzdWx0ID0gbG9vcGJhY2tEYXRhLmxvb3BiYWNrUHJvY2Vzc29yLT5nZXRSZXN1bHQoKTsKKyAgICB9CiAgICAgcHJpbnRmKFJFU1VMVF9UQUcgInJlc3VsdCA9ICVkIFxuIiwgcmVzdWx0KTsgLy8gbWFjaGluZSByZWFkYWJsZQogICAgIHByaW50ZigicmVzdWx0IGlzICVzXG4iLCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsgLy8gaHVtYW4gcmVhZGFibGUKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICBwcmludGYoIkZBSUxVUkVcbiIpOworICAgICAgICBwcmludGYoIlRFU1QgRkFJTEVEXG4iKTsKICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKICAgICB9IGVsc2UgewotICAgICAgICBwcmludGYoIlNVQ0NFU1NcbiIpOworICAgICAgICBwcmludGYoIlRFU1QgUEFTU0VEXG4iKTsKICAgICAgICAgcmV0dXJuIEVYSVRfU1VDQ0VTUzsKICAgICB9CiB9Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9BcmdzUGFyc2VyLmggYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvQXJnc1BhcnNlci5oCmluZGV4IDg4ZDc0MDEuLjkxMTU3NzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9BcmdzUGFyc2VyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0FyZ3NQYXJzZXIuaApAQCAtMzYsMTEgKzM2LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19jb250ZW50X3R5cGVfdCBjb250ZW50VHlwZSkgPSBudWxscHRyOwogc3RhdGljIHZvaWQgKCpzX3NldElucHV0UHJlc2V0KShBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9faW5wdXRfcHJlc2V0X3QgaW5wdXRQcmVzZXQpID0gbnVsbHB0cjsKK3N0YXRpYyB2b2lkICgqc19zZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSkoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3QgdXNhZ2UpID0gbnVsbHB0cjsKIAogc3RhdGljIGJvb2wgc19sb2FkQXR0ZW1wdGVkID0gZmFsc2U7CiBzdGF0aWMgYWF1ZGlvX3VzYWdlX3QgKCpzX2dldFVzYWdlKShBQXVkaW9TdHJlYW0gKnN0cmVhbSkgPSBudWxscHRyOwogc3RhdGljIGFhdWRpb19jb250ZW50X3R5cGVfdCAoKnNfZ2V0Q29udGVudFR5cGUpKEFBdWRpb1N0cmVhbSAqc3RyZWFtKSA9IG51bGxwdHI7CiBzdGF0aWMgYWF1ZGlvX2lucHV0X3ByZXNldF90ICgqc19nZXRJbnB1dFByZXNldCkoQUF1ZGlvU3RyZWFtICpzdHJlYW0pID0gbnVsbHB0cjsKK3N0YXRpYyBhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV90ICgqc19nZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSkoQUF1ZGlvU3RyZWFtICpzdHJlYW0pID0gbnVsbHB0cjsKIAogLy8gTGluayB0byB0ZXN0IGZ1bmN0aW9ucyBpbiBzaGFyZWQgbGlicmFyeS4KIHN0YXRpYyB2b2lkIGxvYWRGdXR1cmVGdW5jdGlvbnMoKSB7CkBAIC02MSw2ICs2NCwxMCBAQAogICAgICAgICAgICAgICAgIGRsc3ltKGhhbmRsZSwgIkFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0SW5wdXRQcmVzZXQiKTsKICAgICAgICAgaWYgKHNfc2V0SW5wdXRQcmVzZXQgPT0gbnVsbHB0cikgZ290byBlcnJvcjsKIAorICAgICAgICBzX3NldEFsbG93ZWRDYXB0dXJlUG9saWN5ID0gKHZvaWQgKCopKEFBdWRpb1N0cmVhbUJ1aWxkZXIgKiwgYWF1ZGlvX2lucHV0X3ByZXNldF90KSkKKyAgICAgICAgICAgICAgICBkbHN5bShoYW5kbGUsICJBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEFsbG93ZWRDYXB0dXJlUG9saWN5Iik7CisgICAgICAgIGlmIChzX3NldEFsbG93ZWRDYXB0dXJlUG9saWN5ID09IG51bGxwdHIpIGdvdG8gZXJyb3I7CisKICAgICAgICAgc19nZXRVc2FnZSA9IChhYXVkaW9fdXNhZ2VfdCAoKikoQUF1ZGlvU3RyZWFtICopKQogICAgICAgICAgICAgICAgIGRsc3ltKGhhbmRsZSwgIkFBdWRpb1N0cmVhbV9nZXRVc2FnZSIpOwogICAgICAgICBpZiAoc19nZXRVc2FnZSA9PSBudWxscHRyKSBnb3RvIGVycm9yOwpAQCAtNzIsNiArNzksMTAgQEAKICAgICAgICAgc19nZXRJbnB1dFByZXNldCA9IChhYXVkaW9faW5wdXRfcHJlc2V0X3QgKCopKEFBdWRpb1N0cmVhbSAqKSkKICAgICAgICAgICAgICAgICBkbHN5bShoYW5kbGUsICJBQXVkaW9TdHJlYW1fZ2V0SW5wdXRQcmVzZXQiKTsKICAgICAgICAgaWYgKHNfZ2V0SW5wdXRQcmVzZXQgPT0gbnVsbHB0cikgZ290byBlcnJvcjsKKworICAgICAgICBzX2dldEFsbG93ZWRDYXB0dXJlUG9saWN5ID0gKGFhdWRpb19pbnB1dF9wcmVzZXRfdCAoKikoQUF1ZGlvU3RyZWFtICopKQorICAgICAgICAgICAgICAgIGRsc3ltKGhhbmRsZSwgIkFBdWRpb1N0cmVhbV9nZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSIpOworICAgICAgICBpZiAoc19nZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSA9PSBudWxscHRyKSBnb3RvIGVycm9yOwogICAgIH0KICAgICByZXR1cm47CiAKQEAgLTE2OSw2ICsxODAsMTQgQEAKICAgICAgICAgbUlucHV0UHJlc2V0ID0gaW5wdXRQcmVzZXQ7CiAgICAgfQogCisgICAgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBnZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BbGxvd2VkQ2FwdHVyZVBvbGljeTsKKyAgICB9CisKKyAgICB2b2lkIHNldEFsbG93ZWRDYXB0dXJlUG9saWN5KGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3QgcG9saWN5KSB7CisgICAgICAgIG1BbGxvd2VkQ2FwdHVyZVBvbGljeSA9IHBvbGljeTsKKyAgICB9CisKICAgICBpbnQzMl90IGdldERldmljZUlkKCkgY29uc3QgewogICAgICAgICByZXR1cm4gbURldmljZUlkOwogICAgIH0KQEAgLTE4NSwxOCArMjA0LDI2IEBACiAgICAgICAgIG1OdW1iZXJPZkJ1cnN0cyA9IG51bUJ1cnN0czsKICAgICB9CiAKKyAgICBpbnQzMl90IGdldEZyYW1lc1BlckNhbGxiYWNrKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUZyYW1lc1BlckNhbGxiYWNrOworICAgIH0KKyAgICB2b2lkIHNldEZyYW1lc1BlckNhbGxiYWNrKGludDMyX3Qgc2l6ZSkgeworICAgICAgICBtRnJhbWVzUGVyQ2FsbGJhY2sgPSBzaXplOworICAgIH0KKwogICAgIC8qKgogICAgICAqIEFwcGx5IHRoZXNlIHBhcmFtZXRlcnMgdG8gYSBzdHJlYW0gYnVpbGRlci4KICAgICAgKiBAcGFyYW0gYnVpbGRlcgogICAgICAqLwogICAgIHZvaWQgYXBwbHlQYXJhbWV0ZXJzKEFBdWRpb1N0cmVhbUJ1aWxkZXIgKmJ1aWxkZXIpIGNvbnN0IHsKKyAgICAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKGJ1aWxkZXIsIGdldEJ1ZmZlckNhcGFjaXR5KCkpOwogICAgICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENoYW5uZWxDb3VudChidWlsZGVyLCBtQ2hhbm5lbENvdW50KTsKLSAgICAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRGb3JtYXQoYnVpbGRlciwgbUZvcm1hdCk7Ci0gICAgICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2FtcGxlUmF0ZShidWlsZGVyLCBtU2FtcGxlUmF0ZSk7Ci0gICAgICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyhidWlsZGVyLCBtQnVmZmVyQ2FwYWNpdHkpOwogICAgICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERldmljZUlkKGJ1aWxkZXIsIG1EZXZpY2VJZCk7Ci0gICAgICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2hhcmluZ01vZGUoYnVpbGRlciwgbVNoYXJpbmdNb2RlKTsKKyAgICAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRGb3JtYXQoYnVpbGRlciwgbUZvcm1hdCk7CisgICAgICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RnJhbWVzUGVyRGF0YUNhbGxiYWNrKGJ1aWxkZXIsIG1GcmFtZXNQZXJDYWxsYmFjayk7CiAgICAgICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0UGVyZm9ybWFuY2VNb2RlKGJ1aWxkZXIsIG1QZXJmb3JtYW5jZU1vZGUpOworICAgICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNhbXBsZVJhdGUoYnVpbGRlciwgbVNhbXBsZVJhdGUpOworICAgICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNoYXJpbmdNb2RlKGJ1aWxkZXIsIG1TaGFyaW5nTW9kZSk7CiAKICAgICAgICAgLy8gQ2FsbCBQIGZ1bmN0aW9ucyBpZiBzdXBwb3J0ZWQuCiAgICAgICAgIGxvYWRGdXR1cmVGdW5jdGlvbnMoKTsKQEAgLTIxNSw4ICsyNDIsMTcgQEAKICAgICAgICAgfSBlbHNlIGlmIChtVXNhZ2UgIT0gQUFVRElPX1VOU1BFQ0lGSUVEKXsKICAgICAgICAgICAgIHByaW50ZigiV0FSTklORzogc2V0SW5wdXRQcmVzZXQgbm90IHN1cHBvcnRlZCIpOwogICAgICAgICB9CisKKyAgICAgICAgLy8gQ2FsbCBRIGZ1bmN0aW9ucyBpZiBzdXBwb3J0ZWQuCisgICAgICAgIGlmIChzX3NldEFsbG93ZWRDYXB0dXJlUG9saWN5ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNfc2V0QWxsb3dlZENhcHR1cmVQb2xpY3koYnVpbGRlciwgbUFsbG93ZWRDYXB0dXJlUG9saWN5KTsKKyAgICAgICAgfSBlbHNlIGlmIChtQWxsb3dlZENhcHR1cmVQb2xpY3kgIT0gQUFVRElPX1VOU1BFQ0lGSUVEKXsKKyAgICAgICAgICAgIHByaW50ZigiV0FSTklORzogc2V0QWxsb3dlZENhcHR1cmVQb2xpY3kgbm90IHN1cHBvcnRlZCIpOworICAgICAgICB9CiAgICAgfQogCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90ICAga0RlZmF1bHROdW1iZXJPZkJ1cnN0cyA9IDI7CisKIHByaXZhdGU6CiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudCAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKICAgICBhYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICBtRm9ybWF0ICAgICAgICAgID0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDsKQEAgLTIzMCw4ICsyNjYsMTAgQEAKICAgICBhYXVkaW9fdXNhZ2VfdCAgICAgICAgICAgICBtVXNhZ2UgICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGFhdWRpb19jb250ZW50X3R5cGVfdCAgICAgIG1Db250ZW50VHlwZSAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgYWF1ZGlvX2lucHV0X3ByZXNldF90ICAgICAgbUlucHV0UHJlc2V0ICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKKyAgICBhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV90IG1BbGxvd2VkQ2FwdHVyZVBvbGljeSAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtTnVtYmVyT2ZCdXJzdHMgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgIG1OdW1iZXJPZkJ1cnN0cyAgPSBrRGVmYXVsdE51bWJlck9mQnVyc3RzOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNQZXJDYWxsYmFjayA9IEFBVURJT19VTlNQRUNJRklFRDsKIH07CiAKIGNsYXNzIEFBdWRpb0FyZ3NQYXJzZXIgOiBwdWJsaWMgQUF1ZGlvUGFyYW1ldGVycyB7CkBAIC0yNTgsNiArMjk2LDkgQEAKICAgICAgICAgICAgICAgICBjYXNlICdjJzoKICAgICAgICAgICAgICAgICAgICAgc2V0Q2hhbm5lbENvdW50KGF0b2koJmFyZ1syXSkpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdDJzoKKyAgICAgICAgICAgICAgICAgICAgc2V0QWxsb3dlZENhcHR1cmVQb2xpY3kocGFyc2VBbGxvd2VkQ2FwdHVyZVBvbGljeShhcmdbMl0pKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAnZCc6CiAgICAgICAgICAgICAgICAgICAgIHNldERldmljZUlkKGF0b2koJmFyZ1syXSkpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTI3Miw3ICszMTMsOSBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKGFyZykgPiAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3kgPSBhdG9pKCZhcmdbMl0pOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIEFBdWRpb19zZXRNTWFwUG9saWN5KHBvbGljeSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChBQXVkaW9fc2V0TU1hcFBvbGljeShwb2xpY3kpICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJFUlJPUjogaW52YWxpZCBNTUFQIHBvbGljeSBtb2RlICVpXG4iLCBwb2xpY3kpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlICduJzoKICAgICAgICAgICAgICAgICAgICAgc2V0TnVtYmVyT2ZCdXJzdHMoYXRvaSgmYXJnWzJdKSk7CkBAIC0yOTUsNiArMzM4LDkgQEAKICAgICAgICAgICAgICAgICBjYXNlICd5JzoKICAgICAgICAgICAgICAgICAgICAgc2V0Q29udGVudFR5cGUoYXRvaSgmYXJnWzJdKSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ3onOgorICAgICAgICAgICAgICAgICAgICBzZXRGcmFtZXNQZXJDYWxsYmFjayhhdG9pKCZhcmdbMl0pKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgdW5yZWNvZ25pemVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CkBAIC0zMjcsNiArMzczLDEwIEBACiAgICAgICAgIHByaW50ZigiICAgICAgRGVmYXVsdCB2YWx1ZXMgYXJlIFVOU1BFQ0lGSUVEIHVubGVzcyBvdGhlcndpc2Ugc3RhdGVkLlxuIik7CiAgICAgICAgIHByaW50ZigiICAgICAgLWJ7YnVmZmVyQ2FwYWNpdHl9IGZyYW1lc1xuIik7CiAgICAgICAgIHByaW50ZigiICAgICAgLWN7Y2hhbm5lbHN9IGZvciBleGFtcGxlIDIgZm9yIHN0ZXJlb1xuIik7CisgICAgICAgIHByaW50ZigiICAgICAgLUN7YXxzfG59IHNldCBwbGF5YmFjayBjYXB0dXJlIHBvbGljeVxuIik7CisgICAgICAgIHByaW50ZigiICAgICAgICAgIGEgPSBfQUxMIChkZWZhdWx0KVxuIik7CisgICAgICAgIHByaW50ZigiICAgICAgICAgIHMgPSBfU1lTVEVNXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgICAgICAgICAgbiA9IF9OT05FXG4iKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAtZHtkZXZpY2VJZH0gZGVmYXVsdCBpcyAlZFxuIiwgQUFVRElPX1VOU1BFQ0lGSUVEKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAtZnswfDF8Mn0gc2V0IGZvcm1hdFxuIik7CiAgICAgICAgIHByaW50ZigiICAgICAgICAgIDAgPSBVTlNQRUNJRklFRFxuIik7CkBAIC0zMzgsNyArMzg4LDcgQEAKICAgICAgICAgcHJpbnRmKCIgICAgICAgICAgMSA9IF9ORVZFUiwgbmV2ZXIgdXNlIE1NQVBcbiIpOwogICAgICAgICBwcmludGYoIiAgICAgICAgICAyID0gX0FVVE8sIHVzZSBNTUFQIGlmIGF2YWlsYWJsZSwgZGVmYXVsdCBmb3IgLW0gd2l0aCBubyBudW1iZXJcbiIpOwogICAgICAgICBwcmludGYoIiAgICAgICAgICAzID0gX0FMV0FZUywgdXNlIE1NQVAgb3IgZmFpbFxuIik7Ci0gICAgICAgIHByaW50ZigiICAgICAgLW57bnVtYmVyT2ZCdXJzdHN9IGZvciBzZXRCdWZmZXJTaXplXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgICAgICAtbntudW1iZXJPZkJ1cnN0c30gZm9yIHNldEJ1ZmZlclNpemUsIGRlZmF1bHQgJWRcbiIsIGtEZWZhdWx0TnVtYmVyT2ZCdXJzdHMpOwogICAgICAgICBwcmludGYoIiAgICAgIC1we3BlcmZvcm1hbmNlTW9kZX0gc2V0IG91dHB1dCBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERSosIGRlZmF1bHQgTk9ORVxuIik7CiAgICAgICAgIHByaW50ZigiICAgICAgICAgIG4gZm9yIF9OT05FXG4iKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAgICAgbCBmb3IgX0xBVEVOQ1lcbiIpOwpAQCAtMzQ4LDYgKzM5OCwyNiBAQAogICAgICAgICBwcmludGYoIiAgICAgIC11e3VzYWdlfSBlZy4gMTQgZm9yIEFBVURJT19VU0FHRV9HQU1FXG4iKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAteCB0byB1c2UgRVhDTFVTSVZFIG1vZGVcbiIpOwogICAgICAgICBwcmludGYoIiAgICAgIC15e2NvbnRlbnRUeXBlfSBlZy4gMSBmb3IgQUFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0hcbiIpOworICAgICAgICBwcmludGYoIiAgICAgIC16e2NhbGxiYWNrU2l6ZX0gb3IgYmxvY2sgc2l6ZSwgaW4gZnJhbWVzLCBkZWZhdWx0ID0gMFxuIik7CisgICAgfQorCisgICAgc3RhdGljIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGFyc2VBbGxvd2VkQ2FwdHVyZVBvbGljeShjaGFyIGMpIHsKKyAgICAgICAgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBwb2xpY3kgPSBBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9BTEw7CisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgY2FzZSAnYSc6CisgICAgICAgICAgICAgICAgcG9saWN5ID0gQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfQUxMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAncyc6CisgICAgICAgICAgICAgICAgcG9saWN5ID0gQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfU1lTVEVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnbic6CisgICAgICAgICAgICAgICAgcG9saWN5ID0gQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfTk9ORTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcHJpbnRmKCJFUlJPUjogaW52YWxpZCBwbGF5YmFjayBjYXB0dXJlIHBvbGljeSAlY1xuIiwgYyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBvbGljeTsKICAgICB9CiAKICAgICBzdGF0aWMgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwYXJzZVBlcmZvcm1hbmNlTW9kZShjaGFyIGMpIHsKQEAgLTM2Myw3ICs0MzMsNyBAQAogICAgICAgICAgICAgICAgIG1vZGUgPSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9QT1dFUl9TQVZJTkc7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHByaW50ZigiRVJST1IgaW52YWxpZCBwZXJmb3JtYW5jZSBtb2RlICVjXG4iLCBjKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIkVSUk9SOiBpbnZhbGlkIHBlcmZvcm1hbmNlIG1vZGUgJWNcbiIsIGMpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiBtb2RlOwpAQCAtMzkyLDE3ICs0NjIsMzEgQEAKICAgICAgICAgICAgICAgIGdldEZvcm1hdCgpLCBBQXVkaW9TdHJlYW1fZ2V0Rm9ybWF0KHN0cmVhbSkpOwogCiAgICAgICAgIGludDMyX3QgZnJhbWVzUGVyQnVyc3QgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUGVyQnVyc3Qoc3RyZWFtKTsKLSAgICAgICAgaW50MzJfdCBzaXplRnJhbWVzID0gQUF1ZGlvU3RyZWFtX2dldEJ1ZmZlclNpemVJbkZyYW1lcyhzdHJlYW0pOwogICAgICAgICBwcmludGYoIiAgQnVmZmVyOiAgICAgICBidXJzdCAgICAgPSAlZFxuIiwgZnJhbWVzUGVyQnVyc3QpOworCisgICAgICAgIGludDMyX3Qgc2l6ZUZyYW1lcyA9IEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJTaXplSW5GcmFtZXMoc3RyZWFtKTsKICAgICAgICAgaWYgKGZyYW1lc1BlckJ1cnN0ID4gMCkgewotICAgICAgICAgICAgcHJpbnRmKCIgIEJ1ZmZlcjogICAgICAgc2l6ZSAgICAgID0gJWQgPSAoJWQgKiAlZCkgKyAlZFxuIiwKKyAgICAgICAgICAgIGludDMyX3QgcmVxdWVzdGVkU2l6ZSA9IGdldE51bWJlck9mQnVyc3RzKCkgKiBmcmFtZXNQZXJCdXJzdDsKKyAgICAgICAgICAgIHByaW50ZigiICBCdWZmZXJTaXplOiAgIHJlcXVlc3RlZCA9ICU0ZCwgYWN0dWFsID0gJTRkID0gKCVkICogJWQpICsgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkU2l6ZSwKICAgICAgICAgICAgICAgICAgICBzaXplRnJhbWVzLAogICAgICAgICAgICAgICAgICAgIChzaXplRnJhbWVzIC8gZnJhbWVzUGVyQnVyc3QpLAogICAgICAgICAgICAgICAgICAgIGZyYW1lc1BlckJ1cnN0LAogICAgICAgICAgICAgICAgICAgIChzaXplRnJhbWVzICUgZnJhbWVzUGVyQnVyc3QpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICBwcmludGYoIiAgQnVmZmVyU2l6ZTogICAgJWRcbiIsIHNpemVGcmFtZXMpOwogICAgICAgICB9Ci0gICAgICAgIHByaW50ZigiICBDYXBhY2l0eTogICAgIHJlcXVlc3RlZCA9ICVkLCBhY3R1YWwgPSAlZFxuIiwgZ2V0QnVmZmVyQ2FwYWNpdHkoKSwKLSAgICAgICAgICAgICAgIEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKHN0cmVhbSkpOworCisgICAgICAgIGludDMyX3QgY2FwYWNpdHlGcmFtZXMgPSBBQXVkaW9TdHJlYW1fZ2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyhzdHJlYW0pOworICAgICAgICBwcmludGYoIiAgQ2FwYWNpdHk6ICAgICByZXF1ZXN0ZWQgPSAlNGQsIGFjdHVhbCA9ICU0ZCA9ICglZCAqICVkKSArICVkXG4iLAorICAgICAgICAgICAgICAgZ2V0QnVmZmVyQ2FwYWNpdHkoKSwKKyAgICAgICAgICAgICAgIGNhcGFjaXR5RnJhbWVzLAorICAgICAgICAgICAgICAgKGNhcGFjaXR5RnJhbWVzIC8gZnJhbWVzUGVyQnVyc3QpLAorICAgICAgICAgICAgICAgZnJhbWVzUGVyQnVyc3QsCisgICAgICAgICAgICAgICAoY2FwYWNpdHlGcmFtZXMgJSBmcmFtZXNQZXJCdXJzdCkpOworCisgICAgICAgIHByaW50ZigiICBDYWxsYmFja1NpemU6IHJlcXVlc3RlZCA9ICVkLCBhY3R1YWwgPSAlZFxuIiwgZ2V0RnJhbWVzUGVyQ2FsbGJhY2soKSwKKyAgICAgICAgICAgICAgIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soc3RyZWFtKSk7CiAKICAgICAgICAgcHJpbnRmKCIgIFNoYXJpbmdNb2RlOiAgcmVxdWVzdGVkID0gJXMsIGFjdHVhbCA9ICVzXG4iLAogICAgICAgICAgICAgICAgZ2V0U2hhcmluZ01vZGVUZXh0KGdldFNoYXJpbmdNb2RlKCkpLApAQCAtNDMxLDYgKzUxNSwxMSBAQAogICAgICAgICBwcmludGYoIiAgSXMgTU1BUCB1c2VkPyAlc1xuIiwgQUF1ZGlvU3RyZWFtX2lzTU1hcFVzZWQoc3RyZWFtKQogICAgICAgICAgICAgICAgPyAieWVzIiA6ICJubyIpOwogCisgICAgICAgIGlmIChzX2dldEFsbG93ZWRDYXB0dXJlUG9saWN5ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHByaW50ZigiICBDb250ZW50VHlwZTogIHJlcXVlc3RlZCA9ICVkLCBhY3R1YWwgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBnZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSgpLCBzX2dldEFsbG93ZWRDYXB0dXJlUG9saWN5KHN0cmVhbSkpOworICAgICAgICB9CisKICAgICB9CiAKICAgICBpbnQzMl90IGdldER1cmF0aW9uU2Vjb25kcygpIGNvbnN0IHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVQbGF5ZXIuaCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVQbGF5ZXIuaAppbmRleCA1NGI3N2JhLi5mZDFmYzQ1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUGxheWVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVBsYXllci5oCkBAIC0zMiw4ICszMiw2IEBACiAKIC8vIEFyYml0cmFyeSBwZXJpb2QgZm9yIGdsaXRjaGVzCiAjZGVmaW5lIEZPUkNFRF9VTkRFUlJVTl9QRVJJT0RfRlJBTUVTICAgICgyICogNDgwMDApCi0vLyBIb3cgbG9uZyB0byBzbGVlcCBpbiBhIGNhbGxiYWNrIHRvIGNhdXNlIGFuIGludGVudGlvbmFsIGdsaXRjaC4gRm9yIHRlc3RpbmcuCi0jZGVmaW5lIEZPUkNFRF9VTkRFUlJVTl9TTEVFUF9NSUNST1MgICAgICgxMCAqIDEwMDApCiAKICNkZWZpbmUgTUFYX1RJTUVTVEFNUFMgICAgICAgICAgICAgICAgICAgMTYKIApAQCAtMTIyLDEwICsxMjAsOSBAQAogCiAgICAgICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CiAgICAgICAgICAgICBpbnQzMl90IHNpemVJbkJ1cnN0cyA9IHBhcmFtZXRlcnMuZ2V0TnVtYmVyT2ZCdXJzdHMoKTsKLSAgICAgICAgICAgIGlmIChzaXplSW5CdXJzdHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZXNQZXJCdXJzdCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNQZXJCdXJzdChtU3RyZWFtKTsKLSAgICAgICAgICAgICAgICBBQXVkaW9TdHJlYW1fc2V0QnVmZmVyU2l6ZUluRnJhbWVzKG1TdHJlYW0sIHNpemVJbkJ1cnN0cyAqIGZyYW1lc1BlckJ1cnN0KTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDMyX3QgZnJhbWVzUGVyQnVyc3QgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUGVyQnVyc3QobVN0cmVhbSk7CisgICAgICAgICAgICBpbnQzMl90IGJ1ZmZlclNpemVGcmFtZXMgPSBzaXplSW5CdXJzdHMgKiBmcmFtZXNQZXJCdXJzdDsKKyAgICAgICAgICAgIEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMobVN0cmVhbSwgYnVmZmVyU2l6ZUZyYW1lcyk7CiAgICAgICAgIH0KIAogICAgICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZShidWlsZGVyKTsKQEAgLTE5Myw3ICsxOTAsNyBAQAogICAgICBhYXVkaW9fcmVzdWx0X3Qgc3RhcnQoKSB7CiAgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KG1TdHJlYW0pOwogICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgcHJpbnRmKCJFUlJPUiAtIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoKSByZXR1cm5lZCAlZCAlc1xuIiwKKyAgICAgICAgICAgIHByaW50ZigiRVJST1IgLSBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KG91dHB1dCkgcmV0dXJuZWQgJWQgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTIwMyw3ICsyMDAsNyBAQAogICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wKCkgewogICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKG1TdHJlYW0pOwogICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgcHJpbnRmKCJFUlJPUiAtIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcCgpIHJldHVybmVkICVkICVzXG4iLAorICAgICAgICAgICAgcHJpbnRmKCJFUlJPUiAtIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcChvdXRwdXQpIHJldHVybmVkICVkICVzXG4iLAogICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CiAgICAgICAgIH0KICAgICAgICAgaW50MzJfdCB4UnVuQ291bnQgPSBBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50KG1TdHJlYW0pOwpAQCAtMjE1LDcgKzIxMiw3IEBACiAgICAgYWF1ZGlvX3Jlc3VsdF90IHBhdXNlKCkgewogICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RQYXVzZShtU3RyZWFtKTsKICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgIHByaW50ZigiRVJST1IgLSBBQXVkaW9TdHJlYW1fcmVxdWVzdFBhdXNlKCkgcmV0dXJuZWQgJWQgJXNcbiIsCisgICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RQYXVzZShvdXRwdXQpIHJldHVybmVkICVkICVzXG4iLAogICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CiAgICAgICAgIH0KICAgICAgICAgaW50MzJfdCB4UnVuQ291bnQgPSBBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50KG1TdHJlYW0pOwpAQCAtMjIzLDExICsyMjAsMjcgQEAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKKyAgICBhYXVkaW9fcmVzdWx0X3Qgd2FpdFVudGlsUGF1c2VkKCkgeworICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOworICAgICAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3QgY3VycmVudFN0YXRlID0gQUF1ZGlvU3RyZWFtX2dldFN0YXRlKG1TdHJlYW0pOworICAgICAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3QgaW5wdXRTdGF0ZSA9IEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0lORzsKKyAgICAgICAgd2hpbGUgKHJlc3VsdCA9PSBBQVVESU9fT0sgJiYgY3VycmVudFN0YXRlID09IEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0lORykgeworICAgICAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3dhaXRGb3JTdGF0ZUNoYW5nZShtU3RyZWFtLCBpbnB1dFN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VycmVudFN0YXRlLCBOQU5PU19QRVJfU0VDT05EKTsKKyAgICAgICAgICAgIGlucHV0U3RhdGUgPSBjdXJyZW50U3RhdGU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIChjdXJyZW50U3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTRUQpCisgICAgICAgICAgICAgICA/IEFBVURJT19PSyA6IEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgIH0KKwogICAgIC8vIEZsdXNoIHRoZSBzdHJlYW0uIEFBdWRpbyB3aWxsIHN0b3AgY2FsbGluZyB5b3VyIGNhbGxiYWNrIGZ1bmN0aW9uLgogICAgIGFhdWRpb19yZXN1bHRfdCBmbHVzaCgpIHsKICAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9yZXF1ZXN0Rmx1c2gobVN0cmVhbSk7CiAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RGbHVzaCgpIHJldHVybmVkICVkICVzXG4iLAorICAgICAgICAgICAgcHJpbnRmKCJFUlJPUiAtIEFBdWRpb1N0cmVhbV9yZXF1ZXN0Rmx1c2gob3V0cHV0KSByZXR1cm5lZCAlZCAlc1xuIiwKICAgICAgICAgICAgICAgICAgICByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXN1bHQ7CkBAIC0yNTksNyArMjcyLDcgQEAKIAogICAgIGludCAgICAgICAgICAgICAgICBzY2hlZHVsZXIgPSAwOwogICAgIGJvb2wgICAgICAgICAgICAgICBzY2hlZHVsZXJDaGVja2VkID0gZmFsc2U7Ci0gICAgYm9vbCAgICAgICAgICAgICAgIGZvcmNlVW5kZXJydW5zID0gZmFsc2U7CisgICAgaW50MzJfdCAgICAgICAgICAgIGhhbmdUaW1lTVNlYyA9IDA7CiAKICAgICBBQXVkaW9TaW1wbGVQbGF5ZXIgc2ltcGxlUGxheWVyOwogICAgIGludDMyX3QgICAgICAgICAgICBjYWxsYmFja0NvdW50ID0gMDsKQEAgLTMxMSwxMCArMzI0LDEyIEBACiAgICAgICAgIHNpbmVEYXRhLT5zZXR1cFNpbmVTd2VlcHMoKTsKICAgICB9CiAKLSAgICBpZiAoc2luZURhdGEtPmZvcmNlVW5kZXJydW5zKSB7CisgICAgaWYgKHNpbmVEYXRhLT5oYW5nVGltZU1TZWMgPiAwKSB7CiAgICAgICAgIGlmIChzaW5lRGF0YS0+ZnJhbWVzVG90YWwgPiBzaW5lRGF0YS0+bmV4dEZyYW1lVG9HbGl0Y2gpIHsKLSAgICAgICAgICAgIHVzbGVlcChGT1JDRURfVU5ERVJSVU5fU0xFRVBfTUlDUk9TKTsKLSAgICAgICAgICAgIHByaW50ZigiU2ltdWxhdGUgZ2xpdGNoIGF0ICVsbGRcbiIsIChsb25nIGxvbmcpIHNpbmVEYXRhLT5mcmFtZXNUb3RhbCk7CisgICAgICAgICAgICB1c2xlZXAoc2luZURhdGEtPmhhbmdUaW1lTVNlYyAqIDEwMDApOworICAgICAgICAgICAgcHJpbnRmKCJIYW5nIGNhbGxiYWNrIGF0ICVsbGQgZnJhbWVzIGZvciAlZCBtc2VjXG4iLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBzaW5lRGF0YS0+ZnJhbWVzVG90YWwsCisgICAgICAgICAgICAgICAgICAgc2luZURhdGEtPmhhbmdUaW1lTVNlYyk7CiAgICAgICAgICAgICBzaW5lRGF0YS0+bmV4dEZyYW1lVG9HbGl0Y2ggKz0gRk9SQ0VEX1VOREVSUlVOX1BFUklPRF9GUkFNRVM7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUmVjb3JkZXIuaCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVSZWNvcmRlci5oCmluZGV4IDg2OWZhZDAuLjI0NmUyZDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVSZWNvcmRlci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVSZWNvcmRlci5oCkBAIC0yMDEsOCArMjAxLDEwIEBACiAgICAgIGFhdWRpb19yZXN1bHRfdCBzdGFydCgpIHsKICAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQobVN0cmVhbSk7CiAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydCgpIHJldHVybmVkICVkICVzXG4iLAorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiAtIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoaW5wdXQpIHJldHVybmVkICVkICVzXG4iLAogICAgICAgICAgICAgICAgICAgICByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgIERpZCB5b3UgcmVtZW1iZXIgdG8gZW50ZXI6ICAgYWRiIHJvb3QgICAgPz8/P1xuIik7CisKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KQEAgLTIxMSw4ICsyMTMsOSBAQAogICAgIGFhdWRpb19yZXN1bHRfdCBzdG9wKCkgewogICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKG1TdHJlYW0pOwogICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiAtIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcCgpIHJldHVybmVkICVkICVzXG4iLAorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiAtIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcChpbnB1dCkgcmV0dXJuZWQgJWQgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KQEAgLTIyMSw3ICsyMjQsNyBAQAogICAgIGFhdWRpb19yZXN1bHRfdCBwYXVzZSgpIHsKICAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9yZXF1ZXN0UGF1c2UobVN0cmVhbSk7CiAgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RQYXVzZSgpIHJldHVybmVkICVkICVzXG4iLAorICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUiAtIEFBdWRpb1N0cmVhbV9yZXF1ZXN0UGF1c2UoaW5wdXQpIHJldHVybmVkICVkICVzXG4iLAogICAgICAgICAgICAgICAgICAgICByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXN1bHQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvQW5kcm9pZC5icAppbmRleCBhYTI1ZTY3Li5jYzgwODYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL0FuZHJvaWQuYnAKQEAgLTQsNiArNCw3IEBACiAgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKICAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKICAgICBoZWFkZXJfbGliczogWyJsaWJhYXVkaW9fZXhhbXBsZV91dGlscyJdLAorICAgIHBhY2tfcmVsb2NhdGlvbnM6IGZhbHNlLAogfQogCiBjY190ZXN0IHsKQEAgLTEyLDQgKzEzLDUgQEAKICAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAogICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAogICAgIGhlYWRlcl9saWJzOiBbImxpYmFhdWRpb19leGFtcGxlX3V0aWxzIl0sCisgICAgcGFja19yZWxvY2F0aW9uczogZmFsc2UsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9qbmkvQW5kcm9pZC5tayBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL2puaS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTFiZDQzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL2puaS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9zcmMgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzCi0KLSMgTkRLIHJlY29tbWVuZHMgdXNpbmcgdGhpcyBraW5kIG9mIHJlbGF0aXZlIHBhdGggaW5zdGVhZCBvZiBhbiBhYnNvbHV0ZSBwYXRoLgotTE9DQUxfU1JDX0ZJTEVTOj0gLi4vc3JjL3dyaXRlX3NpbmUuY3BwCi1MT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8KLUxPQ0FMX01PRFVMRSA6PSB3cml0ZV9zaW5lCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMKLQotTE9DQUxfU1JDX0ZJTEVTOj0gLi4vc3JjL3dyaXRlX3NpbmVfY2FsbGJhY2suY3BwCi1MT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8KLUxPQ0FMX01PRFVMRSA6PSB3cml0ZV9zaW5lX2NhbGxiYWNrCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEUgOj0gbGliYWF1ZGlvX3ByZWJ1aWx0Ci1MT0NBTF9TUkNfRklMRVMgOj0gbGliYWF1ZGlvLnNvCi1MT0NBTF9FWFBPUlRfQ19JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKLWluY2x1ZGUgJChQUkVCVUlMVF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL2puaS9BcHBsaWNhdGlvbi5tayBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL2puaS9BcHBsaWNhdGlvbi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE0NGYzNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9qbmkvQXBwbGljYXRpb24ubWsKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1BUFBfQ1BQRkxBR1MgKz0gLXN0ZD1jKysxMQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmVfY2FsbGJhY2suY3BwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmVfY2FsbGJhY2suY3BwCmluZGV4IGUzM2U5ZjguLmNhNjAyMzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lX2NhbGxiYWNrLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZV9jYWxsYmFjay5jcHAKQEAgLTI2LDEwICsyNiwxNSBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisKICNpbmNsdWRlICJBQXVkaW9FeGFtcGxlVXRpbHMuaCIKICNpbmNsdWRlICJBQXVkaW9TaW1wbGVQbGF5ZXIuaCIKICNpbmNsdWRlICJBQXVkaW9BcmdzUGFyc2VyLmgiCiAKKyNkZWZpbmUgQVBQX1ZFUlNJT04gICIwLjEuNyIKKworY29uc3RleHByIGludDMyX3Qga0RlZmF1bHRIYW5nVGltZU1TZWMgPSAxMDsKKwogLyoqCiAgKiBPcGVuIHN0cmVhbSwgcGxheSBzb21lIHNpbmUgd2F2ZXMsIHRoZW4gY2xvc2UgdGhlIHN0cmVhbS4KICAqCkBAIC0zOSw3ICs0NCw3IEBACiBzdGF0aWMgYWF1ZGlvX3Jlc3VsdF90IHRlc3RPcGVuUGxheUNsb3NlKEFBdWRpb0FyZ3NQYXJzZXIgJmFyZ1BhcnNlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBsb29wQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJlZml4VG9uZU1zZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2VVbmRlcnJ1bnMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGFuZ1RpbWVNU2VjKQogewogICAgIFNpbmVUaHJlYWRlZERhdGFfdCBteURhdGE7CiAgICAgQUF1ZGlvU2ltcGxlUGxheWVyICZwbGF5ZXIgPSBteURhdGEuc2ltcGxlUGxheWVyOwpAQCAtNTEsMTAgKzU2LDEyIEBACiAgICAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBydW4gY29tcGxldGUgdGVzdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAgICAgbXlEYXRhLnNjaGVkdWxlckNoZWNrZWQgPSBmYWxzZTsKICAgICBteURhdGEuY2FsbGJhY2tDb3VudCA9IDA7Ci0gICAgbXlEYXRhLmZvcmNlVW5kZXJydW5zID0gZm9yY2VVbmRlcnJ1bnM7IC8vIHRlc3QgQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudCgpCisgICAgbXlEYXRhLmhhbmdUaW1lTVNlYyA9IGhhbmdUaW1lTVNlYzsgLy8gdGVzdCBBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50KCkKIAogICAgIHJlc3VsdCA9IHBsYXllci5vcGVuKGFyZ1BhcnNlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBTaW1wbGVQbGF5ZXJEYXRhQ2FsbGJhY2tQcm9jLCBTaW1wbGVQbGF5ZXJFcnJvckNhbGxiYWNrUHJvYywgJm15RGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgU2ltcGxlUGxheWVyRGF0YUNhbGxiYWNrUHJvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTaW1wbGVQbGF5ZXJFcnJvckNhbGxiYWNrUHJvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAmbXlEYXRhKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gIHBsYXllci5vcGVuKCkgcmV0dXJuZWQgJXNcbiIsCiAgICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CkBAIC0xMDksMTYgKzExNiwyMSBAQAogICAgICAgICBzdGFydGVkQXROYW5vcyA9IGdldE5hbm9zZWNvbmRzKENMT0NLX01PTk9UT05JQyk7CiAgICAgICAgIGZvciAoaW50IHNlY29uZCA9IDA7IHNlY29uZCA8IGR1cmF0aW9uU2Vjb25kczsgc2Vjb25kKyspIHsKICAgICAgICAgICAgIC8vIFNsZWVwIGEgd2hpbGUuIFdha2UgdXAgZWFybHkgaWYgdGhlcmUgaXMgYW4gZXJyb3IsIGZvciBleGFtcGxlIGEgRElTQ09OTkVDVC4KLSAgICAgICAgICAgIGxvbmcgcmV0ID0gbXlEYXRhLndha2VyLndhaXQoQUFVRElPX09LLCBOQU5PU19QRVJfU0VDT05EKTsKKyAgICAgICAgICAgIG15RGF0YS53YWtlci53YWl0KEFBVURJT19PSywgTkFOT1NfUEVSX1NFQ09ORCk7CiAgICAgICAgICAgICBpbnQ2NF90IG1pbGxpcyA9CiAgICAgICAgICAgICAgICAgICAgIChnZXROYW5vc2Vjb25kcyhDTE9DS19NT05PVE9OSUMpIC0gc3RhcnRlZEF0TmFub3MpIC8gTkFOT1NfUEVSX01JTExJU0VDT05EOwogICAgICAgICAgICAgcmVzdWx0ID0gbXlEYXRhLndha2VyLmdldCgpOwotICAgICAgICAgICAgcHJpbnRmKCJ3YWl0KCkgcmV0dXJucyAlbGQsIGFhdWRpb19yZXN1bHQgPSAlZCwgYXQgJTZkIG1pbGxpcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIHNlY29uZCA9ICUzZCwgZnJhbWVzV3JpdHRlbiA9ICU4ZCwgdW5kZXJydW5zID0gJWRcbiIsCi0gICAgICAgICAgICAgICAgICAgcmV0LCByZXN1bHQsIChpbnQpIG1pbGxpcywKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZnJhbWVzV3JpdHRlbiA9IChpbnQzMl90KSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihwbGF5ZXIuZ2V0U3RyZWFtKCkpOworICAgICAgICAgICAgY29uc3QgaW50MzJfdCBmcmFtZXNSZWFkID0gKGludDMyX3QpIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKHBsYXllci5nZXRTdHJlYW0oKSk7CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IHhydW5zID0gQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChwbGF5ZXIuZ2V0U3RyZWFtKCkpOworICAgICAgICAgICAgcHJpbnRmKCIgd2FrZXIgcmVzdWx0ID0gJWQsIGF0ICU2ZCBtaWxsaXMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBzZWNvbmQgPSAlM2QsIGZyYW1lcyB3cml0dGVuICU4ZCAtIHJlYWQgJThkID0gJThkLCB1bmRlcnJ1bnMgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICByZXN1bHQsIChpbnQpIG1pbGxpcywKICAgICAgICAgICAgICAgICAgICBzZWNvbmQsCi0gICAgICAgICAgICAgICAgICAgKGludCkgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4ocGxheWVyLmdldFN0cmVhbSgpKSwKLSAgICAgICAgICAgICAgICAgICAoaW50KSBBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50KHBsYXllci5nZXRTdHJlYW0oKSkpOworICAgICAgICAgICAgICAgICAgIGZyYW1lc1dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgZnJhbWVzUmVhZCwKKyAgICAgICAgICAgICAgICAgICBmcmFtZXNXcml0dGVuIC0gZnJhbWVzUmVhZCwKKyAgICAgICAgICAgICAgICAgICB4cnVucyk7CiAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RlZCA9IChyZXN1bHQgPT0gQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRCk7CiAgICAgICAgICAgICAgICAgYmFpbE91dCA9IHRydWU7CkBAIC0xMzgsNiArMTUwLDEwIEBACiAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQgPSBwbGF5ZXIud2FpdFVudGlsUGF1c2VkKCk7CisgICAgICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgICAgIGdvdG8gZXJyb3I7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXN1bHQgPSBwbGF5ZXIuZmx1c2goKTsKICAgICAgICAgfQogICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewpAQCAtMjA0LDcgKzIyMCw5IEBACiAgICAgQUF1ZGlvQXJnc1BhcnNlcjo6dXNhZ2UoKTsKICAgICBwcmludGYoIiAgICAgIC1se2NvdW50fSBsb29wQ291bnQgc3RhcnQvc3RvcCwgZXZlcnkgb3RoZXIgb25lIGlzIHNpbGVudFxuIik7CiAgICAgcHJpbnRmKCIgICAgICAtdHttc2VjfSAgcGxheSBhIGhpZ2ggcGl0Y2hlZCB0b25lIGF0IHRoZSBiZWdpbm5pbmdcbiIpOwotICAgIHByaW50ZigiICAgICAgLXogICAgICAgIGZvcmNlIHBlcmlvZGljIHVuZGVycnVucyBieSBzbGVlcGluZyBpbiBjYWxsYmFja1xuIik7CisgICAgcHJpbnRmKCIgICAgICAtaHttc2VjfSAgZm9yY2UgcGVyaW9kaWMgdW5kZXJydW5zIGJ5IGhhbmdpbmcgaW4gY2FsbGJhY2tcbiIpOworICAgIHByaW50ZigiICAgICAgICAgICAgICAgIElmIG5vIHZhbHVlIHNwZWNpZmllZCB0aGVuICVkIHVzZWQuXG4iLAorICAgICAgICAgICAga0RlZmF1bHRIYW5nVGltZU1TZWMpOwogfQogCiBpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqKmFyZ3YpCkBAIC0yMTMsMTMgKzIzMSwxNCBAQAogICAgIGFhdWRpb19yZXN1bHRfdCAgICByZXN1bHQ7CiAgICAgaW50MzJfdCAgICAgICAgICAgIGxvb3BDb3VudCA9IDE7CiAgICAgaW50MzJfdCAgICAgICAgICAgIHByZWZpeFRvbmVNc2VjID0gMDsKLSAgICBib29sICAgICAgICAgICAgICAgZm9yY2VVbmRlcnJ1bnMgPSBmYWxzZTsKKyAgICBpbnQzMl90ICAgICAgICAgICAgaGFuZ1RpbWVNU2VjID0gMDsKIAogICAgIC8vIE1ha2UgcHJpbnRmIHByaW50IGltbWVkaWF0ZWx5IHNvIHRoYXQgZGVidWcgaW5mbyBpcyBub3Qgc3R1Y2sKICAgICAvLyBpbiBhIGJ1ZmZlciBpZiB3ZSBoYW5nIG9yIGNyYXNoLgogICAgIHNldHZidWYoc3Rkb3V0LCBudWxscHRyLCBfSU9OQkYsIChzaXplX3QpIDApOwogCi0gICAgcHJpbnRmKCIlcyAtIFBsYXkgYSBzaW5lIHN3ZWVwIHVzaW5nIGFuIEFBdWRpbyBjYWxsYmFjayBWMC4xLjRcbiIsIGFyZ3ZbMF0pOworICAgIHByaW50ZigiJXMgLSBQbGF5IGEgc2luZSBzd2VlcCB1c2luZyBhbiBBQXVkaW8gY2FsbGJhY2sgViVzXG4iLAorICAgICAgICBhcmd2WzBdLCBBUFBfVkVSU0lPTik7CiAKICAgICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykgewogICAgICAgICBjb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOwpAQCAtMjM0LDggKzI1MywxMCBAQAogICAgICAgICAgICAgICAgICAgICBjYXNlICd0JzoKICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeFRvbmVNc2VjID0gYXRvaSgmYXJnWzJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlICd6JzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlVW5kZXJydW5zID0gdHJ1ZTsgIC8vIFp6enp6enoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnaCc6CisgICAgICAgICAgICAgICAgICAgICAgICBoYW5nVGltZU1TZWMgPSAoYXJnWzJdKSAvLyB2YWx1ZSBzcGVjaWZpZWQ/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYXRvaSgmYXJnWzJdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGtEZWZhdWx0SGFuZ1RpbWVNU2VjOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSgpOwpAQCAtMjUxLDcgKzI3Miw4IEBACiAgICAgfQogCiAgICAgLy8gS2VlcCBsb29waW5nIHVudGlsIHdlIGNhbiBjb21wbGV0ZSB0aGUgdGVzdCB3aXRob3V0IGRpc2Nvbm5lY3RpbmcuCi0gICAgd2hpbGUoKHJlc3VsdCA9IHRlc3RPcGVuUGxheUNsb3NlKGFyZ1BhcnNlciwgbG9vcENvdW50LCBwcmVmaXhUb25lTXNlYywgZm9yY2VVbmRlcnJ1bnMpKQorICAgIHdoaWxlKChyZXN1bHQgPSB0ZXN0T3BlblBsYXlDbG9zZShhcmdQYXJzZXIsIGxvb3BDb3VudCwKKyAgICAgICAgICAgIHByZWZpeFRvbmVNc2VjLCBoYW5nVGltZU1TZWMpKQogICAgICAgICAgICAgPT0gQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRCk7CiAKICAgICByZXR1cm4gKHJlc3VsdCkgPyBFWElUX0ZBSUxVUkUgOiBFWElUX1NVQ0NFU1M7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmggYi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmgKaW5kZXggNWIyOTQxOS4uZWU1ZDA4OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaApAQCAtMzcsNyArMzcsNyBAQAogCiAvKioKICAqIFRoaXMgaXMgdXNlZCB0byByZXByZXNlbnQgYSB2YWx1ZSB0aGF0IGhhcyBub3QgYmVlbiBzcGVjaWZpZWQuCi0gKiBGb3IgZXhhbXBsZSwgYW4gYXBwbGljYXRpb24gY291bGQgdXNlIEFBVURJT19VTlNQRUNJRklFRCB0byBpbmRpY2F0ZQorICogRm9yIGV4YW1wbGUsIGFuIGFwcGxpY2F0aW9uIGNvdWxkIHVzZSB7QGxpbmsgI0FBVURJT19VTlNQRUNJRklFRH0gdG8gaW5kaWNhdGUKICAqIHRoYXQgaXMgZGlkIG5vdCBub3QgY2FyZSB3aGF0IHRoZSBzcGVjaWZpYyB2YWx1ZSBvZiBhIHBhcmFtZXRlciB3YXMKICAqIGFuZCB3b3VsZCBhY2NlcHQgd2hhdGV2ZXIgaXQgd2FzIGdpdmVuLgogICovCkBAIC0yMzIsNyArMjMyLDggQEAKICAqIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCBieSBjZXJ0YWluIHBsYXRmb3JtcyBvciByb3V0aW5nIHBvbGljaWVzCiAgKiB0byBtYWtlIG1vcmUgcmVmaW5lZCB2b2x1bWUgb3Igcm91dGluZyBkZWNpc2lvbnMuCiAgKgotICogTm90ZSB0aGF0IHRoZXNlIG1hdGNoIHRoZSBlcXVpdmFsZW50IHZhbHVlcyBpbiBBdWRpb0F0dHJpYnV0ZXMgaW4gdGhlIEFuZHJvaWQgSmF2YSBBUEkuCisgKiBOb3RlIHRoYXQgdGhlc2UgbWF0Y2ggdGhlIGVxdWl2YWxlbnQgdmFsdWVzIGluIHtAbGluayBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlc30KKyAqIGluIHRoZSBBbmRyb2lkIEphdmEgQVBJLgogICoKICAqIEFkZGVkIGluIEFQSSBsZXZlbCAyOC4KICAqLwpAQCAtMzAzLDEyICszMDQsMTMgQEAKIC8qKgogICogVGhlIENPTlRFTlRfVFlQRSBhdHRyaWJ1dGUgZGVzY3JpYmVzICJ3aGF0IiB5b3UgYXJlIHBsYXlpbmcuCiAgKiBJdCBleHByZXNzZXMgdGhlIGdlbmVyYWwgY2F0ZWdvcnkgb2YgdGhlIGNvbnRlbnQuIFRoaXMgaW5mb3JtYXRpb24gaXMgb3B0aW9uYWwuCi0gKiBCdXQgaW4gY2FzZSBpdCBpcyBrbm93biAoZm9yIGluc3RhbmNlIHtAbGluayAjQUFVRElPX0NPTlRFTlRfVFlQRV9NT1ZJRX0gZm9yIGEKLSAqIG1vdmllIHN0cmVhbWluZyBzZXJ2aWNlIG9yIHtAbGluayAjQUFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0h9IGZvcgorICogQnV0IGluIGNhc2UgaXQgaXMga25vd24gKGZvciBpbnN0YW5jZSBBQVVESU9fQ09OVEVOVF9UWVBFX01PVklFIGZvciBhCisgKiBtb3ZpZSBzdHJlYW1pbmcgc2VydmljZSBvciBBQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCBmb3IKICAqIGFuIGF1ZGlvIGJvb2sgYXBwbGljYXRpb24pIHRoaXMgaW5mb3JtYXRpb24gbWlnaHQgYmUgdXNlZCBieSB0aGUgYXVkaW8gZnJhbWV3b3JrIHRvCiAgKiBlbmZvcmNlIGF1ZGlvIGZvY3VzLgogICoKLSAqIE5vdGUgdGhhdCB0aGVzZSBtYXRjaCB0aGUgZXF1aXZhbGVudCB2YWx1ZXMgaW4gQXVkaW9BdHRyaWJ1dGVzIGluIHRoZSBBbmRyb2lkIEphdmEgQVBJLgorICogTm90ZSB0aGF0IHRoZXNlIG1hdGNoIHRoZSBlcXVpdmFsZW50IHZhbHVlcyBpbiB7QGxpbmsgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXN9CisgKiBpbiB0aGUgQW5kcm9pZCBKYXZhIEFQSS4KICAqCiAgKiBBZGRlZCBpbiBBUEkgbGV2ZWwgMjguCiAgKi8KQEAgLTM3MywxMCArMzc1LDU5IEBACiAgICAgICogc28gdGhlIHJlY29yZGVkIHZvbHVtZSBtYXkgYmUgdmVyeSBsb3cuCiAgICAgICovCiAgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9VTlBST0NFU1NFRCA9IDksCisKKyAgICAvKioKKyAgICAgKiBVc2UgdGhpcyBwcmVzZXQgZm9yIGNhcHR1cmluZyBhdWRpbyBtZWFudCB0byBiZSBwcm9jZXNzZWQgaW4gcmVhbCB0aW1lCisgICAgICogYW5kIHBsYXllZCBiYWNrIGZvciBsaXZlIHBlcmZvcm1hbmNlIChlLmcga2FyYW9rZSkuCisgICAgICogVGhlIGNhcHR1cmUgcGF0aCB3aWxsIG1pbmltaXplIGxhdGVuY3kgYW5kIGNvdXBsaW5nIHdpdGggcGxheWJhY2sgcGF0aC4KKyAgICAgKi8KKyAgICBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1BFUkZPUk1BTkNFID0gMTAsCiB9OwogdHlwZWRlZiBpbnQzMl90IGFhdWRpb19pbnB1dF9wcmVzZXRfdDsKIAogLyoqCisgKiBTcGVjaWZ5aW5nIGlmIGF1ZGlvIG1heSBvciBtYXkgbm90IGJlIGNhcHR1cmVkIGJ5IG90aGVyIGFwcHMgb3IgdGhlIHN5c3RlbS4KKyAqCisgKiBOb3RlIHRoYXQgdGhlc2UgbWF0Y2ggdGhlIGVxdWl2YWxlbnQgdmFsdWVzIGluIHtAbGluayBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlc30KKyAqIGluIHRoZSBBbmRyb2lkIEphdmEgQVBJLgorICoKKyAqIEFkZGVkIGluIEFQSSBsZXZlbCAyOS4KKyAqLworZW51bSB7CisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGF1ZGlvIG1heSBiZSBjYXB0dXJlZCBieSBhbnkgYXBwLgorICAgICAqCisgICAgICogRm9yIHByaXZhY3ksIHRoZSBmb2xsb3dpbmcgdXNhZ2VzIGNhbiBub3QgYmUgcmVjb3JkZWQ6IEFBVURJT19WT0lDRV9DT01NVU5JQ0FUSU9OKiwKKyAgICAgKiBBQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OKiwgQUFVRElPX1VTQUdFX0FTU0lTVEFOQ0UqIGFuZCB7QGxpbmsgI0FBVURJT19VU0FHRV9BU1NJU1RBTlR9LgorICAgICAqCisgICAgICogT24ge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNRfSwgdGhpcyBtZWFucyBvbmx5IHtAbGluayAjQUFVRElPX1VTQUdFX01FRElBfQorICAgICAqIGFuZCB7QGxpbmsgI0FBVURJT19VU0FHRV9HQU1FfSBtYXkgYmUgY2FwdHVyZWQuCisgICAgICoKKyAgICAgKiBTZWUge0BsaW5rIGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzI0FMTE9XX0NBUFRVUkVfQllfQUxMfS4KKyAgICAgKi8KKyAgICBBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9BTEwgPSAxLAorICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBhdWRpbyBtYXkgb25seSBiZSBjYXB0dXJlZCBieSBzeXN0ZW0gYXBwcy4KKyAgICAgKgorICAgICAqIFN5c3RlbSBhcHBzIGNhbiBjYXB0dXJlIGZvciBtYW55IHB1cnBvc2VzIGxpa2UgYWNjZXNzaWJpbGl0eSwgdXNlciBndWlkYW5jZS4uLgorICAgICAqIGJ1dCBoYXZlIHN0cm9uZyByZXN0cmljdGlvbi4gU2VlCisgICAgICoge0BsaW5rIGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzI0FMTE9XX0NBUFRVUkVfQllfU1lTVEVNfSBmb3Igd2hhdCB0aGUgc3lzdGVtIGFwcHMKKyAgICAgKiBjYW4gZG8gd2l0aCB0aGUgY2FwdHVyZSBhdWRpby4KKyAgICAgKi8KKyAgICBBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9TWVNURU0gPSAyLAorICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBhdWRpbyBtYXkgbm90IGJlIHJlY29yZGVkIGJ5IGFueSBhcHAsIGV2ZW4gaWYgaXQgaXMgYSBzeXN0ZW0gYXBwLgorICAgICAqCisgICAgICogSXQgaXMgZW5jb3VyYWdlZCB0byB1c2Uge0BsaW5rICNBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9TWVNURU19IGluc3RlYWQgb2YgdGhpcyB2YWx1ZSBhcyBzeXN0ZW0gYXBwcworICAgICAqIHByb3ZpZGUgc2lnbmlmaWNhbnQgYW5kIHVzZWZ1bCBmZWF0dXJlcyBmb3IgdGhlIHVzZXIgKGVnLiBhY2Nlc3NpYmlsaXR5KS4KKyAgICAgKiBTZWUge0BsaW5rIGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzI0FMTE9XX0NBUFRVUkVfQllfTk9ORX0uCisgICAgICovCisgICAgQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfTk9ORSA9IDMsCit9OworCit0eXBlZGVmIGludDMyX3QgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdDsKKworLyoqCiAgKiBUaGVzZSBtYXkgYmUgdXNlZCB3aXRoIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2Vzc2lvbklkKCkuCiAgKgogICogQWRkZWQgaW4gQVBJIGxldmVsIDI4LgpAQCAtNDIzLDcgKzQ3NCw3IEBACiAgKgogICogQHJldHVybiBwb2ludGVyIHRvIGEgdGV4dCByZXByZXNlbnRhdGlvbiBvZiBhbiBBQXVkaW8gcmVzdWx0IGNvZGUuCiAgKi8KLUFBVURJT19BUEkgY29uc3QgY2hhciAqIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KGFhdWRpb19yZXN1bHRfdCByZXR1cm5Db2RlKTsKK0FBVURJT19BUEkgY29uc3QgY2hhciAqIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KGFhdWRpb19yZXN1bHRfdCByZXR1cm5Db2RlKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIFRoZSB0ZXh0IGlzIHRoZSBBU0NJSSBzeW1ib2wgY29ycmVzcG9uZGluZyB0byB0aGUgc3RyZWFtIHN0YXRlLApAQCAtNDMzLDcgKzQ4NCw4IEBACiAgKgogICogQHJldHVybiBwb2ludGVyIHRvIGEgdGV4dCByZXByZXNlbnRhdGlvbiBvZiBhbiBBQXVkaW8gc3RhdGUuCiAgKi8KLUFBVURJT19BUEkgY29uc3QgY2hhciAqIEFBdWRpb19jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQoYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IHN0YXRlKTsKK0FBVURJT19BUEkgY29uc3QgY2hhciAqIEFBdWRpb19jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQoYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IHN0YXRlKQorICAgICAgICBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vIFN0cmVhbUJ1aWxkZXIKQEAgLTQ0NCwzMiArNDk2LDMzIEBACiAgKgogICogVGhlIGRldmljZUlkIGlzIGluaXRpYWxseSB1bnNwZWNpZmllZCwgbWVhbmluZyB0aGF0IHRoZSBjdXJyZW50IGRlZmF1bHQgZGV2aWNlIHdpbGwgYmUgdXNlZC4KICAqCi0gKiBUaGUgZGVmYXVsdCBkaXJlY3Rpb24gaXMgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQuCi0gKiBUaGUgZGVmYXVsdCBzaGFyaW5nIG1vZGUgaXMgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQuCisgKiBUaGUgZGVmYXVsdCBkaXJlY3Rpb24gaXMge0BsaW5rICNBQVVESU9fRElSRUNUSU9OX09VVFBVVH0uCisgKiBUaGUgZGVmYXVsdCBzaGFyaW5nIG1vZGUgaXMge0BsaW5rICNBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRH0uCiAgKiBUaGUgZGF0YSBmb3JtYXQsIHNhbXBsZXNQZXJGcmFtZXMgYW5kIHNhbXBsZVJhdGUgYXJlIHVuc3BlY2lmaWVkIGFuZCB3aWxsIGJlCiAgKiBjaG9zZW4gYnkgdGhlIGRldmljZSB3aGVuIGl0IGlzIG9wZW5lZC4KICAqCiAgKiBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZSgpIG11c3QgYmUgY2FsbGVkIHdoZW4geW91IGFyZSBkb25lIHVzaW5nIHRoZSBidWlsZGVyLgogICovCi1BQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcihBQXVkaW9TdHJlYW1CdWlsZGVyKiogYnVpbGRlcik7CitBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcihBQXVkaW9TdHJlYW1CdWlsZGVyKiogYnVpbGRlcikKKyAgICAgICAgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBSZXF1ZXN0IGFuIGF1ZGlvIGRldmljZSBpZGVudGlmaWVkIGRldmljZSB1c2luZyBhbiBJRC4KICAqIE9uIEFuZHJvaWQsIGZvciBleGFtcGxlLCB0aGUgSUQgY291bGQgYmUgb2J0YWluZWQgZnJvbSB0aGUgSmF2YSBBdWRpb01hbmFnZXIuCiAgKgotICogVGhlIGRlZmF1bHQsIGlmIHlvdSBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLCBpcyBBQVVESU9fVU5TUEVDSUZJRUQsCisgKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIHtAbGluayAjQUFVRElPX1VOU1BFQ0lGSUVEfSwKICAqIGluIHdoaWNoIGNhc2UgdGhlIHByaW1hcnkgZGV2aWNlIHdpbGwgYmUgdXNlZC4KICAqCiAgKiBAcGFyYW0gYnVpbGRlciByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoKQotICogQHBhcmFtIGRldmljZUlkIGRldmljZSBpZGVudGlmaWVyIG9yIEFBVURJT19VTlNQRUNJRklFRAorICogQHBhcmFtIGRldmljZUlkIGRldmljZSBpZGVudGlmaWVyIG9yIHtAbGluayAjQUFVRElPX1VOU1BFQ0lGSUVEfQogICovCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREZXZpY2VJZChBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRldmljZUlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZGV2aWNlSWQpIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgogICogUmVxdWVzdCBhIHNhbXBsZSByYXRlIGluIEhlcnR6LgogICoKLSAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMgQUFVRElPX1VOU1BFQ0lGSUVELgorICogVGhlIGRlZmF1bHQsIGlmIHlvdSBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLCBpcyB7QGxpbmsgI0FBVURJT19VTlNQRUNJRklFRH0uCiAgKiBBbiBvcHRpbWFsIHZhbHVlIHdpbGwgdGhlbiBiZSBjaG9zZW4gd2hlbiB0aGUgc3RyZWFtIGlzIG9wZW5lZC4KICAqIEFmdGVyIG9wZW5pbmcgYSBzdHJlYW0gd2l0aCBhbiB1bnNwZWNpZmllZCB2YWx1ZSwgdGhlIGFwcGxpY2F0aW9uIG11c3QKICAqIHF1ZXJ5IGZvciB0aGUgYWN0dWFsIHZhbHVlLCB3aGljaCBtYXkgdmFyeSBieSBkZXZpY2UuCkBAIC00ODEsMTIgKzUzNCwxMiBAQAogICogQHBhcmFtIHNhbXBsZVJhdGUgZnJhbWVzIHBlciBzZWNvbmQuIENvbW1vbiByYXRlcyBpbmNsdWRlIDQ0MTAwIGFuZCA0ODAwMCBIei4KICAqLwogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2FtcGxlUmF0ZShBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZSkgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBSZXF1ZXN0IGEgbnVtYmVyIG9mIGNoYW5uZWxzIGZvciB0aGUgc3RyZWFtLgogICoKLSAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMgQUFVRElPX1VOU1BFQ0lGSUVELgorICogVGhlIGRlZmF1bHQsIGlmIHlvdSBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLCBpcyB7QGxpbmsgI0FBVURJT19VTlNQRUNJRklFRH0uCiAgKiBBbiBvcHRpbWFsIHZhbHVlIHdpbGwgdGhlbiBiZSBjaG9zZW4gd2hlbiB0aGUgc3RyZWFtIGlzIG9wZW5lZC4KICAqIEFmdGVyIG9wZW5pbmcgYSBzdHJlYW0gd2l0aCBhbiB1bnNwZWNpZmllZCB2YWx1ZSwgdGhlIGFwcGxpY2F0aW9uIG11c3QKICAqIHF1ZXJ5IGZvciB0aGUgYWN0dWFsIHZhbHVlLCB3aGljaCBtYXkgdmFyeSBieSBkZXZpY2UuCkBAIC00OTgsNyArNTUxLDcgQEAKICAqIEBwYXJhbSBjaGFubmVsQ291bnQgTnVtYmVyIG9mIGNoYW5uZWxzIGRlc2lyZWQuCiAgKi8KIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENoYW5uZWxDb3VudChBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsQ291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50KSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIElkZW50aWNhbCB0byBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENoYW5uZWxDb3VudCgpLgpAQCAtNTA3LDEyICs1NjAsMTIgQEAKICAqIEBwYXJhbSBzYW1wbGVzUGVyRnJhbWUgTnVtYmVyIG9mIHNhbXBsZXMgaW4gYSBmcmFtZS4KICAqLwogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2FtcGxlc1BlckZyYW1lKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKLSAqIFJlcXVlc3QgYSBzYW1wbGUgZGF0YSBmb3JtYXQsIGZvciBleGFtcGxlIEFBVURJT19GT1JNQVRfUENNX0kxNi4KKyAqIFJlcXVlc3QgYSBzYW1wbGUgZGF0YSBmb3JtYXQsIGZvciBleGFtcGxlIHtAbGluayAjQUFVRElPX0ZPUk1BVF9QQ01fSTE2fS4KICAqCi0gKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIEFBVURJT19VTlNQRUNJRklFRC4KKyAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMge0BsaW5rICNBQVVESU9fVU5TUEVDSUZJRUR9LgogICogQW4gb3B0aW1hbCB2YWx1ZSB3aWxsIHRoZW4gYmUgY2hvc2VuIHdoZW4gdGhlIHN0cmVhbSBpcyBvcGVuZWQuCiAgKiBBZnRlciBvcGVuaW5nIGEgc3RyZWFtIHdpdGggYW4gdW5zcGVjaWZpZWQgdmFsdWUsIHRoZSBhcHBsaWNhdGlvbiBtdXN0CiAgKiBxdWVyeSBmb3IgdGhlIGFjdHVhbCB2YWx1ZSwgd2hpY2ggbWF5IHZhcnkgYnkgZGV2aWNlLgpAQCAtNTIxLDY0ICs1NzQsNjYgQEAKICAqIElmIGEgc3RyZWFtIGNhbm5vdCBiZSBvcGVuZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlIHRoZW4gdGhlIG9wZW4gd2lsbCBmYWlsLgogICoKICAqIEBwYXJhbSBidWlsZGVyIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigpCi0gKiBAcGFyYW0gZm9ybWF0IGNvbW1vbiBmb3JtYXRzIGFyZSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCBhbmQgQUFVRElPX0ZPUk1BVF9QQ01fSTE2LgorICogQHBhcmFtIGZvcm1hdCBjb21tb24gZm9ybWF0cyBhcmUge0BsaW5rICNBQVVESU9fRk9STUFUX1BDTV9GTE9BVH0gYW5kCisgKiAgICAgICAgICAgICAgIHtAbGluayAjQUFVRElPX0ZPUk1BVF9QQ01fSTE2fS4KICAqLwogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Rm9ybWF0KEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fZm9ybWF0X3QgZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIFJlcXVlc3QgYSBtb2RlIGZvciBzaGFyaW5nIHRoZSBkZXZpY2UuCiAgKgotICogVGhlIGRlZmF1bHQsIGlmIHlvdSBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLCBpcyBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRC4KKyAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMge0BsaW5rICNBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRH0uCiAgKgogICogVGhlIHJlcXVlc3RlZCBzaGFyaW5nIG1vZGUgbWF5IG5vdCBiZSBhdmFpbGFibGUuCiAgKiBUaGUgYXBwbGljYXRpb24gY2FuIHF1ZXJ5IGZvciB0aGUgYWN0dWFsIG1vZGUgYWZ0ZXIgdGhlIHN0cmVhbSBpcyBvcGVuZWQuCiAgKgogICogQHBhcmFtIGJ1aWxkZXIgcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCkKLSAqIEBwYXJhbSBzaGFyaW5nTW9kZSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCBvciBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRQorICogQHBhcmFtIHNoYXJpbmdNb2RlIHtAbGluayAjQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUR9IG9yIHtAbGluayAjQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkV9CiAgKi8KIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNoYXJpbmdNb2RlKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSk7CisgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSkgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBSZXF1ZXN0IHRoZSBkaXJlY3Rpb24gZm9yIGEgc3RyZWFtLgogICoKLSAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQuCisgKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIHtAbGluayAjQUFVRElPX0RJUkVDVElPTl9PVVRQVVR9LgogICoKICAqIEBwYXJhbSBidWlsZGVyIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigpCi0gKiBAcGFyYW0gZGlyZWN0aW9uIEFBVURJT19ESVJFQ1RJT05fT1VUUFVUIG9yIEFBVURJT19ESVJFQ1RJT05fSU5QVVQKKyAqIEBwYXJhbSBkaXJlY3Rpb24ge0BsaW5rICNBQVVESU9fRElSRUNUSU9OX09VVFBVVH0gb3Ige0BsaW5rICNBQVVESU9fRElSRUNUSU9OX0lOUFVUfQogICovCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREaXJlY3Rpb24oQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24pOworICAgICAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIFNldCB0aGUgcmVxdWVzdGVkIGJ1ZmZlciBjYXBhY2l0eSBpbiBmcmFtZXMuCiAgKiBUaGUgZmluYWwgQUF1ZGlvU3RyZWFtIGNhcGFjaXR5IG1heSBkaWZmZXIsIGJ1dCB3aWxsIHByb2JhYmx5IGJlIGF0IGxlYXN0IHRoaXMgYmlnLgogICoKLSAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMgQUFVRElPX1VOU1BFQ0lGSUVELgorICogVGhlIGRlZmF1bHQsIGlmIHlvdSBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLCBpcyB7QGxpbmsgI0FBVURJT19VTlNQRUNJRklFRH0uCiAgKgogICogQHBhcmFtIGJ1aWxkZXIgcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCkKLSAqIEBwYXJhbSBudW1GcmFtZXMgdGhlIGRlc2lyZWQgYnVmZmVyIGNhcGFjaXR5IGluIGZyYW1lcyBvciBBQVVESU9fVU5TUEVDSUZJRUQKKyAqIEBwYXJhbSBudW1GcmFtZXMgdGhlIGRlc2lyZWQgYnVmZmVyIGNhcGFjaXR5IGluIGZyYW1lcyBvciB7QGxpbmsgI0FBVURJT19VTlNQRUNJRklFRH0KICAqLwogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyhBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcyk7CisgICAgICAgIGludDMyX3QgbnVtRnJhbWVzKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIFNldCB0aGUgcmVxdWVzdGVkIHBlcmZvcm1hbmNlIG1vZGUuCiAgKgotICogU3VwcG9ydGVkIG1vZGVzIGFyZSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FLCBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9QT1dFUl9TQVZJTkcKLSAqIGFuZCBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWS4KKyAqIFN1cHBvcnRlZCBtb2RlcyBhcmUge0BsaW5rICNBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FfSwKKyAqIHtAbGluayAjQUFVRElPX1BFUkZPUk1BTkNFX01PREVfUE9XRVJfU0FWSU5HfSAqIGFuZCB7QGxpbmsgI0FBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZfS4KICAqCi0gKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUuCisgKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIHtAbGluayAjQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORX0uCiAgKgogICogWW91IG1heSBub3QgZ2V0IHRoZSBtb2RlIHlvdSByZXF1ZXN0ZWQuCi0gKiBZb3UgY2FuIGNhbGwgQUF1ZGlvU3RyZWFtX2dldFBlcmZvcm1hbmNlTW9kZSgpIHRvIGZpbmQgb3V0IHRoZSBmaW5hbCBtb2RlIGZvciB0aGUgc3RyZWFtLgorICogWW91IGNhbiBjYWxsIEFBdWRpb1N0cmVhbV9nZXRQZXJmb3JtYW5jZU1vZGUoKQorICogdG8gZmluZCBvdXQgdGhlIGZpbmFsIG1vZGUgZm9yIHRoZSBzdHJlYW0uCiAgKgogICogQHBhcmFtIGJ1aWxkZXIgcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCkKLSAqIEBwYXJhbSBtb2RlIHRoZSBkZXNpcmVkIHBlcmZvcm1hbmNlIG1vZGUsIGVnLiBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWQorICogQHBhcmFtIG1vZGUgdGhlIGRlc2lyZWQgcGVyZm9ybWFuY2UgbW9kZSwgZWcuIHtAbGluayAjQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1l9CiAgKi8KIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFBlcmZvcm1hbmNlTW9kZShBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBtb2RlKTsKKyAgICAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBtb2RlKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIFNldCB0aGUgaW50ZW5kZWQgdXNlIGNhc2UgZm9yIHRoZSBzdHJlYW0uCkBAIC01ODcsMTUgKzY0MiwxNSBAQAogICogYmVoYXZpb3Igb2YgdGhlIHN0cmVhbS4KICAqIFRoaXMgY291bGQsIGZvciBleGFtcGxlLCBhZmZlY3QgaG93IHZvbHVtZSBhbmQgZm9jdXMgaXMgaGFuZGxlZCBmb3IgdGhlIHN0cmVhbS4KICAqCi0gKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIEFBVURJT19VU0FHRV9NRURJQS4KKyAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMge0BsaW5rICNBQVVESU9fVVNBR0VfTUVESUF9LgogICoKICAqIEFkZGVkIGluIEFQSSBsZXZlbCAyOC4KICAqCiAgKiBAcGFyYW0gYnVpbGRlciByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoKQotICogQHBhcmFtIHVzYWdlIHRoZSBkZXNpcmVkIHVzYWdlLCBlZy4gQUFVRElPX1VTQUdFX0dBTUUKKyAqIEBwYXJhbSB1c2FnZSB0aGUgZGVzaXJlZCB1c2FnZSwgZWcuIHtAbGluayAjQUFVRElPX1VTQUdFX0dBTUV9CiAgKi8KIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFVzYWdlKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3VzYWdlX3QgdXNhZ2UpOworICAgICAgICBhYXVkaW9fdXNhZ2VfdCB1c2FnZSkgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAogLyoqCiAgKiBTZXQgdGhlIHR5cGUgb2YgYXVkaW8gZGF0YSB0aGF0IHRoZSBzdHJlYW0gd2lsbCBjYXJyeS4KQEAgLTYwNCwxNSArNjU5LDE1IEBACiAgKiBiZWhhdmlvciBvZiB0aGUgc3RyZWFtLgogICogVGhpcyBjb3VsZCwgZm9yIGV4YW1wbGUsIGFmZmVjdCB3aGV0aGVyIGEgc3RyZWFtIGlzIHBhdXNlZCB3aGVuIGEgbm90aWZpY2F0aW9uIG9jY3Vycy4KICAqCi0gKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIEFBVURJT19DT05URU5UX1RZUEVfTVVTSUMuCisgKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIHtAbGluayAjQUFVRElPX0NPTlRFTlRfVFlQRV9NVVNJQ30uCiAgKgogICogQWRkZWQgaW4gQVBJIGxldmVsIDI4LgogICoKICAqIEBwYXJhbSBidWlsZGVyIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigpCi0gKiBAcGFyYW0gY29udGVudFR5cGUgdGhlIHR5cGUgb2YgYXVkaW8gZGF0YSwgZWcuIEFBVURJT19DT05URU5UX1RZUEVfU1BFRUNICisgKiBAcGFyYW0gY29udGVudFR5cGUgdGhlIHR5cGUgb2YgYXVkaW8gZGF0YSwgZWcuIHtAbGluayAjQUFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0h9CiAgKi8KIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENvbnRlbnRUeXBlKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fY29udGVudF90eXBlX3QgY29udGVudFR5cGUpOworICAgICAgICBhYXVkaW9fY29udGVudF90eXBlX3QgY29udGVudFR5cGUpIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKIC8qKgogICogU2V0IHRoZSBpbnB1dCAoY2FwdHVyZSkgcHJlc2V0IGZvciB0aGUgc3RyZWFtLgpAQCAtNjIyLDcgKzY3Nyw3IEBACiAgKiBUaGlzIGNvdWxkLCBmb3IgZXhhbXBsZSwgYWZmZWN0IHdoaWNoIG1pY3JvcGhvbmVzIGFyZSB1c2VkIGFuZCBob3cgdGhlCiAgKiByZWNvcmRlZCBkYXRhIGlzIHByb2Nlc3NlZC4KICAqCi0gKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUkVDT0dOSVRJT04uCisgKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIHtAbGluayAjQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9SRUNPR05JVElPTn0uCiAgKiBUaGF0IGlzIGJlY2F1c2UgVk9JQ0VfUkVDT0dOSVRJT04gaXMgdGhlIHByZXNldCB3aXRoIHRoZSBsb3dlc3QgbGF0ZW5jeQogICogb24gbWFueSBwbGF0Zm9ybXMuCiAgKgpAQCAtNjMyLDE2ICs2ODcsMzIgQEAKICAqIEBwYXJhbSBpbnB1dFByZXNldCB0aGUgZGVzaXJlZCBjb25maWd1cmF0aW9uIGZvciByZWNvcmRpbmcKICAqLwogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0SW5wdXRQcmVzZXQoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19pbnB1dF9wcmVzZXRfdCBpbnB1dFByZXNldCk7CisgICAgICAgIGFhdWRpb19pbnB1dF9wcmVzZXRfdCBpbnB1dFByZXNldCkgX19JTlRST0RVQ0VEX0lOKDI4KTsKKworLyoqCisgKiBTcGVjaWZ5IHdoZXRoZXIgdGhpcyBzdHJlYW0gYXVkaW8gbWF5IG9yIG1heSBub3QgYmUgY2FwdHVyZWQgYnkgb3RoZXIgYXBwcyBvciB0aGUgc3lzdGVtLgorICoKKyAqIFRoZSBkZWZhdWx0IGlzIHtAbGluayAjQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfQUxMfS4KKyAqCisgKiBOb3RlIHRoYXQgYW4gYXBwbGljYXRpb24gY2FuIGFsc28gc2V0IGl0cyBnbG9iYWwgcG9saWN5LCBpbiB3aGljaCBjYXNlIHRoZSBtb3N0IHJlc3RyaWN0aXZlCisgKiBwb2xpY3kgaXMgYWx3YXlzIGFwcGxpZWQuIFNlZSB7QGxpbmsgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXMjc2V0QWxsb3dlZENhcHR1cmVQb2xpY3koaW50KX0KKyAqCisgKiBBZGRlZCBpbiBBUEkgbGV2ZWwgMjkuCisgKgorICogQHBhcmFtIGJ1aWxkZXIgcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCkKKyAqIEBwYXJhbSBpbnB1dFByZXNldCB0aGUgZGVzaXJlZCBsZXZlbCBvZiBvcHQtb3V0IGZyb20gYmVpbmcgY2FwdHVyZWQuCisgKi8KK0FBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEFsbG93ZWRDYXB0dXJlUG9saWN5KEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCisgICAgICAgIGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3QgY2FwdHVyZVBvbGljeSkgX19JTlRST0RVQ0VEX0lOKDI5KTsKIAogLyoqIFNldCB0aGUgcmVxdWVzdGVkIHNlc3Npb24gSUQuCiAgKgogICogVGhlIHNlc3Npb24gSUQgY2FuIGJlIHVzZWQgdG8gYXNzb2NpYXRlIGEgc3RyZWFtIHdpdGggZWZmZWN0cyBwcm9jZXNzb3JzLgogICogVGhlIGVmZmVjdHMgYXJlIGNvbnRyb2xsZWQgdXNpbmcgdGhlIEFuZHJvaWQgQXVkaW9FZmZlY3QgSmF2YSBBUEkuCiAgKgotICogVGhlIGRlZmF1bHQsIGlmIHlvdSBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLCBpcyBBQVVESU9fU0VTU0lPTl9JRF9OT05FLgorICogVGhlIGRlZmF1bHQsIGlmIHlvdSBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLCBpcyB7QGxpbmsgI0FBVURJT19TRVNTSU9OX0lEX05PTkV9LgogICoKLSAqIElmIHNldCB0byBBQVVESU9fU0VTU0lPTl9JRF9BTExPQ0FURSB0aGVuIGEgc2Vzc2lvbiBJRCB3aWxsIGJlIGFsbG9jYXRlZAorICogSWYgc2V0IHRvIHtAbGluayAjQUFVRElPX1NFU1NJT05fSURfQUxMT0NBVEV9IHRoZW4gYSBzZXNzaW9uIElEIHdpbGwgYmUgYWxsb2NhdGVkCiAgKiB3aGVuIHRoZSBzdHJlYW0gaXMgb3BlbmVkLgogICoKICAqIFRoZSBhbGxvY2F0ZWQgc2Vzc2lvbiBJRCBjYW4gYmUgb2J0YWluZWQgYnkgY2FsbGluZyBBQXVkaW9TdHJlYW1fZ2V0U2Vzc2lvbklkKCkKQEAgLTY1OSwxMCArNzMwLDEwIEBACiAgKiBBZGRlZCBpbiBBUEkgbGV2ZWwgMjguCiAgKgogICogQHBhcmFtIGJ1aWxkZXIgcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCkKLSAqIEBwYXJhbSBzZXNzaW9uSWQgYW4gYWxsb2NhdGVkIHNlc3Npb25JRCBvciBBQVVESU9fU0VTU0lPTl9JRF9BTExPQ0FURQorICogQHBhcmFtIHNlc3Npb25JZCBhbiBhbGxvY2F0ZWQgc2Vzc2lvbklEIG9yIHtAbGluayAjQUFVRElPX1NFU1NJT05fSURfQUxMT0NBVEV9CiAgKi8KIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNlc3Npb25JZChBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3Nlc3Npb25faWRfdCBzZXNzaW9uSWQpOworICAgICAgICBhYXVkaW9fc2Vzc2lvbl9pZF90IHNlc3Npb25JZCkgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAogLyoqCiAgKiBSZXR1cm4gb25lIG9mIHRoZXNlIHZhbHVlcyBmcm9tIHRoZSBkYXRhIGNhbGxiYWNrIGZ1bmN0aW9uLgpAQCAtNzQyLDE1ICs4MTMsMTYgQEAKICAqCiAgKiBOb3RlIHRoYXQgd2hlbiB1c2luZyB0aGlzIGNhbGxiYWNrLCB0aGUgYXVkaW8gZGF0YSB3aWxsIGJlIHBhc3NlZCBpbiBvciBvdXQKICAqIG9mIHRoZSBmdW5jdGlvbiBhcyBhbiBhcmd1bWVudC4KLSAqIFNvIHlvdSBjYW5ub3QgY2FsbCBBQXVkaW9TdHJlYW1fd3JpdGUoKSBvciBBQXVkaW9TdHJlYW1fcmVhZCgpIG9uIHRoZSBzYW1lIHN0cmVhbQotICogdGhhdCBoYXMgYW4gYWN0aXZlIGRhdGEgY2FsbGJhY2suCisgKiBTbyB5b3UgY2Fubm90IGNhbGwgQUF1ZGlvU3RyZWFtX3dyaXRlKCkgb3IgQUF1ZGlvU3RyZWFtX3JlYWQoKQorICogb24gdGhlIHNhbWUgc3RyZWFtIHRoYXQgaGFzIGFuIGFjdGl2ZSBkYXRhIGNhbGxiYWNrLgogICoKLSAqIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIHN0YXJ0IGJlaW5nIGNhbGxlZCBhZnRlciBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KCkgaXMgY2FsbGVkLgorICogVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgc3RhcnQgYmVpbmcgY2FsbGVkIGFmdGVyIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoKQorICogaXMgY2FsbGVkLgogICogSXQgd2lsbCBzdG9wIGJlaW5nIGNhbGxlZCBhZnRlciBBQXVkaW9TdHJlYW1fcmVxdWVzdFBhdXNlKCkgb3IKICAqIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcCgpIGlzIGNhbGxlZC4KICAqCiAgKiBUaGlzIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIG9uIGEgcmVhbC10aW1lIHRocmVhZCBvd25lZCBieSBBQXVkaW8uIFNlZQotICoge0BsaW5rIEFBdWRpb1N0cmVhbV9kYXRhQ2FsbGJhY2t9IGZvciBtb3JlIGluZm9ybWF0aW9uLgorICoge0BsaW5rICNBQXVkaW9TdHJlYW1fZGF0YUNhbGxiYWNrfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAqCiAgKiBOb3RlIHRoYXQgdGhlIEFBdWRpbyBjYWxsYmFja3Mgd2lsbCBuZXZlciBiZSBjYWxsZWQgc2ltdWx0YW5lb3VzbHkgZnJvbSBtdWx0aXBsZSB0aHJlYWRzLgogICoKQEAgLTc2MCwxNCArODMyLDEzIEBACiAgKiAgICAgICAgICB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb25zLgogICovCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREYXRhQ2FsbGJhY2soQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQXVkaW9TdHJlYW1fZGF0YUNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJEYXRhKTsKKyAgICAgICAgQUF1ZGlvU3RyZWFtX2RhdGFDYWxsYmFjayBjYWxsYmFjaywgdm9pZCAqdXNlckRhdGEpIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgogICogU2V0IHRoZSByZXF1ZXN0ZWQgZGF0YSBjYWxsYmFjayBidWZmZXIgc2l6ZSBpbiBmcmFtZXMuCi0gKiBTZWUge0BsaW5rIEFBdWRpb1N0cmVhbV9kYXRhQ2FsbGJhY2t9LgorICogU2VlIHtAbGluayAjQUF1ZGlvU3RyZWFtX2RhdGFDYWxsYmFja30uCiAgKgotICogVGhlIGRlZmF1bHQsIGlmIHlvdSBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLCBpcyBBQVVESU9fVU5TUEVDSUZJRUQuCisgKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIHtAbGluayAjQUFVRElPX1VOU1BFQ0lGSUVEfS4KICAqCiAgKiBGb3IgdGhlIGxvd2VzdCBwb3NzaWJsZSBsYXRlbmN5LCBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLiBBQXVkaW8gd2lsbCB0aGVuCiAgKiBjYWxsIHRoZSBkYXRhUHJvYyBjYWxsYmFjayBmdW5jdGlvbiB3aXRoIHdoYXRldmVyIHNpemUgaXMgb3B0aW1hbC4KQEAgLTc4NCwxMCArODU1LDEwIEBACiAgKiBoYWxmIHRoZSBidWZmZXIgY2FwYWNpdHksIHRvIGFsbG93IGRvdWJsZSBidWZmZXJpbmcuCiAgKgogICogQHBhcmFtIGJ1aWxkZXIgcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCkKLSAqIEBwYXJhbSBudW1GcmFtZXMgdGhlIGRlc2lyZWQgYnVmZmVyIHNpemUgaW4gZnJhbWVzIG9yIEFBVURJT19VTlNQRUNJRklFRAorICogQHBhcmFtIG51bUZyYW1lcyB0aGUgZGVzaXJlZCBidWZmZXIgc2l6ZSBpbiBmcmFtZXMgb3Ige0BsaW5rICNBQVVESU9fVU5TUEVDSUZJRUR9CiAgKi8KIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEZyYW1lc1BlckRhdGFDYWxsYmFjayhBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcykgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBQcm90b3R5cGUgZm9yIHRoZSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGlzIHBhc3NlZCB0bwpAQCAtODQwLDI5ICs5MTEsMjkgQEAKICAqICAgICAgICAgIHRvIHRoZSBjYWxsYmFjayBmdW5jdGlvbnMuCiAgKi8KIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEVycm9yQ2FsbGJhY2soQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBdWRpb1N0cmVhbV9lcnJvckNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlckRhdGEpOworICAgICAgICBBQXVkaW9TdHJlYW1fZXJyb3JDYWxsYmFjayBjYWxsYmFjaywgdm9pZCAqdXNlckRhdGEpIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgogICogT3BlbiBhIHN0cmVhbSBiYXNlZCBvbiB0aGUgb3B0aW9ucyBpbiB0aGUgU3RyZWFtQnVpbGRlci4KICAqCi0gKiBBQXVkaW9TdHJlYW1fY2xvc2UgbXVzdCBiZSBjYWxsZWQgd2hlbiBmaW5pc2hlZCB3aXRoIHRoZSBzdHJlYW0gdG8gcmVjb3ZlcgorICogQUF1ZGlvU3RyZWFtX2Nsb3NlKCkgbXVzdCBiZSBjYWxsZWQgd2hlbiBmaW5pc2hlZCB3aXRoIHRoZSBzdHJlYW0gdG8gcmVjb3ZlcgogICogdGhlIG1lbW9yeSBhbmQgdG8gZnJlZSB0aGUgYXNzb2NpYXRlZCByZXNvdXJjZXMuCiAgKgogICogQHBhcmFtIGJ1aWxkZXIgcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCkKICAqIEBwYXJhbSBzdHJlYW0gcG9pbnRlciB0byBhIHZhcmlhYmxlIHRvIHJlY2VpdmUgdGhlIG5ldyBzdHJlYW0gcmVmZXJlbmNlCi0gKiBAcmV0dXJuIEFBVURJT19PSyBvciBhIG5lZ2F0aXZlIGVycm9yLgorICogQHJldHVybiB7QGxpbmsgI0FBVURJT19PS30gb3IgYSBuZWdhdGl2ZSBlcnJvci4KICAqLwogQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbShBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQXVkaW9TdHJlYW0qKiBzdHJlYW0pOworICAgICAgICBBQXVkaW9TdHJlYW0qKiBzdHJlYW0pIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgogICogRGVsZXRlIHRoZSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBTdHJlYW1CdWlsZGVyLgogICoKICAqIEBwYXJhbSBidWlsZGVyIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigpCi0gKiBAcmV0dXJuIEFBVURJT19PSyBvciBhIG5lZ2F0aXZlIGVycm9yLgorICogQHJldHVybiB7QGxpbmsgI0FBVURJT19PS30gb3IgYSBuZWdhdGl2ZSBlcnJvci4KICAqLwotQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfZGVsZXRlKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIpOworQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfZGVsZXRlKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIpCisgICAgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBTdHJlYW0gQ29udHJvbApAQCAtODcyLDcwICs5NDMsNzQgQEAKICAqIEZyZWUgdGhlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYSBzdHJlYW0gY3JlYXRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICoKICAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCi0gKiBAcmV0dXJuIEFBVURJT19PSyBvciBhIG5lZ2F0aXZlIGVycm9yLgorICogQHJldHVybiB7QGxpbmsgI0FBVURJT19PS30gb3IgYSBuZWdhdGl2ZSBlcnJvci4KICAqLwotQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgIEFBdWRpb1N0cmVhbV9jbG9zZShBQXVkaW9TdHJlYW0qIHN0cmVhbSk7CitBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtX2Nsb3NlKEFBdWRpb1N0cmVhbSogc3RyZWFtKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIEFzeW5jaHJvbm91c2x5IHJlcXVlc3QgdG8gc3RhcnQgcGxheWluZyB0aGUgc3RyZWFtLiBGb3Igb3V0cHV0IHN0cmVhbXMsIG9uZSBzaG91bGQKICAqIHdyaXRlIHRvIHRoZSBzdHJlYW0gdG8gZmlsbCB0aGUgYnVmZmVyIGJlZm9yZSBzdGFydGluZy4KICAqIE90aGVyd2lzZSBpdCB3aWxsIHVuZGVyZmxvdy4KLSAqIEFmdGVyIHRoaXMgY2FsbCB0aGUgc3RhdGUgd2lsbCBiZSBpbiBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJUSU5HIG9yIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRC4KKyAqIEFmdGVyIHRoaXMgY2FsbCB0aGUgc3RhdGUgd2lsbCBiZSBpbiB7QGxpbmsgI0FBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRJTkd9IG9yCisgKiB7QGxpbmsgI0FBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRH0uCiAgKgogICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKLSAqIEByZXR1cm4gQUFVRElPX09LIG9yIGEgbmVnYXRpdmUgZXJyb3IuCisgKiBAcmV0dXJuIHtAbGluayAjQUFVRElPX09LfSBvciBhIG5lZ2F0aXZlIGVycm9yLgogICovCi1BQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChBQXVkaW9TdHJlYW0qIHN0cmVhbSk7CitBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChBQXVkaW9TdHJlYW0qIHN0cmVhbSkgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBBc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgdGhlIHN0cmVhbSB0byBwYXVzZS4KICAqIFBhdXNpbmcgYSBzdHJlYW0gd2lsbCBmcmVlemUgdGhlIGRhdGEgZmxvdyBidXQgbm90IGZsdXNoIGFueSBidWZmZXJzLgotICogVXNlIEFBdWRpb1N0cmVhbV9TdGFydCgpIHRvIHJlc3VtZSBwbGF5YmFjayBhZnRlciBhIHBhdXNlLgotICogQWZ0ZXIgdGhpcyBjYWxsIHRoZSBzdGF0ZSB3aWxsIGJlIGluIEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0lORyBvciBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNFRC4KKyAqIFVzZSBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KCkgdG8gcmVzdW1lIHBsYXliYWNrIGFmdGVyIGEgcGF1c2UuCisgKiBBZnRlciB0aGlzIGNhbGwgdGhlIHN0YXRlIHdpbGwgYmUgaW4ge0BsaW5rICNBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNJTkd9IG9yCisgKiB7QGxpbmsgI0FBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VEfS4KICAqCi0gKiBUaGlzIHdpbGwgcmV0dXJuIEFBVURJT19FUlJPUl9VTklNUExFTUVOVEVEIGZvciBpbnB1dCBzdHJlYW1zLgorICogVGhpcyB3aWxsIHJldHVybiB7QGxpbmsgI0FBVURJT19FUlJPUl9VTklNUExFTUVOVEVEfSBmb3IgaW5wdXQgc3RyZWFtcy4KICAqIEZvciBpbnB1dCBzdHJlYW1zIHVzZSBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoKS4KICAqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQotICogQHJldHVybiBBQVVESU9fT0sgb3IgYSBuZWdhdGl2ZSBlcnJvci4KKyAqIEByZXR1cm4ge0BsaW5rICNBQVVESU9fT0t9IG9yIGEgbmVnYXRpdmUgZXJyb3IuCiAgKi8KLUFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90ICBBQXVkaW9TdHJlYW1fcmVxdWVzdFBhdXNlKEFBdWRpb1N0cmVhbSogc3RyZWFtKTsKK0FBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90ICBBQXVkaW9TdHJlYW1fcmVxdWVzdFBhdXNlKEFBdWRpb1N0cmVhbSogc3RyZWFtKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIEFzeW5jaHJvbm91cyByZXF1ZXN0IGZvciB0aGUgc3RyZWFtIHRvIGZsdXNoLgogICogRmx1c2hpbmcgd2lsbCBkaXNjYXJkIGFueSBwZW5kaW5nIGRhdGEuCiAgKiBUaGlzIGNhbGwgb25seSB3b3JrcyBpZiB0aGUgc3RyZWFtIGlzIHBhdXNpbmcgb3IgcGF1c2VkLiBUT0RPIHJldmlldwogICogRnJhbWUgY291bnRlcnMgYXJlIG5vdCByZXNldCBieSBhIGZsdXNoLiBUaGV5IG1heSBiZSBhZHZhbmNlZC4KLSAqIEFmdGVyIHRoaXMgY2FsbCB0aGUgc3RhdGUgd2lsbCBiZSBpbiBBQVVESU9fU1RSRUFNX1NUQVRFX0ZMVVNISU5HIG9yIEFBVURJT19TVFJFQU1fU1RBVEVfRkxVU0hFRC4KKyAqIEFmdGVyIHRoaXMgY2FsbCB0aGUgc3RhdGUgd2lsbCBiZSBpbiB7QGxpbmsgI0FBVURJT19TVFJFQU1fU1RBVEVfRkxVU0hJTkd9IG9yCisgKiB7QGxpbmsgI0FBVURJT19TVFJFQU1fU1RBVEVfRkxVU0hFRH0uCiAgKgotICogVGhpcyB3aWxsIHJldHVybiBBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRCBmb3IgaW5wdXQgc3RyZWFtcy4KKyAqIFRoaXMgd2lsbCByZXR1cm4ge0BsaW5rICNBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRH0gZm9yIGlucHV0IHN0cmVhbXMuCiAgKgogICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKLSAqIEByZXR1cm4gQUFVRElPX09LIG9yIGEgbmVnYXRpdmUgZXJyb3IuCisgKiBAcmV0dXJuIHtAbGluayAjQUFVRElPX09LfSBvciBhIG5lZ2F0aXZlIGVycm9yLgogICovCi1BQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtX3JlcXVlc3RGbHVzaChBQXVkaW9TdHJlYW0qIHN0cmVhbSk7CitBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtX3JlcXVlc3RGbHVzaChBQXVkaW9TdHJlYW0qIHN0cmVhbSkgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBBc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgdGhlIHN0cmVhbSB0byBzdG9wLgogICogVGhlIHN0cmVhbSB3aWxsIHN0b3AgYWZ0ZXIgYWxsIG9mIHRoZSBkYXRhIGN1cnJlbnRseSBidWZmZXJlZCBoYXMgYmVlbiBwbGF5ZWQuCi0gKiBBZnRlciB0aGlzIGNhbGwgdGhlIHN0YXRlIHdpbGwgYmUgaW4gQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORyBvciBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQRUQuCisgKiBBZnRlciB0aGlzIGNhbGwgdGhlIHN0YXRlIHdpbGwgYmUgaW4ge0BsaW5rICNBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQSU5HfSBvcgorICoge0BsaW5rICNBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQRUR9LgogICoKICAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCi0gKiBAcmV0dXJuIEFBVURJT19PSyBvciBhIG5lZ2F0aXZlIGVycm9yLgorICogQHJldHVybiB7QGxpbmsgI0FBVURJT19PS30gb3IgYSBuZWdhdGl2ZSBlcnJvci4KICAqLwotQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcChBQXVkaW9TdHJlYW0qIHN0cmVhbSk7CitBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKEFBdWRpb1N0cmVhbSogc3RyZWFtKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKLSAqIFF1ZXJ5IHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjbGllbnQsIGVnLiBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNJTkcKKyAqIFF1ZXJ5IHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjbGllbnQsIGVnLiB7QGxpbmsgI0FBVURJT19TVFJFQU1fU1RBVEVfUEFVU0lOR30KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaW1tZWRpYXRlbHkgcmV0dXJuIHRoZSBzdGF0ZSB3aXRob3V0IHVwZGF0aW5nIHRoZSBzdGF0ZS4KICAqIElmIHlvdSB3YW50IHRvIHVwZGF0ZSB0aGUgY2xpZW50IHN0YXRlIGJhc2VkIG9uIHRoZSBzZXJ2ZXIgc3RhdGUgdGhlbgogICogY2FsbCBBQXVkaW9TdHJlYW1fd2FpdEZvclN0YXRlQ2hhbmdlKCkgd2l0aCBjdXJyZW50U3RhdGUKLSAqIHNldCB0byBBQVVESU9fU1RSRUFNX1NUQVRFX1VOS05PV04gYW5kIGEgemVybyB0aW1lb3V0LgorICogc2V0IHRvIHtAbGluayAjQUFVRElPX1NUUkVBTV9TVEFURV9VTktOT1dOfSBhbmQgYSB6ZXJvIHRpbWVvdXQuCiAgKgogICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKICAqLwotQUFVRElPX0FQSSBhYXVkaW9fc3RyZWFtX3N0YXRlX3QgQUF1ZGlvU3RyZWFtX2dldFN0YXRlKEFBdWRpb1N0cmVhbSogc3RyZWFtKTsKK0FBVURJT19BUEkgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IEFBdWRpb1N0cmVhbV9nZXRTdGF0ZShBQXVkaW9TdHJlYW0qIHN0cmVhbSkgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBXYWl0IHVudGlsIHRoZSBjdXJyZW50IHN0YXRlIG5vIGxvbmdlciBtYXRjaGVzIHRoZSBpbnB1dCBzdGF0ZS4KQEAgLTk1NywxMiArMTAzMiwxMSBAQAogICogQHBhcmFtIGlucHV0U3RhdGUgVGhlIHN0YXRlIHdlIHdhbnQgdG8gYXZvaWQuCiAgKiBAcGFyYW0gbmV4dFN0YXRlIFBvaW50ZXIgdG8gYSB2YXJpYWJsZSB0aGF0IHdpbGwgYmUgc2V0IHRvIHRoZSBuZXcgc3RhdGUuCiAgKiBAcGFyYW0gdGltZW91dE5hbm9zZWNvbmRzIE1heGltdW0gbnVtYmVyIG9mIG5hbm9zZWNvbmRzIHRvIHdhaXQgZm9yIGNvbXBsZXRpb24uCi0gKiBAcmV0dXJuIEFBVURJT19PSyBvciBhIG5lZ2F0aXZlIGVycm9yLgorICogQHJldHVybiB7QGxpbmsgI0FBVURJT19PS30gb3IgYSBuZWdhdGl2ZSBlcnJvci4KICAqLwogQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU3RyZWFtX3dhaXRGb3JTdGF0ZUNoYW5nZShBQXVkaW9TdHJlYW0qIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IGlucHV0U3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCAqbmV4dFN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVvdXROYW5vc2Vjb25kcyk7CisgICAgICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBpbnB1dFN0YXRlLCBhYXVkaW9fc3RyZWFtX3N0YXRlX3QgKm5leHRTdGF0ZSwKKyAgICAgICAgaW50NjRfdCB0aW1lb3V0TmFub3NlY29uZHMpIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gU3RyZWFtIEkvTwpAQCAtOTg5LDkgKzEwNjMsNyBAQAogICogQHJldHVybiBUaGUgbnVtYmVyIG9mIGZyYW1lcyBhY3R1YWxseSByZWFkIG9yIGEgbmVnYXRpdmUgZXJyb3IuCiAgKi8KIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1N0cmVhbV9yZWFkKEFBdWRpb1N0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVvdXROYW5vc2Vjb25kcyk7CisgICAgICAgIHZvaWQgKmJ1ZmZlciwgaW50MzJfdCBudW1GcmFtZXMsIGludDY0X3QgdGltZW91dE5hbm9zZWNvbmRzKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIFdyaXRlIGRhdGEgdG8gdGhlIHN0cmVhbS4KQEAgLTEwMTQsOSArMTA4Niw3IEBACiAgKiBAcmV0dXJuIFRoZSBudW1iZXIgb2YgZnJhbWVzIGFjdHVhbGx5IHdyaXR0ZW4gb3IgYSBuZWdhdGl2ZSBlcnJvci4KICAqLwogQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU3RyZWFtX3dyaXRlKEFBdWRpb1N0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVvdXROYW5vc2Vjb25kcyk7CisgICAgICAgIGNvbnN0IHZvaWQgKmJ1ZmZlciwgaW50MzJfdCBudW1GcmFtZXMsIGludDY0X3QgdGltZW91dE5hbm9zZWNvbmRzKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vIFN0cmVhbSAtIHF1ZXJpZXMKQEAgLTEwMzksNyArMTEwOSw3IEBACiAgKiBAcmV0dXJuIGFjdHVhbCBidWZmZXIgc2l6ZSBpbiBmcmFtZXMgb3IgYSBuZWdhdGl2ZSBlcnJvcgogICovCiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TdHJlYW1fc2V0QnVmZmVyU2l6ZUluRnJhbWVzKEFBdWRpb1N0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMpOworICAgICAgICBpbnQzMl90IG51bUZyYW1lcykgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBRdWVyeSB0aGUgbWF4aW11bSBudW1iZXIgb2YgZnJhbWVzIHRoYXQgY2FuIGJlIGZpbGxlZCB3aXRob3V0IGJsb2NraW5nLgpAQCAtMTA0Nyw3ICsxMTE3LDcgQEAKICAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCiAgKiBAcmV0dXJuIGJ1ZmZlciBzaXplIGluIGZyYW1lcy4KICAqLwotQUFVRElPX0FQSSBpbnQzMl90IEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJTaXplSW5GcmFtZXMoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pOworQUFVRElPX0FQSSBpbnQzMl90IEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJTaXplSW5GcmFtZXMoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgogICogUXVlcnkgdGhlIG51bWJlciBvZiBmcmFtZXMgdGhhdCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIHJlYWQgb3Igd3JpdGUgYXQKQEAgLTEwNjIsNyArMTEzMiw3IEBACiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICogQHJldHVybiBidXJzdCBzaXplCiAgKi8KLUFBVURJT19BUEkgaW50MzJfdCBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUGVyQnVyc3QoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pOworQUFVRElPX0FQSSBpbnQzMl90IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNQZXJCdXJzdChBQXVkaW9TdHJlYW0qIHN0cmVhbSkgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBRdWVyeSBtYXhpbXVtIGJ1ZmZlciBjYXBhY2l0eSBpbiBmcmFtZXMuCkBAIC0xMDcwLDcgKzExNDAsNyBAQAogICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKICAqIEByZXR1cm4gIGJ1ZmZlciBjYXBhY2l0eSBpbiBmcmFtZXMKICAqLwotQUFVRElPX0FQSSBpbnQzMl90IEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKEFBdWRpb1N0cmVhbSogc3RyZWFtKTsKK0FBVURJT19BUEkgaW50MzJfdCBBQXVkaW9TdHJlYW1fZ2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyhBQXVkaW9TdHJlYW0qIHN0cmVhbSkgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBRdWVyeSB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHRoYXQgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGRhdGFQcm9jIGNhbGxiYWNrCkBAIC0xMDc5LDE5ICsxMTQ5LDE5IEBACiAgKiBUaGlzIGNhbGwgY2FuIGJlIHVzZWQgaWYgdGhlIGFwcGxpY2F0aW9uIG5lZWRzIHRvIGtub3cgdGhlIHZhbHVlIG9mIG51bUZyYW1lcyBiZWZvcmUKICAqIHRoZSBzdHJlYW0gaXMgc3RhcnRlZC4gVGhpcyBpcyBub3Qgbm9ybWFsbHkgbmVjZXNzYXJ5LgogICoKLSAqIElmIGEgc3BlY2lmaWMgc2l6ZSB3YXMgcmVxdWVzdGVkIGJ5IGNhbGxpbmcgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soKQotICogdGhlbiB0aGlzIHdpbGwgYmUgdGhlIHNhbWUgc2l6ZS4KKyAqIElmIGEgc3BlY2lmaWMgc2l6ZSB3YXMgcmVxdWVzdGVkIGJ5IGNhbGxpbmcKKyAqIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RnJhbWVzUGVyRGF0YUNhbGxiYWNrKCkgdGhlbiB0aGlzIHdpbGwgYmUgdGhlIHNhbWUgc2l6ZS4KICAqCiAgKiBJZiBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEZyYW1lc1BlckRhdGFDYWxsYmFjaygpIHdhcyBub3QgY2FsbGVkIHRoZW4gdGhpcyB3aWxsCi0gKiByZXR1cm4gdGhlIHNpemUgY2hvc2VuIGJ5IEFBdWRpbywgb3IgQUFVRElPX1VOU1BFQ0lGSUVELgorICogcmV0dXJuIHRoZSBzaXplIGNob3NlbiBieSBBQXVkaW8sIG9yIHtAbGluayAjQUFVRElPX1VOU1BFQ0lGSUVEfS4KICAqCi0gKiBBQVVESU9fVU5TUEVDSUZJRUQgaW5kaWNhdGVzIHRoYXQgdGhlIGNhbGxiYWNrIGJ1ZmZlciBzaXplIGZvciB0aGlzIHN0cmVhbQorICoge0BsaW5rICNBQVVESU9fVU5TUEVDSUZJRUR9IGluZGljYXRlcyB0aGF0IHRoZSBjYWxsYmFjayBidWZmZXIgc2l6ZSBmb3IgdGhpcyBzdHJlYW0KICAqIG1heSB2YXJ5IGZyb20gb25lIGRhdGFQcm9jIGNhbGxiYWNrIHRvIHRoZSBuZXh0LgogICoKICAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCi0gKiBAcmV0dXJuIGNhbGxiYWNrIGJ1ZmZlciBzaXplIGluIGZyYW1lcyBvciBBQVVESU9fVU5TUEVDSUZJRUQKKyAqIEByZXR1cm4gY2FsbGJhY2sgYnVmZmVyIHNpemUgaW4gZnJhbWVzIG9yIHtAbGluayAjQUFVRElPX1VOU1BFQ0lGSUVEfQogICovCi1BQVVESU9fQVBJIGludDMyX3QgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1BlckRhdGFDYWxsYmFjayhBQXVkaW9TdHJlYW0qIHN0cmVhbSk7CitBQVVESU9fQVBJIGludDMyX3QgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1BlckRhdGFDYWxsYmFjayhBQXVkaW9TdHJlYW0qIHN0cmVhbSkgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBBbiBYUnVuIGlzIGFuIFVuZGVycnVuIG9yIGFuIE92ZXJydW4uCkBAIC0xMTA4LDEzICsxMTc4LDEzIEBACiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICogQHJldHVybiB0aGUgdW5kZXJydW4gb3Igb3ZlcnJ1biBjb3VudAogICovCi1BQVVESU9fQVBJIGludDMyX3QgQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChBQXVkaW9TdHJlYW0qIHN0cmVhbSk7CitBQVVESU9fQVBJIGludDMyX3QgQUF1ZGlvU3RyZWFtX2dldFhSdW5Db3VudChBQXVkaW9TdHJlYW0qIHN0cmVhbSkgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICogQHJldHVybiBhY3R1YWwgc2FtcGxlIHJhdGUKICAqLwotQUFVRElPX0FQSSBpbnQzMl90IEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVSYXRlKEFBdWRpb1N0cmVhbSogc3RyZWFtKTsKK0FBVURJT19BUEkgaW50MzJfdCBBQXVkaW9TdHJlYW1fZ2V0U2FtcGxlUmF0ZShBQXVkaW9TdHJlYW0qIHN0cmVhbSkgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBBIHN0cmVhbSBoYXMgb25lIG9yIG1vcmUgY2hhbm5lbHMgb2YgZGF0YS4KQEAgLTExMjMsNyArMTE5Myw3IEBACiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICogQHJldHVybiBhY3R1YWwgbnVtYmVyIG9mIGNoYW5uZWxzCiAgKi8KLUFBVURJT19BUEkgaW50MzJfdCBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50KEFBdWRpb1N0cmVhbSogc3RyZWFtKTsKK0FBVURJT19BUEkgaW50MzJfdCBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50KEFBdWRpb1N0cmVhbSogc3RyZWFtKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIElkZW50aWNhbCB0byBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50KCkuCkBAIC0xMTMxLDM5ICsxMjAxLDQxIEBACiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICogQHJldHVybiBhY3R1YWwgbnVtYmVyIG9mIHNhbXBsZXMgZnJhbWUKICAqLwotQUFVRElPX0FQSSBpbnQzMl90IEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVzUGVyRnJhbWUoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pOworQUFVRElPX0FQSSBpbnQzMl90IEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVzUGVyRnJhbWUoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgogICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKICAqIEByZXR1cm4gYWN0dWFsIGRldmljZSBJRAogICovCi1BQVVESU9fQVBJIGludDMyX3QgQUF1ZGlvU3RyZWFtX2dldERldmljZUlkKEFBdWRpb1N0cmVhbSogc3RyZWFtKTsKK0FBVURJT19BUEkgaW50MzJfdCBBQXVkaW9TdHJlYW1fZ2V0RGV2aWNlSWQoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgogICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKICAqIEByZXR1cm4gYWN0dWFsIGRhdGEgZm9ybWF0CiAgKi8KLUFBVURJT19BUEkgYWF1ZGlvX2Zvcm1hdF90IEFBdWRpb1N0cmVhbV9nZXRGb3JtYXQoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pOworQUFVRElPX0FQSSBhYXVkaW9fZm9ybWF0X3QgQUF1ZGlvU3RyZWFtX2dldEZvcm1hdChBQXVkaW9TdHJlYW0qIHN0cmVhbSkgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBQcm92aWRlIGFjdHVhbCBzaGFyaW5nIG1vZGUuCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICogQHJldHVybiAgYWN0dWFsIHNoYXJpbmcgbW9kZQogICovCi1BQVVESU9fQVBJIGFhdWRpb19zaGFyaW5nX21vZGVfdCBBQXVkaW9TdHJlYW1fZ2V0U2hhcmluZ01vZGUoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pOworQUFVRElPX0FQSSBhYXVkaW9fc2hhcmluZ19tb2RlX3QgQUF1ZGlvU3RyZWFtX2dldFNoYXJpbmdNb2RlKEFBdWRpb1N0cmVhbSogc3RyZWFtKQorICAgICAgICBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIEdldCB0aGUgcGVyZm9ybWFuY2UgbW9kZSB1c2VkIGJ5IHRoZSBzdHJlYW0uCiAgKgogICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKICAqLwotQUFVRElPX0FQSSBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IEFBdWRpb1N0cmVhbV9nZXRQZXJmb3JtYW5jZU1vZGUoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pOworQUFVRElPX0FQSSBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IEFBdWRpb1N0cmVhbV9nZXRQZXJmb3JtYW5jZU1vZGUoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCisgICAgICAgIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgogICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKICAqIEByZXR1cm4gZGlyZWN0aW9uCiAgKi8KLUFBVURJT19BUEkgYWF1ZGlvX2RpcmVjdGlvbl90IEFBdWRpb1N0cmVhbV9nZXREaXJlY3Rpb24oQUF1ZGlvU3RyZWFtKiBzdHJlYW0pOworQUFVRElPX0FQSSBhYXVkaW9fZGlyZWN0aW9uX3QgQUF1ZGlvU3RyZWFtX2dldERpcmVjdGlvbihBQXVkaW9TdHJlYW0qIHN0cmVhbSkgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBQYXNzZXMgYmFjayB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0aGF0IGhhdmUgYmVlbiB3cml0dGVuIHNpbmNlIHRoZSBzdHJlYW0gd2FzIGNyZWF0ZWQuCkBAIC0xMTc2LDcgKzEyNDgsNyBAQAogICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKICAqIEByZXR1cm4gZnJhbWVzIHdyaXR0ZW4KICAqLwotQUFVRElPX0FQSSBpbnQ2NF90IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKEFBdWRpb1N0cmVhbSogc3RyZWFtKTsKK0FBVURJT19BUEkgaW50NjRfdCBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbihBQXVkaW9TdHJlYW0qIHN0cmVhbSkgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBQYXNzZXMgYmFjayB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0aGF0IGhhdmUgYmVlbiByZWFkIHNpbmNlIHRoZSBzdHJlYW0gd2FzIGNyZWF0ZWQuCkBAIC0xMTg5LDcgKzEyNjEsNyBAQAogICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKICAqIEByZXR1cm4gZnJhbWVzIHJlYWQKICAqLwotQUFVRElPX0FQSSBpbnQ2NF90IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNSZWFkKEFBdWRpb1N0cmVhbSogc3RyZWFtKTsKK0FBVURJT19BUEkgaW50NjRfdCBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZChBQXVkaW9TdHJlYW0qIHN0cmVhbSkgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBQYXNzZXMgYmFjayB0aGUgc2Vzc2lvbiBJRCBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdHJlYW0uCkBAIC0xMTk3LDM0ICsxMjY5LDM1IEBACiAgKiBUaGUgc2Vzc2lvbiBJRCBjYW4gYmUgdXNlZCB0byBhc3NvY2lhdGUgYSBzdHJlYW0gd2l0aCBlZmZlY3RzIHByb2Nlc3NvcnMuCiAgKiBUaGUgZWZmZWN0cyBhcmUgY29udHJvbGxlZCB1c2luZyB0aGUgQW5kcm9pZCBBdWRpb0VmZmVjdCBKYXZhIEFQSS4KICAqCi0gKiBJZiBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNlc3Npb25JZCgpIHdhcyBjYWxsZWQgd2l0aCBBQVVESU9fU0VTU0lPTl9JRF9BTExPQ0FURQorICogSWYgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTZXNzaW9uSWQoKSB3YXMKKyAqIGNhbGxlZCB3aXRoIHtAbGluayAjQUFVRElPX1NFU1NJT05fSURfQUxMT0NBVEV9CiAgKiB0aGVuIGEgbmV3IHNlc3Npb24gSUQgc2hvdWxkIGJlIGFsbG9jYXRlZCBvbmNlIHdoZW4gdGhlIHN0cmVhbSBpcyBvcGVuZWQuCiAgKgogICogSWYgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTZXNzaW9uSWQoKSB3YXMgY2FsbGVkIHdpdGggYSBwcmV2aW91c2x5IGFsbG9jYXRlZAogICogc2Vzc2lvbiBJRCB0aGVuIHRoYXQgdmFsdWUgc2hvdWxkIGJlIHJldHVybmVkLgogICoKICAqIElmIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2Vzc2lvbklkKCkgd2FzIG5vdCBjYWxsZWQgdGhlbiB0aGlzIGZ1bmN0aW9uIHNob3VsZAotICogcmV0dXJuIEFBVURJT19TRVNTSU9OX0lEX05PTkUuCisgKiByZXR1cm4ge0BsaW5rICNBQVVESU9fU0VTU0lPTl9JRF9OT05FfS4KICAqCiAgKiBUaGUgc2Vzc2lvbklEIGZvciBhIHN0cmVhbSBzaG91bGQgbm90IGNoYW5nZSBvbmNlIHRoZSBzdHJlYW0gaGFzIGJlZW4gb3BlbmVkLgogICoKICAqIEFkZGVkIGluIEFQSSBsZXZlbCAyOC4KICAqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQotICogQHJldHVybiBzZXNzaW9uIElEIG9yIEFBVURJT19TRVNTSU9OX0lEX05PTkUKKyAqIEByZXR1cm4gc2Vzc2lvbiBJRCBvciB7QGxpbmsgI0FBVURJT19TRVNTSU9OX0lEX05PTkV9CiAgKi8KLUFBVURJT19BUEkgYWF1ZGlvX3Nlc3Npb25faWRfdCBBQXVkaW9TdHJlYW1fZ2V0U2Vzc2lvbklkKEFBdWRpb1N0cmVhbSogc3RyZWFtKTsKK0FBVURJT19BUEkgYWF1ZGlvX3Nlc3Npb25faWRfdCBBQXVkaW9TdHJlYW1fZ2V0U2Vzc2lvbklkKEFBdWRpb1N0cmVhbSogc3RyZWFtKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCiAvKioKICAqIFBhc3NlcyBiYWNrIHRoZSB0aW1lIGF0IHdoaWNoIGEgcGFydGljdWxhciBmcmFtZSB3YXMgcHJlc2VudGVkLgogICogVGhpcyBjYW4gYmUgdXNlZCB0byBzeW5jaHJvbml6ZSBhdWRpbyB3aXRoIHZpZGVvIG9yIE1JREkuCiAgKiBJdCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFsaWduIGEgcmVjb3JkZWQgc3RyZWFtIHdpdGggYSBwbGF5YmFjayBzdHJlYW0uCiAgKgotICogVGltZXN0YW1wcyBhcmUgb25seSB2YWxpZCB3aGVuIHRoZSBzdHJlYW0gaXMgaW4gQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVELgotICogQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEUgd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgc3RyZWFtIGlzIG5vdCBzdGFydGVkLgorICogVGltZXN0YW1wcyBhcmUgb25seSB2YWxpZCB3aGVuIHRoZSBzdHJlYW0gaXMgaW4ge0BsaW5rICNBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUR9LgorICoge0BsaW5rICNBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURX0gd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgc3RyZWFtIGlzIG5vdCBzdGFydGVkLgogICogTm90ZSB0aGF0IGJlY2F1c2UgcmVxdWVzdFN0YXJ0KCkgaXMgYXN5bmNocm9ub3VzLCB0aW1lc3RhbXBzIHdpbGwgbm90IGJlIHZhbGlkIHVudGlsCiAgKiBhIHNob3J0IHRpbWUgYWZ0ZXIgY2FsbGluZyByZXF1ZXN0U3RhcnQoKS4KLSAqIFNvIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFIHNob3VsZCBub3QgYmUgY29uc2lkZXJlZCBhIGZhdGFsIGVycm9yLgorICogU28ge0BsaW5rICNBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURX0gc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGEgZmF0YWwgZXJyb3IuCiAgKiBKdXN0IHRyeSBjYWxsaW5nIGFnYWluIGxhdGVyLgogICoKICAqIElmIGFuIGVycm9yIG9jY3VycywgdGhlbiB0aGUgcG9zaXRpb24gYW5kIHRpbWUgd2lsbCBub3QgYmUgbW9kaWZpZWQuCkBAIC0xMjM1LDEyICsxMzA4LDEwIEBACiAgKiBAcGFyYW0gY2xvY2tpZCBDTE9DS19NT05PVE9OSUMgb3IgQ0xPQ0tfQk9PVFRJTUUKICAqIEBwYXJhbSBmcmFtZVBvc2l0aW9uIHBvaW50ZXIgdG8gYSB2YXJpYWJsZSB0byByZWNlaXZlIHRoZSBwb3NpdGlvbgogICogQHBhcmFtIHRpbWVOYW5vc2Vjb25kcyBwb2ludGVyIHRvIGEgdmFyaWFibGUgdG8gcmVjZWl2ZSB0aGUgdGltZQotICogQHJldHVybiBBQVVESU9fT0sgb3IgYSBuZWdhdGl2ZSBlcnJvcgorICogQHJldHVybiB7QGxpbmsgI0FBVURJT19PS30gb3IgYSBuZWdhdGl2ZSBlcnJvcgogICovCiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TdHJlYW1fZ2V0VGltZXN0YW1wKEFBdWRpb1N0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9ja2lkX3QgY2xvY2tpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqZnJhbWVQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zZWNvbmRzKTsKKyAgICAgICAgY2xvY2tpZF90IGNsb2NraWQsIGludDY0X3QgKmZyYW1lUG9zaXRpb24sIGludDY0X3QgKnRpbWVOYW5vc2Vjb25kcykgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBSZXR1cm4gdGhlIHVzZSBjYXNlIGZvciB0aGUgc3RyZWFtLgpAQCAtMTI1MCw3ICsxMzIxLDcgQEAKICAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCiAgKiBAcmV0dXJuIGZyYW1lcyByZWFkCiAgKi8KLUFBVURJT19BUEkgYWF1ZGlvX3VzYWdlX3QgQUF1ZGlvU3RyZWFtX2dldFVzYWdlKEFBdWRpb1N0cmVhbSogc3RyZWFtKTsKK0FBVURJT19BUEkgYWF1ZGlvX3VzYWdlX3QgQUF1ZGlvU3RyZWFtX2dldFVzYWdlKEFBdWRpb1N0cmVhbSogc3RyZWFtKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCiAvKioKICAqIFJldHVybiB0aGUgY29udGVudCB0eXBlIGZvciB0aGUgc3RyZWFtLgpAQCAtMTI1OCw5ICsxMzI5LDEwIEBACiAgKiBBZGRlZCBpbiBBUEkgbGV2ZWwgMjguCiAgKgogICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKLSAqIEByZXR1cm4gY29udGVudCB0eXBlLCBmb3IgZXhhbXBsZSBBQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDCisgKiBAcmV0dXJuIGNvbnRlbnQgdHlwZSwgZm9yIGV4YW1wbGUge0BsaW5rICNBQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDfQogICovCi1BQVVESU9fQVBJIGFhdWRpb19jb250ZW50X3R5cGVfdCBBQXVkaW9TdHJlYW1fZ2V0Q29udGVudFR5cGUoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pOworQUFVRElPX0FQSSBhYXVkaW9fY29udGVudF90eXBlX3QgQUF1ZGlvU3RyZWFtX2dldENvbnRlbnRUeXBlKEFBdWRpb1N0cmVhbSogc3RyZWFtKQorICAgICAgICBfX0lOVFJPRFVDRURfSU4oMjgpOwogCiAvKioKICAqIFJldHVybiB0aGUgaW5wdXQgcHJlc2V0IGZvciB0aGUgc3RyZWFtLgpAQCAtMTI2OCw5ICsxMzQwLDIyIEBACiAgKiBBZGRlZCBpbiBBUEkgbGV2ZWwgMjguCiAgKgogICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKLSAqIEByZXR1cm4gaW5wdXQgcHJlc2V0LCBmb3IgZXhhbXBsZSBBQVVESU9fSU5QVVRfUFJFU0VUX0NBTUNPUkRFUgorICogQHJldHVybiBpbnB1dCBwcmVzZXQsIGZvciBleGFtcGxlIHtAbGluayAjQUFVRElPX0lOUFVUX1BSRVNFVF9DQU1DT1JERVJ9CiAgKi8KLUFBVURJT19BUEkgYWF1ZGlvX2lucHV0X3ByZXNldF90IEFBdWRpb1N0cmVhbV9nZXRJbnB1dFByZXNldChBQXVkaW9TdHJlYW0qIHN0cmVhbSk7CitBQVVESU9fQVBJIGFhdWRpb19pbnB1dF9wcmVzZXRfdCBBQXVkaW9TdHJlYW1fZ2V0SW5wdXRQcmVzZXQoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCisgICAgICAgIF9fSU5UUk9EVUNFRF9JTigyOCk7CisKKy8qKgorICogUmV0dXJuIHRoZSBwb2xpY3kgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGF1ZGlvIG1heSBvciBtYXkgbm90IGJlIGNhcHR1cmVkCisgKiBieSBvdGhlciBhcHBzIG9yIHRoZSBzeXN0ZW0uCisgKgorICogQWRkZWQgaW4gQVBJIGxldmVsIDI5LgorICoKKyAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCisgKiBAcmV0dXJuIHRoZSBhbGxvd2VkIGNhcHR1cmUgcG9saWN5LCBmb3IgZXhhbXBsZSB7QGxpbmsgI0FBVURJT19BTExPV19DQVBUVVJFX0JZX0FMTH0KKyAqLworQUFVRElPX0FQSSBhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV90IEFBdWRpb1N0cmVhbV9nZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSgKKyAgICAgICAgQUF1ZGlvU3RyZWFtKiBzdHJlYW0pIF9fSU5UUk9EVUNFRF9JTigyOSk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2xpYmFhdWRpby5tYXAudHh0IGIvbWVkaWEvbGliYWF1ZGlvL2xpYmFhdWRpby5tYXAudHh0CmluZGV4IGNiZjU5MjEuLmE4N2VkZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9saWJhYXVkaW8ubWFwLnR4dAorKysgYi9tZWRpYS9saWJhYXVkaW8vbGliYWF1ZGlvLm1hcC50eHQKQEAgLTIwLDYgKzIwLDcgQEAKICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFVzYWdlOyAgICAgICAjIGludHJvZHVjZWQ9MjgKICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENvbnRlbnRUeXBlOyAjIGludHJvZHVjZWQ9MjgKICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldElucHV0UHJlc2V0OyAjIGludHJvZHVjZWQ9MjgKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEFsbG93ZWRDYXB0dXJlUG9saWN5OyAjIGludHJvZHVjZWQ9MjkKICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNlc3Npb25JZDsgICAjIGludHJvZHVjZWQ9MjgKICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW07CiAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9kZWxldGU7CkBAIC00OSw2ICs1MCw3IEBACiAgICAgQUF1ZGlvU3RyZWFtX2dldFVzYWdlOyAgICAgICAjIGludHJvZHVjZWQ9MjgKICAgICBBQXVkaW9TdHJlYW1fZ2V0Q29udGVudFR5cGU7ICMgaW50cm9kdWNlZD0yOAogICAgIEFBdWRpb1N0cmVhbV9nZXRJbnB1dFByZXNldDsgIyBpbnRyb2R1Y2VkPTI4CisgICAgQUF1ZGlvU3RyZWFtX2dldEFsbG93ZWRDYXB0dXJlUG9saWN5OyAjIGludHJvZHVjZWQ9MjkKICAgICBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzV3JpdHRlbjsKICAgICBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUmVhZDsKICAgICBBQXVkaW9TdHJlYW1fZ2V0U2Vzc2lvbklkOyAgICMgaW50cm9kdWNlZD0yOApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9BbmRyb2lkLmJwCmluZGV4IGI5ZTI4YTAuLjQwOTAyODYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL0FuZHJvaWQuYnAKQEAgLTYsNiArNiw3IEBACiAgICAgICAgICJjbGllbnQiLAogICAgICAgICAiY29yZSIsCiAgICAgICAgICJmaWZvIiwKKyAgICAgICAgImZsb3dncmFwaCIsCiAgICAgICAgICJsZWdhY3kiLAogICAgICAgICAidXRpbGl0eSIsCiAgICAgXSwKQEAgLTI1LDkgKzI2LDkgQEAKICAgICAgICAgInV0aWxpdHkvRml4ZWRCbG9ja0FkYXB0ZXIuY3BwIiwKICAgICAgICAgInV0aWxpdHkvRml4ZWRCbG9ja1JlYWRlci5jcHAiLAogICAgICAgICAidXRpbGl0eS9GaXhlZEJsb2NrV3JpdGVyLmNwcCIsCi0gICAgICAgICJ1dGlsaXR5L0xpbmVhclJhbXAuY3BwIiwKICAgICAgICAgImZpZm8vRmlmb0J1ZmZlci5jcHAiLAogICAgICAgICAiZmlmby9GaWZvQ29udHJvbGxlckJhc2UuY3BwIiwKKyAgICAgICAgImNsaWVudC9BQXVkaW9GbG93R3JhcGguY3BwIiwKICAgICAgICAgImNsaWVudC9BdWRpb0VuZHBvaW50LmNwcCIsCiAgICAgICAgICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAiLAogICAgICAgICAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcCIsCkBAIC00Miw2ICs0MywxNiBAQAogICAgICAgICAiYmluZGluZy9SaW5nQnVmZmVyUGFyY2VsYWJsZS5jcHAiLAogICAgICAgICAiYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcCIsCiAgICAgICAgICJiaW5kaW5nL1NoYXJlZFJlZ2lvblBhcmNlbGFibGUuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9DbGlwVG9SYW5nZS5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvUmFtcExpbmVhci5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL1NpbmtGbG9hdC5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL1NpbmtJMTYuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9TaW5rSTI0LmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvU291cmNlRmxvYXQuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9Tb3VyY2VJMTYuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9Tb3VyY2VJMjQuY3BwIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9CaW5kZXJDbGllbnQuY3BwCmluZGV4IGRkNjIwZTMuLjdiMGQzMWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9CaW5kZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9CaW5kZXJDbGllbnQuY3BwCkBAIC05Nyw4ICs5Nyw3IEBACiAgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYmluZGVyLT5saW5rVG9EZWF0aChtQUF1ZGlvQ2xpZW50KTsKICAgICAgICAgICAgICAgICAvLyBUT0RPIHJldmlldyB3aGF0IHdlIHNob3VsZCBkbyBpZiB0aGlzIGZhaWxzCiAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0QUF1ZGlvU2VydmljZTogbGlua1RvRGVhdGgobUFBdWRpb0NsaWVudCA9ICVwKSByZXR1cm5lZCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1BQXVkaW9DbGllbnQuZ2V0KCksIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlcygpIC0gbGlua1RvRGVhdGgoKSByZXR1cm5lZCAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtQUF1ZGlvU2VydmljZSA9IGludGVyZmFjZV9jYXN0PElBQXVkaW9TZXJ2aWNlPihiaW5kZXIpOwogICAgICAgICAgICAgICAgIG5lZWRUb1JlZ2lzdGVyID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmNwcAppbmRleCA5NTlkYjYxLi5hOTg3ZmFiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uY3BwCkBAIC0xNCw2ICsxNCwxMCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2RlZmluZSBMT0dfVEFHICJBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKICNpbmNsdWRlIDxzeXMvbW1hbi5oPgpAQCAtMzYsNiArNDAsNyBAQAogCiBzdGF0dXNfdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzOworCiAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKGdldERldmljZUlkKCkpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKGdldFNhbXBsZVJhdGUoKSk7CkBAIC00Niw2ICs1MSw3IEBACiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoKGludDMyX3QpIGdldEZvcm1hdCgpKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOworCiAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KSBnZXREaXJlY3Rpb24oKSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CkBAIC01NiwxMSArNjIsMTMgQEAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMigoaW50MzJfdCkgZ2V0SW5wdXRQcmVzZXQoKSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKKyAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoKGludDMyX3QpIGdldEFsbG93ZWRDYXB0dXJlUG9saWN5KCkpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKGdldFNlc3Npb25JZCgpKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIHJldHVybiBOT19FUlJPUjsKIGVycm9yOgotICAgIEFMT0dFKCJBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLndyaXRlVG9QYXJjZWwoKTogd3JpdGUgZmFpbGVkID0gJWQiLCBzdGF0dXMpOworICAgIEFMT0dFKCIlcygpOiB3cml0ZSBmYWlsZWQgPSAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTgwLDcgKzg4LDggQEAKICAgICBzZXRTaGFyaW5nTW9kZSgoYWF1ZGlvX3NoYXJpbmdfbW9kZV90KSB2YWx1ZSk7CiAgICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnZhbHVlKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwotICAgIHNldEZvcm1hdCgoYWF1ZGlvX2Zvcm1hdF90KSB2YWx1ZSk7CisgICAgc2V0Rm9ybWF0KChhdWRpb19mb3JtYXRfdCkgdmFsdWUpOworCiAgICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnZhbHVlKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIHNldERpcmVjdGlvbigoYWF1ZGlvX2RpcmVjdGlvbl90KSB2YWx1ZSk7CkBAIC05OCw5ICsxMDcsMTMgQEAKICAgICBzZXRJbnB1dFByZXNldCgoYWF1ZGlvX2lucHV0X3ByZXNldF90KSB2YWx1ZSk7CiAgICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnZhbHVlKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOworICAgIHNldEFsbG93ZWRDYXB0dXJlUG9saWN5KChhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV90KSB2YWx1ZSk7CisgICAgc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJnZhbHVlKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIHNldFNlc3Npb25JZCh2YWx1ZSk7CisKICAgICByZXR1cm4gTk9fRVJST1I7CiBlcnJvcjoKLSAgICBBTE9HRSgiQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5yZWFkRnJvbVBhcmNlbCgpOiByZWFkIGZhaWxlZCA9ICVkIiwgc3RhdHVzKTsKKyAgICBBTE9HRSgiJXMoKTogcmVhZCBmYWlsZWQgPSAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogICAgIHJldHVybiBzdGF0dXM7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvSUFBdWRpb1NlcnZpY2UuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmNwcAppbmRleCA2MjBlZGM3Li45N2FkMmIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvSUFBdWRpb1NlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9JQUF1ZGlvU2VydmljZS5jcHAKQEAgLTcyLDcgKzcyLDYgQEAKICAgICAgICAgICAgIEFMT0dFKCJCcEFBdWRpb1NlcnZpY2U6OmNsaWVudCB0cmFuc2FjdChPUEVOX1NUUkVBTSkgcmVhZEludCAlZCIsIGVycik7CiAgICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0gPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQnBBQXVkaW9TZXJ2aWNlOjpjbGllbnQgT1BFTl9TVFJFQU0gcGFzc2VkIHN0cmVhbSAlZCIsIHN0cmVhbSk7CiAgICAgICAgICAgICByZXR1cm4gc3RyZWFtOwogICAgICAgICB9CiAgICAgICAgIGVyciA9IGNvbmZpZ3VyYXRpb25PdXRwdXQucmVhZEZyb21QYXJjZWwoJnJlcGx5KTsKQEAgLTI1Miw4ICsyNTEsMTUgQEAKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQUF1ZGlvU2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc3A8SUFBdWRpb0NsaWVudD4gY2xpZW50ID0gaW50ZXJmYWNlX2Nhc3Q8SUFBdWRpb0NsaWVudD4oCiAgICAgICAgICAgICAgICAgICAgIGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICAgICAgICAgIHJlZ2lzdGVyQ2xpZW50KGNsaWVudCk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICAvLyByZWFkU3Ryb25nQmluZGVyKCkgY2FuIHJldHVybiBudWxsCisgICAgICAgICAgICBpZiAoY2xpZW50LmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQm5BQXVkaW9TZXJ2aWNlOjolcyhSRUdJU1RFUl9DTElFTlQpIGNsaWVudCBpcyBOVUxMISIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjExNjIzMDQ1MyIpOworICAgICAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVnaXN0ZXJDbGllbnQoY2xpZW50KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgY2FzZSBPUEVOX1NUUkVBTTogewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwCmluZGV4IDBiMGNmNzcuLmI2ZTg0NzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5jcHAKQEAgLTQzLDcgKzQzLDcgQEAKIAogdm9pZCBTaGFyZWRNZW1vcnlQYXJjZWxhYmxlOjpzZXR1cChjb25zdCB1bmlxdWVfZmQmIGZkLCBpbnQzMl90IHNpemVJbkJ5dGVzKSB7CiAgICAgbUZkLnJlc2V0KGR1cChmZC5nZXQoKSkpOyAvLyBzdG9yZSBhIGR1cGxpY2F0ZSBmZAotICAgIEFMT0dWKCJzZXR1cCglZCAtPiAlZCwgJWQpIHRoaXMgPSAlcFxuIiwgZmQuZ2V0KCksIG1GZC5nZXQoKSwgc2l6ZUluQnl0ZXMsIHRoaXMpOworICAgIEFMT0dWKCJzZXR1cChmZCA9ICVkIC0+ICVkLCBzaXplID0gJWQpIHRoaXMgPSAlcFxuIiwgZmQuZ2V0KCksIG1GZC5nZXQoKSwgc2l6ZUluQnl0ZXMsIHRoaXMpOwogICAgIG1TaXplSW5CeXRlcyA9IHNpemVJbkJ5dGVzOwogfQogCkBAIC0xMDQsNyArMTA0LDggQEAKICAgICBtUmVzb2x2ZWRBZGRyZXNzID0gKHVpbnQ4X3QgKikgbW1hcCgwLCBtU2l6ZUluQnl0ZXMsIFBST1RfUkVBRCB8IFBST1RfV1JJVEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFQX1NIQVJFRCwgZmQuZ2V0KCksIDApOwogICAgIGlmIChtUmVzb2x2ZWRBZGRyZXNzID09IE1NQVBfVU5SRVNPTFZFRF9BRERSRVNTKSB7Ci0gICAgICAgIEFMT0dFKCJtbWFwKCkgZmFpbGVkIGZvciBmZCA9ICVkLCBlcnJubyA9ICVzIiwgZmQuZ2V0KCksIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgIEFMT0dFKCJtbWFwKCkgZmFpbGVkIGZvciBmZCA9ICVkLCBuQnl0ZXMgPSAlZCwgZXJybm8gPSAlcyIsCisgICAgICAgICAgICAgIGZkLmdldCgpLCBtU2l6ZUluQnl0ZXMsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7CiAgICAgfQogICAgIHJldHVybiBBQVVESU9fT0s7CkBAIC0xNTYsNSArMTU3LDQgQEAKIHZvaWQgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZTo6ZHVtcCgpIHsKICAgICBBTE9HRCgibUZkID0gJWQiLCBtRmQuZ2V0KCkpOwogICAgIEFMT0dEKCJtU2l6ZUluQnl0ZXMgPSAlZCIsIG1TaXplSW5CeXRlcyk7Ci0gICAgQUxPR0QoIm1SZXNvbHZlZEFkZHJlc3MgPSAlcCIsIG1SZXNvbHZlZEFkZHJlc3MpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmgKaW5kZXggODJjMjI0MC4uNGVjMzhjNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5oCkBAIC03MCw4ICs3MCw4IEBACiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc29sdmVTaGFyZWRNZW1vcnkoY29uc3QgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkJiBmZCk7CiAKICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgICBtRmQ7Ci0gICAgaW50MzJfdCAgICAgbVNpemVJbkJ5dGVzID0gMDsKLSAgICB1aW50OF90ICAgICptUmVzb2x2ZWRBZGRyZXNzID0gTU1BUF9VTlJFU09MVkVEX0FERFJFU1M7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgbVNpemVJbkJ5dGVzID0gMDsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgICAgICptUmVzb2x2ZWRBZGRyZXNzID0gTU1BUF9VTlJFU09MVkVEX0FERFJFU1M7CiAKIHByaXZhdGU6CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMmM0ODgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguY3BwCkBAIC0wLDAgKzEsMTE2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBQXVkaW9GbG93R3JhcGgiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJBQXVkaW9GbG93R3JhcGguaCIKKworI2luY2x1ZGUgPGZsb3dncmFwaC9DbGlwVG9SYW5nZS5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9SYW1wTGluZWFyLmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL1NpbmtGbG9hdC5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9TaW5rSTE2Lmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL1NpbmtJMjQuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvU291cmNlRmxvYXQuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvU291cmNlSTE2Lmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL1NvdXJjZUkyNC5oPgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvRmxvd0dyYXBoOjpjb25maWd1cmUoYXVkaW9fZm9ybWF0X3Qgc291cmNlRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNvdXJjZUNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3Qgc2lua0Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzaW5rQ2hhbm5lbENvdW50KSB7CisgICAgQXVkaW9GbG9hdE91dHB1dFBvcnQgKmxhc3RPdXRwdXQgPSBudWxscHRyOworCisgICAgQUxPR1YoIiVzKCkgc291cmNlIGZvcm1hdCA9IDB4JTA4eCwgY2hhbm5lbHMgPSAlZCwgc2luayBmb3JtYXQgPSAweCUwOHgsIGNoYW5uZWxzID0gJWQiLAorICAgICAgICAgIF9fZnVuY19fLCBzb3VyY2VGb3JtYXQsIHNvdXJjZUNoYW5uZWxDb3VudCwgc2lua0Zvcm1hdCwgc2lua0NoYW5uZWxDb3VudCk7CisKKyAgICBzd2l0Y2ggKHNvdXJjZUZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICBtU291cmNlID0gc3RkOjptYWtlX3VuaXF1ZTxTb3VyY2VGbG9hdD4oc291cmNlQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICAgICAgbVNvdXJjZSA9IHN0ZDo6bWFrZV91bmlxdWU8U291cmNlSTE2Pihzb3VyY2VDaGFubmVsQ291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEOgorICAgICAgICAgICAgbVNvdXJjZSA9IHN0ZDo6bWFrZV91bmlxdWU8U291cmNlSTI0Pihzb3VyY2VDaGFubmVsQ291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vIFRPRE8gYWRkIEkzMgorICAgICAgICAgICAgQUxPR0UoIiVzKCkgVW5zdXBwb3J0ZWQgc291cmNlIGZvcm1hdCA9ICVkIiwgX19mdW5jX18sIHNvdXJjZUZvcm1hdCk7CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOSU1QTEVNRU5URUQ7CisgICAgfQorICAgIGxhc3RPdXRwdXQgPSAmbVNvdXJjZS0+b3V0cHV0OworCisgICAgLy8gQXBwbHkgdm9sdW1lIGFzIGEgcmFtcCB0byBhdm9pZCBwb3BzLgorICAgIG1Wb2x1bWVSYW1wID0gc3RkOjptYWtlX3VuaXF1ZTxSYW1wTGluZWFyPihzb3VyY2VDaGFubmVsQ291bnQpOworICAgIGxhc3RPdXRwdXQtPmNvbm5lY3QoJm1Wb2x1bWVSYW1wLT5pbnB1dCk7CisgICAgbGFzdE91dHB1dCA9ICZtVm9sdW1lUmFtcC0+b3V0cHV0OworCisgICAgLy8gRm9yIGEgcHVyZSBmbG9hdCBncmFwaCwgdGhlcmUgaXMgY2hhbmNlIHRoYXQgdGhlIGRhdGEgcmFuZ2UgbWF5IGJlIHZlcnkgbGFyZ2UuCisgICAgLy8gU28gd2Ugc2hvdWxkIGNsaXAgdG8gYSByZWFzb25hYmxlIHZhbHVlIHRoYXQgYWxsb3dzIGEgbGl0dGxlIGhlYWRyb29tLgorICAgIGlmIChzb3VyY2VGb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCAmJiBzaW5rRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICAgICAgbUNsaXBwZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPENsaXBUb1JhbmdlPihzb3VyY2VDaGFubmVsQ291bnQpOworICAgICAgICBsYXN0T3V0cHV0LT5jb25uZWN0KCZtQ2xpcHBlci0+aW5wdXQpOworICAgICAgICBsYXN0T3V0cHV0ID0gJm1DbGlwcGVyLT5vdXRwdXQ7CisgICAgfQorCisgICAgLy8gRXhwYW5kIHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgaWYgcmVxdWlyZWQuCisgICAgaWYgKHNvdXJjZUNoYW5uZWxDb3VudCA9PSAxICYmIHNpbmtDaGFubmVsQ291bnQgPiAxKSB7CisgICAgICAgIG1DaGFubmVsQ29udmVydGVyID0gc3RkOjptYWtlX3VuaXF1ZTxNb25vVG9NdWx0aUNvbnZlcnRlcj4oc2lua0NoYW5uZWxDb3VudCk7CisgICAgICAgIGxhc3RPdXRwdXQtPmNvbm5lY3QoJm1DaGFubmVsQ29udmVydGVyLT5pbnB1dCk7CisgICAgICAgIGxhc3RPdXRwdXQgPSAmbUNoYW5uZWxDb252ZXJ0ZXItPm91dHB1dDsKKyAgICB9IGVsc2UgaWYgKHNvdXJjZUNoYW5uZWxDb3VudCAhPSBzaW5rQ2hhbm5lbENvdW50KSB7CisgICAgICAgIEFMT0dFKCIlcygpIENoYW5uZWwgcmVkdWN0aW9uIG5vdCBzdXBwb3J0ZWQuIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOSU1QTEVNRU5URUQ7CisgICAgfQorCisgICAgc3dpdGNoIChzaW5rRm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIG1TaW5rID0gc3RkOjptYWtlX3VuaXF1ZTxTaW5rRmxvYXQ+KHNpbmtDaGFubmVsQ291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICBtU2luayA9IHN0ZDo6bWFrZV91bmlxdWU8U2lua0kxNj4oc2lua0NoYW5uZWxDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQ6CisgICAgICAgICAgICBtU2luayA9IHN0ZDo6bWFrZV91bmlxdWU8U2lua0kyND4oc2lua0NoYW5uZWxDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogLy8gVE9ETyBhZGQgSTMyCisgICAgICAgICAgICBBTE9HRSgiJXMoKSBVbnN1cHBvcnRlZCBzaW5rIGZvcm1hdCA9ICVkIiwgX19mdW5jX18sIHNpbmtGb3JtYXQpOworICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTklNUExFTUVOVEVEOworICAgIH0KKyAgICBsYXN0T3V0cHV0LT5jb25uZWN0KCZtU2luay0+aW5wdXQpOworCisgICAgcmV0dXJuIEFBVURJT19PSzsKK30KKwordm9pZCBBQXVkaW9GbG93R3JhcGg6OnByb2Nlc3MoY29uc3Qgdm9pZCAqc291cmNlLCB2b2lkICpkZXN0aW5hdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBtU291cmNlLT5zZXREYXRhKHNvdXJjZSwgbnVtRnJhbWVzKTsKKyAgICBtU2luay0+cmVhZChkZXN0aW5hdGlvbiwgbnVtRnJhbWVzKTsKK30KKworLyoqCisgKiBAcGFyYW0gdm9sdW1lIGJldHdlZW4gMC4wIGFuZCAxLjAKKyAqLwordm9pZCBBQXVkaW9GbG93R3JhcGg6OnNldFRhcmdldFZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgICBtVm9sdW1lUmFtcC0+c2V0VGFyZ2V0KHZvbHVtZSk7Cit9CisKK3ZvaWQgQUF1ZGlvRmxvd0dyYXBoOjpzZXRSYW1wTGVuZ3RoSW5GcmFtZXMoaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBtVm9sdW1lUmFtcC0+c2V0TGVuZ3RoSW5GcmFtZXMobnVtRnJhbWVzKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5ZjY0ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQUFVRElPX0ZMT1dfR1JBUEhfSAorI2RlZmluZSBBTkRST0lEX0FBVURJT19GTE9XX0dSQVBIX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvUmFtcExpbmVhci5oPgorCitjbGFzcyBBQXVkaW9GbG93R3JhcGggeworcHVibGljOgorICAgIC8qKiBDb25uZWN0IHNldmVyYWwgbW9kdWxlcyB0b2dldGhlciB0byBjb252ZXJ0IGZyb20gc291cmNlIHRvIHNpbmsuCisgICAgICogVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgb25jZSBmb3IgZWFjaCBpbnN0YW5jZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBzb3VyY2VGb3JtYXQKKyAgICAgKiBAcGFyYW0gc291cmNlQ2hhbm5lbENvdW50CisgICAgICogQHBhcmFtIHNpbmtGb3JtYXQKKyAgICAgKiBAcGFyYW0gc2lua0NoYW5uZWxDb3VudAorICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBhYXVkaW9fcmVzdWx0X3QgY29uZmlndXJlKGF1ZGlvX2Zvcm1hdF90IHNvdXJjZUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc291cmNlQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3Qgc2lua0Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2lua0NoYW5uZWxDb3VudCk7CisKKyAgICB2b2lkIHByb2Nlc3MoY29uc3Qgdm9pZCAqc291cmNlLCB2b2lkICpkZXN0aW5hdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpOworCisgICAgLyoqCisgICAgICogQHBhcmFtIHZvbHVtZSBiZXR3ZWVuIDAuMCBhbmQgMS4wCisgICAgICovCisgICAgdm9pZCBzZXRUYXJnZXRWb2x1bWUoZmxvYXQgdm9sdW1lKTsKKworICAgIHZvaWQgc2V0UmFtcExlbmd0aEluRnJhbWVzKGludDMyX3QgbnVtRnJhbWVzKTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Zmxvd2dyYXBoOjpBdWRpb1NvdXJjZT4gICAgICAgICAgbVNvdXJjZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Zmxvd2dyYXBoOjpSYW1wTGluZWFyPiAgICAgICAgICAgbVZvbHVtZVJhbXA7CisgICAgc3RkOjp1bmlxdWVfcHRyPGZsb3dncmFwaDo6Q2xpcFRvUmFuZ2U+ICAgICAgICAgIG1DbGlwcGVyOworICAgIHN0ZDo6dW5pcXVlX3B0cjxmbG93Z3JhcGg6Ok1vbm9Ub011bHRpQ29udmVydGVyPiBtQ2hhbm5lbENvbnZlcnRlcjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Zmxvd2dyYXBoOjpBdWRpb1Npbms+ICAgICAgICAgICAgbVNpbms7Cit9OworCisKKyNlbmRpZiAvL0FORFJPSURfQUFVRElPX0ZMT1dfR1JBUEhfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9FbmRwb2ludC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmNwcAppbmRleCBmOGUzNGQxLi4yMTRmODg4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb0VuZHBvaW50LmNwcApAQCAtMTk2LDcgKzE5Niw3IEBACiAKIGludDMyX3QgQXVkaW9FbmRwb2ludDo6Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKQogewotICAgIHJldHVybiBtRGF0YVF1ZXVlLT5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKKyAgICByZXR1cm4gbURhdGFRdWV1ZS0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKIH0KIAogaW50MzJfdCBBdWRpb0VuZHBvaW50OjpnZXRGdWxsRnJhbWVzQXZhaWxhYmxlKFdyYXBwaW5nQnVmZmVyICp3cmFwcGluZ0J1ZmZlcikKQEAgLTIwNiwxNSArMjA2LDE1IEBACiAKIGludDMyX3QgQXVkaW9FbmRwb2ludDo6Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpCiB7Ci0gICAgcmV0dXJuIG1EYXRhUXVldWUtPmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CisgICAgcmV0dXJuIG1EYXRhUXVldWUtPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKIH0KIAogdm9pZCBBdWRpb0VuZHBvaW50OjphZHZhbmNlV3JpdGVJbmRleChpbnQzMl90IGRlbHRhRnJhbWVzKSB7Ci0gICAgbURhdGFRdWV1ZS0+Z2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmFkdmFuY2VXcml0ZUluZGV4KGRlbHRhRnJhbWVzKTsKKyAgICBtRGF0YVF1ZXVlLT5hZHZhbmNlV3JpdGVJbmRleChkZWx0YUZyYW1lcyk7CiB9CiAKIHZvaWQgQXVkaW9FbmRwb2ludDo6YWR2YW5jZVJlYWRJbmRleChpbnQzMl90IGRlbHRhRnJhbWVzKSB7Ci0gICAgbURhdGFRdWV1ZS0+Z2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmFkdmFuY2VSZWFkSW5kZXgoZGVsdGFGcmFtZXMpOworICAgIG1EYXRhUXVldWUtPmFkdmFuY2VSZWFkSW5kZXgoZGVsdGFGcmFtZXMpOwogfQogCiB2b2lkIEF1ZGlvRW5kcG9pbnQ6OnNldERhdGFSZWFkQ291bnRlcihmaWZvX2NvdW50ZXJfdCBmcmFtZXNSZWFkKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcAppbmRleCA5MjA0ODI0Li5jN2U4MDg4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmNwcApAQCAtMzksNyArMzksNiBAQAogI2luY2x1ZGUgImNvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmgiCiAjaW5jbHVkZSAiZmlmby9GaWZvQnVmZmVyLmgiCiAjaW5jbHVkZSAidXRpbGl0eS9BdWRpb0Nsb2NrLmgiCi0jaW5jbHVkZSAidXRpbGl0eS9MaW5lYXJSYW1wLmgiCiAKICNpbmNsdWRlICJBdWRpb1N0cmVhbUludGVybmFsLmgiCiAKQEAgLTYzLDcgKzYyLDcgQEAKICAgICAgICAgLCBtU2VydmljZVN0cmVhbUhhbmRsZShBQVVESU9fSEFORExFX0lOVkFMSUQpCiAgICAgICAgICwgbUluU2VydmljZShpblNlcnZpY2UpCiAgICAgICAgICwgbVNlcnZpY2VJbnRlcmZhY2Uoc2VydmljZUludGVyZmFjZSkKLSAgICAgICAgLCBtQXRvbWljVGltZXN0YW1wKCkKKyAgICAgICAgLCBtQXRvbWljSW50ZXJuYWxUaW1lc3RhbXAoKQogICAgICAgICAsIG1XYWtldXBEZWxheU5hbm9zKEFBdWRpb1Byb3BlcnR5X2dldFdha2V1cERlbGF5TWljcm9zKCkgKiBBQVVESU9fTkFOT1NfUEVSX01JQ1JPU0VDT05EKQogICAgICAgICAsIG1NaW5pbXVtU2xlZXBOYW5vcyhBQXVkaW9Qcm9wZXJ0eV9nZXRNaW5pbXVtU2xlZXBNaWNyb3MoKSAqIEFBVURJT19OQU5PU19QRVJfTUlDUk9TRUNPTkQpCiAgICAgICAgIHsKQEAgLTc3LDYgKzc2LDcgQEAKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwogICAgIGludDMyX3QgY2FwYWNpdHk7CiAgICAgaW50MzJfdCBmcmFtZXNQZXJCdXJzdDsKKyAgICBpbnQzMl90IGZyYW1lc1BlckhhcmR3YXJlQnVyc3Q7CiAgICAgQUF1ZGlvU3RyZWFtUmVxdWVzdCByZXF1ZXN0OwogICAgIEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbk91dHB1dDsKIApAQCAtOTEsMTIgKzkxLDE1IEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCisgICAgY29uc3QgaW50MzJfdCBidXJzdE1pbk1pY3JvcyA9IEFBdWRpb1Byb3BlcnR5X2dldEhhcmR3YXJlQnVyc3RNaW5NaWNyb3MoKTsKKyAgICBpbnQzMl90IGJ1cnN0TWljcm9zID0gMDsKKwogICAgIC8vIFdlIGhhdmUgdG8gZG8gdm9sdW1lIHNjYWxpbmcuIFNvIHdlIHByZWZlciBGTE9BVCBmb3JtYXQuCi0gICAgaWYgKGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgc2V0Rm9ybWF0KEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKKyAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKKyAgICAgICAgc2V0Rm9ybWF0KEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOwogICAgIH0KICAgICAvLyBSZXF1ZXN0IEZMT0FUIGZvciB0aGUgc2hhcmVkIG1peGVyLgotICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldEZvcm1hdChBQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CisgICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0Rm9ybWF0KEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOwogCiAgICAgLy8gQnVpbGQgdGhlIHJlcXVlc3QgdG8gc2VuZCB0byB0aGUgc2VydmVyLgogICAgIHJlcXVlc3Quc2V0VXNlcklkKGdldHVpZCgpKTsKQEAgLTEyNiwxMyArMTI5LDEyIEBACiAgICAgICAgIC8vIGlmIHRoYXQgZmFpbGVkIHRoZW4gdHJ5IHN3aXRjaGluZyBmcm9tIG1vbm8gdG8gc3RlcmVvIGlmIE9VVFBVVC4KICAgICAgICAgLy8gT25seSBkbyB0aGlzIGluIHRoZSBjbGllbnQuIE90aGVyd2lzZSB3ZSBlbmQgdXAgd2l0aCBhIG1vbm8gbWl4ZXIgaW4gdGhlIHNlcnZpY2UKICAgICAgICAgLy8gdGhhdCB3cml0ZXMgdG8gYSBzdGVyZW8gTU1BUCBzdHJlYW0uCi0gICAgICAgIEFMT0dEKCIlcyAtIG9wZW5TdHJlYW0oKSByZXR1cm5lZCAlZCwgdHJ5IHN3aXRjaGluZyBmcm9tIE1PTk8gdG8gU1RFUkVPIiwKKyAgICAgICAgQUxPR0QoIiVzKCkgLSBvcGVuU3RyZWFtKCkgcmV0dXJuZWQgJWQsIHRyeSBzd2l0Y2hpbmcgZnJvbSBNT05PIHRvIFNURVJFTyIsCiAgICAgICAgICAgICAgIF9fZnVuY19fLCBtU2VydmljZVN0cmVhbUhhbmRsZSk7CiAgICAgICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldFNhbXBsZXNQZXJGcmFtZSgyKTsgLy8gc3RlcmVvCiAgICAgICAgIG1TZXJ2aWNlU3RyZWFtSGFuZGxlID0gbVNlcnZpY2VJbnRlcmZhY2Uub3BlblN0cmVhbShyZXF1ZXN0LCBjb25maWd1cmF0aW9uT3V0cHV0KTsKICAgICB9CiAgICAgaWYgKG1TZXJ2aWNlU3RyZWFtSGFuZGxlIDwgMCkgewotICAgICAgICBBTE9HRSgiJXMgLSBvcGVuU3RyZWFtKCkgcmV0dXJuZWQgJWQiLCBfX2Z1bmNfXywgbVNlcnZpY2VTdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gbVNlcnZpY2VTdHJlYW1IYW5kbGU7CiAgICAgfQogCkBAIC0xNzUsOCArMTc3LDIyIEBACiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCi0gICAgLy8gVmFsaWRhdGUgcmVzdWx0IGZyb20gc2VydmVyLgotICAgIGZyYW1lc1BlckJ1cnN0ID0gbUVuZHBvaW50RGVzY3JpcHRvci5kYXRhUXVldWVEZXNjcmlwdG9yLmZyYW1lc1BlckJ1cnN0OworICAgIGZyYW1lc1BlckhhcmR3YXJlQnVyc3QgPSBtRW5kcG9pbnREZXNjcmlwdG9yLmRhdGFRdWV1ZURlc2NyaXB0b3IuZnJhbWVzUGVyQnVyc3Q7CisKKyAgICAvLyBTY2FsZSB1cCB0aGUgYnVyc3Qgc2l6ZSB0byBtZWV0IHRoZSBtaW5pbXVtIGVxdWl2YWxlbnQgaW4gbWljcm9zZWNvbmRzLgorICAgIC8vIFRoaXMgaXMgdG8gYXZvaWQgd2FraW5nIHRoZSBDUFUgdG9vIG9mdGVuIHdoZW4gdGhlIEhXIGJ1cnN0IGlzIHZlcnkgc21hbGwKKyAgICAvLyBvciBhdCBoaWdoIHNhbXBsZSByYXRlcy4KKyAgICBmcmFtZXNQZXJCdXJzdCA9IGZyYW1lc1BlckhhcmR3YXJlQnVyc3Q7CisgICAgZG8geworICAgICAgICBpZiAoYnVyc3RNaWNyb3MgPiAwKSB7ICAvLyBza2lwIGZpcnN0IGxvb3AKKyAgICAgICAgICAgIGZyYW1lc1BlckJ1cnN0ICo9IDI7CisgICAgICAgIH0KKyAgICAgICAgYnVyc3RNaWNyb3MgPSBmcmFtZXNQZXJCdXJzdCAqIHN0YXRpY19jYXN0PGludDY0X3Q+KDEwMDAwMDApIC8gZ2V0U2FtcGxlUmF0ZSgpOworICAgIH0gd2hpbGUgKGJ1cnN0TWljcm9zIDwgYnVyc3RNaW5NaWNyb3MpOworICAgIEFMT0dEKCIlcygpIG9yaWdpbmFsIEhXIGJ1cnN0ID0gJWQsIG1pbk1pY3JvcyA9ICVkID0+IFNXIGJ1cnN0ID0gJWRcbiIsCisgICAgICAgICAgX19mdW5jX18sIGZyYW1lc1BlckhhcmR3YXJlQnVyc3QsIGJ1cnN0TWluTWljcm9zLCBmcmFtZXNQZXJCdXJzdCk7CisKKyAgICAvLyBWYWxpZGF0ZSBmaW5hbCBidXJzdCBzaXplLgogICAgIGlmIChmcmFtZXNQZXJCdXJzdCA8IE1JTl9GUkFNRVNfUEVSX0JVUlNUIHx8IGZyYW1lc1BlckJ1cnN0ID4gTUFYX0ZSQU1FU19QRVJfQlVSU1QpIHsKICAgICAgICAgQUxPR0UoIiVzIC0gZnJhbWVzUGVyQnVyc3Qgb3V0IG9mIHJhbmdlID0gJWQiLCBfX2Z1bmNfXywgZnJhbWVzUGVyQnVyc3QpOwogICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwpAQCAtMTkyLDE4ICsyMDgsMTggQEAKICAgICB9CiAKICAgICBtQ2xvY2tNb2RlbC5zZXRTYW1wbGVSYXRlKGdldFNhbXBsZVJhdGUoKSk7Ci0gICAgbUNsb2NrTW9kZWwuc2V0RnJhbWVzUGVyQnVyc3QobUZyYW1lc1BlckJ1cnN0KTsKKyAgICBtQ2xvY2tNb2RlbC5zZXRGcmFtZXNQZXJCdXJzdChmcmFtZXNQZXJIYXJkd2FyZUJ1cnN0KTsKIAogICAgIGlmIChpc0RhdGFDYWxsYmFja1NldCgpKSB7CiAgICAgICAgIG1DYWxsYmFja0ZyYW1lcyA9IGJ1aWxkZXIuZ2V0RnJhbWVzUGVyRGF0YUNhbGxiYWNrKCk7CiAgICAgICAgIGlmIChtQ2FsbGJhY2tGcmFtZXMgPiBnZXRCdWZmZXJDYXBhY2l0eSgpIC8gMikgewotICAgICAgICAgICAgQUxPR0UoIiVzIC0gZnJhbWVzUGVyQ2FsbGJhY2sgdG9vIGJpZyA9ICVkLCBjYXBhY2l0eSA9ICVkIiwKKyAgICAgICAgICAgIEFMT0dXKCIlcyAtIGZyYW1lc1BlckNhbGxiYWNrIHRvbyBiaWcgPSAlZCwgY2FwYWNpdHkgPSAlZCIsCiAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUNhbGxiYWNrRnJhbWVzLCBnZXRCdWZmZXJDYXBhY2l0eSgpKTsKICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwogCiAgICAgICAgIH0gZWxzZSBpZiAobUNhbGxiYWNrRnJhbWVzIDwgMCkgewotICAgICAgICAgICAgQUxPR0UoIiVzIC0gZnJhbWVzUGVyQ2FsbGJhY2sgbmVnYXRpdmUiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICBBTE9HVygiJXMgLSBmcmFtZXNQZXJDYWxsYmFjayBuZWdhdGl2ZSIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwogCkBAIC0yMTIsOSArMjI4LDcgQEAKICAgICAgICAgICAgIG1DYWxsYmFja0ZyYW1lcyA9IG1GcmFtZXNQZXJCdXJzdDsKICAgICAgICAgfQogCi0gICAgICAgIGludDMyX3QgYnl0ZXNQZXJGcmFtZSA9IGdldFNhbXBsZXNQZXJGcmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQUF1ZGlvQ29udmVydF9mb3JtYXRUb1NpemVJbkJ5dGVzKGdldEZvcm1hdCgpKTsKLSAgICAgICAgaW50MzJfdCBjYWxsYmFja0J1ZmZlclNpemUgPSBtQ2FsbGJhY2tGcmFtZXMgKiBieXRlc1BlckZyYW1lOworICAgICAgICBjb25zdCBpbnQzMl90IGNhbGxiYWNrQnVmZmVyU2l6ZSA9IG1DYWxsYmFja0ZyYW1lcyAqIGdldEJ5dGVzUGVyRnJhbWUoKTsKICAgICAgICAgbUNhbGxiYWNrQnVmZmVyID0gbmV3IHVpbnQ4X3RbY2FsbGJhY2tCdWZmZXJTaXplXTsKICAgICB9CiAKQEAgLTIyOSw3ICsyNDMsNyBAQAogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6Y2xvc2UoKSB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKLSAgICBBTE9HRCgiJXMoKTogbVNlcnZpY2VTdHJlYW1IYW5kbGUgPSAweCUwOFgiLCBfX2Z1bmNfXywgbVNlcnZpY2VTdHJlYW1IYW5kbGUpOworICAgIEFMT0dWKCIlcygpOiBtU2VydmljZVN0cmVhbUhhbmRsZSA9IDB4JTA4WCIsIF9fZnVuY19fLCBtU2VydmljZVN0cmVhbUhhbmRsZSk7CiAgICAgaWYgKG1TZXJ2aWNlU3RyZWFtSGFuZGxlICE9IEFBVURJT19IQU5ETEVfSU5WQUxJRCkgewogICAgICAgICAvLyBEb24ndCBjbG9zZSBhIHN0cmVhbSB3aGlsZSBpdCBpcyBydW5uaW5nLgogICAgICAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3QgY3VycmVudFN0YXRlID0gZ2V0U3RhdGUoKTsKQEAgLTI0MCw3ICsyNTQsNyBAQAogICAgICAgICAgICAgcmVzdWx0ID0gd2FpdEZvclN0YXRlQ2hhbmdlKGN1cnJlbnRTdGF0ZSwgJm5leHRTdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lb3V0TmFub3NlY29uZHMpOwogICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXMoKSB3YWl0Rm9yU3RhdGVDaGFuZ2UoKSByZXR1cm5lZCAlZCAlcyIsCisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgd2FpdEZvclN0YXRlQ2hhbmdlKCkgcmV0dXJuZWQgJWQgJXMiLAogICAgICAgICAgICAgICAgIF9fZnVuY19fLCByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yODcsMTcgKzMwMSwxNyBAQAogewogICAgIGludDY0X3Qgc3RhcnRUaW1lOwogICAgIGlmIChtU2VydmljZVN0cmVhbUhhbmRsZSA9PSBBQVVESU9fSEFORExFX0lOVkFMSUQpIHsKLSAgICAgICAgQUxPR0UoInJlcXVlc3RTdGFydCgpIG1TZXJ2aWNlU3RyZWFtSGFuZGxlIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0QoInJlcXVlc3RTdGFydCgpIG1TZXJ2aWNlU3RyZWFtSGFuZGxlIGludmFsaWQiKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KICAgICBpZiAoaXNBY3RpdmUoKSkgewotICAgICAgICBBTE9HRSgicmVxdWVzdFN0YXJ0KCkgYWxyZWFkeSBhY3RpdmUiKTsKKyAgICAgICAgQUxPR0QoInJlcXVlc3RTdGFydCgpIGFscmVhZHkgYWN0aXZlIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAKICAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgb3JpZ2luYWxTdGF0ZSA9IGdldFN0YXRlKCk7CiAgICAgaWYgKG9yaWdpbmFsU3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpIHsKLSAgICAgICAgQUxPR0UoInJlcXVlc3RTdGFydCgpIGJ1dCBESVNDT05ORUNURUQiKTsKKyAgICAgICAgQUxPR0QoInJlcXVlc3RTdGFydCgpIGJ1dCBESVNDT05ORUNURUQiKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQ7CiAgICAgfQogICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRJTkcpOwpAQCAtMzUzLDI5ICszNjcsMjggQEAKICAgICB9CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpyZXF1ZXN0U3RvcCgpCi17CithYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6cmVxdWVzdFN0b3AoKSB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHN0b3BDYWxsYmFjaygpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCiAgICAgaWYgKG1TZXJ2aWNlU3RyZWFtSGFuZGxlID09IEFBVURJT19IQU5ETEVfSU5WQUxJRCkgewotICAgICAgICBBTE9HRSgicmVxdWVzdFN0b3BJbnRlcm5hbCgpIG1TZXJ2aWNlU3RyZWFtSGFuZGxlIGludmFsaWQgPSAweCUwOFgiLAotICAgICAgICAgICAgICBtU2VydmljZVN0cmVhbUhhbmRsZSk7CisgICAgICAgIEFMT0dXKCIlcygpIG1TZXJ2aWNlU3RyZWFtSGFuZGxlIGludmFsaWQgPSAweCUwOFgiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgbVNlcnZpY2VTdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogCiAgICAgbUNsb2NrTW9kZWwuc3RvcChBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpKTsKICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQSU5HKTsKLSAgICBtQXRvbWljVGltZXN0YW1wLmNsZWFyKCk7CisgICAgbUF0b21pY0ludGVybmFsVGltZXN0YW1wLmNsZWFyKCk7CiAKICAgICByZXR1cm4gbVNlcnZpY2VJbnRlcmZhY2Uuc3RvcFN0cmVhbShtU2VydmljZVN0cmVhbUhhbmRsZSk7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpyZWdpc3RlclRocmVhZCgpIHsKICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgPT0gQUFVRElPX0hBTkRMRV9JTlZBTElEKSB7Ci0gICAgICAgIEFMT0dFKCJyZWdpc3RlclRocmVhZCgpIG1TZXJ2aWNlU3RyZWFtSGFuZGxlIGludmFsaWQiKTsKKyAgICAgICAgQUxPR1coIiVzKCkgbVNlcnZpY2VTdHJlYW1IYW5kbGUgaW52YWxpZCIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KICAgICByZXR1cm4gbVNlcnZpY2VJbnRlcmZhY2UucmVnaXN0ZXJBdWRpb1RocmVhZChtU2VydmljZVN0cmVhbUhhbmRsZSwKQEAgLTM4NSw3ICszOTgsNyBAQAogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6dW5yZWdpc3RlclRocmVhZCgpIHsKICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgPT0gQUFVRElPX0hBTkRMRV9JTlZBTElEKSB7Ci0gICAgICAgIEFMT0dFKCJ1bnJlZ2lzdGVyVGhyZWFkKCkgbVNlcnZpY2VTdHJlYW1IYW5kbGUgaW52YWxpZCIpOworICAgICAgICBBTE9HVygiJXMoKSBtU2VydmljZVN0cmVhbUhhbmRsZSBpbnZhbGlkIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogICAgIHJldHVybiBtU2VydmljZUludGVyZmFjZS51bnJlZ2lzdGVyQXVkaW9UaHJlYWQobVNlcnZpY2VTdHJlYW1IYW5kbGUsIGdldHRpZCgpKTsKQEAgLTQxNyw4ICs0MzAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqZnJhbWVQb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vc2Vjb25kcykgewogICAgIC8vIEdlbmVyYXRlZCBpbiBzZXJ2ZXIgYW5kIHBhc3NlZCB0byBjbGllbnQuIFJldHVybiBsYXRlc3QuCi0gICAgaWYgKG1BdG9taWNUaW1lc3RhbXAuaXNWYWxpZCgpKSB7Ci0gICAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAgPSBtQXRvbWljVGltZXN0YW1wLnJlYWQoKTsKKyAgICBpZiAobUF0b21pY0ludGVybmFsVGltZXN0YW1wLmlzVmFsaWQoKSkgeworICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gbUF0b21pY0ludGVybmFsVGltZXN0YW1wLnJlYWQoKTsKICAgICAgICAgaW50NjRfdCBwb3NpdGlvbiA9IHRpbWVzdGFtcC5nZXRQb3NpdGlvbigpICsgbUZyYW1lc09mZnNldEZyb21TZXJ2aWNlOwogICAgICAgICBpZiAocG9zaXRpb24gPj0gMCkgewogICAgICAgICAgICAgKmZyYW1lUG9zaXRpb24gPSBwb3NpdGlvbjsKQEAgLTQ2NSw3ICs0NzgsNyBAQAogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6b25UaW1lc3RhbXBIYXJkd2FyZShBQXVkaW9TZXJ2aWNlTWVzc2FnZSAqbWVzc2FnZSkgewogICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAobWVzc2FnZS0+dGltZXN0YW1wLnBvc2l0aW9uLCBtZXNzYWdlLT50aW1lc3RhbXAudGltZXN0YW1wKTsKLSAgICBtQXRvbWljVGltZXN0YW1wLndyaXRlKHRpbWVzdGFtcCk7CisgICAgbUF0b21pY0ludGVybmFsVGltZXN0YW1wLndyaXRlKHRpbWVzdGFtcCk7CiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIApAQCAtNjk2LDcgKzcwOSw2IEBACiAgICAgfQogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IG1BdWRpb0VuZHBvaW50LnNldEJ1ZmZlclNpemVJbkZyYW1lcyhhZGp1c3RlZEZyYW1lcywgJmFjdHVhbEZyYW1lcyk7Ci0gICAgQUxPR0QoInNldEJ1ZmZlclNpemUoKSByZXEgPSAlZCA9PiAlZCIsIHJlcXVlc3RlZEZyYW1lcywgYWN0dWFsRnJhbWVzKTsKICAgICBpZiAocmVzdWx0IDwgMCkgewogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0gZWxzZSB7CkBAIC03MTksMyArNzMxLDcgQEAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpqb2luVGhyZWFkKHZvaWQqKiByZXR1cm5BcmcpIHsKICAgICByZXR1cm4gQXVkaW9TdHJlYW06OmpvaW5UaHJlYWQocmV0dXJuQXJnLCBjYWxjdWxhdGVSZWFzb25hYmxlVGltZW91dChnZXRGcmFtZXNQZXJCdXJzdCgpKSk7CiB9CisKK2Jvb2wgQXVkaW9TdHJlYW1JbnRlcm5hbDo6aXNDbG9ja01vZGVsSW5Db250cm9sKCkgY29uc3QgeworICAgIHJldHVybiBpc0FjdGl2ZSgpICYmIG1BdWRpb0VuZHBvaW50LmlzRnJlZVJ1bm5pbmcoKSAmJiBtQ2xvY2tNb2RlbC5pc1J1bm5pbmcoKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaAppbmRleCAwNDI1Y2Q1Li44NmM0Njk4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oCkBAIC0yNyw3ICsyNyw2IEBACiAjaW5jbHVkZSAiY2xpZW50L0F1ZGlvRW5kcG9pbnQuaCIKICNpbmNsdWRlICJjb3JlL0F1ZGlvU3RyZWFtLmgiCiAjaW5jbHVkZSAidXRpbGl0eS9BdWRpb0Nsb2NrLmgiCi0jaW5jbHVkZSAidXRpbGl0eS9MaW5lYXJSYW1wLmgiCiAKIHVzaW5nIGFuZHJvaWQ6OnNwOwogdXNpbmcgYW5kcm9pZDo6SUFBdWRpb1NlcnZpY2U7CkBAIC0xNDUsNiArMTQ0LDE0IEBACiAgICAgICovCiAgICAgYm9vbCBpc0luU2VydmljZSgpIGNvbnN0IHsgcmV0dXJuIG1JblNlcnZpY2U7IH0KIAorICAgIC8qKgorICAgICAqIElzIHRoZSBzZXJ2aWNlIEZJRk8gcG9zaXRpb24gY3VycmVudGx5IGNvbnRyb2xsZWQgYnkgdGhlIEFBdWRpbyBzZXJ2aWNlIG9yIEhBTCwKKyAgICAgKiBvciBzZXQgYmFzZWQgb24gdGhlIENsb2NrIE1vZGVsLgorICAgICAqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBDbG9ja01vZGVsIGlzIGN1cnJlbnRseSBkZXRlcm1pbmluZyB0aGUgRklGTyBwb3NpdGlvbgorICAgICAqLworICAgIGJvb2wgaXNDbG9ja01vZGVsSW5Db250cm9sKCkgY29uc3Q7CisKICAgICBJc29jaHJvbm91c0Nsb2NrTW9kZWwgICAgbUNsb2NrTW9kZWw7ICAgICAgLy8gdGltaW5nIG1vZGVsIGZvciBjaGFzaW5nIHRoZSBIQUwKIAogICAgIEF1ZGlvRW5kcG9pbnQgICAgICAgICAgICBtQXVkaW9FbmRwb2ludDsgICAvLyBzb3VyY2UgZm9yIHJlYWRzIG9yIHNpbmsgZm9yIHdyaXRlcwpAQCAtMTY0LDcgKzE3MSw3IEBACiAKICAgICBBQXVkaW9TZXJ2aWNlSW50ZXJmYWNlICAmbVNlcnZpY2VJbnRlcmZhY2U7ICAgLy8gYWJzdHJhY3QgaW50ZXJmYWNlIHRvIHRoZSBzZXJ2aWNlCiAKLSAgICBTaW1wbGVEb3VibGVCdWZmZXI8VGltZXN0YW1wPiAgbUF0b21pY1RpbWVzdGFtcDsKKyAgICBTaW1wbGVEb3VibGVCdWZmZXI8VGltZXN0YW1wPiAgbUF0b21pY0ludGVybmFsVGltZXN0YW1wOwogCiAgICAgQXRvbWljUmVxdWVzdG9yICAgICAgICAgIG1OZWVkQ2F0Y2hVcDsgICAvLyBBc2sgcmVhZCgpIG9yIHdyaXRlKCkgdG8gc3luYyBvbiBmaXJzdCB0aW1lc3RhbXAuCiAKQEAgLTE5Myw2ICsyMDAsOCBAQAogCiAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlTGF0ZW5jeU5hbm9zID0gMDsKIAorICAgIC8vIFNvbWV0aW1lcyB0aGUgaGFyZHdhcmUgaXMgb3BlcmF0aW5nIHdpdGggYSBkaWZmZXJlbnQgY2hhbm5lbCBjb3VudCBmcm9tIHRoZSBhcHAuCisgICAgLy8gVGhlbiB3ZSByZXF1aXJlIGNvbnZlcnNpb24gaW4gQUF1ZGlvLgogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICBtRGV2aWNlQ2hhbm5lbENvdW50ID0gMDsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcAppbmRleCAwNzE5ZmUxLi5hNmNjNDViIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KIAogI2luY2x1ZGUgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5oIgpAQCAtMTY1LDM1ICsxNjYsMzYgQEAKICAgICAvLyBSZWFkIGRhdGEgaW4gb25lIG9yIHR3byBwYXJ0cy4KICAgICBmb3IgKGludCBwYXJ0SW5kZXggPSAwOyBmcmFtZXNMZWZ0ID4gMCAmJiBwYXJ0SW5kZXggPCBXcmFwcGluZ0J1ZmZlcjo6U0laRTsgcGFydEluZGV4KyspIHsKICAgICAgICAgaW50MzJfdCBmcmFtZXNUb1Byb2Nlc3MgPSBmcmFtZXNMZWZ0OwotICAgICAgICBpbnQzMl90IGZyYW1lc0F2YWlsYWJsZSA9IHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1twYXJ0SW5kZXhdOworICAgICAgICBjb25zdCBpbnQzMl90IGZyYW1lc0F2YWlsYWJsZSA9IHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1twYXJ0SW5kZXhdOwogICAgICAgICBpZiAoZnJhbWVzQXZhaWxhYmxlIDw9IDApIGJyZWFrOwogCiAgICAgICAgIGlmIChmcmFtZXNUb1Byb2Nlc3MgPiBmcmFtZXNBdmFpbGFibGUpIHsKICAgICAgICAgICAgIGZyYW1lc1RvUHJvY2VzcyA9IGZyYW1lc0F2YWlsYWJsZTsKICAgICAgICAgfQogCi0gICAgICAgIGludDMyX3QgbnVtQnl0ZXMgPSBnZXRCeXRlc1BlckZyYW1lKCkgKiBmcmFtZXNUb1Byb2Nlc3M7Ci0gICAgICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1RvUHJvY2VzcyAqIGdldFNhbXBsZXNQZXJGcmFtZSgpOworICAgICAgICBjb25zdCBpbnQzMl90IG51bUJ5dGVzID0gZ2V0Qnl0ZXNQZXJGcmFtZSgpICogZnJhbWVzVG9Qcm9jZXNzOworICAgICAgICBjb25zdCBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNUb1Byb2Nlc3MgKiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKIAorICAgICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCBzb3VyY2VGb3JtYXQgPSBnZXREZXZpY2VGb3JtYXQoKTsKKyAgICAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgZGVzdGluYXRpb25Gb3JtYXQgPSBnZXRGb3JtYXQoKTsKICAgICAgICAgLy8gVE9ETyBmYWN0b3IgdGhpcyBvdXQgaW50byBhIHV0aWxpdHkgZnVuY3Rpb24KLSAgICAgICAgaWYgKGdldERldmljZUZvcm1hdCgpID09IGdldEZvcm1hdCgpKSB7CisgICAgICAgIGlmIChzb3VyY2VGb3JtYXQgPT0gZGVzdGluYXRpb25Gb3JtYXQpIHsKICAgICAgICAgICAgIG1lbWNweShkZXN0aW5hdGlvbiwgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLCBudW1CeXRlcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZ2V0RGV2aWNlRm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2Ci0gICAgICAgICAgICAgICAgICAgJiYgZ2V0Rm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSB3cmFwcGluZ0J1ZmZlci5kYXRhW3BhcnRJbmRleF0sCisgICAgICAgIH0gZWxzZSBpZiAoc291cmNlRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCisgICAgICAgICAgICAgICAgICAgJiYgZGVzdGluYXRpb25Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KAogICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgIDEuMGYpOwotICAgICAgICB9IGVsc2UgaWYgKGdldERldmljZUZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUCi0gICAgICAgICAgICAgICAgICAgJiYgZ2V0Rm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7Ci0gICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNigKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLAorICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzKTsKKyAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VGb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVAorICAgICAgICAgICAgICAgICAgICYmIGRlc3RpbmF0aW9uRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSB7CisgICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQoCiAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopIGRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAxLjBmKTsKKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcyk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiRm9ybWF0IGNvbnZlcnNpb24gbm90IHN1cHBvcnRlZCEiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpIC0gRm9ybWF0IGNvbnZlcnNpb24gbm90IHN1cHBvcnRlZCEgYXVkaW9fZm9ybWF0X3Qgc291cmNlID0gJXUsIGRlc3QgPSAldSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIHNvdXJjZUZvcm1hdCwgZGVzdGluYXRpb25Gb3JtYXQpOwogICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX0ZPUk1BVDsKICAgICAgICAgfQogICAgICAgICBkZXN0aW5hdGlvbiArPSBudW1CeXRlczsKQEAgLTIwOCwxNyArMjEwLDEyIEBACiB9CiAKIGludDY0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmU6OmdldEZyYW1lc1dyaXR0ZW4oKSB7Ci0gICAgaW50NjRfdCBmcmFtZXNXcml0dGVuSGFyZHdhcmU7Ci0gICAgaWYgKGlzQWN0aXZlKCkpIHsKLSAgICAgICAgZnJhbWVzV3JpdHRlbkhhcmR3YXJlID0gbUNsb2NrTW9kZWwuY29udmVydFRpbWVUb1Bvc2l0aW9uKEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGZyYW1lc1dyaXR0ZW5IYXJkd2FyZSA9IG1BdWRpb0VuZHBvaW50LmdldERhdGFXcml0ZUNvdW50ZXIoKTsKLSAgICB9Ci0gICAgLy8gUHJldmVudCByZXRyb2dyYWRlIG1vdGlvbi4KKyAgICBjb25zdCBpbnQ2NF90IGZyYW1lc1dyaXR0ZW5IYXJkd2FyZSA9IGlzQ2xvY2tNb2RlbEluQ29udHJvbCgpCisgICAgICAgICAgICA/IG1DbG9ja01vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbihBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpKQorICAgICAgICAgICAgOiBtQXVkaW9FbmRwb2ludC5nZXREYXRhV3JpdGVDb3VudGVyKCk7CisgICAgLy8gQWRkIHNlcnZpY2Ugb2Zmc2V0IGFuZCBwcmV2ZW50IHJldHJvZ3JhZGUgbW90aW9uLgogICAgIG1MYXN0RnJhbWVzV3JpdHRlbiA9IHN0ZDo6bWF4KG1MYXN0RnJhbWVzV3JpdHRlbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNXcml0dGVuSGFyZHdhcmUgKyBtRnJhbWVzT2Zmc2V0RnJvbVNlcnZpY2UpOwotICAgIC8vQUxPR0QoImdldEZyYW1lc1dyaXR0ZW4oKSByZXR1cm5zICVsbGQiLAotICAgIC8vICAgICAgKGxvbmcgbG9uZyltTGFzdEZyYW1lc1dyaXR0ZW4pOwogICAgIHJldHVybiBtTGFzdEZyYW1lc1dyaXR0ZW47CiB9CiAKQEAgLTI1Niw3ICsyNTMsOCBAQAogICAgICAgICBjYWxsYmFja1Jlc3VsdCA9IG1heWJlQ2FsbERhdGFDYWxsYmFjayhtQ2FsbGJhY2tCdWZmZXIsIG1DYWxsYmFja0ZyYW1lcyk7CiAKICAgICAgICAgaWYgKGNhbGxiYWNrUmVzdWx0ID09IEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCkgewotICAgICAgICAgICAgQUxPR0QoImNhbGxiYWNrIHJldHVybmVkIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCIpOworICAgICAgICAgICAgQUxPR0QoIiVzKCk6IGNhbGxiYWNrIHJldHVybmVkIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJlc3VsdCA9IHN5c3RlbVN0b3BGcm9tQ2FsbGJhY2soKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwCmluZGV4IDc5NWJhMmMuLjE2NGFkMmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5jcHAKQEAgLTQzLDkgKzQzLDE3IEBACiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6Om9wZW4oY29uc3QgQXVkaW9TdHJlYW1CdWlsZGVyICZidWlsZGVyKSB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9wZW4oYnVpbGRlcik7CiAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgcmVzdWx0ID0gbUZsb3dHcmFwaC5jb25maWd1cmUoZ2V0Rm9ybWF0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFNhbXBsZXNQZXJGcmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JtYXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlQ2hhbm5lbENvdW50KCkpOworCisgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICBjbG9zZSgpOworICAgICAgICB9CiAgICAgICAgIC8vIFNhbXBsZSByYXRlIGlzIGNvbnN0cmFpbmVkIHRvIGNvbW1vbiB2YWx1ZXMgYnkgbm93IGFuZCBzaG91bGQgbm90IG92ZXJmbG93LgogICAgICAgICBpbnQzMl90IG51bUZyYW1lcyA9IGtSYW1wTVNlYyAqIGdldFNhbXBsZVJhdGUoKSAvIEFBVURJT19NSUxMSVNfUEVSX1NFQ09ORDsKLSAgICAgICAgbVZvbHVtZVJhbXAuc2V0TGVuZ3RoSW5GcmFtZXMobnVtRnJhbWVzKTsKKyAgICAgICAgbUZsb3dHcmFwaC5zZXRSYW1wTGVuZ3RoSW5GcmFtZXMobnVtRnJhbWVzKTsKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTU3LDE5ICs2NSwxOSBAQAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgPT0gQUFVRElPX0hBTkRMRV9JTlZBTElEKSB7Ci0gICAgICAgIEFMT0dFKCIlcygpIG1TZXJ2aWNlU3RyZWFtSGFuZGxlIGludmFsaWQiLCBfX2Z1bmNfXyk7CisgICAgICAgIEFMT0dXKCIlcygpIG1TZXJ2aWNlU3RyZWFtSGFuZGxlIGludmFsaWQiLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAKICAgICBtQ2xvY2tNb2RlbC5zdG9wKEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkpOwogICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0lORyk7Ci0gICAgbUF0b21pY1RpbWVzdGFtcC5jbGVhcigpOworICAgIG1BdG9taWNJbnRlcm5hbFRpbWVzdGFtcC5jbGVhcigpOwogICAgIHJldHVybiBtU2VydmljZUludGVyZmFjZS5wYXVzZVN0cmVhbShtU2VydmljZVN0cmVhbUhhbmRsZSk7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6cmVxdWVzdEZsdXNoKCkgewogICAgIGlmIChtU2VydmljZVN0cmVhbUhhbmRsZSA9PSBBQVVESU9fSEFORExFX0lOVkFMSUQpIHsKLSAgICAgICAgQUxPR0UoIiVzKCkgbVNlcnZpY2VTdHJlYW1IYW5kbGUgaW52YWxpZCIsIF9fZnVuY19fKTsKKyAgICAgICAgQUxPR1coIiVzKCkgbVNlcnZpY2VTdHJlYW1IYW5kbGUgaW52YWxpZCIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KIApAQCAtMjE2LDIyICsyMjQsMTAgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaW50MzJfdCBudW1CeXRlcyA9IGdldEJ5dGVzUGVyRnJhbWUoKSAqIGZyYW1lc1RvV3JpdGU7Ci0gICAgICAgICAgICAvLyBEYXRhIGNvbnZlcnNpb24uCi0gICAgICAgICAgICBmbG9hdCBsZXZlbEZyb207Ci0gICAgICAgICAgICBmbG9hdCBsZXZlbFRvOwotICAgICAgICAgICAgbVZvbHVtZVJhbXAubmV4dFNlZ21lbnQoZnJhbWVzVG9Xcml0ZSwgJmxldmVsRnJvbSwgJmxldmVsVG8pOwogCi0gICAgICAgICAgICBBQXVkaW9EYXRhQ29udmVydGVyOjpGb3JtYXR0ZWREYXRhIHNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilieXRlQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICBnZXRGb3JtYXQoKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0U2FtcGxlc1BlckZyYW1lKCkpOwotICAgICAgICAgICAgQUF1ZGlvRGF0YUNvbnZlcnRlcjo6Rm9ybWF0dGVkRGF0YSBkZXN0aW5hdGlvbigKLSAgICAgICAgICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLAotICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JtYXQoKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlQ2hhbm5lbENvdW50KCkpOwotCi0gICAgICAgICAgICBBQXVkaW9EYXRhQ29udmVydGVyOjpjb252ZXJ0KHNvdXJjZSwgZGVzdGluYXRpb24sIGZyYW1lc1RvV3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwgbGV2ZWxUbyk7CisgICAgICAgICAgICBtRmxvd0dyYXBoLnByb2Nlc3MoKHZvaWQgKilieXRlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNUb1dyaXRlKTsKIAogICAgICAgICAgICAgYnl0ZUJ1ZmZlciArPSBudW1CeXRlczsKICAgICAgICAgICAgIGZyYW1lc0xlZnQgLT0gZnJhbWVzVG9Xcml0ZTsKQEAgLTI0NiwyNyArMjQyLDE3IEBACiAgICAgcmV0dXJuIGZyYW1lc1dyaXR0ZW47CiB9CiAKLWludDY0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6OmdldEZyYW1lc1JlYWQoKQotewotICAgIGludDY0X3QgZnJhbWVzUmVhZEhhcmR3YXJlOwotICAgIGlmIChpc0FjdGl2ZSgpKSB7Ci0gICAgICAgIGZyYW1lc1JlYWRIYXJkd2FyZSA9IG1DbG9ja01vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbihBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcmFtZXNSZWFkSGFyZHdhcmUgPSBtQXVkaW9FbmRwb2ludC5nZXREYXRhUmVhZENvdW50ZXIoKTsKLSAgICB9Ci0gICAgaW50NjRfdCBmcmFtZXNSZWFkID0gZnJhbWVzUmVhZEhhcmR3YXJlICsgbUZyYW1lc09mZnNldEZyb21TZXJ2aWNlOwotICAgIC8vIFByZXZlbnQgcmV0cm9ncmFkZSBtb3Rpb24uCi0gICAgaWYgKGZyYW1lc1JlYWQgPCBtTGFzdEZyYW1lc1JlYWQpIHsKLSAgICAgICAgZnJhbWVzUmVhZCA9IG1MYXN0RnJhbWVzUmVhZDsKLSAgICB9IGVsc2UgewotICAgICAgICBtTGFzdEZyYW1lc1JlYWQgPSBmcmFtZXNSZWFkOwotICAgIH0KLSAgICByZXR1cm4gZnJhbWVzUmVhZDsKK2ludDY0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6OmdldEZyYW1lc1JlYWQoKSB7CisgICAgY29uc3QgaW50NjRfdCBmcmFtZXNSZWFkSGFyZHdhcmUgPSBpc0Nsb2NrTW9kZWxJbkNvbnRyb2woKQorICAgICAgICAgICAgPyBtQ2xvY2tNb2RlbC5jb252ZXJ0VGltZVRvUG9zaXRpb24oQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSkKKyAgICAgICAgICAgIDogbUF1ZGlvRW5kcG9pbnQuZ2V0RGF0YVJlYWRDb3VudGVyKCk7CisgICAgLy8gQWRkIHNlcnZpY2Ugb2Zmc2V0IGFuZCBwcmV2ZW50IHJldHJvZ3JhZGUgbW90aW9uLgorICAgIG1MYXN0RnJhbWVzUmVhZCA9IHN0ZDo6bWF4KG1MYXN0RnJhbWVzUmVhZCwgZnJhbWVzUmVhZEhhcmR3YXJlICsgbUZyYW1lc09mZnNldEZyb21TZXJ2aWNlKTsKKyAgICByZXR1cm4gbUxhc3RGcmFtZXNSZWFkOwogfQogCi1pbnQ2NF90IEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5OjpnZXRGcmFtZXNXcml0dGVuKCkKLXsKLSAgICBpbnQ2NF90IGZyYW1lc1dyaXR0ZW4gPSBtQXVkaW9FbmRwb2ludC5nZXREYXRhV3JpdGVDb3VudGVyKCkKK2ludDY0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6OmdldEZyYW1lc1dyaXR0ZW4oKSB7CisgICAgY29uc3QgaW50NjRfdCBmcmFtZXNXcml0dGVuID0gbUF1ZGlvRW5kcG9pbnQuZ2V0RGF0YVdyaXRlQ291bnRlcigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtRnJhbWVzT2Zmc2V0RnJvbVNlcnZpY2U7CiAgICAgcmV0dXJuIGZyYW1lc1dyaXR0ZW47CiB9CkBAIC0yOTcsNyArMjgzLDggQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChjYWxsYmFja1Jlc3VsdCA9PSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1ApIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcygpOiBjYWxsYmFjayByZXR1cm5lZCBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1AiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICBBTE9HRCgiJXMoKTogY2FsbGJhY2sgcmV0dXJuZWQgQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QIiwgX19mdW5jX18pOworICAgICAgICAgICAgcmVzdWx0ID0gc3lzdGVtU3RvcEZyb21DYWxsYmFjaygpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMTMsNiArMzAwLDYgQEAKICAgICBmbG9hdCBjb21iaW5lZFZvbHVtZSA9IG1TdHJlYW1Wb2x1bWUgKiBnZXREdWNrQW5kTXV0ZVZvbHVtZSgpOwogICAgIEFMT0dEKCIlcygpIG1TdHJlYW1Wb2x1bWUgKiBkdWNrQW5kTXV0ZVZvbHVtZSA9ICVmICogJWYgPSAlZiIsCiAgICAgICAgICAgX19mdW5jX18sIG1TdHJlYW1Wb2x1bWUsIGdldER1Y2tBbmRNdXRlVm9sdW1lKCksIGNvbWJpbmVkVm9sdW1lKTsKLSAgICBtVm9sdW1lUmFtcC5zZXRUYXJnZXQoY29tYmluZWRWb2x1bWUpOworICAgIG1GbG93R3JhcGguc2V0VGFyZ2V0Vm9sdW1lKGNvbWJpbmVkVm9sdW1lKTsKICAgICByZXR1cm4gYW5kcm9pZDo6Tk9fRVJST1I7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaAppbmRleCA5NzdhOTA5Li5jYWIyOTQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VJbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmgiCiAjaW5jbHVkZSAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaCIKIAogdXNpbmcgYW5kcm9pZDo6c3A7CkBAIC05Myw3ICs5NCw3IEBACiAKICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgbUxhc3RGcmFtZXNSZWFkID0gMDsgLy8gdXNlZCB0byBwcmV2ZW50IHJldHJvZ3JhZGUgbW90aW9uCiAKLSAgICBMaW5lYXJSYW1wICAgICAgICAgICAgICAgbVZvbHVtZVJhbXA7CisgICAgQUF1ZGlvRmxvd0dyYXBoICAgICAgICAgIG1GbG93R3JhcGg7CiAKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuY3BwCmluZGV4IDk1YjUyYmUuLjc0N2QwZTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmNwcApAQCAtNjAsMTAgKzYwLDE0IEBACiAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKIH0KIAotYm9vbCBJc29jaHJvbm91c0Nsb2NrTW9kZWw6OmlzU3RhcnRpbmcoKSB7Citib29sIElzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6aXNTdGFydGluZygpIGNvbnN0IHsKICAgICByZXR1cm4gbVN0YXRlID09IFNUQVRFX1NUQVJUSU5HOwogfQogCitib29sIElzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6aXNSdW5uaW5nKCkgY29uc3QgeworICAgIHJldHVybiBtU3RhdGUgPT0gU1RBVEVfUlVOTklORzsKK30KKwogdm9pZCBJc29jaHJvbm91c0Nsb2NrTW9kZWw6OnByb2Nlc3NUaW1lc3RhbXAoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQ2NF90IG5hbm9UaW1lKSB7CiAvLyAgICBBTE9HRCgicHJvY2Vzc1RpbWVzdGFtcCgpIC0gZnJhbWVQb3NpdGlvbiA9ICVsbGQgYXQgbmFub1RpbWUgJWxsdSIsCiAvLyAgICAgICAgIChsb25nIGxvbmcpZnJhbWVQb3NpdGlvbiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmgKaW5kZXggNzE4MjM3Ni4uNDZjYTQ4ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmgKQEAgLTM2LDcgKzM2LDE1IEBACiAgICAgdm9pZCBzdGFydChpbnQ2NF90IG5hbm9UaW1lKTsKICAgICB2b2lkIHN0b3AoaW50NjRfdCBuYW5vVGltZSk7CiAKLSAgICBib29sIGlzU3RhcnRpbmcoKTsKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1vZGVsIGlzIHN0YXJ0aW5nIHVwCisgICAgICovCisgICAgYm9vbCBpc1N0YXJ0aW5nKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1vZGVsIGlzIHJ1bm5pbmcgYW5kIHByb2R1Y2luZyB2YWxpZCByZXN1bHRzCisgICAgICovCisgICAgYm9vbCBpc1J1bm5pbmcoKSBjb25zdDsKIAogICAgIHZvaWQgcHJvY2Vzc1RpbWVzdGFtcChpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDY0X3QgbmFub1RpbWUpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvQXVkaW8uY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcAppbmRleCBkZjBkYjc5Li40NGQ1MTIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvQXVkaW8uY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9BdWRpby5jcHAKQEAgLTE0NiwxNCArMTQ2LDE0IEBACiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDaGFubmVsQ291bnQoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudCkKIHsKLSAgICBBdWRpb1N0cmVhbUJ1aWxkZXIgKnN0cmVhbUJ1aWxkZXIgPSBjb252ZXJ0QUF1ZGlvQnVpbGRlclRvU3RyZWFtQnVpbGRlcihidWlsZGVyKTsKLSAgICBzdHJlYW1CdWlsZGVyLT5zZXRTYW1wbGVzUGVyRnJhbWUoY2hhbm5lbENvdW50KTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNhbXBsZXNQZXJGcmFtZShidWlsZGVyLCBjaGFubmVsQ291bnQpOwogfQogCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTYW1wbGVzUGVyRnJhbWUoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSkKIHsKLSAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENoYW5uZWxDb3VudChidWlsZGVyLCBjaGFubmVsQ291bnQpOworICAgIEF1ZGlvU3RyZWFtQnVpbGRlciAqc3RyZWFtQnVpbGRlciA9IGNvbnZlcnRBQXVkaW9CdWlsZGVyVG9TdHJlYW1CdWlsZGVyKGJ1aWxkZXIpOworICAgIHN0cmVhbUJ1aWxkZXItPnNldFNhbXBsZXNQZXJGcmFtZShzYW1wbGVzUGVyRnJhbWUpOwogfQogCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREaXJlY3Rpb24oQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKQEAgLTE2Nyw3ICsxNjcsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkKIHsKICAgICBBdWRpb1N0cmVhbUJ1aWxkZXIgKnN0cmVhbUJ1aWxkZXIgPSBjb252ZXJ0QUF1ZGlvQnVpbGRlclRvU3RyZWFtQnVpbGRlcihidWlsZGVyKTsKLSAgICBzdHJlYW1CdWlsZGVyLT5zZXRGb3JtYXQoZm9ybWF0KTsKKyAgICAvLyBVc2UgYXVkaW9fZm9ybWF0X3QgZXZlcnl3aGVyZSBpbnRlcm5hbGx5LgorICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGludGVybmFsRm9ybWF0ID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWREYXRhRm9ybWF0KGZvcm1hdCk7CisgICAgc3RyZWFtQnVpbGRlci0+c2V0Rm9ybWF0KGludGVybmFsRm9ybWF0KTsKIH0KIAogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2hhcmluZ01vZGUoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKQEAgLTIwMiw2ICsyMDQsMTIgQEAKICAgICBzdHJlYW1CdWlsZGVyLT5zZXRCdWZmZXJDYXBhY2l0eShmcmFtZXMpOwogfQogCitBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSgKKyAgICAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBwb2xpY3kpIHsKKyAgICBBdWRpb1N0cmVhbUJ1aWxkZXIgKnN0cmVhbUJ1aWxkZXIgPSBjb252ZXJ0QUF1ZGlvQnVpbGRlclRvU3RyZWFtQnVpbGRlcihidWlsZGVyKTsKKyAgICBzdHJlYW1CdWlsZGVyLT5zZXRBbGxvd2VkQ2FwdHVyZVBvbGljeShwb2xpY3kpOworfQorCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTZXNzaW9uSWQoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc2Vzc2lvbl9pZF90IHNlc3Npb25JZCkKIHsKQEAgLTIzOCwxOCArMjQ2LDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBdWRpb1N0cmVhbSoqIHN0cmVhbVB0cikKIHsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBudWxscHRyOworICAgIGFhdWRpb19zdHJlYW1faWRfdCBpZCA9IDA7CiAgICAgLy8gUGxlYXNlIGxlYXZlIHRoZXNlIGxvZ3MgYmVjYXVzZSB0aGV5IGFyZSB2ZXJ5IGhlbHBmdWwgd2hlbiBkZWJ1Z2dpbmcuCi0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpIGNhbGxlZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIik7CisgICAgQUxPR0koIiVzKCkgY2FsbGVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iLCBfX2Z1bmNfXyk7CiAgICAgQXVkaW9TdHJlYW1CdWlsZGVyICpzdHJlYW1CdWlsZGVyID0gQ09NTU9OX0dFVF9GUk9NX0JVSUxERVJfT1JfUkVUVVJOKHN0cmVhbVB0cik7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHN0cmVhbUJ1aWxkZXItPmJ1aWxkKCZhdWRpb1N0cmVhbSk7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpIHJldHVybnMgJWQgPSAlcyBmb3IgKCVwKSAtLS0tLS0tLS0tLS0tLS0tIiwKLSAgICAgICAgICByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCksIGF1ZGlvU3RyZWFtKTsKICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgewogICAgICAgICBhdWRpb1N0cmVhbS0+cmVnaXN0ZXJQbGF5ZXJCYXNlKCk7CiAgICAgICAgICpzdHJlYW1QdHIgPSAoQUF1ZGlvU3RyZWFtKikgYXVkaW9TdHJlYW07CisgICAgICAgIGlkID0gYXVkaW9TdHJlYW0tPmdldElkKCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgKnN0cmVhbVB0ciA9IG51bGxwdHI7CiAgICAgfQorICAgIEFMT0dJKCIlcygpIHJldHVybnMgJWQgPSAlcyBmb3IgcyMldSAtLS0tLS0tLS0tLS0tLS0tIiwKKyAgICAgICAgX19mdW5jX18sIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSwgaWQpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTI2Nyw4ICsyNzcsOSBAQAogewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fRVJST1JfTlVMTDsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOwotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1fY2xvc2UoJXApIGNhbGxlZCAtLS0tLS0tLS0tLS0tLS0iLCBzdHJlYW0pOwogICAgIGlmIChhdWRpb1N0cmVhbSAhPSBudWxscHRyKSB7CisgICAgICAgIGFhdWRpb19zdHJlYW1faWRfdCBpZCA9IGF1ZGlvU3RyZWFtLT5nZXRJZCgpOworICAgICAgICBBTE9HRCgiJXMocyMldSkgY2FsbGVkIC0tLS0tLS0tLS0tLS0tLSIsIF9fZnVuY19fLCBpZCk7CiAgICAgICAgIHJlc3VsdCA9IGF1ZGlvU3RyZWFtLT5zYWZlQ2xvc2UoKTsKICAgICAgICAgLy8gQ2xvc2Ugd2lsbCBvbmx5IGZhaWwgaWYgY2FsbGVkIGlsbGVnYWxseSwgZm9yIGV4YW1wbGUsIGZyb20gYSBjYWxsYmFjay4KICAgICAgICAgLy8gVGhhdCB3b3VsZCByZXN1bHQgaW4gZGVsZXRpbmcgYW4gYWN0aXZlIHN0cmVhbSwgd2hpY2ggd291bGQgY2F1c2UgYSBjcmFzaC4KQEAgLTI3OCw0MyArMjg5LDQwIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HVygiJXMgYXR0ZW1wdCB0byBjbG9zZSBmYWlsZWQuIENsb3NlIGl0IGZyb20gYW5vdGhlciB0aHJlYWQuIiwgX19mdW5jX18pOwogICAgICAgICB9CisgICAgICAgIEFMT0dEKCIlcyhzIyV1KSByZXR1cm5lZCAlZCAtLS0tLS0tLS0iLCBfX2Z1bmNfXywgaWQsIHJlc3VsdCk7CiAgICAgfQotICAgIC8vIFdlJ3JlIHBvdGVudGlhbGx5IGZyZWVpbmcgYHN0cmVhbWAgYWJvdmUsIHNvIGl0cyB1c2UgaGVyZSBtYWtlcyBzb21lCi0gICAgLy8gc3RhdGljIGFuYWx5c2lzIHRvb2xzIHVuaGFwcHkuIENhc3RpbmcgdG8gdWludHB0cl90IGhlbHBzIGFzc3VyZQotICAgIC8vIHNhaWQgdG9vbHMgdGhhdCB3ZSdyZSBub3QgZG9pbmcgYW55dGhpbmcgYmFkIGhlcmUuCi0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9jbG9zZSglIyIgUFJJeFBUUiAiKSByZXR1cm5lZCAlZCAtLS0tLS0tLS0iLAotICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihzdHJlYW0pLCByZXN1bHQpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90ICBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KEFBdWRpb1N0cmVhbSogc3RyZWFtKQogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoJXApIGNhbGxlZCAtLS0tLS0tLS0tLS0tLSIsIHN0cmVhbSk7CisgICAgYWF1ZGlvX3N0cmVhbV9pZF90IGlkID0gYXVkaW9TdHJlYW0tPmdldElkKCk7CisgICAgQUxPR0QoIiVzKHMjJXUpIGNhbGxlZCAtLS0tLS0tLS0tLS0tLSIsIF9fZnVuY19fLCBpZCk7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGF1ZGlvU3RyZWFtLT5zeXN0ZW1TdGFydCgpOwotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KCVwKSByZXR1cm5lZCAlZCAtLS0tLS0tLS0iLCBzdHJlYW0sIHJlc3VsdCk7CisgICAgQUxPR0QoIiVzKHMjJXUpIHJldHVybmVkICVkIC0tLS0tLS0tLSIsIF9fZnVuY19fLCBpZCwgcmVzdWx0KTsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtX3JlcXVlc3RQYXVzZShBQXVkaW9TdHJlYW0qIHN0cmVhbSkKIHsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOwotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1fcmVxdWVzdFBhdXNlKCVwKSIsIHN0cmVhbSk7CisgICAgQUxPR0QoIiVzKHMjJXUpIGNhbGxlZCIsIF9fZnVuY19fLCBhdWRpb1N0cmVhbS0+Z2V0SWQoKSk7CiAgICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5zeXN0ZW1QYXVzZSgpOwogfQogCiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtX3JlcXVlc3RGbHVzaChBQXVkaW9TdHJlYW0qIHN0cmVhbSkKIHsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOwotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1fcmVxdWVzdEZsdXNoKCVwKSIsIHN0cmVhbSk7CisgICAgQUxPR0QoIiVzKHMjJXUpIGNhbGxlZCIsIF9fZnVuY19fLCBhdWRpb1N0cmVhbS0+Z2V0SWQoKSk7CiAgICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5zYWZlRmx1c2goKTsKIH0KIAogQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcChBQXVkaW9TdHJlYW0qIHN0cmVhbSkKIHsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOwotICAgIEFMT0dEKCJBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoJXApIiwgc3RyZWFtKTsKLSAgICByZXR1cm4gYXVkaW9TdHJlYW0tPnN5c3RlbVN0b3AoKTsKKyAgICBBTE9HRCgiJXMocyMldSkgY2FsbGVkIiwgX19mdW5jX18sIGF1ZGlvU3RyZWFtLT5nZXRJZCgpKTsKKyAgICByZXR1cm4gYXVkaW9TdHJlYW0tPnN5c3RlbVN0b3BGcm9tQXBwKCk7CiB9CiAKIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1N0cmVhbV93YWl0Rm9yU3RhdGVDaGFuZ2UoQUF1ZGlvU3RyZWFtKiBzdHJlYW0sCkBAIC0zNjMsNyArMzcxLDcgQEAKIAogICAgIC8vIERvbid0IGFsbG93IHdyaXRlcyB3aGVuIHBsYXlpbmcgd2l0aCBhIGNhbGxiYWNrLgogICAgIGlmIChhdWRpb1N0cmVhbS0+aXNEYXRhQ2FsbGJhY2tBY3RpdmUoKSkgewotICAgICAgICBBTE9HRSgiQ2Fubm90IHdyaXRlIHRvIGEgY2FsbGJhY2sgc3RyZWFtIHdoZW4gcnVubmluZy4iKTsKKyAgICAgICAgQUxPR0QoIkNhbm5vdCB3cml0ZSB0byBhIGNhbGxiYWNrIHN0cmVhbSB3aGVuIHJ1bm5pbmcuIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAKQEAgLTQwOCw3ICs0MTYsOSBAQAogQUFVRElPX0FQSSBhYXVkaW9fZm9ybWF0X3QgQUF1ZGlvU3RyZWFtX2dldEZvcm1hdChBQXVkaW9TdHJlYW0qIHN0cmVhbSkKIHsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOwotICAgIHJldHVybiBhdWRpb1N0cmVhbS0+Z2V0Rm9ybWF0KCk7CisgICAgLy8gVXNlIGF1ZGlvX2Zvcm1hdF90IGludGVybmFsbHkuCisgICAgYXVkaW9fZm9ybWF0X3QgaW50ZXJuYWxGb3JtYXQgPSBhdWRpb1N0cmVhbS0+Z2V0Rm9ybWF0KCk7CisgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvRGF0YUZvcm1hdChpbnRlcm5hbEZvcm1hdCk7CiB9CiAKIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMoQUF1ZGlvU3RyZWFtKiBzdHJlYW0sCkBAIC00OTAsNiArNTAwLDEzIEBACiAgICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5nZXRJbnB1dFByZXNldCgpOwogfQogCitBQVVESU9fQVBJIGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3QgQUF1ZGlvU3RyZWFtX2dldEFsbG93ZWRDYXB0dXJlUG9saWN5KAorICAgICAgICBBQXVkaW9TdHJlYW0qIHN0cmVhbSkKK3sKKyAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOworICAgIHJldHVybiBhdWRpb1N0cmVhbS0+Z2V0QWxsb3dlZENhcHR1cmVQb2xpY3koKTsKK30KKwogQUFVRElPX0FQSSBpbnQzMl90IEFBdWRpb1N0cmVhbV9nZXRTZXNzaW9uSWQoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCiB7CiAgICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oc3RyZWFtKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcAppbmRleCBkNTY3MDFiLi5jOTcxMWRhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuY3BwCkBAIC0zNSwyOCArMzUsNDMgQEAKIEFBdWRpb1N0cmVhbVBhcmFtZXRlcnM6On5BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzKCkge30KIAogdm9pZCBBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzOjpjb3B5RnJvbShjb25zdCBBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzICZvdGhlcikgewotICAgIG1TYW1wbGVzUGVyRnJhbWUgPSBvdGhlci5tU2FtcGxlc1BlckZyYW1lOwotICAgIG1TYW1wbGVSYXRlICAgICAgPSBvdGhlci5tU2FtcGxlUmF0ZTsKLSAgICBtRGV2aWNlSWQgICAgICAgID0gb3RoZXIubURldmljZUlkOwotICAgIG1TZXNzaW9uSWQgICAgICAgPSBvdGhlci5tU2Vzc2lvbklkOwotICAgIG1TaGFyaW5nTW9kZSAgICAgPSBvdGhlci5tU2hhcmluZ01vZGU7Ci0gICAgbUF1ZGlvRm9ybWF0ICAgICA9IG90aGVyLm1BdWRpb0Zvcm1hdDsKLSAgICBtRGlyZWN0aW9uICAgICAgID0gb3RoZXIubURpcmVjdGlvbjsKLSAgICBtQnVmZmVyQ2FwYWNpdHkgID0gb3RoZXIubUJ1ZmZlckNhcGFjaXR5OwotICAgIG1Vc2FnZSAgICAgICAgICAgPSBvdGhlci5tVXNhZ2U7Ci0gICAgbUNvbnRlbnRUeXBlICAgICA9IG90aGVyLm1Db250ZW50VHlwZTsKLSAgICBtSW5wdXRQcmVzZXQgICAgID0gb3RoZXIubUlucHV0UHJlc2V0OworICAgIG1TYW1wbGVzUGVyRnJhbWUgICAgICA9IG90aGVyLm1TYW1wbGVzUGVyRnJhbWU7CisgICAgbVNhbXBsZVJhdGUgICAgICAgICAgID0gb3RoZXIubVNhbXBsZVJhdGU7CisgICAgbURldmljZUlkICAgICAgICAgICAgID0gb3RoZXIubURldmljZUlkOworICAgIG1TZXNzaW9uSWQgICAgICAgICAgICA9IG90aGVyLm1TZXNzaW9uSWQ7CisgICAgbVNoYXJpbmdNb2RlICAgICAgICAgID0gb3RoZXIubVNoYXJpbmdNb2RlOworICAgIG1BdWRpb0Zvcm1hdCAgICAgICAgICA9IG90aGVyLm1BdWRpb0Zvcm1hdDsKKyAgICBtRGlyZWN0aW9uICAgICAgICAgICAgPSBvdGhlci5tRGlyZWN0aW9uOworICAgIG1CdWZmZXJDYXBhY2l0eSAgICAgICA9IG90aGVyLm1CdWZmZXJDYXBhY2l0eTsKKyAgICBtVXNhZ2UgICAgICAgICAgICAgICAgPSBvdGhlci5tVXNhZ2U7CisgICAgbUNvbnRlbnRUeXBlICAgICAgICAgID0gb3RoZXIubUNvbnRlbnRUeXBlOworICAgIG1JbnB1dFByZXNldCAgICAgICAgICA9IG90aGVyLm1JbnB1dFByZXNldDsKKyAgICBtQWxsb3dlZENhcHR1cmVQb2xpY3kgPSBvdGhlci5tQWxsb3dlZENhcHR1cmVQb2xpY3k7Cit9CisKK3N0YXRpYyBhYXVkaW9fcmVzdWx0X3QgaXNGb3JtYXRWYWxpZChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9ERUZBVUxUOgorICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICBicmVhazsgLy8gdmFsaWQKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dEKCJhdWRpb0Zvcm1hdCBub3QgdmFsaWQsIGF1ZGlvX2Zvcm1hdF90ID0gMHglMDh4IiwgZm9ybWF0KTsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9GT1JNQVQ7CisgICAgICAgICAgICAvLyBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1N0cmVhbVBhcmFtZXRlcnM6OnZhbGlkYXRlKCkgY29uc3QgewogICAgIGlmIChtU2FtcGxlc1BlckZyYW1lICE9IEFBVURJT19VTlNQRUNJRklFRAogICAgICAgICAmJiAobVNhbXBsZXNQZXJGcmFtZSA8IFNBTVBMRVNfUEVSX0ZSQU1FX01JTiB8fCBtU2FtcGxlc1BlckZyYW1lID4gU0FNUExFU19QRVJfRlJBTUVfTUFYKSkgewotICAgICAgICBBTE9HRSgiY2hhbm5lbENvdW50IG91dCBvZiByYW5nZSA9ICVkIiwgbVNhbXBsZXNQZXJGcmFtZSk7CisgICAgICAgIEFMT0dEKCJjaGFubmVsQ291bnQgb3V0IG9mIHJhbmdlID0gJWQiLCBtU2FtcGxlc1BlckZyYW1lKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgfQogCiAgICAgaWYgKG1EZXZpY2VJZCA8IDApIHsKLSAgICAgICAgQUxPR0UoImRldmljZUlkIG91dCBvZiByYW5nZSA9ICVkIiwgbURldmljZUlkKTsKKyAgICAgICAgQUxPR0QoImRldmljZUlkIG91dCBvZiByYW5nZSA9ICVkIiwgbURldmljZUlkKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgfQogCkBAIC03NCwzMCArODksMjIgQEAKICAgICAgICAgY2FzZSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDoKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoImlsbGVnYWwgc2hhcmluZ01vZGUgPSAlZCIsIG1TaGFyaW5nTW9kZSk7CisgICAgICAgICAgICBBTE9HRCgiaWxsZWdhbCBzaGFyaW5nTW9kZSA9ICVkIiwgbVNoYXJpbmdNb2RlKTsKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKICAgICAgICAgICAgIC8vIGJyZWFrOwogICAgIH0KIAotICAgIHN3aXRjaCAobUF1ZGlvRm9ybWF0KSB7Ci0gICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDoKLSAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9JMTY6Ci0gICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6Ci0gICAgICAgICAgICBicmVhazsgLy8gdmFsaWQKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJhdWRpb0Zvcm1hdCBub3QgdmFsaWQgPSAlZCIsIG1BdWRpb0Zvcm1hdCk7Ci0gICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfRk9STUFUOwotICAgICAgICAgICAgLy8gYnJlYWs7Ci0gICAgfQorICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBpc0Zvcm1hdFZhbGlkIChtQXVkaW9Gb3JtYXQpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSByZXR1cm4gcmVzdWx0OwogCiAgICAgaWYgKG1TYW1wbGVSYXRlICE9IEFBVURJT19VTlNQRUNJRklFRAogICAgICAgICAmJiAobVNhbXBsZVJhdGUgPCBTQU1QTEVfUkFURV9IWl9NSU4gfHwgbVNhbXBsZVJhdGUgPiBTQU1QTEVfUkFURV9IWl9NQVgpKSB7Ci0gICAgICAgIEFMT0dFKCJzYW1wbGVSYXRlIG91dCBvZiByYW5nZSA9ICVkIiwgbVNhbXBsZVJhdGUpOworICAgICAgICBBTE9HRCgic2FtcGxlUmF0ZSBvdXQgb2YgcmFuZ2UgPSAlZCIsIG1TYW1wbGVSYXRlKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1JBVEU7CiAgICAgfQogCiAgICAgaWYgKG1CdWZmZXJDYXBhY2l0eSA8IDApIHsKLSAgICAgICAgQUxPR0UoImJ1ZmZlckNhcGFjaXR5IG91dCBvZiByYW5nZSA9ICVkIiwgbUJ1ZmZlckNhcGFjaXR5KTsKKyAgICAgICAgQUxPR0QoImJ1ZmZlckNhcGFjaXR5IG91dCBvZiByYW5nZSA9ICVkIiwgbUJ1ZmZlckNhcGFjaXR5KTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgfQogCkBAIC0xMDYsNyArMTEzLDcgQEAKICAgICAgICAgY2FzZSBBQVVESU9fRElSRUNUSU9OX09VVFBVVDoKICAgICAgICAgICAgIGJyZWFrOyAvLyB2YWxpZAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoImRpcmVjdGlvbiBub3QgdmFsaWQgPSAlZCIsIG1EaXJlY3Rpb24pOworICAgICAgICAgICAgQUxPR0QoImRpcmVjdGlvbiBub3QgdmFsaWQgPSAlZCIsIG1EaXJlY3Rpb24pOwogICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UOwogICAgICAgICAgICAgLy8gYnJlYWs7CiAgICAgfQpAQCAtMTI3LDcgKzEzNCw3IEBACiAgICAgICAgIGNhc2UgQUFVRElPX1VTQUdFX0FTU0lTVEFOVDoKICAgICAgICAgICAgIGJyZWFrOyAvLyB2YWxpZAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoInVzYWdlIG5vdCB2YWxpZCA9ICVkIiwgbVVzYWdlKTsKKyAgICAgICAgICAgIEFMT0dEKCJ1c2FnZSBub3QgdmFsaWQgPSAlZCIsIG1Vc2FnZSk7CiAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQ7CiAgICAgICAgICAgICAvLyBicmVhazsKICAgICB9CkBAIC0xNDAsNyArMTQ3LDcgQEAKICAgICAgICAgY2FzZSBBQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSDoKICAgICAgICAgICAgIGJyZWFrOyAvLyB2YWxpZAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoImNvbnRlbnQgdHlwZSBub3QgdmFsaWQgPSAlZCIsIG1Db250ZW50VHlwZSk7CisgICAgICAgICAgICBBTE9HRCgiY29udGVudCB0eXBlIG5vdCB2YWxpZCA9ICVkIiwgbUNvbnRlbnRUeXBlKTsKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKICAgICAgICAgICAgIC8vIGJyZWFrOwogICAgIH0KQEAgLTE1Miw5ICsxNTksMjIgQEAKICAgICAgICAgY2FzZSBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX0NPTU1VTklDQVRJT046CiAgICAgICAgIGNhc2UgQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9SRUNPR05JVElPTjoKICAgICAgICAgY2FzZSBBQVVESU9fSU5QVVRfUFJFU0VUX1VOUFJPQ0VTU0VEOgorICAgICAgICBjYXNlIEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUEVSRk9STUFOQ0U6CiAgICAgICAgICAgICBicmVhazsgLy8gdmFsaWQKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJpbnB1dCBwcmVzZXQgbm90IHZhbGlkID0gJWQiLCBtSW5wdXRQcmVzZXQpOworICAgICAgICAgICAgQUxPR0QoImlucHV0IHByZXNldCBub3QgdmFsaWQgPSAlZCIsIG1JbnB1dFByZXNldCk7CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQ7CisgICAgICAgICAgICAvLyBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1BbGxvd2VkQ2FwdHVyZVBvbGljeSkgeworICAgICAgICBjYXNlIEFBVURJT19VTlNQRUNJRklFRDoKKyAgICAgICAgY2FzZSBBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9BTEw6CisgICAgICAgIGNhc2UgQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfU1lTVEVNOgorICAgICAgICBjYXNlIEFBVURJT19BTExPV19DQVBUVVJFX0JZX05PTkU6CisgICAgICAgICAgICBicmVhazsgLy8gdmFsaWQKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dEKCJhbGxvd2VkIGNhcHR1cmUgcG9saWN5IG5vdCB2YWxpZCA9ICVkIiwgbUFsbG93ZWRDYXB0dXJlUG9saWN5KTsKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKICAgICAgICAgICAgIC8vIGJyZWFrOwogICAgIH0KQEAgLTE2MywxNSArMTgzLDE2IEBACiB9CiAKIHZvaWQgQUF1ZGlvU3RyZWFtUGFyYW1ldGVyczo6ZHVtcCgpIGNvbnN0IHsKLSAgICBBTE9HRCgibURldmljZUlkICAgICAgICA9ICU2ZCIsIG1EZXZpY2VJZCk7Ci0gICAgQUxPR0QoIm1TZXNzaW9uSWQgICAgICAgPSAlNmQiLCBtU2Vzc2lvbklkKTsKLSAgICBBTE9HRCgibVNhbXBsZVJhdGUgICAgICA9ICU2ZCIsIG1TYW1wbGVSYXRlKTsKLSAgICBBTE9HRCgibVNhbXBsZXNQZXJGcmFtZSA9ICU2ZCIsIG1TYW1wbGVzUGVyRnJhbWUpOwotICAgIEFMT0dEKCJtU2hhcmluZ01vZGUgICAgID0gJTZkIiwgKGludCltU2hhcmluZ01vZGUpOwotICAgIEFMT0dEKCJtQXVkaW9Gb3JtYXQgICAgID0gJTZkIiwgKGludCltQXVkaW9Gb3JtYXQpOwotICAgIEFMT0dEKCJtRGlyZWN0aW9uICAgICAgID0gJTZkIiwgbURpcmVjdGlvbik7Ci0gICAgQUxPR0QoIm1CdWZmZXJDYXBhY2l0eSAgPSAlNmQiLCBtQnVmZmVyQ2FwYWNpdHkpOwotICAgIEFMT0dEKCJtVXNhZ2UgICAgICAgICAgID0gJTZkIiwgbVVzYWdlKTsKLSAgICBBTE9HRCgibUNvbnRlbnRUeXBlICAgICA9ICU2ZCIsIG1Db250ZW50VHlwZSk7Ci0gICAgQUxPR0QoIm1JbnB1dFByZXNldCAgICAgPSAlNmQiLCBtSW5wdXRQcmVzZXQpOworICAgIEFMT0dEKCJtRGV2aWNlSWQgICAgICAgICAgICAgPSAlNmQiLCBtRGV2aWNlSWQpOworICAgIEFMT0dEKCJtU2Vzc2lvbklkICAgICAgICAgICAgPSAlNmQiLCBtU2Vzc2lvbklkKTsKKyAgICBBTE9HRCgibVNhbXBsZVJhdGUgICAgICAgICAgID0gJTZkIiwgbVNhbXBsZVJhdGUpOworICAgIEFMT0dEKCJtU2FtcGxlc1BlckZyYW1lICAgICAgPSAlNmQiLCBtU2FtcGxlc1BlckZyYW1lKTsKKyAgICBBTE9HRCgibVNoYXJpbmdNb2RlICAgICAgICAgID0gJTZkIiwgKGludCltU2hhcmluZ01vZGUpOworICAgIEFMT0dEKCJtQXVkaW9Gb3JtYXQgICAgICAgICAgPSAlNmQiLCAoaW50KW1BdWRpb0Zvcm1hdCk7CisgICAgQUxPR0QoIm1EaXJlY3Rpb24gICAgICAgICAgICA9ICU2ZCIsIG1EaXJlY3Rpb24pOworICAgIEFMT0dEKCJtQnVmZmVyQ2FwYWNpdHkgICAgICAgPSAlNmQiLCBtQnVmZmVyQ2FwYWNpdHkpOworICAgIEFMT0dEKCJtVXNhZ2UgICAgICAgICAgICAgICAgPSAlNmQiLCBtVXNhZ2UpOworICAgIEFMT0dEKCJtQ29udGVudFR5cGUgICAgICAgICAgPSAlNmQiLCBtQ29udGVudFR5cGUpOworICAgIEFMT0dEKCJtSW5wdXRQcmVzZXQgICAgICAgICAgPSAlNmQiLCBtSW5wdXRQcmVzZXQpOworICAgIEFMT0dEKCJtQWxsb3dlZENhcHR1cmVQb2xpY3kgPSAlNmQiLCBtQWxsb3dlZENhcHR1cmVQb2xpY3kpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmgKaW5kZXggY2U1ZGFjZC4uMmUyMWE4ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5oCkBAIC01NiwxMSArNTYsMTEgQEAKICAgICAgICAgbVNhbXBsZXNQZXJGcmFtZSA9IHNhbXBsZXNQZXJGcmFtZTsKICAgICB9CiAKLSAgICBhYXVkaW9fZm9ybWF0X3QgZ2V0Rm9ybWF0KCkgY29uc3QgeworICAgIGF1ZGlvX2Zvcm1hdF90IGdldEZvcm1hdCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1BdWRpb0Zvcm1hdDsKICAgICB9CiAKLSAgICB2b2lkIHNldEZvcm1hdChhYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQpIHsKKyAgICB2b2lkIHNldEZvcm1hdChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCkgewogICAgICAgICBtQXVkaW9Gb3JtYXQgPSBhdWRpb0Zvcm1hdDsKICAgICB9CiAKQEAgLTExMiw2ICsxMTIsMTQgQEAKICAgICAgICAgbUlucHV0UHJlc2V0ID0gaW5wdXRQcmVzZXQ7CiAgICAgfQogCisgICAgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBnZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BbGxvd2VkQ2FwdHVyZVBvbGljeTsKKyAgICB9CisKKyAgICB2b2lkIHNldEFsbG93ZWRDYXB0dXJlUG9saWN5KGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3QgcG9saWN5KSB7CisgICAgICAgIG1BbGxvd2VkQ2FwdHVyZVBvbGljeSA9IHBvbGljeTsKKyAgICB9CisKICAgICBhYXVkaW9fc2Vzc2lvbl9pZF90IGdldFNlc3Npb25JZCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1TZXNzaW9uSWQ7CiAgICAgfQpAQCAtMTIwLDggKzEyOCwxMSBAQAogICAgICAgICBtU2Vzc2lvbklkID0gc2Vzc2lvbklkOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gYnl0ZXMgcGVyIGZyYW1lIG9mIGdldEZvcm1hdCgpCisgICAgICovCiAgICAgaW50MzJfdCBjYWxjdWxhdGVCeXRlc1BlckZyYW1lKCkgY29uc3QgewotICAgICAgICByZXR1cm4gZ2V0U2FtcGxlc1BlckZyYW1lKCkgKiBBQXVkaW9Db252ZXJ0X2Zvcm1hdFRvU2l6ZUluQnl0ZXMoZ2V0Rm9ybWF0KCkpOworICAgICAgICByZXR1cm4gZ2V0U2FtcGxlc1BlckZyYW1lKCkgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGdldEZvcm1hdCgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEzNSwxNyArMTQ2LDE4IEBACiAgICAgdm9pZCBkdW1wKCkgY29uc3Q7CiAKIHByaXZhdGU6Ci0gICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgbVNhbXBsZXNQZXJGcmFtZSA9IEFBVURJT19VTlNQRUNJRklFRDsKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwotICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VJZCAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7Ci0gICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90ICAgICAgbVNoYXJpbmdNb2RlICAgICA9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOwotICAgIGFhdWRpb19mb3JtYXRfdCAgICAgICAgICAgIG1BdWRpb0Zvcm1hdCAgICAgPSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOwotICAgIGFhdWRpb19kaXJlY3Rpb25fdCAgICAgICAgIG1EaXJlY3Rpb24gICAgICAgPSBBQVVESU9fRElSRUNUSU9OX09VVFBVVDsKLSAgICBhYXVkaW9fdXNhZ2VfdCAgICAgICAgICAgICBtVXNhZ2UgICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwotICAgIGFhdWRpb19jb250ZW50X3R5cGVfdCAgICAgIG1Db250ZW50VHlwZSAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7Ci0gICAgYWF1ZGlvX2lucHV0X3ByZXNldF90ICAgICAgbUlucHV0UHJlc2V0ICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtQnVmZmVyQ2FwYWNpdHkgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwotICAgIGFhdWRpb19zZXNzaW9uX2lkX3QgICAgICAgIG1TZXNzaW9uSWQgICAgICAgPSBBQVVESU9fU0VTU0lPTl9JRF9OT05FOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZXNQZXJGcmFtZSAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUgICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgbURldmljZUlkICAgICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCAgICAgICAgICAgbVNoYXJpbmdNb2RlICAgICAgICAgID0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQ7CisgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICAgICAgICBtQXVkaW9Gb3JtYXQgICAgICAgICAgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKKyAgICBhYXVkaW9fZGlyZWN0aW9uX3QgICAgICAgICAgICAgIG1EaXJlY3Rpb24gICAgICAgICAgICA9IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUOworICAgIGFhdWRpb191c2FnZV90ICAgICAgICAgICAgICAgICAgbVVzYWdlICAgICAgICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGFhdWRpb19jb250ZW50X3R5cGVfdCAgICAgICAgICAgbUNvbnRlbnRUeXBlICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGFhdWRpb19pbnB1dF9wcmVzZXRfdCAgICAgICAgICAgbUlucHV0UHJlc2V0ICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlckNhcGFjaXR5ICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3QgbUFsbG93ZWRDYXB0dXJlUG9saWN5ID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGFhdWRpb19zZXNzaW9uX2lkX3QgICAgICAgICAgICAgbVNlc3Npb25JZCAgICAgICAgICAgID0gQUFVRElPX1NFU1NJT05fSURfTk9ORTsKIH07CiAKIH0gLyogbmFtZXNwYWNlIGFhdWRpbyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5jcHAKaW5kZXggMzU4MDIxYi4uMjU2NjliZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uY3BwCkBAIC0yOCwxNiArMjgsMjMgQEAKIAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsKIAorCisvLyBTZXF1ZW50aWFsIG51bWJlciBhc3NpZ25lZCB0byBzdHJlYW1zIHNvbGVseSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorc3RhdGljIGFhdWRpb19zdHJlYW1faWRfdCBBQXVkaW9fZ2V0TmV4dFN0cmVhbUlkKCkgeworICAgIHN0YXRpYyBzdGQ6OmF0b21pYyA8YWF1ZGlvX3N0cmVhbV9pZF90PiBuZXh0U3RyZWFtSWR7MX07CisgICAgcmV0dXJuIG5leHRTdHJlYW1JZCsrOworfQorCiBBdWRpb1N0cmVhbTo6QXVkaW9TdHJlYW0oKQogICAgICAgICA6IG1QbGF5ZXJCYXNlKG5ldyBNeVBsYXllckJhc2UodGhpcykpCi17CisgICAgICAgICwgbVN0cmVhbUlkKEFBdWRpb19nZXROZXh0U3RyZWFtSWQoKSkKKyAgICAgICAgewogICAgIC8vIG1UaHJlYWQgaXMgYSBwdGhyZWFkX3Qgb2YgdW5rbm93biBzaXplIHNvIHdlIG5lZWQgbWVtc2V0LgogICAgIG1lbXNldCgmbVRocmVhZCwgMCwgc2l6ZW9mKG1UaHJlYWQpKTsKICAgICBzZXRQZXJpb2ROYW5vc2Vjb25kcygwKTsKIH0KIAogQXVkaW9TdHJlYW06On5BdWRpb1N0cmVhbSgpIHsKLSAgICBBTE9HRCgiZGVzdHJveWluZyAlcCwgc3RhdGUgPSAlcyIsIHRoaXMsIEFBdWRpb19jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQoZ2V0U3RhdGUoKSkpOwogICAgIC8vIElmIHRoZSBzdHJlYW0gaXMgZGVsZXRlZCB3aGVuIE9QRU4gb3IgaW4gdXNlIHRoZW4gYXVkaW8gcmVzb3VyY2VzIHdpbGwgbGVhay4KICAgICAvLyBUaGlzIHdvdWxkIGluZGljYXRlIGFuIGludGVybmFsIGVycm9yLiBTbyB3ZSB3YW50IHRvIGZpbmQgdGhpcyBBU0FQLgogICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIShnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VECkBAIC00OSwyMiArNTYsNiBAQAogICAgIG1QbGF5ZXJCYXNlLT5jbGVhclBhcmVudFJlZmVyZW5jZSgpOyAvLyByZW1vdmUgcmVmZXJlbmNlIHRvIHRoaXMgQXVkaW9TdHJlYW0KIH0KIAotc3RhdGljIGNvbnN0IGNoYXIgKkF1ZGlvU3RyZWFtX2NvbnZlcnRTaGFyaW5nTW9kZVRvU2hvcnRUZXh0KGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSkgewotICAgIGNvbnN0IGNoYXIgKnJlc3VsdDsKLSAgICBzd2l0Y2ggKHNoYXJpbmdNb2RlKSB7Ci0gICAgICAgIGNhc2UgQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU6Ci0gICAgICAgICAgICByZXN1bHQgPSAiRVgiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQ6Ci0gICAgICAgICAgICByZXN1bHQgPSAiU0giOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXN1bHQgPSAiPyEiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6b3Blbihjb25zdCBBdWRpb1N0cmVhbUJ1aWxkZXImIGJ1aWxkZXIpCiB7CiAgICAgLy8gQ2FsbCBoZXJlIGFzIHdlbGwgYmVjYXVzZSB0aGUgQUF1ZGlvU2VydmljZSB3aWxsIGNhbGwgdGhpcyB3aXRob3V0IGNhbGxpbmcgYnVpbGQoKS4KQEAgLTk1LDYgKzg2LDEwIEBACiAgICAgaWYgKG1JbnB1dFByZXNldCA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKICAgICAgICAgbUlucHV0UHJlc2V0ID0gQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9SRUNPR05JVElPTjsKICAgICB9CisgICAgbUFsbG93ZWRDYXB0dXJlUG9saWN5ID0gYnVpbGRlci5nZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSgpOworICAgIGlmIChtQWxsb3dlZENhcHR1cmVQb2xpY3kgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CisgICAgICAgIG1BbGxvd2VkQ2FwdHVyZVBvbGljeSA9IEFBVURJT19BTExPV19DQVBUVVJFX0JZX0FMTDsKKyAgICB9CiAKICAgICAvLyBjYWxsYmFja3MKICAgICBtRnJhbWVzUGVyRGF0YUNhbGxiYWNrID0gYnVpbGRlci5nZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soKTsKQEAgLTEwMywzOCArOTgsMzIgQEAKICAgICBtRGF0YUNhbGxiYWNrVXNlckRhdGEgPSBidWlsZGVyLmdldERhdGFDYWxsYmFja1VzZXJEYXRhKCk7CiAgICAgbUVycm9yQ2FsbGJhY2tVc2VyRGF0YSA9IGJ1aWxkZXIuZ2V0RXJyb3JDYWxsYmFja1VzZXJEYXRhKCk7CiAKLSAgICAvLyBUaGlzIGlzIHZlcnkgaGVscGZ1bCBmb3IgZGVidWdnaW5nIGluIHRoZSBmdXR1cmUuIFBsZWFzZSBsZWF2ZSBpdCBpbi4KLSAgICBBTE9HSSgib3BlbigpIHJhdGUgICA9ICVkLCBjaGFubmVscyAgICA9ICVkLCBmb3JtYXQgICA9ICVkLCBzaGFyaW5nID0gJXMsIGRpciA9ICVzIiwKLSAgICAgICAgICBtU2FtcGxlUmF0ZSwgbVNhbXBsZXNQZXJGcmFtZSwgbUZvcm1hdCwKLSAgICAgICAgICBBdWRpb1N0cmVhbV9jb252ZXJ0U2hhcmluZ01vZGVUb1Nob3J0VGV4dChtU2hhcmluZ01vZGUpLAotICAgICAgICAgIChnZXREaXJlY3Rpb24oKSA9PSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCkgPyAiT1VUUFVUIiA6ICJJTlBVVCIpOwotICAgIEFMT0dJKCJvcGVuKCkgZGV2aWNlID0gJWQsIHNlc3Npb25JZCAgID0gJWQsIHBlcmZNb2RlID0gJWQsIGNhbGxiYWNrOiAlcyB3aXRoIGZyYW1lcyA9ICVkIiwKLSAgICAgICAgICBtRGV2aWNlSWQsCi0gICAgICAgICAgbVNlc3Npb25JZCwKLSAgICAgICAgICBtUGVyZm9ybWFuY2VNb2RlLAotICAgICAgICAgIChpc0RhdGFDYWxsYmFja1NldCgpID8gIk9OIiA6ICJPRkYiKSwKLSAgICAgICAgICBtRnJhbWVzUGVyRGF0YUNhbGxiYWNrKTsKLSAgICBBTE9HSSgib3BlbigpIHVzYWdlICA9ICVkLCBjb250ZW50VHlwZSA9ICVkLCBpbnB1dFByZXNldCA9ICVkIiwKLSAgICAgICAgICBtVXNhZ2UsIG1Db250ZW50VHlwZSwgbUlucHV0UHJlc2V0KTsKLQogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c2FmZVN0YXJ0KCkgeworYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzeXN0ZW1TdGFydCgpIHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RyZWFtTG9jayk7CisKICAgICBpZiAoY29sbGlkZXNXaXRoQ2FsbGJhY2soKSkgewogICAgICAgICBBTE9HRSgiJXMgY2Fubm90IGJlIGNhbGxlZCBmcm9tIGEgY2FsbGJhY2shIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQotICAgIHJldHVybiByZXF1ZXN0U3RhcnQoKTsKKworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSByZXF1ZXN0U3RhcnQoKTsKKyAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICAvLyBXZSBvbmx5IGNhbGwgdGhpcyBmb3IgbG9nZ2luZyBpbiAiZHVtcHN5cyBhdWRpbyIuIFNvIGlnbm9yZSByZXR1cm4gY29kZS4KKyAgICAgICAgKHZvaWQpIG1QbGF5ZXJCYXNlLT5zdGFydCgpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCi1hYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OnNhZmVQYXVzZSgpIHsKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c3lzdGVtUGF1c2UoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbUxvY2spOworCiAgICAgaWYgKCFpc1BhdXNlU3VwcG9ydGVkKCkpIHsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTklNUExFTUVOVEVEOwogICAgIH0KIAotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1Mb2NrKTsKICAgICBpZiAoY29sbGlkZXNXaXRoQ2FsbGJhY2soKSkgewogICAgICAgICBBTE9HRSgiJXMgY2Fubm90IGJlIGNhbGxlZCBmcm9tIGEgY2FsbGJhY2shIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CkBAIC0xNzAsNyArMTU5LDEyIEBACiAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogCi0gICAgcmV0dXJuIHJlcXVlc3RQYXVzZSgpOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSByZXF1ZXN0UGF1c2UoKTsKKyAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICAvLyBXZSBvbmx5IGNhbGwgdGhpcyBmb3IgbG9nZ2luZyBpbiAiZHVtcHN5cyBhdWRpbyIuIFNvIGlnbm9yZSByZXR1cm4gY29kZS4KKyAgICAgICAgKHZvaWQpIG1QbGF5ZXJCYXNlLT5wYXVzZSgpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OnNhZmVGbHVzaCgpIHsKQEAgLTE5MywxMiArMTg3LDMxIEBACiAgICAgcmV0dXJuIHJlcXVlc3RGbHVzaCgpOwogfQogCi1hYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OnNhZmVTdG9wKCkgeworYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzeXN0ZW1TdG9wRnJvbUNhbGxiYWNrKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1Mb2NrKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gc2FmZVN0b3AoKTsKKyAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICAvLyBXZSBvbmx5IGNhbGwgdGhpcyBmb3IgbG9nZ2luZyBpbiAiZHVtcHN5cyBhdWRpbyIuIFNvIGlnbm9yZSByZXR1cm4gY29kZS4KKyAgICAgICAgKHZvaWQpIG1QbGF5ZXJCYXNlLT5zdG9wKCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c3lzdGVtU3RvcEZyb21BcHAoKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbUxvY2spOwogICAgIGlmIChjb2xsaWRlc1dpdGhDYWxsYmFjaygpKSB7Ci0gICAgICAgIEFMT0dFKCJzdHJlYW0gY2Fubm90IGJlIHN0b3BwZWQgZnJvbSBhIGNhbGxiYWNrISIpOworICAgICAgICBBTE9HRSgic3RyZWFtIGNhbm5vdCBiZSBzdG9wcGVkIGJ5IGNhbGxpbmcgZnJvbSBhIGNhbGxiYWNrISIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQorICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzYWZlU3RvcCgpOworICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgIC8vIFdlIG9ubHkgY2FsbCB0aGlzIGZvciBsb2dnaW5nIGluICJkdW1wc3lzIGF1ZGlvIi4gU28gaWdub3JlIHJldHVybiBjb2RlLgorICAgICAgICAodm9pZCkgbVBsYXllckJhc2UtPnN0b3AoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzYWZlU3RvcCgpIHsKIAogICAgIHN3aXRjaCAoZ2V0U3RhdGUoKSkgewogICAgICAgICAvLyBQcm9jZWVkIHdpdGggc3RvcHBpbmcuCkBAIC0yMjUsNyArMjM4LDcgQEAKICAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NJTkc6CiAgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQ6CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVygicmVxdWVzdFN0b3AoKSBzdHJlYW0gbm90IHJ1bm5pbmcsIHN0YXRlID0gJXMiLAorICAgICAgICAgICAgQUxPR1coIiVzKCkgc3RyZWFtIG5vdCBydW5uaW5nLCBzdGF0ZSA9ICVzIiwgX19mdW5jX18sCiAgICAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KGdldFN0YXRlKCkpKTsKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CkBAIC0yNDMsMTUgKzI1NiwxNSBAQAogfQogCiB2b2lkIEF1ZGlvU3RyZWFtOjpzZXRTdGF0ZShhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGUpIHsKLSAgICBBTE9HVigiJXMoJXApIGZyb20gJWQgdG8gJWQiLCBfX2Z1bmNfXywgdGhpcywgbVN0YXRlLCBzdGF0ZSk7CisgICAgQUxPR1YoIiVzKCVkKSBmcm9tICVkIHRvICVkIiwgX19mdW5jX18sIGdldElkKCksIG1TdGF0ZSwgc3RhdGUpOwogICAgIC8vIENMT1NFRCBpcyBhIGZpbmFsIHN0YXRlCiAgICAgaWYgKG1TdGF0ZSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRCkgewotICAgICAgICBBTE9HRSgiJXMoJXApIHRyaWVkIHRvIHNldCB0byAlZCBidXQgYWxyZWFkeSBDTE9TRUQiLCBfX2Z1bmNfXywgdGhpcywgc3RhdGUpOworICAgICAgICBBTE9HRSgiJXMoJWQpIHRyaWVkIHRvIHNldCB0byAlZCBidXQgYWxyZWFkeSBDTE9TRUQiLCBfX2Z1bmNfXywgZ2V0SWQoKSwgc3RhdGUpOwogCiAgICAgLy8gT25jZSBESVNDT05ORUNURUQsIHdlIGNhbiBvbmx5IG1vdmUgdG8gQ0xPU0VEIHN0YXRlLgogICAgIH0gZWxzZSBpZiAobVN0YXRlID09IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVECiAgICAgICAgICAgICAgICAmJiBzdGF0ZSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRCkgewotICAgICAgICBBTE9HRSgiJXMoJXApIHRyaWVkIHRvIHNldCB0byAlZCBidXQgYWxyZWFkeSBESVNDT05ORUNURUQiLCBfX2Z1bmNfXywgdGhpcywgc3RhdGUpOworICAgICAgICBBTE9HRSgiJXMoJWQpIHRyaWVkIHRvIHNldCB0byAlZCBidXQgYWxyZWFkeSBESVNDT05ORUNURUQiLCBfX2Z1bmNfXywgZ2V0SWQoKSwgc3RhdGUpOwogCiAgICAgfSBlbHNlIHsKICAgICAgICAgbVN0YXRlID0gc3RhdGU7CkBAIC0zNTAsMjEgKzM2MywzMyBAQAogICAgIH0KIH0KIAotYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpqb2luVGhyZWFkKHZvaWQqKiByZXR1cm5BcmcsIGludDY0X3QgdGltZW91dE5hbm9zZWNvbmRzKQorYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpqb2luVGhyZWFkKHZvaWQqKiByZXR1cm5BcmcsIGludDY0X3QgdGltZW91dE5hbm9zZWNvbmRzIF9fdW51c2VkKQogewogICAgIGlmICghbUhhc1RocmVhZCkgewogICAgICAgICBBTE9HRSgiam9pblRocmVhZCgpIC0gYnV0IGhhcyBubyB0aHJlYWQiKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOworICAgIC8vIElmIHRoZSBjYWxsYmFjayBpcyBzdG9wcGluZyB0aGUgc3RyZWFtIGJlY2F1c2UgdGhlIGFwcCBwYXNzZWQgYmFjayBTVE9QCisgICAgLy8gdGhlbiB3ZSBkb24ndCBuZWVkIHRvIGpvaW4oKS4gVGhlIHRocmVhZCBpcyBhbHJlYWR5IGFib3V0IHRvIGV4aXQuCisgICAgaWYgKHB0aHJlYWRfc2VsZigpICE9IG1UaHJlYWQpIHsKKyAgICAgICAgLy8gQ2FsbGVkIGZyb20gYW4gYXBwIHRocmVhZC4gTm90IHRoZSBjYWxsYmFjay4KICNpZiAwCi0gICAgLy8gVE9ETyBpbXBsZW1lbnQgZXF1aXZhbGVudCBvZiBwdGhyZWFkX3RpbWVkam9pbl9ucCgpCi0gICAgc3RydWN0IHRpbWVzcGVjIGFic3RpbWU7Ci0gICAgaW50IGVyciA9IHB0aHJlYWRfdGltZWRqb2luX25wKG1UaHJlYWQsIHJldHVybkFyZywgJmFic3RpbWUpOworICAgICAgICAvLyBUT0RPIGltcGxlbWVudCBlcXVpdmFsZW50IG9mIHB0aHJlYWRfdGltZWRqb2luX25wKCkKKyAgICAgICAgc3RydWN0IHRpbWVzcGVjIGFic3RpbWU7CisgICAgICAgIGludCBlcnIgPSBwdGhyZWFkX3RpbWVkam9pbl9ucChtVGhyZWFkLCByZXR1cm5BcmcsICZhYnN0aW1lKTsKICNlbHNlCi0gICAgaW50IGVyciA9IHB0aHJlYWRfam9pbihtVGhyZWFkLCByZXR1cm5BcmcpOworICAgICAgICBpbnQgZXJyID0gcHRocmVhZF9qb2luKG1UaHJlYWQsIHJldHVybkFyZyk7CiAjZW5kaWYKKyAgICAgICAgaWYgKGVycikgeworICAgICAgICAgICAgQUxPR0UoIiVzKCkgcHRocmVhZF9qb2luKCkgcmV0dXJucyBlcnIgPSAlZCIsIF9fZnVuY19fLCBlcnIpOworICAgICAgICAgICAgcmVzdWx0ID0gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoLWVycik7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gVGhpcyBtdXN0IGJlIHNldCBmYWxzZSBzbyB0aGF0IHRoZSBjYWxsYmFjayB0aHJlYWQgY2FuIGJlIGNyZWF0ZWQKKyAgICAvLyB3aGVuIHRoZSBzdHJlYW0gaXMgcmVzdGFydGVkLgogICAgIG1IYXNUaHJlYWQgPSBmYWxzZTsKLSAgICByZXR1cm4gZXJyID8gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoLWVycm5vKSA6IG1UaHJlYWRSZWdpc3RyYXRpb25SZXN1bHQ7CisgICAgcmV0dXJuIChyZXN1bHQgIT0gQUFVRElPX09LKSA/IHJlc3VsdCA6IG1UaHJlYWRSZWdpc3RyYXRpb25SZXN1bHQ7CiB9CiAKIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjptYXliZUNhbGxEYXRhQ2FsbGJhY2sodm9pZCAqYXVkaW9EYXRhLApAQCAtNDM4LDcgKzQ2Myw2IEBACiB9CiAKIEF1ZGlvU3RyZWFtOjpNeVBsYXllckJhc2U6On5NeVBsYXllckJhc2UoKSB7Ci0gICAgQUxPR1YoIk15UGxheWVyQmFzZTo6fk15UGxheWVyQmFzZSglcCkgZGVsZXRlZCIsIHRoaXMpOwogfQogCiB2b2lkIEF1ZGlvU3RyZWFtOjpNeVBsYXllckJhc2U6OnJlZ2lzdGVyV2l0aEF1ZGlvTWFuYWdlcigpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmgKaW5kZXggMzFiODk1Yy4uMDQ0Yzk3OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmgKQEAgLTM2LDYgKzM2LDcgQEAKIG5hbWVzcGFjZSBhYXVkaW8gewogCiB0eXBlZGVmIHZvaWQgKigqYWF1ZGlvX2F1ZGlvX3RocmVhZF9wcm9jX3QpKHZvaWQgKik7Cit0eXBlZGVmIHVpbnQzMl90IGFhdWRpb19zdHJlYW1faWRfdDsKIAogY2xhc3MgQXVkaW9TdHJlYW1CdWlsZGVyOwogCkBAIC01MSwyMSArNTIsNiBAQAogCiAgICAgdmlydHVhbCB+QXVkaW9TdHJlYW0oKTsKIAotICAgIC8qKgotICAgICAqIExvY2sgYSBtdXRleCBhbmQgbWFrZSBzdXJlIHdlIGFyZSBub3QgY2FsbGluZyBmcm9tIGEgY2FsbGJhY2sgZnVuY3Rpb24uCi0gICAgICogQHJldHVybiByZXN1bHQgb2YgcmVxdWVzdFN0YXJ0KCk7Ci0gICAgICovCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHNhZmVTdGFydCgpOwotCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHNhZmVQYXVzZSgpOwotCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHNhZmVGbHVzaCgpOwotCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHNhZmVTdG9wKCk7Ci0KLSAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZUNsb3NlKCk7Ci0KLSAgICAvLyA9PT09PT09PT09PSBCZWdpbiBBQlNUUkFDVCBtZXRob2RzID09PT09PT09PT09PT09PT09PT09PT09PT09PQogcHJvdGVjdGVkOgogCiAgICAgLyogQXN5bmNocm9ub3VzIHJlcXVlc3RzLgpAQCAtNzQsNyArNjAsNyBAQAogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHJlcXVlc3RTdGFydCgpID0gMDsKIAogICAgIC8qKgotICAgICAqIENoZWNrIHRoZSBzdGF0ZSB0byBzZWUgaWYgUGF1c2UgaWYgY3VycmVudGx5IGxlZ2FsLgorICAgICAqIENoZWNrIHRoZSBzdGF0ZSB0byBzZWUgaWYgUGF1c2UgaXMgY3VycmVudGx5IGxlZ2FsLgogICAgICAqCiAgICAgICogQHBhcmFtIHJlc3VsdCBwb2ludGVyIHRvIHJldHVybiBjb2RlCiAgICAgICogQHJldHVybiB0cnVlIGlmIE9LIHRvIGNvbnRpbnVlLCBpZiBmYWxzZSB0aGVuIHJldHVybiByZXN1bHQKQEAgLTEzNiw2ICsxMjIsMTIgQEAKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKICAgICB9CiAKKyAgICAvLyBUaGlzIGlzIG9ubHkgdXNlZCB0byBpZGVudGlmeSBhIHN0cmVhbSBpbiB0aGUgbG9ncyB3aXRob3V0CisgICAgLy8gcmV2ZWFsaW5nIGFueSBwb2ludGVycy4KKyAgICBhYXVkaW9fc3RyZWFtX2lkX3QgZ2V0SWQoKSB7CisgICAgICAgIHJldHVybiBtU3RyZWFtSWQ7CisgICAgfQorCiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3Qgc2V0QnVmZmVyU2l6ZShpbnQzMl90IHJlcXVlc3RlZEZyYW1lcykgPSAwOwogCiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgY3JlYXRlVGhyZWFkKGludDY0X3QgcGVyaW9kTmFub3NlY29uZHMsCkBAIC0xOTIsNyArMTg0LDcgQEAKICAgICAgICAgcmV0dXJuIG1TYW1wbGVSYXRlOwogICAgIH0KIAotICAgIGFhdWRpb19mb3JtYXRfdCBnZXRGb3JtYXQoKSAgY29uc3QgeworICAgIGF1ZGlvX2Zvcm1hdF90IGdldEZvcm1hdCgpICBjb25zdCB7CiAgICAgICAgIHJldHVybiBtRm9ybWF0OwogICAgIH0KIApAQCAtMjM0LDYgKzIyNiwxMCBAQAogICAgICAgICByZXR1cm4gbUlucHV0UHJlc2V0OwogICAgIH0KIAorICAgIGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3QgZ2V0QWxsb3dlZENhcHR1cmVQb2xpY3koKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQWxsb3dlZENhcHR1cmVQb2xpY3k7CisgICAgfQorCiAgICAgaW50MzJfdCBnZXRTZXNzaW9uSWQoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtU2Vzc2lvbklkOwogICAgIH0KQEAgLTI0OSwyMSArMjQ1LDE0IEBACiAgICAgICogVGhpcyBpcyBvbmx5IHZhbGlkIGFmdGVyIHNldEZvcm1hdCgpIGhhcyBiZWVuIGNhbGxlZC4KICAgICAgKi8KICAgICBpbnQzMl90IGdldEJ5dGVzUGVyU2FtcGxlKCkgY29uc3QgewotICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9mb3JtYXRUb1NpemVJbkJ5dGVzKG1Gb3JtYXQpOworICAgICAgICByZXR1cm4gYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtRm9ybWF0KTsKICAgICB9CiAKICAgICAvKioKICAgICAgKiBUaGlzIGlzIG9ubHkgdmFsaWQgYWZ0ZXIgc2V0U2FtcGxlc1BlckZyYW1lKCkgYW5kIHNldERldmljZUZvcm1hdCgpIGhhdmUgYmVlbiBjYWxsZWQuCiAgICAgICovCiAgICAgaW50MzJfdCBnZXRCeXRlc1BlckRldmljZUZyYW1lKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVNhbXBsZXNQZXJGcmFtZSAqIGdldEJ5dGVzUGVyRGV2aWNlU2FtcGxlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBpcyBvbmx5IHZhbGlkIGFmdGVyIHNldERldmljZUZvcm1hdCgpIGhhcyBiZWVuIGNhbGxlZC4KLSAgICAgKi8KLSAgICBpbnQzMl90IGdldEJ5dGVzUGVyRGV2aWNlU2FtcGxlKCkgY29uc3QgewotICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9mb3JtYXRUb1NpemVJbkJ5dGVzKGdldERldmljZUZvcm1hdCgpKTsKKyAgICAgICAgcmV0dXJuIGdldFNhbXBsZXNQZXJGcmFtZSgpICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShnZXREZXZpY2VGb3JtYXQoKSk7CiAgICAgfQogCiAgICAgdmlydHVhbCBpbnQ2NF90IGdldEZyYW1lc1dyaXR0ZW4oKSA9IDA7CkBAIC0zNjMsMzMgKzM1MiwyOCBAQAogICAgICAgICBtUGxheWVyQmFzZS0+dW5yZWdpc3RlcldpdGhBdWRpb01hbmFnZXIoKTsKICAgICB9CiAKLSAgICAvLyBQYXNzIHN0YXJ0IHJlcXVlc3QgdGhyb3VnaCBQbGF5ZXJCYXNlIGZvciB0cmFja2luZy4KLSAgICBhYXVkaW9fcmVzdWx0X3Qgc3lzdGVtU3RhcnQoKSB7Ci0gICAgICAgIG1QbGF5ZXJCYXNlLT5zdGFydCgpOwotICAgICAgICAvLyBQYXNzIGFhdWRpb19yZXN1bHRfdCBhcm91bmQgdGhlIFBsYXllckJhc2UgaW50ZXJmYWNlLCB3aGljaCB1c2VzIHN0YXR1c19fdC4KLSAgICAgICAgcmV0dXJuIG1QbGF5ZXJCYXNlLT5nZXRSZXN1bHQoKTsKLSAgICB9CisgICAgYWF1ZGlvX3Jlc3VsdF90IHN5c3RlbVN0YXJ0KCk7CiAKLSAgICAvLyBQYXNzIHBhdXNlIHJlcXVlc3QgdGhyb3VnaCBQbGF5ZXJCYXNlIGZvciB0cmFja2luZy4KLSAgICBhYXVkaW9fcmVzdWx0X3Qgc3lzdGVtUGF1c2UoKSB7Ci0gICAgICAgIG1QbGF5ZXJCYXNlLT5wYXVzZSgpOwotICAgICAgICByZXR1cm4gbVBsYXllckJhc2UtPmdldFJlc3VsdCgpOwotICAgIH0KKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3lzdGVtUGF1c2UoKTsKIAotICAgIC8vIFBhc3Mgc3RvcCByZXF1ZXN0IHRocm91Z2ggUGxheWVyQmFzZSBmb3IgdHJhY2tpbmcuCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHN5c3RlbVN0b3AoKSB7Ci0gICAgICAgIG1QbGF5ZXJCYXNlLT5zdG9wKCk7Ci0gICAgICAgIHJldHVybiBtUGxheWVyQmFzZS0+Z2V0UmVzdWx0KCk7Ci0gICAgfQorICAgIGFhdWRpb19yZXN1bHRfdCBzYWZlRmx1c2goKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgY2FsbGVkIHdoZW4gYW4gYXBwIGNhbGxzIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcCgpOworICAgICAqIEl0IHByZXZlbnRzIGNhbGxzIGZyb20gYSBjYWxsYmFjay4KKyAgICAgKi8KKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3lzdGVtU3RvcEZyb21BcHAoKTsKKworICAgIC8qKgorICAgICAqIFRoaXMgaXMgY2FsbGVkIGludGVybmFsbHkgd2hlbiBhbiBhcHAgY2FsbGJhY2sgcmV0dXJucyBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1AuCisgICAgICovCisgICAgYWF1ZGlvX3Jlc3VsdF90IHN5c3RlbVN0b3BGcm9tQ2FsbGJhY2soKTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBzYWZlQ2xvc2UoKTsKIAogcHJvdGVjdGVkOgogCi0gICAgLy8gUGxheWVyQmFzZSBhbGxvd3MgdGhlIHN5c3RlbSB0byBjb250cm9sIHRoZSBzdHJlYW0uCi0gICAgLy8gQ2FsbGluZyB0aHJvdWdoIFBsYXllckJhc2UtPnN0YXJ0KCkgbm90aWZpZXMgdGhlIEF1ZGlvTWFuYWdlciBvZiB0aGUgcGxheWVyIHN0YXRlLgotICAgIC8vIFRoZSBBdWRpb01hbmFnZXIgYWxzbyBjYW4gc3RhcnQvc3RvcCBhIHN0cmVhbSBieSBjYWxsaW5nIG1QbGF5ZXJCYXNlLT5wbGF5ZXJTdGFydCgpLgotICAgIC8vIHN5c3RlbVN0YXJ0KCkgPT0+IG1QbGF5ZXJCYXNlLT5zdGFydCgpICAgbVBsYXllckJhc2UtPnBsYXllclN0YXJ0KCkgPT0+IHJlcXVlc3RTdGFydCgpCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICBcICAgICAgICAgICAgICAgICAgICAgICAgICAgLwotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLSBBdWRpb01hbmFnZXIgLS0tLS0tLQorICAgIC8vIFBsYXllckJhc2UgYWxsb3dzIHRoZSBzeXN0ZW0gdG8gY29udHJvbCB0aGUgc3RyZWFtIHZvbHVtZS4KICAgICBjbGFzcyBNeVBsYXllckJhc2UgOiBwdWJsaWMgYW5kcm9pZDo6UGxheWVyQmFzZSB7CiAgICAgcHVibGljOgogICAgICAgICBleHBsaWNpdCBNeVBsYXllckJhc2UoQXVkaW9TdHJlYW0gKnBhcmVudCk7CkBAIC00MTMsMjAgKzM5NywxOSBAQAogCiAgICAgICAgIHZvaWQgY2xlYXJQYXJlbnRSZWZlcmVuY2UoKSB7IG1QYXJlbnQgPSBudWxscHRyOyB9CiAKKyAgICAgICAgLy8gSnVzdCBhIHN0dWIuIFRoZSBhYmlsaXR5IHRvIHN0YXJ0IGF1ZGlvIHRocm91Z2ggUGxheWVyQmFzZSBpcyBiZWluZyBkZXByZWNhdGVkLgogICAgICAgICBhbmRyb2lkOjpzdGF0dXNfdCBwbGF5ZXJTdGFydCgpIG92ZXJyaWRlIHsKLSAgICAgICAgICAgIC8vIG1QYXJlbnQgc2hvdWxkIE5PVCBiZSBudWxsLiBTbyBnbyBhaGVhZCBhbmQgY3Jhc2ggaWYgaXQgaXMuCi0gICAgICAgICAgICBtUmVzdWx0ID0gbVBhcmVudC0+c2FmZVN0YXJ0KCk7Ci0gICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTdGF0dXMobVJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gYW5kcm9pZDo6Tk9fRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBKdXN0IGEgc3R1Yi4gVGhlIGFiaWxpdHkgdG8gcGF1c2UgYXVkaW8gdGhyb3VnaCBQbGF5ZXJCYXNlIGlzIGJlaW5nIGRlcHJlY2F0ZWQuCiAgICAgICAgIGFuZHJvaWQ6OnN0YXR1c190IHBsYXllclBhdXNlKCkgb3ZlcnJpZGUgewotICAgICAgICAgICAgbVJlc3VsdCA9IG1QYXJlbnQtPnNhZmVQYXVzZSgpOwotICAgICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKG1SZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6Ok5PX0VSUk9SOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gSnVzdCBhIHN0dWIuIFRoZSBhYmlsaXR5IHRvIHN0b3AgYXVkaW8gdGhyb3VnaCBQbGF5ZXJCYXNlIGlzIGJlaW5nIGRlcHJlY2F0ZWQuCiAgICAgICAgIGFuZHJvaWQ6OnN0YXR1c190IHBsYXllclN0b3AoKSBvdmVycmlkZSB7Ci0gICAgICAgICAgICBtUmVzdWx0ID0gbVBhcmVudC0+c2FmZVN0b3AoKTsKLSAgICAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyhtUmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpOT19FUlJPUjsKICAgICAgICAgfQogCiAgICAgICAgIGFuZHJvaWQ6OnN0YXR1c190IHBsYXllclNldFZvbHVtZSgpIG92ZXJyaWRlIHsKQEAgLTQ3OCwxOCArNDYxLDE4IEBACiAgICAgLyoqCiAgICAgICogVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBhZnRlciB0aGUgb3BlbigpIGNhbGwuCiAgICAgICovCi0gICAgdm9pZCBzZXRGb3JtYXQoYWF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgeworICAgIHZvaWQgc2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgewogICAgICAgICBtRm9ybWF0ID0gZm9ybWF0OwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9wZW4oKSBjYWxsLgogICAgICAqLwotICAgIHZvaWQgc2V0RGV2aWNlRm9ybWF0KGFhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKKyAgICB2b2lkIHNldERldmljZUZvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKICAgICAgICAgbURldmljZUZvcm1hdCA9IGZvcm1hdDsKICAgICB9CiAKLSAgICBhYXVkaW9fZm9ybWF0X3QgZ2V0RGV2aWNlRm9ybWF0KCkgY29uc3QgeworICAgIGF1ZGlvX2Zvcm1hdF90IGdldERldmljZUZvcm1hdCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1EZXZpY2VGb3JtYXQ7CiAgICAgfQogCkBAIC01NTMsOCArNTM2LDE3IEBACiAgICAgICAgIG1JbnB1dFByZXNldCA9IGlucHV0UHJlc2V0OwogICAgIH0KIAorICAgIC8qKgorICAgICAqIFRoaXMgc2hvdWxkIG5vdCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIG9wZW4oKSBjYWxsLgorICAgICAqLworICAgIHZvaWQgc2V0QWxsb3dlZENhcHR1cmVQb2xpY3koYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBwb2xpY3kpIHsKKyAgICAgICAgbUFsbG93ZWRDYXB0dXJlUG9saWN5ID0gcG9saWN5OworICAgIH0KKwogcHJpdmF0ZToKIAorICAgIGFhdWRpb19yZXN1bHRfdCBzYWZlU3RvcCgpOworCiAgICAgc3RkOjptdXRleCAgICAgICAgICAgICAgICAgbVN0cmVhbUxvY2s7CiAKICAgICBjb25zdCBhbmRyb2lkOjpzcDxNeVBsYXllckJhc2U+ICAgbVBsYXllckJhc2U7CkBAIC01NjUsMTkgKzU1NywyMCBAQAogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBtRGV2aWNlSWQgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90ICAgICAgIG1TaGFyaW5nTW9kZSA9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtU2hhcmluZ01vZGVNYXRjaFJlcXVpcmVkID0gZmFsc2U7IC8vIG11c3QgbWF0Y2ggc2hhcmluZyBtb2RlIHJlcXVlc3RlZAotICAgIGFhdWRpb19mb3JtYXRfdCAgICAgICAgICAgICBtRm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDsKKyAgICBhdWRpb19mb3JtYXRfdCAgICAgICAgICAgICAgbUZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxUOwogICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCAgICAgICBtU3RhdGUgPSBBQVVESU9fU1RSRUFNX1NUQVRFX1VOSU5JVElBTElaRUQ7CiAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCAgIG1QZXJmb3JtYW5jZU1vZGUgPSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FOwogCiAgICAgYWF1ZGlvX3VzYWdlX3QgICAgICAgICAgICAgIG1Vc2FnZSAgICAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgYWF1ZGlvX2NvbnRlbnRfdHlwZV90ICAgICAgIG1Db250ZW50VHlwZSAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiAgICAgYWF1ZGlvX2lucHV0X3ByZXNldF90ICAgICAgIG1JbnB1dFByZXNldCAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CisgICAgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBtQWxsb3dlZENhcHR1cmVQb2xpY3kgPSBBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9BTEw7CiAKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCA9IEFBVURJT19VTlNQRUNJRklFRDsKIAogICAgIC8vIFNvbWV0aW1lcyB0aGUgaGFyZHdhcmUgaXMgb3BlcmF0aW5nIHdpdGggYSBkaWZmZXJlbnQgZm9ybWF0IGZyb20gdGhlIGFwcC4KICAgICAvLyBUaGVuIHdlIHJlcXVpcmUgY29udmVyc2lvbiBpbiBBQXVkaW8uCi0gICAgYWF1ZGlvX2Zvcm1hdF90ICAgICAgICAgICAgIG1EZXZpY2VGb3JtYXQgPSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOworICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgICAgICAgICBtRGV2aWNlRm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CiAKICAgICAvLyBjYWxsYmFjayAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTYwMSw2ICs1OTQsOCBAQAogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICptVGhyZWFkQXJnID0gbnVsbHB0cjsKICAgICBhYXVkaW9fcmVzdWx0X3QgICAgICAgICAgICAgbVRocmVhZFJlZ2lzdHJhdGlvblJlc3VsdCA9IEFBVURJT19PSzsKIAorICAgIGNvbnN0IGFhdWRpb19zdHJlYW1faWRfdCAgICBtU3RyZWFtSWQ7CisKIH07CiAKIH0gLyogbmFtZXNwYWNlIGFhdWRpbyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmNwcAppbmRleCAzYTdhNTc4Li4wOGY0OTU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmNwcApAQCAtMTA0LDYgKzEwNCw4IEBACiAgICAgfQogICAgICpzdHJlYW1QdHIgPSBudWxscHRyOwogCisgICAgbG9nUGFyYW1ldGVycygpOworCiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHZhbGlkYXRlKCk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTE1MCw2ICsxNTIsMTEgQEAKICAgICAgICAgYWxsb3dNTWFwID0gZmFsc2U7CiAgICAgfQogCisgICAgaWYgKCFhbGxvd01NYXAgJiYgIWFsbG93TGVnYWN5KSB7CisgICAgICAgIEFMT0dFKCIlcygpIG5vIGJhY2tlbmQgYXZhaWxhYmxlOiBuZWl0aGVyIE1NQVAgbm9yIGxlZ2FjeSBwYXRoIGFyZSBhbGxvd2VkIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQ7CisgICAgfQorCiAgICAgcmVzdWx0ID0gYnVpbGRlcl9jcmVhdGVTdHJlYW0oZ2V0RGlyZWN0aW9uKCksIHNoYXJpbmdNb2RlLCBhbGxvd01NYXAsICZhdWRpb1N0cmVhbSk7CiAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKICAgICAgICAgLy8gT3BlbiB0aGUgc3RyZWFtIHVzaW5nIHRoZSBwYXJhbWV0ZXJzIGZyb20gdGhlIGJ1aWxkZXIuCkBAIC0yMTIsMyArMjE5LDQxIEBACiAKICAgICByZXR1cm4gQUFVRElPX09LOwogfQorCitzdGF0aWMgY29uc3QgY2hhciAqQUF1ZGlvX2NvbnZlcnRTaGFyaW5nTW9kZVRvU2hvcnRUZXh0KGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSkgeworICAgIHN3aXRjaCAoc2hhcmluZ01vZGUpIHsKKyAgICAgICAgY2FzZSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRToKKyAgICAgICAgICAgIHJldHVybiAiRVgiOworICAgICAgICBjYXNlIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOgorICAgICAgICAgICAgcmV0dXJuICJTSCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIj8hIjsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpBQXVkaW9fY29udmVydERpcmVjdGlvblRvVGV4dChhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSB7CisgICAgc3dpdGNoIChkaXJlY3Rpb24pIHsKKyAgICAgICAgY2FzZSBBQVVESU9fRElSRUNUSU9OX09VVFBVVDoKKyAgICAgICAgICAgIHJldHVybiAiT1VUUFVUIjsKKyAgICAgICAgY2FzZSBBQVVESU9fRElSRUNUSU9OX0lOUFVUOgorICAgICAgICAgICAgcmV0dXJuICJJTlBVVCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIj8hIjsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9TdHJlYW1CdWlsZGVyOjpsb2dQYXJhbWV0ZXJzKCkgY29uc3QgeworICAgIC8vIFRoaXMgaXMgdmVyeSBoZWxwZnVsIGZvciBkZWJ1Z2dpbmcgaW4gdGhlIGZ1dHVyZS4gUGxlYXNlIGxlYXZlIGl0IGluLgorICAgIEFMT0dJKCJyYXRlICAgPSAlNmQsIGNoYW5uZWxzICA9ICVkLCBmb3JtYXQgICA9ICVkLCBzaGFyaW5nID0gJXMsIGRpciA9ICVzIiwKKyAgICAgICAgICBnZXRTYW1wbGVSYXRlKCksIGdldFNhbXBsZXNQZXJGcmFtZSgpLCBnZXRGb3JtYXQoKSwKKyAgICAgICAgICBBQXVkaW9fY29udmVydFNoYXJpbmdNb2RlVG9TaG9ydFRleHQoZ2V0U2hhcmluZ01vZGUoKSksCisgICAgICAgICAgQUF1ZGlvX2NvbnZlcnREaXJlY3Rpb25Ub1RleHQoZ2V0RGlyZWN0aW9uKCkpKTsKKyAgICBBTE9HSSgiZGV2aWNlID0gJTZkLCBzZXNzaW9uSWQgPSAlZCwgcGVyZk1vZGUgPSAlZCwgY2FsbGJhY2s6ICVzIHdpdGggZnJhbWVzID0gJWQiLAorICAgICAgICAgIGdldERldmljZUlkKCksCisgICAgICAgICAgZ2V0U2Vzc2lvbklkKCksCisgICAgICAgICAgZ2V0UGVyZm9ybWFuY2VNb2RlKCksCisgICAgICAgICAgKChnZXREYXRhQ2FsbGJhY2tQcm9jKCkgIT0gbnVsbHB0cikgPyAiT04iIDogIk9GRiIpLAorICAgICAgICAgIG1GcmFtZXNQZXJEYXRhQ2FsbGJhY2spOworICAgIEFMT0dJKCJ1c2FnZSAgPSAlNmQsIGNvbnRlbnRUeXBlID0gJWQsIGlucHV0UHJlc2V0ID0gJWQsIGFsbG93ZWRDYXB0dXJlUG9saWN5ID0gJWQiLAorICAgICAgICAgIGdldFVzYWdlKCksIGdldENvbnRlbnRUeXBlKCksIGdldElucHV0UHJlc2V0KCksIGdldEFsbG93ZWRDYXB0dXJlUG9saWN5KCkpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5oCmluZGV4IGE0M2NmYTguLjgxNDlhZjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmgKQEAgLTEwMiw2ICsxMDIsOCBAQAogCiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgdmFsaWRhdGUoKSBjb25zdCBvdmVycmlkZTsKIAorICAgIHZvaWQgbG9nUGFyYW1ldGVycygpIGNvbnN0OworCiBwcml2YXRlOgogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIG1TaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQgPSBmYWxzZTsgLy8gbXVzdCBtYXRjaCBzaGFyaW5nIG1vZGUgcmVxdWVzdGVkCiAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCAgbVBlcmZvcm1hbmNlTW9kZSA9IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5jcHAKaW5kZXggYjA5MjU4ZS4uZjUxMTNmMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmNwcApAQCAtMjMsMzAgKzIzLDI2IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+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+CisKKyNpZmRlZiBfX0FORFJPSURfXworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiU291cmNlSTI0LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK2NvbnN0ZXhwciBpbnQga0J5dGVzUGVySTI0UGFja2VkID0gMzsKKworU291cmNlSTI0OjpTb3VyY2VJMjQoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogQXVkaW9Tb3VyY2UoY2hhbm5lbENvdW50KSB7Cit9CisKK2ludDMyX3QgU291cmNlSTI0OjpvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIGZsb2F0ICpmbG9hdERhdGEgPSBvdXRwdXQuZ2V0QmxvY2soKTsKKyAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IG91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKworICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IG1TaXplSW5GcmFtZXMgLSBtRnJhbWVJbmRleDsKKyAgICBpbnQzMl90IGZyYW1lc1RvUHJvY2VzcyA9IHN0ZDo6bWluKG51bUZyYW1lcywgZnJhbWVzTGVmdCk7CisgICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzVG9Qcm9jZXNzICogY2hhbm5lbENvdW50OworCisgICAgY29uc3QgdWludDhfdCAqYnl0ZUJhc2UgPSAodWludDhfdCAqKSBtRGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpieXRlRGF0YSA9ICZieXRlQmFzZVttRnJhbWVJbmRleCAqIGNoYW5uZWxDb3VudCAqIGtCeXRlc1BlckkyNFBhY2tlZF07CisKKyNpZmRlZiBfX0FORFJPSURfXworICAgIG1lbWNweV90b19mbG9hdF9mcm9tX3AyNChmbG9hdERhdGEsIGJ5dGVEYXRhLCBudW1TYW1wbGVzKTsKKyNlbHNlCisgICAgc3RhdGljIGNvbnN0IGZsb2F0IHNjYWxlID0gMS4gLyAoZmxvYXQpKDFVTCA8PCAzMSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgLy8gQXNzZW1ibGUgdGhlIGRhdGEgYXNzdW1pbmcgTGl0dGxlIEVuZGlhbiBmb3JtYXQuCisgICAgICAgIGludDMyX3QgcGFkID0gYnl0ZURhdGFbMl07CisgICAgICAgIHBhZCA8PD0gODsKKyAgICAgICAgcGFkIHw9IGJ5dGVEYXRhWzFdOworICAgICAgICBwYWQgPDw9IDg7CisgICAgICAgIHBhZCB8PSBieXRlRGF0YVswXTsKKyAgICAgICAgcGFkIDw8PSA4OyAvLyBTaGlmdCB0byAzMiBiaXQgZGF0YSBzbyB0aGUgc2lnbiBpcyBjb3JyZWN0LgorICAgICAgICBieXRlRGF0YSArPSBrQnl0ZXNQZXJJMjRQYWNrZWQ7CisgICAgICAgICpmbG9hdERhdGErKyA9IHBhZCAqIHNjYWxlOyAvLyBzY2FsZSB0byByYW5nZSAtMS4wIHRvIDEuMAorICAgIH0KKyNlbmRpZgorCisgICAgbUZyYW1lSW5kZXggKz0gZnJhbWVzVG9Qcm9jZXNzOworICAgIHJldHVybiBmcmFtZXNUb1Byb2Nlc3M7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWYxNGRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfU09VUkNFX0kyNF9ICisjZGVmaW5lIEZMT1dHUkFQSF9TT1VSQ0VfSTI0X0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCitjbGFzcyBTb3VyY2VJMjQgOiBwdWJsaWMgQXVkaW9Tb3VyY2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IFNvdXJjZUkyNChpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKK307CisKK30gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfU09VUkNFX0kyNF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAKaW5kZXggYTZiOWY1ZC4uOTFkMmVmZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmNwcApAQCAtNzgsOCArNzgsOSBAQAogCiB2b2lkIEF1ZGlvU3RyZWFtTGVnYWN5Ojpwcm9jZXNzQ2FsbGJhY2tDb21tb24oYWF1ZGlvX2NhbGxiYWNrX29wZXJhdGlvbl90IG9wY29kZSwgdm9pZCAqaW5mbykgewogICAgIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IGNhbGxiYWNrUmVzdWx0OwotICAgIC8vIFRoaXMgaWxsZWdhbCBzaXplIGNhbiBiZSB1c2VkIHRvIHRlbGwgQXVkaW9GbGluZ2VyIHRvIHN0b3AgY2FsbGluZyB1cy4KLSAgICAvLyBUaGlzIHRha2VzIGFkdmFudGFnZSBvZiBBdWRpb0ZsaW5nZXIga2lsbGluZyB0aGUgc3RyZWFtLgorICAgIC8vIFRoaXMgaWxsZWdhbCBzaXplIGNhbiBiZSB1c2VkIHRvIHRlbGwgQXVkaW9SZWNvcmQgb3IgQXVkaW9UcmFjayB0byBzdG9wIGNhbGxpbmcgdXMuCisgICAgLy8gVGhpcyB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhlbSBraWxsaW5nIHRoZSBzdHJlYW0gd2hlbiB0aGV5IHNlZSBhIHNpemUgb3V0IG9mIHJhbmdlLgorICAgIC8vIFRoYXQgaXMgYW4gdW5kb2N1bWVudGVkIGJlaGF2aW9yLgogICAgIC8vIFRPRE8gYWRkIHRvIEFQSSBpbiBBdWRpb1JlY29yZCBhbmQgQXVkaW9UcmFjawogICAgIGNvbnN0IHNpemVfdCBTSVpFX1NUT1BfQ0FMTEJBQ0tTID0gU0laRV9NQVg7CiAKQEAgLTk1LDcgKzk2LDcgQEAKICAgICAgICAgICAgICAgICBBTE9HVygicHJvY2Vzc0NhbGxiYWNrQ29tbW9uKCkgZGF0YSwgc3RyZWFtIGRpc2Nvbm5lY3RlZCIpOwogICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gU0laRV9TVE9QX0NBTExCQUNLUzsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1DYWxsYmFja0VuYWJsZWQubG9hZCgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInByb2Nlc3NDYWxsYmFja0NvbW1vbigpIHN0b3BwaW5nIGJlY2F1c2UgY2FsbGJhY2sgZGlzYWJsZWQiKTsKKyAgICAgICAgICAgICAgICBBTE9HVygicHJvY2Vzc0NhbGxiYWNrQ29tbW9uKCkgbm8gZGF0YSBiZWNhdXNlIGNhbGxiYWNrIGRpc2FibGVkIik7CiAgICAgICAgICAgICAgICAgYXVkaW9CdWZmZXItPnNpemUgPSBTSVpFX1NUT1BfQ0FMTEJBQ0tTOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoYXVkaW9CdWZmZXItPmZyYW1lQ291bnQgPT0gMCkgewpAQCAtMTE1LDEwICsxMTYsMTYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrUmVzdWx0ID09IEFBVURJT19DQUxMQkFDS19SRVNVTFRfQ09OVElOVUUpIHsKICAgICAgICAgICAgICAgICAgICAgYXVkaW9CdWZmZXItPnNpemUgPSBhdWRpb0J1ZmZlci0+ZnJhbWVDb3VudCAqIGdldEJ5dGVzUGVyRGV2aWNlRnJhbWUoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBTVE9QIG9yIGludmFsaWQgcmVzdWx0Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGNhbGxiYWNrIHJlcXVlc3RlZCBzdG9wLCBmYWtlIGFuIGVycm9yIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IFNJWkVfU1RPUF9DQUxMQkFDS1M7Ci0gICAgICAgICAgICAgICAgICAgIC8vIERpc2FibGUgdGhlIGNhbGxiYWNrIGp1c3QgaW4gY2FzZSBBdWRpb0ZsaW5nZXIga2VlcHMgdHJ5aW5nIHRvIGNhbGwgdXMuCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrUmVzdWx0ID09IEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIiVzKCkgY2FsbGJhY2sgcmV0dXJuZWQgQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgY2FsbGJhY2sgcmV0dXJuZWQgaW52YWxpZCByZXN1bHQgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2FsbGJhY2tSZXN1bHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgc3lzdGVtU3RvcEZyb21DYWxsYmFjaygpOworICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIHRoZSBjYWxsYmFjayBqdXN0IGluIGNhc2UgdGhlIHN5c3RlbSBrZWVwcyB0cnlpbmcgdG8gY2FsbCB1cy4KICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZShmYWxzZSk7CiAgICAgICAgICAgICAgICAgfQogCkBAIC0xOTksNyArMjA2LDkgQEAKIAogdm9pZCBBdWRpb1N0cmVhbUxlZ2FjeTo6b25BdWRpb0RldmljZVVwZGF0ZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKQogewotICAgIEFMT0dEKCJvbkF1ZGlvRGV2aWNlVXBkYXRlKCkgZGV2aWNlSWQgJWQiLCAoaW50KWRldmljZUlkKTsKKyAgICAvLyBEZXZpY2Ugcm91dGluZyBpcyBhIGNvbW1vbiBzb3VyY2Ugb2YgZXJyb3JzIGFuZCBESVNDT05ORUNUUy4KKyAgICAvLyBQbGVhc2UgbGVhdmUgdGhpcyBsb2cgaW4gcGxhY2UuCisgICAgQUxPR0QoIiVzKCkgZGV2SWQgJWQgPT4gJWQiLCBfX2Z1bmNfXywgKGludCkgZ2V0RGV2aWNlSWQoKSwgKGludClkZXZpY2VJZCk7CiAgICAgaWYgKGdldERldmljZUlkKCkgIT0gQUFVRElPX1VOU1BFQ0lGSUVEICYmIGdldERldmljZUlkKCkgIT0gZGV2aWNlSWQgJiYKICAgICAgICAgICAgIGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpIHsKICAgICAgICAgLy8gTm90ZSB0aGF0IGlzRGF0YUNhbGxiYWNrQWN0aXZlKCkgaXMgYWZmZWN0ZWQgYnkgc3RhdGUgc28gY2FsbCBpdCBiZWZvcmUgRElTQ09OTkVDVElORy4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oCmluZGV4IDQ5NGVkYmMuLjhlNzg1NTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuaApAQCAtNzcsNyArNzcsNiBAQAogCiAgICAgdmlydHVhbCBpbnQ2NF90IGluY3JlbWVudENsaWVudEZyYW1lQ291bnRlcihpbnQzMl90IGZyYW1lcykgID0gMDsKIAotCiAgICAgdmlydHVhbCBpbnQ2NF90IGdldEZyYW1lc1dyaXR0ZW4oKSBvdmVycmlkZSB7CiAgICAgICAgIHJldHVybiBtRnJhbWVzV3JpdHRlbi5nZXQoKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAKaW5kZXggNTA1ZjJlZS4uNzFlZmMzMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcApAQCAtNTcsMzIgKzU3LDQxIEBACiAKICAgICAvLyBUcnkgdG8gY3JlYXRlIGFuIEF1ZGlvUmVjb3JkCiAKKyAgICBjb25zdCBhYXVkaW9fc2Vzc2lvbl9pZF90IHJlcXVlc3RlZFNlc3Npb25JZCA9IGJ1aWxkZXIuZ2V0U2Vzc2lvbklkKCk7CisgICAgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU2Vzc2lvbklkKHJlcXVlc3RlZFNlc3Npb25JZCk7CisKICAgICAvLyBUT0RPIFN1cHBvcnQgVU5TUEVDSUZJRUQgaW4gQXVkaW9SZWNvcmQuIEZvciBub3csIHVzZSBzdGVyZW8gaWYgdW5zcGVjaWZpZWQuCiAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUgPSAoZ2V0U2FtcGxlc1BlckZyYW1lKCkgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAyIDogZ2V0U2FtcGxlc1BlckZyYW1lKCk7Ci0gICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX2luX21hc2tfZnJvbV9jb3VudChzYW1wbGVzUGVyRnJhbWUpOworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gc2FtcGxlc1BlckZyYW1lIDw9IDIgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfaW5fbWFza19mcm9tX2NvdW50KHNhbXBsZXNQZXJGcmFtZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza19mb3JfaW5kZXhfYXNzaWdubWVudF9mcm9tX2NvdW50KHNhbXBsZXNQZXJGcmFtZSk7CiAKICAgICBzaXplX3QgZnJhbWVDb3VudCA9IChidWlsZGVyLmdldEJ1ZmZlckNhcGFjaXR5KCkgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSA/IDAKICAgICAgICAgICAgICAgICAgICAgICAgIDogYnVpbGRlci5nZXRCdWZmZXJDYXBhY2l0eSgpOwogCiAKLSAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fSU5QVVRfRkxBR19OT05FOworICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3M7CiAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSA9IGdldFBlcmZvcm1hbmNlTW9kZSgpOwogICAgIHN3aXRjaCAocGVyZk1vZGUpIHsKICAgICAgICAgY2FzZSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWToKLSAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIChBVURJT19JTlBVVF9GTEFHX0ZBU1QgfCBBVURJT19JTlBVVF9GTEFHX1JBVyk7CisgICAgICAgICAgICAvLyBJZiB0aGUgYXBwIGFza3MgZm9yIGEgc2Vzc2lvbklkIHRoZW4gaXQgbWVhbnMgdGhleSB3YW50IHRvIHVzZSBlZmZlY3RzLgorICAgICAgICAgICAgLy8gU28gZG9uJ3QgdXNlIFJBVyBmbGFnLgorICAgICAgICAgICAgZmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgKChyZXF1ZXN0ZWRTZXNzaW9uSWQgPT0gQUFVRElPX1NFU1NJT05fSURfTk9ORSkKKyAgICAgICAgICAgICAgICAgICAgPyAoQVVESU9fSU5QVVRfRkxBR19GQVNUIHwgQVVESU9fSU5QVVRfRkxBR19SQVcpCisgICAgICAgICAgICAgICAgICAgIDogKEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9QT1dFUl9TQVZJTkc6CiAgICAgICAgIGNhc2UgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORToKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIE5vIGZsYWdzLgorICAgICAgICAgICAgZmxhZ3MgPSBBVURJT19JTlBVVF9GTEFHX05PTkU7CiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKICAgICAvLyBQcmVzZXJ2ZSBiZWhhdmlvciBvZiBBUEkgMjYKLSAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRCkgewotICAgICAgICBzZXRGb3JtYXQoQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOworICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgeworICAgICAgICBzZXRGb3JtYXQoQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CiAgICAgfQogCiAgICAgLy8gTWF5YmUgY2hhbmdlIGRldmljZSBmb3JtYXQgdG8gZ2V0IGEgRkFTVCBwYXRoLgpAQCAtOTksMTIgKzEwOCwxMiBAQAogICAgIC8vIFdlIGp1c3QgbWF5IG5vdCBnZXQgYSBGQVNUIHRyYWNrLgogICAgIC8vIEJ1dCB3ZSB3b3VsZG4ndCBoYXZlIGFueXdheSB3aXRob3V0IHRoaXMgaGFjay4KICAgICBjb25zdGV4cHIgaW50MzJfdCBrTW9zdExpa2VseVNhbXBsZVJhdGVGb3JGYXN0ID0gNDgwMDA7Ci0gICAgaWYgKGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUCisgICAgaWYgKGdldEZvcm1hdCgpID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQKICAgICAgICAgICAgICYmIHBlcmZNb2RlID09IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZCiAgICAgICAgICAgICAmJiAoc2FtcGxlc1BlckZyYW1lIDw9IDIpIC8vIEZBU1Qgb25seSBmb3IgbW9ubyBhbmQgc3RlcmVvCiAgICAgICAgICAgICAmJiAoZ2V0U2FtcGxlUmF0ZSgpID09IGtNb3N0TGlrZWx5U2FtcGxlUmF0ZUZvckZhc3QKICAgICAgICAgICAgICAgICB8fCBnZXRTYW1wbGVSYXRlKCkgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSkgewotICAgICAgICBzZXREZXZpY2VGb3JtYXQoQUFVRElPX0ZPUk1BVF9QQ01fSTE2KTsKKyAgICAgICAgc2V0RGV2aWNlRm9ybWF0KEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKICAgICB9IGVsc2UgewogICAgICAgICBzZXREZXZpY2VGb3JtYXQoZ2V0Rm9ybWF0KCkpOwogICAgIH0KQEAgLTE0MSwxNCArMTUwLDEwIEBACiAgICAgICAgICAgICAudGFncyA9ICIiCiAgICAgfTsKIAotICAgIGFhdWRpb19zZXNzaW9uX2lkX3QgcmVxdWVzdGVkU2Vzc2lvbklkID0gYnVpbGRlci5nZXRTZXNzaW9uSWQoKTsKLSAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTZXNzaW9uSWQocmVxdWVzdGVkU2Vzc2lvbklkKTsKLQogICAgIC8vIC0tLS0tLS0tLS0tIG9wZW4gdGhlIEF1ZGlvUmVjb3JkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIC8vIE1pZ2h0IHJldHJ5LCBidXQgbmV2ZXIgbW9yZSB0aGFuIG9uY2UuCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpICsrKSB7Ci0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IHJlcXVlc3RlZEludGVybmFsRm9ybWF0ID0KLSAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZERhdGFGb3JtYXQoZ2V0RGV2aWNlRm9ybWF0KCkpOworICAgICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCByZXF1ZXN0ZWRJbnRlcm5hbEZvcm1hdCA9IGdldERldmljZUZvcm1hdCgpOwogCiAgICAgICAgIG1BdWRpb1JlY29yZCA9IG5ldyBBdWRpb1JlY29yZCgKICAgICAgICAgICAgICAgICBtT3BQYWNrYWdlTmFtZSAvLyBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSBUT0RPIGRvZXMgbm90IGNvbXBpbGUKQEAgLTIxNCw4ICsyMTksOCBAQAogICAgIH0KIAogICAgIC8vIEFsbG9jYXRlIGZvcm1hdCBjb252ZXJzaW9uIGJ1ZmZlciBpZiBuZWVkZWQuCi0gICAgaWYgKGdldERldmljZUZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0kxNgotICAgICAgICAmJiBnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgIGlmIChnZXREZXZpY2VGb3JtYXQoKSA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVAorICAgICAgICAmJiBnZXRGb3JtYXQoKSA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CiAKICAgICAgICAgaWYgKGJ1aWxkZXIuZ2V0RGF0YUNhbGxiYWNrUHJvYygpICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBjYWxsYmFjayB0aGVuIHdlIG5lZWQgdG8gY29udmVydCB0aGUgZGF0YSBpbnRvIGFuIGludGVybmFsIGZsb2F0CkBAIC0zMjMsMTYgKzMyOCwxMyBAQAogICAgIGlmIChtQXVkaW9SZWNvcmQuZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQotICAgIC8vIEdldCBjdXJyZW50IHBvc2l0aW9uIHNvIHdlIGNhbiBkZXRlY3Qgd2hlbiB0aGUgdHJhY2sgaXMgcmVjb3JkaW5nLgotICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1JlY29yZC0+Z2V0UG9zaXRpb24oJm1Qb3NpdGlvbldoZW5TdGFydGluZyk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKLSAgICB9CiAKLSAgICAvLyBFbmFibGUgY2FsbGJhY2sgYmVmb3JlIHN0YXJ0aW5nIEF1ZGlvVHJhY2sgdG8gYXZvaWQgc2h1dHRpbmcKKyAgICAvLyBFbmFibGUgY2FsbGJhY2sgYmVmb3JlIHN0YXJ0aW5nIEF1ZGlvUmVjb3JkIHRvIGF2b2lkIHNodXR0aW5nCiAgICAgLy8gZG93biBiZWNhdXNlIG9mIGEgcmFjZSBjb25kaXRpb24uCiAgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZSh0cnVlKTsKLSAgICBlcnIgPSBtQXVkaW9SZWNvcmQtPnN0YXJ0KCk7CisgICAgbUZyYW1lc1dyaXR0ZW4ucmVzZXQzMigpOyAvLyBzZXJ2aWNlIHdyaXRlcyBmcmFtZXMKKyAgICBtVGltZXN0YW1wUG9zaXRpb24ucmVzZXQzMigpOworICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1JlY29yZC0+c3RhcnQoKTsgLy8gcmVzZXRzIHBvc2l0aW9uIHRvIHplcm8KICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwogICAgIH0gZWxzZSB7CkBAIC0zNDYsMTIgKzM0OCwxMCBAQAogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkcpOwotICAgIGluY3JlbWVudEZyYW1lc1dyaXR0ZW4oZ2V0RnJhbWVzUmVhZCgpIC0gZ2V0RnJhbWVzV3JpdHRlbigpKTsgLy8gVE9ETyByZXZpZXcKLSAgICBtVGltZXN0YW1wUG9zaXRpb24uc2V0KGdldEZyYW1lc1JlYWQoKSk7CisgICAgbUZyYW1lc1dyaXR0ZW4uY2F0Y2hVcFRvKGdldEZyYW1lc1JlYWQoKSk7CisgICAgbVRpbWVzdGFtcFBvc2l0aW9uLmNhdGNoVXBUbyhnZXRGcmFtZXNSZWFkKCkpOwogICAgIG1BdWRpb1JlY29yZC0+c3RvcCgpOwogICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUoZmFsc2UpOwotICAgIG1GcmFtZXNXcml0dGVuLnJlc2V0MzIoKTsgLy8gc2VydmljZSB3cml0ZXMgZnJhbWVzLCBzZXJ2aWNlIHBvc2l0aW9uIHJlc2V0IG9uIGZsdXNoCi0gICAgbVRpbWVzdGFtcFBvc2l0aW9uLnJlc2V0MzIoKTsKICAgICAvLyBQYXNzIGZhbHNlIHRvIHByZXZlbnQgZXJyb3JDYWxsYmFjayBmcm9tIGJlaW5nIGNhbGxlZCBhZnRlciBkaXNjb25uZWN0CiAgICAgLy8gd2hlbiBhcHAgaGFzIGFscmVhZHkgcmVxdWVzdGVkIGEgc3RvcCgpLgogICAgIHJldHVybiBjaGVja0ZvckRpc2Nvbm5lY3RSZXF1ZXN0KGZhbHNlKTsKQEAgLTM2NSwxMCArMzY1LDEyIEBACiAgICAgc3dpdGNoIChnZXRTdGF0ZSgpKSB7CiAgICAgLy8gVE9ETyBhZGQgYmV0dGVyIHN0YXRlIHZpc2liaWxpdHkgdG8gQXVkaW9SZWNvcmQKICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRJTkc6CisgICAgICAgIC8vIFdoZW4gc3RhcnRpbmcsIHRoZSBwb3NpdGlvbiB3aWxsIGJlZ2luIGF0IHplcm8gYW5kIHRoZW4gZ28gcG9zaXRpdmUuCisgICAgICAgIC8vIFRoZSBwb3NpdGlvbiBjYW4gd3JhcCBidXQgYnkgdGhhdCB0aW1lIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBTVEFSVElORy4KICAgICAgICAgZXJyID0gbUF1ZGlvUmVjb3JkLT5nZXRQb3NpdGlvbigmcG9zaXRpb24pOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXN1bHQgPSBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwotICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uICE9IG1Qb3NpdGlvbldoZW5TdGFydGluZykgeworICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID4gMCkgewogICAgICAgICAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKQEAgLTQ4Myw2ICs0ODUsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpmcmFtZVBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3NlY29uZHMpIHsKICAgICBFeHRlbmRlZFRpbWVzdGFtcCBleHRlbmRlZFRpbWVzdGFtcDsKKyAgICBpZiAoZ2V0U3RhdGUoKSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQpIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgIH0KICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9SZWNvcmQtPmdldFRpbWVzdGFtcCgmZXh0ZW5kZWRUaW1lc3RhbXApOwogICAgIGlmIChzdGF0dXMgPT0gV09VTERfQkxPQ0spIHsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwpAQCAtNDk4LDEyICs1MDMsMTIgQEAKICAgICBzd2l0Y2ggKGdldFN0YXRlKCkpIHsKICAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJUSU5HOgogICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRDoKLSAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQSU5HOgogICAgICAgICAgICAgcmVzdWx0ID0gbUF1ZGlvUmVjb3JkLT5nZXRQb3NpdGlvbigmcG9zaXRpb24pOwogICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBPSykgewogICAgICAgICAgICAgICAgIG1GcmFtZXNXcml0dGVuLnVwZGF0ZTMyKHBvc2l0aW9uKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkc6CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBicmVhazsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwCmluZGV4IDUwNWNkNzcuLjA5NGNkZDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwCkBAIC01OSwxOCArNTksMjcgQEAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKKyAgICBjb25zdCBhYXVkaW9fc2Vzc2lvbl9pZF90IHJlcXVlc3RlZFNlc3Npb25JZCA9IGJ1aWxkZXIuZ2V0U2Vzc2lvbklkKCk7CisgICAgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU2Vzc2lvbklkKHJlcXVlc3RlZFNlc3Npb25JZCk7CisKICAgICAvLyBUcnkgdG8gY3JlYXRlIGFuIEF1ZGlvVHJhY2sKICAgICAvLyBVc2Ugc3RlcmVvIGlmIHVuc3BlY2lmaWVkLgogICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lID0gKGdldFNhbXBsZXNQZXJGcmFtZSgpID09IEFBVURJT19VTlNQRUNJRklFRCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMiA6IGdldFNhbXBsZXNQZXJGcmFtZSgpOwotICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KHNhbXBsZXNQZXJGcmFtZSk7CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBzYW1wbGVzUGVyRnJhbWUgPD0gMiA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KHNhbXBsZXNQZXJGcmFtZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza19mb3JfaW5kZXhfYXNzaWdubWVudF9mcm9tX2NvdW50KHNhbXBsZXNQZXJGcmFtZSk7CiAKLSAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CisgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3M7CiAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSA9IGdldFBlcmZvcm1hbmNlTW9kZSgpOwogICAgIHN3aXRjaChwZXJmTW9kZSkgewogICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZOgogICAgICAgICAgICAgLy8gQnlwYXNzIHRoZSBub3JtYWwgbWl4ZXIgYW5kIGdvIHN0cmFpZ2h0IHRvIHRoZSBGQVNUIG1peGVyLgotICAgICAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgfCBBVURJT19PVVRQVVRfRkxBR19SQVcpOworICAgICAgICAgICAgLy8gSWYgdGhlIGFwcCBhc2tzIGZvciBhIHNlc3Npb25JZCB0aGVuIGl0IG1lYW5zIHRoZXkgd2FudCB0byB1c2UgZWZmZWN0cy4KKyAgICAgICAgICAgIC8vIFNvIGRvbid0IHVzZSBSQVcgZmxhZy4KKyAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAoKHJlcXVlc3RlZFNlc3Npb25JZCA9PSBBQVVESU9fU0VTU0lPTl9JRF9OT05FKQorICAgICAgICAgICAgICAgICAgICA/IChBVURJT19PVVRQVVRfRkxBR19GQVNUIHwgQVVESU9fT1VUUFVUX0ZMQUdfUkFXKQorICAgICAgICAgICAgICAgICAgICA6IChBVURJT19PVVRQVVRfRkxBR19GQVNUKSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX1BPV0VSX1NBVklORzoKQEAgLTgxLDYgKzkwLDcgQEAKICAgICAgICAgY2FzZSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FOgogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgLy8gTm8gZmxhZ3MuIFVzZSBhIG5vcm1hbCBtaXhlciBpbiBmcm9udCBvZiB0aGUgRkFTVCBtaXhlci4KKyAgICAgICAgICAgIGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIApAQCAtODgsOSArOTgsOSBAQAogCiAgICAgaW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwOwogCi0gICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQpCisgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGdldEZvcm1hdCgpID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKQogICAgICAgICAgICAgPyBBVURJT19GT1JNQVRfUENNX0ZMT0FUCi0gICAgICAgICAgICA6IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkRGF0YUZvcm1hdChnZXRGb3JtYXQoKSk7CisgICAgICAgICAgICA6IGdldEZvcm1hdCgpOwogCiAgICAgLy8gU2V0dXAgdGhlIGNhbGxiYWNrIGlmIHRoZXJlIGlzIG9uZS4KICAgICBBdWRpb1RyYWNrOjpjYWxsYmFja190IGNhbGxiYWNrID0gbnVsbHB0cjsKQEAgLTEyNiwyMCArMTM2LDE3IEBACiAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2NvbnRlbnRUeXBlVG9JbnRlcm5hbChidWlsZGVyLmdldENvbnRlbnRUeXBlKCkpOwogICAgIGNvbnN0IGF1ZGlvX3VzYWdlX3QgdXNhZ2UgPQogICAgICAgICAgICAgQUF1ZGlvQ29udmVydF91c2FnZVRvSW50ZXJuYWwoYnVpbGRlci5nZXRVc2FnZSgpKTsKKyAgICBjb25zdCBhdWRpb19mbGFnc19tYXNrX3QgYXR0cmlidXRlc0ZsYWdzID0KKyAgICAgICAgQUF1ZGlvQ29udmVydF9hbGxvd0NhcHR1cmVQb2xpY3lUb0F1ZGlvRmxhZ3NNYXNrKGJ1aWxkZXIuZ2V0QWxsb3dlZENhcHR1cmVQb2xpY3koKSk7CiAKICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHsKICAgICAgICAgICAgIC5jb250ZW50X3R5cGUgPSBjb250ZW50VHlwZSwKICAgICAgICAgICAgIC51c2FnZSA9IHVzYWdlLAogICAgICAgICAgICAgLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9ERUZBVUxULCAvLyBvbmx5IHVzZWQgZm9yIHJlY29yZGluZwotICAgICAgICAgICAgLmZsYWdzID0gQVVESU9fRkxBR19OT05FLCAvLyBEaWZmZXJlbnQgdGhhbiB0aGUgQVVESU9fT1VUUFVUX0ZMQUdTCisgICAgICAgICAgICAuZmxhZ3MgPSBhdHRyaWJ1dGVzRmxhZ3MsCiAgICAgICAgICAgICAudGFncyA9ICIiCiAgICAgfTsKIAotICAgIHN0YXRpY19hc3NlcnQoQUFVRElPX1VOU1BFQ0lGSUVEID09IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsICJTZXNzaW9uIElEcyBzaG91bGQgbWF0Y2giKTsKLQotICAgIGFhdWRpb19zZXNzaW9uX2lkX3QgcmVxdWVzdGVkU2Vzc2lvbklkID0gYnVpbGRlci5nZXRTZXNzaW9uSWQoKTsKLSAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTZXNzaW9uSWQocmVxdWVzdGVkU2Vzc2lvbklkKTsKLQogICAgIG1BdWRpb1RyYWNrID0gbmV3IEF1ZGlvVHJhY2soKTsKICAgICBtQXVkaW9UcmFjay0+c2V0KAogICAgICAgICAgICAgQVVESU9fU1RSRUFNX0RFRkFVTFQsICAvLyBpZ25vcmVkIGJlY2F1c2Ugd2UgcGFzcyBhdHRyaWJ1dGVzIGJlbG93CkBAIC0xNzgsMTAgKzE4NSw4IEBACiAKICAgICAvLyBHZXQgdGhlIGFjdHVhbCB2YWx1ZXMgZnJvbSB0aGUgQXVkaW9UcmFjay4KICAgICBzZXRTYW1wbGVzUGVyRnJhbWUobUF1ZGlvVHJhY2stPmNoYW5uZWxDb3VudCgpKTsKLSAgICBhYXVkaW9fZm9ybWF0X3QgYWF1ZGlvRm9ybWF0ID0KLSAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvRGF0YUZvcm1hdChtQXVkaW9UcmFjay0+Zm9ybWF0KCkpOwotICAgIHNldEZvcm1hdChhYXVkaW9Gb3JtYXQpOwotICAgIHNldERldmljZUZvcm1hdChhYXVkaW9Gb3JtYXQpOworICAgIHNldEZvcm1hdChtQXVkaW9UcmFjay0+Zm9ybWF0KCkpOworICAgIHNldERldmljZUZvcm1hdChtQXVkaW9UcmFjay0+Zm9ybWF0KCkpOwogCiAgICAgaW50MzJfdCBhY3R1YWxTYW1wbGVSYXRlID0gbUF1ZGlvVHJhY2stPmdldFNhbXBsZVJhdGUoKTsKICAgICBBTE9HV19JRihhY3R1YWxTYW1wbGVSYXRlICE9IGdldFNhbXBsZVJhdGUoKSwKQEAgLTI4Nyw3ICsyOTIsNyBAQAogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1UcmFjazo6cmVxdWVzdFBhdXNlKCkgewogICAgIGlmIChtQXVkaW9UcmFjay5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJyZXF1ZXN0UGF1c2UoKSBubyBBdWRpb1RyYWNrIik7CisgICAgICAgIEFMT0dFKCIlcygpIG5vIEF1ZGlvVHJhY2siLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAKQEAgLTMwMyw3ICszMDgsNyBAQAogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1UcmFjazo6cmVxdWVzdEZsdXNoKCkgewogICAgIGlmIChtQXVkaW9UcmFjay5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJyZXF1ZXN0Rmx1c2goKSBubyBBdWRpb1RyYWNrIik7CisgICAgICAgIEFMT0dFKCIlcygpIG5vIEF1ZGlvVHJhY2siLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAKQEAgLTMxNywxMyArMzIyLDEzIEBACiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVRyYWNrOjpyZXF1ZXN0U3RvcCgpIHsKICAgICBpZiAobUF1ZGlvVHJhY2suZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgicmVxdWVzdFN0b3AoKSBubyBBdWRpb1RyYWNrIik7CisgICAgICAgIEFMT0dFKCIlcygpIG5vIEF1ZGlvVHJhY2siLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAKICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQSU5HKTsKLSAgICBpbmNyZW1lbnRGcmFtZXNSZWFkKGdldEZyYW1lc1dyaXR0ZW4oKSAtIGdldEZyYW1lc1JlYWQoKSk7IC8vIFRPRE8gcmV2aWV3Ci0gICAgbVRpbWVzdGFtcFBvc2l0aW9uLnNldChnZXRGcmFtZXNXcml0dGVuKCkpOworICAgIG1GcmFtZXNSZWFkLmNhdGNoVXBUbyhnZXRGcmFtZXNXcml0dGVuKCkpOworICAgIG1UaW1lc3RhbXBQb3NpdGlvbi5jYXRjaFVwVG8oZ2V0RnJhbWVzV3JpdHRlbigpKTsKICAgICBtRnJhbWVzUmVhZC5yZXNldDMyKCk7IC8vIHNlcnZpY2UgcmVhZHMgZnJhbWVzLCBzZXJ2aWNlIHBvc2l0aW9uIHJlc2V0IG9uIHN0b3AKICAgICBtVGltZXN0YW1wUG9zaXRpb24ucmVzZXQzMigpOwogICAgIG1BdWRpb1RyYWNrLT5zdG9wKCk7CkBAIC00MTksNiArNDI0LDEwIEBACiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVRyYWNrOjpzZXRCdWZmZXJTaXplKGludDMyX3QgcmVxdWVzdGVkRnJhbWVzKQogeworICAgIC8vIERvIG5vdCBhc2sgZm9yIGxlc3MgdGhhbiBvbmUgYnVyc3QuCisgICAgaWYgKHJlcXVlc3RlZEZyYW1lcyA8IGdldEZyYW1lc1BlckJ1cnN0KCkpIHsKKyAgICAgICAgcmVxdWVzdGVkRnJhbWVzID0gZ2V0RnJhbWVzUGVyQnVyc3QoKTsKKyAgICB9CiAgICAgc3NpemVfdCByZXN1bHQgPSBtQXVkaW9UcmFjay0+c2V0QnVmZmVyU2l6ZUluRnJhbWVzKHJlcXVlc3RlZEZyYW1lcyk7CiAgICAgaWYgKHJlc3VsdCA8IDApIHsKICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHJlc3VsdCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuY3BwCmluZGV4IDQwZWJiNzYuLjk2ZWQ1NmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuY3BwCkBAIC0zMywzOTUgKzMzLDYgQEAKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKLS8vIFRoaXMgaXMgMyBkQiwgKDEwXigzLzIwKSksIHRvIG1hdGNoIHRoZSBtYXhpbXVtIGhlYWRyb29tIGluIEF1ZGlvVHJhY2sgZm9yIGZsb2F0IGRhdGEuCi0vLyBJdCBpcyBkZXNpZ25lZCB0byBhbGxvdyBvY2Nhc2lvbmFsIHRyYW5zaWVudCBwZWFrcy4KLSNkZWZpbmUgTUFYX0hFQURST09NICgxLjQxMjUzNzU0ZikKLSNkZWZpbmUgTUlOX0hFQURST09NICgwIC0gTUFYX0hFQURST09NKQotCi1pbnQzMl90IEFBdWRpb0NvbnZlcnRfZm9ybWF0VG9TaXplSW5CeXRlcyhhYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7Ci0gICAgaW50MzJfdCBzaXplID0gQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQ7Ci0gICAgc3dpdGNoIChmb3JtYXQpIHsKLSAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9JMTY6Ci0gICAgICAgICAgICBzaXplID0gc2l6ZW9mKGludDE2X3QpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6Ci0gICAgICAgICAgICBzaXplID0gc2l6ZW9mKGZsb2F0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiBzaXplOwotfQotCi0vLyBUT0RPIGV4cG9zZSBhbmQgY2FsbCBjbGFtcDE2X2Zyb21fZmxvYXQgZnVuY3Rpb24gaW4gcHJpbWl0aXZlcy5oCi1zdGF0aWMgaW5saW5lIGludDE2X3QgY2xhbXAxNl9mcm9tX2Zsb2F0KGZsb2F0IGYpIHsKLSAgICBzdGF0aWMgY29uc3QgZmxvYXQgc2NhbGUgPSAxIDw8IDE1OwotICAgIHJldHVybiAoaW50MTZfdCkgcm91bmRmKGZtYXhmKGZtaW5mKGYgKiBzY2FsZSwgc2NhbGUgLSAxLmYpLCAtc2NhbGUpKTsKLX0KLQotLy8gQ2xpcCB0byB2YWxpZCByYW5nZSBvZiBhIGZsb2F0IHNhbXBsZSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSB2b2x1bWUuCi0vLyBCeSB1c2luZyBmbWluIGFuZCBmbWF4IHdlIGFsc28gcHJvdGVjdCBhZ2FpbnN0IE5hTi4KLXN0YXRpYyBmbG9hdCBjbGlwVG9NaW5NYXhIZWFkcm9vbShmbG9hdCBpbnB1dCkgewotICAgIHJldHVybiBmbWluKE1BWF9IRUFEUk9PTSwgZm1heChNSU5fSEVBRFJPT00sIGlucHV0KSk7Ci19Ci0KLXN0YXRpYyBmbG9hdCBjbGlwQW5kQ2xhbXBGbG9hdFRvUGNtMTYoZmxvYXQgc2FtcGxlLCBmbG9hdCBzY2FsZXIpIHsKLSAgICAvLyBDbGlwIHRvIHZhbGlkIHJhbmdlIG9mIGEgZmxvYXQgc2FtcGxlIHRvIHByZXZlbnQgZXhjZXNzaXZlIHZvbHVtZS4KLSAgICBzYW1wbGUgPSBjbGlwVG9NaW5NYXhIZWFkcm9vbShzYW1wbGUpOwotCi0gICAgLy8gU2NhbGUgYW5kIGNvbnZlcnQgdG8gYSBzaG9ydC4KLSAgICBmbG9hdCBmdmFsID0gc2FtcGxlICogc2NhbGVyOwotICAgIHJldHVybiBjbGFtcDE2X2Zyb21fZmxvYXQoZnZhbCk7Ci19Ci0KLXZvaWQgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoY29uc3QgZmxvYXQgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKSB7Ci0gICAgY29uc3QgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7Ci0gICAgICAgIGZsb2F0IHNhbXBsZSA9ICpzb3VyY2UrKzsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBjbGlwQW5kQ2xhbXBGbG9hdFRvUGNtMTYoc2FtcGxlLCBzY2FsZXIpOwotICAgIH0KLX0KLQotdm9pZCBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNihjb25zdCBmbG9hdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7Ci0gICAgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlMTsKLSAgICAvLyBkaXZpZGUgYnkgbnVtRnJhbWVzIHNvIHRoYXQgd2UgYWxtb3N0IHJlYWNoIGFtcGxpdHVkZTIKLSAgICBmbG9hdCBkZWx0YSA9IChhbXBsaXR1ZGUyIC0gYW1wbGl0dWRlMSkgLyBudW1GcmFtZXM7Ci0gICAgZm9yIChpbnQgZnJhbWVJbmRleCA9IDA7IGZyYW1lSW5kZXggPCBudW1GcmFtZXM7IGZyYW1lSW5kZXgrKykgewotICAgICAgICBmb3IgKGludCBzYW1wbGVJbmRleCA9IDA7IHNhbXBsZUluZGV4IDwgc2FtcGxlc1BlckZyYW1lOyBzYW1wbGVJbmRleCsrKSB7Ci0gICAgICAgICAgICBmbG9hdCBzYW1wbGUgPSAqc291cmNlKys7Ci0gICAgICAgICAgICAqZGVzdGluYXRpb24rKyA9IGNsaXBBbmRDbGFtcEZsb2F0VG9QY20xNihzYW1wbGUsIHNjYWxlcik7Ci0gICAgICAgIH0KLSAgICAgICAgc2NhbGVyICs9IGRlbHRhOwotICAgIH0KLX0KLQotI2RlZmluZSBTSE9SVF9TQ0FMRSAgMzI3NjgKLQotdm9pZCBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdChjb25zdCBpbnQxNl90ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUpIHsKLSAgICBjb25zdCBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUgLyBTSE9SVF9TQ0FMRTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgewotICAgICAgICBkZXN0aW5hdGlvbltpXSA9IHNvdXJjZVtpXSAqIHNjYWxlcjsKLSAgICB9Ci19Ci0KLS8vIFRoaXMgY29kZSBhc3N1bWVzIGFtcGxpdHVkZTEgYW5kIGFtcGxpdHVkZTIgYXJlIGJldHdlZW4gMC4wIGFuZCAxLjAKLXZvaWQgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMikgewotICAgIGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTEgLyBTSE9SVF9TQ0FMRTsKLSAgICBjb25zdCBmbG9hdCBkZWx0YSA9IChhbXBsaXR1ZGUyIC0gYW1wbGl0dWRlMSkgLyAoU0hPUlRfU0NBTEUgKiAoZmxvYXQpIG51bUZyYW1lcyk7Ci0gICAgZm9yIChpbnQgZnJhbWVJbmRleCA9IDA7IGZyYW1lSW5kZXggPCBudW1GcmFtZXM7IGZyYW1lSW5kZXgrKykgewotICAgICAgICBmb3IgKGludCBzYW1wbGVJbmRleCA9IDA7IHNhbXBsZUluZGV4IDwgc2FtcGxlc1BlckZyYW1lOyBzYW1wbGVJbmRleCsrKSB7Ci0gICAgICAgICAgICAqZGVzdGluYXRpb24rKyA9ICpzb3VyY2UrKyAqIHNjYWxlcjsKLSAgICAgICAgfQotICAgICAgICBzY2FsZXIgKz0gZGVsdGE7Ci0gICAgfQotfQotCi0KLS8vIFRoaXMgY29kZSBhc3N1bWVzIGFtcGxpdHVkZTEgYW5kIGFtcGxpdHVkZTIgYXJlIGJldHdlZW4gMC4wIGFuZCAxLjAKLXZvaWQgQUF1ZGlvX2xpbmVhclJhbXAoY29uc3QgZmxvYXQgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKLSAgICBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUxOwotICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIG51bUZyYW1lczsKLSAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7Ci0gICAgICAgIGZvciAoaW50IHNhbXBsZUluZGV4ID0gMDsgc2FtcGxlSW5kZXggPCBzYW1wbGVzUGVyRnJhbWU7IHNhbXBsZUluZGV4KyspIHsKLSAgICAgICAgICAgIGZsb2F0IHNhbXBsZSA9ICpzb3VyY2UrKzsKLSAgICAgICAgICAgIC8vIENsaXAgdG8gdmFsaWQgcmFuZ2Ugb2YgYSBmbG9hdCBzYW1wbGUgdG8gcHJldmVudCBleGNlc3NpdmUgdm9sdW1lLgotICAgICAgICAgICAgc2FtcGxlID0gY2xpcFRvTWluTWF4SGVhZHJvb20oc2FtcGxlKTsKLQotICAgICAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGUgKiBzY2FsZXI7Ci0gICAgICAgIH0KLSAgICAgICAgc2NhbGVyICs9IGRlbHRhOwotICAgIH0KLX0KLQotLy8gVGhpcyBjb2RlIGFzc3VtZXMgYW1wbGl0dWRlMSBhbmQgYW1wbGl0dWRlMiBhcmUgYmV0d2VlbiAwLjAgYW5kIDEuMAotdm9pZCBBQXVkaW9fbGluZWFyUmFtcChjb25zdCBpbnQxNl90ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKLSAgICAvLyBCZWNhdXNlIHdlIGFyZSBjb252ZXJ0aW5nIGZyb20gaW50MTYgdG8gMW50MTYsIHdlIGRvIG5vdCBoYXZlIHRvIHNjYWxlIGJ5IDEvMzI3NjguCi0gICAgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlMTsKLSAgICBjb25zdCBmbG9hdCBkZWx0YSA9IChhbXBsaXR1ZGUyIC0gYW1wbGl0dWRlMSkgLyBudW1GcmFtZXM7Ci0gICAgZm9yIChpbnQgZnJhbWVJbmRleCA9IDA7IGZyYW1lSW5kZXggPCBudW1GcmFtZXM7IGZyYW1lSW5kZXgrKykgewotICAgICAgICBmb3IgKGludCBzYW1wbGVJbmRleCA9IDA7IHNhbXBsZUluZGV4IDwgc2FtcGxlc1BlckZyYW1lOyBzYW1wbGVJbmRleCsrKSB7Ci0gICAgICAgICAgICAvLyBObyBuZWVkIHRvIGNsaXAgYmVjYXVzZSBpbnQxNl90IHJhbmdlIGlzIGluaGVyZW50bHkgbGltaXRlZC4KLSAgICAgICAgICAgIGZsb2F0IHNhbXBsZSA9ICAqc291cmNlKysgKiBzY2FsZXI7Ci0gICAgICAgICAgICAqZGVzdGluYXRpb24rKyA9IChpbnQxNl90KSByb3VuZGYoc2FtcGxlKTsKLSAgICAgICAgfQotICAgICAgICBzY2FsZXIgKz0gZGVsdGE7Ci0gICAgfQotfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0vLyBDb252ZXJ0IE1vbm8gVG8gU3RlcmVvIGF0IHRoZSBzYW1lIHRpbWUgYXMgY29udmVydGluZyBmb3JtYXQuCi12b2lkIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKSB7Ci0gICAgY29uc3QgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRnJhbWVzOyBpKyspIHsKLSAgICAgICAgZmxvYXQgc2FtcGxlID0gKnNvdXJjZSsrOwotICAgICAgICBpbnQxNl90IHNhbXBsZTE2ID0gY2xpcEFuZENsYW1wRmxvYXRUb1BjbTE2KHNhbXBsZSwgc2NhbGVyKTsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGUxNjsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGUxNjsKLSAgICB9Ci19Ci0KLXZvaWQgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oY29uc3QgZmxvYXQgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7Ci0gICAgLy8gZGl2aWRlIGJ5IG51bUZyYW1lcyBzbyB0aGF0IHdlIGFsbW9zdCByZWFjaCBhbXBsaXR1ZGUyCi0gICAgY29uc3QgZmxvYXQgZGVsdGEgPSAoYW1wbGl0dWRlMiAtIGFtcGxpdHVkZTEpIC8gbnVtRnJhbWVzOwotICAgIGZvciAoaW50IGZyYW1lSW5kZXggPSAwOyBmcmFtZUluZGV4IDwgbnVtRnJhbWVzOyBmcmFtZUluZGV4KyspIHsKLSAgICAgICAgY29uc3QgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlMSArIChmcmFtZUluZGV4ICogZGVsdGEpOwotICAgICAgICBjb25zdCBmbG9hdCBzYW1wbGUgPSAqc291cmNlKys7Ci0gICAgICAgIGludDE2X3Qgc2FtcGxlMTYgPSBjbGlwQW5kQ2xhbXBGbG9hdFRvUGNtMTYoc2FtcGxlLCBzY2FsZXIpOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTE2OwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTE2OwotICAgIH0KLX0KLQotdm9pZCBBQXVkaW9Db252ZXJ0X2Zvcm1hdE1vbm9Ub1N0ZXJlbyhjb25zdCBpbnQxNl90ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZSkgewotICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZSAvIFNIT1JUX1NDQUxFOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRnJhbWVzOyBpKyspIHsKLSAgICAgICAgZmxvYXQgc2FtcGxlID0gc291cmNlW2ldICogc2NhbGVyOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGU7Ci0gICAgfQotfQotCi0vLyBUaGlzIGNvZGUgYXNzdW1lcyBhbXBsaXR1ZGUxIGFuZCBhbXBsaXR1ZGUyIGFyZSBiZXR3ZWVuIDAuMCBhbmQgMS4wCi12b2lkIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMikgewotICAgIGNvbnN0IGZsb2F0IHNjYWxlcjEgPSBhbXBsaXR1ZGUxIC8gU0hPUlRfU0NBTEU7Ci0gICAgY29uc3QgZmxvYXQgZGVsdGEgPSAoYW1wbGl0dWRlMiAtIGFtcGxpdHVkZTEpIC8gKFNIT1JUX1NDQUxFICogKGZsb2F0KSBudW1GcmFtZXMpOwotICAgIGZvciAoaW50IGZyYW1lSW5kZXggPSAwOyBmcmFtZUluZGV4IDwgbnVtRnJhbWVzOyBmcmFtZUluZGV4KyspIHsKLSAgICAgICAgZmxvYXQgc2NhbGVyID0gc2NhbGVyMSArIChmcmFtZUluZGV4ICogZGVsdGEpOwotICAgICAgICBmbG9hdCBzYW1wbGUgPSBzb3VyY2VbZnJhbWVJbmRleF0gKiBzY2FsZXI7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTsKLSAgICB9Ci19Ci0KLS8vIFRoaXMgY29kZSBhc3N1bWVzIGFtcGxpdHVkZTEgYW5kIGFtcGxpdHVkZTIgYXJlIGJldHdlZW4gMC4wIGFuZCAxLjAKLXZvaWQgQUF1ZGlvX2xpbmVhclJhbXBNb25vVG9TdGVyZW8oY29uc3QgZmxvYXQgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMikgewotICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIG51bUZyYW1lczsKLSAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7Ci0gICAgICAgIGZsb2F0IHNhbXBsZSA9ICpzb3VyY2UrKzsKLQotICAgICAgICAvLyBDbGlwIHRvIHZhbGlkIHJhbmdlIG9mIGEgZmxvYXQgc2FtcGxlIHRvIHByZXZlbnQgZXhjZXNzaXZlIHZvbHVtZS4KLSAgICAgICAgc2FtcGxlID0gY2xpcFRvTWluTWF4SGVhZHJvb20oc2FtcGxlKTsKLQotICAgICAgICBjb25zdCBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUxICsgKGZyYW1lSW5kZXggKiBkZWx0YSk7Ci0gICAgICAgIGZsb2F0IHNhbXBsZVNjYWxlZCA9IHNhbXBsZSAqIHNjYWxlcjsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGVTY2FsZWQ7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlU2NhbGVkOwotICAgIH0KLX0KLQotLy8gVGhpcyBjb2RlIGFzc3VtZXMgYW1wbGl0dWRlMSBhbmQgYW1wbGl0dWRlMiBhcmUgYmV0d2VlbiAwLjAgYW5kIDEuMAotdm9pZCBBQXVkaW9fbGluZWFyUmFtcE1vbm9Ub1N0ZXJlbyhjb25zdCBpbnQxNl90ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMikgewotICAgIC8vIEJlY2F1c2Ugd2UgYXJlIGNvbnZlcnRpbmcgZnJvbSBpbnQxNiB0byAxbnQxNiwgd2UgZG8gbm90IGhhdmUgdG8gc2NhbGUgYnkgMS8zMjc2OC4KLSAgICBjb25zdCBmbG9hdCBkZWx0YSA9IChhbXBsaXR1ZGUyIC0gYW1wbGl0dWRlMSkgLyBudW1GcmFtZXM7Ci0gICAgZm9yIChpbnQgZnJhbWVJbmRleCA9IDA7IGZyYW1lSW5kZXggPCBudW1GcmFtZXM7IGZyYW1lSW5kZXgrKykgewotICAgICAgICBjb25zdCBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUxICsgKGZyYW1lSW5kZXggKiBkZWx0YSk7Ci0gICAgICAgIC8vIE5vIG5lZWQgdG8gY2xpcCBiZWNhdXNlIGludDE2X3QgcmFuZ2UgaXMgaW5oZXJlbnRseSBsaW1pdGVkLgotICAgICAgICBjb25zdCBmbG9hdCBzYW1wbGUgPSAgKnNvdXJjZSsrICogc2NhbGVyOwotICAgICAgICBpbnQxNl90IHNhbXBsZTE2ID0gKGludDE2X3QpIHJvdW5kZihzYW1wbGUpOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTE2OwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTE2OwotICAgIH0KLX0KLQotLy8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotdm9pZCBBQXVkaW9EYXRhQ29udmVydGVyOjpjb252ZXJ0KAotICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZzb3VyY2UsCi0gICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJmRlc3RpbmF0aW9uLAotICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgZmxvYXQgbGV2ZWxGcm9tLAotICAgICAgICBmbG9hdCBsZXZlbFRvKSB7Ci0KLSAgICBpZiAoc291cmNlLmNoYW5uZWxDb3VudCA9PSAxICYmIGRlc3RpbmF0aW9uLmNoYW5uZWxDb3VudCA9PSAyKSB7Ci0gICAgICAgIGNvbnZlcnRNb25vVG9TdGVyZW8oc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gV2Ugb25seSBzdXBwb3J0IG1vbm8gdG8gc3RlcmVvIGNvbnZlcnNpb24uIE90aGVyd2lzZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uCi0gICAgICAgIC8vIG11c3QgbWF0Y2guCi0gICAgICAgIGFzc2VydChzb3VyY2UuY2hhbm5lbENvdW50ID09IGRlc3RpbmF0aW9uLmNoYW5uZWxDb3VudCk7Ci0gICAgICAgIGNvbnZlcnRDaGFubmVsc01hdGNoKHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICB9Ci19Ci0KLXZvaWQgQUF1ZGlvRGF0YUNvbnZlcnRlcjo6Y29udmVydE1vbm9Ub1N0ZXJlbygKLSAgICAgICAgY29uc3QgRm9ybWF0dGVkRGF0YSAmc291cmNlLAotICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZkZXN0aW5hdGlvbiwKLSAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgIGZsb2F0IGxldmVsRnJvbSwKLSAgICAgICAgZmxvYXQgbGV2ZWxUbykgewotCi0gICAgLy8gVGhlIGZvcm1hdHMgYXJlIHZhbGlkYXRlZCB3aGVuIHRoZSBzdHJlYW0gaXMgb3BlbmVkIHNvIHdlIGRvIG5vdCBoYXZlIHRvCi0gICAgLy8gY2hlY2sgZm9yIGlsbGVnYWwgY29tYmluYXRpb25zIGhlcmUuCi0gICAgaWYgKHNvdXJjZS5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICAgICAgQUF1ZGlvX2xpbmVhclJhbXBNb25vVG9TdGVyZW8oCi0gICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKGZsb2F0ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgfSBlbHNlIGlmIChkZXN0aW5hdGlvbi5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7Ci0gICAgICAgICAgICBpZiAobGV2ZWxGcm9tICE9IGxldmVsVG8pIHsKLSAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2Zvcm1hdE1vbm9Ub1N0ZXJlbygKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHNvdXJjZS5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7Ci0gICAgICAgIGlmIChkZXN0aW5hdGlvbi5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgICAgIGlmIChsZXZlbEZyb20gIT0gbGV2ZWxUbykgewotICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2Zvcm1hdE1vbm9Ub1N0ZXJlbygKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChkZXN0aW5hdGlvbi5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7Ci0gICAgICAgICAgICBBQXVkaW9fbGluZWFyUmFtcE1vbm9Ub1N0ZXJlbygKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBBQXVkaW9EYXRhQ29udmVydGVyOjpjb252ZXJ0Q2hhbm5lbHNNYXRjaCgKLSAgICAgICAgY29uc3QgRm9ybWF0dGVkRGF0YSAmc291cmNlLAotICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZkZXN0aW5hdGlvbiwKLSAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgIGZsb2F0IGxldmVsRnJvbSwKLSAgICAgICAgZmxvYXQgbGV2ZWxUbykgewotICAgIGNvbnN0IGludDMyX3QgbnVtU2FtcGxlcyA9IG51bUZyYW1lcyAqIHNvdXJjZS5jaGFubmVsQ291bnQ7Ci0KLSAgICAvLyBUaGUgZm9ybWF0cyBhcmUgdmFsaWRhdGVkIHdoZW4gdGhlIHN0cmVhbSBpcyBvcGVuZWQgc28gd2UgZG8gbm90IGhhdmUgdG8KLSAgICAvLyBjaGVjayBmb3IgaWxsZWdhbCBjb21iaW5hdGlvbnMgaGVyZS4KLSAgICBpZiAoc291cmNlLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgICAgICBBQXVkaW9fbGluZWFyUmFtcCgKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICBzb3VyY2UuY2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICB9IGVsc2UgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgICAgIGlmIChsZXZlbEZyb20gIT0gbGV2ZWxUbykgewotICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfZmxvYXRUb1BjbTE2KAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5jaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChzb3VyY2UuZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgewotICAgICAgICBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgICAgICBpZiAobGV2ZWxGcm9tICE9IGxldmVsVG8pIHsKLSAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKGZsb2F0ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UuY2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChkZXN0aW5hdGlvbi5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7Ci0gICAgICAgICAgICBBQXVkaW9fbGluZWFyUmFtcCgKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgc291cmNlLmNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQogc3RhdHVzX3QgQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTdGF0dXMoYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCkgewogICAgIC8vIFRoaXMgY292ZXJzIHRoZSBjYXNlIGZvciBBQVVESU9fT0sgYW5kIGZvciBwb3NpdGl2ZSByZXN1bHRzLgogICAgIGlmIChyZXN1bHQgPj0gMCkgewpAQCAtNTEzLDYgKzEyNCw5IEBACiBhdWRpb19mb3JtYXRfdCBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZERhdGFGb3JtYXQoYWF1ZGlvX2Zvcm1hdF90IGFhdWRpb0Zvcm1hdCkgewogICAgIGF1ZGlvX2Zvcm1hdF90IGFuZHJvaWRGb3JtYXQ7CiAgICAgc3dpdGNoIChhYXVkaW9Gb3JtYXQpIHsKKyAgICBjYXNlIEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ6CisgICAgICAgIGFuZHJvaWRGb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9JMTY6CiAgICAgICAgIGFuZHJvaWRGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKICAgICAgICAgYnJlYWs7CkBAIC01MjAsMTYgKzEzNCwxOSBAQAogICAgICAgICBhbmRyb2lkRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgYW5kcm9pZEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxUOwotICAgICAgICBBTE9HRSgiQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWREYXRhRm9ybWF0IDB4JTA4WCB1bnJlY29nbml6ZWQiLCBhYXVkaW9Gb3JtYXQpOworICAgICAgICBhbmRyb2lkRm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgICAgIEFMT0dFKCIlcygpIDB4JTA4WCB1bnJlY29nbml6ZWQiLCBfX2Z1bmNfXywgYWF1ZGlvRm9ybWF0KTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogICAgIHJldHVybiBhbmRyb2lkRm9ybWF0OwogfQogCiBhYXVkaW9fZm9ybWF0X3QgQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9EYXRhRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGFuZHJvaWRGb3JtYXQpIHsKLSAgICBhYXVkaW9fZm9ybWF0X3QgYWF1ZGlvRm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgIGFhdWRpb19mb3JtYXRfdCBhYXVkaW9Gb3JtYXQ7CiAgICAgc3dpdGNoIChhbmRyb2lkRm9ybWF0KSB7CisgICAgY2FzZSBBVURJT19GT1JNQVRfREVGQVVMVDoKKyAgICAgICAgYWF1ZGlvRm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKICAgICAgICAgYWF1ZGlvRm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2OwogICAgICAgICBicmVhazsKQEAgLTUzOCw3ICsxNTUsNyBAQAogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgogICAgICAgICBhYXVkaW9Gb3JtYXQgPSBBQVVESU9fRk9STUFUX0lOVkFMSUQ7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb0RhdGFGb3JtYXQgMHglMDhYIHVucmVjb2duaXplZCIsIGFuZHJvaWRGb3JtYXQpOworICAgICAgICBBTE9HRSgiJXMoKSAweCUwOFggdW5yZWNvZ25pemVkIiwgX19mdW5jX18sIGFuZHJvaWRGb3JtYXQpOwogICAgICAgICBicmVhazsKICAgICB9CiAgICAgcmV0dXJuIGFhdWRpb0Zvcm1hdDsKQEAgLTU5MywxMiArMjEwLDI5IEBACiAgICAgU1RBVElDX0FTU0VSVChBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1JFQ09HTklUSU9OID09IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTik7CiAgICAgU1RBVElDX0FTU0VSVChBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX0NPTU1VTklDQVRJT04gPT0gQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04pOwogICAgIFNUQVRJQ19BU1NFUlQoQUFVRElPX0lOUFVUX1BSRVNFVF9VTlBST0NFU1NFRCA9PSBBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQpOworICAgIFNUQVRJQ19BU1NFUlQoQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9QRVJGT1JNQU5DRSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUEVSRk9STUFOQ0UpOwogICAgIGlmIChwcmVzZXQgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CiAgICAgICAgIHByZXNldCA9IEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUkVDT0dOSVRJT047CiAgICAgfQogICAgIHJldHVybiAoYXVkaW9fc291cmNlX3QpIHByZXNldDsgLy8gc2FtZSB2YWx1ZQogfQogCithdWRpb19mbGFnc19tYXNrX3QgQUF1ZGlvQ29udmVydF9hbGxvd0NhcHR1cmVQb2xpY3lUb0F1ZGlvRmxhZ3NNYXNrKAorICAgICAgICBhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV90IHBvbGljeSkgeworICAgIHN3aXRjaCAocG9saWN5KSB7CisgICAgICAgIGNhc2UgQUFVRElPX1VOU1BFQ0lGSUVEOgorICAgICAgICBjYXNlIEFBVURJT19BTExPV19DQVBUVVJFX0JZX0FMTDoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19GTEFHX05PTkU7CisgICAgICAgIGNhc2UgQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfU1lTVEVNOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0ZMQUdfTk9fTUVESUFfUFJPSkVDVElPTjsKKyAgICAgICAgY2FzZSBBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9OT05FOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0ZMQUdfTk9fTUVESUFfUFJPSkVDVElPTiB8IEFVRElPX0ZMQUdfTk9fU1lTVEVNX0NBUFRVUkU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXMoKSAweCUwOFggdW5yZWNvZ25pemVkIiwgX19mdW5jX18sIHBvbGljeSk7CisgICAgICAgICAgICByZXR1cm4gQVVESU9fRkxBR19OT05FOyAvLworICAgIH0KK30KKwogaW50MzJfdCBBQXVkaW9Db252ZXJ0X2ZyYW1lc1RvQnl0ZXMoaW50MzJfdCBudW1GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJ5dGVzUGVyRnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICpzaXplSW5CeXRlcykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oCmluZGV4IDRiOTc1ZTguLjc2ZDA0NTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgKQEAgLTQ1LDE1NiArNDUsNiBAQAogYXVkaW9fc2Vzc2lvbl90IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU2Vzc2lvbklkKGFhdWRpb19zZXNzaW9uX2lkX3Qgc2Vzc2lvbklkKTsKIAogLyoqCi0gKiBDb252ZXJ0IGFuIGFycmF5IG9mIGZsb2F0cyB0byBhbiBhcnJheSBvZiBpbnQxNl90LgotICoKLSAqIEBwYXJhbSBzb3VyY2UKLSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotICogQHBhcmFtIG51bVNhbXBsZXMgbnVtYmVyIG9mIHZhbHVlcyBpbiB0aGUgYXJyYXkKLSAqIEBwYXJhbSBhbXBsaXR1ZGUgbGV2ZWwgYmV0d2VlbiAwLjAgYW5kIDEuMAotICovCi12b2lkIEFBdWRpb0NvbnZlcnRfZmxvYXRUb1BjbTE2KGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZSk7Ci0KLS8qKgotICogQ29udmVydCBmbG9hdHMgdG8gaW50MTZfdCBhbmQgc2NhbGUgYnkgYSBsaW5lYXIgcmFtcC4KLSAqCi0gKiBUaGUgcmFtcCBzdG9wcyBqdXN0IHNob3J0IG9mIHJlYWNoaW5nIGFtcGxpdHVkZTIgc28gdGhhdCB0aGUgbmV4dAotICogcmFtcCBjYW4gc3RhcnQgYXQgYW1wbGl0dWRlMiB3aXRob3V0IGNhdXNpbmcgYSBkaXNjb250aW51aXR5LgotICoKLSAqIEBwYXJhbSBzb3VyY2UKLSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotICogQHBhcmFtIG51bUZyYW1lcwotICogQHBhcmFtIHNhbXBsZXNQZXJGcmFtZSBBS0EgbnVtYmVyIG9mIGNoYW5uZWxzCi0gKiBAcGFyYW0gYW1wbGl0dWRlMSBsZXZlbCBhdCBzdGFydCBvZiByYW1wLCBiZXR3ZWVuIDAuMCBhbmQgMS4wCi0gKiBAcGFyYW0gYW1wbGl0dWRlMiBsZXZlbCBwYXN0IGVuZCBvZiByYW1wLCBiZXR3ZWVuIDAuMCBhbmQgMS4wCi0gKi8KLXZvaWQgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoY29uc3QgZmxvYXQgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMik7Ci0KLS8qKgotICogQ29udmVydCBpbnQxNl90IGFycmF5IHRvIGZsb2F0IGFycmF5IHJhbmdpbmcgZnJvbSAtMS4wIHRvICsxLjAuCi0gKiBAcGFyYW0gc291cmNlCi0gKiBAcGFyYW0gZGVzdGluYXRpb24KLSAqIEBwYXJhbSBudW1TYW1wbGVzCi0gKi8KLS8vdm9pZCBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdChjb25zdCBpbnQxNl90ICpzb3VyY2UsIGludDMyX3QgbnVtU2FtcGxlcywKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24pOwotCi0vKioKLSAqCi0gKiBDb252ZXJ0IGludDE2X3QgYXJyYXkgdG8gZmxvYXQgYXJyYXkgcmFuZ2luZyBmcm9tICsvLSBhbXBsaXR1ZGUuCi0gKiBAcGFyYW0gc291cmNlCi0gKiBAcGFyYW0gZGVzdGluYXRpb24KLSAqIEBwYXJhbSBudW1TYW1wbGVzCi0gKiBAcGFyYW0gYW1wbGl0dWRlCi0gKi8KLXZvaWQgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKTsKLQotLyoqCi0gKiBDb252ZXJ0IGZsb2F0cyB0byBpbnQxNl90IGFuZCBzY2FsZSBieSBhIGxpbmVhciByYW1wLgotICoKLSAqIFRoZSByYW1wIHN0b3BzIGp1c3Qgc2hvcnQgb2YgcmVhY2hpbmcgYW1wbGl0dWRlMiBzbyB0aGF0IHRoZSBuZXh0Ci0gKiByYW1wIGNhbiBzdGFydCBhdCBhbXBsaXR1ZGUyIHdpdGhvdXQgY2F1c2luZyBhIGRpc2NvbnRpbnVpdHkuCi0gKgotICogQHBhcmFtIHNvdXJjZQotICogQHBhcmFtIGRlc3RpbmF0aW9uCi0gKiBAcGFyYW0gbnVtRnJhbWVzCi0gKiBAcGFyYW0gc2FtcGxlc1BlckZyYW1lIEFLQSBudW1iZXIgb2YgY2hhbm5lbHMKLSAqIEBwYXJhbSBhbXBsaXR1ZGUxIGxldmVsIGF0IHN0YXJ0IG9mIHJhbXAsIGJldHdlZW4gMC4wIGFuZCAxLjAKLSAqIEBwYXJhbSBhbXBsaXR1ZGUyIGxldmVsIGF0IGVuZCBvZiByYW1wLCBiZXR3ZWVuIDAuMCBhbmQgMS4wCi0gKi8KLXZvaWQgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMik7Ci0KLS8qKgotICogU2NhbGUgZmxvYXRzIGJ5IGEgbGluZWFyIHJhbXAuCi0gKgotICogVGhlIHJhbXAgc3RvcHMganVzdCBzaG9ydCBvZiByZWFjaGluZyBhbXBsaXR1ZGUyIHNvIHRoYXQgdGhlIG5leHQKLSAqIHJhbXAgY2FuIHN0YXJ0IGF0IGFtcGxpdHVkZTIgd2l0aG91dCBjYXVzaW5nIGEgZGlzY29udGludWl0eS4KLSAqCi0gKiBAcGFyYW0gc291cmNlCi0gKiBAcGFyYW0gZGVzdGluYXRpb24KLSAqIEBwYXJhbSBudW1GcmFtZXMKLSAqIEBwYXJhbSBzYW1wbGVzUGVyRnJhbWUKLSAqIEBwYXJhbSBhbXBsaXR1ZGUxCi0gKiBAcGFyYW0gYW1wbGl0dWRlMgotICovCi12b2lkIEFBdWRpb19saW5lYXJSYW1wKGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKTsKLQotLyoqCi0gKiBTY2FsZSBpbnQxNl90J3MgYnkgYSBsaW5lYXIgcmFtcC4KLSAqCi0gKiBUaGUgcmFtcCBzdG9wcyBqdXN0IHNob3J0IG9mIHJlYWNoaW5nIGFtcGxpdHVkZTIgc28gdGhhdCB0aGUgbmV4dAotICogcmFtcCBjYW4gc3RhcnQgYXQgYW1wbGl0dWRlMiB3aXRob3V0IGNhdXNpbmcgYSBkaXNjb250aW51aXR5LgotICoKLSAqIEBwYXJhbSBzb3VyY2UKLSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotICogQHBhcmFtIG51bUZyYW1lcwotICogQHBhcmFtIHNhbXBsZXNQZXJGcmFtZQotICogQHBhcmFtIGFtcGxpdHVkZTEKLSAqIEBwYXJhbSBhbXBsaXR1ZGUyCi0gKi8KLXZvaWQgQUF1ZGlvX2xpbmVhclJhbXAoY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKTsKLQotY2xhc3MgQUF1ZGlvRGF0YUNvbnZlcnRlciB7Ci1wdWJsaWM6Ci0KLSAgICBzdHJ1Y3QgRm9ybWF0dGVkRGF0YSB7Ci0KLSAgICAgICAgRm9ybWF0dGVkRGF0YSh2b2lkICpkYXRhLCBhYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQzMl90IGNoYW5uZWxDb3VudCkKLSAgICAgICAgICAgIDogZGF0YShkYXRhKQotICAgICAgICAgICAgLCBmb3JtYXQoZm9ybWF0KQotICAgICAgICAgICAgLCBjaGFubmVsQ291bnQoY2hhbm5lbENvdW50KSB7fQotCi0gICAgICAgIGNvbnN0IHZvaWQgICAgICAgICAgICAqZGF0YSA9IG51bGxwdHI7Ci0gICAgICAgIGNvbnN0IGFhdWRpb19mb3JtYXRfdCAgZm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDsKLSAgICAgICAgY29uc3QgaW50MzJfdCAgICAgICAgICBjaGFubmVsQ291bnQgPSAxOwotICAgIH07Ci0KLSAgICBzdGF0aWMgdm9pZCBjb252ZXJ0KGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbFRvKTsKLQotcHJpdmF0ZToKLSAgICBzdGF0aWMgdm9pZCBjb252ZXJ0TW9ub1RvU3RlcmVvKGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbFRvKTsKLQotICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRDaGFubmVsc01hdGNoKGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGV2ZWxUbyk7Ci19OwotCi0vKioKICAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFuZCBwcmV2ZW50IG51bWVyaWMgb3ZlcmZsb3cuCiAgKiBUaGUgKnNpemVJbkJ5dGVzIHdpbGwgYmUgc2V0IHRvIHplcm8gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCiAgKgpAQCAtMjM1LDEwICs4NSwxMiBAQAogYXVkaW9fc291cmNlX3QgQUF1ZGlvQ29udmVydF9pbnB1dFByZXNldFRvQXVkaW9Tb3VyY2UoYWF1ZGlvX2lucHV0X3ByZXNldF90IHByZXNldCk7CiAKIC8qKgotICogQHJldHVybiB0aGUgc2l6ZSBvZiBhIHNhbXBsZSBvZiB0aGUgZ2l2ZW4gZm9ybWF0IGluIGJ5dGVzIG9yIEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UCisgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB2YWxpZGF0ZSB0aGUgcGFzc2VkIGluIHZhbHVlLgorICogVGhhdCBpcyBkb25lIHNvbWV3aGVyZSBlbHNlLgorICogQHJldHVybiBpbnRlcm5hbCBhdWRpbyBmbGFncyBtYXNrCiAgKi8KLWludDMyX3QgQUF1ZGlvQ29udmVydF9mb3JtYXRUb1NpemVJbkJ5dGVzKGFhdWRpb19mb3JtYXRfdCBmb3JtYXQpOwotCithdWRpb19mbGFnc19tYXNrX3QgQUF1ZGlvQ29udmVydF9hbGxvd0NhcHR1cmVQb2xpY3lUb0F1ZGlvRmxhZ3NNYXNrKAorICAgICAgICBhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV90IHBvbGljeSk7CiAKIC8vIE5vdGUgdGhhdCB0aGlzIGNvZGUgbWF5IGJlIHJlcGxhY2VkIGJ5IFNldHRpbmdzIG9yIGJ5IHNvbWUgb3RoZXIgc3lzdGVtIGNvbmZpZ3VyYXRpb24gdG9vbC4KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0xpbmVhclJhbXAuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0xpbmVhclJhbXAuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzE0YmJmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9MaW5lYXJSYW1wLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJMaW5lYXJSYW1wLmgiCi0KLWJvb2wgTGluZWFyUmFtcDo6aXNSYW1waW5nKCkgewotICAgIGZsb2F0IHRhcmdldCA9IG1UYXJnZXQubG9hZCgpOwotICAgIGlmICh0YXJnZXQgIT0gbUxldmVsVG8pIHsKLSAgICAgICAgLy8gVXBkYXRlIHRhcmdldC4gQ29udGludWUgZnJvbSBwcmV2aW91cyBsZXZlbC4KLSAgICAgICAgbUxldmVsVG8gPSB0YXJnZXQ7Ci0gICAgICAgIG1SZW1haW5pbmcgPSBtTGVuZ3RoSW5GcmFtZXM7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtUmVtYWluaW5nID4gMDsKLSAgICB9Ci19Ci0KLWJvb2wgTGluZWFyUmFtcDo6bmV4dFNlZ21lbnQoaW50MzJfdCBmcmFtZXMsIGZsb2F0ICpsZXZlbEZyb20sIGZsb2F0ICpsZXZlbFRvKSB7Ci0gICAgYm9vbCByYW1waW5nID0gaXNSYW1waW5nKCk7Ci0gICAgKmxldmVsRnJvbSA9IG1MZXZlbEZyb207Ci0gICAgaWYgKHJhbXBpbmcpIHsKLSAgICAgICAgZmxvYXQgbGV2ZWw7Ci0gICAgICAgIGlmIChmcmFtZXMgPj0gbVJlbWFpbmluZykgewotICAgICAgICAgICAgbGV2ZWwgPSBtTGV2ZWxUbzsKLSAgICAgICAgICAgIG1SZW1haW5pbmcgPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gSW50ZXJwb2xhdGUgdG8gYSBwb2ludCBhbG9uZyB0aGUgZnVsbCByYW1wLgotICAgICAgICAgICAgbGV2ZWwgPSBtTGV2ZWxGcm9tICsgKGZyYW1lcyAqIChtTGV2ZWxUbyAtIG1MZXZlbEZyb20pIC8gbVJlbWFpbmluZyk7Ci0gICAgICAgICAgICBtUmVtYWluaW5nIC09IGZyYW1lczsKLSAgICAgICAgfQotICAgICAgICBtTGV2ZWxGcm9tID0gbGV2ZWw7IC8vIGZvciBuZXh0IHJhbXAKLSAgICAgICAgKmxldmVsVG8gPSBsZXZlbDsKLSAgICB9IGVsc2UgewotICAgICAgICAqbGV2ZWxUbyA9IG1MZXZlbFRvOwotICAgIH0KLSAgICByZXR1cm4gcmFtcGluZzsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTGluZWFyUmFtcC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0xpbmVhclJhbXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIxYjhlMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTGluZWFyUmFtcC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBQVVESU9fTElORUFSX1JBTVBfSAotI2RlZmluZSBBQVVESU9fTElORUFSX1JBTVBfSAotCi0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0vKioKLSAqIEdlbmVyYXRlIHNlZ21lbnRzIGFsb25nIGEgbGluZWFyIHJhbXAuCi0gKiBUaGUgcmFtcCB0YXJnZXQgY2FuIGJlIHVwZGF0ZWQgZnJvbSBhbm90aGVyIHRocmVhZC4KLSAqIFdoZW4gdGhlIHRhcmdldCBpcyB1cGRhdGVkLCBhIG5ldyByYW1wIGlzIHN0YXJ0ZWQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbi4KLSAqCi0gKiBUaGUgZmlyc3QgcmFtcCBzdGFydHMgYXQgMC4wLgotICoKLSAqLwotY2xhc3MgTGluZWFyUmFtcCB7Ci1wdWJsaWM6Ci0gICAgTGluZWFyUmFtcCgpIHsKLSAgICAgICAgbVRhcmdldC5zdG9yZSgxLjBmKTsKLSAgICB9Ci0KLSAgICB2b2lkIHNldExlbmd0aEluRnJhbWVzKGludDMyX3QgZnJhbWVzKSB7Ci0gICAgICAgIG1MZW5ndGhJbkZyYW1lcyA9IGZyYW1lczsKLSAgICB9Ci0KLSAgICBpbnQzMl90IGdldExlbmd0aEluRnJhbWVzKCkgewotICAgICAgICByZXR1cm4gbUxlbmd0aEluRnJhbWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWF5IGJlIGNhbGxlZCBieSBhbm90aGVyIHRocmVhZC4KLSAgICAgKiBAcGFyYW0gdGFyZ2V0Ci0gICAgICovCi0gICAgdm9pZCBzZXRUYXJnZXQoZmxvYXQgdGFyZ2V0KSB7Ci0gICAgICAgIG1UYXJnZXQuc3RvcmUodGFyZ2V0KTsKLSAgICB9Ci0KLSAgICBmbG9hdCBnZXRUYXJnZXQoKSB7Ci0gICAgICAgIHJldHVybiBtVGFyZ2V0LmxvYWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3JjZSB0aGUgbmV4dFNlZ21lbnQgdG8gc3RhcnQgZnJvbSB0aGlzIGxldmVsLgotICAgICAqCi0gICAgICogV0FSTklORzogdGhpcyBjYW4gY2F1c2UgYSBkaXNjb250aW51aXR5IGlmIGNhbGxlZCB3aGlsZSB0aGUgcmFtcCBpcyBiZWluZyB1c2VkLgotICAgICAqIE9ubHkgY2FsbCB0aGlzIHdoZW4gc2V0dGluZyB0aGUgaW5pdGlhbCByYW1wLgotICAgICAqCi0gICAgICogQHBhcmFtIGxldmVsCi0gICAgICovCi0gICAgdm9pZCBmb3JjZUN1cnJlbnQoZmxvYXQgbGV2ZWwpIHsKLSAgICAgICAgbUxldmVsRnJvbSA9IGxldmVsOwotICAgICAgICBtTGV2ZWxUbyA9IGxldmVsOyAvLyBmb3JjZXMgYSByYW1wIGlmIGl0IGRvZXMgbm90IG1hdGNoIHRhcmdldAotICAgIH0KLQotICAgIGZsb2F0IGdldEN1cnJlbnQoKSB7Ci0gICAgICAgIHJldHVybiBtTGV2ZWxGcm9tOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBsZXZlbHMgZm9yIG5leHQgcmFtcCBzZWdtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGZyYW1lcyBudW1iZXIgb2YgZnJhbWVzIGluIHRoZSBzZWdtZW50Ci0gICAgICogQHBhcmFtIGxldmVsRnJvbSBwb2ludGVyIHRvIHN0YXJ0aW5nIGFtcGxpdHVkZQotICAgICAqIEBwYXJhbSBsZXZlbFRvIHBvaW50ZXIgdG8gZW5kaW5nIGFtcGxpdHVkZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiByYW1wIGlzIHN0aWxsIG1vdmluZyB0b3dhcmRzIHRoZSB0YXJnZXQKLSAgICAgKi8KLSAgICBib29sIG5leHRTZWdtZW50KGludDMyX3QgZnJhbWVzLCBmbG9hdCAqbGV2ZWxGcm9tLCBmbG9hdCAqbGV2ZWxUbyk7Ci0KLXByaXZhdGU6Ci0KLSAgICBib29sIGlzUmFtcGluZygpOwotCi0gICAgc3RkOjphdG9taWM8ZmxvYXQ+ICAgbVRhcmdldDsKLQotICAgIGludDMyX3QgbUxlbmd0aEluRnJhbWVzICA9IDQ4MDAwIC8gMTAwOyAvLyAxMCBtc2VjIGF0IDQ4MDAwIEh6Ci0gICAgaW50MzJfdCBtUmVtYWluaW5nICAgICAgID0gMDsKLSAgICBmbG9hdCAgIG1MZXZlbEZyb20gICAgICAgPSAwLjBmOwotICAgIGZsb2F0ICAgbUxldmVsVG8gICAgICAgICA9IDAuMGY7Ci19OwotCi0KLSNlbmRpZiAvL0FBVURJT19MSU5FQVJfUkFNUF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTW9ub3RvbmljQ291bnRlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L01vbm90b25pY0NvdW50ZXIuaAppbmRleCA1ODMzZWFiLi42M2FkZDRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTW9ub3RvbmljQ291bnRlci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9Nb25vdG9uaWNDb3VudGVyLmgKQEAgLTQxLDEwICs0MSwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIHNldCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgY291bnRlcgorICAgICAqIGFkdmFuY2UgdGhlIGN1cnJlbnQgdmFsdWUgdG8gbWF0Y2ggdGhlIGNvdW50ZXIKICAgICAgKi8KLSAgICB2b2lkIHNldChpbnQ2NF90IGNvdW50ZXIpIHsKLSAgICAgICAgbUNvdW50ZXI2NCA9IGNvdW50ZXI7CisgICAgdm9pZCBjYXRjaFVwVG8oaW50NjRfdCBjb3VudGVyKSB7CisgICAgICAgIGlmICgoY291bnRlciAtIG1Db3VudGVyNjQpID4gMCkgeworICAgICAgICAgICAgbUNvdW50ZXI2NCA9IGNvdW50ZXI7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggNjgxOTRkYi4uOTU4YmIyZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTE5LDYgKzE5LDE4IEBACiB9CiAKIGNjX3Rlc3QgeworICAgIG5hbWU6ICJ0ZXN0X2Nsb2NrX21vZGVsIiwKKyAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInRlc3RfY2xvY2tfbW9kZWwuY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmFhdWRpbyIsCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CiAgICAgbmFtZTogInRlc3RfYmxvY2tfYWRhcHRlciIsCiAgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCiAgICAgc3JjczogWyJ0ZXN0X2Jsb2NrX2FkYXB0ZXIuY3BwIl0sCkBAIC0zNCwxMyArNDYsNiBAQAogfQogCiBjY190ZXN0IHsKLSAgICBuYW1lOiAidGVzdF9saW5lYXJfcmFtcCIsCi0gICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCi0gICAgc3JjczogWyJ0ZXN0X2xpbmVhcl9yYW1wLmNwcCJdLAotICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAotfQotCi1jY190ZXN0IHsKICAgICBuYW1lOiAidGVzdF9vcGVuX3BhcmFtcyIsCiAgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCiAgICAgc3JjczogWyJ0ZXN0X29wZW5fcGFyYW1zLmNwcCJdLApAQCAtMTY3LDMgKzE3MiwzNCBAQAogICAgIHNyY3M6IFsidGVzdF9hdG9taWNfZmlmby5jcHAiXSwKICAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKIH0KKworY2NfdGVzdCB7CisgICAgbmFtZTogInRlc3RfZmxvd2dyYXBoIiwKKyAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInRlc3RfZmxvd2dyYXBoLmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhYXVkaW8iLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogInRlc3RfcmV0dXJuX3N0b3AiLAorICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsidGVzdF9yZXR1cm5fc3RvcC5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYWF1ZGlvIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJ0ZXN0X2Z1bGxfcXVldWUiLAorICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsidGVzdF9mdWxsX3F1ZXVlLmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXRvbWljX2ZpZm8uY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXRvbWljX2ZpZm8uY3BwCmluZGV4IDBlZGZlYmUuLjEzMGVmNDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2F0b21pY19maWZvLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdG9taWNfZmlmby5jcHAKQEAgLTE1OCwxNCArMTU4LDE0IEBACiAgICAgICAgIC8vIERvZXMgdGhlIHN1bSBvZiB0aGUgdHdvIHBhcnRzIG1hdGNoIHRoZSBhdmFpbGFibGUgdmFsdWUgcmV0dXJuZWQ/CiAgICAgICAgIC8vIEZvciBFbXB0eVJvb20KICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPQotICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOworICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCk7CiAgICAgICAgIGZpZm9fZnJhbWVzX3Qgd3JhcEF2YWlsYWJsZSA9IG1GaWZvQnVmZmVyLmdldEVtcHR5Um9vbUF2YWlsYWJsZSgmd3JhcHBpbmdCdWZmZXIpOwogICAgICAgICBFWFBFQ1RfRVEoZnJhbWVzQXZhaWxhYmxlLCB3cmFwQXZhaWxhYmxlKTsKICAgICAgICAgZmlmb19mcmFtZXNfdCBib3RoQXZhaWxhYmxlID0gd3JhcHBpbmdCdWZmZXIubnVtRnJhbWVzWzBdICsgd3JhcHBpbmdCdWZmZXIubnVtRnJhbWVzWzFdOwogICAgICAgICBFWFBFQ1RfRVEoZnJhbWVzQXZhaWxhYmxlLCBib3RoQXZhaWxhYmxlKTsKICAgICAgICAgLy8gRm9yIEZ1bGxEYXRhCiAgICAgICAgIGZyYW1lc0F2YWlsYWJsZSA9Ci0gICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CiAgICAgICAgIHdyYXBBdmFpbGFibGUgPSBtRmlmb0J1ZmZlci5nZXRGdWxsRGF0YUF2YWlsYWJsZSgmd3JhcHBpbmdCdWZmZXIpOwogICAgICAgICBFWFBFQ1RfRVEoZnJhbWVzQXZhaWxhYmxlLCB3cmFwQXZhaWxhYmxlKTsKICAgICAgICAgYm90aEF2YWlsYWJsZSA9IHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1swXSArIHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1sxXTsKQEAgLTE5OCw3ICsxOTgsNyBAQAogICAgIC8vIFdyaXRlIGRhdGEgYnV0IGRvIG5vdCBvdmVyZmxvdy4KICAgICB2b2lkIHdyaXRlTXVsdGlwbGVEYXRhRnJhbWVzKGZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzKSB7CiAgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0KLSAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc1RvV3JpdGUgPSBzdGQ6Om1pbihmcmFtZXNBdmFpbGFibGUsIG51bUZyYW1lcyk7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVzVG9Xcml0ZTsgaSsrKSB7CiAgICAgICAgICAgICBtRGF0YVtpXSA9IG1OZXh0V3JpdGVJbmRleCsrOwpAQCAtMjEwLDcgKzIxMCw3IEBACiAgICAgLy8gUmVhZCB3aGF0ZXZlciBkYXRhIGlzIGF2YWlsYWJsZSwgRG8gbm90IHVuZGVyZmxvdy4KICAgICB2b2lkIHZlcmlmeU11bHRpcGxlRGF0YUZyYW1lcyhmaWZvX2ZyYW1lc190IG51bUZyYW1lcykgewogICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0F2YWlsYWJsZSA9Ci0gICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CiAgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzVG9SZWFkID0gc3RkOjptaW4oZnJhbWVzQXZhaWxhYmxlLCBudW1GcmFtZXMpOwogICAgICAgICBmaWZvX2ZyYW1lc190IGFjdHVhbCA9IG1GaWZvQnVmZmVyLnJlYWQobURhdGEsIGZyYW1lc1RvUmVhZCk7CiAgICAgICAgIEFTU0VSVF9FUShmcmFtZXNUb1JlYWQsIGFjdHVhbCk7CkBAIC0yMjIsNyArMjIyLDcgQEAKICAgICAvLyBSZWFkIHNwZWNpZmllZCBudW1iZXIgb2YgZnJhbWVzCiAgICAgdm9pZCB2ZXJpZnlSZXF1ZXN0ZWREYXRhKGZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzKSB7CiAgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0KLSAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOworICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKICAgICAgICAgQVNTRVJUX0xFKG51bUZyYW1lcywgZnJhbWVzQXZhaWxhYmxlKTsKICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNUb1JlYWQgPSBzdGQ6Om1pbihmcmFtZXNBdmFpbGFibGUsIG51bUZyYW1lcyk7CiAgICAgICAgIGZpZm9fZnJhbWVzX3QgYWN0dWFsID0gbUZpZm9CdWZmZXIucmVhZChtRGF0YSwgZnJhbWVzVG9SZWFkKTsKQEAgLTI4MiwxMiArMjgyLDEyIEBACiAgICAgdm9pZCBjaGVja1JhbmRvbVdyaXRlUmVhZCgpIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyMDsgaSsrKSB7CiAgICAgICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0VtcHR5ID0KLSAgICAgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCk7CisgICAgICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCk7CiAgICAgICAgICAgICBmaWZvX2ZyYW1lc190IG51bUZyYW1lcyA9IChmaWZvX2ZyYW1lc190KShkcmFuZDQ4KCkgKiBmcmFtZXNFbXB0eSk7CiAgICAgICAgICAgICB3cml0ZU11bHRpcGxlRGF0YUZyYW1lcyhudW1GcmFtZXMpOwogCiAgICAgICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0Z1bGwgPQotICAgICAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOworICAgICAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CiAgICAgICAgICAgICBudW1GcmFtZXMgPSAoZmlmb19mcmFtZXNfdCkoZHJhbmQ0OCgpICogZnJhbWVzRnVsbCk7CiAgICAgICAgICAgICB2ZXJpZnlNdWx0aXBsZURhdGFGcmFtZXMobnVtRnJhbWVzKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXR0cmlidXRlcy5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdHRyaWJ1dGVzLmNwcAppbmRleCBiMDFhZjI1Li4zMmVlMmEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdHRyaWJ1dGVzLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdHRyaWJ1dGVzLmNwcApAQCAtMzIsNiArMzIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb191c2FnZV90IHVzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19jb250ZW50X3R5cGVfdCBjb250ZW50VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9faW5wdXRfcHJlc2V0X3QgcHJlc2V0ID0gRE9OVF9TRVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBjYXB0dXJlUG9saWN5ID0gRE9OVF9TRVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2RpcmVjdGlvbl90IGRpcmVjdGlvbiA9IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUKSB7CiAKICAgICBmbG9hdCAqYnVmZmVyID0gbmV3IGZsb2F0W2tOdW1GcmFtZXMgKiBrQ2hhbm5lbENvdW50XTsKQEAgLTU2LDYgKzU3LDkgQEAKICAgICBpZiAocHJlc2V0ICE9IERPTlRfU0VUKSB7CiAgICAgICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0SW5wdXRQcmVzZXQoYWF1ZGlvQnVpbGRlciwgcHJlc2V0KTsKICAgICB9CisgICAgaWYgKGNhcHR1cmVQb2xpY3kgIT0gRE9OVF9TRVQpIHsKKyAgICAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRBbGxvd2VkQ2FwdHVyZVBvbGljeShhYXVkaW9CdWlsZGVyLCBjYXB0dXJlUG9saWN5KTsKKyAgICB9CiAKICAgICAvLyBDcmVhdGUgYW4gQUF1ZGlvU3RyZWFtIHVzaW5nIHRoZSBCdWlsZGVyLgogICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbShhYXVkaW9CdWlsZGVyLCAmYWF1ZGlvU3RyZWFtKSk7CkBAIC04MCw2ICs4NCwxMiBAQAogICAgICAgICAgICAgOiBwcmVzZXQ7CiAgICAgRVhQRUNUX0VRKGV4cGVjdGVkUHJlc2V0LCBBQXVkaW9TdHJlYW1fZ2V0SW5wdXRQcmVzZXQoYWF1ZGlvU3RyZWFtKSk7CiAKKyAgICBhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV90IGV4cGVjdGVkQ2FwdHVyZVBvbGljeSA9CisgICAgICAgICAgICAoY2FwdHVyZVBvbGljeSA9PSBET05UX1NFVCB8fCBjYXB0dXJlUG9saWN5ID09IEFBVURJT19VTlNQRUNJRklFRCkKKyAgICAgICAgICAgID8gQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfQUxMIC8vIGRlZmF1bHQKKyAgICAgICAgICAgIDogcHJlc2V0OworICAgIEVYUEVDVF9FUShleHBlY3RlZENhcHR1cmVQb2xpY3ksIEFBdWRpb1N0cmVhbV9nZXRBbGxvd2VkQ2FwdHVyZVBvbGljeShhYXVkaW9TdHJlYW0pKTsKKwogICAgIEVYUEVDVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoYWF1ZGlvU3RyZWFtKSk7CiAKICAgICBpZiAoZGlyZWN0aW9uID09IEFBVURJT19ESVJFQ1RJT05fSU5QVVQpIHsKQEAgLTEzMCw2ICsxNDAsMTUgQEAKICAgICBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1JFQ09HTklUSU9OLAogICAgIEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfQ09NTVVOSUNBVElPTiwKICAgICBBQVVESU9fSU5QVVRfUFJFU0VUX1VOUFJPQ0VTU0VELAorICAgIEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUEVSRk9STUFOQ0UsCit9OworCitzdGF0aWMgY29uc3QgYWF1ZGlvX2lucHV0X3ByZXNldF90IHNBbGxvd0NhcHR1cmVQb2xpY2llc1tdID0geworICAgIERPTlRfU0VULAorICAgIEFBVURJT19VTlNQRUNJRklFRCwKKyAgICBBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9BTEwsCisgICAgQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfU1lTVEVNLAorICAgIEFBVURJT19BTExPV19DQVBUVVJFX0JZX05PTkUsCiB9OwogCiBzdGF0aWMgdm9pZCBjaGVja0F0dHJpYnV0ZXNVc2FnZShhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90IHBlcmZNb2RlKSB7CkBAIC0xMzgsNyArMTU3LDcgQEAKICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNoZWNrQXR0cmlidXRlc0NvbnRlbnRUeXBlKGFhdWRpb19pbnB1dF9wcmVzZXRfdCBwZXJmTW9kZSkgeworc3RhdGljIHZvaWQgY2hlY2tBdHRyaWJ1dGVzQ29udGVudFR5cGUoYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSkgewogICAgIGZvciAoYWF1ZGlvX2NvbnRlbnRfdHlwZV90IGNvbnRlbnRUeXBlIDogc0NvbnRlbnR5cGVzKSB7CiAgICAgICAgIGNoZWNrQXR0cmlidXRlcyhwZXJmTW9kZSwgRE9OVF9TRVQsIGNvbnRlbnRUeXBlKTsKICAgICB9CkBAIC0xNTAsNiArMTY5LDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBET05UX1NFVCwKICAgICAgICAgICAgICAgICAgICAgICAgIERPTlRfU0VULAogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQcmVzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBET05UX1NFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19ESVJFQ1RJT05fSU5QVVQpOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY2hlY2tBdHRyaWJ1dGVzQWxsb3dlZENhcHR1cmVQb2xpY3koYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSkgeworICAgIGZvciAoYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBwb2xpY3kgOiBzQWxsb3dDYXB0dXJlUG9saWNpZXMpIHsKKyAgICAgICAgY2hlY2tBdHRyaWJ1dGVzKHBlcmZNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgRE9OVF9TRVQsCisgICAgICAgICAgICAgICAgICAgICAgICBET05UX1NFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIERPTlRfU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5LAogICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0RJUkVDVElPTl9JTlBVVCk7CiAgICAgfQogfQpAQCAtMTY2LDYgKzE5NywxMCBAQAogICAgIGNoZWNrQXR0cmlidXRlc0lucHV0UHJlc2V0KEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUpOwogfQogCitURVNUKHRlc3RfYXR0cmlidXRlcywgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfcGVyZm5vbmUpIHsKKyAgICBjaGVja0F0dHJpYnV0ZXNBbGxvd2VkQ2FwdHVyZVBvbGljeShBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FKTsKK30KKwogVEVTVCh0ZXN0X2F0dHJpYnV0ZXMsIGFhdWRpb191c2FnZV9sb3dsYXQpIHsKICAgICBjaGVja0F0dHJpYnV0ZXNVc2FnZShBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSk7CiB9CkBAIC0xNzcsMyArMjEyLDcgQEAKIFRFU1QodGVzdF9hdHRyaWJ1dGVzLCBhYXVkaW9faW5wdXRfcHJlc2V0X2xvd2xhdCkgewogICAgIGNoZWNrQXR0cmlidXRlc0lucHV0UHJlc2V0KEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZKTsKIH0KKworVEVTVCh0ZXN0X2F0dHJpYnV0ZXMsIGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X2xvd2xhdCkgeworICAgIGNoZWNrQXR0cmlidXRlc0FsbG93ZWRDYXB0dXJlUG9saWN5KEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2Nsb2NrX21vZGVsLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2Nsb2NrX21vZGVsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjdhYmJkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfY2xvY2tfbW9kZWwuY3BwCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVW5pdCB0ZXN0cyBmb3IgSXNvY2hyb25vdXMgQ2xvY2sgTW9kZWwKKworI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworCisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Nsb2NrLmg+CisjaW5jbHVkZSA8Y2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhYXVkaW87CisKKy8vIFdlIGNhbiB1c2UgYXJiaXRyYXJ5IHZhbHVlcyBoZXJlIGJlY2F1c2Ugd2UgYXJlIG5vdCBvcGVuaW5nIGEgcmVhbCBhdWRpbyBzdHJlYW0uCisjZGVmaW5lIFNBTVBMRV9SQVRFICAgICAgICAgICAgIDQ4MDAwCisjZGVmaW5lIEhXX0ZSQU1FU19QRVJfQlVSU1QgICAgIDQ4CisjZGVmaW5lIE5BTk9TX1BFUl9CVVJTVCAgICAgICAgIChOQU5PU19QRVJfU0VDT05EICogSFdfRlJBTUVTX1BFUl9CVVJTVCAvIFNBTVBMRV9SQVRFKQorCitjbGFzcyBDbG9ja01vZGVsVGVzdEZpeHR1cmU6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIENsb2NrTW9kZWxUZXN0Rml4dHVyZSgpIHsKKyAgICB9CisKKyAgICB2b2lkIFNldFVwKCkgeworICAgICAgICBtb2RlbC5zZXRTYW1wbGVSYXRlKFNBTVBMRV9SQVRFKTsKKyAgICAgICAgbW9kZWwuc2V0RnJhbWVzUGVyQnVyc3QoSFdfRlJBTUVTX1BFUl9CVVJTVCk7CisgICAgfQorCisgICAgdm9pZCBUZWFyRG93bigpIHsKKyAgICB9CisKKyAgICB+Q2xvY2tNb2RlbFRlc3RGaXh0dXJlKCkgIHsKKyAgICAgICAgLy8gY2xlYW51cCBhbnkgcGVuZGluZyBzdHVmZiwgYnV0IG5vIGV4Y2VwdGlvbnMgYWxsb3dlZAorICAgIH0KKworICAgIC8vIFRlc3QgcHJvY2Vzc2luZyBvZiB0aW1lc3RhbXBzIHdoZW4gdGhlIGhhcmR3YXJlIG1heSBiZSBzbGlnaHRseSBvZmYgZnJvbQorICAgIC8vIHRoZSBleHBlY3RlZCBzYW1wbGUgcmF0ZS4KKyAgICB2b2lkIGNoZWNrRHJpZnRpbmdDbG9jayhkb3VibGUgaGFyZHdhcmVGcmFtZXNQZXJTZWNvbmQsIGludCBudW1Mb29wcykgeworICAgICAgICBjb25zdCBpbnQ2NF90IHN0YXJ0VGltZU5hbm9zID0gNTAwMDAwMDAwOyAvLyBhcmJpdHJhcnkKKyAgICAgICAgbW9kZWwuc3RhcnQoc3RhcnRUaW1lTmFub3MpOworCisgICAgICAgIGNvbnN0IGludDY0X3Qgc3RhcnRQb3NpdGlvbkZyYW1lcyA9IEhXX0ZSQU1FU19QRVJfQlVSU1Q7IC8vIGhhcmR3YXJlCisgICAgICAgIC8vIGFyYml0cmFyeSB0aW1lIGZvciBmaXJzdCBidXJzdAorICAgICAgICBjb25zdCBpbnQ2NF90IG1hcmtlclRpbWUgPSBzdGFydFRpbWVOYW5vcyArIE5BTk9TX1BFUl9NSUxMSVNFQ09ORAorICAgICAgICAgICAgICAgICsgKDIwMCAqIE5BTk9TX1BFUl9NSUNST1NFQ09ORCk7CisKKyAgICAgICAgLy8gU2hvdWxkIHNldCBpbml0aWFsIG1hcmtlci4KKyAgICAgICAgbW9kZWwucHJvY2Vzc1RpbWVzdGFtcChzdGFydFBvc2l0aW9uRnJhbWVzLCBtYXJrZXJUaW1lKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXJ0UG9zaXRpb25GcmFtZXMsIG1vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbihtYXJrZXJUaW1lKSk7CisKKyAgICAgICAgZG91YmxlIGVsYXBzZWRUaW1lU2Vjb25kcyA9IHN0YXJ0VGltZU5hbm9zIC8gKGRvdWJsZSkgTkFOT1NfUEVSX1NFQ09ORDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1Mb29wczsgaSsrKSB7CisgICAgICAgICAgICAvLyBDYWxjdWxhdGUgcmFuZG9tIGRlbGF5IG92ZXIgc2V2ZXJhbCBidXJzdHMuCisgICAgICAgICAgICBjb25zdCBkb3VibGUgdGltZURlbGF5U2Vjb25kcyA9IDEwLjAgKiBkcmFuZDQ4KCkgKiBOQU5PU19QRVJfQlVSU1QgLyBOQU5PU19QRVJfU0VDT05EOworICAgICAgICAgICAgZWxhcHNlZFRpbWVTZWNvbmRzICs9IHRpbWVEZWxheVNlY29uZHM7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGVsYXBzZWRUaW1lTmFub3MgPSAoaW50NjRfdCkoZWxhcHNlZFRpbWVTZWNvbmRzICogTkFOT1NfUEVSX1NFQ09ORCk7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGN1cnJlbnRUaW1lTmFub3MgPSBzdGFydFRpbWVOYW5vcyArIGVsYXBzZWRUaW1lTmFub3M7CisgICAgICAgICAgICAvLyBTaW11bGF0ZSBEU1AgcnVubmluZyBhdCB0aGUgc3BlY2lmaWVkIHJhdGUuCisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGN1cnJlbnRUaW1lRnJhbWVzID0gc3RhcnRQb3NpdGlvbkZyYW1lcyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpKGhhcmR3YXJlRnJhbWVzUGVyU2Vjb25kICogZWxhcHNlZFRpbWVTZWNvbmRzKTsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgbnVtQnVyc3RzID0gY3VycmVudFRpbWVGcmFtZXMgLyBIV19GUkFNRVNfUEVSX0JVUlNUOworICAgICAgICAgICAgY29uc3QgaW50NjRfdCBhbGlnbmVkUG9zaXRpb24gPSBzdGFydFBvc2l0aW9uRnJhbWVzICsgKG51bUJ1cnN0cyAqIEhXX0ZSQU1FU19QRVJfQlVSU1QpOworCisgICAgICAgICAgICAvLyBBcHBseSBkcmlmdGluZyB0aW1lc3RhbXAuCisgICAgICAgICAgICBtb2RlbC5wcm9jZXNzVGltZXN0YW1wKGFsaWduZWRQb3NpdGlvbiwgY3VycmVudFRpbWVOYW5vcyk7CisKKyAgICAgICAgICAgIEFTU0VSVF9FUShhbGlnbmVkUG9zaXRpb24sIG1vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbihjdXJyZW50VGltZU5hbm9zKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBJc29jaHJvbm91c0Nsb2NrTW9kZWwgbW9kZWw7Cit9OworCisvLyBDaGVjayBkZWZhdWx0IHNldHVwLgorVEVTVF9GKENsb2NrTW9kZWxUZXN0Rml4dHVyZSwgY2xvY2tfc2V0dXApIHsKKyAgICBBU1NFUlRfRVEoU0FNUExFX1JBVEUsIG1vZGVsLmdldFNhbXBsZVJhdGUoKSk7CisgICAgQVNTRVJUX0VRKEhXX0ZSQU1FU19QRVJfQlVSU1QsIG1vZGVsLmdldEZyYW1lc1BlckJ1cnN0KCkpOworfQorCisvLyBUZXN0IGRlbHRhIGNhbGN1bGF0aW9ucy4KK1RFU1RfRihDbG9ja01vZGVsVGVzdEZpeHR1cmUsIGNsb2NrX2RlbHRhcykgeworICAgIGludDY0X3QgcG9zaXRpb24gPSBtb2RlbC5jb252ZXJ0RGVsdGFUaW1lVG9Qb3NpdGlvbihOQU5PU19QRVJfU0VDT05EKTsKKyAgICBBU1NFUlRfRVEoU0FNUExFX1JBVEUsIHBvc2l0aW9uKTsKKworICAgIC8vIERlbHRhcyBhcmUgbm90IHF1YW50aXplZC4KKyAgICAvLyBDb21wYXJlIHRpbWUgdG8gdGhlIGVxdWl2YWxlbnQgcG9zaXRpb24gaW4gZnJhbWVzLgorICAgIGNvbnN0ZXhwciBpbnQ2NF90IGtOYW5vc1BlckJ1cnN0ID0gSFdfRlJBTUVTX1BFUl9CVVJTVCAqIE5BTk9TX1BFUl9TRUNPTkQgLyBTQU1QTEVfUkFURTsKKyAgICBwb3NpdGlvbiA9IG1vZGVsLmNvbnZlcnREZWx0YVRpbWVUb1Bvc2l0aW9uKE5BTk9TX1BFUl9TRUNPTkQgKyAoa05hbm9zUGVyQnVyc3QgLyAyKSk7CisgICAgQVNTRVJUX0VRKFNBTVBMRV9SQVRFICsgKEhXX0ZSQU1FU19QRVJfQlVSU1QgLyAyKSwgcG9zaXRpb24pOworCisgICAgaW50NjRfdCB0aW1lID0gbW9kZWwuY29udmVydERlbHRhUG9zaXRpb25Ub1RpbWUoU0FNUExFX1JBVEUpOworICAgIEFTU0VSVF9FUShOQU5PU19QRVJfU0VDT05ELCB0aW1lKTsKKworICAgIC8vIENvbXBhcmUgcG9zaXRpb24gaW4gZnJhbWVzIHRvIHRoZSBlcXVpdmFsZW50IHRpbWUuCisgICAgdGltZSA9IG1vZGVsLmNvbnZlcnREZWx0YVBvc2l0aW9uVG9UaW1lKFNBTVBMRV9SQVRFICsgKEhXX0ZSQU1FU19QRVJfQlVSU1QgLyAyKSk7CisgICAgQVNTRVJUX0VRKE5BTk9TX1BFUl9TRUNPTkQgKyAoa05hbm9zUGVyQnVyc3QgLyAyKSwgdGltZSk7Cit9CisKKy8vIHN0YXJ0KCkgc2hvdWxkIGZvcmNlIHRoZSBpbnRlcm5hbCBtYXJrZXJzCitURVNUX0YoQ2xvY2tNb2RlbFRlc3RGaXh0dXJlLCBjbG9ja19zdGFydCkgeworICAgIGNvbnN0IGludDY0X3Qgc3RhcnRUaW1lID0gMTAwMDAwOworICAgIG1vZGVsLnN0YXJ0KHN0YXJ0VGltZSk7CisKKyAgICBpbnQ2NF90IHBvc2l0aW9uID0gbW9kZWwuY29udmVydFRpbWVUb1Bvc2l0aW9uKHN0YXJ0VGltZSk7CisgICAgRVhQRUNUX0VRKDAsIHBvc2l0aW9uKTsKKworICAgIGludDY0X3QgdGltZSA9IG1vZGVsLmNvbnZlcnRQb3NpdGlvblRvVGltZShwb3NpdGlvbik7CisgICAgRVhQRUNUX0VRKHN0YXJ0VGltZSwgdGltZSk7CisKKyAgICB0aW1lID0gc3RhcnRUaW1lICsgKDUwMCAqIE5BTk9TX1BFUl9NSUNST1NFQ09ORCk7CisgICAgcG9zaXRpb24gPSBtb2RlbC5jb252ZXJ0VGltZVRvUG9zaXRpb24odGltZSk7CisgICAgRVhQRUNUX0VRKDAsIHBvc2l0aW9uKTsKK30KKworLy8gdGltZXN0YW1wcyBtb3ZlcyB0aGUgd2luZG93IGlmIG91dHNpZGUgdGhlIGJvdW5kcworVEVTVF9GKENsb2NrTW9kZWxUZXN0Rml4dHVyZSwgY2xvY2tfdGltZXN0YW1wKSB7CisgICAgY29uc3QgaW50NjRfdCBzdGFydFRpbWUgPSAxMDAwMDAwMDA7CisgICAgbW9kZWwuc3RhcnQoc3RhcnRUaW1lKTsKKworICAgIGNvbnN0IGludDY0X3QgcG9zaXRpb24gPSBIV19GUkFNRVNfUEVSX0JVUlNUOyAvLyBoYXJkd2FyZQorICAgIGludDY0X3QgbWFya2VyVGltZSA9IHN0YXJ0VGltZSArIE5BTk9TX1BFUl9NSUxMSVNFQ09ORCArICgyMDAgKiBOQU5PU19QRVJfTUlDUk9TRUNPTkQpOworCisgICAgLy8gU2hvdWxkIHNldCBtYXJrZXIuCisgICAgbW9kZWwucHJvY2Vzc1RpbWVzdGFtcChwb3NpdGlvbiwgbWFya2VyVGltZSk7CisgICAgRVhQRUNUX0VRKHBvc2l0aW9uLCBtb2RlbC5jb252ZXJ0VGltZVRvUG9zaXRpb24obWFya2VyVGltZSkpOworCisgICAgLy8gY29udmVydFRpbWVUb1Bvc2l0aW9uIHJvdW5kcyBkb3duCisgICAgRVhQRUNUX0VRKHBvc2l0aW9uLCBtb2RlbC5jb252ZXJ0VGltZVRvUG9zaXRpb24obWFya2VyVGltZSArICg3MyAqIE5BTk9TX1BFUl9NSUNST1NFQ09ORCkpKTsKKworICAgIC8vIGNvbnZlcnRQb3NpdGlvblRvVGltZSByb3VuZHMgdXAKKyAgICBFWFBFQ1RfRVEobWFya2VyVGltZSArIE5BTk9TX1BFUl9CVVJTVCwgbW9kZWwuY29udmVydFBvc2l0aW9uVG9UaW1lKHBvc2l0aW9uICsgMTcpKTsKK30KKworI2RlZmluZSBOVU1fTE9PUFNfRFJJRlQgICAxMDAwMAorCisvLyB0ZXN0IG51ZGdpbmcgdGhlIHdpbmRvdyBieSB1c2luZyBhIGRyaWZ0aW5nIEhXIGNsb2NrCitURVNUX0YoQ2xvY2tNb2RlbFRlc3RGaXh0dXJlLCBjbG9ja19ub19kcmlmdCkgeworICAgIGNoZWNrRHJpZnRpbmdDbG9jayhTQU1QTEVfUkFURSwgTlVNX0xPT1BTX0RSSUZUKTsKK30KKworLy8gVGhlc2Ugc2xvdyBkcmlmdCByYXRlcyBjYXVzZWQgZXJyb3JzIHdoZW4gSSBkaXNhYmxlZCB0aGUgY29kZSB0aGF0IGhhbmRsZXMKKy8vIGRyaWZ0aW5nIGluIHRoZSBjbG9jayBtb2RlbC4gU28gSSB0aGluayB0aGUgdGVzdCBpcyB2YWxpZC4KKy8vIEl0IGlzIHVubGlrZWx5IHRoYXQgcmVhbCBoYXJkd2FyZSB3b3VsZCBiZSBvZmYgYnkgbW9yZSB0aGFuIHRoaXMgYW1vdW50LgorVEVTVF9GKENsb2NrTW9kZWxUZXN0Rml4dHVyZSwgY2xvY2tfc2xvd19kcmlmdCkgeworICAgIGNoZWNrRHJpZnRpbmdDbG9jaygwLjk5OCAqIFNBTVBMRV9SQVRFLCBOVU1fTE9PUFNfRFJJRlQpOworfQorCitURVNUX0YoQ2xvY2tNb2RlbFRlc3RGaXh0dXJlLCBjbG9ja19mYXN0X2RyaWZ0KSB7CisgICAgY2hlY2tEcmlmdGluZ0Nsb2NrKDEuMDAyICogU0FNUExFX1JBVEUsIE5VTV9MT09QU19EUklGVCk7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfZmxvd2dyYXBoLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2Zsb3dncmFwaC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU2M2E3ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2Zsb3dncmFwaC5jcHAKQEAgLTAsMCArMSwxNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBUZXN0IEZsb3dHcmFwaAorICovCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlICJmbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuaCIKKyNpbmNsdWRlICJmbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuaCIKKyNpbmNsdWRlICJmbG93Z3JhcGgvU291cmNlRmxvYXQuaCIKKyNpbmNsdWRlICJmbG93Z3JhcGgvUmFtcExpbmVhci5oIgorI2luY2x1ZGUgImZsb3dncmFwaC9TaW5rRmxvYXQuaCIKKyNpbmNsdWRlICJmbG93Z3JhcGgvU2lua0kxNi5oIgorI2luY2x1ZGUgImZsb3dncmFwaC9TaW5rSTI0LmgiCisjaW5jbHVkZSAiZmxvd2dyYXBoL1NvdXJjZUkxNi5oIgorI2luY2x1ZGUgImZsb3dncmFwaC9Tb3VyY2VJMjQuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworY29uc3RleHByIGludCBrQnl0ZXNQZXJJMjRQYWNrZWQgPSAzOworCitURVNUKHRlc3RfZmxvd2dyYXBoLCBtb2R1bGVfc2lua2kxNikgeworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBpbnB1dFtdID0gezEuMGYsIDAuNWYsIC0wLjI1ZiwgLTEuMGYsIDAuMGYsIDUzLjlmLCAtODcuMmZ9OworICAgIHN0YXRpYyBjb25zdCBpbnQxNl90IGV4cGVjdGVkW10gPSB7MzI3NjcsIDE2Mzg0LCAtODE5MiwgLTMyNzY4LCAwLCAzMjc2NywgLTMyNzY4fTsKKyAgICBpbnQxNl90IG91dHB1dFsyMF07CisgICAgU291cmNlRmxvYXQgc291cmNlRmxvYXR7MX07CisgICAgU2lua0kxNiBzaW5rSTE2ezF9OworCisgICAgaW50IG51bUlucHV0RnJhbWVzID0gc2l6ZW9mKGlucHV0KSAvIHNpemVvZihpbnB1dFswXSk7CisgICAgc291cmNlRmxvYXQuc2V0RGF0YShpbnB1dCwgbnVtSW5wdXRGcmFtZXMpOworICAgIHNvdXJjZUZsb2F0Lm91dHB1dC5jb25uZWN0KCZzaW5rSTE2LmlucHV0KTsKKworICAgIGludCBudW1PdXRwdXRGcmFtZXMgPSBzaXplb2Yob3V0cHV0KSAvIHNpemVvZihpbnQxNl90KTsKKyAgICBpbnQzMl90IG51bVJlYWQgPSBzaW5rSTE2LnJlYWQob3V0cHV0LCBudW1PdXRwdXRGcmFtZXMpOworICAgIEFTU0VSVF9FUShudW1JbnB1dEZyYW1lcywgbnVtUmVhZCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1SZWFkOyBpKyspIHsKKyAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkW2ldLCBvdXRwdXRbaV0pOworICAgIH0KK30KKworVEVTVCh0ZXN0X2Zsb3dncmFwaCwgbW9kdWxlX21vbm9fdG9fc3RlcmVvKSB7CisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGlucHV0W10gPSB7MS4wZiwgMi4wZiwgMy4wZn07CisgICAgZmxvYXQgb3V0cHV0WzEwMF0gPSB7fTsKKyAgICBTb3VyY2VGbG9hdCBzb3VyY2VGbG9hdHsxfTsKKyAgICBNb25vVG9NdWx0aUNvbnZlcnRlciBtb25vVG9TdGVyZW97Mn07CisgICAgU2lua0Zsb2F0IHNpbmtGbG9hdHsyfTsKKworICAgIHNvdXJjZUZsb2F0LnNldERhdGEoaW5wdXQsIDMpOworCisgICAgc291cmNlRmxvYXQub3V0cHV0LmNvbm5lY3QoJm1vbm9Ub1N0ZXJlby5pbnB1dCk7CisgICAgbW9ub1RvU3RlcmVvLm91dHB1dC5jb25uZWN0KCZzaW5rRmxvYXQuaW5wdXQpOworCisgICAgaW50MzJfdCBudW1SZWFkID0gc2lua0Zsb2F0LnJlYWQob3V0cHV0LCA4KTsKKyAgICBBU1NFUlRfRVEoMywgbnVtUmVhZCk7CisgICAgRVhQRUNUX0VRKGlucHV0WzBdLCBvdXRwdXRbMF0pOworICAgIEVYUEVDVF9FUShpbnB1dFswXSwgb3V0cHV0WzFdKTsKKyAgICBFWFBFQ1RfRVEoaW5wdXRbMV0sIG91dHB1dFsyXSk7CisgICAgRVhQRUNUX0VRKGlucHV0WzFdLCBvdXRwdXRbM10pOworfQorCitURVNUKHRlc3RfZmxvd2dyYXBoLCBtb2R1bGVfcmFtcF9saW5lYXIpIHsKKyAgICBjb25zdGV4cHIgaW50IHJhbXBTaXplID0gNTsKKyAgICBjb25zdGV4cHIgaW50IG51bU91dHB1dCA9IDEwMDsKKyAgICBjb25zdGV4cHIgZmxvYXQgdmFsdWUgPSAxLjBmOworICAgIGNvbnN0ZXhwciBmbG9hdCB0YXJnZXQgPSAxMDAuMGY7CisgICAgZmxvYXQgb3V0cHV0W251bU91dHB1dF0gPSB7fTsKKyAgICBSYW1wTGluZWFyIHJhbXBMaW5lYXJ7MX07CisgICAgU2lua0Zsb2F0IHNpbmtGbG9hdHsxfTsKKworICAgIHJhbXBMaW5lYXIuaW5wdXQuc2V0VmFsdWUodmFsdWUpOworICAgIHJhbXBMaW5lYXIuc2V0TGVuZ3RoSW5GcmFtZXMocmFtcFNpemUpOworICAgIHJhbXBMaW5lYXIuc2V0VGFyZ2V0KHRhcmdldCk7CisgICAgcmFtcExpbmVhci5mb3JjZUN1cnJlbnQoMC4wZik7CisKKyAgICByYW1wTGluZWFyLm91dHB1dC5jb25uZWN0KCZzaW5rRmxvYXQuaW5wdXQpOworCisgICAgaW50MzJfdCBudW1SZWFkID0gc2lua0Zsb2F0LnJlYWQob3V0cHV0LCBudW1PdXRwdXQpOworICAgIEFTU0VSVF9FUShudW1PdXRwdXQsIG51bVJlYWQpOworICAgIGNvbnN0ZXhwciBmbG9hdCB0b2xlcmFuY2UgPSAwLjAwMDFmOyAvLyBhcmJpdHJhcnkKKyAgICBpbnQgaSA9IDA7CisgICAgZm9yICg7IGkgPCByYW1wU2l6ZTsgaSsrKSB7CisgICAgICAgIGZsb2F0IGV4cGVjdGVkID0gaSAqIHZhbHVlICogdGFyZ2V0IC8gcmFtcFNpemU7CisgICAgICAgIEVYUEVDVF9ORUFSKGV4cGVjdGVkLCBvdXRwdXRbaV0sIHRvbGVyYW5jZSk7CisgICAgfQorICAgIGZvciAoOyBpIDwgbnVtT3V0cHV0OyBpKyspIHsKKyAgICAgICAgZmxvYXQgZXhwZWN0ZWQgPSB2YWx1ZSAqIHRhcmdldDsKKyAgICAgICAgRVhQRUNUX05FQVIoZXhwZWN0ZWQsIG91dHB1dFtpXSwgdG9sZXJhbmNlKTsKKyAgICB9Cit9CisKKy8vIEl0IGlzIGVhc2llc3QgdG8gcmVwcmVzZW50IHBhY2tlZCAyNC1iaXQgZGF0YSBhcyBhIGJ5dGUgYXJyYXkuCisvLyBUaGlzIHRlc3Qgd2lsbCByZWFkIGZyb20gaW5wdXQsIGNvbnZlcnQgdG8gZmxvYXQsIHRoZW4gd3JpdGUKKy8vIGJhY2sgdG8gb3V0cHV0IGFzIGJ5dGVzLgorVEVTVCh0ZXN0X2Zsb3dncmFwaCwgbW9kdWxlX3BhY2tlZF8yNCkgeworICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGlucHV0W10gPSB7MHgwMSwgMHgyMywgMHg0NSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NjcsIDB4ODksIDB4QUIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweENELCAweEVGLCAweDVBfTsKKyAgICB1aW50OF90IG91dHB1dFs5OV0gPSB7fTsKKyAgICBTb3VyY2VJMjQgc291cmNlSTI0ezF9OworICAgIFNpbmtJMjQgc2lua0kyNHsxfTsKKworICAgIGludCBudW1JbnB1dEZyYW1lcyA9IHNpemVvZihpbnB1dCkgLyBrQnl0ZXNQZXJJMjRQYWNrZWQ7CisgICAgc291cmNlSTI0LnNldERhdGEoaW5wdXQsIG51bUlucHV0RnJhbWVzKTsKKyAgICBzb3VyY2VJMjQub3V0cHV0LmNvbm5lY3QoJnNpbmtJMjQuaW5wdXQpOworCisgICAgaW50MzJfdCBudW1SZWFkID0gc2lua0kyNC5yZWFkKG91dHB1dCwgc2l6ZW9mKG91dHB1dCkgLyBrQnl0ZXNQZXJJMjRQYWNrZWQpOworICAgIEFTU0VSVF9FUShudW1JbnB1dEZyYW1lcywgbnVtUmVhZCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2YoaW5wdXQpOyBpKyspIHsKKyAgICAgICAgRVhQRUNUX0VRKGlucHV0W2ldLCBvdXRwdXRbaV0pOworICAgIH0KK30KKworVEVTVCh0ZXN0X2Zsb3dncmFwaCwgbW9kdWxlX2NsaXBfdG9fcmFuZ2UpIHsKKyAgICBjb25zdGV4cHIgZmxvYXQgbXlNaW4gPSAtMi4wZjsKKyAgICBjb25zdGV4cHIgZmxvYXQgbXlNYXggPSAxLjVmOworCisgICAgc3RhdGljIGNvbnN0IGZsb2F0IGlucHV0W10gPSB7LTkuNywgMC41ZiwgLTAuMjUsIDEuMGYsIDEyLjN9OworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBleHBlY3RlZFtdID0ge215TWluLCAwLjVmLCAtMC4yNSwgMS4wZiwgbXlNYXh9OworICAgIGZsb2F0IG91dHB1dFsxMDBdOworICAgIFNvdXJjZUZsb2F0IHNvdXJjZUZsb2F0ezF9OworICAgIENsaXBUb1JhbmdlIGNsaXBwZXJ7MX07CisgICAgU2lua0Zsb2F0IHNpbmtGbG9hdHsxfTsKKworICAgIGludCBudW1JbnB1dEZyYW1lcyA9IHNpemVvZihpbnB1dCkgLyBzaXplb2YoaW5wdXRbMF0pOworICAgIHNvdXJjZUZsb2F0LnNldERhdGEoaW5wdXQsIG51bUlucHV0RnJhbWVzKTsKKworICAgIGNsaXBwZXIuc2V0TWluaW11bShteU1pbik7CisgICAgY2xpcHBlci5zZXRNYXhpbXVtKG15TWF4KTsKKworICAgIHNvdXJjZUZsb2F0Lm91dHB1dC5jb25uZWN0KCZjbGlwcGVyLmlucHV0KTsKKyAgICBjbGlwcGVyLm91dHB1dC5jb25uZWN0KCZzaW5rRmxvYXQuaW5wdXQpOworCisgICAgaW50IG51bU91dHB1dEZyYW1lcyA9IHNpemVvZihvdXRwdXQpIC8gc2l6ZW9mKG91dHB1dFswXSk7CisgICAgaW50MzJfdCBudW1SZWFkID0gc2lua0Zsb2F0LnJlYWQob3V0cHV0LCBudW1PdXRwdXRGcmFtZXMpOworICAgIEFTU0VSVF9FUShudW1JbnB1dEZyYW1lcywgbnVtUmVhZCk7CisgICAgY29uc3RleHByIGZsb2F0IHRvbGVyYW5jZSA9IDAuMDAwMDAxZjsgLy8gYXJiaXRyYXJ5CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1SZWFkOyBpKyspIHsKKyAgICAgICAgRVhQRUNUX05FQVIoZXhwZWN0ZWRbaV0sIG91dHB1dFtpXSwgdG9sZXJhbmNlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9mdWxsX3F1ZXVlLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2Z1bGxfcXVldWUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyZDRmYTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9mdWxsX3F1ZXVlLmNwcApAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gVGVzdCB3aGV0aGVyIGEgc3RyZWFtIGRpZXMgaWYgaXQgaXMgd3JpdHRlbiB0byBhZnRlciBhIGRlbGF5LgorLy8gTWF5YmUgYmVjYXVzZSB0aGUgbWVzc2FnZSBxdWV1ZSBmcm9tIHRoZSBBQXVkaW8gc2VydmljZSBmaWxscyB1cC4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworY29uc3RleHByIGludDY0X3Qga05hbm9zUGVyU2Vjb25kID0gMTAwMDAwMDAwMDsKK2NvbnN0ZXhwciBpbnQ2NF90IGtUaW1lb3V0TmFub3MgPSBrTmFub3NQZXJTZWNvbmQgLyAyOworY29uc3RleHByIGludCBrTnVtRnJhbWVzID0gMjU2OworY29uc3RleHByIGludCBrQ2hhbm5lbENvdW50ID0gMjsKKworc3RhdGljIHZvaWQgY2hlY2tGdWxsUXVldWUoYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2xlZXBNaWxsaXMpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8ZmxvYXRbXT4gYnVmZmVyID0gc3RkOjptYWtlX3VuaXF1ZTxmbG9hdFtdPigKKyAgICAgICAgICAgIGtOdW1GcmFtZXMgKiBrQ2hhbm5lbENvdW50KTsKKworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXIgKmFhdWRpb0J1aWxkZXIgPSBudWxscHRyOworCisgICAgLy8gVXNlIGFuIEFBdWRpb1N0cmVhbUJ1aWxkZXIgdG8gY29udGFpbiByZXF1ZXN0ZWQgcGFyYW1ldGVycy4KKyAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigmYWF1ZGlvQnVpbGRlcikpOworCisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDaGFubmVsQ291bnQoYWF1ZGlvQnVpbGRlciwga0NoYW5uZWxDb3VudCk7CisKKyAgICAvLyBSZXF1ZXN0IHN0cmVhbSBwcm9wZXJ0aWVzLgorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0UGVyZm9ybWFuY2VNb2RlKGFhdWRpb0J1aWxkZXIsIHBlcmZNb2RlKTsKKworICAgIC8vIENyZWF0ZSBhbiBBQXVkaW9TdHJlYW0gdXNpbmcgdGhlIEJ1aWxkZXIuCisgICAgQUF1ZGlvU3RyZWFtICphYXVkaW9TdHJlYW0gPSBudWxscHRyOworICAgIEFTU0VSVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbShhYXVkaW9CdWlsZGVyLAorICAgICAgICAgICAgJmFhdWRpb1N0cmVhbSkpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfZGVsZXRlKGFhdWRpb0J1aWxkZXIpOworCisgICAgRVhQRUNUX0VRKEFBVURJT19PSywgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChhYXVkaW9TdHJlYW0pKTsKKworICAgIC8vIFNsZWVwIGZvciBhd2hpbGUuIFRoaXMgbWlnaHQga2lsbCB0aGUgc3RyZWFtLgorICAgIHVzbGVlcChzbGVlcE1pbGxpcyAqIDEwMDApOyAvLyAxMDAwIG1pbGxpcyBpbiBhIG1pY3Jvc2Vjb25kCisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKKyAgICAgICAgY29uc3QgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1N0cmVhbV93cml0ZShhYXVkaW9TdHJlYW0sCisgICAgICAgICAgICAgICAgYnVmZmVyLmdldCgpLAorICAgICAgICAgICAgICAgIGtOdW1GcmFtZXMsCisgICAgICAgICAgICAgICAga1RpbWVvdXROYW5vcyk7CisgICAgICAgIEVYUEVDVF9FUShrTnVtRnJhbWVzLCByZXN1bHQpOworICAgICAgICBpZiAoa051bUZyYW1lcyAhPSByZXN1bHQpIGJyZWFrOworICAgIH0KKworICAgIEVYUEVDVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcChhYXVkaW9TdHJlYW0pKTsKKworICAgIEVYUEVDVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbV9jbG9zZShhYXVkaW9TdHJlYW0pKTsKK30KKworVEVTVCh0ZXN0X2Z1bGxfcXVldWUsIGFhdWRpb19mdWxsX3F1ZXVlX3BlcmZfbm9uZV81MCkgeworICAgIGNoZWNrRnVsbFF1ZXVlKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUsIDUwIC8qIHNsZWVwTWlsbGlzICovKTsKK30KKworVEVTVCh0ZXN0X2Z1bGxfcXVldWUsIGFhdWRpb19mdWxsX3F1ZXVlX3BlcmZfbm9uZV8yMDApIHsKKyAgICBjaGVja0Z1bGxRdWV1ZShBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FLCAyMDAgLyogc2xlZXBNaWxsaXMgKi8pOworfQorCitURVNUKHRlc3RfZnVsbF9xdWV1ZSwgYWF1ZGlvX2Z1bGxfcXVldWVfcGVyZl9ub25lXzEwMDApIHsKKyAgICBjaGVja0Z1bGxRdWV1ZShBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FLCAxMDAwIC8qIHNsZWVwTWlsbGlzICovKTsKK30KKworVEVTVCh0ZXN0X2Z1bGxfcXVldWUsIGFhdWRpb19mdWxsX3F1ZXVlX2xvd19sYXRlbmN5XzUwKSB7CisgICAgY2hlY2tGdWxsUXVldWUoQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1ksIDUwIC8qIHNsZWVwTWlsbGlzICovKTsKK30KKworVEVTVCh0ZXN0X2Z1bGxfcXVldWUsIGFhdWRpb19mdWxsX3F1ZXVlX2xvd19sYXRlbmN5XzIwMCkgeworICAgIGNoZWNrRnVsbFF1ZXVlKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLCAyMDAgLyogc2xlZXBNaWxsaXMgKi8pOworfQorCitURVNUKHRlc3RfZnVsbF9xdWV1ZSwgYWF1ZGlvX2Z1bGxfcXVldWVfbG93X2xhdGVuY3lfMTAwMCkgeworICAgIGNoZWNrRnVsbFF1ZXVlKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLCAxMDAwIC8qIHNsZWVwTWlsbGlzICovKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2xpbmVhcl9yYW1wLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2xpbmVhcl9yYW1wLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTMyMjZiYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9saW5lYXJfcmFtcC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxtYXRoLmg+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/IEVYSVRfU1VDQ0VTUyA6IEVYSVRfRkFJTFVSRTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BbmRyb2lkLmJwCmluZGV4IDJkZjM3YTguLjAzYmQ2Y2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQW5kcm9pZC5icApAQCAtNSw2ICs1LDI5IEBACiB9CiAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliYXVkaW9wb2xpY3kiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIkF1ZGlvQXR0cmlidXRlcy5jcHAiLAorICAgICAgICAiQXVkaW9Qb2xpY3kuY3BwIiwKKyAgICAgICAgIkF1ZGlvUHJvZHVjdFN0cmF0ZWd5LmNwcCIsCisgICAgICAgICJBdWRpb1ZvbHVtZUdyb3VwLmNwcCIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisgICAgaW5jbHVkZV9kaXJzOiBbInN5c3RlbS9tZWRpYS9hdWRpb191dGlscy9pbmNsdWRlIl0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGliYXVkaW9jbGllbnQiLAogCiAgICAgYWlkbDogewpAQCAtMjMsNyArNDYsNiBAQAogICAgICAgICAiOmxpYmF1ZGlvY2xpZW50X2FpZGwiLAogCiAgICAgICAgICJBdWRpb0VmZmVjdC5jcHAiLAotICAgICAgICAiQXVkaW9Qb2xpY3kuY3BwIiwKICAgICAgICAgIkF1ZGlvUmVjb3JkLmNwcCIsCiAgICAgICAgICJBdWRpb1N5c3RlbS5jcHAiLAogICAgICAgICAiQXVkaW9UcmFjay5jcHAiLApAQCAtMzcsMjMgKzU5LDMyIEBACiAgICAgICAgICJJRWZmZWN0Q2xpZW50LmNwcCIsCiAgICAgICAgICJUb25lR2VuZXJhdG9yLmNwcCIsCiAgICAgICAgICJQbGF5ZXJCYXNlLmNwcCIsCisgICAgICAgICJSZWNvcmRpbmdBY3Rpdml0eVRyYWNrZXIuY3BwIiwKICAgICAgICAgIlRyYWNrUGxheWVyQmFzZS5jcHAiLAogICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYmRsIiwKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliYXVkaW9wb2xpY3kiLAogICAgICAgICAibGliYXVkaW9tYW5hZ2VyIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZGwiLAorICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCiAgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJuYmxvZyIsCisgICAgICAgICJsaWJwcm9jZXNzZ3JvdXAiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlidmlicmF0b3IiLAogICAgIF0sCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWyJsaWJiaW5kZXIiXSwKIAogICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJpbmNsdWRlL21lZGlhIiwgImFpZGwiXSwKLSAgICBoZWFkZXJfbGliczogWyJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIl0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50X2hlYWRlcnMiLAorICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKKyAgICBdLAogICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsibGliYXVkaW9jbGllbnRfaGVhZGVycyJdLAogCiAgICAgLy8gZm9yIG1lbW9yeSBoZWFwIGFuYWx5c2lzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0F0dHJpYnV0ZXMuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9BdHRyaWJ1dGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZWU2OTMwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9BdHRyaWJ1dGVzLmNwcApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBdWRpb0F0dHJpYnV0ZXMiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0F0dHJpYnV0ZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0dXNfdCBBdWRpb0F0dHJpYnV0ZXM6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKQoreworICAgIHN0YXR1c190IHJldCA9IE5PX0VSUk9SOworICAgIG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSA9IHN0YXRpY19jYXN0PGF1ZGlvX2NvbnRlbnRfdHlwZV90PihwYXJjZWwtPnJlYWRJbnQzMigpKTsKKyAgICBtQXR0cmlidXRlcy51c2FnZSA9IHN0YXRpY19jYXN0PGF1ZGlvX3VzYWdlX3Q+KHBhcmNlbC0+cmVhZEludDMyKCkpOworICAgIG1BdHRyaWJ1dGVzLnNvdXJjZSA9IHN0YXRpY19jYXN0PGF1ZGlvX3NvdXJjZV90PihwYXJjZWwtPnJlYWRJbnQzMigpKTsKKyAgICBtQXR0cmlidXRlcy5mbGFncyA9IHN0YXRpY19jYXN0PGF1ZGlvX2ZsYWdzX21hc2tfdD4ocGFyY2VsLT5yZWFkSW50MzIoKSk7CisgICAgY29uc3QgYm9vbCBoYXNGbGF0dGVuZWRUYWcgPSAocGFyY2VsLT5yZWFkSW50MzIoKSA9PSAxKTsKKyAgICBpZiAoaGFzRmxhdHRlbmVkVGFnKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHRhZ3M7CisgICAgICAgIHJldCA9IHBhcmNlbC0+cmVhZFV0ZjhGcm9tVXRmMTYoJnRhZ3MpOworICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHN0ZDo6c3RybmNweShtQXR0cmlidXRlcy50YWdzLCB0YWdzLmNfc3RyKCksIEFVRElPX0FUVFJJQlVURVNfVEFHU19NQVhfU0laRSAtIDEpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0cmNweShtQXR0cmlidXRlcy50YWdzLCAiIik7CisgICAgfQorICAgIG1TdHJlYW1UeXBlID0gc3RhdGljX2Nhc3Q8YXVkaW9fc3RyZWFtX3R5cGVfdD4ocGFyY2VsLT5yZWFkSW50MzIoKSk7CisgICAgbUdyb3VwSWQgPSBzdGF0aWNfY2FzdDx2b2x1bWVfZ3JvdXBfdD4ocGFyY2VsLT5yZWFkVWludDMyKCkpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9BdHRyaWJ1dGVzOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdAoreworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihtQXR0cmlidXRlcy5jb250ZW50X3R5cGUpKTsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obUF0dHJpYnV0ZXMudXNhZ2UpKTsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obUF0dHJpYnV0ZXMuc291cmNlKSk7CisgICAgcGFyY2VsLT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KG1BdHRyaWJ1dGVzLmZsYWdzKSk7CisgICAgaWYgKHN0cmxlbihtQXR0cmlidXRlcy50YWdzKSA9PSAwKSB7CisgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMigwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoMSk7CisgICAgICAgIHBhcmNlbC0+d3JpdGVVdGY4QXNVdGYxNihtQXR0cmlidXRlcy50YWdzKTsKKyAgICB9CisgICAgcGFyY2VsLT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KG1TdHJlYW1UeXBlKSk7CisgICAgcGFyY2VsLT53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4obUdyb3VwSWQpKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvRWZmZWN0LmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvRWZmZWN0LmNwcAppbmRleCBiMWNiMGU3Li5jZjExOTM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0VmZmVjdC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9FZmZlY3QuY3BwCkBAIC01Miw2ICs1Miw3IEBACiAgICAgICAgICAgICAgICAgKQogICAgIDogbVN0YXR1cyhOT19JTklUKSwgbU9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSkKIHsKKyAgICBBdXRvTXV0ZXggbG9jayhtQ29uc3RydWN0TG9jayk7CiAgICAgbVN0YXR1cyA9IHNldCh0eXBlLCB1dWlkLCBwcmlvcml0eSwgY2JmLCB1c2VyLCBzZXNzaW9uSWQsIGlvKTsKIH0KIApAQCAtODUsNiArODYsNyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgQXV0b011dGV4IGxvY2sobUNvbnN0cnVjdExvY2spOwogICAgIG1TdGF0dXMgPSBzZXQocFR5cGUsIHBVdWlkLCBwcmlvcml0eSwgY2JmLCB1c2VyLCBzZXNzaW9uSWQsIGlvKTsKIH0KIApAQCAtNDMwLDE0ICs0MzIsMTUgQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OmdldEVmZmVjdERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKLSAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcikgLypjb25zdCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlZmVycmVkVHlwZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKQogewogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFmLT5nZXRFZmZlY3REZXNjcmlwdG9yKHV1aWQsIGRlc2NyaXB0b3IpOworICAgIHJldHVybiBhZi0+Z2V0RWZmZWN0RGVzY3JpcHRvcih1dWlkLCB0eXBlLCBwcmVmZXJyZWRUeXBlRmxhZywgZGVzY3JpcHRvcik7CiB9CiAKLQogc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OnF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KQpAQCAtNDQ2LDYgKzQ0OSw5NSBAQAogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIHJldHVybiBhcHMtPnF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoYXVkaW9TZXNzaW9uLCBkZXNjcmlwdG9ycywgY291bnQpOwogfQorCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6bmV3RWZmZWN0VW5pcXVlSWQoYXVkaW9fdW5pcXVlX2lkX3QqIGlkKQoreworICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgKmlkID0gYWYtPm5ld0F1ZGlvVW5pcXVlSWQoQVVESU9fVU5JUVVFX0lEX1VTRV9FRkZFQ1QpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OmFkZFNvdXJjZURlZmF1bHRFZmZlY3QoY29uc3QgY2hhciAqdHlwZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdXVpZFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCAqaWQpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKworICAgIGlmICh0eXBlU3RyID09IE5VTEwgJiYgdXVpZFN0ciA9PSBOVUxMKSByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgLy8gQ29udmVydCB0eXBlICYgdXVpZCBmcm9tIHN0cmluZyB0byBlZmZlY3RfdXVpZF90LgorICAgIGVmZmVjdF91dWlkX3QgdHlwZTsKKyAgICBpZiAodHlwZVN0ciAhPSBOVUxMKSB7CisgICAgICAgIHN0YXR1c190IHJlcyA9IHN0cmluZ1RvR3VpZCh0eXBlU3RyLCAmdHlwZSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHlwZSA9ICpFRkZFQ1RfVVVJRF9OVUxMOworICAgIH0KKworICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKKyAgICBpZiAodXVpZFN0ciAhPSBOVUxMKSB7CisgICAgICAgIHN0YXR1c190IHJlcyA9IHN0cmluZ1RvR3VpZCh1dWlkU3RyLCAmdXVpZCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdXVpZCA9ICpFRkZFQ1RfVVVJRF9OVUxMOworICAgIH0KKworICAgIHJldHVybiBhcHMtPmFkZFNvdXJjZURlZmF1bHRFZmZlY3QoJnR5cGUsIG9wUGFja2FnZU5hbWUsICZ1dWlkLCBwcmlvcml0eSwgc291cmNlLCBpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvRWZmZWN0OjphZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IGNoYXIgKnR5cGVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnV1aWRTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90ICppZCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworCisgICAgaWYgKHR5cGVTdHIgPT0gTlVMTCAmJiB1dWlkU3RyID09IE5VTEwpIHJldHVybiBCQURfVkFMVUU7CisKKyAgICAvLyBDb252ZXJ0IHR5cGUgJiB1dWlkIGZyb20gc3RyaW5nIHRvIGVmZmVjdF91dWlkX3QuCisgICAgZWZmZWN0X3V1aWRfdCB0eXBlOworICAgIGlmICh0eXBlU3RyICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gc3RyaW5nVG9HdWlkKHR5cGVTdHIsICZ0eXBlKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKyAgICB9IGVsc2UgeworICAgICAgICB0eXBlID0gKkVGRkVDVF9VVUlEX05VTEw7CisgICAgfQorCisgICAgZWZmZWN0X3V1aWRfdCB1dWlkOworICAgIGlmICh1dWlkU3RyICE9IE5VTEwpIHsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gc3RyaW5nVG9HdWlkKHV1aWRTdHIsICZ1dWlkKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKKyAgICB9IGVsc2UgeworICAgICAgICB1dWlkID0gKkVGRkVDVF9VVUlEX05VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGFwcy0+YWRkU3RyZWFtRGVmYXVsdEVmZmVjdCgmdHlwZSwgb3BQYWNrYWdlTmFtZSwgJnV1aWQsIHByaW9yaXR5LCB1c2FnZSwgaWQpOworfQorCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6cmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworCisgICAgcmV0dXJuIGFwcy0+cmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvRWZmZWN0OjpyZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisKKyAgICByZXR1cm4gYXBzLT5yZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGlkKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0dXNfdCBBdWRpb0VmZmVjdDo6c3RyaW5nVG9HdWlkKGNvbnN0IGNoYXIgKnN0ciwgZWZmZWN0X3V1aWRfdCAqZ3VpZCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUG9saWN5LmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUG9saWN5LmNwcAppbmRleCBkMWY3NTI1Li4zY2RmMDk1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1BvbGljeS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9Qb2xpY3kuY3BwCkBAIC0yMiw2ICsyMiwyMiBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLworLy8gIEF1ZGlvRGV2aWNlVHlwZUFkZHIgaW1wbGVtZW50YXRpb24KKy8vCitzdGF0dXNfdCBBdWRpb0RldmljZVR5cGVBZGRyOjpyZWFkRnJvbVBhcmNlbChQYXJjZWwgKnBhcmNlbCkgeworICAgIG1UeXBlID0gKGF1ZGlvX2RldmljZXNfdCkgcGFyY2VsLT5yZWFkSW50MzIoKTsKKyAgICBtQWRkcmVzcyA9IHBhcmNlbC0+cmVhZFN0cmluZzgoKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvRGV2aWNlVHlwZUFkZHI6OndyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IHsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIoKGludDMyX3QpIG1UeXBlKTsKKyAgICBwYXJjZWwtPndyaXRlU3RyaW5nOChtQWRkcmVzcyk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCisKKy8vCiAvLyAgQXVkaW9NaXhNYXRjaENyaXRlcmlvbiBpbXBsZW1lbnRhdGlvbgogLy8KIEF1ZGlvTWl4TWF0Y2hDcml0ZXJpb246OkF1ZGlvTWl4TWF0Y2hDcml0ZXJpb24oYXVkaW9fdXNhZ2VfdCB1c2FnZSwKQEAgLTQwLDExICs1NiwyMiBAQAogc3RhdHVzX3QgQXVkaW9NaXhNYXRjaENyaXRlcmlvbjo6cmVhZEZyb21QYXJjZWwoUGFyY2VsICpwYXJjZWwpCiB7CiAgICAgbVJ1bGUgPSBwYXJjZWwtPnJlYWRJbnQzMigpOwotICAgIGlmIChtUnVsZSA9PSBSVUxFX01BVENIX0FUVFJJQlVURV9VU0FHRSB8fAotICAgICAgICAgICAgbVJ1bGUgPT0gUlVMRV9FWENMVURFX0FUVFJJQlVURV9VU0FHRSkgewotICAgICAgICBtVmFsdWUubVVzYWdlID0gKGF1ZGlvX3VzYWdlX3QpcGFyY2VsLT5yZWFkSW50MzIoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtVmFsdWUubVNvdXJjZSA9IChhdWRpb19zb3VyY2VfdClwYXJjZWwtPnJlYWRJbnQzMigpOworICAgIHN3aXRjaCAobVJ1bGUpIHsKKyAgICBjYXNlIFJVTEVfTUFUQ0hfQVRUUklCVVRFX1VTQUdFOgorICAgIGNhc2UgUlVMRV9FWENMVURFX0FUVFJJQlVURV9VU0FHRToKKyAgICAgICAgbVZhbHVlLm1Vc2FnZSA9IChhdWRpb191c2FnZV90KSBwYXJjZWwtPnJlYWRJbnQzMigpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFJVTEVfTUFUQ0hfQVRUUklCVVRFX0NBUFRVUkVfUFJFU0VUOgorICAgIGNhc2UgUlVMRV9FWENMVURFX0FUVFJJQlVURV9DQVBUVVJFX1BSRVNFVDoKKyAgICAgICAgbVZhbHVlLm1Tb3VyY2UgPSAoYXVkaW9fc291cmNlX3QpIHBhcmNlbC0+cmVhZEludDMyKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlVMRV9NQVRDSF9VSUQ6CisgICAgY2FzZSBSVUxFX0VYQ0xVREVfVUlEOgorICAgICAgICBtVmFsdWUubVVpZCA9ICh1aWRfdCkgcGFyY2VsLT5yZWFkSW50MzIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoIlRyeWluZyB0byBidWlsZCBBdWRpb01peE1hdGNoQ3JpdGVyaW9uIGZyb20gdW5rbm93biBydWxlICVkIiwgbVJ1bGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC03MCw2ICs5Nyw3IEBACiAgICAgbURldmljZVR5cGUgPSAoYXVkaW9fZGV2aWNlc190KSBwYXJjZWwtPnJlYWRJbnQzMigpOwogICAgIG1EZXZpY2VBZGRyZXNzID0gcGFyY2VsLT5yZWFkU3RyaW5nOCgpOwogICAgIG1DYkZsYWdzID0gKHVpbnQzMl90KXBhcmNlbC0+cmVhZEludDMyKCk7CisgICAgbUFsbG93UHJpdmlsZWdlZFBsYXliYWNrQ2FwdHVyZSA9IHBhcmNlbC0+cmVhZEJvb2woKTsKICAgICBzaXplX3Qgc2l6ZSA9IChzaXplX3QpcGFyY2VsLT5yZWFkSW50MzIoKTsKICAgICBpZiAoc2l6ZSA+IE1BWF9DUklURVJJQV9QRVJfTUlYKSB7CiAgICAgICAgIHNpemUgPSBNQVhfQ1JJVEVSSUFfUEVSX01JWDsKQEAgLTkzLDYgKzEyMSw3IEBACiAgICAgcGFyY2VsLT53cml0ZUludDMyKG1EZXZpY2VUeXBlKTsKICAgICBwYXJjZWwtPndyaXRlU3RyaW5nOChtRGV2aWNlQWRkcmVzcyk7CiAgICAgcGFyY2VsLT53cml0ZUludDMyKG1DYkZsYWdzKTsKKyAgICBwYXJjZWwtPndyaXRlQm9vbChtQWxsb3dQcml2aWxlZ2VkUGxheWJhY2tDYXB0dXJlKTsKICAgICBzaXplX3Qgc2l6ZSA9IG1Dcml0ZXJpYS5zaXplKCk7CiAgICAgaWYgKHNpemUgPiBNQVhfQ1JJVEVSSUFfUEVSX01JWCkgewogICAgICAgICBzaXplID0gTUFYX0NSSVRFUklBX1BFUl9NSVg7CkBAIC0xMTYsNCArMTQ1LDQzIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCit2b2lkIEF1ZGlvTWl4OjpzZXRFeGNsdWRlVWlkKHVpZF90IHVpZCkgY29uc3QgeworICAgIEF1ZGlvTWl4TWF0Y2hDcml0ZXJpb24gY3JpdDsKKyAgICBjcml0Lm1SdWxlID0gUlVMRV9FWENMVURFX1VJRDsKKyAgICBjcml0Lm1WYWx1ZS5tVWlkID0gdWlkOworICAgIG1Dcml0ZXJpYS5hZGQoY3JpdCk7Cit9CisKK3ZvaWQgQXVkaW9NaXg6OnNldE1hdGNoVWlkKHVpZF90IHVpZCkgY29uc3QgeworICAgIEF1ZGlvTWl4TWF0Y2hDcml0ZXJpb24gY3JpdDsKKyAgICBjcml0Lm1SdWxlID0gUlVMRV9NQVRDSF9VSUQ7CisgICAgY3JpdC5tVmFsdWUubVVpZCA9IHVpZDsKKyAgICBtQ3JpdGVyaWEuYWRkKGNyaXQpOworfQorCitib29sIEF1ZGlvTWl4OjpoYXNVaWRSdWxlKGJvb2wgbWF0Y2gsIHVpZF90IHVpZCkgY29uc3QgeworICAgIGNvbnN0IHVpbnQzMl90IHJ1bGUgPSBtYXRjaCA/IFJVTEVfTUFUQ0hfVUlEIDogUlVMRV9FWENMVURFX1VJRDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Dcml0ZXJpYS5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobUNyaXRlcmlhW2ldLm1SdWxlID09IHJ1bGUKKyAgICAgICAgICAgICAgICAmJiBtQ3JpdGVyaWFbaV0ubVZhbHVlLm1VaWQgPT0gdWlkKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQXVkaW9NaXg6Omhhc01hdGNoVWlkUnVsZSgpIGNvbnN0IHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Dcml0ZXJpYS5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobUNyaXRlcmlhW2ldLm1SdWxlID09IFJVTEVfTUFUQ0hfVUlEKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQXVkaW9NaXg6OmlzRGV2aWNlQWZmaW5pdHlDb21wYXRpYmxlKCkgY29uc3QgeworICAgIHJldHVybiAoKG1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpCisgICAgICAgICAgICAmJiAobVJvdXRlRmxhZ3MgPT0gTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUHJvZHVjdFN0cmF0ZWd5LmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUHJvZHVjdFN0cmF0ZWd5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTFkZmFjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuY3BwCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvUHJvZHVjdFN0cmF0ZWd5IgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUHJvZHVjdFN0cmF0ZWd5Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0dXNfdCBBdWRpb1Byb2R1Y3RTdHJhdGVneTo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpCit7CisgICAgbUlkID0gc3RhdGljX2Nhc3Q8cHJvZHVjdF9zdHJhdGVneV90PihwYXJjZWwtPnJlYWRJbnQzMigpKTsKKyAgICBzdGF0dXNfdCByZXQgPSBwYXJjZWwtPnJlYWRVdGY4RnJvbVV0ZjE2KCZtTmFtZSk7CisgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBzaXplX3Qgc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4ocGFyY2VsLT5yZWFkSW50MzIoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgQXVkaW9BdHRyaWJ1dGVzIGF0dHJpYnV0ZTsKKyAgICAgICAgcmV0ID0gYXR0cmlidXRlLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgbUF1ZGlvQXR0cmlidXRlcy5wdXNoX2JhY2soYXR0cmlidXRlKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1Byb2R1Y3RTdHJhdGVneTo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QKK3sKKyAgICBwYXJjZWwtPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obUlkKSk7CisgICAgcGFyY2VsLT53cml0ZVV0ZjhBc1V0ZjE2KG1OYW1lKTsKKyAgICBzaXplX3Qgc2l6ZSA9IG1BdWRpb0F0dHJpYnV0ZXMuc2l6ZSgpOworICAgIHNpemVfdCBzaXplUG9zaXRpb24gPSBwYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihzaXplKTsKKyAgICBzaXplX3QgZmluYWxTaXplID0gc2l6ZTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IHBhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgICAgICAgIEF1ZGlvQXR0cmlidXRlcyBhdHRyaWJ1dGUobUF1ZGlvQXR0cmlidXRlc1tpXSk7CisgICAgICAgIHN0YXR1c190IHJldCA9IGF0dHJpYnV0ZS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CisgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHBhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGZpbmFsU2l6ZS0tOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzaXplICE9IGZpbmFsU2l6ZSkgeworICAgICAgICBzaXplX3QgcG9zaXRpb24gPSBwYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICAgICAgICBwYXJjZWwtPnNldERhdGFQb3NpdGlvbihzaXplUG9zaXRpb24pOworICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoZmluYWxTaXplKTsKKyAgICAgICAgcGFyY2VsLT5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2Jvb2wgQXVkaW9Qcm9kdWN0U3RyYXRlZ3k6OmF0dHJpYnV0ZXNNYXRjaGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCByZWZBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBjbGllbnRBdHRyaXR1YmVzKQoreworICAgIGlmIChyZWZBdHRyaWJ1dGVzID09IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVIpIHsKKyAgICAgICAgLy8gVGhlIGRlZmF1bHQgcHJvZHVjdCBzdHJhdGVneSBpcyB0aGUgc3RyYXRlZ3kgdGhhdCBob2xkcyBkZWZhdWx0IGF0dHJpYnV0ZXMgYnkgY29udmVudGlvbi4KKyAgICAgICAgLy8gQWxsIGF0dHJpYnV0ZXMgdGhhdCBmYWlsIHRvIG1hdGNoIHdpbGwgZm9sbG93IHRoZSBkZWZhdWx0IHN0cmF0ZWd5IGZvciByb3V0aW5nLgorICAgICAgICAvLyBDaG9vc2luZyB0aGUgZGVmYXVsdCBtdXN0IGJlIGRvbmUgYXMgYSBmYWxsYmFjaywgdGhlIGF0dHJpYnV0ZXMgbWF0Y2ggc2hhbGwgbm90CisgICAgICAgIC8vIHNlbGVjdCB0aGUgZGVmYXVsdC4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gKChyZWZBdHRyaWJ1dGVzLnVzYWdlID09IEFVRElPX1VTQUdFX1VOS05PV04pIHx8CisgICAgICAgICAgICAoY2xpZW50QXR0cml0dWJlcy51c2FnZSA9PSByZWZBdHRyaWJ1dGVzLnVzYWdlKSkgJiYKKyAgICAgICAgICAgICgocmVmQXR0cmlidXRlcy5jb250ZW50X3R5cGUgPT0gQVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04pIHx8CisgICAgICAgICAgICAgKGNsaWVudEF0dHJpdHViZXMuY29udGVudF90eXBlID09IHJlZkF0dHJpYnV0ZXMuY29udGVudF90eXBlKSkgJiYKKyAgICAgICAgICAgICgocmVmQXR0cmlidXRlcy5mbGFncyA9PSBBVURJT19GTEFHX05PTkUpIHx8CisgICAgICAgICAgICAgKGNsaWVudEF0dHJpdHViZXMuZmxhZ3MgIT0gQVVESU9fRkxBR19OT05FICYmCisgICAgICAgICAgICAoY2xpZW50QXR0cml0dWJlcy5mbGFncyAmIHJlZkF0dHJpYnV0ZXMuZmxhZ3MpID09IHJlZkF0dHJpYnV0ZXMuZmxhZ3MpKSAmJgorICAgICAgICAgICAgKChzdHJsZW4ocmVmQXR0cmlidXRlcy50YWdzKSA9PSAwKSB8fAorICAgICAgICAgICAgIChzdGQ6OnN0cmNtcChjbGllbnRBdHRyaXR1YmVzLnRhZ3MsIHJlZkF0dHJpYnV0ZXMudGFncykgPT0gMCkpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAKaW5kZXggZjlkZjViMS4uYTFiMDRjYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUmVjb3JkLmNwcApAQCAtMTksMTIgKzE5LDE4IEBACiAjZGVmaW5lIExPR19UQUcgIkF1ZGlvUmVjb3JkIgogCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CiAKKyNpbmNsdWRlIDxhdWRpb21hbmFnZXIvQXVkaW9NYW5hZ2VyLmg+CisjaW5jbHVkZSA8YXVkaW9tYW5hZ2VyL0lBdWRpb01hbmFnZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvQmluZGVyLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVjb3JkLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmg+CisjaW5jbHVkZSA8cHJvY2Vzc2dyb3VwL3NjaGVkX3BvbGljeS5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb0ZsaW5nZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+CkBAIC00OCw4ICs1NCw5IEBACiAgICAgc2l6ZV90IHNpemU7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldElucHV0QnVmZmVyU2l6ZShzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCAmc2l6ZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiQXVkaW9TeXN0ZW0gY291bGQgbm90IHF1ZXJ5IHRoZSBpbnB1dCBidWZmZXIgc2l6ZSBmb3Igc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICUjeCwgIgotICAgICAgICAgICAgICAiY2hhbm5lbE1hc2sgJSN4OyBzdGF0dXMgJWQiLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBzdGF0dXMpOworICAgICAgICBBTE9HRSgiJXMoKTogQXVkaW9TeXN0ZW0gY291bGQgbm90IHF1ZXJ5IHRoZSBpbnB1dCBidWZmZXIgc2l6ZSBmb3IiCisgICAgICAgICAgICAgICIgc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgJSN4OyBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgX19mdW5jX18sIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCkBAIC01Nyw4ICs2NCw4IEBACiAgICAgLy8gQXNzdW1lcyBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkKICAgICBpZiAoKCpmcmFtZUNvdW50ID0gKHNpemUgKiAyKSAvIChhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjaGFubmVsTWFzaykgKgogICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpKSkgPT0gMCkgewotICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgY29uZmlndXJhdGlvbjogc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgJSN4IiwKLSAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2spOworICAgICAgICBBTE9HRSgiJXMoKTogVW5zdXBwb3J0ZWQgY29uZmlndXJhdGlvbjogc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgJSN4IiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzayk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC02Nyw3MCArNzQsMzQgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLXN0YXRpYyBzdGQ6OnN0cmluZyBhdWRpb0Zvcm1hdFR5cGVTdHJpbmcoYXVkaW9fZm9ybWF0X3QgdmFsdWUpIHsKLSAgICBzdGQ6OnN0cmluZyBmb3JtYXRUeXBlOwotICAgIGlmIChGb3JtYXRDb252ZXJ0ZXI6OnRvU3RyaW5nKHZhbHVlLCBmb3JtYXRUeXBlKSkgewotICAgICAgICByZXR1cm4gZm9ybWF0VHlwZTsKLSAgICB9Ci0gICAgY2hhciByYXdidWZmZXJbMTZdOyAgLy8gcm9vbSBmb3IgIiVkIgotICAgIHNucHJpbnRmKHJhd2J1ZmZlciwgc2l6ZW9mKHJhd2J1ZmZlciksICIlZCIsIHZhbHVlKTsKLSAgICByZXR1cm4gcmF3YnVmZmVyOwotfQotCi1zdGF0aWMgc3RkOjpzdHJpbmcgYXVkaW9Tb3VyY2VTdHJpbmcoYXVkaW9fc291cmNlX3QgdmFsdWUpIHsKLSAgICBzdGQ6OnN0cmluZyBzb3VyY2U7Ci0gICAgaWYgKFNvdXJjZVR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKHZhbHVlLCBzb3VyY2UpKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2U7Ci0gICAgfQotICAgIGNoYXIgcmF3YnVmZmVyWzE2XTsgIC8vIHJvb20gZm9yICIlZCIKLSAgICBzbnByaW50ZihyYXdidWZmZXIsIHNpemVvZihyYXdidWZmZXIpLCAiJWQiLCB2YWx1ZSk7Ci0gICAgcmV0dXJuIHJhd2J1ZmZlcjsKLX0KLQogdm9pZCBBdWRpb1JlY29yZDo6TWVkaWFNZXRyaWNzOjpnYXRoZXIoY29uc3QgQXVkaW9SZWNvcmQgKnJlY29yZCkKIHsKLSAgICAvLyBrZXkgZm9yIG1lZGlhIHN0YXRpc3RpY3MgaXMgZGVmaW5lZCBpbiB0aGUgaGVhZGVyCi0gICAgLy8gYXR0cnMgZm9yIG1lZGlhIHN0YXRpc3RpY3MKLSAgICAvLyBOQjogdGhlc2UgYXJlIG1hdGNoZWQgd2l0aCBwdWJsaWMgSmF2YSBBUEkgY29uc3RhbnRzIGRlZmluZWQKLSAgICAvLyBpbiBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvUmVjb3JkLmphdmEKLSAgICAvLyBUaGVzZSBtdXN0IGJlIGtlcHQgc3luY2hyb25pemVkIHdpdGggdGhlIGNvbnN0YW50cyB0aGVyZS4KLSAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUmVjb3JkRW5jb2RpbmdbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLmVuY29kaW5nIjsKLSAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUmVjb3JkU291cmNlW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5zb3VyY2UiOwotICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9SZWNvcmRMYXRlbmN5W10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5sYXRlbmN5IjsKLSAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUmVjb3JkU2FtcGxlUmF0ZVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuc2FtcGxlcmF0ZSI7Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1JlY29yZENoYW5uZWxDb3VudFtdID0gImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuY2hhbm5lbHMiOwotICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9SZWNvcmRDcmVhdGVkW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5jcmVhdGVkTXMiOwotICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9SZWNvcmREdXJhdGlvbltdID0gImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuZHVyYXRpb25NcyI7Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1JlY29yZENvdW50W10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5uIjsKLSAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUmVjb3JkRXJyb3JbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLmVycmNvZGUiOwotICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9SZWNvcmRFcnJvckZ1bmN0aW9uW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5lcnJmdW5jIjsKKyNkZWZpbmUgTU1fUFJFRklYICJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLiIgLy8gYXZvaWQgY3V0LW4tcGFzdGUgZXJyb3JzLgogCi0gICAgLy8gY29uc3RydWN0b3IgZ3VhcmFudGVlcyBtQW5hbHl0aWNzSXRlbSBpcyB2YWxpZAorICAgIC8vIEphdmEgQVBJIDI4IGVudHJpZXMsIGRvIG5vdCBjaGFuZ2UuCisgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoTU1fUFJFRklYICJlbmNvZGluZyIsIHRvU3RyaW5nKHJlY29yZC0+bUZvcm1hdCkuY19zdHIoKSk7CisgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoTU1fUFJFRklYICJzb3VyY2UiLCB0b1N0cmluZyhyZWNvcmQtPm1BdHRyaWJ1dGVzLnNvdXJjZSkuY19zdHIoKSk7CisgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKE1NX1BSRUZJWCAibGF0ZW5jeSIsIChpbnQzMl90KXJlY29yZC0+bUxhdGVuY3kpOyAvLyBiYWQgZXN0aW1hdGUuCisgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKE1NX1BSRUZJWCAic2FtcGxlcmF0ZSIsIChpbnQzMl90KXJlY29yZC0+bVNhbXBsZVJhdGUpOworICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihNTV9QUkVGSVggImNoYW5uZWxzIiwgKGludDMyX3QpcmVjb3JkLT5tQ2hhbm5lbENvdW50KTsKIAotICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQXVkaW9SZWNvcmRMYXRlbmN5LCByZWNvcmQtPm1MYXRlbmN5KTsKLSAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0F1ZGlvUmVjb3JkU2FtcGxlUmF0ZSwgcmVjb3JkLT5tU2FtcGxlUmF0ZSk7Ci0gICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtBdWRpb1JlY29yZENoYW5uZWxDb3VudCwgcmVjb3JkLT5tQ2hhbm5lbENvdW50KTsKLSAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9SZWNvcmRFbmNvZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdFR5cGVTdHJpbmcocmVjb3JkLT5tRm9ybWF0KS5jX3N0cigpKTsKLSAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9SZWNvcmRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Tb3VyY2VTdHJpbmcocmVjb3JkLT5tQXR0cmlidXRlcy5zb3VyY2UpLmNfc3RyKCkpOworICAgIC8vIE5vbi1BUEkgZW50cmllcywgdGhlc2UgY2FuIGNoYW5nZS4KKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoTU1fUFJFRklYICJwb3J0SWQiLCAoaW50MzJfdClyZWNvcmQtPm1Qb3J0SWQpOworICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihNTV9QUkVGSVggImZyYW1lQ291bnQiLCAoaW50MzJfdClyZWNvcmQtPm1GcmFtZUNvdW50KTsKKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhNTV9QUkVGSVggImF0dHJpYnV0ZXMiLCB0b1N0cmluZyhyZWNvcmQtPm1BdHRyaWJ1dGVzKS5jX3N0cigpKTsKKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoTU1fUFJFRklYICJjaGFubmVsTWFzayIsIChpbnQ2NF90KXJlY29yZC0+bUNoYW5uZWxNYXNrKTsKIAotICAgIC8vIGxvZyB0b3RhbCBkdXJhdGlvbiByZWNvcmRpbmcsIGluY2x1ZGluZyBhbnl0aGluZyBjdXJyZW50bHkgcnVubmluZyBbYW5kIGNvdW50XS4KLSAgICBuc2Vjc190IGFjdGl2ZSA9IDA7CisgICAgLy8gbG9nIHRvdGFsIGR1cmF0aW9uIHJlY29yZGluZywgaW5jbHVkaW5nIGFueXRoaW5nIGN1cnJlbnRseSBydW5uaW5nLgorICAgIGludDY0X3QgYWN0aXZlTnMgPSAwOwogICAgIGlmIChtU3RhcnRlZE5zICE9IDApIHsKLSAgICAgICAgYWN0aXZlID0gc3lzdGVtVGltZSgpIC0gbVN0YXJ0ZWROczsKKyAgICAgICAgYWN0aXZlTnMgPSBzeXN0ZW1UaW1lKCkgLSBtU3RhcnRlZE5zOwogICAgIH0KLSAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa0F1ZGlvUmVjb3JkRHVyYXRpb24sIChtRHVyYXRpb25OcyArIGFjdGl2ZSkgLyAoMTAwMCAqIDEwMDApKTsKLSAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0F1ZGlvUmVjb3JkQ291bnQsIG1Db3VudCk7Ci0KLSAgICAvLyBYWFggSSBkb24ndCBrbm93IHRoYXQgdGhpcyBhZGRzIGEgbG90IG9mIHZhbHVlLCBsb25nIHRlcm0KLSAgICBpZiAobUNyZWF0ZWROcyAhPSAwKSB7Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrQXVkaW9SZWNvcmRDcmVhdGVkLCBtQ3JlYXRlZE5zIC8gKDEwMDAgKiAxMDAwKSk7Ci0gICAgfQorICAgIG1BbmFseXRpY3NJdGVtLT5zZXREb3VibGUoTU1fUFJFRklYICJkdXJhdGlvbk1zIiwgKG1EdXJhdGlvbk5zICsgYWN0aXZlTnMpICogMWUtNik7CisgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KE1NX1BSRUZJWCAic3RhcnRDb3VudCIsIChpbnQ2NF90KW1Db3VudCk7CiAKICAgICBpZiAobUxhc3RFcnJvciAhPSBOT19FUlJPUikgewotICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0F1ZGlvUmVjb3JkRXJyb3IsIG1MYXN0RXJyb3IpOwotICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9SZWNvcmRFcnJvckZ1bmN0aW9uLCBtTGFzdEVycm9yRnVuYy5jX3N0cigpKTsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKE1NX1BSRUZJWCAibGFzdEVycm9yLmNvZGUiLCAoaW50MzJfdCltTGFzdEVycm9yKTsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoTU1fUFJFRklYICJsYXN0RXJyb3IuYXQiLCBtTGFzdEVycm9yRnVuYy5jX3N0cigpKTsKICAgICB9CiB9CiAKQEAgLTE1MCw3ICsxMjEsOSBAQAogICAgIDogbUFjdGl2ZShmYWxzZSksIG1TdGF0dXMoTk9fSU5JVCksIG1PcFBhY2thZ2VOYW1lKG9wUGFja2FnZU5hbWUpLAogICAgICAgbVNlc3Npb25JZChBVURJT19TRVNTSU9OX0FMTE9DQVRFKSwKICAgICAgIG1QcmV2aW91c1ByaW9yaXR5KEFORFJPSURfUFJJT1JJVFlfTk9STUFMKSwgbVByZXZpb3VzU2NoZWR1bGluZ0dyb3VwKFNQX0RFRkFVTFQpLAotICAgICAgbVNlbGVjdGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksIG1Sb3V0ZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKQorICAgICAgbVNlbGVjdGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksIG1Sb3V0ZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwKKyAgICAgIG1TZWxlY3RlZE1pY0RpcmVjdGlvbihNSUNfRElSRUNUSU9OX1VOU1BFQ0lGSUVEKSwKKyAgICAgIG1TZWxlY3RlZE1pY0ZpZWxkRGltZW5zaW9uKE1JQ19GSUVMRF9ESU1FTlNJT05fREVGQVVMVCkKIHsKIH0KIApAQCAtMTcwLDcgKzE0Myw5IEBACiAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzLAotICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQpCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBzZWxlY3RlZE1pY0RpcmVjdGlvbiwKKyAgICAgICAgZmxvYXQgbWljcm9waG9uZUZpZWxkRGltZW5zaW9uKQogICAgIDogbUFjdGl2ZShmYWxzZSksCiAgICAgICBtU3RhdHVzKE5PX0lOSVQpLAogICAgICAgbU9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSksCkBAIC0xODEsNyArMTU2LDggQEAKIHsKICAgICAodm9pZClzZXQoaW5wdXRTb3VyY2UsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIGNiZiwgdXNlciwKICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLCBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgZmxhZ3MsCi0gICAgICAgICAgICB1aWQsIHBpZCwgcEF0dHJpYnV0ZXMsIHNlbGVjdGVkRGV2aWNlSWQpOworICAgICAgICAgICAgdWlkLCBwaWQsIHBBdHRyaWJ1dGVzLCBzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgc2VsZWN0ZWRNaWNEaXJlY3Rpb24sIG1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbik7CiB9CiAKIEF1ZGlvUmVjb3JkOjp+QXVkaW9SZWNvcmQoKQpAQCAtMjAxLDE1ICsxNzcsMTUgQEAKICAgICAgICAgfQogICAgICAgICAvLyBObyBsb2NrIGhlcmU6IHdvcnN0IGNhc2Ugd2UgcmVtb3ZlIGEgTlVMTCBjYWxsYmFjayB3aGljaCB3aWxsIGJlIGEgbm9wCiAgICAgICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCAmJiBtSW5wdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1JbnB1dCk7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtSW5wdXQsIG1Qb3J0SWQpOwogICAgICAgICB9CiAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1BdWRpb1JlY29yZCktPnVubGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIHRoaXMpOwogICAgICAgICBtQXVkaW9SZWNvcmQuY2xlYXIoKTsKICAgICAgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsKICAgICAgICAgbUJ1ZmZlck1lbW9yeS5jbGVhcigpOwogICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgICAgIEFMT0dWKCJ+QXVkaW9SZWNvcmQsIHJlbGVhc2luZyBzZXNzaW9uIGlkICVkIiwKLSAgICAgICAgICAgICAgICBtU2Vzc2lvbklkKTsKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogcmVsZWFzaW5nIHNlc3Npb24gaWQgJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBtU2Vzc2lvbklkKTsKICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtU2Vzc2lvbklkLCAtMSAvKnBpZCovKTsKICAgICB9CiB9CkBAIC0yMzAsMjAgKzIwNiwyOCBAQAogICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcywKLSAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkKQorICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3Qgc2VsZWN0ZWRNaWNEaXJlY3Rpb24sCisgICAgICAgIGZsb2F0IG1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbikKIHsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQ7CiAgICAgcGlkX3QgY2FsbGluZ1BpZDsKICAgICBwaWRfdCBteVBpZDsKIAotICAgIEFMT0dWKCJzZXQoKTogaW5wdXRTb3VyY2UgJWQsIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCwgZnJhbWVDb3VudCAlenUsICIKKyAgICAvLyBOb3RlIG1Qb3J0SWQgaXMgbm90IHZhbGlkIHVudGlsIHRoZSB0cmFjayBpcyBjcmVhdGVkLCBzbyBvbWl0IG1Qb3J0SWQgaW4gQUxPRyBmb3Igc2V0LgorICAgIEFMT0dWKCIlcygpOiBpbnB1dFNvdXJjZSAlZCwgc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgJSN4LCBmcmFtZUNvdW50ICV6dSwgIgogICAgICAgICAgICJub3RpZmljYXRpb25GcmFtZXMgJXUsIHNlc3Npb25JZCAlZCwgdHJhbnNmZXJUeXBlICVkLCBmbGFncyAlI3gsIG9wUGFja2FnZU5hbWUgJXMgIgogICAgICAgICAgICJ1aWQgJWQsIHBpZCAlZCIsCisgICAgICAgICAgX19mdW5jX18sCiAgICAgICAgICAgaW5wdXRTb3VyY2UsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsIG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgZmxhZ3MsIFN0cmluZzgobU9wUGFja2FnZU5hbWUpLnN0cmluZygpLCB1aWQsIHBpZCk7CiAKKyAgICBtVHJhY2tlci5yZXNldChuZXcgUmVjb3JkaW5nQWN0aXZpdHlUcmFja2VyKCkpOworCiAgICAgbVNlbGVjdGVkRGV2aWNlSWQgPSBzZWxlY3RlZERldmljZUlkOworICAgIG1TZWxlY3RlZE1pY0RpcmVjdGlvbiA9IHNlbGVjdGVkTWljRGlyZWN0aW9uOworICAgIG1TZWxlY3RlZE1pY0ZpZWxkRGltZW5zaW9uID0gbWljcm9waG9uZUZpZWxkRGltZW5zaW9uOwogCiAgICAgc3dpdGNoICh0cmFuc2ZlclR5cGUpIHsKICAgICBjYXNlIFRSQU5TRkVSX0RFRkFVTFQ6CkBAIC0yNTUsNyArMjM5LDcgQEAKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBUUkFOU0ZFUl9DQUxMQkFDSzoKICAgICAgICAgaWYgKGNiZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVHJhbnNmZXIgdHlwZSBUUkFOU0ZFUl9DQUxMQkFDSyBidXQgY2JmID09IE5VTEwiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpOiBUcmFuc2ZlciB0eXBlIFRSQU5TRkVSX0NBTExCQUNLIGJ1dCBjYmYgPT0gTlVMTCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQpAQCAtMjY0LDcgKzI0OCw3IEBACiAgICAgY2FzZSBUUkFOU0ZFUl9TWU5DOgogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBBTE9HRSgiSW52YWxpZCB0cmFuc2ZlciB0eXBlICVkIiwgdHJhbnNmZXJUeXBlKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IEludmFsaWQgdHJhbnNmZXIgdHlwZSAlZCIsIF9fZnVuY19fLCB0cmFuc2ZlclR5cGUpOwogICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC0yNzIsNyArMjU2LDcgQEAKIAogICAgIC8vIGludmFyaWFudCB0aGF0IG1BdWRpb1JlY29yZCAhPSAwIGlzIHRydWUgb25seSBhZnRlciBzZXQoKSByZXR1cm5zIHN1Y2Nlc3NmdWxseQogICAgIGlmIChtQXVkaW9SZWNvcmQgIT0gMCkgewotICAgICAgICBBTE9HRSgiVHJhY2sgYWxyZWFkeSBpbiB1c2UiKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IFRyYWNrIGFscmVhZHkgaW4gdXNlIiwgX19mdW5jX18pOwogICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KQEAgLTI4Myw4ICsyNjcsOCBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIHN0cmVhbSB0eXBlIHNob3VsZG4ndCBiZSBsb29rZWQgYXQsIHRoaXMgdHJhY2sgaGFzIGF1ZGlvIGF0dHJpYnV0ZXMKICAgICAgICAgbWVtY3B5KCZtQXR0cmlidXRlcywgcEF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgQUxPR1YoIkJ1aWxkaW5nIEF1ZGlvUmVjb3JkIHdpdGggYXR0cmlidXRlczogc291cmNlPSVkIGZsYWdzPTB4JXggdGFncz1bJXNdIiwKLSAgICAgICAgICAgICAgbUF0dHJpYnV0ZXMuc291cmNlLCBtQXR0cmlidXRlcy5mbGFncywgbUF0dHJpYnV0ZXMudGFncyk7CisgICAgICAgIEFMT0dWKCIlcygpOiBCdWlsZGluZyBBdWRpb1JlY29yZCB3aXRoIGF0dHJpYnV0ZXM6IHNvdXJjZT0lZCBmbGFncz0weCV4IHRhZ3M9WyVzXSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1BdHRyaWJ1dGVzLnNvdXJjZSwgbUF0dHJpYnV0ZXMuZmxhZ3MsIG1BdHRyaWJ1dGVzLnRhZ3MpOwogICAgIH0KIAogICAgIG1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKQEAgLTI5NywxNCArMjgxLDE0IEBACiAgICAgLy8gdmFsaWRhdGUgcGFyYW1ldGVycwogICAgIC8vIEF1ZGlvRmxpbmdlciBjYXB0dXJlIG9ubHkgc3VwcG9ydHMgbGluZWFyIFBDTQogICAgIGlmICghYXVkaW9faXNfdmFsaWRfZm9ybWF0KGZvcm1hdCkgfHwgIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgewotICAgICAgICBBTE9HRSgiRm9ybWF0ICUjeCBpcyBub3QgbGluZWFyIHBjbSIsIGZvcm1hdCk7CisgICAgICAgIEFMT0dFKCIlcygpOiBGb3JtYXQgJSN4IGlzIG5vdCBsaW5lYXIgcGNtIiwgX19mdW5jX18sIGZvcm1hdCk7CiAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICBtRm9ybWF0ID0gZm9ybWF0OwogCiAgICAgaWYgKCFhdWRpb19pc19pbnB1dF9jaGFubmVsKGNoYW5uZWxNYXNrKSkgewotICAgICAgICBBTE9HRSgiSW52YWxpZCBjaGFubmVsIG1hc2sgJSN4IiwgY2hhbm5lbE1hc2spOworICAgICAgICBBTE9HRSgiJXMoKTogSW52YWxpZCBjaGFubmVsIG1hc2sgJSN4IiwgX19mdW5jX18sIGNoYW5uZWxNYXNrKTsKICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtMzI1LDcgKzMwOSw3IEBACiAgICAgLy8gbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCBpcyBpbml0aWFsaXplZCBpbiBjcmVhdGVSZWNvcmRfbAogCiAgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKLSAgICBBTE9HVigic2V0KCk6IG1TZXNzaW9uSWQgJWQiLCBtU2Vzc2lvbklkKTsKKyAgICBBTE9HVigiJXMoKTogbVNlc3Npb25JZCAlZCIsIF9fZnVuY19fLCBtU2Vzc2lvbklkKTsKIAogICAgIGNhbGxpbmdQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgbXlQaWQgPSBnZXRwaWQoKTsKQEAgLTM0NCwxMyArMzI4LDE4IEBACiAgICAgbUNiZiA9IGNiZjsKIAogICAgIGlmIChjYmYgIT0gTlVMTCkgewotICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQgPSBuZXcgQXVkaW9SZWNvcmRUaHJlYWQoKnRoaXMsIHRocmVhZENhbkNhbGxKYXZhKTsKKyAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkID0gbmV3IEF1ZGlvUmVjb3JkVGhyZWFkKCp0aGlzKTsKICAgICAgICAgbUF1ZGlvUmVjb3JkVGhyZWFkLT5ydW4oIkF1ZGlvUmVjb3JkIiwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CiAgICAgICAgIC8vIHRocmVhZCBiZWdpbnMgaW4gcGF1c2VkIHN0YXRlLCBhbmQgd2lsbCBub3QgcmVmZXJlbmNlIHVzIHVudGlsIHN0YXJ0KCkKICAgICB9CiAKICAgICAvLyBjcmVhdGUgdGhlIElBdWRpb1JlY29yZAotICAgIHN0YXR1cyA9IGNyZWF0ZVJlY29yZF9sKDAgLyplcG9jaCovLCBtT3BQYWNrYWdlTmFtZSk7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgICAgIHN0YXR1cyA9IGNyZWF0ZVJlY29yZF9sKDAgLyplcG9jaCovLCBtT3BQYWNrYWdlTmFtZSk7CisgICAgfQorCisgICAgQUxPR1YoIiVzKCVkKTogc3RhdHVzICVkIiwgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXR1cyk7CiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIGlmIChtQXVkaW9SZWNvcmRUaHJlYWQgIT0gMCkgewpAQCAtMzg3LDcgKzM3Niw3IEBACiAKIHN0YXR1c190IEF1ZGlvUmVjb3JkOjpzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50LCBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24pCiB7Ci0gICAgQUxPR1YoInN0YXJ0LCBzeW5jIGV2ZW50ICVkIHRyaWdnZXIgc2Vzc2lvbiAlZCIsIGV2ZW50LCB0cmlnZ2VyU2Vzc2lvbik7CisgICAgQUxPR1YoIiVzKCVkKTogc3luYyBldmVudCAlZCB0cmlnZ2VyIHNlc3Npb24gJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgZXZlbnQsIHRyaWdnZXJTZXNzaW9uKTsKIAogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBpZiAobUFjdGl2ZSkgewpAQCAtNDEzLDYgKzQwMiw3IEBACiAgICAgLy8gVGhpcyBpcyBsZWdhY3kgYmVoYXZpb3IuICBUaGlzIGlzIG5vdCBkb25lIGluIHN0b3AoKSB0byBhdm9pZCBhIHJhY2UgY29uZGl0aW9uCiAgICAgLy8gd2hlcmUgdGhlIGxhc3QgbWFya2VyIGV2ZW50IGlzIGlzc3VlZCB0d2ljZS4KICAgICBtTWFya2VyUmVhY2hlZCA9IGZhbHNlOworICAgIC8vIG1BY3RpdmUgaXMgY2hlY2tlZCBieSByZXN0b3JlUmVjb3JkX2wKICAgICBtQWN0aXZlID0gdHJ1ZTsKIAogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwpAQCAtNDI2LDEwICs0MTYsMTYgQEAKICAgICAgICAgc3RhdHVzID0gcmVzdG9yZVJlY29yZF9sKCJzdGFydCIpOwogICAgIH0KIAorICAgIC8vIENhbGwgdGhlc2UgZGlyZWN0bHkgYmVjYXVzZSB3ZSBhcmUgYWxyZWFkeSBob2xkaW5nIHRoZSBsb2NrLgorICAgIG1BdWRpb1JlY29yZC0+c2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihtU2VsZWN0ZWRNaWNEaXJlY3Rpb24pOworICAgIG1BdWRpb1JlY29yZC0+c2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKG1TZWxlY3RlZE1pY0ZpZWxkRGltZW5zaW9uKTsKKwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgbUFjdGl2ZSA9IGZhbHNlOwotICAgICAgICBBTE9HRSgic3RhcnQoKSBzdGF0dXMgJWQiLCBzdGF0dXMpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdHVzKTsKKyAgICAgICAgbU1lZGlhTWV0cmljcy5tYXJrRXJyb3Ioc3RhdHVzLCBfX0ZVTkNUSU9OX18pOwogICAgIH0gZWxzZSB7CisgICAgICAgIG1UcmFja2VyLT5yZWNvcmRpbmdTdGFydGVkKCk7CiAgICAgICAgIHNwPEF1ZGlvUmVjb3JkVGhyZWFkPiB0ID0gbUF1ZGlvUmVjb3JkVGhyZWFkOwogICAgICAgICBpZiAodCAhPSAwKSB7CiAgICAgICAgICAgICB0LT5yZXN1bWUoKTsKQEAgLTQ0MiwxNiArNDM4LDEzIEBACiAgICAgICAgIC8vIHdlJ3ZlIHN1Y2Nlc3NmdWxseSBzdGFydGVkLCBsb2cgdGhhdCB0aW1lCiAgICAgICAgIG1NZWRpYU1ldHJpY3MubG9nU3RhcnQoc3lzdGVtVGltZSgpKTsKICAgICB9Ci0KLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIG1NZWRpYU1ldHJpY3MubWFya0Vycm9yKHN0YXR1cywgX19GVU5DVElPTl9fKTsKLSAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogdm9pZCBBdWRpb1JlY29yZDo6c3RvcCgpCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIEFMT0dWKCIlcyglZCk6IG1BY3RpdmU6JWRcbiIsIF9fZnVuY19fLCBtUG9ydElkLCBtQWN0aXZlKTsKICAgICBpZiAoIW1BY3RpdmUpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTQ1OSw2ICs0NTIsNyBAQAogICAgIG1BY3RpdmUgPSBmYWxzZTsKICAgICBtUHJveHktPmludGVycnVwdCgpOwogICAgIG1BdWRpb1JlY29yZC0+c3RvcCgpOworICAgIG1UcmFja2VyLT5yZWNvcmRpbmdTdG9wcGVkKCk7CiAKICAgICAvLyBOb3RlOiBsZWdhY3kgaGFuZGxpbmcgLSBzdG9wIGRvZXMgbm90IGNsZWFyIHJlY29yZCBtYXJrZXIgYW5kCiAgICAgLy8gcGVyaW9kaWMgdXBkYXRlIHBvc2l0aW9uOyB3ZSB1cGRhdGUgdGhvc2Ugb24gc3RhcnQoKS4KQEAgLTYzMCw4ICs2MjQsOCBAQAogICAgIFN0cmluZzggcmVzdWx0OwogCiAgICAgcmVzdWx0LmFwcGVuZCgiIEF1ZGlvUmVjb3JkOjpkdW1wXG4iKTsKLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHN0YXR1cyglZCksIGFjdGl2ZSglZCksIHNlc3Npb24gSWQoJWQpXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXR1cywgbUFjdGl2ZSwgbVNlc3Npb25JZCk7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBpZCglZCkgc3RhdHVzKCVkKSwgYWN0aXZlKCVkKSwgc2Vzc2lvbiBJZCglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBtUG9ydElkLCBtU3RhdHVzLCBtQWN0aXZlLCBtU2Vzc2lvbklkKTsKICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIGZsYWdzKCUjeCksIHJlcS4gZmxhZ3MoJSN4KSwgYXVkaW8gc291cmNlKCVkKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncywgbU9yaWdGbGFncywgbUF0dHJpYnV0ZXMuc291cmNlKTsKICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIGZvcm1hdCglI3gpLCBjaGFubmVsIG1hc2soJSN4KSwgY2hhbm5lbCBjb3VudCgldSksIHNhbXBsZSByYXRlKCV1KVxuIiwKQEAgLTY0Miw2ICs2MzYsOCBAQAogICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QsIG1Ob3RpZmljYXRpb25GcmFtZXNSZXEpOwogICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgaW5wdXQoJWQpLCBsYXRlbmN5KCV1KSwgc2VsZWN0ZWQgZGV2aWNlIElkKCVkKSwgcm91dGVkIGRldmljZSBJZCglZClcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXQsIG1MYXRlbmN5LCBtU2VsZWN0ZWREZXZpY2VJZCwgbVJvdXRlZERldmljZUlkKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIG1pYyBkaXJlY3Rpb24oJWQpIG1pYyBmaWVsZCBkaW1lbnNpb24oJWYpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZE1pY0RpcmVjdGlvbiwgbVNlbGVjdGVkTWljRmllbGREaW1lbnNpb24pOwogICAgIDo6d3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtNjczLDcgKzY2OSw3IEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogCiAgICAgaWYgKGF1ZGlvRmxpbmdlciA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGF1ZGlvZmxpbmdlciIpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGF1ZGlvZmxpbmdlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KQEAgLTcwMCw3ICs2OTYsOCBAQAogICAgICAgICAgICAgLy8gdXNlIGNhc2UgMzogb2J0YWluL3JlbGVhc2UgbW9kZQogICAgICAgICAgICAgKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9PQlRBSU4pOwogICAgICAgICBpZiAoIXVzZUNhc2VBbGxvd2VkKSB7Ci0gICAgICAgICAgICBBTE9HVygiQVVESU9fSU5QVVRfRkxBR19GQVNUIGRlbmllZCwgaW5jb21wYXRpYmxlIHRyYW5zZmVyID0gJXMiLAorICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogQVVESU9fSU5QVVRfRkxBR19GQVNUIGRlbmllZCwgaW5jb21wYXRpYmxlIHRyYW5zZmVyID0gJXMiLAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICAgICAgICBjb252ZXJ0VHJhbnNmZXJUb1RleHQobVRyYW5zZmVyKSk7CiAgICAgICAgICAgICBtRmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgKG1GbGFncyAmIH4oQVVESU9fSU5QVVRfRkxBR19GQVNUIHwKICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19SQVcpKTsKQEAgLTcyMCw2ICs3MTcsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlucHV0Lm9wUGFja2FnZU5hbWUgPSBvcFBhY2thZ2VOYW1lOworICAgIGlucHV0LnJpaWQgPSBtVHJhY2tlci0+Z2V0UmlpZCgpOwogCiAgICAgaW5wdXQuZmxhZ3MgPSBtRmxhZ3M7CiAgICAgLy8gVGhlIG5vdGlmaWNhdGlvbiBmcmFtZSBjb3VudCBpcyB0aGUgcGVyaW9kIGJldHdlZW4gY2FsbGJhY2tzLCBhcyBzdWdnZXN0ZWQgYnkgdGhlIGNsaWVudApAQCAtNzM1LDcgKzczMyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0dXMpOwogCiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgcmVjb3JkIHRyYWNrLCBzdGF0dXM6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgcmVjb3JkIHRyYWNrLCBzdGF0dXM6ICVkIiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXR1cyk7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAgICAgQUxPR19BU1NFUlQocmVjb3JkICE9IDApOwpAQCAtNzQ1LDcgKzc0NCw4IEBACiAKICAgICBtQXdhaXRCb29zdCA9IGZhbHNlOwogICAgIGlmIChvdXRwdXQuZmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0ZBU1QpIHsKLSAgICAgICAgQUxPR0koIkFVRElPX0lOUFVUX0ZMQUdfRkFTVCBzdWNjZXNzZnVsOyBmcmFtZUNvdW50ICV6dSAtPiAlenUiLAorICAgICAgICBBTE9HSSgiJXMoJWQpOiBBVURJT19JTlBVVF9GTEFHX0ZBU1Qgc3VjY2Vzc2Z1bDsgZnJhbWVDb3VudCAlenUgLT4gJXp1IiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICAgIG1SZXFGcmFtZUNvdW50LCBvdXRwdXQuZnJhbWVDb3VudCk7CiAgICAgICAgIG1Bd2FpdEJvb3N0ID0gdHJ1ZTsKICAgICB9CkBAIC03NTUsMTMgKzc1NSwxMyBAQAogICAgIG1TYW1wbGVSYXRlID0gb3V0cHV0LnNhbXBsZVJhdGU7CiAKICAgICBpZiAob3V0cHV0LmNibGsgPT0gMCkgewotICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIik7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICBpTWVtUG9pbnRlciA9IG91dHB1dC5jYmxrIC0+cG9pbnRlcigpOwogICAgIGlmIChpTWVtUG9pbnRlciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2sgcG9pbnRlciIpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2sgcG9pbnRlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KQEAgLTc3Niw3ICs3NzYsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGJ1ZmZlcnMgPSBvdXRwdXQuYnVmZmVycy0+cG9pbnRlcigpOwogICAgICAgICBpZiAoYnVmZmVycyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBidWZmZXIgcG9pbnRlciIpOworICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBidWZmZXIgcG9pbnRlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KQEAgLTc5NSwyNiArNzk1LDI5IEBACiAgICAgbUNibGsgPSBjYmxrOwogICAgIC8vIG5vdGUgdGhhdCBvdXRwdXQuZnJhbWVDb3VudCBpcyB0aGUgKHBvc3NpYmx5IHJldmlzZWQpIHZhbHVlIG9mIG1SZXFGcmFtZUNvdW50CiAgICAgaWYgKG91dHB1dC5mcmFtZUNvdW50IDwgbVJlcUZyYW1lQ291bnQgfHwgKG1SZXFGcmFtZUNvdW50ID09IDAgJiYgb3V0cHV0LmZyYW1lQ291bnQgPT0gMCkpIHsKLSAgICAgICAgQUxPR1coIlJlcXVlc3RlZCBmcmFtZUNvdW50ICV6dSBidXQgcmVjZWl2ZWQgZnJhbWVDb3VudCAlenUiLAorICAgICAgICBBTE9HVygiJXMoJWQpOiBSZXF1ZXN0ZWQgZnJhbWVDb3VudCAlenUgYnV0IHJlY2VpdmVkIGZyYW1lQ291bnQgJXp1IiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIG91dHB1dC5wb3J0SWQsCiAgICAgICAgICAgICAgIG1SZXFGcmFtZUNvdW50LCAgb3V0cHV0LmZyYW1lQ291bnQpOwogICAgIH0KIAogICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGFwcGxpY2F0aW9uIGlzIG5vdGlmaWVkIHdpdGggc3VmZmljaWVudCBtYXJnaW4gYmVmb3JlIG92ZXJydW4uCiAgICAgLy8gVGhlIGNvbXB1dGF0aW9uIGlzIGRvbmUgb24gc2VydmVyIHNpZGUuCiAgICAgaWYgKG1Ob3RpZmljYXRpb25GcmFtZXNSZXEgPiAwICYmIG91dHB1dC5ub3RpZmljYXRpb25GcmFtZUNvdW50ICE9IG1Ob3RpZmljYXRpb25GcmFtZXNSZXEpIHsKLSAgICAgICAgQUxPR1coIlNlcnZlciBhZGp1c3RlZCBub3RpZmljYXRpb25GcmFtZXMgZnJvbSAldSB0byAlenUgZm9yIGZyYW1lQ291bnQgJXp1IiwKKyAgICAgICAgQUxPR1coIiVzKCVkKTogU2VydmVyIGFkanVzdGVkIG5vdGlmaWNhdGlvbkZyYW1lcyBmcm9tICV1IHRvICV6dSBmb3IgZnJhbWVDb3VudCAlenUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBvdXRwdXQucG9ydElkLAogICAgICAgICAgICAgICAgIG1Ob3RpZmljYXRpb25GcmFtZXNSZXEsIG91dHB1dC5ub3RpZmljYXRpb25GcmFtZUNvdW50LCBvdXRwdXQuZnJhbWVDb3VudCk7CiAgICAgfQogICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSAodWludDMyX3Qpb3V0cHV0Lm5vdGlmaWNhdGlvbkZyYW1lQ291bnQ7CiAKICAgICAvL21JbnB1dCAhPSBpbnB1dCBpbmNsdWRlcyB0aGUgY2FzZSB3aGVyZSBtSW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUgZm9yIGZpcnN0IGNyZWF0aW9uCi0gICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwICYmIG1JbnB1dCAhPSBvdXRwdXQuaW5wdXRJZCkgeworICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCkgewogICAgICAgICBpZiAobUlucHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtSW5wdXQpOworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbUlucHV0LCBtUG9ydElkKTsKICAgICAgICAgfQotICAgICAgICBBdWRpb1N5c3RlbTo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBvdXRwdXQuaW5wdXRJZCk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG91dHB1dC5pbnB1dElkLCBvdXRwdXQucG9ydElkKTsKICAgICB9CiAKKyAgICBtUG9ydElkID0gb3V0cHV0LnBvcnRJZDsKICAgICAvLyBXZSByZXRhaW4gYSBjb3B5IG9mIHRoZSBJL08gaGFuZGxlLCBidXQgZG9uJ3Qgb3duIHRoZSByZWZlcmVuY2UKICAgICBtSW5wdXQgPSBvdXRwdXQuaW5wdXRJZDsKICAgICBtUmVmcmVzaFJlbWFpbmluZyA9IHRydWU7CkBAIC04NjUsMTIgKzg2OCwxMiBAQAogICAgIH0gZWxzZSBpZiAod2FpdENvdW50ID09IDApIHsKICAgICAgICAgcmVxdWVzdGVkID0gJkNsaWVudFByb3h5OjprTm9uQmxvY2tpbmc7CiAgICAgfSBlbHNlIGlmICh3YWl0Q291bnQgPiAwKSB7Ci0gICAgICAgIGxvbmcgbG9uZyBtcyA9IFdBSVRfUEVSSU9EX01TICogKGxvbmcgbG9uZykgd2FpdENvdW50OworICAgICAgICB0aW1lX3QgbXMgPSBXQUlUX1BFUklPRF9NUyAqICh0aW1lX3QpIHdhaXRDb3VudDsKICAgICAgICAgdGltZW91dC50dl9zZWMgPSBtcyAvIDEwMDA7Ci0gICAgICAgIHRpbWVvdXQudHZfbnNlYyA9IChpbnQpIChtcyAlIDEwMDApICogMTAwMDAwMDsKKyAgICAgICAgdGltZW91dC50dl9uc2VjID0gKGxvbmcpIChtcyAlIDEwMDApICogMTAwMDAwMDsKICAgICAgICAgcmVxdWVzdGVkID0gJnRpbWVvdXQ7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIiVzIGludmFsaWQgd2FpdENvdW50ICVkIiwgX19mdW5jX18sIHdhaXRDb3VudCk7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IGludmFsaWQgd2FpdENvdW50ICVkIiwgX19mdW5jX18sIG1Qb3J0SWQsIHdhaXRDb3VudCk7CiAgICAgICAgIHJlcXVlc3RlZCA9IE5VTEw7CiAgICAgfQogICAgIHJldHVybiBvYnRhaW5CdWZmZXIoYXVkaW9CdWZmZXIsIHJlcXVlc3RlZCwgTlVMTCAvKmVsYXBzZWQqLywgbm9uQ29udGlnKTsKQEAgLTk3OSw3ICs5ODIsOCBAQAogICAgIGlmIChzc2l6ZV90KHVzZXJTaXplKSA8IDAgfHwgKGJ1ZmZlciA9PSBOVUxMICYmIHVzZXJTaXplICE9IDApKSB7CiAgICAgICAgIC8vIHNhbml0eS1jaGVjay4gdXNlciBpcyBtb3N0LWxpa2VseSBwYXNzaW5nIGFuIGVycm9yIGNvZGUsIGFuZCBpdCB3b3VsZAogICAgICAgICAvLyBtYWtlIHRoZSByZXR1cm4gdmFsdWUgYW1iaWd1b3VzIChhY3R1YWxTaXplIHZzIGVycm9yKS4KLSAgICAgICAgQUxPR0UoIkF1ZGlvUmVjb3JkOjpyZWFkKGJ1ZmZlcj0lcCwgc2l6ZT0lenUgKCV6dSkiLCBidWZmZXIsIHVzZXJTaXplLCB1c2VyU2l6ZSk7CisgICAgICAgIEFMT0dFKCIlcyglZCkgKGJ1ZmZlcj0lcCwgc2l6ZT0lenUgKCV6dSkiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBidWZmZXIsIHVzZXJTaXplLCB1c2VyU2l6ZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC0xMDM2LDcgKzEwNDAsNyBAQAogICAgICAgICAgICAgcG9sbFVzIDw8PSAxOwogICAgICAgICB9IHdoaWxlICh0cnlDb3VudGVyLS0gPiAwKTsKICAgICAgICAgaWYgKHRyeUNvdW50ZXIgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZGlkIG5vdCByZWNlaXZlIGV4cGVjdGVkIHByaW9yaXR5IGJvb3N0IG9uIHRpbWUiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IGRpZCBub3QgcmVjZWl2ZSBleHBlY3RlZCBwcmlvcml0eSBib29zdCBvbiB0aW1lIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICB9CiAgICAgICAgIC8vIFJ1biBhZ2FpbiBpbW1lZGlhdGVseQogICAgICAgICByZXR1cm4gMDsKQEAgLTExNTksNyArMTE2Myw4IEBACiAgICAgaWYgKG5zICE9IE5TX1dIRU5FVkVSKSB7CiAgICAgICAgIHRpbWVvdXQudHZfc2VjID0gbnMgLyAxMDAwMDAwMDAwTEw7CiAgICAgICAgIHRpbWVvdXQudHZfbnNlYyA9IG5zICUgMTAwMDAwMDAwMExMOwotICAgICAgICBBTE9HVigidGltZW91dCAlbGQuJTAzZCIsIHRpbWVvdXQudHZfc2VjLCAoaW50KSB0aW1lb3V0LnR2X25zZWMgLyAxMDAwMDAwKTsKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogdGltZW91dCAlbGQuJTAzZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHRpbWVvdXQudHZfc2VjLCAoaW50KSB0aW1lb3V0LnR2X25zZWMgLyAxMDAwMDAwKTsKICAgICAgICAgcmVxdWVzdGVkID0gJnRpbWVvdXQ7CiAgICAgfQogCkBAIC0xMTcxLDE2ICsxMTc2LDE4IEBACiAgICAgICAgIHNpemVfdCBub25Db250aWc7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG9idGFpbkJ1ZmZlcigmYXVkaW9CdWZmZXIsIHJlcXVlc3RlZCwgTlVMTCwgJm5vbkNvbnRpZyk7CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKGVyciAhPSBOT19FUlJPUikgIT0gKGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgPT0gMCksCi0gICAgICAgICAgICAgICAgIm9idGFpbkJ1ZmZlcigpIGVycj0lZCBmcmFtZUNvdW50PSV6dSIsIGVyciwgYXVkaW9CdWZmZXIuZnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgIiVzKCVkKTogb2J0YWluQnVmZmVyKCkgZXJyPSVkIGZyYW1lQ291bnQ9JXp1IiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgZXJyLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50KTsKICAgICAgICAgcmVxdWVzdGVkID0gJkNsaWVudFByb3h5OjprTm9uQmxvY2tpbmc7CiAgICAgICAgIHNpemVfdCBhdmFpbCA9IGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgKyBub25Db250aWc7Ci0gICAgICAgIEFMT0dWKCJvYnRhaW5CdWZmZXIoJXUpIHJldHVybmVkICV6dSA9ICV6dSArICV6dSBlcnIgJWQiLAotICAgICAgICAgICAgICAgIG1SZW1haW5pbmdGcmFtZXMsIGF2YWlsLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50LCBub25Db250aWcsIGVycik7CisgICAgICAgIEFMT0dWKCIlcyglZCk6IG9idGFpbkJ1ZmZlcigldSkgcmV0dXJuZWQgJXp1ID0gJXp1ICsgJXp1IGVyciAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIG1SZW1haW5pbmdGcmFtZXMsIGF2YWlsLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50LCBub25Db250aWcsIGVycik7CiAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIGlmIChlcnIgPT0gVElNRURfT1VUIHx8IGVyciA9PSBXT1VMRF9CTE9DSyB8fCBlcnIgPT0gLUVJTlRSKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HRSgiRXJyb3IgJWQgb2J0YWluaW5nIGFuIGF1ZGlvIGJ1ZmZlciwgZ2l2aW5nIHVwLiIsIGVycik7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBFcnJvciAlZCBvYnRhaW5pbmcgYW4gYXVkaW8gYnVmZmVyLCBnaXZpbmcgdXAuIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIGVycik7CiAgICAgICAgICAgICByZXR1cm4gTlNfTkVWRVI7CiAgICAgICAgIH0KIApAQCAtMTIwMiw4ICsxMjA5LDggQEAKIAogICAgICAgICAvLyBTYW5pdHkgY2hlY2sgb24gcmV0dXJuZWQgc2l6ZQogICAgICAgICBpZiAoc3NpemVfdChyZWFkU2l6ZSkgPCAwIHx8IHJlYWRTaXplID4gcmVxU2l6ZSkgewotICAgICAgICAgICAgQUxPR0UoIkVWRU5UX01PUkVfREFUQSByZXF1ZXN0ZWQgJXp1IGJ5dGVzIGJ1dCBjYWxsYmFjayByZXR1cm5lZCAlemQgYnl0ZXMiLAotICAgICAgICAgICAgICAgICAgICByZXFTaXplLCBzc2l6ZV90KHJlYWRTaXplKSk7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiAgRVZFTlRfTU9SRV9EQVRBIHJlcXVlc3RlZCAlenUgYnl0ZXMgYnV0IGNhbGxiYWNrIHJldHVybmVkICV6ZCBieXRlcyIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCByZXFTaXplLCBzc2l6ZV90KHJlYWRTaXplKSk7CiAgICAgICAgICAgICByZXR1cm4gTlNfTkVWRVI7CiAgICAgICAgIH0KIApAQCAtMTI2Myw3ICsxMjcwLDcgQEAKIAogc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OnJlc3RvcmVSZWNvcmRfbChjb25zdCBjaGFyICpmcm9tKQogewotICAgIEFMT0dXKCJkZWFkIElBdWRpb1JlY29yZCwgY3JlYXRpbmcgYSBuZXcgb25lIGZyb20gJXMoKSIsIGZyb20pOworICAgIEFMT0dXKCIlcyglZCk6IGRlYWQgSUF1ZGlvUmVjb3JkLCBjcmVhdGluZyBhIG5ldyBvbmUgZnJvbSAlcygpIiwgX19mdW5jX18sIG1Qb3J0SWQsIGZyb20pOwogICAgICsrbVNlcXVlbmNlOwogCiAgICAgY29uc3QgaW50IElOSVRJQUxfUkVUUklFUyA9IDM7CkBAIC0xMjgzLDEwICsxMjkwLDcgQEAKICAgICBtTmV3UG9zaXRpb24gPSBwb3NpdGlvbiArIG1VcGRhdGVQZXJpb2Q7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY3JlYXRlUmVjb3JkX2wocG9zaXRpb24sIG1PcFBhY2thZ2VOYW1lKTsKIAotICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1coIiVzKCk6IGNyZWF0ZVJlY29yZF9sIGZhaWxlZCwgZG8gbm90IHJldHJ5IiwgX19mdW5jX18pOwotICAgICAgICByZXRyaWVzID0gMDsKLSAgICB9IGVsc2UgeworICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKICAgICAgICAgaWYgKG1BY3RpdmUpIHsKICAgICAgICAgICAgIC8vIGNhbGxiYWNrIHRocmVhZCBvciBzeW5jIGV2ZW50IGhhc24ndCBjaGFuZ2VkCiAgICAgICAgICAgICAvLyBGSVhNRSB0aGlzIGZhaWxzIGlmIHdlIGhhdmUgYSBuZXcgQXVkaW9GbGluZ2VyIGluc3RhbmNlCkBAIC0xMjk3LDE1ICsxMzAxLDE3IEBACiAgICAgfQogCiAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HVygiJXMoKSBmYWlsZWQgc3RhdHVzICVkLCByZXRyaWVzICVkIiwgX19mdW5jX18sIHJlc3VsdCwgcmV0cmllcyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IGZhaWxlZCBzdGF0dXMgJWQsIHJldHJpZXMgJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgcmVzdWx0LCByZXRyaWVzKTsKICAgICAgICAgaWYgKC0tcmV0cmllcyA+IDApIHsKKyAgICAgICAgICAgIC8vIGxlYXZlIHRpbWUgZm9yIGFuIGV2ZW50dWFsIHJhY2UgY29uZGl0aW9uIHRvIGNsZWFyIGJlZm9yZSByZXRyeWluZworICAgICAgICAgICAgdXNsZWVwKDUwMDAwMCk7CiAgICAgICAgICAgICBnb3RvIHJldHJ5OwogICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HVygicmVzdG9yZVJlY29yZF9sKCkgZmFpbGVkIHN0YXR1cyAlZCIsIHJlc3VsdCk7Ci0gICAgICAgIG1BY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgLy8gaWYgbm8gcmV0cmllcyBsZWZ0LCBzZXQgaW52YWxpZCBiaXQgdG8gZm9yY2UgcmVzdG9yaW5nIGF0IG5leHQgb2NjYXNpb24KKyAgICAgICAgLy8gYW5kIGF2b2lkIGluY29uc2lzdGVudCBhY3RpdmUgc3RhdGUgb24gY2xpZW50IGFuZCBzZXJ2ZXIgc2lkZXMKKyAgICAgICAgaWYgKG1DYmxrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGFuZHJvaWRfYXRvbWljX29yKENCTEtfSU5WQUxJRCwgJm1DYmxrLT5tRmxhZ3MpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTEzMTQsMjEgKzEzMjAsMjEgQEAKIHN0YXR1c190IEF1ZGlvUmVjb3JkOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spCiB7CiAgICAgaWYgKGNhbGxiYWNrID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzIGFkZGluZyBOVUxMIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IGFkZGluZyBOVUxMIGNhbGxiYWNrISIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sudW5zYWZlX2dldCgpID09IGNhbGxiYWNrLmdldCgpKSB7Ci0gICAgICAgIEFMT0dXKCIlcyBhZGRpbmcgc2FtZSBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBBTE9HVygiJXMoJWQpOiBhZGRpbmcgc2FtZSBjYWxsYmFjayEiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgaWYgKG1JbnB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dXKCIlcyBjYWxsYmFjayBhbHJlYWR5IHByZXNlbnQhIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1JbnB1dCk7CisgICAgICAgICAgICBBTE9HVygiJXMoJWQpOiBjYWxsYmFjayBhbHJlYWR5IHByZXNlbnQhIiwgX19mdW5jX18sIG1Qb3J0SWQpOworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbUlucHV0LCBtUG9ydElkKTsKICAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtSW5wdXQpOworICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtSW5wdXQsIG1Qb3J0SWQpOwogICAgIH0KICAgICBtRGV2aWNlQ2FsbGJhY2sgPSBjYWxsYmFjazsKICAgICByZXR1cm4gc3RhdHVzOwpAQCAtMTMzOCwxNyArMTM0NCwxNyBAQAogICAgICAgICBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKQogewogICAgIGlmIChjYWxsYmFjayA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlcyByZW1vdmluZyBOVUxMIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IHJlbW92aW5nIE5VTEwgY2FsbGJhY2shIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgaWYgKG1EZXZpY2VDYWxsYmFjay51bnNhZmVfZ2V0KCkgIT0gY2FsbGJhY2suZ2V0KCkpIHsKLSAgICAgICAgQUxPR1coIiVzIHJlbW92aW5nIGRpZmZlcmVudCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBBTE9HVygiJXMoJWQpOiByZW1vdmluZyBkaWZmZXJlbnQgY2FsbGJhY2shIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIG1EZXZpY2VDYWxsYmFjay5jbGVhcigpOwogICAgIGlmIChtSW5wdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbUlucHV0KTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbUlucHV0LCBtUG9ydElkKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtMTM4Miw2ICsxMzg4LDM5IEBACiAgICAgcmV0dXJuIG1BdWRpb1JlY29yZC0+Z2V0QWN0aXZlTWljcm9waG9uZXMoYWN0aXZlTWljcm9waG9uZXMpLnRyYW5zYWN0aW9uRXJyb3IoKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OnNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pCit7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIGlmIChtU2VsZWN0ZWRNaWNEaXJlY3Rpb24gPT0gZGlyZWN0aW9uKSB7CisgICAgICAgIC8vIE5PUAorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgbVNlbGVjdGVkTWljRGlyZWN0aW9uID0gZGlyZWN0aW9uOworICAgIGlmIChtQXVkaW9SZWNvcmQgPT0gMCkgeworICAgICAgICAvLyB0aGUgaW50ZXJuYWwgQXVkaW9SZWNvcmQgaGFzbid0IGJlIGNyZWF0ZWQgeWV0LCBzbyBqdXN0IHN0YXNoIHRoZSBhdHRyaWJ1dGUuCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbUF1ZGlvUmVjb3JkLT5zZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGRpcmVjdGlvbikudHJhbnNhY3Rpb25FcnJvcigpOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OnNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSB7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIGlmIChtU2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbiA9PSB6b29tKSB7CisgICAgICAgIC8vIE5PUAorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgbVNlbGVjdGVkTWljRmllbGREaW1lbnNpb24gPSB6b29tOworICAgIGlmIChtQXVkaW9SZWNvcmQgPT0gMCkgeworICAgICAgICAvLyB0aGUgaW50ZXJuYWwgQXVkaW9SZWNvcmQgaGFzbid0IGJlIGNyZWF0ZWQgeWV0LCBzbyBqdXN0IHN0YXNoIHRoZSBhdHRyaWJ1dGUuCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbUF1ZGlvUmVjb3JkLT5zZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oem9vbSkudHJhbnNhY3Rpb25FcnJvcigpOworICAgIH0KK30KKwogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiB2b2lkIEF1ZGlvUmVjb3JkOjpEZWF0aE5vdGlmaWVyOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpCkBAIC0xMzk1LDggKzE0MzQsOSBAQAogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLUF1ZGlvUmVjb3JkOjpBdWRpb1JlY29yZFRocmVhZDo6QXVkaW9SZWNvcmRUaHJlYWQoQXVkaW9SZWNvcmQmIHJlY2VpdmVyLCBib29sIGJDYW5DYWxsSmF2YSkKLSAgICA6IFRocmVhZChiQ2FuQ2FsbEphdmEpLCBtUmVjZWl2ZXIocmVjZWl2ZXIpLCBtUGF1c2VkKHRydWUpLCBtUGF1c2VkSW50KGZhbHNlKSwgbVBhdXNlZE5zKDBMTCksCitBdWRpb1JlY29yZDo6QXVkaW9SZWNvcmRUaHJlYWQ6OkF1ZGlvUmVjb3JkVGhyZWFkKEF1ZGlvUmVjb3JkJiByZWNlaXZlcikKKyAgICA6IFRocmVhZCh0cnVlIC8qIGJDYW5DYWxsSmF2YSAqLykgIC8vIGJpbmRlciByZWN1cnNpb24gb24gcmVzdG9yZVJlY29yZF9sKCkgbWF5IGNhbGwgSmF2YS4KKyAgICAsIG1SZWNlaXZlcihyZWNlaXZlciksIG1QYXVzZWQodHJ1ZSksIG1QYXVzZWRJbnQoZmFsc2UpLCBtUGF1c2VkTnMoMExMKSwKICAgICAgIG1JZ25vcmVOZXh0UGF1c2VkSW50KGZhbHNlKQogewogfQpAQCAtMTQ0Niw5ICsxNDg2LDkgQEAKICAgICBjYXNlIE5TX1dIRU5FVkVSOgogICAgICAgICAvLyBFdmVudCBkcml2ZW46IGNhbGwgd2FrZSgpIHdoZW4gY2FsbGJhY2sgbm90aWZpY2F0aW9ucyBjb25kaXRpb25zIGNoYW5nZS4KICAgICAgICAgbnMgPSBJTlQ2NF9NQVg7Ci0gICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICBkZWZhdWx0OgotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5zIDwgMCwgInByb2Nlc3NBdWRpb0J1ZmZlcigpIHJldHVybmVkICUiIFBSSWQ2NCwgbnMpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5zIDwgMCwgIiVzKCkgcmV0dXJuZWQgJWxsZCIsIF9fZnVuY19fLCAobG9uZyBsb25nKW5zKTsKICAgICAgICAgcGF1c2VJbnRlcm5hbChucyk7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcAppbmRleCBjMDcyOTAxLi4xZTdmOWZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9GbGluZ2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KICNpbmNsdWRlIDxtYXRoLmg+CiAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KQEAgLTQyNyw2ICs0MjgsNyBAQAogCiBhdWRpb191bmlxdWVfaWRfdCBBdWRpb1N5c3RlbTo6bmV3QXVkaW9VbmlxdWVJZChhdWRpb191bmlxdWVfaWRfdXNlX3QgdXNlKQogeworICAgIC8vIE11c3Qgbm90IHVzZSBBRiBhcyBJRHMgd2lsbCByZS1yb2xsIG9uIGF1ZGlvc2VydmVyIHJlc3RhcnQsIGIvMTMwMzY5NTI5LgogICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhZiA9PSAwKSByZXR1cm4gQVVESU9fVU5JUVVFX0lEX0FMTE9DQVRFOwogICAgIHJldHVybiBhZi0+bmV3QXVkaW9VbmlxdWVJZCh1c2UpOwpAQCAtNTIxLDEwICs1MjMsMTAgQEAKICAgICBpZiAoaW9EZXNjID09IDAgfHwgaW9EZXNjLT5tSW9IYW5kbGUgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHJldHVybjsKIAogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwotICAgIFZlY3RvciA8IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+ID4gY2FsbGJhY2tzOwotCisgICAgc3RkOjp2ZWN0b3I8c3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4+IGNhbGxiYWNrc1RvQ2FsbDsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGF1dG8gY2FsbGJhY2tzID0gc3RkOjptYXA8YXVkaW9fcG9ydF9oYW5kbGVfdCwgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4+KCk7CiAKICAgICAgICAgc3dpdGNoIChldmVudCkgewogICAgICAgICBjYXNlIEFVRElPX09VVFBVVF9PUEVORUQ6CkBAIC01NDIsOSArNTQ0LDkgQEAKICAgICAgICAgICAgIGlmIChpb0Rlc2MtPmdldERldmljZUlkKCkgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgewogICAgICAgICAgICAgICAgIGRldmljZUlkID0gaW9EZXNjLT5nZXREZXZpY2VJZCgpOwogICAgICAgICAgICAgICAgIGlmIChldmVudCA9PSBBVURJT19PVVRQVVRfT1BFTkVEIHx8IGV2ZW50ID09IEFVRElPX0lOUFVUX09QRU5FRCkgewotICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGlvSW5kZXggPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MuaW5kZXhPZktleShpb0Rlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpb0luZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcyA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy52YWx1ZUF0KGlvSW5kZXgpOworICAgICAgICAgICAgICAgICAgICBhdXRvIGl0ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmZpbmQoaW9EZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoaXQgIT0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MgPSBpdC0+c2Vjb25kOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNTY4LDcgKzU3MCw3IEBACiAgICAgICAgICAgICAgICAgICBldmVudCA9PSBBVURJT19PVVRQVVRfQ0xPU0VEID8gIm91dHB1dCIgOiAiaW5wdXQiLCBpb0Rlc2MtPm1Jb0hhbmRsZSk7CiAKICAgICAgICAgICAgIG1Jb0Rlc2NyaXB0b3JzLnJlbW92ZUl0ZW0oaW9EZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICAgICAgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLnJlbW92ZUl0ZW0oaW9EZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmVyYXNlKGlvRGVzYy0+bUlvSGFuZGxlKTsKICAgICAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfQ09ORklHX0NIQU5HRUQ6CkBAIC01ODQsOSArNTg2LDkgQEAKIAogICAgICAgICAgICAgaWYgKGRldmljZUlkICE9IGlvRGVzYy0+Z2V0RGV2aWNlSWQoKSkgewogICAgICAgICAgICAgICAgIGRldmljZUlkID0gaW9EZXNjLT5nZXREZXZpY2VJZCgpOwotICAgICAgICAgICAgICAgIHNzaXplX3QgaW9JbmRleCA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5pbmRleE9mS2V5KGlvRGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgICAgICBpZiAoaW9JbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcyA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy52YWx1ZUF0KGlvSW5kZXgpOworICAgICAgICAgICAgICAgIGF1dG8gaXQgPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MuZmluZChpb0Rlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgaWYgKGl0ICE9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MgPSBpdC0+c2Vjb25kOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBuZXcgY29uZmlnIGZvciAlcyAlZCBzYW1wbGluZ1JhdGUgJXUsIGZvcm1hdCAlI3ggIgpAQCAtNTk3LDI1ICs1OTksNDAgQEAKICAgICAgICAgICAgICAgICAgICAgaW9EZXNjLT5nZXREZXZpY2VJZCgpKTsKIAogICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0NMSUVOVF9TVEFSVEVEOiB7CisgICAgICAgICAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gb2xkRGVzYyA9IGdldElvRGVzY3JpcHRvcl9sKGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChvbGREZXNjID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiaW9Db25maWdDaGFuZ2VkKCkgc3RhcnQgY2xpZW50IG9uIHVua25vd24gaW8hICVkIiwgaW9EZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoImlvQ29uZmlnQ2hhbmdlZCgpIEFVRElPX0NMSUVOVF9TVEFSVEVEICBpbyAlZCBwb3J0ICVkIG51bSBjYWxsYmFja3MgJXp1IiwKKyAgICAgICAgICAgICAgICBpb0Rlc2MtPm1Jb0hhbmRsZSwgaW9EZXNjLT5tUG9ydElkLCBtQXVkaW9EZXZpY2VDYWxsYmFja3Muc2l6ZSgpKTsKKyAgICAgICAgICAgIG9sZERlc2MtPm1QYXRjaCA9IGlvRGVzYy0+bVBhdGNoOworICAgICAgICAgICAgYXV0byBpdCA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5maW5kKGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChpdCAhPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGNia3MgPSBpdC0+c2Vjb25kOworICAgICAgICAgICAgICAgIGF1dG8gaXQyID0gY2Jrcy5maW5kKGlvRGVzYy0+bVBvcnRJZCk7CisgICAgICAgICAgICAgICAgaWYgKGl0MiAhPSBjYmtzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLmVtcGxhY2UoaW9EZXNjLT5tUG9ydElkLCBpdDItPnNlY29uZCk7CisgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQgPSBvbGREZXNjLT5nZXREZXZpY2VJZCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoYXV0byB3cENiayA6IGNhbGxiYWNrcykgeworICAgICAgICAgICAgc3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gc3BDYmsgPSB3cENiay5zZWNvbmQucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKHNwQ2JrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBjYWxsYmFja3NUb0NhbGwucHVzaF9iYWNrKHNwQ2JrKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICBib29sIGNhbGxiYWNrUmVtb3ZlZCA9IGZhbHNlOwotICAgIC8vIGNhbGxiYWNrcy5zaXplKCkgIT0gMCA9PiAgaW9EZXNjLT5tSW9IYW5kbGUgYW5kIGRldmljZUlkIGFyZSB2YWxpZAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2FsbGJhY2tzLnNpemUoKTsgKSB7Ci0gICAgICAgIHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gY2FsbGJhY2tzW2ldLnByb21vdGUoKTsKLSAgICAgICAgaWYgKGNhbGxiYWNrLmdldCgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGNhbGxiYWNrLT5vbkF1ZGlvRGV2aWNlVXBkYXRlKGlvRGVzYy0+bUlvSGFuZGxlLCBkZXZpY2VJZCk7Ci0gICAgICAgICAgICBpKys7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjYWxsYmFja3MucmVtb3ZlQXQoaSk7Ci0gICAgICAgICAgICBjYWxsYmFja1JlbW92ZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIC8vIGNsZWFuIHVwIGNhbGxiYWNrIGxpc3Qgd2hpbGUgd2UgYXJlIGhlcmUgaWYgc29tZSBjbGllbnRzIGhhdmUgZGlzYXBwZWFyZWQgd2l0aG91dAotICAgIC8vIHVucmVnaXN0ZXJpbmcgdGhlaXIgY2FsbGJhY2sKLSAgICBpZiAoY2FsbGJhY2tSZW1vdmVkKSB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrcy5yZXBsYWNlVmFsdWVGb3IoaW9EZXNjLT5tSW9IYW5kbGUsIGNhbGxiYWNrcyk7CisKKyAgICAvLyBDYWxsYmFja3MgbXVzdCBiZSBjYWxsZWQgd2l0aG91dCBtTG9jayBoZWxkLiBNYXkgbGVhZCB0byBkZWFkIGxvY2sgaWYgY2FsbGluZyBmb3IKKyAgICAvLyBleGFtcGxlIGdldFJvdXRlZERldmljZSB0aGF0IHVwZGF0ZXMgdGhlIGRldmljZSBhbmQgdHJpZXMgdG8gYWNxdWlyZSBtTG9jay4KKyAgICBmb3IgKGF1dG8gY2IgIDogY2FsbGJhY2tzVG9DYWxsKSB7CisgICAgICAgIC8vIElmIGNhbGxiYWNrc1RvQ2FsbCBpcyBub3QgZW1wdHksIGl0IGltcGxpZXMgaW9EZXNjLT5tSW9IYW5kbGUgYW5kIGRldmljZUlkIGFyZSB2YWxpZAorICAgICAgICBjYi0+b25BdWRpb0RldmljZVVwZGF0ZShpb0Rlc2MtPm1Jb0hhbmRsZSwgZGV2aWNlSWQpOwogICAgIH0KIH0KIApAQCAtNjY4LDUwICs2ODUsMzQgQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OkF1ZGlvRmxpbmdlckNsaWVudDo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjaygKLSAgICAgICAgY29uc3Qgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLCBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKQorICAgICAgICBjb25zdCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8sCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogeworICAgIEFMT0dWKCIlcyBhdWRpb0lvICVkIHBvcnRJZCAlZCIsIF9fZnVuY19fLCBhdWRpb0lvLCBwb3J0SWQpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgVmVjdG9yIDwgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gPiBjYWxsYmFja3M7Ci0gICAgc3NpemVfdCBpb0luZGV4ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmluZGV4T2ZLZXkoYXVkaW9Jbyk7Ci0gICAgaWYgKGlvSW5kZXggPj0gMCkgewotICAgICAgICBjYWxsYmFja3MgPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MudmFsdWVBdChpb0luZGV4KTsKKyAgICBhdXRvJiBjYWxsYmFja3MgPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MuZW1wbGFjZShhdWRpb0lvLCBzdGQ6Om1hcDxhdWRpb19wb3J0X2hhbmRsZV90LCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPj4oKSkuZmlyc3QtPnNlY29uZDsKKyAgICBhdXRvIHJlc3VsdCA9IGNhbGxiYWNrcy50cnlfZW1wbGFjZShwb3J0SWQsIGNhbGxiYWNrKTsKKyAgICBpZiAoIXJlc3VsdC5zZWNvbmQpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGNiSW5kZXggPSAwOyBjYkluZGV4IDwgY2FsbGJhY2tzLnNpemUoKTsgY2JJbmRleCsrKSB7Ci0gICAgICAgIGlmIChjYWxsYmFja3NbY2JJbmRleF0udW5zYWZlX2dldCgpID09IGNhbGxiYWNrLnVuc2FmZV9nZXQoKSkgewotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgfQotICAgIGNhbGxiYWNrcy5hZGQoY2FsbGJhY2spOwotCi0gICAgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLnJlcGxhY2VWYWx1ZUZvcihhdWRpb0lvLCBjYWxsYmFja3MpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OkF1ZGlvRmxpbmdlckNsaWVudDo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjaygKLSAgICAgICAgY29uc3Qgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLCBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKQorICAgICAgICBjb25zdCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2sgX191bnVzZWQsIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8sCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogeworICAgIEFMT0dWKCIlcyBhdWRpb0lvICVkIHBvcnRJZCAlZCIsIF9fZnVuY19fLCBhdWRpb0lvLCBwb3J0SWQpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgc3NpemVfdCBpb0luZGV4ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmluZGV4T2ZLZXkoYXVkaW9Jbyk7Ci0gICAgaWYgKGlvSW5kZXggPCAwKSB7CisgICAgYXV0byBpdCA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5maW5kKGF1ZGlvSW8pOworICAgIGlmIChpdCA9PSBtQXVkaW9EZXZpY2VDYWxsYmFja3MuZW5kKCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBWZWN0b3IgPCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiA+IGNhbGxiYWNrcyA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy52YWx1ZUF0KGlvSW5kZXgpOwotCi0gICAgc2l6ZV90IGNiSW5kZXg7Ci0gICAgZm9yIChjYkluZGV4ID0gMDsgY2JJbmRleCA8IGNhbGxiYWNrcy5zaXplKCk7IGNiSW5kZXgrKykgewotICAgICAgICBpZiAoY2FsbGJhY2tzW2NiSW5kZXhdLnVuc2FmZV9nZXQoKSA9PSBjYWxsYmFjay51bnNhZmVfZ2V0KCkpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChjYkluZGV4ID09IGNhbGxiYWNrcy5zaXplKCkpIHsKKyAgICBpZiAoaXQtPnNlY29uZC5lcmFzZShwb3J0SWQpID09IDApIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBjYWxsYmFja3MucmVtb3ZlQXQoY2JJbmRleCk7Ci0gICAgaWYgKGNhbGxiYWNrcy5zaXplKCkgIT0gMCkgewotICAgICAgICBtQXVkaW9EZXZpY2VDYWxsYmFja3MucmVwbGFjZVZhbHVlRm9yKGF1ZGlvSW8sIGNhbGxiYWNrcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLnJlbW92ZUl0ZW0oYXVkaW9Jbyk7CisgICAgaWYgKGl0LT5zZWNvbmQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmVyYXNlKGF1ZGlvSW8pOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC03NzMsNiArNzc0LDcgQEAKICAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAgICAgICAgIGFwLT5yZWdpc3RlckNsaWVudChhcGMpOwogICAgICAgICBhcC0+c2V0QXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZChhcGMtPmlzQXVkaW9Qb3J0Q2JFbmFibGVkKCkpOworICAgICAgICBhcC0+c2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoYXBjLT5pc0F1ZGlvVm9sdW1lR3JvdXBDYkVuYWJsZWQoKSk7CiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwogICAgIH0KIApAQCAtNzg0LDcgKzc4Niw4IEBACiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MgPSAiIjsKQEAgLTc5OCw3ICs4MDEsNyBAQAogICAgIGlmIChkZXZpY2VfbmFtZSAhPSBOVUxMKSB7CiAgICAgICAgIG5hbWUgPSBkZXZpY2VfbmFtZTsKICAgICB9Ci0gICAgcmV0dXJuIGFwcy0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsIGFkZHJlc3MsIG5hbWUpOworICAgIHJldHVybiBhcHMtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlLCBhZGRyZXNzLCBuYW1lLCBlbmNvZGVkRm9ybWF0KTsKIH0KIAogYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IEF1ZGlvU3lzdGVtOjpnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKQEAgLTgxMiw3ICs4MTUsOCBAQAogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6aGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBjb25zdCBjaGFyICphZGRyZXNzID0gIiI7CkBAIC04MjYsNyArODMwLDcgQEAKICAgICBpZiAoZGV2aWNlX25hbWUgIT0gTlVMTCkgewogICAgICAgICBuYW1lID0gZGV2aWNlX25hbWU7CiAgICAgfQotICAgIHJldHVybiBhcHMtPmhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShkZXZpY2UsIGFkZHJlc3MsIG5hbWUpOworICAgIHJldHVybiBhcHMtPmhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShkZXZpY2UsIGFkZHJlc3MsIG5hbWUsIGVuY29kZWRGb3JtYXQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpCkBAIC04NjAsNyArODY0LDcgQEAKICAgICByZXR1cm4gYXBzLT5nZXRPdXRwdXQoc3RyZWFtKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckF0dHIoYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLApAQCAtODY5LDQ0ICs4NzMsNDAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gKnNlY29uZGFyeU91dHB1dHMpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBOT19JTklUOwogICAgIHJldHVybiBhcHMtPmdldE91dHB1dEZvckF0dHIoYXR0ciwgb3V0cHV0LCBzZXNzaW9uLCBzdHJlYW0sIHBpZCwgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwgcG9ydElkLCBzZWNvbmRhcnlPdXRwdXRzKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzdGFydE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnN0YXJ0T3V0cHV0KG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICByZXR1cm4gYXBzLT5zdGFydE91dHB1dChwb3J0SWQpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5zdG9wT3V0cHV0KG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICByZXR1cm4gYXBzLT5zdG9wT3V0cHV0KHBvcnRJZCk7CiB9CiAKLXZvaWQgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit2b2lkIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm47Ci0gICAgYXBzLT5yZWxlYXNlT3V0cHV0KG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICBhcHMtPnJlbGVhc2VPdXRwdXQocG9ydElkKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgcmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLApAQCAtOTE5LDE1ICs5MTksMTUgQEAKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcmV0dXJuIGFwcy0+Z2V0SW5wdXRGb3JBdHRyKAotICAgICAgICAgICAgYXR0ciwgaW5wdXQsIHNlc3Npb24sIHBpZCwgdWlkLCBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgYXR0ciwgaW5wdXQsIHJpaWQsIHNlc3Npb24sIHBpZCwgdWlkLCBvcFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgY29uZmlnLCBmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwgcG9ydElkKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsIGJvb2wgKnNpbGVuY2VkKQorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5zdGFydElucHV0KHBvcnRJZCwgc2lsZW5jZWQpOworICAgIHJldHVybiBhcHMtPnN0YXJ0SW5wdXQocG9ydElkKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKQEAgLTk3MSwxMCArOTcxLDQyIEBACiAgICAgcmV0dXJuIGFwcy0+Z2V0U3RyZWFtVm9sdW1lSW5kZXgoc3RyZWFtLCBpbmRleCwgZGV2aWNlKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPnNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyLCBpbmRleCwgZGV2aWNlKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5nZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0ciwgaW5kZXgsIGRldmljZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBpbnQgJmluZGV4KQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFwcy0+Z2V0TWF4Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHIsIGluZGV4KTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGludCAmaW5kZXgpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5nZXRNaW5Wb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0ciwgaW5kZXgpOworfQorCiB1aW50MzJfdCBBdWRpb1N5c3RlbTo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKLSAgICBpZiAoYXBzID09IDApIHJldHVybiAwOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBST0RVQ1RfU1RSQVRFR1lfTk9ORTsKICAgICByZXR1cm4gYXBzLT5nZXRTdHJhdGVneUZvclN0cmVhbShzdHJlYW0pOwogfQogCkBAIC0xMDE4LDYgKzEwNTAsMTMgQEAKICAgICByZXR1cm4gYXBzLT5zZXRFZmZlY3RFbmFibGVkKGlkLCBlbmFibGVkKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9TeXN0ZW06Om1vdmVFZmZlY3RzVG9Jbyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBpZHMsIGF1ZGlvX2lvX2hhbmRsZV90IGlvKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFwcy0+bW92ZUVmZmVjdHNUb0lvKGlkcywgaW8pOworfQorCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wqIHN0YXRlLCB1aW50MzJfdCBpblBhc3RNcykKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwpAQCAtMTA4NCw2ICsxMTIzLDEyIEBACiAgICAgfQogfQogCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0QWxsb3dlZENhcHR1cmVQb2xpY3kodWlkX3QgdWlkLCBhdWRpb19mbGFnc19tYXNrX3QgZmxhZ3MpIHsKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gbnVsbHB0cikgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPnNldEFsbG93ZWRDYXB0dXJlUG9saWN5KHVpZCwgZmxhZ3MpOworfQorCiBib29sIEF1ZGlvU3lzdGVtOjppc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIGluZm8pCiB7CiAgICAgQUxPR1YoImlzT2ZmbG9hZFN1cHBvcnRlZCgpIik7CkBAIC0xMTc0LDE0ICsxMjE5LDQ3IEBACiAgICAgcmV0dXJuIChyZXQgPCAwKSA/IElOVkFMSURfT1BFUkFUSU9OIDogTk9fRVJST1I7CiB9CiAKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjphZGRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrPiYgY2FsbGJhY2spCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9ja0FQUyk7CisgICAgaWYgKGdBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaW50IHJldCA9IGdBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQtPmFkZEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjayhjYWxsYmFjayk7CisgICAgaWYgKHJldCA9PSAxKSB7CisgICAgICAgIGFwcy0+c2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQodHJ1ZSk7CisgICAgfQorICAgIHJldHVybiAocmV0IDwgMCkgPyBJTlZBTElEX09QRVJBVElPTiA6IE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjaz4mIGNhbGxiYWNrKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2tBUFMpOworICAgIGlmIChnQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGludCByZXQgPSBnQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LT5yZW1vdmVBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2soY2FsbGJhY2spOworICAgIGlmIChyZXQgPT0gMCkgeworICAgICAgICBhcHMtPnNldEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkKGZhbHNlKTsKKyAgICB9CisgICAgcmV0dXJuIChyZXQgPCAwKSA/IElOVkFMSURfT1BFUkFUSU9OIDogTk9fRVJST1I7Cit9CisKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKAotICAgICAgICBjb25zdCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pCisgICAgICAgIGNvbnN0IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbywKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyQ2xpZW50PiBhZmMgPSBnZXRBdWRpb0ZsaW5nZXJDbGllbnQoKTsKICAgICBpZiAoYWZjID09IDApIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHN0YXR1c190IHN0YXR1cyA9IGFmYy0+YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhjYWxsYmFjaywgYXVkaW9Jbyk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gYWZjLT5hZGRBdWRpb0RldmljZUNhbGxiYWNrKGNhbGxiYWNrLCBhdWRpb0lvLCBwb3J0SWQpOwogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgICAgIGlmIChhZiAhPSAwKSB7CkBAIC0xMTkyLDEzICsxMjcwLDE0IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKAotICAgICAgICBjb25zdCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pCisgICAgICAgIGNvbnN0IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbywKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyQ2xpZW50PiBhZmMgPSBnZXRBdWRpb0ZsaW5nZXJDbGllbnQoKTsKICAgICBpZiAoYWZjID09IDApIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHJldHVybiBhZmMtPnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soY2FsbGJhY2ssIGF1ZGlvSW8pOworICAgIHJldHVybiBhZmMtPnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soY2FsbGJhY2ssIGF1ZGlvSW8sIHBvcnRJZCk7CiB9CiAKIGF1ZGlvX3BvcnRfaGFuZGxlX3QgQXVkaW9TeXN0ZW06OmdldERldmljZUlkRm9ySW8oYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbykKQEAgLTEyNDIsMjAgKzEzMjEsMzMgQEAKICAgICByZXR1cm4gYXBzLT5yZWdpc3RlclBvbGljeU1peGVzKG1peGVzLCByZWdpc3RyYXRpb24pOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnN0YXJ0QXVkaW9Tb3VyY2Uoc291cmNlLCBhdHRyaWJ1dGVzLCBoYW5kbGUpOworICAgIHJldHVybiBhcHMtPnNldFVpZERldmljZUFmZmluaXRpZXModWlkLCBkZXZpY2VzKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0b3BBdWRpb1NvdXJjZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6cmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpIHsKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPnJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICByZXR1cm4gYXBzLT5zdG9wQXVkaW9Tb3VyY2UoaGFuZGxlKTsKKyAgICByZXR1cm4gYXBzLT5zdGFydEF1ZGlvU291cmNlKHNvdXJjZSwgYXR0cmlidXRlcywgcG9ydElkKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0b3BBdWRpb1NvdXJjZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPnN0b3BBdWRpb1NvdXJjZShwb3J0SWQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0TWFzdGVyTW9ubyhib29sIG1vbm8pCkBAIC0xMjcyLDYgKzEzNjQsMjAgQEAKICAgICByZXR1cm4gYXBzLT5nZXRNYXN0ZXJNb25vKG1vbm8pOwogfQogCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKQoreworICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFmLT5zZXRNYXN0ZXJCYWxhbmNlKGJhbGFuY2UpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0TWFzdGVyQmFsYW5jZShmbG9hdCAqYmFsYW5jZSkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhZi0+Z2V0TWFzdGVyQmFsYW5jZShiYWxhbmNlKTsKK30KKwogZmxvYXQgQXVkaW9TeXN0ZW06OmdldFN0cmVhbVZvbHVtZURCKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXgsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKQEAgLTEzMDQsNiArMTQxMCwxMDggQEAKICAgICByZXR1cm4gYXBzLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9Gb3JtYXQsIGVuYWJsZWQpOwogfQogCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0QXNzaXN0YW50VWlkKHVpZF90IHVpZCkKK3sKKyAgICBjb25zdCBzcCA8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKworICAgIHJldHVybiBhcHMtPnNldEFzc2lzdGFudFVpZCh1aWQpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0QTExeVNlcnZpY2VzVWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpCit7CisgICAgY29uc3Qgc3AgPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisKKyAgICByZXR1cm4gYXBzLT5zZXRBMTF5U2VydmljZXNVaWRzKHVpZHMpOworfQorCitib29sIEF1ZGlvU3lzdGVtOjppc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBhcHMtPmlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cykgeworICAgIGNvbnN0IHNwIDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPgorICAgICAgICAmIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5nZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKGZvcm1hdHMpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6bGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgJnN0cmF0ZWdpZXMpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5saXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhzdHJhdGVnaWVzKTsKK30KKworYXVkaW9fYXR0cmlidXRlc190IEF1ZGlvU3lzdGVtOjpzdHJlYW1UeXBlVG9BdHRyaWJ1dGVzKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yIHN0cmF0ZWdpZXM7CisgICAgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoc3RyYXRlZ2llcyk7CisgICAgZm9yIChjb25zdCBhdXRvICZzdHJhdGVneSA6IHN0cmF0ZWdpZXMpIHsKKyAgICAgICAgYXV0byBhdHRyVmVjdCA9IHN0cmF0ZWd5LmdldEF1ZGlvQXR0cmlidXRlcygpOworICAgICAgICBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmRfaWYoYmVnaW4oYXR0clZlY3QpLCBlbmQoYXR0clZlY3QpLCBbJnN0cmVhbV0oY29uc3QgYXV0byAmYXR0cmlidXRlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzLmdldFN0cmVhbVR5cGUoKSA9PSBzdHJlYW07IH0pOworICAgICAgICBpZiAoaXRlciAhPSBlbmQoYXR0clZlY3QpKSB7CisgICAgICAgICAgICByZXR1cm4gaXRlci0+Z2V0QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dFKCJpbnZhbGlkIHN0cmVhbSB0eXBlICVzIHdoZW4gY29udmVydGluZyB0byBhdHRyaWJ1dGVzIiwgIHRvU3RyaW5nKHN0cmVhbSkuY19zdHIoKSk7CisgICAgcmV0dXJuIEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVI7Cit9CisKK2F1ZGlvX3N0cmVhbV90eXBlX3QgQXVkaW9TeXN0ZW06OmF0dHJpYnV0ZXNUb1N0cmVhbVR5cGUoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKQoreworICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBwc0lkOworICAgIHN0YXR1c190IHJldCA9IEF1ZGlvU3lzdGVtOjpnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKEF1ZGlvQXR0cmlidXRlcyhhdHRyKSwgcHNJZCk7CisgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgibm8gc3RyYXRlZ3kgZm91bmQgZm9yIGF0dHJpYnV0ZXMgJXMiLCAgdG9TdHJpbmcoYXR0cikuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7CisgICAgfQorICAgIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yIHN0cmF0ZWdpZXM7CisgICAgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoc3RyYXRlZ2llcyk7CisgICAgZm9yIChjb25zdCBhdXRvICZzdHJhdGVneSA6IHN0cmF0ZWdpZXMpIHsKKyAgICAgICAgaWYgKHN0cmF0ZWd5LmdldElkKCkgPT0gcHNJZCkgeworICAgICAgICAgICAgYXV0byBhdHRyVmVjdCA9IHN0cmF0ZWd5LmdldEF1ZGlvQXR0cmlidXRlcygpOworICAgICAgICAgICAgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKGJlZ2luKGF0dHJWZWN0KSwgZW5kKGF0dHJWZWN0KSwgWyZhdHRyXShjb25zdCBhdXRvICZyZWZBdHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBdWRpb1Byb2R1Y3RTdHJhdGVneTo6YXR0cmlidXRlc01hdGNoZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZBdHRyLmdldEF0dHJpYnV0ZXMoKSwgYXR0cik7IH0pOworICAgICAgICAgICAgaWYgKGl0ZXIgIT0gZW5kKGF0dHJWZWN0KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpdGVyLT5nZXRTdHJlYW1UeXBlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR0UoImludmFsaWQgYXR0cmlidXRlcyAlcyB3aGVuIGNvbnZlcnRpbmcgdG8gc3RyZWFtIiwgIHRvU3RyaW5nKGF0dHIpLmNfc3RyKCkpOworICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgJnByb2R1Y3RTdHJhdGVneSkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPmdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoYWEscHJvZHVjdFN0cmF0ZWd5KTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06Omxpc3RBdWRpb1ZvbHVtZUdyb3VwcyhBdWRpb1ZvbHVtZUdyb3VwVmVjdG9yICZncm91cHMpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5saXN0QXVkaW9Wb2x1bWVHcm91cHMoZ3JvdXBzKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVfZ3JvdXBfdCAmdm9sdW1lR3JvdXApCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5nZXRWb2x1bWVHcm91cEZyb21BdWRpb0F0dHJpYnV0ZXMoYWEsIHZvbHVtZUdyb3VwKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGludCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjphZGRBdWRpb1BvcnRDYWxsYmFjaygKQEAgLTEzNTMsNiArMTU2MSw0NyBAQAogICAgIH0KIH0KIAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50IEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OmFkZEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjaygKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrPiYgY2FsbGJhY2spCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2suc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tbaV0gPT0gY2FsbGJhY2spIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrLmFkZChjYWxsYmFjayk7CisgICAgcmV0dXJuIG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2suc2l6ZSgpOworfQorCitpbnQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6cmVtb3ZlQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrKAorICAgICAgICBjb25zdCBzcDxBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2s+JiBjYWxsYmFjaykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNpemVfdCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrW2ldID09IGNhbGxiYWNrKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaSA9PSBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrLnNpemUoKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2sucmVtb3ZlQXQoaSk7CisgICAgcmV0dXJuIG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2suc2l6ZSgpOworfQorCit2b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6Om9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tbaV0tPm9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQoZ3JvdXAsIGZsYWdzKTsKKyAgICB9Cit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIHZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoCiAgICAgICAgIFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpCiB7CkBAIC0xMzY5LDkgKzE2MTgsMTQgQEAKIH0KIAogdm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoCi0gICAgICAgIGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKSB7CiAgICAgcmVjb3JkX2NvbmZpZ19jYWxsYmFjayBjYiA9IE5VTEw7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woQXVkaW9TeXN0ZW06OmdMb2NrKTsKQEAgLTEzNzksNyArMTYzMyw4IEBACiAgICAgfQogCiAgICAgaWYgKGNiICE9IE5VTEwpIHsKLSAgICAgICAgY2IoZXZlbnQsIGNsaWVudEluZm8sIGNsaWVudENvbmZpZywgZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CisgICAgICAgIGNiKGV2ZW50LCBjbGllbnRJbmZvLCBjbGllbnRDb25maWcsIGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgIGRldmljZUNvbmZpZywgZWZmZWN0cywgcGF0Y2hIYW5kbGUsIHNvdXJjZSk7CiAgICAgfQogfQogCkBAIC0xMzkwLDYgKzE2NDUsOSBAQAogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb1BvcnRDYWxsYmFja3Muc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIG1BdWRpb1BvcnRDYWxsYmFja3NbaV0tPm9uU2VydmljZURpZWQoKTsKICAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2suc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tbaV0tPm9uU2VydmljZURpZWQoKTsKKyAgICAgICAgfQogICAgIH0KICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9ja0FQUyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCmluZGV4IGFiOWVmZTguLjRhODBjZDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2suY3BwCkBAIC0yMiwxNiArMjIsMTkgQEAKICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8c3lzL3Jlc291cmNlLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oPgorI2luY2x1ZGUgPHByb2Nlc3Nncm91cC9zY2hlZF9wb2xpY3kuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9GbGluZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgogCkBAIC02Myw3ICs2Niw3IEBACiAKIHN0YXRpYyBpbnQ2NF90IGNvbnZlcnRUaW1lc3BlY1RvVXMoY29uc3Qgc3RydWN0IHRpbWVzcGVjICZ0dikKIHsKLSAgICByZXR1cm4gdHYudHZfc2VjICogMTAwMDAwMGxsICsgdHYudHZfbnNlYyAvIDEwMDA7CisgICAgcmV0dXJuIHR2LnR2X3NlYyAqIDEwMDAwMDBMTCArIHR2LnR2X25zZWMgLyAxMDAwOwogfQogCiAvLyBUT0RPIG1vdmUgdG8gYXVkaW9fdXRpbHMuCkBAIC0xMTksMjIgKzEyMiwyMiBAQAogICAgIHN0YXR1c190IHN0YXR1czsKICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0U2FtcGxpbmdSYXRlKCZhZlNhbXBsZVJhdGUsIHN0cmVhbVR5cGUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBxdWVyeSBvdXRwdXQgc2FtcGxlIHJhdGUgZm9yIHN0cmVhbSB0eXBlICVkOyBzdGF0dXMgJWQiLAotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsIHN0YXR1cyk7CisgICAgICAgIEFMT0dFKCIlcygpOiBVbmFibGUgdG8gcXVlcnkgb3V0cHV0IHNhbXBsZSByYXRlIGZvciBzdHJlYW0gdHlwZSAlZDsgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RyZWFtVHlwZSwgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgc2l6ZV90IGFmRnJhbWVDb3VudDsKICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0RnJhbWVDb3VudCgmYWZGcmFtZUNvdW50LCBzdHJlYW1UeXBlKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gcXVlcnkgb3V0cHV0IGZyYW1lIGNvdW50IGZvciBzdHJlYW0gdHlwZSAlZDsgc3RhdHVzICVkIiwKLSAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLCBzdGF0dXMpOworICAgICAgICBBTE9HRSgiJXMoKTogVW5hYmxlIHRvIHF1ZXJ5IG91dHB1dCBmcmFtZSBjb3VudCBmb3Igc3RyZWFtIHR5cGUgJWQ7IHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIHN0cmVhbVR5cGUsIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogICAgIHVpbnQzMl90IGFmTGF0ZW5jeTsKICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0TGF0ZW5jeSgmYWZMYXRlbmN5LCBzdHJlYW1UeXBlKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gcXVlcnkgb3V0cHV0IGxhdGVuY3kgZm9yIHN0cmVhbSB0eXBlICVkOyBzdGF0dXMgJWQiLAotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsIHN0YXR1cyk7CisgICAgICAgIEFMT0dFKCIlcygpOiBVbmFibGUgdG8gcXVlcnkgb3V0cHV0IGxhdGVuY3kgZm9yIHN0cmVhbSB0eXBlICVkOyBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzdHJlYW1UeXBlLCBzdGF0dXMpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIApAQCAtMTQ3LDg1ICsxNTAsNTIgQEAKICAgICAvLyBBdWRpb1RyYWNrLlNBTVBMRV9SQVRFX0haX01JTiA8PSBzYW1wbGVSYXRlIDw9IEF1ZGlvVHJhY2suU0FNUExFX1JBVEVfSFpfTUFYLgogICAgIC8vIFJldHVybiBlcnJvciBpbiB0aGUgdW5saWtlbHkgZXZlbnQgdGhhdCBpdCBkb2VzIG5vdCwgYXMgdGhhdCdzIHBhcnQgb2YgdGhlIEFQSSBjb250cmFjdC4KICAgICBpZiAoKmZyYW1lQ291bnQgPT0gMCkgewotICAgICAgICBBTE9HRSgiQXVkaW9UcmFjazo6Z2V0TWluRnJhbWVDb3VudCBmYWlsZWQgZm9yIHN0cmVhbVR5cGUgJWQsIHNhbXBsZVJhdGUgJXUiLAotICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUpOworICAgICAgICBBTE9HRSgiJXMoKTogZmFpbGVkIGZvciBzdHJlYW1UeXBlICVkLCBzYW1wbGVSYXRlICV1IiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIEFMT0dWKCJnZXRNaW5GcmFtZUNvdW50PSV6dTogYWZGcmFtZUNvdW50PSV6dSwgYWZTYW1wbGVSYXRlPSV1LCBhZkxhdGVuY3k9JXUiLAotICAgICAgICAgICAgKmZyYW1lQ291bnQsIGFmRnJhbWVDb3VudCwgYWZTYW1wbGVSYXRlLCBhZkxhdGVuY3kpOworICAgIEFMT0dWKCIlcygpOiBnZXRNaW5GcmFtZUNvdW50PSV6dTogYWZGcmFtZUNvdW50PSV6dSwgYWZTYW1wbGVSYXRlPSV1LCBhZkxhdGVuY3k9JXUiLAorICAgICAgICAgICAgX19mdW5jX18sICpmcmFtZUNvdW50LCBhZkZyYW1lQ291bnQsIGFmU2FtcGxlUmF0ZSwgYWZMYXRlbmN5KTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKKy8vIHN0YXRpYworYm9vbCBBdWRpb1RyYWNrOjppc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcykgeworICAgIEFMT0dWKCIlcygpIiwgX19GVU5DVElPTl9fKTsKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBhcHMtPmlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbmZpZywgYXR0cmlidXRlcyk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1zdGF0aWMgc3RkOjpzdHJpbmcgYXVkaW9Db250ZW50VHlwZVN0cmluZyhhdWRpb19jb250ZW50X3R5cGVfdCB2YWx1ZSkgewotICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnRUeXBlOwotICAgIGlmIChBdWRpb0NvbnRlbnRUeXBlQ29udmVydGVyOjp0b1N0cmluZyh2YWx1ZSwgY29udGVudFR5cGUpKSB7Ci0gICAgICAgIHJldHVybiBjb250ZW50VHlwZTsKLSAgICB9Ci0gICAgY2hhciByYXdidWZmZXJbMTZdOyAgLy8gcm9vbSBmb3IgIiVkIgotICAgIHNucHJpbnRmKHJhd2J1ZmZlciwgc2l6ZW9mKHJhd2J1ZmZlciksICIlZCIsIHZhbHVlKTsKLSAgICByZXR1cm4gcmF3YnVmZmVyOwotfQotCi1zdGF0aWMgc3RkOjpzdHJpbmcgYXVkaW9Vc2FnZVN0cmluZyhhdWRpb191c2FnZV90IHZhbHVlKSB7Ci0gICAgc3RkOjpzdHJpbmcgdXNhZ2U7Ci0gICAgaWYgKFVzYWdlVHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcodmFsdWUsIHVzYWdlKSkgewotICAgICAgICByZXR1cm4gdXNhZ2U7Ci0gICAgfQotICAgIGNoYXIgcmF3YnVmZmVyWzE2XTsgIC8vIHJvb20gZm9yICIlZCIKLSAgICBzbnByaW50ZihyYXdidWZmZXIsIHNpemVvZihyYXdidWZmZXIpLCAiJWQiLCB2YWx1ZSk7Ci0gICAgcmV0dXJuIHJhd2J1ZmZlcjsKLX0KLQogdm9pZCBBdWRpb1RyYWNrOjpNZWRpYU1ldHJpY3M6OmdhdGhlcihjb25zdCBBdWRpb1RyYWNrICp0cmFjaykKIHsKLQotICAgIC8vIGtleSBmb3IgbWVkaWEgc3RhdGlzdGljcyBpcyBkZWZpbmVkIGluIHRoZSBoZWFkZXIKLSAgICAvLyBhdHRycyBmb3IgbWVkaWEgc3RhdGlzdGljcwotICAgIC8vIE5COiB0aGVzZSBhcmUgbWF0Y2hlZCB3aXRoIHB1YmxpYyBKYXZhIEFQSSBjb25zdGFudHMgZGVmaW5lZAotICAgIC8vIGluIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9UcmFjay5qYXZhCi0gICAgLy8gVGhlc2UgbXVzdCBiZSBrZXB0IHN5bmNocm9uaXplZCB3aXRoIHRoZSBjb25zdGFudHMgdGhlcmUuCi0gICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1RyYWNrU3RyZWFtVHlwZVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay5zdHJlYW10eXBlIjsKLSAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvVHJhY2tDb250ZW50VHlwZVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay50eXBlIjsKLSAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvVHJhY2tVc2FnZVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay51c2FnZSI7Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1RyYWNrU2FtcGxlUmF0ZVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay5zYW1wbGVyYXRlIjsKLSAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvVHJhY2tDaGFubmVsTWFza1tdID0gImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay5jaGFubmVsbWFzayI7Ci0KLSAgICAvLyBOQjogVGhlc2UgYXJlIG5vdCB5ZXQgZXhwb3NlZCBhcyBwdWJsaWMgSmF2YSBBUEkgY29uc3RhbnRzLgotICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9UcmFja1VuZGVycnVuRnJhbWVzW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLnVuZGVycnVuZnJhbWVzIjsKLSAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvVHJhY2tTdGFydHVwR2xpdGNoW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLmdsaXRjaC5zdGFydHVwIjsKLQogICAgIC8vIG9ubHkgaWYgd2UncmUgaW4gYSBnb29kIHN0YXRlLi4uCiAgICAgLy8gWFhYOiBzaGFsbCB3ZSBnYXRoZXIgYWx0ZXJuYXRpdmUgaW5mbyBpZiBmYWlsaW5nPwogICAgIGNvbnN0IHN0YXR1c190IGxzdGF0dXMgPSB0cmFjay0+aW5pdENoZWNrKCk7CiAgICAgaWYgKGxzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0QoIm5vIG1ldHJpY3MgZ2F0aGVyZWQsIHRyYWNrIHN0YXR1cz0lZCIsIChpbnQpIGxzdGF0dXMpOworICAgICAgICBBTE9HRCgiJXMoKTogbm8gbWV0cmljcyBnYXRoZXJlZCwgdHJhY2sgc3RhdHVzPSVkIiwgX19mdW5jX18sIChpbnQpIGxzdGF0dXMpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgLy8gY29uc3RydWN0b3IgZ3VhcmFudGVlcyBtQW5hbHl0aWNzSXRlbSBpcyB2YWxpZAorI2RlZmluZSBNTV9QUkVGSVggImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay4iIC8vIGF2b2lkIGN1dC1uLXBhc3RlIGVycm9ycy4KIAotICAgIGNvbnN0IGludDMyX3QgdW5kZXJydW5GcmFtZXMgPSB0cmFjay0+Z2V0VW5kZXJydW5GcmFtZXMoKTsKLSAgICBpZiAodW5kZXJydW5GcmFtZXMgIT0gMCkgewotICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0F1ZGlvVHJhY2tVbmRlcnJ1bkZyYW1lcywgdW5kZXJydW5GcmFtZXMpOwotICAgIH0KKyAgICAvLyBKYXZhIEFQSSAyOCBlbnRyaWVzLCBkbyBub3QgY2hhbmdlLgorICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKE1NX1BSRUZJWCAic3RyZWFtdHlwZSIsIHRvU3RyaW5nKHRyYWNrLT5zdHJlYW1UeXBlKCkpLmNfc3RyKCkpOworICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKE1NX1BSRUZJWCAidHlwZSIsCisgICAgICAgICAgICB0b1N0cmluZyh0cmFjay0+bUF0dHJpYnV0ZXMuY29udGVudF90eXBlKS5jX3N0cigpKTsKKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhNTV9QUkVGSVggInVzYWdlIiwgdG9TdHJpbmcodHJhY2stPm1BdHRyaWJ1dGVzLnVzYWdlKS5jX3N0cigpKTsKIAotICAgIGlmICh0cmFjay0+bVRpbWVzdGFtcFN0YXJ0dXBHbGl0Y2hSZXBvcnRlZCkgewotICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0F1ZGlvVHJhY2tTdGFydHVwR2xpdGNoLCAxKTsKLSAgICB9Ci0KLSAgICBpZiAodHJhY2stPm1TdHJlYW1UeXBlICE9IC0xKSB7Ci0gICAgICAgIC8vIGRlcHJlY2F0ZWQsIGJ1dCB0aGlzIHdpbGwgdGVsbCB1cyB3aG8gc3RpbGwgdXNlcyBpdC4KLSAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtBdWRpb1RyYWNrU3RyZWFtVHlwZSwgdHJhY2stPm1TdHJlYW1UeXBlKTsKLSAgICB9Ci0gICAgLy8gWFhYOiBjb25zaWRlciBpbmNsdWRpbmcgZnJvbSBtQXR0cmlidXRlczogc291cmNlIHR5cGUKLSAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9UcmFja0NvbnRlbnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvQ29udGVudFR5cGVTdHJpbmcodHJhY2stPm1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSkuY19zdHIoKSk7Ci0gICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa0F1ZGlvVHJhY2tVc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1VzYWdlU3RyaW5nKHRyYWNrLT5tQXR0cmlidXRlcy51c2FnZSkuY19zdHIoKSk7Ci0gICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtBdWRpb1RyYWNrU2FtcGxlUmF0ZSwgdHJhY2stPm1TYW1wbGVSYXRlKTsKLSAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa0F1ZGlvVHJhY2tDaGFubmVsTWFzaywgdHJhY2stPm1DaGFubmVsTWFzayk7CisgICAgLy8gTm9uLUFQSSBlbnRyaWVzLCB0aGVzZSBjYW4gY2hhbmdlIGR1ZSB0byBhIEphdmEgc3RyaW5nIG1pc3Rha2UuCisgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKE1NX1BSRUZJWCAic2FtcGxlUmF0ZSIsIChpbnQzMl90KXRyYWNrLT5tU2FtcGxlUmF0ZSk7CisgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KE1NX1BSRUZJWCAiY2hhbm5lbE1hc2siLCAoaW50NjRfdCl0cmFjay0+bUNoYW5uZWxNYXNrKTsKKyAgICAvLyBOb24tQVBJIGVudHJpZXMsIHRoZXNlIGNhbiBjaGFuZ2UuCisgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKE1NX1BSRUZJWCAicG9ydElkIiwgKGludDMyX3QpdHJhY2stPm1Qb3J0SWQpOworICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKE1NX1BSRUZJWCAiZW5jb2RpbmciLCB0b1N0cmluZyh0cmFjay0+bUZvcm1hdCkuY19zdHIoKSk7CisgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKE1NX1BSRUZJWCAiZnJhbWVDb3VudCIsIChpbnQzMl90KXRyYWNrLT5tRnJhbWVDb3VudCk7CisgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoTU1fUFJFRklYICJhdHRyaWJ1dGVzIiwgdG9TdHJpbmcodHJhY2stPm1BdHRyaWJ1dGVzKS5jX3N0cigpKTsKIH0KIAogLy8gaGFuZCB0aGUgdXNlciBhIHNuYXBzaG90IG9mIHRoZSBtZXRyaWNzLgpAQCAtMjgwLDYgKzI1MCw4IEBACiAgICAgICBtUHJldmlvdXNTY2hlZHVsaW5nR3JvdXAoU1BfREVGQVVMVCksCiAgICAgICBtUGF1c2VkUG9zaXRpb24oMCkKIHsKKyAgICBtQXR0cmlidXRlcyA9IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVI7CisKICAgICAodm9pZClzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIGZyYW1lQ291bnQsIGZsYWdzLCBjYmYsIHVzZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICAgIDAgLypzaGFyZWRCdWZmZXIqLywgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLCBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwKQEAgLTMxMSw2ICsyODMsOCBAQAogICAgICAgbVBhdXNlZFBvc2l0aW9uKDApLAogICAgICAgbVNlbGVjdGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkKIHsKKyAgICBtQXR0cmlidXRlcyA9IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVI7CisKICAgICAodm9pZClzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIDAgLypmcmFtZUNvdW50Ki8sIGZsYWdzLCBjYmYsIHVzZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICAgIHNoYXJlZEJ1ZmZlciwgZmFsc2UgLyp0aHJlYWRDYW5DYWxsSmF2YSovLCBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgb2ZmbG9hZEluZm8sCkBAIC0zMzUsMTQgKzMwOSwxNSBAQAogICAgICAgICB9CiAgICAgICAgIC8vIE5vIGxvY2sgaGVyZTogd29yc3QgY2FzZSB3ZSByZW1vdmUgYSBOVUxMIGNhbGxiYWNrIHdoaWNoIHdpbGwgYmUgYSBub3AKICAgICAgICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwICYmIG1PdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1PdXRwdXQpOworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbU91dHB1dCwgbVBvcnRJZCk7CiAgICAgICAgIH0KICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUF1ZGlvVHJhY2spLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCB0aGlzKTsKICAgICAgICAgbUF1ZGlvVHJhY2suY2xlYXIoKTsKICAgICAgICAgbUNibGtNZW1vcnkuY2xlYXIoKTsKICAgICAgICAgbVNoYXJlZEJ1ZmZlci5jbGVhcigpOwogICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgICAgIEFMT0dWKCJ+QXVkaW9UcmFjaywgcmVsZWFzaW5nIHNlc3Npb24gaWQgJWQgZnJvbSAlZCBvbiBiZWhhbGYgb2YgJWQiLAorICAgICAgICBBTE9HVigiJXMoJWQpLCByZWxlYXNpbmcgc2Vzc2lvbiBpZCAlZCBmcm9tICVkIG9uIGJlaGFsZiBvZiAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtU2Vzc2lvbklkLCBtQ2xpZW50UGlkKTsKICAgICB9CkBAIC0zNzUsOCArMzUwLDEwIEBACiAgICAgcGlkX3QgY2FsbGluZ1BpZDsKICAgICBwaWRfdCBteVBpZDsKIAotICAgIEFMT0dWKCJzZXQoKTogc3RyZWFtVHlwZSAlZCwgc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgJSN4LCBmcmFtZUNvdW50ICV6dSwgIgorICAgIC8vIE5vdGUgbVBvcnRJZCBpcyBub3QgdmFsaWQgdW50aWwgdGhlIHRyYWNrIGlzIGNyZWF0ZWQsIHNvIG9taXQgbVBvcnRJZCBpbiBBTE9HIGZvciBzZXQuCisgICAgQUxPR1YoIiVzKCk6IHN0cmVhbVR5cGUgJWQsIHNhbXBsZVJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWxNYXNrICUjeCwgZnJhbWVDb3VudCAlenUsICIKICAgICAgICAgICAiZmxhZ3MgIyV4LCBub3RpZmljYXRpb25GcmFtZXMgJWQsIHNlc3Npb25JZCAlZCwgdHJhbnNmZXJUeXBlICVkLCB1aWQgJWQsIHBpZCAlZCIsCisgICAgICAgICAgX19mdW5jX18sCiAgICAgICAgICAgc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgZmxhZ3MsIG5vdGlmaWNhdGlvbkZyYW1lcywKICAgICAgICAgICBzZXNzaW9uSWQsIHRyYW5zZmVyVHlwZSwgdWlkLCBwaWQpOwogCkBAIC0zOTUsOCArMzcyLDEwIEBACiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBUUkFOU0ZFUl9DQUxMQkFDSzoKKyAgICBjYXNlIFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0s6CiAgICAgICAgIGlmIChjYmYgPT0gTlVMTCB8fCBzaGFyZWRCdWZmZXIgIT0gMCkgewotICAgICAgICAgICAgQUxPR0UoIlRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfQ0FMTEJBQ0sgYnV0IGNiZiA9PSBOVUxMIHx8IHNoYXJlZEJ1ZmZlciAhPSAwIik7CisgICAgICAgICAgICBBTE9HRSgiJXMoKTogVHJhbnNmZXIgdHlwZSAlcyBidXQgY2JmID09IE5VTEwgfHwgc2hhcmVkQnVmZmVyICE9IDAiLAorICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VHJhbnNmZXJUb1RleHQodHJhbnNmZXJUeXBlKSwgX19mdW5jX18pOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CkBAIC00MDQsMjAgKzM4MywyMSBAQAogICAgIGNhc2UgVFJBTlNGRVJfT0JUQUlOOgogICAgIGNhc2UgVFJBTlNGRVJfU1lOQzoKICAgICAgICAgaWYgKHNoYXJlZEJ1ZmZlciAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVHJhbnNmZXIgdHlwZSBUUkFOU0ZFUl9PQlRBSU4gYnV0IHNoYXJlZEJ1ZmZlciAhPSAwIik7CisgICAgICAgICAgICBBTE9HRSgiJXMoKTogVHJhbnNmZXIgdHlwZSBUUkFOU0ZFUl9PQlRBSU4gYnV0IHNoYXJlZEJ1ZmZlciAhPSAwIiwgX19mdW5jX18pOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgVFJBTlNGRVJfU0hBUkVEOgogICAgICAgICBpZiAoc2hhcmVkQnVmZmVyID09IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJUcmFuc2ZlciB0eXBlIFRSQU5TRkVSX1NIQVJFRCBidXQgc2hhcmVkQnVmZmVyID09IDAiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpOiBUcmFuc2ZlciB0eXBlIFRSQU5TRkVSX1NIQVJFRCBidXQgc2hhcmVkQnVmZmVyID09IDAiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR0UoIkludmFsaWQgdHJhbnNmZXIgdHlwZSAlZCIsIHRyYW5zZmVyVHlwZSk7CisgICAgICAgIEFMT0dFKCIlcygpOiBJbnZhbGlkIHRyYW5zZmVyIHR5cGUgJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCB0cmFuc2ZlclR5cGUpOwogICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC00MjUsMTQgKzQwNSwxNSBAQAogICAgIG1UcmFuc2ZlciA9IHRyYW5zZmVyVHlwZTsKICAgICBtRG9Ob3RSZWNvbm5lY3QgPSBkb05vdFJlY29ubmVjdDsKIAotICAgIEFMT0dWX0lGKHNoYXJlZEJ1ZmZlciAhPSAwLCAic2hhcmVkQnVmZmVyOiAlcCwgc2l6ZTogJXp1Iiwgc2hhcmVkQnVmZmVyLT5wb2ludGVyKCksCi0gICAgICAgICAgICBzaGFyZWRCdWZmZXItPnNpemUoKSk7CisgICAgQUxPR1ZfSUYoc2hhcmVkQnVmZmVyICE9IDAsICIlcygpOiBzaGFyZWRCdWZmZXI6ICVwLCBzaXplOiAlenUiLAorICAgICAgICAgICAgX19mdW5jX18sIHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpLCBzaGFyZWRCdWZmZXItPnNpemUoKSk7CiAKLSAgICBBTE9HVigic2V0KCkgc3RyZWFtVHlwZSAlZCBmcmFtZUNvdW50ICV6dSBmbGFncyAlMDR4Iiwgc3RyZWFtVHlwZSwgZnJhbWVDb3VudCwgZmxhZ3MpOworICAgIEFMT0dWKCIlcygpOiBzdHJlYW1UeXBlICVkIGZyYW1lQ291bnQgJXp1IGZsYWdzICUwNHgiLAorICAgICAgICAgICAgX19mdW5jX18sIHN0cmVhbVR5cGUsIGZyYW1lQ291bnQsIGZsYWdzKTsKIAogICAgIC8vIGludmFyaWFudCB0aGF0IG1BdWRpb1RyYWNrICE9IDAgaXMgdHJ1ZSBvbmx5IGFmdGVyIHNldCgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5CiAgICAgaWYgKG1BdWRpb1RyYWNrICE9IDApIHsKLSAgICAgICAgQUxPR0UoIlRyYWNrIGFscmVhZHkgaW4gdXNlIik7CisgICAgICAgIEFMT0dFKCIlcygpOiBUcmFjayBhbHJlYWR5IGluIHVzZSIsIF9fZnVuY19fKTsKICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC00NDMsNyArNDI0LDcgQEAKICAgICB9CiAgICAgaWYgKHBBdHRyaWJ1dGVzID09IE5VTEwpIHsKICAgICAgICAgaWYgKHVpbnQzMl90KHN0cmVhbVR5cGUpID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7Ci0gICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBzdHJlYW0gdHlwZSAlZCIsIHN0cmVhbVR5cGUpOworICAgICAgICAgICAgQUxPR0UoIiVzKCk6IEludmFsaWQgc3RyZWFtIHR5cGUgJWQiLCBfX2Z1bmNfXywgc3RyZWFtVHlwZSk7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KQEAgLTQ1MiwxOSArNDMzLDEyIEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gc3RyZWFtIHR5cGUgc2hvdWxkbid0IGJlIGxvb2tlZCBhdCwgdGhpcyB0cmFjayBoYXMgYXVkaW8gYXR0cmlidXRlcwogICAgICAgICBtZW1jcHkoJm1BdHRyaWJ1dGVzLCBwQXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICBBTE9HVigiQnVpbGRpbmcgQXVkaW9UcmFjayB3aXRoIGF0dHJpYnV0ZXM6IHVzYWdlPSVkIGNvbnRlbnQ9JWQgZmxhZ3M9MHgleCB0YWdzPVslc10iLAotICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzLnVzYWdlLCBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUsIG1BdHRyaWJ1dGVzLmZsYWdzLCBtQXR0cmlidXRlcy50YWdzKTsKKyAgICAgICAgQUxPR1YoIiVzKCk6IEJ1aWxkaW5nIEF1ZGlvVHJhY2sgd2l0aCBhdHRyaWJ1dGVzOiIKKyAgICAgICAgICAgICAgICAiIHVzYWdlPSVkIGNvbnRlbnQ9JWQgZmxhZ3M9MHgleCB0YWdzPVslc10iLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICBtQXR0cmlidXRlcy51c2FnZSwgbUF0dHJpYnV0ZXMuY29udGVudF90eXBlLCBtQXR0cmlidXRlcy5mbGFncywgbUF0dHJpYnV0ZXMudGFncyk7CiAgICAgICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7Ci0gICAgICAgIGlmICgobUF0dHJpYnV0ZXMuZmxhZ3MgJiBBVURJT19GTEFHX0hXX0FWX1NZTkMpICE9IDApIHsKLSAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpOwotICAgICAgICB9Ci0gICAgICAgIGlmICgobUF0dHJpYnV0ZXMuZmxhZ3MgJiBBVURJT19GTEFHX0xPV19MQVRFTkNZKSAhPSAwKSB7Ci0gICAgICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gY2hlY2sgZGVlcCBidWZmZXIgYWZ0ZXIgZmxhZ3MgaGF2ZSBiZWVuIG1vZGlmaWVkIGFib3ZlCi0gICAgICAgIGlmIChmbGFncyA9PSBBVURJT19PVVRQVVRfRkxBR19OT05FICYmIChtQXR0cmlidXRlcy5mbGFncyAmIEFVRElPX0ZMQUdfREVFUF9CVUZGRVIpICE9IDApIHsKLSAgICAgICAgICAgIGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVI7Ci0gICAgICAgIH0KKyAgICAgICAgYXVkaW9fZmxhZ3NfdG9fYXVkaW9fb3V0cHV0X2ZsYWdzKG1BdHRyaWJ1dGVzLmZsYWdzLCAmZmxhZ3MpOwogICAgIH0KIAogICAgIC8vIHRoZXNlIGJlbG93IHNob3VsZCBwcm9iYWJseSBjb21lIGZyb20gdGhlIGF1ZGlvRmxpbmdlciB0b28uLi4KQEAgLTQ3NiwxNCArNDUwLDE0IEBACiAKICAgICAvLyB2YWxpZGF0ZSBwYXJhbWV0ZXJzCiAgICAgaWYgKCFhdWRpb19pc192YWxpZF9mb3JtYXQoZm9ybWF0KSkgewotICAgICAgICBBTE9HRSgiSW52YWxpZCBmb3JtYXQgJSN4IiwgZm9ybWF0KTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IEludmFsaWQgZm9ybWF0ICUjeCIsIF9fZnVuY19fLCBmb3JtYXQpOwogICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAgICAgbUZvcm1hdCA9IGZvcm1hdDsKIAogICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spKSB7Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIGNoYW5uZWwgbWFzayAlI3giLCBjaGFubmVsTWFzayk7CisgICAgICAgIEFMT0dFKCIlcygpOiBJbnZhbGlkIGNoYW5uZWwgbWFzayAlI3giLCAgX19mdW5jX18sIGNoYW5uZWxNYXNrKTsKICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtNDk2LDggKzQ3MCw5IEBACiAgICAgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpCiAgICAgICAgICAgICB8fCAhYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7CiAgICAgICAgIEFMT0dWKCAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKQotICAgICAgICAgICAgICAgICAgICA/ICJPZmZsb2FkIHJlcXVlc3QsIGZvcmNpbmcgdG8gRGlyZWN0IE91dHB1dCIKLSAgICAgICAgICAgICAgICAgICAgOiAiTm90IGxpbmVhciBQQ00sIGZvcmNpbmcgdG8gRGlyZWN0IE91dHB1dCIpOworICAgICAgICAgICAgICAgICAgICA/ICIlcygpOiBPZmZsb2FkIHJlcXVlc3QsIGZvcmNpbmcgdG8gRGlyZWN0IE91dHB1dCIKKyAgICAgICAgICAgICAgICAgICAgOiAiJXMoKTogTm90IGxpbmVhciBQQ00sIGZvcmNpbmcgdG8gRGlyZWN0IE91dHB1dCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fKTsKICAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpCiAgICAgICAgICAgICAgICAgLy8gRklYTUUgd2h5IGNhbid0IHdlIGFsbG93IGRpcmVjdCBBTkQgZmFzdD8KICAgICAgICAgICAgICAgICAoKGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAmIH5BVURJT19PVVRQVVRfRkxBR19GQVNUKTsKQEAgLTU1MywxNCArNTI4LDE0IEBACiAgICAgICAgIG1Ob3RpZmljYXRpb25zUGVyQnVmZmVyUmVxID0gMDsKICAgICB9IGVsc2UgewogICAgICAgICBpZiAoIShmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpKSB7Ci0gICAgICAgICAgICBBTE9HRSgibm90aWZpY2F0aW9uRnJhbWVzPSVkIG5vdCBwZXJtaXR0ZWQgZm9yIG5vbi1mYXN0IHRyYWNrIiwKLSAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpOiBub3RpZmljYXRpb25GcmFtZXM9JWQgbm90IHBlcm1pdHRlZCBmb3Igbm9uLWZhc3QgdHJhY2siLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbm90aWZpY2F0aW9uRnJhbWVzKTsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQogICAgICAgICBpZiAoZnJhbWVDb3VudCA+IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJub3RpZmljYXRpb25GcmFtZXM9JWQgbm90IHBlcm1pdHRlZCB3aXRoIG5vbi16ZXJvIGZyYW1lQ291bnQ9JXp1IiwKLSAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzLCBmcmFtZUNvdW50KTsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpOiBub3RpZmljYXRpb25GcmFtZXM9JWQgbm90IHBlcm1pdHRlZCB3aXRoIG5vbi16ZXJvIGZyYW1lQ291bnQ9JXp1IiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG5vdGlmaWNhdGlvbkZyYW1lcywgZnJhbWVDb3VudCk7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KQEAgLTU3MCw3ICs1NDUsOCBAQAogICAgICAgICBtTm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcSA9IG1pbihtYXhOb3RpZmljYXRpb25zUGVyQnVmZmVyLAogICAgICAgICAgICAgICAgIG1heCgodWludDMyX3QpIC1ub3RpZmljYXRpb25GcmFtZXMsIG1pbk5vdGlmaWNhdGlvbnNQZXJCdWZmZXIpKTsKICAgICAgICAgQUxPR1dfSUYobU5vdGlmaWNhdGlvbnNQZXJCdWZmZXJSZXEgIT0gKHVpbnQzMl90KSAtbm90aWZpY2F0aW9uRnJhbWVzLAotICAgICAgICAgICAgICAgICJub3RpZmljYXRpb25GcmFtZXM9JWQgY2xhbXBlZCB0byB0aGUgcmFuZ2UgLSV1IHRvIC0ldSIsCisgICAgICAgICAgICAgICAgIiVzKCk6IG5vdGlmaWNhdGlvbkZyYW1lcz0lZCBjbGFtcGVkIHRvIHRoZSByYW5nZSAtJXUgdG8gLSV1IiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywKICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsIG1pbk5vdGlmaWNhdGlvbnNQZXJCdWZmZXIsIG1heE5vdGlmaWNhdGlvbnNQZXJCdWZmZXIpOwogICAgIH0KICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0ID0gMDsKQEAgLTU5MSwxNCArNTY3LDE2IEBACiAgICAgbUNiZiA9IGNiZjsKIAogICAgIGlmIChjYmYgIT0gTlVMTCkgewotICAgICAgICBtQXVkaW9UcmFja1RocmVhZCA9IG5ldyBBdWRpb1RyYWNrVGhyZWFkKCp0aGlzLCB0aHJlYWRDYW5DYWxsSmF2YSk7CisgICAgICAgIG1BdWRpb1RyYWNrVGhyZWFkID0gbmV3IEF1ZGlvVHJhY2tUaHJlYWQoKnRoaXMpOwogICAgICAgICBtQXVkaW9UcmFja1RocmVhZC0+cnVuKCJBdWRpb1RyYWNrIiwgQU5EUk9JRF9QUklPUklUWV9BVURJTywgMCAvKnN0YWNrKi8pOwogICAgICAgICAvLyB0aHJlYWQgYmVnaW5zIGluIHBhdXNlZCBzdGF0ZSwgYW5kIHdpbGwgbm90IHJlZmVyZW5jZSB1cyB1bnRpbCBzdGFydCgpCiAgICAgfQogCiAgICAgLy8gY3JlYXRlIHRoZSBJQXVkaW9UcmFjawotICAgIHN0YXR1cyA9IGNyZWF0ZVRyYWNrX2woKTsKLQorICAgIHsKKyAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgICAgICBzdGF0dXMgPSBjcmVhdGVUcmFja19sKCk7CisgICAgfQogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgaWYgKG1BdWRpb1RyYWNrVGhyZWFkICE9IDApIHsKICAgICAgICAgICAgIG1BdWRpb1RyYWNrVGhyZWFkLT5yZXF1ZXN0RXhpdCgpOyAgIC8vIHNlZSBjb21tZW50IGluIEF1ZGlvVHJhY2suaApAQCAtNjI3LDcgKzYwNSwxMCBAQAogICAgIG1JblVuZGVycnVuID0gZmFsc2U7CiAgICAgbVByZXZpb3VzVGltZXN0YW1wVmFsaWQgPSBmYWxzZTsKICAgICBtVGltZXN0YW1wU3RhcnR1cEdsaXRjaFJlcG9ydGVkID0gZmFsc2U7Ci0gICAgbVJldHJvZ3JhZGVNb3Rpb25SZXBvcnRlZCA9IGZhbHNlOworICAgIG1UaW1lc3RhbXBSZXRyb2dyYWRlUG9zaXRpb25SZXBvcnRlZCA9IGZhbHNlOworICAgIG1UaW1lc3RhbXBSZXRyb2dyYWRlVGltZVJlcG9ydGVkID0gZmFsc2U7CisgICAgbVRpbWVzdGFtcFN0YWxsUmVwb3J0ZWQgPSBmYWxzZTsKKyAgICBtVGltZXN0YW1wU3RhbGVUaW1lUmVwb3J0ZWQgPSBmYWxzZTsKICAgICBtUHJldmlvdXNMb2NhdGlvbiA9IEV4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9JTlZBTElEOwogICAgIG1TdGFydFRzLm1Qb3NpdGlvbiA9IDA7CiAgICAgbVVuZGVycnVuQ291bnRPZmZzZXQgPSAwOwpAQCAtNjQ2LDYgKzYyNyw3IEBACiBzdGF0dXNfdCBBdWRpb1RyYWNrOjpzdGFydCgpCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIEFMT0dWKCIlcyglZCk6IHByaW9yIHN0YXRlOiVzIiwgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXRlVG9TdHJpbmcobVN0YXRlKSk7CiAKICAgICBpZiAobVN0YXRlID09IFNUQVRFX0FDVElWRSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC02NzcsNyArNjU5LDEwIEBACiAgICAgICAgIG1Qb3NpdGlvbiA9IDA7CiAgICAgICAgIG1QcmV2aW91c1RpbWVzdGFtcFZhbGlkID0gZmFsc2U7CiAgICAgICAgIG1UaW1lc3RhbXBTdGFydHVwR2xpdGNoUmVwb3J0ZWQgPSBmYWxzZTsKLSAgICAgICAgbVJldHJvZ3JhZGVNb3Rpb25SZXBvcnRlZCA9IGZhbHNlOworICAgICAgICBtVGltZXN0YW1wUmV0cm9ncmFkZVBvc2l0aW9uUmVwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgbVRpbWVzdGFtcFJldHJvZ3JhZGVUaW1lUmVwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgbVRpbWVzdGFtcFN0YWxsUmVwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgbVRpbWVzdGFtcFN0YWxlVGltZVJlcG9ydGVkID0gZmFsc2U7CiAgICAgICAgIG1QcmV2aW91c0xvY2F0aW9uID0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0lOVkFMSUQ7CiAKICAgICAgICAgaWYgKCFpc09mZmxvYWRlZE9yRGlyZWN0X2woKQpAQCAtNjg1LDcgKzY3MCw4IEBACiAgICAgICAgICAgICAvLyBTZXJ2ZXIgc2lkZSBoYXMgY29uc3VtZWQgc29tZXRoaW5nLCBidXQgaXMgaXQgZmluaXNoZWQgY29uc3VtaW5nPwogICAgICAgICAgICAgLy8gSXQgaXMgcG9zc2libGUgc2luY2UgZmx1c2ggYW5kIHN0b3AgYXJlIGFzeW5jaHJvbm91cyB0aGF0IHRoZSBzZXJ2ZXIKICAgICAgICAgICAgIC8vIGlzIHN0aWxsIGFjdGl2ZSBhdCB0aGlzIHBvaW50LgotICAgICAgICAgICAgQUxPR1YoInN0YXJ0OiBzZXJ2ZXIgcmVhZDolbGxkICBjdW11bGF0aXZlIGZsdXNoZWQ6JWxsZCAgY2xpZW50IHdyaXR0ZW46JWxsZCIsCisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBzZXJ2ZXIgcmVhZDolbGxkICBjdW11bGF0aXZlIGZsdXNoZWQ6JWxsZCAgY2xpZW50IHdyaXR0ZW46JWxsZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKShtRnJhbWVzV3JpdHRlblNlcnZlck9mZnNldAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbVN0YXJ0RXRzLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSksCiAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbVN0YXJ0RXRzLm1GbHVzaGVkLApAQCAtNzA2LDYgKzY5MiwxMyBAQAogICAgICAgICAvLyBmb3JjZSByZWZyZXNoIG9mIHJlbWFpbmluZyBmcmFtZXMgYnkgcHJvY2Vzc0F1ZGlvQnVmZmVyKCkgYXMgbGFzdAogICAgICAgICAvLyB3cml0ZSBiZWZvcmUgc3RvcCBjb3VsZCBiZSBwYXJ0aWFsLgogICAgICAgICBtUmVmcmVzaFJlbWFpbmluZyA9IHRydWU7CisKKyAgICAgICAgLy8gZm9yIHN0YXRpYyB0cmFjaywgY2xlYXIgdGhlIG9sZCBmbGFncyB3aGVuIHN0YXJ0aW5nIGZyb20gc3RvcHBlZCBzdGF0ZQorICAgICAgICBpZiAobVNoYXJlZEJ1ZmZlciAhPSAwKSB7CisgICAgICAgICAgICBhbmRyb2lkX2F0b21pY19hbmQoCisgICAgICAgICAgICB+KENCTEtfTE9PUF9DWUNMRSB8IENCTEtfTE9PUF9GSU5BTCB8IENCTEtfQlVGRkVSX0VORCksCisgICAgICAgICAgICAmbUNibGstPm1GbGFncyk7CisgICAgICAgIH0KICAgICB9CiAgICAgbU5ld1Bvc2l0aW9uID0gbVBvc2l0aW9uICsgbVVwZGF0ZVBlcmlvZDsKICAgICBpbnQzMl90IGZsYWdzID0gYW5kcm9pZF9hdG9taWNfYW5kKH4oQ0JMS19TVFJFQU1fRU5EX0RPTkUgfCBDQkxLX0RJU0FCTEVEKSwgJm1DYmxrLT5tRmxhZ3MpOwpAQCAtNzM5LDcgKzczMiw3IEBACiAgICAgICAgIC8vIFN0YXJ0IG91ciBsb2NhbCBWb2x1bWVIYW5kbGVyIGZvciByZXN0b3JhdGlvbiBwdXJwb3Nlcy4KICAgICAgICAgbVZvbHVtZUhhbmRsZXItPnNldFN0YXJ0ZWQoKTsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgic3RhcnQoKSBzdGF0dXMgJWQiLCBzdGF0dXMpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdHVzKTsKICAgICAgICAgbVN0YXRlID0gcHJldmlvdXNTdGF0ZTsKICAgICAgICAgaWYgKHQgIT0gMCkgewogICAgICAgICAgICAgaWYgKHByZXZpb3VzU3RhdGUgIT0gU1RBVEVfU1RPUFBJTkcpIHsKQEAgLTc1Nyw2ICs3NTAsOCBAQAogdm9pZCBBdWRpb1RyYWNrOjpzdG9wKCkKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgQUxPR1YoIiVzKCVkKTogcHJpb3Igc3RhdGU6JXMiLCBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdGVUb1N0cmluZyhtU3RhdGUpKTsKKwogICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfQUNUSVZFICYmIG1TdGF0ZSAhPSBTVEFURV9QQVVTRUQpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTc2Niw3ICs3NjEsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7CiAgICAgICAgIEFMT0dEX0lGKG1TaGFyZWRCdWZmZXIgPT0gbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAic3RvcCgpIGNhbGxlZCB3aXRoICV1IGZyYW1lcyBkZWxpdmVyZWQiLCBtUmVsZWFzZWQudmFsdWUoKSk7CisgICAgICAgICAgICAgICAgIiVzKCVkKTogY2FsbGVkIHdpdGggJXUgZnJhbWVzIGRlbGl2ZXJlZCIsIF9fZnVuY19fLCBtUG9ydElkLCBtUmVsZWFzZWQudmFsdWUoKSk7CiAgICAgICAgIG1SZWxlYXNlZCA9IDA7CiAgICAgfQogCkBAIC03ODcsNiArNzgyLDEwIEBACiAgICAgaWYgKHQgIT0gMCkgewogICAgICAgICBpZiAoIWlzT2ZmbG9hZGVkX2woKSkgewogICAgICAgICAgICAgdC0+cGF1c2UoKTsKKyAgICAgICAgfSBlbHNlIGlmIChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSykgeworICAgICAgICAgICAgLy8gY2F1c2VzIHdha2UgdXAgb2YgdGhlIHBsYXliYWNrIHRocmVhZCwgdGhhdCB3aWxsIGNhbGxiYWNrIHRoZSBjbGllbnQgZm9yCisgICAgICAgICAgICAvLyBFVkVOVF9TVFJFQU1fRU5EIGluIHByb2Nlc3NBdWRpb0J1ZmZlcigpCisgICAgICAgICAgICB0LT53YWtlKCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBzZXRwcmlvcml0eShQUklPX1BST0NFU1MsIDAsIG1QcmV2aW91c1ByaW9yaXR5KTsKQEAgLTgwMiwxMCArODAxLDEyIEBACiAKIHZvaWQgQXVkaW9UcmFjazo6Zmx1c2goKQogeworICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMoJWQpOiBwcmlvciBzdGF0ZTolcyIsIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0ZVRvU3RyaW5nKG1TdGF0ZSkpOworCiAgICAgaWYgKG1TaGFyZWRCdWZmZXIgIT0gMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBpZiAobVN0YXRlID09IFNUQVRFX0FDVElWRSkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtODM0LDYgKzgzNSw4IEBACiB2b2lkIEF1ZGlvVHJhY2s6OnBhdXNlKCkKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgQUxPR1YoIiVzKCVkKTogcHJpb3Igc3RhdGU6JXMiLCBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdGVUb1N0cmluZyhtU3RhdGUpKTsKKwogICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfQUNUSVZFKSB7CiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BBVVNFRDsKICAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBTVEFURV9TVE9QUElORykgewpAQCAtODU5LDcgKzg2Miw4IEBACiAKICAgICAgICAgICAgIHVpbnQzMl90IGhhbEZyYW1lczsKICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpnZXRSZW5kZXJQb3NpdGlvbihtT3V0cHV0LCAmaGFsRnJhbWVzLCAmbVBhdXNlZFBvc2l0aW9uKTsKLSAgICAgICAgICAgIEFMT0dWKCJBdWRpb1RyYWNrOjpwYXVzZSBmb3Igb2ZmbG9hZCwgY2FjaGUgY3VycmVudCBwb3NpdGlvbiAldSIsIG1QYXVzZWRQb3NpdGlvbik7CisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBmb3Igb2ZmbG9hZCwgY2FjaGUgY3VycmVudCBwb3NpdGlvbiAldSIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBtUGF1c2VkUG9zaXRpb24pOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtOTEzLDEwICs5MTcsMTMgQEAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnNldFNhbXBsZVJhdGUodWludDMyX3QgcmF0ZSkKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgQUxPR1YoIiVzKCVkKTogcHJpb3Igc3RhdGU6JXMgcmF0ZToldSIsIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0ZVRvU3RyaW5nKG1TdGF0ZSksIHJhdGUpOworCiAgICAgaWYgKHJhdGUgPT0gbVNhbXBsZVJhdGUpIHsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KLSAgICBpZiAoaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkgfHwgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpKSB7CisgICAgaWYgKGlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpIHx8IChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKQorICAgICAgICAgICAgfHwgKG1DaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBpZiAobU91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewpAQCAtOTc4LDggKzk4NSw4IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBBTE9HVigic2V0UGxheWJhY2tSYXRlIChpbnB1dCk6IG1TYW1wbGVSYXRlOiV1ICBtU3BlZWQ6JWYgIG1QaXRjaDolZiIsCi0gICAgICAgICAgICBtU2FtcGxlUmF0ZSwgcGxheWJhY2tSYXRlLm1TcGVlZCwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CisgICAgQUxPR1YoIiVzKCVkKTogbVNhbXBsZVJhdGU6JXUgIG1TcGVlZDolZiAgbVBpdGNoOiVmIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBtU2FtcGxlUmF0ZSwgcGxheWJhY2tSYXRlLm1TcGVlZCwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CiAgICAgLy8gcGl0Y2ggaXMgZW11bGF0ZWQgYnkgYWRqdXN0aW5nIHNwZWVkIGFuZCBzYW1wbGVSYXRlCiAgICAgY29uc3QgdWludDMyX3QgZWZmZWN0aXZlUmF0ZSA9IGFkanVzdFNhbXBsZVJhdGUobVNhbXBsZVJhdGUsIHBsYXliYWNrUmF0ZS5tUGl0Y2gpOwogICAgIGNvbnN0IGZsb2F0IGVmZmVjdGl2ZVNwZWVkID0gYWRqdXN0U3BlZWQocGxheWJhY2tSYXRlLm1TcGVlZCwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CkBAIC05ODgsMzIgKzk5NSwzMiBAQAogICAgIHBsYXliYWNrUmF0ZVRlbXAubVNwZWVkID0gZWZmZWN0aXZlU3BlZWQ7CiAgICAgcGxheWJhY2tSYXRlVGVtcC5tUGl0Y2ggPSBlZmZlY3RpdmVQaXRjaDsKIAotICAgIEFMT0dWKCJzZXRQbGF5YmFja1JhdGUgKGVmZmVjdGl2ZSk6IG1TYW1wbGVSYXRlOiV1ICBtU3BlZWQ6JWYgIG1QaXRjaDolZiIsCi0gICAgICAgICAgICBlZmZlY3RpdmVSYXRlLCBlZmZlY3RpdmVTcGVlZCwgZWZmZWN0aXZlUGl0Y2gpOworICAgIEFMT0dWKCIlcyglZCkgKGVmZmVjdGl2ZSkgbVNhbXBsZVJhdGU6JXUgIG1TcGVlZDolZiAgbVBpdGNoOiVmIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBlZmZlY3RpdmVSYXRlLCBlZmZlY3RpdmVTcGVlZCwgZWZmZWN0aXZlUGl0Y2gpOwogCiAgICAgaWYgKCFpc0F1ZGlvUGxheWJhY2tSYXRlVmFsaWQocGxheWJhY2tSYXRlVGVtcCkpIHsKLSAgICAgICAgQUxPR1coInNldFBsYXliYWNrUmF0ZSglZiwgJWYpIGZhaWxlZCAoZWZmZWN0aXZlIHJhdGUgb3V0IG9mIGJvdW5kcykiLAotICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS5tU3BlZWQsIHBsYXliYWNrUmF0ZS5tUGl0Y2gpOworICAgICAgICBBTE9HVygiJXMoJWQpICglZiwgJWYpIGZhaWxlZCAoZWZmZWN0aXZlIHJhdGUgb3V0IG9mIGJvdW5kcykiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgLy8gQ2hlY2sgaWYgdGhlIGJ1ZmZlciBzaXplIGlzIGNvbXBhdGlibGUuCiAgICAgaWYgKCFpc1NhbXBsZVJhdGVTcGVlZEFsbG93ZWRfbChlZmZlY3RpdmVSYXRlLCBlZmZlY3RpdmVTcGVlZCkpIHsKLSAgICAgICAgQUxPR1coInNldFBsYXliYWNrUmF0ZSglZiwgJWYpIGZhaWxlZCAoYnVmZmVyIHNpemUpIiwKLSAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKSAoJWYsICVmKSBmYWlsZWQgKGJ1ZmZlciBzaXplKSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHBsYXliYWNrUmF0ZS5tU3BlZWQsIHBsYXliYWNrUmF0ZS5tUGl0Y2gpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIC8vIENoZWNrIHJlc2FtcGxlciByYXRpb3MgYXJlIHdpdGhpbiBib3VuZHMKICAgICBpZiAoKHVpbnQ2NF90KWVmZmVjdGl2ZVJhdGUgPiAodWludDY0X3QpbVNhbXBsZVJhdGUgKgogICAgICAgICAgICAgKHVpbnQ2NF90KUFVRElPX1JFU0FNUExFUl9ET1dOX1JBVElPX01BWCkgewotICAgICAgICBBTE9HVygic2V0UGxheWJhY2tSYXRlKCVmLCAlZikgZmFpbGVkLiBSZXNhbXBsZSByYXRlIGV4Y2VlZHMgbWF4IGFjY2VwdGVkIHZhbHVlIiwKLSAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKSAoJWYsICVmKSBmYWlsZWQuIFJlc2FtcGxlIHJhdGUgZXhjZWVkcyBtYXggYWNjZXB0ZWQgdmFsdWUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBpZiAoKHVpbnQ2NF90KWVmZmVjdGl2ZVJhdGUgKiAodWludDY0X3QpQVVESU9fUkVTQU1QTEVSX1VQX1JBVElPX01BWCA8ICh1aW50NjRfdCltU2FtcGxlUmF0ZSkgewotICAgICAgICBBTE9HVygic2V0UGxheWJhY2tSYXRlKCVmLCAlZikgZmFpbGVkLiBSZXNhbXBsZSByYXRlIGJlbG93IG1pbiBhY2NlcHRlZCB2YWx1ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKSAoJWYsICVmKSBmYWlsZWQuIFJlc2FtcGxlIHJhdGUgYmVsb3cgbWluIGFjY2VwdGVkIHZhbHVlIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgcGxheWJhY2tSYXRlLm1TcGVlZCwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIG1QbGF5YmFja1JhdGUgPSBwbGF5YmFja1JhdGU7CkBAIC0xMjE0LDcgKzEyMjEsOCBAQAogICAgICAgICB1aW50MzJfdCBkc3BGcmFtZXMgPSAwOwogCiAgICAgICAgIGlmIChpc09mZmxvYWRlZF9sKCkgJiYgKChtU3RhdGUgPT0gU1RBVEVfUEFVU0VEKSB8fCAobVN0YXRlID09IFNUQVRFX1BBVVNFRF9TVE9QUElORykpKSB7Ci0gICAgICAgICAgICBBTE9HVigiZ2V0UG9zaXRpb24gY2FsbGVkIGluIHBhdXNlZCBzdGF0ZSwgcmV0dXJuIGNhY2hlZCBwb3NpdGlvbiAldSIsIG1QYXVzZWRQb3NpdGlvbik7CisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBjYWxsZWQgaW4gcGF1c2VkIHN0YXRlLCByZXR1cm4gY2FjaGVkIHBvc2l0aW9uICV1IiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgbVBhdXNlZFBvc2l0aW9uKTsKICAgICAgICAgICAgICpwb3NpdGlvbiA9IG1QYXVzZWRQb3NpdGlvbjsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQpAQCAtMTM0MSw3ICsxMzQ5LDcgQEAKIGF1ZGlvX3N0cmVhbV90eXBlX3QgQXVkaW9UcmFjazo6c3RyZWFtVHlwZSgpIGNvbnN0CiB7CiAgICAgaWYgKG1TdHJlYW1UeXBlID09IEFVRElPX1NUUkVBTV9ERUZBVUxUKSB7Ci0gICAgICAgIHJldHVybiBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKCZtQXR0cmlidXRlcyk7CisgICAgICAgIHJldHVybiBBdWRpb1N5c3RlbTo6YXR0cmlidXRlc1RvU3RyZWFtVHlwZShtQXR0cmlidXRlcyk7CiAgICAgfQogICAgIHJldHVybiBtU3RyZWFtVHlwZTsKIH0KQEAgLTEzNjAsNyArMTM2OCw3IEBACiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldExhdGVuY3kobU91dHB1dCwgJm1BZkxhdGVuY3kpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1coImdldExhdGVuY3koJWQpIGZhaWxlZCBzdGF0dXMgJWQiLCBtT3V0cHV0LCBzdGF0dXMpOworICAgICAgICBBTE9HVygiJXMoJWQpOiBnZXRMYXRlbmN5KCVkKSBmYWlsZWQgc3RhdHVzICVkIiwgX19mdW5jX18sIG1Qb3J0SWQsIG1PdXRwdXQsIHN0YXR1cyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gRklYTUUgZG9uJ3QgYmVsaWV2ZSB0aGlzIGxpZQogICAgICAgICBtTGF0ZW5jeSA9IG1BZkxhdGVuY3kgKyAoMTAwMExMICogbUZyYW1lQ291bnQpIC8gbVNhbXBsZVJhdGU7CkBAIC0xMzc2LDYgKzEzODQsNyBAQAogICAgICAgICBNRURJQV9DQVNFX0VOVU0oVFJBTlNGRVJfT0JUQUlOKTsKICAgICAgICAgTUVESUFfQ0FTRV9FTlVNKFRSQU5TRkVSX1NZTkMpOwogICAgICAgICBNRURJQV9DQVNFX0VOVU0oVFJBTlNGRVJfU0hBUkVEKTsKKyAgICAgICAgTUVESUFfQ0FTRV9FTlVNKFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0spOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuICJVTlJFQ09HTklaRUQiOwogICAgIH0KQEAgLTEzODgsNyArMTM5Nyw4IEBACiAKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGF1ZGlvRmxpbmdlciA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGF1ZGlvZmxpbmdlciIpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGF1ZGlvZmxpbmdlciIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtMTQwNywxMSArMTQxNywxNCBAQAogICAgICAgICAgICAgLy8gdXNlIGNhc2UgMzogb2J0YWluL3JlbGVhc2UgbW9kZQogICAgICAgICAgICAgKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9PQlRBSU4pIHx8CiAgICAgICAgICAgICAvLyB1c2UgY2FzZSA0OiBzeW5jaHJvbm91cyB3cml0ZQotICAgICAgICAgICAgKChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfU1lOQykgJiYgbVRocmVhZENhbkNhbGxKYXZhKTsKKyAgICAgICAgICAgICgobVRyYW5zZmVyID09IFRSQU5TRkVSX1NZTkMgfHwgbVRyYW5zZmVyID09IFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0spCisgICAgICAgICAgICAgICAgICAgICYmIG1UaHJlYWRDYW5DYWxsSmF2YSk7CiAKICAgICAgICAgYm9vbCBmYXN0QWxsb3dlZCA9IHNoYXJlZEJ1ZmZlciB8fCB0cmFuc2ZlckFsbG93ZWQ7CiAgICAgICAgIGlmICghZmFzdEFsbG93ZWQpIHsKLSAgICAgICAgICAgIEFMT0dXKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIGRlbmllZCBieSBjbGllbnQsIG5vdCBzaGFyZWQgYnVmZmVyIGFuZCB0cmFuc2ZlciA9ICVzIiwKKyAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgZGVuaWVkIGJ5IGNsaWVudCwiCisgICAgICAgICAgICAgICAgICAiIG5vdCBzaGFyZWQgYnVmZmVyIGFuZCB0cmFuc2ZlciA9ICVzIiwKKyAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgY29udmVydFRyYW5zZmVyVG9UZXh0KG1UcmFuc2ZlcikpOwogICAgICAgICAgICAgbUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAobUZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX0ZBU1QpOwogICAgICAgICB9CkBAIC0xNDE5LDcgKzE0MzIsNyBAQAogCiAgICAgSUF1ZGlvRmxpbmdlcjo6Q3JlYXRlVHJhY2tJbnB1dCBpbnB1dDsKICAgICBpZiAobVN0cmVhbVR5cGUgIT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpIHsKLSAgICAgICAgc3RyZWFtX3R5cGVfdG9fYXVkaW9fYXR0cmlidXRlcyhtU3RyZWFtVHlwZSwgJmlucHV0LmF0dHIpOworICAgICAgICBpbnB1dC5hdHRyID0gQXVkaW9TeXN0ZW06OnN0cmVhbVR5cGVUb0F0dHJpYnV0ZXMobVN0cmVhbVR5cGUpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlucHV0LmF0dHIgPSBtQXR0cmlidXRlczsKICAgICB9CkBAIC0xNDYwLDcgKzE0NzMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7CiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8IG91dHB1dC5vdXRwdXRJZCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICBBTE9HRSgiQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgdHJhY2ssIHN0YXR1czogJWQgb3V0cHV0ICVkIiwgc3RhdHVzLCBvdXRwdXQub3V0cHV0SWQpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBBdWRpb0ZsaW5nZXIgY291bGQgbm90IGNyZWF0ZSB0cmFjaywgc3RhdHVzOiAlZCBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0dXMsIG91dHB1dC5vdXRwdXRJZCk7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIH0KQEAgLTE0OTAsMTMgKzE1MDQsMTMgQEAKICAgICAvLyBGSVhNRSBjb21wYXJlIHRvIEF1ZGlvUmVjb3JkCiAgICAgc3A8SU1lbW9yeT4gaU1lbSA9IHRyYWNrLT5nZXRDYmxrKCk7CiAgICAgaWYgKGlNZW0gPT0gMCkgewotICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIik7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICB2b2lkICppTWVtUG9pbnRlciA9IGlNZW0tPnBvaW50ZXIoKTsKICAgICBpZiAoaU1lbVBvaW50ZXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIHBvaW50ZXIiKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIHBvaW50ZXIiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC0xNTE1LDI3ICsxNTI5LDI4IEBACiAgICAgbUF3YWl0Qm9vc3QgPSBmYWxzZTsKICAgICBpZiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgewogICAgICAgICBpZiAob3V0cHV0LmZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgewotICAgICAgICAgICAgQUxPR0koIkFVRElPX09VVFBVVF9GTEFHX0ZBU1Qgc3VjY2Vzc2Z1bDsgZnJhbWVDb3VudCAlenUgLT4gJXp1IiwKLSAgICAgICAgICAgICAgICAgIG1SZXFGcmFtZUNvdW50LCBtRnJhbWVDb3VudCk7CisgICAgICAgICAgICBBTE9HSSgiJXMoJWQpOiBBVURJT19PVVRQVVRfRkxBR19GQVNUIHN1Y2Nlc3NmdWw7IGZyYW1lQ291bnQgJXp1IC0+ICV6dSIsCisgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgbVJlcUZyYW1lQ291bnQsIG1GcmFtZUNvdW50KTsKICAgICAgICAgICAgIGlmICghbVRocmVhZENhbkNhbGxKYXZhKSB7CiAgICAgICAgICAgICAgICAgbUF3YWl0Qm9vc3QgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1coIkFVRElPX09VVFBVVF9GTEFHX0ZBU1QgZGVuaWVkIGJ5IHNlcnZlcjsgZnJhbWVDb3VudCAlenUgLT4gJXp1IiwgbVJlcUZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCk7CisgICAgICAgICAgICBBTE9HVygiJXMoJWQpOiBBVURJT19PVVRQVVRfRkxBR19GQVNUIGRlbmllZCBieSBzZXJ2ZXI7IGZyYW1lQ291bnQgJXp1IC0+ICV6dSIsCisgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgbVJlcUZyYW1lQ291bnQsIG1GcmFtZUNvdW50KTsKICAgICAgICAgfQogICAgIH0KICAgICBtRmxhZ3MgPSBvdXRwdXQuZmxhZ3M7CiAKICAgICAvL21PdXRwdXQgIT0gb3V0cHV0IGluY2x1ZGVzIHRoZSBjYXNlIHdoZXJlIG1PdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUgZm9yIGZpcnN0IGNyZWF0aW9uCi0gICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwICYmIG1PdXRwdXQgIT0gb3V0cHV0Lm91dHB1dElkKSB7CisgICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwKSB7CiAgICAgICAgIGlmIChtT3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtT3V0cHV0KTsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1PdXRwdXQsIG1Qb3J0SWQpOwogICAgICAgICB9Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG91dHB1dC5vdXRwdXRJZCk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG91dHB1dC5vdXRwdXRJZCwgb3V0cHV0LnBvcnRJZCk7CiAgICAgICAgIGNhbGxiYWNrQWRkZWQgPSB0cnVlOwogICAgIH0KIAorICAgIG1Qb3J0SWQgPSBvdXRwdXQucG9ydElkOwogICAgIC8vIFdlIHJldGFpbiBhIGNvcHkgb2YgdGhlIEkvTyBoYW5kbGUsIGJ1dCBkb24ndCBvd24gdGhlIHJlZmVyZW5jZQogICAgIG1PdXRwdXQgPSBvdXRwdXQub3V0cHV0SWQ7CiAgICAgbVJlZnJlc2hSZW1haW5pbmcgPSB0cnVlOwpAQCAtMTU1MCw3ICsxNTY1LDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBidWZmZXJzID0gbVNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpOwogICAgICAgICBpZiAoYnVmZmVycyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBidWZmZXIgcG9pbnRlciIpOworICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBidWZmZXIgcG9pbnRlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KQEAgLTE2MDAsNyArMTYxNSw3IEBACiBleGl0OgogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgY2FsbGJhY2tBZGRlZCkgewogICAgICAgICAvLyBub3RlOiBtT3V0cHV0IGlzIGFsd2F5cyB2YWxpZCBpcyBjYWxsYmFja0FkZGVkIGlzIHRydWUKLSAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbU91dHB1dCk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1PdXRwdXQsIG1Qb3J0SWQpOwogICAgIH0KIAogICAgIG1TdGF0dXMgPSBzdGF0dXM7CkBAIC0xNjM0LDEyICsxNjQ5LDEyIEBACiAgICAgfSBlbHNlIGlmICh3YWl0Q291bnQgPT0gMCkgewogICAgICAgICByZXF1ZXN0ZWQgPSAmQ2xpZW50UHJveHk6OmtOb25CbG9ja2luZzsKICAgICB9IGVsc2UgaWYgKHdhaXRDb3VudCA+IDApIHsKLSAgICAgICAgbG9uZyBsb25nIG1zID0gV0FJVF9QRVJJT0RfTVMgKiAobG9uZyBsb25nKSB3YWl0Q291bnQ7CisgICAgICAgIHRpbWVfdCBtcyA9IFdBSVRfUEVSSU9EX01TICogKHRpbWVfdCkgd2FpdENvdW50OwogICAgICAgICB0aW1lb3V0LnR2X3NlYyA9IG1zIC8gMTAwMDsKLSAgICAgICAgdGltZW91dC50dl9uc2VjID0gKGludCkgKG1zICUgMTAwMCkgKiAxMDAwMDAwOworICAgICAgICB0aW1lb3V0LnR2X25zZWMgPSAobG9uZykgKG1zICUgMTAwMCkgKiAxMDAwMDAwOwogICAgICAgICByZXF1ZXN0ZWQgPSAmdGltZW91dDsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiJXMgaW52YWxpZCB3YWl0Q291bnQgJWQiLCBfX2Z1bmNfXywgd2FpdENvdW50KTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogaW52YWxpZCB3YWl0Q291bnQgJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgd2FpdENvdW50KTsKICAgICAgICAgcmVxdWVzdGVkID0gTlVMTDsKICAgICB9CiAgICAgcmV0dXJuIG9idGFpbkJ1ZmZlcihhdWRpb0J1ZmZlciwgcmVxdWVzdGVkLCBOVUxMIC8qZWxhcHNlZCovLCBub25Db250aWcpOwpAQCAtMTc0OSw3ICsxNzY0LDggQEAKIHsKICAgICBpbnQzMl90IGZsYWdzID0gYW5kcm9pZF9hdG9taWNfYW5kKH5DQkxLX0RJU0FCTEVELCAmbUNibGstPm1GbGFncyk7CiAgICAgaWYgKChtU3RhdGUgPT0gU1RBVEVfQUNUSVZFKSAmJiAoZmxhZ3MgJiBDQkxLX0RJU0FCTEVEKSkgewotICAgICAgICBBTE9HVygicmVsZWFzZUJ1ZmZlcigpIHRyYWNrICVwIGRpc2FibGVkIGR1ZSB0byBwcmV2aW91cyB1bmRlcnJ1biwgcmVzdGFydGluZyIsIHRoaXMpOworICAgICAgICBBTE9HVygiJXMoJWQpOiByZWxlYXNlQnVmZmVyKCkgdHJhY2sgJXAgZGlzYWJsZWQgZHVlIHRvIHByZXZpb3VzIHVuZGVycnVuLCByZXN0YXJ0aW5nIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgdGhpcyk7CiAgICAgICAgIC8vIEZJWE1FIGlnbm9yaW5nIHN0YXR1cwogICAgICAgICBtQXVkaW9UcmFjay0+c3RhcnQoKTsKICAgICB9CkBAIC0xNzU5LDcgKzE3NzUsNyBAQAogCiBzc2l6ZV90IEF1ZGlvVHJhY2s6OndyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHVzZXJTaXplLCBib29sIGJsb2NraW5nKQogewotICAgIGlmIChtVHJhbnNmZXIgIT0gVFJBTlNGRVJfU1lOQykgeworICAgIGlmIChtVHJhbnNmZXIgIT0gVFJBTlNGRVJfU1lOQyAmJiBtVHJhbnNmZXIgIT0gVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSykgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCkBAIC0xNzc2LDcgKzE3OTIsOCBAQAogICAgIGlmIChzc2l6ZV90KHVzZXJTaXplKSA8IDAgfHwgKGJ1ZmZlciA9PSBOVUxMICYmIHVzZXJTaXplICE9IDApKSB7CiAgICAgICAgIC8vIFNhbml0eS1jaGVjazogdXNlciBpcyBtb3N0LWxpa2VseSBwYXNzaW5nIGFuIGVycm9yIGNvZGUsIGFuZCBpdCB3b3VsZAogICAgICAgICAvLyBtYWtlIHRoZSByZXR1cm4gdmFsdWUgYW1iaWd1b3VzIChhY3R1YWxTaXplIHZzIGVycm9yKS4KLSAgICAgICAgQUxPR0UoIkF1ZGlvVHJhY2s6OndyaXRlKGJ1ZmZlcj0lcCwgc2l6ZT0lenUgKCV6ZCkiLCBidWZmZXIsIHVzZXJTaXplLCB1c2VyU2l6ZSk7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IEF1ZGlvVHJhY2s6OndyaXRlKGJ1ZmZlcj0lcCwgc2l6ZT0lenUgKCV6ZCkiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBidWZmZXIsIHVzZXJTaXplLCB1c2VyU2l6ZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC0xODA5LDcgKzE4MjYsMTcgQEAKIAogICAgIGlmICh3cml0dGVuID4gMCkgewogICAgICAgICBtRnJhbWVzV3JpdHRlbiArPSB3cml0dGVuIC8gbUZyYW1lU2l6ZTsKKworICAgICAgICBpZiAobVRyYW5zZmVyID09IFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0spIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvVHJhY2tUaHJlYWQ+IHQgPSBtQXVkaW9UcmFja1RocmVhZDsKKyAgICAgICAgICAgIGlmICh0ICE9IDApIHsKKyAgICAgICAgICAgICAgICAvLyBjYXVzZXMgd2FrZSB1cCBvZiB0aGUgcGxheWJhY2sgdGhyZWFkLCB0aGF0IHdpbGwgY2FsbGJhY2sgdGhlIGNsaWVudCBmb3IKKyAgICAgICAgICAgICAgICAvLyBtb3JlIGRhdGEgKHdpdGggRVZFTlRfQ0FOX1dSSVRFX01PUkVfREFUQSkgaW4gcHJvY2Vzc0F1ZGlvQnVmZmVyKCkKKyAgICAgICAgICAgICAgICB0LT53YWtlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CisKICAgICByZXR1cm4gd3JpdHRlbjsKIH0KIApAQCAtMTgzOCw3ICsxODY1LDggQEAKICAgICAgICAgICAgIHBvbGxVcyA8PD0gMTsKICAgICAgICAgfSB3aGlsZSAodHJ5Q291bnRlci0tID4gMCk7CiAgICAgICAgIGlmICh0cnlDb3VudGVyIDwgMCkgewotICAgICAgICAgICAgQUxPR0UoImRpZCBub3QgcmVjZWl2ZSBleHBlY3RlZCBwcmlvcml0eSBib29zdCBvbiB0aW1lIik7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBkaWQgbm90IHJlY2VpdmUgZXhwZWN0ZWQgcHJpb3JpdHkgYm9vc3Qgb24gdGltZSIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgfQogICAgICAgICAvLyBSdW4gYWdhaW4gaW1tZWRpYXRlbHkKICAgICAgICAgcmV0dXJuIDA7CkBAIC0yMDYyLDggKzIwOTAsOCBAQAogICAgICAgICBpZiAobnMgPCAwKSBucyA9IDA7CiAgICAgfQogCi0gICAgLy8gSWYgbm90IHN1cHBseWluZyBkYXRhIGJ5IEVWRU5UX01PUkVfREFUQSwgdGhlbiB3ZSdyZSBkb25lCi0gICAgaWYgKG1UcmFuc2ZlciAhPSBUUkFOU0ZFUl9DQUxMQkFDSykgeworICAgIC8vIElmIG5vdCBzdXBwbHlpbmcgZGF0YSBieSBFVkVOVF9NT1JFX0RBVEEgb3IgRVZFTlRfQ0FOX1dSSVRFX01PUkVfREFUQSwgdGhlbiB3ZSdyZSBkb25lCisgICAgaWYgKG1UcmFuc2ZlciAhPSBUUkFOU0ZFUl9DQUxMQkFDSyAmJiBtVHJhbnNmZXIgIT0gVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSykgewogICAgICAgICByZXR1cm4gbnM7CiAgICAgfQogCkBAIC0yMDc5LDcgKzIxMDcsOCBAQAogICAgIGlmIChucyAhPSBOU19XSEVORVZFUikgewogICAgICAgICB0aW1lb3V0LnR2X3NlYyA9IG5zIC8gMTAwMDAwMDAwMExMOwogICAgICAgICB0aW1lb3V0LnR2X25zZWMgPSBucyAlIDEwMDAwMDAwMDBMTDsKLSAgICAgICAgQUxPR1YoInRpbWVvdXQgJWxkLiUwM2QiLCB0aW1lb3V0LnR2X3NlYywgKGludCkgdGltZW91dC50dl9uc2VjIC8gMTAwMDAwMCk7CisgICAgICAgIEFMT0dWKCIlcyglZCk6IHRpbWVvdXQgJWxkLiUwM2QiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCB0aW1lb3V0LnR2X3NlYywgKGludCkgdGltZW91dC50dl9uc2VjIC8gMTAwMDAwMCk7CiAgICAgICAgIHJlcXVlc3RlZCA9ICZ0aW1lb3V0OwogICAgIH0KIApAQCAtMjA5MSwxOCArMjEyMCwyMCBAQAogICAgICAgICBzaXplX3Qgbm9uQ29udGlnOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBvYnRhaW5CdWZmZXIoJmF1ZGlvQnVmZmVyLCByZXF1ZXN0ZWQsIE5VTEwsICZub25Db250aWcpOwogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChlcnIgIT0gTk9fRVJST1IpICE9IChhdWRpb0J1ZmZlci5mcmFtZUNvdW50ID09IDApLAotICAgICAgICAgICAgICAgICJvYnRhaW5CdWZmZXIoKSBlcnI9JWQgZnJhbWVDb3VudD0lenUiLCBlcnIsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgICIlcyglZCk6IG9idGFpbkJ1ZmZlcigpIGVycj0lZCBmcmFtZUNvdW50PSV6dSIsCisgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBlcnIsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQpOwogICAgICAgICByZXF1ZXN0ZWQgPSAmQ2xpZW50UHJveHk6OmtOb25CbG9ja2luZzsKICAgICAgICAgc2l6ZV90IGF2YWlsID0gYXVkaW9CdWZmZXIuZnJhbWVDb3VudCArIG5vbkNvbnRpZzsKLSAgICAgICAgQUxPR1YoIm9idGFpbkJ1ZmZlcigldSkgcmV0dXJuZWQgJXp1ID0gJXp1ICsgJXp1IGVyciAlZCIsCi0gICAgICAgICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lcywgYXZhaWwsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQsIG5vbkNvbnRpZywgZXJyKTsKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogb2J0YWluQnVmZmVyKCV1KSByZXR1cm5lZCAlenUgPSAlenUgKyAlenUgZXJyICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgbVJlbWFpbmluZ0ZyYW1lcywgYXZhaWwsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQsIG5vbkNvbnRpZywgZXJyKTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgaWYgKGVyciA9PSBUSU1FRF9PVVQgfHwgZXJyID09IFdPVUxEX0JMT0NLIHx8IGVyciA9PSAtRUlOVFIgfHwKICAgICAgICAgICAgICAgICAgICAgKGlzT2ZmbG9hZGVkKCkgJiYgKGVyciA9PSBERUFEX09CSkVDVCkpKSB7CiAgICAgICAgICAgICAgICAgLy8gRklYTUUgYnVnIDI1MTk1NzU5CiAgICAgICAgICAgICAgICAgcmV0dXJuIDEwMDAwMDA7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HRSgiRXJyb3IgJWQgb2J0YWluaW5nIGFuIGF1ZGlvIGJ1ZmZlciwgZ2l2aW5nIHVwLiIsIGVycik7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBFcnJvciAlZCBvYnRhaW5pbmcgYW4gYXVkaW8gYnVmZmVyLCBnaXZpbmcgdXAuIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIGVycik7CiAgICAgICAgICAgICByZXR1cm4gTlNfTkVWRVI7CiAgICAgICAgIH0KIApAQCAtMjExMywyNiArMjE0NCw1OCBAQAogICAgICAgICAgICAgICAgICAgICBjb25zdCBuc2Vjc190IHRpbWVOb3cgPSBzeXN0ZW1UaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgIG5zID0gbWF4KChuc2Vjc190KTAsIG5zIC0gKHRpbWVOb3cgLSB0aW1lQWZ0ZXJDYWxsYmFja3MpKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbnNlY3NfdCBteW5zID0gZnJhbWVzVG9OYW5vc2Vjb25kcyhtUmVtYWluaW5nRnJhbWVzIC0gYXZhaWwsIHNhbXBsZVJhdGUsIHNwZWVkKTsKLSAgICAgICAgICAgICAgICBpZiAobnMgPCAwIC8qIE5TX1dIRU5FVkVSICovIHx8IG15bnMgPCBucykgewotICAgICAgICAgICAgICAgICAgICBucyA9IG15bnM7CisKKyAgICAgICAgICAgICAgICAvLyBkZWxheU5zIGlzIGZpcnN0IGNvbXB1dGVkIGJ5IHRoZSBhZGRpdGlvbmFsIGZyYW1lcyByZXF1aXJlZCBpbiB0aGUgYnVmZmVyLgorICAgICAgICAgICAgICAgIG5zZWNzX3QgZGVsYXlOcyA9IGZyYW1lc1RvTmFub3NlY29uZHMoCisgICAgICAgICAgICAgICAgICAgICAgICBtUmVtYWluaW5nRnJhbWVzIC0gYXZhaWwsIHNhbXBsZVJhdGUsIHNwZWVkKTsKKworICAgICAgICAgICAgICAgIC8vIGFmTnMgaXMgdGhlIEF1ZGlvRmxpbmdlciBtaXhlciBwZXJpb2QgaW4gbnMuCisgICAgICAgICAgICAgICAgY29uc3QgbnNlY3NfdCBhZk5zID0gZnJhbWVzVG9OYW5vc2Vjb25kcyhtQWZGcmFtZUNvdW50LCBtQWZTYW1wbGVSYXRlLCBzcGVlZCk7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgQXVkaW9UcmFjayBpcyBkb3VibGUgYnVmZmVyZWQgYmFzZWQgb24gdGhlIEF1ZGlvRmxpbmdlciBtaXhlciBwZXJpb2QsCisgICAgICAgICAgICAgICAgLy8gd2UgbWF5IGhhdmUgYSByYWNlIGlmIHdlIHdhaXQgYmFzZWQgb24gdGhlIG51bWJlciBvZiBmcmFtZXMgZGVzaXJlZC4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgcG9zc2libGUgaXNzdWUgd2l0aCByZXNhbXBsaW5nIGFuZCBBQXVkaW8uCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBUaGUgZ3JhbnVsYXJpdHkgb2YgYXVkaW9mbGluZ2VyIHByb2Nlc3NpbmcgaXMgb25lIG1peGVyIHBlcmlvZDsgaWYKKyAgICAgICAgICAgICAgICAvLyBvdXIgd2FpdCB0aW1lIGlzIGxlc3MgdGhhbiBvbmUgbWl4ZXIgcGVyaW9kLCB3YWl0IGF0IG1vc3QgaGFsZiB0aGUgcGVyaW9kLgorICAgICAgICAgICAgICAgIGlmIChkZWxheU5zIDwgYWZOcykgeworICAgICAgICAgICAgICAgICAgICBkZWxheU5zID0gc3RkOjptaW4oZGVsYXlOcywgYWZOcyAvIDIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGFkanVzdCBvdXIgbnMgd2FpdCBieSBkZWxheU5zLgorICAgICAgICAgICAgICAgIGlmIChucyA8IDAgLyogTlNfV0hFTkVWRVIgKi8gfHwgZGVsYXlOcyA8IG5zKSB7CisgICAgICAgICAgICAgICAgICAgIG5zID0gZGVsYXlOczsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIG5zOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgc2l6ZV90IHJlcVNpemUgPSBhdWRpb0J1ZmZlci5zaXplOwotICAgICAgICBtQ2JmKEVWRU5UX01PUkVfREFUQSwgbVVzZXJEYXRhLCAmYXVkaW9CdWZmZXIpOworICAgICAgICBpZiAobVRyYW5zZmVyID09IFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0spIHsKKyAgICAgICAgICAgIC8vIHdoZW4gbm90aWZ5aW5nIGNsaWVudCBpdCBjYW4gd3JpdGUgbW9yZSBkYXRhLCBwYXNzIHRoZSB0b3RhbCBzaXplIHRoYXQgY2FuIGJlCisgICAgICAgICAgICAvLyB3cml0dGVuIGluIHRoZSBuZXh0IHdyaXRlKCkgY2FsbCwgc2luY2UgaXQncyBub3QgcGFzc2VkIHRocm91Z2ggdGhlIGNhbGxiYWNrCisgICAgICAgICAgICBhdWRpb0J1ZmZlci5zaXplICs9IG5vbkNvbnRpZzsKKyAgICAgICAgfQorICAgICAgICBtQ2JmKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9DQUxMQkFDSyA/IEVWRU5UX01PUkVfREFUQSA6IEVWRU5UX0NBTl9XUklURV9NT1JFX0RBVEEsCisgICAgICAgICAgICAgICAgbVVzZXJEYXRhLCAmYXVkaW9CdWZmZXIpOwogICAgICAgICBzaXplX3Qgd3JpdHRlblNpemUgPSBhdWRpb0J1ZmZlci5zaXplOwogCiAgICAgICAgIC8vIFNhbml0eSBjaGVjayBvbiByZXR1cm5lZCBzaXplCiAgICAgICAgIGlmIChzc2l6ZV90KHdyaXR0ZW5TaXplKSA8IDAgfHwgd3JpdHRlblNpemUgPiByZXFTaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRVZFTlRfTU9SRV9EQVRBIHJlcXVlc3RlZCAlenUgYnl0ZXMgYnV0IGNhbGxiYWNrIHJldHVybmVkICV6ZCBieXRlcyIsCi0gICAgICAgICAgICAgICAgICAgIHJlcVNpemUsIHNzaXplX3Qod3JpdHRlblNpemUpKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IEVWRU5UX01PUkVfREFUQSByZXF1ZXN0ZWQgJXp1IGJ5dGVzIGJ1dCBjYWxsYmFjayByZXR1cm5lZCAlemQgYnl0ZXMiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgcmVxU2l6ZSwgc3NpemVfdCh3cml0dGVuU2l6ZSkpOwogICAgICAgICAgICAgcmV0dXJuIE5TX05FVkVSOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHdyaXR0ZW5TaXplID09IDApIHsKKyAgICAgICAgICAgIGlmIChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSykgeworICAgICAgICAgICAgICAgIC8vIFRoZSBjYWxsYmFjayBFVkVOVF9DQU5fV1JJVEVfTU9SRV9EQVRBIHdhcyBwcm9jZXNzZWQgaW4gdGhlIEpOSSBvZgorICAgICAgICAgICAgICAgIC8vIGFuZHJvaWQubWVkaWEuQXVkaW9UcmFjay4gVGhlIEpOSSBpcyBub3QgdXNpbmcgdGhlIGNhbGxiYWNrIHRvIHByb3ZpZGUgZGF0YSwKKyAgICAgICAgICAgICAgICAvLyBpdCBvbmx5IHNpZ25hbHMgdG8gdGhlIEphdmEgY2xpZW50IHRoYXQgaXQgY2FuIHByb3ZpZGUgbW9yZSBkYXRhLCB3aGljaAorICAgICAgICAgICAgICAgIC8vIHRoaXMgdHJhY2sgaXMgcmVhZCB0byBhY2NlcHQgbm93LgorICAgICAgICAgICAgICAgIC8vIFRoZSBwbGF5YmFjayB0aHJlYWQgd2lsbCBiZSBhd2FrZW4gYXQgdGhlIG5leHQgOjp3cml0ZSgpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5TX1dIRU5FVkVSOworICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gVGhlIGNhbGxiYWNrIGlzIGRvbmUgZmlsbGluZyBidWZmZXJzCiAgICAgICAgICAgICAvLyBLZWVwIHRoaXMgdGhyZWFkIGdvaW5nIHRvIGhhbmRsZSB0aW1lZCBldmVudHMgYW5kCiAgICAgICAgICAgICAvLyBzdGlsbCB0cnkgdG8gZ2V0IG1vcmUgZGF0YSBpbiBpbnRlcnZhbHMgb2YgV0FJVF9QRVJJT0RfTVMKQEAgLTIyMjMsOCArMjI4Niw4IEBACiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnJlc3RvcmVUcmFja19sKGNvbnN0IGNoYXIgKmZyb20pCiB7Ci0gICAgQUxPR1coImRlYWQgSUF1ZGlvVHJhY2ssICVzLCBjcmVhdGluZyBhIG5ldyBvbmUgZnJvbSAlcygpIiwKLSAgICAgICAgICBpc09mZmxvYWRlZE9yRGlyZWN0X2woKSA/ICJPZmZsb2FkZWQgb3IgRGlyZWN0IiA6ICJQQ00iLCBmcm9tKTsKKyAgICBBTE9HVygiJXMoJWQpOiBkZWFkIElBdWRpb1RyYWNrLCAlcywgY3JlYXRpbmcgYSBuZXcgb25lIGZyb20gJXMoKSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkgPyAiT2ZmbG9hZGVkIG9yIERpcmVjdCIgOiAiUENNIiwgZnJvbSk7CiAgICAgKyttU2VxdWVuY2U7CiAKICAgICAvLyByZWZyZXNoIHRoZSBhdWRpbyBjb25maWd1cmF0aW9uIGNhY2hlIGluIHRoaXMgcHJvY2VzcyB0byBtYWtlIHN1cmUgd2UgZ2V0IG5ldwpAQCAtMjI2NywxMCArMjMzMCw3IEBACiAgICAgLy8gSWYgYSBuZXcgSUF1ZGlvVHJhY2sgY2Fubm90IGJlIGNyZWF0ZWQsIHRoZSBwcmV2aW91cyAoZGVhZCkgaW5zdGFuY2Ugd2lsbCBiZSBsZWZ0IGludGFjdC4KICAgICBzdGF0dXNfdCByZXN1bHQgPSBjcmVhdGVUcmFja19sKCk7CiAKLSAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dXKCIlcygpOiBjcmVhdGVUcmFja19sIGZhaWxlZCwgZG8gbm90IHJldHJ5IiwgX19mdW5jX18pOwotICAgICAgICByZXRyaWVzID0gMDsKLSAgICB9IGVsc2UgeworICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKICAgICAgICAgLy8gdGFrZSB0aGUgZnJhbWVzIHRoYXQgd2lsbCBiZSBsb3N0IGJ5IHRyYWNrIHJlY3JlYXRpb24gaW50byBhY2NvdW50IGluIHNhdmVkIHBvc2l0aW9uCiAgICAgICAgIC8vIEZvciBzdHJlYW1pbmcgdHJhY2tzLCB0aGlzIGlzIHRoZSBhbW91bnQgd2Ugb2J0YWluZWQgZnJvbSB0aGUgdXNlci9jbGllbnQKICAgICAgICAgLy8gKG5vdCB0aGUgbnVtYmVyIGFjdHVhbGx5IGNvbnN1bWVkIGF0IHRoZSBzZXJ2ZXIgLSB0aG9zZSBhcmUgYWxyZWFkeSBsb3N0KS4KQEAgLTIyODUsNyArMjM0NSw3IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG1TdGF0aWNQcm94eS0+c2V0QnVmZmVyUG9zaXRpb24oYnVmZmVyUG9zaXRpb24pOwogICAgICAgICAgICAgICAgIGlmIChidWZmZXJQb3NpdGlvbiA9PSBtRnJhbWVDb3VudCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRCgicmVzdG9yaW5nIHRyYWNrIGF0IGVuZCBvZiBzdGF0aWMgYnVmZmVyIik7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCIlcyglZCk6IHJlc3RvcmluZyB0cmFjayBhdCBlbmQgb2Ygc3RhdGljIGJ1ZmZlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIzMTUsMTQgKzIzNzUsMTggQEAKICAgICAgICAgbUZyYW1lc1dyaXR0ZW5BdFJlc3RvcmUgPSBtRnJhbWVzV3JpdHRlblNlcnZlck9mZnNldDsKICAgICB9CiAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HVygiJXMoKSBmYWlsZWQgc3RhdHVzICVkLCByZXRyaWVzICVkIiwgX19mdW5jX18sIHJlc3VsdCwgcmV0cmllcyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IGZhaWxlZCBzdGF0dXMgJWQsIHJldHJpZXMgJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgcmVzdWx0LCByZXRyaWVzKTsKICAgICAgICAgaWYgKC0tcmV0cmllcyA+IDApIHsKKyAgICAgICAgICAgIC8vIGxlYXZlIHRpbWUgZm9yIGFuIGV2ZW50dWFsIHJhY2UgY29uZGl0aW9uIHRvIGNsZWFyIGJlZm9yZSByZXRyeWluZworICAgICAgICAgICAgdXNsZWVwKDUwMDAwMCk7CiAgICAgICAgICAgICBnb3RvIHJldHJ5OwogICAgICAgICB9Ci0gICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7Ci0gICAgICAgIG1SZWxlYXNlZCA9IDA7CisgICAgICAgIC8vIGlmIG5vIHJldHJpZXMgbGVmdCwgc2V0IGludmFsaWQgYml0IHRvIGZvcmNlIHJlc3RvcmluZyBhdCBuZXh0IG9jY2FzaW9uCisgICAgICAgIC8vIGFuZCBhdm9pZCBpbmNvbnNpc3RlbnQgYWN0aXZlIHN0YXRlIG9uIGNsaWVudCBhbmQgc2VydmVyIHNpZGVzCisgICAgICAgIGlmIChtQ2JsayAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBhbmRyb2lkX2F0b21pY19vcihDQkxLX0lOVkFMSUQsICZtQ2Jsay0+bUZsYWdzKTsKKyAgICAgICAgfQogICAgIH0KLQogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTIzNDAsOCArMjQwNCw4IEBACiAgICAgLy8gICAgICB1bmxlc3MgdGhlIHNlcnZlciBoYXMgbW9yZSB0aGFuIDJeMzEgZnJhbWVzIGluIGl0cyBidWZmZXIsCiAgICAgLy8gICAgICBpbiB3aGljaCBjYXNlIHRoZSB1c2Ugb2YgdWludDMyX3QgZm9yIHRoZXNlIGNvdW50ZXJzIGhhcyBiaWdnZXIgaXNzdWVzLgogICAgIEFMT0dFX0lGKGRlbHRhIDwgMCwKLSAgICAgICAgICAgICJkZXRlY3RlZCBpbGxlZ2FsIHJldHJvZ3JhZGUgbW90aW9uIGJ5IHRoZSBzZXJ2ZXI6IG1TZXJ2ZXIgYWR2YW5jZWQgYnkgJWQiLAotICAgICAgICAgICAgZGVsdGEpOworICAgICAgICAgICAgIiVzKCVkKTogZGV0ZWN0ZWQgaWxsZWdhbCByZXRyb2dyYWRlIG1vdGlvbiBieSB0aGUgc2VydmVyOiBtU2VydmVyIGFkdmFuY2VkIGJ5ICVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBkZWx0YSk7CiAgICAgbVNlcnZlciA9IG5ld1NlcnZlcjsKICAgICBpZiAoZGVsdGEgPiAwKSB7IC8vIGF2b2lkIHJldHJvZ3JhZGUKICAgICAgICAgbVBvc2l0aW9uICs9IGRlbHRhOwpAQCAtMjM2MSw5ICsyNDI1LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIHNwZWVkIC8qLCAwIG1Ob3RpZmljYXRpb25zUGVyQnVmZmVyUmVxKi8pOwogICAgIGNvbnN0IGJvb2wgYWxsb3dlZCA9IG1GcmFtZUNvdW50ID49IG1pbkZyYW1lQ291bnQ7CiAgICAgQUxPR0RfSUYoIWFsbG93ZWQsCi0gICAgICAgICAgICAiaXNTYW1wbGVSYXRlU3BlZWRBbGxvd2VkX2wgZGVuaWVkICIKKyAgICAgICAgICAgICIlcyglZCk6IGRlbmllZCAiCiAgICAgICAgICAgICAibUFmTGF0ZW5jeToldSAgbUFmRnJhbWVDb3VudDolenUgIG1BZlNhbXBsZVJhdGU6JXUgIHNhbXBsZVJhdGU6JXUgIHNwZWVkOiVmICIKICAgICAgICAgICAgICJtRnJhbWVDb3VudDolenUgPCBtaW5GcmFtZUNvdW50OiV6dSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgIG1BZkxhdGVuY3ksIG1BZkZyYW1lQ291bnQsIG1BZlNhbXBsZVJhdGUsIHNhbXBsZVJhdGUsIHNwZWVkLAogICAgICAgICAgICAgbUZyYW1lQ291bnQsIG1pbkZyYW1lQ291bnQpOwogICAgIHJldHVybiBhbGxvd2VkOwpAQCAtMjM4MSw3ICsyNDQ2LDggQEAKICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7CiAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVByZXNlbnRhdGlvbklkKSwgcHJlc2VudGF0aW9uSWQpOwogICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlQcm9ncmFtSWQpLCBwcm9ncmFtSWQpOwotICAgIEFMT0dWKCJQcmVzZW50YXRpb25JZC9Qcm9ncmFtSWRbJXNdIixwYXJhbS50b1N0cmluZygpLnN0cmluZygpKTsKKyAgICBBTE9HVigiJXMoJWQpOiBQcmVzZW50YXRpb25JZC9Qcm9ncmFtSWRbJXNdIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBwYXJhbS50b1N0cmluZygpLnN0cmluZygpKTsKIAogICAgIHJldHVybiBtQXVkaW9UcmFjay0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKIH0KQEAgLTI0MDgsNyArMjQ3NCw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gd2FybiBvbmx5IGlmIG5vdCBhbiBleHBlY3RlZCByZXN0b3JlIGZhaWx1cmUuCiAgICAgICAgIEFMT0dXX0lGKCEoKGlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpIHx8IG1Eb05vdFJlY29ubmVjdCkgJiYgc3RhdHVzID09IERFQURfT0JKRUNUKSwKLSAgICAgICAgICAgICAgICAiYXBwbHlWb2x1bWVTaGFwZXIgZmFpbGVkOiAlZCIsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgIiVzKCVkKTogYXBwbHlWb2x1bWVTaGFwZXIgZmFpbGVkOiAlZCIsIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0dXMpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtMjQ0OSw3ICsyNTE1LDggQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyAvLyBub3Qgc3VwcG9ydGVkCiAgICAgfQogICAgIHN0YXR1c190IHN0YXR1cyA9IG1Qcm94eS0+Z2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdGF0dXMgIT0gT0ssICJzdGF0dXMgJWQgbm90IGFsbG93ZWQgZnJvbSBwcm94eSBnZXRUaW1lc3RhbXAiLCBzdGF0dXMpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RhdHVzICE9IE9LLCAiJXMoJWQpOiBzdGF0dXMgJWQgbm90IGFsbG93ZWQgZnJvbSBwcm94eSBnZXRUaW1lc3RhbXAiLAorICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXR1cyk7CiAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwogICAgIHRpbWVzdGFtcC0+bVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9DTElFTlRdID0gbUZyYW1lc1dyaXR0ZW47CiAgICAgdGltZXN0YW1wLT5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9DTElFTlRdID0gMDsKQEAgLTI0OTIsNyArMjU1OSw4IEBACiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7IC8vIG9mZmxvYWRlZCB0cmFja3MgaGFuZGxlZCBiZWxvdwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkludmFsaWQgbVN0YXRlIGluIGdldFRpbWVzdGFtcCgpOiAlZCIsIG1TdGF0ZSk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzKCVkKTogSW52YWxpZCBtU3RhdGUgaW4gZ2V0VGltZXN0YW1wKCk6ICVkIiwKKyAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBtU3RhdGUpOwogICAgICAgICBicmVhazsKICAgICB9CiAKQEAgLTI1MjYsNyArMjU5NCw4IEBACiAgICAgICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlIHdlIGFkanVzdCB0aGUgcG9zaXRpb24gZnJvbSB0aGUgcHJldmlvdXMgY29tcHV0ZWQgbGF0ZW5jeS4KICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gPT0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUikgewogICAgICAgICAgICAgICAgICAgICBBTE9HV19JRihtUHJldmlvdXNMb2NhdGlvbiA9PSBFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXRUaW1lc3RhbXAoKSBsb2NhdGlvbiBtb3ZlZCBmcm9tIGtlcm5lbCB0byBzZXJ2ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoJWQpOiBsb2NhdGlvbiBtb3ZlZCBmcm9tIGtlcm5lbCB0byBzZXJ2ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgbGFzdCBrZXJuZWwgT0sgdGltZSBpbmZvIGV4aXN0cyBhbmQgdGhlIHBvc2l0aW9ucwogICAgICAgICAgICAgICAgICAgICAvLyBhcmUgdmFsaWQgKGlmIHRoZXkgcHJlZGF0ZSB0aGUgY3VycmVudCB0cmFjaywgdGhlIHBvc2l0aW9ucyBtYXkKICAgICAgICAgICAgICAgICAgICAgLy8gYmUgemVybyBvciBuZWdhdGl2ZSkuCkBAIC0yNTQxLDggKzI2MTAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXRzLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSX0xBU1RLRVJORUxPS10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGV0cy5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF9MQVNUS0VSTkVMT0tdKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImZyYW1lIGFkanVzdG1lbnQ6JWxsZCAgdGltZXN0YW1wOiVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWZyYW1lcywgZXRzLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IGZyYW1lIGFkanVzdG1lbnQ6JWxsZCAgdGltZXN0YW1wOiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgKGxvbmcgbG9uZylmcmFtZXMsIGV0cy50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVzID49IGV0cy5tUG9zaXRpb25bbG9jYXRpb25dKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uID0gMDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTI1NTAsNyArMjYxOSwyNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsb2NhdGlvbiA9PSBFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWX0lGKG1QcmV2aW91c0xvY2F0aW9uID09IEV4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldFRpbWVzdGFtcCgpIGxvY2F0aW9uIG1vdmVkIGZyb20gc2VydmVyIHRvIGtlcm5lbCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyglZCk6IGxvY2F0aW9uIG1vdmVkIGZyb20gc2VydmVyIHRvIGtlcm5lbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChldHMubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRzLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gUSwgd2UgZG9uJ3QgcmV0dXJuIGVycm9ycyBhcyBhbiBpbnZhbGlkIHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIGxlYXZlIHRoZSBsYXN0IGtlcm5lbCBnb29kIHRpbWVzdGFtcCBhbG9uZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBzZXJ2ZXIgaXMgaWRlbnRpY2FsIHRvIGtlcm5lbCwgdGhlIGRldmljZSBkYXRhIHBpcGVsaW5lIGlzIGlkbGUuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGJldHRlciBzdGFydCB0aW1lIGlzIG5vdy4gIFRoZSByZXRyb2dyYWRlIGNoZWNrIGVuc3VyZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRpbWVzdGFtcCBtb25vdG9uaWNpdHkuCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IG5vd05zID0gc3lzdGVtVGltZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtVGltZXN0YW1wU3RhbGxSZXBvcnRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCIlcyglZCk6IGRldmljZSBzdGFsbCB0aW1lIGNvcnJlY3RlZCB1c2luZyBjdXJyZW50IHRpbWUgJWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgKGxvbmcgbG9uZylub3dOcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFN0YWxsUmVwb3J0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lID0gY29udmVydE5zVG9UaW1lc3BlYyhub3dOcyk7CisgICAgICAgICAgICAgICAgICAgIH0gIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFN0YWxsUmVwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIFdlIHVwZGF0ZSB0aGUgdGltZXN0YW1wIHRpbWUgZXZlbiB3aGVuIHBhdXNlZC4KQEAgLTI1NzQsNyArMjY2Myw3IEBACiAgICAgICAgICAgICAgICAgbVByZXZpb3VzTG9jYXRpb24gPSBsb2NhdGlvbjsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gcmlnaHQgYWZ0ZXIgQXVkaW9UcmFjayBpcyBzdGFydGVkLCBvbmUgbWF5IG5vdCBmaW5kIGEgdGltZXN0YW1wCi0gICAgICAgICAgICAgICAgQUxPR1YoImdldEJlc3RUaW1lc3RhbXAgZGlkIG5vdCBmaW5kIHRpbWVzdGFtcCIpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IGdldEJlc3RUaW1lc3RhbXAgZGlkIG5vdCBmaW5kIHRpbWVzdGFtcCIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoc3RhdHVzID09IElOVkFMSURfT1BFUkFUSU9OKSB7CkBAIC0yNTg0LDcgKzI2NzMsOCBAQAogICAgICAgICAgICAgLy8gdG8gYmUgemVybyB3ZSBjb252ZXJ0IHRoaXMgdG8gV09VTERfQkxPQ0sgKHdpdGggdGhlIGltcGxpY2l0IG1lYW5pbmcgb2YKICAgICAgICAgICAgIC8vICJ6ZXJvIiBmb3IgTnVQbGF5ZXIpLiAgV2UgZG9uJ3QgY29udmVydCBmb3IgdHJhY2sgcmVzdG9yYXRpb24gYXMgcG9zaXRpb24KICAgICAgICAgICAgIC8vIGRvZXMgbm90IHJlc2V0LgotICAgICAgICAgICAgQUxPR1YoInRpbWVzdGFtcCBzZXJ2ZXIgb2Zmc2V0OiVsbGQgcmVzdG9yZSBmcmFtZXM6JWxsZCIsCisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiB0aW1lc3RhbXAgc2VydmVyIG9mZnNldDolbGxkIHJlc3RvcmUgZnJhbWVzOiVsbGQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltRnJhbWVzV3JpdHRlblNlcnZlck9mZnNldCwgKGxvbmcgbG9uZyltRnJhbWVzV3JpdHRlbkF0UmVzdG9yZSk7CiAgICAgICAgICAgICBpZiAobUZyYW1lc1dyaXR0ZW5TZXJ2ZXJPZmZzZXQgIT0gbUZyYW1lc1dyaXR0ZW5BdFJlc3RvcmUpIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBXT1VMRF9CTE9DSzsKQEAgLTI1OTIsNyArMjY4Miw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HVl9JRihzdGF0dXMgIT0gV09VTERfQkxPQ0ssICJnZXRUaW1lc3RhbXAgZXJyb3I6JSN4Iiwgc3RhdHVzKTsKKyAgICAgICAgQUxPR1ZfSUYoc3RhdHVzICE9IFdPVUxEX0JMT0NLLCAiJXMoJWQpOiBnZXRUaW1lc3RhbXAgZXJyb3I6JSN4IiwgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0X2woKSkgewpAQCAtMjYzMSw4ICsyNzIxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhlIHN0YXJ0IHRpbWUuICBJZiBncmVhdGVyLCB0aGVuIHRoYXQgbWVhbnMgd2UgbWF5IGhhdmUgZmFpbGVkCiAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGNvbXBsZXRlbHkgZmx1c2ggb3Igc3RvcCB0aGUgcHJldmlvdXMgcGxheWluZyB0cmFjay4KICAgICAgICAgICAgICAgICAgICAgQUxPR1dfSUYoIW1UaW1lc3RhbXBTdGFydHVwR2xpdGNoUmVwb3J0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldFRpbWVzdGFtcCBzdGFydHVwIGdsaXRjaCBkZXRlY3RlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoJWQpOiBzdGFydHVwIGdsaXRjaCBkZXRlY3RlZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRlbHRhVGltZVVzKCVsbGQpIGRlbHRhUG9zaXRpb25VcyglbGxkKSB0c21Qb3NpdGlvbigldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZGVsdGFUaW1lVXMsIChsb25nIGxvbmcpZGVsdGFQb3NpdGlvbkJ5VXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbik7CiAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBTdGFydHVwR2xpdGNoUmVwb3J0ZWQgPSB0cnVlOwpAQCAtMjY4NiwzMyArMjc3Nyw0OSBAQAogICAgIC8vIFByZXZlbnQgcmV0cm9ncmFkZSBtb3Rpb24gaW4gdGltZXN0YW1wLgogICAgIC8vIFRoaXMgaXMgc29tZXRpbWVzIGNhdXNlZCBieSBlcnJhdGljIHJlcG9ydHMgb2YgdGhlIGF2YWlsYWJsZSBzcGFjZSBpbiB0aGUgQUxTQSBkcml2ZXJzLgogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgLy8gRml4IHN0YWxlIHRpbWUgd2hlbiBjaGVja2luZyB0aW1lc3RhbXAgcmlnaHQgYWZ0ZXIgc3RhcnQoKS4KKyAgICAgICAgLy8gVGhlIHBvc2l0aW9uIGlzIGF0IHRoZSBsYXN0IHJlcG9ydGVkIGxvY2F0aW9uIGJ1dCB0aGUgdGltZSBjYW4gYmUgc3RhbGUKKyAgICAgICAgLy8gZHVlIHRvIHBhdXNlIG9yIHN0YW5kYnkgb3IgY29sZCBzdGFydCBsYXRlbmN5LgorICAgICAgICAvLworICAgICAgICAvLyBXZSBrZWVwIGFkdmFuY2luZyB0aGUgdGltZSAoYnV0IG5vdCB0aGUgcG9zaXRpb24pIHRvIGVuc3VyZSB0aGF0IHRoZQorICAgICAgICAvLyBzdGFsZSB2YWx1ZSBkb2VzIG5vdCBjb25mdXNlIHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gRm9yIG9mZmxvYWQgY29tcGF0aWJpbGl0eSwgdXNlIGEgZGVmYXVsdCBsYWcgdmFsdWUgaGVyZS4KKyAgICAgICAgLy8gQW55IHRpbWUgZGlzY3JlcGFuY3kgYmV0d2VlbiB0aGlzIHVwZGF0ZSBhbmQgdGhlIHBhdXNlIHRpbWVzdGFtcCBpcyBoYW5kbGVkCisgICAgICAgIC8vIGJ5IHRoZSByZXRyb2dyYWRlIGNoZWNrIGFmdGVyd2FyZHMuCisgICAgICAgIGludDY0X3QgY3VycmVudFRpbWVOYW5vcyA9IGF1ZGlvX3V0aWxzX25zX2Zyb21fdGltZXNwZWMoJnRpbWVzdGFtcC5tVGltZSk7CisgICAgICAgIGNvbnN0IGludDY0X3QgbGFnTnMgPSBpbnQ2NF90KG1BZkxhdGVuY3kgKiAxMDAwMDAwTEwpOworICAgICAgICBjb25zdCBpbnQ2NF90IGxpbWl0TnMgPSBtU3RhcnROcyAtIGxhZ05zOworICAgICAgICBpZiAoY3VycmVudFRpbWVOYW5vcyA8IGxpbWl0TnMpIHsKKyAgICAgICAgICAgIGlmICghbVRpbWVzdGFtcFN0YWxlVGltZVJlcG9ydGVkKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIiVzKCVkKTogc3RhbGUgdGltZXN0YW1wIHRpbWUgY29ycmVjdGVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiY3VycmVudFRpbWVOYW5vczogJWxsZCA8IGxpbWl0TnM6ICVsbGQgPCBtU3RhcnROczogJWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpY3VycmVudFRpbWVOYW5vcywgKGxvbmcgbG9uZylsaW1pdE5zLCAobG9uZyBsb25nKW1TdGFydE5zKTsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wU3RhbGVUaW1lUmVwb3J0ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lID0gY29udmVydE5zVG9UaW1lc3BlYyhsaW1pdE5zKTsKKyAgICAgICAgICAgIGN1cnJlbnRUaW1lTmFub3MgPSBsaW1pdE5zOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVRpbWVzdGFtcFN0YWxlVGltZVJlcG9ydGVkID0gZmFsc2U7CisgICAgICAgIH0KKwogICAgICAgICAvLyBwcmV2aW91c1RpbWVzdGFtcFZhbGlkIGlzIHNldCB0byBmYWxzZSB3aGVuIHN0YXJ0aW5nIGFmdGVyIGEgc3RvcCBvciBmbHVzaC4KICAgICAgICAgaWYgKHByZXZpb3VzVGltZXN0YW1wVmFsaWQpIHsKICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgcHJldmlvdXNUaW1lTmFub3MgPQogICAgICAgICAgICAgICAgICAgICBhdWRpb191dGlsc19uc19mcm9tX3RpbWVzcGVjKCZtUHJldmlvdXNUaW1lc3RhbXAubVRpbWUpOwotICAgICAgICAgICAgaW50NjRfdCBjdXJyZW50VGltZU5hbm9zID0gYXVkaW9fdXRpbHNfbnNfZnJvbV90aW1lc3BlYygmdGltZXN0YW1wLm1UaW1lKTsKLQotICAgICAgICAgICAgLy8gRml4IHN0YWxlIHRpbWUgd2hlbiBjaGVja2luZyB0aW1lc3RhbXAgcmlnaHQgYWZ0ZXIgc3RhcnQoKS4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBGb3Igb2ZmbG9hZCBjb21wYXRpYmlsaXR5LCB1c2UgYSBkZWZhdWx0IGxhZyB2YWx1ZSBoZXJlLgotICAgICAgICAgICAgLy8gQW55IHRpbWUgZGlzY3JlcGFuY3kgYmV0d2VlbiB0aGlzIHVwZGF0ZSBhbmQgdGhlIHBhdXNlIHRpbWVzdGFtcCBpcyBoYW5kbGVkCi0gICAgICAgICAgICAvLyBieSB0aGUgcmV0cm9ncmFkZSBjaGVjayBhZnRlcndhcmRzLgotICAgICAgICAgICAgY29uc3QgaW50NjRfdCBsYWdOcyA9IGludDY0X3QobUFmTGF0ZW5jeSAqIDEwMDAwMDBMTCk7Ci0gICAgICAgICAgICBjb25zdCBpbnQ2NF90IGxpbWl0TnMgPSBtU3RhcnROcyAtIGxhZ05zOwotICAgICAgICAgICAgaWYgKGN1cnJlbnRUaW1lTmFub3MgPCBsaW1pdE5zKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0QoImNvcnJlY3RpbmcgdGltZXN0YW1wIHRpbWUgZm9yIHBhdXNlLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiY3VycmVudFRpbWVOYW5vczogJWxsZCA8IGxpbWl0TnM6ICVsbGQgPCBtU3RhcnROczogJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWN1cnJlbnRUaW1lTmFub3MsIChsb25nIGxvbmcpbGltaXROcywgKGxvbmcgbG9uZyltU3RhcnROcyk7Ci0gICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lID0gY29udmVydE5zVG9UaW1lc3BlYyhsaW1pdE5zKTsKLSAgICAgICAgICAgICAgICBjdXJyZW50VGltZU5hbm9zID0gbGltaXROczsKLSAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gcmV0cm9ncmFkZSBjaGVjawogICAgICAgICAgICAgaWYgKGN1cnJlbnRUaW1lTmFub3MgPCBwcmV2aW91c1RpbWVOYW5vcykgewotICAgICAgICAgICAgICAgIEFMT0dXKCJyZXRyb2dyYWRlIHRpbWVzdGFtcCB0aW1lIGNvcnJlY3RlZCwgJWxsZCA8ICVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyljdXJyZW50VGltZU5hbm9zLCAobG9uZyBsb25nKXByZXZpb3VzVGltZU5hbm9zKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1UaW1lc3RhbXBSZXRyb2dyYWRlVGltZVJlcG9ydGVkKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IHJldHJvZ3JhZGUgdGltZXN0YW1wIHRpbWUgY29ycmVjdGVkLCAlbGxkIDwgJWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyljdXJyZW50VGltZU5hbm9zLCAobG9uZyBsb25nKXByZXZpb3VzVGltZU5hbm9zKTsKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFJldHJvZ3JhZGVUaW1lUmVwb3J0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWUgPSBtUHJldmlvdXNUaW1lc3RhbXAubVRpbWU7Ci0gICAgICAgICAgICAgICAgLy8gY3VycmVudFRpbWVOYW5vcyBub3QgdXNlZCBiZWxvdy4KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFJldHJvZ3JhZGVUaW1lUmVwb3J0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gTG9va2luZyBhdCBzaWduZWQgZGVsdGEgd2lsbCB3b3JrIGV2ZW4gd2hlbiB0aGUgdGltZXN0YW1wcwpAQCAtMjcyMSwxNSArMjgyOCwxNiBAQAogICAgICAgICAgICAgICAgICAgICAtIG1QcmV2aW91c1RpbWVzdGFtcC5tUG9zaXRpb24pLnNpZ25lZFZhbHVlKCk7CiAgICAgICAgICAgICBpZiAoZGVsdGFQb3NpdGlvbiA8IDApIHsKICAgICAgICAgICAgICAgICAvLyBPbmx5IHJlcG9ydCBvbmNlIHBlciBwb3NpdGlvbiBpbnN0ZWFkIG9mIHNwYW1taW5nIHRoZSBsb2cuCi0gICAgICAgICAgICAgICAgaWYgKCFtUmV0cm9ncmFkZU1vdGlvblJlcG9ydGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJyZXRyb2dyYWRlIHRpbWVzdGFtcCBwb3NpdGlvbiBjb3JyZWN0ZWQsICVkID0gJXUgLSAldSIsCisgICAgICAgICAgICAgICAgaWYgKCFtVGltZXN0YW1wUmV0cm9ncmFkZVBvc2l0aW9uUmVwb3J0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogcmV0cm9ncmFkZSB0aW1lc3RhbXAgcG9zaXRpb24gY29ycmVjdGVkLCAlZCA9ICV1IC0gJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNUaW1lc3RhbXAubVBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgbVJldHJvZ3JhZGVNb3Rpb25SZXBvcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBSZXRyb2dyYWRlUG9zaXRpb25SZXBvcnRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUmV0cm9ncmFkZU1vdGlvblJlcG9ydGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFJldHJvZ3JhZGVQb3NpdGlvblJlcG9ydGVkID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZGVsdGFQb3NpdGlvbiA8IDApIHsKICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uID0gbVByZXZpb3VzVGltZXN0YW1wLm1Qb3NpdGlvbjsKQEAgLTI3NDIsNyArMjg1MCw4IEBACiAgICAgICAgICAgICBpZiAoZGVsdGFUaW1lICE9IDApIHsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGNvbXB1dGVkU2FtcGxlUmF0ZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVBvc2l0aW9uICogKGxvbmcgbG9uZylOQU5PU19QRVJfU0VDT05EIC8gZGVsdGFUaW1lOwotICAgICAgICAgICAgICAgIEFMT0dEKCJjb21wdXRlZFNhbXBsZVJhdGU6JXUgIHNhbXBsZVJhdGU6JXUiLAorICAgICAgICAgICAgICAgIEFMT0dEKCIlcyglZCk6IGNvbXB1dGVkU2FtcGxlUmF0ZToldSAgc2FtcGxlUmF0ZToldSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCljb21wdXRlZFNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlKTsKICAgICAgICAgICAgIH0KICNlbmRpZgpAQCAtMjc4OCwxMSArMjg5NywxMiBAQAogICAgIFN0cmluZzggcmVzdWx0OwogCiAgICAgcmVzdWx0LmFwcGVuZCgiIEF1ZGlvVHJhY2s6OmR1bXBcbiIpOwotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgc3RhdHVzKCVkKSwgc3RhdGUoJWQpLCBzZXNzaW9uIElkKCVkKSwgZmxhZ3MoJSN4KVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXMsIG1TdGF0ZSwgbVNlc3Npb25JZCwgbUZsYWdzKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIGlkKCVkKSBzdGF0dXMoJWQpLCBzdGF0ZSglZCksIHNlc3Npb24gSWQoJWQpLCBmbGFncyglI3gpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbVBvcnRJZCwgbVN0YXR1cywgbVN0YXRlLCBtU2Vzc2lvbklkLCBtRmxhZ3MpOwogICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgc3RyZWFtIHR5cGUoJWQpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKCVmLCAlZilcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAobVN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZSgmbUF0dHJpYnV0ZXMpIDogbVN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmF0dHJpYnV0ZXNUb1N0cmVhbVR5cGUobUF0dHJpYnV0ZXMpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVbQVVESU9fSU5URVJMRUFWRV9MRUZUXSwgbVZvbHVtZVtBVURJT19JTlRFUkxFQVZFX1JJR0hUXSk7CiAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBmb3JtYXQoJSN4KSwgY2hhbm5lbCBtYXNrKCUjeCksIGNoYW5uZWwgY291bnQoJXUpXG4iLAogICAgICAgICAgICAgICAgICAgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLCBtQ2hhbm5lbENvdW50KTsKQEAgLTI4MzAsMjIgKzI5NDAsMjMgQEAKIAogc3RhdHVzX3QgQXVkaW9UcmFjazo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKQogeworCiAgICAgaWYgKGNhbGxiYWNrID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzIGFkZGluZyBOVUxMIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IGFkZGluZyBOVUxMIGNhbGxiYWNrISIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sudW5zYWZlX2dldCgpID09IGNhbGxiYWNrLmdldCgpKSB7Ci0gICAgICAgIEFMT0dXKCIlcyBhZGRpbmcgc2FtZSBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBBTE9HVygiJXMoJWQpOiBhZGRpbmcgc2FtZSBjYWxsYmFjayEiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgaWYgKG1PdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiJXMgY2FsbGJhY2sgYWxyZWFkeSBwcmVzZW50ISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtT3V0cHV0KTsKKyAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IGNhbGxiYWNrIGFscmVhZHkgcHJlc2VudCEiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtT3V0cHV0LCBtUG9ydElkKTsKICAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtT3V0cHV0KTsKKyAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbU91dHB1dCwgbVBvcnRJZCk7CiAgICAgfQogICAgIG1EZXZpY2VDYWxsYmFjayA9IGNhbGxiYWNrOwogICAgIHJldHVybiBzdGF0dXM7CkBAIC0yODU1LDcgKzI5NjYsNyBAQAogICAgICAgICBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKQogewogICAgIGlmIChjYWxsYmFjayA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlcyByZW1vdmluZyBOVUxMIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IHJlbW92aW5nIE5VTEwgY2FsbGJhY2shIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CkBAIC0yODY1LDcgKzI5NzYsNyBAQAogICAgIH0KICAgICBtRGV2aWNlQ2FsbGJhY2suY2xlYXIoKTsKICAgICBpZiAobU91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtT3V0cHV0KTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbU91dHB1dCwgbVBvcnRJZCk7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTI4ODcsNiArMjk5OCw3IEBACiAgICAgICAgICAgICBtUm91dGVkRGV2aWNlSWQgPSBkZXZpY2VJZDsKICAgICAgICAgfQogICAgIH0KKwogICAgIGlmIChjYWxsYmFjay5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgIGNhbGxiYWNrLT5vbkF1ZGlvRGV2aWNlVXBkYXRlKG1PdXRwdXQsIG1Sb3V0ZWREZXZpY2VJZCk7CiAgICAgfQpAQCAtMjk1Nyw3ICszMDY5LDcgQEAKICAgICAgICAgaWYgKG1Qcm94eS0+Z2V0U3RyZWFtRW5kRG9uZSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQotICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgY2FzZSBTVEFURV9BQ1RJVkU6CiAgICAgY2FzZSBTVEFURV9TVE9QUElORzoKICAgICAgICAgYnJlYWs7CkBAIC0yOTY2LDcgKzMwNzgsNyBAQAogICAgIGNhc2UgU1RBVEVfRkxVU0hFRDoKICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gd2UncmUgbm90IGFjdGl2ZQogICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkludmFsaWQgbVN0YXRlIGluIGhhc1N0YXJ0ZWQoKTogJWQiLCBtU3RhdGUpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyglZCk6IEludmFsaWQgbVN0YXRlIGluIGhhc1N0YXJ0ZWQoKTogJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgbVN0YXRlKTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogCkBAIC0yOTgyLDcgKzMwOTQsOCBAQAogICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBPSykgewogICAgICAgICAgICAgd2FpdCA9ICh0cy5tUG9zaXRpb24gPT0gMCB8fCB0cy5tUG9zaXRpb24gPT0gbVN0YXJ0VHMubVBvc2l0aW9uKTsKICAgICAgICAgfQotICAgICAgICBBTE9HVigiaGFzU3RhcnRlZCB3YWl0OiVkICB0czoldSAgc3RhcnQgcG9zaXRpb246JWxsZCIsCisgICAgICAgIEFMT0dWKCIlcyglZCk6IGhhc1N0YXJ0ZWQgd2FpdDolZCAgdHM6JXUgIHN0YXJ0IHBvc2l0aW9uOiVsbGQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgIChpbnQpd2FpdCwKICAgICAgICAgICAgICAgICB0cy5tUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltU3RhcnRUcy5tUG9zaXRpb24pOwpAQCAtMzAwMyw3ICszMTE2LDggQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBBTE9HVigiaGFzU3RhcnRlZCB3YWl0OiVkICBldHM6JWxsZCAgc3RhcnQgcG9zaXRpb246JWxsZCIsCisgICAgICAgIEFMT0dWKCIlcyglZCk6IGhhc1N0YXJ0ZWQgd2FpdDolZCAgZXRzOiVsbGQgIHN0YXJ0IHBvc2l0aW9uOiVsbGQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgIChpbnQpd2FpdCwKICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWV0cy5tUG9zaXRpb25bbG9jYXRpb25dLAogICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbVN0YXJ0RXRzLm1Qb3NpdGlvbltsb2NhdGlvbl0pOwpAQCAtMzAyNCw4ICszMTM4LDkgQEAKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1BdWRpb1RyYWNrOjpBdWRpb1RyYWNrVGhyZWFkOjpBdWRpb1RyYWNrVGhyZWFkKEF1ZGlvVHJhY2smIHJlY2VpdmVyLCBib29sIGJDYW5DYWxsSmF2YSkKLSAgICA6IFRocmVhZChiQ2FuQ2FsbEphdmEpLCBtUmVjZWl2ZXIocmVjZWl2ZXIpLCBtUGF1c2VkKHRydWUpLCBtUGF1c2VkSW50KGZhbHNlKSwgbVBhdXNlZE5zKDBMTCksCitBdWRpb1RyYWNrOjpBdWRpb1RyYWNrVGhyZWFkOjpBdWRpb1RyYWNrVGhyZWFkKEF1ZGlvVHJhY2smIHJlY2VpdmVyKQorICAgIDogVGhyZWFkKHRydWUgLyogYkNhbkNhbGxKYXZhICovKSAgLy8gYmluZGVyIHJlY3Vyc2lvbiBvbiByZXN0b3JlVHJhY2tfbCgpIG1heSBjYWxsIEphdmEuCisgICAgLCBtUmVjZWl2ZXIocmVjZWl2ZXIpLCBtUGF1c2VkKHRydWUpLCBtUGF1c2VkSW50KGZhbHNlKSwgbVBhdXNlZE5zKDBMTCksCiAgICAgICBtSWdub3JlTmV4dFBhdXNlZEludChmYWxzZSkKIHsKIH0KQEAgLTMwNzYsOSArMzE5MSwxMCBAQAogICAgIGNhc2UgTlNfV0hFTkVWRVI6CiAgICAgICAgIC8vIEV2ZW50IGRyaXZlbjogY2FsbCB3YWtlKCkgd2hlbiBjYWxsYmFjayBub3RpZmljYXRpb25zIGNvbmRpdGlvbnMgY2hhbmdlLgogICAgICAgICBucyA9IElOVDY0X01BWDsKLSAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobnMgPCAwLCAicHJvY2Vzc0F1ZGlvQnVmZmVyKCkgcmV0dXJuZWQgJSIgUFJJZDY0LCBucyk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobnMgPCAwLCAiJXMoJWQpOiBwcm9jZXNzQXVkaW9CdWZmZXIoKSByZXR1cm5lZCAlbGxkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVJlY2VpdmVyLm1Qb3J0SWQsIChsb25nIGxvbmcpbnMpOwogICAgICAgICBwYXVzZUludGVybmFsKG5zKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFja1NoYXJlZC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcAppbmRleCBkY2VkM2M0Li5lZTZjMzM1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcApAQCAtMTcsOCArMTcsMTAgQEAKICNkZWZpbmUgTE9HX1RBRyAiQXVkaW9UcmFja1NoYXJlZCIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9zYWZlX21hdGguaD4KIAogI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CiAjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KQEAgLTE4NSw3ICsxODcsNyBAQAogICAgICAgICAgICAgZnJvbnQgPSBjYmxrLT51Lm1TdHJlYW1pbmcubUZyb250OwogICAgICAgICB9CiAgICAgICAgIC8vIHdyaXRlIHRvIHJlYXIsIHJlYWQgZnJvbSBmcm9udAotICAgICAgICBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBmcm9udDsKKyAgICAgICAgc3NpemVfdCBmaWxsZWQgPSBhdWRpb191dGlsczo6c2FmZV9zdWJfb3ZlcmZsb3cocmVhciwgZnJvbnQpOwogICAgICAgICAvLyBwaXBlIHNob3VsZCBub3QgYmUgb3ZlcmZ1bGwKICAgICAgICAgaWYgKCEoMCA8PSBmaWxsZWQgJiYgKHNpemVfdCkgZmlsbGVkIDw9IG1GcmFtZUNvdW50KSkgewogICAgICAgICAgICAgaWYgKG1Jc091dCkgewpAQCAtMjQ3LDcgKzI0OSw3IEBACiAgICAgICAgICAgICAgICAgdHMgPSByZXF1ZXN0ZWQ7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgICAgICBjYXNlIFRJTUVPVVRfQ09OVElOVUU6CiAgICAgICAgICAgICAvLyBGSVhNRSB3ZSBkbyBub3QgcmV0cnkgaWYgcmVxdWVzdGVkIDwgMTBtcz8gbmVlZHMgZG9jdW1lbnRhdGlvbiBvbiB0aGlzIHN0YXRlIG1hY2hpbmUKICAgICAgICAgICAgIGlmICghbWVhc3VyZSB8fCByZXF1ZXN0ZWQtPnR2X3NlYyA8IHRvdGFsLnR2X3NlYyB8fApAQCAtMjg2LDcgKzI4OCw4IEBACiAgICAgICAgICAgICAgICAgc3RydWN0IHRpbWVzcGVjIGFmdGVyOwogICAgICAgICAgICAgICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmYWZ0ZXIpOwogICAgICAgICAgICAgICAgIHRvdGFsLnR2X3NlYyArPSBhZnRlci50dl9zZWMgLSBiZWZvcmUudHZfc2VjOwotICAgICAgICAgICAgICAgIGxvbmcgZGVsdGFOcyA9IGFmdGVyLnR2X25zZWMgLSBiZWZvcmUudHZfbnNlYzsKKyAgICAgICAgICAgICAgICAvLyBVc2UgYXV0byBpbnN0ZWFkIG9mIGxvbmcgdG8gYXZvaWQgdGhlIGdvb2dsZS1ydW50aW1lLWludCB3YXJuaW5nLgorICAgICAgICAgICAgICAgIGF1dG8gZGVsdGFOcyA9IGFmdGVyLnR2X25zZWMgLSBiZWZvcmUudHZfbnNlYzsKICAgICAgICAgICAgICAgICBpZiAoZGVsdGFOcyA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgZGVsdGFOcyArPSAxMDAwMDAwMDAwOwogICAgICAgICAgICAgICAgICAgICB0b3RhbC50dl9zZWMtLTsKQEAgLTUwNCw3ICs1MDcsNyBAQAogICAgICAgICAgICAgICAgIHRzID0gcmVxdWVzdGVkOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICAgICAgY2FzZSBUSU1FT1VUX0NPTlRJTlVFOgogICAgICAgICAgICAgLy8gRklYTUUgd2UgZG8gbm90IHJldHJ5IGlmIHJlcXVlc3RlZCA8IDEwbXM/IG5lZWRzIGRvY3VtZW50YXRpb24gb24gdGhpcyBzdGF0ZSBtYWNoaW5lCiAgICAgICAgICAgICBpZiAocmVxdWVzdGVkLT50dl9zZWMgPCB0b3RhbC50dl9zZWMgfHwKQEAgLTY4Miw3ICs2ODUsNyBAQAogICAgICAgICBjb25zdCBzaXplX3Qgb3ZlcmZsb3dCaXQgPSBtRnJhbWVDb3VudFAyIDw8IDE7CiAgICAgICAgIGNvbnN0IHNpemVfdCBtYXNrID0gb3ZlcmZsb3dCaXQgLSAxOwogICAgICAgICBpbnQzMl90IG5ld0Zyb250ID0gKGZyb250ICYgfm1hc2spIHwgKGZsdXNoICYgbWFzayk7Ci0gICAgICAgIHNzaXplX3QgZmlsbGVkID0gcmVhciAtIG5ld0Zyb250OworICAgICAgICBzc2l6ZV90IGZpbGxlZCA9IGF1ZGlvX3V0aWxzOjpzYWZlX3N1Yl9vdmVyZmxvdyhyZWFyLCBuZXdGcm9udCk7CiAgICAgICAgIGlmIChmaWxsZWQgPj0gKHNzaXplX3Qpb3ZlcmZsb3dCaXQpIHsKICAgICAgICAgICAgIC8vIGZyb250IGFuZCByZWFyIG9mZnNldHMgc3BhbiB0aGUgb3ZlcmZsb3cgYml0IG9mIHRoZSBwMiBtYXNrCiAgICAgICAgICAgICAvLyBzbyByZWJhc2luZyBuZXdGcm9udCBvbiB0aGUgZnJvbnQgb2Zmc2V0IGlzIG9mZiBieSB0aGUgb3ZlcmZsb3cgYml0LgpAQCAtNzI0LDcgKzcyNyw3IEBACiAgICAgICAgIGNvbnN0IHNpemVfdCBvdmVyZmxvd0JpdCA9IG1GcmFtZUNvdW50UDIgPDwgMTsKICAgICAgICAgY29uc3Qgc2l6ZV90IG1hc2sgPSBvdmVyZmxvd0JpdCAtIDE7CiAgICAgICAgIGludDMyX3QgbmV3UmVhciA9IChyZWFyICYgfm1hc2spIHwgKHN0b3AgJiBtYXNrKTsKLSAgICAgICAgc3NpemVfdCBmaWxsZWQgPSBuZXdSZWFyIC0gZnJvbnQ7CisgICAgICAgIHNzaXplX3QgZmlsbGVkID0gYXVkaW9fdXRpbHM6OnNhZmVfc3ViX292ZXJmbG93KG5ld1JlYXIsIGZyb250KTsKICAgICAgICAgLy8gb3ZlcmZsb3dCaXQgaXMgdW5zaWduZWQsIHNvIGNhc3QgdG8gc2lnbmVkIGZvciBjb21wYXJpc29uLgogICAgICAgICBpZiAoZmlsbGVkID49IChzc2l6ZV90KW92ZXJmbG93Qml0KSB7CiAgICAgICAgICAgICAvLyBmcm9udCBhbmQgcmVhciBvZmZzZXRzIHNwYW4gdGhlIG92ZXJmbG93IGJpdCBvZiB0aGUgcDIgbWFzawpAQCAtNzc2LDcgKzc3OSw3IEBACiAgICAgICAgIGZyb250ID0gYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZjYmxrLT51Lm1TdHJlYW1pbmcubUZyb250KTsKICAgICAgICAgcmVhciA9IGNibGstPnUubVN0cmVhbWluZy5tUmVhcjsKICAgICB9Ci0gICAgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gZnJvbnQ7CisgICAgc3NpemVfdCBmaWxsZWQgPSBhdWRpb191dGlsczo6c2FmZV9zdWJfb3ZlcmZsb3cocmVhciwgZnJvbnQpOwogICAgIC8vIHBpcGUgc2hvdWxkIG5vdCBhbHJlYWR5IGJlIG92ZXJmdWxsCiAgICAgaWYgKCEoMCA8PSBmaWxsZWQgJiYgKHNpemVfdCkgZmlsbGVkIDw9IG1GcmFtZUNvdW50KSkgewogICAgICAgICBBTE9HRSgiU2hhcmVkIG1lbW9yeSBjb250cm9sIGJsb2NrIGlzIGNvcnJ1cHQgKGZpbGxlZD0lemQsIG1GcmFtZUNvdW50PSV6dSk7IHNodXR0aW5nIGRvd24iLApAQCAtOTAzLDcgKzkwNiw3IEBACiAgICAgICAgIHJldHVybiBtRnJhbWVDb3VudDsKICAgICB9CiAgICAgY29uc3QgaW50MzJfdCByZWFyID0gZ2V0UmVhcigpOwotICAgIHNzaXplX3QgZmlsbGVkID0gcmVhciAtIGNibGstPnUubVN0cmVhbWluZy5tRnJvbnQ7CisgICAgc3NpemVfdCBmaWxsZWQgPSBhdWRpb191dGlsczo6c2FmZV9zdWJfb3ZlcmZsb3cocmVhciwgY2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udCk7CiAgICAgLy8gcGlwZSBzaG91bGQgbm90IGFscmVhZHkgYmUgb3ZlcmZ1bGwKICAgICBpZiAoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gbUZyYW1lQ291bnQpKSB7CiAgICAgICAgIEFMT0dFKCJTaGFyZWQgbWVtb3J5IGNvbnRyb2wgYmxvY2sgaXMgY29ycnVwdCAoZmlsbGVkPSV6ZCwgbUZyYW1lQ291bnQ9JXp1KTsgc2h1dHRpbmcgZG93biIsCkBAIC05MjksNyArOTMyLDcgQEAKICAgICAgICAgcmV0dXJuIG1GcmFtZUNvdW50OwogICAgIH0KICAgICBjb25zdCBpbnQzMl90IHJlYXIgPSBnZXRSZWFyKCk7Ci0gICAgY29uc3Qgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gY2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udDsKKyAgICBjb25zdCBzc2l6ZV90IGZpbGxlZCA9IGF1ZGlvX3V0aWxzOjpzYWZlX3N1Yl9vdmVyZmxvdyhyZWFyLCBjYmxrLT51Lm1TdHJlYW1pbmcubUZyb250KTsKICAgICBpZiAoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gbUZyYW1lQ291bnQpKSB7CiAgICAgICAgIHJldHVybiAwOyAvLyBlcnJvciBjb25kaXRpb24sIHNpbGVudGx5IHJldHVybiAwLgogICAgIH0KQEAgLTEyMzEsNiArMTIzNCwyMSBAQAogICAgIHJldHVybiAwOwogfQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKK3NpemVfdCBBdWRpb1JlY29yZFNlcnZlclByb3h5OjpmcmFtZXNSZWFkeVNhZmUoKSBjb25zdAoreworICAgIGlmIChtSXNTaHV0ZG93bikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgY29uc3QgaW50MzJfdCBmcm9udCA9IGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgmbUNibGstPnUubVN0cmVhbWluZy5tRnJvbnQpOworICAgIGNvbnN0IGludDMyX3QgcmVhciA9IG1DYmxrLT51Lm1TdHJlYW1pbmcubVJlYXI7CisgICAgY29uc3Qgc3NpemVfdCBmaWxsZWQgPSBhdWRpb191dGlsczo6c2FmZV9zdWJfb3ZlcmZsb3cocmVhciwgZnJvbnQpOworICAgIGlmICghKDAgPD0gZmlsbGVkICYmIChzaXplX3QpIGZpbGxlZCA8PSBtRnJhbWVDb3VudCkpIHsKKyAgICAgICAgcmV0dXJuIDA7IC8vIGVycm9yIGNvbmRpdGlvbiwgc2lsZW50bHkgcmV0dXJuIDAuCisgICAgfQorICAgIHJldHVybiBmaWxsZWQ7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiB9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVm9sdW1lR3JvdXAuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9Wb2x1bWVHcm91cC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc5YTM2MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVm9sdW1lR3JvdXAuY3BwCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvVm9sdW1lR3JvdXAiCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKworI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVm9sdW1lR3JvdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0F0dHJpYnV0ZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0dXNfdCBBdWRpb1ZvbHVtZUdyb3VwOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkKK3sKKyAgICBzdGF0dXNfdCByZXQgPSBwYXJjZWwtPnJlYWRVdGY4RnJvbVV0ZjE2KCZtTmFtZSk7CisgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICBtR3JvdXBJZCA9IHN0YXRpY19jYXN0PHZvbHVtZV9ncm91cF90PihwYXJjZWwtPnJlYWRJbnQzMigpKTsKKyAgICBzaXplX3Qgc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4ocGFyY2VsLT5yZWFkSW50MzIoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgQXVkaW9BdHRyaWJ1dGVzIGF0dHJpYnV0ZTsKKyAgICAgICAgYXR0cmlidXRlLnJlYWRGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgbUF1ZGlvQXR0cmlidXRlcy5wdXNoX2JhY2soYXR0cmlidXRlLmdldEF0dHJpYnV0ZXMoKSk7CisgICAgfQorICAgIHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBhcmNlbC0+cmVhZEludDMyKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gc3RhdGljX2Nhc3Q8YXVkaW9fc3RyZWFtX3R5cGVfdD4ocGFyY2VsLT5yZWFkSW50MzIoKSk7CisgICAgICAgIG1TdHJlYW1zLnB1c2hfYmFjayhzdHJlYW0pOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvVm9sdW1lR3JvdXA6OndyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0Cit7CisgICAgcGFyY2VsLT53cml0ZVV0ZjhBc1V0ZjE2KG1OYW1lKTsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obUdyb3VwSWQpKTsKKyAgICBzaXplX3Qgc2l6ZSA9IG1BdWRpb0F0dHJpYnV0ZXMuc2l6ZSgpOworICAgIHNpemVfdCBzaXplUG9zaXRpb24gPSBwYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihzaXplKTsKKyAgICBzaXplX3QgZmluYWxTaXplID0gc2l6ZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmF0dHJpYnV0ZXMgOiBtQXVkaW9BdHRyaWJ1dGVzKSB7CisgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IHBhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgICAgICAgIEF1ZGlvQXR0cmlidXRlcyBhdHRyaWJ1dGUoYXR0cmlidXRlcyk7CisgICAgICAgIHN0YXR1c190IHJldCA9IGF0dHJpYnV0ZS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CisgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHBhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGZpbmFsU2l6ZS0tOworICAgICAgICB9CisgICAgfQorICAgIGlmIChzaXplICE9IGZpbmFsU2l6ZSkgeworICAgICAgICBzaXplX3QgcG9zaXRpb24gPSBwYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICAgICAgICBwYXJjZWwtPnNldERhdGFQb3NpdGlvbihzaXplUG9zaXRpb24pOworICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoZmluYWxTaXplKTsKKyAgICAgICAgcGFyY2VsLT5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOworICAgIH0KKyAgICBwYXJjZWwtPndyaXRlSW50MzIobVN0cmVhbXMuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnN0cmVhbSA6IG1TdHJlYW1zKSB7CisgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihzdHJlYW0pKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9GbGluZ2VyLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwCmluZGV4IDlmM2I3NDIuLmRkOTVlMzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXIuY3BwCkBAIC0yNCwxMCArMjQsOCBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGN1dGlscy9tdWx0aXVzZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9UaW1lQ2hlY2suaD4KLSNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KLQorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgIklBdWRpb0ZsaW5nZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtODksNiArODcsOSBAQAogICAgIFNZU1RFTV9SRUFEWSwKICAgICBGUkFNRV9DT1VOVF9IQUwsCiAgICAgR0VUX01JQ1JPUEhPTkVTLAorICAgIFNFVF9NQVNURVJfQkFMQU5DRSwKKyAgICBHRVRfTUFTVEVSX0JBTEFOQ0UsCisgICAgU0VUX0VGRkVDVF9TVVNQRU5ERUQsCiB9OwogCiAjZGVmaW5lIE1BWF9JVEVNU19QRVJfTElTVCAxMDI0CkBAIC0yNDQsNiArMjQ1LDM0IEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKKyAgICBzdGF0dXNfdCBzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpIG92ZXJyaWRlCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlRmxvYXQoYmFsYW5jZSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfTUFTVEVSX0JBTEFOQ0UsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgIH0KKworICAgIHN0YXR1c190IGdldE1hc3RlckJhbGFuY2UoZmxvYXQgKmJhbGFuY2UpIGNvbnN0IG92ZXJyaWRlCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX01BU1RFUl9CQUxBTkNFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICAqYmFsYW5jZSA9IHJlcGx5LnJlYWRGbG9hdCgpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGZsb2F0IHZhbHVlLAogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KQogICAgIHsKQEAgLTYwMCwxNCArNjI5LDE4IEBACiAgICAgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFZmZlY3REZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBVdWlkLAotICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIGNvbnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIGNvbnN0CiAgICAgewotICAgICAgICBpZiAocFV1aWQgPT0gTlVMTCB8fCBwRGVzY3JpcHRvciA9PSBOVUxMKSB7CisgICAgICAgIGlmIChwVXVpZCA9PSBOVUxMIHx8IHBUeXBlID09IE5VTEwgfHwgcERlc2NyaXB0b3IgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlKHBVdWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICBkYXRhLndyaXRlKHBUeXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICBkYXRhLndyaXRlVWludDMyKHByZWZlcnJlZFR5cGVGbGFnKTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9FRkZFQ1RfREVTQ1JJUFRPUiwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTYzNiwxMCArNjY5LDEwIEBACiAgICAgICAgIHNwPElFZmZlY3Q+IGVmZmVjdDsKIAogICAgICAgICBpZiAocERlc2MgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIGVmZmVjdDsKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICpzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZWZmZWN0OwogICAgICAgICB9CiAKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC02ODYsNiArNzE5LDE4IEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2V0RWZmZWN0U3VzcGVuZGVkKGludCBlZmZlY3RJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1c3BlbmRlZCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihlZmZlY3RJZCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uSWQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc3VzcGVuZGVkID8gMSA6IDApOworICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0VGRkVDVF9TVVNQRU5ERUQsIGRhdGEsICZyZXBseSk7CisgICAgfQorCiAgICAgdmlydHVhbCBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbG9hZEh3TW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC04ODEsNiArOTI2LDcgQEAKICAgICAgICAgY2FzZSBJTlZBTElEQVRFX1NUUkVBTToKICAgICAgICAgY2FzZSBTRVRfVk9JQ0VfVk9MVU1FOgogICAgICAgICBjYXNlIE1PVkVfRUZGRUNUUzoKKyAgICAgICAgY2FzZSBTRVRfRUZGRUNUX1NVU1BFTkRFRDoKICAgICAgICAgY2FzZSBMT0FEX0hXX01PRFVMRToKICAgICAgICAgY2FzZSBMSVNUX0FVRElPX1BPUlRTOgogICAgICAgICBjYXNlIEdFVF9BVURJT19QT1JUOgpAQCAtODk0LDYgKzk0MCw3IEBACiAgICAgICAgICAgICAvLyByZXR1cm4gc3RhdHVzIG9ubHkgZm9yIG5vbiB2b2lkIG1ldGhvZHMKICAgICAgICAgICAgIHN3aXRjaCAoY29kZSkgewogICAgICAgICAgICAgICAgIGNhc2UgU0VUX1JFQ09SRF9TSUxFTkNFRDoKKyAgICAgICAgICAgICAgICBjYXNlIFNFVF9FRkZFQ1RfU1VTUEVOREVEOgogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PiAoSU5WQUxJRF9PUEVSQVRJT04pKTsKQEAgLTkxMiw3ICs5NTksNyBAQAogICAgICAgICBjYXNlIFNFVF9NSUNfTVVURToKICAgICAgICAgY2FzZSBTRVRfTE9XX1JBTV9ERVZJQ0U6CiAgICAgICAgIGNhc2UgU1lTVEVNX1JFQURZOiB7Ci0gICAgICAgICAgICBpZiAobXVsdGl1c2VyX2dldF9hcHBfaWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSA+PSBBSURfQVBQX1NUQVJUKSB7CisgICAgICAgICAgICBpZiAoIWlzU2VydmljZVVpZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiB0cmFuc2FjdGlvbiAlZCByZWNlaXZlZCBmcm9tIFBJRCAlZCB1bmF1dGhvcml6ZWQgVUlEICVkIiwKICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY29kZSwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAogICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CkBAIC05NTEsOSArOTk4LDggQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGNoYXIgdGltZUNoZWNrU3RyaW5nWzY0XTsKLSAgICBzbnByaW50Zih0aW1lQ2hlY2tTdHJpbmcsIHNpemVvZih0aW1lQ2hlY2tTdHJpbmcpLCAiSUF1ZGlvRmxpbmdlcjogJWQiLCBjb2RlKTsKLSAgICBUaW1lQ2hlY2sgY2hlY2sodGltZUNoZWNrU3RyaW5nKTsKKyAgICBzdGQ6OnN0cmluZyB0YWcoIklBdWRpb0ZsaW5nZXIgY29tbWFuZCAiICsgc3RkOjp0b19zdHJpbmcoY29kZSkpOworICAgIFRpbWVDaGVjayBjaGVjayh0YWcuY19zdHIoKSk7CiAKICAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgICAgY2FzZSBDUkVBVEVfVFJBQ0s6IHsKQEAgLTEwNDksNiArMTA5NSwyMSBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoIG1hc3Rlck11dGUoKSApOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFNFVF9NQVNURVJfQkFMQU5DRTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCBzZXRNYXN0ZXJCYWxhbmNlKGRhdGEucmVhZEZsb2F0KCkpICk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgR0VUX01BU1RFUl9CQUxBTkNFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgZmxvYXQgZjsKKyAgICAgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IGdldE1hc3RlckJhbGFuY2UoJmYpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3Qpc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAodm9pZClyZXBseS0+d3JpdGVGbG9hdChmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTRVRfU1RSRUFNX1ZPTFVNRTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGludCBzdHJlYW0gPSBkYXRhLnJlYWRJbnQzMigpOwpAQCAtMTI4MCw4ICsxMzQxLDExIEBACiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgZWZmZWN0X3V1aWRfdCB1dWlkOwogICAgICAgICAgICAgZGF0YS5yZWFkKCZ1dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICAgICAgZWZmZWN0X3V1aWRfdCB0eXBlOworICAgICAgICAgICAgZGF0YS5yZWFkKCZ0eXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICAgICAgdWludDMyX3QgcHJlZmVycmVkVHlwZUZsYWcgPSBkYXRhLnJlYWRVaW50MzIoKTsKICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYyA9IHt9OwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0RWZmZWN0RGVzY3JpcHRvcigmdXVpZCwgJmRlc2MpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0RWZmZWN0RGVzY3JpcHRvcigmdXVpZCwgJnR5cGUsIHByZWZlcnJlZFR5cGVGbGFnLCAmZGVzYyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSgmZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKQEAgLTEzMjIsNiArMTM4NiwxNCBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobW92ZUVmZmVjdHMoc2Vzc2lvbiwgc3JjT3V0cHV0LCBkc3RPdXRwdXQpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBTRVRfRUZGRUNUX1NVU1BFTkRFRDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGludCBlZmZlY3RJZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gKGF1ZGlvX3Nlc3Npb25fdCkgZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGJvb2wgc3VzcGVuZGVkID0gZGF0YS5yZWFkSW50MzIoKSA9PSAxOworICAgICAgICAgICAgc2V0RWZmZWN0U3VzcGVuZGVkKGVmZmVjdElkLCBzZXNzaW9uSWQsIHN1c3BlbmRlZCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgTE9BRF9IV19NT0RVTEU6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9GbGluZ2VyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihsb2FkSHdNb2R1bGUoZGF0YS5yZWFkQ1N0cmluZygpKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9GbGluZ2VyQ2xpZW50LmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXJDbGllbnQuY3BwCmluZGV4IGIyZGJjNGMuLjQ3ZWI3ZGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXJDbGllbnQuY3BwCkBAIC01Miw2ICs1Miw3IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQ2NChpb0Rlc2MtPm1GcmFtZUNvdW50KTsKICAgICAgICAgZGF0YS53cml0ZUludDY0KGlvRGVzYy0+bUZyYW1lQ291bnRIQUwpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoaW9EZXNjLT5tTGF0ZW5jeSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihpb0Rlc2MtPm1Qb3J0SWQpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoSU9fQ09ORklHX0NIQU5HRUQsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwogICAgIH0KIH07CkBAIC03Niw2ICs3Nyw3IEBACiAgICAgICAgICAgICBpb0Rlc2MtPm1GcmFtZUNvdW50ID0gZGF0YS5yZWFkSW50NjQoKTsKICAgICAgICAgICAgIGlvRGVzYy0+bUZyYW1lQ291bnRIQUwgPSBkYXRhLnJlYWRJbnQ2NCgpOwogICAgICAgICAgICAgaW9EZXNjLT5tTGF0ZW5jeSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBpb0Rlc2MtPm1Qb3J0SWQgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaW9Db25maWdDaGFuZ2VkKGV2ZW50LCBpb0Rlc2MpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAppbmRleCA4Y2Q0YTg1Li5jNTQ4NDU3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcApAQCAtMjQsMTEgKzI0LDEwIEBACiAKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL211bHRpdXNlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL1RpbWVDaGVjay5oPgotI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC01Miw2ICs1MSwxMCBAQAogICAgIElOSVRfU1RSRUFNX1ZPTFVNRSwKICAgICBTRVRfU1RSRUFNX1ZPTFVNRSwKICAgICBHRVRfU1RSRUFNX1ZPTFVNRSwKKyAgICBTRVRfVk9MVU1FX0FUVFJJQlVURVMsCisgICAgR0VUX1ZPTFVNRV9BVFRSSUJVVEVTLAorICAgIEdFVF9NSU5fVk9MVU1FX0ZPUl9BVFRSSUJVVEVTLAorICAgIEdFVF9NQVhfVk9MVU1FX0ZPUl9BVFRSSUJVVEVTLAogICAgIEdFVF9TVFJBVEVHWV9GT1JfU1RSRUFNLAogICAgIEdFVF9PVVRQVVRfRk9SX0VGRkVDVCwKICAgICBSRUdJU1RFUl9FRkZFQ1QsCkBAIC02Myw2ICs2Niw3IEBACiAgICAgU0VUX0VGRkVDVF9FTkFCTEVELAogICAgIElTX1NUUkVBTV9BQ1RJVkVfUkVNT1RFTFksCiAgICAgSVNfT0ZGTE9BRF9TVVBQT1JURUQsCisgICAgSVNfRElSRUNUX09VVFBVVF9TVVBQT1JURUQsCiAgICAgTElTVF9BVURJT19QT1JUUywKICAgICBHRVRfQVVESU9fUE9SVCwKICAgICBDUkVBVEVfQVVESU9fUEFUQ0gsCkBAIC03OCwxMSArODIsMjggQEAKICAgICBTVEFSVF9BVURJT19TT1VSQ0UsCiAgICAgU1RPUF9BVURJT19TT1VSQ0UsCiAgICAgU0VUX0FVRElPX1BPUlRfQ0FMTEJBQ0tfRU5BQkxFRCwKKyAgICBTRVRfQVVESU9fVk9MVU1FX0dST1VQX0NBTExCQUNLX0VOQUJMRUQsCiAgICAgU0VUX01BU1RFUl9NT05PLAogICAgIEdFVF9NQVNURVJfTU9OTywKICAgICBHRVRfU1RSRUFNX1ZPTFVNRV9EQiwKICAgICBHRVRfU1VSUk9VTkRfRk9STUFUUywKLSAgICBTRVRfU1VSUk9VTkRfRk9STUFUX0VOQUJMRUQKKyAgICBTRVRfU1VSUk9VTkRfRk9STUFUX0VOQUJMRUQsCisgICAgQUREX1NUUkVBTV9ERUZBVUxUX0VGRkVDVCwKKyAgICBSRU1PVkVfU1RSRUFNX0RFRkFVTFRfRUZGRUNULAorICAgIEFERF9TT1VSQ0VfREVGQVVMVF9FRkZFQ1QsCisgICAgUkVNT1ZFX1NPVVJDRV9ERUZBVUxUX0VGRkVDVCwKKyAgICBTRVRfQVNTSVNUQU5UX1VJRCwKKyAgICBTRVRfQTExWV9TRVJWSUNFU19VSURTLAorICAgIElTX0hBUFRJQ19QTEFZQkFDS19TVVBQT1JURUQsCisgICAgU0VUX1VJRF9ERVZJQ0VfQUZGSU5JVFksCisgICAgUkVNT1ZFX1VJRF9ERVZJQ0VfQUZGSU5JVFksCisgICAgR0VUX09GRkxPQURfRk9STUFUU19BMkRQLAorICAgIExJU1RfQVVESU9fUFJPRFVDVF9TVFJBVEVHSUVTLAorICAgIEdFVF9TVFJBVEVHWV9GT1JfQVRUUklCVVRFUywKKyAgICBMSVNUX0FVRElPX1ZPTFVNRV9HUk9VUFMsCisgICAgR0VUX1ZPTFVNRV9HUk9VUF9GT1JfQVRUUklCVVRFUywKKyAgICBTRVRfQUxMT1dFRF9DQVBUVVJFX1BPTElDWSwKKyAgICBNT1ZFX0VGRkVDVFNfVE9fSU8sCiB9OwogCiAjZGVmaW5lIE1BWF9JVEVNU19QRVJfTElTVCAxMDI0CkBAIC05OSw3ICsxMjAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwpAQCAtMTA3LDYgKzEyOSw3IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXRlKSk7CiAgICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKGRldmljZV9hZGRyZXNzKTsKICAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcoZGV2aWNlX25hbWUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihlbmNvZGVkRm9ybWF0KSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfREVWSUNFX0NPTk5FQ1RJT05fU1RBVEUsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQpAQCAtMTI1LDEzICsxNDgsMTUgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGRldmljZSkpOwogICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhkZXZpY2VfYWRkcmVzcyk7CiAgICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKGRldmljZV9uYW1lKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oZW5jb2RlZEZvcm1hdCkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoSEFORExFX0RFVklDRV9DT05GSUdfQ0hBTkdFLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KQEAgLTE3Myw0NyArMTk4LDQxIEBACiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpCisgICAgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0cihhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+ICpzZWNvbmRhcnlPdXRwdXRzKSBvdmVycmlkZQogICAgICAgICB7CiAgICAgICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgICAgIGlmIChhdHRyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RyZWFtID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImdldE91dHB1dEZvckF0dHIoKTogTlVMTCBhdWRpbyBhdHRyaWJ1dGVzIGFuZCBzdHJlYW0gdHlwZSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKnN0cmVhbSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0ciB1bnNwZWNpZmllZCBzdHJlYW0gdHlwZSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvdXRwdXQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRPdXRwdXRGb3JBdHRyIE5VTEwgb3V0cHV0IC0gc2hvdWxkbid0IGhhcHBlbiIpOworICAgICAgICAgICAgaWYgKGF0dHIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlcyBOVUxMIGF1ZGlvIGF0dHJpYnV0ZXMiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzZWxlY3RlZERldmljZUlkID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0ciBOVUxMIHNlbGVjdGVkRGV2aWNlSWQgLSBzaG91bGRuJ3QgaGFwcGVuIik7CisgICAgICAgICAgICBpZiAob3V0cHV0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMgTlVMTCBvdXRwdXQgLSBzaG91bGRuJ3QgaGFwcGVuIiwgX19mdW5jX18pOwogICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocG9ydElkID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0ciBOVUxMIHBvcnRJZCAtIHNob3VsZG4ndCBoYXBwZW4iKTsKKyAgICAgICAgICAgIGlmIChzZWxlY3RlZERldmljZUlkID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMgTlVMTCBzZWxlY3RlZERldmljZUlkIC0gc2hvdWxkbid0IGhhcHBlbiIsIF9fZnVuY19fKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF0dHIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigwKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOwotICAgICAgICAgICAgICAgIGRhdGEud3JpdGUoYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICAgICAgaWYgKHBvcnRJZCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzIE5VTEwgcG9ydElkIC0gc2hvdWxkbid0IGhhcHBlbiIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNlY29uZGFyeU91dHB1dHMgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlcyBOVUxMIHNlY29uZGFyeU91dHB1dHMgLSBzaG91bGRuJ3QgaGFwcGVuIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkYXRhLndyaXRlKGF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uKTsKICAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigwKTsKQEAgLTIzNSw2ICsyNTQsMTAgQEAKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWQoJmF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQogICAgICAgICAgICAgKm91dHB1dCA9IChhdWRpb19pb19oYW5kbGVfdClyZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbFN0cmVhbSA9IChhdWRpb19zdHJlYW1fdHlwZV90KXJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBOVUxMKSB7CkBAIC0yNDIsNDkgKzI2NSw0MCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgKnNlbGVjdGVkRGV2aWNlSWQgPSAoYXVkaW9fcG9ydF9oYW5kbGVfdClyZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgICpwb3J0SWQgPSAoYXVkaW9fcG9ydF9oYW5kbGVfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICBzZWNvbmRhcnlPdXRwdXRzLT5yZXNpemUocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWQoc2Vjb25kYXJ5T3V0cHV0cy0+ZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5T3V0cHV0cy0+c2l6ZSgpICogc2l6ZW9mKGF1ZGlvX2lvX2hhbmRsZV90KSk7CiAgICAgICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKG91dHB1dCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc3RyZWFtKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzZXNzaW9uKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KXBvcnRJZCk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTVEFSVF9PVVRQVVQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihvdXRwdXQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHN0cmVhbSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc2Vzc2lvbik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClwb3J0SWQpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1RPUF9PVVRQVVQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKG91dHB1dCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClzdHJlYW0pOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpc2Vzc2lvbik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClwb3J0SWQpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRV9PVVRQVVQsIGRhdGEsICZyZXBseSk7CiAgICAgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCkBAIC0zMTQsNiArMzI4LDcgQEAKICAgICAgICAgfQogICAgICAgICBkYXRhLndyaXRlKGF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKCppbnB1dCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihyaWlkKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHNlc3Npb24pOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocGlkKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHVpZCk7CkBAIC0zMzYsMTYgKzM1MSwxMyBAQAogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzaWxlbmNlZCkKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydElkKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKCpzaWxlbmNlZCA/IDEgOiAwKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNUQVJUX0lOUFVULCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICpzaWxlbmNlZCA9IHJlcGx5LnJlYWRJbnQzMigpID09IDE7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCkBAIC00MDcsMTMgKzQxOSw3NyBAQAogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KIAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihpbmRleCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGRldmljZSkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1ZPTFVNRV9BVFRSSUJVVEVTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgaW50ICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZSgmYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihkZXZpY2UpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9WT0xVTUVfQVRUUklCVVRFUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgaW5kZXggPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGludCAmaW5kZXgpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfTUlOX1ZPTFVNRV9GT1JfQVRUUklCVVRFUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgaW5kZXggPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGludCAmaW5kZXgpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfTUFYX1ZPTFVNRV9GT1JfQVRUUklCVVRFUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgaW5kZXggPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RyZWFtKSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfU1RSQVRFR1lfRk9SX1NUUkVBTSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZFVpbnQzMigpOwogICAgIH0KIAogICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCkBAIC00NzAsNiArNTQ2LDIyIEBACiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCisgICAgc3RhdHVzX3QgbW92ZUVmZmVjdHNUb0lvKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIGlkcywgYXVkaW9faW9faGFuZGxlX3QgaW8pIG92ZXJyaWRlCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaWRzLnNpemUoKSk7CisgICAgICAgIGZvciAoYXV0byBpZCA6IGlkcykgeworICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGlkKTsKKyAgICAgICAgfQorICAgICAgICBkYXRhLndyaXRlSW50MzIoaW8pOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTU9WRV9FRkZFQ1RTX1RPX0lPLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorCiAgICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTUyNCw2ICs2MTYsMTUgQEAKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKKyAgICBzdGF0dXNfdCBzZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSh1aWRfdCB1aWQsIGF1ZGlvX2ZsYWdzX21hc2tfdCBmbGFncykgb3ZlcnJpZGUgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIodWlkKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGZsYWdzKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9BTExPV0VEX0NBUFRVUkVfUE9MSUNZLCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCiAgICAgdmlydHVhbCBib29sIGlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgaW5mbykKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTUzMyw2ICs2MzQsMTYgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAorICAgIHZpcnR1YWwgYm9vbCBpc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcykgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfYmFzZV90KSk7CisgICAgICAgIGRhdGEud3JpdGUoJmF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KElTX0RJUkVDVF9PVVRQVVRfU1VQUE9SVEVELCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gc3RhdHVzID09IE5PX0VSUk9SID8gc3RhdGljX2Nhc3Q8Ym9vbD4ocmVwbHkucmVhZEludDMyKCkpIDogZmFsc2U7CisgICAgfQorCiAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLApAQCAtNjc0LDYgKzc4NSwxNCBAQAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0FVRElPX1BPUlRfQ0FMTEJBQ0tfRU5BQkxFRCwgZGF0YSwgJnJlcGx5KTsKICAgICB9CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGVuYWJsZWQgPyAxIDogMCk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQVVESU9fVk9MVU1FX0dST1VQX0NBTExCQUNLX0VOQUJMRUQsIGRhdGEsICZyZXBseSk7CisgICAgfQorCiAgICAgdmlydHVhbCBzdGF0dXNfdCBhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpCkBAIC03NTMsMTEgKzg3MiwxMSBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGlmIChzb3VyY2UgPT0gTlVMTCB8fCBhdHRyaWJ1dGVzID09IE5VTEwgfHwgaGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgaWYgKHNvdXJjZSA9PSBOVUxMIHx8IGF0dHJpYnV0ZXMgPT0gTlVMTCB8fCBwb3J0SWQgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgICAgICBkYXRhLndyaXRlKHNvdXJjZSwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZykpOwpAQCAtNzcwLDE1ICs4ODksMTUgQEAKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQotICAgICAgICAqaGFuZGxlID0gKGF1ZGlvX3BhdGNoX2hhbmRsZV90KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAqcG9ydElkID0gKGF1ZGlvX3BvcnRfaGFuZGxlX3QpcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGhhbmRsZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0SWQpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU1RPUF9BVURJT19TT1VSQ0UsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CkBAIC04NzksNiArOTk4LDI3OSBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKQorICAgIHsKKyAgICAgICAgaWYgKGZvcm1hdHMgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfT0ZGTE9BRF9GT1JNQVRTX0EyRFAsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwgKHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgbGlzdF9zaXplID0gcmVwbHkucmVhZFVpbnQzMigpOworCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdF9zaXplOyBpKyspIHsKKyAgICAgICAgICAgIGZvcm1hdHMtPnB1c2hfYmFjayhzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4ocmVwbHkucmVhZEludDMyKCkpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisKKyAgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKHR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcxNihvcFBhY2thZ2VOYW1lKTsKKyAgICAgICAgZGF0YS53cml0ZSh1dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocHJpb3JpdHkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHVzYWdlKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEFERF9TVFJFQU1fREVGQVVMVF9FRkZFQ1QsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICAqaWQgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaWQpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVNT1ZFX1NUUkVBTV9ERUZBVUxUX0VGRkVDVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKHR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcxNihvcFBhY2thZ2VOYW1lKTsKKyAgICAgICAgZGF0YS53cml0ZSh1dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIocHJpb3JpdHkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHNvdXJjZSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChBRERfU09VUkNFX0RFRkFVTFRfRUZGRUNULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgKmlkID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGlkKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFTU9WRV9TT1VSQ0VfREVGQVVMVF9FRkZFQ1QsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIodWlkKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9BU1NJU1RBTlRfVUlELCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBMTF5U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgdWlkcykKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMih1aWRzLnNpemUoKSk7CisgICAgICAgIGZvciAoYXV0byB1aWQgOiB1aWRzKSB7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIodWlkKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0ExMVlfU0VSVklDRVNfVUlEUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChJU19IQVBUSUNfUExBWUJBQ0tfU1VQUE9SVEVELCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRCb29sKCk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHVpZCk7CisgICAgICAgIHNpemVfdCBzaXplID0gZGV2aWNlcy5zaXplKCk7CisgICAgICAgIHNpemVfdCBzaXplUG9zaXRpb24gPSBkYXRhLmRhdGFQb3NpdGlvbigpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHNpemUpOworICAgICAgICBzaXplX3QgZmluYWxTaXplID0gc2l6ZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IGRhdGEuZGF0YVBvc2l0aW9uKCk7CisgICAgICAgICAgICBpZiAoZGV2aWNlc1tpXS53cml0ZVRvUGFyY2VsKCZkYXRhKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGRhdGEuc2V0RGF0YVBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICBmaW5hbFNpemUtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZSAhPSBmaW5hbFNpemUpIHsKKyAgICAgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IGRhdGEuZGF0YVBvc2l0aW9uKCk7CisgICAgICAgICAgICBkYXRhLnNldERhdGFQb3NpdGlvbihzaXplUG9zaXRpb24pOworICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGZpbmFsU2l6ZSk7CisgICAgICAgICAgICBkYXRhLnNldERhdGFQb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1VJRF9ERVZJQ0VfQUZGSU5JVFksIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHVpZCk7CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRU1PVkVfVUlEX0RFVklDRV9BRkZJTklUWSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgJnN0cmF0ZWdpZXMpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChMSVNUX0FVRElPX1BST0RVQ1RfU1RSQVRFR0lFUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBwZXJtaXNzaW9uIGRlbmllZCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICB1aW50MzJfdCBudW1TdHJhdGVnaWVzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdHJhdGVnaWVzOyBpKyspIHsKKyAgICAgICAgICAgIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5IHN0cmF0ZWd5OworICAgICAgICAgICAgc3RhdHVzID0gc3RyYXRlZ3kucmVhZEZyb21QYXJjZWwoJnJlcGx5KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byByZWFkIHN0cmF0ZWdpZXMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIHN0cmF0ZWdpZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RyYXRlZ2llcy5wdXNoX2JhY2soc3RyYXRlZ3kpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90ICZwcm9kdWN0U3RyYXRlZ3kpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhYS53cml0ZVRvUGFyY2VsKCZkYXRhKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1NUUkFURUdZX0ZPUl9BVFRSSUJVVEVTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PHN0YXR1c190PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcHJvZHVjdFN0cmF0ZWd5ID0gc3RhdGljX2Nhc3Q8cHJvZHVjdF9zdHJhdGVneV90PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1ZvbHVtZUdyb3VwcyhBdWRpb1ZvbHVtZUdyb3VwVmVjdG9yICZncm91cHMpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChMSVNUX0FVRElPX1ZPTFVNRV9HUk9VUFMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICB1aW50MzJfdCBudW1Hcm91cHMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUdyb3VwczsgaSsrKSB7CisgICAgICAgICAgICBBdWRpb1ZvbHVtZUdyb3VwIGdyb3VwOworICAgICAgICAgICAgc3RhdHVzID0gZ3JvdXAucmVhZEZyb21QYXJjZWwoJnJlcGx5KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byByZWFkIHZvbHVtZSBncm91cHMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIGdyb3Vwcy5jbGVhcigpOworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBncm91cHMucHVzaF9iYWNrKGdyb3VwKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRWb2x1bWVHcm91cEZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVfZ3JvdXBfdCAmdm9sdW1lR3JvdXApCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhYS53cml0ZVRvUGFyY2VsKCZkYXRhKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1ZPTFVNRV9HUk9VUF9GT1JfQVRUUklCVVRFUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHZvbHVtZUdyb3VwID0gc3RhdGljX2Nhc3Q8dm9sdW1lX2dyb3VwX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShBdWRpb1BvbGljeVNlcnZpY2UsICJhbmRyb2lkLm1lZGlhLklBdWRpb1BvbGljeVNlcnZpY2UiKTsKQEAgLTg5Nyw3ICsxMjg5LDYgQEAKICAgICAgICAgY2FzZSBTVEFSVF9JTlBVVDoKICAgICAgICAgY2FzZSBTVE9QX0lOUFVUOgogICAgICAgICBjYXNlIFJFTEVBU0VfSU5QVVQ6Ci0gICAgICAgIGNhc2UgR0VUX1NUUkFURUdZX0ZPUl9TVFJFQU06CiAgICAgICAgIGNhc2UgR0VUX09VVFBVVF9GT1JfRUZGRUNUOgogICAgICAgICBjYXNlIFJFR0lTVEVSX0VGRkVDVDoKICAgICAgICAgY2FzZSBVTlJFR0lTVEVSX0VGRkVDVDoKQEAgLTkwNSw2ICsxMjk2LDcgQEAKICAgICAgICAgY2FzZSBHRVRfT1VUUFVUX0ZPUl9BVFRSOgogICAgICAgICBjYXNlIEFDUVVJUkVfU09VTkRUUklHR0VSX1NFU1NJT046CiAgICAgICAgIGNhc2UgUkVMRUFTRV9TT1VORFRSSUdHRVJfU0VTU0lPTjoKKyAgICAgICAgY2FzZSBNT1ZFX0VGRkVDVFNfVE9fSU86CiAgICAgICAgICAgICBBTE9HVygiJXM6IHRyYW5zYWN0aW9uICVkIHJlY2VpdmVkIGZyb20gUElEICVkIiwKICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjb2RlLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOwogICAgICAgICAgICAgLy8gcmV0dXJuIHN0YXR1cyBvbmx5IGZvciBub24gdm9pZCBtZXRob2RzCkBAIC05MzIsMTEgKzEzMjQsMTYgQEAKICAgICAgICAgY2FzZSBTRVRfU1RSRUFNX1ZPTFVNRToKICAgICAgICAgY2FzZSBSRUdJU1RFUl9QT0xJQ1lfTUlYRVM6CiAgICAgICAgIGNhc2UgU0VUX01BU1RFUl9NT05POgotICAgICAgICBjYXNlIFNUQVJUX0FVRElPX1NPVVJDRToKLSAgICAgICAgY2FzZSBTVE9QX0FVRElPX1NPVVJDRToKICAgICAgICAgY2FzZSBHRVRfU1VSUk9VTkRfRk9STUFUUzoKLSAgICAgICAgY2FzZSBTRVRfU1VSUk9VTkRfRk9STUFUX0VOQUJMRUQ6IHsKLSAgICAgICAgICAgIGlmIChtdWx0aXVzZXJfZ2V0X2FwcF9pZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpID49IEFJRF9BUFBfU1RBUlQpIHsKKyAgICAgICAgY2FzZSBTRVRfU1VSUk9VTkRfRk9STUFUX0VOQUJMRUQ6CisgICAgICAgIGNhc2UgU0VUX0FTU0lTVEFOVF9VSUQ6CisgICAgICAgIGNhc2UgU0VUX0ExMVlfU0VSVklDRVNfVUlEUzoKKyAgICAgICAgY2FzZSBTRVRfVUlEX0RFVklDRV9BRkZJTklUWToKKyAgICAgICAgY2FzZSBSRU1PVkVfVUlEX0RFVklDRV9BRkZJTklUWToKKyAgICAgICAgY2FzZSBHRVRfT0ZGTE9BRF9GT1JNQVRTX0EyRFA6CisgICAgICAgIGNhc2UgTElTVF9BVURJT19WT0xVTUVfR1JPVVBTOgorICAgICAgICBjYXNlIEdFVF9WT0xVTUVfR1JPVVBfRk9SX0FUVFJJQlVURVM6IHsKKyAgICAgICAgICAgIGlmICghaXNTZXJ2aWNlVWlkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IHRyYW5zYWN0aW9uICVkIHJlY2VpdmVkIGZyb20gUElEICVkIHVuYXV0aG9yaXplZCBVSUQgJWQiLAogICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjb2RlLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCiAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKQEAgLTk0OCw5ICsxMzQ1LDggQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGNoYXIgdGltZUNoZWNrU3RyaW5nWzY0XTsKLSAgICBzbnByaW50Zih0aW1lQ2hlY2tTdHJpbmcsIHNpemVvZih0aW1lQ2hlY2tTdHJpbmcpLCAiSUF1ZGlvUG9saWN5U2VydmljZTogJWQiLCBjb2RlKTsKLSAgICBUaW1lQ2hlY2sgY2hlY2sodGltZUNoZWNrU3RyaW5nKTsKKyAgICBzdGQ6OnN0cmluZyB0YWcoIklBdWRpb1BvbGljeVNlcnZpY2UgY29tbWFuZCAiICsgc3RkOjp0b19zdHJpbmcoY29kZSkpOworICAgIFRpbWVDaGVjayBjaGVjayh0YWcuY19zdHIoKSk7CiAKICAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgICAgY2FzZSBTRVRfREVWSUNFX0NPTk5FQ1RJT05fU1RBVEU6IHsKQEAgLTk2MSw2ICsxMzU3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyA9IGRhdGEucmVhZENTdHJpbmcoKTsKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lID0gZGF0YS5yZWFkQ1N0cmluZygpOworICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgY29kZWNGb3JtYXQgPSBzdGF0aWNfY2FzdCA8YXVkaW9fZm9ybWF0X3Q+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICAgICAgaWYgKGRldmljZV9hZGRyZXNzID09IG51bGxwdHIgfHwgZGV2aWNlX25hbWUgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIEFMT0dFKCJCYWQgQmluZGVyIHRyYW5zYWN0aW9uOiBTRVRfREVWSUNFX0NPTk5FQ1RJT05fU1RBVEUgZm9yIGRldmljZSAldSIsIGRldmljZSk7CiAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4gKEJBRF9WQUxVRSkpOwpAQCAtOTY4LDcgKzEzNjUsOCBAQAogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90PiAoc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfbmFtZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY0Zvcm1hdCkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKQEAgLTk5NCwxMyArMTM5MiwxNiBAQAogICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fZGV2aWNlc190PihkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzID0gZGF0YS5yZWFkQ1N0cmluZygpOwogICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUgPSBkYXRhLnJlYWRDU3RyaW5nKCk7CisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBjb2RlY0Zvcm1hdCA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19mb3JtYXRfdD4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgICAgICBpZiAoZGV2aWNlX2FkZHJlc3MgPT0gbnVsbHB0ciB8fCBkZXZpY2VfbmFtZSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIkJhZCBCaW5kZXIgdHJhbnNhY3Rpb246IEhBTkRMRV9ERVZJQ0VfQ09ORklHX0NIQU5HRSBmb3IgZGV2aWNlICV1IiwgZGV2aWNlKTsKICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PiAoQkFEX1ZBTFVFKSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90PiAoaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfbmFtZSkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY0Zvcm1hdCkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKQEAgLTEwNDEsMTIgKzE0NDIsMTIgQEAKIAogICAgICAgICBjYXNlIEdFVF9PVVRQVVRfRk9SX0FUVFI6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciA9IHt9OwotICAgICAgICAgICAgYm9vbCBoYXNBdHRyaWJ1dGVzID0gZGF0YS5yZWFkSW50MzIoKSAhPSAwOwotICAgICAgICAgICAgaWYgKGhhc0F0dHJpYnV0ZXMpIHsKLSAgICAgICAgICAgICAgICBkYXRhLnJlYWQoJmF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgICAgICAgICBzYW5ldGl6ZUF1ZGlvQXR0cmlidXRlcygmYXR0cik7CisgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciA9IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVI7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWQoJmF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgc2FuZXRpemVBdWRpb0F0dHJpYnV0ZXMoJmF0dHIpOwogICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOwogICAgICAgICAgICAgYm9vbCBoYXNTdHJlYW0gPSBkYXRhLnJlYWRJbnQzMigpICE9IDA7CkBAIC0xMDYzLDQ4ICsxNDY0LDQzIEBACiAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSAoYXVkaW9fcG9ydF9oYW5kbGVfdClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gMDsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldE91dHB1dEZvckF0dHIoaGFzQXR0cmlidXRlcyA/ICZhdHRyIDogTlVMTCwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBzZWNvbmRhcnlPdXRwdXRzOworICAgICAgICAgICAgc3RhdHVzID0gZ2V0T3V0cHV0Rm9yQXR0cigmYXR0ciwKICAgICAgICAgICAgICAgICAgICAgJm91dHB1dCwgc2Vzc2lvbiwgJnN0cmVhbSwgcGlkLCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgIGZsYWdzLCAmc2VsZWN0ZWREZXZpY2VJZCwgJnBvcnRJZCk7CisgICAgICAgICAgICAgICAgICAgIGZsYWdzLCAmc2VsZWN0ZWREZXZpY2VJZCwgJnBvcnRJZCwgJnNlY29uZGFyeU91dHB1dHMpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHJlcGx5LT53cml0ZSgmYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihvdXRwdXQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RyZWFtKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlbGVjdGVkRGV2aWNlSWQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocG9ydElkKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlY29uZGFyeU91dHB1dHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiByZXBseS0+d3JpdGUoc2Vjb25kYXJ5T3V0cHV0cy5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeU91dHB1dHMuc2l6ZSgpICogc2l6ZW9mKGF1ZGlvX2lvX2hhbmRsZV90KSk7CiAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgY2FzZSBTVEFSVF9PVVRQVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fc3RyZWFtX3R5cGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhcnRPdXRwdXQob3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24pKSk7CisgICAgICAgICAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IHN0YXRpY19jYXN0IDxhdWRpb19wb3J0X2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhcnRPdXRwdXQocG9ydElkKSkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgU1RPUF9PVVRQVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fc3RyZWFtX3R5cGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RvcE91dHB1dChvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24pKSk7CisgICAgICAgICAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IHN0YXRpY19jYXN0IDxhdWRpb19wb3J0X2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RvcE91dHB1dChwb3J0SWQpKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgY2FzZSBSRUxFQVNFX09VVFBVVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IChhdWRpb19zdHJlYW1fdHlwZV90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJlbGVhc2VPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgICAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBzdGF0aWNfY2FzdCA8YXVkaW9fcG9ydF9oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICByZWxlYXNlT3V0cHV0KHBvcnRJZCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKQEAgLTExMTQsNiArMTUxMCw3IEBACiAgICAgICAgICAgICBkYXRhLnJlYWQoJmF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKICAgICAgICAgICAgIHNhbmV0aXplQXVkaW9BdHRyaWJ1dGVzKCZhdHRyKTsKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gKGF1ZGlvX2lvX2hhbmRsZV90KWRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCByaWlkID0gKGF1ZGlvX3VuaXF1ZV9pZF90KWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIHBpZF90IHBpZCA9IChwaWRfdClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgdWlkX3QgdWlkID0gKHVpZF90KWRhdGEucmVhZEludDMyKCk7CkBAIC0xMTI0LDcgKzE1MjEsNyBAQAogICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gKGF1ZGlvX3BvcnRfaGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IChhdWRpb19wb3J0X2hhbmRsZV90KWRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRJbnB1dEZvckF0dHIoJmF0dHIsICZpbnB1dCwgc2Vzc2lvbiwgcGlkLCB1aWQsCisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRJbnB1dEZvckF0dHIoJmF0dHIsICZpbnB1dCwgcmlpZCwgc2Vzc2lvbiwgcGlkLCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BQYWNrYWdlTmFtZSwgJmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgJnNlbGVjdGVkRGV2aWNlSWQsICZwb3J0SWQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKQEAgLTExMzksMTAgKzE1MzYsOCBAQAogICAgICAgICBjYXNlIFNUQVJUX0lOUFVUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBzdGF0aWNfY2FzdCA8YXVkaW9fcG9ydF9oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBib29sIHNpbGVuY2VkID0gZGF0YS5yZWFkSW50MzIoKSA9PSAxOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhcnRJbnB1dChwb3J0SWQsICZzaWxlbmNlZCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGFydElucHV0KHBvcnRJZCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXR1cykpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2lsZW5jZWQgPyAxIDogMCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKQEAgLTExOTgsNyArMTU5Myw3NCBAQAogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0KICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGRhdGEucmVhZEludDMyKCkpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oc3RyZWFtKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVVaW50MzIoZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oc3RyZWFtKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBTRVRfVk9MVU1FX0FUVFJJQlVURVM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHt9OworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkKCZhdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBpbmRleCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gc3RhdGljX2Nhc3QgPGF1ZGlvX2RldmljZXNfdD4oZGF0YS5yZWFkSW50MzIoKSk7CisKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCwgZGV2aWNlKSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgR0VUX1ZPTFVNRV9BVFRSSUJVVEVTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7fTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZCgmYXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gc3RhdGljX2Nhc3QgPGF1ZGlvX2RldmljZXNfdD4oZGF0YS5yZWFkSW50MzIoKSk7CisKKyAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgICAgICBzdGF0dXMgPSBnZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgaW5kZXgsIGRldmljZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXR1cykpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIEdFVF9NSU5fVk9MVU1FX0ZPUl9BVFRSSUJVVEVTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7fTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZCgmYXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgICAgICBzdGF0dXMgPSBnZXRNaW5Wb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgaW5kZXgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdGF0dXMpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBHRVRfTUFYX1ZPTFVNRV9GT1JfQVRUUklCVVRFUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0ge307CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWQoJmF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICAgICAgc3RhdHVzID0gZ2V0TWF4Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIGluZGV4KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhdHVzKSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaW5kZXgpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCkBAIC0xMjU2LDYgKzE3MTgsMzEgQEAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIAorICAgICAgICBjYXNlIE1PVkVfRUZGRUNUU19UT19JTzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gaWRzOworICAgICAgICAgICAgaW50MzJfdCBzaXplOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoJnNpemUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2l6ZSA+IE1BWF9JVEVNU19QRVJfTElTVCkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgaWQ7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gIGRhdGEucmVhZEludDMyKCZpZCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZHMucHVzaF9iYWNrKGlkKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludDMyX3Q+KG1vdmVFZmZlY3RzVG9JbyhpZHMsIGlvKSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCiAgICAgICAgIGNhc2UgSVNfU1RSRUFNX0FDVElWRTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gKGF1ZGlvX3N0cmVhbV90eXBlX3QpIGRhdGEucmVhZEludDMyKCk7CkBAIC0xMzEzLDYgKzE4MDAsMTggQEAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgSVNfRElSRUNUX09VVFBVVF9TVVBQT1JURUQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZyA9IHt9OworICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7fTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZCgmY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX2Jhc2VfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIHN0YXR1cyA9IGRhdGEucmVhZCgmYXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbmZpZywgYXR0cmlidXRlcykpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBMSVNUX0FVRElPX1BPUlRTOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSA9IChhdWRpb19wb3J0X3JvbGVfdClkYXRhLnJlYWRJbnQzMigpOwpAQCAtMTQzOCw2ICsxOTM3LDEyIEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKKyAgICAgICAgY2FzZSBTRVRfQVVESU9fVk9MVU1FX0dST1VQX0NBTExCQUNLX0VOQUJMRUQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzZXRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZChkYXRhLnJlYWRJbnQzMigpID09IDEpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCiAgICAgICAgIGNhc2UgQUNRVUlSRV9TT1VORFRSSUdHRVJfU0VTU0lPTjogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+IGNsaWVudCA9IGludGVyZmFjZV9jYXN0PElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+KApAQCAtMTQ5OCwxNyArMjAwMywxNyBAQAogICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7fTsKICAgICAgICAgICAgIGRhdGEucmVhZCgmYXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwogICAgICAgICAgICAgc2FuZXRpemVBdWRpb0F0dHJpYnV0ZXMoJmF0dHJpYnV0ZXMpOwotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGFydEF1ZGlvU291cmNlKCZzb3VyY2UsICZhdHRyaWJ1dGVzLCAmaGFuZGxlKTsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXJ0QXVkaW9Tb3VyY2UoJnNvdXJjZSwgJmF0dHJpYnV0ZXMsICZwb3J0SWQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGhhbmRsZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihwb3J0SWQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgU1RPUF9BVURJT19TT1VSQ0U6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7Ci0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUgPSAoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdG9wQXVkaW9Tb3VyY2UoaGFuZGxlKTsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gKGF1ZGlvX3BvcnRfaGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdG9wQXVkaW9Tb3VyY2UocG9ydElkKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC0xNTg3LDYgKzIwOTIsMjYxIEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIEdFVF9PRkZMT0FEX0ZPUk1BVFNfQTJEUDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiBlbmNvZGluZ0Zvcm1hdHM7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKCZlbmNvZGluZ0Zvcm1hdHMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVVaW50MzIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGVuY29kaW5nRm9ybWF0cy5zaXplKCkpKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW5jb2RpbmdGb3JtYXRzLnNpemUoKTsgaSsrKQorICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KGVuY29kaW5nRm9ybWF0c1tpXSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKworICAgICAgICBjYXNlIEFERF9TVFJFQU1fREVGQVVMVF9FRkZFQ1Q6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBlZmZlY3RfdXVpZF90IHR5cGU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWQoJnR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZzE2IG9wUGFja2FnZU5hbWU7CisgICAgICAgICAgICBzdGF0dXMgPSBkYXRhLnJlYWRTdHJpbmcxNigmb3BQYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKKyAgICAgICAgICAgIHN0YXR1cyA9IGRhdGEucmVhZCgmdXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlID0gKGF1ZGlvX3VzYWdlX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCBpZCA9IDA7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4oYWRkU3RyZWFtRGVmYXVsdEVmZmVjdCgmdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaWQpKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpZCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFJFTU9WRV9TVFJFQU1fREVGQVVMVF9FRkZFQ1Q6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCBpZCA9IHN0YXRpY19jYXN0PGF1ZGlvX3VuaXF1ZV9pZF90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQzMl90PihyZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGlkKSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBBRERfU09VUkNFX0RFRkFVTFRfRUZGRUNUOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgZWZmZWN0X3V1aWRfdCB0eXBlOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkKCZ0eXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcxNiBvcFBhY2thZ2VOYW1lOworICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkU3RyaW5nMTYoJm9wUGFja2FnZU5hbWUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlZmZlY3RfdXVpZF90IHV1aWQ7CisgICAgICAgICAgICBzdGF0dXMgPSBkYXRhLnJlYWQoJnV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlID0gKGF1ZGlvX3NvdXJjZV90KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgaWQgPSAwOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludDMyX3Q+KGFkZFNvdXJjZURlZmF1bHRFZmZlY3QoJnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZCkpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlkKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgUkVNT1ZFX1NPVVJDRV9ERUZBVUxUX0VGRkVDVDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IGlkID0gc3RhdGljX2Nhc3Q8YXVkaW9fdW5pcXVlX2lkX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludDMyX3Q+KHJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoaWQpKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNFVF9BU1NJU1RBTlRfVUlEOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgaW50MzJfdCB1aWQ7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigmdWlkKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gc2V0QXNzaXN0YW50VWlkKHVpZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4oc3RhdHVzKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNFVF9BMTFZX1NFUlZJQ0VTX1VJRFM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aWRfdD4gdWlkczsKKyAgICAgICAgICAgIGludDMyX3Qgc2l6ZTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZEludDMyKCZzaXplKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNpemUgPiBNQVhfSVRFTVNfUEVSX0xJU1QpIHsKKyAgICAgICAgICAgICAgICBzaXplID0gTUFYX0lURU1TX1BFUl9MSVNUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCB1aWQ7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gIGRhdGEucmVhZEludDMyKCZ1aWQpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdWlkcy5wdXNoX2JhY2sodWlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IHNldEExMXlTZXJ2aWNlc1VpZHModWlkcyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4oc3RhdHVzKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIElTX0hBUFRJQ19QTEFZQkFDS19TVVBQT1JURUQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBib29sIGlzU3VwcG9ydGVkID0gaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlQm9vbChpc1N1cHBvcnRlZCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNFVF9VSURfREVWSUNFX0FGRklOSVRZOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgY29uc3QgdWlkX3QgdWlkID0gKHVpZF90KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+IGRldmljZXM7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IChzaXplX3QpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciBkZXZpY2U7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZS5yZWFkRnJvbVBhcmNlbCgoUGFyY2VsKikmZGF0YSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlcy5hZGQoZGV2aWNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZCwgZGV2aWNlcyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBSRU1PVkVfVUlEX0RFVklDRV9BRkZJTklUWTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGNvbnN0IHVpZF90IHVpZCA9ICh1aWRfdCkgZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIExJU1RfQVVESU9fUFJPRFVDVF9TVFJBVEVHSUVTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3Igc3RyYXRlZ2llczsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKHN0cmF0ZWdpZXMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IHN0cmF0ZWdpZXMuc2l6ZSgpOworICAgICAgICAgICAgc2l6ZV90IHNpemVQb3NpdGlvbiA9IHJlcGx5LT5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNpemUpOworICAgICAgICAgICAgc2l6ZV90IGZpbmFsU2l6ZSA9IHNpemU7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IHJlcGx5LT5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RyYXRlZ2llc1tpXS53cml0ZVRvUGFyY2VsKHJlcGx5KSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICByZXBseS0+c2V0RGF0YVBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgZmluYWxTaXplLS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNpemUgIT0gZmluYWxTaXplKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IHBvc2l0aW9uID0gcmVwbHktPmRhdGFQb3NpdGlvbigpOworICAgICAgICAgICAgICAgIHJlcGx5LT5zZXREYXRhUG9zaXRpb24oc2l6ZVBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihmaW5hbFNpemUpOworICAgICAgICAgICAgICAgIHJlcGx5LT5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBHRVRfU1RSQVRFR1lfRk9SX0FUVFJJQlVURVM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBBdWRpb0F0dHJpYnV0ZXMgYXR0cmlidXRlczsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF0dHJpYnV0ZXMucmVhZEZyb21QYXJjZWwoJmRhdGEpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3k7CisgICAgICAgICAgICBzdGF0dXMgPSBnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIHN0cmF0ZWd5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbHktPndyaXRlVWludDMyKHN0YXRpY19jYXN0PGludD4oc3RyYXRlZ3kpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTElTVF9BVURJT19WT0xVTUVfR1JPVVBTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgQXVkaW9Wb2x1bWVHcm91cFZlY3RvciBncm91cHM7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBsaXN0QXVkaW9Wb2x1bWVHcm91cHMoZ3JvdXBzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc2l6ZV90IHNpemUgPSBncm91cHMuc2l6ZSgpOworICAgICAgICAgICAgc2l6ZV90IHNpemVQb3NpdGlvbiA9IHJlcGx5LT5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNpemUpOworICAgICAgICAgICAgc2l6ZV90IGZpbmFsU2l6ZSA9IHNpemU7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IHJlcGx5LT5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgICAgICAgICBpZiAoZ3JvdXBzW2ldLndyaXRlVG9QYXJjZWwocmVwbHkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5LT5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICBmaW5hbFNpemUtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2l6ZSAhPSBmaW5hbFNpemUpIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgcG9zaXRpb24gPSByZXBseS0+ZGF0YVBvc2l0aW9uKCk7CisgICAgICAgICAgICAgICAgcmVwbHktPnNldERhdGFQb3NpdGlvbihzaXplUG9zaXRpb24pOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGZpbmFsU2l6ZSk7CisgICAgICAgICAgICAgICAgcmVwbHktPnNldERhdGFQb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEdFVF9WT0xVTUVfR1JPVVBfRk9SX0FUVFJJQlVURVM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBBdWRpb0F0dHJpYnV0ZXMgYXR0cmlidXRlczsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF0dHJpYnV0ZXMucmVhZEZyb21QYXJjZWwoJmRhdGEpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2b2x1bWVfZ3JvdXBfdCBncm91cDsKKyAgICAgICAgICAgIHN0YXR1cyA9IGdldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBncm91cCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDxpbnQ+KGdyb3VwKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFNFVF9BTExPV0VEX0NBUFRVUkVfUE9MSUNZOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgdWlkX3QgdWlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGF1ZGlvX2ZsYWdzX21hc2tfdCBmbGFncyA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSh1aWQsIGZsYWdzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwCmluZGV4IGFkN2YxZGUuLjBmOTU4MGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuY3BwCkBAIC0zMSw3ICszMSw4IEBACiAgICAgUE9SVF9MSVNUX1VQREFURSA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCiAgICAgUEFUQ0hfTElTVF9VUERBVEUsCiAgICAgTUlYX1NUQVRFX1VQREFURSwKLSAgICBSRUNPUkRJTkdfQ09ORklHVVJBVElPTl9VUERBVEUKKyAgICBSRUNPUkRJTkdfQ09ORklHVVJBVElPTl9VUERBVEUsCisgICAgVk9MVU1FX0dST1VQX0NIQU5HRUQsCiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00OSwxNSArNTAsNDIgQEAKIH0KIAogaW5saW5lIHZvaWQgcmVhZFJlY29yZENsaWVudEluZm9Gcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCYgZGF0YSwgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8pIHsKKyAgICBjbGllbnRJbmZvLT5yaWlkID0gKGF1ZGlvX3VuaXF1ZV9pZF90KSBkYXRhLnJlYWRJbnQzMigpOwogICAgIGNsaWVudEluZm8tPnVpZCA9ICh1aWRfdCkgZGF0YS5yZWFkVWludDMyKCk7CiAgICAgY2xpZW50SW5mby0+c2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpIGRhdGEucmVhZEludDMyKCk7CiAgICAgY2xpZW50SW5mby0+c291cmNlID0gKGF1ZGlvX3NvdXJjZV90KSBkYXRhLnJlYWRJbnQzMigpOworICAgIGRhdGEucmVhZCgmY2xpZW50SW5mby0+cG9ydF9pZCwgc2l6ZW9mKGF1ZGlvX3BvcnRfaGFuZGxlX3QpKTsKKyAgICBjbGllbnRJbmZvLT5zaWxlbmNlZCA9IGRhdGEucmVhZEJvb2woKTsKIH0KIAotaW5saW5lIHZvaWQgd3JpdGVSZWNvcmRDbGllbnRJbmZvRnJvbVBhcmNlbChQYXJjZWwmIGRhdGEsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvKSB7CitpbmxpbmUgdm9pZCB3cml0ZVJlY29yZENsaWVudEluZm9Ub1BhcmNlbChQYXJjZWwmIGRhdGEsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvKSB7CisgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBjbGllbnRJbmZvLT5yaWlkKTsKICAgICBkYXRhLndyaXRlVWludDMyKCh1aW50MzJfdCkgY2xpZW50SW5mby0+dWlkKTsKICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGNsaWVudEluZm8tPnNlc3Npb24pOwogICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgY2xpZW50SW5mby0+c291cmNlKTsKKyAgICBkYXRhLndyaXRlKCZjbGllbnRJbmZvLT5wb3J0X2lkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOworICAgIGRhdGEud3JpdGVCb29sKGNsaWVudEluZm8tPnNpbGVuY2VkKTsKK30KKworaW5saW5lIHZvaWQgcmVhZEVmZmVjdFZlY3RvckZyb21QYXJjZWwoY29uc3QgUGFyY2VsJiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gKmVmZmVjdHMpIHsKKyAgICBpbnQzMl90IG51bUVmZmVjdHMgPSBkYXRhLnJlYWRJbnQzMigpOworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bUVmZmVjdHM7IGkrKykgeworICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGVmZmVjdDsKKyAgICAgICAgaWYgKGRhdGEucmVhZCgmZWZmZWN0LCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAoKmVmZmVjdHMpLnB1c2hfYmFjayhlZmZlY3QpOworICAgIH0KK30KKworaW5saW5lIHZvaWQgd3JpdGVFZmZlY3RWZWN0b3JUb1BhcmNlbChQYXJjZWwmIGRhdGEsIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMpIHsKKyAgICBkYXRhLndyaXRlVWludDMyKCh1aW50MzJfdCkgZWZmZWN0cy5zaXplKCkpOworICAgIGZvciAoY29uc3QgYXV0byYgZWZmZWN0IDogZWZmZWN0cykgeworICAgICAgICBpZiAoZGF0YS53cml0ZSgmZWZmZWN0LCBzaXplb2YoZWZmZWN0X2Rlc2NyaXB0b3JfdCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtODMsNiArMTExLDE1IEBACiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChQQVRDSF9MSVNUX1VQREFURSwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CiAgICAgfQogCisgICAgdm9pZCBvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLCBpbnQgZmxhZ3MpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlVWludDMyKGdyb3VwKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGZsYWdzKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFZPTFVNRV9HUk9VUF9DSEFOR0VELCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKKyAgICB9CisKICAgICB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC05MiwxNiArMTI5LDI0IEBACiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChNSVhfU1RBVEVfVVBEQVRFLCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKICAgICB9CiAKLSAgICB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkgeworICAgIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKGV2ZW50KTsKLSAgICAgICAgd3JpdGVSZWNvcmRDbGllbnRJbmZvRnJvbVBhcmNlbChkYXRhLCBjbGllbnRJbmZvKTsKKyAgICAgICAgd3JpdGVSZWNvcmRDbGllbnRJbmZvVG9QYXJjZWwoZGF0YSwgY2xpZW50SW5mbyk7CiAgICAgICAgIHdyaXRlQXVkaW9Db25maWdCYXNlVG9QYXJjZWwoZGF0YSwgY2xpZW50Q29uZmlnKTsKKyAgICAgICAgd3JpdGVFZmZlY3RWZWN0b3JUb1BhcmNlbChkYXRhLCBjbGllbnRFZmZlY3RzKTsKICAgICAgICAgd3JpdGVBdWRpb0NvbmZpZ0Jhc2VUb1BhcmNlbChkYXRhLCBkZXZpY2VDb25maWcpOworICAgICAgICB3cml0ZUVmZmVjdFZlY3RvclRvUGFyY2VsKGRhdGEsIGVmZmVjdHMpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocGF0Y2hIYW5kbGUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHNvdXJjZSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRUNPUkRJTkdfQ09ORklHVVJBVElPTl9VUERBVEUsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwogICAgIH0KIH07CkBAIC0xMjQsNiArMTY5LDEzIEBACiAgICAgICAgICAgICBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CisgICAgY2FzZSBWT0xVTUVfR1JPVVBfQ0hBTkdFRDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHZvbHVtZV9ncm91cF90IGdyb3VwID0gc3RhdGljX2Nhc3Q8dm9sdW1lX2dyb3VwX3Q+KGRhdGEucmVhZFVpbnQzMigpKTsKKyAgICAgICAgICAgIGludCBmbGFncyA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKGdyb3VwLCBmbGFncyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CiAgICAgY2FzZSBNSVhfU1RBVEVfVVBEQVRFOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgU3RyaW5nOCByZWdJZCA9IGRhdGEucmVhZFN0cmluZzgoKTsKQEAgLTEzOSwxMCArMTkxLDE1IEBACiAgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IGRldmljZUNvbmZpZzsKICAgICAgICAgICAgIHJlYWRSZWNvcmRDbGllbnRJbmZvRnJvbVBhcmNlbChkYXRhLCAmY2xpZW50SW5mbyk7CiAgICAgICAgICAgICByZWFkQXVkaW9Db25maWdCYXNlRnJvbVBhcmNlbChkYXRhLCAmY2xpZW50Q29uZmlnKTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHM7CisgICAgICAgICAgICByZWFkRWZmZWN0VmVjdG9yRnJvbVBhcmNlbChkYXRhLCAmY2xpZW50RWZmZWN0cyk7CiAgICAgICAgICAgICByZWFkQXVkaW9Db25maWdCYXNlRnJvbVBhcmNlbChkYXRhLCAmZGV2aWNlQ29uZmlnKTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHM7CisgICAgICAgICAgICByZWFkRWZmZWN0VmVjdG9yRnJvbVBhcmNlbChkYXRhLCAmZWZmZWN0cyk7CiAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSA9IChhdWRpb19wYXRjaF9oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgJmNsaWVudEluZm8sICZjbGllbnRDb25maWcsICZkZXZpY2VDb25maWcsCi0gICAgICAgICAgICAgICAgICAgIHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IChhdWRpb19zb3VyY2VfdCkgZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgJmNsaWVudEluZm8sICZjbGllbnRDb25maWcsIGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZUNvbmZpZywgZWZmZWN0cywgcGF0Y2hIYW5kbGUsIHNvdXJjZSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgZGVmYXVsdDoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1RyYWNrLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1RyYWNrLmNwcAppbmRleCBhZGZmMDU3Li44M2E1NjhhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9UcmFjay5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvVHJhY2suY3BwCkBAIC0zOSw2ICszOSw3IEBACiAgICAgUEFVU0UsCiAgICAgQVRUQUNIX0FVWF9FRkZFQ1QsCiAgICAgU0VUX1BBUkFNRVRFUlMsCisgICAgU0VMRUNUX1BSRVNFTlRBVElPTiwKICAgICBHRVRfVElNRVNUQU1QLAogICAgIFNJR05BTCwKICAgICBBUFBMWV9WT0xVTUVfU0hBUEVSLApAQCAtMTI3LDYgKzEyOCwxOSBAQAogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAorICAgIC8qIFNlbGVjdHMgdGhlIHByZXNlbnRhdGlvbiAoaWYgYXZhaWxhYmxlKSAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCkgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9UcmFjazo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHByZXNlbnRhdGlvbklkKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHByb2dyYW1JZCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRUxFQ1RfUFJFU0VOVEFUSU9OLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvVHJhY2s6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CkBAIC0yMzksNiArMjUzLDExIEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBTRUxFQ1RfUFJFU0VOVEFUSU9OOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvVHJhY2ssIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlbGVjdFByZXNlbnRhdGlvbihkYXRhLnJlYWRJbnQzMigpLCBkYXRhLnJlYWRJbnQzMigpKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgR0VUX1RJTUVTVEFNUDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1RyYWNrLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBBdWRpb1RpbWVzdGFtcCB0aW1lc3RhbXA7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9SZWNvcmRpbmdBY3Rpdml0eVRyYWNrZXIuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvUmVjb3JkaW5nQWN0aXZpdHlUcmFja2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmQ0MzYxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvUmVjb3JkaW5nQWN0aXZpdHlUcmFja2VyLmNwcApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGF1ZGlvbWFuYWdlci9BdWRpb01hbmFnZXIuaD4KKyNpbmNsdWRlIDxhdWRpb21hbmFnZXIvSUF1ZGlvTWFuYWdlci5oPgorI2luY2x1ZGUgPGJpbmRlci9CaW5kZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvUmVjb3JkaW5nQWN0aXZpdHlUcmFja2VyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworUmVjb3JkaW5nQWN0aXZpdHlUcmFja2VyOjpSZWNvcmRpbmdBY3Rpdml0eVRyYWNrZXIoKQorICAgICAgICA6IG1SSUlkKFJFQ09SRF9SSUlEX0lOVkFMSUQpLCBtVG9rZW4obmV3IEJCaW5kZXIoKSkKK3sKKyAgICAvLyB1c2UgY2hlY2tTZXJ2aWNlKCkgdG8gYXZvaWQgYmxvY2tpbmcgaWYgYXVkaW8gc2VydmljZSBpcyBub3QgdXAgeWV0CisgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmNoZWNrU2VydmljZShTdHJpbmcxNigiYXVkaW8iKSk7CisgICAgaWYgKGJpbmRlciAhPSAwKSB7CisgICAgICAgIG1BdWRpb01hbmFnZXIgPSBpbnRlcmZhY2VfY2FzdDxJQXVkaW9NYW5hZ2VyPihiaW5kZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJSZWNvcmRpbmdBY3Rpdml0eVRyYWNrZXIoKTogYmluZGluZyB0byBhdWRpbyBzZXJ2aWNlIGZhaWxlZCwgc2VydmljZSB1cD8iKTsKKyAgICB9Cit9CisKK1JlY29yZGluZ0FjdGl2aXR5VHJhY2tlcjo6flJlY29yZGluZ0FjdGl2aXR5VHJhY2tlcigpCit7CisgICAgaWYgKG1SSUlkICE9IFJFQ09SRF9SSUlEX0lOVkFMSUQgJiYgbUF1ZGlvTWFuYWdlcikgeworICAgICAgICBtQXVkaW9NYW5hZ2VyLT5yZWxlYXNlUmVjb3JkZXIobVJJSWQpOworICAgIH0KK30KKworYXVkaW9fdW5pcXVlX2lkX3QgUmVjb3JkaW5nQWN0aXZpdHlUcmFja2VyOjpnZXRSaWlkKCkKK3sKKyAgICBpZiAobVJJSWQgPT0gUkVDT1JEX1JJSURfSU5WQUxJRCAmJiBtQXVkaW9NYW5hZ2VyKSB7CisgICAgICAgIG1SSUlkID0gbUF1ZGlvTWFuYWdlci0+dHJhY2tSZWNvcmRlcihtVG9rZW4pOworICAgIH0KKyAgICByZXR1cm4gbVJJSWQ7Cit9CisKK3ZvaWQgUmVjb3JkaW5nQWN0aXZpdHlUcmFja2VyOjpyZWNvcmRpbmdTdGFydGVkKCkKK3sKKyAgICBpZiAoZ2V0UmlpZCgpICE9IFJFQ09SRF9SSUlEX0lOVkFMSUQgJiYgbUF1ZGlvTWFuYWdlcikgeworICAgICAgICBtQXVkaW9NYW5hZ2VyLT5yZWNvcmRlckV2ZW50KG1SSUlkLCBSRUNPUkRFUl9TVEFURV9TVEFSVEVEKTsKKyAgICB9Cit9CisKK3ZvaWQgUmVjb3JkaW5nQWN0aXZpdHlUcmFja2VyOjpyZWNvcmRpbmdTdG9wcGVkKCkKK3sKKyAgICBpZiAoZ2V0UmlpZCgpICE9IFJFQ09SRF9SSUlEX0lOVkFMSUQgJiYgbUF1ZGlvTWFuYWdlcikgeworICAgICAgICBtQXVkaW9NYW5hZ2VyLT5yZWNvcmRlckV2ZW50KG1SSUlkLCBSRUNPUkRFUl9TVEFURV9TVE9QUEVEKTsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RvbmVHZW5lcmF0b3IuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvVG9uZUdlbmVyYXRvci5jcHAKaW5kZXggZDg0NmQ3OS4uNTM2YjAwZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvVG9uZUdlbmVyYXRvci5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvVG9uZUdlbmVyYXRvci5jcHAKQEAgLTIwLDcgKzIwLDYgQEAKICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oPgogI2luY2x1ZGUgIm1lZGlhL1RvbmVHZW5lcmF0b3IuaCIKIAogCkBAIC0xMTc2LDEzICsxMTc1LDEzIEBACiAgICAgICAgICAgICAvLyBUaGlzIGlzIG5lZWRlZCBpbiBjYXNlIG9mIGNvbGQgc3RhcnQgb2YgdGhlIG91dHB1dCBzdHJlYW0uCiAgICAgICAgICAgICBpZiAoKG1TdGFydFRpbWUudHZfc2VjICE9IDApICYmIChjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnN0b3BUaW1lKSA9PSAwKSkgewogICAgICAgICAgICAgICAgIHRpbWVfdCBzZWMgPSBzdG9wVGltZS50dl9zZWMgLSBtU3RhcnRUaW1lLnR2X3NlYzsKLSAgICAgICAgICAgICAgICBsb25nIG5zZWMgPSBzdG9wVGltZS50dl9uc2VjIC0gbVN0YXJ0VGltZS50dl9uc2VjOworICAgICAgICAgICAgICAgIGF1dG8gbnNlYyA9IHN0b3BUaW1lLnR2X25zZWMgLSBtU3RhcnRUaW1lLnR2X25zZWM7CiAgICAgICAgICAgICAgICAgaWYgKG5zZWMgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgIC0tc2VjOwogICAgICAgICAgICAgICAgICAgICBuc2VjICs9IDEwMDAwMDAwMDA7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKChzZWMgKyAxKSA+ICgobG9uZykoSU5UX01BWCAvIG1TYW1wbGluZ1JhdGUpKSkgeworICAgICAgICAgICAgICAgIGlmICgoc2VjICsgMSkgPiAoKHRpbWVfdCkoSU5UX01BWCAvIG1TYW1wbGluZ1JhdGUpKSkgewogICAgICAgICAgICAgICAgICAgICBtTWF4U21wID0gc2VjICogbVNhbXBsaW5nUmF0ZTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAvLyBtU2FtcGxpbmdSYXRlIGlzIGFsd2F5cyA+IDEwMDAKQEAgLTEyNDIsNyArMTI0MSw3IEBACiAgICAgaWYgKG1TdHJlYW1UeXBlID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSB7CiAgICAgICAgIHN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fRFRNRjsKICAgICB9Ci0gICAgc3RyZWFtX3R5cGVfdG9fYXVkaW9fYXR0cmlidXRlcyhzdHJlYW1UeXBlLCAmYXR0cik7CisgICAgYXR0ciA9IEF1ZGlvU3lzdGVtOjpzdHJlYW1UeXBlVG9BdHRyaWJ1dGVzKHN0cmVhbVR5cGUpOwogCiAgICAgY29uc3Qgc2l6ZV90IGZyYW1lQ291bnQgPSBtUHJvY2Vzc1NpemU7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBBdWRpb1RyYWNrLT5zZXQoCkBAIC0xMjk3LDggKzEyOTYsOCBAQAogCiAgICAgQXVkaW9UcmFjazo6QnVmZmVyICpidWZmZXIgPSBzdGF0aWNfY2FzdDxBdWRpb1RyYWNrOjpCdWZmZXIgKj4oaW5mbyk7CiAgICAgVG9uZUdlbmVyYXRvciAqbHBUb25lR2VuID0gc3RhdGljX2Nhc3Q8VG9uZUdlbmVyYXRvciAqPih1c2VyKTsKLSAgICBzaG9ydCAqbHBPdXQgPSBidWZmZXItPmkxNjsKLSAgICB1bnNpZ25lZCBpbnQgbE51bVNtcCA9IGJ1ZmZlci0+c2l6ZS9zaXplb2Yoc2hvcnQpOworICAgIGludDE2X3QgKmxwT3V0ID0gYnVmZmVyLT5pMTY7CisgICAgdW5zaWduZWQgaW50IGxOdW1TbXAgPSBidWZmZXItPnNpemUvc2l6ZW9mKGludDE2X3QpOwogICAgIGNvbnN0IFRvbmVEZXNjcmlwdG9yICpscFRvbmVEZXNjID0gbHBUb25lR2VuLT5tcFRvbmVEZXNjOwogCiAgICAgaWYgKGJ1ZmZlci0+c2l6ZSA9PSAwKSByZXR1cm47CkBAIC0xMzY5LDcgKzEzNjgsNyBAQAogICAgICAgICAgICAgaWYgKGxwVG9uZURlc2MtPnNlZ21lbnRzW2xwVG9uZUdlbi0+bUN1clNlZ21lbnRdLndhdmVGcmVxWzBdICE9IDApIHsKICAgICAgICAgICAgICAgICBsV2F2ZUNtZCA9IFdhdmVHZW5lcmF0b3I6OldBVkVHRU5fU1RPUDsKICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbEZyZXFJZHggPSAwOwotICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IGxGcmVxdWVuY3kgPSBscFRvbmVEZXNjLT5zZWdtZW50c1tscFRvbmVHZW4tPm1DdXJTZWdtZW50XS53YXZlRnJlcVtsRnJlcUlkeF07CisgICAgICAgICAgICAgICAgdWludDE2X3QgbEZyZXF1ZW5jeSA9IGxwVG9uZURlc2MtPnNlZ21lbnRzW2xwVG9uZUdlbi0+bUN1clNlZ21lbnRdLndhdmVGcmVxW2xGcmVxSWR4XTsKIAogICAgICAgICAgICAgICAgIHdoaWxlIChsRnJlcXVlbmN5ICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgV2F2ZUdlbmVyYXRvciAqbHBXYXZlR2VuID0gbHBUb25lR2VuLT5tV2F2ZUdlbnMudmFsdWVGb3IobEZyZXF1ZW5jeSk7CkBAIC0xNDE5LDE2ICsxNDE4LDE4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBsV2F2ZUNtZCA9IFdhdmVHZW5lcmF0b3I6OldBVkVHRU5fU1RBUlQ7CiAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICBBTE9HVigiTmV3IHNlZ21lbnQgJWQsIE5leHQgVGltZTogJWQiLCBscFRvbmVHZW4tPm1DdXJTZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChscFRvbmVHZW4tPm1OZXh0U2VnU21wKjEwMDApL2xwVG9uZUdlbi0+bVNhbXBsaW5nUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJOZXcgc2VnbWVudCAlZCwgTmV4dCBUaW1lOiAlbGxkIiwgbHBUb25lR2VuLT5tQ3VyU2VnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGxvbmcgbG9uZykobHBUb25lR2VuLT5tTmV4dFNlZ1NtcCkqMTAwMCkvbHBUb25lR2VuLT5tU2FtcGxpbmdSYXRlKTsKKwogCiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgbEdlblNtcCA9IDA7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJFbmQgcmVwZWF0LCB0aW1lOiAlZCIsICh1bnNpZ25lZCBpbnQpKHN5c3RlbVRpbWUoKS8xMDAwMDAwKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiTmV3IHNlZ21lbnQgJWQsIE5leHQgVGltZTogJWQiLCBscFRvbmVHZW4tPm1DdXJTZWdtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgKGxwVG9uZUdlbi0+bU5leHRTZWdTbXAqMTAwMCkvbHBUb25lR2VuLT5tU2FtcGxpbmdSYXRlKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiTmV3IHNlZ21lbnQgJWQsIE5leHQgVGltZTogJWxsZCIsIGxwVG9uZUdlbi0+bUN1clNlZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAoKGxvbmcgbG9uZykobHBUb25lR2VuLT5tTmV4dFNlZ1NtcCkqMTAwMCkvbHBUb25lR2VuLT5tU2FtcGxpbmdSYXRlKTsKKwogICAgICAgICAgICAgICAgIGlmIChscFRvbmVEZXNjLT5zZWdtZW50c1tscFRvbmVHZW4tPm1DdXJTZWdtZW50XS53YXZlRnJlcVswXSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5leHQgc2VnbWVudCBpcyBub3Qgc2lsZW50LCAgT0ZGIC0+IE9OIHRyYW5zaXRpb24gOiByZXNldCB3YXZlIGdlbmVyYXRvcgogICAgICAgICAgICAgICAgICAgICBsV2F2ZUNtZCA9IFdhdmVHZW5lcmF0b3I6OldBVkVHRU5fU1RBUlQ7CkBAIC0xNDU1LDcgKzE0NTYsNyBAQAogICAgICAgICBpZiAobEdlblNtcCkgewogICAgICAgICAgICAgLy8gSWYgc2FtcGxlcyBtdXN0IGJlIGdlbmVyYXRlZCwgY2FsbCBhbGwgYWN0aXZlIHdhdmUgZ2VuZXJhdG9ycyBhbmQgYWN1bXVsYXRlIHdhdmVzIGluIGxwT3V0CiAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbEZyZXFJZHggPSAwOwotICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgbEZyZXF1ZW5jeSA9IGxwVG9uZURlc2MtPnNlZ21lbnRzW2xwVG9uZUdlbi0+bUN1clNlZ21lbnRdLndhdmVGcmVxW2xGcmVxSWR4XTsKKyAgICAgICAgICAgIHVpbnQxNl90IGxGcmVxdWVuY3kgPSBscFRvbmVEZXNjLT5zZWdtZW50c1tscFRvbmVHZW4tPm1DdXJTZWdtZW50XS53YXZlRnJlcVtsRnJlcUlkeF07CiAKICAgICAgICAgICAgIHdoaWxlIChsRnJlcXVlbmN5ICE9IDApIHsKICAgICAgICAgICAgICAgICBXYXZlR2VuZXJhdG9yICpscFdhdmVHZW4gPSBscFRvbmVHZW4tPm1XYXZlR2Vucy52YWx1ZUZvcihsRnJlcXVlbmN5KTsKQEAgLTE2OTQsMTcgKzE2OTUsMTcgQEAKIC8vCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogVG9uZUdlbmVyYXRvcjo6V2F2ZUdlbmVyYXRvcjo6V2F2ZUdlbmVyYXRvcih1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgIHVuc2lnbmVkIHNob3J0IGZyZXF1ZW5jeSwgZmxvYXQgdm9sdW1lKSB7CisgICAgICAgIHVpbnQxNl90IGZyZXF1ZW5jeSwgZmxvYXQgdm9sdW1lKSB7CiAgICAgZG91YmxlIGQwOwogICAgIGRvdWJsZSBGX2Rpdl9GczsgIC8vIGZyZXF1ZW5jeSAvIHNhbXBsaW5nUmF0ZQogCiAgICAgRl9kaXZfRnMgPSBmcmVxdWVuY3kgLyAoZG91YmxlKXNhbXBsaW5nUmF0ZTsKICAgICBkMCA9IC0gKGZsb2F0KUdFTl9BTVAgKiBzaW4oMiAqIE1fUEkgKiBGX2Rpdl9Gcyk7Ci0gICAgbVMyXzAgPSAoc2hvcnQpZDA7CisgICAgbVMyXzAgPSAoaW50MTZfdClkMDsKICAgICBtUzEgPSAwOwogICAgIG1TMiA9IG1TMl8wOwogCi0gICAgbUFtcGxpdHVkZV9RMTUgPSAoc2hvcnQpKDMyNzY3LiAqIDMyNzY3LiAqIHZvbHVtZSAvIEdFTl9BTVApOworICAgIG1BbXBsaXR1ZGVfUTE1ID0gKGludDE2X3QpKDMyNzY3LiAqIDMyNzY3LiAqIHZvbHVtZSAvIEdFTl9BTVApOwogICAgIC8vIHRha2Ugc29tZSBtYXJnaW4gZm9yIGFtcGxpdHVkZSBmbHVjdHVhdGlvbgogICAgIGlmIChtQW1wbGl0dWRlX1ExNSA+IDMyNTAwKQogICAgICAgICBtQW1wbGl0dWRlX1ExNSA9IDMyNTAwOwpAQCAtMTcxMiw3ICsxNzEzLDcgQEAKICAgICBkMCA9IDMyNzY4LjAgKiBjb3MoMiAqIE1fUEkgKiBGX2Rpdl9Gcyk7ICAvLyBRMTQqMipjb3MoKQogICAgIGlmIChkMCA+IDMyNzY3KQogICAgICAgICBkMCA9IDMyNzY3OwotICAgIG1BMV9RMTQgPSAoc2hvcnQpIGQwOworICAgIG1BMV9RMTQgPSAoaW50MTZfdCkgZDA7CiAKICAgICBBTE9HVigiV2F2ZUdlbmVyYXRvciBpbml0LCBtQTFfUTE0OiAlZCwgbVMyXzA6ICVkLCBtQW1wbGl0dWRlX1ExNTogJWQiLAogICAgICAgICAgICAgbUExX1ExNCwgbVMyXzAsIG1BbXBsaXR1ZGVfUTE1KTsKQEAgLTE3NTAsNyArMTc1MSw3IEBACiAvLyAgICAgICAgbm9uZQogLy8KIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIFRvbmVHZW5lcmF0b3I6OldhdmVHZW5lcmF0b3I6OmdldFNhbXBsZXMoc2hvcnQgKm91dEJ1ZmZlciwKK3ZvaWQgVG9uZUdlbmVyYXRvcjo6V2F2ZUdlbmVyYXRvcjo6Z2V0U2FtcGxlcyhpbnQxNl90ICpvdXRCdWZmZXIsCiAgICAgICAgIHVuc2lnbmVkIGludCBjb3VudCwgdW5zaWduZWQgaW50IGNvbW1hbmQpIHsKICAgICBsb25nIGxTMSwgbFMyOwogICAgIGxvbmcgbEExLCBsQW1wbGl0dWRlOwpAQCAtMTc4MSw3ICsxNzgyLDcgQEAKICAgICAgICAgICAgIGxTMiA9IGxTMTsKICAgICAgICAgICAgIGxTMSA9IFNhbXBsZTsKICAgICAgICAgICAgIFNhbXBsZSA9ICgobEFtcGxpdHVkZT4+MTYpICogU2FtcGxlKSA+PiBTX1ExNTsKLSAgICAgICAgICAgICoob3V0QnVmZmVyKyspICs9IChzaG9ydClTYW1wbGU7ICAvLyBwdXQgcmVzdWx0IGluIGJ1ZmZlcgorICAgICAgICAgICAgKihvdXRCdWZmZXIrKykgKz0gKGludDE2X3QpU2FtcGxlOyAgLy8gcHV0IHJlc3VsdCBpbiBidWZmZXIKICAgICAgICAgICAgIGxBbXBsaXR1ZGUgLT0gZGVjOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTE3OTMsNyArMTc5NCw3IEBACiAgICAgICAgICAgICBsUzIgPSBsUzE7CiAgICAgICAgICAgICBsUzEgPSBTYW1wbGU7CiAgICAgICAgICAgICBTYW1wbGUgPSAobEFtcGxpdHVkZSAqIFNhbXBsZSkgPj4gU19RMTU7Ci0gICAgICAgICAgICAqKG91dEJ1ZmZlcisrKSArPSAoc2hvcnQpU2FtcGxlOyAgLy8gcHV0IHJlc3VsdCBpbiBidWZmZXIKKyAgICAgICAgICAgICoob3V0QnVmZmVyKyspICs9IChpbnQxNl90KVNhbXBsZTsgIC8vIHB1dCByZXN1bHQgaW4gYnVmZmVyCiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9SZWNvcmQuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9SZWNvcmQuYWlkbAppbmRleCAwMWUwYTcxLi5lY2Y1OGI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvUmVjb3JkLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1JlY29yZC5haWRsCkBAIC0zNiw0ICszNiwxMiBAQAogICAvKiBHZXQgYSBsaXN0IG9mIGN1cnJlbnQgYWN0aXZlIG1pY3JvcGhvbmVzLgogICAgKi8KICAgdm9pZCBnZXRBY3RpdmVNaWNyb3Bob25lcyhvdXQgTWljcm9waG9uZUluZm9bXSBhY3RpdmVNaWNyb3Bob25lcyk7CisKKyAgLyogU2V0IHRoZSBtaWNyb3Bob25lIGRpcmVjdGlvbiAoZm9yIHByb2Nlc3NpbmcpLgorICAgKi8KKyAgdm9pZCBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGludCAvKmF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QqLyBkaXJlY3Rpb24pOworCisgIC8qIFNldCB0aGUgbWljcm9waG9uZSB6b29tIChmb3IgcHJvY2Vzc2luZykuCisgICAqLworICB2b2lkIHNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQXR0cmlidXRlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMzVlOWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQXR0cmlidXRlcy5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Db21tb25UeXBlcy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEF1ZGlvQXR0cmlidXRlcyA6IHB1YmxpYyBQYXJjZWxhYmxlCit7CitwdWJsaWM6CisgICAgQXVkaW9BdHRyaWJ1dGVzKCkgPSBkZWZhdWx0OworICAgIEF1ZGlvQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMpIDogbUF0dHJpYnV0ZXMoYXR0cmlidXRlcykge30KKyAgICBBdWRpb0F0dHJpYnV0ZXModm9sdW1lX2dyb3VwX3QgZ3JvdXBJZCwKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcykgOgorICAgICAgICAgbUF0dHJpYnV0ZXMoYXR0cmlidXRlcyksIG1TdHJlYW1UeXBlKHN0cmVhbSksIG1Hcm91cElkKGdyb3VwSWQpIHt9CisKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgZ2V0QXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIG1BdHRyaWJ1dGVzOyB9CisKKyAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IGdldFN0cmVhbVR5cGUoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtVHlwZTsgfQorICAgIHZvbHVtZV9ncm91cF90IGdldEdyb3VwSWQoKSBjb25zdCB7IHJldHVybiBtR3JvdXBJZDsgfQorCitwcml2YXRlOgorICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBtQXR0cmlidXRlcyA9IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVI7CisgICAgLyoqCisgICAgICogQGJyaWVmIG1TdHJlYW1UeXBlOiBmb3IgbGVnYWN5IHZvbHVtZSBtYW5hZ2VtZW50LCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gY29udmVydCBhbiBhdHRyaWJ1dGUKKyAgICAgKiB0byBhIGdpdmVuIHN0cmVhbSB0eXBlLgorICAgICAqLworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fREVGQVVMVDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBtR3JvdXBJZDogZm9yIGZ1dHVyZSB2b2x1bWUgbWFuYWdlbWVudCwgZGVmaW5lIGdyb3VwcyB3aXRoaW4gYSBzdHJhdGVneSB0aGF0IGZvbGxvd3MKKyAgICAgKiB0aGUgc2FtZSBjdXJ2ZXMgb2Ygdm9sdW1lIChleHRlbnNpb24gb2Ygc3RyZWFtIHR5cGVzIHRvIG1hbmFnZSB2b2x1bWUpCisgICAgICovCisgICAgdm9sdW1lX2dyb3VwX3QgbUdyb3VwSWQgPSBWT0xVTUVfR1JPVVBfTk9ORTsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Db21tb25UeXBlcy5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0NvbW1vblR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU0NDZlYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Db21tb25UeXBlcy5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZW51bSBwcm9kdWN0X3N0cmF0ZWd5X3QgOiB1aW50MzJfdDsKK2NvbnN0IHByb2R1Y3Rfc3RyYXRlZ3lfdCBQUk9EVUNUX1NUUkFURUdZX05PTkUgPSBzdGF0aWNfY2FzdDxwcm9kdWN0X3N0cmF0ZWd5X3Q+KC0xKTsKKwordXNpbmcgQXR0cmlidXRlc1ZlY3RvciA9IHN0ZDo6dmVjdG9yPGF1ZGlvX2F0dHJpYnV0ZXNfdD47Cit1c2luZyBTdHJlYW1UeXBlVmVjdG9yID0gc3RkOjp2ZWN0b3I8YXVkaW9fc3RyZWFtX3R5cGVfdD47CisKK2NvbnN0ZXhwciBib29sIG9wZXJhdG9yPT0oY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZsaHMsIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmcmhzKQoreworICAgIHJldHVybiBsaHMudXNhZ2UgPT0gcmhzLnVzYWdlICYmIGxocy5jb250ZW50X3R5cGUgPT0gcmhzLmNvbnRlbnRfdHlwZSAmJgorICAgICAgICAgICAgbGhzLmZsYWdzID09IHJocy5mbGFncyAmJiAoc3RkOjpzdHJjbXAobGhzLnRhZ3MsIHJocy50YWdzKSA9PSAwKTsKK30KK2NvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0oY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZsaHMsIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmcmhzKQoreworICAgIHJldHVybiAhKGxocz09cmhzKTsKK30KKworZW51bSB2b2x1bWVfZ3JvdXBfdCA6IHVpbnQzMl90Oworc3RhdGljIGNvbnN0IHZvbHVtZV9ncm91cF90IFZPTFVNRV9HUk9VUF9OT05FID0gc3RhdGljX2Nhc3Q8dm9sdW1lX2dyb3VwX3Q+KC0xKTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmgKaW5kZXggYmZjMDY4Yi4uNmJkNDEzNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaApAQCAtOTAsMjcgKzkwLDM0IEBACiAgICAgICovCiAgICAgc3RhdGljIHN0YXR1c190IHF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKTsKIAotCiAgICAgLyoKLSAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yIGZvciB0aGUgc3BlY2lmaWVkIGVmZmVjdCB1dWlkLgorICAgICAqIFJldHVybnMgYSBkZXNjcmlwdG9yIGZvciB0aGUgc3BlY2lmaWVkIGVmZmVjdCB1dWlkIG9yIHR5cGUuCisgICAgICoKKyAgICAgKiBMb29rdXAgYW4gZWZmZWN0IGJ5IHV1aWQsIG9yIGlmIHRoYXQncyB1bnNwZWNpZmllZCAoRUZGRUNUX1VVSURfTlVMTCksCisgICAgICogZG8gc28gYnkgdHlwZSBhbmQgcHJlZmVycmVkIGZsYWdzIGluc3RlYWQuCiAgICAgICoKICAgICAgKiBQYXJhbWV0ZXJzOgogICAgICAqICAgICAgdXVpZDogICAgICAgcG9pbnRlciB0byBlZmZlY3QgdXVpZC4KKyAgICAgKiAgICAgIHR5cGU6ICAgICAgIHBvaW50ZXIgdG8gZWZmZWN0IHR5cGUgdXVpZC4KKyAgICAgKiAgICAgIHByZWZlcnJlZFR5cGVGbGFnczogaWYgbXVsdGlwbGUgZWZmZWN0cyBvZiB0aGUgZ2l2ZW4gdHlwZSBleGlzdCwKKyAgICAgKiAgICAgICAgICAgICAgICAgIG9uZSB3aXRoIGEgbWF0Y2hpbmcgdHlwZSBmbGFnIHdpbGwgYmUgY2hvc2VuIG92ZXIgb25lIHdpdGhvdXQuCisgICAgICogICAgICAgICAgICAgICAgICBVc2UgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLIHRvIGluZGljYXRlIG5vIHByZWZlcmVuY2UuCiAgICAgICogICAgICBkZXNjcmlwdG9yOiBhZGRyZXNzIHdoZXJlIHRoZSBlZmZlY3QgZGVzY3JpcHRvciBzaG91bGQgYmUgcmV0dXJuZWQuCiAgICAgICoKICAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKICAgICAgKiAgICAgIE5PX0VSUk9SICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KICAgICAgKiAgICAgIFBFUk1JU1NJT05fREVOSUVEIGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIGludGVyZmFjZQogICAgICAqICAgICAgTk9fSU5JVCAgICAgICAgIGVmZmVjdCBsaWJyYXJ5IGZhaWxlZCB0byBpbml0aWFsaXplCi0gICAgICogICAgICBCQURfVkFMVUUgICAgICAgaW52YWxpZCB1dWlkIG9yIGRlc2NyaXB0b3IgcG9pbnRlcnMKKyAgICAgKiAgICAgIEJBRF9WQUxVRSAgICAgICBpbnZhbGlkIHR5cGUgb3IgZGVzY3JpcHRvciBwb2ludGVycwogICAgICAqICAgICAgTkFNRV9OT1RfRk9VTkQgIG5vIGVmZmVjdCB3aXRoIHRoaXMgdXVpZCBmb3VuZAogICAgICAqCiAgICAgICogUmV0dXJuZWQgdmFsdWUKICAgICAgKiAgICpkZXNjcmlwdG9yIHVwZGF0ZWQgd2l0aCBlZmZlY3QgZGVzY3JpcHRvcgogICAgICAqLwogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRFZmZlY3REZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcikgLypjb25zdCovOwotCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKTsKIAogICAgIC8qCiAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZGVzY3JpcHRvcnMgY29ycmVzcG9uZGluZyB0byB0aGUgcHJlIHByb2Nlc3NpbmdzIGVuYWJsZWQgYnkgZGVmYXVsdApAQCAtMTQ0LDYgKzE1MSwxMzIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpOwogCiAgICAgLyoKKyAgICAgKiBHZXRzIGEgbmV3IHN5c3RlbS13aWRlIHVuaXF1ZSBlZmZlY3QgaWQuCisgICAgICoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqICAgICAgaWQ6IFRoZSBhZGRyZXNzIHRvIHJldHVybiB0aGUgZ2VuZXJhdGVkIGlkLgorICAgICAqCisgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CisgICAgICogICAgICBOT19FUlJPUiAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisgICAgICogICAgICBQRVJNSVNTSU9OX0RFTklFRCBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciBpbnRlcmZhY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9yIGNhbGxlciBsYWNrcyByZXF1aXJlZCBwZXJtaXNzaW9ucy4KKyAgICAgKiBSZXR1cm5lZCB2YWx1ZQorICAgICAqICAgKmlkOiAgVGhlIG5ldyB1bmlxdWUgc3lzdGVtLXdpZGUgZWZmZWN0IGlkLgorICAgICAqLworICAgIHN0YXRpYyBzdGF0dXNfdCBuZXdFZmZlY3RVbmlxdWVJZChhdWRpb191bmlxdWVfaWRfdCogaWQpOworCisgICAgLyoKKyAgICAgKiBTdGF0aWMgbWV0aG9kcyBmb3IgYWRkaW5nL3JlbW92aW5nIHN5c3RlbS13aWRlIGVmZmVjdHMuCisgICAgICovCisKKyAgICAvKgorICAgICAqIEFkZHMgYW4gZWZmZWN0IHRvIHRoZSBsaXN0IG9mIGRlZmF1bHQgb3V0cHV0IGVmZmVjdHMgZm9yIGEgZ2l2ZW4gc291cmNlIHR5cGUuCisgICAgICoKKyAgICAgKiBJZiB0aGUgZWZmZWN0IGlzIG5vIGxvbmdlciBhdmFpbGFibGUgd2hlbiBhIHNvdXJjZSBvZiB0aGUgZ2l2ZW4gdHlwZQorICAgICAqIGlzIGNyZWF0ZWQsIHRoZSBzeXN0ZW0gd2lsbCBjb250aW51ZSB3aXRob3V0IGFkZGluZyBpdC4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogICB0eXBlU3RyOiAgVHlwZSB1dWlkIG9mIGVmZmVjdCB0byBiZSBhIGRlZmF1bHQ6IGNhbiBiZSBudWxsIGlmIHV1aWRTdHIgaXMgc3BlY2lmaWVkLgorICAgICAqICAgICAgICAgICAgIFRoaXMgbWF5IGNvcnJlc3BvbmQgdG8gdGhlIE9wZW5TTCBFUyBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgdGhpcyBlZmZlY3QsCisgICAgICogICAgICAgICAgICAgb3IgY291bGQgYmUgc29tZSB2ZW5kb3ItZGVmaW5lZCB0eXBlLgorICAgICAqICAgb3BQYWNrYWdlTmFtZTogVGhlIHBhY2thZ2UgbmFtZSB1c2VkIGZvciBhcHAgb3AgY2hlY2tzLgorICAgICAqICAgdXVpZFN0cjogIFV1aWQgb2YgZWZmZWN0IHRvIGJlIGEgZGVmYXVsdDogY2FuIGJlIG51bGwgaWYgdHlwZSBpcyBzcGVjaWZpZWQuCisgICAgICogICAgICAgICAgICAgVGhpcyB1dWlkIGNvcnJlc3BvbmRzIHRvIGEgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbiBvZiBhbiBlZmZlY3QgdHlwZS4KKyAgICAgKiAgICAgICAgICAgICBOb3RlIGlmIGJvdGggdXVpZFN0ciBhbmQgdHlwZVN0ciBhcmUgc3BlY2lmaWVkLCB0eXBlU3RyIGlzIGlnbm9yZWQuCisgICAgICogICBwcmlvcml0eTogUmVxdWVzdGVkIHByaW9yaXR5IGZvciBlZmZlY3QgY29udHJvbDogdGhlIHByaW9yaXR5IGxldmVsIGNvcnJlc3BvbmRzIHRvIHRoZQorICAgICAqICAgICAgICAgICAgIHZhbHVlIG9mIHByaW9yaXR5IHBhcmFtZXRlcjogbmVnYXRpdmUgdmFsdWVzIGluZGljYXRlIGxvd2VyIHByaW9yaXRpZXMsIHBvc2l0aXZlCisgICAgICogICAgICAgICAgICAgdmFsdWVzIGhpZ2hlciBwcmlvcml0aWVzLCAwIGJlaW5nIHRoZSBub3JtYWwgcHJpb3JpdHkuCisgICAgICogICBzb3VyY2U6ICAgVGhlIHNvdXJjZSB0aGlzIGVmZmVjdCBzaG91bGQgYmUgYSBkZWZhdWx0IGZvci4KKyAgICAgKiAgIGlkOiAgICAgICBBZGRyZXNzIHdoZXJlIHRoZSBzeXN0ZW0td2lkZSB1bmlxdWUgaWQgb2YgdGhlIGRlZmF1bHQgZWZmZWN0IHNob3VsZCBiZSByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgorICAgICAqICAgICAgTk9fRVJST1IgICAgICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgorICAgICAqICAgICAgUEVSTUlTU0lPTl9ERU5JRUQgY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIgaW50ZXJmYWNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBvciBjYWxsZXIgbGFja3MgcmVxdWlyZWQgcGVybWlzc2lvbnMuCisgICAgICogICAgICBOT19JTklUICAgICAgICAgZWZmZWN0IGxpYnJhcnkgZmFpbGVkIHRvIGluaXRpYWxpemUuCisgICAgICogICAgICBCQURfVkFMVUUgICAgICAgaW52YWxpZCBzb3VyY2UsIHR5cGUgdXVpZCBvciBpbXBsZW1lbnRhdGlvbiB1dWlkLgorICAgICAqICAgICAgTkFNRV9OT1RfRk9VTkQgIG5vIGVmZmVjdCB3aXRoIHRoaXMgdXVpZCBvciB0eXBlIGZvdW5kLgorICAgICAqCisgICAgICogUmV0dXJuZWQgdmFsdWUKKyAgICAgKiAgICppZDogIFRoZSBzeXN0ZW0td2lkZSB1bmlxdWUgaWQgb2YgdGhlIGFkZGVkIGRlZmF1bHQgZWZmZWN0LgorICAgICAqLworICAgIHN0YXRpYyBzdGF0dXNfdCBhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KGNvbnN0IGNoYXIqIHR5cGVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdXVpZFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpOworCisgICAgLyoKKyAgICAgKiBBZGRzIGFuIGVmZmVjdCB0byB0aGUgbGlzdCBvZiBkZWZhdWx0IG91dHB1dCBlZmZlY3RzIGZvciBhIGdpdmVuIHN0cmVhbSB0eXBlLgorICAgICAqCisgICAgICogSWYgdGhlIGVmZmVjdCBpcyBubyBsb25nZXIgYXZhaWxhYmxlIHdoZW4gYSBzdHJlYW0gb2YgdGhlIGdpdmVuIHR5cGUKKyAgICAgKiBpcyBjcmVhdGVkLCB0aGUgc3lzdGVtIHdpbGwgY29udGludWUgd2l0aG91dCBhZGRpbmcgaXQuCisgICAgICoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqICAgdHlwZVN0cjogIFR5cGUgdXVpZCBvZiBlZmZlY3QgdG8gYmUgYSBkZWZhdWx0OiBjYW4gYmUgbnVsbCBpZiB1dWlkU3RyIGlzIHNwZWNpZmllZC4KKyAgICAgKiAgICAgICAgICAgICBUaGlzIG1heSBjb3JyZXNwb25kIHRvIHRoZSBPcGVuU0wgRVMgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHRoaXMgZWZmZWN0LAorICAgICAqICAgICAgICAgICAgIG9yIGNvdWxkIGJlIHNvbWUgdmVuZG9yLWRlZmluZWQgdHlwZS4KKyAgICAgKiAgIG9wUGFja2FnZU5hbWU6IFRoZSBwYWNrYWdlIG5hbWUgdXNlZCBmb3IgYXBwIG9wIGNoZWNrcy4KKyAgICAgKiAgIHV1aWRTdHI6ICBVdWlkIG9mIGVmZmVjdCB0byBiZSBhIGRlZmF1bHQ6IGNhbiBiZSBudWxsIGlmIHR5cGUgaXMgc3BlY2lmaWVkLgorICAgICAqICAgICAgICAgICAgIFRoaXMgdXVpZCBjb3JyZXNwb25kcyB0byBhIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gb2YgYW4gZWZmZWN0IHR5cGUuCisgICAgICogICAgICAgICAgICAgTm90ZSBpZiBib3RoIHV1aWRTdHIgYW5kIHR5cGVTdHIgYXJlIHNwZWNpZmllZCwgdHlwZVN0ciBpcyBpZ25vcmVkLgorICAgICAqICAgcHJpb3JpdHk6IFJlcXVlc3RlZCBwcmlvcml0eSBmb3IgZWZmZWN0IGNvbnRyb2w6IHRoZSBwcmlvcml0eSBsZXZlbCBjb3JyZXNwb25kcyB0byB0aGUKKyAgICAgKiAgICAgICAgICAgICB2YWx1ZSBvZiBwcmlvcml0eSBwYXJhbWV0ZXI6IG5lZ2F0aXZlIHZhbHVlcyBpbmRpY2F0ZSBsb3dlciBwcmlvcml0aWVzLCBwb3NpdGl2ZQorICAgICAqICAgICAgICAgICAgIHZhbHVlcyBoaWdoZXIgcHJpb3JpdGllcywgMCBiZWluZyB0aGUgbm9ybWFsIHByaW9yaXR5LgorICAgICAqICAgdXNhZ2U6ICAgIFRoZSB1c2FnZSB0aGlzIGVmZmVjdCBzaG91bGQgYmUgYSBkZWZhdWx0IGZvci4gVW5yZWNvZ25pemVkIHZhbHVlcyB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgdHJlYXRlZCBhcyBBVURJT19VU0FHRV9VTktOT1dOLgorICAgICAqICAgaWQ6ICAgICAgIEFkZHJlc3Mgd2hlcmUgdGhlIHN5c3RlbS13aWRlIHVuaXF1ZSBpZCBvZiB0aGUgZGVmYXVsdCBlZmZlY3Qgc2hvdWxkIGJlIHJldHVybmVkLgorICAgICAqCisgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CisgICAgICogICAgICBOT19FUlJPUiAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisgICAgICogICAgICBQRVJNSVNTSU9OX0RFTklFRCBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciBpbnRlcmZhY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9yIGNhbGxlciBsYWNrcyByZXF1aXJlZCBwZXJtaXNzaW9ucy4KKyAgICAgKiAgICAgIE5PX0lOSVQgICAgICAgICBlZmZlY3QgbGlicmFyeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZS4KKyAgICAgKiAgICAgIEJBRF9WQUxVRSAgICAgICBpbnZhbGlkIHR5cGUgdXVpZCBvciBpbXBsZW1lbnRhdGlvbiB1dWlkLgorICAgICAqICAgICAgTkFNRV9OT1RfRk9VTkQgIG5vIGVmZmVjdCB3aXRoIHRoaXMgdXVpZCBvciB0eXBlIGZvdW5kLgorICAgICAqCisgICAgICogUmV0dXJuZWQgdmFsdWUKKyAgICAgKiAgICppZDogIFRoZSBzeXN0ZW0td2lkZSB1bmlxdWUgaWQgb2YgdGhlIGFkZGVkIGRlZmF1bHQgZWZmZWN0LgorICAgICAqLworICAgIHN0YXRpYyBzdGF0dXNfdCBhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IGNoYXIqIHR5cGVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdXVpZFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKTsKKworICAgIC8qCisgICAgICogUmVtb3ZlcyBhbiBlZmZlY3QgZnJvbSB0aGUgbGlzdCBvZiBkZWZhdWx0IG91dHB1dCBlZmZlY3RzIGZvciBhIGdpdmVuIHNvdXJjZSB0eXBlLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgICAgIGlkOiBUaGUgc3lzdGVtLXdpZGUgdW5pcXVlIGlkIG9mIHRoZSBlZmZlY3QgdGhhdCBzaG91bGQgbm8gbG9uZ2VyIGJlIGEgZGVmYXVsdC4KKyAgICAgKgorICAgICAqIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgorICAgICAqICAgICAgTk9fRVJST1IgICAgICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgorICAgICAqICAgICAgUEVSTUlTU0lPTl9ERU5JRUQgY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIgaW50ZXJmYWNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBvciBjYWxsZXIgbGFja3MgcmVxdWlyZWQgcGVybWlzc2lvbnMuCisgICAgICogICAgICBOT19JTklUICAgICAgICAgZWZmZWN0IGxpYnJhcnkgZmFpbGVkIHRvIGluaXRpYWxpemUuCisgICAgICogICAgICBCQURfVkFMVUUgICAgICAgaW52YWxpZCBpZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgcmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCk7CisKKyAgICAvKgorICAgICAqIFJlbW92ZXMgYW4gZWZmZWN0IGZyb20gdGhlIGxpc3Qgb2YgZGVmYXVsdCBvdXRwdXQgZWZmZWN0cyBmb3IgYSBnaXZlbiBzdHJlYW0gdHlwZS4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogICAgICBpZDogVGhlIHN5c3RlbS13aWRlIHVuaXF1ZSBpZCBvZiB0aGUgZWZmZWN0IHRoYXQgc2hvdWxkIG5vIGxvbmdlciBiZSBhIGRlZmF1bHQuCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgICAgIE5PX0VSUk9SICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKyAgICAgKiAgICAgIFBFUk1JU1NJT05fREVOSUVEIGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIGludGVyZmFjZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgb3IgY2FsbGVyIGxhY2tzIHJlcXVpcmVkIHBlcm1pc3Npb25zLgorICAgICAqICAgICAgTk9fSU5JVCAgICAgICAgIGVmZmVjdCBsaWJyYXJ5IGZhaWxlZCB0byBpbml0aWFsaXplLgorICAgICAqICAgICAgQkFEX1ZBTFVFICAgICAgIGludmFsaWQgaWQuCisgICAgICovCisgICAgc3RhdGljIHN0YXR1c190IHJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpOworCisgICAgLyoKICAgICAgKiBFdmVudHMgdXNlZCBieSBjYWxsYmFjayBmdW5jdGlvbiAoZWZmZWN0X2NhbGxiYWNrX3QpLgogICAgICAqLwogICAgIGVudW0gZXZlbnRfdHlwZSB7CkBAIC00MTQsNiArNTQ3LDcgQEAKICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAgICAgbURlc2NyaXB0b3I7ICAgICAgICAvLyBlZmZlY3QgZGVzY3JpcHRvcgogICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtSWQ7ICAgICAgICAgICAgICAgIC8vIHN5c3RlbSB3aWRlIHVuaXF1ZSBlZmZlY3QgZW5naW5lIGluc3RhbmNlIElECiAgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgIG1Mb2NrOyAgICAgICAgICAgICAgLy8gTXV0ZXggZm9yIG1FbmFibGVkIGFjY2VzcworICAgICBNdXRleCAgICAgICAgICAgICAgICAgICBtQ29uc3RydWN0TG9jazsgICAgIC8vIE11dGV4IGZvciBpbnRlZ3JhbGl0eSBjb25zdHJ1Y3Rpb24KIAogICAgICBTdHJpbmcxNiAgICAgICAgICAgICAgICBtT3BQYWNrYWdlTmFtZTsgICAgIC8vIFRoZSBwYWNrYWdlIG5hbWUgdXNlZCBmb3IgYXBwIG9wIGNoZWNrcy4KIApAQCAtNDQwLDEyICs1NzQsMjIgQEAKICAgICAgICAgdmlydHVhbCB2b2lkIGNvbnRyb2xTdGF0dXNDaGFuZ2VkKGJvb2wgY29udHJvbEdyYW50ZWQpIHsKICAgICAgICAgICAgIHNwPEF1ZGlvRWZmZWN0PiBlZmZlY3QgPSBtRWZmZWN0LnByb21vdGUoKTsKICAgICAgICAgICAgIGlmIChlZmZlY3QgIT0gMCkgeworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gR290IHRoZSBtQ29uc3RydWN0TG9jayBtZWFucyB0aGUgY29uc3RydWN0aW9uIG9mIEF1ZGlvRWZmZWN0CisgICAgICAgICAgICAgICAgICAgIC8vIGhhcyBmaW5pc2hlZCwgd2Ugc2hvdWxkIHJlbGVhc2UgdGhlIG1Db25zdHJ1Y3RMb2NrIGltbWVkaWF0ZWx5LgorICAgICAgICAgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhlZmZlY3QtPm1Db25zdHJ1Y3RMb2NrKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWZmZWN0LT5jb250cm9sU3RhdHVzQ2hhbmdlZChjb250cm9sR3JhbnRlZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgdmlydHVhbCB2b2lkIGVuYWJsZVN0YXR1c0NoYW5nZWQoYm9vbCBlbmFibGVkKSB7CiAgICAgICAgICAgICBzcDxBdWRpb0VmZmVjdD4gZWZmZWN0ID0gbUVmZmVjdC5wcm9tb3RlKCk7CiAgICAgICAgICAgICBpZiAoZWZmZWN0ICE9IDApIHsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIEdvdCB0aGUgbUNvbnN0cnVjdExvY2sgbWVhbnMgdGhlIGNvbnN0cnVjdGlvbiBvZiBBdWRpb0VmZmVjdAorICAgICAgICAgICAgICAgICAgICAvLyBoYXMgZmluaXNoZWQsIHdlIHNob3VsZCByZWxlYXNlIHRoZSBtQ29uc3RydWN0TG9jayBpbW1lZGlhdGVseS4KKyAgICAgICAgICAgICAgICAgICAgQXV0b011dGV4IGxvY2soZWZmZWN0LT5tQ29uc3RydWN0TG9jayk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGVmZmVjdC0+ZW5hYmxlU3RhdHVzQ2hhbmdlZChlbmFibGVkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDU2LDYgKzYwMCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBSZXBseURhdGEpIHsKICAgICAgICAgICAgIHNwPEF1ZGlvRWZmZWN0PiBlZmZlY3QgPSBtRWZmZWN0LnByb21vdGUoKTsKICAgICAgICAgICAgIGlmIChlZmZlY3QgIT0gMCkgeworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gR290IHRoZSBtQ29uc3RydWN0TG9jayBtZWFucyB0aGUgY29uc3RydWN0aW9uIG9mIEF1ZGlvRWZmZWN0CisgICAgICAgICAgICAgICAgICAgIC8vIGhhcyBmaW5pc2hlZCwgd2Ugc2hvdWxkIHJlbGVhc2UgdGhlIG1Db25zdHJ1Y3RMb2NrIGltbWVkaWF0ZWx5LgorICAgICAgICAgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhlZmZlY3QtPm1Db25zdHJ1Y3RMb2NrKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZWZmZWN0LT5jb21tYW5kRXhlY3V0ZWQoCiAgICAgICAgICAgICAgICAgICAgIGNtZENvZGUsIGNtZFNpemUsIHBDbWREYXRhLCByZXBseVNpemUsIHBSZXBseURhdGEpOwogICAgICAgICAgICAgfQpAQCAtNDY1LDYgKzYxNCwxMSBAQAogICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgLyp3aG8qLykgewogICAgICAgICAgICAgc3A8QXVkaW9FZmZlY3Q+IGVmZmVjdCA9IG1FZmZlY3QucHJvbW90ZSgpOwogICAgICAgICAgICAgaWYgKGVmZmVjdCAhPSAwKSB7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvLyBHb3QgdGhlIG1Db25zdHJ1Y3RMb2NrIG1lYW5zIHRoZSBjb25zdHJ1Y3Rpb24gb2YgQXVkaW9FZmZlY3QKKyAgICAgICAgICAgICAgICAgICAgLy8gaGFzIGZpbmlzaGVkLCB3ZSBzaG91bGQgcmVsZWFzZSB0aGUgbUNvbnN0cnVjdExvY2sgaW1tZWRpYXRlbHkuCisgICAgICAgICAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKGVmZmVjdC0+bUNvbnN0cnVjdExvY2spOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBlZmZlY3QtPmJpbmRlckRpZWQoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5oCmluZGV4IDg1OWYxYTkuLjk4MWQzM2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Jb0Rlc2NyaXB0b3IuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvSW9EZXNjcmlwdG9yLmgKQEAgLTI4LDYgKzI4LDcgQEAKICAgICBBVURJT19JTlBVVF9PUEVORUQsCiAgICAgQVVESU9fSU5QVVRfQ0xPU0VELAogICAgIEFVRElPX0lOUFVUX0NPTkZJR19DSEFOR0VELAorICAgIEFVRElPX0NMSUVOVF9TVEFSVEVELAogfTsKIAogLy8gYXVkaW8gaW5wdXQvb3V0cHV0IGRlc2NyaXB0b3IgdXNlZCB0byBjYWNoZSBvdXRwdXQgY29uZmlndXJhdGlvbnMgaW4gY2xpZW50IHByb2Nlc3MgdG8gYXZvaWQKQEAgLTM3LDcgKzM4LDcgQEAKICAgICBBdWRpb0lvRGVzY3JpcHRvcigpIDoKICAgICAgICAgbUlvSGFuZGxlKEFVRElPX0lPX0hBTkRMRV9OT05FKSwKICAgICAgICAgbVNhbXBsaW5nUmF0ZSgwKSwgbUZvcm1hdChBVURJT19GT1JNQVRfREVGQVVMVCksIG1DaGFubmVsTWFzayhBVURJT19DSEFOTkVMX05PTkUpLAotICAgICAgICBtRnJhbWVDb3VudCgwKSwgbUZyYW1lQ291bnRIQUwoMCksIG1MYXRlbmN5KDApCisgICAgICAgIG1GcmFtZUNvdW50KDApLCBtRnJhbWVDb3VudEhBTCgwKSwgbUxhdGVuY3koMCksIG1Qb3J0SWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkKICAgICB7CiAgICAgICAgIG1lbXNldCgmbVBhdGNoLCAwLCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BhdGNoKSk7CiAgICAgfQpAQCAtNjYsNiArNjcsNyBAQAogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50OwogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50SEFMOwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1MYXRlbmN5OyAgIC8vIG9ubHkgdmFsaWQgZm9yIG91dHB1dAorICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1Qb3J0SWQ7ICAgIC8vIHZhbGlkIGZvciBldmVudCBBVURJT19DTElFTlRfU1RBUlRFRAogfTsKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvTWl4ZXIuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9NaXhlci5oCmluZGV4IGNmN2Q5MGYuLjc4M2VlZjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9NaXhlci5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9NaXhlci5oCkBAIC0xOCwxNyArMTgsMTkgQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT19NSVhFUl9ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fTUlYRVJfSAogCisjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPHB0aHJlYWQuaD4KICNpbmNsdWRlIDxzc3RyZWFtPgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dmVjdG9yPgogCisjaW5jbHVkZSA8YW5kcm9pZC9vcy9JRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogI2luY2x1ZGUgPG1lZGlhL0J1ZmZlclByb3ZpZGVycy5oPgotI2luY2x1ZGUgPG1lZGlhL25ibG9nL05CTG9nLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8dXRpbHMvQ29tcGF0Lmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgpAQCAtNDEsNiArNDMsMTAgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCituYW1lc3BhY2UgTkJMb2cgeworY2xhc3MgV3JpdGVyOworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGNsYXNzIEF1ZGlvTWl4ZXIKQEAgLTczLDYgKzc5LDkgQEAKICAgICAgICAgRE9XTk1JWF9UWVBFICAgID0gMFg0MDA0LAogICAgICAgICBNSVhFUl9GT1JNQVQgICAgPSAweDQwMDUsIC8vIEFVRElPX0ZPUk1BVF9QQ01fKEZMT0FUfDE2X0JJVCkKICAgICAgICAgTUlYRVJfQ0hBTk5FTF9NQVNLID0gMHg0MDA2LCAvLyBDaGFubmVsIG1hc2sgZm9yIG1peGVyIG91dHB1dAorICAgICAgICAvLyBmb3IgaGFwdGljCisgICAgICAgIEhBUFRJQ19FTkFCTEVEICA9IDB4NDAwNywgLy8gU2V0IGhhcHRpYyBkYXRhIGZyb20gdGhpcyB0cmFjayBzaG91bGQgYmUgcGxheWVkIG9yIG5vdC4KKyAgICAgICAgSEFQVElDX0lOVEVOU0lUWSA9IDB4NDAwOCwgLy8gU2V0IHRoZSBpbnRlbnNpdHkgdG8gcGxheSBoYXB0aWMgZGF0YS4KICAgICAgICAgLy8gZm9yIHRhcmdldCBSRVNBTVBMRQogICAgICAgICBTQU1QTEVfUkFURSAgICAgPSAweDQxMDAsIC8vIENvbmZpZ3VyZSBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uIG9uIHRoaXMgdHJhY2sgbmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJhbWV0ZXIgJ3ZhbHVlJyBpcyB0aGUgbmV3IHNhbXBsZSByYXRlIGluIEh6LgpAQCAtOTUsNiArMTA0LDMyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyYW1ldGVyICd2YWx1ZScgaXMgYSBwb2ludGVyIHRvIHRoZSBuZXcgcGxheWJhY2sgcmF0ZS4KICAgICB9OwogCisgICAgdHlwZWRlZiBlbnVtIHsgLy8gSGFwdGljIGludGVuc2l0eSwgc2hvdWxkIGtlZXAgY29uc2lzdGVudCB3aXRoIFZpYnJhdG9yU2VydmljZQorICAgICAgICBIQVBUSUNfU0NBTEVfTVVURSA9IG9zOjpJRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U6OlNDQUxFX01VVEUsCisgICAgICAgIEhBUFRJQ19TQ0FMRV9WRVJZX0xPVyA9IG9zOjpJRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U6OlNDQUxFX1ZFUllfTE9XLAorICAgICAgICBIQVBUSUNfU0NBTEVfTE9XID0gb3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZTo6U0NBTEVfTE9XLAorICAgICAgICBIQVBUSUNfU0NBTEVfTk9ORSA9IG9zOjpJRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U6OlNDQUxFX05PTkUsCisgICAgICAgIEhBUFRJQ19TQ0FMRV9ISUdIID0gb3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZTo6U0NBTEVfSElHSCwKKyAgICAgICAgSEFQVElDX1NDQUxFX1ZFUllfSElHSCA9IG9zOjpJRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U6OlNDQUxFX1ZFUllfSElHSCwKKyAgICB9IGhhcHRpY19pbnRlbnNpdHlfdDsKKyAgICBzdGF0aWMgY29uc3RleHByIGZsb2F0IEhBUFRJQ19TQ0FMRV9WRVJZX0xPV19SQVRJTyA9IDIuMGYgLyAzLjBmOworICAgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQgSEFQVElDX1NDQUxFX0xPV19SQVRJTyA9IDMuMGYgLyA0LjBmOworICAgIHN0YXRpYyBjb25zdCBjb25zdGV4cHIgZmxvYXQgSEFQVElDX01BWF9BTVBMSVRVREVfRkxPQVQgPSAxLjBmOworCisgICAgc3RhdGljIGlubGluZSBib29sIGlzVmFsaWRIYXB0aWNJbnRlbnNpdHkoaGFwdGljX2ludGVuc2l0eV90IGhhcHRpY0ludGVuc2l0eSkgeworICAgICAgICBzd2l0Y2ggKGhhcHRpY0ludGVuc2l0eSkgeworICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9NVVRFOgorICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9WRVJZX0xPVzoKKyAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfTE9XOgorICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9OT05FOgorICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9ISUdIOgorICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9WRVJZX0hJR0g6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIEF1ZGlvTWl4ZXIoc2l6ZV90IGZyYW1lQ291bnQsIHVpbnQzMl90IHNhbXBsZVJhdGUpCiAgICAgICAgIDogbVNhbXBsZVJhdGUoc2FtcGxlUmF0ZSkKICAgICAgICAgLCBtRnJhbWVDb3VudChmcmFtZUNvdW50KSB7CkBAIC0xMzIsNyArMTY3LDE1IEBACiAgICAgdm9pZCAgICAgICAgc2V0QnVmZmVyUHJvdmlkZXIoaW50IG5hbWUsIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIGJ1ZmZlclByb3ZpZGVyKTsKIAogICAgIHZvaWQgICAgICAgIHByb2Nlc3MoKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcGFpciA6IG1UcmFja3MpIHsKKyAgICAgICAgICAgIC8vIENsZWFyIGNvbnRyYWN0ZWQgYnVmZmVyIGJlZm9yZSBwcm9jZXNzaW5nIGlmIGNvbnRyYWN0ZWQgY2hhbm5lbHMgYXJlIHNhdmVkCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2s+ICZ0ID0gcGFpci5zZWNvbmQ7CisgICAgICAgICAgICBpZiAodC0+bUtlZXBDb250cmFjdGVkQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICB0LT5jbGVhckNvbnRyYWN0ZWRCdWZmZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICAodGhpcy0+Km1Ib29rKSgpOworICAgICAgICBwcm9jZXNzSGFwdGljRGF0YSgpOwogICAgIH0KIAogICAgIHNpemVfdCAgICAgIGdldFVucmVsZWFzZWRGcmFtZXMoaW50IG5hbWUpIGNvbnN0OwpAQCAtMjMwLDYgKzI3Myw4IEBACiAgICAgICAgICAgICBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLnJlc2V0KG51bGxwdHIpOwogICAgICAgICAgICAgbURvd25taXhlckJ1ZmZlclByb3ZpZGVyLnJlc2V0KG51bGxwdHIpOwogICAgICAgICAgICAgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIucmVzZXQobnVsbHB0cik7CisgICAgICAgICAgICBtQ29udHJhY3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIucmVzZXQobnVsbHB0cik7CisgICAgICAgICAgICBtQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlci5yZXNldChudWxscHRyKTsKICAgICAgICAgfQogCiAgICAgICAgIGJvb2wgICAgICAgIG5lZWRzUmFtcCgpIHsgcmV0dXJuICh2b2x1bWVJbmNbMF0gfCB2b2x1bWVJbmNbMV0gfCBhdXhJbmMpICE9IDA7IH0KQEAgLTI0NCw2ICsyODksMTEgQEAKICAgICAgICAgdm9pZCAgICAgICAgdW5wcmVwYXJlRm9yRG93bm1peCgpOwogICAgICAgICBzdGF0dXNfdCAgICBwcmVwYXJlRm9yUmVmb3JtYXQoKTsKICAgICAgICAgdm9pZCAgICAgICAgdW5wcmVwYXJlRm9yUmVmb3JtYXQoKTsKKyAgICAgICAgc3RhdHVzX3QgICAgcHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCk7CisgICAgICAgIHZvaWQgICAgICAgIHVucHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCk7CisgICAgICAgIHN0YXR1c190ICAgIHByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKHNpemVfdCBmcmFtZXMpOworICAgICAgICB2b2lkICAgICAgICB1bnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKCk7CisgICAgICAgIHZvaWQgICAgICAgIGNsZWFyQ29udHJhY3RlZEJ1ZmZlcigpOwogICAgICAgICBib29sICAgICAgICBzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnBsYXliYWNrUmF0ZSk7CiAgICAgICAgIHZvaWQgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7CiAKQEAgLTI5NywxNyArMzQ3LDI3IEBACiAgICAgICAgICAqIGFsbCBwcmUtbWl4ZXIgdHJhY2sgYnVmZmVyIGNvbnZlcnNpb25zIG91dHNpZGUgdGhlIEF1ZGlvTWl4ZXIgY2xhc3MuCiAgICAgICAgICAqCiAgICAgICAgICAqIDEpIG1JbnB1dEJ1ZmZlclByb3ZpZGVyOiBUaGUgQXVkaW9UcmFjayBidWZmZXIgcHJvdmlkZXIuCi0gICAgICAgICAqIDIpIG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOiBJZiBub3QgTlVMTCwgcGVyZm9ybXMgdGhlIGF1ZGlvIHJlZm9ybWF0IHRvCisgICAgICAgICAqIDIpIG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyOiBFeHBhbmRzIG9yIGNvbnRyYWN0cyBzYW1wbGUgZGF0YSBmcm9tIG9uZSBpbnRlcmxlYXZlZAorICAgICAgICAgKiAgICBjaGFubmVsIGZvcm1hdCB0byBhbm90aGVyLiBFeHBhbmRlZCBjaGFubmVscyBhcmUgZmlsbGVkIHdpdGggemVyb3MgYW5kIHB1dCBhdCB0aGUgZW5kCisgICAgICAgICAqICAgIG9mIGVhY2ggYXVkaW8gZnJhbWUuIENvbnRyYWN0ZWQgY2hhbm5lbHMgYXJlIGNvcGllZCB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCisgICAgICAgICAqIDMpIG1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlcjogTm9uLWRlc3RydWN0aXZlbHkgY29udHJhY3Qgc2FtcGxlIGRhdGEuCisgICAgICAgICAqICAgIFRoaXMgaXMgY3VycmVudGx5IHVzaW5nIGF0IGF1ZGlvLWhhcHRpYyBjb3VwbGVkIHBsYXliYWNrIHRvIHNlcGFyYXRlIGF1ZGlvIGFuZCBoYXB0aWMKKyAgICAgICAgICogICAgZGF0YS4gQ29udHJhY3RlZCBjaGFubmVscyBjb3VsZCBiZSB3cml0dGVuIHRvIGdpdmVuIGJ1ZmZlci4KKyAgICAgICAgICogNCkgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI6IElmIG5vdCBOVUxMLCBwZXJmb3JtcyB0aGUgYXVkaW8gcmVmb3JtYXQgdG8KICAgICAgICAgICogICAgbWF0Y2ggZWl0aGVyIG1NaXhlckluRm9ybWF0IG9yIG1Eb3dubWl4UmVxdWlyZXNGb3JtYXQsIGlmIHRoZSBkb3dubWl4ZXIKICAgICAgICAgICogICAgcmVxdWlyZXMgcmVmb3JtYXQuIEZvciBleGFtcGxlLCBpdCBtYXkgY29udmVydCBmbG9hdGluZyBwb2ludCBpbnB1dCB0bwogICAgICAgICAgKiAgICBQQ01fMTZfYml0IGlmIHRoYXQncyByZXF1aXJlZCBieSB0aGUgZG93bm1peGVyLgotICAgICAgICAgKiAzKSBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6IElmIG5vdCBOVUxMLCBwZXJmb3JtcyB0aGUgY2hhbm5lbCByZW1peGluZyB0byBtYXRjaAorICAgICAgICAgKiA1KSBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6IElmIG5vdCBOVUxMLCBwZXJmb3JtcyB0aGUgY2hhbm5lbCByZW1peGluZyB0byBtYXRjaAogICAgICAgICAgKiAgICB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIHJlcXVpcmVkIGJ5IHRoZSBtaXhlciBzaW5rLgotICAgICAgICAgKiA0KSBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOiBJZiBub3QgTlVMTCwgcGVyZm9ybXMgcmVmb3JtYXR0aW5nIGZyb20KKyAgICAgICAgICogNikgbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlcjogSWYgbm90IE5VTEwsIHBlcmZvcm1zIHJlZm9ybWF0dGluZyBmcm9tCiAgICAgICAgICAqICAgIHRoZSBkb3dubWl4ZXIgcmVxdWlyZW1lbnRzIHRvIHRoZSBtaXhlciBlbmdpbmUgaW5wdXQgcmVxdWlyZW1lbnRzLgotICAgICAgICAgKiA1KSBtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjogQWRkcyB0aW1lc3RyZXRjaGluZyBmb3IgcGxheWJhY2sgcmF0ZQorICAgICAgICAgKiA3KSBtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjogQWRkcyB0aW1lc3RyZXRjaGluZyBmb3IgcGxheWJhY2sgcmF0ZQogICAgICAgICAgKi8KICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogICAgIG1JbnB1dEJ1ZmZlclByb3ZpZGVyOyAgICAvLyBleHRlcm5hbGx5IHByb3ZpZGVkIGJ1ZmZlciBwcm92aWRlci4KKyAgICAgICAgLy8gVE9ETzogY29tYmluZSBtQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlciBhbmQKKyAgICAgICAgLy8gbUNvbnRyYWN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxQYXNzdGhydUJ1ZmZlclByb3ZpZGVyPiBtQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcjsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXI+IG1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlcjsKICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXI+IG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOwogICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFzc3RocnVCdWZmZXJQcm92aWRlcj4gbURvd25taXhlckJ1ZmZlclByb3ZpZGVyOwogICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFzc3RocnVCdWZmZXJQcm92aWRlcj4gbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlcjsKQEAgLTMzNiw2ICszOTYsNTEgQEAKIAogICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSAgICBtUGxheWJhY2tSYXRlOwogCisgICAgICAgIC8vIEhhcHRpYworICAgICAgICBib29sICAgICAgICAgICAgICAgICBtSGFwdGljUGxheWJhY2tFbmFibGVkOworICAgICAgICBoYXB0aWNfaW50ZW5zaXR5X3QgICBtSGFwdGljSW50ZW5zaXR5OworICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtSGFwdGljQ2hhbm5lbE1hc2s7CisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIG1IYXB0aWNDaGFubmVsQ291bnQ7CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1NaXhlckhhcHRpY0NoYW5uZWxNYXNrOworICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICBtTWl4ZXJIYXB0aWNDaGFubmVsQ291bnQ7CisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIG1BZGp1c3RJbkNoYW5uZWxDb3VudDsKKyAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbUFkanVzdE91dENoYW5uZWxDb3VudDsKKyAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbUFkanVzdE5vbkRlc3RydWN0aXZlSW5DaGFubmVsQ291bnQ7CisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIG1BZGp1c3ROb25EZXN0cnVjdGl2ZU91dENoYW5uZWxDb3VudDsKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgbUtlZXBDb250cmFjdGVkQ2hhbm5lbHM7CisKKyAgICAgICAgZmxvYXQgZ2V0SGFwdGljU2NhbGVHYW1tYSgpIGNvbnN0IHsKKyAgICAgICAgLy8gTmVlZCB0byBrZWVwIGNvbnNpc3RlbnQgd2l0aCB0aGUgdmFsdWUgaW4gVmlicmF0b3JTZXJ2aWNlLgorICAgICAgICBzd2l0Y2ggKG1IYXB0aWNJbnRlbnNpdHkpIHsKKyAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfVkVSWV9MT1c6CisgICAgICAgICAgICByZXR1cm4gMi4wZjsKKyAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfTE9XOgorICAgICAgICAgICAgcmV0dXJuIDEuNWY7CisgICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX0hJR0g6CisgICAgICAgICAgICByZXR1cm4gMC41ZjsKKyAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfVkVSWV9ISUdIOgorICAgICAgICAgICAgcmV0dXJuIDAuMjVmOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIDEuMGY7CisgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZsb2F0IGdldEhhcHRpY01heEFtcGxpdHVkZVJhdGlvKCkgY29uc3QgeworICAgICAgICAvLyBOZWVkIHRvIGtlZXAgY29uc2lzdGVudCB3aXRoIHRoZSB2YWx1ZSBpbiBWaWJyYXRvclNlcnZpY2UuCisgICAgICAgIHN3aXRjaCAobUhhcHRpY0ludGVuc2l0eSkgeworICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9WRVJZX0xPVzoKKyAgICAgICAgICAgIHJldHVybiBIQVBUSUNfU0NBTEVfVkVSWV9MT1dfUkFUSU87CisgICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX0xPVzoKKyAgICAgICAgICAgIHJldHVybiBIQVBUSUNfU0NBTEVfTE9XX1JBVElPOworICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9OT05FOgorICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9ISUdIOgorICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9WRVJZX0hJR0g6CisgICAgICAgICAgICByZXR1cm4gMS4wZjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAwLjBmOworICAgICAgICB9CisgICAgICAgIH0KKwogICAgIHByaXZhdGU6CiAgICAgICAgIC8vIGhvb2tzCiAgICAgICAgIHZvaWQgdHJhY2tfX2dlbmVyaWNSZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBudW1GcmFtZXMsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCk7CkBAIC0zNzIsNiArNDc3LDggQEAKICAgICB0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVEE+CiAgICAgdm9pZCBwcm9jZXNzX19ub1Jlc2FtcGxlT25lVHJhY2soKTsKIAorICAgIHZvaWQgcHJvY2Vzc0hhcHRpY0RhdGEoKTsKKwogICAgIHN0YXRpYyBwcm9jZXNzX2hvb2tfdCBnZXRQcm9jZXNzSG9vayhpbnQgcHJvY2Vzc1R5cGUsIHVpbnQzMl90IGNoYW5uZWxDb3VudCwKICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IG1peGVySW5Gb3JtYXQsIGF1ZGlvX2Zvcm1hdF90IG1peGVyT3V0Rm9ybWF0KTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BhcmFtZXRlci5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BhcmFtZXRlci5oCmluZGV4IDk2N2Q4OTUuLjI0ODM3ZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9QYXJhbWV0ZXIuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUGFyYW1ldGVyLmgKQEAgLTY0LDYgKzY0LDkgQEAKICAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleVByZXNlbnRhdGlvbklkOwogICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5UHJvZ3JhbUlkOwogCisgICAgLy8gIGtleUF1ZGlvTGFuZ3VhZ2VQcmVmZXJyZWQ6IFByZWZlcnJlZCBhdWRpbyBsYW5ndWFnZQorICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5QXVkaW9MYW5ndWFnZVByZWZlcnJlZDsKKwogICAgIC8vICBrZXlTdHJlYW1Db25uZWN0IC8gRGlzY29ubmVjdDogdmFsdWUgaXMgYW4gaW50IGluIGF1ZGlvX2RldmljZXNfdAogICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5U3RyZWFtQ29ubmVjdDsKICAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleVN0cmVhbURpc2Nvbm5lY3Q7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5LmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5LmgKaW5kZXggOGRhMDA2OS4uZWYzOWZkMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3kuaApAQCAtNDksMTMgKzQ5LDMwIEBACiAjZGVmaW5lIE1JWF9TVEFURV9JRExFIDAKICNkZWZpbmUgTUlYX1NUQVRFX01JWElORyAxCiAKKy8qKiBDb250cm9sIHRvIHdoaWNoIGRldmljZSBzb21lIGF1ZGlvIGlzIHJlbmRlcmVkICovCiAjZGVmaW5lIE1JWF9ST1VURV9GTEFHX1JFTkRFUiAweDEKKy8qKiBMb29wIGJhY2sgc29tZSBhdWRpbyBpbnN0ZWFkIG9mIHJlbmRlcmluZyBpdCAqLwogI2RlZmluZSBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0sgKDB4MSA8PCAxKQorLyoqIExvb3AgYmFjayBzb21lIGF1ZGlvIHdoaWxlIGl0IGlzIHJlbmRlcmVkICovCisjZGVmaW5lIE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDS19BTkRfUkVOREVSIChNSVhfUk9VVEVfRkxBR19SRU5ERVIgfCBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spCiAjZGVmaW5lIE1JWF9ST1VURV9GTEFHX0FMTCAoTUlYX1JPVVRFX0ZMQUdfUkVOREVSIHwgTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLKQogCiAjZGVmaW5lIE1BWF9NSVhFU19QRVJfUE9MSUNZIDEwCiAjZGVmaW5lIE1BWF9DUklURVJJQV9QRVJfTUlYIDIwCiAKK2NsYXNzIEF1ZGlvRGV2aWNlVHlwZUFkZHIgeworcHVibGljOgorICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIoKSB7fQorICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIoYXVkaW9fZGV2aWNlc190IHR5cGUsIFN0cmluZzggYWRkcmVzcykgOgorICAgICAgICBtVHlwZSh0eXBlKSwgbUFkZHJlc3MoYWRkcmVzcykge30KKworICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKFBhcmNlbCAqcGFyY2VsKTsKKyAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdDsKKworICAgIGF1ZGlvX2RldmljZXNfdCBtVHlwZTsKKyAgICBTdHJpbmc4IG1BZGRyZXNzOworfTsKKwogY2xhc3MgQXVkaW9NaXhNYXRjaENyaXRlcmlvbiB7CiBwdWJsaWM6CiAgICAgQXVkaW9NaXhNYXRjaENyaXRlcmlvbigpIHt9CkBAIC04NywyMSArMTA0LDM3IEBACiAgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoUGFyY2VsICpwYXJjZWwpOwogICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0OwogCi0gICAgVmVjdG9yPEF1ZGlvTWl4TWF0Y2hDcml0ZXJpb24+IG1Dcml0ZXJpYTsKKyAgICB2b2lkIHNldEV4Y2x1ZGVVaWQodWlkX3QgdWlkKSBjb25zdDsKKyAgICB2b2lkIHNldE1hdGNoVWlkKHVpZF90IHVpZCkgY29uc3Q7CisgICAgLyoqIHJldHVybnMgdHJ1ZSBpZiB0aGlzIG1peCBoYXMgYSBydWxlIHRvIG1hdGNoIG9yIGV4Y2x1ZGUgdGhlIGdpdmVuIHVpZCAqLworICAgIGJvb2wgaGFzVWlkUnVsZShib29sIG1hdGNoLCB1aWRfdCB1aWQpIGNvbnN0OworICAgIC8qKiByZXR1cm5zIHRydWUgaWYgdGhpcyBtaXggaGFzIGEgcnVsZSBmb3IgdWlkIG1hdGNoIChhbnkgdWlkKSAqLworICAgIGJvb2wgaGFzTWF0Y2hVaWRSdWxlKCkgY29uc3Q7CisgICAgLyoqIHJldHVybnMgdHJ1ZSBpZiB0aGlzIG1peCBjYW4gYmUgdXNlZCBmb3IgdWlkLWRldmljZSBhZmZpbml0eSByb3V0aW5nICovCisgICAgYm9vbCBpc0RldmljZUFmZmluaXR5Q29tcGF0aWJsZSgpIGNvbnN0OworCisgICAgbXV0YWJsZSBWZWN0b3I8QXVkaW9NaXhNYXRjaENyaXRlcmlvbj4gbUNyaXRlcmlhOwogICAgIHVpbnQzMl90ICAgICAgICBtTWl4VHlwZTsKICAgICBhdWRpb19jb25maWdfdCAgbUZvcm1hdDsKICAgICB1aW50MzJfdCAgICAgICAgbVJvdXRlRmxhZ3M7CiAgICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2VUeXBlOwogICAgIFN0cmluZzggICAgICAgICBtRGV2aWNlQWRkcmVzczsKICAgICB1aW50MzJfdCAgICAgICAgbUNiRmxhZ3M7IC8vIGZsYWdzIGluZGljYXRpbmcgd2hpY2ggY2FsbGJhY2tzIHRvIHVzZSwgc2VlIGtDYkZsYWcqCisgICAgLyoqIElnbm9yZSB0aGUgQVVESU9fRkxBR19OT19NRURJQV9QUk9KRUNUSU9OICovCisgICAgYm9vbCAgICAgICAgICAgIG1BbGxvd1ByaXZpbGVnZWRQbGF5YmFja0NhcHR1cmUgPSBmYWxzZTsKIH07CiAKIAotLy8gZGVmaW5pdGlvbnMgZm9yIGF1ZGlvIHJlY29yZGluZyBjb25maWd1cmF0aW9uIHVwZGF0ZXMKLS8vIHdoaWNoIHVwZGF0ZSB0eXBlIGlzIHJlcG9ydGVkCi0jZGVmaW5lIFJFQ09SRF9DT05GSUdfRVZFTlRfTk9ORSAtMQotI2RlZmluZSBSRUNPUkRfQ09ORklHX0VWRU5UX1NUQVJUIDEKLSNkZWZpbmUgUkVDT1JEX0NPTkZJR19FVkVOVF9TVE9QICAwCisvLyBkZWZpbml0aW9ucyBmb3IgYXVkaW8gcmVjb3JkaW5nIGNvbmZpZ3VyYXRpb24gdXBkYXRlczsKKy8vIGtlZXAgaW4gc3luYyB3aXRoIEF1ZGlvTWFuYWdlci5qYXZhIGZvciB2YWx1ZXMgdXNlZCBmcm9tIG5hdGl2ZSBjb2RlCisjZGVmaW5lIFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQgIDAKKyNkZWZpbmUgUkVDT1JEX0NPTkZJR19FVkVOVF9TVE9QICAgMQorI2RlZmluZSBSRUNPUkRfQ09ORklHX0VWRU5UX1VQREFURSAyCisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc19taXhfbG9vcGJhY2tfcmVuZGVyKHVpbnQzMl90IHJvdXRlRmxhZ3MpIHsKKyAgICByZXR1cm4gKHJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0tfQU5EX1JFTkRFUikKKyAgICAgICAgICAgPT0gTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLX0FORF9SRU5ERVI7Cit9CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzNlZTBhNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0jaWZuZGVmIEFVRElPX1BPTElDWV9IRUxQRVJfSF8KLSNkZWZpbmUgQVVESU9fUE9MSUNZX0hFTFBFUl9IXwotCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0KLXN0YXRpYyBpbmxpbmUKLWF1ZGlvX3N0cmVhbV90eXBlX3QgYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZShjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpCi17Ci0gICAgLy8gZmxhZ3MgdG8gc3RyZWFtIHR5cGUgbWFwcGluZwotICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpID09IEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgewotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEU7Ci0gICAgfQotICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX1NDTykgPT0gQVVESU9fRkxBR19TQ08pIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPOwotICAgIH0KLQotICAgIC8vIHVzYWdlIHRvIHN0cmVhbSB0eXBlIG1hcHBpbmcKLSAgICBzd2l0Y2ggKGF0dHItPnVzYWdlKSB7Ci0gICAgY2FzZSBBVURJT19VU0FHRV9NRURJQToKLSAgICBjYXNlIEFVRElPX1VTQUdFX0dBTUU6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0U6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTlQ6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWTsKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1NZU1RFTTsKLSAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT046Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0RUTUY7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX0FMQVJNOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FMQVJNOwotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORToKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9SSU5HOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT046Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQ6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9VTktOT1dOOgotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7Ci0gICAgfQotfQotCi1zdGF0aWMgaW5saW5lCi12b2lkIHN0cmVhbV90eXBlX3RvX2F1ZGlvX2F0dHJpYnV0ZXMoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cikgewotICAgIG1lbXNldChhdHRyLCAwLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0KLSAgICBzd2l0Y2ggKHN0cmVhbVR5cGUpIHsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9ERUZBVUxUOgotICAgIGNhc2UgQVVESU9fU1RSRUFNX01VU0lDOgotICAgICAgICBhdHRyLT5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfTVVTSUM7Ci0gICAgICAgIGF0dHItPnVzYWdlID0gQVVESU9fVVNBR0VfTUVESUE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw6Ci0gICAgICAgIGF0dHItPmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0g7Ci0gICAgICAgIGF0dHItPnVzYWdlID0gQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRToKLSAgICAgICAgYXR0ci0+ZmxhZ3MgIHw9IEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRDsKLSAgICAgICAgLy8gaW50ZW5kZWQgZmFsbCB0aHJvdWdoLCBhdHRyaWJ1dGVzIGluIGNvbW1vbiB3aXRoIFNUUkVBTV9TWVNURU0KLSAgICBjYXNlIEFVRElPX1NUUkVBTV9TWVNURU06Ci0gICAgICAgIGF0dHItPmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT047Ci0gICAgICAgIGF0dHItPnVzYWdlID0gQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT047Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX1JJTkc6Ci0gICAgICAgIGF0dHItPmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT047Ci0gICAgICAgIGF0dHItPnVzYWdlID0gQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fQUxBUk06Ci0gICAgICAgIGF0dHItPmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT047Ci0gICAgICAgIGF0dHItPnVzYWdlID0gQVVESU9fVVNBR0VfQUxBUk07Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX05PVElGSUNBVElPTjoKLSAgICAgICAgYXR0ci0+Y29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTjsKLSAgICAgICAgYXR0ci0+dXNhZ2UgPSBBVURJT19VU0FHRV9OT1RJRklDQVRJT047Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ086Ci0gICAgICAgIGF0dHItPmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0g7Ci0gICAgICAgIGF0dHItPnVzYWdlID0gQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjsKLSAgICAgICAgYXR0ci0+ZmxhZ3MgfD0gQVVESU9fRkxBR19TQ087Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX0RUTUY6Ci0gICAgICAgIGF0dHItPmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TT05JRklDQVRJT047Ci0gICAgICAgIGF0dHItPnVzYWdlID0gQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9UVFM6Ci0gICAgICAgIGF0dHItPmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0g7Ci0gICAgICAgIGF0dHItPnVzYWdlID0gQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBBTE9HRSgiaW52YWxpZCBzdHJlYW0gdHlwZSAlZCB3aGVuIGNvbnZlcnRpbmcgdG8gYXR0cmlidXRlcyIsIHN0cmVhbVR5cGUpOwotICAgIH0KLX0KLQotI2VuZGlmIC8vQVVESU9fUE9MSUNZX0hFTFBFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NDEwOTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUHJvZHVjdFN0cmF0ZWd5LmgKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0NvbW1vblR5cGVzLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQXVkaW9Qcm9kdWN0U3RyYXRlZ3kgOiBwdWJsaWMgUGFyY2VsYWJsZQoreworcHVibGljOgorICAgIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5KCkge30KKyAgICBBdWRpb1Byb2R1Y3RTdHJhdGVneShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgY29uc3Qgc3RkOjp2ZWN0b3I8QXVkaW9BdHRyaWJ1dGVzPiAmYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgaWQpIDoKKyAgICAgICAgbU5hbWUobmFtZSksIG1BdWRpb0F0dHJpYnV0ZXMoYXR0cmlidXRlcyksIG1JZChpZCkge30KKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KKyAgICBzdGQ6OnZlY3RvcjxBdWRpb0F0dHJpYnV0ZXM+IGdldEF1ZGlvQXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIG1BdWRpb0F0dHJpYnV0ZXM7IH0KKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgZ2V0SWQoKSBjb25zdCB7IHJldHVybiBtSWQ7IH0KKworICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKKworICAgIC8qKgorICAgICAqIEBicmllZiBhdHRyaWJ1dGVzTWF0Y2hlczogY2hlY2tzIGlmIGNsaWVudCBhdHRyaWJ1dGVzIG1hdGNoZXMgd2l0aCBhIHJlZmVyZW5jZSBhdHRyaWJ1dGVzCisgICAgICogIm1hdGNoaW5nIiBtZWFucyB0aGUgdXNhZ2Ugc2hhbGwgbWF0Y2ggaWYgcmVmZXJlbmNlIGF0dHJpYnV0ZXMgaGFzIGEgZGVmaW5lZCB1c2FnZSwgQU5ECisgICAgICogY29udGVudCB0eXBlIHNoYWxsIG1hdGNoIGlmIHJlZmVyZW5jZSBhdHRyaWJ1dGVzIGhhcyBhIGRlZmluZWQgY29udGVudCB0eXBlIEFORAorICAgICAqIGZsYWdzIHNoYWxsIG1hdGNoIGlmIHJlZmVyZW5jZSBhdHRyaWJ1dGVzIGhhcyBkZWZpbmVkIGZsYWdzIEFORAorICAgICAqIHRhZ3Mgc2hhbGwgbWF0Y2ggaWYgcmVmZXJlbmNlIGF0dHJpYnV0ZXMgaGFzIGRlZmluZWQgdGFncy4KKyAgICAgKiBSZWZlcmVuY2UgYXR0cmlidXRlcyAiZGVmYXVsdCIgc2hhbGwgbm90IGJlIGNvbnNpZGVyZWQgYXMgYSAidHJ1ZSIgY2FzZS4gVGhpcyBjb252ZW50aW9uCisgICAgICogaXMgdXNlZCB0byBpZGVudGlmeSB0aGUgZGVmYXVsdCBzdHJhdGVneS4KKyAgICAgKiBAcGFyYW0gcmVmQXR0cmlidXRlcyB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHBhcmFtIGNsaWVudEF0dHJpdHViZXMgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBtYXRjaGluZywgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgc3RhdGljIGJvb2wgYXR0cmlidXRlc01hdGNoZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190IHJlZkF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGNsaWVudEF0dHJpdHViZXMpOworcHJpdmF0ZToKKyAgICBzdGQ6OnN0cmluZyBtTmFtZTsKKyAgICBzdGQ6OnZlY3RvcjxBdWRpb0F0dHJpYnV0ZXM+IG1BdWRpb0F0dHJpYnV0ZXM7CisgICAgcHJvZHVjdF9zdHJhdGVneV90IG1JZDsKK307CisKK3VzaW5nIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yID0gc3RkOjp2ZWN0b3I8QXVkaW9Qcm9kdWN0U3RyYXRlZ3k+OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaAppbmRleCBjZjQ0NmE1Li5hM2MwZmU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCkBAIC0xNyw2ICsxNyw5IEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9SRUNPUkRfSAogI2RlZmluZSBBTkRST0lEX0FVRElPUkVDT1JEX0gKIAorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKICNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgogI2luY2x1ZGUgPGN1dGlscy9zY2hlZF9wb2xpY3kuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgpAQCAtMjQsOSArMjcsOSBAQAogI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgogI2luY2x1ZGUgPG1lZGlhL01vZHVsby5oPgogI2luY2x1ZGUgPG1lZGlhL01pY3JvcGhvbmVJbmZvLmg+CisjaW5jbHVkZSA8bWVkaWEvUmVjb3JkaW5nQWN0aXZpdHlUcmFja2VyLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICJhbmRyb2lkL21lZGlhL0lBdWRpb1JlY29yZC5oIgogCkBAIC04NSw3ICs4OCw3IEBACiAKICAgICAgICAgdW5pb24gewogICAgICAgICAgICAgdm9pZCogICAgICAgcmF3OwotICAgICAgICAgICAgc2hvcnQqICAgICAgaTE2OyAgICAgICAgLy8gc2lnbmVkIDE2LWJpdAorICAgICAgICAgICAgaW50MTZfdCogICAgaTE2OyAgICAgICAgLy8gc2lnbmVkIDE2LWJpdAogICAgICAgICAgICAgaW50OF90KiAgICAgaTg7ICAgICAgICAgLy8gdW5zaWduZWQgOC1iaXQsIG9mZnNldCBieSAweDgwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dCB0byBvYnRhaW5CdWZmZXIoKTogdW51c2VkLCBvdXRwdXQ6IHBvaW50ZXIgdG8gYnVmZmVyCiAgICAgICAgIH07CkBAIC0xODksNyArMTkyLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQgPSBBVURJT19VSURfSU5WQUxJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCA9IC0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRNaWNEaXJlY3Rpb24gPSBNSUNfRElSRUNUSU9OX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbiA9IE1JQ19GSUVMRF9ESU1FTlNJT05fREVGQVVMVCk7CiAKICAgICAvKiBUZXJtaW5hdGVzIHRoZSBBdWRpb1JlY29yZCBhbmQgdW5yZWdpc3RlcnMgaXQgZnJvbSBBdWRpb0ZsaW5nZXIuCiAgICAgICogQWxzbyBkZXN0cm95cyBhbGwgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXVkaW9SZWNvcmQuCkBAIC0yMjgsNyArMjM0LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkID0gQVVESU9fVUlEX0lOVkFMSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkID0gLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkTWljRGlyZWN0aW9uID0gTUlDX0RJUkVDVElPTl9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzZWxlY3RlZE1pY0ZpZWxkRGltZW5zaW9uID0gTUlDX0ZJRUxEX0RJTUVOU0lPTl9ERUZBVUxUKTsKIAogICAgIC8qIFJlc3VsdCBvZiBjb25zdHJ1Y3RpbmcgdGhlIEF1ZGlvUmVjb3JkLiBUaGlzIG11c3QgYmUgY2hlY2tlZCBmb3Igc3VjY2Vzc2Z1bCBpbml0aWFsaXphdGlvbgogICAgICAqIGJlZm9yZSB1c2luZyBhbnkgQXVkaW9SZWNvcmQgQVBJIChleGNlcHQgZm9yIHNldCgpKSwgYmVjYXVzZSB1c2luZwpAQCAtNTM0LDkgKzU0MywyMyBAQAogICAgICAqLwogICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpOwogCi0gICAgLyoKLSAgICAgKiBEdW1wcyB0aGUgc3RhdGUgb2YgYW4gYXVkaW8gcmVjb3JkLgorICAgIC8qIFNldCB0aGUgTWljcm9waG9uZSBkaXJlY3Rpb24gKGZvciBwcm9jZXNzaW5nIHB1cnBvc2VzKS4KICAgICAgKi8KKyAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pOworCisgICAgLyogU2V0IHRoZSBNaWNyb3Bob25lIHpvb20gZmFjdG9yIChmb3IgcHJvY2Vzc2luZyBwdXJwb3NlcykuCisgICAgICovCisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSk7CisKKyAgICAgLyogR2V0IHRoZSB1bmlxdWUgcG9ydCBJRCBhc3NpZ25lZCB0byB0aGlzIEF1ZGlvUmVjb3JkIGluc3RhbmNlIGJ5IGF1ZGlvIHBvbGljeSBtYW5hZ2VyLgorICAgICAgKiBUaGUgSUQgaXMgdW5pcXVlIGFjcm9zcyBhbGwgYXVkaW9zZXJ2ZXIgY2xpZW50cyBhbmQgY2FuIGNoYW5nZSBkdXJpbmcgdGhlIGxpZmUgY3ljbGUKKyAgICAgICogb2YgYSBnaXZlbiBBdWRpb1JlY29yZCBpbnN0YW5jZSBpZiB0aGUgY29ubmVjdGlvbiB0byBhdWRpb3NlcnZlciBpcyByZXN0b3JlZC4KKyAgICAgICovCisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldFBvcnRJZCgpIGNvbnN0IHsgcmV0dXJuIG1Qb3J0SWQ7IH07CisKKyAgICAgLyoKKyAgICAgICogRHVtcHMgdGhlIHN0YXRlIG9mIGFuIGF1ZGlvIHJlY29yZC4KKyAgICAgICovCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CiAKIHByaXZhdGU6CkBAIC01NDgsNyArNTcxLDcgQEAKICAgICBjbGFzcyBBdWRpb1JlY29yZFRocmVhZCA6IHB1YmxpYyBUaHJlYWQKICAgICB7CiAgICAgcHVibGljOgotICAgICAgICBBdWRpb1JlY29yZFRocmVhZChBdWRpb1JlY29yZCYgcmVjZWl2ZXIsIGJvb2wgYkNhbkNhbGxKYXZhID0gZmFsc2UpOworICAgICAgICBBdWRpb1JlY29yZFRocmVhZChBdWRpb1JlY29yZCYgcmVjZWl2ZXIpOwogCiAgICAgICAgIC8vIERvIG5vdCBjYWxsIFRocmVhZDo6cmVxdWVzdEV4aXRBbmRXYWl0KCkgd2l0aG91dCBmaXJzdCBjYWxsaW5nIHJlcXVlc3RFeGl0KCkuCiAgICAgICAgIC8vIFRocmVhZDo6cmVxdWVzdEV4aXRBbmRXYWl0KCkgaXMgbm90IHZpcnR1YWwsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24gZG9lc24ndCBkbyBlbm91Z2guCkBAIC01OTgsNiArNjIxLDggQEAKICAgICBzcDxBdWRpb1JlY29yZFRocmVhZD4gICBtQXVkaW9SZWNvcmRUaHJlYWQ7CiAgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgbUxvY2s7CiAKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8UmVjb3JkaW5nQWN0aXZpdHlUcmFja2VyPiBtVHJhY2tlcjsKKwogICAgIC8vIEN1cnJlbnQgY2xpZW50IHN0YXRlOiAgZmFsc2UgPSBzdG9wcGVkLCB0cnVlID0gYWN0aXZlLiAgUHJvdGVjdGVkIGJ5IG1Mb2NrLiAgSWYgbW9yZSBzdGF0ZXMKICAgICAvLyBhcmUgYWRkZWQsIGNvbnNpZGVyIGNoYW5naW5nIHRoaXMgdG8gZW51bSBTdGF0ZSB7IC4uLiB9IG1TdGF0ZSBhcyBpbiBBdWRpb1RyYWNrLgogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1BY3RpdmU7CkBAIC02NTQsNiArNjc5LDcgQEAKICAgICBhdWRpb19pbnB1dF9mbGFnc190ICAgICBtT3JpZ0ZsYWdzOyAgICAgICAgICAgICAvLyBhcyBzcGVjaWZpZWQgaW4gY29uc3RydWN0b3Igb3Igc2V0KCksIGNvbnN0CiAKICAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICBtU2Vzc2lvbklkOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1Qb3J0SWQ7ICAgICAgICAgICAgICAgICAgICAvLyBJZCBmcm9tIEF1ZGlvIFBvbGljeSBNYW5hZ2VyCiAgICAgdHJhbnNmZXJfdHlwZSAgICAgICAgICAgbVRyYW5zZmVyOwogCiAgICAgLy8gTmV4dCA1IGZpZWxkcyBtYXkgYmUgY2hhbmdlZCBpZiBJQXVkaW9SZWNvcmQgaXMgcmUtY3JlYXRlZCwgYnV0IGFsd2F5cyAhPSAwCkBAIC02NjIsNyArNjg4LDcgQEAKICAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICBtQ2Jsa01lbW9yeTsKICAgICBhdWRpb190cmFja19jYmxrX3QqICAgICBtQ2JsazsgICAgICAgICAgICAgIC8vIHJlLWxvYWQgYWZ0ZXIgbUxvY2sudW5sb2NrKCkKICAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICBtQnVmZmVyTWVtb3J5OwotICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgIG1JbnB1dDsgICAgICAgICAgICAgLy8gcmV0dXJuZWQgYnkgQXVkaW9TeXN0ZW06OmdldElucHV0KCkKKyAgICBhdWRpb19pb19oYW5kbGVfdCAgICAgICBtSW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsgLy8gZnJvbSBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRmb3JBdHRyKCkKIAogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c1ByaW9yaXR5OyAgLy8gYmVmb3JlIHN0YXJ0KCkKICAgICBTY2hlZFBvbGljeSAgICAgICAgICAgICBtUHJldmlvdXNTY2hlZHVsaW5nR3JvdXA7CkBAIC03MDEsMTAgKzcyNywxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjdGl2aXR5IGFuZCBjb25uZWN0ZWQgZGV2aWNlcwogICAgIHdwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiBtRGV2aWNlQ2FsbGJhY2s7CiAKKyAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IG1TZWxlY3RlZE1pY0RpcmVjdGlvbjsKKyAgICBmbG9hdCBtU2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbjsKKwogcHJpdmF0ZToKICAgICBjbGFzcyBNZWRpYU1ldHJpY3MgewogICAgICAgcHVibGljOgotICAgICAgICBNZWRpYU1ldHJpY3MoKSA6IG1BbmFseXRpY3NJdGVtKG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oImF1ZGlvcmVjb3JkIikpLAorICAgICAgICBNZWRpYU1ldHJpY3MoKSA6IG1BbmFseXRpY3NJdGVtKE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKCJhdWRpb3JlY29yZCIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3JlYXRlZE5zKHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfUkVBTFRJTUUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRlZE5zKDApLCBtRHVyYXRpb25OcygwKSwgbUNvdW50KDApLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RXJyb3IoTk9fRVJST1IpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaAppbmRleCA0YzBmNzk2Li41NmM2OWY2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCkBAIC0yMCw2ICsyMCw4IEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUHJvZHVjdFN0cmF0ZWd5Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Wb2x1bWVHcm91cC5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvSW9EZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvRmxpbmdlckNsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaD4KQEAgLTM1LDkgKzM3LDE0IEBACiAKIHR5cGVkZWYgdm9pZCAoKmF1ZGlvX2Vycm9yX2NhbGxiYWNrKShzdGF0dXNfdCBlcnIpOwogdHlwZWRlZiB2b2lkICgqZHluYW1pY19wb2xpY3lfY2FsbGJhY2spKGludCBldmVudCwgU3RyaW5nOCByZWdJZCwgaW50IHZhbCk7Ci10eXBlZGVmIHZvaWQgKCpyZWNvcmRfY29uZmlnX2NhbGxiYWNrKShpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAotICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKK3R5cGVkZWYgdm9pZCAoKnJlY29yZF9jb25maWdfY2FsbGJhY2spKGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CiAKIGNsYXNzIElBdWRpb0ZsaW5nZXI7CiBjbGFzcyBJQXVkaW9Qb2xpY3lTZXJ2aWNlOwpAQCAtMjA0LDE3ICsyMTEsMTkgQEAKICAgICAvLyBJQXVkaW9Qb2xpY3lTZXJ2aWNlIGludGVyZmFjZSAoc2VlIEF1ZGlvUG9saWN5SW50ZXJmYWNlIGZvciBtZXRob2QgZGVzY3JpcHRpb25zKQogICAgIC8vCiAgICAgc3RhdGljIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCk7CiAgICAgc3RhdGljIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7CiAgICAgc3RhdGljIHN0YXR1c190IGhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSk7CiAgICAgc3RhdGljIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpOwogICAgIHN0YXRpYyBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSk7CiAKLSAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgc3RhdGljIHN0YXR1c190IGdldE91dHB1dEZvckF0dHIoYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLApAQCAtMjIzLDIxICsyMzIsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKTsKLSAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgIHN0YXRpYyBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgc3RhdGljIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+ICpzZWNvbmRhcnlPdXRwdXRzKTsKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgIHN0YXRpYyBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKyAgICBzdGF0aWMgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAogICAgIC8vIENsaWVudCBtdXN0IHN1Y2Nlc3NmdWxseSBoYW5kIG9mZiB0aGUgaGFuZGxlIHJlZmVyZW5jZSB0byBBdWRpb0ZsaW5nZXIgdmlhIGNyZWF0ZVJlY29yZCgpLAogICAgIC8vIG9yIHJlbGVhc2UgaXQgd2l0aCByZWxlYXNlSW5wdXQoKS4KICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKQEAgLTI0Nyw4ICsyNTIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCk7CiAKLSAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzaWxlbmNlZCk7CisgICAgc3RhdGljIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgIHN0YXRpYyB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgc3RhdGljIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCkBAIC0yNjEsNiArMjY1LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwogCisgICAgc3RhdGljIHN0YXR1c190IHNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBpbnQgJmluZGV4KTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNaW5Wb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBpbnQgJmluZGV4KTsKKwogICAgIHN0YXRpYyB1aW50MzJfdCBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CiAgICAgc3RhdGljIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKIApAQCAtMjcyLDYgKzI4Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpOwogICAgIHN0YXRpYyBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCk7CiAgICAgc3RhdGljIHN0YXR1c190IHNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpOworICAgIHN0YXRpYyBzdGF0dXNfdCBtb3ZlRWZmZWN0c1RvSW8oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgaWRzLCBhdWRpb19pb19oYW5kbGVfdCBpbyk7CiAKICAgICAvLyBjbGVhciBzdHJlYW0gdG8gb3V0cHV0IG1hcHBpbmcgY2FjaGUgKGdTdHJlYW1PdXRwdXRNYXApCiAgICAgLy8gYW5kIG91dHB1dCBjb25maWd1cmF0aW9uIGNhY2hlIChnT3V0cHV0cykKQEAgLTI4NSw2ICszMDEsOCBAQAogCiAgICAgc3RhdGljIHN0YXR1c190IHNldExvd1JhbURldmljZShib29sIGlzTG93UmFtRGV2aWNlLCBpbnQ2NF90IHRvdGFsTWVtb3J5KTsKIAorICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSh1aWRfdCB1aWQsIGF1ZGlvX2ZsYWdzX21hc2tfdCBmbGFncyk7CisKICAgICAvLyBDaGVjayBpZiBodyBvZmZsb2FkIGlzIHBvc3NpYmxlIGZvciBnaXZlbiBmb3JtYXQsIHN0cmVhbSB0eXBlLCBzYW1wbGUgcmF0ZSwKICAgICAvLyBiaXQgcmF0ZSwgZHVyYXRpb24sIHZpZGVvIGFuZCBzdHJlYW1pbmcgb3Igb2ZmbG9hZCBwcm9wZXJ0eSBpcyBlbmFibGVkCiAgICAgc3RhdGljIGJvb2wgaXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBpbmZvKTsKQEAgLTMyNywxOSArMzQ1LDI5IEBACiAKICAgICBzdGF0aWMgc3RhdHVzX3QgcmVnaXN0ZXJQb2xpY3lNaXhlcyhjb25zdCBWZWN0b3I8QXVkaW9NaXg+JiBtaXhlcywgYm9vbCByZWdpc3RyYXRpb24pOwogCisgICAgc3RhdGljIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLCBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpOworCisgICAgc3RhdGljIHN0YXR1c190IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKTsKKwogICAgIHN0YXRpYyBzdGF0dXNfdCBzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKTsKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRNYXN0ZXJNb25vKGJvb2wgbW9ubyk7CiAgICAgc3RhdGljIHN0YXR1c190IGdldE1hc3Rlck1vbm8oYm9vbCAqbW9ubyk7CiAKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0TWFzdGVyQmFsYW5jZShmbG9hdCAqYmFsYW5jZSk7CisKICAgICBzdGF0aWMgZmxvYXQgICAgZ2V0U3RyZWFtVm9sdW1lREIoCiAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKIAogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7CiAKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cyk7CisKICAgICAvLyBudW1TdXJyb3VuZEZvcm1hdHMgaG9sZHMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGZvcm1hdHMgYW5kIGJvb2wgdmFsdWUgYWxsb3dlZCBpbiB0aGUgYXJyYXkuCiAgICAgLy8gV2hlbiBudW1TdXJyb3VuZEZvcm1hdHMgaXMgMCwgc3Vycm91bmRGb3JtYXRzIGFuZCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkIHdpbGwgbm90IGJlCiAgICAgLy8gcG9wdWxhdGVkLiBUaGUgYWN0dWFsIG51bWJlciBvZiBzdXJyb3VuZCBmb3JtYXRzIHNob3VsZCBiZSByZXR1cm5lZCBhdCBudW1TdXJyb3VuZEZvcm1hdHMuCkBAIC0zNDksOCArMzc3LDQwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcG9ydGVkKTsKICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0LCBib29sIGVuYWJsZWQpOwogCisgICAgc3RhdGljIHN0YXR1c190IHNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpOworICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRBMTF5U2VydmljZXNVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgdWlkcyk7CisKKyAgICBzdGF0aWMgYm9vbCAgICAgaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpOworCisgICAgc3RhdGljIHN0YXR1c190IGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0UHJvZHVjdFN0cmF0ZWd5RnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgJnByb2R1Y3RTdHJhdGVneSk7CisKKyAgICBzdGF0aWMgYXVkaW9fYXR0cmlidXRlc190IHN0cmVhbVR5cGVUb0F0dHJpYnV0ZXMoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworICAgIHN0YXRpYyBhdWRpb19zdHJlYW1fdHlwZV90IGF0dHJpYnV0ZXNUb1N0cmVhbVR5cGUoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBsaXN0QXVkaW9Wb2x1bWVHcm91cHMoQXVkaW9Wb2x1bWVHcm91cFZlY3RvciAmZ3JvdXBzKTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRWb2x1bWVHcm91cEZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZV9ncm91cF90ICZ2b2x1bWVHcm91cCk7CisKICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKKyAgICBjbGFzcyBBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2sgOiBwdWJsaWMgUmVmQmFzZQorICAgIHsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrKCkge30KKyAgICAgICAgdmlydHVhbCB+QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrKCkge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwgaW50IGZsYWdzKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBvblNlcnZpY2VEaWVkKCkgPSAwOworCisgICAgfTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBhZGRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrPiYgY2FsbGJhY2spOworICAgIHN0YXRpYyBzdGF0dXNfdCByZW1vdmVBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrPiYgY2FsbGJhY2spOworCiAgICAgY2xhc3MgQXVkaW9Qb3J0Q2FsbGJhY2sgOiBwdWJsaWMgUmVmQmFzZQogICAgIHsKICAgICBwdWJsaWM6CkBAIC0zNzksOSArNDM5LDExIEBACiAgICAgfTsKIAogICAgIHN0YXRpYyBzdGF0dXNfdCBhZGRBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgcmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9Jbyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAKICAgICBzdGF0aWMgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXREZXZpY2VJZEZvcklvKGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pOwogCkBAIC00MTIsMTcgKzQ3NCwyMCBAQAogCiAKICAgICAgICAgc3RhdHVzX3QgYWRkQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgICAgIHN0YXR1c190IHJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0RGV2aWNlSWRGb3JJbyhhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKTsKIAogICAgIHByaXZhdGU6CiAgICAgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOwogICAgICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3QsIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiA+ICAgbUlvRGVzY3JpcHRvcnM7Ci0gICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgVmVjdG9yIDwgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gPiA+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9EZXZpY2VDYWxsYmFja3M7CisKKyAgICAgICAgc3RkOjptYXA8YXVkaW9faW9faGFuZGxlX3QsIHN0ZDo6bWFwPGF1ZGlvX3BvcnRfaGFuZGxlX3QsIHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+Pj4KKyAgICAgICAgICAgICAgICBtQXVkaW9EZXZpY2VDYWxsYmFja3M7CiAgICAgICAgIC8vIGNhY2hlZCB2YWx1ZXMgZm9yIHJlY29yZGluZyBnZXRJbnB1dEJ1ZmZlclNpemUoKSBxdWVyaWVzCiAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbkJ1ZmZTaXplOyAgICAvLyB6ZXJvIGluZGljYXRlcyBjYWNoZSBpcyBpbnZhbGlkCiAgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JblNhbXBsaW5nUmF0ZTsKQEAgLTQ0MiwyMSArNTA3LDMxIEBACiAgICAgICAgIGludCByZW1vdmVBdWRpb1BvcnRDYWxsYmFjayhjb25zdCBzcDxBdWRpb1BvcnRDYWxsYmFjaz4mIGNhbGxiYWNrKTsKICAgICAgICAgYm9vbCBpc0F1ZGlvUG9ydENiRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIChtQXVkaW9Qb3J0Q2FsbGJhY2tzLnNpemUoKSAhPSAwKTsgfQogCisgICAgICAgIGludCBhZGRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrPiYgY2FsbGJhY2spOworICAgICAgICBpbnQgcmVtb3ZlQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjaz4mIGNhbGxiYWNrKTsKKyAgICAgICAgYm9vbCBpc0F1ZGlvVm9sdW1lR3JvdXBDYkVuYWJsZWQoKSBjb25zdCB7IHJldHVybiAobUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjay5zaXplKCkgIT0gMCk7IH0KKwogICAgICAgICAvLyBEZWF0aFJlY2lwaWVudAogICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKTsKIAogICAgICAgICAvLyBJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKICAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsIGludCBmbGFncyk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShTdHJpbmc4IHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKICAgICAgICAgdmlydHVhbCB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CiAKICAgICBwcml2YXRlOgogICAgICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTG9jazsKICAgICAgICAgVmVjdG9yIDxzcCA8QXVkaW9Qb3J0Q2FsbGJhY2s+ID4gICAgbUF1ZGlvUG9ydENhbGxiYWNrczsKKyAgICAgICAgVmVjdG9yIDxzcCA8QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrPiA+IG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2s7CiAgICAgfTsKIAogICAgIHN0YXRpYyBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RpbWVzdGFtcC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RpbWVzdGFtcC5oCmluZGV4IDQ5OGRlOGUuLmU1OTI1ZGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UaW1lc3RhbXAuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVGltZXN0YW1wLmgKQEAgLTEzNSw4ICsxMzUsMjMgQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAorICAgIGRvdWJsZSBnZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXModWludDMyX3Qgc2FtcGxlUmF0ZSkgY29uc3QgeworICAgICAgICByZXR1cm4gZ2V0TGF0ZW5jeU1zKHNhbXBsZVJhdGUsIExPQ0FUSU9OX1NFUlZFUiwgTE9DQVRJT05fS0VSTkVMKTsKKyAgICB9CisKKyAgICBkb3VibGUgZ2V0TGF0ZW5jeU1zKHVpbnQzMl90IHNhbXBsZVJhdGUsIExvY2F0aW9uIGxvY2F0aW9uMSwgTG9jYXRpb24gbG9jYXRpb24yKSBjb25zdCB7CisgICAgICAgIGlmIChzYW1wbGVSYXRlID4gMCAmJiBtVGltZU5zW2xvY2F0aW9uMV0gPiAwICYmIG1UaW1lTnNbbG9jYXRpb24yXSA+IDApIHsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgZnJhbWVEaWZmZXJlbmNlID0KKyAgICAgICAgICAgICAgICAgICAgbVBvc2l0aW9uW2xvY2F0aW9uMV0gLSBtUG9zaXRpb25bbG9jYXRpb24yXTsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgdGltZURpZmZlcmVuY2VOcyA9CisgICAgICAgICAgICAgICAgICAgIG1UaW1lTnNbbG9jYXRpb24xXSAtIG1UaW1lTnNbbG9jYXRpb24yXTsKKyAgICAgICAgICAgIHJldHVybiAoKGRvdWJsZSlmcmFtZURpZmZlcmVuY2UgKiAxZTkgLyBzYW1wbGVSYXRlIC0gdGltZURpZmZlcmVuY2VOcykgKiAxZS02OworICAgICAgICB9CisgICAgICAgIHJldHVybiAwLjsKKyAgICB9CisKICAgICAvLyBjb252ZXJ0IGZpZWxkcyB0byBhIHByaW50YWJsZSBzdHJpbmcKLSAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIHsKKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0IHsKICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CiAKICAgICAgICAgc3MgPDwgIkJPT1RUSU1FIG9mZnNldCAiIDw8IG1UaW1lYmFzZU9mZnNldFtUSU1FQkFTRV9CT09UVElNRV0gPDwgIlxuIjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmgKaW5kZXggM2ViNjI3ZC4uZGY1ZWFiYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmgKQEAgLTc0LDYgKzc0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBtYXBwaW5nIGZyb20gZnJhbWUgcG9zaXRpb24gdG8gcHJlc2VudGF0aW9uIHRpbWUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWUgQXVkaW9UaW1lc3RhbXAgZm9yIHRoZSBpbmZvcm1hdGlvbiBpbmNsdWRlZCB3aXRoIGV2ZW50LgogI2VuZGlmCisgICAgICAgIEVWRU5UX0NBTl9XUklURV9NT1JFX0RBVEEgPSA5LC8vIE5vdGlmaWNhdGlvbiB0aGF0IG1vcmUgZGF0YSBjYW4gYmUgZ2l2ZW4gYnkgd3JpdGUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBldmVudCBvbmx5IG9jY3VycyBmb3IgVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSy4KICAgICB9OwogCiAgICAgLyogQ2xpZW50IHNob3VsZCBkZWNsYXJlIGEgQnVmZmVyIGFuZCBwYXNzIHRoZSBhZGRyZXNzIHRvIG9idGFpbkJ1ZmZlcigpCkBAIC0xMDIsNyArMTA0LDcgQEAKIAogICAgICAgICB1bmlvbiB7CiAgICAgICAgICAgICB2b2lkKiAgICAgICByYXc7Ci0gICAgICAgICAgICBzaG9ydCogICAgICBpMTY7ICAgICAgLy8gc2lnbmVkIDE2LWJpdAorICAgICAgICAgICAgaW50MTZfdCogICAgaTE2OyAgICAgIC8vIHNpZ25lZCAxNi1iaXQKICAgICAgICAgICAgIGludDhfdCogICAgIGk4OyAgICAgICAvLyB1bnNpZ25lZCA4LWJpdCwgb2Zmc2V0IGJ5IDB4ODAKICAgICAgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnB1dCB0byBvYnRhaW5CdWZmZXIoKTogdW51c2VkLCBvdXRwdXQ6IHBvaW50ZXIgdG8gYnVmZmVyCiAgICAgfTsKQEAgLTE0NSw2ICsxNDcsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSk7CiAKKyAgICAvKiBDaGVjayBpZiBkaXJlY3QgcGxheWJhY2sgaXMgcG9zc2libGUgZm9yIHRoZSBnaXZlbiBhdWRpbyBjb25maWd1cmF0aW9uIGFuZCBhdHRyaWJ1dGVzLgorICAgICAqIFJldHVybiB0cnVlIGlmIG91dHB1dCBpcyBwb3NzaWJsZSBmb3IgdGhlIGdpdmVuIHBhcmFtZXRlcnMuIE90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgorICAgICAqLworICAgIHN0YXRpYyBib29sIGlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMpOworCiAgICAgLyogSG93IGRhdGEgaXMgdHJhbnNmZXJyZWQgdG8gQXVkaW9UcmFjawogICAgICAqLwogICAgIGVudW0gdHJhbnNmZXJfdHlwZSB7CkBAIC0xNTMsNiArMTYxLDcgQEAKICAgICAgICAgVFJBTlNGRVJfT0JUQUlOLCAgICAvLyBjYWxsIG9idGFpbkJ1ZmZlcigpIGFuZCByZWxlYXNlQnVmZmVyKCkKICAgICAgICAgVFJBTlNGRVJfU1lOQywgICAgICAvLyBzeW5jaHJvbm91cyB3cml0ZSgpCiAgICAgICAgIFRSQU5TRkVSX1NIQVJFRCwgICAgLy8gc2hhcmVkIG1lbW9yeQorICAgICAgICBUUkFOU0ZFUl9TWU5DX05PVElGX0NBTExCQUNLLCAvLyBzeW5jaHJvbm91cyB3cml0ZSgpLCBub3RpZiBFVkVOVF9DQU5fV1JJVEVfTU9SRV9EQVRBCiAgICAgfTsKIAogICAgIC8qIENvbnN0cnVjdHMgYW4gdW5pbml0aWFsaXplZCBBdWRpb1RyYWNrLiBObyBjb25uZWN0aW9uIHdpdGgKQEAgLTI5NSw2ICszMDQsOCBAQAogICAgICAqIFBhcmFtZXRlcnMgbm90IGxpc3RlZCBpbiB0aGUgQXVkaW9UcmFjayBjb25zdHJ1Y3RvcnMgYWJvdmU6CiAgICAgICoKICAgICAgKiB0aHJlYWRDYW5DYWxsSmF2YTogIFdoZXRoZXIgY2FsbGJhY2tzIGFyZSBtYWRlIGZyb20gYW4gYXR0YWNoZWQgdGhyZWFkIGFuZCB0aHVzIGNhbiBjYWxsIEpOSS4KKyAgICAgKiAgICAgIE9ubHkgc2V0IHRvIHRydWUgd2hlbiBBdWRpb1RyYWNrIG9iamVjdCBpcyB1c2VkIGZvciBhIGphdmEgYW5kcm9pZC5tZWRpYS5BdWRpb1RyYWNrCisgICAgICogICAgICBpbiBpdHMgSk5JIGNvZGUuCiAgICAgICoKICAgICAgKiBJbnRlcm5hbCBzdGF0ZSBwb3N0IGNvbmRpdGlvbjoKICAgICAgKiAgICAgIChtU3RyZWFtVHlwZSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCkgaW1wbGllcyB0aGlzIEF1ZGlvVHJhY2sgaGFzIHZhbGlkIGF0dHJpYnV0ZXMKQEAgLTkwNyw3ICs5MTgsMTQgQEAKICAgICAgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG1TdGF0ZSA9PSBTVEFURV9BQ1RJVkUgfHwgbVN0YXRlID09IFNUQVRFX1NUT1BQSU5HOwogICAgICAgICAgICAgfQotcHJvdGVjdGVkOgorCisgICAgLyogR2V0IHRoZSB1bmlxdWUgcG9ydCBJRCBhc3NpZ25lZCB0byB0aGlzIEF1ZGlvVHJhY2sgaW5zdGFuY2UgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIuCisgICAgICogVGhlIElEIGlzIHVuaXF1ZSBhY3Jvc3MgYWxsIGF1ZGlvc2VydmVyIGNsaWVudHMgYW5kIGNhbiBjaGFuZ2UgZHVyaW5nIHRoZSBsaWZlIGN5Y2xlCisgICAgICogb2YgYSBnaXZlbiBBdWRpb1RyYWNrIGluc3RhbmNlIGlmIHRoZSBjb25uZWN0aW9uIHRvIGF1ZGlvc2VydmVyIGlzIHJlc3RvcmVkLgorICAgICAqLworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRQb3J0SWQoKSBjb25zdCB7IHJldHVybiBtUG9ydElkOyB9OworCisgcHJvdGVjdGVkOgogICAgIC8qIGNvcHlpbmcgYXVkaW8gdHJhY2tzIGlzIG5vdCBhbGxvd2VkICovCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RyYWNrKGNvbnN0IEF1ZGlvVHJhY2smIG90aGVyKTsKICAgICAgICAgICAgIEF1ZGlvVHJhY2smIG9wZXJhdG9yID0gKGNvbnN0IEF1ZGlvVHJhY2smIG90aGVyKTsKQEAgLTkxNiw3ICs5MzQsNyBAQAogICAgIGNsYXNzIEF1ZGlvVHJhY2tUaHJlYWQgOiBwdWJsaWMgVGhyZWFkCiAgICAgewogICAgIHB1YmxpYzoKLSAgICAgICAgQXVkaW9UcmFja1RocmVhZChBdWRpb1RyYWNrJiByZWNlaXZlciwgYm9vbCBiQ2FuQ2FsbEphdmEgPSBmYWxzZSk7CisgICAgICAgIEF1ZGlvVHJhY2tUaHJlYWQoQXVkaW9UcmFjayYgcmVjZWl2ZXIpOwogCiAgICAgICAgIC8vIERvIG5vdCBjYWxsIFRocmVhZDo6cmVxdWVzdEV4aXRBbmRXYWl0KCkgd2l0aG91dCBmaXJzdCBjYWxsaW5nIHJlcXVlc3RFeGl0KCkuCiAgICAgICAgIC8vIFRocmVhZDo6cmVxdWVzdEV4aXRBbmRXYWl0KCkgaXMgbm90IHZpcnR1YWwsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24gZG9lc24ndCBkbyBlbm91Z2guCkBAIC0xMDAzLDcgKzEwMjEsNyBAQAogICAgIHNwPElBdWRpb1RyYWNrPiAgICAgICAgIG1BdWRpb1RyYWNrOwogICAgIHNwPElNZW1vcnk+ICAgICAgICAgICAgIG1DYmxrTWVtb3J5OwogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogICAgIG1DYmxrOyAgICAgICAgICAgICAgICAgIC8vIHJlLWxvYWQgYWZ0ZXIgbUxvY2sudW5sb2NrKCkKLSAgICBhdWRpb19pb19oYW5kbGVfdCAgICAgICBtT3V0cHV0OyAgICAgICAgICAgICAgICAvLyByZXR1cm5lZCBieSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cigpCisgICAgYXVkaW9faW9faGFuZGxlX3QgICAgICAgbU91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOyAvLyBmcm9tIEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JBdHRyKCkKIAogICAgIHNwPEF1ZGlvVHJhY2tUaHJlYWQ+ICAgIG1BdWRpb1RyYWNrVGhyZWFkOwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1UaHJlYWRDYW5DYWxsSmF2YTsKQEAgLTEwNTgsNiArMTA3NiwxOSBAQAogICAgICAgICBTVEFURV9TVE9QUElORywKICAgICB9ICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGU7CiAKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnN0YXRlVG9TdHJpbmcoU3RhdGUgc3RhdGUpCisgICAgeworICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgIGNhc2UgU1RBVEVfQUNUSVZFOiAgICAgICAgICByZXR1cm4gIlNUQVRFX0FDVElWRSI7CisgICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRDogICAgICAgICByZXR1cm4gIlNUQVRFX1NUT1BQRUQiOworICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDogICAgICAgICAgcmV0dXJuICJTVEFURV9QQVVTRUQiOworICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRF9TVE9QUElORzogcmV0dXJuICJTVEFURV9QQVVTRURfU1RPUFBJTkciOworICAgICAgICBjYXNlIFNUQVRFX0ZMVVNIRUQ6ICAgICAgICAgcmV0dXJuICJTVEFURV9GTFVTSEVEIjsKKyAgICAgICAgY2FzZSBTVEFURV9TVE9QUElORzogICAgICAgIHJldHVybiAiU1RBVEVfU1RPUFBJTkciOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJVTktOT1dOIjsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8vIGZvciBjbGllbnQgY2FsbGJhY2sgaGFuZGxlcgogICAgIGNhbGxiYWNrX3QgICAgICAgICAgICAgIG1DYmY7ICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrIGhhbmRsZXIgZm9yIGV2ZW50cywgb3IgTlVMTAogICAgIHZvaWQqICAgICAgICAgICAgICAgICAgIG1Vc2VyRGF0YTsKQEAgLTExMjAsOCArMTE1MSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvVHJhY2tzLgogCiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVByZXZpb3VzVGltZXN0YW1wVmFsaWQ7Ly8gdHJ1ZSBpZiBtUHJldmlvdXNUaW1lc3RhbXAgaXMgdmFsaWQKLSAgICBib29sICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wU3RhcnR1cEdsaXRjaFJlcG9ydGVkOyAvLyByZWR1Y2UgbG9nIHNwYW0KLSAgICBib29sICAgICAgICAgICAgICAgICAgICBtUmV0cm9ncmFkZU1vdGlvblJlcG9ydGVkOyAvLyByZWR1Y2UgbG9nIHNwYW0KKyAgICBib29sICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wU3RhcnR1cEdsaXRjaFJlcG9ydGVkOyAgICAgIC8vIHJlZHVjZSBsb2cgc3BhbQorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBSZXRyb2dyYWRlUG9zaXRpb25SZXBvcnRlZDsgLy8gcmVkdWNlIGxvZyBzcGFtCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFJldHJvZ3JhZGVUaW1lUmVwb3J0ZWQ7ICAgICAvLyByZWR1Y2UgbG9nIHNwYW0KKyAgICBib29sICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wU3RhbGxSZXBvcnRlZDsgICAgICAgICAgICAgIC8vIHJlZHVjZSBsb2cgc3BhbQorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBTdGFsZVRpbWVSZXBvcnRlZDsgICAgICAgICAgLy8gcmVkdWNlIGxvZyBzcGFtCiAgICAgQXVkaW9UaW1lc3RhbXAgICAgICAgICAgbVByZXZpb3VzVGltZXN0YW1wOyAgICAgLy8gdXNlZCB0byBkZXRlY3QgcmV0cm9ncmFkZSBtb3Rpb24KICAgICBFeHRlbmRlZFRpbWVzdGFtcDo6TG9jYXRpb24gbVByZXZpb3VzTG9jYXRpb247ICAvLyBsb2NhdGlvbiB1c2VkIGZvciBwcmV2aW91cyB0aW1lc3RhbXAKIApAQCAtMTE0OCw2ICsxMTgyLDcgQEAKIAogICAgIGF1ZGlvX3Nlc3Npb25fdCAgICAgICAgIG1TZXNzaW9uSWQ7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUF1eEVmZmVjdElkOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1Qb3J0SWQ7ICAgICAgICAgICAgICAgICAgICAvLyBJZCBmcm9tIEF1ZGlvIFBvbGljeSBNYW5hZ2VyCiAKICAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICBtTG9jazsKIApAQCAtMTE5NSw3ICsxMjMwLDcgQEAKIHByaXZhdGU6CiAgICAgY2xhc3MgTWVkaWFNZXRyaWNzIHsKICAgICAgIHB1YmxpYzoKLSAgICAgICAgTWVkaWFNZXRyaWNzKCkgOiBtQW5hbHl0aWNzSXRlbShuZXcgTWVkaWFBbmFseXRpY3NJdGVtKCJhdWRpb3RyYWNrIikpIHsKKyAgICAgICAgTWVkaWFNZXRyaWNzKCkgOiBtQW5hbHl0aWNzSXRlbShNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZSgiYXVkaW90cmFjayIpKSB7CiAgICAgICAgIH0KICAgICAgICAgfk1lZGlhTWV0cmljcygpIHsKICAgICAgICAgICAgIC8vIG1BbmFseXRpY3NJdGVtIGFsbG9jIGZhaWx1cmUgd2lsbCBiZSBmbGFnZ2VkIGluIHRoZSBjb25zdHJ1Y3RvcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1ZvbHVtZUdyb3VwLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVm9sdW1lR3JvdXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTZlYTA3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1ZvbHVtZUdyb3VwLmgKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEF1ZGlvVm9sdW1lR3JvdXAgOiBwdWJsaWMgUGFyY2VsYWJsZQoreworcHVibGljOgorICAgIEF1ZGlvVm9sdW1lR3JvdXAoKSB7fQorICAgIEF1ZGlvVm9sdW1lR3JvdXAoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICB2b2x1bWVfZ3JvdXBfdCBncm91cCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJpYnV0ZXNWZWN0b3IgJmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJlYW1UeXBlVmVjdG9yICZzdHJlYW1zKSA6CisgICAgICAgIG1OYW1lKG5hbWUpLCBtR3JvdXBJZChncm91cCksIG1BdWRpb0F0dHJpYnV0ZXMoYXR0cmlidXRlcyksIG1TdHJlYW1zKHN0cmVhbXMpIHt9CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9CisgICAgdm9sdW1lX2dyb3VwX3QgZ2V0SWQoKSBjb25zdCB7IHJldHVybiBtR3JvdXBJZDsgfQorICAgIEF0dHJpYnV0ZXNWZWN0b3IgZ2V0QXVkaW9BdHRyaWJ1dGVzKCkgY29uc3QgeyByZXR1cm4gbUF1ZGlvQXR0cmlidXRlczsgfQorICAgIFN0cmVhbVR5cGVWZWN0b3IgZ2V0U3RyZWFtVHlwZXMoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtczsgfQorCisgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nIG1OYW1lOworICAgIHZvbHVtZV9ncm91cF90IG1Hcm91cElkID0gVk9MVU1FX0dST1VQX05PTkU7CisgICAgQXR0cmlidXRlc1ZlY3RvciBtQXVkaW9BdHRyaWJ1dGVzOworICAgIFN0cmVhbVR5cGVWZWN0b3IgbVN0cmVhbXM7Cit9OworCit1c2luZyBBdWRpb1ZvbHVtZUdyb3VwVmVjdG9yID0gc3RkOjp2ZWN0b3I8QXVkaW9Wb2x1bWVHcm91cD47CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKaW5kZXggZTZiZjcyZi4uOGVjODkzMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKQEAgLTE0Niw2ICsxNDYsNyBAQAogICAgICAgICAgICAgYWZTYW1wbGVSYXRlID0gcGFyY2VsLT5yZWFkSW50NjQoKTsKICAgICAgICAgICAgIGFmTGF0ZW5jeU1zID0gcGFyY2VsLT5yZWFkSW50MzIoKTsKICAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+cmVhZCgmb3V0cHV0SWQsIHNpemVvZihhdWRpb19pb19oYW5kbGVfdCkpOworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT5yZWFkKCZwb3J0SWQsIHNpemVvZihhdWRpb19wb3J0X2hhbmRsZV90KSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIApAQCAtMTYzLDYgKzE2NCw3IEBACiAgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50NjQoYWZTYW1wbGVSYXRlKTsKICAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQzMihhZkxhdGVuY3lNcyk7CiAgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZvdXRwdXRJZCwgc2l6ZW9mKGF1ZGlvX2lvX2hhbmRsZV90KSk7CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZwb3J0SWQsIHNpemVvZihhdWRpb19wb3J0X2hhbmRsZV90KSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIApAQCAtMTc5LDYgKzE4MSw3IEBACiAgICAgICAgIHVpbnQzMl90IGFmU2FtcGxlUmF0ZTsKICAgICAgICAgdWludDMyX3QgYWZMYXRlbmN5TXM7CiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dElkOworICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZDsKICAgICB9OwogCiAgICAgLyogQ3JlYXRlUmVjb3JkSW5wdXQgY29udGFpbnMgYWxsIGlucHV0IGFyZ3VtZW50cyBzZW50IGJ5IEF1ZGlvUmVjb3JkIHRvIEF1ZGlvRmxpbmdlcgpAQCAtMjAyLDYgKzIwNSw5IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgb3BQYWNrYWdlTmFtZSA9IHBhcmNlbC0+cmVhZFN0cmluZzE2KCk7CisgICAgICAgICAgICBpZiAocGFyY2VsLT5yZWFkKCZyaWlkLCBzaXplb2YoYXVkaW9fdW5pcXVlX2lkX3QpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLyogaW5wdXQvb3V0cHV0IGFyZ3VtZW50cyovCiAgICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWQoJmZsYWdzLCBzaXplb2YoYXVkaW9faW5wdXRfZmxhZ3NfdCkpOwpAQCAtMjE4LDYgKzIyNCw3IEBACiAgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfYmFzZV90KSk7CiAgICAgICAgICAgICAodm9pZCljbGllbnRJbmZvLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKICAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVTdHJpbmcxNihvcFBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJnJpaWQsIHNpemVvZihhdWRpb191bmlxdWVfaWRfdCkpOwogCiAgICAgICAgICAgICAvKiBpbnB1dC9vdXRwdXQgYXJndW1lbnRzKi8KICAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJmZsYWdzLCBzaXplb2YoYXVkaW9faW5wdXRfZmxhZ3NfdCkpOwpAQCAtMjMzLDYgKzI0MCw3IEBACiAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnOwogICAgICAgICBBdWRpb0NsaWVudCBjbGllbnRJbmZvOwogICAgICAgICBTdHJpbmcxNiBvcFBhY2thZ2VOYW1lOworICAgICAgICBhdWRpb191bmlxdWVfaWRfdCByaWlkOwogCiAgICAgICAgIC8qIGlucHV0L291dHB1dCAqLwogICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzOwpAQCAtMjcxLDYgKzI3OSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT5yZWFkKCZwb3J0SWQsIHNpemVvZihhdWRpb19wb3J0X2hhbmRsZV90KSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KIApAQCAtMjk3LDYgKzMwNiw3IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGVJbnQzMigwKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+d3JpdGUoJnBvcnRJZCwgc2l6ZW9mKGF1ZGlvX3BvcnRfaGFuZGxlX3QpKTsKIAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CkBAIC0zMTMsNiArMzIzLDcgQEAKICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXRJZDsKICAgICAgICAgc3A8SU1lbW9yeT4gY2JsazsKICAgICAgICAgc3A8SU1lbW9yeT4gYnVmZmVyczsKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQ7CiAgICAgfTsKIAogICAgIC8vIGludmFyaWFudCBvbiBleGl0IGZvciBhbGwgQVBJcyB0aGF0IHJldHVybiBhbiBzcDw+OgpAQCAtMzUzLDYgKzM2NCw5IEBACiAgICAgdmlydHVhbCAgICAgZmxvYXQgICAgICAgbWFzdGVyVm9sdW1lKCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIG1hc3Rlck11dGUoKSBjb25zdCA9IDA7CiAKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpID0gMDsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBnZXRNYXN0ZXJCYWxhbmNlKGZsb2F0ICpiYWxhbmNlKSBjb25zdCA9IDA7CisKICAgICAvKiBzZXQvZ2V0IHN0cmVhbSB0eXBlIHN0YXRlLiBUaGlzIHdpbGwgcHJvYmFibHkgYmUgdXNlZCBieQogICAgICAqIHRoZSBwcmVmZXJlbmNlIHBhbmVsLCBtb3N0bHkuCiAgICAgICovCkBAIC00MjgsNyArNDQyLDkgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgY29uc3QgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFZmZlY3REZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVVUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSBjb25zdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBUeXBlVVVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlZmVycmVkVHlwZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSBjb25zdCA9IDA7CiAKICAgICB2aXJ0dWFsIHNwPElFZmZlY3Q+IGNyZWF0ZUVmZmVjdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjLApAQCAtNDQ2LDYgKzQ2MiwxMCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgbW92ZUVmZmVjdHMoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sIGF1ZGlvX2lvX2hhbmRsZV90IHNyY091dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdE91dHB1dCkgPSAwOwogCisgICAgdmlydHVhbCB2b2lkIHNldEVmZmVjdFN1c3BlbmRlZChpbnQgZWZmZWN0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdXNwZW5kZWQpID0gMDsKKwogICAgIHZpcnR1YWwgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGxvYWRId01vZHVsZShjb25zdCBjaGFyICpuYW1lKSA9IDA7CiAKICAgICAvLyBoZWxwZXJzIGZvciBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlci5nZXRQcm9wZXJ0eSgpLCBzZWUgZGVzY3JpcHRpb24gdGhlcmUgZm9yIG1lYW5pbmcKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKaW5kZXggYzM4NzZhZi4uMzNhYjFmOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKQEAgLTIwLDE1ICsyMCwxNCBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgotCiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaD4KLQogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDUsMTggKzQ0LDIwIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSA9IDA7CiAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpID0gMDsKICAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKSA9IDA7CiAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0cihhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCkBAIC02NSwxOCArNjYsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOwotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiAqc2Vjb25kYXJ5T3V0cHV0cykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgIGdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCkBAIC04NSw4ICs4Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqc2lsZW5jZWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCkBAIC05OCw2ICs5NCwxNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWF4Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgaW50ICZpbmRleCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaW5Wb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBpbnQgJmluZGV4KSA9IDA7CisKICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7CiAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOwogICAgIHZpcnR1YWwgYXVkaW9faW9faGFuZGxlX3QgZ2V0T3V0cHV0Rm9yRWZmZWN0KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpID0gMDsKQEAgLTEwOCw2ICsxMTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgbW92ZUVmZmVjdHNUb0lvKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIGlkcywgYXVkaW9faW9faGFuZGxlX3QgaW8pID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgICAgIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgICAgIGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgPSAwOwpAQCAtMTE1LDEwICsxMjMsMjkgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFNvdXJjZURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEFsbG93ZWRDYXB0dXJlUG9saWN5KHVpZF90IHVpZCwgYXVkaW9fZmxhZ3NfbWFza190IGZsYWdzKSA9IDA7CiAgICAvLyBDaGVjayBpZiBvZmZsb2FkIGlzIHBvc3NpYmxlIGZvciBnaXZlbiBmb3JtYXQsIHN0cmVhbSB0eXBlLCBzYW1wbGUgcmF0ZSwKICAgICAvLyBiaXQgcmF0ZSwgZHVyYXRpb24sIHZpZGVvIGFuZCBzdHJlYW1pbmcgb3Igb2ZmbG9hZCBwcm9wZXJ0eSBpcyBlbmFibGVkCiAgICAgdmlydHVhbCBib29sIGlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgaW5mbykgPSAwOwogCisgICAgLy8gQ2hlY2sgaWYgZGlyZWN0IHBsYXliYWNrIGlzIHBvc3NpYmxlIGZvciBnaXZlbiBmb3JtYXQsIHNhbXBsZSByYXRlLCBjaGFubmVsIG1hc2sgYW5kIGZsYWdzLgorICAgIHZpcnR1YWwgYm9vbCBpc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcykgPSAwOworCiAgICAgLyogTGlzdCBhdmFpbGFibGUgYXVkaW8gcG9ydHMgYW5kIHRoZWlyIGF0dHJpYnV0ZXMgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLApAQCAtMTQ3LDYgKzE3NCw4IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZChib29sIGVuYWJsZWQpID0gMDsKIAorICAgIHZpcnR1YWwgdm9pZCBzZXRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZChib29sIGVuYWJsZWQpID0gMDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgYWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90ICpzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSkgPSAwOwpAQCAtMTU3LDEwICsxODYsMTUgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJQb2xpY3lNaXhlcyhjb25zdCBWZWN0b3I8QXVkaW9NaXg+JiBtaXhlcywgYm9vbCByZWdpc3RyYXRpb24pID0gMDsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykKKyAgICAgICAgICAgID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpID0gMDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck1vbm8oYm9vbCBtb25vKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNb25vKGJvb2wgKm1vbm8pID0gMDsKQEAgLTE3MSw3ICsyMDUsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqc3Vycm91bmRGb3JtYXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnN1cnJvdW5kRm9ybWF0c0VuYWJsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXBvcnRlZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gKmZvcm1hdHMpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwgYm9vbCBlbmFibGVkKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEExMXlTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKSA9IDA7CisKKyAgICB2aXJ0dWFsIGJvb2wgICAgIGlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciAmc3RyYXRlZ2llcykgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvZHVjdFN0cmF0ZWd5RnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgJnByb2R1Y3RTdHJhdGVneSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Wb2x1bWVHcm91cHMoQXVkaW9Wb2x1bWVHcm91cFZlY3RvciAmZ3JvdXBzKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRWb2x1bWVHcm91cEZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVfZ3JvdXBfdCAmdm9sdW1lR3JvdXApID0gMDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaAppbmRleCBlMGQyNDk1Li40N2IzMWVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaApAQCAtMTcsMTkgKzE3LDI2IEBACiAjaWZuZGVmIEFORFJPSURfSUFVRElPUE9MSUNZU0VSVklDRUNMSUVOVF9ICiAjZGVmaW5lIEFORFJPSURfSUFVRElPUE9MSUNZU0VSVklDRUNMSUVOVF9ICiAKKyNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1ZvbHVtZUdyb3VwLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdHJ1Y3QgcmVjb3JkX2NsaWVudF9pbmZvIHsKKyAgICBhdWRpb191bmlxdWVfaWRfdCByaWlkOwogICAgIHVpZF90IHVpZDsKICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbjsKICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2U7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0X2lkOworICAgIGJvb2wgc2lsZW5jZWQ7CiB9OwogCiB0eXBlZGVmIHN0cnVjdCByZWNvcmRfY2xpZW50X2luZm8gcmVjb3JkX2NsaWVudF9pbmZvX3Q7CkBAIC00MSw2ICs0OCw4IEBACiBwdWJsaWM6CiAgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQpOwogCisgICAgLy8gTm90aWZpZXMgYSBjaGFuZ2Ugb2Ygdm9sdW1lIGdyb3VwCisgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsIGludCBmbGFncykgPSAwOwogICAgIC8vIE5vdGlmaWVzIGEgY2hhbmdlIG9mIGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4KICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCkgPSAwOwogICAgIC8vIE5vdGlmaWVzIGEgY2hhbmdlIG9mIGF1ZGlvIHBhdGNoIGNvbmZpZ3VyYXRpb24uCkBAIC01MSw4ICs2MCwxMSBAQAogICAgIHZpcnR1YWwgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAogICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCiAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAogICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpID0gMDsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgPSAwOwogfTsKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1RyYWNrLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1RyYWNrLmgKaW5kZXggOTRhZmUzYy4uMDZlNzg2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9UcmFjay5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaApAQCAtNzAsNiArNzAsOSBAQAogICAgIC8qIFNlbmQgcGFyYW1ldGVycyB0byB0aGUgYXVkaW8gaGFyZHdhcmUgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykgPSAwOwogCisgICAgLyogU2VsZWN0cyB0aGUgcHJlc2VudGF0aW9uIChpZiBhdmFpbGFibGUpICovCisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKSA9IDA7CisKICAgICAvKiBSZXR1cm4gTk9fRVJST1IgaWYgdGltZXN0YW1wIGlzIHZhbGlkLiAgdGltZXN0YW1wIGlzIHVuZGVmaW5lZCBvdGhlcndpc2UuICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkgPSAwOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL1JlY29yZGluZ0FjdGl2aXR5VHJhY2tlci5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9SZWNvcmRpbmdBY3Rpdml0eVRyYWNrZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODkxYTcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9SZWNvcmRpbmdBY3Rpdml0eVRyYWNrZXIuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0FORFJPSURfUkVDT1JESU5HX0FDVElWSVRZX1RSQUNLRVJfSF9fCisjZGVmaW5lIF9fQU5EUk9JRF9SRUNPUkRJTkdfQUNUSVZJVFlfVFJBQ0tFUl9IX18KKworI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJQXVkaW9NYW5hZ2VyOworY2xhc3MgSUJpbmRlcjsKKworY2xhc3MgUmVjb3JkaW5nQWN0aXZpdHlUcmFja2VyCit7CitwdWJsaWM6CisgICAgUmVjb3JkaW5nQWN0aXZpdHlUcmFja2VyKCk7CisgICAgflJlY29yZGluZ0FjdGl2aXR5VHJhY2tlcigpOworICAgIGF1ZGlvX3VuaXF1ZV9pZF90IGdldFJpaWQoKTsKKyAgICB2b2lkIHJlY29yZGluZ1N0YXJ0ZWQoKTsKKyAgICB2b2lkIHJlY29yZGluZ1N0b3BwZWQoKTsKKworcHJpdmF0ZToKKyAgICBzcDxJQXVkaW9NYW5hZ2VyPiBtQXVkaW9NYW5hZ2VyOworICAgIGF1ZGlvX3VuaXF1ZV9pZF90IG1SSUlkOworICAgIHNwPElCaW5kZXI+ICAgICAgIG1Ub2tlbjsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIF9fQU5EUk9JRF9SRUNPUkRJTkdfQUNUSVZJVFlfVFJBQ0tFUl9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvVG9uZUdlbmVyYXRvci5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9Ub25lR2VuZXJhdG9yLmgKaW5kZXggN2FlNmFhNi4uNWIwNjg5YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9Ub25lR2VuZXJhdG9yLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9Ub25lR2VuZXJhdG9yLmgKQEAgLTI2Myw5ICsyNjMsOSBAQAogICAgIGNsYXNzIFRvbmVTZWdtZW50IHsKICAgICBwdWJsaWM6CiAgICAgICAgIHVuc2lnbmVkIGludCBkdXJhdGlvbjsKLSAgICAgICAgdW5zaWduZWQgc2hvcnQgd2F2ZUZyZXFbVE9ORUdFTl9NQVhfV0FWRVMrMV07Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0IGxvb3BDbnQ7Ci0gICAgICAgIHVuc2lnbmVkIHNob3J0IGxvb3BJbmR4OworICAgICAgICB1aW50MTZfdCB3YXZlRnJlcVtUT05FR0VOX01BWF9XQVZFUysxXTsKKyAgICAgICAgdWludDE2X3QgbG9vcENudDsKKyAgICAgICAgdWludDE2X3QgbG9vcEluZHg7CiAgICAgfTsKIAogICAgIGNsYXNzIFRvbmVEZXNjcmlwdG9yIHsKQEAgLTI4NiwxNCArMjg2LDE0IEBACiAgICAgdW5zaWduZWQgaW50IG1NYXhTbXA7ICAvLyBNYXhpbXVtIG51bWJlciBvZiBhdWRpbyBzYW1wbGVzIHBsYXllZCAobWF4aW11biB0b25lIGR1cmF0aW9uKQogICAgIGludCBtRHVyYXRpb25NczsgIC8vIE1heGltdW0gdG9uZSBkdXJhdGlvbiBpbiBtcwogCi0gICAgdW5zaWduZWQgc2hvcnQgbUN1clNlZ21lbnQ7ICAvLyBDdXJyZW50IHNlZ21lbnQgaW5kZXggaW4gVG9uZURlc2NyaXB0b3Igc2VnbWVudHNbXQotICAgIHVuc2lnbmVkIHNob3J0IG1DdXJDb3VudDsgIC8vIEN1cnJlbnQgc2VxdWVuY2UgcmVwZWF0IGNvdW50Ci0gICAgdm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgbVN0YXRlOyAgLy8gVG9uZUdlbmVyYXRvciBzdGF0ZSAodG9uZV9zdGF0ZSkKLSAgICB1bnNpZ25lZCBzaG9ydCBtUmVnaW9uOworICAgIHVpbnQxNl90IG1DdXJTZWdtZW50OyAgLy8gQ3VycmVudCBzZWdtZW50IGluZGV4IGluIFRvbmVEZXNjcmlwdG9yIHNlZ21lbnRzW10KKyAgICB1aW50MTZfdCBtQ3VyQ291bnQ7ICAvLyBDdXJyZW50IHNlcXVlbmNlIHJlcGVhdCBjb3VudAorICAgIHZvbGF0aWxlIHVpbnQxNl90IG1TdGF0ZTsgIC8vIFRvbmVHZW5lcmF0b3Igc3RhdGUgKHRvbmVfc3RhdGUpCisgICAgdWludDE2X3QgbVJlZ2lvbjsKICAgICBjb25zdCBUb25lRGVzY3JpcHRvciAqbXBUb25lRGVzYzsgIC8vIHBvaW50ZXIgdG8gYWN0aXZlIHRvbmUgZGVzY3JpcHRvcgogICAgIGNvbnN0IFRvbmVEZXNjcmlwdG9yICptcE5ld1RvbmVEZXNjOyAgLy8gcG9pbnRlciB0byBuZXh0IGFjdGl2ZSB0b25lIGRlc2NyaXB0b3IKIAotICAgIHVuc2lnbmVkIHNob3J0IG1Mb29wQ291bnRlcjsgLy8gQ3VycmVudCB0b25lIGxvb3BiYWNrIGNvdW50CisgICAgdWludDE2X3QgbUxvb3BDb3VudGVyOyAvLyBDdXJyZW50IHRvbmUgbG9vcGJhY2sgY291bnQKIAogICAgIHVpbnQzMl90IG1TYW1wbGluZ1JhdGU7ICAvLyBBdWRpb0ZsaW5nZXIgU2FtcGxpbmcgcmF0ZQogICAgIHNwPEF1ZGlvVHJhY2s+IG1wQXVkaW9UcmFjazsgIC8vIFBvaW50ZXIgdG8gYXVkaW8gdHJhY2sgdXNlZCBmb3IgcGxheWJhY2sKQEAgLTMyMSwyNiArMzIxLDI2IEBACiAgICAgICAgICAgICBXQVZFR0VOX1NUT1AgIC8vIFN0b3Agd2F2ZSBvbiB6ZXJvIGNyb3NzaW5nCiAgICAgICAgIH07CiAKLSAgICAgICAgV2F2ZUdlbmVyYXRvcih1aW50MzJfdCBzYW1wbGluZ1JhdGUsIHVuc2lnbmVkIHNob3J0IGZyZXF1ZW5jeSwKKyAgICAgICAgV2F2ZUdlbmVyYXRvcih1aW50MzJfdCBzYW1wbGluZ1JhdGUsIHVpbnQxNl90IGZyZXF1ZW5jeSwKICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUpOwogICAgICAgICB+V2F2ZUdlbmVyYXRvcigpOwogCi0gICAgICAgIHZvaWQgZ2V0U2FtcGxlcyhzaG9ydCAqb3V0QnVmZmVyLCB1bnNpZ25lZCBpbnQgY291bnQsCisgICAgICAgIHZvaWQgZ2V0U2FtcGxlcyhpbnQxNl90ICpvdXRCdWZmZXIsIHVuc2lnbmVkIGludCBjb3VudCwKICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY29tbWFuZCk7CiAKICAgICBwcml2YXRlOgotICAgICAgICBzdGF0aWMgY29uc3Qgc2hvcnQgR0VOX0FNUCA9IDMyMDAwOyAgLy8gYW1wbGl0dWRlIG9mIGdlbmVyYXRvcgotICAgICAgICBzdGF0aWMgY29uc3Qgc2hvcnQgU19RMTQgPSAxNDsgIC8vIHNoaWZ0IGZvciBRMTQKLSAgICAgICAgc3RhdGljIGNvbnN0IHNob3J0IFNfUTE1ID0gMTU7ICAvLyBzaGlmdCBmb3IgUTE1CisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQxNl90IEdFTl9BTVAgPSAzMjAwMDsgIC8vIGFtcGxpdHVkZSBvZiBnZW5lcmF0b3IKKyAgICAgICAgc3RhdGljIGNvbnN0IGludDE2X3QgU19RMTQgPSAxNDsgIC8vIHNoaWZ0IGZvciBRMTQKKyAgICAgICAgc3RhdGljIGNvbnN0IGludDE2X3QgU19RMTUgPSAxNTsgIC8vIHNoaWZ0IGZvciBRMTUKIAotICAgICAgICBzaG9ydCBtQTFfUTE0OyAgLy8gUTE0IGNvZWZmaWNpZW50CisgICAgICAgIGludDE2X3QgbUExX1ExNDsgIC8vIFExNCBjb2VmZmljaWVudAogICAgICAgICAvLyBkZWxheSBsaW5lIG9mIGZ1bGwgYW1wbGl0dWRlIGdlbmVyYXRvcgogICAgICAgICBsb25nIG1TMSwgbVMyOyAgLy8gZGVsYXkgbGluZSBTMiBvbGRlc3QKLSAgICAgICAgc2hvcnQgbVMyXzA7ICAvLyBzYXZlZCB2YWx1ZSBmb3IgcmVpbml0aWFsaXNhdGlvbgotICAgICAgICBzaG9ydCBtQW1wbGl0dWRlX1ExNTsgIC8vIFExNSBhbXBsaXR1ZGUKKyAgICAgICAgaW50MTZfdCBtUzJfMDsgIC8vIHNhdmVkIHZhbHVlIGZvciByZWluaXRpYWxpc2F0aW9uCisgICAgICAgIGludDE2X3QgbUFtcGxpdHVkZV9RMTU7ICAvLyBRMTUgYW1wbGl0dWRlCiAgICAgfTsKIAotICAgIEtleWVkVmVjdG9yPHVuc2lnbmVkIHNob3J0LCBXYXZlR2VuZXJhdG9yICo+IG1XYXZlR2VuczsgIC8vIGxpc3Qgb2YgYWN0aXZlIHdhdmUgZ2VuZXJhdG9ycy4KKyAgICBLZXllZFZlY3Rvcjx1aW50MTZfdCwgV2F2ZUdlbmVyYXRvciAqPiBtV2F2ZUdlbnM7ICAvLyBsaXN0IG9mIGFjdGl2ZSB3YXZlIGdlbmVyYXRvcnMuCiB9OwogCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzRiNDM1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotY2NfbGlicmFyeV9zaGFyZWQgewotICAgIG5hbWU6ICJsaWJhdWRpb2hhbEAyLjAiLAotCi0gICAgc3JjczogWwotICAgICAgICAiRGV2aWNlSGFsTG9jYWwuY3BwIiwKLSAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcCIsCi0gICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcCIsCi0gICAgICAgICJTdHJlYW1IYWxMb2NhbC5jcHAiLAotCi0gICAgICAgICJDb252ZXJzaW9uSGVscGVySGlkbC5jcHAiLAotICAgICAgICAiRGV2aWNlSGFsSGlkbC5jcHAiLAotICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcCIsCi0gICAgICAgICJFZmZlY3RCdWZmZXJIYWxIaWRsLmNwcCIsCi0gICAgICAgICJFZmZlY3RIYWxIaWRsLmNwcCIsCi0gICAgICAgICJFZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwIiwKLSAgICAgICAgIlN0cmVhbUhhbEhpZGwuY3BwIiwKLSAgICBdLAotCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCi0KLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1XYWxsIiwKLSAgICAgICAgIi1XZXJyb3IiLAotICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmF1ZGlvaGFsX2RlYXRoaGFuZGxlciIsCi0gICAgICAgICJsaWJhdWRpb3V0aWxzIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGliaGFyZHdhcmUiLAotICAgICAgICAibGliYmFzZSIsCi0gICAgICAgICJsaWJmbXEiLAotICAgICAgICAibGliaHdiaW5kZXIiLAotICAgICAgICAibGliaGlkbGJhc2UiLAotICAgICAgICAibGliaGlkbG1lbW9yeSIsCi0gICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9AMi4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDIuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAtdXRpbCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEAyLjAiLAotICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAotICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAotICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKLSAgICAgICAgImxpYm1lZGlhdXRpbHMiLAotICAgIF0sCi0gICAgaGVhZGVyX2xpYnM6IFsKLSAgICAgICAgImxpYmF1ZGlvaGFsX2hlYWRlcnMiCi0gICAgXSwKLQotICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKLSAgICAgICAgImxpYmZtcSIsCi0gICAgXSwKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjBiZjhiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2RlZmluZSBMT0dfVEFHICJIYWxIaWRsIgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6UmVzdWx0OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OmtleXNGcm9tSGFsKGNvbnN0IFN0cmluZzgmIGtleXMsIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAqaGlkbEtleXMpIHsKLSAgICBBdWRpb1BhcmFtZXRlciBoYWxLZXlzKGtleXMpOwotICAgIGlmIChoYWxLZXlzLnNpemUoKSA9PSAwKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgIGhpZGxLZXlzLT5yZXNpemUoaGFsS2V5cy5zaXplKCkpOwotICAgIC8vRklYTUU6ICBrZXlTdHJlYW1TdXBwb3J0ZWRDaGFubmVscyBhbmQga2V5U3RyZWFtU3VwcG9ydGVkU2FtcGxpbmdSYXRlcyBjb21lIHdpdGggYQotICAgIC8vICJrZXlGb3JtYXQ9PHZhbHVlPiIgcGFpci4gV2UgbmVlZCB0byB0cmFuc2Zvcm0gaXQgaW50byBhIHNpbmdsZSBrZXkgc3RyaW5nIHNvIHRoYXQgaXQgaXMKLSAgICAvLyBjYXJyaWVkIG92ZXIgdG8gdGhlIGxlZ2FjeSBIQUwgdmlhIEhJREwuCi0gICAgU3RyaW5nOCB2YWx1ZTsKLSAgICBib29sIGtlZXBGb3JtYXRWYWx1ZSA9IGhhbEtleXMuc2l6ZSgpID09IDIgJiYKLSAgICAgICAgIChoYWxLZXlzLmdldChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRDaGFubmVscyksIHZhbHVlKSA9PSBOT19FUlJPUiB8fAotICAgICAgICAgaGFsS2V5cy5nZXQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkU2FtcGxpbmdSYXRlcyksIHZhbHVlKSA9PSBOT19FUlJPUik7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhhbEtleXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgU3RyaW5nOCBrZXk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGhhbEtleXMuZ2V0QXQoaSwga2V5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgaWYgKGtlZXBGb3JtYXRWYWx1ZSAmJiBrZXkgPT0gQXVkaW9QYXJhbWV0ZXI6OmtleUZvcm1hdCkgewotICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgZm9ybWF0UGFyYW07Ci0gICAgICAgICAgICBoYWxLZXlzLmdldEF0KGksIGtleSwgdmFsdWUpOwotICAgICAgICAgICAgZm9ybWF0UGFyYW0uYWRkKGtleSwgdmFsdWUpOwotICAgICAgICAgICAga2V5ID0gZm9ybWF0UGFyYW0udG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICAoKmhpZGxLZXlzKVtpXSA9IGtleS5zdHJpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IENvbnZlcnNpb25IZWxwZXJIaWRsOjpwYXJhbWV0ZXJzRnJvbUhhbCgKLSAgICAgICAgY29uc3QgU3RyaW5nOCYga3ZQYWlycywgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+ICpoaWRsUGFyYW1zKSB7Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW1zKGt2UGFpcnMpOwotICAgIGlmIChwYXJhbXMuc2l6ZSgpID09IDApIHJldHVybiBCQURfVkFMVUU7Ci0gICAgaGlkbFBhcmFtcy0+cmVzaXplKHBhcmFtcy5zaXplKCkpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFyYW1zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFN0cmluZzgga2V5LCB2YWx1ZTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyYW1zLmdldEF0KGksIGtleSwgdmFsdWUpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgICAgICAoKmhpZGxQYXJhbXMpW2ldLmtleSA9IGtleS5zdHJpbmcoKTsKLSAgICAgICAgKCpoaWRsUGFyYW1zKVtpXS52YWx1ZSA9IHZhbHVlLnN0cmluZygpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDb252ZXJzaW9uSGVscGVySGlkbDo6cGFyYW1ldGVyc1RvSGFsKAotICAgICAgICBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMsIFN0cmluZzggKnZhbHVlcykgewotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtczsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhcmFtZXRlcnMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgcGFyYW1zLmFkZChTdHJpbmc4KHBhcmFtZXRlcnNbaV0ua2V5LmNfc3RyKCkpLCBTdHJpbmc4KHBhcmFtZXRlcnNbaV0udmFsdWUuY19zdHIoKSkpOwotICAgIH0KLSAgICB2YWx1ZXMtPnNldFRvKHBhcmFtcy50b1N0cmluZygpKTsKLX0KLQotQ29udmVyc2lvbkhlbHBlckhpZGw6OkNvbnZlcnNpb25IZWxwZXJIaWRsKGNvbnN0IGNoYXIqIGNsYXNzTmFtZSkKLSAgICAgICAgOiBtQ2xhc3NOYW1lKGNsYXNzTmFtZSkgewotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IENvbnZlcnNpb25IZWxwZXJIaWRsOjphbmFseXplUmVzdWx0KGNvbnN0IFJlc3VsdCYgcmVzdWx0KSB7Ci0gICAgc3dpdGNoIChyZXN1bHQpIHsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok9LOiByZXR1cm4gT0s7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUzogcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfU1RBVEU6IHJldHVybiBOT1RfRU5PVUdIX0RBVEE7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ6IHJldHVybiBOT19JTklUOwotICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX1NVUFBPUlRFRDogcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICBkZWZhdWx0OiByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci19Ci0KLXZvaWQgQ29udmVyc2lvbkhlbHBlckhpZGw6OmVtaXRFcnJvcihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgY2hhciogZGVzY3JpcHRpb24pIHsKLSAgICBBTE9HRSgiJXMgJXAgJXM6ICVzIChmcm9tIHJwYykiLCBtQ2xhc3NOYW1lLCB0aGlzLCBmdW5jTmFtZSwgZGVzY3JpcHRpb24pOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQ29udmVyc2lvbkhlbHBlckhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM1NmYzNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQ29udmVyc2lvbkhlbHBlckhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfQ09OVkVSU0lPTl9IRUxQRVJfSElETF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfQ09OVkVSU0lPTl9IRUxQRVJfSElETF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC90eXBlcy5oPgotI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpQYXJhbWV0ZXJWYWx1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgQ29udmVyc2lvbkhlbHBlckhpZGwgewotICBwcm90ZWN0ZWQ6Ci0gICAgc3RhdGljIHN0YXR1c190IGtleXNGcm9tSGFsKGNvbnN0IFN0cmluZzgmIGtleXMsIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAqaGlkbEtleXMpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBwYXJhbWV0ZXJzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrdlBhaXJzLCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gKmhpZGxQYXJhbXMpOwotICAgIHN0YXRpYyB2b2lkIHBhcmFtZXRlcnNUb0hhbChjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMsIFN0cmluZzggKnZhbHVlcyk7Ci0KLSAgICBDb252ZXJzaW9uSGVscGVySGlkbChjb25zdCBjaGFyKiBjbGFzc05hbWUpOwotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVD4KLSAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48Uj4mIHJldCwgVCAqcmV0dmFsKSB7Ci0gICAgICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIHdheSBpdCBhbHNvIHdvcmtzIGZvciBlbnVtIGNsYXNzIHRvIHVuc2NvcGVkIGVudW0gY29udmVyc2lvbi4KLSAgICAgICAgICAgICpyZXR2YWwgPSBzdGF0aWNfY2FzdDxUPihzdGF0aWNfY2FzdDxSPihyZXQpKTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybihmdW5jTmFtZSwgcmV0KTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxUPiYgcmV0KSB7Ci0gICAgICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IE9LIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgIH0KLQotICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlJlc3VsdD4mIHJldCkgewotICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgICAgIGVtaXRFcnJvcihmdW5jTmFtZSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKAotICAgICAgICAgICAgY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxUPiYgcmV0LCBoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlJlc3VsdCByZXR2YWwpIHsKLSAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgICBlbWl0RXJyb3IoZnVuY05hbWUsIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXR2YWwpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIGNvbnN0IGNoYXIqIG1DbGFzc05hbWU7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgYW5hbHl6ZVJlc3VsdChjb25zdCBoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlJlc3VsdCYgcmVzdWx0KTsKLQotICAgIHZvaWQgZW1pdEVycm9yKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI5OWQ3MC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZUhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JUHJpbWFyeURldmljZS5oPgotI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+Ci0jaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKLSNpbmNsdWRlICJIaWRsVXRpbHMuaCIKLSNpbmNsdWRlICJTdHJlYW1IYWxIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvQ29uZmlnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9EZXZpY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0lucHV0RmxhZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvT3V0cHV0RmxhZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvUGF0Y2hIYW5kbGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb1BvcnQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb1BvcnRDb25maWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb01vZGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb1NvdXJjZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkhpZGxVdGlsczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpEZXZpY2VBZGRyZXNzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklQcmltYXJ5RGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlBhcmFtZXRlclZhbHVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotbmFtZXNwYWNlIHsKLQotc3RhdHVzX3QgZGV2aWNlQWRkcmVzc0Zyb21IYWwoCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGNvbnN0IGNoYXIqIGhhbEFkZHJlc3MsIERldmljZUFkZHJlc3MqIGFkZHJlc3MpIHsKLSAgICBhZGRyZXNzLT5kZXZpY2UgPSBBdWRpb0RldmljZShkZXZpY2UpOwotCi0gICAgaWYgKGhhbEFkZHJlc3MgPT0gbnVsbHB0ciB8fCBzdHJubGVuKGhhbEFkZHJlc3MsIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pID09IDApIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICBjb25zdCBib29sIGlzSW5wdXQgPSAoZGV2aWNlICYgQVVESU9fREVWSUNFX0JJVF9JTikgIT0gMDsKLSAgICBpZiAoaXNJbnB1dCkgZGV2aWNlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOwotICAgIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApICE9IDApCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSAhPSAwKSkgewotICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCi0gICAgICAgICAgICAgICAgIiVoaFg6JWhoWDolaGhYOiVoaFg6JWhoWDolaGhYIiwKLSAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMF0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1sxXSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzJdLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLm1hY1szXSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzRdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbNV0pOwotICAgICAgICByZXR1cm4gc3RhdHVzID09IDYgPyBPSyA6IEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9JUCkgIT0gMCkKLSAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fSVApICE9IDApKSB7Ci0gICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKLSAgICAgICAgICAgICAgICAiJWhodS4laGh1LiVoaHUuJWhodSIsCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFswXSwgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFsxXSwKLSAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzJdLCAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzNdKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSA0ID8gT0sgOiBCQURfVkFMVUU7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX1VTQikpICE9IDAKLSAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQUxMX1VTQikpICE9IDApIHsKLSAgICAgICAgaW50IHN0YXR1cyA9IHNzY2FuZihoYWxBZGRyZXNzLAotICAgICAgICAgICAgICAgICJjYXJkPSVkO2RldmljZT0lZCIsCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuYWxzYS5jYXJkLCAmYWRkcmVzcy0+YWRkcmVzcy5hbHNhLmRldmljZSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXMgPT0gMiA/IE9LIDogQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0JVUykgIT0gMCkKLSAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQlVTKSAhPSAwKSkgewotICAgICAgICBpZiAoaGFsQWRkcmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBhZGRyZXNzLT5idXNBZGRyZXNzID0gaGFsQWRkcmVzczsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgpKSAhPSAwCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpICE9IDApKSB7Ci0gICAgICAgIGlmIChoYWxBZGRyZXNzICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGFkZHJlc3MtPnJTdWJtaXhBZGRyZXNzID0gaGFsQWRkcmVzczsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1EZXZpY2VIYWxIaWRsOjpEZXZpY2VIYWxIaWRsKGNvbnN0IHNwPElEZXZpY2U+JiBkZXZpY2UpCi0gICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIkRldmljZSIpLCBtRGV2aWNlKGRldmljZSksCi0gICAgICAgICAgbVByaW1hcnlEZXZpY2UoSVByaW1hcnlEZXZpY2U6OmNhc3RGcm9tKGRldmljZSkpIHsKLX0KLQotRGV2aWNlSGFsSGlkbDo6fkRldmljZUhhbEhpZGwoKSB7Ci0gICAgaWYgKG1EZXZpY2UgIT0gMCkgewotICAgICAgICBtRGV2aWNlLmNsZWFyKCk7Ci0gICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90KikgewotICAgIC8vIE9ic29sZXRlLgotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6aW5pdENoZWNrKCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJpbml0Q2hlY2siLCBtRGV2aWNlLT5pbml0Q2hlY2soKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFZvaWNlVm9sdW1lIiwgbVByaW1hcnlEZXZpY2UtPnNldFZvaWNlVm9sdW1lKHZvbHVtZSkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyVm9sdW1lIiwgbVByaW1hcnlEZXZpY2UtPnNldE1hc3RlclZvbHVtZSh2b2x1bWUpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1QcmltYXJ5RGV2aWNlLT5nZXRNYXN0ZXJWb2x1bWUoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGZsb2F0IHYpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqdm9sdW1lID0gdjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TWFzdGVyVm9sdW1lIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TW9kZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRNb2RlKEF1ZGlvTW9kZShtb2RlKSkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNaWNNdXRlKGJvb2wgc3RhdGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWljTXV0ZSIsIG1EZXZpY2UtPnNldE1pY011dGUoc3RhdGUpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWljTXV0ZShib29sICpzdGF0ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1pY011dGUoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGJvb2wgbXV0ZSkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpzdGF0ZSA9IG11dGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1pY011dGUiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNYXN0ZXJNdXRlIiwgbURldmljZS0+c2V0TWFzdGVyTXV0ZShzdGF0ZSkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0TWFzdGVyTXV0ZSgKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgYm9vbCBtdXRlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnN0YXRlID0gbXV0ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TWFzdGVyTXV0ZSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGhpZGxQYXJhbXM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyYW1ldGVyc0Zyb21IYWwoa3ZQYWlycywgJmhpZGxQYXJhbXMpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFBhcmFtZXRlcnMiLCBtRGV2aWNlLT5zZXRQYXJhbWV0ZXJzKGhpZGxQYXJhbXMpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKLSAgICB2YWx1ZXMtPmNsZWFyKCk7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGhpZGxLZXlzOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGtleXNGcm9tSGFsKGtleXMsICZoaWRsS2V5cyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRQYXJhbWV0ZXJzKAotICAgICAgICAgICAgaGlkbEtleXMsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNUb0hhbChwYXJhbWV0ZXJzLCB2YWx1ZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRQYXJhbWV0ZXJzIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRJbnB1dEJ1ZmZlclNpemUoCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywgc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0SW5wdXRCdWZmZXJTaXplKAotICAgICAgICAgICAgaGlkbENvbmZpZywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgYnVmZmVyU2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihidWZmZXJTaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0SW5wdXRCdWZmZXJTaXplIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBEZXZpY2VBZGRyZXNzIGhpZGxEZXZpY2U7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlQWRkcmVzc0Zyb21IYWwoZGV2aWNlcywgYWRkcmVzcywgJmhpZGxEZXZpY2UpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5vcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICAgICAgaGFuZGxlLAotICAgICAgICAgICAgaGlkbERldmljZSwKLSAgICAgICAgICAgIGhpZGxDb25maWcsCi0gICAgICAgICAgICBBdWRpb091dHB1dEZsYWcoZmxhZ3MpLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJU3RyZWFtT3V0PiYgcmVzdWx0LCBjb25zdCBBdWRpb0NvbmZpZyYgc3VnZ2VzdGVkQ29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKm91dFN0cmVhbSA9IG5ldyBTdHJlYW1PdXRIYWxIaWRsKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdUb0hhbChzdWdnZXN0ZWRDb25maWcsIGNvbmZpZyk7Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigib3Blbk91dHB1dFN0cmVhbSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6b3BlbklucHV0U3RyZWFtKAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIERldmljZUFkZHJlc3MgaGlkbERldmljZTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXZpY2VBZGRyZXNzRnJvbUhhbChkZXZpY2VzLCBhZGRyZXNzLCAmaGlkbERldmljZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICBBdWRpb0NvbmZpZyBoaWRsQ29uZmlnOwotICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPm9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgICAgIGhhbmRsZSwKLSAgICAgICAgICAgIGhpZGxEZXZpY2UsCi0gICAgICAgICAgICBoaWRsQ29uZmlnLAotICAgICAgICAgICAgQXVkaW9JbnB1dEZsYWcoZmxhZ3MpLAotICAgICAgICAgICAgQXVkaW9Tb3VyY2Uoc291cmNlKSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVN0cmVhbUluPiYgcmVzdWx0LCBjb25zdCBBdWRpb0NvbmZpZyYgc3VnZ2VzdGVkQ29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKmluU3RyZWFtID0gbmV3IFN0cmVhbUluSGFsSGlkbChyZXN1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnVG9IYWwoc3VnZ2VzdGVkQ29uZmlnLCBjb25maWcpOwotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oIm9wZW5JbnB1dFN0cmVhbSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzQXVkaW9QYXRjaGVzIiwgbURldmljZS0+c3VwcG9ydHNBdWRpb1BhdGNoZXMoKSwgc3VwcG9ydHNQYXRjaGVzKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Y3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCi0gICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPEF1ZGlvUG9ydENvbmZpZz4gaGlkbFNvdXJjZXMsIGhpZGxTaW5rczsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ3NGcm9tSGFsKG51bV9zb3VyY2VzLCBzb3VyY2VzLCAmaGlkbFNvdXJjZXMpOwotICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0Q29uZmlnc0Zyb21IYWwobnVtX3NpbmtzLCBzaW5rcywgJmhpZGxTaW5rcyk7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Y3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgICAgIGhpZGxTb3VyY2VzLCBoaWRsU2lua3MsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIEF1ZGlvUGF0Y2hIYW5kbGUgaGlkbFBhdGNoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnBhdGNoID0gc3RhdGljX2Nhc3Q8YXVkaW9fcGF0Y2hfaGFuZGxlX3Q+KGhpZGxQYXRjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImNyZWF0ZUF1ZGlvUGF0Y2giLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInJlbGVhc2VBdWRpb1BhdGNoIiwgbURldmljZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2gpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgQXVkaW9Qb3J0IGhpZGxQb3J0OwotICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0RnJvbUhhbCgqcG9ydCwgJmhpZGxQb3J0KTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRBdWRpb1BvcnQoCi0gICAgICAgICAgICBoaWRsUG9ydCwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgQXVkaW9Qb3J0JiBwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb1BvcnRUb0hhbChwLCBwb3J0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QXVkaW9Qb3J0IiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBBdWRpb1BvcnRDb25maWcgaGlkbENvbmZpZzsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRBdWRpb1BvcnRDb25maWciLCBtRGV2aWNlLT5zZXRBdWRpb1BvcnRDb25maWcoaGlkbENvbmZpZykpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNaWNyb3Bob25lcygKLSAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXNJbmZvIF9fdW51c2VkKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpkdW1wKGludCBmZCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOwotICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+ZGVidWdEdW1wKGhpZGxIYW5kbGUpOwotICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhpZGxIYW5kbGUpOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJkdW1wIiwgcmV0KTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMWNiNTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbEhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lEZXZpY2UuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JUHJpbWFyeURldmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklEZXZpY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVByaW1hcnlEZXZpY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGV2aWNlSGFsSGlkbCA6IHB1YmxpYyBEZXZpY2VIYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAotewotICBwdWJsaWM6Ci0gICAgLy8gU2V0cyB0aGUgdmFsdWUgb2YgJ2RldmljZXMnIHRvIGEgYml0bWFzayBvZiAxIG9yIG1vcmUgdmFsdWVzIG9mIGF1ZGlvX2RldmljZXNfdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpOwotCi0gICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIG9mIGEgdm9pY2UgY2FsbC4gUmFuZ2UgaXMgYmV0d2VlbiAwLjAgYW5kIDEuMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSk7Ci0KLSAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBmb3IgYWxsIGF1ZGlvIGFjdGl2aXRpZXMgb3RoZXIgdGhhbiB2b2ljZSBjYWxsLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSk7Ci0KLSAgICAvLyBHZXQgdGhlIGN1cnJlbnQgbWFzdGVyIHZvbHVtZSB2YWx1ZSBmb3IgdGhlIEhBTC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBhdWRpbyBtb2RlIGNoYW5nZXMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKTsKLQotICAgIC8vIE11dGluZyBjb250cm9sLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWljTXV0ZShib29sIHN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY011dGUoYm9vbCAqc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpOwotCi0gICAgLy8gU2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKLQotICAgIC8vIEdldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKLQotICAgIC8vIFJldHVybnMgYXVkaW8gaW5wdXQgYnVmZmVyIHNpemUgYWNjb3JkaW5nIHRvIHBhcmFtZXRlcnMgcGFzc2VkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJTaXplKGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKLSAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAotICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbklucHV0U3RyZWFtKAotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIGNyZWF0ZUF1ZGlvUGF0Y2ggYW5kIHJlbGVhc2VBdWRpb1BhdGNoIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcyk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAotICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCi0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpOwotCi0gICAgLy8gUmVsZWFzZXMgYW4gYXVkaW8gcGF0Y2guCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCk7Ci0KLSAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKLQotICAgIC8vIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOwotCi0gICAgLy8gTGlzdCBtaWNyb3Bob25lcwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOwotICAgIHNwPElEZXZpY2U+IG1EZXZpY2U7Ci0gICAgc3A8SVByaW1hcnlEZXZpY2U+IG1QcmltYXJ5RGV2aWNlOyAgLy8gTnVsbCBpZiBpdCdzIG5vdCBhIHByaW1hcnkgZGV2aWNlLgotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIGV4cGxpY2l0IERldmljZUhhbEhpZGwoY29uc3Qgc3A8SURldmljZT4mIGRldmljZSk7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgZGV2aWNlLgotICAgIHZpcnR1YWwgfkRldmljZUhhbEhpZGwoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsTG9jYWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzNiZjc4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxMb2NhbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlSGFsTG9jYWwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCi0jaW5jbHVkZSAiU3RyZWFtSGFsTG9jYWwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1EZXZpY2VIYWxMb2NhbDo6RGV2aWNlSGFsTG9jYWwoYXVkaW9faHdfZGV2aWNlX3QgKmRldikKLSAgICAgICAgOiBtRGV2KGRldikgewotfQotCi1EZXZpY2VIYWxMb2NhbDo6fkRldmljZUhhbExvY2FsKCkgewotICAgIGludCBzdGF0dXMgPSBhdWRpb19od19kZXZpY2VfY2xvc2UobURldik7Ci0gICAgQUxPR1dfSUYoc3RhdHVzLCAiRXJyb3IgY2xvc2luZyBhdWRpbyBodyBkZXZpY2UgJXA6ICVzIiwgbURldiwgc3RyZXJyb3IoLXN0YXR1cykpOwotICAgIG1EZXYgPSAwOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCAqZGV2aWNlcykgewotICAgIGlmIChtRGV2LT5nZXRfc3VwcG9ydGVkX2RldmljZXMgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICpkZXZpY2VzID0gbURldi0+Z2V0X3N1cHBvcnRlZF9kZXZpY2VzKG1EZXYpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmluaXRDaGVjaygpIHsKLSAgICByZXR1cm4gbURldi0+aW5pdF9jaGVjayhtRGV2KTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIHJldHVybiBtRGV2LT5zZXRfdm9pY2Vfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKSB7Ci0gICAgaWYgKG1EZXYtPnNldF9tYXN0ZXJfdm9sdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbURldi0+c2V0X21hc3Rlcl92b2x1bWUobURldiwgdm9sdW1lKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKSB7Ci0gICAgaWYgKG1EZXYtPmdldF9tYXN0ZXJfdm9sdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbURldi0+Z2V0X21hc3Rlcl92b2x1bWUobURldiwgdm9sdW1lKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpIHsKLSAgICByZXR1cm4gbURldi0+c2V0X21vZGUobURldiwgbW9kZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNaWNNdXRlKGJvb2wgc3RhdGUpIHsKLSAgICByZXR1cm4gbURldi0+c2V0X21pY19tdXRlKG1EZXYsIHN0YXRlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1pY011dGUoYm9vbCAqc3RhdGUpIHsKLSAgICByZXR1cm4gbURldi0+Z2V0X21pY19tdXRlKG1EZXYsIHN0YXRlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSkgewotICAgIGlmIChtRGV2LT5zZXRfbWFzdGVyX211dGUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtRGV2LT5zZXRfbWFzdGVyX211dGUobURldiwgc3RhdGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSkgewotICAgIGlmIChtRGV2LT5nZXRfbWFzdGVyX211dGUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtRGV2LT5nZXRfbWFzdGVyX211dGUobURldiwgc3RhdGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9wYXJhbWV0ZXJzKG1EZXYsIGt2UGFpcnMuc3RyaW5nKCkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKLSAgICBjaGFyICpoYWxWYWx1ZXMgPSBtRGV2LT5nZXRfcGFyYW1ldGVycyhtRGV2LCBrZXlzLnN0cmluZygpKTsKLSAgICBpZiAoaGFsVmFsdWVzICE9IE5VTEwpIHsKLSAgICAgICAgdmFsdWVzLT5zZXRUbyhoYWxWYWx1ZXMpOwotICAgICAgICBmcmVlKGhhbFZhbHVlcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdmFsdWVzLT5jbGVhcigpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRJbnB1dEJ1ZmZlclNpemUoCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywgc2l6ZV90ICpzaXplKSB7Ci0gICAgKnNpemUgPSBtRGV2LT5nZXRfaW5wdXRfYnVmZmVyX3NpemUobURldiwgY29uZmlnKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pIHsKLSAgICBhdWRpb19zdHJlYW1fb3V0X3QgKmhhbFN0cmVhbTsKLSAgICBBTE9HVigib3Blbl9vdXRwdXRfc3RyZWFtIGhhbmRsZTogJWQgZGV2aWNlczogJXggZmxhZ3M6ICUjeCIKLSAgICAgICAgICAgICJzcmF0ZTogJWQgZm9ybWF0ICUjeCBjaGFubmVscyAleCBhZGRyZXNzICVzIiwKLSAgICAgICAgICAgIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsCi0gICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssCi0gICAgICAgICAgICBhZGRyZXNzKTsKLSAgICBpbnQgb3BlblJlc3V0ID0gbURldi0+b3Blbl9vdXRwdXRfc3RyZWFtKAotICAgICAgICAgICAgbURldiwgaGFuZGxlLCBkZXZpY2VzLCBmbGFncywgY29uZmlnLCAmaGFsU3RyZWFtLCBhZGRyZXNzKTsKLSAgICBpZiAob3BlblJlc3V0ID09IE9LKSB7Ci0gICAgICAgICpvdXRTdHJlYW0gPSBuZXcgU3RyZWFtT3V0SGFsTG9jYWwoaGFsU3RyZWFtLCB0aGlzKTsKLSAgICB9Ci0gICAgQUxPR1YoIm9wZW5fb3V0cHV0X3N0cmVhbSBzdGF0dXMgJWQgc3RyZWFtICVwIiwgb3BlblJlc3V0LCBoYWxTdHJlYW0pOwotICAgIHJldHVybiBvcGVuUmVzdXQ7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpvcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKSB7Ci0gICAgYXVkaW9fc3RyZWFtX2luX3QgKmhhbFN0cmVhbTsKLSAgICBBTE9HVigib3Blbl9pbnB1dF9zdHJlYW0gaGFuZGxlOiAlZCBkZXZpY2VzOiAleCBmbGFnczogJSN4ICIKLSAgICAgICAgICAgICJzcmF0ZTogJWQgZm9ybWF0ICUjeCBjaGFubmVscyAleCBhZGRyZXNzICVzIHNvdXJjZSAlZCIsCi0gICAgICAgICAgICBoYW5kbGUsIGRldmljZXMsIGZsYWdzLAotICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgYWRkcmVzcywgc291cmNlKTsKLSAgICBpbnQgb3BlblJlc3VsdCA9IG1EZXYtPm9wZW5faW5wdXRfc3RyZWFtKAotICAgICAgICAgICAgbURldiwgaGFuZGxlLCBkZXZpY2VzLCBjb25maWcsICZoYWxTdHJlYW0sIGZsYWdzLCBhZGRyZXNzLCBzb3VyY2UpOwotICAgIGlmIChvcGVuUmVzdWx0ID09IE9LKSB7Ci0gICAgICAgICppblN0cmVhbSA9IG5ldyBTdHJlYW1JbkhhbExvY2FsKGhhbFN0cmVhbSwgdGhpcyk7Ci0gICAgfQotICAgIEFMT0dWKCJvcGVuX2lucHV0X3N0cmVhbSBzdGF0dXMgJWQgc3RyZWFtICVwIiwgb3BlblJlc3VsdCwgaW5TdHJlYW0pOwotICAgIHJldHVybiBvcGVuUmVzdWx0OwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKSB7Ci0gICAgKnN1cHBvcnRzUGF0Y2hlcyA9IHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmNyZWF0ZUF1ZGlvUGF0Y2goCi0gICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpIHsKLSAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKLSAgICAgICAgcmV0dXJuIG1EZXYtPmNyZWF0ZV9hdWRpb19wYXRjaCgKLSAgICAgICAgICAgICAgICBtRGV2LCBudW1fc291cmNlcywgc291cmNlcywgbnVtX3NpbmtzLCBzaW5rcywgcGF0Y2gpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCkgewotICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgewotICAgICAgICByZXR1cm4gbURldi0+cmVsZWFzZV9hdWRpb19wYXRjaChtRGV2LCBwYXRjaCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgewotICAgIHJldHVybiBtRGV2LT5nZXRfYXVkaW9fcG9ydChtRGV2LCBwb3J0KTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgewotICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkKLSAgICAgICAgcmV0dXJuIG1EZXYtPnNldF9hdWRpb19wb3J0X2NvbmZpZyhtRGV2LCBjb25maWcpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWljcm9waG9uZXMoCi0gICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzIF9fdW51c2VkKSB7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6ZHVtcChpbnQgZmQpIHsKLSAgICByZXR1cm4gbURldi0+ZHVtcChtRGV2LCBmZCk7Ci19Ci0KLXZvaWQgRGV2aWNlSGFsTG9jYWw6OmNsb3NlT3V0cHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0ICpzdHJlYW1fb3V0KSB7Ci0gICAgbURldi0+Y2xvc2Vfb3V0cHV0X3N0cmVhbShtRGV2LCBzdHJlYW1fb3V0KTsKLX0KLQotdm9pZCBEZXZpY2VIYWxMb2NhbDo6Y2xvc2VJbnB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luICpzdHJlYW1faW4pIHsKLSAgICBtRGV2LT5jbG9zZV9pbnB1dF9zdHJlYW0obURldiwgc3RyZWFtX2luKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsTG9jYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVjMjAxYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsTG9jYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfTE9DQUxfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfTE9DQUxfSAotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEZXZpY2VIYWxMb2NhbCA6IHB1YmxpYyBEZXZpY2VIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIFNldHMgdGhlIHZhbHVlIG9mICdkZXZpY2VzJyB0byBhIGJpdG1hc2sgb2YgMSBvciBtb3JlIHZhbHVlcyBvZiBhdWRpb19kZXZpY2VzX3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKTsKLQotICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIGhhcyBiZWVuIGluaXRpYWxpemVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7Ci0KLSAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBvZiBhIHZvaWNlIGNhbGwuIFJhbmdlIGlzIGJldHdlZW4gMC4wIGFuZCAxLjAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgZm9yIGFsbCBhdWRpbyBhY3Rpdml0aWVzIG90aGVyIHRoYW4gdm9pY2UgY2FsbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gR2V0IHRoZSBjdXJyZW50IG1hc3RlciB2b2x1bWUgdmFsdWUgZm9yIHRoZSBIQUwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgYXVkaW8gbW9kZSBjaGFuZ2VzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSk7Ci0KLSAgICAvLyBNdXRpbmcgY29udHJvbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY011dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKTsKLQotICAgIC8vIFNldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7Ci0KLSAgICAvLyBHZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7Ci0KLSAgICAvLyBSZXR1cm5zIGF1ZGlvIGlucHV0IGJ1ZmZlciBzaXplIGFjY29yZGluZyB0byBwYXJhbWV0ZXJzIHBhc3NlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBzaXplX3QgKnNpemUpOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKLSAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBjcmVhdGVBdWRpb1BhdGNoIGFuZCByZWxlYXNlQXVkaW9QYXRjaCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpOwotCi0gICAgLy8gQ3JlYXRlcyBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKTsKLQotICAgIC8vIFJlbGVhc2VzIGFuIGF1ZGlvIHBhdGNoLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpOwotCi0gICAgLy8gRmlsbHMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7Ci0KLSAgICAvLyBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKLQotICAgIC8vIExpc3QgbWljcm9waG9uZXMKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gICAgdm9pZCBjbG9zZU91dHB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCAqc3RyZWFtX291dCk7Ci0gICAgdm9pZCBjbG9zZUlucHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1faW4gKnN0cmVhbV9pbik7Ci0KLSAgcHJpdmF0ZToKLSAgICBhdWRpb19od19kZXZpY2VfdCAqbURldjsKLQotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbExvY2FsOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIGV4cGxpY2l0IERldmljZUhhbExvY2FsKGF1ZGlvX2h3X2RldmljZV90ICpkZXYpOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIGRldmljZS4KLSAgICB2aXJ0dWFsIH5EZXZpY2VIYWxMb2NhbCgpOwotCi0gICAgdWludDMyX3QgdmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1EZXYtPmNvbW1vbi52ZXJzaW9uOyB9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfTE9DQUxfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIzMzU5Mi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSURldmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL2hpZGwvSGFsRGVhdGhIYW5kbGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklEZXZpY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLURldmljZXNGYWN0b3J5SGFsSGlkbDo6RGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCkgewotICAgIG1EZXZpY2VzRmFjdG9yeSA9IElEZXZpY2VzRmFjdG9yeTo6Z2V0U2VydmljZSgpOwotICAgIGlmIChtRGV2aWNlc0ZhY3RvcnkgIT0gMCkgewotICAgICAgICAvLyBJdCBpcyBhc3N1bWVkIHRoYXQgRGV2aWNlc0ZhY3RvcnkgaXMgb3duZWQgYnkgQXVkaW9GbGluZ2VyCi0gICAgICAgIC8vIGFuZCB0aHVzIGhhdmUgdGhlIHNhbWUgbGlmZXNwYW4uCi0gICAgICAgIG1EZXZpY2VzRmFjdG9yeS0+bGlua1RvRGVhdGgoSGFsRGVhdGhIYW5kbGVyOjpnZXRJbnN0YW5jZSgpLCAwIC8qY29va2llKi8pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb2J0YWluIElEZXZpY2VzRmFjdG9yeSBzZXJ2aWNlLCB0ZXJtaW5hdGluZyBwcm9jZXNzLiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgICAvLyBUaGUgTVNEIGZhY3RvcnkgaXMgb3B0aW9uYWwKLSAgICBtRGV2aWNlc0ZhY3RvcnlNc2QgPSBJRGV2aWNlc0ZhY3Rvcnk6OmdldFNlcnZpY2UoQVVESU9fSEFMX1NFUlZJQ0VfTkFNRV9NU0QpOwotICAgIC8vIFRPRE86IFJlZ2lzdGVyIGRlYXRoIGhhbmRsZXIsIGFuZCBhZGQgJ3Jlc3RhcnQnIGRpcmVjdGl2ZSB0byBhdWRpb3NlcnZlci5yYwotfQotCi1EZXZpY2VzRmFjdG9yeUhhbEhpZGw6On5EZXZpY2VzRmFjdG9yeUhhbEhpZGwoKSB7Ci19Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjpuYW1lRnJvbUhhbChjb25zdCBjaGFyICpuYW1lLCBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZSAqZGV2aWNlKSB7Ci0gICAgaWYgKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSkgPT0gMCkgewotICAgICAgICAqZGV2aWNlID0gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OlBSSU1BUlk7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9BMkRQKSA9PSAwKSB7Ci0gICAgICAgICpkZXZpY2UgPSBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6QTJEUDsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSBpZihzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1VTQikgPT0gMCkgewotICAgICAgICAqZGV2aWNlID0gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OlVTQjsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSBpZihzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1JFTU9URV9TVUJNSVgpID09IDApIHsKLSAgICAgICAgKmRldmljZSA9IElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpSX1NVQk1JWDsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSBpZihzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1NUVUIpID09IDApIHsKLSAgICAgICAgKmRldmljZSA9IElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpTVFVCOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotICAgIEFMT0dFKCJJbnZhbGlkIGRldmljZSBuYW1lICVzIiwgbmFtZSk7Ci0gICAgcmV0dXJuIEJBRF9WQUxVRTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjpvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSkgewotICAgIGlmIChtRGV2aWNlc0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgSURldmljZXNGYWN0b3J5OjpEZXZpY2UgaGlkbERldmljZTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBuYW1lRnJvbUhhbChuYW1lLCAmaGlkbERldmljZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2VzRmFjdG9yeS0+b3BlbkRldmljZSgKLSAgICAgICAgICAgIGhpZGxEZXZpY2UsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElEZXZpY2U+JiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqZGV2aWNlID0gbmV3IERldmljZUhhbEhpZGwocmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHJldHVybiBPSzsKLSAgICAgICAgZWxzZSBpZiAocmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFMpIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc0ODg0OS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9ISURMX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lEZXZpY2VzRmFjdG9yeS5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SURldmljZXNGYWN0b3J5OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERldmljZXNGYWN0b3J5SGFsSGlkbCA6IHB1YmxpYyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gT3BlbnMgYSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRvIGNsb3NlIHRoZSBkZXZpY2UsIGl0IGlzCi0gICAgLy8gbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSHlicmlkOwotCi0gICAgc3A8SURldmljZXNGYWN0b3J5PiBtRGV2aWNlc0ZhY3Rvcnk7Ci0gICAgc3A8SURldmljZXNGYWN0b3J5PiBtRGV2aWNlc0ZhY3RvcnlNc2Q7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgbmFtZUZyb21IYWwoY29uc3QgY2hhciAqbmFtZSwgSURldmljZXNGYWN0b3J5OjpEZXZpY2UgKmRldmljZSk7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCk7Ci0KLSAgICB2aXJ0dWFsIH5EZXZpY2VzRmFjdG9yeUhhbEhpZGwoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzRiZTc0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSHlicmlkLmgiCi0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oIgotI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLURldmljZXNGYWN0b3J5SGFsSHlicmlkOjpEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpCi0gICAgICAgIDogbUxvY2FsRmFjdG9yeShuZXcgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCgpKSwKLSAgICAgICAgICBtSGlkbEZhY3RvcnkobmV3IERldmljZXNGYWN0b3J5SGFsSGlkbCgpKSB7Ci19Ci0KLURldmljZXNGYWN0b3J5SGFsSHlicmlkOjp+RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKSB7Ci19Ci0KLXN0YXR1c190IERldmljZXNGYWN0b3J5SGFsSHlicmlkOjpvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSkgewotICAgIGlmIChtSGlkbEZhY3RvcnkgIT0gMCAmJiBzdHJjbXAoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0EyRFAsIG5hbWUpICE9IDAgJiYKLSAgICAgICAgc3RyY21wKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9IRUFSSU5HX0FJRCwgbmFtZSkgIT0gMCkgewotICAgICAgICByZXR1cm4gbUhpZGxGYWN0b3J5LT5vcGVuRGV2aWNlKG5hbWUsIGRldmljZSk7Ci0gICAgfQotICAgIHJldHVybiBtTG9jYWxGYWN0b3J5LT5vcGVuRGV2aWNlKG5hbWUsIGRldmljZSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDU3ZDYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSFlCUklEX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hZQlJJRF9ICi0KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCA6IHB1YmxpYyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gT3BlbnMgYSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRvIGNsb3NlIHRoZSBkZXZpY2UsIGl0IGlzCi0gICAgLy8gbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIERldmljZXNGYWN0b3J5SGFsSHlicmlkKCk7Ci0KLSAgICB2aXJ0dWFsIH5EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpOwotCi0gICAgc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IG1Mb2NhbEZhY3Rvcnk7Ci0gICAgc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IG1IaWRsRmFjdG9yeTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2E5YWNkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgc3RhdHVzX3QgbG9hZF9hdWRpb19pbnRlcmZhY2UoY29uc3QgY2hhciAqaWZfbmFtZSwgYXVkaW9faHdfZGV2aWNlX3QgKipkZXYpCi17Ci0gICAgY29uc3QgaHdfbW9kdWxlX3QgKm1vZDsKLSAgICBpbnQgcmM7Ci0KLSAgICByYyA9IGh3X2dldF9tb2R1bGVfYnlfY2xhc3MoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCAmbW9kKTsKLSAgICBpZiAocmMpIHsKLSAgICAgICAgQUxPR0UoIiVzIGNvdWxkbid0IGxvYWQgYXVkaW8gaHcgbW9kdWxlICVzLiVzICglcykiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICBBVURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIGlmX25hbWUsIHN0cmVycm9yKC1yYykpOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0gICAgcmMgPSBhdWRpb19od19kZXZpY2Vfb3Blbihtb2QsIGRldik7Ci0gICAgaWYgKHJjKSB7Ci0gICAgICAgIEFMT0dFKCIlcyBjb3VsZG4ndCBvcGVuIGF1ZGlvIGh3IGRldmljZSBpbiAlcy4lcyAoJXMpIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCBzdHJlcnJvcigtcmMpKTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotICAgIGlmICgoKmRldiktPmNvbW1vbi52ZXJzaW9uIDwgQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OX01JTikgewotICAgICAgICBBTE9HRSgiJXMgd3JvbmcgYXVkaW8gaHcgZGV2aWNlIHZlcnNpb24gJTA0eCIsIF9fZnVuY19fLCAoKmRldiktPmNvbW1vbi52ZXJzaW9uKTsKLSAgICAgICAgcmMgPSBCQURfVkFMVUU7Ci0gICAgICAgIGF1ZGlvX2h3X2RldmljZV9jbG9zZSgqZGV2KTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLQotb3V0OgotICAgICpkZXYgPSBOVUxMOwotICAgIHJldHVybiByYzsKLX0KLQotc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKLSAgICBhdWRpb19od19kZXZpY2VfdCAqZGV2OwotICAgIHN0YXR1c190IHJjID0gbG9hZF9hdWRpb19pbnRlcmZhY2UobmFtZSwgJmRldik7Ci0gICAgaWYgKHJjID09IE9LKSB7Ci0gICAgICAgICpkZXZpY2UgPSBuZXcgRGV2aWNlSGFsTG9jYWwoZGV2KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJjOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlkMThhYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0xPQ0FMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0xPQ0FMX0gKLQotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEZXZpY2VzRmFjdG9yeUhhbExvY2FsIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBPcGVucyBhIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gVG8gY2xvc2UgdGhlIGRldmljZSwgaXQgaXMKLSAgICAvLyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCgpIHt9Ci0KLSAgICB2aXJ0dWFsIH5EZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkge30KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNmE1MDAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YXRvbWljPgotCi0jZGVmaW5lIExPR19UQUcgIkVmZmVjdEJ1ZmZlckhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvYWxsb2NhdG9yLzEuMC9JQWxsb2NhdG9yLmg+Ci0jaW5jbHVkZSA8aGlkbG1lbW9yeS9tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoaWRsOjphbGxvY2F0b3I6OlYxXzA6OklBbGxvY2F0b3I7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gc3RhdGljCi11aW50NjRfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjptYWtlVW5pcXVlSWQoKSB7Ci0gICAgc3RhdGljIHN0ZDo6YXRvbWljPHVpbnQ2NF90PiBjb3VudGVyezF9OwotICAgIHJldHVybiBjb3VudGVyKys7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmFsbG9jYXRlKAotICAgICAgICBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7Ci0gICAgcmV0dXJuIG1pcnJvcihudWxscHRyLCBzaXplLCBidWZmZXIpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjptaXJyb3IoCi0gICAgICAgIHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7Ci0gICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiB0ZW1wQnVmZmVyID0gbmV3IEVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZSk7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KHRlbXBCdWZmZXIuZ2V0KCkpLT5pbml0KCk7Ci0gICAgaWYgKHJlc3VsdCA9PSBPSykgewotICAgICAgICB0ZW1wQnVmZmVyLT5zZXRFeHRlcm5hbERhdGEoZXh0ZXJuYWwpOwotICAgICAgICAqYnVmZmVyID0gdGVtcEJ1ZmZlcjsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotRWZmZWN0QnVmZmVySGFsSGlkbDo6RWZmZWN0QnVmZmVySGFsSGlkbChzaXplX3Qgc2l6ZSkKLSAgICAgICAgOiBtQnVmZmVyU2l6ZShzaXplKSwgbUZyYW1lQ291bnRDaGFuZ2VkKGZhbHNlKSwKLSAgICAgICAgICBtRXh0ZXJuYWxEYXRhKG51bGxwdHIpLCBtQXVkaW9CdWZmZXJ7MCwge251bGxwdHJ9fSB7Ci0gICAgbUhpZGxCdWZmZXIuaWQgPSBtYWtlVW5pcXVlSWQoKTsKLSAgICBtSGlkbEJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKLX0KLQotRWZmZWN0QnVmZmVySGFsSGlkbDo6fkVmZmVjdEJ1ZmZlckhhbEhpZGwoKSB7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmluaXQoKSB7Ci0gICAgc3A8SUFsbG9jYXRvcj4gYXNobWVtID0gSUFsbG9jYXRvcjo6Z2V0U2VydmljZSgiYXNobWVtIik7Ci0gICAgaWYgKGFzaG1lbSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmV0cmlldmUgYXNobWVtIGFsbG9jYXRvciBzZXJ2aWNlIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBzdGF0dXNfdCByZXR2YWwgPSBOT19NRU1PUlk7Ci0gICAgUmV0dXJuPHZvaWQ+IHJlc3VsdCA9IGFzaG1lbS0+YWxsb2NhdGUoCi0gICAgICAgICAgICBtQnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIFsmXShib29sIHN1Y2Nlc3MsIGNvbnN0IGhpZGxfbWVtb3J5JiBtZW1vcnkpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgewotICAgICAgICAgICAgICAgICAgICBtSGlkbEJ1ZmZlci5kYXRhID0gbWVtb3J5OwotICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBPSzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmVzdWx0LmlzT2soKSAmJiByZXR2YWwgPT0gT0spIHsKLSAgICAgICAgbU1lbW9yeSA9IGhhcmR3YXJlOjptYXBNZW1vcnkobUhpZGxCdWZmZXIuZGF0YSk7Ci0gICAgICAgIGlmIChtTWVtb3J5ICE9IDApIHsKLSAgICAgICAgICAgIG1NZW1vcnktPnVwZGF0ZSgpOwotICAgICAgICAgICAgbUF1ZGlvQnVmZmVyLnJhdyA9IHN0YXRpY19jYXN0PHZvaWQqPihtTWVtb3J5LT5nZXRQb2ludGVyKCkpOwotICAgICAgICAgICAgbWVtc2V0KG1BdWRpb0J1ZmZlci5yYXcsIDAsIG1NZW1vcnktPmdldFNpemUoKSk7Ci0gICAgICAgICAgICBtTWVtb3J5LT5jb21taXQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbWFwIGFsbG9jYXRlZCBhc2htZW0iKTsKLSAgICAgICAgICAgIHJldHZhbCA9IE5PX01FTU9SWTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZnJvbSBhc2htZW0iLCAoaW50KW1CdWZmZXJTaXplKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdC5pc09rKCkgPyByZXR2YWwgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLWF1ZGlvX2J1ZmZlcl90KiBFZmZlY3RCdWZmZXJIYWxIaWRsOjphdWRpb0J1ZmZlcigpIHsKLSAgICByZXR1cm4gJm1BdWRpb0J1ZmZlcjsKLX0KLQotdm9pZCogRWZmZWN0QnVmZmVySGFsSGlkbDo6ZXh0ZXJuYWxEYXRhKCkgY29uc3QgewotICAgIHJldHVybiBtRXh0ZXJuYWxEYXRhOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnNldEZyYW1lQ291bnQoc2l6ZV90IGZyYW1lQ291bnQpIHsKLSAgICBtSGlkbEJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKLSAgICBtQXVkaW9CdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7Ci0gICAgbUZyYW1lQ291bnRDaGFuZ2VkID0gdHJ1ZTsKLX0KLQotYm9vbCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpjaGVja0ZyYW1lQ291bnRDaGFuZ2UoKSB7Ci0gICAgYm9vbCByZXN1bHQgPSBtRnJhbWVDb3VudENoYW5nZWQ7Ci0gICAgbUZyYW1lQ291bnRDaGFuZ2VkID0gZmFsc2U7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpzZXRFeHRlcm5hbERhdGEodm9pZCogZXh0ZXJuYWwpIHsKLSAgICBtRXh0ZXJuYWxEYXRhID0gZXh0ZXJuYWw7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6dXBkYXRlKCkgewotICAgIHVwZGF0ZShtQnVmZmVyU2l6ZSk7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y29tbWl0KCkgewotICAgIGNvbW1pdChtQnVmZmVyU2l6ZSk7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6dXBkYXRlKHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKG1FeHRlcm5hbERhdGEgPT0gbnVsbHB0cikgcmV0dXJuOwotICAgIG1NZW1vcnktPnVwZGF0ZSgpOwotICAgIGlmIChzaXplID4gbUJ1ZmZlclNpemUpIHNpemUgPSBtQnVmZmVyU2l6ZTsKLSAgICBtZW1jcHkobUF1ZGlvQnVmZmVyLnJhdywgbUV4dGVybmFsRGF0YSwgc2l6ZSk7Ci0gICAgbU1lbW9yeS0+Y29tbWl0KCk7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y29tbWl0KHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKG1FeHRlcm5hbERhdGEgPT0gbnVsbHB0cikgcmV0dXJuOwotICAgIGlmIChzaXplID4gbUJ1ZmZlclNpemUpIHNpemUgPSBtQnVmZmVyU2l6ZTsKLSAgICBtZW1jcHkobUV4dGVybmFsRGF0YSwgbUF1ZGlvQnVmZmVyLnJhdywgc2l6ZSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0QnVmZmVySGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWUwMDg3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0hJRExfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvMi4wL3R5cGVzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21lbW9yeS8xLjAvSU1lbW9yeS5oPgotI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+Ci0KLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpBdWRpb0J1ZmZlcjsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKLXVzaW5nIGFuZHJvaWQ6OmhpZGw6Om1lbW9yeTo6VjFfMDo6SU1lbW9yeTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBFZmZlY3RCdWZmZXJIYWxIaWRsIDogcHVibGljIEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgc3RhdGljIHN0YXR1c190IGFsbG9jYXRlKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBtaXJyb3Iodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpOwotCi0gICAgdmlydHVhbCBhdWRpb19idWZmZXJfdCogYXVkaW9CdWZmZXIoKTsKLSAgICB2aXJ0dWFsIHZvaWQqIGV4dGVybmFsRGF0YSgpIGNvbnN0OwotCi0gICAgdmlydHVhbCBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1CdWZmZXJTaXplOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0RXh0ZXJuYWxEYXRhKHZvaWQqIGV4dGVybmFsKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0RnJhbWVDb3VudChzaXplX3QgZnJhbWVDb3VudCk7Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRnJhbWVDb3VudENoYW5nZSgpOwotCi0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZSgpOwotICAgIHZpcnR1YWwgdm9pZCBjb21taXQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlKHNpemVfdCBzaXplKTsKLSAgICB2aXJ0dWFsIHZvaWQgY29tbWl0KHNpemVfdCBzaXplKTsKLQotICAgIGNvbnN0IEF1ZGlvQnVmZmVyJiBoaWRsQnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbUhpZGxCdWZmZXI7IH0KLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U7Ci0KLSAgICBzdGF0aWMgdWludDY0X3QgbWFrZVVuaXF1ZUlkKCk7Ci0KLSAgICBjb25zdCBzaXplX3QgbUJ1ZmZlclNpemU7Ci0gICAgYm9vbCBtRnJhbWVDb3VudENoYW5nZWQ7Ci0gICAgdm9pZCogbUV4dGVybmFsRGF0YTsKLSAgICBBdWRpb0J1ZmZlciBtSGlkbEJ1ZmZlcjsKLSAgICBzcDxJTWVtb3J5PiBtTWVtb3J5OwotICAgIGF1ZGlvX2J1ZmZlcl90IG1BdWRpb0J1ZmZlcjsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBFZmZlY3RCdWZmZXJIYWxIaWRsKHNpemVfdCBzaXplKTsKLQotICAgIHZpcnR1YWwgfkVmZmVjdEJ1ZmZlckhhbEhpZGwoKTsKLQotICAgIHN0YXR1c190IGluaXQoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0SGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYjAzMmMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkVmZmVjdEhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCi0jaW5jbHVkZSAiSGlkbFV0aWxzLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkF1ZGlvQnVmZmVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6RWZmZWN0QnVmZmVyQWNjZXNzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6RWZmZWN0Q29uZmlnUGFyYW1ldGVyczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6Ok1lc3NhZ2VRdWV1ZUZsYWdCaXRzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6SGlkbFV0aWxzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9DaGFubmVsTWFzazsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvRm9ybWF0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLUVmZmVjdEhhbEhpZGw6OkVmZmVjdEhhbEhpZGwoY29uc3Qgc3A8SUVmZmVjdD4mIGVmZmVjdCwgdWludDY0X3QgZWZmZWN0SWQpCi0gICAgICAgIDogbUVmZmVjdChlZmZlY3QpLCBtRWZmZWN0SWQoZWZmZWN0SWQpLCBtQnVmZmVyc0NoYW5nZWQodHJ1ZSksIG1FZkdyb3VwKG51bGxwdHIpIHsKLX0KLQotRWZmZWN0SGFsSGlkbDo6fkVmZmVjdEhhbEhpZGwoKSB7Ci0gICAgaWYgKG1FZmZlY3QgIT0gMCkgewotICAgICAgICBjbG9zZSgpOwotICAgICAgICBtRWZmZWN0LmNsZWFyKCk7Ci0gICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgfQotICAgIGlmIChtRWZHcm91cCkgewotICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOwotICAgIH0KLX0KLQotLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbCgKLSAgICAgICAgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgZGVzY3JpcHRvciwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogaGFsRGVzY3JpcHRvcikgewotICAgIEhpZGxVdGlsczo6dXVpZFRvSGFsKGRlc2NyaXB0b3IudHlwZSwgJmhhbERlc2NyaXB0b3ItPnR5cGUpOwotICAgIEhpZGxVdGlsczo6dXVpZFRvSGFsKGRlc2NyaXB0b3IudXVpZCwgJmhhbERlc2NyaXB0b3ItPnV1aWQpOwotICAgIGhhbERlc2NyaXB0b3ItPmZsYWdzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGRlc2NyaXB0b3IuZmxhZ3MpOwotICAgIGhhbERlc2NyaXB0b3ItPmNwdUxvYWQgPSBkZXNjcmlwdG9yLmNwdUxvYWQ7Ci0gICAgaGFsRGVzY3JpcHRvci0+bWVtb3J5VXNhZ2UgPSBkZXNjcmlwdG9yLm1lbW9yeVVzYWdlOwotICAgIG1lbWNweShoYWxEZXNjcmlwdG9yLT5uYW1lLCBkZXNjcmlwdG9yLm5hbWUuZGF0YSgpLCBkZXNjcmlwdG9yLm5hbWUuc2l6ZSgpKTsKLSAgICBtZW1jcHkoaGFsRGVzY3JpcHRvci0+aW1wbGVtZW50b3IsCi0gICAgICAgICAgICBkZXNjcmlwdG9yLmltcGxlbWVudG9yLmRhdGEoKSwgZGVzY3JpcHRvci5pbXBsZW1lbnRvci5zaXplKCkpOwotfQotCi0vLyBUT0RPKG1uYWdhbm92KTogVGhlc2UgYnVmZmVyIGNvbnZlcnNpb24gZnVuY3Rpb25zIHNob3VsZCBiZSBzaGFyZWQgd2l0aCBFZmZlY3Qgd3JhcHBlcgotLy8gdmlhIEhpZGxVdGlscy4gTW92ZSB0aGVtIHRoZXJlIHdoZW4gaGFyZHdhcmUvaW50ZXJmYWNlcyB3aWxsIGdldCB1bi1mcm96ZW4gYWdhaW4uCi0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKAotICAgICAgICBjb25zdCBidWZmZXJfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0QnVmZmVyQ29uZmlnKiBjb25maWcpIHsKLSAgICBjb25maWctPnNhbXBsaW5nUmF0ZUh6ID0gaGFsQ29uZmlnLnNhbXBsaW5nUmF0ZTsKLSAgICBjb25maWctPmNoYW5uZWxzID0gQXVkaW9DaGFubmVsTWFzayhoYWxDb25maWcuY2hhbm5lbHMpOwotICAgIGNvbmZpZy0+Zm9ybWF0ID0gQXVkaW9Gb3JtYXQoaGFsQ29uZmlnLmZvcm1hdCk7Ci0gICAgY29uZmlnLT5hY2Nlc3NNb2RlID0gRWZmZWN0QnVmZmVyQWNjZXNzKGhhbENvbmZpZy5hY2Nlc3NNb2RlKTsKLSAgICBjb25maWctPm1hc2sgPSBFZmZlY3RDb25maWdQYXJhbWV0ZXJzKGhhbENvbmZpZy5tYXNrKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdEJ1ZmZlckNvbmZpZ1RvSGFsKAotICAgICAgICBjb25zdCBFZmZlY3RCdWZmZXJDb25maWcmIGNvbmZpZywgYnVmZmVyX2NvbmZpZ190KiBoYWxDb25maWcpIHsKLSAgICBoYWxDb25maWctPmJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKLSAgICBoYWxDb25maWctPmJ1ZmZlci5yYXcgPSBOVUxMOwotICAgIGhhbENvbmZpZy0+c2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsaW5nUmF0ZUh6OwotICAgIGhhbENvbmZpZy0+Y2hhbm5lbHMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oY29uZmlnLmNoYW5uZWxzKTsKLSAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IE5VTEw7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwotICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7Ci0gICAgaGFsQ29uZmlnLT5mb3JtYXQgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb25maWcuZm9ybWF0KTsKLSAgICBoYWxDb25maWctPmFjY2Vzc01vZGUgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb25maWcuYWNjZXNzTW9kZSk7Ci0gICAgaGFsQ29uZmlnLT5tYXNrID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLm1hc2spOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0Q29uZmlnRnJvbUhhbChjb25zdCBlZmZlY3RfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0Q29uZmlnKiBjb25maWcpIHsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKGhhbENvbmZpZy5pbnB1dENmZywgJmNvbmZpZy0+aW5wdXRDZmcpOwotICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoaGFsQ29uZmlnLm91dHB1dENmZywgJmNvbmZpZy0+b3V0cHV0Q2ZnKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdENvbmZpZ1RvSGFsKGNvbnN0IEVmZmVjdENvbmZpZyYgY29uZmlnLCBlZmZlY3RfY29uZmlnX3QqIGhhbENvbmZpZykgewotICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ1RvSGFsKGNvbmZpZy5pbnB1dENmZywgJmhhbENvbmZpZy0+aW5wdXRDZmcpOwotICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ1RvSGFsKGNvbmZpZy5vdXRwdXRDZmcsICZoYWxDb25maWctPm91dHB1dENmZyk7Ci19Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6YW5hbHl6ZVJlc3VsdChjb25zdCBSZXN1bHQmIHJlc3VsdCkgewotICAgIHN3aXRjaCAocmVzdWx0KSB7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpPSzogcmV0dXJuIE9LOwotICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFM6IHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX1NUQVRFOiByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwotICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOiByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9TVVBQT1JURUQ6IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OlJFU1VMVF9UT09fQklHOiByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICBkZWZhdWx0OiByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldEluQnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcikgewotICAgIGlmICghbUJ1ZmZlcnNDaGFuZ2VkKSB7Ci0gICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gbnVsbHB0ciB8fCBtSW5CdWZmZXIuZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLmdldCgpICE9IG1JbkJ1ZmZlci5nZXQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci0+YXVkaW9CdWZmZXIoKSAhPSBtSW5CdWZmZXItPmF1ZGlvQnVmZmVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbUluQnVmZmVyID0gYnVmZmVyOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0T3V0QnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcikgewotICAgIGlmICghbUJ1ZmZlcnNDaGFuZ2VkKSB7Ci0gICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gbnVsbHB0ciB8fCBtT3V0QnVmZmVyLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci5nZXQoKSAhPSBtT3V0QnVmZmVyLmdldCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLT5hdWRpb0J1ZmZlcigpICE9IG1PdXRCdWZmZXItPmF1ZGlvQnVmZmVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbU91dEJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByb2Nlc3MoKSB7Ci0gICAgcmV0dXJuIHByb2Nlc3NJbXBsKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6UkVRVUVTVF9QUk9DRVNTKSk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByb2Nlc3NSZXZlcnNlKCkgewotICAgIHJldHVybiBwcm9jZXNzSW1wbChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OlJFUVVFU1RfUFJPQ0VTU19SRVZFUlNFKSk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByZXBhcmVGb3JQcm9jZXNzaW5nKCkgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gdGVtcFN0YXR1c01ROwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3QtPnByZXBhcmVGb3JQcm9jZXNzaW5nKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBNUURlc2NyaXB0b3JTeW5jPFJlc3VsdD4mIHN0YXR1c01RKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcFN0YXR1c01RLnJlc2V0KG5ldyBTdGF0dXNNUShzdGF0dXNNUSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAodGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgJiYgdGVtcFN0YXR1c01RLT5nZXRFdmVudEZsYWdXb3JkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50RmxhZzo6Y3JlYXRlRXZlbnRGbGFnKHRlbXBTdGF0dXNNUS0+Z2V0RXZlbnRGbGFnV29yZCgpLCAmbUVmR3JvdXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKCFyZXQuaXNPaygpIHx8IHJldHZhbCAhPSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXR2YWwpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgIH0KLSAgICBpZiAoIXRlbXBTdGF0dXNNUSB8fCAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgfHwgIW1FZkdyb3VwKSB7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciBlZmZlY3RzIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCi0gICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciBlZmZlY3RzIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3IgZWZmZWN0cyBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIG1TdGF0dXNNUSA9IHN0ZDo6bW92ZSh0ZW1wU3RhdHVzTVEpOwotICAgIHJldHVybiBPSzsKLX0KLQotYm9vbCBFZmZlY3RIYWxIaWRsOjpuZWVkVG9SZXNldEJ1ZmZlcnMoKSB7Ci0gICAgaWYgKG1CdWZmZXJzQ2hhbmdlZCkgcmV0dXJuIHRydWU7Ci0gICAgYm9vbCBpbkJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkID0gbUluQnVmZmVyLT5jaGVja0ZyYW1lQ291bnRDaGFuZ2UoKTsKLSAgICBib29sIG91dEJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkID0gbU91dEJ1ZmZlci0+Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7Ci0gICAgcmV0dXJuIGluQnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQgfHwgb3V0QnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQ7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByb2Nlc3NJbXBsKHVpbnQzMl90IG1xRmxhZykgewotICAgIGlmIChtRWZmZWN0ID09IDAgfHwgbUluQnVmZmVyID09IDAgfHwgbU91dEJ1ZmZlciA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgaWYgKCFtU3RhdHVzTVEgJiYgKHN0YXR1cyA9IHByZXBhcmVGb3JQcm9jZXNzaW5nKCkpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIGlmIChuZWVkVG9SZXNldEJ1ZmZlcnMoKSAmJiAoc3RhdHVzID0gc2V0UHJvY2Vzc0J1ZmZlcnMoKSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgLy8gVGhlIGRhdGEgaXMgYWxyZWFkeSBpbiB0aGUgYnVmZmVycywganVzdCBuZWVkIHRvIGZsdXNoIGl0IGFuZCB3YWtlIHVwIHRoZSBzZXJ2ZXIgc2lkZS4KLSAgICBzdGQ6OmF0b21pY190aHJlYWRfZmVuY2Uoc3RkOjptZW1vcnlfb3JkZXJfcmVsZWFzZSk7Ci0gICAgbUVmR3JvdXAtPndha2UobXFGbGFnKTsKLSAgICB1aW50MzJfdCBlZlN0YXRlID0gMDsKLXJldHJ5OgotICAgIHN0YXR1c190IHJldCA9IG1FZkdyb3VwLT53YWl0KAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpET05FX1BST0NFU1NJTkcpLCAmZWZTdGF0ZSk7Ci0gICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OkRPTkVfUFJPQ0VTU0lORykpIHsKLSAgICAgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgICAgICBtU3RhdHVzTVEtPnJlYWQoJnJldHZhbCk7Ci0gICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSyB8fCByZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX1NUQVRFKSB7Ci0gICAgICAgICAgICAvLyBTeW5jIGJhY2sgdGhlIGNoYW5nZWQgY29udGVudHMgb2YgdGhlIGJ1ZmZlci4KLSAgICAgICAgICAgIHN0ZDo6YXRvbWljX3RocmVhZF9mZW5jZShzdGQ6Om1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5hbHl6ZVJlc3VsdChyZXR2YWwpOwotICAgIH0KLSAgICBpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FSU5UUikgewotICAgICAgICAvLyBTcHVyaW91cyB3YWtldXAuIFRoaXMgbm9ybWFsbHkgcmV0cmllcyBubyBtb3JlIHRoYW4gb25jZS4KLSAgICAgICAgZ290byByZXRyeTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0UHJvY2Vzc0J1ZmZlcnMoKSB7Ci0gICAgUmV0dXJuPFJlc3VsdD4gcmV0ID0gbUVmZmVjdC0+c2V0UHJvY2Vzc0J1ZmZlcnMoCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RCdWZmZXJIYWxIaWRsKj4obUluQnVmZmVyLmdldCgpKS0+aGlkbEJ1ZmZlcigpLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KG1PdXRCdWZmZXIuZ2V0KCkpLT5oaWRsQnVmZmVyKCkpOwotICAgIGlmIChyZXQuaXNPaygpICYmIHJldCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGZhbHNlOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpjb21tYW5kKHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLAotICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7Ci0gICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0KLSAgICAvLyBTcGVjaWFsIGNhc2VzLgotICAgIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX0NPTkZJRyB8fCBjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX0NPTkZJR19SRVZFUlNFKSB7Ci0gICAgICAgIHJldHVybiBzZXRDb25maWdJbXBsKGNtZENvZGUsIGNtZFNpemUsIHBDbWREYXRhLCByZXBseVNpemUsIHBSZXBseURhdGEpOwotICAgIH0gZWxzZSBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0dFVF9DT05GSUcgfHwgY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0dFVF9DT05GSUdfUkVWRVJTRSkgewotICAgICAgICByZXR1cm4gZ2V0Q29uZmlnSW1wbChjbWRDb2RlLCByZXBseVNpemUsIHBSZXBseURhdGEpOwotICAgIH0KLQotICAgIC8vIENvbW1vbiBjYXNlLgotICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IGhpZGxEYXRhOwotICAgIGlmIChwQ21kRGF0YSAhPSBudWxscHRyICYmIGNtZFNpemUgPiAwKSB7Ci0gICAgICAgIGhpZGxEYXRhLnNldFRvRXh0ZXJuYWwocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4ocENtZERhdGEpLCBjbWRTaXplKTsKLSAgICB9Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIHVpbnQzMl90IHJlcGx5U2l6ZVN0dWIgPSAwOwotICAgIGlmIChyZXBseVNpemUgPT0gbnVsbHB0ciB8fCBwUmVwbHlEYXRhID09IG51bGxwdHIpIHJlcGx5U2l6ZSA9ICZyZXBseVNpemVTdHViOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5jb21tYW5kKGNtZENvZGUsIGhpZGxEYXRhLCAqcmVwbHlTaXplLAotICAgICAgICAgICAgWyZdKGludDMyX3QgcywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHJlc3VsdCkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgqcmVwbHlTaXplID4gcmVzdWx0LnNpemUoKSkgKnJlcGx5U2l6ZSA9IHJlc3VsdC5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhICE9IG51bGxwdHIgJiYgKnJlcGx5U2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShwUmVwbHlEYXRhLCAmcmVzdWx0WzBdLCAqcmVwbHlTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiByZXQuaXNPaygpID8gc3RhdHVzIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpnZXREZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7Ci0gICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5nZXREZXNjcmlwdG9yKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBlZmZlY3REZXNjcmlwdG9yVG9IYWwocmVzdWx0LCBwRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldHZhbCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmNsb3NlKCkgewotICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IG1FZmZlY3QtPmNsb3NlKCk7Ci0gICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmdldENvbmZpZ0ltcGwoCi0gICAgICAgIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKLSAgICBpZiAocmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSB8fCBwUmVwbHlEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgIFJldHVybjx2b2lkPiByZXQ7Ci0gICAgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHKSB7Ci0gICAgICAgIHJldCA9IG1FZmZlY3QtPmdldENvbmZpZyhbJl0gKFJlc3VsdCByLCBjb25zdCBFZmZlY3RDb25maWcgJmhpZGxDb25maWcpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGFuYWx5emVSZXN1bHQocik7Ci0gICAgICAgICAgICBpZiAociA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgZWZmZWN0Q29uZmlnVG9IYWwoaGlkbENvbmZpZywgc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocFJlcGx5RGF0YSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXQgPSBtRWZmZWN0LT5nZXRDb25maWdSZXZlcnNlKFsmXSAoUmVzdWx0IHIsIGNvbnN0IEVmZmVjdENvbmZpZyAmaGlkbENvbmZpZykgewotICAgICAgICAgICAgcmVzdWx0ID0gYW5hbHl6ZVJlc3VsdChyKTsKLSAgICAgICAgICAgIGlmIChyID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICBlZmZlY3RDb25maWdUb0hhbChoaWRsQ29uZmlnLCBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwUmVwbHlEYXRhKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLSAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgcmVzdWx0ID0gRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRDb25maWdJbXBsKAotICAgICAgICB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgewotICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgfHwKLSAgICAgICAgICAgIHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludDMyX3QpIHx8IHBSZXBseURhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBjb25zdCBlZmZlY3RfY29uZmlnX3QgKmhhbENvbmZpZyA9IHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBDbWREYXRhKTsKLSAgICBpZiAoaGFsQ29uZmlnLT5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgIT0gTlVMTCB8fAotICAgICAgICAgICAgaGFsQ29uZmlnLT5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyICE9IE5VTEwgfHwKLSAgICAgICAgICAgIGhhbENvbmZpZy0+b3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciAhPSBOVUxMIHx8Ci0gICAgICAgICAgICBoYWxDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkJ1ZmZlciBwcm92aWRlciBjYWxsYmFja3MgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICB9Ci0gICAgRWZmZWN0Q29uZmlnIGhpZGxDb25maWc7Ci0gICAgZWZmZWN0Q29uZmlnRnJvbUhhbCgqaGFsQ29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgUmV0dXJuPFJlc3VsdD4gcmV0ID0gY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgPwotICAgICAgICAgICAgbUVmZmVjdC0+c2V0Q29uZmlnKGhpZGxDb25maWcsIG51bGxwdHIsIG51bGxwdHIpIDoKLSAgICAgICAgICAgIG1FZmZlY3QtPnNldENvbmZpZ1JldmVyc2UoaGlkbENvbmZpZywgbnVsbHB0ciwgbnVsbHB0cik7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgIHJlc3VsdCA9IGFuYWx5emVSZXN1bHQocmV0KTsKLSAgICAgICAgKnN0YXRpY19jYXN0PGludDMyX3QqPihwUmVwbHlEYXRhKSA9IHJlc3VsdDsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RIYWxIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZmRhZjEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEhhbEhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9IQUxfSElETF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9ISURMX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzIuMC9JRWZmZWN0Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8Zm1xL0V2ZW50RmxhZy5oPgotI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkVmZmVjdEJ1ZmZlckNvbmZpZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkVmZmVjdENvbmZpZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkVmZmVjdERlc2NyaXB0b3I7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpJRWZmZWN0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6RXZlbnRGbGFnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEVmZmVjdEhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0SGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBTZXQgdGhlIGlucHV0IGJ1ZmZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEluQnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcik7Ci0KLSAgICAvLyBTZXQgdGhlIG91dHB1dCBidWZmZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRCdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKTsKLQotICAgIC8vIEVmZmVjdCBwcm9jZXNzIGZ1bmN0aW9uLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2VzcygpOwotCi0gICAgLy8gUHJvY2VzcyByZXZlcnNlIHN0cmVhbSBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHBhc3MKLSAgICAvLyBhIHJlZmVyZW5jZSBzdHJlYW0gdG8gdGhlIGVmZmVjdCBlbmdpbmUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwcm9jZXNzUmV2ZXJzZSgpOwotCi0gICAgLy8gU2VuZCBhIGNvbW1hbmQgYW5kIHJlY2VpdmUgYSByZXNwb25zZSB0by9mcm9tIGVmZmVjdCBlbmdpbmUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb21tYW5kKHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLAotICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7Ci0KLSAgICAvLyBSZXR1cm5zIHRoZSBlZmZlY3QgZGVzY3JpcHRvci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOwotCi0gICAgLy8gRnJlZSByZXNvdXJjZXMgb24gdGhlIHJlbW90ZSBzaWRlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2UoKTsKLQotICAgIC8vIFdoZXRoZXIgaXQncyBhIGxvY2FsIGltcGxlbWVudGF0aW9uLgotICAgIHZpcnR1YWwgYm9vbCBpc0xvY2FsKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgIHVpbnQ2NF90IGVmZmVjdElkKCkgY29uc3QgeyByZXR1cm4gbUVmZmVjdElkOyB9Ci0KLSAgICBzdGF0aWMgdm9pZCBlZmZlY3REZXNjcmlwdG9yVG9IYWwoCi0gICAgICAgICAgICBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiBkZXNjcmlwdG9yLCBlZmZlY3RfZGVzY3JpcHRvcl90KiBoYWxEZXNjcmlwdG9yKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEhpZGw7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8Ci0gICAgICAgIGhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpSZXN1bHQsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBTdGF0dXNNUTsKLQotICAgIHNwPElFZmZlY3Q+IG1FZmZlY3Q7Ci0gICAgY29uc3QgdWludDY0X3QgbUVmZmVjdElkOwotICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gbUluQnVmZmVyOwotICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gbU91dEJ1ZmZlcjsKLSAgICBib29sIG1CdWZmZXJzQ2hhbmdlZDsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKLSAgICBFdmVudEZsYWcqIG1FZkdyb3VwOwotCi0gICAgc3RhdGljIHN0YXR1c190IGFuYWx5emVSZXN1bHQoY29uc3QgaGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OlJlc3VsdCYgcmVzdWx0KTsKLSAgICBzdGF0aWMgdm9pZCBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKAotICAgICAgICAgICAgY29uc3QgYnVmZmVyX2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdEJ1ZmZlckNvbmZpZyogY29uZmlnKTsKLSAgICBzdGF0aWMgdm9pZCBlZmZlY3RCdWZmZXJDb25maWdUb0hhbCgKLSAgICAgICAgICAgIGNvbnN0IEVmZmVjdEJ1ZmZlckNvbmZpZyYgY29uZmlnLCBidWZmZXJfY29uZmlnX3QqIGhhbENvbmZpZyk7Ci0gICAgc3RhdGljIHZvaWQgZWZmZWN0Q29uZmlnRnJvbUhhbChjb25zdCBlZmZlY3RfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0Q29uZmlnKiBjb25maWcpOwotICAgIHN0YXRpYyB2b2lkIGVmZmVjdENvbmZpZ1RvSGFsKGNvbnN0IEVmZmVjdENvbmZpZyYgY29uZmlnLCBlZmZlY3RfY29uZmlnX3QqIGhhbENvbmZpZyk7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgRWZmZWN0SGFsSGlkbChjb25zdCBzcDxJRWZmZWN0PiYgZWZmZWN0LCB1aW50NjRfdCBlZmZlY3RJZCk7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IHJlbGVhc2VzIHRoZSBlZmZlY3QuCi0gICAgdmlydHVhbCB+RWZmZWN0SGFsSGlkbCgpOwotCi0gICAgc3RhdHVzX3QgZ2V0Q29uZmlnSW1wbCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKTsKLSAgICBzdGF0dXNfdCBwcmVwYXJlRm9yUHJvY2Vzc2luZygpOwotICAgIGJvb2wgbmVlZFRvUmVzZXRCdWZmZXJzKCk7Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc0ltcGwodWludDMyX3QgbXFGbGFnKTsKLSAgICBzdGF0dXNfdCBzZXRDb25maWdJbXBsKAotICAgICAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsCi0gICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKTsKLSAgICBzdGF0dXNfdCBzZXRQcm9jZXNzQnVmZmVycygpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ0MGU2ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJFZmZlY3RzRmFjdG9yeUhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbC5oIgotI2luY2x1ZGUgIkhpZGxVdGlscy5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpIaWRsVXRpbHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpVdWlkOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6SUVmZmVjdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1FZmZlY3RzRmFjdG9yeUhhbEhpZGw6OkVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIkVmZmVjdHNGYWN0b3J5IikgewotICAgIG1FZmZlY3RzRmFjdG9yeSA9IElFZmZlY3RzRmFjdG9yeTo6Z2V0U2VydmljZSgpOwotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9idGFpbiBJRWZmZWN0c0ZhY3Rvcnkgc2VydmljZSwgdGVybWluYXRpbmcgcHJvY2Vzcy4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci19Ci0KLUVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6fkVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpIHsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpxdWVyeUFsbERlc2NyaXB0b3JzKCkgewotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmdldEFsbERlc2NyaXB0b3JzKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxFZmZlY3REZXNjcmlwdG9yPiYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3REZXNjcmlwdG9ycyA9IHJlc3VsdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICByZXR1cm4gcmV0dmFsID09IFJlc3VsdDo6T0sgPyBPSyA6IE5PX0lOSVQ7Ci0gICAgfQotICAgIG1MYXN0RGVzY3JpcHRvcnMucmVzaXplKDApOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKSB7Ci0gICAgc3RhdHVzX3QgcXVlcnlSZXN1bHQgPSBxdWVyeUFsbERlc2NyaXB0b3JzKCk7Ci0gICAgaWYgKHF1ZXJ5UmVzdWx0ID09IE9LKSB7Ci0gICAgICAgICpwTnVtRWZmZWN0cyA9IG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpOwotICAgIH0KLSAgICByZXR1cm4gcXVlcnlSZXN1bHQ7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcigKLSAgICAgICAgdWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7Ci0gICAgLy8gVE9ETzogV2UgbmVlZCBzb21laG93IHRvIHRyYWNrIHRoZSBjaGFuZ2VzIG9uIHRoZSBzZXJ2ZXIgc2lkZQotICAgIC8vIG9yIGZpZ3VyZSBvdXQgaG93IHRvIGNvbnZlcnQgZXZlcnlib2R5IHRvIHF1ZXJ5IGFsbCB0aGUgZGVzY3JpcHRvcnMgYXQgb25jZS4KLSAgICAvLyBUT0RPOiBjaGVjayBmb3IgbnVsbHB0cgotICAgIGlmIChtTGFzdERlc2NyaXB0b3JzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHN0YXR1c190IHF1ZXJ5UmVzdWx0ID0gcXVlcnlBbGxEZXNjcmlwdG9ycygpOwotICAgICAgICBpZiAocXVlcnlSZXN1bHQgIT0gT0spIHJldHVybiBxdWVyeVJlc3VsdDsKLSAgICB9Ci0gICAgaWYgKGluZGV4ID49IG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0RGVzY3JpcHRvclRvSGFsKG1MYXN0RGVzY3JpcHRvcnNbaW5kZXhdLCBwRGVzY3JpcHRvcik7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmdldERlc2NyaXB0b3IoCi0gICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgewotICAgIC8vIFRPRE86IGNoZWNrIGZvciBudWxscHRyCi0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBVdWlkIGhpZGxVdWlkOwotICAgIEhpZGxVdGlsczo6dXVpZEZyb21IYWwoKnBFZmZlY3RVdWlkLCAmaGlkbFV1aWQpOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5nZXREZXNjcmlwdG9yKGhpZGxVdWlkLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwocmVzdWx0LCBwRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7Ci0gICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpjcmVhdGVFZmZlY3QoCi0gICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLAotICAgICAgICBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+ICplZmZlY3QpIHsKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFV1aWQgaGlkbFV1aWQ7Ci0gICAgSGlkbFV0aWxzOjp1dWlkRnJvbUhhbCgqcEVmZmVjdFV1aWQsICZoaWRsVXVpZCk7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmNyZWF0ZUVmZmVjdCgKLSAgICAgICAgICAgIGhpZGxVdWlkLCBzZXNzaW9uSWQsIGlvSWQsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElFZmZlY3Q+JiByZXN1bHQsIHVpbnQ2NF90IGVmZmVjdElkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKmVmZmVjdCA9IG5ldyBFZmZlY3RIYWxIaWRsKHJlc3VsdCwgZWZmZWN0SWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgcmV0dXJuIE9LOwotICAgICAgICBlbHNlIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUykgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotICAgICAgICBlbHNlIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6ZHVtcEVmZmVjdHMoaW50IGZkKSB7Ci0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKLSAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+ZGVidWdEdW1wKGhpZGxIYW5kbGUpOwotICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhpZGxIYW5kbGUpOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjphbGxvY2F0ZUJ1ZmZlcihzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7Ci0gICAgcmV0dXJuIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmFsbG9jYXRlKHNpemUsIGJ1ZmZlcik7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6bWlycm9yQnVmZmVyKHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7Ci0gICAgcmV0dXJuIEVmZmVjdEJ1ZmZlckhhbEhpZGw6Om1pcnJvcihleHRlcm5hbCwgc2l6ZSwgYnVmZmVyKTsKLX0KLQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYjU0ODEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfSElETF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC8yLjAvSUVmZmVjdHNGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvMi4wL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6RWZmZWN0RGVzY3JpcHRvcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OklFZmZlY3RzRmFjdG9yeTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotCi1jbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAotewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRpZmZlcmVudCBlZmZlY3RzIGluIGFsbCBsb2FkZWQgbGlicmFyaWVzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpwTnVtRWZmZWN0cyk7Ci0KLSAgICAvLyBSZXR1cm5zIGEgZGVzY3JpcHRvciBvZiB0aGUgbmV4dCBhdmFpbGFibGUgZWZmZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGVzY3JpcHRvcih1aW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwKLSAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKLQotICAgIC8vIENyZWF0ZXMgYW4gZWZmZWN0IGVuZ2luZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCi0gICAgLy8gVG8gcmVsZWFzZSB0aGUgZWZmZWN0IGVuZ2luZSwgaXQgaXMgbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcwotICAgIC8vIHRvIHRoZSByZXR1cm5lZCBlZmZlY3Qgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLAotICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgaW9JZCwKLSAgICAgICAgICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gKmVmZmVjdCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBFZmZlY3RzKGludCBmZCk7Ci0KLSAgICBzdGF0dXNfdCBhbGxvY2F0ZUJ1ZmZlcihzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSBvdmVycmlkZTsKLSAgICBzdGF0dXNfdCBtaXJyb3JCdWZmZXIodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIG92ZXJyaWRlOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOwotCi0gICAgc3A8SUVmZmVjdHNGYWN0b3J5PiBtRWZmZWN0c0ZhY3Rvcnk7Ci0gICAgaGlkbF92ZWM8RWZmZWN0RGVzY3JpcHRvcj4gbUxhc3REZXNjcmlwdG9yczsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKTsKLSAgICB2aXJ0dWFsIH5FZmZlY3RzRmFjdG9yeUhhbEhpZGwoKTsKLQotICAgIHN0YXR1c190IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg2OWNkMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiU3RyZWFtSGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lTdHJlYW1PdXRDYWxsYmFjay5oPgotI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8bWVkaWF1dGlscy9TY2hlZHVsaW5nUG9saWN5U2VydmljZS5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKLSNpbmNsdWRlICJTdHJlYW1IYWxIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvQ2hhbm5lbE1hc2s7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0Zvcm1hdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OlRocmVhZEluZm87Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6QXVkaW9EcmFpbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtT3V0Q2FsbGJhY2s7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6TWVzc2FnZVF1ZXVlRmxhZ0JpdHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6TW1hcEJ1ZmZlckluZm87Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6TW1hcFBvc2l0aW9uOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlBhcmFtZXRlclZhbHVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpUaW1lU3BlYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwotdXNpbmcgUmVhZENvbW1hbmQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbUluOjpSZWFkQ29tbWFuZDsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1TdHJlYW1IYWxIaWRsOjpTdHJlYW1IYWxIaWRsKElTdHJlYW0gKnN0cmVhbSkKLSAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiU3RyZWFtIiksCi0gICAgICAgICAgbVN0cmVhbShzdHJlYW0pLAotICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eShIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQpLAotICAgICAgICAgIG1DYWNoZWRCdWZmZXJTaXplKDApewotCi0gICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KLSAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgotICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpKSB7Ci0gICAgICAgIC8vIE9idGFpbiBhdWRpbyBwcm9wZXJ0aWVzIChzZWUgU3RyZWFtSGFsSGlkbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKCkgYmVsb3cpLgotICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICAgICAgICAgIFsmXSh1aW50MzJfdCBzciwgQXVkaW9DaGFubmVsTWFzayBtLCBBdWRpb0Zvcm1hdCBmKSB7Ci0gICAgICAgICAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmluaXQoc3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4obSksCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4oZikpOwotICAgICAgICAgICAgfSk7Ci0gICAgfQotfQotCi1TdHJlYW1IYWxIaWRsOjp+U3RyZWFtSGFsSGlkbCgpIHsKLSAgICBtU3RyZWFtID0gbnVsbHB0cjsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFNhbXBsZVJhdGUiLCBtU3RyZWFtLT5nZXRTYW1wbGVSYXRlKCksIHJhdGUpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcHJvY2Vzc1JldHVybigiZ2V0QnVmZmVyU2l6ZSIsIG1TdHJlYW0tPmdldEJ1ZmZlclNpemUoKSwgc2l6ZSk7Ci0gICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICBtQ2FjaGVkQnVmZmVyU2l6ZSA9ICpzaXplOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaykgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldENoYW5uZWxNYXNrIiwgbVN0cmVhbS0+Z2V0Q2hhbm5lbE1hc2soKSwgbWFzayk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Rm9ybWF0IiwgbVN0cmVhbS0+Z2V0Rm9ybWF0KCksIGZvcm1hdCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICAgICAgWyZdKHVpbnQzMl90IHNyLCBBdWRpb0NoYW5uZWxNYXNrIG0sIEF1ZGlvRm9ybWF0IGYpIHsKLSAgICAgICAgICAgICAgICAqc2FtcGxlUmF0ZSA9IHNyOwotICAgICAgICAgICAgICAgICptYXNrID0gc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pOwotICAgICAgICAgICAgICAgICpmb3JtYXQgPSBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4oZik7Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QXVkaW9Qcm9wZXJ0aWVzIiwgcmV0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gaGlkbFBhcmFtczsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbWV0ZXJzRnJvbUhhbChrdlBhaXJzLCAmaGlkbFBhcmFtcyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0UGFyYW1ldGVycyIsIG1TdHJlYW0tPnNldFBhcmFtZXRlcnMoaGlkbFBhcmFtcykpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgewotICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBoaWRsS2V5czsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBrZXlzRnJvbUhhbChrZXlzLCAmaGlkbEtleXMpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0UGFyYW1ldGVycygKLSAgICAgICAgICAgIGhpZGxLZXlzLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzVG9IYWwocGFyYW1ldGVycywgdmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UGFyYW1ldGVycyIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6YWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiYWRkRWZmZWN0IiwgbVN0cmVhbS0+YWRkRWZmZWN0KAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RIYWxIaWRsKj4oZWZmZWN0LmdldCgpKS0+ZWZmZWN0SWQoKSkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpyZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJyZW1vdmVFZmZlY3QiLCBtU3RyZWFtLT5yZW1vdmVFZmZlY3QoCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEhhbEhpZGwqPihlZmZlY3QuZ2V0KCkpLT5lZmZlY3RJZCgpKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YW5kYnkoKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RhbmRieSIsIG1TdHJlYW0tPnN0YW5kYnkoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmR1bXAoaW50IGZkKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKLSAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmRlYnVnRHVtcChoaWRsSGFuZGxlKTsKLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKLSAgICBtU3RyZWFtUG93ZXJMb2cuZHVtcChmZCk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImR1bXAiLCByZXQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzdGFydCgpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdGFydCIsIG1TdHJlYW0tPnN0YXJ0KCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzdG9wKCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0b3AiLCBtU3RyZWFtLT5zdG9wKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgewotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmNyZWF0ZU1tYXBCdWZmZXIoCi0gICAgICAgICAgICBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBNbWFwQnVmZmVySW5mbyYgaGlkbEluZm8pIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlICpoYW5kbGUgPSBoaWRsSW5mby5zaGFyZWRNZW1vcnkuaGFuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGUtPm51bUZkcyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNoYXJlZF9tZW1vcnlfZmQgPSBoYW5kbGUtPmRhdGFbMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5idWZmZXJfc2l6ZV9mcmFtZXMgPSBoaWRsSW5mby5idWZmZXJTaXplRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+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+Y3JlYXRlRWZmZWN0KAotICAgICAgICAgICAgaGlkbFV1aWQsIHNlc3Npb25JZCwgaW9JZCwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SUVmZmVjdD4mIHJlc3VsdCwgdWludDY0X3QgZWZmZWN0SWQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqZWZmZWN0ID0gbmV3IEVmZmVjdEhhbEhpZGwocmVzdWx0LCBlZmZlY3RJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7Ci0gICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpkdW1wRWZmZWN0cyhpbnQgZmQpIHsKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOwotICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5kZWJ1ZyhoaWRsSGFuZGxlLCB7fSAvKiBvcHRpb25zICovKTsKLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6YWxsb2NhdGVCdWZmZXIoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHJldHVybiBFZmZlY3RCdWZmZXJIYWxIaWRsOjphbGxvY2F0ZShzaXplLCBidWZmZXIpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6Om1pcnJvckJ1ZmZlcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgewotICAgIHJldHVybiBFZmZlY3RCdWZmZXJIYWxIaWRsOjptaXJyb3IoZXh0ZXJuYWwsIHNpemUsIGJ1ZmZlcik7Ci19Ci0KLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzJmZGIwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDgxNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJTdHJlYW1IYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSVN0cmVhbU91dENhbGxiYWNrLmg+Ci0jaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgotI2luY2x1ZGUgIlN0cmVhbUhhbEhpZGwuaCIKLSNpbmNsdWRlICJWZXJzaW9uVXRpbHMuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9DaGFubmVsTWFzazsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvQ29udGVudFR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb0Zvcm1hdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvU291cmNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Vc2FnZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OlRocmVhZEluZm87Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6QXVkaW9EcmFpbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJU3RyZWFtT3V0Q2FsbGJhY2s7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6TWVzc2FnZVF1ZXVlRmxhZ0JpdHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6TWljcm9waG9uZUluZm87Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6TW1hcEJ1ZmZlckluZm87Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6TW1hcFBvc2l0aW9uOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlBhcmFtZXRlclZhbHVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlBsYXliYWNrVHJhY2tNZXRhZGF0YTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZWNvcmRUcmFja01ldGFkYXRhOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpUaW1lU3BlYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwotdXNpbmcgUmVhZENvbW1hbmQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbUluOjpSZWFkQ29tbWFuZDsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1TdHJlYW1IYWxIaWRsOjpTdHJlYW1IYWxIaWRsKElTdHJlYW0gKnN0cmVhbSkKLSAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiU3RyZWFtIiksCi0gICAgICAgICAgbVN0cmVhbShzdHJlYW0pLAotICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eShIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQpLAotICAgICAgICAgIG1DYWNoZWRCdWZmZXJTaXplKDApewotCi0gICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KLSAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgotICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpKSB7Ci0gICAgICAgIC8vIE9idGFpbiBhdWRpbyBwcm9wZXJ0aWVzIChzZWUgU3RyZWFtSGFsSGlkbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKCkgYmVsb3cpLgotICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICAgICAgICAgIFsmXShhdXRvIHNyLCBhdXRvIG0sIGF1dG8gZikgewotICAgICAgICAgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KHNyLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpKTsKLSAgICAgICAgICAgIH0pOwotICAgIH0KLX0KLQotU3RyZWFtSGFsSGlkbDo6flN0cmVhbUhhbEhpZGwoKSB7Ci0gICAgbVN0cmVhbSA9IG51bGxwdHI7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRTYW1wbGVSYXRlIiwgbVN0cmVhbS0+Z2V0U2FtcGxlUmF0ZSgpLCByYXRlKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oImdldEJ1ZmZlclNpemUiLCBtU3RyZWFtLT5nZXRCdWZmZXJTaXplKCksIHNpemUpOwotICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgbUNhY2hlZEJ1ZmZlclNpemUgPSAqc2l6ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRDaGFubmVsTWFzayIsIG1TdHJlYW0tPmdldENoYW5uZWxNYXNrKCksIG1hc2spOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZvcm1hdCIsIG1TdHJlYW0tPmdldEZvcm1hdCgpLCBmb3JtYXQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgIFsmXSh1aW50MzJfdCBzciwgYXV0byBtLCBhdXRvIGYpIHsKLSAgICAgICAgICAgICAgICAqc2FtcGxlUmF0ZSA9IHNyOwotICAgICAgICAgICAgICAgICptYXNrID0gc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pOwotICAgICAgICAgICAgICAgICpmb3JtYXQgPSBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4oZik7Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QXVkaW9Qcm9wZXJ0aWVzIiwgcmV0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gaGlkbFBhcmFtczsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbWV0ZXJzRnJvbUhhbChrdlBhaXJzLCAmaGlkbFBhcmFtcyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0UGFyYW1ldGVycyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHM6OnNldFBhcmFtZXRlcnMobVN0cmVhbSwgaGlkbFBhcmFtcywge30gLyogb3B0aW9ucyAqLykpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgewotICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBoaWRsS2V5czsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBrZXlzRnJvbUhhbChrZXlzLCAmaGlkbEtleXMpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gdXRpbHM6OmdldFBhcmFtZXRlcnMoCi0gICAgICAgICAgICBtU3RyZWFtLAotICAgICAgICAgICAge30gLyogY29udGV4dCAqLywKLSAgICAgICAgICAgIGhpZGxLZXlzLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzVG9IYWwocGFyYW1ldGVycywgdmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UGFyYW1ldGVycyIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6YWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiYWRkRWZmZWN0IiwgbVN0cmVhbS0+YWRkRWZmZWN0KAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RIYWxIaWRsKj4oZWZmZWN0LmdldCgpKS0+ZWZmZWN0SWQoKSkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpyZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJyZW1vdmVFZmZlY3QiLCBtU3RyZWFtLT5yZW1vdmVFZmZlY3QoCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEhhbEhpZGwqPihlZmZlY3QuZ2V0KCkpLT5lZmZlY3RJZCgpKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YW5kYnkoKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RhbmRieSIsIG1TdHJlYW0tPnN0YW5kYnkoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmR1bXAoaW50IGZkKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKLSAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmRlYnVnKGhpZGxIYW5kbGUsIHt9IC8qIG9wdGlvbnMgKi8pOwotICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhpZGxIYW5kbGUpOwotICAgIG1TdHJlYW1Qb3dlckxvZy5kdW1wKGZkKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZHVtcCIsIHJldCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YXJ0KCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0YXJ0IiwgbVN0cmVhbS0+c3RhcnQoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0b3AoKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RvcCIsIG1TdHJlYW0tPnN0b3AoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Y3JlYXRlTW1hcEJ1ZmZlcigKLSAgICAgICAgICAgIG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1tYXBCdWZmZXJJbmZvJiBoaWRsSW5mbykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGUgKmhhbmRsZSA9IGhpZGxJbmZvLnNoYXJlZE1lbW9yeS5oYW5kbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZS0+bnVtRmRzID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2hhcmVkX21lbW9yeV9mZCA9IGhhbmRsZS0+ZGF0YVswXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJ1ZmZlcl9zaXplX2ZyYW1lcyA9IGhpZGxJbmZvLmJ1ZmZlclNpemVGcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5idXJzdF9zaXplX2ZyYW1lcyA9IGhpZGxJbmZvLmJ1cnN0U2l6ZUZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZm8tPnNoYXJlZF9tZW1vcnlfYWRkcmVzcyBpcyBub3QgbmVlZGVkIGluIEhJREwgY29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+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+KiBidWZmZXIpIG92ZXJyaWRlOworCisgIHByaXZhdGU6CisgICAgc3A8SUVmZmVjdHNGYWN0b3J5PiBtRWZmZWN0c0ZhY3Rvcnk7CisgICAgaGlkbF92ZWM8RWZmZWN0RGVzY3JpcHRvcj4gbUxhc3REZXNjcmlwdG9yczsKKworICAgIHN0YXR1c190IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKK307CisKK3NwPEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlPiBjcmVhdGVFZmZlY3RzRmFjdG9yeUhhbCgpIHsKKyAgICByZXR1cm4gbmV3IEVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgZWZmZWN0Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDhkZGRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmNwcApAQCAtMCwwICsxLDg4MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiU3RyZWFtSGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JU3RyZWFtT3V0Q2FsbGJhY2suaCkKKyNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TY2hlZHVsaW5nUG9saWN5U2VydmljZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgorI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKKyNpbmNsdWRlICJTdHJlYW1IYWxIaWRsLmgiCisjaW5jbHVkZSAiVmVyc2lvblV0aWxzLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCit1c2luZyBFZmZlY3RIYWxIaWRsID0gOjphbmRyb2lkOjplZmZlY3Q6OkNQUF9WRVJTSU9OOjpFZmZlY3RIYWxIaWRsOwordXNpbmcgUmVhZENvbW1hbmQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1Jbjo6UmVhZENvbW1hbmQ7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT047CisKK1N0cmVhbUhhbEhpZGw6OlN0cmVhbUhhbEhpZGwoSVN0cmVhbSAqc3RyZWFtKQorICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJTdHJlYW0iKSwKKyAgICAgICAgICBtU3RyZWFtKHN0cmVhbSksCisgICAgICAgICAgbUhhbFRocmVhZFByaW9yaXR5KEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCksCisgICAgICAgICAgbUNhY2hlZEJ1ZmZlclNpemUoMCl7CisKKyAgICAvLyBJbnN0cnVtZW50IGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgorICAgIC8vIE5vdGU6IFRoaXMgYXNzdW1lcyBjaGFubmVsIG1hc2ssIGZvcm1hdCwgYW5kIHNhbXBsZSByYXRlIGRvIG5vdCBjaGFuZ2UgYWZ0ZXIgY3JlYXRpb24uCisgICAgaWYgKG1TdHJlYW0gIT0gbnVsbHB0ciAvKiAmJiBtU3RyZWFtUG93ZXJMb2cuaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkgKi8pIHsKKyAgICAgICAgLy8gT2J0YWluIGF1ZGlvIHByb3BlcnRpZXMgKHNlZSBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoKSBiZWxvdykuCisgICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRBdWRpb1Byb3BlcnRpZXMoCisgICAgICAgICAgICAgICAgWyZdKGF1dG8gc3IsIGF1dG8gbSwgYXV0byBmKSB7CisgICAgICAgICAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmluaXQoc3IsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4obSksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4oZikpOworICAgICAgICAgICAgfSk7CisgICAgfQorfQorCitTdHJlYW1IYWxIaWRsOjp+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+dXBkYXRlU2lua01ldGFkYXRhKGhhbE1ldGFkYXRhKSk7Cit9CisjZW5kaWYKKworI2lmIE1BSk9SX1ZFUlNJT04gPCA1CitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oCisgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbiBfX3VudXNlZCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSBfX3VudXNlZCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKyNlbHNlCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uIiwKKyAgICAgICAgbVN0cmVhbS0+c2V0TWljcm9waG9uZURpcmVjdGlvbihzdGF0aWNfY2FzdDxNaWNyb3Bob25lRGlyZWN0aW9uPihkaXJlY3Rpb24pKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6c2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24iLAorICAgICAgICAgICAgICAgIG1TdHJlYW0tPnNldE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbih6b29tKSk7Cit9CisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU4Nzg4OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5oCkBAIC0wLDAgKzEsMjYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfSElETF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9ISURMX0gKKworI2luY2x1ZGUgPGF0b21pYz4KKworI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JU3RyZWFtLmgpCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lTdHJlYW1Jbi5oKQorI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JU3RyZWFtT3V0LmgpCisjaW5jbHVkZSA8Zm1xL0V2ZW50RmxhZy5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisjaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtSW47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1PdXQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpFdmVudEZsYWc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyBSZWFkUGFyYW1ldGVycyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbUluOjpSZWFkUGFyYW1ldGVyczsKK3VzaW5nIFJlYWRTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1Jbjo6UmVhZFN0YXR1czsKK3VzaW5nIFdyaXRlQ29tbWFuZCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbU91dDo6V3JpdGVDb21tYW5kOwordXNpbmcgV3JpdGVTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1PdXQ6OldyaXRlU3RhdHVzOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitjbGFzcyBEZXZpY2VIYWxIaWRsOworCitjbGFzcyBTdHJlYW1IYWxIaWRsIDogcHVibGljIHZpcnR1YWwgU3RyZWFtSGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKK3sKKyAgcHVibGljOgorICAgIC8vIFJldHVybiB0aGUgc2FtcGxpbmcgcmF0ZSBpbiBIeiAtIGVnLiA0NDEwMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpOworCisgICAgLy8gUmV0dXJuIHNpemUgb2YgaW5wdXQvb3V0cHV0IGJ1ZmZlciBpbiBieXRlcyBmb3IgdGhpcyBzdHJlYW0gLSBlZy4gNDgwMC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIC8vIFJldHVybiB0aGUgY2hhbm5lbCBtYXNrLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spOworCisgICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBmb3JtYXQgLSBlLmcuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOworCisgICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qcm9wZXJ0aWVzKAorICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKKworICAgIC8vIFNldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7CisKKyAgICAvLyBHZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7CisKKyAgICAvLyBBZGQgb3IgcmVtb3ZlIHRoZSBlZmZlY3Qgb24gdGhlIHN0cmVhbS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOworCisgICAgLy8gUHV0IHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dC9vdXRwdXQgaW50byBzdGFuZGJ5IG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFuZGJ5KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKworICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOworCisgICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworCisgICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7CisKKyAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7CisKKyAgICAvLyBTZXQgdGhlIHByaW9yaXR5IG9mIHRoZSB0aHJlYWQgdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGUgSEFMCisgICAgLy8gKG11c3QgbWF0Y2ggdGhlIHByaW9yaXR5IG9mIHRoZSBhdWRpb2ZsaW5nZXIncyB0aHJlYWQgdGhhdCBjYWxscyAncmVhZCcgLyAnd3JpdGUnKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KTsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgZXhwbGljaXQgU3RyZWFtSGFsSGlkbChJU3RyZWFtICpzdHJlYW0pOworCisgICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIHN0cmVhbS4KKyAgICB2aXJ0dWFsIH5TdHJlYW1IYWxIaWRsKCk7CisKKyAgICBzdGF0dXNfdCBnZXRDYWNoZWRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICBib29sIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShwaWRfdCB0aHJlYWRQaWQsIHBpZF90IHRocmVhZElkKTsKKworICAgIC8vIG1TdHJlYW1Qb3dlckxvZyBpcyB1c2VkIGZvciBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICBTdHJlYW1Qb3dlckxvZyBtU3RyZWFtUG93ZXJMb2c7CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBpbnQgSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUID0gLTE7CisgICAgSVN0cmVhbSAqbVN0cmVhbTsKKyAgICBpbnQgbUhhbFRocmVhZFByaW9yaXR5OworICAgIHNpemVfdCBtQ2FjaGVkQnVmZmVyU2l6ZTsKK307CisKK2NsYXNzIFN0cmVhbU91dEhhbEhpZGwgOiBwdWJsaWMgU3RyZWFtT3V0SGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsSGlkbCB7CisgIHB1YmxpYzoKKyAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOworCisgICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBoYXJkd2FyZSBkcml2ZXIgZXN0aW1hdGVkIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSk7CisKKyAgICAvLyBVc2UgdGhpcyBtZXRob2QgaW4gc2l0dWF0aW9ucyB3aGVyZSBhdWRpbyBtaXhpbmcgaXMgZG9uZSBpbiB0aGUgaGFyZHdhcmUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOworCisgICAgLy8gU2VsZWN0cyB0aGUgYXVkaW8gcHJlc2VudGF0aW9uIChpZiBhdmFpbGFibGUpLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCk7CisKKyAgICAvLyBXcml0ZSBhdWRpbyBidWZmZXIgdG8gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbik7CisKKyAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgd3JpdHRlbiBieSB0aGUgYXVkaW8gZHNwIHRvIERBQyBzaW5jZQorICAgIC8vIHRoZSBvdXRwdXQgaGFzIGV4aXRlZCBzdGFuZGJ5LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcyk7CisKKyAgICAvLyBHZXQgdGhlIGxvY2FsIHRpbWUgYXQgd2hpY2ggdGhlIG5leHQgd3JpdGUgdG8gdGhlIGF1ZGlvIGRyaXZlciB3aWxsIGJlIHByZXNlbnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApOworCisgICAgLy8gU2V0IHRoZSBjYWxsYmFjayBmb3Igbm90aWZ5aW5nIGNvbXBsZXRpb24gb2Ygbm9uLWJsb2NraW5nIHdyaXRlIGFuZCBkcmFpbi4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgcGF1c2UgYW5kIHJlc3VtZSBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKTsKKworICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKKworICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdW1lKCk7CisKKyAgICAvLyBSZXR1cm5zIHdoZXRoZXIgZHJhaW4gb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbik7CisKKyAgICAvLyBSZXF1ZXN0cyBub3RpZmljYXRpb24gd2hlbiBkYXRhIGJ1ZmZlcmVkIGJ5IHRoZSBkcml2ZXIvaGFyZHdhcmUgaGFzIGJlZW4gcGxheWVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJhaW4oYm9vbCBlYXJseU5vdGlmeSk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIGZsdXNoIHRoZSBxdWV1ZWQgZGF0YS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7CisKKyAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcHJlc2VudGVkIHRvIGFuIGV4dGVybmFsIG9ic2VydmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApOworCisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZC4KKyAgICBzdGF0dXNfdCB1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIG92ZXJyaWRlOworCisgICAgLy8gTWV0aG9kcyB1c2VkIGJ5IFN0cmVhbU91dENhbGxiYWNrIChISURMKS4KKyAgICB2b2lkIG9uV3JpdGVSZWFkeSgpOworICAgIHZvaWQgb25EcmFpblJlYWR5KCk7CisgICAgdm9pZCBvbkVycm9yKCk7CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsSGlkbDsKKyAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxXcml0ZUNvbW1hbmQsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBDb21tYW5kTVE7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IERhdGFNUTsKKyAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxXcml0ZVN0YXR1cywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IFN0YXR1c01ROworCisgICAgd3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IG1DYWxsYmFjazsKKyAgICBzcDxJU3RyZWFtT3V0PiBtU3RyZWFtOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IG1Db21tYW5kTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gbURhdGFNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKKyAgICBzdGQ6OmF0b21pYzxwaWRfdD4gbVdyaXRlckNsaWVudDsKKyAgICBFdmVudEZsYWcqIG1FZkdyb3VwOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIFN0cmVhbU91dEhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbU91dD4mIHN0cmVhbSk7CisKKyAgICB2aXJ0dWFsIH5TdHJlYW1PdXRIYWxIaWRsKCk7CisKKyAgICB1c2luZyBXcml0ZXJDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpPjsKKyAgICBzdGF0dXNfdCBjYWxsV3JpdGVyVGhyZWFkKAorICAgICAgICAgICAgV3JpdGVDb21tYW5kIGNtZCwgY29uc3QgY2hhciogY21kTmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhU2l6ZSwgV3JpdGVyQ2FsbGJhY2sgY2FsbGJhY2spOworICAgIHN0YXR1c190IHByZXBhcmVGb3JXcml0aW5nKHNpemVfdCBidWZmZXJTaXplKTsKK307CisKK2NsYXNzIFN0cmVhbUluSGFsSGlkbCA6IHB1YmxpYyBTdHJlYW1JbkhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbEhpZGwgeworICBwdWJsaWM6CisgICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIC8vIFNldCB0aGUgaW5wdXQgZ2FpbiBmb3IgdGhlIGF1ZGlvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEdhaW4oZmxvYXQgZ2Fpbik7CisKKyAgICAvLyBSZWFkIGF1ZGlvIGJ1ZmZlciBpbiBmcm9tIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGFtb3VudCBvZiBpbnB1dCBmcmFtZXMgbG9zdCBpbiB0aGUgYXVkaW8gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KTsKKworICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyByZWNlaXZlZCBhbmQKKyAgICAvLyB0aGUgY2xvY2sgdGltZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBmcmFtZSBjb3VudC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpOworCisgICAgLy8gR2V0IGFjdGl2ZSBtaWNyb3Bob25lcworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOworCisgICAgLy8gU2V0IG1pY3JvcGhvbmUgZGlyZWN0aW9uIChmb3IgcHJvY2Vzc2luZykKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIG92ZXJyaWRlOworCisgICAgLy8gU2V0IG1pY3JvcGhvbmUgem9vbSAoZm9yIHByb2Nlc3NpbmcpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkgb3ZlcnJpZGU7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNpbmsgaGFzIGJlZW4gY2hhbmdlZC4KKyAgICBzdGF0dXNfdCB1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIG92ZXJyaWRlOworCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIERldmljZUhhbEhpZGw7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8UmVhZFBhcmFtZXRlcnMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBDb21tYW5kTVE7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IERhdGFNUTsKKyAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxSZWFkU3RhdHVzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gU3RhdHVzTVE7CisKKyAgICBzcDxJU3RyZWFtSW4+IG1TdHJlYW07CisgICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gbUNvbW1hbmRNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiBtRGF0YU1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gbVN0YXR1c01ROworICAgIHN0ZDo6YXRvbWljPHBpZF90PiBtUmVhZGVyQ2xpZW50OworICAgIEV2ZW50RmxhZyogbUVmR3JvdXA7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgU3RyZWFtSW5IYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1Jbj4mIHN0cmVhbSk7CisKKyAgICB2aXJ0dWFsIH5TdHJlYW1JbkhhbEhpZGwoKTsKKworICAgIHVzaW5nIFJlYWRlckNhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpPjsKKyAgICBzdGF0dXNfdCBjYWxsUmVhZGVyVGhyZWFkKAorICAgICAgICAgICAgY29uc3QgUmVhZFBhcmFtZXRlcnMmIHBhcmFtcywgY29uc3QgY2hhciogY21kTmFtZSwgUmVhZGVyQ2FsbGJhY2sgY2FsbGJhY2spOworICAgIHN0YXR1c190IHByZXBhcmVGb3JSZWFkaW5nKHNpemVfdCBidWZmZXJTaXplKTsKK307CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsTG9jYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MThmZDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbExvY2FsLmNwcApAQCAtMCwwICsxLDM5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiU3RyZWFtSGFsTG9jYWwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgorI2luY2x1ZGUgIlN0cmVhbUhhbExvY2FsLmgiCisjaW5jbHVkZSAiVmVyc2lvblV0aWxzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK1N0cmVhbUhhbExvY2FsOjpTdHJlYW1IYWxMb2NhbChhdWRpb19zdHJlYW1fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQorICAgICAgICA6IG1EZXZpY2UoZGV2aWNlKSwKKyAgICAgICAgICBtU3RyZWFtKHN0cmVhbSkgeworICAgIC8vIEluc3RydW1lbnQgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCisgICAgLy8gTm90ZTogVGhpcyBhc3N1bWVzIGNoYW5uZWwgbWFzaywgZm9ybWF0LCBhbmQgc2FtcGxlIHJhdGUgZG8gbm90IGNoYW5nZSBhZnRlciBjcmVhdGlvbi4KKyAgICBpZiAobVN0cmVhbSAhPSBudWxscHRyIC8qICYmIG1TdHJlYW1Qb3dlckxvZy5pc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSAqLykgeworICAgICAgICBtU3RyZWFtUG93ZXJMb2cuaW5pdChtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSksCisgICAgICAgICAgICAgICAgbVN0cmVhbS0+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+Z2V0X21tYXBfcG9zaXRpb24obVN0cmVhbSwgcG9zaXRpb24pOworfQorCisjaWYgTUFKT1JfVkVSU0lPTiA9PSAyCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMgX191bnVzZWQpIHsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKSB7CisgICAgaWYgKG1TdHJlYW0tPmdldF9hY3RpdmVfbWljcm9waG9uZXMgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHNpemVfdCBhY3R1YWxfbWljcyA9IEFVRElPX01JQ1JPUEhPTkVfTUFYX0NPVU5UOworICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBtaWNfYXJyYXlbQVVESU9fTUlDUk9QSE9ORV9NQVhfQ09VTlRdOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdHJlYW0tPmdldF9hY3RpdmVfbWljcm9waG9uZXMobVN0cmVhbSwgJm1pY19hcnJheVswXSwgJmFjdHVhbF9taWNzKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFjdHVhbF9taWNzOyBpKyspIHsKKyAgICAgICAgbWVkaWE6Ok1pY3JvcGhvbmVJbmZvIG1pY3JvcGhvbmVJbmZvID0gbWVkaWE6Ok1pY3JvcGhvbmVJbmZvKG1pY19hcnJheVtpXSk7CisgICAgICAgIG1pY3JvcGhvbmVzLT5wdXNoX2JhY2sobWljcm9waG9uZUluZm8pOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorI2VuZGlmCisKKyNpZiBNQUpPUl9WRVJTSU9OIDwgNQorc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbigKKyAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uIF9fdW51c2VkKSB7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSBfX3VudXNlZCkgeworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKyNlbHNlCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSB7CisgICAgaWYgKG1TdHJlYW0tPnNldF9taWNyb3Bob25lX2RpcmVjdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnNldF9taWNyb3Bob25lX2RpcmVjdGlvbihtU3RyZWFtLCBkaXJlY3Rpb24pOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkgeworICAgIGlmIChtU3RyZWFtLT5zZXRfbWljcm9waG9uZV9maWVsZF9kaW1lbnNpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zZXRfbWljcm9waG9uZV9maWVsZF9kaW1lbnNpb24obVN0cmVhbSwgem9vbSk7CisKK30KKyNlbmRpZgorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsTG9jYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGYyYmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5oCkBAIC0wLDAgKzEsMjMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfSAorCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSAiU3RyZWFtUG93ZXJMb2cuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworY2xhc3MgRGV2aWNlSGFsTG9jYWw7CisKK2NsYXNzIFN0cmVhbUhhbExvY2FsIDogcHVibGljIHZpcnR1YWwgU3RyZWFtSGFsSW50ZXJmYWNlCit7CisgIHB1YmxpYzoKKyAgICAvLyBSZXR1cm4gdGhlIHNhbXBsaW5nIHJhdGUgaW4gSHogLSBlZy4gNDQxMDAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKTsKKworICAgIC8vIFJldHVybiBzaXplIG9mIGlucHV0L291dHB1dCBidWZmZXIgaW4gYnl0ZXMgZm9yIHRoaXMgc3RyZWFtIC0gZWcuIDQ4MDAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGNoYW5uZWwgbWFzay4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKTsKKworICAgIC8vIFJldHVybiB0aGUgYXVkaW8gZm9ybWF0IC0gZS5nLiBBVURJT19GT1JNQVRfUENNXzE2X0JJVC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKKworICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7CisKKyAgICAvLyBTZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOworCisgICAgLy8gR2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOworCisgICAgLy8gQWRkIG9yIHJlbW92ZSB0aGUgZWZmZWN0IG9uIHRoZSBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKKworICAgIC8vIFB1dCB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQvb3V0cHV0IGludG8gc3RhbmRieSBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhbmRieSgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKKyAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSA9IDA7CisKKyAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgPSAwOworCisgICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgPSAwOworCisgICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pID0gMDsKKworICAgIC8vIFNldCB0aGUgcHJpb3JpdHkgb2YgdGhlIHRocmVhZCB0aGF0IGludGVyYWN0cyB3aXRoIHRoZSBIQUwKKyAgICAvLyAobXVzdCBtYXRjaCB0aGUgcHJpb3JpdHkgb2YgdGhlIGF1ZGlvZmxpbmdlcidzIHRocmVhZCB0aGF0IGNhbGxzICdyZWFkJyAvICd3cml0ZScpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQgcHJpb3JpdHkpOworCisgIHByb3RlY3RlZDoKKyAgICAvLyBTdWJjbGFzc2VzIGNhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBTdHJlYW1IYWxMb2NhbChhdWRpb19zdHJlYW1fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKKworICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBzdHJlYW0uCisgICAgdmlydHVhbCB+U3RyZWFtSGFsTG9jYWwoKTsKKworICAgIHNwPERldmljZUhhbExvY2FsPiBtRGV2aWNlOworCisgICAgLy8gbVN0cmVhbVBvd2VyTG9nIGlzIHVzZWQgZm9yIGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgorICAgIFN0cmVhbVBvd2VyTG9nIG1TdHJlYW1Qb3dlckxvZzsKKworICBwcml2YXRlOgorICAgIGF1ZGlvX3N0cmVhbV90ICptU3RyZWFtOworfTsKKworY2xhc3MgU3RyZWFtT3V0SGFsTG9jYWwgOiBwdWJsaWMgU3RyZWFtT3V0SGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsTG9jYWwgeworICBwdWJsaWM6CisgICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIC8vIFJldHVybiB0aGUgYXVkaW8gaGFyZHdhcmUgZHJpdmVyIGVzdGltYXRlZCBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpOworCisgICAgLy8gVXNlIHRoaXMgbWV0aG9kIGluIHNpdHVhdGlvbnMgd2hlcmUgYXVkaW8gbWl4aW5nIGlzIGRvbmUgaW4gdGhlIGhhcmR3YXJlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKKworICAgIC8vIFNlbGVjdHMgdGhlIGF1ZGlvIHByZXNlbnRhdGlvbiAoaWYgYXZhaWxhYmxlKS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpOworCisgICAgLy8gV3JpdGUgYXVkaW8gYnVmZmVyIHRvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pOworCisgICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdyaXR0ZW4gYnkgdGhlIGF1ZGlvIGRzcCB0byBEQUMgc2luY2UKKyAgICAvLyB0aGUgb3V0cHV0IGhhcyBleGl0ZWQgc3RhbmRieS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpOworCisgICAgLy8gR2V0IHRoZSBsb2NhbCB0aW1lIGF0IHdoaWNoIHRoZSBuZXh0IHdyaXRlIHRvIHRoZSBhdWRpbyBkcml2ZXIgd2lsbCBiZSBwcmVzZW50ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKTsKKworICAgIC8vIFNldCB0aGUgY2FsbGJhY2sgZm9yIG5vdGlmeWluZyBjb21wbGV0aW9uIG9mIG5vbi1ibG9ja2luZyB3cml0ZSBhbmQgZHJhaW4uCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIHBhdXNlIGFuZCByZXN1bWUgb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3VtZSgpOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIGRyYWluIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pOworCisgICAgLy8gUmVxdWVzdHMgbm90aWZpY2F0aW9uIHdoZW4gZGF0YSBidWZmZXJlZCBieSB0aGUgZHJpdmVyL2hhcmR3YXJlIGhhcyBiZWVuIHBsYXllZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGRyYWluKGJvb2wgZWFybHlOb3RpZnkpOworCisgICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byBmbHVzaCB0aGUgcXVldWVkIGRhdGEuCisgICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOworCisgICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHByZXNlbnRlZCB0byBhbiBleHRlcm5hbCBvYnNlcnZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKTsKKworICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOworCisgICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworCisgICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7CisKKyAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNvdXJjZSBoYXMgYmVlbiBjaGFuZ2VkLgorICAgIHN0YXR1c190IHVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZToKKyAgICBhdWRpb19zdHJlYW1fb3V0X3QgKm1TdHJlYW07CisgICAgd3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IG1DYWxsYmFjazsKKworICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxMb2NhbDsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBTdHJlYW1PdXRIYWxMb2NhbChhdWRpb19zdHJlYW1fb3V0X3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7CisKKyAgICB2aXJ0dWFsIH5TdHJlYW1PdXRIYWxMb2NhbCgpOworCisgICAgc3RhdGljIGludCBhc3luY0NhbGxiYWNrKHN0cmVhbV9jYWxsYmFja19ldmVudF90IGV2ZW50LCB2b2lkICpwYXJhbSwgdm9pZCAqY29va2llKTsKK307CisKK2NsYXNzIFN0cmVhbUluSGFsTG9jYWwgOiBwdWJsaWMgU3RyZWFtSW5IYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxMb2NhbCB7CisgIHB1YmxpYzoKKyAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOworCisgICAgLy8gU2V0IHRoZSBpbnB1dCBnYWluIGZvciB0aGUgYXVkaW8gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0R2FpbihmbG9hdCBnYWluKTsKKworICAgIC8vIFJlYWQgYXVkaW8gYnVmZmVyIGluIGZyb20gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKTsKKworICAgIC8vIFJldHVybiB0aGUgYW1vdW50IG9mIGlucHV0IGZyYW1lcyBsb3N0IGluIHRoZSBhdWRpbyBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpOworCisgICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHJlY2VpdmVkIGFuZAorICAgIC8vIHRoZSBjbG9jayB0aW1lIGFzc29jaWF0ZWQgd2l0aCB0aGF0IGZyYW1lIGNvdW50LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSk7CisKKyAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKKworICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOworCisgICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOworCisgICAgLy8gR2V0IGFjdGl2ZSBtaWNyb3Bob25lcworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOworCisgICAgLy8gU2V0cyBtaWNyb3Bob25lIGRpcmVjdGlvbiAoZm9yIHByb2Nlc3NpbmcpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKTsKKworICAgIC8vIFNldHMgbWljcm9waG9uZSB6b29tIChmb3IgcHJvY2Vzc2luZykKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKTsKKworICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc2luayBoYXMgYmVlbiBjaGFuZ2VkLgorICAgIHN0YXR1c190IHVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZToKKyAgICBhdWRpb19zdHJlYW1faW5fdCAqbVN0cmVhbTsKKworICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxMb2NhbDsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBTdHJlYW1JbkhhbExvY2FsKGF1ZGlvX3N0cmVhbV9pbl90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpOworCisgICAgdmlydHVhbCB+U3RyZWFtSW5IYWxMb2NhbCgpOworfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbVBvd2VyTG9nLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbVBvd2VyTG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZkMzkxMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtUG93ZXJMb2cuaApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HX0gKKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Nsb2NrLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvUG93ZXJMb2cuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitjbGFzcyBTdHJlYW1Qb3dlckxvZyB7CitwdWJsaWM6CisgICAgU3RyZWFtUG93ZXJMb2coKSA6CisgICAgICAgIG1Jc1VzZXJEZWJ1Z09yRW5nQnVpbGQoaXNfdXNlcmRlYnVnX29yX2VuZ19idWlsZCgpKSwKKyAgICAgICAgbVBvd2VyTG9nKG51bGxwdHIpLAorICAgICAgICBtRnJhbWVTaXplKDApIHsKKyAgICAgICAgLy8gdXNlIGluaXQoKSB0byBzZXQgdXAgdGhlIHBvd2VyIGxvZy4KKyAgICB9CisKKyAgICB+U3RyZWFtUG93ZXJMb2coKSB7CisgICAgICAgIHBvd2VyX2xvZ19kZXN0cm95KG1Qb3dlckxvZyk7IC8vIE9LIGZvciBudWxsIG1Qb3dlckxvZworICAgICAgICBtUG93ZXJMb2cgPSBudWxscHRyOworICAgIH0KKworICAgIC8vIEEgb25lLXRpbWUgaW5pdGlhbGl6YXRpb24gKGRvIG5vdCBjYWxsIHR3aWNlKSBiZWZvcmUgdXNpbmcgU3RyZWFtUG93ZXJMb2cuCisgICAgdm9pZCBpbml0KHVpbnQzMl90IHNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKKyAgICAgICAgaWYgKG1Qb3dlckxvZyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBOb3RlOiBBIHdheSB0byBnZXQgY2hhbm5lbCBjb3VudCBmb3IgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGNoYW5uZWwgbWFza3MKKyAgICAgICAgICAgIC8vIGJ1dCBkb2VzIG5vdCBjaGVjayB2YWxpZGl0eSBvZiB0aGUgY2hhbm5lbCBtYXNrLgorICAgICAgICAgICAgY29uc3QgdWludDMyX3QgY2hhbm5lbENvdW50ID0gcG9wY291bnQoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKGNoYW5uZWxNYXNrKSk7CisgICAgICAgICAgICBtRnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpOworICAgICAgICAgICAgaWYgKG1GcmFtZVNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0ZyYW1lc1BlckVudHJ5ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpc2FtcGxlUmF0ZSAqIGtQb3dlckxvZ1NhbXBsaW5nSW50ZXJ2YWxNcyAvIDEwMDA7CisgICAgICAgICAgICAgICAgbVBvd2VyTG9nID0gcG93ZXJfbG9nX2NyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBrUG93ZXJMb2dFbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAga1Bvd2VyTG9nRnJhbWVzUGVyRW50cnkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIG1Qb3dlckxvZyBtYXkgYmUgTlVMTCAobm90IHRoZSByaWdodCBidWlsZCwgZm9ybWF0IG5vdCBhY2NlcHRlZCwgZXRjLikuCisgICAgfQorCisgICAgLy8gRHVtcCB0aGUgcG93ZXIgbG9nIHRvIGZkLgorICAgIHZvaWQgZHVtcChpbnQgZmQpIGNvbnN0IHsKKyAgICAgICAgLy8gT0sgZm9yIG51bGwgbVBvd2VyTG9nCisgICAgICAgICh2b2lkKXBvd2VyX2xvZ19kdW1wKAorICAgICAgICAgICAgICAgIG1Qb3dlckxvZywgZmQsICIgICAgICAiIC8qIHByZWZpeCAqLywga1Bvd2VyTG9nTGluZXMsIDAgLyogbGltaXRfbnMgKi8pOworICAgIH0KKworICAgIC8vIExvZyB0aGUgYXVkaW8gZGF0YSBjb250YWluZWQgaW4gYnVmZmVyLgorICAgIHZvaWQgbG9nKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemVJbkJ5dGVzKSBjb25zdCB7CisgICAgICAgIGlmIChtUG93ZXJMb2cgIT0gbnVsbHB0cikgeyAvLyBtRnJhbWVTaXplIGlzIGFsd2F5cyBub256ZXJvIGlmIG1Qb3dlckxvZyBleGlzdHMuCisgICAgICAgICAgICBwb3dlcl9sb2dfbG9nKAorICAgICAgICAgICAgICAgICAgICBtUG93ZXJMb2csIGJ1ZmZlciwgc2l6ZUluQnl0ZXMgLyBtRnJhbWVTaXplLCBhdWRpb191dGlsc19nZXRfcmVhbF90aW1lX25zKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBpc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSXNVc2VyRGVidWdPckVuZ0J1aWxkOworICAgIH0KKworcHJpdmF0ZToKKworICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc191c2VyZGVidWdfb3JfZW5nX2J1aWxkKCkgeworICAgICAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07CisgICAgICAgICh2b2lkKXByb3BlcnR5X2dldCgicm8uYnVpbGQudHlwZSIsIHZhbHVlLCAidW5rbm93biIpOyAvLyBpZ25vcmUgYWN0dWFsIGxlbmd0aAorICAgICAgICByZXR1cm4gc3RyY21wKHZhbHVlLCAidXNlcmRlYnVnIikgPT0gMCB8fCBzdHJjbXAodmFsdWUsICJlbmciKSA9PSAwOworICAgIH0KKworICAgIC8vIEF1ZGlvIHNpZ25hbCBwb3dlciBsb2cgY29uZmlndXJhdGlvbi4KKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0xpbmVzID0gNDA7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMgPSA1MDsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ0VudHJpZXMgPSAoMSAvKiBtaW51dGVzICovICogNjAgLyogc2Vjb25kcyAqLyAqIDEwMDAgLyogbXNlYyAqLworICAgICAgICAgICAgLyBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMpOworCisgICAgY29uc3QgYm9vbCBtSXNVc2VyRGVidWdPckVuZ0J1aWxkOworICAgIHBvd2VyX2xvZ190ICptUG93ZXJMb2c7CisgICAgc2l6ZV90IG1GcmFtZVNpemU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvVmVyc2lvblV0aWxzLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1ZlcnNpb25VdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViMGE0MmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1ZlcnNpb25VdGlscy5oCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfVkVSU0lPTl9VVElMU19ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfVkVSU0lPTl9VVElMU19ICisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vdHlwZXMuaCkKKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6UGFyYW1ldGVyVmFsdWU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlJlc3VsdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CituYW1lc3BhY2UgdXRpbHMgeworCisjaWYgTUFKT1JfVkVSU0lPTiA9PSAyCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQ2FsbGJhY2s+CitSZXR1cm48dm9pZD4gZ2V0UGFyYW1ldGVycyhUJiBvYmplY3QsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiAvKmNvbnRleHQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBrZXlzLCBDYWxsYmFjayBjYWxsYmFjaykgeworICAgIHJldHVybiBvYmplY3QtPmdldFBhcmFtZXRlcnMoa2V5cywgY2FsbGJhY2spOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK1JldHVybjxSZXN1bHQ+IHNldFBhcmFtZXRlcnMoVCYgb2JqZWN0LCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gLypjb250ZXh0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBrZXlzKSB7CisgICAgcmV0dXJuIG9iamVjdC0+c2V0UGFyYW1ldGVycyhrZXlzKTsKK30KKyNlbGlmIE1BSk9SX1ZFUlNJT04gPj0gNAordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIENhbGxiYWNrPgorUmV0dXJuPHZvaWQ+IGdldFBhcmFtZXRlcnMoVCYgb2JqZWN0LCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBrZXlzLCBDYWxsYmFjayBjYWxsYmFjaykgeworICAgIHJldHVybiBvYmplY3QtPmdldFBhcmFtZXRlcnMoY29udGV4dCwga2V5cywgY2FsbGJhY2spOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK1JldHVybjxSZXN1bHQ+IHNldFBhcmFtZXRlcnMoVCYgb2JqZWN0LCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGtleXMpIHsKKyAgICByZXR1cm4gb2JqZWN0LT5zZXRQYXJhbWV0ZXJzKGNvbnRleHQsIGtleXMpOworfQorI2VuZGlmCisKK30gLy8gbmFtZXNwYWNlIHV0aWxzCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9WRVJTSU9OX1VUSUxTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvaW5jbHVkZS9saWJhdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9pbmNsdWRlL2xpYmF1ZGlvaGFsL0ZhY3RvcnlIYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzczMTlkMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvaW5jbHVkZS9saWJhdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRkFDVE9SWV9IQUxfSElETF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRkFDVE9SWV9IQUxfSElETF9ICisKKy8qKiBAZmlsZSBMaWJyYXJ5IGVudHJ5IHBvaW50cyB0byBjcmVhdGUgdGhlIEhBTCBmYWN0b3JpZXMuICovCisKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSBlZmZlY3QgeworbmFtZXNwYWNlIFYyXzAgeworc3A8RWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U+IGNyZWF0ZUVmZmVjdHNGYWN0b3J5SGFsKCk7Cit9IC8vIG5hbWVzcGFjZSBWMl8wCisKK25hbWVzcGFjZSBWNF8wIHsKK3NwPEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlPiBjcmVhdGVFZmZlY3RzRmFjdG9yeUhhbCgpOworfSAvLyBuYW1lc3BhY2UgVjRfMAorCituYW1lc3BhY2UgVjVfMCB7CitzcDxFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZT4gY3JlYXRlRWZmZWN0c0ZhY3RvcnlIYWwoKTsKK30gLy8gbmFtZXNwYWNlIFY1XzAKK30gLy8gbmFtZXNwYWNlIGVmZmVjdAorCituYW1lc3BhY2UgVjJfMCB7CitzcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gY3JlYXRlRGV2aWNlc0ZhY3RvcnlIYWwoKTsKK30gLy8gbmFtZXNwYWNlIFYyXzAKKworbmFtZXNwYWNlIFY0XzAgeworc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IGNyZWF0ZURldmljZXNGYWN0b3J5SGFsKCk7Cit9IC8vIG5hbWVzcGFjZSBWNF8wCisKK25hbWVzcGFjZSBWNV8wIHsKK3NwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBjcmVhdGVEZXZpY2VzRmFjdG9yeUhhbCgpOworfSAvLyBuYW1lc3BhY2UgVjVfMAorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0ZBQ1RPUllfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmgKaW5kZXggN2RlOGViMy4uZTU2NTIzNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oCkBAIC04NCw2ICs4NCw4IEBACiAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICpvdXRwdXREZXZpY2VBZGRyZXNzLAogICAgICAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSkgPSAwOwogCiAgICAgLy8gUmV0dXJucyB3aGV0aGVyIGNyZWF0ZUF1ZGlvUGF0Y2ggYW5kIHJlbGVhc2VBdWRpb1BhdGNoIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oCmluZGV4IDkyNjIyYWEuLjAzMTY1YmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RIYWxJbnRlcmZhY2UuaApAQCAtNTUsNiArNTUsOCBAQAogICAgIC8vIFdoZXRoZXIgaXQncyBhIGxvY2FsIGltcGxlbWVudGF0aW9uLgogICAgIHZpcnR1YWwgYm9vbCBpc0xvY2FsKCkgY29uc3QgPSAwOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCkgPSAwOworCiAgIHByb3RlY3RlZDoKICAgICAvLyBTdWJjbGFzc2VzIGNhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KICAgICBFZmZlY3RIYWxJbnRlcmZhY2UoKSB7fQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmgKaW5kZXggYzk2OWUyOC4uNmMzYjIxYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oCkBAIC0xMDksNiArMTA5LDkgQEAKICAgICAvLyBVc2UgdGhpcyBtZXRob2QgaW4gc2l0dWF0aW9ucyB3aGVyZSBhdWRpbyBtaXhpbmcgaXMgZG9uZSBpbiB0aGUgaGFyZHdhcmUuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpID0gMDsKIAorICAgIC8vIFNlbGVjdHMgdGhlIGF1ZGlvIHByZXNlbnRhdGlvbiAoaWYgYXZhaWxhYmxlKS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpID0gMDsKKwogICAgIC8vIFdyaXRlIGF1ZGlvIGJ1ZmZlciB0byBkcml2ZXIuCiAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKSA9IDA7CiAKQEAgLTE3Niw2ICsxNzksMTIgQEAKICAgICAvLyBHZXQgYWN0aXZlIG1pY3JvcGhvbmVzCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykgPSAwOwogCisgICAgLy8gU2V0IGRpcmVjdGlvbiBmb3IgY2FwdHVyZSBwcm9jZXNzaW5nCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QpID0gMDsKKworICAgIC8vIFNldCB6b29tIGZhY3RvciBmb3IgY2FwdHVyZSBzdHJlYW0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSA9IDA7CisKICAgICBzdHJ1Y3QgU2lua01ldGFkYXRhIHsKICAgICAgICAgc3RkOjp2ZWN0b3I8cmVjb3JkX3RyYWNrX21ldGFkYXRhX3Q+IHRyYWNrczsKICAgICB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjc4MDYzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1OSBAQAorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJhdWRpb3Byb2Nlc3NpbmdfZGVmYXVsdHMiLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW9oYWwiLAorICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm5iYWlvIiwKKyAgICAgICAgImxpYm5ibG9nIiwKKyAgICAgICAgImxpYnNvbmljIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnZpYnJhdG9yIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisKKyAgICAgICAgLy8gdW5jb21tZW50IHRvIGRpc2FibGUgTkVPTiBvbiBhcmNoaXRlY3R1cmVzIHRoYXQgYWN0dWFsbHkgZG8gc3VwcG9ydCBORU9OLCBmb3IgYmVuY2htYXJraW5nCisgICAgICAgIC8vICItRFVTRV9ORU9OPWZhbHNlIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmF1ZGlvcHJvY2Vzc2luZyIsCisgICAgZGVmYXVsdHM6IFsibGliYXVkaW9wcm9jZXNzaW5nX2RlZmF1bHRzIl0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJCdWZmZXJQcm92aWRlcnMuY3BwIiwKKyAgICAgICAgIlJlY29yZEJ1ZmZlckNvbnZlcnRlci5jcHAiLAorICAgIF0sCisgICAgd2hvbGVfc3RhdGljX2xpYnM6IFsibGliYXVkaW9wcm9jZXNzaW5nX2FybSJdLAorfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYmF1ZGlvcHJvY2Vzc2luZ19hcm0iLAorICAgIGRlZmF1bHRzOiBbImxpYmF1ZGlvcHJvY2Vzc2luZ19kZWZhdWx0cyJdLAorCisgICAgc3JjczogWworICAgICAgICAiQXVkaW9NaXhlci5jcHAiLAorICAgICAgICAiQXVkaW9SZXNhbXBsZXIuY3BwIiwKKyAgICAgICAgIkF1ZGlvUmVzYW1wbGVyQ3ViaWMuY3BwIiwKKyAgICAgICAgIkF1ZGlvUmVzYW1wbGVyU2luYy5jcHAiLAorICAgICAgICAiQXVkaW9SZXNhbXBsZXJEeW4uY3BwIiwKKyAgICBdLAorCisgICAgYXJjaDogeworICAgICAgICBhcm06IHsKKyAgICAgICAgICAgIGluc3RydWN0aW9uX3NldDogImFybSIsCisgICAgICAgIH0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BbmRyb2lkLm1rIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMWVjYzIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotICAgIEF1ZGlvTWl4ZXIuY3BwLmFybSBcCi0gICAgQXVkaW9SZXNhbXBsZXIuY3BwLmFybSBcCi0gICAgQXVkaW9SZXNhbXBsZXJDdWJpYy5jcHAuYXJtIFwKLSAgICBBdWRpb1Jlc2FtcGxlclNpbmMuY3BwLmFybSBcCi0gICAgQXVkaW9SZXNhbXBsZXJEeW4uY3BwLmFybSBcCi0gICAgQnVmZmVyUHJvdmlkZXJzLmNwcCBcCi0gICAgUmVjb3JkQnVmZmVyQ29udmVydGVyLmNwcCBcCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoVE9QKSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlIFwKLQotTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ESVJTIDo9ICQoTE9DQUxfUEFUSCkvaW5jbHVkZQotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJhdWRpb2hhbCBcCi0gICAgbGliYXVkaW91dGlscyBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJsb2cgXAotICAgIGxpYm5iYWlvIFwKLSAgICBsaWJuYmxvZyBcCi0gICAgbGlic29uaWMgXAotICAgIGxpYnV0aWxzIFwKLQotTE9DQUxfTU9EVUxFIDo9IGxpYmF1ZGlvcHJvY2Vzc2luZwotCi1MT0NBTF9DRkxBR1MgOj0gLVdlcnJvciAtV2FsbAotCi0jIHVuY29tbWVudCB0byBkaXNhYmxlIE5FT04gb24gYXJjaGl0ZWN0dXJlcyB0aGF0IGFjdHVhbGx5IGRvIHN1cHBvcnQgTkVPTiwgZm9yIGJlbmNobWFya2luZwotI0xPQ0FMX0NGTEFHUyArPSAtRFVTRV9ORU9OPWZhbHNlCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXIuY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXIuY3BwCmluZGV4IGY2ZjgxN2EuLmY3Y2MwOTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb01peGVyLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlci5jcHAKQEAgLTExMywxMCArMTEzLDEwIEBACiAgICAgICAgIC8vIEludGVnZXIgdm9sdW1lLgogICAgICAgICAvLyBDdXJyZW50bHkgaW50ZWdlciB2b2x1bWUgaXMga2VwdCBmb3IgdGhlIGxlZ2FjeSBpbnRlZ2VyIG1peGVyLgogICAgICAgICAvLyBXaWxsIGJlIHJlbW92ZWQgd2hlbiB0aGUgbGVnYWN5IG1peGVyIHBhdGggaXMgcmVtb3ZlZC4KLSAgICAgICAgdC0+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+bUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7CiAgICAgfQogCiAgICAgdHJhY2stPm1JbnB1dEJ1ZmZlclByb3ZpZGVyID0gYnVmZmVyUHJvdmlkZXI7CkBAIC04NzUsNyArMTAyNCw3IEBACiAgICAgICAgICAgICAgICAgdC0+aG9vayA9IFRyYWNrOjpnZXRUcmFja0hvb2soVFJBQ0tUWVBFX1JFU0FNUExFLCB0LT5tTWl4ZXJDaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICB0LT5tTWl4ZXJJbkZvcm1hdCwgdC0+bU1peGVyRm9ybWF0KTsKICAgICAgICAgICAgICAgICBBTE9HVl9JRigobiAmIE5FRURTX0NIQU5ORUxfQ09VTlRfX01BU0spID4gTkVFRFNfQ0hBTk5FTF8yLAotICAgICAgICAgICAgICAgICAgICAgICAgIlRyYWNrICVkIG5lZWRzIGRvd25taXggKyByZXNhbXBsZSIsIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgIlRyYWNrICVkIG5lZWRzIGRvd25taXggKyByZXNhbXBsZSIsIG5hbWUpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoKG4gJiBORUVEU19DSEFOTkVMX0NPVU5UX19NQVNLKSA9PSBORUVEU19DSEFOTkVMXzEpewogICAgICAgICAgICAgICAgICAgICB0LT5ob29rID0gVHJhY2s6OmdldFRyYWNrSG9vaygKQEAgLTg5MCw3ICsxMDM5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgdC0+aG9vayA9IFRyYWNrOjpnZXRUcmFja0hvb2soVFJBQ0tUWVBFX05PUkVTQU1QTEUsIHQtPm1NaXhlckNoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LT5tTWl4ZXJJbkZvcm1hdCwgdC0+bU1peGVyRm9ybWF0KTsKICAgICAgICAgICAgICAgICAgICAgQUxPR1ZfSUYoKG4gJiBORUVEU19DSEFOTkVMX0NPVU5UX19NQVNLKSA+IE5FRURTX0NIQU5ORUxfMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHJhY2sgJWQgbmVlZHMgZG93bm1peCIsIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUcmFjayAlZCBuZWVkcyBkb3dubWl4IiwgbmFtZSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0xMjY0LDggKzE0MTMsOCBAQAogCiAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFjaz4gJnQgPSBtVHJhY2tzW2dyb3VwWzBdXTsKICAgICAgICAgbWVtc2V0KHQtPm1haW5CdWZmZXIsIDAsCi0gICAgICAgICAgICAgICAgbUZyYW1lQ291bnQgKiB0LT5tTWl4ZXJDaGFubmVsQ291bnQKLSAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUodC0+bU1peGVyRm9ybWF0KSk7CisgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQgKiBhdWRpb19ieXRlc19wZXJfZnJhbWUoCisgICAgICAgICAgICAgICAgICAgICAgICB0LT5tTWl4ZXJDaGFubmVsQ291bnQgKyB0LT5tTWl4ZXJIYXB0aWNDaGFubmVsQ291bnQsIHQtPm1NaXhlckZvcm1hdCkpOwogCiAgICAgICAgIC8vIG5vdyBjb25zdW1lIGRhdGEKICAgICAgICAgZm9yIChjb25zdCBpbnQgbmFtZSA6IGdyb3VwKSB7CkBAIC0xNzA0LDYgKzE4NTMsNDAgQEAKICAgICB9CiB9CiAKK3ZvaWQgQXVkaW9NaXhlcjo6cHJvY2Vzc0hhcHRpY0RhdGEoKQoreworICAgIC8vIE5lZWQgdG8ga2VlcCBjb25zaXN0ZW50IHdpdGggVmlicmF0aW9uRWZmZWN0LnNjYWxlKGludCwgZmxvYXQsIGludCkKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnBhaXIgOiBtR3JvdXBzKSB7CisgICAgICAgIC8vIHByb2Nlc3MgYnkgZ3JvdXAgb2YgdHJhY2tzIHdpdGggc2FtZSBvdXRwdXQgbWFpbiBidWZmZXIuCisgICAgICAgIGNvbnN0IGF1dG8gJmdyb3VwID0gcGFpci5zZWNvbmQ7CisgICAgICAgIGZvciAoY29uc3QgaW50IG5hbWUgOiBncm91cCkgeworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdCA9IG1UcmFja3NbbmFtZV07CisgICAgICAgICAgICBpZiAodC0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCkgeworICAgICAgICAgICAgICAgIHNpemVfdCBzYW1wbGVDb3VudCA9IG1GcmFtZUNvdW50ICogdC0+bU1peGVySGFwdGljQ2hhbm5lbENvdW50OworICAgICAgICAgICAgICAgIGZsb2F0IGdhbW1hID0gdC0+Z2V0SGFwdGljU2NhbGVHYW1tYSgpOworICAgICAgICAgICAgICAgIGZsb2F0IG1heEFtcGxpdHVkZVJhdGlvID0gdC0+Z2V0SGFwdGljTWF4QW1wbGl0dWRlUmF0aW8oKTsKKyAgICAgICAgICAgICAgICB1aW50OF90KiBidWZmZXIgPSAodWludDhfdCopcGFpci5maXJzdCArIG1GcmFtZUNvdW50ICogYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgdC0+bU1peGVyQ2hhbm5lbENvdW50LCB0LT5tTWl4ZXJGb3JtYXQpOworICAgICAgICAgICAgICAgIHN3aXRjaCAodC0+bU1peGVyRm9ybWF0KSB7CisgICAgICAgICAgICAgICAgLy8gTWl4ZXIgZm9ybWF0IHNob3VsZCBiZSBBVURJT19GT1JNQVRfUENNX0ZMT0FULgorICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDogeworICAgICAgICAgICAgICAgICAgICBmbG9hdCogZm91dCA9IChmbG9hdCopIGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzYW1wbGVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtdWwgPSBmb3V0W2ldID49IDAgPyAxLjAgOiAtMS4wOworICAgICAgICAgICAgICAgICAgICAgICAgZm91dFtpXSA9IHBvd2YoZmFic2YoZm91dFtpXSAvIEhBUFRJQ19NQVhfQU1QTElUVURFX0ZMT0FUKSwgZ2FtbWEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbWF4QW1wbGl0dWRlUmF0aW8gKiBIQVBUSUNfTUFYX0FNUExJVFVERV9GTE9BVCAqIG11bDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1NaXhlckZvcm1hdDogJSN4IiwgdC0+bU1peGVyRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCiAvKiBUaGlzIHRyYWNrIGhvb2sgaXMgY2FsbGVkIHRvIGRvIHJlc2FtcGxpbmcgdGhlbiBtaXhpbmcsCiAgKiBwdWxsaW5nIGZyb20gdGhlIHRyYWNrJ3MgdXBzdHJlYW0gQXVkaW9CdWZmZXJQcm92aWRlci4KICAqCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmNwcAppbmRleCBlZWVlY2NlLi5lYzU2YjAwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckR5bi5jcHAKQEAgLTIwMSw2ICsyMDEsOCBAQAogICAgICAgICAgICAgInJvLmF1ZGlvLnJlc2FtcGxlci5wc2Quc3RvcGJhbmQiLCBtUHJvcGVydHlTdG9wYmFuZEF0dGVudWF0aW9uKTsKICAgICBtUHJvcGVydHlDdXRvZmZQZXJjZW50ID0gcHJvcGVydHlfZ2V0X2ludDMyKAogICAgICAgICAgICAgInJvLmF1ZGlvLnJlc2FtcGxlci5wc2QuY3V0b2ZmX3BlcmNlbnQiLCBtUHJvcGVydHlDdXRvZmZQZXJjZW50KTsKKyAgICBtUHJvcGVydHlUcmFuc2l0aW9uQmFuZHdpZHRoQ2hlYXQgPSBwcm9wZXJ0eV9nZXRfaW50MzIoCisgICAgICAgICAgICAicm8uYXVkaW8ucmVzYW1wbGVyLnBzZC50YndjaGVhdCIsIG1Qcm9wZXJ0eVRyYW5zaXRpb25CYW5kd2lkdGhDaGVhdCk7CiB9CiAKIHRlbXBsYXRlPHR5cGVuYW1lIFRDLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVE8+CkBAIC0yNDMsNyArMjQ1LDcgQEAKIHsKICAgICAvLyBjb21wdXRlIHRoZSBub3JtYWxpemVkIHRyYW5zaXRpb24gYmFuZHdpZHRoCiAgICAgY29uc3QgZG91YmxlIHRidyA9IGZpckthaXNlclRidyhjLm1IYWxmTnVtQ29lZnMsIHN0b3BCYW5kQXR0ZW4pOwotICAgIGNvbnN0IGRvdWJsZSBoYWxmYncgPSB0YncgLyAyLjsKKyAgICBjb25zdCBkb3VibGUgaGFsZmJ3ID0gdGJ3ICogMC41OwogCiAgICAgZG91YmxlIGZjcjsgLy8gY29tcHV0ZSBmY3IsIHRoZSAzIGRCIGFtcGxpdHVkZSBjdXQtb2ZmLgogICAgIGlmIChpblNhbXBsZVJhdGUgPCBvdXRTYW1wbGVSYXRlKSB7IC8vIHVwc2FtcGxlCkBAIC0yOTAsNyArMjkyLDcgQEAKIAogI2lmIDAKICAgICAvLyBLZWVwIHRoaXMgZGVidWcgY29kZSBpbiBjYXNlIGFuIGFwcCBjYXVzZXMgcmVzYW1wbGVyIGRlc2lnbiBpc3N1ZXMuCi0gICAgY29uc3QgZG91YmxlIGhhbGZidyA9IHRidyAvIDIuOworICAgIGNvbnN0IGRvdWJsZSBoYWxmYncgPSB0YncgKiAwLjU7CiAgICAgLy8gcHJpbnQgYmFzaWMgZmlsdGVyIHN0YXRzCiAgICAgQUxPR0QoIkw6JWQgIGhuYzolZCAgc3RvcEJhbmRBdHRlbjolbGYgIGZjcjolbGYgIGF0dGVuOiVsZiAgdGJ3OiVsZlxuIiwKICAgICAgICAgICAgIGMubUwsIGMubUhhbGZOdW1Db2Vmcywgc3RvcEJhbmRBdHRlbiwgZmNyLCBhdHRlbnVhdGlvbiwgdGJ3KTsKQEAgLTMwNSw3ICszMDcsNyBAQAogCiAgICAgY29uc3QgaW50MzJfdCBwYXNzU3RlcHMgPSAxMDAwOwogCi0gICAgdGVzdEZpcihjb2VmcywgYy5tTCwgYy5tSGFsZk51bUNvZWZzLCBmcCwgZnMsIHBhc3NTdGVwcywgcGFzc1N0ZXBzICogYy5NTCAvKnN0b3BTdGVwcyovLAorICAgIHRlc3RGaXIoY29lZnMsIGMubUwsIGMubUhhbGZOdW1Db2VmcywgZnAsIGZzLCBwYXNzU3RlcHMsIHBhc3NTdGVwcyAqIGMubUwgLypzdG9wU3RlcHMqLywKICAgICAgICAgICAgIHBhc3NNaW4sIHBhc3NNYXgsIHBhc3NSaXBwbGUsIHN0b3BNYXgsIHN0b3BSaXBwbGUpOwogICAgIEFMT0dEKCJwYXNzYmFuZCglbGYsICVsZik6ICUuOGxmICUuOGxmICUuOGxmXG4iLCAwLiwgZnAsIHBhc3NNaW4sIHBhc3NNYXgsIHBhc3NSaXBwbGUpOwogICAgIEFMT0dEKCJzdG9wYmFuZCglbGYsICVsZik6ICUuOGxmICUuM2xmXG4iLCBmcywgMC41LCBzdG9wTWF4LCBzdG9wUmlwcGxlKTsKQEAgLTM3OSwxMiArMzgxLDI4IEBACiAgICAgICAgICAgICBoYWxmTGVuZ3RoID0gbVByb3BlcnR5SGFsZkZpbHRlckxlbmd0aDsKICAgICAgICAgICAgIHN0b3BCYW5kQXR0ZW4gPSBtUHJvcGVydHlTdG9wYmFuZEF0dGVudWF0aW9uOwogICAgICAgICAgICAgdXNlUzMyID0gdHJ1ZTsKLSAgICAgICAgICAgIGZjciA9IG1JblNhbXBsZVJhdGUgPD0gbVNhbXBsZVJhdGUKLSAgICAgICAgICAgICAgICAgICAgPyAwLjUgOiAwLjUgKiBtU2FtcGxlUmF0ZSAvIG1JblNhbXBsZVJhdGU7Ci0gICAgICAgICAgICBmY3IgKj0gbVByb3BlcnR5Q3V0b2ZmUGVyY2VudCAvIDEwMC47CisKKyAgICAgICAgICAgIC8vIFVzZSBlaXRoZXIgdGhlIHN0b3BiYW5kIGxvY2F0aW9uIGZvciBkZXNpZ24gKHRid0NoZWF0KQorICAgICAgICAgICAgLy8gb3IgdXNlIHRoZSAzZEIgY3V0b2ZmIGxvY2F0aW9uIGZvciBkZXNpZ24gKGZjcikuCisgICAgICAgICAgICAvLyBUaGlzIGNob2ljZSBpcyBleGNsdXNpdmUgYW5kIGJhc2VkIG9uIHdoZXRoZXIgZmNyID4gMC4KKyAgICAgICAgICAgIGlmIChtUHJvcGVydHlUcmFuc2l0aW9uQmFuZHdpZHRoQ2hlYXQgIT0gMCkgeworICAgICAgICAgICAgICAgIHRid0NoZWF0ID0gbVByb3BlcnR5VHJhbnNpdGlvbkJhbmR3aWR0aENoZWF0IC8gMTAwLjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZmNyID0gbUluU2FtcGxlUmF0ZSA8PSBtU2FtcGxlUmF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgPyAwLjUgOiAwLjUgKiBtU2FtcGxlUmF0ZSAvIG1JblNhbXBsZVJhdGU7CisgICAgICAgICAgICAgICAgZmNyICo9IG1Qcm9wZXJ0eUN1dG9mZlBlcmNlbnQgLyAxMDAuOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVm9pY2UgcXVhbGl0eSBkZXZpY2VzIGhhdmUgbG93ZXIgc2FtcGxpbmcgcmF0ZXMKKyAgICAgICAgICAgIC8vIChhbmQgbWF5IGJlIGEgY29uc2VxdWVuY2Ugb2YgZG93bnN0cmVhbSBBTVItV0IgLyBHLjcyMiBjb2RlY3MpLgorICAgICAgICAgICAgLy8gRm9yIHRoZXNlIGRldmljZXMsIHdlIGVuc3VyZSBhIHdpZGVyIHJlc2FtcGxlciBwYXNzYmFuZAorICAgICAgICAgICAgLy8gYXQgdGhlIGV4cGVuc2Ugb2YgYWxpYXNpbmcgbm9pc2UgKHN0b3BiYW5kIGF0dGVudWF0aW9uCisgICAgICAgICAgICAvLyBhbmQgc3RvcGJhbmQgZnJlcXVlbmN5KS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBjb25zdGV4cHIgdWludDMyX3Qga1ZvaWNlRGV2aWNlU2FtcGxlUmF0ZSA9IDE2MDAwOworCiAgICAgICAgICAgICBpZiAobUZpbHRlclF1YWxpdHkgPT0gRFlOX0hJR0hfUVVBTElUWSkgewotICAgICAgICAgICAgICAgIC8vIDMyYiBjb2VmZmljaWVudHMsIDY0IGxlbmd0aAorICAgICAgICAgICAgICAgIC8vIGZsb2F0IG9yIDMyYiBjb2VmZmljaWVudHMKICAgICAgICAgICAgICAgICB1c2VTMzIgPSB0cnVlOwogICAgICAgICAgICAgICAgIHN0b3BCYW5kQXR0ZW4gPSA5OC47CiAgICAgICAgICAgICAgICAgaWYgKGluU2FtcGxlUmF0ZSA+PSBtU2FtcGxlUmF0ZSAqIDQpIHsKQEAgLTM5NCw4ICs0MTIsMTggQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoID0gMzI7CiAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1TYW1wbGVSYXRlIDw9IGtWb2ljZURldmljZVNhbXBsZVJhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluU2FtcGxlUmF0ZSA+PSBtU2FtcGxlUmF0ZSAqIDIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggKz0gMTY7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoICs9IDg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RvcEJhbmRBdHRlbiA9IDg0LjsKKyAgICAgICAgICAgICAgICAgICAgdGJ3Q2hlYXQgPSAxLjA1OworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAobUZpbHRlclF1YWxpdHkgPT0gRFlOX0xPV19RVUFMSVRZKSB7Ci0gICAgICAgICAgICAgICAgLy8gMTZiIGNvZWZmaWNpZW50cywgMTYtMzIgbGVuZ3RoCisgICAgICAgICAgICAgICAgLy8gZmxvYXQgb3IgMTZiIGNvZWZmaWNpZW50cwogICAgICAgICAgICAgICAgIHVzZVMzMiA9IGZhbHNlOwogICAgICAgICAgICAgICAgIHN0b3BCYW5kQXR0ZW4gPSA4MC47CiAgICAgICAgICAgICAgICAgaWYgKGluU2FtcGxlUmF0ZSA+PSBtU2FtcGxlUmF0ZSAqIDQpIHsKQEAgLTQwNSwxMyArNDMzLDE4IEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaGFsZkxlbmd0aCA9IDg7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpblNhbXBsZVJhdGUgPD0gbVNhbXBsZVJhdGUpIHsKKyAgICAgICAgICAgICAgICBpZiAobVNhbXBsZVJhdGUgPD0ga1ZvaWNlRGV2aWNlU2FtcGxlUmF0ZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5TYW1wbGVSYXRlID49IG1TYW1wbGVSYXRlICogMikgeworICAgICAgICAgICAgICAgICAgICAgICAgaGFsZkxlbmd0aCArPSA4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRid0NoZWF0ID0gMS4wNTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluU2FtcGxlUmF0ZSA8PSBtU2FtcGxlUmF0ZSkgewogICAgICAgICAgICAgICAgICAgICB0YndDaGVhdCA9IDEuMDU7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgdGJ3Q2hlYXQgPSAxLjAzOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7IC8vIERZTl9NRURfUVVBTElUWQotICAgICAgICAgICAgICAgIC8vIDE2YiBjb2VmZmljaWVudHMsIDMyLTY0IGxlbmd0aAorICAgICAgICAgICAgICAgIC8vIGZsb2F0IG9yIDE2YiBjb2VmZmljaWVudHMKICAgICAgICAgICAgICAgICAvLyBub3RlOiA+IDY0IGxlbmd0aCBmaWx0ZXJzIHdpdGggMTZiIGNvZWZzIGNhbiBoYXZlIHF1YW50aXphdGlvbiBub2lzZSBwcm9ibGVtcwogICAgICAgICAgICAgICAgIHVzZVMzMiA9IGZhbHNlOwogICAgICAgICAgICAgICAgIHN0b3BCYW5kQXR0ZW4gPSA4NC47CkBAIC00MjIsNyArNDU1LDE1IEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaGFsZkxlbmd0aCA9IDE2OwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaW5TYW1wbGVSYXRlIDw9IG1TYW1wbGVSYXRlKSB7CisKKyAgICAgICAgICAgICAgICBpZiAobVNhbXBsZVJhdGUgPD0ga1ZvaWNlRGV2aWNlU2FtcGxlUmF0ZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5TYW1wbGVSYXRlID49IG1TYW1wbGVSYXRlICogMikgeworICAgICAgICAgICAgICAgICAgICAgICAgaGFsZkxlbmd0aCArPSAxNjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggKz0gODsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0YndDaGVhdCA9IDEuMDU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpblNhbXBsZVJhdGUgPD0gbVNhbXBsZVJhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgdGJ3Q2hlYXQgPSAxLjAzOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIHRid0NoZWF0ID0gMS4wMTsKQEAgLTQzMCw2ICs0NzEsMTkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIGlmIChmY3IgPiAwLikgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBtRmlsdGVyUXVhbGl0eTolZCBpblNhbXBsZVJhdGU6JWQgbVNhbXBsZVJhdGU6JWQgaGFsZkxlbmd0aDolZCAiCisgICAgICAgICAgICAgICAgICAgICJzdG9wQmFuZEF0dGVuOiVsZiBmY3I6JWxmIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1GaWx0ZXJRdWFsaXR5LCBpblNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlLCBoYWxmTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICBzdG9wQmFuZEF0dGVuLCBmY3IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBtRmlsdGVyUXVhbGl0eTolZCBpblNhbXBsZVJhdGU6JWQgbVNhbXBsZVJhdGU6JWQgaGFsZkxlbmd0aDolZCAiCisgICAgICAgICAgICAgICAgICAgICJzdG9wQmFuZEF0dGVuOiVsZiB0YndDaGVhdDolbGYiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUZpbHRlclF1YWxpdHksIGluU2FtcGxlUmF0ZSwgbVNhbXBsZVJhdGUsIGhhbGZMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgIHN0b3BCYW5kQXR0ZW4sIHRid0NoZWF0KTsKKyAgICAgICAgfQorCisKICAgICAgICAgLy8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgcG9seXBoYXNlcyBpbiB0aGUgZmlsdGVyYmFuay4KICAgICAgICAgLy8gZm9yIDE2YiwgaXQgaXMgZGVzaXJhYmxlIHRvIGhhdmUgMl4oMTYvMikgPSAyNTYgcGhhc2VzLgogICAgICAgICAvLyBodHRwczovL2Njcm1hLnN0YW5mb3JkLmVkdS9+am9zL3Jlc2FtcGxlL1JlbGF0aW9uX0ludGVycG9sYXRpb25fRXJyb3JfUXVhbnRpemF0aW9uLmh0bWwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckR5bi5oIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmgKaW5kZXggOTIxNDRkMC4uODJiOTUwNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmgKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmgKQEAgLTU1LDYgKzU1LDExIEBACiAgICAgdmlydHVhbCBzaXplX3QgcmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwKICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIHByb3ZpZGVyKTsKIAorICAgIHZvaWQgcmVzZXQoKSBvdmVycmlkZSB7CisgICAgICAgIEF1ZGlvUmVzYW1wbGVyOjpyZXNldCgpOworICAgICAgICBtSW5CdWZmZXIucmVzZXQoKTsKKyAgICB9CisKICAgICAvLyBNYWtlIGF2YWlsYWJsZSBrZXkgZGVzaWduIGNyaXRlcmlhIGZvciB0ZXN0aW5nCiAgICAgaW50IGdldEhhbGZMZW5ndGgoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtQ29uc3RhbnRzLm1IYWxmTnVtQ29lZnM7CkBAIC0xODgsNiArMTkzLDEzIEBACiAgICAgICAgICAgICAgIGludDMyX3QgbVByb3BlcnR5Q3V0b2ZmUGVyY2VudCA9IDEwMDsKICAgICAgICAgICAgICAgICAgICAgICAvLyAicm8uYXVkaW8ucmVzYW1wbGVyLnBzZC5jdXRvZmZfcGVyY2VudCIKIAorICAgICAgICAgICAgICAvLyBTcGVjaWZ5IHRoZSB0cmFuc2l0aW9uIGJhbmR3aWR0aCBleHRlbnNpb24gYmV5b25kIE55cXVpc3QuCisgICAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgbm9uemVybyB0aGVuIG1Qcm9wZXJ0eUN1dG9mZlBlcmNlbnQgaXMgaWdub3JlZC4KKyAgICAgICAgICAgICAgLy8gQSB2YWx1ZSBvZiAxMDAgb3IgZ3JlYXRlciBpcyB0eXBpY2FsbHkgdXNlZCwgd2hlcmUgMTAwIG1lYW5zIHRoZQorICAgICAgICAgICAgICAvLyBzdG9wYmFuZCBpcyBhdCBOeXF1aXN0ICh0aGlzIGlzIGEgdHlwaWNhbCBkZXNpZ24pLgorICAgICAgICAgICAgICBpbnQzMl90IG1Qcm9wZXJ0eVRyYW5zaXRpb25CYW5kd2lkdGhDaGVhdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgLy8gInJvLmF1ZGlvLnJlc2FtcGxlci5wc2QudGJ3Y2hlYXQiCisKICAgICAvLyBGaWx0ZXIgY3JlYXRpb24gZGVzaWduIHBhcmFtZXRlcnMsIHNlZSBzZXRTYW1wbGVSYXRlKCkKICAgICAgICAgICAgICBkb3VibGUgbVN0b3BiYW5kQXR0ZW51YXRpb25EYiA9IDAuOwogICAgICAgICAgICAgIGRvdWJsZSBtUGFzc2JhbmRSaXBwbGVEYiA9IDAuOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRmlyR2VuLmggYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJGaXJHZW4uaAppbmRleCAzOWNhZmViLi4xMDBiYWEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJGaXJHZW4uaAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJGaXJHZW4uaApAQCAtNTQ3LDggKzU0Nyw4IEBACiAgICAgICAgIHdzdGFydCArPSB3c3RlcDsKICAgICB9CiAgICAgLy8gcmVub3JtYWxpemUgLSB0aGlzIGlzIG5lZWRlZCBmb3IgaW50ZWdlciBmaWx0ZXIgdHlwZXMsIHVzZSAxIGZvciBmbG9hdCBvciBkb3VibGUuCi0gICAgY29uc3RleHByIGludDY0X3QgaW50ZWdyYWxTaGlmdCA9IHN0ZDo6aXNfaW50ZWdyYWw8VD46OnZhbHVlID8gKHNpemVvZihUKSAqIDggLSAxKSA6IDA7Ci0gICAgY29uc3QgZG91YmxlIG5vcm0gPSAxLiAvIChMIDw8IGludGVncmFsU2hpZnQpOworICAgIGNvbnN0ZXhwciBpbnQgaW50ZWdyYWxTaGlmdCA9IHN0ZDo6aXNfaW50ZWdyYWw8VD46OnZhbHVlID8gKHNpemVvZihUKSAqIENIQVJfQklUIC0gMSkgOiAwOworICAgIGNvbnN0IGRvdWJsZSBub3JtID0gMS4gLyAoaW50NjRfdHtMfSA8PCBpbnRlZ3JhbFNoaWZ0KTsKIAogICAgIGZpck1pbiA9IGZtaW4gKiBub3JtOwogICAgIGZpck1heCA9IGZtYXggKiBub3JtOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oCmluZGV4IGE3NDE2NzcuLjliNzBhMWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzLmgKQEAgLTkwLDcgKzkwLDcgQEAKICAgICAgICAgQWNjdW11bGF0b3I8Q0hBTk5FTFMtMSwgVE8+OjphY2MoY29lZiwgZGF0YSk7CiAgICAgfQogICAgIGlubGluZSB2b2lkIHZvbHVtZShUTyomIG91dCwgVE8gZ2FpbikgewotICAgICAgICAqb3V0KysgPSB2b2x1bWVBZGp1c3QodmFsdWUsIGdhaW4pOworICAgICAgICAqb3V0KysgKz0gdm9sdW1lQWRqdXN0KHZhbHVlLCBnYWluKTsKICAgICAgICAgQWNjdW11bGF0b3I8Q0hBTk5FTFMtMSwgVE8+Ojp2b2x1bWUob3V0LCBnYWluKTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAKaW5kZXggMzIwYjhjZi4uNWEwM2EwZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyU2luYy5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2RlZmluZSBfX1NURENfQ09OU1RBTlRfTUFDUk9TCiAjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPGRsZmNuLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQnVmZmVyUHJvdmlkZXJzLmNwcCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9CdWZmZXJQcm92aWRlcnMuY3BwCmluZGV4IDJkOWUxY2IuLjIxZDI1ZTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9CdWZmZXJQcm92aWRlcnMuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9CdWZmZXJQcm92aWRlcnMuY3BwCkBAIC0xNyw5ICsxNywxMiBAQAogI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQcm92aWRlciIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KKwogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9mb3JtYXQuaD4KLSNpbmNsdWRlIDxleHRlcm5hbC9zb25pYy9zb25pYy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2NoYW5uZWxzLmg+CisjaW5jbHVkZSA8c29uaWMuaD4KICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RIYWxJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oPgpAQCAtMzUsMTMgKzM4LDYgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0YXRpYyBpbmxpbmUgVCBtaW4oY29uc3QgVCYgYSwgY29uc3QgVCYgYikKLXsKLSAgICByZXR1cm4gYSA8IGIgPyBhIDogYjsKLX0KLQogQ29weUJ1ZmZlclByb3ZpZGVyOjpDb3B5QnVmZmVyUHJvdmlkZXIoc2l6ZV90IGlucHV0RnJhbWVTaXplLAogICAgICAgICBzaXplX3Qgb3V0cHV0RnJhbWVTaXplLCBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCkgOgogICAgICAgICBtSW5wdXRGcmFtZVNpemUoaW5wdXRGcmFtZVNpemUpLApAQCAtNjMsNyArNTksOCBAQAogCiBDb3B5QnVmZmVyUHJvdmlkZXI6On5Db3B5QnVmZmVyUHJvdmlkZXIoKQogewotICAgIEFMT0dWKCJ+Q29weUJ1ZmZlclByb3ZpZGVyKCVwKSIsIHRoaXMpOworICAgIEFMT0dWKCIlcyglcCkgJXp1ICVwICVwIiwKKyAgICAgICAgICAgX19mdW5jX18sIHRoaXMsIG1CdWZmZXIuZnJhbWVDb3VudCwgbVRyYWNrQnVmZmVyUHJvdmlkZXIsIG1Mb2NhbEJ1ZmZlckRhdGEpOwogICAgIGlmIChtQnVmZmVyLmZyYW1lQ291bnQgIT0gMCkgewogICAgICAgICBtVHJhY2tCdWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmbUJ1ZmZlcik7CiAgICAgfQpAQCAtOTgsOCArOTUsOCBAQAogICAgICAgICBtQ29uc3VtZWQgPSAwOwogICAgIH0KICAgICBBTE9HX0FTU0VSVChtQ29uc3VtZWQgPCBtQnVmZmVyLmZyYW1lQ291bnQpOwotICAgIHNpemVfdCBjb3VudCA9IG1pbihtTG9jYWxCdWZmZXJGcmFtZUNvdW50LCBtQnVmZmVyLmZyYW1lQ291bnQgLSBtQ29uc3VtZWQpOwotICAgIGNvdW50ID0gbWluKGNvdW50LCBwQnVmZmVyLT5mcmFtZUNvdW50KTsKKyAgICBzaXplX3QgY291bnQgPSBzdGQ6Om1pbihtTG9jYWxCdWZmZXJGcmFtZUNvdW50LCBtQnVmZmVyLmZyYW1lQ291bnQgLSBtQ29uc3VtZWQpOworICAgIGNvdW50ID0gc3RkOjptaW4oY291bnQsIHBCdWZmZXItPmZyYW1lQ291bnQpOwogICAgIHBCdWZmZXItPnJhdyA9IG1Mb2NhbEJ1ZmZlckRhdGE7CiAgICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IGNvdW50OwogICAgIGNvcHlGcmFtZXMocEJ1ZmZlci0+cmF3LCAodWludDhfdCopbUJ1ZmZlci5yYXcgKyBtQ29uc3VtZWQgKiBtSW5wdXRGcmFtZVNpemUsCkBAIC0xMzMsNiArMTMwLDE2IEBACiAgICAgbUNvbnN1bWVkID0gMDsKIH0KIAordm9pZCBDb3B5QnVmZmVyUHJvdmlkZXI6OnNldEJ1ZmZlclByb3ZpZGVyKEF1ZGlvQnVmZmVyUHJvdmlkZXIgKnApIHsKKyAgICBBTE9HVigiJXMoJXApOiBtVHJhY2tCdWZmZXJQcm92aWRlcjolcCAgbUJ1ZmZlci5mcmFtZUNvdW50OiV6dSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgcCwgbVRyYWNrQnVmZmVyUHJvdmlkZXIsIG1CdWZmZXIuZnJhbWVDb3VudCk7CisgICAgaWYgKG1UcmFja0J1ZmZlclByb3ZpZGVyID09IHApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSAwOworICAgIFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXI6OnNldEJ1ZmZlclByb3ZpZGVyKHApOworfQorCiBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXIoCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGlucHV0Q2hhbm5lbE1hc2ssCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG91dHB1dENoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCkBAIC00NzksNyArNDg2LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIHRpbWUtc3RyZXRjaCB0aGUgZGF0YQotICAgICAgICBkc3RBdmFpbGFibGUgPSBtaW4obUxvY2FsQnVmZmVyRnJhbWVDb3VudCAtIG1SZW1haW5pbmcsIG91dHB1dERlc2lyZWQpOworICAgICAgICBkc3RBdmFpbGFibGUgPSBzdGQ6Om1pbihtTG9jYWxCdWZmZXJGcmFtZUNvdW50IC0gbVJlbWFpbmluZywgb3V0cHV0RGVzaXJlZCk7CiAgICAgICAgIHNpemVfdCBzcmNBdmFpbGFibGUgPSBtQnVmZmVyLmZyYW1lQ291bnQ7CiAgICAgICAgIHByb2Nlc3NGcmFtZXMoKHVpbnQ4X3QqKW1Mb2NhbEJ1ZmZlckRhdGEgKyBtUmVtYWluaW5nICogbUZyYW1lU2l6ZSwgJmRzdEF2YWlsYWJsZSwKICAgICAgICAgICAgICAgICBtQnVmZmVyLnJhdywgJnNyY0F2YWlsYWJsZSk7CkBAIC01MjgsNiArNTM1LDE2IEBACiAgICAgbVJlbWFpbmluZyA9IDA7CiB9CiAKK3ZvaWQgVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjo6c2V0QnVmZmVyUHJvdmlkZXIoQXVkaW9CdWZmZXJQcm92aWRlciAqcCkgeworICAgIEFMT0dWKCIlcyglcCk6IG1UcmFja0J1ZmZlclByb3ZpZGVyOiVwICBtQnVmZmVyLmZyYW1lQ291bnQ6JXp1IiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBwLCBtVHJhY2tCdWZmZXJQcm92aWRlciwgbUJ1ZmZlci5mcmFtZUNvdW50KTsKKyAgICBpZiAobVRyYWNrQnVmZmVyUHJvdmlkZXIgPT0gcCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IDA7CisgICAgUGFzc3RocnVCdWZmZXJQcm92aWRlcjo6c2V0QnVmZmVyUHJvdmlkZXIocCk7Cit9CisKIHN0YXR1c190IFRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXI6OnNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKQogewogICAgIG1QbGF5YmFja1JhdGUgPSBwbGF5YmFja1JhdGU7CkBAIC01NjcsNyArNTg0LDcgQEAKICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgLy8gY3ljbGljYWxseSByZXBlYXQgdGhlIHNvdXJjZS4KICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBjb3VudCA9IDA7IGNvdW50IDwgKmRzdEZyYW1lczsgY291bnQgKz0gKnNyY0ZyYW1lcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmVtYWluaW5nID0gbWluKCpzcmNGcmFtZXMsICpkc3RGcmFtZXMgLSBjb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByZW1haW5pbmcgPSBzdGQ6Om1pbigqc3JjRnJhbWVzLCAqZHN0RnJhbWVzIC0gY291bnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHVpbnQ4X3QqKWRzdEJ1ZmZlciArIG1GcmFtZVNpemUgKiBjb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNCdWZmZXIsIG1GcmFtZVNpemUgKiByZW1haW5pbmcpOwogICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTYwOSw1ICs2MjYsNzIgQEAKICAgICAgICAgfQogICAgIH0KIH0KKworQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcjo6QWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcigKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBzaXplX3QgaW5DaGFubmVsQ291bnQsIHNpemVfdCBvdXRDaGFubmVsQ291bnQsCisgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LCBhdWRpb19mb3JtYXRfdCBjb250cmFjdGVkRm9ybWF0LCB2b2lkKiBjb250cmFjdGVkQnVmZmVyKSA6CisgICAgICAgIENvcHlCdWZmZXJQcm92aWRlcigKKyAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfZnJhbWUoaW5DaGFubmVsQ291bnQsIGZvcm1hdCksCisgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKHN0ZDo6bWF4KGluQ2hhbm5lbENvdW50LCBvdXRDaGFubmVsQ291bnQpLCBmb3JtYXQpLAorICAgICAgICAgICAgICAgIGZyYW1lQ291bnQpLAorICAgICAgICBtRm9ybWF0KGZvcm1hdCksCisgICAgICAgIG1JbkNoYW5uZWxDb3VudChpbkNoYW5uZWxDb3VudCksCisgICAgICAgIG1PdXRDaGFubmVsQ291bnQob3V0Q2hhbm5lbENvdW50KSwKKyAgICAgICAgbVNhbXBsZVNpemVJbkJ5dGVzKGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSksCisgICAgICAgIG1GcmFtZUNvdW50KGZyYW1lQ291bnQpLAorICAgICAgICBtQ29udHJhY3RlZENoYW5uZWxDb3VudChpbkNoYW5uZWxDb3VudCAtIG91dENoYW5uZWxDb3VudCksCisgICAgICAgIG1Db250cmFjdGVkRm9ybWF0KGNvbnRyYWN0ZWRGb3JtYXQpLAorICAgICAgICBtQ29udHJhY3RlZEJ1ZmZlcihjb250cmFjdGVkQnVmZmVyKSwKKyAgICAgICAgbUNvbnRyYWN0ZWRXcml0dGVuRnJhbWVzKDApCit7CisgICAgQUxPR1YoIkFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIoJXApKCUjeCwgJXp1LCAlenUsICV6dSwgJSN4LCAlcCkiLCB0aGlzLCBmb3JtYXQsCisgICAgICAgICAgICBpbkNoYW5uZWxDb3VudCwgb3V0Q2hhbm5lbENvdW50LCBmcmFtZUNvdW50LCBjb250cmFjdGVkRm9ybWF0LCBjb250cmFjdGVkQnVmZmVyKTsKKyAgICBpZiAobUNvbnRyYWN0ZWRGb3JtYXQgIT0gQVVESU9fRk9STUFUX0lOVkFMSUQgJiYgbUluQ2hhbm5lbENvdW50ID4gbU91dENoYW5uZWxDb3VudCkgeworICAgICAgICBtQ29udHJhY3RlZEZyYW1lU2l6ZSA9IGF1ZGlvX2J5dGVzX3Blcl9mcmFtZShtQ29udHJhY3RlZENoYW5uZWxDb3VudCwgbUNvbnRyYWN0ZWRGb3JtYXQpOworICAgIH0KK30KKworc3RhdHVzX3QgQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcjo6Z2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIHBCdWZmZXIpCit7CisgICAgaWYgKG1Db250cmFjdGVkQnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gUmVzdHJpY3QgZnJhbWUgY291bnQgb25seSB3aGVuIGl0IGlzIG5lZWRlZCB0byBzYXZlIGNvbnRyYWN0ZWQgZnJhbWVzLgorICAgICAgICBjb25zdCBzaXplX3Qgb3V0RnJhbWVzTGVmdCA9IG1GcmFtZUNvdW50IC0gbUNvbnRyYWN0ZWRXcml0dGVuRnJhbWVzOworICAgICAgICBpZiAob3V0RnJhbWVzTGVmdCA8IHBCdWZmZXItPmZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgIC8vIFJlc3RyaWN0IHRoZSBmcmFtZSBjb3VudCBzbyB0aGF0IHdlIGRvbid0IHdyaXRlIG92ZXIgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBidWZmZXIuCisgICAgICAgICAgICBwQnVmZmVyLT5mcmFtZUNvdW50ID0gb3V0RnJhbWVzTGVmdDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQ29weUJ1ZmZlclByb3ZpZGVyOjpnZXROZXh0QnVmZmVyKHBCdWZmZXIpOworfQorCit2b2lkIEFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXI6OmNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpCit7CisgICAgaWYgKG1JbkNoYW5uZWxDb3VudCA+IG1PdXRDaGFubmVsQ291bnQpIHsKKyAgICAgICAgLy8gRm9yIGNhc2UgbXVsdGkgdG8gbW9ubywgYWRqdXN0X2NoYW5uZWxzIGhhcyBzcGVjaWFsIGxvZ2ljIHRoYXQgd2lsbCBtaXggZmlyc3QgdHdvIGlucHV0CisgICAgICAgIC8vIGNoYW5uZWxzIGludG8gYSBzaW5nbGUgb3V0cHV0IGNoYW5uZWwuIEluIHRoYXQgY2FzZSwgdXNlIGFkanVzdF9jaGFubmVsc19ub25fZGVzdHJ1Y3RpdmUKKyAgICAgICAgLy8gdG8ga2VlcCBvbmx5IG9uZSBjaGFubmVsIGRhdGEgZXZlbiB3aGVuIGNvbnRyYWN0aW5nIHRvIG1vbm8uCisgICAgICAgIGFkanVzdF9jaGFubmVsc19ub25fZGVzdHJ1Y3RpdmUoc3JjLCBtSW5DaGFubmVsQ291bnQsIGRzdCwgbU91dENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICBtU2FtcGxlU2l6ZUluQnl0ZXMsIGZyYW1lcyAqIG1JbkNoYW5uZWxDb3VudCAqIG1TYW1wbGVTaXplSW5CeXRlcyk7CisgICAgICAgIGlmIChtQ29udHJhY3RlZEZvcm1hdCAhPSBBVURJT19GT1JNQVRfSU5WQUxJRAorICAgICAgICAgICAgJiYgbUNvbnRyYWN0ZWRCdWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGNvbnRyYWN0ZWRJZHggPSBmcmFtZXMgKiBtT3V0Q2hhbm5lbENvdW50ICogbVNhbXBsZVNpemVJbkJ5dGVzOworICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKSBtQ29udHJhY3RlZEJ1ZmZlciArIG1Db250cmFjdGVkV3JpdHRlbkZyYW1lcyAqIG1Db250cmFjdGVkRnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICBtQ29udHJhY3RlZEZvcm1hdCwgKHVpbnQ4X3QqKSBkc3QgKyBjb250cmFjdGVkSWR4LCBtRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBtQ29udHJhY3RlZENoYW5uZWxDb3VudCAqIGZyYW1lcyk7CisgICAgICAgICAgICBtQ29udHJhY3RlZFdyaXR0ZW5GcmFtZXMgKz0gZnJhbWVzOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gUHJlZmVyIGV4cGFuZGluZyBkYXRhIGZyb20gdGhlIGVuZCBvZiBlYWNoIGF1ZGlvIGZyYW1lLgorICAgICAgICBhZGp1c3RfY2hhbm5lbHMoc3JjLCBtSW5DaGFubmVsQ291bnQsIGRzdCwgbU91dENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICBtU2FtcGxlU2l6ZUluQnl0ZXMsIGZyYW1lcyAqIG1JbkNoYW5uZWxDb3VudCAqIG1TYW1wbGVTaXplSW5CeXRlcyk7CisgICAgfQorfQorCit2b2lkIEFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXI6OnJlc2V0KCkKK3sKKyAgICBtQ29udHJhY3RlZFdyaXR0ZW5GcmFtZXMgPSAwOworICAgIENvcHlCdWZmZXJQcm92aWRlcjo6cmVzZXQoKTsKK30KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9SZWNvcmRCdWZmZXJDb252ZXJ0ZXIuY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL1JlY29yZEJ1ZmZlckNvbnZlcnRlci5jcHAKaW5kZXggNTQxNTFmNS4uN2Q2ZmU3MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL1JlY29yZEJ1ZmZlckNvbnZlcnRlci5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL1JlY29yZEJ1ZmZlckNvbnZlcnRlci5jcHAKQEAgLTExNyw2ICsxMTcsMTEgQEAKICAgICAgICAgLy8gZm9ybWF0IGNvbnZlcnQgdG8gZGVzdGluYXRpb24gYnVmZmVyCiAgICAgICAgIGNvbnZlcnRSZXNhbXBsZXIoZHN0LCBtQnVmLCBmcmFtZXMpOwogICAgIH0KKyAgICAvLyBSZWxlYXNlIHVudXNlZCBmcmFtZXMgaW4gdGhlIElucHV0Q29udmVydGVyUHJvdmlkZXIgYnVmZmVyIHNvIHRoYXQKKyAgICAvLyB0aGUgUmVjb3JkVGhyZWFkIGlzIGFibGUgdG8gcHJvcGVybHkgYWNjb3VudCBmb3IgY29uc3VtZWQgZnJhbWVzLgorICAgIGlmIChtSW5wdXRDb252ZXJ0ZXJQcm92aWRlciAhPSBudWxscHRyKSB7CisgICAgICAgIG1JbnB1dENvbnZlcnRlclByb3ZpZGVyLT5yZXNldCgpOworICAgIH0KICAgICByZXR1cm4gZnJhbWVzOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvYXVkaW8tcmVzYW1wbGVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvYXVkaW8tcmVzYW1wbGVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM3MDMxMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9hdWRpby1yZXNhbXBsZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDE1IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmF1ZGlvLXJlc2FtcGxlciIsCisKKyAgICBzcmNzOiBbIkF1ZGlvUmVzYW1wbGVyQ29lZmZpY2llbnRzLmNwcCJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9hdWRpby1yZXNhbXBsZXIvQW5kcm9pZC5tayBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9hdWRpby1yZXNhbXBsZXIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIyODA3Yy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvYXVkaW8tcmVzYW1wbGVyL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotICAgIEF1ZGlvUmVzYW1wbGVyQ29lZmZpY2llbnRzLmNwcAotCi1MT0NBTF9NT0RVTEUgOj0gbGliYXVkaW8tcmVzYW1wbGVyCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgIDo9IGxpYnV0aWxzIGxpYmxvZwotCi1MT0NBTF9DRkxBR1MgKz0gLVdlcnJvciAtV2FsbAotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaAppbmRleCAwNTVmNzI0Li41MGNhMzNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKQEAgLTEwNCw4ICsxMDQsOCBAQAogICAgICAgICBjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcHIyKSB7CiAgICAgcmV0dXJuIGZhYnMocHIxLm1TcGVlZCAtIHByMi5tU3BlZWQpIDwgQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUlOX0RFTFRBICYmCiAgICAgICAgICAgIGZhYnMocHIxLm1QaXRjaCAtIHByMi5tUGl0Y2gpIDwgQVVESU9fVElNRVNUUkVUQ0hfUElUQ0hfTUlOX0RFTFRBICYmCi0gICAgICAgICAgIHByMi5tU3RyZXRjaE1vZGUgPT0gcHIyLm1TdHJldGNoTW9kZSAmJgotICAgICAgICAgICBwcjIubUZhbGxiYWNrTW9kZSA9PSBwcjIubUZhbGxiYWNrTW9kZTsKKyAgICAgICAgICAgcHIxLm1TdHJldGNoTW9kZSA9PSBwcjIubVN0cmV0Y2hNb2RlICYmCisgICAgICAgICAgIHByMS5tRmFsbGJhY2tNb2RlID09IHByMi5tRmFsbGJhY2tNb2RlOwogfQogCiBzdGF0aWMgaW5saW5lIGJvb2wgaXNBdWRpb1BsYXliYWNrUmF0ZVZhbGlkKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZwbGF5YmFja1JhdGUpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk5MDExMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTIgQEAKKy8vIEJ1aWxkIHRoZSB1bml0IHRlc3RzIGZvciBsaWJhdWRpb3Byb2Nlc3NpbmcKKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJhdWRpb3Byb2Nlc3NpbmdfdGVzdF9kZWZhdWx0cyIsCisKKyAgICBoZWFkZXJfbGliczogWyJsaWJiYXNlX2hlYWRlcnMiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW9wcm9jZXNzaW5nIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ2aWJyYXRvciIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKK30KKworLy8KKy8vIHJlc2FtcGxlciB1bml0IHRlc3QKKy8vCitjY190ZXN0IHsKKyAgICBuYW1lOiAicmVzYW1wbGVyX3Rlc3RzIiwKKyAgICBkZWZhdWx0czogWyJsaWJhdWRpb3Byb2Nlc3NpbmdfdGVzdF9kZWZhdWx0cyJdLAorCisgICAgc3JjczogWyJyZXNhbXBsZXJfdGVzdHMuY3BwIl0sCit9CisKKy8vCisvLyBhdWRpbyBtaXhlciB0ZXN0IHRvb2wKKy8vCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJ0ZXN0LW1peGVyIiwKKyAgICBkZWZhdWx0czogWyJsaWJhdWRpb3Byb2Nlc3NpbmdfdGVzdF9kZWZhdWx0cyJdLAorCisgICAgc3JjczogWyJ0ZXN0LW1peGVyLmNwcCJdLAorICAgIHN0YXRpY19saWJzOiBbImxpYnNuZGZpbGUiXSwKK30KKworLy8KKy8vIGJ1aWxkIGF1ZGlvIHJlc2FtcGxlciB0ZXN0IHRvb2wKKy8vCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJ0ZXN0LXJlc2FtcGxlciIsCisgICAgZGVmYXVsdHM6IFsibGliYXVkaW9wcm9jZXNzaW5nX3Rlc3RfZGVmYXVsdHMiXSwKKworICAgIHNyY3M6IFsidGVzdC1yZXNhbXBsZXIuY3BwIl0sCisgICAgc3RhdGljX2xpYnM6IFsibGlic25kZmlsZSJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNlMWMzYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDg3ICswLDAgQEAKLSMgQnVpbGQgdGhlIHVuaXQgdGVzdHMgZm9yIGxpYmF1ZGlvcHJvY2Vzc2luZwotCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLSMKLSMgcmVzYW1wbGVyIHVuaXQgdGVzdAotIwotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmF1ZGlvdXRpbHMgXAotICAgIGxpYmF1ZGlvcHJvY2Vzc2luZyBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJsb2cgXAotICAgIGxpYnV0aWxzIFwKLQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgcmVzYW1wbGVyX3Rlc3RzLmNwcAotCi1MT0NBTF9NT0RVTEUgOj0gcmVzYW1wbGVyX3Rlc3RzCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi0KLUxPQ0FMX0NGTEFHUyA6PSAtV2Vycm9yIC1XYWxsCi0KLWluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKLQotIwotIyBhdWRpbyBtaXhlciB0ZXN0IHRvb2wKLSMKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotICAgIHRlc3QtbWl4ZXIuY3BwIFwKLQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAotICAgIGxpYnNuZGZpbGUgXAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJhdWRpb3Byb2Nlc3NpbmcgXAotICAgIGxpYmF1ZGlvdXRpbHMgXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGlibG9nIFwKLSAgICBsaWJ1dGlscyBcCi0KLUxPQ0FMX01PRFVMRSA6PSB0ZXN0LW1peGVyCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX0NGTEFHUyA6PSAtV2Vycm9yIC1XYWxsCi0KLWluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQotCi0jCi0jIGJ1aWxkIGF1ZGlvIHJlc2FtcGxlciB0ZXN0IHRvb2wKLSMKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotICAgIHRlc3QtcmVzYW1wbGVyLmNwcCBcCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJzbmRmaWxlIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliYXVkaW9wcm9jZXNzaW5nIFwKLSAgICBsaWJhdWRpb3V0aWxzIFwKLSAgICBsaWJjdXRpbHMgXAotICAgIGxpYmxvZyBcCi0gICAgbGlidXRpbHMgXAotCi1MT0NBTF9NT0RVTEUgOj0gdGVzdC1yZXNhbXBsZXIKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfQ0ZMQUdTIDo9IC1XZXJyb3IgLVdhbGwKLQotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvcmVzYW1wbGVyX3Rlc3RzLmNwcCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9yZXNhbXBsZXJfdGVzdHMuY3BwCmluZGV4IGUxNjIzZjcuLjgyOTIyOTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9yZXNhbXBsZXJfdGVzdHMuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9yZXNhbXBsZXJfdGVzdHMuY3BwCkBAIC0yNDYsNyArMjQ2LDggQEAKIH0KIAogdm9pZCB0ZXN0RmlsdGVyUmVzcG9uc2UoCi0gICAgICAgIHNpemVfdCBjaGFubmVscywgdW5zaWduZWQgaW5wdXRGcmVxLCB1bnNpZ25lZCBvdXRwdXRGcmVxKQorICAgICAgICBzaXplX3QgY2hhbm5lbHMsIHVuc2lnbmVkIGlucHV0RnJlcSwgdW5zaWduZWQgb3V0cHV0RnJlcSwKKyAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OnNyY19xdWFsaXR5IHF1YWxpdHkgPSBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX0hJR0hfUVVBTElUWSkKIHsKICAgICAvLyBjcmVhdGUgcmVzYW1wbGVyCiAgICAgdXNpbmcgUmVzYW1wbGVyVHlwZSA9IGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyRHluPGZsb2F0LCBmbG9hdCwgZmxvYXQ+OwpAQCAtMjU2LDcgKzI1Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV9GTE9BVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRGcmVxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fSElHSF9RVUFMSVRZKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YWxpdHkpKSk7CiAgICAgcmR5bi0+c2V0U2FtcGxlUmF0ZShpbnB1dEZyZXEpOwogCiAgICAgLy8gZ2V0IGRlc2lnbiBwYXJhbWV0ZXJzCkBAIC0yNjgsMTcgKzI2OSwyMCBAQAogICAgIGNvbnN0IGRvdWJsZSBhdHRlbnVhdGlvbiA9IHJkeW4tPmdldEZpbHRlckF0dGVudWF0aW9uKCk7CiAgICAgY29uc3QgZG91YmxlIHN0b3BiYW5kRGIgPSByZHluLT5nZXRTdG9wYmFuZEF0dGVudWF0aW9uRGIoKTsKICAgICBjb25zdCBkb3VibGUgcGFzc2JhbmREYiA9IHJkeW4tPmdldFBhc3NiYW5kUmlwcGxlRGIoKTsKLSAgICBjb25zdCBkb3VibGUgZnAgPSBmY3IgLSB0YncgLyAyOwotICAgIGNvbnN0IGRvdWJsZSBmcyA9IGZjciArIHRidyAvIDI7CisgICAgY29uc3QgZG91YmxlIGZwID0gZmNyIC0gdGJ3ICogMC41OworICAgIGNvbnN0IGRvdWJsZSBmcyA9IGZjciArIHRidyAqIDAuNTsKKyAgICBjb25zdCBkb3VibGUgaWRlYWxmcyA9IGlucHV0RnJlcSA8PSBvdXRwdXRGcmVxCisgICAgICAgID8gMC41ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwc2FtcGxlCisgICAgICAgIDogMC41ICogb3V0cHV0RnJlcSAgLyBpbnB1dEZyZXE7IC8vIGRvd25zYW1wbGUKIAotICAgIHByaW50ZigiaW5wdXRGcmVxOiVkIG91dHB1dEZyZXE6JWQgZGVzaWduIgorICAgIHByaW50ZigiaW5wdXRGcmVxOiVkIG91dHB1dEZyZXE6JWQgZGVzaWduIHF1YWxpdHkgJWQiCiAgICAgICAgICAgICAiIHBoYXNlczolZCBoYWxmTGVuZ3RoOiVkIgotICAgICAgICAgICAgIiBmY3I6JWxmIGZwOiVsZiBmczolbGYgdGJ3OiVsZiIKKyAgICAgICAgICAgICIgZmNyOiVsZiBmcDolbGYgZnM6JWxmIHRidzolbGYgZmNycDolbGYiCiAgICAgICAgICAgICAiIGF0dGVudWF0aW9uOiVsZiBzdG9wUmlwcGxlOiUubGYgcGFzc1JpcHBsZTolbGYiCiAgICAgICAgICAgICAiXG4iLAotICAgICAgICAgICAgaW5wdXRGcmVxLCBvdXRwdXRGcmVxLAorICAgICAgICAgICAgaW5wdXRGcmVxLCBvdXRwdXRGcmVxLCBxdWFsaXR5LAogICAgICAgICAgICAgcGhhc2VzLCBoYWxmTGVuZ3RoLAotICAgICAgICAgICAgZmNyLCBmcCwgZnMsIHRidywKKyAgICAgICAgICAgIGZjciwgZnAsIGZzLCB0YncsIGZjciAqIDEwMC4gLyBpZGVhbGZzLAogICAgICAgICAgICAgYXR0ZW51YXRpb24sIHN0b3BiYW5kRGIsIHBhc3NiYW5kRGIpOwogCiAgICAgLy8gdmVyaWZ5IGRlc2lnbiBwYXJhbWV0ZXJzCkBAIC01NDEsOCArNTQ1LDM2IEBACiAgICAgfQogfQogCi1URVNUKGF1ZGlvZmxpbmdlcl9yZXNhbXBsZXIsIGZpbHRlcnJlc3BvbnNlKSB7Ci0gICAgc3RkOjp2ZWN0b3I8aW50PiBpblNhbXBsZVJhdGVzeworLy8gU2VsZWN0ZWQgZG93bnNhbXBsaW5nIHJlc3BvbnNlcyBmb3IgdmFyaW91cyBmcmVxdWVuY2llcyByZWxhdGluZyB0byBoZWFyaW5nIGFpZC4KK1RFU1QoYXVkaW9mbGluZ2VyX3Jlc2FtcGxlciwgZG93bnNhbXBsaW5ncmVzcG9uc2UpIHsKKyAgICBzdGF0aWMgY29uc3RleHByIGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpzcmNfcXVhbGl0eSBxdWFsaXRpZXNbXSA9IHsKKyAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9MT1dfUVVBTElUWSwKKyAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9NRURfUVVBTElUWSwKKyAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9ISUdIX1FVQUxJVFksCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3RleHByIGludCBpblNhbXBsZVJhdGVzW10gPSB7CisgICAgICAgIDMyMDAwLAorICAgICAgICA0NDEwMCwKKyAgICAgICAgNDgwMDAsCisgICAgfTsKKyAgICBzdGF0aWMgY29uc3RleHByIGludCBvdXRTYW1wbGVSYXRlc1tdID0geworICAgICAgICAxNjAwMCwKKyAgICAgICAgMjQwMDAsCisgICAgfTsKKworICAgIGZvciAoYXV0byBxdWFsaXR5IDogcXVhbGl0aWVzKSB7CisgICAgICAgIGZvciAoaW50IG91dFNhbXBsZVJhdGUgOiBvdXRTYW1wbGVSYXRlcykgeworICAgICAgICAgICAgZm9yIChpbnQgaW5TYW1wbGVSYXRlIDogaW5TYW1wbGVSYXRlcykgeworICAgICAgICAgICAgICAgIHRlc3RGaWx0ZXJSZXNwb25zZSgyIC8qIGNoYW5uZWxzICovLCBpblNhbXBsZVJhdGUsIG91dFNhbXBsZVJhdGUsIHF1YWxpdHkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvLyBHZW5lcmFsIHJlc3BvbnNlcyBmb3IgdHlwaWNhbCBvdXRwdXQgZGV2aWNlIHNjZW5hcmlvcyAtIDQ0LjEsIDQ4LCA5NiBrSHoKKy8vICg0OCwgOTYgYXJlIHBhcnQgb2YgdGhlIHNhbWUgcmVzYW1wbGVyIGdlbmVyYXRpb24gZmFtaWx5KS4KK1RFU1QoYXVkaW9mbGluZ2VyX3Jlc2FtcGxlciwgZ2VuZXJhbHJlc3BvbnNlKSB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgaW5TYW1wbGVSYXRlc1tdID0gewogICAgICAgICA4MDAwLAogICAgICAgICAxMTAyNSwKICAgICAgICAgMTIwMDAsCkBAIC01NTcsNyArNTg5LDggQEAKICAgICAgICAgMTc2NDAwLAogICAgICAgICAxOTIwMDAsCiAgICAgfTsKLSAgICBzdGQ6OnZlY3RvcjxpbnQ+IG91dFNhbXBsZVJhdGVzeworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG91dFNhbXBsZVJhdGVzW10gPSB7CisgICAgICAgIDQ0MTAwLAogICAgICAgICA0ODAwMCwKICAgICAgICAgOTYwMDAsCiAgICAgfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy90ZXN0LXJlc2FtcGxlci5jcHAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvdGVzdC1yZXNhbXBsZXIuY3BwCmluZGV4IGZiYzkzMjYuLmYxNzhiZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy90ZXN0LXJlc2FtcGxlci5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL3Rlc3QtcmVzYW1wbGVyLmNwcApAQCAtMjcsNiArMjcsNyBAQAogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvc25kZmlsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXIuaD4KQEAgLTg3LDE0ICs4OCwxNCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gbnVtVmFsdWVzOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICAgICAgY2FzZSAnLCc6CiAgICAgICAgICAgICBpZiAoaGFkRGlnaXQpIHsKICAgICAgICAgICAgICAgICBoYWREaWdpdCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIG51bVZhbHVlcysrOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL3Rlc3RfdXRpbHMuaCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy90ZXN0X3V0aWxzLmgKaW5kZXggYjYxYTkyOS4uMjFmNTg2MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL3Rlc3RfdXRpbHMuaAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvdGVzdF91dGlscy5oCkBAIC0yMyw2ICsyMyw3IEBACiAKICNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvc25kZmlsZS5oPgogCiAjaWZuZGVmIEFSUkFZX1NJWkUKQEAgLTc3LDE0ICs3OCwxNCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gbnVtVmFsdWVzOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICAgICAgY2FzZSAnLCc6CiAgICAgICAgICAgICBpZiAoaGFkRGlnaXQpIHsKICAgICAgICAgICAgICAgICBoYWREaWdpdCA9IGZhbHNlOwogICAgICAgICAgICAgICAgIG51bVZhbHVlcysrOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGQzZjE3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXN1YmRpcnMgPSBbImZhY3RvcnkiLCAiY29uZmlnIl0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL3NyYy9FZmZlY3RzQ29uZmlnLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL3NyYy9FZmZlY3RzQ29uZmlnLmNwcAppbmRleCAzNTFiMWVlLi5mMzllYjBjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9zcmMvRWZmZWN0c0NvbmZpZy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvc3JjL0VmZmVjdHNDb25maWcuY3BwCkBAIC0xMTUsNiArMTE1LDcgQEAKICAgICAgICAge0FVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiwgInZvaWNlX3JlY29nbml0aW9uIn0sCiAgICAgICAgIHtBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiwgInZvaWNlX2NvbW11bmljYXRpb24ifSwKICAgICAgICAge0FVRElPX1NPVVJDRV9VTlBST0NFU1NFRCwgInVucHJvY2Vzc2VkIn0sCisgICAgICAgIHtBVURJT19TT1VSQ0VfVk9JQ0VfUEVSRk9STUFOQ0UsICJ2b2ljZV9wZXJmb3JtYW5jZSJ9LAogfTsKIAogLyoqIEZpbmQgdGhlIHN0cmVhbSB0eXBlIGVudW0gY29ycmVzcG9uZGluZyB0byB0aGUgc3RyZWFtIHR5cGUgbmFtZSBvciByZXR1cm4gZmFsc2UgKi8KQEAgLTMwNSw3ICszMDYsNyBAQAogICAgICAgICByZXR1cm4gcGFyc2VXaXRoUGF0aChwYXRoKTsKICAgICB9CiAKLSAgICBmb3IgKHN0ZDo6c3RyaW5nIGxvY2F0aW9uIDogREVGQVVMVF9MT0NBVElPTlMpIHsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nJiBsb2NhdGlvbiA6IERFRkFVTFRfTE9DQVRJT05TKSB7CiAgICAgICAgIHN0ZDo6c3RyaW5nIGRlZmF1bHRQYXRoID0gbG9jYXRpb24gKyAnLycgKyBERUZBVUxUX05BTUU7CiAgICAgICAgIGlmIChhY2Nlc3MoZGVmYXVsdFBhdGguY19zdHIoKSwgUl9PSykgIT0gMCkgewogICAgICAgICAgICAgY29udGludWU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljODJiMWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvQW5kcm9pZC5icApAQCAtMCwwICsxLDI3IEBACisvLyBNdWx0aWNoYW5uZWwgZG93bm1peCBlZmZlY3QgbGlicmFyeQorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJkb3dubWl4IiwKKworICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmNzOiBbIkVmZmVjdERvd25taXguYyJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJzb3VuZGZ4IiwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURCVUlMRF9GTE9BVCIsCisgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9lZmZlY3RzIiwKKyAgICAgICAgImxpYmhhcmR3YXJlX2hlYWRlcnMiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsibGliYXVkaW91dGlscyIgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZmJmMTQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIyBNdWx0aWNoYW5uZWwgZG93bm1peCBlZmZlY3QgbGlicmFyeQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotCUVmZmVjdERvd25taXguYwotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLQlsaWJjdXRpbHMgbGlibG9nCi0KLUxPQ0FMX01PRFVMRTo9IGxpYmRvd25taXgKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gc291bmRmeAotCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLQkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykgXAotCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKLQotIy1EQlVJTERfRkxPQVQKLUxPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCi1MT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgotCi1MT0NBTF9IRUFERVJfTElCUkFSSUVTICs9IGxpYmhhcmR3YXJlX2hlYWRlcnMKLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmMgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jCmluZGV4IGI0YTFkNzcuLjk5YWM0ZjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguYwpAQCAtMzEsMTAgKzMxLDEyIEBACiAvLyBEbyBub3Qgc3VibWl0IHdpdGggRE9XTk1JWF9BTFdBWVNfVVNFX0dFTkVSSUNfRE9XTk1JWEVSIGRlZmluZWQsIHN0cmljdGx5IGZvciB0ZXN0aW5nCiAvLyNkZWZpbmUgRE9XTk1JWF9BTFdBWVNfVVNFX0dFTkVSSUNfRE9XTk1JWEVSIDAKIAotI2RlZmluZSBNSU5VU18zX0RCX0lOX1ExOV8xMiAyODk2IC8vIC0zZEIgPSAwLjcwNyAqIDJeMTIgPSAyODk2Ci0KICNpZmRlZiBCVUlMRF9GTE9BVAogI2RlZmluZSBNSU5VU18zX0RCX0lOX0ZMT0FUIDAuNzA3MTA2NzhmIC8vIC0zZEIgPSAwLjcwNzEwNjc4ZgorY29uc3QgYXVkaW9fZm9ybWF0X3QgZ1RhcmdldEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisjZWxzZQorI2RlZmluZSBNSU5VU18zX0RCX0lOX1ExOV8xMiAyODk2IC8vIC0zZEIgPSAwLjcwNyAqIDJeMTIgPSAyODk2Citjb25zdCBhdWRpb19mb3JtYXRfdCBnVGFyZ2V0Rm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAjZW5kaWYKIAogLy8gc3Vic2V0IG9mIHBvc3NpYmxlIGF1ZGlvX2NoYW5uZWxfbWFza190IHZhbHVlcywgYW5kIEFVRElPX0NIQU5ORUxfT1VUXyogcmVuYW1lZCB0byBDSEFOTkVMX01BU0tfKgpAQCAtNzAzLDcgKzcwNSw3IEBACiAgICAgbWVtc2V0KCZwRHdtTW9kdWxlLT5jb250ZXh0LCAwLCBzaXplb2YoZG93bm1peF9vYmplY3RfdCkpOwogCiAgICAgcER3bU1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOwotICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuZm9ybWF0ID0gZ1RhcmdldEZvcm1hdDsKICAgICBwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF83UE9JTlQxOwogICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwogICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKQEAgLTcxNSw3ICs3MTcsNyBAQAogCiAgICAgLy8gc2V0IGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGFjY2VzcyBtb2RlLCBidXQgc2hvdWxkIGJlIG92ZXJ3cml0dGVuIGJ5IGNhbGxlcgogICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEU7Ci0gICAgcER3bU1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBwRHdtTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IGdUYXJnZXRGb3JtYXQ7CiAgICAgcER3bU1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKICAgICBwRHdtTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CiAgICAgcER3bU1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKQEAgLTc2Miw4ICs3NjQsOCBAQAogICAgIC8vIENoZWNrIGNvbmZpZ3VyYXRpb24gY29tcGF0aWJpbGl0eSB3aXRoIGJ1aWxkIG9wdGlvbnMsIGFuZCBlZmZlY3QgY2FwYWJpbGl0aWVzCiAgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSAhPSBwQ29uZmlnLT5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlCiAgICAgICAgIHx8IHBDb25maWctPm91dHB1dENmZy5jaGFubmVscyAhPSBET1dOTUlYX09VVFBVVF9DSEFOTkVMUwotICAgICAgICB8fCBwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQKLSAgICAgICAgfHwgcENvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCAhPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgeworICAgICAgICB8fCBwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0gZ1RhcmdldEZvcm1hdAorICAgICAgICB8fCBwQ29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0ICE9IGdUYXJnZXRGb3JtYXQpIHsKICAgICAgICAgQUxPR0UoIkRvd25taXhfQ29uZmlndXJlIGVycm9yOiBpbnZhbGlkIGNvbmZpZyIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CkBAIC0xMTg1LDggKzExODcsOCBAQAogICAgIGlmIChhY2N1bXVsYXRlKSB7CiAgICAgICAgIHdoaWxlIChudW1GcmFtZXMpIHsKICAgICAgICAgICAgIC8vIGNlbnRlclBsdXNMZmVDb250cmliID0gRkMoLTNkQikgKyBMRkUoLTNkQikKLSAgICAgICAgICAgIGNlbnRlclBsdXNMZmVDb250cmliID0gKHBTcmNbMl0gKiBNSU5VU18zX0RCX0lOX1ExOV8xMikKLSAgICAgICAgICAgICAgICAgICAgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fUTE5XzEyKTsKKyAgICAgICAgICAgIGNlbnRlclBsdXNMZmVDb250cmliID0gKHBTcmNbMl0gKiBNSU5VU18zX0RCX0lOX0ZMT0FUKQorICAgICAgICAgICAgICAgICAgICArIChwU3JjWzNdICogTUlOVVNfM19EQl9JTl9GTE9BVCk7CiAgICAgICAgICAgICAvLyBGTCArIGNlbnRlclBsdXNMZmVDb250cmliICsgU0wgKyBSTAogICAgICAgICAgICAgbHQgPSBwU3JjWzBdICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBwU3JjWzZdICsgcFNyY1s0XTsKICAgICAgICAgICAgIC8vIEZSICsgY2VudGVyUGx1c0xmZUNvbnRyaWIgKyBTUiArIFJSCkBAIC0xNDI3LDQgKzE0MjksNCBAQAogICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKIH0KLSNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvdGVzdHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2FmYzU0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMCBAQAorLy8gQnVpbGQgdGVzdGJlbmNoIGZvciBkb3dubWl4IG1vZHVsZS4KK2NjX3Rlc3QgeworICAgIG5hbWU6ImRvd25taXh0ZXN0IiwKKyAgICBob3N0X3N1cHBvcnRlZDogZmFsc2UsCisgICAgcHJvcHJpZXRhcnk6IHRydWUsCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvZG93bm1peCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2VmZmVjdHMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJkb3dubWl4IiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogInNvdW5kZngiLAorCisgICAgc3JjczogWworICAgICAgICAiZG93bm1peHRlc3QuY3BwIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaCBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmQwZmFlYmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaApAQCAtMCwwICsxLDY5IEBACisjIS9iaW4vYmFzaAorIworI1J1biB0ZXN0cyBpbiB0aGlzIGRpcmVjdG9yeS4KKyMKKworaWYgWyAteiAiJEFORFJPSURfQlVJTERfVE9QIiBdOyB0aGVuCisgICAgZWNobyAiQW5kcm9pZCBidWlsZCBlbnZpcm9ubWVudCBub3Qgc2V0IgorICAgIGV4aXQgLTEKK2ZpCisjZW5zdXJlIHdlIGhhdmUgbW0KKy4gJEFORFJPSURfQlVJTERfVE9QL2J1aWxkL2VudnNldHVwLnNoCisKK21tIC1qCisKK2VjaG8gIndhaXRpbmcgZm9yIGRldmljZSIKKworYWRiIHJvb3QgJiYgYWRiIHdhaXQtZm9yLWRldmljZSByZW1vdW50CisKKyNsb2NhdGlvbiBvZiB0ZXN0IGZpbGVzCit0ZXN0ZGlyPSIvZGF0YS9sb2NhbC90bXAvZG93bm1peHRlc3QiCisKK2ZzX2Fycj0oCisgICAgODAwMAorICAgIDExMDI1CisgICAgMTIwMDAKKyAgICAxNjAwMAorICAgIDIyMDUwCisgICAgMjQwMDAKKyAgICAzMjAwMAorICAgIDQ0MTAwCisgICAgNDgwMDAKKyAgICA4ODIwMAorICAgIDk2MDAwCisgICAgMTc2NDAwCisgICAgMTkyMDAwCispCisKK2VjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCitlY2hvICJ0ZXN0aW5nIERvd25taXgiCithZGIgc2hlbGwgbWtkaXIgJHRlc3RkaXIKKworYWRiIHB1c2ggJEFORFJPSURfQlVJTERfVE9QL2N0cy90ZXN0cy90ZXN0cy9tZWRpYS9yZXMvcmF3L3NpbmVzd2VlcHJhdy5yYXcgXAorJHRlc3RkaXIKK2FkYiBwdXNoICRPVVQvdGVzdGNhc2VzL2Rvd25taXh0ZXN0L2FybTY0L2Rvd25taXh0ZXN0ICR0ZXN0ZGlyCisKKyNydW4gdGhlIGRvd25taXggdGVzdCBhcHBsaWNhdGlvbiBmb3IgdGVzdC4KK2ZvciBmcyBpbiAke2ZzX2FyclsqXX0KK2RvCisgICAgZm9yIGZfY2ggaW4gezEuLjh9CisgICAgZG8KKyAgICAgICAgZm9yIGNoX2ZtdCBpbiB7MC4uNH0KKyAgICAgICAgZG8KKyAgICAgICAgICAgIGFkYiBzaGVsbCAgTERfTElCUkFSWV9QQVRIPS92ZW5kb3IvbGliNjQvc291bmRmeCBcCisgICAgICAgICAgICAkdGVzdGRpci9kb3dubWl4dGVzdCAkdGVzdGRpci9zaW5lc3dlZXByYXcucmF3IFwKKyAgICAgICAgICAgICR0ZXN0ZGlyL3NpbmVzd2VlcF9mbXRfJCgoY2hfZm10KSlfZmNoXyQoKGZfY2gpKV8kKChmcykpLnJhdyBcCisgICAgICAgICAgICAtY2hfZm10OiRjaF9mbXQgLWZjaDokZl9jaCAtZnM6JGZzCisKKyAgICAgICAgICAgICMgSW1wbGVtZW50YXRpb24gZGVwZW5kZW50IHRlc3Q6CisgICAgICAgICAgICAjIGNoZWNrIHRoYXQgaGlnaGVyIGZyZXF1ZW5jaWVzIG1hdGNoIDgga0h6IHJlc3VsdC4KKyAgICAgICAgICAgIGlmIFsgJGZzICE9IDgwMDAgXQorICAgICAgICAgICAgdGhlbgorICAgICAgICAgICAgICAgIGFkYiBzaGVsbCBjbXAgXAorICAgICAgICAgICAgICAgICR0ZXN0ZGlyL3NpbmVzd2VlcF9mbXRfJCgoY2hfZm10KSlfZmNoXyQoKGZfY2gpKV84MDAwLnJhdyBcCisgICAgICAgICAgICAgICAgJHRlc3RkaXIvc2luZXN3ZWVwX2ZtdF8kKChjaF9mbXQpKV9mY2hfJCgoZl9jaCkpXyQoKGZzKSkucmF3CisgICAgICAgICAgICBmaQorICAgICAgICBkb25lCisgICAgZG9uZQorZG9uZQorYWRiIHNoZWxsIHJtIC1yICR0ZXN0ZGlyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvdGVzdHMvZG93bm1peHRlc3QuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL2Rvd25taXh0ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWY4M2U1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL2Rvd25taXh0ZXN0LmNwcApAQCAtMCwwICsxLDMwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9kb3dubWl4Lmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2hhbm5lbHMuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCisjaW5jbHVkZSAiRWZmZWN0RG93bm1peC5oIgorI2RlZmluZSBGUkFNRV9MRU5HVEggMjU2CisjZGVmaW5lIE1BWF9OVU1fQ0hBTk5FTFMgOAorCitzdHJ1Y3QgZG93bm1peF9jbnR4dF9zIHsKKyAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjOworICBlZmZlY3RfaGFuZGxlX3QgaGFuZGxlOworICBlZmZlY3RfY29uZmlnX3QgY29uZmlnOworCisgIGludCBudW1GaWxlQ2hhbm5lbHM7CisgIGludCBudW1Qcm9jZXNzQ2hhbm5lbHM7Cit9OworCitleHRlcm4gYXVkaW9fZWZmZWN0X2xpYnJhcnlfdCBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTTsKKwordm9pZCBwcmludFVzYWdlKCkgeworICBwcmludGYoIlxuVXNhZ2U6Iik7CisgIHByaW50ZigiXG4gICAgIGRvd25taXh0ZXN0IDxpbnB1dF9maWxlPiA8b3V0X2ZpbGU+IFtvcHRpb25zXVxuIik7CisgIHByaW50ZigiXG53aGVyZSwiKTsKKyAgcHJpbnRmKCJcbiAgICAgPGlucHV0X2ZpbGU+ICBpcyB0aGUgaW5wdXQgZmlsZSBuYW1lIik7CisgIHByaW50ZigiXG4gICAgICAgICAgICAgICAgICBvbiB3aGljaCBMVk0gZWZmZWN0cyBhcmUgYXBwbGllZCIpOworICBwcmludGYoIlxuICAgICA8b3V0cHV0X2ZpbGU+IHByb2Nlc3NlZCBvdXRwdXQgZmlsZSIpOworICBwcmludGYoIlxuICAgICBhbmQgb3B0aW9ucyBhcmUgbWVudGlvbmVkIGJlbG93Iik7CisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCJcbiAgICAgIC1oIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIFByaW50cyB0aGlzIHVzYWdlIGluZm9ybWF0aW9uIik7CisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCJcbiAgICAgLWNoX2ZtdDo8Zm9ybWF0X29mX2lucHV0X2F1ZGlvPiIpOworICBwcmludGYoIlxuICAgICAgICAgMDpBVURJT19DSEFOTkVMX09VVF83UE9JTlQxKGRlZmF1bHQpIik7CisgIHByaW50ZigiXG4gICAgICAgICAxOkFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfU0lERSIpOworICBwcmludGYoIlxuICAgICAgICAgMjpBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX0JBQ0siKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDM6QVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9TSURFIik7CisgIHByaW50ZigiXG4gICAgICAgICA0OkFVRElPX0NIQU5ORUxfT1VUX1FVQURfQkFDSyIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgIC1mY2g6PGZpbGVfY2hhbm5lbHM+ICgxIHRocm91Z2ggOCkiKTsKKyAgcHJpbnRmKCJcbiIpOworfQorCitpbnQzMl90IERvd25taXhEZWZhdWx0Q29uZmlnKGVmZmVjdF9jb25maWdfdCAqcENvbmZpZykgeworICBwQ29uZmlnLT5pbnB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKKyAgcENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKKyAgcENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF83UE9JTlQxOworICBwQ29uZmlnLT5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBudWxscHRyOworICBwQ29uZmlnLT5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gbnVsbHB0cjsKKyAgcENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gbnVsbHB0cjsKKyAgcENvbmZpZy0+aW5wdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOworCisgIHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOworICBwQ29uZmlnLT5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gcENvbmZpZy0+aW5wdXRDZmcuc2FtcGxpbmdSYXRlOworCisgIC8vIHNldCBhIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBhY2Nlc3MgbW9kZSwgYnV0IHNob3VsZCBiZSBvdmVyd3JpdHRlbiBieSBjYWxsZXIKKyAgcENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURTsKKyAgcENvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgIHBDb25maWctPm91dHB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgcENvbmZpZy0+b3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IG51bGxwdHI7CisgIHBDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gbnVsbHB0cjsKKyAgcENvbmZpZy0+b3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IG51bGxwdHI7CisgIHBDb25maWctPm91dHB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludDMyX3QgRG93bm1peENvbmZpdXJlQW5kRW5hYmxlKGRvd25taXhfY250eHRfcyAqcERlc2NyaXB0b3IpIHsKKyAgZWZmZWN0X2hhbmRsZV90ICplZmZlY3RIYW5kbGUgPSAmcERlc2NyaXB0b3ItPmhhbmRsZTsKKyAgZG93bm1peF9tb2R1bGVfdCAqZG93bm1peEVmZmVjdEhhbmRsZSA9IChkb3dubWl4X21vZHVsZV90ICopKmVmZmVjdEhhbmRsZTsKKyAgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyAqRG93bm1peF9hcGkgPSBkb3dubWl4RWZmZWN0SGFuZGxlLT5pdGZlOworICBpbnQzMl90IGVyciA9IDA7CisgIHVpbnQzMl90IHJlcGx5U2l6ZSA9ICh1aW50MzJfdClzaXplb2YoZXJyKTsKKworICBlcnIgPSAoRG93bm1peF9hcGktPmNvbW1hbmQpKCplZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfU0VUX0NPTkZJRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSwgJihwRGVzY3JpcHRvci0+Y29uZmlnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHlTaXplLCAmZXJyKTsKKyAgaWYgKGVyciAhPSAwKSB7CisgICAgQUxPR0UoIkRvd25taXggY29tbWFuZCB0byBjb25maWd1cmUgcmV0dXJuZWQgYW4gZXJyb3IgJWQiLCBlcnIpOworICAgIHJldHVybiBlcnI7CisgIH0KKworICBlcnIgPSAoKERvd25taXhfYXBpLT5jb21tYW5kKSkoKmVmZmVjdEhhbmRsZSwgRUZGRUNUX0NNRF9FTkFCTEUsIDAsIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbHlTaXplLCAmZXJyKTsKKyAgaWYgKGVyciAhPSAwKSB7CisgICAgQUxPR0UoIkRvd25taXggY29tbWFuZCB0byBlbmFibGUgZWZmZWN0IHJldHVybmVkIGFuIGVycm9yICVkIiwgZXJyKTsKKyAgICByZXR1cm4gZXJyOworICB9CisgIHJldHVybiAwOworfQorCitpbnQzMl90IERvd25taXhFeGVjdXRlKGRvd25taXhfY250eHRfcyAqcERlc2NyaXB0b3IsIEZJTEUgKmZpbnAsCisgICAgICAgICAgICAgICAgICAgICAgIEZJTEUgKmZvdXQpIHsKKyAgZWZmZWN0X2hhbmRsZV90ICplZmZlY3RIYW5kbGUgPSAmcERlc2NyaXB0b3ItPmhhbmRsZTsKKyAgZG93bm1peF9tb2R1bGVfdCAqZG93bm1peEVmZmVjdEhhbmRsZSA9IChkb3dubWl4X21vZHVsZV90ICopKmVmZmVjdEhhbmRsZTsKKyAgY29uc3Qgc3RydWN0IGVmZmVjdF9pbnRlcmZhY2VfcyAqRG93bm1peF9hcGkgPSBkb3dubWl4RWZmZWN0SGFuZGxlLT5pdGZlOworCisgIGNvbnN0IGludCBudW1GaWxlQ2hhbm5lbHMgPSBwRGVzY3JpcHRvci0+bnVtRmlsZUNoYW5uZWxzOworICBjb25zdCBpbnQgbnVtUHJvY2Vzc0NoYW5uZWxzID0gcERlc2NyaXB0b3ItPm51bVByb2Nlc3NDaGFubmVsczsKKyAgY29uc3QgaW50IGZpbGVGcmFtZVNpemUgPSBudW1GaWxlQ2hhbm5lbHMgKiBzaXplb2Yoc2hvcnQpOworICBjb25zdCB1bnNpZ25lZCBpbnQgb3V0cHV0Q2hhbm5lbHMgPQorICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyk7CisKKyAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IG91dEZsb2F0KEZSQU1FX0xFTkdUSCAqIE1BWF9OVU1fQ0hBTk5FTFMpOworICBzdGQ6OnZlY3RvcjxmbG9hdD4gaW5GbG9hdChGUkFNRV9MRU5HVEggKiBNQVhfTlVNX0NIQU5ORUxTKTsKKworICBhdWRpb19idWZmZXJfdCBpbmJ1ZmZlciwgb3V0YnVmZmVyOworICBpbmJ1ZmZlci5mMzIgPSBpbkZsb2F0LmRhdGEoKTsKKyAgb3V0YnVmZmVyLmYzMiA9IG91dEZsb2F0LmRhdGEoKTsKKyAgaW5idWZmZXIuZnJhbWVDb3VudCA9IEZSQU1FX0xFTkdUSDsKKyAgb3V0YnVmZmVyLmZyYW1lQ291bnQgPSBGUkFNRV9MRU5HVEg7CisKKyAgYXVkaW9fYnVmZmVyX3QgKnBpbmJ1ZiwgKnBvdXRidWY7CisgIHBpbmJ1ZiA9ICZpbmJ1ZmZlcjsKKyAgcG91dGJ1ZiA9ICZvdXRidWZmZXI7CisKKyAgaW50IGZyYW1lQ291bnRlciA9IDA7CisgIHN0ZDo6dmVjdG9yPHNob3J0PiBpblMxNihGUkFNRV9MRU5HVEggKiBNQVhfTlVNX0NIQU5ORUxTKTsKKyAgc3RkOjp2ZWN0b3I8c2hvcnQ+IG91dFMxNihGUkFNRV9MRU5HVEggKiBNQVhfTlVNX0NIQU5ORUxTKTsKKworICB3aGlsZSAoZnJlYWQoaW5TMTYuZGF0YSgpLCBmaWxlRnJhbWVTaXplLCBGUkFNRV9MRU5HVEgsIGZpbnApID09CisgICAgICAgICBGUkFNRV9MRU5HVEgpIHsKKyAgICBpZiAobnVtRmlsZUNoYW5uZWxzICE9IG51bVByb2Nlc3NDaGFubmVscykgeworICAgICAgYWRqdXN0X2NoYW5uZWxzKGluUzE2LmRhdGEoKSwgbnVtRmlsZUNoYW5uZWxzLCBpblMxNi5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgbnVtUHJvY2Vzc0NoYW5uZWxzLCBzaXplb2Yoc2hvcnQpLAorICAgICAgICAgICAgICAgICAgICAgIEZSQU1FX0xFTkdUSCAqIGZpbGVGcmFtZVNpemUpOworICAgIH0KKworICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kxNihpbkZsb2F0LmRhdGEoKSwgaW5TMTYuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9MRU5HVEggKiBudW1Qcm9jZXNzQ2hhbm5lbHMpOworCisgICAgY29uc3QgaW50MzJfdCBlcnIgPSAoRG93bm1peF9hcGktPnByb2Nlc3MpKCplZmZlY3RIYW5kbGUsIHBpbmJ1ZiwgcG91dGJ1Zik7CisgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICBBTE9HRSgiRG93bm1peFByb2Nlc3MgcmV0dXJuZWQgYW4gZXJyb3IgJWQiLCBlcnIpOworICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdChvdXRTMTYuZGF0YSgpLCBvdXRGbG9hdC5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZSQU1FX0xFTkdUSCAqIG91dHB1dENoYW5uZWxzKTsKKyAgICBmd3JpdGUob3V0UzE2LmRhdGEoKSwgc2l6ZW9mKHNob3J0KSwgKEZSQU1FX0xFTkdUSCAqIG91dHB1dENoYW5uZWxzKSwKKyAgICAgICAgICAgZm91dCk7CisgICAgZnJhbWVDb3VudGVyKys7CisgIH0KKyAgcHJpbnRmKCJmcmFtZUNvdW50ZXI6IFslZF1cbiIsIGZyYW1lQ291bnRlcik7CisgIHJldHVybiAwOworfQorCitpbnQzMl90IERvd21peE1haW5Qcm9jZXNzKGRvd25taXhfY250eHRfcyAqcERlc2NyaXB0b3IsIEZJTEUgKmZpbnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZJTEUgKmZvdXQpIHsKKyAgZWZmZWN0X2hhbmRsZV90ICplZmZlY3RIYW5kbGUgPSAmcERlc2NyaXB0b3ItPmhhbmRsZTsKKyAgaW50MzJfdCBzZXNzaW9uSWQgPSAwLCBpb0lkID0gMDsKKyAgY29uc3QgZWZmZWN0X3V1aWRfdCBkb3dubWl4X3V1aWQgPSB7CisgICAgICAweDkzZjA0NDUyLCAweGU0ZmUsIDB4NDFjYywgMHg5MWY5LCB7MHhlNCwgMHg3NSwgMHhiNiwgMHhkMSwgMHhkNiwgMHg5Zn19OworCisgIGludDMyX3QgZXJyID0gQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU0uY3JlYXRlX2VmZmVjdCgKKyAgICAgICZkb3dubWl4X3V1aWQsIHNlc3Npb25JZCwgaW9JZCwKKyAgICAgIGVmZmVjdEhhbmRsZSk7CisgIGlmIChlcnIgIT0gMCkgeworICAgIEFMT0dFKCJEb3dubWl4TGliX0NyZWF0ZSByZXR1cm5lZCBhbiBlcnJvciAlZCIsIGVycik7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLy8gUGFzc2luZyB0aGUgaW5pdCBjb25maWcgZm9yIHRpbWUgYmVpbmcuCisgIGVyciA9IERvd25taXhDb25maXVyZUFuZEVuYWJsZShwRGVzY3JpcHRvcik7CisgIGlmIChlcnIgIT0gMCkgeworICAgIEFMT0dFKCJEb3dubWl4Q29uZmlndXJlQW5kRW5hYmxlIHJldHVybmVkIGFuIGVycm9yICVkIiwgZXJyKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgLy8gZXhlY3V0ZSBjYWxsIGZvciBkb3dubWl4LgorICBlcnIgPSBEb3dubWl4RXhlY3V0ZShwRGVzY3JpcHRvciwgZmlucCwgZm91dCk7CisgIGlmIChlcnIgIT0gMCkgeworICAgIEFMT0dFKCJEb3dubWl4RXhlY3V0ZSByZXR1cm5lZCBhbiBlcnJvciAlZCIsIGVycik7CisgICAgcmV0dXJuIC0xOworICB9CisgIC8vIFJlbGVhc2UgdGhlIGxpYnJhcnkgZnVuY3Rpb24uCisgIGVyciA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNLnJlbGVhc2VfZWZmZWN0KCplZmZlY3RIYW5kbGUpOworICBpZiAoZXJyICE9IDApIHsKKyAgICBBTE9HRSgiRG93bm1peFJlbGVhc2UgcmV0dXJuZWQgYW4gZXJyb3IgJWQiLCBlcnIpOworICAgIHJldHVybiAtMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkgeworICBpbnQgbnVtRmlsZUNoYW5uZWxzID0gMSwgbnVtUHJvY2Vzc0NoYW5uZWxzID0gODsKKyAgZG93bm1peF9jbnR4dF9zIGRlc2NyaXB0b3IgPSB7fTsKKyAgRG93bm1peERlZmF1bHRDb25maWcoJihkZXNjcmlwdG9yLmNvbmZpZykpOworCisgIGNvbnN0IGNoYXIgKmluZmlsZSA9IG51bGxwdHI7CisgIGNvbnN0IGNoYXIgKm91dGZpbGUgPSBudWxscHRyOworICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworICAgIHByaW50ZigiJXMgIiwgYXJndltpXSk7CisgICAgaWYgKGFyZ3ZbaV1bMF0gIT0gJy0nKSB7CisgICAgICBpZiAoaW5maWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgaW5maWxlID0gYXJndltpXTsKKyAgICAgIH0gZWxzZSBpZiAob3V0ZmlsZSA9PSBudWxscHRyKSB7CisgICAgICAgIG91dGZpbGUgPSBhcmd2W2ldOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWZzOiIsIDQpKSB7CisgICAgICAvLyBBZGQgYSBjaGVjayBmb3IgYWxsIHRoZSBzdXBwb3J0ZWQgc3RyZWFtcy4KKyAgICAgIGNvbnN0IGludCBzYW1wbGluZ0ZyZXEgPSBhdG9pKGFyZ3ZbaV0gKyA0KTsKKyAgICAgIGlmIChzYW1wbGluZ0ZyZXEgIT0gODAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gMTEwMjUgJiYKKyAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gMTIwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDE2MDAwICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDIyMDUwICYmIHNhbXBsaW5nRnJlcSAhPSAyNDAwMCAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSAzMjAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gNDQxMDAgJiYKKyAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gNDgwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDg4MjAwICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDk2MDAwICYmIHNhbXBsaW5nRnJlcSAhPSAxNzY0MDAgJiYKKyAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gMTkyMDAwKSB7CisgICAgICAgIHByaW50ZigiVW5zdXBwb3J0ZWQgU2FtcGxpbmcgRnJlcXVlbmN5IDogJWQiLCBzYW1wbGluZ0ZyZXEpOworICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKworICAgICAgZGVzY3JpcHRvci5jb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gc2FtcGxpbmdGcmVxOworICAgICAgZGVzY3JpcHRvci5jb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nRnJlcTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItY2hfZm10OiIsIDgpKSB7CisgICAgICBjb25zdCBpbnQgZm9ybWF0ID0gYXRvaShhcmd2W2ldICsgOCk7CisgICAgICB1aW50MzJfdCAqYXVkaW9UeXBlID0gJmRlc2NyaXB0b3IuY29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzOworICAgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICAgICAgY2FzZSAwOgorICAgICAgICAgICphdWRpb1R5cGUgPSBBVURJT19DSEFOTkVMX09VVF83UE9JTlQxOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgKmF1ZGlvVHlwZSA9IEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfU0lERTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICphdWRpb1R5cGUgPSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX0JBQ0s7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAqYXVkaW9UeXBlID0gQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9TSURFOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgKmF1ZGlvVHlwZSA9IEFVRElPX0NIQU5ORUxfT1VUX1FVQURfQkFDSzsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAqYXVkaW9UeXBlID0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGRlc2NyaXB0b3IubnVtUHJvY2Vzc0NoYW5uZWxzID0KKyAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soKmF1ZGlvVHlwZSk7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWZjaDoiLCA1KSkgeworICAgICAgY29uc3QgaW50IGZDaGFubmVscyA9IGF0b2koYXJndltpXSArIDUpOworICAgICAgaWYgKGZDaGFubmVscyA+IDggfHwgZkNoYW5uZWxzIDwgMSkgeworICAgICAgICBwcmludGYoIlVuc3VwcG9ydGVkIG51bWJlciBvZiBmaWxlIGNoYW5uZWxzIDogJWQiLCBmQ2hhbm5lbHMpOworICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGRlc2NyaXB0b3IubnVtRmlsZUNoYW5uZWxzID0gZkNoYW5uZWxzOworCisgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWgiLCAyKSkgeworICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgaWYgKC8qaW5maWxlID09IG51bGxwdHIgfHwgKi8gb3V0ZmlsZSA9PSBudWxscHRyKSB7CisgICAgcHJpbnRVc2FnZSgpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIEZJTEUgKmZpbnAgPSBmb3BlbihpbmZpbGUsICJyYiIpOworICBpZiAoZmlucCA9PSBudWxscHRyKSB7CisgICAgcHJpbnRmKCJDYW5ub3Qgb3BlbiBpbnB1dCBmaWxlICVzIiwgaW5maWxlKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgRklMRSAqZm91dCA9IGZvcGVuKG91dGZpbGUsICJ3YiIpOworICBpZiAoZm91dCA9PSBudWxscHRyKSB7CisgICAgcHJpbnRmKCJDYW5ub3Qgb3BlbiBvdXRwdXQgZmlsZSAlcyIsIG91dGZpbGUpOworICAgIGZjbG9zZShmaW5wKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBjb25zdCBpbnQgZXJyID0gRG93bWl4TWFpblByb2Nlc3MoJmRlc2NyaXB0b3IsIGZpbnAsIGZvdXQpOworICAvLyBjbG9zZSBpbnB1dCBhbmQgb3V0cHV0IGZpbGVzLgorICBmY2xvc2UoZmlucCk7CisgIGZjbG9zZShmb3V0KTsKKyAgaWYgKGVyciAhPSAwKSB7CisgICAgcHJpbnRmKCJFcnJvcjogJWRcbiIsIGVycik7CisgIH0KKyAgcmV0dXJuIGVycjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZHluYW1pY3Nwcm9jL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhZmM0ODMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDYgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBEeW5hbWljc1Byb2Nlc3NpbmcgbGlicmFyeQorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJkeW5wcm9jIiwKKworICAgIHZlbmRvcjogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkVmZmVjdER5bmFtaWNzUHJvY2Vzc2luZy5jcHAiLAorICAgICAgICAiZHNwL0RQQmFzZS5jcHAiLAorICAgICAgICAiZHNwL0RQRnJlcXVlbmN5LmNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLU8yIiwKKyAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAorCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJzb3VuZGZ4IiwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2VmZmVjdHMiLAorICAgICAgICAibGliZWlnZW4iLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy9keW5hbWljc3Byb2MvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JlMGM0OS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLSMgRHluYW1pY3NQcm9jZXNzaW5nIGxpYnJhcnkKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKLQotRUlHRU5fUEFUSCA6PSBleHRlcm5hbC9laWdlbgotTE9DQUxfQ19JTkNMVURFUyArPSAkKEVJR0VOX1BBVEgpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLSAgICBFZmZlY3REeW5hbWljc1Byb2Nlc3NpbmcuY3BwIFwKLSAgICBkc3AvRFBCYXNlLmNwcCBcCi0gICAgZHNwL0RQRnJlcXVlbmN5LmNwcAotCi1MT0NBTF9DRkxBR1MrPSAtTzIgLWZ2aXNpYmlsaXR5PWhpZGRlbgotTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJsb2cgXAotCi1MT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBzb3VuZGZ4Ci1MT0NBTF9NT0RVTEU6PSBsaWJkeW5wcm9jCi0KLUxPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmF1ZGlvZWZmZWN0cwotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9FZmZlY3REeW5hbWljc1Byb2Nlc3NpbmcuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9keW5hbWljc3Byb2MvRWZmZWN0RHluYW1pY3NQcm9jZXNzaW5nLmNwcAppbmRleCAwYjg4M2YxLi5jMDNjNmVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9FZmZlY3REeW5hbWljc1Byb2Nlc3NpbmcuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZHluYW1pY3Nwcm9jL0VmZmVjdER5bmFtaWNzUHJvY2Vzc2luZy5jcHAKQEAgLTI1LDYgKzI1LDcgQEAKICNpbmNsdWRlIDxuZXc+CiAKICNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiAKICNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9keW5hbWljc3Byb2Nlc3NpbmcuaD4KICNpbmNsdWRlIDxkc3AvRFBCYXNlLmg+CkBAIC0yMjUsMTAgKzIyNiw2IEBACiAgICAgfSAvL3N3aXRjaAogfQogCi1zdGF0aWMgaW5saW5lIGJvb2wgaXNQb3dlck9mMih1bnNpZ25lZCBsb25nIG4pIHsKLSAgICByZXR1cm4gKG4gJiAobiAtIDEpKSA9PSAwOwotfQotCiB2b2lkIERQX2NvbmZpZ3VyZVZhcmlhbnQoRHluYW1pY3NQcm9jZXNzaW5nQ29udGV4dCAqcENvbnRleHQsIGludCBuZXdWYXJpYW50KSB7CiAgICAgQUxPR1YoIkRQX2NvbmZpZ3VyZVZhcmlhbnQgJWQiLCBuZXdWYXJpYW50KTsKICAgICBzd2l0Y2gobmV3VmFyaWFudCkgewpAQCAtMjQyLDcgKzIzOSw3IEBACiAgICAgICAgICAgICAgICAgZGVzaXJlZEJsb2NrKTsKICAgICAgICAgaWYgKGRlc2lyZWRCbG9jayA8IG1pbkJsb2NrU2l6ZSkgewogICAgICAgICAgICAgY3VycmVudEJsb2NrID0gbWluQmxvY2tTaXplOwotICAgICAgICB9IGVsc2UgaWYgKCFpc1Bvd2VyT2YyKGRlc2lyZWRCbG9jaykpIHsKKyAgICAgICAgfSBlbHNlIGlmICghcG93ZXJvZjIoZGVzaXJlZEJsb2NrKSkgewogICAgICAgICAgICAgLy9maW5kIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyLgogICAgICAgICAgICAgY3VycmVudEJsb2NrID0gMSA8PCAoMzIgLSBfX2J1aWx0aW5fY2x6KGRlc2lyZWRCbG9jaykpOwogICAgICAgICB9CkBAIC0xMjk3LDQgKzEyOTQsMyBAQAogfTsKIAogfTsgLy8gZXh0ZXJuICJDIgotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9kc3AvRFBGcmVxdWVuY3kuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9keW5hbWljc3Byb2MvZHNwL0RQRnJlcXVlbmN5LmNwcAppbmRleCBkMDZmZDcwLi5hZTVjMDIwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2R5bmFtaWNzcHJvYy9kc3AvRFBGcmVxdWVuY3kuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZHluYW1pY3Nwcm9jL2RzcC9EUEZyZXF1ZW5jeS5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxsb2cvbG9nLmg+CiAjaW5jbHVkZSAiRFBGcmVxdWVuY3kuaCIKICNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiAKIG5hbWVzcGFjZSBkcF9meCB7CiAKQEAgLTMwLDEwICszMSw2IEBACiAjZGVmaW5lIENJUkNVTEFSX0JVRkZFUl9VUFNBTVBMRSA0ICAvLzQgdGltZXMgYnVmZmVyIHNpemUKIAogc3RhdGljIGNvbnN0ZXhwciBmbG9hdCBNSU5fRU5WRUxPUEUgPSAxZS02ZjsgLy8tMTIwIGRCCi0vL2hlbHBlciBmdW5jdGlvblMKLXN0YXRpYyBpbmxpbmUgYm9vbCBpc1Bvd2VyT2YyKHVuc2lnbmVkIGxvbmcgbikgewotICAgIHJldHVybiAobiAmIChuIC0gMSkpID09IDA7Ci19CiBzdGF0aWMgY29uc3RleHByIGZsb2F0IEVQU0lMT04gPSAwLjAwMDAwMDFmOwogCiBzdGF0aWMgaW5saW5lIGJvb2wgaXNaZXJvKGZsb2F0IGYpIHsKQEAgLTY1LDExICs2Miw2IEBACiAgICAgY0JJbnB1dC5yZXNpemUobUJsb2NrU2l6ZSAqIENJUkNVTEFSX0JVRkZFUl9VUFNBTVBMRSk7CiAgICAgY0JPdXRwdXQucmVzaXplKG1CbG9ja1NpemUgKiBDSVJDVUxBUl9CVUZGRVJfVVBTQU1QTEUpOwogCi0gICAgLy9maWxsIGlucHV0IHdpdGggaGFsZiBibG9jayBzaXplLi4uCi0gICAgZm9yICh1bnNpZ25lZCBpbnQgayA9IDA7IGsgPCBtQmxvY2tTaXplLzI7IGsrKykgewotICAgICAgICBjQklucHV0LndyaXRlKDApOwotICAgIH0KLQogICAgIC8vdGVtcCB2ZWN0b3JzCiAgICAgaW5wdXQucmVzaXplKG1CbG9ja1NpemUpOwogICAgIG91dHB1dC5yZXNpemUobUJsb2NrU2l6ZSk7CkBAIC0xNTEsNyArMTQzLDcgQEAKICAgICB9IGVsc2UgaWYgKG1CbG9ja1NpemUgPCBNSU5fQkxPQ0tTSVpFKSB7CiAgICAgICAgIG1CbG9ja1NpemUgPSBNSU5fQkxPQ0tTSVpFOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghaXNQb3dlck9mMihibG9ja1NpemUpKSB7CisgICAgICAgIGlmICghcG93ZXJvZjIoYmxvY2tTaXplKSkgewogICAgICAgICAgICAgLy9maW5kIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyLgogICAgICAgICAgICAgbUJsb2NrU2l6ZSA9IDEgPDwgKDMyIC0gX19idWlsdGluX2NseihibG9ja1NpemUpKTsKICAgICAgICAgfQpAQCAtMTczLDYgKzE2NSwxMSBAQAogCiAgICAgZmlsbF93aW5kb3cobVZXaW5kb3csIFJEU1BfV0lORE9XX0hBTk5JTkdfRkxBVF9UT1AsIG1CbG9ja1NpemUsIG1PdmVybGFwU2l6ZSk7CiAKKyAgICAvL3NwbGl0IHdpbmRvdyBpbnRvIGFuYWx5c2lzIGFuZCBzeW50aGVzaXMuIEJvdGggYXJlIHRoZSBzcXJ0KCkgb2Ygb3JpZ2luYWwKKyAgICAvL3dpbmRvdworICAgIEVpZ2VuOjpNYXA8RWlnZW46OlZlY3RvclhmPiBlV2luZG93KCZtVldpbmRvd1swXSwgbVZXaW5kb3cuc2l6ZSgpKTsKKyAgICBlV2luZG93ID0gZVdpbmRvdy5hcnJheSgpLnNxcnQoKTsKKwogICAgIC8vY29tcHV0ZSB3aW5kb3cgcm1zIGZvciBlbmVyZ3kgY29tcGVuc2F0aW9uCiAgICAgbVdpbmRvd1JtcyA9IDA7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVldpbmRvdy5zaXplKCk7IGkrKykgewpAQCAtNjY5LDYgKzY2NiwxMSBAQAogICAgIC8vIyNpZmZ0IGRpcmVjdGx5IHRvIG91dHB1dC4KICAgICBFaWdlbjo6TWFwPEVpZ2VuOjpWZWN0b3JYZj4gZU91dHB1dCgmY2Iub3V0cHV0WzBdLCBjYi5vdXRwdXQuc2l6ZSgpKTsKICAgICBtRmZ0U2VydmVyLmludihlT3V0cHV0LCBjYi5jb21wbGV4VGVtcCk7CisKKyAgICAvL2FwcGx5IHJlc3Qgb2Ygd2luZG93IGZvciByZXN5bnRoZXNpcworICAgIEVpZ2VuOjpNYXA8RWlnZW46OlZlY3RvclhmPiBlV2luZG93KCZtVldpbmRvd1swXSwgbVZXaW5kb3cuc2l6ZSgpKTsKKyAgICBlT3V0cHV0ID0gZU91dHB1dC5jd2lzZVByb2R1Y3QoZVdpbmRvdyk7CisKICAgICByZXR1cm4gbUJsb2NrU2l6ZTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sb3VkbmVzcy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9sb3VkbmVzcy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMTNhZjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2xvdWRuZXNzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyNyBAQAorLy8gTG91ZG5lc3NFbmhhbmNlciBsaWJyYXJ5CitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmxkbmhuY3IiLAorCisgICAgdmVuZG9yOiB0cnVlLAorICAgIHNyY3M6IFsKKyAgICAgICAgIkVmZmVjdExvdWRuZXNzRW5oYW5jZXIuY3BwIiwKKyAgICAgICAgImRzcC9jb3JlL2R5bmFtaWNfcmFuZ2VfY29tcHJlc3Npb24uY3BwIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItTzIiLAorICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogInNvdW5kZngiLAorCisgICAgaGVhZGVyX2xpYnM6IFsibGliYXVkaW9lZmZlY3RzIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2xvdWRuZXNzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL2xvdWRuZXNzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMmNiZDUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sb3VkbmVzcy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLSMgTG91ZG5lc3NFbmhhbmNlciBsaWJyYXJ5Ci1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0gICAgRWZmZWN0TG91ZG5lc3NFbmhhbmNlci5jcHAgXAotICAgIGRzcC9jb3JlL2R5bmFtaWNfcmFuZ2VfY29tcHJlc3Npb24uY3BwCi0KLUxPQ0FMX0NGTEFHUys9IC1PMiAtZnZpc2liaWxpdHk9aGlkZGVuCi1MT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJjdXRpbHMgXAotICAgIGxpYmxvZyBcCi0KLUxPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHNvdW5kZngKLUxPQ0FMX01PRFVMRTo9IGxpYmxkbmhuY3IKLQotTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCi0gICAgbGliYXVkaW9lZmZlY3RzCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbG91ZG5lc3MvRWZmZWN0TG91ZG5lc3NFbmhhbmNlci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2xvdWRuZXNzL0VmZmVjdExvdWRuZXNzRW5oYW5jZXIuY3BwCmluZGV4IDlkMjljZjEuLmQ2MWVmZDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbG91ZG5lc3MvRWZmZWN0TG91ZG5lc3NFbmhhbmNlci5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sb3VkbmVzcy9FZmZlY3RMb3VkbmVzc0VuaGFuY2VyLmNwcApAQCAtMzAsNiArMzAsMjYgQEAKICNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9sb3VkbmVzc2VuaGFuY2VyLmg+CiAjaW5jbHVkZSAiZHNwL2NvcmUvZHluYW1pY19yYW5nZV9jb21wcmVzc2lvbi5oIgogCisvLyBCVUlMRF9GTE9BVCB0YXJnZXRzIGJ1aWxkaW5nIGEgZmxvYXQgZWZmZWN0IGluc3RlYWQgb2YgdGhlIGxlZ2FjeSBpbnQxNl90IGVmZmVjdC4KKyNkZWZpbmUgQlVJTERfRkxPQVQKKworI2lmZGVmIEJVSUxEX0ZMT0FUCisKK3N0YXRpYyBjb25zdGV4cHIgYXVkaW9fZm9ybWF0X3Qga1Byb2Nlc3NGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworCisjZWxzZQorCitzdGF0aWMgY29uc3RleHByIGF1ZGlvX2Zvcm1hdF90IGtQcm9jZXNzRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisKK3N0YXRpYyBpbmxpbmUgaW50MTZfdCBjbGFtcDE2KGludDMyX3Qgc2FtcGxlKQoreworICAgIGlmICgoc2FtcGxlPj4xNSkgXiAoc2FtcGxlPj4zMSkpCisgICAgICAgIHNhbXBsZSA9IDB4N0ZGRiBeIChzYW1wbGU+PjMxKTsKKyAgICByZXR1cm4gc2FtcGxlOworfQorCisjZW5kaWYgLy8gQlVJTERfRkxPQVQKKwogZXh0ZXJuICJDIiB7CiAKIC8vIGVmZmVjdF9oYW5kbGVfdCBpbnRlcmZhY2UgaW1wbGVtZW50YXRpb24gZm9yIExFIGVmZmVjdApAQCAtODAsMTMgKzEwMCw2IEBACiAgICAgfQogfQogCi1zdGF0aWMgaW5saW5lIGludDE2X3QgY2xhbXAxNihpbnQzMl90IHNhbXBsZSkKLXsKLSAgICBpZiAoKHNhbXBsZT4+MTUpIF4gKHNhbXBsZT4+MzEpKQotICAgICAgICBzYW1wbGUgPSAweDdGRkYgXiAoc2FtcGxlPj4zMSk7Ci0gICAgcmV0dXJuIHNhbXBsZTsKLX0KLQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBMRV9zZXRDb25maWcoKQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMTEsNyArMTI0LDcgQEAKICAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSByZXR1cm4gLUVJTlZBTDsKICAgICBpZiAocENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgIT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUgJiYKICAgICAgICAgICAgIHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlICE9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHJldHVybiAtRUlOVkFMOwotICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0ga1Byb2Nlc3NGb3JtYXQpIHJldHVybiAtRUlOVkFMOwogCiAgICAgcENvbnRleHQtPm1Db25maWcgPSAqcENvbmZpZzsKIApAQCAtMTU5LDcgKzE3Miw3IEBACiAKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKLSAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5mb3JtYXQgPSBrUHJvY2Vzc0Zvcm1hdDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwpAQCAtMTY3LDcgKzE4MCw3IEBACiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURTsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBrUHJvY2Vzc0Zvcm1hdDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOwpAQCAtMjg0LDE4ICsyOTcsNDEgQEAKIAogICAgIC8vQUxPR1YoIkxFIGFib3V0IHRvIHByb2Nlc3MgJWQgc2FtcGxlcyIsIGluQnVmZmVyLT5mcmFtZUNvdW50KTsKICAgICB1aW50MTZfdCBpbklkeDsKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIGNvbnN0ZXhwciBmbG9hdCBzY2FsZSA9IDEgPDwgMTU7IC8vIHBvd2VyIG9mIDIgaXMgbG9zc2xlc3MgY29udmVyc2lvbiB0byBpbnQxNl90IHJhbmdlCisgICAgY29uc3RleHByIGZsb2F0IGludmVyc2VTY2FsZSA9IDEuZiAvIHNjYWxlOworICAgIGNvbnN0IGZsb2F0IGlucHV0QW1wID0gcG93KDEwLCBwQ29udGV4dC0+bVRhcmdldEdhaW5tQi8yMDAwLjBmKSAqIHNjYWxlOworI2Vsc2UKICAgICBmbG9hdCBpbnB1dEFtcCA9IHBvdygxMCwgcENvbnRleHQtPm1UYXJnZXRHYWlubUIvMjAwMC4wZik7CisjZW5kaWYKICAgICBmbG9hdCBsZWZ0U2FtcGxlLCByaWdodFNhbXBsZTsKICAgICBmb3IgKGluSWR4ID0gMCA7IGluSWR4IDwgaW5CdWZmZXItPmZyYW1lQ291bnQgOyBpbklkeCsrKSB7CiAgICAgICAgIC8vIG1ha2V1cCBnYWluIGlzIGFwcGxpZWQgb24gdGhlIGlucHV0IG9mIHRoZSBjb21wcmVzc29yCisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgbGVmdFNhbXBsZSAgPSBpbnB1dEFtcCAqIGluQnVmZmVyLT5mMzJbMippbklkeF07CisgICAgICAgIHJpZ2h0U2FtcGxlID0gaW5wdXRBbXAgKiBpbkJ1ZmZlci0+ZjMyWzIqaW5JZHggKzFdOworICAgICAgICBwQ29udGV4dC0+bUNvbXByZXNzb3ItPkNvbXByZXNzKCZsZWZ0U2FtcGxlLCAmcmlnaHRTYW1wbGUpOworICAgICAgICBpbkJ1ZmZlci0+ZjMyWzIqaW5JZHhdICAgID0gbGVmdFNhbXBsZSAqIGludmVyc2VTY2FsZTsKKyAgICAgICAgaW5CdWZmZXItPmYzMlsyKmluSWR4ICsxXSA9IHJpZ2h0U2FtcGxlICogaW52ZXJzZVNjYWxlOworI2Vsc2UKICAgICAgICAgbGVmdFNhbXBsZSAgPSBpbnB1dEFtcCAqIChmbG9hdClpbkJ1ZmZlci0+czE2WzIqaW5JZHhdOwogICAgICAgICByaWdodFNhbXBsZSA9IGlucHV0QW1wICogKGZsb2F0KWluQnVmZmVyLT5zMTZbMippbklkeCArMV07CiAgICAgICAgIHBDb250ZXh0LT5tQ29tcHJlc3Nvci0+Q29tcHJlc3MoJmxlZnRTYW1wbGUsICZyaWdodFNhbXBsZSk7CiAgICAgICAgIGluQnVmZmVyLT5zMTZbMippbklkeF0gICAgPSAoaW50MTZfdCkgbGVmdFNhbXBsZTsKICAgICAgICAgaW5CdWZmZXItPnMxNlsyKmluSWR4ICsxXSA9IChpbnQxNl90KSByaWdodFNhbXBsZTsKKyNlbmRpZiAvLyBCVUlMRF9GTE9BVAogICAgIH0KIAogICAgIGlmIChpbkJ1ZmZlci0+cmF3ICE9IG91dEJ1ZmZlci0+cmF3KSB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgaWYgKHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0QnVmZmVyLT5mcmFtZUNvdW50KjI7IGkrKykgeworICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZjMyW2ldICs9IGluQnVmZmVyLT5mMzJbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkob3V0QnVmZmVyLT5yYXcsIGluQnVmZmVyLT5yYXcsIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIDIgKiBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgfQorI2Vsc2UKICAgICAgICAgaWYgKHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0QnVmZmVyLT5mcmFtZUNvdW50KjI7IGkrKykgewogICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+czE2W2ldID0gY2xhbXAxNihvdXRCdWZmZXItPnMxNltpXSArIGluQnVmZmVyLT5zMTZbaV0pOwpAQCAtMzAzLDYgKzMzOSw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtZW1jcHkob3V0QnVmZmVyLT5yYXcsIGluQnVmZmVyLT5yYXcsIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIDIgKiBzaXplb2YoaW50MTZfdCkpOwogICAgICAgICB9CisjZW5kaWYgLy8gQlVJTERfRkxPQVQKICAgICB9CiAgICAgaWYgKHBDb250ZXh0LT5tU3RhdGUgIT0gTE9VRE5FU1NfRU5IQU5DRVJfU1RBVEVfQUNUSVZFKSB7CiAgICAgICAgIHJldHVybiAtRU5PREFUQTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE1MGYxOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjE3IEBACisvLyBNdXNpYyBidW5kbGUKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlibXVzaWNidW5kbGUiLAorCisgICAgYXJjaDogeworICAgICAgICBhcm06IHsKKyAgICAgICAgICAgIGluc3RydWN0aW9uX3NldDogImFybSIsCisgICAgICAgIH0sCisgICAgfSwKKworICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJTdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguYyIsCisgICAgICAgICJTdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Db250cm9sLmMiLAorICAgICAgICAiU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmMiLAorICAgICAgICAiU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSW5pdC5jIiwKKyAgICAgICAgIlN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuYyIsCisgICAgICAgICJTdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuYyIsCisgICAgICAgICJTdGVyZW9XaWRlbmluZy9zcmMvTFZDU19TdGVyZW9FbmhhbmNlci5jIiwKKyAgICAgICAgIlN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5jIiwKKyAgICAgICAgIkJhc3Mvc3JjL0xWREJFX0NvbnRyb2wuYyIsCisgICAgICAgICJCYXNzL3NyYy9MVkRCRV9Jbml0LmMiLAorICAgICAgICAiQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jIiwKKyAgICAgICAgIkJhc3Mvc3JjL0xWREJFX1RhYmxlcy5jIiwKKyAgICAgICAgIkJ1bmRsZS9zcmMvTFZNX0FQSV9TcGVjaWFscy5jIiwKKyAgICAgICAgIkJ1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuYyIsCisgICAgICAgICJCdW5kbGUvc3JjL0xWTV9Jbml0LmMiLAorICAgICAgICAiQnVuZGxlL3NyYy9MVk1fUHJvY2Vzcy5jIiwKKyAgICAgICAgIkJ1bmRsZS9zcmMvTFZNX1RhYmxlcy5jIiwKKyAgICAgICAgIkJ1bmRsZS9zcmMvTFZNX0NvbnRyb2wuYyIsCisgICAgICAgICJTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Db250cm9sLmMiLAorICAgICAgICAiU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfSW5pdC5jIiwKKyAgICAgICAgIlNwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX01lbW9yeS5jIiwKKyAgICAgICAgIlNwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1Byb2Nlc3MuYyIsCisgICAgICAgICJTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jIiwKKyAgICAgICAgIlNwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Qcm9jZXNzLmMiLAorICAgICAgICAiU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmMiLAorICAgICAgICAiRXEvc3JjL0xWRVFOQl9DYWxjQ29lZi5jIiwKKyAgICAgICAgIkVxL3NyYy9MVkVRTkJfQ29udHJvbC5jIiwKKyAgICAgICAgIkVxL3NyYy9MVkVRTkJfSW5pdC5jIiwKKyAgICAgICAgIkVxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jIiwKKyAgICAgICAgIkVxL3NyYy9MVkVRTkJfVGFibGVzLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9JbnN0QWxsb2MuYyIsCisgICAgICAgICJDb21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQuYyIsCisgICAgICAgICJDb21tb24vc3JjL0ZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMS5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEuYyIsCisgICAgICAgICJDb21tb24vc3JjL0JQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0LmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEuYyIsCisgICAgICAgICJDb21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMS5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYyIsCisgICAgICAgICJDb21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEuYyIsCisgICAgICAgICJDb21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYyIsCisgICAgICAgICJDb21tb24vc3JjL1BLXzJJX0QzMkYzMkMzMEcxMV9UUkNfV1JBXzAxLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMS5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdC5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdC5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvSW50MTZMU2hpZnRUb0ludDMyXzE2eDMyLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMTYuYyIsCisgICAgICAgICJDb21tb24vc3JjL0NvcHlfMTYuYyIsCisgICAgICAgICJDb21tb24vc3JjL01vbm9UbzJJXzE2LmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9Nb25vVG8ySV8zMi5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTG9hZENvbnN0XzE2LmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMzIuYyIsCisgICAgICAgICJDb21tb24vc3JjL2RCX3RvX0xpbjMyLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjE2eHYxNi5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvU2hpZnRfU2F0X3YzMnh2MzIuYyIsCisgICAgICAgICJDb21tb24vc3JjL0Fic18zMi5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvSW50MzJSU2hpZnRUb0ludDE2X1NhdF8zMngxNi5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9tdWx0M3NfMTZ4MTYuYyIsCisgICAgICAgICJDb21tb24vc3JjL011bHQzc18zMngxNi5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTm9uTGluQ29tcF9EMTYuYyIsCisgICAgICAgICJDb21tb24vc3JjL0RlbGF5TWl4XzE2eDE2LmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9NU1RvMmlfU2F0XzE2eDE2LmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9Gcm9tMmlUb01TXzE2eDE2LmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9NYWMzc19TYXRfMTZ4MTYuYyIsCisgICAgICAgICJDb21tb24vc3JjL01hYzNzX1NhdF8zMngxNi5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvQWRkMl9TYXRfMTZ4MTYuYyIsCisgICAgICAgICJDb21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVC5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQuYyIsCisgICAgICAgICJDb21tb24vc3JjL0xWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQuYyIsCisgICAgICAgICJDb21tb24vc3JjL0xWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQuYyIsCisgICAgICAgICJDb21tb24vc3JjL0xWQ19NaXhlcl9TZXRUYXJnZXQuYyIsCisgICAgICAgICJDb21tb24vc3JjL0xWQ19NaXhlcl9HZXRUYXJnZXQuYyIsCisgICAgICAgICJDb21tb24vc3JjL0xWQ19NaXhlcl9Jbml0LmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FULmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVC5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTFZDX01peGVyX0dldEN1cnJlbnQuYyIsCisgICAgICAgICJDb21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FULmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYyIsCisgICAgICAgICJDb21tb24vc3JjL0FHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQS5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTFZNX1RpbWVyLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9MVk1fVGltZXJfSW5pdC5jIiwKKyAgICBdLAorCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJFcS9saWIiLAorICAgICAgICAiRXEvc3JjIiwKKyAgICAgICAgIkJhc3MvbGliIiwKKyAgICAgICAgIkJhc3Mvc3JjIiwKKyAgICAgICAgIkNvbW1vbi9zcmMiLAorICAgICAgICAiQnVuZGxlL3NyYyIsCisgICAgICAgICJTcGVjdHJ1bUFuYWx5emVyL2xpYiIsCisgICAgICAgICJTcGVjdHJ1bUFuYWx5emVyL3NyYyIsCisgICAgICAgICJTdGVyZW9XaWRlbmluZy9zcmMiLAorICAgICAgICAiU3RlcmVvV2lkZW5pbmcvbGliIiwKKyAgICBdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgIkNvbW1vbi9saWIiLAorICAgICAgICAiQnVuZGxlL2xpYiIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIgorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKKyAgICAgICAgIi1EQlVJTERfRkxPQVQiLAorICAgICAgICAiLURISUdIRVJfRlMiLAorICAgICAgICAiLURTVVBQT1JUX01DIiwKKworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworfQorCisvLyBSZXZlcmIgbGlicmFyeQorY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJyZXZlcmIiLAorCisgICAgYXJjaDogeworICAgICAgICBhcm06IHsKKyAgICAgICAgICAgIGluc3RydWN0aW9uX3NldDogImFybSIsCisgICAgICAgIH0sCisgICAgfSwKKworICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJSZXZlcmIvc3JjL0xWUkVWX0FwcGx5TmV3U2V0dGluZ3MuYyIsCisgICAgICAgICJSZXZlcmIvc3JjL0xWUkVWX0NsZWFyQXVkaW9CdWZmZXJzLmMiLAorICAgICAgICAiUmV2ZXJiL3NyYy9MVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycy5jIiwKKyAgICAgICAgIlJldmVyYi9zcmMvTFZSRVZfR2V0SW5zdGFuY2VIYW5kbGUuYyIsCisgICAgICAgICJSZXZlcmIvc3JjL0xWUkVWX0dldE1lbW9yeVRhYmxlLmMiLAorICAgICAgICAiUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmMiLAorICAgICAgICAiUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jIiwKKyAgICAgICAgIlJldmVyYi9zcmMvTFZSRVZfVGFibGVzLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9BYnNfMzIuYyIsCisgICAgICAgICJDb21tb24vc3JjL0luc3RBbGxvYy5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTG9hZENvbnN0XzE2LmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMzIuYyIsCisgICAgICAgICJDb21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTXVsdDNzXzMyeDE2LmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMS5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvRGVsYXlBbGxQYXNzX1NhdF8zMngxNlRvMzIuYyIsCisgICAgICAgICJDb21tb24vc3JjL0NvcHlfMTYuYyIsCisgICAgICAgICJDb21tb24vc3JjL01hYzNzX1NhdF8zMngxNi5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvRGVsYXlXcml0ZV8zMi5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvU2hpZnRfU2F0X3YzMnh2MzIuYyIsCisgICAgICAgICJDb21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9Kb2luVG8yaV8zMngzMi5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTW9ub1RvMklfMzIuYyIsCisgICAgICAgICJDb21tb24vc3JjL0xWTV9GT19IUEYuYyIsCisgICAgICAgICJDb21tb24vc3JjL0xWTV9GT19MUEYuYyIsCisgICAgICAgICJDb21tb24vc3JjL0xWTV9Qb2x5bm9taWFsLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9MVk1fUG93ZXIxMC5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTFZNX0dldE9tZWdhLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9NaXhTb2Z0XzJTdF9EMzJDMzFfU0FULmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9NaXhJblNvZnRfRDMyQzMxX1NBVC5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTFZNX01peGVyX1RpbWVDb25zdGFudC5jIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FULmMiLAorICAgICAgICAiQ29tbW9uL3NyYy9Db3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEuYyIsCisgICAgICAgICJDb21tb24vc3JjL0NvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYyIsCisgICAgXSwKKworICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAiUmV2ZXJiL3NyYyIsCisgICAgICAgICJDb21tb24vc3JjIiwKKyAgICBdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgIlJldmVyYi9saWIiLAorICAgICAgICAiQ29tbW9uL2xpYiIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgICAgICItREJVSUxEX0ZMT0FUIiwKKyAgICAgICAgIi1ESElHSEVSX0ZTIiwKKworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MWViM2UuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLSMgTXVzaWMgYnVuZGxlCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9BUk1fTU9ERSA6PSBhcm0KLQotTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0gICAgU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmMgXAotICAgIFN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0NvbnRyb2wuYyBcCi0gICAgU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmMgXAotICAgIFN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0luaXQuYyBcCi0gICAgU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jIFwKLSAgICBTdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuYyBcCi0gICAgU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuYyBcCi0gICAgU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmMgXAotICAgIEJhc3Mvc3JjL0xWREJFX0NvbnRyb2wuYyBcCi0gICAgQmFzcy9zcmMvTFZEQkVfSW5pdC5jIFwKLSAgICBCYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmMgXAotICAgIEJhc3Mvc3JjL0xWREJFX1RhYmxlcy5jIFwKLSAgICBCdW5kbGUvc3JjL0xWTV9BUElfU3BlY2lhbHMuYyBcCi0gICAgQnVuZGxlL3NyYy9MVk1fQnVmZmVycy5jIFwKLSAgICBCdW5kbGUvc3JjL0xWTV9Jbml0LmMgXAotICAgIEJ1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYyBcCi0gICAgQnVuZGxlL3NyYy9MVk1fVGFibGVzLmMgXAotICAgIEJ1bmRsZS9zcmMvTFZNX0NvbnRyb2wuYyBcCi0gICAgU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfQ29udHJvbC5jIFwKLSAgICBTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Jbml0LmMgXAotICAgIFNwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX01lbW9yeS5jIFwKLSAgICBTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcm9jZXNzLmMgXAotICAgIFNwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Jbml0LmMgXAotICAgIFNwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Qcm9jZXNzLmMgXAotICAgIFNwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5jIFwKLSAgICBFcS9zcmMvTFZFUU5CX0NhbGNDb2VmLmMgXAotICAgIEVxL3NyYy9MVkVRTkJfQ29udHJvbC5jIFwKLSAgICBFcS9zcmMvTFZFUU5CX0luaXQuYyBcCi0gICAgRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMgXAotICAgIEVxL3NyYy9MVkVRTkJfVGFibGVzLmMgXAotICAgIENvbW1vbi9zcmMvSW5zdEFsbG9jLmMgXAotICAgIENvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuYyBcCi0gICAgQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmMgXAotICAgIENvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jIFwKLSAgICBDb21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdC5jIFwKLSAgICBDb21tb24vc3JjL0ZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMgXAotICAgIENvbW1vbi9zcmMvRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jIFwKLSAgICBDb21tb24vc3JjL0JQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxLmMgXAotICAgIENvbW1vbi9zcmMvQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEuYyBcCi0gICAgQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMi5jIFwKLSAgICBDb21tb24vc3JjL0JQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyBcCi0gICAgQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMgXAotICAgIENvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdC5jIFwKLSAgICBDb21tb24vc3JjL0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYyBcCi0gICAgQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jIFwKLSAgICBDb21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxLmMgXAotICAgIENvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE0X1RSQ19XUkFfMDEuYyBcCi0gICAgQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMS5jIFwKLSAgICBDb21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYyBcCi0gICAgQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jIFwKLSAgICBDb21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmMgXAotICAgIENvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jIFwKLSAgICBDb21tb24vc3JjL0JRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMgXAotICAgIENvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jIFwKLSAgICBDb21tb24vc3JjL0JRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMgXAotICAgIENvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jIFwKLSAgICBDb21tb24vc3JjL1BLXzJJX0QzMkYzMkMzMEcxMV9UUkNfV1JBXzAxLmMgXAotICAgIENvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEuYyBcCi0gICAgQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0LmMgXAotICAgIENvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdC5jIFwKLSAgICBDb21tb24vc3JjL0ludDE2TFNoaWZ0VG9JbnQzMl8xNngzMi5jIFwKLSAgICBDb21tb24vc3JjL0Zyb20yaVRvTW9ub18xNi5jIFwKLSAgICBDb21tb24vc3JjL0NvcHlfMTYuYyBcCi0gICAgQ29tbW9uL3NyYy9Nb25vVG8ySV8xNi5jIFwKLSAgICBDb21tb24vc3JjL01vbm9UbzJJXzMyLmMgXAotICAgIENvbW1vbi9zcmMvTG9hZENvbnN0XzE2LmMgXAotICAgIENvbW1vbi9zcmMvTG9hZENvbnN0XzMyLmMgXAotICAgIENvbW1vbi9zcmMvZEJfdG9fTGluMzIuYyBcCi0gICAgQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjE2eHYxNi5jIFwKLSAgICBDb21tb24vc3JjL1NoaWZ0X1NhdF92MzJ4djMyLmMgXAotICAgIENvbW1vbi9zcmMvQWJzXzMyLmMgXAotICAgIENvbW1vbi9zcmMvSW50MzJSU2hpZnRUb0ludDE2X1NhdF8zMngxNi5jIFwKLSAgICBDb21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jIFwKLSAgICBDb21tb24vc3JjL211bHQzc18xNngxNi5jIFwKLSAgICBDb21tb24vc3JjL011bHQzc18zMngxNi5jIFwKLSAgICBDb21tb24vc3JjL05vbkxpbkNvbXBfRDE2LmMgXAotICAgIENvbW1vbi9zcmMvRGVsYXlNaXhfMTZ4MTYuYyBcCi0gICAgQ29tbW9uL3NyYy9NU1RvMmlfU2F0XzE2eDE2LmMgXAotICAgIENvbW1vbi9zcmMvRnJvbTJpVG9NU18xNngxNi5jIFwKLSAgICBDb21tb24vc3JjL01hYzNzX1NhdF8xNngxNi5jIFwKLSAgICBDb21tb24vc3JjL01hYzNzX1NhdF8zMngxNi5jIFwKLSAgICBDb21tb24vc3JjL0FkZDJfU2F0XzE2eDE2LmMgXAotICAgIENvbW1vbi9zcmMvQWRkMl9TYXRfMzJ4MzIuYyBcCi0gICAgQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVC5jIFwKLSAgICBDb21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmMgXAotICAgIENvbW1vbi9zcmMvTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudC5jIFwKLSAgICBDb21tb24vc3JjL0xWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQuYyBcCi0gICAgQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGFyZ2V0LmMgXAotICAgIENvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jIFwKLSAgICBDb21tb24vc3JjL0xWQ19NaXhlcl9Jbml0LmMgXAotICAgIENvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVC5jIFwKLSAgICBDb21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEuYyBcCi0gICAgQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVC5jIFwKLSAgICBDb21tb24vc3JjL0xWQ19NaXhlcl9HZXRDdXJyZW50LmMgXAotICAgIENvbW1vbi9zcmMvTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYyBcCi0gICAgQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmMgXAotICAgIENvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVC5jIFwKLSAgICBDb21tb24vc3JjL0xWQ19NaXhJblNvZnRfRDE2QzMxX1NBVC5jIFwKLSAgICBDb21tb24vc3JjL0FHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQS5jIFwKLSAgICBDb21tb24vc3JjL0xWTV9UaW1lci5jIFwKLSAgICBDb21tb24vc3JjL0xWTV9UaW1lcl9Jbml0LmMKLQotTE9DQUxfTU9EVUxFOj0gbGlibXVzaWNidW5kbGUKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgJChMT0NBTF9QQVRIKS9FcS9saWIgXAotICAgICQoTE9DQUxfUEFUSCkvRXEvc3JjIFwKLSAgICAkKExPQ0FMX1BBVEgpL0Jhc3MvbGliIFwKLSAgICAkKExPQ0FMX1BBVEgpL0Jhc3Mvc3JjIFwKLSAgICAkKExPQ0FMX1BBVEgpL0NvbW1vbi9saWIgXAotICAgICQoTE9DQUxfUEFUSCkvQ29tbW9uL3NyYyBcCi0gICAgJChMT0NBTF9QQVRIKS9CdW5kbGUvbGliIFwKLSAgICAkKExPQ0FMX1BBVEgpL0J1bmRsZS9zcmMgXAotICAgICQoTE9DQUxfUEFUSCkvU3BlY3RydW1BbmFseXplci9saWIgXAotICAgICQoTE9DQUxfUEFUSCkvU3BlY3RydW1BbmFseXplci9zcmMgXAotICAgICQoTE9DQUxfUEFUSCkvU3RlcmVvV2lkZW5pbmcvc3JjIFwKLSAgICAkKExPQ0FMX1BBVEgpL1N0ZXJlb1dpZGVuaW5nL2xpYgotCi1MT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbiAtREJVSUxEX0ZMT0FUIC1ESElHSEVSX0ZTCi1MT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgotCi1pbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCi0KLQotCi0jIFJldmVyYiBsaWJyYXJ5Ci1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfQVJNX01PREUgOj0gYXJtCi0KLUxPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotICAgIFJldmVyYi9zcmMvTFZSRVZfQXBwbHlOZXdTZXR0aW5ncy5jIFwKLSAgICBSZXZlcmIvc3JjL0xWUkVWX0NsZWFyQXVkaW9CdWZmZXJzLmMgXAotICAgIFJldmVyYi9zcmMvTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMuYyBcCi0gICAgUmV2ZXJiL3NyYy9MVlJFVl9HZXRJbnN0YW5jZUhhbmRsZS5jIFwKLSAgICBSZXZlcmIvc3JjL0xWUkVWX0dldE1lbW9yeVRhYmxlLmMgXAotICAgIFJldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jIFwKLSAgICBSZXZlcmIvc3JjL0xWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzLmMgXAotICAgIFJldmVyYi9zcmMvTFZSRVZfVGFibGVzLmMgXAotICAgIENvbW1vbi9zcmMvQWJzXzMyLmMgXAotICAgIENvbW1vbi9zcmMvSW5zdEFsbG9jLmMgXAotICAgIENvbW1vbi9zcmMvTG9hZENvbnN0XzE2LmMgXAotICAgIENvbW1vbi9zcmMvTG9hZENvbnN0XzMyLmMgXAotICAgIENvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmMgXAotICAgIENvbW1vbi9zcmMvTXVsdDNzXzMyeDE2LmMgXAotICAgIENvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEuYyBcCi0gICAgQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMgXAotICAgIENvbW1vbi9zcmMvRGVsYXlBbGxQYXNzX1NhdF8zMngxNlRvMzIuYyBcCi0gICAgQ29tbW9uL3NyYy9Db3B5XzE2LmMgXAotICAgIENvbW1vbi9zcmMvTWFjM3NfU2F0XzMyeDE2LmMgXAotICAgIENvbW1vbi9zcmMvRGVsYXlXcml0ZV8zMi5jIFwKLSAgICBDb21tb24vc3JjL1NoaWZ0X1NhdF92MzJ4djMyLmMgXAotICAgIENvbW1vbi9zcmMvQWRkMl9TYXRfMzJ4MzIuYyBcCi0gICAgQ29tbW9uL3NyYy9Kb2luVG8yaV8zMngzMi5jIFwKLSAgICBDb21tb24vc3JjL01vbm9UbzJJXzMyLmMgXAotICAgIENvbW1vbi9zcmMvTFZNX0ZPX0hQRi5jIFwKLSAgICBDb21tb24vc3JjL0xWTV9GT19MUEYuYyBcCi0gICAgQ29tbW9uL3NyYy9MVk1fUG9seW5vbWlhbC5jIFwKLSAgICBDb21tb24vc3JjL0xWTV9Qb3dlcjEwLmMgXAotICAgIENvbW1vbi9zcmMvTFZNX0dldE9tZWdhLmMgXAotICAgIENvbW1vbi9zcmMvTWl4U29mdF8yU3RfRDMyQzMxX1NBVC5jIFwKLSAgICBDb21tb24vc3JjL01peFNvZnRfMVN0X0QzMkMzMV9XUkEuYyBcCi0gICAgQ29tbW9uL3NyYy9NaXhJblNvZnRfRDMyQzMxX1NBVC5jIFwKLSAgICBDb21tb24vc3JjL0xWTV9NaXhlcl9UaW1lQ29uc3RhbnQuYyBcCi0gICAgQ29tbW9uL3NyYy9Db3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQuYyBcCi0gICAgQ29tbW9uL3NyYy9Db3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEuYyBcCi0gICAgQ29tbW9uL3NyYy9Db3JlX01peEluU29mdF9EMzJDMzFfU0FULmMKLQotTE9DQUxfTU9EVUxFOj0gbGlicmV2ZXJiCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgICQoTE9DQUxfUEFUSCkvUmV2ZXJiL2xpYiBcCi0gICAgJChMT0NBTF9QQVRIKS9SZXZlcmIvc3JjIFwKLSAgICAkKExPQ0FMX1BBVEgpL0NvbW1vbi9saWIgXAotICAgICQoTE9DQUxfUEFUSCkvQ29tbW9uL3NyYwotCi1MT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbiAtREJVSUxEX0ZMT0FUIC1ESElHSEVSX0ZTCi1MT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgotCi1pbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIvTFZEQkUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oCmluZGV4IDRjMmI5NTQuLmNjMDY2YjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oCkBAIC0xOTksOCArMTk5LDEwIEBACiAjZGVmaW5lIExWREJFX0NBUF9GU180NDEwMCAgICAgICAgICAgICAgIDEyOAogI2RlZmluZSBMVkRCRV9DQVBfRlNfNDgwMDAgICAgICAgICAgICAgICAyNTYKICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLSNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzk2MDAwICAgICAgICAgICAgICAgNTEyCi0jZGVmaW5lIExWREJFX0NBUF9GU18xOTIwMDAgICAgICAgICAgICAgIDEwMjQKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzg4MjAwICAgICAgICAgICAgICAgNTEyCisjZGVmaW5lIExWREJFX0NBUF9GU185NjAwMCAgICAgICAgICAgICAgIDEwMjQKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzE3NjQwMCAgICAgICAgICAgICAgMjA0OAorI2RlZmluZSBMVkRCRV9DQVBfRlNfMTkyMDAwICAgICAgICAgICAgICA0MDk2CiAjZW5kaWYKIAogdHlwZWRlZiBlbnVtCkBAIC0yMTUsOCArMjE3LDEwIEBACiAgICAgTFZEQkVfRlNfNDQxMDAgPSA3LAogICAgIExWREJFX0ZTXzQ4MDAwID0gOCwKICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLSAgICBMVkRCRV9GU185NjAwMCA9IDksCi0gICAgTFZEQkVfRlNfMTkyMDAwID0gMTAsCisgICAgTFZEQkVfRlNfODgyMDAgPSA5LAorICAgIExWREJFX0ZTXzk2MDAwID0gMTAsCisgICAgTFZEQkVfRlNfMTc2NDAwID0gMTEsCisgICAgTFZEQkVfRlNfMTkyMDAwID0gMTIsCiAjZW5kaWYKICAgICBMVkRCRV9GU19NQVggICA9IExWTV9NQVhJTlRfMzIKIH0gTFZEQkVfRnNfZW47CkBAIC0yNTYsNiArMjYwLDkgQEAKICAgICBMVkRCRV9Wb2x1bWVfZW4gICAgICAgICBWb2x1bWVDb250cm9sOwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFZvbHVtZWRCOwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEhlYWRyb29tZEI7CisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yQ2hhbm5lbHM7CisjZW5kaWYKIAogfSBMVkRCRV9QYXJhbXNfdDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvZWZmcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvZWZmcy5oCmluZGV4IDRlY2FmMTQuLjhmMDU4ZTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmgKQEAgLTU4MCwxMiArNTgwLDI0IEBACiAjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg5ODgyZgogCiAjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1ODE4ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTcxNjM2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODU4MThmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTQ0NjZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5NDQ4MWYKKwogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NjA0MGYKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MjA4MGYpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg2MDQwZgogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk0OTE1ZikKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTQ5MjhmCiAKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODcxODNmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzQzNjZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NzE4M2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NzIzM2YpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk3MjM3ZgorCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg3Mjk0ZgogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTc0NTg4ZikKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODcyOTRmCkBAIC02NDIsMTIgKzY1NCwyNCBAQAogI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4Nzg3MWYKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBIUEZfRnM4ODIwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTI3M2YKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MDU0NmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1MjczZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTkzMzU5ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTMzODFmCisKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODU1MzlmCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NzEwNzdmKQogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTUzOWYKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5Mzg5OGYpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkzOTE3ZgogCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg2OTEwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTczODIwZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODY5MTBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTY2NzlmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NjY4NWYKKwogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NzA0M2YKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3NDA4NmYpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg3MDQzZgpAQCAtNzAzLDEyICs3MjcsMjQgQEAKICNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODU2ODFmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ2NzhmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NjkzNTZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDY3OGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MjE1MWYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkyMTgyZgorCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0OTkyZgogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY5OTg0ZikKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ5OTJmCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTI3ODlmKQogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MjgxNWYKIAorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NjYxMmYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MzIyNGYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzc4X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NjEyZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk2MDc2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTYwODNmCisKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODY3NjlmCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzM1MzlmKQogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4Njc2OWYKQEAgLTc2NCwxMiArODAwLDI0IEBACiAjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45ODM0OTdmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODQwODRmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NjgxNjhmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDA4NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MDk0NGYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkwOTg1ZgorCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0NDQ2ZgogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY4ODkyZikKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ0NDZmCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTE2ODBmKQogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MTcxNGYKIAorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NjMxNGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MjYyOWYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2MzE0ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk1NDcyZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTU0ODJmCisKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODY0OTZmCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzI5OTJmKQogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NjQ5NmYKQEAgLTgzMSwxMiArODc5LDI0IEBACiAjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTY4NzVmCiAKICNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMDgzMWYKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwODMxZikKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk4MzIxZikKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5ODMzOGYKKwogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAwNzYyZgogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDA3NjJmKQogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTg0NjFmKQogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk4NDc3ZgogCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDA0MTZmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDQxNmYpCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5OTE2NGYpCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTkxNjlmCisKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMDM4MWYKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMzgxZikKQEAgLTg5MiwxMiArOTUyLDI0IEBACiAjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5NTY5MGYKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBCUEZfRnM4ODIwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDExNDZmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDExNDZmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NzY4NGYpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5NzcwOGYKKwogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDEwNTVmCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDEwNTVmKQogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5Nzg2OGYpCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAwLjk5Nzg5MWYKIAorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgMC4wMDA1NzNmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICgtMC4wMDA1NzNmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgKC0xLjk5ODg0N2YpCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAwLjk5ODg1M2YKKwogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgMC4wMDA1MjhmCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgKC0wLjAwMDUyOGYpCkBAIC05NTMsMTIgKzEwMjUsMjQgQEAKICNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTkzNjM5ZgogCiAjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgIDAuMDAxNjkzZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAwMTY5M2YpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICgtMS45OTY1ODJmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAwLjk5NjYxNWYKKwogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDE1NTVmCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAwMTU1NTVmKQogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAoLTEuOTk2ODYwZikKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk2ODkxZgogCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAwLjAwMDg0N2YKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDg0N2YpCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAoLTEuOTk4Mjk4ZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgIDAuOTk4MzA2ZgorCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAwLjAwMDc3OGYKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAoLTAuMDAwNzc4ZikKQEAgLTEwMTQsMTIgKzEwOTgsMjQgQEAKICNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5MjE3N2YKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBCUEZfRnM4ODIwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAyMDgzZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wMDIwODNmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTU3OTFmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk1ODM1ZgorCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDE5MTNmCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAxOTEzZikKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTYxMzRmKQogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2MTc0ZgogCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDEwNDJmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMTA0MmYpCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NzkwNGYpCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgMC45OTc5MTVmCisKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwMDk1OGYKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICgtMC4wMDA5NThmKQpAQCAtMTA0NSw3ICsxMTQxLDkgQEAKICNkZWZpbmUgQUdDX0FUVEFDS19GczQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTcxNjI4ZgogCiAjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnM4ODIwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ0NThmCiAjZGVmaW5lIEFHQ19BVFRBQ0tfRnM5NjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45ODU3MTJmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMxNzY0MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTIxOTlmCiAjZGVmaW5lIEFHQ19BVFRBQ0tfRnMxOTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTI4MzBmCiAjZW5kaWYKIApAQCAtMTA2Miw3ICsxMTYwLDkgQEAKICNkZWZpbmUgQUdDX0RFQ0FZX0ZzNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDA3ZgogCiAjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEFHQ19ERUNBWV9Gczg4MjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAzOGYKICNkZWZpbmUgQUdDX0RFQ0FZX0ZTOTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDM1ZgorI2RlZmluZSBBR0NfREVDQVlfRnMxNzY0MDAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAxODhmCiAjZGVmaW5lIEFHQ19ERUNBWV9GUzE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDE3NWYKICNlbmRpZgogCkBAIC0xMTI1LDcgKzEyMjUsOSBAQAogI2RlZmluZSBWT0xfVENfRnM0NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwNDUyNWYKICNkZWZpbmUgVk9MX1RDX0ZzNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDQxNThmCiAjaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIFZPTF9UQ19Gczg4MjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAyMjYzZgogI2RlZmluZSBWT0xfVENfRnM5NjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMjA3OWYKKyNkZWZpbmUgVk9MX1RDX0ZzMTc2NDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDExMzFmCiAjZGVmaW5lIFZPTF9UQ19GczE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAxMDM5ZgogI2VuZGlmCiAjZGVmaW5lIE1JWF9UQ19GczgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5MzY1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC44OTYxNTEgKi8KQEAgLTExMzgsOSArMTI0MCwxMyBAQAogI2RlZmluZSBNSVhfVENfRnM0NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjA5NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc5NTE1ICovCiAjZGVmaW5lIE1JWF9UQ19GczQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMTUwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODExNTAgKi8KICNpZmRlZiBISUdIRVJfRlMKKy8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTg5NzA0ICovCisjZGVmaW5lIE1JWF9UQ19Gczg4MjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyNDMwCiAjZGVmaW5lIE1JWF9UQ19Gczk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyNDU2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTA1MzAgKi8KKy8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk0ODM4ICovCisjZGVmaW5lIE1JWF9UQ19GczE3NjQwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyNTk4CiAjZGVmaW5lIE1JWF9UQ19GczE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyNjExICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTI1MjQgKi8KICNlbmRpZgogCiAjZW5kaWYgLypCVUlMRF9GTE9BVCovCi0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db250cm9sLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29udHJvbC5jCmluZGV4IGZkNDAxNmIuLjBiYTJjODYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db250cm9sLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvbnRyb2wuYwpAQCAtMTE4LDcgKzExOCw3IEBACiAgICAgICogQ2FsY3VsYXRlIHRoZSB0YWJsZSBvZmZzZXRzCiAgICAgICovCiAgICAgTFZNX1VJTlQxNiBPZmZzZXQgPSAoTFZNX1VJTlQxNikoKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZSArIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShwUGFyYW1zLT5DZW50cmVGcmVxdWVuY3kgKiAoMStMVkRCRV9GU180ODAwMCkpKTsgICAgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikocFBhcmFtcy0+Q2VudHJlRnJlcXVlbmN5ICogKDErTFZEQkVfRlNfNDgwMDApKSk7CiAjZW5kaWYKIAogICAgIC8qCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuYwppbmRleCAzZmZmMmEyLi4yOTQ2NzM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmMKQEAgLTk1LDcgKzk1LDcgQEAKICNpZmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5TaXplICAgPSBzaXplb2YoTFZEQkVfQ29lZl9GTE9BVF90KTsKICNlbHNlCi0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUgICAgICAgICA9IHNpemVvZihMVkRCRV9Db2VmX3QpOyAgIAorICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5TaXplICAgICAgICAgPSBzaXplb2YoTFZEQkVfQ29lZl90KTsKICNlbmRpZgogICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5BbGlnbm1lbnQgICAgPSBMVkRCRV9QRVJTSVNURU5UX0NPRUZfQUxJR047CiAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlR5cGUgICAgICAgICA9IExWREJFX1BFUlNJU1RFTlRfQ09FRjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oCmluZGV4IDRlNTIwN2YuLjQyMjVhMzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1ByaXZhdGUuaApAQCAtNjQsNyArNjQsMTIgQEAKICNkZWZpbmUgTFZEQkVfUEVSU0lTVEVOVF9DT0VGX0FMSUdOICAgICAgNCAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBjb2VmICovCiAjZGVmaW5lIExWREJFX1NDUkFUQ0hfQUxJR04gICAgICAgICAgICAgIDQgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgbG9uZyBkYXRhICovCiAKKyNpZmRlZiBTVVBQT1JUX01DCisvKiBOdW1iZXIgb2YgYnVmZmVycyByZXF1aXJlZCBmb3IgaW5wbGFjZSBwcm9jZXNzaW5nICovCisjZGVmaW5lIExWREJFX1NDUkFUQ0hCVUZGRVJTX0lOUExBQ0UgICAgIChMVk1fTUFYX0NIQU5ORUxTICogMykKKyNlbHNlCiAjZGVmaW5lIExWREJFX1NDUkFUQ0hCVUZGRVJTX0lOUExBQ0UgICAgIDYgICAgICAgLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLworI2VuZGlmCiAKICNkZWZpbmUgTFZEQkVfTUlYRVJfVEMgICAgICAgICAgICAgICAgICAgNSAgICAgICAvKiBNaXhlciB0aW1lICAqLwogI2RlZmluZSBMVkRCRV9CWVBBU1NfTUlYRVJfVEMgICAgICAgICAgICAxMDAgICAgIC8qIEJ5cGFzcyBtaXhlciB0aW1lICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1Byb2Nlc3MuYwppbmRleCAxMGVhNzAwLi5jNGQzNDAzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmMKQEAgLTIxLDExICsyMSwxMyBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAorI2luY2x1ZGUgPHN0cmluZy5oPiAvLyBtZW1zZXQKICNpbmNsdWRlICJMVkRCRS5oIgogI2luY2x1ZGUgIkxWREJFX1ByaXZhdGUuaCIKICNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCiAjaW5jbHVkZSAiQUdDLmgiCiAjaW5jbHVkZSAiTFZEQkVfQ29lZmZzLmgiICAgICAgICAgICAgICAgLyogRmlsdGVyIGNvZWZmaWNpZW50cyAqLworI2luY2x1ZGUgPGxvZy9sb2cuaD4KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTg3LDQyICsxODksNDkgQEAKIExWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9Qcm9jZXNzKExWREJFX0hhbmRsZV90IGhJbnN0YW5jZSwKICAgICBjb25zdCBMVk1fRkxPQVQgKnBJbkRhdGEsCiAgICAgTFZNX0ZMT0FUICpwT3V0RGF0YSwKLSAgICBMVk1fVUlOVDE2IE51bVNhbXBsZXMpCisgICAgY29uc3QgTFZNX1VJTlQxNiBOckZyYW1lcykgLy8gdXBkYXRlZCB0byB1c2Ugc2FtcGxlcyA9IGZyYW1lcyAqIGNoYW5uZWxzLgogewotCiAgIExWREJFX0luc3RhbmNlX3QgKnBJbnN0YW5jZSA9KExWREJFX0luc3RhbmNlX3QgKiloSW5zdGFuY2U7Ci0gIExWTV9GTE9BVCAqcFNjcmF0Y2hfaW4gPSAoTFZNX0ZMT0FUICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb24KLSAgW0xWREJFX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3M7Ci0gIExWTV9GTE9BVCAqcFNjcmF0Y2ggPSBwU2NyYXRjaF9pbiArIDIgKiBOdW1TYW1wbGVzOwotICBMVk1fRkxPQVQgKnBNb25vOwotICBMVk1fSU5UMzIgaWkgPSAwOwogCi0gIC8qIFNjcmF0Y2ggZm9yIFZvbHVtZSBDb250cm9sIHN0YXJ0cyBhdCBvZmZzZXQgb2YgNCpOdW1TYW1wbGVzIGZsb2F0IHZhbHVlcyBmcm9tIHBTY3JhdGNoICovCi0gIExWTV9GTE9BVCAgICAgICAgICAgKnBTY3JhdGNoVm9sID0gKExWTV9GTE9BVCAqKSgmcFNjcmF0Y2hfaW5bNCAqIE51bVNhbXBsZXNdKTsKLS8vICBMVk1fSU5UMTYgKnBTY3JhdGNoVm9sX2ludCA9IChMVk1fSU5UMTYgKikocFNjcmF0Y2hWb2wpOworICAvKkV4dHJhY3QgbnVtYmVyIG9mIENoYW5uZWxzIGluZm8qLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgLy8gTW9ubyBwYXNzZWQgaW4gYXMgc3RlcmVvCisgIGNvbnN0IExWTV9JTlQzMiBOckNoYW5uZWxzID0gcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVscyA9PSAxCisgICAgICA/IDIgOiBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzOworI2Vsc2UKKyAgY29uc3QgTFZNX0lOVDMyIE5yQ2hhbm5lbHMgPSAyOyAvLyBGQ0NfMgorI2VuZGlmCisgIGNvbnN0IExWTV9JTlQzMiBOclNhbXBsZXMgPSBOckNoYW5uZWxzICogTnJGcmFtZXM7CiAKLSAgLyogU2NyYXRjaCBmb3IgTW9ubyBwYXRoIHN0YXJ0cyBhdCBvZmZzZXQgb2YgNipOdW1TYW1wbGVzIDMyLWJpdCB2YWx1ZXMgZnJvbSBwU2NyYXRjaCAqLwotICBwTW9ubyA9ICZwU2NyYXRjaF9pbls0ICogTnVtU2FtcGxlc107CisgIC8qIFNwYWNlIHRvIHN0b3JlIERCRSBwYXRoIGNvbXB1dGF0aW9uICovCisgIExWTV9GTE9BVCAqIGNvbnN0IHBTY3JhdGNoID0KKyAgICAgICAgICAoTFZNX0ZMT0FUICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzczsKIAogICAvKgotICAgKiBDaGVjayB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgbm90IHRvbyBsYXJnZQorICAgKiBTY3JhdGNoIGZvciBNb25vIHBhdGggc3RhcnRzIGF0IG9mZnNldCBvZgorICAgKiBOclNhbXBsZXMgZmxvYXQgdmFsdWVzIGZyb20gcFNjcmF0Y2guCiAgICAqLwotICBpZiAoTnVtU2FtcGxlcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkKKyAgTFZNX0ZMT0FUICogY29uc3QgcE1vbm8gPSBwU2NyYXRjaCArIE5yU2FtcGxlczsKKworICAvKgorICAgKiBUUklDS1k6IHBNb25vIGlzIHVzZWQgYW5kIGRpc2NhcmRlZCBieSB0aGUgREJFIHBhdGguCisgICAqICAgICAgICAgc28gaXQgaXMgYXZhaWxhYmxlIGZvciB1c2UgZm9yIHRoZSBwU2NyYXRjaFZvbAorICAgKiAgICAgICAgIHBhdGggd2hpY2ggaXMgY29tcHV0ZWQgYWZ0ZXJ3YXJkcy4KKyAgICoKKyAgICogU3BhY2UgdG8gc3RvcmUgVm9sdW1lIENvbnRyb2wgcGF0aCBjb21wdXRhdGlvbi4KKyAgICogVGhpcyBpcyBpZGVudGljYWwgdG8gcE1vbm8gKHNlZSBUUklDS1kgY29tbWVudCkuCisgICAqLworICBMVk1fRkxPQVQgKiBjb25zdCBwU2NyYXRjaFZvbCA9IHBNb25vOworCisgIC8qCisgICAqIENoZWNrIHRoZSBudW1iZXIgb2YgZnJhbWVzIGlzIG5vdCB0b28gbGFyZ2UKKyAgICovCisgIGlmIChOckZyYW1lcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkKICAgewotICAgIHJldHVybihMVkRCRV9UT09NQU5ZU0FNUExFUyk7CisgICAgcmV0dXJuIExWREJFX1RPT01BTllTQU1QTEVTOwogICB9CiAKICAgLyoKLSAgICogQ29udmVydCAxNi1iaXQgc2FtcGxlcyB0byBGbG9hdAotICAgKi8KLSAgQ29weV9GbG9hdChwSW5EYXRhLCAvKiBTb3VyY2UgMTYtYml0IGRhdGEgICAgKi8KLSAgICAgIHBTY3JhdGNoX2luLCAvKiBEZXN0LiAzMi1iaXQgZGF0YSAgICAgKi8KLSAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7IC8qIExlZnQgYW5kIHJpZ2h0ICAgICAgICAqLwotCi0gIGZvciAoaWkgPSAwOyBpaSA8IDIgKiBOdW1TYW1wbGVzOyBpaSsrKSB7Ci0gICAgcFNjcmF0Y2hbaWldID0gcFNjcmF0Y2hfaW5baWldOwotICB9Ci0gIC8qCiAgICAqIENoZWNrIGlmIHRoZSBhbGdvcml0aG0gaXMgZW5hYmxlZAogICAgKi8KICAgLyogREJFIHBhdGggaXMgcHJvY2Vzc2VkIHdoZW4gREJFIGlzIE9OIG9yIGR1cmluZyBPbi9PZmYgdHJhbnNpdGlvbnMgKi8KQEAgLTIzMCw1MCArMjM5LDgxIEBACiAgICAgICAoTFZDX01peGVyX0dldEN1cnJlbnQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKQogICAgICAgICAgICE9TFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pKSkKICAgeworICAgIC8vIG1ha2UgY29weSBvZiBpbnB1dCBkYXRhCisgICAgQ29weV9GbG9hdChwSW5EYXRhLAorICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOwogCiAgICAgLyoKICAgICAgKiBBcHBseSB0aGUgaGlnaCBwYXNzIGZpbHRlciBpZiBzZWxlY3RlZAogICAgICAqLwogICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5IUEZTZWxlY3QgPT0gTFZEQkVfSFBGX09OKQogICAgIHsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICBCUV9NQ19EMzJGMzJDMzBfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5wQ29lZi0+SFBGSW5zdGFuY2UsIC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICovCisgICAgICAgICAgcFNjcmF0Y2gsIC8qIFNvdXJjZSAgICAgICAgICAgICAgICovCisgICAgICAgICAgcFNjcmF0Y2gsIC8qIERlc3RpbmF0aW9uICAgICAgICAgICovCisgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcywKKyAgICAgICAgICAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOworI2Vsc2UKICAgICAgIEJRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPnBDb2VmLT5IUEZJbnN0YW5jZSwvKiBGaWx0ZXIgaW5zdGFuY2UgICAgICAqLwotICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwgLyogU291cmNlICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsIC8qIERlc3RpbmF0aW9uICAgICAgICAgICovCi0gICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgKi8KKyAgICAgICAgICBwU2NyYXRjaCwgLyogU291cmNlICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICBwU2NyYXRjaCwgLyogRGVzdGluYXRpb24gICAgICAgICAgKi8KKyAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzKTsKKyNlbmRpZgogICAgIH0KIAogICAgIC8qCiAgICAgICogQ3JlYXRlIHRoZSBtb25vIHN0cmVhbQogICAgICAqLwotICAgIEZyb20yaVRvTW9ub19GbG9hdCgoTFZNX0ZMT0FUICopcFNjcmF0Y2gsIC8qIFN0ZXJlbyBzb3VyY2UgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBGcm9tTWNUb01vbm9fRmxvYXQocFNjcmF0Y2gsIC8qIFNvdXJjZSAqLworICAgICAgICBwTW9ubywgLyogTW9ubyBkZXN0aW5hdGlvbiAqLworICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLCAgLyogTnVtYmVyIG9mIGZyYW1lcyAqLworICAgICAgICAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOworI2Vsc2UKKyAgICBGcm9tMmlUb01vbm9fRmxvYXQocFNjcmF0Y2gsIC8qIFN0ZXJlbyBzb3VyY2UgICAgICAgICAqLwogICAgICAgICBwTW9ubywgLyogTW9ubyBkZXN0aW5hdGlvbiAgICAgICovCi0gICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7IC8qIE51bWJlciBvZiBzYW1wbGVzICAgICAqLworICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzKTsKKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBBcHBseSB0aGUgYmFuZCBwYXNzIGZpbHRlcgogICAgICAqLwogICAgIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyKCZwSW5zdGFuY2UtPnBDb2VmLT5CUEZJbnN0YW5jZSwgLyogRmlsdGVyIGluc3RhbmNlICAgICAgICovCi0gICAgICAgIChMVk1fRkxPQVQgKilwTW9ubywgLyogU291cmNlICAgICAgICAgICAgICAgICovCi0gICAgICAgIChMVk1fRkxPQVQgKilwTW9ubywgLyogRGVzdGluYXRpb24gICAgICAgICAgICovCi0gICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7IC8qIE51bWJlciBvZiBzYW1wbGVzICAgICAqLworICAgICAgICBwTW9ubywgLyogU291cmNlICAgICAgICAgICAgICAgICovCisgICAgICAgIHBNb25vLCAvKiBEZXN0aW5hdGlvbiAgICAgICAgICAgKi8KKyAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcyk7CiAKICAgICAvKgogICAgICAqIEFwcGx5IHRoZSBBR0MgYW5kIG1peAogICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBBR0NfTUlYX1ZPTF9NYzFNb25fRDMyX1dSQSgmcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UsIC8qIEluc3RhbmNlIHBvaW50ZXIgICAgICAqLworICAgICAgICBwU2NyYXRjaCwgLyogU291cmNlICAgICAgICAgKi8KKyAgICAgICAgcE1vbm8sIC8qIE1vbm8gYmFuZCBwYXNzIHNvdXJjZSAqLworICAgICAgICBwU2NyYXRjaCwgLyogRGVzdGluYXRpb24gICAgKi8KKyAgICAgICAgTnJGcmFtZXMsIC8qIE51bWJlciBvZiBmcmFtZXMgICAgICovCisgICAgICAgIE5yQ2hhbm5lbHMpOyAvKiBOdW1iZXIgb2YgY2hhbm5lbHMgICAgICovCisjZWxzZQogICAgIEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQSgmcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UsIC8qIEluc3RhbmNlIHBvaW50ZXIgICAgICAqLwogICAgICAgICBwU2NyYXRjaCwgLyogU3RlcmVvIHNvdXJjZSAgICAgICAgICovCiAgICAgICAgIHBNb25vLCAvKiBNb25vIGJhbmQgcGFzcyBzb3VyY2UgKi8KICAgICAgICAgcFNjcmF0Y2gsIC8qIFN0ZXJlbyBkZXN0aW5hdGlvbiAgICAqLwotICAgICAgICBOdW1TYW1wbGVzKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgICovCisgICAgICAgIE5yRnJhbWVzKTsKKyNlbmRpZgogCi0gICAgZm9yIChpaSA9IDA7IGlpIDwgMiAqIE51bVNhbXBsZXM7IGlpKyspIHsKKyAgICBmb3IgKExWTV9JTlQzMiBpaSA9IDA7IGlpIDwgTnJTYW1wbGVzOyArK2lpKSB7CiAgICAgICAvL1RPRE86IHJlcGxhY2Ugd2l0aCBleGlzdGluZyBjbGFtcGluZyBmdW5jdGlvbgotICAgICAgaWYocFNjcmF0Y2hbaWldIDwgLTEuMCkgeworICAgICAgaWYgKHBTY3JhdGNoW2lpXSA8IC0xLjApIHsKICAgICAgICAgcFNjcmF0Y2hbaWldID0gLTEuMDsKLSAgICAgIH0gZWxzZSBpZihwU2NyYXRjaFtpaV0gPiAxLjApIHsKKyAgICAgIH0gZWxzZSBpZiAocFNjcmF0Y2hbaWldID4gMS4wKSB7CiAgICAgICAgIHBTY3JhdGNoW2lpXSA9IDEuMDsKICAgICAgIH0KICAgICB9CisgIH0gZWxzZSB7CisgICAgLy8gY2xlYXIgREJFIHByb2Nlc3NlZCBwYXRoCisgICAgbWVtc2V0KHBTY3JhdGNoLCAwLCBzaXplb2YoKnBTY3JhdGNoKSAqIE5yU2FtcGxlcyk7CiAgIH0KIAogICAvKiBCeXBhc3MgVm9sdW1lIHBhdGggaXMgcHJvY2Vzc2VkIHdoZW4gREJFIGlzIE9GRiBvciBkdXJpbmcgT24vT2ZmIHRyYW5zaXRpb25zICovCkBAIC0yODYsMjEgKzMyNiw0MCBAQAogICAgICAqIFRoZSBhbGdvcml0aG0gaXMgZGlzYWJsZWQgYnV0IHZvbHVtZSBtYW5hZ2VtZW50IGlzIHJlcXVpcmVkIHRvIGNvbXBlbnNhdGUgZm9yCiAgICAgICogaGVhZHJvb20gYW5kIHZvbHVtZSAoaWYgZW5hYmxlZCkKICAgICAgKi8KLSAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLAotICAgICAgICBwU2NyYXRjaF9pbiwKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLAorICAgICAgICBwSW5EYXRhLAogICAgICAgICBwU2NyYXRjaFZvbCwKLSAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgLyogTGVmdCBhbmQgcmlnaHQgKi8KKyAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcywKKyAgICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKKyNlbHNlCisgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZSwKKyAgICAgICAgcEluRGF0YSwKKyAgICAgICAgcFNjcmF0Y2hWb2wsCisgICAgICAgIChMVk1fSU5UMTYpTnJTYW1wbGVzKTsgLyogTGVmdCBhbmQgcmlnaHQsIHJlYWxseSAjIHNhbXBsZXMgKi8KKyNlbmRpZgorICB9IGVsc2UgeworICAgIC8vIGNsZWFyIGJ5cGFzcyB2b2x1bWUgcGF0aAorICAgIG1lbXNldChwU2NyYXRjaFZvbCwgMCwgc2l6ZW9mKCpwU2NyYXRjaFZvbCkgKiBOclNhbXBsZXMpOwogICB9CiAKICAgLyoKICAgICogTWl4IERCRSBwcm9jZXNzZWQgcGF0aCBhbmQgYnlwYXNzIHZvbHVtZSBwYXRoCiAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgTFZDX01peFNvZnRfMk1jX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLAorICAgICAgcFNjcmF0Y2gsCisgICAgICBwU2NyYXRjaFZvbCwKKyAgICAgIHBPdXREYXRhLAorICAgICAgKExWTV9JTlQxNilOckZyYW1lcywKKyAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7CisjZWxzZQogICBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIsCiAgICAgICBwU2NyYXRjaCwKICAgICAgIHBTY3JhdGNoVm9sLAogICAgICAgcE91dERhdGEsCi0gICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOwotCi0gIHJldHVybihMVkRCRV9TVUNDRVNTKTsKKyAgICAgIChMVk1fSU5UMTYpTnJTYW1wbGVzKTsKKyNlbmRpZgorICByZXR1cm4gTFZEQkVfU1VDQ0VTUzsKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5jCmluZGV4IGM0YTliMTQuLmEyY2U0MDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmMKQEAgLTg4LDExICs4OCwyMSBAQAogICAgICAtSFBGX0ZzNDgwMDBfRmM1NV9CMiwKICAgICAgLUhQRl9GczQ4MDAwX0ZjNTVfQjF9LAogI2lmZGVmIEhJR0hFUl9GUworICAgIHtIUEZfRnM4ODIwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9Gczg4MjAwX0ZjNTVfQTEsCisgICAgIEhQRl9Gczg4MjAwX0ZjNTVfQTAsCisgICAgIC1IUEZfRnM4ODIwMF9GYzU1X0IyLAorICAgICAtSFBGX0ZzODgyMDBfRmM1NV9CMX0sCiAgICAge0hQRl9Gczk2MDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgSFBGX0ZzOTYwMDBfRmM1NV9BMSwKICAgICAgSFBGX0ZzOTYwMDBfRmM1NV9BMCwKICAgICAgLUhQRl9Gczk2MDAwX0ZjNTVfQjIsCiAgICAgIC1IUEZfRnM5NjAwMF9GYzU1X0IxfSwKKyAgICB7SFBGX0ZzMTc2NDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczE3NjQwMF9GYzU1X0ExLAorICAgICBIUEZfRnMxNzY0MDBfRmM1NV9BMCwKKyAgICAgLUhQRl9GczE3NjQwMF9GYzU1X0IyLAorICAgICAtSFBGX0ZzMTc2NDAwX0ZjNTVfQjF9LAogICAgIHtIUEZfRnMxOTIwMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgSFBGX0ZzMTkyMDAwX0ZjNTVfQTEsCiAgICAgIEhQRl9GczE5MjAwMF9GYzU1X0EwLApAQCAtMTQ3LDExICsxNTcsMjEgQEAKICAgICAgLUhQRl9GczQ4MDAwX0ZjNjZfQjIsCiAgICAgIC1IUEZfRnM0ODAwMF9GYzY2X0IxfSwKICNpZmRlZiBISUdIRVJfRlMKKyAgICB7SFBGX0ZzODgyMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM4ODIwMF9GYzY2X0ExLAorICAgICBIUEZfRnM4ODIwMF9GYzY2X0EwLAorICAgICAtSFBGX0ZzODgyMDBfRmM2Nl9CMiwKKyAgICAgLUhQRl9Gczg4MjAwX0ZjNjZfQjF9LAogICAgIHtIUEZfRnM5NjAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIEhQRl9Gczk2MDAwX0ZjNjZfQTEsCiAgICAgIEhQRl9Gczk2MDAwX0ZjNjZfQTAsCiAgICAgIC1IUEZfRnM5NjAwMF9GYzY2X0IyLAogICAgICAtSFBGX0ZzOTYwMDBfRmM2Nl9CMX0sCisgICAge0hQRl9GczE3NjQwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxNzY0MDBfRmM2Nl9BMSwKKyAgICAgSFBGX0ZzMTc2NDAwX0ZjNjZfQTAsCisgICAgIC1IUEZfRnMxNzY0MDBfRmM2Nl9CMiwKKyAgICAgLUhQRl9GczE3NjQwMF9GYzY2X0IxfSwKICAgICB7SFBGX0ZzMTkyMDAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIEhQRl9GczE5MjAwMF9GYzY2X0ExLAogICAgICBIUEZfRnMxOTIwMDBfRmM2Nl9BMCwKQEAgLTIwNywxMSArMjI3LDIxIEBACiAgICAgIC1IUEZfRnM0ODAwMF9GYzc4X0IyLAogICAgICAtSFBGX0ZzNDgwMDBfRmM3OF9CMX0sCiAjaWZkZWYgSElHSEVSX0ZTCisgICAge0hQRl9Gczg4MjAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzODgyMDBfRmM3OF9BMSwKKyAgICAgSFBGX0ZzODgyMDBfRmM3OF9BMCwKKyAgICAgLUhQRl9Gczg4MjAwX0ZjNzhfQjIsCisgICAgIC1IUEZfRnM4ODIwMF9GYzc4X0IxfSwKICAgICB7SFBGX0ZzOTYwMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBIUEZfRnM5NjAwMF9GYzc4X0ExLAogICAgICBIUEZfRnM5NjAwMF9GYzc4X0EwLAogICAgICAtSFBGX0ZzOTYwMDBfRmM3OF9CMiwKICAgICAgLUhQRl9Gczk2MDAwX0ZjNzhfQjF9LAorICAgIHtIUEZfRnMxNzY0MDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTc2NDAwX0ZjNzhfQTEsCisgICAgIEhQRl9GczE3NjQwMF9GYzc4X0EwLAorICAgICAtSFBGX0ZzMTc2NDAwX0ZjNzhfQjIsCisgICAgIC1IUEZfRnMxNzY0MDBfRmM3OF9CMX0sCiAgICAge0hQRl9GczE5MjAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBIUEZfRnMxOTIwMDBfRmM3OF9BMSwKICAgICAgSFBGX0ZzMTkyMDAwX0ZjNzhfQTAsCkBAIC0yNjksMTEgKzI5OSwyMSBAQAogCiAjaWZkZWYgSElHSEVSX0ZTCiAgICAgLAorICAgIHtIUEZfRnM4ODIwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9Gczg4MjAwX0ZjOTBfQTEsCisgICAgIEhQRl9Gczg4MjAwX0ZjOTBfQTAsCisgICAgIC1IUEZfRnM4ODIwMF9GYzkwX0IyLAorICAgICAtSFBGX0ZzODgyMDBfRmM5MF9CMX0sCiAgICAge0hQRl9Gczk2MDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgSFBGX0ZzOTYwMDBfRmM5MF9BMSwKICAgICAgSFBGX0ZzOTYwMDBfRmM5MF9BMCwKICAgICAgLUhQRl9Gczk2MDAwX0ZjOTBfQjIsCiAgICAgIC1IUEZfRnM5NjAwMF9GYzkwX0IxfSwKKyAgICB7SFBGX0ZzMTc2NDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczE3NjQwMF9GYzkwX0ExLAorICAgICBIUEZfRnMxNzY0MDBfRmM5MF9BMCwKKyAgICAgLUhQRl9GczE3NjQwMF9GYzkwX0IyLAorICAgICAtSFBGX0ZzMTc2NDAwX0ZjOTBfQjF9LAogICAgIHtIUEZfRnMxOTIwMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgSFBGX0ZzMTkyMDAwX0ZjOTBfQTEsCiAgICAgIEhQRl9GczE5MjAwMF9GYzkwX0EwLApAQCAtMzIwLDkgKzM2MCwxNSBAQAogICAgICAtQlBGX0ZzNDgwMDBfRmM1NV9CMiwKICAgICAgLUJQRl9GczQ4MDAwX0ZjNTVfQjF9LAogI2lmZGVmIEhJR0hFUl9GUworICAgICB7QlBGX0ZzODgyMDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgLUJQRl9Gczg4MjAwX0ZjNTVfQjIsCisgICAgICAtQlBGX0ZzODgyMDBfRmM1NV9CMX0sCiAgICAgIHtCUEZfRnM5NjAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnM5NjAwMF9GYzU1X0IyLAogICAgICAtQlBGX0ZzOTYwMDBfRmM1NV9CMX0sCisgICAgIHtCUEZfRnMxNzY0MDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgIC1CUEZfRnMxNzY0MDBfRmM1NV9CMiwKKyAgICAgIC1CUEZfRnMxNzY0MDBfRmM1NV9CMX0sCiAgICAgIHtCUEZfRnMxOTIwMDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgLUJQRl9GczE5MjAwMF9GYzU1X0IyLAogICAgICAtQlBGX0ZzMTkyMDAwX0ZjNTVfQjF9LApAQCAtMzU3LDkgKzQwMywxNSBAQAogICAgICAtQlBGX0ZzNDgwMDBfRmM2Nl9CMiwKICAgICAgLUJQRl9GczQ4MDAwX0ZjNjZfQjF9LAogI2lmZGVmIEhJR0hFUl9GUworICAgIHtCUEZfRnM4ODIwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnM4ODIwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzODgyMDBfRmM2Nl9CMX0sCiAgICAge0JQRl9Gczk2MDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgLUJQRl9Gczk2MDAwX0ZjNjZfQjIsCiAgICAgIC1CUEZfRnM5NjAwMF9GYzY2X0IxfSwKKyAgICB7QlBGX0ZzMTc2NDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxNzY0MDBfRmM2Nl9CMiwKKyAgICAgLUJQRl9GczE3NjQwMF9GYzY2X0IxfSwKICAgICB7QlBGX0ZzMTkyMDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnMxOTIwMDBfRmM2Nl9CMiwKICAgICAgLUJQRl9GczE5MjAwMF9GYzY2X0IxfSwKQEAgLTM5NCw5ICs0NDYsMTUgQEAKICAgICAgLUJQRl9GczQ4MDAwX0ZjNzhfQjIsCiAgICAgIC1CUEZfRnM0ODAwMF9GYzc4X0IxfSwKICNpZmRlZiBISUdIRVJfRlMKKyAgICB7QlBGX0ZzODgyMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzODgyMDBfRmM2Nl9CMiwKKyAgICAgLUJQRl9Gczg4MjAwX0ZjNjZfQjF9LAogICAgIHtCUEZfRnM5NjAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnM5NjAwMF9GYzc4X0IyLAogICAgICAtQlBGX0ZzOTYwMDBfRmM3OF9CMX0sCisgICAge0JQRl9GczE3NjQwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTc2NDAwX0ZjNjZfQjIsCisgICAgIC1CUEZfRnMxNzY0MDBfRmM2Nl9CMX0sCiAgICAge0JQRl9GczE5MjAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICAtQlBGX0ZzMTkyMDAwX0ZjNzhfQjIsCiAgICAgIC1CUEZfRnMxOTIwMDBfRmM3OF9CMX0sCkBAIC00MzIsOSArNDkwLDE1IEBACiAgICAgIC1CUEZfRnM0ODAwMF9GYzkwX0IxfQogI2lmZGVmIEhJR0hFUl9GUwogICAgICwKKyAgICB7QlBGX0ZzODgyMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzODgyMDBfRmM5MF9CMiwKKyAgICAgLUJQRl9Gczg4MjAwX0ZjOTBfQjF9LAogICAgIHtCUEZfRnM5NjAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIC1CUEZfRnM5NjAwMF9GYzkwX0IyLAogICAgICAtQlBGX0ZzOTYwMDBfRmM5MF9CMX0sCisgICAge0JQRl9GczE3NjQwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTc2NDAwX0ZjOTBfQjIsCisgICAgIC1CUEZfRnMxNzY0MDBfRmM5MF9CMX0sCiAgICAge0JQRl9GczE5MjAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICAtQlBGX0ZzMTkyMDAwX0ZjOTBfQjIsCiAgICAgIC1CUEZfRnMxOTIwMDBfRmM5MF9CMX0KQEAgLTQ2Niw3ICs1MzAsOSBAQAogICAgIEFHQ19BVFRBQ0tfRnM0NDEwMCwKICAgICBBR0NfQVRUQUNLX0ZzNDgwMDAKICNpZmRlZiBISUdIRVJfRlMKKyAgICAsQUdDX0FUVEFDS19Gczg4MjAwCiAgICAgLEFHQ19BVFRBQ0tfRnM5NjAwMAorICAgICxBR0NfQVRUQUNLX0ZzMTc2NDAwCiAgICAgLEFHQ19BVFRBQ0tfRnMxOTIwMDAKICNlbmRpZgogCkBAIC00ODgsNyArNTU0LDkgQEAKICAgICBBR0NfREVDQVlfRnM0NDEwMCwKICAgICBBR0NfREVDQVlfRnM0ODAwMAogI2lmZGVmIEhJR0hFUl9GUworICAgICxBR0NfREVDQVlfRnM4ODIwMAogICAgICxBR0NfREVDQVlfRlM5NjAwMAorICAgICxBR0NfREVDQVlfRnMxNzY0MDAKICAgICAsQUdDX0RFQ0FZX0ZTMTkyMDAwCiAjZW5kaWYKIApAQCAtNTgzLDcgKzY1MSw5IEBACiAgICAgVk9MX1RDX0ZzNDQxMDAsCiAgICAgVk9MX1RDX0ZzNDgwMDAKICNpZmRlZiBISUdIRVJfRlMKKyAgICAsVk9MX1RDX0ZzODgyMDAKICAgICAsVk9MX1RDX0ZzOTYwMDAKKyAgICAsVk9MX1RDX0ZzMTc2NDAwCiAgICAgLFZPTF9UQ19GczE5MjAwMAogI2VuZGlmCiB9OwpAQCAtNjAyLDcgKzY3Miw5IEBACiAgICAgTUlYX1RDX0ZzNDQxMDAsCiAgICAgTUlYX1RDX0ZzNDgwMDAKICNpZmRlZiBISUdIRVJfRlMKKyAgICAsTUlYX1RDX0ZzODgyMDAKICAgICAsTUlYX1RDX0ZzOTYwMDAKKyAgICAsTUlYX1RDX0ZzMTc2NDAwCiAgICAgLE1JWF9UQ19GczE5MjAwMAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9saWIvTFZNLmgKaW5kZXggOWI2ZGEzMS4uNTA4MmE1MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9saWIvTFZNLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9saWIvTFZNLmgKQEAgLTI5Niw2ICsyOTYsMTAgQEAKICAgICAvKiBTcGVjdHJ1bSBBbmFseXplciBwYXJhbWV0ZXJzIENvbnRyb2wgKi8KICAgICBMVk1fUFNBX01vZGVfZW4gICAgICAgICAgICAgUFNBX0VuYWJsZTsKICAgICBMVk1fUFNBX0RlY2F5U3BlZWRfZW4gICAgICAgUFNBX1BlYWtEZWNheVJhdGU7ICAgICAgLyogUGVhayB2YWx1ZSBkZWNheSByYXRlKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHM7CisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgIENoTWFzazsKKyNlbmRpZgogCiB9IExWTV9Db250cm9sUGFyYW1zX3Q7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQnVmZmVycy5jCmluZGV4IDBhM2MzMGUuLmJkY2E1ZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuYwpAQCAtMjUsNiArMjUsOCBAQAogI2luY2x1ZGUgIkxWTV9Qcml2YXRlLmgiCiAjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgogCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVk1fQnVmZmVyTWFuYWdlZEluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02Miw4ICs2NCwxMSBAQAogICAgIExWTV9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CiAgICAgTFZNX0J1ZmZlcl90ICAgICAqcEJ1ZmZlcjsKICAgICBMVk1fRkxPQVQgICAgICAgICpwRGVzdDsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0lOVDE2ICAgICAgICBOdW1DaGFubmVscyA9IHBJbnN0YW5jZS0+TnJDaGFubmVsczsKKyNlbHNlCiAgICAgTFZNX0lOVDE2ICAgICAgICBOdW1DaGFubmVscyA9IDI7Ci0KKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBTZXQgdGhlIHByb2Nlc3NpbmcgYWRkcmVzcyBwb2ludGVycwpAQCAtMjA3LDggKzIxMiw3IEBACiAgICAgTFZNX0luc3RhbmNlX3QgICAqcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKICAgICBMVk1fQnVmZmVyX3QgICAgICpwQnVmZmVyOwogICAgIExWTV9JTlQxNiAgICAgICAgKnBEZXN0OwotICAgIExWTV9JTlQxNiAgICAgICAgTnVtQ2hhbm5lbHMgPTI7Ci0KKyAgICBMVk1fSU5UMTYgICAgICAgIE51bUNoYW5uZWxzID0gMjsKIAogICAgIC8qCiAgICAgICogU2V0IHRoZSBwcm9jZXNzaW5nIGFkZHJlc3MgcG9pbnRlcnMKQEAgLTQ5OSw3ICs1MDMsNyBAQAogICAgICAgICBpZiAocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzICE9IDApCiAgICAgICAgIHsKICAgICAgICAgICAgIENvcHlfMTYoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERldHNpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7ICAgICAgIC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCiAgICAgICAgICAgICBwRGVzdCArPSAyICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzOyAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgb3V0cHV0IHBvaW50ZXIgKi8KICAgICAgICAgICAgIHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCA9IChMVk1fSU5UMTYpKHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCAtIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyk7IC8qIFVwZGF0ZSB0aGUgbnVtYnIgb2Ygc2FtcGxlcyB0byBvdXRwdXQgKi8KQEAgLTc1MCw3ICs3NTQsMTEgQEAKICAgICBMVk1fSU5UMTYgICAgICAgTnVtU2FtcGxlczsKICAgICBMVk1fRkxPQVQgICAgICAgKnBTdGFydDsKICAgICBMVk1fRkxPQVQgICAgICAgKnBEZXN0OwotCisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9JTlQzMiAgICAgICBOckNoYW5uZWxzID0gcEluc3RhbmNlLT5OckNoYW5uZWxzOworI2RlZmluZSBOckZyYW1lcyBOdW1TYW1wbGVzICAvLyBhbGlhcyBmb3IgY2xhcml0eQorI2RlZmluZSBGcmFtZUNvdW50IFNhbXBsZUNvdW50CisjZW5kaWYKIAogICAgIC8qCiAgICAgICogU2V0IHRoZSBwb2ludGVycwpAQCAtNzU4LDcgKzc2Niw2IEBACiAgICAgTnVtU2FtcGxlcyA9IHBCdWZmZXItPlNhbXBsZXNUb091dHB1dDsKICAgICBwU3RhcnQgICAgID0gcEJ1ZmZlci0+cFNjcmF0Y2g7CiAKLQogICAgIC8qCiAgICAgICogY2hlY2sgaWYgaXQgaXMgdGhlIGZpcnN0IGNhbGwgb2YgYSBibG9jawogICAgICAgKi8KQEAgLTc4NiwxNCArNzkzLDI1IEBACiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQ29weSBhbGwgb3V0cHV0IGRlbGF5IHNhbXBsZXMgdG8gdGhlIG91dHB1dAogICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQwogICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERldHNpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJDaGFubmVscyAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcykpOworI2Vsc2UKKyAgICAgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7IC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCisjZW5kaWYKIAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50cwogICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgcERlc3QgKz0gTnJDaGFubmVscyAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlczsgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisjZWxzZQogICAgICAgICAgICAgcERlc3QgKz0gMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlczsgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisjZW5kaWYKICAgICAgICAgICAgIE51bVNhbXBsZXMgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIC0gcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKTsgLyogU2FtcGxlcyBsZWZ0IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc2VuZCAqLwogICAgICAgICAgICAgcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzID0gMDsgLyogTm8gc2FtcGxlcyBsZWZ0IGluIHRoZSBidWZmZXIgKi8KQEAgLTgwMywyMyArODIxLDQwIEBACiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQ29weSBvbmx5IHNvbWUgb2YgdGhlIG91cHV0IGRlbGF5IHNhbXBsZXMgdG8gdGhlIG91dHB1dAogICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQwogICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGV0c2luYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJDaGFubmVscyAqIE5yRnJhbWVzKSk7ICAgICAgIC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCisjZWxzZQorICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KKyNlbmRpZgogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogVXBkYXRlIHRoZSBwb2ludGVyIGFuZCBzYW1wbGUgY291bnRzCiAgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICBwRGVzdCArPSBOckNoYW5uZWxzICogTnJGcmFtZXM7IC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworI2Vsc2UKICAgICAgICAgICAgIHBEZXN0ICs9IDIgKiBOdW1TYW1wbGVzOyAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyNlbmRpZgogICAgICAgICAgICAgLyogTm8gc2FtcGxlcyBsZWZ0IGluIHRoZSBidWZmZXIgKi8KICAgICAgICAgICAgIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA9IChMVk1fSU5UMTYpKHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyAtIE51bVNhbXBsZXMpOwogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogUmVhbGlnbiB0aGUgZGVsYXkgYnVmZmVyIGRhdGEgdG8gYXZvaWQgdXNpbmcgY2lyY3VsYXIgYnVmZmVyIG1hbmFnZW1lbnQKICAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyW05yQ2hhbm5lbHMgKiBOckZyYW1lc10sICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIG1vdmUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJDaGFubmVscyAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcykpOworI2Vsc2UKICAgICAgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzIgKiBOdW1TYW1wbGVzXSwgICAgICAgICAvKiBTb3VyY2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcykpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBtb3ZlICovCisjZW5kaWYKICAgICAgICAgICAgIE51bVNhbXBsZXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlcyBsZWZ0IHRvIHNlbmQgKi8KICAgICAgICAgfQogICAgIH0KQEAgLTgzNiwxMyArODcxLDIzIEBACiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogQ29weSBhbGwgcHJvY2Vzc2VkIHNhbXBsZXMgdG8gdGhlIG91dHB1dAogICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQwogICAgICAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGV0c2luYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJDaGFubmVscyAqIEZyYW1lQ291bnQpKTsgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisjZWxzZQorICAgICAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIFNhbXBsZUNvdW50KSk7IC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLworI2VuZGlmCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogVXBkYXRlIHRoZSBwb2ludGVyIGFuZCBzYW1wbGUgY291bnRzCiAgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICBwRGVzdCAgICAgICs9IE5yQ2hhbm5lbHMgKiBGcmFtZUNvdW50OyAgICAgICAgICAgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisjZWxzZQogICAgICAgICAgICAgcERlc3QgICAgICArPSAyICogU2FtcGxlQ291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyNlbmRpZgogICAgICAgICAgICAgTnVtU2FtcGxlcyAgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIC0gU2FtcGxlQ291bnQpOyAgICAvKiBTYW1wbGVzIGxlZnQgdG8gc2VuZCAqLwogICAgICAgICAgICAgU2FtcGxlQ291bnQgPSAwOyAvKiBObyBzYW1wbGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLwogICAgICAgICB9CkBAIC04NTEsMTQgKzg5NiwyNSBAQAogICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAqIENvcHkgb25seSBzb21lIHByb2Nlc3NlZCBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKICAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yQ2hhbm5lbHMgKiBOckZyYW1lcykpOyAgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisjZWxzZQogICAgICAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgIC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLworI2VuZGlmCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogVXBkYXRlIHRoZSBwb2ludGVycyBhbmQgc2FtcGxlIGNvdW50cwogICAgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICBwU3RhcnQgICAgICArPSBOckNoYW5uZWxzICogTnJGcmFtZXM7ICAgICAgICAgICAgICAgLyogUHJvY2Vzc2VkIHNhbXBsZSBwb2ludGVyICovCisgICAgICAgICAgICBwRGVzdCAgICAgICArPSBOckNoYW5uZWxzICogTnJGcmFtZXM7ICAgICAgICAgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisjZWxzZQogICAgICAgICAgICAgcFN0YXJ0ICAgICAgKz0gMiAqIE51bVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJvY2Vzc2VkIHNhbXBsZSBwb2ludGVyICovCiAgICAgICAgICAgICBwRGVzdCAgICAgICArPSAyICogTnVtU2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyNlbmRpZgogICAgICAgICAgICAgU2FtcGxlQ291bnQgID0gKExWTV9JTlQxNikoU2FtcGxlQ291bnQgLSBOdW1TYW1wbGVzKTsgLyogUHJvY2Vzc2VkIHNhbXBsZXMgbGVmdCAqLwogICAgICAgICAgICAgTnVtU2FtcGxlcyAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIHNhbXBsZSBjb3VudCAqLwogICAgICAgICB9CkBAIC04NzAsOSArOTI2LDE2IEBACiAgICAgICovCiAgICAgaWYgKFNhbXBsZUNvdW50ICE9IDApCiAgICAgeworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgJnBCdWZmZXItPk91dERlbGF5QnVmZmVyW05yQ2hhbm5lbHMgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yQ2hhbm5lbHMgKiBGcmFtZUNvdW50KSk7ICAgICAgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisjZWxzZQogICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCiAgICAgICAgICAgICAgICAgICAgJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzIgKiBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXNdLCAvKiBEZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBTYW1wbGVDb3VudCkpOyAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLworI2VuZGlmCiAgICAgICAgIC8qIFVwZGF0ZSB0aGUgYnVmZmVyIGNvdW50ICovCiAgICAgICAgIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA9IChMVk1fSU5UMTYpKHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyArIFNhbXBsZUNvdW50KTsKICAgICB9CkBAIC0xMDYzLDE0ICsxMTI2LDI5IEBACiB7CiAKICAgICBMVk1fSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UgID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgIE51bUNoYW5uZWxzID0yOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fSU5UMTYgICAgICAgICAgIE51bUNoYW5uZWxzID0gcEluc3RhbmNlLT5OckNoYW5uZWxzOworICAgIGlmIChOdW1DaGFubmVscyA9PSAxKQorICAgIHsKKyAgICAgICAgLyogTW9ubyBpbnB1dCBpcyBwcm9jZXNzZWQgYXMgc3RlcmVvIGJ5IExWTSBtb2R1bGUgKi8KKyAgICAgICAgTnVtQ2hhbm5lbHMgPSAyOworICAgIH0KKyN1bmRlZiBOckZyYW1lcworI2RlZmluZSBOckZyYW1lcyAoKnBOdW1TYW1wbGVzKSAvLyBhbGlhcyBmb3IgY2xhcml0eQorI2Vsc2UKKyAgICBMVk1fSU5UMTYgICAgICAgICAgIE51bUNoYW5uZWxzID0gMjsKKyNlbmRpZgogCiAKICAgICAvKgogICAgICAqIFVwZGF0ZSBzYW1wbGUgY291bnRzCiAgICAgICovCiAgICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzICAgICs9IChMVk1fSU5UMTYpKCpwTnVtU2FtcGxlcyAqIE51bUNoYW5uZWxzKTsgLyogVXBkYXRlIHRoZSBJL08gcG9pbnRlcnMgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlcyAgICs9IChMVk1fSU5UMTYpKE5yRnJhbWVzICogTnVtQ2hhbm5lbHMpOworI2Vsc2UKICAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzICAgKz0gKExWTV9JTlQxNikoKnBOdW1TYW1wbGVzICogMik7CisjZW5kaWYKICAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgID0gKExWTV9JTlQxNikocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzIC0gKnBOdW1TYW1wbGVzKTsgLyogVXBkYXRlIHRoZSBzYW1wbGUgY291bnQgKi8KIAogICAgIC8qCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmgKaW5kZXggOGMwNDg0Ny4uYmFiNDA0OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvZWZmcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db2VmZnMuaApAQCAtNDg3LDYgKzQ4Nyw5NyBAQAogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKIAogI2lmZGVmIEhJR0hFUl9GUworLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSA4ODIwMCAqLworLyogR2FpbiA9IDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA5NDM3NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC42NDEyNTZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjIwMDI2NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDcxNDZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4zX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjMxOTA3NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC44NjU5NTZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQ1MjM4MGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC45OTkyNjNmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjYwMTk1M2YKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4xNDg4MzZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDYuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc2OTc3N2YKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4zMTY2NTlmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjk1ODA3OGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS41MDQ5NjBmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjE2OTM1NWYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS43MTYyMzhmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjQwNjQxMmYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS45NTMyOTVmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNjcyMzk1ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi4yMTkyNzdmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDExLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuOTcwODMyZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi41MTc3MTRmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMzA1Njg0ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi44NTI1NjZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNjgxMzk0ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMy4yMjgyNzZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDE0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuMTAyOTQ3ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMy42NDk4MzBmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuNTc1OTM4ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtNC4xMjI4MjBmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgogCiAvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDk2MDAwSHogKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLwpAQCAtNTgwLDYgKzY3MSw5OCBAQAogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU3NzM1MCkKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAKKy8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgMTc2NDAwICovCisvKiBHYWluID0gMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjEwNjcxMWYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuODU1ODA3ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjI2NDQzZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC45NzU1MzlmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zNjA3ODRmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjEwOTg4MGYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjUxMTUxN2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW40X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMjYwNjEzZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW40X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjgwNjQzZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS40Mjk3MzlmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDYuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS44NzA0MDVmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjYxOTUwMWYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjA4MzMyMWYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuODMyNDE3ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW43X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA4LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMzIyMjE3ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi4wNzEzMTNmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi41OTAyNjNmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjMzOTM1OWYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuODkxMDE2ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuNjQwMTEyZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy4yMjg0NjVmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi45Nzc1NjFmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjYwNzA5MGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0zLjM1NjE4NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuMDMxOTE0ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTMuNzgxMDEwZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgNC41MDg1NzVmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtNC4yNTc2NzFmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICA1LjA0MzM5N2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC00Ljc5MjQ5M2YpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisKIC8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgMTkyMDAwSHogKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjEwNzgyMwpAQCAtMTIxNiw0ICsxMzk5LDQgQEAKIAogCiAjZW5kaWYKLSNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db250cm9sLmMKaW5kZXggY2ZlNTNiOC4uMWIyN2NiNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jCkBAIC0yOCw2ICsyOCw4IEBACiAjaW5jbHVkZSAiTFZNX1RhYmxlcy5oIgogI2luY2x1ZGUgIkxWTV9Qcml2YXRlLmgiCiAKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgIExWTV9TZXRDb250cm9sUGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTY5LDE4ICs3MSwzMCBAQAogICAgICgocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzExMDI1KSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTIwMDApICAgICAgICYmCiAgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xNjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzIyMDUwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjQwMDApICAgICAgJiYKICAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkgICAgICAmJgotICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfOTYwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xOTIwMDApKSAgICAgIHx8CisgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU184ODIwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzk2MDAwKSAmJgorICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTc2NDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTkyMDAwKSkgICAgICB8fAogI2Vsc2UKICAgICAgICAgKChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU184MDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTEwMjUpICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMjAwMCkgICAgICAgJiYKICAgICAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE2MDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjIwNTApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yNDAwMCkgICAgICAgJiYKICAgICAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkpICAgICAgfHwKICNlbmRpZgorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgKChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX1NURVJFTykgJiYKKyAgICAgICAgIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk9JTlNURVJFTykgJiYKKyAgICAgICAgIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk8pICYmCisgICAgICAgICAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NVUxUSUNIQU5ORUwpKSB8fAorI2Vsc2UKICAgICAgICAgKChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX1NURVJFTykgJiYgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OT0lOU1RFUkVPKSAmJiAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PKSkgfHwKKyNlbmRpZgogICAgICAgICAocFBhcmFtcy0+U3BlYWtlclR5cGUgPiBMVk1fRVhfSEVBRFBIT05FUykpCiAgICAgewogICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKICAgICB9CiAKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVscyA9IHBQYXJhbXMtPk5yQ2hhbm5lbHM7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuQ2hNYXNrICAgICA9IHBQYXJhbXMtPkNoTWFzazsKKyNlbmRpZgogICAgIC8qCiAgICAgICogQ2luZW1hIFNvdW5kIHBhcmFtZXRlcnMKICAgICAgKi8KQEAgLTU2OSw2ICs1ODMsMTEgQEAKICAgICB9IHdoaWxlICgocEluc3RhbmNlLT5Db250cm9sUGVuZGluZyAhPSBMVk1fRkFMU0UpICYmCiAgICAgICAgICAgICAgKENvdW50ID4gMCkpOwogCisjaWZkZWYgU1VQUE9SVF9NQworICAgIHBJbnN0YW5jZS0+TnJDaGFubmVscyA9IExvY2FsUGFyYW1zLk5yQ2hhbm5lbHM7CisgICAgcEluc3RhbmNlLT5DaE1hc2sgPSBMb2NhbFBhcmFtcy5DaE1hc2s7CisjZW5kaWYKKwogICAgIC8qIENsZWFyIGFsbCBpbnRlcm5hbCBkYXRhIGlmIGZvcm1hdCBjaGFuZ2UqLwogICAgIGlmKExvY2FsUGFyYW1zLlNvdXJjZUZvcm1hdCAhPSBwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQpCiAgICAgewpAQCAtNzE5LDYgKzczOCw5IEBACiAgICAgICAgIERCRV9QYXJhbXMuSGVhZHJvb21kQiAgICAgICA9IDA7CiAgICAgICAgIERCRV9QYXJhbXMuVm9sdW1lQ29udHJvbCAgICA9IExWREJFX1ZPTFVNRV9PRkY7CiAgICAgICAgIERCRV9QYXJhbXMuVm9sdW1lZEIgICAgICAgICA9IDA7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICBEQkVfUGFyYW1zLk5yQ2hhbm5lbHMgICAgICAgICA9IExvY2FsUGFyYW1zLk5yQ2hhbm5lbHM7CisjZW5kaWYKIAogICAgICAgICAvKgogICAgICAgICAgKiBNYWtlIHRoZSBjaGFuZ2VzCkBAIC03NzEsMTEgKzc5MywyMiBAQAogICAgICAgICB7CiAgICAgICAgICAgICBFUU5CX1BhcmFtcy5Tb3VyY2VGb3JtYXQgPSBMVkVRTkJfU1RFUkVPOwogICAgICAgICB9CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAvKiBOb3RlOiBDdXJyZW50bHkgU291cmNlRm9ybWF0IGZpZWxkIG9mIEVRTkIgaXMgbm90IGJlZW4KKyAgICAgICAgICogICAgICAgdXNlZCBieSB0aGUgbW9kdWxlLgorICAgICAgICAgKi8KKyAgICAgICAgZWxzZSBpZiAoTG9jYWxQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NVUxUSUNIQU5ORUwpCisgICAgICAgIHsKKyAgICAgICAgICAgIEVRTkJfUGFyYW1zLlNvdXJjZUZvcm1hdCA9IExWRVFOQl9NVUxUSUNIQU5ORUw7CisgICAgICAgIH0KKyNlbmRpZgogICAgICAgICBlbHNlCiAgICAgICAgIHsKICAgICAgICAgICAgIEVRTkJfUGFyYW1zLlNvdXJjZUZvcm1hdCA9IExWRVFOQl9NT05PSU5TVEVSRU87ICAgICAvKiBGb3JjZSB0byBNb25vLWluLVN0ZXJlbyBtb2RlICovCiAgICAgICAgIH0KLQorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgRVFOQl9QYXJhbXMuTnJDaGFubmVscyAgICAgICAgID0gTG9jYWxQYXJhbXMuTnJDaGFubmVsczsKKyNlbmRpZgogCiAgICAgICAgIC8qCiAgICAgICAgICAqIFNldCB0aGUgY29udHJvbCBmbGFnCkBAIC04MzgsNyArODcxLDE2IEBACiAgICAgICAgICAgICBDU19QYXJhbXMuU3BlYWtlclR5cGUgID0gTFZDU19IRUFEUEhPTkVTOwogICAgICAgICB9CiAKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgIC8qIENvbmNlcnQgc291bmQgbW9kdWxlIHByb2Nlc3NlcyBvbmx5IHRoZSBsZWZ0IGFuZCByaWdodCBjaGFubmVscworICAgICAgICAgKiBkYXRhLiBTbyB0aGUgU291cmNlIEZvcm1hdCBpcyBzZXQgdG8gTFZDU19TVEVSRU8gZm9yIG11bHRpY2hhbm5lbAorICAgICAgICAgKiBpbnB1dCBhbHNvLgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKExvY2FsUGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fU1RFUkVPIHx8CisgICAgICAgICAgICBMb2NhbFBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX01VTFRJQ0hBTk5FTCkKKyNlbHNlCiAgICAgICAgIGlmIChMb2NhbFBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX1NURVJFTykgICAgLyogTW9ubyBmb3JtYXQgbm90IHN1cHBvcnRlZCAqLworI2VuZGlmCiAgICAgICAgIHsKICAgICAgICAgICAgIENTX1BhcmFtcy5Tb3VyY2VGb3JtYXQgPSBMVkNTX1NURVJFTzsKICAgICAgICAgfQpAQCAtODQ5LDcgKzg5MSw5IEBACiAgICAgICAgIENTX1BhcmFtcy5TYW1wbGVSYXRlICA9IExvY2FsUGFyYW1zLlNhbXBsZVJhdGU7CiAgICAgICAgIENTX1BhcmFtcy5SZXZlcmJMZXZlbCA9IExvY2FsUGFyYW1zLlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWw7CiAgICAgICAgIENTX1BhcmFtcy5FZmZlY3RMZXZlbCA9IExvY2FsUGFyYW1zLkNTX0VmZmVjdExldmVsOwotCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICBDU19QYXJhbXMuTnJDaGFubmVscyAgPSBMb2NhbFBhcmFtcy5OckNoYW5uZWxzOworI2VuZGlmCiAKICAgICAgICAgLyoKICAgICAgICAgICogU2V0IHRoZSBjb250cm9sIGZsYWcKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fSW5pdC5jCmluZGV4IDI2YzFjNGYuLmM1NzQ5OGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Jbml0LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0luaXQuYwpAQCAtNjEsNiArNjEsNzIgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKy8qCisgKiA0IFR5cGVzIG9mIE1lbW9yeSBSZWdpb25zIG9mIExWTQorICogVE9ETzogQWxsb2NhdGUgb24gdGhlIGZseS4KKyAqIGkpICAgTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQSAtIEZvciBJbnN0YW5jZSBIYW5kbGVzCisgKiBpaSkgIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEEgLSBQZXJzaXN0ZW50IEJ1ZmZlcnMKKyAqIGlpaSkgTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRiAtIEZvciBIb2xkaW5nIFN0cnVjdHVyZSB2YWx1ZXMKKyAqIGl2KSAgTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVCAgICAgICAtIEZvciBIb2xkaW5nIFN0cnVjdHVyZSB2YWx1ZXMKKyAqCisgKiBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBOgorICogICBUb3RhbCBNZW1vcnkgc2l6ZToKKyAqICAgICBzaXplb2YoTFZNX0luc3RhbmNlX3QpICsgXAorICogICAgIHNpemVvZihMVk1fQnVmZmVyX3QpICsgXAorICogICAgIHNpemVvZihMVlBTQV9JbnN0YW5jZVByX3QpICsgXAorICogICAgIHNpemVvZihMVk1fQnVmZmVyX3QpIC0gbmVlZGVkIGlmIGJ1ZmZlciBtb2RlIGlzIExWTV9NQU5BR0VEX0JVRkZFUgorICoKKyAqIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEE6CisgKiAgIFRvdGFsIE1lbW9yeSBzaXplOgorICogICAgIHNpemVvZihMVk1fVEVfRGF0YV90KSArIFwKKyAqICAgICAyICogcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoTFZNX0VRTkJfQmFuZERlZl90KSArIFwKKyAqICAgICBzaXplb2YoTFZDU19EYXRhX3QpICsgXAorICogICAgIHNpemVvZihMVkRCRV9EYXRhX0ZMT0FUX3QpICsgXAorICogICAgIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkgKyBcCisgKiAgICAgc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190KSArIFwKKyAqICAgICBwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kcyAqIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkgKyBcCisgKiAgICAgcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoTFZFUU5CX0JhbmREZWZfdCkgKyBcCisgKiAgICAgcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoTFZFUU5CX0JpcXVhZFR5cGVfZW4pICsgXAorICogICAgIDIgKiBMVk1fSEVBRFJPT01fTUFYX05CQU5EUyAqIHNpemVvZihMVk1fSGVhZHJvb21CYW5kRGVmX3QpICsgXAorICogICAgIFBTQV9Jbml0UGFyYW1zLm5CYW5kcyAqIHNpemVvZihCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCkgKyBcCisgKiAgICAgUFNBX0luaXRQYXJhbXMubkJhbmRzICogc2l6ZW9mKFFQRF9UYXBzX3QpCisgKgorICogTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRjoKKyAqICAgVG90YWwgTWVtb3J5IHNpemU6CisgKiAgICAgc2l6ZW9mKExWTV9URV9Db2Vmc190KSArIFwKKyAqICAgICBzaXplb2YoTFZDU19Db2VmZmljaWVudF90KSArIFwKKyAqICAgICBzaXplb2YoTFZEQkVfQ29lZl9GTE9BVF90KSArIFwKKyAqICAgICBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpICsgXAorICogICAgIHNpemVvZihCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCkgKyBcCisgKiAgICAgcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpICsgXAorICogICAgIFBTQV9Jbml0UGFyYW1zLm5CYW5kcyAqIHNpemVvZihCaXF1YWRfSW5zdGFuY2VfdCkgKyBcCisgKiAgICAgUFNBX0luaXRQYXJhbXMubkJhbmRzICogc2l6ZW9mKFFQRF9TdGF0ZV90KQorICoKKyAqIExWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1QgKFNjcmF0Y2gpOgorICogICBUb3RhbCBNZW1vcnkgU2l6ZToKKyAqICAgICBCdW5kbGVTY3JhdGNoU2l6ZSArIFwKKyAqICAgICBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFICogc2l6ZW9mKExWTV9GTE9BVCkgKyBcCisgKiAgICAgTWF4U2NyYXRjaE9mIChDUywgRVFOQiwgREJFLCBQU0EpCisgKgorICogICAgIGEpQnVuZGxlU2NyYXRjaFNpemU6CisgKiAgICAgICAgIDMgKiBMVk1fTUFYX0NIQU5ORUxTIFwKKyAqICAgICAgICAgKiAoTUlOX0lOVEVSTkFMX0JMT0NLU0laRSArIEludGVybmFsQmxvY2tTaXplKSAqIHNpemVvZihMVk1fRkxPQVQpCisgKiAgICAgICBUaGlzIE1lbW9yeSBpcyBhbGxvY2F0ZWQgb25seSB3aGVuIEJ1ZmZlciBtb2RlIGlzIExWTV9NQU5BR0VEX0JVRkZFUi4KKyAqICAgICBiKU1heFNjcmF0Y2hPZiAoQ1MsIEVRTkIsIERCRSwgUFNBKQorICogICAgICAgVGhpcyBNZW1vcnkgaXMgbmVlZGVkIGZvciBzY3JhdGNoIHVzYWdlIGZvciBDUywgRVFOQiwgREJFLCBQU0EuCisgKiAgICAgICBDUyAgID0gKExWQ1NfU0NSQVRDSEJVRkZFUlMgKiBzaXplb2YoTFZNX0ZMT0FUKQorICogICAgICAgICAgICAgICAqIHBDYXBhYmlsaXRpZXMtPk1heEJsb2NrU2l6ZSkKKyAqICAgICAgIEVRTkIgPSAoTFZFUU5CX1NDUkFUQ0hCVUZGRVJTICogc2l6ZW9mKExWTV9GTE9BVCkKKyAqICAgICAgICAgICAgICAgKiBwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpCisgKiAgICAgICBEQkUgID0gKExWREJFX1NDUkFUQ0hCVUZGRVJTX0lOUExBQ0Uqc2l6ZW9mKExWTV9GTE9BVCkKKyAqICAgICAgICAgICAgICAgKiBwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpCisgKiAgICAgICBQU0EgID0gKDIgKiBwSW5pdFBhcmFtcy0+TWF4SW5wdXRCbG9ja1NpemUgKiBzaXplb2YoTFZNX0ZMT0FUKSkKKyAqICAgICAgICAgICAgICBvbmUgTWF4SW5wdXRCbG9ja1NpemUgZm9yIGlucHV0IGFuZCBhbm90aGVyIGZvciBmaWx0ZXIgb3V0cHV0CisgKiAgICAgYylNQVhfSU5URVJOQUxfQkxPQ0tTSVpFCisgKiAgICAgICBUaGlzIE1lbW9yeSBpcyBuZWVkZWQgZm9yIFBTQUlucHV0IC0gVGVtcCBtZW1vcnkgdG8gc3RvcmUgb3V0cHV0CisgKiAgICAgICBmcm9tIE1jVG9Nb25vIGJsb2NrIGFuZCBnaXZlbiBhcyBpbnB1dCB0byBQU0EgYmxvY2sKKyAqLworCiBMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRNZW1vcnlUYWJsZShMVk1fSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtVGFiX3QgICAgICAgICAqcE1lbW9yeVRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0luc3RQYXJhbXNfdCAgICAgKnBJbnN0UGFyYW1zKQpAQCAtMTY4LDcgKzIzNCwxMyBAQAogICAgIEFsZ1NjcmF0Y2hTaXplICAgID0gMDsKICAgICBpZiAocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykKICAgICB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgQnVuZGxlU2NyYXRjaFNpemUgPSAzICogTFZNX01BWF9DSEFOTkVMUyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoTUlOX0lOVEVSTkFMX0JMT0NLU0laRSArIEludGVybmFsQmxvY2tTaXplKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTFZNX0ZMT0FUKTsKKyNlbHNlCiAgICAgICAgIEJ1bmRsZVNjcmF0Y2hTaXplID0gNiAqIChNSU5fSU5URVJOQUxfQkxPQ0tTSVpFICsgSW50ZXJuYWxCbG9ja1NpemUpICogc2l6ZW9mKExWTV9JTlQxNik7CisjZW5kaWYKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sICAgICAgICAvKiBTY3JhdGNoIGJ1ZmZlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZVNjcmF0Y2hTaXplKTsKICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0sCkBAIC0yMzMsNyArMzA1LDEzIEBACiAgICAgICAgICAqIFNldCB0aGUgY2FwYWJpbGl0aWVzCiAgICAgICAgICAqLwogI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQotICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWREJFX0NBUF9GU184MDAwIHwgTFZEQkVfQ0FQX0ZTXzExMDI1IHwgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwgTFZEQkVfQ0FQX0ZTXzMyMDAwIHwgTFZEQkVfQ0FQX0ZTXzQ0MTAwIHwgTFZEQkVfQ0FQX0ZTXzQ4MDAwIHwgTFZEQkVfQ0FQX0ZTXzk2MDAwIHwgTFZEQkVfQ0FQX0ZTXzE5MjAwMDsKKyAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMjIwNTAgfCBMVkRCRV9DQVBfRlNfMjQwMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzQ4MDAwIHwgTFZEQkVfQ0FQX0ZTXzg4MjAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfOTYwMDAgfCBMVkRCRV9DQVBfRlNfMTc2NDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMTkyMDAwOwogI2Vsc2UKICAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8IExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8IExWREJFX0NBUF9GU18yMjA1MCB8IExWREJFX0NBUF9GU18yNDAwMCB8IExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8IExWREJFX0NBUF9GU180ODAwMDsKICNlbmRpZgpAQCAtMjcwLDcgKzM0OCwxMyBAQAogICAgICAgICAgKiBTZXQgdGhlIGNhcGFiaWxpdGllcwogICAgICAgICAgKi8KICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLSAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8IExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfCBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8IExWRVFOQl9DQVBfRlNfNDgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzk2MDAwIHwgTFZFUU5CX0NBUF9GU18xOTIwMDA7CisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzQ4MDAwIHwgTFZFUU5CX0NBUF9GU184ODIwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfOTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE3NjQwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMTkyMDAwOwogI2Vsc2UKICAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8IExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfCBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8IExWRVFOQl9DQVBfRlNfNDgwMDA7CiAjZW5kaWYKQEAgLTM1Nyw4ICs0NDEsMTMgQEAKICAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUpOwogCiAgICAgICAgICAgICAvKiBGYXN0IFRlbXBvcmFyeSAqLworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fVEVNUE9SQVJZX0ZBU1RdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFICogc2l6ZW9mKExWTV9GTE9BVCkpOworI2Vsc2UKICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9URU1QT1JBUllfRkFTVF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUgKiBzaXplb2YoTFZNX0lOVDE2KSk7CisjZW5kaWYKIAogICAgICAgICAgICAgaWYgKFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uU2l6ZSA+IEFsZ1NjcmF0Y2hTaXplKQogICAgICAgICAgICAgewpAQCAtNTQ3LDEzICs2MzYsMjAgQEAKICAgICAgICAgICovCiAgICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9CdWZmZXJfdCkpOworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIEJ1bmRsZVNjcmF0Y2hTaXplID0gKExWTV9JTlQzMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMyAqIExWTV9NQVhfQ0hBTk5FTFMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIChNSU5fSU5URVJOQUxfQkxPQ0tTSVpFICsgSW50ZXJuYWxCbG9ja1NpemUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBzaXplb2YoTFZNX0ZMT0FUKSk7CisjZWxzZQogICAgICAgICBCdW5kbGVTY3JhdGNoU2l6ZSA9IChMVk1fSU5UMzIpKDYgKiAoTUlOX0lOVEVSTkFMX0JMT0NLU0laRSArIEludGVybmFsQmxvY2tTaXplKSAqIHNpemVvZihMVk1fSU5UMTYpKTsKKyNlbmRpZgogICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5wU2NyYXRjaCA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLCAgIC8qIFNjcmF0Y2ggMSBidWZmZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDMyKUJ1bmRsZVNjcmF0Y2hTaXplKTsKICNpZmRlZiBCVUlMRF9GTE9BVAogICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBpbnB1dCBkZWxheSBidWZmZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikmcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+SW5EZWxheUJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShMVk1fTUFYX0NIQU5ORUxTICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRSkpOwogI2Vsc2UKICAgICAgICAgTG9hZENvbnN0XzE2KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaW5wdXQgZGVsYXkgYnVmZmVyICovCiAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopJnBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPkluRGVsYXlCdWZmZXIsCkBAIC01ODQsOCArNjgwLDExIEBACiAgICAgLyoKICAgICAgKiBEQyByZW1vdmFsIGZpbHRlcgogICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBEQ19NY19EMTZfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSk7CisjZWxzZQogICAgIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlKTsKLQorI2VuZGlmCiAKICAgICAvKgogICAgICAqIFRyZWJsZSBFbmhhbmNlbWVudApAQCAtNzQ0LDcgKzg0MywxMyBAQAogICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcwogICAgICAgICAgKi8KICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLSAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8IExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8IExWREJFX0NBUF9GU18yMjA1MCB8IExWREJFX0NBUF9GU18yNDAwMCB8IExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8IExWREJFX0NBUF9GU180ODAwMCB8IExWREJFX0NBUF9GU185NjAwMCB8IExWREJFX0NBUF9GU18xOTIwMDA7CisgICAgICAgIERCRV9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZEQkVfQ0FQX0ZTXzgwMDAgfCBMVkRCRV9DQVBfRlNfMTEwMjUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMzIwMDAgfCBMVkRCRV9DQVBfRlNfNDQxMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU180ODAwMCB8IExWREJFX0NBUF9GU184ODIwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzk2MDAwIHwgTFZEQkVfQ0FQX0ZTXzE3NjQwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzE5MjAwMDsKICNlbHNlCiAgICAgICAgIERCRV9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZEQkVfQ0FQX0ZTXzgwMDAgfCBMVkRCRV9DQVBfRlNfMTEwMjUgfCBMVkRCRV9DQVBfRlNfMTIwMDAgfCBMVkRCRV9DQVBfRlNfMTYwMDAgfCBMVkRCRV9DQVBfRlNfMjIwNTAgfCBMVkRCRV9DQVBfRlNfMjQwMDAgfCBMVkRCRV9DQVBfRlNfMzIwMDAgfCBMVkRCRV9DQVBfRlNfNDQxMDAgfCBMVkRCRV9DQVBfRlNfNDgwMDA7CiAjZW5kaWYKQEAgLTgwMiw3ICs5MDcsMTMgQEAKICAgICAgICAgICogU2V0IHRoZSBpbml0aWFsaXNhdGlvbiBjYXBhYmlsaXRpZXMKICAgICAgICAgICovCiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCi0gICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfCBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8IExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ4MDAwIHwgTFZFUU5CX0NBUF9GU185NjAwMCB8IExWRVFOQl9DQVBfRlNfMTkyMDAwOworICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkVRTkJfQ0FQX0ZTXzgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzExMDI1IHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18xMjAwMCB8IExWRVFOQl9DQVBfRlNfMTYwMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzIyMDUwIHwgTFZFUU5CX0NBUF9GU18yNDAwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMzIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ0MTAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU180ODAwMCB8IExWRVFOQl9DQVBfRlNfODgyMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzk2MDAwIHwgTFZFUU5CX0NBUF9GU18xNzY0MDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzE5MjAwMDsKICNlbHNlCiAgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfCBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8IExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ4MDAwOwogI2VuZGlmCkBAIC0xMDM5LDcgKzExNTAsMTEgQEAKICAgICBMVk1fU2V0SGVhZHJvb21QYXJhbXMoaEluc3RhbmNlLCAmSGVhZHJvb21QYXJhbXMpOwogCiAgICAgLyogREMgcmVtb3ZhbCBmaWx0ZXIgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgRENfTWNfRDE2X1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UpOworI2Vsc2UKICAgICBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSk7CisjZW5kaWYKIAogICAgIHJldHVybiBMVk1fU1VDQ0VTUzsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJpdmF0ZS5oCmluZGV4IGI0NTMyMjIuLmNkZDMxMzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1ByaXZhdGUuaApAQCAtMTQ0LDEyICsxNDQsMTkgQEAKICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2g7ICAgICAgICAgIC8qIEJ1bmRsZSBzY3JhdGNoIGJ1ZmZlciAqLwogCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgQnVmZmVyU3RhdGU7ICAgICAgICAvKiBCdWZmZXIgc3RhdHVzICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIEluRGVsYXlCdWZmZXJbMyAqIExWTV9NQVhfQ0hBTk5FTFMgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFXTsKKyNlbHNlCiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgSW5EZWxheUJ1ZmZlcls2ICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRV07IC8qIElucHV0IGJ1ZmZlciBkZWxheSBsaW5lLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IGFuZCByaWdodCAqLworI2VuZGlmCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgSW5EZWxheVNhbXBsZXM7ICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgaW5wdXQgZGVsYXkgYnVmZmVyICovCi0KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgT3V0RGVsYXlCdWZmZXJbTFZNX01BWF9DSEFOTkVMUyAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkVdOworI2Vsc2UKICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBPdXREZWxheUJ1ZmZlclsyICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRV07IC8qIE91dHB1dCBidWZmZXIgZGVsYXkgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lICovCisjZW5kaWYKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBPdXREZWxheVNhbXBsZXM7ICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBvdXRwdXQgZGVsYXkgYnVmZmVyLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgYW5kIHJpZ2h0ICovCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgU2FtcGxlc1RvT3V0cHV0OyAgICAvKiBTYW1wbGVzIHRvIHdyaXRlIHRvIHRoZSBvdXRwdXQgKi8KQEAgLTI4Miw2ICsyODksMTEgQEAKIAogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgTm9TbW9vdGhWb2x1bWU7ICAgICAgLyogRW5hYmxlIG9yIGRpc2FibGUgc21vb3RoIHZvbHVtZSBjaGFuZ2VzKi8KIAorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgIE5yQ2hhbm5lbHM7CisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICBDaE1hc2s7CisjZW5kaWYKKwogfSBMVk1fSW5zdGFuY2VfdDsKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYwppbmRleCA0YTE5YTEzLi5iYzY2NmE5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMKQEAgLTIxLDYgKzIxLDcgQEAKIC8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAogI2luY2x1ZGUgIkxWTV9Qcml2YXRlLmgiCiAjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgpAQCAtNjUsNiArNjYsMTEgQEAKICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwVG9Qcm9jZXNzID0gKExWTV9GTE9BVCAqKXBJbkRhdGE7CiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcFByb2Nlc3NlZCA9IHBPdXREYXRhOwogICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gIFN0YXR1czsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0lOVDMyICAgICAgICAgICBOckNoYW5uZWxzICA9IHBJbnN0YW5jZS0+TnJDaGFubmVsczsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIENoTWFzayAgICAgID0gcEluc3RhbmNlLT5DaE1hc2s7CisjZGVmaW5lIE5yRnJhbWVzIFNhbXBsZUNvdW50ICAvLyBhbGlhcyBmb3IgY2xhcml0eQorI2VuZGlmCiAKICAgICAvKgogICAgICAqIENoZWNrIGlmIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyB6ZXJvCkBAIC0xMTIsNiArMTE4LDExIEBACiAgICAgaWYgKHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgPT0gTFZNX1RSVUUpCiAgICAgewogICAgICAgICBTdGF0dXMgPSBMVk1fQXBwbHlOZXdTZXR0aW5ncyhoSW5zdGFuY2UpOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgLyogVXBkYXRlIHRoZSBsb2NhbCB2YXJpYWJsZSBOckNoYW5uZWxzIGZyb20gcEluc3RhbmNlLT5OckNoYW5uZWxzIHZhbHVlICovCisgICAgICAgIE5yQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHM7CisgICAgICAgIENoTWFzayAgICAgPSBwSW5zdGFuY2UtPkNoTWFzazsKKyNlbmRpZgogCiAgICAgICAgIGlmKFN0YXR1cyAhPSBMVk1fU1VDQ0VTUykKICAgICAgICAgewpAQCAtMTMwLDYgKzE0MSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KICAgICAgICAgcElucHV0ICAgICA9IHBPdXREYXRhOwogICAgICAgICBwVG9Qcm9jZXNzID0gcE91dERhdGE7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICBOckNoYW5uZWxzID0gMjsKKyAgICAgICAgQ2hNYXNrICAgICA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyNlbmRpZgogICAgIH0KIAogCkBAIC0xNTMsNyArMTY4LDYgQEAKICAgICAgICAgICovCiAgICAgICAgIGlmIChTYW1wbGVDb3VudCAhPSAwKQogICAgICAgICB7Ci0KICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBBcHBseSBDb25jZXJ0U291bmQgaWYgcmVxdWlyZWQKICAgICAgICAgICAgICAqLwpAQCAtMTcxLDEwICsxODUsMTggQEAKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+VkNfQWN0aXZlIT0wKQogICAgICAgICAgICAgeworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgICAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPlZDX1ZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJGcmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7CisjZWxzZQogICAgICAgICAgICAgICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPlZDX1ZvbHVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIFNhbXBsZUNvdW50KSk7ICAgICAvKiBMZWZ0IGFuZCByaWdodCovCisjZW5kaWYKICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzID0gcFByb2Nlc3NlZDsKICAgICAgICAgICAgIH0KIApAQCAtMjA4LDkgKzIzMCwxNSBAQAogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBpZiAocFRvUHJvY2VzcyAhPSBwUHJvY2Vzc2VkKQogICAgICAgICAgICAgeworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgICAgICBDb3B5X0Zsb2F0KHBUb1Byb2Nlc3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJDaGFubmVscyAqIE5yRnJhbWVzKSk7ICAgIC8qIENvcHkgYWxsIHNhbXBsZXMgKi8KKyNlbHNlCiAgICAgICAgICAgICAgICAgQ29weV9GbG9hdChwVG9Qcm9jZXNzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBTYW1wbGVDb3VudCkpOyAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLworI2VuZGlmCiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8qCkBAIC0yMjEsMjAgKzI0OSwzOSBAQAogICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICogQXBwbHkgdGhlIGZpbHRlcgogICAgICAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgICAgICBGT19NY19EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPnBURV9TdGF0ZS0+VHJlYmxlQm9vc3RfU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKKyNlbHNlCiAgICAgICAgICAgICAgICAgRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5wVEVfU3RhdGUtPlRyZWJsZUJvb3N0X1N0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KVNhbXBsZUNvdW50KTsKKyNlbmRpZgogCiAgICAgICAgICAgICB9Ci0KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVm9sdW1lIGJhbGFuY2UKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgTFZDX01peFNvZnRfMVN0X01DX2Zsb2F0X1NBVCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaE1hc2spOworI2Vsc2UKICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBWb2x1bWUgYmFsYW5jZQogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVDb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZUNvdW50KTsKKyNlbmRpZgogCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogUGVyZm9ybSBQYXJhbWV0cmljIFNwZWN0dW0gQW5hbHlzaXMKQEAgLTI0MiwyOCArMjg5LDM5IEBACiAgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLlBTQV9FbmFibGUgPT0gTFZNX1BTQV9PTikgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQgPT0gTFZNX1BTQV9PTikpCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEZyb20yaVRvTW9ub19GbG9hdChwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShTYW1wbGVDb3VudCkpOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgICAgICBGcm9tTWNUb01vbm9fRmxvYXQocFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yRnJhbWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7CisjZWxzZQorICAgICAgICAgICAgICAgIEZyb20yaVRvTW9ub19GbG9hdChwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoU2FtcGxlQ291bnQpKTsKKyNlbmRpZgogCi0gICAgICAgICAgICAgICAgICAgIExWUFNBX1Byb2Nlc3MocEluc3RhbmNlLT5oUFNBSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKFNhbXBsZUNvdW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RpbWUpOworICAgICAgICAgICAgICAgIExWUFNBX1Byb2Nlc3MocEluc3RhbmNlLT5oUFNBSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShTYW1wbGVDb3VudCksCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RpbWUpOwogICAgICAgICAgICAgfQogCi0KICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgKiBEQyByZW1vdmFsCiAgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICBEQ19NY19EMTZfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKKyNlbHNlCiAgICAgICAgICAgICBEQ18ySV9EMTZfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpU2FtcGxlQ291bnQpOwotCi0KKyNlbmRpZgogICAgICAgICB9Ci0KICAgICAgICAgLyoKICAgICAgICAgICogTWFuYWdlIHRoZSBvdXRwdXQgYnVmZmVyCiAgICAgICAgICAqLwpAQCAtNDk3LDQgKzU1NSw0IEBACiAKICAgICByZXR1cm4oTFZNX1NVQ0NFU1MpOwogfQotI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmMKaW5kZXggMTk5ZGRkZS4uYTUzNTZkMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuYwpAQCAtMjY5LDYgKzI2OSw1MyBAQAogICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xNV9CMX0KICNpZmRlZiBISUdIRVJfRlMKICAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAgICAvKiA4OGtIeiBTYW1wbGluZyByYXRlICovCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4yX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjNfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA0ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW40X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgNSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW41X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjZfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluNl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA3ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW43X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjdfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgOCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluOF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW44X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjlfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluOV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTAgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjEwX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjEwX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMTFfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMTFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDEyICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4xMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTMgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjEzX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjEzX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxNCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMTRfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMTRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDE1ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4xNV9CMX0sCisKICAgICAgICAgICAgICAgICAgICAgLyogOTZrSHogc2FtcGxpbmcgcmF0ZSAqLwogICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCiAgICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xX0EwLApAQCAtMzE2LDYgKzM2Myw1MyBAQAogICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMTVfQTAsCiAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMTVfQjF9LAogCisgICAgICAgICAgICAgICAgICAgIC8qIDE3NmtIeiBTYW1wbGluZyByYXRlICovCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjFfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4yX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4yX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAzICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluM19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgNCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjRfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW41X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW41X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA2ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluNl9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluNl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgNyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjdfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjdfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDggKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW44X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW44X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA5ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluOV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluOV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDEwICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTBfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjEwX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTEgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMTFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjEyX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4xMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDEzICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTNfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjEzX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMTRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxNSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjE1X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4xNV9CMX0sCisKICAgICAgICAgICAgICAgICAgICAgLyogMTkya0h6IHNhbXBsaW5nIHJhdGUgKi8KICAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xX0EwLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQUdDLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9BR0MuaAppbmRleCA5YTNkMzVkLi4wNmU3NDJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9BR0MuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9BR0MuaApAQCAtNzgsNiArNzgsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwTW9ub1NyYywgICAgICAvKiBNb25vIHNvdXJjZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBEc3QsICAgICAgICAgIC8qIFN0ZXJlbyBkZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgbik7ICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICovCisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBBR0NfTUlYX1ZPTF9NYzFNb25fRDMyX1dSQShBR0NfTUlYX1ZPTF8yU3QxTW9uX0ZMT0FUX3QgICpwSW5zdGFuY2UsICAvKiBJbnN0YW5jZSBwb2ludGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcFN0U3JjLCAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBNb25vU3JjLCAgICAvKiBNb25vIHNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBEc3QsICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgTnJGcmFtZXMsICAgICAvKiBOdW1iZXIgb2YgZnJhbWVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsgIC8qIE51bWJlciBvZiBjaGFubmVscyAqLworI2VuZGlmCisKICNlbHNlCiB2b2lkIEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQShBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl90ICAqcEluc3RhbmNlLCAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAgICAgICAgKnBTdFNyYywgICAgICAgIC8qIFN0ZXJlbyBzb3VyY2UgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQklRVUFELmgKaW5kZXggM2VlN2Y2My4uMDE1MzliMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQklRVUFELmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQklRVUFELmgKQEAgLTMwLDggKzMwLDE3IEBACiAjaWZkZWYgQlVJTERfRkxPQVQKIHR5cGVkZWYgc3RydWN0CiB7CisjaWZkZWYgU1VQUE9SVF9NQworICAgIC8qIFRoZSBtZW1vcnkgcmVnaW9uIGNyZWF0ZWQgYnkgdGhpcyBzdHJ1Y3R1cmUgaW5zdGFuY2UgaXMgdHlwZWNhc3QKKyAgICAgKiBpbnRvIGFub3RoZXIgc3RydWN0dXJlIGNvbnRhaW5pbmcgYSBwb2ludGVyIGFuZCBhbiBhcnJheSBvZiBmaWx0ZXIKKyAgICAgKiBjb2VmZmljaWVudHMuIEluIG9uZSBjYXNlIHRoaXMgbWVtb3J5IHJlZ2lvbiBpcyB1c2VkIGZvciBzdG9yaW5nCisgICAgICogREMgY29tcG9uZW50IG9mIGNoYW5uZWxzCisgICAgICovCisgICAgTFZNX0ZMT0FUICpwU3RvcmFnZTsKKyAgICBMVk1fRkxPQVQgU3RvcmFnZVtMVk1fTUFYX0NIQU5ORUxTXTsKKyNlbHNlCiAgICAgTFZNX0ZMT0FUIFN0b3JhZ2VbNl07Ci0KKyNlbmRpZgogfSBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdDsKICNlbHNlCiB0eXBlZGVmIHN0cnVjdApAQCAtMTc5LDcgKzE4OCwxMiBAQAogCiB0eXBlZGVmIHN0cnVjdAogewotICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoMiAqIDIpIF07ICAvKiBUd28gY2hhbm5lbHMsIHR3byB0YXBzIG9mIHNpemUgTFZNX0lOVDMyICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIC8qIExWTV9NQVhfQ0hBTk5FTFMgY2hhbm5lbHMsIHR3byB0YXBzIG9mIHNpemUgTFZNX0ZMT0FUICovCisgICAgTFZNX0ZMT0FUIFN0b3JhZ2VbIChMVk1fTUFYX0NIQU5ORUxTICogMikgXTsKKyNlbHNlCisgICAgTFZNX0ZMT0FUIFN0b3JhZ2VbICgyICogMikgXTsgIC8qIFR3byBjaGFubmVscywgdHdvIHRhcHMgb2Ygc2l6ZSBMVk1fRkxPQVQgKi8KKyNlbmRpZgogfSBCaXF1YWRfMklfT3JkZXIxX0ZMT0FUX1RhcHNfdDsKICNlbHNlCiB0eXBlZGVmIHN0cnVjdApAQCAtMTk3LDEyICsyMTEsMTcgQEAKICNpZmRlZiBCVUlMRF9GTE9BVAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDEgKiA0KSBdOyAgLyogT25lIGNoYW5uZWwsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLworICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoMSAqIDQpIF07ICAvKiBPbmUgY2hhbm5lbCwgZm91ciB0YXBzIG9mIHNpemUgTFZNX0ZMT0FUICovCiB9IEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190OwogCiB0eXBlZGVmIHN0cnVjdAogewotICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoMiAqIDQpIF07ICAvKiBUd28gY2hhbm5lbHMsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAvKiBMVk1fTUFYX0NIQU5ORUxTLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fRkxPQVQgKi8KKyAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKExWTV9NQVhfQ0hBTk5FTFMgKiA0KSBdOworI2Vsc2UKKyAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDIgKiA0KSBdOyAgLyogVHdvIGNoYW5uZWxzLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fRkxPQVQgKi8KKyNlbmRpZgogfSBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdDsKICNlbHNlCiB0eXBlZGVmIHN0cnVjdApAQCAtMzY2LDYgKzM4NSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgQlFfTUNfRDMyRjMyQzMwX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKKyNlbmRpZgogI2Vsc2UKIHZvaWQgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgKnBUYXBzLApAQCAtNDM0LDYgKzQ2MCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOworI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgRk9fTWNfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOworI2VuZGlmCiAjZWxzZQogdm9pZCBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIxX1RhcHNfdCAqcFRhcHMsCkBAIC01MjcsNiArNTYwLDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBQS19NY19EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJDaGFubmVscyk7CisjZW5kaWYKICNlbHNlCiB2b2lkIFBLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxICggICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCkBAIC01NDAsMTIgKzU4MCwyMiBAQAogCiAvKioqIDE2IGJpdCBkYXRhIHBhdGggU1RFUkVPICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZmRlZiBCVUlMRF9GTE9BVAorI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgRENfTWNfRDE2X1RSQ19XUkFfMDFfSW5pdCAgICAgKCAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSk7CisKK3ZvaWQgRENfTWNfRDE2X1RSQ19XUkFfMDEgICAgICAgICAgKCAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOworI2Vsc2UKIHZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdCAgICAgKCAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSk7CiAKIHZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDEgICAgICAgICAgKCAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNlbmRpZgogI2Vsc2UKIHZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdCAgICAgKCAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UaW1lci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1RpbWVyLmgKaW5kZXggODFlMjg4Yy4uYTc2MzU0ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1RpbWVyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1RpbWVyLmgKQEAgLTQ0LDcgKzQ0LDE1IEBACiAKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgTFZNX0lOVDMyIFN0b3JhZ2VbNl07CisgICAgLyoKKyAgICAgKiBUaGUgbWVtb3J5IGFyZWEgY3JlYXRlZCB1c2luZyB0aGlzIHN0cnVjdHVyZSBpcyBpbnRlcm5hbGx5CisgICAgICogdHlwZWNhc3QgdG8gTFZNX1RpbWVyX0luc3RhbmNlX1ByaXZhdGVfdCBhbmQgdXNlZC4KKyAgICAgKiBUaGUgTFZNX1RpbWVyX0luc3RhbmNlX1ByaXZhdGVfdCBzdHJ1Y3R1cmUgaGFzIDMgcG9pbnRlciB0eXBlIGVsZW1lbnRzCisgICAgICogMiBlbGVtZW50cyBvZiB0eXBlIExWTV9JTlQzMiBhbmQgb25lIGVsZW1lbnQgb2YgdHlwZSBMVk1fSU5UMTYuCisgICAgICogSW5vcmRlciB0byBjYXRlciBib3RoIDMyIGFuZCA2NCBiaXQgYnVpbGRzLCBTdG9yYWdlIGFycmF5IHNob3VsZAorICAgICAqIGhhdmUgYSBtaW5pbXVtIG9mIDkgZWxlbWVudHMgb2YgdHlwZSBMVk1fSU5UMzIuCisgICAgICovCisgICAgTFZNX0lOVDMyIFN0b3JhZ2VbOV07CiAKIH0gTFZNX1RpbWVyX0luc3RhbmNlX3Q7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UeXBlcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1R5cGVzLmgKaW5kZXggZWExNjA3Mi4uZmJmZGQ0ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1R5cGVzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1R5cGVzLmgKQEAgLTk0LDYgKzk0LDcgQEAKIAogdHlwZWRlZiAgICAgaW50MzJfdCAgICAgICAgICAgICBMVk1fSU5UMzI7ICAgICAgICAgIC8qIFNpZ25lZCAzMi1iaXQgd29yZCAqLwogdHlwZWRlZiAgICAgdWludDMyX3QgICAgICAgICAgICBMVk1fVUlOVDMyOyAgICAgICAgIC8qIFVuc2lnbmVkIDMyLWJpdCB3b3JkICovCit0eXBlZGVmICAgICBpbnQ2NF90ICAgICAgICAgICAgIExWTV9JTlQ2NDsgICAgICAgICAgLyogU2lnbmVkIDY0LWJpdCB3b3JkICovCiAKICNpZmRlZiBCVUlMRF9GTE9BVAogCkBAIC0xMjIsNiArMTIzLDEyIEBACiAKICNlbmRpZiAvLyBOQVRJVkVfRkxPQVRfQlVGRkVSCiAKKyNpZmRlZiBTVVBQT1JUX01DCisjZGVmaW5lIExWTV9NQVhfQ0hBTk5FTFMgOCAvLyBGQ0NfOAorI2Vsc2UKKyNkZWZpbmUgTFZNX01BWF9DSEFOTkVMUyAyIC8vIEZDQ18yCisjZW5kaWYKKwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBTdGFuZGFyZCBFbnVtZXJhdGVkIHR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTQzLDYgKzE1MCw5IEBACiAgICAgTFZNX1NURVJFTyAgICAgICAgICA9IDAsCiAgICAgTFZNX01PTk9JTlNURVJFTyAgICA9IDEsCiAgICAgTFZNX01PTk8gICAgICAgICAgICA9IDIsCisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9NVUxUSUNIQU5ORUwgICAgPSAzLAorI2VuZGlmCiAgICAgTFZNX1NPVVJDRV9EVU1NWSAgICA9IExWTV9NQVhFTlVNCiB9IExWTV9Gb3JtYXRfZW47CiAKQEAgLTE2MCw4ICsxNzAsMTAgQEAKICAgICBMVk1fRlNfNDQxMDAgPSA3LAogICAgIExWTV9GU180ODAwMCA9IDgsCiAjaWZkZWYgSElHSEVSX0ZTCi0gICAgTFZNX0ZTXzk2MDAwID0gOSwKLSAgICBMVk1fRlNfMTkyMDAwID0gMTAsCisgICAgTFZNX0ZTXzg4MjAwID0gOSwKKyAgICBMVk1fRlNfOTYwMDAgPSAxMCwKKyAgICBMVk1fRlNfMTc2NDAwID0gMTEsCisgICAgTFZNX0ZTXzE5MjAwMCA9IDEyLAogI2VuZGlmCiAgICAgTFZNX0ZTX0lOVkFMSUQgPSBMVk1fTUFYRU5VTS0xLAogICAgIExWTV9GU19EVU1NWSA9IExWTV9NQVhFTlVNCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9WZWN0b3JBcml0aG1ldGljLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9WZWN0b3JBcml0aG1ldGljLmgKaW5kZXggMGJhMjBhMy4uNzQ2OGE5MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1ZlY3RvckFyaXRobWV0aWMuaApAQCAtNDcsNiArNDcsMTYgQEAKIHZvaWQgQ29weV9GbG9hdCggICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOworI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgQ29weV9GbG9hdF9NY19TdGVyZW8oICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgTnJDaGFubmVscyk7Cit2b2lkIENvcHlfRmxvYXRfU3RlcmVvX01jKCAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIE5yQ2hhbm5lbHMpOworI2VuZGlmCiAjZWxzZQogdm9pZCBDb3B5XzE2KCAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKQEAgLTE4MSw2ICsxOTEsMTIgQEAKIHZvaWQgRnJvbTJpVG9Nb25vX0Zsb2F0KCAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIEZyb21NY1RvTW9ub19GbG9hdChjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yQ2hhbm5lbHMpOworI2VuZGlmCiAjZWxzZQogdm9pZCBGcm9tMmlUb01vbm9fMzIoICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEuYwppbmRleCBmYTlmMDFmLi41Yzg2NTVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEuYwpAQCAtMzA1LDQgKzMwNSwxNTAgQEAKIAogICAgIHJldHVybjsKIH0KKyNpZmRlZiBTVVBQT1JUX01DCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgQUdDX01JWF9WT0xfTWMxTW9uX0QzMl9XUkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQXBwbHkgQUdDIGFuZCBtaXggc2lnbmFscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1jU3JjICAgLS0tLS0tLS0tLS0tLS0tLS0tfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICBfX19fX18gICAgICAgX3xfICAgICAgICBfX19fX19fXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgfCAgICAgIHwgICAgIHwgICB8ICAgICAgfCAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9ub1NyYyAtLT58IEFHQyAgfC0tLS0+fCArIHwtLS0tLT58IFZvbHVtZSB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLT4gICAgKi8KKy8qICAgICAgICAgICAgIHwgR2FpbiB8ICAgICB8X19ffCAgICAgIHwgR2FpbiAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAqLworLyogICAgICAgICAgICAgfF9fX19fX3wgICAgICAgICAgICAgICAgfF9fX19fX19ffCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAvfFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19fX19fX19fXyAgICAgX19fX19fX18gICAgfCAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgIHwgICAgICAgIHwgICB8ICAgICAgICAqLworLyogICAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCBBR0MgR2FpbiB8PC0tfCBQZWFrICAgfDwtLXwgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFVwZGF0ZSAgIHwgICB8IERldGVjdCB8ICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxfX19fX19fX19ffCAgIHxfX19fX19fX3wgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1jU3JjICAgICAgICAgICAgICAgICAgTXVsdGljaGFubmVsIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTW9ub1NyYyAgICAgICAgICAgICAgICBNb25vIGJhbmQgcGFzcyBzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBEc3QgICAgICAgICAgICAgICAgICAgIE11bHRpY2hhbm5lbCBkZXN0aW5hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTnJGcmFtZXMgICAgICAgICAgICAgICAgTnVtYmVyIG9mIGZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOckNoYW5uZWxzICAgICAgICAgICAgICBOdW1iZXIgb2YgY2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBWb2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEFHQ19NSVhfVk9MX01jMU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRkxPQVRfdCAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwTWNTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcE1vbm9TcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAqcERzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgTnJDaGFubmVscykKK3sKKworICAgIC8qCisgICAgICogR2VuZXJhbCB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgaSwgamo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGUgaW5kZXggKi8KKyAgICBMVk1fRkxPQVQgICAgICAgU2FtcGxlVmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGUgdmFsdWUgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgTW9ubzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb25vIHNhbXBsZSAqLworICAgIExWTV9GTE9BVCAgICAgICBBYnNQZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFic29sdXRlIHBlYWsgc2lnbmFsICovCisgICAgTFZNX0ZMT0FUICAgICAgIEFHQ19NdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hvcnQgQUdDIGdhaW4gKi8KKyAgICBMVk1fRkxPQVQgICAgICAgVm9sX011bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaG9ydCB2b2x1bWUgKi8KKworCisgICAgLyoKKyAgICAgKiBJbnN0YW5jZSBjb250cm9sIHZhcmlhYmxlcworICAgICAqLworICAgIExWTV9GTE9BVCAgICAgIEFHQ19HYWluICAgICAgPSBwSW5zdGFuY2UtPkFHQ19HYWluOyAgICAgICAgIC8qIEdldCB0aGUgY3VycmVudCBBR0MgZ2FpbiAqLworICAgIExWTV9GTE9BVCAgICAgIEFHQ19NYXhHYWluICAgPSBwSW5zdGFuY2UtPkFHQ19NYXhHYWluOyAgICAgIC8qIEdldCBtYXhpbXVtIEFHQyBnYWluICovCisgICAgTFZNX0ZMT0FUICAgICAgQUdDX0F0dGFjayAgICA9IHBJbnN0YW5jZS0+QUdDX0F0dGFjazsgICAgICAgLyogQXR0YWNrIHNjYWxlciAqLworICAgIC8qIERlY2F5IHNjYWxlciAqLworICAgIExWTV9GTE9BVCAgICAgIEFHQ19EZWNheSAgICAgPSAocEluc3RhbmNlLT5BR0NfRGVjYXkgKiAoMSA8PCAoREVDQVlfU0hJRlQpKSk7CisgICAgTFZNX0ZMT0FUICAgICAgQUdDX1RhcmdldCAgICA9IHBJbnN0YW5jZS0+QUdDX1RhcmdldDsgICAgICAgLyogR2V0IHRoZSB0YXJnZXQgbGV2ZWwgKi8KKyAgICBMVk1fRkxPQVQgICAgICBWb2xfQ3VycmVudCAgID0gcEluc3RhbmNlLT5Wb2x1bWU7ICAgICAgICAgICAvKiBBY3R1YWwgdm9sdW1lIHNldHRpbmcgKi8KKyAgICBMVk1fRkxPQVQgICAgICBWb2xfVGFyZ2V0ICAgID0gcEluc3RhbmNlLT5UYXJnZXQ7ICAgICAgICAgICAvKiBUYXJnZXQgdm9sdW1lIHNldHRpbmcgKi8KKyAgICBMVk1fRkxPQVQgICAgICBWb2xfVEMgICAgICAgID0gcEluc3RhbmNlLT5Wb2x1bWVUQzsgICAgICAgICAvKiBUaW1lIGNvbnN0YW50ICovCisKKworICAgIC8qCisgICAgICogUHJvY2VzcyBvbiBhIHNhbXBsZSBieSBzYW1wbGUgYmFzaXMKKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTnJGcmFtZXM7IGkrKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIGVhY2ggZnJhbWUgKi8KKyAgICB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSBzY2FsZXJzCisgICAgICAgICAqLworICAgICAgICBBR0NfTXVsdCAgICA9IChMVk1fRkxPQVQpKEFHQ19HYWluKTsgICAgICAgICAgICAgIC8qIEdldCB0aGUgQUdDIGdhaW4gKi8KKyAgICAgICAgVm9sX011bHQgICAgPSAoTFZNX0ZMT0FUKShWb2xfQ3VycmVudCk7ICAgICAgICAgICAvKiBHZXQgdGhlIHZvbHVtZSBnYWluICovCisKKyAgICAgICAgQWJzUGVhayA9IDAuMGY7CisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgaW5wdXQgc2FtcGxlcworICAgICAgICAgKi8KKyAgICAgICAgZm9yIChqaiA9IDA7IGpqIDwgTnJDaGFubmVsczsgamorKykKKyAgICAgICAgeworICAgICAgICAgICAgU2FtcGxlVmFsICA9ICpwTWNTcmMrKzsgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgc2FtcGxlIHZhbHVlIG9mIGpqIENoYW5uZWwqLworICAgICAgICAgICAgTW9ubyAgICAgICA9ICpwTW9ub1NyYzsgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbW9ubyBzYW1wbGUgKi8KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFwcGx5IHRoZSBBR0MgZ2FpbiB0byB0aGUgbW9ubyBpbnB1dCBhbmQgbWl4IHdpdGggdGhlIGlucHV0IHNpZ25hbAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBTYW1wbGVWYWwgICs9IChNb25vICogQUdDX011bHQpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1peCBpbiB0aGUgbW9ubyBzaWduYWwgKi8KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFwcGx5IHRoZSB2b2x1bWUgYW5kIHdyaXRlIHRvIHRoZSBvdXRwdXQgc3RyZWFtCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFNhbXBsZVZhbCAgPSBTYW1wbGVWYWwgICogVm9sX011bHQ7CisKKyAgICAgICAgICAgICpwRHN0KysgPSBTYW1wbGVWYWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYXZlIHRoZSByZXN1bHRzICovCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIEFHQyBnYWluCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEFic1BlYWsgPSBBYnNfRmxvYXQoU2FtcGxlVmFsKSA+IEFic1BlYWsgPyBBYnNfRmxvYXQoU2FtcGxlVmFsKSA6IEFic1BlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKEFic1BlYWsgPiBBR0NfVGFyZ2V0KQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhlIHNpZ25hbCBpcyB0b28gbGFyZ2Ugc28gZGVjcmVhc2UgdGhlIGdhaW4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQUdDX0dhaW4gPSBBR0NfR2FpbiAqIEFHQ19BdHRhY2s7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhlIHNpZ25hbCBpcyB0b28gc21hbGwgc28gaW5jcmVhc2UgdGhlIGdhaW4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKEFHQ19HYWluID4gQUdDX01heEdhaW4pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQUdDX0dhaW4gLT0gKEFHQ19EZWNheSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQUdDX0dhaW4gKz0gKEFHQ19EZWNheSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcE1vbm9TcmMrKzsKKyAgICAgICAgLyoKKyAgICAgICAgICogVXBkYXRlIHRoZSBnYWluCisgICAgICAgICAqLworICAgICAgICBWb2xfQ3VycmVudCArPSAgKFZvbF9UYXJnZXQgLSBWb2xfQ3VycmVudCkgKiAoKExWTV9GTE9BVClWb2xfVEMgLyBWT0xfVENfRkxPQVQpOworICAgIH0KKworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPlZvbHVtZSA9IFZvbF9DdXJyZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBY3R1YWwgdm9sdW1lIHNldHRpbmcgKi8KKyAgICBwSW5zdGFuY2UtPkFHQ19HYWluID0gQUdDX0dhaW47CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYgLypTVVBQT1JUX01DKi8KICNlbmRpZiAvKkJVSUxEX0ZMT0FUKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BZGQyX1NhdF8zMngzMi5jCmluZGV4IGUzZWRjY2MuLjY2ZDZhZGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWRkMl9TYXRfMzJ4MzIuYwpAQCAtNDMsMTEgKzQzLDExIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGlmKGE8MCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjPTB4ODAwMDAwMDBsOworICAgICAgICAgICAgICAgIGM9MHg4MDAwMDAwMEw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYz0weDdGRkZGRkZGbDsKKyAgICAgICAgICAgICAgICBjPTB4N0ZGRkZGRkZMOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jCmluZGV4IDk2MGRlNzkuLmQ2MzM2NWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEuYwpAQCAtMTIzLDYgKzEyMyw4NyBAQAogICAgICAgICB9CiAKICAgICB9CisKKyNpZmRlZiBTVVBQT1JUX01DCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBBU1NVTVBUSU9OUzoKKyBDT0VGUy0KKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEyLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEExCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyBBMCwgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSBpcyAtQjIKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdIGlzIC1CMQorCisgREVMQVlTLQorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSB0bworIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzIC0gMV0gaXMgeChuLTEpIGZvciBhbGwgTnJDaGFubmVscworCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHNdIHRvCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzIqTnJDaGFubmVscyAtIDFdIGlzIHgobi0yKSBmb3IgYWxsIE5yQ2hhbm5lbHMKKworIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syKk5yQ2hhbm5lbHNdIHRvCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzMqTnJDaGFubmVscyAtIDFdIGlzIHkobi0xKSBmb3IgYWxsIE5yQ2hhbm5lbHMKKworIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szKk5yQ2hhbm5lbHNdIHRvCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzQqTnJDaGFubmVscyAtIDFdIGlzIHkobi0yKSBmb3IgYWxsIE5yQ2hhbm5lbHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgQlFfTUNfRDMyRjMyQzMwX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKQorCisKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCB5biwgdGVtcDsKKyAgICAgICAgTFZNX0lOVDE2IGlpLCBqajsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworCisgICAgICAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIENIQU5ORUwtV0lTRQorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgZm9yIChqaiA9IDA7IGpqIDwgTnJDaGFubmVsczsgamorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiB5bj0gKEEyICAqIHgobi0yKSkgKi8KKyAgICAgICAgICAgICAgICB5biA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyArIGpqXTsKKworICAgICAgICAgICAgICAgIC8qIHluKz0gKEExICAqIHgobi0xKSkgKi8KKyAgICAgICAgICAgICAgICB0ZW1wID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal07CisgICAgICAgICAgICAgICAgeW4gKz0gdGVtcDsKKworICAgICAgICAgICAgICAgIC8qIHluKz0gKEEwICAqIHgobikpICovCisgICAgICAgICAgICAgICAgdGVtcCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOworICAgICAgICAgICAgICAgIHluICs9IHRlbXA7CisKKyAgICAgICAgICAgICAgICAgLyogeW4rPSAoLUIyICAqIHkobi0yKSkgKi8KKyAgICAgICAgICAgICAgICB0ZW1wID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzKjMgKyBqal07CisgICAgICAgICAgICAgICAgeW4gKz0gdGVtcDsKKworICAgICAgICAgICAgICAgIC8qIHluKz0gKC1CMSAgKiB5KG4tMSkpICovCisgICAgICAgICAgICAgICAgdGVtcCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyoyICsgampdOworICAgICAgICAgICAgICAgIHluICs9IHRlbXA7CisKKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDMgKyBqal0gPQorICAgICAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDIgKyBqal07IC8qIHkobi0yKT15KG4tMSkqLworICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICogMSArIGpqXSA9CisgICAgICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal07IC8qIHgobi0yKT14KG4tMSkqLworICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICogMiArIGpqXSA9IChMVk1fRkxPQVQpeW47IC8qIFVwZGF0ZSB5KG4tMSkqLworICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpKi8KKyAgICAgICAgICAgICAgICBwRGF0YUluKys7CisgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKXluOyAvKiBXcml0ZSBqaiBDaGFubmVsIG91dHB1dCAqLworICAgICAgICAgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKyNlbmRpZiAvKlNVUFBPUlRfTUMqLworCiAjZWxzZQogdm9pZCBCUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29weV8xNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29weV8xNi5jCmluZGV4IGU0ODkwMzEuLjM4NTg0NTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcHlfMTYuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmMKQEAgLTg0LDUgKzg0LDY1IEBACiAKICAgICByZXR1cm47CiB9CisjaWZkZWYgU1VQUE9SVF9NQworLy8gRXh0cmFjdCBvdXQgdGhlIHN0ZXJlbyBjaGFubmVsIHBhaXIgZnJvbSBtdWx0aWNoYW5uZWwgc291cmNlLgordm9pZCBDb3B5X0Zsb2F0X01jX1N0ZXJlbyhjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywgLyogTnVtYmVyIG9mIGZyYW1lcyAqLworICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgTnJDaGFubmVscykKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisKKyAgICBpZiAoTnJDaGFubmVscyA+PSAyKQorICAgIHsKKyAgICAgICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisgICAgICAgICAgICBkc3RbMF0gPSBzcmNbMF07CisgICAgICAgICAgICBkc3RbMV0gPSBzcmNbMV07CisgICAgICAgICAgICBkc3QgKz0gMjsKKyAgICAgICAgICAgIHNyYyArPSBOckNoYW5uZWxzOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKE5yQ2hhbm5lbHMgPT0gMSkKKyAgICB7ICAgLy8gbm90IGV4cGVjdGVkIHRvIG9jY3VyLCBwcm92aWRlZCBmb3IgY29tcGxldGVuZXNzLgorICAgICAgICBzcmMgKz0gKE5yRnJhbWVzIC0gMSk7CisgICAgICAgIGRzdCArPSAyICogKE5yRnJhbWVzIC0gMSk7CisgICAgICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworICAgICAgICAgICAgZHN0WzBdID0gc3JjWzBdOworICAgICAgICAgICAgZHN0WzFdID0gc3JjWzBdOworICAgICAgICAgICAgZHN0IC09IDI7CisgICAgICAgICAgICBzcmMgLS07CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIE1lcmdlIGEgbXVsdGljaGFubmVsIHNvdXJjZSB3aXRoIHN0ZXJlbyBjb250YWluZWQgaW4gZHN0LCB0byBkc3QuCit2b2lkIENvcHlfRmxvYXRfU3RlcmVvX01jKGNvbnN0IExWTV9GTE9BVCAqc3JjLAorICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IE5yRnJhbWVzLCAvKiBOdW1iZXIgb2YgZnJhbWVzKi8KKyAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIE5yQ2hhbm5lbHMpCit7CisgICAgTFZNX0lOVDE2IGlpLCBqajsKKyAgICBMVk1fRkxPQVQgKnNyY19zdCA9IGRzdCArIDIgKiAoTnJGcmFtZXMgLSAxKTsKKworICAgIC8vIHJlcGFjayBkc3Qgd2hpY2ggY2FycmllcyBzdGVyZW8gaW5mb3JtYXRpb24KKyAgICAvLyB0b2dldGhlciB3aXRoIHRoZSB1cHBlciBjaGFubmVscyBvZiBzcmMuCisgICAgZHN0ICs9IE5yQ2hhbm5lbHMgKiAoTnJGcmFtZXMgLSAxKTsKKyAgICBzcmMgKz0gTnJDaGFubmVscyAqIChOckZyYW1lcyAtIDEpOworICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIGRzdFsxXSA9IHNyY19zdFsxXTsKKyAgICAgICAgZHN0WzBdID0gc3JjX3N0WzBdOyAvLyBjb3B5IDEgYmVmb3JlIDAgaXMgcmVxdWlyZWQgZm9yIE5yQ2hhbm5lbHMgPT0gMy4KKyAgICAgICAgZm9yIChqaiA9IDI7IGpqIDwgTnJDaGFubmVsczsgamorKykKKyAgICAgICAgeworICAgICAgICAgICAgZHN0W2pqXSA9IHNyY1tqal07CisgICAgICAgIH0KKyAgICAgICAgZHN0ICAgIC09IE5yQ2hhbm5lbHM7CisgICAgICAgIHNyYyAgICAtPSBOckNoYW5uZWxzOworICAgICAgICBzcmNfc3QgLT0gMjsKKyAgICB9Cit9CisjZW5kaWYKICNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuYwppbmRleCBkMjYxYzllLi4xM2ZhYzVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmMKQEAgLTMzLDcgKzMzLDcgQEAKICAgICAgICAgUmlnaHREQyA9IHBCaXF1YWRTdGF0ZS0+UmlnaHREQzsKICAgICAgICAgZm9yKGogPSBOclNhbXBsZXMtMTsgaiA+PSAwOyBqLS0pCiAgICAgICAgIHsKLSAgICAgICAgICAgIC8qIFN1YnRyYWN0IERDIGFuIHNhdHVyYXRlICovCisgICAgICAgICAgICAvKiBTdWJ0cmFjdCBEQyBhbmQgc2F0dXJhdGUgKi8KICAgICAgICAgICAgIERpZmYgPSogKHBEYXRhSW4rKykgLSAoTGVmdERDKTsKICAgICAgICAgICAgIGlmIChEaWZmID4gMS4wZikgewogICAgICAgICAgICAgICAgIERpZmYgPSAxLjBmOyB9CkBAIC02NCw2ICs2NCw1OCBAQAogCiAKICAgICB9CisjaWZkZWYgU1VQUE9SVF9NQworLyoKKyAqIEZVTkNUSU9OOiAgICAgICBEQ19NY19EMTZfVFJDX1dSQV8wMQorICoKKyAqIERFU0NSSVBUSU9OOgorICogIERDIHJlbW92YWwgZnJvbSBhbGwgY2hhbm5lbHMgb2YgYSBtdWx0aWNoYW5uZWwgaW5wdXQKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHBJbnN0YW5jZSAgICAgIEluc3RhbmNlIHBvaW50ZXIKKyAqICBwRGF0YUluICAgICAgICBJbnB1dC9Tb3VyY2UKKyAqICBwRGF0YU91dCAgICAgICBPdXRwdXQvRGVzdGluYXRpb24KKyAqICBOckZyYW1lcyAgICAgICBOdW1iZXIgb2YgZnJhbWVzCisgKiAgTnJDaGFubmVscyAgICAgTnVtYmVyIG9mIGNoYW5uZWxzCisgKgorICogUkVUVVJOUzoKKyAqICB2b2lkCisgKgorICovCit2b2lkIERDX01jX0QxNl9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckNoYW5uZWxzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICpDaERDOworICAgICAgICBMVk1fRkxPQVQgRGlmZjsKKyAgICAgICAgTFZNX0lOVDMyIGo7CisgICAgICAgIExWTV9JTlQzMiBpOworICAgICAgICBQRmlsdGVyX0ZMT0FUX1N0YXRlX01jIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX0ZMT0FUX1N0YXRlX01jKSBwSW5zdGFuY2U7CisKKyAgICAgICAgQ2hEQyA9ICZwQmlxdWFkU3RhdGUtPkNoRENbMF07CisgICAgICAgIGZvciAoaiA9IE5yRnJhbWVzIC0gMTsgaiA+PSAwOyBqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFN1YnRyYWN0IERDIGFuZCBzYXR1cmF0ZSAqLworICAgICAgICAgICAgZm9yIChpID0gTnJDaGFubmVscyAtIDE7IGkgPj0gMDsgaS0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIERpZmYgPSAqKHBEYXRhSW4rKykgLSAoQ2hEQ1tpXSk7CisgICAgICAgICAgICAgICAgaWYgKERpZmYgPiAxLjBmKSB7CisgICAgICAgICAgICAgICAgICAgIERpZmYgPSAxLjBmOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoRGlmZiA8IC0xLjBmKSB7CisgICAgICAgICAgICAgICAgICAgIERpZmYgPSAtMS4wZjsgfQorICAgICAgICAgICAgICAgICoocERhdGFPdXQrKykgPSAoTFZNX0ZMT0FUKURpZmY7CisgICAgICAgICAgICAgICAgaWYgKERpZmYgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIENoRENbaV0gLT0gRENfRkxPQVRfU1RFUDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBDaERDW2ldICs9IERDX0ZMT0FUX1NURVA7IH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICB9CisjZW5kaWYKICNlbHNlCiB2b2lkIERDXzJJX0QxNl9UUkNfV1JBXzAxKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmMKaW5kZXggNGY0ZmNkOC4uMGY5NDFhMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuYwpAQCAtMjQsNiArMjQsMTcgQEAKICAgICBwQmlxdWFkU3RhdGUtPkxlZnREQyAgICAgICAgPSAwLjBmOwogICAgIHBCaXF1YWRTdGF0ZS0+UmlnaHREQyAgICAgICA9IDAuMGY7CiB9CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCAgRENfTWNfRDE2X1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UpCit7CisgICAgUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYyBwQmlxdWFkU3RhdGUgID0gKFBGaWx0ZXJfRkxPQVRfU3RhdGVfTWMpIHBJbnN0YW5jZTsKKyAgICBMVk1fSU5UMzIgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTFZNX01BWF9DSEFOTkVMUzsgaSsrKQorICAgIHsKKyAgICAgICAgcEJpcXVhZFN0YXRlLT5DaERDW2ldID0gMC4wZjsKKyAgICB9Cit9CisjZW5kaWYKICNlbHNlCiB2b2lkICBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSkKIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCBmYTZiNzI5Li5kYjNhNmQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0zNCw2ICszNCwxMyBAQAogICAgIExWTV9GTE9BVCAgUmlnaHREQzsgICAgLyogUmlnaHREQyAgKi8KIH1GaWx0ZXJfRkxPQVRfU3RhdGU7CiB0eXBlZGVmIEZpbHRlcl9GTE9BVF9TdGF0ZSAqIFBGaWx0ZXJfRkxPQVRfU3RhdGUgOworI2lmZGVmIFNVUFBPUlRfTUMKK3R5cGVkZWYgc3RydWN0IF9GaWx0ZXJfRkxPQVRfU3RhdGVfTWNfCit7CisgICAgTFZNX0ZMT0FUICBDaERDW0xWTV9NQVhfQ0hBTk5FTFNdOyAgICAgLyogQ2hhbm5lbERDICAqLworfSBGaWx0ZXJfRkxPQVRfU3RhdGVfTWM7Cit0eXBlZGVmIEZpbHRlcl9GTE9BVF9TdGF0ZV9NYyAqIFBGaWx0ZXJfRkxPQVRfU3RhdGVfTWMgOworI2VuZGlmCiAjZWxzZQogdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5QWxsUGFzc19TYXRfMzJ4MTZUbzMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheUFsbFBhc3NfU2F0XzMyeDE2VG8zMi5jCmluZGV4IDJlMjBkNzkuLmIwNGU5OGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5QWxsUGFzc19TYXRfMzJ4MTZUbzMyLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlBbGxQYXNzX1NhdF8zMngxNlRvMzIuYwpAQCAtNTMsMTEgKzUzLDExIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGlmKGEgPCAwKQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGMgPSAweDgwMDAwMDAwbDsKKyAgICAgICAgICAgICAgICBjID0gMHg4MDAwMDAwMEw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYyA9IDB4N0ZGRkZGRkZsOworICAgICAgICAgICAgICAgIGMgPSAweDdGRkZGRkZGTDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAqZHN0ID0gYzsKQEAgLTcyLDExICs3MiwxMSBAQAogICAgICAgICB7CiAgICAgICAgICAgICBpZihhIDwgMCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjID0gMHg4MDAwMDAwMGw7CisgICAgICAgICAgICAgICAgYyA9IDB4ODAwMDAwMDBMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGMgPSAweDdGRkZGRkZGbDsKKyAgICAgICAgICAgICAgICBjID0gMHg3RkZGRkZGRkw7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZGVsYXlbQWxsUGFzc09mZnNldF0gPSBjOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jCmluZGV4IDE5MjkyN2MuLjJhNTBmMTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxLmMKQEAgLTExNyw2ICsxMTcsOTMgQEAKICAgICAgICAgfQogCiAgICAgfQorI2lmZGVmIFNVUFBPUlRfTUMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQVNTVU1QVElPTlM6CitDT0VGUy0KK3BCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTEsCitwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEEwLAorcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyAtQjEsCitERUxBWVMtCitwQmlxdWFkU3RhdGUtPnBEZWxheXNbMipjaCArIDBdIGlzIHgobi0xKSBvZiB0aGUgJ2NoJyAtIGNoYW5uZWwKK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1syKmNoICsgMV0gaXMgeShuLTEpIG9mIHRoZSAnY2gnIC0gY2hhbm5lbAorVGhlIGluZGV4ICdjaCcgcnVucyBmcm9tIDAgdG8gKE5yQ2hhbm5lbHMgLSAxKQorCitQQVJBTUVURVJTOgorIHBJbnN0YW5jZSAgICAgICAgUG9pbnRlciBJbnN0YW5jZQorIHBEYXRhSW4gICAgICAgICAgSW5wdXQvU291cmNlCisgcERhdGFPdXQgICAgICAgICBPdXRwdXQvRGVzdGluYXRpb24KKyBOckZyYW1lcyAgICAgICAgIE51bWJlciBvZiBmcmFtZXMKKyBOckNoYW5uZWxzICAgICAgIE51bWJlciBvZiBjaGFubmVscworCitSRVRVUk5TOgorIHZvaWQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRk9fTWNfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckNoYW5uZWxzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICAgeW47CisgICAgICAgIExWTV9GTE9BVCAgIFRlbXA7CisgICAgICAgIExWTV9JTlQxNiAgIGlpOworICAgICAgICBMVk1fSU5UMTYgICBjaDsKKyAgICAgICAgUEZpbHRlcl9GbG9hdF9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9GbG9hdF9TdGF0ZSkgcEluc3RhbmNlOworCisgICAgICAgIExWTV9GTE9BVCAgICpwRGVsYXlzID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzOworICAgICAgICBMVk1fRkxPQVQgICAqcENvZWZzICA9ICZwQmlxdWFkU3RhdGUtPmNvZWZzWzBdOworICAgICAgICBMVk1fRkxPQVQgICBBMCA9IHBDb2Vmc1sxXTsKKyAgICAgICAgTFZNX0ZMT0FUICAgQTEgPSBwQ29lZnNbMF07CisgICAgICAgIExWTV9GTE9BVCAgIEIxID0gcENvZWZzWzJdOworCisKKworCisgICAgICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBDSEFOTkVMUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgTnJDaGFubmVsczsgY2grKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB5biA9QTEgICogeChuLTEpCisgICAgICAgICAgICAgICAgeW4gPSAoTFZNX0ZMT0FUKUExICogcERlbGF5c1swXTsKKworICAgICAgICAgICAgICAgIC8vIHluKz1BMCAgKiB4KG4pCisgICAgICAgICAgICAgICAgeW4gKz0gKExWTV9GTE9BVClBMCAqICgqcERhdGFJbik7CisKKyAgICAgICAgICAgICAgICAvLyB5biArPSAgKC1CMSAgKiB5KG4tMSkpCisgICAgICAgICAgICAgICAgVGVtcCA9IEIxICogcERlbGF5c1sxXTsKKyAgICAgICAgICAgICAgICB5biArPSBUZW1wOworCisKKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICBwRGVsYXlzWzFdID0geW47IC8vIFVwZGF0ZSB5KG4tMSkKKyAgICAgICAgICAgICAgICBwRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpCisKKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICAgICAgLypTYXR1cmF0ZSByZXN1bHRzKi8KKyAgICAgICAgICAgICAgICBpZiAoeW4gPiAxLjBmKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeW4gPSAxLjBmOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoeW4gPCAtMS4wZikgeworICAgICAgICAgICAgICAgICAgICB5biA9IC0xLjBmOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5bjsKKyAgICAgICAgICAgICAgICBwRGVsYXlzICs9IDI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwRGVsYXlzIC09IE5yQ2hhbm5lbHMgKiAyOworICAgICAgICB9CisgICAgfQorI2VuZGlmCiAjZWxzZQogdm9pZCBGT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jCmluZGV4IGFjMWVlYTguLmQwMmFmODggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jCkBAIC02OCw1ICs2OCw0NyBAQAogCiAgICAgcmV0dXJuOwogfQorI2lmZGVmIFNVUFBPUlRfTUMKKy8qCisgKiBGVU5DVElPTjogICAgICAgRnJvbU1jVG9Nb25vX0Zsb2F0CisgKgorICogREVTQ1JJUFRJT046CisgKiAgQ3JlYXRlcyBhIG1vbm8gc3RyZWFtIGZyb20gYSBtdWx0aWNoYW5uZWwgaW5wdXQgdGFraW5nIHRoZSBhdmVyZ2FlIG9mCisgKiAgc2FtcGxlIHZhbHVlcyBvZiBhbGwgY2hhbm5lbHMKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHNyYyAgICAgICAgICAgIFNvdXJjZQorICogIGRzdCAgICAgICAgICAgIERlc3RpbmF0aW9uCisgKiAgTnJGcmFtZXMgICAgICAgTnVtYmVyIG9mIGZyYW1lcworICogIE5yQ2hhbm5lbHMgICAgIE51bWJlciBvZiBjaGFubmVscworICoKKyAqIFJFVFVSTlM6CisgKiAgdm9pZAorICoKKyAqLwordm9pZCBGcm9tTWNUb01vbm9fRmxvYXQoY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckNoYW5uZWxzKQoreworICAgIExWTV9JTlQxNiBpaSwgamo7CisgICAgTFZNX0ZMT0FUIFRlbXA7CisKKyAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBUZW1wID0gMC4wZjsKKyAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9MDsgamotLSkKKyAgICAgICAgeworICAgICAgICAgICAgVGVtcCArPSAoKnNyYyk7CisgICAgICAgICAgICBzcmMrKzsKKyAgICAgICAgfQorICAgICAgICAqZHN0ID0gVGVtcCAvIE5yQ2hhbm5lbHM7CisgICAgICAgIGRzdCsrOworICAgIH0KKworICAgIHJldHVybjsKK30KKyNlbmRpZgorCiAjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVC5jCmluZGV4IGViNTc1NWUuLmRiNzZjZDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FULmMKQEAgLTU5LDYgKzU5LDMxIEBACiAKIAogfQorI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgTFZDX0NvcmVfTWl4SGFyZF8xU3RfTUNfZmxvYXRfU0FUIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgTnJDaGFubmVscykKK3sKKyAgICBMVk1fRkxPQVQgIFRlbXA7CisgICAgTFZNX0lOVDE2IGlpLCBqajsKKyAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBmb3IgKGpqID0gMDsgamogPCBOckNoYW5uZWxzOyBqaisrKQorICAgICAgICB7CisgICAgICAgICAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTEgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2VbampdKTsKKyAgICAgICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpcEluc3RhbmNlMS0+Q3VycmVudCk7CisgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKKyAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAqZHN0KysgPSAoTFZNX0ZMT0FUKVRlbXA7CisgICAgICAgIH0KKyAgICB9Cit9CisjZW5kaWYKICNlbHNlCiB2b2lkIExWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVC5jCmluZGV4IGQyNjk0Y2MuLjQxOWM3YzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FULmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYwpAQCAtMjYsMTAgKzI2LDEwIEBACiAgICBGVU5DVElPTiBMVkNvcmVfTUlYU09GVF8xU1RfRDE2QzMxX1dSQQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3ZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBuKQogewogCiAgICAgTFZNX0lOVDE2ICAgT3V0TG9vcDsKQEAgLTExNCw2ICsxMTQsMTM5IEBACiAgICAgfQogICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IEN1cnJlbnQ7CiB9CisjaWZkZWYgU1VQUE9SVF9NQworLyoKKyAqIEZVTkNUSU9OOiAgICAgICBMVkNfQ29yZV9NaXhJblNvZnRfTWNfRDE2QzMxX1NBVAorICoKKyAqIERFU0NSSVBUSU9OOgorICogIE1peGVyIGZ1bmN0aW9uIHdpdGggc3VwcG9ydCBmb3IgcHJvY2Vzc2luZyBtdWx0aWNoYW5uZWwgaW5wdXQuCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBwdHJJbnN0YW5jZSAgICBJbnN0YW5jZSBwb2ludGVyCisgKiAgc3JjICAgICAgICAgICAgU291cmNlCisgKiAgZHN0ICAgICAgICAgICAgRGVzdGluYXRpb24KKyAqICBOckZyYW1lcyAgICAgICBOdW1iZXIgb2YgZnJhbWVzCisgKiAgTnJDaGFubmVscyAgICAgTnVtYmVyIG9mIGNoYW5uZWxzCisgKgorICogUkVUVVJOUzoKKyAqICB2b2lkCisgKgorICovCit2b2lkIExWQ19Db3JlX01peEluU29mdF9NY19EMTZDMzFfU0FUKExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgIE5yQ2hhbm5lbHMpCit7CisKKyAgICBMVk1fSU5UMTYgICBPdXRMb29wOworICAgIExWTV9JTlQxNiAgIEluTG9vcDsKKyAgICBMVk1fSU5UMzIgICBpaSwgamo7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPlByaXZhdGVQYXJhbXMpOworICAgIExWTV9GTE9BVCAgIERlbHRhID0gcEluc3RhbmNlLT5EZWx0YTsKKyAgICBMVk1fRkxPQVQgICBDdXJyZW50ID0gcEluc3RhbmNlLT5DdXJyZW50OworICAgIExWTV9GTE9BVCAgIFRhcmdldCA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgIExWTV9GTE9BVCAgIFRlbXA7CisKKyAgICAvKgorICAgICAqIFNhbWUgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBvbiBjb25zZWN1dGl2ZSBmcmFtZXMuCisgICAgICogU28gdHdvIGZyYW1lcyBhcmUgcHJvY2Vzc2VkIGluIG9uZSBpdGVyYXRpb24gYW5kCisgICAgICogdGhlIGxvb3Agd2lsbCBydW4gb25seSBmb3IgaGFsZiB0aGUgTnJGcmFtZXMgdmFsdWUgdGltZXMuCisgICAgICovCisgICAgSW5Mb29wID0gKExWTV9JTlQxNikoTnJGcmFtZXMgPj4gMSk7CisgICAgLyogT3V0TG9vcCBpcyBjYWxjdWxhdGVkIHRvIGhhbmRsZSBjYXNlcyB3aGVyZSBOckZyYW1lcyB2YWx1ZSBjYW4gYmUgb2RkLiovCisgICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKE5yRnJhbWVzIC0gKEluTG9vcCA8PCAxKSk7CisKKyAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkgeworICAgICAgICBpZiAoT3V0TG9vcCkgeworICAgICAgICAgICAgVGVtcCA9IEN1cnJlbnQgKyBEZWx0YTsKKyAgICAgICAgICAgIEN1cnJlbnQgPSBUZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcCpOckNoYW5uZWxzOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgICAgICAgICAgVGVtcCA9ICgqZHN0KSArICgqKHNyYysrKSAqIEN1cnJlbnQpOworICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gVGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgICAgIFRlbXAgPSBDdXJyZW50ICsgRGVsdGE7CisgICAgICAgICAgICBDdXJyZW50ID0gVGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPSAwIDsgamotLSkgeworICAgICAgICAgICAgICAgIFRlbXAgPSAoKmRzdCkgKyAoKihzcmMrKykgKiBDdXJyZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7CisKKyAgICAgICAgICAgICAgICBUZW1wID0gKCpkc3QpICsgKCooc3JjKyspICogQ3VycmVudCk7CisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSBUZW1wOworCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZXsKKyAgICAgICAgaWYgKE91dExvb3ApIHsKKyAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcCpOckNoYW5uZWxzOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgICAgICAgICAgVGVtcCA9ICgqZHN0KSArICgqKHNyYysrKSAqIEN1cnJlbnQpOworICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gVGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0gMCA7IGpqLS0pIHsKKyAgICAgICAgICAgICAgICBUZW1wID0gKCpkc3QpICsgKCooc3JjKyspICogQ3VycmVudCk7CisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSBUZW1wOworCisgICAgICAgICAgICAgICAgVGVtcCA9ICgqZHN0KSArICgqKHNyYysrKSAqIEN1cnJlbnQpOworICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gVGVtcDsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IEN1cnJlbnQ7Cit9CisKKyNlbmRpZgogI2Vsc2UKIHZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX3N0ICpwdHJJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYywKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEuYwppbmRleCA2NTZhMTE3Li41NmI1ZGFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQS5jCkBAIC0xNDYsNiArMTQ2LDUxIEBACiAgICAgcEluc3RhbmNlUi0+Q3VycmVudCA9IEN1cnJlbnRSOwogCiB9CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9NQ19mbG9hdF9XUkEgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICoqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICBOckNoYW5uZWxzKQoreworICAgIExWTV9JTlQzMiAgIGlpLCBjaDsKKyAgICBMVk1fRkxPQVQgICBUZW1wID0wLjBmOworICAgIExWTV9GTE9BVCAgIHRlbXBDdXJyZW50W05yQ2hhbm5lbHNdOworICAgIGZvciAoY2ggPSAwOyBjaCA8IE5yQ2hhbm5lbHM7IGNoKyspCisgICAgeworICAgICAgICB0ZW1wQ3VycmVudFtjaF0gPSBwdHJJbnN0YW5jZVtjaF0tPkN1cnJlbnQ7CisgICAgfQorICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgPiAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgTnJDaGFubmVsczsgY2grKykKKyAgICAgICAgeworICAgICAgICAgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgKnBJbnN0YW5jZSA9IHB0ckluc3RhbmNlW2NoXTsKKyAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgIERlbHRhID0gcEluc3RhbmNlLT5EZWx0YTsKKyAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgIEN1cnJlbnQgPSB0ZW1wQ3VycmVudFtjaF07CisgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICBUYXJnZXQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFERDJfU0FUX0ZMT0FUKEN1cnJlbnQsIERlbHRhLCBUZW1wKTsKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGVtcDsKKyAgICAgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKKyAgICAgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOworICAgICAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQorICAgICAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmRzdCsrID0gKnNyYysrICogQ3VycmVudDsKKyAgICAgICAgICAgIHRlbXBDdXJyZW50W2NoXSA9IEN1cnJlbnQ7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChjaCA9IDA7IGNoIDwgTnJDaGFubmVsczsgY2grKykKKyAgICB7CisgICAgICAgIHB0ckluc3RhbmNlW2NoXS0+Q3VycmVudCA9IHRlbXBDdXJyZW50W2NoXTsKKyAgICB9Cit9CisjZW5kaWYKICNlbHNlCiB2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEoIExWTWl4ZXIzX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuYwppbmRleCBiNWU3ZjVjLi41YmZkYWQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQS5jCkBAIC0yNywxMCArMjcsMTAgQEAKICAgIEZVTkNUSU9OIExWQ29yZV9NSVhTT0ZUXzFTVF9EMTZDMzFfV1JBCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKCBMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCit2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBuKQogewogICAgIExWTV9JTlQxNiAgIE91dExvb3A7CiAgICAgTFZNX0lOVDE2ICAgSW5Mb29wOwpAQCAtMTA1LDYgKzEwNSwxMTkgQEAKICAgICB9CiAgICAgcEluc3RhbmNlLT5DdXJyZW50PUN1cnJlbnQ7CiB9CisKKworI2lmZGVmIFNVUFBPUlRfTUMKKy8qCisgKiBGVU5DVElPTjogICAgICAgTFZDX0NvcmVfTWl4U29mdF9NY19EMTZDMzFfV1JBCisgKgorICogREVTQ1JJUFRJT046CisgKiAgTWl4ZXIgZnVuY3Rpb24gd2l0aCBzdXBwb3J0IGZvciBwcm9jZXNzaW5nIG11bHRpY2hhbm5lbCBpbnB1dAorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgcHRySW5zdGFuY2UgICAgSW5zdGFuY2UgcG9pbnRlcgorICogIHNyYyAgICAgICAgICAgIFNvdXJjZQorICogIGRzdCAgICAgICAgICAgIERlc3RpbmF0aW9uCisgKiAgTnJGcmFtZXMgICAgICAgTnVtYmVyIG9mIGZyYW1lcworICogIE5yQ2hhbm5lbHMgICAgIE51bWJlciBvZiBjaGFubmVscworICoKKyAqIFJFVFVSTlM6CisgKiAgdm9pZAorICoKKyAqLwordm9pZCBMVkNfQ29yZV9NaXhTb2Z0X01jX0QxNkMzMV9XUkEoTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgIE5yQ2hhbm5lbHMpCit7CisgICAgTFZNX0lOVDE2ICAgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgICBJbkxvb3A7CisgICAgTFZNX0lOVDMyICAgaWksIGpqOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlPShNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+UHJpdmF0ZVBhcmFtcyk7CisgICAgTFZNX0ZMT0FUICAgRGVsdGE9IChMVk1fRkxPQVQpcEluc3RhbmNlLT5EZWx0YTsKKyAgICBMVk1fRkxPQVQgICBDdXJyZW50ID0gKExWTV9GTE9BVClwSW5zdGFuY2UtPkN1cnJlbnQ7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0PSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+VGFyZ2V0OworICAgIExWTV9GTE9BVCAgIFRlbXA7CisKKyAgICAvKgorICAgICAqIFNhbWUgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBvbiBjb25zZWN1dGl2ZSBmcmFtZXMuCisgICAgICogU28gdHdvIGZyYW1lcyBhcmUgcHJvY2Vzc2VkIGluIG9uZSBpdGVyYXRpb24gYW5kCisgICAgICogdGhlIGxvb3Agd2lsbCBydW4gb25seSBmb3IgaGFsZiB0aGUgTnJGcmFtZXMgdmFsdWUgdGltZXMuCisgICAgICovCisgICAgSW5Mb29wID0gKExWTV9JTlQxNikoTnJGcmFtZXMgPj4gMSk7CisgICAgLyogT3V0TG9vcCBpcyBjYWxjdWxhdGVkIHRvIGhhbmRsZSBjYXNlcyB3aGVyZSBOckZyYW1lcyB2YWx1ZSBjYW4gYmUgb2RkLiovCisgICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKE5yRnJhbWVzIC0gKEluTG9vcCA8PCAxKSk7CisKKyAgICBpZiAoQ3VycmVudDxUYXJnZXQpIHsKKyAgICAgICAgaWYgKE91dExvb3ApIHsKKworICAgICAgICAgICAgVGVtcCA9IEN1cnJlbnQgKyBEZWx0YTsKKyAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICBUZW1wID0gMS4wZjsKKyAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICBUZW1wID0gLTEuMGY7CisKKyAgICAgICAgICAgIEN1cnJlbnQ9VGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgICAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9MDsgamotLSkgeworICAgICAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0pIHsKKworICAgICAgICAgICAgVGVtcCA9IEN1cnJlbnQgKyBEZWx0YTsKKworICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgIFRlbXAgPSAxLjBmOworICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgIFRlbXAgPSAtMS4wZjsKKworICAgICAgICAgICAgQ3VycmVudD1UZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9IDAgOyBqai0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIGlmIChPdXRMb29wKSB7CisgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0wOyBqai0tKSB7CisgICAgICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKKyAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPSAwIDsgamotLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudDsKK30KKyNlbmRpZgorCiAjZWxzZQogdm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKCBMVk1peGVyM19zdCAqcHRySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICpzcmMsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhJblNvZnRfRDE2QzMxX1NBVC5jCmluZGV4IDE5MmYxMjYuLjY1OTU2ZjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhJblNvZnRfRDE2QzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhJblNvZnRfRDE2QzMxX1NBVC5jCkBAIC0zNCwxMCArMzQsMTAgQEAKICAgIEZVTkNUSU9OIE1JWElOU09GVF9EMTZDMzFfU0FUCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBMVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIG4pCit2b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBuKQogewogICAgIGNoYXIgICAgICAgIEhhcmRNaXhpbmcgPSBUUlVFOwogICAgIExWTV9GTE9BVCAgIFRhcmdldEdhaW47CkBAIC0xMDYsNiArMTA2LDExMCBAQAogICAgIH0KIAogfQorCisKKworI2lmZGVmIFNVUFBPUlRfTUMKKy8qCisgKiBGVU5DVElPTjogICAgICAgTFZDX01peEluU29mdF9NY19EMTZDMzFfU0FUCisgKgorICogREVTQ1JJUFRJT046CisgKiAgTWl4ZXIgZnVuY3Rpb24gd2l0aCBzdXBwb3J0IGZvciBwcm9jZXNzaW5nIG11bHRpY2hhbm5lbCBpbnB1dAorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgcHRySW5zdGFuY2UgICAgSW5zdGFuY2UgcG9pbnRlcgorICogIHNyYyAgICAgICAgICAgIFNvdXJjZQorICogIGRzdCAgICAgICAgICAgIERlc3RpbmF0aW9uCisgKiAgTnJGcmFtZXMgICAgICAgTnVtYmVyIG9mIGZyYW1lcworICogIE5yQ2hhbm5lbHMgICAgIE51bWJlciBvZiBjaGFubmVscworICoKKyAqIFJFVFVSTlM6CisgKiAgdm9pZAorICoKKyAqLwordm9pZCBMVkNfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJDaGFubmVscykKK3sKKyAgICBjaGFyICAgICAgICBIYXJkTWl4aW5nID0gVFJVRTsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXRHYWluOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOworCisgICAgaWYgKE5yRnJhbWVzIDw9IDApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKHBJbnN0YW5jZS0+Q3VycmVudCAhPSBwSW5zdGFuY2UtPlRhcmdldCkKKyAgICB7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPkRlbHRhID09IDEuMGYpIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOworICAgICAgICB9ZWxzZSBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCisgICAgICAgICAgICBIYXJkTWl4aW5nID0gRkFMU0U7CisgICAgICAgICAgICBMVkNfQ29yZV9NaXhJblNvZnRfTWNfRDE2QzMxX1NBVCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIEhBUkQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChIYXJkTWl4aW5nKSB7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCAhPSAwKSB7IC8qIE5vdGhpbmcgdG8gZG8gaW4gY2FzZSBUYXJnZXQgPSAwICovCisgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+VGFyZ2V0KSA9PSAxLjBmKSB7CisgICAgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQoc3JjLCBkc3QsIE5yRnJhbWVzKk5yQ2hhbm5lbHMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZXsKKyAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQoc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5UYXJnZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzICogTnJDaGFubmVscyk7CisgICAgICAgICAgICAgICAgLyogSW4gY2FzZSB0aGUgTFZDb3JlIGZ1bmN0aW9uIHdvdWxkIGhhdmUgY2hhbmdlZCB0aGUgQ3VycmVudCB2YWx1ZSAqLworICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgQ0FMTCBCQUNLCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQpIHsKKyAgICAgICAgaWYgKEFic19GbG9hdChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKSB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtLCBUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgIT0gMCkgeworICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykgKFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CisjZW5kaWYKKworCiAjZWxzZQogdm9pZCBMVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9zdCAqcHRySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKnNyYywKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVC5jCmluZGV4IGJkNWE5MjUuLmE0NjgyZDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FULmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQuYwpAQCAtMTksNiArMTksOCBAQAogICAgSU5DTFVERSBGSUxFUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKwogI2luY2x1ZGUgIkxWQ19NaXhlcl9Qcml2YXRlLmgiCiAjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgogI2luY2x1ZGUgIlNjYWxhckFyaXRobWV0aWMuaCIKQEAgLTMwLDEwICszMiwyMDcgQEAKICNkZWZpbmUgVFJVRSAgICAgICAgICAxCiAjZGVmaW5lIEZBTFNFICAgICAgICAgMAogCisjZGVmaW5lIEFSUkFZX1NJWkUoYSkgKChzaXplb2YoYSkpIC8gKHNpemVvZigqKGEpKSkpCisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgQlVJTERfRkxPQVQKKyNpZmRlZiBTVVBQT1JUX01DCisvKiBUaGlzIHRocmVzaG9sZCBpcyB1c2VkIHRvIGRlY2lkZSBvbiB0aGUgcHJvY2Vzc2luZyB0byBiZSBhcHBsaWVkIG9uCisgKiBmcm9udCBjZW50ZXIgYW5kIGJhY2sgY2VudGVyIGNoYW5uZWxzCisgKi8KKyNkZWZpbmUgTFZNX1ZPTF9CQUxfVEhSICgwLjAwMDAxNmYpCit2b2lkIExWQ19NaXhTb2Z0XzFTdF9NQ19mbG9hdF9TQVQgKExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgIE5yQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgQ2hNYXNrKQoreworICAgIGNoYXIgICAgICAgIEhhcmRNaXhpbmcgPSBUUlVFOworICAgIExWTV9GTE9BVCAgIFRhcmdldEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgIFRhcmdldF9sZmUgPSB7TFZNX01BWEZMT0FULCBMVk1fTUFYRkxPQVQsIExWTV9NQVhGTE9BVH07CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgIFRhcmdldF9jdHIgPSB7TFZNX01BWEZMT0FULCBMVk1fTUFYRkxPQVQsIExWTV9NQVhGTE9BVH07CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UxID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTIgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLlByaXZhdGVQYXJhbXMpOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcE1peFByaXZJbnN0WzRdID0ge3BJbnN0YW5jZTEsIHBJbnN0YW5jZTIsICZUYXJnZXRfY3RyLCAmVGFyZ2V0X2xmZX07CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2VbTnJDaGFubmVsc107CisKKyAgICBpZiAoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9yZXByZXNlbnRhdGlvbihDaE1hc2spCisgICAgICAgICAgICA9PSBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX0lOREVYKQorICAgIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZVtpXSA9IHBNaXhQcml2SW5zdFtpXTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMjsgaSA8IE5yQ2hhbm5lbHM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcEluc3RhbmNlW2ldID0gcE1peFByaXZJbnN0WzJdOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8vIFRPRE86IENvbWJpbmUgd2l0aCBzeXN0ZW0vbWVkaWEvYXVkaW9fdXRpbHMvQmFsYW5jZS5jcHAKKyAgICAgICAgLy8gQ29uc3RhbnRzIGluIHN5c3RlbS9tZWRpYS9hdWRpby9pbmNsdWRlL3N5c3RlbS9hdWRpby1iYXNlLmgKKyAgICAgICAgLy8gJ21peEluc3RJZHgnIGlzIHVzZWQgdG8gbWFwIHRoZSBhcHByb3ByaWF0ZSBtaXhlciBpbnN0YW5jZSBmb3IgZWFjaCBjaGFubmVsLgorICAgICAgICBjb25zdCBpbnQgbWl4SW5zdElkeFtdID0geworICAgICAgICAgICAgMCwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfTEVGVCAgICAgICAgICAgID0gMHgxdSwKKyAgICAgICAgICAgIDEsIC8vIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX1JJR0hUICAgICAgICAgICA9IDB4MnUsCisgICAgICAgICAgICAyLCAvLyBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9DRU5URVIgICAgICAgICAgPSAweDR1LAorICAgICAgICAgICAgMywgLy8gQVVESU9fQ0hBTk5FTF9PVVRfTE9XX0ZSRVFVRU5DWSAgICAgICAgID0gMHg4dSwKKyAgICAgICAgICAgIDAsIC8vIEFVRElPX0NIQU5ORUxfT1VUX0JBQ0tfTEVGVCAgICAgICAgICAgICA9IDB4MTB1LAorICAgICAgICAgICAgMSwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19SSUdIVCAgICAgICAgICAgID0gMHgyMHUsCisgICAgICAgICAgICAwLCAvLyBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUX09GX0NFTlRFUiAgPSAweDQwdSwKKyAgICAgICAgICAgIDEsIC8vIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX1JJR0hUX09GX0NFTlRFUiA9IDB4ODB1LAorICAgICAgICAgICAgMiwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19DRU5URVIgICAgICAgICAgID0gMHgxMDB1LAorICAgICAgICAgICAgMCwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfU0lERV9MRUZUICAgICAgICAgICAgID0gMHgyMDB1LAorICAgICAgICAgICAgMSwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfU0lERV9SSUdIVCAgICAgICAgICAgID0gMHg0MDB1LAorICAgICAgICAgICAgMiwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0NFTlRFUiAgICAgICAgICAgID0gMHg4MDB1LAorICAgICAgICAgICAgMCwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0ZST05UX0xFRlQgICAgICAgID0gMHgxMDAwdSwKKyAgICAgICAgICAgIDIsIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9GUk9OVF9DRU5URVIgICAgICA9IDB4MjAwMHUsCisgICAgICAgICAgICAxLCAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfRlJPTlRfUklHSFQgICAgICAgPSAweDQwMDB1LAorICAgICAgICAgICAgMCwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfTEVGVCAgICAgICAgID0gMHg4MDAwdSwKKyAgICAgICAgICAgIDIsIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX0NFTlRFUiAgICAgICA9IDB4MTAwMDB1LAorICAgICAgICAgICAgMSwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfUklHSFQgICAgICAgID0gMHgyMDAwMHUsCisgICAgICAgICAgICAwLCAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfU0lERV9MRUZUICAgICAgICAgPSAweDQwMDAwdSwKKyAgICAgICAgICAgIDEsIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9TSURFX1JJR0hUICAgICAgICA9IDB4ODAwMDB1CisgICAgICAgIH07CisgICAgICAgIGlmIChwSW5zdGFuY2UxLT5UYXJnZXQgPD0gTFZNX1ZPTF9CQUxfVEhSIHx8CisgICAgICAgICAgICBwSW5zdGFuY2UyLT5UYXJnZXQgPD0gTFZNX1ZPTF9CQUxfVEhSKQorICAgICAgICB7CisgICAgICAgICAgICBUYXJnZXRfY3RyLlRhcmdldCAgPSAwLjBmOworICAgICAgICAgICAgVGFyZ2V0X2N0ci5DdXJyZW50ID0gMC4wZjsKKyAgICAgICAgICAgIFRhcmdldF9jdHIuRGVsdGEgICA9IDAuMGY7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IGlkeEFyclNpemUgPSBBUlJBWV9TSVpFKG1peEluc3RJZHgpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgY2hhbm5lbCA9IENoTWFzazsgY2hhbm5lbCAhPTAgOyArK2kpCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBpZHggPSBfX2J1aWx0aW5fY3R6KGNoYW5uZWwpOworICAgICAgICAgICAgaWYgKGlkeCA8IGlkeEFyclNpemUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEluc3RhbmNlW2ldID0gcE1peFByaXZJbnN0W21peEluc3RJZHhbaWR4XV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEluc3RhbmNlW2ldID0gcE1peFByaXZJbnN0WzJdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hhbm5lbCAmPSB+KDEgPDwgaWR4KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChOckZyYW1lcyA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKChwSW5zdGFuY2UxLT5DdXJyZW50ICE9IHBJbnN0YW5jZTEtPlRhcmdldCkgfHwKKyAgICAgICAgKHBJbnN0YW5jZTItPkN1cnJlbnQgIT0gcEluc3RhbmNlMi0+VGFyZ2V0KSkKKyAgICB7CisgICAgICAgIC8vIFRPRE86IGNvbWJpbmUgc2ltaWxhciBjaGVja3MgYmVsb3cuCisgICAgICAgIGlmIChwSW5zdGFuY2UxLT5EZWx0YSA9PSBMVk1fTUFYRkxPQVQKKyAgICAgICAgICAgICAgICB8fCBBYnNfRmxvYXQocEluc3RhbmNlMS0+Q3VycmVudCAtIHBJbnN0YW5jZTEtPlRhcmdldCkgPCBwSW5zdGFuY2UxLT5EZWx0YSkKKyAgICAgICAgeworICAgICAgICAgICAgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgcEluc3RhbmNlMS0+Q3VycmVudCA9IHBJbnN0YW5jZTEtPlRhcmdldDsKKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UxLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKEhhcmRNaXhpbmcgPT0gVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBJbnN0YW5jZTItPkRlbHRhID09IExWTV9NQVhGTE9BVAorICAgICAgICAgICAgICAgICAgICB8fCBBYnNfRmxvYXQocEluc3RhbmNlMi0+Q3VycmVudCAtIHBJbnN0YW5jZTItPlRhcmdldCkgPCBwSW5zdGFuY2UyLT5EZWx0YSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICAgICAgcEluc3RhbmNlMi0+Q3VycmVudCA9IHBJbnN0YW5jZTItPlRhcmdldDsKKyAgICAgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMi0+VGFyZ2V0OworICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChIYXJkTWl4aW5nID09IEZBTFNFKQorICAgICAgICB7CisgICAgICAgICAgICAgTFZDX0NvcmVfTWl4U29mdF8xU3RfTUNfZmxvYXRfV1JBICgmcEluc3RhbmNlWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywgZHN0LCBOckZyYW1lcywgTnJDaGFubmVscyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgSEFSRCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKEhhcmRNaXhpbmcgPT0gVFJVRSkKKyAgICB7CisgICAgICAgIGlmICgocEluc3RhbmNlMS0+VGFyZ2V0ID09IExWTV9NQVhGTE9BVCkgJiYgKHBJbnN0YW5jZTItPlRhcmdldCA9PSBMVk1fTUFYRkxPQVQpKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3JjICE9IGRzdCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb3B5X0Zsb2F0KHNyYywgZHN0LCBOckZyYW1lcypOckNoYW5uZWxzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIExWQ19Db3JlX01peEhhcmRfMVN0X01DX2Zsb2F0X1NBVCgmKHBJbnN0YW5jZVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywgZHN0LCBOckZyYW1lcywgTnJDaGFubmVscyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgQ0FMTCBCQUNLCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQpCisgICAgeworICAgICAgICBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZTEtPkN1cnJlbnQgLSBwSW5zdGFuY2UxLT5UYXJnZXQpIDwgcEluc3RhbmNlMS0+RGVsdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZTEtPkN1cnJlbnQgPSBwSW5zdGFuY2UxLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UxLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sIFRhcmdldEdhaW4pOworICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykgKFwKKyAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQpCisgICAgeworICAgICAgICBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZTItPkN1cnJlbnQgLSBwSW5zdGFuY2UyLT5UYXJnZXQpIDwgcEluc3RhbmNlMi0+RGVsdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZTItPkN1cnJlbnQgPSBwSW5zdGFuY2UyLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMi0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLCBUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2sgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2spIChcCisgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbGJhY2tIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1BhcmFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZgogdm9pZCBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpkc3QsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQuYwppbmRleCAxMDE3ZGUzLi4wNjc4YWUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmMKQEAgLTEwMyw2ICsxMDMsMTAxIEBACiAgICAgICAgIH0KICAgICB9CiB9CisjaWZkZWYgU1VQUE9SVF9NQworLyoKKyAqIEZVTkNUSU9OOiAgICAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUCisgKgorICogREVTQ1JJUFRJT046CisgKiAgTWl4ZXIgZnVuY3Rpb24gd2l0aCBzdXBwb3J0IGZvciBwcm9jZXNzaW5nIG11bHRpY2hhbm5lbCBpbnB1dAorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgcHRySW5zdGFuY2UgICAgSW5zdGFuY2UgcG9pbnRlcgorICogIHNyYyAgICAgICAgICAgIFNvdXJjZQorICogIGRzdCAgICAgICAgICAgIERlc3RpbmF0aW9uCisgKiAgTnJGcmFtZXMgICAgICAgTnVtYmVyIG9mIEZyYW1lcworICogIE5yQ2hhbm5lbHMgICAgIE51bWJlciBvZiBjaGFubmVscworICoKKyAqIFJFVFVSTlM6CisgKiAgdm9pZAorICoKKyAqLwordm9pZCBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgIE5yQ2hhbm5lbHMpCit7CisgICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKworICAgIGlmIChOckZyYW1lcyA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCisgICAgeworICAgICAgICBpZiAocEluc3RhbmNlLT5EZWx0YSA9PSAxLjBmKSB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2UgaWYgKEFic19GbG9hdChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKSB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICAgICAgTFZDX0NvcmVfTWl4U29mdF9NY19EMTZDMzFfV1JBKCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIEhBUkQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChIYXJkTWl4aW5nKSB7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCA9PSAwKQorICAgICAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAuMCwgZHN0LCBOckZyYW1lcyAqIE5yQ2hhbm5lbHMpOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5UYXJnZXQpICE9IDEuMGYpCisgICAgICAgICAgICAgICAgTXVsdDNzX0Zsb2F0KHNyYywgKHBJbnN0YW5jZS0+VGFyZ2V0KSwgZHN0LCBOckZyYW1lcyAqIE5yQ2hhbm5lbHMpOworICAgICAgICAgICAgZWxzZSBpZiAoc3JjICE9IGRzdCkKKyAgICAgICAgICAgICAgICBDb3B5X0Zsb2F0KHNyYywgZHN0LCBOckZyYW1lcyAqIE5yQ2hhbm5lbHMpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgQ0FMTCBCQUNLCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQpIHsKKyAgICAgICAgaWYgKEFic19GbG9hdChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKSB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtLCBUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgIT0gMCkgeworICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykgKFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisjZW5kaWYKKwogI2Vsc2UKIHZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9zdCAqcHRySW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgICpzcmMsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYwppbmRleCAzYzkwMDcxLi44YTg5ZGUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMKQEAgLTI2LDExICsyNiwxMSBAQAogICAgRlVOQ1RJT04gTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9GTE9BVCAgICAgICAqc3JjMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqc3JjMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIG4pCit2b2lkIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIG4pCiB7CiAgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UxID0gXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOwpAQCAtNjcsNiArNjcsNzAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSwgc3JjMiwgZHN0LCBuKTsKICAgICB9CiB9CisKKyNpZmRlZiBTVVBQT1JUX01DCisvKgorICogRlVOQ1RJT046ICAgICAgIExWQ19NaXhTb2Z0XzJNY19EMTZDMzFfU0FUCisgKgorICogREVTQ1JJUFRJT046CisgKiAgMiBzdHJlYW0gTWl4ZXIgZnVuY3Rpb24gd2l0aCBzdXBwb3J0IGZvciBwcm9jZXNzaW5nIG11bHRpY2hhbm5lbCBpbnB1dAorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgcHRySW5zdGFuY2UgICAgSW5zdGFuY2UgcG9pbnRlcgorICogIHNyYzEgICAgICAgICAgIEZpcnN0IG11bHRpY2hhbm5lbCBzb3VyY2UKKyAqICBzcmMyICAgICAgICAgICBTZWNvbmQgbXVsdGljaGFubmVsIHNvdXJjZQorICogIGRzdCAgICAgICAgICAgIERlc3RpbmF0aW9uCisgKiAgTnJGcmFtZXMgICAgICAgTnVtYmVyIG9mIGZyYW1lcworICogIE5yQ2hhbm5lbHMgICAgIE51bWJlciBvZiBjaGFubmVscworICoKKyAqIFJFVFVSTlM6CisgKiAgdm9pZAorICoKKyAqLwordm9pZCBMVkNfTWl4U29mdF8yTWNfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yQ2hhbm5lbHMpCit7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UxID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMiA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5Qcml2YXRlUGFyYW1zKTsKKworICAgIGlmIChOckZyYW1lcyA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCA9PSBwSW5zdGFuY2UxLT5UYXJnZXQpICYmIChwSW5zdGFuY2UxLT5DdXJyZW50ID09IDApKSB7CisgICAgICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzIsIGRzdCwgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOworICAgIH0KKyAgICBlbHNlIGlmICgocEluc3RhbmNlMi0+Q3VycmVudCA9PSBwSW5zdGFuY2UyLT5UYXJnZXQpICYmIChwSW5zdGFuY2UyLT5DdXJyZW50ID09IDApKSB7CisgICAgICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIGRzdCwgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOworICAgIH0KKyAgICBlbHNlIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCAhPSBwSW5zdGFuY2UxLT5UYXJnZXQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UyLT5DdXJyZW50ICE9IHBJbnN0YW5jZTItPlRhcmdldCkpCisgICAgeworICAgICAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIGRzdCwgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOworICAgICAgICBMVkNfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMiwgZHN0LCBOckZyYW1lcywgTnJDaGFubmVscyk7CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgSEFSRCBNSVhJTkcKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSwgc3JjMiwgZHN0LCBOckZyYW1lcyAqIE5yQ2hhbm5lbHMpOworICAgIH0KK30KKyNlbmRpZgorCiAjZWxzZQogdm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X3N0ICpwdHJJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0lOVDE2ICAgICAgICpzcmMxLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXIuaAppbmRleCBmOTA0OTE1Li4xOTlkNTI5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXIuaApAQCAtMTU3LDEwICsxNTcsMTggQEAKIC8qKiogMTYgYml0IGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAjaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBuKTsKK3ZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIG4pOworI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yQ2hhbm5lbHMpOworI2VuZGlmCisKICNlbHNlCiB2b2lkIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3Rfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAgICpzcmMsCkBAIC0xNjksMTAgKzE3NywxOCBAQAogI2VuZGlmCiAKICNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBMVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBuKTsKK3ZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBuKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIExWQ19NaXhJblNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJDaGFubmVscyk7CisjZW5kaWYKKwogI2Vsc2UKIHZvaWQgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM18xU3Rfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICpzcmMsCkBAIC0xODEsMTEgKzE5NywxOSBAQAogI2VuZGlmCiAKICNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAgKnNyYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnNyYzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwgIC8qIGRzdCBjYW5ub3QgYmUgZXF1YWwgdG8gc3JjMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIG4pOwordm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LCAgLyogZHN0IGNhbm5vdCBiZSBlcXVhbCB0byBzcmMyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIExWQ19NaXhTb2Z0XzJNY19EMTZDMzFfU0FUKExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpkc3QsICAvKiBkc3QgY2Fubm90IGJlIGVxdWFsIHRvIHNyYzIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgTnJDaGFubmVscyk7CisjZW5kaWYKICNlbHNlCiB2b2lkIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3Rfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgICpzcmMxLApAQCAtMjAwLDEwICsyMjQsMTggQEAKIC8qIEdhaW4gdmFsdWVzIHNob3VsZCBub3QgYmUgbW9yZSB0aGF0IDEuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9GTE9BVCAgICAgICAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKmRzdCwgICAvKiBkc3QgY2FuIGJlIGVxdWFsIHRvIHNyYyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBuKTsgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLworI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgTFZDX01peFNvZnRfMVN0X01DX2Zsb2F0X1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LCAgIC8qIGRzdCBjYW4gYmUgZXF1YWwgdG8gc3JjICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgIE5yQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICBDaE1hc2spOworI2VuZGlmCit2b2lkIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUKExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpkc3QsICAgLyogZHN0IGNhbiBiZSBlcXVhbCB0byBzcmMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIG4pOyAgICAgLyogTnVtYmVyIG9mIHN0ZXJlbyBzYW1wbGVzICovCiAjZWxzZQogdm9pZCBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X3N0ICAgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fSU5UMTYgICAgICAgICAgICpzcmMsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0VGFyZ2V0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0VGFyZ2V0LmMKaW5kZXggYzY3NDU1YS4uNTA3ZWVmYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRUYXJnZXQuYwpAQCAtMzUsNyArMzUsNyBAQAogewogICAgIExWTV9GTE9BVCAgICAgICBUYXJnZXRHYWluOwogICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKLSAgICAKKwogICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsgIC8vIFRhcmdldEdhaW4KICAgICByZXR1cm4gVGFyZ2V0R2FpbjsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfUHJpdmF0ZS5oCmluZGV4IGQwZDBlMWYuLjQ1M2E2YTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ByaXZhdGUuaApAQCAtNjIsNiArNjIsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBOckNoYW5uZWxzKTsKKyNlbmRpZgogI2Vsc2UKIHZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX3N0ICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICpzcmMsCkBAIC03Myw2ICs4MCwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIExWQ19Db3JlX01peFNvZnRfTWNfRDE2QzMxX1dSQShMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBOckNoYW5uZWxzKTsKKyNlbmRpZgogI2Vsc2UKIHZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQSggTFZNaXhlcjNfc3QgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYywKQEAgLTEwMiw2ICsxMTYsMTMgQEAKIC8qIEdhaW4gdmFsdWVzIHNob3VsZCBub3QgYmUgbW9yZSB0aGF0IDEuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgQlVJTERfRkxPQVQKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X01DX2Zsb2F0X1dSQShNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgTnJDaGFubmVscyk7CisjZW5kaWYKIHZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQSggTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICpwdHJJbnN0YW5jZTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgKnNyYywKQEAgLTEyMiw2ICsxNDMsMTMgQEAKIC8qIEdhaW4gdmFsdWVzIHNob3VsZCBub3QgYmUgbW9yZSB0aGF0IDEuMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaWZkZWYgQlVJTERfRkxPQVQKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIExWQ19Db3JlX01peEhhcmRfMVN0X01DX2Zsb2F0X1NBVChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgTnJDaGFubmVscyk7CisjZW5kaWYKIHZvaWQgTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVCggTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICpwdHJJbnN0YW5jZTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgKnNyYywKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQuYwppbmRleCA0OGY1ZDU0Li45ZDNlZTg4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRpbWVDb25zdGFudC5jCkBAIC01MSw3ICs1MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscykKIHsKICNpZmRlZiBISUdIRVJfRlMKLSAgICBMVk1fRkxPQVQgICBEZWx0YVRhYmxlWzExXSA9IHswLjUwMDAwMGYsLyo4MDAwKi8KKyAgICBMVk1fRkxPQVQgICBEZWx0YVRhYmxlWzEzXSA9IHswLjUwMDAwMGYsLyo4MDAwKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM2MjgxMmYsLyoxMTAyNSovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMzMzMzNmLC8qMTIwMDAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjUwMDAwZiwvKjE2MDAwKi8KQEAgLTYwLDcgKzYwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEyNTAwMGYsLyozMjAwMCovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wOTA3MDNmLC8qNDQxMDAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDgzMzMzZiwvKjQ4MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA0NTM1MmYsLyo4ODIwMCovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNDE2NjdmLC8qOTYwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDIyNjc2ZiwvKjE3NjQwMCovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMjA4MzNmfTsvKjE5MjAwMCovCiAjZWxzZQogICAgIExWTV9GTE9BVCAgIERlbHRhVGFibGVbOV0gPSB7MC41MDAwMDBmLC8qODAwMCovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmMKaW5kZXggOWRjN2QyMS4uMGUwYWNmMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQuYwpAQCAtNTIsNyArNTIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIE51bUNoYW5uZWxzKQogewogI2lmZGVmIEhJR0hFUl9GUwotICAgICBMVk1fRkxPQVQgICBEZWx0YVRhYmxlWzExXSA9IHswLjUwMDAwMGYsLyo4MDAwKi8KKyAgICAgTFZNX0ZMT0FUICAgRGVsdGFUYWJsZVsxM10gPSB7MC41MDAwMDBmLC8qODAwMCovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzYyODEyZiwvKjExMDI1Ki8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMzMzMzNmLC8qMTIwMDAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1MDAwMGYsLyoxNjAwMCovCkBAIC02MSw3ICs2MSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTI1MDAwZiwvKjMyMDAwKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wOTA3MDNmLC8qNDQxMDAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4MzMzM2YsLyo0ODAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDQ1MzUyZiwvKjg4MjAwKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNDE2NjZmLC8qOTYwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAyMjY3NmYsLyoxNzY0MDAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAyMDgzM2Z9Oy8qMTkyMDAwKi8KICNlbHNlCiAgICAgTFZNX0ZMT0FUICAgRGVsdGFUYWJsZVs5XSA9IHswLjUwMDAwMGYsLyo4MDAwKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9HZXRPbWVnYS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0dldE9tZWdhLmMKaW5kZXggNzg0NmNhMC4uNjMwN2U2OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0dldE9tZWdhLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0dldE9tZWdhLmMKQEAgLTUzLDcgKzUzLDkgQEAKICNkZWZpbmUgTFZWRExfMlBpQnlfNDgwMDBfZiAgICAgICAwLjAwMDEzMDkwMGYKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBMVlZETF8yUGlCeV84ODIwMF9mICAgICAgIDAuMDAwMDcxMjM4ZgogI2RlZmluZSBMVlZETF8yUGlCeV85NjAwMF9mICAgICAgIDAuMDAwMDY1NDUwZgorI2RlZmluZSBMVlZETF8yUGlCeV8xNzY0MDBfZiAgICAgIDAuMDAwMDM1NjE5ZgogI2RlZmluZSBMVlZETF8yUGlCeV8xOTIwMDBfZiAgICAgIDAuMDAwMDMyNzI1ZgogI2VuZGlmCiBjb25zdCBMVk1fRkxPQVQgICAgIExWVkRMXzJQaU9uRnNUYWJsZVtdID0gIHtMVlZETF8yUGlCeV84MDAwX2YsCkBAIC02Niw3ICs2OCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV80NDEwMF9mLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfNDgwMDBfZgogI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsTFZWRExfMlBpQnlfODgyMDBfZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsTFZWRExfMlBpQnlfOTYwMDBfZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsTFZWRExfMlBpQnlfMTc2NDAwX2YKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWVkRMXzJQaUJ5XzE5MjAwMF9mCiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWFjM3NfU2F0XzMyeDE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NYWMzc19TYXRfMzJ4MTYuYwppbmRleCBlM2ZiNDBkLi4xN2ZkODMzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NYWMzc19TYXRfMzJ4MTYuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NYWMzc19TYXRfMzJ4MTYuYwpAQCAtNTAsMTEgKzUwLDExIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIGlmKHRlbXA8MCkKICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkT3V0VmFsPTB4ODAwMDAwMDBsOworICAgICAgICAgICAgICAgIGRPdXRWYWw9MHg4MDAwMDAwMEw7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZE91dFZhbD0weDdGRkZGRkZGbDsKKyAgICAgICAgICAgICAgICBkT3V0VmFsPTB4N0ZGRkZGRkZMOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMS5jCmluZGV4IDljMTdhMDUuLjZjOGIyZGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEuYwpAQCAtMTE5LDYgKzExOSw4MCBAQAogICAgICAgICB9CiAKICAgICB9CisKKyNpZmRlZiBTVVBQT1JUX01DCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0RFTEFZUy0KK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSB0bworcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgLSAxXSBpcyB4KG4tMSkgZm9yIGFsbCBOckNoYW5uZWxzCisKK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzXSB0bworcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzIqTnJDaGFubmVscyAtIDFdIGlzIHgobi0yKSBmb3IgYWxsIE5yQ2hhbm5lbHMKKworcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzIqTnJDaGFubmVsc10gdG8KK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1szKk5yQ2hhbm5lbHMgLSAxXSBpcyB5KG4tMSkgZm9yIGFsbCBOckNoYW5uZWxzCisKK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1szKk5yQ2hhbm5lbHNdIHRvCitwQmlxdWFkU3RhdGUtPnBEZWxheXNbNCpOckNoYW5uZWxzIC0gMV0gaXMgeShuLTIpIGZvciBhbGwgTnJDaGFubmVscworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIFBLX01jX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxIChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgeW4sIHluTywgdGVtcDsKKyAgICAgICAgTFZNX0lOVDE2IGlpLCBqajsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GbG9hdCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GbG9hdCkgcEluc3RhbmNlOworCisgICAgICAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKyAgICAgICAgICAgIGZvciAoamogPSAwOyBqaiA8IE5yQ2hhbm5lbHM7IGpqKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIGpqIENIQU5ORUwKKyAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgLyogeW49IChBMCAgKiAoeChuKSAtIHgobi0yKSkpKi8KKyAgICAgICAgICAgICAgICB0ZW1wID0gKCpwRGF0YUluKSAtIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICsgampdOworICAgICAgICAgICAgICAgIHluID0gdGVtcCAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF07CisKKyAgICAgICAgICAgICAgICAvKiB5bis9ICgoLUIyICAqIHkobi0yKSkpICovCisgICAgICAgICAgICAgICAgdGVtcCA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzKjMgKyBqal0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdOworICAgICAgICAgICAgICAgIHluICs9IHRlbXA7CisKKyAgICAgICAgICAgICAgICAvKiB5bis9ICgoLUIxICogeShuLTEpKSkgKi8KKyAgICAgICAgICAgICAgICB0ZW1wID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMqMiArIGpqXSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl07CisgICAgICAgICAgICAgICAgeW4gKz0gdGVtcDsKKworICAgICAgICAgICAgICAgIC8qIHluTz0gKChHYWluICogeW4pKSAqLworICAgICAgICAgICAgICAgIHluTyA9IHluICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKKworICAgICAgICAgICAgICAgIC8qIHluTz0oeW5PICsgeChuKSkqLworICAgICAgICAgICAgICAgIHluTyArPSAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAzICsgampdID0KKyAgICAgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAyICsgampdOyAvKiB5KG4tMik9eShuLTEpKi8KKyAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDEgKyBqal0gPQorICAgICAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbampdOyAvKiB4KG4tMik9eChuLTEpKi8KKyAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDIgKyBqal0gPSB5bjsgLyogVXBkYXRlIHkobi0xKSAqLworICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpKi8KKyAgICAgICAgICAgICAgICBwRGF0YUluKys7CisKKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgICpwRGF0YU91dCA9IHluTzsgLyogV3JpdGUgb3V0cHV0Ki8KKyAgICAgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICB9CisjZW5kaWYKICNlbHNlCiB2b2lkIFBLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFJbiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9saWIvTFZFUU5CLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvbGliL0xWRVFOQi5oCmluZGV4IDhlMGI3MzguLjgwNGYxYmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9saWIvTFZFUU5CLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYi9MVkVRTkIuaApAQCAtMTg0LDYgKzE4NCw5IEBACiB7CiAgICAgTFZFUU5CX1NURVJFTyAgICAgICA9IDAsCiAgICAgTFZFUU5CX01PTk9JTlNURVJFTyA9IDEsCisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWRVFOQl9NVUxUSUNIQU5ORUwgPSAyLAorI2VuZGlmCiAgICAgTFZFUU5CX1NPVVJDRV9NQVggICA9IExWTV9NQVhJTlRfMzIKIH0gTFZFUU5CX1NvdXJjZUZvcm1hdF9lbjsKIApAQCAtMjAxLDggKzIwNCwxMCBAQAogI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzQ0MTAwICAgICAgICAgICAgICAgIDEyOAogI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzQ4MDAwICAgICAgICAgICAgICAgIDI1NgogI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQotI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzk2MDAwICAgICAgICAgICAgICAgIDUxMgotI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzE5MjAwMCAgICAgICAgICAgICAgIDEwMjQKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU184ODIwMCAgICAgICAgICAgICAgICA1MTIKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU185NjAwMCAgICAgICAgICAgICAgICAxMDI0CisjZGVmaW5lIExWRVFOQl9DQVBfRlNfMTc2NDAwICAgICAgICAgICAgICAgMjA0OAorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzE5MjAwMCAgICAgICAgICAgICAgIDQwOTYKICNlbmRpZgogCiB0eXBlZGVmIGVudW0KQEAgLTIxNyw4ICsyMjIsMTAgQEAKICAgICBMVkVRTkJfRlNfNDQxMDAgPSA3LAogICAgIExWRVFOQl9GU180ODAwMCA9IDgsCiAjaWZkZWYgSElHSEVSX0ZTCi0gICAgTFZFUU5CX0ZTXzk2MDAwID0gOSwKLSAgICBMVkVRTkJfRlNfMTkyMDAwID0gMTAsCisgICAgTFZFUU5CX0ZTXzg4MjAwID0gOSwKKyAgICBMVkVRTkJfRlNfOTYwMDAgPSAxMCwKKyAgICBMVkVRTkJfRlNfMTc2NDAwID0gMTEsCisgICAgTFZFUU5CX0ZTXzE5MjAwMCA9IDEyLAogI2VuZGlmCiAgICAgTFZFUU5CX0ZTX01BWCAgID0gTFZNX01BWElOVF8zMgogfSBMVkVRTkJfRnNfZW47CkBAIC0yNjcsNyArMjc0LDkgQEAKICAgICAvKiBFcXVhbGlzZXIgcGFyYW1ldGVycyAqLwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBOQmFuZHM7ICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYmFuZHMgKi8KICAgICBMVkVRTkJfQmFuZERlZl90ICAgICAgICAgICAgKnBCYW5kRGVmaW5pdGlvbjsgICAgICAgLyogUG9pbnRlciB0byBlcXVhbGlzZXIgZGVmaW5pdGlvbnMgKi8KLQorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgTnJDaGFubmVsczsKKyNlbmRpZgogfSBMVkVRTkJfUGFyYW1zX3Q7CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaAppbmRleCA0MmVhNDZmLi43NTUxNDFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaApAQCAtMTA5LDcgKzEwOSw5IEBACiAjZGVmaW5lIExWRVFOQl8yUGlPbl80ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDEzMWYKIAogI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBMVkVRTkJfMlBpT25fODgyMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwNzFmCiAjZGVmaW5lIExWRVFOQl8yUGlPbl85NjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDA2NWYKKyNkZWZpbmUgTFZFUU5CXzJQaU9uXzE3NjQwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDM2ZgogI2RlZmluZSBMVkVRTkJfMlBpT25fMTkyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMzNmCiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJpdmF0ZS5oCmluZGV4IDU2YjAyZTAuLmE5Y2Q1ZmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcml2YXRlLmgKQEAgLTQ2LDcgKzQ2LDEyIEBACiAjZGVmaW5lIExWRVFOQl9JTlNUQU5DRV9BTElHTiAgICAgICA0ICAgICAgICAgICAgICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGluc3RhbmNlIHN0cnVjdHVyZXMgKi8KICNkZWZpbmUgTFZFUU5CX0RBVEFfQUxJR04gICAgICAgICAgIDQgICAgICAgICAgICAgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3Igc3RydWN0dXJlcyAqLwogI2RlZmluZSBMVkVRTkJfQ09FRl9BTElHTiAgICAgICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBsb25nIHdvcmRzICovCisjaWZkZWYgU1VQUE9SVF9NQworLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLworI2RlZmluZSBMVkVRTkJfU0NSQVRDSEJVRkZFUlMgICAgICAgKExWTV9NQVhfQ0hBTk5FTFMgKiAyKQorI2Vsc2UKICNkZWZpbmUgTFZFUU5CX1NDUkFUQ0hCVUZGRVJTICAgICAgIDQgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLworI2VuZGlmCiAjZGVmaW5lIExWRVFOQl9TQ1JBVENIX0FMSUdOICAgICAgICA0ICAgICAgICAgICAgICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGxvbmcgZGF0YSAqLwogCiAjZGVmaW5lIExWRVFOQl9CWVBBU1NfTUlYRVJfVEMgICAgICAxMDAgICAgICAgICAgICAgICAgIC8qIEJ5cGFzcyBNaXhlciBUQyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jCmluZGV4IDYzMjgxODEuLmQxODhjMGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1Byb2Nlc3MuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCiAjaW5jbHVkZSAiQklRVUFELmgiCiAKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02MSwxNCArNjIsMTggQEAKIExWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1Byb2Nlc3MoTFZFUU5CX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcykKLXsKLQotICAgIExWTV9VSU5UMTYgICAgICAgICAgaTsKLSAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICpwQmlxdWFkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fVUlOVDE2ICAgICAgTnJGcmFtZXMpCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZWQgdG8gdXNlIHNhbXBsZXMgPSBmcmFtZXMgKiBjaGFubmVscy4KICAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UgPSAoTFZFUU5CX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBTY3JhdGNoOwogCisjaWZkZWYgU1VQUE9SVF9NQworICAgIC8vIE1vbm8gcGFzc2VkIGluIGFzIHN0ZXJlbworICAgIGNvbnN0IExWTV9JTlQzMiBOckNoYW5uZWxzID0gcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVscyA9PSAxCisgICAgICAgID8gMiA6IHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHM7CisjZWxzZQorICAgIGNvbnN0IExWTV9JTlQzMiBOckNoYW5uZWxzID0gMjsgLy8gRkNDXzIKKyNlbmRpZgorICAgIGNvbnN0IExWTV9JTlQzMiBOclNhbXBsZXMgPSBOckNoYW5uZWxzICogTnJGcmFtZXM7CiAKICAgICAgLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgKi8KICAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEluRGF0YSA9PSBMVk1fTlVMTCkgfHwgKHBPdXREYXRhID09IExWTV9OVUxMKSkKQEAgLTgyLDE0ICs4NywxNCBAQAogICAgICAgICByZXR1cm4gTFZFUU5CX0FMSUdOTUVOVEVSUk9SOwogICAgIH0KIAotICAgIHBTY3JhdGNoICA9IChMVk1fRkxPQVQgKilwSW5zdGFuY2UtPnBGYXN0VGVtcG9yYXJ5OworICAgIExWTV9GTE9BVCAqIGNvbnN0IHBTY3JhdGNoID0gKExWTV9GTE9BVCAqKXBJbnN0YW5jZS0+cEZhc3RUZW1wb3Jhcnk7CiAKICAgICAvKgotICAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vdCB0b28gbGFyZ2UKKyAgICAqIENoZWNrIHRoZSBudW1iZXIgb2YgZnJhbWVzIGlzIG5vdCB0b28gbGFyZ2UKICAgICAqLwotICAgIGlmIChOdW1TYW1wbGVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKQorICAgIGlmIChOckZyYW1lcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkKICAgICB7Ci0gICAgICAgIHJldHVybihMVkVRTkJfVE9PTUFOWVNBTVBMRVMpOworICAgICAgICByZXR1cm4gTFZFUU5CX1RPT01BTllTQU1QTEVTOwogICAgIH0KIAogICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWRVFOQl9PTikKQEAgLTk3LDE2ICsxMDIsMTYgQEAKICAgICAgICAgLyoKICAgICAgICAgICogQ29weSBpbnB1dCBkYXRhIGluIHRvIHNjcmF0Y2ggYnVmZmVyCiAgICAgICAgICAqLworICAgICAgICBDb3B5X0Zsb2F0KHBJbkRhdGEsICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7CiAKLSAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7IC8qIExlZnQgYW5kIFJpZ2h0ICovCiAgICAgICAgIC8qCiAgICAgICAgICAqIEZvciBlYWNoIHNlY3Rpb24gZXhlY3RlIHRoZSBmaWx0ZXIgdW5sZXNzIHRoZSBnYWluIGlzIDBkQgogICAgICAgICAgKi8KICAgICAgICAgaWYgKHBJbnN0YW5jZS0+TkJhbmRzICE9IDApCiAgICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwSW5zdGFuY2UtPk5CYW5kczsgaSsrKQorICAgICAgICAgICAgZm9yIChMVk1fVUlOVDE2IGkgPSAwOyBpIDwgcEluc3RhbmNlLT5OQmFuZHM7IGkrKykKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAqIENoZWNrIGlmIGJhbmQgaXMgbm9uLXplcm8gZEIgZ2FpbgpAQCAtMTE2LDcgKzEyMSw3IEBACiAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAqIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgYmlxdWFkIGluc3RhbmNlCiAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBwQmlxdWFkID0gJnBJbnN0YW5jZS0+cEVRTkJfRmlsdGVyU3RhdGVfRmxvYXRbaV07CisgICAgICAgICAgICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICpwQmlxdWFkID0gJnBJbnN0YW5jZS0+cEVRTkJfRmlsdGVyU3RhdGVfRmxvYXRbaV07CiAKIAogICAgICAgICAgICAgICAgICAgICAvKgpAQCAtMTI2LDEwICsxMzEsMTggQEAKICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMVkVRTkJfU2luZ2xlUHJlY2lzaW9uX0Zsb2F0OgogICAgICAgICAgICAgICAgICAgICAgICAgeworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19NY19EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMShwQmlxdWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKKyNlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEocEJpcXVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcyk7CisjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CkBAIC0xNDEsMTkgKzE1NCwyOSBAQAogCiAKICAgICAgICAgaWYocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9PSBMVk1fVFJVRSl7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgTFZDX01peFNvZnRfMk1jX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOworI2Vsc2UKICAgICAgICAgICAgIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOwotICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUKilwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgICAgICAgICAgICAgICAvKiBMZWZ0IGFuZCBSaWdodCBzYW1wbGVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJTYW1wbGVzKTsKKyNlbmRpZgorICAgICAgICAgICAgLy8gZHVwbGljYXRlIHdpdGggZWxzZSBjbGF1c2UocykKKyAgICAgICAgICAgIENvcHlfRmxvYXQocFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOyAgICAgICAgICAgIC8qIEFsbCBjaGFubmVsIHNhbXBsZXMgKi8KICAgICAgICAgfQogICAgICAgICBlbHNlewogICAgICAgICAgICAgQ29weV9GbG9hdChwU2NyYXRjaCwgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwogICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKSgyICogTnVtU2FtcGxlcykpOyAvKiBMZWZ0IGFuZCBSaWdodCAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7IC8qIEFsbCBjaGFubmVsIHNhbXBsZXMgKi8KICAgICAgICAgfQogICAgIH0KICAgICBlbHNlCkBAIC0xNjMsMTIgKzE4NiwxMiBAQAogICAgICAgICAgKi8KICAgICAgICAgaWYgKHBJbkRhdGEgIT0gcE91dERhdGEpCiAgICAgICAgIHsKLSAgICAgICAgICAgIENvcHlfRmxvYXQocEluRGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAgICAgLyogTGVmdCBhbmQgUmlnaHQgc2FtcGxlcyAqLworICAgICAgICAgICAgQ29weV9GbG9hdChwSW5EYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7ICAgICAgICAgICAgLyogQWxsIGNoYW5uZWwgc2FtcGxlcyAqLwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7CisgICAgcmV0dXJuIExWRVFOQl9TVUNDRVNTOwogCiB9CiAjZWxzZQpAQCAtMzEyLDQgKzMzNSw0IEBACiAgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKIAogfQotI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1RhYmxlcy5jCmluZGV4IDU2MzE4MWMuLjQ1M2M0MmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1RhYmxlcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1RhYmxlcy5jCkBAIC00Niw3ICs0Niw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODgyMDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc2NDAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MjAwMAogfTsKICNlbHNlCkBAIC04Miw3ICs4NCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl80NDEwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzQ4MDAwCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWRVFOQl8yUGlPbl84ODIwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVkVRTkJfMlBpT25fOTYwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsTFZFUU5CXzJQaU9uXzE3NjQwMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVkVRTkJfMlBpT25fMTkyMDAwCiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKQEAgLTI0OSwzMCArMjUzLDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2NTg2LCAgICAgICAgICAgICAgICAgICAgICAgLyogYTIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NH07ICAgICAgICAgICAgICAgICAgICAgICAgLyogYTMgKi8KIAotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQnlwYXNzIG1peGVyIHRpbWUgY29uc3RhbnRzICgxMDBtcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczgwMDAgICAgMzI1ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NDI2MjY5NSAqLwotI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzMTEwMjUgICAzMjYzMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk1ODQ5NjA5ICovCi0jZGVmaW5lIExWRVFOQl9NSVhfVENfRnMxMjAwMCAgIDMyNjQzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTYxODUzMDMgKi8KLSNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczE2MDAwICAgMzI2NzQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NzEzMTM0OCAqLwotI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzMjIwNTAgICAzMjcwMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk3OTI0ODA1ICovCi0jZGVmaW5lIExWRVFOQl9NSVhfVENfRnMyNDAwMCAgIDMyNzA1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTgwNzczOTMgKi8KLSNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczMyMDAwICAgMzI3MjEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODU2NTY3NCAqLwotI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzNDQxMDAgICAzMjczNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4OTYyNDAyICovCi0jZGVmaW5lIExWRVFOQl9NSVhfVENfRnM0ODAwMCAgIDMyNzM3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTkwNTM5NTUgKi8KLQotCi1jb25zdCBMVk1fSU5UMTYgTFZFUU5CX01peGVyVENUYWJsZVtdID0gewotICAgIExWRVFOQl9NSVhfVENfRnM4MDAwLAotICAgIExWRVFOQl9NSVhfVENfRnMxMTAyNSwKLSAgICBMVkVRTkJfTUlYX1RDX0ZzMTIwMDAsCi0gICAgTFZFUU5CX01JWF9UQ19GczE2MDAwLAotICAgIExWRVFOQl9NSVhfVENfRnMyMjA1MCwKLSAgICBMVkVRTkJfTUlYX1RDX0ZzMjQwMDAsCi0gICAgTFZFUU5CX01JWF9UQ19GczMyMDAwLAotICAgIExWRVFOQl9NSVhfVENfRnM0NDEwMCwKLSAgICBMVkVRTkJfTUlYX1RDX0ZzNDgwMDB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJpdmF0ZS5oCmluZGV4IGZmNzQ3NWUuLmM5MTVhYzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcml2YXRlLmgKQEAgLTEyMyw3ICsxMjMsNyBAQAogI2lmbmRlZiBISUdIRVJfRlMKICNkZWZpbmUgTFZSRVZfTlVNX0ZTICAgICAgICAgICAgICAgICAgICAgICAgOSAgICAgICAgICAgLyogTnVtYmVyIG9mIHN1cHBvcnRlZCBzYW1wbGUgcmF0ZXMgKi8KICNlbHNlCi0jZGVmaW5lIExWUkVWX05VTV9GUyAgICAgICAgICAgICAgICAgICAgICAgMTEgICAgICAgICAgIC8qIE51bWJlciBvZiBzdXBwb3J0ZWQgc2FtcGxlIHJhdGVzICovCisjZGVmaW5lIExWUkVWX05VTV9GUyAgICAgICAgICAgICAgICAgICAgICAgMTMgICAgICAgICAgIC8qIE51bWJlciBvZiBzdXBwb3J0ZWQgc2FtcGxlIHJhdGVzICovCiAjZW5kaWYKIAogI2RlZmluZSBMVlJFVl9NQVhCTEtTSVpFX0xJTUlUICAgICAgICAgICAgIDY0ICAgICAgICAgICAvKiBNYXhpbXVtIGJsb2NrIHNpemUgbG93IGxpbWl0ICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmMKaW5kZXggNTY2ZDg0Zi4uMWQxMjgzZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1Byb2Nlc3MuYwpAQCAtNTc5LDcgKzU3OSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLSAgICAKKwogICAgIC8qCiAgICAgICogIFByb2Nlc3MgYWxsIGRlbGF5IGxpbmVzCiAgICAgICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMuYwppbmRleCBhNzE5MDUzLi5kZmVkMjhlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzLmMKQEAgLTY0LDEyICs2NCwyMiBAQAogICAgICAgICAoCiAgICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU184MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTEwMjUpICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMjAwMCkgICAgICAgJiYKICAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE2MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjIwNTApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yNDAwMCkgICAgICAgJiYKLSAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkgICAgICAKKyAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJgorICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmCisgICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkKICNpZmRlZiBISUdIRVJfRlMKLSAgICAgICAgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzk2MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTkyMDAwKQorICAgICAgICAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODgyMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU185NjAwMCkKKyAgICAgICAgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE3NjQwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE5MjAwMCkKICNlbmRpZgogICAgICAgICApCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICB8fCAoKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fU1RFUkVPKSAgICAgICAmJgorICAgICAgICAgICAgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OT0lOU1RFUkVPKSAmJgorICAgICAgICAgICAgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykgICAgICAgICAmJgorICAgICAgICAgICAgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTVVMVElDSEFOTkVMKSkpCisjZWxzZQogICAgICAgICB8fCAoKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fU1RFUkVPKSAmJiAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PSU5TVEVSRU8pICYmIChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk8pKSApCisjZW5kaWYKICAgICB7CiAgICAgICAgIHJldHVybiAoTFZSRVZfT1VUT0ZSQU5HRSk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuYwppbmRleCBiM2VkYzYwLi4xMDU4NzQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuYworKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9UYWJsZXMuYwpAQCAtNTIsNyArNTIsOSBAQAogICAgIDMyMDAwLAogICAgIDQ0MTAwLAogICAgIDQ4MDAwLAorICAgIDg4MjAwLAogICAgIDk2MDAwLAorICAgIDE3NjQwMCwKICAgICAxOTIwMDAKIH07CiAjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJpdmF0ZS5oCmluZGV4IGE3NTBiYjAuLmVlMDdlMmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1ByaXZhdGUuaApAQCAtNDYsNyArNDYsNyBAQAogI2lmbmRlZiBISUdIRVJfRlMKICNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUgICAgICAgICAgOSAgICAgIC8qIEZyb20gODAwMEh6IHRvIDQ4MDAwSHoqLwogI2Vsc2UKLSNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUgICAgICAgICAgMTEgICAgICAvKiBGcm9tIDgwMDBIeiB0byAxOTIwMDBIeiovCisjZGVmaW5lIExWUFNBX05SX1NVUFBPUlRFRF9SQVRFICAgICAgICAgIDEzICAgICAgLyogRnJvbSA4MDAwSHogdG8gMTkyMDAwSHoqLwogI2VuZGlmCiAjZGVmaW5lIExWUFNBX05SX1NVUFBPUlRFRF9TUEVFRCAgICAgICAgIDMgICAgICAvKiBMT1csIE1FRElVTSwgSElHSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJvY2Vzcy5jCmluZGV4IGVhNWY3NGEuLjYxODk5ZmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcm9jZXNzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1Byb2Nlc3MuYwpAQCAtMjIsNiArMjIsMTcgQEAKIAogI2RlZmluZSBMVk1fTUlOSU5UXzMyICAgMHg4MDAwMDAwMAogCitzdGF0aWMgTFZNX0lOVDMyIG11bHQzMngzMmluMzJfc2hpZnRyKExWTV9JTlQzMiBhLCBMVk1fSU5UMzIgYiwgTFZNX0lOVDMyIGMpIHsKKyAgTFZNX0lOVDY0IHJlc3VsdCA9ICgoTFZNX0lOVDY0KWEgKiBiKSA+PiBjOworCisgIGlmIChyZXN1bHQgPj0gSU5UMzJfTUFYKSB7CisgICAgcmV0dXJuIElOVDMyX01BWDsKKyAgfSBlbHNlIGlmIChyZXN1bHQgPD0gSU5UMzJfTUlOKSB7CisgICAgcmV0dXJuIElOVDMyX01JTjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gKExWTV9JTlQzMilyZXN1bHQ7CisgIH0KK30KIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xMjMsMTAgKzEzNCwxMCBAQAogCiAgICAgaWYocExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgIT0gcFdyaXRlX1NhdmUpCiAgICAgewotICAgICAgICBNVUwzMngzMklOVE8zMigoQXVkaW9UaW1lICsgKExWTV9JTlQzMikoKExWTV9JTlQzMilwTFZQU0FfSW5zdC0+TG9jYWxTYW1wbGVzQ291bnQqMTAwMCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMilMVlBTQV9TYW1wbGVSYXRlSW52VGFiW3BMVlBTQV9JbnN0LT5DdXJyZW50UGFyYW1zLkZzXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZUluYywKLSAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ZzSW52ZXJ0U2hpZnQpCisgICAgICAgIEF1ZGlvVGltZUluYyA9IG11bHQzMngzMmluMzJfc2hpZnRyKAorICAgICAgICAgICAgICAgIChBdWRpb1RpbWUgKyAoKExWTV9JTlQzMilwTFZQU0FfSW5zdC0+TG9jYWxTYW1wbGVzQ291bnQgKiAxMDAwKSksCisgICAgICAgICAgICAgICAgKExWTV9JTlQzMilMVlBTQV9TYW1wbGVSYXRlSW52VGFiW3BMVlBTQV9JbnN0LT5DdXJyZW50UGFyYW1zLkZzXSwKKyAgICAgICAgICAgICAgICBMVlBTQV9Gc0ludmVydFNoaWZ0KTsKICAgICAgICAgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSA9IEF1ZGlvVGltZSArIEF1ZGlvVGltZUluYzsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuYwppbmRleCAxMjg3NTAzLi5mOGFmNDk2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5jCkBAIC01NCw3ICs1NCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ODIwMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzY0MDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MjAwMH07ICAgICAgICAgICAgICAgICAgLyogMTkya1MvcyAqLwogI2VuZGlmCiAKQEAgLTc4LDcgKzgwLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODY5NiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDczOQogI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwyNDM0OAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwyMjM2OQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMjE3NAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMTE4NSAgICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgKi8KICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwpAQCAtMTA1LDcgKzEwOSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg4MiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYwCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxNzY0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxOTIwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwzNTI4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwzODQwICAgICAgICAgICAgICAgICAgLyogMTkya1MvcyAqLwogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKQEAgLTEyOCw3ICsxMzQsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwgICAgICAgICAgICAgICAgICAgLyogNDQxMDAgUy9zICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiAgICAgICAgICAgICAgICAgICAgLyogNDgwMDAgUy9zICAqLwogI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICw2MCAgICAgICAgICAgICAgICAgICAvKiA4ODIwMCBTL3MgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDY0ICAgICAgICAgICAgICAgICAgIC8qIDk2MDAwIFMvcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTIwICAgICAgICAgICAgICAgICAgLyogMTc2NDAwIFMvcyAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMTI4ICAgICAgICAgICAgICAgICAgLyoxOTIwMDAgUy9zICAqLwogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CkBAIC0xNTMsNyArMTYxLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NzgxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzOTIKICNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwyMzkwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMjE5NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDExOTUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMDk4ICAgIC8qIDE5MmtTL3MgKi8KICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKQEAgLTE2OSw3ICsxNzksOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xNDU5MDg5ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTM0MDM3MmYKICNpZmRlZiBISUdIRVJfRlMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAuMDcyOTQ3NmYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAuMDY3MDE4NmYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAuMDM2NDczOGYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDAuMDMzNTA5M2YgICAgLyogMTkya1MvcyAqLwogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwpAQCAtMzUyLDcgKzM2NCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzI2Mzg0NTc5NzYyODJmLDAuMDA2NjI0OTkzNDAyNTEwOWZ9LAogI2lmZGVmIEhJR0hFUl9GUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMTI2OTYxODY4MjU2M2YsMC4wMDY3NTkyNjQ5NzIwNjA5Zn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwwLjAwNjYyNDk5MzQwMjUxMDlmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzEyNjk2MTg2ODI1NjNmLDAuMDA2NzU5MjY0OTcyMDYwOWZ9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMjYzODQ1Nzk3NjI4MmYsMC4wMDY2MjQ5OTM0MDI1MTA5Zn0sCiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovICAgIC8qIExWUFNBX1NQRUVEX01FRElVTSAgICAgICovCkBAIC0zNjgsNyArMzgyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU0MDExOTU2MjI5ODA1OWYsMC4wNDQ1MzQzODE5NDQ2ODYyZn0sCiAjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTMxMDExOTEyMDQwNDEyZiwwLjA0NTM5OTUyMzgwNTgyNjlmfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTUzMTAxMTkxMjA0MDQxMmYsMC4wNDUzOTk1MjM4MDU4MjY5Zn0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTQwMTE5NTYyMjk4MDU5ZiwwLjA0NDUzNDM4MTk0NDY4NjJmfSwKICNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovICAgLyogTFZQU0FfU1BFRURfSElHSCAgICAgICovCkBAIC0zODMsNyArMzk5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjcyNzQ4MDczMTkwNDUwNjdmLDAuMjM1NjY2NjU0MDcyNzAxOWZ9CiAjaWZkZWYgSElHSEVSX0ZTCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHstMC43MjI5NzA2MzE5MDQ5MDAxZiwwLjIzODg5ODcyMjQ1NDkwNTVmfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICx7LTAuNzI3NDgwNzMxOTA0NTA2N2YsMC4yMzU2NjY2NTQwNzI3MDE5Zn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsey0wLjcyMjk3MDYzMTkwNDkwMDFmLDAuMjM4ODk4NzIyNDU0OTA1NWZ9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHstMC43Mjc0ODA3MzE5MDQ1MDY3ZiwwLjIzNTY2NjY1NDA3MjcwMTlmfQogI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9saWIvTFZDUy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYi9MVkNTLmgKaW5kZXggZTc1Njk1ZS4uZTUwN2E3YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYi9MVkNTLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL2xpYi9MVkNTLmgKQEAgLTIwNSw2ICsyMDUsOSBAQAogICAgIExWTV9Gc19lbiAgICAgICAgICAgICAgIFNhbXBsZVJhdGU7ICAgICAgICAgICAgIC8qIFNhbXBsaW5nIHJhdGUgKi8KICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBFZmZlY3RMZXZlbDsgICAgICAgICAgICAvKiBFZmZlY3QgbGV2ZWwgKi8KICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBSZXZlcmJMZXZlbDsgICAgICAgICAgICAvKiBSZXZlcmIgbGV2ZWwgaW4gJSAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBOckNoYW5uZWxzOworI2VuZGlmCiB9IExWQ1NfUGFyYW1zX3Q7CiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19IZWFkcGhvbmVfQ29lZmZzLmgKaW5kZXggMGMyZmU1My4uYmEwNTU3NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSGVhZHBob25lX0NvZWZmcy5oCkBAIC0xNTIsNiArMTUyLDI0IEBACiAjZGVmaW5lIENTX1NJREVfNDgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE0CiAKICNpZmRlZiBISUdIRVJfRlMKKy8qIENvZWZmaWNpZW50cyBmb3IgODgyMDBIeiBzYW1wbGUgcmF0ZS4KKyAqIFRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGFyZSBvYnRhaW5lZCBieSBjYXJyeWluZyBvdXQKKyAqIHN0YXRlLXNwYWNlIGFuYWx5c2lzIHVzaW5nIHRoZSBjb2VmZmljaWVudHMgYXZhaWxhYmxlCisgKiBmb3IgNDQxMDBIei4KKyAqLworI2RlZmluZSBDU19NSURETEVfODgyMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjIzMzg0NmYKKyNkZWZpbmUgQ1NfTUlERExFXzg4MjAwX0ExICAgICAgICAgICAgICAgICAgICAgKC0wLjIzMjY1N2YpCisjZGVmaW5lIENTX01JRERMRV84ODIwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBDU19NSURETEVfODgyMDBfQjEgICAgICAgICAgICAgICAgICAgICAoLTAuOTkyNzQ3ZikKKyNkZWZpbmUgQ1NfTUlERExFXzg4MjAwX0IyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIENTX01JRERMRV84ODIwMF9TQ0FMRSAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfODgyMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMjMxNTQxZgorI2RlZmluZSBDU19TSURFXzg4MjAwX0ExICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjg5NTg2ZikKKyNkZWZpbmUgQ1NfU0lERV84ODIwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC4wNTgwNDVmCisjZGVmaW5lIENTX1NJREVfODgyMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS43NjUzMDBmKQorI2RlZmluZSBDU19TSURFXzg4MjAwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjc2OTgxNmYKKyNkZWZpbmUgQ1NfU0lERV84ODIwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgMTQKKwogLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgOTYwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggIDAuMTY1Ki8KIC8qIGhpZ2ggcGFzcyBmaWx0ZXIgd2l0aCBjdXRvZmYgZnJlcXVlbmN5IDEwMi4xOCBIeiovCiAjZGVmaW5lIENTX01JRERMRV85NjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjM1NTMyCkBAIC0xNjAsMTMgKzE3OCwzMyBAQAogI2RlZmluZSBDU19NSURETEVfOTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICgtMC45OTMzMzQpCiAjZGVmaW5lIENTX01JRERMRV85NjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIENTX01JRERMRV85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1Ci0vKiBiYW5kcGFzcyBmaWx0ZXIgd2l0aCBmYzEgMjcwIGFuZCBmYzIgMzcwMywgZGVzaWduZWQgdXNpbmcgMm5kIG9yZGVyIGJ1dHRlcndvcnRoICovCi0jZGVmaW5lIENTX1NJREVfOTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjAxNjcyNwotI2RlZmluZSBDU19TSURFXzk2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKLSNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAxNjcyNykKLSNkZWZpbmUgQ1NfU0lERV85NjAwMF9CMSAgICAgICAgICAgICAgICAgICAgKC0xLjc5MzM3MikKLSNkZWZpbmUgQ1NfU0lERV85NjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuNzk3MjM2Ci0jZGVmaW5lIENTX1NJREVfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNAorLyogQ29lZmZpY2llbnRzIGNhbGN1bGF0ZWQgdXNpbmcgdGYyc3MgYW5kIHNzMnRmIGZ1bmN0aW9ucyBiYXNlZCBvbgorICogY29lZmZpY2llbnRzIGF2YWlsYWJsZSBmb3IgNDgwMDBIeiBzYW1wbGluZyBmcmVxdWVuY3kKKyAqLworI2RlZmluZSBDU19TSURFXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yMjQzMjZmCisjZGVmaW5lIENTX1NJREVfOTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICAoLTAuMjk0OTM3ZikKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDcwNjExZgorI2RlZmluZSBDU19TSURFXzk2MDAwX0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjc5MjE2NmYpCisjZGVmaW5lIENTX1NJREVfOTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjc5NTgzMGYKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgIDE0CisKKy8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDE3NjQwMEh6IHNhbXBsZSByYXRlLgorICogVGhlIGZpbHRlciBjb2VmZmljaWVudHMgYXJlIG9idGFpbmVkIGJ5IGNhcnJ5aW5nIG91dAorICogc3RhdGUtc3BhY2UgYW5hbHlzaXMgdXNpbmcgdGhlIGNvZWZmaWNpZW50cyBhdmFpbGFibGUKKyAqIGZvciA0NDEwMEh6LgorICovCisjZGVmaW5lIENTX01JRERMRV8xNzY0MDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjIzMzk3M2YKKyNkZWZpbmUgQ1NfTUlERExFXzE3NjQwMF9BMSAgICAgICAgICAgICAgICAgICAgICgtMC4yMzMzNzhmKQorI2RlZmluZSBDU19NSURETEVfMTc2NDAwX0EyICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIENTX01JRERMRV8xNzY0MDBfQjEgICAgICAgICAgICAgICAgICAgICAoLTAuOTk2MzY3ZikKKyNkZWZpbmUgQ1NfTUlERExFXzE3NjQwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBDU19NSURETEVfMTc2NDAwX1NDQUxFICAgICAgICAgICAgICAgICAgMTUKKyNkZWZpbmUgQ1NfU0lERV8xNzY0MDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMTk5ODM2ZgorI2RlZmluZSBDU19TSURFXzE3NjQwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0wLjMwNzU0NGYpCisjZGVmaW5lIENTX1NJREVfMTc2NDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAwLjEwNzcwOGYKKyNkZWZpbmUgQ1NfU0lERV8xNzY0MDBfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS44NzY1NzJmKQorI2RlZmluZSBDU19TSURFXzE3NjQwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC44Nzc3NzFmCisjZGVmaW5lIENTX1NJREVfMTc2NDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAxNAogCiAvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAxOTIwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggIDAuMTY4OSovCiAjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjI0MTIxOQpAQCAtMTc1LDEzICsyMTMsMTUgQEAKICNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9CMSAgICAgICAgICAgICAgICAgICAgKC0wLjk5NjY2MSkKICNkZWZpbmUgQ1NfTUlERExFXzE5MjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQotLyogYmFuZHBhc3MgZmlsdGVyIHdpdGggZmMxIDI3MCBhbmQgZmMyIDM3MDMsIGRlc2lnbmVkIHVzaW5nIDJuZCBvcmRlciBidXR0ZXJ3b3J0aCAqLwotI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDA4OTkxCi0jZGVmaW5lIENTX1NJREVfMTkyMDAwX0ExICAgICAgICAgICAgICAgICAgICAoLTAuMDAwMDAwKQotI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAwODk5MSkKLSNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICgtMS44OTI1MDkpCi0jZGVmaW5lIENTX1NJREVfMTkyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC44OTM1MjQKLSNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgIDE0CisvKiBDb2VmZmljaWVudHMgY2FsY3VsYXRlZCB1c2luZyB0ZjJzcyBhbmQgc3MydGYgZnVuY3Rpb25zIGJhc2VkIG9uCisgKiBjb2VmZmljaWVudHMgYXZhaWxhYmxlIGZvciA0ODAwMEh6IHNhbXBsaW5nIGZyZXF1ZW5jeQorICovCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAwLjE5NjAzOWYKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTEgICAgICAgICAgICAgICAgICAgICgtMC4zMTEwMjdmKQorI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMiAgICAgICAgICAgICAgICAgICAgMC4xMTQ5ODhmCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAgICAoLTEuODkxMzgwZikKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQjIgICAgICAgICAgICAgICAgICAgIDAuODkyMzQ2MGYKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgIDE0CiAjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTE5OSw3ICsyMzksMTIgQEAKICNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18yNEtIWiAgICAgICAgICAgICAgICAgICAyNzkgICAgICAgICAvKiBTYW1wbGUgcmF0ZSAyNGtTL3MgKi8KICNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU18zMktIWiAgICAgICAgICAgICAgICAgICAzNzIgICAgICAgICAvKiBTYW1wbGUgcmF0ZSAzMmtTL3MgKi8KICNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU180NEtIWiAgICAgICAgICAgICAgICAgICA1MTIgICAgICAgICAvKiBTYW1wbGUgcmF0ZSA0NGtTL3MgKi8KLSNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU180OEtIWiAgICAgICAgICAgICAgICAgICA1MTIgICAgICAgICAvKiBTYW1wbGUgcmF0ZSA0OGtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU180OEtIWiAgICAgICAgICAgICAgICAgICA1NTcgICAgICAgICAvKiBTYW1wbGUgcmF0ZSA0OGtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU184OEtIWiAgICAgICAgICAgICAgICAgICAxMDI0ICAgICAgICAvKiBTYW1wbGUgcmF0ZSA4OC4ya1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzk2S0haICAgICAgICAgICAgICAgICAgIDExMTUgICAgICAgIC8qIFNhbXBsZSByYXRlIDk2a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzE3NktIWiAgICAgICAgICAgICAgICAgIDIwNDggICAgICAgIC8qIFNhbXBsZSByYXRlIDE3Ni40a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzE5MktIWiAgICAgICAgICAgICAgICAgIDIyMjkgICAgICAgIC8qIFNhbXBsZSByYXRlIDE5NmtTL3MgKi8KKyNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU19NQVhfVkFMICAgICAgICAgICAgICAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzE5MktIWgogCiAvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciA4MDAwIEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLwogI2RlZmluZSBDU19SRVZFUkJfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMC42NjcyNzEKQEAgLTI3NSw2ICszMjAsMTQgQEAKICNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTQKIAogI2lmZGVmIEhJR0hFUl9GUworLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgODgyMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC44ICovCisvKiBCYW5kIHBhc3MgZmlsdGVyIHdpdGggZmMxPTUwMCBhbmQgZmMyPTgwMDAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjE3MTkwMWYKKyNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX0ExICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4xNzE5MDFmKQorI2RlZmluZSBDU19SRVZFUkJfODgyMDBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjU1Mzk0OGYpCisjZGVmaW5lIENTX1JFVkVSQl84ODIwMF9CMiAgICAgICAgICAgICAgICAgICAgICAoMC41NzAyNDhmKQorI2RlZmluZSBDU19SRVZFUkJfODgyMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgMTQKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDk2MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuOCAqLwogLyogQmFuZCBwYXNzIGZpbHRlciB3aXRoIGZjMT01MDAgYW5kIGZjMj04MDAwKi8KICNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjE2MDI0ODgKQEAgLTI4NCw2ICszMzcsMTQgQEAKICNkZWZpbmUgQ1NfUkVWRVJCXzk2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjU5OTM3NwogI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNAogCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAxNzY0MDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC44ICovCisvKiBCYW5kIHBhc3MgZmlsdGVyIHdpdGggZmMxPTUwMCBhbmQgZmMyPTgwMDAgKi8KKyNkZWZpbmUgQ1NfUkVWRVJCXzE3NjQwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4wOTQ3NjNmCisjZGVmaW5lIENTX1JFVkVSQl8xNzY0MDBfQTEgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMC4wOTQ3NjNmKQorI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS43NTg1OTNmKQorI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX0IyICAgICAgICAgICAgICAgICAgICAgICgwLjc2MzA5MWYpCisjZGVmaW5lIENTX1JFVkVSQl8xNzY0MDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgMTQKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDE5MjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjggKi8KIC8qIEJhbmQgcGFzcyBmaWx0ZXIgd2l0aCBmYzE9NTAwIGFuZCBmYzI9ODAwMCovCiAjZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMDg3ODM2OQpAQCAtNDQ2LDYgKzUwNywyNCBAQAogCiAKICNpZmRlZiBISUdIRVJfRlMKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDg4MjAwSHogc2FtcGxlIHJhdGUuCisgKiBUaGUgZmlsdGVyIGNvZWZmaWNpZW50cyBhcmUgb2J0YWluZWQgYnkgY2Fycnlpbmcgb3V0CisgKiBzdGF0ZS1zcGFjZSBhbmFseXNpcyB1c2luZyB0aGUgY29lZmZpY2llbnRzIGF2YWlsYWJsZQorICogZm9yIDQ0MTAwSHouCisgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzg4MjAwX0EwICAgICAgICAgICAgICAgICAgIDEuNzcxODk5ZgorI2RlZmluZSBDU19FUVVBTElTRVJfODgyMDBfQTEgICAgICAgICAgICAgICAgICAgKC0yLjkzMDc2MmYpCisjZGVmaW5lIENTX0VRVUFMSVNFUl84ODIwMF9BMiAgICAgICAgICAgICAgICAgICAxLjE3MjE3NWYKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzg4MjAwX0IxICAgICAgICAgICAgICAgICAgICgtMS40MzgzNDlmKQorI2RlZmluZSBDU19FUVVBTElTRVJfODgyMDBfQjIgICAgICAgICAgICAgICAgICAgMC40NDI1MjBmCisjZGVmaW5lIENTX0VRVUFMSVNFUl84ODIwMF9TQ0FMRSAgICAgICAgICAgICAgICAxMworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84ODIwMF9BMCAgICAgICAgICAgICAgICAgMi42NzUyNDFmCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzg4MjAwX0ExICAgICAgICAgICAgICAgICAoLTQuNDY2MTU0ZikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODgyMDBfQTIgICAgICAgICAgICAgICAgIDEuODEwMzA1ZgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84ODIwMF9CMSAgICAgICAgICAgICAgICAgKC0wLjkyNTM1MGYpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzg4MjAwX0IyICAgICAgICAgICAgICAgICAoLTAuMDY2NjE2ZikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODgyMDBfU0NBTEUgICAgICAgICAgICAgIDEzCisKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAxLjc4NDQ5NwogI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfQTEgICAgICAgICAgICAgICAgICAgKC0zLjAwMTQzNSkKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0EyICAgICAgICAgICAgICAgICAgICAxLjIyODQyMgpAQCAtNDU4LDYgKzUzNywyMyBAQAogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMSAgICAgICAgICAgICAgICAgKC0wLjk3MTcxOCkKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQjIgICAgICAgICAgICAgICAgICgtMC4wMjEyMTYpCiAjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAxNzY0MDBIeiBzYW1wbGUgcmF0ZS4KKyAqIFRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGFyZSBvYnRhaW5lZCBieSBjYXJyeWluZyBvdXQKKyAqIHN0YXRlLXNwYWNlIGFuYWx5c2lzIHVzaW5nIHRoZSBjb2VmZmljaWVudHMgYXZhaWxhYmxlCisgKiBmb3IgNDQxMDBIei4KKyAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMTc2NDAwX0EwICAgICAgICAgICAgICAgICAgMS44ODM0NDBmCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNzY0MDBfQTEgICAgICAgICAgICAgICAgICAoLTMuNDE0MjcyZikKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE3NjQwMF9BMiAgICAgICAgICAgICAgICAgIDEuNTM0NzAyZgorI2RlZmluZSBDU19FUVVBTElTRVJfMTc2NDAwX0IxICAgICAgICAgICAgICAgICAgKC0xLjY3NDYxNGYpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNzY0MDBfQjIgICAgICAgICAgICAgICAgICAwLjY3NTgyN2YKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE3NjQwMF9TQ0FMRSAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9BMCAgICAgICAgICAgICAgICAzLjM1NTA2OGYKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0ExICAgICAgICAgICAgICAgICgtNi4xMTI1NzhmKQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQTIgICAgICAgICAgICAgICAgMi43NjQxMzVmCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9CMSAgICAgICAgICAgICAgICAoLTEuMjY4NTMzZikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0IyICAgICAgICAgICAgICAgIDAuMjcxMjc3ZgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfU0NBTEUgICAgICAgICAgICAgMTMKIAogI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAxLjg4OTU4MgogI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0ExICAgICAgICAgICAgICAgICAgICgtMy40NTYxNDApCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1ByaXZhdGUuaAppbmRleCBhOTdlNGYwLi5hYjhjY2QxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcml2YXRlLmgKQEAgLTYxLDYgKzYxLDE1IEBACiAKIC8qIE1lbW9yeSAqLwogI2RlZmluZSBMVkNTX1NDUkFUQ0hCVUZGRVJTICAgICAgICAgICAgICA2ICAgICAgLyogTnVtYmVyIG9mIGJ1ZmZlcnMgcmVxdWlyZWQgZm9yIGlucGxhY2UgcHJvY2Vzc2luZyAqLworI2lmZGVmIFNVUFBPUlRfTUMKKy8qCisgKiBUaGUgQ29uY2VydCBTdXJyb3VuZCBtb2R1bGUgYXBwbGllcyBwcm9jZXNzaW5nIG9ubHkgb24gdGhlIGZpcnN0IHR3bworICogY2hhbm5lbHMgb2YgYSBtdWx0aWNoYW5uZWwgaW5wdXQuIFRoZSBkYXRhIG9mIGZpcnN0IHR3byBjaGFubmVscyBpcyBjb3BpZWQKKyAqIGZyb20gdGhlIG11bHRpY2hhbm5lbCBpbnB1dCBpbnRvIHNjcmF0Y2ggYnVmZmVyLiBUaGUgYnVmZmVycyBhZGRlZCBoZXJlCisgKiBhcmUgdXNlZCBmb3IgdGhpcyBwdXJwb3NlCisgKi8KKyNkZWZpbmUgTFZDU19NQ19TQ1JBVENIQlVGRkVSUyAgICAgICAgICAgMgorI2VuZGlmCiAKIC8qIEdlbmVyYWwgKi8KICNkZWZpbmUgTFZDU19JTlZBTElEICAgICAgICAgICAgICAgIDB4RkZGRiAgICAgIC8qIEludmFsaWQgaW5pdCBwYXJhbWV0ZXIgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jCmluZGV4IDM5NTZkNGQuLmVmMWQ5ZWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcm9jZXNzLmMKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuYwpAQCAtNzYsNiArNzYsMjIgQEAKICAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwU2NyYXRjaDsKICAgICBMVkNTX1JldHVyblN0YXR1c19lbiBlcnI7CisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBTdEluOworICAgIExWTV9JTlQzMiAgICAgICAgICAgY2hhbm5lbHMgPSBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzOworI2RlZmluZSBOckZyYW1lcyBOdW1TYW1wbGVzICAvLyBhbGlhcyBmb3IgY2xhcml0eQorCisgICAgLypJbiBjYXNlIG9mIG1vbm8gcHJvY2Vzc2luZywgc3RlcmVvIGlucHV0IGlzIGNyZWF0ZWQgZnJvbSBtb25vCisgICAgICphbmQgc3RvcmVkIGluIHBJbkRhdGEgYmVmb3JlIGFwcGx5aW5nIGFueSBvZiB0aGUgZWZmZWN0cy4KKyAgICAgKkhvd2V2ZXIgd2UgZG8gbm90IHVwZGF0ZSB0aGUgdmFsdWUgcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVscworICAgICAqYXQgdGhpcyBwb2ludC4KKyAgICAgKlNvIHRvIHRyZWF0IHRoZSBwSW5EYXRhIGFzIHN0ZXJlbyB3ZSBhcmUgc2V0dGluZyBjaGFubmVscyB0byAyCisgICAgICovCisgICAgaWYgKGNoYW5uZWxzID09IDEpCisgICAgeworICAgICAgICBjaGFubmVscyA9IDI7CisgICAgfQorI2VuZGlmCiAKICAgICBwU2NyYXRjaCAgPSAoTFZNX0ZMT0FUICopIFwKICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3M7CkBAIC04Myw2ICs5OSwyNSBAQAogICAgIC8qCiAgICAgICogQ2hlY2sgaWYgdGhlIHByb2Nlc3NpbmcgaXMgaW5wbGFjZQogICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAvKgorICAgICAqIFRoZSBwSW5wdXQgYnVmZmVyIGhvbGRzIHRoZSBmaXJzdCAyIChMZWZ0LCBSaWdodCkgY2hhbm5lbHMgaW5mb3JtYXRpb24uCisgICAgICogSGVuY2UgdGhlIG1lbW9yeSByZXF1aXJlZCBieSB0aGlzIGJ1ZmZlciBpcyAyICogTnVtRnJhbWVzLgorICAgICAqIFRoZSBDb25jZXJ0IFN1cnJvdW5kIG1vZHVsZSBjYXJyaWVzIG91dCBwcm9jZXNzaW5nIG9ubHkgb24gTCwgUi4KKyAgICAgKi8KKyAgICBwSW5wdXQgPSBwU2NyYXRjaCArICgyICogTnJGcmFtZXMpOworICAgIHBTdEluICA9IHBTY3JhdGNoICsgKExWQ1NfU0NSQVRDSEJVRkZFUlMgKiBOckZyYW1lcyk7CisgICAgLyogVGhlIGZpcnN0IHR3byBjaGFubmVsIGRhdGEgaXMgZXh0cmFjdGVkIGZyb20gdGhlIGlucHV0IGRhdGEgYW5kCisgICAgICogY29waWVkIGludG8gcElucHV0IGJ1ZmZlcgorICAgICAqLworICAgIENvcHlfRmxvYXRfTWNfU3RlcmVvKChMVk1fRkxPQVQgKilwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbHMpOworICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbnB1dCwKKyAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU3RJbiwKKyAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOckZyYW1lcykpOworI2Vsc2UKICAgICBpZiAocEluRGF0YSA9PSBwT3V0RGF0YSkKICAgICB7CiAgICAgICAgIC8qIFByb2Nlc3NpbmcgaW5wbGFjZSAqLwpAQCAtOTYsMTQgKzEzMSwyMSBAQAogICAgICAgICAvKiBQcm9jZXNzaW5nIG91dHBsYWNlICovCiAgICAgICAgIHBJbnB1dCA9IHBJbkRhdGE7CiAgICAgfQotCisjZW5kaWYKICAgICAvKgogICAgICAqIENhbGwgdGhlIHN0ZXJlbyBlbmhhbmNlcgogICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBlcnIgPSBMVkNTX1N0ZXJlb0VuaGFuY2VyKGhJbnN0YW5jZSwgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFN0SW4sICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzKTsgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBmcmFtZXMgdG8gcHJvY2VzcyAqLworI2Vsc2UKICAgICBlcnIgPSBMVkNTX1N0ZXJlb0VuaGFuY2VyKGhJbnN0YW5jZSwgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KKyNlbmRpZgogCiAgICAgLyoKICAgICAgKiBDYWxsIHRoZSByZXZlcmIgZ2VuZXJhdG9yCkBAIC0xMTIsNyArMTU0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCi0gICAgCisKICAgICAvKgogICAgICAqIENhbGwgdGhlIGVxdWFsaXNlcgogICAgICAqLwpAQCAtMjM5LDcgKzI4MSwxNSBAQAogCiAgICAgTFZDU19JbnN0YW5jZV90ICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKICAgICBMVkNTX1JldHVyblN0YXR1c19lbiBlcnI7Ci0KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgLypFeHRyYWN0IG51bWJlciBvZiBDaGFubmVscyBpbmZvKi8KKyAgICBMVk1fSU5UMzIgY2hhbm5lbHMgPSBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzOworI2RlZmluZSBOckZyYW1lcyBOdW1TYW1wbGVzICAvLyBhbGlhcyBmb3IgY2xhcml0eQorICAgIGlmIChjaGFubmVscyA9PSAxKQorICAgIHsKKyAgICAgICAgY2hhbm5lbHMgPSAyOworICAgIH0KKyNlbmRpZgogICAgIC8qCiAgICAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vdCB0b28gbGFyZ2UKICAgICAgKi8KQEAgLTI2MCw4ICszMTAsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIAorCisKICAgICAgICAgLyoKICAgICAgICAgICogQ29tcHJlc3MgdG8gcmVkdWNlIGV4cGFuc2lvbiBlZmZlY3Qgb2YgQ29uY2VydCBTb3VuZCBhbmQgY29ycmVjdCB2b2x1bWUKICAgICAgICAgICogZGlmZmVyZW5jZXMgZm9yIGRpZmZlcmVuY2Ugc2V0dGluZ3MuIE5vdCBhcHBsaWVkIGluIHRlc3QgbW9kZXMKQEAgLTM3NiwxNyArNDI2LDMyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgQ29weV9GbG9hdF9TdGVyZW9fTWMocEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscyk7CisjZW5kaWYKICAgICB9CiAgICAgZWxzZQogICAgIHsKICAgICAgICAgaWYgKHBJbkRhdGEgIT0gcE91dERhdGEpCiAgICAgICAgIHsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBzbyBqdXN0IGNvcHkgdGhlIGRhdGEKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBPdXREYXRhLCAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKGNoYW5uZWxzICogTnJGcmFtZXMpKTsgICAgLyogQWxsIENoYW5uZWxzKi8KKyNlbHNlCiAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBzbyBqdXN0IGNvcHkgdGhlIGRhdGEKICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBPdXREYXRhLCAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCiAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCisjZW5kaWYKICAgICAgICAgfQogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5oCmluZGV4IDY5ODkyYjYuLmY5NGQ0ZTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmgKQEAgLTY1LDcgKzY1LDcgQEAKICAgICAvKiBGaWx0ZXIgKi8KICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKCpwQmlxdWFkQ2FsbEJhY2spIChCaXF1YWRfSW5zdGFuY2VfdCosIExWTV9JTlQxNiosIExWTV9JTlQxNiosIExWTV9JTlQxNik7CiAjZWxzZQotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICBTdGVyZW9TYW1wbGVzWzIgKiBMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0haXTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgU3RlcmVvU2FtcGxlc1syICogTFZDU19TVEVSRU9ERUxBWV9DU19NQVhfVkFMXTsKICAgICAvKiBSZXZlcmIgTGV2ZWwgKi8KICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgUmV2ZXJiTGV2ZWw7CiAgICAgLyogRmlsdGVyICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmMKaW5kZXggZTE1NGUyOS4uYTFmYjQ4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuYwpAQCAtNzQsMTAgKzc0LDE4IEBACiAgICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfNDgwMDBfU0NBTEV9CiAjaWZkZWYgSElHSEVSX0ZTCiAgICAgLAorICAgIHtDU19NSURETEVfODgyMDBfQTAsICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX01JRERMRV84ODIwMF9BMSwKKyAgICAgQ1NfTUlERExFXzg4MjAwX0IxLAorICAgICAoTFZNX1VJTlQxNilDU19NSURETEVfODgyMDBfU0NBTEV9LAogICAgIHtDU19NSURETEVfOTYwMDBfQTAsICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIENTX01JRERMRV85NjAwMF9BMSwKICAgICAgQ1NfTUlERExFXzk2MDAwX0IxLAogICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzk2MDAwX1NDQUxFfSwKKyAgICB7Q1NfTUlERExFXzE3NjQwMF9BMCwgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX01JRERMRV8xNzY0MDBfQTEsCisgICAgIENTX01JRERMRV8xNzY0MDBfQjEsCisgICAgIChMVk1fVUlOVDE2KUNTX01JRERMRV8xNzY0MDBfU0NBTEV9LAogICAgIHtDU19NSURETEVfMTkyMDAwX0EwLCAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KICAgICAgQ1NfTUlERExFXzE5MjAwMF9BMSwKICAgICAgQ1NfTUlERExFXzE5MjAwMF9CMSwKQEAgLTE0NCwxMiArMTUyLDI0IEBACiAgICAgIChMVk1fVUlOVDE2IClDU19TSURFXzQ4MDAwX1NDQUxFfQogI2lmZGVmIEhJR0hFUl9GUwogICAgICAsCisgICAge0NTX1NJREVfODgyMDBfQTAsICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfU0lERV84ODIwMF9BMSwKKyAgICAgQ1NfU0lERV84ODIwMF9BMiwKKyAgICAgQ1NfU0lERV84ODIwMF9CMSwKKyAgICAgQ1NfU0lERV84ODIwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYpQ1NfU0lERV84ODIwMF9TQ0FMRX0sCiAgICAgIHtDU19TSURFXzk2MDAwX0EwLCAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIENTX1NJREVfOTYwMDBfQTEsCiAgICAgIENTX1NJREVfOTYwMDBfQTIsCiAgICAgIENTX1NJREVfOTYwMDBfQjEsCiAgICAgIENTX1NJREVfOTYwMDBfQjIsCiAgICAgIChMVk1fVUlOVDE2IClDU19TSURFXzk2MDAwX1NDQUxFfSwKKyAgICB7Q1NfU0lERV8xNzY0MDBfQTAsICAgICAgICAgIC8qMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfU0lERV8xNzY0MDBfQTEsCisgICAgIENTX1NJREVfMTc2NDAwX0EyLAorICAgICBDU19TSURFXzE3NjQwMF9CMSwKKyAgICAgQ1NfU0lERV8xNzY0MDBfQjIsCisgICAgIChMVk1fVUlOVDE2KUNTX1NJREVfMTc2NDAwX1NDQUxFfSwKICAgICAge0NTX1NJREVfMTkyMDAwX0EwLCAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU19TSURFXzE5MjAwMF9BMSwKICAgICAgQ1NfU0lERV8xOTIwMDBfQTIsCkBAIC0yMjMsMTIgKzI0MywyNCBAQAogICAgICBDU19FUVVBTElTRVJfNDgwMDBfQjIsCiAgICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfNDgwMDBfU0NBTEV9LAogI2lmZGVmIEhJR0hFUl9GUworICAgIHtDU19FUVVBTElTRVJfODgyMDBfQTAsICAgICAvKiA4OGtTL3MgY29lZmZpZWllbnRzICovCisgICAgIENTX0VRVUFMSVNFUl84ODIwMF9BMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzg4MjAwX0EyLAorICAgICBDU19FUVVBTElTRVJfODgyMDBfQjEsCisgICAgIENTX0VRVUFMSVNFUl84ODIwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYpQ1NfRVFVQUxJU0VSXzg4MjAwX1NDQUxFfSwKICAgICB7Q1NfRVFVQUxJU0VSXzk2MDAwX0EwLCAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU19FUVVBTElTRVJfOTYwMDBfQTEsCiAgICAgIENTX0VRVUFMSVNFUl85NjAwMF9BMiwKICAgICAgQ1NfRVFVQUxJU0VSXzk2MDAwX0IxLAogICAgICBDU19FUVVBTElTRVJfOTYwMDBfQjIsCiAgICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfOTYwMDBfU0NBTEV9LAorICAgIHtDU19FUVVBTElTRVJfMTc2NDAwX0EwLCAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfRVFVQUxJU0VSXzE3NjQwMF9BMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzE3NjQwMF9BMiwKKyAgICAgQ1NfRVFVQUxJU0VSXzE3NjQwMF9CMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzE3NjQwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYpQ1NfRVFVQUxJU0VSXzE3NjQwMF9TQ0FMRX0sCiAgICAge0NTX0VRVUFMSVNFUl8xOTIwMDBfQTAsICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU19FUVVBTElTRVJfMTkyMDAwX0ExLAogICAgICBDU19FUVVBTElTRVJfMTkyMDAwX0EyLApAQCAtMjk0LDEyICszMjYsMjQgQEAKICAgICAgKExWTV9VSU5UMTYgKUNTRVhfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFfQogI2lmZGVmIEhJR0hFUl9GUwogICAgICwKKyAgICB7Q1NFWF9FUVVBTElTRVJfODgyMDBfQTAsICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU0VYX0VRVUFMSVNFUl84ODIwMF9BMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfODgyMDBfQTIsCisgICAgIENTRVhfRVFVQUxJU0VSXzg4MjAwX0IxLAorICAgICBDU0VYX0VRVUFMSVNFUl84ODIwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYpQ1NFWF9FUVVBTElTRVJfODgyMDBfU0NBTEV9LAogICAgIHtDU0VYX0VRVUFMSVNFUl85NjAwMF9BMCwgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIENTRVhfRVFVQUxJU0VSXzk2MDAwX0ExLAogICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMiwKICAgICAgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQjEsCiAgICAgIENTRVhfRVFVQUxJU0VSXzk2MDAwX0IyLAogICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfOTYwMDBfU0NBTEV9LAorICAgIHtDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQTAsICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0ExLAorICAgICBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQTIsCisgICAgIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9CMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0IyLAorICAgICAoTFZNX1VJTlQxNilDU0VYX0VRVUFMSVNFUl8xNzY0MDBfU0NBTEV9LAogICAgICB7Q1NFWF9FUVVBTElTRVJfMTkyMDAwX0EwLCAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCiAgICAgIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMSwKICAgICAgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0EyLApAQCAtMzI2LDcgKzM3MCwxMiBAQAogICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMjRLSFosCiAgICAgTFZDU19TVEVSRU9ERUxBWV9DU18zMktIWiwKICAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzQ0S0haLAotICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDhLSFp9OworICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDhLSFosCisgICAgTFZDU19TVEVSRU9ERUxBWV9DU184OEtIWiwKKyAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzk2S0haLAorICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTc2S0haLAorICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTkyS0haLAorfTsKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zOTIsMTIgKzQ0MSwyNCBAQAogICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzQ4MDAwX1NDQUxFfQogI2lmZGVmIEhJR0hFUl9GUwogICAgICwKKyAgICB7Q1NfUkVWRVJCXzg4MjAwX0EwLCAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfUkVWRVJCXzg4MjAwX0ExLAorICAgICBDU19SRVZFUkJfODgyMDBfQTIsCisgICAgIENTX1JFVkVSQl84ODIwMF9CMSwKKyAgICAgQ1NfUkVWRVJCXzg4MjAwX0IyLAorICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfODgyMDBfU0NBTEV9LAogICAgIHtDU19SRVZFUkJfOTYwMDBfQTAsICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU19SRVZFUkJfOTYwMDBfQTEsCiAgICAgIENTX1JFVkVSQl85NjAwMF9BMiwKICAgICAgQ1NfUkVWRVJCXzk2MDAwX0IxLAogICAgICBDU19SRVZFUkJfOTYwMDBfQjIsCiAgICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfOTYwMDBfU0NBTEV9LAorICAgIHtDU19SRVZFUkJfMTc2NDAwX0EwLCAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl8xNzY0MDBfQTEsCisgICAgIENTX1JFVkVSQl8xNzY0MDBfQTIsCisgICAgIENTX1JFVkVSQl8xNzY0MDBfQjEsCisgICAgIENTX1JFVkVSQl8xNzY0MDBfQjIsCisgICAgIChMVk1fVUlOVDE2KUNTX1JFVkVSQl8xNzY0MDBfU0NBTEV9LAogICAgICB7Q1NfUkVWRVJCXzE5MjAwMF9BMCwgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwogICAgICBDU19SRVZFUkJfMTkyMDAwX0ExLAogICAgICBDU19SRVZFUkJfMTkyMDAwX0EyLApAQCAtNTA5LDIyICs1NzAsMjYgQEAKICNkZWZpbmUgTFZDU19WT0xfVENfRnM0NDEwMCAgICAgMzI3MzQgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg5NjI0MDIgKi8KICNkZWZpbmUgTFZDU19WT0xfVENfRnM0ODAwMCAgICAgMzI3MzcgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTkwNTM5NTUgKi8KICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKKyNkZWZpbmUgTFZDU19WT0xfVENfRnM4ODIwMCAgICAgMzI3NTEgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk0ODEwNjYgKi8KICNkZWZpbmUgTFZDU19WT0xfVENfRnM5NjAwMCAgICAgMzI3NTEgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk1MTE3MDMgKi8gICAvKiBUb2RvIEAgbmVlZCB0byByZSBjaGVjayB0aGlzIHZhbHVlKi8KKyNkZWZpbmUgTFZDU19WT0xfVENfRnMxNzY0MDAgICAgMzI3NTkgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk3NDA0OTkgKi8KICNkZWZpbmUgTFZDU19WT0xfVENfRnMxOTIwMDAgICAgMzI3NjMgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTk4Nzc5MjUgKi8gIC8qIFRvZG8gQCBuZWVkIHRvIHJlIGNoZWNrIHRoaXMgdmFsdWUqLwogI2VuZGlmCiAKICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLWNvbnN0IExWTV9JTlQxNiBMVkNTX1ZvbHVtZVRDVGFibGVbMTFdID0ge0xWQ1NfVk9MX1RDX0ZzODAwMCwKLQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTEwMjUsCi0JCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczEyMDAwLAotCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnMxNjAwMCwKLQkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzMjIwNTAsCi0JCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczI0MDAwLAotCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnMzMjAwMCwKLQkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzNDQxMDAsCi0JCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczQ4MDAwLAotCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnM5NjAwMCwKLQkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzMTkyMDAwCitjb25zdCBMVk1fSU5UMTYgTFZDU19Wb2x1bWVUQ1RhYmxlWzEzXSA9IHtMVkNTX1ZPTF9UQ19GczgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczExMDI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczIyMDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMyNDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczQ0MTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnM0ODAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzODgyMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19Gczk2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxNzY0MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczE5MjAwMAogfTsKICNlbHNlCiBjb25zdCBMVk1fSU5UMTYgTFZDU19Wb2x1bWVUQ1RhYmxlWzldID0ge0xWQ1NfVk9MX1RDX0ZzODAwMCwKQEAgLTU0NSwxNyArNjEwLDE5IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLWNvbnN0IExWTV9JTlQzMiAgIExWQ1NfU2FtcGxlUmF0ZVRhYmxlWzExXSA9IHs4MDAwLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAotCQkJCQkJCQkJCQkgIDEyMDAwLAotCQkJCQkJCQkJCQkgIDE2MDAwLAotCQkJCQkJCQkJCQkgIDIyMDUwLAotCQkJCQkJCQkJCQkgIDI0MDAwLAotCQkJCQkJCQkJCQkgIDMyMDAwLAotCQkJCQkJCQkJCQkgIDQ0MTAwLAotCQkJCQkJCQkJCQkgIDQ4MDAwLAotCQkJCQkJCQkJCQkgIDk2MDAwLAotCQkJCQkJCQkJCQkgIDE5MjAwMAorY29uc3QgTFZNX0lOVDMyICAgTFZDU19TYW1wbGVSYXRlVGFibGVbMTNdID0gezgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIwNTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODgyMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc2NDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MjAwMAogfTsKICNlbHNlCiBjb25zdCBMVk1fSU5UMTYgICBMVkNTX1NhbXBsZVJhdGVUYWJsZVs5XSA9IHs4MDAwLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAzY2U5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1OSBAQAorLy8gQnVpbGQgdGhlIHVuaXQgdGVzdHMgZm9yIGVmZmVjdHMKKworY2NfdGVzdCB7CisgICAgbmFtZTogImx2bXRlc3QiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiBmYWxzZSwKKyAgICBwcm9wcmlldGFyeTogdHJ1ZSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYyIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYiIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9saWIiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYyIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJtdXNpY2J1bmRsZSIsCisgICAgXSwKKworICAgIHNyY3M6IFsibHZtdGVzdC5jcHAiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURCVUlMRF9GTE9BVCIsCisgICAgICAgICItREhJR0hFUl9GUyIsCisgICAgICAgICItRFNVUFBPUlRfTUMiLAorCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJzbnIiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiBmYWxzZSwKKworICAgIHNyY3M6IFsic25yLmNwcCJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9idWlsZF9hbmRfcnVuX2FsbF91bml0X3Rlc3RzLnNoIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hOTdhY2M5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaApAQCAtMCwwICsxLDEzMiBAQAorIyEvYmluL2Jhc2gKKyMKKyMgUnVuIHRlc3RzIGluIHRoaXMgZGlyZWN0b3J5LgorIworCitpZiBbIC16ICIkQU5EUk9JRF9CVUlMRF9UT1AiIF07IHRoZW4KKyAgICBlY2hvICJBbmRyb2lkIGJ1aWxkIGVudmlyb25tZW50IG5vdCBzZXQiCisgICAgZXhpdCAtMQorZmkKKworIyBlbnN1cmUgd2UgaGF2ZSBtbQorLiAkQU5EUk9JRF9CVUlMRF9UT1AvYnVpbGQvZW52c2V0dXAuc2gKKworbW0gLWoKKworZWNobyAid2FpdGluZyBmb3IgZGV2aWNlIgorCithZGIgcm9vdCAmJiBhZGIgd2FpdC1mb3ItZGV2aWNlIHJlbW91bnQKKworIyBsb2NhdGlvbiBvZiB0ZXN0IGZpbGVzCit0ZXN0ZGlyPSIvZGF0YS9sb2NhbC90bXAvbHZtVGVzdCIKKworZWNobyAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIKK2VjaG8gInRlc3RpbmcgbHZtIgorYWRiIHNoZWxsIG1rZGlyIC1wICR0ZXN0ZGlyCithZGIgcHVzaCAkQU5EUk9JRF9CVUlMRF9UT1AvY3RzL3Rlc3RzL3Rlc3RzL21lZGlhL3Jlcy9yYXcvc2luZXN3ZWVwcmF3LnJhdyAkdGVzdGRpcgorYWRiIHB1c2ggJE9VVC90ZXN0Y2FzZXMvc25yL2FybTY0L3NuciAkdGVzdGRpcgorCitFX1ZBTD0xCitpZiBbIC16ICIkMSIgXQordGhlbgorICAgIGNtZHM9KCJhZGIgcHVzaCAkT1VUL3Rlc3RjYXNlcy9sdm10ZXN0L2FybTY0L2x2bXRlc3QgJHRlc3RkaXIiCisgICAgICAgICAgImFkYiBwdXNoICRPVVQvdGVzdGNhc2VzL2x2bXRlc3QvYXJtL2x2bXRlc3QgJHRlc3RkaXIiCisgICAgICAgICApCitlbGlmIFsgIiQxIiA9PSAiMzIiIF0KK3RoZW4KKyAgICBjbWRzPSJhZGIgcHVzaCAkT1VUL3Rlc3RjYXNlcy9sdm10ZXN0L2FybS9sdm10ZXN0ICR0ZXN0ZGlyIgorZWxpZiBbICIkMSIgPT0gIjY0IiBdCit0aGVuCisgICAgY21kcz0iYWRiIHB1c2ggJE9VVC90ZXN0Y2FzZXMvbHZtdGVzdC9hcm02NC9sdm10ZXN0ICR0ZXN0ZGlyIgorZWxzZQorICAgIGVjaG8gIiIKKyAgICBlY2hvICJJbnZhbGlkIFwidmFsXCIiCisgICAgZWNobyAiVXNhZ2U6IgorICAgIGVjaG8gIiAgICAgICIkMCIgW3ZhbF0iCisgICAgZWNobyAiICAgICAgd2hlcmUsIHZhbCBjYW4gYmUgZWl0aGVyIDMyIG9yIDY0LiIKKyAgICBlY2hvICIiCisgICAgZWNobyAiICAgICAgSWYgdmFsIGlzIG5vdCBzcGVjaWZpZWQgdGhlbiBib3RoIDMyIGJpdCBhbmQgNjQgYml0IGJpbmFyaWVzIgorICAgIGVjaG8gIiAgICAgIGFyZSB0ZXN0ZWQuIgorICAgIGV4aXQgJEVfVkFMCitmaQorCitmbGFnc19hcnI9KAorICAgICItY3NFIgorICAgICItZXFFIgorICAgICItdEUiCisgICAgIi1jc0UgLXRFIC1lcUUiCisgICAgIi1iRSAtTSIKKyAgICAiLWNzRSAtdEUiCisgICAgIi1jc0UgLWVxRSIgIi10RSAtZXFFIgorICAgICItY3NFIC10RSAtYkUgLU0gLWVxRSIKKyAgICAiLXRFIC1lcUUgLXZjQmFsOjk2IC1NIgorICAgICItdEUgLWVxRSAtdmNCYWw6LTk2IC1NIgorICAgICItdEUgLWVxRSAtdmNCYWw6MCAtTSIKKyAgICAiLXRFIC1lcUUgLWJFIC12Y0JhbDozMCAtTSIKKykKKworZnNfYXJyPSgKKyAgICA4MDAwCisgICAgMTEwMjUKKyAgICAxMjAwMAorICAgIDE2MDAwCisgICAgMjIwNTAKKyAgICAyNDAwMAorICAgIDMyMDAwCisgICAgNDQxMDAKKyAgICA0ODAwMAorICAgIDg4MjAwCisgICAgOTYwMDAKKyAgICAxNzY0MDAKKyAgICAxOTIwMDAKKykKKworIyBydW4gbXVsdGljaGFubmVsIGVmZmVjdHMgYXQgZGlmZmVyZW50IGNvbmZpZ3MsIHNhdmluZyBvbmx5IHRoZSBzdGVyZW8gY2hhbm5lbAorIyBwYWlyLgorZXJyb3JfY291bnQ9MAorZm9yIGNtZCBpbiAiJHtjbWRzW0BdfSIKK2RvCisgICAgJGNtZAorICAgIGZvciBmbGFncyBpbiAiJHtmbGFnc19hcnJbQF19IgorICAgIGRvCisgICAgICAgIGZvciBmcyBpbiAke2ZzX2FyclsqXX0KKyAgICAgICAgZG8KKyAgICAgICAgICAgIGZvciBjaE1hc2sgaW4gezAuLjIyfQorICAgICAgICAgICAgZG8KKyAgICAgICAgICAgICAgICBhZGIgc2hlbGwgJHRlc3RkaXIvbHZtdGVzdCAtaTokdGVzdGRpci9zaW5lc3dlZXByYXcucmF3IFwKKyAgICAgICAgICAgICAgICAgICAgLW86JHRlc3RkaXIvc2luZXN3ZWVwXyQoKGNoTWFzaykpXyQoKGZzKSkucmF3IC1jaE1hc2s6JGNoTWFzayAtZnM6JGZzICRmbGFncworCisgICAgICAgICAgICAgICAgc2hlbGxfcmV0PSQ/CisgICAgICAgICAgICAgICAgaWYgWyAkc2hlbGxfcmV0IC1uZSAwIF07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgZWNobyAiZXJyb3I6ICRzaGVsbF9yZXQiCisgICAgICAgICAgICAgICAgICAgICgoKytlcnJvcl9jb3VudCkpCisgICAgICAgICAgICAgICAgZmkKKworCisgICAgICAgICAgICAgICAgIyB0d28gY2hhbm5lbCBmaWxlcyBzaG91bGQgYmUgaWRlbnRpY2FsIHRvIGhpZ2hlciBjaGFubmVsCisgICAgICAgICAgICAgICAgIyBjb21wdXRhdGlvbiAoZmlyc3QgMiBjaGFubmVscykuCisgICAgICAgICAgICAgICAgIyBEbyBub3QgY29tcGFyZSBjYXNlcyB3aGVyZSAtYkUgaXMgaW4gZmxhZ3MgKGR1ZSB0byBtb25vIGNvbXB1dGF0aW9uKQorICAgICAgICAgICAgICAgIGlmIFtbICRmbGFncyAhPSAqIi1iRSIqIF1dICYmIFtbICIkY2hNYXNrIiAtZ3QgMSBdXQorICAgICAgICAgICAgICAgIHRoZW4KKyAgICAgICAgICAgICAgICAgICAgYWRiIHNoZWxsIGNtcCAkdGVzdGRpci9zaW5lc3dlZXBfMV8kKChmcykpLnJhdyBcCisgICAgICAgICAgICAgICAgICAgICAgICAkdGVzdGRpci9zaW5lc3dlZXBfJCgoY2hNYXNrKSlfJCgoZnMpKS5yYXcKKyAgICAgICAgICAgICAgICBlbGlmIFtbICRmbGFncyA9PSAqIi1iRSIqIF1dICYmIFtbICIkY2hNYXNrIiAtZ3QgMSBdXQorICAgICAgICAgICAgICAgIHRoZW4KKyAgICAgICAgICAgICAgICAgICAgYWRiIHNoZWxsICR0ZXN0ZGlyL3NuciAkdGVzdGRpci9zaW5lc3dlZXBfMV8kKChmcykpLnJhdyBcCisgICAgICAgICAgICAgICAgICAgICAgICAkdGVzdGRpci9zaW5lc3dlZXBfJCgoY2hNYXNrKSlfJCgoZnMpKS5yYXcgLXRocjo5MC4zMDg5OTgKKyAgICAgICAgICAgICAgICBmaQorCisgICAgICAgICAgICAgICAgIyBib3RoIGNtcCBhbmQgc25yIHJldHVybiBFWElUX0ZBSUxVUkUgb24gbWlzbWF0Y2guCisgICAgICAgICAgICAgICAgc2hlbGxfcmV0PSQ/CisgICAgICAgICAgICAgICAgaWYgWyAkc2hlbGxfcmV0IC1uZSAwIF07IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgZWNobyAiZXJyb3I6ICRzaGVsbF9yZXQiCisgICAgICAgICAgICAgICAgICAgICgoKytlcnJvcl9jb3VudCkpCisgICAgICAgICAgICAgICAgZmkKKyAgICAgICAgICAgIGRvbmUKKyAgICAgICAgZG9uZQorICAgIGRvbmUKK2RvbmUKKworYWRiIHNoZWxsIHJtIC1yICR0ZXN0ZGlyCitlY2hvICIkZXJyb3JfY291bnQgZXJyb3JzIgorZXhpdCAkZXJyb3JfY291bnQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2x2bXRlc3QuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvbHZtdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI1OGRkMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2x2bXRlc3QuY3BwCkBAIC0wLDAgKzEsODI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9jaGFubmVscy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKKyNpbmNsdWRlICJFZmZlY3RCdW5kbGUuaCIKKyNpbmNsdWRlICJMVk1fUHJpdmF0ZS5oIgorCisjaWZkZWYgVkVSWV9WRVJZX1ZFUkJPU0VfTE9HR0lORworI2RlZmluZSBBTE9HVlYgQUxPR1YKKyNlbHNlCisjZGVmaW5lIEFMT0dWVihhLi4uKSBcCisgIGRvIHsgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKGZhbHNlKQorI2VuZGlmCisKKyNkZWZpbmUgQ0hFQ0tfQVJHKGNvbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICghKGNvbmQpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIEFMT0dFKCJcdExWTV9FUlJPUiA6IEludmFsaWQgYXJndW1lbnQ6ICIgI2NvbmQpOyBcCisgICAgICByZXR1cm4gLUVJTlZBTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgXAorfQorCisjZGVmaW5lIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKSAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZNX05VTExBRERSRVNTKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBBTE9HRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAibnVsbCBwb2ludGVyIHJldHVybmVkIGJ5ICVzIGluICVzXG5cblxuXG4iLCAgICAgICAgICBcCisgICAgICAgICAgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZNX0FMSUdOTUVOVEVSUk9SKSB7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICBBTE9HRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAiYmFkIGFsaWdubWVudCByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgICAgICAgICBcCisgICAgICAgICAgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZNX0lOVkFMSUROVU1TQU1QTEVTKSB7ICAgICAgICAgICAgICAgICBcCisgICAgICBBTE9HRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAiYmFkIG51bWJlciBvZiBzYW1wbGVzIHJldHVybmVkIGJ5ICVzIGluICVzXG5cblxuXG4iLCBcCisgICAgICAgICAgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKEx2bVN0YXR1cykgPT0gTFZNX09VVE9GUkFOR0UpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBBTE9HRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICJcdExWTV9FUlJPUiA6IFBhcmFtZXRlciBlcnJvciAtICIgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAib3V0IG9mIHJhbmdlIHJldHVybmVkIGJ5ICVzIGluICVzXG4iLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgY2FsbGluZ0Z1bmMsIGNhbGxlZEZ1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCitzdHJ1Y3QgbHZtQ29uZmlnUGFyYW1zX3QgeworICBpbnQgICAgICAgICAgICAgIHNhbXBsaW5nRnJlcSAgICA9IDQ0MTAwOworICBpbnQgICAgICAgICAgICAgIG5yQ2hhbm5lbHMgICAgICA9IDI7CisgIGludCAgICAgICAgICAgICAgY2hNYXNrICAgICAgICAgID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICBpbnQgICAgICAgICAgICAgIHZjQmFsICAgICAgICAgICA9IDA7CisgIGludCAgICAgICAgICAgICAgZkNoYW5uZWxzICAgICAgID0gMjsKKyAgYm9vbCAgICAgICAgICAgICBtb25vTW9kZSAgICAgICAgPSBmYWxzZTsKKyAgaW50ICAgICAgICAgICAgICBiYXNzRWZmZWN0TGV2ZWwgPSAwOworICBpbnQgICAgICAgICAgICAgIGVxUHJlc2V0TGV2ZWwgICA9IDA7CisgIGludCAgICAgICAgICAgICAgZnJhbWVMZW5ndGggICAgID0gMjU2OworICBMVk1fQkVfTW9kZV9lbiAgIGJhc3NFbmFibGUgICAgICA9IExWTV9CRV9PRkY7CisgIExWTV9URV9Nb2RlX2VuICAgdHJlYmxlRW5hYmxlICAgID0gTFZNX1RFX09GRjsKKyAgTFZNX0VRTkJfTW9kZV9lbiBlcUVuYWJsZSAgICAgICAgPSBMVk1fRVFOQl9PRkY7CisgIExWTV9Nb2RlX2VuICAgICAgY3NFbmFibGUgICAgICAgID0gTFZNX01PREVfT0ZGOworfTsKKworY29uc3RleHByIGF1ZGlvX2NoYW5uZWxfbWFza190IGx2bUNvbmZpZ0NoTWFza1tdID0geworICAgIEFVRElPX0NIQU5ORUxfT1VUX01PTk8sCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDEsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMFBPSU5UMiwKKyAgICBBVURJT19DSEFOTkVMX09VVF9RVUFELAorICAgIEFVRElPX0NIQU5ORUxfT1VUX1FVQURfQkFDSywKKyAgICBBVURJT19DSEFOTkVMX09VVF9RVUFEX1NJREUsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfU1VSUk9VTkQsCisgICAgKDEgPDwgNCkgLSAxLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDFQT0lOVDIsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMFBPSU5UMiwKKyAgICBBVURJT19DSEFOTkVMX09VVF9QRU5UQSwKKyAgICAoMSA8PCA1KSAtIDEsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMVBPSU5UMiwKKyAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfQkFDSywKKyAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX1NJREUsCisgICAgKDEgPDwgNikgLSAxLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzZQT0lOVDEsCisgICAgKDEgPDwgNykgLSAxLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFQT0lOVDIsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSwKKyAgICAoMSA8PCA4KSAtIDEsCit9OworCisKK3ZvaWQgcHJpbnRVc2FnZSgpIHsKKyAgcHJpbnRmKCJcblVzYWdlOiAiKTsKKyAgcHJpbnRmKCJcbiAgICAgPGV4ZWN1dGFibGU+IC1pOjxpbnB1dF9maWxlPiAtbzo8b3V0X2ZpbGU+IFtvcHRpb25zXVxuIik7CisgIHByaW50ZigiXG53aGVyZSwgXG4gICAgIDxpbnB1dGZpbGU+ICBpcyB0aGUgaW5wdXQgZmlsZSBuYW1lIik7CisgIHByaW50ZigiXG4gICAgICAgICAgICAgICAgICBvbiB3aGljaCBMVk0gZWZmZWN0cyBhcmUgYXBwbGllZCIpOworICBwcmludGYoIlxuICAgICA8b3V0cHV0ZmlsZT4gcHJvY2Vzc2VkIG91dHB1dCBmaWxlIik7CisgIHByaW50ZigiXG4gICAgIGFuZCBvcHRpb25zIGFyZSBtZW50aW9uZWQgYmVsb3ciKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIlxuICAgICAtaGVscCAob3IpIC1oIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIFByaW50cyB0aGlzIHVzYWdlIGluZm9ybWF0aW9uIik7CisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCJcbiAgICAgLWNoTWFzazo8Y2hhbm5lbF9tYXNrPlxuIik7CisgIHByaW50ZigiXG4gICAgICAgICAwICAtIEFVRElPX0NIQU5ORUxfT1VUX01PTk8iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDEgIC0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIik7CisgIHByaW50ZigiXG4gICAgICAgICAyICAtIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDEiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDMgIC0gQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMFBPSU5UMiIpOworICBwcmludGYoIlxuICAgICAgICAgNCAgLSBBVURJT19DSEFOTkVMX09VVF9RVUFEIik7CisgIHByaW50ZigiXG4gICAgICAgICA1ICAtIEFVRElPX0NIQU5ORUxfT1VUX1FVQURfQkFDSyIpOworICBwcmludGYoIlxuICAgICAgICAgNiAgLSBBVURJT19DSEFOTkVMX09VVF9RVUFEX1NJREUiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDcgIC0gQVVESU9fQ0hBTk5FTF9PVVRfU1VSUk9VTkQiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDggIC0gY2Fub25pY2FsIGNoYW5uZWwgaW5kZXggbWFzayBmb3IgNCBjaDogKDEgPDwgNCkgLSAxIik7CisgIHByaW50ZigiXG4gICAgICAgICA5ICAtIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDFQT0lOVDIiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDEwIC0gQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMFBPSU5UMiIpOworICBwcmludGYoIlxuICAgICAgICAgMTEgLSBBVURJT19DSEFOTkVMX09VVF9QRU5UQSIpOworICBwcmludGYoIlxuICAgICAgICAgMTIgLSBjYW5vbmljYWwgY2hhbm5lbCBpbmRleCBtYXNrIGZvciA1IGNoOiAoMSA8PCA1KSAtIDEiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDEzIC0gQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMVBPSU5UMiIpOworICBwcmludGYoIlxuICAgICAgICAgMTQgLSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxIik7CisgIHByaW50ZigiXG4gICAgICAgICAxNSAtIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFfQkFDSyIpOworICBwcmludGYoIlxuICAgICAgICAgMTYgLSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX1NJREUiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDE3IC0gY2Fub25pY2FsIGNoYW5uZWwgaW5kZXggbWFzayBmb3IgNiBjaDogKDEgPDwgNikgLSAxIik7CisgIHByaW50ZigiXG4gICAgICAgICAxOCAtIEFVRElPX0NIQU5ORUxfT1VUXzZQT0lOVDEiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDE5IC0gY2Fub25pY2FsIGNoYW5uZWwgaW5kZXggbWFzayBmb3IgNyBjaDogKDEgPDwgNykgLSAxIik7CisgIHByaW50ZigiXG4gICAgICAgICAyMCAtIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFQT0lOVDIiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDIxIC0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSIpOworICBwcmludGYoIlxuICAgICAgICAgMjIgLSBjYW5vbmljYWwgY2hhbm5lbCBpbmRleCBtYXNrIGZvciA4IGNoOiAoMSA8PCA4KSAtIDEiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIGRlZmF1bHQgMCIpOworICBwcmludGYoIlxuICAgICAtdmNCYWw6PExlZnQgUmlnaHQgQmFsYW5jZSBjb250cm9sIGluIGRCIFstOTYgdG8gOTYgZEJdPiIpOworICBwcmludGYoIlxuICAgICAgICAgICAgLXZlIHZhbHVlcyByZWR1Y2UgUmlnaHQgY2hhbm5lbCB3aGlsZSArdmUgdmFsdWUgcmVkdWNlcyBMZWZ0IGNoYW5uZWwiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgICAgICAgZGVmYXVsdCAwIik7CisgIHByaW50ZigiXG4gICAgIC1mY2g6PGZpbGVfY2hhbm5lbHM+ICgxIHRocm91Z2ggOClcblxuIik7CisgIHByaW50ZigiXG4gICAgIC1NIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIE1vbm8gbW9kZSAoZm9yY2UgYWxsIGlucHV0IGF1ZGlvIGNoYW5uZWxzIHRvIGJlIGlkZW50aWNhbCkiKTsKKyAgcHJpbnRmKCJcbiAgICAgLWJhc3Nsdmw6PGVmZmVjdF9sZXZlbD4iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgQSB2YWx1ZSB0aGF0IHJhbmdlcyBiZXR3ZWVuICVkIC0gJWQgZGVmYXVsdCAwIiwgTFZNX0JFX01JTl9FRkZFQ1RMRVZFTCwKKyAgICBMVk1fQkVfTUFYX0VGRkVDVExFVkVMKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIlxuICAgICAtZXFQcmVzZXQ6PHByZXNldCBWYWx1ZT4iKTsKKyAgY29uc3Qgc2l6ZV90IG51bVByZXNldEx2bHMgID0gc3RkOjpzaXplKGdFcXVhbGl6ZXJQcmVzZXRzKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1QcmVzZXRMdmxzOyArK2kpIHsKKyAgICBwcmludGYoIlxuICAgICAgICAgICAlenUgLSAlcyIsIGksIGdFcXVhbGl6ZXJQcmVzZXRzW2ldLm5hbWUpOworICB9CisgIHByaW50ZigiXG4gICAgICAgICAgIGRlZmF1bHQgLSAwIik7CisgIHByaW50ZigiXG4gICAgIC1iRSAiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgRW5hYmxlIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgIC10RSAiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgRW5hYmxlIFRyZWJsZSBCb29zdCIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgIC1jc0UgIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBDb25jZXJ0IFN1cnJvdW5kIik7CisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCJcbiAgICAgLWVxRSAiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgRW5hYmxlIEVxdWFsaXplciIpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEx2bUVmZmVjdF9mcmVlKCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZTogRnJlZSBhbGwgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgQnVuZGxlLgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkIEx2bUVmZmVjdF9mcmVlKHN0cnVjdCBFZmZlY3RDb250ZXh0ICpwQ29udGV4dCkgeworICBMVk1fUmV0dXJuU3RhdHVzX2VuIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICBMVk1fTWVtVGFiX3QgTWVtVGFiOworCisgIC8qIEZyZWUgdGhlIGFsZ29yaXRobSBtZW1vcnkgKi8KKyAgTHZtU3RhdHVzID0gTFZNX0dldE1lbW9yeVRhYmxlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgJk1lbVRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9OVUxMKTsKKworICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldE1lbW9yeVRhYmxlIiwgIkx2bUVmZmVjdF9mcmVlIikKKworICBmb3IgKGludCBpID0gMDsgaSA8IExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKSB7CisgICAgaWYgKE1lbVRhYi5SZWdpb25baV0uU2l6ZSAhPSAwKSB7CisgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgIT0gTlVMTCkgeworICAgICAgICBBTE9HVigiXHRMdm1FZmZlY3RfZnJlZSAtIFNUQVJUIGZyZWVpbmcgJSIgUFJJdTMyCisgICAgICAgICAgICAgICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcFxuIiwKKyAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CisKKyAgICAgICAgZnJlZShNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CisKKyAgICAgICAgQUxPR1YoIlx0THZtRWZmZWN0X2ZyZWUgLSBFTkQgICBmcmVlaW5nICUiIFBSSXUzMgorICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCisgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoCisgICAgICAgICAgICAiXHRMVk1fRVJST1IgOiBMdm1FZmZlY3RfZnJlZSAtIHRyeWluZyB0byBmcmVlIHdpdGggTlVMTCBwb2ludGVyICIKKyAgICAgICAgICAgICIlIiBQUkl1MzIgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwIEVSUk9SXG4iLAorICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CisgICAgICB9CisgICAgfQorICB9Cit9IC8qIGVuZCBMdm1FZmZlY3RfZnJlZSAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEx2bUJ1bmRsZV9pbml0KCkKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUHVycG9zZTogSW5pdGlhbGl6ZSBlbmdpbmUgd2l0aCBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sIGNyZWF0ZXMgaW5zdGFuY2UKKy8vIHdpdGggYWxsIGVmZmVjdHMgZGlzYWJsZWQuCisvLworLy8gSW5wdXRzOgorLy8gIHBDb250ZXh0OiAgIGVmZmVjdCBlbmdpbmUgY29udGV4dAorLy8KKy8vIE91dHB1dHM6CisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ludCBMdm1CdW5kbGVfaW5pdChzdHJ1Y3QgRWZmZWN0Q29udGV4dCAqcENvbnRleHQsIExWTV9Db250cm9sUGFyYW1zX3QgKnBhcmFtcykgeworICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBzdGFydCIpOworCisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuZm9ybWF0ID0gRUZGRUNUX0JVRkZFUl9GT1JNQVQ7CisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKKyAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKKyAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOworICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKKyAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEU7CisgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVDsKKyAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CisgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CisgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLnJlbGVhc2VCdWZmZXIgPSBOVUxMOworICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOworICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CisKKyAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSAhPSBOVUxMKSB7CisgICAgQUxPR1YoCisgICAgICAgICJcdEx2bUJ1bmRsZV9pbml0IHBDb250ZXh0LT5wQmFzc0Jvb3N0ICE9IE5VTEwgIgorICAgICAgICAiLT4gQ2FsbGluZyBwQ29udGV4dC0+cEJhc3NCb29zdC0+ZnJlZSgpIik7CisKKyAgICBMdm1FZmZlY3RfZnJlZShwQ29udGV4dCk7CisKKyAgICBBTE9HVigKKyAgICAgICAgIlx0THZtQnVuZGxlX2luaXQgcENvbnRleHQtPnBCYXNzQm9vc3QgIT0gTlVMTCAiCisgICAgICAgICItPiBDYWxsZWQgcENvbnRleHQtPnBCYXNzQm9vc3QtPmZyZWUoKSIpOworICB9CisKKyAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgTFZNX0luc3RQYXJhbXNfdCBJbnN0UGFyYW1zOyAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgcGFyYW1ldGVycyAqLworICBMVk1fRVFOQl9CYW5kRGVmX3QgQmFuZERlZnNbTUFYX05VTV9CQU5EU107ICAvKiBFcXVhbGlzZXIgYmFuZCBkZWZpbml0aW9ucyAqLworICBMVk1fSGVhZHJvb21QYXJhbXNfdCBIZWFkcm9vbVBhcmFtczsgICAgICAgICAvKiBIZWFkcm9vbSBwYXJhbWV0ZXJzICovCisgIExWTV9IZWFkcm9vbUJhbmREZWZfdCBIZWFkcm9vbUJhbmREZWZbTFZNX0hFQURST09NX01BWF9OQkFORFNdOworICBMVk1fTWVtVGFiX3QgTWVtVGFiOyAvKiBNZW1vcnkgYWxsb2NhdGlvbiB0YWJsZSAqLworICBib29sIGJNYWxsb2NGYWlsdXJlID0gTFZNX0ZBTFNFOworCisgIC8qIFNldCB0aGUgY2FwYWJpbGl0aWVzICovCisgIEluc3RQYXJhbXMuQnVmZmVyTW9kZSA9IExWTV9VTk1BTkFHRURfQlVGRkVSUzsKKyAgSW5zdFBhcmFtcy5NYXhCbG9ja1NpemUgPSBNQVhfQ0FMTF9TSVpFOworICBJbnN0UGFyYW1zLkVRTkJfTnVtQmFuZHMgPSBNQVhfTlVNX0JBTkRTOworICBJbnN0UGFyYW1zLlBTQV9JbmNsdWRlZCA9IExWTV9QU0FfT047CisKKyAgLyogQWxsb2NhdGUgbWVtb3J5LCBmb3JjaW5nIGFsaWdubWVudCAqLworICBMdm1TdGF0dXMgPSBMVk1fR2V0TWVtb3J5VGFibGUoTFZNX05VTEwsICZNZW1UYWIsICZJbnN0UGFyYW1zKTsKKworICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldE1lbW9yeVRhYmxlIiwgIkx2bUJ1bmRsZV9pbml0Iik7CisgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgIEFMT0dWKCJcdENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCBMVk1fR2V0TWVtb3J5VGFibGVcbiIpOworCisgIC8qIEFsbG9jYXRlIG1lbW9yeSAqLworICBmb3IgKGludCBpID0gMDsgaSA8IExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKSB7CisgICAgaWYgKE1lbVRhYi5SZWdpb25baV0uU2l6ZSAhPSAwKSB7CisgICAgICBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9IG1hbGxvYyhNZW1UYWIuUmVnaW9uW2ldLlNpemUpOworCisgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgQUxPR0UoCisgICAgICAgICAgICAiXHRMVk1fRVJST1IgOkx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAiCisgICAgICAgICAgICAiJSIgUFJJdTMyICIgYnl0ZXMgZm9yIHJlZ2lvbiAldVxuIiwKKyAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSk7CisgICAgICAgIGJNYWxsb2NGYWlsdXJlID0gTFZNX1RSVUU7CisgICAgICAgIGJyZWFrOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgYWxsb2NhdGVkICUiIFBSSXUzMgorICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCisgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8qIElmIG9uZSBvciBtb3JlIG9mIHRoZSBtZW1vcnkgcmVnaW9ucyBmYWlsZWQgdG8gYWxsb2NhdGUsIGZyZWUgdGhlIHJlZ2lvbnMKKyAgICogdGhhdCB3ZXJlCisgICAqIHN1Y2Nlc2Z1bGx5IGFsbG9jYXRlZCBhbmQgcmV0dXJuIHdpdGggYW4gZXJyb3IKKyAgICovCisgIGlmIChiTWFsbG9jRmFpbHVyZSA9PSBMVk1fVFJVRSkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspIHsKKyAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyA9PSBMVk1fTlVMTCkgeworICAgICAgICBBTE9HRSgKKyAgICAgICAgICAgICJcdExWTV9FUlJPUiA6THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkIHRvIGFsbG9jYXRlICIKKyAgICAgICAgICAgICIlIiBQUkl1MzIgIiBieXRlcyBmb3IgcmVnaW9uICV1IE5vdCBmcmVlaW5nXG4iLAorICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKAorICAgICAgICAgICAgIlx0TFZNX0VSUk9SIDpMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQ6IGJ1dCBhbGxvY2F0ZWQgIgorICAgICAgICAgICAgIiUiIFBSSXUzMiAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXAtIGZyZWVcbiIsCisgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKKyAgICAgICAgZnJlZShNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAtRUlOVkFMOworICB9CisgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IG1hbGxvYydkIG1lbW9yeVxuIik7CisKKyAgLyogSW5pdGlhbGlzZSAqLworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UgPSBMVk1fTlVMTDsKKworICAvKiBJbml0IHNldHMgdGhlIGluc3RhbmNlIGhhbmRsZSAqLworICBMdm1TdGF0dXMgPSBMVk1fR2V0SW5zdGFuY2VIYW5kbGUoJnBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNZW1UYWIsICZJbnN0UGFyYW1zKTsKKworICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX0dldEluc3RhbmNlSGFuZGxlIiwgIkx2bUJ1bmRsZV9pbml0Iik7CisgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgIEFMT0dWKAorICAgICAgIlx0THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgU3VjY2VzZnVsbHkgY2FsbGVkICIKKyAgICAgICJMVk1fR2V0SW5zdGFuY2VIYW5kbGVcbiIpOworCisgIC8qIFNldCB0aGUgaW5pdGlhbCBwcm9jZXNzIHBhcmFtZXRlcnMgKi8KKyAgLyogR2VuZXJhbCBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+T3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX09OOworICBwYXJhbXMtPlNhbXBsZVJhdGUgPSBMVk1fRlNfNDQxMDA7CisgIHBhcmFtcy0+U291cmNlRm9ybWF0ID0gTFZNX1NURVJFTzsKKyAgcGFyYW1zLT5DaE1hc2sgICAgICAgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgIHBhcmFtcy0+U3BlYWtlclR5cGUgPSBMVk1fSEVBRFBIT05FUzsKKworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVSYXRlID0gTFZNX0ZTXzQ0MTAwOworCisgIC8qIENvbmNlcnQgU291bmQgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX09GRjsKKyAgcGFyYW1zLT5WaXJ0dWFsaXplclR5cGUgPSBMVk1fQ09OQ0VSVFNPVU5EOworICBwYXJhbXMtPlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWwgPSAxMDA7CisgIHBhcmFtcy0+Q1NfRWZmZWN0TGV2ZWwgPSBMVk1fQ1NfRUZGRUNUX05PTkU7CisKKyAgLyogTi1CYW5kIEVxdWFsaXNlciBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+RVFOQl9PcGVyYXRpbmdNb2RlID0gTFZNX0VRTkJfT047CisgIHBhcmFtcy0+RVFOQl9OQmFuZHMgPSBGSVZFQkFORF9OVU1CQU5EUzsKKyAgcGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbiA9ICZCYW5kRGVmc1swXTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKKyAgICBCYW5kRGVmc1tpXS5GcmVxdWVuY3kgPSBFUU5CXzVCYW5kUHJlc2V0c0ZyZXF1ZW5jaWVzW2ldOworICAgIEJhbmREZWZzW2ldLlFGYWN0b3IgPSBFUU5CXzVCYW5kUHJlc2V0c1FGYWN0b3JzW2ldOworICAgIEJhbmREZWZzW2ldLkdhaW4gPSBFUU5CXzVCYW5kU29mdFByZXNldHNbaV07CisgIH0KKworICAvKiBWb2x1bWUgQ29udHJvbCBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+VkNfRWZmZWN0TGV2ZWwgPSAwOworICBwYXJhbXMtPlZDX0JhbGFuY2UgPSAwOworCisgIC8qIFRyZWJsZSBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+VEVfT3BlcmF0aW5nTW9kZSA9IExWTV9URV9PRkY7CisgIHBhcmFtcy0+VEVfRWZmZWN0TGV2ZWwgPSAwOworCisgIC8qIFBTQSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5QU0FfRW5hYmxlID0gTFZNX1BTQV9PRkY7CisgIHBhcmFtcy0+UFNBX1BlYWtEZWNheVJhdGUgPSAoTFZNX1BTQV9EZWNheVNwZWVkX2VuKTA7CisKKyAgLyogQmFzcyBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+QkVfT3BlcmF0aW5nTW9kZSA9IExWTV9CRV9PTjsKKyAgcGFyYW1zLT5CRV9FZmZlY3RMZXZlbCA9IDA7CisgIHBhcmFtcy0+QkVfQ2VudHJlRnJlcSA9IExWTV9CRV9DRU5UUkVfOTBIejsKKyAgcGFyYW1zLT5CRV9IUEYgPSBMVk1fQkVfSFBGX09OOworCisgIC8qIFBTQSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5QU0FfRW5hYmxlID0gTFZNX1BTQV9PRkY7CisgIHBhcmFtcy0+UFNBX1BlYWtEZWNheVJhdGUgPSBMVk1fUFNBX1NQRUVEX01FRElVTTsKKworICAvKiBURSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5URV9PcGVyYXRpbmdNb2RlID0gTFZNX1RFX09GRjsKKyAgcGFyYW1zLT5URV9FZmZlY3RMZXZlbCA9IDA7CisKKyAgLyogQWN0aXZhdGUgdGhlIGluaXRpYWwgc2V0dGluZ3MgKi8KKyAgTHZtU3RhdHVzID0KKyAgICAgIExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsIHBhcmFtcyk7CisKKyAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVycyIsICJMdm1CdW5kbGVfaW5pdCIpOworICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICBBTE9HVigKKyAgICAgICJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCAiCisgICAgICAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKKworICAvKiBTZXQgdGhlIGhlYWRyb29tIHBhcmFtZXRlcnMgKi8KKyAgSGVhZHJvb21CYW5kRGVmWzBdLkxpbWl0X0xvdyA9IDIwOworICBIZWFkcm9vbUJhbmREZWZbMF0uTGltaXRfSGlnaCA9IDQ5OTk7CisgIEhlYWRyb29tQmFuZERlZlswXS5IZWFkcm9vbV9PZmZzZXQgPSAwOworICBIZWFkcm9vbUJhbmREZWZbMV0uTGltaXRfTG93ID0gNTAwMDsKKyAgSGVhZHJvb21CYW5kRGVmWzFdLkxpbWl0X0hpZ2ggPSAyNDAwMDsKKyAgSGVhZHJvb21CYW5kRGVmWzFdLkhlYWRyb29tX09mZnNldCA9IDA7CisgIEhlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb24gPSAmSGVhZHJvb21CYW5kRGVmWzBdOworICBIZWFkcm9vbVBhcmFtcy5IZWFkcm9vbV9PcGVyYXRpbmdNb2RlID0gTFZNX0hFQURST09NX09OOworICBIZWFkcm9vbVBhcmFtcy5OSGVhZHJvb21CYW5kcyA9IDI7CisKKyAgTHZtU3RhdHVzID0gTFZNX1NldEhlYWRyb29tUGFyYW1zKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZIZWFkcm9vbVBhcmFtcyk7CisKKyAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9TZXRIZWFkcm9vbVBhcmFtcyIsICJMdm1CdW5kbGVfaW5pdCIpOworICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICBBTE9HVigKKyAgICAgICJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCAiCisgICAgICAiTFZNX1NldEhlYWRyb29tUGFyYW1zXG4iKTsKKyAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgRW5kIik7CisgIHJldHVybiAwOworfSAvKiBlbmQgTHZtQnVuZGxlX2luaXQgKi8KKworaW50IGx2bUNyZWF0ZShzdHJ1Y3QgRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCisgICAgICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtc190ICAgICpwbHZtQ29uZmlnUGFyYW1zLAorICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAqcGFyYW1zKSB7CisgIGludCByZXQgPSAwOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0ID0gTlVMTDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCA9IChCdW5kbGVkRWZmZWN0Q29udGV4dCAqKW1hbGxvYyhzaXplb2Yoc3RydWN0IEJ1bmRsZWRFZmZlY3RDb250ZXh0KSk7CisgIGlmIChOVUxMID09IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQpIHsKKyAgICByZXR1cm4gLUVJTlZBTDsKKyAgfQorCisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25ObyA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNlc3Npb25JZCA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSA9IE5VTEw7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWb2x1bWVFbmFibGVkID0gTFZNX0ZBTFNFOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iRXF1YWxpemVyRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NFbmFibGVkID0gTFZNX0ZBTFNFOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc1RlbXBEaXNhYmxlZCA9IExWTV9GQUxTRTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyVGVtcERpc2FibGVkID0gTFZNX0ZBTFNFOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uT3V0cHV0RGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPm5WaXJ0dWFsaXplckZvcmNlZERldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQgPSAwOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5maXJzdFZvbHVtZSA9IExWTV9UUlVFOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT52b2x1bWUgPSAwOworCisgIC8qIFNhdmVkIHN0cmVuZ3RoIGlzIHVzZWQgdG8gcmV0dXJuIHRoZSBleGFjdCBzdHJlbmd0aCB0aGF0IHdhcyB1c2VkIGluIHRoZQorICAgKiBzZXQgdG8gdGhlIGdldAorICAgKiBiZWNhdXNlIHdlIG1hcCB0aGUgb3JpZ2luYWwgc3RyZW5ndGggcmFuZ2Ugb2YgMDoxMDAwIHRvIDE6MTUsIGFuZCB0aGlzIHdpbGwKKyAgICogYXZvaWQKKyAgICogcXVhbnRpc2F0aW9uIGxpa2UgZWZmZWN0IHdoZW4gcmV0dXJuaW5nCisgICAqLworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5CYXNzU3RyZW5ndGhTYXZlZCA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlZpcnRTdHJlbmd0aFNhdmVkID0gMDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Q3VyUHJlc2V0ID0gUFJFU0VUX0NVU1RPTTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+bGV2ZWxTYXZlZCA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJNdXRlRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlN0ZXJlb1Bvc2l0aW9uRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgPSBOVUxMOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5mcmFtZUNvdW50ID0gLTE7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgPSAwOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEVxID0gMDsKKyNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiAhZGVmaW5lZChOQVRJVkVfRkxPQVRfQlVGRkVSKQorICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgPSBOVUxMOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyID0gTlVMTDsKKyNlbmRpZgorICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iYW5kR2FpbmRCW2ldID0gRVFOQl81QmFuZFNvZnRQcmVzZXRzW2ldOworICB9CisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBwbHZtQ29uZmlnUGFyYW1zLT5uckNoYW5uZWxzOworICBBTE9HVigiXHRFZmZlY3RDcmVhdGUgLSBDYWxsaW5nIEx2bUJ1bmRsZV9pbml0Iik7CisgIHJldCA9IEx2bUJ1bmRsZV9pbml0KHBDb250ZXh0LCBwYXJhbXMpOworCisgIGlmIChyZXQgPCAwKSB7CisgICAgQUxPR0UoIlx0TFZNX0VSUk9SIDogbHZtQ3JlYXRlKCkgQnVuZGxlIGluaXQgZmFpbGVkIik7CisgICAgcmV0dXJuIHJldDsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IGx2bUNvbnRyb2woc3RydWN0IEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAorICAgICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zX3QgICAgKnBsdm1Db25maWdQYXJhbXMsCisgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAqcGFyYW1zKSB7CisgIExWTV9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisKKyAgLyogU2V0IHRoZSBpbml0aWFsIHByb2Nlc3MgcGFyYW1ldGVycyAqLworICAvKiBHZW5lcmFsIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5PcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT047CisgIHBhcmFtcy0+U3BlYWtlclR5cGUgPSBMVk1fSEVBRFBIT05FUzsKKworICBwYXJhbXMtPkNoTWFzayAgICAgPSBwbHZtQ29uZmlnUGFyYW1zLT5jaE1hc2s7CisgIHBhcmFtcy0+TnJDaGFubmVscyA9IHBsdm1Db25maWdQYXJhbXMtPm5yQ2hhbm5lbHM7CisgIGlmIChwYXJhbXMtPk5yQ2hhbm5lbHMgPT0gMSkgeworICAgIHBhcmFtcy0+U291cmNlRm9ybWF0ID0gTFZNX01PTk87CisgIH0gZWxzZSBpZiAocGFyYW1zLT5OckNoYW5uZWxzID09IDIpIHsKKyAgICBwYXJhbXMtPlNvdXJjZUZvcm1hdCA9IExWTV9TVEVSRU87CisgIH0gZWxzZSBpZiAocGFyYW1zLT5OckNoYW5uZWxzID4gMiAmJiBwYXJhbXMtPk5yQ2hhbm5lbHMgPD0gOCkgeyAvLyBGQ0NfMiBGQ0NfOAorICAgIHBhcmFtcy0+U291cmNlRm9ybWF0ID0gTFZNX01VTFRJQ0hBTk5FTDsKKyAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAtRUlOVkFMOworICB9CisKKyAgTFZNX0ZzX2VuIHNhbXBsZVJhdGU7CisgIHN3aXRjaCAocGx2bUNvbmZpZ1BhcmFtcy0+c2FtcGxpbmdGcmVxKSB7CisgICAgY2FzZSA4MDAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU184MDAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxMTAyNToKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfMTEwMjU7CisgICAgICBicmVhazsKKyAgICBjYXNlIDEyMDAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU18xMjAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTYwMDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzE2MDAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSAyMjA1MDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfMjIwNTA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI0MDAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU18yNDAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzIwMDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzMyMDAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSA0NDEwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfNDQxMDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ4MDAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU180ODAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgODgyMDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzg4MjAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSA5NjAwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfOTYwMDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE3NjQwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfMTc2NDAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxOTIwMDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzE5MjAwMDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgfQorICBwYXJhbXMtPlNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworCisgIC8qIENvbmNlcnQgU291bmQgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSA9IHBsdm1Db25maWdQYXJhbXMtPmNzRW5hYmxlOworICBwYXJhbXMtPlZpcnR1YWxpemVyVHlwZSA9IExWTV9DT05DRVJUU09VTkQ7CisgIHBhcmFtcy0+VmlydHVhbGl6ZXJSZXZlcmJMZXZlbCA9IDEwMDsKKyAgcGFyYW1zLT5DU19FZmZlY3RMZXZlbCA9IExWTV9DU19FRkZFQ1RfTk9ORTsKKworICAvKiBOLUJhbmQgRXF1YWxpc2VyIHBhcmFtZXRlcnMgKi8KKyAgY29uc3QgaW50IGVxUHJlc2V0TGV2ZWwgPSBwbHZtQ29uZmlnUGFyYW1zLT5lcVByZXNldExldmVsOworICBMVk1fRVFOQl9CYW5kRGVmX3QgQmFuZERlZnNbTUFYX05VTV9CQU5EU107ICAvKiBFcXVhbGlzZXIgYmFuZCBkZWZpbml0aW9ucyAqLworICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKKyAgICBCYW5kRGVmc1tpXS5GcmVxdWVuY3kgPSBFUU5CXzVCYW5kUHJlc2V0c0ZyZXF1ZW5jaWVzW2ldOworICAgIEJhbmREZWZzW2ldLlFGYWN0b3IgPSBFUU5CXzVCYW5kUHJlc2V0c1FGYWN0b3JzW2ldOworICAgIEJhbmREZWZzW2ldLkdhaW4gPQorICAgICAgICBFUU5CXzVCYW5kU29mdFByZXNldHNbKEZJVkVCQU5EX05VTUJBTkRTICogZXFQcmVzZXRMZXZlbCkgKyBpXTsKKyAgfQorICBwYXJhbXMtPkVRTkJfT3BlcmF0aW5nTW9kZSA9IHBsdm1Db25maWdQYXJhbXMtPmVxRW5hYmxlOworIC8vIENhdXRpb246IHJhdyBwb2ludGVyIHRvIHN0YWNrIGRhdGEsIHN0b3JlZCBpbiBpbnN0YW5jZSBieSBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMuCisgIHBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb24gPSAmQmFuZERlZnNbMF07CisKKyAgLyogVm9sdW1lIENvbnRyb2wgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlZDX0VmZmVjdExldmVsID0gMDsKKyAgcGFyYW1zLT5WQ19CYWxhbmNlID0gcGx2bUNvbmZpZ1BhcmFtcy0+dmNCYWw7CisKKyAgLyogVHJlYmxlIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5URV9PcGVyYXRpbmdNb2RlID0gcGx2bUNvbmZpZ1BhcmFtcy0+dHJlYmxlRW5hYmxlOworCisgIC8qIFBTQSBDb250cm9sIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5QU0FfRW5hYmxlID0gTFZNX1BTQV9PTjsKKworICAvKiBCYXNzIEVuaGFuY2VtZW50IHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5CRV9PcGVyYXRpbmdNb2RlID0gcGx2bUNvbmZpZ1BhcmFtcy0+YmFzc0VuYWJsZTsKKworICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLworICBMdm1TdGF0dXMgPQorICAgICAgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgcGFyYW1zKTsKKworICBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCAiTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzIiwgIkx2bUJ1bmRsZV9pbml0Iik7CisgIGlmIChMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOworCisgIEx2bVN0YXR1cyA9IExWTV9BcHBseU5ld1NldHRpbmdzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSk7CisKKyAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBsdm1FeGVjdXRlKGZsb2F0ICpmbG9hdEluLCBmbG9hdCAqZmxvYXRPdXQsIHN0cnVjdCBFZmZlY3RDb250ZXh0ICpwQ29udGV4dCwKKyAgICAgICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtc190ICpwbHZtQ29uZmlnUGFyYW1zKSB7CisgIGNvbnN0IGludCBmcmFtZUxlbmd0aCA9IHBsdm1Db25maWdQYXJhbXMtPmZyYW1lTGVuZ3RoOworICByZXR1cm4KKyAgICAgIExWTV9Qcm9jZXNzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICBmbG9hdEluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElucHV0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgZmxvYXRPdXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNilmcmFtZUxlbmd0aCwgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcmVhZCAqLworICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgIC8qIEF1ZGlvIFRpbWUgKi8KK30KKworaW50IGx2bU1haW5Qcm9jZXNzKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAorICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgKnBQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zX3QgKnBsdm1Db25maWdQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgRklMRSAqZmlucCwKKyAgICAgICAgICAgICAgICAgICBGSUxFICpmb3V0KSB7CisgIGludCBlcnJDb2RlID0gbHZtQ29udHJvbChwQ29udGV4dCwgcGx2bUNvbmZpZ1BhcmFtcywgcFBhcmFtcyk7CisgIGlmIChlcnJDb2RlKSB7CisgICAgQUxPR0UoIkVycm9yOiBsdm1Db250cm9sIHJldHVybmVkIHdpdGggJWRcbiIsIGVyckNvZGUpOworICAgIHJldHVybiBlcnJDb2RlOworICB9CisKKyAgY29uc3QgaW50IGNoYW5uZWxDb3VudCA9IHBsdm1Db25maWdQYXJhbXMtPm5yQ2hhbm5lbHM7CisgIGNvbnN0IGludCBmcmFtZUxlbmd0aCA9IHBsdm1Db25maWdQYXJhbXMtPmZyYW1lTGVuZ3RoOworICBjb25zdCBpbnQgZnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogc2l6ZW9mKGZsb2F0KTsgIC8vIHByb2Nlc3Npbmcgc2l6ZQorICBjb25zdCBpbnQgaW9DaGFubmVsQ291bnQgPSBwbHZtQ29uZmlnUGFyYW1zLT5mQ2hhbm5lbHM7CisgIGNvbnN0IGludCBpb0ZyYW1lU2l6ZSA9IGlvQ2hhbm5lbENvdW50ICogc2l6ZW9mKHNob3J0KTsgLy8gZmlsZSBsb2FkIHNpemUKKyAgY29uc3QgaW50IG1heENoYW5uZWxDb3VudCA9IHN0ZDo6bWF4KGNoYW5uZWxDb3VudCwgaW9DaGFubmVsQ291bnQpOworICAvKgorICAgKiBNb25vIGlucHV0IHdpbGwgYmUgY29udmVydGVkIHRvIDIgY2hhbm5lbHMgaW50ZXJuYWxseSBpbiB0aGUgcHJvY2VzcyBjYWxsCisgICAqIGJ5IGNvcHlpbmcgdGhlIHNhbWUgZGF0YSBpbnRvIHRoZSBzZWNvbmQgY2hhbm5lbC4KKyAgICogSGVuY2Ugd2hlbiBjaGFubmVsQ291bnQgaXMgMSwgb3V0cHV0IGJ1ZmZlciBzaG91bGQgYmUgYWxsb2NhdGVkIGZvcgorICAgKiAyIGNoYW5uZWxzLiBUaGUgbWVtQWxsb2NDaENvdW50IHRha2VzIGNhcmUgb2YgYWxsb2NhdGlvbiBvZiBzdWZmaWNpZW50CisgICAqIG1lbW9yeSBmb3IgdGhlIG91dHB1dCBidWZmZXIuCisgICAqLworICBjb25zdCBpbnQgbWVtQWxsb2NDaENvdW50ID0gKGNoYW5uZWxDb3VudCA9PSAxID8gMiA6IGNoYW5uZWxDb3VudCk7CisKKyAgc3RkOjp2ZWN0b3I8c2hvcnQ+IGluKGZyYW1lTGVuZ3RoICogbWF4Q2hhbm5lbENvdW50KTsKKyAgc3RkOjp2ZWN0b3I8c2hvcnQ+IG91dChmcmFtZUxlbmd0aCAqIG1heENoYW5uZWxDb3VudCk7CisgIHN0ZDo6dmVjdG9yPGZsb2F0PiBmbG9hdEluKGZyYW1lTGVuZ3RoICogY2hhbm5lbENvdW50KTsKKyAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGZsb2F0T3V0KGZyYW1lTGVuZ3RoICogbWVtQWxsb2NDaENvdW50KTsKKworICBpbnQgZnJhbWVDb3VudGVyID0gMDsKKyAgd2hpbGUgKGZyZWFkKGluLmRhdGEoKSwgaW9GcmFtZVNpemUsIGZyYW1lTGVuZ3RoLCBmaW5wKSA9PSAoc2l6ZV90KWZyYW1lTGVuZ3RoKSB7CisgICAgaWYgKGlvQ2hhbm5lbENvdW50ICE9IGNoYW5uZWxDb3VudCkgeworICAgICAgICBhZGp1c3RfY2hhbm5lbHMoaW4uZGF0YSgpLCBpb0NoYW5uZWxDb3VudCwgaW4uZGF0YSgpLCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICBzaXplb2Yoc2hvcnQpLCBmcmFtZUxlbmd0aCAqIGlvRnJhbWVTaXplKTsKKyAgICB9CisgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KGZsb2F0SW4uZGF0YSgpLCBpbi5kYXRhKCksIGZyYW1lTGVuZ3RoICogY2hhbm5lbENvdW50KTsKKworICAgIC8vIE1vbm8gbW9kZSB3aWxsIHJlcGxpY2F0ZSB0aGUgZmlyc3QgY2hhbm5lbCB0byBhbGwgb3RoZXIgY2hhbm5lbHMuCisgICAgLy8gVGhpcyBlbnN1cmVzIGFsbCBhdWRpbyBjaGFubmVscyBhcmUgaWRlbnRpY2FsLiBUaGlzIGlzIHVzZWZ1bCBmb3IgdGVzdGluZworICAgIC8vIEJhc3MgQm9vc3QsIHdoaWNoIGV4dHJhY3RzIGEgbW9ubyBzaWduYWwgZm9yIHByb2Nlc3NpbmcuCisgICAgaWYgKHBsdm1Db25maWdQYXJhbXMtPm1vbm9Nb2RlICYmIGNoYW5uZWxDb3VudCA+IDEpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUxlbmd0aDsgKytpKSB7CisgICAgICAgICAgICBhdXRvICpmcCA9ICZmbG9hdEluW2kgKiBjaGFubmVsQ291bnRdOworICAgICAgICAgICAgc3RkOjpmaWxsKGZwICsgMSwgZnAgKyBjaGFubmVsQ291bnQsICpmcCk7IC8vIHJlcGxpY2F0ZSBjaCAwCisgICAgICAgIH0KKyAgICB9CisjaWZuZGVmIEJZUEFTU19FWEVDCisgICAgZXJyQ29kZSA9IGx2bUV4ZWN1dGUoZmxvYXRJbi5kYXRhKCksIGZsb2F0T3V0LmRhdGEoKSwgcENvbnRleHQsIHBsdm1Db25maWdQYXJhbXMpOworICAgIGlmIChlcnJDb2RlKSB7CisgICAgICBwcmludGYoIlxuRXJyb3I6IGx2bUV4ZWN1dGUgcmV0dXJuZWQgd2l0aCAlZFxuIiwgZXJyQ29kZSk7CisgICAgICByZXR1cm4gZXJyQ29kZTsKKyAgICB9CisKKyAgICAodm9pZClmcmFtZVNpemU7IC8vIGVsaW1pbmF0ZSB3YXJuaW5nCisjZWxzZQorICAgIG1lbWNweShmbG9hdE91dC5kYXRhKCksIGZsb2F0SW4uZGF0YSgpLCBmcmFtZUxlbmd0aCAqIGZyYW1lU2l6ZSk7CisjZW5kaWYKKyAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQob3V0LmRhdGEoKSwgZmxvYXRPdXQuZGF0YSgpLCBmcmFtZUxlbmd0aCAqIGNoYW5uZWxDb3VudCk7CisgICAgaWYgKGlvQ2hhbm5lbENvdW50ICE9IGNoYW5uZWxDb3VudCkgeworICAgICAgICBhZGp1c3RfY2hhbm5lbHMob3V0LmRhdGEoKSwgY2hhbm5lbENvdW50LCBvdXQuZGF0YSgpLCBpb0NoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgIHNpemVvZihzaG9ydCksIGZyYW1lTGVuZ3RoICogY2hhbm5lbENvdW50ICogc2l6ZW9mKHNob3J0KSk7CisgICAgfQorICAgICh2b2lkKSBmd3JpdGUob3V0LmRhdGEoKSwgaW9GcmFtZVNpemUsIGZyYW1lTGVuZ3RoLCBmb3V0KTsKKyAgICBmcmFtZUNvdW50ZXIgKz0gZnJhbWVMZW5ndGg7CisgIH0KKyAgcHJpbnRmKCJmcmFtZUNvdW50ZXI6IFslZF1cbiIsIGZyYW1lQ291bnRlcik7CisgIHJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSB7CisgIGlmIChhcmdjID09IDEpIHsKKyAgICBwcmludFVzYWdlKCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgbHZtQ29uZmlnUGFyYW1zX3QgbHZtQ29uZmlnUGFyYW1ze307IC8vIGRlZmF1bHQgaW5pdGlhbGl6ZQorICBjb25zdCBjaGFyICppbmZpbGUgPSBudWxscHRyOworICBjb25zdCBjaGFyICpvdXRmaWxlID0gbnVsbHB0cjsKKworICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworICAgIHByaW50ZigiJXMgIiwgYXJndltpXSk7CisgICAgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItaToiLCAzKSkgeworICAgICAgaW5maWxlID0gYXJndltpXSArIDM7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLW86IiwgMykpIHsKKyAgICAgIG91dGZpbGUgPSBhcmd2W2ldICsgMzsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItZnM6IiwgNCkpIHsKKyAgICAgIGNvbnN0IGludCBzYW1wbGluZ0ZyZXEgPSBhdG9pKGFyZ3ZbaV0gKyA0KTsKKyAgICAgIGlmIChzYW1wbGluZ0ZyZXEgIT0gODAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gMTEwMjUgJiYKKyAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gMTIwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDE2MDAwICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDIyMDUwICYmIHNhbXBsaW5nRnJlcSAhPSAyNDAwMCAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSAzMjAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gNDQxMDAgJiYKKyAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gNDgwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDg4MjAwICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDk2MDAwICYmIHNhbXBsaW5nRnJlcSAhPSAxNzY0MDAgJiYKKyAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gMTkyMDAwKSB7CisgICAgICAgIHByaW50ZigiRXJyb3I6IFVuc3VwcG9ydGVkIFNhbXBsaW5nIEZyZXF1ZW5jeSA6ICVkXG4iLCBzYW1wbGluZ0ZyZXEpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBsdm1Db25maWdQYXJhbXMuc2FtcGxpbmdGcmVxID0gc2FtcGxpbmdGcmVxOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1jaE1hc2s6IiwgOCkpIHsKKyAgICAgIGNvbnN0IGludCBjaE1hc2tDb25maWdJZHggPSBhdG9pKGFyZ3ZbaV0gKyA4KTsKKyAgICAgIGlmIChjaE1hc2tDb25maWdJZHggPCAwIHx8IChzaXplX3QpY2hNYXNrQ29uZmlnSWR4ID49IHN0ZDo6c2l6ZShsdm1Db25maWdDaE1hc2spKSB7CisgICAgICAgIEFMT0dFKCJcbkVycm9yOiBVbnN1cHBvcnRlZCBDaGFubmVsIE1hc2sgOiAlZFxuIiwgY2hNYXNrQ29uZmlnSWR4KTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hNYXNrID0gbHZtQ29uZmlnQ2hNYXNrW2NoTWFza0NvbmZpZ0lkeF07CisgICAgICBsdm1Db25maWdQYXJhbXMuY2hNYXNrID0gY2hNYXNrOworICAgICAgbHZtQ29uZmlnUGFyYW1zLm5yQ2hhbm5lbHMgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hNYXNrKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItdmNCYWw6IiwgNykpIHsKKyAgICAgIGNvbnN0IGludCB2Y0JhbGFuY2UgPSBhdG9pKGFyZ3ZbaV0gKyA3KTsKKyAgICAgIGlmICh2Y0JhbGFuY2UgPiA5NiB8fCB2Y0JhbGFuY2UgPCAtOTYpIHsKKyAgICAgICAgQUxPR0UoIlxuRXJyb3I6IFVuc3VwcG9ydGVkIHZvbHVtZSBiYWxhbmNlIHZhbHVlOiAlZFxuIiwgdmNCYWxhbmNlKTsKKyAgICAgIH0KKyAgICAgIGx2bUNvbmZpZ1BhcmFtcy52Y0JhbCA9IHZjQmFsYW5jZTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItZmNoOiIsIDUpKSB7CisgICAgICBjb25zdCBpbnQgZkNoYW5uZWxzID0gYXRvaShhcmd2W2ldICsgNSk7CisgICAgICBpZiAoZkNoYW5uZWxzID4gOCB8fCBmQ2hhbm5lbHMgPCAxKSB7CisgICAgICAgICAgICAgcHJpbnRmKCJFcnJvcjogVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGZpbGUgY2hhbm5lbHMgOiAlZFxuIiwgZkNoYW5uZWxzKTsKKyAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgIH0KKyAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zLmZDaGFubmVscyA9IGZDaGFubmVsczsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwiLU0iKSkgeworICAgICAgICAgIGx2bUNvbmZpZ1BhcmFtcy5tb25vTW9kZSA9IHRydWU7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWJhc3Nsdmw6IiwgOSkpIHsKKyAgICAgIGNvbnN0IGludCBiYXNzRWZmZWN0TGV2ZWwgPSBhdG9pKGFyZ3ZbaV0gKyA5KTsKKyAgICAgIGlmIChiYXNzRWZmZWN0TGV2ZWwgPiBMVk1fQkVfTUFYX0VGRkVDVExFVkVMIHx8IGJhc3NFZmZlY3RMZXZlbCA8IExWTV9CRV9NSU5fRUZGRUNUTEVWRUwpIHsKKyAgICAgICAgcHJpbnRmKCJFcnJvcjogVW5zdXBwb3J0ZWQgQmFzcyBFZmZlY3QgTGV2ZWwgOiAlZFxuIiwKKyAgICAgICAgICAgICAgIGJhc3NFZmZlY3RMZXZlbCk7CisgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgICAgbHZtQ29uZmlnUGFyYW1zLmJhc3NFZmZlY3RMZXZlbCA9IGJhc3NFZmZlY3RMZXZlbDsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItZXFQcmVzZXQ6IiwgMTApKSB7CisgICAgICBjb25zdCBpbnQgZXFQcmVzZXRMZXZlbCA9IGF0b2koYXJndltpXSArIDEwKTsKKyAgICAgIGNvbnN0IGludCBudW1QcmVzZXRMdmxzID0gc3RkOjpzaXplKGdFcXVhbGl6ZXJQcmVzZXRzKTsKKyAgICAgIGlmIChlcVByZXNldExldmVsID49IG51bVByZXNldEx2bHMgfHwgZXFQcmVzZXRMZXZlbCA8IDApIHsKKyAgICAgICAgcHJpbnRmKCJFcnJvcjogVW5zdXBwb3J0ZWQgRXF1YWxpemVyIFByZXNldCA6ICVkXG4iLCBlcVByZXNldExldmVsKTsKKyAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBsdm1Db25maWdQYXJhbXMuZXFQcmVzZXRMZXZlbCA9IGVxUHJlc2V0TGV2ZWw7CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItYkUiKSkgeworICAgICAgbHZtQ29uZmlnUGFyYW1zLmJhc3NFbmFibGUgPSBMVk1fQkVfT047CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItZXFFIikpIHsKKyAgICAgIGx2bUNvbmZpZ1BhcmFtcy5lcUVuYWJsZSA9IExWTV9FUU5CX09OOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLXRFIikpIHsKKyAgICAgIGx2bUNvbmZpZ1BhcmFtcy50cmVibGVFbmFibGUgPSBMVk1fVEVfT047CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItY3NFIikpIHsKKyAgICAgIGx2bUNvbmZpZ1BhcmFtcy5jc0VuYWJsZSA9IExWTV9NT0RFX09OOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCAiLWgiKSkgeworICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgaWYgKGluZmlsZSA9PSBudWxscHRyIHx8IG91dGZpbGUgPT0gbnVsbHB0cikgeworICAgIHByaW50ZigiRXJyb3I6IG1pc3NpbmcgaW5wdXQvb3V0cHV0IGZpbGVzXG4iKTsKKyAgICBwcmludFVzYWdlKCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgRklMRSAqZmlucCA9IGZvcGVuKGluZmlsZSwgInJiIik7CisgIGlmIChmaW5wID09IG51bGxwdHIpIHsKKyAgICBwcmludGYoIkNhbm5vdCBvcGVuIGlucHV0IGZpbGUgJXMiLCBpbmZpbGUpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIEZJTEUgKmZvdXQgPSBmb3BlbihvdXRmaWxlLCAid2IiKTsKKyAgaWYgKGZvdXQgPT0gbnVsbHB0cikgeworICAgIHByaW50ZigiQ2Fubm90IG9wZW4gb3V0cHV0IGZpbGUgJXMiLCBvdXRmaWxlKTsKKyAgICBmY2xvc2UoZmlucCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgRWZmZWN0Q29udGV4dCBjb250ZXh0OworICBMVk1fQ29udHJvbFBhcmFtc190IHBhcmFtczsKKyAgaW50IGVyckNvZGUgPSBsdm1DcmVhdGUoJmNvbnRleHQsICZsdm1Db25maWdQYXJhbXMsICZwYXJhbXMpOworICBpZiAoZXJyQ29kZSA9PSAwKSB7CisgICAgZXJyQ29kZSA9IGx2bU1haW5Qcm9jZXNzKCZjb250ZXh0LCAmcGFyYW1zLCAmbHZtQ29uZmlnUGFyYW1zLCBmaW5wLCBmb3V0KTsKKyAgICBpZiAoZXJyQ29kZSAhPSAwKSB7CisgICAgICBwcmludGYoIkVycm9yOiBsdm1NYWluUHJvY2VzcyByZXR1cm5lZCB3aXRoIHRoZSBlcnJvcjogJWQiLGVyckNvZGUpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBwcmludGYoIkVycm9yOiBsdm1DcmVhdGUgcmV0dXJuZWQgd2l0aCB0aGUgZXJyb3I6ICVkIiwgZXJyQ29kZSk7CisgIH0KKyAgZmNsb3NlKGZpbnApOworICBmY2xvc2UoZm91dCk7CisgIC8qIEZyZWUgdGhlIGFsbG9jYXRlZCBidWZmZXJzICovCisgIGlmIChjb250ZXh0LnBCdW5kbGVkQ29udGV4dCAhPSBudWxscHRyKSB7CisgICAgaWYgKGNvbnRleHQucEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UgIT0gbnVsbHB0cikgeworICAgICAgTHZtRWZmZWN0X2ZyZWUoJmNvbnRleHQpOworICAgIH0KKyAgICBmcmVlKGNvbnRleHQucEJ1bmRsZWRDb250ZXh0KTsKKyAgfQorCisgIGlmIChlcnJDb2RlKSB7CisgICAgcmV0dXJuIC0xOworICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvc25yLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL3Nuci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg1OTk0YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL3Nuci5jcHAKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQSA9IGZsb2F0Pgorc3RkOjpwYWlyPEEsIEE+IGdldFNpZ25hbE5vaXNlKEZJTEUgKmZpbnAsIEZJTEUgKmZyZWYpIHsKKyAgY29uc3RleHByIHNpemVfdCBmcmFtZXNpemUgPSAyNTY7CisgIHN0ZDo6dmVjdG9yPFQ+IGluKGZyYW1lc2l6ZSk7CisgIHN0ZDo6dmVjdG9yPFQ+IHJlZihmcmFtZXNpemUpOworICBBIHNpZ25hbHt9OworICBBIG5vaXNle307CisKKyAgZm9yICg7OykgeworICAgIHNpemVfdCByZWFkX3NhbXBsZXNfaW4gPSBmcmVhZCgmaW5bMF0sIHNpemVvZihUKSwgZnJhbWVzaXplLCBmaW5wKTsKKyAgICBjb25zdCBzaXplX3QgcmVhZF9zYW1wbGVzX3JlZiA9IGZyZWFkKCZyZWZbMF0sIHNpemVvZihUKSwgZnJhbWVzaXplLCBmcmVmKTsKKyAgICBpZiAocmVhZF9zYW1wbGVzX2luICE9IHJlYWRfc2FtcGxlc19yZWYpIHsKKyAgICAgIHByaW50ZigiZmlsZSBzaXplcyBkbyBub3QgbWF0Y2ggKGxhc3QgJXp1ICV6dSkiLCByZWFkX3NhbXBsZXNfaW4sIHJlYWRfc2FtcGxlc19yZWYpOworICAgICAgcmVhZF9zYW1wbGVzX2luID0gc3RkOjptaW4ocmVhZF9zYW1wbGVzX2luLCByZWFkX3NhbXBsZXNfcmVmKTsKKyAgICB9CisgICAgaWYgKHJlYWRfc2FtcGxlc19pbiA9PSAwKSB7CisgICAgICAgIHJldHVybiB7IHNpZ25hbCwgbm9pc2UgfTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZWFkX3NhbXBsZXNfaW47ICsraSkgeworICAgICAgIGNvbnN0IEEgdmFsdWUocmVmW2ldKTsKKyAgICAgICBjb25zdCBBIGRpZmYoQShpbltpXSkgLSB2YWx1ZSk7CisgICAgICAgc2lnbmFsICs9IHZhbHVlICogdmFsdWU7CisgICAgICAgbm9pc2UgKz0gZGlmZiAqIGRpZmY7CisgICAgfQorICB9Cit9CisKK3ZvaWQgcHJpbnRVc2FnZSgpIHsKKyAgcHJpbnRmKCJcblVzYWdlOiAiKTsKKyAgcHJpbnRmKCJcbiAgICAgc25yIDxyZWZfZmlsZT4gPHRlc3RfZmlsZT4gW29wdGlvbnNdXG4iKTsKKyAgcHJpbnRmKCJcbndoZXJlLCBcbiAgICAgPHJlZl9maWxlPiAgaXMgdGhlIHJlZmVyZW5jZSBmaWxlIG5hbWUiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgICAgICAgIG9uIHdoaWNoIHdpbGwgYmUgdGFrZW4gYXMgcHVyZSBzaWduYWwiKTsKKyAgcHJpbnRmKCJcbiAgICAgPHRlc3RfZmlsZT4gaXMgdGVzdCBmaWxlIGZvciBzbnIgY2FsY3VsYXRpb24iKTsKKyAgcHJpbnRmKCJcbiAgICAgYW5kIG9wdGlvbnMgYXJlIG1lbnRpb25lZCBiZWxvdyIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgIC1wY21fZm9ybWF0OjxwY20gZm9ybWF0IG9mIGlucHV0IGZpbGVzPiIpOworICBwcmludGYoIlxuICAgICAgICAgICAwIC0gMTYgYml0IHBjbSIpOworICBwcmludGYoIlxuICAgICAgICAgICAxIC0gMzIgYml0IGZsb2F0Iik7CisgIHByaW50ZigiXG4gICAgICAgICAgIGRlZmF1bHQgMCIpOworICBwcmludGYoIlxuICAgICAtdGhyOjx0aHJlc2hvbGQgdmFsdWU+Iik7CisgIHByaW50ZigiXG4gICAgICAgICAgIGRlZmF1bHQgLSBuZWdhdGl2ZSBpbmZpbml0eVxuXG4iKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIgKmFyZ3ZbXSkgeworICBpZiAoYXJnYyA8IDMpIHsKKyAgICBwcmludFVzYWdlKCk7CisgICAgcmV0dXJuIC0xOworICB9CisgIGludCBwY21fZm9ybWF0ID0gMDsKKyAgZmxvYXQgdGhyID0gLSBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKTsKKyAgRklMRSAqZnJlZiA9IGZvcGVuKGFyZ3ZbMV0sICJyYiIpOworICBGSUxFICpmaW5wID0gZm9wZW4oYXJndlsyXSwgInJiIik7CisgIGZvciAoaW50IGkgPSAzOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItcGNtX2Zvcm1hdDoiLCAxMikpIHsKKyAgICAgIHBjbV9mb3JtYXQgPSBhdG9pKGFyZ3ZbaV0gKyAxMik7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLXRocjoiLCA1KSkgeworICAgICAgdGhyID0gYXRvZihhcmd2W2ldICsgNSk7CisgICAgfQorICB9CisgIGlmIChmaW5wID09IG51bGxwdHIgfHwgZnJlZiA9PSBudWxscHRyKSB7CisgICAgcHJpbnRmKCJcbkVycm9yOiBtaXNzaW5nIGlucHV0L3JlZmVyZW5jZSBmaWxlc1xuIik7CisgICAgcmV0dXJuIC0xOworICB9CisgIGludCByZXQgPSBFWElUX1NVQ0NFU1M7CisgIGF1dG8gc24gPSBwY21fZm9ybWF0ID09IDAKKyAgICAgID8gZ2V0U2lnbmFsTm9pc2U8c2hvcnQ+KGZpbnAsIGZyZWYpCisgICAgICA6IGdldFNpZ25hbE5vaXNlPGZsb2F0PihmaW5wLCBmcmVmKTsKKyAgaWYgKHNuLmZpcnN0ID4gMC5mICYmIHNuLnNlY29uZCA+IDAuZikgeworICAgIGZsb2F0IHNuciA9IDEwLmYgKiBsb2coc24uZmlyc3QgLyBzbi5zZWNvbmQpOworICAgIC8vIGNvbXBhcmUgdGhlIG1lYXN1cmVkIHNuciB2YWx1ZSB3aXRoIHRocmVzaG9sZAorICAgIGlmIChzbnIgPCB0aHIpIHsKKyAgICAgIHByaW50ZigiJS42ZiBsZXNzIHRoYW4gdGhyZXNob2xkICUuNmZcbiIsIHNuciwgdGhyKTsKKyAgICAgIHJldCA9IEVYSVRfRkFJTFVSRTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRmKCIlLjZmXG4iLCBzbnIpOworICAgIH0KKyAgfQorICBmY2xvc2UoZmlucCk7CisgIGZjbG9zZShmcmVmKTsKKworICByZXR1cm4gcmV0OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZmExMjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw4OSBAQAorLy8gVGhlIHdyYXBwZXIgLURCVUlMRF9GTE9BVCBuZWVkcyB0byBtYXRjaAorLy8gdGhlIGx2bSBsaWJyYXJ5IC1EQlVJTERfRkxPQVQuCisKKy8vIG11c2ljIGJ1bmRsZSB3cmFwcGVyCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmJ1bmRsZXdyYXBwZXIiLAorCisgICAgYXJjaDogeworICAgICAgICBhcm06IHsKKyAgICAgICAgICAgIGluc3RydWN0aW9uX3NldDogImFybSIsCisgICAgICAgIH0sCisgICAgfSwKKworICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmNzOiBbIkJ1bmRsZS9FZmZlY3RCdW5kbGUuY3BwIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAorICAgICAgICAiLURCVUlMRF9GTE9BVCIsCisgICAgICAgICItREhJR0hFUl9GUyIsCisgICAgICAgICItRFNVUFBPUlRfTUMiLAorCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAic291bmRmeCIsCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJtdXNpY2J1bmRsZSJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmRsIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJCdW5kbGUiXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCisgICAgXSwKK30KKworLy8gcmV2ZXJiIHdyYXBwZXIKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGlicmV2ZXJid3JhcHBlciIsCisKKyAgICBhcmNoOiB7CisgICAgICAgIGFybTogeworICAgICAgICAgICAgaW5zdHJ1Y3Rpb25fc2V0OiAiYXJtIiwKKyAgICAgICAgfSwKKyAgICB9LAorCisgICAgdmVuZG9yOiB0cnVlLAorICAgIHNyY3M6IFsiUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgICAgICItREJVSUxEX0ZMT0FUIiwKKyAgICAgICAgIi1ESElHSEVSX0ZTIiwKKworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworICAgIHJlbGF0aXZlX2luc3RhbGxfcGF0aDogInNvdW5kZngiLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlicmV2ZXJiIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZGwiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbIlJldmVyYiJdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmhhcmR3YXJlX2hlYWRlcnMiLAorICAgICAgICAibGliYXVkaW9lZmZlY3RzIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgaW50ZWdlcl9vdmVyZmxvdzogdHJ1ZSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDFkYmMyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jIFRoZSB3cmFwcGVyIC1EQlVJTERfRkxPQVQgbmVlZHMgdG8gbWF0Y2gKLSMgdGhlIGx2bSBsaWJyYXJ5IC1EQlVJTERfRkxPQVQuCi0KLSMgbXVzaWMgYnVuZGxlIHdyYXBwZXIKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX0FSTV9NT0RFIDo9IGFybQotCi1MT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLQlCdW5kbGUvRWZmZWN0QnVuZGxlLmNwcAotCi1MT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbiAtREJVSUxEX0ZMT0FUIC1ESElHSEVSX0ZTCi1MT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgotCi1MT0NBTF9NT0RVTEU6PSBsaWJidW5kbGV3cmFwcGVyCi0KLUxPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHNvdW5kZngKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBsaWJtdXNpY2J1bmRsZQotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICAgbGliYXVkaW91dGlscyBcCi0gICAgIGxpYmN1dGlscyBcCi0gICAgIGxpYmRsIFwKLSAgICAgbGlibG9nIFwKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0JJChMT0NBTF9QQVRIKS9CdW5kbGUgXAotCSQoTE9DQUxfUEFUSCkvLi4vbGliL0NvbW1vbi9saWIvIFwKLQkkKExPQ0FMX1BBVEgpLy4uL2xpYi9CdW5kbGUvbGliLyBcCi0JJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKLQkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLQotTE9DQUxfSEVBREVSX0xJQlJBUklFUyArPSBsaWJoYXJkd2FyZV9oZWFkZXJzCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KLQotIyByZXZlcmIgd3JhcHBlcgotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX0FSTV9NT0RFIDo9IGFybQotCi1MT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLSAgICBSZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcAotCi1MT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbiAtREJVSUxEX0ZMT0FUIC1ESElHSEVSX0ZTCi1MT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgotCi1MT0NBTF9NT0RVTEU6PSBsaWJyZXZlcmJ3cmFwcGVyCi0KLUxPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHNvdW5kZngKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyArPSBsaWJyZXZlcmIKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgIGxpYmF1ZGlvdXRpbHMgXAotICAgICBsaWJjdXRpbHMgXAotICAgICBsaWJkbCBcCi0gICAgIGxpYmxvZyBcCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgICQoTE9DQUxfUEFUSCkvUmV2ZXJiIFwKLSAgICAkKExPQ0FMX1BBVEgpLy4uL2xpYi9Db21tb24vbGliLyBcCi0gICAgJChMT0NBTF9QQVRIKS8uLi9saWIvUmV2ZXJiL2xpYi8gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0KLUxPQ0FMX0hFQURFUl9MSUJSQVJJRVMgKz0gbGliaGFyZHdhcmVfaGVhZGVycwotCi1MT0NBTF9TQU5JVElaRSA6PSBpbnRlZ2VyX292ZXJmbG93Ci0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCmluZGV4IDA0YzI2OTIuLjNmYmJjMDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcApAQCAtNDM1LDcgKzQzNSw3IEBACiAgICAgICAgICAgICAocFNlc3Npb25Db250ZXh0LT5iRXF1YWxpemVySW5zdGFudGlhdGVkID09TFZNX0ZBTFNFKSAmJgogICAgICAgICAgICAgKHBTZXNzaW9uQ29udGV4dC0+YlZpcnR1YWxpemVySW5zdGFudGlhdGVkPT1MVk1fRkFMU0UpKQogICAgIHsKLSAgICAgICAgI2lmZGVmIExWTV9QQ00KKyNpZmRlZiBMVk1fUENNCiAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21JblB0ciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBmY2xvc2UocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIpOwogICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIgPSBOVUxMOwpAQCAtNDQ0LDcgKzQ0NCw3IEBACiAgICAgICAgICAgICBmY2xvc2UocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyKTsKICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbU91dFB0ciA9IE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgI2VuZGlmCisjZW5kaWYKIAogCiAgICAgICAgIC8vIENsZWFyIHRoZSBTZXNzaW9uSW5kZXgKQEAgLTY1MCw2ICs2NTAsOSBAQAogICAgIHBhcmFtcy5TcGVha2VyVHlwZSAgICAgICAgICAgID0gTFZNX0hFQURQSE9ORVM7CiAKICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVSYXRlID0gTFZNX0ZTXzQ0MTAwOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5DaE1hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisjZW5kaWYKIAogICAgIC8qIENvbmNlcnQgU291bmQgcGFyYW1ldGVycyAqLwogICAgIHBhcmFtcy5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgICA9IExWTV9NT0RFX09GRjsKQEAgLTY5NSw2ICs2OTgsMTEgQEAKICAgICBwYXJhbXMuVEVfT3BlcmF0aW5nTW9kZSAgICAgICA9IExWTV9URV9PRkY7CiAgICAgcGFyYW1zLlRFX0VmZmVjdExldmVsICAgICAgICAgPSAwOwogCisjaWZkZWYgU1VQUE9SVF9NQworICAgIHBhcmFtcy5OckNoYW5uZWxzICAgICAgICAgICAgID0KKyAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyk7CisgICAgcGFyYW1zLkNoTWFzayAgICAgICAgICAgICAgICAgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisjZW5kaWYKICAgICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLwogICAgIEx2bVN0YXR1cyA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMpOwpAQCAtNzUxLDE5ICs3NTksMjEgQEAKIAogICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwogICAgIGVmZmVjdF9idWZmZXJfdCAgICAgICAgICpwT3V0VG1wOworICAgIGNvbnN0IExWTV9JTlQzMiBOckNoYW5uZWxzID0KKyAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMpOwogI2lmbmRlZiBOQVRJVkVfRkxPQVRfQlVGRkVSCiAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlciA9PSBudWxscHRyIHx8CiAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5mcmFtZUNvdW50IDwgZnJhbWVDb3VudCkgewogICAgICAgICBmcmVlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlcik7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKWNhbGxvYyhmcmFtZUNvdW50LCBzaXplb2YoTFZNX0ZMT0FUKSAqIEZDQ18yKTsKKyAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopY2FsbG9jKGZyYW1lQ291bnQsIHNpemVvZihMVk1fRkxPQVQpICogTnJDaGFubmVscyk7CiAgICAgfQogCiAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIgPT0gbnVsbHB0ciB8fAogICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZnJhbWVDb3VudCA8IGZyYW1lQ291bnQpIHsKICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyKTsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKWNhbGxvYyhmcmFtZUNvdW50LCBzaXplb2YoTFZNX0ZMT0FUKSAqIEZDQ18yKTsKKyAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopY2FsbG9jKGZyYW1lQ291bnQsIHNpemVvZihMVk1fRkxPQVQpICogTnJDaGFubmVscyk7CiAgICAgfQogCiAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlciA9PSBudWxscHRyIHx8CkBAIC03ODQsNyArNzk0LDcgQEAKICAgICAgICAgICAgICAgICBmcmVlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlciA9Ci0gICAgICAgICAgICAgICAgICAgIChlZmZlY3RfYnVmZmVyX3QgKiljYWxsb2MoZnJhbWVDb3VudCwgc2l6ZW9mKGVmZmVjdF9idWZmZXJfdCkgKiBGQ0NfMik7CisgICAgICAgICAgICAgICAgICAgIChlZmZlY3RfYnVmZmVyX3QgKiljYWxsb2MoZnJhbWVDb3VudCwgc2l6ZW9mKGVmZmVjdF9idWZmZXJfdCkgKiBOckNoYW5uZWxzKTsKICAgICAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKICAgICAgICAgICAgIH0KQEAgLTc5OCwxMyArODA4LDE1IEBACiAKICNpZmRlZiBMVk1fUENNCiAgICAgZndyaXRlKHBJbiwKLSAgICAgICAgICAgIGZyYW1lQ291bnQqc2l6ZW9mKGVmZmVjdF9idWZmZXJfdCkgKiBGQ0NfMiwgMSwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIpOworICAgICAgICAgICBmcmFtZUNvdW50ICogc2l6ZW9mKGVmZmVjdF9idWZmZXJfdCkgKiBOckNoYW5uZWxzLAorICAgICAgICAgICAxLAorICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21JblB0cik7CiAgICAgZmZsdXNoKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyKTsKICNlbmRpZgogCiAjaWZuZGVmIE5BVElWRV9GTE9BVF9CVUZGRVIKICAgICAvKiBDb252ZXJ0aW5nIGlucHV0IGRhdGEgZnJvbSBmaXhlZCBwb2ludCB0byBmbG9hdCBwb2ludCAqLwotICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kxNihwSW5wdXRCdWZmLCBwSW4sIGZyYW1lQ291bnQgKiBGQ0NfMik7CisgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KHBJbnB1dEJ1ZmYsIHBJbiwgZnJhbWVDb3VudCAqIE5yQ2hhbm5lbHMpOwogCiAgICAgLyogUHJvY2VzcyB0aGUgc2FtcGxlcyAqLwogICAgIEx2bVN0YXR1cyA9IExWTV9Qcm9jZXNzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgLyogSW5zdGFuY2UgaGFuZGxlICovCkBAIC04MTQsNyArODI2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEF1ZGlvIFRpbWUgKi8KIAogICAgIC8qIENvbnZlcnRpbmcgb3V0cHV0IGRhdGEgZnJvbSBmbG9hdCBwb2ludCB0byBmaXhlZCBwb2ludCAqLwotICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdChwT3V0VG1wLCBwT3V0cHV0QnVmZiwgZnJhbWVDb3VudCAqIEZDQ18yKTsKKyAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQocE91dFRtcCwgcE91dHB1dEJ1ZmYsIGZyYW1lQ291bnQgKiBOckNoYW5uZWxzKTsKIAogI2Vsc2UKICAgICAvKiBQcm9jZXNzIHRoZSBzYW1wbGVzICovCkBAIC04MjksMTIgKzg0MSwxNCBAQAogCiAjaWZkZWYgTFZNX1BDTQogICAgIGZ3cml0ZShwT3V0VG1wLAotICAgICAgICAgICAgZnJhbWVDb3VudCpzaXplb2YoZWZmZWN0X2J1ZmZlcl90KSAqIEZDQ18yLCAxLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21PdXRQdHIpOworICAgICAgICAgICBmcmFtZUNvdW50ICogc2l6ZW9mKGVmZmVjdF9idWZmZXJfdCkgKiBOckNoYW5uZWxzLAorICAgICAgICAgICAxLAorICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21PdXRQdHIpOwogICAgIGZmbHVzaChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21PdXRQdHIpOwogI2VuZGlmCiAKICAgICBpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKXsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50ICogRkNDXzI7IGkrKykgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQgKiBOckNoYW5uZWxzOyBpKyspIHsKICNpZm5kZWYgTkFUSVZFX0ZMT0FUX0JVRkZFUgogICAgICAgICAgICAgcE91dFtpXSA9IGNsYW1wMTYoKExWTV9JTlQzMilwT3V0W2ldICsgKExWTV9JTlQzMilwT3V0VG1wW2ldKTsKICNlbHNlCkBAIC0xMTk4LDEzICsxMjEyLDcgQEAKICAgICBmb3IgKGludCBpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspewogICAgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5TaXplICE9IDApewogICAgICAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzICE9IE5VTEwpewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdEx2bUVmZmVjdF9mcmVlIC0gU1RBUlQgZnJlZWluZyAlIiBQUkl1MzIgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7Ci0KICAgICAgICAgICAgICAgICBmcmVlKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKLQotICAgICAgICAgICAgICAgIEFMT0dWKCJcdEx2bUVmZmVjdF9mcmVlIC0gRU5EICAgZnJlZWluZyAlIiBQUkl1MzIgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CiAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBMdm1FZmZlY3RfZnJlZSAtIHRyeWluZyB0byBmcmVlIHdpdGggTlVMTCBwb2ludGVyICUiIFBSSXUzMgogICAgICAgICAgICAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwIEVSUk9SXG4iLApAQCAtMTIzOCw0NSArMTI0Niw1OCBAQAogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPT0gcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSk7CiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IHBDb25maWctPm91dHB1dENmZy5jaGFubmVscyk7CiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9PSBwQ29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0KTsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgQ0hFQ0tfQVJHKGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscykgPD0gTFZNX01BWF9DSEFOTkVMUyk7CisjZWxzZQogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOworI2VuZGlmCiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFCiAgICAgICAgICAgICAgIHx8IHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpOwogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gRUZGRUNUX0JVRkZFUl9GT1JNQVQpOwogICAgIHBDb250ZXh0LT5jb25maWcgPSAqcENvbmZpZzsKKyAgICBjb25zdCBMVk1fSU5UMTYgTnJDaGFubmVscyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyk7CiAKICAgICBzd2l0Y2ggKHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSkgewogICAgIGNhc2UgODAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU184MDAwOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gODAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA4MDAwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAxNjAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18xNjAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE2MDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE2MDAwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAyMjA1MDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18yMjA1MDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDIyMDUwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDIyMDUwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAzMjAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18zMjAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDMyMDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDMyMDAwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSA0NDEwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180NDEwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDQ0MTAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDQ0MTAwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSA0ODAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180ODAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDQ4MDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDQ4MDAwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisgICAgY2FzZSA4ODIwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU184ODIwMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDg4MjAwICogTnJDaGFubmVsczsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSA5NjAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU185NjAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDk2MDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDk2MDAwICogTnJDaGFubmVsczsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNzY0MDA6CisgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTc2NDAwOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gMTc2NDAwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAxOTIwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTkyMDAwOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gMTkyMDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE5MjAwMCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwogI2VuZGlmCiAgICAgZGVmYXVsdDoKQEAgLTEyODQsNyArMTMwNSwxMiBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZVJhdGUgIT0gU2FtcGxlUmF0ZSB8fAorICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5DaE1hc2sgIT0gcENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpIHsKKyNlbHNlCiAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlUmF0ZSAhPSBTYW1wbGVSYXRlKXsKKyNlbmRpZgogCiAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsKICAgICAgICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7CkBAIC0xMzAwLDExICsxMzI2LDE5IEBACiAKICAgICAgICAgQWN0aXZlUGFyYW1zLlNhbXBsZVJhdGUgPSBTYW1wbGVSYXRlOwogCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICBBY3RpdmVQYXJhbXMuTnJDaGFubmVscyA9IE5yQ2hhbm5lbHM7CisgICAgICAgIEFjdGl2ZVBhcmFtcy5DaE1hc2sgPSBwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVsczsKKyNlbmRpZgorCiAgICAgICAgIEx2bVN0YXR1cyA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogCiAgICAgICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiRWZmZWN0X3NldENvbmZpZyIpCiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdF9zZXRDb25maWcgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZVJhdGUgPSBTYW1wbGVSYXRlOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Q2hNYXNrID0gcENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHM7CisjZW5kaWYKIAogICAgICAgICBMdm1FZmZlY3RfbGltaXRMZXZlbChwQ29udGV4dCk7CiAKQEAgLTE1MDQsNiArMTUzOCw3IEBACiAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORToKICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUzoKICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0hFQURTRVQ6CisgICAgLy8gY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0U6ICAvLyBGb3IgVVNCIHRlc3Rpbmcgb2YgdGhlIHZpcnR1YWxpemVyIG9ubHkuCiAgICAgICAgIHJldHVybiAwOwogICAgIGRlZmF1bHQgOgogICAgICAgICByZXR1cm4gLUVJTlZBTDsKQEAgLTE1MjYsMTAgKzE1NjEsOSBAQAogaW50IFZpcnR1YWxpemVySXNDb25maWd1cmF0aW9uU3VwcG9ydGVkKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSkgewogICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7Ci0gICAgaWYgKChjaGFubmVsQ291bnQgPT0gMCkgfHwgKGNoYW5uZWxDb3VudCA+IDIpKSB7CisgICAgaWYgKGNoYW5uZWxDb3VudCA8IDEgfHwgY2hhbm5lbENvdW50ID4gRkNDXzIpIHsgLy8gVE9ETzogdXBkYXRlIHRvIDggY2hhbm5lbHMgd2hlbiBzdXBwb3J0ZWQuCiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KLQogICAgIHJldHVybiBWaXJ0dWFsaXplcklzRGV2aWNlU3VwcG9ydGVkKGRldmljZVR5cGUpOwogfQogCkBAIC0zMjIyLDYgKzMyNTYsNyBAQAogICAgIEVmZmVjdENvbnRleHQgKiBwQ29udGV4dCA9IChFZmZlY3RDb250ZXh0ICopIHNlbGY7CiAgICAgaW50ICAgIHN0YXR1cyA9IDA7CiAgICAgaW50ICAgIHByb2Nlc3NTdGF0dXMgPSAwOworICAgIGNvbnN0IGludCBOckNoYW5uZWxzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMpOwogCiAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzIFN0YXJ0IDogRW5hYmxlZCA9ICVkICAgICBDYWxsZWQgPSAlZCAoJThkICU4ZCAlOGQpIiwKIC8vcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQscENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCwKQEAgLTMyNTIsNyArMzI4Nyw3IEBACiAgICAgICAgIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCkpewogICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzKCkgTFZNX0JBU1NfQk9PU1QgRWZmZWN0IGlzIG5vdCBlbmFibGVkIik7CiAgICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiID4gMCl7Ci0gICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiAtPSBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiAyOyAvLyBTVEVSRU8KKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiIC09IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzOiBXYWl0aW5nIHRvIHR1cm4gb2ZmIEJBU1NfQk9PU1QsICVkIHNhbXBsZXMgbGVmdCIsCiAgICAgICAgICAgICAvLyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYik7CiAgICAgICAgIH0KQEAgLTMyNzIsNyArMzMwNyw3IEBACiAgICAgICAgIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fRVFVQUxJWkVSKSl7CiAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3MoKSBMVk1fRVFVQUxJWkVSIEVmZmVjdCBpcyBub3QgZW5hYmxlZCIpOwogICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSA+IDApewotICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgLT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogMjsgLy8gU1RFUkVPCisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSAtPSBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiBOckNoYW5uZWxzOwogICAgICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzczogV2FpdGluZyB0byB0dXJuIG9mZiBFUVVBTElaRVIsICVkIHNhbXBsZXMgbGVmdCIsCiAgICAgICAgICAgICAvLyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSk7CiAgICAgICAgIH0KQEAgLTMyODYsNyArMzMyMSw4IEBACiAgICAgICAgIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fVklSVFVBTElaRVIpKXsKICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzcygpIExWTV9WSVJUVUFMSVpFUiBFZmZlY3QgaXMgbm90IGVuYWJsZWQiKTsKICAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCA+IDApewotICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCAtPSBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiAyOy8vIFNURVJFTworICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCAtPQorICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzOiBXYWl0aW5nIGZvciB0byB0dXJuIG9mZiBWSVJUVUFMSVpFUiwgJWQgc2FtcGxlcyBsZWZ0IiwKICAgICAgICAgICAgIC8vICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQpOwogICAgICAgICB9CkBAIC0zMzM3LDcgKzMzNzMsNyBAQAogICAgICAgICAvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQsIHBDb250ZXh0LT5FZmZlY3RUeXBlKTsKIAogICAgICAgICBpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIEZDQ18yOyArK2kpeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiBOckNoYW5uZWxzOyArK2kpIHsKICNpZmRlZiBOQVRJVkVfRkxPQVRfQlVGRkVSCiAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mMzJbaV0gKz0gaW5CdWZmZXItPmYzMltpXTsKICNlbHNlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5oCmluZGV4IDZiZjA0NWQuLjZhZjQ1NTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5oCkBAIC0xMDcsNiArMTA3LDkgQEAKICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICpwSW5wdXRCdWZmZXI7CiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAqcE91dHB1dEJ1ZmZlcjsKICNlbmRpZgorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICAgIENoTWFzazsKKyNlbmRpZgogfTsKIAogLyogU2Vzc2lvbkNvbnRleHQgOiBPbmUgc2Vzc2lvbiAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKaW5kZXggZTFjMDNmOS4uNjAyZjYwNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCkBAIC02MTIsMTMgKzYxMiw3IEBACiAgICAgZm9yIChpbnQgaT0wOyBpPExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKXsKICAgICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0uU2l6ZSAhPSAwKXsKICAgICAgICAgICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyAhPSBOVUxMKXsKLSAgICAgICAgICAgICAgICBBTE9HVigiXHRmcmVlKCkgLSBTVEFSVCBmcmVlaW5nICUiIFBSSXUzMiAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKLQogICAgICAgICAgICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwotCi0gICAgICAgICAgICAgICAgQUxPR1YoIlx0ZnJlZSgpIC0gRU5EICAgZnJlZWluZyAlIiBQUkl1MzIgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CiAgICAgICAgICAgICB9ZWxzZXsKICAgICAgICAgICAgICAgICBBTE9HVigiXHRMVk1fRVJST1IgOiBmcmVlKCkgLSB0cnlpbmcgdG8gZnJlZSB3aXRoIE5VTEwgcG9pbnRlciAlIiBQUkl1MzIgIiBieXRlcyAiCiAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIHJlZ2lvbiAldSBhdCAlcCBFUlJPUlxuIiwKQEAgLTY4MSw5ICs2NzUsMTUgQEAKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180ODAwMDsKICAgICAgICAgYnJlYWs7CiAjaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisgICAgY2FzZSA4ODIwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU184ODIwMDsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSA5NjAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU185NjAwMDsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNzY0MDA6CisgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTc2NDAwOworICAgICAgICBicmVhazsKICAgICBjYXNlIDE5MjAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18xOTIwMDA7CiAgICAgICAgIGJyZWFrOwpAQCAtMTc1NywxNSArMTc1NywxNCBAQAogICAgICAgICAgICAgLy8gICAgICAgICooaW50MTZfdCAqKXBWYWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fREVOU0lUWToKLSAgICAgICAgICAgICoodWludDE2X3QgKilwVmFsdWUgPSAwOwogICAgICAgICAgICAgKihpbnQxNl90ICopcFZhbHVlID0gUmV2ZXJiR2V0RGVuc2l0eShwQ29udGV4dCk7CiAgICAgICAgICAgICAvL0FMT0dWKCJcdFJldmVyYl9nZXRQYXJhbWV0ZXIoKSBSRVZFUkJfUEFSQU1fREVOU0lUWSBWYWx1ZSBpcyAlZCIsCiAgICAgICAgICAgICAvLyAgICAgICAgKih1aW50MzJfdCAqKXBWYWx1ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBSRVZFUkJfUEFSQU1fUkVGTEVDVElPTlNfTEVWRUw6CiAgICAgICAgICAgICAqKHVpbnQxNl90ICopcFZhbHVlID0gMDsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRUZMRUNUSU9OU19ERUxBWToKLSAgICAgICAgICAgICoodWludDMyX3QgKilwVmFsdWUgPSAwOwogICAgICAgICBjYXNlIFJFVkVSQl9QQVJBTV9SRVZFUkJfREVMQVk6CiAgICAgICAgICAgICAqKHVpbnQzMl90ICopcFZhbHVlID0gMDsKICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODc2MzVmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzNSBAQAorLy8gYXVkaW8gcHJlcHJvY2Vzc2luZyB3cmFwcGVyCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmF1ZGlvcHJlcHJvY2Vzc2luZyIsCisKKyAgICB2ZW5kb3I6IHRydWUsCisKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJzb3VuZGZ4IiwKKworICAgIHNyY3M6IFsiUHJlUHJvY2Vzc2luZy5jcHAiXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZXh0ZXJuYWwvd2VicnRjIiwKKyAgICAgICAgImV4dGVybmFsL3dlYnJ0Yy93ZWJydGMvbW9kdWxlcy9pbmNsdWRlIiwKKyAgICAgICAgImV4dGVybmFsL3dlYnJ0Yy93ZWJydGMvbW9kdWxlcy9hdWRpb19wcm9jZXNzaW5nL2luY2x1ZGUiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlid2VicnRjX2F1ZGlvX3ByZXByb2Nlc3NpbmciLAorICAgICAgICAibGlic3BlZXhyZXNhbXBsZXIiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRFdFQlJUQ19QT1NJWCIsCisgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9lZmZlY3RzIiwKKyAgICAgICAgImxpYmhhcmR3YXJlX2hlYWRlcnMiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNThkYThiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLSMgYXVkaW8gcHJlcHJvY2Vzc2luZyB3cmFwcGVyCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCi1MT0NBTF9NT0RVTEU6PSBsaWJhdWRpb3ByZXByb2Nlc3NpbmcKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi1MT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBzb3VuZGZ4Ci0KLUxPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotICAgIFByZVByb2Nlc3NpbmcuY3BwCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgIGV4dGVybmFsL3dlYnJ0YyBcCi0gICAgZXh0ZXJuYWwvd2VicnRjL3dlYnJ0Yy9tb2R1bGVzL2luY2x1ZGUgXAotICAgIGV4dGVybmFsL3dlYnJ0Yy93ZWJydGMvbW9kdWxlcy9hdWRpb19wcm9jZXNzaW5nL2luY2x1ZGUgXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby1lZmZlY3RzKQotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJ3ZWJydGNfYXVkaW9fcHJlcHJvY2Vzc2luZyBcCi0gICAgbGlic3BlZXhyZXNhbXBsZXIgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJsb2cKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJkbAotCi1MT0NBTF9DRkxBR1MgKz0gXAotICAgIC1EV0VCUlRDX1BPU0lYCi0KLUxPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCi1MT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgotCi1MT0NBTF9IRUFERVJfTElCUkFSSUVTICs9IGxpYmhhcmR3YXJlX2hlYWRlcnMKLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9QcmVQcm9jZXNzaW5nLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9QcmVQcm9jZXNzaW5nLmNwcAppbmRleCBmMjg0NGVkLi41ZmFiNWJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvUHJlUHJvY2Vzc2luZy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL1ByZVByb2Nlc3NpbmcuY3BwCkBAIC02OTgsNiArNjk4LDcgQEAKICAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9BQ1RJVkU6CiAgICAgICAgICAgICBlZmZlY3QtPm9wcy0+ZGlzYWJsZShlZmZlY3QpOwogICAgICAgICAgICAgU2Vzc2lvbl9TZXRQcm9jRW5hYmxlZChlZmZlY3QtPnNlc3Npb24sIGVmZmVjdC0+cHJvY0lkLCBmYWxzZSk7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9DT05GSUc6CiAgICAgICAgIGNhc2UgUFJFUFJPQ19FRkZFQ1RfU1RBVEVfQ1JFQVRFRDoKICAgICAgICAgY2FzZSBQUkVQUk9DX0VGRkVDVF9TVEFURV9JTklUOgpAQCAtODg5LDcgKzg5MCw3IEBACiAgICAgICAgIGRlbGV0ZSBzZXNzaW9uLT5wcm9jRnJhbWU7CiAgICAgICAgIHNlc3Npb24tPnByb2NGcmFtZSA9IE5VTEw7CiAgICAgICAgIGRlbGV0ZSBzZXNzaW9uLT5hcG07Ci0gICAgICAgIHNlc3Npb24tPmFwbSA9IE5VTEw7CisgICAgICAgIHNlc3Npb24tPmFwbSA9IE5VTEw7IC8vIE5PTElOVChjbGFuZy1hbmFseXplci1jcGx1c3BsdXMuTmV3RGVsZXRlKQogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtOTI1LDcgKzkyNiw3IEBACiAgICAgICAgIGRlbGV0ZSBzZXNzaW9uLT5yZXZCdWY7CiAgICAgICAgIHNlc3Npb24tPnJldkJ1ZiA9IE5VTEw7CiAKLSAgICAgICAgc2Vzc2lvbi0+aW8gPSAwOworICAgICAgICBzZXNzaW9uLT5pZCA9IDA7CiAgICAgfQogCiAgICAgcmV0dXJuIDA7CkBAIC0xMTU0LDcgKzExNTUsNyBAQAogewogICAgIHNpemVfdCBpOwogICAgIGZvciAoaSA9IDA7IGkgPCBQUkVQUk9DX05VTV9TRVNTSU9OUzsgaSsrKSB7Ci0gICAgICAgIGlmIChzU2Vzc2lvbnNbaV0uaW8gPT0gaW9JZCkgeworICAgICAgICBpZiAoc1Nlc3Npb25zW2ldLmlkID09IHNlc3Npb25JZCkgewogICAgICAgICAgICAgaWYgKHNTZXNzaW9uc1tpXS5jcmVhdGVkTXNrICYgKDEgPDwgcHJvY0lkKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgfQpAQCAtMTE2Miw3ICsxMTYzLDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBmb3IgKGkgPSAwOyBpIDwgUFJFUFJPQ19OVU1fU0VTU0lPTlM7IGkrKykgewotICAgICAgICBpZiAoc1Nlc3Npb25zW2ldLmlvID09IDApIHsKKyAgICAgICAgaWYgKHNTZXNzaW9uc1tpXS5pZCA9PSAwKSB7CiAgICAgICAgICAgICBzU2Vzc2lvbnNbaV0uaWQgPSBzZXNzaW9uSWQ7CiAgICAgICAgICAgICBzU2Vzc2lvbnNbaV0uaW8gPSBpb0lkOwogICAgICAgICAgICAgcmV0dXJuICZzU2Vzc2lvbnNbaV07CkBAIC0xOTE0LDcgKzE5MTUsNyBAQAogICAgIHN0YXR1cyA9IFNlc3Npb25fQ3JlYXRlRWZmZWN0KHNlc3Npb24sIHByb2NJZCwgcEludGVyZmFjZSk7CiAKICAgICBpZiAoc3RhdHVzIDwgMCAmJiBzZXNzaW9uLT5jcmVhdGVkTXNrID09IDApIHsKLSAgICAgICAgc2Vzc2lvbi0+aW8gPSAwOworICAgICAgICBzZXNzaW9uLT5pZCA9IDA7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CkBAIC0xOTI4LDcgKzE5MjksNyBAQAogCiAgICAgcHJlcHJvY19lZmZlY3RfdCAqZnggPSAocHJlcHJvY19lZmZlY3RfdCAqKWludGVyZmFjZTsKIAotICAgIGlmIChmeC0+c2Vzc2lvbi0+aW8gPT0gMCkgeworICAgIGlmIChmeC0+c2Vzc2lvbi0+aWQgPT0gMCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAgICAgcmV0dXJuIFNlc3Npb25fUmVsZWFzZUVmZmVjdChmeC0+c2Vzc2lvbiwgZngpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcm94eS9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9wcm94eS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2YWJiOWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL3Byb3h5L0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzOCBAQAorLy8gQ29weXJpZ2h0IDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJlZmZlY3Rwcm94eSIsCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAic291bmRmeCIsCisKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjczogWyJFZmZlY3RQcm94eS5jcHAiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5Il0sCisKKyAgICBoZWFkZXJfbGliczogWyJsaWJhdWRpb2VmZmVjdHMiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJkbCIsCisgICAgICAgICJsaWJlZmZlY3RzIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9wcm94eS9BbmRyb2lkLm1rIGIvbWVkaWEvbGliZWZmZWN0cy9wcm94eS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGRlMzBkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvcHJveHkvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMTMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRTo9IGxpYmVmZmVjdHByb3h5Ci1MT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBzb3VuZGZ4Ci1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgICAgIEVmZmVjdFByb3h5LmNwcAotCi1MT0NBTF9DRkxBR1MrPSAtZnZpc2liaWxpdHk9aGlkZGVuCi1MT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYmxvZyBsaWJjdXRpbHMgbGlidXRpbHMgbGliZGwgbGliZWZmZWN0cwotCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAgICAgc3lzdGVtL21lZGlhL2F1ZGlvX2VmZmVjdHMvaW5jbHVkZSBcCi0gICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5Ci0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0FuZHJvaWQubWsgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tawppbmRleCA3MDQwOWRlLi4zNWUyZjNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5taworKysgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tawpAQCAtOSw2ICs5LDcgQEAKIAogTE9DQUxfQ0ZMQUdTKz0gLU8yIC1mdmlzaWJpbGl0eT1oaWRkZW4KIExPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2Vycm9yCitMT0NBTF9DRkxBR1MgKz0gLURCVUlMRF9GTE9BVCAtRFNVUFBPUlRfTUMKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAJbGliY3V0aWxzIFwKQEAgLTE5LDcgKzIwLDggQEAKIExPQ0FMX01PRFVMRTo9IGxpYnZpc3VhbGl6ZXIKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0JJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpCisJJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLWVmZmVjdHMpIFwKKwkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCiAKIAogTE9DQUxfSEVBREVSX0xJQlJBUklFUyArPSBsaWJoYXJkd2FyZV9oZWFkZXJzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAKaW5kZXggODA3ZjI0ZC4uMDBiYzM3MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9FZmZlY3RWaXN1YWxpemVyLmNwcApAQCAtMjQsMTEgKzI0LDIzIEBACiAjaW5jbHVkZSA8c3RyaW5nLmg+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+IG5ld0NhY2hlOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBuZXdDYWNoZTsKICAgICAgICAgdWludDhfdCogZHN0ID0gbUNhY2hlLmdldCgpOwogICAgICAgICBpZiAobmV3Q2FjaGVCdWZmZXJTaXplIDwga01heENhY2hlQnVmZmVyU2l6ZSkgewogICAgICAgICAgICAgbmV3Q2FjaGVCdWZmZXJTaXplID0ga01heENhY2hlQnVmZmVyU2l6ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmhlaWYvaW5jbHVkZS9IZWlmRGVjb2RlckFQSS5oIGIvbWVkaWEvbGliaGVpZi9pbmNsdWRlL0hlaWZEZWNvZGVyQVBJLmgKaW5kZXggNTE4M2MzOS4uYWExMGYzMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliaGVpZi9pbmNsdWRlL0hlaWZEZWNvZGVyQVBJLmgKKysrIGIvbWVkaWEvbGliaGVpZi9pbmNsdWRlL0hlaWZEZWNvZGVyQVBJLmgKQEAgLTc0LDcgKzc0LDcgQEAKICAgICBpbnQzMl90ICBtUm90YXRpb25BbmdsZTsgICAgICAgICAgIC8vIFJvdGF0aW9uIGFuZ2xlLCBjbG9ja3dpc2UsIHNob3VsZCBiZSBtdWx0aXBsZSBvZiA5MAogICAgIHVpbnQzMl90IG1CeXRlc1BlclBpeGVsOyAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGZvciBvbmUgcGl4ZWwKICAgICB1aW50MzJfdCBtSWNjU2l6ZTsgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyBpbiBtSWNjRGF0YQotICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90PiBtSWNjRGF0YTsgLy8gQWN0dWFsIElDQyBkYXRhLCBtZW1vcnkgaXMgb3duZWQgYnkgdGhpcyBzdHJ1Y3R1cmUKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBtSWNjRGF0YTsgLy8gQWN0dWFsIElDQyBkYXRhLCBtZW1vcnkgaXMgb3duZWQgYnkgdGhpcyBzdHJ1Y3R1cmUKIH07CiAKIC8qCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icAppbmRleCAxYTFkNmIzLi4xZDMzNTkwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAKQEAgLTEsOCArMSwxNiBAQAorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJtZWRpYV9kZWZhdWx0cyIsCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJiaW9uaWMvbGliYy9wcml2YXRlIiwKKyAgICBdLAorfQorCiBjY19saWJyYXJ5X2hlYWRlcnMgewogICAgIG5hbWU6ICJsaWJtZWRpYV9oZWFkZXJzIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogICAgIGhlYWRlcl9saWJzOlsKKyAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCiAgICAgICAgICJsaWJndWlfaGVhZGVycyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKICAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKQEAgLTIwLDcgKzI4LDggQEAKICAgICB2bmRrOiB7CiAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgfSwKLSAgICBzcmNzOiBbIkF1ZGlvUGFyYW1ldGVyLmNwcCIsICJUeXBlQ29udmVydGVyLmNwcCIsICJUaW1lQ2hlY2suY3BwIl0sCisgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAorICAgIHNyY3M6IFsiQXVkaW9QYXJhbWV0ZXIuY3BwIiwgIlR5cGVDb252ZXJ0ZXIuY3BwIl0sCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLApAQCAtMzIsNiArNDEsOSBAQAogICAgICAgICAibGliYXVkaW9jbGllbnRfaGVhZGVycyIsCiAgICAgICAgICJsaWJhdWRpb19zeXN0ZW1faGVhZGVycyIsCiAgICAgXSwKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICBdLAogICAgIGNsYW5nOiB0cnVlLAogfQogCkBAIC00MSw2ICs1Myw3IEBACiAgICAgdm5kazogewogICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgIH0sCisgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAogCiAgICAgc3JjczogWwogICAgICAgICAiYWlkbC9hbmRyb2lkL0lHcmFwaGljQnVmZmVyU291cmNlLmFpZGwiLApAQCAtNTIsNyArNjUsNiBAQAogICAgICAgICAiTWVkaWFDb2RlY0luZm8uY3BwIiwKICAgICAgICAgIk9NWEJ1ZmZlci5jcHAiLAogICAgICAgICAib214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAiLAotICAgICAgICAib214LzEuMC9XT214LmNwcCIsCiAgICAgICAgICJvbXgvMS4wL1dPbXhCdWZmZXJTb3VyY2UuY3BwIiwKICAgICAgICAgIm9teC8xLjAvV09teE5vZGUuY3BwIiwKICAgICAgICAgIm9teC8xLjAvV09teE9ic2VydmVyLmNwcCIsCkBAIC02MiwxMyArNzQsMTYgQEAKICAgICAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImFpZGwiXSwKICAgICAgICAgZXhwb3J0X2FpZGxfaGVhZGVyczogdHJ1ZSwKICAgICB9LAorICAgIAorICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhpZGwudG9rZW5AMS4wLXV0aWxzIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCiAgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKICAgICAgICAgImxpYmxvZyIsCkBAIC04NSwxNSArMTAwLDE4IEBACiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCi0gICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgICJhaWRsIiwKKyAgICAgICAgImluY2x1ZGUiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKQEAgLTEwOCw5ICsxMjYsNjcgQEAKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAorICAgIH0sCit9CisKKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJtZWRpYV9vbXhfY2xpZW50IiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIm9teC8xLjAvV09teC5jcHAiLAorICAgIF0sCisKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlidWkiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCisgICAgXSwKKworICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAogICAgIH0sCiB9CiAKQEAgLTEyMyw2ICsxOTksMTAgQEAKICAgICAgICAgImxpYnNvbml2b3giLAogICAgIF0sCiAKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIF0sCisKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCkBAIC0xMzUsMjQgKzIxNSwxNSBAQAogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKIH0KIAotZmlsZWdyb3VwIHsKLSAgICBuYW1lOiAibWVkaWF1cGRhdGVzZXJ2aWNlX2FpZGwiLAotICAgIHNyY3M6IFsKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmFpZGwiLAotICAgIF0sCi19Ci0KIGNjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJtZWRpYSIsCiAKKyAgICBkZWZhdWx0czogWyAibGlibWVkaWFfZGVmYXVsdHMiIF0sCisKICAgICBzcmNzOiBbCi0gICAgICAgICI6bWVkaWF1cGRhdGVzZXJ2aWNlX2FpZGwiLAogICAgICAgICAiSURhdGFTb3VyY2UuY3BwIiwKICAgICAgICAgIkJ1ZmZlcmluZ1NldHRpbmdzLmNwcCIsCiAgICAgICAgICJtZWRpYXBsYXllci5jcHAiLApAQCAtMTg3LDYgKzI1OCw4IEBACiAgICAgICAgICJNZWRpYVJlc291cmNlUG9saWN5LmNwcCIsCiAgICAgICAgICJWaXN1YWxpemVyLmNwcCIsCiAgICAgICAgICJTdHJpbmdBcnJheS5jcHAiLAorICAgICAgICAiTmRrTWVkaWFGb3JtYXRQcml2LmNwcCIsCisgICAgICAgICJOZGtNZWRpYUVycm9yUHJpdi5jcHAiLAogICAgIF0sCiAKICAgICBhaWRsOiB7CkBAIC0xOTYsMjUgKzI2OSwyNiBAQAogCiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImFuZHJvaWQuaGlkbC50b2tlbkAxLjAtdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJwcm9jZXNzZ3JvdXAiLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYnNvbml2b3giLAotICAgICAgICAibGliaWN1dWMiLAotICAgICAgICAibGliaWN1aTE4biIsCisgICAgICAgICJsaWJhbmRyb2lkaWN1IiwKICAgICAgICAgImxpYmV4cGF0IiwKICAgICAgICAgImxpYmNhbWVyYV9jbGllbnQiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCiAgICAgICAgICJsaWJndWkiLAogICAgICAgICAibGliZGwiLAogICAgICAgICAibGliYXVkaW91dGlscyIsCkBAIC0yMjUsOCArMjk5LDcgQEAKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCiAgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCiAgICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGliaWN1dWMiLAotICAgICAgICAibGliaWN1aTE4biIsCisgICAgICAgICJsaWJhbmRyb2lkaWN1IiwKICAgICAgICAgImxpYnNvbml2b3giLAogICAgICAgICAibGlibWVkaWFfb214IiwKICAgICBdLApAQCAtMjU0LDI0ICszMjcsMTkgQEAKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiB9CiAKLWNjX2xpYnJhcnkgeworY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJtZWRpYV9wbGF5ZXIyX3V0aWwiLAogCisgICAgZGVmYXVsdHM6IFsgImxpYm1lZGlhX2RlZmF1bHRzIiBdLAorCiAgICAgc3JjczogWworICAgICAgICAiQXVkaW9QYXJhbWV0ZXIuY3BwIiwKICAgICAgICAgIkJ1ZmZlcmluZ1NldHRpbmdzLmNwcCIsCiAgICAgICAgICJEYXRhU291cmNlRGVzYy5jcHAiLAotICAgICAgICAiSURhdGFTb3VyY2UuY3BwIiwKLSAgICAgICAgIklNZWRpYUV4dHJhY3Rvci5jcHAiLAotICAgICAgICAiSU1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAiLAotICAgICAgICAiSU1lZGlhU291cmNlLmNwcCIsCiAgICAgICAgICJNZWRpYUNvZGVjQnVmZmVyLmNwcCIsCi0gICAgICAgICJNZWRpYVV0aWxzLmNwcCIsCiAgICAgICAgICJNZXRhZGF0YS5jcHAiLAogICAgICAgICAiTmRrV3JhcHBlci5jcHAiLAogICAgIF0sCkBAIC0yODAsOSArMzQ4LDkgQEAKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKICAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCisgICAgICAgICJsaWJtZWRpYW5ka191dGlscyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnVpIiwKICAgICAgICAgImxpYnV0aWxzIiwKQEAgLTI5Nyw2ICszNjUsMTAgQEAKICAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKICAgICBdLAogCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL25kayIsCisgICAgXSwKKwogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9ydHNwIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dCIsCkBAIC0zMTgsOCArMzkwLDUgQEAKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb1BhcmFtZXRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1BhcmFtZXRlci5jcHAKaW5kZXggMDM0ZjdjMi4uMWM5NWUyNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQXVkaW9QYXJhbWV0ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0F1ZGlvUGFyYW1ldGVyLmNwcApAQCAtMzYsNiArMzYsOCBAQAogY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlId0F2U3luYyA9IEFVRElPX1BBUkFNRVRFUl9IV19BVl9TWU5DOwogY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlQcmVzZW50YXRpb25JZCA9IEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fUFJFU0VOVEFUSU9OX0lEOwogY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlQcm9ncmFtSWQgPSBBVURJT19QQVJBTUVURVJfU1RSRUFNX1BST0dSQU1fSUQ7Citjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleUF1ZGlvTGFuZ3VhZ2VQcmVmZXJyZWQgPQorICAgICAgICBBVURJT19QQVJBTUVURVJfS0VZX0FVRElPX0xBTkdVQUdFX1BSRUZFUlJFRDsKIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5TW9ub091dHB1dCA9IEFVRElPX1BBUkFNRVRFUl9NT05PX09VVFBVVDsKIGNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtSHdBdlN5bmMgPSBBVURJT19QQVJBTUVURVJfU1RSRUFNX0hXX0FWX1NZTkM7CiBjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbUNvbm5lY3QgPSBBVURJT19QQVJBTUVURVJfREVWSUNFX0NPTk5FQ1Q7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5jcHAgYi9tZWRpYS9saWJtZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5jcHAKaW5kZXggMjcxYTIzOC4uMWNjMzBjMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmNwcApAQCAtMjcsMjYgKzI3LDYgQEAKICAgICAgICAgOiBtSW5pdGlhbE1hcmtNcyhrTm9NYXJrKSwKICAgICAgICAgICBtUmVzdW1lUGxheWJhY2tNYXJrTXMoa05vTWFyaykgeyB9CiAKLXN0YXR1c190IEJ1ZmZlcmluZ1NldHRpbmdzOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgewotICAgIGlmIChwYXJjZWwgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBtSW5pdGlhbE1hcmtNcyA9IHBhcmNlbC0+cmVhZEludDMyKCk7Ci0gICAgbVJlc3VtZVBsYXliYWNrTWFya01zID0gcGFyY2VsLT5yZWFkSW50MzIoKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQnVmZmVyaW5nU2V0dGluZ3M6OndyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKLSAgICBpZiAocGFyY2VsID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgcGFyY2VsLT53cml0ZUludDMyKG1Jbml0aWFsTWFya01zKTsKLSAgICBwYXJjZWwtPndyaXRlSW50MzIobVJlc3VtZVBsYXliYWNrTWFya01zKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQogU3RyaW5nOCBCdWZmZXJpbmdTZXR0aW5nczo6dG9TdHJpbmcoKSBjb25zdCB7CiAgICAgU3RyaW5nOCBzOwogICAgIHMuYXBwZW5kRm9ybWF0KApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5jcHAgYi9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmNwcAppbmRleCA5OTBkMjYwLi41YzZiOTgxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmNwcApAQCAtMjgsNiArMjgsOCBAQAogI2luY2x1ZGUgPHVuaWNvZGUvdWNzZGV0Lmg+CiAjaW5jbHVkZSA8dW5pY29kZS91c3RyaW5nLmg+CiAKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3I6OkNoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IoKSB7CkBAIC0zOCw2ICs0MCwyNiBAQAogICAgICAgICBBTE9HRSgiY291bGQgbm90IGNyZWF0ZSBVQ29udmVydGVyIGZvciBVVEYtOCIpOwogICAgICAgICBtVXRmOENvbnYgPSBOVUxMOwogICAgIH0KKworICAgIC8vIFJlYWQgc3lzdGVtIGxvY2FsZSBzZXR0aW5nIGZyb20gc3lzdGVtIHByb3BlcnR5IGFuZCBtYXAgdG8gSUNVIGVuY29kaW5nIG5hbWVzLgorICAgIG1Mb2NhbGVFbmMgPSBOVUxMOworICAgIGNoYXIgbG9jYWxlX3ZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF0gPSAiIjsKKyAgICBpZiAocHJvcGVydHlfZ2V0KCJwZXJzaXN0LnN5cy5sb2NhbGUiLCBsb2NhbGVfdmFsdWUsIE5VTEwpID4gMCkgeworICAgICAgICBjb25zdCBzaXplX3QgbGVuID0gc3Rybmxlbihsb2NhbGVfdmFsdWUsIHNpemVvZihsb2NhbGVfdmFsdWUpKTsKKworICAgICAgICBpZiAobGVuID09IDMgJiYgIXN0cm5jbXAobG9jYWxlX3ZhbHVlLCAidW5kIiwgMykpIHsKKyAgICAgICAgICAgIC8vIFVuZGV0ZXJtaW5lZAorICAgICAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGxvY2FsZV92YWx1ZSwgInRoIiwgMikpIHsgLy8gVGhhaQorICAgICAgICAgICAgbUxvY2FsZUVuYyA9ICJ3aW5kb3dzLTg3NC0yMDAwIjsKKyAgICAgICAgfQorICAgICAgICBpZiAobUxvY2FsZUVuYyAhPSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HVigiU3lzdGVtIGxvY2FsZSBlbmNvZGluZyA9ICVzIiwgbUxvY2FsZUVuYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigiRGlkbid0IHJlY29nbml6ZSBzeXN0ZW0gbG9jYWxlIHNldHRpbmcsIGRlZmF1bHRpbmcgdG8gZW5fVVMiKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJDb3VsZG4ndCByZWFkIHN5c3RlbSBsb2NhbGUgc2V0dGluZywgYXNzdW1pbmcgZW5fVVMiKTsKKyAgICB9CiB9CiAKIENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3I6On5DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yKCkgewpAQCAtMTU3LDcgKzE3OSwxMSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGJlc3RDb21iaW5lZE1hdGNoICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChtTG9jYWxlRW5jICE9IE5VTEwgJiYgIWdvb2RtYXRjaCAmJiBoaWdoZXN0IDwgNTApIHsKKyAgICAgICAgICAgICAgICBjb21iaW5lZGVuYyA9IG1Mb2NhbGVFbmM7CisgICAgICAgICAgICAgICAgQUxPR1YoImNvbmZpZGVuY2UgaXMgbG93IGJ1dCB3ZSBoYXZlIHJlY29nbml6ZWQgcHJlZGVmaW5lZCBlbmNvZGluZywgIgorICAgICAgICAgICAgICAgICAgICAgICAgInNvIHRyeSB0aGlzICglcykgaW5zdGVhZCIsIG1Mb2NhbGVFbmMpOworICAgICAgICAgICAgfSBlbHNlIGlmIChiZXN0Q29tYmluZWRNYXRjaCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgY29tYmluZWRlbmMgPSB1Y3NkZXRfZ2V0TmFtZShiZXN0Q29tYmluZWRNYXRjaCwgJnN0YXR1cyk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGNvbWJpbmVkZW5jID0gIklTTy04ODU5LTEiOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3Rvci5jcHAKaW5kZXggZTlhNjIzMC4uZmI2ZDNhMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3IuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KQEAgLTIxOSwxMCArMjIwLDE2IEBACiAgICAgVmVjdG9yPHdwPElNZWRpYVNvdXJjZT4+IHRyYWNrczsKICAgICBWZWN0b3I8U3RyaW5nOD4gdHJhY2tEZXNjcmlwdGlvbnM7CiAgICAgU3RyaW5nOCB0b1N0cmluZygpIGNvbnN0OworICAgIHRpbWVfdCB3aGVuOwogfSBFeHRyYWN0b3JJbnN0YW5jZTsKIAogU3RyaW5nOCBFeHRyYWN0b3JJbnN0YW5jZTo6dG9TdHJpbmcoKSBjb25zdCB7Ci0gICAgU3RyaW5nOCBzdHIgPSBuYW1lOworICAgIFN0cmluZzggc3RyOworICAgIGNoYXIgdGltZVN0cmluZ1szMl07CisgICAgc3RyZnRpbWUodGltZVN0cmluZywgc2l6ZW9mKHRpbWVTdHJpbmcpLCAiJW0tJWQgJVQiLCBsb2NhbHRpbWUoJndoZW4pKTsKKyAgICBzdHIuYXBwZW5kKHRpbWVTdHJpbmcpOworICAgIHN0ci5hcHBlbmQoIjogIik7CisgICAgc3RyLmFwcGVuZChuYW1lKTsKICAgICBzdHIuYXBwZW5kKCIgZm9yIG1pbWUgIik7CiAgICAgc3RyLmFwcGVuZChtaW1lKTsKICAgICBzdHIuYXBwZW5kKCIsIHNvdXJjZSAiKTsKQEAgLTI4Nyw2ICsyOTQsNyBAQAogICAgIGV4LnNvdXJjZURlc2NyaXB0aW9uID0gc291cmNlLT50b1N0cmluZygpOwogICAgIGV4Lm93bmVyID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGV4LmV4dHJhY3RvciA9IGV4dHJhY3RvcjsKKyAgICBleC53aGVuID0gdGltZShOVUxMKTsKIAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soc0V4dHJhY3RvcnNMb2NrKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKaW5kZXggZDc1MzNjYS4uMjQzYjA5ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKQEAgLTIzLDEzICsyMywxMyBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBlbnVtIHsKICAgICBNQUtFX0VYVFJBQ1RPUiA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCiAgICAgTUFLRV9JREFUQV9TT1VSQ0VfRkQsCisgICAgR0VUX1NVUFBPUlRFRF9UWVBFUywKIH07CiAKIGNsYXNzIEJwTWVkaWFFeHRyYWN0b3JTZXJ2aWNlIDogcHVibGljIEJwSW50ZXJmYWNlPElNZWRpYUV4dHJhY3RvclNlcnZpY2U+CkBAIC02OSw2ICs2OSwyNCBAQAogICAgICAgICB9CiAgICAgICAgIHJldHVybiBudWxscHRyOwogICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBnZXRTdXBwb3J0ZWRUeXBlcygpIHsKKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBzdXBwb3J0ZWRUeXBlczsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhRXh0cmFjdG9yU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgc3RhdHVzX3QgcmV0ID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9TVVBQT1JURURfVFlQRVMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIC8vIHByb2Nlc3MgcmVwbHkKKyAgICAgICAgICAgIHdoaWxlKHRydWUpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpleHQgPSByZXBseS5yZWFkQ1N0cmluZygpOworICAgICAgICAgICAgICAgIGlmICghZXh0KSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdXBwb3J0ZWRUeXBlcy5pbnNlcnQoc3RkOjpzdHJpbmcoZXh0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cHBvcnRlZFR5cGVzOworICAgIH0KIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShNZWRpYUV4dHJhY3RvclNlcnZpY2UsICJhbmRyb2lkLm1lZGlhLklNZWRpYUV4dHJhY3RvclNlcnZpY2UiKTsKQEAgLTExNCw2ICsxMzIsMTUgQEAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgR0VUX1NVUFBPUlRFRF9UWVBFUzoKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYUV4dHJhY3RvclNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gc3VwcG9ydGVkVHlwZXMgPSBnZXRTdXBwb3J0ZWRUeXBlcygpOworICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gc3VwcG9ydGVkVHlwZXMuYmVnaW4oKTsgaXQgIT0gc3VwcG9ydGVkVHlwZXMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVDU3RyaW5nKCgqaXQpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcAppbmRleCA1OTBiYTFhLi5mOWZhODZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvSURhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmg+CisjaW5jbHVkZSA8cHJvY2Vzc2dyb3VwL3NjaGVkX3BvbGljeS5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcAppbmRleCBlMmVjY2RkLi5lYTA2NjY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKQEAgLTE3OSw3ICsxNzksOCBAQAogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUGxheWVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICBidWZmZXJpbmcud3JpdGVUb1BhcmNlbCgmZGF0YSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihidWZmZXJpbmcubUluaXRpYWxNYXJrTXMpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoYnVmZmVyaW5nLm1SZXN1bWVQbGF5YmFja01hcmtNcyk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQlVGRkVSSU5HX1NFVFRJTkdTLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQpAQCAtMTk0LDcgKzE5NSw4IEBACiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfQlVGRkVSSU5HX1NFVFRJTkdTLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgZXJyID0gYnVmZmVyaW5nLT5yZWFkRnJvbVBhcmNlbCgmcmVwbHkpOworICAgICAgICAgICAgYnVmZmVyaW5nLT5tSW5pdGlhbE1hcmtNcyA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAgICAgYnVmZmVyaW5nLT5tUmVzdW1lUGxheWJhY2tNYXJrTXMgPSByZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KQEAgLTY5Niw3ICs2OTgsOCBAQAogICAgICAgICBjYXNlIFNFVF9CVUZGRVJJTkdfU0VUVElOR1M6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFQbGF5ZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzIGJ1ZmZlcmluZzsKLSAgICAgICAgICAgIGJ1ZmZlcmluZy5yZWFkRnJvbVBhcmNlbCgmZGF0YSk7CisgICAgICAgICAgICBidWZmZXJpbmcubUluaXRpYWxNYXJrTXMgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYnVmZmVyaW5nLm1SZXN1bWVQbGF5YmFja01hcmtNcyA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZXRCdWZmZXJpbmdTZXR0aW5ncyhidWZmZXJpbmcpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKQEAgLTcwNiw3ICs3MDksOCBAQAogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gZ2V0QnVmZmVyaW5nU2V0dGluZ3MoJmJ1ZmZlcmluZyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlcnIpOwogICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgIGJ1ZmZlcmluZy53cml0ZVRvUGFyY2VsKHJlcGx5KTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihidWZmZXJpbmcubUluaXRpYWxNYXJrTXMpOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGJ1ZmZlcmluZy5tUmVzdW1lUGxheWJhY2tNYXJrTXMpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAppbmRleCBhY2E3YWQ5Li5iZDE4YTQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcApAQCAtMjMsNiArMjMsNyBAQAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUNvZGVjTGlzdC5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVJlY29yZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgogI2luY2x1ZGUgPG1lZGlhL0lSZW1vdGVEaXNwbGF5Lmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAKaW5kZXggYjJjOTFjNC4uYTM1NGNlMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcApAQCAtNjUsNyArNjUsOSBAQAogICAgIEdFVF9ST1VURURfREVWSUNFX0lELAogICAgIEVOQUJMRV9BVURJT19ERVZJQ0VfQ0FMTEJBQ0ssCiAgICAgR0VUX0FDVElWRV9NSUNST1BIT05FUywKLQorICAgIEdFVF9QT1JUX0lELAorICAgIFNFVF9QUkVGRVJSRURfTUlDUk9QSE9ORV9ESVJFQ1RJT04sCisgICAgU0VUX1BSRUZFUlJFRF9NSUNST1BIT05FX0ZJRUxEX0RJTUVOU0lPTgogfTsKIAogY2xhc3MgQnBNZWRpYVJlY29yZGVyOiBwdWJsaWMgQnBJbnRlcmZhY2U8SU1lZGlhUmVjb3JkZXI+CkBAIC00MDcsNiArNDA5LDQxIEBACiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCisgICAgc3RhdHVzX3Qgc2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgeworICAgICAgICBBTE9HVigic2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbiglZCkiLCBkaXJlY3Rpb24pOworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFSZWNvcmRlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGRpcmVjdGlvbik7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfUFJFRkVSUkVEX01JQ1JPUEhPTkVfRElSRUNUSU9OLCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gc3RhdHVzID09IE5PX0VSUk9SID8gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpIDogc3RhdHVzOworICAgIH0KKworICAgIHN0YXR1c190IHNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSB7CisgICAgICAgIEFMT0dWKCJzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oJWYpIiwgem9vbSk7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVJlY29yZGVyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlRmxvYXQoem9vbSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfUFJFRkVSUkVEX01JQ1JPUEhPTkVfRklFTERfRElNRU5TSU9OLCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gc3RhdHVzID09IE5PX0VSUk9SID8gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpIDogc3RhdHVzOworICAgIH0KKworICAgIHN0YXR1c190IGdldFBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpCisgICAgeworICAgICAgICBBTE9HVigiZ2V0UG9ydElkIik7CisgICAgICAgIGlmIChwb3J0SWQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFSZWNvcmRlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9QT1JUX0lELCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE9LCisgICAgICAgICAgICAgICAgfHwgKHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICpwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICAqcG9ydElkID0gKGF1ZGlvX3BvcnRfaGFuZGxlX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoTWVkaWFSZWNvcmRlciwgImFuZHJvaWQubWVkaWEuSU1lZGlhUmVjb3JkZXIiKTsKQEAgLTY2MSw2ICs2OTgsMzQgQEAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKIAogICAgICAgICB9CisgICAgICAgIGNhc2UgR0VUX1BPUlRfSUQ6IHsKKyAgICAgICAgICAgIEFMT0dWKCJHRVRfUE9SVF9JRCIpOworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVJlY29yZGVyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZDsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldFBvcnRJZCgmcG9ydElkKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocG9ydElkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNFVF9QUkVGRVJSRURfTUlDUk9QSE9ORV9ESVJFQ1RJT046IHsKKyAgICAgICAgICAgIEFMT0dWKCJTRVRfUFJFRkVSUkVEX01JQ1JPUEhPTkVfRElSRUNUSU9OIik7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUmVjb3JkZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGludCBkaXJlY3Rpb24gPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdD4oZGlyZWN0aW9uKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGNhc2UgU0VUX1BSRUZFUlJFRF9NSUNST1BIT05FX0ZJRUxEX0RJTUVOU0lPTjogeworICAgICAgICAgICAgQUxPR1YoIlNFVF9NSUNST1BIT05FX0ZJRUxEX0RJTUVOU0lPTiIpOworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVJlY29yZGVyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBmbG9hdCB6b29tID0gZGF0YS5yZWFkRmxvYXQoKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbih6b29tKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVNvdXJjZS5jcHAKaW5kZXggZjE4NWZkNC4uNTA4MjZjNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFTb3VyY2UuY3BwCkBAIC0xMDcsNiArMTA3LDcgQEAKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKEJwTWVkaWFTb3VyY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIHN0YXR1c190IHJldCA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRGT1JNQVQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEF1dG9NdXRleCBfbChtTG9jayk7CiAgICAgICAgICAgICBtTWV0YURhdGEgPSBNZXRhRGF0YTo6Y3JlYXRlRnJvbVBhcmNlbChyZXBseSk7CiAgICAgICAgICAgICByZXR1cm4gbU1ldGFEYXRhOwogICAgICAgICB9CkBAIC0xODYsNiArMTg3LDkgQEAKICAgICAgICAgcmV0ID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIEFMT0dWKCJyZWFkTXVsdGlwbGUgc3RhdHVzICVkLCBidWZmZXJDb3VudCAldSwgc2luY2VTdG9wICV1IiwKICAgICAgICAgICAgICAgICByZXQsIGJ1ZmZlckNvdW50LCBtQnVmZmVyc1NpbmNlU3RvcCk7CisgICAgICAgIGlmIChidWZmZXJDb3VudCAmJiByZXQgPT0gV09VTERfQkxPQ0spIHsKKyAgICAgICAgICAgIHJldCA9IE9LOworICAgICAgICB9CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCkBAIC0yMTksNiArMjIzLDggQEAKICAgICAvLyBOdVBsYXllciBwYXNzZXMgcG9pbnRlcnMtdG8tbWV0YWRhdGEgYXJvdW5kLCBzbyB3ZSB1c2UgdGhpcyB0byBrZWVwIHRoZSBtZXRhZGF0YSBhbGl2ZQogICAgIC8vIFhYWDogY291bGQgd2UgdXNlIHRoaXMgZm9yIGNhY2hpbmcsIG9yIGRvZXMgbWV0YWRhdGEgY2hhbmdlIG9uIHRoZSBmbHk/CiAgICAgc3A8TWV0YURhdGE+IG1NZXRhRGF0YTsKKyAgICAvLyBlbnN1cmUgc3luY2hyb25pemUgYWNjZXNzIHRvIG1NZXRhRGF0YQorICAgIE11dGV4IG1Mb2NrOwogCiAgICAgLy8gQ2FjaGUgYWxsIElNZW1vcnkgb2JqZWN0cyByZWNlaXZlZCBmcm9tIE1lZGlhRXh0cmFjdG9yLgogICAgIC8vIFdlIGdjIElNZW1vcnkgb2JqZWN0cyB0aGF0IGFyZSBubyBsb25nZXIgYWN0aXZlIChyZWZlcmVuY2VkIGJ5IGEgTWVkaWFCdWZmZXIpLgpAQCAtMzYyLDEzICszNjgsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJVc2Ugc2hhcmVkIG1lbW9yeTogJXp1IiwgbGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyQnVmID0gYnVmOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkxhcmdlIGJ1ZmZlciAlenUgd2l0aG91dCBJTWVtb3J5ISIsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiTGFyZ2UgYnVmZmVyICV6dSB3aXRob3V0IElNZW1vcnkhIiwgbGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNZWRpYUJ1ZmZlckJhc2UgKiopJnRyYW5zZmVyQnVmLCBmYWxzZSAvKiBub25CbG9ja2luZyAqLywgbGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gT0sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHJhbnNmZXJCdWYgPT0gbnVsbHB0cgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0cmFuc2ZlckJ1Zi0+bU1lbW9yeSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBhY3F1aXJlIHNoYXJlZCBtZW1vcnksIHNpemUgJXp1LCByZXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJGYWlsZWQgdG8gYWNxdWlyZSBzaGFyZWQgbWVtb3J5LCBzaXplICV6dSwgcmV0ICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwgcmV0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmZXJCdWYgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlckJ1Zi0+cmVsZWFzZSgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAgYi9tZWRpYS9saWJtZWRpYS9JT01YLmNwcAppbmRleCBhMDczMDgxLi5iYzBjMmNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JT01YLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JT01YLmNwcApAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgPG1lZGlhL29wZW5tYXgvT01YX0luZGV4RXh0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvT01YQnVmZmVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvTmF0aXZlSGFuZGxlLmg+Ci0jaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KIAogI2luY2x1ZGUgPG1lZGlhL29teC8xLjAvV09teE5vZGUuaD4KICNpbmNsdWRlIDxhbmRyb2lkL0lHcmFwaGljQnVmZmVyU291cmNlLmg+CkBAIC02Miw3OSArNjEsNiBAQAogICAgIFNFVF9RVUlSS1MsCiB9OwogCi1jbGFzcyBCcE9NWCA6IHB1YmxpYyBCcEludGVyZmFjZTxJT01YPiB7Ci1wdWJsaWM6Ci0gICAgZXhwbGljaXQgQnBPTVgoY29uc3Qgc3A8SUJpbmRlcj4gJmltcGwpCi0gICAgICAgIDogQnBJbnRlcmZhY2U8SU9NWD4oaW1wbCkgewotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdE5vZGVzKExpc3Q8Q29tcG9uZW50SW5mbz4gKmxpc3QpIHsKLSAgICAgICAgbGlzdC0+Y2xlYXIoKTsKLQotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJT01YOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwotICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoTElTVF9OT0RFUywgZGF0YSwgJnJlcGx5KTsKLQotICAgICAgICBpbnQzMl90IG4gPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0gICAgICAgICAgICBsaXN0LT5wdXNoX2JhY2soQ29tcG9uZW50SW5mbygpKTsKLSAgICAgICAgICAgIENvbXBvbmVudEluZm8gJmluZm8gPSAqLS1saXN0LT5lbmQoKTsKLQotICAgICAgICAgICAgaW5mby5tTmFtZSA9IHJlcGx5LnJlYWRTdHJpbmc4KCk7Ci0gICAgICAgICAgICBpbnQzMl90IG51bVJvbGVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBmb3IgKGludDMyX3QgaiA9IDA7IGogPCBudW1Sb2xlczsgKytqKSB7Ci0gICAgICAgICAgICAgICAgaW5mby5tUm9sZXMucHVzaF9iYWNrKHJlcGx5LnJlYWRTdHJpbmc4KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgYWxsb2NhdGVOb2RlKAotICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3Qgc3A8SU9NWE9ic2VydmVyPiAmb2JzZXJ2ZXIsCi0gICAgICAgICAgICBzcDxJT01YTm9kZT4gKm9teE5vZGUpIHsKLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcobmFtZSk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIob2JzZXJ2ZXIpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEFMTE9DQVRFX05PREUsIGRhdGEsICZyZXBseSk7Ci0KLSAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICpvbXhOb2RlID0gSU9NWE5vZGU6OmFzSW50ZXJmYWNlKHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBvbXhOb2RlLT5jbGVhcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUlucHV0U3VyZmFjZSgKLSAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICpidWZmZXJQcm9kdWNlciwKLSAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyU291cmNlPiAqYnVmZmVyU291cmNlKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgc3RhdHVzX3QgZXJyOwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZXJyID0gcmVtb3RlKCktPnRyYW5zYWN0KENSRUFURV9JTlBVVF9TVVJGQUNFLCBkYXRhLCAmcmVwbHkpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HVygiYmluZGVyIHRyYW5zYWN0aW9uIGZhaWxlZDogJWQiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIGVyciA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0KLSAgICAgICAgKmJ1ZmZlclByb2R1Y2VyID0gSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6YXNJbnRlcmZhY2UoCi0gICAgICAgICAgICAgICAgcmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKLSAgICAgICAgKmJ1ZmZlclNvdXJjZSA9IElHcmFwaGljQnVmZmVyU291cmNlOjphc0ludGVyZmFjZSgKLSAgICAgICAgICAgICAgICByZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotfTsKLQogY2xhc3MgQnBPTVhOb2RlIDogcHVibGljIEJwSW50ZXJmYWNlPElPTVhOb2RlPiB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgQnBPTVhOb2RlKGNvbnN0IHNwPElCaW5kZXI+ICZpbXBsKQpAQCAtNTUxLDggKzQ3Nyw3IEBACiAgICAgfQogfTsKIAotSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKE9NWCwgImFuZHJvaWQuaGFyZHdhcmUuSU9NWCIpOwotSU1QTEVNRU5UX0hZQlJJRF9NRVRBX0lOVEVSRkFDRShPTVhOb2RlLCBJT214Tm9kZSwgImFuZHJvaWQuaGFyZHdhcmUuSU9NWE5vZGUiKTsKK0lNUExFTUVOVF9IWUJSSURfTUVUQV9JTlRFUkZBQ0UoT01YTm9kZSwgImFuZHJvaWQuaGFyZHdhcmUuSU9NWE5vZGUiKTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIApAQCAtNTYyLDgyICs0ODcsNiBAQAogICAgICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOyBcCiAgICAgICAgIH0gfSB3aGlsZSAoMCkKIAotc3RhdHVzX3QgQm5PTVg6Om9uVHJhbnNhY3QoCi0gICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsICZkYXRhLCBQYXJjZWwgKnJlcGx5LCB1aW50MzJfdCBmbGFncykgewotICAgIHN3aXRjaCAoY29kZSkgewotICAgICAgICBjYXNlIExJU1RfTk9ERVM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwotCi0gICAgICAgICAgICBMaXN0PENvbXBvbmVudEluZm8+IGxpc3Q7Ci0gICAgICAgICAgICBsaXN0Tm9kZXMoJmxpc3QpOwotCi0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihsaXN0LnNpemUoKSk7Ci0gICAgICAgICAgICBmb3IgKExpc3Q8Q29tcG9uZW50SW5mbz46Oml0ZXJhdG9yIGl0ID0gbGlzdC5iZWdpbigpOwotICAgICAgICAgICAgICAgICBpdCAhPSBsaXN0LmVuZCgpOyArK2l0KSB7Ci0gICAgICAgICAgICAgICAgQ29tcG9uZW50SW5mbyAmY3VyID0gKml0OwotCi0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3RyaW5nOChjdXIubU5hbWUpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGN1ci5tUm9sZXMuc2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBmb3IgKExpc3Q8U3RyaW5nOD46Oml0ZXJhdG9yIHJvbGVfaXQgPSBjdXIubVJvbGVzLmJlZ2luKCk7Ci0gICAgICAgICAgICAgICAgICAgICByb2xlX2l0ICE9IGN1ci5tUm9sZXMuZW5kKCk7ICsrcm9sZV9pdCkgewotICAgICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJpbmc4KCpyb2xlX2l0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgQUxMT0NBVEVfTk9ERToKLSAgICAgICAgewotICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7Ci0KLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBkYXRhLnJlYWRDU3RyaW5nKCk7Ci0KLSAgICAgICAgICAgIHNwPElPTVhPYnNlcnZlcj4gb2JzZXJ2ZXIgPQotICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElPTVhPYnNlcnZlcj4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwotCi0gICAgICAgICAgICBpZiAobmFtZSA9PSBOVUxMIHx8IG9ic2VydmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYi8yNjM5MjcwMCIpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKElOVkFMSURfT1BFUkFUSU9OKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNwPElPTVhOb2RlPiBvbXhOb2RlOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBhbGxvY2F0ZU5vZGUobmFtZSwgb2JzZXJ2ZXIsICZvbXhOb2RlKTsKLQotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXJyKTsKLSAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIob214Tm9kZSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIENSRUFURV9JTlBVVF9TVVJGQUNFOgotICAgICAgICB7Ci0gICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKLQotICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gYnVmZmVyUHJvZHVjZXI7Ci0gICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclNvdXJjZT4gYnVmZmVyU291cmNlOwotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gY3JlYXRlSW5wdXRTdXJmYWNlKCZidWZmZXJQcm9kdWNlciwgJmJ1ZmZlclNvdXJjZSk7Ci0KLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycik7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoYnVmZmVyUHJvZHVjZXIpKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoYnVmZmVyU291cmNlKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwotICAgIH0KLX0KLQogc3RhdHVzX3QgQm5PTVhOb2RlOjpvblRyYW5zYWN0KAogICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCAmZGF0YSwgUGFyY2VsICpyZXBseSwgdWludDMyX3QgZmxhZ3MpIHsKICAgICBzd2l0Y2ggKGNvZGUpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhQ29kZWNJbmZvLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhQ29kZWNJbmZvLmNwcAppbmRleCA1MzA4ZTFjLi44NmFkOTk3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NZWRpYUNvZGVjSW5mby5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFDb2RlY0luZm8uY3BwCkBAIC0yOCw2ICsyOCwxNSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKKy8qKiBUaGlzIHJlZHVuZGFudCByZWRlY2xhcmF0aW9uIGlzIG5lZWRlZCBmb3IgQysrIHByZSAxNCAqLworY29uc3RleHByIGNoYXIgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6RkVBVFVSRV9BREFQVElWRV9QTEFZQkFDS1tdOworY29uc3RleHByIGNoYXIgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6RkVBVFVSRV9EWU5BTUlDX1RJTUVTVEFNUFtdOworY29uc3RleHByIGNoYXIgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6RkVBVFVSRV9GUkFNRV9QQVJTSU5HW107Citjb25zdGV4cHIgY2hhciBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpGRUFUVVJFX0lOVFJBX1JFRlJFU0hbXTsKK2NvbnN0ZXhwciBjaGFyIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZFQVRVUkVfTVVMVElQTEVfRlJBTUVTW107Citjb25zdGV4cHIgY2hhciBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpGRUFUVVJFX1NFQ1VSRV9QTEFZQkFDS1tdOworY29uc3RleHByIGNoYXIgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6RkVBVFVSRV9UVU5ORUxFRF9QTEFZQkFDS1tdOworCiB2b2lkIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OmdldFN1cHBvcnRlZFByb2ZpbGVMZXZlbHMoCiAgICAgICAgIFZlY3RvcjxQcm9maWxlTGV2ZWw+ICpwcm9maWxlTGV2ZWxzKSBjb25zdCB7CiAgICAgcHJvZmlsZUxldmVscy0+Y2xlYXIoKTsKQEAgLTQwLDE2ICs0OSwxMSBAQAogICAgIGNvbG9yRm9ybWF0cy0+YXBwZW5kVmVjdG9yKG1Db2xvckZvcm1hdHMpOwogfQogCi11aW50MzJfdCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpnZXRGbGFncygpIGNvbnN0IHsKLSAgICByZXR1cm4gbUZsYWdzOwotfQotCiBjb25zdCBzcDxBTWVzc2FnZT4gTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6Z2V0RGV0YWlscygpIGNvbnN0IHsKICAgICByZXR1cm4gbURldGFpbHM7CiB9CiAKLU1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkNhcGFiaWxpdGllcygpCi0gIDogbUZsYWdzKDApIHsKK01lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkNhcGFiaWxpdGllcygpIHsKICAgICBtRGV0YWlscyA9IG5ldyBBTWVzc2FnZTsKIH0KIApAQCAtNzMsMTIgKzc3LDEwIEBACiAgICAgICAgICAgICBjYXBzLT5tQ29sb3JGb3JtYXRzLnB1c2hfYmFjayhjb2xvcik7CiAgICAgICAgIH0KICAgICB9Ci0gICAgdWludDMyX3QgZmxhZ3MgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKICAgICBzcDxBTWVzc2FnZT4gZGV0YWlscyA9IEFNZXNzYWdlOjpGcm9tUGFyY2VsKHBhcmNlbCk7CiAgICAgaWYgKGRldGFpbHMgPT0gTlVMTCkKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgaWYgKGNhcHMgIT0gTlVMTCkgewotICAgICAgICBjYXBzLT5tRmxhZ3MgPSBmbGFnczsKICAgICAgICAgY2Fwcy0+bURldGFpbHMgPSBkZXRhaWxzOwogICAgIH0KICAgICByZXR1cm4gY2FwczsKQEAgLTk2LDcgKzk4LDYgQEAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db2xvckZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKG1Db2xvckZvcm1hdHMuaXRlbUF0KGkpKTsKICAgICB9Ci0gICAgcGFyY2VsLT53cml0ZUludDMyKG1GbGFncyk7CiAgICAgbURldGFpbHMtPndyaXRlVG9QYXJjZWwocGFyY2VsKTsKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xMTEsNiArMTEyLDE0IEBACiAgICAgbUNhcC0+bURldGFpbHMtPnNldEludDMyKGtleSwgdmFsdWUpOwogfQogCit2b2lkIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI6OnJlbW92ZURldGFpbChjb25zdCBjaGFyKiBrZXkpIHsKKyAgICBpZiAobUNhcC0+bURldGFpbHMtPnJlbW92ZUVudHJ5QXQobUNhcC0+bURldGFpbHMtPmZpbmRFbnRyeUJ5TmFtZShrZXkpKSA9PSBPSykgeworICAgICAgICBBTE9HRCgic3VjY2Vzc2Z1bGx5IHJlbW92ZWQgZGV0YWlsICVzIiwga2V5KTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRCgiZGV0YWlsICVzIHdhc24ndCBwcmVzZW50IHRvIHJlbW92ZSIsIGtleSk7CisgICAgfQorfQorCiB2b2lkIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI6OmFkZFByb2ZpbGVMZXZlbCgKICAgICAgICAgdWludDMyX3QgcHJvZmlsZSwgdWludDMyX3QgbGV2ZWwpIHsKICAgICBQcm9maWxlTGV2ZWwgcHJvZmlsZUxldmVsOwpAQCAtMTI5LDMyICsxMzgsMzIgQEAKICAgICB9CiB9CiAKLXZvaWQgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcjo6YWRkRmxhZ3ModWludDMyX3QgZmxhZ3MpIHsKLSAgICBtQ2FwLT5tRmxhZ3MgfD0gZmxhZ3M7Ci19Ci0KIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI6OkNhcGFiaWxpdGllc1dyaXRlcigKICAgICAgICAgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcyogY2FwKSA6IG1DYXAoY2FwKSB7CiB9CiAKLWJvb2wgTWVkaWFDb2RlY0luZm86OmlzRW5jb2RlcigpIGNvbnN0IHsKLSAgICByZXR1cm4gbUlzRW5jb2RlcjsKK01lZGlhQ29kZWNJbmZvOjpBdHRyaWJ1dGVzIE1lZGlhQ29kZWNJbmZvOjpnZXRBdHRyaWJ1dGVzKCkgY29uc3QgeworICAgIHJldHVybiBtQXR0cmlidXRlczsKIH0KIAotdWludDMyX3QgTWVkaWFDb2RlY0luZm86OnJhbmsoKSBjb25zdCB7Cit1aW50MzJfdCBNZWRpYUNvZGVjSW5mbzo6Z2V0UmFuaygpIGNvbnN0IHsKICAgICByZXR1cm4gbVJhbms7CiB9CiAKLXZvaWQgTWVkaWFDb2RlY0luZm86OmdldFN1cHBvcnRlZE1pbWVzKFZlY3RvcjxBU3RyaW5nPiAqbWltZXMpIGNvbnN0IHsKLSAgICBtaW1lcy0+Y2xlYXIoKTsKK3ZvaWQgTWVkaWFDb2RlY0luZm86OmdldEFsaWFzZXMoVmVjdG9yPEFTdHJpbmc+ICphbGlhc2VzKSBjb25zdCB7CisgICAgKmFsaWFzZXMgPSBtQWxpYXNlczsKK30KKwordm9pZCBNZWRpYUNvZGVjSW5mbzo6Z2V0U3VwcG9ydGVkTWVkaWFUeXBlcyhWZWN0b3I8QVN0cmluZz4gKm1lZGlhVHlwZXMpIGNvbnN0IHsKKyAgICBtZWRpYVR5cGVzLT5jbGVhcigpOwogICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBtQ2Fwcy5zaXplKCk7IGl4KyspIHsKLSAgICAgICAgbWltZXMtPnB1c2hfYmFjayhtQ2Fwcy5rZXlBdChpeCkpOworICAgICAgICBtZWRpYVR5cGVzLT5wdXNoX2JhY2sobUNhcHMua2V5QXQoaXgpKTsKICAgICB9CiB9CiAKIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+Ci1NZWRpYUNvZGVjSW5mbzo6Z2V0Q2FwYWJpbGl0aWVzRm9yKGNvbnN0IGNoYXIgKm1pbWUpIGNvbnN0IHsKLSAgICBzc2l6ZV90IGl4ID0gZ2V0Q2FwYWJpbGl0eUluZGV4KG1pbWUpOworTWVkaWFDb2RlY0luZm86OmdldENhcGFiaWxpdGllc0Zvcihjb25zdCBjaGFyICptZWRpYVR5cGUpIGNvbnN0IHsKKyAgICBzc2l6ZV90IGl4ID0gZ2V0Q2FwYWJpbGl0eUluZGV4KG1lZGlhVHlwZSk7CiAgICAgaWYgKGl4ID49IDApIHsKICAgICAgICAgcmV0dXJuIG1DYXBzLnZhbHVlQXQoaXgpOwogICAgIH0KQEAgLTE3MywyMSArMTgyLDI2IEBACiBzcDxNZWRpYUNvZGVjSW5mbz4gTWVkaWFDb2RlY0luZm86OkZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpIHsKICAgICBBU3RyaW5nIG5hbWUgPSBBU3RyaW5nOjpGcm9tUGFyY2VsKHBhcmNlbCk7CiAgICAgQVN0cmluZyBvd25lciA9IEFTdHJpbmc6OkZyb21QYXJjZWwocGFyY2VsKTsKLSAgICBib29sIGlzRW5jb2RlciA9IHN0YXRpY19jYXN0PGJvb2w+KHBhcmNlbC5yZWFkSW50MzIoKSk7CisgICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzID0gc3RhdGljX2Nhc3Q8QXR0cmlidXRlcz4ocGFyY2VsLnJlYWRJbnQzMigpKTsKICAgICB1aW50MzJfdCByYW5rID0gcGFyY2VsLnJlYWRVaW50MzIoKTsKICAgICBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IG5ldyBNZWRpYUNvZGVjSW5mbzsKICAgICBpbmZvLT5tTmFtZSA9IG5hbWU7CiAgICAgaW5mby0+bU93bmVyID0gb3duZXI7Ci0gICAgaW5mby0+bUlzRW5jb2RlciA9IGlzRW5jb2RlcjsKKyAgICBpbmZvLT5tQXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7CiAgICAgaW5mby0+bVJhbmsgPSByYW5rOworICAgIHNpemVfdCBudW1BbGlhc2VzID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihwYXJjZWwucmVhZEludDMyKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtQWxpYXNlczsgaSsrKSB7CisgICAgICAgIEFTdHJpbmcgYWxpYXMgPSBBU3RyaW5nOjpGcm9tUGFyY2VsKHBhcmNlbCk7CisgICAgICAgIGluZm8tPm1BbGlhc2VzLmFkZChhbGlhcyk7CisgICAgfQogICAgIHNpemVfdCBzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihwYXJjZWwucmVhZEludDMyKCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgIEFTdHJpbmcgbWltZSA9IEFTdHJpbmc6OkZyb21QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgQVN0cmluZyBtZWRpYVR5cGUgPSBBU3RyaW5nOjpGcm9tUGFyY2VsKHBhcmNlbCk7CiAgICAgICAgIHNwPENhcGFiaWxpdGllcz4gY2FwcyA9IENhcGFiaWxpdGllczo6RnJvbVBhcmNlbChwYXJjZWwpOwogICAgICAgICBpZiAoY2FwcyA9PSBOVUxMKQogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIGlmIChpbmZvICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGluZm8tPm1DYXBzLmFkZChtaW1lLCBjYXBzKTsKKyAgICAgICAgICAgIGluZm8tPm1DYXBzLmFkZChtZWRpYVR5cGUsIGNhcHMpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBpbmZvOwpAQCAtMTk2LDggKzIxMCwxMiBAQAogc3RhdHVzX3QgTWVkaWFDb2RlY0luZm86OndyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IHsKICAgICBtTmFtZS53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CiAgICAgbU93bmVyLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKLSAgICBwYXJjZWwtPndyaXRlSW50MzIobUlzRW5jb2Rlcik7CisgICAgcGFyY2VsLT53cml0ZUludDMyKG1BdHRyaWJ1dGVzKTsKICAgICBwYXJjZWwtPndyaXRlVWludDMyKG1SYW5rKTsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIobUFsaWFzZXMuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IEFTdHJpbmcgJmFsaWFzIDogbUFsaWFzZXMpIHsKKyAgICAgICAgYWxpYXMud3JpdGVUb1BhcmNlbChwYXJjZWwpOworICAgIH0KICAgICBwYXJjZWwtPndyaXRlSW50MzIobUNhcHMuc2l6ZSgpKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DYXBzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIG1DYXBzLmtleUF0KGkpLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKQEAgLTIwNiwxMCArMjI0LDEwIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zc2l6ZV90IE1lZGlhQ29kZWNJbmZvOjpnZXRDYXBhYmlsaXR5SW5kZXgoY29uc3QgY2hhciAqbWltZSkgY29uc3QgewotICAgIGlmIChtaW1lKSB7Citzc2l6ZV90IE1lZGlhQ29kZWNJbmZvOjpnZXRDYXBhYmlsaXR5SW5kZXgoY29uc3QgY2hhciAqbWVkaWFUeXBlKSBjb25zdCB7CisgICAgaWYgKG1lZGlhVHlwZSkgewogICAgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgbUNhcHMuc2l6ZSgpOyBpeCsrKSB7Ci0gICAgICAgICAgICBpZiAobUNhcHMua2V5QXQoaXgpLmVxdWFsc0lnbm9yZUNhc2UobWltZSkpIHsKKyAgICAgICAgICAgIGlmIChtQ2Fwcy5rZXlBdChpeCkuZXF1YWxzSWdub3JlQ2FzZShtZWRpYVR5cGUpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGl4OwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yMTcsMTkgKzIzNSwyNiBAQAogICAgIHJldHVybiAtMTsKIH0KIAotTWVkaWFDb2RlY0luZm86Ok1lZGlhQ29kZWNJbmZvKCkgOiBtUmFuaygweDEwMCkgeworTWVkaWFDb2RlY0luZm86Ok1lZGlhQ29kZWNJbmZvKCkKKyAgICA6IG1BdHRyaWJ1dGVzKChNZWRpYUNvZGVjSW5mbzo6QXR0cmlidXRlcykwKSwKKyAgICAgIG1SYW5rKDB4MTAwKSB7CiB9CiAKIHZvaWQgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OnNldE5hbWUoY29uc3QgY2hhciogbmFtZSkgewogICAgIG1JbmZvLT5tTmFtZSA9IG5hbWU7CiB9CiAKK3ZvaWQgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OmFkZEFsaWFzKGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICBtSW5mby0+bUFsaWFzZXMuYWRkKG5hbWUpOworfQorCiB2b2lkIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjpzZXRPd25lcihjb25zdCBjaGFyKiBvd25lcikgewogICAgIG1JbmZvLT5tT3duZXIgPSBvd25lcjsKIH0KIAotdm9pZCBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6c2V0RW5jb2Rlcihib29sIGlzRW5jb2RlcikgewotICAgIG1JbmZvLT5tSXNFbmNvZGVyID0gaXNFbmNvZGVyOwordm9pZCBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6c2V0QXR0cmlidXRlcygKKyAgICAgICAgdHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8TWVkaWFDb2RlY0luZm86OkF0dHJpYnV0ZXM+Ojp0eXBlIGF0dHJpYnV0ZXMpIHsKKyAgICBtSW5mby0+bUF0dHJpYnV0ZXMgPSAoTWVkaWFDb2RlY0luZm86OkF0dHJpYnV0ZXMpYXR0cmlidXRlczsKIH0KIAogdm9pZCBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6c2V0UmFuayh1aW50MzJfdCByYW5rKSB7CkBAIC0yMzcsMjEgKzI2MiwyMSBAQAogfQogCiBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcj4KLSAgICAgICAgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OmFkZE1pbWUoY29uc3QgY2hhciAqbWltZSkgewotICAgIHNzaXplX3QgaXggPSBtSW5mby0+Z2V0Q2FwYWJpbGl0eUluZGV4KG1pbWUpOworICAgICAgICBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6YWRkTWVkaWFUeXBlKGNvbnN0IGNoYXIgKm1lZGlhVHlwZSkgeworICAgIHNzaXplX3QgaXggPSBtSW5mby0+Z2V0Q2FwYWJpbGl0eUluZGV4KG1lZGlhVHlwZSk7CiAgICAgaWYgKGl4ID49IDApIHsKICAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyPigKICAgICAgICAgICAgICAgICBuZXcgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcigKICAgICAgICAgICAgICAgICBtSW5mby0+bUNhcHMudmFsdWVBdChpeCkuZ2V0KCkpKTsKICAgICB9CiAgICAgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gY2FwcyA9IG5ldyBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzKCk7Ci0gICAgbUluZm8tPm1DYXBzLmFkZChBU3RyaW5nKG1pbWUpLCBjYXBzKTsKKyAgICBtSW5mby0+bUNhcHMuYWRkKEFTdHJpbmcobWVkaWFUeXBlKSwgY2Fwcyk7CiAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyPigKICAgICAgICAgICAgIG5ldyBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyKGNhcHMuZ2V0KCkpKTsKIH0KIAotYm9vbCBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6cmVtb3ZlTWltZShjb25zdCBjaGFyICptaW1lKSB7Ci0gICAgc3NpemVfdCBpeCA9IG1JbmZvLT5nZXRDYXBhYmlsaXR5SW5kZXgobWltZSk7Citib29sIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjpyZW1vdmVNZWRpYVR5cGUoY29uc3QgY2hhciAqbWVkaWFUeXBlKSB7CisgICAgc3NpemVfdCBpeCA9IG1JbmZvLT5nZXRDYXBhYmlsaXR5SW5kZXgobWVkaWFUeXBlKTsKICAgICBpZiAoaXggPj0gMCkgewogICAgICAgICBtSW5mby0+bUNhcHMucmVtb3ZlSXRlbXNBdChpeCk7CiAgICAgICAgIHJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFQcm9maWxlcy5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcAppbmRleCBhYWRlNjlhLi45OGM1NDk3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcApAQCAtNDgsNyArNDgsOCBAQAogICAgIHsiYW1yd2IiLCAgQVVESU9fRU5DT0RFUl9BTVJfV0J9LAogICAgIHsiYWFjIiwgICAgQVVESU9fRU5DT0RFUl9BQUN9LAogICAgIHsiaGVhYWMiLCAgQVVESU9fRU5DT0RFUl9IRV9BQUN9LAotICAgIHsiYWFjZWxkIiwgQVVESU9fRU5DT0RFUl9BQUNfRUxEfQorICAgIHsiYWFjZWxkIiwgQVVESU9fRU5DT0RFUl9BQUNfRUxEfSwgCisgICAgeyJvcHVzIiwgICBBVURJT19FTkNPREVSX09QVVN9CiB9OwogCiBjb25zdCBNZWRpYVByb2ZpbGVzOjpOYW1lVG9UYWdNYXAgTWVkaWFQcm9maWxlczo6c0ZpbGVGb3JtYXRNYXBbXSA9IHsKQEAgLTkxLDYgKzkyLDE5IEBACiAgICAgeyJoaWdoc3BlZWQ3MjBwIiwgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF83MjBQfSwKICAgICB7ImhpZ2hzcGVlZDEwODBwIiwgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF8xMDgwUH0sCiAgICAgeyJoaWdoc3BlZWQyMTYwcCIsIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfMjE2MFB9LAorCisgICAgLy8gVmVuZG9yLXNwZWNpZmljIHByb2ZpbGVzCisgICAgeyJ2Z2EiLCBDQU1DT1JERVJfUVVBTElUWV9WR0F9LAorICAgIHsiNGtkY2kiLCBDQU1DT1JERVJfUVVBTElUWV80S0RDSX0sCisgICAgeyJ0aW1lbGFwc2V2Z2EiLCBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX1ZHQX0sCisgICAgeyJ0aW1lbGFwc2U0a2RjaSIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfNEtEQ0l9LAorICAgIHsiaGlnaHNwZWVkY2lmIiwgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9DSUZ9LAorICAgIHsiaGlnaHNwZWVkdmdhIiwgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9WR0F9LAorICAgIHsiaGlnaHNwZWVkNGtkY2kiLCBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzRLRENJfSwKKyAgICB7InFoZCIsIENBTUNPUkRFUl9RVUFMSVRZX1FIRH0sCisgICAgeyIyayIsIENBTUNPUkRFUl9RVUFMSVRZXzJrfSwKKyAgICB7InRpbWVsYXBzZXFoZCIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfUUhEfSwKKyAgICB7InRpbWVsYXBzZTJrIiwgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV8ya30sCiB9OwogCiAjaWYgTE9HX05ERUJVRwpAQCAtNTQ2LDggKzU2MCw4IEBACiAKICAgICAgICAgICAgIGlmIChpbmZvLT5tSGFzUmVmUHJvZmlsZSkgewogCi0gICAgICAgICAgICAgICAgQ2FtY29yZGVyUHJvZmlsZSAqcHJvZmlsZSA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBDYW1jb3JkZXJQcm9maWxlKAorICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDYW1jb3JkZXJQcm9maWxlPiBwcm9maWxlID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDYW1jb3JkZXJQcm9maWxlPigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbUNhbWNvcmRlclByb2ZpbGVzW2luZm8tPm1SZWZQcm9maWxlSW5kZXhdKTsKIAogICAgICAgICAgICAgICAgIC8vIE92ZXJ3cml0ZSB0aGUgcXVhbGl0eQpAQCAtNTgxLDcgKzU5NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtY29yZGVyUHJvZmlsZXNbaW5mby0+bVJlZlByb2ZpbGVJbmRleF0tPm1RdWFsaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bVF1YWxpdHksIGNhbWVyYUlkKTsKIAotICAgICAgICAgICAgICAgIG1DYW1jb3JkZXJQcm9maWxlcy5hZGQocHJvZmlsZSk7CisgICAgICAgICAgICAgICAgbUNhbWNvcmRlclByb2ZpbGVzLmFkZChwcm9maWxlLnJlbGVhc2UoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYVV0aWxzLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhVXRpbHMuY3BwCmluZGV4IGJjZGMzYmQuLjMxOTcyZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhVXRpbHMuY3BwCkBAIC0yMiwyMiArMjIsMTYgQEAKICNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAorI2luY2x1ZGUgPGJpb25pY19tYWxsb2MuaD4KKwogI2luY2x1ZGUgIk1lZGlhVXRpbHMuaCIKIAotZXh0ZXJuICJDIiBzaXplX3QgX19jZmlfc2hhZG93X3NpemUoKTsKK2V4dGVybiAiQyIgdm9pZCBfX3NjdWRvX3NldF9yc3NfbGltaXQoc2l6ZV90LCBpbnQpIF9fYXR0cmlidXRlX18oKHdlYWspKTsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi12b2lkIGxpbWl0UHJvY2Vzc01lbW9yeSgKLSAgICBjb25zdCBjaGFyICpwcm9wZXJ0eSwKLSAgICBzaXplX3QgbnVtYmVyT2ZCeXRlcywKLSAgICBzaXplX3QgcGVyY2VudGFnZU9mVG90YWxNZW0pIHsKLQotICAgIGlmIChydW5uaW5nX3dpdGhfYXNhbigpKSB7Ci0gICAgICAgIEFMT0dXKCJSdW5uaW5nIHdpdGggQVNhbiwgc2tpcCBlbmZvcmNpbmcgbWVtb3J5IGxpbWl0YXRpb25zLiIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCit2b2lkIGxpbWl0UHJvY2Vzc01lbW9yeShjb25zdCBjaGFyICpwcm9wZXJ0eSwgc2l6ZV90IG51bWJlck9mQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcGVyY2VudGFnZU9mVG90YWxNZW0pIHsKICAgICBsb25nIHBhZ2VTaXplID0gc3lzY29uZihfU0NfUEFHRVNJWkUpOwogICAgIGxvbmcgbnVtUGFnZXMgPSBzeXNjb25mKF9TQ19QSFlTX1BBR0VTKTsKICAgICBzaXplX3QgbWF4TWVtID0gU0laRV9NQVg7CkBAIC02NSwzMCArNTksMTcgQEAKICAgICAgICAgbWF4TWVtID0gcHJvcFZhbDsKICAgICB9CiAKLSAgICAvLyBJbmNyZWFzZSBieSB0aGUgc2l6ZSBvZiB0aGUgQ0ZJIHNoYWRvdyBtYXBwaW5nLiBNb3N0IG9mIHRoZSBzaGFkb3cgaXMgbm90Ci0gICAgLy8gYmFja2VkIHdpdGggcGh5c2ljYWwgcGFnZXMsIGFuZCBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlIHJlc3VsdCB0byBiZQotICAgIC8vIGhpZ2hlciB0aGFuIHRvdGFsIHBoeXNpY2FsIG1lbW9yeS4gVGhpcyBpcyBmaW5lIGZvciBSTElNSVRfQVMuCi0gICAgc2l6ZV90IGNmaV9zaXplID0gX19jZmlfc2hhZG93X3NpemUoKTsKLSAgICBpZiAoY2ZpX3NpemUpIHsKLSAgICAgIEFMT0dWKCJjZmkgc2hhZG93IHNpemU6ICV6dSIsIGNmaV9zaXplKTsKLSAgICAgIGlmIChtYXhNZW0gPD0gU0laRV9NQVggLSBjZmlfc2l6ZSkgewotICAgICAgICBtYXhNZW0gKz0gY2ZpX3NpemU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBtYXhNZW0gPSBTSVpFX01BWDsKLSAgICAgIH0KKyAgICAvLyBJZiBTY3VkbyBpcyBpbiB1c2UsIGVuZm9yY2UgdGhlIGhhcmQgUlNTIGxpbWl0IChpbiBNQikuCisgICAgaWYgKG1heE1lbSAhPSBTSVpFX01BWCAmJiAmX19zY3Vkb19zZXRfcnNzX2xpbWl0ICE9IDApIHsKKyAgICAgIF9fc2N1ZG9fc2V0X3Jzc19saW1pdChtYXhNZW0gPj4gMjAsIDEpOworICAgICAgQUxPR1YoIlNjdWRvIGhhcmQgUlNTIGxpbWl0IHNldCB0byAlenUgTUIiLCBtYXhNZW0gPj4gMjApOworICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBBTE9HVigiYWN0dWFsIGxpbWl0OiAlenUiLCBtYXhNZW0pOwogCi0gICAgc3RydWN0IHJsaW1pdCBsaW1pdDsKLSAgICBnZXRybGltaXQoUkxJTUlUX0FTLCAmbGltaXQpOwotICAgIEFMT0dWKCJvcmlnaW5hbCBsaW1pdHM6ICVsbGQvJWxsZCIsIChsb25nIGxvbmcpbGltaXQucmxpbV9jdXIsIChsb25nIGxvbmcpbGltaXQucmxpbV9tYXgpOwotICAgIGxpbWl0LnJsaW1fY3VyID0gbWF4TWVtOwotICAgIHNldHJsaW1pdChSTElNSVRfQVMsICZsaW1pdCk7Ci0gICAgbGltaXQucmxpbV9jdXIgPSAtMTsKLSAgICBsaW1pdC5ybGltX21heCA9IC0xOwotICAgIGdldHJsaW1pdChSTElNSVRfQVMsICZsaW1pdCk7Ci0gICAgQUxPR1YoIm5ldyBsaW1pdHM6ICVsbGQvJWxsZCIsIChsb25nIGxvbmcpbGltaXQucmxpbV9jdXIsIChsb25nIGxvbmcpbGltaXQucmxpbV9tYXgpOwotCisgICAgaWYgKCFhbmRyb2lkX21hbGxvcHQoTV9TRVRfQUxMT0NBVElPTl9MSU1JVF9CWVRFUywgJm1heE1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YobWF4TWVtKSkpIHsKKyAgICAgIEFMT0dXKCJjb3VsZG4ndCBzZXQgYWxsb2NhdGlvbiBsaW1pdCIpOworICAgIH0KIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFVdGlscy5oIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFVdGlscy5oCmluZGV4IGE2NzhiY2MuLmY4MGRkMzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhVXRpbHMuaAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVV0aWxzLmgKQEAgLTE5LDEyICsxOSw2IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotZXh0ZXJuICJDIiB2b2lkIF9fYXNhbl9pbml0KHZvaWQpIF9fYXR0cmlidXRlX18oKHdlYWspKTsKLQotc3RhdGljIGlubGluZSBpbnQgcnVubmluZ193aXRoX2FzYW4oKSB7Ci0gICAgcmV0dXJuICZfX2FzYW5faW5pdCAhPSAwOwotfQotCiAvKioKICAgIExpbWl0IHRoZSBhbW91bnQgb2YgbWVtb3J5IGEgcHJvY2VzcyBjYW4gYWxsb2NhdGUgdXNpbmcgc2V0cmxpbWl0KFJMSU1JVF9BUykuCiAgICBUaGUgdmFsdWUgdG8gdXNlIHdpbGwgYmUgcmVhZCBmcm9tIHRoZSBzcGVjaWZpZWQgc3lzdGVtIHByb3BlcnR5LCBvciBpZiB0aGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAKaW5kZXggNWNhM2I0OC4uZDhlZjljZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWlkaUlvV3JhcHBlci5jcHAKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxmY250bC5oPgogCiAjaW5jbHVkZSA8bWVkaWEvTWlkaUlvV3JhcHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CiAKIHN0YXRpYyBpbnQgcmVhZEF0KHZvaWQgKmhhbmRsZSwgdm9pZCAqYnVmZmVyLCBpbnQgcG9zLCBpbnQgc2l6ZSkgewogICAgIHJldHVybiAoKGFuZHJvaWQ6Ok1pZGlJb1dyYXBwZXIqKWhhbmRsZSktPnJlYWRBdChidWZmZXIsIHBvcywgc2l6ZSk7CkBAIC00OSwxMCArNTAsNDcgQEAKICAgICBtRGF0YVNvdXJjZSA9IG51bGxwdHI7CiB9CiAKLU1pZGlJb1dyYXBwZXI6Ok1pZGlJb1dyYXBwZXIoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkgewotICAgIEFMT0dWKCJNaWRpSW9XcmFwcGVyKERhdGFTb3VyY2UpIik7CitjbGFzcyBEYXRhU291cmNlVW53cmFwcGVyIDogcHVibGljIERhdGFTb3VyY2VCYXNlIHsKKworcHVibGljOgorICAgIGV4cGxpY2l0IERhdGFTb3VyY2VVbndyYXBwZXIoQ0RhdGFTb3VyY2UgKmNzb3VyY2UpIHsKKyAgICAgICAgbVNvdXJjZSA9IGNzb3VyY2U7CisgICAgfQorCisgICAgdmlydHVhbCB+RGF0YVNvdXJjZVVud3JhcHBlcigpIHt9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0IHsgcmV0dXJuIE9LOyB9CisKKyAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgLTEgb24gZmFpbHVyZS4gSXQncyBub3QgYW4gZXJyb3IgaWYKKyAgICAvLyB0aGlzIHJldHVybnMgemVybzsgaXQganVzdCBtZWFucyB0aGUgZ2l2ZW4gb2Zmc2V0IGlzIGVxdWFsIHRvLCBvcgorICAgIC8vIGJleW9uZCwgdGhlIGVuZCBvZiB0aGUgc291cmNlLgorICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgICAgIHJldHVybiBtU291cmNlLT5yZWFkQXQobVNvdXJjZS0+aGFuZGxlLCBvZmZzZXQsIGRhdGEsIHNpemUpOworICAgIH0KKworICAgIC8vIE1heSByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPmdldFNpemUobVNvdXJjZS0+aGFuZGxlLCBzaXplKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0VXJpKGNoYXIgKiAvKnVyaVN0cmluZyovLCBzaXplX3QgLypidWZmZXJTaXplKi8pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpIHt9OworcHJpdmF0ZToKKyAgICBDRGF0YVNvdXJjZSAqbVNvdXJjZTsKK307CisKK01pZGlJb1dyYXBwZXI6Ok1pZGlJb1dyYXBwZXIoQ0RhdGFTb3VyY2UgKmNzb3VyY2UpIHsKKyAgICBBTE9HVigiTWlkaUlvV3JhcHBlcihDRGF0YVNvdXJjZSkiKTsKICAgICBtRmQgPSAtMTsKLSAgICBtRGF0YVNvdXJjZSA9IHNvdXJjZTsKKyAgICBtQmFzZSA9IDA7CisgICAgbURhdGFTb3VyY2UgPSBuZXcgRGF0YVNvdXJjZVVud3JhcHBlcihjc291cmNlKTsKICAgICBvZmY2NF90IGw7CiAgICAgaWYgKG1EYXRhU291cmNlLT5nZXRTaXplKCZsKSA9PSBPSykgewogICAgICAgICBtTGVuZ3RoID0gbDsKQEAgLTY2LDYgKzEwNCw3IEBACiAgICAgaWYgKG1GZCA+PSAwKSB7CiAgICAgICAgIGNsb3NlKG1GZCk7CiAgICAgfQorICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKIH0KIAogaW50IE1pZGlJb1dyYXBwZXI6OnJlYWRBdCh2b2lkICpidWZmZXIsIGludCBvZmZzZXQsIGludCBzaXplKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5jcHAgYi9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEzYjkxOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL05ka01lZGlhRXJyb3JQcml2LmNwcApAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworbWVkaWFfc3RhdHVzX3QgdHJhbnNsYXRlX2Vycm9yKHN0YXR1c190IGVycikgeworCisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgIH0gZWxzZSBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0gZWxzZSBpZiAoZXJyID09IEVSUk9SX0lPKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CisgICAgfSBlbHNlIGlmIChlcnIgPT0gRVJST1JfTUFMRk9STUVEKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOworICAgIH0gZWxzZSBpZiAoZXJyID09IElOVkFMSURfT1BFUkFUSU9OKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CisgICAgfSBlbHNlIGlmIChlcnIgPT0gVU5LTk9XTl9FUlJPUikgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CisgICAgfQorCisgICAgQUxPR0UoInNmIGVycm9yIGNvZGU6ICVkIiwgZXJyKTsKKyAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047Cit9CisKK3N0YXR1c190IHJldmVyc2VfdHJhbnNsYXRlX2Vycm9yKG1lZGlhX3N0YXR1c190IGVycikgeworCisgICAgaWYgKGVyciA9PSBBTUVESUFfT0spIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSBpZiAoZXJyID09IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0gZWxzZSBpZiAoZXJyID09IEFNRURJQV9FUlJPUl9JTykgeworICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgfSBlbHNlIGlmIChlcnIgPT0gQU1FRElBX0VSUk9SX1dPVUxEX0JMT0NLKSB7CisgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBBTUVESUFfRVJST1JfTUFMRk9STUVEKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfSBlbHNlIGlmIChlcnIgPT0gQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBBTUVESUFfRVJST1JfVU5LTk9XTikgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBBTE9HRSgibmRrIGVycm9yIGNvZGU6ICVkIiwgZXJyKTsKKyAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5jcHAgYi9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhOWZiOGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuY3BwCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk5ka01lZGlhRm9ybWF0IgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisKKyNpbmNsdWRlIDxqbmkuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gcHJpdmF0ZSBmdW5jdGlvbnMgZm9yIGNvbnZlcnNpb24gdG8vZnJvbSBBTWVzc2FnZQorQU1lZGlhRm9ybWF0KiBBTWVkaWFGb3JtYXRfZnJvbU1zZyhzcDxBTWVzc2FnZT4gKmRhdGEpIHsKKyAgICBBTE9HVigicHJpdmF0ZSBjdG9yIik7CisgICAgQU1lZGlhRm9ybWF0KiBtRGF0YSA9IG5ldyBBTWVkaWFGb3JtYXQoKTsKKyAgICBtRGF0YS0+bUZvcm1hdCA9ICpkYXRhOworICAgIGlmIChtRGF0YS0+bUZvcm1hdCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCJnb3QgTlVMTCBmb3JtYXQiKTsKKyAgICAgICAgbURhdGEtPm1Gb3JtYXQgPSBuZXcgQU1lc3NhZ2U7CisgICAgfQorICAgIHJldHVybiBtRGF0YTsKK30KKwordm9pZCBBTWVkaWFGb3JtYXRfZ2V0Rm9ybWF0KGNvbnN0IEFNZWRpYUZvcm1hdCogbURhdGEsIHNwPEFNZXNzYWdlPiAqZGVzdCkgeworICAgICpkZXN0ID0gbURhdGEtPm1Gb3JtYXQ7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9OZGtXcmFwcGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL05ka1dyYXBwZXIuY3BwCmluZGV4IDI3MmJjMzAuLmMxNTA0MDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL05ka1dyYXBwZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL05ka1dyYXBwZXIuY3BwCkBAIC0zMSwxNyArMzEsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KIAotLy8gVE9ETzogcmVtb3ZlIGZvcndhcmQgZGVjbGFyYXRpb24gd2hlbiBBTWVkaWFFeHRyYWN0b3JfZGlzY29ubmVjdCBpcyBvZmZjaWFsbHkgYWRkZWQgdG8gTkRLCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX2Rpc2Nvbm5lY3QoQU1lZGlhRXh0cmFjdG9yICopOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gLy8gZXh0ZXJuICJDIgotI2VuZGlmCisjaW5jbHVkZSAiTmRrTWVkaWFEYXRhU291cmNlQ2FsbGJhY2tzUHJpdi5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTY3LDkgKzU3LDE1IEBACiAgICAgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9TVEFOREFSRCwKICAgICBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1RSQU5TRkVSLAogICAgIEFNRURJQUZPUk1BVF9LRVlfQ09NUExFWElUWSwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSRUFURV9JTlBVVF9TVVJGQUNFX1NVU1BFTkRFRCwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19ERUZBVUxUX0lWX1NJWkUsCisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX0JZVEVfQkxPQ0ssCisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fTU9ERSwKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19TS0lQX0JZVEVfQkxPQ0ssCiAgICAgQU1FRElBRk9STUFUX0tFWV9GTEFDX0NPTVBSRVNTSU9OX0xFVkVMLAogICAgIEFNRURJQUZPUk1BVF9LRVlfR1JJRF9DT0xVTU5TLAogICAgIEFNRURJQUZPUk1BVF9LRVlfR1JJRF9ST1dTLAorICAgIEFNRURJQUZPUk1BVF9LRVlfSEFQVElDX0NIQU5ORUxfQ09VTlQsCiAgICAgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsCiAgICAgQU1FRElBRk9STUFUX0tFWV9JTlRSQV9SRUZSRVNIX1BFUklPRCwKICAgICBBTUVESUFGT1JNQVRfS0VZX0lTX0FEVFMsCkBAIC0xMDEsNiArOTcsNyBAQAogCiBzdGF0aWMgY29uc3QgY2hhciAqQU1lZGlhRm9ybWF0S2V5R3JvdXBJbnQ2NFtdID0gewogICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sCisgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfUFRTX0dBUF9UT19FTkNPREVSLAogICAgIEFNRURJQUZPUk1BVF9LRVlfUkVQRUFUX1BSRVZJT1VTX0ZSQU1FX0FGVEVSLAogICAgIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywKIH07CkBAIC0xMTIsNiArMTA5LDggQEAKIH07CiAKIHN0YXRpYyBjb25zdCBjaGFyICpBTWVkaWFGb3JtYXRLZXlHcm91cEJ1ZmZlcltdID0geworICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0lWLAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSwKICAgICBBTUVESUFGT1JNQVRfS0VZX0hEUl9TVEFUSUNfSU5GTywKICAgICBBTUVESUFGT1JNQVRfS0VZX1NFSSwKICAgICBBTUVESUFGT1JNQVRfS0VZX01QRUdfVVNFUl9EQVRBLApAQCAtMTMwLDYgKzEyOSw3IEBACiBzdGF0aWMgY29uc3QgY2hhciAqQU1lZGlhRm9ybWF0S2V5R3JvdXBGbG9hdEludDMyW10gPSB7CiAgICAgQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFLAogICAgIEFNRURJQUZPUk1BVF9LRVlfSV9GUkFNRV9JTlRFUlZBTCwKKyAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9GUFNfVE9fRU5DT0RFUiwKICAgICBBTUVESUFGT1JNQVRfS0VZX09QRVJBVElOR19SQVRFLAogfTsKIApAQCAtMTA4MCwxNCArMTA4MCw2IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpkaXNjb25uZWN0KCkgewotICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yICE9IE5VTEwpIHsKLSAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gQU1lZGlhRXh0cmFjdG9yX2Rpc2Nvbm5lY3QobUFNZWRpYUV4dHJhY3Rvcik7Ci0gICAgICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoZXJyKTsKLSAgICB9Ci0gICAgcmV0dXJuIERFQURfT0JKRUNUOwotfQotCiBBTWVkaWFFeHRyYWN0b3IgKkFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OmdldEFNZWRpYUV4dHJhY3RvcigpIGNvbnN0IHsKICAgICByZXR1cm4gbUFNZWRpYUV4dHJhY3RvcjsKIH0KQEAgLTEyNjEsNDAgKzEyNTMsMjggQEAKICAgICBpZiAobUFNZWRpYUV4dHJhY3RvciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICByZXR1cm4gbmV3IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXIoQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZUNyeXB0b0luZm8obUFNZWRpYUV4dHJhY3RvcikpOwotfQotCi1zc2l6ZV90IEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyOjpBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9nZXRTaXplKHZvaWQgKnVzZXJkYXRhKSB7Ci0gICAgRGF0YVNvdXJjZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8RGF0YVNvdXJjZSAqPih1c2VyZGF0YSk7Ci0gICAgb2ZmNjRfdCBzaXplID0gLTE7Ci0gICAgc291cmNlLT5nZXRTaXplKCZzaXplKTsKLSAgICByZXR1cm4gc2l6ZTsKLX0KLQotc3NpemVfdCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcjo6QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfcmVhZEF0KHZvaWQgKnVzZXJkYXRhLCBvZmY2NF90IG9mZnNldCwgdm9pZCAqIGJ1Ziwgc2l6ZV90IHNpemUpIHsKLSAgICBEYXRhU291cmNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEYXRhU291cmNlICo+KHVzZXJkYXRhKTsKLSAgICByZXR1cm4gc291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWYsIHNpemUpOwotfQotCi12b2lkIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyOjpBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9jbG9zZSh2b2lkICp1c2VyZGF0YSkgewotICAgIERhdGFTb3VyY2UgKnNvdXJjZSA9IHN0YXRpY19jYXN0PERhdGFTb3VyY2UgKj4odXNlcmRhdGEpOwotICAgIHNvdXJjZS0+Y2xvc2UoKTsKKyAgICBBTWVkaWFDb2RlY0NyeXB0b0luZm8gKmNyeXB0b0luZm8gPSBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlQ3J5cHRvSW5mbyhtQU1lZGlhRXh0cmFjdG9yKTsKKyAgICBpZiAoY3J5cHRvSW5mbyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gbmV3IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXIoY3J5cHRvSW5mbyk7CiB9CiAKIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyOjpBTWVkaWFEYXRhU291cmNlV3JhcHBlcihjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YVNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAotICAgICAgbUFNZWRpYURhdGFTb3VyY2UoQU1lZGlhRGF0YVNvdXJjZV9uZXcoKSkgewotICAgIEFMT0dWKCJzZXREYXRhU291cmNlIChzb3VyY2U6ICVwKSIsIGRhdGFTb3VyY2UuZ2V0KCkpOwotICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0VXNlcmRhdGEobUFNZWRpYURhdGFTb3VyY2UsIGRhdGFTb3VyY2UuZ2V0KCkpOwotICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0UmVhZEF0KG1BTWVkaWFEYXRhU291cmNlLCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9yZWFkQXQpOwotICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0U2l6ZShtQU1lZGlhRGF0YVNvdXJjZSwgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfZ2V0U2l6ZSk7Ci0gICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRDbG9zZShtQU1lZGlhRGF0YVNvdXJjZSwgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfY2xvc2UpOworICAgICAgbUFNZWRpYURhdGFTb3VyY2UoY29udmVydERhdGFTb3VyY2VUb0FNZWRpYURhdGFTb3VyY2UoZGF0YVNvdXJjZSkpIHsKK30KKworQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI6OkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKEFNZWRpYURhdGFTb3VyY2UgKmFEYXRhU291cmNlKQorICAgIDogbURhdGFTb3VyY2UoTlVMTCksCisgICAgICBtQU1lZGlhRGF0YVNvdXJjZShhRGF0YVNvdXJjZSkgewogfQogCiBBTWVkaWFEYXRhU291cmNlV3JhcHBlcjo6fkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKCkgewogICAgIGlmIChtQU1lZGlhRGF0YVNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CisgICAgQU1lZGlhRGF0YVNvdXJjZV9jbG9zZShtQU1lZGlhRGF0YVNvdXJjZSk7CiAgICAgQU1lZGlhRGF0YVNvdXJjZV9kZWxldGUobUFNZWRpYURhdGFTb3VyY2UpOwogICAgIG1BTWVkaWFEYXRhU291cmNlID0gTlVMTDsKIH0KQEAgLTEzMDMsNCArMTI4Myw4IEBACiAgICAgcmV0dXJuIG1BTWVkaWFEYXRhU291cmNlOwogfQogCit2b2lkIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyOjpjbG9zZSgpIHsKKyAgICBBTWVkaWFEYXRhU291cmNlX2Nsb3NlKG1BTWVkaWFEYXRhU291cmNlKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL09NWEJ1ZmZlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9PTVhCdWZmZXIuY3BwCmluZGV4IDZkNTRhMTMuLjMwZGMyMmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL09NWEJ1ZmZlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvT01YQnVmZmVyLmNwcApAQCAtMTcyLDcgKzE3Miw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1PTVhCdWZmZXImIE9NWEJ1ZmZlcjo6b3BlcmF0b3I9KE9NWEJ1ZmZlciYmIHNvdXJjZSkgeworT01YQnVmZmVyJiBPTVhCdWZmZXI6Om9wZXJhdG9yPShPTVhCdWZmZXImJiBzb3VyY2UpIG5vZXhjZXB0IHsKICAgICBtQnVmZmVyVHlwZSA9IHN0ZDo6bW92ZShzb3VyY2UubUJ1ZmZlclR5cGUpOwogICAgIG1SYW5nZU9mZnNldCA9IHN0ZDo6bW92ZShzb3VyY2UubVJhbmdlT2Zmc2V0KTsKICAgICBtUmFuZ2VMZW5ndGggPSBzdGQ6Om1vdmUoc291cmNlLm1SYW5nZUxlbmd0aCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9UaW1lQ2hlY2suY3BwIGIvbWVkaWEvbGlibWVkaWEvVGltZUNoZWNrLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFiNWQ0Zi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYS9UaW1lQ2hlY2suY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotI2luY2x1ZGUgPG1lZGlhL1RpbWVDaGVjay5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8qIHN0YXRpYyAqLwotc3A8VGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ+IFRpbWVDaGVjazo6Z2V0VGltZUNoZWNrVGhyZWFkKCkKLXsKLSAgICBzdGF0aWMgc3A8VGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ+IHNUaW1lQ2hlY2tUaHJlYWQgPSBuZXcgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQoKTsKLSAgICByZXR1cm4gc1RpbWVDaGVja1RocmVhZDsKLX0KLQotVGltZUNoZWNrOjpUaW1lQ2hlY2soY29uc3QgY2hhciAqdGFnLCB1aW50MzJfdCB0aW1lb3V0TXMpCi0gICAgOiBtRW5kVGltZU5zKGdldFRpbWVDaGVja1RocmVhZCgpLT5zdGFydE1vbml0b3JpbmcodGFnLCB0aW1lb3V0TXMpKQotewotfQotCi1UaW1lQ2hlY2s6On5UaW1lQ2hlY2soKSB7Ci0gICAgZ2V0VGltZUNoZWNrVGhyZWFkKCktPnN0b3BNb25pdG9yaW5nKG1FbmRUaW1lTnMpOwotfQotCi1UaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6flRpbWVDaGVja1RocmVhZCgpCi17Ci0gICAgQXV0b011dGV4IF9sKG1NdXRleCk7Ci0gICAgcmVxdWVzdEV4aXQoKTsKLSAgICBtTW9uaXRvclJlcXVlc3RzLmNsZWFyKCk7Ci0gICAgbUNvbmQuc2lnbmFsKCk7Ci19Ci0KLW5zZWNzX3QgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6OnN0YXJ0TW9uaXRvcmluZyhjb25zdCBjaGFyICp0YWcsIHVpbnQzMl90IHRpbWVvdXRNcykgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTXV0ZXgpOwotICAgIG5zZWNzX3QgZW5kVGltZU5zID0gc3lzdGVtVGltZSgpICsgbWlsbGlzZWNvbmRzKHRpbWVvdXRNcyk7Ci0gICAgZm9yICg7IG1Nb25pdG9yUmVxdWVzdHMuaW5kZXhPZktleShlbmRUaW1lTnMpID49IDA7ICsrZW5kVGltZU5zKTsKLSAgICBtTW9uaXRvclJlcXVlc3RzLmFkZChlbmRUaW1lTnMsIHRhZyk7Ci0gICAgbUNvbmQuc2lnbmFsKCk7Ci0gICAgcmV0dXJuIGVuZFRpbWVOczsKLX0KLQotdm9pZCBUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6c3RvcE1vbml0b3JpbmcobnNlY3NfdCBlbmRUaW1lTnMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobU11dGV4KTsKLSAgICBtTW9uaXRvclJlcXVlc3RzLnJlbW92ZUl0ZW0oZW5kVGltZU5zKTsKLSAgICBtQ29uZC5zaWduYWwoKTsKLX0KLQotYm9vbCBUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6dGhyZWFkTG9vcCgpCi17Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gVElNRURfT1VUOwotICAgIGNvbnN0IGNoYXIgKnRhZzsKLSAgICB7Ci0gICAgICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOwotCi0gICAgICAgIGlmIChleGl0UGVuZGluZygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBuc2Vjc190IGVuZFRpbWVOcyA9IElOVDY0X01BWDsKLSAgICAgICAgLy8gS2V5ZWRWZWN0b3IgbU1vbml0b3JSZXF1ZXN0cyBpcyBvcmRlcmVkIHNvIHRha2UgZmlyc3QgZW50cnkgYXMgbmV4dCB0aW1lb3V0Ci0gICAgICAgIGlmIChtTW9uaXRvclJlcXVlc3RzLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgICAgICBlbmRUaW1lTnMgPSBtTW9uaXRvclJlcXVlc3RzLmtleUF0KDApOwotICAgICAgICAgICAgdGFnID0gbU1vbml0b3JSZXF1ZXN0cy52YWx1ZUF0KDApOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgbnNlY3NfdCB3YWl0VGltZU5zID0gZW5kVGltZU5zIC0gc3lzdGVtVGltZSgpOwotICAgICAgICBpZiAod2FpdFRpbWVOcyA+IDApIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG1Db25kLndhaXRSZWxhdGl2ZShtTXV0ZXgsIHdhaXRUaW1lTnMpOwotICAgICAgICB9Ci0gICAgfQotICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCAiVGltZUNoZWNrIHRpbWVvdXQgZm9yICVzIiwgdGFnKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL1R5cGVDb252ZXJ0ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvVHlwZUNvbnZlcnRlci5jcHAKaW5kZXggYTNkYjc1NC4uNWJlNzhkMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvVHlwZUNvbnZlcnRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvVHlwZUNvbnZlcnRlci5jcHAKQEAgLTc0LDYgKzc0LDcgQEAKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fQVVYX0RJR0lUQUwpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fSERNSSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9IRE1JX0FSQyksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9CQUNLX01JQyksCkBAIC05Myw2ICs5NCw4IEBACiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9CVVMpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fUFJPWFkpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fVVNCX0hFQURTRVQpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0JMRSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9FQ0hPX1JFRkVSRU5DRSksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9ERUZBVUxUKSwKICAgICAvLyBTVFVCIG11c3QgYmUgYWZ0ZXIgREVGQVVMVCwgc28gdGhlIGxhdHRlciBpcyBwaWNrZWQgdXAgYnkgdG9TdHJpbmcgZmlyc3QuCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9TVFVCKSwKQEAgLTEzMiw2ICsxMzUsNyBAQAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19JTlBVVF9GTEFHX01NQVBfTk9JUlEpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19JTlBVVF9GTEFHX1ZPSVBfVFgpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkMpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19JTlBVVF9GTEFHX0RJUkVDVCksCiAgICAgVEVSTUlOQVRPUgogfTsKIApAQCAtMjA1LDYgKzIwOSwxNSBAQAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfTUFUXzFfMCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9NQVRfMl8wKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX01BVF8yXzEpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0xBVE0pLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0xBVE1fTEMpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0xBVE1fSEVfVjEpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0xBVE1fSEVfVjIpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQ0VMVCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BUFRYX0FEQVBUSVZFKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0xIREMpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfTEhEQ19MTCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BUFRYX1RXU1ApLAogICAgIFRFUk1JTkFUT1IKIH07CiAKQEAgLTIxNiw2ICsyMjksOSBAQAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMFBPSU5UMiksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDFQT0lOVDIpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9UUkkpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9UUklfQkFDSyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDEpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF8zUE9JTlQwUE9JTlQyKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMVBPSU5UMiksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1FVQUQpLApAQCAtMjMyLDYgKzI0OCwxMiBAQAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF83UE9JTlQxKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMVBPSU5UMiksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDFQT0lOVDQpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9IQVBUSUNfQSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX01PTk9fSEFQVElDX0EpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9TVEVSRU9fSEFQVElDX0EpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9IQVBUSUNfQUIpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9NT05PX0hBUFRJQ19BQiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1NURVJFT19IQVBUSUNfQUIpLAogICAgIFRFUk1JTkFUT1IKIH07CiAKQEAgLTI3OCw2ICszMDAsNyBAQAogCiB0ZW1wbGF0ZSA8PgogY29uc3QgU3RyZWFtVHlwZUNvbnZlcnRlcjo6VGFibGUgU3RyZWFtVHlwZUNvbnZlcnRlcjo6bVRhYmxlW10gPSB7CisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9ERUZBVUxUKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fU1lTVEVNKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX1JJTkcpLApAQCAtMzQ5LDExICszNzIsMzEgQEAKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04pLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9VTlBST0NFU1NFRCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9WT0lDRV9QRVJGT1JNQU5DRSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRSksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9GTV9UVU5FUiksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9IT1RXT1JEKSwKICAgICBURVJNSU5BVE9SCiB9OwogCit0ZW1wbGF0ZSA8PgorY29uc3QgQXVkaW9GbGFnQ29udmVydGVyOjpUYWJsZSBBdWRpb0ZsYWdDb252ZXJ0ZXI6Om1UYWJsZVtdID0geworICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GTEFHX05PTkUpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GTEFHX1NFQ1VSRSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfU0NPKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19CRUFDT04pLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GTEFHX0hXX0FWX1NZTkMpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GTEFHX0hXX0hPVFdPUkQpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GTEFHX0JZUEFTU19JTlRFUlJVUFRJT05fUE9MSUNZKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19CWVBBU1NfTVVURSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfTE9XX0xBVEVOQ1kpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GTEFHX0RFRVBfQlVGRkVSKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19OT19NRURJQV9QUk9KRUNUSU9OKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19OT19TWVNURU1fQ0FQVFVSRSksCisgICAgVEVSTUlOQVRPUgorfTsKKwogdGVtcGxhdGUgY2xhc3MgVHlwZUNvbnZlcnRlcjxPdXRwdXREZXZpY2VUcmFpdHM+OwogdGVtcGxhdGUgY2xhc3MgVHlwZUNvbnZlcnRlcjxJbnB1dERldmljZVRyYWl0cz47CiB0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPE91dHB1dEZsYWdUcmFpdHM+OwpAQCAtMzY3LDIwICs0MTAsMTMgQEAKIHRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8QXVkaW9Nb2RlVHJhaXRzPjsKIHRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8VXNhZ2VUcmFpdHM+OwogdGVtcGxhdGUgY2xhc3MgVHlwZUNvbnZlcnRlcjxTb3VyY2VUcmFpdHM+OwordGVtcGxhdGUgY2xhc3MgVHlwZUNvbnZlcnRlcjxBdWRpb0ZsYWdUcmFpdHM+OwogCiBib29sIGRldmljZUZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGxpdGVyYWxEZXZpY2UsIGF1ZGlvX2RldmljZXNfdCYgZGV2aWNlKSB7CiAgICAgcmV0dXJuIElucHV0RGV2aWNlQ29udmVydGVyOjpmcm9tU3RyaW5nKGxpdGVyYWxEZXZpY2UsIGRldmljZSkgfHwKICAgICAgICAgICAgIE91dHB1dERldmljZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhsaXRlcmFsRGV2aWNlLCBkZXZpY2UpOwogfQogCi1ib29sIGRldmljZVRvU3RyaW5nKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIHN0ZDo6c3RyaW5nJiBsaXRlcmFsRGV2aWNlKSB7Ci0gICAgaWYgKGRldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pIHsKLSAgICAgICAgcmV0dXJuIElucHV0RGV2aWNlQ29udmVydGVyOjp0b1N0cmluZyhkZXZpY2UsIGxpdGVyYWxEZXZpY2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBPdXRwdXREZXZpY2VDb252ZXJ0ZXI6OnRvU3RyaW5nKGRldmljZSwgbGl0ZXJhbERldmljZSk7Ci0gICAgfQotfQotCiBTYW1wbGVSYXRlVHJhaXRzOjpDb2xsZWN0aW9uIHNhbXBsaW5nUmF0ZXNGcm9tU3RyaW5nKAogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc2FtcGxpbmdSYXRlcywgY29uc3QgY2hhciAqZGVsKQogewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuYWlkbCBiL21lZGlhL2xpYm1lZGlhL2FpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YjFiYzkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWEvYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqCi0gKiBTZXJ2aWNlIHRvIHJlbG9hZCBleHRyYWN0b3IgcGx1Z2lucyB3aGVuIHVwZGF0ZSBwYWNrYWdlIGlzIGluc3RhbGxlZC91bmluc3RhbGxlZC4KLSAqIEBoaWRlCi0gKi8KLWludGVyZmFjZSBJTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlIHsKLSAgICB2b2lkIGxvYWRQbHVnaW5zKEB1dGY4SW5DcHAgU3RyaW5nIGFwa1BhdGgpOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvZXhwb3J0cy5sZHMgYi9tZWRpYS9saWJtZWRpYS9leHBvcnRzLmxkcwppbmRleCBiMDlmYmNlLi45MDRhN2Y3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9leHBvcnRzLmxkcworKysgYi9tZWRpYS9saWJtZWRpYS9leHBvcnRzLmxkcwpAQCAtMyw1ICszLDUgQEAKICAgICAgICAgKjsKICAgICBsb2NhbDoKICAgICAgICAgX1pON2FuZHJvaWQxM01pZGlJb1dyYXBwZXIqOwotICAgICAgICBfWlRWTjdhbmRyb2lkMTNNaWRpSW9XcmFwcGVyRTsKKyAgICAgICAgX1pUVk43YW5kcm9pZDEzTWlkaUlvV3JhcHBlckUqOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQnVmZmVyUHJvdmlkZXJzLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0J1ZmZlclByb3ZpZGVycy5oCmluZGV4IGQ2YTljZmIuLmIwMzg4NTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQnVmZmVyUHJvdmlkZXJzLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9CdWZmZXJQcm92aWRlcnMuaApAQCAtNzgsNiArNzgsNyBAQAogCiAgICAgLy8gT3ZlcnJpZGVzIFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXIKICAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKKyAgICB2b2lkIHNldEJ1ZmZlclByb3ZpZGVyKEF1ZGlvQnVmZmVyUHJvdmlkZXIgKnApIG92ZXJyaWRlOwogCiAgICAgLy8gdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgc3VwcGxpZWQgYnkgdGhlIGRlcml2ZWQgY2xhc3MuICBJdCBjb252ZXJ0cwogICAgIC8vICNmcmFtZXMgaW4gdGhlICpzcmMgcG9pbnRlciB0byB0aGUgKmRzdCBwb2ludGVyLiAgSXQgaXMgcHVibGljIGJlY2F1c2UKQEAgLTE4Niw2ICsxODcsNyBAQAogCiAgICAgLy8gT3ZlcnJpZGVzIFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXIKICAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKKyAgICB2b2lkIHNldEJ1ZmZlclByb3ZpZGVyKEF1ZGlvQnVmZmVyUHJvdmlkZXIgKnApIG92ZXJyaWRlOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnBsYXliYWNrUmF0ZSk7CiAKQEAgLTIxNiw2ICsyMTgsNDEgQEAKICAgICBib29sICAgICAgICAgICAgICAgICBtQXVkaW9QbGF5YmFja1JhdGVWYWxpZDsgLy8gZmxhZyBmb3IgY3VycmVudCBwYXJhbWV0ZXJzIHZhbGlkaXR5CiB9OwogCisvLyBBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyIGRlcml2ZXMgZnJvbSBDb3B5QnVmZmVyUHJvdmlkZXIgdG8gYWRqdXN0IHNhbXBsZSBkYXRhLgorLy8gRXhwYW5kcyBvciBjb250cmFjdHMgc2FtcGxlIGRhdGEgZnJvbSBvbmUgaW50ZXJsZWF2ZWQgY2hhbm5lbCBmb3JtYXQgdG8gYW5vdGhlci4KKy8vIEV4dHJhIGV4cGFuZGVkIGNoYW5uZWxzIGFyZSBmaWxsZWQgd2l0aCB6ZXJvcyBhbmQgcHV0IGF0IHRoZSBlbmQgb2YgZWFjaCBhdWRpbyBmcmFtZS4KKy8vIENvbnRyYWN0ZWQgY2hhbm5lbHMgYXJlIGNvcGllZCB0byB0aGUgZW5kIG9mIHRoZSBvdXRwdXQgYnVmZmVyKHN0b3JhZ2Ugc2hvdWxkIGJlCisvLyBhbGxvY2F0ZWQgYXBwcm9wcmlhdGVseSkuCisvLyBDb250cmFjdGVkIGNoYW5uZWxzIGNvdWxkIGJlIHdyaXR0ZW4gdG8gb3V0cHV0IGJ1ZmZlci4KK2NsYXNzIEFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQ29weUJ1ZmZlclByb3ZpZGVyIHsKK3B1YmxpYzoKKyAgICBBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgc2l6ZV90IGluQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgc2l6ZV90IG91dENoYW5uZWxDb3VudCwgc2l6ZV90IGZyYW1lQ291bnQpIDogQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcigKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBpbkNoYW5uZWxDb3VudCwgb3V0Q2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBBVURJT19GT1JNQVRfSU5WQUxJRCwgbnVsbHB0cikgeyB9CisgICAgLy8gQ29udHJhY3RlZCBkYXRhIGlzIGNvbnZlcnRlZCB0byBjb250cmFjdGVkRm9ybWF0IGFuZCBwdXQgaW50byBjb250cmFjdGVkQnVmZmVyLgorICAgIEFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBzaXplX3QgaW5DaGFubmVsQ291bnQsCisgICAgICAgICAgICBzaXplX3Qgb3V0Q2hhbm5lbENvdW50LCBzaXplX3QgZnJhbWVDb3VudCwgYXVkaW9fZm9ybWF0X3QgY29udHJhY3RlZEZvcm1hdCwKKyAgICAgICAgICAgIHZvaWQqIGNvbnRyYWN0ZWRCdWZmZXIpOworICAgIC8vT3ZlcnJpZGVzCisgICAgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihCdWZmZXIqIHBCdWZmZXIpIG92ZXJyaWRlOworICAgIHZvaWQgY29weUZyYW1lcyh2b2lkICpkc3QsIGNvbnN0IHZvaWQgKnNyYywgc2l6ZV90IGZyYW1lcykgb3ZlcnJpZGU7CisgICAgdm9pZCByZXNldCgpIG92ZXJyaWRlOworCisgICAgdm9pZCBjbGVhckNvbnRyYWN0ZWRGcmFtZXMoKSB7IG1Db250cmFjdGVkV3JpdHRlbkZyYW1lcyA9IDA7IH0KKworcHJvdGVjdGVkOgorICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IG1Gb3JtYXQ7CisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbUluQ2hhbm5lbENvdW50OworICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1PdXRDaGFubmVsQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbVNhbXBsZVNpemVJbkJ5dGVzOworICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1GcmFtZUNvdW50OworICAgIGNvbnN0IHNpemVfdCAgICAgICAgIG1Db250cmFjdGVkQ2hhbm5lbENvdW50OworICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IG1Db250cmFjdGVkRm9ybWF0OworICAgIHZvaWQgICAgICAgICAgICAgICAgKm1Db250cmFjdGVkQnVmZmVyOworICAgIHNpemVfdCAgICAgICAgICAgICAgIG1Db250cmFjdGVkV3JpdHRlbkZyYW1lczsKKyAgICBzaXplX3QgICAgICAgICAgICAgICBtQ29udHJhY3RlZEZyYW1lU2l6ZTsKK307CiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuaAppbmRleCBkMmEzZTQwLi5kOTdjYzAwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5oCkBAIC0xNywxMSArMTcsMTEgQEAKICNpZm5kZWYgQU5EUk9JRF9CVUZGRVJJTkdfU0VUVElOR1NfSAogI2RlZmluZSBBTkRST0lEX0JVRkZFUklOR19TRVRUSU5HU19ICiAKLSNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgQnVmZmVyaW5nU2V0dGluZ3MgOiBwdWJsaWMgUGFyY2VsYWJsZSB7CitzdHJ1Y3QgQnVmZmVyaW5nU2V0dGluZ3MgewogICAgIHN0YXRpYyBjb25zdCBpbnQga05vTWFyayA9IC0xOwogCiAgICAgaW50IG1Jbml0aWFsTWFya01zOwpAQCAtMzIsOSArMzIsNiBAQAogCiAgICAgQnVmZmVyaW5nU2V0dGluZ3MoKTsKIAotICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOwotICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKLQogICAgIFN0cmluZzggdG9TdHJpbmcoKSBjb25zdDsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmgKaW5kZXggZGVhYTM3Ny4uNjI1NjRiMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmgKQEAgLTU0LDYgKzU0LDcgQEAKICAgICAgICAgU3RyaW5nQXJyYXkgICAgIG1WYWx1ZXM7CiAKICAgICAgICAgVUNvbnZlcnRlciogICAgIG1VdGY4Q29udjsKKyAgICAgICAgY29uc3QgY2hhciogICAgIG1Mb2NhbGVFbmM7CiB9OwogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQ3J5cHRvLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0NyeXB0by5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjg0MTNkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQ3J5cHRvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBDUllQVE9fSF8KLQotI2RlZmluZSBDUllQVE9fSF8KLQotI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLQotI2luY2x1ZGUgIlNoYXJlZExpYnJhcnkuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgQ3J5cHRvRmFjdG9yeTsKLXN0cnVjdCBDcnlwdG9QbHVnaW47Ci0KLXN0cnVjdCBDcnlwdG8gOiBwdWJsaWMgQm5DcnlwdG8gewotICAgIENyeXB0bygpOwotICAgIHZpcnR1YWwgfkNyeXB0bygpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKLQotICAgIHZpcnR1YWwgYm9vbCBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlUGx1Z2luKAotICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkZXN0cm95UGx1Z2luKCk7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgcmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KAotICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZSkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5UmVzb2x1dGlvbih1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFEcm1TZXNzaW9uKGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmc2Vzc2lvbklkKTsKLQotICAgIHZpcnR1YWwgc3NpemVfdCBkZWNyeXB0KGNvbnN0IHVpbnQ4X3Qga2V5WzE2XSwgY29uc3QgdWludDhfdCBpdlsxNl0sCi0gICAgICAgICAgICBDcnlwdG9QbHVnaW46Ok1vZGUgbW9kZSwgY29uc3QgQ3J5cHRvUGx1Z2luOjpQYXR0ZXJuICZwYXR0ZXJuLAotICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4gJnNvdXJjZSwgc2l6ZV90IG9mZnNldCwKLSAgICAgICAgICAgIGNvbnN0IENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlICpzdWJTYW1wbGVzLCBzaXplX3QgbnVtU3ViU2FtcGxlcywKLSAgICAgICAgICAgIGNvbnN0IERlc3RpbmF0aW9uQnVmZmVyICZkZXN0aW5hdGlvbiwgQVN0cmluZyAqZXJyb3JEZXRhaWxNc2cpOwotCi0gICAgdmlydHVhbCB2b2lkIHNldEhlYXAoY29uc3Qgc3A8SU1lbW9yeUhlYXA+Jikge30KLSAgICB2aXJ0dWFsIHZvaWQgdW5zZXRIZWFwKGNvbnN0IHNwPElNZW1vcnlIZWFwPiYpIHt9Ci0KLXByaXZhdGU6Ci0gICAgbXV0YWJsZSBNdXRleCBtTG9jazsKLQotICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7Ci0gICAgc3A8U2hhcmVkTGlicmFyeT4gbUxpYnJhcnk7Ci0gICAgQ3J5cHRvRmFjdG9yeSAqbUZhY3Rvcnk7Ci0gICAgQ3J5cHRvUGx1Z2luICptUGx1Z2luOwotCi0gICAgc3RhdGljIEtleWVkVmVjdG9yPFZlY3Rvcjx1aW50OF90PiwgU3RyaW5nOD4gbVVVSURUb0xpYnJhcnlQYXRoTWFwOwotICAgIHN0YXRpYyBLZXllZFZlY3RvcjxTdHJpbmc4LCB3cDxTaGFyZWRMaWJyYXJ5PiA+IG1MaWJyYXJ5UGF0aFRvT3BlbkxpYnJhcnlNYXA7Ci0gICAgc3RhdGljIE11dGV4IG1NYXBMb2NrOwotCi0gICAgdm9pZCBmaW5kRmFjdG9yeUZvclNjaGVtZShjb25zdCB1aW50OF90IHV1aWRbMTZdKTsKLSAgICBib29sIGxvYWRMaWJyYXJ5Rm9yU2NoZW1lKGNvbnN0IFN0cmluZzggJnBhdGgsIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pOwotICAgIHZvaWQgY2xvc2VGYWN0b3J5KCk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDcnlwdG8pOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBDUllQVE9fSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQ3J5cHRvSGFsLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0NyeXB0b0hhbC5oCmluZGV4IGZmODc4OWQuLjczYzAyOWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQ3J5cHRvSGFsLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9DcnlwdG9IYWwuaApAQCAtMjEsNiArMjEsNyBAQAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JQ3J5cHRvRmFjdG9yeS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JQ3J5cHRvUGx1Z2luLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lDcnlwdG9GYWN0b3J5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lDcnlwdG9QbHVnaW4uaD4KIAogI2luY2x1ZGUgPG1lZGlhZHJtL0lDcnlwdG8uaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgpAQCAtNzIsNiArNzMsNyBAQAogCiAgICAgY29uc3QgVmVjdG9yPHNwPElDcnlwdG9GYWN0b3J5Pj4gbUZhY3RvcmllczsKICAgICBzcDxJQ3J5cHRvUGx1Z2luPiBtUGx1Z2luOworICAgIHNwPGRybTo6VjFfMjo6SUNyeXB0b1BsdWdpbj4gbVBsdWdpblYxXzI7CiAKICAgICAvKioKICAgICAgKiBtSW5pdENoZWNrIGlzOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlRGVzYy5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlRGVzYy5oCmluZGV4IGMxOTAyNjEuLjQzMzY3NjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZURlc2MuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VEZXNjLmgKQEAgLTMwLDYgKzMwLDExIEBACiAvLyBBIGJpbmRlciBpbnRlcmZhY2UgZm9yIGltcGxlbWVudGluZyBhIHN0YWdlZnJpZ2h0IERhdGFTb3VyY2UgcmVtb3RlbHkuCiBzdHJ1Y3QgRGF0YVNvdXJjZURlc2MgOiBwdWJsaWMgUmVmQmFzZSB7CiBwdWJsaWM6CisgICAgLy8gaW50ZW50aW9uYWxseSBsZXNzIHRoYW4gSU5UNjRfTUFYCisgICAgLy8ga2VlcCBjb25zaXN0ZW50IHdpdGggSkFWQSBjb2RlCisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga01heFRpbWVNcyA9IDB4N2ZmZmZmZmZmZmZmZmZmbGwgLyAxMDAwOworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNYXhUaW1lVXMgPSBrTWF4VGltZU1zICogMTAwMDsKKwogICAgIGVudW0gewogICAgICAgICAvKiBObyBkYXRhIHNvdXJjZSBoYXMgYmVlbiBzZXQgeWV0ICovCiAgICAgICAgIFRZUEVfTk9ORSAgICAgPSAwLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm0uaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjODY5Y2MuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm0uaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBEUk1fSF8KLQotI2RlZmluZSBEUk1fSF8KLQotI2luY2x1ZGUgIlNoYXJlZExpYnJhcnkuaCIKLQotI2luY2x1ZGUgPG1lZGlhL0lEcm0uaD4KLSNpbmNsdWRlIDxtZWRpYS9JRHJtQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERybUZhY3Rvcnk7Ci1jbGFzcyBEcm1QbHVnaW47Ci1zdHJ1Y3QgRHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZTsKLQotc3RydWN0IERybSA6IHB1YmxpYyBCbkRybSwKLSAgICAgICAgICAgICBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQsCi0gICAgICAgICAgICAgcHVibGljIERybVBsdWdpbkxpc3RlbmVyIHsKLSAgICBEcm0oKTsKLSAgICB2aXJ0dWFsIH5Ecm0oKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVQbHVnaW4oY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgU3RyaW5nOCAmYXBwUGFja2FnZU5hbWUpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkZXN0cm95UGx1Z2luKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5TZXNzaW9uKFZlY3Rvcjx1aW50OF90PiAmc2Vzc2lvbklkKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VTZXNzaW9uKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QKLSAgICAgICAgZ2V0S2V5UmVxdWVzdChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmluaXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QgJm1pbWVUeXBlLCBEcm1QbHVnaW46OktleVR5cGUga2V5VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBjb25zdCAmb3B0aW9uYWxQYXJhbWV0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmcmVxdWVzdCwgU3RyaW5nOCAmZGVmYXVsdFVybCwKLSAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlICprZXlSZXF1ZXN0VHlwZSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHByb3ZpZGVLZXlSZXNwb25zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJnJlc3BvbnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAma2V5U2V0SWQpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVLZXlzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZXN0b3JlS2V5cyhWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeUtleVN0YXR1cyhWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICZpbmZvTWFwKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvdmlzaW9uUmVxdWVzdChTdHJpbmc4IGNvbnN0ICZjZXJ0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCAmY2VydEF1dGhvcml0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZyZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4ICZkZWZhdWxVcmwpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZyZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJmNlcnRpZmljYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmd3JhcHBlZEtleSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4gJnNlY3VyZVN0b3BzKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3AoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzc2lkLCBWZWN0b3I8dWludDhfdD4gJnNlY3VyZVN0b3ApOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlU2VjdXJlU3RvcHMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzc1JlbGVhc2UpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUFsbFNlY3VyZVN0b3BzKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggJnZhbHVlICkgY29uc3Q7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0ICZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ2YWx1ZSApIGNvbnN0OwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCBjb25zdCAmdmFsdWUgKSBjb25zdDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzggY29uc3QgJm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJnZhbHVlICkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldENpcGhlckFsZ29yaXRobShWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0ICZhbGdvcml0aG0pOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYWNBbGdvcml0aG0oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCAmYWxnb3JpdGhtKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5jcnlwdChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZpdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZvdXRwdXQpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkZWNyeXB0KFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJml2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJm91dHB1dCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNpZ24oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZzaWduYXR1cmUpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCB2ZXJpZnkoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJm1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzaWduYXR1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmbWF0Y2gpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzaWduUlNBKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0ICZhbGdvcml0aG0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZ3cmFwcGVkS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnNpZ25hdHVyZSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldExpc3RlbmVyKGNvbnN0IHNwPElEcm1DbGllbnQ+JiBsaXN0ZW5lcik7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2VuZEV2ZW50KERybVBsdWdpbjo6RXZlbnRUeXBlIGV2ZW50VHlwZSwgaW50IGV4dHJhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICpzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgKmRhdGEpOwotCi0gICAgdmlydHVhbCB2b2lkIHNlbmRFeHBpcmF0aW9uVXBkYXRlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAqc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGV4cGlyeVRpbWVJbk1TKTsKLQotICAgIHZpcnR1YWwgdm9pZCBzZW5kS2V5c0NoYW5nZShWZWN0b3I8dWludDhfdD4gY29uc3QgKnNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPERybVBsdWdpbjo6S2V5U3RhdHVzPiBjb25zdCAqa2V5U3RhdHVzTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNOZXdVc2FibGVLZXkpOwotCi0gICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJnRoZV9sYXRlX3dobyk7Ci0KLXByaXZhdGU6Ci0gICAgc3RhdGljIE11dGV4IG1Mb2NrOwotCi0gICAgc3RhdHVzX3QgbUluaXRDaGVjazsKLQotICAgIHNwPERybVNlc3Npb25DbGllbnRJbnRlcmZhY2U+IG1Ecm1TZXNzaW9uQ2xpZW50OwotCi0gICAgc3A8SURybUNsaWVudD4gbUxpc3RlbmVyOwotICAgIG11dGFibGUgTXV0ZXggbUV2ZW50TG9jazsKLSAgICBtdXRhYmxlIE11dGV4IG1Ob3RpZnlMb2NrOwotCi0gICAgc3A8U2hhcmVkTGlicmFyeT4gbUxpYnJhcnk7Ci0gICAgRHJtRmFjdG9yeSAqbUZhY3Rvcnk7Ci0gICAgRHJtUGx1Z2luICptUGx1Z2luOwotCi0gICAgc3RhdGljIEtleWVkVmVjdG9yPFZlY3Rvcjx1aW50OF90PiwgU3RyaW5nOD4gbVVVSURUb0xpYnJhcnlQYXRoTWFwOwotICAgIHN0YXRpYyBLZXllZFZlY3RvcjxTdHJpbmc4LCB3cDxTaGFyZWRMaWJyYXJ5PiA+IG1MaWJyYXJ5UGF0aFRvT3BlbkxpYnJhcnlNYXA7Ci0gICAgc3RhdGljIE11dGV4IG1NYXBMb2NrOwotCi0gICAgdm9pZCBmaW5kRmFjdG9yeUZvclNjaGVtZShjb25zdCB1aW50OF90IHV1aWRbMTZdKTsKLSAgICBib29sIGxvYWRMaWJyYXJ5Rm9yU2NoZW1lKGNvbnN0IFN0cmluZzggJnBhdGgsIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pOwotICAgIHZvaWQgY2xvc2VGYWN0b3J5KCk7Ci0gICAgdm9pZCB3cml0ZUJ5dGVBcnJheShQYXJjZWwgJm9iaiwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICphcnJheSk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEcm0pOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBDUllQVE9fSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtSGFsLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybUhhbC5oCmluZGV4IGYyNjdmNzYuLmJkZjFiMzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtSGFsLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm1IYWwuaApAQCAtMjAsOSArMjAsMTEgQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JRHJtRmFjdG9yeS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JRHJtUGx1Z2luLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lEcm1QbHVnaW5MaXN0ZW5lci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JRHJtRmFjdG9yeS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JRHJtUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1GYWN0b3J5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1QbHVnaW4uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSURybVBsdWdpbkxpc3RlbmVyLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYWRybS9Ecm1NZXRyaWNzLmg+CkBAIC0zNSwxMSArMzcsMTYgQEAKIHVzaW5nIGRybTo6VjFfMDo6SURybUZhY3Rvcnk7CiB1c2luZyBkcm06OlYxXzA6OklEcm1QbHVnaW47CiB1c2luZyBkcm06OlYxXzA6OklEcm1QbHVnaW5MaXN0ZW5lcjsKLXVzaW5nIGRybTo6VjFfMDo6S2V5U3RhdHVzOwordXNpbmcgZHJtOjpWMV8xOjpTZWN1cml0eUxldmVsOwordXNpbmcgZHJtOjpWMV8yOjpLZXlTdGF0dXM7Cit1c2luZyBkcm06OlYxXzI6Ok9mZmxpbmVMaWNlbnNlU3RhdGU7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7CiAKK3R5cGVkZWYgZHJtOjpWMV8yOjpJRHJtUGx1Z2luTGlzdGVuZXIgSURybVBsdWdpbkxpc3RlbmVyX1YxXzI7Cit0eXBlZGVmIGRybTo6VjFfMDo6S2V5U3RhdHVzIEtleVN0YXR1c19WMV8wOworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBEcm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlOwpAQCAtNTAsMTQgKzU3LDE3IEBACiB9CiAKIHN0cnVjdCBEcm1IYWwgOiBwdWJsaWMgQm5Ecm0sCi0gICAgICAgICAgICAgcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50LAotICAgICAgICAgICAgIHB1YmxpYyBJRHJtUGx1Z2luTGlzdGVuZXIgeworICAgICAgICAgICAgICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCwKKyAgICAgICAgICAgICAgICBwdWJsaWMgSURybVBsdWdpbkxpc3RlbmVyX1YxXzIgewogICAgIERybUhhbCgpOwogICAgIHZpcnR1YWwgfkRybUhhbCgpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKIAotICAgIHZpcnR1YWwgYm9vbCBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBTdHJpbmc4ICZtaW1lVHlwZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICppc1N1cHBvcnRlZCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVBsdWdpbihjb25zdCB1aW50OF90IHV1aWRbMTZdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJmFwcFBhY2thZ2VOYW1lKTsKQEAgLTExMyw2ICsxMjMsMTEgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyaXR5TGV2ZWwoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgKmxldmVsKSBjb25zdDsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4+ICZrZXlTZXRJZHMpIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlT2ZmbGluZUxpY2Vuc2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPZmZsaW5lTGljZW5zZVN0YXRlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQsCisgICAgICAgICAgICBEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGUgKmxpY2Vuc2VTdGF0ZSkgY29uc3Q7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggJnZhbHVlICkgY29uc3Q7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0ICZuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ2YWx1ZSApIGNvbnN0OwpAQCAtMTY2LDggKzE4MSwxMyBAQAogICAgICAgICAgICAgaW50NjRfdCBleHBpcnlUaW1lSW5NUyk7CiAKICAgICBSZXR1cm48dm9pZD4gc2VuZEtleXNDaGFuZ2UoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVN0YXR1c19WMV8wPiYga2V5U3RhdHVzTGlzdCwgYm9vbCBoYXNOZXdVc2FibGVLZXkpOworCisgICAgUmV0dXJuPHZvaWQ+IHNlbmRLZXlzQ2hhbmdlXzFfMihjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAogICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8S2V5U3RhdHVzPiYga2V5U3RhdHVzTGlzdCwgYm9vbCBoYXNOZXdVc2FibGVLZXkpOwogCisgICAgUmV0dXJuPHZvaWQ+IHNlbmRTZXNzaW9uTG9zdFN0YXRlKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpOworCiAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJnRoZV9sYXRlX3dobyk7CiAKIHByaXZhdGU6CkBAIC0xODIsNiArMjAyLDcgQEAKICAgICBjb25zdCBWZWN0b3I8c3A8SURybUZhY3Rvcnk+PiBtRmFjdG9yaWVzOwogICAgIHNwPElEcm1QbHVnaW4+IG1QbHVnaW47CiAgICAgc3A8ZHJtOjpWMV8xOjpJRHJtUGx1Z2luPiBtUGx1Z2luVjFfMTsKKyAgICBzcDxkcm06OlYxXzI6OklEcm1QbHVnaW4+IG1QbHVnaW5WMV8yOwogICAgIFN0cmluZzggbUFwcFBhY2thZ2VOYW1lOwogCiAgICAgLy8gTXV0YWJsZSB0byBhbGxvdyBtb2RpZmljYXRpb24gd2l0aGluIEdldFByb3BlcnR5Qnl0ZUFycmF5LgpAQCAtMjEwLDYgKzIzMSwxMSBAQAogICAgIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUpIGNvbnN0OwogICAgIHN0YXR1c190IGdldFByb3BlcnR5Qnl0ZUFycmF5SW50ZXJuYWwoU3RyaW5nOCBjb25zdCAmbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmdmFsdWUpIGNvbnN0OworICAgIHN0YXR1c190IG1hdGNoTWltZVR5cGVBbmRTZWN1cml0eUxldmVsKGNvbnN0IHNwPElEcm1GYWN0b3J5PiAmZmFjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJm1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICppc1N1cHBvcnRlZCk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEcm1IYWwpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtTWV0cmljcy5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm1NZXRyaWNzLmgKaW5kZXggMjYxOTk4Zi4uNmYxMzJiZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm1NZXRyaWNzLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm1NZXRyaWNzLmgKQEAgLTIxLDYgKzIxLDcgQEAKIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC90eXBlcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi90eXBlcy5oPgogI2luY2x1ZGUgPGJpbmRlci9QZXJzaXN0YWJsZUJ1bmRsZS5oPgogI2luY2x1ZGUgPG1lZGlhL0NvdW50ZXJNZXRyaWMuaD4KICNpbmNsdWRlIDxtZWRpYS9FdmVudE1ldHJpYy5oPgpAQCAtNTAsNyArNTEsNyBAQAogICBDb3VudGVyTWV0cmljPHN0YXR1c190PiBtUHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlQ291bnRlcjsKIAogICAvLyBDb3VudCBvZiBrZXkgc3RhdHVzIGV2ZW50cyBicm9rZW4gb3V0IGJ5IHN0YXR1cyB0eXBlLgotICBDb3VudGVyTWV0cmljPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6S2V5U3RhdHVzVHlwZT4KKyAgQ291bnRlck1ldHJpYzw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OktleVN0YXR1c1R5cGU+CiAgICAgICBtS2V5U3RhdHVzQ2hhbmdlQ291bnRlcjsKICAgLy8gQ291bnQgb2YgZXZlbnRzIGJyb2tlbiBvdXQgYnkgZXZlbnQgdHlwZQogICBDb3VudGVyTWV0cmljPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6RXZlbnRUeXBlPiBtRXZlbnRDb3VudGVyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JRHJtLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lEcm0uaAppbmRleCA4ZTllYjNhLi5mYmU4MGM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lEcm0uaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lEcm0uaApAQCAtMzQsNyArMzQsMTAgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBib29sIGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFN0cmluZzggJm1pbWVUeXBlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgc2VjdXJpdHlMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnJlc3VsdCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVQbHVnaW4oY29uc3QgdWludDhfdCB1dWlkWzE2XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZhcHBQYWNrYWdlTmFtZSkgPSAwOwpAQCAtNzUsOCArNzgsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmY2VydGlmaWNhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ3cmFwcGVkS2V5KSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4gJnNlY3VyZVN0b3BzKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wSWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4gJnNlY3VyZVN0b3BJZHMpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAmc2VjdXJlU3RvcHMpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4+ICZzZWN1cmVTdG9wSWRzKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NpZCwgVmVjdG9yPHVpbnQ4X3Q+ICZzZWN1cmVTdG9wKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VTZWN1cmVTdG9wcyhWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzUmVsZWFzZSkgPSAwOwpAQCAtOTEsNiArOTQsMTEgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyaXR5TGV2ZWwoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgKmxldmVsKSBjb25zdCA9IDA7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAma2V5U2V0SWRzKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVPZmZsaW5lTGljZW5zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPZmZsaW5lTGljZW5zZVN0YXRlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQsCisgICAgICAgICAgICBEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGUgKmxpY2Vuc2VTdGF0ZSkgY29uc3QgPSAwOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCAmbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmdmFsdWUpIGNvbnN0ID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmgKaW5kZXggNDVlOTYyMC4uNWNlMmNkYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmgKQEAgLTE3LDYgKzE3LDggQEAKICNpZm5kZWYgQU5EUk9JRF9JTUVESUFFWFRSQUNUT1JTRVJWSUNFX0gKICNkZWZpbmUgQU5EUk9JRF9JTUVESUFFWFRSQUNUT1JTRVJWSUNFX0gKIAorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKICNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgpAQCAtMzMsNiArMzUsOCBAQAogICAgIHZpcnR1YWwgc3A8SU1lZGlhRXh0cmFjdG9yPiBtYWtlRXh0cmFjdG9yKGNvbnN0IHNwPElEYXRhU291cmNlPiAmc291cmNlLCBjb25zdCBjaGFyICptaW1lKSA9IDA7CiAKICAgICB2aXJ0dWFsIHNwPElEYXRhU291cmNlPiBtYWtlSURhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpID0gMDsKKworICAgIHZpcnR1YWwgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBnZXRTdXBwb3J0ZWRUeXBlcygpID0gMDsKIH07CiAKIGNsYXNzIEJuTWVkaWFFeHRyYWN0b3JTZXJ2aWNlOiBwdWJsaWMgQm5JbnRlcmZhY2U8SU1lZGlhRXh0cmFjdG9yU2VydmljZT4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKaW5kZXggMjE3ZGUxNC4uZjJlMjA2MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKQEAgLTI2LDExICsyNiwxMSBAQAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU1lZGlhUGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitjbGFzcyBJTWVkaWFQbGF5ZXI7CiBjbGFzcyBJTWVkaWFDb2RlY0xpc3Q7CiBzdHJ1Y3QgSU1lZGlhSFRUUFNlcnZpY2U7CiBjbGFzcyBJTWVkaWFSZWNvcmRlcjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXIuaAppbmRleCAzNzkwMDBlLi5mOWM1NTdjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oCkBAIC03Myw3ICs3Myw5IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcykgPSAwOwotCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgPSAwOwogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhU291cmNlLmgKaW5kZXggN2E0YjFiOS4uMzgxZGYyNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFTb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVNvdXJjZS5oCkBAIC0xMjQsMTAgKzEyNCwxMSBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrQmluZGVyTWVkaWFCdWZmZXJzID0gNDsgLy8gYnVmZmVycyBtYW5hZ2VkIGJ5IEJuTWVkaWFTb3VyY2UKKyAgICAvLyBhbGlnbiBidWZmZXIgY291bnQgd2l0aCB2aWRlbyByZXF1ZXN0IHNpemUgaW4gTnVNZWRpYUV4dHJhY3Rvcjo6c2VsZWN0VHJhY2soKQorICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0JpbmRlck1lZGlhQnVmZmVycyA9IDg7IC8vIGJ1ZmZlcnMgbWFuYWdlZCBieSBCbk1lZGlhU291cmNlCiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrVHJhbnNmZXJTaGFyZWRBc1NoYXJlZFRocmVzaG9sZCA9IDQgKiAxMDI0OyAgLy8gaWYgPj0gc2hhcmVkLCBlbHNlIGlubGluZQotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1RyYW5zZmVySW5saW5lQXNTaGFyZWRUaHJlc2hvbGQgPSA2NCAqIDEwMjQ7IC8vIGlmID49IHNoYXJlZCwgZWxzZSBpbmxpbmUKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtJbmxpbmVNYXhUcmFuc2ZlciA9IDI1NiAqIDEwMjQ7IC8vIEJpbmRlciBzaXplIGxpbWl0ZWQgdG8gQklOREVSX1ZNX1NJWkUuCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrVHJhbnNmZXJJbmxpbmVBc1NoYXJlZFRocmVzaG9sZCA9IDggKiAxMDI0OyAvLyBpZiA+PSBzaGFyZWQsIGVsc2UgaW5saW5lCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrSW5saW5lTWF4VHJhbnNmZXIgPSA2NCAqIDEwMjQ7IC8vIEJpbmRlciBzaXplIGxpbWl0ZWQgdG8gQklOREVSX1ZNX1NJWkUuCiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5Cbk1lZGlhU291cmNlKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lPTVguaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU9NWC5oCmluZGV4IGU2OWMwMmQuLjdlN2MyZDIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU9NWC5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU9NWC5oCkBAIC00Nyw5ICs0Nyw4IEBACiAKIHVzaW5nIGhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjpJT214Tm9kZTsKIAotY2xhc3MgSU9NWCA6IHB1YmxpYyBJSW50ZXJmYWNlIHsKK2NsYXNzIElPTVggOiBwdWJsaWMgUmVmQmFzZSB7CiBwdWJsaWM6Ci0gICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShPTVgpOwogCiAgICAgdHlwZWRlZiB1aW50MzJfdCBidWZmZXJfaWQ7CiAKQEAgLTIyNCwxNCArMjIzLDYgQEAKIH07CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLWNsYXNzIEJuT01YIDogcHVibGljIEJuSW50ZXJmYWNlPElPTVg+IHsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHN0YXR1c190IG9uVHJhbnNhY3QoCi0gICAgICAgICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwgJmRhdGEsIFBhcmNlbCAqcmVwbHksCi0gICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwotfTsKLQogY2xhc3MgQm5PTVhOb2RlIDogcHVibGljIEJuSW50ZXJmYWNlPElPTVhOb2RlPiB7CiBwdWJsaWM6CiAgICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9KQXVkaW9BdHRyaWJ1dGVzLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0pBdWRpb0F0dHJpYnV0ZXMuaAppbmRleCBmYjExNDM1Li5lYTBhYWEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0pBdWRpb0F0dHJpYnV0ZXMuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0pBdWRpb0F0dHJpYnV0ZXMuaApAQCAtMjYsOCArMjYsNyBAQAogcHVibGljOgogICAgIC8qIENyZWF0ZXMgYSBKYXZhIEF1ZGlvQXR0cmlidXRlcyBvYmplY3QuICovCiAgICAgc3RhdGljIGpvYmplY3QgY3JlYXRlQXVkaW9BdHRyaWJ1dGVzT2JqKEpOSUVudiAqZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcykgewogCiAgICAgICAgIGpjbGFzcyBqQnVpbGRlckNscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlcyRCdWlsZGVyIik7CiAgICAgICAgIGptZXRob2RJRCBqQnVpbGRlckN0b3IgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAiPGluaXQ+IiwgIigpViIpOwpAQCAtNTgsMTEgKzU3LDYgQEAKICAgICAgICAgICAgIC8vIFRPRE86IEhhbmRsZSB0aGUgJ3RhZ3MnIChjaGFyW10gdG8gSGFzaFNldDxTdHJpbmc+KS4KICAgICAgICAgICAgIC8vIEhvdyB0byBwYXJzZSB0aGUgY2hhcltdPyBJcyB0aGVyZSBhbnkgZXhhbXBsZSBvZiBpdD8KICAgICAgICAgICAgIC8vIEFsc28sIHRoZSBhZGRUYWdzKCkgbWV0aG9kIGlzIGhpZGRlbi4KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIENhbGwgQXVkaW9BdHRyaWJ1dGVzLkJ1aWxkZXIuc2V0TGVnYWN5U3RyZWFtVHlwZSgpLmJ1aWxkKCkKLSAgICAgICAgICAgIGptZXRob2RJRCBqU2V0TGVnYWN5U3RyZWFtVHlwZSA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJzZXRMZWdhY3lTdHJlYW1UeXBlIiwKLSAgICAgICAgICAgICAgICAgICAgIihJKUxhbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlcyRCdWlsZGVyOyIpOwotICAgICAgICAgICAgakJ1aWxkZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJPYmosIGpTZXRMZWdhY3lTdHJlYW1UeXBlLCBzdHJlYW1UeXBlKTsKICAgICAgICAgfQogCiAgICAgICAgIGptZXRob2RJRCBqQnVpbGQgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAiYnVpbGQiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjSW5mby5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjSW5mby5oCmluZGV4IGIzNzc3ZDMuLjU0ZjU2NWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFDb2RlY0luZm8uaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhQ29kZWNJbmZvLmgKQEAgLTMwLDYgKzMwLDggQEAKICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CiAKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQU1lc3NhZ2U7CkBAIC01MSwyMSArNTMsNDcgQEAKIAogICAgIHN0cnVjdCBDYXBhYmlsaXRpZXNXcml0ZXI7CiAKKyAgICBlbnVtIEF0dHJpYnV0ZXMgOiBpbnQzMl90IHsKKyAgICAgICAgLy8gYXR0cmlidXRlIGZsYWdzCisgICAgICAgIGtGbGFnSXNFbmNvZGVyID0gMSA8PCAwLAorICAgICAgICBrRmxhZ0lzVmVuZG9yID0gMSA8PCAxLAorICAgICAgICBrRmxhZ0lzU29mdHdhcmVPbmx5ID0gMSA8PCAyLAorICAgICAgICBrRmxhZ0lzSGFyZHdhcmVBY2NlbGVyYXRlZCA9IDEgPDwgMywKKyAgICB9OworCiAgICAgc3RydWN0IENhcGFiaWxpdGllcyA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICAgICAgZW51bSB7Ci0gICAgICAgICAgICAvLyBkZWNvZGVyIGZsYWdzCi0gICAgICAgICAgICBrRmxhZ1N1cHBvcnRzQWRhcHRpdmVQbGF5YmFjayA9IDEgPDwgMCwKLSAgICAgICAgICAgIGtGbGFnU3VwcG9ydHNTZWN1cmVQbGF5YmFjayA9IDEgPDwgMSwKLSAgICAgICAgICAgIGtGbGFnU3VwcG9ydHNUdW5uZWxlZFBsYXliYWNrID0gMSA8PCAyLAorICAgICAgICBjb25zdGV4cHIgc3RhdGljIGNoYXIgRkVBVFVSRV9BREFQVElWRV9QTEFZQkFDS1tdID0gImZlYXR1cmUtYWRhcHRpdmUtcGxheWJhY2siOworICAgICAgICBjb25zdGV4cHIgc3RhdGljIGNoYXIgRkVBVFVSRV9EWU5BTUlDX1RJTUVTVEFNUFtdID0gImZlYXR1cmUtZHluYW1pYy10aW1lc3RhbXAiOworICAgICAgICBjb25zdGV4cHIgc3RhdGljIGNoYXIgRkVBVFVSRV9GUkFNRV9QQVJTSU5HW10gPSAiZmVhdHVyZS1mcmFtZS1wYXJzaW5nIjsKKyAgICAgICAgY29uc3RleHByIHN0YXRpYyBjaGFyIEZFQVRVUkVfSU5UUkFfUkVGUkVTSFtdID0gImZlYXR1cmUtZnJhbWUtcGFyc2luZyI7CisgICAgICAgIGNvbnN0ZXhwciBzdGF0aWMgY2hhciBGRUFUVVJFX01VTFRJUExFX0ZSQU1FU1tdID0gImZlYXR1cmUtbXVsdGlwbGUtZnJhbWVzIjsKKyAgICAgICAgY29uc3RleHByIHN0YXRpYyBjaGFyIEZFQVRVUkVfU0VDVVJFX1BMQVlCQUNLW10gPSAiZmVhdHVyZS1zZWN1cmUtcGxheWJhY2siOworICAgICAgICBjb25zdGV4cHIgc3RhdGljIGNoYXIgRkVBVFVSRV9UVU5ORUxFRF9QTEFZQkFDS1tdID0gImZlYXR1cmUtdHVubmVsZWQtcGxheWJhY2siOwogCi0gICAgICAgICAgICAvLyBlbmNvZGVyIGZsYWdzCi0gICAgICAgICAgICBrRmxhZ1N1cHBvcnRzSW50cmFSZWZyZXNoID0gMSA8PCAwLAotCi0gICAgICAgIH07Ci0KKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIHN1cHBvcnRlZCBsZXZlbHMgZm9yIGVhY2ggc3VwcG9ydGVkIHByb2ZpbGUgaW4gYSB0YXJnZXQgYXJyYXkuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBwcm9maWxlTGV2ZWxzIHRhcmdldCBhcnJheSBmb3IgdGhlIHByb2ZpbGUgbGV2ZWxzLgorICAgICAgICAgKi8KICAgICAgICAgdm9pZCBnZXRTdXBwb3J0ZWRQcm9maWxlTGV2ZWxzKFZlY3RvcjxQcm9maWxlTGV2ZWw+ICpwcm9maWxlTGV2ZWxzKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyB0aGUgc3VwcG9ydGVkIGNvbG9yIGZvcm1hdHMgaW4gYSB0YXJnZXQgYXJyYXkuIE9ubHkgdXNlZCBmb3IgdmlkZW8vaW1hZ2UKKyAgICAgICAgICogY29tcG9uZW50cy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGNvbG9yRm9ybWF0cyB0YXJnZXQgYXJyYXkgZm9yIHRoZSBjb2xvciBmb3JtYXRzLgorICAgICAgICAgKi8KICAgICAgICAgdm9pZCBnZXRTdXBwb3J0ZWRDb2xvckZvcm1hdHMoVmVjdG9yPHVpbnQzMl90PiAqY29sb3JGb3JtYXRzKSBjb25zdDsKLSAgICAgICAgdWludDMyX3QgZ2V0RmxhZ3MoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmV0dXJucyBtZXRhZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb2RlYyBjYXBhYmlsaXR5LgorICAgICAgICAgKgorICAgICAgICAgKiBUaGlzIGNvbnRhaW5zOgorICAgICAgICAgKiAtIGZlYXR1cmVzLAorICAgICAgICAgKiAtIHBlcmZvcm1hbmNlIGRhdGEuCisgICAgICAgICAqCisgICAgICAgICAqIFRPRE86IGV4cG9zZSB0aGlzIGFzIHNlcGFyYXRlIEFQSS1zIGFuZCB3cmFwIGhlcmUuCisgICAgICAgICAqLwogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gZ2V0RGV0YWlscygpIGNvbnN0OwogCiAgICAgcHJvdGVjdGVkOgpAQCAtNzMsNyArMTAxLDYgQEAKICAgICAgICAgU29ydGVkVmVjdG9yPFByb2ZpbGVMZXZlbD4gbVByb2ZpbGVMZXZlbHNTb3J0ZWQ7CiAgICAgICAgIFZlY3Rvcjx1aW50MzJfdD4gbUNvbG9yRm9ybWF0czsKICAgICAgICAgU29ydGVkVmVjdG9yPHVpbnQzMl90PiBtQ29sb3JGb3JtYXRzU29ydGVkOwotICAgICAgICB1aW50MzJfdCBtRmxhZ3M7CiAgICAgICAgIHNwPEFNZXNzYWdlPiBtRGV0YWlsczsKIAogICAgICAgICBDYXBhYmlsaXRpZXMoKTsKQEAgLTkzLDggKzEyMCw3IEBACiAgICAgLyoqCiAgICAgICogVGhpcyBjbGFzcyBpcyB1c2VkIGZvciBtb2RpZnlpbmcgaW5mb3JtYXRpb24gaW5zaWRlIGEgYENhcGFiaWxpdGllc2AKICAgICAgKiBvYmplY3QuIEFuIG9iamVjdCBvZiB0eXBlIGBDYXBhYmlsaXRpZXNXcml0ZXJgIGNhbiBiZSBvYnRhaW5lZCBieSBjYWxsaW5nCi0gICAgICogYE1lZGlhQ29kZWNJbmZvV3JpdGVyOjphZGRNaW1lKClgIG9yCi0gICAgICogYE1lZGlhQ29kZWNJbmZvV3JpdGVyOjp1cGRhdGVNaW1lKClgLgorICAgICAqIGBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6YWRkTWVkaWFUeXBlKClgLgogICAgICAqLwogICAgIHN0cnVjdCBDYXBhYmlsaXRpZXNXcml0ZXIgewogICAgICAgICAvKioKQEAgLTEyMiw2ICsxNDgsMTMgQEAKICAgICAgICAgICovCiAgICAgICAgIHZvaWQgYWRkRGV0YWlsKGNvbnN0IGNoYXIqIGtleSwgaW50MzJfdCB2YWx1ZSk7CiAgICAgICAgIC8qKgorICAgICAgICAgKiBSZW1vdmVzIGEga2V5LXZhbHVlIHBhaXIgZnJvbSB0aGUgbGlzdCBvZiBkZXRhaWxzLiBJZiB0aGUga2V5IGlzIG5vdAorICAgICAgICAgKiBwcmVzZW50LCB0aGlzIGNhbGwgZG9lcyBub3RoaW5nLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkuCisgICAgICAgICAqLworICAgICAgICB2b2lkIHJlbW92ZURldGFpbChjb25zdCBjaGFyKiBrZXkpOworICAgICAgICAvKioKICAgICAgICAgICogQWRkIGEgcHJvZmlsZS1sZXZlbCBwYWlyLiBJZiB0aGlzIHByb2ZpbGUtbGV2ZWwgcGFpciBhbHJlYWR5IGV4aXN0cywKICAgICAgICAgICogaXQgd2lsbCBiZSBpZ25vcmVkLgogICAgICAgICAgKgpAQCAtMTM2LDEzICsxNjksNyBAQAogICAgICAgICAgKiBAcGFyYW0gZm9ybWF0IFRoZSBjb2xvciBmb3JtYXQuCiAgICAgICAgICAqLwogICAgICAgICB2b2lkIGFkZENvbG9yRm9ybWF0KHVpbnQzMl90IGZvcm1hdCk7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGQgZmxhZ3MuIFRoZSB1bmRlcmx5aW5nIG9wZXJhdGlvbiBpcyBiaXR3aXNlLW9yLiBJbiBvdGhlciB3b3JkcywKLSAgICAgICAgICogYml0cyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIHNldCB3aWxsIGJlIGlnbm9yZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBmbGFncyBUaGUgYWRkaXRpb25hbCBmbGFncy4KLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgYWRkRmxhZ3ModWludDMyX3QgZmxhZ3MpOworCiAgICAgcHJpdmF0ZToKICAgICAgICAgLyoqCiAgICAgICAgICAqIFRoZSBhc3NvY2lhdGVkIGBDYXBhYmlsaXRpZXNgIG9iamVjdC4KQEAgLTE1OCwxOSArMTg1LDQyIEBACiAgICAgICAgIGZyaWVuZCBNZWRpYUNvZGVjSW5mb1dyaXRlcjsKICAgICB9OwogCi0gICAgYm9vbCBpc0VuY29kZXIoKSBjb25zdDsKLSAgICB2b2lkIGdldFN1cHBvcnRlZE1pbWVzKFZlY3RvcjxBU3RyaW5nPiAqbWltZXMpIGNvbnN0OwotICAgIGNvbnN0IHNwPENhcGFiaWxpdGllcz4gZ2V0Q2FwYWJpbGl0aWVzRm9yKGNvbnN0IGNoYXIgKm1pbWUpIGNvbnN0OworICAgIGlubGluZSBib29sIGlzRW5jb2RlcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGdldEF0dHJpYnV0ZXMoKSAmIGtGbGFnSXNFbmNvZGVyOworICAgIH0KKworICAgIEF0dHJpYnV0ZXMgZ2V0QXR0cmlidXRlcygpIGNvbnN0OworICAgIHZvaWQgZ2V0U3VwcG9ydGVkTWVkaWFUeXBlcyhWZWN0b3I8QVN0cmluZz4gKm1lZGlhVHlwZXMpIGNvbnN0OworICAgIGNvbnN0IHNwPENhcGFiaWxpdGllcz4gZ2V0Q2FwYWJpbGl0aWVzRm9yKGNvbnN0IGNoYXIgKm1lZGlhVHlwZSkgY29uc3Q7CiAgICAgY29uc3QgY2hhciAqZ2V0Q29kZWNOYW1lKCkgY29uc3Q7CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgdmVjdG9yIGNvbnRhaW5pbmcgYWx0ZXJuYXRlIG5hbWVzIGZvciB0aGUgY29kZWMuCisgICAgICoKKyAgICAgKiBccGFyYW0gYWxpYXNlcyB0aGUgZGVzdGluYXRpb24gYXJyYXkgZm9yIHRoZSBhbGlhc2VzLiBUaGlzIGlzIGNsZWFyZWQuCisgICAgICoKKyAgICAgKiBNdWx0aXBsZSBjb2RlY3MgbWF5IHNoYXJlIGFsdGVybmF0ZSBuYW1lcyBhcyBsb25nIGFzIHRoZWlyIHN1cHBvcnRlZCBtZWRpYSB0eXBlcyBhcmUKKyAgICAgKiBkaXN0aW5jdDsgaG93ZXZlciwgdGhlc2Ugd2lsbCByZXN1bHQgaW4gZGlmZmVyZW50IGFsaWFzZXMgZm9yIHRoZSBNZWRpYUNvZGVjIHVzZXIgYXMKKyAgICAgKiB0aGUgY2Fub25pY2FsIGNvZGVjIGhhcyB0byBiZSByZXNvbHZlZCB3aXRob3V0IGtub3dpbmcgdGhlIG1lZGlhIHR5cGUgaW4KKyAgICAgKiBNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUuCisgICAgICovCisgICAgdm9pZCBnZXRBbGlhc2VzKFZlY3RvcjxBU3RyaW5nPiAqYWxpYXNlcykgY29uc3Q7CisKKyAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHNlcnZpY2UgdGhhdCBob3N0cyB0aGUgY29kZWMuIFRoaXMgdmFsdWUgaXMgbm90CiAgICAgICogdmlzaWJsZSBhdCB0aGUgSmF2YSBsZXZlbC4KICAgICAgKgogICAgICAqIEN1cnJlbnRseSwgdGhpcyBpcyB0aGUgImluc3RhbmNlIG5hbWUiIG9mIHRoZSBJT214IHNlcnZpY2UuCiAgICAgICovCiAgICAgY29uc3QgY2hhciAqZ2V0T3duZXJOYW1lKCkgY29uc3Q7Ci0gICAgdWludDMyX3QgcmFuaygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgcmFuayBvZiB0aGUgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGVjaG5pY2FsbHkgdGhpcyBpcyBkZWZpbmVkIHRvIGJlIHBlciBtZWRpYSB0eXBlLCBidXQgdGhhdCBtYWtlcyBvcmRlcmluZyB0aGUgTWVkaWFDb2RlY0xpc3QKKyAgICAgKiBpbXBvc3NpYmxlIGFzIE1lZGlhQ29kZWNMaXN0IGlzIG9yZGVyZWQgYnkgY29kZWMgbmFtZS4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBnZXRSYW5rKCkgY29uc3Q7CiAKICAgICAvKioKICAgICAgKiBTZXJpYWxpemF0aW9uIG92ZXIgQmluZGVyCkBAIC0xODEsMTEgKzIzMSwxMiBAQAogcHJpdmF0ZToKICAgICBBU3RyaW5nIG1OYW1lOwogICAgIEFTdHJpbmcgbU93bmVyOwotICAgIGJvb2wgbUlzRW5jb2RlcjsKKyAgICBBdHRyaWJ1dGVzIG1BdHRyaWJ1dGVzOwogICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIHNwPENhcGFiaWxpdGllcz4gPiBtQ2FwczsKKyAgICBWZWN0b3I8QVN0cmluZz4gbUFsaWFzZXM7CiAgICAgdWludDMyX3QgbVJhbms7CiAKLSAgICBzc2l6ZV90IGdldENhcGFiaWxpdHlJbmRleChjb25zdCBjaGFyICptaW1lKSBjb25zdDsKKyAgICBzc2l6ZV90IGdldENhcGFiaWxpdHlJbmRleChjb25zdCBjaGFyICptZWRpYVR5cGUpIGNvbnN0OwogCiAgICAgLyoqCiAgICAgICogQ29uc3RydWN0IGFuIGBNZWRpYUNvZGVjSW5mb2Agb2JqZWN0LiBBZnRlciB0aGUgY29uc3RydWN0aW9uLCBpdHMKQEAgLTIxOSw2ICsyNzAsMTMgQEAKICAgICAgKi8KICAgICB2b2lkIHNldE5hbWUoY29uc3QgY2hhciogbmFtZSk7CiAgICAgLyoqCisgICAgICogQWRkcyBhbiBhbGlhcyAoYWx0ZXJuYXRlIG5hbWUpIGZvciB0aGUgY29kZWMuIE11bHRpcGxlIGNvZGVjcyBjYW4gc2hhcmUgYW4gYWx0ZXJuYXRlIG5hbWUKKyAgICAgKiBhcyBsb25nIGFzIHRoZWlyIHN1cHBvcnRlZCBtZWRpYSB0eXBlcyBhcmUgZGlzdGluY3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbmFtZSBhbiBhbHRlcm5hdGUgbmFtZS4KKyAgICAgKi8KKyAgICB2b2lkIGFkZEFsaWFzKGNvbnN0IGNoYXIqIG5hbWUpOworICAgIC8qKgogICAgICAqIFNldCB0aGUgb3duZXIgbmFtZSBvZiB0aGUgY29kZWMuCiAgICAgICoKICAgICAgKiBUaGlzICJvd25lciBuYW1lIiBpcyB0aGUgbmFtZSBvZiB0aGUgYElPbXhgIGluc3RhbmNlIHRoYXQgc3VwcG9ydHMgdGhpcwpAQCAtMjI4LDMyICsyODYsMzIgQEAKICAgICAgKi8KICAgICB2b2lkIHNldE93bmVyKGNvbnN0IGNoYXIqIG93bmVyKTsKICAgICAvKioKLSAgICAgKiBTZXQgd2hldGhlciB0aGlzIGNvZGVjIGlzIGFuIGVuY29kZXIgb3IgYSBkZWNvZGVyLgorICAgICAqIFNldHMgY29kZWMgYXR0cmlidXRlcy4KICAgICAgKgotICAgICAqIEBwYXJhbSBpc0VuY29kZXIgV2hldGhlciB0aGlzIGNvZGVjIGlzIGFuIGVuY29kZXIgb3IgYSBkZWNvZGVyLgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIENvZGVjIGF0dHJpYnV0ZXMuCiAgICAgICovCi0gICAgdm9pZCBzZXRFbmNvZGVyKGJvb2wgaXNFbmNvZGVyID0gdHJ1ZSk7CisgICAgdm9pZCBzZXRBdHRyaWJ1dGVzKHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPE1lZGlhQ29kZWNJbmZvOjpBdHRyaWJ1dGVzPjo6dHlwZSBhdHRyaWJ1dGVzKTsKICAgICAvKioKLSAgICAgKiBBZGQgYSBtaW1lIHRvIGFuIGluZGV4ZWQgbGlzdCBhbmQgcmV0dXJuIGEgYENhcGFiaWxpdGllc1dyaXRlcmAgb2JqZWN0CisgICAgICogQWRkIGEgbWVkaWEgdHlwZSB0byBhbiBpbmRleGVkIGxpc3QgYW5kIHJldHVybiBhIGBDYXBhYmlsaXRpZXNXcml0ZXJgIG9iamVjdAogICAgICAqIHRoYXQgY2FuIGJlIHVzZWQgZm9yIG1vZGlmeWluZyB0aGUgYXNzb2NpYXRlZCBgQ2FwYWJpbGl0aWVzYC4KICAgICAgKgotICAgICAqIElmIHRoZSBtaW1lIGFscmVhZHkgZXhpc3RzLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZQotICAgICAqIGBDYXBhYmlsaXRpZXNXcml0ZXJgIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWltZS4KKyAgICAgKiBJZiB0aGUgbWVkaWEgdHlwZSBhbHJlYWR5IGV4aXN0cywgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUKKyAgICAgKiBgQ2FwYWJpbGl0aWVzV3JpdGVyYCBhc3NvY2lhdGVkIHdpdGggdGhlIG1lZGlhIHR5cGUuCiAgICAgICoKLSAgICAgKiBAcGFyYW1baW5dIG1pbWUgVGhlIG5hbWUgb2YgYSBuZXcgbWltZSB0byBhZGQuCisgICAgICogQHBhcmFtW2luXSBtZWRpYVR5cGUgVGhlIG5hbWUgb2YgYSBuZXcgbWVkaWEgdHlwZSB0byBhZGQuCiAgICAgICogQHJldHVybiB3cml0ZXIgVGhlIGBDYXBhYmlsaXRpZXNXcml0ZXJgIG9iamVjdCBmb3IgbW9kaWZ5aW5nIHRoZQotICAgICAqIGBDYXBhYmlsaXRpZXNgIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWltZS4gYHdyaXRlcmAgd2lsbCBiZSB2YWxpZAotICAgICAqIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBgbWltZWAgYWxyZWFkeSBleGlzdHMgb3Igbm90LgorICAgICAqIGBDYXBhYmlsaXRpZXNgIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVkaWEgdHlwZS4gYHdyaXRlcmAgd2lsbCBiZSB2YWxpZAorICAgICAqIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBgbWVkaWFUeXBlYCBhbHJlYWR5IGV4aXN0cyBvciBub3QuCiAgICAgICovCi0gICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+IGFkZE1pbWUoCi0gICAgICAgICAgICBjb25zdCBjaGFyKiBtaW1lKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcj4gYWRkTWVkaWFUeXBlKAorICAgICAgICAgICAgY29uc3QgY2hhciogbWVkaWFUeXBlKTsKICAgICAvKioKLSAgICAgKiBSZW1vdmUgYSBtaW1lLgorICAgICAqIFJlbW92ZSBhIG1lZGlhIHR5cGUuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gbWltZSBUaGUgbmFtZSBvZiB0aGUgbWltZSB0byByZW1vdmUuCi0gICAgICogQHJldHVybiBgdHJ1ZWAgaWYgYG1pbWVgIGlzIHJlbW92ZWQ7IGBmYWxzZWAgaWYgYG1pbWVgIGlzIG5vdCBmb3VuZC4KKyAgICAgKiBAcGFyYW0gbWVkaWFUeXBlIFRoZSBuYW1lIG9mIHRoZSBtZWRpYSB0eXBlIHRvIHJlbW92ZS4KKyAgICAgKiBAcmV0dXJuIGB0cnVlYCBpZiBgbWVkaWFUeXBlYCBpcyByZW1vdmVkOyBgZmFsc2VgIGlmIGBtZWRpYVR5cGVgIGlzIG5vdCBmb3VuZC4KICAgICAgKi8KLSAgICBib29sIHJlbW92ZU1pbWUoY29uc3QgY2hhciogbWltZSk7CisgICAgYm9vbCByZW1vdmVNZWRpYVR5cGUoY29uc3QgY2hhciogbWVkaWFUeXBlKTsKICAgICAvKioKICAgICAgKiBTZXQgcmFuayBvZiB0aGUgY29kZWMuIE1lZGlhQ29kZWNMaXN0IHdpbGwgc3RhYmxlLXNvcnQgdGhlIGxpc3QgYWNjb3JkaW5nCiAgICAgICogdG8gcmFuayBpbiBub24tZGVzY2VuZGluZyBvcmRlci4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKaW5kZXggMGZlYjRmMy4uM2U4ZTdjOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmgKQEAgLTM0LDcgKzM0LDExIEBACiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfMTA4MFAgPSA2LAogICAgIENBTUNPUkRFUl9RVUFMSVRZX1FWR0EgPSA3LAogICAgIENBTUNPUkRFUl9RVUFMSVRZXzIxNjBQID0gOCwKLSAgICBDQU1DT1JERVJfUVVBTElUWV9MSVNUX0VORCA9IDgsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfVkdBID0gOSwKKyAgICBDQU1DT1JERVJfUVVBTElUWV80S0RDSSA9IDEwLAorICAgIENBTUNPUkRFUl9RVUFMSVRZX1FIRCA9IDExLAorICAgIENBTUNPUkRFUl9RVUFMSVRZXzJrID0gMTIsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfTElTVF9FTkQgPSAxMiwKIAogICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfTElTVF9TVEFSVCA9IDEwMDAsCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9MT1cgID0gMTAwMCwKQEAgLTQ2LDcgKzUwLDExIEBACiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV8xMDgwUCA9IDEwMDYsCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9RVkdBID0gMTAwNywKICAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzIxNjBQID0gMTAwOCwKLSAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xJU1RfRU5EID0gMTAwOCwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX1ZHQSA9IDEwMDksCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV80S0RDSSA9IDEwMTAsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9RSEQgPSAxMDExLAorICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfMmsgPSAxMDEyLAorICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfTElTVF9FTkQgPSAxMDEyLAogCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9MSVNUX1NUQVJUID0gMjAwMCwKICAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX0xPVyAgPSAyMDAwLApAQCAtNTUsNyArNjMsMTAgQEAKICAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzcyMFAgPSAyMDAzLAogICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfMTA4MFAgPSAyMDA0LAogICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfMjE2MFAgPSAyMDA1LAotICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfTElTVF9FTkQgPSAyMDA1LAorICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfQ0lGID0gMjAwNiwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX1ZHQSA9IDIwMDcsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF80S0RDSSA9IDIwMDgsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9MSVNUX0VORCA9IDIwMDgsCiB9OwogCiBlbnVtIHZpZGVvX2RlY29kZXIgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oCmluZGV4IDUzNDBkZGUuLmEyZGZmMzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmgKQEAgLTcyLDYgKzcyLDkgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcygKICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgY29uc3QgPSAwOwogCiAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NaWRpSW9XcmFwcGVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01pZGlJb1dyYXBwZXIuaAppbmRleCBiNWU1NjVlLi5iMTlkNDllIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01pZGlJb1dyYXBwZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01pZGlJb1dyYXBwZXIuaApAQCAtMjMsMTEgKzIzLDE0IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RydWN0IENEYXRhU291cmNlOworY2xhc3MgRGF0YVNvdXJjZVVud3JhcHBlcjsKKwogY2xhc3MgTWlkaUlvV3JhcHBlciB7CiBwdWJsaWM6CiAgICAgZXhwbGljaXQgTWlkaUlvV3JhcHBlcihjb25zdCBjaGFyICpwYXRoKTsKICAgICBleHBsaWNpdCBNaWRpSW9XcmFwcGVyKGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIGludDY0X3Qgc2l6ZSk7Ci0gICAgZXhwbGljaXQgTWlkaUlvV3JhcHBlcihEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKyAgICBleHBsaWNpdCBNaWRpSW9XcmFwcGVyKENEYXRhU291cmNlICpjc291cmNlKTsKIAogICAgIH5NaWRpSW9XcmFwcGVyKCk7CiAKQEAgLTQwLDcgKzQzLDcgQEAKICAgICBpbnQgbUZkOwogICAgIG9mZjY0X3QgbUJhc2U7CiAgICAgaW50NjRfdCAgbUxlbmd0aDsKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZVVud3JhcHBlciAqbURhdGFTb3VyY2U7CiAgICAgRUFTX0ZJTEUgbUVhc0ZpbGU7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL05ka1dyYXBwZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTmRrV3JhcHBlci5oCmluZGV4IGM5N2QxNzEuLjhhNDE3ZjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTmRrV3JhcHBlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTmRrV3JhcHBlci5oCkBAIC0yNzgsNiArMjc4LDI1IEBACiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU1lZGlhQ29kZWNXcmFwcGVyKTsKIH07CiAKK3N0cnVjdCBBTWVkaWFEYXRhU291cmNlV3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKKworICAgIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKGNvbnN0IHNwPERhdGFTb3VyY2U+Jik7CisgICAgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoQU1lZGlhRGF0YVNvdXJjZSopOworCisgICAgQU1lZGlhRGF0YVNvdXJjZSAqZ2V0QU1lZGlhRGF0YVNvdXJjZSgpOworCisgICAgdm9pZCBjbG9zZSgpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoKTsKKworcHJpdmF0ZToKKyAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFEYXRhU291cmNlICptQU1lZGlhRGF0YVNvdXJjZTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKTsKK307CisKIHN0cnVjdCBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyIDogcHVibGljIFJlZkJhc2UgewogCiAgICAgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcihBTWVkaWFFeHRyYWN0b3IgKmFNZWRpYUV4dHJhY3Rvcik7CkBAIC0yODcsOCArMzA2LDYgQEAKIAogICAgIHN0YXR1c190IHJlbGVhc2UoKTsKIAotICAgIHN0YXR1c190IGRpc2Nvbm5lY3QoKTsKLQogICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgpOwogCiAgICAgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBjaGFyICpsb2NhdGlvbik7CkBAIC0zMzksMzEgKzM1Niw2IEBACiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQU1lZGlhRXh0cmFjdG9yV3JhcHBlcik7CiB9OwogCi1zdHJ1Y3QgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIgOiBwdWJsaWMgUmVmQmFzZSB7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgdHJhbnNsYXRlX2Vycm9yKG1lZGlhX3N0YXR1c190IGVycik7Ci0KLSAgICBzdGF0aWMgc3NpemVfdCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9nZXRTaXplKHZvaWQgKnVzZXJkYXRhKTsKLQotICAgIHN0YXRpYyBzc2l6ZV90IEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX3JlYWRBdCh2b2lkICp1c2VyZGF0YSwgb2ZmNjRfdCBvZmZzZXQsIHZvaWQgKiBidWYsIHNpemVfdCBzaXplKTsKLQotICAgIHN0YXRpYyB2b2lkIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX2Nsb3NlKHZvaWQgKnVzZXJkYXRhKTsKLQotICAgIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKGNvbnN0IHNwPERhdGFTb3VyY2U+ICZkYXRhU291cmNlKTsKLQotICAgIEFNZWRpYURhdGFTb3VyY2UgKmdldEFNZWRpYURhdGFTb3VyY2UoKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKCk7Ci0KLXByaXZhdGU6Ci0gICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7Ci0KLSAgICBBTWVkaWFEYXRhU291cmNlICptQU1lZGlhRGF0YVNvdXJjZTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKTsKLX07Ci0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gTkRLX1dSQVBQRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvT01YQnVmZmVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL09NWEJ1ZmZlci5oCmluZGV4IDljOWY1ZTcuLjRhYmU5ZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvT01YQnVmZmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9PTVhCdWZmZXIuaApAQCAtMTM3LDcgKzEzNyw3IEBACiAgICAgaGlkbF9tZW1vcnkgbUhpZGxNZW1vcnk7CiAKICAgICAvLyBNb3ZlIGFzc2lnbm1lbnQKLSAgICBPTVhCdWZmZXIgJm9wZXJhdG9yPShPTVhCdWZmZXImJik7CisgICAgT01YQnVmZmVyICZvcGVyYXRvcj0oT01YQnVmZmVyJiYpIG5vZXhjZXB0OwogCiAgICAgLy8gRGVsZXRlZCBjb3B5IGNvbnN0cnVjdG9yIGFuZCBhc3NpZ25tZW50LgogICAgIE9NWEJ1ZmZlcihjb25zdCBPTVhCdWZmZXImKSA9IGRlbGV0ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvUGF0Y2hCdWlsZGVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1BhdGNoQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNzIyYTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1BhdGNoQnVpbGRlci5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1BBVENIX0JVSUxERVJfSAorI2RlZmluZSBBTkRST0lEX1BBVENIX0JVSUxERVJfSAorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCisvLyBUaGlzIGlzIGEgaGVhZGVyLW9ubHkgdXRpbGl0eS4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBQYXRjaEJ1aWxkZXIgeworICBwdWJsaWM6CisgICAgdXNpbmcgbWl4X3VzZWNhc2VfdCA9IGRlY2x0eXBlKGF1ZGlvX3BvcnRfY29uZmlnX21peF9leHQ6OnVzZWNhc2UpOworCisgICAgUGF0Y2hCdWlsZGVyKCkgPSBkZWZhdWx0OworCisgICAgLy8gQWxsIGV4aXN0aW5nIG1ldGhvZHMgb3BlcmF0aW5nIG9uIGF1ZGlvIHBhdGNoZXMgdGFrZSBhIHBvaW50ZXIgdG8gY29uc3QuCisgICAgLy8gSXQncyBPSyB0byBjb25zdHJ1Y3QgYSB0ZW1wb3JhcnkgUGF0Y2hCdWlsZGVyIHdoaWxlIHByZXBhcmluZyBhIHBhcmFtZXRlcgorICAgIC8vIHRvIHN1Y2ggYSBmdW5jdGlvbiBiZWNhdXNlIHRoZSBCdWlsZGVyIHdpbGwgYmUga2VwdCBhbGl2ZSB1bnRpbCB0aGUgY29kZQorICAgIC8vIGV4ZWN1dGlvbiByZWFjaGVzIHRoZSBmdW5jdGlvbiBjYWxsIHN0YXRlbWVudCBzZW1pY29sb24uCisgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoKiBwYXRjaCgpIGNvbnN0IHsgcmV0dXJuICZtUGF0Y2g7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFM+CisgICAgUGF0Y2hCdWlsZGVyJiBhZGRTaW5rKFQmJiB0LCBTJiYuLi4gcykgeworICAgICAgICBzaW5rcygpLmFkZChzdGQ6OmZvcndhcmQ8VD4odCksIHN0ZDo6Zm9yd2FyZDxTPihzKS4uLik7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgLy8gRXhwbGljaXQgdHlwZSBvZiB0aGUgc2Vjb25kIHBhcmFtZXRlciBhbGxvd3MgY2xpZW50cyB0byBwcm92aWRlIHRoZSBzdHJ1Y3QgaW5saW5lLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgUGF0Y2hCdWlsZGVyJiBhZGRTaW5rKFQmJiB0LCBjb25zdCBtaXhfdXNlY2FzZV90JiB1cGRhdGUpIHsKKyAgICAgICAgc2lua3MoKS5hZGQoc3RkOjpmb3J3YXJkPFQ+KHQpLCB1cGRhdGUpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFM+CisgICAgUGF0Y2hCdWlsZGVyJiBhZGRTb3VyY2UoVCYmIHQsIFMmJi4uLiBzKSB7CisgICAgICAgIHNvdXJjZXMoKS5hZGQoc3RkOjpmb3J3YXJkPFQ+KHQpLCBzdGQ6OmZvcndhcmQ8Uz4ocykuLi4pOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIC8vIEV4cGxpY2l0IHR5cGUgb2YgdGhlIHNlY29uZCBwYXJhbWV0ZXIgYWxsb3dzIGNsaWVudHMgdG8gcHJvdmlkZSB0aGUgc3RydWN0IGlubGluZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFBhdGNoQnVpbGRlciYgYWRkU291cmNlKFQmJiB0LCBjb25zdCBtaXhfdXNlY2FzZV90JiB1cGRhdGUpIHsKKyAgICAgICAgc291cmNlcygpLmFkZChzdGQ6OmZvcndhcmQ8VD4odCksIHVwZGF0ZSk7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBzdHJ1Y3QgUG9ydENmZ3MgeworICAgICAgICBQb3J0Q2Zncyh1bnNpZ25lZCBpbnQgKmNvdW50UHRyLCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnBvcnRDZmdzKQorICAgICAgICAgICAgICAgIDogbUNvdW50UHRyKGNvdW50UHRyKSwgbVBvcnRDZmdzKHBvcnRDZmdzKSB7fQorICAgICAgICBhdWRpb19wb3J0X2NvbmZpZyYgYWRkKGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnJiBwb3J0Q2ZnKSB7CisgICAgICAgICAgICByZXR1cm4gKmFkdmFuY2UoKSA9IHBvcnRDZmc7CisgICAgICAgIH0KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgYXVkaW9fcG9ydF9jb25maWcmIGFkZChjb25zdCBzcDxUPiYgZW50aXR5KSB7CisgICAgICAgICAgICBhdWRpb19wb3J0X2NvbmZpZyogYWRkZWQgPSBhZHZhbmNlKCk7CisgICAgICAgICAgICBlbnRpdHktPnRvQXVkaW9Qb3J0Q29uZmlnKGFkZGVkKTsKKyAgICAgICAgICAgIHJldHVybiAqYWRkZWQ7CisgICAgICAgIH0KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgdm9pZCBhZGQoY29uc3Qgc3A8VD4mIGVudGl0eSwgY29uc3QgbWl4X3VzZWNhc2VfdCYgdXNlY2FzZVVwZGF0ZSkgeworICAgICAgICAgICAgYWRkKGVudGl0eSkuZXh0Lm1peC51c2VjYXNlID0gdXNlY2FzZVVwZGF0ZTsKKyAgICAgICAgfQorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgICAgICB2b2lkIGFkZChjb25zdCBzcDxUPiYgZW50aXR5LAorICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248bWl4X3VzZWNhc2VfdChjb25zdCBtaXhfdXNlY2FzZV90Jik+IHVzZWNhc2VVcGRhdGVyKSB7CisgICAgICAgICAgICBtaXhfdXNlY2FzZV90KiB1c2VjYXNlID0gJmFkZChlbnRpdHkpLmV4dC5taXgudXNlY2FzZTsKKyAgICAgICAgICAgICp1c2VjYXNlID0gdXNlY2FzZVVwZGF0ZXIoKnVzZWNhc2UpOworICAgICAgICB9CisgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyogYWR2YW5jZSgpIHsKKyAgICAgICAgICAgIHJldHVybiAmbVBvcnRDZmdzWygqbUNvdW50UHRyKSsrXTsKKyAgICAgICAgfQorICAgICAgICB1bnNpZ25lZCBpbnQgKm1Db3VudFB0cjsKKyAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICptUG9ydENmZ3M7CisgICAgfTsKKworICAgIFBvcnRDZmdzIHNpbmtzKCkgeyByZXR1cm4gUG9ydENmZ3MoJm1QYXRjaC5udW1fc2lua3MsIG1QYXRjaC5zaW5rcyk7IH0KKyAgICBQb3J0Q2ZncyBzb3VyY2VzKCkgeyByZXR1cm4gUG9ydENmZ3MoJm1QYXRjaC5udW1fc291cmNlcywgbVBhdGNoLnNvdXJjZXMpOyB9CisKKyAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggbVBhdGNoID0ge307Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfUEFUQ0hfQlVJTERFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1NpbmdsZVN0YXRlUXVldWUuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvU2luZ2xlU3RhdGVRdWV1ZS5oCmluZGV4IGQ0MjM5NjIuLmMyNzYxY2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvU2luZ2xlU3RhdGVRdWV1ZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvU2luZ2xlU3RhdGVRdWV1ZS5oCkBAIC05OSw2ICs5OSwxMyBAQAogICAgICAgICAgICAgcmV0dXJuIG1TaGFyZWQtPm1BY2sgLSBzZXF1ZW5jZSA+PSAwOwogICAgICAgICB9CiAKKyAgICAgICAgLy8gcmV0dXJucyB0aGUgbGFzdCB2YWx1ZSB3cml0dGVuIChvciB0aGUgY29udGVudHMgb2YgdGhlIHNoYXJlZCBidWZmZXIgYWZ0ZXIgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgLy8gaWYgbm8gdmFsdWUgd2FzIHdyaXR0ZW4pLgorICAgICAgICBUIGxhc3QoKSBjb25zdAorICAgICAgICB7ICAgLy8gYXNzdW1lIG5vIHNlcXVlbmNlIGNoZWNrIHJlcXVpcmVkIC0gd2UgYXJlIHRoZSB3cml0ZXIuCisgICAgICAgICAgICByZXR1cm4gbVNoYXJlZC0+bVZhbHVlOworICAgICAgICB9CisKICAgICBwcml2YXRlOgogICAgICAgICBpbnQzMl90ICAgICBtU2VxdWVuY2U7CiAgICAgICAgIFNoYXJlZCAqIGNvbnN0IG1TaGFyZWQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1R5cGVDb252ZXJ0ZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVHlwZUNvbnZlcnRlci5oCmluZGV4IDg2ZjBkNGMuLjJmOGMyMDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVHlwZUNvbnZlcnRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVHlwZUNvbnZlcnRlci5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHN0cmluZy5oPgogCisjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgpAQCAtMzAsNzcgKzMxLDU1IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IFNhbXBsZVJhdGVUcmFpdHMKLXsKLSAgICB0eXBlZGVmIHVpbnQzMl90IFR5cGU7Ci0gICAgdHlwZWRlZiBTb3J0ZWRWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgRGV2aWNlVHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb19kZXZpY2VzX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBPdXRwdXREZXZpY2VUcmFpdHMgOiBwdWJsaWMgRGV2aWNlVHJhaXRzIHt9Owotc3RydWN0IElucHV0RGV2aWNlVHJhaXRzIDogcHVibGljIERldmljZVRyYWl0cyB7fTsKLXN0cnVjdCBPdXRwdXRGbGFnVHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb19vdXRwdXRfZmxhZ3NfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IElucHV0RmxhZ1RyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9faW5wdXRfZmxhZ3NfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IEZvcm1hdFRyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fZm9ybWF0X3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBDaGFubmVsVHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb19jaGFubmVsX21hc2tfdCBUeXBlOwotICAgIHR5cGVkZWYgU29ydGVkVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IE91dHB1dENoYW5uZWxUcmFpdHMgOiBwdWJsaWMgQ2hhbm5lbFRyYWl0cyB7fTsKLXN0cnVjdCBJbnB1dENoYW5uZWxUcmFpdHMgOiBwdWJsaWMgQ2hhbm5lbFRyYWl0cyB7fTsKLXN0cnVjdCBDaGFubmVsSW5kZXhUcmFpdHMgOiBwdWJsaWMgQ2hhbm5lbFRyYWl0cyB7fTsKLXN0cnVjdCBHYWluTW9kZVRyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fZ2Fpbl9tb2RlX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBTdHJlYW1UcmFpdHMKLXsKLSAgICB0eXBlZGVmIGF1ZGlvX3N0cmVhbV90eXBlX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBBdWRpb01vZGVUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGF1ZGlvX21vZGVfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IEF1ZGlvQ29udGVudFRyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fY29udGVudF90eXBlX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBVc2FnZVRyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fdXNhZ2VfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IFNvdXJjZVRyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fc291cmNlX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogc3RydWN0IERlZmF1bHRUcmFpdHMKIHsKICAgICB0eXBlZGVmIFQgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKKyAgICBzdGF0aWMgdm9pZCBhZGQoQ29sbGVjdGlvbiAmY29sbGVjdGlvbiwgVHlwZSB2YWx1ZSkKKyAgICB7CisgICAgICAgIGNvbGxlY3Rpb24ucHVzaF9iYWNrKHZhbHVlKTsKKyAgICB9CiB9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgVmVjdG9yVHJhaXRzCit7CisgICAgdHlwZWRlZiBUIFR5cGU7CisgICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKKyAgICBzdGF0aWMgdm9pZCBhZGQoQ29sbGVjdGlvbiAmY29sbGVjdGlvbiwgVHlwZSB2YWx1ZSkKKyAgICB7CisgICAgICAgIGNvbGxlY3Rpb24uYWRkKHZhbHVlKTsKKyAgICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgU29ydGVkVmVjdG9yVHJhaXRzCit7CisgICAgdHlwZWRlZiBUIFR5cGU7CisgICAgdHlwZWRlZiBTb3J0ZWRWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKKyAgICBzdGF0aWMgdm9pZCBhZGQoQ29sbGVjdGlvbiAmY29sbGVjdGlvbiwgVHlwZSB2YWx1ZSkKKyAgICB7CisgICAgICAgIGNvbGxlY3Rpb24uYWRkKHZhbHVlKTsKKyAgICB9Cit9OworCit1c2luZyBTYW1wbGVSYXRlVHJhaXRzID0gU29ydGVkVmVjdG9yVHJhaXRzPHVpbnQzMl90PjsKK3VzaW5nIERldmljZVRyYWl0cyA9IERlZmF1bHRUcmFpdHM8YXVkaW9fZGV2aWNlc190PjsKK3N0cnVjdCBPdXRwdXREZXZpY2VUcmFpdHMgOiBwdWJsaWMgRGV2aWNlVHJhaXRzIHt9Oworc3RydWN0IElucHV0RGV2aWNlVHJhaXRzIDogcHVibGljIERldmljZVRyYWl0cyB7fTsKK3VzaW5nIENoYW5uZWxUcmFpdHMgPSBTb3J0ZWRWZWN0b3JUcmFpdHM8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+Oworc3RydWN0IE91dHB1dENoYW5uZWxUcmFpdHMgOiBwdWJsaWMgQ2hhbm5lbFRyYWl0cyB7fTsKK3N0cnVjdCBJbnB1dENoYW5uZWxUcmFpdHMgOiBwdWJsaWMgQ2hhbm5lbFRyYWl0cyB7fTsKK3N0cnVjdCBDaGFubmVsSW5kZXhUcmFpdHMgOiBwdWJsaWMgQ2hhbm5lbFRyYWl0cyB7fTsKK3VzaW5nIElucHV0RmxhZ1RyYWl0cyA9IERlZmF1bHRUcmFpdHM8YXVkaW9faW5wdXRfZmxhZ3NfdD47Cit1c2luZyBPdXRwdXRGbGFnVHJhaXRzID0gRGVmYXVsdFRyYWl0czxhdWRpb19vdXRwdXRfZmxhZ3NfdD47Cit1c2luZyBGb3JtYXRUcmFpdHMgPSBWZWN0b3JUcmFpdHM8YXVkaW9fZm9ybWF0X3Q+OwordXNpbmcgR2Fpbk1vZGVUcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGF1ZGlvX2dhaW5fbW9kZV90PjsKK3VzaW5nIFN0cmVhbVRyYWl0cyA9IERlZmF1bHRUcmFpdHM8YXVkaW9fc3RyZWFtX3R5cGVfdD47Cit1c2luZyBBdWRpb01vZGVUcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGF1ZGlvX21vZGVfdD47Cit1c2luZyBBdWRpb0NvbnRlbnRUcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGF1ZGlvX2NvbnRlbnRfdHlwZV90PjsKK3VzaW5nIFVzYWdlVHJhaXRzID0gRGVmYXVsdFRyYWl0czxhdWRpb191c2FnZV90PjsKK3VzaW5nIFNvdXJjZVRyYWl0cyA9IERlZmF1bHRUcmFpdHM8YXVkaW9fc291cmNlX3Q+Oworc3RydWN0IEF1ZGlvRmxhZ1RyYWl0cyA6IHB1YmxpYyBEZWZhdWx0VHJhaXRzPGF1ZGlvX2ZsYWdzX21hc2tfdD4ge307CiAKIHRlbXBsYXRlIDxjbGFzcyBUcmFpdHM+CiBzdGF0aWMgdm9pZCBjb2xsZWN0aW9uRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCB0eXBlbmFtZSBUcmFpdHM6OkNvbGxlY3Rpb24gJmNvbGxlY3Rpb24sCkBAIC0xMTAsNyArODksNyBAQAogICAgIGZvciAoY29uc3QgY2hhciAqY3N0ciA9IHN0cnRvayhsaXRlcmFsLCBkZWwpOyBjc3RyICE9IE5VTEw7IGNzdHIgPSBzdHJ0b2soTlVMTCwgZGVsKSkgewogICAgICAgICB0eXBlbmFtZSBUcmFpdHM6OlR5cGUgdmFsdWU7CiAgICAgICAgIGlmICh1dGlsaXRpZXM6OmNvbnZlcnRUbzxzdGQ6OnN0cmluZywgdHlwZW5hbWUgVHJhaXRzOjpUeXBlID4oY3N0ciwgdmFsdWUpKSB7Ci0gICAgICAgICAgICBjb2xsZWN0aW9uLmFkZCh2YWx1ZSk7CisgICAgICAgICAgICBUcmFpdHM6OmFkZChjb2xsZWN0aW9uLCB2YWx1ZSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgZnJlZShsaXRlcmFsKTsKQEAgLTE4MSw3ICsxNjAsNyBAQAogICAgIGZvciAoY29uc3QgY2hhciAqY3N0ciA9IHN0cnRvayhsaXRlcmFsLCBkZWwpOyBjc3RyICE9IE5VTEw7IGNzdHIgPSBzdHJ0b2soTlVMTCwgZGVsKSkgewogICAgICAgICB0eXBlbmFtZSBUcmFpdHM6OlR5cGUgdmFsdWU7CiAgICAgICAgIGlmIChmcm9tU3RyaW5nKGNzdHIsIHZhbHVlKSkgewotICAgICAgICAgICAgY29sbGVjdGlvbi5hZGQodmFsdWUpOworICAgICAgICAgICAgVHJhaXRzOjphZGQoY29sbGVjdGlvbiwgdmFsdWUpOwogICAgICAgICB9CiAgICAgfQogICAgIGZyZWUobGl0ZXJhbCk7CkBAIC0yMzQsNiArMjEzLDcgQEAKIHR5cGVkZWYgVHlwZUNvbnZlcnRlcjxBdWRpb0NvbnRlbnRUcmFpdHM+IEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI7CiB0eXBlZGVmIFR5cGVDb252ZXJ0ZXI8VXNhZ2VUcmFpdHM+IFVzYWdlVHlwZUNvbnZlcnRlcjsKIHR5cGVkZWYgVHlwZUNvbnZlcnRlcjxTb3VyY2VUcmFpdHM+IFNvdXJjZVR5cGVDb252ZXJ0ZXI7Cit0eXBlZGVmIFR5cGVDb252ZXJ0ZXI8QXVkaW9GbGFnVHJhaXRzPiBBdWRpb0ZsYWdDb252ZXJ0ZXI7CiAKIHRlbXBsYXRlPD4gY29uc3QgT3V0cHV0RGV2aWNlQ29udmVydGVyOjpUYWJsZSBPdXRwdXREZXZpY2VDb252ZXJ0ZXI6Om1UYWJsZVtdOwogdGVtcGxhdGU8PiBjb25zdCBJbnB1dERldmljZUNvbnZlcnRlcjo6VGFibGUgSW5wdXREZXZpY2VDb252ZXJ0ZXI6Om1UYWJsZVtdOwpAQCAtMjQ5LDExICsyMjksMTAgQEAKIHRlbXBsYXRlPD4gY29uc3QgQXVkaW9Db250ZW50VHlwZUNvbnZlcnRlcjo6VGFibGUgQXVkaW9Db250ZW50VHlwZUNvbnZlcnRlcjo6bVRhYmxlW107CiB0ZW1wbGF0ZTw+IGNvbnN0IFVzYWdlVHlwZUNvbnZlcnRlcjo6VGFibGUgVXNhZ2VUeXBlQ29udmVydGVyOjptVGFibGVbXTsKIHRlbXBsYXRlPD4gY29uc3QgU291cmNlVHlwZUNvbnZlcnRlcjo6VGFibGUgU291cmNlVHlwZUNvbnZlcnRlcjo6bVRhYmxlW107Cit0ZW1wbGF0ZTw+IGNvbnN0IEF1ZGlvRmxhZ0NvbnZlcnRlcjo6VGFibGUgQXVkaW9GbGFnQ29udmVydGVyOjptVGFibGVbXTsKIAogYm9vbCBkZXZpY2VGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBsaXRlcmFsRGV2aWNlLCBhdWRpb19kZXZpY2VzX3QmIGRldmljZSk7CiAKLWJvb2wgZGV2aWNlVG9TdHJpbmcoYXVkaW9fZGV2aWNlc190IGRldmljZSwgc3RkOjpzdHJpbmcmIGxpdGVyYWxEZXZpY2UpOwotCiBTYW1wbGVSYXRlVHJhaXRzOjpDb2xsZWN0aW9uIHNhbXBsaW5nUmF0ZXNGcm9tU3RyaW5nKAogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc2FtcGxpbmdSYXRlcywgY29uc3QgY2hhciAqZGVsID0gQXVkaW9QYXJhbWV0ZXI6OnZhbHVlTGlzdFNlcGFyYXRvcik7CiAKQEAgLTI3NCw2ICsyNTMsNjUgQEAKIE91dHB1dENoYW5uZWxUcmFpdHM6OkNvbGxlY3Rpb24gb3V0cHV0Q2hhbm5lbE1hc2tzRnJvbVN0cmluZygKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm91dENoYW5uZWxzLCBjb25zdCBjaGFyICpkZWwgPSBBdWRpb1BhcmFtZXRlcjo6dmFsdWVMaXN0U2VwYXJhdG9yKTsKIAorLy8gY291bnRpbmcgZW51bWVyYXRpb25zCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc3RkOjplbmFibGVfaWZfdDxzdGQ6OmlzX3NhbWU8VCwgYXVkaW9fY29udGVudF90eXBlX3Q+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RkOjppc19zYW1lPFQsIGF1ZGlvX21vZGVfdD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdGQ6OmlzX3NhbWU8VCwgYXVkaW9fc291cmNlX3Q+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RkOjppc19zYW1lPFQsIGF1ZGlvX3N0cmVhbV90eXBlX3Q+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RkOjppc19zYW1lPFQsIGF1ZGlvX3VzYWdlX3Q+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBpbnQ+ID0gMD4KK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoY29uc3QgVCYgdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworICAgIHJldHVybiBUeXBlQ29udmVydGVyPERlZmF1bHRUcmFpdHM8VD4+Ojp0b1N0cmluZyh2YWx1ZSwgcmVzdWx0KQorICAgICAgICAgICAgPyByZXN1bHQgOiBzdGQ6OnRvX3N0cmluZyhzdGF0aWNfY2FzdDxpbnQ+KHZhbHVlKSk7CisKK30KKworLy8gZmxhZyBlbnVtZXJhdGlvbnMKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBzdGQ6OmVuYWJsZV9pZl90PHN0ZDo6aXNfc2FtZTxULCBhdWRpb19nYWluX21vZGVfdD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdGQ6OmlzX3NhbWU8VCwgYXVkaW9faW5wdXRfZmxhZ3NfdD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdGQ6OmlzX3NhbWU8VCwgYXVkaW9fb3V0cHV0X2ZsYWdzX3Q+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBpbnQ+ID0gMD4KK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoY29uc3QgVCYgdmFsdWUpCit7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworICAgIFR5cGVDb252ZXJ0ZXI8RGVmYXVsdFRyYWl0czxUPj46Om1hc2tUb1N0cmluZyh2YWx1ZSwgcmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGNvbnN0IGF1ZGlvX2RldmljZXNfdCYgZGV2aWNlcykKK3sKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgICAgaWYgKChkZXZpY2VzICYgQVVESU9fREVWSUNFX0JJVF9JTikgIT0gMCkgeworICAgICAgICBJbnB1dERldmljZUNvbnZlcnRlcjo6bWFza1RvU3RyaW5nKGRldmljZXMsIHJlc3VsdCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgT3V0cHV0RGV2aWNlQ29udmVydGVyOjptYXNrVG9TdHJpbmcoZGV2aWNlcywgcmVzdWx0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gVE9ETzogUmVtb3ZlIHdoZW4gRm9ybWF0VHJhaXRzIHVzZXMgRGVmYXVsdFRyYWl0cy4KK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoY29uc3QgYXVkaW9fZm9ybWF0X3QmIGZvcm1hdCkKK3sKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgICAgcmV0dXJuIFR5cGVDb252ZXJ0ZXI8VmVjdG9yVHJhaXRzPGF1ZGlvX2Zvcm1hdF90Pj46OnRvU3RyaW5nKGZvcm1hdCwgcmVzdWx0KQorICAgICAgICAgICAgPyByZXN1bHQgOiBzdGQ6OnRvX3N0cmluZyhzdGF0aWNfY2FzdDxpbnQ+KGZvcm1hdCkpOworfQorCitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcykKK3sKKyAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gcmVzdWx0OworICAgIHJlc3VsdCA8PCAieyBDb250ZW50IHR5cGU6ICIgPDwgdG9TdHJpbmcoYXR0cmlidXRlcy5jb250ZW50X3R5cGUpCisgICAgICAgICAgIDw8ICIgVXNhZ2U6ICIgPDwgdG9TdHJpbmcoYXR0cmlidXRlcy51c2FnZSkKKyAgICAgICAgICAgPDwgIiBTb3VyY2U6ICIgPDwgdG9TdHJpbmcoYXR0cmlidXRlcy5zb3VyY2UpCisgICAgICAgICAgIDw8IHN0ZDo6aGV4IDw8ICIgRmxhZ3M6IDB4IiA8PCBhdHRyaWJ1dGVzLmZsYWdzCisgICAgICAgICAgIDw8IHN0ZDo6ZGVjIDw8ICIgVGFnczogIiA8PCBhdHRyaWJ1dGVzLnRhZ3MKKyAgICAgICAgICAgPDwgIiB9IjsKKworICAgIHJldHVybiByZXN1bHQuc3RyKCk7Cit9CisKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLypBTkRST0lEX1RZUEVfQ09OVkVSVEVSX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmgKaW5kZXggY2RlZjYzNy4uZDI5ZTk3ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmgKQEAgLTY4LDYgKzY4LDExIEBACiAgICAgTUVUQURBVEFfS0VZX1ZJREVPX0ZSQU1FX0NPVU5UICA9IDMyLAogICAgIE1FVEFEQVRBX0tFWV9FWElGX09GRlNFVCAgICAgPSAzMywKICAgICBNRVRBREFUQV9LRVlfRVhJRl9MRU5HVEggICAgID0gMzQsCisgICAgTUVUQURBVEFfS0VZX0NPTE9SX1NUQU5EQVJEICA9IDM1LAorICAgIE1FVEFEQVRBX0tFWV9DT0xPUl9UUkFOU0ZFUiAgPSAzNiwKKyAgICBNRVRBREFUQV9LRVlfQ09MT1JfUkFOR0UgICAgID0gMzcsCisgICAgTUVUQURBVEFfS0VZX1NBTVBMRVJBVEUgICAgICA9IDM4LAorICAgIE1FVEFEQVRBX0tFWV9CSVRTX1BFUl9TQU1QTEUgPSAzOSwKIAogICAgIC8vIEFkZCBtb3JlIGhlcmUuLi4KIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oCmluZGV4IGQ4YjBmZTcuLjJkZDRiN2YgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oCkBAIC02Nyw3ICs2Nyw3IEBACiAgICAgT1VUUFVUX0ZPUk1BVF9BQUNfQURUUyA9IDYsCiAKICAgICBPVVRQVVRfRk9STUFUX0FVRElPX09OTFlfRU5EID0gNywgLy8gVXNlZCBpbiB2YWxpZGF0aW5nIHRoZSBvdXRwdXQgZm9ybWF0LiAgU2hvdWxkIGJlIHRoZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgYXQgdGhlIGVuZCBvZiB0aGUgYXVkaW8gb25seSBvdXRwdXQgZm9ybWF0cy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXQgdGhlIGVuZCBvZiB0aGUgYXVkaW8gb25seSBvdXRwdXQgZm9ybWF0cy4KIAogICAgIC8qIFN0cmVhbSBvdmVyIGEgc29ja2V0LCBsaW1pdGVkIHRvIGEgc2luZ2xlIHN0cmVhbSAqLwogICAgIE9VVFBVVF9GT1JNQVRfUlRQX0FWUCA9IDcsCkBAIC04MSw2ICs4MSw5IEBACiAgICAgLyogSEVJQyBkYXRhIGluIGEgSEVJRiBjb250YWluZXIgKi8KICAgICBPVVRQVVRfRk9STUFUX0hFSUYgPSAxMCwKIAorICAgIC8qIE9wdXMgZGF0YSBpbiBhIE9HRyBjb250YWluZXIgKi8KKyAgICBPVVRQVVRfRk9STUFUX09HRyA9IDExLAorCiAgICAgT1VUUFVUX0ZPUk1BVF9MSVNUX0VORCAvLyBtdXN0IGJlIGxhc3QgLSB1c2VkIHRvIHZhbGlkYXRlIGZvcm1hdCB0eXBlCiB9OwogCkBAIC05Miw2ICs5NSw3IEBACiAgICAgQVVESU9fRU5DT0RFUl9IRV9BQUMgPSA0LAogICAgIEFVRElPX0VOQ09ERVJfQUFDX0VMRCA9IDUsCiAgICAgQVVESU9fRU5DT0RFUl9WT1JCSVMgPSA2LAorICAgIEFVRElPX0VOQ09ERVJfT1BVUyA9IDcsCiAKICAgICBBVURJT19FTkNPREVSX0xJU1RfRU5EIC8vIG11c3QgYmUgdGhlIGxhc3QgLSB1c2VkIHRvIHZhbGlkYXRlIHRoZSBhdWRpbyBlbmNvZGVyIHR5cGUKIH07CkBAIC0xMTEsOSArMTE1LDYgQEAKICAqIFRoZSBzdGF0ZSBtYWNoaW5lIG9mIHRoZSBtZWRpYV9yZWNvcmRlci4KICAqLwogZW51bSBtZWRpYV9yZWNvcmRlcl9zdGF0ZXMgewotICAgIC8vIEVycm9yIHN0YXRlLgotICAgIE1FRElBX1JFQ09SREVSX0VSUk9SICAgICAgICAgICAgICAgICA9ICAgICAgMCwKLQogICAgIC8vIFJlY29yZGVyIHdhcyBqdXN0IGNyZWF0ZWQuCiAgICAgTUVESUFfUkVDT1JERVJfSURMRSAgICAgICAgICAgICAgICAgID0gMSA8PCAwLAogCkBAIC0xMjgsNiArMTI5LDkgQEAKIAogICAgIC8vIFJlY29yZGluZyBpcyBpbiBwcm9ncmVzcy4KICAgICBNRURJQV9SRUNPUkRFUl9SRUNPUkRJTkcgICAgICAgICAgICAgPSAxIDw8IDQsCisKKyAgICAvLyBFcnJvciBzdGF0ZS4KKyAgICBNRURJQV9SRUNPUkRFUl9FUlJPUiAgICAgICAgICAgICAgICAgPSAxIDw8IDUsCiB9OwogCiAvLyBUaGUgIm1zZyIgY29kZSBwYXNzZWQgdG8gdGhlIGxpc3RlbmVyIGluIG5vdGlmeS4KQEAgLTI2MCw2ICsyNjQsMTAgQEAKICAgICBzdGF0dXNfdCAgICBnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90ICpkZXZpY2VJZCk7CiAgICAgc3RhdHVzX3QgICAgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpOwogICAgIHN0YXR1c190ICAgIGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKTsKKyAgICBzdGF0dXNfdCAgICBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKTsKKyAgICBzdGF0dXNfdCAgICBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSk7CisKKyAgICBzdGF0dXNfdCAgICBnZXRQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSBjb25zdDsKIAogcHJpdmF0ZToKICAgICB2b2lkICAgICAgICAgICAgICAgICAgICBkb0NsZWFuVXAoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9Db252ZXJzaW9uLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvQ29udmVyc2lvbi5oCmluZGV4IDM3MDBhMjMuLjgwZThmM2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9Db252ZXJzaW9uLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL0NvbnZlcnNpb24uaApAQCAtMTQsOCArMTQsOCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX09NWF9WMV8wX19DT05WRVJTSU9OX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9PTVhfVjFfMF9fQ09OVkVSU0lPTl9ICisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfT01YX1YxXzBfVVRJTFNfQ09OVkVSU0lPTl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfT01YX1YxXzBfVVRJTFNfQ09OVkVSU0lPTl9ICiAKICNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8bGlzdD4KQEAgLTMxLDEyICszMSwxMiBAQAogI2luY2x1ZGUgPHVpL0ZlbmNlVGltZS5oPgogI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CiAKKyNpbmNsdWRlIDx1aS9CdWZmZXJRdWV1ZURlZnMuaD4KICNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvT01YRmVuY2VQYXJjZWxhYmxlLmg+CiAjaW5jbHVkZSA8bWVkaWEvT01YQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvdHlwZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teC5oPgpAQCAtMjU4LDcgKzI1OCwxMiBAQAogICovCiAvLyBjb252ZXJ0OiBTdGF0dXMgLT4gc3RhdHVzX3QKIGlubGluZSBzdGF0dXNfdCB0b1N0YXR1c1QoUmV0dXJuPFN0YXR1cz4gY29uc3QmIHQpIHsKLSAgICByZXR1cm4gdC5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdGljX2Nhc3Q8U3RhdHVzPih0KSkgOiBVTktOT1dOX0VSUk9SOworICAgIGlmICh0LmlzT2soKSkgeworICAgICAgICByZXR1cm4gdG9TdGF0dXNUKHN0YXRpY19jYXN0PFN0YXR1cz4odCkpOworICAgIH0gZWxzZSBpZiAodC5pc0RlYWRPYmplY3QoKSkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogfQogCiAvKioKQEAgLTI4Miw4ICsyODcsOCBAQAogICAgIGNhc2UgVElNRURfT1VUOgogICAgIGNhc2UgRVJST1JfVU5TVVBQT1JURUQ6CiAgICAgY2FzZSBVTktOT1dOX0VSUk9SOgotICAgIGNhc2UgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UkVMRUFTRV9BTExfQlVGRkVSUzoKLSAgICBjYXNlIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkJVRkZFUl9ORUVEU19SRUFMTE9DQVRJT046CisgICAgY2FzZSBCdWZmZXJRdWV1ZURlZnM6OlJFTEVBU0VfQUxMX0JVRkZFUlM6CisgICAgY2FzZSBCdWZmZXJRdWV1ZURlZnM6OkJVRkZFUl9ORUVEU19SRUFMTE9DQVRJT046CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdGF0dXM+KGwpOwogICAgIGNhc2UgTk9UX0VOT1VHSF9EQVRBOgogICAgICAgICByZXR1cm4gU3RhdHVzOjpCVUZGRVJfTkVFRFNfUkVBTExPQ0FUSU9OOwpAQCAtOTM4LDQgKzk0Myw0IEBACiB9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKLSNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9PTVhfVjFfMF9fQ09OVkVSU0lPTl9ICisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfT01YX1YxXzBfVVRJTFNfQ09OVkVSU0lPTl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teC5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXguaAppbmRleCBmMTM1NDZlLi4wNjgwZWVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teC5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214LmgKQEAgLTQ3LDcgKzQ3LDYgQEAKIAogdXNpbmcgOjphbmRyb2lkOjpMaXN0OwogdXNpbmcgOjphbmRyb2lkOjpJT01YOwotdXNpbmcgOjphbmRyb2lkOjpCbk9NWDsKIAogLyoqCiAgKiBXcmFwcGVyIGNsYXNzZXMgZm9yIGNvbnZlcnNpb24KQEAgLTU4LDcgKzU3LDcgQEAKICAqIC0gVFcgPSBUcmVibGUgV3JhcHBlciAtLS0gSXQgd3JhcHMgYSBsZWdhY3kgb2JqZWN0IGluc2lkZSBhIFRyZWJsZSBvYmplY3QuCiAgKi8KIAotc3RydWN0IExXT214IDogcHVibGljIEJuT01YIHsKK3N0cnVjdCBMV09teCA6IHB1YmxpYyBJT01YIHsKICAgICBzcDxJT214PiBtQmFzZTsKICAgICBMV09teChzcDxJT214PiBjb25zdCYgYmFzZSk7CiAgICAgc3RhdHVzX3QgbGlzdE5vZGVzKExpc3Q8SU9NWDo6Q29tcG9uZW50SW5mbz4qIGxpc3QpIG92ZXJyaWRlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhOb2RlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teE5vZGUuaAppbmRleCBlZWJjOGM2Li4xZGI0MjQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teE5vZGUuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teE5vZGUuaApAQCAtNTksNyArNTksNyBAQAogICogLSBUVyA9IFRyZWJsZSBXcmFwcGVyIC0tLSBJdCB3cmFwcyBhIGxlZ2FjeSBvYmplY3QgaW5zaWRlIGEgVHJlYmxlIG9iamVjdC4KICAqLwogCi1zdHJ1Y3QgTFdPbXhOb2RlIDogcHVibGljIEgyQkNvbnZlcnRlcjxJT214Tm9kZSwgSU9NWE5vZGUsIEJuT01YTm9kZT4geworc3RydWN0IExXT214Tm9kZSA6IHB1YmxpYyBIMkJDb252ZXJ0ZXI8SU9teE5vZGUsIEJuT01YTm9kZT4gewogICAgIExXT214Tm9kZShzcDxJT214Tm9kZT4gY29uc3QmIGJhc2UpIDogQ0Jhc2UoYmFzZSkge30KICAgICBzdGF0dXNfdCBmcmVlTm9kZSgpIG92ZXJyaWRlOwogICAgIHN0YXR1c190IHNlbmRDb21tYW5kKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcAppbmRleCA3MjFhMDQzLi40NTcwYWY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9tZWRpYXJlY29yZGVyLmNwcApAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgpAQCAtNTk3LDcgKzU5OCw4IEBACiAgICAgICAgICAgICBpZiAoT0sgIT0gcmV0KSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsgIC8vIE5vIG5lZWQgdG8gY29udGludWUKICAgICAgICAgICAgIH0KLSAgICAgICAgfSAgLy8gSW50ZW50aW9uYWwgZmFsbCB0aHJvdWdoCisgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKKyAgICAgICAgfQogICAgICAgICBjYXNlIE1FRElBX1JFQ09SREVSX0lOSVRJQUxJWkVEOgogICAgICAgICAgICAgcmV0ID0gY2xvc2UoKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtODQwLDQgKzg0MiwyNSBAQAogICAgIHJldHVybiBtTWVkaWFSZWNvcmRlci0+Z2V0QWN0aXZlTWljcm9waG9uZXMoYWN0aXZlTWljcm9waG9uZXMpOwogfQogCitzdGF0dXNfdCBNZWRpYVJlY29yZGVyOjpzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSB7CisgICAgQUxPR1YoInNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oJWQpIiwgZGlyZWN0aW9uKTsKKyAgICByZXR1cm4gbU1lZGlhUmVjb3JkZXItPnNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oZGlyZWN0aW9uKTsKK30KKworc3RhdHVzX3QgTWVkaWFSZWNvcmRlcjo6c2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pIHsKKyAgICBBTE9HVigic2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKCVmKSIsIHpvb20pOworICAgIHJldHVybiBtTWVkaWFSZWNvcmRlci0+c2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKHpvb20pOworfQorCitzdGF0dXNfdCBNZWRpYVJlY29yZGVyOjpnZXRQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSBjb25zdAoreworICAgIEFMT0dWKCJnZXRQb3J0SWQiKTsKKworICAgIGlmIChtTWVkaWFSZWNvcmRlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJtZWRpYSByZWNvcmRlciBpcyBub3QgaW5pdGlhbGl6ZWQgeWV0Iik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgcmV0dXJuIG1NZWRpYVJlY29yZGVyLT5nZXRQb3J0SWQocG9ydElkKTsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmNwcAppbmRleCAzMWQxZGY5Li4xZWQxZDA3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmNwcApAQCAtMzIsNyArMzIsNyBAQAogCiBCblN0YXR1cyBMV0dyYXBoaWNCdWZmZXJTb3VyY2U6OmNvbmZpZ3VyZSgKICAgICAgICAgY29uc3Qgc3A8SU9NWE5vZGU+JiBvbXhOb2RlLCBpbnQzMl90IGRhdGFTcGFjZSkgewotICAgIHNwPElPbXhOb2RlPiBoT214Tm9kZSA9IG9teE5vZGUtPmdldEhhbEludGVyZmFjZSgpOworICAgIHNwPElPbXhOb2RlPiBoT214Tm9kZSA9IG9teE5vZGUtPmdldEhhbEludGVyZmFjZTxJT214Tm9kZT4oKTsKICAgICByZXR1cm4gdG9CaW5kZXJTdGF0dXMobUJhc2UtPmNvbmZpZ3VyZSgKICAgICAgICAgICAgIGhPbXhOb2RlID09IG51bGxwdHIgPyBuZXcgVFdPbXhOb2RlKG9teE5vZGUpIDogaE9teE5vZGUsCiAgICAgICAgICAgICB0b0hhcmR3YXJlRGF0YXNwYWNlKGRhdGFTcGFjZSkpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL3hzZC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWEveHNkL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTYzNWY3MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL3hzZC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjEgQEAKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisKK3hzZF9jb25maWcgeworICAgIG5hbWU6ICJtZWRpYV9wcm9maWxlcyIsCisgICAgc3JjczogWyJtZWRpYV9wcm9maWxlcy54c2QiXSwKKyAgICBwYWNrYWdlX25hbWU6ICJtZWRpYS5wcm9maWxlcyIsCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS94c2QvYXBpL2N1cnJlbnQudHh0IGIvbWVkaWEvbGlibWVkaWEveHNkL2FwaS9jdXJyZW50LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43M2I1ZjhkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEveHNkL2FwaS9jdXJyZW50LnR4dApAQCAtMCwwICsxLDE0NyBAQAorLy8gU2lnbmF0dXJlIGZvcm1hdDogMi4wCitwYWNrYWdlIG1lZGlhLnByb2ZpbGVzIHsKKworICBwdWJsaWMgY2xhc3MgQXVkaW8geworICAgIGN0b3IgcHVibGljIEF1ZGlvKCk7CisgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0Qml0UmF0ZSgpOworICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldENoYW5uZWxzKCk7CisgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0Q29kZWMoKTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRTYW1wbGVSYXRlKCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldEJpdFJhdGUoaW50KTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0Q2hhbm5lbHMoaW50KTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0Q29kZWMoU3RyaW5nKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0U2FtcGxlUmF0ZShpbnQpOworICB9CisKKyAgcHVibGljIGNsYXNzIEF1ZGlvRGVjb2RlckNhcCB7CisgICAgY3RvciBwdWJsaWMgQXVkaW9EZWNvZGVyQ2FwKCk7CisgICAgbWV0aG9kIHB1YmxpYyBib29sZWFuIGdldEVuYWJsZWQoKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXROYW1lKCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbik7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nKTsKKyAgfQorCisgIHB1YmxpYyBjbGFzcyBBdWRpb0VuY29kZXJDYXAgeworICAgIGN0b3IgcHVibGljIEF1ZGlvRW5jb2RlckNhcCgpOworICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBnZXRFbmFibGVkKCk7CisgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0TWF4Qml0UmF0ZSgpOworICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldE1heENoYW5uZWxzKCk7CisgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0TWF4U2FtcGxlUmF0ZSgpOworICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldE1pbkJpdFJhdGUoKTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRNaW5DaGFubmVscygpOworICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldE1pblNhbXBsZVJhdGUoKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXROYW1lKCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoYm9vbGVhbik7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldE1heEJpdFJhdGUoaW50KTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0TWF4Q2hhbm5lbHMoaW50KTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0TWF4U2FtcGxlUmF0ZShpbnQpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRNaW5CaXRSYXRlKGludCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldE1pbkNoYW5uZWxzKGludCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldE1pblNhbXBsZVJhdGUoaW50KTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcpOworICB9CisKKyAgcHVibGljIGNsYXNzIENhbWNvcmRlclByb2ZpbGVzIHsKKyAgICBjdG9yIHB1YmxpYyBDYW1jb3JkZXJQcm9maWxlcygpOworICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldENhbWVyYUlkKCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxtZWRpYS5wcm9maWxlcy5FbmNvZGVyUHJvZmlsZT4gZ2V0RW5jb2RlclByb2ZpbGVfb3B0aW9uYWwoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLnByb2ZpbGVzLkNhbWNvcmRlclByb2ZpbGVzLkltYWdlRGVjb2RpbmdPcHRpb25hbD4gZ2V0SW1hZ2VEZWNvZGluZ19vcHRpb25hbCgpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEucHJvZmlsZXMuQ2FtY29yZGVyUHJvZmlsZXMuSW1hZ2VFbmNvZGluZ09wdGlvbmFsPiBnZXRJbWFnZUVuY29kaW5nX29wdGlvbmFsKCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldENhbWVyYUlkKGludCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIENhbWNvcmRlclByb2ZpbGVzLkltYWdlRGVjb2RpbmdPcHRpb25hbCB7CisgICAgY3RvciBwdWJsaWMgQ2FtY29yZGVyUHJvZmlsZXMuSW1hZ2VEZWNvZGluZ09wdGlvbmFsKCk7CisgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0TWVtQ2FwKCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldE1lbUNhcChpbnQpOworICB9CisKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBDYW1jb3JkZXJQcm9maWxlcy5JbWFnZUVuY29kaW5nT3B0aW9uYWwgeworICAgIGN0b3IgcHVibGljIENhbWNvcmRlclByb2ZpbGVzLkltYWdlRW5jb2RpbmdPcHRpb25hbCgpOworICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldFF1YWxpdHkoKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0UXVhbGl0eShpbnQpOworICB9CisKKyAgcHVibGljIGNsYXNzIEVuY29kZXJQcm9maWxlIHsKKyAgICBjdG9yIHB1YmxpYyBFbmNvZGVyUHJvZmlsZSgpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEucHJvZmlsZXMuQXVkaW8+IGdldEF1ZGlvKCk7CisgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0RHVyYXRpb24oKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXRGaWxlRm9ybWF0KCk7CisgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0UXVhbGl0eSgpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEucHJvZmlsZXMuVmlkZW8+IGdldFZpZGVvKCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldER1cmF0aW9uKGludCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldEZpbGVGb3JtYXQoU3RyaW5nKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0UXVhbGl0eShTdHJpbmcpOworICB9CisKKyAgcHVibGljIGNsYXNzIE1lZGlhU2V0dGluZ3MgeworICAgIGN0b3IgcHVibGljIE1lZGlhU2V0dGluZ3MoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLnByb2ZpbGVzLkF1ZGlvRGVjb2RlckNhcD4gZ2V0QXVkaW9EZWNvZGVyQ2FwKCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxtZWRpYS5wcm9maWxlcy5BdWRpb0VuY29kZXJDYXA+IGdldEF1ZGlvRW5jb2RlckNhcCgpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEucHJvZmlsZXMuQ2FtY29yZGVyUHJvZmlsZXM+IGdldENhbWNvcmRlclByb2ZpbGVzKCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxtZWRpYS5wcm9maWxlcy5NZWRpYVNldHRpbmdzLkVuY29kZXJPdXRwdXRGaWxlRm9ybWF0PiBnZXRFbmNvZGVyT3V0cHV0RmlsZUZvcm1hdCgpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEucHJvZmlsZXMuVmlkZW9EZWNvZGVyQ2FwPiBnZXRWaWRlb0RlY29kZXJDYXAoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLnByb2ZpbGVzLlZpZGVvRW5jb2RlckNhcD4gZ2V0VmlkZW9FbmNvZGVyQ2FwKCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGNsYXNzIE1lZGlhU2V0dGluZ3MuRW5jb2Rlck91dHB1dEZpbGVGb3JtYXQgeworICAgIGN0b3IgcHVibGljIE1lZGlhU2V0dGluZ3MuRW5jb2Rlck91dHB1dEZpbGVGb3JtYXQoKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXROYW1lKCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nKTsKKyAgfQorCisgIHB1YmxpYyBjbGFzcyBWaWRlbyB7CisgICAgY3RvciBwdWJsaWMgVmlkZW8oKTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRCaXRSYXRlKCk7CisgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0Q29kZWMoKTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRGcmFtZVJhdGUoKTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRIZWlnaHQoKTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRXaWR0aCgpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRCaXRSYXRlKGludCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldENvZGVjKFN0cmluZyk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldEZyYW1lUmF0ZShpbnQpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRIZWlnaHQoaW50KTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0V2lkdGgoaW50KTsKKyAgfQorCisgIHB1YmxpYyBjbGFzcyBWaWRlb0RlY29kZXJDYXAgeworICAgIGN0b3IgcHVibGljIFZpZGVvRGVjb2RlckNhcCgpOworICAgIG1ldGhvZCBwdWJsaWMgYm9vbGVhbiBnZXRFbmFibGVkKCk7CisgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4pOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyk7CisgIH0KKworICBwdWJsaWMgY2xhc3MgVmlkZW9FbmNvZGVyQ2FwIHsKKyAgICBjdG9yIHB1YmxpYyBWaWRlb0VuY29kZXJDYXAoKTsKKyAgICBtZXRob2QgcHVibGljIGJvb2xlYW4gZ2V0RW5hYmxlZCgpOworICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldE1heEJpdFJhdGUoKTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRNYXhGcmFtZUhlaWdodCgpOworICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldE1heEZyYW1lUmF0ZSgpOworICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldE1heEZyYW1lV2lkdGgoKTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRNaW5CaXRSYXRlKCk7CisgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0TWluRnJhbWVIZWlnaHQoKTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRNaW5GcmFtZVJhdGUoKTsKKyAgICBtZXRob2QgcHVibGljIGludCBnZXRNaW5GcmFtZVdpZHRoKCk7CisgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKGJvb2xlYW4pOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRNYXhCaXRSYXRlKGludCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldE1heEZyYW1lSGVpZ2h0KGludCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldE1heEZyYW1lUmF0ZShpbnQpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRNYXhGcmFtZVdpZHRoKGludCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldE1pbkJpdFJhdGUoaW50KTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0TWluRnJhbWVIZWlnaHQoaW50KTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0TWluRnJhbWVSYXRlKGludCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldE1pbkZyYW1lV2lkdGgoaW50KTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcpOworICB9CisKKyAgcHVibGljIGNsYXNzIFhtbFBhcnNlciB7CisgICAgY3RvciBwdWJsaWMgWG1sUGFyc2VyKCk7CisgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgbWVkaWEucHJvZmlsZXMuTWVkaWFTZXR0aW5ncyByZWFkKGphdmEuaW8uSW5wdXRTdHJlYW0pIHRocm93cyBqYXZheC54bWwuZGF0YXR5cGUuRGF0YXR5cGVDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uLCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOworICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIFN0cmluZyByZWFkVGV4dChvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKKyAgICBtZXRob2QgcHVibGljIHN0YXRpYyB2b2lkIHNraXAob3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlcikgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24sIG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CisgIH0KKworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb21tb25fdGltZS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvbGlibWVkaWEveHNkL2FwaS9sYXN0X2N1cnJlbnQudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvY29tbW9uX3RpbWUvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpjb3B5IHRvIG1lZGlhL2xpYm1lZGlhL3hzZC9hcGkvbGFzdF9jdXJyZW50LnR4dApkaWZmIC0tZ2l0IGEvbWVkaWEvY29tbW9uX3RpbWUvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2xpYm1lZGlhL3hzZC9hcGkvbGFzdF9yZW1vdmVkLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2NvbW1vbl90aW1lL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKY29weSB0byBtZWRpYS9saWJtZWRpYS94c2QvYXBpL2xhc3RfcmVtb3ZlZC50eHQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL3hzZC9hcGkvcmVtb3ZlZC50eHQgYi9tZWRpYS9saWJtZWRpYS94c2QvYXBpL3JlbW92ZWQudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MDIxNzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS94c2QvYXBpL3JlbW92ZWQudHh0CkBAIC0wLDAgKzEgQEAKKy8vIFNpZ25hdHVyZSBmb3JtYXQ6IDIuMApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEveHNkL21lZGlhX3Byb2ZpbGVzLnhzZCBiL21lZGlhL2xpYm1lZGlhL3hzZC9tZWRpYV9wcm9maWxlcy54c2QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY2NDQ1NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL3hzZC9tZWRpYV9wcm9maWxlcy54c2QKQEAgLTAsMCArMSwxMDUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tIFRPRE86IGRlZmluZSBhIHRhcmdldE5hbWVzcGFjZS4gTm90ZSB0aGF0IGl0IHdpbGwgYnJlYWsgcmV0cm9jb21wYXRpYmlsaXR5IC0tPgorPHhzOnNjaGVtYSB2ZXJzaW9uPSIyLjAiCisgICAgICAgICAgIGVsZW1lbnRGb3JtRGVmYXVsdD0icXVhbGlmaWVkIgorICAgICAgICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCisgICAgICAgICAgIHhtbG5zOnhzPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSI+CisgICAgPHhzOmVsZW1lbnQgbmFtZT0iTWVkaWFTZXR0aW5ncyI+CisgICAgICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJDYW1jb3JkZXJQcm9maWxlcyIgdHlwZT0iQ2FtY29yZGVyUHJvZmlsZXMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJFbmNvZGVyT3V0cHV0RmlsZUZvcm1hdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgPC94czplbGVtZW50PgorICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IlZpZGVvRW5jb2RlckNhcCIgdHlwZT0iVmlkZW9FbmNvZGVyQ2FwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQXVkaW9FbmNvZGVyQ2FwIiB0eXBlPSJBdWRpb0VuY29kZXJDYXAiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJWaWRlb0RlY29kZXJDYXAiIHR5cGU9IlZpZGVvRGVjb2RlckNhcCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkF1ZGlvRGVjb2RlckNhcCIgdHlwZT0iQXVkaW9EZWNvZGVyQ2FwIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgICAgICA8L3hzOnNlcXVlbmNlPgorICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDwveHM6ZWxlbWVudD4KKyAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQ2FtY29yZGVyUHJvZmlsZXMiPgorICAgICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRW5jb2RlclByb2ZpbGUiIHR5cGU9IkVuY29kZXJQcm9maWxlIi8+CisgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJbWFnZUVuY29kaW5nIj4KKyAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+CisgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icXVhbGl0eSIgdHlwZT0ieHM6aW50Ii8+CisgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KKyAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkltYWdlRGVjb2RpbmciPgorICAgICAgICAgICAgICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtZW1DYXAiIHR5cGU9InhzOmludCIvPgorICAgICAgICAgICAgICAgIDwveHM6Y29tcGxleFR5cGU+CisgICAgICAgICAgICA8L3hzOmVsZW1lbnQ+CisgICAgICAgIDwveHM6Y2hvaWNlPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNhbWVyYUlkIiB0eXBlPSJ4czppbnQiLz4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJFbmNvZGVyUHJvZmlsZSI+CisgICAgICAgIDx4czpzZXF1ZW5jZT4KKyAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IlZpZGVvIiB0eXBlPSJWaWRlbyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQXVkaW8iIHR5cGU9IkF1ZGlvIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDwveHM6c2VxdWVuY2U+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icXVhbGl0eSIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZmlsZUZvcm1hdCIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZHVyYXRpb24iIHR5cGU9InhzOmludCIvPgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlZpZGVvIj4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJjb2RlYyIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iYml0UmF0ZSIgdHlwZT0ieHM6aW50Ii8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0id2lkdGgiIHR5cGU9InhzOmludCIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImhlaWdodCIgdHlwZT0ieHM6aW50Ii8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZnJhbWVSYXRlIiB0eXBlPSJ4czppbnQiLz4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJBdWRpbyI+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY29kZWMiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImJpdFJhdGUiIHR5cGU9InhzOmludCIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNhbXBsZVJhdGUiIHR5cGU9InhzOmludCIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImNoYW5uZWxzIiB0eXBlPSJ4czppbnQiLz4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJWaWRlb0VuY29kZXJDYXAiPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVuYWJsZWQiIHR5cGU9InhzOmJvb2xlYW4iLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW5CaXRSYXRlIiB0eXBlPSJ4czppbnQiLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXhCaXRSYXRlIiB0eXBlPSJ4czppbnQiLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW5GcmFtZVdpZHRoIiB0eXBlPSJ4czppbnQiLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXhGcmFtZVdpZHRoIiB0eXBlPSJ4czppbnQiLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW5GcmFtZUhlaWdodCIgdHlwZT0ieHM6aW50Ii8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWF4RnJhbWVIZWlnaHQiIHR5cGU9InhzOmludCIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1pbkZyYW1lUmF0ZSIgdHlwZT0ieHM6aW50Ii8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWF4RnJhbWVSYXRlIiB0eXBlPSJ4czppbnQiLz4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJBdWRpb0VuY29kZXJDYXAiPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVuYWJsZWQiIHR5cGU9InhzOmJvb2xlYW4iLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW5CaXRSYXRlIiB0eXBlPSJ4czppbnQiLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXhCaXRSYXRlIiB0eXBlPSJ4czppbnQiLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW5TYW1wbGVSYXRlIiB0eXBlPSJ4czppbnQiLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtYXhTYW1wbGVSYXRlIiB0eXBlPSJ4czppbnQiLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW5DaGFubmVscyIgdHlwZT0ieHM6aW50Ii8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWF4Q2hhbm5lbHMiIHR5cGU9InhzOmludCIvPgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlZpZGVvRGVjb2RlckNhcCI+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZW5hYmxlZCIgdHlwZT0ieHM6Ym9vbGVhbiIvPgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkF1ZGlvRGVjb2RlckNhcCI+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZW5hYmxlZCIgdHlwZT0ieHM6Ym9vbGVhbiIvPgorICAgIDwveHM6Y29tcGxleFR5cGU+Cis8L3hzOnNjaGVtYT4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL3hzZC92dHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhL3hzZC92dHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTkwYTEyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEveHNkL3Z0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzMgQEAKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJ2dHNfbWVkaWFQcm9maWxlc192YWxpZGF0ZV90ZXN0IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJWYWxpZGF0ZU1lZGlhUHJvZmlsZXMuY3BwIgorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uLnRlc3QudXRpbGl0eSIsCisgICAgICAgICJsaWJ4bWwyIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEveHNkL3Z0cy9BbmRyb2lkLm1rIGIvbWVkaWEvbGlibWVkaWEveHNkL3Z0cy9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyYzM3NzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS94c2QvdnRzL0FuZHJvaWQubWsKQEAgLTAsMCArMSwyMiBAQAorIworIyBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfTU9EVUxFIDo9IFZ0c1ZhbGlkYXRlTWVkaWFQcm9maWxlcworaW5jbHVkZSB0ZXN0L3Z0cy90b29scy9idWlsZC9BbmRyb2lkLmhvc3RfY29uZmlnLm1rCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS94c2QvdnRzL0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2xpYm1lZGlhL3hzZC92dHMvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ODcyMWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS94c2QvdnRzL0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDMwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IkNvbmZpZyBmb3IgVlRTIFZ0c1ZhbGlkYXRlTWVkaWFQcm9maWxlcy4iPgorICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0icGxhbiIgdmFsdWU9InZ0cy10cmVibGUiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5WdHNGaWxlUHVzaGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJhYm9ydC1vbi1wdXNoLWZhaWx1cmUiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZ3JvdXAiIHZhbHVlPSJIb3N0RHJpdmVuVGVzdC5wdXNoIi8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IkRBVEEvZXRjL21lZGlhX3Byb2ZpbGVzLnhzZC0+L2RhdGEvbG9jYWwvdG1wL21lZGlhX3Byb2ZpbGVzLnhzZCIvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5WdHNNdWx0aURldmljZVRlc3QiPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtbW9kdWxlLW5hbWUiIHZhbHVlPSJWdHNWYWxpZGF0ZU1lZGlhUHJvZmlsZXMiLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJiaW5hcnktdGVzdC1zb3VyY2UiIHZhbHVlPSJfMzJiaXQ6OkRBVEEvbmF0aXZldGVzdC92dHNfbWVkaWFQcm9maWxlc192YWxpZGF0ZV90ZXN0L3Z0c19tZWRpYVByb2ZpbGVzX3ZhbGlkYXRlX3Rlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iYmluYXJ5LXRlc3Qtc291cmNlIiB2YWx1ZT0iXzY0Yml0OjpEQVRBL25hdGl2ZXRlc3Q2NC92dHNfbWVkaWFQcm9maWxlc192YWxpZGF0ZV90ZXN0L3Z0c19tZWRpYVByb2ZpbGVzX3ZhbGlkYXRlX3Rlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iYmluYXJ5LXRlc3QtdHlwZSIgdmFsdWU9Imd0ZXN0Ii8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC10aW1lb3V0IiB2YWx1ZT0iMzBzIi8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEveHNkL3Z0cy9WYWxpZGF0ZU1lZGlhUHJvZmlsZXMuY3BwIGIvbWVkaWEvbGlibWVkaWEveHNkL3Z0cy9WYWxpZGF0ZU1lZGlhUHJvZmlsZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmOWIwNjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYS94c2QvdnRzL1ZhbGlkYXRlTWVkaWFQcm9maWxlcy5jcHAKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJ1dGlsaXR5L1ZhbGlkYXRlWG1sLmgiCisKK1RFU1QoQ2hlY2tDb25maWcsIG1lZGlhUHJvZmlsZXNWYWxpZGF0aW9uKSB7CisgICAgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAiVmVyaWZ5IHRoYXQgdGhlIG1lZGlhIHByb2ZpbGVzIGZpbGUgIgorICAgICAgICAgICAgICAgICAgICJpcyB2YWxpZCBhY2NvcmRpbmcgdG8gdGhlIHNjaGVtYSIpOworCisgICAgY29uc3QgY2hhciogbG9jYXRpb24gPSAiL3ZlbmRvci9ldGMiOworCisgICAgRVhQRUNUX09ORV9WQUxJRF9YTUxfTVVMVElQTEVfTE9DQVRJT05TKCJtZWRpYV9wcm9maWxlc19WMV8wLnhtbCIsIHtsb2NhdGlvbn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvZGF0YS9sb2NhbC90bXAvbWVkaWFfcHJvZmlsZXMueHNkIik7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjliNDdjZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotY2NfbGlicmFyeSB7Ci0gICAgbmFtZTogImxpYm1lZGlhZXh0cmFjdG9yIiwKLQotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZSIsCi0gICAgXSwKLQotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV25vLW11bHRpY2hhciIsCi0gICAgICAgICItV2Vycm9yIiwKLSAgICAgICAgIi1XYWxsIiwKLSAgICBdLAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJEYXRhU291cmNlQmFzZS5jcHAiLAotICAgICAgICAiTWVkaWFCdWZmZXIuY3BwIiwKLSAgICAgICAgIk1lZGlhQnVmZmVyQmFzZS5jcHAiLAotICAgICAgICAiTWVkaWFCdWZmZXJHcm91cC5jcHAiLAotICAgICAgICAiTWVkaWFTb3VyY2UuY3BwIiwKLSAgICAgICAgIk1lZGlhVHJhY2suY3BwIiwKLSAgICAgICAgIk1lZGlhRXh0cmFjdG9yLmNwcCIsCi0gICAgICAgICJNZXRhRGF0YS5jcHAiLAotICAgICAgICAiTWV0YURhdGFCYXNlLmNwcCIsCi0gICAgICAgICJWb3JiaXNDb21tZW50LmNwcCIsCi0gICAgXSwKLQotICAgIGNsYW5nOiB0cnVlLAotCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKLSAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgICAgIF0sCi0gICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAotICAgIH0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlci5jcHAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZjhkNmUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFCdWZmZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIk1lZGlhQnVmZmVyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKiBzdGF0aWMgKi8KLXN0ZDo6YXRvbWljX2ludF9sZWFzdDMyX3QgTWVkaWFCdWZmZXI6Om1Vc2VTaGFyZWRNZW1vcnkoMCk7Ci0KLU1lZGlhQnVmZmVyOjpNZWRpYUJ1ZmZlcih2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkKLSAgICA6IG1PYnNlcnZlcihOVUxMKSwKLSAgICAgIG1SZWZDb3VudCgwKSwKLSAgICAgIG1EYXRhKGRhdGEpLAotICAgICAgbVNpemUoc2l6ZSksCi0gICAgICBtUmFuZ2VPZmZzZXQoMCksCi0gICAgICBtUmFuZ2VMZW5ndGgoc2l6ZSksCi0gICAgICBtT3duc0RhdGEoZmFsc2UpLAotICAgICAgbU1ldGFEYXRhKG5ldyBNZXRhRGF0YSksCi0gICAgICBtT3JpZ2luYWwoTlVMTCkgewotfQotCi1NZWRpYUJ1ZmZlcjo6TWVkaWFCdWZmZXIoc2l6ZV90IHNpemUpCi0gICAgOiBtT2JzZXJ2ZXIoTlVMTCksCi0gICAgICBtUmVmQ291bnQoMCksCi0gICAgICBtRGF0YShOVUxMKSwKLSAgICAgIG1TaXplKHNpemUpLAotICAgICAgbVJhbmdlT2Zmc2V0KDApLAotICAgICAgbVJhbmdlTGVuZ3RoKHNpemUpLAotICAgICAgbU93bnNEYXRhKHRydWUpLAotICAgICAgbU1ldGFEYXRhKG5ldyBNZXRhRGF0YSksCi0gICAgICBtT3JpZ2luYWwoTlVMTCkgewotICAgIGlmIChzaXplIDwga1NoYXJlZE1lbVRocmVzaG9sZAotICAgICAgICAgICAgfHwgc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCgmbVVzZVNoYXJlZE1lbW9yeSwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCkgPT0gMCkgewotICAgICAgICBtRGF0YSA9IG1hbGxvYyhzaXplKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiY3JlYXRpbmcgbWVtb3J5RGVhbGVyIik7Ci0gICAgICAgIHNwPE1lbW9yeURlYWxlcj4gbWVtb3J5RGVhbGVyID0KLSAgICAgICAgICAgICAgICBuZXcgTWVtb3J5RGVhbGVyKHNpemUgKyBzaXplb2YoU2hhcmVkQ29udHJvbCksICJNZWRpYUJ1ZmZlciIpOwotICAgICAgICBtTWVtb3J5ID0gbWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShzaXplICsgc2l6ZW9mKFNoYXJlZENvbnRyb2wpKTsKLSAgICAgICAgaWYgKG1NZW1vcnkgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBhbGxvY2F0ZSBzaGFyZWQgbWVtb3J5LCB0cnlpbmcgcmVndWxhciBhbGxvY2F0aW9uISIpOwotICAgICAgICAgICAgbURhdGEgPSBtYWxsb2Moc2l6ZSk7Ci0gICAgICAgICAgICBpZiAobURhdGEgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJPdXQgb2YgbWVtb3J5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBnZXRTaGFyZWRDb250cm9sKCktPmNsZWFyKCk7Ci0gICAgICAgICAgICBtRGF0YSA9ICh1aW50OF90ICopbU1lbW9yeS0+cG9pbnRlcigpICsgc2l6ZW9mKFNoYXJlZENvbnRyb2wpOwotICAgICAgICAgICAgQUxPR1YoIkFsbG9jYXRlZCBzaGFyZWQgbWVtIGJ1ZmZlciBvZiBzaXplICV6dSBAICVwIiwgc2l6ZSwgbURhdGEpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1NZWRpYUJ1ZmZlcjo6TWVkaWFCdWZmZXIoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikKLSAgICA6IG1PYnNlcnZlcihOVUxMKSwKLSAgICAgIG1SZWZDb3VudCgwKSwKLSAgICAgIG1EYXRhKGJ1ZmZlci0+ZGF0YSgpKSwKLSAgICAgIG1TaXplKGJ1ZmZlci0+c2l6ZSgpKSwKLSAgICAgIG1SYW5nZU9mZnNldCgwKSwKLSAgICAgIG1SYW5nZUxlbmd0aChtU2l6ZSksCi0gICAgICBtQnVmZmVyKGJ1ZmZlciksCi0gICAgICBtT3duc0RhdGEoZmFsc2UpLAotICAgICAgbU1ldGFEYXRhKG5ldyBNZXRhRGF0YSksCi0gICAgICBtT3JpZ2luYWwoTlVMTCkgewotfQotCi12b2lkIE1lZGlhQnVmZmVyOjpyZWxlYXNlKCkgewotICAgIGlmIChtT2JzZXJ2ZXIgPT0gTlVMTCkgewotICAgICAgICAvLyBMZWdhY3kgY29udHJhY3QgZm9yIE1lZGlhQnVmZmVyIHdpdGhvdXQgYSBNZWRpYUJ1ZmZlckdyb3VwLgotICAgICAgICBDSEVDS19FUShtUmVmQ291bnQsIDApOwotICAgICAgICBkZWxldGUgdGhpczsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGludCBwcmV2Q291bnQgPSBfX3N5bmNfZmV0Y2hfYW5kX3N1YigmbVJlZkNvdW50LCAxKTsKLSAgICBpZiAocHJldkNvdW50ID09IDEpIHsKLSAgICAgICAgaWYgKG1PYnNlcnZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBkZWxldGUgdGhpczsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1PYnNlcnZlci0+c2lnbmFsQnVmZmVyUmV0dXJuZWQodGhpcyk7Ci0gICAgfQotICAgIENIRUNLKHByZXZDb3VudCA+IDApOwotfQotCi12b2lkIE1lZGlhQnVmZmVyOjpjbGFpbSgpIHsKLSAgICBDSEVDSyhtT2JzZXJ2ZXIgIT0gTlVMTCk7Ci0gICAgQ0hFQ0tfRVEobVJlZkNvdW50LCAxKTsKLQotICAgIG1SZWZDb3VudCA9IDA7Ci19Ci0KLXZvaWQgTWVkaWFCdWZmZXI6OmFkZF9yZWYoKSB7Ci0gICAgKHZvaWQpIF9fc3luY19mZXRjaF9hbmRfYWRkKCZtUmVmQ291bnQsIDEpOwotfQotCi12b2lkICpNZWRpYUJ1ZmZlcjo6ZGF0YSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbURhdGE7Ci19Ci0KLXNpemVfdCBNZWRpYUJ1ZmZlcjo6c2l6ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVNpemU7Ci19Ci0KLXNpemVfdCBNZWRpYUJ1ZmZlcjo6cmFuZ2Vfb2Zmc2V0KCkgY29uc3QgewotICAgIHJldHVybiBtUmFuZ2VPZmZzZXQ7Ci19Ci0KLXNpemVfdCBNZWRpYUJ1ZmZlcjo6cmFuZ2VfbGVuZ3RoKCkgY29uc3QgewotICAgIHJldHVybiBtUmFuZ2VMZW5ndGg7Ci19Ci0KLXZvaWQgTWVkaWFCdWZmZXI6OnNldF9yYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKSB7Ci0gICAgaWYgKG9mZnNldCArIGxlbmd0aCA+IG1TaXplKSB7Ci0gICAgICAgIEFMT0dFKCJvZmZzZXQgPSAlenUsIGxlbmd0aCA9ICV6dSwgbVNpemUgPSAlenUiLCBvZmZzZXQsIGxlbmd0aCwgbVNpemUpOwotICAgIH0KLSAgICBDSEVDSyhvZmZzZXQgKyBsZW5ndGggPD0gbVNpemUpOwotCi0gICAgbVJhbmdlT2Zmc2V0ID0gb2Zmc2V0OwotICAgIG1SYW5nZUxlbmd0aCA9IGxlbmd0aDsKLX0KLQotTWV0YURhdGFCYXNlJiBNZWRpYUJ1ZmZlcjo6bWV0YV9kYXRhKCkgewotICAgIHJldHVybiAqbU1ldGFEYXRhOwotfQotCi12b2lkIE1lZGlhQnVmZmVyOjpyZXNldCgpIHsKLSAgICBtTWV0YURhdGEtPmNsZWFyKCk7Ci0gICAgc2V0X3JhbmdlKDAsIG1TaXplKTsKLX0KLQotTWVkaWFCdWZmZXI6On5NZWRpYUJ1ZmZlcigpIHsKLSAgICBDSEVDSyhtT2JzZXJ2ZXIgPT0gTlVMTCk7Ci0KLSAgICBpZiAobU93bnNEYXRhICYmIG1EYXRhICE9IE5VTEwgJiYgbU1lbW9yeSA9PSBOVUxMKSB7Ci0gICAgICAgIGZyZWUobURhdGEpOwotICAgICAgICBtRGF0YSA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKG1PcmlnaW5hbCAhPSBOVUxMKSB7Ci0gICAgICAgIG1PcmlnaW5hbC0+cmVsZWFzZSgpOwotICAgICAgICBtT3JpZ2luYWwgPSBOVUxMOwotICAgIH0KLQotICAgaWYgKG1NZW1vcnkuZ2V0KCkgIT0gbnVsbHB0cikgewotICAgICAgIGdldFNoYXJlZENvbnRyb2woKS0+c2V0RGVhZE9iamVjdCgpOwotICAgfQotICAgZGVsZXRlIG1NZXRhRGF0YTsKLX0KLQotdm9pZCBNZWRpYUJ1ZmZlcjo6c2V0T2JzZXJ2ZXIoTWVkaWFCdWZmZXJPYnNlcnZlciAqb2JzZXJ2ZXIpIHsKLSAgICBDSEVDSyhvYnNlcnZlciA9PSBOVUxMIHx8IG1PYnNlcnZlciA9PSBOVUxMKTsKLSAgICBtT2JzZXJ2ZXIgPSBvYnNlcnZlcjsKLX0KLQotTWVkaWFCdWZmZXJCYXNlICpNZWRpYUJ1ZmZlcjo6Y2xvbmUoKSB7Ci0gICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihtRGF0YSwgbVNpemUpOwotICAgIGJ1ZmZlci0+c2V0X3JhbmdlKG1SYW5nZU9mZnNldCwgbVJhbmdlTGVuZ3RoKTsKLSAgICBidWZmZXItPm1NZXRhRGF0YSA9IG5ldyBNZXRhRGF0YUJhc2UoKm1NZXRhRGF0YSk7Ci0KLSAgICBhZGRfcmVmKCk7Ci0gICAgYnVmZmVyLT5tT3JpZ2luYWwgPSB0aGlzOwotCi0gICAgcmV0dXJuIGJ1ZmZlcjsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhQnVmZmVyR3JvdXAuY3BwIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFCdWZmZXJHcm91cC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhOGRkNDEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFCdWZmZXJHcm91cC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiTWVkaWFCdWZmZXJHcm91cCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPGxpc3Q+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gc3RkOjptaW4gaXMgbm90IGNvbnN0ZXhwciBpbiBDKysxMQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLWNvbnN0ZXhwciBUIE1JTihjb25zdCBUICZhLCBjb25zdCBUICZiKSB7IHJldHVybiBhIDw9IGIgPyBhIDogYjsgfQotCi0vLyBNZWRpYUJ1ZmZlckdyb3VwIG1heSBjcmVhdGUgc2hhcmVkIG1lbW9yeSBidWZmZXJzIGF0IGEKLS8vIHNtYWxsZXIgdGhyZXNob2xkIHRoYW4gYW4gaXNvbGF0ZWQgbmV3IE1lZGlhQnVmZmVyLgotc3RhdGljIGNvbnN0IHNpemVfdCBrU2hhcmVkTWVtb3J5VGhyZXNob2xkID0gTUlOKAotICAgICAgICAoc2l6ZV90KU1lZGlhQnVmZmVyOjprU2hhcmVkTWVtVGhyZXNob2xkLCAoc2l6ZV90KSg0ICogMTAyNCkpOwotCi1zdHJ1Y3QgTWVkaWFCdWZmZXJHcm91cDo6SW50ZXJuYWxEYXRhIHsKLSAgICBNdXRleCBtTG9jazsKLSAgICBDb25kaXRpb24gbUNvbmRpdGlvbjsKLSAgICBzaXplX3QgbUdyb3d0aExpbWl0OyAgLy8gRG8gbm90IGF1dG9tYXRpY2FsbHkgZ3JvdyBncm91cCBsYXJnZXIgdGhhbiB0aGlzLgotICAgIHN0ZDo6bGlzdDxNZWRpYUJ1ZmZlckJhc2UgKj4gbUJ1ZmZlcnM7Ci19OwotCi1NZWRpYUJ1ZmZlckdyb3VwOjpNZWRpYUJ1ZmZlckdyb3VwKHNpemVfdCBncm93dGhMaW1pdCkKLSAgICA6IG1JbnRlcm5hbChuZXcgSW50ZXJuYWxEYXRhKCkpIHsKLSAgICBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCA9IGdyb3d0aExpbWl0OwotfQotCi1NZWRpYUJ1ZmZlckdyb3VwOjpNZWRpYUJ1ZmZlckdyb3VwKHNpemVfdCBidWZmZXJzLCBzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCBncm93dGhMaW1pdCkKLSAgICA6IG1JbnRlcm5hbChuZXcgSW50ZXJuYWxEYXRhKCkpIHsKLSAgICBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCA9IGdyb3d0aExpbWl0OwotCi0gICAgaWYgKG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0ID4gMCAmJiBidWZmZXJzID4gbUludGVybmFsLT5tR3Jvd3RoTGltaXQpIHsKLSAgICAgICAgQUxPR1coIlByZWFsbG9jYXRlZCBidWZmZXJzICV6dSA+IGdyb3d0aExpbWl0ICV6dSwgaW5jcmVhc2luZyBncm93dGhMaW1pdCIsCi0gICAgICAgICAgICAgICAgYnVmZmVycywgbUludGVybmFsLT5tR3Jvd3RoTGltaXQpOwotICAgICAgICBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCA9IGJ1ZmZlcnM7Ci0gICAgfQotCi0gICAgaWYgKGJ1ZmZlcl9zaXplID49IGtTaGFyZWRNZW1vcnlUaHJlc2hvbGQpIHsKLSAgICAgICAgQUxPR0QoImNyZWF0aW5nIE1lbW9yeURlYWxlciIpOwotICAgICAgICAvLyBVc2luZyBhIHNpbmdsZSBNZW1vcnlEZWFsZXIgaXMgZWZmaWNpZW50IGZvciBhIGdyb3VwIG9mIHNoYXJlZCBtZW1vcnkgb2JqZWN0cy4KLSAgICAgICAgLy8gVGhpcyBsb29wIGd1YXJhbnRlZXMgdGhhdCB3ZSB1c2Ugc2hhcmVkIG1lbW9yeSAobm8gZmFsbGJhY2sgdG8gbWFsbG9jKS4KLQotICAgICAgICBzaXplX3QgYWxpZ25tZW50ID0gTWVtb3J5RGVhbGVyOjpnZXRBbGxvY2F0aW9uQWxpZ25tZW50KCk7Ci0gICAgICAgIHNpemVfdCBhdWdtZW50ZWRfc2l6ZSA9IGJ1ZmZlcl9zaXplICsgc2l6ZW9mKE1lZGlhQnVmZmVyOjpTaGFyZWRDb250cm9sKTsKLSAgICAgICAgc2l6ZV90IHRvdGFsID0gKGF1Z21lbnRlZF9zaXplICsgYWxpZ25tZW50IC0gMSkgLyBhbGlnbm1lbnQgKiBhbGlnbm1lbnQgKiBidWZmZXJzOwotICAgICAgICBzcDxNZW1vcnlEZWFsZXI+IG1lbW9yeURlYWxlciA9IG5ldyBNZW1vcnlEZWFsZXIodG90YWwsICJNZWRpYUJ1ZmZlckdyb3VwIik7Ci0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBidWZmZXJzOyArK2kpIHsKLSAgICAgICAgICAgIHNwPElNZW1vcnk+IG1lbSA9IG1lbW9yeURlYWxlci0+YWxsb2NhdGUoYXVnbWVudGVkX3NpemUpOwotICAgICAgICAgICAgaWYgKG1lbS5nZXQoKSA9PSBudWxscHRyIHx8IG1lbS0+cG9pbnRlcigpID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiT25seSBhbGxvY2F0ZWQgJXp1IHNoYXJlZCBidWZmZXJzIG9mIHNpemUgJXp1IiwgaSwgYnVmZmVyX3NpemUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihtZW0pOwotICAgICAgICAgICAgYnVmZmVyLT5nZXRTaGFyZWRDb250cm9sKCktPmNsZWFyKCk7Ci0gICAgICAgICAgICBhZGRfYnVmZmVyKGJ1ZmZlcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIE5vbi1zaGFyZWQgbWVtb3J5IGFsbG9jYXRpb24uCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBidWZmZXJzOyArK2kpIHsKLSAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihidWZmZXJfc2l6ZSk7Ci0gICAgICAgIGlmIChidWZmZXItPmRhdGEoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBkZWxldGUgYnVmZmVyOyAvLyBkb24ndCBjYWxsIHJlbGVhc2UsIGl0J3Mgbm90IHByb3Blcmx5IGZvcm1lZAotICAgICAgICAgICAgQUxPR1coIk9ubHkgYWxsb2NhdGVkICV6dSBtYWxsb2MgYnVmZmVycyBvZiBzaXplICV6dSIsIGksIGJ1ZmZlcl9zaXplKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGFkZF9idWZmZXIoYnVmZmVyKTsKLSAgICB9Ci19Ci0KLU1lZGlhQnVmZmVyR3JvdXA6On5NZWRpYUJ1ZmZlckdyb3VwKCkgewotICAgIGZvciAoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIgOiBtSW50ZXJuYWwtPm1CdWZmZXJzKSB7Ci0gICAgICAgIGlmIChidWZmZXItPnJlZmNvdW50KCkgIT0gMCkgewotICAgICAgICAgICAgY29uc3QgaW50IGxvY2FsUmVmY291bnQgPSBidWZmZXItPmxvY2FsUmVmY291bnQoKTsKLSAgICAgICAgICAgIGNvbnN0IGludCByZW1vdGVSZWZjb3VudCA9IGJ1ZmZlci0+cmVtb3RlUmVmY291bnQoKTsKLQotICAgICAgICAgICAgLy8gRmF0YWwgaWYgd2UgaGF2ZSBhIGxvY2FsIHJlZmNvdW50LgotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihsb2NhbFJlZmNvdW50ICE9IDAsCi0gICAgICAgICAgICAgICAgICAgICJidWZmZXIoJXApIGxvY2FsUmVmY291bnQgJWQgIT0gMCwgcmVtb3RlUmVmY291bnQgJWQiLAotICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGxvY2FsUmVmY291bnQsIHJlbW90ZVJlZmNvdW50KTsKLQotICAgICAgICAgICAgLy8gTG9nIGFuIGVycm9yIGlmIHdlIGhhdmUgYSByZW1haW5pbmcgcmVtb3RlIHJlZmNvdW50LAotICAgICAgICAgICAgLy8gYXMgdGhlIHJlbW90ZSBwcm9jZXNzIG1heSBoYXZlIGRpZWQgb3IgbWF5IGhhdmUgaW5hcHByb3ByaWF0ZSBiZWhhdmlvci4KLSAgICAgICAgICAgIC8vIFRoZSBzaGFyZWQgbWVtb3J5IGFzc29jaWF0ZWQgd2l0aCB0aGUgTWVkaWFCdWZmZXIgd2lsbAotICAgICAgICAgICAgLy8gYXV0b21hdGljYWxseSBiZSByZWNsYWltZWQgd2hlbiB0aGVyZSBhcmUgbm8gcmVtYWluaW5nIGZkcwotICAgICAgICAgICAgLy8gYXNzb2NpYXRlZCB3aXRoIGl0LgotICAgICAgICAgICAgQUxPR0UoImJ1ZmZlciglcCkgaGFzIHJlc2lkdWFsIHJlbW90ZVJlZmNvdW50ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCByZW1vdGVSZWZjb3VudCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZ3JhY2VmdWxseSBkZWxldGUuCi0gICAgICAgIGJ1ZmZlci0+c2V0T2JzZXJ2ZXIobnVsbHB0cik7Ci0gICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwotICAgIH0KLSAgICBkZWxldGUgbUludGVybmFsOwotfQotCi12b2lkIE1lZGlhQnVmZmVyR3JvdXA6OmFkZF9idWZmZXIoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUludGVybmFsLT5tTG9jayk7Ci0KLSAgICAvLyBpZiB3ZSdyZSBhYm92ZSBvdXIgZ3Jvd3RoIGxpbWl0LCByZWxlYXNlIGJ1ZmZlcnMgaWYgd2UgY2FuCi0gICAgZm9yIChhdXRvIGl0ID0gbUludGVybmFsLT5tQnVmZmVycy5iZWdpbigpOwotICAgICAgICAgICAgbUludGVybmFsLT5tR3Jvd3RoTGltaXQgPiAwCi0gICAgICAgICAgICAmJiBtSW50ZXJuYWwtPm1CdWZmZXJzLnNpemUoKSA+PSBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdAotICAgICAgICAgICAgJiYgaXQgIT0gbUludGVybmFsLT5tQnVmZmVycy5lbmQoKTspIHsKLSAgICAgICAgaWYgKCgqaXQpLT5yZWZjb3VudCgpID09IDApIHsKLSAgICAgICAgICAgICgqaXQpLT5zZXRPYnNlcnZlcihudWxscHRyKTsKLSAgICAgICAgICAgICgqaXQpLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBpdCA9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZXJhc2UoaXQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgKytpdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJ1ZmZlci0+c2V0T2JzZXJ2ZXIodGhpcyk7Ci0gICAgbUludGVybmFsLT5tQnVmZmVycy5lbXBsYWNlX2JhY2soYnVmZmVyKTsKLX0KLQotYm9vbCBNZWRpYUJ1ZmZlckdyb3VwOjpoYXNfYnVmZmVycygpIHsKLSAgICBpZiAobUludGVybmFsLT5tQnVmZmVycy5zaXplKCkgPCBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gV2UgY2FuIGFkZCBtb3JlIGJ1ZmZlcnMgaW50ZXJuYWxseS4KLSAgICB9Ci0gICAgZm9yIChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciA6IG1JbnRlcm5hbC0+bUJ1ZmZlcnMpIHsKLSAgICAgICAgaWYgKGJ1ZmZlci0+cmVmY291bnQoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXR1c190IE1lZGlhQnVmZmVyR3JvdXA6OmFjcXVpcmVfYnVmZmVyKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGJvb2wgbm9uQmxvY2tpbmcsIHNpemVfdCByZXF1ZXN0ZWRTaXplKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1JbnRlcm5hbC0+bUxvY2spOwotICAgIGZvciAoOzspIHsKLSAgICAgICAgc2l6ZV90IHNtYWxsZXN0ID0gcmVxdWVzdGVkU2l6ZTsKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIgPSBudWxscHRyOwotICAgICAgICBhdXRvIGZyZWUgPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmVuZCgpOwotICAgICAgICBmb3IgKGF1dG8gaXQgPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmJlZ2luKCk7IGl0ICE9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW5kKCk7ICsraXQpIHsKLSAgICAgICAgICAgIGlmICgoKml0KS0+cmVmY291bnQoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHNpemUgPSAoKml0KS0+c2l6ZSgpOwotICAgICAgICAgICAgICAgIGlmIChzaXplID49IHJlcXVlc3RlZFNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gKml0OwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNpemUgPCBzbWFsbGVzdCkgewotICAgICAgICAgICAgICAgICAgICBzbWFsbGVzdCA9IHNpemU7IC8vIGFsd2F5cyBmcmVlIHRoZSBzbWFsbGVzdCBidWYKLSAgICAgICAgICAgICAgICAgICAgZnJlZSA9IGl0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoYnVmZmVyID09IG51bGxwdHIKLSAgICAgICAgICAgICAgICAmJiAoZnJlZSAhPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmVuZCgpCi0gICAgICAgICAgICAgICAgICAgIHx8IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuc2l6ZSgpIDwgbUludGVybmFsLT5tR3Jvd3RoTGltaXQpKSB7Ci0gICAgICAgICAgICAvLyBXZSBhbGxvYyBiZWZvcmUgd2UgZnJlZSBzbyBmYWlsdXJlIGxlYXZlcyBncm91cCB1bmNoYW5nZWQuCi0gICAgICAgICAgICBjb25zdCBzaXplX3QgYWxsb2NhdGVTaXplID0gcmVxdWVzdGVkU2l6ZSA8IFNJWkVfTUFYIC8gMyAqIDIgLyogTkI6IG9yZGVyaW5nICovID8KLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkU2l6ZSAqIDMgLyAyIDogcmVxdWVzdGVkU2l6ZTsKLSAgICAgICAgICAgIGJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihhbGxvY2F0ZVNpemUpOwotICAgICAgICAgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiQWxsb2NhdGlvbiBmYWlsdXJlIGZvciBzaXplICV6dSIsIGFsbG9jYXRlU2l6ZSk7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIGJ1ZmZlcjsgLy8gSW52YWxpZCBhbGxvYywgcHJlZmVyIG5vdCB0byBjYWxsIHJlbGVhc2UuCi0gICAgICAgICAgICAgICAgYnVmZmVyID0gbnVsbHB0cjsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRPYnNlcnZlcih0aGlzKTsKLSAgICAgICAgICAgICAgICBpZiAoZnJlZSAhPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJyZWFsbG9jYXRlIGJ1ZmZlciwgcmVxdWVzdGVkIHNpemUgJXp1IHZzIGF2YWlsYWJsZSAlenUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFNpemUsICgqZnJlZSktPnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICgqZnJlZSktPnNldE9ic2VydmVyKG51bGxwdHIpOwotICAgICAgICAgICAgICAgICAgICAoKmZyZWUpLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICpmcmVlID0gYnVmZmVyOyAvLyBpbi1wbGFjZSByZXBsYWNlCi0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImFsbG9jYXRlIGJ1ZmZlciwgcmVxdWVzdGVkIHNpemUgJXp1IiwgcmVxdWVzdGVkU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW1wbGFjZV9iYWNrKGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChidWZmZXIgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgYnVmZmVyLT5hZGRfcmVmKCk7Ci0gICAgICAgICAgICBidWZmZXItPnJlc2V0KCk7Ci0gICAgICAgICAgICAqb3V0ID0gYnVmZmVyOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgICAgIGlmIChub25CbG9ja2luZykgewotICAgICAgICAgICAgKm91dCA9IG51bGxwdHI7Ci0gICAgICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQWxsIGJ1ZmZlcnMgYXJlIGluIHVzZSwgYmxvY2sgdW50aWwgb25lIG9mIHRoZW0gaXMgcmV0dXJuZWQuCi0gICAgICAgIG1JbnRlcm5hbC0+bUNvbmRpdGlvbi53YWl0KG1JbnRlcm5hbC0+bUxvY2spOwotICAgIH0KLSAgICAvLyBOZXZlciBnZXRzIGhlcmUuCi19Ci0KLXNpemVfdCBNZWRpYUJ1ZmZlckdyb3VwOjpidWZmZXJzKCkgY29uc3QgewotICAgIHJldHVybiBtSW50ZXJuYWwtPm1CdWZmZXJzLnNpemUoKTsKLX0KLQotdm9pZCBNZWRpYUJ1ZmZlckdyb3VwOjpzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlckJhc2UgKikgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtSW50ZXJuYWwtPm1Mb2NrKTsKLSAgICBtSW50ZXJuYWwtPm1Db25kaXRpb24uc2lnbmFsKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3Rvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2YjNkYzkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3IuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTWVkaWFFeHRyYWN0b3IiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8cHdkLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1NZWRpYUV4dHJhY3Rvcjo6TWVkaWFFeHRyYWN0b3IoKSB7Ci0gICAgaWYgKCFMT0dfTkRFQlVHKSB7Ci0gICAgICAgIHVpZF90IHVpZCA9IGdldHVpZCgpOwotICAgICAgICBzdHJ1Y3QgcGFzc3dkICpwdyA9IGdldHB3dWlkKHVpZCk7Ci0gICAgICAgIEFMT0dWKCJleHRyYWN0b3IgY3JlYXRlZCBpbiB1aWQ6ICVkICglcykiLCBnZXR1aWQoKSwgcHctPnB3X25hbWUpOwotICAgIH0KLX0KLQotTWVkaWFFeHRyYWN0b3I6On5NZWRpYUV4dHJhY3RvcigpIHt9Ci0KLXVpbnQzMl90IE1lZGlhRXh0cmFjdG9yOjpmbGFncygpIGNvbnN0IHsKLSAgICByZXR1cm4gQ0FOX1NFRUtfQkFDS1dBUkQgfCBDQU5fU0VFS19GT1JXQVJEIHwgQ0FOX1BBVVNFIHwgQ0FOX1NFRUs7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYVRyYWNrLmNwcCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhVHJhY2suY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTYzZjU4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhVHJhY2suY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotTWVkaWFUcmFjazo6TWVkaWFUcmFjaygpIHt9Ci0KLU1lZGlhVHJhY2s6On5NZWRpYVRyYWNrKCkge30KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OlJlYWRPcHRpb25zKCkgewotICAgIHJlc2V0KCk7Ci19Ci0KLXZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OnJlc2V0KCkgewotICAgIG1PcHRpb25zID0gMDsKLSAgICBtU2Vla1RpbWVVcyA9IDA7Ci0gICAgbU5vbkJsb2NraW5nID0gZmFsc2U7Ci19Ci0KLXZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OnNldE5vbkJsb2NraW5nKCkgewotICAgIG1Ob25CbG9ja2luZyA9IHRydWU7Ci19Ci0KLXZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OmNsZWFyTm9uQmxvY2tpbmcoKSB7Ci0gICAgbU5vbkJsb2NraW5nID0gZmFsc2U7Ci19Ci0KLWJvb2wgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OmdldE5vbkJsb2NraW5nKCkgY29uc3QgewotICAgIHJldHVybiBtTm9uQmxvY2tpbmc7Ci19Ci0KLXZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OnNldFNlZWtUbyhpbnQ2NF90IHRpbWVfdXMsIFNlZWtNb2RlIG1vZGUpIHsKLSAgICBtT3B0aW9ucyB8PSBrU2Vla1RvX09wdGlvbjsKLSAgICBtU2Vla1RpbWVVcyA9IHRpbWVfdXM7Ci0gICAgbVNlZWtNb2RlID0gbW9kZTsKLX0KLQotdm9pZCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6Y2xlYXJTZWVrVG8oKSB7Ci0gICAgbU9wdGlvbnMgJj0gfmtTZWVrVG9fT3B0aW9uOwotICAgIG1TZWVrVGltZVVzID0gMDsKLSAgICBtU2Vla01vZGUgPSBTRUVLX0NMT1NFU1RfU1lOQzsKLX0KLQotYm9vbCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6Z2V0U2Vla1RvKAotICAgICAgICBpbnQ2NF90ICp0aW1lX3VzLCBTZWVrTW9kZSAqbW9kZSkgY29uc3QgewotICAgICp0aW1lX3VzID0gbVNlZWtUaW1lVXM7Ci0gICAgKm1vZGUgPSBtU2Vla01vZGU7Ci0gICAgcmV0dXJuIChtT3B0aW9ucyAmIGtTZWVrVG9fT3B0aW9uKSAhPSAwOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvVm9yYmlzQ29tbWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9Wb3JiaXNDb21tZW50LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmFiYWY1MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9Wb3JiaXNDb21tZW50LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJWb3JiaXNDb21tZW50IgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAibWVkaWEvVm9yYmlzQ29tbWVudC5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyB2b2lkIGV4dHJhY3RBbGJ1bUFydCgKLSAgICAgICAgTWV0YURhdGFCYXNlICpmaWxlTWV0YSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICBBTE9HVigiZXh0cmFjdEFsYnVtQXJ0IGZyb20gJyVzJyIsIChjb25zdCBjaGFyICopZGF0YSk7Ci0KLSAgICBzcDxBQnVmZmVyPiBmbGFjQnVmZmVyID0gZGVjb2RlQmFzZTY0KEFTdHJpbmcoKGNvbnN0IGNoYXIgKilkYXRhLCBzaXplKSk7Ci0gICAgaWYgKGZsYWNCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgibWFsZm9ybWVkIGJhc2U2NCBlbmNvZGVkIGRhdGEuIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzaXplX3QgZmxhY1NpemUgPSBmbGFjQnVmZmVyLT5zaXplKCk7Ci0gICAgdWludDhfdCAqZmxhYyA9IGZsYWNCdWZmZXItPmRhdGEoKTsKLSAgICBBTE9HVigiZ290IGZsYWMgb2Ygc2l6ZSAlenUiLCBmbGFjU2l6ZSk7Ci0KLSAgICB1aW50MzJfdCBwaWNUeXBlOwotICAgIHVpbnQzMl90IHR5cGVMZW47Ci0gICAgdWludDMyX3QgZGVzY0xlbjsKLSAgICB1aW50MzJfdCBkYXRhTGVuOwotICAgIGNoYXIgdHlwZVsxMjhdOwotCi0gICAgaWYgKGZsYWNTaXplIDwgOCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcGljVHlwZSA9IFUzMl9BVChmbGFjKTsKLQotICAgIGlmIChwaWNUeXBlICE9IDMpIHsKLSAgICAgICAgLy8gVGhpcyBpcyBub3QgYSBmcm9udCBjb3Zlci4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHR5cGVMZW4gPSBVMzJfQVQoJmZsYWNbNF0pOwotICAgIGlmICh0eXBlTGVuID4gc2l6ZW9mKHR5cGUpIC0gMSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gd2UndmUgYWxyZWFkeSBjaGVja2VkIGFib3ZlIHRoYXQgZmxhY1NpemUgPj0gOAotICAgIGlmIChmbGFjU2l6ZSAtIDggPCB0eXBlTGVuKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtZW1jcHkodHlwZSwgJmZsYWNbOF0sIHR5cGVMZW4pOwotICAgIHR5cGVbdHlwZUxlbl0gPSAnXDAnOwotCi0gICAgQUxPR1YoInBpY1R5cGUgPSAlZCwgdHlwZSA9ICclcyciLCBwaWNUeXBlLCB0eXBlKTsKLQotICAgIGlmICghc3RyY21wKHR5cGUsICItLT4iKSkgewotICAgICAgICAvLyBUaGlzIGlzIG5vdCBpbmxpbmUgY292ZXIgYXJ0LCBidXQgYW4gZXh0ZXJuYWwgdXJsIGluc3RlYWQuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoZmxhY1NpemUgPCAzMiB8fCBmbGFjU2l6ZSAtIDMyIDwgdHlwZUxlbikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZGVzY0xlbiA9IFUzMl9BVCgmZmxhY1s4ICsgdHlwZUxlbl0pOwotICAgIGlmIChmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiA8IGRlc2NMZW4pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGRhdGFMZW4gPSBVMzJfQVQoJmZsYWNbOCArIHR5cGVMZW4gKyA0ICsgZGVzY0xlbiArIDE2XSk7Ci0KLSAgICAvLyB3ZSd2ZSBhbHJlYWR5IGNoZWNrZWQgYWJvdmUgdGhhdCAoZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gLSBkZXNjTGVuKSA+PSAwCi0gICAgaWYgKGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIC0gZGVzY0xlbiA8IGRhdGFMZW4pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEFMT0dWKCJnb3QgaW1hZ2UgZGF0YSwgJXp1IHRyYWlsaW5nIGJ5dGVzIiwKLSAgICAgICAgIGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIC0gZGVzY0xlbiAtIGRhdGFMZW4pOwotCi0gICAgZmlsZU1ldGEtPnNldERhdGEoCi0gICAgICAgICAgICBrS2V5QWxidW1BcnQsIDAsICZmbGFjWzggKyB0eXBlTGVuICsgNCArIGRlc2NMZW4gKyAyMF0sIGRhdGFMZW4pOwotCi0gICAgZmlsZU1ldGEtPnNldENTdHJpbmcoa0tleUFsYnVtQXJ0TUlNRSwgdHlwZSk7Ci19Ci0KLXZvaWQgcGFyc2VWb3JiaXNDb21tZW50KAotICAgICAgICBNZXRhRGF0YUJhc2UgKmZpbGVNZXRhLCBjb25zdCBjaGFyICpjb21tZW50LCBzaXplX3QgY29tbWVudExlbmd0aCkKLXsKLSAgICBzdHJ1Y3QgewotICAgICAgICBjb25zdCBjaGFyICpjb25zdCBtVGFnOwotICAgICAgICB1aW50MzJfdCBtS2V5OwotICAgIH0ga01hcFtdID0gewotICAgICAgICB7ICJUSVRMRSIsIGtLZXlUaXRsZSB9LAotICAgICAgICB7ICJBUlRJU1QiLCBrS2V5QXJ0aXN0IH0sCi0gICAgICAgIHsgIkFMQlVNQVJUSVNUIiwga0tleUFsYnVtQXJ0aXN0IH0sCi0gICAgICAgIHsgIkFMQlVNIEFSVElTVCIsIGtLZXlBbGJ1bUFydGlzdCB9LAotICAgICAgICB7ICJDT01QSUxBVElPTiIsIGtLZXlDb21waWxhdGlvbiB9LAotICAgICAgICB7ICJBTEJVTSIsIGtLZXlBbGJ1bSB9LAotICAgICAgICB7ICJDT01QT1NFUiIsIGtLZXlDb21wb3NlciB9LAotICAgICAgICB7ICJHRU5SRSIsIGtLZXlHZW5yZSB9LAotICAgICAgICB7ICJBVVRIT1IiLCBrS2V5QXV0aG9yIH0sCi0gICAgICAgIHsgIlRSQUNLTlVNQkVSIiwga0tleUNEVHJhY2tOdW1iZXIgfSwKLSAgICAgICAgeyAiRElTQ05VTUJFUiIsIGtLZXlEaXNjTnVtYmVyIH0sCi0gICAgICAgIHsgIkRBVEUiLCBrS2V5RGF0ZSB9LAotICAgICAgICB7ICJZRUFSIiwga0tleVllYXIgfSwKLSAgICAgICAgeyAiTFlSSUNJU1QiLCBrS2V5V3JpdGVyIH0sCi0gICAgICAgIHsgIk1FVEFEQVRBX0JMT0NLX1BJQ1RVUkUiLCBrS2V5QWxidW1BcnQgfSwKLSAgICAgICAgeyAiQU5EUk9JRF9MT09QIiwga0tleUF1dG9Mb29wIH0sCi0gICAgfTsKLQotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHNpemVvZihrTWFwKSAvIHNpemVvZihrTWFwWzBdKTsgKytqKSB7Ci0gICAgICAgICAgICBzaXplX3QgdGFnTGVuID0gc3RybGVuKGtNYXBbal0ubVRhZyk7Ci0gICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKGtNYXBbal0ubVRhZywgY29tbWVudCwgdGFnTGVuKQotICAgICAgICAgICAgICAgICAgICAmJiBjb21tZW50W3RhZ0xlbl0gPT0gJz0nKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGtNYXBbal0ubUtleSA9PSBrS2V5QWxidW1BcnQpIHsKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFjdEFsYnVtQXJ0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVNZXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb21tZW50W3RhZ0xlbiArIDFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1lbnRMZW5ndGggLSB0YWdMZW4gLSAxKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGtNYXBbal0ubUtleSA9PSBrS2V5QXV0b0xvb3ApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKCZjb21tZW50W3RhZ0xlbiArIDFdLCAidHJ1ZSIpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWxlTWV0YS0+c2V0SW50MzIoa0tleUF1dG9Mb29wLCB0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbGVNZXRhLT5zZXRDU3RyaW5nKGtNYXBbal0ubUtleSwgJmNvbW1lbnRbdGFnTGVuICsgMV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTU5ZjM5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgREFUQV9TT1VSQ0VfSF8KLQotI2RlZmluZSBEQVRBX1NPVVJDRV9IXwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL0lEYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDxkcm0vRHJtTWFuYWdlckNsaWVudC5oPgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgU3RyaW5nODsKLQotY2xhc3MgRGF0YVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlQmFzZSwgcHVibGljIHZpcnR1YWwgUmVmQmFzZSB7Ci1wdWJsaWM6Ci0gICAgRGF0YVNvdXJjZSgpIHt9Ci0KLSAgICAvLyByZXR1cm5zIGEgcG9pbnRlciB0byBJRGF0YVNvdXJjZSBpZiBpdCBpcyB3cmFwcGVkLgotICAgIHZpcnR1YWwgc3A8SURhdGFTb3VyY2U+IGdldElEYXRhU291cmNlKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIFN0cmluZzggdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmc4KCI8dW5zcGVjaWZpZWQ+Iik7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWNvbm5lY3RBdE9mZnNldChvZmY2NF90IC8qb2Zmc2V0Ki8pIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIC8vIGZvciBEUk0KLSAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IERybUluaXRpYWxpemF0aW9uKGNvbnN0IGNoYXIgKiAvKm1pbWUqLyA9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgdmlydHVhbCBTdHJpbmc4IGdldFVyaSgpIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZzgoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgZ2V0VXJpKGNoYXIgKnVyaVN0cmluZywgc2l6ZV90IGJ1ZmZlclNpemUpIGZpbmFsIHsKLSAgICAgICAgaW50IHJldCA9IHNucHJpbnRmKHVyaVN0cmluZywgYnVmZmVyU2l6ZSwgIiVzIiwgZ2V0VXJpKCkuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiByZXQgPj0gMCAmJiBzdGF0aWNfY2FzdDxzaXplX3Q+KHJldCkgPCBidWZmZXJTaXplOwotICAgIH0KLQotICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRNSU1FVHlwZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIFN0cmluZzgoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwotICAgIH0KLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkRhdGFTb3VyY2UoKSB7fQotCi1wcml2YXRlOgotICAgIERhdGFTb3VyY2UoY29uc3QgRGF0YVNvdXJjZSAmKTsKLSAgICBEYXRhU291cmNlICZvcGVyYXRvcj0oY29uc3QgRGF0YVNvdXJjZSAmKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gREFUQV9TT1VSQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZUJhc2UuaCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZUJhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE5OTNkYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VCYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBEQVRBX1NPVVJDRV9CQVNFX0hfCi0KLSNkZWZpbmUgREFUQV9TT1VSQ0VfQkFTRV9IXwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgU3RyaW5nODsKLQotY2xhc3MgRGF0YVNvdXJjZUJhc2UgewotcHVibGljOgotICAgIGVudW0gRmxhZ3MgewotICAgICAgICBrV2FudHNQcmVmZXRjaGluZyAgICAgID0gMSwKLSAgICAgICAga1N0cmVhbWVkRnJvbUxvY2FsSG9zdCA9IDIsCi0gICAgICAgIGtJc0NhY2hpbmdEYXRhU291cmNlICAgPSA0LAotICAgICAgICBrSXNIVFRQQmFzZWRTb3VyY2UgICAgID0gOCwKLSAgICAgICAga0lzTG9jYWxGaWxlU291cmNlICAgICA9IDE2LAotICAgIH07Ci0KLSAgICBEYXRhU291cmNlQmFzZSgpIHt9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0ID0gMDsKLQotICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLCBvciAtMSBvbiBmYWlsdXJlLiBJdCdzIG5vdCBhbiBlcnJvciBpZgotICAgIC8vIHRoaXMgcmV0dXJucyB6ZXJvOyBpdCBqdXN0IG1lYW5zIHRoZSBnaXZlbiBvZmZzZXQgaXMgZXF1YWwgdG8sIG9yCi0gICAgLy8gYmV5b25kLCB0aGUgZW5kIG9mIHRoZSBzb3VyY2UuCi0gICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpID0gMDsKLQotICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZHM6Ci0gICAgYm9vbCBnZXRVSW50MTYob2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90ICp4KTsKLSAgICBib29sIGdldFVJbnQyNChvZmY2NF90IG9mZnNldCwgdWludDMyX3QgKngpOyAvLyAzIGJ5dGUgaW50LCByZXR1cm5lZCBhcyBhIDMyLWJpdCBpbnQKLSAgICBib29sIGdldFVJbnQzMihvZmY2NF90IG9mZnNldCwgdWludDMyX3QgKngpOwotICAgIGJvb2wgZ2V0VUludDY0KG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCk7Ci0KLSAgICAvLyByZWFkIGVpdGhlciBpbnQ8Tj4gb3IgaW50PDJOPiBpbnRvIGEgdWludDwyTj5fdCwgc2l6ZSBpcyB0aGUgaW50IHNpemUgaW4gYnl0ZXMuCi0gICAgYm9vbCBnZXRVSW50MTZWYXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90ICp4LCBzaXplX3Qgc2l6ZSk7Ci0gICAgYm9vbCBnZXRVSW50MzJWYXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4LCBzaXplX3Qgc2l6ZSk7Ci0gICAgYm9vbCBnZXRVSW50NjRWYXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQ2NF90ICp4LCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICAvLyBNYXkgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVELgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKLQotICAgIHZpcnR1YWwgYm9vbCBnZXRVcmkoY2hhciAqdXJpU3RyaW5nLCBzaXplX3QgYnVmZmVyU2l6ZSk7Ci0KLSAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSB7fTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkRhdGFTb3VyY2VCYXNlKCkge30KLQotcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZShjb25zdCBEYXRhU291cmNlQmFzZSAmKTsKLSAgICBEYXRhU291cmNlQmFzZSAmb3BlcmF0b3I9KGNvbnN0IERhdGFTb3VyY2VCYXNlICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBEQVRBX1NPVVJDRV9CQVNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiYTk4ZGEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3Rvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX0VYVFJBQ1RPUl9IXwotCi0jZGVmaW5lIE1FRElBX0VYVFJBQ1RPUl9IXwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGF0YVNvdXJjZUJhc2U7Ci1jbGFzcyBNZXRhRGF0YUJhc2U7Ci1zdHJ1Y3QgTWVkaWFUcmFjazsKLQotCi1jbGFzcyBFeHRyYWN0b3JBbGxvY1RyYWNrZXIgewotcHVibGljOgotICAgIEV4dHJhY3RvckFsbG9jVHJhY2tlcigpIHsKLSAgICAgICAgQUxPR0QoImV4dHJhY3RvciBhbGxvY2F0ZWQ6ICVwIiwgdGhpcyk7Ci0gICAgfQotICAgIHZpcnR1YWwgfkV4dHJhY3RvckFsbG9jVHJhY2tlcigpIHsKLSAgICAgICAgQUxPR0QoImV4dHJhY3RvciBmcmVlZDogJXAiLCB0aGlzKTsKLSAgICB9Ci19OwotCi0KLWNsYXNzIE1lZGlhRXh0cmFjdG9yCi0vLyA6IHB1YmxpYyBFeHRyYWN0b3JBbGxvY1RyYWNrZXIKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5NZWRpYUV4dHJhY3RvcigpOwotICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCkgPSAwOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KSA9IDA7Ci0KLSAgICBlbnVtIEdldFRyYWNrTWV0YURhdGFGbGFncyB7Ci0gICAgICAgIGtJbmNsdWRlRXh0ZW5zaXZlTWV0YURhdGEgPSAxCi0gICAgfTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UmIG1ldGEsCi0gICAgICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzID0gMCkgPSAwOwotCi0gICAgLy8gUmV0dXJuIGNvbnRhaW5lciBzcGVjaWZpYyBtZXRhLWRhdGEuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi0gICAgLy8gcmV0dXJucyBhbiBlbXB0eSBtZXRhZGF0YSBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpID0gMDsKLQotICAgIGVudW0gRmxhZ3MgewotICAgICAgICBDQU5fU0VFS19CQUNLV0FSRCAgPSAxLCAgLy8gdGhlICJzZWVrIDEwc2VjcyBiYWNrIGJ1dHRvbiIKLSAgICAgICAgQ0FOX1NFRUtfRk9SV0FSRCAgID0gMiwgIC8vIHRoZSAic2VlayAxMHNlY3MgZm9yd2FyZCBidXR0b24iCi0gICAgICAgIENBTl9QQVVTRSAgICAgICAgICA9IDQsCi0gICAgICAgIENBTl9TRUVLICAgICAgICAgICA9IDgsICAvLyB0aGUgInNlZWsgYmFyIgotICAgIH07Ci0KLSAgICAvLyBJZiBzdWJjbGFzc2VzIGRvIF9ub3RfIG92ZXJyaWRlIHRoaXMsIHRoZSBkZWZhdWx0IGlzCi0gICAgLy8gQ0FOX1NFRUtfQkFDS1dBUkQgfCBDQU5fU0VFS19GT1JXQVJEIHwgQ0FOX1NFRUsgfCBDQU5fUEFVU0UKLSAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHVpbnQ4X3QqIC8qY2FzVG9rZW4qLywgc2l6ZV90IC8qc2l6ZSovKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIjx1bnNwZWNpZmllZD4iOyB9Ci0KLSAgICB0eXBlZGVmIE1lZGlhRXh0cmFjdG9yKiAoKkNyZWF0b3JGdW5jKSgKLSAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIHZvaWQgKm1ldGEpOwotICAgIHR5cGVkZWYgdm9pZCAoKkZyZWVNZXRhRnVuYykodm9pZCAqbWV0YSk7Ci0KLSAgICAvLyBUaGUgc25pZmZlciBjYW4gb3B0aW9uYWxseSBmaWxsIGluIGFuIG9wYXF1ZSBvYmplY3QsICJtZXRhIiwgdGhhdCBoZWxwcwotICAgIC8vIHRoZSBjb3JyZXNwb25kaW5nIGV4dHJhY3RvciBpbml0aWFsaXplIGl0cyBzdGF0ZSB3aXRob3V0IGR1cGxpY2F0aW5nCi0gICAgLy8gZWZmb3J0IGFscmVhZHkgZXhlcnRlZCBieSB0aGUgc25pZmZlci4gSWYgImZyZWVNZXRhIiBpcyBnaXZlbiwgaXQgd2lsbCBiZQotICAgIC8vIGNhbGxlZCBhZ2FpbnN0IHRoZSBvcGFxdWUgb2JqZWN0IHdoZW4gaXQgaXMgbm8gbG9uZ2VyIHVzZWQuCi0gICAgdHlwZWRlZiBDcmVhdG9yRnVuYyAoKlNuaWZmZXJGdW5jKSgKLSAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICAgICAgdm9pZCAqKm1ldGEsIEZyZWVNZXRhRnVuYyAqZnJlZU1ldGEpOwotCi0gICAgdHlwZWRlZiBzdHJ1Y3QgewotICAgICAgICBjb25zdCB1aW50OF90IGJbMTZdOwotICAgIH0gdXVpZF90OwotCi0gICAgdHlwZWRlZiBzdHJ1Y3QgewotICAgICAgICAvLyB2ZXJzaW9uIG51bWJlciBvZiB0aGlzIHN0cnVjdHVyZQotICAgICAgICBjb25zdCB1aW50MzJfdCBkZWZfdmVyc2lvbjsKLQotICAgICAgICAvLyBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dHJhY3Rvci4KLSAgICAgICAgLy8gU2VlIGJlbG93IGZvciBhIGNvbnZlbmllbmNlIG1hY3JvIHRvIGNyZWF0ZSB0aGlzIGZyb20gYSBzdHJpbmcuCi0gICAgICAgIHV1aWRfdCBleHRyYWN0b3JfdXVpZDsKLQotICAgICAgICAvLyBWZXJzaW9uIG51bWJlciBvZiB0aGlzIGV4dHJhY3Rvci4gV2hlbiB0d28gZXh0cmFjdG9ycyB3aXRoIHRoZSBzYW1lCi0gICAgICAgIC8vIHV1aWQgYXJlIGVuY291bnRlcmVkLCB0aGUgb25lIHdpdGggdGhlIGxhcmdlc3QgdmVyc2lvbiBudW1iZXIgd2lsbAotICAgICAgICAvLyBiZSB1c2VkLgotICAgICAgICBjb25zdCB1aW50MzJfdCBleHRyYWN0b3JfdmVyc2lvbjsKLQotICAgICAgICAvLyBhIGh1bWFuIHJlYWRhYmxlIG5hbWUKLSAgICAgICAgY29uc3QgY2hhciAqZXh0cmFjdG9yX25hbWU7Ci0KLSAgICAgICAgLy8gdGhlIHNuaWZmZXIgZnVuY3Rpb24KLSAgICAgICAgY29uc3QgU25pZmZlckZ1bmMgc25pZmY7Ci0gICAgfSBFeHRyYWN0b3JEZWY7Ci0KLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgRVhUUkFDVE9SREVGX1ZFUlNJT04gPSAxOwotCi0gICAgdHlwZWRlZiBFeHRyYWN0b3JEZWYgKCpHZXRFeHRyYWN0b3JEZWYpKCk7Ci0KLXByb3RlY3RlZDoKLSAgICBNZWRpYUV4dHJhY3RvcigpOwotCi1wcml2YXRlOgotICAgIE1lZGlhRXh0cmFjdG9yKGNvbnN0IE1lZGlhRXh0cmFjdG9yICYpOwotICAgIE1lZGlhRXh0cmFjdG9yICZvcGVyYXRvcj0oY29uc3QgTWVkaWFFeHRyYWN0b3IgJik7Ci19OwotCi0vLyBwdXJwb3NlbHkgbm90IGRlZmluZWQgYW55d2hlcmUgc28gdGhhdCB0aGlzIHdpbGwgZmFpbCB0byBsaW5rIGlmCi0vLyBleHByZXNzaW9ucyBiZWxvdyBhcmUgbm90IGV2YWx1YXRlZCBhdCBjb21waWxlIHRpbWUKLWludCBpbnZhbGlkX3V1aWRfc3RyaW5nKGNvbnN0IGNoYXIgKik7Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KLWNvbnN0ZXhwciB1aW50OF90IF9kaWdpdEF0Xyhjb25zdCBUICgmcylbTl0sIGNvbnN0IHNpemVfdCBuKSB7Ci0gICAgcmV0dXJuIHNbbl0gPj0gJzAnICYmIHNbbl0gPD0gJzknID8gc1tuXSAtICcwJwotICAgICAgICAgICAgOiBzW25dID49ICdhJyAmJiBzW25dIDw9ICdmJyA/IHNbbl0gLSAnYScgKyAxMAotICAgICAgICAgICAgICAgICAgICA6IHNbbl0gPj0gJ0EnICYmIHNbbl0gPD0gJ0YnID8gc1tuXSAtICdBJyArIDEwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBpbnZhbGlkX3V1aWRfc3RyaW5nKCJ1dWlkOiBiYWQgZGlnaXRzIik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBULCBzaXplX3QgTj4KLWNvbnN0ZXhwciB1aW50OF90IF9oZXhCeXRlQXRfKGNvbnN0IFQgKCZzKVtOXSwgc2l6ZV90IG4pIHsKLSAgICByZXR1cm4gKF9kaWdpdEF0XyhzLCBuKSA8PCA0KSArIF9kaWdpdEF0XyhzLCBuICsgMSk7Ci19Ci0KLWNvbnN0ZXhwciBib29sIF9hc3NlcnRJc0Rhc2hfKGNoYXIgYykgewotICAgIHJldHVybiBjID09ICctJyA/IHRydWUgOiBpbnZhbGlkX3V1aWRfc3RyaW5nKCJXcm9uZyBmb3JtYXQiKTsKLX0KLQotdGVtcGxhdGUgPHNpemVfdCBOPgotY29uc3RleHByIE1lZGlhRXh0cmFjdG9yOjp1dWlkX3QgY29uc3RVVUlEKGNvbnN0IGNoYXIgKCZzKSBbTl0pIHsKLSAgICBzdGF0aWNfYXNzZXJ0KE4gPT0gMzcsICJ1dWlkOiB3cm9uZyBsZW5ndGgiKTsKLSAgICByZXR1cm4KLSAgICAgICAgICAgIF9hc3NlcnRJc0Rhc2hfKHNbOF0pLAotICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1sxM10pLAotICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1sxOF0pLAotICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1syM10pLAotICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OnV1aWRfdCB7ewotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDApLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDIpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDQpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDYpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDkpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDExKSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAxNCksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMTYpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDE5KSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAyMSksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMjQpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDI2KSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAyOCksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMzApLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDMyKSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAzNCksCi0gICAgICAgICAgICB9fTsKLX0KLS8vIENvbnZlbmllbmNlIG1hY3JvIHRvIGNyZWF0ZSBhIHV1aWRfdCBmcm9tIGEgc3RyaW5nIGxpdGVyYWwsIHdoaWNoIHNob3VsZAotLy8gYmUgZm9ybWF0dGVkIGFzICIxMjM0NTY3OC0xMjM0LTEyMzQtMTIzNC0xMjM0NTY3ODlhYmMiLCBhcyBnZW5lcmF0ZWQgYnkKLS8vIGUuZy4gaHR0cHM6Ly93d3cudXVpZGdlbmVyYXRvci5uZXQvIG9yIHRoZSAndXVpZGdlbicgbGludXggY29tbWFuZC4KLS8vIEhleCBkaWdpdHMgbWF5IGJlIHVwcGVyIG9yIGxvd2VyIGNhc2UuCi0vLwotLy8gVGhlIG1hY3JvIGNhbGwgaXMgb3RoZXJ3aXNlIGVxdWl2YWxlbnQgdG8gc3BlY2lmeWluZyB0aGUgc3RydWN0dXJlIGRpcmVjdGx5Ci0vLyAoZS5nLiBVVUlEKCI3ZDYxMzg1OC01ODM3LTRhMzgtODRjNS0zMzJkMWNkZGVlMjciKSBpcyB0aGUgc2FtZSBhcwotLy8gICAgICAge3sweDdkLCAweDYxLCAweDM4LCAweDU4LCAweDU4LCAweDM3LCAweDRhLCAweDM4LAotLy8gICAgICAgICAweDg0LCAweGM1LCAweDMzLCAweDJkLCAweDFjLCAweGRkLCAweGVlLCAweDI3fX0pCi0KLSNkZWZpbmUgVVVJRChzdHIpIFtdeyBjb25zdGV4cHIgTWVkaWFFeHRyYWN0b3I6OnV1aWRfdCB1dWlkID0gY29uc3RVVUlEKHN0cik7IHJldHVybiB1dWlkOyB9KCkKLQotCi0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTUVESUFfRVhUUkFDVE9SX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGVhNjFhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX1NPVVJDRV9CQVNFX0hfCi0KLSNkZWZpbmUgTUVESUFfU09VUkNFX0JBU0VfSF8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBNZWRpYUJ1ZmZlckJhc2U7Ci0KLWNsYXNzIFNvdXJjZUJhc2VBbGxvY1RyYWNrZXIgewotcHVibGljOgotICAgIFNvdXJjZUJhc2VBbGxvY1RyYWNrZXIoKSB7Ci0gICAgICAgIEFMT0dEKCJzb3VyY2ViYXNlIGFsbG9jYXRlZDogJXAiLCB0aGlzKTsKLSAgICB9Ci0gICAgdmlydHVhbCB+U291cmNlQmFzZUFsbG9jVHJhY2tlcigpIHsKLSAgICAgICAgQUxPR0QoInNvdXJjZWJhc2UgZnJlZWQ6ICVwIiwgdGhpcyk7Ci0gICAgfQotfTsKLQotc3RydWN0IE1lZGlhVHJhY2sKLS8vICAgIDogcHVibGljIFNvdXJjZUJhc2VBbGxvY1RyYWNrZXIKLXsKLSAgICBNZWRpYVRyYWNrKCk7Ci0KLSAgICAvLyBUbyBiZSBjYWxsZWQgYmVmb3JlIGFueSBvdGhlciBtZXRob2RzIG9uIHRoaXMgb2JqZWN0LCBleGNlcHQKLSAgICAvLyBnZXRGb3JtYXQoKS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zID0gTlVMTCkgPSAwOwotCi0gICAgLy8gQW55IGJsb2NraW5nIHJlYWQgY2FsbCByZXR1cm5zIGltbWVkaWF0ZWx5IHdpdGggYSByZXN1bHQgb2YgTk9fSU5JVC4KLSAgICAvLyBJdCBpcyBhbiBlcnJvciB0byBjYWxsIGFueSBtZXRob2RzIG90aGVyIHRoYW4gc3RhcnQgYWZ0ZXIgdGhpcyBjYWxsCi0gICAgLy8gcmV0dXJucy4gQW55IGJ1ZmZlcnMgdGhlIG9iamVjdCBtYXkgYmUgaG9sZGluZyBvbnRvIGF0IHRoZSB0aW1lIG9mCi0gICAgLy8gdGhlIHN0b3AoKSBjYWxsIGFyZSByZWxlYXNlZC4KLSAgICAvLyBBbHNvLCBpdCBpcyBpbXBlcmF0aXZlIHRoYXQgYW55IGJ1ZmZlcnMgb3V0cHV0IGJ5IHRoaXMgb2JqZWN0IGFuZAotICAgIC8vIGhlbGQgb250byBieSBjYWxsZXJzIGJlIHJlbGVhc2VkIGJlZm9yZSBhIGNhbGwgdG8gc3RvcCgpICEhIQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpID0gMDsKLQotICAgIC8vIFJldHVybnMgdGhlIGZvcm1hdCBvZiB0aGUgZGF0YSBvdXRwdXQgYnkgdGhpcyBtZWRpYSB0cmFjay4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UmIGZvcm1hdCkgPSAwOwotCi0gICAgLy8gT3B0aW9ucyB0aGF0IG1vZGlmeSByZWFkKCkgYmVoYXZpb3VyLiBUaGUgZGVmYXVsdCBpcyB0bwotICAgIC8vIGEpIG5vdCByZXF1ZXN0IGEgc2VlawotICAgIC8vIGIpIG5vdCBiZSBsYXRlLCBpLmUuIGxhdGVuZXNzX3VzID0gMAotICAgIHN0cnVjdCBSZWFkT3B0aW9ucyB7Ci0gICAgICAgIGVudW0gU2Vla01vZGUgOiBpbnQzMl90IHsKLSAgICAgICAgICAgIFNFRUtfUFJFVklPVVNfU1lOQywKLSAgICAgICAgICAgIFNFRUtfTkVYVF9TWU5DLAotICAgICAgICAgICAgU0VFS19DTE9TRVNUX1NZTkMsCi0gICAgICAgICAgICBTRUVLX0NMT1NFU1QsCi0gICAgICAgICAgICBTRUVLX0ZSQU1FX0lOREVYLAotICAgICAgICB9OwotCi0gICAgICAgIFJlYWRPcHRpb25zKCk7Ci0KLSAgICAgICAgLy8gUmVzZXQgZXZlcnl0aGluZyBiYWNrIHRvIGRlZmF1bHRzLgotICAgICAgICB2b2lkIHJlc2V0KCk7Ci0KLSAgICAgICAgdm9pZCBzZXRTZWVrVG8oaW50NjRfdCB0aW1lX3VzLCBTZWVrTW9kZSBtb2RlID0gU0VFS19DTE9TRVNUX1NZTkMpOwotICAgICAgICB2b2lkIGNsZWFyU2Vla1RvKCk7Ci0gICAgICAgIGJvb2wgZ2V0U2Vla1RvKGludDY0X3QgKnRpbWVfdXMsIFNlZWtNb2RlICptb2RlKSBjb25zdDsKLQotICAgICAgICB2b2lkIHNldE5vbkJsb2NraW5nKCk7Ci0gICAgICAgIHZvaWQgY2xlYXJOb25CbG9ja2luZygpOwotICAgICAgICBib29sIGdldE5vbkJsb2NraW5nKCkgY29uc3Q7Ci0KLSAgICAgICAgLy8gVXNlZCB0byBjbGVhciBhbGwgbm9uLXBlcnNpc3RlbnQgb3B0aW9ucyBmb3IgbXVsdGlwbGUgYnVmZmVyIHJlYWRzLgotICAgICAgICB2b2lkIGNsZWFyTm9uUGVyc2lzdGVudCgpIHsKLSAgICAgICAgICAgIGNsZWFyU2Vla1RvKCk7Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGVudW0gT3B0aW9ucyB7Ci0gICAgICAgICAgICBrU2Vla1RvX09wdGlvbiAgICAgID0gMSwKLSAgICAgICAgfTsKLQotICAgICAgICB1aW50MzJfdCBtT3B0aW9uczsKLSAgICAgICAgaW50NjRfdCBtU2Vla1RpbWVVczsKLSAgICAgICAgU2Vla01vZGUgbVNlZWtNb2RlOwotICAgICAgICBib29sIG1Ob25CbG9ja2luZzsKLSAgICB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOyAvLyBzZW50IHRocm91Z2ggQmluZGVyCi0KLSAgICAvLyBSZXR1cm5zIGEgbmV3IGJ1ZmZlciBvZiBkYXRhLiBDYWxsIGJsb2NrcyB1bnRpbCBhCi0gICAgLy8gYnVmZmVyIGlzIGF2YWlsYWJsZSwgYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQgb2YgdGhlIGVuZCBvZiB0aGUgc3RyZWFtCi0gICAgLy8gaXMgcmVhY2hlZC4KLSAgICAvLyBFbmQgb2Ygc3RyZWFtIGlzIHNpZ25hbGxlZCBieSBhIHJlc3VsdCBvZiBFUlJPUl9FTkRfT0ZfU1RSRUFNLgotICAgIC8vIEEgcmVzdWx0IG9mIElORk9fRk9STUFUX0NIQU5HRUQgaW5kaWNhdGVzIHRoYXQgdGhlIGZvcm1hdCBvZiB0aGlzCi0gICAgLy8gTWVkaWFTb3VyY2UgaGFzIGNoYW5nZWQgbWlkLXN0cmVhbSwgdGhlIGNsaWVudCBjYW4gY29udGludWUgcmVhZGluZwotICAgIC8vIGJ1dCBzaG91bGQgYmUgcHJlcGFyZWQgZm9yIGJ1ZmZlcnMgb2YgdGhlIG5ldyBjb25maWd1cmF0aW9uLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIH5NZWRpYVRyYWNrKCk7Ci0KLXByaXZhdGU6Ci0gICAgTWVkaWFUcmFjayhjb25zdCBNZWRpYVRyYWNrICYpOwotICAgIE1lZGlhVHJhY2sgJm9wZXJhdG9yPShjb25zdCBNZWRpYVRyYWNrICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBNRURJQV9TT1VSQ0VfQkFTRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9Wb3JiaXNDb21tZW50LmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL1ZvcmJpc0NvbW1lbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJhMzI5NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL1ZvcmJpc0NvbW1lbnQuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLSNpZm5kZWYgVk9SQklTX0NPTU1FTlRfSF8KLSNkZWZpbmUgVk9SQklTX0NPTU1FTlRfSF8KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBNZXRhRGF0YUJhc2U7Ci0KLXZvaWQgcGFyc2VWb3JiaXNDb21tZW50KAotICAgICAgICBNZXRhRGF0YUJhc2UgKmZpbGVNZXRhLCBjb25zdCBjaGFyICpjb21tZW50LCBzaXplX3QgY29tbWVudExlbmd0aCk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBWT1JCSVNfQ09NTUVOVF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTQ0ZDUxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDIxOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9CVUZGRVJfSF8KLQotI2RlZmluZSBNRURJQV9CVUZGRVJfSF8KLQotI2luY2x1ZGUgPGF0b21pYz4KLSNpbmNsdWRlIDxsaXN0PgotCi0jaW5jbHVkZSA8cHRocmVhZC5oPgotCi0jaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgQUJ1ZmZlcjsKLWNsYXNzIE1lZGlhQnVmZmVyOwotY2xhc3MgTWVkaWFCdWZmZXJPYnNlcnZlcjsKLWNsYXNzIE1ldGFEYXRhQmFzZTsKLQotY2xhc3MgTWVkaWFCdWZmZXIgOiBwdWJsaWMgTWVkaWFCdWZmZXJCYXNlIHsKLXB1YmxpYzoKLSAgICAvLyBhbGxvY2F0aW9ucyBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byB0aGlzIHdpbGwgdXNlIHNoYXJlZCBtZW1vcnkuCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrU2hhcmVkTWVtVGhyZXNob2xkID0gNjQgKiAxMDI0OwotCi0gICAgLy8gVGhlIHVuZGVybHlpbmcgZGF0YSByZW1haW5zIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIQotICAgIE1lZGlhQnVmZmVyKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLQotICAgIGV4cGxpY2l0IE1lZGlhQnVmZmVyKHNpemVfdCBzaXplKTsKLQotICAgIGV4cGxpY2l0IE1lZGlhQnVmZmVyKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwotCi0gICAgTWVkaWFCdWZmZXIoY29uc3Qgc3A8SU1lbW9yeT4gJm1lbSkgOgotICAgICAgICBNZWRpYUJ1ZmZlcigodWludDhfdCAqKW1lbS0+cG9pbnRlcigpICsgc2l6ZW9mKFNoYXJlZENvbnRyb2wpLCBtZW0tPnNpemUoKSkgewotICAgICAgICAvLyBkZWxlZ2F0ZSBhbmQgb3ZlcnJpZGUgbU1lbW9yeQotICAgICAgICBtTWVtb3J5ID0gbWVtOwotICAgIH0KLQotICAgIC8vIElmIE1lZGlhQnVmZmVyR3JvdXAgaXMgc2V0LCBkZWNyZW1lbnQgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudDsKLSAgICAvLyBpZiB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50IGRyb3BzIHRvIDAsIHJldHVybiB0aGUgYnVmZmVyIHRvIHRoZQotICAgIC8vIGFzc29jaWF0ZWQgTWVkaWFCdWZmZXJHcm91cC4KLSAgICAvLwotICAgIC8vIElmIG5vIE1lZGlhQnVmZmVyR3JvdXAgaXMgc2V0LCB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50IG11c3QgYmUgemVybwotICAgIC8vIHdoZW4gY2FsbGVkLCB3aGVyZXVwb24gdGhlIE1lZGlhQnVmZmVyIGlzIGRlbGV0ZWQuCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKTsKLQotICAgIC8vIEluY3JlbWVudHMgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudC4KLSAgICAvLyBVc2Ugb25seSB3aGVuIE1lZGlhQnVmZmVyR3JvdXAgaXMgc2V0LgotICAgIHZpcnR1YWwgdm9pZCBhZGRfcmVmKCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgKmRhdGEoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHNpemVfdCBzaXplKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHNpemVfdCByYW5nZV9vZmZzZXQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHNpemVfdCByYW5nZV9sZW5ndGgoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgdm9pZCBzZXRfcmFuZ2Uoc2l6ZV90IG9mZnNldCwgc2l6ZV90IGxlbmd0aCk7Ci0KLSAgICBNZXRhRGF0YUJhc2UmIG1ldGFfZGF0YSgpOwotCi0gICAgLy8gQ2xlYXJzIG1ldGEgZGF0YSBhbmQgcmVzZXRzIHRoZSByYW5nZSB0byB0aGUgZnVsbCBleHRlbnQuCi0gICAgdmlydHVhbCB2b2lkIHJlc2V0KCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0T2JzZXJ2ZXIoTWVkaWFCdWZmZXJPYnNlcnZlciAqZ3JvdXApOwotCi0gICAgLy8gUmV0dXJucyBhIGNsb25lIG9mIHRoaXMgTWVkaWFCdWZmZXIgaW5jcmVhc2luZyBpdHMgcmVmZXJlbmNlIGNvdW50LgotICAgIC8vIFRoZSBjbG9uZSByZWZlcmVuY2VzIHRoZSBzYW1lIGRhdGEgYnV0IGhhcyBpdHMgb3duIHJhbmdlIGFuZAotICAgIC8vIE1ldGFEYXRhLgotICAgIHZpcnR1YWwgTWVkaWFCdWZmZXJCYXNlICpjbG9uZSgpOwotCi0gICAgLy8gc3VtIG9mIGxvY2FsUmVmY291bnQoKSBhbmQgcmVtb3RlUmVmY291bnQoKQotICAgIHZpcnR1YWwgaW50IHJlZmNvdW50KCkgY29uc3QgewotICAgICAgICByZXR1cm4gbG9jYWxSZWZjb3VudCgpICsgcmVtb3RlUmVmY291bnQoKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGludCBsb2NhbFJlZmNvdW50KCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVJlZkNvdW50OwotICAgIH0KLQotICAgIHZpcnR1YWwgaW50IHJlbW90ZVJlZmNvdW50KCkgY29uc3QgewotICAgICAgICBpZiAobU1lbW9yeS5nZXQoKSA9PSBudWxscHRyIHx8IG1NZW1vcnktPnBvaW50ZXIoKSA9PSBudWxscHRyKSByZXR1cm4gMDsKLSAgICAgICAgaW50MzJfdCByZW1vdGVSZWZjb3VudCA9Ci0gICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxTaGFyZWRDb250cm9sICo+KG1NZW1vcnktPnBvaW50ZXIoKSktPmdldFJlbW90ZVJlZmNvdW50KCk7Ci0gICAgICAgIC8vIFNhbml0eSBjaGVjayBzbyB0aGF0IHJlbW90ZVJlZkNvdW50KCkgaXMgbm9uLW5lZ2F0aXZlLgotICAgICAgICByZXR1cm4gcmVtb3RlUmVmY291bnQgPj0gMCA/IHJlbW90ZVJlZmNvdW50IDogMDsgLy8gZG8gbm90IGFsbG93IGNvcnJ1cHRlZCBkYXRhLgotICAgIH0KLQotICAgIC8vIHJldHVybnMgb2xkIHZhbHVlCi0gICAgaW50IGFkZFJlbW90ZVJlZmNvdW50KGludDMyX3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKG1NZW1vcnkuZ2V0KCkgPT0gbnVsbHB0ciB8fCBtTWVtb3J5LT5wb2ludGVyKCkgPT0gbnVsbHB0cikgcmV0dXJuIDA7Ci0gICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFNoYXJlZENvbnRyb2wgKj4obU1lbW9yeS0+cG9pbnRlcigpKS0+YWRkUmVtb3RlUmVmY291bnQodmFsdWUpOwotICAgIH0KLQotICAgIGJvb2wgaXNEZWFkT2JqZWN0KCkgY29uc3QgewotICAgICAgICByZXR1cm4gaXNEZWFkT2JqZWN0KG1NZW1vcnkpOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sIGlzRGVhZE9iamVjdChjb25zdCBzcDxJTWVtb3J5PiAmbWVtb3J5KSB7Ci0gICAgICAgIGlmIChtZW1vcnkuZ2V0KCkgPT0gbnVsbHB0ciB8fCBtZW1vcnktPnBvaW50ZXIoKSA9PSBudWxscHRyKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFNoYXJlZENvbnRyb2wgKj4obWVtb3J5LT5wb2ludGVyKCkpLT5pc0RlYWRPYmplY3QoKTsKLSAgICB9Ci0KLSAgICAvLyBTdGlja3kgb24gZW5hYmxpbmcgb2Ygc2hhcmVkIG1lbW9yeSBNZWRpYUJ1ZmZlcnMuIEJ5IGRlZmF1bHQgd2UgZG9uJ3QgdXNlCi0gICAgLy8gc2hhcmVkIG1lbW9yeSBmb3IgTWVkaWFCdWZmZXJzLCBidXQgd2UgZW5hYmxlIHRoaXMgZm9yIHRob3NlIHByb2Nlc3NlcwotICAgIC8vIHRoYXQgZXhwb3J0IE1lZGlhQnVmZmVycy4KLSAgICBzdGF0aWMgdm9pZCB1c2VTaGFyZWRNZW1vcnkoKSB7Ci0gICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAotICAgICAgICAgICAgICAgICZtVXNlU2hhcmVkTWVtb3J5LCAoaW50X2xlYXN0MzJfdCkxLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICAvLyB0cnVlIGlmIE1lZGlhQnVmZmVyIGlzIG9ic2VydmVkIChwYXJ0IG9mIGEgTWVkaWFCdWZmZXJHcm91cCkuCi0gICAgaW5saW5lIGJvb2wgaXNPYnNlcnZlZCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1PYnNlcnZlciAhPSBudWxscHRyOwotICAgIH0KLQotICAgIHZpcnR1YWwgfk1lZGlhQnVmZmVyKCk7Ci0KLSAgICBzcDxJTWVtb3J5PiBtTWVtb3J5OwotCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBNZWRpYUJ1ZmZlckdyb3VwOwotICAgIGZyaWVuZCBjbGFzcyBPTVhEZWNvZGVyOwotICAgIGZyaWVuZCBjbGFzcyBCbk1lZGlhU291cmNlOwotICAgIGZyaWVuZCBjbGFzcyBCcE1lZGlhU291cmNlOwotCi0gICAgLy8gRm9yIHVzZSBieSBPTVhEZWNvZGVyLCByZWZlcmVuY2UgY291bnQgbXVzdCBiZSAxLCBkcm9wIHJlZmVyZW5jZQotICAgIC8vIGNvdW50IHRvIDAgd2l0aG91dCBzaWduYWxsaW5nIHRoZSBvYnNlcnZlci4KLSAgICB2b2lkIGNsYWltKCk7Ci0KLSAgICBNZWRpYUJ1ZmZlck9ic2VydmVyICptT2JzZXJ2ZXI7Ci0gICAgaW50IG1SZWZDb3VudDsKLQotICAgIHZvaWQgKm1EYXRhOwotICAgIHNpemVfdCBtU2l6ZSwgbVJhbmdlT2Zmc2V0LCBtUmFuZ2VMZW5ndGg7Ci0gICAgc3A8QUJ1ZmZlcj4gbUJ1ZmZlcjsKLQotICAgIGJvb2wgbU93bnNEYXRhOwotCi0gICAgTWV0YURhdGFCYXNlKiBtTWV0YURhdGE7Ci0KLSAgICBNZWRpYUJ1ZmZlciAqbU9yaWdpbmFsOwotCi0gICAgc3RhdGljIHN0ZDo6YXRvbWljX2ludF9sZWFzdDMyX3QgbVVzZVNoYXJlZE1lbW9yeTsKLQotICAgIE1lZGlhQnVmZmVyKGNvbnN0IE1lZGlhQnVmZmVyICYpOwotICAgIE1lZGlhQnVmZmVyICZvcGVyYXRvcj0oY29uc3QgTWVkaWFCdWZmZXIgJik7Ci0KLSAgICAvLyBTaGFyZWRDb250cm9sIGJsb2NrIGF0IHRoZSBzdGFydCBvZiBJTWVtb3J5LgotICAgIHN0cnVjdCBTaGFyZWRDb250cm9sIHsKLSAgICAgICAgZW51bSB7Ci0gICAgICAgICAgICBGTEFHX0RFQURfT0JKRUNUID0gKDEgPDwgMCksCi0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gcmV0dXJucyBvbGQgdmFsdWUKLSAgICAgICAgaW5saW5lIGludDMyX3QgYWRkUmVtb3RlUmVmY291bnQoaW50MzJfdCB2YWx1ZSkgewotICAgICAgICAgICAgcmV0dXJuIHN0ZDo6YXRvbWljX2ZldGNoX2FkZF9leHBsaWNpdCgKLSAgICAgICAgICAgICAgICAgICAgJm1SZW1vdGVSZWZjb3VudCwgKGludF9sZWFzdDMyX3QpdmFsdWUsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5saW5lIGludDMyX3QgZ2V0UmVtb3RlUmVmY291bnQoKSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4gc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCgmbVJlbW90ZVJlZmNvdW50LCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlubGluZSB2b2lkIHNldFJlbW90ZVJlZmNvdW50KGludDMyX3QgdmFsdWUpIHsKLSAgICAgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAotICAgICAgICAgICAgICAgICAgICAmbVJlbW90ZVJlZmNvdW50LCAoaW50X2xlYXN0MzJfdCl2YWx1ZSwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmxpbmUgYm9vbCBpc0RlYWRPYmplY3QoKSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4gKHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoCi0gICAgICAgICAgICAgICAgICAgICZtRmxhZ3MsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpICYgRkxBR19ERUFEX09CSkVDVCkgIT0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGlubGluZSB2b2lkIHNldERlYWRPYmplY3QoKSB7Ci0gICAgICAgICAgICAodm9pZClzdGQ6OmF0b21pY19mZXRjaF9vcl9leHBsaWNpdCgKLSAgICAgICAgICAgICAgICAgICAgJm1GbGFncywgKGludF9sZWFzdDMyX3QpRkxBR19ERUFEX09CSkVDVCwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmxpbmUgdm9pZCBjbGVhcigpIHsKLSAgICAgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAotICAgICAgICAgICAgICAgICAgICAmbUZsYWdzLCAoaW50X2xlYXN0MzJfdCkwLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKLSAgICAgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAotICAgICAgICAgICAgICAgICAgICAmbVJlbW90ZVJlZmNvdW50LCAoaW50X2xlYXN0MzJfdCkwLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKLSAgICAgICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgLy8gQ2F1dGlvbjogYXRvbWljX2ludF9mYXN0MzJfdCBpcyA2NCBiaXRzIG9uIExQNjQuCi0gICAgICAgIHN0ZDo6YXRvbWljX2ludF9sZWFzdDMyX3QgbUZsYWdzOwotICAgICAgICBzdGQ6OmF0b21pY19pbnRfbGVhc3QzMl90IG1SZW1vdGVSZWZjb3VudDsKLSAgICAgICAgaW50MzJfdCB1bnVzZWRbNl0gX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykpOyAvLyBhZGRpdGlvbmFsIGJ1ZmZlciBzcGFjZQotICAgIH07Ci0KLSAgICBpbmxpbmUgU2hhcmVkQ29udHJvbCAqZ2V0U2hhcmVkQ29udHJvbCgpIGNvbnN0IHsKLSAgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFNoYXJlZENvbnRyb2wgKj4obU1lbW9yeS0+cG9pbnRlcigpKTsKLSAgICAgfQotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBNRURJQV9CVUZGRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzhkOTRhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9CVUZGRVJfQkFTRV9IXwotCi0jZGVmaW5lIE1FRElBX0JVRkZFUl9CQVNFX0hfCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgTWVkaWFCdWZmZXJCYXNlOwotY2xhc3MgTWV0YURhdGFCYXNlOwotCi1jbGFzcyBNZWRpYUJ1ZmZlck9ic2VydmVyIHsKLXB1YmxpYzoKLSAgICBNZWRpYUJ1ZmZlck9ic2VydmVyKCkge30KLSAgICB2aXJ0dWFsIH5NZWRpYUJ1ZmZlck9ic2VydmVyKCkge30KLQotICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgPSAwOwotCi1wcml2YXRlOgotICAgIE1lZGlhQnVmZmVyT2JzZXJ2ZXIoY29uc3QgTWVkaWFCdWZmZXJPYnNlcnZlciAmKTsKLSAgICBNZWRpYUJ1ZmZlck9ic2VydmVyICZvcGVyYXRvcj0oY29uc3QgTWVkaWFCdWZmZXJPYnNlcnZlciAmKTsKLX07Ci0KLWNsYXNzIE1lZGlhQnVmZmVyQmFzZSB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIE1lZGlhQnVmZmVyQmFzZSAqQ3JlYXRlKHNpemVfdCBzaXplKTsKLQotICAgIC8vIElmIE1lZGlhQnVmZmVyR3JvdXAgaXMgc2V0LCBkZWNyZW1lbnQgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudDsKLSAgICAvLyBpZiB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50IGRyb3BzIHRvIDAsIHJldHVybiB0aGUgYnVmZmVyIHRvIHRoZQotICAgIC8vIGFzc29jaWF0ZWQgTWVkaWFCdWZmZXJHcm91cC4KLSAgICAvLwotICAgIC8vIElmIG5vIE1lZGlhQnVmZmVyR3JvdXAgaXMgc2V0LCB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50IG11c3QgYmUgemVybwotICAgIC8vIHdoZW4gY2FsbGVkLCB3aGVyZXVwb24gdGhlIE1lZGlhQnVmZmVyIGlzIGRlbGV0ZWQuCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKSA9IDA7Ci0KLSAgICAvLyBJbmNyZW1lbnRzIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQuCi0gICAgLy8gVXNlIG9ubHkgd2hlbiBNZWRpYUJ1ZmZlckdyb3VwIGlzIHNldC4KLSAgICB2aXJ0dWFsIHZvaWQgYWRkX3JlZigpID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCAqZGF0YSgpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIHNpemVfdCBzaXplKCkgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCBzaXplX3QgcmFuZ2Vfb2Zmc2V0KCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgc2l6ZV90IHJhbmdlX2xlbmd0aCgpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCBzZXRfcmFuZ2Uoc2l6ZV90IG9mZnNldCwgc2l6ZV90IGxlbmd0aCkgPSAwOwotCi0gICAgdmlydHVhbCBNZXRhRGF0YUJhc2UmIG1ldGFfZGF0YSgpID0gMDsKLQotICAgIC8vIENsZWFycyBtZXRhIGRhdGEgYW5kIHJlc2V0cyB0aGUgcmFuZ2UgdG8gdGhlIGZ1bGwgZXh0ZW50LgotICAgIHZpcnR1YWwgdm9pZCByZXNldCgpID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCBzZXRPYnNlcnZlcihNZWRpYUJ1ZmZlck9ic2VydmVyICpncm91cCkgPSAwOwotCi0gICAgLy8gUmV0dXJucyBhIGNsb25lIG9mIHRoaXMgTWVkaWFCdWZmZXJCYXNlIGluY3JlYXNpbmcgaXRzIHJlZmVyZW5jZQotICAgIC8vIGNvdW50LiBUaGUgY2xvbmUgcmVmZXJlbmNlcyB0aGUgc2FtZSBkYXRhIGJ1dCBoYXMgaXRzIG93biByYW5nZSBhbmQKLSAgICAvLyBNZXRhRGF0YS4KLSAgICB2aXJ0dWFsIE1lZGlhQnVmZmVyQmFzZSAqY2xvbmUoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIGludCByZWZjb3VudCgpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgaW50IGxvY2FsUmVmY291bnQoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBpbnQgcmVtb3RlUmVmY291bnQoKSBjb25zdCA9IDA7Ci0KLSAgICB2aXJ0dWFsIH5NZWRpYUJ1ZmZlckJhc2UoKSB7fTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTUVESUFfQlVGRkVSX0JBU0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1ZDVkZjcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9CVUZGRVJfR1JPVVBfSF8KLQotI2RlZmluZSBNRURJQV9CVUZGRVJfR1JPVVBfSF8KLQotI2luY2x1ZGUgPGxpc3Q+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgTWVkaWFCdWZmZXJCYXNlOwotCi1jbGFzcyBNZWRpYUJ1ZmZlckdyb3VwIDogcHVibGljIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgewotcHVibGljOgotICAgIE1lZGlhQnVmZmVyR3JvdXAoc2l6ZV90IGdyb3d0aExpbWl0ID0gMCk7Ci0KLSAgICAvLyBjcmVhdGUgYSBtZWRpYSBidWZmZXIgZ3JvdXAgd2l0aCBwcmVhbGxvY2F0ZWQgYnVmZmVycwotICAgIE1lZGlhQnVmZmVyR3JvdXAoc2l6ZV90IGJ1ZmZlcnMsIHNpemVfdCBidWZmZXJfc2l6ZSwgc2l6ZV90IGdyb3d0aExpbWl0ID0gMCk7Ci0KLSAgICB+TWVkaWFCdWZmZXJHcm91cCgpOwotCi0gICAgdm9pZCBhZGRfYnVmZmVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKTsKLQotICAgIGJvb2wgaGFzX2J1ZmZlcnMoKTsKLQotICAgIC8vIElmIG5vbkJsb2NraW5nIGlzIGZhbHNlLCBpdCBibG9ja3MgdW50aWwgYSBidWZmZXIgaXMgYXZhaWxhYmxlIGFuZAotICAgIC8vIHBhc3NlcyBpdCB0byB0aGUgY2FsbGVyIGluICpidWZmZXIsIHdoaWxlIHJldHVybmluZyBPSy4KLSAgICAvLyBUaGUgcmV0dXJuZWQgYnVmZmVyIHdpbGwgaGF2ZSBhIHJlZmVyZW5jZSBjb3VudCBvZiAxLgotICAgIC8vIElmIG5vbkJsb2NraW5nIGlzIHRydWUgYW5kIGEgYnVmZmVyIGlzIG5vdCBpbW1lZGlhdGVseSBhdmFpbGFibGUsCi0gICAgLy8gYnVmZmVyIGlzIHNldCB0byBOVUxMIGFuZCBpdCByZXR1cm5zIFdPVUxEX0JMT0NLLgotICAgIC8vIElmIHJlcXVlc3RlZFNpemUgaXMgMCwgYW55IGZyZWUgTWVkaWFCdWZmZXIgd2lsbCBiZSByZXR1cm5lZC4KLSAgICAvLyBJZiByZXF1ZXN0ZWRTaXplIGlzID4gMCwgdGhlIHJldHVybmVkIE1lZGlhQnVmZmVyIHNob3VsZCBoYXZlIGJ1ZmZlcgotICAgIC8vIHNpemUgb2YgYXQgbGVhc3QgcmVxdXN0ZWRTaXplLgotICAgIHN0YXR1c190IGFjcXVpcmVfYnVmZmVyKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBib29sIG5vbkJsb2NraW5nID0gZmFsc2UsIHNpemVfdCByZXF1ZXN0ZWRTaXplID0gMCk7Ci0KLSAgICBzaXplX3QgYnVmZmVycygpIGNvbnN0OwotCi0gICAgLy8gSWYgYnVmZmVyIGlzIG51bGxwdHIsIGhhdmUgYWNxdWlyZV9idWZmZXIoKSBjaGVjayBmb3IgcmVtb3RlIHJlbGVhc2UuCi0gICAgdmlydHVhbCB2b2lkIHNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKTsKLQotcHJpdmF0ZToKLSAgICBzdHJ1Y3QgSW50ZXJuYWxEYXRhOwotICAgIEludGVybmFsRGF0YSAqbUludGVybmFsOwotCi0gICAgTWVkaWFCdWZmZXJHcm91cChjb25zdCBNZWRpYUJ1ZmZlckdyb3VwICYpOwotICAgIE1lZGlhQnVmZmVyR3JvdXAgJm9wZXJhdG9yPShjb25zdCBNZWRpYUJ1ZmZlckdyb3VwICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBNRURJQV9CVUZGRVJfR1JPVVBfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmUzNGU4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVUQV9EQVRBX0JBU0VfSF8KLQotI2RlZmluZSBNRVRBX0RBVEFfQkFTRV9IXwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gVGhlIGZvbGxvd2luZyBrZXlzIG1hcCB0byBpbnQzMl90IGRhdGEgdW5sZXNzIGluZGljYXRlZCBvdGhlcndpc2UuCi1lbnVtIHsKLSAgICBrS2V5TUlNRVR5cGUgICAgICAgICAgPSAnbWltZScsICAvLyBjc3RyaW5nCi0gICAga0tleVdpZHRoICAgICAgICAgICAgID0gJ3dpZHQnLCAgLy8gaW50MzJfdCwgaW1hZ2UgcGl4ZWwKLSAgICBrS2V5SGVpZ2h0ICAgICAgICAgICAgPSAnaGVpZycsICAvLyBpbnQzMl90LCBpbWFnZSBwaXhlbAotICAgIGtLZXlEaXNwbGF5V2lkdGggICAgICA9ICdkV2lkJywgIC8vIGludDMyX3QsIGRpc3BsYXkvcHJlc2VudGF0aW9uCi0gICAga0tleURpc3BsYXlIZWlnaHQgICAgID0gJ2RIZ3QnLCAgLy8gaW50MzJfdCwgZGlzcGxheS9wcmVzZW50YXRpb24KLSAgICBrS2V5U0FSV2lkdGggICAgICAgICAgPSAnc2FyVycsICAvLyBpbnQzMl90LCBzYW1wbGVBc3BlY3RSYXRpbyB3aWR0aAotICAgIGtLZXlTQVJIZWlnaHQgICAgICAgICA9ICdzYXJIJywgIC8vIGludDMyX3QsIHNhbXBsZUFzcGVjdFJhdGlvIGhlaWdodAotICAgIGtLZXlUaHVtYm5haWxXaWR0aCAgICA9ICd0aGJXJywgIC8vIGludDMyX3QsIHRodW1ibmFpbCB3aWR0aAotICAgIGtLZXlUaHVtYm5haWxIZWlnaHQgICA9ICd0aGJIJywgIC8vIGludDMyX3QsIHRodW1ibmFpbCBoZWlnaHQKLQotICAgIC8vIGEgcmVjdGFuZ2xlLCBpZiBhYnNlbnQgYXNzdW1lZCB0byBiZSAoMCwgMCwgd2lkdGggLSAxLCBoZWlnaHQgLSAxKQotICAgIGtLZXlDcm9wUmVjdCAgICAgICAgICA9ICdjcm9wJywKLQotICAgIGtLZXlSb3RhdGlvbiAgICAgICAgICA9ICdyb3RBJywgIC8vIGludDMyX3QgKGFuZ2xlIGluIGRlZ3JlZXMpCi0gICAga0tleUlGcmFtZXNJbnRlcnZhbCAgID0gJ2lmaXYnLCAgLy8gaW50MzJfdAotICAgIGtLZXlTdHJpZGUgICAgICAgICAgICA9ICdzdHJkJywgIC8vIGludDMyX3QKLSAgICBrS2V5U2xpY2VIZWlnaHQgICAgICAgPSAnc2xodCcsICAvLyBpbnQzMl90Ci0gICAga0tleUNoYW5uZWxDb3VudCAgICAgID0gJyNjaG4nLCAgLy8gaW50MzJfdAotICAgIGtLZXlDaGFubmVsTWFzayAgICAgICA9ICdjaG5tJywgIC8vIGludDMyX3QKLSAgICBrS2V5U2FtcGxlUmF0ZSAgICAgICAgPSAnc3J0ZScsICAvLyBpbnQzMl90IChhdWRpbyBzYW1wbGluZyByYXRlIEh6KQotICAgIGtLZXlQY21FbmNvZGluZyAgICAgICA9ICdQQ01lJywgIC8vIGludDMyX3QgKGF1ZGlvIGVuY29kaW5nIGVudW0pCi0gICAga0tleUZyYW1lUmF0ZSAgICAgICAgID0gJ2ZybVInLCAgLy8gaW50MzJfdCAodmlkZW8gZnJhbWUgcmF0ZSBmcHMpCi0gICAga0tleUJpdFJhdGUgICAgICAgICAgID0gJ2JydGUnLCAgLy8gaW50MzJfdCAoYnBzKQotICAgIGtLZXlNYXhCaXRSYXRlICAgICAgICA9ICdteEJyJywgIC8vIGludDMyX3QgKGJwcykKLSAgICBrS2V5U3RyZWFtSGVhZGVyICAgICAgPSAnc3RIZCcsICAvLyByYXcgZGF0YQotICAgIGtLZXlFU0RTICAgICAgICAgICAgICA9ICdlc2RzJywgIC8vIHJhdyBkYXRhCi0gICAga0tleUFBQ1Byb2ZpbGUgICAgICAgID0gJ2FhY3AnLCAgLy8gaW50MzJfdAotICAgIGtLZXlBVkNDICAgICAgICAgICAgICA9ICdhdmNjJywgIC8vIHJhdyBkYXRhCi0gICAga0tleUhWQ0MgICAgICAgICAgICAgID0gJ2h2Y2MnLCAgLy8gcmF3IGRhdGEKLSAgICBrS2V5VGh1bWJuYWlsSFZDQyAgICAgPSAndGh2YycsICAvLyByYXcgZGF0YQotICAgIGtLZXlEMjYzICAgICAgICAgICAgICA9ICdkMjYzJywgIC8vIHJhdyBkYXRhCi0gICAga0tleVZvcmJpc0luZm8gICAgICAgID0gJ3ZpbmYnLCAgLy8gcmF3IGRhdGEKLSAgICBrS2V5Vm9yYmlzQm9va3MgICAgICAgPSAndmJvbycsICAvLyByYXcgZGF0YQotICAgIGtLZXlPcHVzSGVhZGVyICAgICAgICA9ICdvaGRyJywgIC8vIHJhdyBkYXRhCi0gICAga0tleU9wdXNDb2RlY0RlbGF5ICAgID0gJ29jb2QnLCAgLy8gdWludDY0X3QgKGNvZGVjIGRlbGF5IGluIG5zKQotICAgIGtLZXlPcHVzU2Vla1ByZVJvbGwgICA9ICdvc3ByJywgIC8vIHVpbnQ2NF90IChzZWVrIHByZXJvbGwgaW4gbnMpCi0gICAga0tleUZsYWNNZXRhZGF0YSAgICAgID0gJ2ZsTWQnLCAgLy8gcmF3IGRhdGEKLSAgICBrS2V5VnA5Q29kZWNQcml2YXRlICAgPSAndnA5cCcsICAvLyByYXcgZGF0YSAodnA5IGNzZCBpbmZvcm1hdGlvbikKLSAgICBrS2V5V2FudHNOQUxGcmFnbWVudHMgPSAnTkFMZicsCi0gICAga0tleUlzU3luY0ZyYW1lICAgICAgID0gJ3N5bmMnLCAgLy8gaW50MzJfdCAoYm9vbCkKLSAgICBrS2V5SXNDb2RlY0NvbmZpZyAgICAgPSAnY29uZicsICAvLyBpbnQzMl90IChib29sKQotICAgIGtLZXlJc011eGVyRGF0YSAgICAgICA9ICdtdXhkJywgIC8vIGludDMyX3QgKGJvb2wpCi0gICAga0tleVRpbWUgICAgICAgICAgICAgID0gJ3RpbWUnLCAgLy8gaW50NjRfdCAodXNlY3MpCi0gICAga0tleURlY29kaW5nVGltZSAgICAgID0gJ2RlY1QnLCAgLy8gaW50NjRfdCAoZGVjb2RpbmcgdGltZXN0YW1wIGluIHVzZWNzKQotICAgIGtLZXlOVFBUaW1lICAgICAgICAgICA9ICdudHBUJywgIC8vIHVpbnQ2NF90IChudHAtdGltZXN0YW1wKQotICAgIGtLZXlUYXJnZXRUaW1lICAgICAgICA9ICd0YXJUJywgIC8vIGludDY0X3QgKHVzZWNzKQotICAgIGtLZXlEcmlmdFRpbWUgICAgICAgICA9ICdkZnRUJywgIC8vIGludDY0X3QgKHVzZWNzKQotICAgIGtLZXlBbmNob3JUaW1lICAgICAgICA9ICdhbmNUJywgIC8vIGludDY0X3QgKHVzZWNzKQotICAgIGtLZXlEdXJhdGlvbiAgICAgICAgICA9ICdkdXJhJywgIC8vIGludDY0X3QgKHVzZWNzKQotICAgIGtLZXlQaXhlbEZvcm1hdCAgICAgICA9ICdwaXhmJywgIC8vIGludDMyX3QKLSAgICBrS2V5Q29sb3JGb3JtYXQgICAgICAgPSAnY29sZicsICAvLyBpbnQzMl90Ci0gICAga0tleUNvbG9yU3BhY2UgICAgICAgID0gJ2NvbHMnLCAgLy8gaW50MzJfdAotICAgIGtLZXlQbGF0Zm9ybVByaXZhdGUgICA9ICdwcml2JywgIC8vIHBvaW50ZXIKLSAgICBrS2V5RGVjb2RlckNvbXBvbmVudCAgPSAnZGVjQycsICAvLyBjc3RyaW5nCi0gICAga0tleUJ1ZmZlcklEICAgICAgICAgID0gJ2JmSUQnLAotICAgIGtLZXlNYXhJbnB1dFNpemUgICAgICA9ICdpbnBTJywKLSAgICBrS2V5TWF4V2lkdGggICAgICAgICAgPSAnbWF4VycsCi0gICAga0tleU1heEhlaWdodCAgICAgICAgID0gJ21heEgnLAotICAgIGtLZXlUaHVtYm5haWxUaW1lICAgICA9ICd0aGJUJywgIC8vIGludDY0X3QgKHVzZWNzKQotICAgIGtLZXlUcmFja0lEICAgICAgICAgICA9ICd0cklEJywKLSAgICBrS2V5SXNEUk0gICAgICAgICAgICAgPSAnaWRybScsICAvLyBpbnQzMl90IChib29sKQotICAgIGtLZXlFbmNvZGVyRGVsYXkgICAgICA9ICdlbmNkJywgIC8vIGludDMyX3QgKGZyYW1lcykKLSAgICBrS2V5RW5jb2RlclBhZGRpbmcgICAgPSAnZW5jcCcsICAvLyBpbnQzMl90IChmcmFtZXMpCi0KLSAgICBrS2V5QWxidW0gICAgICAgICAgICAgPSAnYWxidScsICAvLyBjc3RyaW5nCi0gICAga0tleUFydGlzdCAgICAgICAgICAgID0gJ2FydGknLCAgLy8gY3N0cmluZwotICAgIGtLZXlBbGJ1bUFydGlzdCAgICAgICA9ICdhYXJ0JywgIC8vIGNzdHJpbmcKLSAgICBrS2V5Q29tcG9zZXIgICAgICAgICAgPSAnY29tcCcsICAvLyBjc3RyaW5nCi0gICAga0tleUdlbnJlICAgICAgICAgICAgID0gJ2dlbnInLCAgLy8gY3N0cmluZwotICAgIGtLZXlUaXRsZSAgICAgICAgICAgICA9ICd0aXRsJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5WWVhciAgICAgICAgICAgICAgPSAneWVhcicsICAvLyBjc3RyaW5nCi0gICAga0tleUFsYnVtQXJ0ICAgICAgICAgID0gJ2FsYkEnLCAgLy8gY29tcHJlc3NlZCBpbWFnZSBkYXRhCi0gICAga0tleUFsYnVtQXJ0TUlNRSAgICAgID0gJ2FsQU0nLCAgLy8gY3N0cmluZwotICAgIGtLZXlBdXRob3IgICAgICAgICAgICA9ICdhdXRoJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5Q0RUcmFja051bWJlciAgICAgPSAnY2R0cicsICAvLyBjc3RyaW5nCi0gICAga0tleURpc2NOdW1iZXIgICAgICAgID0gJ2RudW0nLCAgLy8gY3N0cmluZwotICAgIGtLZXlEYXRlICAgICAgICAgICAgICA9ICdkYXRlJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5V3JpdGVyICAgICAgICAgICAgPSAnd3JpdCcsICAvLyBjc3RyaW5nCi0gICAga0tleUNvbXBpbGF0aW9uICAgICAgID0gJ2NwaWwnLCAgLy8gY3N0cmluZwotICAgIGtLZXlMb2NhdGlvbiAgICAgICAgICA9ICdsb2MgJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5VGltZVNjYWxlICAgICAgICAgPSAndG1zbCcsICAvLyBpbnQzMl90Ci0gICAga0tleUNhcHR1cmVGcmFtZXJhdGUgID0gJ2NhcEYnLCAgLy8gZmxvYXQgKGNhcHR1cmUgZnBzKQotCi0gICAgLy8gdmlkZW8gcHJvZmlsZSBhbmQgbGV2ZWwKLSAgICBrS2V5VmlkZW9Qcm9maWxlICAgICAgPSAndnByZicsICAvLyBpbnQzMl90Ci0gICAga0tleVZpZGVvTGV2ZWwgICAgICAgID0gJ3ZsZXYnLCAgLy8gaW50MzJfdAotCi0gICAgLy8gU2V0IHRoaXMga2V5IHRvIGVuYWJsZSBhdXRob3JpbmcgZmlsZXMgaW4gNjQtYml0IG9mZnNldAotICAgIGtLZXk2NEJpdEZpbGVPZmZzZXQgICA9ICdmb2J0JywgIC8vIGludDMyX3QgKGJvb2wpCi0gICAga0tleTJCeXRlTmFsTGVuZ3RoICAgID0gJzJOQUwnLCAgLy8gaW50MzJfdCAoYm9vbCkKLQotICAgIC8vIElkZW50aWZ5IHRoZSBmaWxlIG91dHB1dCBmb3JtYXQgZm9yIGF1dGhvcmluZwotICAgIC8vIFBsZWFzZSBzZWUgPG1lZGlhL21lZGlhcmVjb3JkZXIuaD4gZm9yIHRoZSBzdXBwb3J0ZWQKLSAgICAvLyBmaWxlIG91dHB1dCBmb3JtYXRzLgotICAgIGtLZXlGaWxlVHlwZSAgICAgICAgICA9ICdmdHlwJywgIC8vIGludDMyX3QKLQotICAgIC8vIFRyYWNrIGF1dGhvcmluZyBwcm9ncmVzcyBzdGF0dXMKLSAgICAvLyBrS2V5VHJhY2tUaW1lU3RhdHVzIGlzIHVzZWQgdG8gdHJhY2sgcHJvZ3Jlc3MgaW4gZWxhcHNlZCB0aW1lCi0gICAga0tleVRyYWNrVGltZVN0YXR1cyAgID0gJ3RrdG0nLCAgLy8gaW50NjRfdAotCi0gICAga0tleVJlYWxUaW1lUmVjb3JkaW5nID0gJ3J0cmMnLCAgLy8gYm9vbCAoaW50MzJfdCkKLSAgICBrS2V5TnVtQnVmZmVycyAgICAgICAgPSAnbmJiZicsICAvLyBpbnQzMl90Ci0KLSAgICAvLyBPZ2cgZmlsZXMgY2FuIGJlIHRhZ2dlZCB0byBiZSBhdXRvbWF0aWNhbGx5IGxvb3BpbmcuLi4KLSAgICBrS2V5QXV0b0xvb3AgICAgICAgICAgPSAnYXV0TCcsICAvLyBib29sIChpbnQzMl90KQotCi0gICAga0tleVZhbGlkU2FtcGxlcyAgICAgID0gJ3ZhbEQnLCAgLy8gaW50MzJfdAotCi0gICAga0tleUlzVW5yZWFkYWJsZSAgICAgID0gJ3VucmUnLCAgLy8gYm9vbCAoaW50MzJfdCkKLQotICAgIC8vIEFuIGluZGljYXRpb24gdGhhdCBhIHZpZGVvIGJ1ZmZlciBoYXMgYmVlbiByZW5kZXJlZC4KLSAgICBrS2V5UmVuZGVyZWQgICAgICAgICAgPSAncmVuZCcsICAvLyBib29sIChpbnQzMl90KQotCi0gICAgLy8gVGhlIGxhbmd1YWdlIGNvZGUgZm9yIHRoaXMgbWVkaWEKLSAgICBrS2V5TWVkaWFMYW5ndWFnZSAgICAgPSAnbGFuZycsICAvLyBjc3RyaW5nCi0KLSAgICAvLyBUbyBzdG9yZSB0aGUgdGltZWQgdGV4dCBmb3JtYXQgZGF0YQotICAgIGtLZXlUZXh0Rm9ybWF0RGF0YSAgICA9ICd0ZXh0JywgIC8vIHJhdyBkYXRhCi0KLSAgICBrS2V5UmVxdWlyZXNTZWN1cmVCdWZmZXJzID0gJ3NlY3UnLCAgLy8gYm9vbCAoaW50MzJfdCkKLQotICAgIGtLZXlJc0FEVFMgICAgICAgICAgICA9ICdhZHRzJywgIC8vIGJvb2wgKGludDMyX3QpCi0gICAga0tleUFBQ0FPVCAgICAgICAgICAgID0gJ2Fhb3QnLCAgLy8gaW50MzJfdAotCi0gICAgLy8gSWYgYSBNZWRpYUJ1ZmZlcidzIGRhdGEgcmVwcmVzZW50cyAoYXQgbGVhc3QgcGFydGlhbGx5KSBlbmNyeXB0ZWQKLSAgICAvLyBkYXRhLCB0aGUgZm9sbG93aW5nIGZpZWxkcyBhaWQgaW4gZGVjcnlwdGlvbi4KLSAgICAvLyBUaGUgZGF0YSBjYW4gYmUgdGhvdWdodCBvZiBhcyBwYWlycyBvZiBwbGFpbiBhbmQgZW5jcnlwdGVkIGRhdGEKLSAgICAvLyBmcmFnbWVudHMsIGkuZS4gcGxhaW4gYW5kIGVuY3J5cHRlZCBkYXRhIGFsdGVybmF0ZS4KLSAgICAvLyBUaGUgZmlyc3QgZnJhZ21lbnQgaXMgYnkgY29udmVudGlvbiBwbGFpbiBkYXRhIChpZiB0aGF0J3Mgbm90IHRoZQotICAgIC8vIGNhc2UsIHNpbXBseSBzcGVjaWZ5IHBsYWluIGZyYWdtZW50IHNpemUgb2YgMCkuCi0gICAgLy8ga0tleUVuY3J5cHRlZFNpemVzIGFuZCBrS2V5UGxhaW5TaXplcyBlYWNoIG1hcCB0byBhbiBhcnJheSBvZgotICAgIC8vIHNpemVfdCB2YWx1ZXMuIFRoZSBzdW0gdG90YWwgb2YgYWxsIHNpemVfdCB2YWx1ZXMgb2YgYm90aCBhcnJheXMKLSAgICAvLyBtdXN0IGVxdWFsIHRoZSBhbW91bnQgb2YgZGF0YSAoaS5lLiBNZWRpYUJ1ZmZlcidzIHJhbmdlX2xlbmd0aCgpKS4KLSAgICAvLyBJZiBib3RoIGFycmF5cyBhcmUgcHJlc2VudCwgdGhleSBtdXN0IGJlIG9mIHRoZSBzYW1lIHNpemUuCi0gICAgLy8gSWYgb25seSBlbmNyeXB0ZWQgc2l6ZXMgYXJlIHByZXNlbnQgaXQgaXMgYXNzdW1lZCB0aGF0IGFsbAotICAgIC8vIHBsYWluIHNpemVzIGFyZSAwLCBpLmUuIGFsbCBmcmFnbWVudHMgYXJlIGVuY3J5cHRlZC4KLSAgICAvLyBUbyBwcm9ncmFtbWF0aWNhbGx5IHNldCB0aGVzZSBhcnJheSwgdXNlIHRoZSBNZXRhRGF0YUJhc2U6OnNldERhdGEgQVBJLCBpLmUuCi0gICAgLy8gY29uc3Qgc2l6ZV90IGVuY1NpemVzW107Ci0gICAgLy8gbWV0YS0+c2V0RGF0YSgKLSAgICAvLyAga0tleUVuY3J5cHRlZFNpemVzLCAwIC8qIHR5cGUgKi8sIGVuY1NpemVzLCBzaXplb2YoZW5jU2l6ZXMpKTsKLSAgICAvLyBBIHBsYWluIHNpemVzIGFycmF5IGJ5IGl0c2VsZiBtYWtlcyBubyBzZW5zZS4KLSAgICBrS2V5RW5jcnlwdGVkU2l6ZXMgICAgPSAnZW5jcicsICAvLyBzaXplX3RbXQotICAgIGtLZXlQbGFpblNpemVzICAgICAgICA9ICdwbGFpJywgIC8vIHNpemVfdFtdCi0gICAga0tleUNyeXB0b0tleSAgICAgICAgID0gJ2NyeUsnLCAgLy8gdWludDhfdFsxNl0KLSAgICBrS2V5Q3J5cHRvSVYgICAgICAgICAgPSAnY3J5SScsICAvLyB1aW50OF90WzE2XQotICAgIGtLZXlDcnlwdG9Nb2RlICAgICAgICA9ICdjcnlNJywgIC8vIGludDMyX3QKLQotICAgIGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplID0gJ2NyeVMnLCAgLy8gaW50MzJfdAotCi0gICAga0tleVBzc2ggICAgICAgICAgICAgID0gJ3Bzc2gnLCAgLy8gcmF3IGRhdGEKLSAgICBrS2V5Q0FTeXN0ZW1JRCAgICAgICAgPSAnY2FpZCcsICAvLyBpbnQzMl90Ci0gICAga0tleUNBU2Vzc2lvbklEICAgICAgID0gJ3NlaWQnLCAgLy8gcmF3IGRhdGEKLQotICAgIGtLZXlFbmNyeXB0ZWRCeXRlQmxvY2sgPSAnY2JsaycsICAvLyB1aW50OF90Ci0gICAga0tleVNraXBCeXRlQmxvY2sgICAgID0gJ3NibGsnLCAgLy8gdWludDhfdAotCi0gICAgLy8gUGxlYXNlIHNlZSBNZWRpYUZvcm1hdC5LRVlfSVNfQVVUT1NFTEVDVC4KLSAgICBrS2V5VHJhY2tJc0F1dG9zZWxlY3QgPSAnYXV0bycsIC8vIGJvb2wgKGludDMyX3QpCi0gICAgLy8gUGxlYXNlIHNlZSBNZWRpYUZvcm1hdC5LRVlfSVNfREVGQVVMVC4KLSAgICBrS2V5VHJhY2tJc0RlZmF1bHQgICAgPSAnZGZsdCcsIC8vIGJvb2wgKGludDMyX3QpCi0gICAgLy8gU2ltaWxhciB0byBNZWRpYUZvcm1hdC5LRVlfSVNfRk9SQ0VEX1NVQlRJVExFIGJ1dCBwZXJ0YWlucyB0byBhdiB0cmFja3MgYXMgd2VsbC4KLSAgICBrS2V5VHJhY2tJc0ZvcmNlZCAgICAgPSAnZnJjZCcsIC8vIGJvb2wgKGludDMyX3QpCi0KLSAgICAvLyBIMjY0IHN1cHBsZW1lbnRhbCBlbmhhbmNlbWVudCBpbmZvcm1hdGlvbiBvZmZzZXRzL3NpemVzCi0gICAga0tleVNFSSAgICAgICAgICAgICAgID0gJ3NlaSAnLCAvLyByYXcgZGF0YQotCi0gICAgLy8gTVBFRyB1c2VyIGRhdGEgb2Zmc2V0cwotICAgIGtLZXlNcGVnVXNlckRhdGEgICAgICA9ICdtcHVkJywgLy8gc2l6ZV90W10KLQotICAgIC8vIFNpemUgb2YgTkFMVSBsZW5ndGggaW4gbWt2L21wNAotICAgIGtLZXlOYWxMZW5ndGhTaXplICAgICA9ICduYWxzJywgLy8gaW50MzJfdAotCi0gICAgLy8gSERSIHJlbGF0ZWQKLSAgICBrS2V5SGRyU3RhdGljSW5mbyAgICA9ICdoZHJTJywgLy8gSERSU3RhdGljSW5mbwotCi0gICAgLy8gY29sb3IgYXNwZWN0cwotICAgIGtLZXlDb2xvclJhbmdlICAgICAgID0gJ2NSbmcnLCAvLyBpbnQzMl90LCBjb2xvciByYW5nZSwgdmFsdWUgZGVmaW5lZCBieSBDb2xvckFzcGVjdHMuUmFuZ2UKLSAgICBrS2V5Q29sb3JQcmltYXJpZXMgICA9ICdjUHJtJywgLy8gaW50MzJfdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sb3IgUHJpbWFyaWVzLCB2YWx1ZSBkZWZpbmVkIGJ5IENvbG9yQXNwZWN0cy5QcmltYXJpZXMKLSAgICBrS2V5VHJhbnNmZXJGdW5jdGlvbiA9ICd0RnVuJywgLy8gaW50MzJfdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhbnNmZXIgRnVuY3Rpb24sIHZhbHVlIGRlZmluZWQgYnkgQ29sb3JBc3BlY3RzLlRyYW5zZmVyLgotICAgIGtLZXlDb2xvck1hdHJpeCAgICAgID0gJ2NNdHgnLCAvLyBpbnQzMl90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xvciBNYXRyaXgsIHZhbHVlIGRlZmluZWQgYnkgQ29sb3JBc3BlY3RzLk1hdHJpeENvZWZmcy4KLSAgICBrS2V5VGVtcG9yYWxMYXllcklkICA9ICdpTHlyJywgLy8gaW50MzJfdCwgdGVtcG9yYWwgbGF5ZXItaWQuIDAtYmFzZWQgKDAgPT4gYmFzZSBsYXllcikKLSAgICBrS2V5VGVtcG9yYWxMYXllckNvdW50ID0gJ2NMeXInLCAvLyBpbnQzMl90LCBudW1iZXIgb2YgdGVtcG9yYWwgbGF5ZXJzIGVuY29kZWQKLQotICAgIGtLZXlUaWxlV2lkdGggICAgICAgID0gJ3RpbFcnLCAvLyBpbnQzMl90LCBIRUlGIHRpbGUgd2lkdGgKLSAgICBrS2V5VGlsZUhlaWdodCAgICAgICA9ICd0aWxIJywgLy8gaW50MzJfdCwgSEVJRiB0aWxlIGhlaWdodAotICAgIGtLZXlHcmlkUm93cyAgICAgICAgID0gJ2dyZFInLCAvLyBpbnQzMl90LCBIRUlGIGdyaWQgcm93cwotICAgIGtLZXlHcmlkQ29scyAgICAgICAgID0gJ2dyZEMnLCAvLyBpbnQzMl90LCBIRUlGIGdyaWQgY29sdW1ucwotICAgIGtLZXlJY2NQcm9maWxlICAgICAgID0gJ3Byb2YnLCAvLyByYXcgZGF0YSwgSUNDIHByb2ZpbGUgZGF0YQotICAgIGtLZXlJc1ByaW1hcnlJbWFnZSAgID0gJ3ByaW0nLCAvLyBib29sIChpbnQzMl90KSwgaW1hZ2UgdHJhY2sgaXMgdGhlIHByaW1hcnkgaW1hZ2UKLSAgICBrS2V5RnJhbWVDb3VudCAgICAgICA9ICduZnJtJywgLy8gaW50MzJfdCwgdG90YWwgbnVtYmVyIG9mIGZyYW1lIGluIHZpZGVvIHRyYWNrCi0gICAga0tleUV4aWZPZmZzZXQgICAgICAgPSAnZXhvZicsIC8vIGludDY0X3QsIEV4aWYgZGF0YSBvZmZzZXQKLSAgICBrS2V5RXhpZlNpemUgICAgICAgICA9ICdleHN6JywgLy8gaW50NjRfdCwgRXhpZiBkYXRhIHNpemUKLSAgICBrS2V5SXNFeGlmICAgICAgICAgICA9ICdleGlmJywgLy8gYm9vbCAoaW50MzJfdCkgYnVmZmVyIGNvbnRhaW5zIGV4aWYgZGF0YSBibG9jawotfTsKLQotZW51bSB7Ci0gICAga1R5cGVFU0RTICAgICAgICA9ICdlc2RzJywKLSAgICBrVHlwZUFWQ0MgICAgICAgID0gJ2F2Y2MnLAotICAgIGtUeXBlSFZDQyAgICAgICAgPSAnaHZjYycsCi0gICAga1R5cGVEMjYzICAgICAgICA9ICdkMjYzJywKLX07Ci0KLWVudW0gewotICAgIGtDcnlwdG9Nb2RlVW5lbmNyeXB0ZWQgPSAwLAotICAgIGtDcnlwdG9Nb2RlQWVzQ3RyICAgICAgPSAxLAotICAgIGtDcnlwdG9Nb2RlQWVzQ2JjICAgICAgPSAyLAotfTsKLQotY2xhc3MgUGFyY2VsOwotCi1jbGFzcyBNZXRhRGF0YUJhc2UgewotcHVibGljOgotICAgIE1ldGFEYXRhQmFzZSgpOwotICAgIE1ldGFEYXRhQmFzZShjb25zdCBNZXRhRGF0YUJhc2UgJmZyb20pOwotICAgIE1ldGFEYXRhQmFzZSYgb3BlcmF0b3IgPSAoY29uc3QgTWV0YURhdGFCYXNlICYpOwotCi0gICAgdmlydHVhbCB+TWV0YURhdGFCYXNlKCk7Ci0KLSAgICBlbnVtIFR5cGUgewotICAgICAgICBUWVBFX05PTkUgICAgID0gJ25vbmUnLAotICAgICAgICBUWVBFX0NfU1RSSU5HID0gJ2NzdHInLAotICAgICAgICBUWVBFX0lOVDMyICAgID0gJ2luMzInLAotICAgICAgICBUWVBFX0lOVDY0ICAgID0gJ2luNjQnLAotICAgICAgICBUWVBFX0ZMT0FUICAgID0gJ2Zsb2EnLAotICAgICAgICBUWVBFX1BPSU5URVIgID0gJ3B0ciAnLAotICAgICAgICBUWVBFX1JFQ1QgICAgID0gJ3JlY3QnLAotICAgIH07Ci0KLSAgICB2b2lkIGNsZWFyKCk7Ci0gICAgYm9vbCByZW1vdmUodWludDMyX3Qga2V5KTsKLQotICAgIGJvb2wgc2V0Q1N0cmluZyh1aW50MzJfdCBrZXksIGNvbnN0IGNoYXIgKnZhbHVlKTsKLSAgICBib29sIHNldEludDMyKHVpbnQzMl90IGtleSwgaW50MzJfdCB2YWx1ZSk7Ci0gICAgYm9vbCBzZXRJbnQ2NCh1aW50MzJfdCBrZXksIGludDY0X3QgdmFsdWUpOwotICAgIGJvb2wgc2V0RmxvYXQodWludDMyX3Qga2V5LCBmbG9hdCB2YWx1ZSk7Ci0gICAgYm9vbCBzZXRQb2ludGVyKHVpbnQzMl90IGtleSwgdm9pZCAqdmFsdWUpOwotCi0gICAgYm9vbCBzZXRSZWN0KAotICAgICAgICAgICAgdWludDMyX3Qga2V5LAotICAgICAgICAgICAgaW50MzJfdCBsZWZ0LCBpbnQzMl90IHRvcCwKLSAgICAgICAgICAgIGludDMyX3QgcmlnaHQsIGludDMyX3QgYm90dG9tKTsKLQotICAgIGJvb2wgZmluZENTdHJpbmcodWludDMyX3Qga2V5LCBjb25zdCBjaGFyICoqdmFsdWUpIGNvbnN0OwotICAgIGJvb2wgZmluZEludDMyKHVpbnQzMl90IGtleSwgaW50MzJfdCAqdmFsdWUpIGNvbnN0OwotICAgIGJvb2wgZmluZEludDY0KHVpbnQzMl90IGtleSwgaW50NjRfdCAqdmFsdWUpIGNvbnN0OwotICAgIGJvb2wgZmluZEZsb2F0KHVpbnQzMl90IGtleSwgZmxvYXQgKnZhbHVlKSBjb25zdDsKLSAgICBib29sIGZpbmRQb2ludGVyKHVpbnQzMl90IGtleSwgdm9pZCAqKnZhbHVlKSBjb25zdDsKLQotICAgIGJvb2wgZmluZFJlY3QoCi0gICAgICAgICAgICB1aW50MzJfdCBrZXksCi0gICAgICAgICAgICBpbnQzMl90ICpsZWZ0LCBpbnQzMl90ICp0b3AsCi0gICAgICAgICAgICBpbnQzMl90ICpyaWdodCwgaW50MzJfdCAqYm90dG9tKSBjb25zdDsKLQotICAgIGJvb2wgc2V0RGF0YSh1aW50MzJfdCBrZXksIHVpbnQzMl90IHR5cGUsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLQotICAgIGJvb2wgZmluZERhdGEodWludDMyX3Qga2V5LCB1aW50MzJfdCAqdHlwZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKipkYXRhLCBzaXplX3QgKnNpemUpIGNvbnN0OwotCi0gICAgYm9vbCBoYXNEYXRhKHVpbnQzMl90IGtleSkgY29uc3Q7Ci0KLSAgICBTdHJpbmc4IHRvU3RyaW5nKCkgY29uc3Q7Ci0gICAgdm9pZCBkdW1wVG9Mb2coKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgQnBNZWRpYVNvdXJjZTsKLSAgICBmcmllbmQgY2xhc3MgQm5NZWRpYVNvdXJjZTsKLSAgICBmcmllbmQgY2xhc3MgQm5NZWRpYUV4dHJhY3RvcjsKLSAgICBmcmllbmQgY2xhc3MgTWV0YURhdGE7Ci0KLSAgICBzdHJ1Y3QgdHlwZWRfZGF0YTsKLSAgICBzdHJ1Y3QgUmVjdDsKLSAgICBzdHJ1Y3QgTWV0YURhdGFJbnRlcm5hbDsKLSAgICBNZXRhRGF0YUludGVybmFsICptSW50ZXJuYWxEYXRhOwotICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICZwYXJjZWwpOwotICAgIHN0YXR1c190IHVwZGF0ZUZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBNRVRBX0RBVEFfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL0FuZHJvaWQuYnAKaW5kZXggMDdlMTI0Yi4uMTVlYTU3OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL0FuZHJvaWQuYnAKQEAgLTEsMjAgKzEsMTcgQEAKLS8vIFRPRE86IGNoYW5nZSBpdCBiYWNrIHRvIGNjX2xpYnJhcnlfc2hhcmVkIHdoZW4gdGhlcmUgaXMgYSB3YXkgdG8KLS8vIGV4cG9zZSBtZWRpYSBtZXRyaWNzIGFzIHN0YWJsZSBBUEkuCi1jY19saWJyYXJ5IHsKK2NjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlibWVkaWFtZXRyaWNzIiwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIklNZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwIiwKICAgICAgICAgIk1lZGlhQW5hbHl0aWNzSXRlbS5jcHAiLAorICAgICAgICAiTWVkaWFNZXRyaWNzLmNwcCIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLApAQCAtMzEsOCArMjgsMTUgQEAKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAorICAgIH0sCisKKyAgICAvLyBlbnVtZXJhdGUgc3RhYmxlIGVudHJ5IHBvaW50cywgZm9yIGFwZXggdXNlCisgICAgc3R1YnM6IHsKKyAgICAgICAgc3ltYm9sX2ZpbGU6ICJsaWJtZWRpYW1ldHJpY3MubWFwLnR4dCIsCisgICAgICAgIHZlcnNpb25zOiBbCisgICAgICAgICAgICAiMSIgLAorICAgICAgICBdCiAgICAgfSwKIH0KKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvSU1lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvSU1lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAKaW5kZXggMjhhNzc0Ni4uOTExNDkyNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL0lNZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9JTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcApAQCAtMTQyLDcgKzE0Miw3IEBACiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhQW5hbHl0aWNzU2VydmljZSwgZGF0YSwgcmVwbHkpOwogCiAgICAgICAgICAgICBib29sIGZvcmNlbmV3OwotICAgICAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gbmV3IE1lZGlhQW5hbHl0aWNzSXRlbTsKKyAgICAgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKCk7CiAKICAgICAgICAgICAgIGRhdGEucmVhZEJvb2woJmZvcmNlbmV3KTsKICAgICAgICAgICAgIGl0ZW0tPnJlYWRGcm9tUGFyY2VsKGRhdGEpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL01lZGlhQW5hbHl0aWNzSXRlbS5jcHAgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFBbmFseXRpY3NJdGVtLmNwcAppbmRleCAxMzVjOWI2Li4wMmMyM2IxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFBbmFseXRpY3NJdGVtLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFBbmFseXRpY3NJdGVtLmNwcApAQCAtNTIsNiArNTIsMTcgQEAKIGNvbnN0IGNoYXIgKiBjb25zdCBNZWRpYUFuYWx5dGljc0l0ZW06OkVuYWJsZWRQcm9wZXJ0eVBlcnNpc3QgID0gInBlcnNpc3QubWVkaWEubWV0cmljcy5lbmFibGVkIjsKIGNvbnN0IGludCBNZWRpYUFuYWx5dGljc0l0ZW06OkVuYWJsZWRQcm9wZXJ0eV9kZWZhdWx0ICA9IDE7CiAKKy8vIFNvIGNhbGxlciBkb2Vzbid0IG5lZWQgdG8ga25vdyBzaXplIG9mIGFsbG9jYXRlZCBzcGFjZQorTWVkaWFBbmFseXRpY3NJdGVtICpNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZSgpCit7CisgICAgcmV0dXJuIE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKGtLZXlOb25lKTsKK30KKworTWVkaWFBbmFseXRpY3NJdGVtICpNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZShNZWRpYUFuYWx5dGljc0l0ZW06OktleSBrZXkpCit7CisgICAgTWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gbmV3IE1lZGlhQW5hbHl0aWNzSXRlbShrZXkpOworICAgIHJldHVybiBpdGVtOworfQogCiAvLyBhY2Nlc3MgZnVuY3Rpb25zIGZvciB0aGUgY2xhc3MKIE1lZGlhQW5hbHl0aWNzSXRlbTo6TWVkaWFBbmFseXRpY3NJdGVtKCkKQEAgLTQ3OCw3ICs0ODksNyBAQAogLy8gY2FsbGVyIHJlc3BvbnNpYmxlIGZvciB0aGUgcmV0dXJuZWQgc3RyaW5nCiBib29sIE1lZGlhQW5hbHl0aWNzSXRlbTo6Z2V0Q1N0cmluZyhNZWRpYUFuYWx5dGljc0l0ZW06OkF0dHIgbmFtZSwgY2hhciAqKnZhbHVlKSB7CiAgICAgUHJvcCAqcHJvcCA9IGZpbmRQcm9wKG5hbWUpOwotICAgIGlmIChwcm9wID09IE5VTEwgfHwgcHJvcC0+bVR5cGUgIT0ga1R5cGVEb3VibGUpIHsKKyAgICBpZiAocHJvcCA9PSBOVUxMIHx8IHByb3AtPm1UeXBlICE9IGtUeXBlQ1N0cmluZykgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CkBAIC00ODcsNiArNDk4LDE4IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgTWVkaWFBbmFseXRpY3NJdGVtOjpnZXRTdHJpbmcoTWVkaWFBbmFseXRpY3NJdGVtOjpBdHRyIG5hbWUsIHN0ZDo6c3RyaW5nICp2YWx1ZSkgeworICAgIFByb3AgKnByb3AgPSBmaW5kUHJvcChuYW1lKTsKKyAgICBpZiAocHJvcCA9PSBOVUxMIHx8IHByb3AtPm1UeXBlICE9IGtUeXBlQ1N0cmluZykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgIC8vIHN0ZDo6c3RyaW5nIG1ha2VzIGEgY29weSBmb3IgdXMKKyAgICAgICAgKnZhbHVlID0gcHJvcC0+dS5DU3RyaW5nVmFsdWU7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCiAvLyByZW1vdmUgaW5kaWNhdGVkIGtleXMgYW5kIHRoZWlyIHZhbHVlcwogLy8gcmV0dXJuIHZhbHVlIGlzICMga2V5cyByZW1vdmVkCiBpbnQzMl90IE1lZGlhQW5hbHl0aWNzSXRlbTo6ZmlsdGVyKGludCBuLCBNZWRpYUFuYWx5dGljc0l0ZW06OkF0dHIgYXR0cnNbXSkgewpAQCAtNjMwLDYgKzY1MywxOSBAQAogLy8KIAogaW50MzJfdCBNZWRpYUFuYWx5dGljc0l0ZW06OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCYgZGF0YSkgeworICAgIGludDMyX3QgdmVyc2lvbiA9IGRhdGEucmVhZEludDMyKCk7CisKKyAgICBzd2l0Y2godmVyc2lvbikgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgcmV0dXJuIHJlYWRGcm9tUGFyY2VsMChkYXRhKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgTWVkaWFBbmFseXRpY3NJdGVtIFBhcmNlbCB2ZXJzaW9uOiAlZCIsIHZlcnNpb24pOworICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKK2ludDMyX3QgTWVkaWFBbmFseXRpY3NJdGVtOjpyZWFkRnJvbVBhcmNlbDAoY29uc3QgUGFyY2VsJiBkYXRhKSB7CiAgICAgLy8gaW50byAndGhpcycgb2JqZWN0CiAgICAgLy8gLi4gd2UgbWFrZSBhIGNvcHkgb2YgdGhlIHN0cmluZyB0byBwdXQgYXdheS4KICAgICBtS2V5ID0gZGF0YS5yZWFkQ1N0cmluZygpOwpAQCAtNjc5LDggKzcxNSwyMyBAQAogfQogCiBpbnQzMl90IE1lZGlhQW5hbHl0aWNzSXRlbTo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKmRhdGEpIHsKKwogICAgIGlmIChkYXRhID09IE5VTEwpIHJldHVybiAtMTsKIAorICAgIGludDMyX3QgdmVyc2lvbiA9IDA7CisgICAgZGF0YS0+d3JpdGVJbnQzMih2ZXJzaW9uKTsKKworICAgIHN3aXRjaCh2ZXJzaW9uKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICByZXR1cm4gd3JpdGVUb1BhcmNlbDAoZGF0YSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIE1lZGlhQW5hbHl0aWNzSXRlbSBQYXJjZWwgdmVyc2lvbjogJWQiLCB2ZXJzaW9uKTsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCitpbnQzMl90IE1lZGlhQW5hbHl0aWNzSXRlbTo6d3JpdGVUb1BhcmNlbDAoUGFyY2VsICpkYXRhKSB7CiAKICAgICBkYXRhLT53cml0ZUNTdHJpbmcobUtleS5jX3N0cigpKTsKICAgICBkYXRhLT53cml0ZUludDMyKG1QaWQpOwpAQCAtNzI1LDYgKzc3NiwxNCBAQAogICAgIHJldHVybiAwOwogfQogCitjb25zdCBjaGFyICpNZWRpYUFuYWx5dGljc0l0ZW06OnRvQ1N0cmluZygpIHsKKyAgIHJldHVybiB0b0NTdHJpbmcoUFJPVE9fTEFTVCk7Cit9CisKK2NvbnN0IGNoYXIgKiBNZWRpYUFuYWx5dGljc0l0ZW06OnRvQ1N0cmluZyhpbnQgdmVyc2lvbikgeworICAgIHN0ZDo6c3RyaW5nIHZhbCA9IHRvU3RyaW5nKHZlcnNpb24pOworICAgIHJldHVybiBzdHJkdXAodmFsLmNfc3RyKCkpOworfQogCiBzdGQ6OnN0cmluZyBNZWRpYUFuYWx5dGljc0l0ZW06OnRvU3RyaW5nKCkgewogICAgcmV0dXJuIHRvU3RyaW5nKFBST1RPX0xBU1QpOwpAQCAtODU1LDggKzkxNCw2IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgcCA9IHRoaXMtPnRvU3RyaW5nKCk7Ci0gICAgICAgIEFMT0dXKCJVbmFibGUgdG8gcmVjb3JkOiAlcyBbZm9yY2VuZXc9JWRdIiwgcC5jX3N0cigpLCBmb3JjZW5ldyk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiB9CkBAIC0xMDE0LDUgKzEwNzEsMTcwIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKKy8vIGEgYnl0ZSBhcnJheTsgY29udGVudHMgYXJlCisvLyBvdmVyYWxsIGxlbmd0aCAodWludDMyKSBpbmNsdWRpbmcgdGhlIGxlbmd0aCBmaWVsZCBpdHNlbGYKKy8vIGVuY29kaW5nIHZlcnNpb24gKHVpbnQzMikKKy8vIGNvdW50IG9mIHByb3BlcnRpZXMgKHVpbnQzMikKKy8vIE4gY29waWVzIG9mOgorLy8gICAgIHByb3BlcnR5IG5hbWUgYXMgbGVuZ3RoKGludDE2KSwgYnl0ZXMKKy8vICAgICAgICAgdGhlIGJ5dGVzIFdJTEwgaW5jbHVkZSB0aGUgbnVsbCB0ZXJtaW5hdG9yIG9mIHRoZSBuYW1lCisvLyAgICAgdHlwZSAodWludDggLS0gMSBieXRlKQorLy8gICAgIHNpemUgb2YgdmFsdWUgZmllbGQgKGludDE2IC0tIDIgYnl0ZXMpCisvLyAgICAgdmFsdWUgKHNpemUgYmFzZWQgb24gdHlwZSkKKy8vICAgICAgIGludDMyLCBpbnQ2NCwgZG91YmxlIC0tIGxpdHRsZSBlbmRpYW4gNC84LzggYnl0ZXMgcmVzcGVjdGl2ZWx5CisvLyAgICAgICBjc3RyaW5nIC0tIE4gYnl0ZXMgb2YgdmFsdWUgW1dJVEggdGVybWluYXRvcl0KKworZW51bSB7IGtJbnQzMiA9IDAsIGtJbnQ2NCwga0RvdWJsZSwga1JhdGUsIGtDU3RyaW5nfTsKKworYm9vbCBNZWRpYUFuYWx5dGljc0l0ZW06OmR1bXBBdHRyaWJ1dGVzKGNoYXIgKipwYnVmZmVyLCBzaXplX3QgKnBsZW5ndGgpIHsKKworICAgIGNoYXIgKmJ1aWxkID0gTlVMTDsKKworICAgIGlmIChwYnVmZmVyID09IE5VTEwgfHwgcGxlbmd0aCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBjb25zaXN0ZW5jeSBmb3IgdGhlIGNhbGxlciwgd2hvIG93bnMgd2hhdGV2ZXIgY29tZXMgYmFjayBpbiB0aGlzIHBvaW50ZXIuCisgICAgKnBidWZmZXIgPSBOVUxMOworCisgICAgLy8gZmlyc3QsIGxldCdzIGNhbGN1bGF0ZSBzaXplcworICAgIGludDMyX3QgZ29hbCA9IDA7CisgICAgaW50MzJfdCB2ZXJzaW9uID0gMDsKKworICAgIGdvYWwgKz0gc2l6ZW9mKHVpbnQzMl90KTsgICAvLyBvdmVyYWxsIGxlbmd0aCwgaW5jbHVkaW5nIHRoZSBsZW5ndGggZmllbGQKKyAgICBnb2FsICs9IHNpemVvZih1aW50MzJfdCk7ICAgLy8gZW5jb2RpbmcgdmVyc2lvbgorICAgIGdvYWwgKz0gc2l6ZW9mKHVpbnQzMl90KTsgICAvLyAjIHByb3BlcnRpZXMKKworICAgIGludDMyX3QgY291bnQgPSBtUHJvcENvdW50OworICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGNvdW50OyBpKysgKSB7CisgICAgICAgIFByb3AgKnByb3AgPSAmbVByb3BzW2ldOworICAgICAgICBnb2FsICs9IHNpemVvZih1aW50MTZfdCk7ICAgICAgICAgICAvLyBuYW1lIGxlbmd0aAorICAgICAgICBnb2FsICs9IHN0cmxlbihwcm9wLT5tTmFtZSkgKyAxOyAgICAvLyBzdHJpbmcgKyBudWxsCisgICAgICAgIGdvYWwgKz0gc2l6ZW9mKHVpbnQ4X3QpOyAgICAgICAgICAgIC8vIHR5cGUKKyAgICAgICAgZ29hbCArPSBzaXplb2YodWludDE2X3QpOyAgICAgICAgICAgLy8gc2l6ZSBvZiB2YWx1ZQorICAgICAgICBzd2l0Y2ggKHByb3AtPm1UeXBlKSB7CisgICAgICAgICAgICBjYXNlIE1lZGlhQW5hbHl0aWNzSXRlbTo6a1R5cGVJbnQzMjoKKyAgICAgICAgICAgICAgICAgICAgZ29hbCArPSBzaXplb2YodWludDMyX3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZUludDY0OgorICAgICAgICAgICAgICAgICAgICBnb2FsICs9IHNpemVvZih1aW50NjRfdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlRG91YmxlOgorICAgICAgICAgICAgICAgICAgICBnb2FsICs9IHNpemVvZihkb3VibGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZVJhdGU6CisgICAgICAgICAgICAgICAgICAgIGdvYWwgKz0gMiAqIHNpemVvZih1aW50NjRfdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlQ1N0cmluZzoKKyAgICAgICAgICAgICAgICAgICAgLy8gbGVuZ3RoICsgYWN0dWFsIHN0cmluZyArIG51bGwKKyAgICAgICAgICAgICAgICAgICAgZ29hbCArPSBzdHJsZW4ocHJvcC0+dS5DU3RyaW5nVmFsdWUpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZm91bmQgYmFkIFByb3AgdHlwZTogJWQsIGlkeCAlZCwgbmFtZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3AtPm1UeXBlLCBpLCBwcm9wLT5tTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIG5vdyB0aGF0IHdlIGhhdmUgYSBzaXplLi4uIGxldCdzIGFsbG9jYXRlIGFuZCBmaWxsCisgICAgYnVpbGQgPSAoY2hhciAqKW1hbGxvYyhnb2FsKTsKKyAgICBpZiAoYnVpbGQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgbWVtc2V0KGJ1aWxkLCAwLCBnb2FsKTsKKworICAgIGNoYXIgKmZpbGxpbmcgPSBidWlsZDsKKworI2RlZmluZSBfSU5TRVJUKHZhbCwgc2l6ZSkgXAorICAgIHsgbWVtY3B5KGZpbGxpbmcsICYodmFsKSwgKHNpemUpKTsgZmlsbGluZyArPSAoc2l6ZSk7fQorI2RlZmluZSBfSU5TRVJUU1RSSU5HKHZhbCwgc2l6ZSkgXAorICAgIHsgbWVtY3B5KGZpbGxpbmcsICh2YWwpLCAoc2l6ZSkpOyBmaWxsaW5nICs9IChzaXplKTt9CisKKyAgICBfSU5TRVJUKGdvYWwsIHNpemVvZihpbnQzMl90KSk7CisgICAgX0lOU0VSVCh2ZXJzaW9uLCBzaXplb2YoaW50MzJfdCkpOworICAgIF9JTlNFUlQoY291bnQsIHNpemVvZihpbnQzMl90KSk7CisKKyAgICBmb3IgKGludCBpID0gMCA7IGkgPCBjb3VudDsgaSsrICkgeworICAgICAgICBQcm9wICpwcm9wID0gJm1Qcm9wc1tpXTsKKyAgICAgICAgaW50MTZfdCBhdHRyTmFtZUxlbiA9IHN0cmxlbihwcm9wLT5tTmFtZSkgKyAxOworICAgICAgICBfSU5TRVJUKGF0dHJOYW1lTGVuLCBzaXplb2YoaW50MTZfdCkpOworICAgICAgICBfSU5TRVJUU1RSSU5HKHByb3AtPm1OYW1lLCBhdHRyTmFtZUxlbik7ICAgIC8vIHRlcm1pbmF0aW9uIGluY2x1ZGVkCisgICAgICAgIGludDhfdCBlbGVtdHlwZTsKKyAgICAgICAgaW50MTZfdCBlbGVtc2l6ZTsKKyAgICAgICAgc3dpdGNoIChwcm9wLT5tVHlwZSkgeworICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlSW50MzI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbGVtdHlwZSA9IGtJbnQzMjsKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChlbGVtdHlwZSwgc2l6ZW9mKGludDhfdCkpOworICAgICAgICAgICAgICAgICAgICBlbGVtc2l6ZSA9IHNpemVvZihpbnQzMl90KTsKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChlbGVtc2l6ZSwgc2l6ZW9mKGludDE2X3QpKTsKKworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKHByb3AtPnUuaW50MzJWYWx1ZSwgc2l6ZW9mKGludDMyX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlSW50NjQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbGVtdHlwZSA9IGtJbnQ2NDsKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChlbGVtdHlwZSwgc2l6ZW9mKGludDhfdCkpOworICAgICAgICAgICAgICAgICAgICBlbGVtc2l6ZSA9IHNpemVvZihpbnQ2NF90KTsKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChlbGVtc2l6ZSwgc2l6ZW9mKGludDE2X3QpKTsKKworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKHByb3AtPnUuaW50NjRWYWx1ZSwgc2l6ZW9mKGludDY0X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlRG91YmxlOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZWxlbXR5cGUgPSBrRG91YmxlOworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKGVsZW10eXBlLCBzaXplb2YoaW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIGVsZW1zaXplID0gc2l6ZW9mKGRvdWJsZSk7CisgICAgICAgICAgICAgICAgICAgIF9JTlNFUlQoZWxlbXNpemUsIHNpemVvZihpbnQxNl90KSk7CisKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChwcm9wLT51LmRvdWJsZVZhbHVlLCBzaXplb2YoZG91YmxlKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZVJhdGU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbGVtdHlwZSA9IGtSYXRlOworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKGVsZW10eXBlLCBzaXplb2YoaW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIGVsZW1zaXplID0gMiAqIHNpemVvZih1aW50NjRfdCk7CisgICAgICAgICAgICAgICAgICAgIF9JTlNFUlQoZWxlbXNpemUsIHNpemVvZihpbnQxNl90KSk7CisKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChwcm9wLT51LnJhdGUuY291bnQsIHNpemVvZih1aW50NjRfdCkpOworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKHByb3AtPnUucmF0ZS5kdXJhdGlvbiwgc2l6ZW9mKHVpbnQ2NF90KSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZUNTdHJpbmc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbGVtdHlwZSA9IGtDU3RyaW5nOworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKGVsZW10eXBlLCBzaXplb2YoaW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIGVsZW1zaXplID0gc3RybGVuKHByb3AtPnUuQ1N0cmluZ1ZhbHVlKSArIDE7CisgICAgICAgICAgICAgICAgICAgIF9JTlNFUlQoZWxlbXNpemUsIHNpemVvZihpbnQxNl90KSk7CisKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVFNUUklORyhwcm9wLT51LkNTdHJpbmdWYWx1ZSwgZWxlbXNpemUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciBpZiBjYW4ndCBlbmNvZGU7IHdhcm5pbmcgaWYgY2FuJ3QgZGVjb2RlCisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJmb3VuZCBiYWQgUHJvcCB0eXBlOiAlZCwgaWR4ICVkLCBuYW1lICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC0+bVR5cGUsIGksIHByb3AtPm1OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBiYWRuZXNzOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGJ1aWxkICsgZ29hbCAhPSBmaWxsaW5nKSB7CisgICAgICAgIEFMT0dFKCJwcm9ibGVtcyBwb3B1bGF0aW5nOyB3cm90ZT0lZCBwbGFubmVkPSVkIiwKKyAgICAgICAgICAgICAgKGludCkoZmlsbGluZy1idWlsZCksIGdvYWwpOworICAgICAgICBnb3RvIGJhZG5lc3M7CisgICAgfQorCisgICAgKnBidWZmZXIgPSBidWlsZDsKKyAgICAqcGxlbmd0aCA9IGdvYWw7CisKKyAgICByZXR1cm4gdHJ1ZTsKKworICBiYWRuZXNzOgorICAgIGZyZWUoYnVpbGQpOworICAgIHJldHVybiBmYWxzZTsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFNZXRyaWNzLmNwcCBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9NZWRpYU1ldHJpY3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMDkxOTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFNZXRyaWNzLmNwcApAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFNZXRyaWNzIgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhTWV0cmljcy5oPgorCisvLworLy8gcHJvdmlkZSBhIEMtaXNoIGludGVyZmFjZSB0aGF0IGlzIGVhc2llciB0byBzdGFiaWxpemUgdGhhbiB0aGUgZXhpc3RpbmcgQysrCisvLyBpbnRlcmZhY2UKKy8vCisvLyBBTEwgZnVuY3Rpb25zIHJldHVybmluZyBhIGNoYXIgKiBnaXZlIHJlc3BvbnNpYmlsaXR5IGZvciB0aGUgYWxsb2NhdGVkIGJ1ZmZlcgorLy8gdG8gdGhlIGNhbGxlci4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSB0byBjYWxsIGZyZWUoKSBvbiB0aGF0IHBvaW50ZXIuCisvLworCisvLyBtYW5hZ2UgdGhlIG92ZXJhbGwgcmVjb3JkCittZWRpYW1ldHJpY3NfaGFuZGxlX3QgbWVkaWFtZXRyaWNzX2NyZWF0ZShtZWRpYW1ldHJpY3NrZXlfdCBrZXkpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZShrZXkpOworICAgIHJldHVybiAobWVkaWFtZXRyaWNzX2hhbmRsZV90KSBpdGVtOworfQorCit2b2lkIG1lZGlhbWV0cmljc19kZWxldGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybjsKKyAgICBkZWxldGUgaXRlbTsKK30KKworbWVkaWFtZXRyaWNza2V5X3QgbWVkaWFtZXRyaWNzX2dldEtleShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIHN0cmR1cChpdGVtLT5nZXRLZXkoKS5jX3N0cigpKTsKK30KKworLy8gbnVwbGF5ZXIsIGV0IGFsIHVzZSBpdCB3aGVuIGFjdGluZyBhcyBwcm94aWVzCit2b2lkIG1lZGlhbWV0cmljc19zZXRVaWQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgdWlkX3QgdWlkKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gIT0gTlVMTCkgaXRlbS0+c2V0VWlkKHVpZCk7Cit9CisKKy8vIHNldCBhdHRyaWJ1dGVzCisvLworCit2b2lkIG1lZGlhbWV0cmljc19zZXRJbnQzMihtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPnNldEludDMyKGF0dHIsIHZhbHVlKTsKK30KKwordm9pZCBtZWRpYW1ldHJpY3Nfc2V0SW50NjQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdmFsdWUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSAhPSBOVUxMKSBpdGVtLT5zZXRJbnQ2NChhdHRyLCB2YWx1ZSk7Cit9CisKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldERvdWJsZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPnNldERvdWJsZShhdHRyLCB2YWx1ZSk7Cit9CisKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldFJhdGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjb3VudCwgaW50NjRfdCBkdXJhdGlvbikgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPnNldFJhdGUoYXR0ciwgY291bnQsIGR1cmF0aW9uKTsKK30KKwordm9pZCBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gIT0gTlVMTCkgaXRlbS0+c2V0Q1N0cmluZyhhdHRyLCB2YWx1ZSk7Cit9CisKKy8vIGZ1c2VkIGdldC9hZGQvc2V0OyBpZiBhdHRyIHdhc24ndCB0aGVyZSwgaXQncyBhIHNpbXBsZSBzZXQuCisvLworCit2b2lkIG1lZGlhbWV0cmljc19hZGRJbnQzMihtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPmFkZEludDMyKGF0dHIsIHZhbHVlKTsKK30KKwordm9pZCBtZWRpYW1ldHJpY3NfYWRkSW50NjQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdmFsdWUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSAhPSBOVUxMKSBpdGVtLT5hZGRJbnQ2NChhdHRyLCB2YWx1ZSk7Cit9CisKK3ZvaWQgbWVkaWFtZXRyaWNzX2FkZERvdWJsZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPmFkZERvdWJsZShhdHRyLCB2YWx1ZSk7Cit9CisKK3ZvaWQgbWVkaWFtZXRyaWNzX2FkZFJhdGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjb3VudCwgaW50NjRfdCBkdXJhdGlvbikgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPmFkZFJhdGUoYXR0ciwgY291bnQsIGR1cmF0aW9uKTsKK30KKworLy8gZmluZCAmIGV4dHJhY3QgdmFsdWVzCisvLyByZXR1cm4gaW5kaWNhdGVzIHdoZXRoZXIgYXR0ciBleGlzdHMgKGFuZCB0aHVzIHdoZXRoZXIgdmFsdWUgZmlsbGVkIGluKQorLy8gTlVMTCBwYXJhbWV0ZXIgdmFsdWUgc3VwcHJlc3NlcyBzdG9yYWdlIG9mIHZhbHVlLgorLy8KKworYm9vbCBtZWRpYW1ldHJpY3NfZ2V0SW50MzIobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKiB2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gaXRlbS0+Z2V0SW50MzIoYXR0ciwgdmFsdWUpOworfQorCitib29sIG1lZGlhbWV0cmljc19nZXRJbnQ2NChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqIHZhbHVlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBpdGVtLT5nZXRJbnQ2NChhdHRyLCB2YWx1ZSk7Cit9CisKK2Jvb2wgbWVkaWFtZXRyaWNzX2dldERvdWJsZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqdmFsdWUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGl0ZW0tPmdldERvdWJsZShhdHRyLCB2YWx1ZSk7Cit9CisKK2Jvb2wgbWVkaWFtZXRyaWNzX2dldFJhdGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqIGNvdW50LCBpbnQ2NF90ICogZHVyYXRpb24sIGRvdWJsZSAqcmF0ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gaXRlbS0+Z2V0UmF0ZShhdHRyLCBjb3VudCwgZHVyYXRpb24sIHJhdGUpOworfQorCisvLyBOQjogY2FsbGVyIG93bnMgdGhlIHN0cmluZyB0aGF0IGNvbWVzIGJhY2ssIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIGl0Citib29sIG1lZGlhbWV0cmljc19nZXRDU3RyaW5nKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKnZhbHVlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIGl0ZW0tPmdldENTdHJpbmcoYXR0ciwgdmFsdWUpOworfQorCisvLyB0byByZWxlYXNlIHN0cmluZ3MgcmV0dXJuZWQgdmlhIGdldENTdHJpbmcoKQordm9pZCBtZWRpYW1ldHJpY3NfZnJlZUNTdHJpbmcoY2hhciAqdmFsdWUpIHsKKyAgICBmcmVlKHZhbHVlKTsKK30KKworYm9vbCBtZWRpYW1ldHJpY3Nfc2VsZlJlY29yZChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBpdGVtLT5zZWxmcmVjb3JkKCk7Cit9CisKKworY29uc3QgY2hhciAqbWVkaWFtZXRyaWNzX3JlYWRhYmxlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm4gIiI7CisgICAgcmV0dXJuIGl0ZW0tPnRvQ1N0cmluZygpOworfQorCitpbnQzMl90IG1lZGlhbWV0cmljc19jb3VudChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIDA7CisgICAgcmV0dXJuIGl0ZW0tPmNvdW50KCk7Cit9CisKK2Jvb2wgbWVkaWFtZXRyaWNzX2lzRW5hYmxlZCgpIHsKKyAgICAvLyBzdGF0aWMsIHNvIGRvZXNuJ3QgbmVlZCBhbiBpbnN0YW5jZQorICAgIHJldHVybiBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW06OmlzRW5hYmxlZCgpOworfQorCitib29sIG1lZGlhbWV0cmljc19nZXRBdHRyaWJ1dGVzKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGNoYXIgKipidWZmZXIsIHNpemVfdCAqbGVuZ3RoKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBpdGVtLT5kdW1wQXR0cmlidXRlcyhidWZmZXIsIGxlbmd0aCk7CisKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhQW5hbHl0aWNzSXRlbS5oIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFBbmFseXRpY3NJdGVtLmgKaW5kZXggMjYzY2RlNy4uNGEzNmY2YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFBbmFseXRpY3NJdGVtLmgKKysrIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFBbmFseXRpY3NJdGVtLmgKQEAgLTE3LDkgKzE3LDEwIEBACiAjaWZuZGVmIEFORFJPSURfTUVESUFfTUVESUFBTkFMWVRJQ1NJVEVNX0gKICNkZWZpbmUgQU5EUk9JRF9NRURJQV9NRURJQUFOQUxZVElDU0lURU1fSAogCi0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgpAQCAtODEsMTIgKzgyLDE5IEBACiAgICAgICAgICAgICBQUk9UT19MQVNUID0gUFJPVE9fVjEsCiAgICAgICAgIH07CiAKKyAgICBwcml2YXRlOgorICAgICAgICAvLyB1c2UgdGhlIDo6Y3JlYXRlKCkgbWV0aG9kIGluc3RlYWQKKyAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtKCk7CisgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbShLZXkpOworICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0oY29uc3QgTWVkaWFBbmFseXRpY3NJdGVtJik7CisgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhQW5hbHl0aWNzSXRlbSYpOwogCiAgICAgcHVibGljOgogCisgICAgICAgIHN0YXRpYyBNZWRpYUFuYWx5dGljc0l0ZW0qIGNyZWF0ZShLZXkga2V5KTsKKyAgICAgICAgc3RhdGljIE1lZGlhQW5hbHl0aWNzSXRlbSogY3JlYXRlKCk7CisKICAgICAgICAgLy8gYWNjZXNzIGZ1bmN0aW9ucyBmb3IgdGhlIGNsYXNzCi0gICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSgpOwotICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0oS2V5KTsKICAgICAgICAgfk1lZGlhQW5hbHl0aWNzSXRlbSgpOwogCiAgICAgICAgIC8vIFNlc3Npb25JRCB0aWVzIG11bHRpcGxlIHN1Ym1pc3Npb25zIGZvciBzYW1lIGtleSB0b2dldGhlcgpAQCAtMTM0LDYgKzE0Miw3IEBACiAgICAgICAgIGJvb2wgZ2V0UmF0ZShBdHRyLCBpbnQ2NF90ICpjb3VudCwgaW50NjRfdCAqZHVyYXRpb24sIGRvdWJsZSAqcmF0ZSk7CiAgICAgICAgIC8vIENhbGxlciBvd25zIHRoZSByZXR1cm5lZCBzdHJpbmcKICAgICAgICAgYm9vbCBnZXRDU3RyaW5nKEF0dHIsIGNoYXIgKip2YWx1ZSk7CisgICAgICAgIGJvb2wgZ2V0U3RyaW5nKEF0dHIsIHN0ZDo6c3RyaW5nICp2YWx1ZSk7CiAKICAgICAgICAgLy8gcGFyYW1ldGVyIGluZGljYXRlcyB3aGV0aGVyIHRvIGNsb3NlIGFueSBleGlzdGluZyBvcGVuCiAgICAgICAgIC8vIHJlY29yZCB3aXRoIHNhbWUga2V5IGJlZm9yZSBlc3RhYmxpc2hpbmcgYSBuZXcgcmVjb3JkCkBAIC0xNzQsMTIgKzE4MywyMiBAQAogICAgICAgICBpbnQzMl90IHdyaXRlVG9QYXJjZWwoUGFyY2VsICopOwogICAgICAgICBpbnQzMl90IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCYpOwogCisgICAgICAgIC8vIHN1cHBvcnRzIHRoZSBzdGFibGUgaW50ZXJmYWNlCisgICAgICAgIGJvb2wgZHVtcEF0dHJpYnV0ZXMoY2hhciAqKnBidWZmZXIsIHNpemVfdCAqcGxlbmd0aCk7CisKICAgICAgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKTsKICAgICAgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoaW50IHZlcnNpb24pOworICAgICAgICBjb25zdCBjaGFyICp0b0NTdHJpbmcoKTsKKyAgICAgICAgY29uc3QgY2hhciAqdG9DU3RyaW5nKGludCB2ZXJzaW9uKTsKIAogICAgICAgICAvLyBhcmUgd2UgY29sbGVjdGluZyBhbmFseXRpY3MgZGF0YQogICAgICAgICBzdGF0aWMgYm9vbCBpc0VuYWJsZWQoKTsKIAorICAgIHByaXZhdGU6CisgICAgICAgIC8vIGhhbmRsZSBQYXJjZWwgdmVyc2lvbiAwCisgICAgICAgIGludDMyX3Qgd3JpdGVUb1BhcmNlbDAoUGFyY2VsICopOworICAgICAgICBpbnQzMl90IHJlYWRGcm9tUGFyY2VsMChjb25zdCBQYXJjZWwmKTsKKwogICAgIHByb3RlY3RlZDoKIAogICAgICAgICAvLyBtZXJnZSBmaWVsZHMgZnJvbSBhcmcgaW50byB0aGlzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYU1ldHJpY3MuaCBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhTWV0cmljcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZTFlZDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYU1ldHJpY3MuaApAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX01FRElBTUVUUklDU19ICisjZGVmaW5lIEFORFJPSURfTUVESUFfTUVESUFNRVRSSUNTX0gKKworLy8KKy8vIGRlZmluZSBhIEMgaW50ZXJmYWNlIHRvIHRoZSBtZWRpYSBtZXRyaWNzIGZ1bmN0aW9uYWxpdHkKKy8vCisvLyBBbGwgZnVuY3Rpb25zIHRoYXQgcmV0dXJuIGEgY2hhciAqIG9yIGNvbnN0IGNoYXIgKiBhbHNvIGdpdmUgcmVzcG9uc2liaWxpdHkKKy8vIGZvciB0aGF0IHN0cmluZyB0byB0aGUgY2FsbGVyLiBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIGZyZWUoKQorLy8gb24gdGhhdCBwb2ludGVyIHdoZW4gZG9uZSB1c2luZyB0aGUgdmFsdWUuCisKK19fQkVHSU5fREVDTFMKKworLy8gaW50ZXJuYWxseSByZS1jYXN0IHRvIHRoZSBiZWhpbmQtdGhlLXNjZW5lcyBDKysgY2xhc3MgaW5zdGFuY2UKK3R5cGVkZWYgaW50NjRfdCBtZWRpYW1ldHJpY3NfaGFuZGxlX3Q7Cit0eXBlZGVmIGNvbnN0IGNoYXIgKm1lZGlhbWV0cmljc2tleV90OwordHlwZWRlZiBjb25zdCBjaGFyICphdHRyX3Q7CisKK21lZGlhbWV0cmljc19oYW5kbGVfdCBtZWRpYW1ldHJpY3NfY3JlYXRlKG1lZGlhbWV0cmljc2tleV90IGtleSk7Cit2b2lkIG1lZGlhbWV0cmljc19kZWxldGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSk7CisKK21lZGlhbWV0cmljc2tleV90IG1lZGlhbWV0cmljc19nZXRLZXkobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSk7CisKKworLy8gc2V0Cit2b2lkIG1lZGlhbWV0cmljc19zZXRJbnQzMihtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmFsdWUpOwordm9pZCBtZWRpYW1ldHJpY3Nfc2V0SW50NjQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHZhbHVlKTsKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldERvdWJsZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsdWUpOwordm9pZCBtZWRpYW1ldHJpY3Nfc2V0UmF0ZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjb3VudCwgaW50NjRfdCBkdXJhdGlvbik7Cit2b2lkIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiB2YWx1ZSk7CisKKy8vIGZ1c2VkIGdldC9hZGQvc2V0OyBpZiBhdHRyIHdhc24ndCB0aGVyZSwgaXQncyBhIHNpbXBsZSBzZXQuCisvLyB0aGVzZSBkbyBub3QgcHJvdmlkZSBhdG9taWNpdHkgb3IgbXV0dWFsIGV4Y2x1c2lvbiwgb25seSBzaW1wbGVyIGNvZGUgc2VxdWVuY2VzLgordm9pZCBtZWRpYW1ldHJpY3NfYWRkSW50MzIobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZhbHVlKTsKK3ZvaWQgbWVkaWFtZXRyaWNzX2FkZEludDY0KG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB2YWx1ZSk7Cit2b2lkIG1lZGlhbWV0cmljc19hZGREb3VibGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbHVlKTsKK3ZvaWQgbWVkaWFtZXRyaWNzX2FkZFJhdGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY291bnQsIGludDY0X3QgZHVyYXRpb24pOworCisvLyBmaW5kICYgZXh0cmFjdCB2YWx1ZXMKKy8vIHJldHVybiBpbmRpY2F0ZXMgd2hldGhlciBhdHRyIGV4aXN0cyAoYW5kIHRodXMgd2hldGhlciB2YWx1ZSBmaWxsZWQgaW4pCisvLyBOVUxMIHBhcmFtZXRlciB2YWx1ZSBzdXBwcmVzc2VzIHN0b3JhZ2Ugb2YgdmFsdWUuCitib29sIG1lZGlhbWV0cmljc19nZXRJbnQzMihtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKiB2YWx1ZSk7Citib29sIG1lZGlhbWV0cmljc19nZXRJbnQ2NChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKiB2YWx1ZSk7Citib29sIG1lZGlhbWV0cmljc19nZXREb3VibGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlICp2YWx1ZSk7Citib29sIG1lZGlhbWV0cmljc19nZXRSYXRlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICogY291bnQsIGludDY0X3QgKiBkdXJhdGlvbiwgZG91YmxlICpyYXRlKTsKK2Jvb2wgbWVkaWFtZXRyaWNzX2dldENTdHJpbmcobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKnZhbHVlKTsKKy8vIHRvIHJlbGVhc2Ugc3RyaW5ncyByZXR1cm5lZCB2aWEgZ2V0Q1N0cmluZygpCit2b2lkIG1lZGlhbWV0cmljc19mcmVlQ1N0cmluZyhjaGFyICp2YWx1ZSk7CisKKy8vICMgb2YgYXR0cmlidXRlcyBzZXQgd2l0aGluIHRoaXMgcmVjb3JkLgoraW50MzJfdCBtZWRpYW1ldHJpY3NfY291bnQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSk7CisKK2Jvb2wgbWVkaWFtZXRyaWNzX3NlbGZSZWNvcmQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSk7CisKK2NvbnN0IGNoYXIgKm1lZGlhbWV0cmljc19yZWFkYWJsZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlKTsKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldFVpZChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCB1aWRfdCB1aWQpOworYm9vbCBtZWRpYW1ldHJpY3NfaXNFbmFibGVkKCk7CisKKy8vIHNlcmlhbGl6ZWQgY29weSBvZiB0aGUgYXR0cmlidXRlcy92YWx1ZXMsIG1vc3RseSBmb3IgdXBzdHJlYW0gZ2V0TWV0cmljcygpIGNhbGxzCisvLyBjYWxsZXIgb3ducyB0aGUgYnVmZmVyIGFsbG9jYXRlZCBhcyBwYXJ0IG9mIHRoaXMgY2FsbC4KK2Jvb2wgbWVkaWFtZXRyaWNzX2dldEF0dHJpYnV0ZXMobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgY2hhciAqKmJ1ZmZlciwgc2l6ZV90ICpsZW5ndGgpOworCitfX0VORF9ERUNMUworCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9saWJtZWRpYW1ldHJpY3MubWFwLnR4dCBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9saWJtZWRpYW1ldHJpY3MubWFwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDYyODFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2xpYm1lZGlhbWV0cmljcy5tYXAudHh0CkBAIC0wLDAgKzEsMjkgQEAKK0xJQk1FRElBTUVUUklDU18xIHsKKyAgZ2xvYmFsOgorICAgIG1lZGlhbWV0cmljc19hZGREb3VibGU7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19hZGRJbnQzMjsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX2FkZEludDY0OyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfYWRkUmF0ZTsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX2NvdW50OyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfY3JlYXRlOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfZGVsZXRlOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfZnJlZUNTdHJpbmc7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19nZXRBdHRyaWJ1dGVzOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfZ2V0Q1N0cmluZzsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX2dldERvdWJsZTsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX2dldEludDMyOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfZ2V0SW50NjQ7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19nZXRLZXk7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19nZXRSYXRlOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfaXNFbmFibGVkOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfcmVhZGFibGU7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19zZWxmUmVjb3JkOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZzsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX3NldERvdWJsZTsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX3NldEludDMyOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3Nfc2V0SW50NjQ7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19zZXRSYXRlOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3Nfc2V0VWlkOyAjIGFwZXgKKyAgbG9jYWw6CisgICAgKjsKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9BbmRyb2lkLmJwCmluZGV4IDFmYTg3ODkuLmRjYTZiYjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9BbmRyb2lkLmJwCkBAIC00LDExICs0LDEwIEBACiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiB9CiAKLWNjX2xpYnJhcnkgeworY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJtZWRpYXBsYXllcjIiLAogCiAgICAgc3JjczogWwotICAgICAgICAiSkF1ZGlvVHJhY2suY3BwIiwKICAgICAgICAgIk1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0LmNwcCIsCiAgICAgICAgICJtZWRpYXBsYXllcjIuY3BwIiwKICAgICBdLApAQCAtMTcsMzEgKzE2LDI5IEBACiAgICAgICAgICJsaWJhbmRyb2lkX3J1bnRpbWUiLAogICAgICAgICAibGliYXVkaW9jbGllbnQiLAogICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmJpbmRlcl9uZGsiLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlibWVkaWFfb214IiwKLSAgICAgICAgImxpYm1lZGlhX3BsYXllcjJfdXRpbCIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnVpIiwKICAgICAgICAgImxpYnV0aWxzIiwKIAogICAgICAgICAibGliY3J5cHRvIiwKLSAgICAgICAgImxpYm1lZGlhZHJtIiwKICAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCiAgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgICAgICJsaWJtZWRpYW5ka191dGlscyIsCiAgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKICAgICAgICAgImxpYm1lbXVucmVhY2hhYmxlIiwKICAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCiAgICAgICAgICJsaWJwb3dlcm1hbmFnZXIiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaHR0cGxpdmUiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfcGxheWVyMiIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKICAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKICAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJndWkiLAogICAgICAgICAibGlibWVkaWFfb214IiwKICAgICBdLAogCkBAIC00OSwxMSArNDYsMjEgQEAKICAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKICAgICBdLAogCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2Jhc2UvY29yZS9qbmkiLAorICAgIF0sCisKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKKyAgICAgICAgImxpYm1lZGlhcGxheWVyMi1wcm90b3MiLAorICAgICAgICAibGlibWVkaWFfcGxheWVyMl91dGlsIiwKKyAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25fd2l0aG91dF9pbWVtb3J5IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X251cGxheWVyMiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9wbGF5ZXIyIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3J0c3AiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3RpbWVkdGV4dDIiLAorICAgICAgICAibGlibWVkaWEyX2puaV9jb3JlIiwKICAgICBdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWwpAQCAtNzIsOCArNzksNTEgQEAKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiB9CisKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJtZWRpYTJfam5pX2NvcmUiLAorCisgICAgc3JjczogWworICAgICAgICAiSmF2YVZNSGVscGVyLmNwcCIsCisgICAgICAgICJKQXVkaW9UcmFjay5jcHAiLAorICAgICAgICAiSk1lZGlhMkhUVFBTZXJ2aWNlLmNwcCIsCisgICAgICAgICJKTWVkaWEySFRUUENvbm5lY3Rpb24uY3BwIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlcl9oZWFkZXJzIiwKKyAgICAgICAgImxpYm5hdGl2ZWhlbHBlcl9oZWFkZXJfb25seSIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliZGwiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlibWVkaWEvaW5jbHVkZSIsCisgICAgICAgICJmcmFtZXdvcmtzL2Jhc2UvY29yZS9qbmkiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCisKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KQXVkaW9UcmFjay5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suY3BwCmluZGV4IGFjMGNjNTcuLmZhYjZjNjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KQXVkaW9UcmFjay5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmNwcApAQCAtMjEsMjcgKzIxLDI4IEBACiAjaW5jbHVkZSAibWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmgiCiAKICNpbmNsdWRlIDxhbmRyb2lkX21lZGlhX0F1ZGlvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIFRPRE86IFN0b3JlIEphdmEgY2xhc3MvbWV0aG9kSUQgYXMgYSBtZW1iZXIgdmFyaWFibGUgaW4gdGhlIGNsYXNzLgogLy8gVE9ETzogQWRkIE5VTEwgJiYgRXhjZXB0aW9uIGNoZWNrcyBhZnRlciBldmVyeSBKTkkgY2FsbC4KIEpBdWRpb1RyYWNrOjpKQXVkaW9UcmFjayggICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDwgVXNhZ2VzIG9mIHRoZSBhcmd1bWVudHMgYXJlIGJlbG93ID4KLSAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLCAgICAgICAgICAgICAgIC8vIEF1ZGlvQXVkaW9BdHRyaWJ1dGVzCiAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdWRpb0Zvcm1hdCAmJiBidWZmZXJTaXplSW5CeXRlcwogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW9Gb3JtYXQgJiYgYnVmZmVyU2l6ZUluQnl0ZXMKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssICAgICAgICAgICAgIC8vIEF1ZGlvRm9ybWF0ICYmIGJ1ZmZlclNpemVJbkJ5dGVzCiAgICAgICAgIGNhbGxiYWNrX3QgY2JmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPZmZsb2FkCiAgICAgICAgIHZvaWQqIHVzZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPZmZsb2FkCiAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXJTaXplSW5CeXRlcwotICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLCAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW9UcmFjawotICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzLCAgICAgICAgLy8gQXVkaW9BdHRyaWJ1dGVzCisgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdWRpb1RyYWNrCisgICAgICAgIGNvbnN0IGpvYmplY3QgYXR0cmlidXRlcywgICAgICAgICAgICAgICAgICAgICAvLyBBdWRpb0F0dHJpYnV0ZXMKICAgICAgICAgZmxvYXQgbWF4UmVxdWlyZWRTcGVlZCkgeyAgICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlclNpemVJbkJ5dGVzCiAKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisKICAgICBqY2xhc3MgakF1ZGlvVHJhY2tDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrIik7Ci0gICAgbUF1ZGlvVHJhY2tDbHMgPSAoamNsYXNzKSBlbnYtPk5ld0dsb2JhbFJlZihqQXVkaW9UcmFja0Nscyk7CisgICAgbUF1ZGlvVHJhY2tDbHMgPSByZWludGVycHJldF9jYXN0PGpjbGFzcz4oZW52LT5OZXdHbG9iYWxSZWYoakF1ZGlvVHJhY2tDbHMpKTsKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGpBdWRpb1RyYWNrQ2xzKTsKIAogICAgIG1heFJlcXVpcmVkU3BlZWQgPSBzdGQ6Om1pbihzdGQ6Om1heChtYXhSZXF1aXJlZFNwZWVkLCAxLjBmKSwgQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUFYKTsKIApAQCAtNjQsMTAgKzY1LDE5IEBACiAgICAgam1ldGhvZElEIGpCdWlsZGVyQ3RvciA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICI8aW5pdD4iLCAiKClWIik7CiAgICAgam9iamVjdCBqQnVpbGRlck9iaiA9IGVudi0+TmV3T2JqZWN0KGpCdWlsZGVyQ2xzLCBqQnVpbGRlckN0b3IpOwogCi0gICAgam1ldGhvZElEIGpTZXRBdWRpb0F0dHJpYnV0ZXMgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAic2V0QXVkaW9BdHRyaWJ1dGVzIiwKLSAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzOylMYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrJEJ1aWxkZXI7Iik7Ci0gICAgakJ1aWxkZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJPYmosIGpTZXRBdWRpb0F0dHJpYnV0ZXMsCi0gICAgICAgICAgICBKQXVkaW9BdHRyaWJ1dGVzOjpjcmVhdGVBdWRpb0F0dHJpYnV0ZXNPYmooZW52LCBwQXR0cmlidXRlcywgc3RyZWFtVHlwZSkpOworICAgIHsKKyAgICAgICAgc3A8Sk9iamVjdEhvbGRlcj4gYXVkaW9BdHRyaWJ1dGVzT2JqOworICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBOVUxMKSB7CisgICAgICAgICAgICBhdWRpb0F0dHJpYnV0ZXNPYmogPSBuZXcgSk9iamVjdEhvbGRlcihhdHRyaWJ1dGVzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGF1ZGlvQXR0cmlidXRlc09iaiA9IG5ldyBKT2JqZWN0SG9sZGVyKAorICAgICAgICAgICAgICAgICAgICBKQXVkaW9BdHRyaWJ1dGVzOjpjcmVhdGVBdWRpb0F0dHJpYnV0ZXNPYmooZW52LCBOVUxMKSk7CisgICAgICAgIH0KKyAgICAgICAgam1ldGhvZElEIGpTZXRBdWRpb0F0dHJpYnV0ZXMgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAic2V0QXVkaW9BdHRyaWJ1dGVzIiwKKyAgICAgICAgICAgICAgICAiKExhbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlczspTGFuZHJvaWQvbWVkaWEvQXVkaW9UcmFjayRCdWlsZGVyOyIpOworICAgICAgICBqQnVpbGRlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlck9iaiwKKyAgICAgICAgICAgICAgICBqU2V0QXVkaW9BdHRyaWJ1dGVzLCBhdWRpb0F0dHJpYnV0ZXNPYmotPmdldEpPYmplY3QoKSk7CisgICAgfQogCiAgICAgam1ldGhvZElEIGpTZXRBdWRpb0Zvcm1hdCA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJzZXRBdWRpb0Zvcm1hdCIsCiAgICAgICAgICAgICAiKExhbmRyb2lkL21lZGlhL0F1ZGlvRm9ybWF0OylMYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrJEJ1aWxkZXI7Iik7CkBAIC05Miw2ICsxMDIsNyBAQAogICAgICAgICBqQnVpbGRlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlck9iaiwgalNldFNlc3Npb25JZCwgc2Vzc2lvbklkKTsKICAgICB9CiAKKyAgICBtRmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOwogICAgIGlmIChjYmYgIT0gTlVMTCkgewogICAgICAgICBqbWV0aG9kSUQgalNldE9mZmxvYWRlZFBsYXliYWNrID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgInNldE9mZmxvYWRlZFBsYXliYWNrIiwKICAgICAgICAgICAgICAgICAiKFopTGFuZHJvaWQvbWVkaWEvQXVkaW9UcmFjayRCdWlsZGVyOyIpOwpAQCAtMTAwLDcgKzExMSw5IEBACiAgICAgfQogCiAgICAgam1ldGhvZElEIGpCdWlsZCA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJidWlsZCIsICIoKUxhbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2s7Iik7Ci0gICAgbUF1ZGlvVHJhY2tPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJPYmosIGpCdWlsZCk7CisgICAgam9iamVjdCBqQXVkaW9UcmFja09iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlck9iaiwgakJ1aWxkKTsKKyAgICBtQXVkaW9UcmFja09iaiA9IHJlaW50ZXJwcmV0X2Nhc3Q8am9iamVjdD4oZW52LT5OZXdHbG9iYWxSZWYoakF1ZGlvVHJhY2tPYmopKTsKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGpCdWlsZGVyT2JqKTsKIAogICAgIGlmIChjYmYgIT0gTlVMTCkgewogICAgICAgICAvLyBTZXQgb2ZmbG9hZCBtb2RlIGNhbGxiYWNrCkBAIC0xMTYsMTkgKzEyOSwyMCBAQAogfQogCiBKQXVkaW9UcmFjazo6fkpBdWRpb1RyYWNrKCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtQXVkaW9UcmFja0Nscyk7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobUF1ZGlvVHJhY2tPYmopOwogfQogCiBzaXplX3QgSkF1ZGlvVHJhY2s6OmZyYW1lQ291bnQoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqR2V0QnVmZmVyU2l6ZUluRnJhbWVzID0gZW52LT5HZXRNZXRob2RJRCgKICAgICAgICAgICAgIG1BdWRpb1RyYWNrQ2xzLCAiZ2V0QnVmZmVyU2l6ZUluRnJhbWVzIiwgIigpSSIpOwogICAgIHJldHVybiBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRCdWZmZXJTaXplSW5GcmFtZXMpOwogfQogCiBzaXplX3QgSkF1ZGlvVHJhY2s6OmNoYW5uZWxDb3VudCgpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpHZXRDaGFubmVsQ291bnQgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiZ2V0Q2hhbm5lbENvdW50IiwgIigpSSIpOwogICAgIHJldHVybiBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRDaGFubmVsQ291bnQpOwogfQpAQCAtMTQzLDcgKzE1Nyw3IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqR2V0UGxheWJhY2tIZWFkUG9zaXRpb24gPSBlbnYtPkdldE1ldGhvZElEKAogICAgICAgICAgICAgbUF1ZGlvVHJhY2tDbHMsICJnZXRQbGF5YmFja0hlYWRQb3NpdGlvbiIsICIoKUkiKTsKICAgICAqcG9zaXRpb24gPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRQbGF5YmFja0hlYWRQb3NpdGlvbik7CkBAIC0xNTEsMjEgKzE2NSwyMSBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotYm9vbCBKQXVkaW9UcmFjazo6Z2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKK3N0YXR1c190IEpBdWRpb1RyYWNrOjpnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKIAogICAgIGpjbGFzcyBqQXVkaW9UaW1lU3RhbXBDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9BdWRpb1RpbWVzdGFtcCIpOwogICAgIGpvYmplY3QgakF1ZGlvVGltZVN0YW1wT2JqID0gZW52LT5BbGxvY09iamVjdChqQXVkaW9UaW1lU3RhbXBDbHMpOwogCi0gICAgamZpZWxkSUQgakZyYW1lUG9zaXRpb24gPSBlbnYtPkdldEZpZWxkSUQoakF1ZGlvVGltZVN0YW1wQ2xzLCAiZnJhbWVQb3NpdGlvbiIsICJMIik7Ci0gICAgamZpZWxkSUQgak5hbm9UaW1lID0gZW52LT5HZXRGaWVsZElEKGpBdWRpb1RpbWVTdGFtcENscywgIm5hbm9UaW1lIiwgIkwiKTsKKyAgICBqZmllbGRJRCBqRnJhbWVQb3NpdGlvbiA9IGVudi0+R2V0RmllbGRJRChqQXVkaW9UaW1lU3RhbXBDbHMsICJmcmFtZVBvc2l0aW9uIiwgIkoiKTsKKyAgICBqZmllbGRJRCBqTmFub1RpbWUgPSBlbnYtPkdldEZpZWxkSUQoakF1ZGlvVGltZVN0YW1wQ2xzLCAibmFub1RpbWUiLCAiSiIpOwogCiAgICAgam1ldGhvZElEIGpHZXRUaW1lc3RhbXAgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLAotICAgICAgICAgICAgImdldFRpbWVzdGFtcCIsICIoTGFuZHJvaWQvbWVkaWEvQXVkaW9UaW1lc3RhbXApQiIpOworICAgICAgICAgICAgImdldFRpbWVzdGFtcCIsICIoTGFuZHJvaWQvbWVkaWEvQXVkaW9UaW1lc3RhbXA7KVoiKTsKICAgICBib29sIHN1Y2Nlc3MgPSBlbnYtPkNhbGxCb29sZWFuTWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0VGltZXN0YW1wLCBqQXVkaW9UaW1lU3RhbXBPYmopOwogCiAgICAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogCiAgICAgbG9uZyBsb25nIGZyYW1lUG9zaXRpb24gPSBlbnYtPkdldExvbmdGaWVsZChqQXVkaW9UaW1lU3RhbXBPYmosIGpGcmFtZVBvc2l0aW9uKTsKQEAgLTE3OCw3ICsxOTIsNyBAQAogICAgIHRpbWVzdGFtcC5tVGltZSA9IHRzOwogICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gPSAodWludDMyX3QpIGZyYW1lUG9zaXRpb247CiAKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IEpBdWRpb1RyYWNrOjpnZXRUaW1lc3RhbXAoRXh0ZW5kZWRUaW1lc3RhbXAgKnRpbWVzdGFtcCBfX3VudXNlZCkgewpAQCAtMTg5LDcgKzIwMyw3IEBACiBzdGF0dXNfdCBKQXVkaW9UcmFjazo6c2V0UGxheWJhY2tSYXRlKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZwbGF5YmFja1JhdGUpIHsKICAgICAvLyBUT0RPOiBleGlzdGluZyBuYXRpdmUgQXVkaW9UcmFjayByZXR1cm5zIElOVkFMSURfT1BFUkFUSU9OIG9uIG9mZmxvYWQvZGlyZWN0L2Zhc3QgdHJhY2tzLgogICAgIC8vIFNob3VsZCB3ZSBkbyB0aGUgc2FtZSB0aGluZz8KLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAKICAgICBqY2xhc3MgalBsYXliYWNrUGFyYW1zQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvUGxheWJhY2tQYXJhbXMiKTsKICAgICBqbWV0aG9kSUQgalBsYXliYWNrUGFyYW1zQ3RvciA9IGVudi0+R2V0TWV0aG9kSUQoalBsYXliYWNrUGFyYW1zQ2xzLCAiPGluaXQ+IiwgIigpViIpOwpAQCAtMjI0LDcgKzIzOCw3IEBACiB9CiAKIGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlIEpBdWRpb1RyYWNrOjpnZXRQbGF5YmFja1JhdGUoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogCiAgICAgam1ldGhvZElEIGpHZXRQbGF5YmFja1BhcmFtcyA9IGVudi0+R2V0TWV0aG9kSUQoCiAgICAgICAgICAgICBtQXVkaW9UcmFja0NscywgImdldFBsYXliYWNrUGFyYW1zIiwgIigpTGFuZHJvaWQvbWVkaWEvUGxheWJhY2tQYXJhbXM7Iik7CkBAIC0yNjYsNyArMjgwLDcgQEAKICAgICAgICAgcmV0dXJuIG1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXR1cyhCQURfVkFMVUUpOwogICAgIH0KIAotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKIAogICAgIGptZXRob2RJRCBqQ3JlYXRlVm9sdW1lU2hhcGVyID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImNyZWF0ZVZvbHVtZVNoYXBlciIsCiAgICAgICAgICAgICAiKExhbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlciRDb25maWd1cmF0aW9uOylMYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXI7Iik7CkBAIC0yODIsNyArMjk2LDcgQEAKIH0KIAogc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnNldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCBsZXZlbCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgalNldEF1eEVmZmVjdFNlbmRMZXZlbCA9IGVudi0+R2V0TWV0aG9kSUQoCiAgICAgICAgICAgICBtQXVkaW9UcmFja0NscywgInNldEF1eEVmZmVjdFNlbmRMZXZlbCIsICIoRilJIik7CiAgICAgaW50IHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgalNldEF1eEVmZmVjdFNlbmRMZXZlbCwgbGV2ZWwpOwpAQCAtMjkwLDE0ICszMDQsMTQgQEAKIH0KIAogc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OmF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpBdHRhY2hBdXhFZmZlY3QgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiYXR0YWNoQXV4RWZmZWN0IiwgIihJKUkiKTsKICAgICBpbnQgcmVzdWx0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqQXR0YWNoQXV4RWZmZWN0LCBlZmZlY3RJZCk7CiAgICAgcmV0dXJuIGphdmFUb05hdGl2ZVN0YXR1cyhyZXN1bHQpOwogfQogCiBzdGF0dXNfdCBKQXVkaW9UcmFjazo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIC8vIFRPRE86IEphdmEgc2V0U3RlcmVvVm9sdW1lIGlzIGRlcHJlY2F0ZWQuIERvIHdlIHJlYWxseSBuZWVkIHRoaXMgbWV0aG9kPwogICAgIGptZXRob2RJRCBqU2V0U3RlcmVvVm9sdW1lID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgInNldFN0ZXJlb1ZvbHVtZSIsICIoRkYpSSIpOwogICAgIGludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpTZXRTdGVyZW9Wb2x1bWUsIGxlZnQsIHJpZ2h0KTsKQEAgLTMwNSwxNCArMzE5LDE0IEBACiB9CiAKIHN0YXR1c190IEpBdWRpb1RyYWNrOjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqU2V0Vm9sdW1lID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgInNldFZvbHVtZSIsICIoRilJIik7CiAgICAgaW50IHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgalNldFZvbHVtZSwgdm9sdW1lKTsKICAgICByZXR1cm4gamF2YVRvTmF0aXZlU3RhdHVzKHJlc3VsdCk7CiB9CiAKIHN0YXR1c190IEpBdWRpb1RyYWNrOjpzdGFydCgpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgam1ldGhvZElEIGpQbGF5ID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgInBsYXkiLCAiKClWIik7CiAgICAgLy8gVE9ETzogU2hvdWxkIHdlIGNhdGNoIHRoZSBKYXZhIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBmcm9tIHBsYXkoKT8KICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqUGxheSk7CkBAIC0zMjQsNyArMzM4LDcgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgamJ5dGVBcnJheSBqQXVkaW9EYXRhID0gZW52LT5OZXdCeXRlQXJyYXkoc2l6ZSk7CiAgICAgZW52LT5TZXRCeXRlQXJyYXlSZWdpb24oakF1ZGlvRGF0YSwgMCwgc2l6ZSwgKGpieXRlICopIGJ1ZmZlcik7CiAKQEAgLTM1Myw3ICszNjcsNyBAQAogfQogCiB2b2lkIEpBdWRpb1RyYWNrOjpzdG9wKCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgalN0b3AgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAic3RvcCIsICIoKVYiKTsKICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqU3RvcCk7CiAgICAgLy8gVE9ETzogU2hvdWxkIHdlIGNhdGNoIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbj8KQEAgLTM2NSwyMCArMzc5LDIwIEBACiB9CiAKIHZvaWQgSkF1ZGlvVHJhY2s6OmZsdXNoKCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgakZsdXNoID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImZsdXNoIiwgIigpViIpOwogICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpGbHVzaCk7CiB9CiAKIHZvaWQgSkF1ZGlvVHJhY2s6OnBhdXNlKCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgalBhdXNlID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgInBhdXNlIiwgIigpViIpOwogICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpQYXVzZSk7CiAgICAgLy8gVE9ETzogU2hvdWxkIHdlIGNhdGNoIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbj8KIH0KIAogYm9vbCBKQXVkaW9UcmFjazo6aXNQbGF5aW5nKCkgY29uc3QgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgakdldFBsYXlTdGF0ZSA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJnZXRQbGF5U3RhdGUiLCAiKClJIik7CiAgICAgaW50IGN1cnJlbnRQbGF5U3RhdGUgPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRQbGF5U3RhdGUpOwogCkBAIC0zOTMsNyArNDA3LDcgQEAKIH0KIAogdWludDMyX3QgSkF1ZGlvVHJhY2s6OmdldFNhbXBsZVJhdGUoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqR2V0U2FtcGxlUmF0ZSA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJnZXRTYW1wbGVSYXRlIiwgIigpSSIpOwogICAgIHJldHVybiBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRTYW1wbGVSYXRlKTsKIH0KQEAgLTQwMyw3ICs0MTcsNyBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgakdldEJ1ZmZlclNpemVJbkZyYW1lcyA9IGVudi0+R2V0TWV0aG9kSUQoCiAgICAgICAgICAgICBtQXVkaW9UcmFja0NscywgImdldEJ1ZmZlclNpemVJbkZyYW1lcyIsICIoKUkiKTsKICAgICBpbnQgYnVmZmVyU2l6ZUluRnJhbWVzID0gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0QnVmZmVyU2l6ZUluRnJhbWVzKTsKQEAgLTQxNywxMiArNDMxLDI2IEBACiB9CiAKIGF1ZGlvX2Zvcm1hdF90IEpBdWRpb1RyYWNrOjpmb3JtYXQoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqR2V0QXVkaW9Gb3JtYXQgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiZ2V0QXVkaW9Gb3JtYXQiLCAiKClJIik7CiAgICAgaW50IGphdmFGb3JtYXQgPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRBdWRpb0Zvcm1hdCk7CiAgICAgcmV0dXJuIGF1ZGlvRm9ybWF0VG9OYXRpdmUoamF2YUZvcm1hdCk7CiB9CiAKK3NpemVfdCBKQXVkaW9UcmFjazo6ZnJhbWVTaXplKCkgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqbWV0aG9kSUQgakdldEZvcm1hdCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsCisgICAgICAgICAgICAiZ2V0Rm9ybWF0IiwgIigpTGFuZHJvaWQvbWVkaWEvQXVkaW9Gb3JtYXQ7Iik7CisgICAgam9iamVjdCBqQXVkaW9Gb3JtYXRPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRGb3JtYXQpOworCisgICAgamNsYXNzIGpBdWRpb0Zvcm1hdENscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL0F1ZGlvRm9ybWF0Iik7CisgICAgam1ldGhvZElEIGpHZXRGcmFtZVNpemVJbkJ5dGVzID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIGpBdWRpb0Zvcm1hdENscywgImdldEZyYW1lU2l6ZUluQnl0ZXMiLCAiKClJIik7CisgICAgamludCBqYXZhRnJhbWVTaXplSW5CeXRlcyA9IGVudi0+Q2FsbEludE1ldGhvZChqQXVkaW9Gb3JtYXRPYmosIGpHZXRGcmFtZVNpemVJbkJ5dGVzKTsKKworICAgIHJldHVybiAoc2l6ZV90KWphdmFGcmFtZVNpemVJbkJ5dGVzOworfQorCiBzdGF0dXNfdCBKQXVkaW9UcmFjazo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpIGNvbnN0CiB7CiAgICAgU3RyaW5nOCByZXN1bHQ7CkBAIC00MzIsMTAgKzQ2MCw2IEBACiAgICAgLy8gVE9ETzogUmVtb3ZlIGxvZ3MgdGhhdCBpbmNsdWRlcyB1bmF2YWlsYWJsZSBpbmZvcm1hdGlvbiBmcm9tIGJlbG93LgogLy8gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBzdGF0dXMoJWQpLCBzdGF0ZSglZCksIHNlc3Npb24gSWQoJWQpLCBmbGFncyglI3gpXG4iLAogLy8gICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzLCBtU3RhdGUsIG1TZXNzaW9uSWQsIG1GbGFncyk7Ci0vLyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHN0cmVhbSB0eXBlKCVkKSwgbGVmdCAtIHJpZ2h0IHZvbHVtZSglZiwgJWYpXG4iLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAobVN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpID8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKCZtQXR0cmlidXRlcykgOiBtU3RyZWFtVHlwZSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgbVZvbHVtZVtBVURJT19JTlRFUkxFQVZFX0xFRlRdLCBtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfUklHSFRdKTsKIC8vICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgZm9ybWF0KCUjeCksIGNoYW5uZWwgbWFzayglI3gpLCBjaGFubmVsIGNvdW50KCV1KVxuIiwKIC8vICAgICAgICAgICAgICAgICAgZm9ybWF0KCksIG1DaGFubmVsTWFzaywgY2hhbm5lbENvdW50KCkpOwogLy8gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBzYW1wbGUgcmF0ZSgldSksIG9yaWdpbmFsIHNhbXBsZSByYXRlKCV1KSwgc3BlZWQoJWYpXG4iLApAQCAtNDUzLDM4ICs0NzcsNDAgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLWF1ZGlvX3BvcnRfaGFuZGxlX3QgSkF1ZGlvVHJhY2s6OmdldFJvdXRlZERldmljZUlkKCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworam9iamVjdCBKQXVkaW9UcmFjazo6Z2V0Um91dGVkRGV2aWNlKCkgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKICAgICBqbWV0aG9kSUQgakdldFJvdXRlZERldmljZSA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJnZXRSb3V0ZWREZXZpY2UiLAogICAgICAgICAgICAgIigpTGFuZHJvaWQvbWVkaWEvQXVkaW9EZXZpY2VJbmZvOyIpOwotICAgIGpvYmplY3QgakF1ZGlvRGV2aWNlSW5mb09iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldFJvdXRlZERldmljZSk7Ci0gICAgaWYgKGVudi0+SXNTYW1lT2JqZWN0KGpBdWRpb0RldmljZUluZm9PYmosIE5VTEwpKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19QT1JUX0hBTkRMRV9OT05FOwotICAgIH0KLQotICAgIGpjbGFzcyBqQXVkaW9EZXZpY2VJbmZvQ2xzID0gZW52LT5GaW5kQ2xhc3MoIkxhbmRyb2lkL21lZGlhL0F1ZGlvRGV2aWNlSW5mbyIpOwotICAgIGptZXRob2RJRCBqR2V0SWQgPSBlbnYtPkdldE1ldGhvZElEKGpBdWRpb0RldmljZUluZm9DbHMsICJnZXRJZCIsICIoKUkiKTsKLSAgICBqaW50IHJvdXRlZERldmljZUlkID0gZW52LT5DYWxsSW50TWV0aG9kKGpBdWRpb0RldmljZUluZm9PYmosIGpHZXRJZCk7Ci0gICAgcmV0dXJuIHJvdXRlZERldmljZUlkOworICAgIHJldHVybiBlbnYtPkNhbGxPYmplY3RNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRSb3V0ZWREZXZpY2UpOwogfQogCi1hdWRpb19zZXNzaW9uX3QgSkF1ZGlvVHJhY2s6OmdldEF1ZGlvU2Vzc2lvbklkKCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworaW50MzJfdCBKQXVkaW9UcmFjazo6Z2V0QXVkaW9TZXNzaW9uSWQoKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOwogICAgIGptZXRob2RJRCBqR2V0QXVkaW9TZXNzaW9uSWQgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiZ2V0QXVkaW9TZXNzaW9uSWQiLCAiKClJIik7CiAgICAgamludCBzZXNzaW9uSWQgPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRBdWRpb1Nlc3Npb25JZCk7Ci0gICAgcmV0dXJuIChhdWRpb19zZXNzaW9uX3QpIHNlc3Npb25JZDsKKyAgICByZXR1cm4gc2Vzc2lvbklkOwogfQogCi1zdGF0dXNfdCBKQXVkaW9UcmFjazo6c2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBqY2xhc3Mgak1QMkltcGxDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXllcjJJbXBsIik7Ci0gICAgam1ldGhvZElEIGpTZXRBdWRpb091dHB1dERldmljZUJ5SWQgPSBlbnYtPkdldE1ldGhvZElEKAotICAgICAgICAgICAgak1QMkltcGxDbHMsICJzZXRBdWRpb091dHB1dERldmljZUJ5SWQiLCAiKExhbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2s7SSlaIik7Ci0gICAgamJvb2xlYW4gcmVzdWx0ID0gZW52LT5DYWxsU3RhdGljQm9vbGVhbk1ldGhvZCgKLSAgICAgICAgICAgIGpNUDJJbXBsQ2xzLCBqU2V0QXVkaW9PdXRwdXREZXZpY2VCeUlkLCBtQXVkaW9UcmFja09iaiwgZGV2aWNlSWQpOworc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnNldFByZWZlcnJlZERldmljZShqb2JqZWN0IGRldmljZSkgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqbWV0aG9kSUQgalNldFByZWZlcnJlZERldmljZUlkID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgInNldFByZWZlcnJlZERldmljZSIsCisgICAgICAgICAgICAiKExhbmRyb2lkL21lZGlhL0F1ZGlvRGV2aWNlSW5mbzspWiIpOworICAgIGpib29sZWFuIHJlc3VsdCA9IGVudi0+Q2FsbEJvb2xlYW5NZXRob2QobUF1ZGlvVHJhY2tPYmosIGpTZXRQcmVmZXJyZWREZXZpY2VJZCwgZGV2aWNlKTsKICAgICByZXR1cm4gcmVzdWx0ID09IHRydWUgPyBOT19FUlJPUiA6IEJBRF9WQUxVRTsKIH0KIAorYXVkaW9fc3RyZWFtX3R5cGVfdCBKQXVkaW9UcmFjazo6Z2V0QXVkaW9TdHJlYW1UeXBlKCkgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqbWV0aG9kSUQgakdldEF1ZGlvQXR0cmlidXRlcyA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJnZXRBdWRpb0F0dHJpYnV0ZXMiLAorICAgICAgICAgICAgIigpTGFuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzOyIpOworICAgIGpvYmplY3QgakF1ZGlvQXR0cmlidXRlcyA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldEF1ZGlvQXR0cmlidXRlcyk7CisgICAgamNsYXNzIGpBdWRpb0F0dHJpYnV0ZXNDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMiKTsKKyAgICBqbWV0aG9kSUQgakdldFZvbHVtZUNvbnRyb2xTdHJlYW0gPSBlbnYtPkdldE1ldGhvZElEKGpBdWRpb0F0dHJpYnV0ZXNDbHMsCisgICAgICAgICAgICAiZ2V0Vm9sdW1lQ29udHJvbFN0cmVhbSIsICIoKUkiKTsKKyAgICBpbnQgamF2YUF1ZGlvU3RyZWFtVHlwZSA9IGVudi0+Q2FsbEludE1ldGhvZChqQXVkaW9BdHRyaWJ1dGVzLCBqR2V0Vm9sdW1lQ29udHJvbFN0cmVhbSk7CisgICAgcmV0dXJuIChhdWRpb19zdHJlYW1fdHlwZV90KWphdmFBdWRpb1N0cmVhbVR5cGU7Cit9CisKIHN0YXR1c190IEpBdWRpb1RyYWNrOjpwZW5kaW5nRHVyYXRpb24oaW50MzJfdCAqbXNlYykgewogICAgIGlmIChtc2VjID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTUyNiwxOCArNTUyLDcyIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBKQXVkaW9UcmFjazo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjaygKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjayBfX3VudXNlZCkgewotICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIGFmdGVyIGFwcHJvcHJpYXRlIEphdmEgQXVkaW9UcmFjayBtZXRob2QgaXMgYXZhaWxhYmxlLgorc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCBsaXN0ZW5lciwgam9iamVjdCBoYW5kbGVyKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGptZXRob2RJRCBqQWRkT25Sb3V0aW5nQ2hhbmdlZExpc3RlbmVyID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywKKyAgICAgICAgICAgICJhZGRPblJvdXRpbmdDaGFuZ2VkTGlzdGVuZXIiLAorICAgICAgICAgICAgIihMYW5kcm9pZC9tZWRpYS9BdWRpb1JvdXRpbmckT25Sb3V0aW5nQ2hhbmdlZExpc3RlbmVyO0xhbmRyb2lkL29zL0hhbmRsZXI7KVYiKTsKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqQWRkT25Sb3V0aW5nQ2hhbmdlZExpc3RlbmVyLCBsaXN0ZW5lciwgaGFuZGxlcik7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBKQXVkaW9UcmFjazo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjaygKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjayBfX3VudXNlZCkgewotICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIGFmdGVyIGFwcHJvcHJpYXRlIEphdmEgQXVkaW9UcmFjayBtZXRob2QgaXMgYXZhaWxhYmxlLgorc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCBsaXN0ZW5lcikgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqbWV0aG9kSUQgalJlbW92ZU9uUm91dGluZ0NoYW5nZWRMaXN0ZW5lciA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsCisgICAgICAgICAgICAicmVtb3ZlT25Sb3V0aW5nQ2hhbmdlZExpc3RlbmVyIiwKKyAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvQXVkaW9Sb3V0aW5nJE9uUm91dGluZ0NoYW5nZWRMaXN0ZW5lcjspViIpOworICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpSZW1vdmVPblJvdXRpbmdDaGFuZ2VkTGlzdGVuZXIsIGxpc3RlbmVyKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3ZvaWQgSkF1ZGlvVHJhY2s6OnJlZ2lzdGVyUm91dGluZ0RlbGVnYXRlcygKKyAgICAgICAgVmVjdG9yPHN0ZDo6cGFpcjxzcDxKT2JqZWN0SG9sZGVyPiwgc3A8Sk9iamVjdEhvbGRlcj4+PiYgcm91dGluZ0RlbGVnYXRlcykgeworICAgIGZvciAoYXV0byBpdCA9IHJvdXRpbmdEZWxlZ2F0ZXMuYmVnaW4oKTsgaXQgIT0gcm91dGluZ0RlbGVnYXRlcy5lbmQoKTsgaXQrKykgeworICAgICAgICBhZGRBdWRpb0RldmljZUNhbGxiYWNrKGl0LT5zZWNvbmQtPmdldEpPYmplY3QoKSwgZ2V0SGFuZGxlcihpdC0+c2Vjb25kLT5nZXRKT2JqZWN0KCkpKTsKKyAgICB9Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vLyAgICAgICAgICAgICAgICBTdGF0aWMgbWV0aG9kcyBiZWdpbiAgICAgICAgICAgICAgICAgICAvLy8KKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK2pvYmplY3QgSkF1ZGlvVHJhY2s6OmdldExpc3RlbmVyKGNvbnN0IGpvYmplY3Qgcm91dGluZ0RlbGVnYXRlT2JqKSB7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGpjbGFzcyBqUm91dGluZ0RlbGVnYXRlQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvUm91dGluZ0RlbGVnYXRlIik7CisgICAgam1ldGhvZElEIGpHZXRMaXN0ZW5lciA9IGVudi0+R2V0TWV0aG9kSUQoalJvdXRpbmdEZWxlZ2F0ZUNscywKKyAgICAgICAgICAgICJnZXRMaXN0ZW5lciIsICIoKUxhbmRyb2lkL21lZGlhL0F1ZGlvUm91dGluZyRPblJvdXRpbmdDaGFuZ2VkTGlzdGVuZXI7Iik7CisgICAgcmV0dXJuIGVudi0+Q2FsbE9iamVjdE1ldGhvZChyb3V0aW5nRGVsZWdhdGVPYmosIGpHZXRMaXN0ZW5lcik7Cit9CisKK2pvYmplY3QgSkF1ZGlvVHJhY2s6OmdldEhhbmRsZXIoY29uc3Qgam9iamVjdCByb3V0aW5nRGVsZWdhdGVPYmopIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgamNsYXNzIGpSb3V0aW5nRGVsZWdhdGVDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9Sb3V0aW5nRGVsZWdhdGUiKTsKKyAgICBqbWV0aG9kSUQgakdldEhhbmRsZXIgPSBlbnYtPkdldE1ldGhvZElEKGpSb3V0aW5nRGVsZWdhdGVDbHMsCisgICAgICAgICJnZXRIYW5kbGVyIiwgIigpTGFuZHJvaWQvb3MvSGFuZGxlcjsiKTsKKyAgICByZXR1cm4gZW52LT5DYWxsT2JqZWN0TWV0aG9kKHJvdXRpbmdEZWxlZ2F0ZU9iaiwgakdldEhhbmRsZXIpOworfQorCitqb2JqZWN0IEpBdWRpb1RyYWNrOjpmaW5kQnlLZXkoCisgICAgICAgIFZlY3RvcjxzdGQ6OnBhaXI8c3A8Sk9iamVjdEhvbGRlcj4sIHNwPEpPYmplY3RIb2xkZXI+Pj4mIG1wLCBjb25zdCBqb2JqZWN0IGtleSkgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBmb3IgKGF1dG8gaXQgPSBtcC5iZWdpbigpOyBpdCAhPSBtcC5lbmQoKTsgaXQrKykgeworICAgICAgICBpZiAoZW52LT5Jc1NhbWVPYmplY3QoaXQtPmZpcnN0LT5nZXRKT2JqZWN0KCksIGtleSkpIHsKKyAgICAgICAgICAgIHJldHVybiBpdC0+c2Vjb25kLT5nZXRKT2JqZWN0KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3ZvaWQgSkF1ZGlvVHJhY2s6OmVyYXNlQnlLZXkoCisgICAgICAgIFZlY3RvcjxzdGQ6OnBhaXI8c3A8Sk9iamVjdEhvbGRlcj4sIHNwPEpPYmplY3RIb2xkZXI+Pj4mIG1wLCBjb25zdCBqb2JqZWN0IGtleSkgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBmb3IgKGF1dG8gaXQgPSBtcC5iZWdpbigpOyBpdCAhPSBtcC5lbmQoKTsgaXQrKykgeworICAgICAgICBpZiAoZW52LT5Jc1NhbWVPYmplY3QoaXQtPmZpcnN0LT5nZXRKT2JqZWN0KCksIGtleSkpIHsKKyAgICAgICAgICAgIG1wLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8vICAgICAgICAgICAgICAgIFByaXZhdGUgbWV0aG9kIGJlZ2lucyAgICAgICAgICAgICAgICAgIC8vLwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtNTUwLDcgKzYzMCw3IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKIAogICAgIC8vIFJlZmVyZW5jZWQgImFuZHJvaWRfbWVkaWFfVm9sdW1lU2hhcGVyLmgiLgogICAgIGpmbG9hdEFycmF5IHhhcnJheSA9IG51bGxwdHI7CkBAIC01OTUsNyArNjc1LDcgQEAKIGpvYmplY3QgSkF1ZGlvVHJhY2s6OmNyZWF0ZVZvbHVtZVNoYXBlck9wZXJhdGlvbk9iaigKICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKSB7CiAKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAKICAgICBqY2xhc3MgakJ1aWxkZXJDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIkT3BlcmF0aW9uJEJ1aWxkZXIiKTsKICAgICBqbWV0aG9kSUQgakJ1aWxkZXJDdG9yID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgIjxpbml0PiIsICIoKVYiKTsKQEAgLTY0NywxNSArNzI3LDE1IEBACiB9CiAKIGpvYmplY3QgSkF1ZGlvVHJhY2s6OmNyZWF0ZVN0cmVhbUV2ZW50Q2FsbGJhY2soY2FsbGJhY2tfdCBjYmYsIHZvaWQqIHVzZXIpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBqY2xhc3MgakNhbGxiYWNrQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvTWVkaWFQbGF5ZXIySW1wbCRTdHJlYW1FdmVudENhbGxiYWNrIik7CisgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGpjbGFzcyBqQ2FsbGJhY2tDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXllcjIkU3RyZWFtRXZlbnRDYWxsYmFjayIpOwogICAgIGptZXRob2RJRCBqQ2FsbGJhY2tDdG9yID0gZW52LT5HZXRNZXRob2RJRChqQ2FsbGJhY2tDbHMsICI8aW5pdD4iLCAiKEpKSilWIik7CiAgICAgam9iamVjdCBqQ2FsbGJhY2tPYmogPSBlbnYtPk5ld09iamVjdChqQ2FsbGJhY2tDbHMsIGpDYWxsYmFja0N0b3IsIHRoaXMsIGNiZiwgdXNlcik7CiAgICAgcmV0dXJuIGpDYWxsYmFja09iajsKIH0KIAogam9iamVjdCBKQXVkaW9UcmFjazo6Y3JlYXRlQ2FsbGJhY2tFeGVjdXRvcigpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CiAgICAgamNsYXNzIGpFeGVjdXRvcnNDbHMgPSBlbnYtPkZpbmRDbGFzcygiamF2YS91dGlsL2NvbmN1cnJlbnQvRXhlY3V0b3JzIik7CiAgICAgam1ldGhvZElEIGpOZXdTaW5nbGVUaHJlYWRFeGVjdXRvciA9IGVudi0+R2V0U3RhdGljTWV0aG9kSUQoakV4ZWN1dG9yc0NscywKICAgICAgICAgICAgICJuZXdTaW5nbGVUaHJlYWRFeGVjdXRvciIsICIoKUxqYXZhL3V0aWwvY29uY3VycmVudC9FeGVjdXRvclNlcnZpY2U7Iik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBDb25uZWN0aW9uLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9KTWVkaWEySFRUUENvbm5lY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYmFhMTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBDb25uZWN0aW9uLmNwcApAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJKTWVkaWEySFRUUENvbm5lY3Rpb24iCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bmF0aXZlaGVscGVyL3Njb3BlZF9sb2NhbF9yZWYuaD4KKworI2luY2x1ZGUgImxvZy9sb2cuaCIKKyNpbmNsdWRlICJqbmkuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtCdWZmZXJTaXplID0gMzI3Njg7CisKK0pNZWRpYTJIVFRQQ29ubmVjdGlvbjo6Sk1lZGlhMkhUVFBDb25uZWN0aW9uKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopIHsKKyAgICBtTWVkaWEySFRUUENvbm5lY3Rpb25PYmogPSBlbnYtPk5ld0dsb2JhbFJlZih0aGl6KTsKKyAgICBDSEVDSyhtTWVkaWEySFRUUENvbm5lY3Rpb25PYmogIT0gTlVMTCk7CisKKyAgICBTY29wZWRMb2NhbFJlZjxqY2xhc3M+IG1lZGlhMkhUVFBDb25uZWN0aW9uQ2xhc3MoCisgICAgICAgICAgICBlbnYsIGVudi0+R2V0T2JqZWN0Q2xhc3MobU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqKSk7CisgICAgQ0hFQ0sobWVkaWEySFRUUENvbm5lY3Rpb25DbGFzcy5nZXQoKSAhPSBOVUxMKTsKKworICAgIG1Db25uZWN0TWV0aG9kID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIG1lZGlhMkhUVFBDb25uZWN0aW9uQ2xhc3MuZ2V0KCksCisgICAgICAgICAgICAiY29ubmVjdCIsCisgICAgICAgICAgICAiKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylaIik7CisgICAgQ0hFQ0sobUNvbm5lY3RNZXRob2QgIT0gTlVMTCk7CisKKyAgICBtRGlzY29ubmVjdE1ldGhvZCA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBtZWRpYTJIVFRQQ29ubmVjdGlvbkNsYXNzLmdldCgpLAorICAgICAgICAgICAgImRpc2Nvbm5lY3QiLAorICAgICAgICAgICAgIigpViIpOworICAgIENIRUNLKG1EaXNjb25uZWN0TWV0aG9kICE9IE5VTEwpOworCisgICAgbVJlYWRBdE1ldGhvZCA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBtZWRpYTJIVFRQQ29ubmVjdGlvbkNsYXNzLmdldCgpLAorICAgICAgICAgICAgInJlYWRBdCIsCisgICAgICAgICAgICAiKEpbQkkpSSIpOworICAgIENIRUNLKG1SZWFkQXRNZXRob2QgIT0gTlVMTCk7CisKKyAgICBtR2V0U2l6ZU1ldGhvZCA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBtZWRpYTJIVFRQQ29ubmVjdGlvbkNsYXNzLmdldCgpLAorICAgICAgICAgICAgImdldFNpemUiLAorICAgICAgICAgICAgIigpSiIpOworICAgIENIRUNLKG1HZXRTaXplTWV0aG9kICE9IE5VTEwpOworCisgICAgbUdldE1JTUVUeXBlTWV0aG9kID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIG1lZGlhMkhUVFBDb25uZWN0aW9uQ2xhc3MuZ2V0KCksCisgICAgICAgICAgICAiZ2V0TUlNRVR5cGUiLAorICAgICAgICAgICAgIigpTGphdmEvbGFuZy9TdHJpbmc7Iik7CisgICAgQ0hFQ0sobUdldE1JTUVUeXBlTWV0aG9kICE9IE5VTEwpOworCisgICAgbUdldFVyaU1ldGhvZCA9IGVudi0+R2V0TWV0aG9kSUQoCisgICAgICAgICAgICBtZWRpYTJIVFRQQ29ubmVjdGlvbkNsYXNzLmdldCgpLAorICAgICAgICAgICAgImdldFVyaSIsCisgICAgICAgICAgICAiKClMamF2YS9sYW5nL1N0cmluZzsiKTsKKyAgICBDSEVDSyhtR2V0VXJpTWV0aG9kICE9IE5VTEwpOworCisgICAgU2NvcGVkTG9jYWxSZWY8amJ5dGVBcnJheT4gdG1wKAorICAgICAgICBlbnYsIGVudi0+TmV3Qnl0ZUFycmF5KGtCdWZmZXJTaXplKSk7CisgICAgbUJ5dGVBcnJheU9iaiA9IChqYnl0ZUFycmF5KWVudi0+TmV3R2xvYmFsUmVmKHRtcC5nZXQoKSk7CisgICAgQ0hFQ0sobUJ5dGVBcnJheU9iaiAhPSBOVUxMKTsKK30KKworSk1lZGlhMkhUVFBDb25uZWN0aW9uOjp+Sk1lZGlhMkhUVFBDb25uZWN0aW9uKCkgeworICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtTWVkaWEySFRUUENvbm5lY3Rpb25PYmopOworICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1CeXRlQXJyYXlPYmopOworfQorCitib29sIEpNZWRpYTJIVFRQQ29ubmVjdGlvbjo6Y29ubmVjdCgKKyAgICAgICAgY29uc3QgY2hhciAqdXJpLCBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycykgeworICAgIFN0cmluZzggdG1wKCIiKTsKKyAgICBpZiAoaGVhZGVycyAhPSBOVUxMKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVhZGVycy0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIHRtcC5hcHBlbmQoaGVhZGVycy0+a2V5QXQoaSkpOworICAgICAgICAgICAgdG1wLmFwcGVuZChTdHJpbmc4KCI6ICIpKTsKKyAgICAgICAgICAgIHRtcC5hcHBlbmQoaGVhZGVycy0+dmFsdWVBdChpKSk7CisgICAgICAgICAgICB0bXAuYXBwZW5kKFN0cmluZzgoIlxyXG4iKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBKTklFbnYqIGVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAganN0cmluZyBqdXJpID0gZW52LT5OZXdTdHJpbmdVVEYodXJpKTsKKyAgICBqc3RyaW5nIGpoZWFkZXJzID0gZW52LT5OZXdTdHJpbmdVVEYodG1wLnN0cmluZygpKTsKKworICAgIGpib29sZWFuIHJldCA9CisgICAgICAgIGVudi0+Q2FsbEJvb2xlYW5NZXRob2QobU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqLCBtQ29ubmVjdE1ldGhvZCwganVyaSwgamhlYWRlcnMpOworCisgICAgZW52LT5EZWxldGVMb2NhbFJlZihqdXJpKTsKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGpoZWFkZXJzKTsKKworICAgIHJldHVybiAoYm9vbClyZXQ7Cit9CisKK3ZvaWQgSk1lZGlhMkhUVFBDb25uZWN0aW9uOjpkaXNjb25uZWN0KCkgeworICAgIEpOSUVudiogZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1NZWRpYTJIVFRQQ29ubmVjdGlvbk9iaiwgbURpc2Nvbm5lY3RNZXRob2QpOworfQorCitzc2l6ZV90IEpNZWRpYTJIVFRQQ29ubmVjdGlvbjo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEpOSUVudiogZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKworICAgIGlmIChzaXplID4ga0J1ZmZlclNpemUpIHsKKyAgICAgICAgc2l6ZSA9IGtCdWZmZXJTaXplOworICAgIH0KKworICAgIGppbnQgbiA9IGVudi0+Q2FsbEludE1ldGhvZCgKKyAgICAgICAgICAgIG1NZWRpYTJIVFRQQ29ubmVjdGlvbk9iaiwgbVJlYWRBdE1ldGhvZCwgKGpsb25nKW9mZnNldCwgbUJ5dGVBcnJheU9iaiwgKGppbnQpc2l6ZSk7CisKKyAgICBpZiAobiA+IDApIHsKKyAgICAgICAgZW52LT5HZXRCeXRlQXJyYXlSZWdpb24oCisgICAgICAgICAgICAgICAgbUJ5dGVBcnJheU9iaiwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIG4sCisgICAgICAgICAgICAgICAgKGpieXRlICopZGF0YSk7CisgICAgfQorCisgICAgcmV0dXJuIG47Cit9CisKK29mZjY0X3QgSk1lZGlhMkhUVFBDb25uZWN0aW9uOjpnZXRTaXplKCkgeworICAgIEpOSUVudiogZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICByZXR1cm4gKG9mZjY0X3QpKGVudi0+Q2FsbExvbmdNZXRob2QobU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqLCBtR2V0U2l6ZU1ldGhvZCkpOworfQorCitzdGF0dXNfdCBKTWVkaWEySFRUUENvbm5lY3Rpb246OmdldE1JTUVUeXBlKFN0cmluZzggKm1pbWVUeXBlKSB7CisgICAgSk5JRW52KiBlbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGpzdHJpbmcgam1pbWUgPSAoanN0cmluZyllbnYtPkNhbGxPYmplY3RNZXRob2QobU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqLCBtR2V0TUlNRVR5cGVNZXRob2QpOworICAgIGpib29sZWFuIGZsYWcgPSBlbnYtPkV4Y2VwdGlvbkNoZWNrKCk7CisgICAgaWYgKGZsYWcpIHsKKyAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyICpzdHIgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGptaW1lLCAwKTsKKyAgICBpZiAoc3RyICE9IE5VTEwpIHsKKyAgICAgICAgKm1pbWVUeXBlID0gU3RyaW5nOChzdHIpOworICAgIH0gZWxzZSB7CisgICAgICAgICptaW1lVHlwZSA9ICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iOworICAgIH0KKyAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqbWltZSwgc3RyKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEpNZWRpYTJIVFRQQ29ubmVjdGlvbjo6Z2V0VXJpKFN0cmluZzggKnVyaSkgeworICAgIEpOSUVudiogZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICBqc3RyaW5nIGp1cmkgPSAoanN0cmluZyllbnYtPkNhbGxPYmplY3RNZXRob2QobU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqLCBtR2V0VXJpTWV0aG9kKTsKKyAgICBqYm9vbGVhbiBmbGFnID0gZW52LT5FeGNlcHRpb25DaGVjaygpOworICAgIGlmIChmbGFnKSB7CisgICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgY29uc3QgY2hhciAqc3RyID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhqdXJpLCAwKTsKKyAgICAqdXJpID0gU3RyaW5nOChzdHIpOworICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGp1cmksIHN0cik7CisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBTZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGUzNTczCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQU2VydmljZS5jcHAKQEAgLTAsMCArMSw1OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJKTWVkaWEySFRUUFNlcnZpY2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxqbmkuaD4KKworI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KYXZhVk1IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0pNZWRpYTJIVFRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisKKyNpbmNsdWRlIDxuYXRpdmVoZWxwZXIvc2NvcGVkX2xvY2FsX3JlZi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0pNZWRpYTJIVFRQU2VydmljZTo6Sk1lZGlhMkhUVFBTZXJ2aWNlKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopIHsKKyAgICBtTWVkaWEySFRUUFNlcnZpY2VPYmogPSBlbnYtPk5ld0dsb2JhbFJlZih0aGl6KTsKKyAgICBDSEVDSyhtTWVkaWEySFRUUFNlcnZpY2VPYmogIT0gTlVMTCk7CisKKyAgICBTY29wZWRMb2NhbFJlZjxqY2xhc3M+IG1lZGlhMkhUVFBTZXJ2aWNlQ2xhc3MoZW52LCBlbnYtPkdldE9iamVjdENsYXNzKG1NZWRpYTJIVFRQU2VydmljZU9iaikpOworICAgIENIRUNLKG1lZGlhMkhUVFBTZXJ2aWNlQ2xhc3MuZ2V0KCkgIT0gTlVMTCk7CisKKyAgICBtTWFrZUhUVFBDb25uZWN0aW9uTWV0aG9kID0gZW52LT5HZXRNZXRob2RJRCgKKyAgICAgICAgICAgIG1lZGlhMkhUVFBTZXJ2aWNlQ2xhc3MuZ2V0KCksCisgICAgICAgICAgICAibWFrZUhUVFBDb25uZWN0aW9uIiwKKyAgICAgICAgICAgICIoKUxhbmRyb2lkL21lZGlhL01lZGlhMkhUVFBDb25uZWN0aW9uOyIpOworICAgIENIRUNLKG1NYWtlSFRUUENvbm5lY3Rpb25NZXRob2QgIT0gTlVMTCk7Cit9CisKK0pNZWRpYTJIVFRQU2VydmljZTo6fkpNZWRpYTJIVFRQU2VydmljZSgpIHsKKyAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgZW52LT5EZWxldGVHbG9iYWxSZWYobU1lZGlhMkhUVFBTZXJ2aWNlT2JqKTsKK30KKworc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gSk1lZGlhMkhUVFBTZXJ2aWNlOjptYWtlSFRUUENvbm5lY3Rpb24oKSB7CisgICAgSk5JRW52KiBlbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGpvYmplY3QgbWVkaWEySFRUUENvbm5lY3Rpb25PYmogPQorICAgICAgICBlbnYtPkNhbGxPYmplY3RNZXRob2QobU1lZGlhMkhUVFBTZXJ2aWNlT2JqLCBtTWFrZUhUVFBDb25uZWN0aW9uTWV0aG9kKTsKKworICAgIHJldHVybiBuZXcgSk1lZGlhMkhUVFBDb25uZWN0aW9uKGVudiwgbWVkaWEySFRUUENvbm5lY3Rpb25PYmopOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDAzZWQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5jcHAKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiSmF2YVZNSGVscGVyIgorCisjaW5jbHVkZSAibWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oIgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzdGF0aWMKK3N0ZDo6YXRvbWljPEphdmFWTSAqPiBKYXZhVk1IZWxwZXI6OnNKYXZhVk0oTlVMTCk7CisKKy8qCisgKiBNYWtlcyB0aGUgY3VycmVudCB0aHJlYWQgdmlzaWJsZSB0byB0aGUgVk0uCisgKgorICogVGhlIEpOSUVudiBwb2ludGVyIHJldHVybmVkIGlzIG9ubHkgdmFsaWQgZm9yIHRoZSBjdXJyZW50IHRocmVhZCwgYW5kCisgKiB0aHVzIG11c3QgYmUgdHVja2VkIGludG8gdGhyZWFkLWxvY2FsIHN0b3JhZ2UuCisgKi8KK3N0YXRpYyBpbnQgamF2YUF0dGFjaFRocmVhZChjb25zdCBjaGFyKiB0aHJlYWROYW1lLCBKTklFbnYqKiBwRW52KSB7CisgICAgSmF2YVZNQXR0YWNoQXJncyBhcmdzOworICAgIEphdmFWTSogdm07CisgICAgamludCByZXN1bHQ7CisKKyAgICB2bSA9IEphdmFWTUhlbHBlcjo6Z2V0SmF2YVZNKCk7CisgICAgaWYgKHZtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEpOSV9FUlI7CisgICAgfQorCisgICAgYXJncy52ZXJzaW9uID0gSk5JX1ZFUlNJT05fMV80OworICAgIGFyZ3MubmFtZSA9IChjaGFyKikgdGhyZWFkTmFtZTsKKyAgICBhcmdzLmdyb3VwID0gTlVMTDsKKworICAgIHJlc3VsdCA9IHZtLT5BdHRhY2hDdXJyZW50VGhyZWFkKHBFbnYsICh2b2lkKikgJmFyZ3MpOworICAgIGlmIChyZXN1bHQgIT0gSk5JX09LKSB7CisgICAgICAgIEFMT0dJKCJOT1RFOiBhdHRhY2ggb2YgdGhyZWFkICclcycgZmFpbGVkXG4iLCB0aHJlYWROYW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKgorICogRGV0YWNoIHRoZSBjdXJyZW50IHRocmVhZCBmcm9tIHRoZSBzZXQgdmlzaWJsZSB0byB0aGUgVk0uCisgKi8KK3N0YXRpYyBpbnQgamF2YURldGFjaFRocmVhZCh2b2lkKSB7CisgICAgSmF2YVZNKiB2bTsKKyAgICBqaW50IHJlc3VsdDsKKworICAgIHZtID0gSmF2YVZNSGVscGVyOjpnZXRKYXZhVk0oKTsKKyAgICBpZiAodm0gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gSk5JX0VSUjsKKyAgICB9CisKKyAgICByZXN1bHQgPSB2bS0+RGV0YWNoQ3VycmVudFRocmVhZCgpOworICAgIGlmIChyZXN1bHQgIT0gSk5JX09LKSB7CisgICAgICAgIEFMT0dFKCJFUlJPUjogdGhyZWFkIGRldGFjaCBmYWlsZWRcbiIpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKgorICogV2hlbiBzdGFydGluZyBhIG5hdGl2ZSB0aHJlYWQgdGhhdCB3aWxsIGJlIHZpc2libGUgZnJvbSB0aGUgVk0sIHdlCisgKiBib3VuY2UgdGhyb3VnaCB0aGlzIHRvIGdldCB0aGUgcmlnaHQgYXR0YWNoL2RldGFjaCBhY3Rpb24uCisgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBjYWxscyBmcmVlKGFyZ3MpCisgKi8KK3N0YXRpYyBpbnQgamF2YVRocmVhZFNoZWxsKHZvaWQqIGFyZ3MpIHsKKyAgICB2b2lkKiBzdGFydCA9ICgodm9pZCoqKWFyZ3MpWzBdOworICAgIHZvaWQqIHVzZXJEYXRhID0gKCh2b2lkICoqKWFyZ3MpWzFdOworICAgIGNoYXIqIG5hbWUgPSAoY2hhciopICgodm9pZCAqKilhcmdzKVsyXTsgICAgICAgIC8vIHdlIG93biB0aGlzIHN0b3JhZ2UKKyAgICBmcmVlKGFyZ3MpOworICAgIEpOSUVudiogZW52OworICAgIGludCByZXN1bHQ7CisKKyAgICAvKiBob29rIHVzIGludG8gdGhlIFZNICovCisgICAgaWYgKGphdmFBdHRhY2hUaHJlYWQobmFtZSwgJmVudikgIT0gSk5JX09LKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvKiBzdGFydCB0aGUgdGhyZWFkIHJ1bm5pbmcgKi8KKyAgICByZXN1bHQgPSAoKihhbmRyb2lkX3RocmVhZF9mdW5jX3Qpc3RhcnQpKHVzZXJEYXRhKTsKKworICAgIC8qIHVuaG9vayB1cyAqLworICAgIGphdmFEZXRhY2hUaHJlYWQoKTsKKyAgICBmcmVlKG5hbWUpOworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyoKKyAqIFRoaXMgaXMgaW52b2tlZCBmcm9tIGFuZHJvaWRDcmVhdGVUaHJlYWRFdGMoKSB2aWEgdGhlIGNhbGxiYWNrCisgKiBzZXQgd2l0aCBhbmRyb2lkU2V0Q3JlYXRlVGhyZWFkRnVuYygpLgorICoKKyAqIFdlIG5lZWQgdG8gY3JlYXRlIHRoZSBuZXcgdGhyZWFkIGluIHN1Y2ggYSB3YXkgdGhhdCBpdCBnZXRzIGhvb2tlZAorICogaW50byB0aGUgVk0gYmVmb3JlIGl0IHJlYWxseSBzdGFydHMgZXhlY3V0aW5nLgorICovCitzdGF0aWMgaW50IGphdmFDcmVhdGVUaHJlYWRFdGMoCisgICAgICAgIGFuZHJvaWRfdGhyZWFkX2Z1bmNfdCBlbnRyeUZ1bmN0aW9uLAorICAgICAgICB2b2lkKiB1c2VyRGF0YSwKKyAgICAgICAgY29uc3QgY2hhciogdGhyZWFkTmFtZSwKKyAgICAgICAgaW50MzJfdCB0aHJlYWRQcmlvcml0eSwKKyAgICAgICAgc2l6ZV90IHRocmVhZFN0YWNrU2l6ZSwKKyAgICAgICAgYW5kcm9pZF90aHJlYWRfaWRfdCogdGhyZWFkSWQpIHsKKyAgICB2b2lkKiogYXJncyA9ICh2b2lkKiopIG1hbGxvYygzICogc2l6ZW9mKHZvaWQqKSk7ICAgLy8gamF2YVRocmVhZFNoZWxsIG11c3QgZnJlZQorICAgIGludCByZXN1bHQ7CisKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHRocmVhZE5hbWUgPT0gbnVsbHB0ciwgInRocmVhZE5hbWUgbm90IHByb3ZpZGVkIHRvIGphdmFDcmVhdGVUaHJlYWRFdGMiKTsKKworICAgIGFyZ3NbMF0gPSAodm9pZCopIGVudHJ5RnVuY3Rpb247CisgICAgYXJnc1sxXSA9IHVzZXJEYXRhOworICAgIGFyZ3NbMl0gPSAodm9pZCopIHN0cmR1cCh0aHJlYWROYW1lKTsgICAvLyBqYXZhVGhyZWFkU2hlbGwgbXVzdCBmcmVlCisKKyAgICByZXN1bHQgPSBhbmRyb2lkQ3JlYXRlUmF3VGhyZWFkRXRjKGphdmFUaHJlYWRTaGVsbCwgYXJncywKKyAgICAgICAgdGhyZWFkTmFtZSwgdGhyZWFkUHJpb3JpdHksIHRocmVhZFN0YWNrU2l6ZSwgdGhyZWFkSWQpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIHN0YXRpYworSk5JRW52ICpKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpIHsKKyAgICBKTklFbnYgKmVudjsKKyAgICBKYXZhVk0gKnZtID0gc0phdmFWTS5sb2FkKCk7CisgICAgQ0hFQ0sodm0gIT0gTlVMTCk7CisKKyAgICBpZiAodm0tPkdldEVudigodm9pZCAqKikmZW52LCBKTklfVkVSU0lPTl8xXzQpICE9IEpOSV9PSykgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gZW52OworfQorCisvL3N0YXRpYworSmF2YVZNICpKYXZhVk1IZWxwZXI6OmdldEphdmFWTSgpIHsKKyAgICByZXR1cm4gc0phdmFWTS5sb2FkKCk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBKYXZhVk1IZWxwZXI6OnNldEphdmFWTShKYXZhVk0gKnZtKSB7CisgICAgc0phdmFWTS5zdG9yZSh2bSk7CisKKyAgICAvLyBFbnN1cmUgdGhhdCBUaHJlYWQoLypjYW5DYWxsSmF2YSovIHRydWUpIGluIGxpYnV0aWxzIGlzIGF0dGFjaGVkIHRvIHRoZSBWTS4KKyAgICAvLyBUaGlzIGlzIHN1cHBvc2VkIHRvIGJlIGRvbmUgYnkgcnVudGltZSwgYnV0IHdoZW4gbGlidXRpbHMgaXMgdXNlZCB3aXRoIGxpbmtlcgorICAgIC8vIG5hbWVzcGFjZSwgQ3JlYXRlVGhyZWFkRnVuYyBzaG91bGQgYmUgaW5pdGlhbGl6ZWQgc2VwYXJhdGVseSB3aXRoaW4gdGhlIG5hbWVzcGFjZS4KKyAgICBhbmRyb2lkU2V0Q3JlYXRlVGhyZWFkRnVuYygoYW5kcm9pZF9jcmVhdGVfdGhyZWFkX2ZuKSBqYXZhQ3JlYXRlVGhyZWFkRXRjKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQuY3BwCmluZGV4IGE4ZTFkMWYuLmI0ZmEwYzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkF1ZGlvT3V0cHV0LmNwcApAQCAtMjIsOCArMjIsNiBAQAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+IC8vIGZvciBwcm9wZXJ0eV9nZXQKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAKIG5hbWVzcGFjZSB7CkBAIC00NCwzMSArNDIsMjggQEAKICAgICBTdHJpbmc4IHJlc3VsdDsKIAogICAgIHJlc3VsdC5hcHBlbmQoIiBNZWRpYVBsYXllcjJBdWRpb091dHB1dFxuIik7Ci0gICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIHN0cmVhbSB0eXBlKCVkKSwgbGVmdCAtIHJpZ2h0IHZvbHVtZSglZiwgJWYpXG4iLAotICAgICAgICAgICAgbVN0cmVhbVR5cGUsIG1MZWZ0Vm9sdW1lLCBtUmlnaHRWb2x1bWUpOworICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiICB2b2x1bWUoJWYpXG4iLCBtVm9sdW1lKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIG1zZWMgcGVyIGZyYW1lKCVmKSwgbGF0ZW5jeSAoJWQpXG4iLAotICAgICAgICAgICAgbU1zZWNzUGVyRnJhbWUsIChtVHJhY2sgIT0gMCkgPyBtVHJhY2stPmxhdGVuY3koKSA6IC0xKTsKKyAgICAgICAgICAgIG1Nc2Vjc1BlckZyYW1lLCAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpID8gbUpBdWRpb1RyYWNrLT5sYXRlbmN5KCkgOiAtMSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgMjU1LCAiICBhdXggZWZmZWN0IGlkKCVkKSwgc2VuZCBsZXZlbCAoJWYpXG4iLAogICAgICAgICAgICAgbUF1eEVmZmVjdElkLCBtU2VuZExldmVsKTsKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAKICAgICA6OndyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICBtVHJhY2stPmR1bXAoZmQsIGFyZ3MpOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtSkF1ZGlvVHJhY2stPmR1bXAoZmQsIGFyZ3MpOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLU1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpNZWRpYVBsYXllcjJBdWRpb091dHB1dChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLCB1aWRfdCB1aWQsIGludCBwaWQsCi0gICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogYXR0ciwgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBkZXZpY2VDYWxsYmFjaykKLSAgICA6IG1DYWxsYmFjayhOVUxMKSwKLSAgICAgIG1DYWxsYmFja0Nvb2tpZShOVUxMKSwKLSAgICAgIG1DYWxsYmFja0RhdGEoTlVMTCksCi0gICAgICBtU3RyZWFtVHlwZShBVURJT19TVFJFQU1fTVVTSUMpLAotICAgICAgbUxlZnRWb2x1bWUoMS4wKSwKLSAgICAgIG1SaWdodFZvbHVtZSgxLjApLAorTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6Ok1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KGludDMyX3Qgc2Vzc2lvbklkLCB1aWRfdCB1aWQsIGludCBwaWQsCisgICAgICAgIGNvbnN0IGpvYmplY3QgYXR0cmlidXRlcykKKyAgICA6IG1DYWxsYmFjayhudWxscHRyKSwKKyAgICAgIG1DYWxsYmFja0Nvb2tpZShudWxscHRyKSwKKyAgICAgIG1DYWxsYmFja0RhdGEobnVsbHB0ciksCisgICAgICBtVm9sdW1lKDEuMCksCiAgICAgICBtUGxheWJhY2tSYXRlKEFVRElPX1BMQVlCQUNLX1JBVEVfREVGQVVMVCksCiAgICAgICBtU2FtcGxlUmF0ZUh6KDApLAogICAgICAgbU1zZWNzUGVyRnJhbWUoMCksCkBAIC03OCwyOCArNzMsMTkgQEAKICAgICAgIG1QaWQocGlkKSwKICAgICAgIG1TZW5kTGV2ZWwoMC4wKSwKICAgICAgIG1BdXhFZmZlY3RJZCgwKSwKLSAgICAgIG1GbGFncyhBVURJT19PVVRQVVRfRkxBR19OT05FKSwKLSAgICAgIG1TZWxlY3RlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAotICAgICAgbVJvdXRlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAotICAgICAgbURldmljZUNhbGxiYWNrRW5hYmxlZChmYWxzZSksCi0gICAgICBtRGV2aWNlQ2FsbGJhY2soZGV2aWNlQ2FsbGJhY2spIHsKKyAgICAgIG1GbGFncyhBVURJT19PVVRQVVRfRkxBR19OT05FKSB7CiAgICAgQUxPR1YoIk1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KCVkKSIsIHNlc3Npb25JZCk7Ci0gICAgaWYgKGF0dHIgIT0gTlVMTCkgewotICAgICAgICBtQXR0cmlidXRlcyA9IChhdWRpb19hdHRyaWJ1dGVzX3QgKikgY2FsbG9jKDEsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgaWYgKG1BdHRyaWJ1dGVzICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1lbWNweShtQXR0cmlidXRlcywgYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICAgICAgbVN0cmVhbVR5cGUgPSBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKGF0dHIpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUF0dHJpYnV0ZXMgPSBOVUxMOworCisgICAgaWYgKGF0dHJpYnV0ZXMgIT0gbnVsbHB0cikgeworICAgICAgICBtQXR0cmlidXRlcyA9IG5ldyBKT2JqZWN0SG9sZGVyKGF0dHJpYnV0ZXMpOwogICAgIH0KIAogICAgIHNldE1pbkJ1ZmZlckNvdW50KCk7CisgICAgbVJvdXRpbmdEZWxlZ2F0ZXMuY2xlYXIoKTsKIH0KIAogTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6On5NZWRpYVBsYXllcjJBdWRpb091dHB1dCgpIHsKICAgICBjbG9zZSgpOwotICAgIGZyZWUobUF0dHJpYnV0ZXMpOwogICAgIGRlbGV0ZSBtQ2FsbGJhY2tEYXRhOwogfQogCkBAIC0xMjYsMzEgKzExMiwzMSBAQAogCiBzc2l6ZV90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpidWZmZXJTaXplKCkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHJldHVybiBtVHJhY2stPmZyYW1lQ291bnQoKSAqIG1GcmFtZVNpemU7CisgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+ZnJhbWVDb3VudCgpICogbUZyYW1lU2l6ZTsKIH0KIAogc3NpemVfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6ZnJhbWVDb3VudCgpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICByZXR1cm4gbVRyYWNrLT5mcmFtZUNvdW50KCk7CisgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+ZnJhbWVDb3VudCgpOwogfQogCiBzc2l6ZV90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpjaGFubmVsQ291bnQoKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgcmV0dXJuIG1UcmFjay0+Y2hhbm5lbENvdW50KCk7CisgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+Y2hhbm5lbENvdW50KCk7CiB9CiAKIHNzaXplX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmZyYW1lU2l6ZSgpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICByZXR1cm4gbUZyYW1lU2l6ZTsKQEAgLTE1OCwxMCArMTQ0LDEwIEBACiAKIHVpbnQzMl90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpsYXRlbmN5ICgpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICByZXR1cm4gbVRyYWNrLT5sYXRlbmN5KCk7CisgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+bGF0ZW5jeSgpOwogfQogCiBmbG9hdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6bXNlY3NQZXJGcmFtZSgpIGNvbnN0IHsKQEAgLTE3MSwxOCArMTU3LDE4IEBACiAKIHN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRQb3NpdGlvbih1aW50MzJfdCAqcG9zaXRpb24pIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICByZXR1cm4gbVRyYWNrLT5nZXRQb3NpdGlvbihwb3NpdGlvbik7CisgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+Z2V0UG9zaXRpb24ocG9zaXRpb24pOwogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wICZ0cykgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHJldHVybiBtVHJhY2stPmdldFRpbWVzdGFtcCh0cyk7CisgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+Z2V0VGltZXN0YW1wKHRzKTsKIH0KIAogLy8gVE9ETzogUmVtb3ZlIHVubmVjZXNzYXJ5IGNhbGxzIHRvIGdldFBsYXllZE91dER1cmF0aW9uVXMoKQpAQCAtMTk1LDcgKzE4MSw3IEBACiAvLyBDYWxjdWxhdGUgZHVyYXRpb24gb2YgcGxheWVkIHNhbXBsZXMgaWYgcGxheWVkIGF0IG5vcm1hbCByYXRlIChpLmUuLCAxLjApLgogaW50NjRfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0UGxheWVkT3V0RHVyYXRpb25VcyhpbnQ2NF90IG5vd1VzKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCB8fCBtU2FtcGxlUmF0ZUh6ID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IG51bGxwdHIgfHwgbVNhbXBsZVJhdGVIeiA9PSAwKSB7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIApAQCAtMjAzLDIyICsxODksMTggQEAKICAgICBpbnQ2NF90IG51bUZyYW1lc1BsYXllZEF0VXM7CiAgICAgQXVkaW9UaW1lc3RhbXAgdHM7CiAKLSAgICBzdGF0dXNfdCByZXMgPSBtVHJhY2stPmdldFRpbWVzdGFtcCh0cyk7CisgICAgc3RhdHVzX3QgcmVzID0gbUpBdWRpb1RyYWNrLT5nZXRUaW1lc3RhbXAodHMpOworCiAgICAgaWYgKHJlcyA9PSBPSykgeyAgICAgICAgICAgICAgICAgLy8gY2FzZSAxOiBtaXhpbmcgYXVkaW8gdHJhY2tzIGFuZCBvZmZsb2FkZWQgdHJhY2tzLgogICAgICAgICBudW1GcmFtZXNQbGF5ZWQgPSB0cy5tUG9zaXRpb247CiAgICAgICAgIG51bUZyYW1lc1BsYXllZEF0VXMgPSB0cy5tVGltZS50dl9zZWMgKiAxMDAwMDAwTEwgKyB0cy5tVGltZS50dl9uc2VjIC8gMTAwMDsKICAgICAgICAgLy9BTE9HRCgiZ2V0VGltZXN0YW1wOiBPSyAlZCAlbGxkIiwgbnVtRnJhbWVzUGxheWVkLCAobG9uZyBsb25nKW51bUZyYW1lc1BsYXllZEF0VXMpOwotICAgIH0gZWxzZSBpZiAocmVzID09IFdPVUxEX0JMT0NLKSB7IC8vIGNhc2UgMjogdHJhbnNpdG9yeSBzdGF0ZSBvbiBzdGFydCBvZiBhIG5ldyB0cmFjaworICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhc2UgMjogdHJhbnNpdG9yeSBzdGF0ZSBvbiBzdGFydCBvZiBhIG5ldyB0cmFjaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhc2UgMzogdHJhbnNpdG9yeSBhdCBuZXcgdHJhY2sgb3IgYXVkaW8gZmFzdCB0cmFja3MuCiAgICAgICAgIG51bUZyYW1lc1BsYXllZCA9IDA7CiAgICAgICAgIG51bUZyYW1lc1BsYXllZEF0VXMgPSBub3dVczsKICAgICAgICAgLy9BTE9HRCgiZ2V0VGltZXN0YW1wOiBXT1VMRF9CTE9DSyAlZCAlbGxkIiwKICAgICAgICAgLy8gICAgICAgIG51bUZyYW1lc1BsYXllZCwgKGxvbmcgbG9uZyludW1GcmFtZXNQbGF5ZWRBdFVzKTsKLSAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIDM6IHRyYW5zaXRvcnkgYXQgbmV3IHRyYWNrIG9yIGF1ZGlvIGZhc3QgdHJhY2tzLgotICAgICAgICByZXMgPSBtVHJhY2stPmdldFBvc2l0aW9uKCZudW1GcmFtZXNQbGF5ZWQpOwotICAgICAgICBDSEVDS19FUShyZXMsIChzdGF0dXNfdClPSyk7Ci0gICAgICAgIG51bUZyYW1lc1BsYXllZEF0VXMgPSBub3dVczsKLSAgICAgICAgbnVtRnJhbWVzUGxheWVkQXRVcyArPSAxMDAwTEwgKiBtVHJhY2stPmxhdGVuY3koKSAvIDI7IC8qIFhYWCAqLwotICAgICAgICAvL0FMT0dEKCJnZXRQb3NpdGlvbjogJXUgJWxsZCIsIG51bUZyYW1lc1BsYXllZCwgKGxvbmcgbG9uZyludW1GcmFtZXNQbGF5ZWRBdFVzKTsKICAgICB9CiAKICAgICAvLyBDSEVDS19FUShudW1GcmFtZXNQbGF5ZWQgJiAoMSA8PCAzMSksIDApOyAgLy8gY2FuJ3QgYmUgbmVnYXRpdmUgdW50aWwgMTIuNCBocnMsIHRlc3QKQEAgLTI0NCwxMDggKzIyNiw1NSBAQAogCiBzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0RnJhbWVzV3JpdHRlbih1aW50MzJfdCAqZnJhbWVzd3JpdHRlbikgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIEV4dGVuZGVkVGltZXN0YW1wIGV0czsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtVHJhY2stPmdldFRpbWVzdGFtcCgmZXRzKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtSkF1ZGlvVHJhY2stPmdldFRpbWVzdGFtcCgmZXRzKTsKICAgICBpZiAoc3RhdHVzID09IE9LIHx8IHN0YXR1cyA9PSBXT1VMRF9CTE9DSykgewogICAgICAgICAqZnJhbWVzd3JpdHRlbiA9ICh1aW50MzJfdClldHMubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9DTElFTlRdOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKSB7Cit2b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRBdWRpb0F0dHJpYnV0ZXMoY29uc3Qgam9iamVjdCBhdHRyaWJ1dGVzKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1UcmFjay0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKTsKKyAgICBtQXR0cmlidXRlcyA9IChhdHRyaWJ1dGVzID09IG51bGxwdHIpID8gbnVsbHB0ciA6IG5ldyBKT2JqZWN0SG9sZGVyKGF0dHJpYnV0ZXMpOwogfQogCi1TdHJpbmc4ICBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKSB7CithdWRpb19zdHJlYW1fdHlwZV90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRBdWRpb1N0cmVhbVR5cGUoKSBjb25zdCB7CisgICAgQUxPR1YoImdldEF1ZGlvU3RyZWFtVHlwZSIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZzg6OmVtcHR5KCk7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fREVGQVVMVDsKICAgICB9Ci0gICAgcmV0dXJuIG1UcmFjay0+Z2V0UGFyYW1ldGVycyhrZXlzKTsKLX0KLQotdm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0QXVkaW9BdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqIGF0dHJpYnV0ZXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKGF0dHJpYnV0ZXMgPT0gTlVMTCkgewotICAgICAgICBmcmVlKG1BdHRyaWJ1dGVzKTsKLSAgICAgICAgbUF0dHJpYnV0ZXMgPSBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtQXR0cmlidXRlcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtQXR0cmlidXRlcyA9IChhdWRpb19hdHRyaWJ1dGVzX3QgKikgY2FsbG9jKDEsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkobUF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgbVN0cmVhbVR5cGUgPSBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKGF0dHJpYnV0ZXMpOwotICAgIH0KLX0KLQotdm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICAvLyBkbyBub3QgYWxsb3cgZGlyZWN0IHN0cmVhbSB0eXBlIG1vZGlmaWNhdGlvbiBpZiBhdHRyaWJ1dGVzIGhhdmUgYmVlbiBzZXQKLSAgICBpZiAobUF0dHJpYnV0ZXMgPT0gTlVMTCkgewotICAgICAgICBtU3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7Ci0gICAgfQorICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPmdldEF1ZGlvU3RyZWFtVHlwZSgpOwogfQogCiB2b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpjbG9zZV9sKCkgewotICAgIG1UcmFjay5jbGVhcigpOworICAgIG1KQXVkaW9UcmFjay5jbGVhcigpOwogfQogCiBzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6b3BlbigKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGNoYW5uZWxDb3VudCwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IGJ1ZmZlckNvdW50LAorICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIEF1ZGlvQ2FsbGJhY2sgY2IsIHZvaWQgKmNvb2tpZSwKICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbywKLSAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCwKICAgICAgICAgdWludDMyX3Qgc3VnZ2VzdGVkRnJhbWVDb3VudCkgewotICAgIEFMT0dWKCJvcGVuKCV1LCAlZCwgMHgleCwgMHgleCwgJWQsICVkIDB4JXgpIiwgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50LCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICBmb3JtYXQsIGJ1ZmZlckNvdW50LCBtU2Vzc2lvbklkLCBmbGFncyk7CisgICAgQUxPR1YoIm9wZW4oJXUsICVkLCAweCV4LCAweCV4LCAlZCAweCV4KSIsIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCwgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgZm9ybWF0LCBtU2Vzc2lvbklkLCBmbGFncyk7CiAKICAgICAvLyBvZmZsb2FkaW5nIGlzIG9ubHkgc3VwcG9ydGVkIGluIGNhbGxiYWNrIG1vZGUgZm9yIG5vdy4KICAgICAvLyBvZmZsb2FkSW5mbyBtdXN0IGJlIHByZXNlbnQgaWYgb2ZmbG9hZCBmbGFnIGlzIHNldAogICAgIGlmICgoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMCkgJiYKLSAgICAgICAgICAgICgoY2IgPT0gTlVMTCkgfHwgKG9mZmxvYWRJbmZvID09IE5VTEwpKSkgeworICAgICAgICAgICAgKChjYiA9PSBudWxscHRyKSB8fCAob2ZmbG9hZEluZm8gPT0gbnVsbHB0cikpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgLy8gY29tcHV0ZSBmcmFtZSBjb3VudCBmb3IgdGhlIEF1ZGlvVHJhY2sgaW50ZXJuYWwgYnVmZmVyCi0gICAgc2l6ZV90IGZyYW1lQ291bnQ7Ci0gICAgaWYgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApIHsKLSAgICAgICAgZnJhbWVDb3VudCA9IDA7IC8vIEF1ZGlvVHJhY2sgd2lsbCBnZXQgZnJhbWUgY291bnQgZnJvbSBBdWRpb0ZsaW5nZXIKLSAgICB9IGVsc2UgewotICAgICAgICAvLyB0cnkgdG8gZXN0aW1hdGUgdGhlIGJ1ZmZlciBwcm9jZXNzaW5nIGZldGNoIHNpemUgZnJvbSBBdWRpb0ZsaW5nZXIuCi0gICAgICAgIC8vIGZyYW1lc1BlckJ1ZmZlciBpcyBhcHByb3hpbWF0ZSBhbmQgZ2VuZXJhbGx5IGNvcnJlY3QsIGV4Y2VwdCB3aGVuIGl0J3Mgbm90IDotKS4KLSAgICAgICAgdWludDMyX3QgYWZTYW1wbGVSYXRlOwotICAgICAgICBzaXplX3QgYWZGcmFtZUNvdW50OwotICAgICAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dEZyYW1lQ291bnQoJmFmRnJhbWVDb3VudCwgbVN0cmVhbVR5cGUpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotICAgICAgICBpZiAoQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZSgmYWZTYW1wbGVSYXRlLCBtU3RyZWFtVHlwZSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9Ci0gICAgICAgIGNvbnN0IHNpemVfdCBmcmFtZXNQZXJCdWZmZXIgPQotICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpc2FtcGxlUmF0ZSAqIGFmRnJhbWVDb3VudCAvIGFmU2FtcGxlUmF0ZTsKLQotICAgICAgICBpZiAoYnVmZmVyQ291bnQgPT0gMCkgewotICAgICAgICAgICAgLy8gdXNlIHN1Z2dlc3RlZEZyYW1lQ291bnQKLSAgICAgICAgICAgIGJ1ZmZlckNvdW50ID0gKHN1Z2dlc3RlZEZyYW1lQ291bnQgKyBmcmFtZXNQZXJCdWZmZXIgLSAxKSAvIGZyYW1lc1BlckJ1ZmZlcjsKLSAgICAgICAgfQotICAgICAgICAvLyBDaGVjayBhcmd1bWVudCBidWZmZXJDb3VudCBhZ2FpbnN0IHRoZSBtaW5pbnVtIGJ1ZmZlciBjb3VudAotICAgICAgICBpZiAoYnVmZmVyQ291bnQgIT0gMCAmJiBidWZmZXJDb3VudCA8IG1NaW5CdWZmZXJDb3VudCkgewotICAgICAgICAgICAgQUxPR1YoImJ1ZmZlckNvdW50ICglZCkgaW5jcmVhc2VkIHRvICVkIiwgYnVmZmVyQ291bnQsIG1NaW5CdWZmZXJDb3VudCk7Ci0gICAgICAgICAgICBidWZmZXJDb3VudCA9IG1NaW5CdWZmZXJDb3VudDsKLSAgICAgICAgfQotICAgICAgICAvLyBpZiBmcmFtZUNvdW50IGlzIDAsIHRoZW4gQXVkaW9UcmFjayB3aWxsIGdldCBmcmFtZSBjb3VudCBmcm9tIEF1ZGlvRmxpbmdlcgotICAgICAgICAvLyB3aGljaCB3aWxsIGJlIHRoZSBtaW5pbXVtIHNpemUgcGVybWl0dGVkLgotICAgICAgICBmcmFtZUNvdW50ID0gYnVmZmVyQ291bnQgKiBmcmFtZXNQZXJCdWZmZXI7Ci0gICAgfQorICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0KKyAgICAgICAgICAgKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApID8gMCA6IHN1Z2dlc3RlZEZyYW1lQ291bnQ7CiAKICAgICBpZiAoY2hhbm5lbE1hc2sgPT0gQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSKSB7CiAgICAgICAgIGNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KGNoYW5uZWxDb3VudCk7CkBAIC0zNTksMzIgKzI4OCwyMyBAQAogICAgIG1DYWxsYmFjayA9IGNiOwogICAgIG1DYWxsYmFja0Nvb2tpZSA9IGNvb2tpZTsKIAotICAgIHNwPEF1ZGlvVHJhY2s+IHQ7Ci0gICAgQ2FsbGJhY2tEYXRhICpuZXdjYmQgPSBOVUxMOworICAgIHNwPEpBdWRpb1RyYWNrPiBqVDsKKyAgICBDYWxsYmFja0RhdGEgKm5ld2NiZCA9IG51bGxwdHI7CiAKLSAgICBBTE9HVigiY3JlYXRpbmcgbmV3IEF1ZGlvVHJhY2siKTsKKyAgICBBTE9HVigiY3JlYXRpbmcgbmV3IEpBdWRpb1RyYWNrIik7CiAKLSAgICBpZiAobUNhbGxiYWNrICE9IE5VTEwpIHsKKyAgICBpZiAobUNhbGxiYWNrICE9IG51bGxwdHIpIHsKICAgICAgICAgbmV3Y2JkID0gbmV3IENhbGxiYWNrRGF0YSh0aGlzKTsKLSAgICAgICAgdCA9IG5ldyBBdWRpb1RyYWNrKAotICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgZm9ybWF0LAotICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgQ2FsbGJhY2tXcmFwcGVyLAotICAgICAgICAgICAgICAgIG5ld2NiZCwKLSAgICAgICAgICAgICAgICAwLCAgLy8gbm90aWZpY2F0aW9uIGZyYW1lcwotICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgQXVkaW9UcmFjazo6VFJBTlNGRVJfQ0FMTEJBQ0ssCi0gICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8sCi0gICAgICAgICAgICAgICAgbVVpZCwKLSAgICAgICAgICAgICAgICBtUGlkLAotICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgIGRvTm90UmVjb25uZWN0LAotICAgICAgICAgICAgICAgIDEuMGYsICAvLyBkZWZhdWx0IHZhbHVlIGZvciBtYXhSZXF1aXJlZFNwZWVkCi0gICAgICAgICAgICAgICAgbVNlbGVjdGVkRGV2aWNlSWQpOworICAgICAgICBqVCA9IG5ldyBKQXVkaW9UcmFjaygKKyAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgQ2FsbGJhY2tXcmFwcGVyLAorICAgICAgICAgICAgICAgICBuZXdjYmQsCisgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzICE9IG51bGxwdHIgPyBtQXR0cmlidXRlcy0+Z2V0Sk9iamVjdCgpIDogbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgMS4wZik7ICAvLyBkZWZhdWx0IHZhbHVlIGZvciBtYXhSZXF1aXJlZFNwZWVkCiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gVE9ETzogRHVlIHRvIGJ1ZmZlciBtZW1vcnkgY29uY2VybnMsIHdlIHVzZSBhIG1heCB0YXJnZXQgcGxheWJhY2sgc3BlZWQKICAgICAgICAgLy8gYmFzZWQgb24gbVBsYXliYWNrUmF0ZSBhdCB0aGUgdGltZSBvZiBvcGVuIChpbnN0ZWFkIG9mIGtNYXhSZXF1aXJlZFNwZWVkKSwKQEAgLTM5NCw3MyArMzE0LDYyIEBACiAgICAgICAgIEFMT0dXX0lGKHRhcmdldFNwZWVkICE9IG1QbGF5YmFja1JhdGUubVNwZWVkLAogICAgICAgICAgICAgICAgICJ0cmFjayB0YXJnZXQgc3BlZWQ6JWYgY2xhbXBlZCBmcm9tIHBsYXliYWNrIHNwZWVkOiVmIiwKICAgICAgICAgICAgICAgICB0YXJnZXRTcGVlZCwgbVBsYXliYWNrUmF0ZS5tU3BlZWQpOwotICAgICAgICB0ID0gbmV3IEF1ZGlvVHJhY2soCi0gICAgICAgICAgICAgICAgbVN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICBOVUxMLCAvLyBjYWxsYmFjawotICAgICAgICAgICAgICAgIE5VTEwsIC8vIHVzZXIgZGF0YQotICAgICAgICAgICAgICAgIDAsIC8vIG5vdGlmaWNhdGlvbiBmcmFtZXMKLSAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLAotICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2s6OlRSQU5TRkVSX0RFRkFVTFQsCi0gICAgICAgICAgICAgICAgTlVMTCwgLy8gb2ZmbG9hZCBpbmZvCi0gICAgICAgICAgICAgICAgbVVpZCwKLSAgICAgICAgICAgICAgICBtUGlkLAotICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgIGRvTm90UmVjb25uZWN0LAotICAgICAgICAgICAgICAgIHRhcmdldFNwZWVkLAotICAgICAgICAgICAgICAgIG1TZWxlY3RlZERldmljZUlkKTsKKyAgICAgICAgalQgPSBuZXcgSkF1ZGlvVHJhY2soCisgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzICE9IG51bGxwdHIgPyBtQXR0cmlidXRlcy0+Z2V0Sk9iamVjdCgpIDogbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgdGFyZ2V0U3BlZWQpOwogICAgIH0KIAotICAgIGlmICgodCA9PSAwKSB8fCAodC0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpKSB7CisgICAgaWYgKGpUID09IDApIHsKICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBjcmVhdGUgYXVkaW8gdHJhY2siKTsKICAgICAgICAgZGVsZXRlIG5ld2NiZDsKICAgICAgICAgLy8gdCBnb2VzIG91dCBvZiBzY29wZSwgc28gcmVmZXJlbmNlIGNvdW50IGRyb3BzIHRvIHplcm8KICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gc3VjY2Vzc2Z1bCBBdWRpb1RyYWNrIGluaXRpYWxpemF0aW9uIGltcGxpZXMgYSBsZWdhY3kgc3RyZWFtIHR5cGUgd2FzIGdlbmVyYXRlZAotICAgICAgICAvLyBmcm9tIHRoZSBhdWRpbyBhdHRyaWJ1dGVzCi0gICAgICAgIG1TdHJlYW1UeXBlID0gdC0+c3RyZWFtVHlwZSgpOwogICAgIH0KIAotICAgIENIRUNLKCh0ICE9IE5VTEwpICYmICgobUNhbGxiYWNrID09IE5VTEwpIHx8IChuZXdjYmQgIT0gTlVMTCkpKTsKKyAgICBDSEVDSygoalQgIT0gbnVsbHB0cikgJiYgKChtQ2FsbGJhY2sgPT0gbnVsbHB0cikgfHwgKG5ld2NiZCAhPSBudWxscHRyKSkpOwogCiAgICAgbUNhbGxiYWNrRGF0YSA9IG5ld2NiZDsKICAgICBBTE9HVigic2V0Vm9sdW1lIik7Ci0gICAgdC0+c2V0Vm9sdW1lKG1MZWZ0Vm9sdW1lLCBtUmlnaHRWb2x1bWUpOworICAgIGpULT5zZXRWb2x1bWUobVZvbHVtZSk7CiAKICAgICBtU2FtcGxlUmF0ZUh6ID0gc2FtcGxlUmF0ZTsKICAgICBtRmxhZ3MgPSBmbGFnczsKICAgICBtTXNlY3NQZXJGcmFtZSA9IDFFM2YgLyAobVBsYXliYWNrUmF0ZS5tU3BlZWQgKiBzYW1wbGVSYXRlKTsKLSAgICBtRnJhbWVTaXplID0gdC0+ZnJhbWVTaXplKCk7Ci0gICAgbVRyYWNrID0gdDsKKyAgICBtRnJhbWVTaXplID0galQtPmZyYW1lU2l6ZSgpOworICAgIG1KQXVkaW9UcmFjayA9IGpUOwogCiAgICAgcmV0dXJuIHVwZGF0ZVRyYWNrX2woKTsKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnVwZGF0ZVRyYWNrX2woKSB7Ci0gICAgaWYgKG1UcmFjayA9PSBOVUxMKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKICAgICBzdGF0dXNfdCByZXMgPSBOT19FUlJPUjsKICAgICAvLyBOb3RlIHNvbWUgb3V0cHV0IGRldmljZXMgbWF5IGdpdmUgdXMgYSBkaXJlY3QgdHJhY2sgZXZlbiB0aG91Z2ggd2UgZG9uJ3Qgc3BlY2lmeSBpdC4KICAgICAvLyBFeGFtcGxlOiBMaW5lIGFwcGxpY2F0aW9uIGIvMTc0NTk5ODIuCi0gICAgaWYgKChtVHJhY2stPmdldEZsYWdzKCkKKyAgICBpZiAoKG1KQXVkaW9UcmFjay0+Z2V0RmxhZ3MoKQogICAgICAgICAgICAgJiAoQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkpID09IDApIHsKLSAgICAgICAgcmVzID0gbVRyYWNrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrUmF0ZSk7CisgICAgICAgIHJlcyA9IG1KQXVkaW9UcmFjay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1JhdGUpOwogICAgICAgICBpZiAocmVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtVHJhY2stPnNldEF1eEVmZmVjdFNlbmRMZXZlbChtU2VuZExldmVsKTsKLSAgICAgICAgICAgIHJlcyA9IG1UcmFjay0+YXR0YWNoQXV4RWZmZWN0KG1BdXhFZmZlY3RJZCk7CisgICAgICAgICAgICBtSkF1ZGlvVHJhY2stPnNldEF1eEVmZmVjdFNlbmRMZXZlbChtU2VuZExldmVsKTsKKyAgICAgICAgICAgIHJlcyA9IG1KQXVkaW9UcmFjay0+YXR0YWNoQXV4RWZmZWN0KG1BdXhFZmZlY3RJZCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbVRyYWNrLT5zZXRPdXRwdXREZXZpY2UobVNlbGVjdGVkRGV2aWNlSWQpOwotICAgIGlmIChtRGV2aWNlQ2FsbGJhY2tFbmFibGVkKSB7Ci0gICAgICAgIG1UcmFjay0+YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2sucHJvbW90ZSgpKTsKKyAgICBpZiAobVByZWZlcnJlZERldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIG1KQXVkaW9UcmFjay0+c2V0UHJlZmVycmVkRGV2aWNlKG1QcmVmZXJyZWREZXZpY2UtPmdldEpPYmplY3QoKSk7CiAgICAgfQorCisgICAgbUpBdWRpb1RyYWNrLT5yZWdpc3RlclJvdXRpbmdEZWxlZ2F0ZXMobVJvdXRpbmdEZWxlZ2F0ZXMpOworCiAgICAgQUxPR1YoInVwZGF0ZVRyYWNrX2woKSBET05FIHN0YXR1cyAlZCIsIHJlcyk7CiAgICAgcmV0dXJuIHJlczsKIH0KQEAgLTQ2OCwxMyArMzc3LDEzIEBACiBzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c3RhcnQoKSB7CiAgICAgQUxPR1YoInN0YXJ0Iik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtQ2FsbGJhY2tEYXRhICE9IE5VTEwpIHsKKyAgICBpZiAobUNhbGxiYWNrRGF0YSAhPSBudWxscHRyKSB7CiAgICAgICAgIG1DYWxsYmFja0RhdGEtPmVuZFRyYWNrU3dpdGNoKCk7CiAgICAgfQotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICBtVHJhY2stPnNldFZvbHVtZShtTGVmdFZvbHVtZSwgbVJpZ2h0Vm9sdW1lKTsKLSAgICAgICAgbVRyYWNrLT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobVNlbmRMZXZlbCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1UcmFjay0+c3RhcnQoKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUpBdWRpb1RyYWNrLT5zZXRWb2x1bWUobVZvbHVtZSk7CisgICAgICAgIG1KQXVkaW9UcmFjay0+c2V0QXV4RWZmZWN0U2VuZExldmVsKG1TZW5kTGV2ZWwpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtSkF1ZGlvVHJhY2stPnN0YXJ0KCk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogICAgIHJldHVybiBOT19JTklUOwpAQCAtNDgyLDExICszOTEsMTEgQEAKIAogc3NpemVfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6d3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBibG9ja2luZykgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1DYWxsYmFjayAhPSBOVUxMLCAiRG9uJ3QgY2FsbCB3cml0ZSBpZiBzdXBwbHlpbmcgYSBjYWxsYmFjay4iKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1DYWxsYmFjayAhPSBudWxscHRyLCAiRG9uJ3QgY2FsbCB3cml0ZSBpZiBzdXBwbHlpbmcgYSBjYWxsYmFjay4iKTsKIAogICAgIC8vQUxPR1YoIndyaXRlKCVwLCAldSkiLCBidWZmZXIsIHNpemUpOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICByZXR1cm4gbVRyYWNrLT53cml0ZShidWZmZXIsIHNpemUsIGJsb2NraW5nKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+d3JpdGUoYnVmZmVyLCBzaXplLCBibG9ja2luZyk7CiAgICAgfQogICAgIHJldHVybiBOT19JTklUOwogfQpAQCAtNDk0LDQ1ICs0MDMsNDQgQEAKIHZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnN0b3AoKSB7CiAgICAgQUxPR1YoInN0b3AiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIG1UcmFjay0+c3RvcCgpOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtSkF1ZGlvVHJhY2stPnN0b3AoKTsKICAgICB9CiB9CiAKIHZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmZsdXNoKCkgewogICAgIEFMT0dWKCJmbHVzaCIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgbVRyYWNrLT5mbHVzaCgpOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtSkF1ZGlvVHJhY2stPmZsdXNoKCk7CiAgICAgfQogfQogCiB2b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpwYXVzZSgpIHsKICAgICBBTE9HVigicGF1c2UiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIG1UcmFjay0+cGF1c2UoKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUpBdWRpb1RyYWNrLT5wYXVzZSgpOwogICAgIH0KIH0KIAogdm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Y2xvc2UoKSB7CiAgICAgQUxPR1YoImNsb3NlIik7Ci0gICAgc3A8QXVkaW9UcmFjaz4gdHJhY2s7CisgICAgc3A8SkF1ZGlvVHJhY2s+IHRyYWNrOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgICAgICB0cmFjayA9IG1UcmFjazsKLSAgICAgICAgY2xvc2VfbCgpOyAvLyBjbGVhcnMgbVRyYWNrCisgICAgICAgIHRyYWNrID0gbUpBdWRpb1RyYWNrOworICAgICAgICBjbG9zZV9sKCk7IC8vIGNsZWFycyBtSkF1ZGlvVHJhY2sKICAgICB9CiAgICAgLy8gZGVzdHJ1Y3Rpb24gb2YgdGhlIHRyYWNrIG9jY3VycyBvdXRzaWRlIG9mIG11dGV4LgogfQogCi12b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKLSAgICBBTE9HVigic2V0Vm9sdW1lKCVmLCAlZikiLCBsZWZ0LCByaWdodCk7Cit2b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CisgICAgQUxPR1YoInNldFZvbHVtZSglZikiLCB2b2x1bWUpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBtTGVmdFZvbHVtZSA9IGxlZnQ7Ci0gICAgbVJpZ2h0Vm9sdW1lID0gcmlnaHQ7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIG1UcmFjay0+c2V0Vm9sdW1lKGxlZnQsIHJpZ2h0KTsKKyAgICBtVm9sdW1lID0gdm9sdW1lOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICBtSkF1ZGlvVHJhY2stPnNldFZvbHVtZSh2b2x1bWUpOwogICAgIH0KIH0KIApAQCAtNTQwLDEyICs0NDgsMTIgQEAKICAgICBBTE9HVigic2V0UGxheWJhY2tSYXRlKCVmICVmICVkICVkKSIsCiAgICAgICAgICAgICAgICAgcmF0ZS5tU3BlZWQsIHJhdGUubVBpdGNoLCByYXRlLm1GYWxsYmFja01vZGUsIHJhdGUubVN0cmV0Y2hNb2RlKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7CisgICAgaWYgKG1KQXVkaW9UcmFjayA9PSAwKSB7CiAgICAgICAgIC8vIHJlbWVtYmVyIHJhdGUgc28gdGhhdCB3ZSBjYW4gc2V0IGl0IHdoZW4gdGhlIHRyYWNrIGlzIG9wZW5lZAogICAgICAgICBtUGxheWJhY2tSYXRlID0gcmF0ZTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KLSAgICBzdGF0dXNfdCByZXMgPSBtVHJhY2stPnNldFBsYXliYWNrUmF0ZShyYXRlKTsKKyAgICBzdGF0dXNfdCByZXMgPSBtSkF1ZGlvVHJhY2stPnNldFBsYXliYWNrUmF0ZShyYXRlKTsKICAgICBpZiAocmVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQpAQCAtNTU5LDEyICs0NjcsMTIgQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFBsYXliYWNrUmF0ZShBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSkgewotICAgIEFMT0dWKCJzZXRQbGF5YmFja1JhdGUiKTsKKyAgICBBTE9HVigiZ2V0UGxheWJhY2tSYXRlIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgeworICAgIGlmIChtSkF1ZGlvVHJhY2sgPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgKnJhdGUgPSBtVHJhY2stPmdldFBsYXliYWNrUmF0ZSgpOworICAgICpyYXRlID0gbUpBdWRpb1RyYWNrLT5nZXRQbGF5YmFja1JhdGUoKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTU3Miw4ICs0ODAsOCBAQAogICAgIEFMT0dWKCJzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoJWYpIiwgbGV2ZWwpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBtU2VuZExldmVsID0gbGV2ZWw7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtVHJhY2stPnNldEF1eEVmZmVjdFNlbmRMZXZlbChsZXZlbCk7CisgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPnNldEF1eEVmZmVjdFNlbmRMZXZlbChsZXZlbCk7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTU4Miw0NCArNDkwLDYzIEBACiAgICAgQUxPR1YoImF0dGFjaEF1eEVmZmVjdCglZCkiLCBlZmZlY3RJZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIG1BdXhFZmZlY3RJZCA9IGVmZmVjdElkOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICByZXR1cm4gbVRyYWNrLT5hdHRhY2hBdXhFZmZlY3QoZWZmZWN0SWQpOworICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbUpBdWRpb1RyYWNrLT5hdHRhY2hBdXhFZmZlY3QoZWZmZWN0SWQpOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgewotICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoJWQpIiwgZGV2aWNlSWQpOworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnNldFByZWZlcnJlZERldmljZShqb2JqZWN0IGRldmljZSkgeworICAgIEFMT0dWKCJzZXRQcmVmZXJyZWREZXZpY2UiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgbVNlbGVjdGVkRGV2aWNlSWQgPSBkZXZpY2VJZDsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1UcmFjay0+c2V0T3V0cHV0RGV2aWNlKGRldmljZUlkKTsKKyAgICBzdGF0dXNfdCByZXQgPSBOT19FUlJPUjsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0ID0gbUpBdWRpb1RyYWNrLT5zZXRQcmVmZXJyZWREZXZpY2UoZGV2aWNlKTsKICAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbVByZWZlcnJlZERldmljZSA9IG5ldyBKT2JqZWN0SG9sZGVyKGRldmljZSk7CisgICAgfQorICAgIHJldHVybiByZXQ7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCkgewotICAgIEFMT0dWKCJnZXRSb3V0ZWREZXZpY2VJZCIpOworam9iamVjdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0Um91dGVkRGV2aWNlKCkgeworICAgIEFMT0dWKCJnZXRSb3V0ZWREZXZpY2UiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIG1Sb3V0ZWREZXZpY2VJZCA9IG1UcmFjay0+Z2V0Um91dGVkRGV2aWNlSWQoKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG1KQXVkaW9UcmFjay0+Z2V0Um91dGVkRGV2aWNlKCk7CiAgICAgfQotICAgICpkZXZpY2VJZCA9IG1Sb3V0ZWREZXZpY2VJZDsKLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLXN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjplbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCkgewotICAgIEFMT0dWKCJlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrLCAlZCIsIGVuYWJsZWQpOworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCBqUm91dGluZ0RlbGVnYXRlKSB7CisgICAgQUxPR1YoImFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2siKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgbURldmljZUNhbGxiYWNrRW5hYmxlZCA9IGVuYWJsZWQ7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1czsKLSAgICAgICAgaWYgKGVuYWJsZWQpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG1UcmFjay0+YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2sucHJvbW90ZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG1UcmFjay0+cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2sucHJvbW90ZSgpKTsKKyAgICBqb2JqZWN0IGxpc3RlbmVyID0gSkF1ZGlvVHJhY2s6OmdldExpc3RlbmVyKGpSb3V0aW5nRGVsZWdhdGUpOworICAgIGlmIChKQXVkaW9UcmFjazo6ZmluZEJ5S2V5KG1Sb3V0aW5nRGVsZWdhdGVzLCBsaXN0ZW5lcikgPT0gbnVsbHB0cikgeworICAgICAgICBzcDxKT2JqZWN0SG9sZGVyPiBsaXN0ZW5lckhvbGRlciA9IG5ldyBKT2JqZWN0SG9sZGVyKGxpc3RlbmVyKTsKKyAgICAgICAgam9iamVjdCBoYW5kbGVyID0gSkF1ZGlvVHJhY2s6OmdldEhhbmRsZXIoalJvdXRpbmdEZWxlZ2F0ZSk7CisgICAgICAgIHNwPEpPYmplY3RIb2xkZXI+IHJvdXRpbmdEZWxlZ2F0ZUhvbGRlciA9IG5ldyBKT2JqZWN0SG9sZGVyKGpSb3V0aW5nRGVsZWdhdGUpOworCisgICAgICAgIG1Sb3V0aW5nRGVsZWdhdGVzLnB1c2hfYmFjayhzdGQ6OnBhaXI8c3A8Sk9iamVjdEhvbGRlcj4sIHNwPEpPYmplY3RIb2xkZXI+PigKKyAgICAgICAgICAgICAgICBsaXN0ZW5lckhvbGRlciwgcm91dGluZ0RlbGVnYXRlSG9sZGVyKSk7CisKKyAgICAgICAgaWYgKG1KQXVkaW9UcmFjayAhPSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbUpBdWRpb1RyYWNrLT5hZGRBdWRpb0RldmljZUNhbGxiYWNrKAorICAgICAgICAgICAgICAgICAgICByb3V0aW5nRGVsZWdhdGVIb2xkZXItPmdldEpPYmplY3QoKSwgaGFuZGxlcik7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IGxpc3RlbmVyKSB7CisgICAgQUxPR1YoInJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2siKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgam9iamVjdCByb3V0aW5nRGVsZWdhdGUgPSBudWxscHRyOworICAgIGlmICgocm91dGluZ0RlbGVnYXRlID0gSkF1ZGlvVHJhY2s6OmZpbmRCeUtleShtUm91dGluZ0RlbGVnYXRlcywgbGlzdGVuZXIpKSAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUpBdWRpb1RyYWNrLT5yZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHJvdXRpbmdEZWxlZ2F0ZSk7CisgICAgICAgIH0KKyAgICAgICAgSkF1ZGlvVHJhY2s6OmVyYXNlQnlLZXkobVJvdXRpbmdEZWxlZ2F0ZXMsIGxpc3RlbmVyKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtNjMyLDIxICs1NTksMjEgQEAKICAgICAvLyBsb2NrIHRvIGVuc3VyZSB3ZSBhcmVuJ3QgY2F1Z2h0IGluIHRoZSBtaWRkbGUgb2YgYSB0cmFjayBzd2l0Y2guCiAgICAgZGF0YS0+bG9jaygpOwogICAgIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0ICptZSA9IGRhdGEtPmdldE91dHB1dCgpOwotICAgIEF1ZGlvVHJhY2s6OkJ1ZmZlciAqYnVmZmVyID0gKEF1ZGlvVHJhY2s6OkJ1ZmZlciAqKWluZm87Ci0gICAgaWYgKG1lID09IE5VTEwpIHsKKyAgICBKQXVkaW9UcmFjazo6QnVmZmVyICpidWZmZXIgPSAoSkF1ZGlvVHJhY2s6OkJ1ZmZlciAqKWluZm87CisgICAgaWYgKG1lID09IG51bGxwdHIpIHsKICAgICAgICAgLy8gbm8gb3V0cHV0IHNldCwgbGlrZWx5IGJlY2F1c2UgdGhlIHRyYWNrIHdhcyBzY2hlZHVsZWQgdG8gYmUgcmV1c2VkCiAgICAgICAgIC8vIGJ5IGFub3RoZXIgcGxheWVyLCBidXQgdGhlIGZvcm1hdCB0dXJuZWQgb3V0IHRvIGJlIGluY29tcGF0aWJsZS4KICAgICAgICAgZGF0YS0+dW5sb2NrKCk7Ci0gICAgICAgIGlmIChidWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgYnVmZmVyLT5zaXplID0gMDsKKyAgICAgICAgaWYgKGJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBidWZmZXItPm1TaXplID0gMDsKICAgICAgICAgfQogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgc3dpdGNoKGV2ZW50KSB7Ci0gICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9NT1JFX0RBVEE6IHsKKyAgICBjYXNlIEpBdWRpb1RyYWNrOjpFVkVOVF9NT1JFX0RBVEE6IHsKICAgICAgICAgc2l6ZV90IGFjdHVhbFNpemUgPSAoKm1lLT5tQ2FsbGJhY2spKAotICAgICAgICAgICAgICAgIG1lLCBidWZmZXItPnJhdywgYnVmZmVyLT5zaXplLCBtZS0+bUNhbGxiYWNrQ29va2llLAorICAgICAgICAgICAgICAgIG1lLCBidWZmZXItPm1EYXRhLCBidWZmZXItPm1TaXplLCBtZS0+bUNhbGxiYWNrQ29va2llLAogICAgICAgICAgICAgICAgIENCX0VWRU5UX0ZJTExfQlVGRkVSKTsKIAogICAgICAgICAvLyBMb2cgd2hlbiBubyBkYXRhIGlzIHJldHVybmVkIGZyb20gdGhlIGNhbGxiYWNrLgpAQCAtNjU4LDI1ICs1ODUsMjUgQEAKICAgICAgICAgLy8gVGhpcyBpcyBhIGJlbmlnbiBidXN5LXdhaXQsIHdpdGggdGhlIG5leHQgZGF0YSByZXF1ZXN0IGdlbmVyYXRlZCAxMCBtcyBvciBtb3JlIGxhdGVyOwogICAgICAgICAvLyBuZXZlcnRoZWxlc3MgZm9yIHBvd2VyIHJlYXNvbnMsIHdlIGRvbid0IHdhbnQgdG8gc2VlIHRvbyBtYW55IG9mIHRoZXNlLgogCi0gICAgICAgIEFMT0dWX0lGKGFjdHVhbFNpemUgPT0gMCAmJiBidWZmZXItPnNpemUgPiAwLCAiY2FsbGJhY2t3cmFwcGVyOiBlbXB0eSBidWZmZXIgcmV0dXJuZWQiKTsKKyAgICAgICAgQUxPR1ZfSUYoYWN0dWFsU2l6ZSA9PSAwICYmIGJ1ZmZlci0+bVNpemUgPiAwLCAiY2FsbGJhY2t3cmFwcGVyOiBlbXB0eSBidWZmZXIgcmV0dXJuZWQiKTsKIAotICAgICAgICBidWZmZXItPnNpemUgPSBhY3R1YWxTaXplOworICAgICAgICBidWZmZXItPm1TaXplID0gYWN0dWFsU2l6ZTsKICAgICAgICAgfSBicmVhazsKIAotICAgIGNhc2UgQXVkaW9UcmFjazo6RVZFTlRfU1RSRUFNX0VORDoKKyAgICBjYXNlIEpBdWRpb1RyYWNrOjpFVkVOVF9TVFJFQU1fRU5EOgogICAgICAgICAvLyBjdXJyZW50bHkgb25seSBvY2N1cnMgZm9yIG9mZmxvYWRlZCBjYWxsYmFja3MKICAgICAgICAgQUxPR1YoImNhbGxiYWNrd3JhcHBlcjogZGVsaXZlciBFVkVOVF9TVFJFQU1fRU5EIik7Ci0gICAgICAgICgqbWUtPm1DYWxsYmFjaykobWUsIE5VTEwgLyogYnVmZmVyICovLCAwIC8qIHNpemUgKi8sCisgICAgICAgICgqbWUtPm1DYWxsYmFjaykobWUsIG51bGxwdHIgLyogYnVmZmVyICovLCAwIC8qIHNpemUgKi8sCiAgICAgICAgICAgICAgICAgbWUtPm1DYWxsYmFja0Nvb2tpZSwgQ0JfRVZFTlRfU1RSRUFNX0VORCk7CiAgICAgICAgIGJyZWFrOwogCi0gICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9ORVdfSUFVRElPVFJBQ0sgOgorICAgIGNhc2UgSkF1ZGlvVHJhY2s6OkVWRU5UX05FV19JQVVESU9UUkFDSyA6CiAgICAgICAgIEFMT0dWKCJjYWxsYmFja3dyYXBwZXI6IGRlbGl2ZXIgRVZFTlRfVEVBUl9ET1dOIik7Ci0gICAgICAgICgqbWUtPm1DYWxsYmFjaykobWUsICBOVUxMIC8qIGJ1ZmZlciAqLywgMCAvKiBzaXplICovLAorICAgICAgICAoKm1lLT5tQ2FsbGJhY2spKG1lLCAgbnVsbHB0ciAvKiBidWZmZXIgKi8sIDAgLyogc2l6ZSAqLywKICAgICAgICAgICAgICAgICBtZS0+bUNhbGxiYWNrQ29va2llLCBDQl9FVkVOVF9URUFSX0RPV04pOwogICAgICAgICBicmVhazsKIAotICAgIGNhc2UgQXVkaW9UcmFjazo6RVZFTlRfVU5ERVJSVU46CisgICAgY2FzZSBKQXVkaW9UcmFjazo6RVZFTlRfVU5ERVJSVU46CiAgICAgICAgIC8vIFRoaXMgb2NjdXJzIHdoZW4gdGhlcmUgaXMgbm8gZGF0YSBhdmFpbGFibGUsIHR5cGljYWxseQogICAgICAgICAvLyB3aGVuIHRoZXJlIGlzIGEgZmFpbHVyZSB0byBzdXBwbHkgZGF0YSB0byB0aGUgQXVkaW9UcmFjay4gIEl0IGNhbiBhbHNvCiAgICAgICAgIC8vIG9jY3VyIGluIG5vbi1vZmZsb2FkZWQgbW9kZSB3aGVuIHRoZSBhdWRpbyBkZXZpY2UgY29tZXMgb3V0IG9mIHN0YW5kYnkuCkBAIC02OTYsMjkgKzYyMywzMSBAQAogICAgIGRhdGEtPnVubG9jaygpOwogfQogCi1hdWRpb19zZXNzaW9uX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFNlc3Npb25JZCgpIGNvbnN0Ci17CitpbnQzMl90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRTZXNzaW9uSWQoKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIHJldHVybiBtU2Vzc2lvbklkOwogfQogCi11aW50MzJfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0U2FtcGxlUmF0ZSgpIGNvbnN0Ci17Cit2b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRTZXNzaW9uSWQoY29uc3QgaW50MzJfdCBzZXNzaW9uSWQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gbVRyYWNrLT5nZXRTYW1wbGVSYXRlKCk7CisgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKIH0KIAotaW50NjRfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0QnVmZmVyRHVyYXRpb25JblVzKCkgY29uc3QKLXsKK3VpbnQzMl90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRTYW1wbGVSYXRlKCkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiBtSkF1ZGlvVHJhY2stPmdldFNhbXBsZVJhdGUoKTsKK30KKworaW50NjRfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0QnVmZmVyRHVyYXRpb25JblVzKCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobUpBdWRpb1RyYWNrID09IDApIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogICAgIGludDY0X3QgZHVyYXRpb247Ci0gICAgaWYgKG1UcmFjay0+Z2V0QnVmZmVyRHVyYXRpb25JblVzKCZkdXJhdGlvbikgIT0gT0spIHsKKyAgICBpZiAobUpBdWRpb1RyYWNrLT5nZXRCdWZmZXJEdXJhdGlvbkluVXMoJmR1cmF0aW9uKSAhPSBPSykgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAgICAgcmV0dXJuIGR1cmF0aW9uOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suaAppbmRleCAzMDE4MjViLi4yZWQ0NjMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suaApAQCAtMTcsMTkgKzE3LDIxIEBACiAjaWZuZGVmIEFORFJPSURfSkFVRElPVFJBQ0tfSAogI2RlZmluZSBBTkRST0lEX0pBVURJT1RSQUNLX0gKIAorI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8am5pLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogI2luY2x1ZGUgPG1lZGlhL1ZvbHVtZVNoYXBlci5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCisjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0pPYmplY3RIb2xkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1RpbWVzdGFtcC5oPiAgIC8vIEl0IGhhcyBkZXBlbmRlbmN5IG9uIGF1ZGlvLmgvRXJyb3JzLmgsIGJ1dCBkb2Vzbid0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRlIHRoZW0gaW4gaXQuIFRoZXJlZm9yZSBpdCBpcyBpbmNsdWRlZCBoZXJlIGF0IGxhc3QuCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgSkF1ZGlvVHJhY2sgeworY2xhc3MgSkF1ZGlvVHJhY2sgOiBwdWJsaWMgUmVmQmFzZSB7CiBwdWJsaWM6CiAKICAgICAvKiBFdmVudHMgdXNlZCBieSBBdWRpb1RyYWNrIGNhbGxiYWNrIGZ1bmN0aW9uIChjYWxsYmFja190KS4KQEAgLTM3LDYgKzM5LDggQEAKICAgICAgKi8KICAgICBlbnVtIGV2ZW50X3R5cGUgewogICAgICAgICBFVkVOVF9NT1JFX0RBVEEgPSAwLCAgICAgICAgLy8gUmVxdWVzdCB0byB3cml0ZSBtb3JlIGRhdGEgdG8gYnVmZmVyLgorICAgICAgICBFVkVOVF9VTkRFUlJVTiA9IDEsICAgICAgICAgLy8gQnVmZmVyIHVuZGVycnVuIG9jY3VycmVkLiBUaGlzIHdpbGwgbm90IG9jY3VyIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RhdGljIHRyYWNrcy4KICAgICAgICAgRVZFTlRfTkVXX0lBVURJT1RSQUNLID0gNiwgIC8vIElBdWRpb1RyYWNrIHdhcyByZS1jcmVhdGVkLCBlaXRoZXIgZHVlIHRvIHJlLXJvdXRpbmcgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2b2x1bnRhcnkgaW52YWxpZGF0aW9uIGJ5IG1lZGlhc2VydmVyLCBvciBtZWRpYXNlcnZlciBjcmFzaC4KICAgICAgICAgRVZFTlRfU1RSRUFNX0VORCA9IDcsICAgICAgIC8vIFNlbnQgYWZ0ZXIgYWxsIHRoZSBidWZmZXJzIHF1ZXVlZCBpbiBBRiBhbmQgSFcgYXJlIHBsYXllZApAQCAtMTA0LDE1ICsxMDgsMTQgQEAKICAgICAgKgogICAgICAqIFRPRE86IFJldml2ZSByZW1vdmVkIGFyZ3VtZW50cyBhZnRlciBvZmZsb2FkIG1vZGUgaXMgc3VwcG9ydGVkLgogICAgICAqLwotICAgIEpBdWRpb1RyYWNrKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAorICAgIEpBdWRpb1RyYWNrKHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmLAogICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIsCiAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAwLAotICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKLSAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gTlVMTCwKKyAgICAgICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JZCAgPSBBVURJT19TRVNTSU9OX0FMTE9DQVRFLAorICAgICAgICAgICAgICAgIGNvbnN0IGpvYmplY3QgcEF0dHJpYnV0ZXMgPSBOVUxMLAogICAgICAgICAgICAgICAgIGZsb2F0IG1heFJlcXVpcmVkU3BlZWQgPSAxLjBmKTsKIAogICAgIC8qCkBAIC0xNTgsMTAgKzE2MSwxMCBAQAogICAgICAqIENhdXRpb246IGNhbGxpbmcgdGhpcyBtZXRob2QgdG9vIG9mdGVuIG1heSBiZSBpbmVmZmljaWVudDsKICAgICAgKiBpZiB5b3UgbmVlZCBhIGhpZ2ggcmVzb2x1dGlvbiBtYXBwaW5nIGJldHdlZW4gZnJhbWUgcG9zaXRpb24gYW5kIHByZXNlbnRhdGlvbiB0aW1lLAogICAgICAqIGNvbnNpZGVyIGltcGxlbWVudGluZyB0aGF0IGF0IGFwcGxpY2F0aW9uIGxldmVsLCBiYXNlZCBvbiB0aGUgbG93IHJlc29sdXRpb24gdGltZXN0YW1wcy4KLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGltZXN0YW1wIGlzIHZhbGlkLgotICAgICAqIFRoZSB0aW1lc3RhbXAgcGFyYW1ldGVyIGlzIHVuZGVmaW5lZCBvbiByZXR1cm4sIGlmIGZhbHNlIGlzIHJldHVybmVkLgorICAgICAqIFJldHVybnMgTk9fRVJST1IgaWYgdGltZXN0YW1wIGlzIHZhbGlkLgorICAgICAqICAgICAgICAgTk9fSU5JVCBpZiBmaW5kcyBlcnJvciwgYW5kIHRpbWVzdGFtcCBwYXJhbWV0ZXIgd2lsbCBiZSB1bmRlZmluZWQgb24gcmV0dXJuLgogICAgICAqLwotICAgIGJvb2wgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApOworICAgIHN0YXR1c190IGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKTsKIAogICAgIC8vIFRPRE86IFRoaXMgZG9jIGlzIGp1c3QgY29waWVkIGZyb20gQXVkaW9UcmFjay5oLiBSZXZpc2UgaXQgYWZ0ZXIgaW1wbGVtZW5hdGlvbi4KICAgICAvKiBSZXR1cm4gdGhlIGV4dGVuZGVkIHRpbWVzdGFtcCwgd2l0aCBhZGRpdGlvbmFsIHRpbWViYXNlIGluZm8gYW5kIGltcHJvdmVkIGRyYWluIGJlaGF2aW9yLgpAQCAtMzI0LDM3ICszMjcsNDMgQEAKIAogICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCgpOwogCisgICAgc2l6ZV90IGZyYW1lU2l6ZSgpOworCiAgICAgLyoKICAgICAgKiBEdW1wcyB0aGUgc3RhdGUgb2YgYW4gYXVkaW8gdHJhY2suCiAgICAgICogTm90IGEgZ2VuZXJhbC1wdXJwb3NlIEFQSTsgaW50ZW5kZWQgb25seSBmb3IgdXNlIGJ5IG1lZGlhIHBsYXllciBzZXJ2aWNlIHRvIGR1bXAgaXRzIHRyYWNrcy4KICAgICAgKi8KICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CiAKLSAgICAvKiBSZXR1cm5zIHRoZSBJRCBvZiB0aGUgYXVkaW8gZGV2aWNlIGFjdHVhbGx5IHVzZWQgYnkgdGhlIG91dHB1dCB0byB3aGljaCB0aGlzIEF1ZGlvVHJhY2sgaXMKLSAgICAgKiBhdHRhY2hlZC4gV2hlbiB0aGUgQXVkaW9UcmFjayBpcyBpbmFjdGl2ZSwgaXQgd2lsbCByZXR1cm4gQVVESU9fUE9SVF9IQU5ETEVfTk9ORS4KKyAgICAvKiBSZXR1cm5zIHRoZSBBdWRpb0RldmljZUluZm8gdXNlZCBieSB0aGUgb3V0cHV0IHRvIHdoaWNoIHRoaXMgQXVkaW9UcmFjayBpcworICAgICAqIGF0dGFjaGVkLgogICAgICAqLwotICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0Um91dGVkRGV2aWNlSWQoKTsKKyAgICBqb2JqZWN0IGdldFJvdXRlZERldmljZSgpOwogCiAgICAgLyogUmV0dXJucyB0aGUgSUQgb2YgdGhlIGF1ZGlvIHNlc3Npb24gdGhpcyBBdWRpb1RyYWNrIGJlbG9uZ3MgdG8uICovCi0gICAgYXVkaW9fc2Vzc2lvbl90IGdldEF1ZGlvU2Vzc2lvbklkKCk7CisgICAgaW50MzJfdCBnZXRBdWRpb1Nlc3Npb25JZCgpOwogCi0gICAgLyogU2VsZWN0cyB0aGUgYXVkaW8gZGV2aWNlIHRvIHVzZSBmb3Igb3V0cHV0IG9mIHRoaXMgQXVkaW9UcmFjay4gQSB2YWx1ZSBvZgotICAgICAqIEFVRElPX1BPUlRfSEFORExFX05PTkUgaW5kaWNhdGVzIGRlZmF1bHQgcm91dGluZy4KKyAgICAvKiBTZXRzIHRoZSBwcmVmZXJyZWQgYXVkaW8gZGV2aWNlIHRvIHVzZSBmb3Igb3V0cHV0IG9mIHRoaXMgQXVkaW9UcmFjay4KICAgICAgKgogICAgICAqIFBhcmFtZXRlcnM6Ci0gICAgICogIFRoZSBkZXZpY2UgSUQgb2YgdGhlIHNlbGVjdGVkIGRldmljZSAoYXMgcmV0dXJuZWQgYnkgdGhlIEF1ZGlvRGV2aWNlc01hbmFnZXIgQVBJKS4KKyAgICAgKiBEZXZpY2U6IGFuIEF1ZGlvRGV2aWNlSW5mbyBvYmplY3QuCiAgICAgICoKICAgICAgKiBSZXR1cm5lZCB2YWx1ZToKICAgICAgKiAgLSBOT19FUlJPUjogc3VjY2Vzc2Z1bCBvcGVyYXRpb24KLSAgICAgKiAgLSBCQURfVkFMVUU6IGZhaWxlZCB0byBmaW5kIHRoZSB2YWxpZCBvdXRwdXQgZGV2aWNlIHdpdGggZ2l2ZW4gZGV2aWNlIElkLgorICAgICAqICAtIEJBRF9WQUxVRTogZmFpbGVkIHRvIHNldCB0aGUgZGV2aWNlCiAgICAgICovCi0gICAgc3RhdHVzX3Qgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpOworICAgIHN0YXR1c190IHNldFByZWZlcnJlZERldmljZShqb2JqZWN0IGRldmljZSk7CiAKICAgICAvLyBUT0RPOiBBZGQgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIHdoZW4gaXQgaXMgcG9zc2libGUgdG8gY2hlY2suCiAgICAgLy8gVE9ETzogQWRkIEFVRElPX0ZMQUdfSFdfQVZfU1lOQyB3aGVuIGl0IGlzIHBvc3NpYmxlIHRvIGNoZWNrLgogICAgIC8qIFJldHVybnMgdGhlIGZsYWdzICovCiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KIAorICAgIC8qIFdlIGRvbid0IGtlZXAgc3RyZWFtIHR5cGUgaGVyZSwKKyAgICAgKiBpbnN0ZWFkLCB3ZSBrZWVwIGF0dHJpYnV0ZXMgYW5kIGNhbGwgZ2V0Vm9sdW1lQ29udHJvbFN0cmVhbSgpIHRvIGdldCBzdHJlYW0gdHlwZQorICAgICAqLworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0QXVkaW9TdHJlYW1UeXBlKCk7CisKICAgICAvKiBPYnRhaW4gdGhlIHBlbmRpbmcgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIGZvciBwbGF5YmFjayBvZiBwdXJlIFBDTSBkYXRhIHJlbWFpbmluZyBpbgogICAgICAqIEF1ZGlvVHJhY2suCiAgICAgICoKQEAgLTM2OSwyNyArMzc4LDYwIEBACiAgICAgICogUmVwbGFjZXMgYW55IHByZXZpb3VzbHkgaW5zdGFsbGVkIGNhbGxiYWNrLgogICAgICAqCiAgICAgICogUGFyYW1ldGVyczoKLSAgICAgKgotICAgICAqIGNhbGxiYWNrOiBUaGUgY2FsbGJhY2sgaW50ZXJmYWNlCisgICAgICogTGlzdGVuZXI6IHRoZSBsaXN0ZW5lciB0byByZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiByZXJvdXRpbmcgZXZlbnRzLgorICAgICAqIEhhbmRsZXI6IHRoZSBoYW5kbGVyIHRvIGhhbmRsZXIgdGhlIHJlcm91dGluZyBldmVudHMuCiAgICAgICoKICAgICAgKiBSZXR1cm5zIE5PX0VSUk9SIGlmIHN1Y2Nlc3NmdWwuCi0gICAgICogICAgICAgICBJTlZBTElEX09QRVJBVElPTiBpZiB0aGUgc2FtZSBjYWxsYmFjayBpcyBhbHJlYWR5IGluc3RhbGxlZC4KLSAgICAgKiAgICAgICAgIE5PX0lOSVQgb3IgUFJFTUlTU0lPTl9ERU5JRUQgaWYgQXVkaW9GbGluZ2VyIHNlcnZpY2UgaXMgbm90IHJlYWNoYWJsZQotICAgICAqICAgICAgICAgQkFEX1ZBTFVFIGlmIHRoZSBjYWxsYmFjayBpcyBOVUxMCisgICAgICogICAgICAgICAoVE9ETykgSU5WQUxJRF9PUEVSQVRJT04gaWYgdGhlIHNhbWUgY2FsbGJhY2sgaXMgYWxyZWFkeSBpbnN0YWxsZWQuCisgICAgICogICAgICAgICAoVE9ETykgTk9fSU5JVCBvciBQUkVNSVNTSU9OX0RFTklFRCBpZiBBdWRpb0ZsaW5nZXIgc2VydmljZSBpcyBub3QgcmVhY2hhYmxlCisgICAgICogICAgICAgICAoVE9ETykgQkFEX1ZBTFVFIGlmIHRoZSBjYWxsYmFjayBpcyBOVUxMCiAgICAgICovCi0gICAgc3RhdHVzX3QgYWRkQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKTsKKyAgICBzdGF0dXNfdCBhZGRBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3QgbGlzdGVuZXIsIGpvYmplY3QgcmQpOwogCiAgICAgLyogUmVtb3ZlcyBhbiBBdWRpb0RldmljZUNhbGxiYWNrLgogICAgICAqCiAgICAgICogUGFyYW1ldGVyczoKLSAgICAgKgotICAgICAqIGNhbGxiYWNrOiBUaGUgY2FsbGJhY2sgaW50ZXJmYWNlCisgICAgICogTGlzdGVuZXI6IHRoZSBsaXN0ZW5lciB0byByZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiByZXJvdXRpbmcgZXZlbnRzLgogICAgICAqCiAgICAgICogUmV0dXJucyBOT19FUlJPUiBpZiBzdWNjZXNzZnVsLgotICAgICAqICAgICAgICAgSU5WQUxJRF9PUEVSQVRJT04gaWYgdGhlIGNhbGxiYWNrIGlzIG5vdCBpbnN0YWxsZWQKLSAgICAgKiAgICAgICAgIEJBRF9WQUxVRSBpZiB0aGUgY2FsbGJhY2sgaXMgTlVMTAorICAgICAqICAgICAgICAgKFRPRE8pIElOVkFMSURfT1BFUkFUSU9OIGlmIHRoZSBjYWxsYmFjayBpcyBub3QgaW5zdGFsbGVkCisgICAgICogICAgICAgICAoVE9ETykgQkFEX1ZBTFVFIGlmIHRoZSBjYWxsYmFjayBpcyBOVUxMCiAgICAgICovCi0gICAgc3RhdHVzX3QgcmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKTsKKyAgICBzdGF0dXNfdCByZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3QgbGlzdGVuZXIpOworCisgICAgLyogUmVnaXN0ZXIgYWxsIGJhY2tlZC11cCByb3V0aW5nIGRlbGVnYXRlcy4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogcm91dGluZ0RlbGVnYXRlczogYmFja2VkLXVwIHJvdXRpbmcgZGVsZWdhdGVzCisgICAgICoKKyAgICAgKi8KKyAgICB2b2lkIHJlZ2lzdGVyUm91dGluZ0RlbGVnYXRlcygKKyAgICAgICAgICAgIFZlY3RvcjxzdGQ6OnBhaXI8c3A8Sk9iamVjdEhvbGRlcj4sIHNwPEpPYmplY3RIb2xkZXI+Pj4mIHJvdXRpbmdEZWxlZ2F0ZXMpOworCisgICAgLyogZ2V0IGxpc3RlbmVyIGZyb20gUm91dGluZ0RlbGVnYXRlIG9iamVjdAorICAgICAqLworICAgIHN0YXRpYyBqb2JqZWN0IGdldExpc3RlbmVyKGNvbnN0IGpvYmplY3Qgcm91dGluZ0RlbGVnYXRlT2JqKTsKKworICAgIC8qIGdldCBoYW5kbGVyIGZyb20gUm91dGluZ0RlbGVnYXRlIG9iamVjdAorICAgICAqLworICAgIHN0YXRpYyBqb2JqZWN0IGdldEhhbmRsZXIoY29uc3Qgam9iamVjdCByb3V0aW5nRGVsZWdhdGVPYmopOworCisgICAgLyoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqIG1hcCBhbmQga2V5CisgICAgICoKKyAgICAgKiBSZXR1cm5zIHZhbHVlIGlmIGtleSBpcyBpbiB0aGUgbWFwCisgICAgICogICAgICAgICBudWxscHRyIGlmIGtleSBpcyBub3QgaW4gdGhlIG1hcAorICAgICAqLworICAgIHN0YXRpYyBqb2JqZWN0IGZpbmRCeUtleSgKKyAgICAgICAgICAgIFZlY3RvcjxzdGQ6OnBhaXI8c3A8Sk9iamVjdEhvbGRlcj4sIHNwPEpPYmplY3RIb2xkZXI+Pj4mIG1wLCBjb25zdCBqb2JqZWN0IGtleSk7CisKKyAgICAvKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogbWFwIGFuZCBrZXkKKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBlcmFzZUJ5S2V5KAorICAgICAgICAgICAgVmVjdG9yPHN0ZDo6cGFpcjxzcDxKT2JqZWN0SG9sZGVyPiwgc3A8Sk9iamVjdEhvbGRlcj4+PiYgbXAsIGNvbnN0IGpvYmplY3Qga2V5KTsKIAogcHJpdmF0ZToKICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBtRmxhZ3M7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBDb25uZWN0aW9uLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBDb25uZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTVmN2Y4MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KTWVkaWEySFRUUENvbm5lY3Rpb24uaApAQCAtMCwwICsxLDU4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9KX01FRElBMl9IVFRQX0NPTk5FQ1RJT05fSF8KKyNkZWZpbmUgX0pfTUVESUEyX0hUVFBfQ09OTkVDVElPTl9IXworCisjaW5jbHVkZSAiam5pLmgiCisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBKTWVkaWEySFRUUENvbm5lY3Rpb24gOiBwdWJsaWMgTWVkaWFIVFRQQ29ubmVjdGlvbiB7CisgICAgSk1lZGlhMkhUVFBDb25uZWN0aW9uKEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXopOworCisgICAgdmlydHVhbCBib29sIGNvbm5lY3QoCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmksIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgb2ZmNjRfdCBnZXRTaXplKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNSU1FVHlwZShTdHJpbmc4ICptaW1lVHlwZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRVcmkoU3RyaW5nOCAqdXJpKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkpNZWRpYTJIVFRQQ29ubmVjdGlvbigpOworCitwcml2YXRlOgorICAgIGpvYmplY3QgbU1lZGlhMkhUVFBDb25uZWN0aW9uT2JqOworICAgIGptZXRob2RJRCBtQ29ubmVjdE1ldGhvZDsKKyAgICBqbWV0aG9kSUQgbURpc2Nvbm5lY3RNZXRob2Q7CisgICAgam1ldGhvZElEIG1SZWFkQXRNZXRob2Q7CisgICAgam1ldGhvZElEIG1HZXRTaXplTWV0aG9kOworICAgIGptZXRob2RJRCBtR2V0TUlNRVR5cGVNZXRob2Q7CisgICAgam1ldGhvZElEIG1HZXRVcmlNZXRob2Q7CisKKyAgICBqYnl0ZUFycmF5IG1CeXRlQXJyYXlPYmo7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhKTWVkaWEySFRUUENvbm5lY3Rpb24pOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBfSl9NRURJQTJfSFRUUF9DT05ORUNUSU9OX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBTZXJ2aWNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY2MWE3ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KTWVkaWEySFRUUFNlcnZpY2UuaApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9KX01FRElBMl9IVFRQX1NFUlZJQ0VfSF8KKyNkZWZpbmUgX0pfTUVESUEyX0hUVFBfU0VSVklDRV9IXworCisjaW5jbHVkZSA8am5pLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQU2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUENvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEpNZWRpYTJIVFRQU2VydmljZSA6IHB1YmxpYyBNZWRpYUhUVFBTZXJ2aWNlIHsKKyAgICBKTWVkaWEySFRUUFNlcnZpY2UoSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeik7CisKKyAgICB2aXJ0dWFsIHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+IG1ha2VIVFRQQ29ubmVjdGlvbigpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+Sk1lZGlhMkhUVFBTZXJ2aWNlKCk7CisKK3ByaXZhdGU6CisgICAgam9iamVjdCBtTWVkaWEySFRUUFNlcnZpY2VPYmo7CisKKyAgICBqbWV0aG9kSUQgbU1ha2VIVFRQQ29ubmVjdGlvbk1ldGhvZDsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEpNZWRpYTJIVFRQU2VydmljZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIF9KX01FRElBMl9IVFRQX1NFUlZJQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KT2JqZWN0SG9sZGVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSk9iamVjdEhvbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZDhiNDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSk9iamVjdEhvbGRlci5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgSk9CSkVDVF9IT0xERVJfSF8KKworI2RlZmluZSBKT0JKRUNUX0hPTERFUl9IXworCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBIZWxwZXIgY2xhc3MgZm9yIG1hbmFnaW5nIGdsb2JhbCByZWZlcmVuY2Ugb2Ygam9iamVjdC4KK3N0cnVjdCBKT2JqZWN0SG9sZGVyIDogcHVibGljIFJlZkJhc2UgeworICAgIEpPYmplY3RIb2xkZXIoam9iamVjdCBvYmopIHsKKyAgICAgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgICAgICBtSk9iamVjdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8am9iamVjdD4oZW52LT5OZXdHbG9iYWxSZWYob2JqKSk7CisgICAgfQorCisgICAgdmlydHVhbCB+Sk9iamVjdEhvbGRlcigpIHsKKyAgICAgICAgSk5JRW52ICplbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgICAgICBlbnYtPkRlbGV0ZUdsb2JhbFJlZihtSk9iamVjdCk7CisgICAgfQorCisgICAgam9iamVjdCBnZXRKT2JqZWN0KCkgeyByZXR1cm4gbUpPYmplY3Q7IH0KKworcHJpdmF0ZToKKyAgICBqb2JqZWN0IG1KT2JqZWN0OworfTsKKworfSAgLy8iIGFuZHJvaWQKKworI2VuZGlmICAvLyBKT0JKRUNUX0hPTERFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0phdmFWTUhlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNTZhY2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvSmF2YVZNSGVscGVyLmgKQEAgLTAsMCArMSw0MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBKQVZBX1ZNX0hFTFBFUl9IXworCisjZGVmaW5lIEpBVkFfVk1fSEVMUEVSX0hfCisKKyNpbmNsdWRlICJqbmkuaCIKKworI2luY2x1ZGUgPGF0b21pYz4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgSmF2YVZNSGVscGVyIHsKKyAgICBzdGF0aWMgSk5JRW52ICpnZXRKTklFbnYoKTsKKyAgICBzdGF0aWMgSmF2YVZNICpnZXRKYXZhVk0oKTsKKyAgICBzdGF0aWMgdm9pZCBzZXRKYXZhVk0oSmF2YVZNICp2bSk7CisKK3ByaXZhdGU6CisgICAgLy8gT25jZSBhIHZhbGlkIEphdmFWTSBoYXMgYmVlbiBzZXQsIGl0IHNob3VsZCBuZXZlciBiZSByZXNldCBvciBjaGFuZ2VkLgorICAgIC8vIEhvd2V2ZXIsIGFzIGl0IG1heSBiZSBhY2Nlc3NlZCBmcm9tIG11bHRpcGxlIHRocmVhZHMsIGFjY2VzcyBuZWVkcyB0byBiZQorICAgIC8vIHN5bmNocm9uaXplZC4KKyAgICBzdGF0aWMgc3RkOjphdG9taWM8SmF2YVZNICo+IHNKYXZhVk07Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEpBVkFfVk1fSEVMUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5oCmluZGV4IDVkNWI4ZTQuLmYzOGI3Y2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5oCkBAIC0xOSwxMCArMTksMTUgQEAKICNkZWZpbmUgQU5EUk9JRF9NRURJQVBMQVlFUjJBVURJT09VVFBVVF9ICiAKICNpbmNsdWRlIDxtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0pPYmplY3RIb2xkZXIuaD4KIAorI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAorI2luY2x1ZGUgImpuaS5oIgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIEF1ZGlvVHJhY2s7CkBAIC0zMiwxNSArMzcsMTQgQEAKICAgICBjbGFzcyBDYWxsYmFja0RhdGE7CiAKIHB1YmxpYzoKLSAgICBNZWRpYVBsYXllcjJBdWRpb091dHB1dChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KGludDMyX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqIGF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBkZXZpY2VDYWxsYmFjayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgam9iamVjdCBhdHRyaWJ1dGVzKTsKICAgICB2aXJ0dWFsIH5NZWRpYVBsYXllcjJBdWRpb091dHB1dCgpOwogCiAgICAgdmlydHVhbCBib29sIHJlYWR5KCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVRyYWNrICE9IDA7CisgICAgICAgIHJldHVybiBtSkF1ZGlvVHJhY2sgIT0gbnVsbHB0cjsKICAgICB9CiAgICAgdmlydHVhbCBzc2l6ZV90IGJ1ZmZlclNpemUoKSBjb25zdDsKICAgICB2aXJ0dWFsIHNzaXplX3QgZnJhbWVDb3VudCgpIGNvbnN0OwpAQCAtNTIsMTcgKzU2LDE3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAgJnRzKSBjb25zdDsKICAgICB2aXJ0dWFsIGludDY0X3QgZ2V0UGxheWVkT3V0RHVyYXRpb25VcyhpbnQ2NF90IG5vd1VzKSBjb25zdDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKmZyYW1lc3dyaXR0ZW4pIGNvbnN0OwotICAgIHZpcnR1YWwgYXVkaW9fc2Vzc2lvbl90IGdldFNlc3Npb25JZCgpIGNvbnN0OworICAgIHZpcnR1YWwgaW50MzJfdCBnZXRTZXNzaW9uSWQoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0U2Vzc2lvbklkKGNvbnN0IGludDMyX3QgaWQpOwogICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0OwogICAgIHZpcnR1YWwgaW50NjRfdCBnZXRCdWZmZXJEdXJhdGlvbkluVXMoKSBjb25zdDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbigKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGludCBjaGFubmVsQ291bnQsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQgYnVmZmVyQ291bnQsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgICAgICBBdWRpb0NhbGxiYWNrIGNiLCB2b2lkICpjb29raWUsCiAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCiAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMLAotICAgICAgICAgICAgYm9vbCBkb05vdFJlY29ubmVjdCA9IGZhbHNlLAogICAgICAgICAgICAgdWludDMyX3Qgc3VnZ2VzdGVkRnJhbWVDb3VudCA9IDApOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwpAQCAtNzEsMTMgKzc1LDEwIEBACiAgICAgdmlydHVhbCB2b2lkIGZsdXNoKCk7CiAgICAgdmlydHVhbCB2b2lkIHBhdXNlKCk7CiAgICAgdmlydHVhbCB2b2lkIGNsb3NlKCk7Ci0gICAgdm9pZCBzZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKTsKLSAgICB2aXJ0dWFsIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0QXVkaW9TdHJlYW1UeXBlKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVN0cmVhbVR5cGU7Ci0gICAgfQotICAgIHZvaWQgc2V0QXVkaW9BdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqIGF0dHJpYnV0ZXMpOworICAgIHZvaWQgc2V0QXVkaW9BdHRyaWJ1dGVzKGNvbnN0IGpvYmplY3QgYXR0cmlidXRlcyk7CisgICAgdmlydHVhbCBhdWRpb19zdHJlYW1fdHlwZV90IGdldEF1ZGlvU3RyZWFtVHlwZSgpIGNvbnN0OwogCi0gICAgdm9pZCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOworICAgIHZvaWQgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUmIHJhdGUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGxheWJhY2tSYXRlKEF1ZGlvUGxheWJhY2tSYXRlKiByYXRlIC8qIG5vbm51bGwgKi8pOwogCkBAIC05MiwxMyArOTMsMTEgQEAKICAgICAgICAgLy8gVE9ETzogcmV0dXJuIGNvcnJlY3QgdmFsdWUuCiAgICAgICAgIC8vcmV0dXJuIG1OZXh0T3V0cHV0ID09IE5VTEw7CiAgICAgfQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKTsKLSAgICB2aXJ0dWFsIFN0cmluZzggZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKLQogICAgIC8vIEF1ZGlvUm91dGluZwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Um91dGVkRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCogZGV2aWNlSWQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJlZmVycmVkRGV2aWNlKGpvYmplY3QgZGV2aWNlKTsKKyAgICB2aXJ0dWFsIGpvYmplY3QgZ2V0Um91dGVkRGV2aWNlKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3Qgcm91dGluZ0RlbGVnYXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soam9iamVjdCBsaXN0ZW5lcik7CiAKIHByaXZhdGU6CiAgICAgc3RhdGljIHZvaWQgc2V0TWluQnVmZmVyQ291bnQoKTsKQEAgLTEwNywzMCArMTA2LDI4IEBACiAgICAgdm9pZCBjbG9zZV9sKCk7CiAgICAgc3RhdHVzX3QgdXBkYXRlVHJhY2tfbCgpOwogCi0gICAgc3A8QXVkaW9UcmFjaz4gICAgICAgICAgbVRyYWNrOworICAgIHNwPEpBdWRpb1RyYWNrPiAgICAgICAgIG1KQXVkaW9UcmFjazsKICAgICBBdWRpb0NhbGxiYWNrICAgICAgICAgICBtQ2FsbGJhY2s7CiAgICAgdm9pZCAqICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrQ29va2llOwogICAgIENhbGxiYWNrRGF0YSAqICAgICAgICAgIG1DYWxsYmFja0RhdGE7Ci0gICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAgICAgbVN0cmVhbVR5cGU7Ci0gICAgYXVkaW9fYXR0cmlidXRlc190ICogICAgbUF0dHJpYnV0ZXM7Ci0gICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbUxlZnRWb2x1bWU7Ci0gICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbVJpZ2h0Vm9sdW1lOworICAgIHNwPEpPYmplY3RIb2xkZXI+ICAgICAgIG1BdHRyaWJ1dGVzOworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1Wb2x1bWU7CiAgICAgQXVkaW9QbGF5YmFja1JhdGUgICAgICAgbVBsYXliYWNrUmF0ZTsKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZUh6OyAvLyBzYW1wbGUgcmF0ZSBvZiB0aGUgY29udGVudCwgYXMgc2V0IGluIG9wZW4oKQogICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1Nc2Vjc1BlckZyYW1lOwogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZVNpemU7Ci0gICAgYXVkaW9fc2Vzc2lvbl90ICAgICAgICAgbVNlc3Npb25JZDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkOwogICAgIHVpZF90ICAgICAgICAgICAgICAgICAgIG1VaWQ7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbVBpZDsKICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtU2VuZExldmVsOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1BdXhFZmZlY3RJZDsKICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAgICBtRmxhZ3M7Ci0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbVNlbGVjdGVkRGV2aWNlSWQ7Ci0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbVJvdXRlZERldmljZUlkOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VDYWxsYmFja0VuYWJsZWQ7Ci0gICAgd3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+ICAgICAgICBtRGV2aWNlQ2FsbGJhY2s7CisgICAgc3A8Sk9iamVjdEhvbGRlcj4gICAgICAgbVByZWZlcnJlZERldmljZTsKICAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICBtTG9jazsKIAorICAgIC8vIDxsaXN0ZW5lciwgcm91dGluZ0RlbGVnYXRlPgorICAgIFZlY3RvcjxzdGQ6OnBhaXI8c3A8Sk9iamVjdEhvbGRlcj4sIHNwPEpPYmplY3RIb2xkZXI+Pj4gbVJvdXRpbmdEZWxlZ2F0ZXM7CisKICAgICAvLyBzdGF0aWMgdmFyaWFibGVzIGJlbG93IG5vdCBwcm90ZWN0ZWQgYnkgbXV0ZXgKICAgICBzdGF0aWMgYm9vbCAgICAgICAgICAgICBtSXNPbkVtdWxhdG9yOwogICAgIHN0YXRpYyBpbnQgICAgICAgICAgICAgIG1NaW5CdWZmZXJDb3VudDsgIC8vIDEyIGZvciBlbXVsYXRvcjsgb3RoZXJ3aXNlIDQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJJbnRlcmZhY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJJbnRlcmZhY2UuaAppbmRleCAwMmJmODkxLi43ODA0YTYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkludGVyZmFjZS5oCkBAIC0yMywxNiArMjMsMjEgQEAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPGpuaS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvQVZTeW5jU2V0dGluZ3MuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UaW1lc3RhbXAuaD4KICNpbmNsdWRlIDxtZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5oPgotI2luY2x1ZGUgPG1lZGlhL01ldGFkYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgogI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJUeXBlcy5oPgogCisjaW5jbHVkZSAiam5pLmgiCisjaW5jbHVkZSAibWVkaWFwbGF5ZXIyLnBiLmgiCisKK3VzaW5nIGFuZHJvaWQ6Om1lZGlhOjpNZWRpYVBsYXllcjJQcm90bzo6UGxheWVyTWVzc2FnZTsKKwogLy8gRndkIGRlY2wgdG8gbWFrZSBzdXJlIGV2ZXJ5b25lIGFncmVlcyB0aGF0IHRoZSBzY29wZSBvZiBzdHJ1Y3Qgc29ja2FkZHJfaW4gaXMKIC8vIGdsb2JhbCwgYW5kIG5vdCBpbiBhbmRyb2lkOjoKIHN0cnVjdCBzb2NrYWRkcl9pbjsKQEAgLTQzLDcgKzQ4LDYgQEAKIGNsYXNzIFBhcmNlbDsKIHN0cnVjdCBBTmF0aXZlV2luZG93V3JhcHBlcjsKIAotI2RlZmluZSBERUZBVUxUX0FVRElPU0lOS19CVUZGRVJDT1VOVCA0CiAjZGVmaW5lIERFRkFVTFRfQVVESU9TSU5LX0JVRkZFUlNJWkUgMTIwMAogI2RlZmluZSBERUZBVUxUX0FVRElPU0lOS19TQU1QTEVSQVRFIDQ0MTAwCiAKQEAgLTU2LDcgKzYwLDggQEAKIGNsYXNzIE1lZGlhUGxheWVyMkludGVyZmFjZUxpc3RlbmVyOiBwdWJsaWMgUmVmQmFzZQogewogcHVibGljOgotICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikgPSAwOworICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLAorICAgICAgICAgICBjb25zdCBQbGF5ZXJNZXNzYWdlICpvYmopID0gMDsKIH07CiAKIGNsYXNzIE1lZGlhUGxheWVyMkludGVyZmFjZSA6IHB1YmxpYyBBSGFuZGxlciB7CkBAIC04OCw3ICs5Myw3IEBACiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wICZ0cykgY29uc3QgPSAwOwogICAgICAgICB2aXJ0dWFsIGludDY0X3QgZ2V0UGxheWVkT3V0RHVyYXRpb25VcyhpbnQ2NF90IG5vd1VzKSBjb25zdCA9IDA7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVzV3JpdHRlbih1aW50MzJfdCAqZnJhbWVzd3JpdHRlbikgY29uc3QgPSAwOwotICAgICAgICB2aXJ0dWFsIGF1ZGlvX3Nlc3Npb25fdCBnZXRTZXNzaW9uSWQoKSBjb25zdCA9IDA7CisgICAgICAgIHZpcnR1YWwgaW50MzJfdCBnZXRTZXNzaW9uSWQoKSBjb25zdCA9IDA7CiAgICAgICAgIHZpcnR1YWwgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRBdWRpb1N0cmVhbVR5cGUoKSBjb25zdCA9IDA7CiAgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0ID0gMDsKICAgICAgICAgdmlydHVhbCBpbnQ2NF90IGdldEJ1ZmZlckR1cmF0aW9uSW5VcygpIGNvbnN0ID0gMDsKQEAgLTk4LDEyICsxMDMsMTAgQEAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuKAogICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsIGludCBjaGFubmVsQ291bnQsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdD1BVURJT19GT1JNQVRfUENNXzE2X0JJVCwKLSAgICAgICAgICAgICAgICBpbnQgYnVmZmVyQ291bnQ9REVGQVVMVF9BVURJT1NJTktfQlVGRkVSQ09VTlQsCiAgICAgICAgICAgICAgICAgQXVkaW9DYWxsYmFjayBjYiA9IE5VTEwsCiAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llID0gTlVMTCwKICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCiAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKm9mZmxvYWRJbmZvID0gTlVMTCwKLSAgICAgICAgICAgICAgICBib29sIGRvTm90UmVjb25uZWN0ID0gZmFsc2UsCiAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3VnZ2VzdGVkRnJhbWVDb3VudCA9IDApID0gMDsKIAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgPSAwOwpAQCAtMTM5LDkgKzE0MiwxMCBAQAogICAgICAgICB9CiAKICAgICAgICAgLy8gQXVkaW9Sb3V0aW5nCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldFJvdXRlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QqIGRldmljZUlkKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0UHJlZmVycmVkRGV2aWNlKGpvYmplY3QgZGV2aWNlKTsKKyAgICAgICAgdmlydHVhbCBqb2JqZWN0ICAgICBnZXRSb3V0ZWREZXZpY2UoKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBhZGRBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3Qgcm91dGluZ0RlbGVnYXRlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICByZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3QgbGlzdGVuZXIpOwogICAgIH07CiAKICAgICBNZWRpYVBsYXllcjJJbnRlcmZhY2UoKSA6IG1MaXN0ZW5lcihOVUxMKSB7IH0KQEAgLTE3MSw3ICsxNzUsNiBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlQXN5bmMoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgaXNQbGF5aW5nKCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSYgcmF0ZSkgewpAQCAtMjExLDYgKzIxNCw4IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkgPSAwOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRyaWNzKGNoYXIgKipidWZmZXIsIHNpemVfdCAqbGVuZ3RoKSA9IDA7CisKICAgICAvLyBJbnZva2UgYSBnZW5lcmljIG1ldGhvZCBvbiB0aGUgcGxheWVyIGJ5IHVzaW5nIG9wYXF1ZSBwYXJjZWxzCiAgICAgLy8gZm9yIHRoZSByZXF1ZXN0IGFuZCByZXBseS4KICAgICAvLwpAQCAtMjE4LDI2ICsyMjMsMTQgQEAKICAgICAvLyAgICAgICAgICAgICAgICBkYXRhIHNlbnQgYnkgdGhlIGphdmEgbGF5ZXIuCiAgICAgLy8gQHBhcmFtW291dF0gcmVwbHkgUGFyY2VsIHRvIGhvbGQgdGhlIHJlcGx5IGRhdGEuIENhbm5vdCBiZSBudWxsLgogICAgIC8vIEByZXR1cm4gT0sgaWYgdGhlIGNhbGwgd2FzIHN1Y2Nlc3NmdWwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbnZva2UoY29uc3QgUGFyY2VsJiByZXF1ZXN0LCBQYXJjZWwgKnJlcGx5KSA9IDA7Ci0KLSAgICAvLyBUaGUgQ2xpZW50IGluIHRoZSBNZXRhZGF0YVBsYXllclNlcnZpY2UgY2FsbHMgdGhpcyBtZXRob2Qgb24KLSAgICAvLyB0aGUgbmF0aXZlIHBsYXllciB0byByZXRyaWV2ZSBhbGwgb3IgYSBzdWJzZXQgb2YgbWV0YWRhdGEuCi0gICAgLy8KLSAgICAvLyBAcGFyYW0gaWRzIFNvcnRlZExpc3Qgb2YgbWV0YWRhdGEgSUQgdG8gYmUgZmV0Y2guIElmIGVtcHR5LCBhbGwKLSAgICAvLyAgICAgICAgICAgIHRoZSBrbm93biBtZXRhZGF0YSBzaG91bGQgYmUgcmV0dXJuZWQuCi0gICAgLy8gQHBhcmFtW2lub3V0XSByZWNvcmRzIFBhcmNlbCB3aGVyZSB0aGUgcGxheWVyIGFwcGVuZHMgaXRzIG1ldGFkYXRhLgotICAgIC8vIEByZXR1cm4gT0sgaWYgdGhlIGNhbGwgd2FzIHN1Y2Nlc3NmdWwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhZGF0YShjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgLyogaWRzICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiAvKiByZWNvcmRzICovKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9OworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW52b2tlKGNvbnN0IFBsYXllck1lc3NhZ2UgJnJlcXVlc3QsIFBsYXllck1lc3NhZ2UgKnJlcGx5KSA9IDA7CiAKICAgICB2b2lkIHNldExpc3RlbmVyKGNvbnN0IHNwPE1lZGlhUGxheWVyMkludGVyZmFjZUxpc3RlbmVyPiAmbGlzdGVuZXIpIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1MaXN0ZW5lckxvY2spOwogICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKICAgICB9CiAKLSAgICB2b2lkIHNlbmRFdmVudChpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MT0wLCBpbnQgZXh0Mj0wLCBjb25zdCBQYXJjZWwgKm9iaj1OVUxMKSB7CisgICAgdm9pZCBzZW5kRXZlbnQoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDE9MCwgaW50IGV4dDI9MCwgY29uc3QgUGxheWVyTWVzc2FnZSAqb2JqPU5VTEwpIHsKICAgICAgICAgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlTGlzdGVuZXI+IGxpc3RlbmVyOwogICAgICAgICB7CiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxpc3RlbmVyTG9jayk7CkBAIC0yNTYsMTEgKzI0OSwxMSBAQAogICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJiAvKiBtc2cgKi8pIG92ZXJyaWRlIHsgfQogCiAgICAgLy8gTW9kdWxhciBEUk0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVEcm0oY29uc3QgdWludDhfdCAvKiB1dWlkICovWzE2XSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVEcm0oaW50NjRfdCAvKnNyY0lkKi8sIGNvbnN0IHVpbnQ4X3QgLyogdXVpZCAqL1sxNl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgLyogZHJtU2Vzc2lvbklkICovKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlRHJtKCkgeworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZURybShpbnQ2NF90IC8qc3JjSWQqLykgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyVHlwZXMuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJUeXBlcy5oCmluZGV4IDM5MDViNTUuLjI0MzAyODkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJUeXBlcy5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJUeXBlcy5oCkBAIC0zNCw4ICszNCw3IEBACiAgICAgTUVESUEyX1NFVF9WSURFT19TSVpFICAgID0gNSwKICAgICBNRURJQTJfU1RBUlRFRCAgICAgICAgICAgPSA2LAogICAgIE1FRElBMl9QQVVTRUQgICAgICAgICAgICA9IDcsCi0gICAgTUVESUEyX1NUT1BQRUQgICAgICAgICAgID0gOCwKLSAgICBNRURJQTJfU0tJUFBFRCAgICAgICAgICAgPSA5LAorICAgIE1FRElBMl9TS0lQUEVEICAgICAgICAgICA9IDgsCiAgICAgTUVESUEyX05PVElGWV9USU1FICAgICAgID0gOTgsCiAgICAgTUVESUEyX1RJTUVEX1RFWFQgICAgICAgID0gOTksCiAgICAgTUVESUEyX0VSUk9SICAgICAgICAgICAgID0gMTAwLApAQCAtNDMsNyArNDIsNiBAQAogICAgIE1FRElBMl9TVUJUSVRMRV9EQVRBICAgICA9IDIwMSwKICAgICBNRURJQTJfTUVUQV9EQVRBICAgICAgICAgPSAyMDIsCiAgICAgTUVESUEyX0RSTV9JTkZPICAgICAgICAgID0gMjEwLAotICAgIE1FRElBMl9BVURJT19ST1VUSU5HX0NIQU5HRUQgPSAxMDAwMCwKIH07CiAKIC8vIEdlbmVyaWMgZXJyb3IgY29kZXMgZm9yIHRoZSBtZWRpYSBwbGF5ZXIgZnJhbWV3b3JrLiAgRXJyb3JzIGFyZSBmYXRhbCwgdGhlCkBAIC05NiwxNyArOTQsMjAgQEAKIGVudW0gbWVkaWEyX2luZm9fdHlwZSB7CiAgICAgLy8gMHh4CiAgICAgTUVESUEyX0lORk9fVU5LTk9XTiA9IDEsCi0gICAgLy8gVGhlIHBsYXllciB3YXMgc3RhcnRlZCBiZWNhdXNlIGl0IHdhcyB1c2VkIGFzIHRoZSBuZXh0IHBsYXllciBmb3IgYW5vdGhlcgotICAgIC8vIHBsYXllciwgd2hpY2gganVzdCBjb21wbGV0ZWQgcGxheWJhY2sKLSAgICBNRURJQTJfSU5GT19TVEFSVEVEX0FTX05FWFQgPSAyLAorICAgIC8vIFRoZSBwbGF5ZXIganVzdCBzdGFydGVkIHRoZSBwbGF5YmFjayBvZiB0aGlzIGRhdGEgc291cmNlLgorICAgIE1FRElBMl9JTkZPX0RBVEFfU09VUkNFX1NUQVJUID0gMiwKICAgICAvLyBUaGUgcGxheWVyIGp1c3QgcHVzaGVkIHRoZSB2ZXJ5IGZpcnN0IHZpZGVvIGZyYW1lIGZvciByZW5kZXJpbmcKICAgICBNRURJQTJfSU5GT19WSURFT19SRU5ERVJJTkdfU1RBUlQgPSAzLAogICAgIC8vIFRoZSBwbGF5ZXIganVzdCBwdXNoZWQgdGhlIHZlcnkgZmlyc3QgYXVkaW8gZnJhbWUgZm9yIHJlbmRlcmluZwogICAgIE1FRElBMl9JTkZPX0FVRElPX1JFTkRFUklOR19TVEFSVCA9IDQsCiAgICAgLy8gVGhlIHBsYXllciBqdXN0IGNvbXBsZXRlZCB0aGUgcGxheWJhY2sgb2YgdGhpcyBkYXRhIHNvdXJjZQotICAgIE1FRElBMl9JTkZPX1BMQVlCQUNLX0NPTVBMRVRFID0gNSwKLSAgICAvLyBUaGUgcGxheWVyIGp1c3QgY29tcGxldGVkIHRoZSBwbGF5YmFjayBvZiB0aGUgZnVsbCBwbGF5IGxpc3QKLSAgICBNRURJQTJfSU5GT19QTEFZTElTVF9FTkQgPSA2LAorICAgIE1FRElBMl9JTkZPX0RBVEFfU09VUkNFX0VORCA9IDUsCisgICAgLy8gVGhlIHBsYXllciBqdXN0IGNvbXBsZXRlZCB0aGUgcGxheWJhY2sgb2YgYWxsIGRhdGEgc291cmNlcy4KKyAgICAvLyBCdXQgdGhpcyBpcyBub3QgdmlzaWJsZSBpbiBuYXRpdmUgY29kZS4gSnVzdCBrZWVwIHRoaXMgZW50cnkgZm9yIGNvbXBsZXRlbmVzcy4KKyAgICBNRURJQTJfSU5GT19EQVRBX1NPVVJDRV9MSVNUX0VORCA9IDYsCisgICAgLy8gVGhlIHBsYXllciBqdXN0IGNvbXBsZXRlZCBhbiBpdGVyYXRpb24gb2YgcGxheWJhY2sgbG9vcC4gVGhpcyBldmVudCBpcyBzZW50IG9ubHkgd2hlbgorICAgIC8vIGxvb3BpbmcgaXMgZW5hYmxlZC4KKyAgICBNRURJQTJfSU5GT19EQVRBX1NPVVJDRV9SRVBFQVQgPSA3LAogCiAgICAgLy8xeHgKICAgICAvLyBUaGUgcGxheWVyIGp1c3QgcHJlcGFyZWQgYSBkYXRhIHNvdXJjZS4KQEAgLTE1MCwxMSArMTUxLDExIEBACiAKIC8vIERvIG5vdCBjaGFuZ2UgdGhlc2UgdmFsdWVzIHdpdGhvdXQgdXBkYXRpbmcgdGhlaXIgY291bnRlcnBhcnRzIGluIE1lZGlhUGxheWVyMi5qYXZhCiBlbnVtIG1lZGlhcGxheWVyMl9zdGF0ZXMgewotICAgIE1FRElBUExBWUVSMl9TVEFURV9JRExFICAgICAgICAgPSAxLAotICAgIE1FRElBUExBWUVSMl9TVEFURV9QUkVQQVJFRCAgICAgPSAyLAotICAgIE1FRElBUExBWUVSMl9TVEFURV9QTEFZSU5HICAgICAgPSAzLAotICAgIE1FRElBUExBWUVSMl9TVEFURV9QQVVTRUQgICAgICAgPSA0LAotICAgIE1FRElBUExBWUVSMl9TVEFURV9FUlJPUiAgICAgICAgPSA1LAorICAgIE1FRElBUExBWUVSMl9TVEFURV9JRExFICAgICAgICAgPSAxMDAxLAorICAgIE1FRElBUExBWUVSMl9TVEFURV9QUkVQQVJFRCAgICAgPSAxMDAyLAorICAgIE1FRElBUExBWUVSMl9TVEFURV9QQVVTRUQgICAgICAgPSAxMDAzLAorICAgIE1FRElBUExBWUVSMl9TVEFURV9QTEFZSU5HICAgICAgPSAxMDA0LAorICAgIE1FRElBUExBWUVSMl9TVEFURV9FUlJPUiAgICAgICAgPSAxMDA1LAogfTsKIAogZW51bSBtZWRpYV9wbGF5ZXIyX2ludGVybmFsX3N0YXRlcyB7CkBAIC0xNjUsOCArMTY2LDcgQEAKICAgICBNRURJQV9QTEFZRVIyX1BSRVBBUkVEICAgICAgICAgICA9IDEgPDwgMywKICAgICBNRURJQV9QTEFZRVIyX1NUQVJURUQgICAgICAgICAgICA9IDEgPDwgNCwKICAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCAgICAgICAgICAgICA9IDEgPDwgNSwKLSAgICBNRURJQV9QTEFZRVIyX1NUT1BQRUQgICAgICAgICAgICA9IDEgPDwgNiwKLSAgICBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFICA9IDEgPDwgNworICAgIE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUgID0gMSA8PCA2CiB9OwogCiAvLyBLZWVwIEtFWV9QQVJBTUVURVJfKiBpbiBzeW5jIHdpdGggTWVkaWFQbGF5ZXIyLmphdmEuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvbWVkaWFwbGF5ZXIyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvbWVkaWFwbGF5ZXIyLmgKaW5kZXggZDU4NjE5Mi4uMWU4YTFkNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9tZWRpYXBsYXllcjIuaApAQCAtMjAsMTEgKzIwLDEyIEBACiAjaW5jbHVkZSA8bWVkaWEvQVZTeW5jU2V0dGluZ3MuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogI2luY2x1ZGUgPG1lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWV0YWRhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllcl9jb21tb24uaD4KICNpbmNsdWRlIDxtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMlR5cGVzLmg+CisjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL0pPYmplY3RIb2xkZXIuaD4KIAorI2luY2x1ZGUgPGpuaS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgpAQCAtMzIsNiArMzMsOCBAQAogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby1iYXNlLmg+CiAKKyNpbmNsdWRlICJqbmkuaCIKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQU5hdGl2ZVdpbmRvd1dyYXBwZXI7CkBAIC00Miw3ICs0NSw4IEBACiBjbGFzcyBNZWRpYVBsYXllcjJMaXN0ZW5lcjogdmlydHVhbCBwdWJsaWMgUmVmQmFzZQogewogcHVibGljOgotICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikgPSAwOworICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLAorICAgICAgICAgICAgY29uc3QgUGxheWVyTWVzc2FnZSAqb2JqID0gTlVMTCkgPSAwOwogfTsKIAogY2xhc3MgTWVkaWFQbGF5ZXIyIDogcHVibGljIE1lZGlhUGxheWVyMkludGVyZmFjZUxpc3RlbmVyCkBAIC01MCw3ICs1NCw3IEBACiBwdWJsaWM6CiAgICAgfk1lZGlhUGxheWVyMigpOwogCi0gICAgc3RhdGljIHNwPE1lZGlhUGxheWVyMj4gQ3JlYXRlKCk7CisgICAgc3RhdGljIHNwPE1lZGlhUGxheWVyMj4gQ3JlYXRlKGludDMyX3Qgc2Vzc2lvbklkLCBqb2JqZWN0IGNvbnRleHQpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBEdW1wQWxsKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICBkaXNjb25uZWN0KCk7CkBAIC02NSwxMCArNjksOSBAQAogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHByZXBhcmVBc3luYygpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHN0YXJ0KCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc3RvcCgpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHBhdXNlKCk7CiAgICAgICAgICAgICBib29sICAgICAgICAgICAgaXNQbGF5aW5nKCk7Ci0gICAgICAgICAgICBtZWRpYXBsYXllcjJfc3RhdGVzIGdldE1lZGlhUGxheWVyMlN0YXRlKCk7CisgICAgICAgICAgICBtZWRpYXBsYXllcjJfc3RhdGVzIGdldFN0YXRlKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSYgcmF0ZSk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSogcmF0ZSAvKiBub25udWxsICovKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRTeW5jU2V0dGluZ3MoY29uc3QgQVZTeW5jU2V0dGluZ3MmIHN5bmMsIGZsb2F0IHZpZGVvRnBzSGludCk7CkBAIC04Miw2MCArODUsNTMgQEAKICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIG5vdGlmeUF0KGludDY0X3QgbWVkaWFUaW1lVXMpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldEN1cnJlbnRQb3NpdGlvbihpbnQ2NF90ICptc2VjKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXREdXJhdGlvbihpbnQ2NF90ICptc2VjKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXREdXJhdGlvbihpbnQ2NF90IHNyY0lkLCBpbnQ2NF90ICptc2VjKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICByZXNldCgpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHR5cGUpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90ICp0eXBlKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRMb29waW5nKGludCBsb29wKTsKICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICBpc0xvb3BpbmcoKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRWb2x1bWUoZmxvYXQgbGVmdFZvbHVtZSwgZmxvYXQgcmlnaHRWb2x1bWUpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFZvbHVtZShmbG9hdCB2b2x1bWUpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgIG5vdGlmeShpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCAqb2JqID0gTlVMTCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgaW52b2tlKGNvbnN0IFBhcmNlbCYgcmVxdWVzdCwgUGFyY2VsICpyZXBseSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0TWV0YWRhdGFGaWx0ZXIoY29uc3QgUGFyY2VsJiBmaWx0ZXIpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldE1ldGFkYXRhKGJvb2wgdXBkYXRlX29ubHksIGJvb2wgYXBwbHlfZmlsdGVyLCBQYXJjZWwgKm1ldGFkYXRhKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRBdWRpb1Nlc3Npb25JZChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKTsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBnZXRBdWRpb1Nlc3Npb25JZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQbGF5ZXJNZXNzYWdlICpvYmogPSBOVUxMKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBpbnZva2UoY29uc3QgUGxheWVyTWVzc2FnZSAmcmVxdWVzdCwgUGxheWVyTWVzc2FnZSAqcmVwbHkpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldEF1ZGlvU2Vzc2lvbklkKGludDMyX3Qgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIGludDMyX3QgICAgICAgICBnZXRBdWRpb1Nlc3Npb25JZCgpOwogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCBsZXZlbCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgYXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCYgcmVxdWVzdCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0QXVkaW9BdHRyaWJ1dGVzKGNvbnN0IGpvYmplY3QgYXR0cmlidXRlcyk7CisgICAgICAgICAgICBqb2JqZWN0ICAgICAgICAgZ2V0QXVkaW9BdHRyaWJ1dGVzKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCogcmVwbHkpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldE1ldHJpY3MoY2hhciAqKmJ1ZmZlciwgc2l6ZV90ICpsZW5ndGgpOwogCiAgICAgICAgICAgICAvLyBNb2R1bGFyIERSTQotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHByZXBhcmVEcm0oY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBkcm1TZXNzaW9uSWQpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHJlbGVhc2VEcm0oKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBwcmVwYXJlRHJtKGludDY0X3Qgc3JjSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBkcm1TZXNzaW9uSWQpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHJlbGVhc2VEcm0oaW50NjRfdCBzcmNJZCk7CiAgICAgICAgICAgICAvLyBBdWRpb1JvdXRpbmcKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7Ci0gICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldFJvdXRlZERldmljZUlkKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFByZWZlcnJlZERldmljZShqb2JqZWN0IGRldmljZSk7CisgICAgICAgICAgICBqb2JqZWN0ICAgICAgICAgZ2V0Um91dGVkRGV2aWNlKCk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgYWRkQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IHJvdXRpbmdEZWxlZ2F0ZSk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IGxpc3RlbmVyKTsKIAogICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAogcHJpdmF0ZToKLSAgICBNZWRpYVBsYXllcjIoKTsKKyAgICBNZWRpYVBsYXllcjIoaW50MzJfdCBzZXNzaW9uSWQsIGpvYmplY3QgY29udGV4dCk7CiAgICAgYm9vbCBpbml0KCk7CiAKLSAgICAvLyBAcGFyYW0gdHlwZSBPZiB0aGUgbWV0YWRhdGEgdG8gYmUgdGVzdGVkLgotICAgIC8vIEByZXR1cm4gdHJ1ZSBpZiB0aGUgbWV0YWRhdGEgc2hvdWxkIGJlIGRyb3BwZWQgYWNjb3JkaW5nIHRvCi0gICAgLy8gICAgICAgICAgICAgIHRoZSBmaWx0ZXJzLgotICAgIGJvb2wgc2hvdWxkRHJvcE1ldGFkYXRhKG1lZGlhOjpNZXRhZGF0YTo6VHlwZSB0eXBlKSBjb25zdDsKLQotICAgIC8vIEFkZCBhIG5ldyBlbGVtZW50IHRvIHRoZSBzZXQgb2YgbWV0YWRhdGEgdXBkYXRlZC4gTm9vcCBpZgotICAgIC8vIHRoZSBlbGVtZW50IGV4aXN0cyBhbHJlYWR5LgotICAgIC8vIEBwYXJhbSB0eXBlIE9mIHRoZSBtZXRhZGF0YSB0byBiZSByZWNvcmRlZC4KLSAgICB2b2lkIGFkZE5ld01ldGFkYXRhVXBkYXRlKG1lZGlhOjpNZXRhZGF0YTo6VHlwZSB0eXBlKTsKLQogICAgIC8vIERpc2Nvbm5lY3QgZnJvbSB0aGUgY3VycmVudGx5IGNvbm5lY3RlZCBBTmF0aXZlV2luZG93LgogICAgIHZvaWQgZGlzY29ubmVjdE5hdGl2ZVdpbmRvd19sKCk7CiAKLSAgICBzdGF0dXNfdCBzZXRBdWRpb0F0dHJpYnV0ZXNfbChjb25zdCBQYXJjZWwgJnJlcXVlc3QpOworICAgIHN0YXR1c190IHNldEF1ZGlvQXR0cmlidXRlc19sKGNvbnN0IGpvYmplY3QgYXR0cmlidXRlcyk7CiAKICAgICB2b2lkIGNsZWFyX2woKTsKICAgICBzdGF0dXNfdCBzZWVrVG9fbChpbnQ2NF90IG1zZWMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUpOwogICAgIHN0YXR1c190IHByZXBhcmVBc3luY19sKCk7CiAgICAgc3RhdHVzX3QgZ2V0RHVyYXRpb25fbChpbnQ2NF90ICptc2VjKTsKICAgICBzdGF0dXNfdCByZXNldF9sKCk7Ci0gICAgc3RhdHVzX3QgY2hlY2tTdGF0ZUZvcktleVNldF9sKGludCBrZXkpOworICAgIHN0YXR1c190IGNoZWNrU3RhdGVfbCgpOwogCiAgICAgcGlkX3QgICAgICAgICAgICAgICAgICAgICAgIG1QaWQ7CiAgICAgdWlkX3QgICAgICAgICAgICAgICAgICAgICAgIG1VaWQ7CkBAIC0xNDcsMzIgKzE0MywyMSBAQAogICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICBtTm90aWZ5TG9jazsKICAgICBzcDxNZWRpYVBsYXllcjJMaXN0ZW5lcj4gICAgbUxpc3RlbmVyOwogICAgIG1lZGlhX3BsYXllcjJfaW50ZXJuYWxfc3RhdGVzIG1DdXJyZW50U3RhdGU7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFuc2l0aW9uVG9OZXh0OwogICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFBvc2l0aW9uOwogICAgIE1lZGlhUGxheWVyMlNlZWtNb2RlICAgICAgICBtQ3VycmVudFNlZWtNb2RlOwogICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgICBtU2Vla1Bvc2l0aW9uOwogICAgIE1lZGlhUGxheWVyMlNlZWtNb2RlICAgICAgICBtU2Vla01vZGU7CiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAgICAgICAgIG1TdHJlYW1UeXBlOwotICAgIFBhcmNlbCogICAgICAgICAgICAgICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsOwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtTG9vcDsKLSAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgbUxlZnRWb2x1bWU7Ci0gICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgIG1SaWdodFZvbHVtZTsKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgbVZvbHVtZTsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvV2lkdGg7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0hlaWdodDsKLSAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICAgICAgbUF1ZGlvU2Vzc2lvbklkOwotICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAqICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBtQXVkaW9TZXNzaW9uSWQ7CisgICAgc3A8Sk9iamVjdEhvbGRlcj4gICAgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXM7CisgICAgc3A8Sk9iamVjdEhvbGRlcj4gICAgICAgICAgIG1Db250ZXh0OwogICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICBtU2VuZExldmVsOwotCiAgICAgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+ICAgIG1Db25uZWN0ZWRXaW5kb3c7Ci0KLSAgICAvLyBNZXRhZGF0YSBmaWx0ZXJzLgotICAgIG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyIG1NZXRhZGF0YUFsbG93OyAgLy8gcHJvdGVjdGVkIGJ5IG1Mb2NrCi0gICAgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXIgbU1ldGFkYXRhRHJvcDsgIC8vIHByb3RlY3RlZCBieSBtTG9jawotCi0gICAgLy8gTWV0YWRhdGEgdXBkYXRlZC4gRm9yIGVhY2ggTUVESUFfSU5GT19NRVRBREFUQV9VUERBVEUKLSAgICAvLyBub3RpZmljYXRpb24gd2UgdHJ5IHRvIHVwZGF0ZSBtTWV0YWRhdGFVcGRhdGVkIHdoaWNoIGlzIGEKLSAgICAvLyBzZXQ6IG5vIGR1cGxpY2F0ZS4KLSAgICAvLyBnZXRNZXRhZGF0YSBjbGVhcnMgdGhpcyBzZXQuCi0gICAgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXIgbU1ldGFkYXRhVXBkYXRlZDsgIC8vIHByb3RlY3RlZCBieSBtTG9jawogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9tZWRpYXBsYXllcjIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5jcHAKaW5kZXggZTU1NjdkYy4uZGU2NWY4ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5jcHAKQEAgLTE4LDE0ICsxOCwxMCBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJNZWRpYVBsYXllcjJOYXRpdmUiCiAKLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0KKyNpbmNsdWRlIDxhbmRyb2lkL2JpbmRlcl9pYmluZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlRGVzYy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgogI2luY2x1ZGUgPG1lZGlhL01lbW9yeUxlYWtUcmFja1V0aWwuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZXRhZGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL05ka1dyYXBwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5oPgpAQCAtNTMsMTY5ICs0OSw2IEBACiBjb25zdCBpbnQga0R1bXBMb2NrUmV0cmllcyA9IDUwOwogY29uc3QgaW50IGtEdW1wTG9ja1NsZWVwVXMgPSAyMDAwMDsKIAotLy8gTWF4IG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBmaWx0ZXIuCi1jb25zdCBpbnQga01heEZpbHRlclNpemUgPSA2NDsgIC8vIEkgcHVsbGVkIHRoYXQgb3V0IG9mIHRoaW4gYWlyLgotCi0vLyBGSVhNRTogTW92ZSBhbGwgdGhlIG1ldGFkYXRhIHJlbGF0ZWQgZnVuY3Rpb24gaW4gdGhlIE1ldGFkYXRhLmNwcAotCi0vLyBVbm1hcnNoYWxsIGEgZmlsdGVyIGZyb20gYSBQYXJjZWwuCi0vLyBGaWx0ZXIgZm9ybWF0IGluIGEgcGFyY2VsOgotLy8KLS8vICAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyB8ICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgb2YgZW50cmllcyAobikgICAgICAgICAgICAgICAgICAgfAotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhIHR5cGUgMSAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gfCAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGEgdHlwZSAyICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyAgLi4uLgotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhIHR5cGUgbiAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8KLS8vIEBwYXJhbSBwIFBhcmNlbCB0aGF0IHNob3VsZCBzdGFydCB3aXRoIGEgZmlsdGVyLgotLy8gQHBhcmFtW291dF0gZmlsdGVyIE9uIGV4aXQgY29udGFpbnMgdGhlIGxpc3Qgb2YgbWV0YWRhdGEgdHlwZSB0byBiZQotLy8gICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkLgotLy8gQHBhcmFtW291dF0gc3RhdHVzIE9uIGV4aXQgY29udGFpbnMgdGhlIHN0YXR1cyBjb2RlIHRvIGJlIHJldHVybmVkLgotLy8gQHJldHVybiB0cnVlIGlmIHRoZSBwYXJjZWwgc3RhcnRzIHdpdGggYSB2YWxpZCBmaWx0ZXIuCi1ib29sIHVubWFyc2hhbGxGaWx0ZXIoY29uc3QgUGFyY2VsJiBwLAotICAgICAgICAgICAgICAgICAgICAgIG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyICpmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cykgewotICAgIGludDMyX3QgdmFsOwotICAgIGlmIChwLnJlYWRJbnQzMigmdmFsKSAhPSBPSykgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlYWQgZmlsdGVyJ3MgbGVuZ3RoIik7Ci0gICAgICAgICpzdGF0dXMgPSBOT1RfRU5PVUdIX0RBVEE7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAodmFsID4ga01heEZpbHRlclNpemUgfHwgdmFsIDwgMCkgewotICAgICAgICBBTE9HRSgiSW52YWxpZCBmaWx0ZXIgbGVuICVkIiwgdmFsKTsKLSAgICAgICAgKnN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGNvbnN0IHNpemVfdCBudW0gPSB2YWw7Ci0KLSAgICBmaWx0ZXItPmNsZWFyKCk7Ci0gICAgZmlsdGVyLT5zZXRDYXBhY2l0eShudW0pOwotCi0gICAgc2l6ZV90IHNpemUgPSBudW0gKiBzaXplb2YobWVkaWE6Ok1ldGFkYXRhOjpUeXBlKTsKLQotCi0gICAgaWYgKHAuZGF0YUF2YWlsKCkgPCBzaXplKSB7Ci0gICAgICAgIEFMT0dFKCJGaWx0ZXIgdG9vIHNob3J0IGV4cGVjdGVkICV6dSBidXQgZ290ICV6dSIsIHNpemUsIHAuZGF0YUF2YWlsKCkpOwotICAgICAgICAqc3RhdHVzID0gTk9UX0VOT1VHSF9EQVRBOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpUeXBlICpkYXRhID0KLSAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpUeXBlKj4ocC5yZWFkSW5wbGFjZShzaXplKSk7Ci0KLSAgICBpZiAoTlVMTCA9PSBkYXRhKSB7Ci0gICAgICAgIEFMT0dFKCJGaWx0ZXIgaGFkIG5vIGRhdGEiKTsKLSAgICAgICAgKnN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8vIFRPRE86IFRoZSBzdGwgaW1wbCBvZiB2ZWN0b3Igd291bGQgYmUgbW9yZSBlZmZpY2llbnQgaGVyZQotICAgIC8vIGJlY2F1c2UgaXQgZGVnZW5lcmF0ZXMgaW50byBhIG1lbWNweSBvbiBwb2QgdHlwZXMuIFRyeSB0bwotICAgIC8vIHJlcGxhY2UgbGF0ZXIgb3IgdXNlIHN0bDo6c2V0LgotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtOyArK2kpIHsKLSAgICAgICAgZmlsdGVyLT5hZGQoKmRhdGEpOwotICAgICAgICArK2RhdGE7Ci0gICAgfQotICAgICpzdGF0dXMgPSBPSzsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gQHBhcmFtIGZpbHRlciBPZiBtZXRhZGF0YSB0eXBlLgotLy8gQHBhcmFtIHZhbCBUbyBiZSBzZWFyY2hlZC4KLS8vIEByZXR1cm4gdHJ1ZSBpZiBhIG1hdGNoIHdhcyBmb3VuZC4KLWJvb2wgZmluZE1ldGFkYXRhKGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiBmaWx0ZXIsIGNvbnN0IGludDMyX3QgdmFsKSB7Ci0gICAgLy8gRGVhbCB3aXRoIGVtcHR5IGFuZCBBTlkgcmlnaHQgYXdheQotICAgIGlmIChmaWx0ZXIuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKGZpbHRlclswXSA9PSBtZWRpYTo6TWV0YWRhdGE6OmtBbnkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZpbHRlci5pbmRleE9mKHZhbCkgPj0gMDsKLX0KLQotLy8gbWFyc2hhbGxpbmcgdGFnIGluZGljYXRpbmcgZmxhdHRlbmVkIHV0ZjE2IHRhZ3MKLS8vIGtlZXAgaW4gc3luYyB3aXRoIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmphdmEKLWNvbnN0IGludDMyX3Qga0F1ZGlvQXR0cmlidXRlc01hcnNoYWxsVGFnRmxhdHRlblRhZ3MgPSAxOwotCi0vLyBBdWRpbyBhdHRyaWJ1dGVzIGZvcm1hdCBpbiBhIHBhcmNlbDoKLS8vCi0vLyAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCi0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gfCAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyB8ICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X3R5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gfCAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyB8ICAgICAgICAgICAgICAgICAgICAgICBrQXVkaW9BdHRyaWJ1dGVzTWFyc2hhbGxUYWdGbGF0dGVuVGFncyAgfCAvLyBpZ25vcmUgdGFncyBpZiBub3QgZm91bmQKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyB8ICAgICAgICAgICAgICAgICAgICAgICBmbGF0dGVuZWQgdGFncyBpbiBVVEYxNiAgICAgICAgICAgICAgICAgfAotLy8gfCAgICAgICAgICAgICAgICAgICAgICAgICAuLi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLwotLy8gQHBhcmFtIHAgUGFyY2VsIHRoYXQgY29udGFpbnMgYXVkaW8gYXR0cmlidXRlcy4KLS8vIEBwYXJhbVtvdXRdIGF0dHJpYnV0ZXMgT24gZXhpdCBwb2ludHMgdG8gYW4gaW5pdGlhbGl6ZWQgYXVkaW9fYXR0cmlidXRlc190IHN0cnVjdHVyZQotLy8gQHBhcmFtW291dF0gc3RhdHVzIE9uIGV4aXQgY29udGFpbnMgdGhlIHN0YXR1cyBjb2RlIHRvIGJlIHJldHVybmVkLgotdm9pZCB1bm1hcnNoYWxsQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IFBhcmNlbCYgcGFyY2VsLCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMpIHsKLSAgICBhdHRyaWJ1dGVzLT51c2FnZSA9IChhdWRpb191c2FnZV90KSBwYXJjZWwucmVhZEludDMyKCk7Ci0gICAgYXR0cmlidXRlcy0+Y29udGVudF90eXBlID0gKGF1ZGlvX2NvbnRlbnRfdHlwZV90KSBwYXJjZWwucmVhZEludDMyKCk7Ci0gICAgYXR0cmlidXRlcy0+c291cmNlID0gKGF1ZGlvX3NvdXJjZV90KSBwYXJjZWwucmVhZEludDMyKCk7Ci0gICAgYXR0cmlidXRlcy0+ZmxhZ3MgPSAoYXVkaW9fZmxhZ3NfbWFza190KSBwYXJjZWwucmVhZEludDMyKCk7Ci0gICAgY29uc3QgYm9vbCBoYXNGbGF0dGVuZWRUYWcgPSAocGFyY2VsLnJlYWRJbnQzMigpID09IGtBdWRpb0F0dHJpYnV0ZXNNYXJzaGFsbFRhZ0ZsYXR0ZW5UYWdzKTsKLSAgICBpZiAoaGFzRmxhdHRlbmVkVGFnKSB7Ci0gICAgICAgIC8vIHRoZSB0YWdzIGFyZSBVVEYxNiwgY29udmVydCB0byBVVEY4Ci0gICAgICAgIFN0cmluZzE2IHRhZ3MgPSBwYXJjZWwucmVhZFN0cmluZzE2KCk7Ci0gICAgICAgIHNzaXplX3QgcmVhbFRhZ1NpemUgPSB1dGYxNl90b191dGY4X2xlbmd0aCh0YWdzLnN0cmluZygpLCB0YWdzLnNpemUoKSk7Ci0gICAgICAgIGlmIChyZWFsVGFnU2l6ZSA8PSAwKSB7Ci0gICAgICAgICAgICBzdHJjcHkoYXR0cmlidXRlcy0+dGFncywgIiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gY29weSB0aGUgZmxhdHRlbmVkIHN0cmluZyBpbnRvIHRoZSBhdHRyaWJ1dGVzIGFzIHRoZSBkZXN0aW5hdGlvbiBmb3IgdGhlIGNvbnZlcnNpb246Ci0gICAgICAgICAgICAvLyBjb3B5aW5nIGFycmF5IHNpemUgLTEsIGFycmF5IGZvciB0YWdzIHdhcyBjYWxsb2MnZCwgbm8gbmVlZCB0byBOVUxMLXRlcm1pbmF0ZSBpdAotICAgICAgICAgICAgc2l6ZV90IHRhZ1NpemUgPSByZWFsVGFnU2l6ZSA+IEFVRElPX0FUVFJJQlVURVNfVEFHU19NQVhfU0laRSAtIDEgPwotICAgICAgICAgICAgICAgICAgICBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSAxIDogcmVhbFRhZ1NpemU7Ci0gICAgICAgICAgICB1dGYxNl90b191dGY4KHRhZ3Muc3RyaW5nKCksIHRhZ1NpemUsIGF0dHJpYnV0ZXMtPnRhZ3MsCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihhdHRyaWJ1dGVzLT50YWdzKSAvIHNpemVvZihhdHRyaWJ1dGVzLT50YWdzWzBdKSk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgidW5tYXJzaGFsbEF1ZGlvQXR0cmlidXRlcygpIHJlY2VpdmVkIHVuZmxhdHRlbmVkIHRhZ3MsIGlnbm9yaW5nIHRhZyB2YWx1ZXMiKTsKLSAgICAgICAgc3RyY3B5KGF0dHJpYnV0ZXMtPnRhZ3MsICIiKTsKLSAgICB9Ci19Ci0KLWNsYXNzIEF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyOiBwdWJsaWMgQXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2sgewotcHVibGljOgotICAgIEF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyKGNvbnN0IHNwPE1lZGlhUGxheWVyMkludGVyZmFjZT4mIGxpc3RlbmVyKQotICAgICAgICA6IG1MaXN0ZW5lcihsaXN0ZW5lcikgeyB9Ci0KLSAgICB+QXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXIoKSB7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvRGV2aWNlVXBkYXRlKGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgb3ZlcnJpZGUgewotICAgICAgICBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U+IGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKLSAgICAgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGxpc3RlbmVyLT5zZW5kRXZlbnQoMCwgTUVESUEyX0FVRElPX1JPVVRJTkdfQ0hBTkdFRCwgYXVkaW9JbywgZGV2aWNlSWQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1coImxpc3RlbmVyIGZvciBwcm9jZXNzICVkIGRlYXRoIGlzIGdvbmUiLCBNRURJQTJfQVVESU9fUk9VVElOR19DSEFOR0VEKTsKLSAgICAgICAgfQotICAgIH0KLQotcHJpdmF0ZToKLSAgICB3cDxNZWRpYVBsYXllcjJJbnRlcmZhY2U+IG1MaXN0ZW5lcjsKLX07Ci0KIGNsYXNzIHByb3h5TGlzdGVuZXIgOiBwdWJsaWMgTWVkaWFQbGF5ZXIySW50ZXJmYWNlTGlzdGVuZXIgewogcHVibGljOgogICAgIHByb3h5TGlzdGVuZXIoY29uc3Qgd3A8TWVkaWFQbGF5ZXIyPiAmcGxheWVyKQpAQCAtMjIzLDcgKzU2LDggQEAKIAogICAgIH5wcm94eUxpc3RlbmVyKCkgeyB9OwogCi0gICAgdmlydHVhbCB2b2lkIG5vdGlmeShpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqKSBvdmVycmlkZSB7CisgICAgdmlydHVhbCB2b2lkIG5vdGlmeShpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsCisgICAgICAgICAgICBjb25zdCBQbGF5ZXJNZXNzYWdlICpvYmopIG92ZXJyaWRlIHsKICAgICAgICAgc3A8TWVkaWFQbGF5ZXIyPiBwbGF5ZXIgPSBtUGxheWVyLnByb21vdGUoKTsKICAgICAgICAgaWYgKHBsYXllciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBwbGF5ZXItPm5vdGlmeShzcmNJZCwgbXNnLCBleHQxLCBleHQyLCBvYmopOwpAQCAtMjY1LDExNCArOTksMTEwIEBACiAgICAgU3RyaW5nOCByZXN1bHQ7CiAgICAgU29ydGVkVmVjdG9yPCBzcDxNZWRpYVBsYXllcjI+ID4gcGxheWVyczsgLy90byBzZXJpYWxpc2UgdGhlIG11dGV4IHVubG9jayAmIGNsaWVudCBkZXN0cnVjdGlvbi4KIAotICAgIGlmIChjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpKSA9PSBmYWxzZSkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJQZXJtaXNzaW9uIERlbmlhbDogY2FuJ3QgZHVtcCBNZWRpYVBsYXllcjJcbiIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhzUmVjb3JkTG9jayk7CisgICAgICAgIGVuc3VyZUluaXRfbCgpOworICAgICAgICBmb3IgKGludCBpID0gMCwgbiA9IHNQbGF5ZXJzLT5zaXplKCk7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgICAgIHNwPE1lZGlhUGxheWVyMj4gcCA9ICgqc1BsYXllcnMpW2ldLnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChwICE9IDApIHsKKyAgICAgICAgICAgICAgICBwLT5kdW1wKGZkLCBhcmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBsYXllcnMuYWRkKHApOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzdWx0LmFwcGVuZCgiIEZpbGVzIG9wZW5lZCBhbmQvb3IgbWFwcGVkOlxuIik7CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvbWFwcyIsIGdldHBpZCgpKTsKKyAgICBGSUxFICpmID0gZm9wZW4oYnVmZmVyLCAiciIpOworICAgIGlmIChmKSB7CisgICAgICAgIHdoaWxlICghZmVvZihmKSkgeworICAgICAgICAgICAgZmdldHMoYnVmZmVyLCBTSVpFLCBmKTsKKyAgICAgICAgICAgIGlmIChzdHJzdHIoYnVmZmVyLCAiIC9zdG9yYWdlLyIpIHx8CisgICAgICAgICAgICAgICAgc3Ryc3RyKGJ1ZmZlciwgIiAvc3lzdGVtL3NvdW5kcy8iKSB8fAorICAgICAgICAgICAgICAgIHN0cnN0cihidWZmZXIsICIgL2RhdGEvIikgfHwKKyAgICAgICAgICAgICAgICBzdHJzdHIoYnVmZmVyLCAiIC9zeXN0ZW0vbWVkaWEvIikpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgICIpOworICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmY2xvc2UoZik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soc1JlY29yZExvY2spOwotICAgICAgICAgICAgZW5zdXJlSW5pdF9sKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMCwgbiA9IHNQbGF5ZXJzLT5zaXplKCk7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgICAgICAgICBzcDxNZWRpYVBsYXllcjI+IHAgPSAoKnNQbGF5ZXJzKVtpXS5wcm9tb3RlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHAgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBwLT5kdW1wKGZkLCBhcmdzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGxheWVycy5hZGQocCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiY291bGRuJ3Qgb3BlbiAiKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgIH0KIAotICAgICAgICByZXN1bHQuYXBwZW5kKCIgRmlsZXMgb3BlbmVkIGFuZC9vciBtYXBwZWQ6XG4iKTsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvbWFwcyIsIGdldHBpZCgpKTsKLSAgICAgICAgRklMRSAqZiA9IGZvcGVuKGJ1ZmZlciwgInIiKTsKLSAgICAgICAgaWYgKGYpIHsKLSAgICAgICAgICAgIHdoaWxlICghZmVvZihmKSkgewotICAgICAgICAgICAgICAgIGZnZXRzKGJ1ZmZlciwgU0laRSwgZik7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cnN0cihidWZmZXIsICIgL3N0b3JhZ2UvIikgfHwKLSAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGJ1ZmZlciwgIiAvc3lzdGVtL3NvdW5kcy8iKSB8fAotICAgICAgICAgICAgICAgICAgICBzdHJzdHIoYnVmZmVyLCAiIC9kYXRhLyIpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHN0cnN0cihidWZmZXIsICIgL3N5c3RlbS9tZWRpYS8iKSkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgICIpOwotICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmNsb3NlKGYpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiY291bGRuJ3Qgb3BlbiAiKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9mZCIsIGdldHBpZCgpKTsKLSAgICAgICAgRElSICpkID0gb3BlbmRpcihidWZmZXIpOwotICAgICAgICBpZiAoZCkgewotICAgICAgICAgICAgc3RydWN0IGRpcmVudCAqZW50OwotICAgICAgICAgICAgd2hpbGUoKGVudCA9IHJlYWRkaXIoZCkpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RyY21wKGVudC0+ZF9uYW1lLCIuIikgJiYgc3RyY21wKGVudC0+ZF9uYW1lLCIuLiIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi9wcm9jLyVkL2ZkLyVzIiwgZ2V0cGlkKCksIGVudC0+ZF9uYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgc3RydWN0IHN0YXQgczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxzdGF0KGJ1ZmZlciwgJnMpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgocy5zdF9tb2RlICYgU19JRk1UKSA9PSBTX0lGTE5LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBsaW5rdG9bMjU2XTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGVuID0gcmVhZGxpbmsoYnVmZmVyLCBsaW5rdG8sIHNpemVvZihsaW5rdG8pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsZW4gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxlbiA+IDI1NSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3RvWzI1Ml0gPSAnLic7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rdG9bMjUzXSA9ICcuJzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0b1syNTRdID0gJy4nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3RvWzI1NV0gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3RvW2xlbl0gPSAwOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJzdHIobGlua3RvLCAiL3N0b3JhZ2UvIikgPT0gbGlua3RvIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIobGlua3RvLCAiL3N5c3RlbS9zb3VuZHMvIikgPT0gbGlua3RvIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIobGlua3RvLCAiL2RhdGEvIikgPT0gbGlua3RvIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIobGlua3RvLCAiL3N5c3RlbS9tZWRpYS8iKSA9PSBsaW5rdG8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgLT4gIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGxpbmt0byk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvZmQiLCBnZXRwaWQoKSk7CisgICAgRElSICpkID0gb3BlbmRpcihidWZmZXIpOworICAgIGlmIChkKSB7CisgICAgICAgIHN0cnVjdCBkaXJlbnQgKmVudDsKKyAgICAgICAgd2hpbGUoKGVudCA9IHJlYWRkaXIoZCkpICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChzdHJjbXAoZW50LT5kX25hbWUsIi4iKSAmJiBzdHJjbXAoZW50LT5kX25hbWUsIi4uIikpIHsKKyAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9mZC8lcyIsIGdldHBpZCgpLCBlbnQtPmRfbmFtZSk7CisgICAgICAgICAgICAgICAgc3RydWN0IHN0YXQgczsKKyAgICAgICAgICAgICAgICBpZiAobHN0YXQoYnVmZmVyLCAmcykgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKHMuc3RfbW9kZSAmIFNfSUZNVCkgPT0gU19JRkxOSykgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBsaW5rdG9bMjU2XTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4gPSByZWFkbGluayhidWZmZXIsIGxpbmt0bywgc2l6ZW9mKGxpbmt0bykpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYobGVuID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxlbiA+IDI1NSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rdG9bMjUyXSA9ICcuJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3RvWzI1M10gPSAnLic7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0b1syNTRdID0gJy4nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rdG9bMjU1XSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3RvW2xlbl0gPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICB1bmV4cGVjdGVkIHR5cGUgZm9yICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJzdHIobGlua3RvLCAiL3N0b3JhZ2UvIikgPT0gbGlua3RvIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihsaW5rdG8sICIvc3lzdGVtL3NvdW5kcy8iKSA9PSBsaW5rdG8gfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGxpbmt0bywgIi9kYXRhLyIpID09IGxpbmt0byB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIobGlua3RvLCAiL3N5c3RlbS9tZWRpYS8iKSA9PSBsaW5rdG8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgLT4gIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobGlua3RvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgIHVuZXhwZWN0ZWQgdHlwZSBmb3IgIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xvc2VkaXIoZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJjb3VsZG4ndCBvcGVuICIpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKICAgICAgICAgfQorICAgICAgICBjbG9zZWRpcihkKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQuYXBwZW5kKCJjb3VsZG4ndCBvcGVuICIpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgfQogCi0gICAgICAgIGdMb29wZXJSb3N0ZXIuZHVtcChmZCwgYXJncyk7CisgICAgZ0xvb3BlclJvc3Rlci5kdW1wKGZkLCBhcmdzKTsKIAotICAgICAgICBib29sIGR1bXBNZW0gPSBmYWxzZTsKLSAgICAgICAgYm9vbCB1bnJlYWNoYWJsZU1lbW9yeSA9IGZhbHNlOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFyZ3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChhcmdzW2ldID09IFN0cmluZzE2KCItbSIpKSB7Ci0gICAgICAgICAgICAgICAgZHVtcE1lbSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0gPT0gU3RyaW5nMTYoIi0tdW5yZWFjaGFibGUiKSkgewotICAgICAgICAgICAgICAgIHVucmVhY2hhYmxlTWVtb3J5ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZHVtcE1lbSkgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG5EdW1waW5nIG1lbW9yeTpcbiIpOwotICAgICAgICAgICAgc3RkOjpzdHJpbmcgcyA9IGR1bXBNZW1vcnlBZGRyZXNzZXMoMTAwIC8qIGxpbWl0ICovKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQocy5jX3N0cigpLCBzLnNpemUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVucmVhY2hhYmxlTWVtb3J5KSB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbkR1bXBpbmcgdW5yZWFjaGFibGUgbWVtb3J5OlxuIik7Ci0gICAgICAgICAgICAvLyBUT0RPIC0gc2hvdWxkIGxpbWl0IGJlIGFuIGFyZ3VtZW50IHBhcmFtZXRlcj8KLSAgICAgICAgICAgIC8vIFRPRE86IGVuYWJsZSBHZXRVbnJlYWNoYWJsZU1lbW9yeVN0cmluZyBpZiBpdCdzIHBhcnQgb2Ygc3RhYmxlIEFQSQotICAgICAgICAgICAgLy9zdGQ6OnN0cmluZyBzID0gR2V0VW5yZWFjaGFibGVNZW1vcnlTdHJpbmcodHJ1ZSAvKiBjb250ZW50cyAqLywgMTAwMDAgLyogbGltaXQgKi8pOwotICAgICAgICAgICAgLy9yZXN1bHQuYXBwZW5kKHMuY19zdHIoKSwgcy5zaXplKCkpOworICAgIGJvb2wgZHVtcE1lbSA9IGZhbHNlOworICAgIGJvb2wgdW5yZWFjaGFibGVNZW1vcnkgPSBmYWxzZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFyZ3Muc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGFyZ3NbaV0gPT0gU3RyaW5nMTYoIi1tIikpIHsKKyAgICAgICAgICAgIGR1bXBNZW0gPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGFyZ3NbaV0gPT0gU3RyaW5nMTYoIi0tdW5yZWFjaGFibGUiKSkgeworICAgICAgICAgICAgdW5yZWFjaGFibGVNZW1vcnkgPSB0cnVlOwogICAgICAgICB9CiAgICAgfQorICAgIGlmIChkdW1wTWVtKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuRHVtcGluZyBtZW1vcnk6XG4iKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgcyA9IGR1bXBNZW1vcnlBZGRyZXNzZXMoMTAwIC8qIGxpbWl0ICovKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZChzLmNfc3RyKCksIHMuc2l6ZSgpKTsKKyAgICB9CisgICAgaWYgKHVucmVhY2hhYmxlTWVtb3J5KSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuRHVtcGluZyB1bnJlYWNoYWJsZSBtZW1vcnk6XG4iKTsKKyAgICAgICAgLy8gVE9ETyAtIHNob3VsZCBsaW1pdCBiZSBhbiBhcmd1bWVudCBwYXJhbWV0ZXI/CisgICAgICAgIC8vIFRPRE86IGVuYWJsZSBHZXRVbnJlYWNoYWJsZU1lbW9yeVN0cmluZyBpZiBpdCdzIHBhcnQgb2Ygc3RhYmxlIEFQSQorICAgICAgICAvL3N0ZDo6c3RyaW5nIHMgPSBHZXRVbnJlYWNoYWJsZU1lbW9yeVN0cmluZyh0cnVlIC8qIGNvbnRlbnRzICovLCAxMDAwMCAvKiBsaW1pdCAqLyk7CisgICAgICAgIC8vcmVzdWx0LmFwcGVuZChzLmNfc3RyKCksIHMuc2l6ZSgpKTsKKyAgICB9CisKICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC0zODAsOCArMjEwLDggQEAKIH0gIC8vIGFub255bW91cyBuYW1lc3BhY2UKIAogLy9zdGF0aWMKLXNwPE1lZGlhUGxheWVyMj4gTWVkaWFQbGF5ZXIyOjpDcmVhdGUoKSB7Ci0gICAgc3A8TWVkaWFQbGF5ZXIyPiBwbGF5ZXIgPSBuZXcgTWVkaWFQbGF5ZXIyKCk7CitzcDxNZWRpYVBsYXllcjI+IE1lZGlhUGxheWVyMjo6Q3JlYXRlKGludDMyX3Qgc2Vzc2lvbklkLCBqb2JqZWN0IGNvbnRleHQpIHsKKyAgICBzcDxNZWRpYVBsYXllcjI+IHBsYXllciA9IG5ldyBNZWRpYVBsYXllcjIoc2Vzc2lvbklkLCBjb250ZXh0KTsKIAogICAgIGlmICghcGxheWVyLT5pbml0KCkpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0zOTgsNDQgKzIyOCwzNSBAQAogICAgIHJldHVybiBkdW1wUGxheWVycyhmZCwgYXJncyk7CiB9CiAKLU1lZGlhUGxheWVyMjo6TWVkaWFQbGF5ZXIyKCkgeworTWVkaWFQbGF5ZXIyOjpNZWRpYVBsYXllcjIoaW50MzJfdCBzZXNzaW9uSWQsIGpvYmplY3QgY29udGV4dCkgewogICAgIEFMT0dWKCJjb25zdHJ1Y3RvciIpOwogICAgIG1TcmNJZCA9IDA7CiAgICAgbUxvY2tUaHJlYWRJZCA9IDA7CiAgICAgbUxpc3RlbmVyID0gTlVMTDsKICAgICBtU3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9NVVNJQzsKLSAgICBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsID0gTlVMTDsKKyAgICBtQXVkaW9BdHRyaWJ1dGVzID0gTlVMTDsKKyAgICBtQ29udGV4dCA9IG5ldyBKT2JqZWN0SG9sZGVyKGNvbnRleHQpOwogICAgIG1DdXJyZW50UG9zaXRpb24gPSAtMTsKICAgICBtQ3VycmVudFNlZWtNb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQzsKICAgICBtU2Vla1Bvc2l0aW9uID0gLTE7CiAgICAgbVNlZWtNb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQzsKICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9JRExFOworICAgIG1UcmFuc2l0aW9uVG9OZXh0ID0gZmFsc2U7CiAgICAgbUxvb3AgPSBmYWxzZTsKLSAgICBtTGVmdFZvbHVtZSA9IG1SaWdodFZvbHVtZSA9IDEuMDsKKyAgICBtVm9sdW1lID0gMS4wOwogICAgIG1WaWRlb1dpZHRoID0gbVZpZGVvSGVpZ2h0ID0gMDsKLSAgICBtQXVkaW9TZXNzaW9uSWQgPSAoYXVkaW9fc2Vzc2lvbl90KSBBdWRpb1N5c3RlbTo6bmV3QXVkaW9VbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX1NFU1NJT04pOwotICAgIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQobUF1ZGlvU2Vzc2lvbklkLCAtMSk7CiAgICAgbVNlbmRMZXZlbCA9IDA7CiAKLSAgICAvLyBUT0RPOiBnZXQgcGlkIGFuZCB1aWQgZnJvbSBKQVZBCi0gICAgbVBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLSAgICBtVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgIG1QaWQgPSBBSUJpbmRlcl9nZXRDYWxsaW5nUGlkKCk7CisgICAgbVVpZCA9IEFJQmluZGVyX2dldENhbGxpbmdVaWQoKTsKIAotICAgIG1BdWRpb0F0dHJpYnV0ZXMgPSBOVUxMOworICAgIG1BdWRpb091dHB1dCA9IG5ldyBNZWRpYVBsYXllcjJBdWRpb091dHB1dChzZXNzaW9uSWQsIG1VaWQsIG1QaWQsIE5VTEwgLyphdHRyaWJ1dGVzKi8pOwogfQogCiBNZWRpYVBsYXllcjI6On5NZWRpYVBsYXllcjIoKSB7CiAgICAgQUxPR1YoImRlc3RydWN0b3IiKTsKLSAgICBpZiAobUF1ZGlvQXR0cmlidXRlc1BhcmNlbCAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsOwotICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsID0gTlVMTDsKLSAgICB9Ci0gICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtQXVkaW9TZXNzaW9uSWQsIC0xKTsKICAgICBkaXNjb25uZWN0KCk7CiAgICAgcmVtb3ZlUGxheWVyKHRoaXMpOwotICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzICE9IE5VTEwpIHsKLSAgICAgICAgZnJlZShtQXVkaW9BdHRyaWJ1dGVzKTsKLSAgICB9CiB9CiAKIGJvb2wgTWVkaWFQbGF5ZXIyOjppbml0KCkgewpAQCAtNDkzLDE5ICszMTQsMjggQEAKICAgICBpZiAoZHNkID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CisgICAgLy8gTWljcm9zZWNvbmQgaXMgdXNlZCBpbiBOdVBsYXllcjIuCisgICAgaWYgKGRzZC0+bVN0YXJ0UG9zaXRpb25NcyA+IERhdGFTb3VyY2VEZXNjOjprTWF4VGltZU1zKSB7CisgICAgICAgIGRzZC0+bVN0YXJ0UG9zaXRpb25NcyA9IERhdGFTb3VyY2VEZXNjOjprTWF4VGltZU1zOworICAgICAgICBBTE9HVygic2V0RGF0YVNvdXJjZSwgc3RhcnQgcG9pc3Rpb24gY2xhbXBlZCB0byAlbGxkIG1zIiwgKGxvbmcgbG9uZylkc2QtPm1TdGFydFBvc2l0aW9uTXMpOworICAgIH0KKyAgICBpZiAoZHNkLT5tRW5kUG9zaXRpb25NcyA+IERhdGFTb3VyY2VEZXNjOjprTWF4VGltZU1zKSB7CisgICAgICAgIGRzZC0+bUVuZFBvc2l0aW9uTXMgPSBEYXRhU291cmNlRGVzYzo6a01heFRpbWVNczsKKyAgICAgICAgQUxPR1coInNldERhdGFTb3VyY2UsIGVuZCBwb2lzdGlvbiBjbGFtcGVkIHRvICVsbGQgbXMiLCAobG9uZyBsb25nKWRzZC0+bVN0YXJ0UG9zaXRpb25Ncyk7CisgICAgfQogICAgIEFMT0dWKCJzZXREYXRhU291cmNlIHR5cGUoJWQpLCBzcmNJZCglbGxkKSIsIGRzZC0+bVR5cGUsIChsb25nIGxvbmcpZHNkLT5tSWQpOwogCiAgICAgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlPiBvbGRQbGF5ZXI7CiAKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAgICAgaWYgKCEoKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX0lETEUpCiAgICAgICAgICAgICAgIHx8IG1DdXJyZW50U3RhdGUgPT0gTUVESUFfUExBWUVSMl9TVEFURV9FUlJPUikpIHsKICAgICAgICAgICAgIEFMT0dFKCJzZXREYXRhU291cmNlIGNhbGxlZCBpbiB3cm9uZyBzdGF0ZSAlZCIsIG1DdXJyZW50U3RhdGUpOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9CiAKLSAgICAgICAgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlPiBwbGF5ZXIgPSBuZXcgTnVQbGF5ZXIyRHJpdmVyKG1QaWQsIG1VaWQpOworICAgICAgICBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U+IHBsYXllciA9IG5ldyBOdVBsYXllcjJEcml2ZXIobVBpZCwgbVVpZCwgbUNvbnRleHQpOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBwbGF5ZXItPmluaXRDaGVjaygpOwogICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBwbGF5ZXIgb2JqZWN0LCBpbml0Q2hlY2sgZmFpbGVkKCVkKSIsIGVycik7CkBAIC01MTUsOCArMzQ1LDYgQEAKICAgICAgICAgY2xlYXJfbCgpOwogCiAgICAgICAgIHBsYXllci0+c2V0TGlzdGVuZXIobmV3IHByb3h5TGlzdGVuZXIodGhpcykpOwotICAgICAgICBtQXVkaW9PdXRwdXQgPSBuZXcgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQobUF1ZGlvU2Vzc2lvbklkLCBtVWlkLAotICAgICAgICAgICAgICAgIG1QaWQsIG1BdWRpb0F0dHJpYnV0ZXMsIG5ldyBBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcihwbGF5ZXIpKTsKICAgICAgICAgcGxheWVyLT5zZXRBdWRpb1NpbmsobUF1ZGlvT3V0cHV0KTsKIAogICAgICAgICBlcnIgPSBwbGF5ZXItPnNldERhdGFTb3VyY2UoZHNkKTsKQEAgLTU2Miw4MiArMzkwLDIyIEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgbVNyY0lkID0gc3JjSWQ7CisgICAgbVRyYW5zaXRpb25Ub05leHQgPSB0cnVlOwogICAgIHJldHVybiBtUGxheWVyLT5wbGF5TmV4dERhdGFTb3VyY2Uoc3JjSWQpOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6Omludm9rZShjb25zdCBQYXJjZWwmIHJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpIHsKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6aW52b2tlKGNvbnN0IFBsYXllck1lc3NhZ2UgJnJlcXVlc3QsIFBsYXllck1lc3NhZ2UgKnJlcGx5KSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBjb25zdCBib29sIGhhc0JlZW5Jbml0aWFsaXplZCA9CiAgICAgICAgICAgICAobUN1cnJlbnRTdGF0ZSAhPSBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SKSAmJgogICAgICAgICAgICAgKChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9JRExFKSAhPSBNRURJQV9QTEFZRVIyX0lETEUpOwogICAgIGlmICgobVBsYXllciA9PSBOVUxMKSB8fCAhaGFzQmVlbkluaXRpYWxpemVkKSB7Ci0gICAgICAgIEFMT0dFKCJpbnZva2UgZmFpbGVkOiB3cm9uZyBzdGF0ZSAlWCwgbVBsYXllciglcCkiLCBtQ3VycmVudFN0YXRlLCBtUGxheWVyLmdldCgpKTsKKyAgICAgICAgQUxPR0UoImludm9rZSgpIGZhaWxlZDogd3Jvbmcgc3RhdGUgJVgsIG1QbGF5ZXIoJXApIiwgbUN1cnJlbnRTdGF0ZSwgbVBsYXllci5nZXQoKSk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgQUxPR1YoImludm9rZSAlenUiLCByZXF1ZXN0LmRhdGFTaXplKCkpOwogICAgIHJldHVybiBtUGxheWVyLT5pbnZva2UocmVxdWVzdCwgcmVwbHkpOwogfQogCi0vLyBUaGlzIGNhbGwgZG9lc24ndCBuZWVkIHRvIGFjY2VzcyB0aGUgbmF0aXZlIHBsYXllci4KLXN0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0TWV0YWRhdGFGaWx0ZXIoY29uc3QgUGFyY2VsJiBmaWx0ZXIpIHsKLSAgICBBTE9HRCgic2V0TWV0YWRhdGFGaWx0ZXIiKTsKLQotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciBhbGxvdywgZHJvcDsKLQotICAgIGlmICh1bm1hcnNoYWxsRmlsdGVyKGZpbHRlciwgJmFsbG93LCAmc3RhdHVzKSAmJgotICAgICAgICB1bm1hcnNoYWxsRmlsdGVyKGZpbHRlciwgJmRyb3AsICZzdGF0dXMpKSB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLQotICAgICAgICBtTWV0YWRhdGFBbGxvdyA9IGFsbG93OwotICAgICAgICBtTWV0YWRhdGFEcm9wID0gZHJvcDsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXRNZXRhZGF0YShib29sIHVwZGF0ZV9vbmx5LCBib29sIC8qIGFwcGx5X2ZpbHRlciAqLywgUGFyY2VsICpyZXBseSkgewotICAgIEFMT0dEKCJnZXRNZXRhZGF0YSIpOwotICAgIHNwPE1lZGlhUGxheWVyMkludGVyZmFjZT4gcGxheWVyOwotICAgIG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyIGlkczsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgewotICAgICAgICBpZiAobVBsYXllciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgfQotCi0gICAgICAgIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIC8vIFBsYWNlaG9sZGVyIGZvciB0aGUgcmV0dXJuIGNvZGUsIHVwZGF0ZWQgYnkgdGhlIGNhbGxlci4KLSAgICAgICAgcmVwbHktPndyaXRlSW50MzIoLTEpOwotCi0gICAgICAgIC8vIFdlIGRvbid0IGJsb2NrIG5vdGlmaWNhdGlvbnMgd2hpbGUgd2UgZmV0Y2ggdGhlIGRhdGEuIFdlIGNsZWFyCi0gICAgICAgIC8vIG1NZXRhZGF0YVVwZGF0ZWQgZmlyc3Qgc28gd2UgZG9uJ3QgbG9zZSBub3RpZmljYXRpb25zIGhhcHBlbmluZwotICAgICAgICAvLyBkdXJpbmcgdGhlIHJlc3Qgb2YgdGhpcyBjYWxsLgotICAgICAgICBpZiAodXBkYXRlX29ubHkpIHsKLSAgICAgICAgICAgIGlkcyA9IG1NZXRhZGF0YVVwZGF0ZWQ7Ci0gICAgICAgIH0KLSAgICAgICAgbU1ldGFkYXRhVXBkYXRlZC5jbGVhcigpOwotICAgIH0KLQotICAgIG1lZGlhOjpNZXRhZGF0YSBtZXRhZGF0YShyZXBseSk7Ci0KLSAgICBtZXRhZGF0YS5hcHBlbmRIZWFkZXIoKTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwbGF5ZXItPmdldE1ldGFkYXRhKGlkcywgcmVwbHkpOwotCi0gICAgaWYgKHN0YXR1cyAhPSBPSykgewotICAgICAgICBtZXRhZGF0YS5yZXNldFBhcmNlbCgpOwotICAgICAgICBBTE9HRSgiZ2V0TWV0YWRhdGEgZmFpbGVkICVkIiwgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0KLSAgICAvLyBGSVhNRTogZW1lbnQgZmlsdGVyaW5nIG9uIHRoZSByZXN1bHQuIE5vdCBjcml0aWNhbCBzaW5jZQotICAgIC8vIGZpbHRlcmluZyB0YWtlcyBwbGFjZSBvbiB0aGUgdXBkYXRlIG5vdGlmaWNhdGlvbnMgYWxyZWFkeS4gVGhpcwotICAgIC8vIHdvdWxkIGJlIHdoZW4gYWxsIHRoZSBtZXRhZGF0YSBhcmUgZmV0Y2ggYW5kIGEgZmlsdGVyIGlzIHNldC4KLQotICAgIC8vIEV2ZXJ5dGhpbmcgaXMgZmluZSwgdXBkYXRlIHRoZSBtZXRhZGF0YSBsZW5ndGguCi0gICAgbWV0YWRhdGEudXBkYXRlTGVuZ3RoKCk7Ci0gICAgcmV0dXJuIE9LOwotfQotCiB2b2lkIE1lZGlhUGxheWVyMjo6ZGlzY29ubmVjdE5hdGl2ZVdpbmRvd19sKCkgewogICAgIGlmIChtQ29ubmVjdGVkV2luZG93ICE9IE5VTEwgJiYgbUNvbm5lY3RlZFdpbmRvdy0+Z2V0QU5hdGl2ZVdpbmRvdygpICE9IE5VTEwpIHsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbmF0aXZlX3dpbmRvd19hcGlfZGlzY29ubmVjdCgKQEAgLTcyNywyMiArNDk1LDkgQEAKICAgICByZXR1cm4gbVBsYXllci0+c2V0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nKTsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRBdWRpb0F0dHJpYnV0ZXNfbChjb25zdCBQYXJjZWwgJnBhcmNlbCkgewotICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzICE9IE5VTEwpIHsKLSAgICAgICAgZnJlZShtQXVkaW9BdHRyaWJ1dGVzKTsKLSAgICB9Ci0gICAgbUF1ZGlvQXR0cmlidXRlcyA9IChhdWRpb19hdHRyaWJ1dGVzX3QgKikgY2FsbG9jKDEsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICBpZiAobUF1ZGlvQXR0cmlidXRlcyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotICAgIHVubWFyc2hhbGxBdWRpb0F0dHJpYnV0ZXMocGFyY2VsLCBtQXVkaW9BdHRyaWJ1dGVzKTsKLQotICAgIEFMT0dWKCJzZXRBdWRpb0F0dHJpYnV0ZXNfbCgpIHVzYWdlPSVkIGNvbnRlbnQ9JWQgZmxhZ3M9MHgleCB0YWdzPSVzIiwKLSAgICAgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXMtPnVzYWdlLCBtQXVkaW9BdHRyaWJ1dGVzLT5jb250ZW50X3R5cGUsIG1BdWRpb0F0dHJpYnV0ZXMtPmZsYWdzLAotICAgICAgICAgICAgbUF1ZGlvQXR0cmlidXRlcy0+dGFncyk7Ci0KLSAgICBpZiAobUF1ZGlvT3V0cHV0ICE9IDApIHsKLSAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRBdWRpb0F0dHJpYnV0ZXMobUF1ZGlvQXR0cmlidXRlcyk7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldEF1ZGlvQXR0cmlidXRlc19sKGNvbnN0IGpvYmplY3QgYXR0cmlidXRlcykgeworICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gTlVMTCkgeworICAgICAgICBtQXVkaW9PdXRwdXQtPnNldEF1ZGlvQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtNzUwLDE0ICs1MDUsMTIgQEAKIHN0YXR1c190IE1lZGlhUGxheWVyMjo6cHJlcGFyZUFzeW5jKCkgewogICAgIEFMT0dWKCJwcmVwYXJlQXN5bmMiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmICgobVBsYXllciAhPSAwKSAmJiAobUN1cnJlbnRTdGF0ZSAmIChNRURJQV9QTEFZRVIyX0lOSVRJQUxJWkVEIHwgTUVESUFfUExBWUVSMl9TVE9QUEVEKSkpIHsKLSAgICAgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgIT0gTlVMTCkgewotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0QXVkaW9BdHRyaWJ1dGVzX2woKm1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwpOworICAgIGlmICgobVBsYXllciAhPSAwKSAmJiAobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfSU5JVElBTElaRUQpKSB7CisgICAgICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHNldEF1ZGlvQXR0cmlidXRlc19sKG1BdWRpb0F0dHJpYnV0ZXMtPmdldEpPYmplY3QoKSk7CiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtQXVkaW9PdXRwdXQgIT0gMCkgewotICAgICAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRBdWRpb1N0cmVhbVR5cGUobVN0cmVhbVR5cGUpOwogICAgICAgICB9CiAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1BSRVBBUklORzsKICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnByZXBhcmVBc3luYygpOwpAQCAtNzgxLDcgKzUzNCw3IEBACiAgICAgICAgIG1QbGF5ZXItPnNldExvb3BpbmcobUxvb3ApOwogCiAgICAgICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gMCkgewotICAgICAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRWb2x1bWUobUxlZnRWb2x1bWUsIG1SaWdodFZvbHVtZSk7CisgICAgICAgICAgICBtQXVkaW9PdXRwdXQtPnNldFZvbHVtZShtVm9sdW1lKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gMCkgewpAQCAtODA2LDM1ICs1NTksMTggQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnN0b3AoKSB7Ci0gICAgQUxPR1YoInN0b3AiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9TVE9QUEVEKSByZXR1cm4gTk9fRVJST1I7Ci0gICAgaWYgKCAobVBsYXllciAhPSAwKSAmJiAoIG1DdXJyZW50U3RhdGUgJiAoIE1FRElBX1BMQVlFUjJfU1RBUlRFRCB8IE1FRElBX1BMQVlFUjJfUFJFUEFSRUQgfAotICAgICAgICAgICAgICAgICAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUgKSApICkgewotICAgICAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5zdG9wKCk7Ci0gICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfU1RPUFBFRDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICBBTE9HRSgic3RvcCBjYWxsZWQgaW4gc3RhdGUgJWQsIG1QbGF5ZXIoJXApIiwgbUN1cnJlbnRTdGF0ZSwgbVBsYXllci5nZXQoKSk7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCiBzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnBhdXNlKCkgewogICAgIEFMT0dWKCJwYXVzZSIpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1DdXJyZW50U3RhdGUgJiAoTUVESUFfUExBWUVSMl9QQVVTRUR8TUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkpCiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICBpZiAoKG1QbGF5ZXIgIT0gMCkgJiYgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX1NUQVJURUQpKSB7CisgICAgaWYgKChtUGxheWVyICE9IDApICYmIChtQ3VycmVudFN0YXRlICYgKE1FRElBX1BMQVlFUjJfU1RBUlRFRCB8IE1FRElBX1BMQVlFUjJfUFJFUEFSRUQpKSkgewogICAgICAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5wYXVzZSgpOwogICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9TVEFURV9FUlJPUjsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1BBVVNFRDsKKyAgICAgICAgICAgIG1UcmFuc2l0aW9uVG9OZXh0ID0gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CkBAIC04NjAsNyArNTk2LDcgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLW1lZGlhcGxheWVyMl9zdGF0ZXMgTWVkaWFQbGF5ZXIyOjpnZXRNZWRpYVBsYXllcjJTdGF0ZSgpIHsKK21lZGlhcGxheWVyMl9zdGF0ZXMgTWVkaWFQbGF5ZXIyOjpnZXRTdGF0ZSgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9TVEFURV9FUlJPUikgewogICAgICAgICByZXR1cm4gTUVESUFQTEFZRVIyX1NUQVRFX0VSUk9SOwpAQCAtODczLDggKzYwOSw3IEBACiAgICAgaWYgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX1NUQVJURUQpIHsKICAgICAgICAgcmV0dXJuIE1FRElBUExBWUVSMl9TVEFURV9QTEFZSU5HOwogICAgIH0KLSAgICBpZiAobUN1cnJlbnRTdGF0ZQotICAgICAgICAmIChNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfU1RPUFBFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUpKSB7CisgICAgaWYgKG1DdXJyZW50U3RhdGUgJiAoTUVESUFfUExBWUVSMl9QQVVTRUQgfCBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFKSkgewogICAgICAgICByZXR1cm4gTUVESUFQTEFZRVIyX1NUQVRFX1BBVVNFRDsKICAgICB9CiAgICAgLy8gbm93IG9ubHkgbUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfUFJFUEFSRUQgaXMgdHJ1ZQpAQCAtODkwLDcgKzYyNSw3IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1QbGF5ZXIgPT0gMCB8fCAobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfU1RPUFBFRCkpIHsKKyAgICBpZiAobVBsYXllciA9PSAwKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKQEAgLTk3OCwxMSArNzEzLDE4IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXREdXJhdGlvbihpbnQ2NF90ICptc2VjKSB7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OmdldER1cmF0aW9uKGludDY0X3Qgc3JjSWQsIGludDY0X3QgKm1zZWMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIC8vIFRPRE86IGNhY2hlIGR1cmF0aW9uIGZvciBjdXJyZW50U3JjSWQgYW5kIG5leHRTcmNJZCwgYW5kIHJldHVybiBjb3JyZWN0CisgICAgLy8gdmFsdWUgZm9yIG5leHRTcmNJZC4KKyAgICBpZiAoc3JjSWQgIT0gbVNyY0lkKSB7CisgICAgICAgICptc2VjID0gLTE7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKICAgICBBTE9HVigiZ2V0RHVyYXRpb25fbCIpOwogICAgIGJvb2wgaXNWYWxpZFN0YXRlID0gKG1DdXJyZW50U3RhdGUgJiAoTUVESUFfUExBWUVSMl9QUkVQQVJFRCB8IE1FRElBX1BMQVlFUjJfU1RBUlRFRCB8Ci0gICAgICAgICAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfU1RPUFBFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUpKTsKKyAgICAgICAgICAgIE1FRElBX1BMQVlFUjJfUEFVU0VEIHwgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkpOwogICAgIGlmIChtUGxheWVyID09IDAgfHwgIWlzVmFsaWRTdGF0ZSkgewogICAgICAgICBBTE9HRSgiQXR0ZW1wdCB0byBjYWxsIGdldER1cmF0aW9uIGluIHdyb25nIHN0YXRlOiBtUGxheWVyPSVwLCBtQ3VycmVudFN0YXRlPSV1IiwKICAgICAgICAgICAgICAgICBtUGxheWVyLmdldCgpLCBtQ3VycmVudFN0YXRlKTsKQEAgLTEwNzYsNiArODE4LDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1QbGF5ZXItPnNldExpc3RlbmVyKE5VTEwpOwogICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfSURMRTsKKyAgICAgICAgICAgIG1UcmFuc2l0aW9uVG9OZXh0ID0gZmFsc2U7CiAgICAgICAgIH0KICAgICAgICAgLy8gc2V0RGF0YVNvdXJjZSBoYXMgdG8gYmUgY2FsbGVkIGFnYWluIHRvIGNyZWF0ZSBhCiAgICAgICAgIC8vIG5ldyBtZWRpYXBsYXllci4KQEAgLTExMzgsMTggKzg4MSwxNyBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRWb2x1bWUoZmxvYXQgbGVmdFZvbHVtZSwgZmxvYXQgcmlnaHRWb2x1bWUpIHsKLSAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpzZXRWb2x1bWUoJWYsICVmKSIsIGxlZnRWb2x1bWUsIHJpZ2h0Vm9sdW1lKTsKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIEFMT0dWKCJNZWRpYVBsYXllcjI6OnNldFZvbHVtZSglZikiLCB2b2x1bWUpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbUxlZnRWb2x1bWUgPSBsZWZ0Vm9sdW1lOwotICAgIG1SaWdodFZvbHVtZSA9IHJpZ2h0Vm9sdW1lOworICAgIG1Wb2x1bWUgPSB2b2x1bWU7CiAgICAgaWYgKG1BdWRpb091dHB1dCAhPSAwKSB7Ci0gICAgICAgIG1BdWRpb091dHB1dC0+c2V0Vm9sdW1lKGxlZnRWb2x1bWUsIHJpZ2h0Vm9sdW1lKTsKKyAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRWb2x1bWUodm9sdW1lKTsKICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldEF1ZGlvU2Vzc2lvbklkKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpIHsKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0QXVkaW9TZXNzaW9uSWQoaW50MzJfdCBzZXNzaW9uSWQpIHsKICAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpzZXRBdWRpb1Nlc3Npb25JZCglZCkiLCBzZXNzaW9uSWQpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKCEobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfSURMRSkpIHsKQEAgLTExNTksMTcgKzkwMSwxOCBAQAogICAgIGlmIChzZXNzaW9uSWQgPCAwKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIGlmIChzZXNzaW9uSWQgIT0gbUF1ZGlvU2Vzc2lvbklkKSB7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjphY3F1aXJlQXVkaW9TZXNzaW9uSWQoc2Vzc2lvbklkLCAtMSk7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobUF1ZGlvU2Vzc2lvbklkLCAtMSk7Ci0gICAgICAgIG1BdWRpb1Nlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICBpZiAobUF1ZGlvT3V0cHV0ICE9IE5VTEwgJiYgc2Vzc2lvbklkICE9IG1BdWRpb091dHB1dC0+Z2V0U2Vzc2lvbklkKCkpIHsKKyAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRTZXNzaW9uSWQoc2Vzc2lvbklkKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1hdWRpb19zZXNzaW9uX3QgTWVkaWFQbGF5ZXIyOjpnZXRBdWRpb1Nlc3Npb25JZCgpIHsKK2ludDMyX3QgTWVkaWFQbGF5ZXIyOjpnZXRBdWRpb1Nlc3Npb25JZCgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtQXVkaW9TZXNzaW9uSWQ7CisgICAgaWYgKG1BdWRpb091dHB1dCAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPmdldFNlc3Npb25JZCgpOworICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoZmxvYXQgbGV2ZWwpIHsKQEAgLTExOTYsNjcgKzkzOSwzNyBAQAogfQogCiAvLyBhbHdheXMgY2FsbCB3aXRoIGxvY2sgaGVsZAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpjaGVja1N0YXRlRm9yS2V5U2V0X2woaW50IGtleSkgewotICAgIHN3aXRjaChrZXkpIHsKLSAgICBjYXNlIE1FRElBMl9LRVlfUEFSQU1FVEVSX0FVRElPX0FUVFJJQlVURVM6Ci0gICAgICAgIGlmIChtQ3VycmVudFN0YXRlICYgKCBNRURJQV9QTEFZRVIyX1BSRVBBUkVEIHwgTUVESUFfUExBWUVSMl9TVEFSVEVEIHwKLSAgICAgICAgICAgICAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUpICkgewotICAgICAgICAgICAgLy8gQ2FuJ3QgY2hhbmdlIHRoZSBhdWRpbyBhdHRyaWJ1dGVzIGFmdGVyIHByZXBhcmUKLSAgICAgICAgICAgIEFMT0dFKCJ0cnlpbmcgdG8gc2V0IGF1ZGlvIGF0dHJpYnV0ZXMgY2FsbGVkIGluIHN0YXRlICVkIiwgbUN1cnJlbnRTdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgLy8gcGFyYW1ldGVyIGRvZXNuJ3QgcmVxdWlyZSBwbGF5ZXIgc3RhdGUgY2hlY2sKLSAgICAgICAgYnJlYWs7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OmNoZWNrU3RhdGVfbCgpIHsKKyAgICBpZiAobUN1cnJlbnRTdGF0ZSAmICggTUVESUFfUExBWUVSMl9QUkVQQVJFRCB8IE1FRElBX1BMQVlFUjJfU1RBUlRFRCB8CisgICAgICAgICAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUpICkgeworICAgICAgICAvLyBDYW4ndCBjaGFuZ2UgdGhlIGF1ZGlvIGF0dHJpYnV0ZXMgYWZ0ZXIgcHJlcGFyZQorICAgICAgICBBTE9HRSgidHJ5aW5nIHRvIHNldCBhdWRpbyBhdHRyaWJ1dGVzIGNhbGxlZCBpbiBzdGF0ZSAlZCIsIG1DdXJyZW50U3RhdGUpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsJiByZXF1ZXN0KSB7Ci0gICAgQUxPR1YoIk1lZGlhUGxheWVyMjo6c2V0UGFyYW1ldGVyKCVkKSIsIGtleSk7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldEF1ZGlvQXR0cmlidXRlcyhjb25zdCBqb2JqZWN0IGF0dHJpYnV0ZXMpIHsKKyAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpzZXRBdWRpb0F0dHJpYnV0ZXMiKTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChjaGVja1N0YXRlRm9yS2V5U2V0X2woa2V5KSAhPSBPSykgeworICAgIGlmIChjaGVja1N0YXRlX2woKSAhPSBPSykgewogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KLSAgICBzd2l0Y2ggKGtleSkgewotICAgIGNhc2UgTUVESUEyX0tFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUzoKLSAgICAgICAgLy8gc2F2ZSB0aGUgbWFyc2hhbGxlZCBhdWRpbyBhdHRyaWJ1dGVzCi0gICAgICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsOwotICAgICAgICB9Ci0gICAgICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgPSBuZXcgUGFyY2VsKCk7Ci0gICAgICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwtPmFwcGVuZEZyb20oJnJlcXVlc3QsIDAsIHJlcXVlc3QuZGF0YVNpemUoKSk7Ci0gICAgICAgIHN0YXR1cyA9IHNldEF1ZGlvQXR0cmlidXRlc19sKHJlcXVlc3QpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dWX0lGKG1QbGF5ZXIgPT0gTlVMTCwgInNldFBhcmFtZXRlcjogbm8gYWN0aXZlIHBsYXllciIpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAobVBsYXllciAhPSBOVUxMKSB7Ci0gICAgICAgIHN0YXR1cyA9IG1QbGF5ZXItPnNldFBhcmFtZXRlcihrZXksIHJlcXVlc3QpOwotICAgIH0KKyAgICBtQXVkaW9BdHRyaWJ1dGVzID0gbmV3IEpPYmplY3RIb2xkZXIoYXR0cmlidXRlcyk7CisgICAgc3RhdHVzID0gc2V0QXVkaW9BdHRyaWJ1dGVzX2woYXR0cmlidXRlcyk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAoram9iamVjdCBNZWRpYVBsYXllcjI6OmdldEF1ZGlvQXR0cmlidXRlcygpIHsKKyAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpnZXRBdWRpb0F0dHJpYnV0ZXMpIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvQXR0cmlidXRlcyAhPSBOVUxMID8gbUF1ZGlvQXR0cmlidXRlcy0+Z2V0Sk9iamVjdCgpIDogTlVMTDsKK30KKwogc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkgewogICAgIEFMT0dWKCJNZWRpYVBsYXllcjI6OmdldFBhcmFtZXRlciglZCkiLCBrZXkpOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKGtleSA9PSBNRURJQTJfS0VZX1BBUkFNRVRFUl9BVURJT19BVFRSSUJVVEVTKSB7Ci0gICAgICAgIGlmIChyZXBseSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHJlcGx5LT5hcHBlbmRGcm9tKG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwsIDAsIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwtPmRhdGFTaXplKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KICAgICBpZiAobVBsYXllciA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dWKCJnZXRQYXJhbWV0ZXI6IG5vIGFjdGl2ZSBwbGF5ZXIiKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMTI2OSw0NCArOTgyLDI2IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotYm9vbCBNZWRpYVBsYXllcjI6OnNob3VsZERyb3BNZXRhZGF0YShtZWRpYTo6TWV0YWRhdGE6OlR5cGUgY29kZSkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLQotICAgIGlmIChmaW5kTWV0YWRhdGEobU1ldGFkYXRhRHJvcCwgY29kZSkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisvLyBmb3IgbWVkaWFtZXRyaWNzCitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OmdldE1ldHJpY3MoY2hhciAqKmJ1ZmZlciwgc2l6ZV90ICpsZW5ndGgpIHsKKyAgICBBTE9HRCgiTWVkaWFQbGF5ZXIyOjpnZXRNZXRyaWNzKCkiKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtUGxheWVyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1YoImdldE1ldHJpY3M6IG5vIGFjdGl2ZSBwbGF5ZXIiKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIGlmIChtTWV0YWRhdGFBbGxvdy5pc0VtcHR5KCkgfHwgZmluZE1ldGFkYXRhKG1NZXRhZGF0YUFsbG93LCBjb2RlKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gIG1QbGF5ZXItPmdldE1ldHJpY3MoYnVmZmVyLCBsZW5ndGgpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0QoImdldE1ldHJpY3MgcmV0dXJucyAlZCIsIHN0YXR1cyk7CiAgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLQotdm9pZCBNZWRpYVBsYXllcjI6OmFkZE5ld01ldGFkYXRhVXBkYXRlKG1lZGlhOjpNZXRhZGF0YTo6VHlwZSBtZXRhZGF0YV90eXBlKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtTWV0YWRhdGFVcGRhdGVkLmluZGV4T2YobWV0YWRhdGFfdHlwZSkgPCAwKSB7Ci0gICAgICAgIG1NZXRhZGF0YVVwZGF0ZWQuYWRkKG1ldGFkYXRhX3R5cGUpOwotICAgIH0KLX0KLQotdm9pZCBNZWRpYVBsYXllcjI6Om5vdGlmeShpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqKSB7Cit2b2lkIE1lZGlhUGxheWVyMjo6bm90aWZ5KGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGxheWVyTWVzc2FnZSAqb2JqKSB7CiAgICAgQUxPR1YoIm1lc3NhZ2UgcmVjZWl2ZWQgc3JjSWQ9JWxsZCwgbXNnPSVkLCBleHQxPSVkLCBleHQyPSVkIiwKICAgICAgICAgICAobG9uZyBsb25nKXNyY0lkLCBtc2csIGV4dDEsIGV4dDIpOwogCi0gICAgaWYgKE1FRElBMl9JTkZPID09IG1zZyAmJiBNRURJQTJfSU5GT19NRVRBREFUQV9VUERBVEUgPT0gZXh0MSkgewotICAgICAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OlR5cGUgbWV0YWRhdGFfdHlwZSA9IGV4dDI7Ci0KLSAgICAgICAgaWYoc2hvdWxkRHJvcE1ldGFkYXRhKG1ldGFkYXRhX3R5cGUpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBVcGRhdGUgdGhlIGxpc3Qgb2YgbWV0YWRhdGEgdGhhdCBoYXZlIGNoYW5nZWQuIGdldE1ldGFkYXRhCi0gICAgICAgIC8vIGFsc28gYWNjZXNzIG1NZXRhZGF0YVVwZGF0ZWQgYW5kIGNsZWFycyBpdC4KLSAgICAgICAgYWRkTmV3TWV0YWRhdGFVcGRhdGUobWV0YWRhdGFfdHlwZSk7Ci0gICAgfQotCiAgICAgYm9vbCBzZW5kID0gdHJ1ZTsKICAgICBib29sIGxvY2tlZCA9IGZhbHNlOwogCkBAIC0xMzM1LDggKzEwMzAsMTAgQEAKICAgICBjYXNlIE1FRElBMl9OT1A6IC8vIGludGVyZmFjZSB0ZXN0IG1lc3NhZ2UKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBNRURJQTJfUFJFUEFSRUQ6Ci0gICAgICAgIEFMT0dWKCJNZWRpYVBsYXllcjI6Om5vdGlmeSgpIHByZXBhcmVkIik7Ci0gICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1BSRVBBUkVEOworICAgICAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpub3RpZnkoKSBwcmVwYXJlZCwgc3JjSWQ9JWxsZCIsIChsb25nIGxvbmcpc3JjSWQpOworICAgICAgICBpZiAoc3JjSWQgPT0gbVNyY0lkKSB7CisgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9QUkVQQVJFRDsKKyAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBjYXNlIE1FRElBMl9EUk1fSU5GTzoKICAgICAgICAgQUxPR1YoIk1lZGlhUGxheWVyMjo6bm90aWZ5KCkgTUVESUEyX0RSTV9JTkZPKCVsbGQsICVkLCAlZCwgJWQsICVwKSIsCkBAIC0xMzQ3LDcgKzEwNDQsNyBAQAogICAgICAgICBpZiAobUN1cnJlbnRTdGF0ZSA9PSBNRURJQV9QTEFZRVIyX0lETEUpIHsKICAgICAgICAgICAgIEFMT0dFKCJwbGF5YmFjayBjb21wbGV0ZSBpbiBpZGxlIHN0YXRlIik7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFtTG9vcCkgeworICAgICAgICBpZiAoIW1Mb29wICYmIHNyY0lkID09IG1TcmNJZCkgewogICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEU7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CkBAIC0xMzYzLDYgKzEwNjAsMTEgQEAKICAgICAgICAgLy8gZXh0MjogSW1wbGVtZW50YXRpb24gZGVwZW5kYW50IGVycm9yIGNvZGUuCiAgICAgICAgIGlmIChleHQxICE9IE1FRElBMl9JTkZPX1ZJREVPX1RSQUNLX0xBR0dJTkcpIHsKICAgICAgICAgICAgIEFMT0dXKCJpbmZvL3dhcm5pbmcgKCVkLCAlZCkiLCBleHQxLCBleHQyKTsKKworICAgICAgICAgICAgaWYgKGV4dDEgPT0gTUVESUEyX0lORk9fREFUQV9TT1VSQ0VfU1RBUlQgJiYgc3JjSWQgPT0gbVNyY0lkICYmIG1UcmFuc2l0aW9uVG9OZXh0KSB7CisgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfU1RBUlRFRDsKKyAgICAgICAgICAgICAgICBtVHJhbnNpdGlvblRvTmV4dCA9IGZhbHNlOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgTUVESUEyX1NFRUtfQ09NUExFVEU6CkBAIC0xNDE4LDcgKzExMjAsOCBAQAogfQogCiAvLyBNb2R1bGFyIERSTQotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgZHJtU2Vzc2lvbklkKSB7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnByZXBhcmVEcm0oCisgICAgICAgIGludDY0X3Qgc3JjSWQsIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgZHJtU2Vzc2lvbklkKSB7CiAgICAgLy8gVE9ETyBjaGFuZ2UgdG8gQUxPR1YKICAgICBBTE9HRCgicHJlcGFyZURybTogdXVpZDogJXAgIGRybVNlc3Npb25JZDogJXAoJXp1KSIsIHV1aWQsCiAgICAgICAgICAgICBkcm1TZXNzaW9uSWQuYXJyYXkoKSwgZHJtU2Vzc2lvbklkLnNpemUoKSk7CkBAIC0xNDMyLDggKzExMzUsMTAgQEAKICAgICAvLyBjb21wbGV0ZWQpIHNvIHRoZSBzdGF0ZSBjaGFuZ2UgdG8gInByZXBhcmVkIiBtaWdodCBub3QgaGF2ZSBoYXBwZW5lZCB5ZXQgKGUuZy4sIGJ1ZmZlcmluZykuCiAgICAgLy8gU3RpbGwsIHdlIGNhbiBhbGxvdyBwcmVwYXJlRHJtIGZvciB0aGUgdXNlIGNhc2Ugb2YgYmVpbmcgY2FsbGVkIGluIE9uRHJtSW5mb0xpc3RlbmVyLgogICAgIGlmICghKG1DdXJyZW50U3RhdGUgJiAoTUVESUFfUExBWUVSMl9QUkVQQVJJTkcgfCBNRURJQV9QTEFZRVIyX1BSRVBBUkVEKSkpIHsKLSAgICAgICAgQUxPR0UoInByZXBhcmVEcm0gaXMgY2FsbGVkIGluIHRoZSB3cm9uZyBzdGF0ZSAoJWQpLiIsIG1DdXJyZW50U3RhdGUpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIEFMT0dXKCJwcmVwYXJlRHJtKCVsbGQpIGNhbGxlZCBpbiBub24tcHJlcGFyZSBzdGF0ZSglZCkiLCAobG9uZyBsb25nKXNyY0lkLCBtQ3VycmVudFN0YXRlKTsKKyAgICAgICAgaWYgKHNyY0lkID09IG1TcmNJZCkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKGRybVNlc3Npb25JZC5pc0VtcHR5KCkpIHsKQEAgLTE0NDIsNyArMTE0Nyw3IEBACiAgICAgfQogCiAgICAgLy8gUGFzc2luZyBkb3duIHRvIG1lZGlhc2VydmVyIG1haW5seSBmb3IgY3JlYXRpbmcgdGhlIGNyeXB0bwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1QbGF5ZXItPnByZXBhcmVEcm0odXVpZCwgZHJtU2Vzc2lvbklkKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUGxheWVyLT5wcmVwYXJlRHJtKHNyY0lkLCB1dWlkLCBkcm1TZXNzaW9uSWQpOwogICAgIEFMT0dFX0lGKHN0YXR1cyAhPSBPSywgInByZXBhcmVEcm06IEZhaWxlZCBhdCBtZWRpYXNlcnZlciB3aXRoIHJldDogJWQiLCBzdGF0dXMpOwogCiAgICAgLy8gVE9ETyBjaGFuZ2UgdG8gQUxPR1YKQEAgLTE0NTEsNyArMTE1Niw3IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpyZWxlYXNlRHJtKCkgeworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpyZWxlYXNlRHJtKGludDY0X3Qgc3JjSWQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtUGxheWVyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC0xNDY2LDcgKzExNzEsNyBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBsYXllci0+cmVsZWFzZURybSgpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1QbGF5ZXItPnJlbGVhc2VEcm0oc3JjSWQpOwogICAgIC8vIFRPRE8gY2hhbmdlIHRvIEFMT0dWCiAgICAgQUxPR0QoInJlbGVhc2VEcm06IG1lZGlhc2VydmVyOjpyZWxlYXNlRHJtIHJldDogJWQiLCBzdGF0dXMpOwogICAgIGlmIChzdGF0dXMgIT0gT0spIHsKQEAgLTE0NzksMzYgKzExODQsNDAgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSB7CitzdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldFByZWZlcnJlZERldmljZShqb2JqZWN0IGRldmljZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1BdWRpb091dHB1dCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2U6IGF1ZGlvIHNpbmsgbm90IGluaXQiKTsKKyAgICAgICAgQUxPR1YoInNldFByZWZlcnJlZERldmljZTogYXVkaW8gc2luayBub3QgaW5pdCIpOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgcmV0dXJuIG1BdWRpb091dHB1dC0+c2V0T3V0cHV0RGV2aWNlKGRldmljZUlkKTsKKyAgICByZXR1cm4gbUF1ZGlvT3V0cHV0LT5zZXRQcmVmZXJyZWREZXZpY2UoZGV2aWNlKTsKIH0KIAotYXVkaW9fcG9ydF9oYW5kbGVfdCBNZWRpYVBsYXllcjI6OmdldFJvdXRlZERldmljZUlkKCkgeworam9iamVjdCBNZWRpYVBsYXllcjI6OmdldFJvdXRlZERldmljZSgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtQXVkaW9PdXRwdXQgPT0gTlVMTCkgewotICAgICAgICBBTE9HVigiZ2V0Um91dGVkRGV2aWNlSWQ6IGF1ZGlvIHNpbmsgbm90IGluaXQiKTsKLSAgICAgICAgcmV0dXJuIEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgIEFMT0dWKCJnZXRSb3V0ZWREZXZpY2U6IGF1ZGlvIHNpbmsgbm90IGluaXQiKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgfQotICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQ7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvT3V0cHV0LT5nZXRSb3V0ZWREZXZpY2VJZCgmZGV2aWNlSWQpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX1BPUlRfSEFORExFX05PTkU7Ci0gICAgfQotICAgIHJldHVybiBkZXZpY2VJZDsKKyAgICByZXR1cm4gbUF1ZGlvT3V0cHV0LT5nZXRSb3V0ZWREZXZpY2UoKTsKIH0KIAotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjplbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCkgeworc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKGpvYmplY3Qgcm91dGluZ0RlbGVnYXRlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUF1ZGlvT3V0cHV0ID09IE5VTEwpIHsKICAgICAgICAgQUxPR1YoImFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2s6IHBsYXllciBub3QgaW5pdCIpOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgcmV0dXJuIG1BdWRpb091dHB1dC0+ZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhlbmFibGVkKTsKKyAgICByZXR1cm4gbUF1ZGlvT3V0cHV0LT5hZGRBdWRpb0RldmljZUNhbGxiYWNrKHJvdXRpbmdEZWxlZ2F0ZSk7Cit9CisKK3N0YXR1c190IE1lZGlhUGxheWVyMjo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhqb2JqZWN0IGxpc3RlbmVyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUF1ZGlvT3V0cHV0ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1YoImFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2s6IHBsYXllciBub3QgaW5pdCIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1BdWRpb091dHB1dC0+cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhsaXN0ZW5lcik7CiB9CiAKIHN0YXR1c190IE1lZGlhUGxheWVyMjo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvQW5kcm9pZC5icAppbmRleCBjNDBiMzYxLi4wZjY5YjJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9BbmRyb2lkLmJwCkBAIC0xLDYgKzEsNyBAQAogY2NfbGlicmFyeV9zdGF0aWMgewogCiAgICAgc3JjczogWworICAgICAgICAiSk1lZGlhUGxheWVyMlV0aWxzLmNwcCIsCiAgICAgICAgICJKV2FrZUxvY2suY3BwIiwKICAgICAgICAgIkdlbmVyaWNTb3VyY2UyLmNwcCIsCiAgICAgICAgICJIVFRQTGl2ZVNvdXJjZTIuY3BwIiwKQEAgLTE2LDYgKzE3LDcgQEAKICAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCiAgICAgICAgICJsaWJtZWRpYXBsYXllcjJfaGVhZGVycyIsCiAgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCiAgICAgXSwKQEAgLTI3LDYgKzI5LDggQEAKICAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cyIsCiAgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AiLAogICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9uZGsiLAorICAgICAgICAiZnJhbWV3b3Jrcy9iYXNlL2NvcmUvam5pIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCkBAIC00NywyNCArNTEsMjIgQEAKICAgICAgICAgImxpYnVpIiwKICAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJtZWRpYSIsCi0gICAgICAgICJsaWJtZWRpYWRybSIsCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAogICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAibGlibWVkaWFuZGtfdXRpbHMiLAogICAgICAgICAibGlicG93ZXJtYW5hZ2VyIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJtZWRpYXBsYXllcjItcHJvdG9zIiwKKyAgICAgICAgImxpYm1lZGlhMl9qbmlfY29yZSIsCiAgICAgXSwKIAogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9udXBsYXllcjIiLAogCi0gICAgdGFnczogWyJlbmciXSwKLQogICAgIHNhbml0aXplOiB7CiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiAKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvR2VuZXJpY1NvdXJjZTIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9HZW5lcmljU291cmNlMi5jcHAKaW5kZXggMTk2YjEwMy4uOTU1MjU4MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9HZW5lcmljU291cmNlMi5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9HZW5lcmljU291cmNlMi5jcHAKQEAgLTIxLDMwICsyMSwxOSBAQAogI2luY2x1ZGUgIk51UGxheWVyMkRybS5oIgogCiAjaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUJ1ZmZlckhvbGRlci5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBTZXJ2aWNlLmg+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+IG1FeHRyYWN0b3I7CkBAIC0xOTQsNyArMTg3LDcgQEAKICAgICB2b2lkIG9uU2Vlayhjb25zdCBzcDxBTWVzc2FnZT4mIG1zZyk7CiAgICAgc3RhdHVzX3QgZG9TZWVrKGludDY0X3Qgc2Vla1RpbWVVcywgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSk7CiAKLSAgICB2b2lkIG9uUHJlcGFyZUFzeW5jKCk7CisgICAgdm9pZCBvblByZXBhcmVBc3luYyhpbnQ2NF90IHN0YXJ0VGltZVVzKTsKIAogICAgIHZvaWQgZmV0Y2hUZXh0RGF0YSgKICAgICAgICAgICAgIHVpbnQzMl90IHdoYXQsIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSwKQEAgLTIzMiw4ICsyMjUsNiBAQAogICAgIHZvaWQgb25Qb2xsQnVmZmVyaW5nKCk7CiAgICAgdm9pZCBub3RpZnlCdWZmZXJpbmdVcGRhdGUoaW50MzJfdCBwZXJjZW50YWdlKTsKIAotICAgIHZvaWQgc2VuZENhY2hlU3RhdHMoKTsKLQogICAgIHNwPEFNZXNzYWdlPiBnZXRGb3JtYXRfbChib29sIGF1ZGlvKTsKICAgICBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0TWV0YV9sKGJvb2wgYXVkaW8pOwogICAgIGludDMyX3QgZ2V0RGF0YUdlbmVyYXRpb24obWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSFRUUExpdmVTb3VyY2UyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSFRUUExpdmVTb3VyY2UyLmNwcAppbmRleCBhNjFjYWNkLi5lNTM5MDBiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0hUVFBMaXZlU291cmNlMi5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9IVFRQTGl2ZVNvdXJjZTIuY3BwCkBAIC05OSwxMCArOTksMTEgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgTnVQbGF5ZXIyOjpIVFRQTGl2ZVNvdXJjZTI6OnByZXBhcmVBc3luYygpIHsKKy8vIFRPRE86IGZldGNoIGRhdGEgc3RhcnRpbmcgZnJvbSB8c3RhcnRUaW1lVXN8Cit2b2lkIE51UGxheWVyMjo6SFRUUExpdmVTb3VyY2UyOjpwcmVwYXJlQXN5bmMoaW50NjRfdCAvKiBzdGFydFRpbWVVcyAqLykgewogICAgIGlmIChtTGl2ZUxvb3BlciA9PSBOVUxMKSB7CiAgICAgICAgIG1MaXZlTG9vcGVyID0gbmV3IEFMb29wZXI7Ci0gICAgICAgIG1MaXZlTG9vcGVyLT5zZXROYW1lKCJodHRwIGxpdmUiKTsKKyAgICAgICAgbUxpdmVMb29wZXItPnNldE5hbWUoImh0dHAgbGl2ZTIiKTsKICAgICAgICAgbUxpdmVMb29wZXItPnN0YXJ0KGZhbHNlLCAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogY2FuQ2FsbEphdmEgKi8pOwogCkBAIC0yNzIsMTAgKzI3MywxMCBAQAogCiAgICAgICAgIGlmIChmZXRjaFR5cGUgPT0gTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfU1VCVElUTEVTKSB7CiAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKLSAgICAgICAgICAgIG1zZy0+cG9zdChkZWxheVVzID4gMGxsID8gZGVsYXlVcyA6IDBsbCk7CisgICAgICAgICAgICBtc2ctPnBvc3QoZGVsYXlVcyA+IDBMTCA/IGRlbGF5VXMgOiAwTEwpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9IGVsc2UgaWYgKGZldGNoVHlwZSA9PSBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9NRVRBREFUQSkgewotICAgICAgICAgICAgaWYgKGRlbGF5VXMgPCAtMTAwMDAwMGxsKSB7IC8vIDEgc2Vjb25kCisgICAgICAgICAgICBpZiAoZGVsYXlVcyA8IC0xMDAwMDAwTEwpIHsgLy8gMSBzZWNvbmQKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwpAQCAtMjg3LDcgKzI4OCw3IEBACiAgICAgfQogCiAgICAgLy8gdHJ5IGFnYWluIGluIDEgc2Vjb25kCi0gICAgbXNnLT5wb3N0KDEwMDAwMDBsbCk7CisgICAgbXNnLT5wb3N0KDEwMDAwMDBMTCk7CiB9CiAKIHZvaWQgTnVQbGF5ZXIyOjpIVFRQTGl2ZVNvdXJjZTI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0hUVFBMaXZlU291cmNlMi5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9IVFRQTGl2ZVNvdXJjZTIuaAppbmRleCA5N2QzNjUzLi44ZmM3MWUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0hUVFBMaXZlU291cmNlMi5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSFRUUExpdmVTb3VyY2UyLmgKQEAgLTM4LDcgKzM4LDcgQEAKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoKTsKKyAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUFzeW5jKGludDY0X3Qgc3RhcnRUaW1lVXMpOwogICAgIHZpcnR1YWwgdm9pZCBzdGFydCgpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZXF1ZXVlQWNjZXNzVW5pdChib29sIGF1ZGlvLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pNZWRpYVBsYXllcjJVdGlscy5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pNZWRpYVBsYXllcjJVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk3MDNkZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSk1lZGlhUGxheWVyMlV0aWxzLmNwcApAQCAtMCwwICsxLDY1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkpNZWRpYVBsYXllcjJVdGlscyIKKworI2luY2x1ZGUgIkpNZWRpYVBsYXllcjJVdGlscy5oIgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KYXZhVk1IZWxwZXIuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJsb2cvbG9nLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IGludDY0X3Qga09mZmxvYWRNaW5EdXJhdGlvblNlYyA9IDYwOworCisvLyBzdGF0aWMKK2Jvb2wgSk1lZGlhUGxheWVyMlV0aWxzOjppc09mZmxvYWRlZEF1ZGlvUGxheWJhY2tTdXBwb3J0ZWQoCisgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSwgYm9vbCBoYXNWaWRlbywgYm9vbCBpc1N0cmVhbWluZywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKQoreworICAgIGlmIChoYXNWaWRlbyB8fCBzdHJlYW1UeXBlICE9IEFVRElPX1NUUkVBTV9NVVNJQykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgaW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CisgICAgaWYgKE9LICE9IGdldEF1ZGlvT2ZmbG9hZEluZm8obWV0YSwgaGFzVmlkZW8sIGlzU3RyZWFtaW5nLCBzdHJlYW1UeXBlLCAmaW5mbykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChpbmZvLmR1cmF0aW9uX3VzIDwga09mZmxvYWRNaW5EdXJhdGlvblNlYyAqIDEwMDAwMDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDMyX3QgYXVkaW9Gb3JtYXQgPSBhdWRpb0Zvcm1hdEZyb21OYXRpdmUoaW5mby5mb3JtYXQpOworICAgIGludDMyX3QgY2hhbm5lbE1hc2sgPSBvdXRDaGFubmVsTWFza0Zyb21OYXRpdmUoaW5mby5jaGFubmVsX21hc2spOworICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBFTkNPRElOR19JTlZBTElEIHx8IGNoYW5uZWxNYXNrID09IENIQU5ORUxfSU5WQUxJRCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgSk5JRW52KiBlbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgIGpjbGFzcyBqTVAyVXRpbHNDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXllcjJVdGlscyIpOworICAgIGptZXRob2RJRCBqU2V0QXVkaW9PdXRwdXREZXZpY2VCeUlkID0gZW52LT5HZXRTdGF0aWNNZXRob2RJRCgKKyAgICAgICAgICAgIGpNUDJVdGlsc0NscywgImlzT2ZmbG9hZGVkQXVkaW9QbGF5YmFja1N1cHBvcnRlZCIsICIoSUlJKVoiKTsKKyAgICBqYm9vbGVhbiByZXN1bHQgPSBlbnYtPkNhbGxTdGF0aWNCb29sZWFuTWV0aG9kKAorICAgICAgICAgICAgak1QMlV0aWxzQ2xzLCBqU2V0QXVkaW9PdXRwdXREZXZpY2VCeUlkLCBhdWRpb0Zvcm1hdCwgaW5mby5zYW1wbGVfcmF0ZSwgY2hhbm5lbE1hc2spOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pNZWRpYVBsYXllcjJVdGlscy5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KTWVkaWFQbGF5ZXIyVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2JkNDNjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KTWVkaWFQbGF5ZXIyVXRpbHMuaApAQCAtMCwwICsxLDM1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9KX01FRElBUExBWUVSMl9VVElMUzJfSF8KKyNkZWZpbmUgX0pfTUVESUFQTEFZRVIyX1VUSUxTMl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKworI2luY2x1ZGUgImpuaS5oIgorI2luY2x1ZGUgImFuZHJvaWRfbWVkaWFfQXVkaW9Gb3JtYXQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgSk1lZGlhUGxheWVyMlV0aWxzIHsKKyAgICBzdGF0aWMgYm9vbCBpc09mZmxvYWRlZEF1ZGlvUGxheWJhY2tTdXBwb3J0ZWQoCisgICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEsIGJvb2wgaGFzVmlkZW8sIGJvb2wgaXNTdHJlYW1pbmcsCisgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBfSl9NRURJQVBMQVlFUjJfVVRJTFMyX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pXYWtlTG9jay5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pXYWtlTG9jay5jcHAKaW5kZXggYzlhMTA3MS4uOTgzZDc3ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KV2FrZUxvY2suY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSldha2VMb2NrLmNwcApAQCAtMjAsNTUgKzIwLDUwIEBACiAKICNpbmNsdWRlICJKV2FrZUxvY2suaCIKIAotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPHBvd2VybWFuYWdlci9Qb3dlck1hbmFnZXIuaD4KLQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLS8vVE9ETzogdXNlIEpBVkEgUG93ZXJNYW5hZ2VyLCBpbnN0ZWFkIG9mIGJpbmRlcgotSldha2VMb2NrOjpKV2FrZUxvY2soKSA6Ci0gICAgbVBvd2VyTWFuYWdlcihOVUxMKSwKLSAgICBtV2FrZUxvY2tUb2tlbihOVUxMKSwKK0pXYWtlTG9jazo6Sldha2VMb2NrKGNvbnN0IHNwPEpPYmplY3RIb2xkZXI+ICZjb250ZXh0KSA6CiAgICAgbVdha2VMb2NrQ291bnQoMCksCi0gICAgbURlYXRoUmVjaXBpZW50KG5ldyBQTURlYXRoUmVjaXBpZW50KHRoaXMpKSB7fQorICAgIG1XYWtlTG9jayhOVUxMKSwKKyAgICBtQ29udGV4dChjb250ZXh0KSB7fQogCiBKV2FrZUxvY2s6On5KV2FrZUxvY2soKSB7Ci0gICAgaWYgKG1Qb3dlck1hbmFnZXIgIT0gTlVMTCkgewotICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBJSW50ZXJmYWNlOjphc0JpbmRlcihtUG93ZXJNYW5hZ2VyKTsKLSAgICAgICAgYmluZGVyLT51bmxpbmtUb0RlYXRoKG1EZWF0aFJlY2lwaWVudCk7Ci0gICAgfQotICAgIGNsZWFyUG93ZXJNYW5hZ2VyKCk7CisgICAgY2xlYXJKYXZhV2FrZUxvY2soKTsKIH0KIAogYm9vbCBKV2FrZUxvY2s6OmFjcXVpcmUoKSB7CiAgICAgaWYgKG1XYWtlTG9ja0NvdW50ID09IDApIHsKLSAgICAgICAgQ0hFQ0sobVdha2VMb2NrVG9rZW4gPT0gTlVMTCk7Ci0gICAgICAgIGlmIChtUG93ZXJNYW5hZ2VyID09IE5VTEwpIHsKLSAgICAgICAgICAgIC8vIHVzZSBjaGVja1NlcnZpY2UoKSB0byBhdm9pZCBibG9ja2luZyBpZiBwb3dlciBzZXJ2aWNlIGlzIG5vdCB1cCB5ZXQKLSAgICAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmNoZWNrU2VydmljZShTdHJpbmcxNigicG93ZXIiKSk7Ci0gICAgICAgICAgICBpZiAoYmluZGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY291bGQgbm90IGdldCB0aGUgcG93ZXIgbWFuYWdlciBzZXJ2aWNlIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIgPSBpbnRlcmZhY2VfY2FzdDxJUG93ZXJNYW5hZ2VyPihiaW5kZXIpOwotICAgICAgICAgICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgobURlYXRoUmVjaXBpZW50KTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKG1XYWtlTG9jayA9PSBOVUxMKSB7CisgICAgICAgICAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgICAgICAgICBqY2xhc3MgakNvbnRleHRDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9jb250ZW50L0NvbnRleHQiKTsKKyAgICAgICAgICAgIGpjbGFzcyBqUG93ZXJNYW5hZ2VyQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvb3MvUG93ZXJNYW5hZ2VyIik7CisKKyAgICAgICAgICAgIGptZXRob2RJRCBqR2V0U3lzdGVtU2VydmljZSA9IGVudi0+R2V0TWV0aG9kSUQoakNvbnRleHRDbHMsCisgICAgICAgICAgICAgICAgICAgICJnZXRTeXN0ZW1TZXJ2aWNlIiwgIihMamF2YS9sYW5nL1N0cmluZzspTGphdmEvbGFuZy9PYmplY3Q7Iik7CisgICAgICAgICAgICBqb2JqZWN0IGphdmFQb3dlck1hbmFnZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QobUNvbnRleHQtPmdldEpPYmplY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgakdldFN5c3RlbVNlcnZpY2UsIGVudi0+TmV3U3RyaW5nVVRGKCJwb3dlciIpKTsKKworICAgICAgICAgICAgamZpZWxkSUQgalBBUlRJQUxfV0FLRV9MT0NLID0gZW52LT5HZXRTdGF0aWNGaWVsZElEKGpQb3dlck1hbmFnZXJDbHMsCisgICAgICAgICAgICAgICAgICAgICJQQVJUSUFMX1dBS0VfTE9DSyIsICJJIik7CisgICAgICAgICAgICBqaW50IFBBUlRJQUxfV0FLRV9MT0NLID0gZW52LT5HZXRTdGF0aWNJbnRGaWVsZChqUG93ZXJNYW5hZ2VyQ2xzLCBqUEFSVElBTF9XQUtFX0xPQ0spOworCisgICAgICAgICAgICBqbWV0aG9kSUQgak5ld1dha2VMb2NrID0gZW52LT5HZXRNZXRob2RJRChqUG93ZXJNYW5hZ2VyQ2xzLAorICAgICAgICAgICAgICAgICAgICAibmV3V2FrZUxvY2siLCAiKElMamF2YS9sYW5nL1N0cmluZzspTGFuZHJvaWQvb3MvUG93ZXJNYW5hZ2VyJFdha2VMb2NrOyIpOworICAgICAgICAgICAgam9iamVjdCBqYXZhV2FrZUxvY2sgPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoamF2YVBvd2VyTWFuYWdlck9iaiwKKyAgICAgICAgICAgICAgICAgICAgak5ld1dha2VMb2NrLCBQQVJUSUFMX1dBS0VfTE9DSywgZW52LT5OZXdTdHJpbmdVVEYoIkpXYWtlTG9jayIpKTsKKyAgICAgICAgICAgIG1XYWtlTG9jayA9IG5ldyBKT2JqZWN0SG9sZGVyKGphdmFXYWtlTG9jayk7CisgICAgICAgICAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGphdmFQb3dlck1hbmFnZXJPYmopOworICAgICAgICAgICAgZW52LT5EZWxldGVMb2NhbFJlZihqYXZhV2FrZUxvY2spOwogICAgICAgICB9Ci0gICAgICAgIGlmIChtUG93ZXJNYW5hZ2VyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IG5ldyBCQmluZGVyKCk7Ci0gICAgICAgICAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1Qb3dlck1hbmFnZXItPmFjcXVpcmVXYWtlTG9jaygKLSAgICAgICAgICAgICAgICAgICAgUE9XRVJNQU5BR0VSX1BBUlRJQUxfV0FLRV9MT0NLLAotICAgICAgICAgICAgICAgICAgICBiaW5kZXIsIFN0cmluZzE2KCJKV2FrZUxvY2siKSwgU3RyaW5nMTYoIm1lZGlhIikpOwotICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgbVdha2VMb2NrVG9rZW4gPSBiaW5kZXI7Ci0gICAgICAgICAgICAgICAgbVdha2VMb2NrQ291bnQrKzsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKG1XYWtlTG9jayAhPSBOVUxMKSB7CisgICAgICAgICAgICBKTklFbnYgKmVudiA9IEphdmFWTUhlbHBlcjo6Z2V0Sk5JRW52KCk7CisgICAgICAgICAgICBqY2xhc3Mgd2FrZUxvY2tDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9vcy9Qb3dlck1hbmFnZXIkV2FrZUxvY2siKTsKKyAgICAgICAgICAgIGptZXRob2RJRCBqQWNxdWlyZSA9IGVudi0+R2V0TWV0aG9kSUQod2FrZUxvY2tDbHMsICJhY3F1aXJlIiwgIigpViIpOworICAgICAgICAgICAgZW52LT5DYWxsVm9pZE1ldGhvZChtV2FrZUxvY2stPmdldEpPYmplY3QoKSwgakFjcXVpcmUpOworICAgICAgICAgICAgbVdha2VMb2NrQ291bnQrKzsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgbVdha2VMb2NrQ291bnQrKzsKQEAgLTg2LDI1ICs4MSwxNyBAQAogICAgICAgICBtV2FrZUxvY2tDb3VudCA9IDE7CiAgICAgfQogICAgIGlmICgtLW1XYWtlTG9ja0NvdW50ID09IDApIHsKLSAgICAgICAgQ0hFQ0sobVdha2VMb2NrVG9rZW4gIT0gTlVMTCk7Ci0gICAgICAgIGlmIChtUG93ZXJNYW5hZ2VyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgICAgICAgICAgbVBvd2VyTWFuYWdlci0+cmVsZWFzZVdha2VMb2NrKG1XYWtlTG9ja1Rva2VuLCAwIC8qIGZsYWdzICovKTsKLSAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgICAgICBpZiAobVdha2VMb2NrICE9IE5VTEwpIHsKKyAgICAgICAgICAgIEpOSUVudiAqZW52ID0gSmF2YVZNSGVscGVyOjpnZXRKTklFbnYoKTsKKyAgICAgICAgICAgIGpjbGFzcyB3YWtlTG9ja0NscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL29zL1Bvd2VyTWFuYWdlciRXYWtlTG9jayIpOworICAgICAgICAgICAgam1ldGhvZElEIGpSZWxlYXNlID0gZW52LT5HZXRNZXRob2RJRCh3YWtlTG9ja0NscywgInJlbGVhc2UiLCAiKClWIik7CisgICAgICAgICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1XYWtlTG9jay0+Z2V0Sk9iamVjdCgpLCBqUmVsZWFzZSk7CiAgICAgICAgIH0KLSAgICAgICAgbVdha2VMb2NrVG9rZW4uY2xlYXIoKTsKICAgICB9CiB9CiAKLXZvaWQgSldha2VMb2NrOjpjbGVhclBvd2VyTWFuYWdlcigpIHsKK3ZvaWQgSldha2VMb2NrOjpjbGVhckphdmFXYWtlTG9jaygpIHsKICAgICByZWxlYXNlKHRydWUpOwotICAgIG1Qb3dlck1hbmFnZXIuY2xlYXIoKTsKLX0KLQotdm9pZCBKV2FrZUxvY2s6OlBNRGVhdGhSZWNpcGllbnQ6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkgewotICAgIGlmIChtV2FrZUxvY2sgIT0gTlVMTCkgewotICAgICAgICBtV2FrZUxvY2stPmNsZWFyUG93ZXJNYW5hZ2VyKCk7Ci0gICAgfQogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KV2FrZUxvY2suaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSldha2VMb2NrLmgKaW5kZXggZWFjZTg3ZS4uMzZjNTQyZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9KV2FrZUxvY2suaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pXYWtlTG9jay5oCkBAIC0xOCw3ICsxOCw3IEBACiAjZGVmaW5lIEpfV0FLRUxPQ0tfSF8KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxwb3dlcm1hbmFnZXIvSVBvd2VyTWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KT2JqZWN0SG9sZGVyLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0yNiw3ICsyNiw3IEBACiBjbGFzcyBKV2FrZUxvY2sgOiBwdWJsaWMgUmVmQmFzZSB7CiAKIHB1YmxpYzoKLSAgICBKV2FrZUxvY2soKTsKKyAgICBKV2FrZUxvY2soY29uc3Qgc3A8Sk9iamVjdEhvbGRlcj4gJmNvbnRleHQpOwogCiAgICAgLy8gTk9URTogYWNxdWlyZSBhbmQgcmVsZWFzZSBhcmUgbm90IHRocmVhZCBzYWZlCiAKQEAgLTM3LDI4ICszNywxMSBAQAogICAgIHZpcnR1YWwgfkpXYWtlTG9jaygpOwogCiBwcml2YXRlOgotICAgIHNwPElQb3dlck1hbmFnZXI+IG1Qb3dlck1hbmFnZXI7Ci0gICAgc3A8SUJpbmRlcj4gICAgICAgbVdha2VMb2NrVG9rZW47Ci0gICAgdWludDMyX3QgICAgICAgICAgbVdha2VMb2NrQ291bnQ7CisgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVdha2VMb2NrQ291bnQ7CisgICAgc3A8Sk9iamVjdEhvbGRlcj4gICAgICAgbVdha2VMb2NrOworICAgIGNvbnN0IHNwPEpPYmplY3RIb2xkZXI+IG1Db250ZXh0OwogCi0gICAgY2xhc3MgUE1EZWF0aFJlY2lwaWVudCA6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7Ci0gICAgcHVibGljOgotICAgICAgICBleHBsaWNpdCBQTURlYXRoUmVjaXBpZW50KEpXYWtlTG9jayAqd2FrZUxvY2spIDogbVdha2VMb2NrKHdha2VMb2NrKSB7fQotICAgICAgICB2aXJ0dWFsIH5QTURlYXRoUmVjaXBpZW50KCkge30KLQotICAgICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAotICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmd2hvKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIFBNRGVhdGhSZWNpcGllbnQoY29uc3QgUE1EZWF0aFJlY2lwaWVudCYpOwotICAgICAgICBQTURlYXRoUmVjaXBpZW50JiBvcGVyYXRvcj0gKGNvbnN0IFBNRGVhdGhSZWNpcGllbnQmKTsKLQotICAgICAgICBKV2FrZUxvY2sgKm1XYWtlTG9jazsKLSAgICB9OwotCi0gICAgY29uc3Qgc3A8UE1EZWF0aFJlY2lwaWVudD4gbURlYXRoUmVjaXBpZW50OwotCi0gICAgdm9pZCBjbGVhclBvd2VyTWFuYWdlcigpOworICAgIHZvaWQgY2xlYXJKYXZhV2FrZUxvY2soKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEpXYWtlTG9jayk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjIuY3BwCmluZGV4IDA2MGI2OTguLmQ2MDhkNGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMi5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlICJOdVBsYXllcjIuaCIKIAogI2luY2x1ZGUgIkhUVFBMaXZlU291cmNlMi5oIgorI2luY2x1ZGUgIkpNZWRpYVBsYXllcjJVdGlscy5oIgogI2luY2x1ZGUgIk51UGxheWVyMkNDRGVjb2Rlci5oIgogI2luY2x1ZGUgIk51UGxheWVyMkRlY29kZXIuaCIKICNpbmNsdWRlICJOdVBsYXllcjJEZWNvZGVyQmFzZS5oIgpAQCAtMzMsNyArMzQsNyBAQAogI2luY2x1ZGUgIk51UGxheWVyMlNvdXJjZS5oIgogI2luY2x1ZGUgIlJUU1BTb3VyY2UyLmgiCiAjaW5jbHVkZSAiR2VuZXJpY1NvdXJjZTIuaCIKLSNpbmNsdWRlICJUZXh0RGVzY3JpcHRpb25zLmgiCisjaW5jbHVkZSAiVGV4dERlc2NyaXB0aW9uczIuaCIKIAogI2luY2x1ZGUgIkFUU1BhcnNlci5oIgogCkBAIC0yMDgsMTUgKzIwOSwxNiBAQAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1OdVBsYXllcjI6Ok51UGxheWVyMihwaWRfdCBwaWQsIHVpZF90IHVpZCwgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2spCitOdVBsYXllcjI6Ok51UGxheWVyMigKKyAgICAgICAgcGlkX3QgcGlkLCB1aWRfdCB1aWQsIGNvbnN0IHNwPE1lZGlhQ2xvY2s+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+Z2V0VHJhY2tJbmZvKHRyYWNrSW5kZXgpOworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gaW5mbyA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRUcmFja0luZm8odHJhY2tJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChpbmZvICE9IE5VTEwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmZvLT5maW5kSW50MzIoInR5cGUiLCAmdHlwZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0eXBlID09IE1FRElBX1RSQUNLX1RZUEVfVElNRURURVhUKSB7CkBAIC04ODEsMTQgKzkzMiwxNCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7Ci0gICAgICAgICAgICBpZiAobURyaXZlciAhPSBOVUxMICYmIG1Tb3VyY2UtPmdldER1cmF0aW9uKCZkdXJhdGlvblVzKSA9PSBPSykgeworICAgICAgICAgICAgaWYgKG1Ecml2ZXIgIT0gTlVMTCAmJiBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LKSB7CiAgICAgICAgICAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKICAgICAgICAgICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlEdXJhdGlvbihtU3JjSWQsIGR1cmF0aW9uVXMpOworICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUR1cmF0aW9uKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIGR1cmF0aW9uVXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbXNnLT5wb3N0KDEwMDAwMDBsbCk7ICAvLyBwb2xsIGFnYWluIGluIGEgc2Vjb25kLgorICAgICAgICAgICAgbXNnLT5wb3N0KDEwMDAwMDBMTCk7ICAvLyBwb2xsIGFnYWluIGluIGEgc2Vjb25kLgogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtOTAxLDEzICs5NTIsMTUgQEAKIAogICAgICAgICAgICAgQUxPR0QoIm9uU2V0VmlkZW9TdXJmYWNlKCVwLCAlcyB2aWRlbyBkZWNvZGVyKSIsCiAgICAgICAgICAgICAgICAgICAgIChud3cgPT0gTlVMTCA/IE5VTEwgOiBud3ctPmdldEFOYXRpdmVXaW5kb3coKSksCi0gICAgICAgICAgICAgICAgICAgIChtU291cmNlICE9IE5VTEwgJiYgbVN0YXJ0ZWQgJiYgbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSAhPSBOVUxMCisgICAgICAgICAgICAgICAgICAgIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSAhPSBOVUxMICYmIG1TdGFydGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgIT0gTlVMTAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1WaWRlb0RlY29kZXIgIT0gTlVMTCkgPyAiaGF2ZSIgOiAibm8iKTsKIAotICAgICAgICAgICAgLy8gTmVlZCB0byBjaGVjayBtU3RhcnRlZCBiZWZvcmUgY2FsbGluZyBtU291cmNlLT5nZXRGb3JtYXQgYmVjYXVzZSBOdVBsYXllcjIgbWlnaHQKLSAgICAgICAgICAgIC8vIGJlIGluIHByZXBhcmluZyBzdGF0ZSBhbmQgaXQgY291bGQgdGFrZSBsb25nIHRpbWUuCi0gICAgICAgICAgICAvLyBXaGVuIG1TdGFydGVkIGlzIHRydWUsIG1Tb3VyY2UgbXVzdCBoYXZlIGJlZW4gc2V0LgotICAgICAgICAgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCB8fCAhbVN0YXJ0ZWQgfHwgbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSA9PSBOVUxMCisgICAgICAgICAgICAvLyBOZWVkIHRvIGNoZWNrIG1TdGFydGVkIGJlZm9yZSBjYWxsaW5nIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXQKKyAgICAgICAgICAgIC8vIGJlY2F1c2UgTnVQbGF5ZXIyIG1pZ2h0IGJlIGluIHByZXBhcmluZyBzdGF0ZSBhbmQgaXQgY291bGQgdGFrZSBsb25nIHRpbWUuCisgICAgICAgICAgICAvLyBXaGVuIG1TdGFydGVkIGlzIHRydWUsIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlIG11c3QgaGF2ZSBiZWVuIHNldC4KKyAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSA9PSBOVUxMIHx8ICFtU3RhcnRlZAorICAgICAgICAgICAgICAgICAgICB8fCBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSA9PSBOVUxMCiAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IG1WaWRlb0RlY29kZXIncyBtTmF0aXZlV2luZG93IGlzIGFsd2F5cyBub24tbnVsbAogICAgICAgICAgICAgICAgICAgICB8fCAobVZpZGVvRGVjb2RlciAhPSBOVUxMICYmIG1WaWRlb0RlY29kZXItPnNldFZpZGVvU3VyZmFjZShud3cpID09IE9LKSkgewogICAgICAgICAgICAgICAgIHBlcmZvcm1TZXRTdXJmYWNlKG53dyk7CkBAIC05NzEsMTAgKzEwMjQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgb25SZXN1bWUoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG9uU3RhcnQoKTsKKyAgICAgICAgICAgICAgICBvblN0YXJ0KHRydWUgLyogcGxheSAqLyk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtUGF1c2VkQnlDbGllbnQgPSBmYWxzZTsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1NUQVJURUQsIDAsIDApOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX1NUQVJURUQsIDAsIDApOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtOTg4LDggKzEwNDEsNyBAQAogICAgICAgICAgICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgLy8gQXVkaW9TaW5rIGFsbG93cyBvbmx5IDEuZiBhbmQgMC5mIGZvciBvZmZsb2FkIG1vZGUuCiAgICAgICAgICAgICAgICAgLy8gRm9yIG90aGVyIHNwZWVkLCBzd2l0Y2ggdG8gbm9uLW9mZmxvYWQgbW9kZS4KLSAgICAgICAgICAgICAgICBpZiAobU9mZmxvYWRBdWRpbyAmJiAoKHJhdGUubVNwZWVkICE9IDAuZiAmJiByYXRlLm1TcGVlZCAhPSAxLmYpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCByYXRlLm1QaXRjaCAhPSAxLmYpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1PZmZsb2FkQXVkaW8gJiYgKHJhdGUubVNwZWVkICE9IDEuZiB8fCByYXRlLm1QaXRjaCAhPSAxLmYpKSB7CiAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY3VycmVudFBvc2l0aW9uVXM7CiAgICAgICAgICAgICAgICAgICAgIGlmIChnZXRDdXJyZW50UG9zaXRpb24oJmN1cnJlbnRQb3NpdGlvblVzKSAhPSBPSykgewogICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uVXMgPSBtUHJldmlvdXNTZWVrVGltZVVzOwpAQCAtMTAxMiwzNiArMTA2NCwxNSBAQAogICAgICAgICAgICAgICAgIGVyciA9IG1SZW5kZXJlci0+c2V0UGxheWJhY2tTZXR0aW5ncyhyYXRlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICBpZiAocmF0ZS5tU3BlZWQgPT0gMC5mKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uUGF1c2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfUEFVU0VELCAwLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgbVBhdXNlZEJ5Q2xpZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSBhbGwgb3RoZXIgc2V0dGluZ3MgKHVzaW5nIG5vbi1wYXVzZWQgc3BlZWQpCi0gICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIGNhbiByZXN0b3JlIHRoZW0gb24gc3RhcnQKLSAgICAgICAgICAgICAgICAgICAgQXVkaW9QbGF5YmFja1JhdGUgbmV3UmF0ZSA9IHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1JhdGUubVNwZWVkID0gbVBsYXliYWNrU2V0dGluZ3MubVNwZWVkOwotICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2tTZXR0aW5ncyA9IG5ld1JhdGU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsgLyogcmF0ZS5tU3BlZWQgIT0gMC5mICovCi0gICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja1NldHRpbmdzID0gcmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgcmVzdW1lIHlldCBpZiB0aGUgc291cmNlIGlzIHN0aWxsIGJ1ZmZlcmluZwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtUGF1c2VkRm9yQnVmZmVyaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25SZXN1bWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUHJlcGFyZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9uU3RhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1QbGF5YmFja1NldHRpbmdzID0gcmF0ZTsKIAotICAgICAgICAgICAgICAgICAgICBtUGF1c2VkQnlDbGllbnQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAobVZpZGVvRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBwYXJhbXMgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgicGxheWJhY2stc3BlZWQiLCBtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQpOworICAgICAgICAgICAgICAgICAgICBtVmlkZW9EZWNvZGVyLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAobVZpZGVvRGVjb2RlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHBhcmFtcyA9IG5ldyBBTWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInBsYXliYWNrLXNwZWVkIiwgbVBsYXliYWNrU2V0dGluZ3MubVNwZWVkKTsKLSAgICAgICAgICAgICAgICBtVmlkZW9EZWNvZGVyLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcyk7Ci0gICAgICAgICAgICB9Ci0KICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKICAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7CkBAIC0xMDYxLDkgKzEwOTIsNiBAQAogICAgICAgICAgICAgICAgIC8vIGdldCBwbGF5YmFjayBzZXR0aW5ncyB1c2VkIGJ5IHJlbmRlcmVyLCBhcyBpdCBtYXkgYmUKICAgICAgICAgICAgICAgICAvLyBzbGlnaHRseSBvZmYgZHVlIHRvIGF1ZGlvc2luayBub3QgdGFraW5nIHNtYWxsIGNoYW5nZXMuCiAgICAgICAgICAgICAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSByYXRlOwotICAgICAgICAgICAgICAgIGlmIChtUGF1c2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJhdGUubVNwZWVkID0gMC5mOwotICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKQEAgLTExNTcsMjggKzExODUsMjkgQEAKICAgICAgICAgICAgICAgICAgICAgJiYgKG1BdWRpb0RlY29kZXIgIT0gTlVMTCB8fCBtVmlkZW9EZWNvZGVyICE9IE5VTEwpKSB7CiAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSd2ZSBmb3VuZCBhbnl0aGluZyBwbGF5YWJsZS4KIAotICAgICAgICAgICAgICAgIGlmIChtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikgeworICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX0RZTkFNSUNfRFVSQVRJT04pIHsKICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVQb2xsRHVyYXRpb24oKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHN0YXR1c190IGVycjsKLSAgICAgICAgICAgIGlmICgoZXJyID0gbVNvdXJjZS0+ZmVlZE1vcmVUU0RhdGEoKSkgIT0gT0spIHsKKyAgICAgICAgICAgIGlmICgoZXJyID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmZlZWRNb3JlVFNEYXRhKCkpICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb0RlY29kZXIgPT0gTlVMTCAmJiBtVmlkZW9EZWNvZGVyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgbm90IGN1cnJlbnRseSBkZWNvZGluZyBhbnl0aGluZyAobm8gYXVkaW8gb3IKICAgICAgICAgICAgICAgICAgICAgLy8gdmlkZW8gdHJhY2tzIGZvdW5kKSBhbmQgd2UganVzdCByYW4gb3V0IG9mIGlucHV0IGRhdGEuCiAKICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9QTEFZQkFDS19DT01QTEVURSwgMCwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfUExBWUJBQ0tfQ09NUExFVEUsIDAsIDApOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIGVycik7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChyZXNjYW4pIHsKLSAgICAgICAgICAgICAgICBtc2ctPnBvc3QoMTAwMDAwbGwpOworICAgICAgICAgICAgICAgIG1zZy0+cG9zdCgxMDAwMDBMTCk7CiAgICAgICAgICAgICAgICAgbVNjYW5Tb3VyY2VzUGVuZGluZyA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKQEAgLTEyNTMsMTMgKzEyODIsMTQgQEAKICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSk7CiAKICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gaW5wdXRGb3JtYXQgPQotICAgICAgICAgICAgICAgICAgICAgICAgbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pOwogCiAgICAgICAgICAgICAgICAgc2V0VmlkZW9TY2FsaW5nTW9kZShtVmlkZW9TY2FsaW5nTW9kZSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlVmlkZW9TaXplKG1TcmNJZCwgaW5wdXRGb3JtYXQsIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgdXBkYXRlVmlkZW9TaXplKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIGlucHV0Rm9ybWF0LCBmb3JtYXQpOwogICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IERlY29kZXJCYXNlOjprV2hhdFNodXRkb3duQ29tcGxldGVkKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIiVzIHNodXRkb3duIGNvbXBsZXRlZCIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOwogICAgICAgICAgICAgICAgIGlmIChhdWRpbykgeworICAgICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobURlY29kZXJMb2NrKTsKICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRGVjb2Rlci5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgICBtQXVkaW9EZWNvZGVyRXJyb3IgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgKyttQXVkaW9EZWNvZGVyR2VuZXJhdGlvbjsKQEAgLTEyNjcsNiArMTI5Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKChpbnQpbUZsdXNoaW5nQXVkaW8sIChpbnQpU0hVVFRJTkdfRE9XTl9ERUNPREVSKTsKICAgICAgICAgICAgICAgICAgICAgbUZsdXNoaW5nQXVkaW8gPSBTSFVUX0RPV047CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1EZWNvZGVyTG9jayk7CiAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0RlY29kZXIuY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICAgbVZpZGVvRGVjb2RlckVycm9yID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICsrbVZpZGVvRGVjb2RlckdlbmVyYXRpb247CkBAIC0xMzIzLDI4ICsxMzU0LDM5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsgIC8vIFNob3VsZCBub3Qgb2NjdXIuCiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgIC8vIEZpbmlzaCBhbnl3YXlzLgogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVZpZGVvRGVjb2RlckVycm9yIHx8IG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgPT0gTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtTmF0aXZlV2luZG93ID09IE5VTEwgfHwgbU5hdGl2ZVdpbmRvdy0+Z2V0QU5hdGl2ZVdpbmRvdygpID09IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVmlkZW9EZWNvZGVyRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgPT0gTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtTmF0aXZlV2luZG93ID09IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbU5hdGl2ZVdpbmRvdy0+Z2V0QU5hdGl2ZVdpbmRvdygpID09IE5VTEwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbVZpZGVvRGVjb2RlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBib3RoIGF1ZGlvIGFuZCB2aWRlbyBoYXZlIGVycm9yLCBvciB0aGlzIHN0cmVhbSBoYXMgb25seSBhdWRpbwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGhhcyBlcnJvciwgbm90aWZ5IGNsaWVudCBvZiBlcnJvci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfRVJST1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQTJfRVJST1JfVU5LTk9XTiwgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBhdWRpbyB0cmFjayBoYXMgZXJyb3IuIFZpZGVvIHRyYWNrIGNvdWxkIGJlIHN0aWxsIGdvb2QgdG8gcGxheS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19QTEFZX0FVRElPX0VSUk9SLCBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQTJfSU5GT19QTEFZX0FVRElPX0VSUk9SLCBlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRGVjb2RlckVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQXVkaW9EZWNvZGVyRXJyb3IgfHwgbVNvdXJjZS0+Z2V0Rm9ybWF0KHRydWUgLyogYXVkaW8gKi8pID09IE5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQXVkaW9EZWNvZGVyRXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZvcm1hdCh0cnVlIC8qIGF1ZGlvICovKSA9PSBOVUxMCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1BdWRpb1NpbmsgPT0gTlVMTCB8fCBtQXVkaW9EZWNvZGVyID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIGJvdGggYXVkaW8gYW5kIHZpZGVvIGhhdmUgZXJyb3IsIG9yIHRoaXMgc3RyZWFtIGhhcyBvbmx5IHZpZGVvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggaGFzIGVycm9yLCBub3RpZnkgY2xpZW50IG9mIGVycm9yLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBMl9FUlJPUl9VTktOT1dOLCBlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHZpZGVvIHRyYWNrIGhhcyBlcnJvci4gQXVkaW8gdHJhY2sgY291bGQgYmUgc3RpbGwgZ29vZCB0byBwbGF5LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX1BMQVlfVklERU9fRVJST1IsIGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfSU5GTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBMl9JTkZPX1BMQVlfVklERU9fRVJST1IsIGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9EZWNvZGVyRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC0xMzk0LDEyICsxNDM2LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIiwgZmluYWxSZXN1bHQpOwogCiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TcmNJZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgZmluYWxSZXN1bHQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQTJfRVJST1JfVU5LTk9XTiwgZmluYWxSZXN1bHQpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmICgobUF1ZGlvRU9TIHx8IG1BdWRpb0RlY29kZXIgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgICAgICYmIChtVmlkZW9FT1MgfHwgbVZpZGVvRGVjb2RlciA9PSBOVUxMKSkgewotICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9QTEFZQkFDS19DT01QTEVURSwgMCwgMCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9QTEFZQkFDS19DT01QTEVURSwgMCwgMCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IFJlbmRlcmVyOjprV2hhdEZsdXNoQ29tcGxldGUpIHsKICAgICAgICAgICAgICAgICBpbnQzMl90IGF1ZGlvOwpAQCAtMTQyMCwxMCArMTQ2MywxMSBAQAogICAgICAgICAgICAgICAgIGhhbmRsZUZsdXNoQ29tcGxldGUoYXVkaW8sIGZhbHNlIC8qIGlzRGVjb2RlciAqLyk7CiAgICAgICAgICAgICAgICAgZmluaXNoRmx1c2hJZlBvc3NpYmxlKCk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gUmVuZGVyZXI6OmtXaGF0VmlkZW9SZW5kZXJpbmdTdGFydCkgewotICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX1ZJREVPX1JFTkRFUklOR19TVEFSVCwgMCk7CisgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0lORk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUEyX0lORk9fVklERU9fUkVOREVSSU5HX1NUQVJULCAwKTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRNZWRpYVJlbmRlcmluZ1N0YXJ0KSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIm1lZGlhIHJlbmRlcmluZyBzdGFydGVkIik7Ci0gICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfU1RBUlRFRCwgMCwgMCk7CisgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX1NUQVJURUQsIDAsIDApOwogICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IFJlbmRlcmVyOjprV2hhdEF1ZGlvVGVhckRvd24pIHsKICAgICAgICAgICAgICAgICBpbnQzMl90IHJlYXNvbjsKICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVhc29uIiwgJnJlYXNvbikpOwpAQCAtMTQ3Niw3ICsxNTIwLDcgQEAKICAgICAgICAgICAgIGludDY0X3QgdGltZXJVczsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lclVzIiwgJnRpbWVyVXMpKTsKIAotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfTk9USUZZX1RJTUUsIHRpbWVyVXMsIDApOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX05PVElGWV9USU1FLCB0aW1lclVzLCAwKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTE0OTUsMjAgKzE1MzksMjAgQEAKICAgICAgICAgICAgIGlmICghbVN0YXJ0ZWQpIHsKICAgICAgICAgICAgICAgICBpZiAoIW1Tb3VyY2VTdGFydGVkKSB7CiAgICAgICAgICAgICAgICAgICAgIG1Tb3VyY2VTdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgbVNvdXJjZS0+c3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnN0YXJ0KCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChzZWVrVGltZVVzID4gMCkgewogICAgICAgICAgICAgICAgICAgICBwZXJmb3JtU2VlayhzZWVrVGltZVVzLCAoTWVkaWFQbGF5ZXIyU2Vla01vZGUpbW9kZSk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKG5lZWROb3RpZnkpIHsKLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5RHJpdmVyU2Vla0NvbXBsZXRlKG1TcmNJZCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeURyaXZlclNlZWtDb21wbGV0ZShtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIHNlZWtzIGNhbiB0YWtlIGEgd2hpbGUsIHNvIHdlIGVzc2VudGlhbGx5IHBhdXNlZAotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfUEFVU0VELCAwLCAwKTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9QQVVTRUQsIDAsIDApOwogCiAgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKICAgICAgICAgICAgICAgICAgICAgbmV3IEZsdXNoRGVjb2RlckFjdGlvbihGTFVTSF9DTURfRkxVU0ggLyogYXVkaW8gKi8sCkBAIC0xNTI3LDEwICsxNTcxLDQ5IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXRSZXdpbmQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFMT0dWKCJrV2hhdFJld2luZCIpOworCisgICAgICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXMgPSBtQ3VycmVudFNvdXJjZUluZm8ubVN0YXJ0VGltZVVzOworICAgICAgICAgICAgaW50MzJfdCBtb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfQ0xPU0VTVDsKKworICAgICAgICAgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICAgICAgICAgIGlmICghbVNvdXJjZVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbVNvdXJjZVN0YXJ0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+c3RhcnQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcGVyZm9ybVNlZWsoc2Vla1RpbWVVcywgKE1lZGlhUGxheWVyMlNlZWtNb2RlKW1vZGUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzZWVrcyBjYW4gdGFrZSBhIHdoaWxlLCBzbyB3ZSBlc3NlbnRpYWxseSBwYXVzZWQKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9QQVVTRUQsIDAsIDApOworCisgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgbmV3IEZsdXNoRGVjb2RlckFjdGlvbihGTFVTSF9DTURfRkxVU0ggLyogYXVkaW8gKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxVU0hfQ01EX0ZMVVNIIC8qIHZpZGVvICovKSk7CisKKyAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBuZXcgU2Vla0FjdGlvbihzZWVrVGltZVVzLCAoTWVkaWFQbGF5ZXIyU2Vla01vZGUpbW9kZSkpOworCisgICAgICAgICAgICAvLyBBZnRlciBhIGZsdXNoIHdpdGhvdXQgc2h1dGRvd24sIGRlY29kZXIgaXMgcGF1c2VkLgorICAgICAgICAgICAgLy8gRG9uJ3QgcmVzdW1lIGl0IHVudGlsIHNvdXJjZSBzZWVrIGlzIGRvbmUsIG90aGVyd2lzZSBpdCBjb3VsZAorICAgICAgICAgICAgLy8gc3RhcnQgcHVsbGluZyBzdGFsZSBkYXRhIHRvbyBzb29uLgorICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgIG5ldyBSZXN1bWVEZWNvZGVyQWN0aW9uKGZhbHNlIC8qIG5lZWROb3RpZnkgKi8pKTsKKworICAgICAgICAgICAgcHJvY2Vzc0RlZmVycmVkQWN0aW9ucygpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIGtXaGF0UGF1c2U6CiAgICAgICAgIHsKKyAgICAgICAgICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgICAgICAgICBvblN0YXJ0KGZhbHNlIC8qIHBsYXkgKi8pOworICAgICAgICAgICAgfQogICAgICAgICAgICAgb25QYXVzZSgpOwotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfUEFVU0VELCAwLCAwKTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9QQVVTRUQsIDAsIDApOwogICAgICAgICAgICAgbVBhdXNlZEJ5Q2xpZW50ID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xNTYxLDcgKzE2NDQsNyBAQAogCiAgICAgICAgIGNhc2Uga1doYXRSZWxlYXNlRHJtOgogICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvblJlbGVhc2VEcm0oKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG9uUmVsZWFzZURybShtc2cpOwogCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CiAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoInN0YXR1cyIsIHN0YXR1cyk7CkBAIC0xNTgzLDggKzE2NjYsOCBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIG1QYXVzZWQgPSBmYWxzZTsKLSAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1Tb3VyY2UtPnJlc3VtZSgpOworICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5yZXN1bWUoKTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVygicmVzdW1lIGNhbGxlZCB3aGVuIHNvdXJjZSBpcyBnb25lIG9yIG5vdCBzZXQiKTsKICAgICB9CkBAIC0xNjAyLDEyICsxNjg1LDEyIEBACiAgICAgc3RhcnRQbGF5YmFja1RpbWVyKCJvbnJlc3VtZSIpOwogfQogCi12b2lkIE51UGxheWVyMjo6b25TdGFydCgpIHsKLSAgICBBTE9HVigib25TdGFydDogbUNyeXB0bzogJXAiLCBtQ3J5cHRvLmdldCgpKTsKK3ZvaWQgTnVQbGF5ZXIyOjpvblN0YXJ0KGJvb2wgcGxheSkgeworICAgIEFMT0dWKCJvblN0YXJ0OiBtQ3J5cHRvOiAlcCIsIG1DdXJyZW50U291cmNlSW5mby5tQ3J5cHRvLmdldCgpKTsKIAogICAgIGlmICghbVNvdXJjZVN0YXJ0ZWQpIHsKICAgICAgICAgbVNvdXJjZVN0YXJ0ZWQgPSB0cnVlOwotICAgICAgICBtU291cmNlLT5zdGFydCgpOworICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+c3RhcnQoKTsKICAgICB9CiAKICAgICBtT2ZmbG9hZEF1ZGlvID0gZmFsc2U7CkBAIC0xNjE4LDIyICsxNzAxLDIzIEBACiAKICAgICB1aW50MzJfdCBmbGFncyA9IDA7CiAKLSAgICBpZiAobVNvdXJjZS0+aXNSZWFsVGltZSgpKSB7CisgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5pc1JlYWxUaW1lKCkpIHsKICAgICAgICAgZmxhZ3MgfD0gUmVuZGVyZXI6OkZMQUdfUkVBTF9USU1FOwogICAgIH0KIAotICAgIGJvb2wgaGFzQXVkaW8gPSAobVNvdXJjZS0+Z2V0Rm9ybWF0KHRydWUgLyogYXVkaW8gKi8pICE9IE5VTEwpOwotICAgIGJvb2wgaGFzVmlkZW8gPSAobVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSAhPSBOVUxMKTsKKyAgICBib29sIGhhc0F1ZGlvID0gKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXQodHJ1ZSAvKiBhdWRpbyAqLykgIT0gTlVMTCk7CisgICAgYm9vbCBoYXNWaWRlbyA9IChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKSAhPSBOVUxMKTsKICAgICBpZiAoIWhhc0F1ZGlvICYmICFoYXNWaWRlbykgewogICAgICAgICBBTE9HRSgibm8gbWV0YWRhdGEgZm9yIGVpdGhlciBhdWRpbyBvciB2aWRlbyBzb3VyY2UiKTsKLSAgICAgICAgbVNvdXJjZS0+c3RvcCgpOworICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+c3RvcCgpOwogICAgICAgICBtU291cmNlU3RhcnRlZCA9IGZhbHNlOwotICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIEVSUk9SX01BTEZPUk1FRCk7CisgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9FUlJPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgTUVESUEyX0VSUk9SX1VOS05PV04sIEVSUk9SX01BTEZPUk1FRCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgQUxPR1ZfSUYoIWhhc0F1ZGlvLCAibm8gbWV0YWRhdGEgZm9yIGF1ZGlvIHNvdXJjZSIpOyAgLy8gdmlkZW8gb25seSBzdHJlYW0KIAotICAgIHNwPE1ldGFEYXRhPiBhdWRpb01ldGEgPSBtU291cmNlLT5nZXRGb3JtYXRNZXRhKHRydWUgLyogYXVkaW8gKi8pOworICAgIHNwPE1ldGFEYXRhPiBhdWRpb01ldGEgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0TWV0YSh0cnVlIC8qIGF1ZGlvICovKTsKIAogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9NVVNJQzsKICAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMKSB7CkBAIC0xNjQxLDExICsxNzI1LDEyIEBACiAgICAgfQogCiAgICAgbU9mZmxvYWRBdWRpbyA9Ci0gICAgICAgIGNhbk9mZmxvYWRTdHJlYW0oYXVkaW9NZXRhLCBoYXNWaWRlbywgbVNvdXJjZS0+aXNTdHJlYW1pbmcoKSwgc3RyZWFtVHlwZSkKKyAgICAgICAgSk1lZGlhUGxheWVyMlV0aWxzOjppc09mZmxvYWRlZEF1ZGlvUGxheWJhY2tTdXBwb3J0ZWQoCisgICAgICAgICAgICAgICAgYXVkaW9NZXRhLCBoYXNWaWRlbywgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmlzU3RyZWFtaW5nKCksIHN0cmVhbVR5cGUpCiAgICAgICAgICAgICAgICAgJiYgKG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZCA9PSAxLmYgJiYgbVBsYXliYWNrU2V0dGluZ3MubVBpdGNoID09IDEuZik7CiAKICAgICAvLyBNb2R1bGFyIERSTTogRGlzYWJsaW5nIGF1ZGlvIG9mZmxvYWQgaWYgdGhlIHNvdXJjZSBpcyBwcm90ZWN0ZWQKLSAgICBpZiAobU9mZmxvYWRBdWRpbyAmJiBtSXNEcm1Qcm90ZWN0ZWQpIHsKKyAgICBpZiAobU9mZmxvYWRBdWRpbyAmJiBtQ3VycmVudFNvdXJjZUluZm8ubUlzRHJtUHJvdGVjdGVkKSB7CiAgICAgICAgIG1PZmZsb2FkQXVkaW8gPSBmYWxzZTsKICAgICAgICAgQUxPR1YoIm9uU3RhcnQ6IERpc2FibGluZyBtT2ZmbG9hZEF1ZGlvIG5vdyB0aGF0IHRoZSBzb3VyY2UgaXMgcHJvdGVjdGVkLiIpOwogICAgIH0KQEAgLTE2NTcsMTcgKzE3NDIsMTcgQEAKICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVuZGVyZXJOb3RpZnksIHRoaXMpOwogICAgICsrbVJlbmRlcmVyR2VuZXJhdGlvbjsKICAgICBub3RpZnktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVJlbmRlcmVyR2VuZXJhdGlvbik7Ci0gICAgbVJlbmRlcmVyID0gbmV3IFJlbmRlcmVyKG1BdWRpb1NpbmssIG1NZWRpYUNsb2NrLCBub3RpZnksIGZsYWdzKTsKKyAgICBtUmVuZGVyZXIgPSBuZXcgUmVuZGVyZXIobUF1ZGlvU2luaywgbU1lZGlhQ2xvY2ssIG5vdGlmeSwgbUNvbnRleHQsIGZsYWdzKTsKICAgICBtUmVuZGVyZXJMb29wZXIgPSBuZXcgQUxvb3BlcjsKLSAgICBtUmVuZGVyZXJMb29wZXItPnNldE5hbWUoIk51UGxheWVyUmVuZGVyZXIiKTsKLSAgICBtUmVuZGVyZXJMb29wZXItPnN0YXJ0KGZhbHNlLCBmYWxzZSwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7CisgICAgbVJlbmRlcmVyTG9vcGVyLT5zZXROYW1lKCJOdVBsYXllcjJSZW5kZXJlciIpOworICAgIG1SZW5kZXJlckxvb3Blci0+c3RhcnQoZmFsc2UsIHRydWUsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwogICAgIG1SZW5kZXJlckxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1SZW5kZXJlcik7CiAKICAgICBzdGF0dXNfdCBlcnIgPSBtUmVuZGVyZXItPnNldFBsYXliYWNrU2V0dGluZ3MobVBsYXliYWNrU2V0dGluZ3MpOwogICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgbVNvdXJjZS0+c3RvcCgpOworICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+c3RvcCgpOwogICAgICAgICBtU291cmNlU3RhcnRlZCA9IGZhbHNlOwotICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIGVycik7CisgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIGVycik7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTE2NzYsNiArMTc2MSwxMiBAQAogICAgICAgICBtUmVuZGVyZXItPnNldFZpZGVvRnJhbWVSYXRlKHJhdGUpOwogICAgIH0KIAorICAgIGFkZEVuZFRpbWVNb25pdG9yKCk7CisgICAgLy8gUmVuZGVyZXIgaXMgY3JlYXRlZCBpbiBwYXVzZWQgc3RhdGUuCisgICAgaWYgKHBsYXkpIHsKKyAgICAgICAgbVJlbmRlcmVyLT5yZXN1bWUoKTsKKyAgICB9CisKICAgICBpZiAobVZpZGVvRGVjb2RlciAhPSBOVUxMKSB7CiAgICAgICAgIG1WaWRlb0RlY29kZXItPnNldFJlbmRlcmVyKG1SZW5kZXJlcik7CiAgICAgfQpAQCAtMTY4NCwxMCArMTc3NSwyMyBAQAogICAgIH0KIAogICAgIHN0YXJ0UGxheWJhY2tUaW1lcigib25zdGFydCIpOworICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19EQVRBX1NPVVJDRV9TVEFSVCwgMCk7CiAKICAgICBwb3N0U2NhblNvdXJjZXMoKTsKIH0KIAordm9pZCBOdVBsYXllcjI6OmFkZEVuZFRpbWVNb25pdG9yKCkgeworICAgICsrbUVPU01vbml0b3JHZW5lcmF0aW9uOworCisgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tRW5kVGltZVVzID09IERhdGFTb3VyY2VEZXNjOjprTWF4VGltZVVzKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RU9TTW9uaXRvciwgdGhpcyk7CisgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1FT1NNb25pdG9yR2VuZXJhdGlvbik7CisgICAgbU1lZGlhQ2xvY2stPmFkZFRpbWVyKG1zZywgbUN1cnJlbnRTb3VyY2VJbmZvLm1FbmRUaW1lVXMpOworfQorCiB2b2lkIE51UGxheWVyMjo6c3RhcnRQbGF5YmFja1RpbWVyKGNvbnN0IGNoYXIgKndoZXJlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1QbGF5aW5nVGltZUxvY2spOwogICAgIGlmIChtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zID09IDApIHsKQEAgLTE3MDksNyArMTgxMyw3IEBACiAgICAgICAgICAgICBBTE9HVigic3RvcFBsYXliYWNrVGltZXIoKSAgbG9nICAlMjAiIFBSSWQ2NCAiIiwgcGxheWVkKTsKIAogICAgICAgICAgICAgaWYgKHBsYXllZCA+IDApIHsKLSAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeU1vcmVQbGF5aW5nVGltZVVzKG1TcmNJZCwgKHBsYXllZCs1MDApLzEwMDApOworICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5TW9yZVBsYXlpbmdUaW1lVXMobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgKHBsYXllZCs1MDApLzEwMDApOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG1MYXN0U3RhcnRlZFBsYXlpbmdUaW1lTnMgPSAwOwpAQCAtMTcyNyw3ICsxODMxLDggQEAKIHZvaWQgTnVQbGF5ZXIyOjpzdG9wUmVidWZmZXJpbmdUaW1lcihib29sIGV4aXRpbmdQbGF5YmFjaykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtUGxheWluZ1RpbWVMb2NrKTsKIAotICAgIEFMT0dWKCJzdG9wUmVidWZmZXJUaW1lcigpICB0aW1lICUyMCIgUFJJZDY0ICIgKGV4aXRpbmcgJWQpIiwgbUxhc3RTdGFydGVkUmVidWZmZXJpbmdUaW1lTnMsIGV4aXRpbmdQbGF5YmFjayk7CisgICAgQUxPR1YoInN0b3BSZWJ1ZmZlclRpbWVyKCkgIHRpbWUgJTIwIiBQUklkNjQgIiAoZXhpdGluZyAlZCkiLAorICAgICAgICAgIG1MYXN0U3RhcnRlZFJlYnVmZmVyaW5nVGltZU5zLCBleGl0aW5nUGxheWJhY2spOwogCiAgICAgaWYgKG1MYXN0U3RhcnRlZFJlYnVmZmVyaW5nVGltZU5zICE9IDApIHsKICAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKQEAgLTE3MzcsOSArMTg0MiwxMCBAQAogICAgICAgICAgICAgQUxPR1YoInN0b3BSZWJ1ZmZlcmluZ1RpbWVyKCkgIGxvZyAgJTIwIiBQUklkNjQgIiIsIHJlYnVmZmVyZWQpOwogCiAgICAgICAgICAgICBpZiAocmVidWZmZXJlZCA+IDApIHsKLSAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeU1vcmVSZWJ1ZmZlcmluZ1RpbWVVcyhtU3JjSWQsIChyZWJ1ZmZlcmVkKzUwMCkvMTAwMCk7CisgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlNb3JlUmVidWZmZXJpbmdUaW1lVXMoCisgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCAocmVidWZmZXJlZCs1MDApLzEwMDApOwogICAgICAgICAgICAgICAgIGlmIChleGl0aW5nUGxheWJhY2spIHsKLSAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlSZWJ1ZmZlcmluZ1doZW5FeGl0KG1TcmNJZCwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5UmVidWZmZXJpbmdXaGVuRXhpdChtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCB0cnVlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTE3NTUsOCArMTg2MSw4IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgbVBhdXNlZCA9IHRydWU7Ci0gICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBtU291cmNlLT5wYXVzZSgpOworICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5wYXVzZSgpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dXKCJwYXVzZSBjYWxsZWQgd2hlbiBzb3VyY2UgaXMgZ29uZSBvciBub3Qgc2V0Iik7CiAgICAgfQpAQCAtMTg0Niw3ICsxOTUyLDcgQEAKIAogICAgIHN0YXR1c190IGVyciA9IG1SZW5kZXJlci0+b3BlbkF1ZGlvU2luaygKICAgICAgICAgICAgIGZvcm1hdCwgdHJ1ZSAvKiBvZmZsb2FkT25seSAqLywgaGFzVmlkZW8sCi0gICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmbU9mZmxvYWRBdWRpbywgbVNvdXJjZS0+aXNTdHJlYW1pbmcoKSk7CisgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmbU9mZmxvYWRBdWRpbywgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmlzU3RyZWFtaW5nKCkpOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgLy8gQW55IGZhaWx1cmUgd2UgdHVybiBvZmYgbU9mZmxvYWRBdWRpby4KICAgICAgICAgbU9mZmxvYWRBdWRpbyA9IGZhbHNlOwpAQCAtMTg2Myw2ICsxOTY5LDcgQEAKICAgICAgICAgaW50NjRfdCBjdXJyZW50UG9zaXRpb25VcywgYm9vbCBmb3JjZU5vbk9mZmxvYWQsIGJvb2wgbmVlZHNUb0NyZWF0ZUF1ZGlvRGVjb2RlcikgewogICAgIGlmIChtQXVkaW9EZWNvZGVyICE9IE5VTEwpIHsKICAgICAgICAgbUF1ZGlvRGVjb2Rlci0+cGF1c2UoKTsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1EZWNvZGVyTG9jayk7CiAgICAgICAgIG1BdWRpb0RlY29kZXIuY2xlYXIoKTsKICAgICAgICAgbUF1ZGlvRGVjb2RlckVycm9yID0gZmFsc2U7CiAgICAgICAgICsrbUF1ZGlvRGVjb2RlckdlbmVyYXRpb247CkBAIC0xODg0LDExICsxOTkxLDIxIEBACiAgICAgY2xvc2VBdWRpb1NpbmsoKTsKICAgICBtUmVuZGVyZXItPmZsdXNoKHRydWUgLyogYXVkaW8gKi8sIGZhbHNlIC8qIG5vdGlmeUNvbXBsZXRlICovKTsKICAgICBpZiAobVZpZGVvRGVjb2RlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1SZW5kZXJlci0+Zmx1c2goZmFsc2UgLyogYXVkaW8gKi8sIGZhbHNlIC8qIG5vdGlmeUNvbXBsZXRlICovKTsKKyAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgbmV3IEZsdXNoRGVjb2RlckFjdGlvbihGTFVTSF9DTURfTk9ORSAvKiBhdWRpbyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMVVNIX0NNRF9GTFVTSCAvKiB2aWRlbyAqLykpOworICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBuZXcgU2Vla0FjdGlvbihjdXJyZW50UG9zaXRpb25VcywKKyAgICAgICAgICAgICAgICBNZWRpYVBsYXllclNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMgLyogbW9kZSAqLykpOworICAgICAgICAvLyBBZnRlciBhIGZsdXNoIHdpdGhvdXQgc2h1dGRvd24sIGRlY29kZXIgaXMgcGF1c2VkLgorICAgICAgICAvLyBEb24ndCByZXN1bWUgaXQgdW50aWwgc291cmNlIHNlZWsgaXMgZG9uZSwgb3RoZXJ3aXNlIGl0IGNvdWxkCisgICAgICAgIC8vIHN0YXJ0IHB1bGxpbmcgc3RhbGUgZGF0YSB0b28gc29vbi4KKyAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2sobmV3IFJlc3VtZURlY29kZXJBY3Rpb24oZmFsc2UpKTsKKyAgICAgICAgcHJvY2Vzc0RlZmVycmVkQWN0aW9ucygpOworICAgIH0gZWxzZSB7CisgICAgICAgIHBlcmZvcm1TZWVrKGN1cnJlbnRQb3NpdGlvblVzLCBNZWRpYVBsYXllclNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMgLyogbW9kZSAqLyk7CiAgICAgfQogCi0gICAgcGVyZm9ybVNlZWsoY3VycmVudFBvc2l0aW9uVXMsIE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMgLyogbW9kZSAqLyk7Ci0KICAgICBpZiAoZm9yY2VOb25PZmZsb2FkKSB7CiAgICAgICAgIG1SZW5kZXJlci0+c2lnbmFsRGlzYWJsZU9mZmxvYWRBdWRpbygpOwogICAgICAgICBtT2ZmbG9hZEF1ZGlvID0gZmFsc2U7CkBAIC0xODk5LDcgKzIwMTYsNyBAQAogfQogCiB2b2lkIE51UGxheWVyMjo6ZGV0ZXJtaW5lQXVkaW9Nb2RlQ2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmYXVkaW9Gb3JtYXQpIHsKLSAgICBpZiAobVNvdXJjZSA9PSBOVUxMIHx8IG1BdWRpb1NpbmsgPT0gTlVMTCkgeworICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSA9PSBOVUxMIHx8IG1BdWRpb1NpbmsgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0xOTA5LDE2ICsyMDI2LDE2IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBzcDxNZXRhRGF0YT4gYXVkaW9NZXRhID0gbVNvdXJjZS0+Z2V0Rm9ybWF0TWV0YSh0cnVlIC8qIGF1ZGlvICovKTsKLSAgICBzcDxBTWVzc2FnZT4gdmlkZW9Gb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pOworICAgIHNwPE1ldGFEYXRhPiBhdWRpb01ldGEgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0TWV0YSh0cnVlIC8qIGF1ZGlvICovKTsKKyAgICBzcDxBTWVzc2FnZT4gdmlkZW9Gb3JtYXQgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKTsKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBtQXVkaW9TaW5rLT5nZXRBdWRpb1N0cmVhbVR5cGUoKTsKICAgICBjb25zdCBib29sIGhhc1ZpZGVvID0gKHZpZGVvRm9ybWF0ICE9IE5VTEwpOwotICAgIGJvb2wgY2FuT2ZmbG9hZCA9IGNhbk9mZmxvYWRTdHJlYW0oCi0gICAgICAgICAgICBhdWRpb01ldGEsIGhhc1ZpZGVvLCBtU291cmNlLT5pc1N0cmVhbWluZygpLCBzdHJlYW1UeXBlKQorICAgIGJvb2wgY2FuT2ZmbG9hZCA9IEpNZWRpYVBsYXllcjJVdGlsczo6aXNPZmZsb2FkZWRBdWRpb1BsYXliYWNrU3VwcG9ydGVkKAorICAgICAgICAgICAgYXVkaW9NZXRhLCBoYXNWaWRlbywgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmlzU3RyZWFtaW5nKCksIHN0cmVhbVR5cGUpCiAgICAgICAgICAgICAgICAgICAgICYmIChtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQgPT0gMS5mICYmIG1QbGF5YmFja1NldHRpbmdzLm1QaXRjaCA9PSAxLmYpOwogCiAgICAgLy8gTW9kdWxhciBEUk06IERpc2FibGluZyBhdWRpbyBvZmZsb2FkIGlmIHRoZSBzb3VyY2UgaXMgcHJvdGVjdGVkCi0gICAgaWYgKGNhbk9mZmxvYWQgJiYgbUlzRHJtUHJvdGVjdGVkKSB7CisgICAgaWYgKGNhbk9mZmxvYWQgJiYgbUN1cnJlbnRTb3VyY2VJbmZvLm1Jc0RybVByb3RlY3RlZCkgewogICAgICAgICBjYW5PZmZsb2FkID0gZmFsc2U7CiAgICAgICAgIEFMT0dWKCJkZXRlcm1pbmVBdWRpb01vZGVDaGFuZ2U6IERpc2FibGluZyBtT2ZmbG9hZEF1ZGlvIGIvYyB0aGUgc291cmNlIGlzIHByb3RlY3RlZC4iKTsKICAgICB9CkBAIC0xOTQ1LDcgKzIwNjIsNyBAQAogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCi0gICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdChhdWRpbyk7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5nZXRGb3JtYXQoYXVkaW8pOwogCiAgICAgaWYgKGZvcm1hdCA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwpAQCAtMTk2NywxMSArMjA4NCwxMSBAQAogICAgICAgICAgICAgbUNDRGVjb2RlciA9IG5ldyBDQ0RlY29kZXIoY2NOb3RpZnkpOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19TRUNVUkUpIHsKKyAgICAgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfU0VDVVJFKSB7CiAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJzZWN1cmUiLCB0cnVlKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfUFJPVEVDVEVEKSB7CisgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX1BST1RFQ1RFRCkgewogICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigicHJvdGVjdGVkIiwgdHJ1ZSk7CiAgICAgICAgIH0KIApAQCAtMTk4MSw2ICsyMDk4LDggQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtRGVjb2RlckxvY2spOworCiAgICAgaWYgKGF1ZGlvKSB7CiAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRBdWRpb05vdGlmeSwgdGhpcyk7CiAgICAgICAgICsrbUF1ZGlvRGVjb2RlckdlbmVyYXRpb247CkBAIC0xOTkwLDE2ICsyMTA5LDE2IEBACiAgICAgICAgICAgICBkZXRlcm1pbmVBdWRpb01vZGVDaGFuZ2UoZm9ybWF0KTsKICAgICAgICAgfQogICAgICAgICBpZiAobU9mZmxvYWRBdWRpbykgewotICAgICAgICAgICAgbVNvdXJjZS0+c2V0T2ZmbG9hZEF1ZGlvKHRydWUgLyogb2ZmbG9hZCAqLyk7CisgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+c2V0T2ZmbG9hZEF1ZGlvKHRydWUgLyogb2ZmbG9hZCAqLyk7CiAKLSAgICAgICAgICAgIGNvbnN0IGJvb2wgaGFzVmlkZW8gPSAobVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qYXVkaW8gKi8pICE9IE5VTEwpOworICAgICAgICAgICAgY29uc3QgYm9vbCBoYXNWaWRlbyA9IChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qYXVkaW8gKi8pICE9IE5VTEwpOwogICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiaGFzLXZpZGVvIiwgaGFzVmlkZW8pOwotICAgICAgICAgICAgKmRlY29kZXIgPSBuZXcgRGVjb2RlclBhc3NUaHJvdWdoKG5vdGlmeSwgbVNvdXJjZSwgbVJlbmRlcmVyKTsKKyAgICAgICAgICAgICpkZWNvZGVyID0gbmV3IERlY29kZXJQYXNzVGhyb3VnaChub3RpZnksIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLCBtUmVuZGVyZXIpOwogICAgICAgICAgICAgQUxPR1YoImluc3RhbnRpYXRlRGVjb2RlciBhdWRpbyBEZWNvZGVyUGFzc1Rocm91Z2ggIGhhc1ZpZGVvOiAlZCIsIGhhc1ZpZGVvKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Tb3VyY2UtPnNldE9mZmxvYWRBdWRpbyhmYWxzZSAvKiBvZmZsb2FkICovKTsKKyAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5zZXRPZmZsb2FkQXVkaW8oZmFsc2UgLyogb2ZmbG9hZCAqLyk7CiAKLSAgICAgICAgICAgICpkZWNvZGVyID0gbmV3IERlY29kZXIobm90aWZ5LCBtU291cmNlLCBtUElELCBtVUlELCBtUmVuZGVyZXIpOworICAgICAgICAgICAgKmRlY29kZXIgPSBuZXcgRGVjb2Rlcihub3RpZnksIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLCBtUElELCBtVUlELCBtUmVuZGVyZXIpOwogICAgICAgICAgICAgQUxPR1YoImluc3RhbnRpYXRlRGVjb2RlciBhdWRpbyBEZWNvZGVyIik7CiAgICAgICAgIH0KICAgICAgICAgbUF1ZGlvRGVjb2RlckVycm9yID0gZmFsc2U7CkBAIC0yMDA5LDcgKzIxMjgsOCBAQAogICAgICAgICBub3RpZnktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVZpZGVvRGVjb2RlckdlbmVyYXRpb24pOwogCiAgICAgICAgICpkZWNvZGVyID0gbmV3IERlY29kZXIoCi0gICAgICAgICAgICAgICAgbm90aWZ5LCBtU291cmNlLCBtUElELCBtVUlELCBtUmVuZGVyZXIsIG1OYXRpdmVXaW5kb3csIG1DQ0RlY29kZXIpOworICAgICAgICAgICAgICAgIG5vdGlmeSwgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UsIG1QSUQsIG1VSUQsIG1SZW5kZXJlciwgbU5hdGl2ZVdpbmRvdywKKyAgICAgICAgICAgICAgICBtQ0NEZWNvZGVyKTsKICAgICAgICAgbVZpZGVvRGVjb2RlckVycm9yID0gZmFsc2U7CiAKICAgICAgICAgLy8gZW5hYmxlIEZSQyBpZiBoaWdoLXF1YWxpdHkgQVYgc3luYyBpcyByZXF1ZXN0ZWQsIGV2ZW4gaWYgbm90CkBAIC0yMDI0LDEwICsyMTQ0LDExIEBACiAgICAgKCpkZWNvZGVyKS0+aW5pdCgpOwogCiAgICAgLy8gTW9kdWxhciBEUk0KLSAgICBpZiAobUlzRHJtUHJvdGVjdGVkKSB7Ci0gICAgICAgIGZvcm1hdC0+c2V0T2JqZWN0KCJjcnlwdG8iLCBtQ3J5cHRvKTsKLSAgICAgICAgQUxPR1YoImluc3RhbnRpYXRlRGVjb2RlcjogbUNyeXB0bzogJXAgaXNTZWN1cmU6ICVkIiwgbUNyeXB0by5nZXQoKSwKLSAgICAgICAgICAgICAgICAobVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX1NFQ1VSRSkgIT0gMCk7CisgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tSXNEcm1Qcm90ZWN0ZWQpIHsKKyAgICAgICAgZm9ybWF0LT5zZXRPYmplY3QoImNyeXB0byIsIG1DdXJyZW50U291cmNlSW5mby5tQ3J5cHRvKTsKKyAgICAgICAgQUxPR1YoImluc3RhbnRpYXRlRGVjb2RlcjogbUNyeXB0bzogJXAgaXNTZWN1cmU6ICVkIiwKKyAgICAgICAgICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8ubUNyeXB0by5nZXQoKSwKKyAgICAgICAgICAgICAgICAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19TRUNVUkUpICE9IDApOwogICAgIH0KIAogICAgICgqZGVjb2RlciktPmNvbmZpZ3VyZShmb3JtYXQpOwpAQCAtMjE0Niw3ICsyMjY3LDggQEAKICAgICAgICAgICAgIGRpc3BsYXlIZWlnaHQpOwogfQogCi12b2lkIE51UGxheWVyMjo6bm90aWZ5TGlzdGVuZXIoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKmluKSB7Cit2b2lkIE51UGxheWVyMjo6bm90aWZ5TGlzdGVuZXIoCisgICAgICAgIGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGxheWVyTWVzc2FnZSAqaW4pIHsKICAgICBpZiAobURyaXZlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC0yMjMwLDggKzIzNTIsOSBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXIyOjpnZXRUcmFja0luZm8oUGFyY2VsKiByZXBseSkgY29uc3Qgeworc3RhdHVzX3QgTnVQbGF5ZXIyOjpnZXRUcmFja0luZm8oaW50NjRfdCBzcmNJZCwgUGxheWVyTWVzc2FnZSogcmVwbHkpIGNvbnN0IHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0VHJhY2tJbmZvLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDY0KCJzcmNJZCIsIHNyY0lkKTsKICAgICBtc2ctPnNldFBvaW50ZXIoInJlcGx5IiwgcmVwbHkpOwogCiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwpAQCAtMjIzOSw5ICsyMzYyLDEwIEBACiAgICAgcmV0dXJuIGVycjsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXIyOjpnZXRTZWxlY3RlZFRyYWNrKGludDMyX3QgdHlwZSwgUGFyY2VsKiByZXBseSkgY29uc3Qgeworc3RhdHVzX3QgTnVQbGF5ZXIyOjpnZXRTZWxlY3RlZFRyYWNrKGludDY0X3Qgc3JjSWQsIGludDMyX3QgdHlwZSwgUGxheWVyTWVzc2FnZSogcmVwbHkpIGNvbnN0IHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0U2VsZWN0ZWRUcmFjaywgdGhpcyk7CiAgICAgbXNnLT5zZXRQb2ludGVyKCJyZXBseSIsIHJlcGx5KTsKKyAgICBtc2ctPnNldEludDY0KCJzcmNJZCIsIHNyY0lkKTsKICAgICBtc2ctPnNldEludDMyKCJ0eXBlIiwgdHlwZSk7CiAKICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7CkBAIC0yMjUyLDggKzIzNzYsOSBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKLXN0YXR1c190IE51UGxheWVyMjo6c2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0LCBpbnQ2NF90IHRpbWVVcykgeworc3RhdHVzX3QgTnVQbGF5ZXIyOjpzZWxlY3RUcmFjayhpbnQ2NF90IHNyY0lkLCBzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QsIGludDY0X3QgdGltZVVzKSB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbGVjdFRyYWNrLCB0aGlzKTsKKyAgICBtc2ctPnNldEludDY0KCJzcmNJZCIsIHNyY0lkKTsKICAgICBtc2ctPnNldFNpemUoInRyYWNrSW5kZXgiLCB0cmFja0luZGV4KTsKICAgICBtc2ctPnNldEludDMyKCJzZWxlY3QiLCBzZWxlY3QpOwogICAgIG1zZy0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CkBAIC0yMjg1LDYgKzI0MTAsOCBAQAogICAgIENIRUNLKG1UcmFja1N0YXRzICE9IE5VTEwpOwogCiAgICAgbVRyYWNrU3RhdHMtPmNsZWFyKCk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobURlY29kZXJMb2NrKTsKICAgICBpZiAobVZpZGVvRGVjb2RlciAhPSBOVUxMKSB7CiAgICAgICAgIG1UcmFja1N0YXRzLT5wdXNoX2JhY2sobVZpZGVvRGVjb2Rlci0+Z2V0U3RhdHMoKSk7CiAgICAgfQpAQCAtMjI5NCwxMSArMjQyMSwxMSBAQAogfQogCiBzcDxNZXRhRGF0YT4gTnVQbGF5ZXIyOjpnZXRGaWxlTWV0YSgpIHsKLSAgICByZXR1cm4gbVNvdXJjZS0+Z2V0RmlsZUZvcm1hdE1ldGEoKTsKKyAgICByZXR1cm4gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldEZpbGVGb3JtYXRNZXRhKCk7CiB9CiAKIGZsb2F0IE51UGxheWVyMjo6Z2V0RnJhbWVSYXRlKCkgewotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbVNvdXJjZS0+Z2V0Rm9ybWF0TWV0YShmYWxzZSAvKiBhdWRpbyAqLyk7CisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZS0+Z2V0Rm9ybWF0TWV0YShmYWxzZSAvKiBhdWRpbyAqLyk7CiAgICAgaWYgKG1ldGEgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gMDsKICAgICB9CkBAIC0yMzU2LDE2ICsyNDgzLDE2IEBACiAgICAgQUxPR1YoInBlcmZvcm1TZWVrIHNlZWtUaW1lVXM9JWxsZCB1cyAoJS4yZiBzZWNzKSwgbW9kZT0lZCIsCiAgICAgICAgICAgKGxvbmcgbG9uZylzZWVrVGltZVVzLCBzZWVrVGltZVVzIC8gMUU2LCBtb2RlKTsKIAotICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKKyAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgPT0gTlVMTCkgewogICAgICAgICAvLyBUaGlzIGhhcHBlbnMgd2hlbiByZXNldCBvY2N1cnMgcmlnaHQgYmVmb3JlIHRoZSBsb29wIG1vZGUKICAgICAgICAgLy8gYXN5bmNocm9ub3VzbHkgc2Vla3MgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdHJlYW0uCiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUF1ZGlvRGVjb2RlciAhPSBOVUxMIHx8IG1WaWRlb0RlY29kZXIgIT0gTlVMTCwKLSAgICAgICAgICAgICAgICAibVNvdXJjZSBpcyBOVUxMIGFuZCBkZWNvZGVycyBub3QgTlVMTCBhdWRpbyglcCkgdmlkZW8oJXApIiwKKyAgICAgICAgICAgICAgICAibUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgaXMgTlVMTCBhbmQgZGVjb2RlcnMgbm90IE5VTEwgYXVkaW8oJXApIHZpZGVvKCVwKSIsCiAgICAgICAgICAgICAgICAgbUF1ZGlvRGVjb2Rlci5nZXQoKSwgbVZpZGVvRGVjb2Rlci5nZXQoKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgbVByZXZpb3VzU2Vla1RpbWVVcyA9IHNlZWtUaW1lVXM7Ci0gICAgbVNvdXJjZS0+c2Vla1RvKHNlZWtUaW1lVXMsIG1vZGUpOworICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlLT5zZWVrVG8oc2Vla1RpbWVVcywgbW9kZSk7CiAgICAgKyttVGltZWRUZXh0R2VuZXJhdGlvbjsKIAogICAgIC8vIGV2ZXJ5dGhpbmcncyBmbHVzaGVkLCBjb250aW51ZSBwbGF5YmFjay4KQEAgLTI0MTIsMTcgKzI1MzksMTMgQEAKICAgICBtUmVuZGVyZXIuY2xlYXIoKTsKICAgICArK21SZW5kZXJlckdlbmVyYXRpb247CiAKLSAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKLQotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVNvdXJjZUxvY2spOwotICAgICAgICBtU291cmNlLmNsZWFyKCk7Ci0gICAgfQorICAgIHJlc2V0U291cmNlSW5mbyhtQ3VycmVudFNvdXJjZUluZm8pOworICAgIHJlc2V0U291cmNlSW5mbyhtTmV4dFNvdXJjZUluZm8pOwogCiAgICAgaWYgKG1Ecml2ZXIgIT0gTlVMTCkgewogICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwogICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5UmVzZXRDb21wbGV0ZShtU3JjSWQpOworICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlSZXNldENvbXBsZXRlKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0yNDMxLDE0ICsyNTU0LDYgQEAKICAgICBtUmVzZXR0aW5nID0gZmFsc2U7CiAgICAgbVNvdXJjZVN0YXJ0ZWQgPSBmYWxzZTsKIAotICAgIC8vIE1vZHVsYXIgRFJNCi0gICAgaWYgKG1DcnlwdG8gIT0gTlVMTCkgewotICAgICAgICAvLyBkZWNvZGVycyB3aWxsIGJlIGZsdXNoZWQgYmVmb3JlIHRoaXMgc28gdGhlaXIgbUNyeXB0byB3b3VsZCBnbyBhd2F5IG9uIHRoZWlyIG93bgotICAgICAgICAvLyBUT0RPIGNoYW5nZSB0byBBTE9HVgotICAgICAgICBBTE9HRCgicGVyZm9ybVJlc2V0IG1DcnlwdG86ICVwIiwgbUNyeXB0by5nZXQoKSk7Ci0gICAgICAgIG1DcnlwdG8uY2xlYXIoKTsKLSAgICB9Ci0gICAgbUlzRHJtUHJvdGVjdGVkID0gZmFsc2U7CiB9CiAKIHZvaWQgTnVQbGF5ZXIyOjpwZXJmb3JtUGxheU5leHREYXRhU291cmNlKCkgewpAQCAtMjQ1NywyNSArMjU3MiwzMSBAQAogCiAgICAgKyttUmVuZGVyZXJHZW5lcmF0aW9uOwogCi0gICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBtU291cmNlLT5zdG9wKCk7CisgICAgaWYgKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPnN0b3AoKTsKICAgICB9CiAKICAgICBsb25nIHByZXZpb3VzU3JjSWQ7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVNvdXJjZUxvY2spOwotICAgICAgICBtU291cmNlID0gbU5leHRTb3VyY2U7Ci0gICAgICAgIG1OZXh0U291cmNlID0gTlVMTDsKLSAgICAgICAgcHJldmlvdXNTcmNJZCA9IG1TcmNJZDsKLSAgICAgICAgbVNyY0lkID0gbU5leHRTcmNJZDsKLSAgICAgICAgKyttTmV4dFNyY0lkOyAgLy8gdG8gZGlzdGluZ3Vpc2ggdGhlIHR3byBzb3VyY2VzLgorICAgICAgICBwcmV2aW91c1NyY0lkID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZDsKKworICAgICAgICBtQ3VycmVudFNvdXJjZUluZm8gPSBtTmV4dFNvdXJjZUluZm87CisgICAgICAgIG1OZXh0U291cmNlSW5mbyA9IFNvdXJjZUluZm8oKTsKKyAgICAgICAgbU5leHRTb3VyY2VJbmZvLm1TcmNJZCA9IH5tQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkOyAgLy8gdG8gZGlzdGluZ3Vpc2ggdGhlIHR3byBzb3VyY2VzLgogICAgIH0KIAogICAgIGlmIChtRHJpdmVyICE9IE5VTEwpIHsKICAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKICAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihwcmV2aW91c1NyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fUExBWUJBQ0tfQ09NUExFVEUsIDApOwotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fU1RBUlRFRF9BU19ORVhULCAwKTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKHByZXZpb3VzU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19EQVRBX1NPVVJDRV9FTkQsIDApOworCisgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldER1cmF0aW9uKCZkdXJhdGlvblVzKSA9PSBPSykgeworICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5RHVyYXRpb24obUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgZHVyYXRpb25Vcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX0RBVEFfU09VUkNFX1NUQVJULCAwKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjQ4NCwyMiArMjYwNSwxNSBAQAogICAgIG1SZXNldHRpbmcgPSBmYWxzZTsKICAgICBtU291cmNlU3RhcnRlZCA9IGZhbHNlOwogCi0gICAgLy8gTW9kdWxhciBEUk0KLSAgICBpZiAobUNyeXB0byAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIGRlY29kZXJzIHdpbGwgYmUgZmx1c2hlZCBiZWZvcmUgdGhpcyBzbyB0aGVpciBtQ3J5cHRvIHdvdWxkIGdvIGF3YXkgb24gdGhlaXIgb3duCi0gICAgICAgIC8vIFRPRE8gY2hhbmdlIHRvIEFMT0dWCi0gICAgICAgIEFMT0dEKCJwZXJmb3JtUmVzZXQgbUNyeXB0bzogJXAiLCBtQ3J5cHRvLmdldCgpKTsKLSAgICAgICAgbUNyeXB0by5jbGVhcigpOwotICAgIH0KLSAgICBtSXNEcm1Qcm90ZWN0ZWQgPSBmYWxzZTsKKyAgICBhZGRFbmRUaW1lTW9uaXRvcigpOwogCiAgICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7CiAgICAgICAgIG1SZW5kZXJlci0+cmVzdW1lKCk7CiAgICAgfQogCi0gICAgb25TdGFydCgpOworICAgIG9uU3RhcnQodHJ1ZSAvKiBwbGF5ICovKTsKICAgICBtUGF1c2VkQnlDbGllbnQgPSBmYWxzZTsKLSAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9TVEFSVEVELCAwLCAwKTsKKyAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfU1RBUlRFRCwgMCwgMCk7CiB9CiAKIHZvaWQgTnVQbGF5ZXIyOjpwZXJmb3JtU2NhblNvdXJjZXMoKSB7CkBAIC0yNTI1LDcgKzI2MzksNyBAQAogICAgIGlmIChtRHJpdmVyICE9IE5VTEwpIHsKICAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKICAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBkcml2ZXItPm5vdGlmeVNldFN1cmZhY2VDb21wbGV0ZShtU3JjSWQpOworICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlTZXRTdXJmYWNlQ29tcGxldGUobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0yNTU3LDcgKzI2NzEsNyBAQAogdm9pZCBOdVBsYXllcjI6OmZpbmlzaFJlc3VtZSgpIHsKICAgICBpZiAobVJlc3VtZVBlbmRpbmcpIHsKICAgICAgICAgbVJlc3VtZVBlbmRpbmcgPSBmYWxzZTsKLSAgICAgICAgbm90aWZ5RHJpdmVyU2Vla0NvbXBsZXRlKG1TcmNJZCk7CisgICAgICAgIG5vdGlmeURyaXZlclNlZWtDb21wbGV0ZShtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkKTsKICAgICB9CiB9CiAKQEAgLTI1NzksMzYgKzI2OTMsNTAgQEAKICAgICBzd2l0Y2ggKHdoYXQpIHsKICAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0UHJlcGFyZWQ6CiAgICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dWKCJOdVBsYXllcjI6Om9uU291cmNlTm90aWZ5IFNvdXJjZTo6a1doYXRQcmVwYXJlZCBzb3VyY2U6ICVwIiwgbVNvdXJjZS5nZXQoKSk7Ci0gICAgICAgICAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHN0YWxlIG5vdGlmaWNhdGlvbiBmcm9tIGEgc291cmNlIHRoYXQgd2FzCi0gICAgICAgICAgICAgICAgLy8gYXN5bmNocm9ub3VzbHkgcHJlcGFyaW5nIHdoZW4gdGhlIGNsaWVudCBjYWxsZWQgcmVzZXQoKS4KLSAgICAgICAgICAgICAgICAvLyBXZSBoYW5kbGVkIHRoZSByZXNldCwgdGhlIHNvdXJjZSBpcyBnb25lLgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQzMl90IGVycjsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAvLyBzaHV0IGRvd24gcG90ZW50aWFsIHNlY3VyZSBjb2RlY3MgaW4gY2FzZSBjbGllbnQgbmV2ZXIgY2FsbHMgcmVzZXQKLSAgICAgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGbHVzaERlY29kZXJBY3Rpb24oRkxVU0hfQ01EX1NIVVRET1dOIC8qIGF1ZGlvICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTFVTSF9DTURfU0hVVERPV04gLyogdmlkZW8gKi8pKTsKLSAgICAgICAgICAgICAgICBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1QcmVwYXJlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7Ci0gICAgICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAvLyBub3RpZnkgZHVyYXRpb24gZmlyc3QsIHNvIHRoYXQgaXQncyBkZWZpbml0ZWx5IHNldCB3aGVuCi0gICAgICAgICAgICAgICAgLy8gdGhlIGFwcCByZWNlaXZlZCB0aGUgInByZXBhcmUgY29tcGxldGUiIGNhbGxiYWNrLgotICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICAgICAgICAgICAgICBpZiAobVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5RHVyYXRpb24oc3JjSWQsIGR1cmF0aW9uVXMpOworICAgICAgICAgICAgQUxPR1YoIk51UGxheWVyMjo6b25Tb3VyY2VOb3RpZnkgU291cmNlOjprV2hhdFByZXBhcmVkIHNvdXJjZTolcCwgSWQoJWxsZCkiLAorICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UuZ2V0KCksIChsb25nIGxvbmcpc3JjSWQpOworICAgICAgICAgICAgaWYgKHNyY0lkID09IG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQpIHsKKyAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgc3RhbGUgbm90aWZpY2F0aW9uIGZyb20gYSBzb3VyY2UgdGhhdCB3YXMKKyAgICAgICAgICAgICAgICAgICAgLy8gYXN5bmNocm9ub3VzbHkgcHJlcGFyaW5nIHdoZW4gdGhlIGNsaWVudCBjYWxsZWQgcmVzZXQoKS4KKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGFuZGxlZCB0aGUgcmVzZXQsIHRoZSBzb3VyY2UgaXMgZ29uZS4KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5UHJlcGFyZUNvbXBsZXRlZChzcmNJZCwgZXJyKTsKKworICAgICAgICAgICAgICAgIGludDMyX3QgZXJyOworICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNodXQgZG93biBwb3RlbnRpYWwgc2VjdXJlIGNvZGVjcyBpbiBjYXNlIGNsaWVudCBuZXZlciBjYWxscyByZXNldAorICAgICAgICAgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmx1c2hEZWNvZGVyQWN0aW9uKEZMVVNIX0NNRF9TSFVURE9XTiAvKiBhdWRpbyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMVVNIX0NNRF9TSFVURE9XTiAvKiB2aWRlbyAqLykpOworICAgICAgICAgICAgICAgICAgICBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbVByZXBhcmVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOworICAgICAgICAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAvLyBub3RpZnkgZHVyYXRpb24gZmlyc3QsIHNvIHRoYXQgaXQncyBkZWZpbml0ZWx5IHNldCB3aGVuCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBhcHAgcmVjZWl2ZWQgdGhlICJwcmVwYXJlIGNvbXBsZXRlIiBjYWxsYmFjay4KKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldER1cmF0aW9uKCZkdXJhdGlvblVzKSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlEdXJhdGlvbihzcmNJZCwgZHVyYXRpb25Vcyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlQcmVwYXJlQ29tcGxldGVkKHNyY0lkLCBlcnIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjSWQgPT0gbU5leHRTb3VyY2VJbmZvLm1TcmNJZCkgeworICAgICAgICAgICAgICAgIGlmIChtTmV4dFNvdXJjZUluZm8ubVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgLy8gc3RhbGUKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOworICAgICAgICAgICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGVycjsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKKyAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlQcmVwYXJlQ29tcGxldGVkKHNyY0lkLCBlcnIpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYnJlYWs7CkBAIC0yNjE3LDE1ICsyNzQ1LDE1IEBACiAgICAgICAgIC8vIE1vZHVsYXIgRFJNCiAgICAgICAgIGNhc2UgU291cmNlOjprV2hhdERybUluZm86CiAgICAgICAgIHsKLSAgICAgICAgICAgIFBhcmNlbCBwYXJjZWw7CisgICAgICAgICAgICBQbGF5ZXJNZXNzYWdlIHBsYXllck1zZzsKICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGRybUluZm87CiAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRCdWZmZXIoImRybUluZm8iLCAmZHJtSW5mbykpOwotICAgICAgICAgICAgcGFyY2VsLnNldERhdGEoZHJtSW5mby0+ZGF0YSgpLCBkcm1JbmZvLT5zaXplKCkpOworICAgICAgICAgICAgcGxheWVyTXNnLlBhcnNlRnJvbUFycmF5KGRybUluZm8tPmRhdGEoKSwgZHJtSW5mby0+c2l6ZSgpKTsKIAotICAgICAgICAgICAgQUxPR1YoIm9uU291cmNlTm90aWZ5KCkga1doYXREcm1JbmZvIE1FRElBMl9EUk1fSU5GTyBkcm1JbmZvOiAlcCAgcGFyY2VsIHNpemU6ICV6dSIsCi0gICAgICAgICAgICAgICAgICAgIGRybUluZm8uZ2V0KCksIHBhcmNlbC5kYXRhU2l6ZSgpKTsKKyAgICAgICAgICAgIEFMT0dWKCJvblNvdXJjZU5vdGlmeSgpIGtXaGF0RHJtSW5mbyBNRURJQTJfRFJNX0lORk8gZHJtSW5mbzogJXAgIHBsYXllck1zZyBzaXplOiAlZCIsCisgICAgICAgICAgICAgICAgICAgIGRybUluZm8uZ2V0KCksIHBsYXllck1zZy5CeXRlU2l6ZSgpKTsKIAotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoc3JjSWQsIE1FRElBMl9EUk1fSU5GTywgMCAvKiBleHQxICovLCAwIC8qIGV4dDIgKi8sICZwYXJjZWwpOworICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoc3JjSWQsIE1FRElBMl9EUk1fSU5GTywgMCAvKiBleHQxICovLCAwIC8qIGV4dDIgKi8sICZwbGF5ZXJNc2cpOwogCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjY1NCwxOSArMjc4MiwyNiBAQAogICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUxpc3RlbmVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fTk9UX1NFRUtBQkxFLCAwKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlGbGFnc0NoYW5nZWQoc3JjSWQsIGZsYWdzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3JjSWQgPT0gbUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCkgeworICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUZsYWdzQ2hhbmdlZChzcmNJZCwgZmxhZ3MpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKChtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikKLSAgICAgICAgICAgICAgICAgICAgJiYgKCEoZmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikpKSB7Ci0gICAgICAgICAgICAgICAgY2FuY2VsUG9sbER1cmF0aW9uKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCEobVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX0RZTkFNSUNfRFVSQVRJT04pCi0gICAgICAgICAgICAgICAgICAgICYmIChmbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKQotICAgICAgICAgICAgICAgICAgICAmJiAobUF1ZGlvRGVjb2RlciAhPSBOVUxMIHx8IG1WaWRlb0RlY29kZXIgIT0gTlVMTCkpIHsKLSAgICAgICAgICAgICAgICBzY2hlZHVsZVBvbGxEdXJhdGlvbigpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNyY0lkID09IG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoKG1DdXJyZW50U291cmNlSW5mby5tU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICghKGZsYWdzICYgU291cmNlOjpGTEFHX0RZTkFNSUNfRFVSQVRJT04pKSkgeworICAgICAgICAgICAgICAgICAgICBjYW5jZWxQb2xsRHVyYXRpb24oKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCEobUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGZsYWdzICYgU291cmNlOjpGTEFHX0RZTkFNSUNfRFVSQVRJT04pCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAobUF1ZGlvRGVjb2RlciAhPSBOVUxMIHx8IG1WaWRlb0RlY29kZXIgIT0gTlVMTCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVQb2xsRHVyYXRpb24oKTsKKyAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1Tb3VyY2VGbGFncyA9IGZsYWdzOworICAgICAgICAgICAgICAgIG1DdXJyZW50U291cmNlSW5mby5tU291cmNlRmxhZ3MgPSBmbGFnczsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3JjSWQgPT0gbU5leHRTb3VyY2VJbmZvLm1TcmNJZCkgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IGhhbmRsZSBkdXJhdGlvbiBwb2xsaW5nIGZvciBuZXh0IHNvdXJjZS4KKyAgICAgICAgICAgICAgICBtTmV4dFNvdXJjZUluZm8ubVNvdXJjZUZsYWdzID0gZmxhZ3M7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0yNzY4LDcgKzI5MDMsNyBAQAogICAgICAgICAgICAgaW50NjRfdCBwb3NNczsKICAgICAgICAgICAgIGludDY0X3QgdGltZVVzLCBwb3NVczsKICAgICAgICAgICAgIGRyaXZlci0+Z2V0Q3VycmVudFBvc2l0aW9uKCZwb3NNcyk7Ci0gICAgICAgICAgICBwb3NVcyA9IHBvc01zICogMTAwMGxsOworICAgICAgICAgICAgcG9zVXMgPSBwb3NNcyAqIDEwMDBMTDsKICAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKIAogICAgICAgICAgICAgaWYgKHBvc1VzIDwgdGltZVVzKSB7CkBAIC0yODE3LDggKzI5NTIsOCBAQAogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kQnVmZmVyKCJidWZmZXIiLCAmYnVmZmVyKSk7CiAKICAgICAgICAgICAgIHNpemVfdCBpbmJhbmRUcmFja3MgPSAwOwotICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGluYmFuZFRyYWNrcyA9IG1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgICAgIGlmIChtQ3VycmVudFNvdXJjZUluZm8ubVNvdXJjZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW5iYW5kVHJhY2tzID0gbUN1cnJlbnRTb3VyY2VJbmZvLm1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc2VuZFN1YnRpdGxlRGF0YShidWZmZXIsIGluYmFuZFRyYWNrcyk7CkBAIC0yODI3LDcgKzI5NjIsNyBAQAogCiAgICAgICAgIGNhc2UgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OmtXaGF0VHJhY2tBZGRlZDoKICAgICAgICAgewotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fTUVUQURBVEFfVVBEQVRFLCAwKTsKKyAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1DdXJyZW50U291cmNlSW5mby5tU3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19NRVRBREFUQV9VUERBVEUsIDApOwogCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjg0NiwzNSArMjk4MSwzMSBAQAogICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJkdXJhdGlvblVzIiwgJmR1cmF0aW9uVXMpKTsKIAotICAgIFBhcmNlbCBpbjsKLSAgICBpbi53cml0ZUludDMyKHRyYWNrSW5kZXggKyBiYXNlSW5kZXgpOwotICAgIGluLndyaXRlSW50NjQodGltZVVzKTsKLSAgICBpbi53cml0ZUludDY0KGR1cmF0aW9uVXMpOwotICAgIGluLndyaXRlSW50MzIoYnVmZmVyLT5zaXplKCkpOwotICAgIGluLndyaXRlSW50MzIoYnVmZmVyLT5zaXplKCkpOwotICAgIGluLndyaXRlKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CisgICAgUGxheWVyTWVzc2FnZSBwbGF5ZXJNc2c7CisgICAgcGxheWVyTXNnLmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKHRyYWNrSW5kZXggKyBiYXNlSW5kZXgpOworICAgIHBsYXllck1zZy5hZGRfdmFsdWVzKCktPnNldF9pbnQ2NF92YWx1ZSh0aW1lVXMpOworICAgIHBsYXllck1zZy5hZGRfdmFsdWVzKCktPnNldF9pbnQ2NF92YWx1ZShkdXJhdGlvblVzKTsKKyAgICBwbGF5ZXJNc2cuYWRkX3ZhbHVlcygpLT5zZXRfYnl0ZXNfdmFsdWUoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKIAotICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1NVQlRJVExFX0RBVEEsIDAsIDAsICZpbik7CisgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX1NVQlRJVExFX0RBVEEsIDAsIDAsICZwbGF5ZXJNc2cpOwogfQogCiB2b2lkIE51UGxheWVyMjo6c2VuZFRpbWVkTWV0YURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgewogICAgIGludDY0X3QgdGltZVVzOwogICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKIAotICAgIFBhcmNlbCBpbjsKLSAgICBpbi53cml0ZUludDY0KHRpbWVVcyk7Ci0gICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7Ci0gICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7Ci0gICAgaW4ud3JpdGUoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBQbGF5ZXJNZXNzYWdlIHBsYXllck1zZzsKKyAgICBwbGF5ZXJNc2cuYWRkX3ZhbHVlcygpLT5zZXRfaW50NjRfdmFsdWUodGltZVVzKTsKKyAgICBwbGF5ZXJNc2cuYWRkX3ZhbHVlcygpLT5zZXRfYnl0ZXNfdmFsdWUoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKIAotICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX01FVEFfREFUQSwgMCwgMCwgJmluKTsKKyAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfTUVUQV9EQVRBLCAwLCAwLCAmcGxheWVyTXNnKTsKIH0KIAogdm9pZCBOdVBsYXllcjI6OnNlbmRUaW1lZFRleHREYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKICAgICBjb25zdCB2b2lkICpkYXRhOwogICAgIHNpemVfdCBzaXplID0gMDsKICAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBpbnQzMl90IGZsYWcgPSBUZXh0RGVzY3JpcHRpb25zOjpJTl9CQU5EX1RFWFRfM0dQUDsKKyAgICBpbnQzMl90IGZsYWcgPSBUZXh0RGVzY3JpcHRpb25zMjo6SU5fQkFORF9URVhUXzNHUFA7CiAKICAgICBBU3RyaW5nIG1pbWU7CiAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOwpAQCAtMjg4MywyOCArMzAxNCwyOCBAQAogICAgIGRhdGEgPSBidWZmZXItPmRhdGEoKTsKICAgICBzaXplID0gYnVmZmVyLT5zaXplKCk7CiAKLSAgICBQYXJjZWwgcGFyY2VsOworICAgIFBsYXllck1lc3NhZ2UgcGxheWVyTXNnOwogICAgIGlmIChzaXplID4gMCkgewogICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CiAgICAgICAgIGludDMyX3QgZ2xvYmFsID0gMDsKICAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImdsb2JhbCIsICZnbG9iYWwpICYmIGdsb2JhbCkgewotICAgICAgICAgICAgZmxhZyB8PSBUZXh0RGVzY3JpcHRpb25zOjpHTE9CQUxfREVTQ1JJUFRJT05TOworICAgICAgICAgICAgZmxhZyB8PSBUZXh0RGVzY3JpcHRpb25zMjo6R0xPQkFMX0RFU0NSSVBUSU9OUzsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZsYWcgfD0gVGV4dERlc2NyaXB0aW9uczo6TE9DQUxfREVTQ1JJUFRJT05TOworICAgICAgICAgICAgZmxhZyB8PSBUZXh0RGVzY3JpcHRpb25zMjo6TE9DQUxfREVTQ1JJUFRJT05TOwogICAgICAgICB9Ci0gICAgICAgIFRleHREZXNjcmlwdGlvbnM6OmdldFBhcmNlbE9mRGVzY3JpcHRpb25zKAotICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopZGF0YSwgc2l6ZSwgZmxhZywgdGltZVVzIC8gMTAwMCwgJnBhcmNlbCk7CisgICAgICAgIFRleHREZXNjcmlwdGlvbnMyOjpnZXRQbGF5ZXJNZXNzYWdlT2ZEZXNjcmlwdGlvbnMoCisgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilkYXRhLCBzaXplLCBmbGFnLCB0aW1lVXMgLyAxMDAwLCAmcGxheWVyTXNnKTsKICAgICB9CiAKLSAgICBpZiAoKHBhcmNlbC5kYXRhU2l6ZSgpID4gMCkpIHsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfVElNRURfVEVYVCwgMCwgMCwgJnBhcmNlbCk7CisgICAgaWYgKHBsYXllck1zZy52YWx1ZXNfc2l6ZSgpID4gMCkgeworICAgICAgICBub3RpZnlMaXN0ZW5lcihtQ3VycmVudFNvdXJjZUluZm8ubVNyY0lkLCBNRURJQTJfVElNRURfVEVYVCwgMCwgMCwgJnBsYXllck1zZyk7CiAgICAgfSBlbHNlIHsgIC8vIHNlbmQgYW4gZW1wdHkgdGltZWQgdGV4dAotICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9USU1FRF9URVhULCAwLCAwKTsKKyAgICAgICAgbm90aWZ5TGlzdGVuZXIobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCwgTUVESUEyX1RJTUVEX1RFWFQsIDAsIDApOwogICAgIH0KIH0KIAogY29uc3QgY2hhciAqTnVQbGF5ZXIyOjpnZXREYXRhU291cmNlVHlwZSgpIHsKLSAgICBzd2l0Y2ggKG1EYXRhU291cmNlVHlwZSkgeworICAgIHN3aXRjaCAobUN1cnJlbnRTb3VyY2VJbmZvLm1EYXRhU291cmNlVHlwZSkgewogICAgICAgICBjYXNlIERBVEFfU09VUkNFX1RZUEVfSFRUUF9MSVZFOgogICAgICAgICAgICAgcmV0dXJuICJIVFRQTGl2ZSI7CiAKQEAgLTI5MjYsOCArMzA1NywzNCBAQAogICAgIH0KICB9CiAKK051UGxheWVyMjo6U291cmNlSW5mbyogTnVQbGF5ZXIyOjpnZXRTb3VyY2VJbmZvQnlJZEluTXNnKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgaW50NjRfdCBzcmNJZDsKKyAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3JjSWQiLCAmc3JjSWQpKTsKKyAgICBpZiAobUN1cnJlbnRTb3VyY2VJbmZvLm1TcmNJZCA9PSBzcmNJZCkgeworICAgICAgICByZXR1cm4gJm1DdXJyZW50U291cmNlSW5mbzsKKyAgICB9IGVsc2UgaWYgKG1OZXh0U291cmNlSW5mby5tU3JjSWQgPT0gc3JjSWQpIHsKKyAgICAgICAgcmV0dXJuICZtTmV4dFNvdXJjZUluZm87CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorfQorCit2b2lkIE51UGxheWVyMjo6cmVzZXRTb3VyY2VJbmZvKE51UGxheWVyMjo6U291cmNlSW5mbyAmc3JjSW5mbykgeworICAgIGlmIChzcmNJbmZvLm1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICBzcmNJbmZvLm1Tb3VyY2UtPnN0b3AoKTsKKworICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVNvdXJjZUxvY2spOworICAgICAgICBzcmNJbmZvLm1Tb3VyY2UuY2xlYXIoKTsKKyAgICB9CisgICAgLy8gTW9kdWxhciBEUk0KKyAgICBBTE9HRCgicGVyZm9ybVJlc2V0IG1DcnlwdG86ICVwIiwgc3JjSW5mby5tQ3J5cHRvLmdldCgpKTsKKyAgICBzcmNJbmZvLm1DcnlwdG8uY2xlYXIoKTsKKyAgICBzcmNJbmZvLm1Jc0RybVByb3RlY3RlZCA9IGZhbHNlOworfQorCiAvLyBNb2R1bGFyIERSTSBiZWdpbgotc3RhdHVzX3QgTnVQbGF5ZXIyOjpwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkKQorc3RhdHVzX3QgTnVQbGF5ZXIyOjpwcmVwYXJlRHJtKAorICAgICAgICBpbnQ2NF90IHNyY0lkLCBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJmRybVNlc3Npb25JZCkKIHsKICAgICBBTE9HVigicHJlcGFyZURybSAiKTsKIApAQCAtMjkzNyw2ICszMDk0LDcgQEAKICAgICB1aW50OF90IFVVSURbMTZdOwogICAgIG1lbWNweShVVUlELCB1dWlkLCBzaXplb2YoVVVJRCkpOwogICAgIFZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQgPSBkcm1TZXNzaW9uSWQ7CisgICAgbXNnLT5zZXRJbnQ2NCgic3JjSWQiLCBzcmNJZCk7CiAgICAgbXNnLT5zZXRQb2ludGVyKCJ1dWlkIiwgKHZvaWQqKVVVSUQpOwogICAgIG1zZy0+c2V0UG9pbnRlcigiZHJtU2Vzc2lvbklkIiwgKHZvaWQqKSZzZXNzaW9uSWQpOwogCkBAIC0yOTUzLDExICszMTExLDEyIEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXIyOjpyZWxlYXNlRHJtKCkKK3N0YXR1c190IE51UGxheWVyMjo6cmVsZWFzZURybShpbnQ2NF90IHNyY0lkKQogewogICAgIEFMT0dWKCJyZWxlYXNlRHJtICIpOwogCiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlbGVhc2VEcm0sIHRoaXMpOworICAgIG1zZy0+c2V0SW50NjQoInNyY0lkIiwgc3JjSWQpOwogCiAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwogICAgIHN0YXR1c190IHN0YXR1cyA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKQEAgLTI5NzgsOCArMzEzNywxNSBAQAogICAgIEFMT0dEKCJvblByZXBhcmVEcm0gIik7CiAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJvblByZXBhcmVEcm06IE5vIHNvdXJjZS4gb25QcmVwYXJlRHJtIGZhaWxlZCB3aXRoICVkLiIsIHN0YXR1cyk7CisgICAgU291cmNlSW5mbyAqc3JjSW5mbyA9IGdldFNvdXJjZUluZm9CeUlkSW5Nc2cobXNnKTsKKyAgICBpZiAoc3JjSW5mbyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgaW50NjRfdCBzcmNJZCA9IHNyY0luZm8tPm1TcmNJZDsKKyAgICBpZiAoc3JjSW5mby0+bVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJvblByZXBhcmVEcm06IHNyY0luZm8oJWxsZCkgTm8gc291cmNlLiBvblByZXBhcmVEcm0gZmFpbGVkIHdpdGggJWQuIiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKXNyY0lkLCBzdGF0dXMpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIApAQCAtMjk5MSw0MiArMzE1Nyw1MCBAQAogICAgIHN0YXR1cyA9IE9LOwogICAgIHNwPEFNZWRpYUNyeXB0b1dyYXBwZXI+IGNyeXB0byA9IE5VTEw7CiAKLSAgICBzdGF0dXMgPSBtU291cmNlLT5wcmVwYXJlRHJtKHV1aWQsICpkcm1TZXNzaW9uSWQsICZjcnlwdG8pOworICAgIHN0YXR1cyA9IHNyY0luZm8tPm1Tb3VyY2UtPnByZXBhcmVEcm0odXVpZCwgKmRybVNlc3Npb25JZCwgJmNyeXB0byk7CiAgICAgaWYgKGNyeXB0byA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJvblByZXBhcmVEcm06IG1Tb3VyY2UtPnByZXBhcmVEcm0gZmFpbGVkLiBzdGF0dXM6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoIm9uUHJlcGFyZURybTogc3JjSW5mbyglbGxkKS5tU291cmNlLT5wcmVwYXJlRHJtIGZhaWxlZC4gc3RhdHVzOiAlZCIsCisgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzcmNJZCwgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9Ci0gICAgQUxPR1YoIm9uUHJlcGFyZURybTogbVNvdXJjZS0+cHJlcGFyZURybSBzdWNjZWVkZWQiKTsKKyAgICBBTE9HVigib25QcmVwYXJlRHJtOiBzcmNJbmZvKCVsbGQpLm1Tb3VyY2UtPnByZXBhcmVEcm0gc3VjY2VlZGVkIiwgKGxvbmcgbG9uZylzcmNJZCk7CiAKLSAgICBpZiAobUNyeXB0byAhPSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJvblByZXBhcmVEcm06IFVuZXhwZWN0ZWQuIEFscmVhZHkgaGF2aW5nIG1DcnlwdG86ICVwIiwgbUNyeXB0by5nZXQoKSk7Ci0gICAgICAgIG1DcnlwdG8uY2xlYXIoKTsKKyAgICBpZiAoc3JjSW5mby0+bUNyeXB0byAhPSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJvblByZXBhcmVEcm06IHNyY0luZm8oJWxsZCkgVW5leHBlY3RlZC4gQWxyZWFkeSBoYXZpbmcgbUNyeXB0bzogJXAiLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpc3JjSWQsIHNyY0luZm8tPm1DcnlwdG8uZ2V0KCkpOworICAgICAgICBzcmNJbmZvLT5tQ3J5cHRvLmNsZWFyKCk7CiAgICAgfQogCi0gICAgbUNyeXB0byA9IGNyeXB0bzsKLSAgICBtSXNEcm1Qcm90ZWN0ZWQgPSB0cnVlOworICAgIHNyY0luZm8tPm1DcnlwdG8gPSBjcnlwdG87CisgICAgc3JjSW5mby0+bUlzRHJtUHJvdGVjdGVkID0gdHJ1ZTsKICAgICAvLyBUT0RPIGNoYW5nZSB0byBBTE9HVgotICAgIEFMT0dEKCJvblByZXBhcmVEcm06IG1DcnlwdG86ICVwIiwgbUNyeXB0by5nZXQoKSk7CisgICAgQUxPR0QoIm9uUHJlcGFyZURybTogbUNyeXB0bzogJXAiLCBzcmNJbmZvLT5tQ3J5cHRvLmdldCgpKTsKIAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IE51UGxheWVyMjo6b25SZWxlYXNlRHJtKCkKK3N0YXR1c190IE51UGxheWVyMjo6b25SZWxlYXNlRHJtKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKQogewogICAgIC8vIFRPRE8gY2hhbmdlIHRvIEFMT0dWCiAgICAgQUxPR0QoIm9uUmVsZWFzZURybSAiKTsKLQotICAgIGlmICghbUlzRHJtUHJvdGVjdGVkKSB7Ci0gICAgICAgIEFMT0dXKCJvblJlbGVhc2VEcm06IFVuZXhwZWN0ZWQuIG1Jc0RybVByb3RlY3RlZCBpcyBhbHJlYWR5IGZhbHNlLiIpOworICAgIFNvdXJjZUluZm8gKnNyY0luZm8gPSBnZXRTb3VyY2VJbmZvQnlJZEluTXNnKG1zZyk7OworICAgIGlmIChzcmNJbmZvID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIG1Jc0RybVByb3RlY3RlZCA9IGZhbHNlOworICAgIGludDY0X3Qgc3JjSWQgPSBzcmNJbmZvLT5tU3JjSWQ7CisgICAgaWYgKCFzcmNJbmZvLT5tSXNEcm1Qcm90ZWN0ZWQpIHsKKyAgICAgICAgQUxPR1coIm9uUmVsZWFzZURybTogc3JjSW5mbyglbGxkKSBVbmV4cGVjdGVkLiBtSXNEcm1Qcm90ZWN0ZWQgaXMgYWxyZWFkeSBmYWxzZS4iLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpc3JjSWQpOworICAgIH0KKworICAgIHNyY0luZm8tPm1Jc0RybVByb3RlY3RlZCA9IGZhbHNlOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIGlmIChtQ3J5cHRvICE9IE5VTEwpIHsKKyAgICBpZiAoc3JjSW5mby0+bUNyeXB0byAhPSBOVUxMKSB7CiAgICAgICAgIC8vIG5vdGlmeWluZyB0aGUgc291cmNlIGZpcnN0IGJlZm9yZSByZW1vdmluZyBjcnlwdG8gZnJvbSBjb2RlYwotICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtU291cmNlLT5yZWxlYXNlRHJtKCk7CisgICAgICAgIGlmIChzcmNJbmZvLT5tU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHNyY0luZm8tPm1Tb3VyY2UtPnJlbGVhc2VEcm0oKTsKICAgICAgICAgfQogCiAgICAgICAgIHN0YXR1cz1PSzsKQEAgLTMwNDcsOSArMzIyMSw5IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBUT0RPIGNoYW5nZSB0byBBTE9HVgotICAgICAgICBBTE9HRCgib25SZWxlYXNlRHJtOiBtQ3J5cHRvOiAlcCIsIG1DcnlwdG8uZ2V0KCkpOwotICAgICAgICBtQ3J5cHRvLmNsZWFyKCk7Ci0gICAgfSBlbHNlIHsgICAvLyBtQ3J5cHRvID09IE5VTEwKKyAgICAgICAgQUxPR0QoIm9uUmVsZWFzZURybTogbUNyeXB0bzogJXAiLCBzcmNJbmZvLT5tQ3J5cHRvLmdldCgpKTsKKyAgICAgICAgc3JjSW5mby0+bUNyeXB0by5jbGVhcigpOworICAgIH0gZWxzZSB7ICAgLy8gc3JjSW5mby0+bUNyeXB0byA9PSBOVUxMCiAgICAgICAgIEFMT0dFKCJvblJlbGVhc2VEcm06IFVuZXhwZWN0ZWQuIFRoZXJlIGlzIG5vIGNyeXB0by4iKTsKICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQpAQCAtMzExMSw0ICszMjg1LDI0IEBACiAgICAgVFJFU1BBU1MoKTsKIH0KIAorTnVQbGF5ZXIyOjpTb3VyY2VJbmZvOjpTb3VyY2VJbmZvKCkKKyAgICA6IG1EYXRhU291cmNlVHlwZShEQVRBX1NPVVJDRV9UWVBFX05PTkUpLAorICAgICAgbVNyY0lkKDApLAorICAgICAgbVNvdXJjZUZsYWdzKDApLAorICAgICAgbVN0YXJ0VGltZVVzKDApLAorICAgICAgbUVuZFRpbWVVcyhEYXRhU291cmNlRGVzYzo6a01heFRpbWVVcykgeworfQorCitOdVBsYXllcjI6OlNvdXJjZUluZm8gJiBOdVBsYXllcjI6OlNvdXJjZUluZm86Om9wZXJhdG9yPShjb25zdCBOdVBsYXllcjI6OlNvdXJjZUluZm8gJm90aGVyKSB7CisgICAgbVNvdXJjZSA9IG90aGVyLm1Tb3VyY2U7CisgICAgbUNyeXB0byA9IG90aGVyLm1DcnlwdG87CisgICAgbURhdGFTb3VyY2VUeXBlID0gKERBVEFfU09VUkNFX1RZUEUpb3RoZXIubURhdGFTb3VyY2VUeXBlOworICAgIG1TcmNJZCA9IG90aGVyLm1TcmNJZDsKKyAgICBtU291cmNlRmxhZ3MgPSBvdGhlci5tU291cmNlRmxhZ3M7CisgICAgbVN0YXJ0VGltZVVzID0gb3RoZXIubVN0YXJ0VGltZVVzOworICAgIG1FbmRUaW1lVXMgPSBvdGhlci5tRW5kVGltZVVzOworICAgIG1Jc0RybVByb3RlY3RlZCA9IG90aGVyLm1Jc0RybVByb3RlY3RlZDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMi5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjIuaAppbmRleCA5NmY4NWY5Li5iOGZiOTg4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMi5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyLmgKQEAgLTIyLDYgKzIyLDExIEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgogCiAjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkludGVyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KT2JqZWN0SG9sZGVyLmg+CisKKyNpbmNsdWRlICJtZWRpYXBsYXllcjIucGIuaCIKKwordXNpbmcgYW5kcm9pZDo6bWVkaWE6Ok1lZGlhUGxheWVyMlByb3RvOjpQbGF5ZXJNZXNzYWdlOwogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTM4LDcgKzQzLDggQEAKIHN0cnVjdCBOdVBsYXllcjJEcml2ZXI7CiAKIHN0cnVjdCBOdVBsYXllcjIgOiBwdWJsaWMgQUhhbmRsZXIgewotICAgIGV4cGxpY2l0IE51UGxheWVyMihwaWRfdCBwaWQsIHVpZF90IHVpZCwgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2spOworICAgIGV4cGxpY2l0IE51UGxheWVyMihwaWRfdCBwaWQsIHVpZF90IHVpZCwKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ2xvY2s+ICZtZWRpYUNsb2NrLCBjb25zdCBzcDxKT2JqZWN0SG9sZGVyPiAmY29udGV4dCk7CiAKICAgICB2b2lkIHNldERyaXZlcihjb25zdCB3cDxOdVBsYXllcjJEcml2ZXI+ICZkcml2ZXIpOwogCkBAIC03NSwxMSArODEsMTIgQEAKICAgICAgICAgICAgIGludDY0X3Qgc2Vla1RpbWVVcywKICAgICAgICAgICAgIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DLAogICAgICAgICAgICAgYm9vbCBuZWVkTm90aWZ5ID0gZmFsc2UpOworICAgIHZvaWQgcmV3aW5kKCk7CiAKICAgICBzdGF0dXNfdCBzZXRWaWRlb1NjYWxpbmdNb2RlKGludDMyX3QgbW9kZSk7Ci0gICAgc3RhdHVzX3QgZ2V0VHJhY2tJbmZvKFBhcmNlbCogcmVwbHkpIGNvbnN0OwotICAgIHN0YXR1c190IGdldFNlbGVjdGVkVHJhY2soaW50MzJfdCB0eXBlLCBQYXJjZWwqIHJlcGx5KSBjb25zdDsKLSAgICBzdGF0dXNfdCBzZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QsIGludDY0X3QgdGltZVVzKTsKKyAgICBzdGF0dXNfdCBnZXRUcmFja0luZm8oaW50NjRfdCBzcmNJZCwgUGxheWVyTWVzc2FnZSogcmVwbHkpIGNvbnN0OworICAgIHN0YXR1c190IGdldFNlbGVjdGVkVHJhY2soaW50NjRfdCBzcmNJZCwgaW50MzJfdCB0eXBlLCBQbGF5ZXJNZXNzYWdlKiByZXBseSkgY29uc3Q7CisgICAgc3RhdHVzX3Qgc2VsZWN0VHJhY2soaW50NjRfdCBzcmNJZCwgc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0LCBpbnQ2NF90IHRpbWVVcyk7CiAgICAgc3RhdHVzX3QgZ2V0Q3VycmVudFBvc2l0aW9uKGludDY0X3QgKm1lZGlhVXMpOwogICAgIHZvaWQgZ2V0U3RhdHMoVmVjdG9yPHNwPEFNZXNzYWdlPiA+ICptVHJhY2tTdGF0cyk7CiAKQEAgLTg3LDggKzk0LDggQEAKICAgICBmbG9hdCBnZXRGcmFtZVJhdGUoKTsKIAogICAgIC8vIE1vZHVsYXIgRFJNCi0gICAgc3RhdHVzX3QgcHJlcGFyZURybShjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJmRybVNlc3Npb25JZCk7Ci0gICAgc3RhdHVzX3QgcmVsZWFzZURybSgpOworICAgIHN0YXR1c190IHByZXBhcmVEcm0oaW50NjRfdCBzcmNJZCwgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZkcm1TZXNzaW9uSWQpOworICAgIHN0YXR1c190IHJlbGVhc2VEcm0oaW50NjRfdCBzcmNJZCk7CiAKICAgICBjb25zdCBjaGFyICpnZXREYXRhU291cmNlVHlwZSgpOwogCkBAIC0xNTAsNiArMTU3LDMyIEBACiAgICAgICAgIGtXaGF0U2V0QnVmZmVyaW5nU2V0dGluZ3MgICAgICAgPSAnc0J1UycsCiAgICAgICAgIGtXaGF0UHJlcGFyZURybSAgICAgICAgICAgICAgICAgPSAncERybScsCiAgICAgICAgIGtXaGF0UmVsZWFzZURybSAgICAgICAgICAgICAgICAgPSAnckRybScsCisgICAgICAgIGtXaGF0UmV3aW5kICAgICAgICAgICAgICAgICAgICAgPSAncmVXZCcsCisgICAgICAgIGtXaGF0RU9TTW9uaXRvciAgICAgICAgICAgICAgICAgPSAnZW9zTScsCisgICAgfTsKKworICAgIHR5cGVkZWYgZW51bSB7CisgICAgICAgIERBVEFfU09VUkNFX1RZUEVfTk9ORSwKKyAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9IVFRQX0xJVkUsCisgICAgICAgIERBVEFfU09VUkNFX1RZUEVfUlRTUCwKKyAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9HRU5FUklDX1VSTCwKKyAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9HRU5FUklDX0ZELAorICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX01FRElBLAorICAgIH0gREFUQV9TT1VSQ0VfVFlQRTsKKworICAgIHN0cnVjdCBTb3VyY2VJbmZvIHsKKyAgICAgICAgU291cmNlSW5mbygpOworICAgICAgICBTb3VyY2VJbmZvICZvcGVyYXRvcj0oY29uc3QgU291cmNlSW5mbyAmKTsKKworICAgICAgICBzcDxTb3VyY2U+IG1Tb3VyY2U7CisgICAgICAgIHN0ZDo6YXRvbWljPERBVEFfU09VUkNFX1RZUEU+IG1EYXRhU291cmNlVHlwZTsKKyAgICAgICAgaW50NjRfdCBtU3JjSWQ7CisgICAgICAgIHVpbnQzMl90IG1Tb3VyY2VGbGFnczsKKyAgICAgICAgaW50NjRfdCBtU3RhcnRUaW1lVXM7CisgICAgICAgIGludDY0X3QgbUVuZFRpbWVVczsKKyAgICAgICAgLy8gTW9kdWxhciBEUk0KKyAgICAgICAgc3A8QU1lZGlhQ3J5cHRvV3JhcHBlcj4gbUNyeXB0bzsKKyAgICAgICAgYm9vbCBtSXNEcm1Qcm90ZWN0ZWQgPSBmYWxzZTsKICAgICB9OwogCiAgICAgd3A8TnVQbGF5ZXIyRHJpdmVyPiBtRHJpdmVyOwpAQCAtMTU3LDIzICsxOTAsMjEgQEAKICAgICB1aWRfdCBtVUlEOwogICAgIGNvbnN0IHNwPE1lZGlhQ2xvY2s+IG1NZWRpYUNsb2NrOwogICAgIE11dGV4IG1Tb3VyY2VMb2NrOyAgLy8gZ3VhcmQgfG1Tb3VyY2V8LgotICAgIHNwPFNvdXJjZT4gbVNvdXJjZTsKLSAgICBpbnQ2NF90IG1TcmNJZDsKLSAgICB1aW50MzJfdCBtU291cmNlRmxhZ3M7Ci0gICAgc3A8U291cmNlPiBtTmV4dFNvdXJjZTsKLSAgICBpbnQ2NF90IG1OZXh0U3JjSWQ7Ci0gICAgdWludDMyX3QgbU5leHRTb3VyY2VGbGFnczsKKyAgICBTb3VyY2VJbmZvIG1DdXJyZW50U291cmNlSW5mbzsKKyAgICBTb3VyY2VJbmZvIG1OZXh0U291cmNlSW5mbzsKICAgICBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gbU5hdGl2ZVdpbmRvdzsKICAgICBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U6OkF1ZGlvU2luaz4gbUF1ZGlvU2luazsKICAgICBzcDxEZWNvZGVyQmFzZT4gbVZpZGVvRGVjb2RlcjsKICAgICBib29sIG1PZmZsb2FkQXVkaW87CiAgICAgc3A8RGVjb2RlckJhc2U+IG1BdWRpb0RlY29kZXI7CisgICAgTXV0ZXggbURlY29kZXJMb2NrOyAgLy8gZ3VhcmQgfG1BdWRpb0RlY29kZXJ8IGFuZCB8bVZpZGVvRGVjb2RlcnwuCiAgICAgc3A8Q0NEZWNvZGVyPiBtQ0NEZWNvZGVyOwogICAgIHNwPFJlbmRlcmVyPiBtUmVuZGVyZXI7CiAgICAgc3A8QUxvb3Blcj4gbVJlbmRlcmVyTG9vcGVyOwogICAgIGludDMyX3QgbUF1ZGlvRGVjb2RlckdlbmVyYXRpb247CiAgICAgaW50MzJfdCBtVmlkZW9EZWNvZGVyR2VuZXJhdGlvbjsKICAgICBpbnQzMl90IG1SZW5kZXJlckdlbmVyYXRpb247CisgICAgaW50MzJfdCBtRU9TTW9uaXRvckdlbmVyYXRpb247CiAKICAgICBNdXRleCBtUGxheWluZ1RpbWVMb2NrOwogICAgIGludDY0X3QgbUxhc3RTdGFydGVkUGxheWluZ1RpbWVOczsKQEAgLTI0NCwyMSArMjc1LDggQEAKICAgICAvLyBQYXVzZSBzdGF0ZSBhcyByZXF1ZXN0ZWQgYnkgc291cmNlIChpbnRlcm5hbGx5KSBkdWUgdG8gYnVmZmVyaW5nCiAgICAgYm9vbCBtUGF1c2VkRm9yQnVmZmVyaW5nOwogCi0gICAgLy8gTW9kdWxhciBEUk0KLSAgICBzcDxBTWVkaWFDcnlwdG9XcmFwcGVyPiBtQ3J5cHRvOwotICAgIGJvb2wgbUlzRHJtUHJvdGVjdGVkOwotCi0gICAgdHlwZWRlZiBlbnVtIHsKLSAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9OT05FLAotICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX0hUVFBfTElWRSwKLSAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9SVFNQLAotICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX0dFTkVSSUNfVVJMLAotICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX0dFTkVSSUNfRkQsCi0gICAgICAgIERBVEFfU09VUkNFX1RZUEVfTUVESUEsCi0gICAgfSBEQVRBX1NPVVJDRV9UWVBFOwotCi0gICAgc3RkOjphdG9taWM8REFUQV9TT1VSQ0VfVFlQRT4gbURhdGFTb3VyY2VUeXBlOwotICAgIHN0ZDo6YXRvbWljPERBVEFfU09VUkNFX1RZUEU+IG1OZXh0RGF0YVNvdXJjZVR5cGU7CisgICAgLy8gUGFzc2VkIGZyb20gSkFWQQorICAgIGNvbnN0IHNwPEpPYmplY3RIb2xkZXI+IG1Db250ZXh0OwogCiAgICAgaW5saW5lIGNvbnN0IHNwPERlY29kZXJCYXNlPiAmZ2V0RGVjb2Rlcihib29sIGF1ZGlvKSB7CiAgICAgICAgIHJldHVybiBhdWRpbyA/IG1BdWRpb0RlY29kZXIgOiBtVmlkZW9EZWNvZGVyOwpAQCAtMjkyLDEyICszMTAsMTQgQEAKICAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmaW5wdXRGb3JtYXQsCiAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCA9IE5VTEwpOwogCi0gICAgdm9pZCBub3RpZnlMaXN0ZW5lcihpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqaW4gPSBOVUxMKTsKKyAgICB2b2lkIG5vdGlmeUxpc3RlbmVyKGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGxheWVyTWVzc2FnZSAqaW4gPSBOVUxMKTsKKworICAgIHZvaWQgYWRkRW5kVGltZU1vbml0b3IoKTsKIAogICAgIHZvaWQgaGFuZGxlRmx1c2hDb21wbGV0ZShib29sIGF1ZGlvLCBib29sIGlzRGVjb2Rlcik7CiAgICAgdm9pZCBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsKIAotICAgIHZvaWQgb25TdGFydCgpOworICAgIHZvaWQgb25TdGFydChib29sIHBsYXkpOwogICAgIHZvaWQgb25SZXN1bWUoKTsKICAgICB2b2lkIG9uUGF1c2UoKTsKIApAQCAtMzMzLDEwICszNTMsMTMgQEAKICAgICB2b2lkIHNlbmRUaW1lZE1ldGFEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwogICAgIHZvaWQgc2VuZFRpbWVkVGV4dERhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CiAKLSAgICB2b2lkIHdyaXRlVHJhY2tJbmZvKFBhcmNlbCogcmVwbHksIGNvbnN0IHNwPEFNZXNzYWdlPiYgZm9ybWF0KSBjb25zdDsKKyAgICB2b2lkIHdyaXRlVHJhY2tJbmZvKFBsYXllck1lc3NhZ2UqIHJlcGx5LCBjb25zdCBzcDxBTWVzc2FnZT4mIGZvcm1hdCkgY29uc3Q7CiAKICAgICBzdGF0dXNfdCBvblByZXBhcmVEcm0oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotICAgIHN0YXR1c190IG9uUmVsZWFzZURybSgpOworICAgIHN0YXR1c190IG9uUmVsZWFzZURybShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKKyAgICBTb3VyY2VJbmZvKiBnZXRTb3VyY2VJbmZvQnlJZEluTXNnKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKyAgICB2b2lkIHJlc2V0U291cmNlSW5mbyhTb3VyY2VJbmZvICZzcmNJbmZvKTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE51UGxheWVyMik7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJDQ0RlY29kZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJDQ0RlY29kZXIuY3BwCmluZGV4IGUyMTU5NjUuLjk4YzM0MDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyQ0NEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkNDRGVjb2Rlci5jcHAKQEAgLTE5OSw2ICsxOTksMTggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3NzaXplX3QgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OmdldFNlbGVjdGVkVHJhY2sobWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdCB7CisgICAgaWYgKG1TZWxlY3RlZFRyYWNrICE9IC0xKSB7CisgICAgICAgIENDVHJhY2sgdHJhY2sgPSBtVHJhY2tzW21TZWxlY3RlZFRyYWNrXTsKKyAgICAgICAgaWYgKHRyYWNrLm1UcmFja1R5cGUgPT0ga1RyYWNrVHlwZUNFQTYwOCB8fCB0cmFjay5tVHJhY2tUeXBlID09IGtUcmFja1R5cGVDRUE3MDgpIHsKKyAgICAgICAgICAgIHJldHVybiAodHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFID8gbVNlbGVjdGVkVHJhY2sgOiAtMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICh0eXBlID09IE1FRElBX1RSQUNLX1RZUEVfVU5LTk9XTiA/IG1TZWxlY3RlZFRyYWNrIDogLTEpOworICAgIH0KKworICAgIHJldHVybiAtMTsKK30KKwogYm9vbCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6aXNTZWxlY3RlZCgpIGNvbnN0IHsKICAgICByZXR1cm4gbVNlbGVjdGVkVHJhY2sgPj0gMCAmJiBtU2VsZWN0ZWRUcmFjayA8IChpbnQzMl90KWdldFRyYWNrQ291bnQoKTsKIH0KQEAgLTU1NSw3ICs1NjcsNyBAQAogCiAgICAgICAgIGNjQnVmLT5tZXRhKCktPnNldEludDMyKEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSU5ERVgsIG1TZWxlY3RlZFRyYWNrKTsKICAgICAgICAgY2NCdWYtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7Ci0gICAgICAgIGNjQnVmLT5tZXRhKCktPnNldEludDY0KCJkdXJhdGlvblVzIiwgMGxsKTsKKyAgICAgICAgY2NCdWYtPm1ldGEoKS0+c2V0SW50NjQoImR1cmF0aW9uVXMiLCAwTEwpOwogCiAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKICAgICAgICAgbXNnLT5zZXRJbnQzMigid2hhdCIsIGtXaGF0Q2xvc2VkQ2FwdGlvbkRhdGEpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJDQ0RlY29kZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyQ0NEZWNvZGVyLmgKaW5kZXggNTdkNWVhMi4uOTc4MzRkMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJDQ0RlY29kZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkNDRGVjb2Rlci5oCkBAIC0zOCw2ICszOCw3IEBACiAgICAgc2l6ZV90IGdldFRyYWNrQ291bnQoKSBjb25zdDsKICAgICBzcDxBTWVzc2FnZT4gZ2V0VHJhY2tJbmZvKHNpemVfdCBpbmRleCkgY29uc3Q7CiAgICAgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IGluZGV4LCBib29sIHNlbGVjdCk7CisgICAgc3NpemVfdCBnZXRTZWxlY3RlZFRyYWNrKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3Q7CiAgICAgYm9vbCBpc1NlbGVjdGVkKCkgY29uc3Q7CiAgICAgdm9pZCBkZWNvZGUoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpOwogICAgIHZvaWQgZGlzcGxheShpbnQ2NF90IHRpbWVVcyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyLmNwcAppbmRleCA2NDUxMzhhLi42NmJmYWU1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2Rlci5jcHAKQEAgLTcxLDEwICs3MSwxMCBAQAogICAgICAgbUNDRGVjb2RlcihjY0RlY29kZXIpLAogICAgICAgbVBpZChwaWQpLAogICAgICAgbVVpZCh1aWQpLAotICAgICAgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzKC0xbGwpLAotICAgICAgbU51bUZyYW1lc1RvdGFsKDBsbCksCi0gICAgICBtTnVtSW5wdXRGcmFtZXNEcm9wcGVkKDBsbCksCi0gICAgICBtTnVtT3V0cHV0RnJhbWVzRHJvcHBlZCgwbGwpLAorICAgICAgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzKC0xTEwpLAorICAgICAgbU51bUZyYW1lc1RvdGFsKDBMTCksCisgICAgICBtTnVtSW5wdXRGcmFtZXNEcm9wcGVkKDBMTCksCisgICAgICBtTnVtT3V0cHV0RnJhbWVzRHJvcHBlZCgwTEwpLAogICAgICAgbVZpZGVvV2lkdGgoMCksCiAgICAgICBtVmlkZW9IZWlnaHQoMCksCiAgICAgICBtSXNBdWRpbyh0cnVlKSwKQEAgLTEwNyw3ICsxMDcsMTIgQEAKICAgICBtU3RhdHMtPnNldEludDY0KCJmcmFtZXMtdG90YWwiLCBtTnVtRnJhbWVzVG90YWwpOwogICAgIG1TdGF0cy0+c2V0SW50NjQoImZyYW1lcy1kcm9wcGVkLWlucHV0IiwgbU51bUlucHV0RnJhbWVzRHJvcHBlZCk7CiAgICAgbVN0YXRzLT5zZXRJbnQ2NCgiZnJhbWVzLWRyb3BwZWQtb3V0cHV0IiwgbU51bU91dHB1dEZyYW1lc0Ryb3BwZWQpOwotICAgIHJldHVybiBtU3RhdHM7CisgICAgbVN0YXRzLT5zZXRGbG9hdCgiZnJhbWUtcmF0ZS10b3RhbCIsIG1GcmFtZVJhdGVUb3RhbCk7CisKKyAgICAvLyBpJ20gbXV0ZXhlZCByaWdodCBub3cuCisgICAgLy8gbWFrZSBvdXIgb3duIGNvcHksIHNvIHdlIGFyZW4ndCB2aWN0aW0gdG8gYW55IGxhdGVyIGNoYW5nZXMuCisgICAgc3A8QU1lc3NhZ2U+IGNvcGllZFN0YXRzID0gbVN0YXRzLT5kdXAoKTsKKyAgICByZXR1cm4gY29waWVkU3RhdHM7CiB9CiAKIHN0YXR1c190IE51UGxheWVyMjo6RGVjb2Rlcjo6c2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiAmbnd3KSB7CkBAIC00MjgsMTAgKzQzMywxMCBAQAogICAgICAgICAvLyBUT0RPOiBGb3Igbm93LCBsYXllciBmcHMgaXMgY2FsY3VsYXRlZCBmb3Igc29tZSBzcGVjaWZpYyBhcmNoaXRlY3R1cmVzLgogICAgICAgICAvLyBCdXQgaXQgcmVhbGx5IHNob3VsZCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgc3RyZWFtLgogICAgICAgICBtVmlkZW9UZW1wb3JhbExheWVyQWdncmVnYXRlRnBzWzBdID0KLSAgICAgICAgICAgIG1GcmFtZVJhdGVUb3RhbCAvIChmbG9hdCkoMWxsIDw8IChtTnVtVmlkZW9UZW1wb3JhbExheWVyVG90YWwgLSAxKSk7CisgICAgICAgICAgICBtRnJhbWVSYXRlVG90YWwgLyAoZmxvYXQpKDFMTCA8PCAobU51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsIC0gMSkpOwogICAgICAgICBmb3IgKGludDMyX3QgaSA9IDE7IGkgPCBtTnVtVmlkZW9UZW1wb3JhbExheWVyVG90YWw7ICsraSkgewogICAgICAgICAgICAgbVZpZGVvVGVtcG9yYWxMYXllckFnZ3JlZ2F0ZUZwc1tpXSA9Ci0gICAgICAgICAgICAgICAgbUZyYW1lUmF0ZVRvdGFsIC8gKGZsb2F0KSgxbGwgPDwgKG1OdW1WaWRlb1RlbXBvcmFsTGF5ZXJUb3RhbCAtIGkpKQorICAgICAgICAgICAgICAgIG1GcmFtZVJhdGVUb3RhbCAvIChmbG9hdCkoMUxMIDw8IChtTnVtVmlkZW9UZW1wb3JhbExheWVyVG90YWwgLSBpKSkKICAgICAgICAgICAgICAgICArIG1WaWRlb1RlbXBvcmFsTGF5ZXJBZ2dyZWdhdGVGcHNbaSAtIDFdOwogICAgICAgICB9CiAgICAgfQpAQCAtOTUyLDcgKzk1Nyw3IEBACiAKICAgICAgICAgICAgIGludDMyX3QgbGF5ZXJJZCA9IDA7CiAgICAgICAgICAgICBib29sIGhhdmVMYXllcklkID0gYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50MzIoInRlbXBvcmFsLWxheWVyLWlkIiwgJmxheWVySWQpOwotICAgICAgICAgICAgaWYgKG1SZW5kZXJlci0+Z2V0VmlkZW9MYXRlQnlVcygpID4gMTAwMDAwbGwKKyAgICAgICAgICAgIGlmIChtUmVuZGVyZXItPmdldFZpZGVvTGF0ZUJ5VXMoKSA+IDEwMDAwMExMCiAgICAgICAgICAgICAgICAgICAgICYmIG1Jc1ZpZGVvQVZDCiAgICAgICAgICAgICAgICAgICAgICYmICFJc0FWQ1JlZmVyZW5jZUZyYW1lKGFjY2Vzc1VuaXQpKSB7CiAgICAgICAgICAgICAgICAgZHJvcEFjY2Vzc1VuaXQgPSB0cnVlOwpAQCAtMTA4OCw2ICsxMDkzLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxNZWRpYUJ1ZmZlckhvbGRlcio+KGhvbGRlci5nZXQoKSktPm1lZGlhQnVmZmVyKCkgOiBudWxscHRyOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAobWVkaWFCdWYgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBpZiAobWVkaWFCdWYtPnNpemUoKSA+IGNvZGVjQnVmZmVyLT5jYXBhY2l0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcihFUlJPUl9CVUZGRVJfVE9PX1NNQUxMKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1EZXF1ZXVlZElucHV0QnVmZmVycy5wdXNoX2JhY2soYnVmZmVySXgpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPnNldFJhbmdlKDAsIG1lZGlhQnVmLT5zaXplKCkpOwogICAgICAgICAgICAgICAgICAgICBtZW1jcHkoY29kZWNCdWZmZXItPmRhdGEoKSwgbWVkaWFCdWYtPmRhdGEoKSwgbWVkaWFCdWYtPnNpemUoKSk7CiAKQEAgLTExMDIsNiArMTExMywxMSBAQAogICAgICAgICAgICAgfSAvLyBidWZmZXItPmRhdGEoKQogICAgICAgICB9IC8vIG5lZWRzQ29weQogCisgICAgICAgIHNwPFJlZkJhc2U+IGNyeXB0SW5mb09iajsKKyAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kT2JqZWN0KCJjcnlwdEluZm8iLCAmY3J5cHRJbmZvT2JqKSkgeworICAgICAgICAgICAgY3J5cHRJbmZvID0gc3RhdGljX2Nhc3Q8QU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlciAqPihjcnlwdEluZm9PYmouZ2V0KCkpOworICAgICAgICB9CisKICAgICAgICAgc3RhdHVzX3QgZXJyOwogICAgICAgICBpZiAoY3J5cHRJbmZvICE9IE5VTEwpIHsKICAgICAgICAgICAgIGVyciA9IG1Db2RlYy0+cXVldWVTZWN1cmVJbnB1dEJ1ZmZlcigKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2RlckJhc2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyQmFzZS5jcHAKaW5kZXggOWMxOTg4Zi4uOTE0ZjI5ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyQmFzZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyQmFzZS5jcHAKQEAgLTM4LDcgKzM4LDcgQEAKICAgICAvLyBFdmVyeSBkZWNvZGVyIGhhcyBpdHMgb3duIGxvb3BlciBiZWNhdXNlIE1lZGlhQ29kZWMgb3BlcmF0aW9ucwogICAgIC8vIGFyZSBibG9ja2luZywgYnV0IE51UGxheWVyMiBuZWVkcyBhc3luY2hyb25vdXMgb3BlcmF0aW9ucy4KICAgICBtRGVjb2Rlckxvb3BlciA9IG5ldyBBTG9vcGVyOwotICAgIG1EZWNvZGVyTG9vcGVyLT5zZXROYW1lKCJOUERlY29kZXIiKTsKKyAgICBtRGVjb2Rlckxvb3Blci0+c2V0TmFtZSgiTlAyRGVjb2RlciIpOwogICAgIG1EZWNvZGVyTG9vcGVyLT5zdGFydChmYWxzZSwgLyogcnVuT25DYWxsaW5nVGhyZWFkICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsICAvKiBjYW5DYWxsSmF2YSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKQEAgLTEyMiw3ICsxMjIsNyBAQAogICAgICAgICBtUmVxdWVzdElucHV0QnVmZmVyc1BlbmRpbmcgPSB0cnVlOwogCiAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZXF1ZXN0SW5wdXRCdWZmZXJzLCB0aGlzKTsKLSAgICAgICAgbXNnLT5wb3N0KDEwICogMTAwMGxsKTsKKyAgICAgICAgbXNnLT5wb3N0KDEwICogMTAwMExMKTsKICAgICB9CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2RlclBhc3NUaHJvdWdoLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2RlclBhc3NUaHJvdWdoLmNwcAppbmRleCAwZTBjMWQ4Li4wNTE0ZTg4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXJQYXNzVGhyb3VnaC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyUGFzc1Rocm91Z2guY3BwCkBAIC00Niw3ICs0Niw3IEBACiAgICAgOiBEZWNvZGVyQmFzZShub3RpZnkpLAogICAgICAgbVNvdXJjZShzb3VyY2UpLAogICAgICAgbVJlbmRlcmVyKHJlbmRlcmVyKSwKLSAgICAgIG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVcygtMWxsKSwKKyAgICAgIG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVcygtMUxMKSwKICAgICAgIG1SZWFjaGVkRU9TKHRydWUpLAogICAgICAgbVBlbmRpbmdBdWRpb0VycihPSyksCiAgICAgICBtUGVuZGluZ0J1ZmZlcnNUb0RyYWluKDApLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuY3BwCmluZGV4IDAzZDE3YTUuLjE4NzY0OTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJpdmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRyaXZlci5jcHAKQEAgLTE3LDYgKzE3LDcgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTnVQbGF5ZXIyRHJpdmVyIgogI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKQEAgLTM2LDQ5ICszNyw1MSBAQAogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQW5hbHl0aWNzU2VydmljZS5oPgogCit1c2luZyBnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkOwordXNpbmcgYW5kcm9pZDo6bWVkaWE6Ok1lZGlhUGxheWVyMlByb3RvOjpWYWx1ZTsKKwogc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tSZXRyaWVzID0gNTA7CiBzdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1NsZWVwVXMgPSAyMDAwMDsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgUGFyY2VsV3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBzdGF0aWMgc3A8UGFyY2VsV3JhcHBlcj4gQ3JlYXRlKGNvbnN0IFBhcmNlbCAqcCkgeworc3RydWN0IFBsYXllck1lc3NhZ2VXcmFwcGVyIDogcHVibGljIFJlZkJhc2UgeworICAgIHN0YXRpYyBzcDxQbGF5ZXJNZXNzYWdlV3JhcHBlcj4gQ3JlYXRlKGNvbnN0IFBsYXllck1lc3NhZ2UgKnApIHsKICAgICAgICAgaWYgKHAgIT0gTlVMTCkgewotICAgICAgICAgICAgc3A8UGFyY2VsV3JhcHBlcj4gcHcgPSBuZXcgUGFyY2VsV3JhcHBlcigpOwotICAgICAgICAgICAgaWYgKHB3LT5hcHBlbmRGcm9tKHApID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHB3OwotICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8UGxheWVyTWVzc2FnZVdyYXBwZXI+IHB3ID0gbmV3IFBsYXllck1lc3NhZ2VXcmFwcGVyKCk7CisgICAgICAgICAgICBwdy0+Y29weUZyb20ocCk7CisgICAgICAgICAgICByZXR1cm4gcHc7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgY29uc3QgUGFyY2VsICpnZXRQYXJjZWwoKSB7Ci0gICAgICAgIHJldHVybiBtUGFyY2VsOworICAgIGNvbnN0IFBsYXllck1lc3NhZ2UgKmdldFBsYXllck1lc3NhZ2UoKSB7CisgICAgICAgIHJldHVybiBtUGxheWVyTWVzc2FnZTsKICAgICB9CiAKIHByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5QYXJjZWxXcmFwcGVyKCkgewotICAgICAgICBpZiAobVBhcmNlbCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBkZWxldGUgbVBhcmNlbDsKKyAgICB2aXJ0dWFsIH5QbGF5ZXJNZXNzYWdlV3JhcHBlcigpIHsKKyAgICAgICAgaWYgKG1QbGF5ZXJNZXNzYWdlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBtUGxheWVyTWVzc2FnZTsKICAgICAgICAgfQogICAgIH0KIAogcHJpdmF0ZToKLSAgICBQYXJjZWxXcmFwcGVyKCkKLSAgICAgICAgOiBtUGFyY2VsKE5VTEwpIHsgfQorICAgIFBsYXllck1lc3NhZ2VXcmFwcGVyKCkKKyAgICAgICAgOiBtUGxheWVyTWVzc2FnZShOVUxMKSB7IH0KIAotICAgIHN0YXR1c190IGFwcGVuZEZyb20oY29uc3QgUGFyY2VsICpwKSB7Ci0gICAgICAgIGlmIChtUGFyY2VsID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1QYXJjZWwgPSBuZXcgUGFyY2VsOworICAgIHZvaWQgY29weUZyb20oY29uc3QgUGxheWVyTWVzc2FnZSAqcCkgeworICAgICAgICBpZiAobVBsYXllck1lc3NhZ2UgPT0gTlVMTCkgeworICAgICAgICAgICAgbVBsYXllck1lc3NhZ2UgPSBuZXcgUGxheWVyTWVzc2FnZTsKICAgICAgICAgfQotICAgICAgICByZXR1cm4gbVBhcmNlbC0+YXBwZW5kRnJvbShwLCAwIC8qIHN0YXJ0ICovLCBwLT5kYXRhU2l6ZSgpKTsKKyAgICAgICAgbVBsYXllck1lc3NhZ2UtPkNvcHlGcm9tKCpwKTsKICAgICB9CiAKLSAgICBQYXJjZWwgKm1QYXJjZWw7CisgICAgUGxheWVyTWVzc2FnZSAqbVBsYXllck1lc3NhZ2U7CiB9OwogCiAvLyBrZXkgZm9yIG1lZGlhIHN0YXRpc3RpY3MKLXN0YXRpYyBjb25zdCBjaGFyICprS2V5UGxheWVyID0gIm51cGxheWVyIjsKK3N0YXRpYyBjb25zdCBjaGFyICprS2V5UGxheWVyID0gIm51cGxheWVyMiI7CiAvLyBhdHRycyBmb3IgbWVkaWEgc3RhdGlzdGljcwogICAgIC8vIE5COiB0aGVzZSBhcmUgbWF0Y2hlZCB3aXRoIHB1YmxpYyBKYXZhIEFQSSBjb25zdGFudHMgZGVmaW5lZAogICAgIC8vIGluIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvTWVkaWFQbGF5ZXIyLmphdmEKQEAgLTg5LDYgKzkyLDcgQEAKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVySGVpZ2h0ID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuaGVpZ2h0IjsKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRnJhbWVzID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZnJhbWVzIjsKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRnJhbWVzRHJvcHBlZCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmRyb3BwZWQiOworc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJGcmFtZVJhdGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5mcHMiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJBTWltZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmF1ZGlvLm1pbWUiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJBQ29kZWMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5hdWRpby5jb2RlYyI7CiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckR1cmF0aW9uID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZHVyYXRpb25NcyI7CkBAIC0xMDQsOCArMTA4LDEwIEBACiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllclJlYnVmZmVyaW5nQ291bnQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5yZWJ1ZmZlcnMiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJSZWJ1ZmZlcmluZ0F0RXhpdCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnJlYnVmZmVyRXhpdCI7CiAKK3N0YXRpYyBjb25zdCBjaGFyICprUGxheWVyVmVyc2lvbiA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnZlcnNpb24iOwogCi1OdVBsYXllcjJEcml2ZXI6Ok51UGxheWVyMkRyaXZlcihwaWRfdCBwaWQsIHVpZF90IHVpZCkKKworTnVQbGF5ZXIyRHJpdmVyOjpOdVBsYXllcjJEcml2ZXIocGlkX3QgcGlkLCB1aWRfdCB1aWQsIGNvbnN0IHNwPEpPYmplY3RIb2xkZXI+ICZjb250ZXh0KQogICAgIDogbVN0YXRlKFNUQVRFX0lETEUpLAogICAgICAgbUFzeW5jUmVzdWx0KFVOS05PV05fRVJST1IpLAogICAgICAgbVNyY0lkKDApLApAQCAtMTIwLDkgKzEyNiwxMCBAQAogICAgICAgbUxvb3BlcihuZXcgQUxvb3BlciksCiAgICAgICBtTnVQbGF5ZXIyTG9vcGVyKG5ldyBBTG9vcGVyKSwKICAgICAgIG1NZWRpYUNsb2NrKG5ldyBNZWRpYUNsb2NrKSwKLSAgICAgIG1QbGF5ZXIobmV3IE51UGxheWVyMihwaWQsIHVpZCwgbU1lZGlhQ2xvY2spKSwKKyAgICAgIG1QbGF5ZXIobmV3IE51UGxheWVyMihwaWQsIHVpZCwgbU1lZGlhQ2xvY2ssIGNvbnRleHQpKSwKICAgICAgIG1QbGF5ZXJGbGFncygwKSwKLSAgICAgIG1BbmFseXRpY3NJdGVtKE5VTEwpLAorICAgICAgbU1ldHJpY3NIYW5kbGUoMCksCisgICAgICBtUGxheWVyVmVyc2lvbigwKSwKICAgICAgIG1DbGllbnRVaWQodWlkKSwKICAgICAgIG1BdEVPUyhmYWxzZSksCiAgICAgICBtTG9vcGluZyhmYWxzZSksCkBAIC0xMzMsOSArMTQwLDEzIEBACiAKICAgICBtTWVkaWFDbG9jay0+aW5pdCgpOwogCi0gICAgLy8gc2V0IHVwIGFuIGFuYWx5dGljcyByZWNvcmQKLSAgICBtQW5hbHl0aWNzSXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa0tleVBsYXllcik7Ci0gICAgbUFuYWx5dGljc0l0ZW0tPnNldFVpZChtQ2xpZW50VWlkKTsKKyAgICAvLyBYWFg6IHdoYXQgdmVyc2lvbiBhcmUgd2U/CisgICAgLy8gSWRlYWxseSwgdGhpcyB0aWNrcyB3aXRoIHRoZSBhcGsgdmVyc2lvbiBpbmZvIGZvciB0aGUgQVBFWCBwYWNrYWdpbmcKKworICAgIC8vIHNldCB1cCBtZWRpYSBtZXRyaWNzIHJlY29yZAorICAgIG1NZXRyaWNzSGFuZGxlID0gbWVkaWFtZXRyaWNzX2NyZWF0ZShrS2V5UGxheWVyKTsKKyAgICBtZWRpYW1ldHJpY3Nfc2V0VWlkKG1NZXRyaWNzSGFuZGxlLCBtQ2xpZW50VWlkKTsKKyAgICBtZWRpYW1ldHJpY3Nfc2V0SW50NjQobU1ldHJpY3NIYW5kbGUsIGtQbGF5ZXJWZXJzaW9uLCBtUGxheWVyVmVyc2lvbik7CiAKICAgICBtTnVQbGF5ZXIyTG9vcGVyLT5zdGFydCgKICAgICAgICAgICAgIGZhbHNlLCAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8KQEAgLTE1NiwxMCArMTY3LDcgQEAKICAgICB1cGRhdGVNZXRyaWNzKCJkZXN0cnVjdG9yIik7CiAgICAgbG9nTWV0cmljcygiZGVzdHJ1Y3RvciIpOwogCi0gICAgaWYgKG1BbmFseXRpY3NJdGVtICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIG1BbmFseXRpY3NJdGVtOwotICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IE5VTEw7Ci0gICAgfQorICAgIG1lZGlhbWV0cmljc19kZWxldGUobU1ldHJpY3NIYW5kbGUpOwogfQogCiBzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OmluaXRDaGVjaygpIHsKQEAgLTI3MiwxMyArMjgwLDYgQEAKICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BSRVBBUklORzsKICAgICAgICAgICAgIG1QbGF5ZXItPnByZXBhcmVBc3luYygpOwogICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRUQ6Ci0gICAgICAgICAgICAvLyB0aGlzIGlzIHJlYWxseSBqdXN0IHBhdXNlZC4gaGFuZGxlIGFzIHNlZWsgdG8gc3RhcnQKLSAgICAgICAgICAgIG1BdEVPUyA9IGZhbHNlOwotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HOwotICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmMoMCwgTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQyAvKiBtb2RlICovLAotICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIG5lZWROb3RpZnkgKi8pOwotICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH07CkBAIC0yOTMsMTggKzI5NCwxNiBAQAogc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpzdGFydF9sKCkgewogICAgIHN3aXRjaCAobVN0YXRlKSB7CiAgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgotICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVEOgogICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUkVEOgogICAgICAgICB7CiAgICAgICAgICAgICBtUGxheWVyLT5zdGFydCgpOwotCi0gICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBTVEFURV9SVU5OSU5HOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAobUF0RU9TKSB7Ci0gICAgICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmMoMCk7CisgICAgICAgICAgICAgICAgbVBsYXllci0+cmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgbUF0RU9TID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgbVBvc2l0aW9uVXMgPSAtMTsKICAgICAgICAgICAgIH0KQEAgLTMyMCwzNCArMzE5LDYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6c3RvcCgpIHsKLSAgICBBTE9HRCgic3RvcCglcCkiLCB0aGlzKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgc3dpdGNoIChtU3RhdGUpIHsKLSAgICAgICAgY2FzZSBTVEFURV9SVU5OSU5HOgotICAgICAgICAgICAgbVBsYXllci0+cGF1c2UoKTsKLSAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAotCi0gICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKLSAgICAgICAgICAgIC8vbm90aWZ5TGlzdGVuZXJfbChNRURJQTJfU1RPUFBFRCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUkVEOgotICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRUQ6Ci0gICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HOgotICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVEOgotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCiBzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnBhdXNlKCkgewogICAgIEFMT0dEKCJwYXVzZSglcCkiLCB0aGlzKTsKICAgICAvLyBUaGUgTnVQbGF5ZXJSZW5kZXJlciBtYXkgZ2V0IGZsdXNoZWQgaWYgcGF1c2UgZm9yIGxvbmcgZW5vdWdoLCBlLmcuIHRoZSBwYXVzZSB0aW1lb3V0IHRlYXIKQEAgLTM2MSw5ICszMzIsOSBAQAogCiAgICAgc3dpdGNoIChtU3RhdGUpIHsKICAgICAgICAgY2FzZSBTVEFURV9QQVVTRUQ6Ci0gICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSRUQ6CiAgICAgICAgICAgICByZXR1cm4gT0s7CiAKKyAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJFRDoKICAgICAgICAgY2FzZSBTVEFURV9SVU5OSU5HOgogICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfUEFVU0VEOwogICAgICAgICAgICAgbVBsYXllci0+cGF1c2UoKTsKQEAgLTM4NiwxNSArMzU3LDYgQEAKICAgICAgICAgLy8gdHJ5IHRvIHVwZGF0ZSBwb3NpdGlvbgogICAgICAgICBpbnQ2NF90IHVudXNlZDsKICAgICAgICAgZ2V0Q3VycmVudFBvc2l0aW9uKCZ1bnVzZWQpOwotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgICAgICBpZiAocmF0ZS5tU3BlZWQgPT0gMC5mICYmIG1TdGF0ZSA9PSBTVEFURV9SVU5OSU5HKSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9QQVVTRUQ7Ci0gICAgICAgIH0gZWxzZSBpZiAocmF0ZS5tU3BlZWQgIT0gMC5mCi0gICAgICAgICAgICAgICAgJiYgKG1TdGF0ZSA9PSBTVEFURV9QQVVTRUQKLSAgICAgICAgICAgICAgICAgICAgfHwgbVN0YXRlID09IFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVECi0gICAgICAgICAgICAgICAgICAgIHx8IG1TdGF0ZSA9PSBTVEFURV9QUkVQQVJFRCkpIHsKLSAgICAgICAgICAgIGVyciA9IHN0YXJ0X2woKTsKLSAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZXJyOwogfQpAQCAtNDE1LDExICszNzcsMTAgQEAKICAgICBBTE9HRCgic2Vla1RvKCVwKSAoJWxsZCBtcywgJWQpIGF0IHN0YXRlICVkIiwgdGhpcywgKGxvbmcgbG9uZyltc2VjLCBtb2RlLCBtU3RhdGUpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKLSAgICBpbnQ2NF90IHNlZWtUaW1lVXMgPSBtc2VjICogMTAwMGxsOworICAgIGludDY0X3Qgc2Vla1RpbWVVcyA9IG1zZWMgKiAxMDAwTEw7CiAKICAgICBzd2l0Y2ggKG1TdGF0ZSkgewogICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUkVEOgotICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVEOgogICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDoKICAgICAgICAgY2FzZSBTVEFURV9SVU5OSU5HOgogICAgICAgICB7CkBAIC00NzAsNyArNDMxLDcgQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCi0gICAgKm1zZWMgPSAobUR1cmF0aW9uVXMgKyA1MDBsbCkgLyAxMDAwOworICAgICptc2VjID0gKG1EdXJhdGlvblVzICsgNTAwTEwpIC8gMTAwMDsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTQ5NywxNSArNDU4LDE1IEBACiAKICAgICAgICAgICAgIGlmIChtaW1lLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7CiAgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OwotICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJWTWltZSwgbWltZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhtTWV0cmljc0hhbmRsZSwga1BsYXllclZNaW1lLCBtaW1lLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIGlmICghbmFtZS5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJWQ29kZWMsIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyVkNvZGVjLCBuYW1lLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChzdGF0cy0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkKICAgICAgICAgICAgICAgICAgICAgICAgICYmIHN0YXRzLT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUGxheWVyV2lkdGgsIHdpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJIZWlnaHQsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga1BsYXllcldpZHRoLCB3aWR0aCk7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga1BsYXllckhlaWdodCwgaGVpZ2h0KTsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpbnQ2NF90IG51bUZyYW1lc1RvdGFsID0gMDsKQEAgLTUxMywxNCArNDc0LDE4IEBACiAgICAgICAgICAgICAgICAgc3RhdHMtPmZpbmRJbnQ2NCgiZnJhbWVzLXRvdGFsIiwgJm51bUZyYW1lc1RvdGFsKTsKICAgICAgICAgICAgICAgICBzdGF0cy0+ZmluZEludDY0KCJmcmFtZXMtZHJvcHBlZC1vdXRwdXQiLCAmbnVtRnJhbWVzRHJvcHBlZCk7CiAKLSAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa1BsYXllckZyYW1lcywgbnVtRnJhbWVzVG90YWwpOwotICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyRnJhbWVzRHJvcHBlZCwgbnVtRnJhbWVzRHJvcHBlZCk7CisgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDY0KG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyRnJhbWVzLCBudW1GcmFtZXNUb3RhbCk7CisgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDY0KG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyRnJhbWVzRHJvcHBlZCwgbnVtRnJhbWVzRHJvcHBlZCk7CiAKKyAgICAgICAgICAgICAgICBmbG9hdCBmcmFtZVJhdGUgPSAwOworICAgICAgICAgICAgICAgIGlmIChzdGF0cy0+ZmluZEZsb2F0KCJmcmFtZS1yYXRlLW91dHB1dCIsICZmcmFtZVJhdGUpKSB7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQ2NChtTWV0cmljc0hhbmRsZSwga1BsYXllckZyYW1lUmF0ZSwgZnJhbWVSYXRlKTsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIH0gZWxzZSBpZiAobWltZS5zdGFydHNXaXRoKCJhdWRpby8iKSkgewotICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJBTWltZSwgbWltZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhtTWV0cmljc0hhbmRsZSwga1BsYXllckFNaW1lLCBtaW1lLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIGlmICghbmFtZS5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJBQ29kZWMsIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyQUNvZGVjLCBuYW1lLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTMxLDE3ICs0OTYsMTcgQEAKICAgICAvLyBnZXREdXJhdGlvbigpIHVzZXMgbUxvY2sgZm9yIG11dGV4IC0tIGNhcmVmdWwgd2hlcmUgd2UgdXNlIGl0LgogICAgIGludDY0X3QgZHVyYXRpb25fbXMgPSAtMTsKICAgICBnZXREdXJhdGlvbigmZHVyYXRpb25fbXMpOwotICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyRHVyYXRpb24sIGR1cmF0aW9uX21zKTsKKyAgICBtZWRpYW1ldHJpY3Nfc2V0SW50NjQobU1ldHJpY3NIYW5kbGUsIGtQbGF5ZXJEdXJhdGlvbiwgZHVyYXRpb25fbXMpOwogCi0gICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtQbGF5ZXJQbGF5aW5nLCAobVBsYXlpbmdUaW1lVXMrNTAwKS8xMDAwICk7CisgICAgbWVkaWFtZXRyaWNzX3NldEludDY0KG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyUGxheWluZywgKG1QbGF5aW5nVGltZVVzKzUwMCkvMTAwMCApOwogCiAgICAgaWYgKG1SZWJ1ZmZlcmluZ0V2ZW50cyAhPSAwKSB7Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyUmVidWZmZXJpbmcsIChtUmVidWZmZXJpbmdUaW1lVXMrNTAwKS8xMDAwICk7Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUGxheWVyUmVidWZmZXJpbmdDb3VudCwgbVJlYnVmZmVyaW5nRXZlbnRzKTsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJSZWJ1ZmZlcmluZ0F0RXhpdCwgbVJlYnVmZmVyaW5nQXRFeGl0KTsKKyAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDY0KG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyUmVidWZmZXJpbmcsIChtUmVidWZmZXJpbmdUaW1lVXMrNTAwKS8xMDAwICk7CisgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga1BsYXllclJlYnVmZmVyaW5nQ291bnQsIG1SZWJ1ZmZlcmluZ0V2ZW50cyk7CisgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga1BsYXllclJlYnVmZmVyaW5nQXRFeGl0LCBtUmVidWZmZXJpbmdBdEV4aXQpOwogICAgIH0KIAotICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJEYXRhU291cmNlVHlwZSwgbVBsYXllci0+Z2V0RGF0YVNvdXJjZVR5cGUoKSk7CisgICAgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcobU1ldHJpY3NIYW5kbGUsIGtQbGF5ZXJEYXRhU291cmNlVHlwZSwgbVBsYXllci0+Z2V0RGF0YVNvdXJjZVR5cGUoKSk7CiB9CiAKIApAQCAtNTUxLDcgKzUxNiw3IEBACiAgICAgfQogICAgIEFMT0dWKCJsb2dNZXRyaWNzKCVwKSBmcm9tICVzIGF0IHN0YXRlICVkIiwgdGhpcywgd2hlcmUsIG1TdGF0ZSk7CiAKLSAgICBpZiAobUFuYWx5dGljc0l0ZW0gPT0gTlVMTCB8fCBtQW5hbHl0aWNzSXRlbS0+aXNFbmFibGVkKCkgPT0gZmFsc2UpIHsKKyAgICBpZiAobU1ldHJpY3NIYW5kbGUgPT0gMCB8fCBtZWRpYW1ldHJpY3NfaXNFbmFibGVkKCkgPT0gZmFsc2UpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtNTYwLDE2ICs1MjUsMTMgQEAKICAgICAvLyBhbmQgdGhhdCBhbHdheXMgaW5qZWN0cyAzIGZpZWxkcyAoZHVyYXRpb24sIHBsYXlpbmcgdGltZSwgYW5kCiAgICAgLy8gZGF0YXNvdXJjZSkgaW50byB0aGUgcmVjb3JkLgogICAgIC8vIFNvIHRoZSBjYW5vbmljYWwgImVtcHR5IiByZWNvcmQgaGFzIDMgZWxlbWVudHMgaW4gaXQuCi0gICAgaWYgKG1BbmFseXRpY3NJdGVtLT5jb3VudCgpID4gMykgewotCi0gICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZWxmcmVjb3JkKCk7Ci0KKyAgICBpZiAobWVkaWFtZXRyaWNzX2NvdW50KG1NZXRyaWNzSGFuZGxlKSA+IDMpIHsKKyAgICAgICAgbWVkaWFtZXRyaWNzX3NlbGZSZWNvcmQobU1ldHJpY3NIYW5kbGUpOwogICAgICAgICAvLyByZS1pbml0IGluIGNhc2Ugd2UgcHJlcGFyZSgpIGFuZCBzdGFydCgpIGFnYWluLgotICAgICAgICBkZWxldGUgbUFuYWx5dGljc0l0ZW0gOwotICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa0tleVBsYXllcik7Ci0gICAgICAgIGlmIChtQW5hbHl0aWNzSXRlbSkgewotICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldFVpZChtQ2xpZW50VWlkKTsKLSAgICAgICAgfQorICAgICAgICBtZWRpYW1ldHJpY3NfZGVsZXRlKG1NZXRyaWNzSGFuZGxlKTsKKyAgICAgICAgbU1ldHJpY3NIYW5kbGUgPSBtZWRpYW1ldHJpY3NfY3JlYXRlKGtLZXlQbGF5ZXIpOworICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0VWlkKG1NZXRyaWNzSGFuZGxlLCBtQ2xpZW50VWlkKTsKKyAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDY0KG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyVmVyc2lvbiwgbVBsYXllclZlcnNpb24pOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dWKCJkaWQgbm90IGhhdmUgYW55dGhpbmcgdG8gcmVjb3JkIik7CiAgICAgfQpAQCAtNjAxLDEwICs1NjMsNiBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9TVE9QUEVEKSB7Ci0gICAgICAgIC8vIG5vdGlmeUxpc3RlbmVyX2woTUVESUEyX1NUT1BQRUQpOwotICAgIH0KLQogICAgIG1TdGF0ZSA9IFNUQVRFX1JFU0VUX0lOX1BST0dSRVNTOwogICAgIG1QbGF5ZXItPnJlc2V0QXN5bmMoKTsKIApAQCAtNjMzLDUwICs1OTEsNTEgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6aW52b2tlKGNvbnN0IFBhcmNlbCAmcmVxdWVzdCwgUGFyY2VsICpyZXBseSkgewotICAgIGlmIChyZXBseSA9PSBOVUxMKSB7CitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6Omludm9rZShjb25zdCBQbGF5ZXJNZXNzYWdlICZyZXF1ZXN0LCBQbGF5ZXJNZXNzYWdlICpyZXNwb25zZSkgeworICAgIGlmIChyZXNwb25zZSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJyZXBseSBpcyBhIE5VTEwgcG9pbnRlciIpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIGludDMyX3QgbWV0aG9kSWQ7Ci0gICAgc3RhdHVzX3QgcmV0ID0gcmVxdWVzdC5yZWFkSW50MzIoJm1ldGhvZElkKTsKLSAgICBpZiAocmV0ICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmV0cmlldmUgdGhlIHJlcXVlc3RlZCBtZXRob2QgdG8gaW52b2tlLCBlcnIoJWQpIiwgcmV0KTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9CisgICAgUmVwZWF0ZWRQdHJGaWVsZDxjb25zdCBWYWx1ZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gcmVxdWVzdC52YWx1ZXMoKS5jYmVnaW4oKTsKKyAgICBpbnQzMl90IG1ldGhvZElkID0gKGl0KyspLT5pbnQzMl92YWx1ZSgpOwogCiAgICAgc3dpdGNoIChtZXRob2RJZCkgewogICAgICAgICBjYXNlIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX1NFVF9WSURFT19TQ0FMSU5HX01PREU6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGludCBtb2RlID0gcmVxdWVzdC5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludCBtb2RlID0gKGl0KyspLT5pbnQzMl92YWx1ZSgpOwogICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnNldFZpZGVvU2NhbGluZ01vZGUobW9kZSk7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX0dFVF9UUkFDS19JTkZPOgogICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXllci0+Z2V0VHJhY2tJbmZvKHJlcGx5KTsKKyAgICAgICAgICAgIGludDY0X3Qgc3JjSWQgPSAoaXQrKyktPmludDY0X3ZhbHVlKCk7CisgICAgICAgICAgICByZXR1cm4gbVBsYXllci0+Z2V0VHJhY2tJbmZvKHNyY0lkLCByZXNwb25zZSk7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX1NFTEVDVF9UUkFDSzoKICAgICAgICAgewotICAgICAgICAgICAgaW50IHRyYWNrSW5kZXggPSByZXF1ZXN0LnJlYWRJbnQzMigpOworICAgICAgICAgICAgaW50NjRfdCBzcmNJZCA9IChpdCsrKS0+aW50NjRfdmFsdWUoKTsKKyAgICAgICAgICAgIGludCB0cmFja0luZGV4ID0gKGl0KyspLT5pbnQzMl92YWx1ZSgpOwogICAgICAgICAgICAgaW50NjRfdCBtc2VjID0gMDsKICAgICAgICAgICAgIC8vIGdldEN1cnJlbnRQb3NpdGlvbiBzaG91bGQgYWx3YXlzIHJldHVybiBPSwogICAgICAgICAgICAgZ2V0Q3VycmVudFBvc2l0aW9uKCZtc2VjKTsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5zZWxlY3RUcmFjayh0cmFja0luZGV4LCB0cnVlIC8qIHNlbGVjdCAqLywgbXNlYyAqIDEwMDBsbCk7CisgICAgICAgICAgICByZXR1cm4gbVBsYXllci0+c2VsZWN0VHJhY2soc3JjSWQsIHRyYWNrSW5kZXgsIHRydWUgLyogc2VsZWN0ICovLCBtc2VjICogMTAwMExMKTsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfVU5TRUxFQ1RfVFJBQ0s6CiAgICAgICAgIHsKLSAgICAgICAgICAgIGludCB0cmFja0luZGV4ID0gcmVxdWVzdC5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5zZWxlY3RUcmFjayh0cmFja0luZGV4LCBmYWxzZSAvKiBzZWxlY3QgKi8sIDB4ZGVhZGJlZWYgLyogbm90IHVzZWQgKi8pOworICAgICAgICAgICAgaW50NjRfdCBzcmNJZCA9IChpdCsrKS0+aW50NjRfdmFsdWUoKTsKKyAgICAgICAgICAgIGludCB0cmFja0luZGV4ID0gKGl0KyspLT5pbnQzMl92YWx1ZSgpOworICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnNlbGVjdFRyYWNrKAorICAgICAgICAgICAgICAgICAgICBzcmNJZCwgdHJhY2tJbmRleCwgZmFsc2UgLyogc2VsZWN0ICovLCAweGRlYWRiZWVmIC8qIG5vdCB1c2VkICovKTsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfR0VUX1NFTEVDVEVEX1RSQUNLOgogICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IHR5cGUgPSByZXF1ZXN0LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPmdldFNlbGVjdGVkVHJhY2sodHlwZSwgcmVwbHkpOworICAgICAgICAgICAgaW50NjRfdCBzcmNJZCA9IChpdCsrKS0+aW50NjRfdmFsdWUoKTsKKyAgICAgICAgICAgIGludDMyX3QgdHlwZSA9IChpdCsrKS0+aW50MzJfdmFsdWUoKTsKKyAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5nZXRTZWxlY3RlZFRyYWNrKHNyY0lkLCB0eXBlLCByZXNwb25zZSk7CiAgICAgICAgIH0KIAogICAgICAgICBkZWZhdWx0OgpAQCAtNjk2LDQ0ICs2NTUsMTYgQEAKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiAKLXN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6Z2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpIHsKLQotICAgIGlmIChrZXkgPT0gRk9VUkNDKCdtJywndCcsJ3InLCdYJykpIHsKLSAgICAgICAgLy8gbXRyWCAtLSBhIHBsYXkgb24gJ21ldHJpY3MnIChub3QgbWF0cml4KQotICAgICAgICAvLyBnYXRoZXIgY3VycmVudCBpbmZvIGFsbCB0b2dldGhlciwgcGFyY2VsIGl0LCBhbmQgc2VuZCBpdCBiYWNrCi0gICAgICAgIHVwZGF0ZU1ldHJpY3MoImFwaSIpOwotICAgICAgICBtQW5hbHl0aWNzSXRlbS0+d3JpdGVUb1BhcmNlbChyZXBseSk7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6Z2V0UGFyYW1ldGVyKGludCBrZXkgX191bnVzZWQsIFBhcmNlbCAqcmVwbHkgX191bnVzZWQpIHsKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiAKLXN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6Z2V0TWV0YWRhdGEoCi0gICAgICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiAvKiBpZHMgKi8sIFBhcmNlbCAqcmVjb3JkcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICB1c2luZyBtZWRpYTo6TWV0YWRhdGE7Ci0KLSAgICBNZXRhZGF0YSBtZXRhKHJlY29yZHMpOwotCi0gICAgbWV0YS5hcHBlbmRCb29sKAotICAgICAgICAgICAgTWV0YWRhdGE6OmtQYXVzZUF2YWlsYWJsZSwKLSAgICAgICAgICAgIG1QbGF5ZXJGbGFncyAmIE51UGxheWVyMjo6U291cmNlOjpGTEFHX0NBTl9QQVVTRSk7Ci0KLSAgICBtZXRhLmFwcGVuZEJvb2woCi0gICAgICAgICAgICBNZXRhZGF0YTo6a1NlZWtCYWNrd2FyZEF2YWlsYWJsZSwKLSAgICAgICAgICAgIG1QbGF5ZXJGbGFncyAmIE51UGxheWVyMjo6U291cmNlOjpGTEFHX0NBTl9TRUVLX0JBQ0tXQVJEKTsKLQotICAgIG1ldGEuYXBwZW5kQm9vbCgKLSAgICAgICAgICAgIE1ldGFkYXRhOjprU2Vla0ZvcndhcmRBdmFpbGFibGUsCi0gICAgICAgICAgICBtUGxheWVyRmxhZ3MgJiBOdVBsYXllcjI6OlNvdXJjZTo6RkxBR19DQU5fU0VFS19GT1JXQVJEKTsKLQotICAgIG1ldGEuYXBwZW5kQm9vbCgKLSAgICAgICAgICAgIE1ldGFkYXRhOjprU2Vla0F2YWlsYWJsZSwKLSAgICAgICAgICAgIG1QbGF5ZXJGbGFncyAmIE51UGxheWVyMjo6U291cmNlOjpGTEFHX0NBTl9TRUVLKTsKLQotICAgIHJldHVybiBPSzsKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6Z2V0TWV0cmljcyhjaGFyICoqYnVmZmVyLCBzaXplX3QgKmxlbmd0aCkgeworICAgIHVwZGF0ZU1ldHJpY3MoImFwaSIpOworICAgIGlmIChtZWRpYW1ldHJpY3NfZ2V0QXR0cmlidXRlcyhtTWV0cmljc0hhbmRsZSwgYnVmZmVyLCBsZW5ndGgpKQorICAgICAgICByZXR1cm4gT0s7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gRkFJTEVEX1RSQU5TQUNUSU9OOwogfQogCiB2b2lkIE51UGxheWVyMkRyaXZlcjo6bm90aWZ5UmVzZXRDb21wbGV0ZShpbnQ2NF90IC8qIHNyY0lkICovKSB7CkBAIC03ODAsMjAgKzcxMSw3IEBACiAgICAgQUxPR1YoIm5vdGlmeVNlZWtDb21wbGV0ZSglcCkiLCB0aGlzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIG1TZWVrSW5Qcm9ncmVzcyA9IGZhbHNlOwotICAgIG5vdGlmeVNlZWtDb21wbGV0ZV9sKHNyY0lkKTsKLX0KLQotdm9pZCBOdVBsYXllcjJEcml2ZXI6Om5vdGlmeVNlZWtDb21wbGV0ZV9sKGludDY0X3Qgc3JjSWQpIHsKLSAgICBib29sIHdhc1NlZWtpbmcgPSB0cnVlOwotICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HKSB7Ci0gICAgICAgIHdhc1NlZWtpbmcgPSBmYWxzZTsKLSAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQ7Ci0gICAgICAgIG1Db25kaXRpb24uYnJvYWRjYXN0KCk7Ci0gICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gU1RBVEVfU1RPUFBFRCkgewotICAgICAgICAvLyBubyBuZWVkIHRvIG5vdGlmeSBsaXN0ZW5lcgotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG5vdGlmeUxpc3RlbmVyX2woc3JjSWQsIHdhc1NlZWtpbmcgPyBNRURJQTJfU0VFS19DT01QTEVURSA6IE1FRElBMl9QUkVQQVJFRCk7CisgICAgbm90aWZ5TGlzdGVuZXJfbChzcmNJZCwgTUVESUEyX1NFRUtfQ09NUExFVEUpOwogfQogCiBzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OmR1bXAoCkBAIC04ODQsMTIgKzgwMiwxMiBAQAogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIm1lc3NhZ2VJZCIsICZtc2dJZCkpOwogICAgICAgICAgICAgbXNnLT5maW5kSW50MzIoImV4dDEiLCAmZXh0MSk7CiAgICAgICAgICAgICBtc2ctPmZpbmRJbnQzMigiZXh0MiIsICZleHQyKTsKLSAgICAgICAgICAgIHNwPFBhcmNlbFdyYXBwZXI+IGluOworICAgICAgICAgICAgc3A8UGxheWVyTWVzc2FnZVdyYXBwZXI+IGluOwogICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOwotICAgICAgICAgICAgaWYgKG1zZy0+ZmluZE9iamVjdCgicGFyY2VsIiwgJm9iaikgJiYgb2JqICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpbiA9IHN0YXRpY19jYXN0PFBhcmNlbFdyYXBwZXIgKj4ob2JqLmdldCgpKTsKKyAgICAgICAgICAgIGlmIChtc2ctPmZpbmRPYmplY3QoIm9iaiIsICZvYmopICYmIG9iaiAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaW4gPSBzdGF0aWNfY2FzdDxQbGF5ZXJNZXNzYWdlV3JhcHBlciAqPihvYmouZ2V0KCkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VuZEV2ZW50KHNyY0lkLCBtc2dJZCwgZXh0MSwgZXh0MiwgKGluID09IE5VTEwgPyBOVUxMIDogaW4tPmdldFBhcmNlbCgpKSk7CisgICAgICAgICAgICBzZW5kRXZlbnQoc3JjSWQsIG1zZ0lkLCBleHQxLCBleHQyLCAoaW4gPT0gTlVMTCA/IE5VTEwgOiBpbi0+Z2V0UGxheWVyTWVzc2FnZSgpKSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgpAQCAtODk4LDE2ICs4MTYsMTYgQEAKIH0KIAogdm9pZCBOdVBsYXllcjJEcml2ZXI6Om5vdGlmeUxpc3RlbmVyKAotICAgICAgICBpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqaW4pIHsKKyAgICAgICAgaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQbGF5ZXJNZXNzYWdlICppbikgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgbm90aWZ5TGlzdGVuZXJfbChzcmNJZCwgbXNnLCBleHQxLCBleHQyLCBpbik7CiB9CiAKIHZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpub3RpZnlMaXN0ZW5lcl9sKAotICAgICAgICBpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqaW4pIHsKKyAgICAgICAgaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQbGF5ZXJNZXNzYWdlICppbikgewogICAgIEFMT0dEKCJub3RpZnlMaXN0ZW5lcl9sKCVwKSwgKCVsbGQsICVkLCAlZCwgJWQsICVkKSwgbG9vcCBzZXR0aW5nKCVkLCAlZCkiLAogICAgICAgICAgICAgdGhpcywgKGxvbmcgbG9uZylzcmNJZCwgbXNnLCBleHQxLCBleHQyLAotICAgICAgICAgICAgKGluID09IE5VTEwgPyAtMSA6IChpbnQpaW4tPmRhdGFTaXplKCkpLCBtQXV0b0xvb3AsIG1Mb29waW5nKTsKKyAgICAgICAgICAgIChpbiA9PSBOVUxMID8gLTEgOiAoaW50KWluLT5CeXRlU2l6ZSgpKSwgbUF1dG9Mb29wLCBtTG9vcGluZyk7CiAgICAgaWYgKHNyY0lkID09IG1TcmNJZCkgewogICAgICAgICBzd2l0Y2ggKG1zZykgewogICAgICAgICAgICAgY2FzZSBNRURJQTJfUExBWUJBQ0tfQ09NUExFVEU6CkBAIC05MjQsMTMgKzg0MiwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChtTG9vcGluZyB8fCBtQXV0b0xvb3ApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5ZXItPnNlZWtUb0FzeW5jKDApOworICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXllci0+cmV3aW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlbmRlcmVyIGhhcyBzdG9wcGVkIHRoZSBzaW5rIGF0IHRoZSBlbmQgaW4gb3JkZXIgdG8gcGxheSBvdXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbGFzdCBsaXR0bGUgYml0IG9mIGF1ZGlvLiBJbiBsb29waW5nIG1vZGUsIHdlIG5lZWQgdG8gcmVzdGFydCBpdC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9TaW5rLT5zdGFydCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3Qgc2VuZCBjb21wbGV0aW9uIGV2ZW50IHdoZW4gbG9vcGluZworCisgICAgICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0Tm90aWZ5TGlzdGVuZXIsIHRoaXMpOworICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQ2NCgic3JjSWQiLCBzcmNJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJtZXNzYWdlSWQiLCBNRURJQTJfSU5GTyk7CisgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJleHQxIiwgTUVESUEyX0lORk9fREFUQV9TT1VSQ0VfUkVQRUFUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5kZWJ1Zy5zZi5zdGF0cyIsIGZhbHNlKSkgewpAQCAtOTQwLDcgKzg2Myw3IEBACiAgICAgICAgICAgICAgICAgICAgIG1QbGF5ZXItPnBhdXNlKCk7CiAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BBVVNFRDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGNhc2UgTUVESUEyX0VSUk9SOgpAQCAtOTQ5LDExICs4NzIsMTEgQEAKICAgICAgICAgICAgICAgICAvLyBleHQxIGlzIG91ciBwcmltYXJ5ICdlcnJvciB0eXBlJyB2YWx1ZS4gT25seSBhZGQgZXh0MiB3aGVuIG5vbi16ZXJvLgogICAgICAgICAgICAgICAgIC8vIFt0ZXN0IGFnYWluc3QgbXNnIGlzIGR1ZSB0byBmYWxsIHRocm91Z2ggZnJvbSBwcmV2aW91cyBzd2l0Y2ggdmFsdWVdCiAgICAgICAgICAgICAgICAgaWYgKG1zZyA9PSBNRURJQTJfRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJFcnJvciwgZXh0MSk7CisgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga1BsYXllckVycm9yLCBleHQxKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGV4dDIgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJFcnJvckNvZGUsIGV4dDIpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrUGxheWVyRXJyb3JDb2RlLCBleHQyKTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrUGxheWVyRXJyb3JTdGF0ZSwgc3RhdGVTdHJpbmcobVN0YXRlKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcobU1ldHJpY3NIYW5kbGUsIGtQbGF5ZXJFcnJvclN0YXRlLCBzdGF0ZVN0cmluZyhtU3RhdGUpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtQXRFT1MgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtOTY5LDcgKzg5Miw3IEBACiAgICAgbm90aWZ5LT5zZXRJbnQzMigibWVzc2FnZUlkIiwgbXNnKTsKICAgICBub3RpZnktPnNldEludDMyKCJleHQxIiwgZXh0MSk7CiAgICAgbm90aWZ5LT5zZXRJbnQzMigiZXh0MiIsIGV4dDIpOwotICAgIG5vdGlmeS0+c2V0T2JqZWN0KCJwYXJjZWwiLCBQYXJjZWxXcmFwcGVyOjpDcmVhdGUoaW4pKTsKKyAgICBub3RpZnktPnNldE9iamVjdCgib2JqIiwgUGxheWVyTWVzc2FnZVdyYXBwZXI6OkNyZWF0ZSgoUGxheWVyTWVzc2FnZSopaW4pKTsKICAgICBub3RpZnktPnBvc3QoKTsKIH0KIApAQCAtMTAzNiwyNCArOTU5LDI1IEBACiB9CiAKIC8vIE1vZHVsYXIgRFJNCi1zdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnByZXBhcmVEcm0oY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZkcm1TZXNzaW9uSWQpCitzdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnByZXBhcmVEcm0oCisgICAgICAgIGludDY0X3Qgc3JjSWQsIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkKQogewogICAgIEFMT0dWKCJwcmVwYXJlRHJtKCVwKSBzdGF0ZTogJWQiLCB0aGlzLCBtU3RhdGUpOwogCiAgICAgLy8gbGVhdmluZyB0aGUgc3RhdGUgdmVyaWZpY2F0aW9uIGZvciBtZWRpYXBsYXllci5jcHAKLSAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5wcmVwYXJlRHJtKHV1aWQsIGRybVNlc3Npb25JZCk7CisgICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+cHJlcGFyZURybShzcmNJZCwgdXVpZCwgZHJtU2Vzc2lvbklkKTsKIAogICAgIEFMT0dWKCJwcmVwYXJlRHJtIHJldDogJWQiLCByZXQpOwogCiAgICAgcmV0dXJuIHJldDsKIH0KIAotc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpyZWxlYXNlRHJtKCkKK3N0YXR1c190IE51UGxheWVyMkRyaXZlcjo6cmVsZWFzZURybShpbnQ2NF90IHNyY0lkKQogewogICAgIEFMT0dWKCJyZWxlYXNlRHJtKCVwKSBzdGF0ZTogJWQiLCB0aGlzLCBtU3RhdGUpOwogCiAgICAgLy8gbGVhdmluZyB0aGUgc3RhdGUgdmVyaWZpY2F0aW9uIGZvciBtZWRpYXBsYXllci5jcHAKLSAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5yZWxlYXNlRHJtKCk7CisgICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+cmVsZWFzZURybShzcmNJZCk7CiAKICAgICBBTE9HVigicmVsZWFzZURybSByZXQ6ICVkIiwgcmV0KTsKIApAQCAtMTA3Myw5ICs5OTcsNiBAQAogICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6IHJ2YWwgPSAiUlVOTklORyI7IGJyZWFrOwogICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDogcnZhbCA9ICJQQVVTRUQiOyBicmVhazsKICAgICAgICAgY2FzZSBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUzogcnZhbCA9ICJSRVNFVF9JTl9QUk9HUkVTUyI7IGJyZWFrOwotICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRUQ6IHJ2YWwgPSAiU1RPUFBFRCI7IGJyZWFrOwotICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORzogcnZhbCA9ICJTVE9QUEVEX0FORF9QUkVQQVJJTkciOyBicmVhazsKLSAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRDogcnZhbCA9ICJTVE9QUEVEX0FORF9QUkVQQVJFRCI7IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgLy8geWVzLCB0aGlzIGJ1ZmZlciBpcyBzaGFyZWQgYW5kIHZ1bG5lcmFibGUgdG8gcmFjZXMKICAgICAgICAgICAgIHNucHJpbnRmKHJhd2J1ZmZlciwgc2l6ZW9mKHJhd2J1ZmZlciksICIlZCIsIHN0YXRlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJpdmVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRyaXZlci5oCmluZGV4IDRkYTI1NjYuLmM5N2UyNDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJpdmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuaApAQCAtMTYsOCArMTYsOSBAQAogCiAjaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkludGVyZmFjZS5oPgogCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFNZXRyaWNzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KT2JqZWN0SG9sZGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMjYsNyArMjcsNyBAQAogc3RydWN0IE51UGxheWVyMjsKIAogc3RydWN0IE51UGxheWVyMkRyaXZlciA6IHB1YmxpYyBNZWRpYVBsYXllcjJJbnRlcmZhY2UgewotICAgIGV4cGxpY2l0IE51UGxheWVyMkRyaXZlcihwaWRfdCBwaWQsIHVpZF90IHVpZCk7CisgICAgZXhwbGljaXQgTnVQbGF5ZXIyRHJpdmVyKHBpZF90IHBpZCwgdWlkX3QgdWlkLCBjb25zdCBzcDxKT2JqZWN0SG9sZGVyPiAmY29udGV4dCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIG92ZXJyaWRlOwogCkBAIC00MCwzMSArNDEsMjkgQEAKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZUFzeW5jKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKLSAgICB2aXJ0dWFsIGJvb2wgaXNQbGF5aW5nKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzICZzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3luY1NldHRpbmdzKEFWU3luY1NldHRpbmdzICpzeW5jLCBmbG9hdCAqdmlkZW9GcHMpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZUFzeW5jKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGJvb2wgaXNQbGF5aW5nKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzICZzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3luY1NldHRpbmdzKEFWU3luY1NldHRpbmdzICpzeW5jLCBmbG9hdCAqdmlkZW9GcHMpIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2Vla1RvKAotICAgICAgICAgICAgaW50NjRfdCBtc2VjLCBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbXNlYyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREdXJhdGlvbihpbnQ2NF90ICptc2VjKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlc2V0KCk7CisgICAgICAgICAgICBpbnQ2NF90IG1zZWMsCisgICAgICAgICAgICBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbXNlYykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREdXJhdGlvbihpbnQ2NF90ICptc2VjKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc2V0KCkgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBub3RpZnlBdChpbnQ2NF90IG1lZGlhVGltZVVzKSBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldExvb3BpbmcoaW50IGxvb3ApOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW52b2tlKGNvbnN0IFBhcmNlbCAmcmVxdWVzdCwgUGFyY2VsICpyZXBseSk7Ci0gICAgdmlydHVhbCB2b2lkIHNldEF1ZGlvU2luayhjb25zdCBzcDxBdWRpb1Npbms+ICZhdWRpb1NpbmspOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMb29waW5nKGludCBsb29wKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGludm9rZShjb25zdCBQbGF5ZXJNZXNzYWdlICZyZXF1ZXN0LCBQbGF5ZXJNZXNzYWdlICpyZXNwb25zZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIHNldEF1ZGlvU2luayhjb25zdCBzcDxBdWRpb1Npbms+ICZhdWRpb1NpbmspIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVyKGludCBrZXksIGNvbnN0IFBhcmNlbCAmcmVxdWVzdCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsICpyZXBseSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRyaWNzKGNoYXIgKipidWYsIHNpemVfdCAqbGVuZ3RoKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YWRhdGEoCi0gICAgICAgICAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgaWRzLCBQYXJjZWwgKnJlY29yZHMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3Qgb3ZlcnJpZGU7CiAKICAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIG92ZXJyaWRlOwogCkBAIC03NywxNCArNzYsMTQgQEAKICAgICB2b2lkIG5vdGlmeU1vcmVSZWJ1ZmZlcmluZ1RpbWVVcyhpbnQ2NF90IHNyY0lkLCBpbnQ2NF90IHRpbWVVcyk7CiAgICAgdm9pZCBub3RpZnlSZWJ1ZmZlcmluZ1doZW5FeGl0KGludDY0X3Qgc3JjSWQsIGJvb2wgc3RhdHVzKTsKICAgICB2b2lkIG5vdGlmeVNlZWtDb21wbGV0ZShpbnQ2NF90IHNyY0lkKTsKLSAgICB2b2lkIG5vdGlmeVNlZWtDb21wbGV0ZV9sKGludDY0X3Qgc3JjSWQpOwogICAgIHZvaWQgbm90aWZ5TGlzdGVuZXIoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEgPSAwLCBpbnQgZXh0MiA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwgKmluID0gTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQbGF5ZXJNZXNzYWdlICppbiA9IE5VTEwpOwogICAgIHZvaWQgbm90aWZ5RmxhZ3NDaGFuZ2VkKGludDY0X3Qgc3JjSWQsIHVpbnQzMl90IGZsYWdzKTsKIAogICAgIC8vIE1vZHVsYXIgRFJNCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VEcm0oKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVEcm0oCisgICAgICAgICAgICBpbnQ2NF90IHNyY0lkLCBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJmRybVNlc3Npb25JZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlRHJtKGludDY0X3Qgc3JjSWQpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TnVQbGF5ZXIyRHJpdmVyKCk7CkBAIC05OSw5ICs5OCw2IEBACiAgICAgICAgIFNUQVRFX1JVTk5JTkcsCiAgICAgICAgIFNUQVRFX1BBVVNFRCwKICAgICAgICAgU1RBVEVfUkVTRVRfSU5fUFJPR1JFU1MsCi0gICAgICAgIFNUQVRFX1NUT1BQRUQsICAgICAgICAgICAgICAgICAgLy8gZXF1aXZhbGVudCB0byBQQVVTRUQKLSAgICAgICAgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HLCAgICAvLyBlcXVpdmFsZW50IHRvIFBBVVNFRCwgYnV0IHNlZWtpbmcKLSAgICAgICAgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQsICAgICAvLyBlcXVpdmFsZW50IHRvIFBBVVNFRCwgYnV0IHNlZWsgY29tcGxldGUKICAgICB9OwogCiAgICAgc3RkOjpzdHJpbmcgc3RhdGVTdHJpbmcoU3RhdGUgc3RhdGUpOwpAQCAtMTM3LDcgKzEzMyw4IEBACiAgICAgc3A8QXVkaW9TaW5rPiBtQXVkaW9TaW5rOwogICAgIHVpbnQzMl90IG1QbGF5ZXJGbGFnczsKIAotICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqbUFuYWx5dGljc0l0ZW07CisgICAgbWVkaWFtZXRyaWNzX2hhbmRsZV90IG1NZXRyaWNzSGFuZGxlOworICAgIGludDY0X3QgbVBsYXllclZlcnNpb247CiAgICAgdWlkX3QgbUNsaWVudFVpZDsKIAogICAgIGJvb2wgbUF0RU9TOwpAQCAtMTQ5LDcgKzE0Niw3IEBACiAKICAgICBzdGF0dXNfdCBzdGFydF9sKCk7CiAgICAgdm9pZCBub3RpZnlMaXN0ZW5lcl9sKGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxID0gMCwgaW50IGV4dDIgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwgKmluID0gTlVMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBsYXllck1lc3NhZ2UgKmluID0gTlVMTCk7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhOdVBsYXllcjJEcml2ZXIpOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmNwcAppbmRleCA0ODUzYWUxLi5mNDFhNDMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRybS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcm0uY3BwCkBAIC0xMzMsOSArMTMzLDggQEAKICAgICByZXR1cm4gZHJtSW5mb0J1ZmZlcjsKIH0KIAotc3A8QUJ1ZmZlcj4gTnVQbGF5ZXIyRHJtOjpyZXRyaWV2ZURybUluZm8oUHNzaEluZm8gKnBzc2hJbmZvKQorc3RhdHVzX3QgTnVQbGF5ZXIyRHJtOjpyZXRyaWV2ZURybUluZm8oUHNzaEluZm8gKnBzc2hJbmZvLCBQbGF5ZXJNZXNzYWdlICpwbGF5ZXJNc2cpCiB7Ci0KICAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gcHNzaCwgZHJtSW5mbzsKIAogICAgIC8vIDApIEdlbmVyYXRlIFBTU0ggYnl0ZXMKQEAgLTE0OCwyNyArMTQ3LDI2IEBACiAgICAgfQogCiAgICAgdWludDMyX3QgcHNzaFNpemUgPSBwc3NoLnRlbGxwKCk7Ci0gICAgY29uc3QgdWludDhfdCogcHNzaFB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHBzc2guc3RyKCkuY19zdHIoKSk7Ci0gICAgY29uc3QgY2hhciAqcHNzaEhleCA9IERybVVVSUQ6OmFycmF5VG9IZXgocHNzaFB0ciwgcHNzaFNpemUpLnN0cmluZygpOwotICAgIEFMT0dWKCJyZXRyaWV2ZURybUluZm86IE1FRElBX0RSTV9JTkZPICBQU1NIOiBzaXplOiAldSAlcyIsIHBzc2hTaXplLCBwc3NoSGV4KTsKKyAgICBzdGQ6OnN0cmluZyBwc3NoQmFzZSA9IHBzc2guc3RyKCk7CisgICAgY29uc3QgYXV0byogcHNzaFB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHBzc2hCYXNlLmNfc3RyKCkpOworICAgIEFMT0dWKCJyZXRyaWV2ZURybUluZm86IE1FRElBX0RSTV9JTkZPICBQU1NIOiBzaXplOiAldSAlcyIsIHBzc2hTaXplLAorICAgICAgICAgICAgRHJtVVVJRDo6YXJyYXlUb0hleChwc3NoUHRyLCBwc3NoU2l6ZSkuc3RyaW5nKCkpOwogCiAgICAgLy8gMSkgV3JpdGUgUFNTSCBieXRlcwotICAgIGRybUluZm8ud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KCZwc3NoU2l6ZSksIHNpemVvZihwc3NoU2l6ZSkpOwotICAgIGRybUluZm8ud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KHBzc2guc3RyKCkuY19zdHIoKSksIHBzc2hTaXplKTsKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2J5dGVzX3ZhbHVlKAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KHBzc2guc3RyKCkuY19zdHIoKSksIHBzc2hTaXplKTsKIAogICAgIC8vIDIpIFdyaXRlIHN1cHBvcnRlZERSTXMKICAgICB1aW50MzJfdCBudW1lbnRyaWVzID0gcHNzaEluZm8tPm51bWVudHJpZXM7Ci0gICAgZHJtSW5mby53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4oJm51bWVudHJpZXMpLCBzaXplb2YobnVtZW50cmllcykpOworICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUobnVtZW50cmllcyk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1lbnRyaWVzOyBpKyspIHsKICAgICAgICAgUHNzaEVudHJ5ICplbnRyeSA9ICZwc3NoSW5mby0+ZW50cmllc1tpXTsKLSAgICAgICAgZHJtSW5mby53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4oJmVudHJ5LT51dWlkKSwgc2l6ZW9mKGVudHJ5LT51dWlkKSk7CisgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfYnl0ZXNfdmFsdWUoCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KCZlbnRyeS0+dXVpZCksIHNpemVvZihlbnRyeS0+dXVpZCkpOwogICAgICAgICBBTE9HVigicmV0cmlldmVEcm1JbmZvOiBNRURJQV9EUk1fSU5GTyAgc3VwcG9ydGVkU2NoZW1lWyV6dV0gJXMiLCBpLAogICAgICAgICAgICAgICAgIERybVVVSUQ6OmFycmF5VG9IZXgoKGNvbnN0IHVpbnQ4X3QqKSZlbnRyeS0+dXVpZCwgc2l6ZW9mKEFNZWRpYVVVSUQpKS5zdHJpbmcoKSk7CiAgICAgfQotCi0gICAgc3A8QUJ1ZmZlcj4gZHJtSW5mb0J1ZiA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weShkcm1JbmZvLnN0cigpLmNfc3RyKCksIGRybUluZm8udGVsbHAoKSk7Ci0gICAgZHJtSW5mb0J1Zi0+c2V0UmFuZ2UoMCwgZHJtSW5mby50ZWxscCgpKTsKLSAgICByZXR1cm4gZHJtSW5mb0J1ZjsKKyAgICByZXR1cm4gT0s7CiB9CiAKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcm0uaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmgKaW5kZXggOTlkMjQxNS4uOTY4ZDFiZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcm0uaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRybS5oCkBAIC0yMyw2ICsyMywxMCBAQAogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAorI2luY2x1ZGUgIm1lZGlhcGxheWVyMi5wYi5oIgorCit1c2luZyBhbmRyb2lkOjptZWRpYTo6TWVkaWFQbGF5ZXIyUHJvdG86OlBsYXllck1lc3NhZ2U7CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogICAgIHN0cnVjdCBEcm1VVUlEIHsKQEAgLTgwLDcgKzg0LDcgQEAKIAogICAgIHB1YmxpYzoKICAgICAgICAgc3RhdGljIHNwPEFCdWZmZXI+IHJldHJpZXZlRHJtSW5mbyhjb25zdCB2b2lkICpwc3NoLCB1aW50MzJfdCBwc3Noc2l6ZSk7Ci0gICAgICAgIHN0YXRpYyBzcDxBQnVmZmVyPiByZXRyaWV2ZURybUluZm8oUHNzaEluZm8gKik7CisgICAgICAgIHN0YXRpYyBzdGF0dXNfdCByZXRyaWV2ZURybUluZm8oUHNzaEluZm8gKiwgUGxheWVyTWVzc2FnZSAqKTsKIAogICAgIH07ICAvLyBOdVBsYXllcjJEcm0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlJlbmRlcmVyLmNwcAppbmRleCBhMGJkOTAwLi5mZDQ1OWRmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlJlbmRlcmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlJlbmRlcmVyLmNwcApAQCAtMjYsOSArMjYsMTEgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNsb2NrLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlcjIuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CiAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgpAQCAtNjcsMTMgKzY5LDE3IEBACiAKIC8vIE1heGltdW0gdGltZSBpbiBwYXVzZWQgc3RhdGUgd2hlbiBvZmZsb2FkaW5nIGF1ZGlvIGRlY29tcHJlc3Npb24uIFdoZW4gZWxhcHNlZCwgdGhlIEF1ZGlvU2luawogLy8gaXMgY2xvc2VkIHRvIGFsbG93IHRoZSBhdWRpbyBEU1AgdG8gcG93ZXIgZG93bi4KLXN0YXRpYyBjb25zdCBpbnQ2NF90IGtPZmZsb2FkUGF1c2VNYXhVcyA9IDEwMDAwMDAwbGw7CitzdGF0aWMgY29uc3QgaW50NjRfdCBrT2ZmbG9hZFBhdXNlTWF4VXMgPSAxMDAwMDAwMExMOwogCiAvLyBNYXhpbXVtIGFsbG93ZWQgZGVsYXkgZnJvbSBBdWRpb1NpbmssIDEuNSBzZWNvbmRzLgotc3RhdGljIGNvbnN0IGludDY0X3Qga01heEFsbG93ZWRBdWRpb1NpbmtEZWxheVVzID0gMTUwMDAwMGxsOworc3RhdGljIGNvbnN0IGludDY0X3Qga01heEFsbG93ZWRBdWRpb1NpbmtEZWxheVVzID0gMTUwMDAwMExMOwogCiBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWluaW11bUF1ZGlvQ2xvY2tVcGRhdGVQZXJpb2RVcyA9IDIwIC8qIG1zZWMgKi8gKiAxMDAwOwogCisvLyBEZWZhdWx0IHZpZGVvIGZyYW1lIGRpc3BsYXkgZHVyYXRpb24gd2hlbiBvbmx5IHZpZGVvIGV4aXN0cy4KKy8vIFVzZWQgdG8gc2V0IG1heCBtZWRpYSB0aW1lIGluIE1lZGlhQ2xvY2suCitzdGF0aWMgY29uc3QgaW50NjRfdCBrRGVmYXVsdFZpZGVvRnJhbWVJbnRlcnZhbFVzID0gMTAwMDAwTEw7CisKIC8vIHN0YXRpYwogY29uc3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6UGNtSW5mbyBOdVBsYXllcjI6OlJlbmRlcmVyOjpBVURJT19QQ01JTkZPX0lOSVRJQUxJWkVSID0gewogICAgICAgICBBVURJT19DSEFOTkVMX05PTkUsCkBAIC04NCwxMiArOTAsMjcgQEAKIH07CiAKIC8vIHN0YXRpYwotY29uc3QgaW50NjRfdCBOdVBsYXllcjI6OlJlbmRlcmVyOjprTWluUG9zaXRpb25VcGRhdGVEZWxheVVzID0gMTAwMDAwbGw7Citjb25zdCBpbnQ2NF90IE51UGxheWVyMjo6UmVuZGVyZXI6OmtNaW5Qb3NpdGlvblVwZGF0ZURlbGF5VXMgPSAxMDAwMDBMTDsKKworc3RhdGljIGF1ZGlvX2Zvcm1hdF90IGNvbnN0ZXhwciBhdWRpb0Zvcm1hdEZyb21FbmNvZGluZyhpbnQzMl90IHBjbUVuY29kaW5nKSB7CisgICAgc3dpdGNoIChwY21FbmNvZGluZykgeworICAgIGNhc2Uga0F1ZGlvRW5jb2RpbmdQY21GbG9hdDoKKyAgICAgICAgcmV0dXJuIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgICAgY2FzZSBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0OgorICAgICAgICByZXR1cm4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgY2FzZSBrQXVkaW9FbmNvZGluZ1BjbThiaXQ6CisgICAgICAgIHJldHVybiBBVURJT19GT1JNQVRfUENNXzhfQklUOyAgLy8gVE9ETzogZG8gd2Ugd2FudCB0byBzdXBwb3J0IHRoaXM/CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGVuY29kaW5nOiAlZCIsIF9fZnVuY19fLCBwY21FbmNvZGluZyk7CisgICAgICAgIHJldHVybiBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICB9Cit9CiAKIE51UGxheWVyMjo6UmVuZGVyZXI6OlJlbmRlcmVyKAogICAgICAgICBjb25zdCBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U6OkF1ZGlvU2luaz4gJnNpbmssCiAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ2xvY2s+ICZtZWRpYUNsb2NrLAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgY29uc3Qgc3A8Sk9iamVjdEhvbGRlcj4gJmNvbnRleHQsCiAgICAgICAgIHVpbnQzMl90IGZsYWdzKQogICAgIDogbUF1ZGlvU2luayhzaW5rKSwKICAgICAgIG1Vc2VWaXJ0dWFsQXVkaW9TaW5rKGZhbHNlKSwKQEAgLTEwOCwxNCArMTI5LDE0IEBACiAgICAgICBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzKC0xKSwKICAgICAgIG1BbmNob3JUaW1lTWVkaWFVcygtMSksCiAgICAgICBtQW5jaG9yTnVtRnJhbWVzV3JpdHRlbigtMSksCi0gICAgICBtVmlkZW9MYXRlQnlVcygwbGwpLAorICAgICAgbVZpZGVvTGF0ZUJ5VXMoMExMKSwKICAgICAgIG1OZXh0VmlkZW9UaW1lTWVkaWFVcygtMSksCiAgICAgICBtSGFzQXVkaW8oZmFsc2UpLAogICAgICAgbUhhc1ZpZGVvKGZhbHNlKSwKICAgICAgIG1Ob3RpZnlDb21wbGV0ZUF1ZGlvKGZhbHNlKSwKICAgICAgIG1Ob3RpZnlDb21wbGV0ZVZpZGVvKGZhbHNlKSwKICAgICAgIG1TeW5jUXVldWVzKGZhbHNlKSwKLSAgICAgIG1QYXVzZWQoZmFsc2UpLAorICAgICAgbVBhdXNlZCh0cnVlKSwKICAgICAgIG1QYXVzZURyYWluQXVkaW9BbGxvd2VkVXMoMCksCiAgICAgICBtVmlkZW9TYW1wbGVSZWNlaXZlZChmYWxzZSksCiAgICAgICBtVmlkZW9SZW5kZXJpbmdTdGFydGVkKGZhbHNlKSwKQEAgLTEzMSwxMCArMTUyLDkgQEAKICAgICAgIG1Ub3RhbEJ1ZmZlcnNRdWV1ZWQoMCksCiAgICAgICBtTGFzdEF1ZGlvQnVmZmVyRHJhaW5lZCgwKSwKICAgICAgIG1Vc2VBdWRpb0NhbGxiYWNrKGZhbHNlKSwKLSAgICAgIG1XYWtlTG9jayhuZXcgSldha2VMb2NrKCkpIHsKKyAgICAgIG1XYWtlTG9jayhuZXcgSldha2VMb2NrKGNvbnRleHQpKSB7CiAgICAgQ0hFQ0sobWVkaWFDbG9jayAhPSBOVUxMKTsKLSAgICBtUGxheWJhY2tSYXRlID0gbVBsYXliYWNrU2V0dGluZ3MubVNwZWVkOwotICAgIG1NZWRpYUNsb2NrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrUmF0ZSk7CisgICAgbU1lZGlhQ2xvY2stPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQpOwogfQogCiBOdVBsYXllcjI6OlJlbmRlcmVyOjp+UmVuZGVyZXIoKSB7CkBAIC0xOTAsMjYgKzIxMCwyMCBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllcjI6OlJlbmRlcmVyOjpvbkNvbmZpZ1BsYXliYWNrKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlIC8qIHNhbml0aXplZCAqLykgewotICAgIGlmIChyYXRlLm1TcGVlZCA9PSAwLmYpIHsKLSAgICAgICAgb25QYXVzZSgpOwotICAgICAgICAvLyBkb24ndCBjYWxsIGF1ZGlvc2luaydzIHNldFBsYXliYWNrUmF0ZSBpZiBwYXVzaW5nLCBhcyBwaXRjaCBkb2VzIG5vdAotICAgICAgICAvLyBoYXZlIHRvIGNvcnJlc3BvbmQgdG8gdGhlIGFueSBub24tMCBzcGVlZCAoZS5nIG9sZCBzcGVlZCkuIEtlZXAKLSAgICAgICAgLy8gc2V0dGluZ3Mgbm9uZXRoZWxlc3MsIHVzaW5nIHRoZSBvbGQgc3BlZWQsIGluIGNhc2UgYXVkaW9zaW5rIGNoYW5nZXMuCi0gICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlIG5ld1JhdGUgPSByYXRlOwotICAgICAgICBuZXdSYXRlLm1TcGVlZCA9IG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZDsKLSAgICAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSBuZXdSYXRlOwotICAgICAgICByZXR1cm4gT0s7CisgICAgaWYgKHJhdGUubVNwZWVkIDw9IDAuZikgeworICAgICAgICBBTE9HVygicGxheWJhY2sgcmF0ZSBjYW5ub3QgYmUgJWYiLCByYXRlLm1TcGVlZCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCAmJiBtQXVkaW9TaW5rLT5yZWFkeSgpKSB7CiAgICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1NpbmstPnNldFBsYXliYWNrUmF0ZShyYXRlKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coImZhaWxlZCB0byBnZXQgcGxheWJhY2sgcmF0ZSBmcm9tIGF1ZGlvIHNpbmssIGVyciglZCkiLCBlcnIpOwogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogICAgIH0KICAgICBtUGxheWJhY2tTZXR0aW5ncyA9IHJhdGU7Ci0gICAgbVBsYXliYWNrUmF0ZSA9IHJhdGUubVNwZWVkOwotICAgIG1NZWRpYUNsb2NrLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrUmF0ZSk7CisgICAgbU1lZGlhQ2xvY2stPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQpOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMjMxLDE0ICsyNDUsMTIgQEAKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvU2luay0+Z2V0UGxheWJhY2tSYXRlKHJhdGUpOwogICAgICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgICAgICBpZiAoIWlzQXVkaW9QbGF5YmFja1JhdGVFcXVhbCgqcmF0ZSwgbVBsYXliYWNrU2V0dGluZ3MpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNvcnJlY3RpbmcgbWlzbWF0Y2ggaW4gaW50ZXJuYWwvZXh0ZXJuYWwgcGxheWJhY2sgcmF0ZSIpOworICAgICAgICAgICAgICAgIEFMT0dXKCJjb3JyZWN0aW5nIG1pc21hdGNoIGluIGludGVybmFsL2V4dGVybmFsIHBsYXliYWNrIHJhdGUsICVmIHZzICVmIiwKKyAgICAgICAgICAgICAgICAgICAgICByYXRlLT5tU3BlZWQsIG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBnZXQgcGxheWJhY2sgc2V0dGluZ3MgdXNlZCBieSBhdWRpb3NpbmssIGFzIGl0IG1heSBiZQogICAgICAgICAgICAgLy8gc2xpZ2h0bHkgb2ZmIGR1ZSB0byBhdWRpb3Npbmsgbm90IHRha2luZyBzbWFsbCBjaGFuZ2VzLgogICAgICAgICAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSAqcmF0ZTsKLSAgICAgICAgICAgIGlmIChtUGF1c2VkKSB7Ci0gICAgICAgICAgICAgICAgcmF0ZS0+bVNwZWVkID0gMC5mOwotICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQpAQCAtMjk3LDExICszMDksMTEgQEAKICAgICAgICAgICAgIG1Ob3RpZnlDb21wbGV0ZVZpZGVvIHw9IG5vdGlmeUNvbXBsZXRlOwogICAgICAgICAgICAgKyttVmlkZW9RdWV1ZUdlbmVyYXRpb247CiAgICAgICAgICAgICArK21WaWRlb0RyYWluR2VuZXJhdGlvbjsKKyAgICAgICAgICAgIG1OZXh0VmlkZW9UaW1lTWVkaWFVcyA9IC0xOwogICAgICAgICB9CiAKICAgICAgICAgbU1lZGlhQ2xvY2stPmNsZWFyQW5jaG9yKCk7CiAgICAgICAgIG1WaWRlb0xhdGVCeVVzID0gMDsKLSAgICAgICAgbU5leHRWaWRlb1RpbWVNZWRpYVVzID0gLTE7CiAgICAgICAgIG1TeW5jUXVldWVzID0gZmFsc2U7CiAgICAgfQogCkBAIC01NjAsOCArNTcyLDggQEAKICAgICAgICAgICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPQogICAgICAgICAgICAgICAgICAgICBtQXVkaW9TaW5rLT5tc2Vjc1BlckZyYW1lKCkKICAgICAgICAgICAgICAgICAgICAgICAgICogbnVtRnJhbWVzUGVuZGluZ1BsYXlvdXQgKiAxMDAwbGw7Ci0gICAgICAgICAgICAgICAgaWYgKG1QbGF5YmFja1JhdGUgPiAxLjBmKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGF5VXMgLz0gbVBsYXliYWNrUmF0ZTsKKyAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrU2V0dGluZ3MubVNwZWVkID4gMS4wZikgeworICAgICAgICAgICAgICAgICAgICBkZWxheVVzIC89IG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZDsKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBMZXQncyBnaXZlIGl0IG1vcmUgZGF0YSBhZnRlciBhYm91dCBoYWxmIHRoYXQgdGltZQpAQCAtMTE0MCw4ICsxMTUyLDcgQEAKICAgICAgICAgQUxPR0UoInNhbXBsZVJhdGUgaXMgMCBpbiAlcyBtb2RlIiwgb2ZmbG9hZGluZ0F1ZGlvKCkgPyAib2ZmbG9hZCIgOiAibm9uLW9mZmxvYWQiKTsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIC8vIFRPRE86IHJlbW92ZSB0aGUgKGludDMyX3QpIGNhc3RpbmcgYmVsb3cgYXMgaXQgbWF5IG92ZXJmbG93IGF0IDEyLjQgaG91cnMuCi0gICAgcmV0dXJuIChpbnQ2NF90KSgoaW50MzJfdCludW1GcmFtZXMgKiAxMDAwMDAwTEwgLyBzYW1wbGVSYXRlKTsKKyAgICByZXR1cm4gKGludDY0X3QpKG51bUZyYW1lcyAqIDEwMDAwMDBMTCAvIHNhbXBsZVJhdGUpOwogfQogCiAvLyBDYWxjdWxhdGUgZHVyYXRpb24gb2YgcGVuZGluZyBzYW1wbGVzIGlmIHBsYXllZCBhdCBub3JtYWwgcmF0ZSAoaS5lLiwgMS4wKS4KQEAgLTExNTEsNyArMTE2Miw3IEBACiAgICAgICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwogICAgICAgICBpbnQ2NF90IG1lZGlhVXM7CiAgICAgICAgIGlmIChtTWVkaWFDbG9jay0+Z2V0TWVkaWFUaW1lKG5vd1VzLCAmbWVkaWFVcykgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiAwbGw7CisgICAgICAgICAgICByZXR1cm4gMExMOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIHdyaXR0ZW5BdWRpb0R1cmF0aW9uVXMgLSAobWVkaWFVcyAtIG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMpOwogICAgICAgICB9CkBAIC0xMjc4LDEwICsxMjg5LDEwIEBACiAgICAgICAgICAgICBtQW5jaG9yVGltZU1lZGlhVXMgPSBtZWRpYVRpbWVVczsKICAgICAgICAgfQogICAgIH0KLSAgICBtTmV4dFZpZGVvVGltZU1lZGlhVXMgPSBtZWRpYVRpbWVVcyArIDEwMDAwMDsKKyAgICBtTmV4dFZpZGVvVGltZU1lZGlhVXMgPSBtZWRpYVRpbWVVczsKICAgICBpZiAoIW1IYXNBdWRpbykgewogICAgICAgICAvLyBzbW9vdGggb3V0IHZpZGVvcyA+PSAxMGZwcwotICAgICAgICBtTWVkaWFDbG9jay0+dXBkYXRlTWF4VGltZU1lZGlhKG1OZXh0VmlkZW9UaW1lTWVkaWFVcyk7CisgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVNYXhUaW1lTWVkaWEobWVkaWFUaW1lVXMgKyBrRGVmYXVsdFZpZGVvRnJhbWVJbnRlcnZhbFVzKTsKICAgICB9CiAKICAgICBpZiAoIW1WaWRlb1NhbXBsZVJlY2VpdmVkIHx8IG1lZGlhVGltZVVzIDwgbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcykgewpAQCAtMTM0OCw3ICsxMzU5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgJiYgbWVkaWFUaW1lVXMgPiBtTGFzdEF1ZGlvTWVkaWFUaW1lVXMpIHsKICAgICAgICAgICAgICAgICAvLyBJZiBhdWRpbyBlbmRzIGJlZm9yZSB2aWRlbywgdmlkZW8gY29udGludWVzIHRvIGRyaXZlIG1lZGlhIGNsb2NrLgogICAgICAgICAgICAgICAgIC8vIEFsc28gc21vb3RoIG91dCB2aWRlb3MgPj0gMTBmcHMuCi0gICAgICAgICAgICAgICAgbU1lZGlhQ2xvY2stPnVwZGF0ZU1heFRpbWVNZWRpYShtZWRpYVRpbWVVcyArIDEwMDAwMCk7CisgICAgICAgICAgICAgICAgbU1lZGlhQ2xvY2stPnVwZGF0ZU1heFRpbWVNZWRpYShtZWRpYVRpbWVVcyArIGtEZWZhdWx0VmlkZW9GcmFtZUludGVydmFsVXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTEzNjYsNyArMTM3Nyw3IEBACiAgICAgICAgIHRvb0xhdGUgPSBmYWxzZTsKICAgICB9CiAKLSAgICBlbnRyeS0+bU5vdGlmeUNvbnN1bWVkLT5zZXRJbnQ2NCgidGltZXN0YW1wTnMiLCByZWFsVGltZVVzICogMTAwMGxsKTsKKyAgICBlbnRyeS0+bU5vdGlmeUNvbnN1bWVkLT5zZXRJbnQ2NCgidGltZXN0YW1wTnMiLCByZWFsVGltZVVzICogMTAwMExMKTsKICAgICBlbnRyeS0+bU5vdGlmeUNvbnN1bWVkLT5zZXRJbnQzMigicmVuZGVyIiwgIXRvb0xhdGUpOwogICAgIGVudHJ5LT5tTm90aWZ5Q29uc3VtZWQtPnBvc3QoKTsKICAgICBtVmlkZW9RdWV1ZS5lcmFzZShtVmlkZW9RdWV1ZS5iZWdpbigpKTsKQEAgLTE0MTUsOSArMTQyNiwxNiBAQAogICAgICAgICBtSGFzQXVkaW8gPSBmYWxzZTsKICAgICAgICAgaWYgKG1OZXh0VmlkZW9UaW1lTWVkaWFVcyA+PSAwKSB7CiAgICAgICAgICAgICBpbnQ2NF90IG1lZGlhVXMgPSAwOwotICAgICAgICAgICAgbU1lZGlhQ2xvY2stPmdldE1lZGlhVGltZShBTG9vcGVyOjpHZXROb3dVcygpLCAmbWVkaWFVcyk7Ci0gICAgICAgICAgICBpZiAobU5leHRWaWRlb1RpbWVNZWRpYVVzID4gbWVkaWFVcykgewotICAgICAgICAgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVNYXhUaW1lTWVkaWEobU5leHRWaWRlb1RpbWVNZWRpYVVzKTsKKyAgICAgICAgICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gbU1lZGlhQ2xvY2stPmdldE1lZGlhVGltZShub3dVcywgJm1lZGlhVXMpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBPSykgeworICAgICAgICAgICAgICAgIGlmIChtTmV4dFZpZGVvVGltZU1lZGlhVXMgPiBtZWRpYVVzKSB7CisgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVNYXhUaW1lTWVkaWEobU5leHRWaWRlb1RpbWVNZWRpYVVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVBbmNob3IoCisgICAgICAgICAgICAgICAgICAgICAgICBtTmV4dFZpZGVvVGltZU1lZGlhVXMsIG5vd1VzLAorICAgICAgICAgICAgICAgICAgICAgICAgbU5leHRWaWRlb1RpbWVNZWRpYVVzICsga0RlZmF1bHRWaWRlb0ZyYW1lSW50ZXJ2YWxVcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xNDQ1LDcgKzE0NjMsNyBAQAogCiAgICAgaWYgKG1IYXNWaWRlbykgewogICAgICAgICBpZiAobVZpZGVvU2NoZWR1bGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1WaWRlb1NjaGVkdWxlciA9IG5ldyBWaWRlb0ZyYW1lU2NoZWR1bGVyKCk7CisgICAgICAgICAgICBtVmlkZW9TY2hlZHVsZXIgPSBuZXcgVmlkZW9GcmFtZVNjaGVkdWxlcjIoKTsKICAgICAgICAgICAgIG1WaWRlb1NjaGVkdWxlci0+aW5pdCgpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTQ5OCw3ICsxNTE2LDcgQEAKIAogICAgIEFMT0dWKCJxdWV1ZURpZmYgPSAlLjJmIHNlY3MiLCBkaWZmIC8gMUU2KTsKIAotICAgIGlmIChkaWZmID4gMTAwMDAwbGwpIHsKKyAgICBpZiAoZGlmZiA+IDEwMDAwMExMKSB7CiAgICAgICAgIC8vIEF1ZGlvIGRhdGEgc3RhcnRzIE1vcmUgdGhhbiAwLjEgc2VjcyBiZWZvcmUgdmlkZW8uCiAgICAgICAgIC8vIERyb3Agc29tZSBhdWRpby4KIApAQCAtMTU3MCw5ICsxNTg4LDE4IEBACiAgICAgICAgICAgICBub3RpZnlDb21wbGV0ZSA9IG1Ob3RpZnlDb21wbGV0ZUF1ZGlvOwogICAgICAgICAgICAgbU5vdGlmeUNvbXBsZXRlQXVkaW8gPSBmYWxzZTsKICAgICAgICAgICAgIG1MYXN0QXVkaW9NZWRpYVRpbWVVcyA9IC0xOworCisgICAgICAgICAgICBtSGFzQXVkaW8gPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChtTmV4dFZpZGVvVGltZU1lZGlhVXMgPj0gMCkgeworICAgICAgICAgICAgICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgICAgICAgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVBbmNob3IoCisgICAgICAgICAgICAgICAgICAgICAgICBtTmV4dFZpZGVvVGltZU1lZGlhVXMsIG5vd1VzLAorICAgICAgICAgICAgICAgICAgICAgICAgbU5leHRWaWRlb1RpbWVNZWRpYVVzICsga0RlZmF1bHRWaWRlb0ZyYW1lSW50ZXJ2YWxVcyk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBub3RpZnlDb21wbGV0ZSA9IG1Ob3RpZnlDb21wbGV0ZVZpZGVvOwogICAgICAgICAgICAgbU5vdGlmeUNvbXBsZXRlVmlkZW8gPSBmYWxzZTsKKyAgICAgICAgICAgIG1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQgPSBmYWxzZTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIElmIHdlJ3JlIGN1cnJlbnRseSBzeW5jaW5nIHRoZSBxdWV1ZXMsIGkuZS4gZHJvcHBpbmcgYXVkaW8gd2hpbGUKQEAgLTE3NzMsNyArMTgwMCw3IEBACiAgICAgICAgICAgICBtQXVkaW9TaW5rLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrU2V0dGluZ3MpOwogICAgICAgICB9CiAKLSAgICAgICAgbU1lZGlhQ2xvY2stPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tSYXRlKTsKKyAgICAgICAgbU1lZGlhQ2xvY2stPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQpOwogCiAgICAgICAgIGlmICghbUF1ZGlvUXVldWUuZW1wdHkoKSkgewogICAgICAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZV9sKCk7CkBAIC0xNzg3LDcgKzE4MTQsNyBAQAogCiB2b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om9uU2V0VmlkZW9GcmFtZVJhdGUoZmxvYXQgZnBzKSB7CiAgICAgaWYgKG1WaWRlb1NjaGVkdWxlciA9PSBOVUxMKSB7Ci0gICAgICAgIG1WaWRlb1NjaGVkdWxlciA9IG5ldyBWaWRlb0ZyYW1lU2NoZWR1bGVyKCk7CisgICAgICAgIG1WaWRlb1NjaGVkdWxlciA9IG5ldyBWaWRlb0ZyYW1lU2NoZWR1bGVyMigpOwogICAgIH0KICAgICBtVmlkZW9TY2hlZHVsZXItPmluaXQoZnBzKTsKIH0KQEAgLTE4NTcsNiArMTg4NCw3IEBACiAgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcpIHsKICAgICBBTE9HVigib3BlbkF1ZGlvU2luazogb2ZmbG9hZE9ubHkoJWQpIG9mZmxvYWRpbmdBdWRpbyglZCkiLAogICAgICAgICAgICAgb2ZmbG9hZE9ubHksIG9mZmxvYWRpbmdBdWRpbygpKTsKKwogICAgIGJvb2wgYXVkaW9TaW5rQ2hhbmdlZCA9IGZhbHNlOwogCiAgICAgaW50MzJfdCBudW1DaGFubmVsczsKQEAgLTE4NzEsOCArMTg5OSwxMyBAQAogICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKICAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigic2FtcGxlLXJhdGUiLCAmc2FtcGxlUmF0ZSkpOwogCisgICAgLy8gcmVhZCBwY20gZW5jb2RpbmcgZnJvbSBNZWRpYUNvZGVjIG91dHB1dCBmb3JtYXQsIGlmIGF2YWlsYWJsZQorICAgIGludDMyX3QgcGNtRW5jb2Rpbmc7CisgICAgYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQgPQorICAgICAgICAgICAgZm9ybWF0LT5maW5kSW50MzIoS0VZX1BDTV9FTkNPRElORywgJnBjbUVuY29kaW5nKSA/CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvRm9ybWF0RnJvbUVuY29kaW5nKHBjbUVuY29kaW5nKSA6IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworCiAgICAgaWYgKG9mZmxvYWRpbmdBdWRpbygpKSB7Ci0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgICAgIEFTdHJpbmcgbWltZTsKICAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbWFwTWltZVRvQXVkaW9Gb3JtYXQoYXVkaW9Gb3JtYXQsIG1pbWUuY19zdHIoKSk7CkBAIC0xOTI4LDcgKzE5NjEsNiBAQAogICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KWNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgMCAvKiBidWZmZXJDb3VudCAtIHVudXNlZCAqLywKICAgICAgICAgICAgICAgICAgICAgJk51UGxheWVyMjo6UmVuZGVyZXI6OkF1ZGlvU2lua0NhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICB0aGlzLAogICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3Qpb2ZmbG9hZEZsYWdzLApAQCAtMTk3NCw3ICsyMDA2LDcgQEAKICAgICAgICAgY29uc3QgUGNtSW5mbyBpbmZvID0gewogICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCljaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpcGNtRmxhZ3MsCi0gICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIC8vIFRPRE86IGNoYW5nZSB0byBhdWRpb0Zvcm1hdAorICAgICAgICAgICAgICAgIGF1ZGlvRm9ybWF0LAogICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLAogICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUKICAgICAgICAgfTsKQEAgLTE5OTksMTMgKzIwMzEsNiBAQAogICAgICAgICBjb25zdCB1aW50MzJfdCBmcmFtZUNvdW50ID0KICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNhbXBsZVJhdGUgKiBnZXRBdWRpb1NpbmtQY21Nc1NldHRpbmcoKSAvIDEwMDA7CiAKLSAgICAgICAgLy8gVGhlIGRvTm90UmVjb25uZWN0IG1lYW5zIEF1ZGlvU2luayB3aWxsIHNpZ25hbCBiYWNrIGFuZCBsZXQgTnVQbGF5ZXIyIHRvIHJlLWNvbnN0cnVjdAotICAgICAgICAvLyBBdWRpb1NpbmsuIFdlIGRvbid0IHdhbnQgdGhpcyB3aGVuIHRoZXJlJ3MgdmlkZW8gYmVjYXVzZSBpdCB3aWxsIGNhdXNlIGEgdmlkZW8gc2VlayB0bwotICAgICAgICAvLyB0aGUgcHJldmlvdXMgSSBmcmFtZS4gQnV0IHdlIGRvIHdhbnQgdGhpcyB3aGVuIHRoZXJlJ3Mgb25seSBhdWRpbyBiZWNhdXNlIGl0IHdpbGwgZ2l2ZQotICAgICAgICAvLyBOdVBsYXllcjIgYSBjaGFuY2UgdG8gc3dpdGNoIGZyb20gbm9uLW9mZmxvYWQgbW9kZSB0byBvZmZsb2FkIG1vZGUuCi0gICAgICAgIC8vIFNvIHdlIG9ubHkgc2V0IGRvTm90UmVjb25uZWN0IHdoZW4gdGhlcmUncyBubyB2aWRlby4KLSAgICAgICAgY29uc3QgYm9vbCBkb05vdFJlY29ubmVjdCA9ICFoYXNWaWRlbzsKLQogICAgICAgICAvLyBXZSBzaG91bGQgYWx3YXlzIGJlIGFibGUgdG8gc2V0IG91ciBwbGF5YmFjayBzZXR0aW5ncyBpZiB0aGUgc2luayBpcyBjbG9zZWQuCiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUF1ZGlvU2luay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1NldHRpbmdzKSAhPSBPSywKICAgICAgICAgICAgICAgICAib25PcGVuQXVkaW9TaW5rOiBjYW4ndCBzZXQgcGxheWJhY2sgcmF0ZSBvbiBjbG9zZWQgc2luayIpOwpAQCAtMjAxMywxMyArMjAzOCwxMSBAQAogICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KWNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKLSAgICAgICAgICAgICAgICAgICAgMCAvKiBidWZmZXJDb3VudCAtIHVudXNlZCAqLywKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9Gb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgIG1Vc2VBdWRpb0NhbGxiYWNrID8gJk51UGxheWVyMjo6UmVuZGVyZXI6OkF1ZGlvU2lua0NhbGxiYWNrIDogTlVMTCwKICAgICAgICAgICAgICAgICAgICAgbVVzZUF1ZGlvQ2FsbGJhY2sgPyB0aGlzIDogTlVMTCwKICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KXBjbUZsYWdzLAogICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICBkb05vdFJlY29ubmVjdCwKICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dXKCJvcGVuQXVkaW9TaW5rOiBub24gb2ZmbG9hZGVkIG9wZW4gZmFpbGVkIHN0YXR1czogJWQiLCBlcnIpOwpAQCAtMjA3MSw0ICsyMDk0LDMgQEAKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5oCmluZGV4IDYyY2YwZDguLmQwNjVkZWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyUmVuZGVyZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlJlbmRlcmVyLmgKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+CiAjaW5jbHVkZSA8bWVkaWEvQVZTeW5jU2V0dGluZ3MuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSk9iamVjdEhvbGRlci5oPgogCiAjaW5jbHVkZSAiTnVQbGF5ZXIyLmgiCiAKQEAgLTI4LDcgKzI5LDcgQEAKIGNsYXNzICBKV2FrZUxvY2s7CiBzdHJ1Y3QgTWVkaWFDbG9jazsKIGNsYXNzIE1lZGlhQ29kZWNCdWZmZXI7Ci1zdHJ1Y3QgVmlkZW9GcmFtZVNjaGVkdWxlcjsKK3N0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTsKIAogc3RydWN0IE51UGxheWVyMjo6UmVuZGVyZXIgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgIGVudW0gRmxhZ3MgewpAQCAtMzgsNiArMzksNyBAQAogICAgIFJlbmRlcmVyKGNvbnN0IHNwPE1lZGlhUGxheWVyMkludGVyZmFjZTo6QXVkaW9TaW5rPiAmc2luaywKICAgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiAmbWVkaWFDbG9jaywKICAgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKKyAgICAgICAgICAgICBjb25zdCBzcDxKT2JqZWN0SG9sZGVyPiAmY29udGV4dCwKICAgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOwogCiAgICAgc3RhdGljIHNpemVfdCBBdWRpb1NpbmtDYWxsYmFjaygKQEAgLTE1Niw3ICsxNTgsNyBAQAogICAgIExpc3Q8UXVldWVFbnRyeT4gbUF1ZGlvUXVldWU7CiAgICAgTGlzdDxRdWV1ZUVudHJ5PiBtVmlkZW9RdWV1ZTsKICAgICB1aW50MzJfdCBtTnVtRnJhbWVzV3JpdHRlbjsKLSAgICBzcDxWaWRlb0ZyYW1lU2NoZWR1bGVyPiBtVmlkZW9TY2hlZHVsZXI7CisgICAgc3A8VmlkZW9GcmFtZVNjaGVkdWxlckJhc2U+IG1WaWRlb1NjaGVkdWxlcjsKIAogICAgIGJvb2wgbURyYWluQXVkaW9RdWV1ZVBlbmRpbmc7CiAgICAgYm9vbCBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZzsKQEAgLTE2Nyw3ICsxNjksNiBAQAogICAgIGludDMyX3QgbUF1ZGlvRU9TR2VuZXJhdGlvbjsKIAogICAgIGNvbnN0IHNwPE1lZGlhQ2xvY2s+IG1NZWRpYUNsb2NrOwotICAgIGZsb2F0IG1QbGF5YmFja1JhdGU7IC8vIGF1ZGlvIHRyYWNrIHJhdGUKIAogICAgIEF1ZGlvUGxheWJhY2tSYXRlIG1QbGF5YmFja1NldHRpbmdzOwogICAgIEFWU3luY1NldHRpbmdzIG1TeW5jU2V0dGluZ3M7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJTb3VyY2UuaAppbmRleCA2NjIyMzVmLi45Mjk4YTk5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyU291cmNlLmgKQEAgLTY5LDcgKzY5LDcgQEAKICAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYygpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUFzeW5jKGludDY0X3Qgc3RhcnRUaW1lVXMpID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZCBzdGFydCgpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgc3RvcCgpIHt9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvUlRTUFNvdXJjZTIuY3BwCmluZGV4IDFkZmUzODMuLmE3MDI2OWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvUlRTUFNvdXJjZTIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvUlRTUFNvdXJjZTIuY3BwCkBAIC0zMCw3ICszMCw3IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY29uc3QgaW50NjRfdCBrTmVhckVPU1RpbWVvdXRVcyA9IDIwMDAwMDBsbDsgLy8gMiBzZWNzCitjb25zdCBpbnQ2NF90IGtOZWFyRU9TVGltZW91dFVzID0gMjAwMDAwMExMOyAvLyAyIHNlY3MKIAogLy8gRGVmYXVsdCBCdWZmZXIgVW5kZXJmbG93L1ByZXBhcmUvU3RhcnRTZXJ2ZXIvT3ZlcmZsb3cgTWFya3MKIHN0YXRpYyBjb25zdCBpbnQga1VuZGVyZmxvd01hcmtNcyAgID0gIDEwMDA7ICAvLyAxIHNlY29uZApAQCAtOTYsNyArOTYsOCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpwcmVwYXJlQXN5bmMoKSB7CisvLyBUT0RPOiBmZXRjaCBkYXRhIHN0YXJ0aW5nIGZyb20gfHN0YXJ0VGltZVVzfAordm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpwcmVwYXJlQXN5bmMoaW50NjRfdCAvKiBzdGFydFRpbWVVcyAqLykgewogICAgIGlmIChtSXNTRFAgJiYgbUhUVFBTZXJ2aWNlID09IE5VTEwpIHsKICAgICAgICAgbm90aWZ5UHJlcGFyZWQoQkFEX1ZBTFVFKTsKICAgICAgICAgcmV0dXJuOwpAQCAtMTA0LDcgKzEwNSw3IEBACiAKICAgICBpZiAobUxvb3BlciA9PSBOVUxMKSB7CiAgICAgICAgIG1Mb29wZXIgPSBuZXcgQUxvb3BlcjsKLSAgICAgICAgbUxvb3Blci0+c2V0TmFtZSgicnRzcCIpOworICAgICAgICBtTG9vcGVyLT5zZXROYW1lKCJydHNwMiIpOwogICAgICAgICBtTG9vcGVyLT5zdGFydCgpOwogCiAgICAgICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGlzKTsKQEAgLTE2Nyw3ICsxNjgsNyBAQAogICAgIC8vIFdlJ3JlIGdvaW5nIHRvIGJ1ZmZlciBhdCBsZWFzdCAyIHNlY3Mgd29ydGggZGF0YSBvbiBhbGwgdHJhY2tzIGJlZm9yZQogICAgIC8vIHN0YXJ0aW5nIHBsYXliYWNrIChib3RoIGF0IHN0YXJ0dXAgYW5kIGFmdGVyIGEgc2VlaykuCiAKLSAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWluRHVyYXRpb25VcyA9IDIwMDAwMDBsbDsKKyAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWluRHVyYXRpb25VcyA9IDIwMDAwMDBMTDsKIAogICAgIGludDY0X3QgbWVkaWFEdXJhdGlvblVzID0gMDsKICAgICBnZXREdXJhdGlvbigmbWVkaWFEdXJhdGlvblVzKTsKQEAgLTI3MSw3ICsyNzIsNyBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKSB7Ci0gICAgKmR1cmF0aW9uVXMgPSAtMWxsOworICAgICpkdXJhdGlvblVzID0gLTFMTDsKIAogICAgIGludDY0X3QgYXVkaW9EdXJhdGlvblVzOwogICAgIGlmIChtQXVkaW9UcmFjayAhPSBOVUxMCkBAIC0zMjAsNyArMzIxLDcgQEAKIAogdm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKSB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBvbGxCdWZmZXJpbmcsIHRoaXMpOwotICAgIG1zZy0+cG9zdCgxMDAwMDAwbGwpOyAvLyAxIHNlY29uZCBpbnRlcnZhbHMKKyAgICBtc2ctPnBvc3QoMTAwMDAwMExMKTsgLy8gMSBzZWNvbmQgaW50ZXJ2YWxzCiB9CiAKIHZvaWQgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6Y2hlY2tCdWZmZXJpbmcoCkBAIC0zNDQsMTAgKzM0NSwxMCBAQAogICAgICAgICBpbnQ2NF90IG1heFJlYnVmZmVyaW5nTWFya1VzOwogICAgICAgICB7CiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUJ1ZmZlcmluZ1NldHRpbmdzTG9jayk7Ci0gICAgICAgICAgICBpbml0aWFsTWFya1VzID0gbUJ1ZmZlcmluZ1NldHRpbmdzLm1Jbml0aWFsTWFya01zICogMTAwMGxsOworICAgICAgICAgICAgaW5pdGlhbE1hcmtVcyA9IG1CdWZmZXJpbmdTZXR0aW5ncy5tSW5pdGlhbE1hcmtNcyAqIDEwMDBMTDsKICAgICAgICAgICAgIC8vIFRPRE86IG1heFJlYnVmZmVyaW5nTWFya1VzIGNvdWxkIGJlIGxhcmdlciB0aGFuCiAgICAgICAgICAgICAvLyBtQnVmZmVyaW5nU2V0dGluZ3MubVJlc3VtZVBsYXliYWNrTWFya01zICogMTAwMGxsLgotICAgICAgICAgICAgbWF4UmVidWZmZXJpbmdNYXJrVXMgPSBtQnVmZmVyaW5nU2V0dGluZ3MubVJlc3VtZVBsYXliYWNrTWFya01zICogMTAwMGxsOworICAgICAgICAgICAgbWF4UmVidWZmZXJpbmdNYXJrVXMgPSBtQnVmZmVyaW5nU2V0dGluZ3MubVJlc3VtZVBsYXliYWNrTWFya01zICogMTAwMExMOwogICAgICAgICB9CiAgICAgICAgIC8vIGlzRmluaXNoZWQgd2hlbiBkdXJhdGlvbiBpcyAwIGNoZWNrcyBmb3IgRU9TIHJlc3VsdCBvbmx5CiAgICAgICAgIGlmIChidWZmZXJlZER1cmF0aW9uVXMgPiBpbml0aWFsTWFya1VzCkBAIC0zNjcsNyArMzY4LDcgQEAKICAgICAgICAgICAgICAgICArK292ZXJmbG93Q291bnQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0U2VydmVyTWFya1VzID0KLSAgICAgICAgICAgICAgICAgICAgKGtVbmRlcmZsb3dNYXJrTXMgKiAxMDAwbGwgKyBtYXhSZWJ1ZmZlcmluZ01hcmtVcykgLyAyOworICAgICAgICAgICAgICAgICAgICAoa1VuZGVyZmxvd01hcmtNcyAqIDEwMDBMTCArIG1heFJlYnVmZmVyaW5nTWFya1VzKSAvIDI7CiAgICAgICAgICAgICBpZiAoYnVmZmVyZWREdXJhdGlvblVzIDwgc3RhcnRTZXJ2ZXJNYXJrVXMpIHsKICAgICAgICAgICAgICAgICArK3N0YXJ0Q291bnQ7CiAgICAgICAgICAgICB9CkBAIC02MzgsNyArNjM5LDcgQEAKICAgICAgICAgICAgICAgICBpbnQ2NF90IG5wdFVzID0KICAgICAgICAgICAgICAgICAgICAgKChkb3VibGUpcnRwVGltZSAtIChkb3VibGUpaW5mby0+bVJUUFRpbWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAvIGluZm8tPm1UaW1lU2NhbGUKLSAgICAgICAgICAgICAgICAgICAgICAgICogMTAwMDAwMGxsCisgICAgICAgICAgICAgICAgICAgICAgICAqIDEwMDAwMDBMTAogICAgICAgICAgICAgICAgICAgICAgICAgKyBpbmZvLT5tTm9ybWFsUGxheXRpbWVVczsKIAogICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIG5wdFVzKTsKQEAgLTc0Niw3ICs3NDcsNyBAQAogICAgICAgICBUcmFja0luZm8gaW5mbzsKICAgICAgICAgaW5mby5tVGltZVNjYWxlID0gdGltZVNjYWxlOwogICAgICAgICBpbmZvLm1SVFBUaW1lID0gMDsKLSAgICAgICAgaW5mby5tTm9ybWFsUGxheXRpbWVVcyA9IDBsbDsKKyAgICAgICAgaW5mby5tTm9ybWFsUGxheXRpbWVVcyA9IDBMTDsKICAgICAgICAgaW5mby5tTlBUTWFwcGluZ1ZhbGlkID0gZmFsc2U7CiAKICAgICAgICAgaWYgKChpc0F1ZGlvICYmIG1BdWRpb1RyYWNrID09IE5VTEwpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmgKaW5kZXggNzEyYzNlNS4uZTVmMTcxNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9SVFNQU291cmNlMi5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvUlRTUFNvdXJjZTIuaApAQCAtNDMsNyArNDMsNyBAQAogICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSBvdmVycmlkZTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYygpOworICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoaW50NjRfdCBzdGFydFRpbWVVcyk7CiAgICAgdmlydHVhbCB2b2lkIHN0YXJ0KCk7CiAgICAgdmlydHVhbCB2b2lkIHN0b3AoKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5icAppbmRleCBhMzc5NzNiLi42NzA5NTg1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5icApAQCAtMiw2ICsyLDcgQEAKIAogICAgIHNyY3M6IFsKICAgICAgICAgIkFjdGl2aXR5TWFuYWdlci5jcHAiLAorICAgICAgICAiRGVhdGhOb3RpZmllci5jcHAiLAogICAgICAgICAiTWVkaWFQbGF5ZXJGYWN0b3J5LmNwcCIsCiAgICAgICAgICJNZWRpYVBsYXllclNlcnZpY2UuY3BwIiwKICAgICAgICAgIk1lZGlhUmVjb3JkZXJDbGllbnQuY3BwIiwKQEAgLTExLDI0ICsxMiwyNiBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKKyAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliYXVkaW9jbGllbnQiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmNhbWVyYV9jbGllbnQiLAorICAgICAgICAibGliY29kZWMyX2NsaWVudCIsCiAgICAgICAgICJsaWJjcnlwdG8iLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmRsIiwKICAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCi0gICAgICAgICJsaWJoaWRsbWVtb3J5IiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJtZWRpYSIsCiAgICAgICAgICJsaWJtZWRpYV9vbXgiLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAogICAgICAgICAibGlibWVkaWFkcm0iLAogICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKICAgICAgICAgImxpYm1lZGlhdXRpbHMiLAogICAgICAgICAibGlibWVtdW5yZWFjaGFibGUiLAorICAgICAgICAibGlibmV0ZF9jbGllbnQiLAogICAgICAgICAibGlicG93ZXJtYW5hZ2VyIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLApAQCAtNjMsMTYgKzY2LDkgQEAKIAogICAgIG5hbWU6ICJsaWJtZWRpYXBsYXllcnNlcnZpY2UiLAogCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKLQogICAgIHNhbml0aXplOiB7CiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiAKIH0KIAotc3ViZGlycyA9IFsiKiJdCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9EZWF0aE5vdGlmaWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9EZWF0aE5vdGlmaWVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTNiZGY1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RlYXRoTm90aWZpZXIuY3BwCkBAIC0wLDAgKzEsODAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFQbGF5ZXJTZXJ2aWNlLURlYXRoTm90aWZpZXIiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgIkRlYXRoTm90aWZpZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEZWF0aE5vdGlmaWVyOjpEZWF0aFJlY2lwaWVudCA6CisgICAgICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCwKKyAgICAgICAgcHVibGljIGhhcmR3YXJlOjpoaWRsX2RlYXRoX3JlY2lwaWVudCB7CitwdWJsaWM6CisgICAgdXNpbmcgTm90aWZ5ID0gRGVhdGhOb3RpZmllcjo6Tm90aWZ5OworCisgICAgRGVhdGhSZWNpcGllbnQoTm90aWZ5IGNvbnN0JiBub3RpZnkpOiBtTm90aWZ5e25vdGlmeX0geworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKHdwPElCaW5kZXI+IGNvbnN0Jikgb3ZlcnJpZGUgeworICAgICAgICBtTm90aWZ5KCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHNlcnZpY2VEaWVkKHVpbnQ2NF90LCB3cDxIQmFzZT4gY29uc3QmKSBvdmVycmlkZSB7CisgICAgICAgIG1Ob3RpZnkoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgTm90aWZ5IG1Ob3RpZnk7Cit9OworCitEZWF0aE5vdGlmaWVyOjpEZWF0aE5vdGlmaWVyKHNwPElCaW5kZXI+IGNvbnN0JiBzZXJ2aWNlLCBOb3RpZnkgY29uc3QmIG5vdGlmeSkKKyAgICAgIDogbVNlcnZpY2V7c3RkOjppbl9wbGFjZV9pbmRleDwxPiwgc2VydmljZX0sCisgICAgICAgIG1EZWF0aFJlY2lwaWVudHtuZXcgRGVhdGhSZWNpcGllbnQobm90aWZ5KX0geworICAgIHNlcnZpY2UtPmxpbmtUb0RlYXRoKG1EZWF0aFJlY2lwaWVudCk7Cit9CisKK0RlYXRoTm90aWZpZXI6OkRlYXRoTm90aWZpZXIoc3A8SEJhc2U+IGNvbnN0JiBzZXJ2aWNlLCBOb3RpZnkgY29uc3QmIG5vdGlmeSkKKyAgICAgIDogbVNlcnZpY2V7c3RkOjppbl9wbGFjZV9pbmRleDwyPiwgc2VydmljZX0sCisgICAgICAgIG1EZWF0aFJlY2lwaWVudHtuZXcgRGVhdGhSZWNpcGllbnQobm90aWZ5KX0geworICAgIHNlcnZpY2UtPmxpbmtUb0RlYXRoKG1EZWF0aFJlY2lwaWVudCwgMCk7Cit9CisKK0RlYXRoTm90aWZpZXI6OkRlYXRoTm90aWZpZXIoRGVhdGhOb3RpZmllciYmIG90aGVyKQorICAgICAgOiBtU2VydmljZXtvdGhlci5tU2VydmljZX0sIG1EZWF0aFJlY2lwaWVudHtvdGhlci5tRGVhdGhSZWNpcGllbnR9IHsKKyAgICBvdGhlci5tU2VydmljZS5lbXBsYWNlPDA+KCk7CisgICAgb3RoZXIubURlYXRoUmVjaXBpZW50ID0gbnVsbHB0cjsKK30KKworRGVhdGhOb3RpZmllcjo6fkRlYXRoTm90aWZpZXIoKSB7CisgICAgc3dpdGNoIChtU2VydmljZS5pbmRleCgpKSB7CisgICAgY2FzZSAwOgorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6CisgICAgICAgIHN0ZDo6Z2V0PDE+KG1TZXJ2aWNlKS0+dW5saW5rVG9EZWF0aChtRGVhdGhSZWNpcGllbnQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHN0ZDo6Z2V0PDI+KG1TZXJ2aWNlKS0+dW5saW5rVG9EZWF0aChtRGVhdGhSZWNpcGllbnQpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBDSEVDSyhmYWxzZSkgPDwgIkNvcnJ1cHRlZCBzZXJ2aWNlIHR5cGUgZHVyaW5nIGRlc3RydWN0aW9uLiI7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9EZWF0aE5vdGlmaWVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvRGVhdGhOb3RpZmllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYzI2MTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvRGVhdGhOb3RpZmllci5oCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQVNFUlZJQ0VfREVBVEhOT1RJRklFUl9ICisjZGVmaW5lIEFORFJPSURfTUVESUFTRVJWSUNFX0RFQVRITk9USUZJRVJfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL2Jhc2UvMS4wL0lCYXNlLmg+CisjaW5jbHVkZSA8YmluZGVyL0JpbmRlci5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKworI2luY2x1ZGUgPHZhcmlhbnQ+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRGVhdGhOb3RpZmllciB7CitwdWJsaWM6CisgICAgdXNpbmcgSEJhc2UgPSBoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZTsKKyAgICB1c2luZyBOb3RpZnkgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT47CisKKyAgICBEZWF0aE5vdGlmaWVyKHNwPElCaW5kZXI+IGNvbnN0JiBzZXJ2aWNlLCBOb3RpZnkgY29uc3QmIG5vdGlmeSk7CisgICAgRGVhdGhOb3RpZmllcihzcDxIQmFzZT4gY29uc3QmIHNlcnZpY2UsIE5vdGlmeSBjb25zdCYgbm90aWZ5KTsKKyAgICBEZWF0aE5vdGlmaWVyKERlYXRoTm90aWZpZXImJiBvdGhlcik7CisgICAgfkRlYXRoTm90aWZpZXIoKTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnZhcmlhbnQ8c3RkOjptb25vc3RhdGUsIHNwPElCaW5kZXI+LCBzcDxIQmFzZT4+IG1TZXJ2aWNlOworCisgICAgY2xhc3MgRGVhdGhSZWNpcGllbnQ7CisgICAgc3A8RGVhdGhSZWNpcGllbnQ+IG1EZWF0aFJlY2lwaWVudDsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfTUVESUFTRVJWSUNFX0RFQVRITk9USUZJRVJfSAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvRGVhdGhSZWNpcGllbnQuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9EZWF0aFJlY2lwaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNWFlNWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvRGVhdGhSZWNpcGllbnQuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFTRVJWSUNFX0RFQVRIUkVDSVBJRU5UX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQVNFUlZJQ0VfREVBVEhSRUNJUElFTlRfSAorCisjaW5jbHVkZSA8YmluZGVyL2JpbmRlci5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKworI2luY2x1ZGUgPHZhcmlhbnQ+CisKK2NsYXNzIERlYXRoTm90aWZpZXIgOgorICAgICAgICBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQsCisgICAgICAgIHB1YmxpYyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2RlYXRoX3JlY2lwaWVudCB7CitwdWJsaWM6CisgICAgdXNpbmcgU2VydmljZSA9IHN0ZDo6dmFyaWFudDwKKyAgICAgICAgICAgIHNwPElCaW5kZXI+IGNvbnN0JiwKKyAgICAgICAgICAgIHNwPGFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiBjb25zdCY+OworCisgICAgRGVhdGhOb3RpZmllcihzdGQ6OnZhcmlhbnQ8c3A8SUJpbmRlcj4gY29uc3QmLCAKKyAgICAgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiBzZXJ2aWNlLAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlPiYgbGlzdGVuZXIsCisgICAgICAgICAgICBpbnQgd2hpY2gsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSk7CisgICAgRGVhdGhOb3RpZmllcigKKyAgICAgICAgICAgIGNvbnN0IHNwPGFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgaFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYVBsYXllckJhc2U+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIGludCB3aGljaCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKTsKKyAgICB2aXJ0dWFsIH5EZWF0aE5vdGlmaWVyKCkgPSBkZWZhdWx0OworICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOworICAgIHZpcnR1YWwgdm9pZCBzZXJ2aWNlRGllZCgKKyAgICAgICAgICAgIHVpbnQ2NF90IGNvb2tpZSwKKyAgICAgICAgICAgIGNvbnN0IHdwPDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U+JiB3aG8pOworICAgIHZvaWQgdW5saW5rVG9EZWF0aCgpOworCitwcml2YXRlOgorICAgIHNwPElCaW5kZXI+IG1TZXJ2aWNlOworICAgIHNwPGFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiBtSFNlcnZpY2U7IC8vIEhJREwgc2VydmljZQorICAgIHdwPE1lZGlhUGxheWVyQmFzZT4gbUxpc3RlbmVyOworICAgIGludCBtV2hpY2g7CisgICAgc3RkOjpzdHJpbmcgbU5hbWU7Cit9OworCisjZW5kaWYgLy8gQU5EUk9JRF9NRURJQVNFUlZJQ0VfREVBVEhSRUNJUElFTlRfSAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCmluZGV4IDliY2ZjODMuLmRmZDM5MzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwCkBAIC0zNCw2ICszNCw4IEBACiAKICNpbmNsdWRlIDx1dGlscy9taXNjLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRTdG9yZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KQEAgLTQ1LDcgKzQ3LDcgQEAKICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JUmVtb3RlRGlzcGxheS5oPgogI2luY2x1ZGUgPG1lZGlhL0lSZW1vdGVEaXNwbGF5Q2xpZW50Lmg+CkBAIC01OTAsNyArNTkyLDYgQEAKICAgICBpZiAobUF1ZGlvQXR0cmlidXRlcyAhPSBOVUxMKSB7CiAgICAgICAgIGZyZWUobUF1ZGlvQXR0cmlidXRlcyk7CiAgICAgfQotICAgIGNsZWFyRGVhdGhOb3RpZmllcnNfbCgpOwogICAgIG1BdWRpb0RldmljZVVwZGF0ZWRMaXN0ZW5lci5jbGVhcigpOwogfQogCkBAIC02NDYsNTkgKzY0Nyw2IEBACiAgICAgcmV0dXJuIHA7CiB9CiAKLU1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpTZXJ2aWNlRGVhdGhOb3RpZmllcjo6U2VydmljZURlYXRoTm90aWZpZXIoCi0gICAgICAgIGNvbnN0IHNwPElCaW5kZXI+JiBzZXJ2aWNlLAotICAgICAgICBjb25zdCBzcDxNZWRpYVBsYXllckJhc2U+JiBsaXN0ZW5lciwKLSAgICAgICAgaW50IHdoaWNoKSB7Ci0gICAgbVNlcnZpY2UgPSBzZXJ2aWNlOwotICAgIG1PbXggPSBudWxscHRyOwotICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgIG1XaGljaCA9IHdoaWNoOwotfQotCi1NZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6U2VydmljZURlYXRoTm90aWZpZXI6OlNlcnZpY2VEZWF0aE5vdGlmaWVyKAotICAgICAgICBjb25zdCBzcDxJT214PiYgb214LAotICAgICAgICBjb25zdCBzcDxNZWRpYVBsYXllckJhc2U+JiBsaXN0ZW5lciwKLSAgICAgICAgaW50IHdoaWNoKSB7Ci0gICAgbVNlcnZpY2UgPSBudWxscHRyOwotICAgIG1PbXggPSBvbXg7Ci0gICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgbVdoaWNoID0gd2hpY2g7Ci19Ci0KLU1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpTZXJ2aWNlRGVhdGhOb3RpZmllcjo6flNlcnZpY2VEZWF0aE5vdGlmaWVyKCkgewotfQotCi12b2lkIE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpTZXJ2aWNlRGVhdGhOb3RpZmllcjo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgLyp3aG8qLykgewotICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOwotICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7Ci0gICAgICAgIGxpc3RlbmVyLT5zZW5kRXZlbnQoTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1NFUlZFUl9ESUVELCBtV2hpY2gpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dXKCJsaXN0ZW5lciBmb3IgcHJvY2VzcyAlZCBkZWF0aCBpcyBnb25lIiwgbVdoaWNoKTsKLSAgICB9Ci19Ci0KLXZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OlNlcnZpY2VEZWF0aE5vdGlmaWVyOjpzZXJ2aWNlRGllZCgKLSAgICAgICAgdWludDY0X3QgLyogY29va2llICovLAotICAgICAgICBjb25zdCB3cDw6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgLyogd2hvICovKSB7Ci0gICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7Ci0gICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKLSAgICAgICAgbGlzdGVuZXItPnNlbmRFdmVudChNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfU0VSVkVSX0RJRUQsIG1XaGljaCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1coImxpc3RlbmVyIGZvciBwcm9jZXNzICVkIGRlYXRoIGlzIGdvbmUiLCBtV2hpY2gpOwotICAgIH0KLX0KLQotdm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6U2VydmljZURlYXRoTm90aWZpZXI6OnVubGlua1RvRGVhdGgoKSB7Ci0gICAgaWYgKG1TZXJ2aWNlICE9IG51bGxwdHIpIHsKLSAgICAgICAgbVNlcnZpY2UtPnVubGlua1RvRGVhdGgodGhpcyk7Ci0gICAgICAgIG1TZXJ2aWNlID0gbnVsbHB0cjsKLSAgICB9IGVsc2UgaWYgKG1PbXggIT0gbnVsbHB0cikgewotICAgICAgICBtT214LT51bmxpbmtUb0RlYXRoKHRoaXMpOwotICAgICAgICBtT214ID0gbnVsbHB0cjsKLSAgICB9Ci19Ci0KIHZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OkF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyOjpvbkF1ZGlvRGV2aWNlVXBkYXRlKAogICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvLAogICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSB7CkBAIC03MTAsMTcgKzY1OCw2IEBACiAgICAgfQogfQogCi12b2lkIE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpjbGVhckRlYXRoTm90aWZpZXJzX2woKSB7Ci0gICAgaWYgKG1FeHRyYWN0b3JEZWF0aExpc3RlbmVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgbUV4dHJhY3RvckRlYXRoTGlzdGVuZXItPnVubGlua1RvRGVhdGgoKTsKLSAgICAgICAgbUV4dHJhY3RvckRlYXRoTGlzdGVuZXIgPSBudWxscHRyOwotICAgIH0KLSAgICBpZiAobUNvZGVjRGVhdGhMaXN0ZW5lciAhPSBudWxscHRyKSB7Ci0gICAgICAgIG1Db2RlY0RlYXRoTGlzdGVuZXItPnVubGlua1RvRGVhdGgoKTsKLSAgICAgICAgbUNvZGVjRGVhdGhMaXN0ZW5lciA9IG51bGxwdHI7Ci0gICAgfQotfQotCiBzcDxNZWRpYVBsYXllckJhc2U+IE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpzZXREYXRhU291cmNlX3ByZSgKICAgICAgICAgcGxheWVyX3R5cGUgcGxheWVyVHlwZSkKIHsKQEAgLTczMiwzMCArNjY5LDgzIEBACiAgICAgICAgIHJldHVybiBwOwogICAgIH0KIAorICAgIHN0ZDo6dmVjdG9yPERlYXRoTm90aWZpZXI+IGRlYXRoTm90aWZpZXJzOworCisgICAgLy8gTGlzdGVuIHRvIGRlYXRoIG9mIG1lZGlhLmV4dHJhY3RvciBzZXJ2aWNlCiAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwogICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5leHRyYWN0b3IiKSk7CiAgICAgaWYgKGJpbmRlciA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJleHRyYWN0b3Igc2VydmljZSBub3QgYXZhaWxhYmxlIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBzcDxTZXJ2aWNlRGVhdGhOb3RpZmllcj4gZXh0cmFjdG9yRGVhdGhMaXN0ZW5lciA9Ci0gICAgICAgICAgICBuZXcgU2VydmljZURlYXRoTm90aWZpZXIoYmluZGVyLCBwLCBNRURJQUVYVFJBQ1RPUl9QUk9DRVNTX0RFQVRIKTsKLSAgICBiaW5kZXItPmxpbmtUb0RlYXRoKGV4dHJhY3RvckRlYXRoTGlzdGVuZXIpOworICAgIGRlYXRoTm90aWZpZXJzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgIGJpbmRlciwgW2wgPSB3cDxNZWRpYVBsYXllckJhc2U+KHApXSgpIHsKKyAgICAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiBsaXN0ZW5lciA9IGwucHJvbW90ZSgpOworICAgICAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgICAgIEFMT0dJKCJtZWRpYS5leHRyYWN0b3IgZGllZC4gU2VuZGluZyBkZWF0aCBub3RpZmljYXRpb24uIik7CisgICAgICAgICAgICBsaXN0ZW5lci0+c2VuZEV2ZW50KE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9TRVJWRVJfRElFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFFWFRSQUNUT1JfUFJPQ0VTU19ERUFUSCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygibWVkaWEuZXh0cmFjdG9yIGRpZWQgd2l0aG91dCBhIGRlYXRoIGhhbmRsZXIuIik7CisgICAgICAgIH0KKyAgICB9KTsKIAotICAgIHNwPElPbXg+IG9teCA9IElPbXg6OmdldFNlcnZpY2UoKTsKLSAgICBpZiAob214ID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIklPbXggc2VydmljZSBpcyBub3QgYXZhaWxhYmxlIik7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIHsKKyAgICAgICAgdXNpbmcgOjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZTsKKworICAgICAgICAvLyBMaXN0ZW4gdG8gZGVhdGggb2YgT01YIHNlcnZpY2UKKyAgICAgICAgeworICAgICAgICAgICAgc3A8SUJhc2U+IGJhc2UgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjoKKyAgICAgICAgICAgICAgICAgICAgSU9teDo6Z2V0U2VydmljZSgpOworICAgICAgICAgICAgaWYgKGJhc2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dEKCJPTVggc2VydmljZSBpcyBub3QgYXZhaWxhYmxlIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGRlYXRoTm90aWZpZXJzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsIFtsID0gd3A8TWVkaWFQbGF5ZXJCYXNlPihwKV0oKSB7CisgICAgICAgICAgICAgICAgICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gbGlzdGVuZXIgPSBsLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgiT01YIHNlcnZpY2UgZGllZC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlbmRpbmcgZGVhdGggbm90aWZpY2F0aW9uLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXItPnNlbmRFdmVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1NFUlZFUl9ESUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQUNPREVDX1BST0NFU1NfREVBVEgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIk9NWCBzZXJ2aWNlIGRpZWQgd2l0aG91dCBhIGRlYXRoIGhhbmRsZXIuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIExpc3RlbiB0byBkZWF0aCBvZiBDb2RlYzIgc2VydmljZXMKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBjb25zdCYgY2xpZW50IDoKKyAgICAgICAgICAgICAgICAgICAgQ29kZWMyQ2xpZW50OjpDcmVhdGVGcm9tQWxsU2VydmljZXMoKSkgeworICAgICAgICAgICAgICAgIHNwPElCYXNlPiBiYXNlID0gY2xpZW50LT5nZXRCYXNlKCk7CisgICAgICAgICAgICAgICAgZGVhdGhOb3RpZmllcnMuZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwgW2wgPSB3cDxNZWRpYVBsYXllckJhc2U+KHApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBzdGQ6OnN0cmluZyhjbGllbnQtPmdldFNlcnZpY2VOYW1lKCkpXSgpIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8TWVkaWFQbGF5ZXJCYXNlPiBsaXN0ZW5lciA9IGwucHJvbW90ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJDb2RlYzIgc2VydmljZSBcIiVzXCIgZGllZC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlNlbmRpbmcgZGVhdGggbm90aWZpY2F0aW9uLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXItPnNlbmRFdmVudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1NFUlZFUl9ESUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQUNPREVDX1BST0NFU1NfREVBVEgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIkNvZGVjMiBzZXJ2aWNlIFwiJXNcIiBkaWVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRob3V0IGEgZGVhdGggaGFuZGxlci4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQotICAgIHNwPFNlcnZpY2VEZWF0aE5vdGlmaWVyPiBjb2RlY0RlYXRoTGlzdGVuZXIgPQotICAgICAgICAgICAgbmV3IFNlcnZpY2VEZWF0aE5vdGlmaWVyKG9teCwgcCwgTUVESUFDT0RFQ19QUk9DRVNTX0RFQVRIKTsKLSAgICBvbXgtPmxpbmtUb0RlYXRoKGNvZGVjRGVhdGhMaXN0ZW5lciwgMCk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAKLSAgICBjbGVhckRlYXRoTm90aWZpZXJzX2woKTsKLSAgICBtRXh0cmFjdG9yRGVhdGhMaXN0ZW5lciA9IGV4dHJhY3RvckRlYXRoTGlzdGVuZXI7Ci0gICAgbUNvZGVjRGVhdGhMaXN0ZW5lciA9IGNvZGVjRGVhdGhMaXN0ZW5lcjsKKyAgICBtRGVhdGhOb3RpZmllcnMuY2xlYXIoKTsKKyAgICBtRGVhdGhOb3RpZmllcnMuc3dhcChkZWF0aE5vdGlmaWVycyk7CiAgICAgbUF1ZGlvRGV2aWNlVXBkYXRlZExpc3RlbmVyID0gbmV3IEF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyKHApOwogCiAgICAgaWYgKCFwLT5oYXJkd2FyZU91dHB1dCgpKSB7CkBAIC0xNjI3LDcgKzE2MTcsNyBAQAogICAgICAgICBtQXR0cmlidXRlcyA9IChhdWRpb19hdHRyaWJ1dGVzX3QgKikgY2FsbG9jKDEsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKICAgICAgICAgaWYgKG1BdHRyaWJ1dGVzICE9IE5VTEwpIHsKICAgICAgICAgICAgIG1lbWNweShtQXR0cmlidXRlcywgYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICAgICAgbVN0cmVhbVR5cGUgPSBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKGF0dHIpOworICAgICAgICAgICAgbVN0cmVhbVR5cGUgPSBBdWRpb1N5c3RlbTo6YXR0cmlidXRlc1RvU3RyZWFtVHlwZSgqYXR0cik7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICBtQXR0cmlidXRlcyA9IE5VTEw7CkBAIC0xODE2LDcgKzE4MDYsNyBAQAogICAgICAgICAgICAgbUF0dHJpYnV0ZXMgPSAoYXVkaW9fYXR0cmlidXRlc190ICopIGNhbGxvYygxLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CiAgICAgICAgIH0KICAgICAgICAgbWVtY3B5KG1BdHRyaWJ1dGVzLCBhdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgICAgIG1TdHJlYW1UeXBlID0gYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZShhdHRyaWJ1dGVzKTsKKyAgICAgICAgbVN0cmVhbVR5cGUgPSBBdWRpb1N5c3RlbTo6YXR0cmlidXRlc1RvU3RyZWFtVHlwZSgqYXR0cmlidXRlcyk7CiAgICAgfQogfQogCkBAIC0xOTA2LDEwICsxODk2LDE2IEBACiAgICAgICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0U2FtcGxpbmdSYXRlKCZhZlNhbXBsZVJhdGUsIG1TdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgICAgIH0KKyAgICAgICAgaWYgKGFmU2FtcGxlUmF0ZSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQogICAgICAgICBjb25zdCBzaXplX3QgZnJhbWVzUGVyQnVmZmVyID0KICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXNhbXBsZVJhdGUgKiBhZkZyYW1lQ291bnQgLyBhZlNhbXBsZVJhdGU7CiAKICAgICAgICAgaWYgKGJ1ZmZlckNvdW50ID09IDApIHsKKyAgICAgICAgICAgIGlmIChmcmFtZXNQZXJCdWZmZXIgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gdXNlIHN1Z2dlc3RlZEZyYW1lQ291bnQKICAgICAgICAgICAgIGJ1ZmZlckNvdW50ID0gKHN1Z2dlc3RlZEZyYW1lQ291bnQgKyBmcmFtZXNQZXJCdWZmZXIgLSAxKSAvIGZyYW1lc1BlckJ1ZmZlcjsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCmluZGV4IGJmYjdjYzIuLjQ5Njg4Y2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKQEAgLTMwLDggKzMwLDYgQEAKICNpbmNsdWRlIDxtZWRpYS9NZXRhZGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Lmg+Ci0KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtMzksMTAgKzM3LDEwIEBACiBzdHJ1Y3QgQXVkaW9QbGF5YmFja1JhdGU7CiBjbGFzcyBBdWRpb1RyYWNrOwogc3RydWN0IEFWU3luY1NldHRpbmdzOworY2xhc3MgRGVhdGhOb3RpZmllcjsKIGNsYXNzIElEYXRhU291cmNlOwogY2xhc3MgSU1lZGlhUmVjb3JkZXI7CiBjbGFzcyBJTWVkaWFNZXRhZGF0YVJldHJpZXZlcjsKLWNsYXNzIElPTVg7CiBjbGFzcyBJUmVtb3RlRGlzcGxheTsKIGNsYXNzIElSZW1vdGVEaXNwbGF5Q2xpZW50OwogY2xhc3MgTWVkaWFSZWNvcmRlckNsaWVudDsKQEAgLTcwLDcgKzY4LDYgQEAKIGNsYXNzIE1lZGlhUGxheWVyU2VydmljZSA6IHB1YmxpYyBCbk1lZGlhUGxheWVyU2VydmljZQogewogICAgIGNsYXNzIENsaWVudDsKLSAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA6OklPbXggSU9teDsKIAogICAgIGNsYXNzIEF1ZGlvT3V0cHV0IDogcHVibGljIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rCiAgICAgewpAQCAtMzkwLDMzICszODcsNiBAQAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKTsKIAogICAgIHByaXZhdGU6Ci0gICAgICAgIGNsYXNzIFNlcnZpY2VEZWF0aE5vdGlmaWVyOgotICAgICAgICAgICAgICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCwKLSAgICAgICAgICAgICAgICBwdWJsaWMgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQKLSAgICAgICAgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBTZXJ2aWNlRGVhdGhOb3RpZmllcigKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUJpbmRlcj4mIHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZT4mIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICBpbnQgd2hpY2gpOwotICAgICAgICAgICAgU2VydmljZURlYXRoTm90aWZpZXIoCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElPbXg+JiBvbXgsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZT4mIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICBpbnQgd2hpY2gpOwotICAgICAgICAgICAgdmlydHVhbCB+U2VydmljZURlYXRoTm90aWZpZXIoKTsKLSAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOwotICAgICAgICAgICAgdmlydHVhbCB2b2lkIHNlcnZpY2VEaWVkKAotICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBjb29raWUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwPDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U+JiB3aG8pOwotICAgICAgICAgICAgdm9pZCB1bmxpbmtUb0RlYXRoKCk7Ci0KLSAgICAgICAgcHJpdmF0ZToKLSAgICAgICAgICAgIGludCBtV2hpY2g7Ci0gICAgICAgICAgICBzcDxJQmluZGVyPiBtU2VydmljZTsKLSAgICAgICAgICAgIHNwPElPbXg+IG1PbXg7Ci0gICAgICAgICAgICB3cDxNZWRpYVBsYXllckJhc2U+IG1MaXN0ZW5lcjsKLSAgICAgICAgfTsKLQogICAgICAgICBjbGFzcyBBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcjogcHVibGljIEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrCiAgICAgICAgIHsKICAgICAgICAgcHVibGljOgpAQCAtNDMyLDggKzQwMiw2IEBACiAgICAgICAgICAgICB3cDxNZWRpYVBsYXllckJhc2U+IG1MaXN0ZW5lcjsKICAgICAgICAgfTsKIAotICAgICAgICB2b2lkIGNsZWFyRGVhdGhOb3RpZmllcnNfbCgpOwotCiAgICAgICAgIGZyaWVuZCBjbGFzcyBNZWRpYVBsYXllclNlcnZpY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudCggY29uc3Qgc3A8TWVkaWFQbGF5ZXJTZXJ2aWNlPiYgc2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCkBAIC01MDgsOCArNDc2LDcgQEAKICAgICAgICAgLy8gZ2V0TWV0YWRhdGEgY2xlYXJzIHRoaXMgc2V0LgogICAgICAgICBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciBtTWV0YWRhdGFVcGRhdGVkOyAgLy8gcHJvdGVjdGVkIGJ5IG1Mb2NrCiAKLSAgICAgICAgc3A8U2VydmljZURlYXRoTm90aWZpZXI+IG1FeHRyYWN0b3JEZWF0aExpc3RlbmVyOwotICAgICAgICBzcDxTZXJ2aWNlRGVhdGhOb3RpZmllcj4gbUNvZGVjRGVhdGhMaXN0ZW5lcjsKKyAgICAgICAgc3RkOjp2ZWN0b3I8RGVhdGhOb3RpZmllcj4gbURlYXRoTm90aWZpZXJzOwogICAgICAgICBzcDxBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcj4gbUF1ZGlvRGV2aWNlVXBkYXRlZExpc3RlbmVyOwogI2lmIENBTExCQUNLX0FOVEFHT05JWkVSCiAgICAgICAgICAgICAgICAgICAgIEFudGFnb25pemVyKiAgICAgICAgICAgICAgICAgIG1BbnRhZ29uaXplcjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcAppbmRleCA0MjA2NjQ3Li43MDNkYTRiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCkBAIC0xOCwyNyArMTgsMjggQEAKICNkZWZpbmUgTE9HX1RBRyAiTWVkaWFSZWNvcmRlclNlcnZpY2UiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGRpcmVudC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPiAvLyBmb3IgcHJvcGVydHlfZ2V0CisjaW5jbHVkZSAiTWVkaWFSZWNvcmRlckNsaWVudC5oIgorI2luY2x1ZGUgIk1lZGlhUGxheWVyU2VydmljZS5oIgorI2luY2x1ZGUgIlN0YWdlZnJpZ2h0UmVjb3JkZXIuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudFN0b3JlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlCYXNlLmg+Ci0KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKyNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4gLy8gZm9yIHByb3BlcnR5X2dldAorI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0KLSNpbmNsdWRlICJNZWRpYVJlY29yZGVyQ2xpZW50LmgiCi0jaW5jbHVkZSAiTWVkaWFQbGF5ZXJTZXJ2aWNlLmgiCi0KLSNpbmNsdWRlICJTdGFnZWZyaWdodFJlY29yZGVyLmgiCi0jaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zMzksNyArMzQwLDcgQEAKICAgICAgICAgd3A8TWVkaWFSZWNvcmRlckNsaWVudD4gY2xpZW50KHRoaXMpOwogICAgICAgICBtTWVkaWFQbGF5ZXJTZXJ2aWNlLT5yZW1vdmVNZWRpYVJlY29yZGVyQ2xpZW50KGNsaWVudCk7CiAgICAgfQotICAgIGNsZWFyRGVhdGhOb3RpZmllcnNfbCgpOworICAgIG1EZWF0aE5vdGlmaWVycy5jbGVhcigpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtMzU4LDU5ICszNTksNiBAQAogICAgIHJlbGVhc2UoKTsKIH0KIAotTWVkaWFSZWNvcmRlckNsaWVudDo6U2VydmljZURlYXRoTm90aWZpZXI6OlNlcnZpY2VEZWF0aE5vdGlmaWVyKAotICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgc2VydmljZSwKLSAgICAgICAgY29uc3Qgc3A8SU1lZGlhUmVjb3JkZXJDbGllbnQ+JiBsaXN0ZW5lciwKLSAgICAgICAgaW50IHdoaWNoKSB7Ci0gICAgbVNlcnZpY2UgPSBzZXJ2aWNlOwotICAgIG1PbXggPSBudWxscHRyOwotICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgIG1XaGljaCA9IHdoaWNoOwotfQotCi1NZWRpYVJlY29yZGVyQ2xpZW50OjpTZXJ2aWNlRGVhdGhOb3RpZmllcjo6U2VydmljZURlYXRoTm90aWZpZXIoCi0gICAgICAgIGNvbnN0IHNwPElPbXg+JiBvbXgsCi0gICAgICAgIGNvbnN0IHNwPElNZWRpYVJlY29yZGVyQ2xpZW50PiYgbGlzdGVuZXIsCi0gICAgICAgIGludCB3aGljaCkgewotICAgIG1TZXJ2aWNlID0gbnVsbHB0cjsKLSAgICBtT214ID0gb214OwotICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgIG1XaGljaCA9IHdoaWNoOwotfQotCi1NZWRpYVJlY29yZGVyQ2xpZW50OjpTZXJ2aWNlRGVhdGhOb3RpZmllcjo6flNlcnZpY2VEZWF0aE5vdGlmaWVyKCkgewotfQotCi12b2lkIE1lZGlhUmVjb3JkZXJDbGllbnQ6OlNlcnZpY2VEZWF0aE5vdGlmaWVyOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiAvKndobyovKSB7Ci0gICAgc3A8SU1lZGlhUmVjb3JkZXJDbGllbnQ+IGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKLSAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICBsaXN0ZW5lci0+bm90aWZ5KE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9TRVJWRVJfRElFRCwgbVdoaWNoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygibGlzdGVuZXIgZm9yIHByb2Nlc3MgJWQgZGVhdGggaXMgZ29uZSIsIG1XaGljaCk7Ci0gICAgfQotfQotCi12b2lkIE1lZGlhUmVjb3JkZXJDbGllbnQ6OlNlcnZpY2VEZWF0aE5vdGlmaWVyOjpzZXJ2aWNlRGllZCgKLSAgICAgICAgdWludDY0X3QgLyogY29va2llICovLAotICAgICAgICBjb25zdCB3cDw6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgLyogd2hvICovKSB7Ci0gICAgc3A8SU1lZGlhUmVjb3JkZXJDbGllbnQ+IGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKLSAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICBsaXN0ZW5lci0+bm90aWZ5KE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9TRVJWRVJfRElFRCwgbVdoaWNoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygibGlzdGVuZXIgZm9yIHByb2Nlc3MgJWQgZGVhdGggaXMgZ29uZSIsIG1XaGljaCk7Ci0gICAgfQotfQotCi12b2lkIE1lZGlhUmVjb3JkZXJDbGllbnQ6OlNlcnZpY2VEZWF0aE5vdGlmaWVyOjp1bmxpbmtUb0RlYXRoKCkgewotICAgIGlmIChtU2VydmljZSAhPSBudWxscHRyKSB7Ci0gICAgICAgIG1TZXJ2aWNlLT51bmxpbmtUb0RlYXRoKHRoaXMpOwotICAgICAgICBtU2VydmljZSA9IG51bGxwdHI7Ci0gICAgfSBlbHNlIGlmIChtT214ICE9IG51bGxwdHIpIHsKLSAgICAgICAgbU9teC0+dW5saW5rVG9EZWF0aCh0aGlzKTsKLSAgICAgICAgbU9teCA9IG51bGxwdHI7Ci0gICAgfQotfQotCiBNZWRpYVJlY29yZGVyQ2xpZW50OjpBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcjo6QXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXIoCiAgICAgICAgIGNvbnN0IHNwPElNZWRpYVJlY29yZGVyQ2xpZW50PiYgbGlzdGVuZXIpIHsKICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKQEAgLTQzMCwyMiArMzc4LDExIEBACiAgICAgfQogfQogCi12b2lkIE1lZGlhUmVjb3JkZXJDbGllbnQ6OmNsZWFyRGVhdGhOb3RpZmllcnNfbCgpIHsKLSAgICBpZiAobUNhbWVyYURlYXRoTGlzdGVuZXIgIT0gbnVsbHB0cikgewotICAgICAgICBtQ2FtZXJhRGVhdGhMaXN0ZW5lci0+dW5saW5rVG9EZWF0aCgpOwotICAgICAgICBtQ2FtZXJhRGVhdGhMaXN0ZW5lciA9IG51bGxwdHI7Ci0gICAgfQotICAgIGlmIChtQ29kZWNEZWF0aExpc3RlbmVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgbUNvZGVjRGVhdGhMaXN0ZW5lci0+dW5saW5rVG9EZWF0aCgpOwotICAgICAgICBtQ29kZWNEZWF0aExpc3RlbmVyID0gbnVsbHB0cjsKLSAgICB9Ci19Ci0KIHN0YXR1c190IE1lZGlhUmVjb3JkZXJDbGllbnQ6OnNldExpc3RlbmVyKGNvbnN0IHNwPElNZWRpYVJlY29yZGVyQ2xpZW50PiYgbGlzdGVuZXIpCiB7CiAgICAgQUxPR1YoInNldExpc3RlbmVyIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGNsZWFyRGVhdGhOb3RpZmllcnNfbCgpOworICAgIG1EZWF0aE5vdGlmaWVycy5jbGVhcigpOwogICAgIGlmIChtUmVjb3JkZXIgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgicmVjb3JkZXIgaXMgbm90IGluaXRpYWxpemVkIik7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpAQCAtNDYzLDIwICs0MDAsNzMgQEAKICAgICAvLyBJZiB0aGUgZGV2aWNlIGRvZXMgbm90IGhhdmUgYSBjYW1lcmEsIGRvIG5vdCBjcmVhdGUgYSBkZWF0aCBsaXN0ZW5lciBmb3IgaXQuCiAgICAgaWYgKGJpbmRlciAhPSBOVUxMKSB7CiAgICAgICAgIHNDYW1lcmFWZXJpZmllZCA9IHRydWU7Ci0gICAgICAgIG1DYW1lcmFEZWF0aExpc3RlbmVyID0gbmV3IFNlcnZpY2VEZWF0aE5vdGlmaWVyKGJpbmRlciwgbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDQU1FUkFfUFJPQ0VTU19ERUFUSCk7Ci0gICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgobUNhbWVyYURlYXRoTGlzdGVuZXIpOworICAgICAgICBtRGVhdGhOb3RpZmllcnMuZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgICAgIGJpbmRlciwgW2wgPSB3cDxJTWVkaWFSZWNvcmRlckNsaWVudD4obGlzdGVuZXIpXSgpeworICAgICAgICAgICAgc3A8SU1lZGlhUmVjb3JkZXJDbGllbnQ+IGxpc3RlbmVyID0gbC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigibWVkaWEuY2FtZXJhIHNlcnZpY2UgZGllZC4gIgorICAgICAgICAgICAgICAgICAgICAgICJTZW5kaW5nIGRlYXRoIG5vdGlmaWNhdGlvbi4iKTsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci0+bm90aWZ5KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1NFUlZFUl9ESUVELAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDQU1FUkFfUFJPQ0VTU19ERUFUSCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJtZWRpYS5jYW1lcmEgc2VydmljZSBkaWVkIHdpdGhvdXQgYSBkZWF0aCBoYW5kbGVyLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKICAgICB9CiAgICAgc0NhbWVyYUNoZWNrZWQgPSB0cnVlOwogCi0gICAgc3A8SU9teD4gb214ID0gSU9teDo6Z2V0U2VydmljZSgpOwotICAgIGlmIChvbXggPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiSU9teCBzZXJ2aWNlIGlzIG5vdCBhdmFpbGFibGUiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgeworICAgICAgICB1c2luZyA6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlOworCisgICAgICAgIC8vIExpc3RlbiB0byBPTVgncyBJT214U3RvcmUvZGVmYXVsdAorICAgICAgICB7CisgICAgICAgICAgICBzcDxJQmFzZT4gYmFzZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA6OgorICAgICAgICAgICAgICAgICAgICBJT214OjpnZXRTZXJ2aWNlKCk7CisgICAgICAgICAgICBpZiAoYmFzZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIk9NWCBzZXJ2aWNlIGlzIG5vdCBhdmFpbGFibGUiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbURlYXRoTm90aWZpZXJzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsIFtsID0gd3A8SU1lZGlhUmVjb3JkZXJDbGllbnQ+KGxpc3RlbmVyKV0oKXsKKyAgICAgICAgICAgICAgICAgICAgc3A8SU1lZGlhUmVjb3JkZXJDbGllbnQ+IGxpc3RlbmVyID0gbC5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcikgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIk9NWCBzZXJ2aWNlIGRpZWQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZW5kaW5nIGRlYXRoIG5vdGlmaWNhdGlvbi4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5ub3RpZnkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9TRVJWRVJfRElFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpNRURJQUNPREVDX1BST0NFU1NfREVBVEgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIk9NWCBzZXJ2aWNlIGRpZWQgd2l0aG91dCBhIGRlYXRoIGhhbmRsZXIuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIExpc3RlbiB0byBDb2RlYzIncyBJQ29tcG9uZW50U3RvcmUgaW5zdGFuY2VzCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gY29uc3QmIGNsaWVudCA6CisgICAgICAgICAgICAgICAgICAgIENvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbUFsbFNlcnZpY2VzKCkpIHsKKyAgICAgICAgICAgICAgICBzcDxJQmFzZT4gYmFzZSA9IGNsaWVudC0+Z2V0QmFzZSgpOworICAgICAgICAgICAgICAgIG1EZWF0aE5vdGlmaWVycy5lbXBsYWNlX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLCBbbCA9IHdwPElNZWRpYVJlY29yZGVyQ2xpZW50PihsaXN0ZW5lciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHN0ZDo6c3RyaW5nKGNsaWVudC0+Z2V0U2VydmljZU5hbWUoKSldKCkgeworICAgICAgICAgICAgICAgICAgICBzcDxJTWVkaWFSZWNvcmRlckNsaWVudD4gbGlzdGVuZXIgPSBsLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiQ29kZWMyIHNlcnZpY2UgXCIlc1wiIGRpZWQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZW5kaW5nIGRlYXRoIG5vdGlmaWNhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXItPm5vdGlmeSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1NFUlZFUl9ESUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllclNlcnZpY2U6Ok1FRElBQ09ERUNfUFJPQ0VTU19ERUFUSCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiQ29kZWMyIHNlcnZpY2UgXCIlc1wiIGRpZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGhvdXQgYSBkZWF0aCBoYW5kbGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KLSAgICBtQ29kZWNEZWF0aExpc3RlbmVyID0gbmV3IFNlcnZpY2VEZWF0aE5vdGlmaWVyKG9teCwgbGlzdGVuZXIsCi0gICAgICAgICAgICBNZWRpYVBsYXllclNlcnZpY2U6Ok1FRElBQ09ERUNfUFJPQ0VTU19ERUFUSCk7Ci0gICAgb214LT5saW5rVG9EZWF0aChtQ29kZWNEZWF0aExpc3RlbmVyLCAwKTsKIAogICAgIG1BdWRpb0RldmljZVVwZGF0ZWROb3RpZmllciA9IG5ldyBBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcihsaXN0ZW5lcik7CiAgICAgbVJlY29yZGVyLT5zZXRBdWRpb0RldmljZUNhbGxiYWNrKG1BdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcik7CkBAIC01MzcsNCArNTI3LDMwIEBACiAgICAgfQogICAgIHJldHVybiBOT19JTklUOwogfQorCitzdGF0dXNfdCBNZWRpYVJlY29yZGVyQ2xpZW50OjpzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKAorICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIHsKKyAgICBBTE9HVigic2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbiglZCkiLCBkaXJlY3Rpb24pOworICAgIGlmIChtUmVjb3JkZXIgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gbVJlY29yZGVyLT5zZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGRpcmVjdGlvbik7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCitzdGF0dXNfdCBNZWRpYVJlY29yZGVyQ2xpZW50OjpzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkgeworICAgIEFMT0dWKCJzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oJWYpIiwgem9vbSk7CisgICAgaWYgKG1SZWNvcmRlciAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBtUmVjb3JkZXItPnNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbih6b29tKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKK3N0YXR1c190IE1lZGlhUmVjb3JkZXJDbGllbnQ6OmdldFBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpIHsKKyAgICBBTE9HVigiZ2V0UG9ydElkIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtUmVjb3JkZXIgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gbVJlY29yZGVyLT5nZXRQb3J0SWQocG9ydElkKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmgKaW5kZXggZDJlNjgxZi4uOWUwZjg3NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oCkBAIC0xOCwxMCArMTgsMTIgQEAKICNpZm5kZWYgQU5EUk9JRF9NRURJQVJFQ09SREVSQ0xJRU5UX0gKICNkZWZpbmUgQU5EUk9JRF9NRURJQVJFQ09SREVSQ0xJRU5UX0gKIAorI2luY2x1ZGUgIkRlYXRoTm90aWZpZXIuaCIKKwogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUmVjb3JkZXIuaD4KIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Lmg+CisjaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTMxLDM0ICszMyw2IEBACiAKIGNsYXNzIE1lZGlhUmVjb3JkZXJDbGllbnQgOiBwdWJsaWMgQm5NZWRpYVJlY29yZGVyCiB7Ci0gICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjpJT214IElPbXg7Ci0KLSAgICBjbGFzcyBTZXJ2aWNlRGVhdGhOb3RpZmllciA6Ci0gICAgICAgICAgICBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQsCi0gICAgICAgICAgICBwdWJsaWMgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQKLSAgICB7Ci0gICAgcHVibGljOgotICAgICAgICBTZXJ2aWNlRGVhdGhOb3RpZmllcigKLSAgICAgICAgICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgc2VydmljZSwKLSAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFSZWNvcmRlckNsaWVudD4mIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgIGludCB3aGljaCk7Ci0gICAgICAgIFNlcnZpY2VEZWF0aE5vdGlmaWVyKAotICAgICAgICAgICAgICAgIGNvbnN0IHNwPElPbXg+JiBvbXgsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhUmVjb3JkZXJDbGllbnQ+JiBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICBpbnQgd2hpY2gpOwotICAgICAgICB2aXJ0dWFsIH5TZXJ2aWNlRGVhdGhOb3RpZmllcigpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIHNlcnZpY2VEaWVkKAotICAgICAgICAgICAgICAgIHVpbnQ2NF90IGNvb2tpZSwKLSAgICAgICAgICAgICAgICBjb25zdCB3cDw6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgd2hvKTsKLSAgICAgICAgdm9pZCB1bmxpbmtUb0RlYXRoKCk7Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgaW50IG1XaGljaDsKLSAgICAgICAgc3A8SUJpbmRlcj4gbVNlcnZpY2U7Ci0gICAgICAgIHNwPElPbXg+IG1PbXg7Ci0gICAgICAgIHdwPElNZWRpYVJlY29yZGVyQ2xpZW50PiBtTGlzdGVuZXI7Ci0gICAgfTsKLQogICAgIGNsYXNzIEF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyOiBwdWJsaWMgQXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2sKICAgICB7CiAgICAgcHVibGljOgpAQCAtNzEsOCArNDUsNiBAQAogICAgICAgICB3cDxJTWVkaWFSZWNvcmRlckNsaWVudD4gbUxpc3RlbmVyOwogICAgIH07CiAKLSAgICB2b2lkIGNsZWFyRGVhdGhOb3RpZmllcnNfbCgpOwotCiBwdWJsaWM6CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICBzZXRDYW1lcmEoY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmE+JiBjYW1lcmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQ2FtZXJhUmVjb3JkaW5nUHJveHk+JiBwcm94eSk7CkBAIC0xMDksNiArODEsOSBAQAogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgZ2V0QWN0aXZlTWljcm9waG9uZXMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcyk7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKTsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgIHNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgIGdldFBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpIG92ZXJyaWRlOwogCiBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyAgICAgICAgICAgTWVkaWFQbGF5ZXJTZXJ2aWNlOyAgLy8gZm9yIGFjY2Vzc2luZyBwcml2YXRlIGNvbnN0cnVjdG9yCkBAIC0xMTksOCArOTQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgfk1lZGlhUmVjb3JkZXJDbGllbnQoKTsKIAotICAgIHNwPFNlcnZpY2VEZWF0aE5vdGlmaWVyPiBtQ2FtZXJhRGVhdGhMaXN0ZW5lcjsKLSAgICBzcDxTZXJ2aWNlRGVhdGhOb3RpZmllcj4gbUNvZGVjRGVhdGhMaXN0ZW5lcjsKKyAgICBzdGQ6OnZlY3RvcjxEZWF0aE5vdGlmaWVyPiBtRGVhdGhOb3RpZmllcnM7CiAgICAgc3A8QXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXI+IG1BdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcjsKIAogICAgIHBpZF90ICAgICAgICAgICAgICAgICAgbVBpZDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcAppbmRleCAzMGMwYjFjLi42MzY4MWZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCkBAIC0yNCw2ICsyNCw3IEBACiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYS5oPgogCiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CkBAIC00Niw2ICs0Nyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT2dnV3JpdGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUGVyc2lzdGVudFN1cmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVByb2ZpbGVzLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVBhcmFtZXRlcnMuaD4KQEAgLTExNiw3ICsxMTgsOSBAQAogICAgICAgbVZpZGVvU291cmNlKFZJREVPX1NPVVJDRV9MSVNUX0VORCksCiAgICAgICBtU3RhcnRlZChmYWxzZSksCiAgICAgICBtU2VsZWN0ZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwKLSAgICAgIG1EZXZpY2VDYWxsYmFja0VuYWJsZWQoZmFsc2UpIHsKKyAgICAgIG1EZXZpY2VDYWxsYmFja0VuYWJsZWQoZmFsc2UpLAorICAgICAgbVNlbGVjdGVkTWljRGlyZWN0aW9uKE1JQ19ESVJFQ1RJT05fVU5TUEVDSUZJRUQpLAorICAgICAgbVNlbGVjdGVkTWljRmllbGREaW1lbnNpb24oTUlDX0ZJRUxEX0RJTUVOU0lPTl9OT1JNQUwpIHsKIAogICAgIEFMT0dWKCJDb25zdHJ1Y3RvciIpOwogCkBAIC0xNjAsOSArMTY0LDEyIEBACiAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtSZWNvcmRlclZpZGVvSWZyYW1lSW50ZXJ2YWwsIG1JRnJhbWVzSW50ZXJ2YWxTZWMpOwogICAgIC8vIFRCRCBtQXVkaW9Tb3VyY2VOb2RlID0gMDsKICAgICAvLyBUQkQgbVVzZTY0Qml0RmlsZU9mZnNldCA9IGZhbHNlOwotICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUmVjb3JkZXJNb3ZpZVRpbWVzY2FsZSwgbU1vdmllVGltZVNjYWxlKTsKLSAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1JlY29yZGVyQXVkaW9UaW1lc2NhbGUsIG1BdWRpb1RpbWVTY2FsZSk7Ci0gICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtSZWNvcmRlclZpZGVvVGltZXNjYWxlLCBtVmlkZW9UaW1lU2NhbGUpOworICAgIGlmIChtTW92aWVUaW1lU2NhbGUgIT0gLTEpCisgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUmVjb3JkZXJNb3ZpZVRpbWVzY2FsZSwgbU1vdmllVGltZVNjYWxlKTsKKyAgICBpZiAobUF1ZGlvVGltZVNjYWxlICE9IC0xKQorICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1JlY29yZGVyQXVkaW9UaW1lc2NhbGUsIG1BdWRpb1RpbWVTY2FsZSk7CisgICAgaWYgKG1WaWRlb1RpbWVTY2FsZSAhPSAtMSkKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtSZWNvcmRlclZpZGVvVGltZXNjYWxlLCBtVmlkZW9UaW1lU2NhbGUpOwogICAgIC8vIFRCRCBtQ2FtZXJhSWQgICAgICAgID0gMDsKICAgICAvLyBUQkQgbVN0YXJ0VGltZU9mZnNldE1zID0gLTE7CiAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtSZWNvcmRlclZpZGVvUHJvZmlsZSwgbVZpZGVvRW5jb2RlclByb2ZpbGUpOwpAQCAtMjAxLDcgKzIwOCw3IEBACiAgICAgfQogICAgIG1BbmFseXRpY3NEaXJ0eSA9IGZhbHNlOwogICAgIGlmIChyZWluaXRpYWxpemUpIHsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtKGtLZXlSZWNvcmRlcik7CisgICAgICAgIG1BbmFseXRpY3NJdGVtID0gTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoa0tleVJlY29yZGVyKTsKICAgICB9CiB9CiAKQEAgLTM5NiwxNCArNDAzLDE1IEBACiAgICAgICAgIHJldHVybiAtRUJBREY7CiAgICAgfQogCi0gICAgLy8gc3RhcnQgd2l0aCBhIGNsZWFuLCBlbXB0eSBmaWxlCi0gICAgZnRydW5jYXRlKGZkLCAwKTsKLSAgICBpbnQgbmV4dEZkID0gZHVwKGZkKTsKLSAgICBpZiAobVdyaXRlciA9PSBOVUxMKSB7CisgICAgaWYgKG1Xcml0ZXIgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgic2V0TmV4dE91dHB1dEZpbGUgZmFpbGVkLiBXcml0ZXIgaGFzIGJlZW4gZnJlZWQiKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICByZXR1cm4gbVdyaXRlci0+c2V0TmV4dEZkKG5leHRGZCk7CisKKyAgICAvLyBzdGFydCB3aXRoIGEgY2xlYW4sIGVtcHR5IGZpbGUKKyAgICBmdHJ1bmNhdGUoZmQsIDApOworCisgICAgcmV0dXJuIG1Xcml0ZXItPnNldE5leHRGZChmZCk7CiB9CiAKIC8vIEF0dGVtcHQgdG8gcGFyc2UgYW4gZmxvYXQgbGl0ZXJhbCBvcHRpb25hbGx5IHN1cnJvdW5kZWQgYnkgd2hpdGVzcGFjZSwKQEAgLTk0OCw2ICs5NTYsMTAgQEAKICAgICAgICAgICAgIHN0YXR1cyA9IHNldHVwTVBFRzJUU1JlY29yZGluZygpOwogICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX09HRzoKKyAgICAgICAgICAgIHN0YXR1cyA9IHNldHVwT2dnUmVjb3JkaW5nKCk7CisgICAgICAgICAgICBicmVhazsKKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIG91dHB1dCBmaWxlIGZvcm1hdDogJWQiLCBtT3V0cHV0Rm9ybWF0KTsKICAgICAgICAgICAgIHN0YXR1cyA9IFVOS05PV05fRVJST1I7CkBAIC0xMDEzLDYgKzEwMjUsNyBAQAogICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfQUFDX0FEVFM6CiAgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9SVFBfQVZQOgogICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfTVBFRzJUUzoKKyAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX09HRzoKICAgICAgICAgewogICAgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7CiAgICAgICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gc3lzdGVtVGltZSgpIC8gMTAwMDsKQEAgLTEwODMsNyArMTA5Niw5IEBACiAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgbUNsaWVudFVpZCwKICAgICAgICAgICAgICAgICBtQ2xpZW50UGlkLAotICAgICAgICAgICAgICAgIG1TZWxlY3RlZERldmljZUlkKTsKKyAgICAgICAgICAgICAgICBtU2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgICAgICBtU2VsZWN0ZWRNaWNEaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgbVNlbGVjdGVkTWljRmllbGREaW1lbnNpb24pOwogCiAgICAgc3RhdHVzX3QgZXJyID0gYXVkaW9Tb3VyY2UtPmluaXRDaGVjaygpOwogCkBAIC0xMTEzLDYgKzExMjgsOSBAQAogICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOwogICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiYWFjLXByb2ZpbGUiLCBPTVhfQVVESU9fQUFDT2JqZWN0RUxEKTsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfT1BVUzoKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUyk7CisgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR0UoIlVua25vd24gYXVkaW8gZW5jb2RlcjogJWQiLCBtQXVkaW9FbmNvZGVyKTsKQEAgLTExNjksNiArMTE4NywxMyBAQAogICAgIHJldHVybiBzZXR1cFJhd0F1ZGlvUmVjb3JkaW5nKCk7CiB9CiAKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldHVwT2dnUmVjb3JkaW5nKCkgeworICAgIENIRUNLX0VRKG1PdXRwdXRGb3JtYXQsIE9VVFBVVF9GT1JNQVRfT0dHKTsKKworICAgIG1Xcml0ZXIgPSBuZXcgT2dnV3JpdGVyKG1PdXRwdXRGZCk7CisgICAgcmV0dXJuIHNldHVwUmF3QXVkaW9SZWNvcmRpbmcoKTsKK30KKwogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBBTVJSZWNvcmRpbmcoKSB7CiAgICAgQ0hFQ0sobU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX0FNUl9OQiB8fAogICAgICAgICAgIG1PdXRwdXRGb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9BTVJfV0IpOwpAQCAtMTc0NSwxMyArMTc3MCwyNiBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gRW5hYmxlIHRlbXBvcmFsIGxheWVyaW5nIGlmIHRoZSBleHBlY3RlZCAobWF4KSBwbGF5YmFjayBmcmFtZSByYXRlIGlzIGdyZWF0ZXIgdGhhbiB+MTElIG9mCisgICAgLy8gdGhlIG1pbmltdW0gZGlzcGxheSByZWZyZXNoIHJhdGUgb24gYSB0eXBpY2FsIGRldmljZS4gQWRkIGxheWVycyB1bnRpbCB0aGUgYmFzZSBsYXllciBmYWxscworICAgIC8vIHVuZGVyIHRoaXMgbGltaXQuIEFsbG93IGRldmljZSBtYW51ZmFjdHVyZXJzIHRvIG92ZXJyaWRlIHRoaXMgbGltaXQuCisKKyAgICAvLyBUT0RPOiBtYWtlIHRoaXMgY29uZmlndXJhYmxlIGJ5IHRoZSBhcHBsaWNhdGlvbgorICAgIHN0ZDo6c3RyaW5nIG1heEJhc2VMYXllckZwc1Byb3BlcnR5ID0KKyAgICAgICAgOjphbmRyb2lkOjpiYXNlOjpHZXRQcm9wZXJ0eSgicm8ubWVkaWEucmVjb3JkZXItbWF4LWJhc2UtbGF5ZXItZnBzIiwgIiIpOworICAgIGZsb2F0IG1heEJhc2VMYXllckZwcyA9IChmbG9hdCk6OmF0b2YobWF4QmFzZUxheWVyRnBzUHJvcGVydHkuY19zdHIoKSk7CisgICAgLy8gVFJJQ0tZOiB1c2UgIT4gdG8gZml4IHVwIGFueSBOYU4gdmFsdWVzCisgICAgaWYgKCEobWF4QmFzZUxheWVyRnBzID49IGtNaW5UeXBpY2FsRGlzcGxheVJlZnJlc2hpbmdSYXRlIC8gMC45KSkgeworICAgICAgICBtYXhCYXNlTGF5ZXJGcHMgPSBrTWluVHlwaWNhbERpc3BsYXlSZWZyZXNoaW5nUmF0ZSAvIDAuOTsKKyAgICB9CisKICAgICBmb3IgKHVpbnQzMl90IHRyeUxheWVycyA9IDE7IHRyeUxheWVycyA8PSBrTWF4TnVtVmlkZW9UZW1wb3JhbExheWVyczsgKyt0cnlMYXllcnMpIHsKICAgICAgICAgaWYgKHRyeUxheWVycyA+IHRzTGF5ZXJzKSB7CiAgICAgICAgICAgICB0c0xheWVycyA9IHRyeUxheWVyczsKICAgICAgICAgfQogICAgICAgICAvLyBrZWVwIGdvaW5nIHVudGlsIHRoZSBiYXNlIGxheWVyIGZwcyBmYWxscyBiZWxvdyB0aGUgdHlwaWNhbCBkaXNwbGF5IHJlZnJlc2ggcmF0ZQogICAgICAgICBmbG9hdCBiYXNlTGF5ZXJGcHMgPSBtYXhQbGF5YmFja0ZwcyAvICgxIDw8ICh0cnlMYXllcnMgLSAxKSk7Ci0gICAgICAgIGlmIChiYXNlTGF5ZXJGcHMgPCBrTWluVHlwaWNhbERpc3BsYXlSZWZyZXNoaW5nUmF0ZSAvIDAuOSkgeworICAgICAgICBpZiAoYmFzZUxheWVyRnBzIDwgbWF4QmFzZUxheWVyRnBzKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KQEAgLTE4MTMsNiArMTg1MSw3IEBACiAgICAgICAgIGNhc2UgQVVESU9fRU5DT0RFUl9BQUM6CiAgICAgICAgIGNhc2UgQVVESU9fRU5DT0RFUl9IRV9BQUM6CiAgICAgICAgIGNhc2UgQVVESU9fRU5DT0RFUl9BQUNfRUxEOgorICAgICAgICBjYXNlIEFVRElPX0VOQ09ERVJfT1BVUzoKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6CkBAIC0xODYzLDE5ICsxOTAyLDE4IEBACiAgICAgICAgIG1Ub3RhbEJpdFJhdGUgKz0gbVZpZGVvQml0UmF0ZTsKICAgICB9CiAKLSAgICBpZiAobU91dHB1dEZvcm1hdCAhPSBPVVRQVVRfRk9STUFUX1dFQk0pIHsKLSAgICAgICAgLy8gQXVkaW8gc291cmNlIGlzIGFkZGVkIGF0IHRoZSBlbmQgaWYgaXQgZXhpc3RzLgotICAgICAgICAvLyBUaGlzIGhlbHAgbWFrZSBzdXJlIHRoYXQgdGhlICJyZWNvZGluZyIgc291bmQgaXMgc3VwcHJlc3NlZCBmb3IKLSAgICAgICAgLy8gY2FtY29yZGVyIGFwcGxpY2F0aW9ucyBpbiB0aGUgcmVjb3JkZWQgZmlsZXMuCi0gICAgICAgIC8vIFRPRE8gQXVkaW8gc291cmNlIGlzIGN1cnJlbnRseSB1bnN1cHBvcnRlZCBmb3Igd2VibSBvdXRwdXQ7IHZvcmJpcyBlbmNvZGVyIG5lZWRlZC4KLSAgICAgICAgLy8gZGlzYWJsZSBhdWRpbyBmb3IgdGltZSBsYXBzZSByZWNvcmRpbmcKLSAgICAgICAgYm9vbCBkaXNhYmxlQXVkaW8gPSBtQ2FwdHVyZUZwc0VuYWJsZSAmJiBtQ2FwdHVyZUZwcyA8IG1GcmFtZVJhdGU7Ci0gICAgICAgIGlmICghZGlzYWJsZUF1ZGlvICYmIG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfQ05UKSB7Ci0gICAgICAgICAgICBlcnIgPSBzZXR1cEF1ZGlvRW5jb2Rlcih3cml0ZXIpOwotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKLSAgICAgICAgICAgIG1Ub3RhbEJpdFJhdGUgKz0gbUF1ZGlvQml0UmF0ZTsKLSAgICAgICAgfQorICAgIC8vIEF1ZGlvIHNvdXJjZSBpcyBhZGRlZCBhdCB0aGUgZW5kIGlmIGl0IGV4aXN0cy4KKyAgICAvLyBUaGlzIGhlbHAgbWFrZSBzdXJlIHRoYXQgdGhlICJyZWNvZGluZyIgc291bmQgaXMgc3VwcHJlc3NlZCBmb3IKKyAgICAvLyBjYW1jb3JkZXIgYXBwbGljYXRpb25zIGluIHRoZSByZWNvcmRlZCBmaWxlcy4KKyAgICAvLyBkaXNhYmxlIGF1ZGlvIGZvciB0aW1lIGxhcHNlIHJlY29yZGluZworICAgIGNvbnN0IGJvb2wgZGlzYWJsZUF1ZGlvID0gbUNhcHR1cmVGcHNFbmFibGUgJiYgbUNhcHR1cmVGcHMgPCBtRnJhbWVSYXRlOworICAgIGlmICghZGlzYWJsZUF1ZGlvICYmIG1BdWRpb1NvdXJjZSAhPSBBVURJT19TT1VSQ0VfQ05UKSB7CisgICAgICAgIGVyciA9IHNldHVwQXVkaW9FbmNvZGVyKHdyaXRlcik7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisgICAgICAgIG1Ub3RhbEJpdFJhdGUgKz0gbUF1ZGlvQml0UmF0ZTsKKyAgICB9CiAKKyAgICBpZiAobU91dHB1dEZvcm1hdCAhPSBPVVRQVVRfRk9STUFUX1dFQk0pIHsKICAgICAgICAgaWYgKG1DYXB0dXJlRnBzRW5hYmxlKSB7CiAgICAgICAgICAgICBtcDR3cml0ZXItPnNldENhcHR1cmVSYXRlKG1DYXB0dXJlRnBzKTsKICAgICAgICAgfQpAQCAtMTk5Niw3ICsyMDM0LDcgQEAKICAgICAgICAgbVRvdGFsUGF1c2VkRHVyYXRpb25VcyArPSByZXN1bWVTdGFydFRpbWVVcyAtIG1QYXVzZVN0YXJ0VGltZVVzIC0gMzAwMDA7CiAgICAgfQogICAgIGRvdWJsZSB0aW1lT2Zmc2V0ID0gLW1Ub3RhbFBhdXNlZER1cmF0aW9uVXM7Ci0gICAgaWYgKG1DYXB0dXJlRnBzRW5hYmxlKSB7CisgICAgaWYgKG1DYXB0dXJlRnBzRW5hYmxlICYmIChtVmlkZW9Tb3VyY2UgPT0gVklERU9fU09VUkNFX0NBTUVSQSkpIHsKICAgICAgICAgdGltZU9mZnNldCAqPSBtQ2FwdHVyZUZwcyAvIG1GcmFtZVJhdGU7CiAgICAgfQogICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhOwpAQCAtMjE3NSw3ICsyMjEzLDcgQEAKIH0KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6Z2V0TWV0cmljcyhQYXJjZWwgKnJlcGx5KSB7Ci0gICAgQUxPR0QoIlN0YWdlZnJpZ2h0UmVjb3JkZXI6OmdldE1ldHJpY3MiKTsKKyAgICBBTE9HVigiU3RhZ2VmcmlnaHRSZWNvcmRlcjo6Z2V0TWV0cmljcyIpOwogCiAgICAgaWYgKHJlcGx5ID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIk51bGwgcG9pbnRlciBhcmd1bWVudCIpOwpAQCAtMjIzOSw2ICsyMjc3LDMwIEBACiAgICAgcmV0dXJuIE5PX0lOSVQ7CiB9CiAKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIHsKKyAgICBBTE9HVigic2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbiglZCkiLCBkaXJlY3Rpb24pOworICAgIG1TZWxlY3RlZE1pY0RpcmVjdGlvbiA9IGRpcmVjdGlvbjsKKyAgICBpZiAobUF1ZGlvU291cmNlTm9kZSAhPSAwKSB7CisgICAgICAgIHJldHVybiBtQXVkaW9Tb3VyY2VOb2RlLT5zZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGRpcmVjdGlvbik7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkgeworICAgIEFMT0dWKCJzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oJWYpIiwgem9vbSk7CisgICAgbVNlbGVjdGVkTWljRmllbGREaW1lbnNpb24gPSB6b29tOworICAgIGlmIChtQXVkaW9Tb3VyY2VOb2RlICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1BdWRpb1NvdXJjZU5vZGUtPnNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbih6b29tKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OmdldFBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpIGNvbnN0IHsKKyAgICBpZiAobUF1ZGlvU291cmNlTm9kZSAhPSAwKSB7CisgICAgICAgIHJldHVybiBtQXVkaW9Tb3VyY2VOb2RlLT5nZXRQb3J0SWQocG9ydElkKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CiAKIHN0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OmR1bXAoCiAgICAgICAgIGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3QgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKaW5kZXggZmFhMmU1OS4uOGJmMDgzYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCkBAIC03Nyw3ICs3Nyw5IEBACiAgICAgdmlydHVhbCB2b2lkIHNldEF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjayk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcyk7Ci0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pOworICAgICAgICAgICAgc3RhdHVzX3QgZ2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgY29uc3Qgb3ZlcnJpZGU7CiAKIHByaXZhdGU6CiAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKQEAgLTE1OSw2ICsxNjEsOSBAQAogICAgIGJvb2wgbURldmljZUNhbGxiYWNrRW5hYmxlZDsKICAgICB3cDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4gbUF1ZGlvRGV2aWNlQ2FsbGJhY2s7CiAKKyAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IG1TZWxlY3RlZE1pY0RpcmVjdGlvbjsKKyAgICBmbG9hdCBtU2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbjsKKwogICAgIHN0YXRpYyBjb25zdCBpbnQga01heEhpZ2hTcGVlZEZwcyA9IDEwMDA7CiAKICAgICBzdGF0dXNfdCBwcmVwYXJlSW50ZXJuYWwoKTsKQEAgLTE2Niw2ICsxNzEsNyBAQAogICAgIHZvaWQgc2V0dXBNUEVHNG9yV0VCTU1ldGFEYXRhKHNwPE1ldGFEYXRhPiAqbWV0YSk7CiAgICAgc3RhdHVzX3Qgc2V0dXBBTVJSZWNvcmRpbmcoKTsKICAgICBzdGF0dXNfdCBzZXR1cEFBQ1JlY29yZGluZygpOworICAgIHN0YXR1c190IHNldHVwT2dnUmVjb3JkaW5nKCk7CiAgICAgc3RhdHVzX3Qgc2V0dXBSYXdBdWRpb1JlY29yZGluZygpOwogICAgIHN0YXR1c190IHNldHVwUlRQUmVjb3JkaW5nKCk7CiAgICAgc3RhdHVzX3Qgc2V0dXBNUEVHMlRTUmVjb3JkaW5nKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvaW5jbHVkZS9NZWRpYVBsYXllckludGVyZmFjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2luY2x1ZGUvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaAppbmRleCAzMTE5OTUwLi4wYWQ0ZDA0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvaW5jbHVkZS9NZWRpYVBsYXllckludGVyZmFjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9pbmNsdWRlL01lZGlhUGxheWVySW50ZXJmYWNlLmgKQEAgLTE1MSwxMyArMTUxLDEzIEBACiAKICAgICAgICAgdmlydHVhbCBtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0dXMgYXBwbHlWb2x1bWVTaGFwZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbik7Ci0gICAgICAgIHZpcnR1YWwgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdGU+IGdldFZvbHVtZVNoYXBlclN0YXRlKGludCBpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pID0gMDsKKyAgICAgICAgdmlydHVhbCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0ZT4gZ2V0Vm9sdW1lU2hhcGVyU3RhdGUoaW50IGlkKSA9IDA7CiAKICAgICAgICAgLy8gQXVkaW9Sb3V0aW5nCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldFJvdXRlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QqIGRldmljZUlkKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCkgPSAwOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKSA9IDA7CiAgICAgfTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXJCYXNlKCkge30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQuYnAKaW5kZXggNjQ1YmI3YS4uMjNhMTllNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0FuZHJvaWQuYnAKQEAgLTU0LDEzICs1NCw4IEBACiAKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbnVwbGF5ZXIiLAogCi0gICAgdGFnczogWyJlbmciXSwKLQogICAgIHNhbml0aXplOiB7CiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiAKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcAppbmRleCAyM2Q2NmJiLi41YTU4YWEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuY3BwCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFCdWZmZXJIb2xkZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CkBAIC0zOCw2ICszNyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNsb2NrLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CkBAIC02OCw3ICs2OCw3IEBACiAgICAgICBtVmlkZW9EYXRhR2VuZXJhdGlvbigwKSwKICAgICAgIG1GZXRjaFN1YnRpdGxlRGF0YUdlbmVyYXRpb24oMCksCiAgICAgICBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbigwKSwKLSAgICAgIG1EdXJhdGlvblVzKC0xbGwpLAorICAgICAgbUR1cmF0aW9uVXMoLTFMTCksCiAgICAgICBtQXVkaW9Jc1ZvcmJpcyhmYWxzZSksCiAgICAgICBtSXNTZWN1cmUoZmFsc2UpLAogICAgICAgbUlzU3RyZWFtaW5nKGZhbHNlKSwKQEAgLTc2LDcgKzc2LDcgQEAKICAgICAgIG1VSUQodWlkKSwKICAgICAgIG1NZWRpYUNsb2NrKG1lZGlhQ2xvY2spLAogICAgICAgbUZkKC0xKSwKLSAgICAgIG1CaXRyYXRlKC0xbGwpLAorICAgICAgbUJpdHJhdGUoLTFMTCksCiAgICAgICBtUGVuZGluZ1JlYWRCdWZmZXJUeXBlcygwKSB7CiAgICAgQUxPR1YoIkdlbmVyaWNTb3VyY2UiKTsKICAgICBDSEVDSyhtZWRpYUNsb2NrICE9IE5VTEwpOwpAQCAtOTQsNiArOTQsNyBAQAogICAgIG1EaXNjb25uZWN0ZWQgPSBmYWxzZTsKICAgICBtVXJpLmNsZWFyKCk7CiAgICAgbVVyaUhlYWRlcnMuY2xlYXIoKTsKKyAgICBtU291cmNlcy5jbGVhcigpOwogICAgIGlmIChtRmQgPj0gMCkgewogICAgICAgICBjbG9zZShtRmQpOwogICAgICAgICBtRmQgPSAtMTsKQEAgLTE3MSw2ICsxNzIsNyBAQAogCiAgICAgaWYgKGV4dHJhY3RvciA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJpbml0RnJvbURhdGFTb3VyY2UsIGNhbm5vdCBjcmVhdGUgZXh0cmFjdG9yISIpOworICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIApAQCAtMTc5LDYgKzE4MSw3IEBACiAgICAgc2l6ZV90IG51bXRyYWNrcyA9IGV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKICAgICBpZiAobnVtdHJhY2tzID09IDApIHsKICAgICAgICAgQUxPR0UoImluaXRGcm9tRGF0YVNvdXJjZSwgc291cmNlIGhhcyBubyB0cmFjayEiKTsKKyAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICB9CiAKQEAgLTcyNyw3ICs3MzAsNyBAQAogICAgIH0KIAogICAgIGlmIChtc2ctPndoYXQoKSA9PSBrV2hhdEZldGNoU3VidGl0bGVEYXRhKSB7Ci0gICAgICAgIHN1YlRpbWVVcyAtPSAxMDAwMDAwbGw7ICAvLyBzZW5kIHN1YnRpbGUgZGF0YSBvbmUgc2Vjb25kIGVhcmxpZXIKKyAgICAgICAgc3ViVGltZVVzIC09IDEwMDAwMDBMTDsgIC8vIHNlbmQgc3VidGlsZSBkYXRhIG9uZSBzZWNvbmQgZWFybGllcgogICAgIH0KICAgICBzcDxBTWVzc2FnZT4gbXNnMiA9IG5ldyBBTWVzc2FnZShzZW5kV2hhdCwgdGhpcyk7CiAgICAgbXNnMi0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtc2dHZW5lcmF0aW9uKTsKQEAgLTc2NCw3ICs3NjcsNyBAQAogICAgICAgICBub3RpZnktPnBvc3QoKTsKIAogICAgICAgICBpZiAobXNnLT53aGF0KCkgPT0ga1doYXRTZW5kU3VidGl0bGVEYXRhKSB7Ci0gICAgICAgICAgICBuZXh0U3ViVGltZVVzIC09IDEwMDAwMDBsbDsgIC8vIHNlbmQgc3VidGlsZSBkYXRhIG9uZSBzZWNvbmQgZWFybGllcgorICAgICAgICAgICAgbmV4dFN1YlRpbWVVcyAtPSAxMDAwMDAwTEw7ICAvLyBzZW5kIHN1YnRpbGUgZGF0YSBvbmUgc2Vjb25kIGVhcmxpZXIKICAgICAgICAgfQogICAgICAgICBtTWVkaWFDbG9jay0+YWRkVGltZXIobXNnLCBuZXh0U3ViVGltZVVzKTsKICAgICB9CkBAIC04NTUsNyArODU4LDcgQEAKICAgICAgICAgLy8gVE9ETzogbWF4UmVidWZmZXJpbmdNYXJrTXMgY291bGQgYmUgbGFyZ2VyIHRoYW4KICAgICAgICAgLy8gbUJ1ZmZlcmluZ1NldHRpbmdzLm1SZXN1bWVQbGF5YmFja01hcmtNcwogICAgICAgICBpbnQ2NF90IHJlc3RhcnRCdWZmZXJpbmdNYXJrVXMgPQotICAgICAgICAgICAgIG1CdWZmZXJpbmdTZXR0aW5ncy5tUmVzdW1lUGxheWJhY2tNYXJrTXMgKiAxMDAwbGwgLyAyOworICAgICAgICAgICAgIG1CdWZmZXJpbmdTZXR0aW5ncy5tUmVzdW1lUGxheWJhY2tNYXJrTXMgKiAxMDAwTEwgLyAyOwogICAgICAgICBpZiAoZmluYWxSZXN1bHQgPT0gT0spIHsKICAgICAgICAgICAgIGlmIChkdXJhdGlvblVzIDwgcmVzdGFydEJ1ZmZlcmluZ01hcmtVcykgewogICAgICAgICAgICAgICAgIHBvc3RSZWFkQnVmZmVyKGF1ZGlvPyBNRURJQV9UUkFDS19UWVBFX0FVRElPIDogTUVESUFfVFJBQ0tfVFlQRV9WSURFTyk7CkBAIC0xNDQ2LDcgKzE0NDksNyBAQAogICAgICAgICAvLyBUT0RPOiBtYXhSZWJ1ZmZlcmluZ01hcmtNcyBjb3VsZCBiZSBsYXJnZXIgdGhhbgogICAgICAgICAvLyBtQnVmZmVyaW5nU2V0dGluZ3MubVJlc3VtZVBsYXliYWNrTWFya01zCiAgICAgICAgIGludDY0X3QgbWFya1VzID0gKG1QcmVwYXJpbmcgPyBtQnVmZmVyaW5nU2V0dGluZ3MubUluaXRpYWxNYXJrTXMKLSAgICAgICAgICAgIDogbUJ1ZmZlcmluZ1NldHRpbmdzLm1SZXN1bWVQbGF5YmFja01hcmtNcykgKiAxMDAwbGw7CisgICAgICAgICAgICA6IG1CdWZmZXJpbmdTZXR0aW5ncy5tUmVzdW1lUGxheWJhY2tNYXJrTXMpICogMTAwMExMOwogICAgICAgICBpZiAoZmluYWxSZXN1bHQgPT0gRVJST1JfRU5EX09GX1NUUkVBTSB8fCBkdXJhdGlvblVzID49IG1hcmtVcykgewogICAgICAgICAgICAgaWYgKG1QcmVwYXJpbmcgfHwgbVNlbnRQYXVzZU9uQnVmZmVyaW5nKSB7CiAgICAgICAgICAgICAgICAgVHJhY2sgKmNvdW50ZXJUcmFjayA9CkBAIC0xNTE0LDEyICsxNTE3LDEyIEBACiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBvbGxCdWZmZXJpbmcsIHRoaXMpOwogICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb24pOwogICAgIC8vIEVucXVpcmVzIGJ1ZmZlcmluZyBzdGF0dXMgZXZlcnkgc2Vjb25kLgotICAgIG1zZy0+cG9zdCgxMDAwMDAwbGwpOworICAgIG1zZy0+cG9zdCgxMDAwMDAwTEwpOwogfQogCiB2b2lkIE51UGxheWVyOjpHZW5lcmljU291cmNlOjpvblBvbGxCdWZmZXJpbmcoKSB7CiAgICAgc3RhdHVzX3QgZmluYWxTdGF0dXMgPSBVTktOT1dOX0VSUk9SOwotICAgIGludDY0X3QgY2FjaGVkRHVyYXRpb25VcyA9IC0xbGw7CisgICAgaW50NjRfdCBjYWNoZWREdXJhdGlvblVzID0gLTFMTDsKICAgICBzc2l6ZV90IGNhY2hlZERhdGFSZW1haW5pbmcgPSAtMTsKIAogICAgIGlmIChtQ2FjaGVkU291cmNlICE9IE5VTEwpIHsKQEAgLTE1MjcsMTUgKzE1MzAsMTUgQEAKIAogICAgICAgICBpZiAoZmluYWxTdGF0dXMgPT0gT0spIHsKICAgICAgICAgICAgIG9mZjY0X3Qgc2l6ZTsKLSAgICAgICAgICAgIGludDY0X3QgYml0cmF0ZSA9IDBsbDsKKyAgICAgICAgICAgIGludDY0X3QgYml0cmF0ZSA9IDBMTDsKICAgICAgICAgICAgIGlmIChtRHVyYXRpb25VcyA+IDAgJiYgbUNhY2hlZFNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSkgPT0gT0spIHsKICAgICAgICAgICAgICAgICAvLyB8Yml0cmF0ZXwgdXNlcyBiaXRzL3NlY29uZCB1bml0LCB3aGlsZSBzaXplIGlzIG51bWJlciBvZiBieXRlcy4KLSAgICAgICAgICAgICAgICBiaXRyYXRlID0gc2l6ZSAqIDgwMDAwMDBsbCAvIG1EdXJhdGlvblVzOworICAgICAgICAgICAgICAgIGJpdHJhdGUgPSBzaXplICogODAwMDAwMExMIC8gbUR1cmF0aW9uVXM7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1CaXRyYXRlID4gMCkgewogICAgICAgICAgICAgICAgIGJpdHJhdGUgPSBtQml0cmF0ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChiaXRyYXRlID4gMCkgewotICAgICAgICAgICAgICAgIGNhY2hlZER1cmF0aW9uVXMgPSBjYWNoZWREYXRhUmVtYWluaW5nICogODAwMDAwMGxsIC8gYml0cmF0ZTsKKyAgICAgICAgICAgICAgICBjYWNoZWREdXJhdGlvblVzID0gY2FjaGVkRGF0YVJlbWFpbmluZyAqIDgwMDAwMDBMTCAvIGJpdHJhdGU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xNTQ3LDExICsxNTUwLDIxIEBACiAgICAgICAgICAgICBub3RpZnlCdWZmZXJpbmdVcGRhdGUoMTAwKTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChtUHJlcGFyaW5nKSB7CisgICAgICAgICAgICBub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoZmluYWxTdGF0dXMpOworICAgICAgICAgICAgbVByZXBhcmluZyA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKG1TZW50UGF1c2VPbkJ1ZmZlcmluZykgeworICAgICAgICAgICAgc2VuZENhY2hlU3RhdHMoKTsKKyAgICAgICAgICAgIG1TZW50UGF1c2VPbkJ1ZmZlcmluZyA9IGZhbHNlOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UmVzdW1lT25CdWZmZXJpbmdFbmQpOworICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIGlmIChjYWNoZWREdXJhdGlvblVzID49IDBsbCkgewotICAgICAgICBpZiAobUR1cmF0aW9uVXMgPiAwbGwpIHsKKyAgICBpZiAoY2FjaGVkRHVyYXRpb25VcyA+PSAwTEwpIHsKKyAgICAgICAgaWYgKG1EdXJhdGlvblVzID4gMExMKSB7CiAgICAgICAgICAgICBpbnQ2NF90IGNhY2hlZFBvc1VzID0gZ2V0TGFzdFJlYWRQb3NpdGlvbigpICsgY2FjaGVkRHVyYXRpb25VczsKICAgICAgICAgICAgIGludCBwZXJjZW50YWdlID0gMTAwLjAgKiBjYWNoZWRQb3NVcyAvIG1EdXJhdGlvblVzOwogICAgICAgICAgICAgaWYgKHBlcmNlbnRhZ2UgPiAxMDApIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvSFRUUExpdmVTb3VyY2UuY3BwCmluZGV4IDExZjFiZmQuLjc3ZTc4ODUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9IVFRQTGl2ZVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0hUVFBMaXZlU291cmNlLmNwcApAQCAtMjcxLDEwICsyNzEsMTAgQEAKIAogICAgICAgICBpZiAoZmV0Y2hUeXBlID09IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX1NVQlRJVExFUykgewogICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0gICAgICAgICAgICBtc2ctPnBvc3QoZGVsYXlVcyA+IDBsbCA/IGRlbGF5VXMgOiAwbGwpOworICAgICAgICAgICAgbXNnLT5wb3N0KGRlbGF5VXMgPiAwTEwgPyBkZWxheVVzIDogMExMKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfSBlbHNlIGlmIChmZXRjaFR5cGUgPT0gTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfTUVUQURBVEEpIHsKLSAgICAgICAgICAgIGlmIChkZWxheVVzIDwgLTEwMDAwMDBsbCkgeyAvLyAxIHNlY29uZAorICAgICAgICAgICAgaWYgKGRlbGF5VXMgPCAtMTAwMDAwMExMKSB7IC8vIDEgc2Vjb25kCiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKQEAgLTI4Niw3ICsyODYsNyBAQAogICAgIH0KIAogICAgIC8vIHRyeSBhZ2FpbiBpbiAxIHNlY29uZAotICAgIG1zZy0+cG9zdCgxMDAwMDAwbGwpOworICAgIG1zZy0+cG9zdCgxMDAwMDAwTEwpOwogfQogCiB2b2lkIE51UGxheWVyOjpIVFRQTGl2ZVNvdXJjZTo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCmluZGV4IDA3ODQ5MzkuLjMzODgwOTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcApAQCAtNjU5LDIwICs2NTksMzEgQEAKIAogICAgICAgICBjYXNlIGtXaGF0R2V0U2VsZWN0ZWRUcmFjazoKICAgICAgICAgeworICAgICAgICAgICAgaW50MzJfdCB0eXBlMzI7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigidHlwZSIsIChpbnQzMl90KikmdHlwZTMyKSk7CisgICAgICAgICAgICBtZWRpYV90cmFja190eXBlIHR5cGUgPSAobWVkaWFfdHJhY2tfdHlwZSl0eXBlMzI7CisKKyAgICAgICAgICAgIHNpemVfdCBpbmJhbmRUcmFja3MgPSAwOwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICBzc2l6ZV90IHNlbGVjdGVkVHJhY2sgPSAtMTsKICAgICAgICAgICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBlcnIgPSBPSzsKLQotICAgICAgICAgICAgICAgIGludDMyX3QgdHlwZTMyOwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ0eXBlIiwgKGludDMyX3QqKSZ0eXBlMzIpKTsKLSAgICAgICAgICAgICAgICBtZWRpYV90cmFja190eXBlIHR5cGUgPSAobWVkaWFfdHJhY2tfdHlwZSl0eXBlMzI7Ci0gICAgICAgICAgICAgICAgc3NpemVfdCBzZWxlY3RlZFRyYWNrID0gbVNvdXJjZS0+Z2V0U2VsZWN0ZWRUcmFjayh0eXBlKTsKLQotICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigicmVwbHkiLCAodm9pZCoqKSZyZXBseSkpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlbGVjdGVkVHJhY2spOworICAgICAgICAgICAgICAgIGluYmFuZFRyYWNrcyA9IG1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKKyAgICAgICAgICAgICAgICBzZWxlY3RlZFRyYWNrID0gbVNvdXJjZS0+Z2V0U2VsZWN0ZWRUcmFjayh0eXBlKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKHNlbGVjdGVkVHJhY2sgPT0gLTEgJiYgbUNDRGVjb2RlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZXJyID0gT0s7CisgICAgICAgICAgICAgICAgc2VsZWN0ZWRUcmFjayA9IG1DQ0RlY29kZXItPmdldFNlbGVjdGVkVHJhY2sodHlwZSk7CisgICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkVHJhY2sgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRUcmFjayArPSBpbmJhbmRUcmFja3M7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBQYXJjZWwqIHJlcGx5OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigicmVwbHkiLCAodm9pZCoqKSZyZXBseSkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2VsZWN0ZWRUcmFjayk7CisKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKICAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKIApAQCAtNzUwLDcgKzc2MSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtc2ctPnBvc3QoMTAwMDAwMGxsKTsgIC8vIHBvbGwgYWdhaW4gaW4gYSBzZWNvbmQuCisgICAgICAgICAgICBtc2ctPnBvc3QoMTAwMDAwMExMKTsgIC8vIHBvbGwgYWdhaW4gaW4gYSBzZWNvbmQuCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xMDM4LDcgKzEwNDksNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAocmVzY2FuKSB7Ci0gICAgICAgICAgICAgICAgbXNnLT5wb3N0KDEwMDAwMGxsKTsKKyAgICAgICAgICAgICAgICBtc2ctPnBvc3QoMTAwMDAwTEwpOwogICAgICAgICAgICAgICAgIG1TY2FuU291cmNlc1BlbmRpbmcgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CkBAIC0xODE4LDExICsxODI5LDIxIEBACiAgICAgY2xvc2VBdWRpb1NpbmsoKTsKICAgICBtUmVuZGVyZXItPmZsdXNoKHRydWUgLyogYXVkaW8gKi8sIGZhbHNlIC8qIG5vdGlmeUNvbXBsZXRlICovKTsKICAgICBpZiAobVZpZGVvRGVjb2RlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1SZW5kZXJlci0+Zmx1c2goZmFsc2UgLyogYXVkaW8gKi8sIGZhbHNlIC8qIG5vdGlmeUNvbXBsZXRlICovKTsKKyAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgbmV3IEZsdXNoRGVjb2RlckFjdGlvbihGTFVTSF9DTURfTk9ORSAvKiBhdWRpbyAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMVVNIX0NNRF9GTFVTSCAvKiB2aWRlbyAqLykpOworICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBuZXcgU2Vla0FjdGlvbihjdXJyZW50UG9zaXRpb25VcywKKyAgICAgICAgICAgICAgICBNZWRpYVBsYXllclNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMgLyogbW9kZSAqLykpOworICAgICAgICAvLyBBZnRlciBhIGZsdXNoIHdpdGhvdXQgc2h1dGRvd24sIGRlY29kZXIgaXMgcGF1c2VkLgorICAgICAgICAvLyBEb24ndCByZXN1bWUgaXQgdW50aWwgc291cmNlIHNlZWsgaXMgZG9uZSwgb3RoZXJ3aXNlIGl0IGNvdWxkCisgICAgICAgIC8vIHN0YXJ0IHB1bGxpbmcgc3RhbGUgZGF0YSB0b28gc29vbi4KKyAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2sobmV3IFJlc3VtZURlY29kZXJBY3Rpb24oZmFsc2UpKTsKKyAgICAgICAgcHJvY2Vzc0RlZmVycmVkQWN0aW9ucygpOworICAgIH0gZWxzZSB7CisgICAgICAgIHBlcmZvcm1TZWVrKGN1cnJlbnRQb3NpdGlvblVzLCBNZWRpYVBsYXllclNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMgLyogbW9kZSAqLyk7CiAgICAgfQogCi0gICAgcGVyZm9ybVNlZWsoY3VycmVudFBvc2l0aW9uVXMsIE1lZGlhUGxheWVyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQyAvKiBtb2RlICovKTsKLQogICAgIGlmIChmb3JjZU5vbk9mZmxvYWQpIHsKICAgICAgICAgbVJlbmRlcmVyLT5zaWduYWxEaXNhYmxlT2ZmbG9hZEF1ZGlvKCk7CiAgICAgICAgIG1PZmZsb2FkQXVkaW8gPSBmYWxzZTsKQEAgLTI2NTksNyArMjY4MCw3IEBACiAgICAgICAgICAgICBpbnQgcG9zTXM7CiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgcG9zVXM7CiAgICAgICAgICAgICBkcml2ZXItPmdldEN1cnJlbnRQb3NpdGlvbigmcG9zTXMpOwotICAgICAgICAgICAgcG9zVXMgPSAoaW50NjRfdCkgcG9zTXMgKiAxMDAwbGw7CisgICAgICAgICAgICBwb3NVcyA9IChpbnQ2NF90KSBwb3NNcyAqIDEwMDBMTDsKICAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKIAogICAgICAgICAgICAgaWYgKHBvc1VzIDwgdGltZVVzKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmNwcAppbmRleCA3YjJiNmZiLi5hMmNjMTNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5jcHAKQEAgLTIwMCw2ICsyMDAsMTggQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3NzaXplX3QgTnVQbGF5ZXI6OkNDRGVjb2Rlcjo6Z2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIHR5cGUpIGNvbnN0IHsKKyAgICBpZiAobVNlbGVjdGVkVHJhY2sgIT0gLTEpIHsKKyAgICAgICAgQ0NUcmFjayB0cmFjayA9IG1UcmFja3NbbVNlbGVjdGVkVHJhY2tdOworICAgICAgICBpZiAodHJhY2subVRyYWNrVHlwZSA9PSBrVHJhY2tUeXBlQ0VBNjA4IHx8IHRyYWNrLm1UcmFja1R5cGUgPT0ga1RyYWNrVHlwZUNFQTcwOCkgeworICAgICAgICAgICAgcmV0dXJuICh0eXBlID09IE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUgPyBtU2VsZWN0ZWRUcmFjayA6IC0xKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gKHR5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9VTktOT1dOID8gbVNlbGVjdGVkVHJhY2sgOiAtMSk7CisgICAgfQorCisgICAgcmV0dXJuIC0xOworfQorCiBib29sIE51UGxheWVyOjpDQ0RlY29kZXI6OmlzU2VsZWN0ZWQoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1TZWxlY3RlZFRyYWNrID49IDAgJiYgbVNlbGVjdGVkVHJhY2sgPCAoaW50MzJfdClnZXRUcmFja0NvdW50KCk7CiB9CkBAIC01NjQsNyArNTc2LDcgQEAKIAogICAgICAgICBjY0J1Zi0+bWV0YSgpLT5zZXRJbnQzMigidHJhY2staW5kZXgiLCBtU2VsZWN0ZWRUcmFjayk7CiAgICAgICAgIGNjQnVmLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwotICAgICAgICBjY0J1Zi0+bWV0YSgpLT5zZXRJbnQ2NCgiZHVyYXRpb25VcyIsIDBsbCk7CisgICAgICAgIGNjQnVmLT5tZXRhKCktPnNldEludDY0KCJkdXJhdGlvblVzIiwgMExMKTsKIAogICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeS0+ZHVwKCk7CiAgICAgICAgIG1zZy0+c2V0SW50MzIoIndoYXQiLCBrV2hhdENsb3NlZENhcHRpb25EYXRhKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmgKaW5kZXggZjMxMGYzNy4uMzdiODIzMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmgKQEAgLTM4LDYgKzM4LDcgQEAKICAgICBzaXplX3QgZ2V0VHJhY2tDb3VudCgpIGNvbnN0OwogICAgIHNwPEFNZXNzYWdlPiBnZXRUcmFja0luZm8oc2l6ZV90IGluZGV4KSBjb25zdDsKICAgICBzdGF0dXNfdCBzZWxlY3RUcmFjayhzaXplX3QgaW5kZXgsIGJvb2wgc2VsZWN0KTsKKyAgICBzc2l6ZV90IGdldFNlbGVjdGVkVHJhY2sobWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdDsKICAgICBib29sIGlzU2VsZWN0ZWQoKSBjb25zdDsKICAgICB2b2lkIGRlY29kZShjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCk7CiAgICAgdm9pZCBkaXNwbGF5KGludDY0X3QgdGltZVVzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKaW5kZXggNjljZDgyZS4uMmYwZGEyZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAKQEAgLTcxLDEwICs3MSwxMCBAQAogICAgICAgbUNDRGVjb2RlcihjY0RlY29kZXIpLAogICAgICAgbVBpZChwaWQpLAogICAgICAgbVVpZCh1aWQpLAotICAgICAgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzKC0xbGwpLAotICAgICAgbU51bUZyYW1lc1RvdGFsKDBsbCksCi0gICAgICBtTnVtSW5wdXRGcmFtZXNEcm9wcGVkKDBsbCksCi0gICAgICBtTnVtT3V0cHV0RnJhbWVzRHJvcHBlZCgwbGwpLAorICAgICAgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzKC0xTEwpLAorICAgICAgbU51bUZyYW1lc1RvdGFsKDBMTCksCisgICAgICBtTnVtSW5wdXRGcmFtZXNEcm9wcGVkKDBMTCksCisgICAgICBtTnVtT3V0cHV0RnJhbWVzRHJvcHBlZCgwTEwpLAogICAgICAgbVZpZGVvV2lkdGgoMCksCiAgICAgICBtVmlkZW9IZWlnaHQoMCksCiAgICAgICBtSXNBdWRpbyh0cnVlKSwKQEAgLTEwNywxMCArMTA3LDE2IEBACiB9CiAKIHNwPEFNZXNzYWdlPiBOdVBsYXllcjo6RGVjb2Rlcjo6Z2V0U3RhdHMoKSBjb25zdCB7CisKICAgICBtU3RhdHMtPnNldEludDY0KCJmcmFtZXMtdG90YWwiLCBtTnVtRnJhbWVzVG90YWwpOwogICAgIG1TdGF0cy0+c2V0SW50NjQoImZyYW1lcy1kcm9wcGVkLWlucHV0IiwgbU51bUlucHV0RnJhbWVzRHJvcHBlZCk7CiAgICAgbVN0YXRzLT5zZXRJbnQ2NCgiZnJhbWVzLWRyb3BwZWQtb3V0cHV0IiwgbU51bU91dHB1dEZyYW1lc0Ryb3BwZWQpOwotICAgIHJldHVybiBtU3RhdHM7CisgICAgbVN0YXRzLT5zZXRGbG9hdCgiZnJhbWUtcmF0ZS10b3RhbCIsIG1GcmFtZVJhdGVUb3RhbCk7CisKKyAgICAvLyBpJ20gbXV0ZXhlZCByaWdodCBub3cuCisgICAgLy8gbWFrZSBvdXIgb3duIGNvcHksIHNvIHdlIGFyZW4ndCB2aWN0aW0gdG8gYW55IGxhdGVyIGNoYW5nZXMuCisgICAgc3A8QU1lc3NhZ2U+IGNvcGllZFN0YXRzID0gbVN0YXRzLT5kdXAoKTsKKyAgICByZXR1cm4gY29waWVkU3RhdHM7CiB9CiAKIHN0YXR1c190IE51UGxheWVyOjpEZWNvZGVyOjpzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKQEAgLTQwOCwxMCArNDE0LDEwIEBACiAgICAgICAgIC8vIFRPRE86IEZvciBub3csIGxheWVyIGZwcyBpcyBjYWxjdWxhdGVkIGZvciBzb21lIHNwZWNpZmljIGFyY2hpdGVjdHVyZXMuCiAgICAgICAgIC8vIEJ1dCBpdCByZWFsbHkgc2hvdWxkIGJlIGV4dHJhY3RlZCBmcm9tIHRoZSBzdHJlYW0uCiAgICAgICAgIG1WaWRlb1RlbXBvcmFsTGF5ZXJBZ2dyZWdhdGVGcHNbMF0gPQotICAgICAgICAgICAgbUZyYW1lUmF0ZVRvdGFsIC8gKGZsb2F0KSgxbGwgPDwgKG1OdW1WaWRlb1RlbXBvcmFsTGF5ZXJUb3RhbCAtIDEpKTsKKyAgICAgICAgICAgIG1GcmFtZVJhdGVUb3RhbCAvIChmbG9hdCkoMUxMIDw8IChtTnVtVmlkZW9UZW1wb3JhbExheWVyVG90YWwgLSAxKSk7CiAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMTsgaSA8IG1OdW1WaWRlb1RlbXBvcmFsTGF5ZXJUb3RhbDsgKytpKSB7CiAgICAgICAgICAgICBtVmlkZW9UZW1wb3JhbExheWVyQWdncmVnYXRlRnBzW2ldID0KLSAgICAgICAgICAgICAgICBtRnJhbWVSYXRlVG90YWwgLyAoZmxvYXQpKDFsbCA8PCAobU51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsIC0gaSkpCisgICAgICAgICAgICAgICAgbUZyYW1lUmF0ZVRvdGFsIC8gKGZsb2F0KSgxTEwgPDwgKG1OdW1WaWRlb1RlbXBvcmFsTGF5ZXJUb3RhbCAtIGkpKQogICAgICAgICAgICAgICAgICsgbVZpZGVvVGVtcG9yYWxMYXllckFnZ3JlZ2F0ZUZwc1tpIC0gMV07CiAgICAgICAgIH0KICAgICB9CkBAIC02NzcsNyArNjgzLDcgQEAKICAgICAgICAgbXNnLT5zZXRTaXplKCJidWZmZXItaXgiLCBpbmRleCk7CiAKICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbUNTRHNUb1N1Ym1pdC5pdGVtQXQoMCk7Ci0gICAgICAgIEFMT0dJKCJbJXNdIHJlc3VibWl0dGluZyBDU0QiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgQUxPR1YoIlslc10gcmVzdWJtaXR0aW5nIENTRCIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOwogICAgICAgICBtc2ctPnNldEJ1ZmZlcigiYnVmZmVyIiwgYnVmZmVyKTsKICAgICAgICAgbUNTRHNUb1N1Ym1pdC5yZW1vdmVBdCgwKTsKICAgICAgICAgaWYgKCFvbklucHV0QnVmZmVyRmV0Y2hlZChtc2cpKSB7CkBAIC03NDgsNyArNzU0LDcgQEAKICAgICByZXBseS0+c2V0U2l6ZSgic2l6ZSIsIHNpemUpOwogCiAgICAgaWYgKGVvcykgewotICAgICAgICBBTE9HSSgiWyVzXSBzYXcgb3V0cHV0IEVPUyIsIG1Jc0F1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOworICAgICAgICBBTE9HVigiWyVzXSBzYXcgb3V0cHV0IEVPUyIsIG1Jc0F1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOwogCiAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiZW9zIiwgdHJ1ZSk7CiAgICAgICAgIHJlcGx5LT5zZXRJbnQzMigiZW9zIiwgdHJ1ZSk7CkBAIC05MzMsNyArOTM5LDcgQEAKIAogICAgICAgICAgICAgaW50MzJfdCBsYXllcklkID0gMDsKICAgICAgICAgICAgIGJvb2wgaGF2ZUxheWVySWQgPSBhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQzMigidGVtcG9yYWwtbGF5ZXItaWQiLCAmbGF5ZXJJZCk7Ci0gICAgICAgICAgICBpZiAobVJlbmRlcmVyLT5nZXRWaWRlb0xhdGVCeVVzKCkgPiAxMDAwMDBsbAorICAgICAgICAgICAgaWYgKG1SZW5kZXJlci0+Z2V0VmlkZW9MYXRlQnlVcygpID4gMTAwMDAwTEwKICAgICAgICAgICAgICAgICAgICAgJiYgbUlzVmlkZW9BVkMKICAgICAgICAgICAgICAgICAgICAgJiYgIUlzQVZDUmVmZXJlbmNlRnJhbWUoYWNjZXNzVW5pdCkpIHsKICAgICAgICAgICAgICAgICBkcm9wQWNjZXNzVW5pdCA9IHRydWU7CkBAIC0xMDI4LDcgKzEwMzQsNyBAQAogICAgICAgICAgICAgaW50NjRfdCByZXN1bWVBdE1lZGlhVGltZVVzOwogICAgICAgICAgICAgaWYgKGV4dHJhLT5maW5kSW50NjQoCiAgICAgICAgICAgICAgICAgICAgICAgICAicmVzdW1lLWF0LW1lZGlhVGltZVVzIiwgJnJlc3VtZUF0TWVkaWFUaW1lVXMpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0koIlslc10gc3VwcHJlc3NpbmcgcmVuZGVyaW5nIHVudGlsICVsbGQgdXMiLAorICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIHN1cHByZXNzaW5nIHJlbmRlcmluZyB1bnRpbCAlbGxkIHVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIChsb25nIGxvbmcpcmVzdW1lQXRNZWRpYVRpbWVVcyk7CiAgICAgICAgICAgICAgICAgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzID0gcmVzdW1lQXRNZWRpYVRpbWVVczsKICAgICAgICAgICAgIH0KQEAgLTEwNjksNiArMTA3NSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TWVkaWFCdWZmZXJIb2xkZXIqPihob2xkZXIuZ2V0KCkpLT5tZWRpYUJ1ZmZlcigpIDogbnVsbHB0cjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKG1lZGlhQnVmICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhQnVmLT5zaXplKCkgPiBjb2RlY0J1ZmZlci0+Y2FwYWNpdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoRVJST1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRGVxdWV1ZWRJbnB1dEJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlckl4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5zZXRSYW5nZSgwLCBtZWRpYUJ1Zi0+c2l6ZSgpKTsKICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGNvZGVjQnVmZmVyLT5kYXRhKCksIG1lZGlhQnVmLT5kYXRhKCksIG1lZGlhQnVmLT5zaXplKCkpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyQmFzZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyQmFzZS5jcHAKaW5kZXggZDBkZTdiMC4uM2U5NmQyNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlckJhc2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJCYXNlLmNwcApAQCAtMTIwLDcgKzEyMCw3IEBACiAgICAgICAgIG1SZXF1ZXN0SW5wdXRCdWZmZXJzUGVuZGluZyA9IHRydWU7CiAKICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlcXVlc3RJbnB1dEJ1ZmZlcnMsIHRoaXMpOwotICAgICAgICBtc2ctPnBvc3QoMTAgKiAxMDAwbGwpOworICAgICAgICBtc2ctPnBvc3QoMTAgKiAxMDAwTEwpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5jcHAKaW5kZXggNmIwNWI1My4uMDk5N2U3ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guY3BwCkBAIC00Nyw3ICs0Nyw3IEBACiAgICAgOiBEZWNvZGVyQmFzZShub3RpZnkpLAogICAgICAgbVNvdXJjZShzb3VyY2UpLAogICAgICAgbVJlbmRlcmVyKHJlbmRlcmVyKSwKLSAgICAgIG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVcygtMWxsKSwKKyAgICAgIG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVcygtMUxMKSwKICAgICAgIG1SZWFjaGVkRU9TKHRydWUpLAogICAgICAgbVBlbmRpbmdBdWRpb0VycihPSyksCiAgICAgICBtUGVuZGluZ0J1ZmZlcnNUb0RyYWluKDApLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKaW5kZXggM2U1YmRkNi4uODY1Y2IyYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCkBAIC0xNyw2ICsxNyw3IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk51UGxheWVyRHJpdmVyIgogI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKQEAgLTUyLDYgKzUzLDcgQEAKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVySGVpZ2h0ID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuaGVpZ2h0IjsKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRnJhbWVzID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZnJhbWVzIjsKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRnJhbWVzRHJvcHBlZCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmRyb3BwZWQiOworc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJGcmFtZVJhdGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5mcHMiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJBTWltZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmF1ZGlvLm1pbWUiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJBQ29kZWMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5hdWRpby5jb2RlYyI7CiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckR1cmF0aW9uID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZHVyYXRpb25NcyI7CkBAIC05NSw3ICs5Nyw3IEBACiAgICAgbU1lZGlhQ2xvY2stPmluaXQoKTsKIAogICAgIC8vIHNldCB1cCBhbiBhbmFseXRpY3MgcmVjb3JkCi0gICAgbUFuYWx5dGljc0l0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtKGtLZXlQbGF5ZXIpOworICAgIG1BbmFseXRpY3NJdGVtID0gTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoa0tleVBsYXllcik7CiAKICAgICBtTG9vcGVyLT5zdGFydCgKICAgICAgICAgICAgIGZhbHNlLCAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8KQEAgLTMyNyw3ICszMjksNyBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c3RhcnQoKSB7Ci0gICAgQUxPR0QoInN0YXJ0KCVwKSwgc3RhdGUgaXMgJWQsIGVvcyBpcyAlZCIsIHRoaXMsIG1TdGF0ZSwgbUF0RU9TKTsKKyAgICBBTE9HVigic3RhcnQoJXApLCBzdGF0ZSBpcyAlZCwgZW9zIGlzICVkIiwgdGhpcywgbVN0YXRlLCBtQXRFT1MpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgcmV0dXJuIHN0YXJ0X2woKTsKIH0KQEAgLTM0NCw3ICszNDYsNyBAQAogCiAgICAgICAgICAgICBDSEVDS19FUShtU3RhdGUsIFNUQVRFX1BSRVBBUkVEKTsKIAotICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgpAQCAtMzUzLDcgKzM1NSw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIG1QbGF5ZXItPnN0YXJ0KCk7CiAKLSAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6CkBAIC0zODIsNyArMzg0LDcgQEAKICAgICBzd2l0Y2ggKG1TdGF0ZSkgewogICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6CiAgICAgICAgICAgICBtUGxheWVyLT5wYXVzZSgpOwotICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKIAogICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDoKICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7CkBAIC00NjksMTAgKzQ3MSwxMCBAQAogfQogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6c2Vla1RvKGludCBtc2VjLCBNZWRpYVBsYXllclNlZWtNb2RlIG1vZGUpIHsKLSAgICBBTE9HRCgic2Vla1RvKCVwKSAoJWQgbXMsICVkKSBhdCBzdGF0ZSAlZCIsIHRoaXMsIG1zZWMsIG1vZGUsIG1TdGF0ZSk7CisgICAgQUxPR1YoInNlZWtUbyglcCkgKCVkIG1zLCAlZCkgYXQgc3RhdGUgJWQiLCB0aGlzLCBtc2VjLCBtb2RlLCBtU3RhdGUpOwogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKLSAgICBpbnQ2NF90IHNlZWtUaW1lVXMgPSBtc2VjICogMTAwMGxsOworICAgIGludDY0X3Qgc2Vla1RpbWVVcyA9IG1zZWMgKiAxMDAwTEw7CiAKICAgICBzd2l0Y2ggKG1TdGF0ZSkgewogICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUkVEOgpAQCAtNTI5LDcgKzUzMSw3IEBACiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAotICAgICptc2VjID0gKG1EdXJhdGlvblVzICsgNTAwbGwpIC8gMTAwMDsKKyAgICAqbXNlYyA9IChtRHVyYXRpb25VcyArIDUwMExMKSAvIDEwMDA7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC01NzYsNiArNTc4LDEwIEBACiAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtQbGF5ZXJGcmFtZXMsIG51bUZyYW1lc1RvdGFsKTsKICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa1BsYXllckZyYW1lc0Ryb3BwZWQsIG51bUZyYW1lc0Ryb3BwZWQpOwogCisgICAgICAgICAgICAgICAgZmxvYXQgZnJhbWVSYXRlID0gMDsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHMtPmZpbmRGbG9hdCgiZnJhbWUtcmF0ZS10b3RhbCIsICZmcmFtZVJhdGUpKSB7CisgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXREb3VibGUoa1BsYXllckZyYW1lUmF0ZSwgKGRvdWJsZSkgZnJhbWVSYXRlKTsKKyAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIH0gZWxzZSBpZiAobWltZS5zdGFydHNXaXRoKCJhdWRpby8iKSkgewogICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJBTWltZSwgbWltZS5jX3N0cigpKTsKQEAgLTYwMSw2ICs2MDcsNyBAQAogICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa1BsYXllclJlYnVmZmVyaW5nLCAobVJlYnVmZmVyaW5nVGltZVVzKzUwMCkvMTAwMCApOwogICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1BsYXllclJlYnVmZmVyaW5nQ291bnQsIG1SZWJ1ZmZlcmluZ0V2ZW50cyk7CiAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUGxheWVyUmVidWZmZXJpbmdBdEV4aXQsIG1SZWJ1ZmZlcmluZ0F0RXhpdCk7CisKICAgICB9CiAKICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrUGxheWVyRGF0YVNvdXJjZVR5cGUsIG1QbGF5ZXItPmdldERhdGFTb3VyY2VUeXBlKCkpOwpAQCAtNjI4LDcgKzYzNSw3IEBACiAKICAgICAgICAgLy8gcmUtaW5pdCBpbiBjYXNlIHdlIHByZXBhcmUoKSBhbmQgc3RhcnQoKSBhZ2Fpbi4KICAgICAgICAgZGVsZXRlIG1BbmFseXRpY3NJdGVtIDsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtKCJudXBsYXllciIpOworICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKGtLZXlQbGF5ZXIpOwogICAgICAgICBpZiAobUFuYWx5dGljc0l0ZW0pIHsKICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRVaWQobUNsaWVudFVpZCk7CiAgICAgICAgIH0KQEAgLTczNyw3ICs3NDQsNyBAQAogICAgICAgICAgICAgaW50IG1zZWMgPSAwOwogICAgICAgICAgICAgLy8gZ2V0Q3VycmVudFBvc2l0aW9uIHNob3VsZCBhbHdheXMgcmV0dXJuIE9LCiAgICAgICAgICAgICBnZXRDdXJyZW50UG9zaXRpb24oJm1zZWMpOwotICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnNlbGVjdFRyYWNrKHRyYWNrSW5kZXgsIHRydWUgLyogc2VsZWN0ICovLCBtc2VjICogMTAwMGxsKTsKKyAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5zZWxlY3RUcmFjayh0cmFja0luZGV4LCB0cnVlIC8qIHNlbGVjdCAqLywgbXNlYyAqIDEwMDBMTCk7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIElOVk9LRV9JRF9VTlNFTEVDVF9UUkFDSzoKQEAgLTc3MSw3ICs3NzgsNyBAQAogCiBzdGF0dXNfdCBOdVBsYXllckRyaXZlcjo6Z2V0UGFyYW1ldGVyKGludCBrZXksIFBhcmNlbCAqcmVwbHkpIHsKIAotICAgIGlmIChrZXkgPT0gRk9VUkNDKCdtJywndCcsJ3InLCdYJykpIHsKKyAgICBpZiAoa2V5ID09IEZPVVJDQygnbScsJ3QnLCdyJywnWCcpICYmIG1BbmFseXRpY3NJdGVtICE9IE5VTEwpIHsKICAgICAgICAgLy8gbXRyWCAtLSBhIHBsYXkgb24gJ21ldHJpY3MnIChub3QgbWF0cml4KQogICAgICAgICAvLyBnYXRoZXIgY3VycmVudCBpbmZvIGFsbCB0b2dldGhlciwgcGFyY2VsIGl0LCBhbmQgc2VuZCBpdCBiYWNrCiAgICAgICAgIHVwZGF0ZU1ldHJpY3MoImFwaSIpOwpAQCAtOTU4LDcgKzk2NSw3IEBACiAKIHZvaWQgTnVQbGF5ZXJEcml2ZXI6Om5vdGlmeUxpc3RlbmVyX2woCiAgICAgICAgIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICppbikgewotICAgIEFMT0dEKCJub3RpZnlMaXN0ZW5lcl9sKCVwKSwgKCVkLCAlZCwgJWQsICVkKSwgbG9vcCBzZXR0aW5nKCVkLCAlZCkiLAorICAgIEFMT0dWKCJub3RpZnlMaXN0ZW5lcl9sKCVwKSwgKCVkLCAlZCwgJWQsICVkKSwgbG9vcCBzZXR0aW5nKCVkLCAlZCkiLAogICAgICAgICAgICAgdGhpcywgbXNnLCBleHQxLCBleHQyLCAoaW4gPT0gTlVMTCA/IC0xIDogKGludClpbi0+ZGF0YVNpemUoKSksIG1BdXRvTG9vcCwgbUxvb3BpbmcpOwogICAgIHN3aXRjaCAobXNnKSB7CiAgICAgICAgIGNhc2UgTUVESUFfUExBWUJBQ0tfQ09NUExFVEU6CkBAIC05OTEsNyArOTk4LDcgQEAKICAgICAgICAgICAgICAgICBtUGxheWVyLT5wYXVzZSgpOwogICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BBVVNFRDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIE1FRElBX0VSUk9SOgpAQCAtOTk5LDcgKzEwMDYsNyBAQAogICAgICAgICAgICAgLy8gd2hlbiB3ZSBoYXZlIGFuIGVycm9yLCBhZGQgaXQgdG8gdGhlIGFuYWx5dGljcyBmb3IgdGhpcyBwbGF5YmFjay4KICAgICAgICAgICAgIC8vIGV4dDEgaXMgb3VyIHByaW1hcnkgJ2Vycm9yIHR5cGUnIHZhbHVlLiBPbmx5IGFkZCBleHQyIHdoZW4gbm9uLXplcm8uCiAgICAgICAgICAgICAvLyBbdGVzdCBhZ2FpbnN0IG1zZyBpcyBkdWUgdG8gZmFsbCB0aHJvdWdoIGZyb20gcHJldmlvdXMgc3dpdGNoIHZhbHVlXQotICAgICAgICAgICAgaWYgKG1zZyA9PSBNRURJQV9FUlJPUikgeworICAgICAgICAgICAgaWYgKG1zZyA9PSBNRURJQV9FUlJPUiAmJiBtQW5hbHl0aWNzSXRlbSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJFcnJvciwgZXh0MSk7CiAgICAgICAgICAgICAgICAgaWYgKGV4dDIgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1BsYXllckVycm9yQ29kZSwgZXh0Mik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcm0uY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJtLmNwcAppbmRleCBiZGUwODYyLi4yZDBjOWUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcm0uY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRybS5jcHAKQEAgLTE1OSw4ICsxNTksMTIgQEAKICAgICBpZiAoZHJtICE9IE5VTEwpIHsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwc3NoRFJNcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgRHJtVVVJRCB1dWlkID0gcHNzaERSTXNbaV07Ci0gICAgICAgICAgICBpZiAoZHJtLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkLnB0cigpLCBTdHJpbmc4KCkpKQorICAgICAgICAgICAgYm9vbCBpc1N1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgc3RhdHVzID0gZHJtLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkLnB0cigpLCBTdHJpbmc4KCksCisgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxVbmtub3duLCAmaXNTdXBwb3J0ZWQpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSyAmJiBpc1N1cHBvcnRlZCkgewogICAgICAgICAgICAgICAgIHN1cHBvcnRlZERSTXMuYWRkKHV1aWQpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgZHJtLmNsZWFyKCk7CkBAIC0yMzksOCArMjQzLDE0IEBACiAgICAgICAgIHNpemVfdCAqZW5jcnlwdGVkYnl0ZXMpCiB7CiAgICAgLy8gc2l6ZSBuZWVkZWQgdG8gc3RvcmUgYWxsIHRoZSBjcnlwdG8gZGF0YQotICAgIHNpemVfdCBjcnlwdG9zaXplID0gc2l6ZW9mKENyeXB0b0luZm8pICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSkgKiBudW1TdWJTYW1wbGVzOworICAgIHNpemVfdCBjcnlwdG9zaXplOworICAgIC8vIHNpemVvZihDcnlwdG9JbmZvKSArIHNpemVvZihDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSkgKiBudW1TdWJTYW1wbGVzOworICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KHNpemVvZihDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSksIG51bVN1YlNhbXBsZXMsICZjcnlwdG9zaXplKSB8fAorICAgICAgICAgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhjcnlwdG9zaXplLCBzaXplb2YoQ3J5cHRvSW5mbyksICZjcnlwdG9zaXplKSkgeworICAgICAgICBBTE9HRSgiY3J5cHRvIHNpemUgb3ZlcmZsb3ciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCiAgICAgQ3J5cHRvSW5mbyAqcmV0ID0gKENyeXB0b0luZm8qKSBtYWxsb2MoY3J5cHRvc2l6ZSk7CiAgICAgaWYgKHJldCA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJjb3VsZG4ndCBhbGxvY2F0ZSAlenUgYnl0ZXMiLCBjcnlwdG9zaXplKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcAppbmRleCAzYTI4YmJkLi4zOWJlNDBkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCkBAIC0yNiw2ICsyNiw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KQEAgLTY4LDEzICs3MCwxNyBAQAogCiAvLyBNYXhpbXVtIHRpbWUgaW4gcGF1c2VkIHN0YXRlIHdoZW4gb2ZmbG9hZGluZyBhdWRpbyBkZWNvbXByZXNzaW9uLiBXaGVuIGVsYXBzZWQsIHRoZSBBdWRpb1NpbmsKIC8vIGlzIGNsb3NlZCB0byBhbGxvdyB0aGUgYXVkaW8gRFNQIHRvIHBvd2VyIGRvd24uCi1zdGF0aWMgY29uc3QgaW50NjRfdCBrT2ZmbG9hZFBhdXNlTWF4VXMgPSAxMDAwMDAwMGxsOworc3RhdGljIGNvbnN0IGludDY0X3Qga09mZmxvYWRQYXVzZU1heFVzID0gMTAwMDAwMDBMTDsKIAogLy8gTWF4aW11bSBhbGxvd2VkIGRlbGF5IGZyb20gQXVkaW9TaW5rLCAxLjUgc2Vjb25kcy4KLXN0YXRpYyBjb25zdCBpbnQ2NF90IGtNYXhBbGxvd2VkQXVkaW9TaW5rRGVsYXlVcyA9IDE1MDAwMDBsbDsKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtNYXhBbGxvd2VkQXVkaW9TaW5rRGVsYXlVcyA9IDE1MDAwMDBMTDsKIAogc3RhdGljIGNvbnN0IGludDY0X3Qga01pbmltdW1BdWRpb0Nsb2NrVXBkYXRlUGVyaW9kVXMgPSAyMCAvKiBtc2VjICovICogMTAwMDsKIAorLy8gRGVmYXVsdCB2aWRlbyBmcmFtZSBkaXNwbGF5IGR1cmF0aW9uIHdoZW4gb25seSB2aWRlbyBleGlzdHMuCisvLyBVc2VkIHRvIHNldCBtYXggbWVkaWEgdGltZSBpbiBNZWRpYUNsb2NrLgorc3RhdGljIGNvbnN0IGludDY0X3Qga0RlZmF1bHRWaWRlb0ZyYW1lSW50ZXJ2YWxVcyA9IDEwMDAwMExMOworCiAvLyBzdGF0aWMKIGNvbnN0IE51UGxheWVyOjpSZW5kZXJlcjo6UGNtSW5mbyBOdVBsYXllcjo6UmVuZGVyZXI6OkFVRElPX1BDTUlORk9fSU5JVElBTElaRVIgPSB7CiAgICAgICAgIEFVRElPX0NIQU5ORUxfTk9ORSwKQEAgLTg3LDYgKzkzLDIwIEBACiAvLyBzdGF0aWMKIGNvbnN0IGludDY0X3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjprTWluUG9zaXRpb25VcGRhdGVEZWxheVVzID0gMTAwMDAwbGw7CiAKK3N0YXRpYyBhdWRpb19mb3JtYXRfdCBjb25zdGV4cHIgYXVkaW9Gb3JtYXRGcm9tRW5jb2RpbmcoaW50MzJfdCBwY21FbmNvZGluZykgeworICAgIHN3aXRjaCAocGNtRW5jb2RpbmcpIHsKKyAgICBjYXNlIGtBdWRpb0VuY29kaW5nUGNtRmxvYXQ6CisgICAgICAgIHJldHVybiBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworICAgIGNhc2Uga0F1ZGlvRW5jb2RpbmdQY20xNmJpdDoKKyAgICAgICAgcmV0dXJuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIGNhc2Uga0F1ZGlvRW5jb2RpbmdQY204Yml0OgorICAgICAgICByZXR1cm4gQVVESU9fRk9STUFUX1BDTV84X0JJVDsgLy8gVE9ETzogZG8gd2Ugd2FudCB0byBzdXBwb3J0IHRoaXM/CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGVuY29kaW5nOiAlZCIsIF9fZnVuY19fLCBwY21FbmNvZGluZyk7CisgICAgICAgIHJldHVybiBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICB9Cit9CisKIE51UGxheWVyOjpSZW5kZXJlcjo6UmVuZGVyZXIoCiAgICAgICAgIGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiAmc2luaywKICAgICAgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2ssCkBAIC0xMDksNyArMTI5LDcgQEAKICAgICAgIG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMoLTEpLAogICAgICAgbUFuY2hvclRpbWVNZWRpYVVzKC0xKSwKICAgICAgIG1BbmNob3JOdW1GcmFtZXNXcml0dGVuKC0xKSwKLSAgICAgIG1WaWRlb0xhdGVCeVVzKDBsbCksCisgICAgICBtVmlkZW9MYXRlQnlVcygwTEwpLAogICAgICAgbU5leHRWaWRlb1RpbWVNZWRpYVVzKC0xKSwKICAgICAgIG1IYXNBdWRpbyhmYWxzZSksCiAgICAgICBtSGFzVmlkZW8oZmFsc2UpLApAQCAtMjk4LDExICszMTgsMTEgQEAKICAgICAgICAgICAgIG1Ob3RpZnlDb21wbGV0ZVZpZGVvIHw9IG5vdGlmeUNvbXBsZXRlOwogICAgICAgICAgICAgKyttVmlkZW9RdWV1ZUdlbmVyYXRpb247CiAgICAgICAgICAgICArK21WaWRlb0RyYWluR2VuZXJhdGlvbjsKKyAgICAgICAgICAgIG1OZXh0VmlkZW9UaW1lTWVkaWFVcyA9IC0xOwogICAgICAgICB9CiAKICAgICAgICAgbU1lZGlhQ2xvY2stPmNsZWFyQW5jaG9yKCk7CiAgICAgICAgIG1WaWRlb0xhdGVCeVVzID0gMDsKLSAgICAgICAgbU5leHRWaWRlb1RpbWVNZWRpYVVzID0gLTE7CiAgICAgICAgIG1TeW5jUXVldWVzID0gZmFsc2U7CiAgICAgfQogCkBAIC0zNTgsOCArMzc4LDEyIEBACiAKICAgICAgICAgLy8gQXVkaW9TaW5rIGhhcyByZW5kZXJlZCBzb21lIGZyYW1lcy4KICAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgICAgIGludDY0X3Qgbm93TWVkaWFVcyA9IG1BdWRpb1NpbmstPmdldFBsYXllZE91dER1cmF0aW9uVXMobm93VXMpCi0gICAgICAgICAgICAgICAgKyBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzOworICAgICAgICBpbnQ2NF90IHBsYXllZE91dER1cmF0aW9uVXMgPSBtQXVkaW9TaW5rLT5nZXRQbGF5ZWRPdXREdXJhdGlvblVzKG5vd1VzKTsKKyAgICAgICAgaWYgKHBsYXllZE91dER1cmF0aW9uVXMgPT0gMCkgeworICAgICAgICAgICAgKm1lZGlhVXMgPSBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIGludDY0X3Qgbm93TWVkaWFVcyA9IHBsYXllZE91dER1cmF0aW9uVXMgKyBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzOwogICAgICAgICBtTWVkaWFDbG9jay0+dXBkYXRlQW5jaG9yKG5vd01lZGlhVXMsIG5vd1VzLCAtMSk7CiAgICAgfQogCkBAIC01NjAsNyArNTg0LDcgQEAKICAgICAgICAgICAgICAgICAvLyBwbGF5IGJhY2suCiAgICAgICAgICAgICAgICAgaW50NjRfdCBkZWxheVVzID0KICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvU2luay0+bXNlY3NQZXJGcmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIG51bUZyYW1lc1BlbmRpbmdQbGF5b3V0ICogMTAwMGxsOworICAgICAgICAgICAgICAgICAgICAgICAgKiBudW1GcmFtZXNQZW5kaW5nUGxheW91dCAqIDEwMDBMTDsKICAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrUmF0ZSA+IDEuMGYpIHsKICAgICAgICAgICAgICAgICAgICAgZGVsYXlVcyAvPSBtUGxheWJhY2tSYXRlOwogICAgICAgICAgICAgICAgIH0KQEAgLTExNDEsOCArMTE2NSw4IEBACiAgICAgICAgIEFMT0dFKCJzYW1wbGVSYXRlIGlzIDAgaW4gJXMgbW9kZSIsIG9mZmxvYWRpbmdBdWRpbygpID8gIm9mZmxvYWQiIDogIm5vbi1vZmZsb2FkIik7CiAgICAgICAgIHJldHVybiAwOwogICAgIH0KLSAgICAvLyBUT0RPOiByZW1vdmUgdGhlIChpbnQzMl90KSBjYXN0aW5nIGJlbG93IGFzIGl0IG1heSBvdmVyZmxvdyBhdCAxMi40IGhvdXJzLgotICAgIHJldHVybiAoaW50NjRfdCkoKGludDMyX3QpbnVtRnJhbWVzICogMTAwMDAwMExMIC8gc2FtcGxlUmF0ZSk7CisKKyAgICByZXR1cm4gKGludDY0X3QpKG51bUZyYW1lcyAqIDEwMDAwMDBMTCAvIHNhbXBsZVJhdGUpOwogfQogCiAvLyBDYWxjdWxhdGUgZHVyYXRpb24gb2YgcGVuZGluZyBzYW1wbGVzIGlmIHBsYXllZCBhdCBub3JtYWwgcmF0ZSAoaS5lLiwgMS4wKS4KQEAgLTExNTIsNyArMTE3Niw3IEBACiAgICAgICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwogICAgICAgICBpbnQ2NF90IG1lZGlhVXM7CiAgICAgICAgIGlmIChtTWVkaWFDbG9jay0+Z2V0TWVkaWFUaW1lKG5vd1VzLCAmbWVkaWFVcykgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiAwbGw7CisgICAgICAgICAgICByZXR1cm4gMExMOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIHdyaXR0ZW5BdWRpb0R1cmF0aW9uVXMgLSAobWVkaWFVcyAtIG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMpOwogICAgICAgICB9CkBAIC0xMjc5LDEwICsxMzAzLDEwIEBACiAgICAgICAgICAgICBtQW5jaG9yVGltZU1lZGlhVXMgPSBtZWRpYVRpbWVVczsKICAgICAgICAgfQogICAgIH0KLSAgICBtTmV4dFZpZGVvVGltZU1lZGlhVXMgPSBtZWRpYVRpbWVVcyArIDEwMDAwMDsKKyAgICBtTmV4dFZpZGVvVGltZU1lZGlhVXMgPSBtZWRpYVRpbWVVczsKICAgICBpZiAoIW1IYXNBdWRpbykgewogICAgICAgICAvLyBzbW9vdGggb3V0IHZpZGVvcyA+PSAxMGZwcwotICAgICAgICBtTWVkaWFDbG9jay0+dXBkYXRlTWF4VGltZU1lZGlhKG1OZXh0VmlkZW9UaW1lTWVkaWFVcyk7CisgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVNYXhUaW1lTWVkaWEobWVkaWFUaW1lVXMgKyBrRGVmYXVsdFZpZGVvRnJhbWVJbnRlcnZhbFVzKTsKICAgICB9CiAKICAgICBpZiAoIW1WaWRlb1NhbXBsZVJlY2VpdmVkIHx8IG1lZGlhVGltZVVzIDwgbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcykgewpAQCAtMTM0OSw3ICsxMzczLDcgQEAKICAgICAgICAgICAgICAgICAgICAgJiYgbWVkaWFUaW1lVXMgPiBtTGFzdEF1ZGlvTWVkaWFUaW1lVXMpIHsKICAgICAgICAgICAgICAgICAvLyBJZiBhdWRpbyBlbmRzIGJlZm9yZSB2aWRlbywgdmlkZW8gY29udGludWVzIHRvIGRyaXZlIG1lZGlhIGNsb2NrLgogICAgICAgICAgICAgICAgIC8vIEFsc28gc21vb3RoIG91dCB2aWRlb3MgPj0gMTBmcHMuCi0gICAgICAgICAgICAgICAgbU1lZGlhQ2xvY2stPnVwZGF0ZU1heFRpbWVNZWRpYShtZWRpYVRpbWVVcyArIDEwMDAwMCk7CisgICAgICAgICAgICAgICAgbU1lZGlhQ2xvY2stPnVwZGF0ZU1heFRpbWVNZWRpYShtZWRpYVRpbWVVcyArIGtEZWZhdWx0VmlkZW9GcmFtZUludGVydmFsVXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTEzNjcsNyArMTM5MSw3IEBACiAgICAgICAgIHRvb0xhdGUgPSBmYWxzZTsKICAgICB9CiAKLSAgICBlbnRyeS0+bU5vdGlmeUNvbnN1bWVkLT5zZXRJbnQ2NCgidGltZXN0YW1wTnMiLCByZWFsVGltZVVzICogMTAwMGxsKTsKKyAgICBlbnRyeS0+bU5vdGlmeUNvbnN1bWVkLT5zZXRJbnQ2NCgidGltZXN0YW1wTnMiLCByZWFsVGltZVVzICogMTAwMExMKTsKICAgICBlbnRyeS0+bU5vdGlmeUNvbnN1bWVkLT5zZXRJbnQzMigicmVuZGVyIiwgIXRvb0xhdGUpOwogICAgIGVudHJ5LT5tTm90aWZ5Q29uc3VtZWQtPnBvc3QoKTsKICAgICBtVmlkZW9RdWV1ZS5lcmFzZShtVmlkZW9RdWV1ZS5iZWdpbigpKTsKQEAgLTE0MTYsOSArMTQ0MCwxNiBAQAogICAgICAgICBtSGFzQXVkaW8gPSBmYWxzZTsKICAgICAgICAgaWYgKG1OZXh0VmlkZW9UaW1lTWVkaWFVcyA+PSAwKSB7CiAgICAgICAgICAgICBpbnQ2NF90IG1lZGlhVXMgPSAwOwotICAgICAgICAgICAgbU1lZGlhQ2xvY2stPmdldE1lZGlhVGltZShBTG9vcGVyOjpHZXROb3dVcygpLCAmbWVkaWFVcyk7Ci0gICAgICAgICAgICBpZiAobU5leHRWaWRlb1RpbWVNZWRpYVVzID4gbWVkaWFVcykgewotICAgICAgICAgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVNYXhUaW1lTWVkaWEobU5leHRWaWRlb1RpbWVNZWRpYVVzKTsKKyAgICAgICAgICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gbU1lZGlhQ2xvY2stPmdldE1lZGlhVGltZShub3dVcywgJm1lZGlhVXMpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBPSykgeworICAgICAgICAgICAgICAgIGlmIChtTmV4dFZpZGVvVGltZU1lZGlhVXMgPiBtZWRpYVVzKSB7CisgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVNYXhUaW1lTWVkaWEobU5leHRWaWRlb1RpbWVNZWRpYVVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVBbmNob3IoCisgICAgICAgICAgICAgICAgICAgICAgICBtTmV4dFZpZGVvVGltZU1lZGlhVXMsIG5vd1VzLAorICAgICAgICAgICAgICAgICAgICAgICAgbU5leHRWaWRlb1RpbWVNZWRpYVVzICsga0RlZmF1bHRWaWRlb0ZyYW1lSW50ZXJ2YWxVcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0xNDk5LDcgKzE1MzAsNyBAQAogCiAgICAgQUxPR1YoInF1ZXVlRGlmZiA9ICUuMmYgc2VjcyIsIGRpZmYgLyAxRTYpOwogCi0gICAgaWYgKGRpZmYgPiAxMDAwMDBsbCkgeworICAgIGlmIChkaWZmID4gMTAwMDAwTEwpIHsKICAgICAgICAgLy8gQXVkaW8gZGF0YSBzdGFydHMgTW9yZSB0aGFuIDAuMSBzZWNzIGJlZm9yZSB2aWRlby4KICAgICAgICAgLy8gRHJvcCBzb21lIGF1ZGlvLgogCkBAIC0xNTcxLDYgKzE2MDIsMTQgQEAKICAgICAgICAgICAgIG5vdGlmeUNvbXBsZXRlID0gbU5vdGlmeUNvbXBsZXRlQXVkaW87CiAgICAgICAgICAgICBtTm90aWZ5Q29tcGxldGVBdWRpbyA9IGZhbHNlOwogICAgICAgICAgICAgbUxhc3RBdWRpb01lZGlhVGltZVVzID0gLTE7CisKKyAgICAgICAgICAgIG1IYXNBdWRpbyA9IGZhbHNlOworICAgICAgICAgICAgaWYgKG1OZXh0VmlkZW9UaW1lTWVkaWFVcyA+PSAwKSB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgICAgICAgICAgICAgbU1lZGlhQ2xvY2stPnVwZGF0ZUFuY2hvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OZXh0VmlkZW9UaW1lTWVkaWFVcywgbm93VXMsCisgICAgICAgICAgICAgICAgICAgICAgICBtTmV4dFZpZGVvVGltZU1lZGlhVXMgKyBrRGVmYXVsdFZpZGVvRnJhbWVJbnRlcnZhbFVzKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG5vdGlmeUNvbXBsZXRlID0gbU5vdGlmeUNvbXBsZXRlVmlkZW87CiAgICAgICAgICAgICBtTm90aWZ5Q29tcGxldGVWaWRlbyA9IGZhbHNlOwpAQCAtMTg3Myw4ICsxOTEyLDEzIEBACiAgICAgaW50MzJfdCBzYW1wbGVSYXRlOwogICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJzYW1wbGUtcmF0ZSIsICZzYW1wbGVSYXRlKSk7CiAKKyAgICAvLyByZWFkIHBjbSBlbmNvZGluZyBmcm9tIE1lZGlhQ29kZWMgb3V0cHV0IGZvcm1hdCwgaWYgYXZhaWxhYmxlCisgICAgaW50MzJfdCBwY21FbmNvZGluZzsKKyAgICBhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCA9CisgICAgICAgICAgICBmb3JtYXQtPmZpbmRJbnQzMihLRVlfUENNX0VOQ09ESU5HLCAmcGNtRW5jb2RpbmcpID8KKyAgICAgICAgICAgICAgICAgICAgYXVkaW9Gb3JtYXRGcm9tRW5jb2RpbmcocGNtRW5jb2RpbmcpIDogQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisKICAgICBpZiAob2ZmbG9hZGluZ0F1ZGlvKCkpIHsKLSAgICAgICAgYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKICAgICAgICAgQVN0cmluZyBtaW1lOwogICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBtYXBNaW1lVG9BdWRpb0Zvcm1hdChhdWRpb0Zvcm1hdCwgbWltZS5jX3N0cigpKTsKQEAgLTE5NzYsNyArMjAyMCw3IEBACiAgICAgICAgIGNvbnN0IFBjbUluZm8gaW5mbyA9IHsKICAgICAgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KXBjbUZsYWdzLAotICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCAvLyBUT0RPOiBjaGFuZ2UgdG8gYXVkaW9Gb3JtYXQKKyAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdCwKICAgICAgICAgICAgICAgICBudW1DaGFubmVscywKICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlCiAgICAgICAgIH07CkBAIC0yMDE1LDcgKzIwNTksNyBAQAogICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywKICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KWNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9Gb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgIDAgLyogYnVmZmVyQ291bnQgLSB1bnVzZWQgKi8sCiAgICAgICAgICAgICAgICAgICAgIG1Vc2VBdWRpb0NhbGxiYWNrID8gJk51UGxheWVyOjpSZW5kZXJlcjo6QXVkaW9TaW5rQ2FsbGJhY2sgOiBOVUxMLAogICAgICAgICAgICAgICAgICAgICBtVXNlQXVkaW9DYWxsYmFjayA/IHRoaXMgOiBOVUxMLApAQCAtMjA3Myw0ICsyMTE3LDMgQEAKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmgKaW5kZXggYTA0Nzk3NS4uYTUyMWY2MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oCkBAIC0yOCw3ICsyOCw3IEBACiBjbGFzcyAgQVdha2VMb2NrOwogc3RydWN0IE1lZGlhQ2xvY2s7CiBjbGFzcyBNZWRpYUNvZGVjQnVmZmVyOwotc3RydWN0IFZpZGVvRnJhbWVTY2hlZHVsZXI7CitzdHJ1Y3QgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U7CiAKIHN0cnVjdCBOdVBsYXllcjo6UmVuZGVyZXIgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgIGVudW0gRmxhZ3MgewpAQCAtMTU2LDcgKzE1Niw3IEBACiAgICAgTGlzdDxRdWV1ZUVudHJ5PiBtQXVkaW9RdWV1ZTsKICAgICBMaXN0PFF1ZXVlRW50cnk+IG1WaWRlb1F1ZXVlOwogICAgIHVpbnQzMl90IG1OdW1GcmFtZXNXcml0dGVuOwotICAgIHNwPFZpZGVvRnJhbWVTY2hlZHVsZXI+IG1WaWRlb1NjaGVkdWxlcjsKKyAgICBzcDxWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZT4gbVZpZGVvU2NoZWR1bGVyOwogCiAgICAgYm9vbCBtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZzsKICAgICBib29sIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1JUU1BTb3VyY2UuY3BwCmluZGV4IDg1MTIxN2IuLmJmMTRlYzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9SVFNQU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvUlRTUFNvdXJjZS5jcHAKQEAgLTMwLDcgKzMwLDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jb25zdCBpbnQ2NF90IGtOZWFyRU9TVGltZW91dFVzID0gMjAwMDAwMGxsOyAvLyAyIHNlY3MKK2NvbnN0IGludDY0X3Qga05lYXJFT1NUaW1lb3V0VXMgPSAyMDAwMDAwTEw7IC8vIDIgc2VjcwogCiAvLyBEZWZhdWx0IEJ1ZmZlciBVbmRlcmZsb3cvUHJlcGFyZS9TdGFydFNlcnZlci9PdmVyZmxvdyBNYXJrcwogc3RhdGljIGNvbnN0IGludCBrVW5kZXJmbG93TWFya01zICAgPSAgMTAwMDsgIC8vIDEgc2Vjb25kCkBAIC0xNjksNyArMTY5LDcgQEAKICAgICAvLyBXZSdyZSBnb2luZyB0byBidWZmZXIgYXQgbGVhc3QgMiBzZWNzIHdvcnRoIGRhdGEgb24gYWxsIHRyYWNrcyBiZWZvcmUKICAgICAvLyBzdGFydGluZyBwbGF5YmFjayAoYm90aCBhdCBzdGFydHVwIGFuZCBhZnRlciBhIHNlZWspLgogCi0gICAgc3RhdGljIGNvbnN0IGludDY0X3Qga01pbkR1cmF0aW9uVXMgPSAyMDAwMDAwbGw7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga01pbkR1cmF0aW9uVXMgPSAyMDAwMDAwTEw7CiAKICAgICBpbnQ2NF90IG1lZGlhRHVyYXRpb25VcyA9IDA7CiAgICAgZ2V0RHVyYXRpb24oJm1lZGlhRHVyYXRpb25Vcyk7CkBAIC0yNzMsNyArMjczLDcgQEAKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXI6OlJUU1BTb3VyY2U6OmdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpIHsKLSAgICAqZHVyYXRpb25VcyA9IC0xbGw7CisgICAgKmR1cmF0aW9uVXMgPSAtMUxMOwogCiAgICAgaW50NjRfdCBhdWRpb0R1cmF0aW9uVXM7CiAgICAgaWYgKG1BdWRpb1RyYWNrICE9IE5VTEwKQEAgLTMyMiw3ICszMjIsNyBAQAogCiB2b2lkIE51UGxheWVyOjpSVFNQU291cmNlOjpzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKSB7CiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBvbGxCdWZmZXJpbmcsIHRoaXMpOwotICAgIG1zZy0+cG9zdCgxMDAwMDAwbGwpOyAvLyAxIHNlY29uZCBpbnRlcnZhbHMKKyAgICBtc2ctPnBvc3QoMTAwMDAwMExMKTsgLy8gMSBzZWNvbmQgaW50ZXJ2YWxzCiB9CiAKIHZvaWQgTnVQbGF5ZXI6OlJUU1BTb3VyY2U6OmNoZWNrQnVmZmVyaW5nKApAQCAtMzQ2LDEwICszNDYsMTAgQEAKICAgICAgICAgaW50NjRfdCBtYXhSZWJ1ZmZlcmluZ01hcmtVczsKICAgICAgICAgewogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1CdWZmZXJpbmdTZXR0aW5nc0xvY2spOwotICAgICAgICAgICAgaW5pdGlhbE1hcmtVcyA9IG1CdWZmZXJpbmdTZXR0aW5ncy5tSW5pdGlhbE1hcmtNcyAqIDEwMDBsbDsKKyAgICAgICAgICAgIGluaXRpYWxNYXJrVXMgPSBtQnVmZmVyaW5nU2V0dGluZ3MubUluaXRpYWxNYXJrTXMgKiAxMDAwTEw7CiAgICAgICAgICAgICAvLyBUT0RPOiBtYXhSZWJ1ZmZlcmluZ01hcmtVcyBjb3VsZCBiZSBsYXJnZXIgdGhhbgogICAgICAgICAgICAgLy8gbUJ1ZmZlcmluZ1NldHRpbmdzLm1SZXN1bWVQbGF5YmFja01hcmtNcyAqIDEwMDBsbC4KLSAgICAgICAgICAgIG1heFJlYnVmZmVyaW5nTWFya1VzID0gbUJ1ZmZlcmluZ1NldHRpbmdzLm1SZXN1bWVQbGF5YmFja01hcmtNcyAqIDEwMDBsbDsKKyAgICAgICAgICAgIG1heFJlYnVmZmVyaW5nTWFya1VzID0gbUJ1ZmZlcmluZ1NldHRpbmdzLm1SZXN1bWVQbGF5YmFja01hcmtNcyAqIDEwMDBMTDsKICAgICAgICAgfQogICAgICAgICAvLyBpc0ZpbmlzaGVkIHdoZW4gZHVyYXRpb24gaXMgMCBjaGVja3MgZm9yIEVPUyByZXN1bHQgb25seQogICAgICAgICBpZiAoYnVmZmVyZWREdXJhdGlvblVzID4gaW5pdGlhbE1hcmtVcwpAQCAtMzY5LDcgKzM2OSw3IEBACiAgICAgICAgICAgICAgICAgKytvdmVyZmxvd0NvdW50OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaW50NjRfdCBzdGFydFNlcnZlck1hcmtVcyA9Ci0gICAgICAgICAgICAgICAgICAgIChrVW5kZXJmbG93TWFya01zICogMTAwMGxsICsgbWF4UmVidWZmZXJpbmdNYXJrVXMpIC8gMjsKKyAgICAgICAgICAgICAgICAgICAgKGtVbmRlcmZsb3dNYXJrTXMgKiAxMDAwTEwgKyBtYXhSZWJ1ZmZlcmluZ01hcmtVcykgLyAyOwogICAgICAgICAgICAgaWYgKGJ1ZmZlcmVkRHVyYXRpb25VcyA8IHN0YXJ0U2VydmVyTWFya1VzKSB7CiAgICAgICAgICAgICAgICAgKytzdGFydENvdW50OwogICAgICAgICAgICAgfQpAQCAtNjQwLDcgKzY0MCw3IEBACiAgICAgICAgICAgICAgICAgaW50NjRfdCBucHRVcyA9CiAgICAgICAgICAgICAgICAgICAgICgoZG91YmxlKXJ0cFRpbWUgLSAoZG91YmxlKWluZm8tPm1SVFBUaW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgLyBpbmZvLT5tVGltZVNjYWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAqIDEwMDAwMDBsbAorICAgICAgICAgICAgICAgICAgICAgICAgKiAxMDAwMDAwTEwKICAgICAgICAgICAgICAgICAgICAgICAgICsgaW5mby0+bU5vcm1hbFBsYXl0aW1lVXM7CiAKICAgICAgICAgICAgICAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCBucHRVcyk7CkBAIC03NDgsNyArNzQ4LDcgQEAKICAgICAgICAgVHJhY2tJbmZvIGluZm87CiAgICAgICAgIGluZm8ubVRpbWVTY2FsZSA9IHRpbWVTY2FsZTsKICAgICAgICAgaW5mby5tUlRQVGltZSA9IDA7Ci0gICAgICAgIGluZm8ubU5vcm1hbFBsYXl0aW1lVXMgPSAwbGw7CisgICAgICAgIGluZm8ubU5vcm1hbFBsYXl0aW1lVXMgPSAwTEw7CiAgICAgICAgIGluZm8ubU5QVE1hcHBpbmdWYWxpZCA9IGZhbHNlOwogCiAgICAgICAgIGlmICgoaXNBdWRpbyAmJiBtQXVkaW9UcmFjayA9PSBOVUxMKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL1N0cmVhbWluZ1NvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmNwcAppbmRleCBiM2RhNTNmLi5hZmRjZDM3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmNwcApAQCAtMTg2LDcgKzE4Niw3IEBACiAgICAgLy8gV2UncmUgZ29pbmcgdG8gYnVmZmVyIGF0IGxlYXN0IDIgc2VjcyB3b3J0aCBkYXRhIG9uIGFsbCB0cmFja3MgYmVmb3JlCiAgICAgLy8gc3RhcnRpbmcgcGxheWJhY2sgKGJvdGggYXQgc3RhcnR1cCBhbmQgYWZ0ZXIgYSBzZWVrKS4KIAotICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNaW5EdXJhdGlvblVzID0gMjAwMDAwMGxsOworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNaW5EdXJhdGlvblVzID0gMjAwMDAwMExMOwogCiAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gYXVkaW9UcmFjayA9IGdldFNvdXJjZSh0cnVlIC8qYXVkaW8qLyk7CiAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gdmlkZW9UcmFjayA9IGdldFNvdXJjZShmYWxzZSAvKmF1ZGlvKi8pOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icAppbmRleCBlOTM2YmRkLi5mOGM4OWU1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icApAQCAtMiw4ICsyLDYgQEAKIAogICAgIG5hbWU6ICJEcm1TZXNzaW9uTWFuYWdlcl90ZXN0IiwKIAotICAgIHRhZ3M6IFsidGVzdHMiXSwKLQogICAgIHNyY3M6IFsiRHJtU2Vzc2lvbk1hbmFnZXJfdGVzdC5jcHAiXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCkBAIC0xMywxMCArMTEsOSBAQAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjIiLAogICAgIF0sCiAKLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAotCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1XYWxsIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJuYmxvZy9BbmRyb2lkLmJwCmluZGV4IDc0YWFmNzcuLjExODgzMjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5ibG9nL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibmJsb2cvQW5kcm9pZC5icApAQCAtMyw5ICszLDEzIEBACiAgICAgbmFtZTogImxpYm5ibG9nIiwKIAogICAgIHNyY3M6IFsKLSAgICAgICAgIk5CTG9nLmNwcCIsCisgICAgICAgICJFbnRyeS5jcHAiLAorICAgICAgICAiTWVyZ2VyLmNwcCIsCiAgICAgICAgICJQZXJmb3JtYW5jZUFuYWx5c2lzLmNwcCIsCisgICAgICAgICJSZWFkZXIuY3BwIiwKICAgICAgICAgIlJlcG9ydFBlcmZvcm1hbmNlLmNwcCIsCisgICAgICAgICJUaW1lbGluZS5jcHAiLAorICAgICAgICAiV3JpdGVyLmNwcCIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCkBAIC0xMyw5ICsxNywxNCBAQAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmpzb25jcHAiLAorICAgIF0sCisKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVdhbGwiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvRW50cnkuY3BwIGIvbWVkaWEvbGlibmJsb2cvRW50cnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NzU2MzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9FbnRyeS5jcHAKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk5CTG9nIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZmlmby5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0VudHJ5Lmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRXZlbnRzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBOQkxvZyB7CisKK2ludCBFbnRyeTo6Y29weUVudHJ5RGF0YUF0KHNpemVfdCBvZmZzZXQpIGNvbnN0Cit7CisgICAgLy8gRklYTUUgVGhpcyBpcyB0b28gc2xvdworICAgIGlmIChvZmZzZXQgPT0gMCkgeworICAgICAgICByZXR1cm4gbUV2ZW50OworICAgIH0gZWxzZSBpZiAob2Zmc2V0ID09IDEpIHsKKyAgICAgICAgcmV0dXJuIG1MZW5ndGg7CisgICAgfSBlbHNlIGlmIChvZmZzZXQgPCAoc2l6ZV90KSAobUxlbmd0aCArIDIpKSB7CisgICAgICAgIHJldHVybiAoaW50KSAoKGNoYXIgKikgbURhdGEpW29mZnNldCAtIDJdOworICAgIH0gZWxzZSBpZiAob2Zmc2V0ID09IChzaXplX3QpIChtTGVuZ3RoICsgMikpIHsKKyAgICAgICAgcmV0dXJuIG1MZW5ndGg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDA7ICAgLy8gRklYTUUgaXMgdGhpcyBhbiBlcnJvcj8KKyAgICB9Cit9CisKK0VudHJ5SXRlcmF0b3I6OkVudHJ5SXRlcmF0b3IoKSAgIC8vIER1bW15IGluaXRpYWxpemF0aW9uLgorICAgIDogbVB0cihudWxscHRyKQoreworfQorCitFbnRyeUl0ZXJhdG9yOjpFbnRyeUl0ZXJhdG9yKGNvbnN0IHVpbnQ4X3QgKmVudHJ5KQorICAgIDogbVB0cihlbnRyeSkKK3sKK30KKworRW50cnlJdGVyYXRvcjo6RW50cnlJdGVyYXRvcihjb25zdCBFbnRyeUl0ZXJhdG9yICZvdGhlcikKKyAgICA6IG1QdHIob3RoZXIubVB0cikKK3sKK30KKworY29uc3QgZW50cnkmIEVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yKigpIGNvbnN0Cit7CisgICAgcmV0dXJuICooZW50cnkqKSBtUHRyOworfQorCitjb25zdCBlbnRyeSogRW50cnlJdGVyYXRvcjo6b3BlcmF0b3ItPigpIGNvbnN0Cit7CisgICAgcmV0dXJuIChlbnRyeSopIG1QdHI7Cit9CisKK0VudHJ5SXRlcmF0b3ImIEVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yKysoKQoreworICAgIG1QdHIgKz0gbVB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gKyBFbnRyeTo6a092ZXJoZWFkOworICAgIHJldHVybiAqdGhpczsKK30KKworRW50cnlJdGVyYXRvciYgRW50cnlJdGVyYXRvcjo6b3BlcmF0b3ItLSgpCit7CisgICAgbVB0ciAtPSBtUHRyW0VudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXRdICsgRW50cnk6OmtPdmVyaGVhZDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK0VudHJ5SXRlcmF0b3IgRW50cnlJdGVyYXRvcjo6bmV4dCgpIGNvbnN0Cit7CisgICAgRW50cnlJdGVyYXRvciBhdXgoKnRoaXMpOworICAgIHJldHVybiArK2F1eDsKK30KKworRW50cnlJdGVyYXRvciBFbnRyeUl0ZXJhdG9yOjpwcmV2KCkgY29uc3QKK3sKKyAgICBFbnRyeUl0ZXJhdG9yIGF1eCgqdGhpcyk7CisgICAgcmV0dXJuIC0tYXV4OworfQorCitib29sIEVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yIT0oY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1QdHIgIT0gb3RoZXIubVB0cjsKK30KKworaW50IEVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yLShjb25zdCBFbnRyeUl0ZXJhdG9yICZvdGhlcikgY29uc3QKK3sKKyAgICByZXR1cm4gbVB0ciAtIG90aGVyLm1QdHI7Cit9CisKK2Jvb2wgRW50cnlJdGVyYXRvcjo6aGFzQ29uc2lzdGVudExlbmd0aCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1QdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldID09IG1QdHJbbVB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gKworICAgICAgICBFbnRyeTo6a092ZXJoZWFkICsgRW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldF07Cit9CisKK3ZvaWQgRW50cnlJdGVyYXRvcjo6Y29weVRvKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCkgY29uc3QKK3sKKyAgICBzaXplX3QgbGVuZ3RoID0gbVB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gKyBFbnRyeTo6a092ZXJoZWFkOworICAgIGRzdC0+d3JpdGUobVB0ciwgbGVuZ3RoKTsKK30KKwordm9pZCBFbnRyeUl0ZXJhdG9yOjpjb3B5RGF0YSh1aW50OF90ICpkc3QpIGNvbnN0Cit7CisgICAgbWVtY3B5KCh2b2lkKikgZHN0LCBtUHRyICsgb2Zmc2V0b2YoZW50cnksIGRhdGEpLCBtUHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGQ6OnVuaXF1ZV9wdHI8QWJzdHJhY3RFbnRyeT4gQWJzdHJhY3RFbnRyeTo6YnVpbGRFbnRyeShjb25zdCB1aW50OF90ICpwdHIpCit7CisgICAgaWYgKHB0ciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjb25zdCB1aW50OF90IHR5cGUgPSBFbnRyeUl0ZXJhdG9yKHB0ciktPnR5cGU7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBFVkVOVF9GTVRfU1RBUlQ6CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEZvcm1hdEVudHJ5PihGb3JtYXRFbnRyeShwdHIpKTsKKyAgICBjYXNlIEVWRU5UX0FVRElPX1NUQVRFOgorICAgIGNhc2UgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTOgorICAgICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxIaXN0b2dyYW1FbnRyeT4oSGlzdG9ncmFtRW50cnkocHRyKSk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR1coIlRyaWVkIHRvIGNyZWF0ZSBBYnN0cmFjdEVudHJ5IG9mIHR5cGUgJWQiLCB0eXBlKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorfQorCitFbnRyeUl0ZXJhdG9yIEZvcm1hdEVudHJ5OjpiZWdpbigpIGNvbnN0Cit7CisgICAgcmV0dXJuIEVudHJ5SXRlcmF0b3IobUVudHJ5KTsKK30KKworY29uc3QgY2hhciAqRm9ybWF0RW50cnk6OmZvcm1hdFN0cmluZygpIGNvbnN0Cit7CisgICAgcmV0dXJuIChjb25zdCBjaGFyKikgbUVudHJ5ICsgb2Zmc2V0b2YoZW50cnksIGRhdGEpOworfQorCitzaXplX3QgRm9ybWF0RW50cnk6OmZvcm1hdFN0cmluZ0xlbmd0aCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1FbnRyeVtvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV07Cit9CisKK0VudHJ5SXRlcmF0b3IgRm9ybWF0RW50cnk6OmFyZ3MoKSBjb25zdAoreworICAgIGF1dG8gaXQgPSBiZWdpbigpOworICAgICsraXQ7IC8vIHNraXAgc3RhcnQgZm10CisgICAgKytpdDsgLy8gc2tpcCB0aW1lc3RhbXAKKyAgICArK2l0OyAvLyBza2lwIGhhc2gKKyAgICAvLyBTa2lwIGF1dGhvciBpZiBwcmVzZW50CisgICAgaWYgKGl0LT50eXBlID09IEVWRU5UX0ZNVF9BVVRIT1IpIHsKKyAgICAgICAgKytpdDsKKyAgICB9CisgICAgcmV0dXJuIGl0OworfQorCitpbnQ2NF90IEZvcm1hdEVudHJ5Ojp0aW1lc3RhbXAoKSBjb25zdAoreworICAgIGF1dG8gaXQgPSBiZWdpbigpOworICAgICsraXQ7IC8vIHNraXAgc3RhcnQgZm10CisgICAgcmV0dXJuIGl0LnBheWxvYWQ8aW50NjRfdD4oKTsKK30KKworbG9nX2hhc2hfdCBGb3JtYXRFbnRyeTo6aGFzaCgpIGNvbnN0Cit7CisgICAgYXV0byBpdCA9IGJlZ2luKCk7CisgICAgKytpdDsgLy8gc2tpcCBzdGFydCBmbXQKKyAgICArK2l0OyAvLyBza2lwIHRpbWVzdGFtcAorICAgIC8vIHVuYWxpZ25lZCA2NC1iaXQgcmVhZCBub3Qgc3VwcG9ydGVkCisgICAgbG9nX2hhc2hfdCBoYXNoOworICAgIG1lbWNweSgmaGFzaCwgaXQtPmRhdGEsIHNpemVvZihoYXNoKSk7CisgICAgcmV0dXJuIGhhc2g7Cit9CisKK2ludCBGb3JtYXRFbnRyeTo6YXV0aG9yKCkgY29uc3QKK3sKKyAgICBhdXRvIGl0ID0gYmVnaW4oKTsKKyAgICArK2l0OyAvLyBza2lwIHN0YXJ0IGZtdAorICAgICsraXQ7IC8vIHNraXAgdGltZXN0YW1wCisgICAgKytpdDsgLy8gc2tpcCBoYXNoCisgICAgLy8gaWYgdGhlcmUgaXMgYW4gYXV0aG9yIGVudHJ5LCByZXR1cm4gaXQsIHJldHVybiAtMSBvdGhlcndpc2UKKyAgICByZXR1cm4gaXQtPnR5cGUgPT0gRVZFTlRfRk1UX0FVVEhPUiA/IGl0LnBheWxvYWQ8aW50PigpIDogLTE7Cit9CisKK0VudHJ5SXRlcmF0b3IgRm9ybWF0RW50cnk6OmNvcHlXaXRoQXV0aG9yKAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QsIGludCBhdXRob3IpIGNvbnN0Cit7CisgICAgYXV0byBpdCA9IGJlZ2luKCk7CisgICAgaXQuY29weVRvKGRzdCk7ICAgICAvLyBjb3B5IGZtdCBzdGFydCBlbnRyeQorICAgICgrK2l0KS5jb3B5VG8oZHN0KTsgLy8gY29weSB0aW1lc3RhbXAKKyAgICAoKytpdCkuY29weVRvKGRzdCk7IC8vIGNvcHkgaGFzaAorICAgIC8vIGluc2VydCBhdXRob3IgZW50cnkKKyAgICBzaXplX3QgYXV0aG9yRW50cnlTaXplID0gRW50cnk6OmtPdmVyaGVhZCArIHNpemVvZihhdXRob3IpOworICAgIHVpbnQ4X3QgYXV0aG9yRW50cnlbYXV0aG9yRW50cnlTaXplXTsKKyAgICBhdXRob3JFbnRyeVtvZmZzZXRvZihlbnRyeSwgdHlwZSldID0gRVZFTlRfRk1UX0FVVEhPUjsKKyAgICBhdXRob3JFbnRyeVtvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gPQorICAgICAgICBhdXRob3JFbnRyeVthdXRob3JFbnRyeVNpemUgKyBFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XSA9CisgICAgICAgIHNpemVvZihhdXRob3IpOworICAgICooaW50KikgKCZhdXRob3JFbnRyeVtvZmZzZXRvZihlbnRyeSwgZGF0YSldKSA9IGF1dGhvcjsKKyAgICBkc3QtPndyaXRlKGF1dGhvckVudHJ5LCBhdXRob3JFbnRyeVNpemUpOworICAgIC8vIGNvcHkgcmVzdCBvZiBlbnRyaWVzCisgICAgd2hpbGUgKCgrK2l0KS0+dHlwZSAhPSBFVkVOVF9GTVRfRU5EKSB7CisgICAgICAgIGl0LmNvcHlUbyhkc3QpOworICAgIH0KKyAgICBpdC5jb3B5VG8oZHN0KTsKKyAgICArK2l0OworICAgIHJldHVybiBpdDsKK30KKworaW50NjRfdCBIaXN0b2dyYW1FbnRyeTo6dGltZXN0YW1wKCkgY29uc3QKK3sKKyAgICByZXR1cm4gRW50cnlJdGVyYXRvcihtRW50cnkpLnBheWxvYWQ8SGlzdFRzRW50cnk+KCkudHM7Cit9CisKK2xvZ19oYXNoX3QgSGlzdG9ncmFtRW50cnk6Omhhc2goKSBjb25zdAoreworICAgIHJldHVybiBFbnRyeUl0ZXJhdG9yKG1FbnRyeSkucGF5bG9hZDxIaXN0VHNFbnRyeT4oKS5oYXNoOworfQorCitpbnQgSGlzdG9ncmFtRW50cnk6OmF1dGhvcigpIGNvbnN0Cit7CisgICAgRW50cnlJdGVyYXRvciBpdChtRW50cnkpOworICAgIHJldHVybiBpdC0+bGVuZ3RoID09IHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpCisgICAgICAgICAgICA/IGl0LnBheWxvYWQ8SGlzdFRzRW50cnlXaXRoQXV0aG9yPigpLmF1dGhvciA6IC0xOworfQorCitFbnRyeUl0ZXJhdG9yIEhpc3RvZ3JhbUVudHJ5Ojpjb3B5V2l0aEF1dGhvcigKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LCBpbnQgYXV0aG9yKSBjb25zdAoreworICAgIC8vIEN1cnJlbnQgaGlzdG9ncmFtIGVudHJ5IGhhcyB7dHlwZSwgbGVuZ3RoLCBzdHJ1Y3QgSGlzdFRzRW50cnksIGxlbmd0aH0uCisgICAgLy8gV2Ugbm93IHdhbnQge3R5cGUsIGxlbmd0aCwgc3RydWN0IEhpc3RUc0VudHJ5V2l0aEF1dGhvciwgbGVuZ3RofQorICAgIHVpbnQ4X3QgYnVmZmVyW0VudHJ5OjprT3ZlcmhlYWQgKyBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKV07CisgICAgLy8gQ29weSBjb250ZW50IHVudGlsIHRoZSBwb2ludCB3ZSB3YW50IHRvIGFkZCB0aGUgYXV0aG9yCisgICAgbWVtY3B5KGJ1ZmZlciwgbUVudHJ5LCBzaXplb2YoZW50cnkpICsgc2l6ZW9mKEhpc3RUc0VudHJ5KSk7CisgICAgLy8gQ29weSB0aGUgYXV0aG9yCisgICAgKihpbnQqKSAoYnVmZmVyICsgc2l6ZW9mKGVudHJ5KSArIHNpemVvZihIaXN0VHNFbnRyeSkpID0gYXV0aG9yOworICAgIC8vIFVwZGF0ZSBsZW5ndGhzCisgICAgYnVmZmVyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSA9IHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpOworICAgIGJ1ZmZlcltvZmZzZXRvZihlbnRyeSwgZGF0YSkgKyBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKSArIG9mZnNldG9mKGVuZGluZywgbGVuZ3RoKV0KKyAgICAgICAgPSBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKTsKKyAgICAvLyBXcml0ZSBuZXcgYnVmZmVyIGludG8gRklGTworICAgIGRzdC0+d3JpdGUoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgICAgcmV0dXJuIEVudHJ5SXRlcmF0b3IobUVudHJ5KS5uZXh0KCk7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgTkJMb2cKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvTWVyZ2VyLmNwcCBiL21lZGlhL2xpYm5ibG9nL01lcmdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FkNmQ2YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL01lcmdlci5jcHAKQEAgLTAsMCArMSwzMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk5CTG9nIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHF1ZXVlPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KKyNpbmNsdWRlIDxqc29uL2pzb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9NZXJnZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9SZWFkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9UaW1lbGluZS5oPgorI2luY2x1ZGUgPHV0aWxzL0NvbmRpdGlvbi5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgTkJMb2cgeworCitNZXJnZXI6Ok1lcmdlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKToKKyAgICAgIG1TaGFyZWQoKFNoYXJlZCAqKSBzaGFyZWQpLAorICAgICAgbUZpZm8obVNoYXJlZCAhPSBOVUxMID8KKyAgICAgICAgbmV3IGF1ZGlvX3V0aWxzX2ZpZm8oc2l6ZSwgc2l6ZW9mKHVpbnQ4X3QpLAorICAgICAgICAgICAgbVNoYXJlZC0+bUJ1ZmZlciwgbVNoYXJlZC0+bVJlYXIsIE5VTEwgLyp0aHJvdHRsZXNGcm9udCovKSA6IE5VTEwpLAorICAgICAgbUZpZm9Xcml0ZXIobUZpZm8gIT0gTlVMTCA/IG5ldyBhdWRpb191dGlsc19maWZvX3dyaXRlcigqbUZpZm8pIDogTlVMTCkKK3sKK30KKwordm9pZCBNZXJnZXI6OmFkZFJlYWRlcihjb25zdCBzcDxSZWFkZXI+ICZyZWFkZXIpCit7CisgICAgLy8gRklYTUUgVGhpcyBpcyBjYWxsZWQgYnkgYmluZGVyIHRocmVhZCBpbiBNZWRpYUxvZ1NlcnZpY2U6OnJlZ2lzdGVyV3JpdGVyCisgICAgLy8gICAgICAgYnV0IHRoZSBhY2Nlc3MgdG8gc2hhcmVkIHZhcmlhYmxlIG1SZWFkZXJzIGlzIG5vdCB5ZXQgcHJvdGVjdGVkIGJ5IGEgbG9jay4KKyAgICBtUmVhZGVycy5wdXNoX2JhY2socmVhZGVyKTsKK30KKworLy8gaXRlbXMgcGxhY2VkIGluIHByaW9yaXR5IHF1ZXVlIGR1cmluZyBtZXJnZQorLy8gY29tcG9zZWQgYnkgYSB0aW1lc3RhbXAgYW5kIHRoZSBpbmRleCBvZiB0aGUgc25hcHNob3Qgd2hlcmUgdGhlIHRpbWVzdGFtcCBjYW1lIGZyb20KK3N0cnVjdCBNZXJnZUl0ZW0KK3sKKyAgICBpbnQ2NF90IHRzOworICAgIGludCBpbmRleDsKKyAgICBNZXJnZUl0ZW0oaW50NjRfdCB0cywgaW50IGluZGV4KTogdHModHMpLCBpbmRleChpbmRleCkge30KK307CisKK2Jvb2wgb3BlcmF0b3I+KGNvbnN0IHN0cnVjdCBNZXJnZUl0ZW0gJmkxLCBjb25zdCBzdHJ1Y3QgTWVyZ2VJdGVtICZpMikKK3sKKyAgICByZXR1cm4gaTEudHMgPiBpMi50cyB8fCAoaTEudHMgPT0gaTIudHMgJiYgaTEuaW5kZXggPiBpMi5pbmRleCk7Cit9CisKKy8vIE1lcmdlIHJlZ2lzdGVyZWQgcmVhZGVycywgc29ydGVkIGJ5IHRpbWVzdGFtcCwgYW5kIHdyaXRlIGRhdGEgdG8gYSBzaW5nbGUgRklGTyBpbiBsb2NhbCBtZW1vcnkKK3ZvaWQgTWVyZ2VyOjptZXJnZSgpCit7CisgICAgaWYgKHRydWUpIHJldHVybjsgLy8gTWVyZ2luZyBpcyBub3QgbmVjZXNzYXJ5IGF0IHRoZSBtb21lbnQsIHNvIHRoaXMgaXMgdG8gZGlzYWJsZSBpdAorICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBieXBhc3MgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgbWVtYmVyIHZhcmlhYmxlcyBub3QgYmVpbmcgdXNlZC4KKyAgICBjb25zdCBpbnQgbkxvZ3MgPSBtUmVhZGVycy5zaXplKCk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90Pj4gc25hcHNob3RzKG5Mb2dzKTsKKyAgICBzdGQ6OnZlY3RvcjxFbnRyeUl0ZXJhdG9yPiBvZmZzZXRzOworICAgIG9mZnNldHMucmVzZXJ2ZShuTG9ncyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuTG9nczsgKytpKSB7CisgICAgICAgIHNuYXBzaG90c1tpXSA9IG1SZWFkZXJzW2ldLT5nZXRTbmFwc2hvdCgpOworICAgICAgICBvZmZzZXRzLnB1c2hfYmFjayhzbmFwc2hvdHNbaV0tPmJlZ2luKCkpOworICAgIH0KKyAgICAvLyBpbml0aWFsaXplIG9mZnNldHMKKyAgICAvLyBUT0RPIGN1c3RvbSBoZWFwIGltcGxlbWVudGF0aW9uIGNvdWxkIGFsbG93IHRvIHVwZGF0ZSB0b3AsIGltcHJvdmluZyBwZXJmb3JtYW5jZQorICAgIC8vIGZvciBidXJzdHkgYnVmZmVycworICAgIHN0ZDo6cHJpb3JpdHlfcXVldWU8TWVyZ2VJdGVtLCBzdGQ6OnZlY3RvcjxNZXJnZUl0ZW0+LCBzdGQ6OmdyZWF0ZXI8TWVyZ2VJdGVtPj4gdGltZXN0YW1wczsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Mb2dzOyArK2kpCisgICAgeworICAgICAgICBpZiAob2Zmc2V0c1tpXSAhPSBzbmFwc2hvdHNbaV0tPmVuZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QWJzdHJhY3RFbnRyeT4gYWJzdHJhY3RFbnRyeSA9IEFic3RyYWN0RW50cnk6OmJ1aWxkRW50cnkob2Zmc2V0c1tpXSk7CisgICAgICAgICAgICBpZiAoYWJzdHJhY3RFbnRyeSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aW1lc3RhbXBzLmVtcGxhY2UoYWJzdHJhY3RFbnRyeS0+dGltZXN0YW1wKCksIGkpOworICAgICAgICB9CisgICAgfQorCisgICAgd2hpbGUgKCF0aW1lc3RhbXBzLmVtcHR5KCkpIHsKKyAgICAgICAgaW50IGluZGV4ID0gdGltZXN0YW1wcy50b3AoKS5pbmRleDsgICAgIC8vIGZpbmQgbWluaW11bSB0aW1lc3RhbXAKKyAgICAgICAgLy8gY29weSBpdCB0byB0aGUgbG9nLCBpbmNyZWFzaW5nIG9mZnNldAorICAgICAgICBvZmZzZXRzW2luZGV4XSA9IEFic3RyYWN0RW50cnk6OmJ1aWxkRW50cnkob2Zmc2V0c1tpbmRleF0pLT4KKyAgICAgICAgICAgIGNvcHlXaXRoQXV0aG9yKG1GaWZvV3JpdGVyLCBpbmRleCk7CisgICAgICAgIC8vIHVwZGF0ZSBkYXRhIHN0cnVjdHVyZXMKKyAgICAgICAgdGltZXN0YW1wcy5wb3AoKTsKKyAgICAgICAgaWYgKG9mZnNldHNbaW5kZXhdICE9IHNuYXBzaG90c1tpbmRleF0tPmVuZCgpKSB7CisgICAgICAgICAgICBpbnQ2NF90IHRzID0gQWJzdHJhY3RFbnRyeTo6YnVpbGRFbnRyeShvZmZzZXRzW2luZGV4XSktPnRpbWVzdGFtcCgpOworICAgICAgICAgICAgdGltZXN0YW1wcy5lbXBsYWNlKHRzLCBpbmRleCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPHNwPFJlYWRlcj4+JiBNZXJnZXI6OmdldFJlYWRlcnMoKSBjb25zdAoreworICAgIC8vQXV0b011dGV4IF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbVJlYWRlcnM7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitNZXJnZVJlYWRlcjo6TWVyZ2VSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSwgTWVyZ2VyICZtZXJnZXIpCisgICAgOiBSZWFkZXIoc2hhcmVkLCBzaXplLCAiTWVyZ2VSZWFkZXIiKSwgbVJlYWRlcnMobWVyZ2VyLmdldFJlYWRlcnMoKSkKK3sKK30KKworLy8gVGFrZXMgcmF3IGNvbnRlbnQgb2YgdGhlIGxvY2FsIG1lcmdlciBGSUZPLCBwcm9jZXNzZXMgbG9nIGVudHJpZXMsIGFuZAorLy8gd3JpdGVzIHRoZSBkYXRhIHRvIGEgbWFwIG9mIGNsYXNzIFBlcmZvcm1hbmNlQW5hbHlzaXMsIGJhc2VkIG9uIHRoZWlyIHRocmVhZCBJRC4KK3ZvaWQgTWVyZ2VSZWFkZXI6OnByb2Nlc3NTbmFwc2hvdChTbmFwc2hvdCAmc25hcHNob3QsIGludCBhdXRob3IpCit7CisgICAgUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlRGF0YSYgZGF0YSA9IG1UaHJlYWRQZXJmb3JtYW5jZURhdGFbYXV0aG9yXTsKKyAgICAvLyBXZSBkb24ndCBkbyAiYXV0byBpdCIgYmVjYXVzZSBpdCByZWR1Y2VzIHJlYWRhYmlsaXR5IGluIHRoaXMgY2FzZS4KKyAgICBmb3IgKEVudHJ5SXRlcmF0b3IgaXQgPSBzbmFwc2hvdC5iZWdpbigpOyBpdCAhPSBzbmFwc2hvdC5lbmQoKTsgKytpdCkgeworICAgICAgICBzd2l0Y2ggKGl0LT50eXBlKSB7CisgICAgICAgIGNhc2UgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTOiB7CisgICAgICAgICAgICBjb25zdCBIaXN0VHNFbnRyeSBwYXlsb2FkID0gaXQucGF5bG9hZDxIaXN0VHNFbnRyeT4oKTsKKyAgICAgICAgICAgIC8vIFRPRE86IGhhc2ggZm9yIGhpc3RvZ3JhbSB0cyBhbmQgYXVkaW8gc3RhdGUgbmVlZCB0byBtYXRjaAorICAgICAgICAgICAgLy8gYW5kIGNvcnJlc3BvbmQgdG8gYXVkaW8gcHJvZHVjdGlvbiBzb3VyY2UgZmlsZSBsb2NhdGlvbgorICAgICAgICAgICAgbVRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXNbYXV0aG9yXVswIC8qaGFzaCovXS5sb2dUc0VudHJ5KHBheWxvYWQudHMpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX0FVRElPX1NUQVRFOiB7CisgICAgICAgICAgICBtVGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpc1thdXRob3JdWzAgLypoYXNoKi9dLmhhbmRsZVN0YXRlQ2hhbmdlKCk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfVEhSRUFEX0lORk86IHsKKyAgICAgICAgICAgIGNvbnN0IHRocmVhZF9pbmZvX3QgaW5mbyA9IGl0LnBheWxvYWQ8dGhyZWFkX2luZm9fdD4oKTsKKyAgICAgICAgICAgIGRhdGEudGhyZWFkSW5mbyA9IGluZm87CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfVEhSRUFEX1BBUkFNUzogeworICAgICAgICAgICAgY29uc3QgdGhyZWFkX3BhcmFtc190IHBhcmFtcyA9IGl0LnBheWxvYWQ8dGhyZWFkX3BhcmFtc190PigpOworICAgICAgICAgICAgZGF0YS50aHJlYWRQYXJhbXMgPSBwYXJhbXM7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfTEFURU5DWTogeworICAgICAgICAgICAgY29uc3QgZG91YmxlIGxhdGVuY3lNcyA9IGl0LnBheWxvYWQ8ZG91YmxlPigpOworICAgICAgICAgICAgZGF0YS5sYXRlbmN5SGlzdC5hZGQobGF0ZW5jeU1zKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9XT1JLX1RJTUU6IHsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgbW9ub3RvbmljTnMgPSBpdC5wYXlsb2FkPGludDY0X3Q+KCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbW9ub3RvbmljTXMgPSBtb25vdG9uaWNOcyAqIDFlLTY7CisgICAgICAgICAgICBkYXRhLndvcmtIaXN0LmFkZChtb25vdG9uaWNNcyk7CisgICAgICAgICAgICBkYXRhLmFjdGl2ZSArPSBtb25vdG9uaWNOczsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9XQVJNVVBfVElNRTogeworICAgICAgICAgICAgY29uc3QgZG91YmxlIHRpbWVNcyA9IGl0LnBheWxvYWQ8ZG91YmxlPigpOworICAgICAgICAgICAgZGF0YS53YXJtdXBIaXN0LmFkZCh0aW1lTXMpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1VOREVSUlVOOiB7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRzID0gaXQucGF5bG9hZDxpbnQ2NF90PigpOworICAgICAgICAgICAgZGF0YS51bmRlcnJ1bnMrKzsKKyAgICAgICAgICAgIGRhdGEuc25hcHNob3RzLmVtcGxhY2VfZnJvbnQoRVZFTlRfVU5ERVJSVU4sIHRzKTsKKyAgICAgICAgICAgIC8vIFRPRE8gaGF2ZSBhIGRhdGEgc3RydWN0dXJlIHRvIGF1dG9tYXRpY2FsbHkgaGFuZGxlIHJlc2l6aW5nCisgICAgICAgICAgICBpZiAoZGF0YS5zbmFwc2hvdHMuc2l6ZSgpID4gUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlRGF0YTo6a01heFNuYXBzaG90c1RvU3RvcmUpIHsKKyAgICAgICAgICAgICAgICBkYXRhLnNuYXBzaG90cy5wb3BfYmFjaygpOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX09WRVJSVU46IHsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgdHMgPSBpdC5wYXlsb2FkPGludDY0X3Q+KCk7CisgICAgICAgICAgICBkYXRhLm92ZXJydW5zKys7CisgICAgICAgICAgICBkYXRhLnNuYXBzaG90cy5lbXBsYWNlX2Zyb250KEVWRU5UX1VOREVSUlVOLCB0cyk7CisgICAgICAgICAgICAvLyBUT0RPIGhhdmUgYSBkYXRhIHN0cnVjdHVyZSB0byBhdXRvbWF0aWNhbGx5IGhhbmRsZSByZXNpemluZworICAgICAgICAgICAgaWYgKGRhdGEuc25hcHNob3RzLnNpemUoKSA+IFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZURhdGE6OmtNYXhTbmFwc2hvdHNUb1N0b3JlKSB7CisgICAgICAgICAgICAgICAgZGF0YS5zbmFwc2hvdHMucG9wX2JhY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9SRVNFUlZFRDoKKyAgICAgICAgY2FzZSBFVkVOVF9VUFBFUl9CT1VORDoKKyAgICAgICAgICAgIEFMT0dXKCJ3YXJuaW5nOiB1bmV4cGVjdGVkIGV2ZW50ICVkIiwgaXQtPnR5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBNZXJnZVJlYWRlcjo6Z2V0QW5kUHJvY2Vzc1NuYXBzaG90KCkKK3sKKyAgICAvLyBnZXQgYSBzbmFwc2hvdCBvZiBlYWNoIHJlYWRlciBhbmQgcHJvY2VzcyB0aGVtCisgICAgLy8gVE9ETyBpbnNlcnQgbG9jayBoZXJlCisgICAgY29uc3Qgc2l6ZV90IG5Mb2dzID0gbVJlYWRlcnMuc2l6ZSgpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4+IHNuYXBzaG90cyhuTG9ncyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuTG9nczsgaSsrKSB7CisgICAgICAgIHNuYXBzaG90c1tpXSA9IG1SZWFkZXJzW2ldLT5nZXRTbmFwc2hvdCgpOworICAgIH0KKyAgICAvLyBUT0RPIHVubG9jayBsb2NrIGhlcmUKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5Mb2dzOyBpKyspIHsKKyAgICAgICAgaWYgKHNuYXBzaG90c1tpXSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBwcm9jZXNzU25hcHNob3QoKihzbmFwc2hvdHNbaV0pLCBpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjaGVja1B1c2hUb01lZGlhTWV0cmljcygpOworfQorCit2b2lkIE1lcmdlUmVhZGVyOjpjaGVja1B1c2hUb01lZGlhTWV0cmljcygpCit7CisgICAgY29uc3QgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgZm9yIChhdXRvJiBpdGVtIDogbVRocmVhZFBlcmZvcm1hbmNlRGF0YSkgeworICAgICAgICBSZXBvcnRQZXJmb3JtYW5jZTo6UGVyZm9ybWFuY2VEYXRhJiBkYXRhID0gaXRlbS5zZWNvbmQ7CisgICAgICAgIGlmIChub3cgLSBkYXRhLnN0YXJ0ID49IGtQZXJpb2RpY01lZGlhTWV0cmljc1B1c2gpIHsKKyAgICAgICAgICAgICh2b2lkKVJlcG9ydFBlcmZvcm1hbmNlOjpzZW5kVG9NZWRpYU1ldHJpY3MoZGF0YSk7CisgICAgICAgICAgICBkYXRhLnJlc2V0KCk7ICAgLy8gZGF0YSBpcyBwZXJzaXN0ZW50IHBlciB0aHJlYWQKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBNZXJnZVJlYWRlcjo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCit7CisgICAgLy8gVE9ETzogYWRkIGEgbXV0ZXggYXJvdW5kIG1lZGlhLmxvZyBkdW1wCisgICAgLy8gT3B0aW9ucyBmb3IgZHVtcHN5cworICAgIGJvb2wgcGEgPSBmYWxzZSwganNvbiA9IGZhbHNlLCBwbG90cyA9IGZhbHNlLCByZXRybyA9IGZhbHNlOworICAgIGZvciAoY29uc3QgYXV0byAmYXJnIDogYXJncykgeworICAgICAgICBpZiAoYXJnID09IFN0cmluZzE2KCItLXBhIikpIHsKKyAgICAgICAgICAgIHBhID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmcgPT0gU3RyaW5nMTYoIi0tanNvbiIpKSB7CisgICAgICAgICAgICBqc29uID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmcgPT0gU3RyaW5nMTYoIi0tcGxvdHMiKSkgeworICAgICAgICAgICAgcGxvdHMgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGFyZyA9PSBTdHJpbmcxNigiLS1yZXRybyIpKSB7CisgICAgICAgICAgICByZXRybyA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHBhKSB7CisgICAgICAgIFJlcG9ydFBlcmZvcm1hbmNlOjpkdW1wKGZkLCAwIC8qaW5kZW50Ki8sIG1UaHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzKTsKKyAgICB9CisgICAgaWYgKGpzb24pIHsKKyAgICAgICAgUmVwb3J0UGVyZm9ybWFuY2U6OmR1bXBKc29uKGZkLCBtVGhyZWFkUGVyZm9ybWFuY2VEYXRhKTsKKyAgICB9CisgICAgaWYgKHBsb3RzKSB7CisgICAgICAgIFJlcG9ydFBlcmZvcm1hbmNlOjpkdW1wUGxvdHMoZmQsIG1UaHJlYWRQZXJmb3JtYW5jZURhdGEpOworICAgIH0KKyAgICBpZiAocmV0cm8pIHsKKyAgICAgICAgUmVwb3J0UGVyZm9ybWFuY2U6OmR1bXBSZXRybyhmZCwgbVRocmVhZFBlcmZvcm1hbmNlRGF0YSk7CisgICAgfQorfQorCit2b2lkIE1lcmdlUmVhZGVyOjpoYW5kbGVBdXRob3IoY29uc3QgQWJzdHJhY3RFbnRyeSAmZW50cnksIFN0cmluZzggKmJvZHkpCit7CisgICAgaW50IGF1dGhvciA9IGVudHJ5LmF1dGhvcigpOworICAgIGlmIChhdXRob3IgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBGSVhNRSBOZWVkcyBhIGxvY2sKKyAgICBjb25zdCBjaGFyKiBuYW1lID0gbVJlYWRlcnNbYXV0aG9yXS0+bmFtZSgpLmNfc3RyKCk7CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlczogIiwgbmFtZSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitNZXJnZVRocmVhZDo6TWVyZ2VUaHJlYWQoTWVyZ2VyICZtZXJnZXIsIE1lcmdlUmVhZGVyICZtZXJnZVJlYWRlcikKKyAgICA6IG1NZXJnZXIobWVyZ2VyKSwKKyAgICAgIG1NZXJnZVJlYWRlcihtZXJnZVJlYWRlciksCisgICAgICBtVGltZW91dFVzKDApCit7Cit9CisKK01lcmdlVGhyZWFkOjp+TWVyZ2VUaHJlYWQoKQoreworICAgIC8vIHNldCBleGl0IGZsYWcsIHNldCB0aW1lb3V0IHRvIDAgdG8gZm9yY2UgdGhyZWFkTG9vcCB0byBleGl0IGFuZCB3YWl0IGZvciB0aGUgdGhyZWFkIHRvIGpvaW4KKyAgICByZXF1ZXN0RXhpdCgpOworICAgIHNldFRpbWVvdXRVcygwKTsKKyAgICBqb2luKCk7Cit9CisKK2Jvb2wgTWVyZ2VUaHJlYWQ6OnRocmVhZExvb3AoKQoreworICAgIGJvb2wgZG9NZXJnZTsKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOworICAgICAgICAvLyBJZiBtVGltZW91dFVzIGlzIG5lZ2F0aXZlLCB3YWl0IG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUgdW50aWwgaXQncyBwb3NpdGl2ZS4KKyAgICAgICAgLy8gSWYgaXQncyBwb3NpdGl2ZSwgbWVyZ2UuIFRoZSBtaW5pbXVtIHBlcmlvZCBiZXR3ZWVuIHdha2luZyB0aGUgY29uZGl0aW9uIHZhcmlhYmxlCisgICAgICAgIC8vIGlzIGhhbmRsZWQgaW4gQXVkaW9GbGluZ2VyOjpNZWRpYUxvZ05vdGlmaWVyOjp0aHJlYWRMb29wKCkuCisgICAgICAgIG1Db25kLndhaXQobU11dGV4KTsKKyAgICAgICAgZG9NZXJnZSA9IG1UaW1lb3V0VXMgPiAwOworICAgICAgICBtVGltZW91dFVzIC09IGtUaHJlYWRTbGVlcFBlcmlvZFVzOworICAgIH0KKyAgICBpZiAoZG9NZXJnZSkgeworICAgICAgICAvLyBNZXJnZSBkYXRhIGZyb20gYWxsIHRoZSByZWFkZXJzCisgICAgICAgIG1NZXJnZXIubWVyZ2UoKTsKKyAgICAgICAgLy8gUHJvY2VzcyB0aGUgZGF0YSBjb2xsZWN0ZWQgYnkgbU1lcmdlciBhbmQgd3JpdGUgaXQgdG8gUGVyZm9ybWFuY2VBbmFseXNpcworICAgICAgICAvLyBGSVhNRTogZGVjaWRlIHdoZXRoZXIgdG8gY2FsbCBnZXRBbmRQcm9jZXNzU25hcHNob3QgZXZlcnkgdGltZQorICAgICAgICAvLyBvciB3aGV0aGVyIHRvIGhhdmUgYSBzZXBhcmF0ZSB0aHJlYWQgdGhhdCBjYWxscyBpdCB3aXRoIGEgbG93ZXIgZnJlcXVlbmN5CisgICAgICAgIG1NZXJnZVJlYWRlci5nZXRBbmRQcm9jZXNzU25hcHNob3QoKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTWVyZ2VUaHJlYWQ6Ondha2V1cCgpCit7CisgICAgc2V0VGltZW91dFVzKGtUaHJlYWRXYWtldXBQZXJpb2RVcyk7Cit9CisKK3ZvaWQgTWVyZ2VUaHJlYWQ6OnNldFRpbWVvdXRVcyhpbnQgdGltZSkKK3sKKyAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKKyAgICBtVGltZW91dFVzID0gdGltZTsKKyAgICBtQ29uZC5zaWduYWwoKTsKK30KKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9OQkxvZy5jcHAgYi9tZWRpYS9saWJuYmxvZy9OQkxvZy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZmEzZTMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibmJsb2cvTkJMb2cuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTE1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoKLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIk5CTG9nIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGNsaW1pdHM+Ci0jaW5jbHVkZSA8ZGVxdWU+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8bnVtZXJpYz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8bmV3PgotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3JvdW5kdXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmxvZy9OQkxvZy5oPgotI2luY2x1ZGUgPG1lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oPgotI2luY2x1ZGUgPHV0aWxzL0NhbGxTdGFjay5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotI2luY2x1ZGUgPHF1ZXVlPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotaW50IE5CTG9nOjpFbnRyeTo6Y29weUVudHJ5RGF0YUF0KHNpemVfdCBvZmZzZXQpIGNvbnN0Ci17Ci0gICAgLy8gRklYTUUgVGhpcyBpcyB0b28gc2xvdwotICAgIGlmIChvZmZzZXQgPT0gMCkKLSAgICAgICAgcmV0dXJuIG1FdmVudDsKLSAgICBlbHNlIGlmIChvZmZzZXQgPT0gMSkKLSAgICAgICAgcmV0dXJuIG1MZW5ndGg7Ci0gICAgZWxzZSBpZiAob2Zmc2V0IDwgKHNpemVfdCkgKG1MZW5ndGggKyAyKSkKLSAgICAgICAgcmV0dXJuICgoY2hhciAqKSBtRGF0YSlbb2Zmc2V0IC0gMl07Ci0gICAgZWxzZSBpZiAob2Zmc2V0ID09IChzaXplX3QpIChtTGVuZ3RoICsgMikpCi0gICAgICAgIHJldHVybiBtTGVuZ3RoOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vKnN0YXRpYyovCi1zdGQ6OnVuaXF1ZV9wdHI8TkJMb2c6OkFic3RyYWN0RW50cnk+IE5CTG9nOjpBYnN0cmFjdEVudHJ5OjpidWlsZEVudHJ5KGNvbnN0IHVpbnQ4X3QgKnB0cikgewotICAgIGNvbnN0IHVpbnQ4X3QgdHlwZSA9IEVudHJ5SXRlcmF0b3IocHRyKS0+dHlwZTsKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIEVWRU5UX1NUQVJUX0ZNVDoKLSAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8Rm9ybWF0RW50cnk+KEZvcm1hdEVudHJ5KHB0cikpOwotICAgIGNhc2UgRVZFTlRfQVVESU9fU1RBVEU6Ci0gICAgY2FzZSBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFM6Ci0gICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEhpc3RvZ3JhbUVudHJ5PihIaXN0b2dyYW1FbnRyeShwdHIpKTsKLSAgICBkZWZhdWx0OgotICAgICAgICBBTE9HVygiVHJpZWQgdG8gY3JlYXRlIEFic3RyYWN0RW50cnkgb2YgdHlwZSAlZCIsIHR5cGUpOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci19Ci0KLU5CTG9nOjpBYnN0cmFjdEVudHJ5OjpBYnN0cmFjdEVudHJ5KGNvbnN0IHVpbnQ4X3QgKmVudHJ5KSA6IG1FbnRyeShlbnRyeSkgewotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3IgTkJMb2c6OkZvcm1hdEVudHJ5OjpiZWdpbigpIGNvbnN0IHsKLSAgICByZXR1cm4gRW50cnlJdGVyYXRvcihtRW50cnkpOwotfQotCi1jb25zdCBjaGFyICpOQkxvZzo6Rm9ybWF0RW50cnk6OmZvcm1hdFN0cmluZygpIGNvbnN0IHsKLSAgICByZXR1cm4gKGNvbnN0IGNoYXIqKSBtRW50cnkgKyBvZmZzZXRvZihlbnRyeSwgZGF0YSk7Ci19Ci0KLXNpemVfdCBOQkxvZzo6Rm9ybWF0RW50cnk6OmZvcm1hdFN0cmluZ0xlbmd0aCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUVudHJ5W29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXTsKLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3IgTkJMb2c6OkZvcm1hdEVudHJ5OjphcmdzKCkgY29uc3QgewotICAgIGF1dG8gaXQgPSBiZWdpbigpOwotICAgIC8vIHNraXAgc3RhcnQgZm10Ci0gICAgKytpdDsKLSAgICAvLyBza2lwIHRpbWVzdGFtcAotICAgICsraXQ7Ci0gICAgLy8gc2tpcCBoYXNoCi0gICAgKytpdDsKLSAgICAvLyBTa2lwIGF1dGhvciBpZiBwcmVzZW50Ci0gICAgaWYgKGl0LT50eXBlID09IEVWRU5UX0FVVEhPUikgewotICAgICAgICArK2l0OwotICAgIH0KLSAgICByZXR1cm4gaXQ7Ci19Ci0KLWludDY0X3QgTkJMb2c6OkZvcm1hdEVudHJ5Ojp0aW1lc3RhbXAoKSBjb25zdCB7Ci0gICAgYXV0byBpdCA9IGJlZ2luKCk7Ci0gICAgLy8gc2tpcCBzdGFydCBmbXQKLSAgICArK2l0OwotICAgIHJldHVybiBpdC5wYXlsb2FkPGludDY0X3Q+KCk7Ci19Ci0KLU5CTG9nOjpsb2dfaGFzaF90IE5CTG9nOjpGb3JtYXRFbnRyeTo6aGFzaCgpIGNvbnN0IHsKLSAgICBhdXRvIGl0ID0gYmVnaW4oKTsKLSAgICAvLyBza2lwIHN0YXJ0IGZtdAotICAgICsraXQ7Ci0gICAgLy8gc2tpcCB0aW1lc3RhbXAKLSAgICArK2l0OwotICAgIC8vIHVuYWxpZ25lZCA2NC1iaXQgcmVhZCBub3Qgc3VwcG9ydGVkCi0gICAgbG9nX2hhc2hfdCBoYXNoOwotICAgIG1lbWNweSgmaGFzaCwgaXQtPmRhdGEsIHNpemVvZihoYXNoKSk7Ci0gICAgcmV0dXJuIGhhc2g7Ci19Ci0KLWludCBOQkxvZzo6Rm9ybWF0RW50cnk6OmF1dGhvcigpIGNvbnN0IHsKLSAgICBhdXRvIGl0ID0gYmVnaW4oKTsKLSAgICAvLyBza2lwIHN0YXJ0IGZtdAotICAgICsraXQ7Ci0gICAgLy8gc2tpcCB0aW1lc3RhbXAKLSAgICArK2l0OwotICAgIC8vIHNraXAgaGFzaAotICAgICsraXQ7Ci0gICAgLy8gaWYgdGhlcmUgaXMgYW4gYXV0aG9yIGVudHJ5LCByZXR1cm4gaXQsIHJldHVybiAtMSBvdGhlcndpc2UKLSAgICBpZiAoaXQtPnR5cGUgPT0gRVZFTlRfQVVUSE9SKSB7Ci0gICAgICAgIHJldHVybiBpdC5wYXlsb2FkPGludD4oKTsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6Rm9ybWF0RW50cnk6OmNvcHlXaXRoQXV0aG9yKAotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QsIGludCBhdXRob3IpIGNvbnN0IHsKLSAgICBhdXRvIGl0ID0gYmVnaW4oKTsKLSAgICAvLyBjb3B5IGZtdCBzdGFydCBlbnRyeQotICAgIGl0LmNvcHlUbyhkc3QpOwotICAgIC8vIGNvcHkgdGltZXN0YW1wCi0gICAgKCsraXQpLmNvcHlUbyhkc3QpOyAgICAvLyBjb3B5IGhhc2gKLSAgICAoKytpdCkuY29weVRvKGRzdCk7Ci0gICAgLy8gaW5zZXJ0IGF1dGhvciBlbnRyeQotICAgIHNpemVfdCBhdXRob3JFbnRyeVNpemUgPSBOQkxvZzo6RW50cnk6OmtPdmVyaGVhZCArIHNpemVvZihhdXRob3IpOwotICAgIHVpbnQ4X3QgYXV0aG9yRW50cnlbYXV0aG9yRW50cnlTaXplXTsKLSAgICBhdXRob3JFbnRyeVtvZmZzZXRvZihlbnRyeSwgdHlwZSldID0gRVZFTlRfQVVUSE9SOwotICAgIGF1dGhvckVudHJ5W29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSA9Ci0gICAgICAgIGF1dGhvckVudHJ5W2F1dGhvckVudHJ5U2l6ZSArIE5CTG9nOjpFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XSA9Ci0gICAgICAgIHNpemVvZihhdXRob3IpOwotICAgICooaW50KikgKCZhdXRob3JFbnRyeVtvZmZzZXRvZihlbnRyeSwgZGF0YSldKSA9IGF1dGhvcjsKLSAgICBkc3QtPndyaXRlKGF1dGhvckVudHJ5LCBhdXRob3JFbnRyeVNpemUpOwotICAgIC8vIGNvcHkgcmVzdCBvZiBlbnRyaWVzCi0gICAgd2hpbGUgKCgrK2l0KS0+dHlwZSAhPSBFVkVOVF9FTkRfRk1UKSB7Ci0gICAgICAgIGl0LmNvcHlUbyhkc3QpOwotICAgIH0KLSAgICBpdC5jb3B5VG8oZHN0KTsKLSAgICArK2l0OwotICAgIHJldHVybiBpdDsKLX0KLQotdm9pZCBOQkxvZzo6RW50cnlJdGVyYXRvcjo6Y29weVRvKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCkgY29uc3QgewotICAgIHNpemVfdCBsZW5ndGggPSBwdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldICsgTkJMb2c6OkVudHJ5OjprT3ZlcmhlYWQ7Ci0gICAgZHN0LT53cml0ZShwdHIsIGxlbmd0aCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkVudHJ5SXRlcmF0b3I6OmNvcHlEYXRhKHVpbnQ4X3QgKmRzdCkgY29uc3QgewotICAgIG1lbWNweSgodm9pZCopIGRzdCwgcHRyICsgb2Zmc2V0b2YoZW50cnksIGRhdGEpLCBwdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldKTsKLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3I6OkVudHJ5SXRlcmF0b3IoKQotICAgIDogcHRyKG51bGxwdHIpIHt9Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpFbnRyeUl0ZXJhdG9yKGNvbnN0IHVpbnQ4X3QgKmVudHJ5KQotICAgIDogcHRyKGVudHJ5KSB7fQotCi1OQkxvZzo6RW50cnlJdGVyYXRvcjo6RW50cnlJdGVyYXRvcihjb25zdCBOQkxvZzo6RW50cnlJdGVyYXRvciAmb3RoZXIpCi0gICAgOiBwdHIob3RoZXIucHRyKSB7fQotCi1jb25zdCBOQkxvZzo6ZW50cnkmIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvciooKSBjb25zdCB7Ci0gICAgcmV0dXJuICooZW50cnkqKSBwdHI7Ci19Ci0KLWNvbnN0IE5CTG9nOjplbnRyeSogTkJMb2c6OkVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yLT4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIChlbnRyeSopIHB0cjsKLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3ImIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvcisrKCkgewotICAgIHB0ciArPSBwdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldICsgTkJMb2c6OkVudHJ5OjprT3ZlcmhlYWQ7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciYgTkJMb2c6OkVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yLS0oKSB7Ci0gICAgcHRyIC09IHB0cltOQkxvZzo6RW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldF0gKyBOQkxvZzo6RW50cnk6OmtPdmVyaGVhZDsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpuZXh0KCkgY29uc3QgewotICAgIEVudHJ5SXRlcmF0b3IgYXV4KCp0aGlzKTsKLSAgICByZXR1cm4gKythdXg7Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpwcmV2KCkgY29uc3QgewotICAgIEVudHJ5SXRlcmF0b3IgYXV4KCp0aGlzKTsKLSAgICByZXR1cm4gLS1hdXg7Ci19Ci0KLWludCBOQkxvZzo6RW50cnlJdGVyYXRvcjo6b3BlcmF0b3ItKGNvbnN0IE5CTG9nOjpFbnRyeUl0ZXJhdG9yICZvdGhlcikgY29uc3QgewotICAgIHJldHVybiBwdHIgLSBvdGhlci5wdHI7Ci19Ci0KLWJvb2wgTkJMb2c6OkVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yIT0oY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gcHRyICE9IG90aGVyLnB0cjsKLX0KLQotYm9vbCBOQkxvZzo6RW50cnlJdGVyYXRvcjo6aGFzQ29uc2lzdGVudExlbmd0aCgpIGNvbnN0IHsKLSAgICByZXR1cm4gcHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSA9PSBwdHJbcHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSArCi0gICAgICAgIE5CTG9nOjpFbnRyeTo6a092ZXJoZWFkICsgTkJMb2c6OkVudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXRdOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW50NjRfdCBOQkxvZzo6SGlzdG9ncmFtRW50cnk6OnRpbWVzdGFtcCgpIGNvbnN0IHsKLSAgICByZXR1cm4gRW50cnlJdGVyYXRvcihtRW50cnkpLnBheWxvYWQ8SGlzdFRzRW50cnk+KCkudHM7Ci19Ci0KLU5CTG9nOjpsb2dfaGFzaF90IE5CTG9nOjpIaXN0b2dyYW1FbnRyeTo6aGFzaCgpIGNvbnN0IHsKLSAgICByZXR1cm4gRW50cnlJdGVyYXRvcihtRW50cnkpLnBheWxvYWQ8SGlzdFRzRW50cnk+KCkuaGFzaDsKLX0KLQotaW50IE5CTG9nOjpIaXN0b2dyYW1FbnRyeTo6YXV0aG9yKCkgY29uc3QgewotICAgIEVudHJ5SXRlcmF0b3IgaXQobUVudHJ5KTsKLSAgICBpZiAoaXQtPmxlbmd0aCA9PSBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKSkgewotICAgICAgICByZXR1cm4gaXQucGF5bG9hZDxIaXN0VHNFbnRyeVdpdGhBdXRob3I+KCkuYXV0aG9yOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yIE5CTG9nOjpIaXN0b2dyYW1FbnRyeTo6Y29weVdpdGhBdXRob3IoCi0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwgaW50IGF1dGhvcikgY29uc3QgewotICAgIC8vIEN1cnJlbnQgaGlzdG9ncmFtIGVudHJ5IGhhcyB7dHlwZSwgbGVuZ3RoLCBzdHJ1Y3QgSGlzdFRzRW50cnksIGxlbmd0aH0uCi0gICAgLy8gV2Ugbm93IHdhbnQge3R5cGUsIGxlbmd0aCwgc3RydWN0IEhpc3RUc0VudHJ5V2l0aEF1dGhvciwgbGVuZ3RofQotICAgIHVpbnQ4X3QgYnVmZmVyW0VudHJ5OjprT3ZlcmhlYWQgKyBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKV07Ci0gICAgLy8gQ29weSBjb250ZW50IHVudGlsIHRoZSBwb2ludCB3ZSB3YW50IHRvIGFkZCB0aGUgYXV0aG9yCi0gICAgbWVtY3B5KGJ1ZmZlciwgbUVudHJ5LCBzaXplb2YoZW50cnkpICsgc2l6ZW9mKEhpc3RUc0VudHJ5KSk7Ci0gICAgLy8gQ29weSB0aGUgYXV0aG9yCi0gICAgKihpbnQqKSAoYnVmZmVyICsgc2l6ZW9mKGVudHJ5KSArIHNpemVvZihIaXN0VHNFbnRyeSkpID0gYXV0aG9yOwotICAgIC8vIFVwZGF0ZSBsZW5ndGhzCi0gICAgYnVmZmVyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSA9IHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpOwotICAgIGJ1ZmZlcltvZmZzZXRvZihlbnRyeSwgZGF0YSkgKyBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKSArIG9mZnNldG9mKGVuZGluZywgbGVuZ3RoKV0KLSAgICAgICAgPSBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKTsKLSAgICAvLyBXcml0ZSBuZXcgYnVmZmVyIGludG8gRklGTwotICAgIGRzdC0+d3JpdGUoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgcmV0dXJuIEVudHJ5SXRlcmF0b3IobUVudHJ5KS5uZXh0KCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgMCAgIC8vIEZJWE1FIHNlZSBub3RlIGluIE5CTG9nLmgKLU5CTG9nOjpUaW1lbGluZTo6VGltZWxpbmUoc2l6ZV90IHNpemUsIHZvaWQgKnNoYXJlZCkKLSAgICA6IG1TaXplKHJvdW5kdXAoc2l6ZSkpLCBtT3duKHNoYXJlZCA9PSBOVUxMKSwKLSAgICAgIG1TaGFyZWQoKFNoYXJlZCAqKSAobU93biA/IG5ldyBjaGFyW3NoYXJlZFNpemUoc2l6ZSldIDogc2hhcmVkKSkKLXsKLSAgICBuZXcgKG1TaGFyZWQpIFNoYXJlZDsKLX0KLQotTkJMb2c6OlRpbWVsaW5lOjp+VGltZWxpbmUoKQotewotICAgIG1TaGFyZWQtPn5TaGFyZWQoKTsKLSAgICBpZiAobU93bikgewotICAgICAgICBkZWxldGVbXSAoY2hhciAqKSBtU2hhcmVkOwotICAgIH0KLX0KLSNlbmRpZgotCi0vKnN0YXRpYyovCi1zaXplX3QgTkJMb2c6OlRpbWVsaW5lOjpzaGFyZWRTaXplKHNpemVfdCBzaXplKQotewotICAgIC8vIFRPRE8gZmlmbyBub3cgc3VwcG9ydHMgbm9uLXBvd2VyLW9mLTIgYnVmZmVyIHNpemVzLCBzbyBjb3VsZCByZW1vdmUgdGhlIHJvdW5kdXAKLSAgICByZXR1cm4gc2l6ZW9mKFNoYXJlZCkgKyByb3VuZHVwKHNpemUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTkJMb2c6OldyaXRlcjo6V3JpdGVyKCkKLSAgICA6IG1TaGFyZWQoTlVMTCksIG1GaWZvKE5VTEwpLCBtRmlmb1dyaXRlcihOVUxMKSwgbUVuYWJsZWQoZmFsc2UpLCBtUGlkVGFnKE5VTEwpLCBtUGlkVGFnU2l6ZSgwKQotewotfQotCi1OQkxvZzo6V3JpdGVyOjpXcml0ZXIodm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSkKLSAgICA6IG1TaGFyZWQoKFNoYXJlZCAqKSBzaGFyZWQpLAotICAgICAgbUZpZm8obVNoYXJlZCAhPSBOVUxMID8KLSAgICAgICAgbmV3IGF1ZGlvX3V0aWxzX2ZpZm8oc2l6ZSwgc2l6ZW9mKHVpbnQ4X3QpLAotICAgICAgICAgICAgbVNoYXJlZC0+bUJ1ZmZlciwgbVNoYXJlZC0+bVJlYXIsIE5VTEwgLyp0aHJvdHRsZXNGcm9udCovKSA6IE5VTEwpLAotICAgICAgbUZpZm9Xcml0ZXIobUZpZm8gIT0gTlVMTCA/IG5ldyBhdWRpb191dGlsc19maWZvX3dyaXRlcigqbUZpZm8pIDogTlVMTCksCi0gICAgICBtRW5hYmxlZChtRmlmb1dyaXRlciAhPSBOVUxMKQotewotICAgIC8vIGNhY2hpbmcgcGlkIGFuZCBwcm9jZXNzIG5hbWUKLSAgICBwaWRfdCBpZCA9IDo6Z2V0cGlkKCk7Ci0gICAgY2hhciBwcm9jTmFtZVsxNl07Ci0gICAgaW50IHN0YXR1cyA9IHByY3RsKFBSX0dFVF9OQU1FLCBwcm9jTmFtZSk7Ci0gICAgaWYgKHN0YXR1cykgeyAgLy8gZXJyb3IgZ2V0dGluZyBwcm9jZXNzIG5hbWUKLSAgICAgICAgcHJvY05hbWVbMF0gPSAnXDAnOwotICAgIH0KLSAgICBzaXplX3QgbGVuZ3RoID0gc3RybGVuKHByb2NOYW1lKTsKLSAgICBtUGlkVGFnU2l6ZSA9IGxlbmd0aCArIHNpemVvZihwaWRfdCk7Ci0gICAgbVBpZFRhZyA9IG5ldyBjaGFyW21QaWRUYWdTaXplXTsKLSAgICBtZW1jcHkobVBpZFRhZywgJmlkLCBzaXplb2YocGlkX3QpKTsKLSAgICBtZW1jcHkobVBpZFRhZyArIHNpemVvZihwaWRfdCksIHByb2NOYW1lLCBsZW5ndGgpOwotfQotCi1OQkxvZzo6V3JpdGVyOjpXcml0ZXIoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnksIHNpemVfdCBzaXplKQotICAgIDogV3JpdGVyKGlNZW1vcnkgIT0gMCA/IChTaGFyZWQgKikgaU1lbW9yeS0+cG9pbnRlcigpIDogTlVMTCwgc2l6ZSkKLXsKLSAgICBtSU1lbW9yeSA9IGlNZW1vcnk7Ci19Ci0KLU5CTG9nOjpXcml0ZXI6On5Xcml0ZXIoKQotewotICAgIGRlbGV0ZSBtRmlmb1dyaXRlcjsKLSAgICBkZWxldGUgbUZpZm87Ci0gICAgZGVsZXRlW10gbVBpZFRhZzsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2coY29uc3QgY2hhciAqc3RyaW5nKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHN0cmluZyA9PSBOVUxMLCAiQXR0ZW1wdGVkIHRvIGxvZyBOVUxMIHN0cmluZyIpOwotICAgIHNpemVfdCBsZW5ndGggPSBzdHJsZW4oc3RyaW5nKTsKLSAgICBpZiAobGVuZ3RoID4gRW50cnk6OmtNYXhMZW5ndGgpIHsKLSAgICAgICAgbGVuZ3RoID0gRW50cnk6OmtNYXhMZW5ndGg7Ci0gICAgfQotICAgIGxvZyhFVkVOVF9TVFJJTkcsIHN0cmluZywgbGVuZ3RoKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB2YV9saXN0IGFwOwotICAgIHZhX3N0YXJ0KGFwLCBmbXQpOwotICAgIFdyaXRlcjo6bG9ndmYoZm10LCBhcCk7ICAgICAvLyB0aGUgV3JpdGVyOjogaXMgbmVlZGVkIHRvIGF2b2lkIHZpcnR1YWwgZGlzcGF0Y2ggZm9yIExvY2tlZFdyaXRlcgotICAgIHZhX2VuZChhcCk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9ndmYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjaGFyIGJ1ZmZlcltFbnRyeTo6a01heExlbmd0aCArIDEgLypOVUwqL107Ci0gICAgaW50IGxlbmd0aCA9IHZzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCBmbXQsIGFwKTsKLSAgICBpZiAobGVuZ3RoID49IChpbnQpIHNpemVvZihidWZmZXIpKSB7Ci0gICAgICAgIGxlbmd0aCA9IHNpemVvZihidWZmZXIpIC0gMTsKLSAgICAgICAgLy8gTlVMIHRlcm1pbmF0aW9uIGlzIG5vdCByZXF1aXJlZAotICAgICAgICAvLyBidWZmZXJbbGVuZ3RoXSA9ICdcMCc7Ci0gICAgfQotICAgIGlmIChsZW5ndGggPj0gMCkgewotICAgICAgICBsb2coRVZFTlRfU1RSSU5HLCBidWZmZXIsIGxlbmd0aCk7Ci0gICAgfQotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ1RpbWVzdGFtcCgpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGludDY0X3QgdHMgPSBnZXRfbW9ub3RvbmljX25zKCk7Ci0gICAgaWYgKHRzID4gMCkgewotICAgICAgICBsb2coRVZFTlRfVElNRVNUQU1QLCAmdHMsIHNpemVvZih0cykpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IHRpbWVzdGFtcCIpOwotICAgIH0KLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dUaW1lc3RhbXAoY29uc3QgaW50NjRfdCB0cykKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbG9nKEVWRU5UX1RJTUVTVEFNUCwgJnRzLCBzaXplb2YodHMpKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dJbnRlZ2VyKGNvbnN0IGludCB4KQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsb2coRVZFTlRfSU5URUdFUiwgJngsIHNpemVvZih4KSk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nRmxvYXQoY29uc3QgZmxvYXQgeCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbG9nKEVWRU5UX0ZMT0FULCAmeCwgc2l6ZW9mKHgpKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dQSUQoKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsb2coRVZFTlRfUElELCBtUGlkVGFnLCBtUGlkVGFnU2l6ZSk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nU3RhcnQoY29uc3QgY2hhciAqZm10KQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzaXplX3QgbGVuZ3RoID0gc3RybGVuKGZtdCk7Ci0gICAgaWYgKGxlbmd0aCA+IEVudHJ5OjprTWF4TGVuZ3RoKSB7Ci0gICAgICAgIGxlbmd0aCA9IEVudHJ5OjprTWF4TGVuZ3RoOwotICAgIH0KLSAgICBsb2coRVZFTlRfU1RBUlRfRk1ULCBmbXQsIGxlbmd0aCk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nRW5kKCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRW50cnkgZW50cnkgPSBFbnRyeShFVkVOVF9FTkRfRk1ULCBOVUxMLCAwKTsKLSAgICBsb2coJmVudHJ5LCB0cnVlKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dIYXNoKGxvZ19oYXNoX3QgaGFzaCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbG9nKEVWRU5UX0hBU0gsICZoYXNoLCBzaXplb2YoaGFzaCkpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0V2ZW50SGlzdFRzKEV2ZW50IGV2ZW50LCBsb2dfaGFzaF90IGhhc2gpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEhpc3RUc0VudHJ5IGRhdGE7Ci0gICAgZGF0YS5oYXNoID0gaGFzaDsKLSAgICBkYXRhLnRzID0gZ2V0X21vbm90b25pY19ucygpOwotICAgIGlmIChkYXRhLnRzID4gMCkgewotICAgICAgICBsb2coZXZlbnQsICZkYXRhLCBzaXplb2YoZGF0YSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IHRpbWVzdGFtcCIpOwotICAgIH0KLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dGb3JtYXQoY29uc3QgY2hhciAqZm10LCBsb2dfaGFzaF90IGhhc2gsIC4uLikKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB2YV9saXN0IGFwOwotICAgIHZhX3N0YXJ0KGFwLCBoYXNoKTsKLSAgICBXcml0ZXI6OmxvZ1ZGb3JtYXQoZm10LCBoYXNoLCBhcCk7Ci0gICAgdmFfZW5kKGFwKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dWRm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgbG9nX2hhc2hfdCBoYXNoLCB2YV9saXN0IGFyZ3ApCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIFdyaXRlcjo6bG9nU3RhcnQoZm10KTsKLSAgICBpbnQgaTsKLSAgICBkb3VibGUgZjsKLSAgICBjaGFyKiBzOwotICAgIGludDY0X3QgdDsKLSAgICBXcml0ZXI6OmxvZ1RpbWVzdGFtcCgpOwotICAgIFdyaXRlcjo6bG9nSGFzaChoYXNoKTsKLSAgICBmb3IgKGNvbnN0IGNoYXIgKnAgPSBmbXQ7ICpwICE9ICdcMCc7IHArKykgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgbW9yZSBjb21wbGV4IGZvcm1hdHRpbmcgc3VjaCBhcyAlLjNmCi0gICAgICAgIGlmICgqcCAhPSAnJScpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCgqKytwKSB7Ci0gICAgICAgIGNhc2UgJ3MnOiAvLyBzdHJpbmcKLSAgICAgICAgICAgIHMgPSB2YV9hcmcoYXJncCwgY2hhciAqKTsKLSAgICAgICAgICAgIFdyaXRlcjo6bG9nKHMpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAndCc6IC8vIHRpbWVzdGFtcAotICAgICAgICAgICAgdCA9IHZhX2FyZyhhcmdwLCBpbnQ2NF90KTsKLSAgICAgICAgICAgIFdyaXRlcjo6bG9nVGltZXN0YW1wKHQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnZCc6IC8vIGludGVnZXIKLSAgICAgICAgICAgIGkgPSB2YV9hcmcoYXJncCwgaW50KTsKLSAgICAgICAgICAgIFdyaXRlcjo6bG9nSW50ZWdlcihpKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ2YnOiAvLyBmbG9hdAotICAgICAgICAgICAgZiA9IHZhX2FyZyhhcmdwLCBkb3VibGUpOyAvLyBmbG9hdCBhcmd1bWVudHMgYXJlIHByb21vdGVkIHRvIGRvdWJsZSBpbiB2YXJhcmcgbGlzdHMKLSAgICAgICAgICAgIFdyaXRlcjo6bG9nRmxvYXQoKGZsb2F0KWYpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAncCc6IC8vIHBpZAotICAgICAgICAgICAgV3JpdGVyOjpsb2dQSUQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8vIHRoZSAiJVwwIiBjYXNlIGZpbmlzaGVzIHBhcnNpbmcKLSAgICAgICAgY2FzZSAnXDAnOgotICAgICAgICAgICAgLS1wOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnJSc6Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1coIk5CTG9nIFdyaXRlciBwYXJzZWQgaW52YWxpZCBmb3JtYXQgc3BlY2lmaWVyOiAlYyIsICpwKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIFdyaXRlcjo6bG9nRW5kKCk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nKEV2ZW50IGV2ZW50LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoZGF0YSA9PSBOVUxMIHx8IGxlbmd0aCA+IEVudHJ5OjprTWF4TGVuZ3RoKSB7Ci0gICAgICAgIC8vIFRPRE8gUGVyaGFwcyBpdCBtYWtlcyBzZW5zZSB0byBkaXNwbGF5IHRydW5jYXRlZCBkYXRhIG9yIGF0IGxlYXN0IGEKLSAgICAgICAgLy8gICAgICBtZXNzYWdlIHRoYXQgdGhlIGRhdGEgaXMgdG9vIGxvbmc/ICBUaGUgY3VycmVudCBiZWhhdmlvciBjYW4gY3JlYXRlCi0gICAgICAgIC8vICAgICAgYSBjb25mdXNpb24gZm9yIGEgcHJvZ3JhbW1lciBkZWJ1Z2dpbmcgdGhlaXIgY29kZS4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBJZ25vcmUgaWYgaW52YWxpZCBldmVudAotICAgIGlmIChldmVudCA9PSBFVkVOVF9SRVNFUlZFRCB8fCBldmVudCA+PSBFVkVOVF9VUFBFUl9CT1VORCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEVudHJ5IGV0cihldmVudCwgZGF0YSwgbGVuZ3RoKTsKLSAgICBsb2coJmV0ciwgdHJ1ZSAvKnRydXN0ZWQqLyk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nKGNvbnN0IE5CTG9nOjpFbnRyeSAqZXRyLCBib29sIHRydXN0ZWQpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICghdHJ1c3RlZCkgewotICAgICAgICBsb2coZXRyLT5tRXZlbnQsIGV0ci0+bURhdGEsIGV0ci0+bUxlbmd0aCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc2l6ZV90IG5lZWQgPSBldHItPm1MZW5ndGggKyBFbnRyeTo6a092ZXJoZWFkOyAgICAvLyBtRXZlbnQsIG1MZW5ndGgsIGRhdGFbbUxlbmd0aF0sIG1MZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgPSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byBGSUZPCi0KLSAgICAvLyBGSVhNRSBvcHRpbWl6ZSB0aGlzIHVzaW5nIG1lbWNweSBmb3IgdGhlIGRhdGEgcGFydCBvZiB0aGUgRW50cnkuCi0gICAgLy8gVGhlIEVudHJ5IGNvdWxkIGhhdmUgYSBtZXRob2QgY29weVRvKHB0ciwgb2Zmc2V0LCBzaXplKSB0byBvcHRpbWl6ZSB0aGUgY29weS4KLSAgICAvLyBjaGVja3Mgc2l6ZSBvZiBhIHNpbmdsZSBsb2cgRW50cnk6IHR5cGUsIGxlbmd0aCwgZGF0YSBwb2ludGVyIGFuZCBlbmRpbmcKLSAgICB1aW50OF90IHRlbXBbRW50cnk6OmtNYXhMZW5ndGggKyBFbnRyeTo6a092ZXJoZWFkXTsKLSAgICAvLyB3cml0ZSB0aGlzIGRhdGEgdG8gdGVtcCBhcnJheQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmVlZDsgaSsrKSB7Ci0gICAgICAgIHRlbXBbaV0gPSBldHItPmNvcHlFbnRyeURhdGFBdChpKTsKLSAgICB9Ci0gICAgLy8gd3JpdGUgdG8gY2lyY3VsYXIgYnVmZmVyCi0gICAgbUZpZm9Xcml0ZXItPndyaXRlKHRlbXAsIG5lZWQpOwotfQotCi1ib29sIE5CTG9nOjpXcml0ZXI6OmlzRW5hYmxlZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1FbmFibGVkOwotfQotCi1ib29sIE5CTG9nOjpXcml0ZXI6OnNldEVuYWJsZWQoYm9vbCBlbmFibGVkKQotewotICAgIGJvb2wgb2xkID0gbUVuYWJsZWQ7Ci0gICAgbUVuYWJsZWQgPSBlbmFibGVkICYmIG1TaGFyZWQgIT0gTlVMTDsKLSAgICByZXR1cm4gb2xkOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTkJMb2c6OkxvY2tlZFdyaXRlcjo6TG9ja2VkV3JpdGVyKCkKLSAgICA6IFdyaXRlcigpCi17Ci19Ci0KLU5CTG9nOjpMb2NrZWRXcml0ZXI6OkxvY2tlZFdyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKQotICAgIDogV3JpdGVyKHNoYXJlZCwgc2l6ZSkKLXsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2coY29uc3QgY2hhciAqc3RyaW5nKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2coc3RyaW5nKTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotICAgIC8vIEZJWE1FIHNob3VsZCBub3QgdGFrZSB0aGUgbG9jayB1bnRpbCBhZnRlciBmb3JtYXR0aW5nIGlzIGRvbmUKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHZhX2xpc3QgYXA7Ci0gICAgdmFfc3RhcnQoYXAsIGZtdCk7Ci0gICAgV3JpdGVyOjpsb2d2ZihmbXQsIGFwKTsKLSAgICB2YV9lbmQoYXApOwotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ3ZmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKLXsKLSAgICAvLyBGSVhNRSBzaG91bGQgbm90IHRha2UgdGhlIGxvY2sgdW50aWwgYWZ0ZXIgZm9ybWF0dGluZyBpcyBkb25lCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ3ZmKGZtdCwgYXApOwotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ1RpbWVzdGFtcCgpCi17Ci0gICAgLy8gRklYTUUgc2hvdWxkIG5vdCB0YWtlIHRoZSBsb2NrIHVudGlsIGFmdGVyIHRoZSBjbG9ja19nZXR0aW1lKCkgc3lzY2FsbAotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2dUaW1lc3RhbXAoKTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dUaW1lc3RhbXAoY29uc3QgaW50NjRfdCB0cykKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nVGltZXN0YW1wKHRzKTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dJbnRlZ2VyKGNvbnN0IGludCB4KQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2dJbnRlZ2VyKHgpOwotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ0Zsb2F0KGNvbnN0IGZsb2F0IHgpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ0Zsb2F0KHgpOwotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ1BJRCgpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ1BJRCgpOwotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ1N0YXJ0KGNvbnN0IGNoYXIgKmZtdCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nU3RhcnQoZm10KTsKLX0KLQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ0VuZCgpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ0VuZCgpOwotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ0hhc2gobG9nX2hhc2hfdCBoYXNoKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2dIYXNoKGhhc2gpOwotfQotCi1ib29sIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmlzRW5hYmxlZCgpIGNvbnN0Ci17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gV3JpdGVyOjppc0VuYWJsZWQoKTsKLX0KLQotYm9vbCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBXcml0ZXI6OnNldEVuYWJsZWQoZW5hYmxlZCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jb25zdCBzdGQ6OnNldDxOQkxvZzo6RXZlbnQ+IE5CTG9nOjpSZWFkZXI6OnN0YXJ0aW5nVHlwZXMge05CTG9nOjpFdmVudDo6RVZFTlRfU1RBUlRfRk1ULAotICAgICAgICBOQkxvZzo6RXZlbnQ6OkVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywKLSAgICAgICAgTkJMb2c6OkV2ZW50OjpFVkVOVF9BVURJT19TVEFURX07Ci1jb25zdCBzdGQ6OnNldDxOQkxvZzo6RXZlbnQ+IE5CTG9nOjpSZWFkZXI6OmVuZGluZ1R5cGVzICAge05CTG9nOjpFdmVudDo6RVZFTlRfRU5EX0ZNVCwKLSAgICAgICAgTkJMb2c6OkV2ZW50OjpFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFMsCi0gICAgICAgIE5CTG9nOjpFdmVudDo6RVZFTlRfQVVESU9fU1RBVEV9OwotCi1OQkxvZzo6UmVhZGVyOjpSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSkKLSAgICA6IG1GZCgtMSksIG1JbmRlbnQoMCksIG1Mb3N0KDApLAotICAgICAgbVNoYXJlZCgoLypjb25zdCovIFNoYXJlZCAqKSBzaGFyZWQpLCAvKm1JTWVtb3J5Ki8KLSAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/Ci0gICAgICAgIG5ldyBhdWRpb191dGlsc19maWZvKHNpemUsIHNpemVvZih1aW50OF90KSwKLSAgICAgICAgICAgIG1TaGFyZWQtPm1CdWZmZXIsIG1TaGFyZWQtPm1SZWFyLCBOVUxMIC8qdGhyb3R0bGVzRnJvbnQqLykgOiBOVUxMKSwKLSAgICAgIG1GaWZvUmVhZGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIoKm1GaWZvKSA6IE5VTEwpCi17Ci19Ci0KLU5CTG9nOjpSZWFkZXI6OlJlYWRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUpCi0gICAgOiBSZWFkZXIoaU1lbW9yeSAhPSAwID8gKFNoYXJlZCAqKSBpTWVtb3J5LT5wb2ludGVyKCkgOiBOVUxMLCBzaXplKQotewotICAgIG1JTWVtb3J5ID0gaU1lbW9yeTsKLX0KLQotTkJMb2c6OlJlYWRlcjo6flJlYWRlcigpCi17Ci0gICAgZGVsZXRlIG1GaWZvUmVhZGVyOwotICAgIGRlbGV0ZSBtRmlmbzsKLX0KLQotY29uc3QgdWludDhfdCAqTkJMb2c6OlJlYWRlcjo6ZmluZExhc3RFbnRyeU9mVHlwZXMoY29uc3QgdWludDhfdCAqZnJvbnQsIGNvbnN0IHVpbnQ4X3QgKmJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PEV2ZW50PiAmdHlwZXMpIHsKLSAgICB3aGlsZSAoYmFjayArIEVudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXQgPj0gZnJvbnQpIHsKLSAgICAgICAgY29uc3QgdWludDhfdCAqcHJldiA9IGJhY2sgLSBiYWNrW0VudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXRdIC0gRW50cnk6OmtPdmVyaGVhZDsKLSAgICAgICAgaWYgKHByZXYgPCBmcm9udCB8fCBwcmV2ICsgcHJldltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudHJ5OjprT3ZlcmhlYWQgIT0gYmFjaykgewotCi0gICAgICAgICAgICAvLyBwcmV2IHBvaW50cyB0byBhbiBvdXQgb2YgbGltaXRzIG9yIGluY29uc2lzdGVudCBlbnRyeQotICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHR5cGVzLmZpbmQoKGNvbnN0IEV2ZW50KSBwcmV2W29mZnNldG9mKGVudHJ5LCB0eXBlKV0pICE9IHR5cGVzLmVuZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJldjsKLSAgICAgICAgfQotICAgICAgICBiYWNrID0gcHJldjsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGxwdHI7IC8vIG5vIGVudHJ5IGZvdW5kCi19Ci0KLS8vIENvcGllcyBjb250ZW50IG9mIGEgUmVhZGVyIEZJRk8gaW50byBpdHMgU25hcHNob3QKLS8vIFRoZSBTbmFwc2hvdCBoYXMgdGhlIHNhbWUgcmF3IGRhdGEsIGJ1dCByZXByZXNlbnRlZCBhcyBhIHNlcXVlbmNlIG9mIGVudHJpZXMKLS8vIGFuZCBhbiBFbnRyeUl0ZXJhdG9yIG1ha2luZyBpdCBwb3NzaWJsZSB0byBwcm9jZXNzIHRoZSBkYXRhLgotc3RkOjp1bmlxdWVfcHRyPE5CTG9nOjpSZWFkZXI6OlNuYXBzaG90PiBOQkxvZzo6UmVhZGVyOjpnZXRTbmFwc2hvdCgpCi17Ci0gICAgaWYgKG1GaWZvUmVhZGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxOQkxvZzo6UmVhZGVyOjpTbmFwc2hvdD4obmV3IFNuYXBzaG90KCkpOwotICAgIH0KLSAgICAvLyBtYWtlIGEgY29weSB0byBhdm9pZCByYWNlIGNvbmRpdGlvbiB3aXRoIHdyaXRlcgotICAgIHNpemVfdCBjYXBhY2l0eSA9IG1GaWZvLT5jYXBhY2l0eSgpOwotCi0gICAgLy8gVGhpcyBlbXVsYXRlcyB0aGUgYmVoYXZpb3VyIG9mIGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyOjpyZWFkLCBidXQgd2l0aG91dCBpbmNyZW1lbnRpbmcgdGhlCi0gICAgLy8gcmVhZGVyIGluZGV4LiBUaGUgaW5kZXggaXMgaW5jcmVtZW50ZWQgYWZ0ZXIgaGFuZGxpbmcgY29ycnVwdGlvbiwgdG8gYWZ0ZXIgdGhlIGxhc3QgY29tcGxldGUKLSAgICAvLyBlbnRyeSBvZiB0aGUgYnVmZmVyCi0gICAgc2l6ZV90IGxvc3Q7Ci0gICAgYXVkaW9fdXRpbHNfaW92ZWMgaW92ZWNbMl07Ci0gICAgc3NpemVfdCBhdmFpbFRvUmVhZCA9IG1GaWZvUmVhZGVyLT5vYnRhaW4oaW92ZWMsIGNhcGFjaXR5LCBOVUxMIC8qdGltZW91dCovLCAmbG9zdCk7Ci0gICAgaWYgKGF2YWlsVG9SZWFkIDw9IDApIHsKLSAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxOQkxvZzo6UmVhZGVyOjpTbmFwc2hvdD4obmV3IFNuYXBzaG90KCkpOwotICAgIH0KLQotICAgIHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4gc25hcHNob3QobmV3IFNuYXBzaG90KGF2YWlsVG9SZWFkKSk7Ci0gICAgbWVtY3B5KHNuYXBzaG90LT5tRGF0YSwgKGNvbnN0IGNoYXIgKikgbUZpZm8tPmJ1ZmZlcigpICsgaW92ZWNbMF0ubU9mZnNldCwgaW92ZWNbMF0ubUxlbmd0aCk7Ci0gICAgaWYgKGlvdmVjWzFdLm1MZW5ndGggPiAwKSB7Ci0gICAgICAgIG1lbWNweShzbmFwc2hvdC0+bURhdGEgKyAoaW92ZWNbMF0ubUxlbmd0aCksCi0gICAgICAgICAgICAoY29uc3QgY2hhciAqKSBtRmlmby0+YnVmZmVyKCkgKyBpb3ZlY1sxXS5tT2Zmc2V0LCBpb3ZlY1sxXS5tTGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvLyBIYW5kbGUgY29ycnVwdGVkIGJ1ZmZlcgotICAgIC8vIFBvdGVudGlhbGx5LCBhIGJ1ZmZlciBoYXMgY29ycnVwdGVkIGRhdGEgb24gYm90aCBiZWdpbm5pbmcgKGR1ZSB0byBvdmVyZmxvdykgYW5kIGVuZAotICAgIC8vIChkdWUgdG8gaW5jb21wbGV0ZSBmb3JtYXQgZW50cnkpLiBCdXQgZXZlbiBpZiB0aGUgZW5kIGZvcm1hdCBlbnRyeSBpcyBpbmNvbXBsZXRlLAotICAgIC8vIGl0IGVuZHMgaW4gYSBjb21wbGV0ZSBlbnRyeSAod2hpY2ggaXMgbm90IGFuIEVORF9GTVQpLiBTbyBpcyBzYWZlIHRvIHRyYXZlcnNlIGJhY2t3YXJkcy4KLSAgICAvLyBUT0RPOiBoYW5kbGUgY2xpZW50IGNvcnJ1cHRpb24gKGluIHRoZSBtaWRkbGUgb2YgYSBidWZmZXIpCi0KLSAgICBjb25zdCB1aW50OF90ICpiYWNrID0gc25hcHNob3QtPm1EYXRhICsgYXZhaWxUb1JlYWQ7Ci0gICAgY29uc3QgdWludDhfdCAqZnJvbnQgPSBzbmFwc2hvdC0+bURhdGE7Ci0KLSAgICAvLyBGaW5kIGxhc3QgRU5EX0ZNVC4gPGJhY2s+IGlzIHNpdHRpbmcgb24gYW4gZW50cnkgd2hpY2ggbWlnaHQgYmUgdGhlIG1pZGRsZSBvZiBhIEZvcm1hdEVudHJ5LgotICAgIC8vIFdlIGdvIGJhY2t3YXJkcyB1bnRpbCB3ZSBmaW5kIGFuIEVWRU5UX0VORF9GTVQuCi0gICAgY29uc3QgdWludDhfdCAqbGFzdEVuZCA9IGZpbmRMYXN0RW50cnlPZlR5cGVzKGZyb250LCBiYWNrLCBlbmRpbmdUeXBlcyk7Ci0gICAgaWYgKGxhc3RFbmQgPT0gbnVsbHB0cikgewotICAgICAgICBzbmFwc2hvdC0+bUVuZCA9IHNuYXBzaG90LT5tQmVnaW4gPSBFbnRyeUl0ZXJhdG9yKGZyb250KTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBlbmQgb2Ygc25hcHNob3QgcG9pbnRzIHRvIGFmdGVyIGxhc3QgRU5EX0ZNVCBlbnRyeQotICAgICAgICBzbmFwc2hvdC0+bUVuZCA9IEVudHJ5SXRlcmF0b3IobGFzdEVuZCkubmV4dCgpOwotICAgICAgICAvLyBmaW5kIGZpcnN0IFNUQVJUX0ZNVAotICAgICAgICBjb25zdCB1aW50OF90ICpmaXJzdFN0YXJ0ID0gbnVsbHB0cjsKLSAgICAgICAgY29uc3QgdWludDhfdCAqZmlyc3RTdGFydFRtcCA9IHNuYXBzaG90LT5tRW5kOwotICAgICAgICB3aGlsZSAoKGZpcnN0U3RhcnRUbXAgPSBmaW5kTGFzdEVudHJ5T2ZUeXBlcyhmcm9udCwgZmlyc3RTdGFydFRtcCwgc3RhcnRpbmdUeXBlcykpCi0gICAgICAgICAgICAgICAgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgZmlyc3RTdGFydCA9IGZpcnN0U3RhcnRUbXA7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZmlyc3RTdGFydCBpcyBudWxsIGlmIG5vIFNUQVJUX0ZNVCBlbnRyeSB3YXMgZm91bmQgYmVmb3JlIGxhc3RFbmQKLSAgICAgICAgaWYgKGZpcnN0U3RhcnQgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgc25hcHNob3QtPm1CZWdpbiA9IHNuYXBzaG90LT5tRW5kOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc25hcHNob3QtPm1CZWdpbiA9IEVudHJ5SXRlcmF0b3IoZmlyc3RTdGFydCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBhZHZhbmNlIGZpZm8gcmVhZGVyIGluZGV4IHRvIGFmdGVyIGxhc3QgZW50cnkgcmVhZC4KLSAgICBtRmlmb1JlYWRlci0+cmVsZWFzZShzbmFwc2hvdC0+bUVuZCAtIGZyb250KTsKLQotICAgIHNuYXBzaG90LT5tTG9zdCA9IGxvc3Q7Ci0gICAgcmV0dXJuIHNuYXBzaG90OwotCi19Ci0KLS8vIFRha2VzIHJhdyBjb250ZW50IG9mIHRoZSBsb2NhbCBtZXJnZXIgRklGTywgcHJvY2Vzc2VzIGxvZyBlbnRyaWVzLCBhbmQKLS8vIHdyaXRlcyB0aGUgZGF0YSB0byBhIG1hcCBvZiBjbGFzcyBQZXJmb3JtYW5jZUFuYWx5c2lzLCBiYXNlZCBvbiB0aGVpciB0aHJlYWQgSUQuCi12b2lkIE5CTG9nOjpNZXJnZVJlYWRlcjo6Z2V0QW5kUHJvY2Vzc1NuYXBzaG90KE5CTG9nOjpSZWFkZXI6OlNuYXBzaG90ICZzbmFwc2hvdCkKLXsKLSAgICBTdHJpbmc4IHRpbWVzdGFtcCwgYm9keTsKLQotICAgIGZvciAoYXV0byBlbnRyeSA9IHNuYXBzaG90LmJlZ2luKCk7IGVudHJ5ICE9IHNuYXBzaG90LmVuZCgpOykgewotICAgICAgICBzd2l0Y2ggKGVudHJ5LT50eXBlKSB7Ci0gICAgICAgIGNhc2UgRVZFTlRfU1RBUlRfRk1UOgotICAgICAgICAgICAgZW50cnkgPSBoYW5kbGVGb3JtYXQoRm9ybWF0RW50cnkoZW50cnkpLCAmdGltZXN0YW1wLCAmYm9keSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFM6IHsKLSAgICAgICAgICAgIEhpc3RUc0VudHJ5V2l0aEF1dGhvciAqZGF0YSA9IChIaXN0VHNFbnRyeVdpdGhBdXRob3IgKikgKGVudHJ5LT5kYXRhKTsKLSAgICAgICAgICAgIC8vIFRPRE8gVGhpcyBtZW1jcGllcyBhcmUgaGVyZSB0byBhdm9pZCB1bmFsaWduZWQgbWVtb3J5IGFjY2VzcyBjcmFzaC4KLSAgICAgICAgICAgIC8vIFRoZXJlJ3MgcHJvYmFibHkgYSBtb3JlIGVmZmljaWVudCB3YXkgdG8gZG8gaXQKLSAgICAgICAgICAgIGxvZ19oYXNoX3QgaGFzaDsKLSAgICAgICAgICAgIG1lbWNweSgmaGFzaCwgJihkYXRhLT5oYXNoKSwgc2l6ZW9mKGhhc2gpKTsKLSAgICAgICAgICAgIGludDY0X3QgdHM7Ci0gICAgICAgICAgICBtZW1jcHkoJnRzLCAmZGF0YS0+dHMsIHNpemVvZih0cykpOwotICAgICAgICAgICAgLy8gVE9ETzogaGFzaCBmb3IgaGlzdG9ncmFtIHRzIGFuZCBhdWRpbyBzdGF0ZSBuZWVkIHRvIG1hdGNoCi0gICAgICAgICAgICAvLyBhbmQgY29ycmVzcG9uZCB0byBhdWRpbyBwcm9kdWN0aW9uIHNvdXJjZSBmaWxlIGxvY2F0aW9uCi0gICAgICAgICAgICBtVGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpc1tkYXRhLT5hdXRob3JdWzAgLypoYXNoKi9dLmxvZ1RzRW50cnkodHMpOwotICAgICAgICAgICAgKytlbnRyeTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRVZFTlRfQVVESU9fU1RBVEU6IHsKLSAgICAgICAgICAgIEhpc3RUc0VudHJ5V2l0aEF1dGhvciAqZGF0YSA9IChIaXN0VHNFbnRyeVdpdGhBdXRob3IgKikgKGVudHJ5LT5kYXRhKTsKLSAgICAgICAgICAgIC8vIFRPRE8gVGhpcyBtZW1jcGllcyBhcmUgaGVyZSB0byBhdm9pZCB1bmFsaWduZWQgbWVtb3J5IGFjY2VzcyBjcmFzaC4KLSAgICAgICAgICAgIC8vIFRoZXJlJ3MgcHJvYmFibHkgYSBtb3JlIGVmZmljaWVudCB3YXkgdG8gZG8gaXQKLSAgICAgICAgICAgIGxvZ19oYXNoX3QgaGFzaDsKLSAgICAgICAgICAgIG1lbWNweSgmaGFzaCwgJihkYXRhLT5oYXNoKSwgc2l6ZW9mKGhhc2gpKTsKLSAgICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSB0cyBpZiB1bnVzZWQKLSAgICAgICAgICAgIGludDY0X3QgdHM7Ci0gICAgICAgICAgICBtZW1jcHkoJnRzLCAmZGF0YS0+dHMsIHNpemVvZih0cykpOwotICAgICAgICAgICAgbVRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXNbZGF0YS0+YXV0aG9yXVswIC8qaGFzaCovXS5oYW5kbGVTdGF0ZUNoYW5nZSgpOwotICAgICAgICAgICAgKytlbnRyeTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRVZFTlRfRU5EX0ZNVDoKLSAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJ3YXJuaW5nOiBnb3QgdG8gZW5kIGZvcm1hdCBldmVudCIpOwotICAgICAgICAgICAgKytlbnRyeTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVWRU5UX1JFU0VSVkVEOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIndhcm5pbmc6IHVuZXhwZWN0ZWQgZXZlbnQgJWQiLCBlbnRyeS0+dHlwZSk7Ci0gICAgICAgICAgICArK2VudHJ5OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gRklYTUU6IGRlY2lkZSB3aGV0aGVyIHRvIHByaW50IHRoZSB3YXJuaW5ncyBoZXJlIG9yIGVsc2V3aGVyZQotICAgIGlmICghYm9keS5pc0VtcHR5KCkpIHsKLSAgICAgICAgZHVtcExpbmUodGltZXN0YW1wLCBib2R5KTsKLSAgICB9Ci19Ci0KLXZvaWQgTkJMb2c6Ok1lcmdlUmVhZGVyOjpnZXRBbmRQcm9jZXNzU25hcHNob3QoKQotewotICAgIC8vIGdldCBhIHNuYXBzaG90LCBwcm9jZXNzIGl0Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PiBzbmFwID0gZ2V0U25hcHNob3QoKTsKLSAgICBnZXRBbmRQcm9jZXNzU25hcHNob3QoKnNuYXApOwotfQotCi12b2lkIE5CTG9nOjpNZXJnZVJlYWRlcjo6ZHVtcChpbnQgZmQsIGludCBpbmRlbnQpIHsKLSAgICAvLyBUT0RPOiBhZGQgYSBtdXRleCBhcm91bmQgbWVkaWEubG9nIGR1bXAKLSAgICBSZXBvcnRQZXJmb3JtYW5jZTo6ZHVtcChmZCwgaW5kZW50LCBtVGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpcyk7Ci19Ci0KLS8vIFdyaXRlcyBhIHN0cmluZyB0byB0aGUgY29uc29sZQotdm9pZCBOQkxvZzo6UmVhZGVyOjpkdW1wTGluZShjb25zdCBTdHJpbmc4ICZ0aW1lc3RhbXAsIFN0cmluZzggJmJvZHkpCi17Ci0gICAgaWYgKG1GZCA+PSAwKSB7Ci0gICAgICAgIGRwcmludGYobUZkLCAiJS4qcyVzICVzXG4iLCBtSW5kZW50LCAiIiwgdGltZXN0YW1wLnN0cmluZygpLCBib2R5LnN0cmluZygpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HSSgiJS4qcyVzICVzIiwgbUluZGVudCwgIiIsIHRpbWVzdGFtcC5zdHJpbmcoKSwgYm9keS5zdHJpbmcoKSk7Ci0gICAgfQotICAgIGJvZHkuY2xlYXIoKTsKLX0KLQotYm9vbCBOQkxvZzo6UmVhZGVyOjppc0lNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnkpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGlNZW1vcnkgIT0gMCAmJiBtSU1lbW9yeSAhPSAwICYmIGlNZW1vcnktPnBvaW50ZXIoKSA9PSBtSU1lbW9yeS0+cG9pbnRlcigpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBOQkxvZzo6YXBwZW5kVGltZXN0YW1wKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpIHsKLSAgICBpbnQ2NF90IHRzOwotICAgIG1lbWNweSgmdHMsIGRhdGEsIHNpemVvZih0cykpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiWyVkLiUwM2RdIiwgKGludCkgKHRzIC8gKDEwMDAgKiAxMDAwICogMTAwMCkpLAotICAgICAgICAgICAgICAgICAgICAoaW50KSAoKHRzIC8gKDEwMDAgKiAxMDAwKSkgJSAxMDAwKSk7Ci19Ci0KLXZvaWQgTkJMb2c6OmFwcGVuZEludChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKSB7Ci0gICAgaW50IHggPSAqKChpbnQqKSBkYXRhKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIjwlZD4iLCB4KTsKLX0KLQotdm9pZCBOQkxvZzo6YXBwZW5kRmxvYXQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSkgewotICAgIGZsb2F0IGY7Ci0gICAgbWVtY3B5KCZmLCBkYXRhLCBzaXplb2YoZmxvYXQpKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIjwlZj4iLCBmKTsKLX0KLQotdm9pZCBOQkxvZzo6YXBwZW5kUElEKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBsZW5ndGgpIHsKLSAgICBwaWRfdCBpZCA9ICooKHBpZF90KikgZGF0YSk7Ci0gICAgY2hhciAqIG5hbWUgPSAmKChjaGFyKikgZGF0YSlbc2l6ZW9mKHBpZF90KV07Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCI8UElEOiAlZCwgbmFtZTogJS4qcz4iLCBpZCwgKGludCkgKGxlbmd0aCAtIHNpemVvZihwaWRfdCkpLCBuYW1lKTsKLX0KLQotU3RyaW5nOCBOQkxvZzo6YnVmZmVyRHVtcChjb25zdCB1aW50OF90ICpidWZmZXIsIHNpemVfdCBzaXplKQotewotICAgIFN0cmluZzggc3RyOwotICAgIHN0ci5hcHBlbmQoIlsgIik7Ci0gICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICAgIHN0ci5hcHBlbmRGb3JtYXQoIiVkICIsIGJ1ZmZlcltpXSk7Ci0gICAgfQotICAgIHN0ci5hcHBlbmQoIl0iKTsKLSAgICByZXR1cm4gc3RyOwotfQotCi1TdHJpbmc4IE5CTG9nOjpidWZmZXJEdW1wKGNvbnN0IEVudHJ5SXRlcmF0b3IgJml0KQotewotICAgIHJldHVybiBidWZmZXJEdW1wKGl0LCBpdC0+bGVuZ3RoICsgRW50cnk6OmtPdmVyaGVhZCk7Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yIE5CTG9nOjpSZWFkZXI6OmhhbmRsZUZvcm1hdChjb25zdCBGb3JtYXRFbnRyeSAmZm10RW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4ICp0aW1lc3RhbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4ICpib2R5KSB7Ci0gICAgLy8gbG9nIHRpbWVzdGFtcAotICAgIGludDY0X3QgdHMgPSBmbXRFbnRyeS50aW1lc3RhbXAoKTsKLSAgICB0aW1lc3RhbXAtPmNsZWFyKCk7Ci0gICAgdGltZXN0YW1wLT5hcHBlbmRGb3JtYXQoIlslZC4lMDNkXSIsIChpbnQpICh0cyAvICgxMDAwICogMTAwMCAqIDEwMDApKSwKLSAgICAgICAgICAgICAgICAgICAgKGludCkgKCh0cyAvICgxMDAwICogMTAwMCkpICUgMTAwMCkpOwotCi0gICAgLy8gbG9nIHVuaXF1ZSBoYXNoCi0gICAgbG9nX2hhc2hfdCBoYXNoID0gZm10RW50cnkuaGFzaCgpOwotICAgIC8vIHByaW50IG9ubHkgbG93ZXIgMTZiaXQgb2YgaGFzaCBhcyBoZXggYW5kIGxpbmUgYXMgaW50IHRvIHJlZHVjZSBzcGFtIGluIHRoZSBsb2cKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuNFgtJWQgIiwgKGludCkoaGFzaCA+PiAxNikgJiAweEZGRkYsIChpbnQpIGhhc2ggJiAweEZGRkYpOwotCi0gICAgLy8gbG9nIGF1dGhvciAoaWYgcHJlc2VudCkKLSAgICBoYW5kbGVBdXRob3IoZm10RW50cnksIGJvZHkpOwotCi0gICAgLy8gbG9nIHN0cmluZwotICAgIE5CTG9nOjpFbnRyeUl0ZXJhdG9yIGFyZyA9IGZtdEVudHJ5LmFyZ3MoKTsKLQotICAgIGNvbnN0IGNoYXIqIGZtdCA9IGZtdEVudHJ5LmZvcm1hdFN0cmluZygpOwotICAgIHNpemVfdCBmbXRfbGVuZ3RoID0gZm10RW50cnkuZm9ybWF0U3RyaW5nTGVuZ3RoKCk7Ci0KLSAgICBmb3IgKHNpemVfdCBmbXRfb2Zmc2V0ID0gMDsgZm10X29mZnNldCA8IGZtdF9sZW5ndGg7ICsrZm10X29mZnNldCkgewotICAgICAgICBpZiAoZm10W2ZtdF9vZmZzZXRdICE9ICclJykgewotICAgICAgICAgICAgYm9keS0+YXBwZW5kKCZmbXRbZm10X29mZnNldF0sIDEpOyAvLyBUT0RPIG9wdGltaXplIHRvIHdyaXRlIGNvbnNlY3V0aXZlIHN0cmluZ3MgYXQgb25jZQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gY2FzZSAiJSUiIgotICAgICAgICBpZiAoZm10WysrZm10X29mZnNldF0gPT0gJyUnKSB7Ci0gICAgICAgICAgICBib2R5LT5hcHBlbmQoIiUiKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNhc2UgIiVcMCIKLSAgICAgICAgaWYgKGZtdF9vZmZzZXQgPT0gZm10X2xlbmd0aCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBOQkxvZzo6RXZlbnQgZXZlbnQgPSAoTkJMb2c6OkV2ZW50KSBhcmctPnR5cGU7Ci0gICAgICAgIHNpemVfdCBsZW5ndGggPSBhcmctPmxlbmd0aDsKLQotICAgICAgICAvLyBUT0RPIGNoZWNrIGxlbmd0aCBmb3IgZXZlbnQgdHlwZSBpcyBjb3JyZWN0Ci0KLSAgICAgICAgaWYgKGV2ZW50ID09IEVWRU5UX0VORF9GTVQpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IG1vcmUgY29tcGxleCBmb3JtYXR0aW5nIHN1Y2ggYXMgJS4zZgotICAgICAgICBjb25zdCB1aW50OF90ICpkYXR1bSA9IGFyZy0+ZGF0YTsgLy8gcG9pbnRlciB0byB0aGUgY3VycmVudCBldmVudCBhcmdzCi0gICAgICAgIHN3aXRjaChmbXRbZm10X29mZnNldF0pCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAncyc6IC8vIHN0cmluZwotICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfU1RSSU5HLAotICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciBzdHJpbmcgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKLSAgICAgICAgICAgIGJvZHktPmFwcGVuZCgoY29uc3QgY2hhciopIGRhdHVtLCBsZW5ndGgpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAndCc6IC8vIHRpbWVzdGFtcAotICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfVElNRVNUQU1QLAotICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciB0aW1lc3RhbXAgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKLSAgICAgICAgICAgIGFwcGVuZFRpbWVzdGFtcChib2R5LCBkYXR1bSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdkJzogLy8gaW50ZWdlcgotICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfSU5URUdFUiwKLSAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3IgaW50ZWdlciBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOwotICAgICAgICAgICAgYXBwZW5kSW50KGJvZHksIGRhdHVtKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ2YnOiAvLyBmbG9hdAotICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfRkxPQVQsCi0gICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIGZsb2F0IHNwZWNpZmllcjogJWQiLCBldmVudCk7Ci0gICAgICAgICAgICBhcHBlbmRGbG9hdChib2R5LCBkYXR1bSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdwJzogLy8gcGlkCi0gICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9QSUQsCi0gICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIHBpZCBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOwotICAgICAgICAgICAgYXBwZW5kUElEKGJvZHksIGRhdHVtLCBsZW5ndGgpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dXKCJOQkxvZyBSZWFkZXIgZW5jb3VudGVyZWQgdW5rbm93biBjaGFyYWN0ZXIgJWMiLCBmbXRbZm10X29mZnNldF0pOwotICAgICAgICB9Ci0gICAgICAgICsrYXJnOwotICAgIH0KLSAgICBBTE9HV19JRihhcmctPnR5cGUgIT0gRVZFTlRfRU5EX0ZNVCwgIkV4cGVjdGVkIGVuZCBvZiBmb3JtYXQsIGdvdCAlZCIsIGFyZy0+dHlwZSk7Ci0gICAgKythcmc7Ci0gICAgcmV0dXJuIGFyZzsKLX0KLQotTkJMb2c6Ok1lcmdlcjo6TWVyZ2VyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOgotICAgICAgbVNoYXJlZCgoU2hhcmVkICopIHNoYXJlZCksCi0gICAgICBtRmlmbyhtU2hhcmVkICE9IE5VTEwgPwotICAgICAgICBuZXcgYXVkaW9fdXRpbHNfZmlmbyhzaXplLCBzaXplb2YodWludDhfdCksCi0gICAgICAgICAgICBtU2hhcmVkLT5tQnVmZmVyLCBtU2hhcmVkLT5tUmVhciwgTlVMTCAvKnRocm90dGxlc0Zyb250Ki8pIDogTlVMTCksCi0gICAgICBtRmlmb1dyaXRlcihtRmlmbyAhPSBOVUxMID8gbmV3IGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyKCptRmlmbykgOiBOVUxMKQotICAgICAge30KLQotdm9pZCBOQkxvZzo6TWVyZ2VyOjphZGRSZWFkZXIoY29uc3QgTkJMb2c6Ok5hbWVkUmVhZGVyICZyZWFkZXIpIHsKLQotICAgIC8vIEZJWE1FIFRoaXMgaXMgY2FsbGVkIGJ5IGJpbmRlciB0aHJlYWQgaW4gTWVkaWFMb2dTZXJ2aWNlOjpyZWdpc3RlcldyaXRlcgotICAgIC8vICAgICAgIGJ1dCB0aGUgYWNjZXNzIHRvIHNoYXJlZCB2YXJpYWJsZSBtTmFtZWRSZWFkZXJzIGlzIG5vdCB5ZXQgcHJvdGVjdGVkIGJ5IGEgbG9jay4KLSAgICBtTmFtZWRSZWFkZXJzLnB1c2hfYmFjayhyZWFkZXIpOwotfQotCi0vLyBpdGVtcyBwbGFjZWQgaW4gcHJpb3JpdHkgcXVldWUgZHVyaW5nIG1lcmdlCi0vLyBjb21wb3NlZCBieSBhIHRpbWVzdGFtcCBhbmQgdGhlIGluZGV4IG9mIHRoZSBzbmFwc2hvdCB3aGVyZSB0aGUgdGltZXN0YW1wIGNhbWUgZnJvbQotc3RydWN0IE1lcmdlSXRlbQotewotICAgIGludDY0X3QgdHM7Ci0gICAgaW50IGluZGV4OwotICAgIE1lcmdlSXRlbShpbnQ2NF90IHRzLCBpbnQgaW5kZXgpOiB0cyh0cyksIGluZGV4KGluZGV4KSB7fQotfTsKLQotLy8gb3BlcmF0b3JzIG5lZWRlZCBmb3IgcHJpb3JpdHkgcXVldWUgaW4gbWVyZ2UKLS8vIGJvb2wgb3BlcmF0b3I+KGNvbnN0IGludDY0X3QgJnQxLCBjb25zdCBpbnQ2NF90ICZ0MikgewotLy8gICAgIHJldHVybiB0MS50dl9zZWMgPiB0Mi50dl9zZWMgfHwgKHQxLnR2X3NlYyA9PSB0Mi50dl9zZWMgJiYgdDEudHZfbnNlYyA+IHQyLnR2X25zZWMpOwotLy8gfQotCi1ib29sIG9wZXJhdG9yPihjb25zdCBzdHJ1Y3QgTWVyZ2VJdGVtICZpMSwgY29uc3Qgc3RydWN0IE1lcmdlSXRlbSAmaTIpIHsKLSAgICByZXR1cm4gaTEudHMgPiBpMi50cyB8fCAoaTEudHMgPT0gaTIudHMgJiYgaTEuaW5kZXggPiBpMi5pbmRleCk7Ci19Ci0KLS8vIE1lcmdlIHJlZ2lzdGVyZWQgcmVhZGVycywgc29ydGVkIGJ5IHRpbWVzdGFtcCwgYW5kIHdyaXRlIGRhdGEgdG8gYSBzaW5nbGUgRklGTyBpbiBsb2NhbCBtZW1vcnkKLXZvaWQgTkJMb2c6Ok1lcmdlcjo6bWVyZ2UoKSB7Ci0gICAgLy8gRklYTUUgVGhpcyBpcyBjYWxsZWQgYnkgbWVyZ2UgdGhyZWFkCi0gICAgLy8gICAgICAgYnV0IHRoZSBhY2Nlc3MgdG8gc2hhcmVkIHZhcmlhYmxlIG1OYW1lZFJlYWRlcnMgaXMgbm90IHlldCBwcm90ZWN0ZWQgYnkgYSBsb2NrLgotICAgIGludCBuTG9ncyA9IG1OYW1lZFJlYWRlcnMuc2l6ZSgpOwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxOQkxvZzo6UmVhZGVyOjpTbmFwc2hvdD4+IHNuYXBzaG90cyhuTG9ncyk7Ci0gICAgc3RkOjp2ZWN0b3I8TkJMb2c6OkVudHJ5SXRlcmF0b3I+IG9mZnNldHMobkxvZ3MpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkxvZ3M7ICsraSkgewotICAgICAgICBzbmFwc2hvdHNbaV0gPSBtTmFtZWRSZWFkZXJzW2ldLnJlYWRlcigpLT5nZXRTbmFwc2hvdCgpOwotICAgICAgICBvZmZzZXRzW2ldID0gc25hcHNob3RzW2ldLT5iZWdpbigpOwotICAgIH0KLSAgICAvLyBpbml0aWFsaXplIG9mZnNldHMKLSAgICAvLyBUT0RPIGN1c3RvbSBoZWFwIGltcGxlbWVudGF0aW9uIGNvdWxkIGFsbG93IHRvIHVwZGF0ZSB0b3AsIGltcHJvdmluZyBwZXJmb3JtYW5jZQotICAgIC8vIGZvciBidXJzdHkgYnVmZmVycwotICAgIHN0ZDo6cHJpb3JpdHlfcXVldWU8TWVyZ2VJdGVtLCBzdGQ6OnZlY3RvcjxNZXJnZUl0ZW0+LCBzdGQ6OmdyZWF0ZXI8TWVyZ2VJdGVtPj4gdGltZXN0YW1wczsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Mb2dzOyArK2kpCi0gICAgewotICAgICAgICBpZiAob2Zmc2V0c1tpXSAhPSBzbmFwc2hvdHNbaV0tPmVuZCgpKSB7Ci0gICAgICAgICAgICBpbnQ2NF90IHRzID0gQWJzdHJhY3RFbnRyeTo6YnVpbGRFbnRyeShvZmZzZXRzW2ldKS0+dGltZXN0YW1wKCk7Ci0gICAgICAgICAgICB0aW1lc3RhbXBzLmVtcGxhY2UodHMsIGkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgd2hpbGUgKCF0aW1lc3RhbXBzLmVtcHR5KCkpIHsKLSAgICAgICAgLy8gZmluZCBtaW5pbXVtIHRpbWVzdGFtcAotICAgICAgICBpbnQgaW5kZXggPSB0aW1lc3RhbXBzLnRvcCgpLmluZGV4OwotICAgICAgICAvLyBjb3B5IGl0IHRvIHRoZSBsb2csIGluY3JlYXNpbmcgb2Zmc2V0Ci0gICAgICAgIG9mZnNldHNbaW5kZXhdID0gQWJzdHJhY3RFbnRyeTo6YnVpbGRFbnRyeShvZmZzZXRzW2luZGV4XSktPmNvcHlXaXRoQXV0aG9yKG1GaWZvV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0gICAgICAgIC8vIHVwZGF0ZSBkYXRhIHN0cnVjdHVyZXMKLSAgICAgICAgdGltZXN0YW1wcy5wb3AoKTsKLSAgICAgICAgaWYgKG9mZnNldHNbaW5kZXhdICE9IHNuYXBzaG90c1tpbmRleF0tPmVuZCgpKSB7Ci0gICAgICAgICAgICBpbnQ2NF90IHRzID0gQWJzdHJhY3RFbnRyeTo6YnVpbGRFbnRyeShvZmZzZXRzW2luZGV4XSktPnRpbWVzdGFtcCgpOwotICAgICAgICAgICAgdGltZXN0YW1wcy5lbXBsYWNlKHRzLCBpbmRleCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWNvbnN0IHN0ZDo6dmVjdG9yPE5CTG9nOjpOYW1lZFJlYWRlcj4mIE5CTG9nOjpNZXJnZXI6OmdldE5hbWVkUmVhZGVycygpIGNvbnN0IHsKLSAgICAvLyBGSVhNRSBUaGlzIGlzIHJldHVybmluZyBhIHJlZmVyZW5jZSB0byBhIHNoYXJlZCB2YXJpYWJsZSB0aGF0IG5lZWRzIGEgbG9jawotICAgIHJldHVybiBtTmFtZWRSZWFkZXJzOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTkJMb2c6Ok1lcmdlUmVhZGVyOjpNZXJnZVJlYWRlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplLCBNZXJnZXIgJm1lcmdlcikKLSAgICA6IFJlYWRlcihzaGFyZWQsIHNpemUpLCBtTmFtZWRSZWFkZXJzKG1lcmdlci5nZXROYW1lZFJlYWRlcnMoKSkge30KLQotdm9pZCBOQkxvZzo6TWVyZ2VSZWFkZXI6OmhhbmRsZUF1dGhvcihjb25zdCBOQkxvZzo6QWJzdHJhY3RFbnRyeSAmZW50cnksIFN0cmluZzggKmJvZHkpIHsKLSAgICBpbnQgYXV0aG9yID0gZW50cnkuYXV0aG9yKCk7Ci0gICAgLy8gRklYTUUgTmVlZHMgYSBsb2NrCi0gICAgY29uc3QgY2hhciogbmFtZSA9IG1OYW1lZFJlYWRlcnNbYXV0aG9yXS5uYW1lKCk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlczogIiwgbmFtZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1OQkxvZzo6TWVyZ2VUaHJlYWQ6Ok1lcmdlVGhyZWFkKE5CTG9nOjpNZXJnZXIgJm1lcmdlciwgTkJMb2c6Ok1lcmdlUmVhZGVyICZtZXJnZVJlYWRlcikKLSAgICA6IG1NZXJnZXIobWVyZ2VyKSwKLSAgICAgIG1NZXJnZVJlYWRlcihtZXJnZVJlYWRlciksCi0gICAgICBtVGltZW91dFVzKDApIHt9Ci0KLU5CTG9nOjpNZXJnZVRocmVhZDo6fk1lcmdlVGhyZWFkKCkgewotICAgIC8vIHNldCBleGl0IGZsYWcsIHNldCB0aW1lb3V0IHRvIDAgdG8gZm9yY2UgdGhyZWFkTG9vcCB0byBleGl0IGFuZCB3YWl0IGZvciB0aGUgdGhyZWFkIHRvIGpvaW4KLSAgICByZXF1ZXN0RXhpdCgpOwotICAgIHNldFRpbWVvdXRVcygwKTsKLSAgICBqb2luKCk7Ci19Ci0KLWJvb2wgTkJMb2c6Ok1lcmdlVGhyZWFkOjp0aHJlYWRMb29wKCkgewotICAgIGJvb2wgZG9NZXJnZTsKLSAgICB7Ci0gICAgICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOwotICAgICAgICAvLyBJZiBtVGltZW91dFVzIGlzIG5lZ2F0aXZlLCB3YWl0IG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUgdW50aWwgaXQncyBwb3NpdGl2ZS4KLSAgICAgICAgLy8gSWYgaXQncyBwb3NpdGl2ZSwgd2FpdCBrVGhyZWFkU2xlZXBQZXJpb2RVcyBhbmQgdGhlbiBtZXJnZQotICAgICAgICBuc2Vjc190IHdhaXRUaW1lID0gbVRpbWVvdXRVcyA+IDAgPyBrVGhyZWFkU2xlZXBQZXJpb2RVcyAqIDEwMDAgOiBMTE9OR19NQVg7Ci0gICAgICAgIG1Db25kLndhaXRSZWxhdGl2ZShtTXV0ZXgsIHdhaXRUaW1lKTsKLSAgICAgICAgZG9NZXJnZSA9IG1UaW1lb3V0VXMgPiAwOwotICAgICAgICBtVGltZW91dFVzIC09IGtUaHJlYWRTbGVlcFBlcmlvZFVzOwotICAgIH0KLSAgICBpZiAoZG9NZXJnZSkgewotICAgICAgICAvLyBNZXJnZSBkYXRhIGZyb20gYWxsIHRoZSByZWFkZXJzCi0gICAgICAgIG1NZXJnZXIubWVyZ2UoKTsKLSAgICAgICAgLy8gUHJvY2VzcyB0aGUgZGF0YSBjb2xsZWN0ZWQgYnkgbU1lcmdlciBhbmQgd3JpdGUgaXQgdG8gUGVyZm9ybWFuY2VBbmFseXNpcwotICAgICAgICAvLyBGSVhNRTogZGVjaWRlIHdoZXRoZXIgdG8gY2FsbCBnZXRBbmRQcm9jZXNzU25hcHNob3QgZXZlcnkgdGltZQotICAgICAgICAvLyBvciB3aGV0aGVyIHRvIGhhdmUgYSBzZXBhcmF0ZSB0aHJlYWQgdGhhdCBjYWxscyBpdCB3aXRoIGEgbG93ZXIgZnJlcXVlbmN5Ci0gICAgICAgIG1NZXJnZVJlYWRlci5nZXRBbmRQcm9jZXNzU25hcHNob3QoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgTkJMb2c6Ok1lcmdlVGhyZWFkOjp3YWtldXAoKSB7Ci0gICAgc2V0VGltZW91dFVzKGtUaHJlYWRXYWtldXBQZXJpb2RVcyk7Ci19Ci0KLXZvaWQgTkJMb2c6Ok1lcmdlVGhyZWFkOjpzZXRUaW1lb3V0VXMoaW50IHRpbWUpIHsKLSAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKLSAgICBtVGltZW91dFVzID0gdGltZTsKLSAgICBtQ29uZC5zaWduYWwoKTsKLX0KLQotfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmNwcCBiL21lZGlhL2xpYm5ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuY3BwCmluZGV4IGYwOWU5M2QuLmU5MWE1MTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuY3BwCisrKyBiL21lZGlhL2xpYm5ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuY3BwCkBAIC0xNywxMyArMTcsMTYgQEAKIAogI2RlZmluZSBMT0dfVEFHICJQZXJmb3JtYW5jZUFuYWx5c2lzIgogLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKy8vICNkZWZpbmUgV1JJVEVfVE9fRklMRQogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPGNsaW1pdHM+CiAjaW5jbHVkZSA8ZGVxdWU+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8bnVtZXJpYz4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8c3RkYXJnLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CkBAIC0zMiwyMCArMzUsMTI2IEBACiAjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CiAjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9Mb2dQbG90Lmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcm91bmR1cC5oPgogI2luY2x1ZGUgPG1lZGlhL25ibG9nL05CTG9nLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oPgogI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgogCiAjaW5jbHVkZSA8cXVldWU+CiAjaW5jbHVkZSA8dXRpbGl0eT4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UgewogCit2b2lkIEhpc3RvZ3JhbTo6YWRkKGRvdWJsZSB2YWx1ZSkKK3sKKyAgICBpZiAobUJpblNpemUgPD0gMCB8fCBtQmlucy5zaXplKCkgPCAyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gVE9ETyBIYW5kbGUgZG9tYWluIGFuZCByYW5nZSBlcnJvciBleGNlcHRpb25zPworICAgIGNvbnN0IGludCB1bmJvdW5kZWRJbmRleCA9IGxyb3VuZCgodmFsdWUgLSBtTG93KSAvIG1CaW5TaXplKSArIDE7CisgICAgLy8gc3RkOjpjbGFtcCBpcyBpbnRyb2R1Y2VkIGluIEMrKzE3CisgICAgLy9jb25zdCBpbnQgaW5kZXggPSBzdGQ6OmNsYW1wKHVuYm91bmRlZEluZGV4LCAwLCAoaW50KShtQmlucy5zaXplKCkgLSAxKSk7CisgICAgY29uc3QgaW50IGluZGV4ID0gc3RkOjptYXgoMCwgc3RkOjptaW4oKGludCkobUJpbnMuc2l6ZSgpIC0gMSksIHVuYm91bmRlZEluZGV4KSk7CisgICAgbUJpbnNbaW5kZXhdKys7CisgICAgbVRvdGFsQ291bnQrKzsKK30KKwordm9pZCBIaXN0b2dyYW06OmNsZWFyKCkKK3sKKyAgICBzdGQ6OmZpbGwobUJpbnMuYmVnaW4oKSwgbUJpbnMuZW5kKCksIDApOworICAgIG1Ub3RhbENvdW50ID0gMDsKK30KKwordWludDY0X3QgSGlzdG9ncmFtOjp0b3RhbENvdW50KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVRvdGFsQ291bnQ7Cit9CisKK3N0ZDo6c3RyaW5nIEhpc3RvZ3JhbTo6dG9TdHJpbmcoKSBjb25zdCB7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtEaXZpZGVyID0gJ3wnOworICAgIHNzIDw8IGtWZXJzaW9uIDw8ICIsIiA8PCBtQmluU2l6ZSA8PCAiLCIgPDwgbU51bUJpbnMgPDwgIiwiIDw8IG1Mb3cgPDwgIix7IjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1CaW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtQmluc1tpXSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgICAgICAgICAgc3MgPDwgIiwiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3MgPDwgc3RhdGljX2Nhc3Q8aW50PihpKSAtIDEgPDwga0RpdmlkZXIgPDwgbUJpbnNbaV07CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHNzIDw8ICJ9IjsKKworICAgIHJldHVybiBzcy5zdHIoKTsKK30KKworc3RkOjpzdHJpbmcgSGlzdG9ncmFtOjphc2NpaUFydFN0cmluZyhzaXplX3QgaW5kZW50KSBjb25zdCB7CisgICAgaWYgKHRvdGFsQ291bnQoKSA9PSAwIHx8IG1CaW5TaXplIDw9IDAgfHwgbUJpbnMuc2l6ZSgpIDwgMikgeworICAgICAgICByZXR1cm4gIiI7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtNYXJrZXIgPSAnLSc7CisgICAgLy8gT25lIGluY3JlbWVudCBpcyBjb25zaWRlcmVkIG9uZSBzdGVwIG9mIGEgYmluJ3MgaGVpZ2h0LgorICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNYXJrZXJzUGVySW5jcmVtZW50ID0gMjsKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWF4SW5jcmVtZW50cyA9IDY0ICsgMTsKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWF4TnVtYmVyV2lkdGggPSA3OworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrTWFya2VycyhrTWFya2Vyc1BlckluY3JlbWVudCAqIGtNYXhJbmNyZW1lbnRzLCBrTWFya2VyKTsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1NwYWNlcyhrTWFya2Vyc1BlckluY3JlbWVudCAqIGtNYXhJbmNyZW1lbnRzLCAnICcpOworICAgIC8vIGdldCB0aGUgbGFzdCBuIGNoYXJhY3RlcnMgb2Ygcywgb3IgdGhlIHdob2xlIHN0cmluZyBpZiBpdCBpcyBzaG9ydGVyCisgICAgYXV0byBnZXRUYWlsID0gW10oY29uc3Qgc2l6ZV90IG4sIGNvbnN0IHN0ZDo6c3RyaW5nICZzKSB7CisgICAgICAgIHJldHVybiBzLmNfc3RyKCkgKyBzLnNpemUoKSAtIHN0ZDo6bWluKG4sIHMuc2l6ZSgpKTsKKyAgICB9OworCisgICAgLy8gU2luY2UgdG90YWxDb3VudCgpID4gMCwgbUJpbnMgaXMgbm90IGVtcHR5IGFuZCBtYXhDb3VudCA+IDAuCisgICAgY29uc3QgdW5zaWduZWQgbWF4Q291bnQgPSAqc3RkOjptYXhfZWxlbWVudChtQmlucy5iZWdpbigpLCBtQmlucy5lbmQoKSk7CisgICAgY29uc3Qgc2l6ZV90IG1heEluY3JlbWVudHMgPSBsb2cyKG1heENvdW50KSArIDE7CisKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKworICAgIC8vIE5vbi16ZXJvIGJpbnMgbXVzdCBleGlzdCBhdCB0aGlzIHBvaW50IGJlY2F1c2UgdG90YWxDb3VudCgpID4gMC4KKyAgICBzaXplX3QgZmlyc3ROb25aZXJvQmluID0gMDsKKyAgICAvLyBJZiBmaXJzdE5vblplcm9CaW4gcmVhY2hlcyBtQmlucy5zaXplKCkgLSAxLCB0aGVuIGl0IG11c3QgYmUgYSBub256ZXJvIGJpbi4KKyAgICBmb3IgKDsgZmlyc3ROb25aZXJvQmluIDwgbUJpbnMuc2l6ZSgpIC0gMSAmJiBtQmluc1tmaXJzdE5vblplcm9CaW5dID09IDA7IGZpcnN0Tm9uWmVyb0JpbisrKSB7fQorICAgIGNvbnN0IHNpemVfdCBmaXJzdEJpblRvUHJpbnQgPSBmaXJzdE5vblplcm9CaW4gPT0gMCA/IDAgOiBmaXJzdE5vblplcm9CaW4gLSAxOworCisgICAgc2l6ZV90IGxhc3ROb25aZXJvQmluID0gbUJpbnMuc2l6ZSgpIC0gMTsKKyAgICAvLyBJZiBsYXN0Tm9uWmVyb0JpbiByZWFjaGVzIDAsIHRoZW4gaXQgbXVzdCBiZSBhIG5vbnplcm8gYmluLgorICAgIGZvciAoOyBsYXN0Tm9uWmVyb0JpbiA+IDAgJiYgbUJpbnNbbGFzdE5vblplcm9CaW5dID09IDA7IGxhc3ROb25aZXJvQmluLS0pIHt9CisgICAgY29uc3Qgc2l6ZV90IGxhc3RCaW5Ub1ByaW50ID0gbGFzdE5vblplcm9CaW4gPT0gbUJpbnMuc2l6ZSgpIC0gMSA/IGxhc3ROb25aZXJvQmluCisgICAgICAgICAgICA6IGxhc3ROb25aZXJvQmluICsgMTsKKworICAgIGZvciAoc2l6ZV90IGJpbiA9IGZpcnN0QmluVG9QcmludDsgYmluIDw9IGxhc3RCaW5Ub1ByaW50OyBiaW4rKykgeworICAgICAgICBzcyA8PCBzdGQ6OnNldHcoaW5kZW50ICsga01heE51bWJlcldpZHRoKTsKKyAgICAgICAgaWYgKGJpbiA9PSAwKSB7CisgICAgICAgICAgICBzcyA8PCAiPCI7CisgICAgICAgIH0gZWxzZSBpZiAoYmluID09IG1CaW5zLnNpemUoKSAtIDEpIHsKKyAgICAgICAgICAgIHNzIDw8ICI+IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNzIDw8IG1Mb3cgKyAoYmluIC0gMSkgKiBtQmluU2l6ZTsKKyAgICAgICAgfQorICAgICAgICBzcyA8PCAiIHwiOworICAgICAgICBzaXplX3QgaW5jcmVtZW50cyA9IDA7CisgICAgICAgIGNvbnN0IHVpbnQ2NF90IGJpbkNvdW50ID0gbUJpbnNbYmluXTsKKyAgICAgICAgaWYgKGJpbkNvdW50ID4gMCkgeworICAgICAgICAgICAgaW5jcmVtZW50cyA9IGxvZzIoYmluQ291bnQpICsgMTsKKyAgICAgICAgICAgIHNzIDw8IGdldFRhaWwoaW5jcmVtZW50cyAqIGtNYXJrZXJzUGVySW5jcmVtZW50LCBrTWFya2Vycyk7CisgICAgICAgIH0KKyAgICAgICAgc3MgPDwgZ2V0VGFpbCgobWF4SW5jcmVtZW50cyAtIGluY3JlbWVudHMgKyAxKSAqIGtNYXJrZXJzUGVySW5jcmVtZW50LCBrU3BhY2VzKQorICAgICAgICAgICAgICAgIDw8IGJpbkNvdW50IDw8ICJcbiI7CisgICAgfQorICAgIHNzIDw8ICJcbiI7CisKKyAgICByZXR1cm4gc3Muc3RyKCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIC8vIEdpdmVuIGFuIGF1ZGlvIHByb2Nlc3Npbmcgd2FrZXVwIHRpbWVzdGFtcCwgYnVja2V0cyB0aGUgdGltZSBpbnRlcnZhbAogLy8gc2luY2UgdGhlIHByZXZpb3VzIHRpbWVzdGFtcCBpbnRvIGEgaGlzdG9ncmFtLCBzZWFyY2hlcyBmb3IKIC8vIG91dGxpZXJzLCBhbmFseXplcyB0aGUgb3V0bGllciBzZXJpZXMgZm9yIHVuZXhwZWN0ZWRseQpAQCAtMjA4LDI3ICszMTcsNiBAQAogICAgIHJldHVybiBpc091dGxpZXI7CiB9CiAKLXN0YXRpYyBpbnQgd2lkdGhPZihpbnQgeCkgewotICAgIGludCB3aWR0aCA9IDA7Ci0gICAgaWYgKHggPCAwKSB7Ci0gICAgICAgIHdpZHRoKys7Ci0gICAgICAgIHggPSB4ID09IElOVF9NSU4gPyBJTlRfTUFYIDogLXg7Ci0gICAgfQotICAgIC8vIGFzc2VydCAoeCA+PSAwKQotICAgIGRvIHsKLSAgICAgICAgKyt3aWR0aDsKLSAgICAgICAgeCAvPSAxMDsKLSAgICB9IHdoaWxlICh4ID4gMCk7Ci0gICAgcmV0dXJuIHdpZHRoOwotfQotCi0vLyBjb21wdXRlcyB0aGUgY29sdW1uIHdpZHRoIHJlcXVpcmVkIGZvciBhIHNwZWNpZmljIGhpc3RvZ3JhbSB2YWx1ZQotaW5saW5lIGludCBudW1iZXJXaWR0aChkb3VibGUgbnVtYmVyLCBpbnQgbGVmdFBhZGRpbmcpIHsKLSAgICAvLyBBZGRlZCB2YWx1ZXMgYWNjb3VudCBmb3Igd2hpdGVzcGFjZXMgbmVlZGVkIGFyb3VuZCBudW1iZXJzLCBhbmQgZm9yIHRoZQotICAgIC8vIGRvdCBhbmQgZGVjaW1hbCBkaWdpdCBub3QgYWNjb3VudGVkIGZvciBieSB3aWR0aE9mCi0gICAgcmV0dXJuIHN0ZDo6bWF4KHN0ZDo6bWF4KHdpZHRoT2Yoc3RhdGljX2Nhc3Q8aW50PihudW1iZXIpKSArIDMsIDIpLCBsZWZ0UGFkZGluZyArIDEpOwotfQotCiAvLyByb3VuZHMgdmFsdWUgdG8gcHJlY2lzaW9uIGJhc2VkIG9uIGxvZy1kaXN0YW5jZSBmcm9tIG1lYW4KIF9fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIGlubGluZSBkb3VibGUgbG9nUm91bmQoZG91YmxlIHgsIGRvdWJsZSBtZWFuKSB7CkBAIC0yNTQsNyArMzQyLDcgQEAKIC8vIG9mIFBlcmZvcm1hbmNlQW5hbHlzaXMKIHZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6cmVwb3J0UGVyZm9ybWFuY2UoU3RyaW5nOCAqYm9keSwgaW50IGF1dGhvciwgbG9nX2hhc2hfdCBoYXNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4SGVpZ2h0KSB7Ci0gICAgaWYgKG1IaXN0cy5lbXB0eSgpKSB7CisgICAgaWYgKG1IaXN0cy5lbXB0eSgpIHx8IGJvZHkgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0yNzMsNjkgKzM2MSwxNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gdW5kZXJzY29yZXMgYW5kIHNwYWNlcyBsZW5ndGggY29ycmVzcG9uZHMgdG8gbWF4aW11bSB3aWR0aCBvZiBoaXN0b2dyYW0KLSAgICBzdGF0aWMgY29uc3QgaW50IGtMZW4gPSAyMDA7Ci0gICAgc3RkOjpzdHJpbmcgdW5kZXJzY29yZXMoa0xlbiwgJ18nKTsKLSAgICBzdGQ6OnN0cmluZyBzcGFjZXMoa0xlbiwgJyAnKTsKLQotICAgIGF1dG8gaXQgPSBidWNrZXRzLmJlZ2luKCk7Ci0gICAgZG91YmxlIG1heERlbHRhID0gaXQtPmZpcnN0OwotICAgIGludCBtYXhDb3VudCA9IGl0LT5zZWNvbmQ7Ci0gICAgLy8gQ29tcHV0ZSBtYXhpbXVtIHZhbHVlcwotICAgIHdoaWxlICgrK2l0ICE9IGJ1Y2tldHMuZW5kKCkpIHsKLSAgICAgICAgaWYgKGl0LT5maXJzdCA+IG1heERlbHRhKSB7Ci0gICAgICAgICAgICBtYXhEZWx0YSA9IGl0LT5maXJzdDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXQtPnNlY29uZCA+IG1heENvdW50KSB7Ci0gICAgICAgICAgICBtYXhDb3VudCA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaW50IGhlaWdodCA9IGxvZzIobWF4Q291bnQpICsgMTsgLy8gbWF4Q291bnQgPiAwLCBzYWZlIHRvIGNhbGwgbG9nMgotICAgIGNvbnN0IGludCBsZWZ0UGFkZGluZyA9IHdpZHRoT2YoMSA8PCBoZWlnaHQpOwotICAgIGNvbnN0IGludCBidWNrZXRXaWR0aCA9IG51bWJlcldpZHRoKG1heERlbHRhLCBsZWZ0UGFkZGluZyk7Ci0gICAgaW50IHNjYWxpbmdGYWN0b3IgPSAxOwotICAgIC8vIHNjYWxlIGRhdGEgaWYgaXQgZXhjZWVkcyBtYXhpbXVtIGhlaWdodAotICAgIGlmIChoZWlnaHQgPiBtYXhIZWlnaHQpIHsKLSAgICAgICAgc2NhbGluZ0ZhY3RvciA9IChoZWlnaHQgKyBtYXhIZWlnaHQpIC8gbWF4SGVpZ2h0OwotICAgICAgICBoZWlnaHQgLz0gc2NhbGluZ0ZhY3RvcjsKLSAgICB9Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiUqcyAlMy4yZiAlcyIsIGxlZnRQYWRkaW5nICsgMTEsCi0gICAgICAgICAgICAiT2NjdXJyZW5jZXMgaW4iLCAoZWxhcHNlZE1zIC8ga01zUGVyU2VjKSwgInNlY29uZHMgb2YgYXVkaW86Iik7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiUqcyVkLCAlbGxkLCAlbGxkXG4iLCBsZWZ0UGFkZGluZyArIDExLAorICAgIHN0YXRpYyBjb25zdCBpbnQgU0laRSA9IDEyODsKKyAgICBjaGFyIHRpdGxlW1NJWkVdOworICAgIHNucHJpbnRmKHRpdGxlLCBzaXplb2YodGl0bGUpLCAiXG4lcyAlMy4yZiAlc1xuJXMlZCwgJWxsZCwgJWxsZFxuIiwKKyAgICAgICAgICAgICJPY2N1cnJlbmNlcyBpbiIsIChlbGFwc2VkTXMgLyBrTXNQZXJTZWMpLCAic2Vjb25kcyBvZiBhdWRpbzoiLAogICAgICAgICAgICAgIlRocmVhZCwgaGFzaCwgc3RhcnRpbmcgdGltZXN0YW1wOiAiLCBhdXRob3IsCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmcgaW50PihoYXNoKSwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nIGludD4oc3RhcnRpbmdUcykpOwotICAgIC8vIHdyaXRlIGhpc3RvZ3JhbSBsYWJlbCBsaW5lIHdpdGggYnVja2V0IHZhbHVlcwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lcyIsICIgIik7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKnMiLCBsZWZ0UGFkZGluZywgIiAiKTsKLSAgICBmb3IgKGF1dG8gY29uc3QgJnggOiBidWNrZXRzKSB7Ci0gICAgICAgIGNvbnN0IGludCBjb2xXaWR0aCA9IG51bWJlcldpZHRoKHguZmlyc3QsIGxlZnRQYWRkaW5nKTsKLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKmQiLCBjb2xXaWR0aCwgeC5zZWNvbmQpOwotICAgIH0KLSAgICAvLyB3cml0ZSBoaXN0b2dyYW0gYXNjaWkgYXJ0Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiVzIiwgIiAiKTsKLSAgICBmb3IgKGludCByb3cgPSBoZWlnaHQgKiBzY2FsaW5nRmFjdG9yOyByb3cgPj0gMDsgcm93IC09IHNjYWxpbmdGYWN0b3IpIHsKLSAgICAgICAgY29uc3QgaW50IHZhbHVlID0gMSA8PCByb3c7Ci0gICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyIsIGxlZnRQYWRkaW5nLCBzcGFjZXMuY19zdHIoKSk7Ci0gICAgICAgIGZvciAoYXV0byBjb25zdCAmeCA6IGJ1Y2tldHMpIHsKLSAgICAgICAgICAgIGNvbnN0IGludCBjb2xXaWR0aCA9IG51bWJlcldpZHRoKHguZmlyc3QsIGxlZnRQYWRkaW5nKTsKLSAgICAgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyVzIiwgY29sV2lkdGggLSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlcy5jX3N0cigpLCB4LnNlY29uZCA8IHZhbHVlID8gIiAiIDogInwiKTsKLSAgICAgICAgfQotICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJXMiLCAiICIpOwotICAgIH0KLSAgICAvLyBwcmludCB4LWF4aXMKLSAgICBjb25zdCBpbnQgY29sdW1ucyA9IHN0YXRpY19jYXN0PGludD4oYnVja2V0cy5zaXplKCkpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpjIiwgbGVmdFBhZGRpbmcsICcgJyk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLipzIiwgKGNvbHVtbnMgKyAxKSAqIGJ1Y2tldFdpZHRoLCB1bmRlcnNjb3Jlcy5jX3N0cigpKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJXMiLCAiICIpOworICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihoYXNoKSwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihzdGFydGluZ1RzKSk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrTGFiZWwgPSAibXMiOwogCi0gICAgLy8gd3JpdGUgZm9vdGVyIHdpdGggYnVja2V0IGxhYmVscwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpzIiwgbGVmdFBhZGRpbmcsICIgIik7Ci0gICAgZm9yIChhdXRvIGNvbnN0ICZ4IDogYnVja2V0cykgewotICAgICAgICBjb25zdCBpbnQgY29sV2lkdGggPSBudW1iZXJXaWR0aCh4LmZpcnN0LCBsZWZ0UGFkZGluZyk7Ci0gICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSouKmYiLCBjb2xXaWR0aCwgMSwgeC5maXJzdCk7Ci0gICAgfQotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyVzIiwgYnVja2V0V2lkdGgsIHNwYWNlcy5jX3N0cigpLCAibXNcbiIpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJXMiLAorICAgICAgICAgICAgYXVkaW9fdXRpbHNfcGxvdF9oaXN0b2dyYW0oYnVja2V0cywgdGl0bGUsIGtMYWJlbCwgbWF4SGVpZ2h0KS5jX3N0cigpKTsKIAogICAgIC8vIE5vdyByZXBvcnQgZ2xpdGNoZXMKICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxudGltZSBlbGFwc2VkIGJldHdlZW4gZ2xpdGNoZXMgYW5kIGdsaXRjaCB0aW1lc3RhbXBzOlxuIik7CkBAIC0zNTAsNyArMzg1LDkgQEAKIC8vIHdyaXRlcyBzdW1tYXJ5IG9mIHBlcmZvcm1hbmNlIGludG8gc3BlY2lmaWVkIGZpbGUgZGVzY3JpcHRvcgogdm9pZCBkdW1wKGludCBmZCwgaW50IGluZGVudCwgUGVyZm9ybWFuY2VBbmFseXNpc01hcCAmdGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpcykgewogICAgIFN0cmluZzggYm9keTsKKyNpZmRlZiBXUklURV9UT19GSUxFCiAgICAgY29uc3QgY2hhciogY29uc3Qga0RpcmVjdG9yeSA9ICIvZGF0YS9taXNjL2F1ZGlvc2VydmVyLyI7CisjZW5kaWYKICAgICBmb3IgKGF1dG8gJiB0aHJlYWQgOiB0aHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzKSB7CiAgICAgICAgIGZvciAoYXV0byAmIGhhc2g6IHRocmVhZC5zZWNvbmQpIHsKICAgICAgICAgICAgIFBlcmZvcm1hbmNlQW5hbHlzaXMmIGN1cnIgPSBoYXNoLnNlY29uZDsKQEAgLTM2MCw5ICszOTcsMTEgQEAKICAgICAgICAgICAgICAgICBkdW1wTGluZShmZCwgaW5kZW50LCBib2R5KTsKICAgICAgICAgICAgICAgICBib2R5LmNsZWFyKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyB3cml0ZSB0byBmaWxlCisjaWZkZWYgV1JJVEVfVE9fRklMRQorICAgICAgICAgICAgLy8gd3JpdGUgdG8gZmlsZS4gRW5hYmxlIGJ5IHVuY29tbWVudGluZyBtYWNybyBhdCB0b3Agb2YgZmlsZS4KICAgICAgICAgICAgIHdyaXRlVG9GaWxlKGN1cnIubUhpc3RzLCBjdXJyLm1PdXRsaWVyRGF0YSwgY3Vyci5tUGVha1RpbWVzdGFtcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICBrRGlyZWN0b3J5LCBmYWxzZSwgdGhyZWFkLmZpcnN0LCBoYXNoLmZpcnN0KTsKKyNlbmRpZgogICAgICAgICB9CiAgICAgfQogfQpAQCAtMzc0LDUgKzQxMyw0IEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCi0KIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvUmVhZGVyLmNwcCBiL21lZGlhL2xpYm5ibG9nL1JlYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU1NmUzNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL1JlYWRlci5jcHAKQEAgLTAsMCArMSw0NDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk5CTG9nIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZmlmby5oPgorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRW50cnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FdmVudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9SZWFkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9UaW1lbGluZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIE5CTG9nIHsKKworUmVhZGVyOjpSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSwgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpCisgICAgOiBtTmFtZShuYW1lKSwKKyAgICAgIG1TaGFyZWQoKC8qY29uc3QqLyBTaGFyZWQgKikgc2hhcmVkKSwgLyptSU1lbW9yeSovCisgICAgICBtRmlmbyhtU2hhcmVkICE9IE5VTEwgPworICAgICAgICBuZXcgYXVkaW9fdXRpbHNfZmlmbyhzaXplLCBzaXplb2YodWludDhfdCksCisgICAgICAgICAgICBtU2hhcmVkLT5tQnVmZmVyLCBtU2hhcmVkLT5tUmVhciwgTlVMTCAvKnRocm90dGxlc0Zyb250Ki8pIDogTlVMTCksCisgICAgICBtRmlmb1JlYWRlcihtRmlmbyAhPSBOVUxMID8gbmV3IGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyKCptRmlmbykgOiBOVUxMKQoreworfQorCitSZWFkZXI6OlJlYWRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUsIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKQorICAgIDogUmVhZGVyKGlNZW1vcnkgIT0gMCA/IChTaGFyZWQgKikgaU1lbW9yeS0+cG9pbnRlcigpIDogTlVMTCwgc2l6ZSwgbmFtZSkKK3sKKyAgICBtSU1lbW9yeSA9IGlNZW1vcnk7Cit9CisKK1JlYWRlcjo6flJlYWRlcigpCit7CisgICAgZGVsZXRlIG1GaWZvUmVhZGVyOworICAgIGRlbGV0ZSBtRmlmbzsKK30KKworLy8gQ29waWVzIGNvbnRlbnQgb2YgYSBSZWFkZXIgRklGTyBpbnRvIGl0cyBTbmFwc2hvdAorLy8gVGhlIFNuYXBzaG90IGhhcyB0aGUgc2FtZSByYXcgZGF0YSwgYnV0IHJlcHJlc2VudGVkIGFzIGEgc2VxdWVuY2Ugb2YgZW50cmllcworLy8gYW5kIGFuIEVudHJ5SXRlcmF0b3IgbWFraW5nIGl0IHBvc3NpYmxlIHRvIHByb2Nlc3MgdGhlIGRhdGEuCitzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IFJlYWRlcjo6Z2V0U25hcHNob3QoYm9vbCBmbHVzaCkKK3sKKyAgICBpZiAobUZpZm9SZWFkZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PihuZXcgU25hcHNob3QoKSk7CisgICAgfQorCisgICAgLy8gVGhpcyBlbXVsYXRlcyB0aGUgYmVoYXZpb3VyIG9mIGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyOjpyZWFkLCBidXQgd2l0aG91dCBpbmNyZW1lbnRpbmcgdGhlCisgICAgLy8gcmVhZGVyIGluZGV4LiBUaGUgaW5kZXggaXMgaW5jcmVtZW50ZWQgYWZ0ZXIgaGFuZGxpbmcgY29ycnVwdGlvbiwgdG8gYWZ0ZXIgdGhlIGxhc3QgY29tcGxldGUKKyAgICAvLyBlbnRyeSBvZiB0aGUgYnVmZmVyCisgICAgc2l6ZV90IGxvc3QgPSAwOworICAgIGF1ZGlvX3V0aWxzX2lvdmVjIGlvdmVjWzJdOworICAgIGNvbnN0IHNpemVfdCBjYXBhY2l0eSA9IG1GaWZvLT5jYXBhY2l0eSgpOworICAgIHNzaXplX3QgYXZhaWxUb1JlYWQ7CisgICAgLy8gQSBjYWxsIHRvIGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyOjpvYnRhaW4oKSBwbGFjZXMgdGhlIHJlYWQgcG9pbnRlciBvbmUgYnVmZmVyIGxlbmd0aAorICAgIC8vIGJlZm9yZSB0aGUgd3JpdGVyJ3MgcG9pbnRlciAoc2luY2UgbUZpZm9SZWFkZXIgd2FzIGNvbnN0cnVjdGVkIHdpdGggZmx1c2g9ZmFsc2UpLiBUaGUKKyAgICAvLyBkbyB3aGlsZSBsb29wIGlzIGFuIGF0dGVtcHQgdG8gcmVhZCBhbGwgb2YgdGhlIEZJRk8ncyBjb250ZW50cyByZWdhcmRsZXNzIG9mIGhvdyBiZWhpbmQKKyAgICAvLyB0aGUgcmVhZGVyIGlzIHdpdGggcmVzcGVjdCB0byB0aGUgd3JpdGVyLiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIHNjaGVkdWxpbmcgc2VxdWVuY2UgaXMKKyAgICAvLyBwb3NzaWJsZSBhbmQgY2FuIGxlYWQgdG8gYSBzdGFydmF0aW9uIHNpdHVhdGlvbjoKKyAgICAvLyAtIFdyaXRlciBUMSB3cml0ZXMsIG92ZXJydW4gd2l0aCByZXNwZWN0IHRvIFJlYWRlciBUMgorICAgIC8vIC0gVDIgY2FsbHMgb2J0YWluKCkgYW5kIGdldHMgRU9WRVJGTE9XLCBUMiBwdHIgcGxhY2VkIG9uZSBidWZmZXIgc2l6ZSBiZWhpbmQgVDEgcHRyCisgICAgLy8gLSBUMSB3cml0ZSwgb3ZlcnJ1bgorICAgIC8vIC0gVDIgb2J0YWluKCksIEVPVkVSRkxPVyAoYW5kIHNvIG9uLi4uKQorICAgIC8vIFRvIGFkZHJlc3MgdGhpcyBpc3N1ZSwgd2UgbGltaXQgdGhlIG51bWJlciBvZiB0cmllcyBmb3IgdGhlIHJlYWRlciB0byBjYXRjaCB1cCB3aXRoCisgICAgLy8gdGhlIHdyaXRlci4KKyAgICBpbnQgdHJpZXMgPSAwOworICAgIHNpemVfdCBsb3N0VGVtcDsKKyAgICBkbyB7CisgICAgICAgIGF2YWlsVG9SZWFkID0gbUZpZm9SZWFkZXItPm9idGFpbihpb3ZlYywgY2FwYWNpdHksIE5VTEwgLyp0aW1lb3V0Ki8sICZsb3N0VGVtcCk7CisgICAgICAgIGxvc3QgKz0gbG9zdFRlbXA7CisgICAgfSB3aGlsZSAoYXZhaWxUb1JlYWQgPCAwIHx8ICsrdHJpZXMgPD0ga01heE9idGFpblRyaWVzKTsKKworICAgIGlmIChhdmFpbFRvUmVhZCA8PSAwKSB7CisgICAgICAgIEFMT0dXX0lGKGF2YWlsVG9SZWFkIDwgMCwgIk5CTG9nIFJlYWRlciAlcyBmYWlsZWQgdG8gY2F0Y2ggdXAgd2l0aCBXcml0ZXIiLCBtTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4obmV3IFNuYXBzaG90KCkpOworICAgIH0KKworICAgIC8vIENoYW5nZSB0byAjaWYgMSBmb3IgZGVidWdnaW5nLiBUaGlzIHN0YXRlbWVudCBpcyB1c2VmdWwgZm9yIGNoZWNraW5nIGJ1ZmZlciBmdWxsbmVzcyBsZXZlbHMKKyAgICAvLyAoYXMgc2VlbiBieSByZWFkZXIpIGFuZCBob3cgbXVjaCBkYXRhIHdhcyBsb3N0LiBJZiB5b3UgZmluZCB0aGF0IHRoZSBmdWxsbmVzcyBsZXZlbCBpcworICAgIC8vIGdldHRpbmcgY2xvc2UgdG8gZnVsbCwgb3IgdGhhdCBkYXRhIGxvc3MgaXMgaGFwcGVuaW5nIHRvIG9mdGVuLCB0aGVuIHlvdSBzaG91bGQKKyAgICAvLyBwcm9iYWJseSB0cnkgc29tZSBvZiB0aGUgZm9sbG93aW5nOgorICAgIC8vIC0gbG9nIGxlc3MgZGF0YQorICAgIC8vIC0gbG9nIGxlc3Mgb2Z0ZW4KKyAgICAvLyAtIGluY3JlYXNlIHRoZSBpbml0aWFsIHNoYXJlZCBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgdGhlIGJ1ZmZlcgorI2lmIDAKKyAgICBBTE9HRCgiZ2V0U25hcHNob3QgbmFtZT0lcywgYXZhaWxUb1JlYWQ9JXpkLCBjYXBhY2l0eT0lenUsIGZ1bGxuZXNzPSUuM2YsIGxvc3Q9JXp1IiwKKyAgICAgICAgICAgIG5hbWUoKS5jX3N0cigpLCBhdmFpbFRvUmVhZCwgY2FwYWNpdHksIChkb3VibGUpYXZhaWxUb1JlYWQgLyAoZG91YmxlKWNhcGFjaXR5LCBsb3N0KTsKKyNlbmRpZgorICAgIHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4gc25hcHNob3QobmV3IFNuYXBzaG90KGF2YWlsVG9SZWFkKSk7CisgICAgbWVtY3B5KHNuYXBzaG90LT5tRGF0YSwgKGNvbnN0IGNoYXIgKikgbUZpZm8tPmJ1ZmZlcigpICsgaW92ZWNbMF0ubU9mZnNldCwgaW92ZWNbMF0ubUxlbmd0aCk7CisgICAgaWYgKGlvdmVjWzFdLm1MZW5ndGggPiAwKSB7CisgICAgICAgIG1lbWNweShzbmFwc2hvdC0+bURhdGEgKyAoaW92ZWNbMF0ubUxlbmd0aCksCisgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKikgbUZpZm8tPmJ1ZmZlcigpICsgaW92ZWNbMV0ubU9mZnNldCwgaW92ZWNbMV0ubUxlbmd0aCk7CisgICAgfQorCisgICAgLy8gSGFuZGxlIGNvcnJ1cHRlZCBidWZmZXIKKyAgICAvLyBQb3RlbnRpYWxseSwgYSBidWZmZXIgaGFzIGNvcnJ1cHRlZCBkYXRhIG9uIGJvdGggYmVnaW5uaW5nIChkdWUgdG8gb3ZlcmZsb3cpIGFuZCBlbmQKKyAgICAvLyAoZHVlIHRvIGluY29tcGxldGUgZm9ybWF0IGVudHJ5KS4gQnV0IGV2ZW4gaWYgdGhlIGVuZCBmb3JtYXQgZW50cnkgaXMgaW5jb21wbGV0ZSwKKyAgICAvLyBpdCBlbmRzIGluIGEgY29tcGxldGUgZW50cnkgKHdoaWNoIGlzIG5vdCBhbiBGTVRfRU5EKS4gU28gaXMgc2FmZSB0byB0cmF2ZXJzZSBiYWNrd2FyZHMuCisgICAgLy8gVE9ETzogaGFuZGxlIGNsaWVudCBjb3JydXB0aW9uIChpbiB0aGUgbWlkZGxlIG9mIGEgYnVmZmVyKQorCisgICAgY29uc3QgdWludDhfdCAqYmFjayA9IHNuYXBzaG90LT5tRGF0YSArIGF2YWlsVG9SZWFkOworICAgIGNvbnN0IHVpbnQ4X3QgKmZyb250ID0gc25hcHNob3QtPm1EYXRhOworCisgICAgLy8gRmluZCBsYXN0IEZNVF9FTkQuIDxiYWNrPiBpcyBzaXR0aW5nIG9uIGFuIGVudHJ5IHdoaWNoIG1pZ2h0IGJlIHRoZSBtaWRkbGUgb2YgYSBGb3JtYXRFbnRyeS4KKyAgICAvLyBXZSBnbyBiYWNrd2FyZHMgdW50aWwgd2UgZmluZCBhbiBFVkVOVF9GTVRfRU5ELgorICAgIGNvbnN0IHVpbnQ4X3QgKmxhc3RFbmQgPSBmaW5kTGFzdFZhbGlkRW50cnkoZnJvbnQsIGJhY2ssIGludmFsaWRFbmRUeXBlcyk7CisgICAgaWYgKGxhc3RFbmQgPT0gbnVsbHB0cikgeworICAgICAgICBzbmFwc2hvdC0+bUVuZCA9IHNuYXBzaG90LT5tQmVnaW4gPSBFbnRyeUl0ZXJhdG9yKGZyb250KTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBlbmQgb2Ygc25hcHNob3QgcG9pbnRzIHRvIGFmdGVyIGxhc3QgRk1UX0VORCBlbnRyeQorICAgICAgICBzbmFwc2hvdC0+bUVuZCA9IEVudHJ5SXRlcmF0b3IobGFzdEVuZCkubmV4dCgpOworICAgICAgICAvLyBmaW5kIGZpcnN0IEZNVF9TVEFSVAorICAgICAgICBjb25zdCB1aW50OF90ICpmaXJzdFN0YXJ0ID0gbnVsbHB0cjsKKyAgICAgICAgY29uc3QgdWludDhfdCAqZmlyc3RTdGFydFRtcCA9IHNuYXBzaG90LT5tRW5kOworICAgICAgICB3aGlsZSAoKGZpcnN0U3RhcnRUbXAgPSBmaW5kTGFzdFZhbGlkRW50cnkoZnJvbnQsIGZpcnN0U3RhcnRUbXAsIGludmFsaWRCZWdpblR5cGVzKSkKKyAgICAgICAgICAgICAgICAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBmaXJzdFN0YXJ0ID0gZmlyc3RTdGFydFRtcDsKKyAgICAgICAgfQorICAgICAgICAvLyBmaXJzdFN0YXJ0IGlzIG51bGwgaWYgbm8gRk1UX1NUQVJUIGVudHJ5IHdhcyBmb3VuZCBiZWZvcmUgbGFzdEVuZAorICAgICAgICBpZiAoZmlyc3RTdGFydCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBzbmFwc2hvdC0+bUJlZ2luID0gc25hcHNob3QtPm1FbmQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzbmFwc2hvdC0+bUJlZ2luID0gRW50cnlJdGVyYXRvcihmaXJzdFN0YXJ0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGFkdmFuY2UgZmlmbyByZWFkZXIgaW5kZXggdG8gYWZ0ZXIgbGFzdCBlbnRyeSByZWFkLgorICAgIGlmIChmbHVzaCkgeworICAgICAgICBtRmlmb1JlYWRlci0+cmVsZWFzZShzbmFwc2hvdC0+bUVuZCAtIGZyb250KTsKKyAgICB9CisKKyAgICBzbmFwc2hvdC0+bUxvc3QgPSBsb3N0OworICAgIHJldHVybiBzbmFwc2hvdDsKK30KKworYm9vbCBSZWFkZXI6OmlzSU1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSkgY29uc3QKK3sKKyAgICByZXR1cm4gaU1lbW9yeSAhPSAwICYmIG1JTWVtb3J5ICE9IDAgJiYgaU1lbW9yeS0+cG9pbnRlcigpID09IG1JTWVtb3J5LT5wb2ludGVyKCk7Cit9CisKKy8vIFdlIG1ha2UgYSBzZXQgb2YgdGhlIGludmFsaWQgdHlwZXMgcmF0aGVyIHRoYW4gdGhlIHZhbGlkIHR5cGVzIHdoZW4gYWxpZ25pbmcKKy8vIFNuYXBzaG90IEVudHJ5SXRlcmF0b3JzIHRvIHZhbGlkIGVudHJpZXMgZHVyaW5nIGxvZyBjb3JydXB0aW9uIGNoZWNraW5nLgorLy8gVGhpcyBpcyBkb25lIGluIG9yZGVyIHRvIGF2b2lkIHRoZSBtYWludGVuYW5jZSBvdmVyaGVhZCBvZiBhZGRpbmcgYSBuZXcgRXZlbnQKKy8vIHR5cGUgdG8gdGhlIHR3byBzZXRzIGJlbG93IHdoZW5ldmVyIGEgbmV3IEV2ZW50IHR5cGUgaXMgY3JlYXRlZCwgYXMgaXQgaXMKKy8vIHZlcnkgbGlrZWx5IHRoYXQgbmV3IHR5cGVzIGFkZGVkIHdpbGwgYmUgdmFsaWQgdHlwZXMuCisvLyBDdXJyZW50bHksIGludmFsaWRCZWdpblR5cGVzIGFuZCBpbnZhbGlkRW5kVHlwZXMgYXJlIHVzZWQgdG8gaGFuZGxlIHRoZSBzcGVjaWFsCisvLyBjYXNlIG9mIGEgRm9ybWF0IEVudHJ5LCB3aGljaCBjb25zaXN0cyBvZiBhIHZhcmlhYmxlIG51bWJlciBvZiBzaW1wbGUgbG9nIGVudHJpZXMuCisvLyBJZiBhIG5ldyBFdmVudCBpcyBhZGRlZCB0aGF0IGNvbnNpc3RzIG9mIGEgdmFyaWFibGUgbnVtYmVyIG9mIHNpbXBsZSBsb2cgZW50cmllcywKKy8vIHRoZW4gdGhlc2Ugc2V0cyBuZWVkIHRvIGJlIHVwZGF0ZWQuCisKKy8vIFdlIHdhbnQgdGhlIGJlZ2lubmluZyBvZiBhIFNuYXBzaG90IHRvIHBvaW50IHRvIGFuIGVudHJ5IHRoYXQgaXMgbm90IGluCisvLyB0aGUgbWlkZGxlIG9mIGEgZm9ybWF0dGVkIGVudHJ5IGFuZCBub3QgYW4gRk1UX0VORC4KK2NvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxFdmVudD4gUmVhZGVyOjppbnZhbGlkQmVnaW5UeXBlcyB7CisgICAgRVZFTlRfRk1UX0FVVEhPUiwKKyAgICBFVkVOVF9GTVRfRU5ELAorICAgIEVWRU5UX0ZNVF9GTE9BVCwKKyAgICBFVkVOVF9GTVRfSEFTSCwKKyAgICBFVkVOVF9GTVRfSU5URUdFUiwKKyAgICBFVkVOVF9GTVRfUElELAorICAgIEVWRU5UX0ZNVF9TVFJJTkcsCisgICAgRVZFTlRfRk1UX1RJTUVTVEFNUCwKK307CisKKy8vIFdlIHdhbnQgdGhlIGVuZCBvZiBhIFNuYXBzaG90IHRvIHBvaW50IHRvIGFuIGVudHJ5IHRoYXQgaXMgbm90IGluCisvLyB0aGUgbWlkZGxlIG9mIGEgZm9ybWF0dGVkIGVudHJ5IGFuZCBub3QgYSBGTVRfU1RBUlQuCitjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8RXZlbnQ+IFJlYWRlcjo6aW52YWxpZEVuZFR5cGVzIHsKKyAgICBFVkVOVF9GTVRfQVVUSE9SLAorICAgIEVWRU5UX0ZNVF9GTE9BVCwKKyAgICBFVkVOVF9GTVRfSEFTSCwKKyAgICBFVkVOVF9GTVRfSU5URUdFUiwKKyAgICBFVkVOVF9GTVRfUElELAorICAgIEVWRU5UX0ZNVF9TVEFSVCwKKyAgICBFVkVOVF9GTVRfU1RSSU5HLAorICAgIEVWRU5UX0ZNVF9USU1FU1RBTVAsCit9OworCitjb25zdCB1aW50OF90ICpSZWFkZXI6OmZpbmRMYXN0VmFsaWRFbnRyeShjb25zdCB1aW50OF90ICpmcm9udCwgY29uc3QgdWludDhfdCAqYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxFdmVudD4gJmludmFsaWRUeXBlcykgeworICAgIGlmIChmcm9udCA9PSBudWxscHRyIHx8IGJhY2sgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgd2hpbGUgKGJhY2sgKyBFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0ID49IGZyb250KSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnByZXYgPSBiYWNrIC0gYmFja1tFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XSAtIEVudHJ5OjprT3ZlcmhlYWQ7CisgICAgICAgIGNvbnN0IEV2ZW50IHR5cGUgPSAoY29uc3QgRXZlbnQpcHJldltvZmZzZXRvZihlbnRyeSwgdHlwZSldOworICAgICAgICBpZiAocHJldiA8IGZyb250CisgICAgICAgICAgICAgICAgfHwgcHJldiArIHByZXZbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldICsgRW50cnk6OmtPdmVyaGVhZCAhPSBiYWNrCisgICAgICAgICAgICAgICAgfHwgdHlwZSA8PSBFVkVOVF9SRVNFUlZFRCB8fCB0eXBlID49IEVWRU5UX1VQUEVSX0JPVU5EKSB7CisgICAgICAgICAgICAvLyBwcmV2IHBvaW50cyB0byBhbiBvdXQgb2YgbGltaXRzIG9yIGluY29uc2lzdGVudCBlbnRyeQorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgLy8gaWYgaW52YWxpZFR5cGVzIGRvZXMgbm90IGNvbnRhaW4gdGhlIHR5cGUsIHRoZW4gdGhlIHR5cGUgaXMgdmFsaWQuCisgICAgICAgIGlmIChpbnZhbGlkVHlwZXMuZmluZCh0eXBlKSA9PSBpbnZhbGlkVHlwZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBwcmV2OworICAgICAgICB9CisgICAgICAgIGJhY2sgPSBwcmV2OworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsgLy8gbm8gZW50cnkgZm91bmQKK30KKworLy8gVE9ETyBmb3IgZnV0dXJlIGNvbXBhdGliaWxpdHksIHdvdWxkIHByZWZlciB0byBoYXZlIGEgZHVtcCgpIGdvIHRvIHN0cmluZywgYW5kIHRoZW4gZ28KKy8vIHRvIGZkIG9ubHkgd2hlbiBpbnZva2VkIHRocm91Z2ggYmluZGVyLgordm9pZCBEdW1wUmVhZGVyOjpkdW1wKGludCBmZCwgc2l6ZV90IGluZGVudCkKK3sKKyAgICBpZiAoZmQgPCAwKSByZXR1cm47CisgICAgc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PiBzbmFwc2hvdCA9IGdldFNuYXBzaG90KGZhbHNlIC8qZmx1c2gqLyk7CisgICAgaWYgKHNuYXBzaG90ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBTdHJpbmc4IHRpbWVzdGFtcCwgYm9keTsKKworICAgIC8vIFRPRE8gYWxsIGxvZ2dlZCB0eXBlcyBzaG91bGQgaGF2ZSBhIHByaW50YWJsZSBmb3JtYXQuCisgICAgLy8gVE9ETyBjYW4gd2UgbWFrZSB0aGUgcHJpbnRpbmcgZ2VuZXJpYz8KKyAgICBmb3IgKEVudHJ5SXRlcmF0b3IgaXQgPSBzbmFwc2hvdC0+YmVnaW4oKTsgaXQgIT0gc25hcHNob3QtPmVuZCgpOyArK2l0KSB7CisgICAgICAgIHN3aXRjaCAoaXQtPnR5cGUpIHsKKyAgICAgICAgY2FzZSBFVkVOVF9GTVRfU1RBUlQ6CisgICAgICAgICAgICBpdCA9IGhhbmRsZUZvcm1hdChGb3JtYXRFbnRyeShpdCksICZ0aW1lc3RhbXAsICZib2R5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX0xBVEVOQ1k6IHsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBsYXRlbmN5TXMgPSBpdC5wYXlsb2FkPGRvdWJsZT4oKTsKKyAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJFVkVOVF9MQVRFTkNZLCUuM2YiLCBsYXRlbmN5TXMpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX09WRVJSVU46IHsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgdHMgPSBpdC5wYXlsb2FkPGludDY0X3Q+KCk7CisgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiRVZFTlRfT1ZFUlJVTiwlbGxkIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih0cykpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1RIUkVBRF9JTkZPOiB7CisgICAgICAgICAgICBjb25zdCB0aHJlYWRfaW5mb190IGluZm8gPSBpdC5wYXlsb2FkPHRocmVhZF9pbmZvX3Q+KCk7CisgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiRVZFTlRfVEhSRUFEX0lORk8sJWQsJXMiLCBzdGF0aWNfY2FzdDxpbnQ+KGluZm8uaWQpLAorICAgICAgICAgICAgICAgICAgICB0aHJlYWRUeXBlVG9TdHJpbmcoaW5mby50eXBlKSk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfVU5ERVJSVU46IHsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgdHMgPSBpdC5wYXlsb2FkPGludDY0X3Q+KCk7CisgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiRVZFTlRfVU5ERVJSVU4sJWxsZCIsIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4odHMpKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9XQVJNVVBfVElNRTogeworICAgICAgICAgICAgY29uc3QgZG91YmxlIHRpbWVNcyA9IGl0LnBheWxvYWQ8ZG91YmxlPigpOworICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIkVWRU5UX1dBUk1VUF9USU1FLCUuM2YiLCB0aW1lTXMpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1dPUktfVElNRTogeworICAgICAgICAgICAgY29uc3QgaW50NjRfdCBtb25vdG9uaWNOcyA9IGl0LnBheWxvYWQ8aW50NjRfdD4oKTsKKyAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJFVkVOVF9XT1JLX1RJTUUsJWxsZCIsIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4obW9ub3RvbmljTnMpKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9USFJFQURfUEFSQU1TOiB7CisgICAgICAgICAgICBjb25zdCB0aHJlYWRfcGFyYW1zX3QgcGFyYW1zID0gaXQucGF5bG9hZDx0aHJlYWRfcGFyYW1zX3Q+KCk7CisgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiRVZFTlRfVEhSRUFEX1BBUkFNUywlenUsJXUiLCBwYXJhbXMuZnJhbWVDb3VudCwgcGFyYW1zLnNhbXBsZVJhdGUpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX0ZNVF9FTkQ6CisgICAgICAgIGNhc2UgRVZFTlRfUkVTRVJWRUQ6CisgICAgICAgIGNhc2UgRVZFTlRfVVBQRVJfQk9VTkQ6CisgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgid2FybmluZzogdW5leHBlY3RlZCBldmVudCAlZCIsIGl0LT50eXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFib2R5LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZHByaW50ZihmZCwgIiUuKnMlcyAlc1xuIiwgKGludClpbmRlbnQsICIiLCB0aW1lc3RhbXAuc3RyaW5nKCksIGJvZHkuc3RyaW5nKCkpOworICAgICAgICAgICAgYm9keS5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIHRpbWVzdGFtcC5jbGVhcigpOworICAgIH0KK30KKworRW50cnlJdGVyYXRvciBEdW1wUmVhZGVyOjpoYW5kbGVGb3JtYXQoY29uc3QgRm9ybWF0RW50cnkgJmZtdEVudHJ5LAorICAgICAgICBTdHJpbmc4ICp0aW1lc3RhbXAsIFN0cmluZzggKmJvZHkpCit7CisgICAgU3RyaW5nOCB0aW1lc3RhbXBMb2NhbDsKKyAgICBTdHJpbmc4IGJvZHlMb2NhbDsKKyAgICBpZiAodGltZXN0YW1wID09IG51bGxwdHIpIHsKKyAgICAgICAgdGltZXN0YW1wID0gJnRpbWVzdGFtcExvY2FsOworICAgIH0KKyAgICBpZiAoYm9keSA9PSBudWxscHRyKSB7CisgICAgICAgIGJvZHkgPSAmYm9keUxvY2FsOworICAgIH0KKworICAgIC8vIGxvZyB0aW1lc3RhbXAKKyAgICBjb25zdCBpbnQ2NF90IHRzID0gZm10RW50cnkudGltZXN0YW1wKCk7CisgICAgdGltZXN0YW1wLT5jbGVhcigpOworICAgIHRpbWVzdGFtcC0+YXBwZW5kRm9ybWF0KCJbJWQuJTAzZF0iLCAoaW50KSAodHMgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKSksCisgICAgICAgICAgICAgICAgICAgIChpbnQpICgodHMgLyAoMTAwMCAqIDEwMDApKSAlIDEwMDApKTsKKworICAgIC8vIGxvZyB1bmlxdWUgaGFzaAorICAgIGxvZ19oYXNoX3QgaGFzaCA9IGZtdEVudHJ5Lmhhc2goKTsKKyAgICAvLyBwcmludCBvbmx5IGxvd2VyIDE2Yml0IG9mIGhhc2ggYXMgaGV4IGFuZCBsaW5lIGFzIGludCB0byByZWR1Y2Ugc3BhbSBpbiB0aGUgbG9nCisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLjRYLSVkICIsIChpbnQpKGhhc2ggPj4gMTYpICYgMHhGRkZGLCAoaW50KSBoYXNoICYgMHhGRkZGKTsKKworICAgIC8vIGxvZyBhdXRob3IgKGlmIHByZXNlbnQpCisgICAgaGFuZGxlQXV0aG9yKGZtdEVudHJ5LCBib2R5KTsKKworICAgIC8vIGxvZyBzdHJpbmcKKyAgICBFbnRyeUl0ZXJhdG9yIGFyZyA9IGZtdEVudHJ5LmFyZ3MoKTsKKworICAgIGNvbnN0IGNoYXIqIGZtdCA9IGZtdEVudHJ5LmZvcm1hdFN0cmluZygpOworICAgIHNpemVfdCBmbXRfbGVuZ3RoID0gZm10RW50cnkuZm9ybWF0U3RyaW5nTGVuZ3RoKCk7CisKKyAgICBmb3IgKHNpemVfdCBmbXRfb2Zmc2V0ID0gMDsgZm10X29mZnNldCA8IGZtdF9sZW5ndGg7ICsrZm10X29mZnNldCkgeworICAgICAgICBpZiAoZm10W2ZtdF9vZmZzZXRdICE9ICclJykgeworICAgICAgICAgICAgYm9keS0+YXBwZW5kKCZmbXRbZm10X29mZnNldF0sIDEpOyAvLyBUT0RPIG9wdGltaXplIHRvIHdyaXRlIGNvbnNlY3V0aXZlIHN0cmluZ3MgYXQgb25jZQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2FzZSAiJSUiIgorICAgICAgICBpZiAoZm10WysrZm10X29mZnNldF0gPT0gJyUnKSB7CisgICAgICAgICAgICBib2R5LT5hcHBlbmQoIiUiKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIGNhc2UgIiVcMCIKKyAgICAgICAgaWYgKGZtdF9vZmZzZXQgPT0gZm10X2xlbmd0aCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBFdmVudCBldmVudCA9IChFdmVudCkgYXJnLT50eXBlOworICAgICAgICBzaXplX3QgbGVuZ3RoID0gYXJnLT5sZW5ndGg7CisKKyAgICAgICAgLy8gVE9ETyBjaGVjayBsZW5ndGggZm9yIGV2ZW50IHR5cGUgaXMgY29ycmVjdAorCisgICAgICAgIGlmIChldmVudCA9PSBFVkVOVF9GTVRfRU5EKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCBtb3JlIGNvbXBsZXggZm9ybWF0dGluZyBzdWNoIGFzICUuM2YKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0dW0gPSBhcmctPmRhdGE7IC8vIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZXZlbnQgYXJncworICAgICAgICBzd2l0Y2goZm10W2ZtdF9vZmZzZXRdKQorICAgICAgICB7CisgICAgICAgIGNhc2UgJ3MnOiAvLyBzdHJpbmcKKyAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX0ZNVF9TVFJJTkcsCisgICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIHN0cmluZyBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgYm9keS0+YXBwZW5kKChjb25zdCBjaGFyKikgZGF0dW0sIGxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICd0JzogLy8gdGltZXN0YW1wCisgICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9GTVRfVElNRVNUQU1QLAorICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciB0aW1lc3RhbXAgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGFwcGVuZFRpbWVzdGFtcChib2R5LCBkYXR1bSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdkJzogLy8gaW50ZWdlcgorICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfRk1UX0lOVEVHRVIsCisgICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIGludGVnZXIgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGFwcGVuZEludChib2R5LCBkYXR1bSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdmJzogLy8gZmxvYXQKKyAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX0ZNVF9GTE9BVCwKKyAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3IgZmxvYXQgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGFwcGVuZEZsb2F0KGJvZHksIGRhdHVtKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3AnOiAvLyBwaWQKKyAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX0ZNVF9QSUQsCisgICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIHBpZCBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgYXBwZW5kUElEKGJvZHksIGRhdHVtLCBsZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJOQkxvZyBSZWFkZXIgZW5jb3VudGVyZWQgdW5rbm93biBjaGFyYWN0ZXIgJWMiLCBmbXRbZm10X29mZnNldF0pOworICAgICAgICB9CisgICAgICAgICsrYXJnOworICAgIH0KKyAgICBBTE9HV19JRihhcmctPnR5cGUgIT0gRVZFTlRfRk1UX0VORCwgIkV4cGVjdGVkIGVuZCBvZiBmb3JtYXQsIGdvdCAlZCIsIGFyZy0+dHlwZSk7CisgICAgcmV0dXJuIGFyZzsKK30KKwordm9pZCBEdW1wUmVhZGVyOjphcHBlbmRJbnQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSkKK3sKKyAgICBpZiAoYm9keSA9PSBudWxscHRyIHx8IGRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vaW50IHggPSAqKChpbnQqKSBkYXRhKTsKKyAgICBpbnQgeDsKKyAgICBtZW1jcHkoJngsIGRhdGEsIHNpemVvZih4KSk7CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCI8JWQ+IiwgeCk7Cit9CisKK3ZvaWQgRHVtcFJlYWRlcjo6YXBwZW5kRmxvYXQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSkKK3sKKyAgICBpZiAoYm9keSA9PSBudWxscHRyIHx8IGRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZsb2F0IGY7CisgICAgbWVtY3B5KCZmLCBkYXRhLCBzaXplb2YoZikpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiPCVmPiIsIGYpOworfQorCit2b2lkIER1bXBSZWFkZXI6OmFwcGVuZFBJRChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3QgbGVuZ3RoKQoreworICAgIGlmIChib2R5ID09IG51bGxwdHIgfHwgZGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcGlkX3QgaWQgPSAqKChwaWRfdCopIGRhdGEpOworICAgIGNoYXIgKiBuYW1lID0gJigoY2hhciopIGRhdGEpW3NpemVvZihwaWRfdCldOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiPFBJRDogJWQsIG5hbWU6ICUuKnM+IiwgaWQsIChpbnQpIChsZW5ndGggLSBzaXplb2YocGlkX3QpKSwgbmFtZSk7Cit9CisKK3ZvaWQgRHVtcFJlYWRlcjo6YXBwZW5kVGltZXN0YW1wKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpCit7CisgICAgaWYgKGJvZHkgPT0gbnVsbHB0ciB8fCBkYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQ2NF90IHRzOworICAgIG1lbWNweSgmdHMsIGRhdGEsIHNpemVvZih0cykpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiWyVkLiUwM2RdIiwgKGludCkgKHRzIC8gKDEwMDAgKiAxMDAwICogMTAwMCkpLAorICAgICAgICAgICAgICAgICAgICAoaW50KSAoKHRzIC8gKDEwMDAgKiAxMDAwKSkgJSAxMDAwKSk7Cit9CisKK1N0cmluZzggRHVtcFJlYWRlcjo6YnVmZmVyRHVtcChjb25zdCB1aW50OF90ICpidWZmZXIsIHNpemVfdCBzaXplKQoreworICAgIFN0cmluZzggc3RyOworICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gc3RyOworICAgIH0KKyAgICBzdHIuYXBwZW5kKCJbICIpOworICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgc3RyLmFwcGVuZEZvcm1hdCgiJWQgIiwgYnVmZmVyW2ldKTsKKyAgICB9CisgICAgc3RyLmFwcGVuZCgiXSIpOworICAgIHJldHVybiBzdHI7Cit9CisKK1N0cmluZzggRHVtcFJlYWRlcjo6YnVmZmVyRHVtcChjb25zdCBFbnRyeUl0ZXJhdG9yICZpdCkKK3sKKyAgICByZXR1cm4gYnVmZmVyRHVtcChpdCwgaXQtPmxlbmd0aCArIEVudHJ5OjprT3ZlcmhlYWQpOworfQorCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmNwcCBiL21lZGlhL2xpYm5ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmNwcAppbmRleCA4MjdlNzMxLi5iMDUwYjgzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5jcHAKKysrIGIvbWVkaWEvbGlibmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuY3BwCkBAIC0xNSw5ICsxNSwxMSBAQAogICovCiAKICNkZWZpbmUgTE9HX1RBRyAiUmVwb3J0UGVyZm9ybWFuY2UiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNpbmNsdWRlIDxmc3RyZWFtPgogI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxxdWV1ZT4KICNpbmNsdWRlIDxzdGRhcmcuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KQEAgLTI3LDIzICsyOSwxOTUgQEAKICNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KKyNpbmNsdWRlIDxqc29uL2pzb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FdmVudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlIHsKIAorc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxKc29uOjpWYWx1ZT4gZHVtcFRvSnNvbihjb25zdCBQZXJmb3JtYW5jZURhdGEmIGRhdGEpCit7CisgICAgc3RkOjp1bmlxdWVfcHRyPEpzb246OlZhbHVlPiByb290UHRyID0gc3RkOjptYWtlX3VuaXF1ZTxKc29uOjpWYWx1ZT4oSnNvbjo6b2JqZWN0VmFsdWUpOworICAgIEpzb246OlZhbHVlJiByb290ID0gKnJvb3RQdHI7CisgICAgcm9vdFsiaW9IYW5kbGUiXSA9IGRhdGEudGhyZWFkSW5mby5pZDsKKyAgICByb290WyJ0eXBlIl0gPSBOQkxvZzo6dGhyZWFkVHlwZVRvU3RyaW5nKGRhdGEudGhyZWFkSW5mby50eXBlKTsKKyAgICByb290WyJmcmFtZUNvdW50Il0gPSAoSnNvbjo6VmFsdWU6OkludClkYXRhLnRocmVhZFBhcmFtcy5mcmFtZUNvdW50OworICAgIHJvb3RbInNhbXBsZVJhdGUiXSA9IChKc29uOjpWYWx1ZTo6SW50KWRhdGEudGhyZWFkUGFyYW1zLnNhbXBsZVJhdGU7CisgICAgcm9vdFsid29ya01zSGlzdCJdID0gZGF0YS53b3JrSGlzdC50b1N0cmluZygpOworICAgIHJvb3RbImxhdGVuY3lNc0hpc3QiXSA9IGRhdGEubGF0ZW5jeUhpc3QudG9TdHJpbmcoKTsKKyAgICByb290WyJ3YXJtdXBNc0hpc3QiXSA9IGRhdGEud2FybXVwSGlzdC50b1N0cmluZygpOworICAgIHJvb3RbInVuZGVycnVucyJdID0gKEpzb246OlZhbHVlOjpJbnQ2NClkYXRhLnVuZGVycnVuczsKKyAgICByb290WyJvdmVycnVucyJdID0gKEpzb246OlZhbHVlOjpJbnQ2NClkYXRhLm92ZXJydW5zOworICAgIHJvb3RbImFjdGl2ZU1zIl0gPSAoSnNvbjo6VmFsdWU6OkludDY0KW5zMm1zKGRhdGEuYWN0aXZlKTsKKyAgICByb290WyJkdXJhdGlvbk1zIl0gPSAoSnNvbjo6VmFsdWU6OkludDY0KW5zMm1zKHN5c3RlbVRpbWUoKSAtIGRhdGEuc3RhcnQpOworICAgIHJldHVybiByb290UHRyOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgZHVtcEhpc3RvZ3JhbXNUb1N0cmluZyhjb25zdCBQZXJmb3JtYW5jZURhdGEmIGRhdGEpCit7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgc3MgPDwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIjsKKyAgICBzcyA8PCAiVGhyZWFkIHR5cGU9IiA8PCBOQkxvZzo6dGhyZWFkVHlwZVRvU3RyaW5nKGRhdGEudGhyZWFkSW5mby50eXBlKQorICAgICAgICAgICAgPDwgIiBoYW5kbGU9IiA8PCBkYXRhLnRocmVhZEluZm8uaWQKKyAgICAgICAgICAgIDw8ICIgc2FtcGxlUmF0ZT0iIDw8IGRhdGEudGhyZWFkUGFyYW1zLnNhbXBsZVJhdGUKKyAgICAgICAgICAgIDw8ICIgZnJhbWVDb3VudD0iIDw8IGRhdGEudGhyZWFkUGFyYW1zLmZyYW1lQ291bnQgPDwgIlxuIjsKKyAgICBzcyA8PCAiICBUaHJlYWQgd29yayB0aW1lcyBpbiBtczpcbiIgPDwgZGF0YS53b3JrSGlzdC5hc2NpaUFydFN0cmluZyg0IC8qaW5kZW50Ki8pOworICAgIHNzIDw8ICIgIFRocmVhZCBsYXRlbmNpZXMgaW4gbXM6XG4iIDw8IGRhdGEubGF0ZW5jeUhpc3QuYXNjaWlBcnRTdHJpbmcoNCAvKmluZGVudCovKTsKKyAgICBzcyA8PCAiICBUaHJlYWQgd2FybXVwIHRpbWVzIGluIG1zOlxuIiA8PCBkYXRhLndhcm11cEhpc3QuYXNjaWlBcnRTdHJpbmcoNCAvKmluZGVudCovKTsKKyAgICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK3ZvaWQgZHVtcEpzb24oaW50IGZkLCBjb25zdCBzdGQ6Om1hcDxpbnQsIFBlcmZvcm1hbmNlRGF0YT4mIHRocmVhZERhdGFNYXApCit7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgSnNvbjo6VmFsdWUgcm9vdChKc29uOjphcnJheVZhbHVlKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0ZW0gOiB0aHJlYWREYXRhTWFwKSB7CisgICAgICAgIGNvbnN0IFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZURhdGEmIGRhdGEgPSBpdGVtLnNlY29uZDsKKyAgICAgICAgLy8gU2tpcCB0aHJlYWRzIHRoYXQgZG8gbm90IGhhdmUgcGVyZm9ybWFuY2UgZGF0YSByZWNvcmRlZCB5ZXQuCisgICAgICAgIGlmIChkYXRhLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxKc29uOjpWYWx1ZT4gZGF0YUpzb24gPSBSZXBvcnRQZXJmb3JtYW5jZTo6ZHVtcFRvSnNvbihkYXRhKTsKKyAgICAgICAgaWYgKGRhdGFKc29uID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgICgqZGF0YUpzb24pWyJ0aHJlYWROdW0iXSA9IGl0ZW0uZmlyc3Q7CisgICAgICAgIHJvb3QuYXBwZW5kKCpkYXRhSnNvbik7CisgICAgfQorICAgIEpzb246OlN0eWxlZFdyaXRlciB3cml0ZXI7CisgICAgc3RkOjpzdHJpbmcgcm9vdFN0ciA9IHdyaXRlci53cml0ZShyb290KTsKKyAgICB3cml0ZShmZCwgcm9vdFN0ci5jX3N0cigpLCByb290U3RyLnNpemUoKSk7Cit9CisKK3ZvaWQgZHVtcFBsb3RzKGludCBmZCwgY29uc3Qgc3RkOjptYXA8aW50LCBQZXJmb3JtYW5jZURhdGE+JiB0aHJlYWREYXRhTWFwKQoreworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byAmaXRlbSA6IHRocmVhZERhdGFNYXApIHsKKyAgICAgICAgY29uc3QgUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlRGF0YSYgZGF0YSA9IGl0ZW0uc2Vjb25kOworICAgICAgICBpZiAoZGF0YS5lbXB0eSgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnN0cmluZyBoaXN0cyA9IFJlcG9ydFBlcmZvcm1hbmNlOjpkdW1wSGlzdG9ncmFtc1RvU3RyaW5nKGRhdGEpOworICAgICAgICB3cml0ZShmZCwgaGlzdHMuY19zdHIoKSwgaGlzdHMuc2l6ZSgpKTsKKyAgICB9Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBkdW1wUmV0cm9TdHJpbmcoY29uc3QgUGVyZm9ybWFuY2VEYXRhJiBkYXRhLCBpbnQ2NF90IG5vdykKK3sKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICBzcyA8PCBOQkxvZzo6dGhyZWFkVHlwZVRvU3RyaW5nKGRhdGEudGhyZWFkSW5mby50eXBlKSA8PCAiLCIgPDwgZGF0YS50aHJlYWRJbmZvLmlkIDw8ICJcbiI7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVtIDogZGF0YS5zbmFwc2hvdHMpIHsKKyAgICAgICAgLy8gVE9ETyB1c2UgYW4gZW51bSB0byBzdHJpbmcgY29udmVyc2lvbiBtZXRob2QuIE9uZSBnb29kIGlkZWE6CisgICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMzgxNTcKKyAgICAgICAgaWYgKGl0ZW0uZmlyc3QgPT0gTkJMb2c6OkVWRU5UX1VOREVSUlVOKSB7CisgICAgICAgICAgICBzcyA8PCAiRVZFTlRfVU5ERVJSVU4sIjsKKyAgICAgICAgfSBlbHNlIGlmIChpdGVtLmZpcnN0ID09IE5CTG9nOjpFVkVOVF9PVkVSUlVOKSB7CisgICAgICAgICAgICBzcyA8PCAiRVZFTlRfT1ZFUlJVTiwiOworICAgICAgICB9CisgICAgICAgIHNzIDw8IG5vdyAtIGl0ZW0uc2Vjb25kIDw8ICJcbiI7CisgICAgfQorICAgIHNzIDw8ICJcbiI7CisgICAgcmV0dXJuIHNzLnN0cigpOworfQorCit2b2lkIGR1bXBSZXRybyhpbnQgZmQsIGNvbnN0IHN0ZDo6bWFwPGludCwgUGVyZm9ybWFuY2VEYXRhPiYgdGhyZWFkRGF0YU1hcCkKK3sKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZW0gOiB0aHJlYWREYXRhTWFwKSB7CisgICAgICAgIGNvbnN0IFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZURhdGEmIGRhdGEgPSBpdGVtLnNlY29uZDsKKyAgICAgICAgaWYgKGRhdGEuc25hcHNob3RzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHJldHJvU3RyID0gZHVtcFJldHJvU3RyaW5nKGRhdGEsIG5vdyk7CisgICAgICAgIHdyaXRlKGZkLCByZXRyb1N0ci5jX3N0cigpLCByZXRyb1N0ci5zaXplKCkpOworICAgIH0KK30KKworYm9vbCBzZW5kVG9NZWRpYU1ldHJpY3MoY29uc3QgUGVyZm9ybWFuY2VEYXRhJiBkYXRhKQoreworICAgIC8vIFNlZSBkb2N1bWVudGF0aW9uIGZvciB0aGVzZSBtZXRyaWNzIGhlcmU6CisgICAgLy8gZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMTEtLTZkeU9YVk9wYWNZUUxaaWFPWTVRVnRRalV5cU54MnpUOWNDekxLWUUvZWRpdD91c3A9c2hhcmluZworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrVGhyZWFkVHlwZVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW90aHJlYWQudHlwZSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtUaHJlYWRGcmFtZUNvdW50W10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC5mcmFtZWNvdW50IjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZFNhbXBsZVJhdGVbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLnNhbXBsZXJhdGUiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrVGhyZWFkV29ya0hpc3RbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLndvcmtNcy5oaXN0IjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZExhdGVuY3lIaXN0W10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC5sYXRlbmN5TXMuaGlzdCI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtUaHJlYWRXYXJtdXBIaXN0W10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC53YXJtdXBNcy5oaXN0IjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZFVuZGVycnVuc1tdID0gImFuZHJvaWQubWVkaWEuYXVkaW90aHJlYWQudW5kZXJydW5zIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZE92ZXJydW5zW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC5vdmVycnVucyI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtUaHJlYWRBY3RpdmVbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLmFjdGl2ZU1zIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZER1cmF0aW9uW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC5kdXJhdGlvbk1zIjsKKworICAgIC8vIEN1cnJlbnRseSwgd2Ugb25seSBhbGxvdyBGYXN0TWl4ZXIgdGhyZWFkIGRhdGEgdG8gYmUgc2VudCB0byBNZWRpYSBNZXRyaWNzLgorICAgIGlmIChkYXRhLnRocmVhZEluZm8udHlwZSAhPSBOQkxvZzo6RkFTVE1JWEVSKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFBbmFseXRpY3NJdGVtPiBpdGVtKE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKCJhdWRpb3RocmVhZCIpKTsKKworICAgIGNvbnN0IEhpc3RvZ3JhbSAmd29ya0hpc3QgPSBkYXRhLndvcmtIaXN0OworICAgIGlmICh3b3JrSGlzdC50b3RhbENvdW50KCkgPiAwKSB7CisgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa1RocmVhZFdvcmtIaXN0LCB3b3JrSGlzdC50b1N0cmluZygpLmNfc3RyKCkpOworICAgIH0KKworICAgIGNvbnN0IEhpc3RvZ3JhbSAmbGF0ZW5jeUhpc3QgPSBkYXRhLmxhdGVuY3lIaXN0OworICAgIGlmIChsYXRlbmN5SGlzdC50b3RhbENvdW50KCkgPiAwKSB7CisgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa1RocmVhZExhdGVuY3lIaXN0LCBsYXRlbmN5SGlzdC50b1N0cmluZygpLmNfc3RyKCkpOworICAgIH0KKworICAgIGNvbnN0IEhpc3RvZ3JhbSAmd2FybXVwSGlzdCA9IGRhdGEud2FybXVwSGlzdDsKKyAgICBpZiAod2FybXVwSGlzdC50b3RhbENvdW50KCkgPiAwKSB7CisgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa1RocmVhZFdhcm11cEhpc3QsIHdhcm11cEhpc3QudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBpZiAoZGF0YS51bmRlcnJ1bnMgPiAwKSB7CisgICAgICAgIGl0ZW0tPnNldEludDY0KGtUaHJlYWRVbmRlcnJ1bnMsIGRhdGEudW5kZXJydW5zKTsKKyAgICB9CisKKyAgICBpZiAoZGF0YS5vdmVycnVucyA+IDApIHsKKyAgICAgICAgaXRlbS0+c2V0SW50NjQoa1RocmVhZE92ZXJydW5zLCBkYXRhLm92ZXJydW5zKTsKKyAgICB9CisKKyAgICAvLyBTZW5kIHRvIE1lZGlhIE1ldHJpY3MgaWYgdGhlIHJlY29yZCBpcyBub3QgZW1wdHkuCisgICAgLy8gVGhlIHRocmVhZCBhbmQgdGltZSBpbmZvIGFyZSBhZGRlZCBpbnNpZGUgdGhlIGlmIHN0YXRlbWVudCBiZWNhdXNlCisgICAgLy8gd2Ugd2FudCB0byBzZW5kIHRoZW0gb25seSBpZiB0aGVyZSBhcmUgcGVyZm9ybWFuY2UgbWV0cmljcyB0byBzZW5kLgorICAgIGlmIChpdGVtLT5jb3VudCgpID4gMCkgeworICAgICAgICAvLyBBZGQgdGhyZWFkIGluZm8gZmllbGRzLgorICAgICAgICBjb25zdCBjaGFyICogY29uc3QgdHlwZVN0cmluZyA9IE5CTG9nOjp0aHJlYWRUeXBlVG9TdHJpbmcoZGF0YS50aHJlYWRJbmZvLnR5cGUpOworICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtUaHJlYWRUeXBlLCB0eXBlU3RyaW5nKTsKKyAgICAgICAgaXRlbS0+c2V0SW50MzIoa1RocmVhZEZyYW1lQ291bnQsIGRhdGEudGhyZWFkUGFyYW1zLmZyYW1lQ291bnQpOworICAgICAgICBpdGVtLT5zZXRJbnQzMihrVGhyZWFkU2FtcGxlUmF0ZSwgZGF0YS50aHJlYWRQYXJhbXMuc2FtcGxlUmF0ZSk7CisgICAgICAgIC8vIEFkZCB0aW1lIGluZm8gZmllbGRzLgorICAgICAgICBpdGVtLT5zZXRJbnQ2NChrVGhyZWFkQWN0aXZlLCBkYXRhLmFjdGl2ZSAvIDEwMDAwMDApOworICAgICAgICBpdGVtLT5zZXRJbnQ2NChrVGhyZWFkRHVyYXRpb24sIChzeXN0ZW1UaW1lKCkgLSBkYXRhLnN0YXJ0KSAvIDEwMDAwMDApOworICAgICAgICByZXR1cm4gaXRlbS0+c2VsZnJlY29yZCgpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8vIFRPRE86IHVzZSBhIGZ1bmN0aW9uIGxpa2UgdGhpcyB0byBleHRyYWN0IGxvZ2ljIGZyb20gd3JpdGVUb0ZpbGUKIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS85Mjc5NjIwCiAKIC8vIFdyaXRlcyBvdXRsaWVyIGludGVydmFscywgdGltZXN0YW1wcywgYW5kIGhpc3RvZ3JhbXMgc3Bhbm5pbmcgbG9uZyB0aW1lIGludGVydmFscyB0byBmaWxlLgogLy8gVE9ETzogd3JpdGUgZGF0YSBpbiBiaW5hcnkgZm9ybWF0Ci12b2lkIHdyaXRlVG9GaWxlKGNvbnN0IHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdG9ncmFtPj4gJmhpc3RzLAordm9pZCB3cml0ZVRvRmlsZShjb25zdCBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjx0aW1lc3RhbXAsIEhpc3Q+PiAmaGlzdHMsCiAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPG1zSW50ZXJ2YWwsIHRpbWVzdGFtcD4+ICZvdXRsaWVyRGF0YSwKICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpkZXF1ZTx0aW1lc3RhbXA+ICZwZWFrVGltZXN0YW1wcywKICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGRpcmVjdG9yeSwgYm9vbCBhcHBlbmQsIGludCBhdXRob3IsIGxvZ19oYXNoX3QgaGFzaCkgewpAQCAtMTI4LDYgKzMwMiw1IEBACiAgICAgcGZzLmNsb3NlKCk7CiB9CiAKLX0gLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCi0KK30gICAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvVGltZWxpbmUuY3BwIGIvbWVkaWEvbGlibmJsb2cvVGltZWxpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwOWIwM2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9UaW1lbGluZS5jcHAKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3JvdW5kdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9UaW1lbGluZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgTkJMb2cgeworCisjaWYgMCAgIC8vIEZJWE1FIHNlZSBub3RlIGluIFRpbWVsaW5lLmgKK05CTG9nOjpUaW1lbGluZTo6VGltZWxpbmUoc2l6ZV90IHNpemUsIHZvaWQgKnNoYXJlZCkKKyAgICA6IG1TaXplKHJvdW5kdXAoc2l6ZSkpLCBtT3duKHNoYXJlZCA9PSBOVUxMKSwKKyAgICAgIG1TaGFyZWQoKFNoYXJlZCAqKSAobU93biA/IG5ldyBjaGFyW3NoYXJlZFNpemUoc2l6ZSldIDogc2hhcmVkKSkKK3sKKyAgICBuZXcgKG1TaGFyZWQpIFNoYXJlZDsKK30KKworTkJMb2c6OlRpbWVsaW5lOjp+VGltZWxpbmUoKQoreworICAgIG1TaGFyZWQtPn5TaGFyZWQoKTsKKyAgICBpZiAobU93bikgeworICAgICAgICBkZWxldGVbXSAoY2hhciAqKSBtU2hhcmVkOworICAgIH0KK30KKyNlbmRpZgorCisvKnN0YXRpYyovCitzaXplX3QgVGltZWxpbmU6OnNoYXJlZFNpemUoc2l6ZV90IHNpemUpCit7CisgICAgLy8gVE9ETyBmaWZvIG5vdyBzdXBwb3J0cyBub24tcG93ZXItb2YtMiBidWZmZXIgc2l6ZXMsIHNvIGNvdWxkIHJlbW92ZSB0aGUgcm91bmR1cAorICAgIHJldHVybiBzaXplb2YoU2hhcmVkKSArIHJvdW5kdXAoc2l6ZSk7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgTkJMb2cKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvV3JpdGVyLmNwcCBiL21lZGlhL2xpYm5ibG9nL1dyaXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEzYmQ1MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL1dyaXRlci5jcHAKQEAgLTAsMCArMSwzMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk5CTG9nIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9maWZvLmg+CisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FbnRyeS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0V2ZW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1RpbWVsaW5lLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvV3JpdGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIE5CTG9nIHsKKworV3JpdGVyOjpXcml0ZXIodm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSkKKyAgICA6IG1TaGFyZWQoKFNoYXJlZCAqKSBzaGFyZWQpLAorICAgICAgbUZpZm8obVNoYXJlZCAhPSBOVUxMID8KKyAgICAgICAgbmV3IGF1ZGlvX3V0aWxzX2ZpZm8oc2l6ZSwgc2l6ZW9mKHVpbnQ4X3QpLAorICAgICAgICAgICAgbVNoYXJlZC0+bUJ1ZmZlciwgbVNoYXJlZC0+bVJlYXIsIE5VTEwgLyp0aHJvdHRsZXNGcm9udCovKSA6IE5VTEwpLAorICAgICAgbUZpZm9Xcml0ZXIobUZpZm8gIT0gTlVMTCA/IG5ldyBhdWRpb191dGlsc19maWZvX3dyaXRlcigqbUZpZm8pIDogTlVMTCksCisgICAgICBtRW5hYmxlZChtRmlmb1dyaXRlciAhPSBOVUxMKQoreworICAgIC8vIGNhY2hpbmcgcGlkIGFuZCBwcm9jZXNzIG5hbWUKKyAgICBwaWRfdCBpZCA9IDo6Z2V0cGlkKCk7CisgICAgY2hhciBwcm9jTmFtZVsxNl07CisgICAgaW50IHN0YXR1cyA9IHByY3RsKFBSX0dFVF9OQU1FLCBwcm9jTmFtZSk7CisgICAgaWYgKHN0YXR1cykgeyAgLy8gZXJyb3IgZ2V0dGluZyBwcm9jZXNzIG5hbWUKKyAgICAgICAgcHJvY05hbWVbMF0gPSAnXDAnOworICAgIH0KKyAgICBzaXplX3QgbGVuZ3RoID0gc3RybGVuKHByb2NOYW1lKTsKKyAgICBtUGlkVGFnU2l6ZSA9IGxlbmd0aCArIHNpemVvZihwaWRfdCk7CisgICAgbVBpZFRhZyA9IG5ldyBjaGFyW21QaWRUYWdTaXplXTsKKyAgICBtZW1jcHkobVBpZFRhZywgJmlkLCBzaXplb2YocGlkX3QpKTsKKyAgICBtZW1jcHkobVBpZFRhZyArIHNpemVvZihwaWRfdCksIHByb2NOYW1lLCBsZW5ndGgpOworfQorCitXcml0ZXI6OldyaXRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUpCisgICAgOiBXcml0ZXIoaU1lbW9yeSAhPSAwID8gKFNoYXJlZCAqKSBpTWVtb3J5LT5wb2ludGVyKCkgOiBOVUxMLCBzaXplKQoreworICAgIG1JTWVtb3J5ID0gaU1lbW9yeTsKK30KKworV3JpdGVyOjp+V3JpdGVyKCkKK3sKKyAgICBkZWxldGUgbUZpZm9Xcml0ZXI7CisgICAgZGVsZXRlIG1GaWZvOworICAgIGRlbGV0ZVtdIG1QaWRUYWc7Cit9CisKK3ZvaWQgV3JpdGVyOjpsb2coY29uc3QgY2hhciAqc3RyaW5nKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHN0cmluZyA9PSBOVUxMLCAiQXR0ZW1wdGVkIHRvIGxvZyBOVUxMIHN0cmluZyIpOworICAgIHNpemVfdCBsZW5ndGggPSBzdHJsZW4oc3RyaW5nKTsKKyAgICBpZiAobGVuZ3RoID4gRW50cnk6OmtNYXhMZW5ndGgpIHsKKyAgICAgICAgbGVuZ3RoID0gRW50cnk6OmtNYXhMZW5ndGg7CisgICAgfQorICAgIGxvZyhFVkVOVF9TVFJJTkcsIHN0cmluZywgbGVuZ3RoKTsKK30KKwordm9pZCBXcml0ZXI6OmxvZ2YoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoYXAsIGZtdCk7CisgICAgV3JpdGVyOjpsb2d2ZihmbXQsIGFwKTsgICAgIC8vIHRoZSBXcml0ZXI6OiBpcyBuZWVkZWQgdG8gYXZvaWQgdmlydHVhbCBkaXNwYXRjaCBmb3IgTG9ja2VkV3JpdGVyCisgICAgdmFfZW5kKGFwKTsKK30KKwordm9pZCBXcml0ZXI6OmxvZ1RpbWVzdGFtcCgpCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKKyAgICBpZiAoIWNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHMpKSB7CisgICAgICAgIGxvZyhFVkVOVF9USU1FU1RBTVAsICZ0cywgc2l6ZW9mKHRzKSk7CisgICAgfQorfQorCit2b2lkIFdyaXRlcjo6bG9nRm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgbG9nX2hhc2hfdCBoYXNoLCAuLi4pCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoYXAsIGhhc2gpOworICAgIFdyaXRlcjo6bG9nVkZvcm1hdChmbXQsIGhhc2gsIGFwKTsKKyAgICB2YV9lbmQoYXApOworfQorCit2b2lkIFdyaXRlcjo6bG9nRXZlbnRIaXN0VHMoRXZlbnQgZXZlbnQsIGxvZ19oYXNoX3QgaGFzaCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgSGlzdFRzRW50cnkgZGF0YTsKKyAgICBkYXRhLmhhc2ggPSBoYXNoOworICAgIGRhdGEudHMgPSBzeXN0ZW1UaW1lKCk7CisgICAgaWYgKGRhdGEudHMgPiAwKSB7CisgICAgICAgIGxvZyhldmVudCwgJmRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgdGltZXN0YW1wIik7CisgICAgfQorfQorCitib29sIFdyaXRlcjo6aXNFbmFibGVkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbUVuYWJsZWQ7Cit9CisKK2Jvb2wgV3JpdGVyOjpzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBib29sIG9sZCA9IG1FbmFibGVkOworICAgIG1FbmFibGVkID0gZW5hYmxlZCAmJiBtU2hhcmVkICE9IE5VTEw7CisgICAgcmV0dXJuIG9sZDsKK30KKwordm9pZCBXcml0ZXI6OmxvZyhjb25zdCBFbnRyeSAmZXRyLCBib29sIHRydXN0ZWQpCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghdHJ1c3RlZCkgeworICAgICAgICBsb2coZXRyLm1FdmVudCwgZXRyLm1EYXRhLCBldHIubUxlbmd0aCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY29uc3Qgc2l6ZV90IG5lZWQgPSBldHIubUxlbmd0aCArIEVudHJ5OjprT3ZlcmhlYWQ7IC8vIG1FdmVudCwgbUxlbmd0aCwgZGF0YVttTGVuZ3RoXSwgbUxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkID0gbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gRklGTworCisgICAgLy8gRklYTUUgb3B0aW1pemUgdGhpcyB1c2luZyBtZW1jcHkgZm9yIHRoZSBkYXRhIHBhcnQgb2YgdGhlIEVudHJ5LgorICAgIC8vIFRoZSBFbnRyeSBjb3VsZCBoYXZlIGEgbWV0aG9kIGNvcHlUbyhwdHIsIG9mZnNldCwgc2l6ZSkgdG8gb3B0aW1pemUgdGhlIGNvcHkuCisgICAgLy8gY2hlY2tzIHNpemUgb2YgYSBzaW5nbGUgbG9nIEVudHJ5OiB0eXBlLCBsZW5ndGgsIGRhdGEgcG9pbnRlciBhbmQgZW5kaW5nCisgICAgdWludDhfdCB0ZW1wW0VudHJ5OjprTWF4TGVuZ3RoICsgRW50cnk6OmtPdmVyaGVhZF07CisgICAgLy8gd3JpdGUgdGhpcyBkYXRhIHRvIHRlbXAgYXJyYXkKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5lZWQ7IGkrKykgeworICAgICAgICB0ZW1wW2ldID0gZXRyLmNvcHlFbnRyeURhdGFBdChpKTsKKyAgICB9CisgICAgLy8gd3JpdGUgdG8gY2lyY3VsYXIgYnVmZmVyCisgICAgbUZpZm9Xcml0ZXItPndyaXRlKHRlbXAsIG5lZWQpOworfQorCit2b2lkIFdyaXRlcjo6bG9nKEV2ZW50IGV2ZW50LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoZGF0YSA9PSBOVUxMIHx8IGxlbmd0aCA+IEVudHJ5OjprTWF4TGVuZ3RoKSB7CisgICAgICAgIC8vIFRPRE8gUGVyaGFwcyBpdCBtYWtlcyBzZW5zZSB0byBkaXNwbGF5IHRydW5jYXRlZCBkYXRhIG9yIGF0IGxlYXN0IGEKKyAgICAgICAgLy8gICAgICBtZXNzYWdlIHRoYXQgdGhlIGRhdGEgaXMgdG9vIGxvbmc/ICBUaGUgY3VycmVudCBiZWhhdmlvciBjYW4gY3JlYXRlCisgICAgICAgIC8vICAgICAgYSBjb25mdXNpb24gZm9yIGEgcHJvZ3JhbW1lciBkZWJ1Z2dpbmcgdGhlaXIgY29kZS4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBJZ25vcmUgaWYgaW52YWxpZCBldmVudAorICAgIGlmIChldmVudCA9PSBFVkVOVF9SRVNFUlZFRCB8fCBldmVudCA+PSBFVkVOVF9VUFBFUl9CT1VORCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEVudHJ5IGV0cihldmVudCwgZGF0YSwgbGVuZ3RoKTsKKyAgICBsb2coZXRyLCB0cnVlIC8qdHJ1c3RlZCovKTsKK30KKwordm9pZCBXcml0ZXI6OmxvZ3ZmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2hhciBidWZmZXJbRW50cnk6OmtNYXhMZW5ndGggKyAxIC8qTlVMKi9dOworICAgIGludCBsZW5ndGggPSB2c25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgZm10LCBhcCk7CisgICAgaWYgKGxlbmd0aCA+PSAoaW50KSBzaXplb2YoYnVmZmVyKSkgeworICAgICAgICBsZW5ndGggPSBzaXplb2YoYnVmZmVyKSAtIDE7CisgICAgICAgIC8vIE5VTCB0ZXJtaW5hdGlvbiBpcyBub3QgcmVxdWlyZWQKKyAgICAgICAgLy8gYnVmZmVyW2xlbmd0aF0gPSAnXDAnOworICAgIH0KKyAgICBpZiAobGVuZ3RoID49IDApIHsKKyAgICAgICAgbG9nKEVWRU5UX1NUUklORywgYnVmZmVyLCBsZW5ndGgpOworICAgIH0KK30KKwordm9pZCBXcml0ZXI6OmxvZ1N0YXJ0KGNvbnN0IGNoYXIgKmZtdCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbihmbXQpOworICAgIGlmIChsZW5ndGggPiBFbnRyeTo6a01heExlbmd0aCkgeworICAgICAgICBsZW5ndGggPSBFbnRyeTo6a01heExlbmd0aDsKKyAgICB9CisgICAgbG9nKEVWRU5UX0ZNVF9TVEFSVCwgZm10LCBsZW5ndGgpOworfQorCit2b2lkIFdyaXRlcjo6bG9nVGltZXN0YW1wRm9ybWF0KCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY29uc3QgbnNlY3NfdCB0cyA9IHN5c3RlbVRpbWUoKTsKKyAgICBpZiAodHMgPiAwKSB7CisgICAgICAgIGxvZyhFVkVOVF9GTVRfVElNRVNUQU1QLCAmdHMsIHNpemVvZih0cykpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IHRpbWVzdGFtcCIpOworICAgIH0KK30KKwordm9pZCBXcml0ZXI6OmxvZ1ZGb3JtYXQoY29uc3QgY2hhciAqZm10LCBsb2dfaGFzaF90IGhhc2gsIHZhX2xpc3QgYXJncCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgV3JpdGVyOjpsb2dTdGFydChmbXQpOworICAgIGludCBpOworICAgIGRvdWJsZSBkOworICAgIGZsb2F0IGY7CisgICAgY2hhciogczsKKyAgICBzaXplX3QgbGVuZ3RoOworICAgIGludDY0X3QgdDsKKyAgICBXcml0ZXI6OmxvZ1RpbWVzdGFtcEZvcm1hdCgpOworICAgIGxvZyhFVkVOVF9GTVRfSEFTSCwgJmhhc2gsIHNpemVvZihoYXNoKSk7CisgICAgZm9yIChjb25zdCBjaGFyICpwID0gZm10OyAqcCAhPSAnXDAnOyBwKyspIHsKKyAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IG1vcmUgY29tcGxleCBmb3JtYXR0aW5nIHN1Y2ggYXMgJS4zZgorICAgICAgICBpZiAoKnAgIT0gJyUnKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2goKisrcCkgeworICAgICAgICBjYXNlICdzJzogLy8gc3RyaW5nCisgICAgICAgICAgICBzID0gdmFfYXJnKGFyZ3AsIGNoYXIgKik7CisgICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocyk7CisgICAgICAgICAgICBpZiAobGVuZ3RoID4gRW50cnk6OmtNYXhMZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBsZW5ndGggPSBFbnRyeTo6a01heExlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvZyhFVkVOVF9GTVRfU1RSSU5HLCBzLCBsZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAndCc6IC8vIHRpbWVzdGFtcAorICAgICAgICAgICAgdCA9IHZhX2FyZyhhcmdwLCBpbnQ2NF90KTsKKyAgICAgICAgICAgIGxvZyhFVkVOVF9GTVRfVElNRVNUQU1QLCAmdCwgc2l6ZW9mKHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ2QnOiAvLyBpbnRlZ2VyCisgICAgICAgICAgICBpID0gdmFfYXJnKGFyZ3AsIGludCk7CisgICAgICAgICAgICBsb2coRVZFTlRfRk1UX0lOVEVHRVIsICZpLCBzaXplb2YoaSkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnZic6IC8vIGZsb2F0CisgICAgICAgICAgICBkID0gdmFfYXJnKGFyZ3AsIGRvdWJsZSk7IC8vIGZsb2F0IGFyZ3VtZW50cyBhcmUgcHJvbW90ZWQgdG8gZG91YmxlIGluIHZhcmFyZyBsaXN0cworICAgICAgICAgICAgZiA9IChmbG9hdClkOworICAgICAgICAgICAgbG9nKEVWRU5UX0ZNVF9GTE9BVCwgJmYsIHNpemVvZihmKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdwJzogLy8gcGlkCisgICAgICAgICAgICBsb2coRVZFTlRfRk1UX1BJRCwgbVBpZFRhZywgbVBpZFRhZ1NpemUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8gdGhlICIlXDAiIGNhc2UgZmluaXNoZXMgcGFyc2luZworICAgICAgICBjYXNlICdcMCc6CisgICAgICAgICAgICAtLXA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICclJzoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVygiTkJMb2cgV3JpdGVyIHBhcnNlZCBpbnZhbGlkIGZvcm1hdCBzcGVjaWZpZXI6ICVjIiwgKnApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgRW50cnkgZXRyKEVWRU5UX0ZNVF9FTkQsIG51bGxwdHIsIDApOworICAgIGxvZyhldHIsIHRydWUpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTG9ja2VkV3JpdGVyOjpMb2NrZWRXcml0ZXIodm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSkKKyAgICA6IFdyaXRlcihzaGFyZWQsIHNpemUpCit7Cit9CisKK2Jvb2wgTG9ja2VkV3JpdGVyOjppc0VuYWJsZWQoKSBjb25zdAoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIFdyaXRlcjo6aXNFbmFibGVkKCk7Cit9CisKK2Jvb2wgTG9ja2VkV3JpdGVyOjpzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBXcml0ZXI6OnNldEVuYWJsZWQoZW5hYmxlZCk7Cit9CisKK3ZvaWQgTG9ja2VkV3JpdGVyOjpsb2coY29uc3QgRW50cnkgJmVudHJ5LCBib29sIHRydXN0ZWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIFdyaXRlcjo6bG9nKGVudHJ5LCB0cnVzdGVkKTsKK30KKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL0VudHJ5LmggYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL0VudHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNmMDBiNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvRW50cnkuaApAQCAtMCwwICsxLDIzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9OQkxPR19FTlRSWV9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfTkJMT0dfRU5UUllfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRXZlbnRzLmg+CisKK2NsYXNzIGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgTkJMb2cgeworCisvLyBlbnRyeSByZXByZXNlbnRhdGlvbiBpbiBtZW1vcnkKK3N0cnVjdCBlbnRyeSB7CisgICAgY29uc3QgdWludDhfdCB0eXBlOworICAgIGNvbnN0IHVpbnQ4X3QgbGVuZ3RoOworICAgIGNvbnN0IHVpbnQ4X3QgZGF0YVswXTsKK307CisKKy8vIGVudHJ5IHRhaWwgcmVwcmVzZW50YXRpb24gKGFmdGVyIGRhdGEpCitzdHJ1Y3QgZW5kaW5nIHsKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICB1aW50OF90IG5leHRbMF07Cit9OworCisvLyByZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBsb2cgZW50cnkgaW4gc2hhcmVkIG1lbW9yeQorLy8gIGJ5dGVbMF0gICAgICAgICAgICAgbUV2ZW50CisvLyAgYnl0ZVsxXSAgICAgICAgICAgICBtTGVuZ3RoCisvLyAgYnl0ZVsyXSAgICAgICAgICAgICBtRGF0YVswXQorLy8gIC4uLgorLy8gIGJ5dGVbMitpXSAgICAgICAgICAgbURhdGFbaV0KKy8vICAuLi4KKy8vICBieXRlWzIrbUxlbmd0aC0xXSAgIG1EYXRhW21MZW5ndGgtMV0KKy8vICBieXRlWzIrbUxlbmd0aF0gICAgIGR1cGxpY2F0ZSBjb3B5IG9mIG1MZW5ndGggdG8gcGVybWl0IHJldmVyc2Ugc2NhbgorLy8gIGJ5dGVbMyttTGVuZ3RoXSAgICAgc3RhcnQgb2YgbmV4dCBsb2cgZW50cnkKK2NsYXNzIEVudHJ5IHsKK3B1YmxpYzoKKyAgICBFbnRyeShFdmVudCBldmVudCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCkKKyAgICAgICAgOiBtRXZlbnQoZXZlbnQpLCBtTGVuZ3RoKGxlbmd0aCksIG1EYXRhKGRhdGEpIHt9CisgICAgfkVudHJ5KCkge30KKworICAgIC8vIHVzZWQgZHVyaW5nIHdyaXRpbmcgdG8gZm9ybWF0IEVudHJ5IGluZm9ybWF0aW9uIGFzIGZvbGxvd3M6CisgICAgLy8gW3R5cGVdW2xlbmd0aF1bZGF0YSAuLi4gXVtsZW5ndGhdCisgICAgaW50ICAgICBjb3B5RW50cnlEYXRhQXQoc2l6ZV90IG9mZnNldCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFdyaXRlcjsKKyAgICBFdmVudCAgICAgICBtRXZlbnQ7ICAgICAvLyBldmVudCB0eXBlCisgICAgdWludDhfdCAgICAgbUxlbmd0aDsgICAgLy8gbGVuZ3RoIG9mIGFkZGl0aW9uYWwgZGF0YSwgMCA8PSBtTGVuZ3RoIDw9IGtNYXhMZW5ndGgKKyAgICBjb25zdCB2b2lkICptRGF0YTsgICAgICAvLyBldmVudCB0eXBlLXNwZWNpZmljIGRhdGEKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhMZW5ndGggPSAyNTU7CitwdWJsaWM6CisgICAgLy8gbUV2ZW50LCBtTGVuZ3RoLCBtRGF0YVsuLi5dLCBkdXBsaWNhdGUgbUxlbmd0aAorICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga092ZXJoZWFkID0gc2l6ZW9mKGVudHJ5KSArIHNpemVvZihlbmRpbmcpOworICAgIC8vIGVuZGluZCBsZW5ndGggb2YgcHJldmlvdXMgZW50cnkKKyAgICBzdGF0aWMgY29uc3Qgc3NpemVfdCBrUHJldmlvdXNMZW5ndGhPZmZzZXQgPSAtIHNpemVvZihlbmRpbmcpICsKKyAgICAgICAgb2Zmc2V0b2YoZW5kaW5nLCBsZW5ndGgpOworfTsKKworLy8gZW50cnkgaXRlcmF0b3IKK2NsYXNzIEVudHJ5SXRlcmF0b3IgeworcHVibGljOgorICAgIC8vIFVzZWQgZm9yIGR1bW15IGluaXRpYWxpemF0aW9uLiBQZXJmb3JtaW5nIG9wZXJhdGlvbnMgb24gYSBkZWZhdWx0LWNvbnN0cnVjdGVkCisgICAgLy8gRW50cnlJdGVyYXRvciBvdGhlciB0aGFuIGFzc2lnbmluZyBpdCB0byBhbm90aGVyIHZhbGlkIEVudHJ5SXRlcmF0b3IKKyAgICAvLyBpcyB1bmRlZmluZWQgYmVoYXZpb3IuCisgICAgRW50cnlJdGVyYXRvcigpOworICAgIC8vIENhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIG1ha2Ugc3VyZSBlbnRyeSBpcyBub3QgbnVsbHB0ci4KKyAgICAvLyBQYXNzaW5nIGluIG51bGxwdHIgY2FuIHJlc3VsdCBpbiB1bmRlZmluZWQgYmVoYXZpb3IuCisgICAgZXhwbGljaXQgRW50cnlJdGVyYXRvcihjb25zdCB1aW50OF90ICplbnRyeSk7CisgICAgRW50cnlJdGVyYXRvcihjb25zdCBFbnRyeUl0ZXJhdG9yICZvdGhlcik7CisKKyAgICAvLyBkZXJlZmVyZW5jZSB1bmRlcmx5aW5nIGVudHJ5CisgICAgY29uc3QgZW50cnkmICAgIG9wZXJhdG9yKigpIGNvbnN0OworICAgIGNvbnN0IGVudHJ5KiAgICBvcGVyYXRvci0+KCkgY29uc3Q7CisgICAgLy8gYWR2YW5jZSB0byBuZXh0IGVudHJ5CisgICAgRW50cnlJdGVyYXRvciYgIG9wZXJhdG9yKysoKTsgLy8gKytpCisgICAgLy8gYmFjayB0byBwcmV2aW91cyBlbnRyeQorICAgIEVudHJ5SXRlcmF0b3ImICBvcGVyYXRvci0tKCk7IC8vIC0taQorICAgIC8vIHJldHVybnMgYW4gRW50cnlJdGVyYXRvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBuZXh0IGVudHJ5CisgICAgRW50cnlJdGVyYXRvciAgIG5leHQoKSBjb25zdDsKKyAgICAvLyByZXR1cm5zIGFuIEVudHJ5SXRlcmF0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgcHJldmlvdXMgZW50cnkKKyAgICBFbnRyeUl0ZXJhdG9yICAgcHJldigpIGNvbnN0OworICAgIGJvb2wgICAgICAgICAgICBvcGVyYXRvciE9KGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdDsKKyAgICBpbnQgICAgICAgICAgICAgb3BlcmF0b3ItKGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdDsKKworICAgIGJvb2wgICAgICAgICAgICBoYXNDb25zaXN0ZW50TGVuZ3RoKCkgY29uc3Q7CisgICAgdm9pZCAgICAgICAgICAgIGNvcHlUbyhzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QpIGNvbnN0OworICAgIHZvaWQgICAgICAgICAgICBjb3B5RGF0YSh1aW50OF90ICpkc3QpIGNvbnN0OworCisgICAgLy8gbWVtY3B5IHByZWZlcnJlZCB0byByZWludGVycHJldF9jYXN0IHRvIGF2b2lkIHBvdGVudGlhbGx5IHVuc3VwcG9ydGVkCisgICAgLy8gdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3MuCisjaWYgMAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIGNvbnN0IFQmIHBheWxvYWQoKSB7CisgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUICo+KG1QdHIgKyBvZmZzZXRvZihlbnRyeSwgZGF0YSkpOworICAgIH0KKyNlbHNlCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgVCBwYXlsb2FkKCkgY29uc3QgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlPFQ+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICYmICFzdGQ6OmlzX3BvaW50ZXI8VD46OnZhbHVlLAorICAgICAgICAgICAgICAgICJOQkxvZzo6RW50cnlJdGVyYXRvciBwYXlsb2FkIG11c3QgYmUgdHJpdmlhbGx5IGNvcHlhYmxlLCBub24tcG9pbnRlciB0eXBlLiIpOworICAgICAgICBUIHBheWxvYWQ7CisgICAgICAgIG1lbWNweSgmcGF5bG9hZCwgbVB0ciArIG9mZnNldG9mKGVudHJ5LCBkYXRhKSwgc2l6ZW9mKHBheWxvYWQpKTsKKyAgICAgICAgcmV0dXJuIHBheWxvYWQ7CisgICAgfQorI2VuZGlmCisKKyAgICBpbmxpbmUgb3BlcmF0b3IgY29uc3QgdWludDhfdCooKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUHRyOworICAgIH0KKworcHJpdmF0ZToKKyAgICBjb25zdCB1aW50OF90ICAqbVB0cjsgICAvLyBTaG91bGQgbm90IGJlIG51bGxwdHIgZXhjZXB0IGZvciBkdW1teSBpbml0aWFsaXphdGlvbgorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgZm9sbG93aW5nIGNsYXNzZXMgYXJlIHVzZWQgZm9yIG1lcmdpbmcgaW50byB0aGUgTWVyZ2VyJ3MgYnVmZmVyLgorCitjbGFzcyBBYnN0cmFjdEVudHJ5IHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5BYnN0cmFjdEVudHJ5KCkge30KKworICAgIC8vIGJ1aWxkIGNvbmNyZXRlIGVudHJ5IG9mIGFwcHJvcHJpYXRlIGNsYXNzIGZyb20gcHRyLgorICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QWJzdHJhY3RFbnRyeT4gYnVpbGRFbnRyeShjb25zdCB1aW50OF90ICpwdHIpOworCisgICAgLy8gZ2V0IGZvcm1hdCBlbnRyeSB0aW1lc3RhbXAKKyAgICB2aXJ0dWFsIGludDY0X3QgICAgICAgdGltZXN0YW1wKCkgY29uc3QgPSAwOworCisgICAgLy8gZ2V0IGZvcm1hdCBlbnRyeSdzIHVuaXF1ZSBpZAorICAgIHZpcnR1YWwgbG9nX2hhc2hfdCAgICBoYXNoKCkgY29uc3QgPSAwOworCisgICAgLy8gZW50cnkncyBhdXRob3IgaW5kZXggKC0xIGlmIG5vbmUgcHJlc2VudCkKKyAgICAvLyBhIE1lcmdlciBoYXMgYSB2ZWN0b3Igb2YgUmVhZGVycywgYXV0aG9yIHNpbXBseSBwb2ludHMgdG8gdGhlIGluZGV4IG9mIHRoZQorICAgIC8vIFJlYWRlciB0aGF0IG9yaWdpbmF0ZWQgdGhlIGVudHJ5CisgICAgLy8gVE9ETyBjb25zaWRlciBjaGFuZ2luZyB0byB1aW50MzJfdAorICAgIHZpcnR1YWwgaW50ICAgICAgICAgICBhdXRob3IoKSBjb25zdCA9IDA7CisKKyAgICAvLyBjb3B5IGVudHJ5LCBhZGRpbmcgYXV0aG9yIGJlZm9yZSB0aW1lc3RhbXAsIHJldHVybnMgaXRlcmF0b3IgdG8gZW5kIG9mIGVudHJ5CisgICAgdmlydHVhbCBFbnRyeUl0ZXJhdG9yIGNvcHlXaXRoQXV0aG9yKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1dGhvcikgY29uc3QgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgLy8gRW50cnkgc3RhcnRpbmcgaW4gdGhlIGdpdmVuIHBvaW50ZXIsIHdoaWNoIHNoYWxsIG5vdCBiZSBudWxscHRyLgorICAgIGV4cGxpY2l0IEFic3RyYWN0RW50cnkoY29uc3QgdWludDhfdCAqZW50cnkpIDogbUVudHJ5KGVudHJ5KSB7fQorICAgIC8vIGNvcGllcyBvcmRpbmFyeSBlbnRyeSBmcm9tIHNyYyB0byBkc3QsIGFuZCByZXR1cm5zIGxlbmd0aCBvZiBlbnRyeQorICAgIC8vIHNpemVfdCAgICAgIGNvcHlFbnRyeShhdWRpb191dGlsc19maWZvX3dyaXRlciAqZHN0LCBjb25zdCBpdGVyYXRvciAmaXQpOworICAgIGNvbnN0IHVpbnQ4X3QgKiBjb25zdCBtRW50cnk7Cit9OworCisvLyBBUEkgZm9yIGhhbmRsaW5nIGZvcm1hdCBlbnRyeSBvcGVyYXRpb25zCisKKy8vIGEgZm9ybWF0dGVkIGVudHJ5IGhhcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKKy8vICAgICogRk1UX1NUQVJUIGVudHJ5LCBjb250YWluaW5nIHRoZSBmb3JtYXQgc3RyaW5nCisvLyAgICAqIFRJTUVTVEFNUCBlbnRyeQorLy8gICAgKiBIQVNIIGVudHJ5CisvLyAgICAqIGF1dGhvciBlbnRyeSBvZiB0aGUgdGhyZWFkIHRoYXQgZ2VuZXJhdGVkIGl0IChvcHRpb25hbCwgcHJlc2VudCBpbiBtZXJnZWQgbG9nKQorLy8gICAgKiBmb3JtYXQgYXJnMQorLy8gICAgKiBmb3JtYXQgYXJnMgorLy8gICAgKiAuLi4KKy8vICAgICogRk1UX0VORCBlbnRyeQorY2xhc3MgRm9ybWF0RW50cnkgOiBwdWJsaWMgQWJzdHJhY3RFbnRyeSB7CitwdWJsaWM6CisgICAgLy8gZXhwbGljaXQgRm9ybWF0RW50cnkoY29uc3QgRW50cnlJdGVyYXRvciAmaXQpOworICAgIGV4cGxpY2l0IEZvcm1hdEVudHJ5KGNvbnN0IHVpbnQ4X3QgKnB0cikgOiBBYnN0cmFjdEVudHJ5KHB0cikge30KKyAgICB+Rm9ybWF0RW50cnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBFbnRyeUl0ZXJhdG9yIGJlZ2luKCkgY29uc3Q7CisKKyAgICAvLyBFbnRyeSdzIGZvcm1hdCBzdHJpbmcKKyAgICBjb25zdCBjaGFyKiAgIGZvcm1hdFN0cmluZygpIGNvbnN0OworCisgICAgLy8gRW5ydHkncyBmb3JtYXQgc3RyaW5nIGxlbmd0aAorICAgIHNpemVfdCAgICAgICAgZm9ybWF0U3RyaW5nTGVuZ3RoKCkgY29uc3Q7CisKKyAgICAvLyBGb3JtYXQgYXJndW1lbnRzIChleGNsdWRpbmcgZm9ybWF0IHN0cmluZywgdGltZXN0YW1wIGFuZCBhdXRob3IpCisgICAgRW50cnlJdGVyYXRvciBhcmdzKCkgY29uc3Q7CisKKyAgICAvLyBnZXQgZm9ybWF0IGVudHJ5IHRpbWVzdGFtcAorICAgIGludDY0X3QgICAgICAgdGltZXN0YW1wKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLyBnZXQgZm9ybWF0IGVudHJ5J3MgdW5pcXVlIGlkCisgICAgbG9nX2hhc2hfdCAgICBoYXNoKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLyBlbnRyeSdzIGF1dGhvciBpbmRleCAoLTEgaWYgbm9uZSBwcmVzZW50KQorICAgIC8vIGEgTWVyZ2VyIGhhcyBhIHZlY3RvciBvZiBSZWFkZXJzLCBhdXRob3Igc2ltcGx5IHBvaW50cyB0byB0aGUgaW5kZXggb2YgdGhlCisgICAgLy8gUmVhZGVyIHRoYXQgb3JpZ2luYXRlZCB0aGUgZW50cnkKKyAgICBpbnQgICAgICAgICAgIGF1dGhvcigpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLy8gY29weSBlbnRyeSwgYWRkaW5nIGF1dGhvciBiZWZvcmUgdGltZXN0YW1wLCByZXR1cm5zIHNpemUgb2Ygb3JpZ2luYWwgZW50cnkKKyAgICBFbnRyeUl0ZXJhdG9yIGNvcHlXaXRoQXV0aG9yKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdXRob3IpIGNvbnN0IG92ZXJyaWRlOworfTsKKworY2xhc3MgSGlzdG9ncmFtRW50cnkgOiBwdWJsaWMgQWJzdHJhY3RFbnRyeSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSGlzdG9ncmFtRW50cnkoY29uc3QgdWludDhfdCAqcHRyKSA6IEFic3RyYWN0RW50cnkocHRyKSB7fQorICAgIH5IaXN0b2dyYW1FbnRyeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIGludDY0X3QgICAgICAgdGltZXN0YW1wKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBsb2dfaGFzaF90ICAgIGhhc2goKSBjb25zdCBvdmVycmlkZTsKKworICAgIGludCAgICAgICAgICAgYXV0aG9yKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBFbnRyeUl0ZXJhdG9yIGNvcHlXaXRoQXV0aG9yKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdXRob3IpIGNvbnN0IG92ZXJyaWRlOworfTsKKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9OQkxPR19FTlRSWV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL0V2ZW50cy5oIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9FdmVudHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2E0ZmU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9FdmVudHMuaApAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9OQkxPR19FVkVOVFNfSAorI2RlZmluZSBBTkRST0lEX01FRElBX05CTE9HX0VWRU5UU19ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIE5CTG9nIHsKKworLy8gVE9ETyBoYXZlIGEgY29tbWVudCBzb21ld2hlcmUgZXhwbGFpbmluZyB0aGUgd2hvbGUgcHJvY2VzcyBmb3IgYWRkaW5nIGEgbmV3IEVWRU5UXworCisvLyBOQkxvZyBFdmVudCB0eXBlcy4gVGhlIEV2ZW50cyBhcmUgbmFtZWQgdG8gcHJvdmlkZSBjb250ZXh0dWFsIG1lYW5pbmcgZm9yIHdoYXQgaXMgbG9nZ2VkLgorLy8gSWYgYWRkaW5nIGEgbmV3IHN0YW5kYWxvbmUgRXZlbnQgaGVyZSwgdXBkYXRlIHRoZSBldmVudC10by10eXBlIG1hcHBpbmcgYnkgYWRkaW5nIGEKKy8vIE1BUF9FVkVOVF9UT19UWVBFIHN0YXRlbWVudCBiZWxvdy4KKy8vIFhYWCBOb3RlIHRoYXQgYXMgb2YgdGhlIGN1cnJlbnQgZGVzaWduLCBFdmVudHMgc2hvdWxkIG5vdCBiZSByZW51bWJlcmVkIChpLmUuIHJlb3JkZXJlZCkKKy8vIGlmIHRoZXkgZXZlciBsZWF2ZSBtZW1vcnkgKGZvciBleGFtcGxlLCB3cml0dGVuIHRvIGZpbGUsIHVwbG9hZGVkIHRvIGNsb3VkLCBldGMuKS4KKy8vIFRPRE8gbWFrZSBzb21lIHNvcnQgb2YgaW50ZXJmYWNlIHRvIGtlZXAgdGhlc2UgImNvbnRyYWN0IiBjb25zdGFudHMuCitlbnVtIEV2ZW50IDogdWludDhfdCB7CisgICAgRVZFTlRfUkVTRVJWRUQsCisgICAgRVZFTlRfU1RSSU5HLCAgICAgICAgICAgICAgIC8vIEFTQ0lJIHN0cmluZywgbm90IE5VTC10ZXJtaW5hdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IG1ha2UgdGltZXN0YW1wIG9wdGlvbmFsCisgICAgRVZFTlRfVElNRVNUQU1QLCAgICAgICAgICAgIC8vIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDKQorCisgICAgLy8gVHlwZXMgZm9yIEZvcm1hdCBFbnRyeSwgaS5lLiBmb3JtYXR0ZWQgZW50cnkKKyAgICBFVkVOVF9GTVRfU1RBUlQsICAgICAgICAgICAgLy8gbG9nRm9ybWF0IHN0YXJ0IGV2ZW50OiBlbnRyeSBpbmNsdWRlcyBmb3JtYXQgc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb2xsb3dpbmcgZW50cmllcyBjb250YWluIGZvcm1hdCBhcmd1bWVudHMKKyAgICAvLyBmb3JtYXQgYXJndW1lbnRzCisgICAgRVZFTlRfRk1UX0FVVEhPUiwgICAgICAgICAgIC8vIGF1dGhvciBpbmRleCAocHJlc2VudCBpbiBtZXJnZWQgbG9ncykgdHJhY2tzIGVudHJ5J3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JpZ2luYWwgbG9nCisgICAgRVZFTlRfRk1UX0ZMT0FULCAgICAgICAgICAgIC8vIGZsb2F0aW5nIHBvaW50IHZhbHVlIGVudHJ5CisgICAgRVZFTlRfRk1UX0hBU0gsICAgICAgICAgICAgIC8vIHVuaXF1ZSBIQVNIIG9mIGxvZyBvcmlnaW4sIG9yaWdpbmF0ZXMgZnJvbSBoYXNoIG9mIGZpbGUgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbGluZSBudW1iZXIKKyAgICBFVkVOVF9GTVRfSU5URUdFUiwgICAgICAgICAgLy8gaW50ZWdlciB2YWx1ZSBlbnRyeQorICAgIEVWRU5UX0ZNVF9QSUQsICAgICAgICAgICAgICAvLyBwcm9jZXNzIElEIGFuZCBwcm9jZXNzIG5hbWUKKyAgICBFVkVOVF9GTVRfU1RSSU5HLCAgICAgICAgICAgLy8gc3RyaW5nIHZhbHVlIGVudHJ5CisgICAgRVZFTlRfRk1UX1RJTUVTVEFNUCwgICAgICAgIC8vIHRpbWVzdGFtcCB2YWx1ZSBlbnRyeQorICAgIC8vIGVuZCBvZiBmb3JtYXQgYXJndW1lbnRzCisgICAgRVZFTlRfRk1UX0VORCwgICAgICAgICAgICAgIC8vIGVuZCBvZiBsb2dGb3JtYXQgYXJndW1lbnQgbGlzdAorCisgICAgLy8gVHlwZXMgZm9yIHdha2V1cCB0aW1lc3RhbXAgaGlzdG9ncmFtcworICAgIEVWRU5UX0FVRElPX1NUQVRFLCAgICAgICAgICAvLyBhdWRpbyBvbi9vZmYgZXZlbnQ6IGxvZ2dlZCBvbiBGYXN0TWl4ZXI6Om9uU3RhdGVDaGFuZ2UgY2FsbAorICAgIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywgICAvLyBzaW5nbGUgZGF0dW0gZm9yIHRpbWVzdGFtcCBoaXN0b2dyYW0KKworICAgIC8vIFR5cGVzIHJlcHJlc2VudGluZyBhdWRpbyBwZXJmb3JtYW5jZSBtZXRyaWNzCisgICAgRVZFTlRfTEFURU5DWSwgICAgICAgICAgICAgIC8vIGRpZmZlcmVuY2UgYmV0d2VlbiBmcmFtZXMgcHJlc2VudGVkIGJ5IEhBTCBhbmQgZnJhbWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXR0ZW4gdG8gSEFMIG91dHB1dCBzaW5rLCBkaXZpZGVkIGJ5IHNhbXBsZSByYXRlLgorICAgIEVWRU5UX09WRVJSVU4sICAgICAgICAgICAgICAvLyBwcmVkaWN0ZWQgdGhyZWFkIG92ZXJydW4gZXZlbnQgdGltZXN0YW1wCisgICAgRVZFTlRfVEhSRUFEX0lORk8sICAgICAgICAgIC8vIHNlZSB0aHJlYWRfaW5mb190IGJlbG93CisgICAgRVZFTlRfVU5ERVJSVU4sICAgICAgICAgICAgIC8vIHByZWRpY3RlZCB0aHJlYWQgdW5kZXJydW4gZXZlbnQgdGltZXN0YW1wCisgICAgRVZFTlRfV0FSTVVQX1RJTUUsICAgICAgICAgIC8vIHRocmVhZCB3YXJtdXAgdGltZQorICAgIEVWRU5UX1dPUktfVElNRSwgICAgICAgICAgICAvLyB0aGUgdGltZSBhIHRocmVhZCB0YWtlcyB0byBkbyB3b3JrLCBlLmcuIHJlYWQsIHdyaXRlLCBldGMuCisgICAgRVZFTlRfVEhSRUFEX1BBUkFNUywgICAgICAgIC8vIHNlZSB0aHJlYWRfcGFyYW1zX3QgYmVsb3cKKworICAgIEVWRU5UX1VQUEVSX0JPVU5ELCAgICAgICAgICAvLyB0byBjaGVjayBmb3IgaW52YWxpZCBldmVudHMKK307CisKKy8vIE5CTG9nIGN1c3RvbS1kZWZpbmVkIHN0cnVjdHMuIFNvbWUgTkJMb2cgRXZlbnQgdHlwZXMgbWFwIHRvIHRoZXNlIHN0cnVjdHMuCisKK3VzaW5nIGxvZ19oYXNoX3QgPSB1aW50NjRfdDsKKworLy8gdXNlZCBmb3IgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTIChub3QgbWFwcGVkKQorc3RydWN0IEhpc3RUc0VudHJ5IHsKKyAgICBsb2dfaGFzaF90IGhhc2g7CisgICAgaW50NjRfdCB0czsKK307IC8vVE9ETyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLy8gdXNlZCBmb3IgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTIChub3QgbWFwcGVkKQorc3RydWN0IEhpc3RUc0VudHJ5V2l0aEF1dGhvciB7CisgICAgbG9nX2hhc2hfdCBoYXNoOworICAgIGludDY0X3QgdHM7CisgICAgaW50IGF1dGhvcjsKK307IC8vVE9ETyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworZW51bSBUaHJlYWRUeXBlIHsKKyAgICBVTktOT1dOLAorICAgIE1JWEVSLAorICAgIENBUFRVUkUsCisgICAgRkFTVE1JWEVSLAorICAgIEZBU1RDQVBUVVJFLAorfTsKKworaW5saW5lIGNvbnN0IGNoYXIgKnRocmVhZFR5cGVUb1N0cmluZyhUaHJlYWRUeXBlIHR5cGUpIHsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIE1JWEVSOgorICAgICAgICByZXR1cm4gIk1JWEVSIjsKKyAgICBjYXNlIENBUFRVUkU6CisgICAgICAgIHJldHVybiAiQ0FQVFVSRSI7CisgICAgY2FzZSBGQVNUTUlYRVI6CisgICAgICAgIHJldHVybiAiRkFTVE1JWEVSIjsKKyAgICBjYXNlIEZBU1RDQVBUVVJFOgorICAgICAgICByZXR1cm4gIkZBU1RDQVBUVVJFIjsKKyAgICBjYXNlIFVOS05PV046CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuICJVTktOT1dOIjsKKyAgICB9Cit9CisKKy8vIG1hcHBlZCBmcm9tIEVWRU5UX1RIUkVBRF9JTkZPCisvLyBUaGVzZSBmaWVsZHMgYWx3YXlzIHN0YXkgdGhlIHNhbWUgdGhyb3VnaG91dCBhIHRocmVhZCdzIGxpZmV0aW1lIGFuZAorLy8gc2hvdWxkIG9ubHkgbmVlZCB0byBiZSBsb2dnZWQgb25jZSB1cG9uIHRocmVhZCBpbml0aWFsaXphdGlvbi4KKy8vIFRoZXJlIGlzIGN1cnJlbnRseSBubyByZWNvdmVyeSBtZWNoYW5pc20gaWYgdGhlIGxvZyBldmVudCBjb3JyZXNwb25kaW5nCisvLyB0byB0aGlzIHR5cGUgaXMgbG9zdC4KKy8vIFRPRE8gYWRkIHRoaXMgaW5mb3JtYXRpb24gd2hlbiBhZGRpbmcgYSByZWFkZXIgdG8gTWVkaWFMb2dTZXJ2aWNlPworc3RydWN0IHRocmVhZF9pbmZvX3QgeworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkID0gLTE7ICAgICAgLy8gVGhyZWFkIEkvTyBoYW5kbGUKKyAgICBUaHJlYWRUeXBlIHR5cGUgPSBVTktOT1dOOyAgICAgIC8vIFNlZSBlbnVtIFRocmVhZFR5cGUgYWJvdmUKK307CisKKy8vIG1hcHBlZCBmcm9tIEVWRU5UX1RIUkVBRF9QQVJBTVMKKy8vIFRoZXNlIGZpZWxkcyBhcmUgbm90IG5lY2Vzc2FyaWx5IGNvbnN0YW50IHRocm91Z2hvdXQgYSB0aHJlYWQncyBsaWZldGltZSBhbmQKKy8vIGNhbiBiZSBsb2dnZWQgd2hlbmV2ZXIgYSB0aHJlYWQgcmVjZWl2ZXMgbmV3IGNvbmZpZ3VyYXRpb25zIG9yIHBhcmFtZXRlcnMuCitzdHJ1Y3QgdGhyZWFkX3BhcmFtc190IHsKKyAgICBzaXplX3QgZnJhbWVDb3VudCA9IDA7ICAgICAgICAgIC8vIG51bWJlciBvZiBmcmFtZXMgcGVyIHJlYWQgb3Igd3JpdGUgYnVmZmVyCisgICAgdW5zaWduZWQgc2FtcGxlUmF0ZSA9IDA7ICAgICAgICAvLyBpbiBmcmFtZXMgcGVyIHNlY29uZAorfTsKKwordGVtcGxhdGUgPEV2ZW50IEU+IHN0cnVjdCBnZXRfbWFwcGVkOworI2RlZmluZSBNQVBfRVZFTlRfVE9fVFlQRShFLCBUKSBcCit0ZW1wbGF0ZTw+IHN0cnVjdCBnZXRfbWFwcGVkPEU+IHsgXAorICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc190cml2aWFsbHlfY29weWFibGU8VD46OnZhbHVlIFwKKyAgICAgICAgICAgICYmICFzdGQ6OmlzX3BvaW50ZXI8VD46OnZhbHVlLCBcCisgICAgICAgICAgICAiTkJMb2c6OkV2ZW50IG11c3QgbWFwIHRvIHRyaXZpYWxseSBjb3B5YWJsZSwgbm9uLXBvaW50ZXIgdHlwZS4iKTsgXAorICAgIHR5cGVkZWYgVCB0eXBlOyBcCit9CisKKy8vIE1hcHMgYW4gTkJMb2cgRXZlbnQgdHlwZSB0byBhIEMrKyBQT0QgdHlwZS4KK01BUF9FVkVOVF9UT19UWVBFKEVWRU5UX0xBVEVOQ1ksIGRvdWJsZSk7CitNQVBfRVZFTlRfVE9fVFlQRShFVkVOVF9PVkVSUlVOLCBpbnQ2NF90KTsKK01BUF9FVkVOVF9UT19UWVBFKEVWRU5UX1RIUkVBRF9JTkZPLCB0aHJlYWRfaW5mb190KTsKK01BUF9FVkVOVF9UT19UWVBFKEVWRU5UX1VOREVSUlVOLCBpbnQ2NF90KTsKK01BUF9FVkVOVF9UT19UWVBFKEVWRU5UX1dBUk1VUF9USU1FLCBkb3VibGUpOworTUFQX0VWRU5UX1RPX1RZUEUoRVZFTlRfV09SS19USU1FLCBpbnQ2NF90KTsKK01BUF9FVkVOVF9UT19UWVBFKEVWRU5UX1RIUkVBRF9QQVJBTVMsIHRocmVhZF9wYXJhbXNfdCk7CisKK30gICAvLyBuYW1lc3BhY2UgTkJMb2cKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfTkJMT0dfRVZFTlRTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvTWVyZ2VyLmggYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL01lcmdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYTg1MjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL01lcmdlci5oCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX05CTE9HX01FUkdFUl9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfTkJMT0dfTUVSR0VSX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9maWZvLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlYWRlci5oPgorI2luY2x1ZGUgPHV0aWxzL0NvbmRpdGlvbi5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFN0cmluZzE2OworY2xhc3MgU3RyaW5nODsKKworbmFtZXNwYWNlIE5CTG9nIHsKKworc3RydWN0IFNoYXJlZDsKKworLy8gVE9ETyB1cGRhdGUgY29tbWVudHMgdG8gcmVmbGVjdCBjdXJyZW50IGZ1bmN0aW9uYWxpdGllcworCisvLyBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcmVhZCBkYXRhIGZyb20gZWFjaCB0aHJlYWQncyBpbmRpdmlkdWFsIEZJRk8gaW4gc2hhcmVkIG1lbW9yeQorLy8gYW5kIHdyaXRlIGl0IHRvIGEgc2luZ2xlIEZJRk8gaW4gbG9jYWwgbWVtb3J5LgorY2xhc3MgTWVyZ2VyIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorICAgIE1lcmdlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKTsKKworICAgIH5NZXJnZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIGFkZFJlYWRlcihjb25zdCBzcDxOQkxvZzo6UmVhZGVyPiAmcmVhZGVyKTsKKyAgICAvLyBUT0RPIGFkZCByZW1vdmVSZWFkZXIKKyAgICB2b2lkIG1lcmdlKCk7CisKKyAgICAvLyBGSVhNRSBUaGlzIGlzIHJldHVybmluZyBhIHJlZmVyZW5jZSB0byBhIHNoYXJlZCB2YXJpYWJsZSB0aGF0IG5lZWRzIGEgbG9jaworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFJlYWRlcj4+JiBnZXRSZWFkZXJzKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgLy8gdmVjdG9yIG9mIHRoZSByZWFkZXJzIHRoZSBtZXJnZXIgaXMgc3VwcG9zZWQgdG8gbWVyZ2UgZnJvbS4KKyAgICAvLyBldmVyeSByZWFkZXIgcmVhZHMgZnJvbSBhIHdyaXRlcidzIGJ1ZmZlcgorICAgIC8vIEZJWE1FIE5lZWRzIHRvIGJlIHByb3RlY3RlZCBieSBhIGxvY2sKKyAgICBzdGQ6OnZlY3RvcjxzcDxSZWFkZXI+PiBtUmVhZGVyczsKKworICAgIFNoYXJlZCAqIGNvbnN0IG1TaGFyZWQ7IC8vIHJhdyBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnkKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmbz4gbUZpZm87IC8vIEZJRk8gaXRzZWxmCisgICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiBtRmlmb1dyaXRlcjsgLy8gdXNlZCB0byB3cml0ZSB0byBGSUZPCit9OworCisvLyBUaGlzIGNsYXNzIGhhcyBhIHBvaW50ZXIgdG8gdGhlIEZJRk8gaW4gbG9jYWwgbWVtb3J5IHdoaWNoIHN0b3JlcyB0aGUgbWVyZ2VkCisvLyBkYXRhIGNvbGxlY3RlZCBieSBOQkxvZzo6TWVyZ2VyIGZyb20gYWxsIFJlYWRlcnMuIEl0IGlzIHVzZWQgdG8gcHJvY2VzcworLy8gdGhpcyBkYXRhIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIFBlcmZvcm1hbmNlQW5hbHlzaXMuCitjbGFzcyBNZXJnZVJlYWRlciA6IHB1YmxpYyBSZWFkZXIgeworcHVibGljOgorICAgIE1lcmdlUmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUsIE1lcmdlciAmbWVyZ2VyKTsKKworICAgIC8vIHByb2Nlc3MgYSBwYXJ0aWN1bGFyIHNuYXBzaG90IG9mIHRoZSByZWFkZXIKKyAgICB2b2lkIHByb2Nlc3NTbmFwc2hvdChTbmFwc2hvdCAmc25hcCwgaW50IGF1dGhvcik7CisKKyAgICAvLyBjYWxsIGdldFNuYXBzaG90IG9mIHRoZSBjb250ZW50IG9mIHRoZSByZWFkZXIncyBidWZmZXIgYW5kIHByb2Nlc3MgdGhlIGRhdGEKKyAgICB2b2lkIGdldEFuZFByb2Nlc3NTbmFwc2hvdCgpOworCisgICAgLy8gY2hlY2sgZm9yIHBlcmlvZGljIHB1c2ggb2YgcGVyZm9ybWFuY2UgZGF0YSB0byBtZWRpYSBtZXRyaWNzLCBhbmQgcGVyZm9ybQorICAgIC8vIHRoZSBzZW5kIGlmIGl0IGlzIHRpbWUgdG8gZG8gc28uCisgICAgdm9pZCBjaGVja1B1c2hUb01lZGlhTWV0cmljcygpOworCisgICAgdm9pZCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisKK3ByaXZhdGU6CisgICAgLy8gRklYTUUgTmVlZHMgdG8gYmUgcHJvdGVjdGVkIGJ5IGEgbG9jaywKKyAgICAvLyAgICAgICBiZWNhdXNlIGV2ZW4gdGhvdWdoIG91ciB1c2Ugb2YgaXQgaXMgcmVhZC1vbmx5IHRoZXJlIG1heSBiZSBhc3luY2hyb25vdXMgdXBkYXRlcworICAgIC8vIFRoZSBvYmplY3QgaXMgb3duZWQgYnkgdGhlIE1lcmdlciBjbGFzcy4KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzcDxSZWFkZXI+PiYgbVJlYWRlcnM7CisKKyAgICAvLyBhbmFseXplcywgY29tcHJlc3NlcyBhbmQgc3RvcmVzIHRoZSBtZXJnZWQgZGF0YQorICAgIC8vIGNvbnRhaW5zIGEgc2VwYXJhdGUgaW5zdGFuY2UgZm9yIGV2ZXJ5IGF1dGhvciAodGhyZWFkKSwgYW5kIGZvciBldmVyeSBzb3VyY2UgZmlsZQorICAgIC8vIGxvY2F0aW9uIHdpdGhpbiBlYWNoIGF1dGhvcgorICAgIFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZUFuYWx5c2lzTWFwIG1UaHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzOworCisgICAgLy8gY29tcHJlc3NlcyBhbmQgc3RvcmVzIGF1ZGlvIHBlcmZvcm1hbmNlIGRhdGEgZnJvbSBlYWNoIHRocmVhZCdzIGJ1ZmZlcnMuCisgICAgLy8gZmlyc3QgcGFyYW1ldGVyIGlzIGF1dGhvciwgaS5lLiB0aHJlYWQgaW5kZXguCisgICAgc3RkOjptYXA8aW50LCBSZXBvcnRQZXJmb3JtYW5jZTo6UGVyZm9ybWFuY2VEYXRhPiBtVGhyZWFkUGVyZm9ybWFuY2VEYXRhOworCisgICAgLy8gaG93IG9mdGVuIHRvIHB1c2ggZGF0YSB0byBNZWRpYSBNZXRyaWNzCisgICAgc3RhdGljIGNvbnN0ZXhwciBuc2Vjc190IGtQZXJpb2RpY01lZGlhTWV0cmljc1B1c2ggPSBzMm5zKChuc2Vjc190KTIgKiA2MCAqIDYwKTsgLy8gMiBob3VycworCisgICAgLy8gaGFuZGxlIGF1dGhvciBlbnRyeSBieSBsb29raW5nIHVwIHRoZSBhdXRob3IncyBuYW1lIGFuZCBhcHBlbmRpbmcgaXQgdG8gdGhlIGJvZHkKKyAgICAvLyByZXR1cm5zIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gZm10RW50cnkKKyAgICB2b2lkIGhhbmRsZUF1dGhvcihjb25zdCBBYnN0cmFjdEVudHJ5ICZmbXRFbnRyeSwgU3RyaW5nOCAqYm9keSk7Cit9OworCisvLyBNZXJnZVRocmVhZCBpcyBhIHRocmVhZCB0aGF0IGNvbnRhaW5zIGEgTWVyZ2VyLiBJdCB3b3JrcyBhcyBhIHJldHJpZ2dlcmFibGUgb25lLXNob3Q6CisvLyB3aGVuIHRyaWdnZXJlZCwgaXQgYXdha2VzIGZvciBhIGxhcHNlIG9mIHRpbWUsIGR1cmluZyB3aGljaCBpdCBwZXJpb2RpY2FsbHkgbWVyZ2VzOyBpZgorLy8gcmV0cmlnZ2VyZWQsIHRoZSB0aW1lb3V0IGlzIHJlc2V0LgorLy8gVGhlIHRocmVhZCBpcyB0cmlnZ2VyZWQgb24gQXVkaW9GbGluZ2VyIGJpbmRlciBhY3Rpdml0eS4KK2NsYXNzIE1lcmdlVGhyZWFkIDogcHVibGljIFRocmVhZCB7CitwdWJsaWM6CisgICAgTWVyZ2VUaHJlYWQoTWVyZ2VyICZtZXJnZXIsIE1lcmdlUmVhZGVyICZtZXJnZVJlYWRlcik7CisgICAgfk1lcmdlVGhyZWFkKCkgb3ZlcnJpZGU7CisKKyAgICAvLyBSZXNldCB0aW1lb3V0IGFuZCBhY3RpdmF0ZSB0aHJlYWQgdG8gbWVyZ2UgcGVyaW9kaWNhbGx5IGlmIGl0J3MgaWRsZQorICAgIHZvaWQgd2FrZXVwKCk7CisKKyAgICAvLyBTZXQgdGltZW91dCBwZXJpb2QgdW50aWwgdGhlIG1lcmdpbmcgdGhyZWFkIGdvZXMgaWRsZSBhZ2FpbgorICAgIHZvaWQgc2V0VGltZW91dFVzKGludCB0aW1lKTsKKworcHJpdmF0ZToKKyAgICBib29sIHRocmVhZExvb3AoKSBvdmVycmlkZTsKKworICAgIC8vIHRoZSBtZXJnZXIgd2hvIGFjdHVhbGx5IGRvZXMgdGhlIHdvcmsgb2YgbWVyZ2luZyB0aGUgbG9ncworICAgIE1lcmdlciYgICAgICBtTWVyZ2VyOworCisgICAgLy8gdGhlIG1lcmdlcmVhZGVyIHVzZWQgdG8gcHJvY2VzcyBkYXRhIG1lcmdlZCBieSBtTWVyZ2VyCisgICAgTWVyZ2VSZWFkZXImIG1NZXJnZVJlYWRlcjsKKworICAgIC8vIG11dGV4IGZvciB0aGUgY29uZGl0aW9uIHZhcmlhYmxlCisgICAgTXV0ZXggICAgICAgIG1NdXRleDsKKworICAgIC8vIGNvbmRpdGlvbiB2YXJpYWJsZSB0byBhY3RpdmF0ZSBtZXJnaW5nIG9uIHRpbWVvdXQgPj0gMAorICAgIENvbmRpdGlvbiAgICBtQ29uZDsKKworICAgIC8vIHRpbWUgbGVmdCB1bnRpbCB0aGUgdGhyZWFkIGJsb2NrcyBhZ2FpbiAoaW4gbWljcm9zZWNvbmRzKQorICAgIGludCAgICAgICAgICBtVGltZW91dFVzOworCisgICAgLy8gbWVyZ2luZyBwZXJpb2Qgd2hlbiB0aGUgdGhyZWFkIGlzIGF3YWtlCisgICAgc3RhdGljIGNvbnN0IGludCAga1RocmVhZFNsZWVwUGVyaW9kVXMgPSAxMDAwMDAwIC8qMXMqLzsKKworICAgIC8vIGluaXRpYWwgdGltZW91dCB2YWx1ZSB3aGVuIHRyaWdnZXJlZAorICAgIHN0YXRpYyBjb25zdCBpbnQgIGtUaHJlYWRXYWtldXBQZXJpb2RVcyA9IDMwMDAwMDAgLyozcyovOworfTsKKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9OQkxPR19NRVJHRVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9OQkxvZy5oIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9OQkxvZy5oCmluZGV4IGZiNmYxNzkuLmZkNzM1MzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvTkJMb2cuaAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL05CTG9nLmgKQEAgLTE5LDU5NSArMTksMTAgQEAKICNpZm5kZWYgQU5EUk9JRF9NRURJQV9OQkxPR19ICiAjZGVmaW5lIEFORFJPSURfTUVESUFfTkJMT0dfSAogCi0jaW5jbHVkZSA8ZGVxdWU+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxhdWRpb191dGlscy9maWZvLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBTdHJpbmc4OwotCi1jbGFzcyBOQkxvZyB7Ci0KLXB1YmxpYzoKLQotICAgIHVzaW5nIGxvZ19oYXNoX3QgPSBSZXBvcnRQZXJmb3JtYW5jZTo6bG9nX2hhc2hfdDsKLQotICAgIC8vIEZJWE1FIEV2ZXJ5dGhpbmcgbmVlZGVkIGZvciBjbGllbnQgKHdyaXRlciBBUEkgYW5kIHJlZ2lzdHJhdGlvbikgc2hvdWxkIGJlIGlzb2xhdGVkCi0gICAgLy8gICAgICAgZnJvbSB0aGUgcmVzdCBvZiB0aGUgaW1wbGVtZW50YXRpb24uCi0gICAgY2xhc3MgV3JpdGVyOwotICAgIGNsYXNzIFJlYWRlcjsKLQotICAgIGVudW0gRXZlbnQgOiB1aW50OF90IHsKLSAgICAgICAgRVZFTlRfUkVTRVJWRUQsCi0gICAgICAgIEVWRU5UX1NUUklORywgICAgICAgICAgICAgICAvLyBBU0NJSSBzdHJpbmcsIG5vdCBOVUwtdGVybWluYXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogbWFrZSB0aW1lc3RhbXAgb3B0aW9uYWwKLSAgICAgICAgRVZFTlRfVElNRVNUQU1QLCAgICAgICAgICAgIC8vIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDKQotICAgICAgICBFVkVOVF9JTlRFR0VSLCAgICAgICAgICAgICAgLy8gaW50ZWdlciB2YWx1ZSBlbnRyeQotICAgICAgICBFVkVOVF9GTE9BVCwgICAgICAgICAgICAgICAgLy8gZmxvYXRpbmcgcG9pbnQgdmFsdWUgZW50cnkKLSAgICAgICAgRVZFTlRfUElELCAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgSUQgYW5kIHByb2Nlc3MgbmFtZQotICAgICAgICBFVkVOVF9BVVRIT1IsICAgICAgICAgICAgICAgLy8gYXV0aG9yIGluZGV4IChwcmVzZW50IGluIG1lcmdlZCBsb2dzKSB0cmFja3MgZW50cnkncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JpZ2luYWwgbG9nCi0gICAgICAgIEVWRU5UX1NUQVJUX0ZNVCwgICAgICAgICAgICAvLyBsb2dGb3JtYXQgc3RhcnQgZXZlbnQ6IGVudHJ5IGluY2x1ZGVzIGZvcm1hdCBzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb2xsb3dpbmcgZW50cmllcyBjb250YWluIGZvcm1hdCBhcmd1bWVudHMKLSAgICAgICAgRVZFTlRfSEFTSCwgICAgICAgICAgICAgICAgIC8vIHVuaXF1ZSBIQVNIIG9mIGxvZyBvcmlnaW4sIG9yaWdpbmF0ZXMgZnJvbSBoYXNoIG9mIGZpbGUgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGxpbmUgbnVtYmVyCi0gICAgICAgIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywgICAvLyBzaW5nbGUgZGF0dW0gZm9yIHRpbWVzdGFtcCBoaXN0b2dyYW0KLSAgICAgICAgRVZFTlRfQVVESU9fU1RBVEUsICAgICAgICAgIC8vIGF1ZGlvIG9uL29mZiBldmVudDogbG9nZ2VkIG9uIEZhc3RNaXhlcjo6b25TdGF0ZUNoYW5nZSBjYWxsCi0gICAgICAgIEVWRU5UX0VORF9GTVQsICAgICAgICAgICAgICAvLyBlbmQgb2YgbG9nRm9ybWF0IGFyZ3VtZW50IGxpc3QKLQotICAgICAgICBFVkVOVF9VUFBFUl9CT1VORCwgICAgICAgICAgLy8gdG8gY2hlY2sgZm9yIGludmFsaWQgZXZlbnRzCi0gICAgfTsKLQotcHJpdmF0ZToKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIEFQSSBmb3IgaGFuZGxpbmcgZm9ybWF0IGVudHJ5IG9wZXJhdGlvbnMKLQotICAgIC8vIGEgZm9ybWF0dGVkIGVudHJ5IGhhcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKLSAgICAvLyAgICAqIFNUQVJUX0ZNVCBlbnRyeSwgY29udGFpbmluZyB0aGUgZm9ybWF0IHN0cmluZwotICAgIC8vICAgICogVElNRVNUQU1QIGVudHJ5Ci0gICAgLy8gICAgKiBIQVNIIGVudHJ5Ci0gICAgLy8gICAgKiBhdXRob3IgZW50cnkgb2YgdGhlIHRocmVhZCB0aGF0IGdlbmVyYXRlZCBpdCAob3B0aW9uYWwsIHByZXNlbnQgaW4gbWVyZ2VkIGxvZykKLSAgICAvLyAgICAqIGZvcm1hdCBhcmcxCi0gICAgLy8gICAgKiBmb3JtYXQgYXJnMgotICAgIC8vICAgICogLi4uCi0gICAgLy8gICAgKiBFTkRfRk1UIGVudHJ5Ci0KLSAgICAvLyBlbnRyeSByZXByZXNlbnRhdGlvbiBpbiBtZW1vcnkKLSAgICBzdHJ1Y3QgZW50cnkgewotICAgICAgICBjb25zdCB1aW50OF90IHR5cGU7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgbGVuZ3RoOwotICAgICAgICBjb25zdCB1aW50OF90IGRhdGFbMF07Ci0gICAgfTsKLQotICAgIC8vIGVudHJ5IHRhaWwgcmVwcmVzZW50YXRpb24gKGFmdGVyIGRhdGEpCi0gICAgc3RydWN0IGVuZGluZyB7Ci0gICAgICAgIHVpbnQ4X3QgbGVuZ3RoOwotICAgICAgICB1aW50OF90IG5leHRbMF07Ci0gICAgfTsKLQotICAgIC8vIGVudHJ5IGl0ZXJhdG9yCi0gICAgY2xhc3MgRW50cnlJdGVyYXRvciB7Ci0gICAgcHVibGljOgotICAgICAgICBFbnRyeUl0ZXJhdG9yKCk7Ci0gICAgICAgIGV4cGxpY2l0IEVudHJ5SXRlcmF0b3IoY29uc3QgdWludDhfdCAqZW50cnkpOwotICAgICAgICBFbnRyeUl0ZXJhdG9yKGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKTsKLQotICAgICAgICAvLyBkZXJlZmVyZW5jZSB1bmRlcmx5aW5nIGVudHJ5Ci0gICAgICAgIGNvbnN0IGVudHJ5JiAgICBvcGVyYXRvciooKSBjb25zdDsKLSAgICAgICAgY29uc3QgZW50cnkqICAgIG9wZXJhdG9yLT4oKSBjb25zdDsKLSAgICAgICAgLy8gYWR2YW5jZSB0byBuZXh0IGVudHJ5Ci0gICAgICAgIEVudHJ5SXRlcmF0b3ImICAgICAgIG9wZXJhdG9yKysoKTsgLy8gKytpCi0gICAgICAgIC8vIGJhY2sgdG8gcHJldmlvdXMgZW50cnkKLSAgICAgICAgRW50cnlJdGVyYXRvciYgICAgICAgb3BlcmF0b3ItLSgpOyAvLyAtLWkKLSAgICAgICAgRW50cnlJdGVyYXRvciAgICAgICAgbmV4dCgpIGNvbnN0OwotICAgICAgICBFbnRyeUl0ZXJhdG9yICAgICAgICBwcmV2KCkgY29uc3Q7Ci0gICAgICAgIGJvb2wgICAgICAgICAgICBvcGVyYXRvciE9KGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdDsKLSAgICAgICAgaW50ICAgICAgICAgICAgIG9wZXJhdG9yLShjb25zdCBFbnRyeUl0ZXJhdG9yICZvdGhlcikgY29uc3Q7Ci0KLSAgICAgICAgYm9vbCAgICAgICAgICAgIGhhc0NvbnNpc3RlbnRMZW5ndGgoKSBjb25zdDsKLSAgICAgICAgdm9pZCAgICAgICAgICAgIGNvcHlUbyhzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QpIGNvbnN0OwotICAgICAgICB2b2lkICAgICAgICAgICAgY29weURhdGEodWludDhfdCAqZHN0KSBjb25zdDsKLQotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgICAgICBpbmxpbmUgY29uc3QgVCYgcGF5bG9hZCgpIHsKLSAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUICo+KHB0ciArIG9mZnNldG9mKGVudHJ5LCBkYXRhKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmxpbmUgb3BlcmF0b3IgY29uc3QgdWludDhfdCooKSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4gcHRyOwotICAgICAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBjb25zdCB1aW50OF90ICAqcHRyOwotICAgIH07Ci0KLSAgICBjbGFzcyBBYnN0cmFjdEVudHJ5IHsKLSAgICBwdWJsaWM6Ci0KLSAgICAgICAgLy8gRW50cnkgc3RhcnRpbmcgaW4gdGhlIGdpdmVuIHBvaW50ZXIKLSAgICAgICAgZXhwbGljaXQgQWJzdHJhY3RFbnRyeShjb25zdCB1aW50OF90ICplbnRyeSk7Ci0gICAgICAgIHZpcnR1YWwgfkFic3RyYWN0RW50cnkoKSB7fQotCi0gICAgICAgIC8vIGJ1aWxkIGNvbmNyZXRlIGVudHJ5IG9mIGFwcHJvcHJpYXRlIGNsYXNzIGZyb20gcG9pbnRlcgotICAgICAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEFic3RyYWN0RW50cnk+IGJ1aWxkRW50cnkoY29uc3QgdWludDhfdCAqcHRyKTsKLQotICAgICAgICAvLyBnZXQgZm9ybWF0IGVudHJ5IHRpbWVzdGFtcAotICAgICAgICB2aXJ0dWFsIGludDY0X3QgICAgICB0aW1lc3RhbXAoKSBjb25zdCA9IDA7Ci0KLSAgICAgICAgLy8gZ2V0IGZvcm1hdCBlbnRyeSdzIHVuaXF1ZSBpZAotICAgICAgICB2aXJ0dWFsIGxvZ19oYXNoX3QgICBoYXNoKCkgY29uc3QgPSAwOwotCi0gICAgICAgIC8vIGVudHJ5J3MgYXV0aG9yIGluZGV4ICgtMSBpZiBub25lIHByZXNlbnQpCi0gICAgICAgIC8vIGEgTWVyZ2VyIGhhcyBhIHZlY3RvciBvZiBSZWFkZXJzLCBhdXRob3Igc2ltcGx5IHBvaW50cyB0byB0aGUgaW5kZXggb2YgdGhlCi0gICAgICAgIC8vIFJlYWRlciB0aGF0IG9yaWdpbmF0ZWQgdGhlIGVudHJ5Ci0gICAgICAgIC8vIFRPRE8gY29uc2lkZXIgY2hhbmdpbmcgdG8gdWludDMyX3QKLSAgICAgICAgdmlydHVhbCBpbnQgICAgICAgICAgYXV0aG9yKCkgY29uc3QgPSAwOwotCi0gICAgICAgIC8vIGNvcHkgZW50cnksIGFkZGluZyBhdXRob3IgYmVmb3JlIHRpbWVzdGFtcCwgcmV0dXJucyBpdGVyYXRvciB0byBlbmQgb2YgZW50cnkKLSAgICAgICAgdmlydHVhbCBFbnRyeUl0ZXJhdG9yICAgIGNvcHlXaXRoQXV0aG9yKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdXRob3IpIGNvbnN0ID0gMDsKLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgLy8gY29waWVzIG9yZGluYXJ5IGVudHJ5IGZyb20gc3JjIHRvIGRzdCwgYW5kIHJldHVybnMgbGVuZ3RoIG9mIGVudHJ5Ci0gICAgICAgIC8vIHNpemVfdCAgICAgIGNvcHlFbnRyeShhdWRpb191dGlsc19maWZvX3dyaXRlciAqZHN0LCBjb25zdCBpdGVyYXRvciAmaXQpOwotICAgICAgICBjb25zdCB1aW50OF90ICAqbUVudHJ5OwotICAgIH07Ci0KLSAgICBjbGFzcyBGb3JtYXRFbnRyeSA6IHB1YmxpYyBBYnN0cmFjdEVudHJ5IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIC8vIGV4cGxpY2l0IEZvcm1hdEVudHJ5KGNvbnN0IEVudHJ5SXRlcmF0b3IgJml0KTsKLSAgICAgICAgZXhwbGljaXQgRm9ybWF0RW50cnkoY29uc3QgdWludDhfdCAqcHRyKSA6IEFic3RyYWN0RW50cnkocHRyKSB7fQotICAgICAgICB2aXJ0dWFsIH5Gb3JtYXRFbnRyeSgpIHt9Ci0KLSAgICAgICAgRW50cnlJdGVyYXRvciBiZWdpbigpIGNvbnN0OwotCi0gICAgICAgIC8vIEVudHJ5J3MgZm9ybWF0IHN0cmluZwotICAgICAgICBjb25zdCAgIGNoYXIqIGZvcm1hdFN0cmluZygpIGNvbnN0OwotCi0gICAgICAgIC8vIEVucnR5J3MgZm9ybWF0IHN0cmluZyBsZW5ndGgKLSAgICAgICAgc2l6ZV90ICAgICAgZm9ybWF0U3RyaW5nTGVuZ3RoKCkgY29uc3Q7Ci0KLSAgICAgICAgLy8gRm9ybWF0IGFyZ3VtZW50cyAoZXhjbHVkaW5nIGZvcm1hdCBzdHJpbmcsIHRpbWVzdGFtcCBhbmQgYXV0aG9yKQotICAgICAgICBFbnRyeUl0ZXJhdG9yICAgIGFyZ3MoKSBjb25zdDsKLQotICAgICAgICAvLyBnZXQgZm9ybWF0IGVudHJ5IHRpbWVzdGFtcAotICAgICAgICB2aXJ0dWFsIGludDY0X3QgICAgIHRpbWVzdGFtcCgpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgICAgIC8vIGdldCBmb3JtYXQgZW50cnkncyB1bmlxdWUgaWQKLSAgICAgICAgdmlydHVhbCBsb2dfaGFzaF90ICBoYXNoKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICAgICAgLy8gZW50cnkncyBhdXRob3IgaW5kZXggKC0xIGlmIG5vbmUgcHJlc2VudCkKLSAgICAgICAgLy8gYSBNZXJnZXIgaGFzIGEgdmVjdG9yIG9mIFJlYWRlcnMsIGF1dGhvciBzaW1wbHkgcG9pbnRzIHRvIHRoZSBpbmRleCBvZiB0aGUKLSAgICAgICAgLy8gUmVhZGVyIHRoYXQgb3JpZ2luYXRlZCB0aGUgZW50cnkKLSAgICAgICAgdmlydHVhbCBpbnQgICAgICAgICBhdXRob3IoKSBjb25zdCBvdmVycmlkZTsKLQotICAgICAgICAvLyBjb3B5IGVudHJ5LCBhZGRpbmcgYXV0aG9yIGJlZm9yZSB0aW1lc3RhbXAsIHJldHVybnMgc2l6ZSBvZiBvcmlnaW5hbCBlbnRyeQotICAgICAgICB2aXJ0dWFsIEVudHJ5SXRlcmF0b3IgICAgY29weVdpdGhBdXRob3Ioc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1dGhvcikgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICB9OwotCi0gICAgY2xhc3MgSGlzdG9ncmFtRW50cnkgOiBwdWJsaWMgQWJzdHJhY3RFbnRyeSB7Ci0gICAgcHVibGljOgotICAgICAgICBleHBsaWNpdCBIaXN0b2dyYW1FbnRyeShjb25zdCB1aW50OF90ICpwdHIpIDogQWJzdHJhY3RFbnRyeShwdHIpIHsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIH5IaXN0b2dyYW1FbnRyeSgpIHt9Ci0KLSAgICAgICAgdmlydHVhbCBpbnQ2NF90ICAgICB0aW1lc3RhbXAoKSBjb25zdCBvdmVycmlkZTsKLQotICAgICAgICB2aXJ0dWFsIGxvZ19oYXNoX3QgIGhhc2goKSBjb25zdCBvdmVycmlkZTsKLQotICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgIGF1dGhvcigpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgICAgIHZpcnR1YWwgRW50cnlJdGVyYXRvciAgICBjb3B5V2l0aEF1dGhvcihzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXV0aG9yKSBjb25zdCBvdmVycmlkZTsKLQotICAgIH07Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIHJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIGxvZyBlbnRyeSBpbiBwcml2YXRlIG1lbW9yeQotICAgIHN0cnVjdCBFbnRyeSB7Ci0gICAgICAgIEVudHJ5KEV2ZW50IGV2ZW50LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKQotICAgICAgICAgICAgOiBtRXZlbnQoZXZlbnQpLCBtTGVuZ3RoKGxlbmd0aCksIG1EYXRhKGRhdGEpIHsgfQotICAgICAgICAvKnZpcnR1YWwqLyB+RW50cnkoKSB7IH0KLQotICAgICAgICAvLyB1c2VkIGR1cmluZyB3cml0aW5nIHRvIGZvcm1hdCBFbnRyeSBpbmZvcm1hdGlvbiBhcyBmb2xsb3dzOgotICAgICAgICAvLyBbdHlwZV1bbGVuZ3RoXVtkYXRhIC4uLiBdW2xlbmd0aF0KLSAgICAgICAgaW50ICAgICBjb3B5RW50cnlEYXRhQXQoc2l6ZV90IG9mZnNldCkgY29uc3Q7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBmcmllbmQgY2xhc3MgV3JpdGVyOwotICAgICAgICBFdmVudCAgICAgICBtRXZlbnQ7ICAgICAvLyBldmVudCB0eXBlCi0gICAgICAgIHVpbnQ4X3QgICAgIG1MZW5ndGg7ICAgIC8vIGxlbmd0aCBvZiBhZGRpdGlvbmFsIGRhdGEsIDAgPD0gbUxlbmd0aCA8PSBrTWF4TGVuZ3RoCi0gICAgICAgIGNvbnN0IHZvaWQgKm1EYXRhOyAgICAgIC8vIGV2ZW50IHR5cGUtc3BlY2lmaWMgZGF0YQotICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhMZW5ndGggPSAyNTU7Ci0gICAgcHVibGljOgotICAgICAgICAvLyBtRXZlbnQsIG1MZW5ndGgsIG1EYXRhWy4uLl0sIGR1cGxpY2F0ZSBtTGVuZ3RoCi0gICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga092ZXJoZWFkID0gc2l6ZW9mKGVudHJ5KSArIHNpemVvZihlbmRpbmcpOwotICAgICAgICAvLyBlbmRpbmQgbGVuZ3RoIG9mIHByZXZpb3VzIGVudHJ5Ci0gICAgICAgIHN0YXRpYyBjb25zdCBzc2l6ZV90IGtQcmV2aW91c0xlbmd0aE9mZnNldCA9IC0gc2l6ZW9mKGVuZGluZykgKwotICAgICAgICAgICAgb2Zmc2V0b2YoZW5kaW5nLCBsZW5ndGgpOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgSGlzdFRzRW50cnkgewotICAgICAgICBsb2dfaGFzaF90IGhhc2g7Ci0gICAgICAgIGludDY0X3QgdHM7Ci0gICAgfTsgLy9UT0RPIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0gICAgc3RydWN0IEhpc3RUc0VudHJ5V2l0aEF1dGhvciB7Ci0gICAgICAgIGxvZ19oYXNoX3QgaGFzaDsKLSAgICAgICAgaW50NjRfdCB0czsKLSAgICAgICAgaW50IGF1dGhvcjsKLSAgICB9OyAvL1RPRE8gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSAgICBzdHJ1Y3QgSGlzdEludEVudHJ5IHsKLSAgICAgICAgbG9nX2hhc2hfdCBoYXNoOwotICAgICAgICBpbnQgdmFsdWU7Ci0gICAgfTsgLy9UT0RPIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0gICAgLy8gcmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgbG9nIGVudHJ5IGluIHNoYXJlZCBtZW1vcnkKLSAgICAvLyAgYnl0ZVswXSAgICAgICAgICAgICBtRXZlbnQKLSAgICAvLyAgYnl0ZVsxXSAgICAgICAgICAgICBtTGVuZ3RoCi0gICAgLy8gIGJ5dGVbMl0gICAgICAgICAgICAgbURhdGFbMF0KLSAgICAvLyAgLi4uCi0gICAgLy8gIGJ5dGVbMitpXSAgICAgICAgICAgbURhdGFbaV0KLSAgICAvLyAgLi4uCi0gICAgLy8gIGJ5dGVbMittTGVuZ3RoLTFdICAgbURhdGFbbUxlbmd0aC0xXQotICAgIC8vICBieXRlWzIrbUxlbmd0aF0gICAgIGR1cGxpY2F0ZSBjb3B5IG9mIG1MZW5ndGggdG8gcGVybWl0IHJldmVyc2Ugc2NhbgotICAgIC8vICBieXRlWzMrbUxlbmd0aF0gICAgIHN0YXJ0IG9mIG5leHQgbG9nIGVudHJ5Ci0KLSAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRJbnQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSk7Ci0gICAgc3RhdGljIHZvaWQgICAgYXBwZW5kRmxvYXQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSk7Ci0gICAgc3RhdGljIHZvaWQgICAgYXBwZW5kUElEKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpOwotICAgIHN0YXRpYyB2b2lkICAgIGFwcGVuZFRpbWVzdGFtcChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKTsKLSAgICBzdGF0aWMgc2l6ZV90ICBmbXRFbnRyeUxlbmd0aChjb25zdCB1aW50OF90ICpkYXRhKTsKLSAgICBzdGF0aWMgU3RyaW5nOCBidWZmZXJEdW1wKGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOwotICAgIHN0YXRpYyBTdHJpbmc4IGJ1ZmZlckR1bXAoY29uc3QgRW50cnlJdGVyYXRvciAmaXQpOwotcHVibGljOgotCi0gICAgLy8gTG9jYXRlZCBpbiBzaGFyZWQgbWVtb3J5LCBtdXN0IGJlIFBPRC4KLSAgICAvLyBFeGFjdGx5IG9uZSBwcm9jZXNzIG11c3QgZXhwbGljaXRseSBjYWxsIHRoZSBjb25zdHJ1Y3RvciBvciB1c2UgcGxhY2VtZW50IG5ldy4KLSAgICAvLyBTaW5jZSB0aGlzIGlzIGEgUE9ELCB0aGUgZGVzdHJ1Y3RvciBpcyBlbXB0eSBhbmQgdW5uZWNlc3NhcnkgdG8gY2FsbCBpdCBleHBsaWNpdGx5LgotICAgIHN0cnVjdCBTaGFyZWQgewotICAgICAgICBTaGFyZWQoKSAvKiBtUmVhciBpbml0aWFsaXplZCB2aWEgZGVmYXVsdCBjb25zdHJ1Y3RvciAqLyB7IH0KLSAgICAgICAgLyp2aXJ0dWFsKi8gflNoYXJlZCgpIHsgfQotCi0gICAgICAgIGF1ZGlvX3V0aWxzX2ZpZm9faW5kZXggIG1SZWFyOyAgLy8gaW5kZXggb25lIGJ5dGUgcGFzdCB0aGUgZW5kIG9mIG1vc3QgcmVjZW50IEVudHJ5Ci0gICAgICAgIGNoYXIgICAgbUJ1ZmZlclswXTsgICAgICAgICAgICAgLy8gY2lyY3VsYXIgYnVmZmVyIGZvciBlbnRyaWVzCi0gICAgfTsKLQotcHVibGljOgotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyBGSVhNRSBUaW1lbGluZSB3YXMgaW50ZW5kZWQgdG8gd3JhcCBXcml0ZXIgYW5kIFJlYWRlciwgYnV0IGlzbid0IGFjdHVhbGx5IHVzZWQgeWV0LgotICAgIC8vIEZvciBub3cgaXQgaXMganVzdCBhIG5hbWVzcGFjZSBmb3Igc2hhcmVkU2l6ZSgpLgotICAgIGNsYXNzIFRpbWVsaW5lIDogcHVibGljIFJlZkJhc2UgewotICAgIHB1YmxpYzoKLSNpZiAwCi0gICAgICAgIFRpbWVsaW5lKHNpemVfdCBzaXplLCB2b2lkICpzaGFyZWQgPSBOVUxMKTsKLSAgICAgICAgdmlydHVhbCB+VGltZWxpbmUoKTsKLSNlbmRpZgotCi0gICAgICAgIC8vIElucHV0IHBhcmFtZXRlciAnc2l6ZScgaXMgdGhlIGRlc2lyZWQgc2l6ZSBvZiB0aGUgdGltZWxpbmUgaW4gYnl0ZSB1bml0cy4KLSAgICAgICAgLy8gUmV0dXJucyB0aGUgc2l6ZSByb3VuZGVkIHVwIHRvIGEgcG93ZXItb2YtMiwgcGx1cyB0aGUgY29uc3RhbnQgc2l6ZSBvdmVyaGVhZCBmb3IgaW5kaWNlcy4KLSAgICAgICAgc3RhdGljIHNpemVfdCBzaGFyZWRTaXplKHNpemVfdCBzaXplKTsKLQotI2lmIDAKLSAgICBwcml2YXRlOgotICAgICAgICBmcmllbmQgY2xhc3MgICAgV3JpdGVyOwotICAgICAgICBmcmllbmQgY2xhc3MgICAgUmVhZGVyOwotCi0gICAgICAgIGNvbnN0IHNpemVfdCAgICBtU2l6ZTsgICAgICAvLyBjaXJjdWxhciBidWZmZXIgc2l6ZSBpbiBieXRlcywgbXVzdCBiZSBhIHBvd2VyIG9mIDIKLSAgICAgICAgYm9vbCAgICAgICAgICAgIG1Pd247ICAgICAgIC8vIHdoZXRoZXIgSSBvd24gdGhlIG1lbW9yeSBhdCBtU2hhcmVkCi0gICAgICAgIFNoYXJlZCogY29uc3QgICBtU2hhcmVkOyAgICAvLyBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnkKLSNlbmRpZgotICAgIH07Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIFdyaXRlciBpcyB0aHJlYWQtc2FmZSB3aXRoIHJlc3BlY3QgdG8gUmVhZGVyLCBidXQgbm90IHdpdGggcmVzcGVjdCB0byBtdWx0aXBsZSB0aHJlYWRzCi0gICAgLy8gY2FsbGluZyBXcml0ZXIgbWV0aG9kcy4gIElmIHlvdSBuZWVkIG11bHRpLXRocmVhZCBzYWZldHkgZm9yIHdyaXRpbmcsIHVzZSBMb2NrZWRXcml0ZXIuCi0gICAgY2xhc3MgV3JpdGVyIDogcHVibGljIFJlZkJhc2UgewotICAgIHB1YmxpYzoKLSAgICAgICAgV3JpdGVyKCk7ICAgICAgICAgICAgICAgICAgIC8vIGR1bW15IG5vcCBpbXBsZW1lbnRhdGlvbiB3aXRob3V0IHNoYXJlZCBtZW1vcnkKLQotICAgICAgICAvLyBJbnB1dCBwYXJhbWV0ZXIgJ3NpemUnIGlzIHRoZSBkZXNpcmVkIHNpemUgb2YgdGhlIHRpbWVsaW5lIGluIGJ5dGUgdW5pdHMuCi0gICAgICAgIC8vIFRoZSBzaXplIG9mIHRoZSBzaGFyZWQgbWVtb3J5IG11c3QgYmUgYXQgbGVhc3QgVGltZWxpbmU6OnNoYXJlZFNpemUoc2l6ZSkuCi0gICAgICAgIFdyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKTsKLSAgICAgICAgV3JpdGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICAgICAgdmlydHVhbCB+V3JpdGVyKCk7Ci0KLSAgICAgICAgLy8gRklYTUUgbmVlZHMgY29tbWVudHMsIGFuZCBzb21lIHNob3VsZCBiZSBwcml2YXRlCi0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2coY29uc3QgY2hhciAqc3RyaW5nKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ2YoY29uc3QgY2hhciAqZm10LCAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ3ZmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dUaW1lc3RhbXAoKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ1RpbWVzdGFtcChjb25zdCBpbnQ2NF90IHRzKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ0ludGVnZXIoY29uc3QgaW50IHgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nRmxvYXQoY29uc3QgZmxvYXQgeCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dQSUQoKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ0Zvcm1hdChjb25zdCBjaGFyICpmbXQsIGxvZ19oYXNoX3QgaGFzaCwgLi4uKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ1ZGb3JtYXQoY29uc3QgY2hhciAqZm10LCBsb2dfaGFzaF90IGhhc2gsIHZhX2xpc3QgYXApOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nU3RhcnQoY29uc3QgY2hhciAqZm10KTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ0VuZCgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nSGFzaChsb2dfaGFzaF90IGhhc2gpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nRXZlbnRIaXN0VHMoRXZlbnQgZXZlbnQsIGxvZ19oYXNoX3QgaGFzaCk7Ci0KLSAgICAgICAgdmlydHVhbCBib29sICAgIGlzRW5hYmxlZCgpIGNvbnN0OwotCi0gICAgICAgIC8vIHJldHVybiB2YWx1ZSBmb3IgYWxsIG9mIHRoZXNlIGlzIHRoZSBwcmV2aW91cyBpc0VuYWJsZWQoKQotICAgICAgICB2aXJ0dWFsIGJvb2wgICAgc2V0RW5hYmxlZChib29sIGVuYWJsZWQpOyAgIC8vIGJ1dCB3b24ndCBlbmFibGUgaWYgbm8gc2hhcmVkIG1lbW9yeQotICAgICAgICBib29sICAgIGVuYWJsZSgpICAgIHsgcmV0dXJuIHNldEVuYWJsZWQodHJ1ZSk7IH0KLSAgICAgICAgYm9vbCAgICBkaXNhYmxlKCkgICB7IHJldHVybiBzZXRFbmFibGVkKGZhbHNlKTsgfQotCi0gICAgICAgIHNwPElNZW1vcnk+ICAgICBnZXRJTWVtb3J5KCkgY29uc3QgIHsgcmV0dXJuIG1JTWVtb3J5OyB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICAvLyAwIDw9IGxlbmd0aCA8PSBrTWF4TGVuZ3RoCi0gICAgICAgIC8vIHdyaXRlcyBhIHNpbmdsZSBFbnRyeSB0byB0aGUgRklGTwotICAgICAgICB2b2lkICAgIGxvZyhFdmVudCBldmVudCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7Ci0gICAgICAgIC8vIGNoZWNrcyB2YWxpZGl0eSBvZiBhbiBldmVudCBiZWZvcmUgY2FsbGluZyBsb2cgYWJvdmUgdGhpcyBvbmUKLSAgICAgICAgdm9pZCAgICBsb2coY29uc3QgRW50cnkgKmVudHJ5LCBib29sIHRydXN0ZWQgPSBmYWxzZSk7Ci0KLSAgICAgICAgU2hhcmVkKiBjb25zdCAgIG1TaGFyZWQ7ICAgIC8vIHJhdyBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnkKLSAgICAgICAgc3A8SU1lbW9yeT4gICAgIG1JTWVtb3J5OyAgIC8vIHJlZi1jb3VudGVkIHZlcnNpb24sIGluaXRpYWxpemVkIGluIGNvbnN0cnVjdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlbiBjb25zdAotICAgICAgICBhdWRpb191dGlsc19maWZvICogY29uc3QgbUZpZm87ICAgICAgICAgICAgICAgICAvLyBGSUZPIGl0c2VsZiwgbm9uLU5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5sZXNzIGNvbnN0cnVjdG9yIGZhaWxzCi0gICAgICAgIGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyICogY29uc3QgbUZpZm9Xcml0ZXI7ICAgIC8vIHVzZWQgdG8gd3JpdGUgdG8gRklGTywgbm9uLU5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5sZXNzIGR1bW15IGNvbnN0cnVjdG9yIHVzZWQKLSAgICAgICAgYm9vbCAgICAgICAgICAgIG1FbmFibGVkOyAgIC8vIHdoZXRoZXIgdG8gYWN0dWFsbHkgbG9nCi0KLSAgICAgICAgLy8gY2FjaGVkIHBpZCBhbmQgcHJvY2VzcyBuYW1lIHRvIHVzZSBpbiAlcCBmb3JtYXQgc3BlY2lmaWVyCi0gICAgICAgIC8vIHRvdGFsIHRhZyBsZW5ndGggaXMgbVBpZFRhZ1NpemUgYW5kIHByb2Nlc3MgbmFtZSBpcyBub3QgemVybyB0ZXJtaW5hdGVkCi0gICAgICAgIGNoYXIgICAqbVBpZFRhZzsKLSAgICAgICAgc2l6ZV90ICBtUGlkVGFnU2l6ZTsKLSAgICB9OwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyBTaW1pbGFyIHRvIFdyaXRlciwgYnV0IHNhZmUgZm9yIG11bHRpcGxlIHRocmVhZHMgdG8gY2FsbCBjb25jdXJyZW50bHkKLSAgICBjbGFzcyBMb2NrZWRXcml0ZXIgOiBwdWJsaWMgV3JpdGVyIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIExvY2tlZFdyaXRlcigpOwotICAgICAgICBMb2NrZWRXcml0ZXIodm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZyhjb25zdCBjaGFyICpzdHJpbmcpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nZihjb25zdCBjaGFyICpmbXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9ndmYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ1RpbWVzdGFtcCgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nVGltZXN0YW1wKGNvbnN0IGludDY0X3QgdHMpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nSW50ZWdlcihjb25zdCBpbnQgeCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dGbG9hdChjb25zdCBmbG9hdCB4KTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ1BJRCgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nU3RhcnQoY29uc3QgY2hhciAqZm10KTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ0VuZCgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nSGFzaChsb2dfaGFzaF90IGhhc2gpOwotCi0gICAgICAgIHZpcnR1YWwgYm9vbCAgICBpc0VuYWJsZWQoKSBjb25zdDsKLSAgICAgICAgdmlydHVhbCBib29sICAgIHNldEVuYWJsZWQoYm9vbCBlbmFibGVkKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIG11dGFibGUgTXV0ZXggICBtTG9jazsKLSAgICB9OwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBjbGFzcyBSZWFkZXIgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgcHVibGljOgotICAgICAgICAvLyBBIHNuYXBzaG90IG9mIGEgcmVhZGVycyBidWZmZXIKLSAgICAgICAgLy8gVGhpcyBpcyByYXcgZGF0YS4gTm8gYW5hbHlzaXMgaGFzIGJlZW4gZG9uZSBvbiBpdAotICAgICAgICBjbGFzcyBTbmFwc2hvdCB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIFNuYXBzaG90KCkgOiBtRGF0YShOVUxMKSwgbUxvc3QoMCkge30KLQotICAgICAgICAgICAgU25hcHNob3Qoc2l6ZV90IGJ1ZmZlclNpemUpIDogbURhdGEobmV3IHVpbnQ4X3RbYnVmZmVyU2l6ZV0pIHt9Ci0KLSAgICAgICAgICAgIH5TbmFwc2hvdCgpIHsgZGVsZXRlW10gbURhdGE7IH0KLQotICAgICAgICAgICAgLy8gY29weSBvZiB0aGUgYnVmZmVyCi0gICAgICAgICAgICB1aW50OF90ICpkYXRhKCkgY29uc3QgeyByZXR1cm4gbURhdGE7IH0KLQotICAgICAgICAgICAgLy8gYW1vdW50IG9mIGRhdGEgbG9zdCAoZ2l2ZW4gYnkgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIpCi0gICAgICAgICAgICBzaXplX3QgICBsb3N0KCkgY29uc3QgeyByZXR1cm4gbUxvc3Q7IH0KLQotICAgICAgICAgICAgLy8gaXRlcmF0b3IgdG8gYmVnaW5uaW5nIG9mIHJlYWRhYmxlIHNlZ21lbnQgb2Ygc25hcHNob3QKLSAgICAgICAgICAgIC8vIGRhdGEgYmV0d2VlbiBiZWdpbiBhbmQgZW5kIGhhcyB2YWxpZCBlbnRyaWVzCi0gICAgICAgICAgICBFbnRyeUl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gbUJlZ2luOyB9Ci0KLSAgICAgICAgICAgIC8vIGl0ZXJhdG9yIHRvIGVuZCBvZiByZWFkYWJsZSBzZWdtZW50IG9mIHNuYXBzaG90Ci0gICAgICAgICAgICBFbnRyeUl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIG1FbmQ7IH0KLQotICAgICAgICBwcml2YXRlOgotICAgICAgICAgICAgZnJpZW5kIGNsYXNzIE1lcmdlUmVhZGVyOwotICAgICAgICAgICAgZnJpZW5kIGNsYXNzIFJlYWRlcjsKLSAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICAgICptRGF0YTsKLSAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICBtTG9zdDsKLSAgICAgICAgICAgIEVudHJ5SXRlcmF0b3IgbUJlZ2luOwotICAgICAgICAgICAgRW50cnlJdGVyYXRvciBtRW5kOwotICAgICAgICB9OwotCi0gICAgICAgIC8vIElucHV0IHBhcmFtZXRlciAnc2l6ZScgaXMgdGhlIGRlc2lyZWQgc2l6ZSBvZiB0aGUgdGltZWxpbmUgaW4gYnl0ZSB1bml0cy4KLSAgICAgICAgLy8gVGhlIHNpemUgb2YgdGhlIHNoYXJlZCBtZW1vcnkgbXVzdCBiZSBhdCBsZWFzdCBUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplKS4KLSAgICAgICAgUmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOwotICAgICAgICBSZWFkZXIoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnksIHNpemVfdCBzaXplKTsKLQotICAgICAgICB2aXJ0dWFsIH5SZWFkZXIoKTsKLQotICAgICAgICAvLyBnZXQgc25hcHNob3Qgb2YgcmVhZGVycyBmaWZvIGJ1ZmZlciwgZWZmZWN0aXZlbHkgY29uc3VtaW5nIHRoZSBidWZmZXIKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PiBnZXRTbmFwc2hvdCgpOwotCi0gICAgICAgIGJvb2wgICAgIGlzSU1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSkgY29uc3Q7Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIC8vIHByaW50IGEgc3VtbWFyeSBvZiB0aGUgcGVyZm9ybWFuY2UgdG8gdGhlIGNvbnNvbGUKLSAgICAgICAgdm9pZCAgICBkdW1wTGluZShjb25zdCBTdHJpbmc4JiB0aW1lc3RhbXAsIFN0cmluZzgmIGJvZHkpOwotICAgICAgICBFbnRyeUl0ZXJhdG9yICAgaGFuZGxlRm9ybWF0KGNvbnN0IEZvcm1hdEVudHJ5ICZmbXRFbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4ICp0aW1lc3RhbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCAqYm9keSk7Ci0gICAgICAgIGludCBtRmQ7ICAgICAgICAgICAgICAgIC8vIGZpbGUgZGVzY3JpcHRvcgotICAgICAgICBpbnQgbUluZGVudDsgICAgICAgICAgICAvLyBpbmRlbnRhdGlvbiBsZXZlbAotICAgICAgICBpbnQgbUxvc3Q7ICAgICAgICAgICAgICAvLyBieXRlcyBvZiBkYXRhIGxvc3QgYmVmb3JlIGJ1ZmZlciB3YXMgcmVhZAotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgc3RhdGljIGNvbnN0IHN0ZDo6c2V0PEV2ZW50PiBzdGFydGluZ1R5cGVzOwotICAgICAgICBzdGF0aWMgY29uc3Qgc3RkOjpzZXQ8RXZlbnQ+IGVuZGluZ1R5cGVzOwotCi0gICAgICAgIC8vIGRlY2xhcmVkIGFzIGNvbnN0IGJlY2F1c2UgYXVkaW9fdXRpbHNfZmlmbygpIGNvbnN0cnVjdG9yCi0gICAgICAgIHNwPElNZW1vcnk+IG1JTWVtb3J5OyAgICAgICAvLyByZWYtY291bnRlZCB2ZXJzaW9uLCBhc3NpZ25lZCBvbmx5IGluIGNvbnN0cnVjdG9yCi0KLSAgICAgICAgLypjb25zdCovIFNoYXJlZCogY29uc3QgbVNoYXJlZDsgICAgLy8gcmF3IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeSwgYWN0dWFsbHkgY29uc3QgYnV0IG5vdAotICAgICAgICBhdWRpb191dGlsc19maWZvICogY29uc3QgbUZpZm87ICAgICAgICAgICAgICAgICAvLyBGSUZPIGl0c2VsZiwKLSAgICAgICAgLy8gbm9uLU5VTEwgdW5sZXNzIGNvbnN0cnVjdG9yIGZhaWxzCi0gICAgICAgIGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyICogY29uc3QgbUZpZm9SZWFkZXI7ICAgIC8vIHVzZWQgdG8gcmVhZCBmcm9tIEZJRk8sCi0gICAgICAgIC8vIG5vbi1OVUxMIHVubGVzcyBjb25zdHJ1Y3RvciBmYWlscwotCi0gICAgICAgIC8vIFNlYXJjaGVzIGZvciB0aGUgbGFzdCBlbnRyeSBvZiB0eXBlIDx0eXBlPiBpbiB0aGUgcmFuZ2UgW2Zyb250LCBiYWNrKQotICAgICAgICAvLyBiYWNrIGhhcyB0byBiZSBlbnRyeS1hbGlnbmVkLiBSZXR1cm5zIG51bGxwdHIgaWYgbm9uZSBlbmNvbnVudGVyZWQuCi0gICAgICAgIHN0YXRpYyBjb25zdCB1aW50OF90ICpmaW5kTGFzdEVudHJ5T2ZUeXBlcyhjb25zdCB1aW50OF90ICpmcm9udCwgY29uc3QgdWludDhfdCAqYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PEV2ZW50PiAmdHlwZXMpOwotCi0gICAgICAgIC8vIGR1bW15IG1ldGhvZCBmb3IgaGFuZGxpbmcgYWJzZW50IGF1dGhvciBlbnRyeQotICAgICAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlQXV0aG9yKGNvbnN0IEFic3RyYWN0RW50cnkmIC8qZm10RW50cnkqLywgU3RyaW5nOCogLypib2R5Ki8pIHt9Ci0gICAgfTsKLQotICAgIC8vIFdyYXBwZXIgZm9yIGEgcmVhZGVyIHdpdGggYSBuYW1lLiBDb250YWlucyBhIHBvaW50ZXIgdG8gdGhlIHJlYWRlciBhbmQgYSBwb2ludGVyIHRvIHRoZSBuYW1lCi0gICAgY2xhc3MgTmFtZWRSZWFkZXIgewotICAgIHB1YmxpYzoKLSAgICAgICAgTmFtZWRSZWFkZXIoKSB7IG1OYW1lWzBdID0gJ1wwJzsgfSAvLyBmb3IgVmVjdG9yCi0gICAgICAgIE5hbWVkUmVhZGVyKGNvbnN0IHNwPE5CTG9nOjpSZWFkZXI+JiByZWFkZXIsIGNvbnN0IGNoYXIgKm5hbWUpIDoKLSAgICAgICAgICAgIG1SZWFkZXIocmVhZGVyKQotICAgICAgICAgICAgeyBzdHJsY3B5KG1OYW1lLCBuYW1lLCBzaXplb2YobU5hbWUpKTsgfQotICAgICAgICB+TmFtZWRSZWFkZXIoKSB7IH0KLSAgICAgICAgY29uc3Qgc3A8TkJMb2c6OlJlYWRlcj4mICByZWFkZXIoKSBjb25zdCB7IHJldHVybiBtUmVhZGVyOyB9Ci0gICAgICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBzcDxOQkxvZzo6UmVhZGVyPiAgIG1SZWFkZXI7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heE5hbWUgPSAzMjsKLSAgICAgICAgY2hhciAgICAgICAgICAgICAgICBtTmFtZVtrTWF4TmFtZV07Ci0gICAgfTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHJlYWQgZGF0YSBmcm9tIGVhY2ggdGhyZWFkJ3MgaW5kaXZpZHVhbCBGSUZPIGluIHNoYXJlZCBtZW1vcnkKLSAgICAvLyBhbmQgd3JpdGUgaXQgdG8gYSBzaW5nbGUgRklGTyBpbiBsb2NhbCBtZW1vcnkuCi0gICAgY2xhc3MgTWVyZ2VyIDogcHVibGljIFJlZkJhc2UgewotICAgIHB1YmxpYzoKLSAgICAgICAgTWVyZ2VyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOwotCi0gICAgICAgIHZpcnR1YWwgfk1lcmdlcigpIHt9Ci0KLSAgICAgICAgdm9pZCBhZGRSZWFkZXIoY29uc3QgTmFtZWRSZWFkZXIgJnJlYWRlcik7Ci0gICAgICAgIC8vIFRPRE8gYWRkIHJlbW92ZVJlYWRlcgotICAgICAgICB2b2lkIG1lcmdlKCk7Ci0KLSAgICAgICAgLy8gRklYTUUgVGhpcyBpcyByZXR1cm5pbmcgYSByZWZlcmVuY2UgdG8gYSBzaGFyZWQgdmFyaWFibGUgdGhhdCBuZWVkcyBhIGxvY2sKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8TmFtZWRSZWFkZXI+JiBnZXROYW1lZFJlYWRlcnMoKSBjb25zdDsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIC8vIHZlY3RvciBvZiB0aGUgcmVhZGVycyB0aGUgbWVyZ2VyIGlzIHN1cHBvc2VkIHRvIG1lcmdlIGZyb20uCi0gICAgICAgIC8vIGV2ZXJ5IHJlYWRlciByZWFkcyBmcm9tIGEgd3JpdGVyJ3MgYnVmZmVyCi0gICAgICAgIC8vIEZJWE1FIE5lZWRzIHRvIGJlIHByb3RlY3RlZCBieSBhIGxvY2sKLSAgICAgICAgc3RkOjp2ZWN0b3I8TmFtZWRSZWFkZXI+IG1OYW1lZFJlYWRlcnM7Ci0KLSAgICAgICAgU2hhcmVkICogY29uc3QgbVNoYXJlZDsgLy8gcmF3IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeQotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmbz4gbUZpZm87IC8vIEZJRk8gaXRzZWxmCi0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gbUZpZm9Xcml0ZXI7IC8vIHVzZWQgdG8gd3JpdGUgdG8gRklGTwotICAgIH07Ci0KLSAgICAvLyBUaGlzIGNsYXNzIGhhcyBhIHBvaW50ZXIgdG8gdGhlIEZJRk8gaW4gbG9jYWwgbWVtb3J5IHdoaWNoIHN0b3JlcyB0aGUgbWVyZ2VkCi0gICAgLy8gZGF0YSBjb2xsZWN0ZWQgYnkgTkJMb2c6Ok1lcmdlciBmcm9tIGFsbCBOYW1lZFJlYWRlcnMuIEl0IGlzIHVzZWQgdG8gcHJvY2VzcwotICAgIC8vIHRoaXMgZGF0YSBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byBQZXJmb3JtYW5jZUFuYWx5c2lzLgotICAgIGNsYXNzIE1lcmdlUmVhZGVyIDogcHVibGljIFJlYWRlciB7Ci0gICAgcHVibGljOgotICAgICAgICBNZXJnZVJlYWRlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplLCBNZXJnZXIgJm1lcmdlcik7Ci0KLSAgICAgICAgdm9pZCBkdW1wKGludCBmZCwgaW50IGluZGVudCA9IDApOwotICAgICAgICAvLyBwcm9jZXNzIGEgcGFydGljdWxhciBzbmFwc2hvdCBvZiB0aGUgcmVhZGVyCi0gICAgICAgIHZvaWQgZ2V0QW5kUHJvY2Vzc1NuYXBzaG90KFNuYXBzaG90ICYgc25hcCk7Ci0gICAgICAgIC8vIGNhbGwgZ2V0U25hcHNob3Qgb2YgdGhlIGNvbnRlbnQgb2YgdGhlIHJlYWRlcidzIGJ1ZmZlciBhbmQgcHJvY2VzcyB0aGUgZGF0YQotICAgICAgICB2b2lkIGdldEFuZFByb2Nlc3NTbmFwc2hvdCgpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgLy8gRklYTUUgTmVlZHMgdG8gYmUgcHJvdGVjdGVkIGJ5IGEgbG9jaywKLSAgICAgICAgLy8gICAgICAgYmVjYXVzZSBldmVuIHRob3VnaCBvdXIgdXNlIG9mIGl0IGlzIHJlYWQtb25seSB0aGVyZSBtYXkgYmUgYXN5bmNocm9ub3VzIHVwZGF0ZXMKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8TmFtZWRSZWFkZXI+JiBtTmFtZWRSZWFkZXJzOwotCi0gICAgICAgIC8vIGFuYWx5emVzLCBjb21wcmVzc2VzIGFuZCBzdG9yZXMgdGhlIG1lcmdlZCBkYXRhCi0gICAgICAgIC8vIGNvbnRhaW5zIGEgc2VwYXJhdGUgaW5zdGFuY2UgZm9yIGV2ZXJ5IGF1dGhvciAodGhyZWFkKSwgYW5kIGZvciBldmVyeSBzb3VyY2UgZmlsZQotICAgICAgICAvLyBsb2NhdGlvbiB3aXRoaW4gZWFjaCBhdXRob3IKLSAgICAgICAgUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlQW5hbHlzaXNNYXAgbVRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXM7Ci0KLSAgICAgICAgLy8gaGFuZGxlIGF1dGhvciBlbnRyeSBieSBsb29raW5nIHVwIHRoZSBhdXRob3IncyBuYW1lIGFuZCBhcHBlbmRpbmcgaXQgdG8gdGhlIGJvZHkKLSAgICAgICAgLy8gcmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgcmVhZCBmcm9tIGZtdEVudHJ5Ci0gICAgICAgIHZvaWQgaGFuZGxlQXV0aG9yKGNvbnN0IEFic3RyYWN0RW50cnkgJmZtdEVudHJ5LCBTdHJpbmc4ICpib2R5KTsKLSAgICB9OwotCi0gICAgLy8gTWVyZ2VUaHJlYWQgaXMgYSB0aHJlYWQgdGhhdCBjb250YWlucyBhIE1lcmdlci4gSXQgd29ya3MgYXMgYSByZXRyaWdnZXJhYmxlIG9uZS1zaG90OgotICAgIC8vIHdoZW4gdHJpZ2dlcmVkLCBpdCBhd2FrZXMgZm9yIGEgbGFwc2Ugb2YgdGltZSwgZHVyaW5nIHdoaWNoIGl0IHBlcmlvZGljYWxseSBtZXJnZXM7IGlmCi0gICAgLy8gcmV0cmlnZ2VyZWQsIHRoZSB0aW1lb3V0IGlzIHJlc2V0LgotICAgIC8vIFRoZSB0aHJlYWQgaXMgdHJpZ2dlcmVkIG9uIEF1ZGlvRmxpbmdlciBiaW5kZXIgYWN0aXZpdHkuCi0gICAgY2xhc3MgTWVyZ2VUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIE1lcmdlVGhyZWFkKE1lcmdlciAmbWVyZ2VyLCBNZXJnZVJlYWRlciAmbWVyZ2VSZWFkZXIpOwotICAgICAgICB2aXJ0dWFsIH5NZXJnZVRocmVhZCgpIG92ZXJyaWRlOwotCi0gICAgICAgIC8vIFJlc2V0IHRpbWVvdXQgYW5kIGFjdGl2YXRlIHRocmVhZCB0byBtZXJnZSBwZXJpb2RpY2FsbHkgaWYgaXQncyBpZGxlCi0gICAgICAgIHZvaWQgd2FrZXVwKCk7Ci0KLSAgICAgICAgLy8gU2V0IHRpbWVvdXQgcGVyaW9kIHVudGlsIHRoZSBtZXJnaW5nIHRocmVhZCBnb2VzIGlkbGUgYWdhaW4KLSAgICAgICAgdm9pZCBzZXRUaW1lb3V0VXMoaW50IHRpbWUpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKSBvdmVycmlkZTsKLQotICAgICAgICAvLyB0aGUgbWVyZ2VyIHdobyBhY3R1YWxseSBkb2VzIHRoZSB3b3JrIG9mIG1lcmdpbmcgdGhlIGxvZ3MKLSAgICAgICAgTWVyZ2VyJiAgICAgbU1lcmdlcjsKLQotICAgICAgICAvLyB0aGUgbWVyZ2VyZWFkZXIgdXNlZCB0byBwcm9jZXNzIGRhdGEgbWVyZ2VkIGJ5IG1NZXJnZXIKLSAgICAgICAgTWVyZ2VSZWFkZXImIG1NZXJnZVJlYWRlcjsKLQotICAgICAgICAvLyBtdXRleCBmb3IgdGhlIGNvbmRpdGlvbiB2YXJpYWJsZQotICAgICAgICBNdXRleCAgICAgICBtTXV0ZXg7Ci0KLSAgICAgICAgLy8gY29uZGl0aW9uIHZhcmlhYmxlIHRvIGFjdGl2YXRlIG1lcmdpbmcgb24gdGltZW91dCA+PSAwCi0gICAgICAgIENvbmRpdGlvbiAgIG1Db25kOwotCi0gICAgICAgIC8vIHRpbWUgbGVmdCB1bnRpbCB0aGUgdGhyZWFkIGJsb2NrcyBhZ2FpbiAoaW4gbWljcm9zZWNvbmRzKQotICAgICAgICBpbnQgICAgICAgICBtVGltZW91dFVzOwotCi0gICAgICAgIC8vIG1lcmdpbmcgcGVyaW9kIHdoZW4gdGhlIHRocmVhZCBpcyBhd2FrZQotICAgICAgICBzdGF0aWMgY29uc3QgaW50ICBrVGhyZWFkU2xlZXBQZXJpb2RVcyA9IDEwMDAwMDAgLyoxcyovOwotCi0gICAgICAgIC8vIGluaXRpYWwgdGltZW91dCB2YWx1ZSB3aGVuIHRyaWdnZXJlZAotICAgICAgICBzdGF0aWMgY29uc3QgaW50ICBrVGhyZWFkV2FrZXVwUGVyaW9kVXMgPSAzMDAwMDAwIC8qM3MqLzsKLSAgICB9OwotCi19OyAgLy8gY2xhc3MgTkJMb2cKLQotLy8gVE9ETyBwdXQgc29tZXdoZXJlIGVsc2UKLXN0YXRpYyBpbmxpbmUgaW50NjRfdCBnZXRfbW9ub3RvbmljX25zKCkgewotICAgIHRpbWVzcGVjIHRzOwotICAgIGlmIChjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRzKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAodWludDY0X3QpIHRzLnR2X3NlYyAqIDEwMDAgKiAxMDAwICogMTAwMCArIHRzLnR2X25zZWM7Ci0gICAgfQotICAgIHJldHVybiAwOyAvLyBzaG91bGQgbm90IGhhcHBlbi4KLX0KLQotfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRW50cnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FdmVudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9SZWFkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9UaW1lbGluZS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1dyaXRlci5oPgogCiAjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfTkJMT0dfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmggYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaAppbmRleCBkZGZlOWQ2Li5kN2MxNmI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaApAQCAtMTksMTQgKzE5LDE3NiBAQAogCiAjaW5jbHVkZSA8ZGVxdWU+CiAjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgogI2luY2x1ZGUgPHZlY3Rvcj4KIAorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0V2ZW50cy5oPgogI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY2xhc3MgU3RyaW5nODsKKwogbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlIHsKIAorLy8gVE9ETyBtYWtlIHRoaXMgYSB0ZW1wbGF0ZWQgY2xhc3MgYW5kIHB1dCBpdCBpbiBhIHNlcGFyYXRlIGZpbGUuCisvLyBUaGUgdGVtcGxhdGVkIHBhcmFtZXRlcnMgd291bGQgYmUgYmluIHNpemUgYW5kIGxvdyBsaW1pdC4KKy8qCisgKiBIaXN0b2dyYW0gcHJvdmlkZXMgYSB3YXkgdG8gc3RvcmUgbnVtZXJpYyBkYXRhIGluIGhpc3RvZ3JhbSBmb3JtYXQgYW5kIHJlYWQgaXQgYXMgYSBzZXJpYWxpemVkCisgKiBzdHJpbmcuIFRoZSB0ZXJtcyAiYmluIiBhbmQgImJ1Y2tldCIgYXJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5LgorICoKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHRocmVhZC1zYWZlLgorICovCitjbGFzcyBIaXN0b2dyYW0geworcHVibGljOgorICAgIHN0cnVjdCBDb25maWcgeworICAgICAgICBjb25zdCBkb3VibGUgYmluU2l6ZTsgICAvLyBUT0RPIHRlbXBsYXRlIHR5cGUKKyAgICAgICAgY29uc3Qgc2l6ZV90IG51bUJpbnM7CisgICAgICAgIGNvbnN0IGRvdWJsZSBsb3c7ICAgICAgIC8vIFRPRE8gdGVtcGxhdGUgdHlwZQorICAgIH07CisKKyAgICAvLyBIaXN0b2dyYW1zIGFyZSBjb25zdHJ1Y3RlZCB3aXRoIGZpeGVkIGNvbmZpZ3VyYXRpb24gbnVtYmVycy4gRHluYW1pYyBjb25maWd1cmF0aW9uIGJhc2VkCisgICAgLy8gdGhlIGRhdGEgaXMgcG9zc2libGUgYnV0IGNvbXBsZXggYmVjYXVzZQorICAgIC8vIC0gZGF0YSBwb2ludHMgYXJlIGFkZGVkIG9uZSBieSBvbmUsIG5vdCBwcm9jZXNzZWQgYXMgYSBiYXRjaC4KKyAgICAvLyAtIEhpc3RvZ3JhbXMgd2l0aCBkaWZmZXJlbnQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFyZSB0cmlja3kgdG8gYWdncmVnYXRlLCBhbmQgdGhleQorICAgIC8vICAgd2lsbCBuZWVkIHRvIGJlIGFnZ3JlZ2F0ZWQgYXQgdGhlIE1lZGlhIE1ldHJpY3MgY2xvdWQgc2lkZS4KKyAgICAvLyAtIG5vdCBwcm92aWRpbmcgbGltaXRzIHRoZW9yZXRpY2FsbHkgYWxsb3dzIGZvciBpbmZpbml0ZSBudW1iZXIgb2YgYnVja2V0cy4KKworICAgIC8qKgorICAgICAqIFxicmllZiBDcmVhdGVzIGEgSGlzdG9ncmFtIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBiaW5TaXplIHRoZSB3aWR0aCBvZiBlYWNoIGJpbiBvZiB0aGUgaGlzdG9ncmFtLCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLgorICAgICAqICAgICAgICAgICAgICAgIFVuaXRzIGFyZSB3aGF0ZXZlciBkYXRhIHRoZSBjYWxsZXIgZGVjaWRlcyB0byBzdG9yZS4KKyAgICAgKiBccGFyYW0gbnVtQmlucyB0aGUgbnVtYmVyIG9mIGJpbnMgZGVzaXJlZCBpbiB0aGUgaGlzdG9ncmFtIHJhbmdlLCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLgorICAgICAqIFxwYXJhbSBsb3cgICAgIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgaGlzdG9ncmFtIGJ1Y2tldCB2YWx1ZXMuCisgICAgICogICAgICAgICAgICAgICAgVW5pdHMgYXJlIHdoYXRldmVyIGRhdGEgdGhlIGNhbGxlciBkZWNpZGVzIHRvIHN0b3JlLgorICAgICAqICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGUgdXBwZXIgYm91bmQgY2FuIGJlIGNhbGN1bGF0ZWQgYnkgdGhlIGZvbGxvd2luZzoKKyAgICAgKiAgICAgICAgICAgICAgICAgIHVwcGVyID0gbG93ZXIgKyBiaW5TaXplICogbnVtQmlucy4KKyAgICAgKi8KKyAgICBIaXN0b2dyYW0oZG91YmxlIGJpblNpemUsIHNpemVfdCBudW1CaW5zLCBkb3VibGUgbG93ID0gMC4pCisgICAgICAgIDogbUJpblNpemUoYmluU2l6ZSksIG1OdW1CaW5zKG51bUJpbnMpLCBtTG93KGxvdyksIG1CaW5zKG1OdW1CaW5zICsgMikge30KKworICAgIEhpc3RvZ3JhbShjb25zdCBDb25maWcgJmMpCisgICAgICAgIDogSGlzdG9ncmFtKGMuYmluU2l6ZSwgYy5udW1CaW5zLCBjLmxvdykge30KKworICAgIC8qKgorICAgICAqIFxicmllZiBBZGQgYSBkYXRhIHBvaW50IHRvIHRoZSBoaXN0b2dyYW0uIFRoZSB2YWx1ZSBvZiB0aGUgZGF0YSBwb2ludAorICAgICAqICAgICAgICBpcyByb3VuZGVkIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIHRoZSBiaW4gc2l6ZSAoYmVmb3JlIGFjY291bnRpbmcKKyAgICAgKiAgICAgICAgZm9yIHRoZSBsb3dlciBib3VuZCBvZmZzZXQsIHdoaWNoIG1heSBub3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgYmluIHNpemUpLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgZGF0YSBwb2ludCB0byBhZGQuCisgICAgICovCisgICAgdm9pZCBhZGQoZG91YmxlIHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFxicmllZiBSZW1vdmVzIGFsbCBkYXRhIHBvaW50cyBmcm9tIHRoZSBoaXN0b2dyYW0uCisgICAgICovCisgICAgdm9pZCBjbGVhcigpOworCisgICAgLyoqCisgICAgICogXGJyaWVmIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBkYXRhIHBvaW50cyBhZGRlZCB0byB0aGUgaGlzdG9ncmFtLgorICAgICAqCisgICAgICogXHJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGRhdGEgcG9pbnRzIGluIHRoZSBoaXN0b2dyYW0uCisgICAgICovCisgICAgdWludDY0X3QgdG90YWxDb3VudCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogXGJyaWVmIFNlcmlhbGl6ZXMgdGhlIGhpc3RvZ3JhbSBpbnRvIGEgc3RyaW5nLiBUaGUgZm9ybWF0IGlzIGNob3NlbiB0byBiZSBjb21wYXRpYmxlIHdpdGgKKyAgICAgKiAgICAgICAgdGhlIGhpc3RvZ3JhbSByZXByZXNlbnRhdGlvbiB0byBzZW5kIHRvIHRoZSBNZWRpYSBNZXRyaWNzIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiAgICAgICAgVGhlIHN0cmluZyBpcyBhcyBmb2xsb3dzOgorICAgICAqICAgICAgICAgIGJpblNpemUsbnVtQmlucyxsb3csey0xfGxvd0NvdW50LC4uLixiaW5JbmRleHxjb3VudCwuLi4sbnVtQmluc3xoaWdoQ291bnR9CisgICAgICoKKyAgICAgKiAgICAgICAgLSBiaW5JbmRleCBpcyBhbiBpbnRlZ2VyIHdpdGggMCA8PSBiaW5JbmRleCA8IG51bUJpbnMuCisgICAgICogICAgICAgIC0gY291bnQgaXMgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiB0aGUgKHJvdW5kZWQpIHZhbHVlCisgICAgICogICAgICAgICAgbG93ICsgYmluU2l6ZSAqIGJ1Y2tldEluZGV4LgorICAgICAqICAgICAgICAtIGxvd0NvdW50IGlzIHRoZSBudW1iZXIgb2YgKHJvdW5kZWQpIHZhbHVlcyBsZXNzIHRoYW4gbG93LgorICAgICAqICAgICAgICAtIGhpZ2hDb3VudCBpcyB0aGUgbnVtYmVyIG9mIChyb3VuZGVkKSB2YWx1ZXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvCisgICAgICogICAgICAgICAgbG93ICsgYmluU2l6ZSAqIG51bUJpbnMuCisgICAgICogICAgICAgIC0gYSBiaW5JbmRleCBtYXkgYmUgc2tpcHBlZCBpZiBpdHMgY291bnQgaXMgMC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdGhlIGhpc3RvZ3JhbSBzZXJpYWxpemVkIGFzIGEgc3RyaW5nLgorICAgICAqLworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7CisKKyAgICAvLyBEcmF3IGxvZyBzY2FsZSBzaWRld2F5cyBoaXN0b2dyYW0gYXMgQVNDSUkgYXJ0IGFuZCBzdG9yZSBhcyBhIHN0ZDo6c3RyaW5nLgorICAgIC8vIEVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBpZiB0b3RhbENvdW50KCkgPT0gMC4KKyAgICBzdGQ6OnN0cmluZyBhc2NpaUFydFN0cmluZyhzaXplX3QgaW5kZW50ID0gMCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgLy8gSGlzdG9ncmFtIHZlcnNpb24gbnVtYmVyLgorICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtWZXJzaW9uID0gMTsKKworICAgIGNvbnN0IGRvdWJsZSBtQmluU2l6ZTsgICAgICAgICAgLy8gU2l6ZSBvZiBlYWNoIGJ1Y2tldAorICAgIGNvbnN0IHNpemVfdCBtTnVtQmluczsgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ1Y2tldHMgaW4gcmFuZ2UgKGV4Y2x1ZGVzIGxvdyBhbmQgaGlnaCkKKyAgICBjb25zdCBkb3VibGUgbUxvdzsgICAgICAgICAgICAgIC8vIExvd2VyIGJvdW5kIG9mIHZhbHVlcworCisgICAgLy8gRGF0YSBzdHJ1Y3R1cmUgdG8gc3RvcmUgdGhlIGFjdHVhbCBoaXN0b2dyYW0uIENvdW50cyBvZiBiaW4gdmFsdWVzIGxlc3MgdGhhbiBtTG93CisgICAgLy8gYXJlIHN0b3JlZCBpbiBtQmluc1swXS4gQmluIGluZGV4IGkgY29ycmVzcG9uZHMgdG8gbUJpbnNbaSsxXS4gQ291bnRzIG9mIGJpbiB2YWx1ZXMKKyAgICAvLyA+PSBoaWdoIGFyZSBzdG9yZWQgaW4gbUJpbnNbbU51bUJpbnMgKyAxXS4KKyAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gbUJpbnM7CisKKyAgICB1aW50NjRfdCBtVG90YWxDb3VudCA9IDA7ICAgICAgIC8vIFRvdGFsIG51bWJlciBvZiB2YWx1ZXMgcmVjb3JkZWQKK307CisKKy8vIFRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgY2xhc3MgUGVyZm9ybWFuY2VBbmFseXNpcywgYnV0IFBlcmZvcm1hbmNlQW5hbHlzaXMKKy8vIGFsc28gZG9lcyBzb21lIGFkZGl0aW9uYWwgYW5hbHl6aW5nIG9mIGRhdGEsIHdoaWxlIHRoZSBwdXJwb3NlIG9mIHRoaXMgc3RydWN0IGlzCisvLyB0byBob2xkIGRhdGEuCitzdHJ1Y3QgUGVyZm9ybWFuY2VEYXRhIHsKKyAgICAvLyBUT0RPIHRoZSBIaXN0b2dyYW06OkNvbmZpZyBudW1iZXJzIGJlbG93IGFyZSBmb3IgRmFzdE1peGVyLgorICAgIC8vIFNwZWNpZnkgZGlmZmVyZW50IG51bWJlcnMgZm9yIG90aGVyIHRocmVhZCB0eXBlcy4KKworICAgIC8vIFZhbHVlcyBiYXNlZCBvbiBtVW5kZXJydW5OcyBhbmQgbU92ZXJydW5OcyBpbiBGYXN0TWl4ZXIuY3BwIGZvciBmcmFtZUNvdW50ID0gMTkyCisgICAgLy8gYW5kIG1TYW1wbGVSYXRlID0gNDgwMDAsIHdoaWNoIGNvcnJlc3BvbmQgdG8gMiBhbmQgNyBzZWNvbmRzLgorICAgIHN0YXRpYyBjb25zdGV4cHIgSGlzdG9ncmFtOjpDb25maWcga1dvcmtDb25maWcgPSB7IDAuMjUsIDIwLCAyLn07CisKKyAgICAvLyBWYWx1ZXMgYmFzZWQgb24gdHJpYWwgYW5kIGVycm9yIGxvZ2dpbmcuIE5lZWQgYSBiZXR0ZXIgd2F5IHRvIGRldGVybWluZQorICAgIC8vIGJpbiBzaXplIGFuZCBsb3dlci91cHBlciBsaW1pdHMuCisgICAgc3RhdGljIGNvbnN0ZXhwciBIaXN0b2dyYW06OkNvbmZpZyBrTGF0ZW5jeUNvbmZpZyA9IHsgMi4sIDEwLCAxMC59OworCisgICAgLy8gVmFsdWVzIGJhc2VkIG9uIHRyaWFsIGFuZCBlcnJvciBsb2dnaW5nLiBOZWVkIGEgYmV0dGVyIHdheSB0byBkZXRlcm1pbmUKKyAgICAvLyBiaW4gc2l6ZSBhbmQgbG93ZXIvdXBwZXIgbGltaXRzLgorICAgIHN0YXRpYyBjb25zdGV4cHIgSGlzdG9ncmFtOjpDb25maWcga1dhcm11cENvbmZpZyA9IHsgNS4sIDEwLCAxMC59OworCisgICAgTkJMb2c6OnRocmVhZF9pbmZvX3QgdGhyZWFkSW5mb3t9OworICAgIE5CTG9nOjp0aHJlYWRfcGFyYW1zX3QgdGhyZWFkUGFyYW1ze307CisKKyAgICAvLyBQZXJmb3JtYW5jZSBEYXRhCisgICAgSGlzdG9ncmFtIHdvcmtIaXN0e2tXb3JrQ29uZmlnfTsKKyAgICBIaXN0b2dyYW0gbGF0ZW5jeUhpc3R7a0xhdGVuY3lDb25maWd9OworICAgIEhpc3RvZ3JhbSB3YXJtdXBIaXN0e2tXYXJtdXBDb25maWd9OworICAgIGludDY0X3QgdW5kZXJydW5zID0gMDsKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWF4U25hcHNob3RzVG9TdG9yZSA9IDI1NjsKKyAgICBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjxOQkxvZzo6RXZlbnQsIGludDY0X3QgLyp0aW1lc3RhbXAqLz4+IHNuYXBzaG90czsKKyAgICBpbnQ2NF90IG92ZXJydW5zID0gMDsKKyAgICBuc2Vjc190IGFjdGl2ZSA9IDA7CisgICAgbnNlY3NfdCBzdGFydHtzeXN0ZW1UaW1lKCl9OworCisgICAgLy8gUmVzZXQgdGhlIHBlcmZvcm1hbmNlIGRhdGEuIFRoaXMgZG9lcyBub3QgcmVwcmVzZW50IGEgdGhyZWFkIHN0YXRlIGNoYW5nZS4KKyAgICAvLyBUaHJlYWQgaW5mbyBpcyBub3QgcmVzZXQgaGVyZSBiZWNhdXNlIHRoZSBkYXRhIGlzIG1lYW50IHRvIGJlIGEgY29udGludWF0aW9uIG9mIHRoZSB0aHJlYWQKKyAgICAvLyB0aGF0IHN0cnVjdCBQZXJmb3JtYW5jZURhdGEgaXMgYXNzb2NpYXRlZCB3aXRoLgorICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIHdvcmtIaXN0LmNsZWFyKCk7CisgICAgICAgIGxhdGVuY3lIaXN0LmNsZWFyKCk7CisgICAgICAgIHdhcm11cEhpc3QuY2xlYXIoKTsKKyAgICAgICAgdW5kZXJydW5zID0gMDsKKyAgICAgICAgb3ZlcnJ1bnMgPSAwOworICAgICAgICBhY3RpdmUgPSAwOworICAgICAgICBzdGFydCA9IHN5c3RlbVRpbWUoKTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gdHJ1ZSBpZiBwZXJmb3JtYW5jZSBkYXRhIGhhcyBub3QgYmVlbiByZWNvcmRlZCB5ZXQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICBib29sIGVtcHR5KCkgY29uc3QgeworICAgICAgICByZXR1cm4gd29ya0hpc3QudG90YWxDb3VudCgpID09IDAgJiYgbGF0ZW5jeUhpc3QudG90YWxDb3VudCgpID09IDAKKyAgICAgICAgICAgICAgICAmJiB3YXJtdXBIaXN0LnRvdGFsQ291bnQoKSA9PSAwICYmIHVuZGVycnVucyA9PSAwICYmIG92ZXJydW5zID09IDAKKyAgICAgICAgICAgICAgICAmJiBhY3RpdmUgPT0gMDsKKyAgICB9Cit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiBjbGFzcyBQZXJmb3JtYW5jZUFuYWx5c2lzOwogCiAvLyBhIG1hcCBvZiBQZXJmb3JtYW5jZUFuYWx5c2lzIGluc3RhbmNlcwpAQCAtODAsNyArMjQyLDcgQEAKICAgICBzdGQ6OmRlcXVlPHRpbWVzdGFtcD4gbVBlYWtUaW1lc3RhbXBzOwogCiAgICAgLy8gc3RvcmVzIGJ1ZmZlciBwZXJpb2QgaGlzdG9ncmFtcyB3aXRoIHRpbWVzdGFtcCBvZiBmaXJzdCBzYW1wbGUKLSAgICBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjx0aW1lc3RhbXAsIEhpc3RvZ3JhbT4+IG1IaXN0czsKKyAgICBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjx0aW1lc3RhbXAsIEhpc3Q+PiBtSGlzdHM7CiAKICAgICAvLyBQYXJhbWV0ZXJzIHVzZWQgd2hlbiBkZXRlY3Rpbmcgb3V0bGllcnMKICAgICBzdHJ1Y3QgQnVmZmVyUGVyaW9kIHsKQEAgLTExOSw4ICsyODEsNyBAQAogdm9pZCBkdW1wKGludCBmZCwgaW50IGluZGVudCwgUGVyZm9ybWFuY2VBbmFseXNpc01hcCAmdGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpcyk7CiB2b2lkIGR1bXBMaW5lKGludCBmZCwgaW50IGluZGVudCwgY29uc3QgU3RyaW5nOCAmYm9keSk7CiAKLX0gLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCi0KK30gICAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfUEVSRk9STUFOQ0VBTkFMWVNJU19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1JlYWRlci5oIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDk1ZThjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZWFkZXIuaApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9OQkxPR19SRUFERVJfSAorI2RlZmluZSBBTkRST0lEX01FRElBX05CTE9HX1JFQURFUl9ICisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FbnRyeS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0V2ZW50cy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworY2xhc3MgYXVkaW9fdXRpbHNfZmlmbzsKK2NsYXNzIGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIElNZW1vcnk7CitjbGFzcyBTdHJpbmc4OworCituYW1lc3BhY2UgTkJMb2cgeworCitzdHJ1Y3QgU2hhcmVkOworCisvLyBOQkxvZyBSZWFkZXIgQVBJCisKK2NsYXNzIFNuYXBzaG90OyAgICAgLy8gRm9yd2FyZCBkZWNsYXJhdGlvbiBuZWVkZWQgZm9yIFJlYWRlcjo6Z2V0U25hcHNob3QoKQorCitjbGFzcyBSZWFkZXIgOiBwdWJsaWMgUmVmQmFzZSB7CitwdWJsaWM6CisgICAgLy8gSW5wdXQgcGFyYW1ldGVyICdzaXplJyBpcyB0aGUgZGVzaXJlZCBzaXplIG9mIHRoZSB0aW1lbGluZSBpbiBieXRlIHVuaXRzLgorICAgIC8vIFRoZSBzaXplIG9mIHRoZSBzaGFyZWQgbWVtb3J5IG11c3QgYmUgYXQgbGVhc3QgVGltZWxpbmU6OnNoYXJlZFNpemUoc2l6ZSkuCisgICAgUmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUsIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKTsKKyAgICBSZWFkZXIoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnksIHNpemVfdCBzaXplLCBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSk7CisgICAgflJlYWRlcigpIG92ZXJyaWRlOworCisgICAgLy8gZ2V0IHNuYXBzaG90IG9mIHJlYWRlcnMgZmlmbyBidWZmZXIsIGVmZmVjdGl2ZWx5IGNvbnN1bWluZyB0aGUgYnVmZmVyCisgICAgc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PiBnZXRTbmFwc2hvdChib29sIGZsdXNoID0gdHJ1ZSk7CisgICAgYm9vbCAgICAgaXNJTWVtb3J5KGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5KSBjb25zdDsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9CisKK3ByaXZhdGU6CisgICAgLy8gQW1vdW50IG9mIHRyaWVzIGZvciByZWFkZXIgdG8gY2F0Y2ggdXAgd2l0aCB3cml0ZXIgaW4gZ2V0U25hcHNob3QoKS4KKyAgICBzdGF0aWMgY29uc3RleHByIGludCBrTWF4T2J0YWluVHJpZXMgPSAzOworCisgICAgLy8gaW52YWxpZEJlZ2luVHlwZXMgYW5kIGludmFsaWRFbmRUeXBlcyBhcmUgdXNlZCB0byBhbGlnbiB0aGUgU25hcHNob3Q6OmJlZ2luKCkgYW5kCisgICAgLy8gU25hcHNob3Q6OmVuZCgpIEVudHJ5SXRlcmF0b3JzIHRvIHZhbGlkIGVudHJpZXMuCisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxFdmVudD4gaW52YWxpZEJlZ2luVHlwZXM7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxFdmVudD4gaW52YWxpZEVuZFR5cGVzOworCisgICAgLy8gZGVjbGFyZWQgYXMgY29uc3QgYmVjYXVzZSBhdWRpb191dGlsc19maWZvKCkgY29uc3RydWN0b3IKKyAgICBzcDxJTWVtb3J5PiBtSU1lbW9yeTsgICAgICAgLy8gcmVmLWNvdW50ZWQgdmVyc2lvbiwgYXNzaWduZWQgb25seSBpbiBjb25zdHJ1Y3RvcgorCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbU5hbWU7ICAgICAgICAgICAgLy8gbmFtZSBvZiByZWFkZXIgKGFjdHVhbGx5IG5hbWUgb2Ygd3JpdGVyKQorICAgIC8qY29uc3QqLyBTaGFyZWQqIGNvbnN0IG1TaGFyZWQ7ICAgIC8vIHJhdyBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnksIGFjdHVhbGx5IGNvbnN0IGJ1dCBub3QKKyAgICBhdWRpb191dGlsc19maWZvICogY29uc3QgbUZpZm87ICAgICAgICAgICAgICAgICAvLyBGSUZPIGl0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub24tTlVMTCB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKKyAgICBhdWRpb191dGlsc19maWZvX3JlYWRlciAqIGNvbnN0IG1GaWZvUmVhZGVyOyAgICAvLyB1c2VkIHRvIHJlYWQgZnJvbSBGSUZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbi1OVUxMIHVubGVzcyBjb25zdHJ1Y3RvciBmYWlscworCisgICAgLy8gU2VhcmNoZXMgZm9yIHRoZSBsYXN0IHZhbGlkIGVudHJ5IGluIHRoZSByYW5nZSBbZnJvbnQsIGJhY2spCisgICAgLy8gYmFjayBoYXMgdG8gYmUgZW50cnktYWxpZ25lZC4gUmV0dXJucyBudWxscHRyIGlmIG5vbmUgZW5jb251bnRlcmVkLgorICAgIHN0YXRpYyBjb25zdCB1aW50OF90ICpmaW5kTGFzdFZhbGlkRW50cnkoY29uc3QgdWludDhfdCAqZnJvbnQsIGNvbnN0IHVpbnQ4X3QgKmJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxFdmVudD4gJmludmFsaWRUeXBlcyk7Cit9OworCisvLyBBIHNuYXBzaG90IG9mIGEgcmVhZGVycyBidWZmZXIKKy8vIFRoaXMgaXMgcmF3IGRhdGEuIE5vIGFuYWx5c2lzIGhhcyBiZWVuIGRvbmUgb24gaXQKK2NsYXNzIFNuYXBzaG90IHsKK3B1YmxpYzoKKyAgICB+U25hcHNob3QoKSB7IGRlbGV0ZVtdIG1EYXRhOyB9CisKKyAgICAvLyBhbW91bnQgb2YgZGF0YSBsb3N0IChnaXZlbiBieSBhdWRpb191dGlsc19maWZvX3JlYWRlcikKKyAgICBzaXplX3QgbG9zdCgpIGNvbnN0IHsgcmV0dXJuIG1Mb3N0OyB9CisKKyAgICAvLyBpdGVyYXRvciB0byBiZWdpbm5pbmcgb2YgcmVhZGFibGUgc2VnbWVudCBvZiBzbmFwc2hvdAorICAgIC8vIGRhdGEgYmV0d2VlbiBiZWdpbiBhbmQgZW5kIGhhcyB2YWxpZCBlbnRyaWVzCisgICAgRW50cnlJdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIG1CZWdpbjsgfQorCisgICAgLy8gaXRlcmF0b3IgdG8gZW5kIG9mIHJlYWRhYmxlIHNlZ21lbnQgb2Ygc25hcHNob3QKKyAgICBFbnRyeUl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIG1FbmQ7IH0KKworcHJpdmF0ZToKKyAgICBTbmFwc2hvdCgpID0gZGVmYXVsdDsKKyAgICBleHBsaWNpdCBTbmFwc2hvdChzaXplX3QgYnVmZmVyU2l6ZSkgOiBtRGF0YShuZXcgdWludDhfdFtidWZmZXJTaXplXSkge30KKyAgICBmcmllbmQgc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PiBSZWFkZXI6OmdldFNuYXBzaG90KGJvb2wgZmx1c2gpOworCisgICAgdWludDhfdCAqIGNvbnN0ICAgICAgIG1EYXRhID0gbnVsbHB0cjsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgbUxvc3QgPSAwOworICAgIEVudHJ5SXRlcmF0b3IgICAgICAgICBtQmVnaW47CisgICAgRW50cnlJdGVyYXRvciAgICAgICAgIG1FbmQ7Cit9OworCisvLyBUT0RPIG1vdmUgdGhpcyB0byBNZWRpYUxvZ1NlcnZpY2U/CitjbGFzcyBEdW1wUmVhZGVyIDogcHVibGljIE5CTG9nOjpSZWFkZXIgeworcHVibGljOgorICAgIER1bXBSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSwgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpCisgICAgICAgIDogUmVhZGVyKHNoYXJlZCwgc2l6ZSwgbmFtZSkge30KKyAgICBEdW1wUmVhZGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSwgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpCisgICAgICAgIDogUmVhZGVyKGlNZW1vcnksIHNpemUsIG5hbWUpIHt9CisgICAgdm9pZCBkdW1wKGludCBmZCwgc2l6ZV90IGluZGVudCA9IDApOworcHJpdmF0ZToKKyAgICB2b2lkIGhhbmRsZUF1dGhvcihjb25zdCBBYnN0cmFjdEVudHJ5JiBmbXRFbnRyeSBfX3VudXNlZCwgU3RyaW5nOCogYm9keSBfX3VudXNlZCkge30KKyAgICBFbnRyeUl0ZXJhdG9yIGhhbmRsZUZvcm1hdChjb25zdCBGb3JtYXRFbnRyeSAmZm10RW50cnksIFN0cmluZzggKnRpbWVzdGFtcCwgU3RyaW5nOCAqYm9keSk7CisKKyAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRJbnQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSk7CisgICAgc3RhdGljIHZvaWQgICAgYXBwZW5kRmxvYXQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSk7CisgICAgc3RhdGljIHZvaWQgICAgYXBwZW5kUElEKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpOworICAgIHN0YXRpYyB2b2lkICAgIGFwcGVuZFRpbWVzdGFtcChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKTsKKworICAgIC8vIFRoZSBidWZmZXJEdW1wIGZ1bmN0aW9ucyBhcmUgdXNlZCBmb3IgZGVidWdnaW5nIG9ubHkuCisgICAgc3RhdGljIFN0cmluZzggYnVmZmVyRHVtcChjb25zdCB1aW50OF90ICpidWZmZXIsIHNpemVfdCBzaXplKTsKKyAgICBzdGF0aWMgU3RyaW5nOCBidWZmZXJEdW1wKGNvbnN0IEVudHJ5SXRlcmF0b3IgJml0KTsKK307CisKK30gICAvLyBuYW1lc3BhY2UgTkJMb2cKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfTkJMT0dfUkVBREVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaCBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaAppbmRleCBlYzA4NDJmLi42NGE1NzAxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmgKKysrIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oCkBAIC0yMiwxOSArMjIsMzMgQEAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gVGhlIFN0cmluZzggY2xhc3MgaXMgdXNlZCBieSByZXBvcnRQZXJmb3JtYW5jZSBmdW5jdGlvbgotY2xhc3MgU3RyaW5nODsKLQogbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlIHsKIAorc3RydWN0IFBlcmZvcm1hbmNlRGF0YTsKKworLy8gRHVtcHMgcGVyZm9ybWFuY2UgZGF0YSBpbiBhIEpTT04gZm9ybWF0Lgordm9pZCBkdW1wSnNvbihpbnQgZmQsIGNvbnN0IHN0ZDo6bWFwPGludCwgUGVyZm9ybWFuY2VEYXRhPiYgdGhyZWFkRGF0YU1hcCk7CisKKy8vRHVtcHMgcGVyZm9ybWFuY2UgZGF0YSBhcyB2aXN1YWxpemVkIHBsb3RzLgordm9pZCBkdW1wUGxvdHMoaW50IGZkLCBjb25zdCBzdGQ6Om1hcDxpbnQsIFBlcmZvcm1hbmNlRGF0YT4mIHRocmVhZERhdGFNYXApOworCisvLyBEdW1wcyBzbmFwc2hvdHMgYXQgaW1wb3J0YW50IGV2ZW50cyBpbiB0aGUgcGFzdC4KK3ZvaWQgZHVtcFJldHJvKGludCBmZCwgY29uc3Qgc3RkOjptYXA8aW50LCBQZXJmb3JtYW5jZURhdGE+JiB0aHJlYWREYXRhTWFwKTsKKworLy8gU2VuZCBvbmUgdGhyZWFkJ3MgZGF0YSB0byBtZWRpYSBtZXRyaWNzLCBpZiB0aGUgcGVyZm9ybWFuY2UgZGF0YSBpcyBub250cml2aWFsIChpLmUuIG5vdAorLy8gYWxsIHplcm8gdmFsdWVzKS4gUmV0dXJuIHRydWUgaWYgZGF0YSB3YXMgc2VudCwgZmFsc2UgaWYgdGhlcmUgaXMgbm90aGluZyB0byB3cml0ZQorLy8gb3IgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgd3JpdGluZy4KK2Jvb2wgc2VuZFRvTWVkaWFNZXRyaWNzKGNvbnN0IFBlcmZvcm1hbmNlRGF0YSYgZGF0YSk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIGNvbnN0ZXhwciBpbnQga01zUGVyU2VjID0gMTAwMDsKIGNvbnN0ZXhwciBpbnQga1NlY1Blck1pbiA9IDYwOwogCiBjb25zdGV4cHIgaW50IGtKaWZmeVBlck1zID0gMTA7IC8vIHRpbWUgdW5pdCBmb3IgaGlzdG9ncmFtIGFzIGEgbXVsdGlwbGUgb2YgbWlsbGlzZWNvbmRzCiAKIC8vIHN0b3JlcyBhIGhpc3RvZ3JhbToga2V5OiBvYnNlcnZlZCBidWZmZXIgcGVyaW9kIChtdWx0aXBsZSBvZiBqaWZmeSkuIHZhbHVlOiBjb3VudAotdXNpbmcgSGlzdG9ncmFtID0gc3RkOjptYXA8aW50LCBpbnQ+OwordXNpbmcgSGlzdCA9IHN0ZDo6bWFwPGludCwgaW50PjsKIAogdXNpbmcgbXNJbnRlcnZhbCA9IGRvdWJsZTsKIHVzaW5nIGppZmZ5SW50ZXJ2YWwgPSBkb3VibGU7CkBAIC01NywxMyArNzEsMTIgQEAKIH0KIAogLy8gV3JpdGVzIG91dGxpZXIgaW50ZXJ2YWxzLCB0aW1lc3RhbXBzLCBwZWFrcyB0aW1lc3RhbXBzLCBhbmQgaGlzdG9ncmFtcyB0byBhIGZpbGUuCi12b2lkIHdyaXRlVG9GaWxlKGNvbnN0IHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdG9ncmFtPj4gJmhpc3RzLAordm9pZCB3cml0ZVRvRmlsZShjb25zdCBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjx0aW1lc3RhbXAsIEhpc3Q+PiAmaGlzdHMsCiAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPG1zSW50ZXJ2YWwsIHRpbWVzdGFtcD4+ICZvdXRsaWVyRGF0YSwKICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpkZXF1ZTx0aW1lc3RhbXA+ICZwZWFrVGltZXN0YW1wcywKICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGtEaXJlY3RvcnksIGJvb2wgYXBwZW5kLCBpbnQgYXV0aG9yLCBsb2dfaGFzaF90IGhhc2gpOwogCi19IC8vIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZQotCit9ICAgLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCiB9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1JFUE9SVFBFUkZPUk1BTkNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvVGltZWxpbmUuaCBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvVGltZWxpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGYwY2ZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9UaW1lbGluZS5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfTkJMT0dfVElNRUxJTkVfSAorI2RlZmluZSBBTkRST0lEX01FRElBX05CTE9HX1RJTUVMSU5FX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZmlmb19pbmRleC5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIE5CTG9nIHsKKworLy8gTG9jYXRlZCBpbiBzaGFyZWQgbWVtb3J5LCBtdXN0IGJlIFBPRC4KKy8vIEV4YWN0bHkgb25lIHByb2Nlc3MgbXVzdCBleHBsaWNpdGx5IGNhbGwgdGhlIGNvbnN0cnVjdG9yIG9yIHVzZSBwbGFjZW1lbnQgbmV3LgorLy8gU2luY2UgdGhpcyBpcyBhIFBPRCwgdGhlIGRlc3RydWN0b3IgaXMgZW1wdHkgYW5kIHVubmVjZXNzYXJ5IHRvIGNhbGwgaXQgZXhwbGljaXRseS4KK3N0cnVjdCBTaGFyZWQgeworICAgIFNoYXJlZCgpIC8qIG1SZWFyIGluaXRpYWxpemVkIHZpYSBkZWZhdWx0IGNvbnN0cnVjdG9yICovIHt9CisgICAgflNoYXJlZCgpIHt9CisKKyAgICBhdWRpb191dGlsc19maWZvX2luZGV4ICBtUmVhcjsgIC8vIGluZGV4IG9uZSBieXRlIHBhc3QgdGhlIGVuZCBvZiBtb3N0IHJlY2VudCBFbnRyeQorICAgIGNoYXIgICAgbUJ1ZmZlclswXTsgICAgICAgICAgICAgLy8gY2lyY3VsYXIgYnVmZmVyIGZvciBlbnRyaWVzCit9OworCisvLyBGSVhNRSBUaW1lbGluZSB3YXMgaW50ZW5kZWQgdG8gd3JhcCBXcml0ZXIgYW5kIFJlYWRlciwgYnV0IGlzbid0IGFjdHVhbGx5IHVzZWQgeWV0LgorLy8gRm9yIG5vdyBpdCBpcyBqdXN0IGEgbmFtZXNwYWNlIGZvciBzaGFyZWRTaXplKCkuCitjbGFzcyBUaW1lbGluZSA6IHB1YmxpYyBSZWZCYXNlIHsKK3B1YmxpYzoKKyNpZiAwCisgICAgVGltZWxpbmUoc2l6ZV90IHNpemUsIHZvaWQgKnNoYXJlZCA9IE5VTEwpOworICAgIHZpcnR1YWwgflRpbWVsaW5lKCk7CisjZW5kaWYKKworICAgIC8vIElucHV0IHBhcmFtZXRlciAnc2l6ZScgaXMgdGhlIGRlc2lyZWQgc2l6ZSBvZiB0aGUgdGltZWxpbmUgaW4gYnl0ZSB1bml0cy4KKyAgICAvLyBSZXR1cm5zIHRoZSBzaXplIHJvdW5kZWQgdXAgdG8gYSBwb3dlci1vZi0yLCBwbHVzIHRoZSBjb25zdGFudCBzaXplIG92ZXJoZWFkIGZvciBpbmRpY2VzLgorICAgIHN0YXRpYyBzaXplX3Qgc2hhcmVkU2l6ZShzaXplX3Qgc2l6ZSk7CisKKyNpZiAwCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyAgICBXcml0ZXI7CisgICAgZnJpZW5kIGNsYXNzICAgIFJlYWRlcjsKKworICAgIGNvbnN0IHNpemVfdCAgICBtU2l6ZTsgICAgICAvLyBjaXJjdWxhciBidWZmZXIgc2l6ZSBpbiBieXRlcywgbXVzdCBiZSBhIHBvd2VyIG9mIDIKKyAgICBib29sICAgICAgICAgICAgbU93bjsgICAgICAgLy8gd2hldGhlciBJIG93biB0aGUgbWVtb3J5IGF0IG1TaGFyZWQKKyAgICBTaGFyZWQqIGNvbnN0ICAgbVNoYXJlZDsgICAgLy8gcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5CisjZW5kaWYKK307CisKK30gICAvLyBuYW1lc3BhY2UgTkJMb2cKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfTkJMT0dfVElNRUxJTkVfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9Xcml0ZXIuaCBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvV3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZjZDM5NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvV3JpdGVyLmgKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfTkJMT0dfV1JJVEVSX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9OQkxPR19XUklURVJfSAorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0V2ZW50cy5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCitjbGFzcyBhdWRpb191dGlsc19maWZvOworY2xhc3MgYXVkaW9fdXRpbHNfZmlmb193cml0ZXI7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSU1lbW9yeTsKKworbmFtZXNwYWNlIE5CTG9nIHsKKworY2xhc3MgRW50cnk7CitzdHJ1Y3QgU2hhcmVkOworCisvLyBOQkxvZyBXcml0ZXIgSW50ZXJmYWNlCisKKy8vIFdyaXRlciBpcyB0aHJlYWQtc2FmZSB3aXRoIHJlc3BlY3QgdG8gUmVhZGVyLCBidXQgbm90IHdpdGggcmVzcGVjdCB0byBtdWx0aXBsZSB0aHJlYWRzCisvLyBjYWxsaW5nIFdyaXRlciBtZXRob2RzLiAgSWYgeW91IG5lZWQgbXVsdGktdGhyZWFkIHNhZmV0eSBmb3Igd3JpdGluZywgdXNlIExvY2tlZFdyaXRlci4KK2NsYXNzIFdyaXRlciA6IHB1YmxpYyBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICBXcml0ZXIoKSA9IGRlZmF1bHQ7ICAgICAgICAgLy8gZHVtbXkgbm9wIGltcGxlbWVudGF0aW9uIHdpdGhvdXQgc2hhcmVkIG1lbW9yeQorCisgICAgLy8gSW5wdXQgcGFyYW1ldGVyICdzaXplJyBpcyB0aGUgZGVzaXJlZCBzaXplIG9mIHRoZSB0aW1lbGluZSBpbiBieXRlIHVuaXRzLgorICAgIC8vIFRoZSBzaXplIG9mIHRoZSBzaGFyZWQgbWVtb3J5IG11c3QgYmUgYXQgbGVhc3QgVGltZWxpbmU6OnNoYXJlZFNpemUoc2l6ZSkuCisgICAgV3JpdGVyKHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOworICAgIFdyaXRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUpOworCisgICAgfldyaXRlcigpIG92ZXJyaWRlOworCisgICAgLy8gRklYTUUgbmVlZHMgY29tbWVudHMsIGFuZCBzb21lIHNob3VsZCBiZSBwcml2YXRlCisgICAgdm9pZCAgICBsb2coY29uc3QgY2hhciAqc3RyaW5nKTsKKyAgICB2b2lkICAgIGxvZ2YoY29uc3QgY2hhciAqZm10LCAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKKyAgICB2b2lkICAgIGxvZ1RpbWVzdGFtcCgpOworICAgIHZvaWQgICAgbG9nRm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgbG9nX2hhc2hfdCBoYXNoLCAuLi4pOworICAgIHZvaWQgICAgbG9nRXZlbnRIaXN0VHMoRXZlbnQgZXZlbnQsIGxvZ19oYXNoX3QgaGFzaCk7CisKKyAgICAvLyBMb2cgZGF0YSByZWxhdGVkIHRvIEV2ZW50IEUuIFNlZSB0aGUgZXZlbnQtdG8tdHlwZSBtYXBwaW5nIGZvciB0aGUgdHlwZSBvZiBkYXRhCisgICAgLy8gY29ycmVzcG9uZGluZyB0byB0aGUgZXZlbnQuIEZvciBleGFtcGxlLCBpZiB5b3Ugc2VlIGEgbWFwcGluZyBzdGF0ZW1lbnQ6CisgICAgLy8gICAgIE1BUF9UWVBFX1RPX0VWRU5UKEUsIFQpOworICAgIC8vIHRoZW4gdGhlIHVzYWdlIG9mIHRoaXMgbWV0aG9kIHdvdWxkIGJlOgorICAgIC8vICAgICBUIGRhdGEgPSBkb0NvbXB1dGF0aW9uKCk7CisgICAgLy8gICAgIHRsTkJMb2dXcml0ZXItPmxvZzxOQkxvZzo6RT4oZGF0YSk7CisgICAgdGVtcGxhdGU8RXZlbnQgRT4KKyAgICB2b2lkICAgIGxvZyh0eXBlbmFtZSBnZXRfbWFwcGVkPEU+Ojp0eXBlIGRhdGEpIHsKKyAgICAgICAgbG9nKEUsICZkYXRhLCBzaXplb2YoZGF0YSkpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCAgICBpc0VuYWJsZWQoKSBjb25zdDsKKworICAgIC8vIHJldHVybiB2YWx1ZSBmb3IgYWxsIG9mIHRoZXNlIGlzIHRoZSBwcmV2aW91cyBpc0VuYWJsZWQoKQorICAgIHZpcnR1YWwgYm9vbCAgICBzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCk7ICAgLy8gYnV0IHdvbid0IGVuYWJsZSBpZiBubyBzaGFyZWQgbWVtb3J5CisgICAgYm9vbCAgICAgICAgICAgIGVuYWJsZSgpICB7IHJldHVybiBzZXRFbmFibGVkKHRydWUpOyB9CisgICAgYm9vbCAgICAgICAgICAgIGRpc2FibGUoKSB7IHJldHVybiBzZXRFbmFibGVkKGZhbHNlKTsgfQorCisgICAgc3A8SU1lbW9yeT4gICAgIGdldElNZW1vcnkoKSBjb25zdCB7IHJldHVybiBtSU1lbW9yeTsgfQorCisgICAgLy8gUHVibGljIGxvZ2dpbmcgZnVuY3Rpb24gaW1wbGVtZW50YXRpb25zIHNob3VsZCBhbHdheXMgdXNlIG9uZSBvZiB0aGUKKyAgICAvLyB0d28gbG9nKCkgZnVuY3Rpb24gY2FsbHMgYmVsb3cgdG8gd3JpdGUgdG8gc2hhcmVkIG1lbW9yeS4KK3Byb3RlY3RlZDoKKyAgICAvLyBXcml0ZXMgYSBzaW5nbGUgRW50cnkgdG8gdGhlIEZJRk8gaWYgdGhlIHdyaXRlciBpcyBlbmFibGVkLgorICAgIC8vIFRoaXMgaXMgcHJvdGVjdGVkIGFuZCB2aXJ0dWFsIGJlY2F1c2UgTG9ja2VkV3JpdGVyIHVzZXMgYSBsb2NrIHRvIHByb3RlY3QKKyAgICAvLyB3cml0aW5nIHRvIHRoZSBGSUZPIGJlZm9yZSB3cml0aW5nIHRvIHRoaXMgZnVuY3Rpb24uCisgICAgdmlydHVhbCB2b2lkIGxvZyhjb25zdCBFbnRyeSAmZW50cnksIGJvb2wgdHJ1c3RlZCA9IGZhbHNlKTsKKworcHJpdmF0ZToKKyAgICAvLyAwIDw9IGxlbmd0aCA8PSBrTWF4TGVuZ3RoCisgICAgLy8gTG9nIGEgc2luZ2xlIEVudHJ5IHdpdGggY29ycmVzcG9uZGluZyBldmVudCwgZGF0YSwgYW5kIGxlbmd0aC4KKyAgICB2b2lkICAgIGxvZyhFdmVudCBldmVudCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7CisKKyAgICB2b2lkICAgIGxvZ3ZmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCk7CisKKyAgICAvLyBoZWxwZXIgZnVuY3Rpb25zIGZvciBsb2dnaW5nIHBhcnRzIG9mIGEgZm9ybWF0dGVkIGVudHJ5CisgICAgdm9pZCAgICBsb2dTdGFydChjb25zdCBjaGFyICpmbXQpOworICAgIHZvaWQgICAgbG9nVGltZXN0YW1wRm9ybWF0KCk7CisgICAgdm9pZCAgICBsb2dWRm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgbG9nX2hhc2hfdCBoYXNoLCB2YV9saXN0IGFwKTsKKworICAgIFNoYXJlZCogY29uc3QgICBtU2hhcmVke307ICAgICAgICAgIC8vIHJhdyBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnkKKyAgICBzcDxJTWVtb3J5PiAgICAgbUlNZW1vcnl7fTsgICAgICAgICAvLyByZWYtY291bnRlZCB2ZXJzaW9uLCBpbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGVuIGNvbnN0CisgICAgYXVkaW9fdXRpbHNfZmlmbyAqIGNvbnN0IG1GaWZve307ICAgICAgICAgICAgICAgLy8gRklGTyBpdHNlbGYsIG5vbi1OVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5sZXNzIGNvbnN0cnVjdG9yIGZhaWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgZHVtbXkgY29uc3RydWN0b3IgdXNlZAorICAgIGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyICogY29uc3QgbUZpZm9Xcml0ZXJ7fTsgIC8vIHVzZWQgdG8gd3JpdGUgdG8gRklGTywgbm9uLU5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmxlc3MgZHVtbXkgY29uc3RydWN0b3IgdXNlZAorICAgIGJvb2wgICAgICAgICAgICBtRW5hYmxlZCA9IGZhbHNlOyAgIC8vIHdoZXRoZXIgdG8gYWN0dWFsbHkgbG9nCisKKyAgICAvLyBjYWNoZWQgcGlkIGFuZCBwcm9jZXNzIG5hbWUgdG8gdXNlIGluICVwIGZvcm1hdCBzcGVjaWZpZXIKKyAgICAvLyB0b3RhbCB0YWcgbGVuZ3RoIGlzIG1QaWRUYWdTaXplIGFuZCBwcm9jZXNzIG5hbWUgaXMgbm90IHplcm8gdGVybWluYXRlZAorICAgIGNoYXIgICAqbVBpZFRhZ3t9OworICAgIHNpemVfdCAgbVBpZFRhZ1NpemUgPSAwOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFNpbWlsYXIgdG8gV3JpdGVyLCBidXQgc2FmZSBmb3IgbXVsdGlwbGUgdGhyZWFkcyB0byBjYWxsIGNvbmN1cnJlbnRseQorY2xhc3MgTG9ja2VkV3JpdGVyIDogcHVibGljIFdyaXRlciB7CitwdWJsaWM6CisgICAgTG9ja2VkV3JpdGVyKCkgPSBkZWZhdWx0OworICAgIExvY2tlZFdyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKTsKKworICAgIGJvb2wgICAgaXNFbmFibGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbCAgICBzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgLy8gTG9jayBuZWVkcyB0byBiZSBvYnRhaW5lZCBiZWZvcmUgd3JpdGluZyB0byBGSUZPLgorICAgIHZvaWQgbG9nKGNvbnN0IEVudHJ5ICZlbnRyeSwgYm9vbCB0cnVzdGVkID0gZmFsc2UpIG92ZXJyaWRlOworCisgICAgbXV0YWJsZSBNdXRleCAgIG1Mb2NrOworfTsKKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9OQkxPR19XUklURVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FBQ1dyaXRlci5jcHAKaW5kZXggMmVhNWZjZC4uZTE3Mzk3NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNXcml0ZXIuY3BwCkBAIC04NSw3ICs4NSw3IEBACiAgICAgQ0hFQ0soIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSk7CiAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZtQ2hhbm5lbENvdW50KSk7CiAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmbVNhbXBsZVJhdGUpKTsKLSAgICBDSEVDSyhtQ2hhbm5lbENvdW50ID49IDEgJiYgbUNoYW5uZWxDb3VudCA8PSAyKTsKKyAgICBDSEVDSyhtQ2hhbm5lbENvdW50ID49IDEgJiYgbUNoYW5uZWxDb3VudCA8PSA3KTsKIAogICAgIC8vIE9wdGlvbmFsbHksIHdlIHdhbnQgdG8gY2hlY2sgd2hldGhlciBBQUNQcm9maWxlIGlzIGFsc28gc2V0LgogICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUFBQ1Byb2ZpbGUsICZtQUFDUHJvZmlsZSkpIHsKQEAgLTE1NCwxMSArMTU0LDExIEBACiAgICAgbURvbmUgPSB0cnVlOwogCiAgICAgdm9pZCAqZHVtbXk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVNvdXJjZS0+c3RvcCgpOwogICAgIHB0aHJlYWRfam9pbihtVGhyZWFkLCAmZHVtbXkpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihkdW1teSkpOwogICAgIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVNvdXJjZS0+c3RvcCgpOwogICAgICAgICBpZiAoZXJyID09IE9LICYmCiAgICAgICAgICAgICAoc3RhdHVzICE9IE9LICYmIHN0YXR1cyAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSkgewogICAgICAgICAgICAgZXJyID0gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKaW5kZXggN2YzOWQxMC4uM2Q2N2M5MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCkBAIC0zNyw2ICszNyw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9CdWZmZXJQcm9kdWNlcldyYXBwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1BlcnNpc3RlbnRTdXJmYWNlLmg+CkBAIC0xNzEsMTEgKzE3Miw3IEBACiB9CiAKIHN0cnVjdCBDb2RlY09ic2VydmVyIDogcHVibGljIEJuT01YT2JzZXJ2ZXIgewotICAgIENvZGVjT2JzZXJ2ZXIoKSB7fQotCi0gICAgdm9pZCBzZXROb3RpZmljYXRpb25NZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgICAgIG1Ob3RpZnkgPSBtc2c7Ci0gICAgfQorICAgIGV4cGxpY2l0IENvZGVjT2JzZXJ2ZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIDogbU5vdGlmeShtc2cpIHt9CiAKICAgICAvLyBmcm9tIElPTVhPYnNlcnZlcgogICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VzKGNvbnN0IHN0ZDo6bGlzdDxvbXhfbWVzc2FnZT4gJm1lc3NhZ2VzKSB7CkBAIC0yNTEsNyArMjQ4LDcgQEAKICAgICB2aXJ0dWFsIH5Db2RlY09ic2VydmVyKCkge30KIAogcHJpdmF0ZToKLSAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKKyAgICBjb25zdCBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENvZGVjT2JzZXJ2ZXIpOwogfTsKQEAgLTU2NiwxNiArNTYzLDE2IEBACiAgICAgICBtRGVxdWV1ZUNvdW50ZXIoMCksCiAgICAgICBtTWV0YWRhdGFCdWZmZXJzVG9TdWJtaXQoMCksCiAgICAgICBtTnVtVW5kZXF1ZXVlZEJ1ZmZlcnMoMCksCi0gICAgICBtUmVwZWF0RnJhbWVEZWxheVVzKC0xbGwpLAotICAgICAgbU1heFB0c0dhcFVzKDBsbCksCisgICAgICBtUmVwZWF0RnJhbWVEZWxheVVzKC0xTEwpLAorICAgICAgbU1heFB0c0dhcFVzKDBMTCksCiAgICAgICBtTWF4RnBzKC0xKSwKICAgICAgIG1GcHMoLTEuMCksCiAgICAgICBtQ2FwdHVyZUZwcygtMS4wKSwKICAgICAgIG1DcmVhdGVJbnB1dEJ1ZmZlcnNTdXNwZW5kZWQoZmFsc2UpLAotICAgICAgbUxhdGVuY3koMCksCiAgICAgICBtVHVubmVsZWQoZmFsc2UpLAogICAgICAgbURlc2NyaWJlQ29sb3JBc3BlY3RzSW5kZXgoKE9NWF9JTkRFWFRZUEUpMCksCiAgICAgICBtRGVzY3JpYmVIRFJTdGF0aWNJbmZvSW5kZXgoKE9NWF9JTkRFWFRZUEUpMCksCisgICAgICBtRGVzY3JpYmVIRFIxMFBsdXNJbmZvSW5kZXgoKE9NWF9JTkRFWFRZUEUpMCksCiAgICAgICBtU3RhdGVHZW5lcmF0aW9uKDApLAogICAgICAgbVZlbmRvckV4dGVuc2lvbnNTdGF0dXMoa0V4dGVuc2lvbnNVbmNoZWNrZWQpIHsKICAgICBtZW1zZXQoJm1MYXN0SERSU3RhdGljSW5mbywgMCwgc2l6ZW9mKG1MYXN0SERSU3RhdGljSW5mbykpOwpAQCAtNzgzLDYgKzc4MCw5IEBACiAgICAgLy8gbmVlZCB0byBlbmFibGUgYWxsb2NhdGlvbiB3aGVuIGF0dGFjaGluZwogICAgIHN1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKS0+YWxsb3dBbGxvY2F0aW9uKHRydWUpOwogCisgICAgLy8gZGVxdWV1ZUJ1ZmZlciBjYW5ub3QgdGltZSBvdXQKKyAgICBzdXJmYWNlLT5zZXREZXF1ZXVlVGltZW91dCgtMSk7CisKICAgICAvLyBmb3IgbWV0YSBkYXRhIG1vZGUsIHdlIG1vdmUgZGVxdWV1ZCBidWZmZXJzIHRvIHRoZSBuZXcgc3VyZmFjZS4KICAgICAvLyBmb3Igbm9uLW1ldGEgbW9kZSwgd2UgbXVzdCBtb3ZlIGFsbCByZWdpc3RlcmVkIGJ1ZmZlcnMKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKQEAgLTExMzgsNiArMTEzOCw4IEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCisgICAgc3RhdGljX2Nhc3Q8U3VyZmFjZSAqPihtTmF0aXZlV2luZG93LmdldCgpKS0+c2V0RGVxdWV1ZVRpbWVvdXQoLTEpOworCiAgICAgLy8gRXhpdHMgaGVyZSBmb3IgdHVubmVsZWQgdmlkZW8gcGxheWJhY2sgY29kZWNzIC0tIGkuZS4gc2tpcHMgbmF0aXZlIHdpbmRvdwogICAgIC8vIGJ1ZmZlciBhbGxvY2F0aW9uIHN0ZXAgYXMgdGhpcyBpcyBtYW5hZ2VkIGJ5IHRoZSB0dW5uZWxlZCBPTVggb21wb25lbnQKICAgICAvLyBpdHNlbGYgYW5kIGV4cGxpY2l0bHkgc2V0cyBkZWYubkJ1ZmZlckNvdW50QWN0dWFsIHRvIDAuCkBAIC0xMjQ3LDYgKzEyNDksNyBAQAogICAgICAgICBpbmZvLm1SZW5kZXJJbmZvID0gTlVMTDsKICAgICAgICAgaW5mby5tR3JhcGhpY0J1ZmZlciA9IGdyYXBoaWNCdWZmZXI7CiAgICAgICAgIGluZm8ubU5ld0dyYXBoaWNCdWZmZXIgPSBmYWxzZTsKKyAgICAgICAgaW5mby5tRGVxdWV1ZWRBdCA9IG1EZXF1ZXVlQ291bnRlcjsKIAogICAgICAgICAvLyBUT0RPOiBXZSBzaG91bG4ndCBuZWVkIHRvIGNyZWF0ZSBNZWRpYUNvZGVjQnVmZmVyLiBJbiBtZXRhZGF0YSBtb2RlCiAgICAgICAgIC8vICAgICAgIE9NWCBkb2Vzbid0IHVzZSB0aGUgc2hhcmVkIG1lbW9yeSBidWZmZXIsIGJ1dCBzb21lIGNvZGUgc3RpbGwKQEAgLTE2MTksNyArMTYyMiw3IEBACiAgICAgICAgICAgICBpZiAocG9ydEluZGV4ID09IGtQb3J0SW5kZXhPdXRwdXQgJiYgbU5hdGl2ZVdpbmRvdyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgKHZvaWQpY2FuY2VsQnVmZmVyVG9OYXRpdmVXaW5kb3coaW5mbyk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogCiAgICAgICAgIGNhc2UgQnVmZmVySW5mbzo6T1dORURfQllfTkFUSVZFX1dJTkRPVzoKICAgICAgICAgICAgIGVyciA9IG1PTVhOb2RlLT5mcmVlQnVmZmVyKHBvcnRJbmRleCwgaW5mby0+bUJ1ZmZlcklEKTsKQEAgLTE3NDgsMzQgKzE3NTEsMzcgQEAKICAgICB9CiAKICAgICBpbnQzMl90IHN0b3JlTWV0YTsKLSAgICBpZiAoZW5jb2RlcgotICAgICAgICAgICAgJiYgbXNnLT5maW5kSW50MzIoImFuZHJvaWQuX2lucHV0LW1ldGFkYXRhLWJ1ZmZlci10eXBlIiwgJnN0b3JlTWV0YSkKLSAgICAgICAgICAgICYmIHN0b3JlTWV0YSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZCkgewotICAgICAgICBJT01YOjpQb3J0TW9kZSBtb2RlOwotICAgICAgICBpZiAoc3RvcmVNZXRhID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVOYXRpdmVIYW5kbGVTb3VyY2UpIHsKLSAgICAgICAgICAgIG1vZGUgPSBJT01YOjprUG9ydE1vZGVEeW5hbWljTmF0aXZlSGFuZGxlOwotICAgICAgICB9IGVsc2UgaWYgKHN0b3JlTWV0YSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyIHx8Ci0gICAgICAgICAgICAgICAgc3RvcmVNZXRhID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlKSB7Ci0gICAgICAgICAgICBtb2RlID0gSU9NWDo6a1BvcnRNb2RlRHluYW1pY0FOV0J1ZmZlcjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgaWYgKGVuY29kZXIpIHsKKyAgICAgICAgSU9NWDo6UG9ydE1vZGUgbW9kZSA9IElPTVg6OmtQb3J0TW9kZVByZXNldEJ5dGVCdWZmZXI7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiYW5kcm9pZC5faW5wdXQtbWV0YWRhdGEtYnVmZmVyLXR5cGUiLCAmc3RvcmVNZXRhKQorICAgICAgICAgICAgICAgICYmIHN0b3JlTWV0YSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZCkgeworICAgICAgICAgICAgaWYgKHN0b3JlTWV0YSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlTmF0aXZlSGFuZGxlU291cmNlKSB7CisgICAgICAgICAgICAgICAgbW9kZSA9IElPTVg6OmtQb3J0TW9kZUR5bmFtaWNOYXRpdmVIYW5kbGU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0b3JlTWV0YSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyIHx8CisgICAgICAgICAgICAgICAgICAgIHN0b3JlTWV0YSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlR3JhbGxvY1NvdXJjZSkgeworICAgICAgICAgICAgICAgIG1vZGUgPSBJT01YOjprUG9ydE1vZGVEeW5hbWljQU5XQnVmZmVyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGVyciA9IHNldFBvcnRNb2RlKGtQb3J0SW5kZXhJbnB1dCwgbW9kZSk7CiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KIAotICAgICAgICB1aW50MzJfdCB1c2FnZUJpdHM7Ci0gICAgICAgIGlmIChtT01YTm9kZS0+Z2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQ29uc3VtZXJVc2FnZUJpdHMsCi0gICAgICAgICAgICAgICAgJnVzYWdlQml0cywgc2l6ZW9mKHVzYWdlQml0cykpID09IE9LKSB7Ci0gICAgICAgICAgICBpbnB1dEZvcm1hdC0+c2V0SW50MzIoCi0gICAgICAgICAgICAgICAgICAgICJ1c2luZy1zdy1yZWFkLW9mdGVuIiwgISEodXNhZ2VCaXRzICYgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOKSk7CisgICAgICAgIGlmIChtb2RlICE9IElPTVg6OmtQb3J0TW9kZVByZXNldEJ5dGVCdWZmZXIpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHVzYWdlQml0czsKKyAgICAgICAgICAgIGlmIChtT01YTm9kZS0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUNvbnN1bWVyVXNhZ2VCaXRzLAorICAgICAgICAgICAgICAgICAgICAmdXNhZ2VCaXRzLCBzaXplb2YodXNhZ2VCaXRzKSkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBpbnB1dEZvcm1hdC0+c2V0SW50MzIoCisgICAgICAgICAgICAgICAgICAgICAgICAidXNpbmctc3ctcmVhZC1vZnRlbiIsICEhKHVzYWdlQml0cyAmIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTikpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgaW50MzJfdCBwcmVwZW5kU1BTUFBTID0gMDsKLSAgICBpZiAoZW5jb2RlcgorICAgIGlmIChlbmNvZGVyICYmIG1Jc1ZpZGVvCiAgICAgICAgICAgICAmJiBtc2ctPmZpbmRJbnQzMigicHJlcGVuZC1zcHMtcHBzLXRvLWlkci1mcmFtZXMiLCAmcHJlcGVuZFNQU1BQUykKICAgICAgICAgICAgICYmIHByZXBlbmRTUFNQUFMgIT0gMCkgewogICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4OwpAQCAtMTgxNiwyNSArMTgyMiwyNCBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgInJlcGVhdC1wcmV2aW91cy1mcmFtZS1hZnRlciIsCi0gICAgICAgICAgICAgICAgICAgICZtUmVwZWF0RnJhbWVEZWxheVVzKSkgewotICAgICAgICAgICAgbVJlcGVhdEZyYW1lRGVsYXlVcyA9IC0xbGw7CisgICAgICAgICAgICAgICAgS0VZX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9BRlRFUiwgJm1SZXBlYXRGcmFtZURlbGF5VXMpKSB7CisgICAgICAgICAgICBtUmVwZWF0RnJhbWVEZWxheVVzID0gLTFMTDsKICAgICAgICAgfQogCiAgICAgICAgIC8vIG9ubHkgYWxsb3cgMzItYml0IHZhbHVlLCBzaW5jZSB3ZSBwYXNzIGl0IGFzIFUzMiB0byBPTVguCi0gICAgICAgIGlmICghbXNnLT5maW5kSW50NjQoIm1heC1wdHMtZ2FwLXRvLWVuY29kZXIiLCAmbU1heFB0c0dhcFVzKSkgewotICAgICAgICAgICAgbU1heFB0c0dhcFVzID0gMGxsOworICAgICAgICBpZiAoIW1zZy0+ZmluZEludDY0KEtFWV9NQVhfUFRTX0dBUF9UT19FTkNPREVSLCAmbU1heFB0c0dhcFVzKSkgeworICAgICAgICAgICAgbU1heFB0c0dhcFVzID0gMExMOwogICAgICAgICB9IGVsc2UgaWYgKG1NYXhQdHNHYXBVcyA+IElOVDMyX01BWCB8fCBtTWF4UHRzR2FwVXMgPCBJTlQzMl9NSU4pIHsKICAgICAgICAgICAgIEFMT0dXKCJVbnN1cHBvcnRlZCB2YWx1ZSBmb3IgbWF4IHB0cyBnYXAgJWxsZCIsIChsb25nIGxvbmcpIG1NYXhQdHNHYXBVcyk7Ci0gICAgICAgICAgICBtTWF4UHRzR2FwVXMgPSAwbGw7CisgICAgICAgICAgICBtTWF4UHRzR2FwVXMgPSAwTEw7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIW1zZy0+ZmluZEZsb2F0KCJtYXgtZnBzLXRvLWVuY29kZXIiLCAmbU1heEZwcykpIHsKKyAgICAgICAgaWYgKCFtc2ctPmZpbmRGbG9hdChLRVlfTUFYX0ZQU19UT19FTkNPREVSLCAmbU1heEZwcykpIHsKICAgICAgICAgICAgIG1NYXhGcHMgPSAtMTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIG5vdGlmeSBHcmFwaGljQnVmZmVyU291cmNlIHRvIGFsbG93IGJhY2t3YXJkIGZyYW1lcwotICAgICAgICBpZiAobU1heFB0c0dhcFVzIDwgMGxsKSB7CisgICAgICAgIGlmIChtTWF4UHRzR2FwVXMgPCAwTEwpIHsKICAgICAgICAgICAgIG1NYXhGcHMgPSAtMTsKICAgICAgICAgfQogCkBAIC0xODQzLDggKzE4NDgsOCBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgImNyZWF0ZS1pbnB1dC1idWZmZXJzLXN1c3BlbmRlZCIsCi0gICAgICAgICAgICAgICAgICAgIChpbnQzMl90KikmbUNyZWF0ZUlucHV0QnVmZmVyc1N1c3BlbmRlZCkpIHsKKyAgICAgICAgICAgICAgICBLRVlfQ1JFQVRFX0lOUFVUX1NVUkZBQ0VfU1VTUEVOREVELAorICAgICAgICAgICAgICAgIChpbnQzMl90KikmbUNyZWF0ZUlucHV0QnVmZmVyc1N1c3BlbmRlZCkpIHsKICAgICAgICAgICAgIG1DcmVhdGVJbnB1dEJ1ZmZlcnNTdXNwZW5kZWQgPSBmYWxzZTsKICAgICAgICAgfQogICAgIH0KQEAgLTIwODgsNyArMjA5Myw4IEBACiAgICAgICAgIGlmICh1c2luZ1N3UmVuZGVyZXIpIHsKICAgICAgICAgICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoInVzaW5nLXN3LXJlbmRlcmVyIiwgMSk7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpKSB7CisgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKSB8fAorICAgICAgICAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0lJKSkgewogICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlOwogICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJjaGFubmVsLWNvdW50IiwgJm51bUNoYW5uZWxzKQogICAgICAgICAgICAgICAgIHx8ICFtc2ctPmZpbmRJbnQzMigic2FtcGxlLXJhdGUiLCAmc2FtcGxlUmF0ZSkpIHsKQEAgLTIxNzksNyArMjE4NSw4IEBACiAgICAgICAgICAgICBlcnIgPSBzZXR1cEc3MTFDb2RlYyhlbmNvZGVyLCBzYW1wbGVSYXRlLCBudW1DaGFubmVscyk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpKSB7Ci0gICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMgPSAwLCBzYW1wbGVSYXRlID0gMCwgY29tcHJlc3Npb25MZXZlbCA9IC0xOworICAgICAgICAvLyBudW1DaGFubmVscyBuZWVkcyB0byBiZSBzZXQgdG8gcHJvcGVybHkgY29tbXVuaWNhdGUgUENNIHZhbHVlcy4KKyAgICAgICAgaW50MzJfdCBudW1DaGFubmVscyA9IDIsIHNhbXBsZVJhdGUgPSA0NDEwMCwgY29tcHJlc3Npb25MZXZlbCA9IC0xOwogICAgICAgICBpZiAoZW5jb2RlciAmJgogICAgICAgICAgICAgICAgICghbXNnLT5maW5kSW50MzIoImNoYW5uZWwtY291bnQiLCAmbnVtQ2hhbm5lbHMpCiAgICAgICAgICAgICAgICAgICAgICAgICB8fCAhbXNnLT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKSkgewpAQCAtMjIwNSw3ICsyMjEyLDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBlcnIgPSBzZXR1cEZsYWNDb2RlYygKLSAgICAgICAgICAgICAgICAgICAgZW5jb2RlciwgbnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGUsIGNvbXByZXNzaW9uTGV2ZWwpOworICAgICAgICAgICAgICAgICAgICBlbmNvZGVyLCBudW1DaGFubmVscywgc2FtcGxlUmF0ZSwgY29tcHJlc3Npb25MZXZlbCwgcGNtRW5jb2RpbmcpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKSB7CiAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGU7CkBAIC0yMjM0LDYgKzIyNDEsMTUgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGVyciA9IHNldHVwRUFDM0NvZGVjKGVuY29kZXIsIG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlKTsKICAgICAgICAgfQorICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FDNCkpIHsKKyAgICAgICAgaW50MzJfdCBudW1DaGFubmVsczsKKyAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlOworICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJjaGFubmVsLWNvdW50IiwgJm51bUNoYW5uZWxzKQorICAgICAgICAgICAgICAgIHx8ICFtc2ctPmZpbmRJbnQzMigic2FtcGxlLXJhdGUiLCAmc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgICAgIGVyciA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXJyID0gc2V0dXBBQzRDb2RlYyhlbmNvZGVyLCBudW1DaGFubmVscywgc2FtcGxlUmF0ZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC0yMzA3LDEyICsyMzIzLDE2IEBACiAgICAgICAgICAgICAodm9pZCltSW5wdXRGb3JtYXQtPmZpbmRJbnQzMigicGNtLWVuY29kaW5nIiwgKGludDMyX3QqKSZjb2RlY1BjbUVuY29kaW5nKTsKICAgICAgICAgICAgIG1Db252ZXJ0ZXJba1BvcnRJbmRleElucHV0XSA9IEF1ZGlvQ29udmVydGVyOjpDcmVhdGUocGNtRW5jb2RpbmcsIGNvZGVjUGNtRW5jb2RpbmcpOwogICAgICAgICAgICAgaWYgKG1Db252ZXJ0ZXJba1BvcnRJbmRleElucHV0XSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIiVzOiBlbmNvZGVyICVzIGlucHV0IGZvcm1hdCBwY20gZW5jb2RpbmcgY29udmVydGVyIGZyb20gJWQgdG8gJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Db21wb25lbnROYW1lLmNfc3RyKCksIHBjbUVuY29kaW5nLCBjb2RlY1BjbUVuY29kaW5nKTsKICAgICAgICAgICAgICAgICBtSW5wdXRGb3JtYXQtPnNldEludDMyKCJwY20tZW5jb2RpbmciLCBwY21FbmNvZGluZyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAodm9pZCltT3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoInBjbS1lbmNvZGluZyIsIChpbnQzMl90KikmY29kZWNQY21FbmNvZGluZyk7CiAgICAgICAgICAgICBtQ29udmVydGVyW2tQb3J0SW5kZXhPdXRwdXRdID0gQXVkaW9Db252ZXJ0ZXI6OkNyZWF0ZShjb2RlY1BjbUVuY29kaW5nLCBwY21FbmNvZGluZyk7CiAgICAgICAgICAgICBpZiAobUNvbnZlcnRlcltrUG9ydEluZGV4T3V0cHV0XSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIiVzOiBkZWNvZGVyICVzIG91dHB1dCBmb3JtYXQgcGNtIGVuY29kaW5nIGNvbnZlcnRlciBmcm9tICVkIHRvICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBjb2RlY1BjbUVuY29kaW5nLCBwY21FbmNvZGluZyk7CiAgICAgICAgICAgICAgICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoInBjbS1lbmNvZGluZyIsIHBjbUVuY29kaW5nKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjM0NSw2ICsyMzY1LDE3IEBACiAgICAgcmV0dXJuIGVycjsKIH0KIAorc3RhdHVzX3QgQUNvZGVjOjpzZXRBdWRpb1ByZXNlbnRhdGlvbihpbnQzMl90IHByZXNlbnRhdGlvbklkLCBpbnQzMl90IHByb2dyYW1JZCkgeworICAgIE9NWF9BVURJT19DT05GSUdfQU5EUk9JRF9BVURJT1BSRVNFTlRBVElPTiBjb25maWc7CisgICAgSW5pdE9NWFBhcmFtcygmY29uZmlnKTsKKyAgICBjb25maWcublByZXNlbnRhdGlvbklkID0gKE9NWF9TMzIpcHJlc2VudGF0aW9uSWQ7CisgICAgY29uZmlnLm5Qcm9ncmFtSWQgPSAoT01YX1MzMilwcm9ncmFtSWQ7CisgICAgc3RhdHVzX3QgZXJyID0gbU9NWE5vZGUtPnNldENvbmZpZygKKyAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleENvbmZpZ0F1ZGlvUHJlc2VudGF0aW9uLAorICAgICAgICAgICAgJmNvbmZpZywgc2l6ZW9mKGNvbmZpZykpOworICAgIHJldHVybiBlcnI7Cit9CisKIHN0YXR1c190IEFDb2RlYzo6c2V0UHJpb3JpdHkoaW50MzJfdCBwcmlvcml0eSkgewogICAgIGlmIChwcmlvcml0eSA8IDApIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTI1NTEsNiArMjU4Miw4IEBACiAgICAgICAgIGxheWVyUGFyYW1zLm5QTGF5ZXJDb3VudEFjdHVhbCA9IG51bUxheWVycyAtIG51bUJMYXllcnM7CiAgICAgICAgIGxheWVyUGFyYW1zLm5CTGF5ZXJDb3VudEFjdHVhbCA9IG51bUJMYXllcnM7CiAgICAgICAgIGxheWVyUGFyYW1zLmJCaXRyYXRlUmF0aW9zU3BlY2lmaWVkID0gT01YX0ZBTFNFOworICAgICAgICBsYXllclBhcmFtcy5uTGF5ZXJDb3VudE1heCA9IG51bUxheWVyczsKKyAgICAgICAgbGF5ZXJQYXJhbXMubkJMYXllckNvdW50TWF4ID0gbnVtQkxheWVyczsKIAogICAgICAgICBlcnIgPSBtT01YTm9kZS0+c2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQW5kcm9pZFZpZGVvVGVtcG9yYWxMYXllcmluZywKQEAgLTI4OTAsNiArMjkyMywzOCBAQAogICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRFYWMzLCAmZGVmLCBzaXplb2YoZGVmKSk7CiB9CiAKK3N0YXR1c190IEFDb2RlYzo6c2V0dXBBQzRDb2RlYygKKyAgICAgICAgYm9vbCBlbmNvZGVyLCBpbnQzMl90IG51bUNoYW5uZWxzLCBpbnQzMl90IHNhbXBsZVJhdGUpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cFJhd0F1ZGlvRm9ybWF0KAorICAgICAgICAgICAgZW5jb2RlciA/IGtQb3J0SW5kZXhJbnB1dCA6IGtQb3J0SW5kZXhPdXRwdXQsIHNhbXBsZVJhdGUsIG51bUNoYW5uZWxzKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpZiAoZW5jb2RlcikgeworICAgICAgICBBTE9HVygiQUM0IGVuY29kaW5nIGlzIG5vdCBzdXBwb3J0ZWQuIik7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9BQzRUWVBFIGRlZjsKKyAgICBJbml0T01YUGFyYW1zKCZkZWYpOworICAgIGRlZi5uUG9ydEluZGV4ID0ga1BvcnRJbmRleElucHV0OworCisgICAgZXJyID0gbU9NWE5vZGUtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkQWM0LCAmZGVmLCBzaXplb2YoZGVmKSk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgZGVmLm5DaGFubmVscyA9IG51bUNoYW5uZWxzOworICAgIGRlZi5uU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisKKyAgICByZXR1cm4gbU9NWE5vZGUtPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQXVkaW9BbmRyb2lkQWM0LCAmZGVmLCBzaXplb2YoZGVmKSk7Cit9CisKIHN0YXRpYyBPTVhfQVVESU9fQU1SQkFORE1PREVUWVBFIHBpY2tNb2RlRnJvbUJpdFJhdGUoCiAgICAgICAgIGJvb2wgaXNBTVJXQiwgaW50MzJfdCBicHMpIHsKICAgICBpZiAoaXNBTVJXQikgewpAQCAtMjk3Myw4ICszMDM4LDggQEAKIH0KIAogc3RhdHVzX3QgQUNvZGVjOjpzZXR1cEZsYWNDb2RlYygKLSAgICAgICAgYm9vbCBlbmNvZGVyLCBpbnQzMl90IG51bUNoYW5uZWxzLCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgY29tcHJlc3Npb25MZXZlbCkgewotCisgICAgICAgIGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IGNvbXByZXNzaW9uTGV2ZWwsCisgICAgICAgIEF1ZGlvRW5jb2RpbmcgZW5jb2RpbmcpIHsKICAgICBpZiAoZW5jb2RlcikgewogICAgICAgICBPTVhfQVVESU9fUEFSQU1fRkxBQ1RZUEUgZGVmOwogICAgICAgICBJbml0T01YUGFyYW1zKCZkZWYpOwpAQCAtMjk5Nyw3ICszMDYyLDggQEAKICAgICByZXR1cm4gc2V0dXBSYXdBdWRpb0Zvcm1hdCgKICAgICAgICAgICAgIGVuY29kZXIgPyBrUG9ydEluZGV4SW5wdXQgOiBrUG9ydEluZGV4T3V0cHV0LAogICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgIG51bUNoYW5uZWxzKTsKKyAgICAgICAgICAgIG51bUNoYW5uZWxzLAorICAgICAgICAgICAgZW5jb2RpbmcpOwogfQogCiBzdGF0dXNfdCBBQ29kZWM6OnNldHVwUmF3QXVkaW9Gb3JtYXQoCkBAIC0zMDU1LDYgKzMxMjEsNyBAQAogICAgIHBjbVBhcmFtcy5lUENNTW9kZSA9IE9NWF9BVURJT19QQ01Nb2RlTGluZWFyOwogCiAgICAgaWYgKGdldE9NWENoYW5uZWxNYXBwaW5nKG51bUNoYW5uZWxzLCBwY21QYXJhbXMuZUNoYW5uZWxNYXBwaW5nKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IGluY29ycmVjdCBudW1DaGFubmVsczogJWQiLCBfX2Z1bmNfXywgbnVtQ2hhbm5lbHMpOwogICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICB9CiAKQEAgLTM3MTAsOCArMzc3NywxNyBAQAogICAgICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5kZXNjcmliZUhEUlN0YXRpY0luZm8iLCAmbURlc2NyaWJlSERSU3RhdGljSW5mb0luZGV4KTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIG1EZXNjcmliZUhEUlN0YXRpY0luZm9JbmRleCA9IChPTVhfSU5ERVhUWVBFKTA7CisgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQotICAgIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBtT01YTm9kZS0+Z2V0RXh0ZW5zaW9uSW5kZXgoCisgICAgICAgICAgICAgICAgIk9NWC5nb29nbGUuYW5kcm9pZC5pbmRleC5kZXNjcmliZUhEUjEwUGx1c0luZm8iLCAmbURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4KTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIG1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleCA9IChPTVhfSU5ERVhUWVBFKTA7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBBQ29kZWM6OnNldEhEUlN0YXRpY0luZm8oY29uc3QgRGVzY3JpYmVIRFJTdGF0aWNJbmZvUGFyYW1zICZwYXJhbXMpIHsKQEAgLTQyMjUsMjQgKzQzMDEsMjcgQEAKICAgICBpbnQgbWF4RGltZW5zaW9uID0gbWF4KHdpZHRoLCBoZWlnaHQpOwogCiAgICAgc3RhdGljIGNvbnN0IGludCBsaW1pdHNbXVs1XSA9IHsKLSAgICAgICAgLyogICBNQnBzICAgICBNQiAgIGRpbSAgYml0cmF0ZSAgICAgICAgbGV2ZWwgKi8KLSAgICAgICAgeyAgICAxNDg1LCAgICA5OSwgIDI4LCAgICAgNjQsIE9NWF9WSURFT19BVkNMZXZlbDEgIH0sCi0gICAgICAgIHsgICAgMTQ4NSwgICAgOTksICAyOCwgICAgMTI4LCBPTVhfVklERU9fQVZDTGV2ZWwxYiB9LAotICAgICAgICB7ICAgIDMwMDAsICAgMzk2LCAgNTYsICAgIDE5MiwgT01YX1ZJREVPX0FWQ0xldmVsMTEgfSwKLSAgICAgICAgeyAgICA2MDAwLCAgIDM5NiwgIDU2LCAgICAzODQsIE9NWF9WSURFT19BVkNMZXZlbDEyIH0sCi0gICAgICAgIHsgICAxMTg4MCwgICAzOTYsICA1NiwgICAgNzY4LCBPTVhfVklERU9fQVZDTGV2ZWwxMyB9LAotICAgICAgICB7ICAgMTE4ODAsICAgMzk2LCAgNTYsICAgMjAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMiAgfSwKLSAgICAgICAgeyAgIDE5ODAwLCAgIDc5MiwgIDc5LCAgIDQwMDAsIE9NWF9WSURFT19BVkNMZXZlbDIxIH0sCi0gICAgICAgIHsgICAyMDI1MCwgIDE2MjAsIDExMywgICA0MDAwLCBPTVhfVklERU9fQVZDTGV2ZWwyMiB9LAotICAgICAgICB7ICAgNDA1MDAsICAxNjIwLCAxMTMsICAxMDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMyAgfSwKLSAgICAgICAgeyAgMTA4MDAwLCAgMzYwMCwgMTY5LCAgMTQwMDAsIE9NWF9WSURFT19BVkNMZXZlbDMxIH0sCi0gICAgICAgIHsgIDIxNjAwMCwgIDUxMjAsIDIwMiwgIDIwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWwzMiB9LAotICAgICAgICB7ICAyNDU3NjAsICA4MTkyLCAyNTYsICAyMDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNCAgfSwKLSAgICAgICAgeyAgMjQ1NzYwLCAgODE5MiwgMjU2LCAgNTAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDQxIH0sCi0gICAgICAgIHsgIDUyMjI0MCwgIDg3MDQsIDI2MywgIDUwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw0MiB9LAotICAgICAgICB7ICA1ODk4MjQsIDIyMDgwLCA0MjAsIDEzNTAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNSAgfSwKLSAgICAgICAgeyAgOTgzMDQwLCAzNjg2NCwgNTQzLCAyNDAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDUxIH0sCi0gICAgICAgIHsgMjA3MzYwMCwgMzY4NjQsIDU0MywgMjQwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw1MiB9LAorICAgICAgICAvKiAgICBNQnBzICAgICAgTUIgICBkaW0gIGJpdHJhdGUgICAgICAgIGxldmVsICovCisgICAgICAgIHsgICAgIDE0ODUsICAgICA5OSwgICAyOCwgICAgIDY0LCBPTVhfVklERU9fQVZDTGV2ZWwxICB9LAorICAgICAgICB7ICAgICAxNDg1LCAgICAgOTksICAgMjgsICAgIDEyOCwgT01YX1ZJREVPX0FWQ0xldmVsMWIgfSwKKyAgICAgICAgeyAgICAgMzAwMCwgICAgMzk2LCAgIDU2LCAgICAxOTIsIE9NWF9WSURFT19BVkNMZXZlbDExIH0sCisgICAgICAgIHsgICAgIDYwMDAsICAgIDM5NiwgICA1NiwgICAgMzg0LCBPTVhfVklERU9fQVZDTGV2ZWwxMiB9LAorICAgICAgICB7ICAgIDExODgwLCAgICAzOTYsICAgNTYsICAgIDc2OCwgT01YX1ZJREVPX0FWQ0xldmVsMTMgfSwKKyAgICAgICAgeyAgICAxMTg4MCwgICAgMzk2LCAgIDU2LCAgIDIwMDAsIE9NWF9WSURFT19BVkNMZXZlbDIgIH0sCisgICAgICAgIHsgICAgMTk4MDAsICAgIDc5MiwgICA3OSwgICA0MDAwLCBPTVhfVklERU9fQVZDTGV2ZWwyMSB9LAorICAgICAgICB7ICAgIDIwMjUwLCAgIDE2MjAsICAxMTMsICAgNDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMjIgfSwKKyAgICAgICAgeyAgICA0MDUwMCwgICAxNjIwLCAgMTEzLCAgMTAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDMgIH0sCisgICAgICAgIHsgICAxMDgwMDAsICAgMzYwMCwgIDE2OSwgIDE0MDAwLCBPTVhfVklERU9fQVZDTGV2ZWwzMSB9LAorICAgICAgICB7ICAgMjE2MDAwLCAgIDUxMjAsICAyMDIsICAyMDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMzIgfSwKKyAgICAgICAgeyAgIDI0NTc2MCwgICA4MTkyLCAgMjU2LCAgMjAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDQgIH0sCisgICAgICAgIHsgICAyNDU3NjAsICAgODE5MiwgIDI1NiwgIDUwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw0MSB9LAorICAgICAgICB7ICAgNTIyMjQwLCAgIDg3MDQsICAyNjMsICA1MDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNDIgfSwKKyAgICAgICAgeyAgIDU4OTgyNCwgIDIyMDgwLCAgNDIwLCAxMzUwMDAsIE9NWF9WSURFT19BVkNMZXZlbDUgIH0sCisgICAgICAgIHsgICA5ODMwNDAsICAzNjg2NCwgIDU0MywgMjQwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw1MSB9LAorICAgICAgICB7ICAyMDczNjAwLCAgMzY4NjQsICA1NDMsIDI0MDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNTIgfSwKKyAgICAgICAgeyAgNDE3NzkyMCwgMTM5MjY0LCAxMDU1LCAyNDAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDYgIH0sCisgICAgICAgIHsgIDgzNTU4NDAsIDEzOTI2NCwgMTA1NSwgNDgwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw2MSB9LAorICAgICAgICB7IDE2NzExNjgwLCAxMzkyNjQsIDEwNTUsIDgwMDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNjIgfSwKICAgICB9OwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxpbWl0cyk7IGkrKykgewpAQCAtNDM1MiwxMiArNDQzMSwxMyBAQAogICAgICAgICAgICAgaDI2NHR5cGUuZVByb2ZpbGUgPT0gT01YX1ZJREVPX0FWQ1Byb2ZpbGVIaWdoKSB7CiAgICAgICAgIGgyNjR0eXBlLm5TbGljZUhlYWRlclNwYWNpbmcgPSAwOwogICAgICAgICBoMjY0dHlwZS5iVXNlSGFkYW1hcmQgPSBPTVhfVFJVRTsKLSAgICAgICAgaDI2NHR5cGUublJlZkZyYW1lcyA9IDI7Ci0gICAgICAgIGgyNjR0eXBlLm5CRnJhbWVzID0gbUxhdGVuY3kgPT0gMCA/IDEgOiBzdGQ6Om1pbigxVSwgbUxhdGVuY3kgLSAxKTsKLQotICAgICAgICAvLyBkaXNhYmxlIEItZnJhbWVzIHVudGlsIE1QRUc0V3JpdGVyIGNhbiBndWFyYW50ZWUgZmluYWxpemluZyBmaWxlcyB3aXRoIEItZnJhbWVzCi0gICAgICAgIGgyNjR0eXBlLm5SZWZGcmFtZXMgPSAxOwotICAgICAgICBoMjY0dHlwZS5uQkZyYW1lcyA9IDA7CisgICAgICAgIGludDMyX3QgbWF4QmZyYW1lcyA9IDA7CisgICAgICAgICh2b2lkKW1zZy0+ZmluZEludDMyKEtFWV9NQVhfQl9GUkFNRVMsICZtYXhCZnJhbWVzKTsKKyAgICAgICAgaDI2NHR5cGUubkJGcmFtZXMgPSB1aW50MzJfdChtYXhCZnJhbWVzKTsKKyAgICAgICAgaWYgKG1MYXRlbmN5ICYmIGgyNjR0eXBlLm5CRnJhbWVzID4gKm1MYXRlbmN5KSB7CisgICAgICAgICAgICBoMjY0dHlwZS5uQkZyYW1lcyA9ICptTGF0ZW5jeTsKKyAgICAgICAgfQorICAgICAgICBoMjY0dHlwZS5uUmVmRnJhbWVzID0gaDI2NHR5cGUubkJGcmFtZXMgPT0gMCA/IDEgOiAyOwogCiAgICAgICAgIGgyNjR0eXBlLm5QRnJhbWVzID0gc2V0UEZyYW1lc1NwYWNpbmcoaUZyYW1lSW50ZXJ2YWwsIGZyYW1lUmF0ZSwgaDI2NHR5cGUubkJGcmFtZXMpOwogICAgICAgICBoMjY0dHlwZS5uQWxsb3dlZFBpY3R1cmVUeXBlcyA9CkBAIC01MDE5LDYgKzUwOTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBzZXQgdXAgbWltZS4KKyAgICAgICAgICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKQEAgLTUxMjMsNiArNTIwNCw3IEBACiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIHBhcmFtcy5uQ2hhbm5lbHMpOwogICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIHBhcmFtcy5uU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImJpdHJhdGUiLCBwYXJhbXMubkJpdFJhdGUpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKQEAgLTUyNDEsNiArNTMyMywyNSBAQAogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBjYXNlIE9NWF9BVURJT19Db2RpbmdBbmRyb2lkQUM0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgT01YX0FVRElPX1BBUkFNX0FORFJPSURfQUM0VFlQRSBwYXJhbXM7CisgICAgICAgICAgICAgICAgICAgIEluaXRPTVhQYXJhbXMoJnBhcmFtcyk7CisgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5uUG9ydEluZGV4ID0gcG9ydEluZGV4OworCisgICAgICAgICAgICAgICAgICAgIGVyciA9IG1PTVhOb2RlLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRBYzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQpOworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgcGFyYW1zLm5DaGFubmVscyk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNhbXBsZS1yYXRlIiwgcGFyYW1zLm5TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgY2FzZSBPTVhfQVVESU9fQ29kaW5nQW5kcm9pZE9QVVM6CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9PUFVTVFlQRSBwYXJhbXM7CkBAIC01MzIxLDYgKzU0MjIsNzAgQEAKICAgICByZXR1cm4gZ2V0VmVuZG9yUGFyYW1ldGVycyhwb3J0SW5kZXgsIG5vdGlmeSk7CiB9CiAKK0Rlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyogQUNvZGVjOjpnZXRIRFIxMFBsdXNJbmZvKHNpemVfdCBwYXJhbVNpemVVc2VkKSB7CisgICAgaWYgKG1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJnZXRIRFIxMFBsdXNJbmZvOiBkb2VzIG5vdCBzdXBwb3J0IERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzaXplX3QgbmV3U2l6ZSA9IHNpemVvZihEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMpIC0gMSArCisgICAgICAgICAgICAoKHBhcmFtU2l6ZVVzZWQgPiAwKSA/IHBhcmFtU2l6ZVVzZWQgOiA1MTIpOworICAgIGlmIChtSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlciA9PSBudWxscHRyCisgICAgICAgICAgICB8fCBuZXdTaXplID4gbUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXItPnNpemUoKSkgeworICAgICAgICBtSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlciA9IG5ldyBBQnVmZmVyKG5ld1NpemUpOworICAgIH0KKyAgICBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgKmNvbmZpZyA9CisgICAgICAgICAgICAoRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zICopbUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXItPmRhdGEoKTsKKyAgICBJbml0T01YUGFyYW1zKGNvbmZpZyk7CisgICAgY29uZmlnLT5uU2l6ZSA9IG1IZHIxMFBsdXNTY3JhdGNoQnVmZmVyLT5zaXplKCk7CisgICAgY29uZmlnLT5uUG9ydEluZGV4ID0gMTsKKyAgICBzaXplX3QgcGFyYW1TaXplID0gY29uZmlnLT5uU2l6ZSAtIHNpemVvZihEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMpICsgMTsKKyAgICBjb25maWctPm5QYXJhbVNpemUgPSBwYXJhbVNpemU7CisgICAgY29uZmlnLT5uUGFyYW1TaXplVXNlZCA9IDA7CisgICAgc3RhdHVzX3QgZXJyID0gbU9NWE5vZGUtPmdldENvbmZpZygKKyAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKW1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleCwKKyAgICAgICAgICAgIGNvbmZpZywgY29uZmlnLT5uU2l6ZSk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGdldCBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgKGVyciAlZCkiLCBlcnIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKGNvbmZpZy0+blBhcmFtU2l6ZSAhPSBwYXJhbVNpemUpIHsKKyAgICAgICAgQUxPR0UoIkRlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyBhbHRlcnMgblBhcmFtU2l6ZTogJXUgdnMgJXp1IiwKKyAgICAgICAgICAgICAgICBjb25maWctPm5QYXJhbVNpemUsIHBhcmFtU2l6ZSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBpZiAocGFyYW1TaXplVXNlZCA+IDAgJiYgY29uZmlnLT5uUGFyYW1TaXplVXNlZCAhPSBwYXJhbVNpemVVc2VkKSB7CisgICAgICAgIEFMT0dFKCJEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgcmV0dXJucyB3cm9uZyBuUGFyYW1TaXplVXNlZDogJXUgdnMgJXp1IiwKKyAgICAgICAgICAgICAgICBjb25maWctPm5QYXJhbVNpemVVc2VkLCBwYXJhbVNpemVVc2VkKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBjb25maWc7Cit9CisKK3ZvaWQgQUNvZGVjOjpvbkNvbmZpZ1VwZGF0ZShPTVhfSU5ERVhUWVBFIGNvbmZpZ0luZGV4KSB7CisgICAgaWYgKG1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleCA9PSAwCisgICAgICAgICAgICB8fCBjb25maWdJbmRleCAhPSBtRGVzY3JpYmVIRFIxMFBsdXNJbmZvSW5kZXgpIHsKKyAgICAgICAgLy8gbURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4IGlzIHRoZSBvbmx5IHVwZGF0ZSB3ZSByZWNvZ25pemUgbm93CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgKmNvbmZpZyA9IGdldEhEUjEwUGx1c0luZm8oKTsKKyAgICBpZiAoY29uZmlnID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoY29uZmlnLT5uUGFyYW1TaXplVXNlZCA+IGNvbmZpZy0+blBhcmFtU2l6ZSkgeworICAgICAgICAvLyB0cnkgYWdhaW4gd2l0aCB0aGUgc2l6ZSBzcGVjaWZpZWQKKyAgICAgICAgY29uZmlnID0gZ2V0SERSMTBQbHVzSW5mbyhjb25maWctPm5QYXJhbVNpemVVc2VkKTsKKyAgICAgICAgaWYgKGNvbmZpZyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtT3V0cHV0Rm9ybWF0ID0gbU91dHB1dEZvcm1hdC0+ZHVwKCk7IC8vIHRyaWdnZXIgYW4gb3V0cHV0IGZvcm1hdCBjaGFuZ2VkIGV2ZW50CisgICAgbU91dHB1dEZvcm1hdC0+c2V0QnVmZmVyKCJoZHIxMC1wbHVzLWluZm8iLAorICAgICAgICAgICAgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KGNvbmZpZy0+blZhbHVlLCBjb25maWctPm5QYXJhbVNpemVVc2VkKSk7Cit9CisKIHZvaWQgQUNvZGVjOjpvbkRhdGFTcGFjZUNoYW5nZWQoYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjb25zdCBDb2xvckFzcGVjdHMgJmFzcGVjdHMpIHsKICAgICAvLyBhc3BlY3RzIGFyZSBub3JtYWxseSBjb21tdW5pY2F0ZWQgaW4gQ29sb3JBc3BlY3RzCiAgICAgaW50MzJfdCByYW5nZSwgc3RhbmRhcmQsIHRyYW5zZmVyOwpAQCAtNTM4Myw3ICs1NTQ4LDcgQEAKICAgICAgICAgQXVkaW9FbmNvZGluZyBwY21FbmNvZGluZyA9IGtBdWRpb0VuY29kaW5nUGNtMTZiaXQ7CiAgICAgICAgICh2b2lkKW1Db25maWdGb3JtYXQtPmZpbmRJbnQzMigicGNtLWVuY29kaW5nIiwgKGludDMyX3QqKSZwY21FbmNvZGluZyk7CiAgICAgICAgIEF1ZGlvRW5jb2RpbmcgY29kZWNQY21FbmNvZGluZyA9IGtBdWRpb0VuY29kaW5nUGNtMTZiaXQ7Ci0gICAgICAgICh2b2lkKW1PdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigicGNtLWVuY29kaW5nIiwgKGludDMyX3QqKSZwY21FbmNvZGluZyk7CisgICAgICAgICh2b2lkKW1PdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigicGNtLWVuY29kaW5nIiwgKGludDMyX3QqKSZjb2RlY1BjbUVuY29kaW5nKTsKIAogICAgICAgICBtQ29udmVydGVyW2tQb3J0SW5kZXhPdXRwdXRdID0gQXVkaW9Db252ZXJ0ZXI6OkNyZWF0ZShjb2RlY1BjbUVuY29kaW5nLCBwY21FbmNvZGluZyk7CiAgICAgICAgIGlmIChtQ29udmVydGVyW2tQb3J0SW5kZXhPdXRwdXRdICE9IE5VTEwpIHsKQEAgLTU1NTYsNiArNTcyMSwxMSBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0Q2hlY2tJZlN0dWNrOiB7CisgICAgICAgICAgICBBTE9HVigiTm8tb3AgYnkgZGVmYXVsdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTYyNTYsNiArNjQyNiwxNSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgc3A8QUJ1ZmZlcj4gaGRyMTBQbHVzSW5mbzsKKyAgICAgICAgaWYgKGJ1ZmZlci0+Zm9ybWF0KCktPmZpbmRCdWZmZXIoImhkcjEwLXBsdXMtaW5mbyIsICZoZHIxMFBsdXNJbmZvKQorICAgICAgICAgICAgICAgICYmIGhkcjEwUGx1c0luZm8gIT0gbnVsbHB0ciAmJiBoZHIxMFBsdXNJbmZvLT5zaXplKCkgPiAwCisgICAgICAgICAgICAgICAgJiYgaGRyMTBQbHVzSW5mbyAhPSBtQ29kZWMtPm1MYXN0SGRyMTBQbHVzQnVmZmVyKSB7CisgICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2hkcjEwX3BsdXNfbWV0YWRhdGEobUNvZGVjLT5tTmF0aXZlV2luZG93LmdldCgpLAorICAgICAgICAgICAgICAgICAgICBoZHIxMFBsdXNJbmZvLT5zaXplKCksIGhkcjEwUGx1c0luZm8tPmRhdGEoKSk7CisgICAgICAgICAgICBtQ29kZWMtPm1MYXN0SGRyMTBQbHVzQnVmZmVyID0gaGRyMTBQbHVzSW5mbzsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIHNhdmUgYnVmZmVycyBzZW50IHRvIHRoZSBzdXJmYWNlIHNvIHdlIGNhbiBnZXQgcmVuZGVyIHRpbWUgd2hlbiB0aGV5IHJldHVybgogICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzID0gLTE7CiAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZtZWRpYVRpbWVVcyk7CkBAIC02MzY0LDggKzY1NDMsMTAgQEAKIAogICAgIGlmIChtRGVhdGhOb3RpZmllciAhPSBOVUxMKSB7CiAgICAgICAgIGlmIChtQ29kZWMtPm1PTVhOb2RlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGF1dG8gdE9teE5vZGUgPSBtQ29kZWMtPm1PTVhOb2RlLT5nZXRIYWxJbnRlcmZhY2UoKTsKLSAgICAgICAgICAgIHRPbXhOb2RlLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyKTsKKyAgICAgICAgICAgIGF1dG8gdE9teE5vZGUgPSBtQ29kZWMtPm1PTVhOb2RlLT5nZXRIYWxJbnRlcmZhY2U8SU9teE5vZGU+KCk7CisgICAgICAgICAgICBpZiAodE9teE5vZGUpIHsKKyAgICAgICAgICAgICAgICB0T214Tm9kZS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllcik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgbURlYXRoTm90aWZpZXIuY2xlYXIoKTsKICAgICB9CkBAIC02NDUyLDcgKzY2MzMsOCBAQAogCiAgICAgQ0hFQ0sobUNvZGVjLT5tT01YTm9kZSA9PSBOVUxMKTsKIAotICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPTVhEaWVkLCBtQ29kZWMpOworICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPTVhNZXNzYWdlTGlzdCwgbUNvZGVjKTsKKyAgICBub3RpZnktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUNvZGVjLT5tTm9kZUdlbmVyYXRpb24gKyAxKTsKIAogICAgIHNwPFJlZkJhc2U+IG9iajsKICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoImNvZGVjSW5mbyIsICZvYmopKTsKQEAgLTY0NjcsNyArNjY0OSw3IEBACiAgICAgQVN0cmluZyBjb21wb25lbnROYW1lOwogICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZygiY29tcG9uZW50TmFtZSIsICZjb21wb25lbnROYW1lKSk7CiAKLSAgICBzcDxDb2RlY09ic2VydmVyPiBvYnNlcnZlciA9IG5ldyBDb2RlY09ic2VydmVyOworICAgIHNwPENvZGVjT2JzZXJ2ZXI+IG9ic2VydmVyID0gbmV3IENvZGVjT2JzZXJ2ZXIobm90aWZ5KTsKICAgICBzcDxJT01YPiBvbXg7CiAgICAgc3A8SU9NWE5vZGU+IG9teE5vZGU7CiAKQEAgLTY0OTIsMTUgKzY2NzQsMTMgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIG1EZWF0aE5vdGlmaWVyID0gbmV3IERlYXRoTm90aWZpZXIobm90aWZ5KTsKLSAgICBhdXRvIHRPbXhOb2RlID0gb214Tm9kZS0+Z2V0SGFsSW50ZXJmYWNlKCk7Ci0gICAgaWYgKCF0T214Tm9kZS0+bGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIDApKSB7CisgICAgbURlYXRoTm90aWZpZXIgPSBuZXcgRGVhdGhOb3RpZmllcihuZXcgQU1lc3NhZ2Uoa1doYXRPTVhEaWVkLCBtQ29kZWMpKTsKKyAgICBhdXRvIHRPbXhOb2RlID0gb214Tm9kZS0+Z2V0SGFsSW50ZXJmYWNlPElPbXhOb2RlPigpOworICAgIGlmICh0T214Tm9kZSAmJiAhdE9teE5vZGUtPmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCAwKSkgewogICAgICAgICBtRGVhdGhOb3RpZmllci5jbGVhcigpOwogICAgIH0KIAotICAgIG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdE9NWE1lc3NhZ2VMaXN0LCBtQ29kZWMpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCArK21Db2RlYy0+bU5vZGVHZW5lcmF0aW9uKTsKLSAgICBvYnNlcnZlci0+c2V0Tm90aWZpY2F0aW9uTWVzc2FnZShub3RpZnkpOworICAgICsrbUNvZGVjLT5tTm9kZUdlbmVyYXRpb247CiAKICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZTsKICAgICBtQ29kZWMtPm1SZW5kZXJUcmFja2VyLnNldENvbXBvbmVudE5hbWUoY29tcG9uZW50TmFtZSk7CkBAIC02NTM2LDcgKzY3MTYsNyBAQAogCiAgICAgbUNvZGVjLT5tRGVxdWV1ZUNvdW50ZXIgPSAwOwogICAgIG1Db2RlYy0+bU1ldGFkYXRhQnVmZmVyc1RvU3VibWl0ID0gMDsKLSAgICBtQ29kZWMtPm1SZXBlYXRGcmFtZURlbGF5VXMgPSAtMWxsOworICAgIG1Db2RlYy0+bVJlcGVhdEZyYW1lRGVsYXlVcyA9IC0xTEw7CiAgICAgbUNvZGVjLT5tSW5wdXRGb3JtYXQuY2xlYXIoKTsKICAgICBtQ29kZWMtPm1PdXRwdXRGb3JtYXQuY2xlYXIoKTsKICAgICBtQ29kZWMtPm1CYXNlT3V0cHV0Rm9ybWF0LmNsZWFyKCk7CkBAIC02Njc4LDcgKzY4NTgsNyBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAotICAgIGlmIChtQ29kZWMtPm1SZXBlYXRGcmFtZURlbGF5VXMgPiAwbGwpIHsKKyAgICBpZiAobUNvZGVjLT5tUmVwZWF0RnJhbWVEZWxheVVzID4gMExMKSB7CiAgICAgICAgIGVyciA9IHN0YXR1c0Zyb21CaW5kZXJTdGF0dXMoCiAgICAgICAgICAgICAgICAgbUNvZGVjLT5tR3JhcGhpY0J1ZmZlclNvdXJjZS0+c2V0UmVwZWF0UHJldmlvdXNGcmFtZURlbGF5VXMoCiAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWMtPm1SZXBlYXRGcmFtZURlbGF5VXMpKTsKQEAgLTY2OTEsNyArNjg3MSw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAobUNvZGVjLT5tTWF4UHRzR2FwVXMgIT0gMGxsKSB7CisgICAgaWYgKG1Db2RlYy0+bU1heFB0c0dhcFVzICE9IDBMTCkgewogICAgICAgICBPTVhfUEFSQU1fVTMyVFlQRSBtYXhQdHNHYXBQYXJhbXM7CiAgICAgICAgIEluaXRPTVhQYXJhbXMoJm1heFB0c0dhcFBhcmFtcyk7CiAgICAgICAgIG1heFB0c0dhcFBhcmFtcy5uUG9ydEluZGV4ID0ga1BvcnRJbmRleElucHV0OwpAQCAtNzI1OCw3ICs3NDM4LDcgQEAKICAgICB9CiAKICAgICBpbnQ2NF90IHRpbWVPZmZzZXRVczsKLSAgICBpZiAocGFyYW1zLT5maW5kSW50NjQoInRpbWUtb2Zmc2V0LXVzIiwgJnRpbWVPZmZzZXRVcykpIHsKKyAgICBpZiAocGFyYW1zLT5maW5kSW50NjQoUEFSQU1FVEVSX0tFWV9PRkZTRVRfVElNRSwgJnRpbWVPZmZzZXRVcykpIHsKICAgICAgICAgaWYgKG1HcmFwaGljQnVmZmVyU291cmNlID09IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dFKCJbJXNdIEludmFsaWQgdG8gc2V0IGlucHV0IGJ1ZmZlciB0aW1lIG9mZnNldCB3aXRob3V0IHN1cmZhY2UiLAogICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKQEAgLTcyOTQsNyArNzQ3NCw3IEBACiAgICAgfQogCiAgICAgaW50MzJfdCBkcm9wSW5wdXRGcmFtZXM7Ci0gICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJkcm9wLWlucHV0LWZyYW1lcyIsICZkcm9wSW5wdXRGcmFtZXMpKSB7CisgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKFBBUkFNRVRFUl9LRVlfU1VTUEVORCwgJmRyb3BJbnB1dEZyYW1lcykpIHsKICAgICAgICAgaWYgKG1HcmFwaGljQnVmZmVyU291cmNlID09IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dFKCJbJXNdIEludmFsaWQgdG8gc2V0IHN1c3BlbmQgd2l0aG91dCBzdXJmYWNlIiwKICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CkBAIC03MzAyLDcgKzc0ODIsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaW50NjRfdCBzdXNwZW5kU3RhcnRUaW1lVXMgPSAtMTsKLSAgICAgICAgKHZvaWQpIHBhcmFtcy0+ZmluZEludDY0KCJkcm9wLXN0YXJ0LXRpbWUtdXMiLCAmc3VzcGVuZFN0YXJ0VGltZVVzKTsKKyAgICAgICAgKHZvaWQpIHBhcmFtcy0+ZmluZEludDY0KFBBUkFNRVRFUl9LRVlfU1VTUEVORF9USU1FLCAmc3VzcGVuZFN0YXJ0VGltZVVzKTsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gc3RhdHVzRnJvbUJpbmRlclN0YXR1cygKICAgICAgICAgICAgICAgICBtR3JhcGhpY0J1ZmZlclNvdXJjZS0+c2V0U3VzcGVuZChkcm9wSW5wdXRGcmFtZXMgIT0gMCwgc3VzcGVuZFN0YXJ0VGltZVVzKSk7CiAKQEAgLTczODIsMTIgKzc1NjIsNTcgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGludDMyX3QgcHJlc2VudGF0aW9uSWQgPSAtMTsKKyAgICBpZiAocGFyYW1zLT5maW5kSW50MzIoImF1ZGlvLXByZXNlbnRhdGlvbi1wcmVzZW50YXRpb24taWQiLCAmcHJlc2VudGF0aW9uSWQpKSB7CisgICAgICAgIGludDMyX3QgcHJvZ3JhbUlkID0gLTE7CisgICAgICAgIHBhcmFtcy0+ZmluZEludDMyKCJhdWRpby1wcmVzZW50YXRpb24tcHJvZ3JhbS1pZCIsICZwcm9ncmFtSWQpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXRBdWRpb1ByZXNlbnRhdGlvbihwcmVzZW50YXRpb25JZCwgcHJvZ3JhbUlkKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0koIlslc10gZmFpbGVkIHNldEF1ZGlvUHJlc2VudGF0aW9uLiBGYWlsdXJlIGlzIGZpbmUgc2luY2UgdGhpcyBrZXkgaXMgb3B0aW9uYWwiLAorICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICB9CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gaGRyMTBQbHVzSW5mbzsKKyAgICBpZiAocGFyYW1zLT5maW5kQnVmZmVyKCJoZHIxMC1wbHVzLWluZm8iLCAmaGRyMTBQbHVzSW5mbykKKyAgICAgICAgICAgICYmIGhkcjEwUGx1c0luZm8gIT0gbnVsbHB0ciAmJiBoZHIxMFBsdXNJbmZvLT5zaXplKCkgPiAwKSB7CisgICAgICAgICh2b2lkKXNldEhkcjEwUGx1c0luZm8oaGRyMTBQbHVzSW5mbyk7CisgICAgfQorCiAgICAgLy8gSWdub3JlIGVycm9ycyBhcyBmYWlsdXJlIGlzIGV4cGVjdGVkIGZvciBjb2RlY3MgdGhhdCBhcmVuJ3QgdmlkZW8gZW5jb2RlcnMuCiAgICAgKHZvaWQpY29uZmlndXJlVGVtcG9yYWxMYXllcnMocGFyYW1zLCBmYWxzZSAvKiBpbkNvbmZpZ3VyZSAqLywgbU91dHB1dEZvcm1hdCk7CiAKICAgICByZXR1cm4gc2V0VmVuZG9yUGFyYW1ldGVycyhwYXJhbXMpOwogfQogCitzdGF0dXNfdCBBQ29kZWM6OnNldEhkcjEwUGx1c0luZm8oY29uc3Qgc3A8QUJ1ZmZlcj4gJmhkcjEwUGx1c0luZm8pIHsKKyAgICBpZiAobURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4ID09IDApIHsKKyAgICAgICAgQUxPR0UoInNldEhkcjEwUGx1c0luZm86IGRvZXMgbm90IHN1cHBvcnQgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zIik7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisgICAgc2l6ZV90IG5ld1NpemUgPSBzaXplb2YoRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zKSArIGhkcjEwUGx1c0luZm8tPnNpemUoKSAtIDE7CisgICAgaWYgKG1IZHIxMFBsdXNTY3JhdGNoQnVmZmVyID09IG51bGxwdHIgfHwKKyAgICAgICAgICAgIG5ld1NpemUgPiBtSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlci0+c2l6ZSgpKSB7CisgICAgICAgIG1IZHIxMFBsdXNTY3JhdGNoQnVmZmVyID0gbmV3IEFCdWZmZXIobmV3U2l6ZSk7CisgICAgfQorICAgIERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyAqY29uZmlnID0KKyAgICAgICAgICAgIChEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgKiltSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlci0+ZGF0YSgpOworICAgIEluaXRPTVhQYXJhbXMoY29uZmlnKTsKKyAgICBjb25maWctPm5Qb3J0SW5kZXggPSAwOworICAgIGNvbmZpZy0+blNpemUgPSBuZXdTaXplOworICAgIGNvbmZpZy0+blBhcmFtU2l6ZSA9IGhkcjEwUGx1c0luZm8tPnNpemUoKTsKKyAgICBjb25maWctPm5QYXJhbVNpemVVc2VkID0gaGRyMTBQbHVzSW5mby0+c2l6ZSgpOworICAgIG1lbWNweShjb25maWctPm5WYWx1ZSwgaGRyMTBQbHVzSW5mby0+ZGF0YSgpLCBoZHIxMFBsdXNJbmZvLT5zaXplKCkpOworICAgIHN0YXR1c190IGVyciA9IG1PTVhOb2RlLT5zZXRDb25maWcoCisgICAgICAgICAgICAoT01YX0lOREVYVFlQRSltRGVzY3JpYmVIRFIxMFBsdXNJbmZvSW5kZXgsCisgICAgICAgICAgICBjb25maWcsIGNvbmZpZy0+blNpemUpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBzZXQgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zIChlcnIgJWQpIiwgZXJyKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCiAvLyBSZW1vdmVzIHRyYWlsaW5nIHRhZ3MgbWF0Y2hpbmcgfHRhZ3wgZnJvbSB8a2V5fCAoZS5nLiBhIHNldHRpbmdzIG5hbWUpLiB8bWluTGVuZ3RofCBzcGVjaWZpZXMKIC8vIHRoZSBtaW5pbXVtIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRvIGtlZXAgaW4gfGtleXwgKGV2ZW4gaWYgaXQgaGFzIHRyYWlsaW5nIHRhZ3MpLgogLy8gKFVzZWQgdG8gcmVtb3ZlIHRyYWlsaW5nICd2YWx1ZScgdGFncyBpbiBzZXR0aW5ncyBuYW1lcywgZS5nLiB0byBub3JtYWxpemUKQEAgLTc4MDksNiArODAzNCwxNSBAQAogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIE9NWF9FdmVudENvbmZpZ1VwZGF0ZToKKyAgICAgICAgeworICAgICAgICAgICAgQ0hFQ0tfRVEoZGF0YTEsIChPTVhfVTMyKWtQb3J0SW5kZXhPdXRwdXQpOworCisgICAgICAgICAgICBtQ29kZWMtPm9uQ29uZmlnVXBkYXRlKChPTVhfSU5ERVhUWVBFKWRhdGEyKTsKKworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIE9NWF9FdmVudEJ1ZmZlckZsYWc6CiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpAQCAtNzg0OSw3ICs4MDgzLDcgQEAKICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUNvZGVjLT5tU3RhdGVHZW5lcmF0aW9uKTsKICAgICAgICAgICAgICAgICBtc2ctPnBvc3QoMzAwMDAwMCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBmYWxsLXRocm91Z2gKKyAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgICAgICB9CiAgICAgICAgIGNhc2Uga1doYXRSZXN1bWU6CiAgICAgICAgIGNhc2Uga1doYXRTZXRQYXJhbWV0ZXJzOgpAQCAtNzg3Myw2ICs4MTA3LDE4IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCisgICAgICAgIGNhc2Uga1doYXRDaGVja0lmU3R1Y2s6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbiA9IDA7CisgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7CisgICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiA9PSBtQ29kZWMtPm1TdGF0ZUdlbmVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBtQ29kZWMtPnNpZ25hbEVycm9yKE9NWF9FcnJvclVuZGVmaW5lZCwgVElNRURfT1VUKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaGFuZGxlZCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBoYW5kbGVkID0gQmFzZVN0YXRlOjpvbk1lc3NhZ2VSZWNlaXZlZChtc2cpOwogICAgICAgICAgICAgYnJlYWs7CkBAIC03ODg0LDYgKzgxMzAsMTEgQEAKIHZvaWQgQUNvZGVjOjpPdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2VkU3RhdGU6OnN0YXRlRW50ZXJlZCgpIHsKICAgICBBTE9HVigiWyVzXSBOb3cgaGFuZGxpbmcgb3V0cHV0IHBvcnQgc2V0dGluZ3MgY2hhbmdlIiwKICAgICAgICAgIG1Db2RlYy0+bUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisKKyAgICAvLyBJZiB3ZSBoYXZlbid0IHRyYW5zaXRpb25lZCBhZnRlciAzIHNlY29uZHMsIHdlJ3JlIHByb2JhYmx5IHN0dWNrLgorICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoQUNvZGVjOjprV2hhdENoZWNrSWZTdHVjaywgbUNvZGVjKTsKKyAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUNvZGVjLT5tU3RhdGVHZW5lcmF0aW9uKTsKKyAgICBtc2ctPnBvc3QoMzAwMDAwMCk7CiB9CiAKIGJvb2wgQUNvZGVjOjpPdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2VkU3RhdGU6Om9uT01YRnJhbWVSZW5kZXJlZCgKQEAgLTc5MTksNiArODE3MCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9NWF9Db21tYW5kUG9ydEVuYWJsZSwga1BvcnRJbmRleE91dHB1dCk7CiAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIFJlbmRlclF1ZXVlIGluIHdoaWNoIHF1ZXVlZCBHcmFwaGljQnVmZmVycyBob2xkIHRoZQorICAgICAgICAgICAgICAgIC8vIGFjdHVhbCBidWZmZXIgcmVmZXJlbmNlcyBpbiBvcmRlciB0byBmcmVlIHRoZW0gZWFybHkuCisgICAgICAgICAgICAgICAgbUNvZGVjLT5tUmVuZGVyVHJhY2tlci5jbGVhcihzeXN0ZW1UaW1lKENMT0NLX01PTk9UT05JQykpOworCiAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgICAgICAgICBlcnIgPSBtQ29kZWMtPmFsbG9jYXRlQnVmZmVyc09uUG9ydChrUG9ydEluZGV4T3V0cHV0KTsKICAgICAgICAgICAgICAgICAgICAgQUxPR0VfSUYoZXJyICE9IE9LLCAiRmFpbGVkIHRvIGFsbG9jYXRlIG91dHB1dCBwb3J0IGJ1ZmZlcnMgYWZ0ZXIgcG9ydCAiCkBAIC04MTQ2LDYgKzg0MDEsMTEgQEAKICAgICBBTE9HVigiWyVzXSBOb3cgRmx1c2hpbmciLCBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCkpOwogCiAgICAgbUZsdXNoQ29tcGxldGVba1BvcnRJbmRleElucHV0XSA9IG1GbHVzaENvbXBsZXRlW2tQb3J0SW5kZXhPdXRwdXRdID0gZmFsc2U7CisKKyAgICAvLyBJZiB3ZSBoYXZlbid0IHRyYW5zaXRpb25lZCBhZnRlciAzIHNlY29uZHMsIHdlJ3JlIHByb2JhYmx5IHN0dWNrLgorICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoQUNvZGVjOjprV2hhdENoZWNrSWZTdHVjaywgbUNvZGVjKTsKKyAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUNvZGVjLT5tU3RhdGVHZW5lcmF0aW9uKTsKKyAgICBtc2ctPnBvc3QoMzAwMDAwMCk7CiB9CiAKIGJvb2wgQUNvZGVjOjpGbHVzaGluZ1N0YXRlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewpAQCAtODE2MCw2ICs4NDIwLDcgQEAKICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUNvZGVjLT5tU3RhdGVHZW5lcmF0aW9uKTsKICAgICAgICAgICAgICAgICBtc2ctPnBvc3QoMzAwMDAwMCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTgxODAsNiArODQ0MSwxOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0Q2hlY2tJZlN0dWNrOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb24gPSAwOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gPT0gbUNvZGVjLT5tU3RhdGVHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIFRJTUVEX09VVCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgaGFuZGxlZCA9IEJhc2VTdGF0ZTo6b25NZXNzYWdlUmVjZWl2ZWQobXNnKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtODMwNiw3ICs4NTc5LDcgQEAKICAgICB9CiAKICAgICBzcDxJT01YPiBvbXggPSBjbGllbnQuaW50ZXJmYWNlKCk7Ci0gICAgc3A8Q29kZWNPYnNlcnZlcj4gb2JzZXJ2ZXIgPSBuZXcgQ29kZWNPYnNlcnZlcjsKKyAgICBzcDxDb2RlY09ic2VydmVyPiBvYnNlcnZlciA9IG5ldyBDb2RlY09ic2VydmVyKG5ldyBBTWVzc2FnZSk7CiAgICAgc3A8SU9NWE5vZGU+IG9teE5vZGU7CiAKICAgICBlcnIgPSBvbXgtPmFsbG9jYXRlTm9kZShuYW1lLCBvYnNlcnZlciwgJm9teE5vZGUpOwpAQCAtODQyMiwxNCArODY5NSwxNyBAQAogICAgICAgICBpZiAob214Tm9kZS0+Y29uZmlndXJlVmlkZW9UdW5uZWxNb2RlKAogICAgICAgICAgICAgICAgIGtQb3J0SW5kZXhPdXRwdXQsIE9NWF9UUlVFLCAwLCAmc2lkZWJhbmRIYW5kbGUpID09IE9LKSB7CiAgICAgICAgICAgICAvLyB0dW5uZWxlZCBwbGF5YmFjayBpbmNsdWRlcyBhZGFwdGl2ZSBwbGF5YmFjawotICAgICAgICAgICAgY2Fwcy0+YWRkRmxhZ3MoTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6a0ZsYWdTdXBwb3J0c0FkYXB0aXZlUGxheWJhY2sKLSAgICAgICAgICAgICAgICAgICAgfCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjprRmxhZ1N1cHBvcnRzVHVubmVsZWRQbGF5YmFjayk7Ci0gICAgICAgIH0gZWxzZSBpZiAob214Tm9kZS0+c2V0UG9ydE1vZGUoCi0gICAgICAgICAgICAgICAga1BvcnRJbmRleE91dHB1dCwgSU9NWDo6a1BvcnRNb2RlRHluYW1pY0FOV0J1ZmZlcikgPT0gT0sgfHwKLSAgICAgICAgICAgICAgICBvbXhOb2RlLT5wcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjaygKLSAgICAgICAgICAgICAgICBrUG9ydEluZGV4T3V0cHV0LCBPTVhfVFJVRSwKLSAgICAgICAgICAgICAgICAxMjgwIC8qIHdpZHRoICovLCA3MjAgLyogaGVpZ2h0ICovKSA9PSBPSykgewotICAgICAgICAgICAgY2Fwcy0+YWRkRmxhZ3MoTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6a0ZsYWdTdXBwb3J0c0FkYXB0aXZlUGxheWJhY2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gdHVubmVsZWQgcGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZAorICAgICAgICAgICAgY2Fwcy0+cmVtb3ZlRGV0YWlsKE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZFQVRVUkVfVFVOTkVMRURfUExBWUJBQ0spOworICAgICAgICAgICAgaWYgKG9teE5vZGUtPnNldFBvcnRNb2RlKAorICAgICAgICAgICAgICAgICAgICBrUG9ydEluZGV4T3V0cHV0LCBJT01YOjprUG9ydE1vZGVEeW5hbWljQU5XQnVmZmVyKSAhPSBPSyAmJgorICAgICAgICAgICAgICAgICAgICBvbXhOb2RlLT5wcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIGtQb3J0SW5kZXhPdXRwdXQsIE9NWF9UUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgMTI4MCAvKiB3aWR0aCAqLywgNzIwIC8qIGhlaWdodCAqLykgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAvLyBhZGFwdGl2ZSBwbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgY2Fwcy0+cmVtb3ZlRGV0YWlsKE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZFQVRVUkVfQURBUFRJVkVfUExBWUJBQ0spOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC04NDM3LDExICs4NzEzLDIwIEBACiAgICAgICAgIE9NWF9WSURFT19DT05GSUdfQU5EUk9JRF9JTlRSQVJFRlJFU0hUWVBFIHBhcmFtczsKICAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW1zKTsKICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OwotICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2UgdmVyaWZ5IGlmIGZhbGxiYWNrIGlzIHN1cHBvcnRlZD8KKworICAgICAgICBPTVhfVklERU9fUEFSQU1fSU5UUkFSRUZSRVNIVFlQRSBmYWxsYmFja1BhcmFtczsKKyAgICAgICAgSW5pdE9NWFBhcmFtcygmZmFsbGJhY2tQYXJhbXMpOworICAgICAgICBmYWxsYmFja1BhcmFtcy5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKyAgICAgICAgZmFsbGJhY2tQYXJhbXMuZVJlZnJlc2hNb2RlID0gT01YX1ZJREVPX0ludHJhUmVmcmVzaEN5Y2xpYzsKKwogICAgICAgICBpZiAob214Tm9kZS0+Z2V0Q29uZmlnKAogICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleENvbmZpZ0FuZHJvaWRJbnRyYVJlZnJlc2gsCi0gICAgICAgICAgICAgICAgJnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpID09IE9LKSB7Ci0gICAgICAgICAgICBjYXBzLT5hZGRGbGFncyhNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjprRmxhZ1N1cHBvcnRzSW50cmFSZWZyZXNoKTsKKyAgICAgICAgICAgICAgICAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSkgIT0gT0sgJiYKKyAgICAgICAgICAgICAgICBvbXhOb2RlLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgIE9NWF9JbmRleFBhcmFtVmlkZW9JbnRyYVJlZnJlc2gsICZmYWxsYmFja1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGZhbGxiYWNrUGFyYW1zKSkgIT0gT0spIHsKKyAgICAgICAgICAgIC8vIGludHJhIHJlZnJlc2ggaXMgbm90IHN1cHBvcnRlZAorICAgICAgICAgICAgY2Fwcy0+cmVtb3ZlRGV0YWlsKE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZFQVRVUkVfSU5UUkFfUkVGUkVTSCk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlY0J1ZmZlckNoYW5uZWwuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKaW5kZXggNzEwYWU2OC4uMjY2YTI0MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKQEAgLTEyOSw2ICsxMjksNyBAQAogICAgICAgICBzZWN1cmVIYW5kbGUgPSBzdGF0aWNfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4oc2VjdXJlRGF0YS0+Z2V0RGVzdGluYXRpb25Qb2ludGVyKCkpOwogICAgIH0KICAgICBzc2l6ZV90IHJlc3VsdCA9IC0xOworICAgIHNzaXplX3QgY29kZWNEYXRhT2Zmc2V0ID0gMDsKICAgICBpZiAobUNyeXB0byAhPSBOVUxMKSB7CiAgICAgICAgIElDcnlwdG86OkRlc3RpbmF0aW9uQnVmZmVyIGRlc3RpbmF0aW9uOwogICAgICAgICBpZiAoc2VjdXJlKSB7CkBAIC0xODAsOSArMTgxLDE2IEBACiAKICAgICAgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7CiAgICAgICAgIGhpZGxfc3RyaW5nIGRldGFpbGVkRXJyb3I7CisgICAgICAgIFNjcmFtYmxpbmdDb250cm9sIHNjdHJsID0gU2NyYW1ibGluZ0NvbnRyb2w6OlVOU0NSQU1CTEVEOworCisgICAgICAgIGlmIChrZXkgIT0gTlVMTCkgeworICAgICAgICAgICAgc2N0cmwgPSAoU2NyYW1ibGluZ0NvbnRyb2wpa2V5WzBdOworICAgICAgICAgICAgLy8gQWRqdXN0IGZvciB0aGUgUEVTIG9mZnNldAorICAgICAgICAgICAgY29kZWNEYXRhT2Zmc2V0ID0ga2V5WzJdIHwgKGtleVszXSA8PCA4KTsKKyAgICAgICAgfQogCiAgICAgICAgIGF1dG8gcmV0dXJuVm9pZCA9IG1EZXNjcmFtYmxlci0+ZGVzY3JhbWJsZSgKLSAgICAgICAgICAgICAgICBrZXkgIT0gTlVMTCA/IChTY3JhbWJsaW5nQ29udHJvbClrZXlbMF0gOiBTY3JhbWJsaW5nQ29udHJvbDo6VU5TQ1JBTUJMRUQsCisgICAgICAgICAgICAgICAgc2N0cmwsCiAgICAgICAgICAgICAgICAgaGlkbFN1YlNhbXBsZXMsCiAgICAgICAgICAgICAgICAgc3JjQnVmZmVyLAogICAgICAgICAgICAgICAgIDAsCkBAIC0yMDIsNiArMjEwLDExIEBACiAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgfQogCisgICAgICAgIGlmIChyZXN1bHQgPCBjb2RlY0RhdGFPZmZzZXQpIHsKKyAgICAgICAgICAgIEFMT0dEKCJpbnZhbGlkIGNvZGVjIGRhdGEgb2Zmc2V0OiAlemQsIHJlc3VsdCAlemQiLCBjb2RlY0RhdGFPZmZzZXQsIHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKICAgICAgICAgQUxPR1YoImRlc2NyYW1ibGUgc3VjY2VlZGVkLCAlemQgYnl0ZXMiLCByZXN1bHQpOwogCiAgICAgICAgIGlmIChkc3RCdWZmZXIudHlwZSA9PSBCdWZmZXJUeXBlOjpTSEFSRURfTUVNT1JZKSB7CkBAIC0yMTAsNyArMjIzLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGl0LT5tQ29kZWNCdWZmZXItPnNldFJhbmdlKDAsIHJlc3VsdCk7CisgICAgaXQtPm1Db2RlY0J1ZmZlci0+c2V0UmFuZ2UoY29kZWNEYXRhT2Zmc2V0LCByZXN1bHQgLSBjb2RlY0RhdGFPZmZzZXQpOwogCiAgICAgLy8gQ29weSBtZXRhZGF0YSBmcm9tIGNsaWVudCB0byBjb2RlYyBidWZmZXIuCiAgICAgaXQtPm1Db2RlY0J1ZmZlci0+bWV0YSgpLT5jbGVhcigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODliOGIwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitBU3RhdGU6OkFTdGF0ZShjb25zdCBzcDxBU3RhdGU+ICZwYXJlbnRTdGF0ZSkKKyAgICA6IG1QYXJlbnRTdGF0ZShwYXJlbnRTdGF0ZSkgeworfQorCitBU3RhdGU6On5BU3RhdGUoKSB7Cit9CisKK3NwPEFTdGF0ZT4gQVN0YXRlOjpwYXJlbnRTdGF0ZSgpIHsKKyAgICByZXR1cm4gbVBhcmVudFN0YXRlOworfQorCit2b2lkIEFTdGF0ZTo6c3RhdGVFbnRlcmVkKCkgeworfQorCit2b2lkIEFTdGF0ZTo6c3RhdGVFeGl0ZWQoKSB7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6OkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUoKSB7Cit9CisKK0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6On5BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lKCkgeworfQorCit2b2lkIEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6OmhhbmRsZU1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzcDxBU3RhdGU+IHNhdmUgPSBtU3RhdGU7CisKKyAgICBzcDxBU3RhdGU+IGN1ciA9IG1TdGF0ZTsKKyAgICB3aGlsZSAoY3VyICE9IE5VTEwgJiYgIWN1ci0+b25NZXNzYWdlUmVjZWl2ZWQobXNnKSkgeworICAgICAgICAvLyBJZiB5b3UgY2xhaW0gbm90IHRvIGhhdmUgaGFuZGxlZCB0aGUgbWVzc2FnZSB5b3Ugc2hvdWxkbid0CisgICAgICAgIC8vIGhhdmUgY2FsbGVkIHNldFN0YXRlLi4uCisgICAgICAgIENIRUNLKHNhdmUgPT0gbVN0YXRlKTsKKworICAgICAgICBjdXIgPSBjdXItPnBhcmVudFN0YXRlKCk7CisgICAgfQorCisgICAgaWYgKGN1ciAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVygiV2FybmluZyBtZXNzYWdlICVzIHVuaGFuZGxlZCBpbiByb290IHN0YXRlLiIsCisgICAgICAgICBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7Cit9CisKK3ZvaWQgQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTo6Y2hhbmdlU3RhdGUoY29uc3Qgc3A8QVN0YXRlPiAmc3RhdGUpIHsKKyAgICBpZiAoc3RhdGUgPT0gbVN0YXRlKSB7CisgICAgICAgIC8vIFF1aWNrIGV4aXQgZm9yIHRoZSBlYXN5IGNhc2UuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWZWN0b3I8c3A8QVN0YXRlPiA+IEE7CisgICAgc3A8QVN0YXRlPiBjdXIgPSBtU3RhdGU7CisgICAgZm9yICg7OykgeworICAgICAgICBBLnB1c2goY3VyKTsKKyAgICAgICAgaWYgKGN1ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjdXIgPSBjdXItPnBhcmVudFN0YXRlKCk7CisgICAgfQorCisgICAgVmVjdG9yPHNwPEFTdGF0ZT4gPiBCOworICAgIGN1ciA9IHN0YXRlOworICAgIGZvciAoOzspIHsKKyAgICAgICAgQi5wdXNoKGN1cik7CisgICAgICAgIGlmIChjdXIgPT0gTlVMTCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY3VyID0gY3VyLT5wYXJlbnRTdGF0ZSgpOworICAgIH0KKworICAgIC8vIFJlbW92ZSB0aGUgY29tbW9uIHRhaWwuCisgICAgd2hpbGUgKEEuc2l6ZSgpID4gMCAmJiBCLnNpemUoKSA+IDAgJiYgQS50b3AoKSA9PSBCLnRvcCgpKSB7CisgICAgICAgIEEucG9wKCk7CisgICAgICAgIEIucG9wKCk7CisgICAgfQorCisgICAgbVN0YXRlID0gc3RhdGU7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEEuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgQS5lZGl0SXRlbUF0KGkpLT5zdGF0ZUV4aXRlZCgpOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSBCLnNpemUoKTsgaSA+IDA7KSB7CisgICAgICAgIGktLTsKKyAgICAgICAgQi5lZGl0SXRlbUF0KGkpLT5zdGF0ZUVudGVyZWQoKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmNwcAppbmRleCA0MTEwNmExLi4yNGY2ZjBiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUldyaXRlci5jcHAKQEAgLTE0OSwxMSArMTQ5LDExIEBACiAgICAgbURvbmUgPSB0cnVlOwogCiAgICAgdm9pZCAqZHVtbXk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVNvdXJjZS0+c3RvcCgpOwogICAgIHB0aHJlYWRfam9pbihtVGhyZWFkLCAmZHVtbXkpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihkdW1teSkpOwogICAgIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVNvdXJjZS0+c3RvcCgpOwogICAgICAgICBpZiAoZXJyID09IE9LICYmCiAgICAgICAgICAgICAoc3RhdHVzICE9IE9LICYmIHN0YXR1cyAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSkgewogICAgICAgICAgICAgZXJyID0gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKaW5kZXggNDhlMzUxYi4uOTE3MDgwNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwCkBAIC0xOCw5ICsxOCw2IEBACiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAogCiAgICAgc2hhcmVkX2xpYnM6IFsibGlibWVkaWEiXSwKQEAgLTQwLDEyICszNyw5IEBACiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAogCi0gICAgc2hhcmVkX2xpYnM6IFsibGlibWVkaWEiXSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJtZWRpYSIsICJsaWJtZWRpYW5kayJdLAogfQogCiBjY19saWJyYXJ5X3NoYXJlZCB7CkBAIC04MCwyMiArNzQsNTQgQEAKICAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAogfQogCi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X21wZWcyZXh0cmFjdG9yIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlV0aWxzLmNwcCIsCisgICAgICAgICJNZWRpYVNvdXJjZS5jcHAiLAorICAgICAgICAiSGV2Y1V0aWxzLmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVduby1tdWx0aWNoYXIiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQorCitjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHQiLAogCiAgICAgc3JjczogWworICAgICAgICAiQUFDV3JpdGVyLmNwcCIsCiAgICAgICAgICJBQ29kZWMuY3BwIiwKICAgICAgICAgIkFDb2RlY0J1ZmZlckNoYW5uZWwuY3BwIiwKLSAgICAgICAgIkFBQ1dyaXRlci5jcHAiLAorICAgICAgICAiQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAiLAogICAgICAgICAiQU1SV3JpdGVyLmNwcCIsCiAgICAgICAgICJBdWRpb1BsYXllci5jcHAiLAotICAgICAgICAiQXVkaW9QcmVzZW50YXRpb25JbmZvLmNwcCIsCiAgICAgICAgICJBdWRpb1NvdXJjZS5jcHAiLAogICAgICAgICAiQnVmZmVySW1wbC5jcHAiLAogICAgICAgICAiQ2FsbGJhY2tEYXRhU291cmNlLmNwcCIsCkBAIC0xMDMsOCArMTI5LDEwIEBACiAgICAgICAgICJDYW1lcmFTb3VyY2UuY3BwIiwKICAgICAgICAgIkNhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAiLAogICAgICAgICAiRGF0YUNvbnZlcnRlci5jcHAiLAorICAgICAgICAiRGF0YVNvdXJjZUJhc2UuY3BwIiwKICAgICAgICAgIkRhdGFTb3VyY2VGYWN0b3J5LmNwcCIsCiAgICAgICAgICJEYXRhVVJJU291cmNlLmNwcCIsCisgICAgICAgICJDbGVhckZpbGVTb3VyY2UuY3BwIiwKICAgICAgICAgIkZpbGVTb3VyY2UuY3BwIiwKICAgICAgICAgIkZyYW1lRGVjb2Rlci5jcHAiLAogICAgICAgICAiSFRUUEJhc2UuY3BwIiwKQEAgLTExOSwxMiArMTQ3LDE3IEBACiAgICAgICAgICJNZWRpYUNvZGVjTGlzdC5jcHAiLAogICAgICAgICAiTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuY3BwIiwKICAgICAgICAgIk1lZGlhQ29kZWNTb3VyY2UuY3BwIiwKKyAgICAgICAgIk1lZGlhRXh0cmFjdG9yLmNwcCIsCiAgICAgICAgICJNZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwIiwKKyAgICAgICAgIk1lZGlhU291cmNlLmNwcCIsCiAgICAgICAgICJNZWRpYVN5bmMuY3BwIiwKKyAgICAgICAgIk1lZGlhVHJhY2suY3BwIiwKKyAgICAgICAgImh0dHAvQ2xlYXJNZWRpYUhUVFAuY3BwIiwKICAgICAgICAgImh0dHAvTWVkaWFIVFRQLmNwcCIsCiAgICAgICAgICJNZWRpYU11eGVyLmNwcCIsCiAgICAgICAgICJOdUNhY2hlZFNvdXJjZTIuY3BwIiwKICAgICAgICAgIk51TWVkaWFFeHRyYWN0b3IuY3BwIiwKKyAgICAgICAgIk9nZ1dyaXRlci5jcHAiLAogICAgICAgICAiT01YQ2xpZW50LmNwcCIsCiAgICAgICAgICJPbXhJbmZvQnVpbGRlci5jcHAiLAogICAgICAgICAiUmVtb3RlTWVkaWFFeHRyYWN0b3IuY3BwIiwKQEAgLTEzNyw0MyArMTcwLDQwIEBACiAgICAgICAgICJTdXJmYWNlVXRpbHMuY3BwIiwKICAgICAgICAgIlV0aWxzLmNwcCIsCiAgICAgICAgICJUaHJvdHRsZWRTb3VyY2UuY3BwIiwKKyAgICAgICAgIlZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmNwcCIsCiAgICAgICAgICJWaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcCIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmNhbWVyYV9jbGllbnQiLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmRsIiwKKyAgICAgICAgImxpYmRsX2FuZHJvaWQiLAogICAgICAgICAibGliZHJtZnJhbWV3b3JrIiwKICAgICAgICAgImxpYmd1aSIsCi0gICAgICAgICJsaWJpb24iLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYm1lZGlhIiwKICAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgICAgICJsaWJtZWRpYV9vbXhfY2xpZW50IiwKICAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKICAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCiAgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKLSAgICAgICAgImxpYm5ldGRfY2xpZW50IiwKICAgICAgICAgImxpYnVpIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9jb2RlY2Jhc2UiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXhfdXRpbHMiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIiwKICAgICAgICAgImxpYlJTY3BwIiwKICAgICAgICAgImxpYmhpZGxhbGxvY2F0b3J1dGlscyIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCiAgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKLSAgICAgICAgImxpYnppcGFyY2hpdmUiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXMubmF0aXZlQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5hbGxvY2F0b3JAMi4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MubWFwcGVyQDIuMCIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCkBAIC0xODIsMTQgKzIxMiwyMiBAQAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfbWVkaWFmaWx0ZXIiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfd2VibSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF90aW1lZHRleHQiLAotICAgICAgICAibGlidnB4IiwKKyAgICAgICAgImxpYm9nZyIsCiAgICAgICAgICJsaWJ3ZWJtIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaWQzIiwKICAgICAgICAgImxpYkZMQUMiLAogICAgIF0sCiAKKyAgICBoZWFkZXJfbGliczpbCisgICAgICAgICJsaWJuYXRpdmVsb2FkZXItZHVtbXktaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXJfaGVhZGVycyIsCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCisgICAgXSwKKwogICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKICAgICAgICAgImxpYm1lZGlhIiwKICAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKICAgICBdLApAQCAtMjIwLDY0ICsyNTgsMzkgQEAKICAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAogfQogCi1jY19saWJyYXJ5IHsKK2NjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfcGxheWVyMiIsCiAKICAgICBzcmNzOiBbCi0gICAgICAgICJDYWxsYmFja0RhdGFTb3VyY2UuY3BwIiwKLSAgICAgICAgIkNhbGxiYWNrTWVkaWFTb3VyY2UuY3BwIiwKLSAgICAgICAgIkRhdGFTb3VyY2VGYWN0b3J5LmNwcCIsCisgICAgICAgICJDbGVhckZpbGVTb3VyY2UuY3BwIiwKICAgICAgICAgIkRhdGFVUklTb3VyY2UuY3BwIiwKLSAgICAgICAgIkZpbGVTb3VyY2UuY3BwIiwKKyAgICAgICAgIkRhdGFTb3VyY2VCYXNlLmNwcCIsCiAgICAgICAgICJIVFRQQmFzZS5jcHAiLAogICAgICAgICAiSGV2Y1V0aWxzLmNwcCIsCi0gICAgICAgICJJbnRlcmZhY2VVdGlscy5jcHAiLAogICAgICAgICAiTWVkaWFDbG9jay5jcHAiLAotICAgICAgICAiTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcCIsCisgICAgICAgICJNZWRpYVNvdXJjZS5jcHAiLAogICAgICAgICAiTmRrVXRpbHMuY3BwIiwKLSAgICAgICAgIk51Q2FjaGVkU291cmNlMi5jcHAiLAotICAgICAgICAiUmVtb3RlTWVkaWFFeHRyYWN0b3IuY3BwIiwKLSAgICAgICAgIlJlbW90ZU1lZGlhU291cmNlLmNwcCIsCiAgICAgICAgICJVdGlscy5jcHAiLAotICAgICAgICAiVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAiLAotICAgICAgICAiaHR0cC9NZWRpYUhUVFAuY3BwIiwKKyAgICAgICAgIlZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmNwcCIsCisgICAgICAgICJWaWRlb0ZyYW1lU2NoZWR1bGVyMi5jcHAiLAorICAgICAgICAiaHR0cC9DbGVhck1lZGlhSFRUUC5jcHAiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJkcm1mcmFtZXdvcmsiLAogICAgICAgICAibGliZ3VpIiwKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYV9wbGF5ZXIyX3V0aWwiLAotICAgICAgICAibGliYXVkaW9jbGllbnQiLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAotICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKLSAgICAgICAgImxpYm1lZGlhdXRpbHMiLAogICAgICAgICAibGlibmV0ZF9jbGllbnQiLAotICAgICAgICAibGlidWkiLAogICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGliemlwYXJjaGl2ZSIsCisgICAgICAgICJsaWJhbmRyb2lkIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAotICAgIF0sCi0KLSAgICBoZWFkZXJfbGliczpbCi0gICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCi0gICAgXSwKLQotICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKICAgICAgICAgImxpYm1lZGlhX3BsYXllcjJfdXRpbCIsCisgICAgICAgICJsaWJtZWRpYTJfam5pX2NvcmUiLAogICAgIF0sCiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCkBAIC0zMDQsMjcgKzMxNyw2IEBACiAgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKIH0KIAotc3ViZGlycyA9IFsKLSAgICAiY29kZWMyIiwKLSAgICAiY29kZWNzLyoiLAotICAgICJjb2xvcmNvbnZlcnNpb24iLAotICAgICJmaWx0ZXJzIiwKLSAgICAiZmxhYy9kZWMiLAotICAgICJmb3VuZGF0aW9uIiwKLSAgICAiaHR0cCIsCi0gICAgImh0dHBsaXZlIiwKLSAgICAiaWQzIiwKLSAgICAibXBlZzJ0cyIsCi0gICAgIm9teCIsCi0gICAgInJ0c3AiLAotICAgICJ0ZXN0cyIsCi0gICAgInRpbWVkdGV4dCIsCi0gICAgIndlYm0iLAotICAgICJ4bWxwYXJzZXIiLAotXQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCmluZGV4IGE2ZjBhMGIuLjE5OWI1N2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1BsYXllci5jcHAKQEAgLTExOCw2ICsxMTgsMTMgQEAKICAgICB9CiAKICAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisKKyAgICBpZiAoZm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIk5vIG1ldGFkYXRhIGIvMTE4NjIwODcxIik7CisgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTE4NjIwODcxIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCiAgICAgY29uc3QgY2hhciAqbWltZTsKICAgICBib29sIHN1Y2Nlc3MgPSBmb3JtYXQtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOwogICAgIENIRUNLKHN1Y2Nlc3MpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QcmVzZW50YXRpb25JbmZvLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUHJlc2VudGF0aW9uSW5mby5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2ZTE4NTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9QcmVzZW50YXRpb25JbmZvLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyAjZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJBdWRpb1ByZXNlbnRhdGlvbkluZm8iCi0KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1ByZXNlbnRhdGlvbkluZm8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1BdWRpb1ByZXNlbnRhdGlvbkluZm86OkF1ZGlvUHJlc2VudGF0aW9uSW5mbygpIHsKLX0KLQotQXVkaW9QcmVzZW50YXRpb25JbmZvOjp+QXVkaW9QcmVzZW50YXRpb25JbmZvKCkgewotICAgIG1QcmVzZW50YXRpb25zLmNsZWFyKCk7Ci19Ci0KLXZvaWQgQXVkaW9QcmVzZW50YXRpb25JbmZvOjphZGRQcmVzZW50YXRpb24oc3A8QXVkaW9QcmVzZW50YXRpb24+IHByZXNlbnRhdGlvbikgewotICAgIG1QcmVzZW50YXRpb25zLnB1c2gocHJlc2VudGF0aW9uKTsKLX0KLQotc2l6ZV90IEF1ZGlvUHJlc2VudGF0aW9uSW5mbzo6Y291bnRQcmVzZW50YXRpb25zKCkgY29uc3QgewotICAgIHJldHVybiBtUHJlc2VudGF0aW9ucy5zaXplKCk7Ci19Ci0KLS8vIFJldHVybnMgYW4gQXVkaW9QcmVzZW50YXRpb24gZm9yIHRoZSBnaXZlbiB2YWxpZCBpbmRleAotLy8gaW5kZXggbXVzdCBiZSA+PTAgYW5kIDwgY291bnRQcmVzZW50YXRpb25zKCkKLWNvbnN0IHNwPEF1ZGlvUHJlc2VudGF0aW9uPiBBdWRpb1ByZXNlbnRhdGlvbkluZm86OmdldFByZXNlbnRhdGlvbihzaXplX3QgaW5kZXgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVByZXNlbnRhdGlvbnNbaW5kZXhdOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwCmluZGV4IDJhZTMyMTguLmQ3OGQ3MjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAKQEAgLTUyLDcgKzUyLDkgQEAKIEF1ZGlvU291cmNlOjpBdWRpb1NvdXJjZSgKICAgICAgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsIGNvbnN0IFN0cmluZzE2ICZvcFBhY2thZ2VOYW1lLAogICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLCB1aW50MzJfdCBjaGFubmVsQ291bnQsIHVpbnQzMl90IG91dFNhbXBsZVJhdGUsCi0gICAgICAgIHVpZF90IHVpZCwgcGlkX3QgcGlkLCBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQpCisgICAgICAgIHVpZF90IHVpZCwgcGlkX3QgcGlkLCBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3Qgc2VsZWN0ZWRNaWNEaXJlY3Rpb24sCisgICAgICAgIGZsb2F0IHNlbGVjdGVkTWljRmllbGREaW1lbnNpb24pCiAgICAgOiBtU3RhcnRlZChmYWxzZSksCiAgICAgICBtU2FtcGxlUmF0ZShzYW1wbGVSYXRlKSwKICAgICAgIG1PdXRTYW1wbGVSYXRlKG91dFNhbXBsZVJhdGUgPiAwID8gb3V0U2FtcGxlUmF0ZSA6IHNhbXBsZVJhdGUpLApAQCAtMTAzLDcgKzEwNSw5IEBACiAgICAgICAgICAgICAgICAgICAgIHVpZCwKICAgICAgICAgICAgICAgICAgICAgcGlkLAogICAgICAgICAgICAgICAgICAgICBOVUxMIC8qcEF0dHJpYnV0ZXMqLywKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWREZXZpY2VJZCk7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkTWljRGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZE1pY0ZpZWxkRGltZW5zaW9uKTsKICAgICAgICAgbUluaXRDaGVjayA9IG1SZWNvcmQtPmluaXRDaGVjaygpOwogICAgICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewogICAgICAgICAgICAgbVJlY29yZC5jbGVhcigpOwpAQCAtMzM3LDcgKzM0MSw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiBpbiBub3JtYWwgY2FzZS4KICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBnZXQgYXVkaW8gdGltZXN0YW1wLCBmYWxsYmFjayB0byB1c2Ugc3lzdGVtY2xvY2siKTsKLSAgICAgICAgdGltZVVzID0gc3lzdGVtVGltZSgpIC8gMTAwMGxsOworICAgICAgICB0aW1lVXMgPSBzeXN0ZW1UaW1lKCkgLyAxMDAwTEw7CiAgICAgICAgIC8vIEVzdGltYXRlIHRoZSByZWFsIHNhbXBsaW5nIHRpbWUgb2YgdGhlIDFzdCBzYW1wbGUgaW4gdGhpcyBidWZmZXIKICAgICAgICAgLy8gZnJvbSBBdWRpb1JlY29yZCdzIGxhdGVuY3kuIChBcHBseSB0aGlzIGFkanVzdG1lbnQgZmlyc3Qgc28gdGhhdAogICAgICAgICAvLyB0aGUgc3RhcnQgdGltZSBsb2dpYyBpcyBub3QgYWZmZWN0ZWQuKQpAQCAtMzgxLDExICszODUsMTEgQEAKICAgICB9CiAgICAgbUxhc3RGcmFtZVRpbWVzdGFtcFVzID0gdGltZVVzOwogCi0gICAgc2l6ZV90IG51bUxvc3RCeXRlcyA9IDA7CisgICAgdWludDY0X3QgbnVtTG9zdEJ5dGVzID0gMDsgLy8gQXVkaW9SZWNvcmQ6OmdldElucHV0RnJhbWVzTG9zdCgpIHJldHVybnMgdWludDMyX3QKICAgICBpZiAobU51bUZyYW1lc1JlY2VpdmVkID4gMCkgeyAgLy8gSWdub3JlIGVhcmxpZXIgZnJhbWUgbG9zdAogICAgICAgICAvLyBnZXRJbnB1dEZyYW1lc0xvc3QoKSByZXR1cm5zIHRoZSBudW1iZXIgb2YgbG9zdCBmcmFtZXMuCiAgICAgICAgIC8vIENvbnZlcnQgbnVtYmVyIG9mIGZyYW1lcyBsb3N0IHRvIG51bWJlciBvZiBieXRlcyBsb3N0LgotICAgICAgICBudW1Mb3N0Qnl0ZXMgPSBtUmVjb3JkLT5nZXRJbnB1dEZyYW1lc0xvc3QoKSAqIG1SZWNvcmQtPmZyYW1lU2l6ZSgpOworICAgICAgICBudW1Mb3N0Qnl0ZXMgPSAodWludDY0X3QpbVJlY29yZC0+Z2V0SW5wdXRGcmFtZXNMb3N0KCkgKiBtUmVjb3JkLT5mcmFtZVNpemUoKTsKICAgICB9CiAKICAgICBDSEVDS19FUShudW1Mb3N0Qnl0ZXMgJiAxLCAwdSk7CkBAIC0zOTMsMTEgKzM5NywxMSBAQAogICAgIGlmIChudW1Mb3N0Qnl0ZXMgPiAwKSB7CiAgICAgICAgIC8vIExvc3Mgb2YgYXVkaW8gZnJhbWVzIHNob3VsZCBoYXBwZW4gcmFyZWx5OyB0aHVzIHRoZSBMT0dXIHNob3VsZAogICAgICAgICAvLyBub3QgY2F1c2UgYSBsb2dnaW5nIHNwYW0KLSAgICAgICAgQUxPR1coIkxvc3QgYXVkaW8gcmVjb3JkIGRhdGE6ICV6dSBieXRlcyIsIG51bUxvc3RCeXRlcyk7CisgICAgICAgIEFMT0dXKCJMb3N0IGF1ZGlvIHJlY29yZCBkYXRhOiAlIiBQUkl1NjQgIiBieXRlcyIsIG51bUxvc3RCeXRlcyk7CiAgICAgfQogCiAgICAgd2hpbGUgKG51bUxvc3RCeXRlcyA+IDApIHsKLSAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUgPSBudW1Mb3N0Qnl0ZXM7CisgICAgICAgIHVpbnQ2NF90IGJ1ZmZlclNpemUgPSBudW1Mb3N0Qnl0ZXM7CiAgICAgICAgIGlmIChudW1Mb3N0Qnl0ZXMgPiBrTWF4QnVmZmVyU2l6ZSkgewogICAgICAgICAgICAgbnVtTG9zdEJ5dGVzIC09IGtNYXhCdWZmZXJTaXplOwogICAgICAgICAgICAgYnVmZmVyU2l6ZSA9IGtNYXhCdWZmZXJTaXplOwpAQCAtNDI3LDE5ICs0MzEsMTcgQEAKIHZvaWQgQXVkaW9Tb3VyY2U6OnF1ZXVlSW5wdXRCdWZmZXJfbChNZWRpYUJ1ZmZlciAqYnVmZmVyLCBpbnQ2NF90IHRpbWVVcykgewogICAgIGNvbnN0IHNpemVfdCBidWZmZXJTaXplID0gYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKICAgICBjb25zdCBzaXplX3QgZnJhbWVTaXplID0gbVJlY29yZC0+ZnJhbWVTaXplKCk7Ci0gICAgY29uc3QgaW50NjRfdCB0aW1lc3RhbXBVcyA9Ci0gICAgICAgICAgICAgICAgbVByZXZTYW1wbGVUaW1lVXMgKwotICAgICAgICAgICAgICAgICAgICAoKDEwMDAwMDBMTCAqIChidWZmZXJTaXplIC8gZnJhbWVTaXplKSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgKG1TYW1wbGVSYXRlID4+IDEpKSAvIG1TYW1wbGVSYXRlOwotCiAgICAgaWYgKG1OdW1GcmFtZXNSZWNlaXZlZCA9PSAwKSB7CiAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleUFuY2hvclRpbWUsIG1TdGFydFRpbWVVcyk7CiAgICAgfQotCisgICAgbU51bUZyYW1lc1JlY2VpdmVkICs9IGJ1ZmZlclNpemUgLyBmcmFtZVNpemU7CisgICAgY29uc3QgaW50NjRfdCB0aW1lc3RhbXBVcyA9CisgICAgICAgICAgICAgICAgbVN0YXJ0VGltZVVzICsKKyAgICAgICAgICAgICAgICAgICAgKCgxMDAwMDAwTEwgKiBtTnVtRnJhbWVzUmVjZWl2ZWQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIChtU2FtcGxlUmF0ZSA+PiAxKSkgLyBtU2FtcGxlUmF0ZTsKICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCBtUHJldlNhbXBsZVRpbWVVcyk7CiAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5RHJpZnRUaW1lLCB0aW1lVXMgLSBtSW5pdGlhbFJlYWRUaW1lVXMpOwogICAgIG1QcmV2U2FtcGxlVGltZVVzID0gdGltZXN0YW1wVXM7Ci0gICAgbU51bUZyYW1lc1JlY2VpdmVkICs9IGJ1ZmZlclNpemUgLyBmcmFtZVNpemU7CiAgICAgbUJ1ZmZlcnNSZWNlaXZlZC5wdXNoX2JhY2soYnVmZmVyKTsKICAgICBtRnJhbWVBdmFpbGFibGVDb25kaXRpb24uc2lnbmFsKCk7CiB9CkBAIC01MDYsNCArNTA4LDI3IEBACiAgICAgcmV0dXJuIE5PX0lOSVQ7CiB9CiAKK3N0YXR1c190IEF1ZGlvU291cmNlOjpzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSB7CisgICAgQUxPR1YoInNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oJWQpIiwgZGlyZWN0aW9uKTsKKyAgICBpZiAobVJlY29yZCAhPSAwKSB7CisgICAgICAgIHJldHVybiBtUmVjb3JkLT5zZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGRpcmVjdGlvbik7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCitzdGF0dXNfdCBBdWRpb1NvdXJjZTo6c2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pIHsKKyAgICBBTE9HVigic2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKCVmKSIsIHpvb20pOworICAgIGlmIChtUmVjb3JkICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1SZWNvcmQtPnNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbih6b29tKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKK3N0YXR1c190IEF1ZGlvU291cmNlOjpnZXRQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSBjb25zdCB7CisgICAgaWYgKG1SZWNvcmQgIT0gMCkgeworICAgICAgICAqcG9ydElkID0gbVJlY29yZC0+Z2V0UG9ydElkKCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbWVyYVNvdXJjZVRpbWVMYXBzZS5jcHAKaW5kZXggM2FkODJkOS4uMmE4MTlhZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlVGltZUxhcHNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9DYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIkNhbWVyYVNvdXJjZVRpbWVMYXBzZSIKIAorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeUJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5SGVhcEJhc2UuaD4KQEAgLTE3Miw4ICsxNzMsMTYgQEAKICAgICBBTE9HVigic2lnbmFsQnVmZmVyUmV0dXJuZWQiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVF1aWNrU3RvcExvY2spOwogICAgIGlmIChtUXVpY2tTdG9wICYmIChidWZmZXIgPT0gbUxhc3RSZWFkQnVmZmVyQ29weSkpIHsKKyAgICAgICAgaWYgKG1ldGFEYXRhU3RvcmVkSW5WaWRlb0J1ZmZlcnMoKSA9PSBrTWV0YWRhdGFCdWZmZXJUeXBlTmF0aXZlSGFuZGxlU291cmNlKSB7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9ICgKKyAgICAgICAgICAgICAgICAoVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSopKG1MYXN0UmVhZEJ1ZmZlckNvcHktPmRhdGEoKSkpLT5wSGFuZGxlOworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShoYW5kbGUpOworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGFuZGxlKTsKKyAgICAgICAgfQogICAgICAgICBidWZmZXItPnNldE9ic2VydmVyKE5VTEwpOwogICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgbUxhc3RSZWFkQnVmZmVyQ29weSA9IE5VTEw7CisgICAgICAgIG1Gb3JjZVJlYWQgPSB0cnVlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBDYW1lcmFTb3VyY2U6OnNpZ25hbEJ1ZmZlclJldHVybmVkKGJ1ZmZlcik7CiAgICAgfQpAQCAtMTgyLDcgKzE5MSw4IEBACiB2b2lkIGNyZWF0ZU1lZGlhQnVmZmVyQ29weSgKICAgICAgICAgY29uc3QgTWVkaWFCdWZmZXJCYXNlJiBzb3VyY2VCdWZmZXIsCiAgICAgICAgIGludDY0X3QgZnJhbWVUaW1lLAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipuZXdCdWZmZXIpIHsKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqbmV3QnVmZmVyLAorICAgICAgICBpbnQzMl90IHZpZGVvQnVmZmVyTW9kZSkgewogCiAgICAgQUxPR1YoImNyZWF0ZU1lZGlhQnVmZmVyQ29weSIpOwogICAgIHNpemVfdCBzb3VyY2VTaXplID0gc291cmNlQnVmZmVyLnNpemUoKTsKQEAgLTE5MiwxMyArMjAyLDIwIEBACiAgICAgbWVtY3B5KCgqbmV3QnVmZmVyKS0+ZGF0YSgpLCBzb3VyY2VQb2ludGVyLCBzb3VyY2VTaXplKTsKIAogICAgICgqbmV3QnVmZmVyKS0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIGZyYW1lVGltZSk7CisKKyAgICBpZiAodmlkZW9CdWZmZXJNb2RlID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVOYXRpdmVIYW5kbGVTb3VyY2UpIHsKKyAgICAgICAgKChWaWRlb05hdGl2ZUhhbmRsZU1ldGFkYXRhKikoKCpuZXdCdWZmZXIpLT5kYXRhKCkpKS0+cEhhbmRsZSA9CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb25lKAorICAgICAgICAgICAgICAgICgoVmlkZW9OYXRpdmVIYW5kbGVNZXRhZGF0YSopKHNvdXJjZUJ1ZmZlci5kYXRhKCkpKS0+cEhhbmRsZSk7CisgICAgfQogfQogCiB2b2lkIENhbWVyYVNvdXJjZVRpbWVMYXBzZTo6ZmlsbExhc3RSZWFkQnVmZmVyQ29weShNZWRpYUJ1ZmZlckJhc2UmIHNvdXJjZUJ1ZmZlcikgewogICAgIEFMT0dWKCJmaWxsTGFzdFJlYWRCdWZmZXJDb3B5Iik7CiAgICAgaW50NjRfdCBmcmFtZVRpbWU7CiAgICAgQ0hFQ0soc291cmNlQnVmZmVyLm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5VGltZSwgJmZyYW1lVGltZSkpOwotICAgIGNyZWF0ZU1lZGlhQnVmZmVyQ29weShzb3VyY2VCdWZmZXIsIGZyYW1lVGltZSwgJm1MYXN0UmVhZEJ1ZmZlckNvcHkpOworICAgIGNyZWF0ZU1lZGlhQnVmZmVyQ29weShzb3VyY2VCdWZmZXIsIGZyYW1lVGltZSwgJm1MYXN0UmVhZEJ1ZmZlckNvcHksCisgICAgICAgIG1ldGFEYXRhU3RvcmVkSW5WaWRlb0J1ZmZlcnMoKSk7CiAgICAgbUxhc3RSZWFkQnVmZmVyQ29weS0+YWRkX3JlZigpOwogICAgIG1MYXN0UmVhZEJ1ZmZlckNvcHktPnNldE9ic2VydmVyKHRoaXMpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2xlYXJGaWxlU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTNhMmNiNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5jcHAKQEAgLTAsMCArMSwxNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNsZWFyRmlsZVNvdXJjZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJGaWxlU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQ2xlYXJGaWxlU291cmNlOjpDbGVhckZpbGVTb3VyY2UoY29uc3QgY2hhciAqZmlsZW5hbWUpCisgICAgOiBtRmQoLTEpLAorICAgICAgbU9mZnNldCgwKSwKKyAgICAgIG1MZW5ndGgoLTEpLAorICAgICAgbU5hbWUoIjxudWxsPiIpIHsKKworICAgIGlmIChmaWxlbmFtZSkgeworICAgICAgICBtTmFtZSA9IFN0cmluZzg6OmZvcm1hdCgiRmlsZVNvdXJjZSglcykiLCBmaWxlbmFtZSk7CisgICAgfQorICAgIEFMT0dWKCIlcyIsIGZpbGVuYW1lKTsKKyAgICBtRmQgPSBvcGVuKGZpbGVuYW1lLCBPX0xBUkdFRklMRSB8IE9fUkRPTkxZKTsKKworICAgIGlmIChtRmQgPj0gMCkgeworICAgICAgICBtTGVuZ3RoID0gbHNlZWs2NChtRmQsIDAsIFNFRUtfRU5EKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9wZW4gZmlsZSAnJXMnLiAoJXMpIiwgZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisgICAgfQorfQorCitDbGVhckZpbGVTb3VyY2U6OkNsZWFyRmlsZVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkKKyAgICA6IG1GZChmZCksCisgICAgICBtT2Zmc2V0KG9mZnNldCksCisgICAgICBtTGVuZ3RoKGxlbmd0aCksCisgICAgICBtTmFtZSgiPG51bGw+IikgeworICAgIEFMT0dWKCJmZD0lZCAoJXMpLCBvZmZzZXQ9JWxsZCwgbGVuZ3RoPSVsbGQiLAorICAgICAgICAgICAgZmQsIG5hbWVGb3JGZChmZCkuY19zdHIoKSwgKGxvbmcgbG9uZykgb2Zmc2V0LCAobG9uZyBsb25nKSBsZW5ndGgpOworCisgICAgaWYgKG1PZmZzZXQgPCAwKSB7CisgICAgICAgIG1PZmZzZXQgPSAwOworICAgIH0KKyAgICBpZiAobUxlbmd0aCA8IDApIHsKKyAgICAgICAgbUxlbmd0aCA9IDA7CisgICAgfQorICAgIGlmIChtTGVuZ3RoID4gSU5UNjRfTUFYIC0gbU9mZnNldCkgeworICAgICAgICBtTGVuZ3RoID0gSU5UNjRfTUFYIC0gbU9mZnNldDsKKyAgICB9CisgICAgc3RydWN0IHN0YXQgczsKKyAgICBpZiAoZnN0YXQoZmQsICZzKSA9PSAwKSB7CisgICAgICAgIGlmIChtT2Zmc2V0ID4gcy5zdF9zaXplKSB7CisgICAgICAgICAgICBtT2Zmc2V0ID0gcy5zdF9zaXplOworICAgICAgICAgICAgbUxlbmd0aCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1PZmZzZXQgKyBtTGVuZ3RoID4gcy5zdF9zaXplKSB7CisgICAgICAgICAgICBtTGVuZ3RoID0gcy5zdF9zaXplIC0gbU9mZnNldDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobU9mZnNldCAhPSBvZmZzZXQgfHwgbUxlbmd0aCAhPSBsZW5ndGgpIHsKKyAgICAgICAgQUxPR1coIm9mZnNldC9sZW5ndGggYWRqdXN0ZWQgZnJvbSAlbGxkLyVsbGQgdG8gJWxsZC8lbGxkIiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBvZmZzZXQsIChsb25nIGxvbmcpIGxlbmd0aCwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBtT2Zmc2V0LCAobG9uZyBsb25nKSBtTGVuZ3RoKTsKKyAgICB9CisKKyAgICBtTmFtZSA9IFN0cmluZzg6OmZvcm1hdCgKKyAgICAgICAgICAgICJGaWxlU291cmNlKGZkKCVzKSwgJWxsZCwgJWxsZCkiLAorICAgICAgICAgICAgbmFtZUZvckZkKGZkKS5jX3N0cigpLAorICAgICAgICAgICAgKGxvbmcgbG9uZykgbU9mZnNldCwKKyAgICAgICAgICAgIChsb25nIGxvbmcpIG1MZW5ndGgpOworCit9CisKK0NsZWFyRmlsZVNvdXJjZTo6fkNsZWFyRmlsZVNvdXJjZSgpIHsKKyAgICBpZiAobUZkID49IDApIHsKKyAgICAgICAgOjpjbG9zZShtRmQpOworICAgICAgICBtRmQgPSAtMTsKKyAgICB9Cit9CisKK3N0YXR1c190IENsZWFyRmlsZVNvdXJjZTo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBtRmQgPj0gMCA/IE9LIDogTk9fSU5JVDsKK30KKworc3NpemVfdCBDbGVhckZpbGVTb3VyY2U6OnJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAobUZkIDwgMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGlmIChtTGVuZ3RoID49IDApIHsKKyAgICAgICAgaWYgKG9mZnNldCA+PSBtTGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm4gMDsgIC8vIHJlYWQgYmV5b25kIEVPRi4KKyAgICAgICAgfQorICAgICAgICB1aW50NjRfdCBudW1BdmFpbGFibGUgPSBtTGVuZ3RoIC0gb2Zmc2V0OworICAgICAgICBpZiAoKHVpbnQ2NF90KXNpemUgPiBudW1BdmFpbGFibGUpIHsKKyAgICAgICAgICAgIHNpemUgPSBudW1BdmFpbGFibGU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlYWRBdF9sKG9mZnNldCwgZGF0YSwgc2l6ZSk7Cit9CisKK3NzaXplX3QgQ2xlYXJGaWxlU291cmNlOjpyZWFkQXRfbChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBvZmY2NF90IHJlc3VsdCA9IGxzZWVrNjQobUZkLCBvZmZzZXQgKyBtT2Zmc2V0LCBTRUVLX1NFVCk7CisgICAgaWYgKHJlc3VsdCA9PSAtMSkgeworICAgICAgICBBTE9HRSgic2VlayB0byAlbGxkIGZhaWxlZCIsIChsb25nIGxvbmcpKG9mZnNldCArIG1PZmZzZXQpKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIDo6cmVhZChtRmQsIGRhdGEsIHNpemUpOworfQorCitzdGF0dXNfdCBDbGVhckZpbGVTb3VyY2U6OmdldFNpemUob2ZmNjRfdCAqc2l6ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobUZkIDwgMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICAqc2l6ZSA9IG1MZW5ndGg7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9EYXRhU291cmNlQmFzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhU291cmNlQmFzZS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL0RhdGFTb3VyY2VCYXNlLmNwcApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUJhc2UuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhVVJJU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuY3BwCmluZGV4IDNkYzM0NWYuLmI5NzViMzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuY3BwCkBAIC0xMyw3ICsxMyw2IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVVSSVNvdXJjZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CkBAIC0zOSwxNSArMzgsMjcgQEAKICAgICBBU3RyaW5nIHRtcCgmdXJpWzVdLCBjb21tYVBvcyAtICZ1cmlbNV0pOwogCiAgICAgaWYgKHRtcC5lbmRzV2l0aCgiO2Jhc2U2NCIpKSB7Ci0gICAgICAgIEFTdHJpbmcgZW5jb2RlZChjb21tYVBvcyArIDEpOwogCi0gICAgICAgIC8vIFN0cmlwIENSIGFuZCBMRi4uLgotICAgICAgICBmb3IgKHNpemVfdCBpID0gZW5jb2RlZC5zaXplKCk7IGkgPiAwOykgewotICAgICAgICAgICAgaS0tOwotICAgICAgICAgICAgaWYgKGVuY29kZWQuY19zdHIoKVtpXSA9PSAnXHInIHx8IGVuY29kZWQuY19zdHIoKVtpXSA9PSAnXG4nKSB7Ci0gICAgICAgICAgICAgICAgZW5jb2RlZC5lcmFzZShpLCAxKTsKKyAgICAgICAgLy8gc3RyaXAgYWxsIENSIGFuZCBMRiBjaGFyYWN0ZXJzLgorICAgICAgICBjb25zdCBjaGFyICpzcmMgPSBjb21tYVBvcysxOworICAgICAgICBpbnQgbGVuID0gc3RybGVuKHNyYykgKyAxOworICAgICAgICBjaGFyICpjbGVhbnNlZCA9IChjaGFyICopIG1hbGxvYyhsZW4pOworICAgICAgICBpZiAoY2xlYW5zZWQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgICAgIGNoYXIgKmtlZXBpbmcgPSBjbGVhbnNlZDsKKyAgICAgICAgaW50IGxlZnQgPSBsZW47CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuIDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBjaGFyIGMgPSAqc3JjKys7CisgICAgICAgICAgICBpZiAoYyA9PSAnXHInIHx8IGMgPT0gJ1xuJykgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgKmtlZXBpbmcrKyA9IGM7CisgICAgICAgICAgICBsZWZ0LS07CiAgICAgICAgIH0KKyAgICAgICAgbWVtc2V0KGtlZXBpbmcsIDAsIGxlZnQpOworCisgICAgICAgIEFTdHJpbmcgZW5jb2RlZChjbGVhbnNlZCk7CisgICAgICAgIGZyZWUoY2xlYW5zZWQpOwogCiAgICAgICAgIGJ1ZmZlciA9IGRlY29kZUJhc2U2NChlbmNvZGVkKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GaWxlU291cmNlLmNwcAppbmRleCBlZWY1MzE0Li5hZWU3ZmQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GaWxlU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GaWxlU291cmNlLmNwcApAQCAtMjIsOTAgKzIyLDI4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIEZpbGVTb3VyY2U6OkZpbGVTb3VyY2UoY29uc3QgY2hhciAqZmlsZW5hbWUpCi0gICAgOiBtRmQoLTEpLAotICAgICAgbU9mZnNldCgwKSwKLSAgICAgIG1MZW5ndGgoLTEpLAotICAgICAgbU5hbWUoIjxudWxsPiIpLAorICAgIDogQ2xlYXJGaWxlU291cmNlKGZpbGVuYW1lKSwKICAgICAgIG1EZWNyeXB0SGFuZGxlKE5VTEwpLAogICAgICAgbURybU1hbmFnZXJDbGllbnQoTlVMTCksCiAgICAgICBtRHJtQnVmT2Zmc2V0KDApLAogICAgICAgbURybUJ1ZlNpemUoMCksCiAgICAgICBtRHJtQnVmKE5VTEwpewotCi0gICAgaWYgKGZpbGVuYW1lKSB7Ci0gICAgICAgIG1OYW1lID0gU3RyaW5nODo6Zm9ybWF0KCJGaWxlU291cmNlKCVzKSIsIGZpbGVuYW1lKTsKLSAgICB9Ci0gICAgQUxPR1YoIiVzIiwgZmlsZW5hbWUpOwotICAgIG1GZCA9IG9wZW4oZmlsZW5hbWUsIE9fTEFSR0VGSUxFIHwgT19SRE9OTFkpOwotCi0gICAgaWYgKG1GZCA+PSAwKSB7Ci0gICAgICAgIG1MZW5ndGggPSBsc2VlazY0KG1GZCwgMCwgU0VFS19FTkQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb3BlbiBmaWxlICclcycuICglcykiLCBmaWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICB9CiB9CiAKIEZpbGVTb3VyY2U6OkZpbGVTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpCi0gICAgOiBtRmQoZmQpLAotICAgICAgbU9mZnNldChvZmZzZXQpLAotICAgICAgbUxlbmd0aChsZW5ndGgpLAotICAgICAgbU5hbWUoIjxudWxsPiIpLAorICAgIDogQ2xlYXJGaWxlU291cmNlKGZkLCBvZmZzZXQsIGxlbmd0aCksCiAgICAgICBtRGVjcnlwdEhhbmRsZShOVUxMKSwKICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50KE5VTEwpLAogICAgICAgbURybUJ1Zk9mZnNldCgwKSwKICAgICAgIG1Ecm1CdWZTaXplKDApLAogICAgICAgbURybUJ1ZihOVUxMKSB7Ci0gICAgQUxPR1YoImZkPSVkICglcyksIG9mZnNldD0lbGxkLCBsZW5ndGg9JWxsZCIsCi0gICAgICAgICAgICBmZCwgbmFtZUZvckZkKGZkKS5jX3N0cigpLCAobG9uZyBsb25nKSBvZmZzZXQsIChsb25nIGxvbmcpIGxlbmd0aCk7Ci0KLSAgICBpZiAobU9mZnNldCA8IDApIHsKLSAgICAgICAgbU9mZnNldCA9IDA7Ci0gICAgfQotICAgIGlmIChtTGVuZ3RoIDwgMCkgewotICAgICAgICBtTGVuZ3RoID0gMDsKLSAgICB9Ci0gICAgaWYgKG1MZW5ndGggPiBJTlQ2NF9NQVggLSBtT2Zmc2V0KSB7Ci0gICAgICAgIG1MZW5ndGggPSBJTlQ2NF9NQVggLSBtT2Zmc2V0OwotICAgIH0KLSAgICBzdHJ1Y3Qgc3RhdCBzOwotICAgIGlmIChmc3RhdChmZCwgJnMpID09IDApIHsKLSAgICAgICAgaWYgKG1PZmZzZXQgPiBzLnN0X3NpemUpIHsKLSAgICAgICAgICAgIG1PZmZzZXQgPSBzLnN0X3NpemU7Ci0gICAgICAgICAgICBtTGVuZ3RoID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAobU9mZnNldCArIG1MZW5ndGggPiBzLnN0X3NpemUpIHsKLSAgICAgICAgICAgIG1MZW5ndGggPSBzLnN0X3NpemUgLSBtT2Zmc2V0OwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChtT2Zmc2V0ICE9IG9mZnNldCB8fCBtTGVuZ3RoICE9IGxlbmd0aCkgewotICAgICAgICBBTE9HVygib2Zmc2V0L2xlbmd0aCBhZGp1c3RlZCBmcm9tICVsbGQvJWxsZCB0byAlbGxkLyVsbGQiLAotICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIG9mZnNldCwgKGxvbmcgbG9uZykgbGVuZ3RoLAotICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIG1PZmZzZXQsIChsb25nIGxvbmcpIG1MZW5ndGgpOwotICAgIH0KLQotICAgIG1OYW1lID0gU3RyaW5nODo6Zm9ybWF0KAotICAgICAgICAgICAgIkZpbGVTb3VyY2UoZmQoJXMpLCAlbGxkLCAlbGxkKSIsCi0gICAgICAgICAgICBuYW1lRm9yRmQoZmQpLmNfc3RyKCksCi0gICAgICAgICAgICAobG9uZyBsb25nKSBtT2Zmc2V0LAotICAgICAgICAgICAgKGxvbmcgbG9uZykgbUxlbmd0aCk7Ci0KIH0KIAogRmlsZVNvdXJjZTo6fkZpbGVTb3VyY2UoKSB7Ci0gICAgaWYgKG1GZCA+PSAwKSB7Ci0gICAgICAgIDo6Y2xvc2UobUZkKTsKLSAgICAgICAgbUZkID0gLTE7Ci0gICAgfQotCiAgICAgaWYgKG1Ecm1CdWYgIT0gTlVMTCkgewogICAgICAgICBkZWxldGVbXSBtRHJtQnVmOwogICAgICAgICBtRHJtQnVmID0gTlVMTDsKQEAgLTEyNCwxMCArNjIsNiBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgRmlsZVNvdXJjZTo6aW5pdENoZWNrKCkgY29uc3QgewotICAgIHJldHVybiBtRmQgPj0gMCA/IE9LIDogTk9fSU5JVDsKLX0KLQogc3NpemVfdCBGaWxlU291cmNlOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CiAgICAgaWYgKG1GZCA8IDApIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC0xNDcsMzAgKzgxLDEyIEBACiAKICAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCAmJiBEZWNyeXB0QXBpVHlwZTo6Q09OVEFJTkVSX0JBU0VECiAgICAgICAgICAgICA9PSBtRGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEFwaVR5cGUpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRBdERSTShvZmZzZXQsIGRhdGEsIHNpemUpOworICAgICAgICByZXR1cm4gcmVhZEF0RFJNX2wob2Zmc2V0LCBkYXRhLCBzaXplKTsKICAgIH0gZWxzZSB7Ci0gICAgICAgIG9mZjY0X3QgcmVzdWx0ID0gbHNlZWs2NChtRmQsIG9mZnNldCArIG1PZmZzZXQsIFNFRUtfU0VUKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSAtMSkgewotICAgICAgICAgICAgQUxPR0UoInNlZWsgdG8gJWxsZCBmYWlsZWQiLCAobG9uZyBsb25nKShvZmZzZXQgKyBtT2Zmc2V0KSk7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiA6OnJlYWQobUZkLCBkYXRhLCBzaXplKTsKKyAgICAgICAgcmV0dXJuIHJlYWRBdF9sKG9mZnNldCwgZGF0YSwgc2l6ZSk7CiAgICAgfQogfQogCi1zdGF0dXNfdCBGaWxlU291cmNlOjpnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1GZCA8IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgKnNpemUgPSBtTGVuZ3RoOwotCi0gICAgcmV0dXJuIE9LOwotfQotCiBzcDxEZWNyeXB0SGFuZGxlPiBGaWxlU291cmNlOjpEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyICptaW1lKSB7CiAgICAgaWYgKGdldHVpZCgpID09IEFJRF9NRURJQV9FWCkgcmV0dXJuIG51bGxwdHI7IC8vIG5vIERSTSBpbiBtZWRpYSBleHRyYWN0b3IKICAgICBpZiAobURybU1hbmFnZXJDbGllbnQgPT0gTlVMTCkgewpAQCAtMTk0LDcgKzExMCw3IEBACiAgICAgcmV0dXJuIG1EZWNyeXB0SGFuZGxlOwogfQogCi1zc2l6ZV90IEZpbGVTb3VyY2U6OnJlYWRBdERSTShvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKK3NzaXplX3QgRmlsZVNvdXJjZTo6cmVhZEF0RFJNX2wob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CiAgICAgc2l6ZV90IERSTV9DQUNIRV9TSVpFID0gMTAyNDsKICAgICBpZiAobURybUJ1ZiA9PSBOVUxMKSB7CiAgICAgICAgIG1Ecm1CdWYgPSBuZXcgdW5zaWduZWQgY2hhcltEUk1fQ0FDSEVfU0laRV07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZURlY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVEZWNvZGVyLmNwcAppbmRleCA2ZTk0NTE3Li4xOGE2YmQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZURlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lRGVjb2Rlci5jcHAKQEAgLTM5LDcgKzM5LDcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdGF0aWMgY29uc3QgaW50NjRfdCBrQnVmZmVyVGltZU91dFVzID0gMTAwMDBsbDsgLy8gMTAgbXNlYworc3RhdGljIGNvbnN0IGludDY0X3Qga0J1ZmZlclRpbWVPdXRVcyA9IDEwMDAwTEw7IC8vIDEwIG1zZWMKIHN0YXRpYyBjb25zdCBzaXplX3Qga1JldHJ5Q291bnQgPSA1MDsgLy8gbXVzdCBiZSA+MAogCiBzcDxJTWVtb3J5PiBhbGxvY1ZpZGVvRnJhbWUoY29uc3Qgc3A8TWV0YURhdGE+JiB0cmFja01ldGEsCkBAIC0yNzQsNyArMjc0LDcgQEAKICAgICBzaXplX3QgcmV0cmllc0xlZnQgPSBrUmV0cnlDb3VudDsKICAgICBkbyB7CiAgICAgICAgIHNpemVfdCBpbmRleDsKLSAgICAgICAgaW50NjRfdCBwdHNVcyA9IDBsbDsKKyAgICAgICAgaW50NjRfdCBwdHNVcyA9IDBMTDsKICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOwogCiAgICAgICAgIC8vIFF1ZXVlIGFzIG1hbnkgaW5wdXRzIGFzIHdlIHBvc3NpYmx5IGNhbiwgdGhlbiBibG9jayBvbiBkZXF1ZXVpbmcKQEAgLTQwNiw3ICs0MDYsNyBAQAogICAgIDogRnJhbWVEZWNvZGVyKGNvbXBvbmVudE5hbWUsIHRyYWNrTWV0YSwgc291cmNlKSwKICAgICAgIG1Jc0F2Y09ySGV2YyhmYWxzZSksCiAgICAgICBtU2Vla01vZGUoTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkMpLAotICAgICAgbVRhcmdldFRpbWVVcygtMWxsKSwKKyAgICAgIG1UYXJnZXRUaW1lVXMoLTFMTCksCiAgICAgICBtTnVtRnJhbWVzKDApLAogICAgICAgbU51bUZyYW1lc0RlY29kZWQoMCkgewogfQpAQCAtNDMxLDcgKzQzMSw3IEBACiAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKTsKIAogICAgIGlmIChmcmFtZVRpbWVVcyA8IDApIHsKLSAgICAgICAgaW50NjRfdCB0aHVtYk5haWxUaW1lOworICAgICAgICBpbnQ2NF90IHRodW1iTmFpbFRpbWUgPSAtMWxsOwogICAgICAgICBpZiAoIXRyYWNrTWV0YSgpLT5maW5kSW50NjQoa0tleVRodW1ibmFpbFRpbWUsICZ0aHVtYk5haWxUaW1lKQogICAgICAgICAgICAgICAgIHx8IHRodW1iTmFpbFRpbWUgPCAwKSB7CiAgICAgICAgICAgICB0aHVtYk5haWxUaW1lID0gMDsKQEAgLTQ4Nyw3ICs0ODcsNyBAQAogICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmdmlkZW9GcmFtZUJ1ZmZlciwKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZvdXRwdXRGb3JtYXQsCiAgICAgICAgIGludDY0X3QgdGltZVVzLCBib29sICpkb25lKSB7Ci0gICAgYm9vbCBzaG91bGRPdXRwdXQgPSAobVRhcmdldFRpbWVVcyA8IDBsbCkgfHwgKHRpbWVVcyA+PSBtVGFyZ2V0VGltZVVzKTsKKyAgICBib29sIHNob3VsZE91dHB1dCA9IChtVGFyZ2V0VGltZVVzIDwgMExMKSB8fCAodGltZVVzID49IG1UYXJnZXRUaW1lVXMpOwogCiAgICAgLy8gSWYgdGhpcyBpcyBub3QgdGhlIHRhcmdldCBmcmFtZSwgc2tpcCBjb2xvciBjb252ZXJ0LgogICAgIGlmICghc2hvdWxkT3V0cHV0KSB7CkBAIC01MDEsOSArNTAxLDE1IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCi0gICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OwotICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkpOwotICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSk7CisgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsIHNyY0Zvcm1hdDsKKyAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkgfHwKKyAgICAgICAgICAgICFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkgfHwKKyAgICAgICAgICAgICFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigic3RyaWRlIiwgJnN0cmlkZSkgfHwKKyAgICAgICAgICAgICFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJnNyY0Zvcm1hdCkpIHsKKyAgICAgICAgQUxPR0UoImZvcm1hdCBtaXNzaW5nIGRpbWVuc2lvbiBvciBjb2xvcjogJXMiLAorICAgICAgICAgICAgICAgIG91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CiAKICAgICBpbnQzMl90IGNyb3BfbGVmdCwgY3JvcF90b3AsIGNyb3BfcmlnaHQsIGNyb3BfYm90dG9tOwogICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kUmVjdCgiY3JvcCIsICZjcm9wX2xlZnQsICZjcm9wX3RvcCwgJmNyb3BfcmlnaHQsICZjcm9wX2JvdHRvbSkpIHsKQEAgLTUyMiwxOSArNTI4LDI3IEBACiAgICAgYWRkRnJhbWUoZnJhbWVNZW0pOwogICAgIFZpZGVvRnJhbWUqIGZyYW1lID0gc3RhdGljX2Nhc3Q8VmlkZW9GcmFtZSo+KGZyYW1lTWVtLT5wb2ludGVyKCkpOwogCi0gICAgaW50MzJfdCBzcmNGb3JtYXQ7Ci0gICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZzcmNGb3JtYXQpKTsKLQogICAgIENvbG9yQ29udmVydGVyIGNvbnZlcnRlcigoT01YX0NPTE9SX0ZPUk1BVFRZUEUpc3JjRm9ybWF0LCBkc3RGb3JtYXQoKSk7CiAKKyAgICB1aW50MzJfdCBzdGFuZGFyZCwgcmFuZ2UsIHRyYW5zZmVyOworICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXN0YW5kYXJkIiwgKGludDMyX3QqKSZzdGFuZGFyZCkpIHsKKyAgICAgICAgc3RhbmRhcmQgPSAwOworICAgIH0KKyAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1yYW5nZSIsIChpbnQzMl90KikmcmFuZ2UpKSB7CisgICAgICAgIHJhbmdlID0gMDsKKyAgICB9CisgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItdHJhbnNmZXIiLCAoaW50MzJfdCopJnRyYW5zZmVyKSkgeworICAgICAgICB0cmFuc2ZlciA9IDA7CisgICAgfQorICAgIGNvbnZlcnRlci5zZXRTcmNDb2xvclNwYWNlKHN0YW5kYXJkLCByYW5nZSwgdHJhbnNmZXIpOworCiAgICAgaWYgKGNvbnZlcnRlci5pc1ZhbGlkKCkpIHsKICAgICAgICAgY29udmVydGVyLmNvbnZlcnQoCiAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKil2aWRlb0ZyYW1lQnVmZmVyLT5kYXRhKCksCi0gICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgY3JvcF9sZWZ0LCBjcm9wX3RvcCwgY3JvcF9yaWdodCwgY3JvcF9ib3R0b20sCiAgICAgICAgICAgICAgICAgZnJhbWUtPmdldEZsYXR0ZW5lZERhdGEoKSwKLSAgICAgICAgICAgICAgICBmcmFtZS0+bVdpZHRoLAotICAgICAgICAgICAgICAgIGZyYW1lLT5tSGVpZ2h0LAorICAgICAgICAgICAgICAgIGZyYW1lLT5tV2lkdGgsIGZyYW1lLT5tSGVpZ2h0LCBmcmFtZS0+bVJvd0J5dGVzLAogICAgICAgICAgICAgICAgIGNyb3BfbGVmdCwgY3JvcF90b3AsIGNyb3BfcmlnaHQsIGNyb3BfYm90dG9tKTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KQEAgLTY4MSw5ICs2OTUsMTAgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKLSAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0LCBzdHJpZGU7CiAgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSk7CiAgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpKTsKKyAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigic3RyaWRlIiwgJnN0cmlkZSkpOwogCiAgICAgaWYgKG1GcmFtZSA9PSBOVUxMKSB7CiAgICAgICAgIHNwPElNZW1vcnk+IGZyYW1lTWVtID0gYWxsb2NWaWRlb0ZyYW1lKApAQCAtNjk4LDYgKzcxMywxOCBAQAogCiAgICAgQ29sb3JDb252ZXJ0ZXIgY29udmVydGVyKChPTVhfQ09MT1JfRk9STUFUVFlQRSlzcmNGb3JtYXQsIGRzdEZvcm1hdCgpKTsKIAorICAgIHVpbnQzMl90IHN0YW5kYXJkLCByYW5nZSwgdHJhbnNmZXI7CisgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3Itc3RhbmRhcmQiLCAoaW50MzJfdCopJnN0YW5kYXJkKSkgeworICAgICAgICBzdGFuZGFyZCA9IDA7CisgICAgfQorICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXJhbmdlIiwgKGludDMyX3QqKSZyYW5nZSkpIHsKKyAgICAgICAgcmFuZ2UgPSAwOworICAgIH0KKyAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci10cmFuc2ZlciIsIChpbnQzMl90KikmdHJhbnNmZXIpKSB7CisgICAgICAgIHRyYW5zZmVyID0gMDsKKyAgICB9CisgICAgY29udmVydGVyLnNldFNyY0NvbG9yU3BhY2Uoc3RhbmRhcmQsIHJhbmdlLCB0cmFuc2Zlcik7CisKICAgICBpbnQzMl90IGRzdExlZnQsIGRzdFRvcCwgZHN0UmlnaHQsIGRzdEJvdHRvbTsKICAgICBkc3RMZWZ0ID0gbVRpbGVzRGVjb2RlZCAlIG1HcmlkQ29scyAqIHdpZHRoOwogICAgIGRzdFRvcCA9IG1UaWxlc0RlY29kZWQgLyBtR3JpZENvbHMgKiBoZWlnaHQ7CkBAIC03MjcsMTEgKzc1NCwxMCBAQAogICAgIGlmIChjb252ZXJ0ZXIuaXNWYWxpZCgpKSB7CiAgICAgICAgIGNvbnZlcnRlci5jb252ZXJ0KAogICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopdmlkZW9GcmFtZUJ1ZmZlci0+ZGF0YSgpLAotICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgc3RyaWRlLAogICAgICAgICAgICAgICAgIGNyb3BfbGVmdCwgY3JvcF90b3AsIGNyb3BfcmlnaHQsIGNyb3BfYm90dG9tLAogICAgICAgICAgICAgICAgIG1GcmFtZS0+Z2V0RmxhdHRlbmVkRGF0YSgpLAotICAgICAgICAgICAgICAgIG1GcmFtZS0+bVdpZHRoLAotICAgICAgICAgICAgICAgIG1GcmFtZS0+bUhlaWdodCwKKyAgICAgICAgICAgICAgICBtRnJhbWUtPm1XaWR0aCwgbUZyYW1lLT5tSGVpZ2h0LCBtRnJhbWUtPm1Sb3dCeXRlcywKICAgICAgICAgICAgICAgICBkc3RMZWZ0LCBkc3RUb3AsIGRzdFJpZ2h0LCBkc3RCb3R0b20pOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwCmluZGV4IDBmMjQzMjkuLmQxMThlOGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBCYXNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IVFRQQmFzZS5jcHAKQEAgLTI2LDggKzI2LDYgQEAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGN1dGlscy9xdGFndWlkLmg+CiAKLSNpbmNsdWRlIDxOZXRkQ2xpZW50Lmg+Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogSFRUUEJhc2U6OkhUVFBCYXNlKCkKQEAgLTExNCwzMCArMTEyLDQgQEAKICAgICBtTWF4QmFuZHdpZHRoSGlzdG9yeUl0ZW1zID0gbnVtSGlzdG9yeUl0ZW1zOwogfQogCi0vLyBzdGF0aWMKLXZvaWQgSFRUUEJhc2U6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQgc29ja2ZkLCB1aWRfdCB1aWQsIHVpbnQzMl90IGtUYWcpIHsKLSAgICBpbnQgcmVzID0gcXRhZ3VpZF90YWdTb2NrZXQoc29ja2ZkLCBrVGFnLCB1aWQpOwotICAgIGlmIChyZXMgIT0gMCkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRhZ2dpbmcgc29ja2V0ICVkIGZvciB1aWQgJWQgKE15IFVJRD0lZCkiLCBzb2NrZmQsIHVpZCwgZ2V0ZXVpZCgpKTsKLSAgICB9Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcoaW50IHNvY2tmZCkgewotICAgIGludCByZXMgPSBxdGFndWlkX3VudGFnU29ja2V0KHNvY2tmZCk7Ci0gICAgaWYgKHJlcyAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdW50YWdnaW5nIHNvY2tldCAlZCAoTXkgVUlEPSVkKSIsIHNvY2tmZCwgZ2V0ZXVpZCgpKTsKLSAgICB9Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQgc29ja2ZkLCB1aWRfdCB1aWQpIHsKLSAgICBzZXROZXR3b3JrRm9yVXNlcih1aWQsIHNvY2tmZCk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQpIHsKLSAgICBSZWdpc3RlclNvY2tldFVzZXJNYXJrKHNvY2tmZCwgZ2V0ZXVpZCgpKTsKLX0KLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hldmNVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IZXZjVXRpbHMuY3BwCmluZGV4IGYxNTJhMzguLjQ4MmExYTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hldmNVdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSGV2Y1V0aWxzLmNwcApAQCAtMzEyLDE0ICszMTIsMjMgQEAKICAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBudW1QaWNzOyArK2opIHsKICAgICAgICAgICAgICAgICBza2lwVUUoJnJlYWRlcik7IC8vIGRlbHRhX3BvY19zMHwxX21pbnVzMVtpXQogICAgICAgICAgICAgICAgIHJlYWRlci5za2lwQml0cygxKTsgLy8gdXNlZF9ieV9jdXJyX3BpY19zMHwxX2ZsYWdbaV0KKyAgICAgICAgICAgICAgICBpZiAocmVhZGVyLm92ZXJSZWFkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgaWYgKHJlYWRlci5vdmVyUmVhZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CiAgICAgfQogICAgIGlmIChyZWFkZXIuZ2V0Qml0c1dpdGhGYWxsYmFjaygxLCAwKSkgeyAvLyBsb25nX3Rlcm1fcmVmX3BpY3NfcHJlc2VudF9mbGFnCiAgICAgICAgIHVpbnQzMl90IG51bUxvbmdUZXJtUmVmUGljU3BzID0gcGFyc2VVRVdpdGhGYWxsYmFjaygmcmVhZGVyLCAwKTsKICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bUxvbmdUZXJtUmVmUGljU3BzOyArK2kpIHsKICAgICAgICAgICAgIHJlYWRlci5za2lwQml0cyhsb2cyTWF4UGljT3JkZXJDbnRMc2IpOyAvLyBsdF9yZWZfcGljX3BvY19sc2Jfc3BzW2ldCiAgICAgICAgICAgICByZWFkZXIuc2tpcEJpdHMoMSk7IC8vIHVzZWRfYnlfY3Vycl9waWNfbHRfc3BzX2ZsYWdbaV0KKyAgICAgICAgICAgIGlmIChyZWFkZXIub3ZlclJlYWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgcmVhZGVyLnNraXBCaXRzKDEpOyAvLyBzcHNfdGVtcG9yYWxfbXZwX2VuYWJsZWRfZmxhZwpAQCAtNDU3LDggKzQ2Niw4IEBACiAgICAgICAgIGlmIChudW1OYWx1cyA9PSAwKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICAvLyBhcnJheV9jb21wbGV0ZW5lc3Mgc2V0IHRvIDAuCi0gICAgICAgIGhlYWRlclswXSA9IHR5cGU7CisgICAgICAgIC8vIGFycmF5X2NvbXBsZXRlbmVzcyBzZXQgdG8gMS4KKyAgICAgICAgaGVhZGVyWzBdID0gdHlwZSB8IDB4ODA7CiAgICAgICAgIGhlYWRlclsxXSA9IChudW1OYWx1cyA+PiA4KSAmIDB4ZmY7CiAgICAgICAgIGhlYWRlclsyXSA9IG51bU5hbHVzICYgMHhmZjsKICAgICAgICAgaGVhZGVyICs9IDM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHMlRTV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuY3BwCmluZGV4IDc3MDUzNWMuLmE5NzE1YzkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuY3BwCkBAIC0yNDAsNyArMjQwLDcgQEAKICAgICAgICAgc2l6ZSAtPSBsZW5ndGg7CiAgICAgfQogCi0gICAgb3V0LT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwbGwpOworICAgIG91dC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMExMKTsKIAogICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga05vdGlmeUJ1ZmZlcik7CkBAIC04NDIsNyArODQyLDcgQEAKICAgICBpbnQ2NF90IHRpbWVVczsKICAgICBDSEVDSyhhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwogCi0gICAgdWludDMyX3QgUFRTID0gKHRpbWVVcyAqIDlsbCkgLyAxMDBsbDsKKyAgICB1aW50MzJfdCBQVFMgPSAodGltZVVzICogOUxMKSAvIDEwMExMOwogCiAgICAgc2l6ZV90IFBFU19wYWNrZXRfbGVuZ3RoID0gYWNjZXNzVW5pdC0+c2l6ZSgpICsgODsKICAgICBib29sIHBhZGRpbmcgPSAoYWNjZXNzVW5pdC0+c2l6ZSgpIDwgKDE4OCAtIDE4KSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKaW5kZXggNmZmM2Q3OC4uMmYxM2RjOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcApAQCAtNzEsNiArNzEsOCBAQAogc3RhdGljIGNvbnN0IHVpbnQ4X3Qga05hbFVuaXRUeXBlUGljUGFyYW1TZXQgPSAweDA4Owogc3RhdGljIGNvbnN0IGludDY0X3Qga0luaXRpYWxEZWxheVRpbWVVcyAgICAgPSA3MDAwMDBMTDsKIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNYXhNZXRhZGF0YVNpemUgPSAweDQwMDAwMDBMTDsgICAvLyA2NE1CIG1heCBwZXItZnJhbWUgbWV0YWRhdGEgc2l6ZQorc3RhdGljIGNvbnN0IGludDY0X3Qga01heEN0dHNPZmZzZXRUaW1lVXMgPSAzMCAqIDYwICogMTAwMDAwMExMOyAgLy8gMzAgbWludXRlcworc3RhdGljIGNvbnN0IHNpemVfdCBrRVNEU1NjcmF0Y2hCdWZmZXJTaXplID0gMTA7ICAvLyBrTWF4QXRvbVNpemUgaW4gTXBlZzRFeHRyYWN0b3IgNjRNQgogCiBzdGF0aWMgY29uc3QgY2hhciBrTWV0YUtleV9WZXJzaW9uW10gICAgPSAiY29tLmFuZHJvaWQudmVyc2lvbiI7CiBzdGF0aWMgY29uc3QgY2hhciBrTWV0YUtleV9NYW51ZmFjdHVyZXJbXSAgICAgID0gImNvbS5hbmRyb2lkLm1hbnVmYWN0dXJlciI7CkBAIC04NSw3ICs4Nyw3IEBACiBzdGF0aWMgY29uc3QgaW50IGtUaW1lc3RhbXBEZWJ1Z0NvdW50ID0gMTA7CiBzdGF0aWMgY29uc3QgaW50IGtJdGVtSWRCYXNlID0gMTAwMDA7CiBzdGF0aWMgY29uc3QgY2hhciBrRXhpZkhlYWRlcltdID0geydFJywgJ3gnLCAnaScsICdmJywgJ1wwJywgJ1wwJ307Ci1zdGF0aWMgY29uc3QgaW50MzJfdCBrVGlmZkhlYWRlck9mZnNldCA9IGh0b25sKHNpemVvZihrRXhpZkhlYWRlcikpOworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0V4aWZBcHAxTWFya2VyW10gPSB7J0UnLCAneCcsICdpJywgJ2YnLCAweGZmLCAweGUxfTsKIAogc3RhdGljIGNvbnN0IHVpbnQ4X3Qga01hbmRhdG9yeUhldmNOYWxVbml0VHlwZXNbM10gPSB7CiAgICAga0hldmNOYWxVbml0VHlwZVZwcywKQEAgLTEyNSw3ICsxMjcsNyBAQAogICAgIGJvb2wgaXNBdWRpbygpIGNvbnN0IHsgcmV0dXJuIG1Jc0F1ZGlvOyB9CiAgICAgYm9vbCBpc01QRUc0KCkgY29uc3QgeyByZXR1cm4gbUlzTVBFRzQ7IH0KICAgICBib29sIHVzZVByZWZpeCgpIGNvbnN0IHsgcmV0dXJuIG1Jc0F2YyB8fCBtSXNIZXZjIHx8IG1Jc0hlaWM7IH0KLSAgICBib29sIGlzRXhpZkRhdGEoY29uc3QgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIGNvbnN0OworICAgIGJvb2wgaXNFeGlmRGF0YShNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciwgdWludDMyX3QgKnRpZmZIZHJPZmZzZXQpIGNvbnN0OwogICAgIHZvaWQgYWRkQ2h1bmtPZmZzZXQob2ZmNjRfdCBvZmZzZXQpOwogICAgIHZvaWQgYWRkSXRlbU9mZnNldEFuZFNpemUob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBib29sIGlzRXhpZik7CiAgICAgdm9pZCBmbHVzaEl0ZW1SZWZzKCk7CkBAIC0xMzYsMTEgKzEzOCw2IEBACiAgICAgdm9pZCByZXNldEludGVybmFsKCk7CiAKIHByaXZhdGU6Ci0gICAgZW51bSB7Ci0gICAgICAgIGtNYXhDdHRzT2Zmc2V0VGltZVVzID0gMTAwMDAwMExMLCAgLy8gMSBzZWNvbmQKLSAgICAgICAga1NhbXBsZUFycmF5U2l6ZSA9IDEwMDAsCi0gICAgfTsKLQogICAgIC8vIEEgaGVscGVyIGNsYXNzIHRvIGhhbmRsZSBmYXN0ZXIgd3JpdGUgYm94IHdpdGggdGFibGUgZW50cmllcwogICAgIHRlbXBsYXRlPGNsYXNzIFRZUEUsIHVuc2lnbmVkIEVOVFJZX1NJWkU+CiAgICAgLy8gRU5UUllfU0laRTogIyBvZiB2YWx1ZXMgaW4gZWFjaCBlbnRyeQpAQCAtMzE3LDYgKzMxNCw3IEBACiAgICAgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMT4gKm1TdHNzVGFibGVFbnRyaWVzOwogICAgIExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDI+ICptU3R0c1RhYmxlRW50cmllczsKICAgICBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAyPiAqbUN0dHNUYWJsZUVudHJpZXM7CisgICAgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMz4gKm1FbHN0VGFibGVFbnRyaWVzOyAvLyAzY29sdW1uczogc2VnRHVyYXRpb24sIG1lZGlhVGltZSwgbWVkaWFSYXRlCiAKICAgICBpbnQ2NF90IG1NaW5DdHRzT2Zmc2V0VGltZVVzOwogICAgIGludDY0X3QgbU1pbkN0dHNPZmZzZXRUaWNrczsKQEAgLTM2MSw3ICszNTksNyBAQAogCiAgICAgVmVjdG9yPHVpbnQxNl90PiBtUHJvcGVydGllczsKICAgICBJdGVtUmVmcyBtRGltZ1JlZnM7Ci0gICAgSXRlbVJlZnMgbUNkc2NSZWZzOworICAgIFZlY3Rvcjx1aW50MTZfdD4gbUV4aWZMaXN0OwogICAgIHVpbnQxNl90IG1JbWFnZUl0ZW1JZDsKICAgICBpbnQzMl90IG1Jc1ByaW1hcnk7CiAgICAgaW50MzJfdCBtV2lkdGgsIG1IZWlnaHQ7CkBAIC00MTYsNiArNDE0LDggQEAKICAgICAvLyBEdXJhdGlvbiBpcyB0aW1lIHNjYWxlIGJhc2VkCiAgICAgdm9pZCBhZGRPbmVTdHRzVGFibGVFbnRyeShzaXplX3Qgc2FtcGxlQ291bnQsIGludDMyX3QgdGltZXNjYWxlZER1cik7CiAgICAgdm9pZCBhZGRPbmVDdHRzVGFibGVFbnRyeShzaXplX3Qgc2FtcGxlQ291bnQsIGludDMyX3QgdGltZXNjYWxlZER1cik7CisgICAgdm9pZCBhZGRPbmVFbHN0VGFibGVFbnRyeSh1aW50MzJfdCBzZWdtZW50RHVyYXRpb24sIGludDMyX3QgbWVkaWFUaW1lLAorICAgICAgICBpbnQxNl90IG1lZGlhUmF0ZSwgaW50MTZfdCBtZWRpYVJhdGVGcmFjdGlvbik7CiAKICAgICBib29sIGlzVHJhY2tNYWxGb3JtZWQoKSBjb25zdDsKICAgICB2b2lkIHNlbmRUcmFja1N1bW1hcnkoYm9vbCBoYXNNdWx0aXBsZVRyYWNrcyk7CkBAIC00NDgsMTMgKzQ0OCwxNCBAQAogICAgIHZvaWQgd3JpdGVWaWRlb0ZvdXJDQ0JveCgpOwogICAgIHZvaWQgd3JpdGVNZXRhZGF0YUZvdXJDQ0JveCgpOwogICAgIHZvaWQgd3JpdGVTdGJsQm94KGJvb2wgdXNlMzJCaXRPZmZzZXQpOworICAgIHZvaWQgd3JpdGVFZHRzQm94KCk7CiAKICAgICBUcmFjayhjb25zdCBUcmFjayAmKTsKICAgICBUcmFjayAmb3BlcmF0b3I9KGNvbnN0IFRyYWNrICYpOwogfTsKIAogTVBFRzRXcml0ZXI6Ok1QRUc0V3JpdGVyKGludCBmZCkgewotICAgIGluaXRJbnRlcm5hbChmZCwgdHJ1ZSAvKmlzRmlyc3RTZXNzaW9uKi8pOworICAgIGluaXRJbnRlcm5hbChkdXAoZmQpLCB0cnVlIC8qaXNGaXJzdFNlc3Npb24qLyk7CiB9CiAKIE1QRUc0V3JpdGVyOjp+TVBFRzRXcml0ZXIoKSB7CkBAIC00NzUsMTQgKzQ3NiwxNSBAQAogCiB2b2lkIE1QRUc0V3JpdGVyOjppbml0SW50ZXJuYWwoaW50IGZkLCBib29sIGlzRmlyc3RTZXNzaW9uKSB7CiAgICAgQUxPR1YoImluaXRJbnRlcm5hbCIpOwotICAgIG1GZCA9IGR1cChmZCk7CisgICAgbUZkID0gZmQ7CiAgICAgbU5leHRGZCA9IC0xOwogICAgIG1Jbml0Q2hlY2sgPSBtRmQgPCAwPyBOT19JTklUOiBPSzsKIAogICAgIG1JbnRlcmxlYXZlRHVyYXRpb25VcyA9IDEwMDAwMDA7CiAKLSAgICBtU3RhcnRUaW1lc3RhbXBVcyA9IC0xbGw7CisgICAgbVN0YXJ0VGltZXN0YW1wVXMgPSAtMUxMOwogICAgIG1TdGFydFRpbWVPZmZzZXRNcyA9IC0xOworICAgIG1TdGFydFRpbWVPZmZzZXRCRnJhbWVzVXMgPSAwOwogICAgIG1QYXVzZWQgPSBmYWxzZTsKICAgICBtU3RhcnRlZCA9IGZhbHNlOwogICAgIG1Xcml0ZXJUaHJlYWRTdGFydGVkID0gZmFsc2U7CkBAIC0xMDM3LDYgKzEwMzksMTAgQEAKIHZvaWQgTVBFRzRXcml0ZXI6OnJlbGVhc2UoKSB7CiAgICAgY2xvc2UobUZkKTsKICAgICBtRmQgPSAtMTsKKyAgICBpZiAobU5leHRGZCAhPSAtMSkgeworICAgICAgICBjbG9zZShtTmV4dEZkKTsKKyAgICAgICAgbU5leHRGZCA9IC0xOworICAgIH0KICAgICBtSW5pdENoZWNrID0gTk9fSU5JVDsKICAgICBtU3RhcnRlZCA9IGZhbHNlOwogICAgIGZyZWUobUluTWVtb3J5Q2FjaGUpOwpAQCAtMTI3Miw2ICsxMjc4LDEwIEBACiAgICAgLy8gQWRqdXN0IHRoZSBnbG9iYWwgc3RhcnQgdGltZS4KICAgICBtU3RhcnRUaW1lc3RhbXBVcyArPSBtaW5DdHRzT2Zmc2V0VGltZVVzIC0ga01heEN0dHNPZmZzZXRUaW1lVXM7CiAKKyAgICAvLyBBZGQgbVN0YXJ0VGltZU9mZnNldEJGcmFtZXNVcygtdmUgb3IgemVybykgdG8gdGhlIGR1cmF0aW9uIG9mIGZpcnN0IGVudHJ5IGluIFNUVFMuCisgICAgbVN0YXJ0VGltZU9mZnNldEJGcmFtZXNVcyA9IG1pbkN0dHNPZmZzZXRUaW1lVXMgLSBrTWF4Q3R0c09mZnNldFRpbWVVczsKKyAgICBBTE9HVigibVN0YXJ0VGltZU9mZnNldEJGcmFtZXNVcyA6JSIgUFJJZDMyLCBtU3RhcnRUaW1lT2Zmc2V0QkZyYW1lc1VzKTsKKwogICAgIGZvciAoTGlzdDxUcmFjayAqPjo6aXRlcmF0b3IgaXQgPSBtVHJhY2tzLmJlZ2luKCk7CiAgICAgICAgIGl0ICE9IG1UcmFja3MuZW5kKCk7ICsraXQpIHsKICAgICAgICAgaWYgKCEoKml0KS0+aXNIZWljKCkpIHsKQEAgLTEzNTcsMTQgKzEzNjcsMTYgQEAKIH0KIAogb2ZmNjRfdCBNUEVHNFdyaXRlcjo6YWRkU2FtcGxlX2woCi0gICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXIsIGJvb2wgdXNlUHJlZml4LCBib29sIGlzRXhpZiwgc2l6ZV90ICpieXRlc1dyaXR0ZW4pIHsKKyAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciwgYm9vbCB1c2VQcmVmaXgsCisgICAgICAgIHVpbnQzMl90IHRpZmZIZHJPZmZzZXQsIHNpemVfdCAqYnl0ZXNXcml0dGVuKSB7CiAgICAgb2ZmNjRfdCBvbGRfb2Zmc2V0ID0gbU9mZnNldDsKIAogICAgIGlmICh1c2VQcmVmaXgpIHsKICAgICAgICAgYWRkTXVsdGlwbGVMZW5ndGhQcmVmaXhlZFNhbXBsZXNfbChidWZmZXIpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChpc0V4aWYpIHsKLSAgICAgICAgICAgIDo6d3JpdGUobUZkLCAma1RpZmZIZWFkZXJPZmZzZXQsIDQpOyAvLyBleGlmX3RpZmZfaGVhZGVyX29mZnNldCBmaWVsZAorICAgICAgICBpZiAodGlmZkhkck9mZnNldCA+IDApIHsKKyAgICAgICAgICAgIHRpZmZIZHJPZmZzZXQgPSBodG9ubCh0aWZmSGRyT2Zmc2V0KTsKKyAgICAgICAgICAgIDo6d3JpdGUobUZkLCAmdGlmZkhkck9mZnNldCwgNCk7IC8vIGV4aWZfdGlmZl9oZWFkZXJfb2Zmc2V0IGZpZWxkCiAgICAgICAgICAgICBtT2Zmc2V0ICs9IDQ7CiAgICAgICAgIH0KIApAQCAtMTczNCw3ICsxNzQ2LDcgQEAKIAogdm9pZCBNUEVHNFdyaXRlcjo6c2V0U3RhcnRUaW1lc3RhbXBVcyhpbnQ2NF90IHRpbWVVcykgewogICAgIEFMT0dJKCJzZXRTdGFydFRpbWVzdGFtcFVzOiAlIiBQUklkNjQsIHRpbWVVcyk7Ci0gICAgQ0hFQ0tfR0UodGltZVVzLCAwbGwpOworICAgIENIRUNLX0dFKHRpbWVVcywgMExMKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIGlmIChtU3RhcnRUaW1lc3RhbXBVcyA8IDAgfHwgbVN0YXJ0VGltZXN0YW1wVXMgPiB0aW1lVXMpIHsKICAgICAgICAgbVN0YXJ0VGltZXN0YW1wVXMgPSB0aW1lVXM7CkBAIC0xNzQ3LDYgKzE3NTksMTEgQEAKICAgICByZXR1cm4gbVN0YXJ0VGltZXN0YW1wVXM7CiB9CiAKK2ludDMyX3QgTVBFRzRXcml0ZXI6OmdldFN0YXJ0VGltZU9mZnNldEJGcmFtZXNVcygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiBtU3RhcnRUaW1lT2Zmc2V0QkZyYW1lc1VzOworfQorCiBzaXplX3QgTVBFRzRXcml0ZXI6Om51bVRyYWNrcygpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOwogICAgIHJldHVybiBtVHJhY2tzLnNpemUoKTsKQEAgLTE3NzYsNiArMTc5Myw3IEBACiAgICAgICBtU3Rzc1RhYmxlRW50cmllcyhuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMT4oMTAwMCkpLAogICAgICAgbVN0dHNUYWJsZUVudHJpZXMobmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDI+KDEwMDApKSwKICAgICAgIG1DdHRzVGFibGVFbnRyaWVzKG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAyPigxMDAwKSksCisgICAgICBtRWxzdFRhYmxlRW50cmllcyhuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMz4oMykpLCAvLyBSZXNlcnZlIDMgcm93cywgYSByb3cgaGFzIDMgaXRlbXMKICAgICAgIG1NaW5DdHRzT2Zmc2V0VGltZVVzKDApLAogICAgICAgbU1pbkN0dHNPZmZzZXRUaWNrcygwKSwKICAgICAgIG1NYXhDdHRzT2Zmc2V0VGlja3MoMCksCkBAIC0xNzg2LDcgKzE4MDQsNiBAQAogICAgICAgbVN0YXJ0VGltZXN0YW1wVXMoLTEpLAogICAgICAgbVJvdGF0aW9uKDApLAogICAgICAgbURpbWdSZWZzKCJkaW1nIiksCi0gICAgICBtQ2RzY1JlZnMoImNkc2MiKSwKICAgICAgIG1JbWFnZUl0ZW1JZCgwKSwKICAgICAgIG1Jc1ByaW1hcnkoMCksCiAgICAgICBtV2lkdGgoMCksCkBAIC0xODQyLDQ2ICsxODU5LDQ4IEBACiAKIC8vIENsZWFyIGFsbCB0aGUgaW50ZXJuYWwgc3RhdGVzIGV4Y2VwdCB0aGUgQ1NEIGRhdGEuCiB2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6cmVzZXRJbnRlcm5hbCgpIHsKLSAgICAgIG1Eb25lID0gZmFsc2U7Ci0gICAgICBtUGF1c2VkID0gZmFsc2U7Ci0gICAgICBtUmVzdW1lZCA9IGZhbHNlOwotICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICAgIG1Hb3RTdGFydEtleUZyYW1lID0gZmFsc2U7Ci0gICAgICBtSXNNYWxmb3JtZWQgPSBmYWxzZTsKLSAgICAgIG1UcmFja0R1cmF0aW9uVXMgPSAwOwotICAgICAgbUVzdGltYXRlZFRyYWNrU2l6ZUJ5dGVzID0gMDsKLSAgICAgIG1TYW1wbGVzSGF2ZVNhbWVTaXplID0gMDsKLSAgICAgIGlmIChtU3RzelRhYmxlRW50cmllcyAhPSBOVUxMKSB7Ci0gICAgICAgICBkZWxldGUgbVN0c3pUYWJsZUVudHJpZXM7Ci0gICAgICAgICBtU3RzelRhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAxPigxMDAwKTsKLSAgICAgIH0KLQotICAgICAgaWYgKG1TdGNvVGFibGVFbnRyaWVzICE9IE5VTEwpIHsKLSAgICAgICAgIGRlbGV0ZSBtU3Rjb1RhYmxlRW50cmllczsKLSAgICAgICAgIG1TdGNvVGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDE+KDEwMDApOwotICAgICAgfQotICAgICAgaWYgKG1DbzY0VGFibGVFbnRyaWVzICE9IE5VTEwpIHsKLSAgICAgICAgIGRlbGV0ZSBtQ282NFRhYmxlRW50cmllczsKLSAgICAgICAgIG1DbzY0VGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8b2ZmNjRfdCwgMT4oMTAwMCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChtU3RzY1RhYmxlRW50cmllcyAhPSBOVUxMKSB7Ci0gICAgICAgICBkZWxldGUgbVN0c2NUYWJsZUVudHJpZXM7Ci0gICAgICAgICBtU3RzY1RhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAzPigxMDAwKTsKLSAgICAgIH0KLSAgICAgIGlmIChtU3Rzc1RhYmxlRW50cmllcyAhPSBOVUxMKSB7Ci0gICAgICAgICBkZWxldGUgbVN0c3NUYWJsZUVudHJpZXM7Ci0gICAgICAgICBtU3Rzc1RhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAxPigxMDAwKTsKLSAgICAgIH0KLSAgICAgIGlmIChtU3R0c1RhYmxlRW50cmllcyAhPSBOVUxMKSB7Ci0gICAgICAgICBkZWxldGUgbVN0dHNUYWJsZUVudHJpZXM7Ci0gICAgICAgICBtU3R0c1RhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAyPigxMDAwKTsKLSAgICAgIH0KLSAgICAgIGlmIChtQ3R0c1RhYmxlRW50cmllcyAhPSBOVUxMKSB7Ci0gICAgICAgICBkZWxldGUgbUN0dHNUYWJsZUVudHJpZXM7Ci0gICAgICAgICBtQ3R0c1RhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAyPigxMDAwKTsKLSAgICAgIH0KLSAgICAgIG1SZWFjaGVkRU9TID0gZmFsc2U7CisgICAgbURvbmUgPSBmYWxzZTsKKyAgICBtUGF1c2VkID0gZmFsc2U7CisgICAgbVJlc3VtZWQgPSBmYWxzZTsKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIG1Hb3RTdGFydEtleUZyYW1lID0gZmFsc2U7CisgICAgbUlzTWFsZm9ybWVkID0gZmFsc2U7CisgICAgbVRyYWNrRHVyYXRpb25VcyA9IDA7CisgICAgbUVzdGltYXRlZFRyYWNrU2l6ZUJ5dGVzID0gMDsKKyAgICBtU2FtcGxlc0hhdmVTYW1lU2l6ZSA9IDA7CisgICAgaWYgKG1TdHN6VGFibGVFbnRyaWVzICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1TdHN6VGFibGVFbnRyaWVzOworICAgICAgICBtU3RzelRhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAxPigxMDAwKTsKKyAgICB9CisgICAgaWYgKG1TdGNvVGFibGVFbnRyaWVzICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1TdGNvVGFibGVFbnRyaWVzOworICAgICAgICBtU3Rjb1RhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAxPigxMDAwKTsKKyAgICB9CisgICAgaWYgKG1DbzY0VGFibGVFbnRyaWVzICE9IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIG1DbzY0VGFibGVFbnRyaWVzOworICAgICAgICBtQ282NFRhYmxlRW50cmllcyA9IG5ldyBMaXN0VGFibGVFbnRyaWVzPG9mZjY0X3QsIDE+KDEwMDApOworICAgIH0KKyAgICBpZiAobVN0c2NUYWJsZUVudHJpZXMgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbVN0c2NUYWJsZUVudHJpZXM7CisgICAgICAgIG1TdHNjVGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDM+KDEwMDApOworICAgIH0KKyAgICBpZiAobVN0c3NUYWJsZUVudHJpZXMgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbVN0c3NUYWJsZUVudHJpZXM7CisgICAgICAgIG1TdHNzVGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDE+KDEwMDApOworICAgIH0KKyAgICBpZiAobVN0dHNUYWJsZUVudHJpZXMgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbVN0dHNUYWJsZUVudHJpZXM7CisgICAgICAgIG1TdHRzVGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDI+KDEwMDApOworICAgIH0KKyAgICBpZiAobUN0dHNUYWJsZUVudHJpZXMgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbUN0dHNUYWJsZUVudHJpZXM7CisgICAgICAgIG1DdHRzVGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDI+KDEwMDApOworICAgIH0KKyAgICBpZiAobUVsc3RUYWJsZUVudHJpZXMgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbUVsc3RUYWJsZUVudHJpZXM7CisgICAgICAgIG1FbHN0VGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDM+KDMpOworICAgIH0KKyAgICBtUmVhY2hlZEVPUyA9IGZhbHNlOwogfQogCiB2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6dXBkYXRlVHJhY2tTaXplRXN0aW1hdGUoKSB7CkBAIC0xOTAwLDYgKzE5MTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0c3NUYWJsZUVudHJpZXMtPmNvdW50KCkgKiA0ICsgICAvLyBzdHNzIGJveCBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3R0c1RhYmxlRW50cmllcy0+Y291bnQoKSAqIDggKyAgIC8vIHN0dHMgYm94IHNpemUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdHRzVGFibGVFbnRyaWVzLT5jb3VudCgpICogOCArICAgLy8gY3R0cyBib3ggc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVsc3RUYWJsZUVudHJpZXMtPmNvdW50KCkgKiAxMiArICAgLy8gZWxzdCBib3ggc2l6ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rjb0JveFNpemVCeXRlcyArICAgICAgICAgICAvLyBzdGNvIGJveCBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHN6Qm94U2l6ZUJ5dGVzOyAgICAgICAgICAgIC8vIHN0c3ogYm94IHNpemUKICAgICB9CkBAIC0xOTM2LDYgKzE5NTYsMTYgQEAKICAgICBtQ3R0c1RhYmxlRW50cmllcy0+YWRkKGh0b25sKGR1cmF0aW9uKSk7CiB9CiAKK3ZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjphZGRPbmVFbHN0VGFibGVFbnRyeSgKKyAgICB1aW50MzJfdCBzZWdtZW50RHVyYXRpb24sIGludDMyX3QgbWVkaWFUaW1lLCBpbnQxNl90IG1lZGlhUmF0ZSwgaW50MTZfdCBtZWRpYVJhdGVGcmFjdGlvbikgeworICAgIEFMT0dWKCJzZWdtZW50RHVyYXRpb246JXUsIG1lZGlhVGltZTolZCIsIHNlZ21lbnREdXJhdGlvbiwgbWVkaWFUaW1lKTsKKyAgICBBTE9HVigibWVkaWFSYXRlIDolIiBQUklkMTYgIiwgbWVkaWFSYXRlRnJhY3Rpb24gOiUiIFBSSWQxNiAiLCBPcmVkICV1IiwgbWVkaWFSYXRlLAorICAgICAgICBtZWRpYVJhdGVGcmFjdGlvbiwgKCgoKHVpbnQzMl90KW1lZGlhUmF0ZSkgPDwgMTYpIHwgKCh1aW50MzJfdCltZWRpYVJhdGVGcmFjdGlvbikpKTsKKyAgICBtRWxzdFRhYmxlRW50cmllcy0+YWRkKGh0b25sKHNlZ21lbnREdXJhdGlvbikpOworICAgIG1FbHN0VGFibGVFbnRyaWVzLT5hZGQoaHRvbmwobWVkaWFUaW1lKSk7CisgICAgbUVsc3RUYWJsZUVudHJpZXMtPmFkZChodG9ubCgoKCh1aW50MzJfdCltZWRpYVJhdGUpIDw8IDE2KSB8ICh1aW50MzJfdCltZWRpYVJhdGVGcmFjdGlvbikpOworfQorCiBzdGF0dXNfdCBNUEVHNFdyaXRlcjo6c2V0TmV4dEZkKGludCBmZCkgewogICAgIEFMT0dWKCJhZGROZXh0RmQiKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CkBAIC0xOTUwLDE1ICsxOTgwLDM4IEBACiAgICAgICAgIC8vIE5vIG5lZWQgdG8gc2V0IGEgbmV3IEZEIHlldC4KICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBtTmV4dEZkID0gZmQ7CisgICAgbU5leHRGZCA9IGR1cChmZCk7CiAgICAgcmV0dXJuIE9LOwogfQogCi1ib29sIE1QRUc0V3JpdGVyOjpUcmFjazo6aXNFeGlmRGF0YShjb25zdCBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgY29uc3QgewotICAgIHJldHVybiBtSXNIZWljCi0gICAgICAgICAgICAmJiAoYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA+IHNpemVvZihrRXhpZkhlYWRlcikpCi0gICAgICAgICAgICAmJiAhbWVtY21wKCh1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLAotICAgICAgICAgICAgICAgICAgICBrRXhpZkhlYWRlciwgc2l6ZW9mKGtFeGlmSGVhZGVyKSk7Citib29sIE1QRUc0V3JpdGVyOjpUcmFjazo6aXNFeGlmRGF0YSgKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIsIHVpbnQzMl90ICp0aWZmSGRyT2Zmc2V0KSBjb25zdCB7CisgICAgaWYgKCFtSXNIZWljKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBFeGlmIGJsb2NrIHN0YXJ0aW5nIHdpdGggJ0V4aWZcMFwwJworICAgIHNpemVfdCBsZW5ndGggPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOworICAgIHVpbnQ4X3QgKmRhdGEgPSAodWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKKyAgICBpZiAoKGxlbmd0aCA+IHNpemVvZihrRXhpZkhlYWRlcikpCisgICAgICAgICYmICFtZW1jbXAoZGF0YSwga0V4aWZIZWFkZXIsIHNpemVvZihrRXhpZkhlYWRlcikpKSB7CisgICAgICAgICp0aWZmSGRyT2Zmc2V0ID0gc2l6ZW9mKGtFeGlmSGVhZGVyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gRXhpZiBibG9jayBzdGFydGluZyB3aXRoIGZvdXJjYyAnRXhpZicgZm9sbG93ZWQgYnkgQVBQMSBtYXJrZXIKKyAgICBpZiAoKGxlbmd0aCA+IHNpemVvZihrRXhpZkFwcDFNYXJrZXIpICsgMiArIHNpemVvZihrRXhpZkhlYWRlcikpCisgICAgICAgICAgICAmJiAhbWVtY21wKGRhdGEsIGtFeGlmQXBwMU1hcmtlciwgc2l6ZW9mKGtFeGlmQXBwMU1hcmtlcikpCisgICAgICAgICAgICAmJiAhbWVtY21wKGRhdGEgKyBzaXplb2Yoa0V4aWZBcHAxTWFya2VyKSArIDIsIGtFeGlmSGVhZGVyLCBzaXplb2Yoa0V4aWZIZWFkZXIpKSkgeworICAgICAgICAvLyBza2lwICdFeGlmJyBmb3VyY2MKKyAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoNCwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIDQpOworCisgICAgICAgIC8vIDItYnl0ZSBBUFAxICsgMi1ieXRlIHNpemUgZm9sbG93ZWQgYnkga0V4aWZIZWFkZXIKKyAgICAgICAgKnRpZmZIZHJPZmZzZXQgPSAyICsgMiArIHNpemVvZihrRXhpZkhlYWRlcik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKIH0KIAogdm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OmFkZENodW5rT2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KSB7CkBAIC0xOTg0LDcgKzIwMzcsNyBAQAogICAgIH0KIAogICAgIGlmIChpc0V4aWYpIHsKLSAgICAgICAgIG1DZHNjUmVmcy52YWx1ZS5wdXNoX2JhY2sobU93bmVyLT5hZGRJdGVtX2woeworICAgICAgICAgbUV4aWZMaXN0LnB1c2hfYmFjayhtT3duZXItPmFkZEl0ZW1fbCh7CiAgICAgICAgICAgICAuaXRlbVR5cGUgPSAiRXhpZiIsCiAgICAgICAgICAgICAuaXNQcmltYXJ5ID0gZmFsc2UsCiAgICAgICAgICAgICAuaXNIaWRkZW4gPSBmYWxzZSwKQEAgLTIwODcsNyArMjE0MCwxNiBAQAogCiAgICAgaWYgKG1JbWFnZUl0ZW1JZCA+IDApIHsKICAgICAgICAgbU93bmVyLT5hZGRSZWZzX2wobUltYWdlSXRlbUlkLCBtRGltZ1JlZnMpOwotICAgICAgICBtT3duZXItPmFkZFJlZnNfbChtSW1hZ2VJdGVtSWQsIG1DZHNjUmVmcyk7CisKKyAgICAgICAgaWYgKCFtRXhpZkxpc3QuZW1wdHkoKSkgeworICAgICAgICAgICAgLy8gVGhlICJjZHNjIiByZWYgaXMgZnJvbSB0aGUgbWV0YWRhdGEvZXhpZiBpdGVtIHRvIHRoZSBpbWFnZSBpdGVtLgorICAgICAgICAgICAgLy8gU28gdGhlIHJlZnMgYWxsIGNvbnRhaW4gdGhlIGltYWdlIGl0ZW0uCisgICAgICAgICAgICBJdGVtUmVmcyBjZHNjUmVmcygiY2RzYyIpOworICAgICAgICAgICAgY2RzY1JlZnMudmFsdWUucHVzaF9iYWNrKG1JbWFnZUl0ZW1JZCk7CisgICAgICAgICAgICBmb3IgKHVpbnQxNl90IGV4aWZJdGVtIDogbUV4aWZMaXN0KSB7CisgICAgICAgICAgICAgICAgbU93bmVyLT5hZGRSZWZzX2woZXhpZkl0ZW0sIGNkc2NSZWZzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIH0KIApAQCAtMjExNywxMSArMjE3OSwxMSBAQAogICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKICAgICAgICAgY2FzZSBrV2hhdFN3aXRjaDoKICAgICAgICAgewotICAgICAgICAgICAgZmluaXNoQ3VycmVudFNlc3Npb24oKTsKICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgIGludCBmZCA9IG1OZXh0RmQ7CiAgICAgICAgICAgICBtTmV4dEZkID0gLTE7CiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIGZpbmlzaEN1cnJlbnRTZXNzaW9uKCk7CiAgICAgICAgICAgICBpbml0SW50ZXJuYWwoZmQsIGZhbHNlIC8qaXNGaXJzdFNlc3Npb24qLyk7CiAgICAgICAgICAgICBzdGFydChtU3RhcnRNZXRhLmdldCgpKTsKICAgICAgICAgICAgIG1Td2l0Y2hQZW5kaW5nID0gZmFsc2U7CkBAIC0yMTczLDYgKzIyMzUsNyBAQAogICAgIGRlbGV0ZSBtU3R0c1RhYmxlRW50cmllczsKICAgICBkZWxldGUgbVN0c3NUYWJsZUVudHJpZXM7CiAgICAgZGVsZXRlIG1DdHRzVGFibGVFbnRyaWVzOworICAgIGRlbGV0ZSBtRWxzdFRhYmxlRW50cmllczsKIAogICAgIG1TdHN6VGFibGVFbnRyaWVzID0gTlVMTDsKICAgICBtU3Rjb1RhYmxlRW50cmllcyA9IE5VTEw7CkBAIC0yMTgxLDYgKzIyNDQsNyBAQAogICAgIG1TdHRzVGFibGVFbnRyaWVzID0gTlVMTDsKICAgICBtU3Rzc1RhYmxlRW50cmllcyA9IE5VTEw7CiAgICAgbUN0dHNUYWJsZUVudHJpZXMgPSBOVUxMOworICAgIG1FbHN0VGFibGVFbnRyaWVzID0gTlVMTDsKIAogICAgIGlmIChtQ29kZWNTcGVjaWZpY0RhdGEgIT0gTlVMTCkgewogICAgICAgICBmcmVlKG1Db2RlY1NwZWNpZmljRGF0YSk7CkBAIC0yMjM3LDE0ICsyMzAxLDE2IEBACiAgICAgd2hpbGUgKCFjaHVuay0+bVNhbXBsZXMuZW1wdHkoKSkgewogICAgICAgICBMaXN0PE1lZGlhQnVmZmVyICo+OjppdGVyYXRvciBpdCA9IGNodW5rLT5tU2FtcGxlcy5iZWdpbigpOwogCi0gICAgICAgIGludDMyX3QgaXNFeGlmOwotICAgICAgICBpZiAoISgqaXQpLT5tZXRhX2RhdGEoKS5maW5kSW50MzIoa0tleUlzRXhpZiwgJmlzRXhpZikpIHsKLSAgICAgICAgICAgIGlzRXhpZiA9IDA7CisgICAgICAgIHVpbnQzMl90IHRpZmZIZHJPZmZzZXQ7CisgICAgICAgIGlmICghKCppdCktPm1ldGFfZGF0YSgpLmZpbmRJbnQzMigKKyAgICAgICAgICAgICAgICBrS2V5RXhpZlRpZmZPZmZzZXQsIChpbnQzMl90KikmdGlmZkhkck9mZnNldCkpIHsKKyAgICAgICAgICAgIHRpZmZIZHJPZmZzZXQgPSAwOwogICAgICAgICB9CisgICAgICAgIGJvb2wgaXNFeGlmID0gKHRpZmZIZHJPZmZzZXQgPiAwKTsKICAgICAgICAgYm9vbCB1c2VQcmVmaXggPSBjaHVuay0+bVRyYWNrLT51c2VQcmVmaXgoKSAmJiAhaXNFeGlmOwogCiAgICAgICAgIHNpemVfdCBieXRlc1dyaXR0ZW47Ci0gICAgICAgIG9mZjY0X3Qgb2Zmc2V0ID0gYWRkU2FtcGxlX2woKml0LCB1c2VQcmVmaXgsIGlzRXhpZiwgJmJ5dGVzV3JpdHRlbik7CisgICAgICAgIG9mZjY0X3Qgb2Zmc2V0ID0gYWRkU2FtcGxlX2woKml0LCB1c2VQcmVmaXgsIHRpZmZIZHJPZmZzZXQsICZieXRlc1dyaXR0ZW4pOwogCiAgICAgICAgIGlmIChjaHVuay0+bVRyYWNrLT5pc0hlaWMoKSkgewogICAgICAgICAgICAgY2h1bmstPm1UcmFjay0+YWRkSXRlbU9mZnNldEFuZFNpemUob2Zmc2V0LCBieXRlc1dyaXR0ZW4sIGlzRXhpZik7CkBAIC0yODQ5LDE0ICsyOTE1LDE4IEBACiB9CiAKIHZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjpkdW1wVGltZVN0YW1wcygpIHsKLSAgICBBTE9HRSgiRHVtcGluZyAlcyB0cmFjaydzIGxhc3QgMTAgZnJhbWVzIHRpbWVzdGFtcCBhbmQgZnJhbWUgdHlwZSAiLCBnZXRUcmFja1R5cGUoKSk7Ci0gICAgc3RkOjpzdHJpbmcgdGltZVN0YW1wU3RyaW5nOwotICAgIGZvciAoc3RkOjpsaXN0PFRpbWVzdGFtcERlYnVnSGVscGVyRW50cnk+OjppdGVyYXRvciBlbnRyeSA9IG1UaW1lc3RhbXBEZWJ1Z0hlbHBlci5iZWdpbigpOwotICAgICAgICAgICAgZW50cnkgIT0gbVRpbWVzdGFtcERlYnVnSGVscGVyLmVuZCgpOyArK2VudHJ5KSB7Ci0gICAgICAgIHRpbWVTdGFtcFN0cmluZyArPSAiKCIgKyBzdGQ6OnRvX3N0cmluZyhlbnRyeS0+cHRzKSsKLSAgICAgICAgICAgICAgICAidXMsICIgKyBzdGQ6OnRvX3N0cmluZyhlbnRyeS0+ZHRzKSArICJ1cyAiICsgZW50cnktPmZyYW1lVHlwZSArICIpICI7CisgICAgaWYgKCFtVGltZXN0YW1wRGVidWdIZWxwZXIuZW1wdHkoKSkgeworICAgICAgICBzdGQ6OnN0cmluZyB0aW1lU3RhbXBTdHJpbmcgPSAiRHVtcGluZyAiICsgc3RkOjpzdHJpbmcoZ2V0VHJhY2tUeXBlKCkpICsgIiB0cmFjaydzIGxhc3QgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKG1UaW1lc3RhbXBEZWJ1Z0hlbHBlci5zaXplKCkpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBmcmFtZXMnIHRpbWVzdGFtcHMocHRzLCBkdHMpIGFuZCBmcmFtZSB0eXBlIDogIjsKKyAgICAgICAgZm9yIChjb25zdCBUaW1lc3RhbXBEZWJ1Z0hlbHBlckVudHJ5JiBlbnRyeSA6IG1UaW1lc3RhbXBEZWJ1Z0hlbHBlcikgeworICAgICAgICAgICAgdGltZVN0YW1wU3RyaW5nICs9ICJcbigiICsgc3RkOjp0b19zdHJpbmcoZW50cnkucHRzKSArICJ1cywgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp0b19zdHJpbmcoZW50cnkuZHRzKSArICJ1cyAiICsgZW50cnkuZnJhbWVUeXBlICsgIikgIjsKKyAgICAgICAgfQorICAgICAgICBBTE9HRSgiJXMiLCB0aW1lU3RhbXBTdHJpbmcuY19zdHIoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIjAgZnJhbWVzIHRvIGR1bXAgdGltZVN0YW1wcyBpbiAlcyB0cmFjayAiLCBnZXRUcmFja1R5cGUoKSk7CiAgICAgfQotICAgIEFMT0dFKCIlcyIsIHRpbWVTdGFtcFN0cmluZy5jX3N0cigpKTsKIH0KIAogc3RhdHVzX3QgTVBFRzRXcml0ZXI6OlRyYWNrOjp0aHJlYWRFbnRyeSgpIHsKQEAgLTI5NzAsMTAgKzMwNDAsMTEgQEAKICAgICAgICAgfQogCiAgICAgICAgIGJvb2wgaXNFeGlmID0gZmFsc2U7CisgICAgICAgIHVpbnQzMl90IHRpZmZIZHJPZmZzZXQgPSAwOwogICAgICAgICBpbnQzMl90IGlzTXV4ZXJEYXRhOwogICAgICAgICBpZiAoYnVmZmVyLT5tZXRhX2RhdGEoKS5maW5kSW50MzIoa0tleUlzTXV4ZXJEYXRhLCAmaXNNdXhlckRhdGEpICYmIGlzTXV4ZXJEYXRhKSB7CiAgICAgICAgICAgICAvLyBXZSBvbmx5IHN1cHBvcnQgb25lIHR5cGUgb2YgbXV4ZXIgZGF0YSwgd2hpY2ggaXMgRXhpZiBkYXRhIGJsb2NrLgotICAgICAgICAgICAgaXNFeGlmID0gaXNFeGlmRGF0YShidWZmZXIpOworICAgICAgICAgICAgaXNFeGlmID0gaXNFeGlmRGF0YShidWZmZXIsICZ0aWZmSGRyT2Zmc2V0KTsKICAgICAgICAgICAgIGlmICghaXNFeGlmKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coIklnbm9yaW5nIGJhZCBFeGlmIGRhdGEgYmxvY2siKTsKICAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKQEAgLTI5OTUsNyArMzA2Niw3IEBACiAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CiAKICAgICAgICAgaWYgKGlzRXhpZikgewotICAgICAgICAgICAgY29weS0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzRXhpZiwgMSk7CisgICAgICAgICAgICBjb3B5LT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5RXhpZlRpZmZPZmZzZXQsIHRpZmZIZHJPZmZzZXQpOwogICAgICAgICB9CiAgICAgICAgIGJvb2wgdXNlUHJlZml4ID0gdGhpcy0+dXNlUHJlZml4KCkgJiYgIWlzRXhpZjsKIApAQCAtMzA2MCwxNCArMzEzMSwxNCBAQAogICAgICAgICBpZiAoIW1Jc0hlaWMpIHsKICAgICAgICAgICAgIGlmIChtU3RzelRhYmxlRW50cmllcy0+Y291bnQoKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgbUZpcnN0U2FtcGxlVGltZVJlYWxVcyA9IHN5c3RlbVRpbWUoKSAvIDEwMDA7CisgICAgICAgICAgICAgICAgbU93bmVyLT5zZXRTdGFydFRpbWVzdGFtcFVzKHRpbWVzdGFtcFVzKTsKICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOwotICAgICAgICAgICAgICAgIG1Pd25lci0+c2V0U3RhcnRUaW1lc3RhbXBVcyhtU3RhcnRUaW1lc3RhbXBVcyk7CiAgICAgICAgICAgICAgICAgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzID0gbVN0YXJ0VGltZXN0YW1wVXM7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtUmVzdW1lZCkgewogICAgICAgICAgICAgICAgIGludDY0X3QgZHVyRXhjbHVkaW5nRWFybGllclBhdXNlc1VzID0gdGltZXN0YW1wVXMgLSBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXM7Ci0gICAgICAgICAgICAgICAgaWYgKFdBUk5fVU5MRVNTKGR1ckV4Y2x1ZGluZ0VhcmxpZXJQYXVzZXNVcyA+PSAwbGwsICJmb3IgJXMgdHJhY2siLCB0cmFja05hbWUpKSB7CisgICAgICAgICAgICAgICAgaWYgKFdBUk5fVU5MRVNTKGR1ckV4Y2x1ZGluZ0VhcmxpZXJQYXVzZXNVcyA+PSAwTEwsICJmb3IgJXMgdHJhY2siLCB0cmFja05hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvcHktPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgbVNvdXJjZS0+c3RvcCgpOwogICAgICAgICAgICAgICAgICAgICBtSXNNYWxmb3JtZWQgPSB0cnVlOwpAQCAtMzA4OCw3ICszMTU5LDcgQEAKICAgICAgICAgICAgIFRpbWVzdGFtcERlYnVnSGVscGVyRW50cnkgdGltZXN0YW1wRGVidWdFbnRyeTsKICAgICAgICAgICAgIHRpbWVzdGFtcFVzIC09IHByZXZpb3VzUGF1c2VkRHVyYXRpb25VczsKICAgICAgICAgICAgIHRpbWVzdGFtcERlYnVnRW50cnkucHRzID0gdGltZXN0YW1wVXM7Ci0gICAgICAgICAgICBpZiAoV0FSTl9VTkxFU1ModGltZXN0YW1wVXMgPj0gMGxsLCAiZm9yICVzIHRyYWNrIiwgdHJhY2tOYW1lKSkgeworICAgICAgICAgICAgaWYgKFdBUk5fVU5MRVNTKHRpbWVzdGFtcFVzID49IDBMTCwgImZvciAlcyB0cmFjayIsIHRyYWNrTmFtZSkpIHsKICAgICAgICAgICAgICAgICBjb3B5LT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgbVNvdXJjZS0+c3RvcCgpOwogICAgICAgICAgICAgICAgIG1Jc01hbGZvcm1lZCA9IHRydWU7CkBAIC0zMTI3LDcgKzMxOTgsNyBAQAogCiAgICAgICAgICAgICAgICAgY3R0c09mZnNldFRpbWVVcyA9CiAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBVcyArIGtNYXhDdHRzT2Zmc2V0VGltZVVzIC0gZGVjb2RpbmdUaW1lVXM7Ci0gICAgICAgICAgICAgICAgaWYgKFdBUk5fVU5MRVNTKGN0dHNPZmZzZXRUaW1lVXMgPj0gMGxsLCAiZm9yICVzIHRyYWNrIiwgdHJhY2tOYW1lKSkgeworICAgICAgICAgICAgICAgIGlmIChXQVJOX1VOTEVTUyhjdHRzT2Zmc2V0VGltZVVzID49IDBMTCwgImZvciAlcyB0cmFjayIsIHRyYWNrTmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7CiAgICAgICAgICAgICAgICAgICAgIG1Jc01hbGZvcm1lZCA9IHRydWU7CkBAIC0zMTg1LDcgKzMyNTYsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKFdBUk5fVU5MRVNTKHRpbWVzdGFtcFVzID49IDBsbCwgImZvciAlcyB0cmFjayIsIHRyYWNrTmFtZSkpIHsKKyAgICAgICAgICAgIGlmIChXQVJOX1VOTEVTUyh0aW1lc3RhbXBVcyA+PSAwTEwsICJmb3IgJXMgdHJhY2siLCB0cmFja05hbWUpKSB7CiAgICAgICAgICAgICAgICAgY29weS0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKICAgICAgICAgICAgICAgICBtSXNNYWxmb3JtZWQgPSB0cnVlOwpAQCAtMzIwNiw3ICszMjc3LDcgQEAKICAgICAgICAgICAgIGN1cnJEdXJhdGlvblRpY2tzID0KICAgICAgICAgICAgICAgICAoKHRpbWVzdGFtcFVzICogbVRpbWVTY2FsZSArIDUwMDAwMExMKSAvIDEwMDAwMDBMTCAtCiAgICAgICAgICAgICAgICAgICAgIChsYXN0VGltZXN0YW1wVXMgKiBtVGltZVNjYWxlICsgNTAwMDAwTEwpIC8gMTAwMDAwMExMKTsKLSAgICAgICAgICAgIGlmIChjdXJyRHVyYXRpb25UaWNrcyA8IDBsbCkgeworICAgICAgICAgICAgaWYgKGN1cnJEdXJhdGlvblRpY2tzIDwgMExMKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoImRvIG5vdCBzdXBwb3J0IG91dCBvZiBvcmRlciBmcmFtZXMgKHRpbWVzdGFtcDogJWxsZCA8IGxhc3Q6ICVsbGQgZm9yICVzIHRyYWNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZXN0YW1wVXMsIChsb25nIGxvbmcpbGFzdFRpbWVzdGFtcFVzLCB0cmFja05hbWUpOwogICAgICAgICAgICAgICAgIGNvcHktPnJlbGVhc2UoKTsKQEAgLTMyNjgsNyArMzMzOSw4IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKCFoYXNNdWx0aXBsZVRyYWNrcykgewogICAgICAgICAgICAgc2l6ZV90IGJ5dGVzV3JpdHRlbjsKLSAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0ID0gbU93bmVyLT5hZGRTYW1wbGVfbChjb3B5LCB1c2VQcmVmaXgsIGlzRXhpZiwgJmJ5dGVzV3JpdHRlbik7CisgICAgICAgICAgICBvZmY2NF90IG9mZnNldCA9IG1Pd25lci0+YWRkU2FtcGxlX2woCisgICAgICAgICAgICAgICAgICAgIGNvcHksIHVzZVByZWZpeCwgdGlmZkhkck9mZnNldCwgJmJ5dGVzV3JpdHRlbik7CiAKICAgICAgICAgICAgIGlmIChtSXNIZWljKSB7CiAgICAgICAgICAgICAgICAgYWRkSXRlbU9mZnNldEFuZFNpemUob2Zmc2V0LCBieXRlc1dyaXR0ZW4sIGlzRXhpZik7CkBAIC0zNTI2LDcgKzM1OTgsNyBAQAogfQogCiBpbnQ2NF90IE1QRUc0V3JpdGVyOjpUcmFjazo6Z2V0RHVyYXRpb25VcygpIGNvbnN0IHsKLSAgICByZXR1cm4gbVRyYWNrRHVyYXRpb25VcyArIGdldFN0YXJ0VGltZU9mZnNldFRpbWVVcygpOworICAgIHJldHVybiBtVHJhY2tEdXJhdGlvblVzICsgZ2V0U3RhcnRUaW1lT2Zmc2V0VGltZVVzKCkgKyBtT3duZXItPmdldFN0YXJ0VGltZU9mZnNldEJGcmFtZXNVcygpOwogfQogCiBpbnQ2NF90IE1QRUc0V3JpdGVyOjpUcmFjazo6Z2V0RXN0aW1hdGVkVHJhY2tTaXplQnl0ZXMoKSBjb25zdCB7CkBAIC0zNjEyLDYgKzM2ODQsNyBAQAogICAgIHVpbnQzMl90IG5vdyA9IGdldE1wZWc0VGltZSgpOwogICAgIG1Pd25lci0+YmVnaW5Cb3goInRyYWsiKTsKICAgICAgICAgd3JpdGVUa2hkQm94KG5vdyk7CisgICAgICAgIHdyaXRlRWR0c0JveCgpOwogICAgICAgICBtT3duZXItPmJlZ2luQm94KCJtZGlhIik7CiAgICAgICAgICAgICB3cml0ZU1kaGRCb3gobm93KTsKICAgICAgICAgICAgIHdyaXRlSGRsckJveCgpOwpAQCAtMzY3NCw2ICszNzQ3LDI5IEBACiAgICAgICAgIFRSRVNQQVNTKCk7CiAgICAgfQogICAgIG1Pd25lci0+YmVnaW5Cb3goZm91cmNjKTsgICAgLy8gVGV4dE1ldGFEYXRhU2FtcGxlRW50cnkKKworICAgIC8vICBIQUNLIHRvIG1ha2UgdGhlIG1ldGFkYXRhIHRyYWNrIGNvbXBsaWFudCB3aXRoIHRoZSBJU08gc3RhbmRhcmQuCisgICAgLy8KKyAgICAvLyAgTWV0YWRhdGEgdHJhY2sgaXMgYWRkZWQgZnJvbSBBUEkgMjYgYW5kIHRoZSBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdAorICAgIC8vICBmdWxseSBmb2xsb3dlZCB0aGUgVGV4dE1ldGFEYXRhU2FtcGxlRW50cnkgc3BlY2lmaWVkIGluIElTTy9JRUMgMTQ0OTYtMTItMjAxNQorICAgIC8vICBpbiB0aGF0IG9ubHkgdGhlIG1pbWVfZm9ybWF0IGlzIHdyaXR0ZW4gb3V0LiBjb250ZW50X2VuY29kaW5nIGFuZAorICAgIC8vICBkYXRhX3JlZmVyZW5jZV9pbmRleCBoYXZlIG5vdCBiZWVuIHdyaXR0ZW4gb3V0LiBUaGlzIGxlYWRzIHRvIHRoZSBmYWlsdXJlCisgICAgLy8gIHdoZW4gc29tZSBNUDQgcGFyc2VyIHRyaWVzIHRvIHBhcnNlIHRoZSBtZXRhZGF0YSB0cmFjayBhY2NvcmRpbmcgdG8gdGhlCisgICAgLy8gIHN0YW5kYXJkLiBUaGUgaGFjayBoZXJlIHdpbGwgbWFrZSB0aGUgbWV0YWRhdGEgdHJhY2sgY29tcGxpYW50IHdpdGggdGhlCisgICAgLy8gIHN0YW5kYXJkIHdoaWxlIHN0aWxsIG1haW50YWluaW5nIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBUaGlzIHdvdWxkIGVuYWJsZQorICAgIC8vICBBbmRyb2lkIHZlcnNpb25zIGJlZm9yZSBBUEkgMjkgdG8gYmUgYWJsZSB0byByZWFkIG91dCB0aGUgc3RhbmRhcmQgY29tcGxpYW50CisgICAgLy8gIE1ldGFkYXRhIHRyYWNrIGdlbmVyYXRlZCB3aXRoIEFuZHJvaWQgQVBJIDI5IGFuZCB1cHdhcmQuIFRoZSB0cmljayBpcyBiYXNlZAorICAgIC8vICBvbiB0aGUgZmFjdCB0aGF0IHRoZSBNZXRhZGF0YSB0cmFjayBtdXN0IHN0YXJ0IHdpdGggcHJlZml4IOKAnGFwcGxpY2F0aW9uL+KAnSBhbmQKKyAgICAvLyAgdGhvc2UgbWlzc2luZyBmaWVsZHMgYXJlIG5vdCB1c2VkIGluIEFuZHJvaWQncyBNZXRhZGF0YSB0cmFjay4gQnkgd3JpdHRpbmcKKyAgICAvLyAgb3V0IHRoZSBtaW1lX2Zvcm1hdCB0d2ljZSwgdGhlIGZpcnN0IG1pbWVfZm9ybWF0IHdpbGwgYmUgdXNlZCB0byBmaWxsIG91dCB0aGUKKyAgICAvLyAgbWlzc2luZyByZXNlcnZlZCwgZGF0YV9yZWZlcmVuY2VfaW5kZXggYW5kIGNvbnRlbnQgZW5jb2RpbmcgZmllbGRzLiBPbiB0aGUKKyAgICAvLyAgcGFyc2VyIHNpZGUsIHRoZSBleHRyYWN0ZXIgYmVmb3JlIEFQSSAyOSAgd2lsbCByZWFkIG91dCB0aGUgZmlyc3QgbWltZV9mb3JtYXQKKyAgICAvLyAgY29ycmVjdGx5IGFuZCBkcm9wIHRoZSBzZWNvbmQgbWltZV9mb3JtYXQuIFRoZSBleHRyYWN0b3IgZnJvbSBBUEkgMjkgd2lsbAorICAgIC8vICBjaGVjayBpZiB0aGUgcmVzZXJ2ZWQsIGRhdGFfcmVmZXJlbmNlX2luZGV4IGFuZCBjb250ZW50IGVuY29kaW5nIGFyZSBmaWxsZWQKKyAgICAvLyAgd2l0aCDigJxhcHBsaWNhdGlvbuKAnSB0byBkZXRlY3QgaWYgdGhpcyBpcyBhIHN0YW5kYXJkIGNvbXBsaWFudCBtZXRhZGF0YSB0cmFjaworICAgIC8vICBhbmQgcmVhZCBvdXQgdGhlIGRhdGEgYWNjb3JkaW5nbHkuCisgICAgbU93bmVyLT53cml0ZUNTdHJpbmcobWltZSk7CisKICAgICBtT3duZXItPndyaXRlQ1N0cmluZyhtaW1lKTsgIC8vIG1ldGFkYXRhIG1pbWVfZm9ybWF0CiAgICAgbU93bmVyLT5lbmRCb3goKTsgLy8gbWV0dAogfQpAQCAtMzc4NywyMiArMzg4Myw1MiBAQAogICAgIG1Pd25lci0+ZW5kQm94KCk7CiB9CiAKK3N0YXRpYyB2b2lkIGdlbmVyYXRlRXNkc1NpemUoc2l6ZV90IGRhdGFMZW5ndGgsIHNpemVfdCogc2l6ZUdlbmVyYXRlZCwgdWludDhfdCogYnVmZmVyKSB7CisgICAgc2l6ZV90IG9mZnNldCA9IDAsIGN1ciA9IDA7CisgICAgc2l6ZV90IG1vcmUgPSAweDAwOworICAgICpzaXplR2VuZXJhdGVkID0gMDsKKyAgICAvKiBTdGFydCB3aXRoIHRoZSBMU0IoNyBiaXRzKSBvZiBkYXRhTGVuZ3RoIGFuZCBidWlsZCB0aGUgYnl0ZSBzZXF1ZW5jZSB1cHRvIE1TQi4KKyAgICAgKiBDb250aW51YXRpb24gZmxhZyhtb3N0IHNpZ25pZmljYW50IGJpdCkgd2lsbCBiZSBzZXQgb24gdGhlIGZpcnN0IE4tMSBieXRlcy4KKyAgICAgKi8KKyAgICBkbyB7CisgICAgICAgIGJ1ZmZlcltjdXIrK10gPSAoZGF0YUxlbmd0aCAmIDB4N2YpIHwgbW9yZTsKKyAgICAgICAgZGF0YUxlbmd0aCA+Pj0gNzsKKyAgICAgICAgbW9yZSA9IDB4ODA7CisgICAgICAgICsrKCpzaXplR2VuZXJhdGVkKTsKKyAgICB9IHdoaWxlIChkYXRhTGVuZ3RoID4gMHUpOworICAgIC0tY3VyOworICAgIC8vIFJldmVyc2UgdGhlIG5ld2x5IGZvcm1lZCBieXRlIHNlcXVlbmNlLgorICAgIHdoaWxlIChjdXIgPiBvZmZzZXQpIHsKKyAgICAgICAgdWludDhfdCB0bXAgPSBidWZmZXJbY3VyXTsKKyAgICAgICAgYnVmZmVyW2N1ci0tXSA9IGJ1ZmZlcltvZmZzZXRdOworICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gdG1wOworICAgIH0KK30KKwogdm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OndyaXRlTXA0YUVzZHNCb3goKSB7Ci0gICAgbU93bmVyLT5iZWdpbkJveCgiZXNkcyIpOwogICAgIENIRUNLKG1Db2RlY1NwZWNpZmljRGF0YSk7CiAgICAgQ0hFQ0tfR1QobUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSwgMHUpOwogCi0gICAgLy8gTWFrZSBzdXJlIGFsbCBzaXplcyBlbmNvZGUgdG8gYSBzaW5nbGUgYnl0ZS4KLSAgICBDSEVDS19MVChtQ29kZWNTcGVjaWZpY0RhdGFTaXplICsgMjMsIDEyOHUpOworICAgIHVpbnQ4X3Qgc2l6ZUVTREJ1ZmZlcltrRVNEU1NjcmF0Y2hCdWZmZXJTaXplXTsKKyAgICB1aW50OF90IHNpemVEQ0RCdWZmZXJba0VTRFNTY3JhdGNoQnVmZmVyU2l6ZV07CisgICAgdWludDhfdCBzaXplRFNJQnVmZmVyW2tFU0RTU2NyYXRjaEJ1ZmZlclNpemVdOworICAgIHNpemVfdCBzaXplRVNEID0gMDsKKyAgICBzaXplX3Qgc2l6ZURDRCA9IDA7CisgICAgc2l6ZV90IHNpemVEU0kgPSAwOworICAgIGdlbmVyYXRlRXNkc1NpemUobUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSwgJnNpemVEU0ksIHNpemVEU0lCdWZmZXIpOworICAgIGdlbmVyYXRlRXNkc1NpemUobUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSArIHNpemVEU0kgKyAxNCwgJnNpemVEQ0QsIHNpemVEQ0RCdWZmZXIpOworICAgIGdlbmVyYXRlRXNkc1NpemUobUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSArIHNpemVEU0kgKyBzaXplRENEICsgMjEsICZzaXplRVNELCBzaXplRVNEQnVmZmVyKTsKKworICAgIG1Pd25lci0+YmVnaW5Cb3goImVzZHMiKTsKIAogICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgIC8vIHZlcnNpb249MCwgZmxhZ3M9MAogICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MDMpOyAgIC8vIEVTX0Rlc2NyVGFnCi0gICAgbU93bmVyLT53cml0ZUludDgoMjMgKyBtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKKyAgICBtT3duZXItPndyaXRlKHNpemVFU0RCdWZmZXIsIHNpemVFU0QpOwogICAgIG1Pd25lci0+d3JpdGVJbnQxNigweDAwMDApOy8vIEVTX0lECiAgICAgbU93bmVyLT53cml0ZUludDgoMHgwMCk7CiAKICAgICBtT3duZXItPndyaXRlSW50OCgweDA0KTsgICAvLyBEZWNvZGVyQ29uZmlnRGVzY3JUYWcKLSAgICBtT3duZXItPndyaXRlSW50OCgxNSArIG1Db2RlY1NwZWNpZmljRGF0YVNpemUpOworICAgIG1Pd25lci0+d3JpdGUoc2l6ZURDREJ1ZmZlciwgc2l6ZURDRCk7CiAgICAgbU93bmVyLT53cml0ZUludDgoMHg0MCk7ICAgLy8gb2JqZWN0VHlwZUluZGljYXRpb24gSVNPL0lFQyAxNDQ5Mi0yCiAgICAgbU93bmVyLT53cml0ZUludDgoMHgxNSk7ICAgLy8gc3RyZWFtVHlwZSBBdWRpb1N0cmVhbQogCkBAIC0zODE3LDcgKzM5NDMsNyBAQAogICAgIG1Pd25lci0+d3JpdGVJbnQzMihhdmdCaXRyYXRlKTsKIAogICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MDUpOyAgIC8vIERlY29kZXJTcGVjaWZpY0luZm9UYWcKLSAgICBtT3duZXItPndyaXRlSW50OChtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKKyAgICBtT3duZXItPndyaXRlKHNpemVEU0lCdWZmZXIsIHNpemVEU0kpOwogICAgIG1Pd25lci0+d3JpdGUobUNvZGVjU3BlY2lmaWNEYXRhLCBtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKIAogICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtEYXRhMltdID0gewpAQCAtMzgzNCwyMCArMzk2MCwyNyBAQAogICAgIENIRUNLKG1Db2RlY1NwZWNpZmljRGF0YSk7CiAgICAgQ0hFQ0tfR1QobUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSwgMHUpOwogCi0gICAgLy8gTWFrZSBzdXJlIGFsbCBzaXplcyBlbmNvZGUgdG8gYSBzaW5nbGUgYnl0ZS4KLSAgICBDSEVDS19MVCgyMyArIG1Db2RlY1NwZWNpZmljRGF0YVNpemUsIDEyOHUpOworICAgIHVpbnQ4X3Qgc2l6ZUVTREJ1ZmZlcltrRVNEU1NjcmF0Y2hCdWZmZXJTaXplXTsKKyAgICB1aW50OF90IHNpemVEQ0RCdWZmZXJba0VTRFNTY3JhdGNoQnVmZmVyU2l6ZV07CisgICAgdWludDhfdCBzaXplRFNJQnVmZmVyW2tFU0RTU2NyYXRjaEJ1ZmZlclNpemVdOworICAgIHNpemVfdCBzaXplRVNEID0gMDsKKyAgICBzaXplX3Qgc2l6ZURDRCA9IDA7CisgICAgc2l6ZV90IHNpemVEU0kgPSAwOworICAgIGdlbmVyYXRlRXNkc1NpemUobUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSwgJnNpemVEU0ksIHNpemVEU0lCdWZmZXIpOworICAgIGdlbmVyYXRlRXNkc1NpemUobUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSArIHNpemVEU0kgKyAxNCwgJnNpemVEQ0QsIHNpemVEQ0RCdWZmZXIpOworICAgIGdlbmVyYXRlRXNkc1NpemUobUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSArIHNpemVEU0kgKyBzaXplRENEICsgMjEsICZzaXplRVNELCBzaXplRVNEQnVmZmVyKTsKIAogICAgIG1Pd25lci0+YmVnaW5Cb3goImVzZHMiKTsKIAogICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgLy8gdmVyc2lvbj0wLCBmbGFncz0wCiAKICAgICBtT3duZXItPndyaXRlSW50OCgweDAzKTsgIC8vIEVTX0Rlc2NyVGFnCi0gICAgbU93bmVyLT53cml0ZUludDgoMjMgKyBtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKKyAgICBtT3duZXItPndyaXRlKHNpemVFU0RCdWZmZXIsIHNpemVFU0QpOwogICAgIG1Pd25lci0+d3JpdGVJbnQxNigweDAwMDApOyAgLy8gRVNfSUQKICAgICBtT3duZXItPndyaXRlSW50OCgweDFmKTsKIAogICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MDQpOyAgLy8gRGVjb2RlckNvbmZpZ0Rlc2NyVGFnCi0gICAgbU93bmVyLT53cml0ZUludDgoMTUgKyBtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKKyAgICBtT3duZXItPndyaXRlKHNpemVEQ0RCdWZmZXIsIHNpemVEQ0QpOwogICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MjApOyAgLy8gb2JqZWN0VHlwZUluZGljYXRpb24gSVNPL0lFQyAxNDQ5Mi0yCiAgICAgbU93bmVyLT53cml0ZUludDgoMHgxMSk7ICAvLyBzdHJlYW1UeXBlIFZpc3VhbFN0cmVhbQogCkBAIC0zODY1LDcgKzM5OTgsNyBAQAogCiAgICAgbU93bmVyLT53cml0ZUludDgoMHgwNSk7ICAvLyBEZWNvZGVyU3BlY2lmaWNJbmZvVGFnCiAKLSAgICBtT3duZXItPndyaXRlSW50OChtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKKyAgICBtT3duZXItPndyaXRlKHNpemVEU0lCdWZmZXIsIHNpemVEU0kpOwogICAgIG1Pd25lci0+d3JpdGUobUNvZGVjU3BlY2lmaWNEYXRhLCBtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKIAogICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtEYXRhMltdID0gewpAQCAtMzk1OSw2ICs0MDkyLDMzIEBACiAgICAgbU93bmVyLT5lbmRCb3goKTsKIH0KIAordm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OndyaXRlRWR0c0JveCgpeworICAgIEFMT0dWKCIlcyA6IGdldFN0YXJ0VGltZU9mZnNldFRpbWVVcyBvZiB0cmFjazolIiBQUklkNjQgIiB1cyIsIGdldFRyYWNrVHlwZSgpLAorICAgICAgICBnZXRTdGFydFRpbWVPZmZzZXRUaW1lVXMoKSk7CisKKyAgICAvLyBQcmVwb25lIHZpZGVvIHBsYXliYWNrLgorICAgIGlmIChtTWluQ3R0c09mZnNldFRpY2tzICE9IG1NYXhDdHRzT2Zmc2V0VGlja3MpIHsKKyAgICAgICAgaW50MzJfdCBtdmhkVGltZVNjYWxlID0gbU93bmVyLT5nZXRUaW1lU2NhbGUoKTsKKyAgICAgICAgdWludDMyX3QgdGtoZER1cmF0aW9uID0gKGdldER1cmF0aW9uVXMoKSAqIG12aGRUaW1lU2NhbGUgKyA1RTUpIC8gMUU2OworICAgICAgICBpbnQ2NF90IG1lZGlhVGltZSA9ICgoa01heEN0dHNPZmZzZXRUaW1lVXMgLSBnZXRNaW5DdHRzT2Zmc2V0VGltZVVzKCkpCisgICAgICAgICAgICAqIG1UaW1lU2NhbGUgKyA1RTUpIC8gMUU2OworICAgICAgICBpZiAodGtoZER1cmF0aW9uID4gMCAmJiBtZWRpYVRpbWUgPiAwKSB7CisgICAgICAgICAgICBhZGRPbmVFbHN0VGFibGVFbnRyeSh0a2hkRHVyYXRpb24sIG1lZGlhVGltZSwgMSwgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobUVsc3RUYWJsZUVudHJpZXMtPmNvdW50KCkgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbU93bmVyLT5iZWdpbkJveCgiZWR0cyIpOworICAgICAgICBtT3duZXItPmJlZ2luQm94KCJlbHN0Iik7CisgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7IC8vIHZlcnNpb249MCwgZmxhZ3M9MAorICAgICAgICAgICAgbUVsc3RUYWJsZUVudHJpZXMtPndyaXRlKG1Pd25lcik7CisgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7IC8vIGVsc3Q7CisgICAgbU93bmVyLT5lbmRCb3goKTsgLy8gZWR0cworfQorCiB2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVNZGhkQm94KHVpbnQzMl90IG5vdykgewogICAgIGludDY0X3QgdHJha0R1cmF0aW9uVXMgPSBnZXREdXJhdGlvblVzKCk7CiAgICAgaW50NjRfdCBtZGhkRHVyYXRpb24gPSAodHJha0R1cmF0aW9uVXMgKiBtVGltZVNjYWxlICsgNUU1KSAvIDFFNjsKQEAgLTQwOTUsNyArNDI1NSw5IEBACiAgICAgICAgIHVpbnQzMl90IGR1cmF0aW9uOwogICAgICAgICBDSEVDSyhtU3R0c1RhYmxlRW50cmllcy0+Z2V0KGR1cmF0aW9uLCAxKSk7CiAgICAgICAgIGR1cmF0aW9uID0gaHRvbmwoZHVyYXRpb24pOyAgLy8gQmFjayB0byBob3N0IGJ5dGUgb3JkZXIKLSAgICAgICAgbVN0dHNUYWJsZUVudHJpZXMtPnNldChodG9ubChkdXJhdGlvbiArIGdldFN0YXJ0VGltZU9mZnNldFNjYWxlZFRpbWUoKSksIDEpOworICAgICAgICBpbnQzMl90IHN0YXJ0VGltZU9mZnNldFNjYWxlZCA9ICgoKGdldFN0YXJ0VGltZU9mZnNldFRpbWVVcygpICsKKyAgICAgICAgICAgIG1Pd25lci0+Z2V0U3RhcnRUaW1lT2Zmc2V0QkZyYW1lc1VzKCkpICogbVRpbWVTY2FsZSkgKyA1MDAwMDBMTCkgLyAxMDAwMDAwTEw7CisgICAgICAgIG1TdHRzVGFibGVFbnRyaWVzLT5zZXQoaHRvbmwoKGludDMyX3QpZHVyYXRpb24gKyBzdGFydFRpbWVPZmZzZXRTY2FsZWQpLCAxKTsKICAgICB9CiAgICAgbVN0dHNUYWJsZUVudHJpZXMtPndyaXRlKG1Pd25lcik7CiAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIHN0dHMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ2xvY2suY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5jcHAKaW5kZXggNDFkYmZkNC4uNGY5YmM2ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5jcHAKQEAgLTI4LDcgKzI4LDcgQEAKIAogLy8gTWF4aW11bSBhbGxvd2VkIHRpbWUgYmFja3dhcmRzIGZyb20gYW5jaG9yIGNoYW5nZS4KIC8vIElmIGxhcmdlciB0aGFuIHRoaXMgdGhyZXNob2xkLCBpdCdzIHRyZWF0ZWQgYXMgZGlzY29udGludWl0eS4KLXN0YXRpYyBjb25zdCBpbnQ2NF90IGtBbmNob3JGbHVjdHVhdGlvbkFsbG93ZWRVcyA9IDEwMDAwbGw7CitzdGF0aWMgY29uc3QgaW50NjRfdCBrQW5jaG9yRmx1Y3R1YXRpb25BbGxvd2VkVXMgPSAxMDAwMExMOwogCiBNZWRpYUNsb2NrOjpUaW1lcjo6VGltZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGludDY0X3QgbWVkaWFUaW1lVXMsIGludDY0X3QgYWRqdXN0UmVhbFVzKQogICAgIDogbU5vdGlmeShub3RpZnkpLApAQCAtMTEwLDcgKzExMCw3IEBACiAgICAgaWYgKG1BbmNob3JUaW1lUmVhbFVzICE9IC0xKSB7CiAgICAgICAgIGludDY0X3Qgb2xkTm93TWVkaWFVcyA9CiAgICAgICAgICAgICBtQW5jaG9yVGltZU1lZGlhVXMgKyAobm93VXMgLSBtQW5jaG9yVGltZVJlYWxVcykgKiAoZG91YmxlKW1QbGF5YmFja1JhdGU7Ci0gICAgICAgIGlmIChub3dNZWRpYVVzIDwgb2xkTm93TWVkaWFVcworICAgICAgICBpZiAobm93TWVkaWFVcyA8IG9sZE5vd01lZGlhVXMgKyBrQW5jaG9yRmx1Y3R1YXRpb25BbGxvd2VkVXMKICAgICAgICAgICAgICAgICAmJiBub3dNZWRpYVVzID4gb2xkTm93TWVkaWFVcyAtIGtBbmNob3JGbHVjdHVhdGlvbkFsbG93ZWRVcykgewogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCmluZGV4IDM1M2U0MDcuLmU1Njc1MGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCkBAIC01NTAsNyArNTUwLDcgQEAKIAogdm9pZCBNZWRpYUNvZGVjOjppbml0QW5hbHl0aWNzSXRlbSgpIHsKICAgICBpZiAobUFuYWx5dGljc0l0ZW0gPT0gTlVMTCkgewotICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa0NvZGVjS2V5TmFtZSk7CisgICAgICAgIG1BbmFseXRpY3NJdGVtID0gTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoa0NvZGVjS2V5TmFtZSk7CiAgICAgfQogCiAgICAgbUxhdGVuY3lIaXN0LnNldHVwKGtMYXRlbmN5SGlzdEJ1Y2tldHMsIGtMYXRlbmN5SGlzdFdpZHRoLCBrTGF0ZW5jeUhpc3RGbG9vcik7CkBAIC04NjIsOSArODYyLDkgQEAKIC8vc3RhdGljCiBzcDxDb2RlY0Jhc2U+IE1lZGlhQ29kZWM6OkdldENvZGVjQmFzZShjb25zdCBBU3RyaW5nICZuYW1lLCBjb25zdCBjaGFyICpvd25lcikgewogICAgIGlmIChvd25lcikgewotICAgICAgICBpZiAoc3RybmNtcChvd25lciwgImRlZmF1bHQiLCA4KSA9PSAwKSB7CisgICAgICAgIGlmIChzdHJjbXAob3duZXIsICJkZWZhdWx0IikgPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBBQ29kZWM7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcChvd25lciwgImNvZGVjMiIsIDcpID09IDApIHsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKG93bmVyLCAiY29kZWMyIiwgNikgPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuIENyZWF0ZUNDb2RlYygpOwogICAgICAgICB9CiAgICAgfQpAQCAtOTExLDEwICs5MTEsMTAgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIG1Db2RlY0luZm8gPSBtY2wtPmdldENvZGVjSW5mbyhjb2RlY0lkeCk7Ci0gICAgICAgIFZlY3RvcjxBU3RyaW5nPiBtaW1lczsKLSAgICAgICAgbUNvZGVjSW5mby0+Z2V0U3VwcG9ydGVkTWltZXMoJm1pbWVzKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtaW1lcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKG1pbWVzW2ldLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7CisgICAgICAgIFZlY3RvcjxBU3RyaW5nPiBtZWRpYVR5cGVzOworICAgICAgICBtQ29kZWNJbmZvLT5nZXRTdXBwb3J0ZWRNZWRpYVR5cGVzKCZtZWRpYVR5cGVzKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtZWRpYVR5cGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAobWVkaWFUeXBlc1tpXS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgewogICAgICAgICAgICAgICAgIG1Jc1ZpZGVvID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTEwNTIsOCArMTA1Miw5IEBACiAgICAgICAgIH0KIAogICAgICAgICAvLyBQcmV2ZW50IHBvc3NpYmxlIGludGVnZXIgb3ZlcmZsb3cgaW4gZG93bnN0cmVhbSBjb2RlLgotICAgICAgICBpZiAoKHVpbnQ2NF90KW1WaWRlb1dpZHRoICogbVZpZGVvSGVpZ2h0ID4gKHVpbnQ2NF90KUlOVDMyX01BWCAvIDQpIHsKLSAgICAgICAgICAgIEFMT0dFKCJidWZmZXIgc2l6ZSBpcyB0b28gYmlnLCB3aWR0aD0lZCwgaGVpZ2h0PSVkIiwgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CisgICAgICAgIGlmIChtVmlkZW9XaWR0aCA8IDAgfHwgbVZpZGVvSGVpZ2h0IDwgMCB8fAorICAgICAgICAgICAgICAgKHVpbnQ2NF90KW1WaWRlb1dpZHRoICogbVZpZGVvSGVpZ2h0ID4gKHVpbnQ2NF90KUlOVDMyX01BWCAvIDQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHNpemUocyksIHdpZHRoPSVkLCBoZWlnaHQ9JWQiLCBtVmlkZW9XaWR0aCwgbVZpZGVvSGVpZ2h0KTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMTA5LDYgKzExMTAsOSBAQAogICAgICAgICAgICAgcmVzZXQoKTsKICAgICAgICAgfQogICAgICAgICBpZiAoIWlzUmVzb3VyY2VFcnJvcihlcnIpKSB7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgZGlzYWJsZUxlZ2FjeUJ1ZmZlckRyb3BQb3N0UShzdXJmYWNlKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpAQCAtMTE3NCw3ICsxMTc4LDExIEBACiAgICAgbXNnLT5zZXRPYmplY3QoInN1cmZhY2UiLCBzdXJmYWNlKTsKIAogICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKLSAgICByZXR1cm4gUG9zdEFuZEF3YWl0UmVzcG9uc2UobXNnLCAmcmVzcG9uc2UpOworICAgIHN0YXR1c190IHJlc3VsdCA9IFBvc3RBbmRBd2FpdFJlc3BvbnNlKG1zZywgJnJlc3BvbnNlKTsKKyAgICBpZiAocmVzdWx0ID09IE9LKSB7CisgICAgICAgIGRpc2FibGVMZWdhY3lCdWZmZXJEcm9wUG9zdFEoc3VyZmFjZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIHN0YXR1c190IE1lZGlhQ29kZWM6OmNyZWF0ZUlucHV0U3VyZmFjZSgKQEAgLTE2NTgsMTAgKzE2NjYsMTIgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBpbnQzMl90IGNvbG9yRm9ybWF0OwotICAgIGlmIChtU29mdFJlbmRlcmVyICE9IE5VTEwKLSAgICAgICAgICAgICYmIG1PdXRwdXRGb3JtYXQtPmNvbnRhaW5zKCJoZHItc3RhdGljLWluZm8iKQorICAgIGlmIChtT3V0cHV0Rm9ybWF0LT5jb250YWlucygiaGRyLXN0YXRpYy1pbmZvIikKICAgICAgICAgICAgICYmIG1PdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0KQotICAgICAgICAgICAgJiYgKGNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNikpIHsKKyAgICAgICAgICAgIC8vIGNoZWNrIGZvcm1hdCBmb3IgT01YIG9ubHksIGZvciBDMiB0aGUgZm9ybWF0IGlzIGFsd2F5cyBvcGFxdWUgc2luY2UgdGhlCisgICAgICAgICAgICAvLyBzb2Z0d2FyZSByZW5kZXJpbmcgZG9lc24ndCBnbyB0aHJvdWdoIGNsaWVudAorICAgICAgICAgICAgJiYgKChtU29mdFJlbmRlcmVyICE9IE5VTEwgJiYgY29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjE2KQorICAgICAgICAgICAgICAgICAgICB8fCBtT3duZXJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImNvZGVjMjo6c29mdHdhcmUiKSkpIHsKICAgICAgICAgaW50MzJfdCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHdpZHRoLCBoZWlnaHQ7CiAgICAgICAgIGludDY0X3QgdG90YWxQaXhlbCA9IDA7CiAgICAgICAgIGlmIChtT3V0cHV0Rm9ybWF0LT5maW5kUmVjdCgiY3JvcCIsICZsZWZ0LCAmdG9wLCAmcmlnaHQsICZib3R0b20pKSB7CkBAIC0xODI5LDggKzE4MzksOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzaHV0ZG93biBjb21wbGV0ZSBub3RpZmljYXRpb24uIElmIHdlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QsIHdlJ2xsIHRpbWVvdXQgYW5kIGZvcmNlIHJlbGVhc2UuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZEVycm9yUmVzcG9uc2UgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZhbGwtdGhydQogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBTVE9QUElORzoKICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdTYXdNZWRpYVNlcnZlckRpZSkgewpAQCAtMTkzMyw2ICsxOTQzLDEzIEBACiAKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q29tcG9uZW50QWxsb2NhdGVkOgogICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBSRUxFQVNJTkcgfHwgbVN0YXRlID09IFVOSU5JVElBTElaRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgYSBrV2hhdEVycm9yIG9yIGtXaGF0UmVsZWFzZSBtZXNzYWdlIGNhbWUgaW4gYW5kIHJlcGxpZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBsb2cgYSB3YXJuaW5nIGFuZCBpZ25vcmUuCisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiYWxsb2NhdGUgaW50ZXJydXB0ZWQgYnkgZXJyb3Igb3IgcmVsZWFzZSwgY3VycmVudCBzdGF0ZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobVN0YXRlLCBJTklUSUFMSVpJTkcpOwogICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShJTklUSUFMSVpFRCk7CiAgICAgICAgICAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ0lzQ29tcG9uZW50QWxsb2NhdGVkOwpAQCAtMTk1MCw2ICsxOTY3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdVc2VzU29mdHdhcmVSZW5kZXJlcjsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtT3duZXJOYW1lID0gb3duZXI7CiAKICAgICAgICAgICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6VHlwZSByZXNvdXJjZVR5cGU7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29tcG9uZW50TmFtZS5lbmRzV2l0aCgiLnNlY3VyZSIpKSB7CkBAIC0xOTczLDEwICsxOTkxLDExIEBACiAKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q29tcG9uZW50Q29uZmlndXJlZDoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gVU5JTklUSUFMSVpFRCB8fCBtU3RhdGUgPT0gSU5JVElBTElaRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgYSBrV2hhdEVycm9yIG1lc3NhZ2UgY2FtZSBpbiBhbmQgcmVwbGllZCB3aXRoIGVycm9yLAorICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IFJFTEVBU0lORyB8fCBtU3RhdGUgPT0gVU5JTklUSUFMSVpFRCB8fCBtU3RhdGUgPT0gSU5JVElBTElaRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgYSBrV2hhdEVycm9yIG9yIGtXaGF0UmVsZWFzZSBtZXNzYWdlIGNhbWUgaW4gYW5kIHJlcGxpZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBsb2cgYSB3YXJuaW5nIGFuZCBpZ25vcmUuCi0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiY29uZmlndXJlIGludGVycnVwdGVkIGJ5IGVycm9yLCBjdXJyZW50IHN0YXRlICVkIiwgbVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjb25maWd1cmUgaW50ZXJydXB0ZWQgYnkgZXJyb3Igb3IgcmVsZWFzZSwgY3VycmVudCBzdGF0ZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobVN0YXRlLCBDT05GSUdVUklORyk7CkBAIC0yMDY3LDYgKzIwODYsMTMgQEAKIAogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRTdGFydENvbXBsZXRlZDoKICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gUkVMRUFTSU5HIHx8IG1TdGF0ZSA9PSBVTklOSVRJQUxJWkVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIGEga1doYXRSZWxlYXNlIG1lc3NhZ2UgY2FtZSBpbiBhbmQgcmVwbGllZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGxvZyBhIHdhcm5pbmcgYW5kIGlnbm9yZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJzdGFydCBpbnRlcnJ1cHRlZCBieSByZWxlYXNlLCBjdXJyZW50IHN0YXRlICVkIiwgbVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobVN0YXRlLCBTVEFSVElORyk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtSXNWaWRlbykgewogICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVzb3VyY2UoCkBAIC0yMTk3LDcgKzIyMjMsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGhkcjEwUGx1c0luZm87CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1PdXRwdXRGb3JtYXQtPmZpbmRCdWZmZXIoImhkcjEwLXBsdXMtaW5mbyIsICZoZHIxMFBsdXNJbmZvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaGRyMTBQbHVzSW5mbyAhPSBudWxscHRyICYmIGhkcjEwUGx1c0luZm8tPnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19oZHIxMF9wbHVzX21ldGFkYXRhKG1TdXJmYWNlLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhkcjEwUGx1c0luZm8tPnNpemUoKSwgaGRyMTBQbHVzSW5mby0+ZGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWltZS5zdGFydHNXaXRoSWdub3JlQ2FzZSgidmlkZW8vIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1cmZhY2UtPnNldERlcXVldWVUaW1lb3V0KC0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNvZnRSZW5kZXJlciA9IG5ldyBTb2Z0d2FyZVJlbmRlcmVyKG1TdXJmYWNlLCBtUm90YXRpb25EZWdyZWVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CkBAIC0yNDg1LDYgKzI1MTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAobUZsYWdzICYga0ZsYWdQdXNoQmxhbmtCdWZmZXJzT25TaHV0ZG93bikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoQmxhbmtCdWZmZXJzVG9OYXRpdmVXaW5kb3cobVN1cmZhY2UuZ2V0KCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VyZmFjZS0+c2V0RGVxdWV1ZVRpbWVvdXQoLTEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNvZnRSZW5kZXJlciA9IG5ldyBTb2Z0d2FyZVJlbmRlcmVyKHN1cmZhY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogY2hlY2sgaWYgdGhpcyB3YXMgc3VjY2Vzc2Z1bAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMjYyNSwxMSArMjY2MCwxMiBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBJZiB3ZSdyZSBmbHVzaGluZywgb3Igd2UncmUgc3RvcHBpbmcgYnV0IHJlY2VpdmVkIGEgcmVsZWFzZQotICAgICAgICAgICAgLy8gcmVxdWVzdCwgcG9zdCB0aGUgcmVwbHkgZm9yIHRoZSBwZW5kaW5nIGNhbGwgZmlyc3QsIGFuZCBjb25zaWRlcgotICAgICAgICAgICAgLy8gaXQgZG9uZS4gVGhlIHJlcGx5IHRva2VuIHdpbGwgYmUgcmVwbGFjZWQgYWZ0ZXIgdGhpcywgYW5kIHdlJ2xsCi0gICAgICAgICAgICAvLyBubyBsb25nZXIgYmUgYWJsZSB0byByZXBseS4KLSAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gRkxVU0hJTkcgfHwgbVN0YXRlID09IFNUT1BQSU5HKSB7CisgICAgICAgICAgICAvLyBJZiB3ZSdyZSBmbHVzaGluZywgc3RvcHBpbmcsIGNvbmZpZ3VyaW5nIG9yIHN0YXJ0aW5nICBidXQKKyAgICAgICAgICAgIC8vIHJlY2VpdmVkIGEgcmVsZWFzZSByZXF1ZXN0LCBwb3N0IHRoZSByZXBseSBmb3IgdGhlIHBlbmRpbmcgY2FsbAorICAgICAgICAgICAgLy8gZmlyc3QsIGFuZCBjb25zaWRlciBpdCBkb25lLiBUaGUgcmVwbHkgdG9rZW4gd2lsbCBiZSByZXBsYWNlZAorICAgICAgICAgICAgLy8gYWZ0ZXIgdGhpcywgYW5kIHdlJ2xsIG5vIGxvbmdlciBiZSBhYmxlIHRvIHJlcGx5LgorICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBGTFVTSElORyB8fCBtU3RhdGUgPT0gU1RPUFBJTkcKKyAgICAgICAgICAgICAgICAgICAgfHwgbVN0YXRlID09IENPTkZJR1VSSU5HIHx8IG1TdGF0ZSA9PSBTVEFSVElORykgewogICAgICAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UpLT5wb3N0UmVwbHkobVJlcGx5SUQpOwogICAgICAgICAgICAgfQogCkBAIC0yNjc0LDcgKzI3MTAsNyBAQAogICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogCiAgICAgICAgICAgICBpZiAobUZsYWdzICYga0ZsYWdJc0FzeW5jKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImRlcXVldWVPdXRwdXRCdWZmZXIgY2FuJ3QgYmUgdXNlZCBpbiBhc3luYyBtb2RlIik7CisgICAgICAgICAgICAgICAgQUxPR0UoImRlcXVldWVJbnB1dEJ1ZmZlciBjYW4ndCBiZSB1c2VkIGluIGFzeW5jIG1vZGUiKTsKICAgICAgICAgICAgICAgICBQb3N0UmVwbHlXaXRoRXJyb3IocmVwbHlJRCwgSU5WQUxJRF9PUEVSQVRJT04pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMjY5Miw3ICsyNzI4LDcgQEAKICAgICAgICAgICAgIGludDY0X3QgdGltZW91dFVzOwogICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVvdXRVcyIsICZ0aW1lb3V0VXMpKTsKIAotICAgICAgICAgICAgaWYgKHRpbWVvdXRVcyA9PSAwbGwpIHsKKyAgICAgICAgICAgIGlmICh0aW1lb3V0VXMgPT0gMExMKSB7CiAgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIC1FQUdBSU4pOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMjcwMCw3ICsyNzM2LDcgQEAKICAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ0RlcXVldWVJbnB1dFBlbmRpbmc7CiAgICAgICAgICAgICBtRGVxdWV1ZUlucHV0UmVwbHlJRCA9IHJlcGx5SUQ7CiAKLSAgICAgICAgICAgIGlmICh0aW1lb3V0VXMgPiAwbGwpIHsKKyAgICAgICAgICAgIGlmICh0aW1lb3V0VXMgPiAwTEwpIHsKICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gdGltZW91dE1zZyA9CiAgICAgICAgICAgICAgICAgICAgIG5ldyBBTWVzc2FnZShrV2hhdERlcXVldWVJbnB1dFRpbWVkT3V0LCB0aGlzKTsKICAgICAgICAgICAgICAgICB0aW1lb3V0TXNnLT5zZXRJbnQzMigKQEAgLTI3NjYsNyArMjgwMiw3IEBACiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVvdXRVczsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lb3V0VXMiLCAmdGltZW91dFVzKSk7CiAKLSAgICAgICAgICAgIGlmICh0aW1lb3V0VXMgPT0gMGxsKSB7CisgICAgICAgICAgICBpZiAodGltZW91dFVzID09IDBMTCkgewogICAgICAgICAgICAgICAgIFBvc3RSZXBseVdpdGhFcnJvcihyZXBseUlELCAtRUFHQUlOKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTI3NzQsNyArMjgxMCw3IEBACiAgICAgICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdEZXF1ZXVlT3V0cHV0UGVuZGluZzsKICAgICAgICAgICAgIG1EZXF1ZXVlT3V0cHV0UmVwbHlJRCA9IHJlcGx5SUQ7CiAKLSAgICAgICAgICAgIGlmICh0aW1lb3V0VXMgPiAwbGwpIHsKKyAgICAgICAgICAgIGlmICh0aW1lb3V0VXMgPiAwTEwpIHsKICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gdGltZW91dE1zZyA9CiAgICAgICAgICAgICAgICAgICAgIG5ldyBBTWVzc2FnZShrV2hhdERlcXVldWVPdXRwdXRUaW1lZE91dCwgdGhpcyk7CiAgICAgICAgICAgICAgICAgdGltZW91dE1zZy0+c2V0SW50MzIoCkBAIC0zMDM1LDcgKzMwNzEsNyBAQAogICAgIG1zZy0+c2V0U2l6ZSgiaW5kZXgiLCBidWZmZXJJbmRleCk7CiAgICAgbXNnLT5zZXRTaXplKCJvZmZzZXQiLCAwKTsKICAgICBtc2ctPnNldFNpemUoInNpemUiLCBjc2QtPnNpemUoKSk7Ci0gICAgbXNnLT5zZXRJbnQ2NCgidGltZVVzIiwgMGxsKTsKKyAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCAwTEwpOwogICAgIG1zZy0+c2V0SW50MzIoImZsYWdzIiwgQlVGRkVSX0ZMQUdfQ09ERUNDT05GSUcpOwogICAgIG1zZy0+c2V0UG9pbnRlcigiZXJyb3JEZXRhaWxNc2ciLCAmZXJyb3JEZXRhaWxNc2cpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5jcHAKaW5kZXggZWFmZjI4My4uM2Q1OGQ0YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcApAQCAtNzcsNyArNzcsOCBAQAogICAgIHJldHVybiBwcm9maWxpbmdOZWVkZWQ7CiB9CiAKLU9teEluZm9CdWlsZGVyIHNPbXhJbmZvQnVpbGRlcjsKK09teEluZm9CdWlsZGVyIHNPbXhJbmZvQnVpbGRlcnt0cnVlIC8qIGFsbG93U3VyZmFjZUVuY29kZXJzICovfTsKK09teEluZm9CdWlsZGVyIHNPbXhOb1N1cmZhY2VFbmNvZGVySW5mb0J1aWxkZXJ7ZmFsc2UgLyogYWxsb3dTdXJmYWNlRW5jb2RlcnMgKi99OwogCiBNdXRleCBzQ29kZWMySW5mb0J1aWxkZXJNdXRleDsKIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlPiBzQ29kZWMySW5mb0J1aWxkZXI7CkBAIC05OCw3ICs5OSwxMSBAQAogICAgIHNwPFBlcnNpc3RlbnRTdXJmYWNlPiBzdXJmYWNlVGVzdCA9CiAgICAgICAgIFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyOjpHZXRDQ29kZWNJbnN0YW5jZSgpLT5jcmVhdGVJbnB1dFN1cmZhY2UoKTsKICAgICBpZiAoc3VyZmFjZVRlc3QgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRCgiQWxsb3dpbmcgYWxsIE9NWCBjb2RlY3MiKTsKICAgICAgICAgYnVpbGRlcnMucHVzaF9iYWNrKCZzT214SW5mb0J1aWxkZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dEKCJBbGxvd2luZyBvbmx5IG5vbi1zdXJmYWNlLWVuY29kZXIgT01YIGNvZGVjcyIpOworICAgICAgICBidWlsZGVycy5wdXNoX2JhY2soJnNPbXhOb1N1cmZhY2VFbmNvZGVySW5mb0J1aWxkZXIpOwogICAgIH0KICAgICBidWlsZGVycy5wdXNoX2JhY2soR2V0Q29kZWMySW5mb0J1aWxkZXIoKSk7CiAgICAgcmV0dXJuIGJ1aWxkZXJzOwpAQCAtMjE1LDE0ICsyMjAsMjUgQEAKICAgICAgICAgICAgIG1Db2RlY0luZm9zLmJlZ2luKCksCiAgICAgICAgICAgICBtQ29kZWNJbmZvcy5lbmQoKSwKICAgICAgICAgICAgIFtdKGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiAmaW5mbzEsIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiAmaW5mbzIpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5mbzIgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbmZvMSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmZvMS0+cmFuaygpIDwgaW5mbzItPnJhbmsoKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gbnVsbCBpcyBsb3dlc3QKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5mbzEgPT0gbnVsbHB0cgorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGluZm8yICE9IG51bGxwdHIgJiYgaW5mbzEtPmdldFJhbmsoKSA8IGluZm8yLT5nZXRSYW5rKCkpOwogICAgICAgICAgICAgfSk7CisKKyAgICAvLyByZW1vdmUgZHVwbGljYXRlIGVudHJpZXMKKyAgICBib29sIGRlZHVwZSA9IHByb3BlcnR5X2dldF9ib29sKCJkZWJ1Zy5zdGFnZWZyaWdodC5kZWR1cGUtY29kZWNzIiwgdHJ1ZSk7CisgICAgaWYgKGRlZHVwZSkgeworICAgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gY29kZWNzU2VlbjsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbUNvZGVjSW5mb3MuYmVnaW4oKTsgaXQgIT0gbUNvZGVjSW5mb3MuZW5kKCk7ICkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29kZWNOYW1lID0gKCppdCktPmdldENvZGVjTmFtZSgpOworICAgICAgICAgICAgaWYgKGNvZGVjc1NlZW4uY291bnQoY29kZWNOYW1lKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29kZWNzU2Vlbi5lbXBsYWNlKGNvZGVjTmFtZSk7CisgICAgICAgICAgICAgICAgaXQrKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaXQgPSBtQ29kZWNJbmZvcy5lcmFzZShpdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CiAKIE1lZGlhQ29kZWNMaXN0Ojp+TWVkaWFDb2RlY0xpc3QoKSB7CkBAIC0yNzIsMTAgKzI4OCwxNyBAQAogfQogCiBzc2l6ZV90IE1lZGlhQ29kZWNMaXN0OjpmaW5kQ29kZWNCeU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3QgeworICAgIFZlY3RvcjxBU3RyaW5nPiBhbGlhc2VzOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvZGVjSW5mb3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgaWYgKHN0cmNtcChtQ29kZWNJbmZvc1tpXS0+Z2V0Q29kZWNOYW1lKCksIG5hbWUpID09IDApIHsKICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICB9CisgICAgICAgIG1Db2RlY0luZm9zW2ldLT5nZXRBbGlhc2VzKCZhbGlhc2VzKTsKKyAgICAgICAgZm9yIChjb25zdCBBU3RyaW5nICZhbGlhcyA6IGFsaWFzZXMpIHsKKyAgICAgICAgICAgIGlmIChhbGlhcyA9PSBuYW1lKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gLUVOT0VOVDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmNwcAppbmRleCBjYWM1M2Y0Li5kZDdjM2U2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuY3BwCkBAIC0yMjgsMTggKzIyOCwxOCBAQAogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KIAotICAgICAgICBWZWN0b3I8QVN0cmluZz4gbWltZXM7Ci0gICAgICAgIGluZm8tPmdldFN1cHBvcnRlZE1pbWVzKCZtaW1lcyk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWltZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgVmVjdG9yPEFTdHJpbmc+IG1lZGlhVHlwZXM7CisgICAgICAgIGluZm8tPmdldFN1cHBvcnRlZE1lZGlhVHlwZXMoJm1lZGlhVHlwZXMpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1lZGlhVHlwZXMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+ICZjYXBzID0KLSAgICAgICAgICAgICAgICAgICAgaW5mby0+Z2V0Q2FwYWJpbGl0aWVzRm9yKG1pbWVzW2ldLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBpbmZvLT5nZXRDYXBhYmlsaXRpZXNGb3IobWVkaWFUeXBlc1tpXS5jX3N0cigpKTsKICAgICAgICAgICAgIGlmICghZm9yY2VUb01lYXN1cmUgJiYKICAgICAgICAgICAgICAgICAoY2Fwcy0+Z2V0RGV0YWlscygpLT5jb250YWlucygibWF4LXN1cHBvcnRlZC1pbnN0YW5jZXMiKSB8fAogICAgICAgICAgICAgICAgICBjYXBzLT5nZXREZXRhaWxzKCktPmNvbnRhaW5zKCJtYXgtY29uY3VycmVudC1pbnN0YW5jZXMiKSkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgc2l6ZV90IG1heCA9IGRvUHJvZmlsZUNvZGVjcyhpbmZvLT5pc0VuY29kZXIoKSwgbmFtZSwgbWltZXNbaV0sIGNhcHMpOworICAgICAgICAgICAgc2l6ZV90IG1heCA9IGRvUHJvZmlsZUNvZGVjcyhpbmZvLT5pc0VuY29kZXIoKSwgbmFtZSwgbWVkaWFUeXBlc1tpXSwgY2Fwcyk7CiAgICAgICAgICAgICBpZiAobWF4ID4gMCkgewogICAgICAgICAgICAgICAgIENvZGVjU2V0dGluZ3Mgc2V0dGluZ3M7CiAgICAgICAgICAgICAgICAgY2hhciBtYXhTdHJbMzJdOwpAQCAtMjQ4LDcgKzI0OCw3IEBACiAKICAgICAgICAgICAgICAgICBBU3RyaW5nIGtleSA9IG5hbWU7CiAgICAgICAgICAgICAgICAga2V5LmFwcGVuZCgiICIpOwotICAgICAgICAgICAgICAgIGtleS5hcHBlbmQobWltZXNbaV0pOworICAgICAgICAgICAgICAgIGtleS5hcHBlbmQobWVkaWFUeXBlc1tpXSk7CiAKICAgICAgICAgICAgICAgICBpZiAoaW5mby0+aXNFbmNvZGVyKCkpIHsKICAgICAgICAgICAgICAgICAgICAgZW5jb2Rlcl9yZXN1bHRzLT5hZGQoa2V5LCBzZXR0aW5ncyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdFdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdFdyaXRlci5jcHAKaW5kZXggYjMyZTQ3MC4uYzRmYjE5OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmNwcApAQCAtMzcsNiArMzcsMTYgQEAKICAgICAgICAgICAgIG5ldyBNZWRpYUNvZGVjSW5mb1dyaXRlcihpbmZvLmdldCgpKSk7CiB9CiAKK3N0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mb1dyaXRlcj4KKyAgICAgICAgTWVkaWFDb2RlY0xpc3RXcml0ZXI6OmZpbmRNZWRpYUNvZGVjSW5mbyhjb25zdCBjaGFyICpuYW1lKSB7CisgICAgZm9yIChjb25zdCBzcDxNZWRpYUNvZGVjSW5mbz4gJmluZm8gOiBtQ29kZWNJbmZvcykgeworICAgICAgICBpZiAoIXN0cmNtcChpbmZvLT5nZXRDb2RlY05hbWUoKSwgbmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+KG5ldyBNZWRpYUNvZGVjSW5mb1dyaXRlcihpbmZvLmdldCgpKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKIHZvaWQgTWVkaWFDb2RlY0xpc3RXcml0ZXI6OndyaXRlR2xvYmFsU2V0dGluZ3MoCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZ2xvYmFsU2V0dGluZ3MpIGNvbnN0IHsKICAgICBmb3IgKGNvbnN0IHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+ICZrdiA6IG1HbG9iYWxTZXR0aW5ncykgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY1NvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmNwcAppbmRleCAyMDg4MWE0Li41MGU0NTRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmNwcApAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KQEAgLTM2Miw3ICszNjMsNyBAQAogCiBzdGF0dXNfdCBNZWRpYUNvZGVjU291cmNlOjpzZXRJbnB1dEJ1ZmZlclRpbWVPZmZzZXQoaW50NjRfdCB0aW1lT2Zmc2V0VXMpIHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0SW5wdXRCdWZmZXJUaW1lT2Zmc2V0LCBtUmVmbGVjdG9yKTsKLSAgICBtc2ctPnNldEludDY0KCJ0aW1lLW9mZnNldC11cyIsIHRpbWVPZmZzZXRVcyk7CisgICAgbXNnLT5zZXRJbnQ2NChQQVJBTUVURVJfS0VZX09GRlNFVF9USU1FLCB0aW1lT2Zmc2V0VXMpOwogICAgIHJldHVybiBwb3N0U3luY2hyb25vdXNseUFuZFJldHVybkVycm9yKG1zZyk7CiB9CiAKQEAgLTM3Miw3ICszNzMsNyBAQAogICAgIG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKICAgICBpbnQ2NF90IHRpbWVVczsKICAgICBpZiAoIXJlc3BvbnNlLT5maW5kSW50NjQoInRpbWUtdXMiLCAmdGltZVVzKSkgewotICAgICAgICB0aW1lVXMgPSAtMWxsOworICAgICAgICB0aW1lVXMgPSAtMUxMOwogICAgIH0KICAgICByZXR1cm4gdGltZVVzOwogfQpAQCAtNDUyLDkgKzQ1Myw5IEBACiAgICAgICBtRW5jb2RlckRhdGFTcGFjZSgwKSwKICAgICAgIG1QZXJzaXN0ZW50U3VyZmFjZShwZXJzaXN0ZW50U3VyZmFjZSksCiAgICAgICBtSW5wdXRCdWZmZXJUaW1lT2Zmc2V0VXMoMCksCi0gICAgICBtRmlyc3RTYW1wbGVTeXN0ZW1UaW1lVXMoLTFsbCksCisgICAgICBtRmlyc3RTYW1wbGVTeXN0ZW1UaW1lVXMoLTFMTCksCiAgICAgICBtUGF1c2VQZW5kaW5nKGZhbHNlKSwKLSAgICAgIG1GaXJzdFNhbXBsZVRpbWVVcygtMWxsKSwKKyAgICAgIG1GaXJzdFNhbXBsZVRpbWVVcygtMUxMKSwKICAgICAgIG1HZW5lcmF0aW9uKDApIHsKICAgICBDSEVDSyhtTG9vcGVyICE9IE5VTEwpOwogCkBAIC00OTAsNyArNDkxLDcgQEAKICAgICBtQ29kZWNMb29wZXItPnN0YXJ0KCk7CiAKICAgICBpZiAobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCkgewotICAgICAgICBtT3V0cHV0Rm9ybWF0LT5zZXRJbnQzMigiY3JlYXRlLWlucHV0LWJ1ZmZlcnMtc3VzcGVuZGVkIiwgMSk7CisgICAgICAgIG1PdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9DUkVBVEVfSU5QVVRfU1VSRkFDRV9TVVNQRU5ERUQsIDEpOwogICAgIH0KIAogICAgIEFTdHJpbmcgb3V0cHV0TUlNRTsKQEAgLTY0Myw2ICs2NDQsMTAgQEAKICAgICAgICAgICAgIG91dHB1dC0+bUJ1ZmZlclF1ZXVlLmNsZWFyKCk7CiAgICAgICAgICAgICBvdXRwdXQtPm1FbmNvZGVyUmVhY2hlZEVPUyA9IHRydWU7CiAgICAgICAgICAgICBvdXRwdXQtPm1FcnJvckNvZGUgPSBlcnI7CisgICAgICAgICAgICBpZiAoIShtRmxhZ3MgJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKSkgeworICAgICAgICAgICAgICAgIG1TdG9wcGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgbVB1bGxlci0+c3RvcCgpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgb3V0cHV0LT5tQ29uZC5zaWduYWwoKTsKIAogICAgICAgICAgICAgcmVhY2hlZEVPUyA9IHRydWU7CkBAIC02NzMsOSArNjc4LDkgQEAKICAgICBDSEVDSyhtRmxhZ3MgJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKTsKICAgICBpZiAobUVuY29kZXIgIT0gTlVMTCkgewogICAgICAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gbmV3IEFNZXNzYWdlOwotICAgICAgICBwYXJhbXMtPnNldEludDMyKCJkcm9wLWlucHV0LWZyYW1lcyIsIGZhbHNlKTsKKyAgICAgICAgcGFyYW1zLT5zZXRJbnQzMihQQVJBTUVURVJfS0VZX1NVU1BFTkQsIGZhbHNlKTsKICAgICAgICAgaWYgKHJlc3VtZVN0YXJ0VGltZVVzID4gMCkgewotICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQ2NCgiZHJvcC1zdGFydC10aW1lLXVzIiwgcmVzdW1lU3RhcnRUaW1lVXMpOworICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQ2NChQQVJBTUVURVJfS0VZX1NVU1BFTkRfVElNRSwgcmVzdW1lU3RhcnRUaW1lVXMpOwogICAgICAgICB9CiAgICAgICAgIG1FbmNvZGVyLT5zZXRQYXJhbWV0ZXJzKHBhcmFtcyk7CiAgICAgfQpAQCAtNjg3LDEzICs2OTIsMTMgQEAKICAgICAgICAgc2l6ZV90IGJ1ZmZlckluZGV4ID0gKm1BdmFpbEVuY29kZXJJbnB1dEluZGljZXMuYmVnaW4oKTsKICAgICAgICAgbUF2YWlsRW5jb2RlcklucHV0SW5kaWNlcy5lcmFzZShtQXZhaWxFbmNvZGVySW5wdXRJbmRpY2VzLmJlZ2luKCkpOwogCi0gICAgICAgIGludDY0X3QgdGltZVVzID0gMGxsOworICAgICAgICBpbnQ2NF90IHRpbWVVcyA9IDBMTDsKICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOwogICAgICAgICBzaXplX3Qgc2l6ZSA9IDA7CiAKICAgICAgICAgaWYgKG1idWYgIT0gTlVMTCkgewogICAgICAgICAgICAgQ0hFQ0sobWJ1Zi0+bWV0YV9kYXRhKCkuZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7Ci0gICAgICAgICAgICBpZiAobUZpcnN0U2FtcGxlU3lzdGVtVGltZVVzIDwgMGxsKSB7CisgICAgICAgICAgICBpZiAobUZpcnN0U2FtcGxlU3lzdGVtVGltZVVzIDwgMExMKSB7CiAgICAgICAgICAgICAgICAgbUZpcnN0U2FtcGxlU3lzdGVtVGltZVVzID0gc3lzdGVtVGltZSgpIC8gMTAwMDsKICAgICAgICAgICAgICAgICBpZiAobVBhdXNlUGVuZGluZykgewogICAgICAgICAgICAgICAgICAgICBtUGF1c2VQZW5kaW5nID0gZmFsc2U7CkBAIC03NjEsMTMgKzc2NiwxMyBAQAogfQogCiBzdGF0dXNfdCBNZWRpYUNvZGVjU291cmNlOjpvblN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKLSAgICBpZiAobVN0b3BwaW5nKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc3RhcnQgd2hpbGUgd2UncmUgc3RvcHBpbmciKTsKKyAgICBpZiAobVN0b3BwaW5nIHx8IG1PdXRwdXQubG9jaygpLT5tRW5jb2RlclJlYWNoZWRFT1MpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzdGFydCB3aGlsZSB3ZSdyZSBzdG9wcGluZyBvciBlbmNvZGVyIGFscmVhZHkgc3RvcHBlZCBkdWUgdG8gRU9TIGVycm9yIik7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgaW50NjRfdCBzdGFydFRpbWVVczsKICAgICBpZiAocGFyYW1zID09IE5VTEwgfHwgIXBhcmFtcy0+ZmluZEludDY0KGtLZXlUaW1lLCAmc3RhcnRUaW1lVXMpKSB7Ci0gICAgICAgIHN0YXJ0VGltZVVzID0gLTFsbDsKKyAgICAgICAgc3RhcnRUaW1lVXMgPSAtMUxMOwogICAgIH0KIAogICAgIGlmIChtU3RhcnRlZCkgewpAQCAtNzk1LDcgKzgwMCw3IEBACiAgICAgaWYgKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpIHsKICAgICAgICAgaWYgKG1FbmNvZGVyICE9IE5VTEwpIHsKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBwYXJhbXMgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICBwYXJhbXMtPnNldEludDMyKCJkcm9wLWlucHV0LWZyYW1lcyIsIGZhbHNlKTsKKyAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoUEFSQU1FVEVSX0tFWV9TVVNQRU5ELCBmYWxzZSk7CiAgICAgICAgICAgICBpZiAoc3RhcnRUaW1lVXMgPj0gMCkgewogICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50NjQoInNraXAtZnJhbWVzLWJlZm9yZSIsIHN0YXJ0VGltZVVzKTsKICAgICAgICAgICAgIH0KQEAgLTgyNiwxMCArODMxLDEyIEBACiB9CiAKIHZvaWQgTWVkaWFDb2RlY1NvdXJjZTo6b25QYXVzZShpbnQ2NF90IHBhdXNlU3RhcnRUaW1lVXMpIHsKLSAgICBpZiAoKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpICYmIChtRW5jb2RlciAhPSBOVUxMKSkgeworICAgIGlmIChtU3RvcHBpbmcgfHwgbU91dHB1dC5sb2NrKCktPm1FbmNvZGVyUmVhY2hlZEVPUykgeworICAgICAgICAvLyBOb3RoaW5nIHRvIGRvCisgICAgfSBlbHNlIGlmICgobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCkgJiYgKG1FbmNvZGVyICE9IE5VTEwpKSB7CiAgICAgICAgIHNwPEFNZXNzYWdlPiBwYXJhbXMgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgIHBhcmFtcy0+c2V0SW50MzIoImRyb3AtaW5wdXQtZnJhbWVzIiwgdHJ1ZSk7Ci0gICAgICAgIHBhcmFtcy0+c2V0SW50NjQoImRyb3Atc3RhcnQtdGltZS11cyIsIHBhdXNlU3RhcnRUaW1lVXMpOworICAgICAgICBwYXJhbXMtPnNldEludDMyKFBBUkFNRVRFUl9LRVlfU1VTUEVORCwgdHJ1ZSk7CisgICAgICAgIHBhcmFtcy0+c2V0SW50NjQoUEFSQU1FVEVSX0tFWV9TVVNQRU5EX1RJTUUsIHBhdXNlU3RhcnRUaW1lVXMpOwogICAgICAgICBtRW5jb2Rlci0+c2V0UGFyYW1ldGVycyhwYXJhbXMpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIENIRUNLKG1QdWxsZXIgIT0gTlVMTCk7CkBAIC05MTQsNyArOTIxLDcgQEAKICAgICAgICAgICAgICAgICBpZiAobUlzVmlkZW8pIHsKICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkZWNvZGluZ1RpbWVVczsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRmlyc3RTYW1wbGVTeXN0ZW1UaW1lVXMgPCAwbGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRmlyc3RTYW1wbGVTeXN0ZW1UaW1lVXMgPCAwTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlyc3RTYW1wbGVTeXN0ZW1UaW1lVXMgPSBzeXN0ZW1UaW1lKCkgLyAxMDAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUGF1c2VQZW5kaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXVzZVBlbmRpbmcgPSBmYWxzZTsKQEAgLTkyNiw3ICs5MzMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGltZXN0YW1wIG9mZnNldCBpcyBhbHJlYWR5IGFkanVzdGVkIGluIEdyYXBoaWNCdWZmZXJTb3VyY2UuCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHcmFwaGljQnVmZmVyU291cmNlIGlzIHN1cHBvc2VkIHRvIGRpc2NhcmQgc2FtcGxlcwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gcXVldWVkIGJlZm9yZSBzdGFydCwgYW5kIG9mZnNldCB0aW1lVXMgYnkgc3RhcnQgdGltZQotICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfR0UodGltZVVzLCAwbGwpOworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfR0UodGltZVVzLCAwTEwpOwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzoKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlY29kaW5nIHRpbWUgZm9yIHN1cmZhY2Ugc291cmNlIGlzIHVuYXZhaWxhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHByZXNlbnRhdGlvbiB0aW1lIGZvciBub3cuIE1heSBuZWVkIHRvIG1vdmUKQEAgLTk1NCw3ICs5NjEsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtYnVmLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbWJ1Zi0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIDBsbCk7CisgICAgICAgICAgICAgICAgbWJ1Zi0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIDBMTCk7CiAgICAgICAgICAgICAgICAgbWJ1Zi0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzQ29kZWNDb25maWcsIHRydWUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfU1lOQ0ZSQU1FKSB7CkBAIC0xMDgxLDcgKzEwODgsNyBAQAogICAgICAgICAgICAgTWV0YURhdGEgKnBhcmFtcyA9IHN0YXRpY19jYXN0PE1ldGFEYXRhICo+KG9iai5nZXQoKSk7CiAgICAgICAgICAgICBpbnQ2NF90IHBhdXNlU3RhcnRUaW1lVXMgPSAtMTsKICAgICAgICAgICAgIGlmIChwYXJhbXMgPT0gTlVMTCB8fCAhcGFyYW1zLT5maW5kSW50NjQoa0tleVRpbWUsICZwYXVzZVN0YXJ0VGltZVVzKSkgewotICAgICAgICAgICAgICAgIHBhdXNlU3RhcnRUaW1lVXMgPSAtMWxsOworICAgICAgICAgICAgICAgIHBhdXNlU3RhcnRUaW1lVXMgPSAtMUxMOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgb25QYXVzZShwYXVzZVN0YXJ0VGltZVVzKTsKICAgICAgICAgfQpAQCAtMTA5MiwxMiArMTA5OSwxMiBAQAogICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWUtb2Zmc2V0LXVzIiwgJm1JbnB1dEJ1ZmZlclRpbWVPZmZzZXRVcykpOworICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NChQQVJBTUVURVJfS0VZX09GRlNFVF9USU1FLCAmbUlucHV0QnVmZmVyVGltZU9mZnNldFVzKSk7CiAKICAgICAgICAgLy8gUHJvcGFnYXRlIHRoZSB0aW1lc3RhbXAgb2Zmc2V0IHRvIEdyYXBoaWNCdWZmZXJTb3VyY2UuCiAgICAgICAgIGlmIChtRmxhZ3MgJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKSB7CiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQ2NCgidGltZS1vZmZzZXQtdXMiLCBtSW5wdXRCdWZmZXJUaW1lT2Zmc2V0VXMpOworICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQ2NChQQVJBTUVURVJfS0VZX09GRlNFVF9USU1FLCBtSW5wdXRCdWZmZXJUaW1lT2Zmc2V0VXMpOwogICAgICAgICAgICAgZXJyID0gbUVuY29kZXItPnNldFBhcmFtZXRlcnMocGFyYW1zKTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVkMzM4MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmNwcApAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYUV4dHJhY3RvciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2Lmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvclByaXYuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNZWRpYUV4dHJhY3Rvcjo6TWVkaWFFeHRyYWN0b3IoKSB7CisgICAgaWYgKCFMT0dfTkRFQlVHKSB7CisgICAgICAgIHVpZF90IHVpZCA9IGdldHVpZCgpOworICAgICAgICBzdHJ1Y3QgcGFzc3dkICpwdyA9IGdldHB3dWlkKHVpZCk7CisgICAgICAgIEFMT0dWKCJleHRyYWN0b3IgY3JlYXRlZCBpbiB1aWQ6ICVkICglcykiLCBnZXR1aWQoKSwgcHctPnB3X25hbWUpOworICAgIH0KK30KKworTWVkaWFFeHRyYWN0b3I6On5NZWRpYUV4dHJhY3RvcigpIHt9CisKK3VpbnQzMl90IE1lZGlhRXh0cmFjdG9yOjpmbGFncygpIGNvbnN0IHsKKyAgICByZXR1cm4gQ0FOX1NFRUtfQkFDS1dBUkQgfCBDQU5fU0VFS19GT1JXQVJEIHwgQ0FOX1BBVVNFIHwgQ0FOX1NFRUs7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitNZWRpYUV4dHJhY3RvckNVbndyYXBwZXI6Ok1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcihDTWVkaWFFeHRyYWN0b3IgKnBsdWdpbikgeworICAgIHRoaXMtPnBsdWdpbiA9IHBsdWdpbjsKK30KKworTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyOjp+TWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyKCkgeworICAgIHBsdWdpbi0+ZnJlZShwbHVnaW4tPmRhdGEpOworICAgIGZyZWUocGx1Z2luKTsKK30KKworc2l6ZV90IE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcjo6Y291bnRUcmFja3MoKSB7CisgICAgcmV0dXJuIHBsdWdpbi0+Y291bnRUcmFja3MocGx1Z2luLT5kYXRhKTsKK30KKworTWVkaWFUcmFjayAqTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKKyAgICByZXR1cm4gTWVkaWFUcmFja0NVbndyYXBwZXI6OmNyZWF0ZShwbHVnaW4tPmdldFRyYWNrKHBsdWdpbi0+ZGF0YSwgaW5kZXgpKTsKK30KKworc3RhdHVzX3QgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCk7CisgICAgQU1lZGlhRm9ybWF0ICpmb3JtYXQgPSAgQU1lZGlhRm9ybWF0X2Zyb21Nc2coJm1zZyk7CisgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0gcGx1Z2luLT5nZXRUcmFja01ldGFEYXRhKHBsdWdpbi0+ZGF0YSwgZm9ybWF0LCBpbmRleCwgZmxhZ3MpOworICAgIHNwPE1ldGFEYXRhPiBuZXdNZXRhID0gbmV3IE1ldGFEYXRhKCk7CisgICAgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhKG1zZywgbmV3TWV0YSk7CisgICAgZGVsZXRlIGZvcm1hdDsKKyAgICBtZXRhID0gKm5ld01ldGE7CisgICAgcmV0dXJuIHJldmVyc2VfdHJhbnNsYXRlX2Vycm9yKHJldCk7Cit9CisKK3N0YXR1c190IE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgpOworICAgIEFNZWRpYUZvcm1hdCAqZm9ybWF0ID0gIEFNZWRpYUZvcm1hdF9mcm9tTXNnKCZtc2cpOworICAgIG1lZGlhX3N0YXR1c190IHJldCA9IHBsdWdpbi0+Z2V0TWV0YURhdGEocGx1Z2luLT5kYXRhLCBmb3JtYXQpOworICAgIHNwPE1ldGFEYXRhPiBuZXdNZXRhID0gbmV3IE1ldGFEYXRhKCk7CisgICAgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhKG1zZywgbmV3TWV0YSk7CisgICAgZGVsZXRlIGZvcm1hdDsKKyAgICBtZXRhID0gKm5ld01ldGE7CisgICAgcmV0dXJuIHJldmVyc2VfdHJhbnNsYXRlX2Vycm9yKHJldCk7Cit9CisKK2NvbnN0IGNoYXIgKiBNZWRpYUV4dHJhY3RvckNVbndyYXBwZXI6Om5hbWUoKSB7CisgICAgcmV0dXJuIHBsdWdpbi0+bmFtZShwbHVnaW4tPmRhdGEpOworfQorCit1aW50MzJfdCBNZWRpYUV4dHJhY3RvckNVbndyYXBwZXI6OmZsYWdzKCkgY29uc3QgeworICAgIHJldHVybiBwbHVnaW4tPmZsYWdzKHBsdWdpbi0+ZGF0YSk7Cit9CisKK3N0YXR1c190IE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcjo6c2V0TWVkaWFDYXMoY29uc3QgdWludDhfdCogY2FzVG9rZW4sIHNpemVfdCBzaXplKSB7CisgICAgcmV0dXJuIHBsdWdpbi0+c2V0TWVkaWFDYXMocGx1Z2luLT5kYXRhLCBjYXNUb2tlbiwgc2l6ZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcAppbmRleCBmNmM2MWEwLi40YzhiZTFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5jcHAKQEAgLTE4LDE4ICsxOCwyMSBAQAogI2RlZmluZSBMT0dfVEFHICJNZWRpYUV4dHJhY3RvckZhY3RvcnkiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL2RsZXh0Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNhY2hlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5oPgorI2luY2x1ZGUgPG5hdGl2ZWxvYWRlci9kbGV4dF9uYW1lc3BhY2VzLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8emlwYXJjaGl2ZS96aXBfYXJjaGl2ZS5oPgogCiAjaW5jbHVkZSA8ZGlyZW50Lmg+CiAjaW5jbHVkZSA8ZGxmY24uaD4KQEAgLTY4LDQ5ICs3MSw0NiBAQAogCiAgICAgQUxPR1YoIk1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Q3JlYXRlRnJvbVNlcnZpY2UgJXMiLCBtaW1lKTsKIAotICAgIFVwZGF0ZUV4dHJhY3RvcnMobnVsbHB0cik7Ci0KICAgICAvLyBpbml0aWFsaXplIHNvdXJjZSBkZWNyeXB0aW9uIGlmIG5lZWRlZAogICAgIHNvdXJjZS0+RHJtSW5pdGlhbGl6YXRpb24obnVsbHB0ciAvKiBtaW1lICovKTsKIAogICAgIHZvaWQgKm1ldGEgPSBudWxscHRyOwotICAgIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBjcmVhdG9yID0gTlVMTDsKLSAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jIGZyZWVNZXRhID0gbnVsbHB0cjsKKyAgICB2b2lkICpjcmVhdG9yID0gTlVMTDsKKyAgICBGcmVlTWV0YUZ1bmMgZnJlZU1ldGEgPSBudWxscHRyOwogICAgIGZsb2F0IGNvbmZpZGVuY2U7CiAgICAgc3A8RXh0cmFjdG9yUGx1Z2luPiBwbHVnaW47Ci0gICAgY3JlYXRvciA9IHNuaWZmKHNvdXJjZS5nZXQoKSwgJmNvbmZpZGVuY2UsICZtZXRhLCAmZnJlZU1ldGEsIHBsdWdpbik7CisgICAgdWludDMyX3QgY3JlYXRvclZlcnNpb24gPSAwOworICAgIGNyZWF0b3IgPSBzbmlmZihzb3VyY2UsICZjb25maWRlbmNlLCAmbWV0YSwgJmZyZWVNZXRhLCBwbHVnaW4sICZjcmVhdG9yVmVyc2lvbik7CiAgICAgaWYgKCFjcmVhdG9yKSB7CiAgICAgICAgIEFMT0dWKCJGQUlMRUQgdG8gYXV0b2RldGVjdCBtZWRpYSBjb250ZW50LiIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBNZWRpYUV4dHJhY3RvciAqcmV0ID0gY3JlYXRvcihzb3VyY2UuZ2V0KCksIG1ldGEpOwotICAgIGlmIChtZXRhICE9IG51bGxwdHIgJiYgZnJlZU1ldGEgIT0gbnVsbHB0cikgewotICAgICAgICBmcmVlTWV0YShtZXRhKTsKKyAgICBNZWRpYUV4dHJhY3RvciAqZXggPSBudWxscHRyOworICAgIGlmIChjcmVhdG9yVmVyc2lvbiA9PSBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjEgfHwKKyAgICAgICAgICAgIGNyZWF0b3JWZXJzaW9uID09IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMikgeworICAgICAgICBDTWVkaWFFeHRyYWN0b3IgKnJldCA9ICgoQ3JlYXRvckZ1bmMpY3JlYXRvcikoc291cmNlLT53cmFwKCksIG1ldGEpOworICAgICAgICBpZiAobWV0YSAhPSBudWxscHRyICYmIGZyZWVNZXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGZyZWVNZXRhKG1ldGEpOworICAgICAgICB9CisgICAgICAgIGV4ID0gcmV0ICE9IG51bGxwdHIgPyBuZXcgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyKHJldCkgOiBudWxscHRyOwogICAgIH0KIAogICAgIEFMT0dWKCJDcmVhdGVkIGFuIGV4dHJhY3RvciAnJXMnIHdpdGggY29uZmlkZW5jZSAlLjJmIiwKLSAgICAgICAgIHJldCAhPSBudWxscHRyID8gcmV0LT5uYW1lKCkgOiAiPG51bGw+IiwgY29uZmlkZW5jZSk7CisgICAgICAgICBleCAhPSBudWxscHRyID8gZXgtPm5hbWUoKSA6ICI8bnVsbD4iLCBjb25maWRlbmNlKTsKIAotICAgIHJldHVybiBDcmVhdGVJTWVkaWFFeHRyYWN0b3JGcm9tTWVkaWFFeHRyYWN0b3IocmV0LCBzb3VyY2UsIHBsdWdpbik7Ci19Ci0KLS8vc3RhdGljCi12b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6TG9hZFBsdWdpbnMoY29uc3QgOjpzdGQ6OnN0cmluZyYgYXBrUGF0aCkgewotICAgIC8vIFRPRE86IFZlcmlmeSBhcGsgcGF0aCB3aXRoIHBhY2thZ2UgbWFuYWdlciBpbiBleHRyYWN0b3IgcHJvY2Vzcy4KLSAgICBBTE9HVigiTG9hZCBwbHVnaW5zIGZyb206ICVzIiwgYXBrUGF0aC5jX3N0cigpKTsKLSAgICBVcGRhdGVFeHRyYWN0b3JzKGFwa1BhdGguZW1wdHkoKSA/IG51bGxwdHIgOiBhcGtQYXRoLmNfc3RyKCkpOworICAgIHJldHVybiBDcmVhdGVJTWVkaWFFeHRyYWN0b3JGcm9tTWVkaWFFeHRyYWN0b3IoZXgsIHNvdXJjZSwgcGx1Z2luKTsKIH0KIAogc3RydWN0IEV4dHJhY3RvclBsdWdpbiA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBNZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIGRlZjsKKyAgICBFeHRyYWN0b3JEZWYgZGVmOwogICAgIHZvaWQgKmxpYkhhbmRsZTsKICAgICBTdHJpbmc4IGxpYlBhdGg7CiAgICAgU3RyaW5nOCB1dWlkU3RyaW5nOwogCi0gICAgRXh0cmFjdG9yUGx1Z2luKE1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgZGVmaW5pdGlvbiwgdm9pZCAqaGFuZGxlLCBTdHJpbmc4ICZwYXRoKQorICAgIEV4dHJhY3RvclBsdWdpbihFeHRyYWN0b3JEZWYgZGVmaW5pdGlvbiwgdm9pZCAqaGFuZGxlLCBTdHJpbmc4ICZwYXRoKQogICAgICAgICA6IGRlZihkZWZpbml0aW9uKSwgbGliSGFuZGxlKGhhbmRsZSksIGxpYlBhdGgocGF0aCkgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZiBNZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmOjpleHRyYWN0b3JfdXVpZDsgaSsrKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mIEV4dHJhY3RvckRlZjo6ZXh0cmFjdG9yX3V1aWQ7IGkrKykgewogICAgICAgICAgICAgdXVpZFN0cmluZy5hcHBlbmRGb3JtYXQoIiUwMngiLCBkZWYuZXh0cmFjdG9yX3V1aWQuYltpXSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMjMsMTcgKzEyMywxOCBAQAogfTsKIAogTXV0ZXggTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpnUGx1Z2luTXV0ZXg7Ci1zdGQ6OnNoYXJlZF9wdHI8TGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+Pj4gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpnUGx1Z2luczsKK3N0ZDo6c2hhcmVkX3B0cjxzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4+IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Z1BsdWdpbnM7CiBib29sIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Z1BsdWdpbnNSZWdpc3RlcmVkID0gZmFsc2U7Citib29sIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Z0lnbm9yZVZlcnNpb24gPSBmYWxzZTsKIAogLy8gc3RhdGljCi1NZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpzbmlmZigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiptZXRhLAotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICpmcmVlTWV0YSwgc3A8RXh0cmFjdG9yUGx1Z2luPiAmcGx1Z2luKSB7Cit2b2lkICpNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OnNuaWZmKAorICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsCisgICAgICAgIEZyZWVNZXRhRnVuYyAqZnJlZU1ldGEsIHNwPEV4dHJhY3RvclBsdWdpbj4gJnBsdWdpbiwgdWludDMyX3QgKmNyZWF0b3JWZXJzaW9uKSB7CiAgICAgKmNvbmZpZGVuY2UgPSAwLjBmOwogICAgICptZXRhID0gbnVsbHB0cjsKIAotICAgIHN0ZDo6c2hhcmVkX3B0cjxMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+PiBwbHVnaW5zOworICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4+IHBsdWdpbnM7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soZ1BsdWdpbk11dGV4KTsKICAgICAgICAgaWYgKCFnUGx1Z2luc1JlZ2lzdGVyZWQpIHsKQEAgLTE0MiwxMyArMTQzLDIzIEBACiAgICAgICAgIHBsdWdpbnMgPSBnUGx1Z2luczsKICAgICB9CiAKLSAgICBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgY3VyQ3JlYXRvciA9IE5VTEw7Ci0gICAgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIGJlc3RDcmVhdG9yID0gTlVMTDsKKyAgICB2b2lkICpiZXN0Q3JlYXRvciA9IE5VTEw7CiAgICAgZm9yIChhdXRvIGl0ID0gcGx1Z2lucy0+YmVnaW4oKTsgaXQgIT0gcGx1Z2lucy0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgQUxPR1YoInNuaWZmaW5nICVzIiwgKCppdCktPmRlZi5leHRyYWN0b3JfbmFtZSk7CiAgICAgICAgIGZsb2F0IG5ld0NvbmZpZGVuY2U7CiAgICAgICAgIHZvaWQgKm5ld01ldGEgPSBudWxscHRyOwotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jIG5ld0ZyZWVNZXRhID0gbnVsbHB0cjsKLSAgICAgICAgaWYgKChjdXJDcmVhdG9yID0gKCppdCktPmRlZi5zbmlmZihzb3VyY2UsICZuZXdDb25maWRlbmNlLCAmbmV3TWV0YSwgJm5ld0ZyZWVNZXRhKSkpIHsKKyAgICAgICAgRnJlZU1ldGFGdW5jIG5ld0ZyZWVNZXRhID0gbnVsbHB0cjsKKworICAgICAgICB2b2lkICpjdXJDcmVhdG9yID0gTlVMTDsKKyAgICAgICAgaWYgKCgqaXQpLT5kZWYuZGVmX3ZlcnNpb24gPT0gRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YxKSB7CisgICAgICAgICAgICBjdXJDcmVhdG9yID0gKHZvaWQqKSAoKml0KS0+ZGVmLnUudjIuc25pZmYoCisgICAgICAgICAgICAgICAgICAgIHNvdXJjZS0+d3JhcCgpLCAmbmV3Q29uZmlkZW5jZSwgJm5ld01ldGEsICZuZXdGcmVlTWV0YSk7CisgICAgICAgIH0gZWxzZSBpZiAoKCppdCktPmRlZi5kZWZfdmVyc2lvbiA9PSBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjIpIHsKKyAgICAgICAgICAgIGN1ckNyZWF0b3IgPSAodm9pZCopICgqaXQpLT5kZWYudS52My5zbmlmZigKKyAgICAgICAgICAgICAgICAgICAgc291cmNlLT53cmFwKCksICZuZXdDb25maWRlbmNlLCAmbmV3TWV0YSwgJm5ld0ZyZWVNZXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdXJDcmVhdG9yKSB7CiAgICAgICAgICAgICBpZiAobmV3Q29uZmlkZW5jZSA+ICpjb25maWRlbmNlKSB7CiAgICAgICAgICAgICAgICAgKmNvbmZpZGVuY2UgPSBuZXdDb25maWRlbmNlOwogICAgICAgICAgICAgICAgIGlmICgqbWV0YSAhPSBudWxscHRyICYmICpmcmVlTWV0YSAhPSBudWxscHRyKSB7CkBAIC0xNTgsNiArMTY5LDcgQEAKICAgICAgICAgICAgICAgICAqZnJlZU1ldGEgPSBuZXdGcmVlTWV0YTsKICAgICAgICAgICAgICAgICBwbHVnaW4gPSAqaXQ7CiAgICAgICAgICAgICAgICAgYmVzdENyZWF0b3IgPSBjdXJDcmVhdG9yOworICAgICAgICAgICAgICAgICpjcmVhdG9yVmVyc2lvbiA9ICgqaXQpLT5kZWYuZGVmX3ZlcnNpb247CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChuZXdNZXRhICE9IG51bGxwdHIgJiYgbmV3RnJlZU1ldGEgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICBuZXdGcmVlTWV0YShuZXdNZXRhKTsKQEAgLTE3MSwxMCArMTgzLDEwIEBACiAKIC8vIHN0YXRpYwogdm9pZCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OlJlZ2lzdGVyRXh0cmFjdG9yKGNvbnN0IHNwPEV4dHJhY3RvclBsdWdpbj4gJnBsdWdpbiwKLSAgICAgICAgTGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCkgeworICAgICAgICBzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpIHsKICAgICAvLyBzYW5pdHkgY2hlY2sgY2hlY2sgc3RydWN0IHZlcnNpb24sIHV1aWQsIG5hbWUKLSAgICBpZiAocGx1Z2luLT5kZWYuZGVmX3ZlcnNpb24gPT0gMAotICAgICAgICAgICAgfHwgcGx1Z2luLT5kZWYuZGVmX3ZlcnNpb24gPiBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04pIHsKKyAgICBpZiAocGx1Z2luLT5kZWYuZGVmX3ZlcnNpb24gIT0gRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YxICYmCisgICAgICAgICAgICBwbHVnaW4tPmRlZi5kZWZfdmVyc2lvbiAhPSBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjIpIHsKICAgICAgICAgQUxPR0UoImRvbid0IHVuZGVyc3RhbmQgZXh0cmFjdG9yIGZvcm1hdCAldSwgaWdub3JpbmcuIiwgcGx1Z2luLT5kZWYuZGVmX3ZlcnNpb24pOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTkwLDcgKzIwMiw3IEBACiAgICAgZm9yIChhdXRvIGl0ID0gcGx1Z2luTGlzdC5iZWdpbigpOyBpdCAhPSBwbHVnaW5MaXN0LmVuZCgpOyArK2l0KSB7CiAgICAgICAgIGlmIChtZW1jbXAoJigoKml0KS0+ZGVmLmV4dHJhY3Rvcl91dWlkKSwgJnBsdWdpbi0+ZGVmLmV4dHJhY3Rvcl91dWlkLCAxNikgPT0gMCkgewogICAgICAgICAgICAgLy8gdGhlcmUncyBhbHJlYWR5IGFuIGV4dHJhY3RvciB3aXRoIHRoZSBzYW1lIHV1aWQKLSAgICAgICAgICAgIGlmICgoKml0KS0+ZGVmLmV4dHJhY3Rvcl92ZXJzaW9uIDwgcGx1Z2luLT5kZWYuZXh0cmFjdG9yX3ZlcnNpb24pIHsKKyAgICAgICAgICAgIGlmIChnSWdub3JlVmVyc2lvbiB8fCAoKml0KS0+ZGVmLmV4dHJhY3Rvcl92ZXJzaW9uIDwgcGx1Z2luLT5kZWYuZXh0cmFjdG9yX3ZlcnNpb24pIHsKICAgICAgICAgICAgICAgICAvLyB0aGlzIG9uZSBpcyBuZXdlciwgcmVwbGFjZSB0aGUgb2xkIG9uZQogICAgICAgICAgICAgICAgIEFMT0dXKCJyZXBsYWNpbmcgZXh0cmFjdG9yICclcycgdmVyc2lvbiAldSB3aXRoIHZlcnNpb24gJXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLT5kZWYuZXh0cmFjdG9yX25hbWUsCkBAIC0yMTIsMTMxICsyMjQsMTU0IEBACiB9CiAKIC8vc3RhdGljCi12b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6UmVnaXN0ZXJFeHRyYWN0b3JzSW5BcGsoCi0gICAgICAgIGNvbnN0IGNoYXIgKmFwa1BhdGgsIExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpIHsKLSAgICBBTE9HVigic2VhcmNoIGZvciBwbHVnaW5zIGF0ICVzIiwgYXBrUGF0aCk7Ci0gICAgWmlwQXJjaGl2ZUhhbmRsZSB6aXBIYW5kbGU7Ci0gICAgaW50MzJfdCByZXQgPSBPcGVuQXJjaGl2ZShhcGtQYXRoLCAmemlwSGFuZGxlKTsKLSAgICBpZiAocmV0ID09IDApIHsKLSAgICAgICAgY2hhciBhYmlbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICAgICAgcHJvcGVydHlfZ2V0KCJyby5wcm9kdWN0LmNwdS5hYmkiLCBhYmksICJhcm02NC12OGEiKTsKLSAgICAgICAgU3RyaW5nOCBwcmVmaXg4ID0gU3RyaW5nODo6Zm9ybWF0KCJsaWIvJXMvIiwgYWJpKTsKLSAgICAgICAgWmlwU3RyaW5nIHByZWZpeChwcmVmaXg4LmNfc3RyKCkpOwotICAgICAgICBaaXBTdHJpbmcgc3VmZml4KCJleHRyYWN0b3Iuc28iKTsKLSAgICAgICAgdm9pZCogY29va2llOwotICAgICAgICByZXQgPSBTdGFydEl0ZXJhdGlvbih6aXBIYW5kbGUsICZjb29raWUsICZwcmVmaXgsICZzdWZmaXgpOwotICAgICAgICBpZiAocmV0ID09IDApIHsKLSAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5OwotICAgICAgICAgICAgWmlwU3RyaW5nIG5hbWU7Ci0gICAgICAgICAgICB3aGlsZSAoTmV4dChjb29raWUsICZlbnRyeSwgJm5hbWUpID09IDApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmc4IGxpYlBhdGggPSBTdHJpbmc4KGFwa1BhdGgpICsgIiEvIiArCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZzgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4obmFtZS5uYW1lKSwgbmFtZS5uYW1lX2xlbmd0aCk7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogT3BlbiB3aXRoIGEgbGlua2VyIG5hbWVzcGFjZSBzbyB0aGF0IGl0IGNhbiBiZSBsaW5rZWQgd2l0aCBzdWItbGlicmFyaWVzCi0gICAgICAgICAgICAgICAgLy8gd2l0aGluIHRoZSBhcGsgaW5zdGVhZCBvZiBzeXN0ZW0gbGlicmFyaWVzIGFscmVhZHkgbG9hZGVkLgotICAgICAgICAgICAgICAgIHZvaWQgKmxpYkhhbmRsZSA9IGRsb3BlbihsaWJQYXRoLnN0cmluZygpLCBSVExEX05PVyB8IFJUTERfTE9DQUwpOwotICAgICAgICAgICAgICAgIGlmIChsaWJIYW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkdldEV4dHJhY3RvckRlZiBnZXREZWYgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE1lZGlhRXh0cmFjdG9yOjpHZXRFeHRyYWN0b3JEZWYpIGRsc3ltKGxpYkhhbmRsZSwgIkdFVEVYVFJBQ1RPUkRFRiIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0RGVmKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXJpbmcgc25pZmZlciBmb3IgJXMiLCBsaWJQYXRoLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyRXh0cmFjdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXh0cmFjdG9yUGx1Z2luKGdldERlZigpLCBsaWJIYW5kbGUsIGxpYlBhdGgpLCBwbHVnaW5MaXN0KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBkb2VzIG5vdCBjb250YWluIHNuaWZmZXIiLCBsaWJQYXRoLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRsY2xvc2UobGliSGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjb3VsZG4ndCBkbG9wZW4oJXMpICVzIiwgbGliUGF0aC5zdHJpbmcoKSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFbmRJdGVyYXRpb24oY29va2llKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dXKCJjb3VsZG4ndCBmaW5kIHBsdWdpbnMgZnJvbSAlcywgJWQiLCBhcGtQYXRoLCByZXQpOwotICAgICAgICB9Ci0gICAgICAgIENsb3NlQXJjaGl2ZSh6aXBIYW5kbGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dXKCJjb3VsZG4ndCBvcGVuKCVzKSAlZCIsIGFwa1BhdGgsIHJldCk7Ci0gICAgfQotfQotCi0vL3N0YXRpYwotdm9pZCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OlJlZ2lzdGVyRXh0cmFjdG9yc0luU3lzdGVtKAotICAgICAgICBjb25zdCBjaGFyICpsaWJEaXJQYXRoLCBMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KSB7Cit2b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6UmVnaXN0ZXJFeHRyYWN0b3JzKAorICAgICAgICBjb25zdCBjaGFyICpsaWJEaXJQYXRoLCBjb25zdCBhbmRyb2lkX2RsZXh0aW5mbyogZGxleHRpbmZvLAorICAgICAgICBzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpIHsKICAgICBBTE9HVigic2VhcmNoIGZvciBwbHVnaW5zIGF0ICVzIiwgbGliRGlyUGF0aCk7CisKICAgICBESVIgKmxpYkRpciA9IG9wZW5kaXIobGliRGlyUGF0aCk7CiAgICAgaWYgKGxpYkRpcikgewogICAgICAgICBzdHJ1Y3QgZGlyZW50KiBsaWJFbnRyeTsKICAgICAgICAgd2hpbGUgKChsaWJFbnRyeSA9IHJlYWRkaXIobGliRGlyKSkpIHsKLSAgICAgICAgICAgIFN0cmluZzggbGliUGF0aCA9IFN0cmluZzgobGliRGlyUGF0aCkgKyAiLyIgKyBsaWJFbnRyeS0+ZF9uYW1lOwotICAgICAgICAgICAgdm9pZCAqbGliSGFuZGxlID0gZGxvcGVuKGxpYlBhdGguc3RyaW5nKCksIFJUTERfTk9XIHwgUlRMRF9MT0NBTCk7Ci0gICAgICAgICAgICBpZiAobGliSGFuZGxlKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkdldEV4dHJhY3RvckRlZiBnZXREZWYgPQotICAgICAgICAgICAgICAgICAgICAoTWVkaWFFeHRyYWN0b3I6OkdldEV4dHJhY3RvckRlZikgZGxzeW0obGliSGFuZGxlLCAiR0VURVhUUkFDVE9SREVGIik7Ci0gICAgICAgICAgICAgICAgaWYgKGdldERlZikgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXJpbmcgc25pZmZlciBmb3IgJXMiLCBsaWJQYXRoLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJFeHRyYWN0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEV4dHJhY3RvclBsdWdpbihnZXREZWYoKSwgbGliSGFuZGxlLCBsaWJQYXRoKSwgcGx1Z2luTGlzdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzIGRvZXMgbm90IGNvbnRhaW4gc25pZmZlciIsIGxpYlBhdGguc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBkbGNsb3NlKGxpYkhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY291bGRuJ3QgZGxvcGVuKCVzKSAlcyIsIGxpYlBhdGguc3RyaW5nKCksIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICBpZiAobGliRW50cnktPmRfbmFtZVswXSA9PSAnLicpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nOCBsaWJQYXRoID0gU3RyaW5nOChsaWJEaXJQYXRoKSArICIvIiArIGxpYkVudHJ5LT5kX25hbWU7CisgICAgICAgICAgICBpZiAoIWxpYlBhdGguY29udGFpbnMoImV4dHJhY3Rvci5zbyIpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2b2lkICpsaWJIYW5kbGUgPSBhbmRyb2lkX2Rsb3Blbl9leHQoCisgICAgICAgICAgICAgICAgICAgIGxpYlBhdGguc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgIFJUTERfTk9XIHwgUlRMRF9MT0NBTCwgZGxleHRpbmZvKTsKKyAgICAgICAgICAgIENIRUNLKGxpYkhhbmRsZSAhPSBudWxscHRyKQorICAgICAgICAgICAgICAgICAgICA8PCAiY291bGRuJ3QgZGxvcGVuKCIgPDwgbGliUGF0aC5zdHJpbmcoKSA8PCAiKSAiIDw8IHN0cmVycm9yKGVycm5vKTsKIAorICAgICAgICAgICAgR2V0RXh0cmFjdG9yRGVmIGdldERlZiA9CisgICAgICAgICAgICAgICAgKEdldEV4dHJhY3RvckRlZikgZGxzeW0obGliSGFuZGxlLCAiR0VURVhUUkFDVE9SREVGIik7CisgICAgICAgICAgICBDSEVDSyhnZXREZWYgIT0gbnVsbHB0cikKKyAgICAgICAgICAgICAgICAgICAgPDwgbGliUGF0aC5zdHJpbmcoKSA8PCAiIGRvZXMgbm90IGNvbnRhaW4gc25pZmZlciI7CisKKyAgICAgICAgICAgIEFMT0dWKCJyZWdpc3RlcmluZyBzbmlmZmVyIGZvciAlcyIsIGxpYlBhdGguc3RyaW5nKCkpOworICAgICAgICAgICAgUmVnaXN0ZXJFeHRyYWN0b3IoCisgICAgICAgICAgICAgICAgICAgIG5ldyBFeHRyYWN0b3JQbHVnaW4oZ2V0RGVmKCksIGxpYkhhbmRsZSwgbGliUGF0aCksIHBsdWdpbkxpc3QpOworICAgICAgICB9CiAgICAgICAgIGNsb3NlZGlyKGxpYkRpcik7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR0UoImNvdWxkbid0IG9wZW5kaXIoJXMpIiwgbGliRGlyUGF0aCk7CiAgICAgfQogfQogCitzdGF0aWMgYm9vbCBjb21wYXJlRnVuYyhjb25zdCBzcDxFeHRyYWN0b3JQbHVnaW4+JiBmaXJzdCwgY29uc3Qgc3A8RXh0cmFjdG9yUGx1Z2luPiYgc2Vjb25kKSB7CisgICAgcmV0dXJuIHN0cmNtcChmaXJzdC0+ZGVmLmV4dHJhY3Rvcl9uYW1lLCBzZWNvbmQtPmRlZi5leHRyYWN0b3JfbmFtZSkgPCAwOworfQorCitzdGF0aWMgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBnU3VwcG9ydGVkRXh0ZW5zaW9uczsKKwogLy8gc3RhdGljCi12b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6VXBkYXRlRXh0cmFjdG9ycyhjb25zdCBjaGFyICpuZXdVcGRhdGVBcGtQYXRoKSB7Cit2b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6TG9hZEV4dHJhY3RvcnMoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKGdQbHVnaW5NdXRleCk7Ci0gICAgaWYgKG5ld1VwZGF0ZUFwa1BhdGggIT0gbnVsbHB0cikgewotICAgICAgICBnUGx1Z2luc1JlZ2lzdGVyZWQgPSBmYWxzZTsKLSAgICB9CisKICAgICBpZiAoZ1BsdWdpbnNSZWdpc3RlcmVkKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBzdGQ6OnNoYXJlZF9wdHI8TGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+Pj4gbmV3TGlzdChuZXcgTGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PigpKTsKKyAgICBnSWdub3JlVmVyc2lvbiA9IHByb3BlcnR5X2dldF9ib29sKCJkZWJ1Zy5leHRyYWN0b3IuaWdub3JlX3ZlcnNpb24iLCBmYWxzZSk7CiAKLSAgICBSZWdpc3RlckV4dHJhY3RvcnNJblN5c3RlbSgiL3N5c3RlbS9saWIiCisgICAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6bGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+Pj4gbmV3TGlzdChuZXcgc3RkOjpsaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+KCkpOworCisgICAgYW5kcm9pZF9uYW1lc3BhY2VfdCAqbWVkaWFOcyA9IGFuZHJvaWRfZ2V0X2V4cG9ydGVkX25hbWVzcGFjZSgibWVkaWEiKTsKKyAgICBpZiAobWVkaWFOcyAhPSBOVUxMKSB7CisgICAgICAgIGNvbnN0IGFuZHJvaWRfZGxleHRpbmZvIGRsZXh0aW5mbyA9IHsKKyAgICAgICAgICAgIC5mbGFncyA9IEFORFJPSURfRExFWFRfVVNFX05BTUVTUEFDRSwKKyAgICAgICAgICAgIC5saWJyYXJ5X25hbWVzcGFjZSA9IG1lZGlhTnMsCisgICAgICAgIH07CisgICAgICAgIFJlZ2lzdGVyRXh0cmFjdG9ycygiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEvbGliIgogI2lmZGVmIF9fTFA2NF9fCi0gICAgICAgICAgICAiNjQiCisgICAgICAgICAgICAgICAgIjY0IgogI2VuZGlmCi0gICAgICAgICAgICAiL2V4dHJhY3RvcnMiLCAqbmV3TGlzdCk7CisgICAgICAgICAgICAgICAgIi9leHRyYWN0b3JzIiwgJmRsZXh0aW5mbywgKm5ld0xpc3QpOwogCi0gICAgUmVnaXN0ZXJFeHRyYWN0b3JzSW5TeXN0ZW0oIi92ZW5kb3IvbGliIgotI2lmZGVmIF9fTFA2NF9fCi0gICAgICAgICAgICAiNjQiCi0jZW5kaWYKLSAgICAgICAgICAgICIvZXh0cmFjdG9ycyIsICpuZXdMaXN0KTsKLQotICAgIGlmIChuZXdVcGRhdGVBcGtQYXRoICE9IG51bGxwdHIpIHsKLSAgICAgICAgUmVnaXN0ZXJFeHRyYWN0b3JzSW5BcGsobmV3VXBkYXRlQXBrUGF0aCwgKm5ld0xpc3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJjb3VsZG4ndCBmaW5kIG1lZGlhIG5hbWVzcGFjZS4iKTsKICAgICB9CiAKKyAgICBSZWdpc3RlckV4dHJhY3RvcnMoIi9zeXN0ZW0vbGliIgorI2lmZGVmIF9fTFA2NF9fCisgICAgICAgICAgICAiNjQiCisjZW5kaWYKKyAgICAgICAgICAgICIvZXh0cmFjdG9ycyIsIE5VTEwsICpuZXdMaXN0KTsKKworICAgIG5ld0xpc3QtPnNvcnQoY29tcGFyZUZ1bmMpOwogICAgIGdQbHVnaW5zID0gbmV3TGlzdDsKKworICAgIGZvciAoYXV0byBpdCA9IGdQbHVnaW5zLT5iZWdpbigpOyBpdCAhPSBnUGx1Z2lucy0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKCgqaXQpLT5kZWYuZGVmX3ZlcnNpb24gPT0gRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YyKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDs7IGkrKykgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4dCA9ICgqaXQpLT5kZWYudS52My5zdXBwb3J0ZWRfdHlwZXNbaV07CisgICAgICAgICAgICAgICAgaWYgKGV4dCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBnU3VwcG9ydGVkRXh0ZW5zaW9ucy5pbnNlcnQoc3RkOjpzdHJpbmcoZXh0KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKICAgICBnUGx1Z2luc1JlZ2lzdGVyZWQgPSB0cnVlOwogfQogCisvLyBzdGF0aWMKK3N0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpnZXRTdXBwb3J0ZWRUeXBlcygpIHsKKyAgICBpZiAoZ2V0dWlkKCkgPT0gQUlEX01FRElBX0VYKSB7CisgICAgICAgIHJldHVybiBnU3VwcG9ydGVkRXh0ZW5zaW9uczsKKyAgICB9CisgICAgQUxPR1YoImdldCBzZXJ2aWNlIG1hbmFnZXIiKTsKKyAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEuZXh0cmFjdG9yIikpOworCisgICAgaWYgKGJpbmRlciAhPSAwKSB7CisgICAgICAgIHNwPElNZWRpYUV4dHJhY3RvclNlcnZpY2U+IG1lZGlhRXhTZXJ2aWNlKGludGVyZmFjZV9jYXN0PElNZWRpYUV4dHJhY3RvclNlcnZpY2U+KGJpbmRlcikpOworICAgICAgICByZXR1cm4gbWVkaWFFeFNlcnZpY2UtPmdldFN1cHBvcnRlZFR5cGVzKCk7CisgICAgfQorICAgIHJldHVybiBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+KCk7Cit9CisKIHN0YXR1c190IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKGdQbHVnaW5NdXRleCk7CiAgICAgU3RyaW5nOCBvdXQ7Ci0gICAgb3V0LmFwcGVuZCgiQXZhaWxhYmxlIGV4dHJhY3RvcnM6XG4iKTsKLSAgICBpZiAoZ1BsdWdpbnNSZWdpc3RlcmVkKSB7Ci0gICAgICAgIGZvciAoYXV0byBpdCA9IGdQbHVnaW5zLT5iZWdpbigpOyBpdCAhPSBnUGx1Z2lucy0+ZW5kKCk7ICsraXQpIHsKLSAgICAgICAgICAgIG91dC5hcHBlbmRGb3JtYXQoIiAgJTI1czogdXVpZCglcyksIHZlcnNpb24oJXUpLCBwYXRoKCVzKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgKCppdCktPmRlZi5leHRyYWN0b3JfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgKCppdCktPnV1aWRTdHJpbmcuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgKCppdCktPmRlZi5leHRyYWN0b3JfdmVyc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgKCppdCktPmxpYlBhdGguY19zdHIoKSk7Ci0gICAgICAgIH0KKworICAgIGNvbnN0IElQQ1RocmVhZFN0YXRlKiBpcGMgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpOworICAgIGNvbnN0IGludCBwaWQgPSBpcGMtPmdldENhbGxpbmdQaWQoKTsKKyAgICBjb25zdCBpbnQgdWlkID0gaXBjLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgaWYgKCFQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKSwgcGlkLCB1aWQpKSB7CisgICAgICAgIC8vIGR1bXBFeHRyYWN0b3JzKCkgd2lsbCBhcHBlbmQgdGhlIGZvbGxvd2luZyBzdHJpbmcuCisgICAgICAgIC8vIG91dC5hcHBlbmRGb3JtYXQoIlBlcm1pc3Npb24gRGVuaWFsOiAiCisgICAgICAgIC8vICAgICAgICAiY2FuJ3QgZHVtcCBNZWRpYUV4dHJhY3RvciBmcm9tIHBpZD0lZCwgdWlkPSVkXG4iLCBwaWQsIHVpZCk7CisgICAgICAgIEFMT0dFKCJQZXJtaXNzaW9uIERlbmlhbDogY2FuJ3QgZHVtcCBNZWRpYUV4dHJhY3RvciBmcm9tIHBpZD0lZCwgdWlkPSVkIiwgcGlkLCB1aWQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIG91dC5hcHBlbmQoIiAgKG5vIHBsdWdpbnMgcmVnaXN0ZXJlZClcbiIpOworICAgICAgICBvdXQuYXBwZW5kKCJBdmFpbGFibGUgZXh0cmFjdG9yczpcbiIpOworICAgICAgICBpZiAoZ1BsdWdpbnNSZWdpc3RlcmVkKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBnUGx1Z2lucy0+YmVnaW4oKTsgaXQgIT0gZ1BsdWdpbnMtPmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICAgICAgb3V0LmFwcGVuZEZvcm1hdCgiICAlMjVzOiBwbHVnaW5fdmVyc2lvbiglZCksIHV1aWQoJXMpLCB2ZXJzaW9uKCV1KSwgcGF0aCglcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgKCppdCktPmRlZi5leHRyYWN0b3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgKCppdCktPmRlZi5kZWZfdmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICgqaXQpLT51dWlkU3RyaW5nLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAoKml0KS0+ZGVmLmV4dHJhY3Rvcl92ZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgKCppdCktPmxpYlBhdGguY19zdHIoKSk7CisgICAgICAgICAgICAgICAgaWYgKCgqaXQpLT5kZWYuZGVmX3ZlcnNpb24gPT0gRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YyKSB7CisgICAgICAgICAgICAgICAgICAgIG91dC5hcHBlbmQoIiwgc3VwcG9ydHM6ICIpOworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDs7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWltZSA9ICgqaXQpLT5kZWYudS52My5zdXBwb3J0ZWRfdHlwZXNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWltZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kRm9ybWF0KCIlcyAiLCBtaW1lKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCJcbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgb3V0LmFwcGVuZCgiXG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dC5hcHBlbmQoIiAgKG5vIHBsdWdpbnMgcmVnaXN0ZXJlZClcbiIpOworICAgICAgICB9CiAgICAgfQogICAgIHdyaXRlKGZkLCBvdXQuc3RyaW5nKCksIG91dC5zaXplKCkpOwogICAgIHJldHVybiBPSzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhTXV4ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAKaW5kZXggOThmNTliNS4uOWJhMmFkZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAKQEAgLTM1LDYgKzM1LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PZ2dXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC01Miw2ICs1Myw4IEBACiAgICAgICAgIG1Xcml0ZXIgPSBuZXcgTVBFRzRXcml0ZXIoZmQpOwogICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfV0VCTSkgewogICAgICAgICBtV3JpdGVyID0gbmV3IFdlYm1Xcml0ZXIoZmQpOworICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfT0dHKSB7CisgICAgICAgIG1Xcml0ZXIgPSBuZXcgT2dnV3JpdGVyKGZkKTsKICAgICB9CiAKICAgICBpZiAobVdyaXRlciAhPSBOVUxMKSB7CkBAIC01OSw2ICs2Miw4IEBACiAgICAgICAgIGlmIChmb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9IRUlGKSB7CiAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIGtleSB1c2VzIHJlY29yZGVyIGZpbGUgdHlwZXMuCiAgICAgICAgICAgICBtRmlsZU1ldGEtPnNldEludDMyKGtLZXlGaWxlVHlwZSwgb3V0cHV0X2Zvcm1hdDo6T1VUUFVUX0ZPUk1BVF9IRUlGKTsKKyAgICAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9PR0cpIHsKKyAgICAgICAgICAgIG1GaWxlTWV0YS0+c2V0SW50MzIoa0tleUZpbGVUeXBlLCBvdXRwdXRfZm9ybWF0OjpPVVRQVVRfRk9STUFUX09HRyk7CiAgICAgICAgIH0KICAgICAgICAgbVN0YXRlID0gSU5JVElBTElaRUQ7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYVNvdXJjZS5jcHAKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhU291cmNlLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFTeW5jLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhU3luYy5jcHAKaW5kZXggYmExNGU1ZC4uYTNmNTVkYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFTeW5jLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVN5bmMuY3BwCkBAIC0zNiw3ICszNiw3IEBACiAKIC8vIE1heGltdW0gbGF0ZSB0aW1lIGFsbG93ZWQgZm9yIGEgdmlkZW8gZnJhbWUgdG8gYmUgcmVuZGVyZWQuIFdoZW4gYSB2aWRlbwogLy8gZnJhbWUgYXJyaXZlcyBsYXRlciB0aGFuIHRoaXMgbnVtYmVyLCBpdCB3aWxsIGJlIGRpc2NhcmRlZCB3aXRob3V0IHJlbmRlcmluZy4KLXN0YXRpYyBjb25zdCBpbnQ2NF90IGtNYXhBbGxvd2VkVmlkZW9MYXRlVGltZVVzID0gNDAwMDBsbDsKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtNYXhBbGxvd2VkVmlkZW9MYXRlVGltZVVzID0gNDAwMDBMTDsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVRyYWNrLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhVHJhY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YzliMjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVRyYWNrLmNwcApAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvclByaXYuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNZWRpYVRyYWNrOjpNZWRpYVRyYWNrKCkge30KKworTWVkaWFUcmFjazo6fk1lZGlhVHJhY2soKSB7fQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCit2b2lkIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpzZXROb25CbG9ja2luZygpIHsKKyAgICBtTm9uQmxvY2tpbmcgPSB0cnVlOworfQorCit2b2lkIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpjbGVhck5vbkJsb2NraW5nKCkgeworICAgIG1Ob25CbG9ja2luZyA9IGZhbHNlOworfQorCitib29sIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpnZXROb25CbG9ja2luZygpIGNvbnN0IHsKKyAgICByZXR1cm4gbU5vbkJsb2NraW5nOworfQorCit2b2lkIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpzZXRTZWVrVG8oaW50NjRfdCB0aW1lX3VzLCBTZWVrTW9kZSBtb2RlKSB7CisgICAgbU9wdGlvbnMgfD0ga1NlZWtUb19PcHRpb247CisgICAgbVNlZWtUaW1lVXMgPSB0aW1lX3VzOworICAgIG1TZWVrTW9kZSA9IG1vZGU7Cit9CisKK2Jvb2wgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OmdldFNlZWtUbygKKyAgICAgICAgaW50NjRfdCAqdGltZV91cywgU2Vla01vZGUgKm1vZGUpIGNvbnN0IHsKKyAgICAqdGltZV91cyA9IG1TZWVrVGltZVVzOworICAgICptb2RlID0gbVNlZWtNb2RlOworICAgIHJldHVybiAobU9wdGlvbnMgJiBrU2Vla1RvX09wdGlvbikgIT0gMDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0gdW53cmFwcGVyIC0tLS0tLS0tLS0tLS0tLSAqLworCitNZWRpYVRyYWNrQ1Vud3JhcHBlcjo6TWVkaWFUcmFja0NVbndyYXBwZXIoQ01lZGlhVHJhY2sgKmNtZWRpYXRyYWNrKSB7CisgICAgd3JhcHBlciA9IGNtZWRpYXRyYWNrOworICAgIGJ1ZmZlckdyb3VwID0gbnVsbHB0cjsKK30KKworTWVkaWFUcmFja0NVbndyYXBwZXIgKk1lZGlhVHJhY2tDVW53cmFwcGVyOjpjcmVhdGUoQ01lZGlhVHJhY2sgKmNtZWRpYXRyYWNrKSB7CisgICAgaWYgKGNtZWRpYXRyYWNrID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBuZXcgTWVkaWFUcmFja0NVbndyYXBwZXIoY21lZGlhdHJhY2spOworfQorCitNZWRpYVRyYWNrQ1Vud3JhcHBlcjo6fk1lZGlhVHJhY2tDVW53cmFwcGVyKCkgeworICAgIHdyYXBwZXItPmZyZWUod3JhcHBlci0+ZGF0YSk7CisgICAgZnJlZSh3cmFwcGVyKTsKKyAgICBkZWxldGUgYnVmZmVyR3JvdXA7Cit9CisKK3N0YXR1c190IE1lZGlhVHJhY2tDVW53cmFwcGVyOjpzdGFydCgpIHsKKyAgICBpZiAoYnVmZmVyR3JvdXAgPT0gbnVsbHB0cikgeworICAgICAgICBidWZmZXJHcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwKCk7CisgICAgfQorICAgIHJldHVybiByZXZlcnNlX3RyYW5zbGF0ZV9lcnJvcih3cmFwcGVyLT5zdGFydCh3cmFwcGVyLT5kYXRhLCBidWZmZXJHcm91cC0+d3JhcCgpKSk7Cit9CisKK3N0YXR1c190IE1lZGlhVHJhY2tDVW53cmFwcGVyOjpzdG9wKCkgeworICAgIHJldHVybiByZXZlcnNlX3RyYW5zbGF0ZV9lcnJvcih3cmFwcGVyLT5zdG9wKHdyYXBwZXItPmRhdGEpKTsKK30KKworc3RhdHVzX3QgTWVkaWFUcmFja0NVbndyYXBwZXI6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UmIGZvcm1hdCkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoKTsKKyAgICBBTWVkaWFGb3JtYXQgKnRtcEZvcm1hdCA9ICBBTWVkaWFGb3JtYXRfZnJvbU1zZygmbXNnKTsKKyAgICBtZWRpYV9zdGF0dXNfdCByZXQgPSB3cmFwcGVyLT5nZXRGb3JtYXQod3JhcHBlci0+ZGF0YSwgdG1wRm9ybWF0KTsKKyAgICBzcDxNZXRhRGF0YT4gbmV3TWV0YSA9IG5ldyBNZXRhRGF0YSgpOworICAgIGNvbnZlcnRNZXNzYWdlVG9NZXRhRGF0YShtc2csIG5ld01ldGEpOworICAgIGRlbGV0ZSB0bXBGb3JtYXQ7CisgICAgZm9ybWF0ID0gKm5ld01ldGE7CisgICAgcmV0dXJuIHJldmVyc2VfdHJhbnNsYXRlX2Vycm9yKHJldCk7Cit9CisKK3N0YXR1c190IE1lZGlhVHJhY2tDVW53cmFwcGVyOjpyZWFkKE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKKworICAgIHVpbnQzMl90IG9wdHMgPSAwOworCisgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0Tm9uQmxvY2tpbmcoKSkgeworICAgICAgICBvcHRzIHw9IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6Ok5PTkJMT0NLSU5HOworICAgIH0KKworICAgIGludDY0X3Qgc2Vla1Bvc2l0aW9uID0gMDsKKyAgICBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgc2Vla01vZGU7CisgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrUG9zaXRpb24sICZzZWVrTW9kZSkpIHsKKyAgICAgICAgb3B0cyB8PSBTRUVLOworICAgICAgICBvcHRzIHw9ICh1aW50MzJfdCkgc2Vla01vZGU7CisgICAgfQorICAgIENNZWRpYUJ1ZmZlciAqYnVmID0gbnVsbHB0cjsKKyAgICBtZWRpYV9zdGF0dXNfdCByZXQgPSB3cmFwcGVyLT5yZWFkKHdyYXBwZXItPmRhdGEsICZidWYsIG9wdHMsIHNlZWtQb3NpdGlvbik7CisgICAgaWYgKHJldCA9PSBBTUVESUFfT0sgJiYgYnVmICE9IG51bGxwdHIpIHsKKyAgICAgICAgKmJ1ZmZlciA9IChNZWRpYUJ1ZmZlckJhc2UqKWJ1Zi0+aGFuZGxlOworICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEgPSAoKmJ1ZmZlciktPm1ldGFfZGF0YSgpOworICAgICAgICBBTWVkaWFGb3JtYXQgKmZvcm1hdCA9IGJ1Zi0+bWV0YV9kYXRhKGJ1Zi0+aGFuZGxlKTsKKyAgICAgICAgLy8gb25seSBjb252ZXJ0IHRoZSBrZXlzIHdlJ3JlIGFjdHVhbGx5IGV4cGVjdGluZywgYXMgZG9pbmcKKyAgICAgICAgLy8gdGhlIGZ1bGwgY29udmVydE1lc3NhZ2VUb01ldGFkYXRhKCkgZm9yIGV2ZXJ5IGJ1ZmZlciBpcworICAgICAgICAvLyB0b28gZXhwZW5zaXZlCisgICAgICAgIGludDY0X3QgdmFsNjQ7CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQ2NCgidGltZVVzIiwgJnZhbDY0KSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQ2NChrS2V5VGltZSwgdmFsNjQpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQ2NCgiZHVyYXRpb25VcyIsICZ2YWw2NCkpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCB2YWw2NCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDY0KCJ0YXJnZXQtdGltZSIsICZ2YWw2NCkpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50NjQoa0tleVRhcmdldFRpbWUsIHZhbDY0KTsKKyAgICAgICAgfQorICAgICAgICBpbnQzMl90IHZhbDMyOworICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50MzIoImlzLXN5bmMtZnJhbWUiLCAmdmFsMzIpKSB7CisgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgdmFsMzIpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQzMigidGVtcG9yYWwtbGF5ZXItaWQiLCAmdmFsMzIpKSB7CisgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlUZW1wb3JhbExheWVySWQsIHZhbDMyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50MzIoInRlbXBvcmFsLWxheWVyLWNvdW50IiwgJnZhbDMyKSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5VGVtcG9yYWxMYXllckNvdW50LCB2YWwzMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDMyKCJjcnlwdG8tZGVmYXVsdC1pdi1zaXplIiwgJnZhbDMyKSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5Q3J5cHRvRGVmYXVsdElWU2l6ZSwgdmFsMzIpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQzMigiY3J5cHRvLW1vZGUiLCAmdmFsMzIpKSB7CisgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlDcnlwdG9Nb2RlLCB2YWwzMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDMyKCJjcnlwdG8tZW5jcnlwdGVkLWJ5dGUtYmxvY2siLCAmdmFsMzIpKSB7CisgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlFbmNyeXB0ZWRCeXRlQmxvY2ssIHZhbDMyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50MzIoImNyeXB0by1za2lwLWJ5dGUtYmxvY2siLCAmdmFsMzIpKSB7CisgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlTa2lwQnl0ZUJsb2NrLCB2YWwzMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDMyKCJ2YWxpZC1zYW1wbGVzIiwgJnZhbDMyKSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5VmFsaWRTYW1wbGVzLCB2YWwzMik7CisgICAgICAgIH0KKyAgICAgICAgc3A8QUJ1ZmZlcj4gdmFsYnVmOworICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kQnVmZmVyKCJjcnlwdG8tcGxhaW4tc2l6ZXMiLCAmdmFsYnVmKSkgeworICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlQbGFpblNpemVzLAorICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUJhc2U6OlR5cGU6OlRZUEVfTk9ORSwgdmFsYnVmLT5kYXRhKCksIHZhbGJ1Zi0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kQnVmZmVyKCJjcnlwdG8tZW5jcnlwdGVkLXNpemVzIiwgJnZhbGJ1ZikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsCisgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhQmFzZTo6VHlwZTo6VFlQRV9OT05FLCB2YWxidWYtPmRhdGEoKSwgdmFsYnVmLT5zaXplKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRCdWZmZXIoImNyeXB0by1rZXkiLCAmdmFsYnVmKSkgeworICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlDcnlwdG9LZXksCisgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhQmFzZTo6VHlwZTo6VFlQRV9OT05FLCB2YWxidWYtPmRhdGEoKSwgdmFsYnVmLT5zaXplKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRCdWZmZXIoImNyeXB0by1pdiIsICZ2YWxidWYpKSB7CisgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleUNyeXB0b0lWLAorICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUJhc2U6OlR5cGU6OlRZUEVfTk9ORSwgdmFsYnVmLT5kYXRhKCksIHZhbGJ1Zi0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kQnVmZmVyKCJzZWkiLCAmdmFsYnVmKSkgeworICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlTRUksCisgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhQmFzZTo6VHlwZTo6VFlQRV9OT05FLCB2YWxidWYtPmRhdGEoKSwgdmFsYnVmLT5zaXplKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRCdWZmZXIoImF1ZGlvLXByZXNlbnRhdGlvbi1pbmZvIiwgJnZhbGJ1ZikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5QXVkaW9QcmVzZW50YXRpb25JbmZvLAorICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUJhc2U6OlR5cGU6OlRZUEVfTk9ORSwgdmFsYnVmLT5kYXRhKCksIHZhbGJ1Zi0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICpidWZmZXIgPSBudWxscHRyOworICAgIH0KKworICAgIHJldHVybiByZXZlcnNlX3RyYW5zbGF0ZV9lcnJvcihyZXQpOworfQorCitib29sIE1lZGlhVHJhY2tDVW53cmFwcGVyOjpzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCkgeworICAgIHJldHVybiB3cmFwcGVyLT5zdXBwb3J0c05vbkJsb2NraW5nUmVhZCh3cmFwcGVyLT5kYXRhKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5jcHAKaW5kZXggMDRmNmFkZS4uM2YwYmM3ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5jcHAKQEAgLTE2LDE1ICsxNiwyNSBAQAogCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAjZGVmaW5lIExPR19UQUcgIk1ldGFEYXRhVXRpbHMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGJvb2wgTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSwgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAoZGF0YSA9PSBudWxscHRyIHx8IHNpemUgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCiAgICAgaW50MzJfdCB3aWR0aDsKICAgICBpbnQzMl90IGhlaWdodDsKICAgICBpbnQzMl90IHNhcldpZHRoOwpAQCAtNDYsMjEgKzU2LDg2IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAobWV0YSA9PSBudWxscHRyIHx8IGRhdGEgPT0gbnVsbHB0ciB8fCBzaXplID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDMyX3Qgd2lkdGg7CisgICAgaW50MzJfdCBoZWlnaHQ7CisgICAgaW50MzJfdCBzYXJXaWR0aDsKKyAgICBpbnQzMl90IHNhckhlaWdodDsKKyAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gbmV3IEFCdWZmZXIoKHZvaWQqKWRhdGEsICBzaXplKTsKKyAgICBzcDxBQnVmZmVyPiBjc2QgPSBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoYWNjZXNzVW5pdCwgJndpZHRoLCAmaGVpZ2h0LCAmc2FyV2lkdGgsICZzYXJIZWlnaHQpOworICAgIGlmIChjc2QgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworCisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF9BVkMsIGNzZC0+ZGF0YSgpLCBjc2QtPnNpemUoKSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsIHdpZHRoKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsIGhlaWdodCk7CisgICAgaWYgKHNhcldpZHRoID4gMCAmJiBzYXJIZWlnaHQgPiAwKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBUl9XSURUSCwgc2FyV2lkdGgpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQVJfSEVJR0hULCBzYXJIZWlnaHQpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChkYXRhID09IG51bGxwdHIgfHwgc2l6ZSA8IDcpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEFCaXRSZWFkZXIgYml0cyhkYXRhLCBzaXplKTsKKworICAgIC8vIGFkdHNfZml4ZWRfaGVhZGVyCisKKyAgICBpZiAoYml0cy5nZXRCaXRzKDEyKSAhPSAweGZmZnUpIHsKKyAgICAgICAgQUxPR0UoIldyb25nIGF0ZHNfZml4ZWRfaGVhZGVyIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBiaXRzLnNraXBCaXRzKDQpOyAgLy8gSUQsIGxheWVyLCBwcm90ZWN0aW9uX2Fic2VudAorCisgICAgdW5zaWduZWQgcHJvZmlsZSA9IGJpdHMuZ2V0Qml0cygyKTsKKyAgICBpZiAocHJvZmlsZSA9PSAzdSkgeworICAgICAgICBBTE9HRSgicHJvZmlsZSBzaG91bGQgbm90IGJlIDMiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB1bnNpZ25lZCBzYW1wbGluZ19mcmVxX2luZGV4ID0gYml0cy5nZXRCaXRzKDQpOworICAgIGJpdHMuZ2V0Qml0cygxKTsgIC8vIHByaXZhdGVfYml0CisgICAgdW5zaWduZWQgY2hhbm5lbF9jb25maWd1cmF0aW9uID0gYml0cy5nZXRCaXRzKDMpOworICAgIGlmIChjaGFubmVsX2NvbmZpZ3VyYXRpb24gPT0gMHUpIHsKKyAgICAgICAgQUxPR0UoImNoYW5uZWxfY29uZmlnIHNob3VsZCBub3QgYmUgMCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgICAgICBtZXRhLCBwcm9maWxlLCBzYW1wbGluZ19mcmVxX2luZGV4LCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtZXRhLnNldEludDMyKGtLZXlJc0FEVFMsIHRydWUpOworICAgIHJldHVybiB0cnVlOworfQorCiBib29sIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAotICAgICAgICB1bnNpZ25lZCBwcm9maWxlLCB1bnNpZ25lZCBzYW1wbGluZ19mcmVxX2luZGV4LAotICAgICAgICB1bnNpZ25lZCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgdWludDhfdCAqY3NkLCAvKiBvdXQgKi8KKyAgICAgICAgc2l6ZV90ICplc2RzX3NpemUsIC8qIGluL291dCAqLworICAgICAgICB1bnNpZ25lZCBwcm9maWxlLCAvKiBpbiAqLworICAgICAgICB1bnNpZ25lZCBzYW1wbGluZ19mcmVxX2luZGV4LCAvKiBpbiAqLworICAgICAgICB1bnNpZ25lZCBjaGFubmVsX2NvbmZpZ3VyYXRpb24sIC8qIGluICovCisgICAgICAgIGludDMyX3QgKnNhbXBsaW5nX3JhdGUgLyogb3V0ICovCispIHsKICAgICBpZihzYW1wbGluZ19mcmVxX2luZGV4ID4gMTF1KSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgaW50MzJfdCBzYW1wbGVSYXRlOwotICAgIGludDMyX3QgY2hhbm5lbENvdW50OwogICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtTYW1wbGluZ0ZyZXFbXSA9IHsKICAgICAgICAgOTYwMDAsIDg4MjAwLCA2NDAwMCwgNDgwMDAsIDQ0MTAwLCAzMjAwMCwgMjQwMDAsIDIyMDUwLAogICAgICAgICAxNjAwMCwgMTIwMDAsIDExMDI1LCA4MDAwCiAgICAgfTsKLSAgICBzYW1wbGVSYXRlID0ga1NhbXBsaW5nRnJlcVtzYW1wbGluZ19mcmVxX2luZGV4XTsKLSAgICBjaGFubmVsQ291bnQgPSBjaGFubmVsX2NvbmZpZ3VyYXRpb247CisgICAgKnNhbXBsaW5nX3JhdGUgPSBrU2FtcGxpbmdGcmVxW3NhbXBsaW5nX2ZyZXFfaW5kZXhdOwogCiAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1N0YXRpY0VTRFNbXSA9IHsKICAgICAgICAgMHgwMywgMjIsCkBAIC04Myw3ICsxNTgsOSBAQAogICAgIH07CiAKICAgICBzaXplX3QgY3NkU2l6ZSA9IHNpemVvZihrU3RhdGljRVNEUykgKyAyOwotICAgIHVpbnQ4X3QgKmNzZCA9IG5ldyB1aW50OF90W2NzZFNpemVdOworICAgIGlmIChjc2RTaXplID4gKmVzZHNfc2l6ZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogICAgIG1lbWNweShjc2QsIGtTdGF0aWNFU0RTLCBzaXplb2Yoa1N0YXRpY0VTRFMpKTsKIAogICAgIGNzZFtzaXplb2Yoa1N0YXRpY0VTRFMpXSA9CkBAIC05MiwxNCArMTY5LDE5NyBAQAogICAgIGNzZFtzaXplb2Yoa1N0YXRpY0VTRFMpICsgMV0gPQogICAgICAgICAoKHNhbXBsaW5nX2ZyZXFfaW5kZXggPDwgNykgJiAweDgwKSB8IChjaGFubmVsX2NvbmZpZ3VyYXRpb24gPDwgMyk7CiAKKyAgICAqZXNkc19zaXplID0gY3NkU2l6ZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCB1bnNpZ25lZCBwcm9maWxlLCB1bnNpZ25lZCBzYW1wbGluZ19mcmVxX2luZGV4LAorICAgICAgICB1bnNpZ25lZCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pIHsKKworICAgIGlmKHNhbXBsaW5nX2ZyZXFfaW5kZXggPiAxMXUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHVpbnQ4X3QgY3NkWzJdOworICAgIGNzZFswXSA9ICgocHJvZmlsZSArIDEpIDw8IDMpIHwgKHNhbXBsaW5nX2ZyZXFfaW5kZXggPj4gMSk7CisgICAgY3NkWzFdID0gKChzYW1wbGluZ19mcmVxX2luZGV4IDw8IDcpICYgMHg4MCkgfCAoY2hhbm5lbF9jb25maWd1cmF0aW9uIDw8IDMpOworCisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga1NhbXBsaW5nRnJlcVtdID0geworICAgICAgICA5NjAwMCwgODgyMDAsIDY0MDAwLCA0ODAwMCwgNDQxMDAsIDMyMDAwLCAyNDAwMCwgMjIwNTAsCisgICAgICAgIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDAKKyAgICB9OworICAgIGludDMyX3Qgc2FtcGxlUmF0ZSA9IGtTYW1wbGluZ0ZyZXFbc2FtcGxpbmdfZnJlcV9pbmRleF07CisKKyAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIGNzZCwgc2l6ZW9mKGNzZCkpOworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBzYW1wbGVSYXRlKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKAorICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIHVuc2lnbmVkIHByb2ZpbGUsIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXgsCisgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbikgeworCisgICAgdWludDhfdCBjc2RbMjRdOworICAgIHNpemVfdCBjc2RTaXplID0gc2l6ZW9mKGNzZCk7CisgICAgaW50MzJfdCBzYW1wbGVSYXRlOworCisgICAgaWYgKCFNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoY3NkLCAmY3NkU2l6ZSwgcHJvZmlsZSwgc2FtcGxpbmdfZnJlcV9pbmRleCwKKyAgICAgICAgICAgIGNoYW5uZWxfY29uZmlndXJhdGlvbiwgJnNhbXBsZVJhdGUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpOwogCiAgICAgbWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7Ci0gICAgbWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBjaGFubmVsQ291bnQpOwotCisgICAgbWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pOwogICAgIG1ldGEuc2V0RGF0YShrS2V5RVNEUywgMCwgY3NkLCBjc2RTaXplKTsKLSAgICBkZWxldGUgW10gY3NkOwogICAgIHJldHVybiB0cnVlOwogfQogCisKK3N0YXRpYyB2b2lkIGV4dHJhY3RBbGJ1bUFydCgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmaWxlTWV0YSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBBTE9HVigiZXh0cmFjdEFsYnVtQXJ0IGZyb20gJyVzJyIsIChjb25zdCBjaGFyICopZGF0YSk7CisKKyAgICBzaXplX3QgaW5MZW4gPSBzdHJubGVuKChjb25zdCBjaGFyICopZGF0YSwgc2l6ZSk7CisgICAgc2l6ZV90IGZsYWNTaXplID0gaW5MZW4gLyA0ICogMzsKKyAgICB1aW50OF90ICpmbGFjID0gbmV3IHVpbnQ4X3RbZmxhY1NpemVdOworICAgIGlmICghZGVjb2RlQmFzZTY0KGZsYWMsICZmbGFjU2l6ZSwgKGNvbnN0IGNoYXIqKWRhdGEpKSB7CisgICAgICAgIEFMT0dFKCJtYWxmb3JtZWQgYmFzZTY0IGVuY29kZWQgZGF0YS4iKTsKKyAgICAgICAgZGVsZXRlW10gZmxhYzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dWKCJnb3QgZmxhYyBvZiBzaXplICV6dSIsIGZsYWNTaXplKTsKKworICAgIHVpbnQzMl90IHBpY1R5cGU7CisgICAgdWludDMyX3QgdHlwZUxlbjsKKyAgICB1aW50MzJfdCBkZXNjTGVuOworICAgIHVpbnQzMl90IGRhdGFMZW47CisgICAgY2hhciB0eXBlWzEyOF07CisKKyAgICBpZiAoZmxhY1NpemUgPCA4KSB7CisgICAgICAgIGRlbGV0ZVtdIGZsYWM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBwaWNUeXBlID0gVTMyX0FUKGZsYWMpOworCisgICAgaWYgKHBpY1R5cGUgIT0gMykgeworICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIGZyb250IGNvdmVyLgorICAgICAgICBkZWxldGVbXSBmbGFjOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdHlwZUxlbiA9IFUzMl9BVCgmZmxhY1s0XSk7CisgICAgaWYgKHR5cGVMZW4gPiBzaXplb2YodHlwZSkgLSAxKSB7CisgICAgICAgIGRlbGV0ZVtdIGZsYWM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyB3ZSd2ZSBhbHJlYWR5IGNoZWNrZWQgYWJvdmUgdGhhdCBmbGFjU2l6ZSA+PSA4CisgICAgaWYgKGZsYWNTaXplIC0gOCA8IHR5cGVMZW4pIHsKKyAgICAgICAgZGVsZXRlW10gZmxhYzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1lbWNweSh0eXBlLCAmZmxhY1s4XSwgdHlwZUxlbik7CisgICAgdHlwZVt0eXBlTGVuXSA9ICdcMCc7CisKKyAgICBBTE9HVigicGljVHlwZSA9ICVkLCB0eXBlID0gJyVzJyIsIHBpY1R5cGUsIHR5cGUpOworCisgICAgaWYgKCFzdHJjbXAodHlwZSwgIi0tPiIpKSB7CisgICAgICAgIC8vIFRoaXMgaXMgbm90IGlubGluZSBjb3ZlciBhcnQsIGJ1dCBhbiBleHRlcm5hbCB1cmwgaW5zdGVhZC4KKyAgICAgICAgZGVsZXRlW10gZmxhYzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChmbGFjU2l6ZSA8IDMyIHx8IGZsYWNTaXplIC0gMzIgPCB0eXBlTGVuKSB7CisgICAgICAgIGRlbGV0ZVtdIGZsYWM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkZXNjTGVuID0gVTMyX0FUKCZmbGFjWzggKyB0eXBlTGVuXSk7CisgICAgaWYgKGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIDwgZGVzY0xlbikgeworICAgICAgICBkZWxldGVbXSBmbGFjOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZGF0YUxlbiA9IFUzMl9BVCgmZmxhY1s4ICsgdHlwZUxlbiArIDQgKyBkZXNjTGVuICsgMTZdKTsKKworICAgIC8vIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZCBhYm92ZSB0aGF0IChmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiAtIGRlc2NMZW4pID49IDAKKyAgICBpZiAoZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gLSBkZXNjTGVuIDwgZGF0YUxlbikgeworICAgICAgICBkZWxldGVbXSBmbGFjOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1YoImdvdCBpbWFnZSBkYXRhLCAlenUgdHJhaWxpbmcgYnl0ZXMiLAorICAgICAgICAgZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gLSBkZXNjTGVuIC0gZGF0YUxlbik7CisKKyAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKGZpbGVNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJULAorICAgICAgICAgICAgJmZsYWNbOCArIHR5cGVMZW4gKyA0ICsgZGVzY0xlbiArIDIwXSwgZGF0YUxlbik7CisKKyAgICBkZWxldGVbXSBmbGFjOworfQorCit2b2lkIHBhcnNlVm9yYmlzQ29tbWVudCgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmaWxlTWV0YSwgY29uc3QgY2hhciAqY29tbWVudCwgc2l6ZV90IGNvbW1lbnRMZW5ndGgpIHsKKyAgICAvLyBIYXB0aWMgdGFnIGlzIG9ubHkga2VwdCBoZXJlIGFzIGl0IHdpbGwgb25seSBiZSB1c2VkIGluIGV4dHJhY3RvciB0byBnZW5lcmF0ZSBjaGFubmVsIG1hc2suCisgICAgc3RydWN0IHsKKyAgICAgICAgY29uc3QgY2hhciAqY29uc3QgbVRhZzsKKyAgICAgICAgY29uc3QgY2hhciAqbUtleTsKKyAgICB9IGtNYXBbXSA9IHsKKyAgICAgICAgeyAiVElUTEUiLCBBTUVESUFGT1JNQVRfS0VZX1RJVExFIH0sCisgICAgICAgIHsgIkFSVElTVCIsIEFNRURJQUZPUk1BVF9LRVlfQVJUSVNUIH0sCisgICAgICAgIHsgIkFMQlVNQVJUSVNUIiwgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVElTVCB9LAorICAgICAgICB7ICJBTEJVTSBBUlRJU1QiLCBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUSVNUIH0sCisgICAgICAgIHsgIkNPTVBJTEFUSU9OIiwgQU1FRElBRk9STUFUX0tFWV9DT01QSUxBVElPTiB9LAorICAgICAgICB7ICJBTEJVTSIsIEFNRURJQUZPUk1BVF9LRVlfQUxCVU0gfSwKKyAgICAgICAgeyAiQ09NUE9TRVIiLCBBTUVESUFGT1JNQVRfS0VZX0NPTVBPU0VSIH0sCisgICAgICAgIHsgIkdFTlJFIiwgQU1FRElBRk9STUFUX0tFWV9HRU5SRSB9LAorICAgICAgICB7ICJBVVRIT1IiLCBBTUVESUFGT1JNQVRfS0VZX0FVVEhPUiB9LAorICAgICAgICB7ICJUUkFDS05VTUJFUiIsIEFNRURJQUZPUk1BVF9LRVlfQ0RUUkFDS05VTUJFUiB9LAorICAgICAgICB7ICJESVNDTlVNQkVSIiwgQU1FRElBRk9STUFUX0tFWV9ESVNDTlVNQkVSIH0sCisgICAgICAgIHsgIkRBVEUiLCBBTUVESUFGT1JNQVRfS0VZX0RBVEUgfSwKKyAgICAgICAgeyAiWUVBUiIsIEFNRURJQUZPUk1BVF9LRVlfWUVBUiB9LAorICAgICAgICB7ICJMWVJJQ0lTVCIsIEFNRURJQUZPUk1BVF9LRVlfTFlSSUNJU1QgfSwKKyAgICAgICAgeyAiTUVUQURBVEFfQkxPQ0tfUElDVFVSRSIsIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlQgfSwKKyAgICAgICAgeyAiQU5EUk9JRF9MT09QIiwgQU1FRElBRk9STUFUX0tFWV9MT09QIH0sCisgICAgICAgIHsgIkFORFJPSURfSEFQVElDIiwgQU1FRElBRk9STUFUX0tFWV9IQVBUSUNfQ0hBTk5FTF9DT1VOVCB9LAorICAgIH07CisKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzaXplb2Yoa01hcCkgLyBzaXplb2Yoa01hcFswXSk7ICsraikgeworICAgICAgICAgICAgc2l6ZV90IHRhZ0xlbiA9IHN0cmxlbihrTWFwW2pdLm1UYWcpOworICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcChrTWFwW2pdLm1UYWcsIGNvbW1lbnQsIHRhZ0xlbikKKyAgICAgICAgICAgICAgICAgICAgJiYgY29tbWVudFt0YWdMZW5dID09ICc9JykgeworICAgICAgICAgICAgICAgIGlmIChrTWFwW2pdLm1LZXkgPT0gQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCkgeworICAgICAgICAgICAgICAgICAgICBleHRyYWN0QWxidW1BcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbW1lbnRbdGFnTGVuICsgMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudExlbmd0aCAtIHRhZ0xlbiAtIDEpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa01hcFtqXS5tS2V5ID09IEFNRURJQUZPUk1BVF9LRVlfTE9PUCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAoJmNvbW1lbnRbdGFnTGVuICsgMV0sICJ0cnVlIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihmaWxlTWV0YSwgQU1FRElBRk9STUFUX0tFWV9MT09QLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa01hcFtqXS5tS2V5ID09IEFNRURJQUZPUk1BVF9LRVlfSEFQVElDX0NIQU5ORUxfQ09VTlQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqZW5kOworICAgICAgICAgICAgICAgICAgICBlcnJubyA9IDA7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBoYXB0aWNDaGFubmVsQ291bnQgPSBzdHJ0b2woJmNvbW1lbnRbdGFnTGVuICsgMV0sICZlbmQsIDEwKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVycm5vID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihmaWxlTWV0YSwga01hcFtqXS5tS2V5LCBoYXB0aWNDaGFubmVsQ291bnQpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkVycm9yKCVkKSB3aGVuIHBhcnNpbmcgaGFwdGljIGNoYW5uZWwgY291bnQiLCBlcnJubyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKGZpbGVNZXRhLCBrTWFwW2pdLm1LZXksICZjb21tZW50W3RhZ0xlbiArIDFdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAKaW5kZXggMThmNGIxMi4uNTIyYzgxZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVDYWNoZWRTb3VyY2UyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwCkBAIC0yNTYsNiArMjU2LDEwIEBACiAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwogfQogCit2b2lkIE51Q2FjaGVkU291cmNlMjo6Y2xvc2UoKSB7CisgICAgZGlzY29ubmVjdCgpOworfQorCiB2b2lkIE51Q2FjaGVkU291cmNlMjo6ZGlzY29ubmVjdCgpIHsKICAgICBpZiAobVNvdXJjZS0+ZmxhZ3MoKSAmIGtJc0hUVFBCYXNlZFNvdXJjZSkgewogICAgICAgICBBTE9HVigiZGlzY29ubmVjdGluZyBIVFRQQmFzZWRTb3VyY2UiKTsKQEAgLTQzNiwxMiArNDQwLDEyIEBACiAgICAgaWYgKG1GZXRjaGluZykgewogICAgICAgICBpZiAobUZpbmFsU3RhdHVzICE9IE9LICYmIG1OdW1SZXRyaWVzTGVmdCA+IDApIHsKICAgICAgICAgICAgIC8vIFdlIGZhaWxlZCB0aGlzIHRpbWUgYW5kIHdpbGwgdHJ5IGFnYWluIGluIDMgc2Vjb25kcy4KLSAgICAgICAgICAgIGRlbGF5VXMgPSAzMDAwMDAwbGw7CisgICAgICAgICAgICBkZWxheVVzID0gMzAwMDAwMExMOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZGVsYXlVcyA9IDA7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBkZWxheVVzID0gMTAwMDAwbGw7CisgICAgICAgIGRlbGF5VXMgPSAxMDAwMDBMTDsKICAgICB9CiAKICAgICAobmV3IEFNZXNzYWdlKGtXaGF0RmV0Y2hNb3JlLCBtUmVmbGVjdG9yKSktPnBvc3QoZGVsYXlVcyk7CkBAIC01NjcsMTIgKzU3MSwxOSBAQAogICAgIHJldHVybiBtQ2FjaGVPZmZzZXQgKyBtQ2FjaGUtPnRvdGFsU2l6ZSgpOwogfQogCi1zaXplX3QgTnVDYWNoZWRTb3VyY2UyOjphcHByb3hEYXRhUmVtYWluaW5nKHN0YXR1c190ICpmaW5hbFN0YXR1cykgY29uc3Qgeworc3RhdHVzX3QgTnVDYWNoZWRTb3VyY2UyOjpnZXRBdmFpbGFibGVTaXplKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90ICpzaXplKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gYXBwcm94RGF0YVJlbWFpbmluZ19sKGZpbmFsU3RhdHVzKTsKKyAgICBzdGF0dXNfdCBmaW5hbFN0YXR1cyA9IFVOS05PV05fRVJST1I7CisgICAgKnNpemUgPSBhcHByb3hEYXRhUmVtYWluaW5nX2wob2Zmc2V0LCAmZmluYWxTdGF0dXMpOworICAgIHJldHVybiBmaW5hbFN0YXR1czsKIH0KIAotc2l6ZV90IE51Q2FjaGVkU291cmNlMjo6YXBwcm94RGF0YVJlbWFpbmluZ19sKHN0YXR1c190ICpmaW5hbFN0YXR1cykgY29uc3Qgeworc2l6ZV90IE51Q2FjaGVkU291cmNlMjo6YXBwcm94RGF0YVJlbWFpbmluZyhzdGF0dXNfdCAqZmluYWxTdGF0dXMpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHJldHVybiBhcHByb3hEYXRhUmVtYWluaW5nX2wobUxhc3RBY2Nlc3NQb3MsIGZpbmFsU3RhdHVzKTsKK30KKworc2l6ZV90IE51Q2FjaGVkU291cmNlMjo6YXBwcm94RGF0YVJlbWFpbmluZ19sKG9mZjY0X3Qgb2Zmc2V0LCBzdGF0dXNfdCAqZmluYWxTdGF0dXMpIGNvbnN0IHsKICAgICAqZmluYWxTdGF0dXMgPSBtRmluYWxTdGF0dXM7CiAKICAgICBpZiAobUZpbmFsU3RhdHVzICE9IE9LICYmIG1OdW1SZXRyaWVzTGVmdCA+IDApIHsKQEAgLTU4MCw5ICs1OTEsMTAgQEAKICAgICAgICAgKmZpbmFsU3RhdHVzID0gT0s7CiAgICAgfQogCisgICAgb2Zmc2V0ID0gb2Zmc2V0ID49IDAgPyBvZmZzZXQgOiBtTGFzdEFjY2Vzc1BvczsKICAgICBvZmY2NF90IGxhc3RCeXRlUG9zQ2FjaGVkID0gbUNhY2hlT2Zmc2V0ICsgbUNhY2hlLT50b3RhbFNpemUoKTsKLSAgICBpZiAobUxhc3RBY2Nlc3NQb3MgPCBsYXN0Qnl0ZVBvc0NhY2hlZCkgewotICAgICAgICByZXR1cm4gbGFzdEJ5dGVQb3NDYWNoZWQgLSBtTGFzdEFjY2Vzc1BvczsKKyAgICBpZiAob2Zmc2V0IDwgbGFzdEJ5dGVQb3NDYWNoZWQpIHsKKyAgICAgICAgcmV0dXJuIGxhc3RCeXRlUG9zQ2FjaGVkIC0gb2Zmc2V0OwogICAgIH0KICAgICByZXR1cm4gMDsKIH0KQEAgLTcyOCw3ICs3NDAsNyBAQAogICAgIH0KIAogICAgIGlmIChrZWVwQWxpdmVTZWNzID49IDApIHsKLSAgICAgICAgbUtlZXBBbGl2ZUludGVydmFsVXMgPSBrZWVwQWxpdmVTZWNzICogMTAwMDAwMGxsOworICAgICAgICBtS2VlcEFsaXZlSW50ZXJ2YWxVcyA9IGtlZXBBbGl2ZVNlY3MgKiAxMDAwMDAwTEw7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUtlZXBBbGl2ZUludGVydmFsVXMgPSBrRGVmYXVsdEtlZXBBbGl2ZUludGVydmFsVXM7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcAppbmRleCA0YTdkNmNhLi42ODBkNDI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcApAQCAtMjEsMTAgKzIxLDggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmg+CiAKICNpbmNsdWRlICJpbmNsdWRlL0VTRFMuaCIKLSNpbmNsdWRlICJpbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIgogCiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtMzQsNiArMzIsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KQEAgLTQyLDcgKzQxLDcgQEAKIAogTnVNZWRpYUV4dHJhY3Rvcjo6U2FtcGxlOjpTYW1wbGUoKQogICAgIDogbUJ1ZmZlcihOVUxMKSwKLSAgICAgIG1TYW1wbGVUaW1lVXMoLTFsbCkgeworICAgICAgbVNhbXBsZVRpbWVVcygtMUxMKSB7CiB9CiAKIE51TWVkaWFFeHRyYWN0b3I6OlNhbXBsZTo6U2FtcGxlKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyLCBpbnQ2NF90IHRpbWVVcykKQEAgLTUxLDggKzUwLDggQEAKIH0KIAogTnVNZWRpYUV4dHJhY3Rvcjo6TnVNZWRpYUV4dHJhY3RvcigpCi0gICAgOiBtVG90YWxCaXRyYXRlKC0xbGwpLAotICAgICAgbUR1cmF0aW9uVXMoLTFsbCkgeworICAgIDogbVRvdGFsQml0cmF0ZSgtMUxMKSwKKyAgICAgIG1EdXJhdGlvblVzKC0xTEwpIHsKIH0KIAogTnVNZWRpYUV4dHJhY3Rvcjo6fk51TWVkaWFFeHRyYWN0b3IoKSB7CkBAIC0yMDUsMjIgKzIwNCwxMyBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBOdU1lZGlhRXh0cmFjdG9yOjpkaXNjb25uZWN0KCkgewotICAgIGlmIChtRGF0YVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIGRpc2Nvbm5lY3QgZGF0YSBzb3VyY2UKLSAgICAgICAgaWYgKG1EYXRhU291cmNlLT5mbGFncygpICYgRGF0YVNvdXJjZTo6a0lzQ2FjaGluZ0RhdGFTb3VyY2UpIHsKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PE51Q2FjaGVkU291cmNlMiAqPihtRGF0YVNvdXJjZS5nZXQoKSktPmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQogc3RhdHVzX3QgTnVNZWRpYUV4dHJhY3Rvcjo6dXBkYXRlRHVyYXRpb25BbmRCaXRyYXRlKCkgewogICAgIGlmIChtSW1wbC0+Y291bnRUcmFja3MoKSA+IGtNYXhUcmFja0NvdW50KSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9CiAKLSAgICBtVG90YWxCaXRyYXRlID0gMGxsOwotICAgIG1EdXJhdGlvblVzID0gLTFsbDsKKyAgICBtVG90YWxCaXRyYXRlID0gMExMOworICAgIG1EdXJhdGlvblVzID0gLTFMTDsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUltcGwtPmNvdW50VHJhY2tzKCk7ICsraSkgewogICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1JbXBsLT5nZXRUcmFja01ldGFEYXRhKGkpOwpAQCAtMjM1LDggKzIyNSw4IEBACiAgICAgICAgICAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CiAgICAgICAgICAgICBBTE9HVigidHJhY2sgb2YgdHlwZSAnJXMnIGRvZXMgbm90IHB1Ymxpc2ggYml0cmF0ZSIsIG1pbWUpOwogCi0gICAgICAgICAgICBtVG90YWxCaXRyYXRlID0gLTFsbDsKLSAgICAgICAgfSBlbHNlIGlmIChtVG90YWxCaXRyYXRlID49IDBsbCkgeworICAgICAgICAgICAgbVRvdGFsQml0cmF0ZSA9IC0xTEw7CisgICAgICAgIH0gZWxzZSBpZiAobVRvdGFsQml0cmF0ZSA+PSAwTEwpIHsKICAgICAgICAgICAgIG1Ub3RhbEJpdHJhdGUgKz0gYml0cmF0ZTsKICAgICAgICAgfQogCkBAIC00NDAsMTggKzQzMCw2IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIE51TWVkaWFFeHRyYWN0b3I6OnJlbGVhc2VPbmVTYW1wbGUoVHJhY2tJbmZvICppbmZvKSB7Ci0gICAgaWYgKGluZm8gPT0gTlVMTCB8fCBpbmZvLT5tU2FtcGxlcy5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBhdXRvIGl0ID0gaW5mby0+bVNhbXBsZXMuYmVnaW4oKTsKLSAgICBpZiAoaXQtPm1CdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBpdC0+bUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgIH0KLSAgICBpbmZvLT5tU2FtcGxlcy5lcmFzZShpdCk7Ci19Ci0KIHZvaWQgTnVNZWRpYUV4dHJhY3Rvcjo6cmVsZWFzZVRyYWNrU2FtcGxlcyhUcmFja0luZm8gKmluZm8pIHsKICAgICBpZiAoaW5mbyA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTQ4Miw3ICs0NjAsNyBAQAogICAgICAgICBmZXRjaFRyYWNrU2FtcGxlcyhpbmZvLCBzZWVrVGltZVVzLCBtb2RlKTsKIAogICAgICAgICBzdGF0dXNfdCBlcnIgPSBpbmZvLT5tRmluYWxSZXN1bHQ7Ci0gICAgICAgIGlmIChlcnIgIT0gT0sgJiYgZXJyICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgaWYgKGVyciAhPSBPSyAmJiBlcnIgIT0gRVJST1JfRU5EX09GX1NUUkVBTSAmJiBpbmZvLT5tU2FtcGxlcy5lbXB0eSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAKQEAgLTUxMyw3ICs0OTEsNyBAQAogICAgIH0KIAogICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOwotICAgIGlmIChzZWVrVGltZVVzID49IDBsbCkgeworICAgIGlmIChzZWVrVGltZVVzID49IDBMTCkgewogICAgICAgICBvcHRpb25zLnNldFNlZWtUbyhzZWVrVGltZVVzLCBtb2RlKTsKICAgICAgICAgaW5mby0+bUZpbmFsUmVzdWx0ID0gT0s7CiAgICAgICAgIHJlbGVhc2VUcmFja1NhbXBsZXMoaW5mbyk7CkBAIC01MzcsMTQgKzUxNSw2IEBACiAgICAgaW5mby0+bUZpbmFsUmVzdWx0ID0gZXJyOwogICAgIGlmIChlcnIgIT0gT0sgJiYgZXJyICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKICAgICAgICAgQUxPR1coInJlYWQgb24gdHJhY2sgJXp1IGZhaWxlZCB3aXRoIGVycm9yICVkIiwgaW5mby0+bVRyYWNrSW5kZXgsIGVycik7Ci0gICAgICAgIHNpemVfdCBjb3VudCA9IG1lZGlhQnVmZmVycy5zaXplKCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGlkID0gMDsgaWQgPCBjb3VudDsgKytpZCkgewotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICptYnVmID0gbWVkaWFCdWZmZXJzW2lkXTsKLSAgICAgICAgICAgIGlmIChtYnVmICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtYnVmLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIHNpemVfdCBjb3VudCA9IG1lZGlhQnVmZmVycy5zaXplKCk7CkBAIC01OTQsOCArNTY0LDI2IEBACiAKICAgICBUcmFja0luZm8gKmluZm8gPSAmbVNlbGVjdGVkVHJhY2tzLmVkaXRJdGVtQXQobWluSW5kZXgpOwogCi0gICAgcmVsZWFzZU9uZVNhbXBsZShpbmZvKTsKKyAgICBpZiAoaW5mbyA9PSBOVUxMIHx8IGluZm8tPm1TYW1wbGVzLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgfQogCisgICAgYXV0byBpdCA9IGluZm8tPm1TYW1wbGVzLmJlZ2luKCk7CisgICAgaWYgKGl0LT5tQnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgaXQtPm1CdWZmZXItPnJlbGVhc2UoKTsKKyAgICB9CisgICAgaW5mby0+bVNhbXBsZXMuZXJhc2UoaXQpOworCisgICAgaWYgKGluZm8tPm1TYW1wbGVzLmVtcHR5KCkpIHsKKyAgICAgICAgbWluSW5kZXggPSBmZXRjaEFsbFRyYWNrU2FtcGxlcygpOworICAgICAgICBpZiAobWluSW5kZXggPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgfQorICAgICAgICBpbmZvID0gJm1TZWxlY3RlZFRyYWNrcy5lZGl0SXRlbUF0KG1pbkluZGV4KTsKKyAgICAgICAgaWYgKGluZm8gPT0gTlVMTCB8fCBpbmZvLT5tU2FtcGxlcy5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgfQorICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTc2Niw2ICs3NTQsOSBAQAogfQogCiBzdGF0dXNfdCBOdU1lZGlhRXh0cmFjdG9yOjpnZXRNZXRyaWNzKFBhcmNlbCAqcmVwbHkpIHsKKyAgICBpZiAobUltcGwgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUltcGwtPmdldE1ldHJpY3MocmVwbHkpOwogICAgIHJldHVybiBzdGF0dXM7CiB9CkBAIC03NzgsNyArNzY5LDcgQEAKIAogICAgIG9mZjY0X3Qgc2l6ZTsKICAgICBpZiAobUR1cmF0aW9uVXMgPiAwICYmIG1EYXRhU291cmNlLT5nZXRTaXplKCZzaXplKSA9PSBPSykgewotICAgICAgICAqYml0cmF0ZSA9IHNpemUgKiA4MDAwMDAwbGwgLyBtRHVyYXRpb25VczsgIC8vIGluIGJpdHMvc2VjCisgICAgICAgICpiaXRyYXRlID0gc2l6ZSAqIDgwMDAwMDBMTCAvIG1EdXJhdGlvblVzOyAgLy8gaW4gYml0cy9zZWMKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCkBAIC03OTAsMTYgKzc4MSwxMiBAQAogICAgICAgICBpbnQ2NF90ICpkdXJhdGlvblVzLCBib29sICplb3MpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCisgICAgb2ZmNjRfdCBjYWNoZWREYXRhUmVtYWluaW5nID0gLTE7CisgICAgc3RhdHVzX3QgZmluYWxTdGF0dXMgPSBtRGF0YVNvdXJjZS0+Z2V0QXZhaWxhYmxlU2l6ZSgtMSwgJmNhY2hlZERhdGFSZW1haW5pbmcpOworCiAgICAgaW50NjRfdCBiaXRyYXRlOwotICAgIGlmICgobURhdGFTb3VyY2UtPmZsYWdzKCkgJiBEYXRhU291cmNlOjprSXNDYWNoaW5nRGF0YVNvdXJjZSkKKyAgICBpZiAoY2FjaGVkRGF0YVJlbWFpbmluZyA+PSAwCiAgICAgICAgICAgICAmJiBnZXRUb3RhbEJpdHJhdGUoJmJpdHJhdGUpKSB7Ci0gICAgICAgIHNwPE51Q2FjaGVkU291cmNlMj4gY2FjaGVkU291cmNlID0KLSAgICAgICAgICAgIHN0YXRpY19jYXN0PE51Q2FjaGVkU291cmNlMiAqPihtRGF0YVNvdXJjZS5nZXQoKSk7Ci0KLSAgICAgICAgc3RhdHVzX3QgZmluYWxTdGF0dXM7Ci0gICAgICAgIHNpemVfdCBjYWNoZWREYXRhUmVtYWluaW5nID0KLSAgICAgICAgICAgIGNhY2hlZFNvdXJjZS0+YXBwcm94RGF0YVJlbWFpbmluZygmZmluYWxTdGF0dXMpOwotCiAgICAgICAgICpkdXJhdGlvblVzID0gY2FjaGVkRGF0YVJlbWFpbmluZyAqIDgwMDAwMDBsbCAvIGJpdHJhdGU7CiAgICAgICAgICplb3MgPSAoZmluYWxTdGF0dXMgIT0gT0spOwogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTgwOCw0ICs3OTUsMzYgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKKy8vIFJldHVybiBPSyBpZiB3ZSBoYXZlIHJlY2VpdmVkIGFuIGF1ZGlvIHByZXNlbnRhdGlvbiBpbmZvLgorLy8gUmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU0gaWYgbm8gdHJhY2tzIGFyZSBhdmFpbGFibGUuCisvLyBSZXR1cm4gRVJST1JfVU5TVVBQT1JURUQgaWYgdGhlIHRyYWNrIGhhcyBubyBhdWRpbyBwcmVzZW50YXRpb24uCisvLyBSZXR1cm4gSU5WQUxJRF9PUEVSQVRJT04gaWYgYXVkaW8gcHJlc2VudGF0aW9uIG1ldGFkYXRhIHZlcnNpb24gZG9lcyBub3QgbWF0Y2guCitzdGF0dXNfdCBOdU1lZGlhRXh0cmFjdG9yOjpnZXRBdWRpb1ByZXNlbnRhdGlvbnMoCisgICAgICAgIHNpemVfdCB0cmFja0luZGV4LCBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb24gKnByZXNlbnRhdGlvbnMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIHNzaXplX3QgbWluSW5kZXggPSBmZXRjaEFsbFRyYWNrU2FtcGxlcygpOworICAgIGlmIChtaW5JbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNlbGVjdGVkVHJhY2tzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtU2VsZWN0ZWRUcmFja3MuZWRpdEl0ZW1BdChpKTsKKworICAgICAgICBpZiAoaW5mby0+bVRyYWNrSW5kZXggPT0gdHJhY2tJbmRleCkgeworICAgICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGEoaW5mby0+bVNhbXBsZXMuYmVnaW4oKS0+bUJ1ZmZlci0+bWV0YV9kYXRhKCkpOworCisgICAgICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICAgICAgICAgIHNpemVfdCBzaXplOworICAgICAgICAgICAgaWYgKG1ldGEgIT0gTlVMTCAmJiBtZXRhLT5maW5kRGF0YShrS2V5QXVkaW9QcmVzZW50YXRpb25JbmZvLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgICAgIHN0ZDo6aXN0cmluZ3N0cmVhbSBpblN0cmVhbShzdGQ6OnN0cmluZyhzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oZGF0YSksIHNpemUpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGVzZXJpYWxpemVBdWRpb1ByZXNlbnRhdGlvbnMoJmluU3RyZWFtLCBwcmVzZW50YXRpb25zKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJUcmFjayAlenUgZG9lcyBub3QgY29udGFpbiBhbnkgYXVkaW8gcHJlc2VudGF0aW9uIiwgdHJhY2tJbmRleCk7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoIlNvdXJjZSBkb2VzIG5vdCBjb250YWluIGFueSBhdWRpbyBwcmVzZW50YXRpb24iKTsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PZ2dXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnV3JpdGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjg3YjU1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnV3JpdGVyLmNwcApAQCAtMCwwICsxLDM5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiT2dnV3JpdGVyIgorCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9wcmN0bC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL21lZGlhcmVjb3JkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PZ2dXcml0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oPgorCitleHRlcm4gIkMiIHsKKyNpbmNsdWRlIDxvZ2cvb2dnLmg+Cit9CisKKy8vIHN0b3JlIHRoZSBpbnQzMiB2YWx1ZSBpbiBsaXR0bGUtZW5kaWFuIG9yZGVyLgorc3RhdGljIGlubGluZSB2b2lkIHdyaXRlaW50KGNoYXIgKmJ1ZiwgaW50IGJhc2UsIGludDMyX3QgdmFsKSB7CisgICAgYnVmW2Jhc2UgKyAzXSA9ICgodmFsKSA+PiAyNCkgJiAweGZmOworICAgIGJ1ZltiYXNlICsgMl0gPSAoKHZhbCkgPj4gMTYpICYgMHhmZjsKKyAgICBidWZbYmFzZSArIDFdID0gKCh2YWwpID4+IDgpICYgMHhmZjsKKyAgICBidWZbYmFzZV0gPSAodmFsKSYweGZmOworfQorCisvLyBsaW5rYWdlIGJldHdlZW4gb3VyIGhlYWRlciBPZ2dTdHJlYW1TdGF0ZSBhbmQgdGhlIHVuZGVybHlpbmcgb2dnX3N0cmVhbV9zdGF0ZQorLy8gc28gdGhhdCBjb25zdW1lcnMgb2Ygb3VyIGludGVyZmFjZSBkbyBub3QgcmVxdWlyZSB0aGUgb2dnIGhlYWRlcnMgdGhlbXNlbHZlcy4KK3N0cnVjdCBPZ2dTdHJlYW1TdGF0ZSA6IHB1YmxpYyBvZ2dfc3RyZWFtX3N0YXRlIHt9OworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK09nZ1dyaXRlcjo6T2dnV3JpdGVyKGludCBmZCkKKyAgICAgIDogbUZkKGR1cChmZCkpLAorICAgICAgICBtSW5pdENoZWNrKG1GZCA8IDAgPyBOT19JTklUIDogT0spIHsKKyAgICAvLyBlbXB0eQorfQorCitPZ2dXcml0ZXI6On5PZ2dXcml0ZXIoKSB7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIHJlc2V0KCk7CisgICAgfQorCisgICAgaWYgKG1GZCAhPSAtMSkgeworICAgICAgICBjbG9zZShtRmQpOworICAgICAgICBtRmQgPSAtMTsKKyAgICB9CisKKyAgICBmcmVlKG1Pcyk7Cit9CisKK3N0YXR1c190IE9nZ1dyaXRlcjo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBtSW5pdENoZWNrOworfQorCitzdGF0dXNfdCBPZ2dXcml0ZXI6OmFkZFNvdXJjZShjb25zdCBzcDxNZWRpYVNvdXJjZT4mIHNvdXJjZSkgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgLy8gU3VwcG9ydCBpcyBsaW1pdGVkIHRvIHNpbmdsZSB0cmFjayBvZiBPcHVzIGF1ZGlvLgorICAgIGNvbnN0IGNoYXIqIG1pbWU7CisgICAgc291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CisgICAgY29uc3QgY2hhciogb3B1cyA9IE1FRElBX01JTUVUWVBFX0FVRElPX09QVVM7CisgICAgaWYgKHN0cm5jYXNlY21wKG1pbWUsIG9wdXMsIHN0cmxlbihvcHVzKSkpIHsKKyAgICAgICAgQUxPR0UoIlRyYWNrICglcykgb3RoZXIgdGhhbiAlcyBpcyBub3Qgc3VwcG9ydGVkIiwgbWltZSwgb3B1cyk7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBtT3MgPSAoT2dnU3RyZWFtU3RhdGUqKSBtYWxsb2Moc2l6ZW9mKG9nZ19zdHJlYW1fc3RhdGUpKTsKKyAgICBpZiAob2dnX3N0cmVhbV9pbml0KChvZ2dfc3RyZWFtX3N0YXRlKiltT3MsIHJhbmQoKSkgPT0gLTEpIHsKKyAgICAgICAgQUxPR0UoIm9nZyBzdHJlYW0gaW5pdCBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgLy8gV3JpdGUgT2dnIGhlYWRlcnMuCisgICAgaW50MzJfdCBuQ2hhbm5lbHMgPSAwOworICAgIGlmICghc291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZuQ2hhbm5lbHMpKSB7CisgICAgICAgIEFMT0dFKCJNaXNzaW5nIGZvcm1hdCBrZXlzIGZvciBhdWRpbyB0cmFjayIpOworICAgICAgICBzb3VyY2UtPmdldEZvcm1hdCgpLT5kdW1wVG9Mb2coKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc291cmNlLT5nZXRGb3JtYXQoKS0+ZHVtcFRvTG9nKCk7CisKKyAgICBpbnQzMl90IHNhbXBsZVJhdGUgPSAwOworICAgIGlmICghc291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgQUxPR0UoIk1pc3NpbmcgZm9ybWF0IGtleSBmb3Igc2FtcGxlIHJhdGUiKTsKKyAgICAgICAgc291cmNlLT5nZXRGb3JtYXQoKS0+ZHVtcFRvTG9nKCk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIG1TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKKyAgICB1aW50MzJfdCB0eXBlOworICAgIGNvbnN0IHZvaWQgKmhlYWRlcl9kYXRhOworICAgIHNpemVfdCBwYWNrZXRfc2l6ZTsKKyAgICBpZiAoIXNvdXJjZS0+Z2V0Rm9ybWF0KCktPmZpbmREYXRhKGtLZXlPcHVzSGVhZGVyLCAmdHlwZSwgJmhlYWRlcl9kYXRhLCAmcGFja2V0X3NpemUpKSB7CisgICAgICAgIEFMT0dFKCJvcHVzIGhlYWRlciBub3QgZm91bmQiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgb2dnX3BhY2tldCBvcDsKKyAgICBvZ2dfcGFnZSBvZzsKKyAgICBvcC5wYWNrZXQgPSAodW5zaWduZWQgY2hhciAqKWhlYWRlcl9kYXRhOworICAgIG9wLmJ5dGVzID0gcGFja2V0X3NpemU7CisgICAgb3AuYl9vX3MgPSAxOworICAgIG9wLmVfb19zID0gMDsKKyAgICBvcC5ncmFudWxlcG9zID0gMDsKKyAgICBvcC5wYWNrZXRubyA9IDA7CisgICAgb2dnX3N0cmVhbV9wYWNrZXRpbigob2dnX3N0cmVhbV9zdGF0ZSopbU9zLCAmb3ApOworCisgICAgaW50IHJldDsKKyAgICB3aGlsZSAoKHJldCA9IG9nZ19zdHJlYW1fZmx1c2goKG9nZ19zdHJlYW1fc3RhdGUqKW1PcywgJm9nKSkpIHsKKyAgICAgICAgaWYgKCFyZXQpIGJyZWFrOworICAgICAgICB3cml0ZShtRmQsIG9nLmhlYWRlciwgb2cuaGVhZGVyX2xlbik7CisgICAgICAgIHdyaXRlKG1GZCwgb2cuYm9keSwgb2cuYm9keV9sZW4pOworICAgIH0KKworCisgICAgY29uc3QgY2hhciogdmVuZG9yX3N0cmluZyA9ICJsaWJvcHVzIjsKKyAgICBjb25zdCBpbnQgdmVuZG9yX2xlbmd0aCA9IHN0cmxlbih2ZW5kb3Jfc3RyaW5nKTsKKyAgICBpbnQgdXNlcl9jb21tZW50X2xpc3RfbGVuZ3RoID0gMDsKKworICAgIGNvbnN0IGludCBjb21tZW50c19sZW5ndGggPSA4ICsgNCArIHZlbmRvcl9sZW5ndGggKyA0ICsgdXNlcl9jb21tZW50X2xpc3RfbGVuZ3RoOworICAgIGNoYXIqIGNvbW1lbnRzID0gKGNoYXIqKW1hbGxvYyhjb21tZW50c19sZW5ndGgpOworICAgIGlmIChjb21tZW50cyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gYWxsb2NhdGUgb2dnIGNvbW1lbnQgYnVmZmVyIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtZW1jcHkoY29tbWVudHMsICJPcHVzVGFncyIsIDgpOworICAgIHdyaXRlaW50KGNvbW1lbnRzLCA4LCB2ZW5kb3JfbGVuZ3RoKTsKKyAgICBtZW1jcHkoY29tbWVudHMgKyAxMiwgdmVuZG9yX3N0cmluZywgdmVuZG9yX2xlbmd0aCk7CisgICAgd3JpdGVpbnQoY29tbWVudHMsIDEyICsgdmVuZG9yX2xlbmd0aCwgdXNlcl9jb21tZW50X2xpc3RfbGVuZ3RoKTsKKworICAgIG9wLnBhY2tldCA9ICh1bnNpZ25lZCBjaGFyKiljb21tZW50czsKKyAgICBvcC5ieXRlcyA9IGNvbW1lbnRzX2xlbmd0aDsKKyAgICBvcC5iX29fcyA9IDA7CisgICAgb3AuZV9vX3MgPSAwOworICAgIG9wLmdyYW51bGVwb3MgPSAwOworICAgIG9wLnBhY2tldG5vID0gMTsKKyAgICBvZ2dfc3RyZWFtX3BhY2tldGluKChvZ2dfc3RyZWFtX3N0YXRlKiltT3MsICZvcCk7CisKKyAgICB3aGlsZSAoKHJldCA9IG9nZ19zdHJlYW1fZmx1c2goKG9nZ19zdHJlYW1fc3RhdGUqKW1PcywgJm9nKSkpIHsKKyAgICAgICAgaWYgKCFyZXQpIGJyZWFrOworICAgICAgICB3cml0ZShtRmQsIG9nLmhlYWRlciwgb2cuaGVhZGVyX2xlbik7CisgICAgICAgIHdyaXRlKG1GZCwgb2cuYm9keSwgb2cuYm9keV9sZW4pOworICAgIH0KKworICAgIG1Tb3VyY2UgPSBzb3VyY2U7CisgICAgZnJlZShjb21tZW50cyk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBPZ2dXcml0ZXI6OnN0YXJ0KE1ldGFEYXRhKiAvKiBwYXJhbXMgKi8pIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGlmIChtU3RhcnRlZCAmJiBtUGF1c2VkKSB7CisgICAgICAgIG1QYXVzZWQgPSBmYWxzZTsKKyAgICAgICAgbVJlc3VtZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIGlmIChtU3RhcnRlZCkgeworICAgICAgICAvLyBBbHJlYWR5IHN0YXJ0ZWQsIGRvZXMgbm90aGluZworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+c3RhcnQoKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBwdGhyZWFkX2F0dHJfdCBhdHRyOworICAgIHB0aHJlYWRfYXR0cl9pbml0KCZhdHRyKTsKKyAgICBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoJmF0dHIsIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFKTsKKworICAgIG1SZWFjaGVkRU9TID0gZmFsc2U7CisgICAgbURvbmUgPSBmYWxzZTsKKworICAgIHB0aHJlYWRfY3JlYXRlKCZtVGhyZWFkLCAmYXR0ciwgVGhyZWFkV3JhcHBlciwgdGhpcyk7CisgICAgcHRocmVhZF9hdHRyX2Rlc3Ryb3koJmF0dHIpOworCisgICAgbVN0YXJ0ZWQgPSB0cnVlOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBPZ2dXcml0ZXI6OnBhdXNlKCkgeworICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBtUGF1c2VkID0gdHJ1ZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE9nZ1dyaXRlcjo6cmVzZXQoKSB7CisgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgbURvbmUgPSB0cnVlOworCisgICAgdm9pZCogZHVtbXk7CisgICAgcHRocmVhZF9qb2luKG1UaHJlYWQsICZkdW1teSk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KGR1bW15KSk7CisgICAgeworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU291cmNlLT5zdG9wKCk7CisgICAgICAgIGlmIChlcnIgPT0gT0sgJiYgKHN0YXR1cyAhPSBPSyAmJiBzdGF0dXMgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkpIHsKKyAgICAgICAgICAgIGVyciA9IHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgcmV0dXJuIGVycjsKK30KKworYm9vbCBPZ2dXcml0ZXI6OmV4Y2VlZHNGaWxlU2l6ZUxpbWl0KCkgeworICAgIGlmIChtTWF4RmlsZVNpemVMaW1pdEJ5dGVzID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gbUVzdGltYXRlZFNpemVCeXRlcyA+IG1NYXhGaWxlU2l6ZUxpbWl0Qnl0ZXM7Cit9CisKK2Jvb2wgT2dnV3JpdGVyOjpleGNlZWRzRmlsZUR1cmF0aW9uTGltaXQoKSB7CisgICAgaWYgKG1NYXhGaWxlRHVyYXRpb25MaW1pdFVzID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gbUVzdGltYXRlZER1cmF0aW9uVXMgPiBtTWF4RmlsZUR1cmF0aW9uTGltaXRVczsKK30KKworLy8gc3RhdGljCit2b2lkKiBPZ2dXcml0ZXI6OlRocmVhZFdyYXBwZXIodm9pZCogbWUpIHsKKyAgICByZXR1cm4gKHZvaWQqKSh1aW50cHRyX3QpIHN0YXRpY19jYXN0PE9nZ1dyaXRlcio+KG1lKS0+dGhyZWFkRnVuYygpOworfQorCitzdGF0dXNfdCBPZ2dXcml0ZXI6OnRocmVhZEZ1bmMoKSB7CisgICAgbUVzdGltYXRlZER1cmF0aW9uVXMgPSAwOworICAgIG1Fc3RpbWF0ZWRTaXplQnl0ZXMgPSAwOworICAgIGJvb2wgc3RvcHBlZFByZW1hdHVyZWx5ID0gdHJ1ZTsKKyAgICBpbnQ2NF90IHByZXZpb3VzUGF1c2VkRHVyYXRpb25VcyA9IDA7CisgICAgaW50NjRfdCBtYXhUaW1lc3RhbXBVcyA9IDA7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisKKyAgICBwcmN0bChQUl9TRVRfTkFNRSwgKHVuc2lnbmVkIGxvbmcpIk9nZ1dyaXRlciIsIDAsIDAsIDApOworCisgICAgd2hpbGUgKCFtRG9uZSkgeworICAgICAgICBNZWRpYUJ1ZmZlckJhc2UqIGJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIGVyciA9IG1Tb3VyY2UtPnJlYWQoJmJ1ZmZlcik7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coImZhaWxlZCB0byByZWFkIG5leHQgYnVmZmVyIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtUGF1c2VkKSB7CisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBtRXN0aW1hdGVkU2l6ZUJ5dGVzICs9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgICAgIGlmIChleGNlZWRzRmlsZVNpemVMaW1pdCgpKSB7CisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICBub3RpZnkoTUVESUFfUkVDT1JERVJfRVZFTlRfSU5GTywgTUVESUFfUkVDT1JERVJfSU5GT19NQVhfRklMRVNJWkVfUkVBQ0hFRCwgMCk7CisgICAgICAgICAgICBBTE9HVygiZXN0aW1hdGVkIHNpemUoJSIgUFJJZDY0ICIpIGV4Y2VlZHMgbGltaXQgKCUiIFBSSWQ2NCAiKSIsCisgICAgICAgICAgICAgICAgICBtRXN0aW1hdGVkU2l6ZUJ5dGVzLCBtTWF4RmlsZVNpemVMaW1pdEJ5dGVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBpc0NvZGVjU3BlY2lmaWM7CisgICAgICAgIGlmICgoYnVmZmVyLT5tZXRhX2RhdGEoKS5maW5kSW50MzIoa0tleUlzQ29kZWNDb25maWcsICZpc0NvZGVjU3BlY2lmaWMpCisgICAgICAgICAgICAgJiYgaXNDb2RlY1NwZWNpZmljKQorICAgICAgICAgICAgfHwgSXNPcHVzSGVhZGVyKCh1aW50OF90KilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJEcm9wIGNvZGVjIHNwZWNpZmljIGluZm8gYnVmZmVyIik7CisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXM7CisgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCkuZmluZEludDY0KGtLZXlUaW1lLCAmdGltZXN0YW1wVXMpKTsKKyAgICAgICAgaWYgKHRpbWVzdGFtcFVzID4gbUVzdGltYXRlZER1cmF0aW9uVXMpIHsKKyAgICAgICAgICAgIG1Fc3RpbWF0ZWREdXJhdGlvblVzID0gdGltZXN0YW1wVXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1SZXN1bWVkKSB7CisgICAgICAgICAgICBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMgKz0gKHRpbWVzdGFtcFVzIC0gbWF4VGltZXN0YW1wVXMgLSAyMDAwMCk7CisgICAgICAgICAgICBtUmVzdW1lZCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdGltZXN0YW1wVXMgLT0gcHJldmlvdXNQYXVzZWREdXJhdGlvblVzOworCisgICAgICAgIEFMT0dWKCJ0aW1lIHN0YW1wOiAlIiBQUklkNjQgIiwgcHJldmlvdXMgcGF1c2VkIGR1cmF0aW9uOiAlIiBQUklkNjQsIHRpbWVzdGFtcFVzLAorICAgICAgICAgICAgICBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMpOworICAgICAgICBpZiAodGltZXN0YW1wVXMgPiBtYXhUaW1lc3RhbXBVcykgeworICAgICAgICAgICAgbWF4VGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChleGNlZWRzRmlsZUR1cmF0aW9uTGltaXQoKSkgeworICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBidWZmZXIgPSBudWxscHRyOworICAgICAgICAgICAgbm90aWZ5KE1FRElBX1JFQ09SREVSX0VWRU5UX0lORk8sIE1FRElBX1JFQ09SREVSX0lORk9fTUFYX0RVUkFUSU9OX1JFQUNIRUQsIDApOworICAgICAgICAgICAgQUxPR1coImVzdGltYXRlZCBkdXJhdGlvbiglIiBQUklkNjQgIiB1cykgZXhjZWVkcyBsaW1pdCglIiBQUklkNjQgIiB1cykiLAorICAgICAgICAgICAgICAgICAgbUVzdGltYXRlZER1cmF0aW9uVXMsIG1NYXhGaWxlRHVyYXRpb25MaW1pdFVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgb2dnX3BhY2tldCBvcDsKKyAgICAgICAgb2dnX3BhZ2Ugb2c7CisgICAgICAgIG9wLnBhY2tldCA9ICh1aW50OF90KilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CisgICAgICAgIG9wLmJ5dGVzID0gKGxvbmcpYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgb3AuYl9vX3MgPSAwOworICAgICAgICBvcC5lX29fcyA9IG1SZWFjaGVkRU9TID8gMSA6IDA7CisgICAgICAgIC8vIGdyYW51bGVwb3MgaXMgdGhlIHRvdGFsIG51bWJlciBvZiBQQ00gYXVkaW8gc2FtcGxlcyBAIDQ4IGtIeiwgdXAgdG8gYW5kCisgICAgICAgIC8vIGluY2x1ZGluZyB0aGUgY3VycmVudCBwYWNrZXQuCisgICAgICAgIG9nZ19pbnQ2NF90IGdyYW51bGVwb3MgPSAoNDgwMDAgKiBtRXN0aW1hdGVkRHVyYXRpb25VcykgLyAxMDAwMDAwOworICAgICAgICBvcC5ncmFudWxlcG9zID0gZ3JhbnVsZXBvczsKKworICAgICAgICAvLyBIZWFkZXJzIGFyZSBhdCBwYWNrZXRzIDAgYW5kIDEuCisgICAgICAgIG9wLnBhY2tldG5vID0gMiArIChvZ2dfaW50MzJfdCltQ3VycmVudFBhY2tldElkKys7CisgICAgICAgIG9nZ19zdHJlYW1fcGFja2V0aW4oKG9nZ19zdHJlYW1fc3RhdGUqKW1PcywgJm9wKTsKKyAgICAgICAgc2l6ZV90IG4gPSAwOworCisgICAgICAgIHdoaWxlIChvZ2dfc3RyZWFtX2ZsdXNoKChvZ2dfc3RyZWFtX3N0YXRlKiltT3MsICZvZykgPiAwKSB7CisgICAgICAgICAgICB3cml0ZShtRmQsIG9nLmhlYWRlciwgb2cuaGVhZGVyX2xlbik7CisgICAgICAgICAgICB3cml0ZShtRmQsIG9nLmJvZHksIG9nLmJvZHlfbGVuKTsKKyAgICAgICAgICAgIG4gPSBuICsgb2cuaGVhZGVyX2xlbiArIG9nLmJvZHlfbGVuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG4gPCBidWZmZXItPnJhbmdlX2xlbmd0aCgpKSB7CisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICBlcnIgPSBFUlJPUl9JTzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzdG9wcGVkUHJlbWF0dXJlbHkgPSBmYWxzZTsKKworICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgYnVmZmVyID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICAvLyBlbmQgb2Ygc3RyZWFtIGlzIGFuIG9rIHRoaW5nCisgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGVyciA9IE9LOworICAgIH0KKworICAgIGlmIChlcnIgPT0gT0sgJiYgc3RvcHBlZFByZW1hdHVyZWx5KSB7CisgICAgICAgIGVyciA9IEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBjbG9zZShtRmQpOworICAgIG1GZCA9IC0xOworICAgIG1SZWFjaGVkRU9TID0gdHJ1ZTsKKworICAgIHJldHVybiBlcnI7Cit9CisKK2Jvb2wgT2dnV3JpdGVyOjpyZWFjaGVkRU9TKCkgeworICAgIHJldHVybiBtUmVhY2hlZEVPUzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmNwcAppbmRleCA5NmI4OTZiLi44OTEwNDYzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuY3BwCkBAIC0yMSw4ICsyMSw4IEBACiAjZGVmaW5lIE9NWF9BTkRST0lEX0NPTVBJTEVfQVNfMzJCSVRfT05fNjRCSVRfUExBVEZPUk1TCiAjZW5kaWYKIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuaD4KQEAgLTUzLDE4ICs1MywxMyBAQAogbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8gewogCiBib29sIGhhc1ByZWZpeChjb25zdCBoaWRsX3N0cmluZyYgcywgY29uc3QgY2hhciogcHJlZml4KSB7Ci0gICAgcmV0dXJuIHN0cm5jbXAocy5jX3N0cigpLCBwcmVmaXgsIHN0cmxlbihwcmVmaXgpKSA9PSAwOworICAgIHJldHVybiBzdHJuY2FzZWNtcChzLmNfc3RyKCksIHByZWZpeCwgc3RybGVuKHByZWZpeCkpID09IDA7CiB9CiAKIHN0YXR1c190IHF1ZXJ5Q2FwYWJpbGl0aWVzKAotICAgICAgICBjb25zdCBJT214U3RvcmU6Ok5vZGVJbmZvJiBub2RlLCBjb25zdCBjaGFyKiBtaW1lLCBib29sIGlzRW5jb2RlciwKKyAgICAgICAgY29uc3QgSU9teFN0b3JlOjpOb2RlSW5mbyYgbm9kZSwgY29uc3QgY2hhciogbWVkaWFUeXBlLCBib29sIGlzRW5jb2RlciwKICAgICAgICAgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlciogY2FwcykgewogICAgIHNwPEFDb2RlYz4gY29kZWMgPSBuZXcgQUNvZGVjKCk7Ci0gICAgc3RhdHVzX3QgZXJyID0gY29kZWMtPnF1ZXJ5Q2FwYWJpbGl0aWVzKAotICAgICAgICAgICAgbm9kZS5vd25lci5jX3N0cigpLCBub2RlLm5hbWUuY19zdHIoKSwgbWltZSwgaXNFbmNvZGVyLCBjYXBzKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQogICAgIGZvciAoY29uc3QgYXV0byYgYXR0cmlidXRlIDogbm9kZS5hdHRyaWJ1dGVzKSB7CiAgICAgICAgIC8vIEFsbCBmZWF0dXJlcyBoYXZlIGFuIGludDMyIHZhbHVlIGV4Y2VwdAogICAgICAgICAvLyAiZmVhdHVyZS1iaXRyYXRlLW1vZGVzIiwgd2hpY2ggaGFzIGEgc3RyaW5nIHZhbHVlLgpAQCAtODEsMTIgKzc2LDE5IEBACiAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5rZXkuY19zdHIoKSwgYXR0cmlidXRlLnZhbHVlLmNfc3RyKCkpOwogICAgICAgICB9CiAgICAgfQorICAgIC8vIHF1ZXJ5IGNhcGFiaWxpdGllcyBtYXkgcmVtb3ZlIGNhcGFiaWxpdGllcyB0aGF0IGFyZSBub3QgYWN0dWFsbHkgc3VwcG9ydGVkIGJ5IHRoZSBjb2RlYworICAgIHN0YXR1c190IGVyciA9IGNvZGVjLT5xdWVyeUNhcGFiaWxpdGllcygKKyAgICAgICAgICAgIG5vZGUub3duZXIuY19zdHIoKSwgbm9kZS5uYW1lLmNfc3RyKCksIG1lZGlhVHlwZSwgaXNFbmNvZGVyLCBjYXBzKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQogICAgIHJldHVybiBPSzsKIH0KIAogfSAgLy8gdW5uYW1lZCBuYW1lc3BhY2UKIAotT214SW5mb0J1aWxkZXI6Ok9teEluZm9CdWlsZGVyKCkgeworT214SW5mb0J1aWxkZXI6Ok9teEluZm9CdWlsZGVyKGJvb2wgYWxsb3dTdXJmYWNlRW5jb2RlcnMpCisgICAgOiBtQWxsb3dTdXJmYWNlRW5jb2RlcnMoYWxsb3dTdXJmYWNlRW5jb2RlcnMpIHsKIH0KIAogc3RhdHVzX3QgT214SW5mb0J1aWxkZXI6OmJ1aWxkTWVkaWFDb2RlY0xpc3QoTWVkaWFDb2RlY0xpc3RXcml0ZXIqIHdyaXRlcikgewpAQCAtMTM0LDEwNyArMTM2LDg3IEBACiAgICAgLy8gQ29udmVydCByb2xlcyB0byBsaXN0cyBvZiBjb2RlY3MKIAogICAgIC8vIGNvZGVjIG5hbWUgLT4gaW5kZXggaW50byBzd0NvZGVjcy9od0NvZGVjcwotICAgIHN0ZDo6bWFwPGhpZGxfc3RyaW5nLCBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+PgotICAgICAgICAgICAgc3dDb2RlY05hbWUySW5mbywgaHdDb2RlY05hbWUySW5mbzsKKyAgICBzdGQ6Om1hcDxoaWRsX3N0cmluZywgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvV3JpdGVyPj4gY29kZWNOYW1lMkluZm87CiAKLSAgICBjaGFyIHJhbmtbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICB1aW50MzJfdCBkZWZhdWx0UmFuayA9IDB4MTAwOwotICAgIGlmIChwcm9wZXJ0eV9nZXQoImRlYnVnLnN0YWdlZnJpZ2h0Lm9teF9kZWZhdWx0X3JhbmsiLCByYW5rLCBudWxscHRyKSkgewotICAgICAgICBkZWZhdWx0UmFuayA9IHN0ZDo6c3RydG91bChyYW5rLCBudWxscHRyLCAxMCk7Ci0gICAgfQorICAgIHVpbnQzMl90IGRlZmF1bHRSYW5rID0KKyAgICAgICAgOjphbmRyb2lkOjpiYXNlOjpHZXRVaW50UHJvcGVydHkoImRlYnVnLnN0YWdlZnJpZ2h0Lm9teF9kZWZhdWx0X3JhbmsiLCAweDEwMHUpOworICAgIHVpbnQzMl90IGRlZmF1bHRTd0F1ZGlvUmFuayA9CisgICAgICAgIDo6YW5kcm9pZDo6YmFzZTo6R2V0VWludFByb3BlcnR5KCJkZWJ1Zy5zdGFnZWZyaWdodC5vbXhfZGVmYXVsdF9yYW5rLnN3LWF1ZGlvIiwgMHgxMHUpOworICAgIHVpbnQzMl90IGRlZmF1bHRTd090aGVyUmFuayA9CisgICAgICAgIDo6YW5kcm9pZDo6YmFzZTo6R2V0VWludFByb3BlcnR5KCJkZWJ1Zy5zdGFnZWZyaWdodC5vbXhfZGVmYXVsdF9yYW5rLnN3LW90aGVyIiwgMHgyMTB1KTsKKwogICAgIGZvciAoY29uc3QgSU9teFN0b3JlOjpSb2xlSW5mbyYgcm9sZSA6IHJvbGVzKSB7CiAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiB0eXBlTmFtZSA9IHJvbGUudHlwZTsKICAgICAgICAgYm9vbCBpc0VuY29kZXIgPSByb2xlLmlzRW5jb2RlcjsKLSAgICAgICAgYm9vbCBwcmVmZXJQbGF0Zm9ybU5vZGVzID0gcm9sZS5wcmVmZXJQbGF0Zm9ybU5vZGVzOwotICAgICAgICAvLyBJZiBwcmVmZXJQbGF0Zm9ybU5vZGVzIGlzIHRydWUsIGhhcmR3YXJlIG5vZGVzIG11c3QgYmUgYWRkZWQgYWZ0ZXIKLSAgICAgICAgLy8gcGxhdGZvcm0gKHNvZnR3YXJlKSBub2Rlcy4gaHdDb2RlY3MgaXMgdXNlZCB0byBob2xkIGhhcmR3YXJlIG5vZGVzCi0gICAgICAgIC8vIHRoYXQgbmVlZCB0byBiZSBhZGRlZCBhZnRlciBzb2Z0d2FyZSBub2RlcyBmb3IgdGhlIHNhbWUgcm9sZS4KLSAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgSU9teFN0b3JlOjpOb2RlSW5mbyo+IGh3Q29kZWNzOwotICAgICAgICBmb3IgKGNvbnN0IElPbXhTdG9yZTo6Tm9kZUluZm8mIG5vZGUgOiByb2xlLm5vZGVzKSB7CisgICAgICAgIGJvb2wgaXNBdWRpbyA9IGhhc1ByZWZpeChyb2xlLnR5cGUsICJhdWRpby8iKTsKKyAgICAgICAgYm9vbCBpc1ZpZGVvT3JJbWFnZSA9IGhhc1ByZWZpeChyb2xlLnR5cGUsICJ2aWRlby8iKSB8fCBoYXNQcmVmaXgocm9sZS50eXBlLCAiaW1hZ2UvIik7CisKKyAgICAgICAgZm9yIChjb25zdCBJT214U3RvcmU6Ok5vZGVJbmZvICZub2RlIDogcm9sZS5ub2RlcykgewogICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5vZGVOYW1lID0gbm9kZS5uYW1lOworCisgICAgICAgICAgICAvLyBjdXJyZW50bHkgaW1hZ2UgYW5kIHZpZGVvIGVuY29kZXJzIHVzZSBzdXJmYWNlIGlucHV0CisgICAgICAgICAgICBpZiAoIW1BbGxvd1N1cmZhY2VFbmNvZGVycyAmJiBpc1ZpZGVvT3JJbWFnZSAmJiBpc0VuY29kZXIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiZGlzYWJsaW5nICVzIGZvciBtZWRpYSB0eXBlICVzIGJlY2F1c2Ugd2UgYXJlIG5vdCB1c2luZyBPTVggaW5wdXQgc3VyZmFjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBub2RlTmFtZS5jX3N0cigpLCByb2xlLnR5cGUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGJvb2wgaXNTb2Z0d2FyZSA9IGhhc1ByZWZpeChub2RlTmFtZSwgIk9NWC5nb29nbGUiKTsKLSAgICAgICAgICAgIE1lZGlhQ29kZWNJbmZvV3JpdGVyKiBpbmZvOwotICAgICAgICAgICAgaWYgKGlzU29mdHdhcmUpIHsKLSAgICAgICAgICAgICAgICBhdXRvIGMyaSA9IHN3Q29kZWNOYW1lMkluZm8uZmluZChub2RlTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGMyaSA9PSBzd0NvZGVjTmFtZTJJbmZvLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBNZWRpYUNvZGVjSW5mbyBmb3IgYSBuZXcgbm9kZS4KLSAgICAgICAgICAgICAgICAgICAgYzJpID0gc3dDb2RlY05hbWUySW5mby5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZU5hbWUsIHdyaXRlci0+YWRkTWVkaWFDb2RlY0luZm8oKSkpLmZpcnN0OwotICAgICAgICAgICAgICAgICAgICBpbmZvID0gYzJpLT5zZWNvbmQuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPnNldE5hbWUobm9kZU5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPnNldE93bmVyKG5vZGUub3duZXIuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPnNldEVuY29kZXIoaXNFbmNvZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0UmFuayhkZWZhdWx0UmFuayk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG5vZGUgaGFzIGJlZW4gc2VlbiBiZWZvcmUuIFNpbXBseSByZXRyaWV2ZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgTWVkaWFDb2RlY0luZm9Xcml0ZXIuCi0gICAgICAgICAgICAgICAgICAgIGluZm8gPSBjMmktPnNlY29uZC5nZXQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGF1dG8gYzJpID0gaHdDb2RlY05hbWUySW5mby5maW5kKG5vZGVOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoYzJpID09IGh3Q29kZWNOYW1lMkluZm8uZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IE1lZGlhQ29kZWNJbmZvIGZvciBhIG5ldyBub2RlLgotICAgICAgICAgICAgICAgICAgICBpZiAoIXByZWZlclBsYXRmb3JtTm9kZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMyaSA9IGh3Q29kZWNOYW1lMkluZm8uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSwgd3JpdGVyLT5hZGRNZWRpYUNvZGVjSW5mbygpKSkuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gYzJpLT5zZWNvbmQuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXROYW1lKG5vZGVOYW1lLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0T3duZXIobm9kZS5vd25lci5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNldEVuY29kZXIoaXNFbmNvZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNldFJhbmsoZGVmYXVsdFJhbmspOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgcHJlZmVyUGxhdGZvcm1Ob2RlcyBpcyB0cnVlLCB0aGlzIG5vZGUgbXVzdCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkZWQgYWZ0ZXIgYWxsIHNvZnR3YXJlIG5vZGVzLgotICAgICAgICAgICAgICAgICAgICAgICAgaHdDb2RlY3MucHVzaF9iYWNrKCZub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgdWludDMyX3QgcmFuayA9IGlzU29mdHdhcmUKKyAgICAgICAgICAgICAgICAgICAgPyAoaXNBdWRpbyA/IGRlZmF1bHRTd0F1ZGlvUmFuayA6IGRlZmF1bHRTd090aGVyUmFuaykKKyAgICAgICAgICAgICAgICAgICAgOiBkZWZhdWx0UmFuazsKKyAgICAgICAgICAgIC8vIGdldCByYW5rIGZyb20gSU9teFN0b3JlIHZpYSBhdHRyaWJ1dGUKKyAgICAgICAgICAgIGZvciAoY29uc3QgSU9teFN0b3JlOjpBdHRyaWJ1dGUmIGF0dHJpYnV0ZSA6IG5vZGUuYXR0cmlidXRlcykgeworICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUua2V5ID09ICJyYW5rIikgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBvbGRSYW5rID0gcmFuazsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBkdW1teTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNzY2FuZihhdHRyaWJ1dGUudmFsdWUuY19zdHIoKSwgIiV1JWMiLCAmcmFuaywgJmR1bW15KSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByYW5rID0gb2xkUmFuazsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBub2RlIGhhcyBiZWVuIHNlZW4gYmVmb3JlLiBTaW1wbHkgcmV0cmlldmUgdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIE1lZGlhQ29kZWNJbmZvV3JpdGVyLgotICAgICAgICAgICAgICAgICAgICBpbmZvID0gYzJpLT5zZWNvbmQuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTWVkaWFDb2RlY0luZm9Xcml0ZXIqIGluZm87CisgICAgICAgICAgICBhdXRvIGMyaSA9IGNvZGVjTmFtZTJJbmZvLmZpbmQobm9kZU5hbWUpOworICAgICAgICAgICAgaWYgKGMyaSA9PSBjb2RlY05hbWUySW5mby5lbmQoKSkgeworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBNZWRpYUNvZGVjSW5mbyBmb3IgYSBuZXcgbm9kZS4KKyAgICAgICAgICAgICAgICBjMmkgPSBjb2RlY05hbWUySW5mby5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSwgd3JpdGVyLT5hZGRNZWRpYUNvZGVjSW5mbygpKSkuZmlyc3Q7CisgICAgICAgICAgICAgICAgaW5mbyA9IGMyaS0+c2Vjb25kLmdldCgpOworICAgICAgICAgICAgICAgIGluZm8tPnNldE5hbWUobm9kZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgaW5mby0+c2V0T3duZXIobm9kZS5vd25lci5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBpbmZvLT5zZXRSYW5rKHJhbmspOworCisgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8TWVkaWFDb2RlY0luZm86OkF0dHJpYnV0ZXM+Ojp0eXBlIGF0dHJzID0gMDsKKyAgICAgICAgICAgICAgICAvLyBhbGwgT01YIGNvZGVjcyBhcmUgdmVuZG9yIGNvZGVjcyAoaW4gdGhlIHZlbmRvciBwYXJ0aXRpb24pLCBidXQKKyAgICAgICAgICAgICAgICAvLyB0cmVhdCBPTVguZ29vZ2xlIGNvZGVjcyBhcyBub24taGFyZHdhcmUtYWNjZWxlcmF0ZWQgYW5kIG5vbi12ZW5kb3IKKyAgICAgICAgICAgICAgICBpZiAoIWlzU29mdHdhcmUpIHsKKyAgICAgICAgICAgICAgICAgICAgYXR0cnMgfD0gTWVkaWFDb2RlY0luZm86OmtGbGFnSXNWZW5kb3I7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdGQ6OmNvdW50X2lmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuYXR0cmlidXRlcy5iZWdpbigpLCBub2RlLmF0dHJpYnV0ZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10oY29uc3QgSU9teFN0b3JlOjpBdHRyaWJ1dGUgJmkpIC0+IGJvb2wgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaS5rZXkgPT0gImF0dHJpYnV0ZTo6c29mdHdhcmUtY29kZWMiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdHRycyB8PSBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc0hhcmR3YXJlQWNjZWxlcmF0ZWQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGlzRW5jb2RlcikgeworICAgICAgICAgICAgICAgICAgICBhdHRycyB8PSBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc0VuY29kZXI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluZm8tPnNldEF0dHJpYnV0ZXMoYXR0cnMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgbm9kZSBoYXMgYmVlbiBzZWVuIGJlZm9yZS4gU2ltcGx5IHJldHJpZXZlIHRoZQorICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIE1lZGlhQ29kZWNJbmZvV3JpdGVyLgorICAgICAgICAgICAgICAgIGluZm8gPSBjMmktPnNlY29uZC5nZXQoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyPiBjYXBzID0KLSAgICAgICAgICAgICAgICAgICAgaW5mby0+YWRkTWltZSh0eXBlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+YWRkTWVkaWFUeXBlKHR5cGVOYW1lLmNfc3RyKCkpOwogICAgICAgICAgICAgaWYgKHF1ZXJ5Q2FwYWJpbGl0aWVzKAogICAgICAgICAgICAgICAgICAgICBub2RlLCB0eXBlTmFtZS5jX3N0cigpLCBpc0VuY29kZXIsIGNhcHMuZ2V0KCkpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIkZhaWwgdG8gYWRkIG1pbWUgJXMgdG8gY29kZWMgJXMiLAorICAgICAgICAgICAgICAgIEFMT0dXKCJGYWlsIHRvIGFkZCBtZWRpYSB0eXBlICVzIHRvIGNvZGVjICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVOYW1lLmNfc3RyKCksIG5vZGVOYW1lLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIGluZm8tPnJlbW92ZU1pbWUodHlwZU5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiBwcmVmZXJQbGF0Zm9ybU5vZGVzIGlzIHRydWUsIGhhcmR3YXJlIG5vZGVzIHdpbGwgbm90IGhhdmUgYmVlbgotICAgICAgICAvLyBhZGRlZCBpbiB0aGUgbG9vcCBhYm92ZSwgYnV0IHJhdGhlciBzYXZlZCBpbiBod0NvZGVjcy4gVGhleSBhcmUKLSAgICAgICAgLy8gZ29pbmcgdG8gYmUgYWRkZWQgaGVyZS4KLSAgICAgICAgaWYgKHByZWZlclBsYXRmb3JtTm9kZXMpIHsKLSAgICAgICAgICAgIGZvciAoY29uc3QgSU9teFN0b3JlOjpOb2RlSW5mbyAqbm9kZSA6IGh3Q29kZWNzKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFDb2RlY0luZm9Xcml0ZXIqIGluZm87Ci0gICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5vZGVOYW1lID0gbm9kZS0+bmFtZTsKLSAgICAgICAgICAgICAgICBhdXRvIGMyaSA9IGh3Q29kZWNOYW1lMkluZm8uZmluZChub2RlTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGMyaSA9PSBod0NvZGVjTmFtZTJJbmZvLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBNZWRpYUNvZGVjSW5mbyBmb3IgYSBuZXcgbm9kZS4KLSAgICAgICAgICAgICAgICAgICAgYzJpID0gaHdDb2RlY05hbWUySW5mby5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZU5hbWUsIHdyaXRlci0+YWRkTWVkaWFDb2RlY0luZm8oKSkpLmZpcnN0OwotICAgICAgICAgICAgICAgICAgICBpbmZvID0gYzJpLT5zZWNvbmQuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPnNldE5hbWUobm9kZU5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPnNldE93bmVyKG5vZGUtPm93bmVyLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXRFbmNvZGVyKGlzRW5jb2Rlcik7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPnNldFJhbmsoZGVmYXVsdFJhbmspOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBub2RlIGhhcyBiZWVuIHNlZW4gYmVmb3JlLiBTaW1wbHkgcmV0cmlldmUgdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIE1lZGlhQ29kZWNJbmZvV3JpdGVyLgotICAgICAgICAgICAgICAgICAgICBpbmZvID0gYzJpLT5zZWNvbmQuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyPiBjYXBzID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmFkZE1pbWUodHlwZU5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHF1ZXJ5Q2FwYWJpbGl0aWVzKAotICAgICAgICAgICAgICAgICAgICAgICAgKm5vZGUsIHR5cGVOYW1lLmNfc3RyKCksIGlzRW5jb2RlciwgY2Fwcy5nZXQoKSkgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coIkZhaWwgdG8gYWRkIG1pbWUgJXMgdG8gY29kZWMgJXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiYWZ0ZXIgc29mdHdhcmUgY29kZWNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZU5hbWUuY19zdHIoKSwgbm9kZU5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPnJlbW92ZU1pbWUodHlwZU5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGluZm8tPnJlbW92ZU1lZGlhVHlwZSh0eXBlTmFtZS5jX3N0cigpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTI0Miw0ICsyMjQsMyBAQAogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5jcHAKaW5kZXggOWQyYzQyYi4uMjljM2EzNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmNwcApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBMT0dfVEFHICJSZW1vdGVNZWRpYUV4dHJhY3RvciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KQEAgLTQ5LDcgKzUwLDEyIEBACiAKICAgICBtQW5hbHl0aWNzSXRlbSA9IG51bGxwdHI7CiAgICAgaWYgKE1FRElBX0xPRykgewotICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa0tleUV4dHJhY3Rvcik7CisgICAgICAgIG1BbmFseXRpY3NJdGVtID0gTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoa0tleUV4dHJhY3Rvcik7CisKKyAgICAgICAgLy8gd2UncmUgaW4gdGhlIGV4dHJhY3RvciBzZXJ2aWNlLCB3ZSB3YW50IHRvIGF0dHJpYnV0ZSB0byB0aGUgYXBwCisgICAgICAgIC8vIHRoYXQgaW52b2tlZCB1cy4KKyAgICAgICAgaW50IHVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldFVpZCh1aWQpOwogCiAgICAgICAgIC8vIHRyYWNrIHRoZSBjb250YWluZXIgZm9ybWF0IChtcGVnLCBhYWMsIHd2bSwgZXRjKQogICAgICAgICBzaXplX3QgbnRyYWNrcyA9IGV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmNwcAppbmRleCBkMDdhZmVjLi5kYjMxYWYyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuY3BwCkBAIC0yNSwyNSArMjUsMjkgQEAKICAgICAgICAgTWVkaWFUcmFjayAqc291cmNlLAogICAgICAgICBjb25zdCBzcDxSZWZCYXNlPiAmcGx1Z2luKQogICAgIDogbUV4dHJhY3RvcihleHRyYWN0b3IpLAotICAgICAgbVNvdXJjZShzb3VyY2UpLAorICAgICAgbVRyYWNrKHNvdXJjZSksCiAgICAgICBtRXh0cmFjdG9yUGx1Z2luKHBsdWdpbikge30KIAogUmVtb3RlTWVkaWFTb3VyY2U6On5SZW1vdGVNZWRpYVNvdXJjZSgpIHsKLSAgICBkZWxldGUgbVNvdXJjZTsKKyAgICBkZWxldGUgbVRyYWNrOwogICAgIG1FeHRyYWN0b3JQbHVnaW4gPSBudWxscHRyOwogfQogCiBzdGF0dXNfdCBSZW1vdGVNZWRpYVNvdXJjZTo6c3RhcnQoTWV0YURhdGEgKnBhcmFtcykgewotICAgIHJldHVybiBtU291cmNlLT5zdGFydChwYXJhbXMpOworICAgIGlmIChwYXJhbXMpIHsKKyAgICAgICAgQUxPR1coImRyb3BwaW5nIHN0YXJ0IHBhcmFtZXRlcnM6Iik7CisgICAgICAgIHBhcmFtcy0+ZHVtcFRvTG9nKCk7CisgICAgfQorICAgIHJldHVybiBtVHJhY2stPnN0YXJ0KCk7CiB9CiAKIHN0YXR1c190IFJlbW90ZU1lZGlhU291cmNlOjpzdG9wKCkgewotICAgIHJldHVybiBtU291cmNlLT5zdG9wKCk7CisgICAgcmV0dXJuIG1UcmFjay0+c3RvcCgpOwogfQogCiBzcDxNZXRhRGF0YT4gUmVtb3RlTWVkaWFTb3VyY2U6OmdldEZvcm1hdCgpIHsKICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YSgpOwotICAgIGlmIChtU291cmNlLT5nZXRGb3JtYXQoKm1ldGEuZ2V0KCkpID09IE9LKSB7CisgICAgaWYgKG1UcmFjay0+Z2V0Rm9ybWF0KCptZXRhLmdldCgpKSA9PSBPSykgewogICAgICAgICByZXR1cm4gbWV0YTsKICAgICB9CiAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC01MSw3ICs1NSwxMSBAQAogCiBzdGF0dXNfdCBSZW1vdGVNZWRpYVNvdXJjZTo6cmVhZCgKICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKLSAgICByZXR1cm4gbVNvdXJjZS0+cmVhZChidWZmZXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zKj4ob3B0aW9ucykpOworICAgIHJldHVybiBtVHJhY2stPnJlYWQoYnVmZmVyLCByZWludGVycHJldF9jYXN0PGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyo+KG9wdGlvbnMpKTsKK30KKworYm9vbCBSZW1vdGVNZWRpYVNvdXJjZTo6c3VwcG9ydE5vbmJsb2NraW5nUmVhZCgpIHsKKyAgICByZXR1cm4gbVRyYWNrLT5zdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCk7CiB9CiAKIHN0YXR1c190IFJlbW90ZU1lZGlhU291cmNlOjpwYXVzZSgpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NpbXBsZURlY29kaW5nU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NpbXBsZURlY29kaW5nU291cmNlLmNwcAppbmRleCA0MDRjNTM3Li5iYWJkYzdhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TaW1wbGVEZWNvZGluZ1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuY3BwCkBAIC0zNyw2ICszNyw3IEBACiAKIGNvbnN0IGludDY0X3Qga1RpbWVvdXRXYWl0Rm9yT3V0cHV0VXMgPSA1MDAwMDA7IC8vIDAuNSBzZWNvbmRzCiBjb25zdCBpbnQ2NF90IGtUaW1lb3V0V2FpdEZvcklucHV0VXMgPSA1MDAwOyAvLyA1IG1pbGxpc2Vjb25kcworY29uc3QgaW50IGtUaW1lb3V0TWF4UmV0cmllcyA9IDIwOwogCiAvL3N0YXRpYwogc3A8U2ltcGxlRGVjb2RpbmdTb3VyY2U+IFNpbXBsZURlY29kaW5nU291cmNlOjpDcmVhdGUoCkBAIC0yNDIsNyArMjQzLDcgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgfQogCi0gICAgZm9yIChpbnQgcmV0cmllcyA9IDA7ICsrcmV0cmllczsgKSB7CisgICAgZm9yIChpbnQgcmV0cmllcyA9IDA7IHJldHJpZXMgPCBrVGltZW91dE1heFJldHJpZXM7ICsrcmV0cmllcykgewogICAgICAgICAvLyBJZiB3ZSBmaWxsIGFsbCBhdmFpbGFibGUgaW5wdXQgYnVmZmVycywgd2Ugc2hvdWxkIGV4cGVjdCB0aGF0CiAgICAgICAgIC8vIHRoZSBjb2RlYyBwcm9kdWNlcyBhdCBsZWFzdCBvbmUgb3V0cHV0IGJ1ZmZlci4gQWxzbywgdGhlIGNvZGVjCiAgICAgICAgIC8vIHNob3VsZCBwcm9kdWNlIGFuIG91dHB1dCBidWZmZXIgaW4gYXQgbW9zdCAxIHNlY29uZHMuIFJldHJ5IGEKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcAppbmRleCBlMDEwYjNlLi5jZjRlZGFlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxmY250bC5oPgogCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuaD4KIAogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CkBAIC0zNCwyNSArMzUsMTYgQEAKIAogU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXI6On5TdGFnZWZyaWdodE1lZGlhU2Nhbm5lcigpIHt9CiAKLXN0YXRpYyBib29sIEZpbGVIYXNBY2NlcHRhYmxlRXh0ZW5zaW9uKGNvbnN0IGNoYXIgKmV4dGVuc2lvbikgewotICAgIHN0YXRpYyBjb25zdCBjaGFyICprVmFsaWRFeHRlbnNpb25zW10gPSB7Ci0gICAgICAgICIubXAzIiwgIi5tcDQiLCAiLm00YSIsICIuM2dwIiwgIi4zZ3BwIiwgIi4zZzIiLCAiLjNncHAyIiwKLSAgICAgICAgIi5tcGVnIiwgIi5vZ2ciLCAiLm1pZCIsICIuc21mIiwgIi5pbXkiLCAiLndtYSIsICIuYWFjIiwKLSAgICAgICAgIi53YXYiLCAiLmFtciIsICIubWlkaSIsICIueG1mIiwgIi5ydHR0bCIsICIucnR4IiwgIi5vdGEiLAotICAgICAgICAiLm1rdiIsICIubWthIiwgIi53ZWJtIiwgIi50cyIsICIuZmwiLCAiLmZsYWMiLCAiLm14bWYiLAotICAgICAgICAiLmF2aSIsICIubXBlZyIsICIubXBnIiwgIi5hd2IiLCAiLm1wZ2EiLCAiLm1vdiIsCi0gICAgICAgICIubTR2IiwgIi5vZ2EiCi0gICAgfTsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1WYWxpZEV4dGVuc2lvbnMgPQotICAgICAgICBzaXplb2Yoa1ZhbGlkRXh0ZW5zaW9ucykgLyBzaXplb2Yoa1ZhbGlkRXh0ZW5zaW9uc1swXSk7CitzdGF0aWMgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBnU3VwcG9ydGVkRXh0ZW5zaW9uczsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bVZhbGlkRXh0ZW5zaW9uczsgKytpKSB7Ci0gICAgICAgIGlmICghc3RyY2FzZWNtcChleHRlbnNpb24sIGtWYWxpZEV4dGVuc2lvbnNbaV0pKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQorc3RhdGljIGJvb2wgRmlsZUhhc0FjY2VwdGFibGVFeHRlbnNpb24oY29uc3QgY2hhciAqZXh0ZW5zaW9uKSB7CisKKyAgICBpZiAoZ1N1cHBvcnRlZEV4dGVuc2lvbnMuZW1wdHkoKSkgeworICAgICAgICAvLyBnZXQgdGhlIGxpc3QgZnJvbSB0aGUgc2VydmljZQorICAgICAgICBnU3VwcG9ydGVkRXh0ZW5zaW9ucyA9IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Z2V0U3VwcG9ydGVkVHlwZXMoKTsKICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuICBnU3VwcG9ydGVkRXh0ZW5zaW9ucy5jb3VudChzdGQ6OnN0cmluZyhleHRlbnNpb24gKyAxKSkgIT0gMDsKIH0KIAogTWVkaWFTY2FuUmVzdWx0IFN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyOjpwcm9jZXNzRmlsZSgKQEAgLTEzMiw2ICsxMjQsMTEgQEAKICAgICAgICAgeyAiZGF0ZSIsIE1FVEFEQVRBX0tFWV9EQVRFIH0sCiAgICAgICAgIHsgIndpZHRoIiwgTUVUQURBVEFfS0VZX1ZJREVPX1dJRFRIIH0sCiAgICAgICAgIHsgImhlaWdodCIsIE1FVEFEQVRBX0tFWV9WSURFT19IRUlHSFQgfSwKKyAgICAgICAgeyAiY29sb3JzdGFuZGFyZCIsIE1FVEFEQVRBX0tFWV9DT0xPUl9TVEFOREFSRCB9LAorICAgICAgICB7ICJjb2xvcnRyYW5zZmVyIiwgTUVUQURBVEFfS0VZX0NPTE9SX1RSQU5TRkVSIH0sCisgICAgICAgIHsgImNvbG9ycmFuZ2UiLCBNRVRBREFUQV9LRVlfQ09MT1JfUkFOR0UgfSwKKyAgICAgICAgeyAic2FtcGxlcmF0ZSIsIE1FVEFEQVRBX0tFWV9TQU1QTEVSQVRFIH0sCisgICAgICAgIHsgImJpdHNwZXJzYW1wbGUiLCBNRVRBREFUQV9LRVlfQklUU19QRVJfU0FNUExFIH0sCiAgICAgfTsKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1FbnRyaWVzID0gc2l6ZW9mKGtLZXlNYXApIC8gc2l6ZW9mKGtLZXlNYXBbMF0pOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCmluZGV4IGU4MGVjM2IuLmZhM2QzNzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKICNpbmNsdWRlICJpbmNsdWRlL0ZyYW1lRGVjb2Rlci5oIgogI2luY2x1ZGUgImluY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oIgpAQCAtMzIsOCArMzMsMTAgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0xNjIsNiArMTY1LDkgQEAKIAogICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtRXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKGkpOworICAgICAgICBpZiAoIW1ldGEpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAgICAgICAgIEFMT0dWKCJnZXR0aW5nIHRyYWNrICV6dSBvZiAlenUsIG1ldGE9JXMiLCBpLCBuLCBtZXRhLT50b1N0cmluZygpLmNfc3RyKCkpOwogCiAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CkBAIC0xODMsNiArMTg5LDkgQEAKICAgICB9CiAKICAgICBzcDxNZXRhRGF0YT4gdHJhY2tNZXRhID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YShpKTsKKyAgICBpZiAoIXRyYWNrTWV0YSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiAKICAgICBpZiAobWV0YU9ubHkpIHsKICAgICAgICAgcmV0dXJuIEZyYW1lRGVjb2Rlcjo6Z2V0TWV0YWRhdGFPbmx5KHRyYWNrTWV0YSwgY29sb3JGb3JtYXQsIHRodW1ibmFpbCk7CkBAIC0yMDQsMTEgKzIxMywxNCBAQAogICAgICAgICB0cmFja01ldGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBtaW1lKTsKICAgICB9CiAKKyAgICBib29sIHByZWZlcmh3ID0gcHJvcGVydHlfZ2V0X2Jvb2woCisgICAgICAgICAgICAibWVkaWEuc3RhZ2VmcmlnaHQudGh1bWJuYWlsLnByZWZlcl9od19jb2RlY3MiLCBmYWxzZSk7CisgICAgdWludDMyX3QgZmxhZ3MgPSBwcmVmZXJodyA/IDAgOiBNZWRpYUNvZGVjTGlzdDo6a1ByZWZlclNvZnR3YXJlQ29kZWNzOwogICAgIFZlY3RvcjxBU3RyaW5nPiBtYXRjaGluZ0NvZGVjczsKICAgICBNZWRpYUNvZGVjTGlzdDo6ZmluZE1hdGNoaW5nQ29kZWNzKAogICAgICAgICAgICAgbWltZSwKICAgICAgICAgICAgIGZhbHNlLCAvKiBlbmNvZGVyICovCi0gICAgICAgICAgICBNZWRpYUNvZGVjTGlzdDo6a1ByZWZlclNvZnR3YXJlQ29kZWNzLAorICAgICAgICAgICAgZmxhZ3MsCiAgICAgICAgICAgICAmbWF0Y2hpbmdDb2RlY3MpOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXRjaGluZ0NvZGVjcy5zaXplKCk7ICsraSkgewpAQCAtMjcwLDE2ICsyODIsMTMgQEAKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogCi0gICAgaW50MzJfdCBkcm0gPSAwOwotICAgIGlmIChmaWxlTWV0YS0+ZmluZEludDMyKGtLZXlJc0RSTSwgJmRybSkgJiYgZHJtICE9IDApIHsKLSAgICAgICAgQUxPR0UoImZyYW1lIGdyYWIgbm90IGFsbG93ZWQuIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fVU5LTk9XTjsKLSAgICB9Ci0KICAgICBzaXplX3QgbiA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CiAgICAgc2l6ZV90IGk7CiAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoaSk7CisgICAgICAgIGlmICghbWV0YSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAogICAgICAgICBjb25zdCBjaGFyICptaW1lOwogICAgICAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CkBAIC0yOTYsNiArMzA1LDkgQEAKIAogICAgIHNwPE1ldGFEYXRhPiB0cmFja01ldGEgPSBtRXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKAogICAgICAgICAgICAgaSwgTWVkaWFFeHRyYWN0b3I6OmtJbmNsdWRlRXh0ZW5zaXZlTWV0YURhdGEpOworICAgIGlmICghdHJhY2tNZXRhKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KIAogICAgIGlmIChtZXRhT25seSkgewogICAgICAgICBpZiAob3V0RnJhbWUgIT0gTlVMTCkgewpAQCAtMzI1LDI0ICszMzcsMjcgQEAKICAgICBjb25zdCBjaGFyICptaW1lOwogICAgIENIRUNLKHRyYWNrTWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwogCisgICAgYm9vbCBwcmVmZXJodyA9IHByb3BlcnR5X2dldF9ib29sKAorICAgICAgICAgICAgIm1lZGlhLnN0YWdlZnJpZ2h0LnRodW1ibmFpbC5wcmVmZXJfaHdfY29kZWNzIiwgZmFsc2UpOworICAgIHVpbnQzMl90IGZsYWdzID0gcHJlZmVyaHcgPyAwIDogTWVkaWFDb2RlY0xpc3Q6OmtQcmVmZXJTb2Z0d2FyZUNvZGVjczsKICAgICBWZWN0b3I8QVN0cmluZz4gbWF0Y2hpbmdDb2RlY3M7CiAgICAgTWVkaWFDb2RlY0xpc3Q6OmZpbmRNYXRjaGluZ0NvZGVjcygKICAgICAgICAgICAgIG1pbWUsCiAgICAgICAgICAgICBmYWxzZSwgLyogZW5jb2RlciAqLwotICAgICAgICAgICAgTWVkaWFDb2RlY0xpc3Q6OmtQcmVmZXJTb2Z0d2FyZUNvZGVjcywKKyAgICAgICAgICAgIGZsYWdzLAogICAgICAgICAgICAgJm1hdGNoaW5nQ29kZWNzKTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0Y2hpbmdDb2RlY3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgY29uc3QgQVN0cmluZyAmY29tcG9uZW50TmFtZSA9IG1hdGNoaW5nQ29kZWNzW2ldOwotICAgICAgICBWaWRlb0ZyYW1lRGVjb2RlciBkZWNvZGVyKGNvbXBvbmVudE5hbWUsIHRyYWNrTWV0YSwgc291cmNlKTsKLSAgICAgICAgaWYgKGRlY29kZXIuaW5pdCh0aW1lVXMsIG51bUZyYW1lcywgb3B0aW9uLCBjb2xvckZvcm1hdCkgPT0gT0spIHsKKyAgICAgICAgc3A8VmlkZW9GcmFtZURlY29kZXI+IGRlY29kZXIgPSBuZXcgVmlkZW9GcmFtZURlY29kZXIoY29tcG9uZW50TmFtZSwgdHJhY2tNZXRhLCBzb3VyY2UpOworICAgICAgICBpZiAoZGVjb2Rlci0+aW5pdCh0aW1lVXMsIG51bUZyYW1lcywgb3B0aW9uLCBjb2xvckZvcm1hdCkgPT0gT0spIHsKICAgICAgICAgICAgIGlmIChvdXRGcmFtZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgKm91dEZyYW1lID0gZGVjb2Rlci5leHRyYWN0RnJhbWUoKTsKKyAgICAgICAgICAgICAgICAqb3V0RnJhbWUgPSBkZWNvZGVyLT5leHRyYWN0RnJhbWUoKTsKICAgICAgICAgICAgICAgICBpZiAoKm91dEZyYW1lICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSBpZiAob3V0RnJhbWVzICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBkZWNvZGVyLmV4dHJhY3RGcmFtZXMob3V0RnJhbWVzKTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBkZWNvZGVyLT5leHRyYWN0RnJhbWVzKG91dEZyYW1lcyk7CiAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgICAgICAgICAgfQpAQCAtMzk1LDYgKzQxMCwyNSBAQAogICAgIHJldHVybiBtTWV0YURhdGEudmFsdWVBdChpbmRleCkuc3RyaW5nKCk7CiB9CiAKK3ZvaWQgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjo6cGFyc2VDb2xvckFzcGVjdHMoY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKSB7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOworICAgIGlmIChjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UobWV0YSwgJmZvcm1hdCkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDMyX3Qgc3RhbmRhcmQsIHRyYW5zZmVyLCByYW5nZTsKKyAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXN0YW5kYXJkIiwgJnN0YW5kYXJkKQorICAgICAgICAgICAgJiYgZm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXRyYW5zZmVyIiwgJnRyYW5zZmVyKQorICAgICAgICAgICAgJiYgZm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXJhbmdlIiwgJnJhbmdlKSkgeworICAgICAgICBBTE9HVigiZm91bmQgY29sb3IgYXNwZWN0cyA6IHN0YW5kYXJkPSVkLCB0cmFuc2Zlcj0lZCwgcmFuZ2U9JWQiLAorICAgICAgICAgICAgICAgIHN0YW5kYXJkLCB0cmFuc2ZlciwgcmFuZ2UpOworCisgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX0NPTE9SX1NUQU5EQVJELCBTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgc3RhbmRhcmQpKTsKKyAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfQ09MT1JfVFJBTlNGRVIsIFN0cmluZzg6OmZvcm1hdCgiJWQiLCB0cmFuc2ZlcikpOworICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9DT0xPUl9SQU5HRSwgU3RyaW5nODo6Zm9ybWF0KCIlZCIsIHJhbmdlKSk7CisgICAgfQorfQorCiB2b2lkIFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXI6OnBhcnNlTWV0YURhdGEoKSB7CiAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtRXh0cmFjdG9yLT5nZXRNZXRhRGF0YSgpOwogCkBAIC01MDcsNiArNTQxLDkgQEAKICAgICBTdHJpbmc4IHRpbWVkVGV4dExhbmc7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1UcmFja3M7ICsraSkgewogICAgICAgICBzcDxNZXRhRGF0YT4gdHJhY2tNZXRhID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YShpKTsKKyAgICAgICAgaWYgKCF0cmFja01ldGEpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOwogICAgICAgICBpZiAodHJhY2tNZXRhLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpIHsKQEAgLTUyMyw2ICs1NjAsMTkgQEAKICAgICAgICAgICAgICAgICBpZiAoIXRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmYXVkaW9CaXRyYXRlKSkgewogICAgICAgICAgICAgICAgICAgICBhdWRpb0JpdHJhdGUgPSAtMTsKICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpbnQzMl90IGJpdHNQZXJTYW1wbGUgPSAtMTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGUgPSAtMTsKKyAgICAgICAgICAgICAgICB0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5Qml0c1BlclNhbXBsZSwgJmJpdHNQZXJTYW1wbGUpOworICAgICAgICAgICAgICAgIHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgaWYgKGJpdHNQZXJTYW1wbGUgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiVkIiwgYml0c1BlclNhbXBsZSk7CisgICAgICAgICAgICAgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX0JJVFNfUEVSX1NBTVBMRSwgU3RyaW5nOCh0bXApKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNhbXBsZVJhdGUgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiVkIiwgc2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX1NBTVBMRVJBVEUsIFN0cmluZzgodG1wKSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmICghaGFzVmlkZW8gJiYgIXN0cm5jYXNlY21wKCJ2aWRlby8iLCBtaW1lLCA2KSkgewogICAgICAgICAgICAgICAgIGhhc1ZpZGVvID0gdHJ1ZTsKIApAQCAtNTM0LDYgKzU4NCw4IEBACiAgICAgICAgICAgICAgICAgaWYgKCF0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5RnJhbWVDb3VudCwgJnZpZGVvRnJhbWVDb3VudCkpIHsKICAgICAgICAgICAgICAgICAgICAgdmlkZW9GcmFtZUNvdW50ID0gMDsKICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwYXJzZUNvbG9yQXNwZWN0cyh0cmFja01ldGEpOwogICAgICAgICAgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAoImltYWdlLyIsIG1pbWUsIDYpKSB7CiAgICAgICAgICAgICAgICAgaW50MzJfdCBpc1ByaW1hcnk7CiAgICAgICAgICAgICAgICAgaWYgKHRyYWNrTWV0YS0+ZmluZEludDMyKApAQCAtNjMwLDggKzY4Miw5IEBACiAgICAgICAgICAgICAgICAgIXN0cmNhc2VjbXAoZmlsZU1JTUUsICJ2aWRlby94LW1hdHJvc2thIikpIHsKICAgICAgICAgICAgIHNwPE1ldGFEYXRhPiB0cmFja01ldGEgPSBtRXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKDApOwogICAgICAgICAgICAgY29uc3QgY2hhciAqdHJhY2tNSU1FOwotICAgICAgICAgICAgQ0hFQ0sodHJhY2tNZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZ0cmFja01JTUUpKTsKLQorICAgICAgICAgICAgaWYgKHRyYWNrTWV0YSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0sodHJhY2tNZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZ0cmFja01JTUUpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghc3RybmNhc2VjbXAoImF1ZGlvLyIsIHRyYWNrTUlNRSwgNikpIHsKICAgICAgICAgICAgICAgICAvLyBUaGUgbWF0cm9za2EgZmlsZSBvbmx5IGNvbnRhaW5zIGEgc2luZ2xlIGF1ZGlvIHRyYWNrLAogICAgICAgICAgICAgICAgIC8vIHJld3JpdGUgaXRzIG1pbWUgdHlwZS4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmNwcAppbmRleCA1MTllODcwLi5mYjAzYzVlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodFBsdWdpbkxvYWRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuY3BwCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIExPR19UQUcgIlN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxkbGZjbi5oPgogCiAjaW5jbHVkZSAiU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuaCIKQEAgLTI3LDkgKzI4LDE3IEBACiAvKiBzdGF0aWMgKi8gTXV0ZXggU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXI6OnNNdXRleDsKIC8qIHN0YXRpYyAqLyBzdGQ6OnVuaXF1ZV9wdHI8U3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXI+IFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyOjpzSW5zdGFuY2U7CiAKLVN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyOjpTdGFnZWZyaWdodFBsdWdpbkxvYWRlcihjb25zdCBjaGFyICpsaWJQYXRoKQotICAgIDogbUNyZWF0ZUNvZGVjKG51bGxwdHIpLAotICAgICAgbUNyZWF0ZUJ1aWxkZXIobnVsbHB0cikgeworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCitjb25zdGV4cHIgY29uc3QgY2hhciBrQ0NvZGVjUGx1Z2luUGF0aFtdID0gImxpYnNmcGx1Z2luX2Njb2RlYy5zbyI7CisKK30gIC8vIHVubmFtZWQgbmFtZXNwYWNlCisKK1N0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyOjpTdGFnZWZyaWdodFBsdWdpbkxvYWRlcihjb25zdCBjaGFyICpsaWJQYXRoKSB7CisgICAgaWYgKGFuZHJvaWQ6OmJhc2U6OkdldEludFByb3BlcnR5KCJkZWJ1Zy5zdGFnZWZyaWdodC5jY29kZWMiLCAxKSA9PSAwKSB7CisgICAgICAgIEFMT0dEKCJDQ29kZWMgaXMgZGlzYWJsZWQuIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgbUxpYkhhbmRsZSA9IGRsb3BlbihsaWJQYXRoLCBSVExEX05PVyB8IFJUTERfTk9ERUxFVEUpOwogICAgIGlmIChtTGliSGFuZGxlID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0QoIkZhaWxlZCB0byBsb2FkIGxpYnJhcnk6ICVzICglcykiLCBsaWJQYXRoLCBkbGVycm9yKCkpOwpAQCAtNDYsNyArNTUsNyBAQAogICAgIH0KICAgICBtQ3JlYXRlSW5wdXRTdXJmYWNlID0gKENvZGVjQmFzZTo6Q3JlYXRlSW5wdXRTdXJmYWNlRnVuYylkbHN5bSgKICAgICAgICAgICAgIG1MaWJIYW5kbGUsICJDcmVhdGVJbnB1dFN1cmZhY2UiKTsKLSAgICBpZiAobUNyZWF0ZUJ1aWxkZXIgPT0gbnVsbHB0cikgeworICAgIGlmIChtQ3JlYXRlSW5wdXRTdXJmYWNlID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0QoIkZhaWxlZCB0byBmaW5kIHN5bWJvbDogQ3JlYXRlSW5wdXRTdXJmYWNlICglcykiLCBkbGVycm9yKCkpOwogICAgIH0KIH0KQEAgLTg3LDcgKzk2LDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2woc011dGV4KTsKICAgICBpZiAoIXNJbnN0YW5jZSkgewogICAgICAgICBBTE9HVigiTG9hZGluZyBsaWJyYXJ5Iik7Ci0gICAgICAgIHNJbnN0YW5jZS5yZXNldChuZXcgU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIoImxpYnN0YWdlZnJpZ2h0X2Njb2RlYy5zbyIpKTsKKyAgICAgICAgc0luc3RhbmNlLnJlc2V0KG5ldyBTdGFnZWZyaWdodFBsdWdpbkxvYWRlcihrQ0NvZGVjUGx1Z2luUGF0aCkpOwogICAgIH0KICAgICByZXR1cm4gc0luc3RhbmNlOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmgKaW5kZXggOTk5ZDMwYy4uNzhlZmZiZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodFBsdWdpbkxvYWRlci5oCkBAIC00MCwxMCArNDAsMTAgQEAKICAgICBzdGF0aWMgTXV0ZXggc011dGV4OwogICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8U3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXI+IHNJbnN0YW5jZTsKIAotICAgIHZvaWQgKm1MaWJIYW5kbGU7Ci0gICAgQ29kZWNCYXNlOjpDcmVhdGVDb2RlY0Z1bmMgbUNyZWF0ZUNvZGVjOwotICAgIE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2U6OkNyZWF0ZUJ1aWxkZXJGdW5jIG1DcmVhdGVCdWlsZGVyOwotICAgIENvZGVjQmFzZTo6Q3JlYXRlSW5wdXRTdXJmYWNlRnVuYyBtQ3JlYXRlSW5wdXRTdXJmYWNlOworICAgIHZvaWQgKm1MaWJIYW5kbGV7bnVsbHB0cn07CisgICAgQ29kZWNCYXNlOjpDcmVhdGVDb2RlY0Z1bmMgbUNyZWF0ZUNvZGVje251bGxwdHJ9OworICAgIE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2U6OkNyZWF0ZUJ1aWxkZXJGdW5jIG1DcmVhdGVCdWlsZGVye251bGxwdHJ9OworICAgIENvZGVjQmFzZTo6Q3JlYXRlSW5wdXRTdXJmYWNlRnVuYyBtQ3JlYXRlSW5wdXRTdXJmYWNle251bGxwdHJ9OwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuY3BwCmluZGV4IDllMTFhOTQuLjRjOTRiYWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmNwcApAQCAtMTgsMTAgKzE4LDEzIEBACiAjZGVmaW5lIExPR19UQUcgIlN1cmZhY2VVdGlscyIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQvYXBpLWxldmVsLmg+CiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogCitleHRlcm4gIkMiIGludCBhbmRyb2lkX2dldF9hcHBsaWNhdGlvbl90YXJnZXRfc2RrX3ZlcnNpb24oKTsKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdGF0dXNfdCBzZXROYXRpdmVXaW5kb3dTaXplRm9ybWF0QW5kVXNhZ2UoCkBAIC0yOTEsNSArMjk0LDI4IEBACiAKICAgICByZXR1cm4gZXJyOwogfQorCitzdGF0dXNfdCBkaXNhYmxlTGVnYWN5QnVmZmVyRHJvcFBvc3RRKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSB7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gaWdicCA9CisgICAgICAgICAgICBzdXJmYWNlID8gc3VyZmFjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpIDogbnVsbHB0cjsKKyAgICBpZiAoaWdicCkgeworICAgICAgICBpbnQgdGFyZ2V0U2RrID0gYW5kcm9pZF9nZXRfYXBwbGljYXRpb25fdGFyZ2V0X3Nka192ZXJzaW9uKCk7CisgICAgICAgIC8vIFdoZW4gdGhlIGNhbGxlciBpcyBub3QgYW4gYXBwIChlLmcuIE1lZGlhUGxheWVyIGluIG1lZGlhc2VydmVyKQorICAgICAgICAvLyB0YXJnZXRTZGsgaXMgX19BTkRST0lEX0FQSV9GVVRVUkVfXy4KKyAgICAgICAgYm9vbCBkcm9wID0KKyAgICAgICAgICAgICAgICB0YXJnZXRTZGsgPCBfX0FORFJPSURfQVBJX1FfXyB8fAorICAgICAgICAgICAgICAgIHRhcmdldFNkayA9PSBfX0FORFJPSURfQVBJX0ZVVFVSRV9fOworICAgICAgICBpZiAoIWRyb3ApIHsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGlnYnAtPnNldExlZ2FjeUJ1ZmZlckRyb3AoZmFsc2UpOworICAgICAgICAgICAgaWYgKGVyciA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dEKCJsZWdhY3kgYnVmZmVyIGRyb3AgZGlzYWJsZWQ6IHRhcmdldCBzZGsgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0U2RrKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImRpc2FibGluZyBsZWdhY3kgYnVmZmVyIGRyb3AgZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVEVTVF9NQVBQSU5HIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVEVTVF9NQVBQSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ODE4ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9URVNUX01BUFBJTkcKQEAgLTAsMCArMSwxMiBAQAoreworICAicG9zdHN1Ym1pdCI6IFsKKyAgICB7CisgICAgICAibmFtZSI6ICJDdHNNZWRpYVRlc3RDYXNlcyIsCisgICAgICAib3B0aW9ucyI6IFsKKyAgICAgICAgeworICAgICAgICAgICJpbmNsdWRlLWFubm90YXRpb24iOiAiYW5kcm9pZC5wbGF0Zm9ybS50ZXN0LmFubm90YXRpb25zLlJlcXVpcmVzRGV2aWNlIgorICAgICAgICB9CisgICAgICBdCisgICAgfQorICBdCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9UaHJvdHRsZWRTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVGhyb3R0bGVkU291cmNlLmNwcAppbmRleCA3NDk2NzUyLi40OWNlYTllIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9UaHJvdHRsZWRTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1Rocm90dGxlZFNvdXJjZS5jcHAKQEAgLTUxLDcgKzUxLDcgQEAKICAgICAvLyBIb3cgbG9uZyB3b3VsZCBpdCBoYXZlIHRha2VuIHRvIHRyYW5zZmVyIGV2ZXJ5dGhpbmcgd2UgZXZlcgogICAgIC8vIHRyYW5zZmVycmVkIGdpdmVuIHRoZSBsaW1pdGVkIGJhbmR3aWR0aC4KICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPQotICAgICAgICBtVG90YWxUcmFuc2ZlcnJlZCAqIDEwMDAwMDBsbCAvIG1CYW5kd2lkdGhMaW1pdEJ5dGVzUGVyU2Vjb25kOworICAgICAgICBtVG90YWxUcmFuc2ZlcnJlZCAqIDEwMDAwMDBMTCAvIG1CYW5kd2lkdGhMaW1pdEJ5dGVzUGVyU2Vjb25kOwogCiAgICAgaW50NjRfdCB3aGVuVXMgPSBtU3RhcnRUaW1lVXMgKyBkdXJhdGlvblVzOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKaW5kZXggY2Y1ZTkxZS4uMTM1MTUxZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcApAQCAtMzcsNyArMzcsOSBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb2t1cC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaD4KQEAgLTc0LDcgKzc2LDcgQEAKIH0KICNlbmRpZgogCi1zdGF0aWMgdm9pZCBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2VDb2xvckFzcGVjdHMoY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhLCBzcDxBTWVzc2FnZT4gJm1zZykgeworc3RhdGljIHZvaWQgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlQ29sb3JBc3BlY3RzKGNvbnN0IE1ldGFEYXRhQmFzZSAqbWV0YSwgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKICAgICAvLyAwIHZhbHVlcyBhcmUgdW5zcGVjaWZpZWQKICAgICBpbnQzMl90IHJhbmdlID0gMDsKICAgICBpbnQzMl90IHByaW1hcmllcyA9IDA7CkBAIC0xMTksNyArMTIxLDggQEAKICAgICB9CiAKICAgICAvLyBpZiB1c2VyL2NvbnRhaW5lciBzdXBwbGllZCBIRFIgc3RhdGljIGluZm8gd2l0aG91dCB0cmFuc2ZlciBzZXQsIGFzc3VtZSB0cnVlCi0gICAgaWYgKGZvcm1hdC0+Y29udGFpbnMoImhkci1zdGF0aWMtaW5mbyIpICYmICFmb3JtYXQtPmNvbnRhaW5zKCJjb2xvci10cmFuc2ZlciIpKSB7CisgICAgaWYgKChmb3JtYXQtPmNvbnRhaW5zKCJoZHItc3RhdGljLWluZm8iKSB8fCBmb3JtYXQtPmNvbnRhaW5zKCJoZHIxMC1wbHVzLWluZm8iKSkKKyAgICAgICAgICAgICYmICFmb3JtYXQtPmNvbnRhaW5zKCJjb2xvci10cmFuc2ZlciIpKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICAvLyBvdGhlcndpc2UsIHZlcmlmeSB0aGF0IGFuIEhEUiB0cmFuc2ZlciBmdW5jdGlvbiBpcyBzZXQKQEAgLTE5MCw2ICsxOTMsOSBAQAogICAgICAgICB7IDUwLCBPTVhfVklERU9fQVZDTGV2ZWw1ICB9LAogICAgICAgICB7IDUxLCBPTVhfVklERU9fQVZDTGV2ZWw1MSB9LAogICAgICAgICB7IDUyLCBPTVhfVklERU9fQVZDTGV2ZWw1MiB9LAorICAgICAgICB7IDYwLCBPTVhfVklERU9fQVZDTGV2ZWw2ICB9LAorICAgICAgICB7IDYxLCBPTVhfVklERU9fQVZDTGV2ZWw2MSB9LAorICAgICAgICB7IDYyLCBPTVhfVklERU9fQVZDTGV2ZWw2MiB9LAogICAgIH07CiAgICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDhfdCwgT01YX1ZJREVPX0FWQ1BST0ZJTEVUWVBFPiBwcm9maWxlcyB7CiAgICAgICAgIHsgNjYsIE9NWF9WSURFT19BVkNQcm9maWxlQmFzZWxpbmUgfSwKQEAgLTU2OCw4ICs1NzQsMjU0IEBACiAgICAgfQogfQogCitzdGF0aWMgdm9pZCBwYXJzZUFWMVByb2ZpbGVMZXZlbEZyb21Dc2QoY29uc3Qgc3A8QUJ1ZmZlcj4gJmNzZCwgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKKyAgICAvLyBQYXJzZSBDU0Qgc3RydWN0dXJlIHRvIGV4dHJhY3QgcHJvZmlsZSBsZXZlbCBpbmZvcm1hdGlvbgorICAgIC8vIGh0dHBzOi8vYW9tZWRpYWNvZGVjLmdpdGh1Yi5pby9hdjEtaXNvYm1mZi8jYXYxY29kZWNjb25maWd1cmF0aW9uYm94CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IGNzZC0+ZGF0YSgpOworICAgIHNpemVfdCByZW1haW5pbmcgPSBjc2QtPnNpemUoKTsKKyAgICBpZiAocmVtYWluaW5nIDwgNCB8fCBkYXRhWzBdICE9IDB4ODEpIHsgIC8vIGNvbmZpZ3VyYXRpb25WZXJzaW9uID09IDEKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB1aW50OF90IHByb2ZpbGVEYXRhID0gKGRhdGFbMV0gJiAweEUwKSA+PiA1OworICAgIHVpbnQ4X3QgbGV2ZWxEYXRhID0gZGF0YVsxXSAmIDB4MUY7CisgICAgdWludDhfdCBoaWdoQml0RGVwdGggPSAoZGF0YVsyXSAmIDB4NDApID4+IDY7CisKKyAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDxzdGQ6OnBhaXI8dWludDhfdCwgdWludDhfdD4sIGludDMyX3Q+IHByb2ZpbGVzIHsKKyAgICAgICAgeyB7IDAsIDAgfSwgQVYxUHJvZmlsZU1haW44IH0sCisgICAgICAgIHsgeyAxLCAwIH0sIEFWMVByb2ZpbGVNYWluMTAgfSwKKyAgICB9OworCisgICAgaW50MzJfdCBwcm9maWxlOworICAgIGlmIChwcm9maWxlcy5tYXAoc3RkOjptYWtlX3BhaXIoaGlnaEJpdERlcHRoLCBwcm9maWxlRGF0YSksICZwcm9maWxlKSkgeworICAgICAgICAvLyBidW1wIHRvIEhEUiBwcm9maWxlCisgICAgICAgIGlmIChpc0hkcihmb3JtYXQpICYmIHByb2ZpbGUgPT0gQVYxUHJvZmlsZU1haW4xMCkgeworICAgICAgICAgICAgaWYgKGZvcm1hdC0+Y29udGFpbnMoImhkcjEwLXBsdXMtaW5mbyIpKSB7CisgICAgICAgICAgICAgICAgcHJvZmlsZSA9IEFWMVByb2ZpbGVNYWluMTBIRFIxMFBsdXM7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByb2ZpbGUgPSBBVjFQcm9maWxlTWFpbjEwSERSMTA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigicHJvZmlsZSIsIHByb2ZpbGUpOworICAgIH0KKyAgICBjb25zdCBzdGF0aWMgQUxvb2t1cDx1aW50OF90LCBpbnQzMl90PiBsZXZlbHMgeworICAgICAgICB7IDAsIEFWMUxldmVsMiAgIH0sCisgICAgICAgIHsgMSwgQVYxTGV2ZWwyMSAgfSwKKyAgICAgICAgeyAyLCBBVjFMZXZlbDIyICB9LAorICAgICAgICB7IDMsIEFWMUxldmVsMjMgIH0sCisgICAgICAgIHsgNCwgQVYxTGV2ZWwzICAgfSwKKyAgICAgICAgeyA1LCBBVjFMZXZlbDMxICB9LAorICAgICAgICB7IDYsIEFWMUxldmVsMzIgIH0sCisgICAgICAgIHsgNywgQVYxTGV2ZWwzMyAgfSwKKyAgICAgICAgeyA4LCBBVjFMZXZlbDQgICB9LAorICAgICAgICB7IDksIEFWMUxldmVsNDEgIH0sCisgICAgICAgIHsgMTAsIEFWMUxldmVsNDIgIH0sCisgICAgICAgIHsgMTEsIEFWMUxldmVsNDMgIH0sCisgICAgICAgIHsgMTIsIEFWMUxldmVsNSAgIH0sCisgICAgICAgIHsgMTMsIEFWMUxldmVsNTEgIH0sCisgICAgICAgIHsgMTQsIEFWMUxldmVsNTIgIH0sCisgICAgICAgIHsgMTUsIEFWMUxldmVsNTMgIH0sCisgICAgICAgIHsgMTYsIEFWMUxldmVsNiAgIH0sCisgICAgICAgIHsgMTcsIEFWMUxldmVsNjEgIH0sCisgICAgICAgIHsgMTgsIEFWMUxldmVsNjIgIH0sCisgICAgICAgIHsgMTksIEFWMUxldmVsNjMgIH0sCisgICAgICAgIHsgMjAsIEFWMUxldmVsNyAgIH0sCisgICAgICAgIHsgMjEsIEFWMUxldmVsNzEgIH0sCisgICAgICAgIHsgMjIsIEFWMUxldmVsNzIgIH0sCisgICAgICAgIHsgMjMsIEFWMUxldmVsNzMgIH0sCisgICAgfTsKKworICAgIGludDMyX3QgbGV2ZWw7CisgICAgaWYgKGxldmVscy5tYXAobGV2ZWxEYXRhLCAmbGV2ZWwpKSB7CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImxldmVsIiwgbGV2ZWwpOworICAgIH0KK30KKworCitzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNvbnN0IGNoYXIgKiwgdWludDMyX3Q+PiBzdHJpbmdNYXBwaW5ncyB7CisgICAgeworICAgICAgICB7ICJhbGJ1bSIsIGtLZXlBbGJ1bSB9LAorICAgICAgICB7ICJhbGJ1bWFydGlzdCIsIGtLZXlBbGJ1bUFydGlzdCB9LAorICAgICAgICB7ICJhcnRpc3QiLCBrS2V5QXJ0aXN0IH0sCisgICAgICAgIHsgImF1dGhvciIsIGtLZXlBdXRob3IgfSwKKyAgICAgICAgeyAiY2R0cmFja251bSIsIGtLZXlDRFRyYWNrTnVtYmVyIH0sCisgICAgICAgIHsgImNvbXBpbGF0aW9uIiwga0tleUNvbXBpbGF0aW9uIH0sCisgICAgICAgIHsgImNvbXBvc2VyIiwga0tleUNvbXBvc2VyIH0sCisgICAgICAgIHsgImRhdGUiLCBrS2V5RGF0ZSB9LAorICAgICAgICB7ICJkaXNjbnVtIiwga0tleURpc2NOdW1iZXIgfSwKKyAgICAgICAgeyAiZ2VucmUiLCBrS2V5R2VucmUgfSwKKyAgICAgICAgeyAibG9jYXRpb24iLCBrS2V5TG9jYXRpb24gfSwKKyAgICAgICAgeyAibHlyaWNpc3QiLCBrS2V5V3JpdGVyIH0sCisgICAgICAgIHsgIm1hbnVmYWN0dXJlciIsIGtLZXlNYW51ZmFjdHVyZXIgfSwKKyAgICAgICAgeyAidGl0bGUiLCBrS2V5VGl0bGUgfSwKKyAgICAgICAgeyAieWVhciIsIGtLZXlZZWFyIH0sCisgICAgfQorfTsKKworc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxjb25zdCBjaGFyICosIHVpbnQzMl90Pj4gZmxvYXRNYXBwaW5ncyB7CisgICAgeworICAgICAgICB7ICJjYXB0dXJlLXJhdGUiLCBrS2V5Q2FwdHVyZUZyYW1lcmF0ZSB9LAorICAgIH0KK307CisKK3N0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgY2hhciAqLCB1aW50MzJfdD4+IGludDY0TWFwcGluZ3MgeworICAgIHsKKyAgICAgICAgeyAiZXhpZi1vZmZzZXQiLCBrS2V5RXhpZk9mZnNldCB9LAorICAgICAgICB7ICJleGlmLXNpemUiLCBrS2V5RXhpZlNpemUgfSwKKyAgICAgICAgeyAidGFyZ2V0LXRpbWUiLCBrS2V5VGFyZ2V0VGltZSB9LAorICAgICAgICB7ICJ0aHVtYm5haWwtdGltZSIsIGtLZXlUaHVtYm5haWxUaW1lIH0sCisgICAgICAgIHsgInRpbWVVcyIsIGtLZXlUaW1lIH0sCisgICAgICAgIHsgImR1cmF0aW9uVXMiLCBrS2V5RHVyYXRpb24gfSwKKyAgICB9Cit9OworCitzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNvbnN0IGNoYXIgKiwgdWludDMyX3Q+PiBpbnQzMk1hcHBpbmdzIHsKKyAgICB7CisgICAgICAgIHsgImxvb3AiLCBrS2V5QXV0b0xvb3AgfSwKKyAgICAgICAgeyAidGltZS1zY2FsZSIsIGtLZXlUaW1lU2NhbGUgfSwKKyAgICAgICAgeyAiY3J5cHRvLW1vZGUiLCBrS2V5Q3J5cHRvTW9kZSB9LAorICAgICAgICB7ICJjcnlwdG8tZGVmYXVsdC1pdi1zaXplIiwga0tleUNyeXB0b0RlZmF1bHRJVlNpemUgfSwKKyAgICAgICAgeyAiY3J5cHRvLWVuY3J5cHRlZC1ieXRlLWJsb2NrIiwga0tleUVuY3J5cHRlZEJ5dGVCbG9jayB9LAorICAgICAgICB7ICJjcnlwdG8tc2tpcC1ieXRlLWJsb2NrIiwga0tleVNraXBCeXRlQmxvY2sgfSwKKyAgICAgICAgeyAiZnJhbWUtY291bnQiLCBrS2V5RnJhbWVDb3VudCB9LAorICAgICAgICB7ICJtYXgtYml0cmF0ZSIsIGtLZXlNYXhCaXRSYXRlIH0sCisgICAgICAgIHsgInBjbS1iaWctZW5kaWFuIiwga0tleVBjbUJpZ0VuZGlhbiB9LAorICAgICAgICB7ICJ0ZW1wb3JhbC1sYXllci1jb3VudCIsIGtLZXlUZW1wb3JhbExheWVyQ291bnQgfSwKKyAgICAgICAgeyAidGVtcG9yYWwtbGF5ZXItaWQiLCBrS2V5VGVtcG9yYWxMYXllcklkIH0sCisgICAgICAgIHsgInRodW1ibmFpbC13aWR0aCIsIGtLZXlUaHVtYm5haWxXaWR0aCB9LAorICAgICAgICB7ICJ0aHVtYm5haWwtaGVpZ2h0Iiwga0tleVRodW1ibmFpbEhlaWdodCB9LAorICAgICAgICB7ICJ2YWxpZC1zYW1wbGVzIiwga0tleVZhbGlkU2FtcGxlcyB9LAorICAgIH0KK307CisKK3N0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgY2hhciAqLCB1aW50MzJfdD4+IGJ1ZmZlck1hcHBpbmdzIHsKKyAgICB7CisgICAgICAgIHsgImFsYnVtYXJ0Iiwga0tleUFsYnVtQXJ0IH0sCisgICAgICAgIHsgImF1ZGlvLXByZXNlbnRhdGlvbi1pbmZvIiwga0tleUF1ZGlvUHJlc2VudGF0aW9uSW5mbyB9LAorICAgICAgICB7ICJwc3NoIiwga0tleVBzc2ggfSwKKyAgICAgICAgeyAiY3J5cHRvLWl2Iiwga0tleUNyeXB0b0lWIH0sCisgICAgICAgIHsgImNyeXB0by1rZXkiLCBrS2V5Q3J5cHRvS2V5IH0sCisgICAgICAgIHsgImNyeXB0by1lbmNyeXB0ZWQtc2l6ZXMiLCBrS2V5RW5jcnlwdGVkU2l6ZXMgfSwKKyAgICAgICAgeyAiY3J5cHRvLXBsYWluLXNpemVzIiwga0tleVBsYWluU2l6ZXMgfSwKKyAgICAgICAgeyAiaWNjLXByb2ZpbGUiLCBrS2V5SWNjUHJvZmlsZSB9LAorICAgICAgICB7ICJzZWkiLCBrS2V5U0VJIH0sCisgICAgICAgIHsgInRleHQtZm9ybWF0LWRhdGEiLCBrS2V5VGV4dEZvcm1hdERhdGEgfSwKKyAgICAgICAgeyAidGh1bWJuYWlsLWNzZC1oZXZjIiwga0tleVRodW1ibmFpbEhWQ0MgfSwKKyAgICB9Cit9OworCitzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNvbnN0IGNoYXIgKiwgdWludDMyX3Q+PiBDU0RNYXBwaW5ncyB7CisgICAgeworICAgICAgICB7ICJjc2QtMCIsIGtLZXlPcGFxdWVDU0QwIH0sCisgICAgICAgIHsgImNzZC0xIiwga0tleU9wYXF1ZUNTRDEgfSwKKyAgICAgICAgeyAiY3NkLTIiLCBrS2V5T3BhcXVlQ1NEMiB9LAorICAgIH0KK307CisKK3ZvaWQgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhRnJvbU1hcHBpbmdzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBzcDxNZXRhRGF0YT4gJm1ldGEpIHsKKyAgICBmb3IgKGF1dG8gZWxlbSA6IHN0cmluZ01hcHBpbmdzKSB7CisgICAgICAgIEFTdHJpbmcgdmFsdWU7CisgICAgICAgIGlmIChtc2ctPmZpbmRTdHJpbmcoZWxlbS5maXJzdCwgJnZhbHVlKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0Q1N0cmluZyhlbGVtLnNlY29uZCwgdmFsdWUuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8gZWxlbSA6IGZsb2F0TWFwcGluZ3MpIHsKKyAgICAgICAgZmxvYXQgdmFsdWU7CisgICAgICAgIGlmIChtc2ctPmZpbmRGbG9hdChlbGVtLmZpcnN0LCAmdmFsdWUpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXRGbG9hdChlbGVtLnNlY29uZCwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBpbnQ2NE1hcHBpbmdzKSB7CisgICAgICAgIGludDY0X3QgdmFsdWU7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQ2NChlbGVtLmZpcnN0LCAmdmFsdWUpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXRJbnQ2NChlbGVtLnNlY29uZCwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBpbnQzMk1hcHBpbmdzKSB7CisgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMihlbGVtLmZpcnN0LCAmdmFsdWUpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihlbGVtLnNlY29uZCwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBidWZmZXJNYXBwaW5ncykgeworICAgICAgICBzcDxBQnVmZmVyPiB2YWx1ZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcihlbGVtLmZpcnN0LCAmdmFsdWUpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGVsZW0uc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUJhc2U6OlR5cGU6OlRZUEVfTk9ORSwgdmFsdWUtPmRhdGEoKSwgdmFsdWUtPnNpemUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8gZWxlbSA6IENTRE1hcHBpbmdzKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IHZhbHVlOworICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKGVsZW0uZmlyc3QsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoZWxlbS5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhQmFzZTo6VHlwZTo6VFlQRV9OT05FLCB2YWx1ZS0+ZGF0YSgpLCB2YWx1ZS0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2VGcm9tTWFwcGluZ3MoY29uc3QgTWV0YURhdGFCYXNlICptZXRhLCBzcDxBTWVzc2FnZT4gZm9ybWF0KSB7CisgICAgZm9yIChhdXRvIGVsZW0gOiBzdHJpbmdNYXBwaW5ncykgeworICAgICAgICBjb25zdCBjaGFyICp2YWx1ZTsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGVsZW0uc2Vjb25kLCAmdmFsdWUpKSB7CisgICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZyhlbGVtLmZpcnN0LCB2YWx1ZSwgc3RybGVuKHZhbHVlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8gZWxlbSA6IGZsb2F0TWFwcGluZ3MpIHsKKyAgICAgICAgZmxvYXQgdmFsdWU7CisgICAgICAgIGlmIChtZXRhLT5maW5kRmxvYXQoZWxlbS5zZWNvbmQsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0RmxvYXQoZWxlbS5maXJzdCwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBpbnQ2NE1hcHBpbmdzKSB7CisgICAgICAgIGludDY0X3QgdmFsdWU7CisgICAgICAgIGlmIChtZXRhLT5maW5kSW50NjQoZWxlbS5zZWNvbmQsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50NjQoZWxlbS5maXJzdCwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBpbnQzMk1hcHBpbmdzKSB7CisgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoZWxlbS5zZWNvbmQsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoZWxlbS5maXJzdCwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBidWZmZXJNYXBwaW5ncykgeworICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICBjb25zdCB2b2lkKiBkYXRhOworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmREYXRhKGVsZW0uc2Vjb25kLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KGRhdGEsIHNpemUpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRCdWZmZXIoZWxlbS5maXJzdCwgYnVmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byBlbGVtIDogQ1NETWFwcGluZ3MpIHsKKyAgICAgICAgdWludDMyX3QgdHlwZTsKKyAgICAgICAgY29uc3Qgdm9pZCogZGF0YTsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGlmIChtZXRhLT5maW5kRGF0YShlbGVtLnNlY29uZCwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZiA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weShkYXRhLCBzaXplKTsKKyAgICAgICAgICAgIGJ1Zi0+bWV0YSgpLT5zZXRJbnQzMigiY3NkIiwgdHJ1ZSk7CisgICAgICAgICAgICBidWYtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOworICAgICAgICAgICAgZm9ybWF0LT5zZXRCdWZmZXIoZWxlbS5maXJzdCwgYnVmKTsKKyAgICAgICAgfQorICAgIH0KK30KKwogc3RhdHVzX3QgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKAogICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsIHNwPEFNZXNzYWdlPiAqZm9ybWF0KSB7CisgICAgcmV0dXJuIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShtZXRhLmdldCgpLCBmb3JtYXQpOworfQorCitzdGF0dXNfdCBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UoCisgICAgICAgIGNvbnN0IE1ldGFEYXRhQmFzZSAqbWV0YSwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQpIHsKIAogICAgIGZvcm1hdC0+Y2xlYXIoKTsKIApAQCAtNTg2LDYgKzgzOCw4IEBACiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZTsKICAgICBtc2ctPnNldFN0cmluZygibWltZSIsIG1pbWUpOwogCisgICAgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlRnJvbU1hcHBpbmdzKG1ldGEsIG1zZyk7CisKICAgICB1aW50MzJfdCB0eXBlOwogICAgIGNvbnN0IHZvaWQgKmRhdGE7CiAgICAgc2l6ZV90IHNpemU7CkBAIC01OTksNiArODUzLDE2IEBACiAgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7CiAgICAgfQogCisgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlDQVByaXZhdGVEYXRhLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcihzaXplKTsKKyAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBOVUxMIHx8IGJ1ZmZlci0+YmFzZSgpID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKworICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY2EtcHJpdmF0ZS1kYXRhIiwgYnVmZmVyKTsKKyAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpLCBkYXRhLCBzaXplKTsKKyAgICB9CisKICAgICBpbnQzMl90IHN5c3RlbUlkOwogICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUNBU3lzdGVtSUQsICZzeXN0ZW1JZCkpIHsKICAgICAgICAgbXNnLT5zZXRJbnQzMigiY2Etc3lzdGVtLWlkIiwgc3lzdGVtSWQpOwpAQCAtNzEyLDYgKzk3NiwxNiBAQAogICAgICAgICAgICAgQ29sb3JVdGlsczo6c2V0SERSU3RhdGljSW5mb0ludG9Gb3JtYXQoKihIRFJTdGF0aWNJbmZvKilkYXRhLCBtc2cpOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlIZHIxMFBsdXNJbmZvLCAmdHlwZSwgJmRhdGEsICZzaXplKQorICAgICAgICAgICAgICAgICYmIHNpemUgPiAwKSB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcihzaXplKTsKKyAgICAgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCB8fCBidWZmZXItPmJhc2UoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICBtc2ctPnNldEJ1ZmZlcigiaGRyMTAtcGx1cy1pbmZvIiwgYnVmZmVyKTsKKyAgICAgICAgfQorCiAgICAgICAgIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZUNvbG9yQXNwZWN0cyhtZXRhLCBtc2cpOwogICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKCJhdWRpby8iLCBtaW1lLCA2KSkgewogICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlOwpAQCAtNzIzLDYgKzk5NywxMSBAQAogICAgICAgICBtc2ctPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgbnVtQ2hhbm5lbHMpOwogICAgICAgICBtc2ctPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIHNhbXBsZVJhdGUpOwogCisgICAgICAgIGludDMyX3QgYml0c1BlclNhbXBsZTsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Qml0c1BlclNhbXBsZSwgJmJpdHNQZXJTYW1wbGUpKSB7CisgICAgICAgICAgICBtc2ctPnNldEludDMyKCJiaXRzLXBlci1zYW1wbGUiLCBiaXRzUGVyU2FtcGxlKTsKKyAgICAgICAgfQorCiAgICAgICAgIGludDMyX3QgY2hhbm5lbE1hc2s7CiAgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxNYXNrLCAmY2hhbm5lbE1hc2spKSB7CiAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJjaGFubmVsLW1hc2siLCBjaGFubmVsTWFzayk7CkBAIC03NTEsNiArMTAzMCwxMSBAQAogICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlQY21FbmNvZGluZywgJnBjbUVuY29kaW5nKSkgewogICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigicGNtLWVuY29kaW5nIiwgcGNtRW5jb2RpbmcpOwogICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBoYXB0aWNDaGFubmVsQ291bnQ7CisgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUhhcHRpY0NoYW5uZWxDb3VudCwgJmhhcHRpY0NoYW5uZWxDb3VudCkpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImhhcHRpYy1jaGFubmVsLWNvdW50IiwgaGFwdGljQ2hhbm5lbENvdW50KTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGludDMyX3QgbWF4SW5wdXRTaXplOwpAQCAtODgwLDcgKzExNjQsOSBAQAogICAgIH0gZWxzZSBpZiAobWV0YS0+ZmluZERhdGEoa0tleUhWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IChjb25zdCB1aW50OF90ICopZGF0YTsKIAotICAgICAgICBpZiAoc2l6ZSA8IDIzIHx8IHB0clswXSAhPSAxKSB7ICAvLyBjb25maWd1cmF0aW9uVmVyc2lvbiA9PSAxCisgICAgICAgIGlmIChzaXplIDwgMjMgfHwgKHB0clswXSAhPSAxICYmIHB0clswXSAhPSAwKSkgeworICAgICAgICAgICAgLy8gY29uZmlndXJhdGlvblZlcnNpb24gPT0gMSBvciAwCisgICAgICAgICAgICAvLyAxIGlzIHdoYXQgdGhlIHN0YW5kYXJkIGRpY3RhdGVzLCBidXQgc29tZSBvbGQgbXV4ZXJzIG1heSBoYXZlIHVzZWQgMC4KICAgICAgICAgICAgIEFMT0dFKCJiLzIzNjgwNzgwIik7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CkBAIC05NTAsNyArMTIzNiw2OCBAQAogICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiYW5kcm9pZC5faXMtaGRyIiwgKGluZm8gJiBodmNjLmtJbmZvSXNIZHIpICE9IDApOwogICAgICAgICB9CiAKKyAgICAgICAgdWludDMyX3QgaXNvUHJpbWFyaWVzLCBpc29UcmFuc2ZlciwgaXNvTWF0cml4LCBpc29SYW5nZTsKKyAgICAgICAgaWYgKGh2Y2MuZmluZFBhcmFtMzIoa0NvbG91clByaW1hcmllcywgJmlzb1ByaW1hcmllcykKKyAgICAgICAgICAgICAgICAmJiBodmNjLmZpbmRQYXJhbTMyKGtUcmFuc2ZlckNoYXJhY3RlcmlzdGljcywgJmlzb1RyYW5zZmVyKQorICAgICAgICAgICAgICAgICYmIGh2Y2MuZmluZFBhcmFtMzIoa01hdHJpeENvZWZmcywgJmlzb01hdHJpeCkKKyAgICAgICAgICAgICAgICAmJiBodmNjLmZpbmRQYXJhbTMyKGtWaWRlb0Z1bGxSYW5nZUZsYWcsICZpc29SYW5nZSkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJmb3VuZCBpc28gY29sb3IgYXNwZWN0cyA6IHByaW1hcmlzPSVkLCB0cmFuc2Zlcj0lZCwgbWF0cml4PSVkLCByYW5nZT0lZCIsCisgICAgICAgICAgICAgICAgICAgIGlzb1ByaW1hcmllcywgaXNvVHJhbnNmZXIsIGlzb01hdHJpeCwgaXNvUmFuZ2UpOworCisgICAgICAgICAgICBDb2xvckFzcGVjdHMgYXNwZWN0czsKKyAgICAgICAgICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cygKKyAgICAgICAgICAgICAgICAgICAgaXNvUHJpbWFyaWVzLCBpc29UcmFuc2ZlciwgaXNvTWF0cml4LCBpc29SYW5nZSwgYXNwZWN0cyk7CisKKyAgICAgICAgICAgIGlmIChhc3BlY3RzLm1QcmltYXJpZXMgPT0gQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNVbnNwZWNpZmllZCkgeworICAgICAgICAgICAgICAgIGludDMyX3QgcHJpbWFyaWVzOworICAgICAgICAgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUNvbG9yUHJpbWFyaWVzLCAmcHJpbWFyaWVzKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigidW5zcGVjaWZpZWQgcHJpbWFyaWVzIGZvdW5kLCByZXBsYWNlZCB0byAlZCIsIHByaW1hcmllcyk7CisgICAgICAgICAgICAgICAgICAgIGFzcGVjdHMubVByaW1hcmllcyA9IHN0YXRpY19jYXN0PENvbG9yQXNwZWN0czo6UHJpbWFyaWVzPihwcmltYXJpZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhc3BlY3RzLm1UcmFuc2ZlciA9PSBDb2xvckFzcGVjdHM6OlRyYW5zZmVyVW5zcGVjaWZpZWQpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHRyYW5zZmVyRnVuY3Rpb247CisgICAgICAgICAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5VHJhbnNmZXJGdW5jdGlvbiwgJnRyYW5zZmVyRnVuY3Rpb24pKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJ1bnNwZWNpZmllZCB0cmFuc2ZlciBmb3VuZCwgcmVwbGFjZWQgdG8gJWQiLCB0cmFuc2ZlckZ1bmN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgYXNwZWN0cy5tVHJhbnNmZXIgPSBzdGF0aWNfY2FzdDxDb2xvckFzcGVjdHM6OlRyYW5zZmVyPih0cmFuc2ZlckZ1bmN0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYXNwZWN0cy5tTWF0cml4Q29lZmZzID09IENvbG9yQXNwZWN0czo6TWF0cml4VW5zcGVjaWZpZWQpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGNvbG9yTWF0cml4OworICAgICAgICAgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUNvbG9yTWF0cml4LCAmY29sb3JNYXRyaXgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJ1bnNwZWNpZmllZCBtYXRyaXggZm91bmQsIHJlcGxhY2VkIHRvICVkIiwgY29sb3JNYXRyaXgpOworICAgICAgICAgICAgICAgICAgICBhc3BlY3RzLm1NYXRyaXhDb2VmZnMgPSBzdGF0aWNfY2FzdDxDb2xvckFzcGVjdHM6Ok1hdHJpeENvZWZmcz4oY29sb3JNYXRyaXgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhc3BlY3RzLm1SYW5nZSA9PSBDb2xvckFzcGVjdHM6OlJhbmdlVW5zcGVjaWZpZWQpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHJhbmdlOworICAgICAgICAgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUNvbG9yUmFuZ2UsICZyYW5nZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoInVuc3BlY2lmaWVkIHJhbmdlIGZvdW5kLCByZXBsYWNlZCB0byAlZCIsIHJhbmdlKTsKKyAgICAgICAgICAgICAgICAgICAgYXNwZWN0cy5tUmFuZ2UgPSBzdGF0aWNfY2FzdDxDb2xvckFzcGVjdHM6OlJhbmdlPihyYW5nZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQzMl90IHN0YW5kYXJkLCB0cmFuc2ZlciwgcmFuZ2U7CisgICAgICAgICAgICBpZiAoQ29sb3JVdGlsczo6Y29udmVydENvZGVjQ29sb3JBc3BlY3RzVG9QbGF0Zm9ybUFzcGVjdHMoCisgICAgICAgICAgICAgICAgICAgIGFzcGVjdHMsICZyYW5nZSwgJnN0YW5kYXJkLCAmdHJhbnNmZXIpID09IE9LKSB7CisgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiY29sb3Itc3RhbmRhcmQiLCBzdGFuZGFyZCk7CisgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiY29sb3ItdHJhbnNmZXIiLCB0cmFuc2Zlcik7CisgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiY29sb3ItcmFuZ2UiLCByYW5nZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBwYXJzZUhldmNQcm9maWxlTGV2ZWxGcm9tSHZjYygoY29uc3QgdWludDhfdCAqKWRhdGEsIGRhdGFTaXplLCBtc2cpOworICAgIH0gZWxzZSBpZiAobWV0YS0+ZmluZERhdGEoa0tleUFWMUMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSBBQnVmZmVyKHNpemUpOworICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IE5VTEwgfHwgYnVmZmVyLT5iYXNlKCkgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGRhdGEsIHNpemUpOworCisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiY3NkIiwgdHJ1ZSk7CisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7CisgICAgICAgIG1zZy0+c2V0QnVmZmVyKCJjc2QtMCIsIGJ1ZmZlcik7CisgICAgICAgIHBhcnNlQVYxUHJvZmlsZUxldmVsRnJvbUNzZChidWZmZXIsIG1zZyk7CiAgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5RVNEUywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgRVNEUyBlc2RzKChjb25zdCBjaGFyICopZGF0YSwgc2l6ZSk7CiAgICAgICAgIGlmIChlc2RzLkluaXRDaGVjaygpICE9IChzdGF0dXNfdClPSykgewpAQCAtOTk4LDMzICsxMzQ1LDkgQEAKICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJtYXgtYml0cmF0ZSIsIChpbnQzMl90KW1heEJpdHJhdGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrVHlwZUQyNjMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5RDI2MywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgY29uc3QgdWludDhfdCAqcHRyID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOwogICAgICAgICBwYXJzZUgyNjNQcm9maWxlTGV2ZWxGcm9tRDI2MyhwdHIsIHNpemUsIG1zZyk7Ci0gICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5Vm9yYmlzSW5mbywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKLSAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIEFCdWZmZXIoc2l6ZSk7Ci0gICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCB8fCBidWZmZXItPmJhc2UoKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7Ci0KLSAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCB0cnVlKTsKLSAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKLSAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNzZC0wIiwgYnVmZmVyKTsKLQotICAgICAgICBpZiAoIW1ldGEtPmZpbmREYXRhKGtLZXlWb3JiaXNCb29rcywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIEFCdWZmZXIoc2l6ZSk7Ci0gICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCB8fCBidWZmZXItPmJhc2UoKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7Ci0KLSAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCB0cnVlKTsKLSAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKLSAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNzZC0xIiwgYnVmZmVyKTsKICAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlPcHVzSGVhZGVyLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewogICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcihzaXplKTsKICAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBOVUxMIHx8IGJ1ZmZlci0+YmFzZSgpID09IE5VTEwpIHsKQEAgLTEwNjMsMTYgKzEzODYsNiBAQAogICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImNzZCIsIHRydWUpOwogICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOwogICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY3NkLTIiLCBidWZmZXIpOwotICAgIH0gZWxzZSBpZiAobWV0YS0+ZmluZERhdGEoa0tleUZsYWNNZXRhZGF0YSwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKLSAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIEFCdWZmZXIoc2l6ZSk7Ci0gICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCB8fCBidWZmZXItPmJhc2UoKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7Ci0KLSAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCB0cnVlKTsKLSAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKLSAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNzZC0wIiwgYnVmZmVyKTsKICAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlWcDlDb2RlY1ByaXZhdGUsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CiAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSBBQnVmZmVyKHNpemUpOwogICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IE5VTEwgfHwgYnVmZmVyLT5iYXNlKCkgPT0gTlVMTCkgewpAQCAtMTA4NSwxMyArMTM5OCwxNyBAQAogICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY3NkLTAiLCBidWZmZXIpOwogCiAgICAgICAgIHBhcnNlVnA5UHJvZmlsZUxldmVsRnJvbUNzZChidWZmZXIsIG1zZyk7Ci0gICAgfQotCi0gICAgLy8gVE9ETyBleHBvc2UgImNyeXB0by1rZXkiL2tLZXlDcnlwdG9LZXkgdGhyb3VnaCBwdWJsaWMgYXBpCi0gICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlDcnlwdG9LZXksICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5QWxhY01hZ2ljQ29va2llLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICBBTE9HVigiY29udmVydE1ldGFEYXRhVG9NZXNzYWdlIGZvdW5kIGtLZXlBbGFjTWFnaWNDb29raWUgb2Ygc2l6ZSAlenVcbiIsIHNpemUpOwogICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcihzaXplKTsKLSAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNyeXB0by1rZXkiLCBidWZmZXIpOworICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IE5VTEwgfHwgYnVmZmVyLT5iYXNlKCkgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQogICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGRhdGEsIHNpemUpOworCisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiY3NkIiwgdHJ1ZSk7CisgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7CisgICAgICAgIG1zZy0+c2V0QnVmZmVyKCJjc2QtMCIsIGJ1ZmZlcik7CiAgICAgfQogCiAgICAgKmZvcm1hdCA9IG1zZzsKQEAgLTEyOTIsNiArMTYwOSwyMSBAQAogICAgICAgICBBTE9HVygiZGlkIG5vdCBmaW5kIG1pbWUgdHlwZSIpOwogICAgIH0KIAorICAgIGNvbnZlcnRNZXNzYWdlVG9NZXRhRGF0YUZyb21NYXBwaW5ncyhtc2csIG1ldGEpOworCisgICAgaW50MzJfdCBzeXN0ZW1JZDsKKyAgICBpZiAobXNnLT5maW5kSW50MzIoImNhLXN5c3RlbS1pZCIsICZzeXN0ZW1JZCkpIHsKKyAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNBU3lzdGVtSUQsIHN5c3RlbUlkKTsKKworICAgICAgICBzcDxBQnVmZmVyPiBjYVNlc3Npb25JZCwgY2FQdnREYXRhOworICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKCJjYS1zZXNzaW9uLWlkIiwgJmNhU2Vzc2lvbklkKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5Q0FTZXNzaW9uSUQsIDAsIGNhU2Vzc2lvbklkLT5kYXRhKCksIGNhU2Vzc2lvbklkLT5zaXplKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoImNhLXByaXZhdGUtZGF0YSIsICZjYVB2dERhdGEpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlDQVByaXZhdGVEYXRhLCAwLCBjYVB2dERhdGEtPmRhdGEoKSwgY2FQdnREYXRhLT5zaXplKCkpOworICAgICAgICB9CisgICAgfQorCiAgICAgaW50NjRfdCBkdXJhdGlvblVzOwogICAgIGlmIChtc2ctPmZpbmRJbnQ2NCgiZHVyYXRpb25VcyIsICZkdXJhdGlvblVzKSkgewogICAgICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOwpAQCAtMTMyMyw3ICsxNjU1LDcgQEAKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOwogICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dXKCJkaWQgbm90IGZpbmQgd2lkdGggYW5kL29yIGhlaWdodCIpOworICAgICAgICAgICAgQUxPR1YoImRpZCBub3QgZmluZCB3aWR0aCBhbmQvb3IgaGVpZ2h0Iik7CiAgICAgICAgIH0KIAogICAgICAgICBpbnQzMl90IHNhcldpZHRoLCBzYXJIZWlnaHQ7CkBAIC0xMzg2LDYgKzE3MTgsMTIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIHNwPEFCdWZmZXI+IGhkcjEwUGx1c0luZm87CisgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoImhkcjEwLXBsdXMtaW5mbyIsICZoZHIxMFBsdXNJbmZvKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5SGRyMTBQbHVzSW5mbywgMCwKKyAgICAgICAgICAgICAgICAgICAgaGRyMTBQbHVzSW5mby0+ZGF0YSgpLCBoZHIxMFBsdXNJbmZvLT5zaXplKCkpOworICAgICAgICB9CisKICAgICAgICAgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhQ29sb3JBc3BlY3RzKG1zZywgbWV0YSk7CiAKICAgICAgICAgQVN0cmluZyB0c1NjaGVtYTsKQEAgLTE0MTAsNiArMTc0OCwxMCBAQAogICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKSB7CiAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CiAgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBiaXRzUGVyU2FtcGxlOworICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImJpdHMtcGVyLXNhbXBsZSIsICZiaXRzUGVyU2FtcGxlKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUJpdHNQZXJTYW1wbGUsIGJpdHNQZXJTYW1wbGUpOworICAgICAgICB9CiAgICAgICAgIGludDMyX3QgY2hhbm5lbE1hc2s7CiAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiY2hhbm5lbC1tYXNrIiwgJmNoYW5uZWxNYXNrKSkgewogICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxNYXNrLCBjaGFubmVsTWFzayk7CkBAIC0xNDI4LDEwICsxNzcwLDIwIEBACiAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5SXNBRFRTLCBpc0FEVFMpOwogICAgICAgICB9CiAKKyAgICAgICAgaW50MzJfdCBhYWNQcm9maWxlID0gLTE7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiYWFjLXByb2ZpbGUiLCAmYWFjUHJvZmlsZSkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlBQUNBT1QsIGFhY1Byb2ZpbGUpOworICAgICAgICB9CisKICAgICAgICAgaW50MzJfdCBwY21FbmNvZGluZzsKICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJwY20tZW5jb2RpbmciLCAmcGNtRW5jb2RpbmcpKSB7CiAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5UGNtRW5jb2RpbmcsIHBjbUVuY29kaW5nKTsKICAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgaGFwdGljQ2hhbm5lbENvdW50OworICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImhhcHRpYy1jaGFubmVsLWNvdW50IiwgJmhhcHRpY0NoYW5uZWxDb3VudCkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlIYXB0aWNDaGFubmVsQ291bnQsIGhhcHRpY0NoYW5uZWxDb3VudCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpbnQzMl90IG1heElucHV0U2l6ZTsKQEAgLTE0NjgsNDAgKzE4MjAsNzEgQEAKICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoImNzZC0xIiwgJmNzZDEpKSB7CiAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y2hhcj4gYXZjYyhjc2Qwc2l6ZSArIGNzZDEtPnNpemUoKSArIDEwMjQpOwogICAgICAgICAgICAgICAgIHNpemVfdCBvdXRzaXplID0gcmVhc3NlbWJsZUFWQ0MoY3NkMCwgY3NkMSwgYXZjYy5kYXRhKCkpOwotICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUFWQ0MsIGtLZXlBVkNDLCBhdmNjLmRhdGEoKSwgb3V0c2l6ZSk7CisgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QVZDQywga1R5cGVBVkNDLCBhdmNjLmRhdGEoKSwgb3V0c2l6ZSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMgfHwgbWltZSA9PSBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCkgeworICAgICAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDIHx8CisgICAgICAgICAgICAgICAgbWltZSA9PSBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCB8fAorICAgICAgICAgICAgICAgIG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfQVVESU9fV01BIHx8CisgICAgICAgICAgICAgICAgbWltZSA9PSBNRURJQV9NSU1FVFlQRV9BVURJT19NU19BRFBDTSB8fAorICAgICAgICAgICAgICAgIG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfQVVESU9fRFZJX0lNQV9BRFBDTSkgewogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y2hhcj4gZXNkcyhjc2Qwc2l6ZSArIDMxKTsKICAgICAgICAgICAgIC8vIFRoZSB3cml0dGVuIEVTRFMgaXMgYWN0dWFsbHkgZm9yIGFuIGF1ZGlvIHN0cmVhbSwgYnV0IGl0J3MgZW5vdWdoCiAgICAgICAgICAgICAvLyBmb3IgdHJhbnNwb3J0aW5nIHRoZSBDU0QgdG8gbXV4ZXJzLgogICAgICAgICAgICAgcmVhc3NlbWJsZUVTRFMoY3NkMCwgZXNkcy5kYXRhKCkpOwotICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5RVNEUywga0tleUVTRFMsIGVzZHMuZGF0YSgpLCBlc2RzLnNpemUoKSk7CisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlFU0RTLCBrVHlwZUVTRFMsIGVzZHMuZGF0YSgpLCBlc2RzLnNpemUoKSk7CiAgICAgICAgIH0gZWxzZSBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDIHx8CiAgICAgICAgICAgICAgICAgICAgbWltZSA9PSBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpIHsKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGh2Y2MoY3NkMHNpemUgKyAxMDI0KTsKICAgICAgICAgICAgIHNpemVfdCBvdXRzaXplID0gcmVhc3NlbWJsZUhWQ0MoY3NkMCwgaHZjYy5kYXRhKCksIGh2Y2Muc2l6ZSgpLCA0KTsKLSAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUhWQ0MsIGtLZXlIVkNDLCBodmNjLmRhdGEoKSwgb3V0c2l6ZSk7CisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlIVkNDLCBrVHlwZUhWQ0MsIGh2Y2MuZGF0YSgpLCBvdXRzaXplKTsKKyAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSkgeworICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QVYxQywgMCwgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOwogICAgICAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfVklERU9fVlA5KSB7CiAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlWcDlDb2RlY1ByaXZhdGUsIDAsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKICAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpIHsKLSAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleU9wdXNIZWFkZXIsIDAsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKKyAgICAgICAgICAgIHNpemVfdCBvcHVzSGVhZFNpemUgPSBjc2QwLT5zaXplKCk7CisgICAgICAgICAgICBzaXplX3QgY29kZWNEZWxheUJ1ZlNpemUgPSAwOworICAgICAgICAgICAgc2l6ZV90IHNlZWtQcmVSb2xsQnVmU2l6ZSA9IDA7CisgICAgICAgICAgICB2b2lkICpvcHVzSGVhZEJ1ZiA9IGNzZDAtPmRhdGEoKTsKKyAgICAgICAgICAgIHZvaWQgKmNvZGVjRGVsYXlCdWYgPSBOVUxMOworICAgICAgICAgICAgdm9pZCAqc2Vla1ByZVJvbGxCdWYgPSBOVUxMOwogICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcigiY3NkLTEiLCAmY3NkMSkpIHsKLSAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlPcHVzQ29kZWNEZWxheSwgMCwgY3NkMS0+ZGF0YSgpLCBjc2QxLT5zaXplKCkpOworICAgICAgICAgICAgICAgIGNvZGVjRGVsYXlCdWZTaXplID0gY3NkMS0+c2l6ZSgpOworICAgICAgICAgICAgICAgIGNvZGVjRGVsYXlCdWYgPSBjc2QxLT5kYXRhKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKCJjc2QtMiIsICZjc2QyKSkgewotICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleU9wdXNTZWVrUHJlUm9sbCwgMCwgY3NkMi0+ZGF0YSgpLCBjc2QyLT5zaXplKCkpOworICAgICAgICAgICAgICAgIHNlZWtQcmVSb2xsQnVmU2l6ZSA9IGNzZDItPnNpemUoKTsKKyAgICAgICAgICAgICAgICBzZWVrUHJlUm9sbEJ1ZiA9IGNzZDItPmRhdGEoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUykgewotICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5Vm9yYmlzSW5mbywgMCwgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOwotICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcigiY3NkLTEiLCAmY3NkMSkpIHsKLSAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlWb3JiaXNCb29rcywgMCwgY3NkMS0+ZGF0YSgpLCBjc2QxLT5zaXplKCkpOworICAgICAgICAgICAgLyogRXh0cmFjdCBjb2RlYyBkZWxheSBhbmQgc2VlayBwcmUgcm9sbCBmcm9tIGNzZC0wLAorICAgICAgICAgICAgICogaWYgY3NkLTEgYW5kIGNzZC0yIGFyZSBub3QgcHJlc2VudCAqLworICAgICAgICAgICAgaWYgKCFjb2RlY0RlbGF5QnVmICYmICFzZWVrUHJlUm9sbEJ1ZikgeworICAgICAgICAgICAgICAgIEdldE9wdXNIZWFkZXJCdWZmZXJzKGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpLCAmb3B1c0hlYWRCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3B1c0hlYWRTaXplLCAmY29kZWNEZWxheUJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY0RlbGF5QnVmU2l6ZSwgJnNlZWtQcmVSb2xsQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlZWtQcmVSb2xsQnVmU2l6ZSk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlPcHVzSGVhZGVyLCAwLCBvcHVzSGVhZEJ1Ziwgb3B1c0hlYWRTaXplKTsKKyAgICAgICAgICAgIGlmIChjb2RlY0RlbGF5QnVmKSB7CisgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5T3B1c0NvZGVjRGVsYXksIDAsIGNvZGVjRGVsYXlCdWYsIGNvZGVjRGVsYXlCdWZTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzZWVrUHJlUm9sbEJ1ZikgeworICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleU9wdXNTZWVrUHJlUm9sbCwgMCwgc2Vla1ByZVJvbGxCdWYsIHNlZWtQcmVSb2xsQnVmU2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9BVURJT19BTEFDKSB7CisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlBbGFjTWFnaWNDb29raWUsIDAsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKICAgICAgICAgfQotICAgIH0KLQotICAgIGludDMyX3QgdGltZVNjYWxlOwotICAgIGlmIChtc2ctPmZpbmRJbnQzMigidGltZS1zY2FsZSIsICZ0aW1lU2NhbGUpKSB7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlUaW1lU2NhbGUsIHRpbWVTY2FsZSk7CisgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyAmJiBtc2ctPmZpbmRCdWZmZXIoImNzZC1hdmMiLCAmY3NkMCkpIHsKKyAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QVZDQywga1R5cGVBVkNDLCBjc2QwLT5kYXRhKCksIGNzZDAtPnNpemUoKSk7CisgICAgfSBlbHNlIGlmICgobWltZSA9PSBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDIHx8IG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDKQorICAgICAgICAgICAgJiYgbXNnLT5maW5kQnVmZmVyKCJjc2QtaGV2YyIsICZjc2QwKSkgeworICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlIVkNDLCBrVHlwZUhWQ0MsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKKyAgICB9IGVsc2UgaWYgKG1zZy0+ZmluZEJ1ZmZlcigiZXNkcyIsICZjc2QwKSkgeworICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlFU0RTLCBrVHlwZUVTRFMsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKKyAgICB9IGVsc2UgaWYgKG1zZy0+ZmluZEJ1ZmZlcigibXBlZzItc3RyZWFtLWhlYWRlciIsICZjc2QwKSkgeworICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlTdHJlYW1IZWFkZXIsICdtZGF0JywgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOworICAgIH0gZWxzZSBpZiAobXNnLT5maW5kQnVmZmVyKCJkMjYzIiwgJmNzZDApKSB7CisgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUQyNjMsIGtUeXBlRDI2MywgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOwogICAgIH0KIAogICAgIC8vIFhYWCBUT0RPIGFkZCB3aGF0ZXZlciBvdGhlciBrZXlzIHRoZXJlIGFyZQpAQCAtMTU3Nyw3ICsxOTYwLDExIEBACiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMsICAgICAgQVVESU9fRk9STUFUX1ZPUkJJUyB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUywgICAgICAgIEFVRElPX0ZPUk1BVF9PUFVTfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FDMywgICAgICAgICBBVURJT19GT1JNQVRfQUMzfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0VBQzMsICAgICAgICBBVURJT19GT1JNQVRfRV9BQzN9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDM19KT0MsICAgIEFVRElPX0ZPUk1BVF9FX0FDM19KT0N9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0LCAgICAgICAgIEFVRElPX0ZPUk1BVF9BQzR9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQywgICAgICAgIEFVRElPX0ZPUk1BVF9GTEFDfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FMQUMsICAgICAgICBBVURJT19GT1JNQVRfQUxBQyB9LAogICAgIHsgMCwgQVVESU9fRk9STUFUX0lOVkFMSUQgfQogfTsKIApAQCAtMTYyOSw0NiArMjAxNiw0NiBAQAogICAgIHJldHVybjsKIH0KIAotYm9vbCBjYW5PZmZsb2FkU3RyZWFtKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSwgYm9vbCBoYXNWaWRlbywKLSAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU3RyZWFtaW5nLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpCitzdGF0dXNfdCBnZXRBdWRpb09mZmxvYWRJbmZvKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSwgYm9vbCBoYXNWaWRlbywKKyAgICAgICAgYm9vbCBpc1N0cmVhbWluZywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLCBhdWRpb19vZmZsb2FkX2luZm9fdCAqaW5mbykKIHsKICAgICBjb25zdCBjaGFyICptaW1lOwogICAgIGlmIChtZXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CiAKLSAgICBhdWRpb19vZmZsb2FkX2luZm9fdCBpbmZvID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKKyAgICAoKmluZm8pID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKIAotICAgIGluZm8uZm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7Ci0gICAgaWYgKG1hcE1pbWVUb0F1ZGlvRm9ybWF0KGluZm8uZm9ybWF0LCBtaW1lKSAhPSBPSykgeworICAgIGluZm8tPmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgIGlmIChtYXBNaW1lVG9BdWRpb0Zvcm1hdChpbmZvLT5mb3JtYXQsIG1pbWUpICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIgQ291bGRuJ3QgbWFwIG1pbWUgdHlwZSBcIiVzXCIgdG8gYSB2YWxpZCBBdWRpb1N5c3RlbTo6YXVkaW9fZm9ybWF0ICEiLCBtaW1lKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJNaW1lIHR5cGUgXCIlc1wiIG1hcHBlZCB0byBhdWRpb19mb3JtYXQgJWQiLCBtaW1lLCBpbmZvLmZvcm1hdCk7CisgICAgICAgIEFMT0dWKCJNaW1lIHR5cGUgXCIlc1wiIG1hcHBlZCB0byBhdWRpb19mb3JtYXQgJWQiLCBtaW1lLCBpbmZvLT5mb3JtYXQpOwogICAgIH0KIAotICAgIGlmIChBVURJT19GT1JNQVRfSU5WQUxJRCA9PSBpbmZvLmZvcm1hdCkgeworICAgIGlmIChBVURJT19GT1JNQVRfSU5WQUxJRCA9PSBpbmZvLT5mb3JtYXQpIHsKICAgICAgICAgLy8gY2FuJ3Qgb2ZmbG9hZCBpZiB3ZSBkb24ndCBrbm93IHdoYXQgdGhlIHNvdXJjZSBmb3JtYXQgaXMKICAgICAgICAgQUxPR0UoIm1pbWUgdHlwZSBcIiVzXCIgbm90IGEga25vd24gYXVkaW8gZm9ybWF0IiwgbWltZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICAvLyBSZWRlZmluZSBhYWMgZm9ybWF0IGFjY29yZGluZyB0byBpdHMgcHJvZmlsZQogICAgIC8vIE9mZmxvYWRpbmcgZGVwZW5kcyBvbiBhdWRpbyBEU1AgY2FwYWJpbGl0aWVzLgogICAgIGludDMyX3QgYWFjYW90ID0gLTE7CiAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5QUFDQU9ULCAmYWFjYW90KSkgewotICAgICAgICBtYXBBQUNQcm9maWxlVG9BdWRpb0Zvcm1hdChpbmZvLmZvcm1hdCwoT01YX0FVRElPX0FBQ1BST0ZJTEVUWVBFKSBhYWNhb3QpOworICAgICAgICBtYXBBQUNQcm9maWxlVG9BdWRpb0Zvcm1hdChpbmZvLT5mb3JtYXQsKE9NWF9BVURJT19BQUNQUk9GSUxFVFlQRSkgYWFjYW90KTsKICAgICB9CiAKICAgICBpbnQzMl90IHNyYXRlID0gLTE7CiAgICAgaWYgKCFtZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzcmF0ZSkpIHsKICAgICAgICAgQUxPR1YoInRyYWNrIG9mIHR5cGUgJyVzJyBkb2VzIG5vdCBwdWJsaXNoIHNhbXBsZSByYXRlIiwgbWltZSk7CiAgICAgfQotICAgIGluZm8uc2FtcGxlX3JhdGUgPSBzcmF0ZTsKKyAgICBpbmZvLT5zYW1wbGVfcmF0ZSA9IHNyYXRlOwogCiAgICAgaW50MzJfdCBjbWFzayA9IDA7Ci0gICAgaWYgKCFtZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxNYXNrLCAmY21hc2spKSB7CisgICAgaWYgKCFtZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxNYXNrLCAmY21hc2spIHx8IGNtYXNrID09IENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUikgewogICAgICAgICBBTE9HVigidHJhY2sgb2YgdHlwZSAnJXMnIGRvZXMgbm90IHB1Ymxpc2ggY2hhbm5lbCBtYXNrIiwgbWltZSk7CiAKICAgICAgICAgLy8gVHJ5IGEgY2hhbm5lbCBjb3VudCBpbnN0ZWFkCkBAIC0xNjc5LDI1ICsyMDY2LDM0IEBACiAgICAgICAgICAgICBjbWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChjaGFubmVsQ291bnQpOwogICAgICAgICB9CiAgICAgfQotICAgIGluZm8uY2hhbm5lbF9tYXNrID0gY21hc2s7CisgICAgaW5mby0+Y2hhbm5lbF9tYXNrID0gY21hc2s7CiAKICAgICBpbnQ2NF90IGR1cmF0aW9uID0gMDsKICAgICBpZiAoIW1ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvbikpIHsKICAgICAgICAgQUxPR1YoInRyYWNrIG9mIHR5cGUgJyVzJyBkb2VzIG5vdCBwdWJsaXNoIGR1cmF0aW9uIiwgbWltZSk7CiAgICAgfQotICAgIGluZm8uZHVyYXRpb25fdXMgPSBkdXJhdGlvbjsKKyAgICBpbmZvLT5kdXJhdGlvbl91cyA9IGR1cmF0aW9uOwogCiAgICAgaW50MzJfdCBicmF0ZSA9IC0xOwogICAgIGlmICghbWV0YS0+ZmluZEludDMyKGtLZXlCaXRSYXRlLCAmYnJhdGUpKSB7CiAgICAgICAgIEFMT0dWKCJ0cmFjayBvZiB0eXBlICclcycgZG9lcyBub3QgcHVibGlzaCBiaXRyYXRlIiwgbWltZSk7CiAgICAgfQotICAgIGluZm8uYml0X3JhdGUgPSBicmF0ZTsKKyAgICBpbmZvLT5iaXRfcmF0ZSA9IGJyYXRlOwogCiAKLSAgICBpbmZvLnN0cmVhbV90eXBlID0gc3RyZWFtVHlwZTsKLSAgICBpbmZvLmhhc192aWRlbyA9IGhhc1ZpZGVvOwotICAgIGluZm8uaXNfc3RyZWFtaW5nID0gaXNTdHJlYW1pbmc7CisgICAgaW5mby0+c3RyZWFtX3R5cGUgPSBzdHJlYW1UeXBlOworICAgIGluZm8tPmhhc192aWRlbyA9IGhhc1ZpZGVvOworICAgIGluZm8tPmlzX3N0cmVhbWluZyA9IGlzU3RyZWFtaW5nOworICAgIHJldHVybiBPSzsKK30KIAorYm9vbCBjYW5PZmZsb2FkU3RyZWFtKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWV0YSwgYm9vbCBoYXNWaWRlbywKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU3RyZWFtaW5nLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpCit7CisgICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgaW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CisgICAgaWYgKE9LICE9IGdldEF1ZGlvT2ZmbG9hZEluZm8obWV0YSwgaGFzVmlkZW8sIGlzU3RyZWFtaW5nLCBzdHJlYW1UeXBlLCAmaW5mbykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICAvLyBDaGVjayBpZiBvZmZsb2FkIGlzIHBvc3NpYmxlIGZvciBnaXZlbiBmb3JtYXQsIHN0cmVhbSB0eXBlLCBzYW1wbGUgcmF0ZSwKICAgICAvLyBiaXQgcmF0ZSwgZHVyYXRpb24sIHZpZGVvIGFuZCBzdHJlYW1pbmcKICAgICByZXR1cm4gQXVkaW9TeXN0ZW06OmlzT2ZmbG9hZFN1cHBvcnRlZChpbmZvKTsKQEAgLTE3MzgsNyArMjEzNCw3IEBACiAKIEhMU1RpbWU6OkhMU1RpbWUoY29uc3Qgc3A8QU1lc3NhZ2U+JiBtZXRhKSA6CiAgICAgbVNlcSgtMSksCi0gICAgbVRpbWVVcygtMWxsKSwKKyAgICBtVGltZVVzKC0xTEwpLAogICAgIG1NZXRhKG1ldGEpIHsKICAgICBpZiAobWV0YSAhPSBOVUxMKSB7CiAgICAgICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMigiZGlzY29udGludWl0eVNlcSIsICZtU2VxKSk7CkBAIC0xNzQ3LDcgKzIxNDMsNyBAQAogfQogCiBpbnQ2NF90IEhMU1RpbWU6OmdldFNlZ21lbnRUaW1lVXMoKSBjb25zdCB7Ci0gICAgaW50NjRfdCBzZWdtZW50U3RhcnRUaW1lVXMgPSAtMWxsOworICAgIGludDY0X3Qgc2VnbWVudFN0YXJ0VGltZVVzID0gLTFMTDsKICAgICBpZiAobU1ldGEgIT0gTlVMTCkgewogICAgICAgICBDSEVDSyhtTWV0YS0+ZmluZEludDY0KCJzZWdtZW50U3RhcnRUaW1lVXMiLCAmc2VnbWVudFN0YXJ0VGltZVVzKSk7CiAKQEAgLTE4NjcsNCArMjI2MywzIEBACiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAKaW5kZXggOTAyMGZjMS4uNGU1YjVlMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xOSw4ICsxOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+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+cnVuKCJDaG9yZW9ncmFwaGVyIikgIT0gT0spIHsKKyAgICAgICAgbUNob3Jlb2dyYXBoZXJUaHJlYWQuY2xlYXIoKTsKKyAgICB9Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjI6OnVwZGF0ZVZzeW5jKCkgeworICAgIG1Wc3luY1RpbWUgPSAwOworICAgIG1Wc3luY1BlcmlvZCA9IDA7CisKKyAgICBpZiAobVZzeW5jVHJhY2tlciAhPSBOVUxMKSB7CisgICAgICAgIG1Wc3luY1BlcmlvZCA9IG1Wc3luY1RyYWNrZXItPmdldFZzeW5jUGVyaW9kKCk7CisgICAgICAgIG1Wc3luY1RpbWUgPSBtVnN5bmNUcmFja2VyLT5nZXRWc3luY1RpbWUobVNmVnN5bmNPZmZzZXQgLSBtQXBwVnN5bmNPZmZzZXQpOworICAgIH0KKyAgICBtVnN5bmNSZWZyZXNoQXQgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQykgKyBrVnN5bmNSZWZyZXNoUGVyaW9kOworfQorCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXIyOjpyZWxlYXNlKCkgeworICAgIC8vIERvIG5vdCBjaGFuZ2Ugb3JkZXIKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayB0aHJlYWRMb2NrKG1Mb2NrKTsKKyAgICAgICAgbUNob3Jlb2dyYXBoZXJUaHJlYWQtPnJlcXVlc3RFeGl0QW5kV2FpdCgpOworICAgICAgICBtQ2hvcmVvZ3JhcGhlclRocmVhZC5jbGVhcigpOworICAgIH0KKworICAgIG1Wc3luY1RyYWNrZXIuY2xlYXIoKTsKK30KKworVmlkZW9GcmFtZVNjaGVkdWxlcjI6On5WaWRlb0ZyYW1lU2NoZWR1bGVyMigpIHsKKyAgICByZWxlYXNlKCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDE1MTdiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UuY3BwCkBAIC0wLDAgKzEsNDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX1ZJREVPCisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitzdGF0aWMgaW50IGNvbXBhcmUoY29uc3QgVCAqbGhzLCBjb25zdCBUICpyaHMpIHsKKyAgICBpZiAoKmxocyA8ICpyaHMpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0gZWxzZSBpZiAoKmxocyA+ICpyaHMpIHsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3N0YXRpYyBjb25zdCBzaXplX3Qga01pblNhbXBsZXNUb1N0YXJ0UHJpbWUgPSAzOworc3RhdGljIGNvbnN0IHNpemVfdCBrTWluU2FtcGxlc1RvU3RvcFByaW1lID0gVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OmtIaXN0b3J5U2l6ZTsKK3N0YXRpYyBjb25zdCBzaXplX3Qga01pblNhbXBsZXNUb0VzdGltYXRlUGVyaW9kID0gMzsKK3N0YXRpYyBjb25zdCBzaXplX3Qga01heFNhbXBsZXNUb0VzdGltYXRlUGVyaW9kID0gVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OmtIaXN0b3J5U2l6ZTsKKworc3RhdGljIGNvbnN0IHNpemVfdCBrUHJlY2lzaW9uID0gMTI7CitzdGF0aWMgY29uc3QgaW50NjRfdCBrRXJyb3JUaHJlc2hvbGQgPSAoMSA8PCAoa1ByZWNpc2lvbiAqIDIpKSAvIDEwOworc3RhdGljIGNvbnN0IGludDY0X3Qga011bHRpcGxlc1RocmVzaG9sZERpdiA9IDQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDI1JQorc3RhdGljIGNvbnN0IGludDY0X3Qga1JlRml0VGhyZXNob2xkRGl2ID0gMTAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDElCitzdGF0aWMgY29uc3QgbnNlY3NfdCBrTWF4QWxsb3dlZEZyYW1lU2tpcCA9IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjprTmFub3NJbjFzOyAgICAgLy8gMSBzZWMKK3N0YXRpYyBjb25zdCBuc2Vjc190IGtNaW5QZXJpb2QgPSBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6a05hbm9zSW4xcyAvIDEyMDsgICAgICAgICAvLyAxMjBIegorc3RhdGljIGNvbnN0IG5zZWNzX3Qga1JlZml0UmVmcmVzaFBlcmlvZCA9IDEwICogVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OmtOYW5vc0luMXM7IC8vIDEwIHNlYworCitWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6UExMOjpQTEwoKQorICAgIDogbVBlcmlvZCgtMSksCisgICAgICBtUGhhc2UoMCksCisgICAgICBtUHJpbWVkKGZhbHNlKSwKKyAgICAgIG1TYW1wbGVzVXNlZEZvclByaW1pbmcoMCksCisgICAgICBtTGFzdFRpbWUoLTEpLAorICAgICAgbU51bVNhbXBsZXMoMCkgeworfQorCit2b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpQTEw6OnJlc2V0KGZsb2F0IGZwcykgeworICAgIC8vdGVzdCgpOworCisgICAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZyA9IDA7CisgICAgbUxhc3RUaW1lID0gLTE7CisKKyAgICAvLyBzZXQgdXAgb3IgcmVzZXQgdmlkZW8gUExMCisgICAgaWYgKGZwcyA8PSAwLmYpIHsKKyAgICAgICAgbVBlcmlvZCA9IC0xOworICAgICAgICBtUHJpbWVkID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoInJlc2V0IGF0ICUuMWYgZnBzIiwgZnBzKTsKKyAgICAgICAgbVBlcmlvZCA9IChuc2Vjc190KSgxZTkgLyBmcHMgKyAwLjUpOworICAgICAgICBtUHJpbWVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICByZXN0YXJ0KCk7Cit9CisKKy8vIHJlc2V0IFBMTCBidXQga2VlcCBwcmV2aW91cyBwZXJpb2QgZXN0aW1hdGUKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OlBMTDo6cmVzdGFydCgpIHsKKyAgICBtTnVtU2FtcGxlcyA9IDA7CisgICAgbVBoYXNlID0gLTE7Cit9CisKKyNpZiAwCisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OlBMTDo6dGVzdCgpIHsKKyAgICBuc2Vjc190IHBlcmlvZCA9IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjprTmFub3NJbjFzIC8gNjA7CisgICAgbVRpbWVzWzBdID0gMDsKKyAgICBtVGltZXNbMV0gPSBwZXJpb2Q7CisgICAgbVRpbWVzWzJdID0gcGVyaW9kICogMzsKKyAgICBtVGltZXNbM10gPSBwZXJpb2QgKiA0OworICAgIG1UaW1lc1s0XSA9IHBlcmlvZCAqIDc7CisgICAgbVRpbWVzWzVdID0gcGVyaW9kICogODsKKyAgICBtVGltZXNbNl0gPSBwZXJpb2QgKiAxMDsKKyAgICBtVGltZXNbN10gPSBwZXJpb2QgKiAxMjsKKyAgICBtTnVtU2FtcGxlcyA9IDg7CisgICAgaW50NjRfdCBhLCBiLCBlcnI7CisgICAgZml0KDAsIHBlcmlvZCAqIDEyIC8gNywgOCwgJmEsICZiLCAmZXJyKTsKKyAgICAvLyBhID0gMC44KDUpKworICAgIC8vIGIgPSAtMC4xNDA5NygyKSsKKyAgICAvLyBlcnIgPSAwLjI3NTA1NzgoNzAzKSsKKyAgICBBTE9HRCgiYT0lbGxkICglLjZmKSwgYj0lbGxkICglLjZmKSwgZXJyPSVsbGQgKCUuNmYpIiwKKyAgICAgICAgICAgIChsb25nIGxvbmcpYSwgKGEgLyAoZmxvYXQpKDEgPDwga1ByZWNpc2lvbikpLAorICAgICAgICAgICAgKGxvbmcgbG9uZyliLCAoYiAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCisgICAgICAgICAgICAobG9uZyBsb25nKWVyciwgKGVyciAvIChmbG9hdCkoMSA8PCAoa1ByZWNpc2lvbiAqIDIpKSkpOworfQorCisjZW5kaWYKKworLy8gSWYgb3ZlcmZsb3cgaGFwcGVucywgdGhlIHZhbHVlIGlzIGFscmVhZHkgaW5jb3JyZWN0LCBhbmQgbm8gbWF0ZXIgd2hhdCB2YWx1ZSB3ZSBnZXQgaXMgT0suCisvLyBBbmQgdGhpcyBwYXJ0IG9mIGNhbGN1bGF0aW9uIGlzIG5vdCBpbXBvcnRhbnQsIHNvIGl0J3MgT0sgdG8gc2ltcGx5IGRpc2FibGUgb3ZlcmZsb3cgY2hlY2sKKy8vIGluc3RlYWQgb2YgdXNpbmcgZG91YmxlIHdoaWNoIG1ha2VzIGNvZGUgbW9yZSBjb21wbGljYXRlZC4KK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJpbnRlZ2VyIikpKQorYm9vbCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6UExMOjpmaXQoCisgICAgICAgIG5zZWNzX3QgcGhhc2UsIG5zZWNzX3QgcGVyaW9kLCBzaXplX3QgbnVtU2FtcGxlc1RvVXNlLAorICAgICAgICBpbnQ2NF90ICphLCBpbnQ2NF90ICpiLCBpbnQ2NF90ICplcnIpIHsKKyAgICBpZiAobnVtU2FtcGxlc1RvVXNlID4gbU51bVNhbXBsZXMpIHsKKyAgICAgICAgbnVtU2FtcGxlc1RvVXNlID0gbU51bVNhbXBsZXM7CisgICAgfQorCisgICAgaWYgKChwZXJpb2QgPj4ga1ByZWNpc2lvbikgPT0gMCApIHsKKyAgICAgICAgQUxPR1coIlBlcmlvZCBpcyAwLCBvciBhZnRlciBpbmNsdWRpbmcgcHJlY2lzaW9uIGlzIDAgLSB3b3VsZCBjYXVzZSBkaXYwLCByZXR1cm5pbmciKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDY0X3Qgc3VtWCA9IDA7CisgICAgaW50NjRfdCBzdW1YWCA9IDA7CisgICAgaW50NjRfdCBzdW1YWSA9IDA7CisgICAgaW50NjRfdCBzdW1ZWSA9IDA7CisgICAgaW50NjRfdCBzdW1ZID0gMDsKKworICAgIGludDY0X3QgeCA9IDA7IC8vIHggdXN1YWxseSBpcyBpbiBbMC4ubnVtU2FtcGxlc1RvVXNlKQorICAgIG5zZWNzX3QgbGFzdFRpbWU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzVG9Vc2U7IGkrKykgeworICAgICAgICBzaXplX3QgaXggPSAobU51bVNhbXBsZXMgLSBudW1TYW1wbGVzVG9Vc2UgKyBpKSAlIGtIaXN0b3J5U2l6ZTsKKyAgICAgICAgbnNlY3NfdCB0aW1lID0gbVRpbWVzW2l4XTsKKyAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICB4ICs9IGRpdlJvdW5kKHRpbWUgLSBsYXN0VGltZSwgcGVyaW9kKTsKKyAgICAgICAgfQorICAgICAgICAvLyB5IGlzIHVzdWFsbHkgaW4gWy1udW1TYW1wbGVzVG9Vc2UuLm51bVNhbXBsZXNUb1VzZStrUmVmaXRSZWZyZXNoUGVyaW9kL2tNaW5QZXJpb2QpIDw8IGtQcmVjaXNpb24KKyAgICAgICAgLy8gICBpZGVhbGx5IGluIFswLi5udW1TYW1wbGVzVG9Vc2UpLCBidXQgc2hpZnRlZCBieSAtbnVtU2FtcGxlc1RvVXNlIGR1cmluZworICAgICAgICAvLyAgIHByaW1pbmcsIGFuZCBwb3NzaWJseSBzaGlmdGVkIGJ5IHVwIHRvIGtSZWZpdFJlZnJlc2hQZXJpb2Qva01pblBlcmlvZAorICAgICAgICAvLyAgIHdoaWxlIHdlIGFyZSBub3QgcmVmaXR0aW5nLgorICAgICAgICBpbnQ2NF90IHkgPSBkaXZSb3VuZCh0aW1lIC0gcGhhc2UsIHBlcmlvZCA+PiBrUHJlY2lzaW9uKTsKKyAgICAgICAgc3VtWCArPSB4OworICAgICAgICBzdW1ZICs9IHk7CisgICAgICAgIHN1bVhYICs9IHggKiB4OworICAgICAgICBzdW1YWSArPSB4ICogeTsKKyAgICAgICAgc3VtWVkgKz0geSAqIHk7CisgICAgICAgIGxhc3RUaW1lID0gdGltZTsKKyAgICB9CisKKyAgICBpbnQ2NF90IGRpdiAgID0gKGludDY0X3QpbnVtU2FtcGxlc1RvVXNlICogc3VtWFggLSBzdW1YICogc3VtWDsKKyAgICBpZiAoZGl2ID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDY0X3QgYV9ub20gPSAoaW50NjRfdCludW1TYW1wbGVzVG9Vc2UgKiBzdW1YWSAtIHN1bVggKiBzdW1ZOworICAgIGludDY0X3QgYl9ub20gPSBzdW1YWCAqIHN1bVkgICAgICAgICAgICAtIHN1bVggKiBzdW1YWTsKKyAgICAqYSA9IGRpdlJvdW5kKGFfbm9tLCBkaXYpOworICAgICpiID0gZGl2Um91bmQoYl9ub20sIGRpdik7CisgICAgLy8gZG9uJ3QgdXNlIGEgYW5kIGIgZGlyZWN0bHkgYXMgdGhlIHJvdW5kaW5nIGVycm9yIGlzIHNpZ25pZmljYW50CisgICAgKmVyciA9IHN1bVlZIC0gZGl2Um91bmQoYV9ub20gKiBzdW1YWSArIGJfbm9tICogc3VtWSwgZGl2KTsKKyAgICBBTE9HVigiZml0dGluZ1slenVdIGE9JWxsZCAoJS42ZiksIGI9JWxsZCAoJS42ZiksIGVycj0lbGxkICglLjZmKSIsCisgICAgICAgICAgICBudW1TYW1wbGVzVG9Vc2UsCisgICAgICAgICAgICAobG9uZyBsb25nKSphLCAgICgqYSAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCisgICAgICAgICAgICAobG9uZyBsb25nKSpiLCAgICgqYiAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCisgICAgICAgICAgICAobG9uZyBsb25nKSplcnIsICgqZXJyIC8gKGZsb2F0KSgxIDw8IChrUHJlY2lzaW9uICogMikpKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OlBMTDo6cHJpbWUoc2l6ZV90IG51bVNhbXBsZXNUb1VzZSkgeworICAgIGlmIChudW1TYW1wbGVzVG9Vc2UgPiBtTnVtU2FtcGxlcykgeworICAgICAgICBudW1TYW1wbGVzVG9Vc2UgPSBtTnVtU2FtcGxlczsKKyAgICB9CisgICAgQ0hFQ0sobnVtU2FtcGxlc1RvVXNlID49IDMpOyAgLy8gbXVzdCBoYXZlIGF0IGxlYXN0IDMgc2FtcGxlcworCisgICAgLy8gZXN0aW1hdGUgdmlkZW8gZnJhbWVyYXRlIGZyb20gZGVsdGFzIGJldHdlZW4gdGltZXN0YW1wcywgYW5kCisgICAgLy8gMm5kIG9yZGVyIGRlbHRhcworICAgIFZlY3Rvcjxuc2Vjc190PiBkZWx0YXM7CisgICAgbnNlY3NfdCBsYXN0VGltZSwgZmlyc3RUaW1lOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU2FtcGxlc1RvVXNlOyArK2kpIHsKKyAgICAgICAgc2l6ZV90IGluZGV4ID0gKG1OdW1TYW1wbGVzIC0gbnVtU2FtcGxlc1RvVXNlICsgaSkgJSBrSGlzdG9yeVNpemU7CisgICAgICAgIG5zZWNzX3QgdGltZSA9IG1UaW1lc1tpbmRleF07CisgICAgICAgIGlmIChpID4gMCkgeworICAgICAgICAgICAgaWYgKHRpbWUgLSBsYXN0VGltZSA+IGtNaW5QZXJpb2QpIHsKKyAgICAgICAgICAgICAgICAvL0FMT0dWKCJkZWx0YTogJWxsZCIsIChsb25nIGxvbmcpKHRpbWUgLSBsYXN0VGltZSkpOworICAgICAgICAgICAgICAgIGRlbHRhcy5wdXNoKHRpbWUgLSBsYXN0VGltZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaXJzdFRpbWUgPSB0aW1lOworICAgICAgICB9CisgICAgICAgIGxhc3RUaW1lID0gdGltZTsKKyAgICB9CisgICAgZGVsdGFzLnNvcnQoY29tcGFyZTxuc2Vjc190Pik7CisgICAgc2l6ZV90IG51bURlbHRhcyA9IGRlbHRhcy5zaXplKCk7CisgICAgaWYgKG51bURlbHRhcyA+IDEpIHsKKyAgICAgICAgbnNlY3NfdCBkZWx0YU1pbkxpbWl0ID0gbWF4KGRlbHRhc1swXSAvIGtNdWx0aXBsZXNUaHJlc2hvbGREaXYsIGtNaW5QZXJpb2QpOworICAgICAgICBuc2Vjc190IGRlbHRhTWF4TGltaXQgPSBkZWx0YXNbbnVtRGVsdGFzIC8gMl0gKiBrTXVsdGlwbGVzVGhyZXNob2xkRGl2OworICAgICAgICBmb3IgKHNpemVfdCBpID0gbnVtRGVsdGFzIC8gMiArIDE7IGkgPCBudW1EZWx0YXM7ICsraSkgeworICAgICAgICAgICAgaWYgKGRlbHRhc1tpXSA+IGRlbHRhTWF4TGltaXQpIHsKKyAgICAgICAgICAgICAgICBkZWx0YXMucmVzaXplKGkpOworICAgICAgICAgICAgICAgIG51bURlbHRhcyA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBudW1EZWx0YXM7ICsraSkgeworICAgICAgICAgICAgbnNlY3NfdCBkZWx0YTJuZCA9IGRlbHRhc1tpXSAtIGRlbHRhc1tpIC0gMV07CisgICAgICAgICAgICBpZiAoZGVsdGEybmQgPj0gZGVsdGFNaW5MaW1pdCkgeworICAgICAgICAgICAgICAgIC8vQUxPR1YoImRlbHRhMjogJWxsZCIsIChsb25nIGxvbmcpKGRlbHRhMm5kKSk7CisgICAgICAgICAgICAgICAgZGVsdGFzLnB1c2goZGVsdGEybmQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gdXNlIHRoZSBvbmUgdGhhdCB5aWVsZHMgdGhlIGJlc3QgbWF0Y2gKKyAgICBpbnQ2NF90IGJlc3RTY29yZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRlbHRhcy5zaXplKCk7ICsraSkgeworICAgICAgICBuc2Vjc190IGRlbHRhID0gZGVsdGFzW2ldOworICAgICAgICBpbnQ2NF90IHNjb3JlID0gMDsKKyNpZiAxCisgICAgICAgIC8vIHNpbXBsZXN0IHNjb3JlOiBudW1iZXIgb2YgZGVsdGFzIHRoYXQgYXJlIG5lYXIgbXVsdGlwbGVzCisgICAgICAgIHNpemVfdCBtYXRjaGVzID0gMDsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBkZWx0YXMuc2l6ZSgpOyArK2opIHsKKyAgICAgICAgICAgIG5zZWNzX3QgZXJyID0gcGVyaW9kaWNFcnJvcihkZWx0YXNbal0sIGRlbHRhKTsKKyAgICAgICAgICAgIGlmIChlcnIgPCBkZWx0YSAvIGtNdWx0aXBsZXNUaHJlc2hvbGREaXYpIHsKKyAgICAgICAgICAgICAgICArK21hdGNoZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2NvcmUgPSBtYXRjaGVzOworI2lmIDAKKyAgICAgICAgLy8gY291bGQgYmUgd2VpZ2hlZCBieSB0aGUgKDEgLSBub3JtYWxpemVkIGVycm9yKQorICAgICAgICBpZiAobnVtU2FtcGxlc1RvVXNlID49IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCkgeworICAgICAgICAgICAgaW50NjRfdCBhLCBiLCBlcnI7CisgICAgICAgICAgICBmaXQoZmlyc3RUaW1lLCBkZWx0YSwgbnVtU2FtcGxlc1RvVXNlLCAmYSwgJmIsICZlcnIpOworICAgICAgICAgICAgZXJyID0gKDEgPDwgKDIgKiBrUHJlY2lzaW9uKSkgLSBlcnI7CisgICAgICAgICAgICBzY29yZSAqPSBtYXgoMCwgZXJyKTsKKyAgICAgICAgfQorI2VuZGlmCisjZWxzZQorICAgICAgICAvLyBvciB1c2UgdGhlIGVycm9yIGFzIGEgbmVnYXRpdmUgc2NvcmUKKyAgICAgICAgaWYgKG51bVNhbXBsZXNUb1VzZSA+PSBrTWluU2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QpIHsKKyAgICAgICAgICAgIGludDY0X3QgYSwgYiwgZXJyOworICAgICAgICAgICAgZml0KGZpcnN0VGltZSwgZGVsdGEsIG51bVNhbXBsZXNUb1VzZSwgJmEsICZiLCAmZXJyKTsKKyAgICAgICAgICAgIHNjb3JlID0gLWRlbHRhICogZXJyOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaWYgKGkgPT0gMCB8fCBzY29yZSA+IGJlc3RTY29yZSkgeworICAgICAgICAgICAgYmVzdFNjb3JlID0gc2NvcmU7CisgICAgICAgICAgICBtUGVyaW9kID0gZGVsdGE7CisgICAgICAgICAgICBtUGhhc2UgPSBmaXJzdFRpbWU7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoInByaW1pbmdbJXp1XSBwaGFzZTolbGxkIHBlcmlvZDolbGxkIiwKKyAgICAgICAgICAgIG51bVNhbXBsZXNUb1VzZSwgKGxvbmcgbG9uZyltUGhhc2UsIChsb25nIGxvbmcpbVBlcmlvZCk7Cit9CisKK25zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OlBMTDo6YWRkU2FtcGxlKG5zZWNzX3QgdGltZSkgeworICAgIGlmIChtTGFzdFRpbWUgPj0gMAorICAgICAgICAgICAgLy8gaWYgdGltZSBnb2VzIGJhY2t3YXJkLCBvciB3ZSBza2lwcGVkIHJlbmRlcmluZworICAgICAgICAgICAgJiYgKHRpbWUgPiBtTGFzdFRpbWUgKyBrTWF4QWxsb3dlZEZyYW1lU2tpcCB8fCB0aW1lIDwgbUxhc3RUaW1lKSkgeworICAgICAgICByZXN0YXJ0KCk7CisgICAgfQorCisgICAgbUxhc3RUaW1lID0gdGltZTsKKyAgICBtVGltZXNbbU51bVNhbXBsZXMgJSBrSGlzdG9yeVNpemVdID0gdGltZTsKKyAgICArK21OdW1TYW1wbGVzOworCisgICAgYm9vbCBkb0ZpdCA9IHRpbWUgPiBtUmVmaXRBdDsKKyAgICBpZiAoKG1QZXJpb2QgPD0gMCB8fCAhbVByaW1lZCkgJiYgbU51bVNhbXBsZXMgPj0ga01pblNhbXBsZXNUb1N0YXJ0UHJpbWUpIHsKKyAgICAgICAgcHJpbWUoa01pblNhbXBsZXNUb1N0b3BQcmltZSk7CisgICAgICAgICsrbVNhbXBsZXNVc2VkRm9yUHJpbWluZzsKKyAgICAgICAgZG9GaXQgPSB0cnVlOworICAgIH0KKyAgICBpZiAobVBlcmlvZCA+IDAgJiYgbU51bVNhbXBsZXMgPj0ga01pblNhbXBsZXNUb0VzdGltYXRlUGVyaW9kKSB7CisgICAgICAgIGlmIChtUGhhc2UgPCAwKSB7CisgICAgICAgICAgICAvLyBpbml0aWFsaXplIHBoYXNlIHRvIHRoZSBjdXJyZW50IHJlbmRlciB0aW1lCisgICAgICAgICAgICBtUGhhc2UgPSB0aW1lOworICAgICAgICAgICAgZG9GaXQgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKCFkb0ZpdCkgeworICAgICAgICAgICAgaW50NjRfdCBlcnIgPSBwZXJpb2RpY0Vycm9yKHRpbWUgLSBtUGhhc2UsIG1QZXJpb2QpOworICAgICAgICAgICAgZG9GaXQgPSBlcnIgPiBtUGVyaW9kIC8ga1JlRml0VGhyZXNob2xkRGl2OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRvRml0KSB7CisgICAgICAgICAgICBpbnQ2NF90IGEsIGIsIGVycjsKKyAgICAgICAgICAgIGlmICghZml0KG1QaGFzZSwgbVBlcmlvZCwga01heFNhbXBsZXNUb0VzdGltYXRlUGVyaW9kLCAmYSwgJmIsICZlcnIpKSB7CisgICAgICAgICAgICAgICAgLy8gc2FtcGxlcyBhcmUgbm90IHN1aXRhYmxlIGZvciBmaXR0aW5nLiAgdGhpcyBtZWFucyB0aGV5IGFyZQorICAgICAgICAgICAgICAgIC8vIGFsc28gbm90IHN1aXRhYmxlIGZvciBwcmltaW5nLgorICAgICAgICAgICAgICAgIEFMT0dWKCJjb3VsZCBub3QgZml0IC0ga2VlcGluZyBvbGQgcGVyaW9kOiVsbGQiLCAobG9uZyBsb25nKW1QZXJpb2QpOworICAgICAgICAgICAgICAgIHJldHVybiBtUGVyaW9kOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtUmVmaXRBdCA9IHRpbWUgKyBrUmVmaXRSZWZyZXNoUGVyaW9kOworCisgICAgICAgICAgICBtUGhhc2UgKz0gKG1QZXJpb2QgKiBiKSA+PiBrUHJlY2lzaW9uOworICAgICAgICAgICAgbVBlcmlvZCA9IChtUGVyaW9kICogYSkgPj4ga1ByZWNpc2lvbjsKKyAgICAgICAgICAgIEFMT0dWKCJuZXcgcGhhc2U6JWxsZCBwZXJpb2Q6JWxsZCIsIChsb25nIGxvbmcpbVBoYXNlLCAobG9uZyBsb25nKW1QZXJpb2QpOworCisgICAgICAgICAgICBpZiAoZXJyIDwga0Vycm9yVGhyZXNob2xkKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtUHJpbWVkICYmIG1TYW1wbGVzVXNlZEZvclByaW1pbmcgPj0ga01pblNhbXBsZXNUb1N0b3BQcmltZSkgeworICAgICAgICAgICAgICAgICAgICBtUHJpbWVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1QcmltZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtU2FtcGxlc1VzZWRGb3JQcmltaW5nID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbVBlcmlvZDsKK30KKworbnNlY3NfdCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6UExMOjpnZXRQZXJpb2QoKSBjb25zdCB7CisgICAgcmV0dXJuIG1QcmltZWQgPyBtUGVyaW9kIDogMDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZSBTY2hlZHVsZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6VmlkZW9GcmFtZVNjaGVkdWxlckJhc2UoKQorICAgIDogbVZzeW5jVGltZSgwKSwKKyAgICAgIG1Wc3luY1BlcmlvZCgwKSwKKyAgICAgIG1Wc3luY1JlZnJlc2hBdCgwKSwKKyAgICAgIG1MYXN0VnN5bmNUaW1lKC0xKSwKKyAgICAgIG1UaW1lQ29ycmVjdGlvbigwKSB7Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OmluaXQoZmxvYXQgdmlkZW9GcHMpIHsKKyAgICB1cGRhdGVWc3luYygpOworCisgICAgbUxhc3RWc3luY1RpbWUgPSAtMTsKKyAgICBtVGltZUNvcnJlY3Rpb24gPSAwOworCisgICAgbVBsbC5yZXNldCh2aWRlb0Zwcyk7Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OnJlc3RhcnQoKSB7CisgICAgbUxhc3RWc3luY1RpbWUgPSAtMTsKKyAgICBtVGltZUNvcnJlY3Rpb24gPSAwOworCisgICAgbVBsbC5yZXN0YXJ0KCk7Cit9CisKK25zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OmdldFZzeW5jUGVyaW9kKCkgeworICAgIGlmIChtVnN5bmNQZXJpb2QgPiAwKSB7CisgICAgICAgIHJldHVybiBtVnN5bmNQZXJpb2Q7CisgICAgfQorICAgIHJldHVybiBrRGVmYXVsdFZzeW5jUGVyaW9kOworfQorCitmbG9hdCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6Z2V0RnJhbWVSYXRlKCkgeworICAgIG5zZWNzX3QgdmlkZW9QZXJpb2QgPSBtUGxsLmdldFBlcmlvZCgpOworICAgIGlmICh2aWRlb1BlcmlvZCA+IDApIHsKKyAgICAgICAgcmV0dXJuIDFlOSAvIHZpZGVvUGVyaW9kOworICAgIH0KKyAgICByZXR1cm4gMC5mOworfQorCituc2Vjc190IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpzY2hlZHVsZShuc2Vjc190IHJlbmRlclRpbWUpIHsKKyAgICBuc2Vjc190IG9yaWdSZW5kZXJUaW1lID0gcmVuZGVyVGltZTsKKworICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOworICAgIGlmIChub3cgPj0gbVZzeW5jUmVmcmVzaEF0KSB7CisgICAgICAgIHVwZGF0ZVZzeW5jKCk7CisgICAgfQorCisgICAgLy8gd2l0aG91dCBWU1lOQyBpbmZvLCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvCisgICAgaWYgKG1Wc3luY1BlcmlvZCA9PSAwKSB7CisgICAgICAgIEFMT0dWKCJubyB2c3luYzogcmVuZGVyPSVsbGQiLCAobG9uZyBsb25nKXJlbmRlclRpbWUpOworICAgICAgICByZXR1cm4gcmVuZGVyVGltZTsKKyAgICB9CisKKyAgICAvLyBlbnN1cmUgdnN5bmMgdGltZSBpcyB3ZWxsIGJlZm9yZSAoY29ycmVjdGVkKSByZW5kZXIgdGltZQorICAgIGlmIChtVnN5bmNUaW1lID4gcmVuZGVyVGltZSAtIDQgKiBtVnN5bmNQZXJpb2QpIHsKKyAgICAgICAgbVZzeW5jVGltZSAtPQorICAgICAgICAgICAgKChtVnN5bmNUaW1lIC0gcmVuZGVyVGltZSkgLyBtVnN5bmNQZXJpb2QgKyA1KSAqIG1Wc3luY1BlcmlvZDsKKyAgICB9CisKKyAgICAvLyBWaWRlbyBwcmVzZW50YXRpb24gdGFrZXMgcGxhY2UgYXQgdGhlIFZTWU5DIF9hZnRlcl8gcmVuZGVyVGltZS4gIEFkanVzdCByZW5kZXJUaW1lCisgICAgLy8gc28gdGhpcyBlZmZlY3RpdmVseSBiZWNvbWVzIGEgcm91bmRpbmcgb3BlcmF0aW9uICh0byB0aGUgX2Nsb3Nlc3RfIFZTWU5DLikKKyAgICByZW5kZXJUaW1lIC09IG1Wc3luY1BlcmlvZCAvIDI7CisKKyAgICBjb25zdCBuc2Vjc190IHZpZGVvUGVyaW9kID0gbVBsbC5hZGRTYW1wbGUob3JpZ1JlbmRlclRpbWUpOworICAgIGlmICh2aWRlb1BlcmlvZCA+IDApIHsKKyAgICAgICAgLy8gU21vb3RoIG91dCByZW5kZXJpbmcKKyAgICAgICAgc2l6ZV90IE4gPSAxMjsKKyAgICAgICAgbnNlY3NfdCBmaXZlU2l4dGhEZXYgPQorICAgICAgICAgICAgYWJzKCgodmlkZW9QZXJpb2QgKiA1ICsgbVZzeW5jUGVyaW9kKSAlIChtVnN5bmNQZXJpb2QgKiA2KSkgLSBtVnN5bmNQZXJpb2QpCisgICAgICAgICAgICAgICAgICAgIC8gKG1Wc3luY1BlcmlvZCAvIDEwMCk7CisgICAgICAgIC8vIHVzZSAyMCBzYW1wbGVzIGlmIHdlIGFyZSBkb2luZyA1OjYgcmF0aW8gKy0gMSUgKGUuZy4gcGxheWluZyA1MEh6IG9uIDYwSHopCisgICAgICAgIGlmIChmaXZlU2l4dGhEZXYgPCAxMikgeyAgLyogMTIlIC8gNiA9IDIlICovCisgICAgICAgICAgICBOID0gMjA7CisgICAgICAgIH0KKworICAgICAgICBuc2Vjc190IG9mZnNldCA9IDA7CisgICAgICAgIG5zZWNzX3QgZWRnZVJlbWFpbmRlciA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDw9IE47IGkrKykgeworICAgICAgICAgICAgb2Zmc2V0ICs9CisgICAgICAgICAgICAgICAgKHJlbmRlclRpbWUgKyBtVGltZUNvcnJlY3Rpb24gKyB2aWRlb1BlcmlvZCAqIGkgLSBtVnN5bmNUaW1lKSAlIG1Wc3luY1BlcmlvZDsKKyAgICAgICAgICAgIGVkZ2VSZW1haW5kZXIgKz0gKHZpZGVvUGVyaW9kICogaSkgJSBtVnN5bmNQZXJpb2Q7CisgICAgICAgIH0KKyAgICAgICAgbVRpbWVDb3JyZWN0aW9uICs9IG1Wc3luY1BlcmlvZCAvIDIgLSBvZmZzZXQgLyAobnNlY3NfdClOOworICAgICAgICByZW5kZXJUaW1lICs9IG1UaW1lQ29ycmVjdGlvbjsKKyAgICAgICAgbnNlY3NfdCBjb3JyZWN0aW9uTGltaXQgPSBtVnN5bmNQZXJpb2QgKiAzIC8gNTsKKyAgICAgICAgZWRnZVJlbWFpbmRlciA9IGFicyhlZGdlUmVtYWluZGVyIC8gKG5zZWNzX3QpTiAtIG1Wc3luY1BlcmlvZCAvIDIpOworICAgICAgICBpZiAoZWRnZVJlbWFpbmRlciA8PSBtVnN5bmNQZXJpb2QgLyAzKSB7CisgICAgICAgICAgICBjb3JyZWN0aW9uTGltaXQgLz0gMjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGVzdGltYXRlIGhvdyBtYW55IFZTWU5DcyBhIGZyYW1lIHdpbGwgc3BlbmQgb24gdGhlIGRpc3BsYXkKKyAgICAgICAgbnNlY3NfdCBuZXh0VnN5bmNUaW1lID0KKyAgICAgICAgICAgIHJlbmRlclRpbWUgKyBtVnN5bmNQZXJpb2QgLSAoKHJlbmRlclRpbWUgLSBtVnN5bmNUaW1lKSAlIG1Wc3luY1BlcmlvZCk7CisgICAgICAgIGlmIChtTGFzdFZzeW5jVGltZSA+PSAwKSB7CisgICAgICAgICAgICBzaXplX3QgbWluVnN5bmNzUGVyRnJhbWUgPSB2aWRlb1BlcmlvZCAvIG1Wc3luY1BlcmlvZDsKKyAgICAgICAgICAgIHNpemVfdCB2c3luY3NGb3JMYXN0RnJhbWUgPSBkaXZSb3VuZChuZXh0VnN5bmNUaW1lIC0gbUxhc3RWc3luY1RpbWUsIG1Wc3luY1BlcmlvZCk7CisgICAgICAgICAgICBib29sIHZzeW5jc1BlckZyYW1lQXJlTmVhcmx5Q29uc3RhbnQgPQorICAgICAgICAgICAgICAgIHBlcmlvZGljRXJyb3IodmlkZW9QZXJpb2QsIG1Wc3luY1BlcmlvZCkgLyAobVZzeW5jUGVyaW9kIC8gMjApID09IDA7CisKKyAgICAgICAgICAgIGlmIChtVGltZUNvcnJlY3Rpb24gPiBjb3JyZWN0aW9uTGltaXQgJiYKKyAgICAgICAgICAgICAgICAgICAgKHZzeW5jc1BlckZyYW1lQXJlTmVhcmx5Q29uc3RhbnQgfHwgdnN5bmNzRm9yTGFzdEZyYW1lID4gbWluVnN5bmNzUGVyRnJhbWUpKSB7CisgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGEgVlNZTkMKKyAgICAgICAgICAgICAgICBtVGltZUNvcnJlY3Rpb24gLT0gbVZzeW5jUGVyaW9kIC8gMjsKKyAgICAgICAgICAgICAgICByZW5kZXJUaW1lIC09IG1Wc3luY1BlcmlvZCAvIDI7CisgICAgICAgICAgICAgICAgbmV4dFZzeW5jVGltZSAtPSBtVnN5bmNQZXJpb2Q7CisgICAgICAgICAgICAgICAgaWYgKHZzeW5jc0Zvckxhc3RGcmFtZSA+IDApCisgICAgICAgICAgICAgICAgICAgIC0tdnN5bmNzRm9yTGFzdEZyYW1lOworICAgICAgICAgICAgfSBlbHNlIGlmIChtVGltZUNvcnJlY3Rpb24gPCAtY29ycmVjdGlvbkxpbWl0ICYmCisgICAgICAgICAgICAgICAgICAgICh2c3luY3NQZXJGcmFtZUFyZU5lYXJseUNvbnN0YW50IHx8IHZzeW5jc0Zvckxhc3RGcmFtZSA9PSBtaW5Wc3luY3NQZXJGcmFtZSkpIHsKKyAgICAgICAgICAgICAgICAvLyBhZGQgYSBWU1lOQworICAgICAgICAgICAgICAgIG1UaW1lQ29ycmVjdGlvbiArPSBtVnN5bmNQZXJpb2QgLyAyOworICAgICAgICAgICAgICAgIHJlbmRlclRpbWUgKz0gbVZzeW5jUGVyaW9kIC8gMjsKKyAgICAgICAgICAgICAgICBuZXh0VnN5bmNUaW1lICs9IG1Wc3luY1BlcmlvZDsKKyAgICAgICAgICAgICAgICBpZiAodnN5bmNzRm9yTGFzdEZyYW1lIDwgVUxPTkdfTUFYKQorICAgICAgICAgICAgICAgICAgICArK3ZzeW5jc0Zvckxhc3RGcmFtZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVRpbWVDb3JyZWN0aW9uIDwgLWNvcnJlY3Rpb25MaW1pdCAqIDIKKyAgICAgICAgICAgICAgICAgICAgfHwgbVRpbWVDb3JyZWN0aW9uID4gY29ycmVjdGlvbkxpbWl0ICogMikgeworICAgICAgICAgICAgICAgIEFMT0dXKCJjb3JyZWN0aW9uIGJleW9uZCBsaW1pdDogJWxsZCB2cyAlbGxkICh2c3luY3MgZm9yIGxhc3QgZnJhbWU6ICV6dSwgbWluOiAlenUpIgorICAgICAgICAgICAgICAgICAgICAgICAgIiByZXN0YXJ0aW5nLiByZW5kZXI9JWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1UaW1lQ29ycmVjdGlvbiwgKGxvbmcgbG9uZyljb3JyZWN0aW9uTGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICB2c3luY3NGb3JMYXN0RnJhbWUsIG1pblZzeW5jc1BlckZyYW1lLCAobG9uZyBsb25nKW9yaWdSZW5kZXJUaW1lKTsKKyAgICAgICAgICAgICAgICByZXN0YXJ0KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdSZW5kZXJUaW1lOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBVFJBQ0VfSU5UKCJGUkFNRV9WU1lOQ1MiLCB2c3luY3NGb3JMYXN0RnJhbWUpOworICAgICAgICB9CisgICAgICAgIG1MYXN0VnN5bmNUaW1lID0gbmV4dFZzeW5jVGltZTsKKyAgICB9CisKKyAgICAvLyBhbGlnbiByZW5kZXJ0aW1lIHRvIHRoZSBjZW50ZXIgYmV0d2VlbiBWU1lOQyBlZGdlcworICAgIHJlbmRlclRpbWUgLT0gKHJlbmRlclRpbWUgLSBtVnN5bmNUaW1lKSAlIG1Wc3luY1BlcmlvZDsKKyAgICByZW5kZXJUaW1lICs9IG1Wc3luY1BlcmlvZCAvIDI7CisgICAgQUxPR1YoImFkanVzdGluZyByZW5kZXI6ICVsbGQgPT4gJWxsZCIsIChsb25nIGxvbmcpb3JpZ1JlbmRlclRpbWUsIChsb25nIGxvbmcpcmVuZGVyVGltZSk7CisgICAgQVRSQUNFX0lOVCgiRlJBTUVfRkxJUF9JTihtcykiLCAocmVuZGVyVGltZSAtIG5vdykgLyAxMDAwMDAwKTsKKyAgICByZXR1cm4gcmVuZGVyVGltZTsKK30KKworVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6On5WaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSgpIHt9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9BbmRyb2lkLmJwCmluZGV4IDRmNDZiZTcuLmRiNjcwMzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQW5kcm9pZC5icApAQCAtNCwxMiArNCwxMCBAQAogICAgIHZuZGs6IHsKICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICB9LAotCisgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAogICAgIHNyY3M6IFsKLSAgICAgICAgIkNvbnZlcnNpb24uY3BwIiwKICAgICAgICAgIkZyYW1lRHJvcHBlci5jcHAiLAogICAgICAgICAiR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAiLAotICAgICAgICAiV1Byb2R1Y2VyTGlzdGVuZXIuY3BwIiwKICAgICBdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWwpAQCAtMjUsMTAgKzIzLDggQEAKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJndWkiLAogICAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgICAibGliaGlkbG1lbW9yeSIsCiAgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKQEAgLTM4LDE0ICszNCwyNSBAQAogICAgICAgICAibGlidXRpbHMiLAogCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCi0KLSAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsIC8vIFRPRE8oYi82MjkyMzQ3OSk6IHVzZSBoZWFkZXIgbGlicmFyeQorICAgICAgICAvLyBGb2xsb3dpbmcgbGlicyBhcmUgZnJvbSBsaWJndWlfYnVmZmVycXVldWVfc3RhdGljCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhpZGwudG9rZW5AMS4wLXV0aWxzIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliRUdMIiwKKyAgICAgICAgImxpYmh3YmluZGVyIiwKKyAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCisgICAgICAgICJsaWJ2bmRrc3VwcG9ydCIsCisgICAgXSwKKyAgICAKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliZ3VpX2J1ZmZlcnF1ZXVlX3N0YXRpYyIKICAgICBdLAogCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwotICAgICAgICAibGliZ3VpIiwKICAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDIuMCIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpAQCAtNjEsOCArNjgsNSBAQAogICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29udmVyc2lvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9Db252ZXJzaW9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZlZDAwNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9Db252ZXJzaW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1NDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9Db252ZXJzaW9uLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBjb252ZXJzaW9uIHsKLQotLy8gbmF0aXZlX2hhbmRsZV90IGhlbHBlciBmdW5jdGlvbnMuCi0KLS8qKgotICogXGJyaWVmIFRha2UgYW4gZmQgYW5kIGNyZWF0ZSBhIG5hdGl2ZSBoYW5kbGUgY29udGFpbmluZyBvbmx5IHRoZSBnaXZlbiBmZC4KLSAqIFRoZSBjcmVhdGVkIGhhbmRsZSB3aWxsIG5lZWQgdG8gYmUgZGVsZXRlZCBtYW51YWxseSB3aXRoCi0gKiBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAuCi0gKgotICogXHBhcmFtW2luXSBmZCBUaGUgc291cmNlIGZpbGUgZGVzY3JpcHRvciAob2YgdHlwZSBgaW50YCkuCi0gKiBccmV0dXJuIFRoZSBjcmVhdGUgYG5hdGl2ZV9oYW5kbGVfdCpgIHRoYXQgY29udGFpbnMgdGhlIGdpdmVuIFxwIGZkLiBJZiB0aGUKLSAqIHN1cHBsaWVkIFxwIGZkIGlzIG5lZ2F0aXZlLCB0aGUgY3JlYXRlZCBuYXRpdmUgaGFuZGxlIHdpbGwgY29udGFpbiBubyBmaWxlCi0gKiBkZXNjcmlwdG9ycy4KLSAqCi0gKiBJZiB0aGUgbmF0aXZlIGhhbmRsZSBjYW5ub3QgYmUgY3JlYXRlZCwgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlCi0gKiBgbnVsbHB0cmAuCi0gKgotICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBkdXBsaWNhdGUgdGhlIGZpbGUgZGVzY3JpcHRvci4KLSAqLwotbmF0aXZlX2hhbmRsZV90KiBuYXRpdmVfaGFuZGxlX2NyZWF0ZV9mcm9tX2ZkKGludCBmZCkgewotICAgIGlmIChmZCA8IDIpIHsKLSAgICAgICAgcmV0dXJuIG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDAsIDApOwotICAgIH0KLSAgICBuYXRpdmVfaGFuZGxlX3QqIG5oID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7Ci0gICAgaWYgKG5oID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgfQotICAgIG5oLT5kYXRhWzBdID0gZmQ7Ci0gICAgcmV0dXJuIG5oOwotfQotCi0vKioKLSAqIFxicmllZiBFeHRyYWN0IGEgZmlsZSBkZXNjcmlwdG9yIGZyb20gYSBuYXRpdmUgaGFuZGxlLgotICoKLSAqIFxwYXJhbVtpbl0gbmggVGhlIHNvdXJjZSBgbmF0aXZlX2hhbmRsZV90KmAuCi0gKiBccGFyYW1baW5dIGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZmlsZSBkZXNjcmlwdG9yIGluIFxwIG5oIHRvIHJlYWQgZnJvbS4gVGhpcwotICogaW5wdXQgaGFzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIGAwYC4KLSAqIFxyZXR1cm4gVGhlIGBpbmRleGAtdGggZmlsZSBkZXNjcmlwdG9yIGluIFxwIG5oLiBJZiBccCBuaCBkb2VzIG5vdCBoYXZlCi0gKiBlbm91Z2ggZmlsZSBkZXNjcmlwdG9ycywgdGhlIHJldHVybmVkIHZhbHVlIHdpbGwgYmUgYC0xYC4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGR1cGxpY2F0ZSB0aGUgZmlsZSBkZXNjcmlwdG9yLgotICovCi1pbnQgbmF0aXZlX2hhbmRsZV9yZWFkX2ZkKG5hdGl2ZV9oYW5kbGVfdCBjb25zdCogbmgsIGludCBpbmRleCkgewotICAgIHJldHVybiAoKG5oID09IG51bGxwdHIpIHx8IChuaC0+bnVtRmRzID09IDApIHx8Ci0gICAgICAgICAgICAobmgtPm51bUZkcyA8PSBpbmRleCkgfHwgKGluZGV4IDwgMCkpID8KLSAgICAgICAgICAgIC0xIDogbmgtPmRhdGFbaW5kZXhdOwotfQotCi0vKioKLSAqIENvbnZlcnNpb24gZnVuY3Rpb25zCi0gKiA9PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoZXJlIGFyZSB0d28gbWFpbiBkaXJlY3Rpb25zIG9mIGNvbnZlcnNpb246Ci0gKiAtIGBpblRhcmdldFR5cGUoLi4uKWA6IENyZWF0ZSBhIHdyYXBwZXIgd2hvc2UgbGlmZXRpbWUgZGVwZW5kcyBvbiB0aGUKLSAqICAgaW5wdXQuIFRoZSB3cmFwcGVyIGhhcyB0eXBlIGBUYXJnZXRUeXBlYC4KLSAqIC0gYHRvVGFyZ2V0VHlwZSguLi4pYDogQ3JlYXRlIGEgc3RhbmRhbG9uZSBvYmplY3Qgb2YgdHlwZSBgVGFyZ2V0VHlwZWAgdGhhdAotICogICBjb3JyZXNwb25kcyB0byB0aGUgaW5wdXQuIFRoZSBsaWZldGltZSBvZiB0aGUgb3V0cHV0IGRvZXMgbm90IGRlcGVuZCBvbiB0aGUKLSAqICAgbGlmZXRpbWUgb2YgdGhlIGlucHV0LgotICogLSBgd3JhcEluKFRhcmdldFR5cGUqLCAuLi4pYDogU2FtZSBhcyBgaW5UYXJnZXRUeXBlKClgLCBidXQgZm9yIGBUYXJnZXRUeXBlYAotICogICB0aGF0IGNhbm5vdCBiZSBjb3BpZWQgYW5kL29yIG1vdmVkIGVmZmljaWVudGx5LCBvciB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZQotICogICBvdXRwdXQgYXJndW1lbnRzLgotICogLSBgY29udmVydFRvKFRhcmdldFR5cGUqLCAuLi4pYDogU2FtZSBhcyBgdG9UYXJnZXRUeXBlKClgLCBidXQgZm9yCi0gKiAgIGBUYXJnZXRUeXBlYCB0aGF0IGNhbm5vdCBiZSBjb3BpZWQgYW5kL29yIG1vdmVkIGVmZmljaWVudGx5LCBvciB3aGVuIHRoZXJlCi0gKiAgIGFyZSBtdWx0aXBsZSBvdXRwdXQgYXJndW1lbnRzLgotICoKLSAqIGB3cmFwSW4oKWAgYW5kIGBjb252ZXJ0VG8oKWAgZnVuY3Rpb25zIHdpbGwgdGFrZSBvdXRwdXQgYXJndW1lbnRzIGJlZm9yZQotICogaW5wdXQgYXJndW1lbnRzLiBTb21lIG9mIHRoZXNlIGZ1bmN0aW9ucyBtaWdodCByZXR1cm4gYSB2YWx1ZSB0byBpbmRpY2F0ZQotICogc3VjY2VzcyBvciBlcnJvci4KLSAqCi0gKiBJbiBjb252ZXJ0aW5nIG9yIHdyYXBwaW5nIHNvbWV0aGluZyBhcyBhIFRyZWJsZSB0eXBlIHRoYXQgY29udGFpbnMgYQotICogYGhpZGxfaGFuZGxlYCwgYG5hdGl2ZV9oYW5kbGVfdCpgIHdpbGwgbmVlZCB0byBiZSBjcmVhdGVkIGFuZCByZXR1cm5lZCBhcwotICogYW4gYWRkaXRpb25hbCBvdXRwdXQgYXJndW1lbnQsIGhlbmNlIG9ubHkgYHdyYXBJbigpYCBvciBgY29udmVydFRvKClgIHdvdWxkCi0gKiBiZSBhdmFpbGFibGUuIFRoZSBjYWxsZXIgbXVzdCBjYWxsIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYCB0byBkZWFsbG9jYXRlIHRoZQotICogcmV0dXJuZWQgbmF0aXZlIGhhbmRsZSB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQuCi0gKgotICogRm9yIHR5cGVzIHRoYXQgY29udGFpbiBmaWxlIGRlc2NyaXB0b3JzLCBgaW5UYXJnZXRUeXBlKClgIGFuZCBgd3JhcEFzKClgIGRvCi0gKiBub3QgcGVyZm9ybSBkdXBsaWNhdGlvbiBvZiBmaWxlIGRlc2NyaXB0b3JzLCB3aGlsZSBgdG9UYXJnZXRUeXBlKClgIGFuZAotICogYGNvbnZlcnRUbygpYCBkby4KLSAqLwotCi0vKioKLSAqIFxicmllZiBDb252ZXJ0IGBSZXR1cm48dm9pZD5gIHRvIGBiaW5kZXI6OlN0YXR1c2AuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYFJldHVybjx2b2lkPmAuCi0gKiBccmV0dXJuIFRoZSBjb3JyZXNwb25kaW5nIGBiaW5kZXI6OlN0YXR1c2AuCi0gKi8KLS8vIGNvbnZlcnQ6IFJldHVybjx2b2lkPiAtPiA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzCi06OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIHRvQmluZGVyU3RhdHVzKAotICAgICAgICBSZXR1cm48dm9pZD4gY29uc3QmIHQpIHsKLSAgICByZXR1cm4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czo6ZnJvbUV4Y2VwdGlvbkNvZGUoCi0gICAgICAgICAgICB0LmlzT2soKSA/IE9LIDogVU5LTk9XTl9FUlJPUiwKLSAgICAgICAgICAgIHQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLX0KLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgUmV0dXJuPHZvaWQ+YCB0byBgc3RhdHVzX3RgLiBUaGlzIGlzIGZvciBsZWdhY3kgYmluZGVyIGNhbGxzLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBSZXR1cm48dm9pZD5gLgotICogXHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBgc3RhdHVzX3RgLgotICovCi0vLyBjb252ZXJ0OiBSZXR1cm48dm9pZD4gLT4gc3RhdHVzX3QKLXN0YXR1c190IHRvU3RhdHVzVChSZXR1cm48dm9pZD4gY29uc3QmIHQpIHsKLSAgICByZXR1cm4gdC5pc09rKCkgPyBPSyA6IFVOS05PV05fRVJST1I7Ci19Ci0KLS8qKgotICogXGJyaWVmIFdyYXAgYG5hdGl2ZV9oYW5kbGVfdCpgIGluIGBoaWRsX2hhbmRsZWAuCi0gKgotICogXHBhcmFtW2luXSBuaCBUaGUgc291cmNlIGBuYXRpdmVfaGFuZGxlX3QqYC4KLSAqIFxyZXR1cm4gVGhlIGBoaWRsX2hhbmRsZWAgdGhhdCBwb2ludHMgdG8gXHAgbmguCi0gKi8KLS8vIHdyYXA6IG5hdGl2ZV9oYW5kbGVfdCogLT4gaGlkbF9oYW5kbGUKLWhpZGxfaGFuZGxlIGluSGlkbEhhbmRsZShuYXRpdmVfaGFuZGxlX3QgY29uc3QqIG5oKSB7Ci0gICAgcmV0dXJuIGhpZGxfaGFuZGxlKG5oKTsKLX0KLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgaW50MzJfdGAgdG8gYERhdGFzcGFjZWAuCi0gKgotICogXHBhcmFtW2luXSBsIFRoZSBzb3VyY2UgYGludDMyX3RgLgotICogXHJlc3VsdCBUaGUgY29ycmVzcG9uZGluZyBgRGF0YXNwYWNlYC4KLSAqLwotLy8gY29udmVydDogaW50MzJfdCAtPiBEYXRhc3BhY2UKLURhdGFzcGFjZSB0b0hhcmR3YXJlRGF0YXNwYWNlKGludDMyX3QgbCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxEYXRhc3BhY2U+KGwpOwotfQotCi0vKioKLSAqIFxicmllZiBDb252ZXJ0IGBEYXRhc3BhY2VgIHRvIGBpbnQzMl90YC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgRGF0YXNwYWNlYC4KLSAqIFxyZXN1bHQgVGhlIGNvcnJlc3BvbmRpbmcgYGludDMyX3RgLgotICovCi0vLyBjb252ZXJ0OiBEYXRhc3BhY2UgLT4gaW50MzJfdAotaW50MzJfdCB0b1Jhd0RhdGFzcGFjZShEYXRhc3BhY2UgY29uc3QmIHQpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4odCk7Ci19Ci0KLS8qKgotICogXGJyaWVmIFdyYXAgYW4gb3BhcXVlIGJ1ZmZlciBpbnNpZGUgYSBgaGlkbF92ZWM8dWludDhfdD5gLgotICoKLSAqIFxwYXJhbVtpbl0gbCBUaGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvcGFxdWUgYnVmZmVyLgotICogXHBhcmFtW2luXSBzaXplIFRoZSBzaXplIG9mIHRoZSBidWZmZXIuCi0gKiBccmV0dXJuIEEgYGhpZGxfdmVjPHVpbnQ4X3Q+YCB0aGF0IHBvaW50cyB0byB0aGUgYnVmZmVyLgotICovCi0vLyB3cmFwOiB2b2lkKiwgc2l6ZV90IC0+IGhpZGxfdmVjPHVpbnQ4X3Q+Ci1oaWRsX3ZlYzx1aW50OF90PiBpbkhpZGxCeXRlcyh2b2lkIGNvbnN0KiBsLCBzaXplX3Qgc2l6ZSkgewotICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IHQ7Ci0gICAgdC5zZXRUb0V4dGVybmFsKHN0YXRpY19jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PHZvaWQqPihsKSksIHNpemUsIGZhbHNlKTsKLSAgICByZXR1cm4gdDsKLX0KLQotLyoqCi0gKiBcYnJpZWYgQ3JlYXRlIGEgYGhpZGxfdmVjPHVpbnQ4X3Q+YCB0aGF0IGlzIGEgY29weSBvZiBhbiBvcGFxdWUgYnVmZmVyLgotICoKLSAqIFxwYXJhbVtpbl0gbCBUaGUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvcGFxdWUgYnVmZmVyLgotICogXHBhcmFtW2luXSBzaXplIFRoZSBzaXplIG9mIHRoZSBidWZmZXIuCi0gKiBccmV0dXJuIEEgYGhpZGxfdmVjPHVpbnQ4X3Q+YCB0aGF0IGlzIGEgY29weSBvZiB0aGUgaW5wdXQgYnVmZmVyLgotICovCi0vLyBjb252ZXJ0OiB2b2lkKiwgc2l6ZV90IC0+IGhpZGxfdmVjPHVpbnQ4X3Q+Ci1oaWRsX3ZlYzx1aW50OF90PiB0b0hpZGxCeXRlcyh2b2lkIGNvbnN0KiBsLCBzaXplX3Qgc2l6ZSkgewotICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IHQ7Ci0gICAgdC5yZXNpemUoc2l6ZSk7Ci0gICAgdWludDhfdCBjb25zdCogc3JjID0gc3RhdGljX2Nhc3Q8dWludDhfdCBjb25zdCo+KGwpOwotICAgIHN0ZDo6Y29weShzcmMsIHNyYyArIHNpemUsIHQuZGF0YSgpKTsKLSAgICByZXR1cm4gdDsKLX0KLQotLyoqCi0gKiBcYnJpZWYgV3JhcCBgR3JhcGhpY0J1ZmZlcmAgaW4gYEFud0J1ZmZlcmAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgd3JhcHBlciBvZiB0eXBlIGBBbndCdWZmZXJgLgotICogXHBhcmFtW2luXSBsIFRoZSBzb3VyY2UgYEdyYXBoaWNCdWZmZXJgLgotICovCi0vLyB3cmFwOiBHcmFwaGljQnVmZmVyIC0+IEFud0J1ZmZlcgotdm9pZCB3cmFwQXMoQW53QnVmZmVyKiB0LCBHcmFwaGljQnVmZmVyIGNvbnN0JiBsKSB7Ci0gICAgdC0+YXR0ci53aWR0aCA9IGwuZ2V0V2lkdGgoKTsKLSAgICB0LT5hdHRyLmhlaWdodCA9IGwuZ2V0SGVpZ2h0KCk7Ci0gICAgdC0+YXR0ci5zdHJpZGUgPSBsLmdldFN0cmlkZSgpOwotICAgIHQtPmF0dHIuZm9ybWF0ID0gc3RhdGljX2Nhc3Q8UGl4ZWxGb3JtYXQ+KGwuZ2V0UGl4ZWxGb3JtYXQoKSk7Ci0gICAgdC0+YXR0ci5sYXllckNvdW50ID0gbC5nZXRMYXllckNvdW50KCk7Ci0gICAgdC0+YXR0ci51c2FnZSA9IGwuZ2V0VXNhZ2UoKTsKLSAgICB0LT5hdHRyLmlkID0gbC5nZXRJZCgpOwotICAgIHQtPmF0dHIuZ2VuZXJhdGlvbk51bWJlciA9IGwuZ2V0R2VuZXJhdGlvbk51bWJlcigpOwotICAgIHQtPm5hdGl2ZUhhbmRsZSA9IGhpZGxfaGFuZGxlKGwuaGFuZGxlKTsKLX0KLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgQW53QnVmZmVyYCB0byBgR3JhcGhpY0J1ZmZlcmAuCi0gKgotICogXHBhcmFtW291dF0gbCBUaGUgZGVzdGluYXRpb24gYEdyYXBoaWNCdWZmZXJgLgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYEFud0J1ZmZlcmAuCi0gKgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGR1cGxpY2F0ZSBhbGwgZmlsZSBkZXNjcmlwdG9ycyBpbiBccCB0LgotICovCi0vLyBjb252ZXJ0OiBBbndCdWZmZXIgLT4gR3JhcGhpY0J1ZmZlcgotLy8gUmVmOiBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL3VpL0dyYXBoaWNCdWZmZXIuY3BwOiBHcmFwaGljQnVmZmVyOjpmbGF0dGVuCi1ib29sIGNvbnZlcnRUbyhHcmFwaGljQnVmZmVyKiBsLCBBbndCdWZmZXIgY29uc3QmIHQpIHsKLSAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IHQubmF0aXZlSGFuZGxlID09IG51bGxwdHIgPwotICAgICAgICAgICAgbnVsbHB0ciA6IG5hdGl2ZV9oYW5kbGVfY2xvbmUodC5uYXRpdmVIYW5kbGUpOwotCi0gICAgc2l6ZV90IGNvbnN0IG51bUludHMgPSAxMiArIChoYW5kbGUgPyBoYW5kbGUtPm51bUludHMgOiAwKTsKLSAgICBpbnQzMl90KiBpbnRzID0gbmV3IGludDMyX3RbbnVtSW50c107Ci0KLSAgICBzaXplX3QgbnVtRmRzID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihoYW5kbGUgPyBoYW5kbGUtPm51bUZkcyA6IDApOwotICAgIGludCogZmRzID0gbmV3IGludFtudW1GZHNdOwotCi0gICAgaW50c1swXSA9ICdHQkZSJzsKLSAgICBpbnRzWzFdID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4odC5hdHRyLndpZHRoKTsKLSAgICBpbnRzWzJdID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4odC5hdHRyLmhlaWdodCk7Ci0gICAgaW50c1szXSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHQuYXR0ci5zdHJpZGUpOwotICAgIGludHNbNF0gPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmF0dHIuZm9ybWF0KTsKLSAgICBpbnRzWzVdID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4odC5hdHRyLmxheWVyQ291bnQpOwotICAgIGludHNbNl0gPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmF0dHIudXNhZ2UpOwotICAgIGludHNbN10gPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmF0dHIuaWQgPj4gMzIpOwotICAgIGludHNbOF0gPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmF0dHIuaWQgJiAweEZGRkZGRkZGKTsKLSAgICBpbnRzWzldID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4odC5hdHRyLmdlbmVyYXRpb25OdW1iZXIpOwotICAgIGludHNbMTBdID0gMDsKLSAgICBpbnRzWzExXSA9IDA7Ci0gICAgaWYgKGhhbmRsZSkgewotICAgICAgICBpbnRzWzEwXSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGhhbmRsZS0+bnVtRmRzKTsKLSAgICAgICAgaW50c1sxMV0gPSBzdGF0aWNfY2FzdDxpbnQzMl90PihoYW5kbGUtPm51bUludHMpOwotICAgICAgICBpbnQqIGludHNTdGFydCA9IGhhbmRsZS0+ZGF0YSArIGhhbmRsZS0+bnVtRmRzOwotICAgICAgICBzdGQ6OmNvcHkoaGFuZGxlLT5kYXRhLCBpbnRzU3RhcnQsIGZkcyk7Ci0gICAgICAgIHN0ZDo6Y29weShpbnRzU3RhcnQsIGludHNTdGFydCArIGhhbmRsZS0+bnVtSW50cywgJmludHNbMTJdKTsKLSAgICB9Ci0KLSAgICB2b2lkIGNvbnN0KiBjb25zdEJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQgY29uc3QqPihpbnRzKTsKLSAgICBzaXplX3Qgc2l6ZSA9IG51bUludHMgKiBzaXplb2YoaW50MzJfdCk7Ci0gICAgaW50IGNvbnN0KiBjb25zdEZkcyA9IHN0YXRpY19jYXN0PGludCBjb25zdCo+KGZkcyk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbC0+dW5mbGF0dGVuKGNvbnN0QnVmZmVyLCBzaXplLCBjb25zdEZkcywgbnVtRmRzKTsKLQotICAgIGRlbGV0ZSBbXSBmZHM7Ci0gICAgZGVsZXRlIFtdIGludHM7Ci0gICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGFuZGxlKTsKLSAgICByZXR1cm4gc3RhdHVzID09IE5PX0VSUk9SOwotfQotCi0vKioKLSAqIENvbnZlcnNpb24gZnVuY3Rpb25zIGZvciB0eXBlcyBvdXRzaWRlIG1lZGlhCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFNvbWUgb2JqZWN0cyBpbiBsaWJ1aSBhbmQgbGliZ3VpIHRoYXQgd2VyZSBtYWRlIHRvIGdvIHRocm91Z2ggYmluZGVyIGNhbGxzIGRvCi0gKiBub3QgZXhwb3NlIHdheXMgdG8gcmVhZCBvciB3cml0ZSB0aGVpciBmaWVsZHMgdG8gdGhlIHB1YmxpYy4gVG8gcGFzcyBhbgotICogb2JqZWN0IG9mIHRoaXMga2luZCB0aHJvdWdoIHRoZSBISURMIGJvdW5kYXJ5LCB0cmFuc2xhdGlvbiBmdW5jdGlvbnMgbmVlZCB0bwotICogd29yayBhcm91bmQgdGhlIGFjY2VzcyByZXN0cmljdGlvbiBieSB1c2luZyB0aGUgcHVibGljbHkgYXZhaWxhYmxlCi0gKiBgZmxhdHRlbigpYCBhbmQgYHVuZmxhdHRlbigpYCBmdW5jdGlvbnMuCi0gKgotICogQWxsIGBmbGF0dGVuKClgIGFuZCBgdW5mbGF0dGVuKClgIG92ZXJsb2FkcyBmb2xsb3cgdGhlIHNhbWUgY29udmVudGlvbiBhcwotICogZm9sbG93czoKLSAqCi0gKiAgICAgc3RhdHVzX3QgZmxhdHRlbihPYmplY3RUeXBlIGNvbnN0JiBvYmplY3QsCi0gKiAgICAgICAgICAgICAgICAgICAgICBbT3RoZXJUeXBlIGNvbnN0JiBvdGhlciwgLi4uXQotICogICAgICAgICAgICAgICAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLAotICogICAgICAgICAgICAgICAgICAgICAgaW50KiYgZmRzLCBzaXplX3QmIG51bUZkcykKLSAqCi0gKiAgICAgc3RhdHVzX3QgdW5mbGF0dGVuKE9iamVjdFR5cGUqIG9iamVjdCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgW090aGVyVHlwZSogb3RoZXIsIC4uLixdCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgaW50KiYgZmRzLCBzaXplX3QmIG51bUZkcykKLSAqCi0gKiBUaGUgbnVtYmVyIG9mIGBvdGhlcmAgcGFyYW1ldGVycyB2YXJpZXMgZGVwZW5kaW5nIG9uIHRoZSBgT2JqZWN0VHlwZWAuIEZvcgotICogZXhhbXBsZSwgaW4gdGhlIHByb2Nlc3Mgb2YgdW5mbGF0dGVuaW5nIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zCi0gKiBgaGlkbF9oYW5kbGVgLCBgb3RoZXJgIGlzIG5lZWRlZCB0byBob2xkIGBuYXRpdmVfaGFuZGxlX3RgIG9iamVjdHMgdGhhdCB3aWxsCi0gKiBiZSBjcmVhdGVkLgotICoKLSAqIFRoZSBsYXN0IGZvdXIgcGFyYW1ldGVycyBhbHdheXMgd29yayB0aGUgc2FtZSB3YXkgaW4gYWxsIG92ZXJsb2FkcyBvZgotICogYGZsYXR0ZW4oKWAgYW5kIGB1bmZsYXR0ZW4oKWA6Ci0gKiAtIEZvciBgZmxhdHRlbigpYCwgYGJ1ZmZlcmAgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIG5vbi1mZCBidWZmZXIgdG8gYmUgZmlsbGVkLAotICogICBgc2l6ZWAgaXMgdGhlIHNpemUgKGluIGJ5dGVzKSBvZiB0aGUgbm9uLWZkIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IGBidWZmZXJgLAotICogICBgZmRzYCBpcyB0aGUgcG9pbnRlciB0byB0aGUgZmQgYnVmZmVyIHRvIGJlIGZpbGxlZCwgYW5kIGBudW1GZHNgIGlzIHRoZQotICogICBzaXplIChpbiBpbnRzKSBvZiB0aGUgZmQgYnVmZmVyIHBvaW50ZWQgdG8gYnkgYGZkc2AuCi0gKiAtIEZvciBgdW5mbGF0dGVuKClgLCBgYnVmZmVyYCBpcyB0aGUgcG9pbnRlciB0byB0aGUgbm9uLWZkIGJ1ZmZlciB0byBiZSByZWFkCi0gKiAgIGZyb20sIGBzaXplYCBpcyB0aGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSBub24tZmQgYnVmZmVyIHBvaW50ZWQgdG8gYnkKLSAqICAgYGJ1ZmZlcmAsIGBmZHNgIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBmZCBidWZmZXIgdG8gYmUgcmVhZCBmcm9tLCBhbmQKLSAqICAgYG51bUZkc2AgaXMgdGhlIHNpemUgKGluIGludHMpIG9mIHRoZSBmZCBidWZmZXIgcG9pbnRlZCB0byBieSBgZmRzYC4KLSAqIC0gQWZ0ZXIgYSBzdWNjZXNzZnVsIGNhbGwgdG8gYGZsYXR0ZW4oKWAgb3IgYHVuZmxhdHRlbigpYCwgYGJ1ZmZlcmAgYW5kIGBmZHNgCi0gKiAgIHdpbGwgYmUgYWR2YW5jZWQsIHdoaWxlIGBzaXplYCBhbmQgYG51bUZkc2Agd2lsbCBiZSBkZWNyZWFzZWQgdG8gcmVmbGVjdAotICogICBob3cgbXVjaCBzdG9yYWdlL2RhdGEgb2YgdGhlIHR3byBidWZmZXJzIChmZCBhbmQgbm9uLWZkKSBoYXZlIGJlZW4gdXNlZC4KLSAqIC0gQWZ0ZXIgYW4gdW5zdWNjZXNzZnVsIGNhbGwsIHRoZSB2YWx1ZXMgb2YgYGJ1ZmZlcmAsIGBzaXplYCwgYGZkc2AgYW5kCi0gKiAgIGBudW1GZHNgIGFyZSBpbnZhbGlkLgotICoKLSAqIFRoZSByZXR1cm4gdmFsdWUgb2YgYSBzdWNjZXNzZnVsIGBmbGF0dGVuKClgIG9yIGB1bmZsYXR0ZW4oKWAgY2FsbCB3aWxsIGJlCi0gKiBgT0tgIChhbHNvIGFsaWFzZWQgYXMgYE5PX0VSUk9SYCkuIEFueSBvdGhlciB2YWx1ZXMgaW5kaWNhdGUgYSBmYWlsdXJlLgotICoKLSAqIEZvciBlYWNoIG9iamVjdCB0eXBlIHRoYXQgc3VwcG9ydHMgZmxhdHRlbmluZywgdGhlcmUgd2lsbCBiZSB0d28gYWNjb21wYW55aW5nCi0gKiBmdW5jdGlvbnM6IGBnZXRGbGF0dGVuZWRTaXplKClgIGFuZCBgZ2V0RmRDb3VudCgpYC4gYGdldEZsYXR0ZW5lZFNpemUoKWAgd2lsbAotICogcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub24tZmQgYnVmZmVyIHRoYXQgdGhlIG9iamVjdCB3aWxsIG5lZWQgZm9yCi0gKiBmbGF0dGVuaW5nLiBgZ2V0RmRDb3VudCgpYCB3aWxsIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgZmQgYnVmZmVyIHRoYXQgdGhlCi0gKiBvYmplY3Qgd2lsbCBuZWVkIGZvciBmbGF0dGVuaW5nLgotICoKLSAqIFRoZSBzZXQgb2YgdGhlc2UgZm91ciBmdW5jdGlvbnMsIGBnZXRGbGF0dGVuZWRTaXplKClgLCBgZ2V0RmRDb3VudCgpYCwKLSAqIGBmbGF0dGVuKClgIGFuZCBgdW5mbGF0dGVuKClgLCBhcmUgc2ltaWxhciB0byBmdW5jdGlvbnMgb2YgdGhlIHNhbWUgbmFtZSBpbgotICogdGhlIGFic3RyYWN0IGNsYXNzIGBGbGF0dGVuYWJsZWAuIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhhdCBmdW5jdGlvbnMgaW4KLSAqIHRoaXMgZmlsZSBhcmUgbm90IG1lbWJlciBmdW5jdGlvbnMgb2YgdGhlIG9iamVjdCB0eXBlLiBGb3IgZXhhbXBsZSwgd2Ugd3JpdGUKLSAqCi0gKiAgICAgZmxhdHRlbih4LCBidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKQotICoKLSAqIGluc3RlYWQgb2YKLSAqCi0gKiAgICAgeC5mbGF0dGVuKGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpCi0gKgotICogYmVjYXVzZSB3ZSBjYW5ub3QgbW9kaWZ5IHRoZSB0eXBlIG9mIGB4YC4KLSAqCi0gKiBUaGVyZSBpcyBvbmUgZXhjZXB0aW9uIHRvIHRoZSBuYW1pbmcgY29udmVudGlvbjogYGhpZGxfaGFuZGxlYCB0aGF0Ci0gKiByZXByZXNlbnRzIGEgZmVuY2UuIFRoZSBmb3VyIGZ1bmN0aW9ucyBmb3IgdGhpcyAiRmVuY2UiIHR5cGUgaGF2ZSB0aGUgd29yZAotICogIkZlbmNlIiBhdHRjaGVkIHRvIHRoZWlyIG5hbWVzIGJlY2F1c2UgdGhlIG9iamVjdCB0eXBlLCB3aGljaCBpcwotICogYGhpZGxfaGFuZGxlYCwgZG9lcyBub3QgY2FycnkgdGhlIHNwZWNpYWwgbWVhbmluZyB0aGF0IHRoZSBvYmplY3QgaXRzZWxmIGNhbgotICogb25seSBjb250YWluIHplcm8gb3Igb25lIGZpbGUgZGVzY3JpcHRvci4KLSAqLwotCi0vLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvdWkvRmVuY2UuY3BwCi0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbm9uLWZkIGJ1ZmZlciByZXF1aXJlZCB0byBmbGF0dGVuIGEgZmVuY2UuCi0gKgotICogXHBhcmFtW2luXSBmZW5jZSBUaGUgaW5wdXQgZmVuY2Ugb2YgdHlwZSBgaGlkbF9oYW5kbGVgLgotICogXHJldHVybiBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCi0gKgotICogVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zIDQsIHdoaWNoIGlzIHRoZSBudW1iZXIgb2YKLSAqIGJ5dGVzIHJlcXVpcmVkIHRvIHN0b3JlIHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gdGhlIGZkCi0gKiBwYXJ0IG9mIHRoZSBmbGF0IGJ1ZmZlci4KLSAqLwotc2l6ZV90IGdldEZlbmNlRmxhdHRlbmVkU2l6ZShoaWRsX2hhbmRsZSBjb25zdCYgLyogZmVuY2UgKi8pIHsKLSAgICByZXR1cm4gNDsKLX07Ci0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIGEgZmVuY2UuCi0gKgotICogXHBhcmFtW2luXSBmZW5jZSBUaGUgaW5wdXQgZmVuY2Ugb2YgdHlwZSBgaGlkbF9oYW5kbGVgLgotICogXHJldHVybiBgMGAgaWYgXHAgZmVuY2UgZG9lcyBub3QgY29udGFpbiBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvciwgb3IgYDFgCi0gKiBvdGhlcndpc2UuCi0gKi8KLXNpemVfdCBnZXRGZW5jZUZkQ291bnQoaGlkbF9oYW5kbGUgY29uc3QmIGZlbmNlKSB7Ci0gICAgcmV0dXJuIG5hdGl2ZV9oYW5kbGVfcmVhZF9mZChmZW5jZSkgPT0gLTEgPyAwIDogMTsKLX0KLQotLyoqCi0gKiBcYnJpZWYgVW5mbGF0dGVuIGBGZW5jZWAgdG8gYGhpZGxfaGFuZGxlYC4KLSAqCi0gKiBccGFyYW1bb3V0XSBmZW5jZSBUaGUgZGVzdGluYXRpb24gYGhpZGxfaGFuZGxlYC4KLSAqIFxwYXJhbVtvdXRdIG5oIFRoZSB1bmRlcmx5aW5nIG5hdGl2ZSBoYW5kbGUuCi0gKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKgotICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBgTk9fRVJST1JgLCBccCBuaCB3aWxsIHBvaW50IHRvIGEgbmV3bHkgY3JlYXRlZAotICogbmF0aXZlIGhhbmRsZSwgd2hpY2ggbmVlZHMgdG8gYmUgZGVsZXRlZCB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYAotICogYWZ0ZXJ3YXJkcy4KLSAqLwotc3RhdHVzX3QgdW5mbGF0dGVuRmVuY2UoaGlkbF9oYW5kbGUqIGZlbmNlLCBuYXRpdmVfaGFuZGxlX3QqKiBuaCwKLSAgICAgICAgdm9pZCBjb25zdComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQgY29uc3QqJiBmZHMsIHNpemVfdCYgbnVtRmRzKSB7Ci0gICAgaWYgKHNpemUgPCA0KSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotCi0gICAgdWludDMyX3QgbnVtRmRzSW5IYW5kbGU7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIG51bUZkc0luSGFuZGxlKTsKLQotICAgIGlmIChudW1GZHNJbkhhbmRsZSA+IDEpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBpZiAobnVtRmRzIDwgbnVtRmRzSW5IYW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0KLSAgICBpZiAobnVtRmRzSW5IYW5kbGUpIHsKLSAgICAgICAgKm5oID0gbmF0aXZlX2hhbmRsZV9jcmVhdGVfZnJvbV9mZCgqZmRzKTsKLSAgICAgICAgaWYgKCpuaCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICB9Ci0gICAgICAgICpmZW5jZSA9ICpuaDsKLSAgICAgICAgKytmZHM7Ci0gICAgICAgIC0tbnVtRmRzOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICpuaCA9IG51bGxwdHI7Ci0gICAgICAgICpmZW5jZSA9IGhpZGxfaGFuZGxlKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vKioKLSAqIFxicmllZiBGbGF0dGVuIGBoaWRsX2hhbmRsZWAgYXMgYEZlbmNlYC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgaGlkbF9oYW5kbGVgLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICovCi1zdGF0dXNfdCBmbGF0dGVuRmVuY2UoaGlkbF9oYW5kbGUgY29uc3QmIGZlbmNlLAotICAgICAgICB2b2lkKiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludComIGZkcywgc2l6ZV90JiBudW1GZHMpIHsKLSAgICBpZiAoc2l6ZSA8IGdldEZlbmNlRmxhdHRlbmVkU2l6ZShmZW5jZSkgfHwKLSAgICAgICAgICAgIG51bUZkcyA8IGdldEZlbmNlRmRDb3VudChmZW5jZSkpIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0gICAgLy8gQ2FzdCB0byB1aW50MzJfdCBzaW5jZSB0aGUgc2l6ZSBvZiBhIHNpemVfdCBjYW4gdmFyeSBiZXR3ZWVuIDMyLSBhbmQKLSAgICAvLyA2NC1iaXQgcHJvY2Vzc2VzCi0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGdldEZlbmNlRmRDb3VudChmZW5jZSkpKTsKLSAgICBpbnQgZmQgPSBuYXRpdmVfaGFuZGxlX3JlYWRfZmQoZmVuY2UpOwotICAgIGlmIChmZCAhPSAtMSkgewotICAgICAgICAqZmRzID0gZmQ7Ci0gICAgICAgICsrZmRzOwotICAgICAgICAtLW51bUZkczsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vKioKLSAqIFxicmllZiBXcmFwIGBGZW5jZWAgaW4gYGhpZGxfaGFuZGxlYC4KLSAqCi0gKiBccGFyYW1bb3V0XSB0IFRoZSB3cmFwcGVyIG9mIHR5cGUgYGhpZGxfaGFuZGxlYC4KLSAqIFxwYXJhbVtvdXRdIG5oIFRoZSBuYXRpdmUgaGFuZGxlIHBvaW50ZWQgdG8gYnkgXHAgdC4KLSAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGBGZW5jZWAuCi0gKgotICogT24gc3VjY2VzcywgXHAgbmggd2lsbCBob2xkIGEgbmV3bHkgY3JlYXRlZCBuYXRpdmUgaGFuZGxlLCB3aGljaCBtdXN0IGJlCi0gKiBkZWxldGVkIG1hbnVhbGx5IHdpdGggYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgIGFmdGVyd2FyZHMuCi0gKi8KLS8vIHdyYXA6IEZlbmNlIC0+IGhpZGxfaGFuZGxlCi1ib29sIHdyYXBBcyhoaWRsX2hhbmRsZSogdCwgbmF0aXZlX2hhbmRsZV90KiogbmgsIEZlbmNlIGNvbnN0JiBsKSB7Ci0gICAgc2l6ZV90IGNvbnN0IGJhc2VTaXplID0gbC5nZXRGbGF0dGVuZWRTaXplKCk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gYmFzZUJ1ZmZlcigKLSAgICAgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W2Jhc2VTaXplXSk7Ci0gICAgaWYgKCFiYXNlQnVmZmVyKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzaXplX3QgY29uc3QgYmFzZU51bUZkcyA9IGwuZ2V0RmRDb3VudCgpOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxpbnRbXT4gYmFzZUZkcygKLSAgICAgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSBpbnRbYmFzZU51bUZkc10pOwotICAgIGlmICghYmFzZUZkcykgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCogYnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCo+KGJhc2VCdWZmZXIuZ2V0KCkpOwotICAgIHNpemVfdCBzaXplID0gYmFzZVNpemU7Ci0gICAgaW50KiBmZHMgPSBzdGF0aWNfY2FzdDxpbnQqPihiYXNlRmRzLmdldCgpKTsKLSAgICBzaXplX3QgbnVtRmRzID0gYmFzZU51bUZkczsKLSAgICBpZiAobC5mbGF0dGVuKGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkIGNvbnN0KiBjb25zdEJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQgY29uc3QqPihiYXNlQnVmZmVyLmdldCgpKTsKLSAgICBzaXplID0gYmFzZVNpemU7Ci0gICAgaW50IGNvbnN0KiBjb25zdEZkcyA9IHN0YXRpY19jYXN0PGludCBjb25zdCo+KGJhc2VGZHMuZ2V0KCkpOwotICAgIG51bUZkcyA9IGJhc2VOdW1GZHM7Ci0gICAgaWYgKHVuZmxhdHRlbkZlbmNlKHQsIG5oLCBjb25zdEJ1ZmZlciwgc2l6ZSwgY29uc3RGZHMsIG51bUZkcykKLSAgICAgICAgICAgICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgaGlkbF9oYW5kbGVgIHRvIGBGZW5jZWAuCi0gKgotICogXHBhcmFtW291dF0gbCBUaGUgZGVzdGluYXRpb24gYEZlbmNlYC4gYGxgIG11c3Qgbm90IGhhdmUgYmVlbiB1c2VkCi0gKiAoYGwtPmlzVmFsaWQoKWAgbXVzdCByZXR1cm4gYGZhbHNlYCkgYmVmb3JlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYGhpZGxfaGFuZGxlYC4KLSAqCi0gKiBJZiBccCB0IGNvbnRhaW5zIGEgdmFsaWQgZmlsZSBkZXNjcmlwdG9yLCBpdCB3aWxsIGJlIGR1cGxpY2F0ZWQuCi0gKi8KLS8vIGNvbnZlcnQ6IGhpZGxfaGFuZGxlIC0+IEZlbmNlCi1ib29sIGNvbnZlcnRUbyhGZW5jZSogbCwgaGlkbF9oYW5kbGUgY29uc3QmIHQpIHsKLSAgICBpbnQgZmQgPSBuYXRpdmVfaGFuZGxlX3JlYWRfZmQodCk7Ci0gICAgaWYgKGZkICE9IC0xKSB7Ci0gICAgICAgIGZkID0gZHVwKGZkKTsKLSAgICAgICAgaWYgKGZkID09IC0xKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBuaCA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlX2Zyb21fZmQoZmQpOwotICAgIGlmIChuaCA9PSBudWxscHRyKSB7Ci0gICAgICAgIGlmIChmZCAhPSAtMSkgewotICAgICAgICAgICAgY2xvc2UoZmQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzaXplX3QgY29uc3QgYmFzZVNpemUgPSBnZXRGZW5jZUZsYXR0ZW5lZFNpemUodCk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gYmFzZUJ1ZmZlcigKLSAgICAgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W2Jhc2VTaXplXSk7Ci0gICAgaWYgKCFiYXNlQnVmZmVyKSB7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHNpemVfdCBjb25zdCBiYXNlTnVtRmRzID0gZ2V0RmVuY2VGZENvdW50KHQpOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxpbnRbXT4gYmFzZUZkcygKLSAgICAgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSBpbnRbYmFzZU51bUZkc10pOwotICAgIGlmICghYmFzZUZkcykgewotICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkKiBidWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkKj4oYmFzZUJ1ZmZlci5nZXQoKSk7Ci0gICAgc2l6ZV90IHNpemUgPSBiYXNlU2l6ZTsKLSAgICBpbnQqIGZkcyA9IHN0YXRpY19jYXN0PGludCo+KGJhc2VGZHMuZ2V0KCkpOwotICAgIHNpemVfdCBudW1GZHMgPSBiYXNlTnVtRmRzOwotICAgIGlmIChmbGF0dGVuRmVuY2UoaGlkbF9oYW5kbGUobmgpLCBidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKSAhPSBOT19FUlJPUikgewotICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOwotCi0gICAgdm9pZCBjb25zdCogY29uc3RCdWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkIGNvbnN0Kj4oYmFzZUJ1ZmZlci5nZXQoKSk7Ci0gICAgc2l6ZSA9IGJhc2VTaXplOwotICAgIGludCBjb25zdCogY29uc3RGZHMgPSBzdGF0aWNfY2FzdDxpbnQgY29uc3QqPihiYXNlRmRzLmdldCgpKTsKLSAgICBudW1GZHMgPSBiYXNlTnVtRmRzOwotICAgIGlmIChsLT51bmZsYXR0ZW4oY29uc3RCdWZmZXIsIHNpemUsIGNvbnN0RmRzLCBudW1GZHMpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gUmVmOiBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL3VpL0ZlbmNlVGltZS5jcHA6IEZlbmNlVGltZTo6U25hcHNob3QKLQotLyoqCi0gKiBcYnJpZWYgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub24tZmQgYnVmZmVyIHJlcXVpcmVkIHRvIGZsYXR0ZW4KLSAqIGBGZW5jZVRpbWVTbmFwc2hvdGAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgRmVuY2VUaW1lU25hcHNob3RgLgotICogXHJldHVybiBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCi0gKi8KLXNpemVfdCBnZXRGbGF0dGVuZWRTaXplKAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdCBjb25zdCYgdCkgewotICAgIGNvbnN0ZXhwciBzaXplX3QgbWluID0gc2l6ZW9mKHQuc3RhdGUpOwotICAgIHN3aXRjaCAodC5zdGF0ZSkgewotICAgICAgICBjYXNlIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90OjpTdGF0ZTo6RU1QVFk6Ci0gICAgICAgICAgICByZXR1cm4gbWluOwotICAgICAgICBjYXNlIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90OjpTdGF0ZTo6RkVOQ0U6Ci0gICAgICAgICAgICByZXR1cm4gbWluICsgZ2V0RmVuY2VGbGF0dGVuZWRTaXplKHQuZmVuY2UpOwotICAgICAgICBjYXNlIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90OjpTdGF0ZTo6U0lHTkFMX1RJTUU6Ci0gICAgICAgICAgICByZXR1cm4gbWluICsgc2l6ZW9mKAotICAgICAgICAgICAgICAgICAgICA6OmFuZHJvaWQ6OkZlbmNlVGltZTo6U25hcHNob3Q6OnNpZ25hbFRpbWUpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQotLyoqCi0gKiBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4KLSAqIGBGZW5jZVRpbWVTbmFwc2hvdGAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgRmVuY2VUaW1lU25hcHNob3RgLgotICogXHJldHVybiBUaGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHNuYXBzaG90LgotICovCi1zaXplX3QgZ2V0RmRDb3VudCgKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3QgY29uc3QmIHQpIHsKLSAgICByZXR1cm4gdC5zdGF0ZSA9PQotICAgICAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3Q6OlN0YXRlOjpGRU5DRSA/Ci0gICAgICAgICAgICBnZXRGZW5jZUZkQ291bnQodC5mZW5jZSkgOiAwOwotfQotCi0vKioKLSAqIFxicmllZiBGbGF0dGVuIGBGZW5jZVRpbWVTbmFwc2hvdGAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYEZlbmNlVGltZVNuYXBzaG90YC4KLSAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZHVwbGljYXRlIHRoZSBmaWxlIGRlc2NyaXB0b3IgaW4gYHQuZmVuY2VgIGlmIGB0LnN0YXRlID09Ci0gKiBGRU5DRWAuCi0gKi8KLXN0YXR1c190IGZsYXR0ZW4oSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3QgY29uc3QmIHQsCi0gICAgICAgIHZvaWQqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50KiYgZmRzLCBzaXplX3QmIG51bUZkcykgewotICAgIGlmIChzaXplIDwgZ2V0RmxhdHRlbmVkU2l6ZSh0KSkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLQotICAgIHN3aXRjaCAodC5zdGF0ZSkgewotICAgICAgICBjYXNlIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90OjpTdGF0ZTo6RU1QVFk6Ci0gICAgICAgICAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsCi0gICAgICAgICAgICAgICAgICAgIDo6YW5kcm9pZDo6RmVuY2VUaW1lOjpTbmFwc2hvdDo6U3RhdGU6OkVNUFRZKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgY2FzZSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdDo6U3RhdGU6OkZFTkNFOgotICAgICAgICAgICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLAotICAgICAgICAgICAgICAgICAgICA6OmFuZHJvaWQ6OkZlbmNlVGltZTo6U25hcHNob3Q6OlN0YXRlOjpGRU5DRSk7Ci0gICAgICAgICAgICByZXR1cm4gZmxhdHRlbkZlbmNlKHQuZmVuY2UsIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpOwotICAgICAgICBjYXNlIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90OjpTdGF0ZTo6U0lHTkFMX1RJTUU6Ci0gICAgICAgICAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsCi0gICAgICAgICAgICAgICAgICAgIDo6YW5kcm9pZDo6RmVuY2VUaW1lOjpTbmFwc2hvdDo6U3RhdGU6OlNJR05BTF9USU1FKTsKLSAgICAgICAgICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5zaWduYWxUaW1lTnMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8qKgotICogXGJyaWVmIFVuZmxhdHRlbiBgRmVuY2VUaW1lU25hcHNob3RgLgotICoKLSAqIFxwYXJhbVtvdXRdIHQgVGhlIGRlc3RpbmF0aW9uIGBGZW5jZVRpbWVTbmFwc2hvdGAuCi0gKiBccGFyYW1bb3V0XSBuaCBUaGUgdW5kZXJseWluZyBuYXRpdmUgaGFuZGxlLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICoKLSAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYE5PX0VSUk9SYCBhbmQgdGhlIGNvbnN0cnVjdGVkIHNuYXBzaG90IGNvbnRhaW5zIGEKLSAqIGZpbGUgZGVzY3JpcHRvciwgXHAgbmggd2lsbCBiZSBjcmVhdGVkIHRvIGhvbGQgdGhhdCBmaWxlIGRlc2NyaXB0b3IuIEluIHRoaXMKLSAqIGNhc2UsIFxwIG5oIG5lZWRzIHRvIGJlIGRlbGV0ZWQgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAgYWZ0ZXJ3YXJkcy4KLSAqLwotc3RhdHVzX3QgdW5mbGF0dGVuKAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdCogdCwgbmF0aXZlX2hhbmRsZV90KiogbmgsCi0gICAgICAgIHZvaWQgY29uc3QqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50IGNvbnN0KiYgZmRzLCBzaXplX3QmIG51bUZkcykgewotICAgIGlmIChzaXplIDwgc2l6ZW9mKHQtPnN0YXRlKSkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLQotICAgICpuaCA9IG51bGxwdHI7Ci0gICAgOjphbmRyb2lkOjpGZW5jZVRpbWU6OlNuYXBzaG90OjpTdGF0ZSBzdGF0ZTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgc3RhdGUpOwotICAgIHN3aXRjaCAoc3RhdGUpIHsKLSAgICAgICAgY2FzZSA6OmFuZHJvaWQ6OkZlbmNlVGltZTo6U25hcHNob3Q6OlN0YXRlOjpFTVBUWToKLSAgICAgICAgICAgIHQtPnN0YXRlID0gSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3Q6OlN0YXRlOjpFTVBUWTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgY2FzZSA6OmFuZHJvaWQ6OkZlbmNlVGltZTo6U25hcHNob3Q6OlN0YXRlOjpGRU5DRToKLSAgICAgICAgICAgIHQtPnN0YXRlID0gSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3Q6OlN0YXRlOjpGRU5DRTsKLSAgICAgICAgICAgIHJldHVybiB1bmZsYXR0ZW5GZW5jZSgmdC0+ZmVuY2UsIG5oLCBidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKTsKLSAgICAgICAgY2FzZSA6OmFuZHJvaWQ6OkZlbmNlVGltZTo6U25hcHNob3Q6OlN0YXRlOjpTSUdOQUxfVElNRToKLSAgICAgICAgICAgIHQtPnN0YXRlID0gSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3Q6OlN0YXRlOjpTSUdOQUxfVElNRTsKLSAgICAgICAgICAgIGlmIChzaXplIDwgc2l6ZW9mKHQtPnNpZ25hbFRpbWVOcykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHQtPnNpZ25hbFRpbWVOcyk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLy8gUmVmOiBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL2d1aS9GcmFtZVRpbWVzdGFtcHMuY3BwOiBGcmFtZUV2ZW50c0RlbHRhCi0KLS8qKgotICogXGJyaWVmIFJldHVybiBhIGxvd2VyIGJvdW5kIG9uIHRoZSBzaXplIG9mIHRoZSBub24tZmQgYnVmZmVyIHJlcXVpcmVkIHRvCi0gKiBmbGF0dGVuIGBGcmFtZUV2ZW50c0RlbHRhYC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBGcmFtZUV2ZW50c0RlbHRhYC4KLSAqIFxyZXR1cm4gQSBsb3dlciBib3VuZCBvbiB0aGUgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCi0gKi8KLWNvbnN0ZXhwciBzaXplX3QgbWluRmxhdHRlbmVkU2l6ZSgKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudHNEZWx0YSBjb25zdCYgLyogdCAqLykgewotICAgIHJldHVybiBzaXplb2YodWludDY0X3QpICsgLy8gbUZyYW1lTnVtYmVyCi0gICAgICAgICAgICBzaXplb2YodWludDhfdCkgKyAvLyBtSW5kZXgKLSAgICAgICAgICAgIHNpemVvZih1aW50OF90KSArIC8vIG1BZGRQb3N0Q29tcG9zaXRlQ2FsbGVkCi0gICAgICAgICAgICBzaXplb2YodWludDhfdCkgKyAvLyBtQWRkUmV0aXJlQ2FsbGVkCi0gICAgICAgICAgICBzaXplb2YodWludDhfdCkgKyAvLyBtQWRkUmVsZWFzZUNhbGxlZAotICAgICAgICAgICAgc2l6ZW9mKG5zZWNzX3QpICsgLy8gbVBvc3RlZFRpbWUKLSAgICAgICAgICAgIHNpemVvZihuc2Vjc190KSArIC8vIG1SZXF1ZXN0ZWRQcmVzZW50VGltZQotICAgICAgICAgICAgc2l6ZW9mKG5zZWNzX3QpICsgLy8gbUxhdGNoVGltZQotICAgICAgICAgICAgc2l6ZW9mKG5zZWNzX3QpICsgLy8gbUZpcnN0UmVmcmVzaFN0YXJ0VGltZQotICAgICAgICAgICAgc2l6ZW9mKG5zZWNzX3QpOyAvLyBtTGFzdFJlZnJlc2hTdGFydFRpbWUKLX0KLQotLyoqCi0gKiBcYnJpZWYgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub24tZmQgYnVmZmVyIHJlcXVpcmVkIHRvIGZsYXR0ZW4KLSAqIGBGcmFtZUV2ZW50c0RlbHRhYC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBGcmFtZUV2ZW50c0RlbHRhYC4KLSAqIFxyZXR1cm4gVGhlIHJlcXVpcmVkIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgotICovCi1zaXplX3QgZ2V0RmxhdHRlbmVkU2l6ZSgKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudHNEZWx0YSBjb25zdCYgdCkgewotICAgIHJldHVybiBtaW5GbGF0dGVuZWRTaXplKHQpICsKLSAgICAgICAgICAgIGdldEZsYXR0ZW5lZFNpemUodC5ncHVDb21wb3NpdGlvbkRvbmVGZW5jZSkgKwotICAgICAgICAgICAgZ2V0RmxhdHRlbmVkU2l6ZSh0LmRpc3BsYXlQcmVzZW50RmVuY2UpICsKLSAgICAgICAgICAgIGdldEZsYXR0ZW5lZFNpemUodC5kaXNwbGF5UmV0aXJlRmVuY2UpICsKLSAgICAgICAgICAgIGdldEZsYXR0ZW5lZFNpemUodC5yZWxlYXNlRmVuY2UpOwotfTsKLQotLyoqCi0gKiBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4KLSAqIGBGcmFtZUV2ZW50c0RlbHRhYC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBGcmFtZUV2ZW50c0RlbHRhYC4KLSAqIFxyZXR1cm4gVGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBccCB0LgotICovCi1zaXplX3QgZ2V0RmRDb3VudCgKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudHNEZWx0YSBjb25zdCYgdCkgewotICAgIHJldHVybiBnZXRGZENvdW50KHQuZ3B1Q29tcG9zaXRpb25Eb25lRmVuY2UpICsKLSAgICAgICAgICAgIGdldEZkQ291bnQodC5kaXNwbGF5UHJlc2VudEZlbmNlKSArCi0gICAgICAgICAgICBnZXRGZENvdW50KHQuZGlzcGxheVJldGlyZUZlbmNlKSArCi0gICAgICAgICAgICBnZXRGZENvdW50KHQucmVsZWFzZUZlbmNlKTsKLX07Ci0KLS8qKgotICogXGJyaWVmIFVuZmxhdHRlbiBgRnJhbWVFdmVudHNEZWx0YWAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgZGVzdGluYXRpb24gYEZyYW1lRXZlbnRzRGVsdGFgLgotICogXHBhcmFtW291dF0gbmggVGhlIHVuZGVybHlpbmcgYXJyYXkgb2YgbmF0aXZlIGhhbmRsZXMuCi0gKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKgotICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBgTk9fRVJST1JgLCBccCBuaCB3aWxsIGhhdmUgbGVuZ3RoIDQsIGFuZCBpdCB3aWxsIGJlCi0gKiBwb3B1bGF0ZWQgd2l0aCBgbnVsbHB0cmAgb3IgbmV3bHkgY3JlYXRlZCBoYW5kbGVzLiBFYWNoIG5vbi1udWxsIHNsb3QgaW4gXHAKLSAqIG5oIHdpbGwgbmVlZCB0byBiZSBkZWxldGVkIG1hbnVhbGx5IHdpdGggYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgLgotICovCi1zdGF0dXNfdCB1bmZsYXR0ZW4oSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudHNEZWx0YSogdCwKLSAgICAgICAgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4qIG5oLAotICAgICAgICB2b2lkIGNvbnN0KiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludCBjb25zdComIGZkcywgc2l6ZV90JiBudW1GZHMpIHsKLSAgICBpZiAoc2l6ZSA8IG1pbkZsYXR0ZW5lZFNpemUoKnQpKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5mcmFtZU51bWJlcik7Ci0KLSAgICAvLyBUaGVzZSB3ZXJlIHdyaXR0ZW4gYXMgdWludDhfdCBmb3IgYWxpZ25tZW50LgotICAgIHVpbnQ4X3QgdGVtcCA9IDA7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHRlbXApOwotICAgIHNpemVfdCBpbmRleCA9IHN0YXRpY19jYXN0PHNpemVfdD4odGVtcCk7Ci0gICAgaWYgKGluZGV4ID49IDo6YW5kcm9pZDo6RnJhbWVFdmVudEhpc3Rvcnk6Ok1BWF9GUkFNRV9ISVNUT1JZKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHQtPmluZGV4ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGluZGV4KTsKLQotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0ZW1wKTsKLSAgICB0LT5hZGRQb3N0Q29tcG9zaXRlQ2FsbGVkID0gc3RhdGljX2Nhc3Q8Ym9vbD4odGVtcCk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHRlbXApOwotICAgIHQtPmFkZFJldGlyZUNhbGxlZCA9IHN0YXRpY19jYXN0PGJvb2w+KHRlbXApOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0ZW1wKTsKLSAgICB0LT5hZGRSZWxlYXNlQ2FsbGVkID0gc3RhdGljX2Nhc3Q8Ym9vbD4odGVtcCk7Ci0KLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdC0+cG9zdGVkVGltZU5zKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdC0+cmVxdWVzdGVkUHJlc2VudFRpbWVOcyk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHQtPmxhdGNoVGltZU5zKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdC0+Zmlyc3RSZWZyZXNoU3RhcnRUaW1lTnMpOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5sYXN0UmVmcmVzaFN0YXJ0VGltZU5zKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdC0+ZGVxdWV1ZVJlYWR5VGltZSk7Ci0KLSAgICAvLyBGZW5jZXMKLSAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdCogdFNuYXBzaG90WzRdOwotICAgIHRTbmFwc2hvdFswXSA9ICZ0LT5ncHVDb21wb3NpdGlvbkRvbmVGZW5jZTsKLSAgICB0U25hcHNob3RbMV0gPSAmdC0+ZGlzcGxheVByZXNlbnRGZW5jZTsKLSAgICB0U25hcHNob3RbMl0gPSAmdC0+ZGlzcGxheVJldGlyZUZlbmNlOwotICAgIHRTbmFwc2hvdFszXSA9ICZ0LT5yZWxlYXNlRmVuY2U7Ci0gICAgbmgtPnJlc2l6ZSg0KTsKLSAgICBmb3IgKHNpemVfdCBzbmFwc2hvdEluZGV4ID0gMDsgc25hcHNob3RJbmRleCA8IDQ7ICsrc25hcHNob3RJbmRleCkgewotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSB1bmZsYXR0ZW4oCi0gICAgICAgICAgICAgICAgdFNuYXBzaG90W3NuYXBzaG90SW5kZXhdLCAmKCgqbmgpW3NuYXBzaG90SW5kZXhdKSwKLSAgICAgICAgICAgICAgICBidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgd2hpbGUgKHNuYXBzaG90SW5kZXggPiAwKSB7Ci0gICAgICAgICAgICAgICAgLS1zbmFwc2hvdEluZGV4OwotICAgICAgICAgICAgICAgIGlmICgoKm5oKVtzbmFwc2hvdEluZGV4XSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKCgqbmgpW3NuYXBzaG90SW5kZXhdKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLyoqCi0gKiBcYnJpZWYgRmxhdHRlbiBgRnJhbWVFdmVudHNEZWx0YWAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYEZyYW1lRXZlbnRzRGVsdGFgLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gXHAgdC4KLSAqLwotLy8gUmVmOiBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL2d1aS9GcmFtZVRpbWVzdGFtcC5jcHA6Ci0vLyAgICAgIEZyYW1lRXZlbnRzRGVsdGE6OmZsYXR0ZW4KLXN0YXR1c190IGZsYXR0ZW4oSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudHNEZWx0YSBjb25zdCYgdCwKLSAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQqJiBmZHMsIHNpemVfdCBudW1GZHMpIHsKLSAgICAvLyBDaGVjayB0aGF0IHQuaW5kZXggaXMgd2l0aGluIGEgdmFsaWQgcmFuZ2UuCi0gICAgaWYgKHQuaW5kZXggPj0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KEZyYW1lRXZlbnRIaXN0b3J5OjpNQVhfRlJBTUVfSElTVE9SWSkKLSAgICAgICAgICAgIHx8IHQuaW5kZXggPiBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ4X3Q+OjptYXgoKSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5mcmFtZU51bWJlcik7Ci0KLSAgICAvLyBUaGVzZSBhcmUgc3RhdGljX2Nhc3QgdG8gdWludDhfdCBmb3IgYWxpZ25tZW50LgotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgc3RhdGljX2Nhc3Q8dWludDhfdD4odC5pbmRleCkpOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKAotICAgICAgICAgICAgYnVmZmVyLCBzaXplLCBzdGF0aWNfY2FzdDx1aW50OF90Pih0LmFkZFBvc3RDb21wb3NpdGVDYWxsZWQpKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZSgKLSAgICAgICAgICAgIGJ1ZmZlciwgc2l6ZSwgc3RhdGljX2Nhc3Q8dWludDhfdD4odC5hZGRSZXRpcmVDYWxsZWQpKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZSgKLSAgICAgICAgICAgIGJ1ZmZlciwgc2l6ZSwgc3RhdGljX2Nhc3Q8dWludDhfdD4odC5hZGRSZWxlYXNlQ2FsbGVkKSk7Ci0KLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHQucG9zdGVkVGltZU5zKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHQucmVxdWVzdGVkUHJlc2VudFRpbWVOcyk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0LmxhdGNoVGltZU5zKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHQuZmlyc3RSZWZyZXNoU3RhcnRUaW1lTnMpOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5sYXN0UmVmcmVzaFN0YXJ0VGltZU5zKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHQuZGVxdWV1ZVJlYWR5VGltZSk7Ci0KLSAgICAvLyBGZW5jZXMKLSAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdCBjb25zdCogdFNuYXBzaG90WzRdOwotICAgIHRTbmFwc2hvdFswXSA9ICZ0LmdwdUNvbXBvc2l0aW9uRG9uZUZlbmNlOwotICAgIHRTbmFwc2hvdFsxXSA9ICZ0LmRpc3BsYXlQcmVzZW50RmVuY2U7Ci0gICAgdFNuYXBzaG90WzJdID0gJnQuZGlzcGxheVJldGlyZUZlbmNlOwotICAgIHRTbmFwc2hvdFszXSA9ICZ0LnJlbGVhc2VGZW5jZTsKLSAgICBmb3IgKHNpemVfdCBzbmFwc2hvdEluZGV4ID0gMDsgc25hcHNob3RJbmRleCA8IDQ7ICsrc25hcHNob3RJbmRleCkgewotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBmbGF0dGVuKAotICAgICAgICAgICAgICAgICoodFNuYXBzaG90W3NuYXBzaG90SW5kZXhdKSwgYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcyk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvZ3VpL0ZyYW1lVGltZXN0YW1wcy5jcHA6IEZyYW1lRXZlbnRIaXN0b3J5RGVsdGEKLQotLyoqCi0gKiBcYnJpZWYgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub24tZmQgYnVmZmVyIHJlcXVpcmVkIHRvIGZsYXR0ZW4KLSAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqIFxyZXR1cm4gVGhlIHJlcXVpcmVkIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgotICovCi1zaXplX3QgZ2V0RmxhdHRlbmVkU2l6ZSgKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSBjb25zdCYgdCkgewotICAgIHNpemVfdCBzaXplID0gNCArIC8vIG1EZWx0YXMuc2l6ZSgpCi0gICAgICAgICAgICBzaXplb2YodC5jb21wb3NpdG9yVGltaW5nKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHQuZGVsdGFzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHNpemUgKz0gZ2V0RmxhdHRlbmVkU2l6ZSh0LmRlbHRhc1tpXSk7Ci0gICAgfQotICAgIHJldHVybiBzaXplOwotfQotCi0vKioKLSAqIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbgotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICogXHJldHVybiBUaGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHQuCi0gKi8KLXNpemVfdCBnZXRGZENvdW50KAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIGNvbnN0JiB0KSB7Ci0gICAgc2l6ZV90IG51bUZkcyA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0LmRlbHRhcy5zaXplKCk7ICsraSkgewotICAgICAgICBudW1GZHMgKz0gZ2V0RmRDb3VudCh0LmRlbHRhc1tpXSk7Ci0gICAgfQotICAgIHJldHVybiBudW1GZHM7Ci19Ci0KLS8qKgotICogXGJyaWVmIFVuZmxhdHRlbiBgRnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgZGVzdGluYXRpb24gYEZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICogXHBhcmFtW291dF0gbmggVGhlIHVuZGVybHlpbmcgYXJyYXkgb2YgYXJyYXlzIG9mIG5hdGl2ZSBoYW5kbGVzLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICoKLSAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYE5PX0VSUk9SYCwgXHAgbmggd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCBgbnVsbHB0cmAgb3IKLSAqIG5ld2x5IGNyZWF0ZWQgaGFuZGxlcy4gVGhlIHNlY29uZCBkaW1lbnNpb24gb2YgXHAgbmggd2lsbCBiZSA0LiBFYWNoIG5vbi1udWxsCi0gKiBzbG90IGluIFxwIG5oIHdpbGwgbmVlZCB0byBiZSBkZWxldGVkIG1hbnVhbGx5IHdpdGggYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgLgotICovCi1zdGF0dXNfdCB1bmZsYXR0ZW4oCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEqIHQsCi0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+ID4qIG5oLAotICAgICAgICB2b2lkIGNvbnN0KiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludCBjb25zdComIGZkcywgc2l6ZV90JiBudW1GZHMpIHsKLSAgICBpZiAoc2l6ZSA8IDQpIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0KLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdC0+Y29tcG9zaXRvclRpbWluZyk7Ci0KLSAgICB1aW50MzJfdCBkZWx0YUNvdW50ID0gMDsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgZGVsdGFDb3VudCk7Ci0gICAgaWYgKHN0YXRpY19jYXN0PHNpemVfdD4oZGVsdGFDb3VudCkgPgotICAgICAgICAgICAgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeTo6TUFYX0ZSQU1FX0hJU1RPUlkpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgdC0+ZGVsdGFzLnJlc2l6ZShkZWx0YUNvdW50KTsKLSAgICBuaC0+cmVzaXplKGRlbHRhQ291bnQpOwotICAgIGZvciAoc2l6ZV90IGRlbHRhSW5kZXggPSAwOyBkZWx0YUluZGV4IDwgZGVsdGFDb3VudDsgKytkZWx0YUluZGV4KSB7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHVuZmxhdHRlbigKLSAgICAgICAgICAgICAgICAmKHQtPmRlbHRhc1tkZWx0YUluZGV4XSksICYoKCpuaClbZGVsdGFJbmRleF0pLAotICAgICAgICAgICAgICAgIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLyoqCi0gKiBcYnJpZWYgRmxhdHRlbiBgRnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYEZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gXHAgdC4KLSAqLwotc3RhdHVzX3QgZmxhdHRlbigKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSBjb25zdCYgdCwKLSAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQqJiBmZHMsIHNpemVfdCYgbnVtRmRzKSB7Ci0gICAgaWYgKHQuZGVsdGFzLnNpemUoKSA+IDo6YW5kcm9pZDo6RnJhbWVFdmVudEhpc3Rvcnk6Ok1BWF9GUkFNRV9ISVNUT1JZKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIGlmIChzaXplIDwgZ2V0RmxhdHRlbmVkU2l6ZSh0KSkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLQotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5jb21wb3NpdG9yVGltaW5nKTsKLQotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHQuZGVsdGFzLnNpemUoKSkpOwotICAgIGZvciAoc2l6ZV90IGRlbHRhSW5kZXggPSAwOyBkZWx0YUluZGV4IDwgdC5kZWx0YXMuc2l6ZSgpOyArK2RlbHRhSW5kZXgpIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZmxhdHRlbih0LmRlbHRhc1tkZWx0YUluZGV4XSwgYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcyk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vKioKLSAqIFxicmllZiBXcmFwIGA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGF0YWAgaW4KLSAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqCi0gKiBccGFyYW1bb3V0XSB0IFRoZSB3cmFwcGVyIG9mIHR5cGUKLSAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqIFxwYXJhbVtvdXRdIG5oIFRoZSBhcnJheSBvZiBhcnJheSBvZiBuYXRpdmUgaGFuZGxlcyB0aGF0IGFyZSByZWZlcnJlZCB0byBieQotICogbWVtYmVycyBvZiBccCB0LgotICogXHBhcmFtW2luXSBsIFRoZSBzb3VyY2UgYDo6YW5kcm9pZDo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKgotICogT24gc3VjY2VzcywgZWFjaCBtZW1iZXIgb2YgXHAgbmggd2lsbCBiZSBlaXRoZXIgYG51bGxwdHJgIG9yIGEgbmV3bHkgY3JlYXRlZAotICogbmF0aXZlIGhhbmRsZS4gQWxsIHRoZSBub24tYG51bGxwdHJgIGVsZW1lbnRzIG11c3QgYmUgZGVsZXRlZCBpbmRpdmlkdWFsbHkKLSAqIHdpdGggYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgLgotICovCi1ib29sIHdyYXBBcyhIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhKiB0LAotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiA+KiBuaCwKLSAgICAgICAgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIGNvbnN0JiBsKSB7Ci0KLSAgICBzaXplX3QgY29uc3QgYmFzZVNpemUgPSBsLmdldEZsYXR0ZW5lZFNpemUoKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBiYXNlQnVmZmVyKAotICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3RbYmFzZVNpemVdKTsKLSAgICBpZiAoIWJhc2VCdWZmZXIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHNpemVfdCBjb25zdCBiYXNlTnVtRmRzID0gbC5nZXRGZENvdW50KCk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPGludFtdPiBiYXNlRmRzKAotICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIGludFtiYXNlTnVtRmRzXSk7Ci0gICAgaWYgKCFiYXNlRmRzKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkKiBidWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkKj4oYmFzZUJ1ZmZlci5nZXQoKSk7Ci0gICAgc2l6ZV90IHNpemUgPSBiYXNlU2l6ZTsKLSAgICBpbnQqIGZkcyA9IGJhc2VGZHMuZ2V0KCk7Ci0gICAgc2l6ZV90IG51bUZkcyA9IGJhc2VOdW1GZHM7Ci0gICAgaWYgKGwuZmxhdHRlbihidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCBjb25zdCogY29uc3RCdWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkIGNvbnN0Kj4oYmFzZUJ1ZmZlci5nZXQoKSk7Ci0gICAgc2l6ZSA9IGJhc2VTaXplOwotICAgIGludCBjb25zdCogY29uc3RGZHMgPSBzdGF0aWNfY2FzdDxpbnQgY29uc3QqPihiYXNlRmRzLmdldCgpKTsKLSAgICBudW1GZHMgPSBiYXNlTnVtRmRzOwotICAgIGlmICh1bmZsYXR0ZW4odCwgbmgsIGNvbnN0QnVmZmVyLCBzaXplLCBjb25zdEZkcywgbnVtRmRzKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgIHRvCi0gKiBgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqCi0gKiBccGFyYW1bb3V0XSBsIFRoZSBkZXN0aW5hdGlvbiBgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZHVwbGljYXRlIGFsbCBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBccCB0LgotICovCi1ib29sIGNvbnZlcnRUbygKLSAgICAgICAgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhKiBsLAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIGNvbnN0JiB0KSB7Ci0KLSAgICBzaXplX3QgY29uc3QgYmFzZVNpemUgPSBnZXRGbGF0dGVuZWRTaXplKHQpOwotICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGJhc2VCdWZmZXIoCi0gICAgICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtiYXNlU2l6ZV0pOwotICAgIGlmICghYmFzZUJ1ZmZlcikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc2l6ZV90IGNvbnN0IGJhc2VOdW1GZHMgPSBnZXRGZENvdW50KHQpOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxpbnRbXT4gYmFzZUZkcygKLSAgICAgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSBpbnRbYmFzZU51bUZkc10pOwotICAgIGlmICghYmFzZUZkcykgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCogYnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCo+KGJhc2VCdWZmZXIuZ2V0KCkpOwotICAgIHNpemVfdCBzaXplID0gYmFzZVNpemU7Ci0gICAgaW50KiBmZHMgPSBzdGF0aWNfY2FzdDxpbnQqPihiYXNlRmRzLmdldCgpKTsKLSAgICBzaXplX3QgbnVtRmRzID0gYmFzZU51bUZkczsKLSAgICBpZiAoZmxhdHRlbih0LCBidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCBjb25zdCogY29uc3RCdWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkIGNvbnN0Kj4oYmFzZUJ1ZmZlci5nZXQoKSk7Ci0gICAgc2l6ZSA9IGJhc2VTaXplOwotICAgIGludCBjb25zdCogY29uc3RGZHMgPSBzdGF0aWNfY2FzdDxpbnQgY29uc3QqPihiYXNlRmRzLmdldCgpKTsKLSAgICBudW1GZHMgPSBiYXNlTnVtRmRzOwotICAgIGlmIChsLT51bmZsYXR0ZW4oY29uc3RCdWZmZXIsIHNpemUsIGNvbnN0RmRzLCBudW1GZHMpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gUmVmOiBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL3VpL1JlZ2lvbi5jcHAKLQotLyoqCi0gKiBcYnJpZWYgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgcmVxdWlyZWQgdG8gZmxhdHRlbiBgUmVnaW9uYC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBSZWdpb25gLgotICogXHJldHVybiBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCi0gKi8KLXNpemVfdCBnZXRGbGF0dGVuZWRTaXplKFJlZ2lvbiBjb25zdCYgdCkgewotICAgIHJldHVybiBzaXplb2YodWludDMyX3QpICsgdC5zaXplKCkgKiBzaXplb2YoOjphbmRyb2lkOjpSZWN0KTsKLX0KLQotLyoqCi0gKiBcYnJpZWYgVW5mbGF0dGVuIGBSZWdpb25gLgotICoKLSAqIFxwYXJhbVtvdXRdIHQgVGhlIGRlc3RpbmF0aW9uIGBSZWdpb25gLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKi8KLXN0YXR1c190IHVuZmxhdHRlbihSZWdpb24qIHQsIHZvaWQgY29uc3QqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSkgewotICAgIGlmIChzaXplIDwgc2l6ZW9mKHVpbnQzMl90KSkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLQotICAgIHVpbnQzMl90IG51bVJlY3RzID0gMDsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgbnVtUmVjdHMpOwotICAgIGlmIChzaXplIDwgbnVtUmVjdHMgKiBzaXplb2YoUmVjdCkpIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0gICAgaWYgKG51bVJlY3RzID4gKFVJTlQzMl9NQVggLyBzaXplb2YoUmVjdCkpKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotCi0gICAgdC0+cmVzaXplKG51bVJlY3RzKTsKLSAgICBmb3IgKHNpemVfdCByID0gMDsgciA8IG51bVJlY3RzOyArK3IpIHsKLSAgICAgICAgOjphbmRyb2lkOjpSZWN0IHJlY3QoOjphbmRyb2lkOjpSZWN0OjpFTVBUWV9SRUNUKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVjdC51bmZsYXR0ZW4oYnVmZmVyLCBzaXplKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBGbGF0dGVuYWJsZVV0aWxzOjphZHZhbmNlKGJ1ZmZlciwgc2l6ZSwgc2l6ZW9mKHJlY3QpKTsKLSAgICAgICAgKCp0KVtyXSA9IFJlY3R7Ci0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVjdC5sZWZ0KSwKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihyZWN0LnRvcCksCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVjdC5yaWdodCksCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVjdC5ib3R0b20pfTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vKioKLSAqIFxicmllZiBGbGF0dGVuIGBSZWdpb25gLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBSZWdpb25gLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKi8KLXN0YXR1c190IGZsYXR0ZW4oUmVnaW9uIGNvbnN0JiB0LCB2b2lkKiYgYnVmZmVyLCBzaXplX3QmIHNpemUpIHsKLSAgICBpZiAoc2l6ZSA8IGdldEZsYXR0ZW5lZFNpemUodCkpIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0KLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHN0YXRpY19jYXN0PHVpbnQzMl90Pih0LnNpemUoKSkpOwotICAgIGZvciAoc2l6ZV90IHIgPSAwOyByIDwgdC5zaXplKCk7ICsrcikgewotICAgICAgICA6OmFuZHJvaWQ6OlJlY3QgcmVjdCgKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90Pih0W3JdLmxlZnQpLAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHRbcl0udG9wKSwKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90Pih0W3JdLnJpZ2h0KSwKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90Pih0W3JdLmJvdHRvbSkpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZWN0LmZsYXR0ZW4oYnVmZmVyLCBzaXplKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgICAgICBGbGF0dGVuYWJsZVV0aWxzOjphZHZhbmNlKGJ1ZmZlciwgc2l6ZSwgc2l6ZW9mKHJlY3QpKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vKioKLSAqIFxicmllZiBDb252ZXJ0IGA6OmFuZHJvaWQ6OlJlZ2lvbmAgdG8gYFJlZ2lvbmAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgZGVzdGluYXRpb24gYFJlZ2lvbmAuCi0gKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgOjphbmRyb2lkOjpSZWdpb25gLgotICovCi0vLyBjb252ZXJ0OiA6OmFuZHJvaWQ6OlJlZ2lvbiAtPiBSZWdpb24KLWJvb2wgY29udmVydFRvKFJlZ2lvbiogdCwgOjphbmRyb2lkOjpSZWdpb24gY29uc3QmIGwpIHsKLSAgICBzaXplX3QgY29uc3QgYmFzZVNpemUgPSBsLmdldEZsYXR0ZW5lZFNpemUoKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBiYXNlQnVmZmVyKAotICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3RbYmFzZVNpemVdKTsKLSAgICBpZiAoIWJhc2VCdWZmZXIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQqIGJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQqPihiYXNlQnVmZmVyLmdldCgpKTsKLSAgICBzaXplX3Qgc2l6ZSA9IGJhc2VTaXplOwotICAgIGlmIChsLmZsYXR0ZW4oYnVmZmVyLCBzaXplKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCBjb25zdCogY29uc3RCdWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkIGNvbnN0Kj4oYmFzZUJ1ZmZlci5nZXQoKSk7Ci0gICAgc2l6ZSA9IGJhc2VTaXplOwotICAgIGlmICh1bmZsYXR0ZW4odCwgY29uc3RCdWZmZXIsIHNpemUpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgUmVnaW9uYCB0byBgOjphbmRyb2lkOjpSZWdpb25gLgotICoKLSAqIFxwYXJhbVtvdXRdIGwgVGhlIGRlc3RpbmF0aW9uIGA6OmFuZHJvaWQ6OlJlZ2lvbmAuCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgUmVnaW9uYC4KLSAqLwotLy8gY29udmVydDogUmVnaW9uIC0+IDo6YW5kcm9pZDo6UmVnaW9uCi1ib29sIGNvbnZlcnRUbyg6OmFuZHJvaWQ6OlJlZ2lvbiogbCwgUmVnaW9uIGNvbnN0JiB0KSB7Ci0gICAgc2l6ZV90IGNvbnN0IGJhc2VTaXplID0gZ2V0RmxhdHRlbmVkU2l6ZSh0KTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBiYXNlQnVmZmVyKAotICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3RbYmFzZVNpemVdKTsKLSAgICBpZiAoIWJhc2VCdWZmZXIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQqIGJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQqPihiYXNlQnVmZmVyLmdldCgpKTsKLSAgICBzaXplX3Qgc2l6ZSA9IGJhc2VTaXplOwotICAgIGlmIChmbGF0dGVuKHQsIGJ1ZmZlciwgc2l6ZSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQgY29uc3QqIGNvbnN0QnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCBjb25zdCo+KGJhc2VCdWZmZXIuZ2V0KCkpOwotICAgIHNpemUgPSBiYXNlU2l6ZTsKLSAgICBpZiAobC0+dW5mbGF0dGVuKGNvbnN0QnVmZmVyLCBzaXplKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy9ndWkvQkdyYXBoaWNCdWZmZXJQcm9kdWNlci5jcHA6Ci0vLyAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQKLQotLyoqCi0gKiBcYnJpZWYgUmV0dXJuIGEgbG93ZXIgYm91bmQgb24gdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciByZXF1aXJlZCB0byBmbGF0dGVuCi0gKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKiBccmV0dXJuIEEgbG93ZXIgYm91bmQgb24gdGhlIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgotICovCi1jb25zdGV4cHIgc2l6ZV90IG1pbkZsYXR0ZW5lZFNpemUoCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgY29uc3QmIC8qIHQgKi8pIHsKLSAgICByZXR1cm4gc2l6ZW9mKGludDY0X3QpICsgLy8gdGltZXN0YW1wCi0gICAgICAgICAgICBzaXplb2YoaW50KSArIC8vIGlzQXV0b1RpbWVzdGFtcAotICAgICAgICAgICAgc2l6ZW9mKGFuZHJvaWRfZGF0YXNwYWNlKSArIC8vIGRhdGFTcGFjZQotICAgICAgICAgICAgc2l6ZW9mKDo6YW5kcm9pZDo6UmVjdCkgKyAvLyBjcm9wCi0gICAgICAgICAgICBzaXplb2YoaW50KSArIC8vIHNjYWxpbmdNb2RlCi0gICAgICAgICAgICBzaXplb2YodWludDMyX3QpICsgLy8gdHJhbnNmb3JtCi0gICAgICAgICAgICBzaXplb2YodWludDMyX3QpICsgLy8gc3RpY2t5VHJhbnNmb3JtCi0gICAgICAgICAgICBzaXplb2YoYm9vbCk7IC8vIGdldEZyYW1lVGltZXN0YW1wcwotfQotCi0vKioKLSAqIFxicmllZiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGJ1ZmZlciByZXF1aXJlZCB0byBmbGF0dGVuCi0gKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKiBccmV0dXJuIFRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KLSAqLwotc2l6ZV90IGdldEZsYXR0ZW5lZFNpemUoSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBjb25zdCYgdCkgewotICAgIHJldHVybiBtaW5GbGF0dGVuZWRTaXplKHQpICsKLSAgICAgICAgICAgIGdldEZlbmNlRmxhdHRlbmVkU2l6ZSh0LmZlbmNlKSArCi0gICAgICAgICAgICBnZXRGbGF0dGVuZWRTaXplKHQuc3VyZmFjZURhbWFnZSkgKwotICAgICAgICAgICAgc2l6ZW9mKEhkck1ldGFkYXRhOjp2YWxpZFR5cGVzKTsKLX0KLQotLyoqCi0gKiBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4KLSAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqIFxyZXR1cm4gVGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBccCB0LgotICovCi1zaXplX3QgZ2V0RmRDb3VudCgKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBjb25zdCYgdCkgewotICAgIHJldHVybiBnZXRGZW5jZUZkQ291bnQodC5mZW5jZSk7Ci19Ci0KLS8qKgotICogXGJyaWVmIEZsYXR0ZW4gYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqIFxwYXJhbVtvdXRdIG5oIFRoZSBuYXRpdmUgaGFuZGxlIGNsb25lZCBmcm9tIGB0LmZlbmNlYC4KLSAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZHVwbGljYXRlIHRoZSBmaWxlIGRlc2NyaXB0b3IgaW4gYHQuZmVuY2VgLiAqLwotc3RhdHVzX3QgZmxhdHRlbihIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IGNvbnN0JiB0LAotICAgICAgICBuYXRpdmVfaGFuZGxlX3QqKiBuaCwKLSAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQqJiBmZHMsIHNpemVfdCYgbnVtRmRzKSB7Ci0gICAgaWYgKHNpemUgPCBnZXRGbGF0dGVuZWRTaXplKHQpKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotCi0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0LnRpbWVzdGFtcCk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCBzdGF0aWNfY2FzdDxpbnQ+KHQuaXNBdXRvVGltZXN0YW1wKSk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YW5kcm9pZF9kYXRhc3BhY2VfdD4odC5kYXRhU3BhY2UpKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIDo6YW5kcm9pZDo6UmVjdCgKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHQuY3JvcC5sZWZ0KSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHQuY3JvcC50b3ApLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4odC5jcm9wLnJpZ2h0KSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHQuY3JvcC5ib3R0b20pKSk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCBzdGF0aWNfY2FzdDxpbnQ+KHQuc2NhbGluZ01vZGUpKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHQudHJhbnNmb3JtKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHQuc3RpY2t5VHJhbnNmb3JtKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHQuZ2V0RnJhbWVUaW1lc3RhbXBzKTsKLQotICAgICpuaCA9IHQuZmVuY2UuZ2V0TmF0aXZlSGFuZGxlKCkgPT0gbnVsbHB0ciA/Ci0gICAgICAgICAgICBudWxscHRyIDogbmF0aXZlX2hhbmRsZV9jbG9uZSh0LmZlbmNlKTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBmbGF0dGVuRmVuY2UoaGlkbF9oYW5kbGUoKm5oKSwgYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBzdGF0dXMgPSBmbGF0dGVuKHQuc3VyZmFjZURhbWFnZSwgYnVmZmVyLCBzaXplKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgZGVjbHR5cGUoSGRyTWV0YWRhdGE6OnZhbGlkVHlwZXMpKDApKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8qKgotICogXGJyaWVmIFVuZmxhdHRlbiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgZGVzdGluYXRpb24gYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICogXHBhcmFtW291dF0gbmggVGhlIHVuZGVybHlpbmcgbmF0aXZlIGhhbmRsZSBmb3IgYHQtPmZlbmNlYC4KLSAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KLSAqCi0gKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGBOT19FUlJPUmAgYW5kIGB0LT5mZW5jZWAgY29udGFpbnMgYSB2YWxpZCBmaWxlCi0gKiBkZXNjcmlwdG9yLCBccCBuaCB3aWxsIGJlIGEgbmV3bHkgY3JlYXRlZCBuYXRpdmUgaGFuZGxlIGhvbGRpbmcgdGhhdCBmaWxlCi0gKiBkZXNjcmlwdG9yLiBccCBuaCBuZWVkcyB0byBiZSBkZWxldGVkIHdpdGggYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgCi0gKiBhZnRlcndhcmRzLgotICovCi1zdGF0dXNfdCB1bmZsYXR0ZW4oCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQqIHQsIG5hdGl2ZV9oYW5kbGVfdCoqIG5oLAotICAgICAgICB2b2lkIGNvbnN0KiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludCBjb25zdComIGZkcywgc2l6ZV90JiBudW1GZHMpIHsKLSAgICBpZiAoc2l6ZSA8IG1pbkZsYXR0ZW5lZFNpemUoKnQpKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotCi0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHQtPnRpbWVzdGFtcCk7Ci0gICAgaW50IGxJc0F1dG9UaW1lc3RhbXA7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIGxJc0F1dG9UaW1lc3RhbXApOwotICAgIHQtPmlzQXV0b1RpbWVzdGFtcCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGxJc0F1dG9UaW1lc3RhbXApOwotICAgIGFuZHJvaWRfZGF0YXNwYWNlX3QgbERhdGFTcGFjZTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgbERhdGFTcGFjZSk7Ci0gICAgdC0+ZGF0YVNwYWNlID0gc3RhdGljX2Nhc3Q8RGF0YXNwYWNlPihsRGF0YVNwYWNlKTsKLSAgICBSZWN0IGxDcm9wOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCBsQ3JvcCk7Ci0gICAgdC0+Y3JvcCA9IFJlY3R7Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihsQ3JvcC5sZWZ0KSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KGxDcm9wLnRvcCksCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihsQ3JvcC5yaWdodCksCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihsQ3JvcC5ib3R0b20pfTsKLSAgICBpbnQgbFNjYWxpbmdNb2RlOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCBsU2NhbGluZ01vZGUpOwotICAgIHQtPnNjYWxpbmdNb2RlID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4obFNjYWxpbmdNb2RlKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdC0+dHJhbnNmb3JtKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdC0+c3RpY2t5VHJhbnNmb3JtKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdC0+Z2V0RnJhbWVUaW1lc3RhbXBzKTsKLQotICAgIHN0YXR1c190IHN0YXR1cyA9IHVuZmxhdHRlbkZlbmNlKCYodC0+ZmVuY2UpLCBuaCwKLSAgICAgICAgICAgIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgLy8gSGRyTWV0YWRhdGEgaWdub3JlZAotICAgIHJldHVybiB1bmZsYXR0ZW4oJih0LT5zdXJmYWNlRGFtYWdlKSwgYnVmZmVyLCBzaXplKTsKLX0KLQotLyoqCi0gKiBcYnJpZWYgV3JhcCBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAgaW4KLSAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqCi0gKiBccGFyYW1bb3V0XSB0IFRoZSB3cmFwcGVyIG9mIHR5cGUKLSAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqIFxwYXJhbVtvdXRdIG5oIFRoZSB1bmRlcmx5aW5nIG5hdGl2ZSBoYW5kbGUgZm9yIGB0LT5mZW5jZWAuCi0gKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKgotICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBgdHJ1ZWAgYW5kIGB0LT5mZW5jZWAgY29udGFpbnMgYSB2YWxpZCBmaWxlCi0gKiBkZXNjcmlwdG9yLCBccCBuaCB3aWxsIGJlIGEgbmV3bHkgY3JlYXRlZCBuYXRpdmUgaGFuZGxlIGhvbGRpbmcgdGhhdCBmaWxlCi0gKiBkZXNjcmlwdG9yLiBccCBuaCBuZWVkcyB0byBiZSBkZWxldGVkIHdpdGggYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgCi0gKiBhZnRlcndhcmRzLgotICovCi1ib29sIHdyYXBBcygKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCogdCwKLSAgICAgICAgbmF0aXZlX2hhbmRsZV90KiogbmgsCi0gICAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgY29uc3QmIGwpIHsKLQotICAgIHNpemVfdCBjb25zdCBiYXNlU2l6ZSA9IGwuZ2V0RmxhdHRlbmVkU2l6ZSgpOwotICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGJhc2VCdWZmZXIoCi0gICAgICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtiYXNlU2l6ZV0pOwotICAgIGlmICghYmFzZUJ1ZmZlcikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc2l6ZV90IGNvbnN0IGJhc2VOdW1GZHMgPSBsLmdldEZkQ291bnQoKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8aW50W10+IGJhc2VGZHMoCi0gICAgICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgaW50W2Jhc2VOdW1GZHNdKTsKLSAgICBpZiAoIWJhc2VGZHMpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQqIGJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQqPihiYXNlQnVmZmVyLmdldCgpKTsKLSAgICBzaXplX3Qgc2l6ZSA9IGJhc2VTaXplOwotICAgIGludCogZmRzID0gYmFzZUZkcy5nZXQoKTsKLSAgICBzaXplX3QgbnVtRmRzID0gYmFzZU51bUZkczsKLSAgICBpZiAobC5mbGF0dGVuKGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkIGNvbnN0KiBjb25zdEJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQgY29uc3QqPihiYXNlQnVmZmVyLmdldCgpKTsKLSAgICBzaXplID0gYmFzZVNpemU7Ci0gICAgaW50IGNvbnN0KiBjb25zdEZkcyA9IHN0YXRpY19jYXN0PGludCBjb25zdCo+KGJhc2VGZHMuZ2V0KCkpOwotICAgIG51bUZkcyA9IGJhc2VOdW1GZHM7Ci0gICAgaWYgKHVuZmxhdHRlbih0LCBuaCwgY29uc3RCdWZmZXIsIHNpemUsIGNvbnN0RmRzLCBudW1GZHMpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAgdG8KLSAqIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqCi0gKiBccGFyYW1bb3V0XSBsIFRoZSBkZXN0aW5hdGlvbiBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKgotICogSWYgYHQuZmVuY2VgIGhhcyBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvciwgaXQgd2lsbCBiZSBkdXBsaWNhdGVkLgotICovCi1ib29sIGNvbnZlcnRUbygKLSAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCogbCwKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBjb25zdCYgdCkgewotCi0gICAgc2l6ZV90IGNvbnN0IGJhc2VTaXplID0gZ2V0RmxhdHRlbmVkU2l6ZSh0KTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBiYXNlQnVmZmVyKAotICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3RbYmFzZVNpemVdKTsKLSAgICBpZiAoIWJhc2VCdWZmZXIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHNpemVfdCBjb25zdCBiYXNlTnVtRmRzID0gZ2V0RmRDb3VudCh0KTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8aW50W10+IGJhc2VGZHMoCi0gICAgICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgaW50W2Jhc2VOdW1GZHNdKTsKLSAgICBpZiAoIWJhc2VGZHMpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQqIGJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQqPihiYXNlQnVmZmVyLmdldCgpKTsKLSAgICBzaXplX3Qgc2l6ZSA9IGJhc2VTaXplOwotICAgIGludCogZmRzID0gYmFzZUZkcy5nZXQoKTsKLSAgICBzaXplX3QgbnVtRmRzID0gYmFzZU51bUZkczsKLSAgICBuYXRpdmVfaGFuZGxlX3QqIG5oOwotICAgIGlmIChmbGF0dGVuKHQsICZuaCwgYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQgY29uc3QqIGNvbnN0QnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCBjb25zdCo+KGJhc2VCdWZmZXIuZ2V0KCkpOwotICAgIHNpemUgPSBiYXNlU2l6ZTsKLSAgICBpbnQgY29uc3QqIGNvbnN0RmRzID0gc3RhdGljX2Nhc3Q8aW50IGNvbnN0Kj4oYmFzZUZkcy5nZXQoKSk7Ci0gICAgbnVtRmRzID0gYmFzZU51bUZkczsKLSAgICBpZiAobC0+dW5mbGF0dGVuKGNvbnN0QnVmZmVyLCBzaXplLCBjb25zdEZkcywgbnVtRmRzKSAhPSBOT19FUlJPUikgewotICAgICAgICBpZiAobmggIT0gbnVsbHB0cikgewotICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShuaCk7Ci0gICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gUmVmOiBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL2d1aS9CR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmNwcDoKLS8vICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQKLQotLyoqCi0gKiBcYnJpZWYgV3JhcCBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgIGluCi0gKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgLgotICoKLSAqIFxwYXJhbVtvdXRdIHQgVGhlIHdyYXBwZXIgb2YgdHlwZQotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0YC4KLSAqIFxwYXJhbVtvdXRdIG5oIFRoZSBhcnJheSBvZiBhcnJheSBvZiBuYXRpdmUgaGFuZGxlcyB0aGF0IGFyZSByZWZlcnJlZCB0byBieQotICogbWVtYmVycyBvZiBccCB0LgotICogXHBhcmFtW2luXSBsIFRoZSBzb3VyY2UgYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0YC4KLSAqCi0gKiBPbiBzdWNjZXNzLCBlYWNoIG1lbWJlciBvZiBccCBuaCB3aWxsIGJlIGVpdGhlciBgbnVsbHB0cmAgb3IgYSBuZXdseSBjcmVhdGVkCi0gKiBuYXRpdmUgaGFuZGxlLiBBbGwgdGhlIG5vbi1gbnVsbHB0cmAgZWxlbWVudHMgbXVzdCBiZSBkZWxldGVkIGluZGl2aWR1YWxseQotICogd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAuCi0gKi8KLS8vIHdyYXA6IEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IC0+Ci0vLyBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dAotYm9vbCB3cmFwQXMoSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQqIHQsCi0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+ID4qIG5oLAotICAgICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCBjb25zdCYgbCkgewotICAgIGlmICghd3JhcEFzKCYodC0+ZnJhbWVUaW1lc3RhbXBzKSwgbmgsIGwuZnJhbWVUaW1lc3RhbXBzKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHQtPndpZHRoID0gbC53aWR0aDsKLSAgICB0LT5oZWlnaHQgPSBsLmhlaWdodDsKLSAgICB0LT50cmFuc2Zvcm1IaW50ID0gbC50cmFuc2Zvcm1IaW50OwotICAgIHQtPm51bVBlbmRpbmdCdWZmZXJzID0gbC5udW1QZW5kaW5nQnVmZmVyczsKLSAgICB0LT5uZXh0RnJhbWVOdW1iZXIgPSBsLm5leHRGcmFtZU51bWJlcjsKLSAgICB0LT5idWZmZXJSZXBsYWNlZCA9IGwuYnVmZmVyUmVwbGFjZWQ7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0YCB0bwotICogYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0YC4KLSAqCi0gKiBccGFyYW1bb3V0XSBsIFRoZSBkZXN0aW5hdGlvbiBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgLgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0YC4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZHVwbGljYXRlIGFsbCBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBccCB0LgotICovCi0vLyBjb252ZXJ0OiBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCAtPgotLy8gQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQKLWJvb2wgY29udmVydFRvKAotICAgICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCogbCwKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgY29uc3QmIHQpIHsKLSAgICBpZiAoIWNvbnZlcnRUbygmKGwtPmZyYW1lVGltZXN0YW1wcyksIHQuZnJhbWVUaW1lc3RhbXBzKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGwtPndpZHRoID0gdC53aWR0aDsKLSAgICBsLT5oZWlnaHQgPSB0LmhlaWdodDsKLSAgICBsLT50cmFuc2Zvcm1IaW50ID0gdC50cmFuc2Zvcm1IaW50OwotICAgIGwtPm51bVBlbmRpbmdCdWZmZXJzID0gdC5udW1QZW5kaW5nQnVmZmVyczsKLSAgICBsLT5uZXh0RnJhbWVOdW1iZXIgPSB0Lm5leHRGcmFtZU51bWJlcjsKLSAgICBsLT5idWZmZXJSZXBsYWNlZCA9IHQuYnVmZmVyUmVwbGFjZWQ7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlYCB0bwotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlYC4KLSAqCi0gKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgotICogXHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgotICovCi1IR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZSB0b0hpZGxEaXNjb25uZWN0TW9kZSgKLSAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGUgbCkgewotICAgIHN3aXRjaCAobCkgewotICAgICAgICBjYXNlIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlOjpBcGk6Ci0gICAgICAgICAgICByZXR1cm4gSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGU6OkFQSTsKLSAgICAgICAgY2FzZSBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZTo6QWxsTG9jYWw6Ci0gICAgICAgICAgICByZXR1cm4gSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGU6OkFMTF9MT0NBTDsKLSAgICB9Ci0gICAgcmV0dXJuIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlOjpBUEk7Ci19Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlYCB0bwotICogYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlYC4KLSAqCi0gKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgotICogXHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgotICovCi1CR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZSB0b0d1aURpc2Nvbm5lY3RNb2RlKAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZSB0KSB7Ci0gICAgc3dpdGNoICh0KSB7Ci0gICAgICAgIGNhc2UgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGU6OkFQSToKLSAgICAgICAgICAgIHJldHVybiBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZTo6QXBpOwotICAgICAgICBjYXNlIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlOjpBTExfTE9DQUw6Ci0gICAgICAgICAgICByZXR1cm4gQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGU6OkFsbExvY2FsOwotICAgIH0KLSAgICByZXR1cm4gQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGU6OkFwaTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGNvbnZlcnNpb24KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0ZyYW1lRHJvcHBlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9GcmFtZURyb3BwZXIuY3BwCmluZGV4IGQyYTI0NzMuLjM4N2FjNWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0ZyYW1lRHJvcHBlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvRnJhbWVEcm9wcGVyLmNwcApAQCAtMzUsNyArMzUsNyBAQAogCiBzdGF0dXNfdCBGcmFtZURyb3BwZXI6OnNldE1heEZyYW1lUmF0ZShmbG9hdCBtYXhGcmFtZVJhdGUpIHsKICAgICBpZiAobWF4RnJhbWVSYXRlIDwgMCkgewotICAgICAgICBtTWluSW50ZXJ2YWxVcyA9IC0xbGw7CisgICAgICAgIG1NaW5JbnRlcnZhbFVzID0gLTFMTDsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmNwcAppbmRleCBkZDAzZDM4Li41OTMxN2U3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmNwcApAQCAtMzIsNiArMzIsMTEgQEAKICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KICNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+CiAjaW5jbHVkZSA8Z3VpL0J1ZmZlckl0ZW0uaD4KKyNpbmNsdWRlIDxndWkvQnVmZmVyUXVldWUuaD4KKyNpbmNsdWRlIDxndWkvYnVmZmVycXVldWUvMS4wL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxndWkvYnVmZmVycXVldWUvMi4wL0IySEdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyQ29uc3VtZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgogCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KQEAgLTI4MSw2ICsyODYsMzkgQEAKICAgICB9CiB9OwogCitzdHJ1Y3QgR3JhcGhpY0J1ZmZlclNvdXJjZTo6Q29uc3VtZXJQcm94eSA6IHB1YmxpYyBCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lciB7CisgICAgQ29uc3VtZXJQcm94eShjb25zdCB3cDxHcmFwaGljQnVmZmVyU291cmNlPiAmZ2JzKSA6IG1HYnMoZ2JzKSB7fQorCisgICAgfkNvbnN1bWVyUHJveHkoKSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIG9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgaXRlbSkgb3ZlcnJpZGUgeworICAgICAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBnYnMgPSBtR2JzLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGdicyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBnYnMtPm9uRnJhbWVBdmFpbGFibGUoaXRlbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIG9uQnVmZmVyc1JlbGVhc2VkKCkgb3ZlcnJpZGUgeworICAgICAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBnYnMgPSBtR2JzLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGdicyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBnYnMtPm9uQnVmZmVyc1JlbGVhc2VkKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIG9uU2lkZWJhbmRTdHJlYW1DaGFuZ2VkKCkgb3ZlcnJpZGUgeworICAgICAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBnYnMgPSBtR2JzLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGdicyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBnYnMtPm9uU2lkZWJhbmRTdHJlYW1DaGFuZ2VkKCk7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgLy8gTm90ZSB0aGF0IEdyYXBoaWNCdWZmZXJTb3VyY2UgaXMgaG9sZGluZyBhbiBzcCB0byB1cywgd2UgY2FuJ3QgaG9sZAorICAgIC8vIGFuIHNwIGJhY2sgdG8gR3JhcGhpY0J1ZmZlclNvdXJjZSBhcyB0aGUgY2lyY3VsYXIgZGVwZW5kZW5jeSB3aWxsCisgICAgLy8gbWFrZSBib3RoIGltbW9ydGFsLgorICAgIHdwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IG1HYnM7Cit9OworCiBHcmFwaGljQnVmZmVyU291cmNlOjpHcmFwaGljQnVmZmVyU291cmNlKCkgOgogICAgIG1Jbml0Q2hlY2soVU5LTk9XTl9FUlJPUiksCiAgICAgbU51bUF2YWlsYWJsZVVuYWNxdWlyZWRCdWZmZXJzKDApLApAQCAtMjkyLDIwICszMzAsMjAgQEAKICAgICBtU3VzcGVuZGVkKGZhbHNlKSwKICAgICBtTGFzdEZyYW1lVGltZXN0YW1wVXMoLTEpLAogICAgIG1TdG9wVGltZVVzKC0xKSwKLSAgICBtTGFzdEFjdGlvblRpbWVVcygtMWxsKSwKLSAgICBtU2tpcEZyYW1lc0JlZm9yZU5zKC0xbGwpLAotICAgIG1GcmFtZVJlcGVhdEludGVydmFsVXMoLTFsbCksCisgICAgbUxhc3RBY3Rpb25UaW1lVXMoLTFMTCksCisgICAgbVNraXBGcmFtZXNCZWZvcmVOcygtMUxMKSwKKyAgICBtRnJhbWVSZXBlYXRJbnRlcnZhbFVzKC0xTEwpLAogICAgIG1SZXBlYXRMYXN0RnJhbWVHZW5lcmF0aW9uKDApLAogICAgIG1PdXRzdGFuZGluZ0ZyYW1lUmVwZWF0Q291bnQoMCksCiAgICAgbUZyYW1lUmVwZWF0QmxvY2tlZE9uQ29kZWNCdWZmZXIoZmFsc2UpLAogICAgIG1GcHMoLTEuMCksCiAgICAgbUNhcHR1cmVGcHMoLTEuMCksCi0gICAgbUJhc2VDYXB0dXJlVXMoLTFsbCksCi0gICAgbUJhc2VGcmFtZVVzKC0xbGwpLAorICAgIG1CYXNlQ2FwdHVyZVVzKC0xTEwpLAorICAgIG1CYXNlRnJhbWVVcygtMUxMKSwKICAgICBtRnJhbWVDb3VudCgwKSwKLSAgICBtUHJldkNhcHR1cmVVcygtMWxsKSwKLSAgICBtUHJldkZyYW1lVXMoLTFsbCksCi0gICAgbUlucHV0QnVmZmVyVGltZU9mZnNldFVzKDBsbCkgeworICAgIG1QcmV2Q2FwdHVyZVVzKC0xTEwpLAorICAgIG1QcmV2RnJhbWVVcygtMUxMKSwKKyAgICBtSW5wdXRCdWZmZXJUaW1lT2Zmc2V0VXMoMExMKSB7CiAgICAgQUxPR1YoIkdyYXBoaWNCdWZmZXJTb3VyY2UiKTsKIAogICAgIFN0cmluZzggbmFtZSgiR3JhcGhpY0J1ZmZlclNvdXJjZSIpOwpAQCAtMzEzLDE0ICszNTEsMTIgQEAKICAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJm1Qcm9kdWNlciwgJm1Db25zdW1lcik7CiAgICAgbUNvbnN1bWVyLT5zZXRDb25zdW1lck5hbWUobmFtZSk7CiAKLSAgICAvLyBOb3RlIHRoYXQgd2UgY2FuJ3QgY3JlYXRlIGFuIHNwPC4uLj4odGhpcykgaW4gYSBjdG9yIHRoYXQgd2lsbCBub3Qga2VlcCBhCi0gICAgLy8gcmVmZXJlbmNlIG9uY2UgdGhlIGN0b3IgZW5kcywgYXMgdGhhdCB3b3VsZCBjYXVzZSB0aGUgcmVmY291bnQgb2YgJ3RoaXMnCi0gICAgLy8gZHJvcHBpbmcgdG8gMCBhdCB0aGUgZW5kIG9mIHRoZSBjdG9yLiAgU2luY2UgYWxsIHdlIG5lZWQgaXMgYSB3cDwuLi4+Ci0gICAgLy8gdGhhdCdzIHdoYXQgd2UgY3JlYXRlLgotICAgIHdwPEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyPiBsaXN0ZW5lciA9Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxCdWZmZXJRdWV1ZTo6Q29uc3VtZXJMaXN0ZW5lcio+KHRoaXMpOworICAgIC8vIGNyZWF0ZSB0aGUgY29uc3VtZXIgbGlzdGVuZXIgaW50ZXJmYWNlLCBhbmQgaG9sZCBzcCBzbyB0aGF0IHRoaXMKKyAgICAvLyBpbnRlcmZhY2UgbGl2ZXMgYXMgbG9uZyBhcyB0aGUgR3JhcGhpY0J1ZmZlclNvdXJjZS4KKyAgICBtQ29uc3VtZXJQcm94eSA9IG5ldyBDb25zdW1lclByb3h5KHRoaXMpOworCiAgICAgc3A8SUNvbnN1bWVyTGlzdGVuZXI+IHByb3h5ID0KLSAgICAgICAgICAgIG5ldyBCdWZmZXJRdWV1ZTo6UHJveHlDb25zdW1lckxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICAgICAgICAgIG5ldyBCdWZmZXJRdWV1ZTo6UHJveHlDb25zdW1lckxpc3RlbmVyKG1Db25zdW1lclByb3h5KTsKIAogICAgIG1Jbml0Q2hlY2sgPSBtQ29uc3VtZXItPmNvbnN1bWVyQ29ubmVjdChwcm94eSwgZmFsc2UpOwogICAgIGlmIChtSW5pdENoZWNrICE9IE5PX0VSUk9SKSB7CkBAIC0zNTcsNiArMzkzLDI0IEBACiAgICAgfQogfQogCitzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBHcmFwaGljQnVmZmVyU291cmNlOjpnZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgY29uc3QgeworICAgIHJldHVybiBtUHJvZHVjZXI7Cit9CisKK3NwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4KK0dyYXBoaWNCdWZmZXJTb3VyY2U6OmdldEhHcmFwaGljQnVmZmVyUHJvZHVjZXJfVjFfMCgpIGNvbnN0IHsKKyAgICB1c2luZyBUV0dyYXBoaWNCdWZmZXJQcm9kdWNlciA9IDo6YW5kcm9pZDo6VFdHcmFwaGljQnVmZmVyUHJvZHVjZXI8CisgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj47CisKKyAgICByZXR1cm4gbmV3IFRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyKGdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSk7Cit9CisKK3NwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjJfMDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4KK0dyYXBoaWNCdWZmZXJTb3VyY2U6OmdldEhHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYyXzA6OnV0aWxzOjoKKyAgICAgICAgICAgICAgICAgICAgQjJIR3JhcGhpY0J1ZmZlclByb2R1Y2VyKGdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSk7Cit9CisKIFN0YXR1cyBHcmFwaGljQnVmZmVyU291cmNlOjpzdGFydCgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobU11dGV4KTsKICAgICBBTE9HVigiLS0+IHN0YXJ0OyBhdmFpbGFibGU9JXp1LCBzdWJtaXR0YWJsZT0lemQiLApAQCAtMzkyLDcgKzQ0Niw3IEBACiAgICAgICAgIHN1Ym1pdEVuZE9mSW5wdXRTdHJlYW1fbCgpOwogICAgIH0KIAotICAgIGlmIChtRnJhbWVSZXBlYXRJbnRlcnZhbFVzID4gMGxsICYmIG1Mb29wZXIgPT0gTlVMTCkgeworICAgIGlmIChtRnJhbWVSZXBlYXRJbnRlcnZhbFVzID4gMExMICYmIG1Mb29wZXIgPT0gTlVMTCkgewogICAgICAgICBtUmVmbGVjdG9yID0gbmV3IEFIYW5kbGVyUmVmbGVjdG9yPEdyYXBoaWNCdWZmZXJTb3VyY2U+KHRoaXMpOwogCiAgICAgICAgIG1Mb29wZXIgPSBuZXcgQUxvb3BlcjsKQEAgLTY1NSw3ICs3MDksNyBAQAogCiAgICAgLy8gb25seSBzdWJtaXQgc2FtcGxlIGlmIHN0YXJ0IHRpbWUgaXMgdW5zcGVjaWZpZWQsIG9yIHNhbXBsZQogICAgIC8vIGlzIHF1ZXVlZCBhZnRlciB0aGUgc3BlY2lmaWVkIHN0YXJ0IHRpbWUKLSAgICBpZiAobVNraXBGcmFtZXNCZWZvcmVOcyA8IDBsbCB8fCBpdGVtLm1UaW1lc3RhbXBOcyA+PSBtU2tpcEZyYW1lc0JlZm9yZU5zKSB7CisgICAgaWYgKG1Ta2lwRnJhbWVzQmVmb3JlTnMgPCAwTEwgfHwgaXRlbS5tVGltZXN0YW1wTnMgPj0gbVNraXBGcmFtZXNCZWZvcmVOcykgewogICAgICAgICAvLyBpZiBzdGFydCB0aW1lIGlzIHNldCwgb2Zmc2V0IHRpbWUgc3RhbXAgYnkgc3RhcnQgdGltZQogICAgICAgICBpZiAobVNraXBGcmFtZXNCZWZvcmVOcyA+IDApIHsKICAgICAgICAgICAgIGl0ZW0ubVRpbWVzdGFtcE5zIC09IG1Ta2lwRnJhbWVzQmVmb3JlTnM7CkBAIC02NzcsNyArNzMxLDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICAvLyBEb24ndCBzZXQgdGhlIGxhc3QgYnVmZmVyIGlkIGlmIHdlJ3JlIG5vdCByZXBlYXRpbmcsCiAgICAgICAgIC8vIHdlJ2xsIGJlIGhvbGRpbmcgb24gdG8gdGhlIGxhc3QgYnVmZmVyIGZvciBub3RoaW5nLgotICAgICAgICBpZiAobUZyYW1lUmVwZWF0SW50ZXJ2YWxVcyA+IDBsbCkgeworICAgICAgICBpZiAobUZyYW1lUmVwZWF0SW50ZXJ2YWxVcyA+IDBMTCkgewogICAgICAgICAgICAgc2V0TGF0ZXN0QnVmZmVyX2woaXRlbSk7CiAgICAgICAgIH0KICAgICAgICAgQUxPR1YoImJ1ZmZlciBzdWJtaXR0ZWQgW3Nsb3Q9JWQsIHVzZUNvdW50PSVsZF0gYWNxdWlyZWQ9JWQiLApAQCAtNzU1LDcgKzgwOSw3IEBACiAgICAgICAgICAgICAmJiAobUZwcyA+IDIgKiBtQ2FwdHVyZUZwcwogICAgICAgICAgICAgfHwgbUNhcHR1cmVGcHMgPiAyICogbUZwcykpIHsKICAgICAgICAgLy8gVGltZSBsYXBzZSBvciBzbG93IG1vdGlvbiBtb2RlCi0gICAgICAgIGlmIChtUHJldkNhcHR1cmVVcyA8IDBsbCkgeworICAgICAgICBpZiAobVByZXZDYXB0dXJlVXMgPCAwTEwpIHsKICAgICAgICAgICAgIC8vIGZpcnN0IGNhcHR1cmUKICAgICAgICAgICAgIG1QcmV2Q2FwdHVyZVVzID0gbUJhc2VDYXB0dXJlVXMgPSB0aW1lVXM7CiAgICAgICAgICAgICAvLyBhZGp1c3QgdGhlIGZpcnN0IHNhbXBsZSB0aW1lc3RhbXAuCkBAIC03NjcsNyArODIxLDcgQEAKICAgICAgICAgICAgIGRvdWJsZSBuRnJhbWVzID0gKHRpbWVVcyAtIG1QcmV2Q2FwdHVyZVVzKSAqIG1DYXB0dXJlRnBzIC8gMTAwMDAwMDsKICAgICAgICAgICAgIGlmIChuRnJhbWVzIDwgMC41IC0ga1RpbWVzdGFtcEZsdWN0dWF0aW9uKSB7CiAgICAgICAgICAgICAgICAgLy8gc2tpcCB0aGlzIGZyYW1lIGFzIGl0J3MgdG9vIGNsb3NlIHRvIHByZXZpb3VzIGNhcHR1cmUKLSAgICAgICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgZnJhbWUsIHRpbWVVcyAlbGxkIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih0aW1lVXMpKTsKKyAgICAgICAgICAgICAgICBBTE9HRCgic2tpcHBpbmcgZnJhbWUsIHRpbWVVcyAlbGxkIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih0aW1lVXMpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobkZyYW1lcyA8PSAxLjApIHsKQEAgLTExMDYsNiArMTE2MCwxNCBAQAogICAgICAgICBjb25zdW1lclVzYWdlIHw9IEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUjsKICAgICAgICAgbUNvbnN1bWVyLT5zZXRDb25zdW1lclVzYWdlQml0cyhjb25zdW1lclVzYWdlKTsKIAorICAgICAgICAvLyBTZXQgaW1wbC4gZGVmaW5lZCBmb3JtYXQgYXMgZGVmYXVsdC4gRGVwZW5kaW5nIG9uIHRoZSB1c2FnZSBmbGFncworICAgICAgICAvLyB0aGUgZGV2aWNlLXNwZWNpZmljIGltcGxlbWVudGF0aW9uIHdpbGwgZGVyaXZlIHRoZSBleGFjdCBmb3JtYXQuCisgICAgICAgIGVyciA9IG1Db25zdW1lci0+c2V0RGVmYXVsdEJ1ZmZlckZvcm1hdChIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpOworICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNvbmZpZ3VyZSBzdXJmYWNlIGRlZmF1bHQgZm9ybWF0IHJldDogJWQiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIFNldHMgdGhlIGRlZmF1bHQgYnVmZmVyIGRhdGEgc3BhY2UKICAgICAgICAgQUxPR0QoInNldHRpbmcgZGF0YXNwYWNlOiAlI3gsIGFjcXVpcmVkPSVkIiwgZGF0YVNwYWNlLCBtTnVtT3V0c3RhbmRpbmdBY3F1aXJlcyk7CiAgICAgICAgIG1Db25zdW1lci0+c2V0RGVmYXVsdEJ1ZmZlckRhdGFTcGFjZSgoYW5kcm9pZF9kYXRhc3BhY2UpZGF0YVNwYWNlKTsKQEAgLTExMTUsMTkgKzExNzcsMTkgQEAKICAgICAgICAgbVN1c3BlbmRlZCA9IGZhbHNlOwogICAgICAgICBtRW5kT2ZTdHJlYW0gPSBmYWxzZTsKICAgICAgICAgbUVuZE9mU3RyZWFtU2VudCA9IGZhbHNlOwotICAgICAgICBtU2tpcEZyYW1lc0JlZm9yZU5zID0gLTFsbDsKKyAgICAgICAgbVNraXBGcmFtZXNCZWZvcmVOcyA9IC0xTEw7CiAgICAgICAgIG1GcmFtZURyb3BwZXIuY2xlYXIoKTsKLSAgICAgICAgbUZyYW1lUmVwZWF0SW50ZXJ2YWxVcyA9IC0xbGw7CisgICAgICAgIG1GcmFtZVJlcGVhdEludGVydmFsVXMgPSAtMUxMOwogICAgICAgICBtUmVwZWF0TGFzdEZyYW1lR2VuZXJhdGlvbiA9IDA7CiAgICAgICAgIG1PdXRzdGFuZGluZ0ZyYW1lUmVwZWF0Q291bnQgPSAwOwogICAgICAgICBtTGF0ZXN0QnVmZmVyLm1CdWZmZXIucmVzZXQoKTsKICAgICAgICAgbUZyYW1lUmVwZWF0QmxvY2tlZE9uQ29kZWNCdWZmZXIgPSBmYWxzZTsKICAgICAgICAgbUZwcyA9IC0xLjA7CiAgICAgICAgIG1DYXB0dXJlRnBzID0gLTEuMDsKLSAgICAgICAgbUJhc2VDYXB0dXJlVXMgPSAtMWxsOwotICAgICAgICBtQmFzZUZyYW1lVXMgPSAtMWxsOwotICAgICAgICBtUHJldkNhcHR1cmVVcyA9IC0xbGw7Ci0gICAgICAgIG1QcmV2RnJhbWVVcyA9IC0xbGw7CisgICAgICAgIG1CYXNlQ2FwdHVyZVVzID0gLTFMTDsKKyAgICAgICAgbUJhc2VGcmFtZVVzID0gLTFMTDsKKyAgICAgICAgbVByZXZDYXB0dXJlVXMgPSAtMUxMOworICAgICAgICBtUHJldkZyYW1lVXMgPSAtMUxMOwogICAgICAgICBtRnJhbWVDb3VudCA9IDA7CiAgICAgICAgIG1JbnB1dEJ1ZmZlclRpbWVPZmZzZXRVcyA9IDA7CiAgICAgICAgIG1TdG9wVGltZVVzID0gLTE7CkBAIC0xMTkzLDcgKzEyNTUsNyBAQAogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CiAKLSAgICBpZiAobUV4ZWN1dGluZyB8fCByZXBlYXRBZnRlclVzIDw9IDBsbCkgeworICAgIGlmIChtRXhlY3V0aW5nIHx8IHJlcGVhdEFmdGVyVXMgPD0gMExMKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKQEAgLTEyMDUsNyArMTI2Nyw3IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1NdXRleCk7CiAKICAgICAvLyB0aW1lT2Zmc2V0VXMgbXVzdCBiZSBuZWdhdGl2ZSBmb3IgYWRqdXN0bWVudC4KLSAgICBpZiAodGltZU9mZnNldFVzID49IDBsbCkgeworICAgIGlmICh0aW1lT2Zmc2V0VXMgPj0gMExMKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKQEAgLTEyMzksNyArMTMwMSw3IEBACiAKICAgICBtU2tpcEZyYW1lc0JlZm9yZU5zID0KICAgICAgICAgICAgIChza2lwRnJhbWVzQmVmb3JlVXMgPiAwICYmIHNraXBGcmFtZXNCZWZvcmVVcyA8PSBJTlQ2NF9NQVggLyAxMDAwKSA/Ci0gICAgICAgICAgICAoc2tpcEZyYW1lc0JlZm9yZVVzICogMTAwMCkgOiAtMWxsOworICAgICAgICAgICAgKHNraXBGcmFtZXNCZWZvcmVVcyAqIDEwMDApIDogLTFMTDsKIAogICAgIHJldHVybiBPSzsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL1dQcm9kdWNlckxpc3RlbmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL1dQcm9kdWNlckxpc3RlbmVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNhMTNiZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9XUHJvZHVjZXJMaXN0ZW5lci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dQcm9kdWNlckxpc3RlbmVyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gVFdQcm9kdWNlckxpc3RlbmVyCi1UV1Byb2R1Y2VyTGlzdGVuZXI6OlRXUHJvZHVjZXJMaXN0ZW5lcigKLSAgICAgICAgc3A8QlByb2R1Y2VyTGlzdGVuZXI+IGNvbnN0JiBiYXNlKToKLSAgICBtQmFzZShiYXNlKSB7Ci19Ci0KLVJldHVybjx2b2lkPiBUV1Byb2R1Y2VyTGlzdGVuZXI6Om9uQnVmZmVyUmVsZWFzZWQoKSB7Ci0gICAgbUJhc2UtPm9uQnVmZmVyUmVsZWFzZWQoKTsKLSAgICByZXR1cm4gVm9pZCgpOwotfQotCi1SZXR1cm48Ym9vbD4gVFdQcm9kdWNlckxpc3RlbmVyOjpuZWVkc1JlbGVhc2VOb3RpZnkoKSB7Ci0gICAgcmV0dXJuIG1CYXNlLT5uZWVkc1JlbGVhc2VOb3RpZnkoKTsKLX0KLQotLy8gTFdQcm9kdWNlckxpc3RlbmVyCi1MV1Byb2R1Y2VyTGlzdGVuZXI6OkxXUHJvZHVjZXJMaXN0ZW5lcigKLSAgICAgICAgc3A8SFByb2R1Y2VyTGlzdGVuZXI+IGNvbnN0JiBiYXNlKToKLSAgICBtQmFzZShiYXNlKSB7Ci19Ci0KLXZvaWQgTFdQcm9kdWNlckxpc3RlbmVyOjpvbkJ1ZmZlclJlbGVhc2VkKCkgewotICAgIG1CYXNlLT5vbkJ1ZmZlclJlbGVhc2VkKCk7Ci19Ci0KLWJvb2wgTFdQcm9kdWNlckxpc3RlbmVyOjpuZWVkc1JlbGVhc2VOb3RpZnkoKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KG1CYXNlLT5uZWVkc1JlbGVhc2VOb3RpZnkoKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0NvbnZlcnNpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29udmVyc2lvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGQ4YzFlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29udmVyc2lvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNzY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX1NUQUdFRlJJR0hUX0JRSEVMUEVSX0NPTlZFUlNJT05fSF8KLSNkZWZpbmUgTUVESUFfU1RBR0VGUklHSFRfQlFIRUxQRVJfQ09OVkVSU0lPTl9IXwotCi0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGxpc3Q+Ci0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KLSNpbmNsdWRlIDxoaWRsbWVtb3J5L21hcHBpbmcuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9CaW5kZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvU3RhdHVzLmg+Ci0jaW5jbHVkZSA8dWkvRmVuY2VUaW1lLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KLSNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgotCi0jaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KLQotI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tZW1vcnkvMS4wL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2J1ZmZlcnF1ZXVlLzEuMC9JUHJvZHVjZXJMaXN0ZW5lci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgY29udmVyc2lvbiB7Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwotdXNpbmcgOjphbmRyb2lkOjpzcDsKLXVzaW5nIDo6YW5kcm9pZDo6c3RhdHVzX3Q7Ci0KLXVzaW5nIDo6YW5kcm9pZDo6U3RyaW5nODsKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OlYxXzA6OlJlY3Q7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6VjFfMDo6UmVnaW9uOwotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpEYXRhc3BhY2U7Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0OwotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6VjFfMDo6QW53QnVmZmVyOwotdXNpbmcgOjphbmRyb2lkOjpHcmFwaGljQnVmZmVyOwotCi10eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcgotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwotdHlwZWRlZiA6OmFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXIKLSAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKLQotLy8gbmF0aXZlX2hhbmRsZV90IGhlbHBlciBmdW5jdGlvbnMuCi0KLS8qKgotICogXGJyaWVmIFRha2UgYW4gZmQgYW5kIGNyZWF0ZSBhIG5hdGl2ZSBoYW5kbGUgY29udGFpbmluZyBvbmx5IHRoZSBnaXZlbiBmZC4KLSAqIFRoZSBjcmVhdGVkIGhhbmRsZSB3aWxsIG5lZWQgdG8gYmUgZGVsZXRlZCBtYW51YWxseSB3aXRoCi0gKiBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAuCi0gKgotICogXHBhcmFtW2luXSBmZCBUaGUgc291cmNlIGZpbGUgZGVzY3JpcHRvciAob2YgdHlwZSBgaW50YCkuCi0gKiBccmV0dXJuIFRoZSBjcmVhdGUgYG5hdGl2ZV9oYW5kbGVfdCpgIHRoYXQgY29udGFpbnMgdGhlIGdpdmVuIFxwIGZkLiBJZiB0aGUKLSAqIHN1cHBsaWVkIFxwIGZkIGlzIG5lZ2F0aXZlLCB0aGUgY3JlYXRlZCBuYXRpdmUgaGFuZGxlIHdpbGwgY29udGFpbiBubyBmaWxlCi0gKiBkZXNjcmlwdG9ycy4KLSAqCi0gKiBJZiB0aGUgbmF0aXZlIGhhbmRsZSBjYW5ub3QgYmUgY3JlYXRlZCwgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlCi0gKiBgbnVsbHB0cmAuCi0gKgotICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBkdXBsaWNhdGUgdGhlIGZpbGUgZGVzY3JpcHRvci4KLSAqLwotbmF0aXZlX2hhbmRsZV90KiBuYXRpdmVfaGFuZGxlX2NyZWF0ZV9mcm9tX2ZkKGludCBmZCk7Ci0KLS8qKgotICogXGJyaWVmIEV4dHJhY3QgYSBmaWxlIGRlc2NyaXB0b3IgZnJvbSBhIG5hdGl2ZSBoYW5kbGUuCi0gKgotICogXHBhcmFtW2luXSBuaCBUaGUgc291cmNlIGBuYXRpdmVfaGFuZGxlX3QqYC4KLSAqIFxwYXJhbVtpbl0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBmaWxlIGRlc2NyaXB0b3IgaW4gXHAgbmggdG8gcmVhZCBmcm9tLiBUaGlzCi0gKiBpbnB1dCBoYXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYDBgLgotICogXHJldHVybiBUaGUgYGluZGV4YC10aCBmaWxlIGRlc2NyaXB0b3IgaW4gXHAgbmguIElmIFxwIG5oIGRvZXMgbm90IGhhdmUKLSAqIGVub3VnaCBmaWxlIGRlc2NyaXB0b3JzLCB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSBgLTFgLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZHVwbGljYXRlIHRoZSBmaWxlIGRlc2NyaXB0b3IuCi0gKi8KLWludCBuYXRpdmVfaGFuZGxlX3JlYWRfZmQobmF0aXZlX2hhbmRsZV90IGNvbnN0KiBuaCwgaW50IGluZGV4ID0gMCk7Ci0KLS8qKgotICogQ29udmVyc2lvbiBmdW5jdGlvbnMKLSAqID09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhlcmUgYXJlIHR3byBtYWluIGRpcmVjdGlvbnMgb2YgY29udmVyc2lvbjoKLSAqIC0gYGluVGFyZ2V0VHlwZSguLi4pYDogQ3JlYXRlIGEgd3JhcHBlciB3aG9zZSBsaWZldGltZSBkZXBlbmRzIG9uIHRoZQotICogICBpbnB1dC4gVGhlIHdyYXBwZXIgaGFzIHR5cGUgYFRhcmdldFR5cGVgLgotICogLSBgdG9UYXJnZXRUeXBlKC4uLilgOiBDcmVhdGUgYSBzdGFuZGFsb25lIG9iamVjdCBvZiB0eXBlIGBUYXJnZXRUeXBlYCB0aGF0Ci0gKiAgIGNvcnJlc3BvbmRzIHRvIHRoZSBpbnB1dC4gVGhlIGxpZmV0aW1lIG9mIHRoZSBvdXRwdXQgZG9lcyBub3QgZGVwZW5kIG9uIHRoZQotICogICBsaWZldGltZSBvZiB0aGUgaW5wdXQuCi0gKiAtIGB3cmFwSW4oVGFyZ2V0VHlwZSosIC4uLilgOiBTYW1lIGFzIGBpblRhcmdldFR5cGUoKWAsIGJ1dCBmb3IgYFRhcmdldFR5cGVgCi0gKiAgIHRoYXQgY2Fubm90IGJlIGNvcGllZCBhbmQvb3IgbW92ZWQgZWZmaWNpZW50bHksIG9yIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlCi0gKiAgIG91dHB1dCBhcmd1bWVudHMuCi0gKiAtIGBjb252ZXJ0VG8oVGFyZ2V0VHlwZSosIC4uLilgOiBTYW1lIGFzIGB0b1RhcmdldFR5cGUoKWAsIGJ1dCBmb3IKLSAqICAgYFRhcmdldFR5cGVgIHRoYXQgY2Fubm90IGJlIGNvcGllZCBhbmQvb3IgbW92ZWQgZWZmaWNpZW50bHksIG9yIHdoZW4gdGhlcmUKLSAqICAgYXJlIG11bHRpcGxlIG91dHB1dCBhcmd1bWVudHMuCi0gKgotICogYHdyYXBJbigpYCBhbmQgYGNvbnZlcnRUbygpYCBmdW5jdGlvbnMgd2lsbCB0YWtlIG91dHB1dCBhcmd1bWVudHMgYmVmb3JlCi0gKiBpbnB1dCBhcmd1bWVudHMuIFNvbWUgb2YgdGhlc2UgZnVuY3Rpb25zIG1pZ2h0IHJldHVybiBhIHZhbHVlIHRvIGluZGljYXRlCi0gKiBzdWNjZXNzIG9yIGVycm9yLgotICoKLSAqIEluIGNvbnZlcnRpbmcgb3Igd3JhcHBpbmcgc29tZXRoaW5nIGFzIGEgVHJlYmxlIHR5cGUgdGhhdCBjb250YWlucyBhCi0gKiBgaGlkbF9oYW5kbGVgLCBgbmF0aXZlX2hhbmRsZV90KmAgd2lsbCBuZWVkIHRvIGJlIGNyZWF0ZWQgYW5kIHJldHVybmVkIGFzCi0gKiBhbiBhZGRpdGlvbmFsIG91dHB1dCBhcmd1bWVudCwgaGVuY2Ugb25seSBgd3JhcEluKClgIG9yIGBjb252ZXJ0VG8oKWAgd291bGQKLSAqIGJlIGF2YWlsYWJsZS4gVGhlIGNhbGxlciBtdXN0IGNhbGwgYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgIHRvIGRlYWxsb2NhdGUgdGhlCi0gKiByZXR1cm5lZCBuYXRpdmUgaGFuZGxlIHdoZW4gaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KLSAqCi0gKiBGb3IgdHlwZXMgdGhhdCBjb250YWluIGZpbGUgZGVzY3JpcHRvcnMsIGBpblRhcmdldFR5cGUoKWAgYW5kIGB3cmFwQXMoKWAgZG8KLSAqIG5vdCBwZXJmb3JtIGR1cGxpY2F0aW9uIG9mIGZpbGUgZGVzY3JpcHRvcnMsIHdoaWxlIGB0b1RhcmdldFR5cGUoKWAgYW5kCi0gKiBgY29udmVydFRvKClgIGRvLgotICovCi0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYFJldHVybjx2b2lkPmAgdG8gYGJpbmRlcjo6U3RhdHVzYC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgUmV0dXJuPHZvaWQ+YC4KLSAqIFxyZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgYGJpbmRlcjo6U3RhdHVzYC4KLSAqLwotLy8gY29udmVydDogUmV0dXJuPHZvaWQ+IC0+IDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMKLTo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgdG9CaW5kZXJTdGF0dXMoUmV0dXJuPHZvaWQ+IGNvbnN0JiB0KTsKLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgUmV0dXJuPHZvaWQ+YCB0byBgc3RhdHVzX3RgLiBUaGlzIGlzIGZvciBsZWdhY3kgYmluZGVyIGNhbGxzLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBSZXR1cm48dm9pZD5gLgotICogXHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBgc3RhdHVzX3RgLgotICovCi0vLyBjb252ZXJ0OiBSZXR1cm48dm9pZD4gLT4gc3RhdHVzX3QKLXN0YXR1c190IHRvU3RhdHVzVChSZXR1cm48dm9pZD4gY29uc3QmIHQpOwotCi0vKioKLSAqIFxicmllZiBXcmFwIGBuYXRpdmVfaGFuZGxlX3QqYCBpbiBgaGlkbF9oYW5kbGVgLgotICoKLSAqIFxwYXJhbVtpbl0gbmggVGhlIHNvdXJjZSBgbmF0aXZlX2hhbmRsZV90KmAuCi0gKiBccmV0dXJuIFRoZSBgaGlkbF9oYW5kbGVgIHRoYXQgcG9pbnRzIHRvIFxwIG5oLgotICovCi0vLyB3cmFwOiBuYXRpdmVfaGFuZGxlX3QqIC0+IGhpZGxfaGFuZGxlCi1oaWRsX2hhbmRsZSBpbkhpZGxIYW5kbGUobmF0aXZlX2hhbmRsZV90IGNvbnN0KiBuaCk7Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYGludDMyX3RgIHRvIGBEYXRhc3BhY2VgLgotICoKLSAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGBpbnQzMl90YC4KLSAqIFxyZXN1bHQgVGhlIGNvcnJlc3BvbmRpbmcgYERhdGFzcGFjZWAuCi0gKi8KLS8vIGNvbnZlcnQ6IGludDMyX3QgLT4gRGF0YXNwYWNlCi1EYXRhc3BhY2UgdG9IYXJkd2FyZURhdGFzcGFjZShpbnQzMl90IGwpOwotCi0vKioKLSAqIFxicmllZiBDb252ZXJ0IGBEYXRhc3BhY2VgIHRvIGBpbnQzMl90YC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgRGF0YXNwYWNlYC4KLSAqIFxyZXN1bHQgVGhlIGNvcnJlc3BvbmRpbmcgYGludDMyX3RgLgotICovCi0vLyBjb252ZXJ0OiBEYXRhc3BhY2UgLT4gaW50MzJfdAotaW50MzJfdCB0b1Jhd0RhdGFzcGFjZShEYXRhc3BhY2UgY29uc3QmIHQpOwotCi0vKioKLSAqIFxicmllZiBXcmFwIGFuIG9wYXF1ZSBidWZmZXIgaW5zaWRlIGEgYGhpZGxfdmVjPHVpbnQ4X3Q+YC4KLSAqCi0gKiBccGFyYW1baW5dIGwgVGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3BhcXVlIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbl0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyLgotICogXHJldHVybiBBIGBoaWRsX3ZlYzx1aW50OF90PmAgdGhhdCBwb2ludHMgdG8gdGhlIGJ1ZmZlci4KLSAqLwotLy8gd3JhcDogdm9pZCosIHNpemVfdCAtPiBoaWRsX3ZlYzx1aW50OF90PgotaGlkbF92ZWM8dWludDhfdD4gaW5IaWRsQnl0ZXModm9pZCBjb25zdCogbCwgc2l6ZV90IHNpemUpOwotCi0vKioKLSAqIFxicmllZiBDcmVhdGUgYSBgaGlkbF92ZWM8dWludDhfdD5gIHRoYXQgaXMgYSBjb3B5IG9mIGFuIG9wYXF1ZSBidWZmZXIuCi0gKgotICogXHBhcmFtW2luXSBsIFRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9wYXF1ZSBidWZmZXIuCi0gKiBccGFyYW1baW5dIHNpemUgVGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4KLSAqIFxyZXR1cm4gQSBgaGlkbF92ZWM8dWludDhfdD5gIHRoYXQgaXMgYSBjb3B5IG9mIHRoZSBpbnB1dCBidWZmZXIuCi0gKi8KLS8vIGNvbnZlcnQ6IHZvaWQqLCBzaXplX3QgLT4gaGlkbF92ZWM8dWludDhfdD4KLWhpZGxfdmVjPHVpbnQ4X3Q+IHRvSGlkbEJ5dGVzKHZvaWQgY29uc3QqIGwsIHNpemVfdCBzaXplKTsKLQotLyoqCi0gKiBcYnJpZWYgV3JhcCBgR3JhcGhpY0J1ZmZlcmAgaW4gYEFud0J1ZmZlcmAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgd3JhcHBlciBvZiB0eXBlIGBBbndCdWZmZXJgLgotICogXHBhcmFtW2luXSBsIFRoZSBzb3VyY2UgYEdyYXBoaWNCdWZmZXJgLgotICovCi0vLyB3cmFwOiBHcmFwaGljQnVmZmVyIC0+IEFud0J1ZmZlcgotdm9pZCB3cmFwQXMoQW53QnVmZmVyKiB0LCBHcmFwaGljQnVmZmVyIGNvbnN0JiBsKTsKLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgQW53QnVmZmVyYCB0byBgR3JhcGhpY0J1ZmZlcmAuCi0gKgotICogXHBhcmFtW291dF0gbCBUaGUgZGVzdGluYXRpb24gYEdyYXBoaWNCdWZmZXJgLgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYEFud0J1ZmZlcmAuCi0gKgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGR1cGxpY2F0ZSBhbGwgZmlsZSBkZXNjcmlwdG9ycyBpbiBccCB0LgotICovCi0vLyBjb252ZXJ0OiBBbndCdWZmZXIgLT4gR3JhcGhpY0J1ZmZlcgotLy8gUmVmOiBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL3VpL0dyYXBoaWNCdWZmZXIuY3BwOiBHcmFwaGljQnVmZmVyOjpmbGF0dGVuCi1ib29sIGNvbnZlcnRUbyhHcmFwaGljQnVmZmVyKiBsLCBBbndCdWZmZXIgY29uc3QmIHQpOwotCi0vKioKLSAqIENvbnZlcnNpb24gZnVuY3Rpb25zIGZvciB0eXBlcyBvdXRzaWRlIG1lZGlhCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFNvbWUgb2JqZWN0cyBpbiBsaWJ1aSBhbmQgbGliZ3VpIHRoYXQgd2VyZSBtYWRlIHRvIGdvIHRocm91Z2ggYmluZGVyIGNhbGxzIGRvCi0gKiBub3QgZXhwb3NlIHdheXMgdG8gcmVhZCBvciB3cml0ZSB0aGVpciBmaWVsZHMgdG8gdGhlIHB1YmxpYy4gVG8gcGFzcyBhbgotICogb2JqZWN0IG9mIHRoaXMga2luZCB0aHJvdWdoIHRoZSBISURMIGJvdW5kYXJ5LCB0cmFuc2xhdGlvbiBmdW5jdGlvbnMgbmVlZCB0bwotICogd29yayBhcm91bmQgdGhlIGFjY2VzcyByZXN0cmljdGlvbiBieSB1c2luZyB0aGUgcHVibGljbHkgYXZhaWxhYmxlCi0gKiBgZmxhdHRlbigpYCBhbmQgYHVuZmxhdHRlbigpYCBmdW5jdGlvbnMuCi0gKgotICogQWxsIGBmbGF0dGVuKClgIGFuZCBgdW5mbGF0dGVuKClgIG92ZXJsb2FkcyBmb2xsb3cgdGhlIHNhbWUgY29udmVudGlvbiBhcwotICogZm9sbG93czoKLSAqCi0gKiAgICAgc3RhdHVzX3QgZmxhdHRlbihPYmplY3RUeXBlIGNvbnN0JiBvYmplY3QsCi0gKiAgICAgICAgICAgICAgICAgICAgICBbT3RoZXJUeXBlIGNvbnN0JiBvdGhlciwgLi4uXQotICogICAgICAgICAgICAgICAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLAotICogICAgICAgICAgICAgICAgICAgICAgaW50KiYgZmRzLCBzaXplX3QmIG51bUZkcykKLSAqCi0gKiAgICAgc3RhdHVzX3QgdW5mbGF0dGVuKE9iamVjdFR5cGUqIG9iamVjdCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgW090aGVyVHlwZSogb3RoZXIsIC4uLixdCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgaW50KiYgZmRzLCBzaXplX3QmIG51bUZkcykKLSAqCi0gKiBUaGUgbnVtYmVyIG9mIGBvdGhlcmAgcGFyYW1ldGVycyB2YXJpZXMgZGVwZW5kaW5nIG9uIHRoZSBgT2JqZWN0VHlwZWAuIEZvcgotICogZXhhbXBsZSwgaW4gdGhlIHByb2Nlc3Mgb2YgdW5mbGF0dGVuaW5nIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zCi0gKiBgaGlkbF9oYW5kbGVgLCBgb3RoZXJgIGlzIG5lZWRlZCB0byBob2xkIGBuYXRpdmVfaGFuZGxlX3RgIG9iamVjdHMgdGhhdCB3aWxsCi0gKiBiZSBjcmVhdGVkLgotICoKLSAqIFRoZSBsYXN0IGZvdXIgcGFyYW1ldGVycyBhbHdheXMgd29yayB0aGUgc2FtZSB3YXkgaW4gYWxsIG92ZXJsb2FkcyBvZgotICogYGZsYXR0ZW4oKWAgYW5kIGB1bmZsYXR0ZW4oKWA6Ci0gKiAtIEZvciBgZmxhdHRlbigpYCwgYGJ1ZmZlcmAgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIG5vbi1mZCBidWZmZXIgdG8gYmUgZmlsbGVkLAotICogICBgc2l6ZWAgaXMgdGhlIHNpemUgKGluIGJ5dGVzKSBvZiB0aGUgbm9uLWZkIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IGBidWZmZXJgLAotICogICBgZmRzYCBpcyB0aGUgcG9pbnRlciB0byB0aGUgZmQgYnVmZmVyIHRvIGJlIGZpbGxlZCwgYW5kIGBudW1GZHNgIGlzIHRoZQotICogICBzaXplIChpbiBpbnRzKSBvZiB0aGUgZmQgYnVmZmVyIHBvaW50ZWQgdG8gYnkgYGZkc2AuCi0gKiAtIEZvciBgdW5mbGF0dGVuKClgLCBgYnVmZmVyYCBpcyB0aGUgcG9pbnRlciB0byB0aGUgbm9uLWZkIGJ1ZmZlciB0byBiZSByZWFkCi0gKiAgIGZyb20sIGBzaXplYCBpcyB0aGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSBub24tZmQgYnVmZmVyIHBvaW50ZWQgdG8gYnkKLSAqICAgYGJ1ZmZlcmAsIGBmZHNgIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBmZCBidWZmZXIgdG8gYmUgcmVhZCBmcm9tLCBhbmQKLSAqICAgYG51bUZkc2AgaXMgdGhlIHNpemUgKGluIGludHMpIG9mIHRoZSBmZCBidWZmZXIgcG9pbnRlZCB0byBieSBgZmRzYC4KLSAqIC0gQWZ0ZXIgYSBzdWNjZXNzZnVsIGNhbGwgdG8gYGZsYXR0ZW4oKWAgb3IgYHVuZmxhdHRlbigpYCwgYGJ1ZmZlcmAgYW5kIGBmZHNgCi0gKiAgIHdpbGwgYmUgYWR2YW5jZWQsIHdoaWxlIGBzaXplYCBhbmQgYG51bUZkc2Agd2lsbCBiZSBkZWNyZWFzZWQgdG8gcmVmbGVjdAotICogICBob3cgbXVjaCBzdG9yYWdlL2RhdGEgb2YgdGhlIHR3byBidWZmZXJzIChmZCBhbmQgbm9uLWZkKSBoYXZlIGJlZW4gdXNlZC4KLSAqIC0gQWZ0ZXIgYW4gdW5zdWNjZXNzZnVsIGNhbGwsIHRoZSB2YWx1ZXMgb2YgYGJ1ZmZlcmAsIGBzaXplYCwgYGZkc2AgYW5kCi0gKiAgIGBudW1GZHNgIGFyZSBpbnZhbGlkLgotICoKLSAqIFRoZSByZXR1cm4gdmFsdWUgb2YgYSBzdWNjZXNzZnVsIGBmbGF0dGVuKClgIG9yIGB1bmZsYXR0ZW4oKWAgY2FsbCB3aWxsIGJlCi0gKiBgT0tgIChhbHNvIGFsaWFzZWQgYXMgYE5PX0VSUk9SYCkuIEFueSBvdGhlciB2YWx1ZXMgaW5kaWNhdGUgYSBmYWlsdXJlLgotICoKLSAqIEZvciBlYWNoIG9iamVjdCB0eXBlIHRoYXQgc3VwcG9ydHMgZmxhdHRlbmluZywgdGhlcmUgd2lsbCBiZSB0d28gYWNjb21wYW55aW5nCi0gKiBmdW5jdGlvbnM6IGBnZXRGbGF0dGVuZWRTaXplKClgIGFuZCBgZ2V0RmRDb3VudCgpYC4gYGdldEZsYXR0ZW5lZFNpemUoKWAgd2lsbAotICogcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub24tZmQgYnVmZmVyIHRoYXQgdGhlIG9iamVjdCB3aWxsIG5lZWQgZm9yCi0gKiBmbGF0dGVuaW5nLiBgZ2V0RmRDb3VudCgpYCB3aWxsIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgZmQgYnVmZmVyIHRoYXQgdGhlCi0gKiBvYmplY3Qgd2lsbCBuZWVkIGZvciBmbGF0dGVuaW5nLgotICoKLSAqIFRoZSBzZXQgb2YgdGhlc2UgZm91ciBmdW5jdGlvbnMsIGBnZXRGbGF0dGVuZWRTaXplKClgLCBgZ2V0RmRDb3VudCgpYCwKLSAqIGBmbGF0dGVuKClgIGFuZCBgdW5mbGF0dGVuKClgLCBhcmUgc2ltaWxhciB0byBmdW5jdGlvbnMgb2YgdGhlIHNhbWUgbmFtZSBpbgotICogdGhlIGFic3RyYWN0IGNsYXNzIGBGbGF0dGVuYWJsZWAuIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhhdCBmdW5jdGlvbnMgaW4KLSAqIHRoaXMgZmlsZSBhcmUgbm90IG1lbWJlciBmdW5jdGlvbnMgb2YgdGhlIG9iamVjdCB0eXBlLiBGb3IgZXhhbXBsZSwgd2Ugd3JpdGUKLSAqCi0gKiAgICAgZmxhdHRlbih4LCBidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKQotICoKLSAqIGluc3RlYWQgb2YKLSAqCi0gKiAgICAgeC5mbGF0dGVuKGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpCi0gKgotICogYmVjYXVzZSB3ZSBjYW5ub3QgbW9kaWZ5IHRoZSB0eXBlIG9mIGB4YC4KLSAqCi0gKiBUaGVyZSBpcyBvbmUgZXhjZXB0aW9uIHRvIHRoZSBuYW1pbmcgY29udmVudGlvbjogYGhpZGxfaGFuZGxlYCB0aGF0Ci0gKiByZXByZXNlbnRzIGEgZmVuY2UuIFRoZSBmb3VyIGZ1bmN0aW9ucyBmb3IgdGhpcyAiRmVuY2UiIHR5cGUgaGF2ZSB0aGUgd29yZAotICogIkZlbmNlIiBhdHRjaGVkIHRvIHRoZWlyIG5hbWVzIGJlY2F1c2UgdGhlIG9iamVjdCB0eXBlLCB3aGljaCBpcwotICogYGhpZGxfaGFuZGxlYCwgZG9lcyBub3QgY2FycnkgdGhlIHNwZWNpYWwgbWVhbmluZyB0aGF0IHRoZSBvYmplY3QgaXRzZWxmIGNhbgotICogb25seSBjb250YWluIHplcm8gb3Igb25lIGZpbGUgZGVzY3JpcHRvci4KLSAqLwotCi0vLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvdWkvRmVuY2UuY3BwCi0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbm9uLWZkIGJ1ZmZlciByZXF1aXJlZCB0byBmbGF0dGVuIGEgZmVuY2UuCi0gKgotICogXHBhcmFtW2luXSBmZW5jZSBUaGUgaW5wdXQgZmVuY2Ugb2YgdHlwZSBgaGlkbF9oYW5kbGVgLgotICogXHJldHVybiBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCi0gKgotICogVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zIDQsIHdoaWNoIGlzIHRoZSBudW1iZXIgb2YKLSAqIGJ5dGVzIHJlcXVpcmVkIHRvIHN0b3JlIHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gdGhlIGZkCi0gKiBwYXJ0IG9mIHRoZSBmbGF0IGJ1ZmZlci4KLSAqLwotc2l6ZV90IGdldEZlbmNlRmxhdHRlbmVkU2l6ZShoaWRsX2hhbmRsZSBjb25zdCYgZmVuY2UpOwotCi0vKioKLSAqIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBhIGZlbmNlLgotICoKLSAqIFxwYXJhbVtpbl0gZmVuY2UgVGhlIGlucHV0IGZlbmNlIG9mIHR5cGUgYGhpZGxfaGFuZGxlYC4KLSAqIFxyZXR1cm4gYDBgIGlmIFxwIGZlbmNlIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IsIG9yIGAxYAotICogb3RoZXJ3aXNlLgotICovCi1zaXplX3QgZ2V0RmVuY2VGZENvdW50KGhpZGxfaGFuZGxlIGNvbnN0JiBmZW5jZSk7Ci0KLS8qKgotICogXGJyaWVmIFVuZmxhdHRlbiBgRmVuY2VgIHRvIGBoaWRsX2hhbmRsZWAuCi0gKgotICogXHBhcmFtW291dF0gZmVuY2UgVGhlIGRlc3RpbmF0aW9uIGBoaWRsX2hhbmRsZWAuCi0gKiBccGFyYW1bb3V0XSBuaCBUaGUgdW5kZXJseWluZyBuYXRpdmUgaGFuZGxlLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICoKLSAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYE5PX0VSUk9SYCwgXHAgbmggd2lsbCBwb2ludCB0byBhIG5ld2x5IGNyZWF0ZWQKLSAqIG5hdGl2ZSBoYW5kbGUsIHdoaWNoIG5lZWRzIHRvIGJlIGRlbGV0ZWQgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAKLSAqIGFmdGVyd2FyZHMuCi0gKi8KLXN0YXR1c190IHVuZmxhdHRlbkZlbmNlKGhpZGxfaGFuZGxlKiBmZW5jZSwgbmF0aXZlX2hhbmRsZV90KiogbmgsCi0gICAgICAgIHZvaWQgY29uc3QqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50IGNvbnN0KiYgZmRzLCBzaXplX3QmIG51bUZkcyk7Ci0KLS8qKgotICogXGJyaWVmIEZsYXR0ZW4gYGhpZGxfaGFuZGxlYCBhcyBgRmVuY2VgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBoaWRsX2hhbmRsZWAuCi0gKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKi8KLXN0YXR1c190IGZsYXR0ZW5GZW5jZShoaWRsX2hhbmRsZSBjb25zdCYgZmVuY2UsCi0gICAgICAgIHZvaWQqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50KiYgZmRzLCBzaXplX3QmIG51bUZkcyk7Ci0KLS8qKgotICogXGJyaWVmIFdyYXAgYEZlbmNlYCBpbiBgaGlkbF9oYW5kbGVgLgotICoKLSAqIFxwYXJhbVtvdXRdIHQgVGhlIHdyYXBwZXIgb2YgdHlwZSBgaGlkbF9oYW5kbGVgLgotICogXHBhcmFtW291dF0gbmggVGhlIG5hdGl2ZSBoYW5kbGUgcG9pbnRlZCB0byBieSBccCB0LgotICogXHBhcmFtW2luXSBsIFRoZSBzb3VyY2UgYEZlbmNlYC4KLSAqCi0gKiBPbiBzdWNjZXNzLCBccCBuaCB3aWxsIGhvbGQgYSBuZXdseSBjcmVhdGVkIG5hdGl2ZSBoYW5kbGUsIHdoaWNoIG11c3QgYmUKLSAqIGRlbGV0ZWQgbWFudWFsbHkgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAgYWZ0ZXJ3YXJkcy4KLSAqLwotLy8gd3JhcDogRmVuY2UgLT4gaGlkbF9oYW5kbGUKLWJvb2wgd3JhcEFzKGhpZGxfaGFuZGxlKiB0LCBuYXRpdmVfaGFuZGxlX3QqKiBuaCwgRmVuY2UgY29uc3QmIGwpOwotCi0vKioKLSAqIFxicmllZiBDb252ZXJ0IGBoaWRsX2hhbmRsZWAgdG8gYEZlbmNlYC4KLSAqCi0gKiBccGFyYW1bb3V0XSBsIFRoZSBkZXN0aW5hdGlvbiBgRmVuY2VgLiBgbGAgbXVzdCBub3QgaGF2ZSBiZWVuIHVzZWQKLSAqIChgbC0+aXNWYWxpZCgpYCBtdXN0IHJldHVybiBgZmFsc2VgKSBiZWZvcmUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgaGlkbF9oYW5kbGVgLgotICoKLSAqIElmIFxwIHQgY29udGFpbnMgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IsIGl0IHdpbGwgYmUgZHVwbGljYXRlZC4KLSAqLwotLy8gY29udmVydDogaGlkbF9oYW5kbGUgLT4gRmVuY2UKLWJvb2wgY29udmVydFRvKEZlbmNlKiBsLCBoaWRsX2hhbmRsZSBjb25zdCYgdCk7Ci0KLS8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy91aS9GZW5jZVRpbWUuY3BwOiBGZW5jZVRpbWU6OlNuYXBzaG90Ci0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbm9uLWZkIGJ1ZmZlciByZXF1aXJlZCB0byBmbGF0dGVuCi0gKiBgRmVuY2VUaW1lU25hcHNob3RgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEZlbmNlVGltZVNuYXBzaG90YC4KLSAqIFxyZXR1cm4gVGhlIHJlcXVpcmVkIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgotICovCi1zaXplX3QgZ2V0RmxhdHRlbmVkU2l6ZShIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdCBjb25zdCYgdCk7Ci0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluCi0gKiBgRmVuY2VUaW1lU25hcHNob3RgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEZlbmNlVGltZVNuYXBzaG90YC4KLSAqIFxyZXR1cm4gVGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBccCBzbmFwc2hvdC4KLSAqLwotc2l6ZV90IGdldEZkQ291bnQoSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3QgY29uc3QmIHQpOwotCi0vKioKLSAqIFxicmllZiBGbGF0dGVuIGBGZW5jZVRpbWVTbmFwc2hvdGAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYEZlbmNlVGltZVNuYXBzaG90YC4KLSAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZHVwbGljYXRlIHRoZSBmaWxlIGRlc2NyaXB0b3IgaW4gYHQuZmVuY2VgIGlmIGB0LnN0YXRlID09Ci0gKiBGRU5DRWAuCi0gKi8KLXN0YXR1c190IGZsYXR0ZW4oSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3QgY29uc3QmIHQsCi0gICAgICAgIHZvaWQqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50KiYgZmRzLCBzaXplX3QmIG51bUZkcyk7Ci0KLS8qKgotICogXGJyaWVmIFVuZmxhdHRlbiBgRmVuY2VUaW1lU25hcHNob3RgLgotICoKLSAqIFxwYXJhbVtvdXRdIHQgVGhlIGRlc3RpbmF0aW9uIGBGZW5jZVRpbWVTbmFwc2hvdGAuCi0gKiBccGFyYW1bb3V0XSBuaCBUaGUgdW5kZXJseWluZyBuYXRpdmUgaGFuZGxlLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICoKLSAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYE5PX0VSUk9SYCBhbmQgdGhlIGNvbnN0cnVjdGVkIHNuYXBzaG90IGNvbnRhaW5zIGEKLSAqIGZpbGUgZGVzY3JpcHRvciwgXHAgbmggd2lsbCBiZSBjcmVhdGVkIHRvIGhvbGQgdGhhdCBmaWxlIGRlc2NyaXB0b3IuIEluIHRoaXMKLSAqIGNhc2UsIFxwIG5oIG5lZWRzIHRvIGJlIGRlbGV0ZWQgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAgYWZ0ZXJ3YXJkcy4KLSAqLwotc3RhdHVzX3QgdW5mbGF0dGVuKAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdCogdCwgbmF0aXZlX2hhbmRsZV90KiogbmgsCi0gICAgICAgIHZvaWQgY29uc3QqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50IGNvbnN0KiYgZmRzLCBzaXplX3QmIG51bUZkcyk7Ci0KLS8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy9ndWkvRnJhbWVUaW1lc3RhbXBzLmNwcDogRnJhbWVFdmVudHNEZWx0YQotCi0vKioKLSAqIFxicmllZiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIG5vbi1mZCBidWZmZXIgcmVxdWlyZWQgdG8gZmxhdHRlbgotICogYEZyYW1lRXZlbnRzRGVsdGFgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEZyYW1lRXZlbnRzRGVsdGFgLgotICogXHJldHVybiBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCi0gKi8KLXNpemVfdCBnZXRGbGF0dGVuZWRTaXplKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRzRGVsdGEgY29uc3QmIHQpOwotCi0vKioKLSAqIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbgotICogYEZyYW1lRXZlbnRzRGVsdGFgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEZyYW1lRXZlbnRzRGVsdGFgLgotICogXHJldHVybiBUaGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHQuCi0gKi8KLXNpemVfdCBnZXRGZENvdW50KEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRzRGVsdGEgY29uc3QmIHQpOwotCi0vKioKLSAqIFxicmllZiBVbmZsYXR0ZW4gYEZyYW1lRXZlbnRzRGVsdGFgLgotICoKLSAqIFxwYXJhbVtvdXRdIHQgVGhlIGRlc3RpbmF0aW9uIGBGcmFtZUV2ZW50c0RlbHRhYC4KLSAqIFxwYXJhbVtvdXRdIG5oIFRoZSB1bmRlcmx5aW5nIGFycmF5IG9mIG5hdGl2ZSBoYW5kbGVzLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICoKLSAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYE5PX0VSUk9SYCwgXHAgbmggd2lsbCBoYXZlIGxlbmd0aCA0LCBhbmQgaXQgd2lsbCBiZQotICogcG9wdWxhdGVkIHdpdGggYG51bGxwdHJgIG9yIG5ld2x5IGNyZWF0ZWQgaGFuZGxlcy4gRWFjaCBub24tbnVsbCBzbG90IGluIFxwCi0gKiBuaCB3aWxsIG5lZWQgdG8gYmUgZGVsZXRlZCBtYW51YWxseSB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYC4KLSAqLwotc3RhdHVzX3QgdW5mbGF0dGVuKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRzRGVsdGEqIHQsCi0gICAgICAgIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+KiBuaCwKLSAgICAgICAgdm9pZCBjb25zdComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQgY29uc3QqJiBmZHMsIHNpemVfdCYgbnVtRmRzKTsKLQotLyoqCi0gKiBcYnJpZWYgRmxhdHRlbiBgRnJhbWVFdmVudHNEZWx0YWAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYEZyYW1lRXZlbnRzRGVsdGFgLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gXHAgdC4KLSAqLwotLy8gUmVmOiBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL2d1aS9GcmFtZVRpbWVzdGFtcC5jcHA6Ci0vLyAgICAgIEZyYW1lRXZlbnRzRGVsdGE6OmZsYXR0ZW4KLXN0YXR1c190IGZsYXR0ZW4oSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudHNEZWx0YSBjb25zdCYgdCwKLSAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQqJiBmZHMsIHNpemVfdCBudW1GZHMpOwotCi0vLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvZ3VpL0ZyYW1lVGltZXN0YW1wcy5jcHA6IEZyYW1lRXZlbnRIaXN0b3J5RGVsdGEKLQotLyoqCi0gKiBcYnJpZWYgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub24tZmQgYnVmZmVyIHJlcXVpcmVkIHRvIGZsYXR0ZW4KLSAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqIFxyZXR1cm4gVGhlIHJlcXVpcmVkIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgotICovCi1zaXplX3QgZ2V0RmxhdHRlbmVkU2l6ZSgKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSBjb25zdCYgdCk7Ci0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluCi0gKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKiBccmV0dXJuIFRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gXHAgdC4KLSAqLwotc2l6ZV90IGdldEZkQ291bnQoCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEgY29uc3QmIHQpOwotCi0vKioKLSAqIFxicmllZiBVbmZsYXR0ZW4gYEZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICoKLSAqIFxwYXJhbVtvdXRdIHQgVGhlIGRlc3RpbmF0aW9uIGBGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqIFxwYXJhbVtvdXRdIG5oIFRoZSB1bmRlcmx5aW5nIGFycmF5IG9mIGFycmF5cyBvZiBuYXRpdmUgaGFuZGxlcy4KLSAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KLSAqCi0gKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGBOT19FUlJPUmAsIFxwIG5oIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggYG51bGxwdHJgIG9yCi0gKiBuZXdseSBjcmVhdGVkIGhhbmRsZXMuIFRoZSBzZWNvbmQgZGltZW5zaW9uIG9mIFxwIG5oIHdpbGwgYmUgNC4gRWFjaCBub24tbnVsbAotICogc2xvdCBpbiBccCBuaCB3aWxsIG5lZWQgdG8gYmUgZGVsZXRlZCBtYW51YWxseSB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYC4KLSAqLwotc3RhdHVzX3QgdW5mbGF0dGVuKAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhKiB0LAotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiA+KiBuaCwKLSAgICAgICAgdm9pZCBjb25zdComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQgY29uc3QqJiBmZHMsIHNpemVfdCYgbnVtRmRzKTsKLQotLyoqCi0gKiBcYnJpZWYgRmxhdHRlbiBgRnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYEZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gXHAgdC4KLSAqLwotc3RhdHVzX3QgZmxhdHRlbigKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSBjb25zdCYgdCwKLSAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQqJiBmZHMsIHNpemVfdCYgbnVtRmRzKTsKLQotLyoqCi0gKiBcYnJpZWYgV3JhcCBgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURhdGFgIGluCi0gKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgd3JhcHBlciBvZiB0eXBlCi0gKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKiBccGFyYW1bb3V0XSBuaCBUaGUgYXJyYXkgb2YgYXJyYXkgb2YgbmF0aXZlIGhhbmRsZXMgdGhhdCBhcmUgcmVmZXJyZWQgdG8gYnkKLSAqIG1lbWJlcnMgb2YgXHAgdC4KLSAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICoKLSAqIE9uIHN1Y2Nlc3MsIGVhY2ggbWVtYmVyIG9mIFxwIG5oIHdpbGwgYmUgZWl0aGVyIGBudWxscHRyYCBvciBhIG5ld2x5IGNyZWF0ZWQKLSAqIG5hdGl2ZSBoYW5kbGUuIEFsbCB0aGUgbm9uLWBudWxscHRyYCBlbGVtZW50cyBtdXN0IGJlIGRlbGV0ZWQgaW5kaXZpZHVhbGx5Ci0gKiB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYC4KLSAqLwotYm9vbCB3cmFwQXMoSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSogdCwKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gPiogbmgsCi0gICAgICAgIDo6YW5kcm9pZDo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSBjb25zdCYgbCk7Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgIHRvCi0gKiBgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqCi0gKiBccGFyYW1bb3V0XSBsIFRoZSBkZXN0aW5hdGlvbiBgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZHVwbGljYXRlIGFsbCBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBccCB0LgotICovCi1ib29sIGNvbnZlcnRUbygKLSAgICAgICAgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhKiBsLAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIGNvbnN0JiB0KTsKLQotLy8gUmVmOiBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL3VpL1JlZ2lvbi5jcHAKLQotLyoqCi0gKiBcYnJpZWYgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgcmVxdWlyZWQgdG8gZmxhdHRlbiBgUmVnaW9uYC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBSZWdpb25gLgotICogXHJldHVybiBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCi0gKi8KLXNpemVfdCBnZXRGbGF0dGVuZWRTaXplKFJlZ2lvbiBjb25zdCYgdCk7Ci0KLS8qKgotICogXGJyaWVmIFVuZmxhdHRlbiBgUmVnaW9uYC4KLSAqCi0gKiBccGFyYW1bb3V0XSB0IFRoZSBkZXN0aW5hdGlvbiBgUmVnaW9uYC4KLSAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICovCi1zdGF0dXNfdCB1bmZsYXR0ZW4oUmVnaW9uKiB0LCB2b2lkIGNvbnN0KiYgYnVmZmVyLCBzaXplX3QmIHNpemUpOwotCi0vKioKLSAqIFxicmllZiBGbGF0dGVuIGBSZWdpb25gLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBSZWdpb25gLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKi8KLXN0YXR1c190IGZsYXR0ZW4oUmVnaW9uIGNvbnN0JiB0LCB2b2lkKiYgYnVmZmVyLCBzaXplX3QmIHNpemUpOwotCi0vKioKLSAqIFxicmllZiBDb252ZXJ0IGA6OmFuZHJvaWQ6OlJlZ2lvbmAgdG8gYFJlZ2lvbmAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgZGVzdGluYXRpb24gYFJlZ2lvbmAuCi0gKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgOjphbmRyb2lkOjpSZWdpb25gLgotICovCi0vLyBjb252ZXJ0OiA6OmFuZHJvaWQ6OlJlZ2lvbiAtPiBSZWdpb24KLWJvb2wgY29udmVydFRvKFJlZ2lvbiogdCwgOjphbmRyb2lkOjpSZWdpb24gY29uc3QmIGwpOwotCi0vKioKLSAqIFxicmllZiBDb252ZXJ0IGBSZWdpb25gIHRvIGA6OmFuZHJvaWQ6OlJlZ2lvbmAuCi0gKgotICogXHBhcmFtW291dF0gbCBUaGUgZGVzdGluYXRpb24gYDo6YW5kcm9pZDo6UmVnaW9uYC4KLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBSZWdpb25gLgotICovCi0vLyBjb252ZXJ0OiBSZWdpb24gLT4gOjphbmRyb2lkOjpSZWdpb24KLWJvb2wgY29udmVydFRvKDo6YW5kcm9pZDo6UmVnaW9uKiBsLCBSZWdpb24gY29uc3QmIHQpOwotCi0vLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvZ3VpL0JHcmFwaGljQnVmZmVyUHJvZHVjZXIuY3BwOgotLy8gICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0Ci0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHJlcXVpcmVkIHRvIGZsYXR0ZW4KLSAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqIFxyZXR1cm4gVGhlIHJlcXVpcmVkIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgotICovCi1zaXplX3QgZ2V0RmxhdHRlbmVkU2l6ZShIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IGNvbnN0JiB0KTsKLQotLyoqCi0gKiBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4KLSAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqIFxyZXR1cm4gVGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBccCB0LgotICovCi1zaXplX3QgZ2V0RmRDb3VudCgKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBjb25zdCYgdCk7Ci0vKioKLSAqIFxicmllZiBGbGF0dGVuIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKiBccGFyYW1bb3V0XSBuaCBUaGUgbmF0aXZlIGhhbmRsZSBjbG9uZWQgZnJvbSBgdC5mZW5jZWAuCi0gKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGR1cGxpY2F0ZSB0aGUgZmlsZSBkZXNjcmlwdG9yIGluIGB0LmZlbmNlYC4gKi8KLXN0YXR1c190IGZsYXR0ZW4oSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBjb25zdCYgdCwKLSAgICAgICAgbmF0aXZlX2hhbmRsZV90KiogbmgsCi0gICAgICAgIHZvaWQqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50KiYgZmRzLCBzaXplX3QmIG51bUZkcyk7Ci0KLS8qKgotICogXGJyaWVmIFVuZmxhdHRlbiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgZGVzdGluYXRpb24gYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICogXHBhcmFtW291dF0gbmggVGhlIHVuZGVybHlpbmcgbmF0aXZlIGhhbmRsZSBmb3IgYHQtPmZlbmNlYC4KLSAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KLSAqCi0gKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGBOT19FUlJPUmAgYW5kIGB0LT5mZW5jZWAgY29udGFpbnMgYSB2YWxpZCBmaWxlCi0gKiBkZXNjcmlwdG9yLCBccCBuaCB3aWxsIGJlIGEgbmV3bHkgY3JlYXRlZCBuYXRpdmUgaGFuZGxlIGhvbGRpbmcgdGhhdCBmaWxlCi0gKiBkZXNjcmlwdG9yLiBccCBuaCBuZWVkcyB0byBiZSBkZWxldGVkIHdpdGggYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgCi0gKiBhZnRlcndhcmRzLgotICovCi1zdGF0dXNfdCB1bmZsYXR0ZW4oCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQqIHQsIG5hdGl2ZV9oYW5kbGVfdCoqIG5oLAotICAgICAgICB2b2lkIGNvbnN0KiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludCBjb25zdComIGZkcywgc2l6ZV90JiBudW1GZHMpOwotCi0vKioKLSAqIFxicmllZiBXcmFwIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YCBpbgotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICoKLSAqIFxwYXJhbVtvdXRdIHQgVGhlIHdyYXBwZXIgb2YgdHlwZQotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICogXHBhcmFtW291dF0gbmggVGhlIHVuZGVybHlpbmcgbmF0aXZlIGhhbmRsZSBmb3IgYHQtPmZlbmNlYC4KLSAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqCi0gKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGB0cnVlYCBhbmQgYHQtPmZlbmNlYCBjb250YWlucyBhIHZhbGlkIGZpbGUKLSAqIGRlc2NyaXB0b3IsIFxwIG5oIHdpbGwgYmUgYSBuZXdseSBjcmVhdGVkIG5hdGl2ZSBoYW5kbGUgaG9sZGluZyB0aGF0IGZpbGUKLSAqIGRlc2NyaXB0b3IuIFxwIG5oIG5lZWRzIHRvIGJlIGRlbGV0ZWQgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAKLSAqIGFmdGVyd2FyZHMuCi0gKi8KLWJvb2wgd3JhcEFzKAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0KiB0LAotICAgICAgICBuYXRpdmVfaGFuZGxlX3QqKiBuaCwKLSAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBjb25zdCYgbCk7Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgIHRvCi0gKiBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKgotICogXHBhcmFtW291dF0gbCBUaGUgZGVzdGluYXRpb24gYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICoKLSAqIElmIGB0LmZlbmNlYCBoYXMgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IsIGl0IHdpbGwgYmUgZHVwbGljYXRlZC4KLSAqLwotYm9vbCBjb252ZXJ0VG8oCi0gICAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQqIGwsCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgY29uc3QmIHQpOwotCi0vLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvZ3VpL0JHcmFwaGljQnVmZmVyUHJvZHVjZXIuY3BwOgotLy8gICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dAotCi0vKioKLSAqIFxicmllZiBXcmFwIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAgaW4KLSAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgd3JhcHBlciBvZiB0eXBlCi0gKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgLgotICogXHBhcmFtW291dF0gbmggVGhlIGFycmF5IG9mIGFycmF5IG9mIG5hdGl2ZSBoYW5kbGVzIHRoYXQgYXJlIHJlZmVycmVkIHRvIGJ5Ci0gKiBtZW1iZXJzIG9mIFxwIHQuCi0gKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgLgotICoKLSAqIE9uIHN1Y2Nlc3MsIGVhY2ggbWVtYmVyIG9mIFxwIG5oIHdpbGwgYmUgZWl0aGVyIGBudWxscHRyYCBvciBhIG5ld2x5IGNyZWF0ZWQKLSAqIG5hdGl2ZSBoYW5kbGUuIEFsbCB0aGUgbm9uLWBudWxscHRyYCBlbGVtZW50cyBtdXN0IGJlIGRlbGV0ZWQgaW5kaXZpZHVhbGx5Ci0gKiB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYC4KLSAqLwotLy8gd3JhcDogQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgLT4KLS8vIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0Ci1ib29sIHdyYXBBcyhIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCogdCwKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gPiogbmgsCi0gICAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IGNvbnN0JiBsKTsKLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgIHRvCi0gKiBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgLgotICoKLSAqIFxwYXJhbVtvdXRdIGwgVGhlIGRlc3RpbmF0aW9uIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAuCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgYWxsIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHQuCi0gKi8KLS8vIGNvbnZlcnQ6IEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IC0+Ci0vLyBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dAotYm9vbCBjb252ZXJ0VG8oCi0gICAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0KiBsLAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCBjb25zdCYgdCk7Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlYCB0bwotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlYC4KLSAqCi0gKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgotICogXHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgotICovCi1IR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZSB0b0hpZGxEaXNjb25uZWN0TW9kZSgKLSAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGUgbCk7Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlYCB0bwotICogYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlYC4KLSAqCi0gKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgotICogXHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgotICovCi1CR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZSB0b0d1aURpc2Nvbm5lY3RNb2RlKAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZSB0KTsKLQotfSAgLy8gbmFtZXNwYWNlIGNvbnZlcnNpb24KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTUVESUFfU1RBR0VGUklHSFRfQlFIRUxQRVJfQ09OVkVSU0lPTl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuaAppbmRleCBhYmM4OTEwLi5iNGM0ZDRhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuaApAQCAtMTksOCArMTksNiBAQAogI2RlZmluZSBHUkFQSElDX0JVRkZFUl9TT1VSQ0VfSF8KIAogI2luY2x1ZGUgPGJpbmRlci9TdGF0dXMuaD4KLSNpbmNsdWRlIDxndWkvQnVmZmVyUXVldWUuaD4KLSNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIAogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CkBAIC0yOCwxMyArMjYsMTcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyUmVmbGVjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29tcG9uZW50V3JhcHBlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMS4wL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2J1ZmZlcnF1ZXVlLzIuMC9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogdXNpbmcgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czsKIAogc3RydWN0IEZyYW1lRHJvcHBlcjsKLQorY2xhc3MgQnVmZmVySXRlbTsKK2NsYXNzIElHcmFwaGljQnVmZmVyUHJvZHVjZXI7CitjbGFzcyBJR3JhcGhpY0J1ZmZlckNvbnN1bWVyOwogLyoKICAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBmZWVkIGNvZGVjcyBmcm9tIGEgU3VyZmFjZSB2aWEgQnVmZmVyUXVldWUgb3IKICAqIEhXIHByb2R1Y2VyLgpAQCAtNjgsNyArNzAsNyBAQAogICogKGV2ZW4gaWYgaXQgd2FzIGRyb3BwZWQpIHRvIHJlZW5jb2RlIGl0IGFmdGVyIGFuIGludGVydmFsIGlmIG5vIGZ1cnRoZXIKICAqIGZyYW1lcyBhcmUgc2VudCBieSB0aGUgcHJvZHVjZXIuCiAgKi8KLWNsYXNzIEdyYXBoaWNCdWZmZXJTb3VyY2UgOiBwdWJsaWMgQnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXIgeworY2xhc3MgR3JhcGhpY0J1ZmZlclNvdXJjZSA6IHB1YmxpYyBSZWZCYXNlIHsKIHB1YmxpYzoKICAgICBHcmFwaGljQnVmZmVyU291cmNlKCk7CiAKQEAgLTgyLDkgKzg0LDE3IEBACiAKICAgICAvLyBSZXR1cm5zIHRoZSBoYW5kbGUgdG8gdGhlIHByb2R1Y2VyIHNpZGUgb2YgdGhlIEJ1ZmZlclF1ZXVlLiAgQnVmZmVycwogICAgIC8vIHF1ZXVlZCBvbiB0aGlzIHdpbGwgYmUgcmVjZWl2ZWQgYnkgR3JhcGhpY0J1ZmZlclNvdXJjZS4KLSAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVByb2R1Y2VyOwotICAgIH0KKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgY29uc3Q7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBoYW5kbGUgdG8gdGhlIGJ1ZmZlcnF1ZXVlIEhBTCAoVjFfMCkgcHJvZHVjZXIgc2lkZSBvZiB0aGUgQnVmZmVyUXVldWUuCisgICAgLy8gQnVmZmVycyBxdWV1ZWQgb24gdGhpcyB3aWxsIGJlIHJlY2VpdmVkIGJ5IEdyYXBoaWNCdWZmZXJTb3VyY2UuCisgICAgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPgorICAgICAgICBnZXRIR3JhcGhpY0J1ZmZlclByb2R1Y2VyX1YxXzAoKSBjb25zdDsKKworICAgIC8vIFJldHVybnMgdGhlIGhhbmRsZSB0byB0aGUgYnVmZmVycXVldWUgSEFMIHByb2R1Y2VyIHNpZGUgb2YgdGhlIEJ1ZmZlclF1ZXVlLgorICAgIC8vIEJ1ZmZlcnMgcXVldWVkIG9uIHRoaXMgd2lsbCBiZSByZWNlaXZlZCBieSBHcmFwaGljQnVmZmVyU291cmNlLgorICAgIHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjJfMDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4KKyAgICAgICAgZ2V0SEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpIGNvbnN0OwogCiAgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiBjb21wb25lbnQgdHJhbnNpdGlvbnMgdG8gcnVubmluZyBzdGF0ZSwgd2hpY2ggbWVhbnMKICAgICAvLyB3ZSBjYW4gc3RhcnQgaGFuZGluZyBpdCBidWZmZXJzLiAgSWYgd2UgYWxyZWFkeSBoYXZlIGJ1ZmZlcnMgb2YgZGF0YQpAQCAtMTkwLDggKzIwMCw2IEBACiAgICAgc3RhdHVzX3Qgc2V0Q29sb3JBc3BlY3RzKGludDMyX3QgYXNwZWN0c1BhY2tlZCk7CiAKIHByb3RlY3RlZDoKLSAgICAvLyBCUTo6Q29uc3VtZXJMaXN0ZW5lciBpbnRlcmZhY2UKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogICAgIC8vIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIGludGVyZmFjZSwgY2FsbGVkIHdoZW4gYSBuZXcgZnJhbWUgb2YKICAgICAvLyBkYXRhIGlzIGF2YWlsYWJsZS4gIElmIHdlJ3JlIGV4ZWN1dGluZyBhbmQgYSBjb2RlYyBidWZmZXIgaXMKQEAgLTE5OSwxOSArMjA3LDI0IEBACiAgICAgLy8gaW50byB0aGUgY29kZWMgYnVmZmVyLCBhbmQgY2FsbCBFbXB0eVtUaGlzXUJ1ZmZlci4gIElmIHdlJ3JlIG5vdCB5ZXQKICAgICAvLyBleGVjdXRpbmcgb3IgdGhlcmUncyBubyBjb2RlYyBidWZmZXIgYXZhaWxhYmxlLCB3ZSBqdXN0IGluY3JlbWVudAogICAgIC8vIG1OdW1GcmFtZXNBdmFpbGFibGUgYW5kIHJldHVybi4KLSAgICB2b2lkIG9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgaXRlbSkgb3ZlcnJpZGU7CisgICAgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pIDsKIAogICAgIC8vIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIGludGVyZmFjZSwgY2FsbGVkIHdoZW4gdGhlIGNsaWVudCBoYXMKICAgICAvLyByZWxlYXNlZCBvbmUgb3IgbW9yZSBHcmFwaGljQnVmZmVycy4gIFdlIGNsZWFyIG91dCB0aGUgYXBwcm9wcmlhdGUKICAgICAvLyBzZXQgb2YgbUJ1ZmZlclNsb3QgZW50cmllcy4KLSAgICB2b2lkIG9uQnVmZmVyc1JlbGVhc2VkKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvbkJ1ZmZlcnNSZWxlYXNlZCgpIDsKIAogICAgIC8vIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIGludGVyZmFjZSwgY2FsbGVkIHdoZW4gdGhlIGNsaWVudCBoYXMKICAgICAvLyBjaGFuZ2VkIHRoZSBzaWRlYmFuZCBzdHJlYW0uIEdyYXBoaWNCdWZmZXJTb3VyY2UgZG9lc24ndCBoYW5kbGUgc2lkZWJhbmQKICAgICAvLyBzdHJlYW1zIHNvIHRoaXMgaXMgYSBuby1vcCAoYW5kIHNob3VsZCBuZXZlciBiZSBjYWxsZWQpLgotICAgIHZvaWQgb25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uU2lkZWJhbmRTdHJlYW1DaGFuZ2VkKCkgOwogCiBwcml2YXRlOgorICAgIC8vIEJROjpDb25zdW1lckxpc3RlbmVyIGludGVyZmFjZQorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHN0cnVjdCBDb25zdW1lclByb3h5OworICAgIHNwPENvbnN1bWVyUHJveHk+IG1Db25zdW1lclByb3h5OworCiAgICAgLy8gTG9jaywgY292ZXJzIGFsbCBtZW1iZXIgdmFyaWFibGVzLgogICAgIG11dGFibGUgTXV0ZXggbU11dGV4OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTRhMWMyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX1NUQUdFRlJJR0hUX1dHUkFQSElDQlVGRkVSUFJPRFVDRVJfSF8KLSNkZWZpbmUgTUVESUFfU1RBR0VGUklHSFRfV0dSQVBISUNCVUZGRVJQUk9EVUNFUl9IXwotCi0jaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0JpbmRlci5oPgotI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+Ci0jaW5jbHVkZSA8Z3VpL0lQcm9kdWNlckxpc3RlbmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29udmVyc2lvbi5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dQcm9kdWNlckxpc3RlbmVyLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9idWZmZXJxdWV1ZS8xLjAvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpWMV8wOjpBbndCdWZmZXI7Ci11c2luZyA6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKLXVzaW5nIDo6YW5kcm9pZDo6c3A7Ci0KLXR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjoKLSAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwotdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OgotICAgICAgICBJUHJvZHVjZXJMaXN0ZW5lciBIUHJvZHVjZXJMaXN0ZW5lcjsKLQotdHlwZWRlZiA6OmFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXIgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKLXR5cGVkZWYgOjphbmRyb2lkOjpJUHJvZHVjZXJMaXN0ZW5lciBCUHJvZHVjZXJMaXN0ZW5lcjsKLXVzaW5nIDo6YW5kcm9pZDo6Qm5HcmFwaGljQnVmZmVyUHJvZHVjZXI7Ci0KLSNpZm5kZWYgTE9HCi1zdHJ1Y3QgTE9HX2R1bW15IHsKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgICBMT0dfZHVtbXkmIG9wZXJhdG9yPDwgKGNvbnN0IFQmKSB7IHJldHVybiAqdGhpczsgfQotfTsKLQotI2RlZmluZSBMT0coeCkgIExPR19kdW1teSgpCi0jZW5kaWYKLQotLy8gSW5zdGFudGlhdGUgb25seSBpZiBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGlzIGJhc2Ugb2YgQkFTRS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBCQVNFLAotICAgICAgICAgIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19iYXNlX29mPEhHcmFwaGljQnVmZmVyUHJvZHVjZXIsIEJBU0U+Ojp2YWx1ZT46OnR5cGU+Ci1zdHJ1Y3QgVFdHcmFwaGljQnVmZmVyUHJvZHVjZXIgOiBwdWJsaWMgQkFTRSB7Ci0gICAgVFdHcmFwaGljQnVmZmVyUHJvZHVjZXIoc3A8QkdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gY29uc3QmIGJhc2UpIDogbUJhc2UoYmFzZSkge30KLSAgICBSZXR1cm48dm9pZD4gcmVxdWVzdEJ1ZmZlcihpbnQzMl90IHNsb3QsIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OnJlcXVlc3RCdWZmZXJfY2IgX2hpZGxfY2IpIG92ZXJyaWRlIHsKLSAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQmFzZS0+cmVxdWVzdEJ1ZmZlcihzbG90LCAmYnVmKTsKLSAgICAgICAgQW53QnVmZmVyIGFud0J1ZmZlcnt9OwotICAgICAgICBpZiAoYnVmICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIDo6YW5kcm9pZDo6Y29udmVyc2lvbjo6d3JhcEFzKCZhbndCdWZmZXIsICpidWYpOwotICAgICAgICB9Ci0gICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cyksIGFud0J1ZmZlcik7Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gICAgUmV0dXJuPGludDMyX3Q+IHNldE1heERlcXVldWVkQnVmZmVyQ291bnQoaW50MzJfdCBtYXhEZXF1ZXVlZEJ1ZmZlcnMpIG92ZXJyaWRlIHsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1CYXNlLT5zZXRNYXhEZXF1ZXVlZEJ1ZmZlckNvdW50KAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4obWF4RGVxdWV1ZWRCdWZmZXJzKSkpOwotICAgIH0KLQotICAgIFJldHVybjxpbnQzMl90PiBzZXRBc3luY01vZGUoYm9vbCBhc3luYykgb3ZlcnJpZGUgewotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUJhc2UtPnNldEFzeW5jTW9kZShhc3luYykpOwotICAgIH0KLQotICAgIFJldHVybjx2b2lkPiBkZXF1ZXVlQnVmZmVyKAotICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKLSAgICAgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IGZvcm1hdCwgdWludDMyX3QgdXNhZ2UsCi0gICAgICAgICAgICBib29sIGdldEZyYW1lVGltZXN0YW1wcywgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6ZGVxdWV1ZUJ1ZmZlcl9jYiBfaGlkbF9jYikgb3ZlcnJpZGUgewotICAgICAgICBpbnQgc2xvdHt9OwotICAgICAgICBzcDxGZW5jZT4gZmVuY2U7Ci0gICAgICAgIDo6YW5kcm9pZDo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSBvdXRUaW1lc3RhbXBzOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQmFzZS0+ZGVxdWV1ZUJ1ZmZlcigKLSAgICAgICAgICAgICZzbG90LCAmZmVuY2UsIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDw6OmFuZHJvaWQ6OlBpeGVsRm9ybWF0Pihmb3JtYXQpLCB1c2FnZSwgbnVsbHB0ciwKLSAgICAgICAgICAgIGdldEZyYW1lVGltZXN0YW1wcyA/ICZvdXRUaW1lc3RhbXBzIDogbnVsbHB0cik7Ci0gICAgICAgIGhpZGxfaGFuZGxlIHRGZW5jZXt9OwotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIHRPdXRUaW1lc3RhbXBze307Ci0KLSAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBuaCA9IG51bGxwdHI7Ci0gICAgICAgIGlmICgoZmVuY2UgPT0gbnVsbHB0cikgfHwgITo6YW5kcm9pZDo6Y29udmVyc2lvbjo6d3JhcEFzKCZ0RmVuY2UsICZuaCwgKmZlbmNlKSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmRlcXVldWVCdWZmZXIgLSAiCi0gICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIG91dHB1dCBmZW5jZSI7Ci0gICAgICAgICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLAotICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oc2xvdCksCi0gICAgICAgICAgICAgICAgICAgICB0RmVuY2UsCi0gICAgICAgICAgICAgICAgICAgICB0T3V0VGltZXN0YW1wcyk7Ci0gICAgICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgICAgICB9Ci0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+ID4gbmhBQTsKLSAgICAgICAgaWYgKGdldEZyYW1lVGltZXN0YW1wcyAmJiAhOjphbmRyb2lkOjpjb252ZXJzaW9uOjp3cmFwQXMoJnRPdXRUaW1lc3RhbXBzLCAmbmhBQSwgb3V0VGltZXN0YW1wcykpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpkZXF1ZXVlQnVmZmVyIC0gIgotICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBvdXRwdXQgdGltZXN0YW1wcyI7Ci0gICAgICAgICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLAotICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oc2xvdCksCi0gICAgICAgICAgICAgICAgICAgICB0RmVuY2UsCi0gICAgICAgICAgICAgICAgICAgICB0T3V0VGltZXN0YW1wcyk7Ci0gICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7Ci0gICAgICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihzbG90KSwKLSAgICAgICAgICAgICAgICB0RmVuY2UsCi0gICAgICAgICAgICAgICAgdE91dFRpbWVzdGFtcHMpOwotICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7Ci0gICAgICAgIGlmIChnZXRGcmFtZVRpbWVzdGFtcHMpIHsKLSAgICAgICAgICAgIGZvciAoYXV0byYgbmhBIDogbmhBQSkgewotICAgICAgICAgICAgICAgIGZvciAoYXV0byYgaGFuZGxlIDogbmhBKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gICAgUmV0dXJuPGludDMyX3Q+IGRldGFjaEJ1ZmZlcihpbnQzMl90IHNsb3QpIG92ZXJyaWRlIHsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1CYXNlLT5kZXRhY2hCdWZmZXIoc2xvdCkpOwotICAgIH0KLQotICAgIFJldHVybjx2b2lkPiBkZXRhY2hOZXh0QnVmZmVyKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmRldGFjaE5leHRCdWZmZXJfY2IgX2hpZGxfY2IpIG92ZXJyaWRlIHsKLSAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gb3V0QnVmZmVyOwotICAgICAgICBzcDxGZW5jZT4gb3V0RmVuY2U7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1CYXNlLT5kZXRhY2hOZXh0QnVmZmVyKCZvdXRCdWZmZXIsICZvdXRGZW5jZSk7Ci0gICAgICAgIEFud0J1ZmZlciB0QnVmZmVye307Ci0gICAgICAgIGhpZGxfaGFuZGxlIHRGZW5jZXt9OwotCi0gICAgICAgIGlmIChvdXRCdWZmZXIgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmRldGFjaE5leHRCdWZmZXIgLSAiCi0gICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIG91dHB1dCBidWZmZXIiOwotICAgICAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwgdEJ1ZmZlciwgdEZlbmNlKTsKLSAgICAgICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgOjphbmRyb2lkOjpjb252ZXJzaW9uOjp3cmFwQXMoJnRCdWZmZXIsICpvdXRCdWZmZXIpOwotICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIG5oID0gbnVsbHB0cjsKLSAgICAgICAgaWYgKChvdXRGZW5jZSAhPSBudWxscHRyKSAmJiAhOjphbmRyb2lkOjpjb252ZXJzaW9uOjp3cmFwQXMoJnRGZW5jZSwgJm5oLCAqb3V0RmVuY2UpKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6ZGV0YWNoTmV4dEJ1ZmZlciAtICIKLSAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgb3V0cHV0IGZlbmNlIjsKLSAgICAgICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cyksIHRCdWZmZXIsIHRGZW5jZSk7Ci0gICAgICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwgdEJ1ZmZlciwgdEZlbmNlKTsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOwotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLQotICAgIFJldHVybjx2b2lkPiBhdHRhY2hCdWZmZXIoY29uc3QgQW53QnVmZmVyJiBidWZmZXIsIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmF0dGFjaEJ1ZmZlcl9jYiBfaGlkbF9jYikgb3ZlcnJpZGUgewotICAgICAgICBpbnQgb3V0U2xvdDsKLSAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gbEJ1ZmZlciA9IG5ldyBHcmFwaGljQnVmZmVyKCk7Ci0gICAgICAgIGlmICghOjphbmRyb2lkOjpjb252ZXJzaW9uOjpjb252ZXJ0VG8obEJ1ZmZlci5nZXQoKSwgYnVmZmVyKSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmF0dGFjaEJ1ZmZlciAtICIKLSAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgaW5wdXQgbmF0aXZlIHdpbmRvdyBidWZmZXIiOwotICAgICAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oQkFEX1ZBTFVFKSwgLTEpOwotICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQmFzZS0+YXR0YWNoQnVmZmVyKCZvdXRTbG90LCBsQnVmZmVyKTsKLQotICAgICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLCBzdGF0aWNfY2FzdDxpbnQzMl90PihvdXRTbG90KSk7Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gICAgUmV0dXJuPHZvaWQ+IHF1ZXVlQnVmZmVyKAotICAgICAgICAgICAgaW50MzJfdCBzbG90LCBjb25zdCBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0JiBpbnB1dCwKLSAgICAgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OnF1ZXVlQnVmZmVyX2NiIF9oaWRsX2NiKSBvdmVycmlkZSB7Ci0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IHRPdXRwdXR7fTsKLSAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBsSW5wdXQoCi0gICAgICAgICAgICAgICAgMCwgZmFsc2UsIEhBTF9EQVRBU1BBQ0VfVU5LTk9XTiwKLSAgICAgICAgICAgICAgICA6OmFuZHJvaWQ6OlJlY3QoMCwgMCwgMSwgMSksCi0gICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19TQ0FMSU5HX01PREVfRlJFRVpFLAotICAgICAgICAgICAgICAgIDAsIDo6YW5kcm9pZDo6RmVuY2U6Ok5PX0ZFTkNFKTsKLSAgICAgICAgaWYgKCE6OmFuZHJvaWQ6OmNvbnZlcnNpb246OmNvbnZlcnRUbygmbElucHV0LCBpbnB1dCkpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpxdWV1ZUJ1ZmZlciAtICIKLSAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgaW5wdXQiOwotICAgICAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oQkFEX1ZBTFVFKSwgdE91dHB1dCk7Ci0gICAgICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgICAgICB9Ci0gICAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IGxPdXRwdXQ7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1CYXNlLT5xdWV1ZUJ1ZmZlcigKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHNsb3QpLCBsSW5wdXQsICZsT3V0cHV0KTsKLQotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiA+IG5oQUE7Ci0gICAgICAgIGlmICghOjphbmRyb2lkOjpjb252ZXJzaW9uOjp3cmFwQXMoJnRPdXRwdXQsICZuaEFBLCBsT3V0cHV0KSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OnF1ZXVlQnVmZmVyIC0gIgotICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBvdXRwdXQiOwotICAgICAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oQkFEX1ZBTFVFKSwgdE91dHB1dCk7Ci0gICAgICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwgdE91dHB1dCk7Ci0gICAgICAgIGZvciAoYXV0byYgbmhBIDogbmhBQSkgewotICAgICAgICAgICAgZm9yIChhdXRvJiBuaCA6IG5oQSkgewotICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLQotICAgIFJldHVybjxpbnQzMl90PiBjYW5jZWxCdWZmZXIoaW50MzJfdCBzbG90LCBjb25zdCBoaWRsX2hhbmRsZSYgZmVuY2UpIG92ZXJyaWRlIHsKLSAgICAgICAgc3A8RmVuY2U+IGxGZW5jZSA9IG5ldyBGZW5jZSgpOwotICAgICAgICBpZiAoITo6YW5kcm9pZDo6Y29udmVyc2lvbjo6Y29udmVydFRvKGxGZW5jZS5nZXQoKSwgZmVuY2UpKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6Y2FuY2VsQnVmZmVyIC0gIgotICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBpbnB1dCBmZW5jZSI7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4oQkFEX1ZBTFVFKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUJhc2UtPmNhbmNlbEJ1ZmZlcihzdGF0aWNfY2FzdDxpbnQ+KHNsb3QpLCBsRmVuY2UpKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48dm9pZD4gcXVlcnkoaW50MzJfdCB3aGF0LCBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpxdWVyeV9jYiBfaGlkbF9jYikgb3ZlcnJpZGUgewotICAgICAgICBpbnQgbFZhbHVlOwotICAgICAgICBpbnQgbFJldHVybiA9IG1CYXNlLT5xdWVyeShzdGF0aWNfY2FzdDxpbnQ+KHdoYXQpLCAmbFZhbHVlKTsKLSAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4obFJldHVybiksIHN0YXRpY19jYXN0PGludDMyX3Q+KGxWYWx1ZSkpOwotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLQotICAgIFJldHVybjx2b2lkPiBjb25uZWN0KGNvbnN0IHNwPEhQcm9kdWNlckxpc3RlbmVyPiYgbGlzdGVuZXIsCi0gICAgICAgICAgICBpbnQzMl90IGFwaSwgYm9vbCBwcm9kdWNlckNvbnRyb2xsZWRCeUFwcCwKLSAgICAgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmNvbm5lY3RfY2IgX2hpZGxfY2IpIG92ZXJyaWRlIHsKLSAgICAgICAgc3A8QlByb2R1Y2VyTGlzdGVuZXI+IGxMaXN0ZW5lciA9IGxpc3RlbmVyID09IG51bGxwdHIgPwotICAgICAgICAgICAgICAgIG51bGxwdHIgOiBuZXcgTFdQcm9kdWNlckxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgbE91dHB1dDsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUJhc2UtPmNvbm5lY3QobExpc3RlbmVyLAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oYXBpKSwKLSAgICAgICAgICAgICAgICBwcm9kdWNlckNvbnRyb2xsZWRCeUFwcCwKLSAgICAgICAgICAgICAgICAmbE91dHB1dCk7Ci0KLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgdE91dHB1dHt9OwotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiA+IG5oQUE7Ci0gICAgICAgIGlmICghOjphbmRyb2lkOjpjb252ZXJzaW9uOjp3cmFwQXMoJnRPdXRwdXQsICZuaEFBLCBsT3V0cHV0KSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmNvbm5lY3QgLSAiCi0gICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIG91dHB1dCI7Ci0gICAgICAgICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLCB0T3V0cHV0KTsKLSAgICAgICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLCB0T3V0cHV0KTsKLSAgICAgICAgZm9yIChhdXRvJiBuaEEgOiBuaEFBKSB7Ci0gICAgICAgICAgICBmb3IgKGF1dG8mIG5oIDogbmhBKSB7Ci0gICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gICAgUmV0dXJuPGludDMyX3Q+IGRpc2Nvbm5lY3QoCi0gICAgICAgICAgICBpbnQzMl90IGFwaSwKLSAgICAgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlIG1vZGUpIG92ZXJyaWRlIHsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1CYXNlLT5kaXNjb25uZWN0KAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oYXBpKSwKLSAgICAgICAgICAgICAgICA6OmFuZHJvaWQ6OmNvbnZlcnNpb246OnRvR3VpRGlzY29ubmVjdE1vZGUobW9kZSkpKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48aW50MzJfdD4gc2V0U2lkZWJhbmRTdHJlYW0oY29uc3QgaGlkbF9oYW5kbGUmIHN0cmVhbSkgb3ZlcnJpZGUgewotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUJhc2UtPnNldFNpZGViYW5kU3RyZWFtKE5hdGl2ZUhhbmRsZTo6Y3JlYXRlKAotICAgICAgICAgICAgICAgIHN0cmVhbSA/IG5hdGl2ZV9oYW5kbGVfY2xvbmUoc3RyZWFtKSA6IE5VTEwsIHRydWUpKSk7Ci0gICAgfQotCi0gICAgUmV0dXJuPHZvaWQ+IGFsbG9jYXRlQnVmZmVycygKLSAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCi0gICAgICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICB1aW50MzJfdCB1c2FnZSkgb3ZlcnJpZGUgewotICAgICAgICBtQmFzZS0+YWxsb2NhdGVCdWZmZXJzKAotICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8OjphbmRyb2lkOjpQaXhlbEZvcm1hdD4oZm9ybWF0KSwKLSAgICAgICAgICAgICAgICB1c2FnZSk7Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gICAgUmV0dXJuPGludDMyX3Q+IGFsbG93QWxsb2NhdGlvbihib29sIGFsbG93KSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihtQmFzZS0+YWxsb3dBbGxvY2F0aW9uKGFsbG93KSk7Ci0gICAgfQotCi0gICAgUmV0dXJuPGludDMyX3Q+IHNldEdlbmVyYXRpb25OdW1iZXIodWludDMyX3QgZ2VuZXJhdGlvbk51bWJlcikgb3ZlcnJpZGUgewotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUJhc2UtPnNldEdlbmVyYXRpb25OdW1iZXIoZ2VuZXJhdGlvbk51bWJlcikpOwotICAgIH0KLQotICAgIFJldHVybjx2b2lkPiBnZXRDb25zdW1lck5hbWUoSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6Z2V0Q29uc3VtZXJOYW1lX2NiIF9oaWRsX2NiKSBvdmVycmlkZSB7Ci0gICAgICAgIF9oaWRsX2NiKG1CYXNlLT5nZXRDb25zdW1lck5hbWUoKS5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gICAgUmV0dXJuPGludDMyX3Q+IHNldFNoYXJlZEJ1ZmZlck1vZGUoYm9vbCBzaGFyZWRCdWZmZXJNb2RlKSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihtQmFzZS0+c2V0U2hhcmVkQnVmZmVyTW9kZShzaGFyZWRCdWZmZXJNb2RlKSk7Ci0gICAgfQotCi0gICAgUmV0dXJuPGludDMyX3Q+IHNldEF1dG9SZWZyZXNoKGJvb2wgYXV0b1JlZnJlc2gpIG92ZXJyaWRlIHsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1CYXNlLT5zZXRBdXRvUmVmcmVzaChhdXRvUmVmcmVzaCkpOwotICAgIH0KLQotICAgIFJldHVybjxpbnQzMl90PiBzZXREZXF1ZXVlVGltZW91dChpbnQ2NF90IHRpbWVvdXROcykgb3ZlcnJpZGUgewotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUJhc2UtPnNldERlcXVldWVUaW1lb3V0KHRpbWVvdXROcykpOwotICAgIH0KLQotICAgIFJldHVybjx2b2lkPiBnZXRMYXN0UXVldWVkQnVmZmVyKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmdldExhc3RRdWV1ZWRCdWZmZXJfY2IgX2hpZGxfY2IpIG92ZXJyaWRlIHsKLSAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gbE91dEJ1ZmZlciA9IG5ldyBHcmFwaGljQnVmZmVyKCk7Ci0gICAgICAgIHNwPEZlbmNlPiBsT3V0RmVuY2UgPSBuZXcgRmVuY2UoKTsKLSAgICAgICAgZmxvYXQgbE91dFRyYW5zZm9ybU1hdHJpeFsxNl07Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1CYXNlLT5nZXRMYXN0UXVldWVkQnVmZmVyKAotICAgICAgICAgICAgICAgICZsT3V0QnVmZmVyLCAmbE91dEZlbmNlLCBsT3V0VHJhbnNmb3JtTWF0cml4KTsKLQotICAgICAgICBBbndCdWZmZXIgdE91dEJ1ZmZlcnt9OwotICAgICAgICBpZiAobE91dEJ1ZmZlciAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICA6OmFuZHJvaWQ6OmNvbnZlcnNpb246OndyYXBBcygmdE91dEJ1ZmZlciwgKmxPdXRCdWZmZXIpOwotICAgICAgICB9Ci0gICAgICAgIGhpZGxfaGFuZGxlIHRPdXRGZW5jZXt9OwotICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIG5oID0gbnVsbHB0cjsKLSAgICAgICAgaWYgKChsT3V0RmVuY2UgPT0gbnVsbHB0cikgfHwgITo6YW5kcm9pZDo6Y29udmVyc2lvbjo6d3JhcEFzKCZ0T3V0RmVuY2UsICZuaCwgKmxPdXRGZW5jZSkpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpnZXRMYXN0UXVldWVkQnVmZmVyIC0gIgotICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBvdXRwdXQgZmVuY2UiOwotICAgICAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwKLSAgICAgICAgICAgICAgICAgICAgdE91dEJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgdE91dEZlbmNlLAotICAgICAgICAgICAgICAgICAgICBoaWRsX2FycmF5PGZsb2F0LCAxNj4oKSk7Ci0gICAgICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgICAgICB9Ci0gICAgICAgIGhpZGxfYXJyYXk8ZmxvYXQsIDE2PiB0T3V0VHJhbnNmb3JtTWF0cml4KGxPdXRUcmFuc2Zvcm1NYXRyaXgpOwotCi0gICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cyksIHRPdXRCdWZmZXIsIHRPdXRGZW5jZSwgdE91dFRyYW5zZm9ybU1hdHJpeCk7Ci0gICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48dm9pZD4gZ2V0RnJhbWVUaW1lc3RhbXBzKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmdldEZyYW1lVGltZXN0YW1wc19jYiBfaGlkbF9jYikgb3ZlcnJpZGUgewotICAgICAgICA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEgbERlbHRhOwotICAgICAgICBtQmFzZS0+Z2V0RnJhbWVUaW1lc3RhbXBzKCZsRGVsdGEpOwotCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEgdERlbHRhe307Ci0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+ID4gbmhBQTsKLSAgICAgICAgaWYgKCE6OmFuZHJvaWQ6OmNvbnZlcnNpb246OndyYXBBcygmdERlbHRhLCAmbmhBQSwgbERlbHRhKSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmdldEZyYW1lVGltZXN0YW1wcyAtICIKLSAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgb3V0cHV0IGZyYW1lIHRpbWVzdGFtcHMiOwotICAgICAgICAgICAgX2hpZGxfY2IodERlbHRhKTsKLSAgICAgICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBfaGlkbF9jYih0RGVsdGEpOwotICAgICAgICBmb3IgKGF1dG8mIG5oQSA6IG5oQUEpIHsKLSAgICAgICAgICAgIGZvciAoYXV0byYgbmggOiBuaEEpIHsKLSAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48dm9pZD4gZ2V0VW5pcXVlSWQoSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6Z2V0VW5pcXVlSWRfY2IgX2hpZGxfY2IpIG92ZXJyaWRlIHsKLSAgICAgICAgdWludDY0X3Qgb3V0SWR7fTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUJhc2UtPmdldFVuaXF1ZUlkKCZvdXRJZCk7Ci0gICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cyksIG91dElkKTsKLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgc3A8QkdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbUJhc2U7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE1FRElBX1NUQUdFRlJJR0hUX1dHUkFQSElDQlVGRkVSUFJPRFVDRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV1Byb2R1Y2VyTGlzdGVuZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV1Byb2R1Y2VyTGlzdGVuZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmViYmE4Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dQcm9kdWNlckxpc3RlbmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9TVEFHRUZSSUdIVF9XUFJPRFVDRVJMSVNURU5FUl9IXwotI2RlZmluZSBNRURJQV9TVEFHRUZSSUdIVF9XUFJPRFVDRVJMSVNURU5FUl9IXwotCi0jaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lCaW5kZXIuaD4KLSNpbmNsdWRlIDxndWkvSVByb2R1Y2VyTGlzdGVuZXIuaD4KLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMS4wL0lQcm9kdWNlckxpc3RlbmVyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdXNpbmcgOjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwotdXNpbmcgOjphbmRyb2lkOjpzcDsKLQotdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OklQcm9kdWNlckxpc3RlbmVyCi0gICAgICAgIEhQcm9kdWNlckxpc3RlbmVyOwotdHlwZWRlZiA6OmFuZHJvaWQ6OklQcm9kdWNlckxpc3RlbmVyCi0gICAgICAgIEJQcm9kdWNlckxpc3RlbmVyOwotdXNpbmcgOjphbmRyb2lkOjpCblByb2R1Y2VyTGlzdGVuZXI7Ci0KLXN0cnVjdCBUV1Byb2R1Y2VyTGlzdGVuZXIgOiBwdWJsaWMgSFByb2R1Y2VyTGlzdGVuZXIgewotICAgIHNwPEJQcm9kdWNlckxpc3RlbmVyPiBtQmFzZTsKLSAgICBUV1Byb2R1Y2VyTGlzdGVuZXIoc3A8QlByb2R1Y2VyTGlzdGVuZXI+IGNvbnN0JiBiYXNlKTsKLSAgICBSZXR1cm48dm9pZD4gb25CdWZmZXJSZWxlYXNlZCgpIG92ZXJyaWRlOwotICAgIFJldHVybjxib29sPiBuZWVkc1JlbGVhc2VOb3RpZnkoKSBvdmVycmlkZTsKLX07Ci0KLWNsYXNzIExXUHJvZHVjZXJMaXN0ZW5lciA6IHB1YmxpYyBCblByb2R1Y2VyTGlzdGVuZXIgewotcHVibGljOgotICAgIHNwPEhQcm9kdWNlckxpc3RlbmVyPiBtQmFzZTsKLSAgICBMV1Byb2R1Y2VyTGlzdGVuZXIoc3A8SFByb2R1Y2VyTGlzdGVuZXI+IGNvbnN0JiBiYXNlKTsKLSAgICB2b2lkIG9uQnVmZmVyUmVsZWFzZWQoKSBvdmVycmlkZTsKLSAgICBib29sIG5lZWRzUmVsZWFzZU5vdGlmeSgpIG92ZXJyaWRlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBNRURJQV9TVEFHRUZSSUdIVF9XUFJPRFVDRVJMSVNURU5FUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BbmRyb2lkLmJwCmluZGV4IDczNTI4NTQuLjQ2YjNiOGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FuZHJvaWQuYnAKQEAgLTEsMjIgKzEsMTIgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9hYWNkZWMiLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgdm5kazogewotICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgIH0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLAogCiAgICAgc3JjczogWwogICAgICAgICAiU29mdEFBQzIuY3BwIiwKICAgICAgICAgIkRyY1ByZXNNb2RlV3JhcC5jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAotICAgIF0sCi0KLSAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAotCiAgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCiAKICAgICBzYW5pdGl6ZTogewpAQCAtMjUsMTkgKzE1LDExIEBACiAgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiAKICAgICBzdGF0aWNfbGliczogWyJsaWJGcmF1bmhvZmVyQUFDIl0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmNwcAppbmRleCBiYzBhNjlmLi40MWJjMTZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmNwcApAQCAtMTQ3LDcgKzE0Nyw3IEBACiAgICAgbUVuZE9mT3V0cHV0ID0gZmFsc2U7CiAgICAgbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgPSAwOwogICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplID0gMjA0OCAqIE1BWF9DSEFOTkVMX0NPVU5UICoga051bURlbGF5QmxvY2tzTWF4OwotICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXIgPSBuZXcgc2hvcnRbbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemVdOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXIgPSBuZXcgaW50MTZfdFttT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZV07CiAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zID0gMDsKICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA9IDA7CiAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlckZpbGxlZCA9IDA7CkBAIC03MzgsNyArNzM4LDcgQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGN1cnJlbnRUaW1lID0gbUJ1ZmZlclRpbWVzdGFtcHMudG9wKCk7CiAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUaW1lICs9IG1TdHJlYW1JbmZvLT5hYWNTYW1wbGVzUGVyRnJhbWUgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDBsbCAvIG1TdHJlYW1JbmZvLT5hYWNTYW1wbGVSYXRlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDAwMDBMTCAvIG1TdHJlYW1JbmZvLT5hYWNTYW1wbGVSYXRlOwogICAgICAgICAgICAgICAgICAgICBtQnVmZmVyVGltZXN0YW1wcy5hZGQoY3VycmVudFRpbWUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC05ODksNyArOTg5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkanVzdC9pbnRlcnBvbGF0ZSBuZXh0IHRpbWUgc3RhbXAKICAgICAgICAgICAgICAgICAgICAgICAgICpjdXJyZW50QnVmTGVmdCAtPSBkZWNvZGVkU2l6ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICpuZXh0VGltZVN0YW1wICs9IG1TdHJlYW1JbmZvLT5hYWNTYW1wbGVzUGVyRnJhbWUgKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwMDAwbGwgLyBtU3RyZWFtSW5mby0+YWFjU2FtcGxlUmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMExMIC8gbVN0cmVhbUluZm8tPmFhY1NhbXBsZVJhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiYWRqdXN0ZWQgbmV4dFRpbWVTdGFtcC9zaXplIHRvICVsbGQvJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSAqbmV4dFRpbWVTdGFtcCwgKmN1cnJlbnRCdWZMZWZ0KTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvU29mdEFBQzIuaAppbmRleCA3M2EzOTY1Li41YmVlNzEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL1NvZnRBQUMyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9Tb2Z0QUFDMi5oCkBAIC04MSw3ICs4MSw3IEBACiAgICAgYm9vbCBtRW5kT2ZPdXRwdXQ7CiAgICAgaW50MzJfdCBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZDsKICAgICBpbnQzMl90IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplOwotICAgIHNob3J0ICptT3V0cHV0RGVsYXlSaW5nQnVmZmVyOworICAgIGludDE2X3QgKm1PdXRwdXREZWxheVJpbmdCdWZmZXI7CiAgICAgaW50MzJfdCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3M7CiAgICAgaW50MzJfdCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvczsKICAgICBpbnQzMl90IG1PdXRwdXREZWxheVJpbmdCdWZmZXJGaWxsZWQ7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQuYnAKaW5kZXggOTM0MjM1MS4uYmY3ODljNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQW5kcm9pZC5icApAQCAtMSwxOSArMSw5IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfYWFjZW5jIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKIAogICAgIHNyY3M6IFsiU29mdEFBQ0VuY29kZXIyLmNwcCJdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAotCi0gICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKLQogICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAogCiAgICAgc2FuaXRpemU6IHsKQEAgLTIyLDE4ICsxMiw3IEBACiAgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiAKICAgICBzdGF0aWNfbGliczogWyJsaWJGcmF1bmhvZmVyQUFDIl0sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyMi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL1NvZnRBQUNFbmNvZGVyMi5jcHAKaW5kZXggOTZlNjY4ZS4uNmU0MzdjZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9Tb2Z0QUFDRW5jb2RlcjIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvU29mdEFBQ0VuY29kZXIyLmNwcApAQCAtNjMsNyArNjMsNyBAQAogICAgICAgbUlucHV0U2l6ZSgwKSwKICAgICAgIG1JbnB1dEZyYW1lKE5VTEwpLAogICAgICAgbUFsbG9jYXRlZEZyYW1lU2l6ZSgwKSwKLSAgICAgIG1JbnB1dFRpbWVVcygtMWxsKSwKKyAgICAgIG1JbnB1dFRpbWVVcygtMUxMKSwKICAgICAgIG1TYXdJbnB1dEVPUyhmYWxzZSksCiAgICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpIHsKICAgICBpbml0UG9ydHMoKTsKQEAgLTU4Nyw3ICs1ODcsNyBAQAogICAgICAgICAgICAgLy8gIlRpbWUiIG9uIHRoZSBpbnB1dCBidWZmZXIgaGFzIGluIGVmZmVjdCBhZHZhbmNlZCBieSB0aGUKICAgICAgICAgICAgIC8vIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgd2UganVzdCBhZHZhbmNlZCBuT2Zmc2V0IGJ5LgogICAgICAgICAgICAgaW5IZWFkZXItPm5UaW1lU3RhbXAgKz0KLSAgICAgICAgICAgICAgICAoY29weSAqIDEwMDAwMDBsbCAvIG1TYW1wbGVSYXRlKQorICAgICAgICAgICAgICAgIChjb3B5ICogMTAwMDAwMExMIC8gbVNhbXBsZVJhdGUpCiAgICAgICAgICAgICAgICAgICAgIC8gKG1OdW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KSk7CiAKICAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA9PSAwKSB7CkBAIC03MjUsNyArNzI1LDcgQEAKICAgICBtQWxsb2NhdGVkRnJhbWVTaXplID0gMDsKIAogICAgIG1TZW50Q29kZWNTcGVjaWZpY0RhdGEgPSBmYWxzZTsKLSAgICBtSW5wdXRUaW1lVXMgPSAtMWxsOworICAgIG1JbnB1dFRpbWVVcyA9IC0xTEw7CiAgICAgbVNhd0lucHV0RU9TID0gZmFsc2U7CiAgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDRjMjk2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc3ViZGlycyA9IFsiKiJdCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL0FuZHJvaWQuYnAKaW5kZXggNTE3NzU5My4uNzcyZWJmOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vQW5kcm9pZC5icApAQCAtMSw5ICsxLDYgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAogCiAgICAgc3JjczogWwogICAgICAgICAic3JjL2FkZC5jcHAiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbF9hYnMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbF9hYnMuY3BwCmluZGV4IGZkMWM5MGQuLjdlMGFlOTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xfYWJzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sX2Ficy5jcHAKQEAgLTE3Niw3ICsxNzYsNyBAQAogLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiA7IEZVTkNUSU9OIENPREUKIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotV29yZDMyIExfYWJzKHJlZ2lzdGVyIFdvcmQzMiBMX3ZhcjEpCitXb3JkMzIgTF9hYnMoV29yZDMyIExfdmFyMSkKIHsKICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICA7IERlZmluZSBhbGwgbG9jYWwgdmFyaWFibGVzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sX3Nocl9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xfc2hyX3IuY3BwCmluZGV4IGY2MDlhNzMuLjQ3ZTFlZTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xfc2hyX3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xfc2hyX3IuY3BwCkBAIC0xOTAsNyArMTkwLDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogOyBGVU5DVElPTiBDT0RFCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLVdvcmQzMiBMX3Nocl9yKHJlZ2lzdGVyIFdvcmQzMiBMX3ZhcjEsIHJlZ2lzdGVyIFdvcmQxNiB2YXIyLCBGbGFnICpwT3ZlcmZsb3cpCitXb3JkMzIgTF9zaHJfcihXb3JkMzIgTF92YXIxLCBXb3JkMTYgdmFyMiwgRmxhZyAqcE92ZXJmbG93KQogewogICAgIFdvcmQzMiByZXN1bHQ7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xzcC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9sc3AuY3BwCmluZGV4IDBlM2Y3NzIuLjgxZDljZGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL2xzcC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbHNwLmNwcApAQCAtMTczLDcgKzE3Myw3IEBACiAgICAgKnN0ID0gTlVMTDsKIAogICAgIC8qIGFsbG9jYXRlIG1lbW9yeSAqLwotICAgIGlmICgocyA9IChsc3BTdGF0ZSAqKSBtYWxsb2Moc2l6ZW9mKGxzcFN0YXRlKSkpID09IE5VTEwpCisgICAgaWYgKChzID0gKGxzcFN0YXRlICopIGNhbGxvYyhzaXplb2YobHNwU3RhdGUpLCAxKSkgPT0gTlVMTCkKICAgICB7CiAgICAgICAgIC8qIGZwcmludGYoc3RkZXJyLCAibHNwX2luaXQ6IGNhbiBub3QgbWFsbG9jIHN0YXRlIHN0cnVjdHVyZVxuIik7ICovCiAgICAgICAgIHJldHVybiAtMTsKQEAgLTE4MiwxMSArMTgyLDEzIEBACiAgICAgLyogSW5pdGlhbGl6ZSBxdWFudGl6YXRpb24gc3RhdGUgKi8KICAgICBpZiAoMCAhPSBRX3Bsc2ZfaW5pdCgmcy0+cVN0KSkKICAgICB7CisgICAgICAgIGxzcF9leGl0KCZzKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIAogICAgIGlmICgwICE9IGxzcF9yZXNldChzKSkKICAgICB7CisgICAgICAgIGxzcF9leGl0KCZzKTsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbmVnYXRlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL25lZ2F0ZS5jcHAKaW5kZXggYmU1OGQyYi4uYWEzNjQyMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvbmVnYXRlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9uZWdhdGUuY3BwCkBAIC0xNjEsNyArMTYxLDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogOyBGVU5DVElPTiBDT0RFCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLVdvcmQxNiBuZWdhdGUocmVnaXN0ZXIgV29yZDE2IHZhcjEpCitXb3JkMTYgbmVnYXRlKFdvcmQxNiB2YXIxKQogewogICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIDsgRGVmaW5lIGFsbCBsb2NhbCB2YXJpYWJsZXMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3JvdW5kLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3JvdW5kLmNwcAppbmRleCA3MWQxNzAyLi42MzNhOGM5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9yb3VuZC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvcm91bmQuY3BwCkBAIC0xODQsNyArMTg0LDcgQEAKIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogOyBGVU5DVElPTiBDT0RFCiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLVdvcmQxNiBwdl9yb3VuZChyZWdpc3RlciBXb3JkMzIgTF92YXIxLCBGbGFnICpwT3ZlcmZsb3cpCitXb3JkMTYgcHZfcm91bmQoV29yZDMyIExfdmFyMSwgRmxhZyAqcE92ZXJmbG93KQogewogICAgIFdvcmQxNiAgcmVzdWx0OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zaHJfci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL3NyYy9zaHJfci5jcHAKaW5kZXggNjY1NmY5My4uY2RjYzI0NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9zcmMvc2hyX3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vc3JjL3Nocl9yLmNwcApAQCAtMTkzLDcgKzE5Myw3IEBACiAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIDsgRlVOQ1RJT04gQ09ERQogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi1Xb3JkMTYgc2hyX3IocmVnaXN0ZXIgV29yZDE2IHZhcjEsIHJlZ2lzdGVyIFdvcmQxNiB2YXIyLCBGbGFnICpwT3ZlcmZsb3cpCitXb3JkMTYgc2hyX3IoV29yZDE2IHZhcjEsIFdvcmQxNiB2YXIyLCBGbGFnICpwT3ZlcmZsb3cpCiB7CiAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgOyBEZWZpbmUgYWxsIGxvY2FsIHZhcmlhYmxlcwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLmJwCmluZGV4IDg4MGYxNjEuLmUxODExN2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQuYnAKQEAgLTQwLDcgKzQwLDYgQEAKICAgICAgICAgInNyYy93bWZfdG9fZXRzLmNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWyJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiXSwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbInNyYyJdLAogCiAgICAgY2ZsYWdzOiBbCkBAIC02OCwyMyArNjcsMTQgQEAKIAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2FtcmRlYyIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICB2bmRrOiB7Ci0gICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgfSwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCiAKICAgICBzcmNzOiBbIlNvZnRBTVIuY3BwIl0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAogICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKIAogICAgIGNmbGFnczogWwogICAgICAgICAiLURPU0NMX0lNUE9SVF9SRUY9IiwKLSAgICAgICAgIi1XZXJyb3IiLAogICAgIF0sCiAKICAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKQEAgLTEwMiwxNCArOTIsMTAgQEAKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAogICAgIF0sCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KKwogLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiBjY190ZXN0IHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfYW1ybmJkZWNfdGVzdCIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9Tb2Z0QU1SLmNwcAppbmRleCBiN2U4NGVjLi4zNGRkMDExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL1NvZnRBTVIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvU29mdEFNUi5jcHAKQEAgLTUwNSw3ICs1MDUsNyBAQAogCiAgICAgICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPQogICAgICAgICAgICAgICAgIG1BbmNob3JUaW1lVXMKLSAgICAgICAgICAgICAgICAgICAgKyAobU51bVNhbXBsZXNPdXRwdXQgKiAxMDAwMDAwbGwpIC8ga1NhbXBsZVJhdGVOQjsKKyAgICAgICAgICAgICAgICAgICAgKyAobU51bVNhbXBsZXNPdXRwdXQgKiAxMDAwMDAwTEwpIC8ga1NhbXBsZVJhdGVOQjsKIAogICAgICAgICAgICAgbU51bVNhbXBsZXNPdXRwdXQgKz0ga051bVNhbXBsZXNQZXJGcmFtZU5COwogICAgICAgICB9IGVsc2UgewpAQCAtNTEzLDcgKzUxMyw3IEBACiAKICAgICAgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9CiAgICAgICAgICAgICAgICAgbUFuY2hvclRpbWVVcwotICAgICAgICAgICAgICAgICAgICArIChtTnVtU2FtcGxlc091dHB1dCAqIDEwMDAwMDBsbCkgLyBrU2FtcGxlUmF0ZVdCOworICAgICAgICAgICAgICAgICAgICArIChtTnVtU2FtcGxlc091dHB1dCAqIDEwMDAwMDBMTCkgLyBrU2FtcGxlUmF0ZVdCOwogCiAgICAgICAgICAgICBtTnVtU2FtcGxlc091dHB1dCArPSBrTnVtU2FtcGxlc1BlckZyYW1lV0I7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL3NwX2RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3NyYy9zcF9kZWMuY3BwCmluZGV4IDI5ODliNzQuLjQ5Y2FmZmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvc3JjL3NwX2RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9zcmMvc3BfZGVjLmNwcApAQCAtMjY4LDEzICsyNjgsNyBAQAogICAgIGlmIChEZWNvZGVyX2Ftcl9pbml0KCZzLT5kZWNvZGVyX2FtclN0YXRlKQogICAgICAgICAgICAgfHwgUG9zdF9Qcm9jZXNzX3Jlc2V0KCZzLT5wb3N0SFBfc3RhdGUpKQogICAgIHsKLSAgICAgICAgU3BlZWNoX0RlY29kZV9GcmFtZVN0YXRlICp0bXAgPSBzOwotICAgICAgICAvKgotICAgICAgICAgKiAgZGVyZWZlcmVuY2luZyB0eXBlLXB1bm5lZCBwb2ludGVyIGF2b2lkCi0gICAgICAgICAqICBicmVha2luZyBzdHJpY3QtYWxpYXNpbmcgcnVsZXMKLSAgICAgICAgICovCi0gICAgICAgIHZvaWQqKiB0ZW1wVm9pZCA9ICh2b2lkKiopIHRtcDsKLSAgICAgICAgR1NNRGVjb2RlRnJhbWVFeGl0KHRlbXBWb2lkKTsKKyAgICAgICAgZnJlZShzKTsKICAgICAgICAgcmV0dXJuICgtMSk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvYW1ybmJkZWNfdGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvYW1ybmJkZWNfdGVzdC5jcHAKaW5kZXggNDFhOWU5OC4uNjIxZmRhOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L2Ftcm5iZGVjX3Rlc3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9hbXJuYmRlY190ZXN0LmNwcApAQCAtNjcsNiArNjcsNyBAQAogICAgIGludCBieXRlc1JlYWQgPSBmcmVhZChoZWFkZXIsIDEsIGtGaWxlSGVhZGVyU2l6ZSwgZnBJbnB1dCk7CiAgICAgaWYgKGJ5dGVzUmVhZCAhPSBrRmlsZUhlYWRlclNpemUgfHwgbWVtY21wKGhlYWRlciwgIiMhQU1SXG4iLCBrRmlsZUhlYWRlclNpemUpKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiSW52YWxpZCBBTVItTkIgZmlsZVxuIik7CisgICAgICAgIGZjbG9zZShmcElucHV0KTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogCkBAIC03OSw2ICs4MCw3IEBACiAgICAgU05ERklMRSAqaGFuZGxlID0gc2Zfb3Blbihhcmd2WzJdLCBTRk1fV1JJVEUsICZzZkluZm8pOwogICAgIGlmKCFoYW5kbGUpewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvdWxkIG5vdCBjcmVhdGUgJXNcbiIsIGFyZ3ZbMl0pOworICAgICAgICBmY2xvc2UoZnBJbnB1dCk7CiAgICAgICAgIHJldHVybiAxOwogICAgIH0KIApAQCAtODcsNiArODksOCBAQAogICAgIGludCBlcnIgPSBHU01Jbml0RGVjb2RlKCZhbXJIYW5kbGUsIChXb3JkOCopIkFNUk5CRGVjb2RlciIpOwogICAgIGlmKGVyciAhPSAwKXsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFcnJvciBjcmVhdGluZyBBTVItTkIgZGVjb2RlciBpbnN0YW5jZVxuIik7CisgICAgICAgIGZjbG9zZShmcElucHV0KTsKKyAgICAgICAgc2ZfY2xvc2UoaGFuZGxlKTsKICAgICAgICAgcmV0dXJuIDE7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQuYnAKaW5kZXggMTlmZDRhOC4uNDM4ZWQwNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5icApAQCAtNjIsNyArNjIsNyBAQAogICAgICAgICAic3JjL3Rvbl9zdGFiLmNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWyJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiXSwKKyAgICBoZWFkZXJfbGliczogWyJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIl0sCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJzcmMiXSwKIAogICAgIGNmbGFnczogWwpAQCAtODYsMjEgKzg2LDEyIEBACiAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9hbXJuYmVuYyIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICB2bmRrOiB7Ci0gICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgfSwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCiAKICAgICBzcmNzOiBbIlNvZnRBTVJOQkVuY29kZXIuY3BwIl0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAotICAgIF0sCiAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbInNyYyJdLAogCi0gICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKLQogICAgIC8vYWRkcmVzc2luZyBiLzI1NDA5NzQ0CiAgICAgLy9zYW5pdGl6ZTogewogICAgIC8vICAgIG1pc2NfdW5kZWZpbmVkOiBbCkBAIC0xMTEsMTMgKzEwMiw4IEBACiAgICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfYW1ybmJlbmMiXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIiwKICAgICBdLAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CiAKIC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9Tb2Z0QU1STkJFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvU29mdEFNUk5CRW5jb2Rlci5jcHAKaW5kZXggZjk3YzQ0Zi4uODVhYjY0ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9Tb2Z0QU1STkJFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL1NvZnRBTVJOQkVuY29kZXIuY3BwCkBAIC00OSw3ICs0OSw3IEBACiAgICAgICBtQml0UmF0ZSgwKSwKICAgICAgIG1Nb2RlKE1SNDc1KSwKICAgICAgIG1JbnB1dFNpemUoMCksCi0gICAgICBtSW5wdXRUaW1lVXMoLTFsbCksCisgICAgICBtSW5wdXRUaW1lVXMoLTFMTCksCiAgICAgICBtU2F3SW5wdXRFT1MoZmFsc2UpLAogICAgICAgbVNpZ25hbGxlZEVycm9yKGZhbHNlKSB7CiAgICAgaW5pdFBvcnRzKCk7CkBAIC0zNDAsNyArMzQwLDcgQEAKICAgICAgICAgICAgIC8vICJUaW1lIiBvbiB0aGUgaW5wdXQgYnVmZmVyIGhhcyBpbiBlZmZlY3QgYWR2YW5jZWQgYnkgdGhlCiAgICAgICAgICAgICAvLyBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdlIGp1c3QgYWR2YW5jZWQgbk9mZnNldCBieS4KICAgICAgICAgICAgIGluSGVhZGVyLT5uVGltZVN0YW1wICs9Ci0gICAgICAgICAgICAgICAgKGNvcHkgKiAxMDAwMDAwbGwgLyBrU2FtcGxlUmF0ZSkgLyBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICAgICAgKGNvcHkgKiAxMDAwMDAwTEwgLyBrU2FtcGxlUmF0ZSkgLyBzaXplb2YoaW50MTZfdCk7CiAKICAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZpbGxlZExlbiA9PSAwKSB7CiAgICAgICAgICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL0FuZHJvaWQuYnAKaW5kZXggOWZlZmQ4MS4uODhjZjdmMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL0FuZHJvaWQuYnAKQEAgLTQ0LDcgKzQ0LDcgQEAKICAgICAgICAgInNyYy93ZWlnaHRfYW1yd2JfbHBjLmNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWyJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiXSwKKyAgICBoZWFkZXJfbGliczogWyJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIl0sCiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgICJzcmMiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9kZWNfYWNlbHBfNHBfaW5fNjQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9kZWNfYWNlbHBfNHBfaW5fNjQuY3BwCmluZGV4IDQ4Njg4MjIuLjM2YTczOTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvZGVjX2FjZWxwXzRwX2luXzY0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2RlY19hY2VscF80cF9pbl82NC5jcHAKQEAgLTIzNCw2ICsyMzQsNyBAQAogICAgICAgICAgICAgICAgIGRlY182cF82Tl8yKExfaW5kZXgsIDQsIDAsIHBvcyk7CiAgICAgICAgICAgICAgICAgYWRkX3B1bHNlcyhwb3MsIDYsIGssIGNvZGUpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBicmVhazsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2RlZW1waGFzaXNfMzIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9kZWVtcGhhc2lzXzMyLmNwcAppbmRleCBiODA1NTViLi5jMGU0YzUxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2RlZW1waGFzaXNfMzIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvZGVlbXBoYXNpc18zMi5jcHAKQEAgLTEzMSw3ICsxMzEsNyBAQAogICAgIGludDE2IGxvLCBoaTsKIAogICAgIExfdG1wICA9ICgoaW50MzIpeF9oaVswXSkgPDwgMTY7Ci0gICAgTF90bXAgKz0gKChpbnQzMil4X2xvWzBdKSA8PCA0OworICAgIExfdG1wICs9ICgoKGludDMyKXhfbG9bMF0pIDw8IDQpICYgMHhGRkZGOwogICAgIExfdG1wICA9IHNobF9pbnQzMihMX3RtcCwgMyk7CiAKICAgICBMX3RtcCA9IGZ4cF9tYWNfMTZieTE2KCptZW0sIG11LCBMX3RtcCksCkBAIC0xNDQsNyArMTQ0LDcgQEAKICAgICBmb3IgKGkgPSAxOyBpIDwgTCAtIDE7IGkrKykKICAgICB7CiAgICAgICAgIExfdG1wICA9ICgoaW50MzIpaGkpIDw8IDE2OwotICAgICAgICBMX3RtcCArPSAoKGludDMyKWxvKSA8PCA0OworICAgICAgICBMX3RtcCArPSAoKChpbnQzMilsbykgPDwgNCkgJiAweEZGRkY7CiAgICAgICAgIExfdG1wICA9IHNobF9pbnQzMihMX3RtcCwgMyk7CiAgICAgICAgIExfdG1wICA9IGZ4cF9tYWNfMTZieTE2KHlbaSAtIDFdLCBtdSwgTF90bXApLAogICAgICAgICAgICAgICAgICBMX3RtcCAgPSBzaGxfaW50MzIoTF90bXAsIDEpOyAgICAgICAgICAgLyogc2F0dXJhdGlvbiBjYW4gb2NjdXIgaGVyZSAqLwpAQCAtMTUzLDcgKzE1Myw3IEBACiAgICAgICAgIGhpICAgICA9IHhfaGlbaSsxXTsKICAgICB9CiAgICAgTF90bXAgID0gKChpbnQzMiloaSkgPDwgMTY7Ci0gICAgTF90bXAgKz0gKChpbnQzMilsbykgPDwgNDsKKyAgICBMX3RtcCArPSAoKChpbnQzMilsbykgPDwgNCkgJiAweEZGRkY7CiAgICAgTF90bXAgID0gc2hsX2ludDMyKExfdG1wLCAzKTsKICAgICBMX3RtcCAgPSBmeHBfbWFjXzE2YnkxNih5W2kgLSAxXSwgbXUsIExfdG1wKSwKICAgICAgICAgICAgICBMX3RtcCAgPSBzaGxfaW50MzIoTF90bXAsIDEpOyAgICAgICAgICAgLyogc2F0dXJhdGlvbiBjYW4gb2NjdXIgaGVyZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9ub3JtYWxpemVfYW1yX3diLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvbm9ybWFsaXplX2Ftcl93Yi5jcHAKaW5kZXggMDMyNTMxMS4uNGQxMTI2ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9ub3JtYWxpemVfYW1yX3diLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL25vcm1hbGl6ZV9hbXJfd2IuY3BwCkBAIC0xNzAsNiArMTcwLDcgQEAKICAgICAgICAgY2FzZSAweDM4MDAwMDAwOgogICAgICAgICBjYXNlIDB4MzAwMDAwMDA6CiAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiZGVjb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JkZWNvZGVyLmNwcAppbmRleCBiOGNmZWZhLi5kZGM4MThlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JkZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JkZWNvZGVyLmNwcApAQCAtNDU1LDcgKzQ1NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleGMyW2lfc3ViZnJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3ludGgxNmtbaV9zdWJmciAqNS80XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNob3J0KSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIZklzZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJfYml0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RFRYU3RhdGUsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JkZWNvZGVyX2Jhc2ljX29wX2NlcXVpdmFsZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL3B2YW1yd2JkZWNvZGVyX2Jhc2ljX29wX2NlcXVpdmFsZW50LmgKaW5kZXggM2M3NTkwYy4uN2E4NmVjMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9wdmFtcndiZGVjb2Rlcl9iYXNpY19vcF9jZXF1aXZhbGVudC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvcHZhbXJ3YmRlY29kZXJfYmFzaWNfb3BfY2VxdWl2YWxlbnQuaApAQCAtNDY3LDcgKzQ2NywxMiBAQAogICAgIF9faW5saW5lICBpbnQzMiBmeHBfbWFjXzE2YnkxNihpbnQxNiB2YXIxLCAgaW50MTYgdmFyMiwgaW50MzIgTF9hZGQpCiAgICAgewogCi0gICAgICAgIExfYWRkICs9IChpbnQzMil2YXIxICogdmFyMjsKKyAgICAgICAgaW50MzIgbF9vcmlnID0gTF9hZGQ7CisgICAgICAgIGlmIChfX2J1aWx0aW5fYWRkX292ZXJmbG93KCAoaW50MzIpdmFyMSAqIHZhcjIsIGxfb3JpZywgJkxfYWRkKSkgeworICAgICAgICAgICAgLy8gbmVlZHMgc2F0dXJhdGlvbgorICAgICAgICAgICAgaWYgKGxfb3JpZyA+IDApIExfYWRkID0gTUFYXzMyOworICAgICAgICAgICAgZWxzZSAgICAgICAgICAgIExfYWRkID0gTUlOXzMyOworICAgICAgICB9CiAKICAgICAgICAgcmV0dXJuIExfYWRkOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQuYnAKaW5kZXggNWQ0NzliMy4uMDg0YmUwYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL0FuZHJvaWQuYnAKQEAgLTEzNSw5ICsxMzUsNiBAQAogICAgIGNmbGFnczogWyItV2Vycm9yIl0sCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKIAogfQpAQCAtMTQ2LDIwICsxNDMsMTAgQEAKIAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2FtcndiZW5jIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKIAogICAgIHNyY3M6IFsiU29mdEFNUldCRW5jb2Rlci5jcHAiXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgXSwKLQotICAgIGNmbGFnczogWyItV2Vycm9yIl0sCi0KICAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKIAogICAgIHNhbml0aXplOiB7CkBAIC0xNjcsMjMgKzE1NCwxMiBAQAogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKIAogICAgIHN0YXRpY19saWJzOiBbImxpYnN0YWdlZnJpZ2h0X2FtcndiZW5jIl0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VuY19jb21tb24iLAogICAgIF0sCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KIAotLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLXN1YmRpcnMgPSBbIlNhbXBsZUNvZGUiXQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvQU1SV0JfRV9TQU1QTEUuYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL0FNUldCX0VfU0FNUExFLmMKaW5kZXggN2MwOTRmMy4uNzI4MmRlNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvQU1SV0JfRV9TQU1QTEUuYworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9BTVJXQl9FX1NBTVBMRS5jCkBAIC0xMzQsMTQgKzEzNCwxNiBAQAogCWlmKGhhbmRsZSA9PSAwKQogCXsKIAkJcHJpbnRmKCJvcGVuIGRsbCBlcnJvci4uLi4uLiIpOwotCQlyZXR1cm4gLTE7CisJCXJldCA9IC0xOworCQlnb3RvIHNhZmVfZXhpdDsKIAl9CiAKIAlwZnVuYyA9IGRsc3ltKGhhbmRsZSwgInZvR2V0QU1SV0JFbmNBUEkiKTsKIAlpZihwZnVuYyA9PSAwKQogCXsKIAkJcHJpbnRmKCJvcGVuIGZ1bmN0aW9uIGVycm9yLi4uLi4uIik7Ci0JCXJldHVybiAtMTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gc2FmZV9leGl0OwogCX0KIAogCXBHZXRBUEkgPSAoVk9HRVRBVURJT0VOQ0FQSSlwZnVuYzsKQEAgLTE1MCw3ICsxNTIsOCBAQAogCWlmKHJldHVybkNvZGUpCiAJewogCQlwcmludGYoImdldCBBUElzIGVycm9yLi4uLi4uIik7Ci0JCXJldHVybiAtMTsKKwkJcmV0ID0gLTE7CisJCWdvdG8gc2FmZV9leGl0OwogCX0KICNlbHNlCiAJcmV0ID0gdm9HZXRBTVJXQkVuY0FQSSgmQXVkaW9BUEkpOwpAQCAtMjUzLDcgKzI1Niw4IEBACiAJCWZjbG9zZShmZHN0KTsKIAogI2lmZGVmIExJTlVYCi0JZGxjbG9zZShoYW5kbGUpOworCWlmIChoYW5kbGUpCisJCWRsY2xvc2UoaGFuZGxlKTsKICNlbmRpZgogCiAJcmV0dXJuIHJldDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9BbmRyb2lkLmJwCmluZGV4IDc5YjM3ZmYuLjk0NDJmYzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvQW5kcm9pZC5icApAQCAtMjQsOCArMjQsNSBAQAogCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9Tb2Z0QU1SV0JFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9Tb2Z0QU1SV0JFbmNvZGVyLmNwcAppbmRleCBhNjQ0YjY2Li43ZmI4YTRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU29mdEFNUldCRW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NvZnRBTVJXQkVuY29kZXIuY3BwCkBAIC01MCw3ICs1MCw3IEBACiAgICAgICBtQml0UmF0ZSgwKSwKICAgICAgIG1Nb2RlKFZPQU1SV0JfTUQ2NiksCiAgICAgICBtSW5wdXRTaXplKDApLAotICAgICAgbUlucHV0VGltZVVzKC0xbGwpLAorICAgICAgbUlucHV0VGltZVVzKC0xTEwpLAogICAgICAgbVNhd0lucHV0RU9TKGZhbHNlKSwKICAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSkgewogICAgIGluaXRQb3J0cygpOwpAQCAtMzg3LDcgKzM4Nyw3IEBACiAgICAgICAgICAgICAvLyAiVGltZSIgb24gdGhlIGlucHV0IGJ1ZmZlciBoYXMgaW4gZWZmZWN0IGFkdmFuY2VkIGJ5IHRoZQogICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyB3ZSBqdXN0IGFkdmFuY2VkIG5PZmZzZXQgYnkuCiAgICAgICAgICAgICBpbkhlYWRlci0+blRpbWVTdGFtcCArPQotICAgICAgICAgICAgICAgIChjb3B5ICogMTAwMDAwMGxsIC8ga1NhbXBsZVJhdGUpIC8gc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICAgICAgIChjb3B5ICogMTAwMDAwMExMIC8ga1NhbXBsZVJhdGUpIC8gc2l6ZW9mKGludDE2X3QpOwogCiAgICAgICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPT0gMCkgewogICAgICAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL0FuZHJvaWQuYnAKaW5kZXggY2Y1MGEwNC4uMGJiNmJiMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvQW5kcm9pZC5icApAQCAtMSw0NCArMSwyMiBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2F2Y2RlYyIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICB2bmRrOiB7Ci0gICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgfSwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCiAKICAgICBzdGF0aWNfbGliczogWyJsaWJhdmNkZWMiXSwKICAgICBzcmNzOiBbIlNvZnRBVkNEZWMuY3BwIl0sCiAKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XYWxsIiwKLSAgICAgICAgIi1XZXJyb3IiLAogICAgIF0sCiAKICAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZXh0ZXJuYWwvbGliYXZjL2RlY29kZXIiLAotICAgICAgICAiZXh0ZXJuYWwvbGliYXZjL2NvbW1vbiIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLQogICAgIHNhbml0aXplOiB7CiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAogCiAgICAgbGRmbGFnczogWyItV2wsLUJzeW1ib2xpYyJdLAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL1NvZnRBVkNEZWMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9Tb2Z0QVZDRGVjLmNwcAppbmRleCAzOTI0ZmMyLi41YTRiMmY4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL1NvZnRBVkNEZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5jcHAKQEAgLTU4MCw3ICs1ODAsNyBAQAogICAgICAgICAgICAgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikmc19kZWNfaXAsICh2b2lkICopJnNfZGVjX29wKTsKIAogICAgICAgICAgICAgYm9vbCB1bnN1cHBvcnRlZFJlc29sdXRpb24gPQotICAgICAgICAgICAgICAgIChJVkRfU1RSRUFNX1dJRFRIX0hFSUdIVF9OT1RfU1VQUE9SVEVEID09IChzX2RlY19vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpOworICAgICAgICAgICAgICAgIChJVkRfU1RSRUFNX1dJRFRIX0hFSUdIVF9OT1RfU1VQUE9SVEVEID09IChzX2RlY19vcC51NF9lcnJvcl9jb2RlICYgSVZEX0VSUk9SX01BU0spKTsKIAogICAgICAgICAgICAgLyogQ2hlY2sgZm9yIHVuc3VwcG9ydGVkIGRpbWVuc2lvbnMgKi8KICAgICAgICAgICAgIGlmICh1bnN1cHBvcnRlZFJlc29sdXRpb24pIHsKQEAgLTU5MCw3ICs1OTAsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgYm9vbCBhbGxvY2F0aW9uRmFpbGVkID0gKElWRF9NRU1fQUxMT0NfRkFJTEVEID09IChzX2RlY19vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpOworICAgICAgICAgICAgYm9vbCBhbGxvY2F0aW9uRmFpbGVkID0gKElWRF9NRU1fQUxMT0NfRkFJTEVEID09IChzX2RlY19vcC51NF9lcnJvcl9jb2RlICYgSVZEX0VSUk9SX01BU0spKTsKICAgICAgICAgICAgIGlmIChhbGxvY2F0aW9uRmFpbGVkKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIkFsbG9jYXRpb24gZmFpbHVyZSBpbiBkZWNvZGVyIik7CiAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmcsIDAsIE5VTEwpOwpAQCAtNTk4LDcgKzU5OCwxNCBAQAogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgYm9vbCByZXNDaGFuZ2VkID0gKElWRF9SRVNfQ0hBTkdFRCA9PSAoc19kZWNfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpKTsKKyAgICAgICAgICAgIGlmIChJU19JVkRfRkFUQUxfRVJST1Ioc19kZWNfb3AudTRfZXJyb3JfY29kZSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmF0YWwgRXJyb3IgOiAweCV4Iiwgc19kZWNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbnN1cHBvcnRlZFNldHRpbmcsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBib29sIHJlc0NoYW5nZWQgPSAoSVZEX1JFU19DSEFOR0VEID09IChzX2RlY19vcC51NF9lcnJvcl9jb2RlICYgSVZEX0VSUk9SX01BU0spKTsKIAogICAgICAgICAgICAgZ2V0VlVJUGFyYW1zKCk7CiAKQEAgLTYwNyw3ICs2MTQsNyBAQAogICAgICAgICAgICAgdGltZVRha2VuID0gbVRpbWVFbmQgLSBtVGltZVN0YXJ0OwogCiAgICAgICAgICAgICBBTE9HVigidGltZVRha2VuPSU2bGxkdXMgZGVsYXk9JTZsbGR1cyBudW1CeXRlcz0lNmQiLAotICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSAodGltZVRha2VuIC8gMTAwMGxsKSwgKGxvbmcgbG9uZykgKHRpbWVEZWxheSAvIDEwMDBsbCksCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpICh0aW1lVGFrZW4gLyAxMDAwTEwpLCAobG9uZyBsb25nKSAodGltZURlbGF5IC8gMTAwMExMKSwKICAgICAgICAgICAgICAgICAgICBzX2RlY19vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQpOwogICAgICAgICAgICAgaWYgKHNfZGVjX29wLnU0X2ZyYW1lX2RlY29kZWRfZmxhZyAmJiAhbUZsdXNoTmVlZGVkKSB7CiAgICAgICAgICAgICAgICAgbUZsdXNoTmVlZGVkID0gdHJ1ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvQW5kcm9pZC5icAppbmRleCBjZWZlNzdjLi45ODAyNjFjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9BbmRyb2lkLmJwCkBAIC0xLDQ2ICsxLDIyIEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfYXZjZW5jIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKIAogICAgIHN0YXRpY19saWJzOiBbImxpYmF2Y2VuYyJdLAogICAgIHNyY3M6IFsiU29mdEFWQ0VuYy5jcHAiXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZXh0ZXJuYWwvbGliYXZjL2VuY29kZXIiLAotICAgICAgICAiZXh0ZXJuYWwvbGliYXZjL2NvbW1vbiIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9oYXJkd2FyZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAotICAgIF0sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiAKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XYWxsIiwKLSAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVduby11bnVzZWQtdmFyaWFibGUiLAogICAgIF0sCiAgICAgbGRmbGFnczogWyItV2wsLUJzeW1ib2xpYyJdLAogCiAgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCi0KLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5jcHAKaW5kZXggMzc5ZDQxZS4uOWRiNjQ2NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuY3BwCkBAIC0yMSw4ICsyMSw4IEBACiAKICNpbmNsdWRlICJPTVhfVmlkZW8uaCIKIAotI2luY2x1ZGUgPEhhcmR3YXJlQVBJLmg+Ci0jaW5jbHVkZSA8TWV0YWRhdGFCdWZmZXJUeXBlLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CkBAIC0xMDU4LDggKzEwNTgsOCBAQAogICAgIH0KIH0KIAotT01YX0VSUk9SVFlQRSBTb2Z0QVZDOjpzZXRDb25maWcoCi0gICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgX3BhcmFtcykgeworT01YX0VSUk9SVFlQRSBTb2Z0QVZDOjppbnRlcm5hbFNldENvbmZpZygKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBfcGFyYW1zLCBib29sICpmcmFtZUNvbmZpZykgewogICAgIHN3aXRjaCAoKGludClpbmRleCkgewogICAgICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ1ZpZGVvSW50cmFWT1BSZWZyZXNoOgogICAgICAgICB7CkBAIC0xMTI1LDcgKzExMjUsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpzZXRDb25maWcoaW5kZXgsIF9wYXJhbXMpOworICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsU2V0Q29uZmlnKGluZGV4LCBfcGFyYW1zLCBmcmFtZUNvbmZpZyk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5oCmluZGV4IGE0M2NkZjEuLjZkMmUwODQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5oCkBAIC0zNiw3ICszNiw3IEBACiAjZGVmaW5lIERFRkFVTFRfTUFYX1JFT1JERVJfRlJNICAgICAwCiAjZGVmaW5lIERFRkFVTFRfUVBfTUlOICAgICAgICAgICAgICAxMAogI2RlZmluZSBERUZBVUxUX1FQX01BWCAgICAgICAgICAgICAgNDAKLSNkZWZpbmUgREVGQVVMVF9NQVhfQklUUkFURSAgICAgICAgIDIwMDAwMDAwCisjZGVmaW5lIERFRkFVTFRfTUFYX0JJVFJBVEUgICAgICAgICAyNDAwMDAwMDAKICNkZWZpbmUgREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9YICAgIDI1NgogI2RlZmluZSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1kgICAgMjU2CiAjZGVmaW5lIERFRkFVTFRfTUFYX0ZSQU1FUkFURSAgICAgICAxMjAwMDAKQEAgLTIxOSw4ICsyMTksOCBAQAogICAgIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRCaXRyYXRlUGFyYW1zKAogICAgICAgICBjb25zdCBPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUgKmJpdHJhdGUpOwogCi0gICAgT01YX0VSUk9SVFlQRSBzZXRDb25maWcoCi0gICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgX3BhcmFtcyk7CisgICAgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldENvbmZpZygKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBfcGFyYW1zLCBib29sICpmcmFtZUNvbmZpZyk7CiAKICAgICBPTVhfRVJST1JUWVBFIGdldENvbmZpZygKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBfcGFyYW1zKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5icAppbmRleCAzNzI2OTIyLi5jNWEwNzZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0xLDkgKzEsNiBAQAogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2VuY19jb21tb24iLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgdm5kazogewotICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgIH0sCiAKICAgICBzcmNzOiBbImNtbk1lbW9yeS5jIl0sCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vaW5jbHVkZS92b1R5cGUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vaW5jbHVkZS92b1R5cGUuaAppbmRleCBkYTIwOGQ0Li43M2YyNGQwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL2luY2x1ZGUvdm9UeXBlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9pbmNsdWRlL3ZvVHlwZS5oCkBAIC0yMiw2ICsyMiw4IEBACiAjaWZuZGVmIF9fdm9UeXBlX0hfXwogI2RlZmluZSBfX3ZvVHlwZV9IX18KIAorI2luY2x1ZGUgPHN0ZGludC5oPgorCiAjaWZkZWYgX19jcGx1c3BsdXMKIGV4dGVybiAiQyIgewogI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCkBAIC02MiwyOCArNjQsMjggQEAKIHR5cGVkZWYgdm9pZCBWT19WT0lEOwogCiAvKiogVk9fVTggaXMgYW4gOCBiaXQgdW5zaWduZWQgcXVhbnRpdHkgdGhhdCBpcyBieXRlIGFsaWduZWQgKi8KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBWT19VODsKK3R5cGVkZWYgdWludDhfdCBWT19VODsKIAogLyoqIFZPX0JZVEUgaXMgYW4gOCBiaXQgdW5zaWduZWQgcXVhbnRpdHkgdGhhdCBpcyBieXRlIGFsaWduZWQgKi8KLXR5cGVkZWYgdW5zaWduZWQgY2hhciBWT19CWVRFOwordHlwZWRlZiB1aW50OF90IFZPX0JZVEU7CiAKIC8qKiBWT19TOCBpcyBhbiA4IGJpdCBzaWduZWQgcXVhbnRpdHkgdGhhdCBpcyBieXRlIGFsaWduZWQgKi8KLXR5cGVkZWYgc2lnbmVkIGNoYXIgVk9fUzg7Cit0eXBlZGVmIGludDhfdCBWT19TODsKIAogLyoqIFZPX0NIQVIgaXMgYW4gOCBiaXQgc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgYnl0ZSBhbGlnbmVkICovCi10eXBlZGVmIGNoYXIgVk9fQ0hBUjsKK3R5cGVkZWYgaW50OF90IFZPX0NIQVI7CiAKIC8qKiBWT19VMTYgaXMgYSAxNiBiaXQgdW5zaWduZWQgcXVhbnRpdHkgdGhhdCBpcyAxNiBiaXQgd29yZCBhbGlnbmVkICovCi10eXBlZGVmIHVuc2lnbmVkIHNob3J0IFZPX1UxNjsKK3R5cGVkZWYgdWludDE2X3QgVk9fVTE2OwogCiAvKiogVk9fUzE2IGlzIGEgMTYgYml0IHNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDE2IGJpdCB3b3JkIGFsaWduZWQgKi8KLXR5cGVkZWYgc2lnbmVkIHNob3J0IFZPX1MxNjsKK3R5cGVkZWYgaW50MTZfdCBWT19TMTY7CiAKIC8qKiBWT19VMzIgaXMgYSAzMiBiaXQgdW5zaWduZWQgcXVhbnRpdHkgdGhhdCBpcyAzMiBiaXQgd29yZCBhbGlnbmVkICovCi10eXBlZGVmIHVuc2lnbmVkIGxvbmcgVk9fVTMyOwordHlwZWRlZiB1aW50MzJfdCBWT19VMzI7CiAKIC8qKiBWT19TMzIgaXMgYSAzMiBiaXQgc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgMzIgYml0IHdvcmQgYWxpZ25lZCAqLwotdHlwZWRlZiBzaWduZWQgbG9uZyBWT19TMzI7Cit0eXBlZGVmIGludDMyX3QgVk9fUzMyOwogCiAvKiBVc2VycyB3aXRoIGNvbXBpbGVycyB0aGF0IGNhbm5vdCBhY2NlcHQgdGhlICJsb25nIGxvbmciIGRlc2lnbmF0aW9uIHNob3VsZAogICAgZGVmaW5lIHRoZSBWT19TS0lQNjRCSVQgbWFjcm8uICBJdCBzaG91bGQgYmUgbm90ZWQgdGhhdCB0aGlzIG1heSBjYXVzZQpAQCAtOTQsMTQgKzk2LDE0IEBACiAjaWZuZGVmIFZPX1NLSVA2NEJJVAogI2lmZGVmIF9NU0NfVkVSCiAvKiogVk9fVTY0IGlzIGEgNjQgYml0IHVuc2lnbmVkIHF1YW50aXR5IHRoYXQgaXMgNjQgYml0IHdvcmQgYWxpZ25lZCAqLwotdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0ICBWT19VNjQ7Cit0eXBlZGVmIHVpbnQ2NF90ICBWT19VNjQ7CiAvKiogVk9fUzY0IGlzIGEgNjQgYml0IHNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDY0IGJpdCB3b3JkIGFsaWduZWQgKi8KLXR5cGVkZWYgc2lnbmVkICAgX19pbnQ2NCAgVk9fUzY0OwordHlwZWRlZiBpbnQ2NF90ICBWT19TNjQ7CiAjZWxzZSAvLyBXSU4zMgogLyoqIFZPX1U2NCBpcyBhIDY0IGJpdCB1bnNpZ25lZCBxdWFudGl0eSB0aGF0IGlzIDY0IGJpdCB3b3JkIGFsaWduZWQgKi8KLXR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIFZPX1U2NDsKK3R5cGVkZWYgdWludDY0X3QgVk9fVTY0OwogLyoqIFZPX1M2NCBpcyBhIDY0IGJpdCBzaWduZWQgcXVhbnRpdHkgdGhhdCBpcyA2NCBiaXQgd29yZCBhbGlnbmVkICovCi10eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgVk9fUzY0OwordHlwZWRlZiBpbnQ2NF90IFZPX1M2NDsKICNlbmRpZiAvLyBXSU4zMgogI2VuZGlmIC8vIFZPX1NLSVA2NEJJVAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ0YzI5Ni4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc3ViZGlycyA9IFsiKiJdCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9BbmRyb2lkLmJwCmluZGV4IDlhZjA4NmIuLjQwNjQ3NTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9BbmRyb2lkLmJwCkBAIC0xLDIzICsxLDExIEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfZmxhY2RlYyIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICB2bmRrOiB7Ci0gICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgfSwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJTb2Z0RmxhY0RlY29kZXIuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJleHRlcm5hbC9mbGFjL2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYyIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAotCi0gICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKLQogICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAogCiAgICAgc2FuaXRpemU6IHsKQEAgLTI2LDE4ICsxNCw5IEBACiAgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mbGFjZGVjIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuY3BwCmluZGV4IDJjMGYyMjQuLjg0MmE3Y2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuY3BwCkBAIC04OSwxMiArODksMTIgQEAKICAgICBkZWYuZURpciA9IE9NWF9EaXJPdXRwdXQ7CiAgICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1PdXRwdXRCdWZmZXJzOwogICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwgPSBkZWYubkJ1ZmZlckNvdW50TWluOwotICAgIGRlZi5uQnVmZmVyU2l6ZSA9IDQwOTYgKiBGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzOworICAgIGRlZi5uQnVmZmVyU2l6ZSA9IGtOdW1TYW1wbGVzUGVyRnJhbWUgKiBGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzICogc2l6ZW9mKGZsb2F0KTsKICAgICBkZWYuYkVuYWJsZWQgPSBPTVhfVFJVRTsKICAgICBkZWYuYlBvcHVsYXRlZCA9IE9NWF9GQUxTRTsKICAgICBkZWYuZURvbWFpbiA9IE9NWF9Qb3J0RG9tYWluQXVkaW87CiAgICAgZGVmLmJCdWZmZXJzQ29udGlndW91cyA9IE9NWF9GQUxTRTsKLSAgICBkZWYubkJ1ZmZlckFsaWdubWVudCA9IDI7CisgICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSBzaXplb2YoZmxvYXQpOwogCiAgICAgZGVmLmZvcm1hdC5hdWRpby5jTUlNRVR5cGUgPSBjb25zdF9jYXN0PGNoYXIgKj4oImF1ZGlvL3JhdyIpOwogICAgIGRlZi5mb3JtYXQuYXVkaW8ucE5hdGl2ZVJlbmRlciA9IE5VTEw7CkBAIC0xNzMsNyArMTczLDcgQEAKICAgICAgICAgICAgICAgICBmbGFjUGFyYW1zLT5uQ2hhbm5lbHMgPSBtU3RyZWFtSW5mby5jaGFubmVsczsKICAgICAgICAgICAgICAgICBmbGFjUGFyYW1zLT5uU2FtcGxlUmF0ZSA9IG1TdHJlYW1JbmZvLnNhbXBsZV9yYXRlOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmbGFjUGFyYW1zLT5uQ2hhbm5lbHMgPSAxOworICAgICAgICAgICAgICAgIGZsYWNQYXJhbXMtPm5DaGFubmVscyA9IDI7CiAgICAgICAgICAgICAgICAgZmxhY1BhcmFtcy0+blNhbXBsZVJhdGUgPSA0NDEwMDsKICAgICAgICAgICAgIH0KIApAQCAtMTk1LDEwICsxOTUsMTAgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yQmFkUG9ydEluZGV4OwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBwY21QYXJhbXMtPmVOdW1EYXRhID0gT01YX051bWVyaWNhbERhdGFTaWduZWQ7CisgICAgICAgICAgICBwY21QYXJhbXMtPmVOdW1EYXRhID0gbU51bWVyaWNhbERhdGE7CiAgICAgICAgICAgICBwY21QYXJhbXMtPmVFbmRpYW4gPSBPTVhfRW5kaWFuQmlnOwogICAgICAgICAgICAgcGNtUGFyYW1zLT5iSW50ZXJsZWF2ZWQgPSBPTVhfVFJVRTsKLSAgICAgICAgICAgIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSA9IDE2OworICAgICAgICAgICAgcGNtUGFyYW1zLT5uQml0UGVyU2FtcGxlID0gbUJpdHNQZXJTYW1wbGU7CiAgICAgICAgICAgICBwY21QYXJhbXMtPmVQQ01Nb2RlID0gT01YX0FVRElPX1BDTU1vZGVMaW5lYXI7CiAgICAgICAgICAgICBwY21QYXJhbXMtPmVDaGFubmVsTWFwcGluZ1swXSA9IE9NWF9BVURJT19DaGFubmVsTEY7CiAgICAgICAgICAgICBwY21QYXJhbXMtPmVDaGFubmVsTWFwcGluZ1sxXSA9IE9NWF9BVURJT19DaGFubmVsUkY7CkBAIC0yMTEsNyArMjExLDcgQEAKICAgICAgICAgICAgICAgICBwY21QYXJhbXMtPm5DaGFubmVscyA9IG1TdHJlYW1JbmZvLmNoYW5uZWxzOwogICAgICAgICAgICAgICAgIHBjbVBhcmFtcy0+blNhbXBsaW5nUmF0ZSA9IG1TdHJlYW1JbmZvLnNhbXBsZV9yYXRlOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwY21QYXJhbXMtPm5DaGFubmVscyA9IDE7CisgICAgICAgICAgICAgICAgcGNtUGFyYW1zLT5uQ2hhbm5lbHMgPSAyOwogICAgICAgICAgICAgICAgIHBjbVBhcmFtcy0+blNhbXBsaW5nUmF0ZSA9IDQ0MTAwOwogICAgICAgICAgICAgfQogCkBAIC0yODEsNiArMjgxLDE5IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBvcnRJbmRleDsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+ZU51bURhdGEgPT0gT01YX051bWVyaWNhbERhdGFGbG9hdCAmJiBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPT0gMzIpIHsKKyAgICAgICAgICAgICAgICBtTnVtZXJpY2FsRGF0YSA9IE9NWF9OdW1lcmljYWxEYXRhRmxvYXQ7CisgICAgICAgICAgICAgICAgbUJpdHNQZXJTYW1wbGUgPSAzMjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocGNtUGFyYW1zLT5lTnVtRGF0YSA9PSBPTVhfTnVtZXJpY2FsRGF0YVNpZ25lZAorICAgICAgICAgICAgICAgICAgICAgJiYgcGNtUGFyYW1zLT5uQml0UGVyU2FtcGxlID09IDE2KSB7CisgICAgICAgICAgICAgICAgbU51bWVyaWNhbERhdGEgPSBPTVhfTnVtZXJpY2FsRGF0YVNpZ25lZDsKKyAgICAgICAgICAgICAgICBtQml0c1BlclNhbXBsZSA9IDE2OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBlTnVtRGF0YSAlZCwgbkJpdHNQZXJTYW1wbGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgcGNtUGFyYW1zLT5lTnVtRGF0YSwgcGNtUGFyYW1zLT5uQml0UGVyU2FtcGxlKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKICAgICAgICAgfQogCkBAIC0zMDEsMTEgKzMxNCwxMyBAQAogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmaW5RdWV1ZSA9IGdldFBvcnRRdWV1ZSgwKTsKICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJm91dFF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDEpOwogCisgICAgY29uc3QgYm9vbCBvdXRwdXRGbG9hdCA9IG1OdW1lcmljYWxEYXRhID09IE9NWF9OdW1lcmljYWxEYXRhRmxvYXQ7CisKICAgICBBTE9HVigib25RdWV1ZUZpbGxlZCAlZC8lZDoiLCBpblF1ZXVlLmVtcHR5KCksIG91dFF1ZXVlLmVtcHR5KCkpOwogICAgIHdoaWxlICgoIWluUXVldWUuZW1wdHkoKSB8fCBtU2F3SW5wdXRFT1MpICYmICFvdXRRdWV1ZS5lbXB0eSgpICYmICFtRmluaXNoZWREZWNvZGVyKSB7CiAgICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqb3V0UXVldWUuYmVnaW4oKTsKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKm91dEhlYWRlciA9IG91dEluZm8tPm1IZWFkZXI7Ci0gICAgICAgIHNob3J0ICpvdXRCdWZmZXIgPSByZWludGVycHJldF9jYXN0PHNob3J0ICo+KG91dEhlYWRlci0+cEJ1ZmZlciArIG91dEhlYWRlci0+bk9mZnNldCk7CisgICAgICAgIHZvaWQgKm91dEJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPihvdXRIZWFkZXItPnBCdWZmZXIgKyBvdXRIZWFkZXItPm5PZmZzZXQpOwogICAgICAgICBzaXplX3Qgb3V0QnVmZmVyU2l6ZSA9IG91dEhlYWRlci0+bkFsbG9jTGVuIC0gb3V0SGVhZGVyLT5uT2Zmc2V0OwogICAgICAgICBpbnQ2NF90IHRpbWVTdGFtcCA9IDA7CiAKQEAgLTM3NCw3ICszODksNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzdGF0dXNfdCBkZWNvZGVyRXJyID0gbUZMQUNEZWNvZGVyLT5kZWNvZGVPbmVGcmFtZSgKLSAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoLCBvdXRCdWZmZXIsICZvdXRCdWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoLCBvdXRCdWZmZXIsICZvdXRCdWZmZXJTaXplLCBvdXRwdXRGbG9hdCk7CiAgICAgICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBPSykgewogICAgICAgICAgICAgICAgIEFMT0dFKCJvblF1ZXVlRmlsbGVkOiBGTEFDRGVjb2RlciBkZWNvZGVPbmVGcmFtZSByZXR1cm5zIGVycm9yICVkIiwgZGVjb2RlckVycik7CiAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKQEAgLTM5Myw3ICs0MDgsOSBAQAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKG1TYXdJbnB1dEVPUykgewotICAgICAgICAgICAgc3RhdHVzX3QgZGVjb2RlckVyciA9IG1GTEFDRGVjb2Rlci0+ZGVjb2RlT25lRnJhbWUoTlVMTCwgMCwgb3V0QnVmZmVyLCAmb3V0QnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBzdGF0dXNfdCBkZWNvZGVyRXJyID0gbUZMQUNEZWNvZGVyLT5kZWNvZGVPbmVGcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBpbkJ1ZmZlciAqLywgMCAvKiBpbkJ1ZmZlckxlbiAqLywKKyAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLCAmb3V0QnVmZmVyU2l6ZSwgb3V0cHV0RmxvYXQpOwogICAgICAgICAgICAgbUZpbmlzaGVkRGVjb2RlciA9IHRydWU7CiAgICAgICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBPSykgewogICAgICAgICAgICAgICAgIEFMT0dFKCJvblF1ZXVlRmlsbGVkOiBGTEFDRGVjb2RlciBmaW5pc2ggcmV0dXJucyBlcnJvciAlZCIsIGRlY29kZXJFcnIpOwpAQCAtNDU2LDcgKzQ3Myw4IEBACiAgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRU5BQkxFRDsKICAgICAgICAgICAgIFBvcnRJbmZvICppbmZvID0gZWRpdFBvcnRJbmZvKDEgLyogcG9ydEluZGV4ICovKTsKICAgICAgICAgICAgIGlmICghaW5mby0+bURlZi5iRW5hYmxlZCkgewotICAgICAgICAgICAgICAgIGluZm8tPm1EZWYubkJ1ZmZlclNpemUgPSBtU3RyZWFtSW5mby5tYXhfYmxvY2tzaXplICogbVN0cmVhbUluZm8uY2hhbm5lbHMgKiAyOworICAgICAgICAgICAgICAgIGluZm8tPm1EZWYubkJ1ZmZlclNpemUgPQorICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUluZm8ubWF4X2Jsb2Nrc2l6ZSAqIG1TdHJlYW1JbmZvLmNoYW5uZWxzICogc2l6ZW9mKGZsb2F0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmgKaW5kZXggYjYzZjdhZC4uYmEwMjA3NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuaApAQCAtNDUsMTAgKzQ1LDE0IEBACiAgICAgdmlydHVhbCB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKIAogcHJpdmF0ZToKKyAgICBzdGF0aWMgY29uc3RleHByIHVuc2lnbmVkIGludCBrTnVtU2FtcGxlc1BlckZyYW1lID0gMjA0ODsgLy8gYWRqdXN0ZWQgYmFzZWQgb24gc3RyZWFtLgorCiAgICAgZW51bSB7CiAgICAgICAgIGtOdW1JbnB1dEJ1ZmZlcnMgICA9IDQsCiAgICAgICAgIGtOdW1PdXRwdXRCdWZmZXJzICA9IDQsCiAgICAgfTsKKyAgICBPTVhfTlVNRVJJQ0FMREFUQVRZUEUgbU51bWVyaWNhbERhdGEgPSBPTVhfTnVtZXJpY2FsRGF0YVNpZ25lZDsKKyAgICBPTVhfVTMyIG1CaXRzUGVyU2FtcGxlID0gMTY7CiAKICAgICBGTEFDRGVjb2RlciAqbUZMQUNEZWNvZGVyOwogICAgIEZMQUNfX1N0cmVhbU1ldGFkYXRhX1N0cmVhbUluZm8gbVN0cmVhbUluZm87CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLmJwCmluZGV4IDQ2Yjk3NGQuLmQ3ZDg3MWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLmJwCkBAIC0xLDE1ICsxLDkgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9mbGFjZW5jIiwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCiAKICAgICBzcmNzOiBbIlNvZnRGbGFjRW5jb2Rlci5jcHAiXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgICAgICJleHRlcm5hbC9mbGFjL2luY2x1ZGUiLAotICAgIF0sCi0KLSAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAotCiAgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCiAKICAgICBzYW5pdGl6ZTogewpAQCAtMTgsMjUgKzEyLDExIEBACiAgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiAKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlibG9nIiwKKyAgICBoZWFkZXJfbGliczogWyJsaWJiYXNlX2hlYWRlcnMiXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJGTEFDIiwKICAgICBdLAotCi0gICAgc3RhdGljX2xpYnM6IFsibGliRkxBQyJdLAotCi0gICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfZmxhY2VuYyIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICB2bmRrOiB7Ci0gICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgfSwKLQotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCmluZGV4IGZkYzg5NzUuLjNhZGQwMDYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuY3BwCkBAIC0xNiwxMCArMTYsMTEgQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJTb2Z0RmxhY0VuY29kZXIiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiU29mdEZsYWNFbmNvZGVyLmgiCi0KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KIApAQCAtNzQsNyArNzUsOSBAQAogICAgIH0KIAogICAgIGlmICghbVNpZ25hbGxlZEVycm9yKSB7IC8vIG5vIHVzZSBhbGxvY2F0aW5nIGlucHV0IGJ1ZmZlciBpZiB3ZSBoYWQgYW4gZXJyb3IgYWJvdmUKLSAgICAgICAgbUlucHV0QnVmZmVyUGNtMzIgPSAoRkxBQ19faW50MzIqKSBtYWxsb2Moc2l6ZW9mKEZMQUNfX2ludDMyKSAqIDIgKiBrTWF4TnVtU2FtcGxlc1BlckZyYW1lKTsKKyAgICAgICAgLy8gMnggdGhlIHBjbTE2IHNhbXBsZXMgY2FuIGV4aXN0IHdpdGggdGhlIHNhbWUgc2l6ZSBhcyBwY21GbG9hdCBzYW1wbGVzLgorICAgICAgICBtSW5wdXRCdWZmZXJQY20zMiA9IChGTEFDX19pbnQzMiopIG1hbGxvYygKKyAgICAgICAgICAgICAgICBzaXplb2YoRkxBQ19faW50MzIpICoga051bVNhbXBsZXNQZXJGcmFtZSAqIGtNYXhDaGFubmVscyAqIDIpOwogICAgICAgICBpZiAobUlucHV0QnVmZmVyUGNtMzIgPT0gTlVMTCkgewogICAgICAgICAgICAgQUxPR0UoIlNvZnRGbGFjRW5jb2Rlcjo6U29mdEZsYWNFbmNvZGVyKG5hbWU9JXMpIGVycm9yIGFsbG9jYXRpbmcgaW50ZXJuYWwgaW5wdXQgYnVmZmVyIiwgbmFtZSk7CiAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwpAQCAtMTE0LDE0ICsxMTcsMTQgQEAKICAgICAvLyBjb25maWd1cmUgaW5wdXQgcG9ydCBvZiB0aGUgZW5jb2RlcgogICAgIGRlZi5uUG9ydEluZGV4ID0gMDsKICAgICBkZWYuZURpciA9IE9NWF9EaXJJbnB1dDsKLSAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7Ly8gVE9ETyB2ZXJpZnkgdGhhdCAxIGlzIGVub3VnaAorICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtQnVmZmVyczsKICAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gZGVmLm5CdWZmZXJDb3VudE1pbjsKICAgICBkZWYubkJ1ZmZlclNpemUgPSBrTWF4SW5wdXRCdWZmZXJTaXplOwogICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOwogICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOwogICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5BdWRpbzsKICAgICBkZWYuYkJ1ZmZlcnNDb250aWd1b3VzID0gT01YX0ZBTFNFOwotICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gMjsKKyAgICBkZWYubkJ1ZmZlckFsaWdubWVudCA9IHNpemVvZihmbG9hdCk7CiAKICAgICBkZWYuZm9ybWF0LmF1ZGlvLmNNSU1FVHlwZSA9IGNvbnN0X2Nhc3Q8Y2hhciAqPigiYXVkaW8vcmF3Iik7CiAgICAgZGVmLmZvcm1hdC5hdWRpby5wTmF0aXZlUmVuZGVyID0gTlVMTDsKQEAgLTEzMyw3ICsxMzYsNyBAQAogICAgIC8vIGNvbmZpZ3VyZSBvdXRwdXQgcG9ydCBvZiB0aGUgZW5jb2RlcgogICAgIGRlZi5uUG9ydEluZGV4ID0gMTsKICAgICBkZWYuZURpciA9IE9NWF9EaXJPdXRwdXQ7Ci0gICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1CdWZmZXJzOy8vIFRPRE8gdmVyaWZ5IHRoYXQgMSBpcyBlbm91Z2gKKyAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7CiAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47CiAgICAgZGVmLm5CdWZmZXJTaXplID0ga01heE91dHB1dEJ1ZmZlclNpemU7CiAgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CkBAIC0xOTIsMTAgKzE5NSwxMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHBjbVBhcmFtcy0+ZU51bURhdGEgPSBPTVhfTnVtZXJpY2FsRGF0YVNpZ25lZDsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZU51bURhdGEgPSBtTnVtZXJpY2FsRGF0YTsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUVuZGlhbiA9IE9NWF9FbmRpYW5CaWc7CiAgICAgICAgICAgICBwY21QYXJhbXMtPmJJbnRlcmxlYXZlZCA9IE9NWF9UUlVFOwotICAgICAgICAgICAgcGNtUGFyYW1zLT5uQml0UGVyU2FtcGxlID0gMTY7CisgICAgICAgICAgICBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPSBtQml0c1BlclNhbXBsZTsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZVBDTU1vZGUgPSBPTVhfQVVESU9fUENNTW9kZUxpbmVhcjsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzBdID0gT01YX0FVRElPX0NoYW5uZWxMRjsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzFdID0gT01YX0FVRElPX0NoYW5uZWxSRjsKQEAgLTI2OSwxMiArMjcyLDI2IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+bkNoYW5uZWxzIDwgMSB8fCBwY21QYXJhbXMtPm5DaGFubmVscyA+IDIpIHsKKyAgICAgICAgICAgIGlmIChwY21QYXJhbXMtPm5DaGFubmVscyA8IDEgfHwgcGNtUGFyYW1zLT5uQ2hhbm5lbHMgPiBrTWF4Q2hhbm5lbHMpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtTnVtQ2hhbm5lbHMgPSBwY21QYXJhbXMtPm5DaGFubmVsczsKICAgICAgICAgICAgIG1TYW1wbGVSYXRlID0gcGNtUGFyYW1zLT5uU2FtcGxpbmdSYXRlOworCisgICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5lTnVtRGF0YSA9PSBPTVhfTnVtZXJpY2FsRGF0YUZsb2F0ICYmIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSA9PSAzMikgeworICAgICAgICAgICAgICAgIG1OdW1lcmljYWxEYXRhID0gT01YX051bWVyaWNhbERhdGFGbG9hdDsKKyAgICAgICAgICAgICAgICBtQml0c1BlclNhbXBsZSA9IDMyOworICAgICAgICAgICAgfSBlbHNlIGlmIChwY21QYXJhbXMtPmVOdW1EYXRhID09IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkCisgICAgICAgICAgICAgICAgICAgICAmJiBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPT0gMTYpIHsKKyAgICAgICAgICAgICAgICBtTnVtZXJpY2FsRGF0YSA9IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkOworICAgICAgICAgICAgICAgIG1CaXRzUGVyU2FtcGxlID0gMTY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBlTnVtRGF0YSAlZCwgbkJpdHNQZXJTYW1wbGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBjbVBhcmFtcy0+ZU51bURhdGEsIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgQUxPR1YoIndpbGwgZW5jb2RlICVkIGNoYW5uZWxzIGF0ICVkSHoiLCBtTnVtQ2hhbm5lbHMsIG1TYW1wbGVSYXRlKTsKIAogICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ3VyZUVuY29kZXIoKTsKQEAgLTMzNSw3ICszNTIsNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICAgICAgfQogCiAgICAgICAgIGRlZmF1bHQ6CkBAIC0zNTUsNiArMzcyLDEwIEBACiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZpblF1ZXVlID0gZ2V0UG9ydFF1ZXVlKDApOwogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmb3V0UXVldWUgPSBnZXRQb3J0UXVldWUoMSk7CiAKKyAgICBjb25zdCBib29sIGlucHV0RmxvYXQgPSBtTnVtZXJpY2FsRGF0YSA9PSBPTVhfTnVtZXJpY2FsRGF0YUZsb2F0OworICAgIGNvbnN0IHNpemVfdCBzYW1wbGVTaXplID0gaW5wdXRGbG9hdCA/IHNpemVvZihmbG9hdCkgOiBzaXplb2YoaW50MTZfdCk7CisgICAgY29uc3Qgc2l6ZV90IGZyYW1lU2l6ZSA9IHNhbXBsZVNpemUgKiBtTnVtQ2hhbm5lbHM7CisKICAgICBGTEFDX19ib29sIG9rID0gdHJ1ZTsKIAogICAgIHdoaWxlICgoIWluUXVldWUuZW1wdHkoKSB8fCBtU2F3SW5wdXRFT1MpICYmICFvdXRRdWV1ZS5lbXB0eSgpICYmICFtU2VudE91dHB1dEVPUykgewpAQCAtMzgwLDEzICs0MDEsMjEgQEAKICAgICAgICAgICAgIG1FbmNvZGVyUmV0dXJuZWROYkJ5dGVzID0gMDsKICAgICAgICAgICAgIG1DdXJyZW50SW5wdXRUaW1lU3RhbXAgPSBpbkhlYWRlci0+blRpbWVTdGFtcDsKIAotICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgbmJJbnB1dEZyYW1lcyA9IGluSGVhZGVyLT5uRmlsbGVkTGVuIC8gKDIgKiBtTnVtQ2hhbm5lbHMpOwotICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgbmJJbnB1dFNhbXBsZXMgPSBpbkhlYWRlci0+bkZpbGxlZExlbiAvIDI7Ci0gICAgICAgICAgICBjb25zdCBPTVhfUzE2ICogY29uc3QgcGNtMTYgPSByZWludGVycHJldF9jYXN0PE9NWF9TMTYgKj4oaW5IZWFkZXItPnBCdWZmZXIpOworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgbmJJbnB1dEZyYW1lcyA9IGluSGVhZGVyLT5uRmlsbGVkTGVuIC8gZnJhbWVTaXplOworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgbmJJbnB1dFNhbXBsZXMgPSBpbkhlYWRlci0+bkZpbGxlZExlbiAvIHNhbXBsZVNpemU7CiAKLSAgICAgICAgICAgIENIRUNLX0xFKG5iSW5wdXRTYW1wbGVzLCAyICoga01heE51bVNhbXBsZXNQZXJGcmFtZSk7Ci0gICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGk9MCA7IGkgPCBuYklucHV0U2FtcGxlcyA7IGkrKykgewotICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlclBjbTMyW2ldID0gKEZMQUNfX2ludDMyKSBwY20xNltpXTsKKyAgICAgICAgICAgIGlmIChpbnB1dEZsb2F0KSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfTEUobmJJbnB1dFNhbXBsZXMsIGtOdW1TYW1wbGVzUGVyRnJhbWUgKiBrTWF4Q2hhbm5lbHMpOworICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0ICogY29uc3QgcGNtRmxvYXQgPSByZWludGVycHJldF9jYXN0PGZsb2F0ICo+KGluSGVhZGVyLT5wQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgbWVtY3B5X3RvX3E4XzIzX2Zyb21fZmxvYXRfd2l0aF9jbGFtcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXJQY20zMiwgcGNtRmxvYXQsIG5iSW5wdXRTYW1wbGVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gbm90ZSBuYklucHV0U2FtcGxlcyBtYXkgYmUgMnggYXMgbGFyZ2UgZm9yIHBjbTE2IGRhdGEuCisgICAgICAgICAgICAgICAgQ0hFQ0tfTEUobmJJbnB1dFNhbXBsZXMsIGtOdW1TYW1wbGVzUGVyRnJhbWUgKiBrTWF4Q2hhbm5lbHMgKiAyKTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90ICogY29uc3QgcGNtMTYgPSByZWludGVycHJldF9jYXN0PGludDE2X3QgKj4oaW5IZWFkZXItPnBCdWZmZXIpOworICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuYklucHV0U2FtcGxlczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlclBjbTMyW2ldID0gKEZMQUNfX2ludDMyKSBwY20xNltpXTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigiIGFib3V0IHRvIGVuY29kZSAldSBzYW1wbGVzIHBlciBjaGFubmVsIiwgbmJJbnB1dEZyYW1lcyk7CiAgICAgICAgICAgICBvayA9IEZMQUNfX3N0cmVhbV9lbmNvZGVyX3Byb2Nlc3NfaW50ZXJsZWF2ZWQoCkBAIC01MjUsMTAgKzU1NCwxMiBAQAogICAgICAgICByZXR1cm4gT01YX0Vycm9ySW52YWxpZFN0YXRlOwogICAgIH0KIAorICAgIGNvbnN0IGJvb2wgaW5wdXRGbG9hdCA9IG1OdW1lcmljYWxEYXRhID09IE9NWF9OdW1lcmljYWxEYXRhRmxvYXQ7CisgICAgY29uc3QgaW50IGNvZGVjQml0c1BlclNhbXBsZSA9IGlucHV0RmxvYXQgPyAyNCA6IDE2OwogICAgIEZMQUNfX2Jvb2wgb2sgPSB0cnVlOwogICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X2NoYW5uZWxzKG1GbGFjU3RyZWFtRW5jb2RlciwgbU51bUNoYW5uZWxzKTsKICAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9zYW1wbGVfcmF0ZShtRmxhY1N0cmVhbUVuY29kZXIsIG1TYW1wbGVSYXRlKTsKLSAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9iaXRzX3Blcl9zYW1wbGUobUZsYWNTdHJlYW1FbmNvZGVyLCAxNik7CisgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfYml0c19wZXJfc2FtcGxlKG1GbGFjU3RyZWFtRW5jb2RlciwgY29kZWNCaXRzUGVyU2FtcGxlKTsKICAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9jb21wcmVzc2lvbl9sZXZlbChtRmxhY1N0cmVhbUVuY29kZXIsCiAgICAgICAgICAgICAodW5zaWduZWQpbUNvbXByZXNzaW9uTGV2ZWwpOwogICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X3ZlcmlmeShtRmxhY1N0cmVhbUVuY29kZXIsIGZhbHNlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuaAppbmRleCA2NGE2YjFlLi43MjJmYzEzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5oCkBAIC00NSw4ICs0NSwxMCBAQAogCiBwcml2YXRlOgogICAgIGNvbnN0IHVuc2lnbmVkIGludCBrTnVtQnVmZmVycyA9IDI7Ci0gICAgY29uc3QgdW5zaWduZWQgaW50IGtNYXhOdW1TYW1wbGVzUGVyRnJhbWUgPSAxMTUyOwotICAgIGNvbnN0IHVuc2lnbmVkIGludCBrTWF4SW5wdXRCdWZmZXJTaXplID0ga01heE51bVNhbXBsZXNQZXJGcmFtZSAqIHNpemVvZihpbnQxNl90KSAqIDI7CisgICAgc3RhdGljIGNvbnN0ZXhwciB1bnNpZ25lZCBpbnQga01heENoYW5uZWxzID0gMjsKKyAgICBzdGF0aWMgY29uc3RleHByIHVuc2lnbmVkIGludCBrTnVtU2FtcGxlc1BlckZyYW1lID0gMTE1MjsKKyAgICBzdGF0aWMgY29uc3RleHByIHVuc2lnbmVkIGludCBrTWF4SW5wdXRCdWZmZXJTaXplID0KKyAgICAgICAgICAgIGtOdW1TYW1wbGVzUGVyRnJhbWUgKiBrTWF4Q2hhbm5lbHMgKiBzaXplb2YoZmxvYXQpOwogICAgIGNvbnN0IHVuc2lnbmVkIGludCBrTWF4T3V0cHV0QnVmZmVyU2l6ZSA9IDY1NTM2OyAgICAvL1RPRE8gY2hlY2sgaWYgdGhpcyBjYW4gYmUgcmVkdWNlZAogCiAgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CkBAIC01NCw2ICs1Niw4IEBACiAgICAgT01YX1UzMiBtTnVtQ2hhbm5lbHM7CiAgICAgT01YX1UzMiBtU2FtcGxlUmF0ZTsKICAgICBPTVhfVTMyIG1Db21wcmVzc2lvbkxldmVsOworICAgIE9NWF9OVU1FUklDQUxEQVRBVFlQRSBtTnVtZXJpY2FsRGF0YSA9IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkOworICAgIE9NWF9VMzIgbUJpdHNQZXJTYW1wbGUgPSAxNjsKIAogICAgIC8vIHNob3VsZCB0aGUgZGF0YSByZWNlaXZlZCBieSB0aGUgY2FsbGJhY2sgYmUgd3JpdHRlbiB0byB0aGUgb3V0cHV0IHBvcnQKICAgICBib29sICAgICAgICBtRW5jb2RlcldyaXRlRGF0YTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDRjMjk2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1zdWJkaXJzID0gWyIqIl0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQuYnAKaW5kZXggM2Q5N2Q4Yy4uZjUzNTdmNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQuYnAKQEAgLTEsMjYgKzEsOSBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2c3MTFkZWMiLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgdm5kazogewotICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgIH0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLAogCiAgICAgc3JjczogWyJTb2Z0RzcxMS5jcHAiXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgXSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0KLSAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAotCiAgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCiAKICAgICBzYW5pdGl6ZTogewpAQCAtMjksOSArMTIsNSBAQAogICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcAppbmRleCA3YTRjY2E5Li44NzdjYjVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAKQEAgLTIzLDYgKzIzLDggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogCisjZGVmaW5lIE1BWF9DSEFOTkVMX0NPVU5UICAgICAgICAgICAgNiAgLyogbWF4aW11bSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgdGhhdCBjYW4gYmUgZGVjb2RlZCAqLworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHRlbXBsYXRlPGNsYXNzIFQ+CkBAIC0xODQsNyArMTg2LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5uQ2hhbm5lbHMgPCAxIHx8IHBjbVBhcmFtcy0+bkNoYW5uZWxzID4gMikgeworICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+bkNoYW5uZWxzIDwgMSB8fCBwY21QYXJhbXMtPm5DaGFubmVscyA+IE1BWF9DSEFOTkVMX0NPVU5UKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KIApAQCAtMzcyLDcgKzM3NCw3IEBACiAKICAgICAgICAgaW50MzJfdCBzdGVwID0gNCA8PCBzZWdtZW50OwogCi0gICAgICAgIGludDMyX3QgYWJzID0gKDB4ODBsIDw8IGV4cG9uZW50KSArIHN0ZXAgKiBtYW50aXNzYSArIHN0ZXAgLyAyIC0gNCAqIDMzOworICAgICAgICBpbnQzMl90IGFicyA9ICgweDgwTCA8PCBleHBvbmVudCkgKyBzdGVwICogbWFudGlzc2EgKyBzdGVwIC8gMiAtIDQgKiAzMzsKIAogICAgICAgICAqb3V0KysgPSAoeCA8IDB4ODApID8gLWFicyA6IGFiczsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NGMyOTYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc3ViZGlycyA9IFsiKiJdCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvQW5kcm9pZC5icAppbmRleCAxYzMyMDhiLi41NjcyZDg5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL0FuZHJvaWQuYnAKQEAgLTEsMjAgKzEsOSBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2dzbWRlYyIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICB2bmRrOiB7Ci0gICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgfSwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCiAKICAgICBzcmNzOiBbIlNvZnRHU00uY3BwIl0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAotICAgICAgICAiZXh0ZXJuYWwvbGliZ3NtL2luYyIsCi0gICAgXSwKLQotICAgIGNmbGFnczogWyItV2Vycm9yIl0sCi0KICAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKIAogICAgIHNhbml0aXplOiB7CkBAIC0yMywxOCArMTIsNyBAQAogICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAogCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLQogICAgIHN0YXRpY19saWJzOiBbImxpYmdzbSJdLAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvQW5kcm9pZC5icAppbmRleCA0NTkyMGU2Li5lYzQzNmNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL0FuZHJvaWQuYnAKQEAgLTEsNDggKzEsMjYgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9oZXZjZGVjIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKIAogICAgIHN0YXRpY19saWJzOiBbImxpYmhldmNkZWMiXSwKICAgICBzcmNzOiBbIlNvZnRIRVZDLmNwcCJdLAogCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2FsbCIsCi0gICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1Xbm8tdW51c2VkLXZhcmlhYmxlIiwKICAgICBdLAogCiAgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImV4dGVybmFsL2xpYmhldmMvZGVjb2RlciIsCi0gICAgICAgICJleHRlcm5hbC9saWJoZXZjL2NvbW1vbiIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAotCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiAKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotCiAgICAgLy8gV2UgbmVlZCB0aGlzIGJlY2F1c2UgdGhlIGN1cnJlbnQgYXNtIGdlbmVyYXRlcyB0aGUgZm9sbG93aW5nIGxpbmsgZXJyb3I6CiAgICAgLy8gcmVxdWlyZXMgdW5zdXBwb3J0ZWQgZHluYW1pYyByZWxvYyBSX0FSTV9SRUwzMjsgcmVjb21waWxlIHdpdGggLWZQSUMKICAgICAvLyBCdWc6IDE2ODUzMjkxCiAgICAgbGRmbGFnczogWyItV2wsLUJzeW1ib2xpYyJdLAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9Tb2Z0SEVWQy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9Tb2Z0SEVWQy5jcHAKaW5kZXggYmI3ZDM2MS4uZjZhZTFmNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvU29mdEhFVkMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmNwcApAQCAtNTY5LDcgKzU2OSw3IEBACiAgICAgICAgICAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX2RlY19pcCwgKHZvaWQgKikmc19kZWNfb3ApOwogCiAgICAgICAgICAgICBib29sIHVuc3VwcG9ydGVkUmVzb2x1dGlvbiA9Ci0gICAgICAgICAgICAgICAgKElWRF9TVFJFQU1fV0lEVEhfSEVJR0hUX05PVF9TVVBQT1JURUQgPT0gKHNfZGVjX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSk7CisgICAgICAgICAgICAgICAgKElWRF9TVFJFQU1fV0lEVEhfSEVJR0hUX05PVF9TVVBQT1JURUQgPT0gKHNfZGVjX29wLnU0X2Vycm9yX2NvZGUgJiBJVkRfRVJST1JfTUFTSykpOwogCiAgICAgICAgICAgICAvKiBDaGVjayBmb3IgdW5zdXBwb3J0ZWQgZGltZW5zaW9ucyAqLwogICAgICAgICAgICAgaWYgKHVuc3VwcG9ydGVkUmVzb2x1dGlvbikgewpAQCAtNTc5LDcgKzU3OSw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBib29sIGFsbG9jYXRpb25GYWlsZWQgPSAoSVZEX01FTV9BTExPQ19GQUlMRUQgPT0gKHNfZGVjX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSk7CisgICAgICAgICAgICBib29sIGFsbG9jYXRpb25GYWlsZWQgPSAKKyAgICAgICAgICAgICAgICAoSVZEX01FTV9BTExPQ19GQUlMRUQgPT0gKHNfZGVjX29wLnU0X2Vycm9yX2NvZGUgJiBJVkRfRVJST1JfTUFTSykpOwogICAgICAgICAgICAgaWYgKGFsbG9jYXRpb25GYWlsZWQpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiQWxsb2NhdGlvbiBmYWlsdXJlIGluIGRlY29kZXIiKTsKICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZywgMCwgTlVMTCk7CkBAIC01ODcsNyArNTg4LDE0IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBib29sIHJlc0NoYW5nZWQgPSAoSVZEX1JFU19DSEFOR0VEID09IChzX2RlY19vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpOworICAgICAgICAgICAgaWYgKElTX0lWRF9GQVRBTF9FUlJPUihzX2RlY19vcC51NF9lcnJvcl9jb2RlKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYXRhbCBFcnJvciA6IDB4JXgiLCBzX2RlY19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZywgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgcmVzQ2hhbmdlZCA9IChJVkRfUkVTX0NIQU5HRUQgPT0gKHNfZGVjX29wLnU0X2Vycm9yX2NvZGUgJiBJVkRfRVJST1JfTUFTSykpOwogCiAgICAgICAgICAgICBnZXRWVUlQYXJhbXMoKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ0YzI5Ni4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXN1YmRpcnMgPSBbIioiXQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLmJwCmluZGV4IGNhNzBjYzIuLjZiNDVlYTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQuYnAKQEAgLTM4LDkgKzM4LDkgQEAKICAgICAgICAgInNyYy96aWd6YWdfdGFiLmNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiCiAgICAgXSwKIAogICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKQEAgLTYwLDkgKzYwLDYgQEAKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiB9CiAKQEAgLTcwLDQ1ICs2NywyMyBAQAogCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfbXBlZzRkZWMiLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgdm5kazogewotICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgIH0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLAogCiAgICAgc3JjczogWyJTb2Z0TVBFRzQuY3BwIl0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAotICAgIF0sCi0KICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiAKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1ET1NDTF9FWFBPUlRfUkVGPSIsCiAgICAgICAgICItRE9TQ0xfSU1QT1JUX1JFRj0iLAotCi0gICAgICAgICItV2Vycm9yIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2RlYyJdLAogCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLQogICAgIHNhbml0aXplOiB7CiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5jcHAKaW5kZXggZmRhNzAyOC4uNjA3NTBkOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmNwcApAQCAtMjQsNyArMjQsNiBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9JT01YLmg+CiAKICNpbmNsdWRlICJtcDRkZWNfYXBpLmgiCiAKQEAgLTExOCw5ICsxMTcsMTQgQEAKICAgICAgICAgICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IE9NWF9CVUZGRVJGTEFHX0VPUzsKIAogICAgICAgICAgICAgICAgIExpc3Q8QnVmZmVySW5mbyAqPjo6aXRlcmF0b3IgaXQgPSBvdXRRdWV1ZS5iZWdpbigpOwotICAgICAgICAgICAgICAgIHdoaWxlICgoKml0KS0+bUhlYWRlciAhPSBvdXRIZWFkZXIpIHsKKyAgICAgICAgICAgICAgICB3aGlsZSAoaXQgIT0gb3V0UXVldWUuZW5kKCkgJiYgKCppdCktPm1IZWFkZXIgIT0gb3V0SGVhZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICsraXQ7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpdCA9PSBvdXRRdWV1ZS5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiY291bGRuJ3QgZmluZCBwb3J0IGJ1ZmZlciAlZCBpbiBvdXRRdWV1ZTogYi8xMDk4OTE3MjciLCBtTnVtU2FtcGxlc091dHB1dCAmIDEpOworICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjEwOTg5MTcyNyIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgQnVmZmVySW5mbyAqb3V0SW5mbyA9ICppdDsKICAgICAgICAgICAgICAgICBvdXRJbmZvLT5tT3duZWRCeVVzID0gZmFsc2U7CkBAIC0zODIsNiArMzg2LDcgQEAKICAgICBpZiAocG9ydEluZGV4ID09IDAgJiYgbUluaXRpYWxpemVkKSB7CiAgICAgICAgIENIRUNLX0VRKChpbnQpUFZSZXNldFZpZGVvRGVjb2RlcihtSGFuZGxlKSwgKGludClQVl9UUlVFKTsKICAgICB9CisgICAgbUZyYW1lc0NvbmZpZ3VyZWQgPSBmYWxzZTsKIH0KIAogdm9pZCBTb2Z0TVBFRzQ6Om9uUmVzZXQoKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9ibG9ja19pZGN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2Jsb2NrX2lkY3QuY3BwCmluZGV4IGE3NTQ4M2EuLjNkMTAwODYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2Jsb2NrX2lkY3QuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL2Jsb2NrX2lkY3QuY3BwCkBAIC02MTcsNiArNjE3LDcgQEAKICAgICByZXR1cm47CiB9CiAKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIHZvaWQgaWRjdHJvd19pbnRyYSgKICAgICBpbnQxNiAqYmxrLCBQSVhFTCAqY29tcCwgaW50IHdpZHRoCiApCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wdmRlY19hcGkuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHZkZWNfYXBpLmNwcAppbmRleCA4ZDVkMDcxLi45YzBmY2ZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wdmRlY19hcGkuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3B2ZGVjX2FwaS5jcHAKQEAgLTEwNyw2ICsxMDcsNyBAQAogI2Vsc2UKICAgICAgICAgaWYgKChzaXplX3QpbkxheWVycyA+IFNJWkVfTUFYIC8gc2l6ZW9mKFZvbCAqKSkgewogICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgICAgICAgICBvc2NsX2ZyZWUodmlkZW8pOwogICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgICB9CiAKQEAgLTExNSw3ICsxMTYsOCBAQAogICAgICAgICBpZiAodmlkZW8tPnZvbCA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKICAgICAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IG5MYXllcnMgKiBzaXplb2YoVm9sICopOwogCi0KKyAgICAgICAgLyogYmUgc3VyZSBub3QgdG8gbGVhayBhbnkgcHJldmlvdXMgc3RhdGUgKi8KKyAgICAgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKGRlY0N0cmwpOwogICAgICAgICAvKiB3ZSBuZWVkIHRvIHNldHVwIHRoaXMgcG9pbnRlciBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvICovCiAgICAgICAgIC8qICAgIHBhc3MgaXQgYXJvdW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgZGVjQ3RybC0+dmlkZW9EZWNvZGVyRGF0YSA9ICh2b2lkICopIHZpZGVvOwpAQCAtMTg0LDggKzE4Niw4IEBACiAjaWZkZWYgREVDX0lOVEVSTkFMX01FTU9SWV9PUFQKICAgICAgICAgICAgICAgICB2aWRlby0+dm9sW2lkeF0gPSBJTUVNX3ZvbFtpZHhdOwogICAgICAgICAgICAgICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBzaXplb2YoVm9sKTsKLSAgICAgICAgICAgICAgICBvc2NsX21lbXNldCh2aWRlby0+dm9sW2lkeF0sIDAsIHNpemVvZihWb2wpKTsKICAgICAgICAgICAgICAgICBpZiAodmlkZW8tPnZvbFtpZHhdID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgICAgICAgICAgICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPnZvbFtpZHhdLCAwLCBzaXplb2YoVm9sKSk7CiAgICAgICAgICAgICAgICAgc3RyZWFtID0gSU1FTV9CaXRzdHJlYW1EZWNWaWRlbzsKICNlbHNlCiAgICAgICAgICAgICAgICAgdmlkZW8tPnZvbFtpZHhdID0gKFZvbCAqKSBvc2NsX21hbGxvYyhzaXplb2YoVm9sKSk7CkBAIC0yMTEsNiArMjEzLDcgQEAKICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBpbnQzMiBidWZmZXJfc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgb3NjbF9tZW1zZXQoc3RyZWFtLCAwLCBzaXplb2YoQml0c3RyZWFtRGVjVmlkZW8pKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKChidWZmZXJfc2l6ZSA9IEJpdHN0cmVhbU9wZW4oc3RyZWFtLCBpZHgpKSA8IDApCiAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1wNGRlY19sb2coIkluaXRWaWRlb0RlY29kZXIoKTogQ2FuJ3QgYWxsb2NhdGUgYml0c3RyZWFtIGJ1ZmZlci5cbiIpOwpAQCAtMzM3LDI3ICszNDAsMzMgQEAKICNpZmRlZiBERUNfSU5URVJOQUxfTUVNT1JZX09QVAogICAgIHZpZGVvLT5jdXJyVm9wLT55Q2hhbiA9IElNRU1fY3VyclZvcF95Q2hhbjsgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgVk9QIE9LQSAzLzIvMSovCiAgICAgaWYgKHZpZGVvLT5jdXJyVm9wLT55Q2hhbiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICB2aWRlby0+Y3VyclZvcC0+dUNoYW4gPSB2aWRlby0+Y3VyclZvcC0+eUNoYW4gKyBzaXplOwotICAgIHZpZGVvLT5jdXJyVm9wLT52Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgIGVsc2UgeworICAgICAgICB2aWRlby0+Y3VyclZvcC0+dUNoYW4gPSB2aWRlby0+Y3VyclZvcC0+eUNoYW4gKyBzaXplOworICAgICAgICB2aWRlby0+Y3VyclZvcC0+dkNoYW4gPSB2aWRlby0+Y3VyclZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICB9CiAKICAgICB2aWRlby0+cHJldlZvcC0+eUNoYW4gPSBJTUVNX3ByZXZWb3BfeUNoYW47IC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsIFZPUCBPS0EgMy8yLzEqLwogICAgIGlmICh2aWRlby0+cHJldlZvcC0+eUNoYW4gPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgdmlkZW8tPnByZXZWb3AtPnVDaGFuID0gdmlkZW8tPnByZXZWb3AtPnlDaGFuICsgc2l6ZTsKLSAgICB2aWRlby0+cHJldlZvcC0+dkNoYW4gPSB2aWRlby0+cHJldlZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICBlbHNlIHsKKyAgICAgICAgdmlkZW8tPnByZXZWb3AtPnVDaGFuID0gdmlkZW8tPnByZXZWb3AtPnlDaGFuICsgc2l6ZTsKKyAgICAgICAgdmlkZW8tPnByZXZWb3AtPnZDaGFuID0gdmlkZW8tPnByZXZWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgfQogI2Vsc2UKICAgICBpZiAoc2l6ZSA+IElOVDMyX01BWCAvIDMpIHsKICAgICAgICAgcmV0dXJuIFBWX0ZBTFNFOwogICAgIH0KICAgICB2aWRlby0+Y3VyclZvcC0+eUNoYW4gPSAoUElYRUwgKikgb3NjbF9tYWxsb2Moc2l6ZSAqIDMgLyAyKTsgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgVk9QIE9LQSAzLzIvMSovCiAgICAgaWYgKHZpZGVvLT5jdXJyVm9wLT55Q2hhbiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLQotICAgIHZpZGVvLT5jdXJyVm9wLT51Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT55Q2hhbiArIHNpemU7Ci0gICAgdmlkZW8tPmN1cnJWb3AtPnZDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgZWxzZSB7CisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT51Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT55Q2hhbiArIHNpemU7CisgICAgICAgIHZpZGVvLT5jdXJyVm9wLT52Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgIH0KICAgICB2aWRlby0+cHJldlZvcC0+eUNoYW4gPSAoUElYRUwgKikgb3NjbF9tYWxsb2Moc2l6ZSAqIDMgLyAyKTsgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgVk9QIE9LQSAzLzIvMSovCiAgICAgaWYgKHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLQotICAgIHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiArIHNpemU7Ci0gICAgdmlkZW8tPnByZXZWb3AtPnZDaGFuID0gdmlkZW8tPnByZXZWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgZWxzZSB7CisgICAgICAgIHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiArIHNpemU7CisgICAgICAgIHZpZGVvLT5wcmV2Vm9wLT52Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgIH0KICNlbmRpZgogICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoc2l6ZSAqIDMpOwogI2VuZGlmICAgLy8gTUVNT1JZX1BPT0wKQEAgLTM4MSw4ICszOTAsMTAgQEAKIAogICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT55Q2hhbiA9IChQSVhFTCAqKSBvc2NsX21hbGxvYyhzaXplICogMyAvIDIpOyAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCBWT1AgT0tBIDMvMi8xKi8KICAgICAgICAgICAgIGlmICh2aWRlby0+cHJldkVuaGNWb3AtPnlDaGFuID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT51Q2hhbiA9IHZpZGVvLT5wcmV2RW5oY1ZvcC0+eUNoYW4gKyBzaXplOwotICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT52Q2hhbiA9IHZpZGVvLT5wcmV2RW5oY1ZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcC0+dUNoYW4gPSB2aWRlby0+cHJldkVuaGNWb3AtPnlDaGFuICsgc2l6ZTsKKyAgICAgICAgICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AtPnZDaGFuID0gdmlkZW8tPnByZXZFbmhjVm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9ICgzICogc2l6ZSAvIDIpOwogI2VuZGlmCiAgICAgICAgIH0KQEAgLTQyOSwxMCArNDQwLDEyIEBACiAjZWxzZQogICAgIHZpZGVvLT5zbGljZU5vID0gKHVpbnQ4ICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CKTsKICAgICBpZiAodmlkZW8tPnNsaWNlTm8gPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+c2xpY2VObywgMCwgblRvdGFsTUIpOwogICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBuVG90YWxNQjsKIAogICAgIHZpZGVvLT5hY1ByZWRGbGFnID0gKHVpbnQ4ICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CICogc2l6ZW9mKHVpbnQ4KSk7CiAgICAgaWYgKHZpZGVvLT5hY1ByZWRGbGFnID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPmFjUHJlZEZsYWcsIDAsIG5Ub3RhbE1CICogc2l6ZW9mKHVpbnQ4KSk7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChuVG90YWxNQik7CiAKICAgICBpZiAoKHNpemVfdCluVG90YWxNQiA+IFNJWkVfTUFYIC8gc2l6ZW9mKHR5cGVEQ1N0b3JlKSkgewpAQCAtNDQwLDYgKzQ1Myw3IEBACiAgICAgfQogICAgIHZpZGVvLT5wcmVkREMgPSAodHlwZURDU3RvcmUgKikgb3NjbF9tYWxsb2MoblRvdGFsTUIgKiBzaXplb2YodHlwZURDU3RvcmUpKTsKICAgICBpZiAodmlkZW8tPnByZWREQyA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT5wcmVkREMsIDAsIG5Ub3RhbE1CICogc2l6ZW9mKHR5cGVEQ1N0b3JlKSk7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChuVG90YWxNQiAqIHNpemVvZih0eXBlRENTdG9yZSkpOwogCiAgICAgaWYgKG5NQlBlclJvdyA+IElOVDMyX01BWCAtIDEKQEAgLTQ0OCw2ICs0NjIsNyBAQAogICAgIH0KICAgICB2aWRlby0+cHJlZERDQUNfY29sID0gKHR5cGVEQ0FDU3RvcmUgKikgb3NjbF9tYWxsb2MoKG5NQlBlclJvdyArIDEpICogc2l6ZW9mKHR5cGVEQ0FDU3RvcmUpKTsKICAgICBpZiAodmlkZW8tPnByZWREQ0FDX2NvbCA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT5wcmVkRENBQ19jb2wsIDAsIChuTUJQZXJSb3cgKyAxKSAqIHNpemVvZih0eXBlRENBQ1N0b3JlKSk7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9ICgobk1CUGVyUm93ICsgMSkgKiBzaXplb2YodHlwZURDQUNTdG9yZSkpOwogCiAgICAgLyogZWxlbWVudCB6ZXJvIHdpbGwgYmUgdXNlZCBmb3Igc3RvcmluZyB2ZXJ0aWNhbCAoY29sKSBBQyBjb2VmZmljaWVudHMgKi8KQEAgLTQ1Nyw5ICs0NzIsMTEgQEAKICAgICAvKiBBbGxvY2F0aW5nIEhlYWRlckluZm8gc3RydWN0dXJlICYgUXVhbnRpemVyIGFycmF5ICovCiAgICAgdmlkZW8tPmhlYWRlckluZm8uTW9kZSA9ICh1aW50OCAqKSBvc2NsX21hbGxvYyhuVG90YWxNQik7CiAgICAgaWYgKHZpZGVvLT5oZWFkZXJJbmZvLk1vZGUgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+aGVhZGVySW5mby5Nb2RlLCAwLCBuVG90YWxNQik7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IG5Ub3RhbE1COwogICAgIHZpZGVvLT5oZWFkZXJJbmZvLkNCUCA9ICh1aW50OCAqKSBvc2NsX21hbGxvYyhuVG90YWxNQik7CiAgICAgaWYgKHZpZGVvLT5oZWFkZXJJbmZvLkNCUCA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG9zY2xfbWVtc2V0ICh2aWRlby0+aGVhZGVySW5mby5DQlAsIDAsIG5Ub3RhbE1CKTsKICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gblRvdGFsTUI7CiAKICAgICBpZiAoKHNpemVfdCluVG90YWxNQiA+IFNJWkVfTUFYIC8gc2l6ZW9mKGludDE2KSkgewpAQCAtNDY3LDYgKzQ4NCw3IEBACiAgICAgfQogICAgIHZpZGVvLT5RUE1CID0gKGludDE2ICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CICogc2l6ZW9mKGludDE2KSk7CiAgICAgaWYgKHZpZGVvLT5RUE1CID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2UgbWVtc2V0KHZpZGVvLT5RUE1CLCAweDAsIG5Ub3RhbE1CICogc2l6ZW9mKGludDE2KSk7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChuVG90YWxNQiAqIHNpemVvZihpbnQpKTsKIAogICAgIC8qIEFsbG9jYXRpbmcgbWFjcm9ibG9jayBzcGFjZSAqLwpAQCAtNDg3LDggKzUwNSwxMCBAQAogICAgIH0KICAgICB2aWRlby0+bW90WCA9IChNT1QgKikgb3NjbF9tYWxsb2Moc2l6ZW9mKE1PVCkgKiA0ICogblRvdGFsTUIpOwogICAgIGlmICh2aWRlby0+bW90WCA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG1lbXNldCh2aWRlby0+bW90WCwgMCwgc2l6ZW9mKE1PVCkgKiA0ICogblRvdGFsTUIpOwogICAgIHZpZGVvLT5tb3RZID0gKE1PVCAqKSBvc2NsX21hbGxvYyhzaXplb2YoTU9UKSAqIDQgKiBuVG90YWxNQik7CiAgICAgaWYgKHZpZGVvLT5tb3RZID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2UgbWVtc2V0KHZpZGVvLT5tb3RZLCAwLCBzaXplb2YoTU9UKSAqIDQgKiBuVG90YWxNQik7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IChzaXplb2YoTU9UKSAqIDggKiBuVG90YWxNQik7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLmJwCmluZGV4IDZiZTQwMzYuLjI3MzgxODcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQuYnAKQEAgLTMyLDEwICszMiw2IEBACiAKICAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgXSwKICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiAKQEAgLTQ0LDkgKzQwLDYgQEAKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiB9CiAKQEAgLTU0LDQ5ICs0NywyNyBAQAogCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfbXBlZzRlbmMiLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgdm5kazogewotICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgIH0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLAogCiAgICAgc3JjczogWyJTb2Z0TVBFRzRFbmNvZGVyLmNwcCJdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvaGFyZHdhcmUiLAotICAgIF0sCiAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbInNyYyJdLAotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItREJYX1JDIiwKICAgICAgICAgIi1ET1NDTF9JTVBPUlRfUkVGPSIsCiAgICAgICAgICItRE9TQ0xfVU5VU0VEX0FSRyh4KT0odm9pZCkoeCkiLAogICAgICAgICAiLURPU0NMX0VYUE9SVF9SRUY9IiwKLQotICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbImxpYnN0YWdlZnJpZ2h0X200dmgyNjNlbmMiXSwKIAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0KICAgICBzYW5pdGl6ZTogewogICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQogCiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTEyMiw5ICs5Myw2IEBACiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAogCiAgICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2VuYyJdLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5jcHAKaW5kZXggZjZhN2IwZS4uZmE3ZGI4MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuY3BwCkBAIC0yMiw4ICsyMiw4IEBACiAjaW5jbHVkZSAibXA0ZW5jX2FwaS5oIgogI2luY2x1ZGUgIk9NWF9WaWRlby5oIgogCi0jaW5jbHVkZSA8SGFyZHdhcmVBUEkuaD4KLSNpbmNsdWRlIDxNZXRhZGF0YUJ1ZmZlclR5cGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmgKaW5kZXggMDBmMmRkMy4uNzFlMTE3MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmgKQEAgLTE3LDcgKzE3LDYgQEAKICNpZm5kZWYgU09GVF9NUEVHNF9FTkNPREVSX0hfCiAjZGVmaW5lIFNPRlRfTVBFRzRfRU5DT0RFUl9IXwogCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaD4KICNpbmNsdWRlICJtcDRlbmNfYXBpLmgiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL2luY2x1ZGUvbXA0ZW5jX2FwaS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9pbmNsdWRlL21wNGVuY19hcGkuaAppbmRleCA5NDUxNDc5Li5kNWEzZmYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL2luY2x1ZGUvbXA0ZW5jX2FwaS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvaW5jbHVkZS9tcDRlbmNfYXBpLmgKQEAgLTE4LDE2ICsxOCwxNyBAQAogI2lmbmRlZiBfTVA0RU5DX0FQSV9IXwogI2RlZmluZSBfTVA0RU5DX0FQSV9IXwogCisjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKICNpZm5kZWYgX1BWX1RZUEVTXwogI2RlZmluZSBfUFZfVFlQRVNfCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgVUNoYXI7Ci10eXBlZGVmIGNoYXIgQ2hhcjsKK3R5cGVkZWYgdWludDhfdCBVQ2hhcjsKK3R5cGVkZWYgaW50OF90IENoYXI7CiB0eXBlZGVmIHVuc2lnbmVkIGludCBVSW50OwogdHlwZWRlZiBpbnQgSW50OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBVU2hvcnQ7Ci10eXBlZGVmIHNob3J0IFNob3J0OwordHlwZWRlZiB1aW50MTZfdCBVU2hvcnQ7Cit0eXBlZGVmIGludDE2X3QgU2hvcnQ7CiB0eXBlZGVmIHVuc2lnbmVkIGludCBCb29sOwogdHlwZWRlZiB1aW50MzJfdCBVTG9uZzsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvbXA0ZGVmLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRkZWYuaAppbmRleCAyZDQ0NDgyLi5kYmQ3MGRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRkZWYuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9tcDRkZWYuaApAQCAtNTIsMTMgKzUyLDEzIEBACiAKICNpZm5kZWYgX1BWX1RZUEVTXwogI2RlZmluZSBfUFZfVFlQRVNfCi10eXBlZGVmIHVuc2lnbmVkIGNoYXIgVUNoYXI7Ci10eXBlZGVmIGNoYXIgQ2hhcjsKK3R5cGVkZWYgdWludDhfdCBVQ2hhcjsKK3R5cGVkZWYgaW50OF90IENoYXI7CiB0eXBlZGVmIHVuc2lnbmVkIGludCBVSW50OwogdHlwZWRlZiBpbnQgSW50OwotdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCBVU2hvcnQ7Ci10eXBlZGVmIHNob3J0IFNob3J0OwotdHlwZWRlZiBzaG9ydCBpbnQgU0ludDsKK3R5cGVkZWYgdWludDE2X3QgVVNob3J0OwordHlwZWRlZiBpbnQxNl90IFNob3J0OwordHlwZWRlZiBpbnQxNl90IFNJbnQ7CiB0eXBlZGVmIHVuc2lnbmVkIGludCBCb29sOwogdHlwZWRlZiB1aW50MzJfdCBVTG9uZzsKIHR5cGVkZWYgdm9pZCBWb2lkOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvcmF0ZV9jb250cm9sLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3JhdGVfY29udHJvbC5jcHAKaW5kZXggNTMxNDljMS4uZWNjMzIxNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvcmF0ZV9jb250cm9sLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9yYXRlX2NvbnRyb2wuY3BwCkBAIC0zNzcsMTUgKzM3NywxNSBAQAogLyogIEluL291dCAgIDogTnIsIEIsIFJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgUmV0dXJuICAgOiBWb2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogSW5wdXQgYXJndW1lbnQgInZpZGVvIiBpcyBndWFyYW50ZWVkIG5vbi1udWxsIGJ5IGNhbGxlciAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotCiBQVl9TVEFUVVMgUkNfVXBkYXRlQnVmZmVyKFZpZGVvRW5jRGF0YSAqdmlkZW8sIEludCBjdXJyTGF5ZXIsIEludCBudW1fc2tpcCkKIHsKICAgICByYXRlQ29udHJvbCAqcmMgID0gdmlkZW8tPnJjW2N1cnJMYXllcl07CiAgICAgTXVsdGlQYXNzICAgKnBNUCA9IHZpZGVvLT5wTVBbY3VyckxheWVyXTsKIAotICAgIGlmICh2aWRlbyA9PSBOVUxMIHx8IHJjID09IE5VTEwgfHwgcE1QID09IE5VTEwpCisgICAgaWYgKHJjID09IE5VTEwgfHwgcE1QID09IE5VTEwpCiAgICAgICAgIHJldHVybiBQVl9GQUlMOwogCiAgICAgcmMtPlZCVl9mdWxsbmVzcyAgIC09IChJbnQpKHJjLT5iaXRyYXRlIC8gcmMtPmZyYW1lcmF0ZSAqIG51bV9za2lwKTsgLy9yY1tjdXJyTGF5ZXJdLT5ScDsKQEAgLTUyNCw2ICs1MjQsNyBAQAogLyogIEluL291dCAgIDogcmMtPlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBSZXR1cm4gICA6IFZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogSW5wdXQgYXJndW1lbnQgImlucHV0IiBpcyBndWFyYW50ZWVkIG5vbi1udWxsIGJ5IGNhbGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKIHZvaWQgdGFyZ2V0Qml0Q2FsY3VsYXRpb24odm9pZCAqaW5wdXQpCkBAIC01MzcsNyArNTM4LDcgQEAKICAgICBJbnQgZGlmZl9jb3VudGVyX0JUc3JjLCBkaWZmX2NvdW50ZXJfQlRkc3QsIHByZXZfY291bnRlcl9kaWZmLCBjdXJyX2NvdW50ZXJfZGlmZiwgYm91bmQ7CiAgICAgLyogQlQgPSBCaXQgVHJhbnNmZXIsIGZvciBwTVAtPmNvdW50ZXJfQlRzcmMsIHBNUC0+Y291bnRlcl9CVGRzdCAqLwogCi0gICAgaWYgKHZpZGVvID09IE5VTEwgfHwgY3VyclZvbCA9PSBOVUxMIHx8IHBNUCA9PSBOVUxMIHx8IHJjID09IE5VTEwpCisgICAgaWYgKGN1cnJWb2wgPT0gTlVMTCB8fCBwTVAgPT0gTlVMTCB8fCByYyA9PSBOVUxMKQogICAgICAgICByZXR1cm47CiAKICAgICAvKiBzb21lIHN0dWZmIGFib3V0IGZyYW1lIGRyb3BwaW5nIHJlbWFpbmVkIGhlcmUgdG8gYmUgZG9uZSBiZWNhdXNlIHBNUCBjYW5ub3QgYmUgaW5zZXJ0ZWQgaW50byB1cGRhdGVSYXRlQ29udHJvbCgpKi8KQEAgLTY5Myw2ICs2OTQsNyBAQAogLyogIEluL291dCAgIDogcmMtPlQgYW5kIHJjLT5RYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBSZXR1cm4gICA6IFZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIElucHV0IGFyZ3VtZW50ICJpbnB1dCIgaXMgZ3VhcmFudGVlZCBub24tbnVsbCBieSBjYWxsZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKIC8qIE1hZCBiYXNlZCB2YXJpYWJsZSBiaXQgYWxsb2NhdGlvbiArIFFQIGNhbGN1bGF0aW9uIHdpdGggYSBuZXcgcXVhZHJhdGljIG1ldGhvZCAqLwpAQCAtNzA4LDcgKzcxMCw3IEBACiAgICAgZmxvYXQgY3Vycl9tYWQsIHByZXZfbWFkLCBjdXJyX1JELCBwcmV2X1JELCBhdmVyYWdlX21hZCwgYXZlcl9RUDsKIAogCi0gICAgaWYgKHZpZGVvID09IE5VTEwgfHwgY3VyclZvbCA9PSBOVUxMIHx8IHBNUCA9PSBOVUxMIHx8IHJjID09IE5VTEwpCisgICAgaWYgKGN1cnJWb2wgPT0gTlVMTCB8fCBwTVAgPT0gTlVMTCB8fCByYyA9PSBOVUxMKQogICAgICAgICByZXR1cm47CiAKICAgICAvKiBNYWQgYmFzZWQgdmFyaWFibGUgYml0IGFsbG9jYXRpb24gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvdGVzdC9tNHZfaDI2M19lbmNfdGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvbTR2X2gyNjNfZW5jX3Rlc3QuY3BwCmluZGV4IGRiMmM2MWEuLjU1NTRlYmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvdGVzdC9tNHZfaDI2M19lbmNfdGVzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L200dl9oMjYzX2VuY190ZXN0LmNwcApAQCAtMTgzLDYgKzE4MywxMCBAQAogICAgIC8vIEluaXRpYWxpemUgdGhlIGVuY29kZXIuCiAgICAgaWYgKCFQVkluaXRWaWRlb0VuY29kZXIoJmhhbmRsZSwgJmVuY1BhcmFtcykpIHsKICAgICAgICAgZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZW5jb2RlclxuIik7CisgICAgICAgIGZjbG9zZShmcElucHV0KTsKKyAgICAgICAgZmNsb3NlKGZwT3V0cHV0KTsKKyAgICAgICAgZnJlZShpbnB1dEJ1Zik7CisgICAgICAgIGZyZWUob3V0cHV0QnVmKTsKICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKICAgICB9CiAKQEAgLTE5MCw2ICsxOTQsMTAgQEAKICAgICBpbnQzMl90IGhlYWRlckxlbmd0aCA9IGtPdXRwdXRCdWZmZXJTaXplOwogICAgIGlmICghUFZHZXRWb2xIZWFkZXIoJmhhbmRsZSwgb3V0cHV0QnVmLCAmaGVhZGVyTGVuZ3RoLCAwKSkgewogICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBnZXQgVk9MIGhlYWRlclxuIik7CisgICAgICAgIGZjbG9zZShmcElucHV0KTsKKyAgICAgICAgZmNsb3NlKGZwT3V0cHV0KTsKKyAgICAgICAgZnJlZShpbnB1dEJ1Zik7CisgICAgICAgIGZyZWUob3V0cHV0QnVmKTsKICAgICAgICAgcmV0dXJuIEVYSVRfRkFJTFVSRTsKICAgICB9CiAgICAgZndyaXRlKG91dHB1dEJ1ZiwgMSwgaGVhZGVyTGVuZ3RoLCBmcE91dHB1dCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQuYnAKaW5kZXggOWZhOWE0Yy4uYjYzMDUyNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5icApAQCAtNTksOSArNTksNiBAQAogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKIAogICAgIGluY2x1ZGVfZGlyczogWyJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiXSwKQEAgLTgxLDI0ICs3OCwxNSBAQAogCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfbXAzZGVjIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKIAogICAgIHNyY3M6IFsiU29mdE1QMy5jcHAiXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgXSwKICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKICAgICAgICAgInNyYyIsCiAgICAgICAgICJpbmNsdWRlIiwKICAgICBdLAogCi0gICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKLQogICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAogCiAgICAgc2FuaXRpemU6IHsKQEAgLTEwNiwyMCArOTQsOSBAQAogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKIAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0KICAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9tcDNkZWMiXSwKLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQogCiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKQEAgLTE0NCw5ICsxMjEsNiBAQAogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKIAogICAgIHN0YXRpY19saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcAppbmRleCAyMzY0Njg0Li44MDA4M2Y3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAKQEAgLTExNCw3ICsxMTQsNyBAQAogICAgIG1Db25maWctPmNyY0VuYWJsZWQgPSBmYWxzZTsKIAogICAgIHVpbnQzMl90IG1lbVJlcXVpcmVtZW50cyA9IHB2bXAzX2RlY29kZXJNZW1SZXF1aXJlbWVudHMoKTsKLSAgICBtRGVjb2RlckJ1ZiA9IG1hbGxvYyhtZW1SZXF1aXJlbWVudHMpOworICAgIG1EZWNvZGVyQnVmID0gY2FsbG9jKDEsIG1lbVJlcXVpcmVtZW50cyk7CiAKICAgICBwdm1wM19Jbml0RGVjb2RlcihtQ29uZmlnLCBtRGVjb2RlckJ1Zik7CiAgICAgbUlzRmlyc3QgPSB0cnVlOwpAQCAtNDA3LDcgKzQwNyw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPQotICAgICAgICAgICAgbUFuY2hvclRpbWVVcyArIChtTnVtRnJhbWVzT3V0cHV0ICogMTAwMDAwMGxsKSAvIG1TYW1wbGluZ1JhdGU7CisgICAgICAgICAgICBtQW5jaG9yVGltZVVzICsgKG1OdW1GcmFtZXNPdXRwdXQgKiAxMDAwMDAwTEwpIC8gbVNhbXBsaW5nUmF0ZTsKIAogICAgICAgICBpZiAoaW5IZWFkZXIpIHsKICAgICAgICAgICAgIENIRUNLX0dFKChpbnQzMl90KWluSGVhZGVyLT5uRmlsbGVkTGVuLCBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZ2V0X3NpZGVfaW5mby5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19nZXRfc2lkZV9pbmZvLmNwcAppbmRleCBlNTVjMmU3Li5kNjQ0MjA3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19nZXRfc2lkZV9pbmZvLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19nZXRfc2lkZV9pbmZvLmNwcApAQCAtMTI3LDEzICsxMjcsMTMgQEAKICAgICAgICAgewogICAgICAgICAgICAgdG1wID0gZ2V0Yml0c19jcmMoaW5wdXRTdHJlYW0sIDE0LCBjcmMsIGluZm8tPmVycm9yX3Byb3RlY3Rpb24pOwogICAgICAgICAgICAgc2ktPm1haW5fZGF0YV9iZWdpbiA9ICh0bXAgPDwgMTgpID4+IDIzOyAgICAvKiA5ICovCi0gICAgICAgICAgICBzaS0+cHJpdmF0ZV9iaXRzICAgID0gKHRtcCA8PCAyMykgPj4gMjc7ICAgIC8qIDUgKi8KKyAgICAgICAgICAgIHNpLT5wcml2YXRlX2JpdHMgICAgPSAodG1wIDw8IDI3KSA+PiAyNzsgICAgLyogNSAqLwogICAgICAgICB9CiAgICAgICAgIGVsc2UKICAgICAgICAgewogICAgICAgICAgICAgdG1wID0gZ2V0Yml0c19jcmMoaW5wdXRTdHJlYW0sIDEyLCBjcmMsIGluZm8tPmVycm9yX3Byb3RlY3Rpb24pOwogICAgICAgICAgICAgc2ktPm1haW5fZGF0YV9iZWdpbiA9ICh0bXAgPDwgMjApID4+IDIzOyAgICAvKiA5ICovCi0gICAgICAgICAgICBzaS0+cHJpdmF0ZV9iaXRzICAgID0gKHRtcCA8PCAyMykgPj4gMjk7ICAgIC8qIDMgKi8KKyAgICAgICAgICAgIHNpLT5wcml2YXRlX2JpdHMgICAgPSAodG1wIDw8IDI5KSA+PiAyOTsgICAgLyogMyAqLwogCiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbm9ybWFsaXplLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX25vcm1hbGl6ZS5jcHAKaW5kZXggZTU3OWJiZC4uODg1YWIwOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfbm9ybWFsaXplLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19ub3JtYWxpemUuY3BwCkBAIC0xNjAsNiArMTYwLDcgQEAKICAgICAgICAgY2FzZSAweDM4MDAwMDAwOgogICAgICAgICBjYXNlIDB4MzAwMDAwMDA6CiAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wZWcyZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5icAppbmRleCBmYjBkYjhmLi5lODQ5NDEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5icApAQCAtMSwzNSArMSwxNyBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X21wZWcyZGVjIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKIAogICAgIHN0YXRpY19saWJzOiBbImxpYm1wZWcyZGVjIl0sCiAgICAgc3JjczogWyJTb2Z0TVBFRzIuY3BwIl0sCiAKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XYWxsIiwKLSAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVduby11bnVzZWQtdmFyaWFibGUiLAogICAgIF0sCiAKICAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZXh0ZXJuYWwvbGlibXBlZzIvZGVjb2RlciIsCi0gICAgICAgICJleHRlcm5hbC9saWJtcGVnMi9jb21tb24iLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgXSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0KICAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCiAKICAgICBzYW5pdGl6ZTogewpAQCAtMzcsOSArMTksNSBAQAogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDRjMjk2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXN1YmRpcnMgPSBbIioiXQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL0FuZHJvaWQuYnAKaW5kZXggOGE5Mzk5YS4uODJiYjhkMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLmJwCkBAIC0xLDI3ICsxLDEwIEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfdnB4ZGVjIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKIAogICAgIHNyY3M6IFsiU29mdFZQWC5jcHAiXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgXSwKLQotICAgIHN0YXRpY19saWJzOiBbImxpYnZweCJdLAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLQotICAgIGNmbGFnczogWyItV2Vycm9yIl0sCisgICAgc2hhcmVkX2xpYnM6IFsibGlidnB4Il0sCiAKICAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKIApAQCAtMzEsOSArMTQsNSBAQAogICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwCmluZGV4IDhkNWYzZTcuLjBmMmZmMTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwCkBAIC0zMyw2ICszMyw3IEBACiAgICAgeyBPTVhfVklERU9fVlA5UHJvZmlsZTAsIE9NWF9WSURFT19WUDlMZXZlbDUgfSwKICAgICB7IE9NWF9WSURFT19WUDlQcm9maWxlMiwgT01YX1ZJREVPX1ZQOUxldmVsNSB9LAogICAgIHsgT01YX1ZJREVPX1ZQOVByb2ZpbGUySERSLCBPTVhfVklERU9fVlA5TGV2ZWw1IH0sCisgICAgeyBPTVhfVklERU9fVlA5UHJvZmlsZTJIRFIxMFBsdXMsIE9NWF9WSURFT19WUDlMZXZlbDUgfSwKIH07CiAKIFNvZnRWUFg6OlNvZnRWUFgoCkBAIC04NCw2ICs4NSwxMCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCitib29sIFNvZnRWUFg6OnN1cHBvcnREZXNjcmliZUhkcjEwUGx1c0luZm8oKSB7CisgICAgcmV0dXJuIHRydWU7Cit9CisKIHN0YXR1c190IFNvZnRWUFg6OmluaXREZWNvZGVyKCkgewogICAgIG1DdHggPSBuZXcgdnB4X2NvZGVjX2N0eF90OwogICAgIHZweF9jb2RlY19lcnJfdCB2cHhfZXJyOwpAQCAtMTY3LDcgKzE3MiwxMiBAQAogICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSAwOwogICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7CiAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IChvdXRwdXRCdWZmZXJXaWR0aCgpICogb3V0cHV0QnVmZmVySGVpZ2h0KCkgKiBicHAgKiAzKSAvIDI7Ci0gICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9ICooT01YX1RJQ0tTICopbUltZy0+dXNlcl9wcml2OworICAgICAgICBQcml2SW5mbyAqcHJpdkluZm8gPSAoUHJpdkluZm8gKiltSW1nLT51c2VyX3ByaXY7CisgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IHByaXZJbmZvLT5tVGltZVN0YW1wOworICAgICAgICBpZiAocHJpdkluZm8tPm1IZHIxMFBsdXNJbmZvICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHF1ZXVlT3V0cHV0RnJhbWVDb25maWcocHJpdkluZm8tPm1IZHIxMFBsdXNJbmZvKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChvdXRwdXRCdWZmZXJTYWZlKG91dEhlYWRlcikpIHsKICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IG91dEhlYWRlci0+cEJ1ZmZlcjsKICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSAoY29uc3QgdWludDhfdCAqKW1JbWctPnBsYW5lc1tWUFhfUExBTkVfWV07CkBAIC0yNzUsNyArMjg1LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBtVGltZVN0YW1wc1ttVGltZVN0YW1wSWR4XSA9IGluSGVhZGVyLT5uVGltZVN0YW1wOworICAgICAgICBtUHJpdkluZm9bbVRpbWVTdGFtcElkeF0ubVRpbWVTdGFtcCA9IGluSGVhZGVyLT5uVGltZVN0YW1wOworCisgICAgICAgIGlmIChpbkluZm8tPm1GcmFtZUNvbmZpZykgeworICAgICAgICAgICAgbVByaXZJbmZvW21UaW1lU3RhbXBJZHhdLm1IZHIxMFBsdXNJbmZvID0gZGVxdWV1ZUlucHV0RnJhbWVDb25maWcoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Qcml2SW5mb1ttVGltZVN0YW1wSWR4XS5tSGRyMTBQbHVzSW5mby5jbGVhcigpOworICAgICAgICB9CiAKICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKICAgICAgICAgICAgIG1FT1NTdGF0dXMgPSBJTlBVVF9FT1NfU0VFTjsKQEAgLTI4NSw3ICszMDEsNyBAQAogICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPiAwKSB7CiAgICAgICAgICAgICB2cHhfY29kZWNfZXJyX3QgZXJyID0gdnB4X2NvZGVjX2RlY29kZSgKICAgICAgICAgICAgICAgICAgICAgKHZweF9jb2RlY19jdHhfdCAqKW1DdHgsIGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuLCAmbVRpbWVTdGFtcHNbbVRpbWVTdGFtcElkeF0sIDApOworICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiwgJm1Qcml2SW5mb1ttVGltZVN0YW1wSWR4XSwgMCk7CiAgICAgICAgICAgICBpZiAoZXJyID09IFZQWF9DT0RFQ19PSykgewogICAgICAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaAppbmRleCBiNjJiNTI2Li4wYWE4ZTljIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5oCkBAIC0yNiw2ICsyNiw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RydWN0IEFCdWZmZXI7CisKIHN0cnVjdCBTb2Z0VlBYIDogcHVibGljIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQgewogICAgIFNvZnRWUFgoY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudFJvbGUsCkBAIC00MSw2ICs0Myw3IEBACiAgICAgdmlydHVhbCB2b2lkIG9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKICAgICB2aXJ0dWFsIHZvaWQgb25SZXNldCgpOwogICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0RGVzY3JpYmVIZHJTdGF0aWNJbmZvKCk7CisgICAgdmlydHVhbCBib29sIHN1cHBvcnREZXNjcmliZUhkcjEwUGx1c0luZm8oKTsKIAogcHJpdmF0ZToKICAgICBlbnVtIHsKQEAgLTYwLDcgKzYzLDExIEBACiAKICAgICB2b2lkICptQ3R4OwogICAgIGJvb2wgbUZyYW1lUGFyYWxsZWxNb2RlOyAgLy8gRnJhbWUgcGFyYWxsZWwgaXMgb25seSBzdXBwb3J0ZWQgYnkgVlA5IGRlY29kZXIuCi0gICAgT01YX1RJQ0tTIG1UaW1lU3RhbXBzW2tOdW1CdWZmZXJzXTsKKyAgICBzdHJ1Y3QgUHJpdkluZm8geworICAgICAgICBPTVhfVElDS1MgbVRpbWVTdGFtcDsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gbUhkcjEwUGx1c0luZm87CisgICAgfTsKKyAgICBQcml2SW5mbyBtUHJpdkluZm9ba051bUJ1ZmZlcnNdOwogICAgIHVpbnQ4X3QgbVRpbWVTdGFtcElkeDsKICAgICB2cHhfaW1hZ2VfdCAqbUltZzsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL0FuZHJvaWQuYnAKaW5kZXggM2Q5ZmVlYi4uY2Q2OWUwZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9BbmRyb2lkLmJwCkBAIC0xLDkgKzEsNiBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X3ZweGVuYyIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICB2bmRrOiB7Ci0gICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgfSwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJTb2Z0VlBYRW5jb2Rlci5jcHAiLApAQCAtMTEsMzMgKzgsMTcgQEAKICAgICAgICAgIlNvZnRWUDlFbmNvZGVyLmNwcCIsCiAgICAgXSwKIAotICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCisgICAgY2ZsYWdzOiBbIi1XYWxsIl0sCiAKICAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgXSwKLQogICAgIHNhbml0aXplOiB7CiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAogCi0gICAgc3RhdGljX2xpYnM6IFsibGlidnB4Il0sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCisgICAgc2hhcmVkX2xpYnM6IFsibGlidnB4Il0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlA4RW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQOEVuY29kZXIuaAppbmRleCBiNDkwNGJmLi5jNWMyYWJmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlA4RW5jb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUDhFbmNvZGVyLmgKQEAgLTIzLDggKzIzLDYgQEAKICNpbmNsdWRlIDxPTVhfVmlkZW9FeHQuaD4KICNpbmNsdWRlIDxPTVhfSW5kZXhFeHQuaD4KIAotI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KLQogI2luY2x1ZGUgInZweC92cHhfZW5jb2Rlci5oIgogI2luY2x1ZGUgInZweC92cHhfY29kZWMuaCIKICNpbmNsdWRlICJ2cHgvdnA4Y3guaCIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUDlFbmNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlA5RW5jb2Rlci5oCmluZGV4IDg1ZGY2OWEuLjMwOGE5YWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUDlFbmNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQOUVuY29kZXIuaApAQCAtMjMsOCArMjMsNiBAQAogI2luY2x1ZGUgPE9NWF9WaWRlb0V4dC5oPgogI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgogCi0jaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPgotCiAjaW5jbHVkZSAidnB4L3ZweF9lbmNvZGVyLmgiCiAjaW5jbHVkZSAidnB4L3ZweF9jb2RlYy5oIgogI2luY2x1ZGUgInZweC92cDhjeC5oIgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuY3BwCmluZGV4IGY2MjU3YjEuLmQwY2IwNzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5jcHAKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlICJTb2Z0VlA4RW5jb2Rlci5oIgogI2luY2x1ZGUgIlNvZnRWUDlFbmNvZGVyLmgiCiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgogCkBAIC00MDAsOCArNDAxLDggQEAKICAgICB9CiB9CiAKLU9NWF9FUlJPUlRZUEUgU29mdFZQWEVuY29kZXI6OnNldENvbmZpZygKLSAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBfcGFyYW1zKSB7CitPTVhfRVJST1JUWVBFIFNvZnRWUFhFbmNvZGVyOjppbnRlcm5hbFNldENvbmZpZygKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBfcGFyYW1zLCBib29sICpmcmFtZUNvbmZpZykgewogICAgIHN3aXRjaCAoaW5kZXgpIHsKICAgICAgICAgY2FzZSBPTVhfSW5kZXhDb25maWdWaWRlb0ludHJhVk9QUmVmcmVzaDoKICAgICAgICAgewpAQCAtNDQxLDcgKzQ0Miw3IEBACiAgICAgICAgIH0KIAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OnNldENvbmZpZyhpbmRleCwgX3BhcmFtcyk7CisgICAgICAgICAgICByZXR1cm4gU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRDb25maWcoaW5kZXgsIF9wYXJhbXMsIGZyYW1lQ29uZmlnKTsKICAgICB9CiB9CiAKQEAgLTU1Nyw3ICs1NTgsNyBAQAogICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbldpdGhvdXREZXBlbmRlbmN5OgogICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOwotICAgICAgICAgICAgICAvLyBEZWxpYmVyYXRlbHkgbm8gYnJlYWsgaGVyZS4KKyAgICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVHb2xkZW46CiAgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfQVJGOwogICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKQEAgLTU2NiwxNCArNTY3LDE0IEBACiAgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVBbHRyZWZXaXRob3V0RGVwZW5kZW5jeToKICAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9BUkY7CiAgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7Ci0gICAgICAgICAgICAgIC8vIERlbGliZXJhdGVseSBubyBicmVhayBoZXJlLgorICAgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUFsdHJlZjoKICAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKICAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9MQVNUOwogICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkFsdHJlZjoKICAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9BUkY7Ci0gICAgICAgICAgICAgIC8vIERlbGliZXJhdGVseSBubyBicmVhayBoZXJlLgorICAgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZU5vbmU6CiAgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfR0Y7CiAgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmgKaW5kZXggZGQ4NmQzNi4uNzIwOGQ2OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5oCkBAIC0yMyw4ICsyMyw2IEBACiAjaW5jbHVkZSA8T01YX1ZpZGVvRXh0Lmg+CiAjaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+CiAKLSNpbmNsdWRlIDxoYXJkd2FyZS9ncmFsbG9jLmg+Ci0KICNpbmNsdWRlICJ2cHgvdnB4X2VuY29kZXIuaCIKICNpbmNsdWRlICJ2cHgvdnB4X2NvZGVjLmgiCiAjaW5jbHVkZSAidnB4L3ZwOGN4LmgiCkBAIC04NCw4ICs4Miw4IEBACiAgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0UGFyYW1ldGVyKAogICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbSk7CiAKLSAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgc2V0Q29uZmlnKAotICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpOworICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zLCBib29sICpmcmFtZUNvbmZpZyk7CiAKICAgICAvLyBPTVggY2FsbGJhY2sgd2hlbiBidWZmZXJzIGF2YWlsYWJsZQogICAgIC8vIE5vdGUgdGhhdCBib3RoIGFuIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ0YzI5Ni4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc3ViZGlycyA9IFsiKiJdCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9BbmRyb2lkLmJwCmluZGV4IDQzMzE4ZjIuLjcxYTJhMGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9BbmRyb2lkLmJwCkBAIC0xLDI3ICsxLDEzIEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfb3B1c2RlYyIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICB2bmRrOiB7Ci0gICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgfSwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCiAKICAgICBzcmNzOiBbIlNvZnRPcHVzLmNwcCJdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAotCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYm9wdXMiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlibG9nIiwKICAgICBdLAogCi0gICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKLQogICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAogCiAgICAgc2FuaXRpemU6IHsKQEAgLTMwLDkgKzE2LDUgQEAKICAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAKaW5kZXggODEzMDA0Yi4uNGY2MWFhOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwCkBAIC00MzAsOCArNDMwLDE3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoc2l6ZSA8IHNpemVvZihpbnQ2NF90KSkgeworICAgICAgICAgICAgICAgIC8vIFRoZSAybmQgYW5kIDNyZCBpbnB1dCBidWZmZXIgYXJlIGV4cGVjdGVkIHRvIGNvbnRhaW4KKyAgICAgICAgICAgICAgICAvLyAgYW4gaW50NjRfdCAoc2VlIGJlbG93KSwgc28gbWFrZSBzdXJlIHdlIGdldCBhdCBsZWFzdAorICAgICAgICAgICAgICAgIC8vICB0aGF0IG11Y2guIFRoZSBmaXJzdCBpbnB1dCBidWZmZXIgbXVzdCBjb250YWluIDE5IGJ5dGVzLAorICAgICAgICAgICAgICAgIC8vICBidXQgdGhhdCBpcyBjaGVja2VkIGFscmVhZHkuCisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDApIHsKLSAgICAgICAgICAgICAgICBDSEVDSyhtSGVhZGVyID09IE5VTEwpOworICAgICAgICAgICAgICAgIGRlbGV0ZSBtSGVhZGVyOwogICAgICAgICAgICAgICAgIG1IZWFkZXIgPSBuZXcgT3B1c0hlYWRlcigpOwogICAgICAgICAgICAgICAgIG1lbXNldChtSGVhZGVyLCAwLCBzaXplb2YoKm1IZWFkZXIpKTsKICAgICAgICAgICAgICAgICBpZiAoIVBhcnNlT3B1c0hlYWRlcihkYXRhLCBzaXplLCBtSGVhZGVyKSkgewpAQCAtNDUyLDYgKzQ2MSw5IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaW50IHN0YXR1cyA9IE9QVVNfSU5WQUxJRF9TVEFURTsKKyAgICAgICAgICAgICAgICBpZiAobURlY29kZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfZGVzdHJveShtRGVjb2Rlcik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1EZWNvZGVyID0gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2NyZWF0ZShrUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+Y2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPm51bV9zdHJlYW1zLApAQCAtNTcwLDcgKzU4Miw3IEBACiAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IG51bUZyYW1lcyAqIHNpemVvZihpbnQxNl90KSAqIG1IZWFkZXItPmNoYW5uZWxzOwogCiAgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IG1BbmNob3JUaW1lVXMgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobU51bUZyYW1lc091dHB1dCAqIDEwMDAwMDBsbCkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobU51bUZyYW1lc091dHB1dCAqIDEwMDAwMDBMTCkgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmF0ZTsKIAogICAgICAgICBtTnVtRnJhbWVzT3V0cHV0ICs9IG51bUZyYW1lczsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvQW5kcm9pZC5icAppbmRleCBjOGQ3ZDAwLi5mY2M3YTBhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9BbmRyb2lkLmJwCkBAIC0xLDE5ICsxLDkgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9yYXdkZWMiLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgdm5kazogewotICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgIH0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLAogCiAgICAgc3JjczogWyJTb2Z0UmF3LmNwcCJdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAotCi0gICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKLQogICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAogCiAgICAgc2FuaXRpemU6IHsKQEAgLTIyLDE2ICsxMiw1IEBACiAgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L1NvZnRSYXcuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9Tb2Z0UmF3LmNwcAppbmRleCAxYTUyN2IzLi4wZTMxODA0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L1NvZnRSYXcuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvU29mdFJhdy5jcHAKQEAgLTYwLDcgKzYwLDcgQEAKICAgICBkZWYuZURpciA9IE9NWF9EaXJJbnB1dDsKICAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7CiAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47Ci0gICAgZGVmLm5CdWZmZXJTaXplID0gNjQgKiAxMDI0OworICAgIGRlZi5uQnVmZmVyU2l6ZSA9IDE5MiAqIDEwMjQ7CiAgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CiAgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CiAgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpbkF1ZGlvOwpAQCAtNzgsNyArNzgsNyBAQAogICAgIGRlZi5lRGlyID0gT01YX0Rpck91dHB1dDsKICAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7CiAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47Ci0gICAgZGVmLm5CdWZmZXJTaXplID0gNjQgKiAxMDI0OworICAgIGRlZi5uQnVmZmVyU2l6ZSA9IDE5MiAqIDEwMjQ7CiAgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CiAgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CiAgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpbkF1ZGlvOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDRjMjk2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXN1YmRpcnMgPSBbIioiXQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL0FuZHJvaWQuYnAKaW5kZXggYTkyNjVjYi4uM2VmYjk1MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9BbmRyb2lkLmJwCkBAIC0xLDI3ICsxLDEzIEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfdm9yYmlzZGVjIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKIAogICAgIHNyY3M6IFsiU29mdFZvcmJpcy5jcHAiXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgXSwKLQogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJ2b3JiaXNpZGVjIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKIAotICAgIGNmbGFnczogWyItV2Vycm9yIl0sCi0KICAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKIAogICAgIHNhbml0aXplOiB7CkBAIC0zMCw1ICsxNiw0IEBACiAgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgfSwKLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvU29mdFZvcmJpcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmNwcAppbmRleCA4OTEyZjhhLi43NmE0MDBjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmNwcApAQCAtMzU3LDcgKzM1NywxMCBAQAogICAgICAgICBpbnQzMl90IG51bVBhZ2VTYW1wbGVzID0gMDsKIAogICAgICAgICBpZiAoaW5IZWFkZXIpIHsKLSAgICAgICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA8IDIpIHsKKyAgICAgICAgICAgIC8vIEFzc3VtZSB0aGUgdmVyeSBmaXJzdCAyIGJ1ZmZlcnMgYXJlIGFsd2F5cyBjb2RlYyBjb25maWcgKGluIHRoaXMgY2FzZSBtU3RhdGUgaXMgTlVMTCkKKyAgICAgICAgICAgIC8vIEFmdGVyIGZsdXNoLCBoYW5kbGUgQ1NECisgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPCAyICYmCisgICAgICAgICAgICAgICAgICAgIChtU3RhdGUgPT0gTlVMTCB8fCAoaW5IZWFkZXItPm5GbGFncyAmIE9NWF9CVUZGRVJGTEFHX0NPREVDQ09ORklHKSkpIHsKICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOwogCkBAIC0zODAsNyArMzgzLDI0IEBACiAKICAgICAgICAgICAgICAgICBtYWtlQml0UmVhZGVyKChjb25zdCB1aW50OF90ICopZGF0YSArIDcsIHNpemUgLSA3LCAmYnVmLCAmcmVmLCAmYml0cyk7CiAKLSAgICAgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIEFzc3VtZSB2ZXJ5IGZpcnN0IGZyYW1lIGlzIGlkZW50aWZpY2F0aW9uIGhlYWRlciAtIG9yIHJlc2V0IGlkZW50aWZpY2F0aW9uCisgICAgICAgICAgICAgICAgLy8gaGVhZGVyIGFmdGVyIGZsdXNoLCBidXQgYWxsb3cgb25seSBzcGVjaWZ5aW5nIHNldHVwIGhlYWRlciBhZnRlciBmbHVzaCBpZgorICAgICAgICAgICAgICAgIC8vIGlkZW50aWZpY2F0aW9uIGhlYWRlciB3YXMgYWxyZWFkeSBzZXQgdXAuCisgICAgICAgICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChtVmkgPT0gTlVMTCB8fCBkYXRhWzBdID09IDEgLyogaWRlbnRpZmljYXRpb24gaGVhZGVyICovKSkgeworICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgYW55IHByaW9yIHN0YXRlCisgICAgICAgICAgICAgICAgICAgIGlmIChtVmkgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxzbyBjbGVhciBtU3RhdGUgYXMgaXQgbWF5IHJlZmVyIHRvIHRoZSBvbGQgbVZpCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b3JiaXNfZHNwX2NsZWFyKG1TdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1TdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdm9yYmlzX2luZm9fY2xlYXIobVZpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtVmk7CisgICAgICAgICAgICAgICAgICAgICAgICBtVmkgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobVZpID09IE5VTEwpOwogICAgICAgICAgICAgICAgICAgICBtVmkgPSBuZXcgdm9yYmlzX2luZm87CiAgICAgICAgICAgICAgICAgICAgIHZvcmJpc19pbmZvX2luaXQobVZpKTsKQEAgLTM5Miw4ICs0MTIsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBhbnkgcHJpb3Igc3RhdGUKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2b3JiaXNfZHNwX2NsZWFyKG1TdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgbVN0YXRlOworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgIGludCByZXQgPSBfdm9yYmlzX3VucGFja19ib29rcyhtVmksICZiaXRzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gMCB8fCBtU3RhdGUgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIHJldCwgTlVMTCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwpAQCAtNDA5LDYgKzQzNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50UG9ydFNldHRpbmdzQ2hhbmdlZCwgMSwgMCwgTlVMTCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gQVdBSVRJTkdfRElTQUJMRUQ7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyQ291bnQgPSAxOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChpbkhlYWRlci0+bkZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSB7CkBAIC01MjYsNyArNTU0LDcgQEAKIAogICAgICAgICBvdXRIZWFkZXItPm5UaW1lU3RhbXAgPQogICAgICAgICAgICAgbUFuY2hvclRpbWVVcwotICAgICAgICAgICAgICAgICsgKG1OdW1GcmFtZXNPdXRwdXQgKiAxMDAwMDAwbGwpIC8gbVZpLT5yYXRlOworICAgICAgICAgICAgICAgICsgKG1OdW1GcmFtZXNPdXRwdXQgKiAxMDAwMDAwTEwpIC8gbVZpLT5yYXRlOwogCiAgICAgICAgIG1OdW1GcmFtZXNPdXRwdXQgKz0gbnVtRnJhbWVzOwogCkBAIC01NDgsNiArNTc2LDcgQEAKICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIG5leHQgYnVmZmVyIG91dHB1dCBkb2VzIG5vdCBzdGlsbAogICAgICAgICAvLyBkZXBlbmQgb24gZnJhZ21lbnRzIGZyb20gdGhlIGxhc3Qgb25lIGRlY29kZWQuCiAKKyAgICAgICAgbUlucHV0QnVmZmVyQ291bnQgPSAwOwogICAgICAgICBtTnVtRnJhbWVzT3V0cHV0ID0gMDsKICAgICAgICAgbVNhd0lucHV0RW9zID0gZmFsc2U7CiAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9BbmRyb2lkLmJwCmluZGV4IDczOTJmMWUuLjUzODVkYmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvQW5kcm9pZC5icApAQCAtMSwxOCArMSwxMiBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X3hhYWNkZWMiLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLAogCiAgICAgc3JjczogWwogICAgICAgICAiU29mdFhBQUMuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAotCiAgICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1ERU5BQkxFX01QRUdfRF9EUkMiCiAgICAgXSwKIApAQCAtMjUsMTIgKzE5LDYgQEAKICAgICBzdGF0aWNfbGliczogWyJsaWJ4YWFjZGVjIl0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKLQotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9Tb2Z0WEFBQy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9Tb2Z0WEFBQy5jcHAKaW5kZXggMDZiMTViMy4uZGE4Njc1OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvU29mdFhBQUMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL1NvZnRYQUFDLmNwcApAQCAtNzksNyArNzksNyBAQAogCiBzdGF0aWMgY29uc3QgT01YX1UzMiBrU3VwcG9ydGVkUHJvZmlsZXNbXSA9IHsKICAgICBPTVhfQVVESU9fQUFDT2JqZWN0TEMsIE9NWF9BVURJT19BQUNPYmplY3RIRSwgIE9NWF9BVURJT19BQUNPYmplY3RIRV9QUywKLSAgICBPTVhfQVVESU9fQUFDT2JqZWN0TEQsIE9NWF9BVURJT19BQUNPYmplY3RFTEQsCisgICAgT01YX0FVRElPX0FBQ09iamVjdExELCBPTVhfQVVESU9fQUFDT2JqZWN0RUxELCBPTVhfQVVESU9fQUFDT2JqZWN0WEhFCiB9OwogCiBTb2Z0WEFBQzo6U29mdFhBQUMoY29uc3QgY2hhciogbmFtZSwgY29uc3QgT01YX0NBTExCQUNLVFlQRSogY2FsbGJhY2tzLCBPTVhfUFRSIGFwcERhdGEsCkBAIC0xMTAsMTUgKzExMCwyMiBAQAogCiB7CiAgICAgaW5pdFBvcnRzKCk7Ci0gICAgQ0hFQ0tfRVEoaW5pdERlY29kZXIoKSwgKHN0YXR1c190KU9LKTsKKyAgICBtTWVtb3J5VmVjLmNsZWFyKCk7CisgICAgbURyY01lbW9yeVZlYy5jbGVhcigpOworCisgICAgQ0hFQ0tfRVEoaW5pdERlY29kZXIoKSwgSUFfTk9fRVJST1IpOwogfQogCiBTb2Z0WEFBQzo6flNvZnRYQUFDKCkgewotICAgIGludCBlcnJDb2RlID0gZGVJbml0WEFBQ0RlY29kZXIoKTsKLSAgICBpZiAoMCAhPSBlcnJDb2RlKSB7Ci0gICAgICAgIEFMT0dFKCJkZUluaXRYQUFDRGVjb2RlcigpIGZhaWxlZCAlZCIsIGVyckNvZGUpOworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IGRlSW5pdFhBQUNEZWNvZGVyKCk7CisgICAgaWYgKElBX05PX0VSUk9SICE9IGVycl9jb2RlKSB7CisgICAgICAgIEFMT0dFKCJkZUluaXRYQUFDRGVjb2RlcigpIGZhaWxlZCAlZCIsIGVycl9jb2RlKTsKICAgICB9CiAKKyAgICBlcnJfY29kZSA9IGRlSW5pdE1QRUdERERyYygpOworICAgIGlmIChJQV9OT19FUlJPUiAhPSBlcnJfY29kZSkgeworICAgICAgICBBTE9HRSgiZGVJbml0TVBFR0RERHJjKCkgZmFpbGVkICVkIiwgZXJyX2NvZGUpOworICAgIH0KICAgICBtSXNDb2RlY0luaXRpYWxpemVkID0gZmFsc2U7CiAgICAgbUlzQ29kZWNDb25maWdGbHVzaFJlcXVpcmVkID0gZmFsc2U7CiB9CkBAIC0xNjQsMzYgKzE3MSwxNiBAQAogICAgIGFkZFBvcnQoZGVmKTsKIH0KIAotc3RhdHVzX3QgU29mdFhBQUM6OmluaXREZWNvZGVyKCkgewotICAgIHN0YXR1c190IHN0YXR1cyA9IFVOS05PV05fRVJST1I7Ci0KK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6aW5pdERlY29kZXIoKSB7CiAgICAgaW50IHVpX2RyY192YWw7CiAgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CiAgICAgaW50IGxvb3AgPSAwOwogCiAgICAgZXJyX2NvZGUgPSBpbml0WEFBQ0RlY29kZXIoKTsKICAgICBpZiAoZXJyX2NvZGUgIT0gSUFfTk9fRVJST1IpIHsKLSAgICAgICAgaWYgKE5VTEwgPT0gbVhoZWFhY0NvZGVjSGFuZGxlKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQUFDIGRlY29kZXIgaGFuZGxlIGlzIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoTlVMTCA9PSBtTXBlZ0REcmNIYW5kbGUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJNUEVHLUQgRFJDIGRlY29kZXIgaGFuZGxlIGlzIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGxvb3AgPSAxOyBsb29wIDwgbU1hbGxvY0NvdW50OyBsb29wKyspIHsKLSAgICAgICAgICAgIGlmIChtTWVtb3J5QXJyYXlbbG9vcF0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIgbWVtb3J5IGFsbG9jYXRpb24gZXJyb3IgJWRcbiIsIGxvb3ApOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEFMT0dFKCJpbml0WEFBQ0RlY29kZXIgRmFpbGVkIik7Ci0KLSAgICAgICAgZm9yIChsb29wID0gMDsgbG9vcCA8IG1NYWxsb2NDb3VudDsgbG9vcCsrKSB7Ci0gICAgICAgICAgICBpZiAobU1lbW9yeUFycmF5W2xvb3BdKSBmcmVlKG1NZW1vcnlBcnJheVtsb29wXSk7Ci0gICAgICAgIH0KLSAgICAgICAgbU1hbGxvY0NvdW50ID0gMDsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9IGVsc2UgewotICAgICAgICBzdGF0dXMgPSBPSzsKKyAgICAgICAgQUxPR0UoImluaXRYQUFDRGVjb2RlciBmYWlsZWQgd2l0aCBlcnJvciAlZCIsIGVycl9jb2RlKTsKKyAgICAgICAgZGVJbml0WEFBQ0RlY29kZXIoKTsKKyAgICAgICAgcmV0dXJuIGVycl9jb2RlOwogICAgIH0KIAogICAgIG1FbmRPZklucHV0ID0gZmFsc2U7CkBAIC0yNzQsNyArMjYxLDcgQEAKICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19EUkNfRUZGRUNUX1RZUEUiKTsKIAogI2VuZGlmCi0gICAgcmV0dXJuIHN0YXR1czsKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7CiB9CiAKIE9NWF9FUlJPUlRZUEUgU29mdFhBQUM6OmludGVybmFsR2V0UGFyYW1ldGVyKE9NWF9JTkRFWFRZUEUgaW5kZXgsIE9NWF9QVFIgcGFyYW1zKSB7CkBAIC01NDcsOSArNTM0LDYgQEAKICAgICAvKiBzYW1wbGUgY3VycmVudGx5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgIGlmIChtSXNDb2RlY0luaXRpYWxpemVkKSB7CiAgICAgICAgIG51bU91dEJ5dGVzID0gbU91dHB1dEZyYW1lTGVuZ3RoICogKG1QY21XZFN6IC8gOCkgKiBtTnVtQ2hhbm5lbHM7Ci0gICAgICAgIGlmICgobVBjbVdkU3ogLyA4KSAhPSAyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiWEFBQyBhc3N1bWVzIDIgYnl0ZXMgcGVyIHNhbXBsZSEgbVBjbVdkU3ogJWQiLCBtUGNtV2RTeik7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICB3aGlsZSAoKCFpblF1ZXVlLmVtcHR5KCkgfHwgbUVuZE9mSW5wdXQpICYmICFvdXRRdWV1ZS5lbXB0eSgpKSB7CkBAIC01NjksOCArNTUzLDggQEAKICAgICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aCA9IGluSGVhZGVyLT5uRmlsbGVkTGVuOwogCiAgICAgICAgICAgICAgICAgLyogR0EgaGVhZGVyIGNvbmZpZ3VyYXRpb24gc2VudCB0byBEZWNvZGVyISAqLwotICAgICAgICAgICAgICAgIGludCBlcnJfY29kZSA9IGNvbmZpZ1hBQUNEZWNvZGVyKGluQnVmZmVyLCBpbkJ1ZmZlckxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgaWYgKDAgIT0gZXJyX2NvZGUpIHsKKyAgICAgICAgICAgICAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBjb25maWdYQUFDRGVjb2RlcihpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgpOworICAgICAgICAgICAgICAgIGlmIChJQV9OT19FUlJPUiAhPSBlcnJfY29kZSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiY29uZmlnWEFBQ0RlY29kZXIgZXJyX2NvZGUgPSAlZCIsIGVycl9jb2RlKTsKICAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIGVycl9jb2RlLCBOVUxMKTsKQEAgLTY2NSw3ICs2NDksNyBAQAogICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRpbWVzdGFtcCA9IGluSGVhZGVyLT5uVGltZVN0YW1wOwogICAgICAgICAgICAgICAgICAgICBtTGFzdEluSGVhZGVyID0gaW5IZWFkZXI7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUaW1lc3RhbXAgPSBtUHJldlRpbWVzdGFtcCArIG1PdXRwdXRGcmFtZUxlbmd0aCAqIDEwMDAwMDBsbCAvIG1TYW1wRnJlcTsKKyAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUaW1lc3RhbXAgPSBtUHJldlRpbWVzdGFtcCArIG1PdXRwdXRGcmFtZUxlbmd0aCAqIDEwMDAwMDBMTCAvIG1TYW1wRnJlcTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGluQnVmZmVyID0gaW5IZWFkZXItPnBCdWZmZXIgKyBpbkhlYWRlci0+bk9mZnNldDsKQEAgLTY4Miw4ICs2NjYsOCBAQAogICAgICAgICAgICAgLyogd2hpY2ggc2hvdWxkIGluaXRpYWxpemUgdGhlIGNvZGVjLiBPbmNlIHRoaXMgc3RhdGUgaXMgcmVhY2hlZCwgY2FsbCB0aGUgICovCiAgICAgICAgICAgICAvKiBkZWNvZGVYQUFDU3RyZWFtIEFQSSB3aXRoIHNhbWUgZnJhbWUgdG8gZGVjb2RlISAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICBpZiAoIW1Jc0NvZGVjSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgICAgICBpbnQgZXJyX2NvZGUgPSBjb25maWdYQUFDRGVjb2RlcihpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgpOwotICAgICAgICAgICAgICAgIGlmICgwICE9IGVycl9jb2RlKSB7CisgICAgICAgICAgICAgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gY29uZmlnWEFBQ0RlY29kZXIoaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoSUFfTk9fRVJST1IgIT0gZXJyX2NvZGUpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNvbmZpZ1hBQUNEZWNvZGVyIEZhaWxlZCAyIGVycl9jb2RlID0gJWQiLCBlcnJfY29kZSk7CiAgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCBlcnJfY29kZSwgTlVMTCk7CkBAIC04NDUsNyArODI5LDcgQEAKICAgICB9CiB9CiAKLWludCBTb2Z0WEFBQzo6Y29uZmlnZmx1c2hEZWNvZGUoKSB7CitJQV9FUlJPUkNPREUgU29mdFhBQUM6OmNvbmZpZ2ZsdXNoRGVjb2RlKCkgewogICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZTsKICAgICBVV09SRDMyIHVpX2luaXRfZG9uZTsKICAgICB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCA9IDgyMDM7CkBAIC04NzEsMTYgKzg1NSwxMyBAQAogICAgICAgICAgICAgIkZvdW5kIENvZGVjIHdpdGggYmVsb3cgY29uZmlnLS0tXG5zYW1wRnJlcSAlZFxubnVtQ2hhbm5lbHMgJWRcbnBjbVdkU3ogIgogICAgICAgICAgICAgIiVkXG5jaGFubmVsTWFzayAlZFxub3V0cHV0RnJhbWVMZW5ndGggJWQiLAogICAgICAgICAgICAgbVNhbXBGcmVxLCBtTnVtQ2hhbm5lbHMsIG1QY21XZFN6LCBtQ2hhbm5lbE1hc2ssIG1PdXRwdXRGcmFtZUxlbmd0aCk7Ci0gICAgICAgIGlmIChtTnVtQ2hhbm5lbHMgPiBNQVhfQ0hBTk5FTF9DT1VOVCkgewotICAgICAgICAgICAgQUxPR0UoIiBObyBvZiBjaGFubmVscyBhcmUgbW9yZSB0aGFuIG1heCBjaGFubmVsc1xuIik7Ci0gICAgICAgICAgICBtSXNDb2RlY0luaXRpYWxpemVkID0gZmFsc2U7Ci0gICAgICAgIH0gZWxzZQotICAgICAgICAgICAgbUlzQ29kZWNJbml0aWFsaXplZCA9IHRydWU7CisKKyAgICAgICAgbUlzQ29kZWNJbml0aWFsaXplZCA9IHRydWU7CiAgICAgfQotICAgIHJldHVybiBlcnJfY29kZTsKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7CiB9Ci1pbnQgU29mdFhBQUM6OmRyYWluRGVjb2RlcigpIHsKLSAgICByZXR1cm4gMDsKK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6ZHJhaW5EZWNvZGVyKCkgeworICAgIHJldHVybiBJQV9OT19FUlJPUjsKIH0KIAogdm9pZCBTb2Z0WEFBQzo6b25SZXNldCgpIHsKQEAgLTkyMSw3ICs5MDIsNyBAQAogICAgIH0KIH0KIAotaW50IFNvZnRYQUFDOjppbml0WEFBQ0RlY29kZXIoKSB7CitJQV9FUlJPUkNPREUgU29mdFhBQUM6OmluaXRYQUFDRGVjb2RlcigpIHsKICAgICBMT09QSURYIGk7CiAKICAgICAvKiBFcnJvciBjb2RlICovCkBAIC05MzksMTEgKzkyMCwxMSBAQAogICAgIFVXT1JEMzIgdWlfcHJvY19tZW1fdGFic19zaXplOwogICAgIC8qIEFQSSBzaXplICovCiAgICAgVVdPUkQzMiBwdWlfYXBpX3NpemU7CisgICAgcFZPSUQgcHZfYWxsb2NfcHRyOwogCiAgICAgbUlucHV0QnVmZmVyU2l6ZSA9IDA7CiAgICAgbUlucHV0QnVmZmVyID0gMDsKICAgICBtT3V0cHV0QnVmZmVyID0gMDsKLSAgICBtTWFsbG9jQ291bnQgPSAwOwogCiAgICAgLyogUHJvY2VzcyBzdHJ1Y3QgaW5pdGluZyBlbmQgKi8KICAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC05NTQsMjAgKzkzNSwxMyBAQAogICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShOVUxMLCBJQV9BUElfQ01EX0dFVF9BUElfU0laRSwgMCwgJnB1aV9hcGlfc2l6ZSk7CiAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfQVBJX1NJWkUiKTsKIAotICAgIGlmIChtTWFsbG9jQ291bnQgPT0gTUFYX01FTV9BTExPQ1MpIHsKLSAgICAgICAgQUxPR0UoIm1NZW1vcnlBcnJheSBpcyBmdWxsIik7Ci0gICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKLSAgICB9Ci0KICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIEFQSSAqLwotICAgIG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID0gbWVtYWxpZ24oNCwgcHVpX2FwaV9zaXplKTsKLSAgICBpZiAobU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPT0gTlVMTCkgeworICAgIG1YaGVhYWNDb2RlY0hhbmRsZSA9IG1lbWFsaWduKDQsIHB1aV9hcGlfc2l6ZSk7CisgICAgaWYgKG1YaGVhYWNDb2RlY0hhbmRsZSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJtYWxsb2MgZm9yIHB1aV9hcGlfc2l6ZSArIDQgPj4gJWQgRmFpbGVkIiwgcHVpX2FwaV9zaXplICsgNCk7CiAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKICAgICB9Ci0gICAgLyogU2V0IEFQSSBvYmplY3Qgd2l0aCB0aGUgbWVtb3J5IGFsbG9jYXRlZCAqLwotICAgIG1YaGVhYWNDb2RlY0hhbmRsZSA9IChwVk9JRCkoKFdPUkQ4KiltTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSk7Ci0gICAgbU1hbGxvY0NvdW50Kys7CisgICAgbU1lbW9yeVZlYy5wdXNoKG1YaGVhYWNDb2RlY0hhbmRsZSk7CiAKICAgICAvKiBTZXQgdGhlIGNvbmZpZyBwYXJhbXMgdG8gZGVmYXVsdCB2YWx1ZXMgKi8KICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0lOSVQsCkBAIC05NzksMjMgKzk1MywxNiBAQAogCiAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfQVBJX1NJWkUiKTsKIAotICAgIGlmIChtTWFsbG9jQ291bnQgPT0gTUFYX01FTV9BTExPQ1MpIHsKLSAgICAgICAgQUxPR0UoIm1NZW1vcnlBcnJheSBpcyBmdWxsIik7Ci0gICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKLSAgICB9Ci0KICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIEFQSSAqLwotICAgIG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID0gbWVtYWxpZ24oNCwgcHVpX2FwaV9zaXplKTsKKyAgICBtTXBlZ0REcmNIYW5kbGUgPSBtZW1hbGlnbig0LCBwdWlfYXBpX3NpemUpOwogCi0gICAgaWYgKG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID09IE5VTEwpIHsKKyAgICBpZiAobU1wZWdERHJjSGFuZGxlID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIm1hbGxvYyBmb3IgZHJjIGFwaSBzdHJ1Y3R1cmUgRmFpbGVkIik7CiAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKICAgICB9Ci0gICAgbWVtc2V0KG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdLCAwLCBwdWlfYXBpX3NpemUpOworICAgIG1NZW1vcnlWZWMucHVzaChtTXBlZ0REcmNIYW5kbGUpOwogCi0gICAgLyogU2V0IEFQSSBvYmplY3Qgd2l0aCB0aGUgbWVtb3J5IGFsbG9jYXRlZCAqLwotICAgIG1NcGVnRERyY0hhbmRsZSA9IChwVk9JRCkoKFdPUkQ4KiltTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSk7Ci0gICAgbU1hbGxvY0NvdW50Kys7CisgICAgbWVtc2V0KG1NcGVnRERyY0hhbmRsZSwgMCwgcHVpX2FwaV9zaXplKTsKIAogICAgIC8qIFNldCB0aGUgY29uZmlnIHBhcmFtcyB0byBkZWZhdWx0IHZhbHVlcyAqLwogICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0lOSVQsCkBAIC0xMDIxLDIzICs5ODgsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7CiAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNVEFCU19TSVpFIik7CiAKLSAgICBpZiAobU1hbGxvY0NvdW50ID09IE1BWF9NRU1fQUxMT0NTKSB7Ci0gICAgICAgIEFMT0dFKCJtTWVtb3J5QXJyYXkgaXMgZnVsbCIpOwotICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7Ci0gICAgfQotCi0gICAgbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPSBtZW1hbGlnbig0LCB1aV9wcm9jX21lbV90YWJzX3NpemUpOwotICAgIGlmIChtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9PSBOVUxMKSB7CisgICAgcHZfYWxsb2NfcHRyID0gbWVtYWxpZ24oNCwgdWlfcHJvY19tZW1fdGFic19zaXplKTsKKyAgICBpZiAocHZfYWxsb2NfcHRyID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIk1hbGxvYyBmb3Igc2l6ZSAodWlfcHJvY19tZW1fdGFic19zaXplICsgNCkgPSAlZCBmYWlsZWQhIiwKICAgICAgICAgICAgICAgdWlfcHJvY19tZW1fdGFic19zaXplICsgNCk7CiAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKICAgICB9Ci0gICAgbU1hbGxvY0NvdW50Kys7Ci0gICAgLyogU2V0IHBvaW50ZXIgZm9yIHByb2Nlc3MgbWVtb3J5IHRhYmxlcyAgICAqLwotICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTVRBQlNfUFRSLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocFZPSUQpKChXT1JEOCopbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudCAtIDFdKSk7Ci0gICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNVEFCU19QVFIiKTsKKyAgICBtTWVtb3J5VmVjLnB1c2gocHZfYWxsb2NfcHRyKTsKIAorICAgIC8qIFNldCBwb2ludGVyIGZvciBwcm9jZXNzIG1lbW9yeSB0YWJsZXMgICAgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1UQUJTX1BUUiwgMCwgcHZfYWxsb2NfcHRyKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1UQUJTX1BUUiIpOwogCiAgICAgLyogaW5pdGlhbGl6ZSB0aGUgQVBJLCBwb3N0IGNvbmZpZywgZmlsbCBtZW1vcnkgdGFibGVzICAqLwogICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKQEAgLTEwNjYsMTcgKzEwMjcsMTIgQEAKICAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fVFlQRSwgaSwgJnVpX3R5cGUpOwogICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFIik7CiAKLSAgICAgICAgaWYgKG1NYWxsb2NDb3VudCA9PSBNQVhfTUVNX0FMTE9DUykgewotICAgICAgICAgICAgQUxPR0UoIm1NZW1vcnlBcnJheSBpcyBmdWxsIik7Ci0gICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7Ci0gICAgICAgIH0KLSAgICAgICAgbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPSBtZW1hbGlnbih1aV9hbGlnbm1lbnQsIHVpX3NpemUpOwotICAgICAgICBpZiAobU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPT0gTlVMTCkgeworICAgICAgICBwdl9hbGxvY19wdHIgPSBtZW1hbGlnbih1aV9hbGlnbm1lbnQsIHVpX3NpemUpOworICAgICAgICBpZiAocHZfYWxsb2NfcHRyID09IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dFKCJNYWxsb2MgZm9yIHNpemUgKHVpX3NpemUgKyB1aV9hbGlnbm1lbnQpID0gJWQgZmFpbGVkISIsIHVpX3NpemUgKyB1aV9hbGlnbm1lbnQpOwogICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwogICAgICAgICB9Ci0gICAgICAgIHB2X2FsbG9jX3B0ciA9IChwVk9JRCkoKFdPUkQ4KiltTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSk7Ci0gICAgICAgIG1NYWxsb2NDb3VudCsrOworICAgICAgICBtTWVtb3J5VmVjLnB1c2gocHZfYWxsb2NfcHRyKTsKIAogICAgICAgICAvKiBTZXQgdGhlIGJ1ZmZlciBwb2ludGVyICovCiAgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTV9QVFIsIGksIHB2X2FsbG9jX3B0cik7CkBAIC0xMDk1LDcgKzEwNTEsNyBAQAogICAgIHJldHVybiBJQV9OT19FUlJPUjsKIH0KIAotaW50IFNvZnRYQUFDOjpjb25maWdYQUFDRGVjb2Rlcih1aW50OF90KiBpbkJ1ZmZlciwgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgpIHsKK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6Y29uZmlnWEFBQ0RlY29kZXIodWludDhfdCogaW5CdWZmZXIsIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoKSB7CiAgICAgVVdPUkQzMiB1aV9pbml0X2RvbmU7CiAgICAgaW50MzJfdCBpX2J5dGVzX2NvbnN1bWVkOwogCkBAIC0xMTU0LDE0ICsxMTEwLDc2IEBACiAKICAgICByZXR1cm4gSUFfTk9fRVJST1I7CiB9Ci1pbnQgU29mdFhBQUM6OmNvbmZpZ01QRUdERHJjKCkgeworSUFfRVJST1JDT0RFIFNvZnRYQUFDOjppbml0TVBFR0RERHJjKCkgeworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IElBX05PX0VSUk9SOworICAgIGludCBpOworCisgICAgZm9yIChpID0gMDsgaSA8IChXT1JEMzIpMjsgaSsrKSB7CisgICAgICAgIFdPUkQzMiB1aV9zaXplLCB1aV9hbGlnbm1lbnQsIHVpX3R5cGU7CisgICAgICAgIHBWT0lEIHB2X2FsbG9jX3B0cjsKKworICAgICAgICAvKiBHZXQgbWVtb3J5IHNpemUgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX1NJWkUsIGksICZ1aV9zaXplKTsKKworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19TSVpFIik7CisKKyAgICAgICAgLyogR2V0IG1lbW9yeSBhbGlnbm1lbnQgKi8KKyAgICAgICAgZXJyX2NvZGUgPQorICAgICAgICAgICAgaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19BTElHTk1FTlQsIGksICZ1aV9hbGlnbm1lbnQpOworCisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX0FMSUdOTUVOVCIpOworCisgICAgICAgIC8qIEdldCBtZW1vcnkgdHlwZSAqLworICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fVFlQRSwgaSwgJnVpX3R5cGUpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFIik7CisKKyAgICAgICAgcHZfYWxsb2NfcHRyID0gbWVtYWxpZ24oNCwgdWlfc2l6ZSk7CisgICAgICAgIGlmIChwdl9hbGxvY19wdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIiBDYW5ub3QgY3JlYXRlIHJlcXVlc3RlZCBtZW1vcnkgICVkIiwgdWlfc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgbURyY01lbW9yeVZlYy5wdXNoKHB2X2FsbG9jX3B0cik7CisKKyAgICAgICAgLyogU2V0IHRoZSBidWZmZXIgcG9pbnRlciAqLworICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwgaSwgcHZfYWxsb2NfcHRyKTsKKworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1fUFRSIik7CisgICAgfQorCisgICAgV09SRDMyIHVpX3NpemU7CisgICAgdWlfc2l6ZSA9IDgxOTIgKiAyOworCisgICAgbURyY0luQnVmID0gKGludDhfdCopbWVtYWxpZ24oNCwgdWlfc2l6ZSk7CisgICAgaWYgKG1EcmNJbkJ1ZiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIgQ2Fubm90IGNyZWF0ZSByZXF1ZXN0ZWQgbWVtb3J5ICAlZCIsIHVpX3NpemUpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorICAgIG1EcmNNZW1vcnlWZWMucHVzaChtRHJjSW5CdWYpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTV9QVFIsIDIsIG1EcmNJbkJ1Zik7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiIpOworCisgICAgbURyY091dEJ1ZiA9IChpbnQ4X3QqKW1lbWFsaWduKDQsIHVpX3NpemUpOworICAgIGlmIChtRHJjT3V0QnVmID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiBDYW5ub3QgY3JlYXRlIHJlcXVlc3RlZCBtZW1vcnkgICVkIiwgdWlfc2l6ZSk7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisgICAgbURyY01lbW9yeVZlYy5wdXNoKG1EcmNPdXRCdWYpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTV9QVFIsIDMsIG1EcmNPdXRCdWYpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTV9QVFIiKTsKKworICAgIHJldHVybiBJQV9OT19FUlJPUjsKK30KK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6Y29uZmlnTVBFR0REcmMoKSB7CiAgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CiAgICAgaW50IGlfZWZmZWN0X3R5cGU7CiAgICAgaW50IGlfbG91ZF9ub3JtOwogICAgIGludCBpX3RhcmdldF9sb3VkbmVzczsKICAgICB1bnNpZ25lZCBpbnQgaV9zYnJfbW9kZTsKLSAgICBpbnQgbl9tZW1zOwogICAgIGludCBpOworICAgIGludCB1aV9wcm9jX21lbV90YWJzX3NpemUgPSAwOworICAgIHBWT0lEIHB2X2FsbG9jX3B0ciA9IE5VTEw7CiAKICNpZmRlZiBFTkFCTEVfTVBFR19EX0RSQwogICAgIHsKQEAgLTEyMTIsODMgKzEyMzAsNDQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9TQlJfTU9ERSwgJmlfc2JyX21vZGUpOwogICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fU0JSX01PREUiKTsKIAorICAgICAgICAvKiBHZXQgbWVtb3J5IGluZm8gdGFibGVzIHNpemUgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfR0VUX01FTVRBQlNfU0laRSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfcHJvY19tZW1fdGFic19zaXplKTsKKworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1UQUJTX1NJWkUiKTsKKworICAgICAgICBwdl9hbGxvY19wdHIgPSBtZW1hbGlnbig0LCB1aV9wcm9jX21lbV90YWJzX3NpemUpOworCisgICAgICAgIGlmIChwdl9hbGxvY19wdHIgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBjcmVhdGUgcmVxdWVzdGVkIG1lbW9yeSAgJWQiLCB1aV9wcm9jX21lbV90YWJzX3NpemUpOworICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgbWVtc2V0KHB2X2FsbG9jX3B0ciwgMCwgdWlfcHJvY19tZW1fdGFic19zaXplKTsKKworICAgICAgICBtTWVtb3J5VmVjLnB1c2gocHZfYWxsb2NfcHRyKTsKKworICAgICAgICAvKiBTZXQgcG9pbnRlciBmb3IgcHJvY2VzcyBtZW1vcnkgdGFibGVzICovCisgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1UQUJTX1BUUiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdl9hbGxvY19wdHIpOworCisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTVRBQlNfUFRSIik7CisKICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfSU5JVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0FQSV9QT1NUX0NPTkZJR19QQVJBTVMsIE5VTEwpOwogCiAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0NNRF9UWVBFX0lOSVRfQVBJX1BPU1RfQ09ORklHX1BBUkFNUyIpOwogCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCAoV09SRDMyKTI7IGkrKykgewotICAgICAgICAgICAgV09SRDMyIHVpX3NpemUsIHVpX2FsaWdubWVudCwgdWlfdHlwZTsKLSAgICAgICAgICAgIHBWT0lEIHB2X2FsbG9jX3B0cjsKKyAgICAgICAgLyogRnJlZSBhbnkgbWVtb3J5IHRoYXQgaXMgYWxsb2NhdGVkIGZvciBNUEVHIEQgRHJjIHNvIGZhciAqLworICAgICAgICBkZUluaXRNUEVHREREcmMoKTsKIAotICAgICAgICAgICAgLyogR2V0IG1lbW9yeSBzaXplICovCi0gICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fU0laRSwgaSwgJnVpX3NpemUpOwotCi0gICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19TSVpFIik7Ci0KLSAgICAgICAgICAgIC8qIEdldCBtZW1vcnkgYWxpZ25tZW50ICovCi0gICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fQUxJR05NRU5ULCBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfYWxpZ25tZW50KTsKLQotICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fQUxJR05NRU5UIik7Ci0KLSAgICAgICAgICAgIC8qIEdldCBtZW1vcnkgdHlwZSAqLwotICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX1RZUEUsIGksICZ1aV90eXBlKTsKLSAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX1RZUEUiKTsKLSAgICAgICAgICAgIGlmIChtTWFsbG9jQ291bnQgPT0gTUFYX01FTV9BTExPQ1MpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgibU1lbW9yeUFycmF5IGlzIGZ1bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID0gbWVtYWxpZ24oNCwgdWlfc2l6ZSk7Ci0gICAgICAgICAgICBpZiAobU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIgQ2Fubm90IGNyZWF0ZSByZXF1ZXN0ZWQgbWVtb3J5ICAlZCIsIHVpX3NpemUpOwotICAgICAgICAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHB2X2FsbG9jX3B0ciA9IChwVk9JRCkoKFdPUkQ4KiltTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSk7Ci0gICAgICAgICAgICBtTWFsbG9jQ291bnQrKzsKLQotICAgICAgICAgICAgLyogU2V0IHRoZSBidWZmZXIgcG9pbnRlciAqLwotICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTV9QVFIsIGksIHB2X2FsbG9jX3B0cik7Ci0KLSAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTV9QVFIiKTsKKyAgICAgICAgZXJyX2NvZGUgPSBpbml0TVBFR0RERHJjKCk7CisgICAgICAgIGlmIChlcnJfY29kZSAhPSBJQV9OT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoImluaXRNUEVHREREcmMgZmFpbGVkIHdpdGggZXJyb3IgJWQiLCBlcnJfY29kZSk7CisgICAgICAgICAgICBkZUluaXRNUEVHREREcmMoKTsKKyAgICAgICAgICAgIHJldHVybiBlcnJfY29kZTsKICAgICAgICAgfQotICAgICAgICB7Ci0gICAgICAgICAgICBXT1JEMzIgdWlfc2l6ZTsKLSAgICAgICAgICAgIHVpX3NpemUgPSA4MTkyICogMjsKLSAgICAgICAgICAgIGlmIChtTWFsbG9jQ291bnQgPT0gTUFYX01FTV9BTExPQ1MpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgibU1lbW9yeUFycmF5IGlzIGZ1bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7Ci0gICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID0gbWVtYWxpZ24oNCwgdWlfc2l6ZSk7Ci0gICAgICAgICAgICBpZiAobU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIgQ2Fubm90IGNyZWF0ZSByZXF1ZXN0ZWQgbWVtb3J5ICAlZCIsIHVpX3NpemUpOwotICAgICAgICAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbURyY0luQnVmID0gKGludDhfdCopbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF07Ci0gICAgICAgICAgICBtTWFsbG9jQ291bnQrKzsKLSAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1fUFRSLCAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1PdXRwdXRCdWZmZXIqLyBtRHJjSW5CdWYpOwotICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiIpOwotCi0gICAgICAgICAgICBpZiAobU1hbGxvY0NvdW50ID09IE1BWF9NRU1fQUxMT0NTKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIm1NZW1vcnlBcnJheSBpcyBmdWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPSBtZW1hbGlnbig0LCB1aV9zaXplKTsKLSAgICAgICAgICAgIGlmIChtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiBDYW5ub3QgY3JlYXRlIHJlcXVlc3RlZCBtZW1vcnkgICVkIiwgdWlfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtRHJjT3V0QnVmID0gKGludDhfdCopbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF07Ci0gICAgICAgICAgICBtTWFsbG9jQ291bnQrKzsKLSAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1fUFRSLCAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1PdXRwdXRCdWZmZXIqLyBtRHJjT3V0QnVmKTsKLSAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTV9QVFIiKTsKLSAgICAgICAgfQogICAgICAgICAvKiBEUkMgYnVmZmVycwogICAgICAgICAgICAgYnVmWzBdIC0gY29udGFpbnMgZXh0ZW5zaW9uIGVsZW1lbnQgcGF5IGxvYWQgbG91ZG5lc3MgcmVsYXRlZAogICAgICAgICAgICAgYnVmWzFdIC0gY29udGFpbnMgZXh0ZW5zaW9uIGVsZW1lbnQgcGF5IGxvYWQqLwpAQCAtMTQyMywxMCArMTQwMiwxMCBAQAogICAgIH0KICNlbmRpZgogCi0gICAgcmV0dXJuIGVycl9jb2RlOworICAgIHJldHVybiBJQV9OT19FUlJPUjsKIH0KLWludCBTb2Z0WEFBQzo6ZGVjb2RlWEFBQ1N0cmVhbSh1aW50OF90KiBpbkJ1ZmZlciwgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgsIGludDMyX3QqIGJ5dGVzQ29uc3VtZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogb3V0Qnl0ZXMpIHsKK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6ZGVjb2RlWEFBQ1N0cmVhbSh1aW50OF90KiBpbkJ1ZmZlciwgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogYnl0ZXNDb25zdW1lZCwgaW50MzJfdCogb3V0Qnl0ZXMpIHsKICAgICBpZiAobUlucHV0QnVmZmVyU2l6ZSA8IGluQnVmZmVyTGVuZ3RoKSB7CiAgICAgICAgIEFMT0dFKCJDYW5ub3QgY29uZmlnIEFBQywgaW5wdXQgYnVmZmVyIHNpemUgJWQgPCBpbkJ1ZmZlckxlbmd0aCAlZCIsIG1JbnB1dEJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgIGluQnVmZmVyTGVuZ3RoKTsKQEAgLTE1MTYsMjQgKzE0OTUsMzMgQEAKICAgICAgICAgbWVtY3B5KG1PdXRwdXRCdWZmZXIsIG1EcmNPdXRCdWYsICpvdXRCeXRlcyk7CiAgICAgfQogI2VuZGlmCi0gICAgcmV0dXJuIGVycl9jb2RlOworICAgIHJldHVybiBJQV9OT19FUlJPUjsKIH0KIAotaW50IFNvZnRYQUFDOjpkZUluaXRYQUFDRGVjb2RlcigpIHsKK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6ZGVJbml0WEFBQ0RlY29kZXIoKSB7CiAgICAgQUxPR0koImRlSW5pdFhBQUNEZWNvZGVyIik7CiAKICAgICAvKiBUZWxsIHRoYXQgdGhlIGlucHV0IGlzIG92ZXIgaW4gdGhpcyBidWZmZXIgKi8KICAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9JTlBVVF9PVkVSLCAwLCBOVUxMKTsKLSAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0lOUFVUX09WRVIiKTsKIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbU1hbGxvY0NvdW50OyBpKyspIHsKLSAgICAgICAgaWYgKG1NZW1vcnlBcnJheVtpXSkgZnJlZShtTWVtb3J5QXJyYXlbaV0pOworICAgIC8qIElycmVzcGVjdGl2ZSBvZiBlcnJvciByZXR1cm5lZCBpbiBJQV9BUElfQ01EX0lOUFVUX09WRVIsIGZyZWUgYWxsb2NhdGVkIG1lbW9yeSAqLworICAgIGZvciAodm9pZCogYnVmIDogbU1lbW9yeVZlYykgeworICAgICAgICBmcmVlKGJ1Zik7CiAgICAgfQotICAgIG1NYWxsb2NDb3VudCA9IDA7Ci0KKyAgICBtTWVtb3J5VmVjLmNsZWFyKCk7CiAgICAgcmV0dXJuIGVycl9jb2RlOwogfQogCitJQV9FUlJPUkNPREUgU29mdFhBQUM6OmRlSW5pdE1QRUdERERyYygpIHsKKyAgICBBTE9HSSgiZGVJbml0TVBFR0RERHJjIik7CisKKyAgICBmb3IgKHZvaWQqIGJ1ZiA6IG1EcmNNZW1vcnlWZWMpIHsKKyAgICAgICAgZnJlZShidWYpOworICAgIH0KKyAgICBtRHJjTWVtb3J5VmVjLmNsZWFyKCk7CisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorCiBJQV9FUlJPUkNPREUgU29mdFhBQUM6OmdldFhBQUNTdHJlYW1JbmZvKCkgewogICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IElBX05PX0VSUk9SOwogCkBAIC0xNTQ2LDExICsxNTM0LDE5IEBACiAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fTlVNX0NIQU5ORUxTLCAmbU51bUNoYW5uZWxzKTsKICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fTlVNX0NIQU5ORUxTIik7CisgICAgaWYgKG1OdW1DaGFubmVscyA+IE1BWF9DSEFOTkVMX0NPVU5UKSB7CisgICAgICAgIEFMT0dFKCIgTm8gb2YgY2hhbm5lbHMgYXJlIG1vcmUgdGhhbiBtYXggY2hhbm5lbHNcbiIpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQogCiAgICAgLyogUENNIHdvcmQgc2l6ZSAqLwogICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1BDTV9XRFNaLCAmbVBjbVdkU3opOwogICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9QQ01fV0RTWiIpOworICAgIGlmICgobVBjbVdkU3ogLyA4KSAhPSAyKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIE51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlOiAlZCwgRXhwZWN0ZWQgaXMgMiIsIG1QY21XZFN6KTsKKyAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KIAogICAgIC8qIGNoYW5uZWwgbWFzayB0byB0ZWxsIHRoZSBhcnJhbmdlbWVudCBvZiBjaGFubmVscyBpbiBiaXQgc3RyZWFtICovCiAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvU29mdFhBQUMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL1NvZnRYQUFDLmgKaW5kZXggNjE3NjA4Mi4uYTYyYTc5NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvU29mdFhBQUMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9Tb2Z0WEFBQy5oCkBAIC0zMyw4ICszMyw2IEBACiAjaW5jbHVkZSAiaW1wZF9hcGljbWRfc3RhbmRhcmRzLmgiCiAjaW5jbHVkZSAiaW1wZF9kcmNfY29uZmlnX3BhcmFtcy5oIgogCi0jZGVmaW5lIE1BWF9NRU1fQUxMT0NTIDEwMAotCiBleHRlcm4gIkMiIElBX0VSUk9SQ09ERSBpeGhlYWFjZF9kZWNfYXBpKHBWT0lEIHBfaWFfbW9kdWxlX29iaiwgV09SRDMyIGlfY21kLCBXT1JEMzIgaV9pZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBWT0lEIHB2X3ZhbHVlKTsKIGV4dGVybiAiQyIgSUFfRVJST1JDT0RFIGlhX2RyY19kZWNfYXBpKHBWT0lEIHBfaWFfbW9kdWxlX29iaiwgV09SRDMyIGlfY21kLCBXT1JEMzIgaV9pZHgsCkBAIC04MCwxOCArNzgsMTkgQEAKICAgICBlbnVtIHsgTk9ORSwgQVdBSVRJTkdfRElTQUJMRUQsIEFXQUlUSU5HX0VOQUJMRUQgfSBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlOwogCiAgICAgdm9pZCBpbml0UG9ydHMoKTsKLSAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworICAgIElBX0VSUk9SQ09ERSBpbml0RGVjb2RlcigpOwogICAgIGJvb2wgaXNDb25maWd1cmVkKCkgY29uc3Q7Ci0gICAgaW50IGRyYWluRGVjb2RlcigpOwotICAgIGludCBpbml0WEFBQ0RlY29kZXIoKTsKLSAgICBpbnQgZGVJbml0WEFBQ0RlY29kZXIoKTsKKyAgICBJQV9FUlJPUkNPREUgZHJhaW5EZWNvZGVyKCk7CisgICAgSUFfRVJST1JDT0RFIGluaXRYQUFDRGVjb2RlcigpOworICAgIElBX0VSUk9SQ09ERSBkZUluaXRYQUFDRGVjb2RlcigpOworICAgIElBX0VSUk9SQ09ERSBpbml0TVBFR0RERHJjKCk7CisgICAgSUFfRVJST1JDT0RFIGRlSW5pdE1QRUdERERyYygpOworICAgIElBX0VSUk9SQ09ERSBjb25maWdYQUFDRGVjb2Rlcih1aW50OF90KiBpbkJ1ZmZlciwgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgpOworICAgIElBX0VSUk9SQ09ERSBjb25maWdNUEVHRERyYygpOworICAgIElBX0VSUk9SQ09ERSBkZWNvZGVYQUFDU3RyZWFtKHVpbnQ4X3QqIGluQnVmZmVyLCB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBieXRlc0NvbnN1bWVkLCBpbnQzMl90KiBvdXRCeXRlcyk7CiAKLSAgICBpbnQgY29uZmlnWEFBQ0RlY29kZXIodWludDhfdCogaW5CdWZmZXIsIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoKTsKLSAgICBpbnQgY29uZmlnTVBFR0REcmMoKTsKLSAgICBpbnQgZGVjb2RlWEFBQ1N0cmVhbSh1aW50OF90KiBpbkJ1ZmZlciwgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgsIGludDMyX3QqIGJ5dGVzQ29uc3VtZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogb3V0Qnl0ZXMpOwotCi0gICAgaW50IGNvbmZpZ2ZsdXNoRGVjb2RlKCk7CisgICAgSUFfRVJST1JDT0RFIGNvbmZpZ2ZsdXNoRGVjb2RlKCk7CiAgICAgSUFfRVJST1JDT0RFIGdldFhBQUNTdHJlYW1JbmZvKCk7CiAgICAgSUFfRVJST1JDT0RFIHNldFhBQUNEUkNJbmZvKGludDMyX3QgZHJjQ3V0LCBpbnQzMl90IGRyY0Jvb3N0LCBpbnQzMl90IGRyY1JlZkxldmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRyY0hlYXZ5Q29tcHJlc3Npb24KQEAgLTEyMCw5ICsxMTksOCBAQAogICAgIGludDhfdCogbURyY091dEJ1ZjsKICAgICBpbnQzMl90IG1NcGVnRERSQ1ByZXNlbnQ7CiAgICAgaW50MzJfdCBtRFJDRmxhZzsKLQotICAgIHZvaWQqIG1NZW1vcnlBcnJheVtNQVhfTUVNX0FMTE9DU107Ci0gICAgaW50MzJfdCBtTWFsbG9jQ291bnQ7CisgICAgVmVjdG9yPHZvaWQqPiBtTWVtb3J5VmVjOworICAgIFZlY3Rvcjx2b2lkKj4gbURyY01lbW9yeVZlYzsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvZnRYQUFDKTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9BbmRyb2lkLmJwCmluZGV4IDE2ZTlkZWQuLmJhNTc0OTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9BbmRyb2lkLmJwCkBAIC0yNCw4ICsyNCw1IEBACiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAKaW5kZXggMDVmNDEwNC4uZDY4NTMyMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwCkBAIC0xNiwxNCArMTYsMTggQEAKIAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJDb2xvckNvbnZlcnRlciIKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KIAogI2luY2x1ZGUgImxpYnl1di9jb252ZXJ0X2Zyb20uaCIKKyNpbmNsdWRlICJsaWJ5dXYvY29udmVydF9hcmdiLmgiCisjaW5jbHVkZSAibGlieXV2L3BsYW5hcl9mdW5jdGlvbnMuaCIKICNpbmNsdWRlICJsaWJ5dXYvdmlkZW9fY29tbW9uLmgiCiAjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgpAQCAtNDQsMTAgKzQ4LDI4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RhdGljIGJvb2wgaXNSR0IoT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGb3JtYXQpIHsKKyAgICByZXR1cm4gY29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1CisgICAgICAgICAgICB8fCBjb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MzJCaXRSR0JBODg4OAorICAgICAgICAgICAgfHwgY29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyYml0QkdSQTg4ODg7Cit9CisKK2Jvb2wgQ29sb3JDb252ZXJ0ZXI6OkNvbG9yU3BhY2U6OmlzQnQ3MDkoKSB7CisgICAgcmV0dXJuIChtU3RhbmRhcmQgPT0gQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDcwOSk7Cit9CisKKworYm9vbCBDb2xvckNvbnZlcnRlcjo6Q29sb3JTcGFjZTo6aXNKcGVnKCkgeworICAgIHJldHVybiAoKG1TdGFuZGFyZCA9PSBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEJUNjAxXzYyNSkKKyAgICAgICAgICAgIHx8IChtU3RhbmRhcmQgPT0gQ29sb3JVdGlsczo6a0NvbG9yU3RhbmRhcmRCVDYwMV81MjUpKQorICAgICAgICAgICAgJiYgKG1SYW5nZSA9PSBDb2xvclV0aWxzOjprQ29sb3JSYW5nZUZ1bGwpOworfQorCiBDb2xvckNvbnZlcnRlcjo6Q29sb3JDb252ZXJ0ZXIoCiAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGZyb20sIE9NWF9DT0xPUl9GT1JNQVRUWVBFIHRvKQogICAgIDogbVNyY0Zvcm1hdChmcm9tKSwKICAgICAgIG1Ec3RGb3JtYXQodG8pLAorICAgICAgbVNyY0NvbG9yU3BhY2UoezAsIDAsIDB9KSwKICAgICAgIG1DbGlwKE5VTEwpIHsKIH0KIApAQCAtNjIsNyArODQsNyBAQAogICAgICAgICAgICAgaWYgKG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQ0NFk0MTApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGZhbGwtdGhydQorICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKICAgICAgICAgICAgIHJldHVybiBtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NQogICAgICAgICAgICAgICAgICAgICB8fCBtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQzMkJpdFJHQkE4ODg4CkBAIC03MCwyNCArOTIsNDYgQEAKIAogICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRDYllDclk6CiAgICAgICAgIGNhc2UgT01YX1FDT01fQ09MT1JfRm9ybWF0WVZVNDIwU2VtaVBsYW5hcjoKLSAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKICAgICAgICAgY2FzZSBPTVhfVElfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjoKICAgICAgICAgICAgIHJldHVybiBtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NTsKIAorICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorI2lmZGVmIFVTRV9MSUJZVVYKKyAgICAgICAgICAgIHJldHVybiBtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NQorICAgICAgICAgICAgICAgICAgICB8fCBtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQzMkJpdFJHQkE4ODg4OworI2Vsc2UKKyAgICAgICAgICAgIHJldHVybiBtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NTsKKyNlbmRpZgorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogfQogCiBib29sIENvbG9yQ29udmVydGVyOjppc0RzdFJHQigpIGNvbnN0IHsKLSAgICByZXR1cm4gbURzdEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjUKLSAgICAgICAgICAgIHx8IG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODgKLSAgICAgICAgICAgIHx8IG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyYml0QkdSQTg4ODg7CisgICAgcmV0dXJuIGlzUkdCKG1Ec3RGb3JtYXQpOwogfQogCit2b2lkIENvbG9yQ29udmVydGVyOjpzZXRTcmNDb2xvclNwYWNlKAorICAgICAgICB1aW50MzJfdCBzdGFuZGFyZCwgdWludDMyX3QgcmFuZ2UsIHVpbnQzMl90IHRyYW5zZmVyKSB7CisgICAgaWYgKGlzUkdCKG1TcmNGb3JtYXQpKSB7CisgICAgICAgIEFMT0dXKCJDYW4ndCBzZXQgY29sb3Igc3BhY2Ugb24gUkdCIHNvdXJjZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1TcmNDb2xvclNwYWNlLm1TdGFuZGFyZCA9IHN0YW5kYXJkOworICAgIG1TcmNDb2xvclNwYWNlLm1SYW5nZSA9IHJhbmdlOworICAgIG1TcmNDb2xvclNwYWNlLm1UcmFuc2ZlciA9IHRyYW5zZmVyOworfQorCisvKgorICogSWYgc3RyaWRlIGlzIG5vbi16ZXJvLCBjbGllbnQncyBzdHJpZGUgd2lsbCBiZSB1c2VkLiBGb3IgcGxhbmFyCisgKiBvciBzZW1pLXBsYW5hciBZVVYgZm9ybWF0cywgc3RyaWRlIG11c3QgYmUgZXZlbiBudW1iZXJzLgorICogSWYgc3RyaWRlIGlzIHplcm8sIGl0IHdpbGwgYmUgY2FsY3VsYXRlZCBiYXNlZCBvbiB3aWR0aCBhbmQgYnBwCisgKiBvZiB0aGUgZm9ybWF0LCBhc3N1bWluZyBubyBwYWRkaW5nIG9uIHRoZSByaWdodCBlZGdlLgorICovCiBDb2xvckNvbnZlcnRlcjo6Qml0bWFwUGFyYW1zOjpCaXRtYXBQYXJhbXMoCiAgICAgICAgIHZvaWQgKmJpdHMsCi0gICAgICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwKKyAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LCBzaXplX3Qgc3RyaWRlLAogICAgICAgICBzaXplX3QgY3JvcExlZnQsIHNpemVfdCBjcm9wVG9wLAogICAgICAgICBzaXplX3QgY3JvcFJpZ2h0LCBzaXplX3QgY3JvcEJvdHRvbSwKICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGcm9tYXQpCkBAIC0xMDEsNiArMTQ1LDggQEAKICAgICAgIG1Dcm9wQm90dG9tKGNyb3BCb3R0b20pIHsKICAgICBzd2l0Y2gobUNvbG9yRm9ybWF0KSB7CiAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjU6CisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyMTY6CisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0Q2JZQ3JZOgogICAgICAgICBtQnBwID0gMjsKICAgICAgICAgbVN0cmlkZSA9IDIgKiBtV2lkdGg7CiAgICAgICAgIGJyZWFrOwpAQCAtMTEyLDEzICsxNTgsNyBAQAogICAgICAgICBtU3RyaWRlID0gNCAqIG1XaWR0aDsKICAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNjoKLSAgICAgICAgbUJwcCA9IDI7Ci0gICAgICAgIG1TdHJpZGUgPSAyICogbVdpZHRoOwotICAgICAgICBicmVhazsKLQogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKLSAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRDYllDclk6CiAgICAgY2FzZSBPTVhfUUNPTV9DT0xPUl9Gb3JtYXRZVlU0MjBTZW1pUGxhbmFyOgogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CiAgICAgY2FzZSBPTVhfVElfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjoKQEAgLTEzMiw2ICsxNzIsMTAgQEAKICAgICAgICAgbVN0cmlkZSA9IG1XaWR0aDsKICAgICAgICAgYnJlYWs7CiAgICAgfQorICAgIC8vIHVzZSBjbGllbnQncyBzdHJpZGUgaWYgaXQncyBzcGVjaWZpZWQuCisgICAgaWYgKHN0cmlkZSAhPSAwKSB7CisgICAgICAgIG1TdHJpZGUgPSBzdHJpZGU7CisgICAgfQogfQogCiBzaXplX3QgQ29sb3JDb252ZXJ0ZXI6OkJpdG1hcFBhcmFtczo6Y3JvcFdpZHRoKCkgY29uc3QgewpAQCAtMTQ0LDIxICsxODgsMjEgQEAKIAogc3RhdHVzX3QgQ29sb3JDb252ZXJ0ZXI6OmNvbnZlcnQoCiAgICAgICAgIGNvbnN0IHZvaWQgKnNyY0JpdHMsCi0gICAgICAgIHNpemVfdCBzcmNXaWR0aCwgc2l6ZV90IHNyY0hlaWdodCwKKyAgICAgICAgc2l6ZV90IHNyY1dpZHRoLCBzaXplX3Qgc3JjSGVpZ2h0LCBzaXplX3Qgc3JjU3RyaWRlLAogICAgICAgICBzaXplX3Qgc3JjQ3JvcExlZnQsIHNpemVfdCBzcmNDcm9wVG9wLAogICAgICAgICBzaXplX3Qgc3JjQ3JvcFJpZ2h0LCBzaXplX3Qgc3JjQ3JvcEJvdHRvbSwKICAgICAgICAgdm9pZCAqZHN0Qml0cywKLSAgICAgICAgc2l6ZV90IGRzdFdpZHRoLCBzaXplX3QgZHN0SGVpZ2h0LAorICAgICAgICBzaXplX3QgZHN0V2lkdGgsIHNpemVfdCBkc3RIZWlnaHQsIHNpemVfdCBkc3RTdHJpZGUsCiAgICAgICAgIHNpemVfdCBkc3RDcm9wTGVmdCwgc2l6ZV90IGRzdENyb3BUb3AsCiAgICAgICAgIHNpemVfdCBkc3RDcm9wUmlnaHQsIHNpemVfdCBkc3RDcm9wQm90dG9tKSB7CiAgICAgQml0bWFwUGFyYW1zIHNyYygKICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dm9pZCAqPihzcmNCaXRzKSwKLSAgICAgICAgICAgIHNyY1dpZHRoLCBzcmNIZWlnaHQsCisgICAgICAgICAgICBzcmNXaWR0aCwgc3JjSGVpZ2h0LCBzcmNTdHJpZGUsCiAgICAgICAgICAgICBzcmNDcm9wTGVmdCwgc3JjQ3JvcFRvcCwgc3JjQ3JvcFJpZ2h0LCBzcmNDcm9wQm90dG9tLCBtU3JjRm9ybWF0KTsKIAogICAgIEJpdG1hcFBhcmFtcyBkc3QoCiAgICAgICAgICAgICBkc3RCaXRzLAotICAgICAgICAgICAgZHN0V2lkdGgsIGRzdEhlaWdodCwKKyAgICAgICAgICAgIGRzdFdpZHRoLCBkc3RIZWlnaHQsIGRzdFN0cmlkZSwKICAgICAgICAgICAgIGRzdENyb3BMZWZ0LCBkc3RDcm9wVG9wLCBkc3RDcm9wUmlnaHQsIGRzdENyb3BCb3R0b20sIG1Ec3RGb3JtYXQpOwogCiAgICAgaWYgKCEoKHNyYy5tQ3JvcExlZnQgJiAxKSA9PSAwCkBAIC0yMDAsNyArMjQ0LDExIEBACiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorI2lmZGVmIFVTRV9MSUJZVVYKKyAgICAgICAgICAgIGVyciA9IGNvbnZlcnRZVVY0MjBTZW1pUGxhbmFyVXNlTGliWVVWKHNyYywgZHN0KTsKKyNlbHNlCiAgICAgICAgICAgICBlcnIgPSBjb252ZXJ0WVVWNDIwU2VtaVBsYW5hcihzcmMsIGRzdCk7CisjZW5kaWYKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgT01YX1RJX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6CkBAIC0yNzUsNiArMzIzLDEzIEBACiAgICAgcmV0dXJuIE9LOwogfQogCisjZGVmaW5lIERFQ0xBUkVfWVVWMlJHQkZVTkMoZnVuYywgcmdiKSBpbnQgKCpmdW5jKSggICAgIFwKKyAgICAgICAgY29uc3QgdWludDgqLCBpbnQsIGNvbnN0IHVpbnQ4KiwgaW50LCAgICAgICAgICAgXAorICAgICAgICBjb25zdCB1aW50OCosIGludCwgdWludDgqLCBpbnQsIGludCwgaW50KSAgICAgICBcCisgICAgICAgID0gbVNyY0NvbG9yU3BhY2UuaXNCdDcwOSgpID8gbGlieXV2OjpINDIwVG8jI3JnYiBcCisgICAgICAgIDogbVNyY0NvbG9yU3BhY2UuaXNKcGVnKCkgPyBsaWJ5dXY6Oko0MjBUbyMjcmdiICBcCisgICAgICAgIDogbGlieXV2OjpJNDIwVG8jI3JnYgorCiBzdGF0dXNfdCBDb2xvckNvbnZlcnRlcjo6Y29udmVydFlVVjQyMFBsYW5hclVzZUxpYllVVigKICAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0KSB7CiAgICAgdWludDhfdCAqZHN0X3B0ciA9ICh1aW50OF90ICopZHN0Lm1CaXRzCkBAIC0yOTIsMTkgKzM0NywyOCBAQAogCiAgICAgc3dpdGNoIChtRHN0Rm9ybWF0KSB7CiAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjU6Ci0gICAgICAgIGxpYnl1djo6STQyMFRvUkdCNTY1KHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlIC8gMiwgc3JjX3YsIHNyYy5tU3RyaWRlIC8gMiwKKyAgICB7CisgICAgICAgIERFQ0xBUkVfWVVWMlJHQkZVTkMoZnVuYywgUkdCNTY1KTsKKyAgICAgICAgKCpmdW5jKShzcmNfeSwgc3JjLm1TdHJpZGUsIHNyY191LCBzcmMubVN0cmlkZSAvIDIsIHNyY192LCBzcmMubVN0cmlkZSAvIDIsCiAgICAgICAgICAgICAgICAgKHVpbnQ4ICopZHN0X3B0ciwgZHN0Lm1TdHJpZGUsIHNyYy5jcm9wV2lkdGgoKSwgc3JjLmNyb3BIZWlnaHQoKSk7CiAgICAgICAgIGJyZWFrOworICAgIH0KIAogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODg6Ci0gICAgICAgIGxpYnl1djo6Q29udmVydEZyb21JNDIwKHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlIC8gMiwgc3JjX3YsIHNyYy5tU3RyaWRlIC8gMiwKLSAgICAgICAgICAgICAgICAodWludDggKilkc3RfcHRyLCBkc3QubVN0cmlkZSwgc3JjLmNyb3BXaWR0aCgpLCBzcmMuY3JvcEhlaWdodCgpLCBsaWJ5dXY6OkZPVVJDQ19BQkdSKTsKKyAgICB7CisgICAgICAgIERFQ0xBUkVfWVVWMlJHQkZVTkMoZnVuYywgQUJHUik7CisgICAgICAgICgqZnVuYykoc3JjX3ksIHNyYy5tU3RyaWRlLCBzcmNfdSwgc3JjLm1TdHJpZGUgLyAyLCBzcmNfdiwgc3JjLm1TdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICh1aW50OCAqKWRzdF9wdHIsIGRzdC5tU3RyaWRlLCBzcmMuY3JvcFdpZHRoKCksIHNyYy5jcm9wSGVpZ2h0KCkpOwogICAgICAgICBicmVhazsKKyAgICB9CiAKICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4OgotICAgICAgICBsaWJ5dXY6OkNvbnZlcnRGcm9tSTQyMChzcmNfeSwgc3JjLm1TdHJpZGUsIHNyY191LCBzcmMubVN0cmlkZSAvIDIsIHNyY192LCBzcmMubVN0cmlkZSAvIDIsCi0gICAgICAgICAgICAgICAgKHVpbnQ4ICopZHN0X3B0ciwgZHN0Lm1TdHJpZGUsIHNyYy5jcm9wV2lkdGgoKSwgc3JjLmNyb3BIZWlnaHQoKSwgbGlieXV2OjpGT1VSQ0NfQVJHQik7CisgICAgeworICAgICAgICBERUNMQVJFX1lVVjJSR0JGVU5DKGZ1bmMsIEFSR0IpOworICAgICAgICAoKmZ1bmMpKHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlIC8gMiwgc3JjX3YsIHNyYy5tU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAodWludDggKilkc3RfcHRyLCBkc3QubVN0cmlkZSwgc3JjLmNyb3BXaWR0aCgpLCBzcmMuY3JvcEhlaWdodCgpKTsKICAgICAgICAgYnJlYWs7CisgICAgfQogCiAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwpAQCAtMzEzLDYgKzM3Nyw0MSBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ29sb3JDb252ZXJ0ZXI6OmNvbnZlcnRZVVY0MjBTZW1pUGxhbmFyVXNlTGliWVVWKAorICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpIHsKKyAgICB1aW50OF90ICpkc3RfcHRyID0gKHVpbnQ4X3QgKilkc3QubUJpdHMKKyAgICAgICAgKyBkc3QubUNyb3BUb3AgKiBkc3QubVN0cmlkZSArIGRzdC5tQ3JvcExlZnQgKiBkc3QubUJwcDsKKworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0KKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHMgKyBzcmMubUNyb3BUb3AgKiBzcmMubVN0cmlkZSArIHNyYy5tQ3JvcExlZnQ7CisKKyAgICBjb25zdCB1aW50OF90ICpzcmNfdSA9CisgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1TdHJpZGUgKiBzcmMubUhlaWdodAorICAgICAgICArIChzcmMubUNyb3BUb3AgLyAyKSAqIHNyYy5tU3RyaWRlICsgc3JjLm1Dcm9wTGVmdDsKKworICAgIHN3aXRjaCAobURzdEZvcm1hdCkgeworICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1OgorICAgICAgICBsaWJ5dXY6Ok5WMTJUb1JHQjU2NShzcmNfeSwgc3JjLm1TdHJpZGUsIHNyY191LCBzcmMubVN0cmlkZSwgKHVpbnQ4ICopZHN0X3B0ciwKKyAgICAgICAgICAgICAgICBkc3QubVN0cmlkZSwgc3JjLmNyb3BXaWR0aCgpLCBzcmMuY3JvcEhlaWdodCgpKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4OgorICAgICAgICBsaWJ5dXY6Ok5WMTJUb0FSR0Ioc3JjX3ksIHNyYy5tU3RyaWRlLCBzcmNfdSwgc3JjLm1TdHJpZGUsICh1aW50OCAqKWRzdF9wdHIsCisgICAgICAgICAgICAgICAgZHN0Lm1TdHJpZGUsIHNyYy5jcm9wV2lkdGgoKSwgc3JjLmNyb3BIZWlnaHQoKSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MzJCaXRSR0JBODg4ODoKKyAgICAgICAgbGlieXV2OjpOVjEyVG9BQkdSKHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlLCAodWludDggKilkc3RfcHRyLAorICAgICAgICAgICAgICAgIGRzdC5tU3RyaWRlLCBzcmMuY3JvcFdpZHRoKCksIHNyYy5jcm9wSGVpZ2h0KCkpOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgIH0KKworICAgcmV0dXJuIE9LOworfQorCiBzdGQ6OmZ1bmN0aW9uPHZvaWQgKHZvaWQgKiwgdm9pZCAqLCB2b2lkICosIHNpemVfdCwKICAgICAgICAgICAgICAgICAgICAgc2lnbmVkICosIHNpZ25lZCAqLCBzaWduZWQgKiwgc2lnbmVkICopPgogZ2V0UmVhZEZyb21TcmMoT01YX0NPTE9SX0ZPUk1BVFRZUEUgc3JjRm9ybWF0KSB7CkBAIC03OTIsMTUgKzg5MSwxNSBAQAogCiAgICAgdWludDhfdCAqa0FkanVzdGVkQ2xpcCA9IGluaXRDbGlwKCk7CiAKLSAgICB1aW50MTZfdCAqZHN0X3B0ciA9ICh1aW50MTZfdCAqKWRzdC5tQml0cwotICAgICAgICArIGRzdC5tQ3JvcFRvcCAqIGRzdC5tV2lkdGggKyBkc3QubUNyb3BMZWZ0OworICAgIHVpbnQxNl90ICpkc3RfcHRyID0gKHVpbnQxNl90ICopKCh1aW50OF90ICopCisgICAgICAgICAgICBkc3QubUJpdHMgKyBkc3QubUNyb3BUb3AgKiBkc3QubVN0cmlkZSArIGRzdC5tQ3JvcExlZnQgKiBkc3QubUJwcCk7CiAKICAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9Ci0gICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1Dcm9wVG9wICogc3JjLm1XaWR0aCArIHNyYy5tQ3JvcExlZnQ7CisgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1Dcm9wVG9wICogc3JjLm1TdHJpZGUgKyBzcmMubUNyb3BMZWZ0OwogCiAgICAgY29uc3QgdWludDhfdCAqc3JjX3UgPQotICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyY195ICsgc3JjLm1XaWR0aCAqIHNyYy5tSGVpZ2h0Ci0gICAgICAgICsgc3JjLm1Dcm9wVG9wICogc3JjLm1XaWR0aCArIHNyYy5tQ3JvcExlZnQ7CisgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1IZWlnaHQgKiBzcmMubVN0cmlkZSArCisgICAgICAgIChzcmMubUNyb3BUb3AgLyAyKSAqIHNyYy5tU3RyaWRlICsgc3JjLm1Dcm9wTGVmdDsKIAogICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgc3JjLmNyb3BIZWlnaHQoKTsgKyt5KSB7CiAgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgc3JjLmNyb3BXaWR0aCgpOyB4ICs9IDIpIHsKQEAgLTg0MiwxMyArOTQxLDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBzcmNfeSArPSBzcmMubVdpZHRoOworICAgICAgICBzcmNfeSArPSBzcmMubVN0cmlkZTsKIAogICAgICAgICBpZiAoeSAmIDEpIHsKLSAgICAgICAgICAgIHNyY191ICs9IHNyYy5tV2lkdGg7CisgICAgICAgICAgICBzcmNfdSArPSBzcmMubVN0cmlkZTsKICAgICAgICAgfQogCi0gICAgICAgIGRzdF9wdHIgKz0gZHN0Lm1XaWR0aDsKKyAgICAgICAgZHN0X3B0ciA9ICh1aW50MTZfdCopKCh1aW50OF90Kilkc3RfcHRyICsgZHN0Lm1TdHJpZGUpOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcAppbmRleCA2NTdhMDViLi4zNTlkZjNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwCkBAIC00NCw2ICs0NCw3IEBACiAgICAgICBtTmF0aXZlV2luZG93KG5hdGl2ZVdpbmRvdyksCiAgICAgICBtV2lkdGgoMCksCiAgICAgICBtSGVpZ2h0KDApLAorICAgICAgbVN0cmlkZSgwKSwKICAgICAgIG1Dcm9wTGVmdCgwKSwKICAgICAgIG1Dcm9wVG9wKDApLAogICAgICAgbUNyb3BSaWdodCgwKSwKQEAgLTY3LDkgKzY4LDEwIEBACiAgICAgaW50MzJfdCBjb2xvckZvcm1hdE5ldzsKICAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0TmV3KSk7CiAKLSAgICBpbnQzMl90IHdpZHRoTmV3LCBoZWlnaHROZXc7Ci0gICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoInN0cmlkZSIsICZ3aWR0aE5ldykpOworICAgIGludDMyX3Qgd2lkdGhOZXcsIGhlaWdodE5ldywgc3RyaWRlTmV3OworICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aE5ldykpOwogICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJzbGljZS1oZWlnaHQiLCAmaGVpZ2h0TmV3KSk7CisgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoInN0cmlkZSIsICZzdHJpZGVOZXcpKTsKIAogICAgIGludDMyX3QgY3JvcExlZnROZXcsIGNyb3BUb3BOZXcsIGNyb3BSaWdodE5ldywgY3JvcEJvdHRvbU5ldzsKICAgICBpZiAoIWZvcm1hdC0+ZmluZFJlY3QoCkBAIC0xMDYsNiArMTA4LDcgQEAKICAgICBtQ29sb3JGb3JtYXQgPSBzdGF0aWNfY2FzdDxPTVhfQ09MT1JfRk9STUFUVFlQRT4oY29sb3JGb3JtYXROZXcpOwogICAgIG1XaWR0aCA9IHdpZHRoTmV3OwogICAgIG1IZWlnaHQgPSBoZWlnaHROZXc7CisgICAgbVN0cmlkZSA9IHN0cmlkZU5ldzsKICAgICBtQ3JvcExlZnQgPSBjcm9wTGVmdE5ldzsKICAgICBtQ3JvcFRvcCA9IGNyb3BUb3BOZXc7CiAgICAgbUNyb3BSaWdodCA9IGNyb3BSaWdodE5ldzsKQEAgLTI3NiwyMCArMjc5LDE1IEBACiAgICAgaWYgKG1Db252ZXJ0ZXIpIHsKICAgICAgICAgbUNvbnZlcnRlci0+Y29udmVydCgKICAgICAgICAgICAgICAgICBkYXRhLAotICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCwKKyAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQsIG1TdHJpZGUsCiAgICAgICAgICAgICAgICAgbUNyb3BMZWZ0LCBtQ3JvcFRvcCwgbUNyb3BSaWdodCwgbUNyb3BCb3R0b20sCiAgICAgICAgICAgICAgICAgZHN0LAotICAgICAgICAgICAgICAgIGJ1Zi0+c3RyaWRlLCBidWYtPmhlaWdodCwKKyAgICAgICAgICAgICAgICBidWYtPnN0cmlkZSwgYnVmLT5oZWlnaHQsIDAsCiAgICAgICAgICAgICAgICAgMCwgMCwgbUNyb3BXaWR0aCAtIDEsIG1Dcm9wSGVpZ2h0IC0gMSk7CiAgICAgfSBlbHNlIGlmIChtQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcikgewotICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9IChjb25zdCB1aW50OF90ICopZGF0YTsKLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3UgPQotICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopZGF0YSArIG1XaWR0aCAqIG1IZWlnaHQ7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY192ID0gc3JjX3UgKyAobVdpZHRoIC8gMiAqIG1IZWlnaHQgLyAyKTsKLQotICAgICAgICBzcmNfeSArPW1Dcm9wTGVmdCArIG1Dcm9wVG9wICogbVdpZHRoOwotICAgICAgICBzcmNfdSArPShtQ3JvcExlZnQgKyBtQ3JvcFRvcCAqIG1XaWR0aCAvIDIpLzI7Ci0gICAgICAgIHNyY192ICs9KG1Dcm9wTGVmdCArIG1Dcm9wVG9wICogbVdpZHRoIC8gMikvMjsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3kgPSAoY29uc3QgdWludDhfdCAqKWRhdGEgKyBtQ3JvcFRvcCAqIG1TdHJpZGUgKyBtQ3JvcExlZnQ7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY191ID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgbVN0cmlkZSAqIG1IZWlnaHQgKyBtQ3JvcFRvcCAqIG1TdHJpZGUgLyA0OworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfdiA9IChjb25zdCB1aW50OF90ICopc3JjX3UgKyBtU3RyaWRlICogbUhlaWdodCAvIDQ7CiAKICAgICAgICAgdWludDhfdCAqZHN0X3kgPSAodWludDhfdCAqKWRzdDsKICAgICAgICAgc2l6ZV90IGRzdF95X3NpemUgPSBidWYtPnN0cmlkZSAqIGJ1Zi0+aGVpZ2h0OwpAQCAtMzA1LDcgKzMwMyw3IEBACiAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgbUNyb3BIZWlnaHQ7ICsreSkgewogICAgICAgICAgICAgbWVtY3B5KGRzdF95LCBzcmNfeSwgbUNyb3BXaWR0aCk7CiAKLSAgICAgICAgICAgIHNyY195ICs9IG1XaWR0aDsKKyAgICAgICAgICAgIHNyY195ICs9IG1TdHJpZGU7CiAgICAgICAgICAgICBkc3RfeSArPSBidWYtPnN0cmlkZTsKICAgICAgICAgfQogCkBAIC0zMTMsMTkgKzMxMSwxNSBAQAogICAgICAgICAgICAgbWVtY3B5KGRzdF91LCBzcmNfdSwgKG1Dcm9wV2lkdGggKyAxKSAvIDIpOwogICAgICAgICAgICAgbWVtY3B5KGRzdF92LCBzcmNfdiwgKG1Dcm9wV2lkdGggKyAxKSAvIDIpOwogCi0gICAgICAgICAgICBzcmNfdSArPSBtV2lkdGggLyAyOwotICAgICAgICAgICAgc3JjX3YgKz0gbVdpZHRoIC8gMjsKKyAgICAgICAgICAgIHNyY191ICs9IG1TdHJpZGUgLyAyOworICAgICAgICAgICAgc3JjX3YgKz0gbVN0cmlkZSAvIDI7CiAgICAgICAgICAgICBkc3RfdSArPSBkc3RfY19zdHJpZGU7CiAgICAgICAgICAgICBkc3RfdiArPSBkc3RfY19zdHJpZGU7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1Db2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyMTYpIHsKLSAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY195ID0gKGNvbnN0IHVpbnQxNl90ICopZGF0YTsKLSAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY191ID0gKGNvbnN0IHVpbnQxNl90ICopZGF0YSArIG1XaWR0aCAqIG1IZWlnaHQ7Ci0gICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNfdiA9IHNyY191ICsgKG1XaWR0aCAvIDIgKiBtSGVpZ2h0IC8gMik7Ci0KLSAgICAgICAgc3JjX3kgKz0gbUNyb3BMZWZ0ICsgbUNyb3BUb3AgKiBtV2lkdGg7Ci0gICAgICAgIHNyY191ICs9IChtQ3JvcExlZnQgKyBtQ3JvcFRvcCAqIG1XaWR0aCAvIDIpIC8gMjsKLSAgICAgICAgc3JjX3YgKz0gKG1Dcm9wTGVmdCArIG1Dcm9wVG9wICogbVdpZHRoIC8gMikgLyAyOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9IChjb25zdCB1aW50OF90ICopZGF0YSArIG1Dcm9wVG9wICogbVN0cmlkZSArIG1Dcm9wTGVmdCAqIDI7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY191ID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgbVN0cmlkZSAqIG1IZWlnaHQgKyBtQ3JvcFRvcCAqIG1TdHJpZGUgLyA0OworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfdiA9IChjb25zdCB1aW50OF90ICopc3JjX3UgKyBtU3RyaWRlICogbUhlaWdodCAvIDQ7CiAKICAgICAgICAgdWludDhfdCAqZHN0X3kgPSAodWludDhfdCAqKWRzdDsKICAgICAgICAgc2l6ZV90IGRzdF95X3NpemUgPSBidWYtPnN0cmlkZSAqIGJ1Zi0+aGVpZ2h0OwpAQCAtMzQwLDIxICszMzQsMjEgQEAKIAogICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IG1Dcm9wSGVpZ2h0OyArK3kpIHsKICAgICAgICAgICAgIGZvciAoaW50IHggPSAwOyB4IDwgbUNyb3BXaWR0aDsgKyt4KSB7Ci0gICAgICAgICAgICAgICAgZHN0X3lbeF0gPSAodWludDhfdCkoc3JjX3lbeF0gPj4gMik7CisgICAgICAgICAgICAgICAgZHN0X3lbeF0gPSAodWludDhfdCkoKCh1aW50MTZfdCAqKXNyY195KVt4XSA+PiAyKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgc3JjX3kgKz0gbVdpZHRoOworICAgICAgICAgICAgc3JjX3kgKz0gbVN0cmlkZTsKICAgICAgICAgICAgIGRzdF95ICs9IGJ1Zi0+c3RyaWRlOwogICAgICAgICB9CiAKICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCAobUNyb3BIZWlnaHQgKyAxKSAvIDI7ICsreSkgewogICAgICAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCAobUNyb3BXaWR0aCArIDEpIC8gMjsgKyt4KSB7Ci0gICAgICAgICAgICAgICAgZHN0X3VbeF0gPSAodWludDhfdCkoc3JjX3VbeF0gPj4gMik7Ci0gICAgICAgICAgICAgICAgZHN0X3ZbeF0gPSAodWludDhfdCkoc3JjX3ZbeF0gPj4gMik7CisgICAgICAgICAgICAgICAgZHN0X3VbeF0gPSAodWludDhfdCkoKCh1aW50MTZfdCAqKXNyY191KVt4XSA+PiAyKTsKKyAgICAgICAgICAgICAgICBkc3Rfdlt4XSA9ICh1aW50OF90KSgoKHVpbnQxNl90ICopc3JjX3YpW3hdID4+IDIpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzcmNfdSArPSBtV2lkdGggLyAyOwotICAgICAgICAgICAgc3JjX3YgKz0gbVdpZHRoIC8gMjsKKyAgICAgICAgICAgIHNyY191ICs9IG1TdHJpZGUgLyAyOworICAgICAgICAgICAgc3JjX3YgKz0gbVN0cmlkZSAvIDI7CiAgICAgICAgICAgICBkc3RfdSArPSBkc3RfY19zdHJpZGU7CiAgICAgICAgICAgICBkc3RfdiArPSBkc3RfY19zdHJpZGU7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTZiNGIzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNiBAQAorcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAibWVkaWFzd2NvZGVjLnhtbCIsCisgICAgc3JjOiAibWVkaWFfY29kZWNzX3N3LnhtbCIsCisgICAgZmlsZW5hbWU6ICJtZWRpYV9jb2RlY3MueG1sIiwKKyAgICBpbnN0YWxsYWJsZTogZmFsc2UsCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYXVkaW8ueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2F1ZGlvLnhtbAppbmRleCA2MzIwODhhLi44ODk5YWRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYXVkaW8ueG1sCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9hdWRpby54bWwKQEAgLTU4LDcgKzU4LDcgQEAKICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLnJhdy5kZWNvZGVyIiB0eXBlPSJhdWRpby9yYXciPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iOCIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLTk2MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAtMTkyMDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTEwMDAwMDAwIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuZmxhYy5kZWNvZGVyIiB0eXBlPSJhdWRpby9mbGFjIj4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl9hdWRpby54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfYXVkaW8ueG1sCmluZGV4IDBiNTU0YTIuLjUwOWY3YTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl9hdWRpby54bWwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX2F1ZGlvLnhtbApAQCAtMTcsNTEgKzE3LDYxIEBACiA8SW5jbHVkZWQ+CiAgICAgPERlY29kZXJzPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLm1wMy5kZWNvZGVyIiB0eXBlPSJhdWRpby9tcGVnIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLm1wMy5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMiIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLDExMDI1LDEyMDAwLDE2MDAwLDIyMDUwLDI0MDAwLDMyMDAwLDQ0MTAwLDQ4MDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI4MDAwLTMyMDAwMCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmFtcm5iLmRlY29kZXIiIHR5cGU9ImF1ZGlvLzNncHAiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuYW1ybmIuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNDc1MC0xMjIwMCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmFtcndiLmRlY29kZXIiIHR5cGU9ImF1ZGlvL2Ftci13YiI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5hbXJ3Yi5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSIxNjAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNjYwMC0yMzg1MCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmFhYy5kZWNvZGVyIiB0eXBlPSJhdWRpby9tcDRhLWxhdG0iPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuYWFjLmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI4IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjczNTAsODAwMCwxMTAyNSwxMjAwMCwxNjAwMCwyMjA1MCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iODAwMC05NjAwMDAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5nNzExLmFsYXcuZGVjb2RlciIgdHlwZT0iYXVkaW8vZzcxMS1hbGF3Ij4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmc3MTEuYWxhdy5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLTQ4MDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI2NDAwMCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmc3MTEubWxhdy5kZWNvZGVyIiB0eXBlPSJhdWRpby9nNzExLW1sYXciPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuZzcxMS5tbGF3LmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAtNDgwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjY0MDAwIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQudm9yYmlzLmRlY29kZXIiIHR5cGU9ImF1ZGlvL3ZvcmJpcyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS52b3JiaXMuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMC05NjAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMzIwMDAtNTAwMDAwIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQub3B1cy5kZWNvZGVyIiB0eXBlPSJhdWRpby9vcHVzIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLm9wdXMuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iNDgwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjYwMDAtNTEwMDAwIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQucmF3LmRlY29kZXIiIHR5cGU9ImF1ZGlvL3JhdyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5yYXcuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMC05NjAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLTE5MjAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMDAwMDAwMCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmZsYWMuZGVjb2RlciIgdHlwZT0iYXVkaW8vZmxhYyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5mbGFjLmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI4IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjEtNjU1MzUwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTIxMDAwMDAwIiAvPgpAQCAtNjksMjkgKzc5LDQwIEBACiAgICAgPC9EZWNvZGVycz4KICAgICA8RW5jb2RlcnM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYWFjLmVuY29kZXIiIHR5cGU9ImF1ZGlvL21wNGEtbGF0bSI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5hYWMuZW5jb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjYiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCwxMTAyNSwxMjAwMCwxNjAwMCwyMjA1MCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIgLz4KICAgICAgICAgICAgIDwhLS0gYWxzbyBtYXkgc3VwcG9ydCA2NDAwMCwgODgyMDAgIGFuZCA5NjAwMCBIeiAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iODAwMC05NjAwMDAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hbXJuYi5lbmNvZGVyIiB0eXBlPSJhdWRpby8zZ3BwIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmFtcm5iLmVuY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjQ3NTAtMTIyMDAiIC8+CiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iQ0JSIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYW1yd2IuZW5jb2RlciIgdHlwZT0iYXVkaW8vYW1yLXdiIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmFtcndiLmVuY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjE2MDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI2NjAwLTIzODUwIiAvPgogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IkNCUiIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmZsYWMuZW5jb2RlciIgdHlwZT0iYXVkaW8vZmxhYyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5mbGFjLmVuY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjEtNjU1MzUwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTIxMDAwMDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNvbXBsZXhpdHkiIHJhbmdlPSIwLTgiICBkZWZhdWx0PSI1IiAvPgogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IkNRIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQub3B1cy5lbmNvZGVyIiB0eXBlPSJhdWRpby9vcHVzIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCwxMjAwMCwxNjAwMCwyNDAwMCw0ODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNTAwLTUxMjAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjb21wbGV4aXR5IiByYW5nZT0iMC0xMCIgIGRlZmF1bHQ9IjUiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iQ0JSIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgPC9FbmNvZGVycz4KIDwvSW5jbHVkZWQ+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfdGVsZXBob255LnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl90ZWxlcGhvbnkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MGIwOTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfdGVsZXBob255LnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPEluY2x1ZGVkPgorICAgIDxEZWNvZGVycz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5nc20uZGVjb2RlciIgdHlwZT0iYXVkaW8vZ3NtIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmdzbS5kZWNvZGVyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxMzAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgIDwvRGVjb2RlcnM+Cis8L0luY2x1ZGVkPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX3R2LnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl90di54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIwMGRjOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl90di54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxJbmNsdWRlZD4KKyAgICA8RGVjb2RlcnM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQubXBlZzIuZGVjb2RlciIgdHlwZT0idmlkZW8vbXBlZzIiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUubXBlZzIuZGVjb2RlciIgLz4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTGV2ZWxITCAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE2eDE2IiBtYXg9IjE5MjB4MTA4OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0yNDQ4MDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMjAwMDAwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgIDwvRGVjb2RlcnM+Cis8L0luY2x1ZGVkPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX3ZpZGVvLnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl92aWRlby54bWwKaW5kZXggYWRiNDViMy4uMDQwNDFlYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX3ZpZGVvLnhtbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfdmlkZW8ueG1sCkBAIC0xNyw2ICsxNyw3IEBACiA8SW5jbHVkZWQ+CiAgICAgPERlY29kZXJzPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLm1wZWc0LmRlY29kZXIiIHR5cGU9InZpZGVvL21wNHYtZXMiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUubXBlZzQuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVTaW1wbGUgOiBMZXZlbDMgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMzUyeDI4OCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CkBAIC0yNiw2ICsyNyw3IEBACiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmgyNjMuZGVjb2RlciIgdHlwZT0idmlkZW8vM2dwcCI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5oMjYzLmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDMwLCBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDQ1CiAgICAgICAgICAgICAgICAgICAgIFByb2ZpbGVJU1dWMiA6IExldmVsMzAsIFByb2ZpbGVJU1dWMiA6IExldmVsNDUgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMzUyeDI4OCIgLz4KQEAgLTM0LDYgKzM2LDcgQEAKICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYXZjLmRlY29kZXIiIHR5cGU9InZpZGVvL2F2YyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5oMjY0LmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlSGlnaCA6IExldmVsNTIgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iNDA4MHg0MDgwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KQEAgLTQ0LDYgKzQ3LDcgQEAKICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuaGV2Yy5kZWNvZGVyIiB0eXBlPSJ2aWRlby9oZXZjIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmhldmMuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTWFpblRpZXJMZXZlbDUxIC0tPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjQwOTZ4NDA5NiIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CkBAIC01NCw2ICs1OCw3IEBACiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLnZwOC5kZWNvZGVyIiB0eXBlPSJ2aWRlby94LXZuZC5vbjIudnA4Ij4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLnZwOC5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgpAQCAtNjMsNiArNjgsNyBAQAogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC52cDkuZGVjb2RlciIgdHlwZT0idmlkZW8veC12bmQub24yLnZwOSI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS52cDkuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KQEAgLTcxLDE2ICs3NywyNyBAQAogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTQwMDAwMDAwIiAvPgogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hdjEuZGVjb2RlciIgdHlwZT0idmlkZW8vYXYwMSI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSI5Nng5NiIgbWF4PSIxOTIweDEwODAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgbWluPSIyNCIgbWF4PSIyMDczNjAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTEyMDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJmcmFtZS1yYXRlIiByYW5nZT0iMS02MCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgPC9EZWNvZGVycz4KIAogICAgIDxFbmNvZGVycz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5oMjYzLmVuY29kZXIiIHR5cGU9InZpZGVvLzNncHAiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuaDI2My5lbmNvZGVyIiAvPgogICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUJhc2VsaW5lIDogTGV2ZWw0NSAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE3NngxNDQiIG1heD0iMTc2eDE0NCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIxNngxNiIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMjgwMDAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hdmMuZW5jb2RlciIgdHlwZT0idmlkZW8vYXZjIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmgyNjQuZW5jb2RlciIgLz4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVCYXNlbGluZSA6IExldmVsNDEgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIxNngxNiIgbWF4PSIyMDQ4eDIwNDgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgpAQCAtOTAsNyArMTA3LDIxIEBACiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTIwMDAwMDAiIC8+CiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJpbnRyYS1yZWZyZXNoIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuaGV2Yy5lbmNvZGVyIiB0eXBlPSJ2aWRlby9oZXZjIj4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTWFpblRpZXJMZXZlbDUxIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjUxMng1MTIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSI4eDgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTQwOTYiIC8+IDwhLS0gbWF4IDUxMng1MTIgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTEyMjg4MCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJmcmFtZS1yYXRlIiByYW5nZT0iMS0xMjAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTAwMDAwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY29tcGxleGl0eSIgcmFuZ2U9IjAtMTAiICBkZWZhdWx0PSIwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InF1YWxpdHkiIHJhbmdlPSIwLTEwMCIgIGRlZmF1bHQ9IjgwIiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IlZCUixDQlIsQ1EiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5tcGVnNC5lbmNvZGVyIiB0eXBlPSJ2aWRlby9tcDR2LWVzIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLm1wZWc0LmVuY29kZXIiIC8+CiAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQ29yZSA6IExldmVsMiAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE2eDE2IiBtYXg9IjE3NngxNDQiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMTZ4MTYiIC8+CkBAIC05OSw2ICsxMzAsNyBAQAogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTY0MDAwIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQudnA4LmVuY29kZXIiIHR5cGU9InZpZGVvL3gtdm5kLm9uMi52cDgiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUudnA4LmVuY29kZXIiIC8+CiAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlTWFpbiA6IExldmVsX1ZlcnNpb24wLTMgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMjA0OHgyMDQ4IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KQEAgLTEwOSw2ICsxNDEsNyBAQAogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IlZCUixDQlIiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC52cDkuZW5jb2RlciIgdHlwZT0idmlkZW8veC12bmQub24yLnZwOSI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS52cDkuZW5jb2RlciIgLz4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTGV2ZWxfVmVyc2lvbjAtMyAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3Nfc3cueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3Nfc3cueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZDNmMWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19zdy54bWwKQEAgLTAsMCArMSwzMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TWVkaWFDb2RlY3M+CisgICAgPFNldHRpbmdzPgorICAgICAgICA8IS0tIGRpc2FibGUgVFYgYW5kIHRlbGVwaG9ueSBkb21haW5zIGJ5IGRlZmF1bHQuIFRoZXNlIG11c3QgYmUgb3B0ZWQgaW4gYnkgT0VNcyAtLT4KKyAgICAgICAgPERvbWFpbiBuYW1lPSJ0ZWxlcGhvbnkiIGVuYWJsZWQ9ImZhbHNlIiAvPgorICAgICAgICA8RG9tYWluIG5hbWU9InR2IiBlbmFibGVkPSJmYWxzZSIgLz4KKyAgICAgICAgPFZhcmlhbnQgbmFtZT0ic2xvdy1jcHUiIGVuYWJsZWQ9ImZhbHNlIiAvPgorICAgIDwvU2V0dGluZ3M+CisgICAgPERlY29kZXJzPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLm1wMy5kZWNvZGVyIiB0eXBlPSJhdWRpby9tcGVnIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLm1wMy5kZWNvZGVyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLDExMDI1LDEyMDAwLDE2MDAwLDIyMDUwLDI0MDAwLDMyMDAwLDQ0MTAwLDQ4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI4MDAwLTMyMDAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmFtcm5iLmRlY29kZXIiIHR5cGU9ImF1ZGlvLzNncHAiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuYW1ybmIuZGVjb2RlciIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNDc1MC0xMjIwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmFtcndiLmRlY29kZXIiIHR5cGU9ImF1ZGlvL2Ftci13YiI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5hbXJ3Yi5kZWNvZGVyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSIxNjAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNjYwMC0yMzg1MCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmFhYy5kZWNvZGVyIiB0eXBlPSJhdWRpby9tcDRhLWxhdG0iPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuYWFjLmRlY29kZXIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjczNTAsODAwMCwxMTAyNSwxMjAwMCwxNjAwMCwyMjA1MCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iODAwMC05NjAwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5nNzExLmFsYXcuZGVjb2RlciIgdHlwZT0iYXVkaW8vZzcxMS1hbGF3Ij4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmc3MTEuYWxhdy5kZWNvZGVyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLTQ4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI2NDAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmc3MTEubWxhdy5kZWNvZGVyIiB0eXBlPSJhdWRpby9nNzExLW1sYXciPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuZzcxMS5tbGF3LmRlY29kZXIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAtNDgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjY0MDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQudm9yYmlzLmRlY29kZXIiIHR5cGU9ImF1ZGlvL3ZvcmJpcyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS52b3JiaXMuZGVjb2RlciIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMC05NjAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMzIwMDAtNTAwMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQub3B1cy5kZWNvZGVyIiB0eXBlPSJhdWRpby9vcHVzIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLm9wdXMuZGVjb2RlciIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iNDgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjYwMDAtNTEwMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQucmF3LmRlY29kZXIiIHR5cGU9ImF1ZGlvL3JhdyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5yYXcuZGVjb2RlciIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMC05NjAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMDAwMDAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmZsYWMuZGVjb2RlciIgdHlwZT0iYXVkaW8vZmxhYyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5mbGFjLmRlY29kZXIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjEtNjU1MzUwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTIxMDAwMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuZ3NtLmRlY29kZXIiIHR5cGU9ImF1ZGlvL2dzbSIgZG9tYWluPSJ0ZWxlcGhvbnkiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuZ3NtLmRlY29kZXIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEzMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQubXBlZzQuZGVjb2RlciIgdHlwZT0idmlkZW8vbXA0di1lcyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5tcGVnNC5kZWNvZGVyIiAvPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZVNpbXBsZSA6IExldmVsMyAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIzNTJ4Mjg4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxMi0xMTg4MCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0zODQwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmgyNjMuZGVjb2RlciIgdHlwZT0idmlkZW8vM2dwcCI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5oMjYzLmRlY29kZXIiIC8+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDMwLCBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDQ1CisgICAgICAgICAgICAgICAgICAgIFByb2ZpbGVJU1dWMiA6IExldmVsMzAsIFByb2ZpbGVJU1dWMiA6IExldmVsNDUgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMzUyeDI4OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMzg0MDAwIiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hdmMuZGVjb2RlciIgdHlwZT0idmlkZW8vYXZjIiB2YXJpYW50PSJzbG93LWNwdSwhc2xvdy1jcHUiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuaDI2NC5kZWNvZGVyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8VmFyaWFudCBuYW1lPSIhc2xvdy1jcHUiPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSI0MDgweDQwODAiIC8+CisgICAgICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUhpZ2ggOiBMZXZlbDUyIC0tPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMzI3NjgiIC8+IDwhLS0gbWF4IDQwOTZ4MjA0OCBlcXVpdmFsZW50IC0tPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMTk2NjA4MCIgLz4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNDgwMDAwMDAiIC8+CisgICAgICAgICAgICA8L1ZhcmlhbnQ+CisgICAgICAgICAgICA8VmFyaWFudCBuYW1lPSJzbG93LWNwdSI+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KKyAgICAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlSGlnaCA6IExldmVsNTEgLS0+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS0xNjM4NCIgLz4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTQ5MTUyMCIgLz4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNDAwMDAwMDAiIC8+CisgICAgICAgICAgICA8L1ZhcmlhbnQ+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmhldmMuZGVjb2RlciIgdHlwZT0idmlkZW8vaGV2YyIgdmFyaWFudD0ic2xvdy1jcHUsIXNsb3ctY3B1Ij4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmhldmMuZGVjb2RlciIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9Ijh4OCIgLz4KKyAgICAgICAgICAgIDxWYXJpYW50IG5hbWU9IiFzbG93LWNwdSI+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjQwOTZ4NDA5NiIgLz4KKyAgICAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlTWFpbiA6IE1haW5UaWVyTGV2ZWw1MSAtLT4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTE5NjYwOCIgLz4gPCEtLSBtYXggNDA5NngzMDcyIC0tPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMjAwMDAwMCIgLz4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTAwMDAwMDAiIC8+CisgICAgICAgICAgICA8L1ZhcmlhbnQ+CisgICAgICAgICAgICA8VmFyaWFudCBuYW1lPSJzbG93LWNwdSI+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KKyAgICAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlTWFpbiA6IE1haW5UaWVyTGV2ZWw1MSAtLT4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTY1NTM2IiAvPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtNDkxNTIwIiAvPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS01MDAwMDAwIiAvPgorICAgICAgICAgICAgPC9WYXJpYW50PgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC52cDguZGVjb2RlciIgdHlwZT0idmlkZW8veC12bmQub24yLnZwOCIgdmFyaWFudD0ic2xvdy1jcHUsIXNsb3ctY3B1Ij4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLnZwOC5kZWNvZGVyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPFZhcmlhbnQgbmFtZT0iIXNsb3ctY3B1Ij4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTE2Mzg0IiAvPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMTAwMDAwMCIgLz4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNDAwMDAwMDAiIC8+CisgICAgICAgICAgICA8L1ZhcmlhbnQ+CisgICAgICAgICAgICA8VmFyaWFudCBuYW1lPSJzbG93LWNwdSI+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS04MTkyIiAvPiA8IS0tIG1heCAyMDQ4eDEwMjQgLS0+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0xMDAwMDAwIiAvPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00MDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDwvVmFyaWFudD4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQudnA5LmRlY29kZXIiIHR5cGU9InZpZGVvL3gtdm5kLm9uMi52cDkiIHZhcmlhbnQ9InNsb3ctY3B1LCFzbG93LWNwdSI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS52cDkuZGVjb2RlciIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPFZhcmlhbnQgbmFtZT0iIXNsb3ctY3B1Ij4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMjA0OHgyMDQ4IiAvPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMTYzODQiIC8+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS01MDAwMDAiIC8+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTQwMDAwMDAwIiAvPgorICAgICAgICAgICAgPC9WYXJpYW50PgorICAgICAgICAgICAgPFZhcmlhbnQgbmFtZT0ic2xvdy1jcHUiPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIxMjgweDEyODAiIC8+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS0zNjAwIiAvPiA8IS0tIG1heCAxMjgweDcyMCAtLT4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTEwODAwMCIgLz4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNTAwMDAwMCIgLz4KKyAgICAgICAgICAgIDwvVmFyaWFudD4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYXYxLmRlY29kZXIiIHR5cGU9InZpZGVvL2F2MDEiIHZhcmlhbnQ9IiFzbG93LWNwdSI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMTkyMHgxMDgwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTE2Mzg0IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0yMDczNjAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTEyMDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQubXBlZzIuZGVjb2RlciIgdHlwZT0idmlkZW8vbXBlZzIiIGRvbWFpbj0idHYiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUubXBlZzIuZGVjb2RlciIgLz4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTGV2ZWxITCAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE2eDE2IiBtYXg9IjE5MjB4MTA4OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0yNDQ4MDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMjAwMDAwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgIDwvRGVjb2RlcnM+CisgICAgPEVuY29kZXJzPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmFhYy5lbmNvZGVyIiB0eXBlPSJhdWRpby9tcDRhLWxhdG0iPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuYWFjLmVuY29kZXIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAsMTEwMjUsMTIwMDAsMTYwMDAsMjIwNTAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiIC8+CisgICAgICAgICAgICA8IS0tIGFsc28gbWF5IHN1cHBvcnQgNjQwMDAsIDg4MjAwICBhbmQgOTYwMDAgSHogLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjgwMDAtOTYwMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYW1ybmIuZW5jb2RlciIgdHlwZT0iYXVkaW8vM2dwcCI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5hbXJuYi5lbmNvZGVyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI0NzUwLTEyMjAwIiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IkNCUiIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmFtcndiLmVuY29kZXIiIHR5cGU9ImF1ZGlvL2Ftci13YiI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5hbXJ3Yi5lbmNvZGVyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSIxNjAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNjYwMC0yMzg1MCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImJpdHJhdGUtbW9kZXMiIHZhbHVlPSJDQlIiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5mbGFjLmVuY29kZXIiIHR5cGU9ImF1ZGlvL2ZsYWMiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuZmxhYy5lbmNvZGVyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSIxLTY1NTM1MCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0yMTAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjb21wbGV4aXR5IiByYW5nZT0iMC04IiAgZGVmYXVsdD0iNSIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImJpdHJhdGUtbW9kZXMiIHZhbHVlPSJDUSIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLm9wdXMuZW5jb2RlciIgdHlwZT0iYXVkaW8vb3B1cyI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAsMTIwMDAsMTYwMDAsMjQwMDAsNDgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjUwMC01MTIwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY29tcGxleGl0eSIgcmFuZ2U9IjAtMTAiICBkZWZhdWx0PSI1IiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IkNCUiIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmgyNjMuZW5jb2RlciIgdHlwZT0idmlkZW8vM2dwcCI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5oMjYzLmVuY29kZXIiIC8+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDQ1IC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMTc2eDE0NCIgbWF4PSIxNzZ4MTQ0IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTEyODAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLm1wZWc0LmVuY29kZXIiIHR5cGU9InZpZGVvL21wNHYtZXMiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUubXBlZzQuZW5jb2RlciIgLz4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVDb3JlIDogTGV2ZWwyIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMTZ4MTYiIG1heD0iMTc2eDE0NCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxMi0xNDg1IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTY0MDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYXZjLmVuY29kZXIiIHR5cGU9InZpZGVvL2F2YyIgdmFyaWFudD0ic2xvdy1jcHUsIXNsb3ctY3B1Ij4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmgyNjQuZW5jb2RlciIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPFZhcmlhbnQgbmFtZT0iIXNsb3ctY3B1Ij4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIxNngxNiIgbWF4PSIyMDQ4eDIwNDgiIC8+CisgICAgICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUJhc2VsaW5lIDogTGV2ZWw0MSAtLT4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTgxOTIiIC8+IDwhLS0gbWF4IDIwNDh4MTAyNCAtLT4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTI0NTc2MCIgLz4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTIwMDAwMDAiIC8+CisgICAgICAgICAgICA8L1ZhcmlhbnQ+CisgICAgICAgICAgICA8VmFyaWFudCBuYW1lPSJzbG93LWNwdSI+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMTZ4MTYiIG1heD0iMTgwOHgxODA4IiAvPgorICAgICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVCYXNlbGluZSA6IExldmVsMyAtLT4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTE2MjAiIC8+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS00MDUwMCIgLz4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMjAwMDAwMCIgLz4KKyAgICAgICAgICAgIDwvVmFyaWFudD4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImludHJhLXJlZnJlc2giIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC52cDguZW5jb2RlciIgdHlwZT0idmlkZW8veC12bmQub24yLnZwOCIgdmFyaWFudD0ic2xvdy1jcHUsIXNsb3ctY3B1Ij4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLnZwOC5lbmNvZGVyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8VmFyaWFudCBuYW1lPSIhc2xvdy1jcHUiPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CisgICAgICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBMZXZlbF9WZXJzaW9uMC0zIC0tPgorICAgICAgICAgICAgICAgIDwhLS0gMjAxNiBkZXZpY2VzIGNhbiBlbmNvZGUgYXQgYWJvdXQgMTBmcHMgYXQgdGhpcyBibG9jayBjb3VudCAtLT4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTE2Mzg0IiAvPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00MDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDwvVmFyaWFudD4KKyAgICAgICAgICAgIDxWYXJpYW50IG5hbWU9InNsb3ctY3B1Ij4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMTI4MHgxMjgwIiAvPgorICAgICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTGV2ZWxfVmVyc2lvbjAtMyAtLT4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTM2MDAiIC8+IDwhLS0gbWF4IDEyODB4NzIwIC0tPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0yMDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDwvVmFyaWFudD4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImJpdHJhdGUtbW9kZXMiIHZhbHVlPSJWQlIsQ0JSIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuaGV2Yy5lbmNvZGVyIiB0eXBlPSJ2aWRlby9oZXZjIiB2YXJpYW50PSIhc2xvdy1jcHUiPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBNYWluVGllckxldmVsNTEgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iNTEyeDUxMiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9Ijh4OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtNDA5NiIgLz4gPCEtLSBtYXggNTEyeDUxMiAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMTIyODgwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImZyYW1lLXJhdGUiIHJhbmdlPSIxLTEyMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjb21wbGV4aXR5IiByYW5nZT0iMC0xMCIgIGRlZmF1bHQ9IjAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0icXVhbGl0eSIgcmFuZ2U9IjAtMTAwIiAgZGVmYXVsdD0iODAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iVkJSLENCUixDUSIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLnZwOS5lbmNvZGVyIiB0eXBlPSJ2aWRlby94LXZuZC5vbjIudnA5IiB2YXJpYW50PSIhc2xvdy1jcHUiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUudnA5LmVuY29kZXIiIC8+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlTWFpbiA6IExldmVsX1ZlcnNpb24wLTMgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMjA0OHgyMDQ4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8IS0tIDIwMTYgZGV2aWNlcyBjYW4gZW5jb2RlIGF0IGFib3V0IDhmcHMgYXQgdGhpcyBibG9jayBjb3VudCAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMzYwMCIgLz4gPCEtLSBtYXggMTI4MHg3MjAgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNDAwMDAwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iVkJSLENCUiIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgIDwvRW5jb2RlcnM+Cis8L01lZGlhQ29kZWNzPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZXhwb3J0cy5sZHMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9leHBvcnRzLmxkcwppbmRleCA1OWRmYzQ5Li5hYWJjMjMzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9leHBvcnRzLmxkcworKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9leHBvcnRzLmxkcwpAQCAtOSw1MSArOSw1MSBAQAogICAgICAgICBfWk43YW5kcm9pZDE2U29mdHdhcmVSZW5kZXJlcio7CiAgICAgICAgIEFCR1JUb0FSR0I7CiAgICAgICAgIEFCR1JUb0k0MjA7Ci0gICAgICAgIEFCR1JUb1VWUm93X0FueV9ORU9OOworICAgICAgICBBQkdSVG9VVlJvd19BbnlfTkVPTio7CiAgICAgICAgIEFCR1JUb1VWUm93X0M7Ci0gICAgICAgIEFCR1JUb1VWUm93X05FT047Ci0gICAgICAgIEFCR1JUb1lSb3dfQW55X05FT047CisgICAgICAgIEFCR1JUb1VWUm93X05FT04qOworICAgICAgICBBQkdSVG9ZUm93X0FueV9ORU9OKjsKICAgICAgICAgQUJHUlRvWVJvd19DOwotICAgICAgICBBQkdSVG9ZUm93X05FT047CisgICAgICAgIEFCR1JUb1lSb3dfTkVPTio7CiAgICAgICAgIEFuZHJvaWQ0MjBUb0k0MjA7CiAgICAgICAgIEFSR0IxNTU1VG9BUkdCOwotICAgICAgICBBUkdCMTU1NVRvQVJHQlJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQjE1NTVUb0FSR0JSb3dfQW55X05FT04qOwogICAgICAgICBBUkdCMTU1NVRvQVJHQlJvd19DOwotICAgICAgICBBUkdCMTU1NVRvQVJHQlJvd19ORU9OOworICAgICAgICBBUkdCMTU1NVRvQVJHQlJvd19ORU9OKjsKICAgICAgICAgQVJHQjE1NTVUb0k0MjA7Ci0gICAgICAgIEFSR0IxNTU1VG9VVlJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQjE1NTVUb1VWUm93X0FueV9ORU9OKjsKICAgICAgICAgQVJHQjE1NTVUb1VWUm93X0M7Ci0gICAgICAgIEFSR0IxNTU1VG9VVlJvd19ORU9OOwotICAgICAgICBBUkdCMTU1NVRvWVJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQjE1NTVUb1VWUm93X05FT04qOworICAgICAgICBBUkdCMTU1NVRvWVJvd19BbnlfTkVPTio7CiAgICAgICAgIEFSR0IxNTU1VG9ZUm93X0M7Ci0gICAgICAgIEFSR0IxNTU1VG9ZUm93X05FT047CisgICAgICAgIEFSR0IxNTU1VG9ZUm93X05FT04qOwogICAgICAgICBBUkdCNDQ0NFRvQVJHQjsKLSAgICAgICAgQVJHQjQ0NDRUb0FSR0JSb3dfQW55X05FT047CisgICAgICAgIEFSR0I0NDQ0VG9BUkdCUm93X0FueV9ORU9OKjsKICAgICAgICAgQVJHQjQ0NDRUb0FSR0JSb3dfQzsKLSAgICAgICAgQVJHQjQ0NDRUb0FSR0JSb3dfTkVPTjsKKyAgICAgICAgQVJHQjQ0NDRUb0FSR0JSb3dfTkVPTio7CiAgICAgICAgIEFSR0I0NDQ0VG9JNDIwOwotICAgICAgICBBUkdCNDQ0NFRvVVZSb3dfQW55X05FT047CisgICAgICAgIEFSR0I0NDQ0VG9VVlJvd19BbnlfTkVPTio7CiAgICAgICAgIEFSR0I0NDQ0VG9VVlJvd19DOwotICAgICAgICBBUkdCNDQ0NFRvVVZSb3dfTkVPTjsKLSAgICAgICAgQVJHQjQ0NDRUb1lSb3dfQW55X05FT047CisgICAgICAgIEFSR0I0NDQ0VG9VVlJvd19ORU9OKjsKKyAgICAgICAgQVJHQjQ0NDRUb1lSb3dfQW55X05FT04qOwogICAgICAgICBBUkdCNDQ0NFRvWVJvd19DOwotICAgICAgICBBUkdCNDQ0NFRvWVJvd19ORU9OOworICAgICAgICBBUkdCNDQ0NFRvWVJvd19ORU9OKjsKICAgICAgICAgQVJHQkFkZDsKLSAgICAgICAgQVJHQkFkZFJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQkFkZFJvd19BbnlfTkVPTio7CiAgICAgICAgIEFSR0JBZGRSb3dfQzsKLSAgICAgICAgQVJHQkFkZFJvd19ORU9OOworICAgICAgICBBUkdCQWRkUm93X05FT04qOwogICAgICAgICBBUkdCQWZmaW5lUm93X0M7CiAgICAgICAgIEFSR0JBdHRlbnVhdGU7Ci0gICAgICAgIEFSR0JBdHRlbnVhdGVSb3dfQW55X05FT047CisgICAgICAgIEFSR0JBdHRlbnVhdGVSb3dfQW55X05FT04qOwogICAgICAgICBBUkdCQXR0ZW51YXRlUm93X0M7Ci0gICAgICAgIEFSR0JBdHRlbnVhdGVSb3dfTkVPTjsKKyAgICAgICAgQVJHQkF0dGVudWF0ZVJvd19ORU9OKjsKICAgICAgICAgQVJHQkJsZW5kOwogICAgICAgICBBUkdCQmxlbmRSb3dfQzsKLSAgICAgICAgQVJHQkJsZW5kUm93X05FT047CisgICAgICAgIEFSR0JCbGVuZFJvd19ORU9OKjsKICAgICAgICAgQVJHQkJsdXI7CiAgICAgICAgIEFSR0JDb2xvck1hdHJpeDsKICAgICAgICAgQVJHQkNvbG9yTWF0cml4Um93X0M7Ci0gICAgICAgIEFSR0JDb2xvck1hdHJpeFJvd19ORU9OOworICAgICAgICBBUkdCQ29sb3JNYXRyaXhSb3dfTkVPTio7CiAgICAgICAgIEFSR0JDb2xvclRhYmxlOwogICAgICAgICBBUkdCQ29sb3JUYWJsZVJvd19DOwogICAgICAgICBBUkdCQ29tcHV0ZUN1bXVsYXRpdmVTdW07CkBAIC02Myw5NyArNjMsOTcgQEAKICAgICAgICAgQVJHQkNvcHlZVG9BbHBoYTsKICAgICAgICAgQVJHQkNvcHlZVG9BbHBoYVJvd19DOwogICAgICAgICBBUkdCRXh0cmFjdEFscGhhOwotICAgICAgICBBUkdCRXh0cmFjdEFscGhhUm93X0FueV9ORU9OOworICAgICAgICBBUkdCRXh0cmFjdEFscGhhUm93X0FueV9ORU9OKjsKICAgICAgICAgQVJHQkV4dHJhY3RBbHBoYVJvd19DOwotICAgICAgICBBUkdCRXh0cmFjdEFscGhhUm93X05FT047CisgICAgICAgIEFSR0JFeHRyYWN0QWxwaGFSb3dfTkVPTio7CiAgICAgICAgIEFSR0JHcmF5OwogICAgICAgICBBUkdCR3JheVJvd19DOwotICAgICAgICBBUkdCR3JheVJvd19ORU9OOworICAgICAgICBBUkdCR3JheVJvd19ORU9OKjsKICAgICAgICAgQVJHQkdyYXlUbzsKICAgICAgICAgQVJHQkludGVycG9sYXRlOwogICAgICAgICBBUkdCTHVtYUNvbG9yVGFibGU7CiAgICAgICAgIEFSR0JMdW1hQ29sb3JUYWJsZVJvd19DOwogICAgICAgICBBUkdCTWlycm9yOwotICAgICAgICBBUkdCTWlycm9yUm93X0FueV9ORU9OOworICAgICAgICBBUkdCTWlycm9yUm93X0FueV9ORU9OKjsKICAgICAgICAgQVJHQk1pcnJvclJvd19DOwotICAgICAgICBBUkdCTWlycm9yUm93X05FT047CisgICAgICAgIEFSR0JNaXJyb3JSb3dfTkVPTio7CiAgICAgICAgIEFSR0JNdWx0aXBseTsKLSAgICAgICAgQVJHQk11bHRpcGx5Um93X0FueV9ORU9OOworICAgICAgICBBUkdCTXVsdGlwbHlSb3dfQW55X05FT04qOwogICAgICAgICBBUkdCTXVsdGlwbHlSb3dfQzsKLSAgICAgICAgQVJHQk11bHRpcGx5Um93X05FT047CisgICAgICAgIEFSR0JNdWx0aXBseVJvd19ORU9OKjsKICAgICAgICAgQVJHQlBvbHlub21pYWw7CiAgICAgICAgIEFSR0JQb2x5bm9taWFsUm93X0M7CiAgICAgICAgIEFSR0JRdWFudGl6ZTsKICAgICAgICAgQVJHQlF1YW50aXplUm93X0M7Ci0gICAgICAgIEFSR0JRdWFudGl6ZVJvd19ORU9OOworICAgICAgICBBUkdCUXVhbnRpemVSb3dfTkVPTio7CiAgICAgICAgIEFSR0JSZWN0OwogICAgICAgICBBUkdCU2VwaWE7CiAgICAgICAgIEFSR0JTZXBpYVJvd19DOwotICAgICAgICBBUkdCU2VwaWFSb3dfTkVPTjsKLSAgICAgICAgQVJHQlNldFJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQlNlcGlhUm93X05FT04qOworICAgICAgICBBUkdCU2V0Um93X0FueV9ORU9OKjsKICAgICAgICAgQVJHQlNldFJvd19DOwotICAgICAgICBBUkdCU2V0Um93X05FT047CisgICAgICAgIEFSR0JTZXRSb3dfTkVPTio7CiAgICAgICAgIEFSR0JTaGFkZTsKICAgICAgICAgQVJHQlNoYWRlUm93X0M7Ci0gICAgICAgIEFSR0JTaGFkZVJvd19ORU9OOworICAgICAgICBBUkdCU2hhZGVSb3dfTkVPTio7CiAgICAgICAgIEFSR0JTaHVmZmxlOwotICAgICAgICBBUkdCU2h1ZmZsZVJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQlNodWZmbGVSb3dfQW55X05FT04qOwogICAgICAgICBBUkdCU2h1ZmZsZVJvd19DOwotICAgICAgICBBUkdCU2h1ZmZsZVJvd19ORU9OOworICAgICAgICBBUkdCU2h1ZmZsZVJvd19ORU9OKjsKICAgICAgICAgQVJHQlNvYmVsOwogICAgICAgICBBUkdCU29iZWxUb1BsYW5lOwogICAgICAgICBBUkdCU29iZWxYWTsKICAgICAgICAgQVJHQlN1YnRyYWN0OwotICAgICAgICBBUkdCU3VidHJhY3RSb3dfQW55X05FT047CisgICAgICAgIEFSR0JTdWJ0cmFjdFJvd19BbnlfTkVPTio7CiAgICAgICAgIEFSR0JTdWJ0cmFjdFJvd19DOwotICAgICAgICBBUkdCU3VidHJhY3RSb3dfTkVPTjsKKyAgICAgICAgQVJHQlN1YnRyYWN0Um93X05FT04qOwogICAgICAgICBBUkdCVG9BQkdSOwotICAgICAgICBBUkdCVG9BUkdCMTU1NVJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQlRvQVJHQjE1NTVSb3dfQW55X05FT04qOwogICAgICAgICBBUkdCVG9BUkdCMTU1NVJvd19DOwotICAgICAgICBBUkdCVG9BUkdCMTU1NVJvd19ORU9OOwotICAgICAgICBBUkdCVG9BUkdCNDQ0NFJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQlRvQVJHQjE1NTVSb3dfTkVPTio7CisgICAgICAgIEFSR0JUb0FSR0I0NDQ0Um93X0FueV9ORU9OKjsKICAgICAgICAgQVJHQlRvQVJHQjQ0NDRSb3dfQzsKLSAgICAgICAgQVJHQlRvQVJHQjQ0NDRSb3dfTkVPTjsKKyAgICAgICAgQVJHQlRvQVJHQjQ0NDRSb3dfTkVPTio7CiAgICAgICAgIEFSR0JUb0JHUkE7CiAgICAgICAgIEFSR0JUb0k0MjA7Ci0gICAgICAgIEFSR0JUb1JBV1Jvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQlRvUkFXUm93X0FueV9ORU9OKjsKICAgICAgICAgQVJHQlRvUkFXUm93X0M7Ci0gICAgICAgIEFSR0JUb1JBV1Jvd19ORU9OOwotICAgICAgICBBUkdCVG9SR0IyNFJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQlRvUkFXUm93X05FT04qOworICAgICAgICBBUkdCVG9SR0IyNFJvd19BbnlfTkVPTio7CiAgICAgICAgIEFSR0JUb1JHQjI0Um93X0M7Ci0gICAgICAgIEFSR0JUb1JHQjI0Um93X05FT047Ci0gICAgICAgIEFSR0JUb1JHQjU2NURpdGhlclJvd19BbnlfTkVPTjsKKyAgICAgICAgQVJHQlRvUkdCMjRSb3dfTkVPTio7CisgICAgICAgIEFSR0JUb1JHQjU2NURpdGhlclJvd19BbnlfTkVPTio7CiAgICAgICAgIEFSR0JUb1JHQjU2NURpdGhlclJvd19DOwotICAgICAgICBBUkdCVG9SR0I1NjVEaXRoZXJSb3dfTkVPTjsKLSAgICAgICAgQVJHQlRvUkdCNTY1Um93X0FueV9ORU9OOworICAgICAgICBBUkdCVG9SR0I1NjVEaXRoZXJSb3dfTkVPTio7CisgICAgICAgIEFSR0JUb1JHQjU2NVJvd19BbnlfTkVPTio7CiAgICAgICAgIEFSR0JUb1JHQjU2NVJvd19DOwotICAgICAgICBBUkdCVG9SR0I1NjVSb3dfTkVPTjsKLSAgICAgICAgQVJHQlRvVVY0NDRSb3dfQW55X05FT047CisgICAgICAgIEFSR0JUb1JHQjU2NVJvd19ORU9OKjsKKyAgICAgICAgQVJHQlRvVVY0NDRSb3dfQW55X05FT04qOwogICAgICAgICBBUkdCVG9VVjQ0NFJvd19DOwotICAgICAgICBBUkdCVG9VVjQ0NFJvd19ORU9OOwotICAgICAgICBBUkdCVG9VVkpSb3dfQW55X05FT047CisgICAgICAgIEFSR0JUb1VWNDQ0Um93X05FT04qOworICAgICAgICBBUkdCVG9VVkpSb3dfQW55X05FT04qOwogICAgICAgICBBUkdCVG9VVkpSb3dfQzsKLSAgICAgICAgQVJHQlRvVVZKUm93X05FT047Ci0gICAgICAgIEFSR0JUb1VWUm93X0FueV9ORU9OOworICAgICAgICBBUkdCVG9VVkpSb3dfTkVPTio7CisgICAgICAgIEFSR0JUb1VWUm93X0FueV9ORU9OKjsKICAgICAgICAgQVJHQlRvVVZSb3dfQzsKLSAgICAgICAgQVJHQlRvVVZSb3dfTkVPTjsKLSAgICAgICAgQVJHQlRvWUpSb3dfQW55X05FT047CisgICAgICAgIEFSR0JUb1VWUm93X05FT04qOworICAgICAgICBBUkdCVG9ZSlJvd19BbnlfTkVPTio7CiAgICAgICAgIEFSR0JUb1lKUm93X0M7Ci0gICAgICAgIEFSR0JUb1lKUm93X05FT047Ci0gICAgICAgIEFSR0JUb1lSb3dfQW55X05FT047CisgICAgICAgIEFSR0JUb1lKUm93X05FT04qOworICAgICAgICBBUkdCVG9ZUm93X0FueV9ORU9OKjsKICAgICAgICAgQVJHQlRvWVJvd19DOwotICAgICAgICBBUkdCVG9ZUm93X05FT047CisgICAgICAgIEFSR0JUb1lSb3dfTkVPTio7CiAgICAgICAgIEFSR0JVbmF0dGVudWF0ZTsKICAgICAgICAgQVJHQlVuYXR0ZW51YXRlUm93X0M7Ci0gICAgICAgIEFybUNwdUNhcHM7CisgICAgICAgIEFybUNwdUNhcHMqOwogICAgICAgICBCR1JBVG9BUkdCOwogICAgICAgICBCR1JBVG9JNDIwOwotICAgICAgICBCR1JBVG9VVlJvd19BbnlfTkVPTjsKKyAgICAgICAgQkdSQVRvVVZSb3dfQW55X05FT04qOwogICAgICAgICBCR1JBVG9VVlJvd19DOwotICAgICAgICBCR1JBVG9VVlJvd19ORU9OOwotICAgICAgICBCR1JBVG9ZUm93X0FueV9ORU9OOworICAgICAgICBCR1JBVG9VVlJvd19ORU9OKjsKKyAgICAgICAgQkdSQVRvWVJvd19BbnlfTkVPTio7CiAgICAgICAgIEJHUkFUb1lSb3dfQzsKLSAgICAgICAgQkdSQVRvWVJvd19ORU9OOworICAgICAgICBCR1JBVG9ZUm93X05FT04qOwogICAgICAgICBCbGVuZFBsYW5lOwogICAgICAgICBCbGVuZFBsYW5lUm93X0M7CiAgICAgICAgIENhbm9uaWNhbEZvdXJDQzsKQEAgLTE2MiwxMSArMTYyLDExIEBACiAgICAgICAgIENvcHlQbGFuZTsKICAgICAgICAgQ29weVBsYW5lXzE2OwogICAgICAgICBDb3B5Um93XzE2X0M7Ci0gICAgICAgIENvcHlSb3dfQW55X05FT047CisgICAgICAgIENvcHlSb3dfQW55X05FT04qOwogICAgICAgICBDb3B5Um93X0M7Ci0gICAgICAgIENvcHlSb3dfTkVPTjsKLSAgICAgICAgQ3B1SWQ7Ci0gICAgICAgIGNwdV9pbmZvXzsKKyAgICAgICAgQ29weVJvd19ORU9OKjsKKyAgICAgICAgQ3B1SWQqOworICAgICAgICBjcHVfaW5mb18qOwogICAgICAgICBDdW11bGF0aXZlU3VtVG9BdmVyYWdlUm93X0M7CiAgICAgICAgIEZpeGVkRGl2MV9DOwogICAgICAgICBGaXhlZERpdl9DOwpAQCAtMTc2LDE4ICsxNzYsMTggQEAKICAgICAgICAgSDQyMFRvQVJHQjsKICAgICAgICAgSDQyMlRvQUJHUjsKICAgICAgICAgSDQyMlRvQVJHQjsKLSAgICAgICAgSGFsZkZsb2F0MVJvd19BbnlfTkVPTjsKLSAgICAgICAgSGFsZkZsb2F0MVJvd19ORU9OOworICAgICAgICBIYWxmRmxvYXQxUm93X0FueV9ORU9OKjsKKyAgICAgICAgSGFsZkZsb2F0MVJvd19ORU9OKjsKICAgICAgICAgSGFsZkZsb2F0UGxhbmU7Ci0gICAgICAgIEhhbGZGbG9hdFJvd19BbnlfTkVPTjsKKyAgICAgICAgSGFsZkZsb2F0Um93X0FueV9ORU9OKjsKICAgICAgICAgSGFsZkZsb2F0Um93X0M7Ci0gICAgICAgIEhhbGZGbG9hdFJvd19ORU9OOworICAgICAgICBIYWxmRmxvYXRSb3dfTkVPTio7CiAgICAgICAgIEk0MDBDb3B5OwogICAgICAgICBJNDAwTWlycm9yOwogICAgICAgICBJNDAwVG9BUkdCOwotICAgICAgICBJNDAwVG9BUkdCUm93X0FueV9ORU9OOworICAgICAgICBJNDAwVG9BUkdCUm93X0FueV9ORU9OKjsKICAgICAgICAgSTQwMFRvQVJHQlJvd19DOwotICAgICAgICBJNDAwVG9BUkdCUm93X05FT047CisgICAgICAgIEk0MDBUb0FSR0JSb3dfTkVPTio7CiAgICAgICAgIEk0MDBUb0k0MDA7CiAgICAgICAgIEk0MDBUb0k0MjA7CiAgICAgICAgIEk0MjBBbHBoYVRvQUJHUjsKQEAgLTIxNiw1OSArMjE2LDU5IEBACiAgICAgICAgIEk0MjBUb1JHQkE7CiAgICAgICAgIEk0MjBUb1VZVlk7CiAgICAgICAgIEk0MjBUb1lVWTI7Ci0gICAgICAgIEk0MjJBbHBoYVRvQVJHQlJvd19BbnlfTkVPTjsKKyAgICAgICAgSTQyMkFscGhhVG9BUkdCUm93X0FueV9ORU9OKjsKICAgICAgICAgSTQyMkFscGhhVG9BUkdCUm93X0M7Ci0gICAgICAgIEk0MjJBbHBoYVRvQVJHQlJvd19ORU9OOworICAgICAgICBJNDIyQWxwaGFUb0FSR0JSb3dfTkVPTio7CiAgICAgICAgIEk0MjJDb3B5OwogICAgICAgICBJNDIyVG9BQkdSOwogICAgICAgICBJNDIyVG9BUkdCOwotICAgICAgICBJNDIyVG9BUkdCMTU1NVJvd19BbnlfTkVPTjsKKyAgICAgICAgSTQyMlRvQVJHQjE1NTVSb3dfQW55X05FT04qOwogICAgICAgICBJNDIyVG9BUkdCMTU1NVJvd19DOwotICAgICAgICBJNDIyVG9BUkdCMTU1NVJvd19ORU9OOwotICAgICAgICBJNDIyVG9BUkdCNDQ0NFJvd19BbnlfTkVPTjsKKyAgICAgICAgSTQyMlRvQVJHQjE1NTVSb3dfTkVPTio7CisgICAgICAgIEk0MjJUb0FSR0I0NDQ0Um93X0FueV9ORU9OKjsKICAgICAgICAgSTQyMlRvQVJHQjQ0NDRSb3dfQzsKLSAgICAgICAgSTQyMlRvQVJHQjQ0NDRSb3dfTkVPTjsKLSAgICAgICAgSTQyMlRvQVJHQlJvd19BbnlfTkVPTjsKKyAgICAgICAgSTQyMlRvQVJHQjQ0NDRSb3dfTkVPTio7CisgICAgICAgIEk0MjJUb0FSR0JSb3dfQW55X05FT04qOwogICAgICAgICBJNDIyVG9BUkdCUm93X0M7Ci0gICAgICAgIEk0MjJUb0FSR0JSb3dfTkVPTjsKKyAgICAgICAgSTQyMlRvQVJHQlJvd19ORU9OKjsKICAgICAgICAgSTQyMlRvQkdSQTsKICAgICAgICAgSTQyMlRvSTQyMDsKLSAgICAgICAgSTQyMlRvUkdCMjRSb3dfQW55X05FT047CisgICAgICAgIEk0MjJUb1JHQjI0Um93X0FueV9ORU9OKjsKICAgICAgICAgSTQyMlRvUkdCMjRSb3dfQzsKLSAgICAgICAgSTQyMlRvUkdCMjRSb3dfTkVPTjsKKyAgICAgICAgSTQyMlRvUkdCMjRSb3dfTkVPTio7CiAgICAgICAgIEk0MjJUb1JHQjU2NTsKLSAgICAgICAgSTQyMlRvUkdCNTY1Um93X0FueV9ORU9OOworICAgICAgICBJNDIyVG9SR0I1NjVSb3dfQW55X05FT04qOwogICAgICAgICBJNDIyVG9SR0I1NjVSb3dfQzsKLSAgICAgICAgSTQyMlRvUkdCNTY1Um93X05FT047CisgICAgICAgIEk0MjJUb1JHQjU2NVJvd19ORU9OKjsKICAgICAgICAgSTQyMlRvUkdCQTsKLSAgICAgICAgSTQyMlRvUkdCQVJvd19BbnlfTkVPTjsKKyAgICAgICAgSTQyMlRvUkdCQVJvd19BbnlfTkVPTio7CiAgICAgICAgIEk0MjJUb1JHQkFSb3dfQzsKLSAgICAgICAgSTQyMlRvUkdCQVJvd19ORU9OOworICAgICAgICBJNDIyVG9SR0JBUm93X05FT04qOwogICAgICAgICBJNDIyVG9VWVZZOwotICAgICAgICBJNDIyVG9VWVZZUm93X0FueV9ORU9OOworICAgICAgICBJNDIyVG9VWVZZUm93X0FueV9ORU9OKjsKICAgICAgICAgSTQyMlRvVVlWWVJvd19DOwotICAgICAgICBJNDIyVG9VWVZZUm93X05FT047CisgICAgICAgIEk0MjJUb1VZVllSb3dfTkVPTio7CiAgICAgICAgIEk0MjJUb1lVWTI7Ci0gICAgICAgIEk0MjJUb1lVWTJSb3dfQW55X05FT047CisgICAgICAgIEk0MjJUb1lVWTJSb3dfQW55X05FT04qOwogICAgICAgICBJNDIyVG9ZVVkyUm93X0M7Ci0gICAgICAgIEk0MjJUb1lVWTJSb3dfTkVPTjsKKyAgICAgICAgSTQyMlRvWVVZMlJvd19ORU9OKjsKICAgICAgICAgSTQ0NENvcHk7CiAgICAgICAgIEk0NDRUb0FCR1I7CiAgICAgICAgIEk0NDRUb0FSR0I7Ci0gICAgICAgIEk0NDRUb0FSR0JSb3dfQW55X05FT047CisgICAgICAgIEk0NDRUb0FSR0JSb3dfQW55X05FT04qOwogICAgICAgICBJNDQ0VG9BUkdCUm93X0M7Ci0gICAgICAgIEk0NDRUb0FSR0JSb3dfTkVPTjsKKyAgICAgICAgSTQ0NFRvQVJHQlJvd19ORU9OKjsKICAgICAgICAgSTQ0NFRvSTQyMDsKLSAgICAgICAgSW5pdENwdUZsYWdzOworICAgICAgICBJbml0Q3B1RmxhZ3MqOwogICAgICAgICBJbnRlcnBvbGF0ZVBsYW5lOwogICAgICAgICBJbnRlcnBvbGF0ZVJvd18xNl9DOwotICAgICAgICBJbnRlcnBvbGF0ZVJvd19BbnlfTkVPTjsKKyAgICAgICAgSW50ZXJwb2xhdGVSb3dfQW55X05FT04qOwogICAgICAgICBJbnRlcnBvbGF0ZVJvd19DOwotICAgICAgICBJbnRlcnBvbGF0ZVJvd19ORU9OOworICAgICAgICBJbnRlcnBvbGF0ZVJvd19ORU9OKjsKICAgICAgICAgSjQwMFRvQVJHQjsKLSAgICAgICAgSjQwMFRvQVJHQlJvd19BbnlfTkVPTjsKKyAgICAgICAgSjQwMFRvQVJHQlJvd19BbnlfTkVPTio7CiAgICAgICAgIEo0MDBUb0FSR0JSb3dfQzsKLSAgICAgICAgSjQwMFRvQVJHQlJvd19ORU9OOworICAgICAgICBKNDAwVG9BUkdCUm93X05FT04qOwogICAgICAgICBKNDIwVG9BQkdSOwogICAgICAgICBKNDIwVG9BUkdCOwogICAgICAgICBKNDIyVG9BQkdSOwpAQCAtMjgyLDEwNyArMjgyLDEwNyBAQAogICAgICAgICBrWXZ1SlBFR0NvbnN0YW50czsKICAgICAgICAgTTQyMFRvQVJHQjsKICAgICAgICAgTTQyMFRvSTQyMDsKLSAgICAgICAgTWFza0NwdUZsYWdzOworICAgICAgICBNYXNrQ3B1RmxhZ3MqOwogICAgICAgICBNZXJnZVVWUGxhbmU7Ci0gICAgICAgIE1lcmdlVVZSb3dfQW55X05FT047CisgICAgICAgIE1lcmdlVVZSb3dfQW55X05FT04qOwogICAgICAgICBNZXJnZVVWUm93X0M7Ci0gICAgICAgIE1lcmdlVVZSb3dfTkVPTjsKLSAgICAgICAgTWlwc0NwdUNhcHM7CisgICAgICAgIE1lcmdlVVZSb3dfTkVPTio7CisgICAgICAgIE1pcHNDcHVDYXBzKjsKICAgICAgICAgTWlycm9yUGxhbmU7Ci0gICAgICAgIE1pcnJvclJvd19BbnlfTkVPTjsKKyAgICAgICAgTWlycm9yUm93X0FueV9ORU9OKjsKICAgICAgICAgTWlycm9yUm93X0M7Ci0gICAgICAgIE1pcnJvclJvd19ORU9OOworICAgICAgICBNaXJyb3JSb3dfTkVPTio7CiAgICAgICAgIE1pcnJvclVWUm93X0M7Ci0gICAgICAgIE1pcnJvclVWUm93X05FT047Ci0gICAgICAgIE5WMTJUb0FSR0JSb3dfQW55X05FT047CisgICAgICAgIE1pcnJvclVWUm93X05FT04qOworICAgICAgICBOVjEyVG9BUkdCUm93X0FueV9ORU9OKjsKICAgICAgICAgTlYxMlRvQVJHQlJvd19DOwotICAgICAgICBOVjEyVG9BUkdCUm93X05FT047CisgICAgICAgIE5WMTJUb0FSR0JSb3dfTkVPTio7CiAgICAgICAgIE5WMTJUb0k0MjA7CiAgICAgICAgIE5WMTJUb1JHQjU2NTsKLSAgICAgICAgTlYxMlRvUkdCNTY1Um93X0FueV9ORU9OOworICAgICAgICBOVjEyVG9SR0I1NjVSb3dfQW55X05FT04qOwogICAgICAgICBOVjEyVG9SR0I1NjVSb3dfQzsKLSAgICAgICAgTlYxMlRvUkdCNTY1Um93X05FT047CisgICAgICAgIE5WMTJUb1JHQjU2NVJvd19ORU9OKjsKICAgICAgICAgTlYyMVRvQVJHQjsKLSAgICAgICAgTlYyMVRvQVJHQlJvd19BbnlfTkVPTjsKKyAgICAgICAgTlYyMVRvQVJHQlJvd19BbnlfTkVPTio7CiAgICAgICAgIE5WMjFUb0FSR0JSb3dfQzsKLSAgICAgICAgTlYyMVRvQVJHQlJvd19ORU9OOworICAgICAgICBOVjIxVG9BUkdCUm93X05FT04qOwogICAgICAgICBOVjIxVG9JNDIwOwogICAgICAgICBSQVdUb0FSR0I7Ci0gICAgICAgIFJBV1RvQVJHQlJvd19BbnlfTkVPTjsKKyAgICAgICAgUkFXVG9BUkdCUm93X0FueV9ORU9OKjsKICAgICAgICAgUkFXVG9BUkdCUm93X0M7Ci0gICAgICAgIFJBV1RvQVJHQlJvd19ORU9OOworICAgICAgICBSQVdUb0FSR0JSb3dfTkVPTio7CiAgICAgICAgIFJBV1RvSTQyMDsKICAgICAgICAgUkFXVG9SR0IyNDsKLSAgICAgICAgUkFXVG9SR0IyNFJvd19BbnlfTkVPTjsKKyAgICAgICAgUkFXVG9SR0IyNFJvd19BbnlfTkVPTio7CiAgICAgICAgIFJBV1RvUkdCMjRSb3dfQzsKLSAgICAgICAgUkFXVG9SR0IyNFJvd19ORU9OOwotICAgICAgICBSQVdUb1VWUm93X0FueV9ORU9OOworICAgICAgICBSQVdUb1JHQjI0Um93X05FT04qOworICAgICAgICBSQVdUb1VWUm93X0FueV9ORU9OKjsKICAgICAgICAgUkFXVG9VVlJvd19DOwotICAgICAgICBSQVdUb1VWUm93X05FT047Ci0gICAgICAgIFJBV1RvWVJvd19BbnlfTkVPTjsKKyAgICAgICAgUkFXVG9VVlJvd19ORU9OKjsKKyAgICAgICAgUkFXVG9ZUm93X0FueV9ORU9OKjsKICAgICAgICAgUkFXVG9ZUm93X0M7Ci0gICAgICAgIFJBV1RvWVJvd19ORU9OOworICAgICAgICBSQVdUb1lSb3dfTkVPTio7CiAgICAgICAgIFJHQjI0VG9BUkdCOwotICAgICAgICBSR0IyNFRvQVJHQlJvd19BbnlfTkVPTjsKKyAgICAgICAgUkdCMjRUb0FSR0JSb3dfQW55X05FT04qOwogICAgICAgICBSR0IyNFRvQVJHQlJvd19DOwotICAgICAgICBSR0IyNFRvQVJHQlJvd19ORU9OOworICAgICAgICBSR0IyNFRvQVJHQlJvd19ORU9OKjsKICAgICAgICAgUkdCMjRUb0k0MjA7Ci0gICAgICAgIFJHQjI0VG9VVlJvd19BbnlfTkVPTjsKKyAgICAgICAgUkdCMjRUb1VWUm93X0FueV9ORU9OKjsKICAgICAgICAgUkdCMjRUb1VWUm93X0M7Ci0gICAgICAgIFJHQjI0VG9VVlJvd19ORU9OOwotICAgICAgICBSR0IyNFRvWVJvd19BbnlfTkVPTjsKKyAgICAgICAgUkdCMjRUb1VWUm93X05FT04qOworICAgICAgICBSR0IyNFRvWVJvd19BbnlfTkVPTio7CiAgICAgICAgIFJHQjI0VG9ZUm93X0M7Ci0gICAgICAgIFJHQjI0VG9ZUm93X05FT047CisgICAgICAgIFJHQjI0VG9ZUm93X05FT04qOwogICAgICAgICBSR0I1NjVUb0FSR0I7Ci0gICAgICAgIFJHQjU2NVRvQVJHQlJvd19BbnlfTkVPTjsKKyAgICAgICAgUkdCNTY1VG9BUkdCUm93X0FueV9ORU9OKjsKICAgICAgICAgUkdCNTY1VG9BUkdCUm93X0M7Ci0gICAgICAgIFJHQjU2NVRvQVJHQlJvd19ORU9OOworICAgICAgICBSR0I1NjVUb0FSR0JSb3dfTkVPTio7CiAgICAgICAgIFJHQjU2NVRvSTQyMDsKLSAgICAgICAgUkdCNTY1VG9VVlJvd19BbnlfTkVPTjsKKyAgICAgICAgUkdCNTY1VG9VVlJvd19BbnlfTkVPTio7CiAgICAgICAgIFJHQjU2NVRvVVZSb3dfQzsKLSAgICAgICAgUkdCNTY1VG9VVlJvd19ORU9OOwotICAgICAgICBSR0I1NjVUb1lSb3dfQW55X05FT047CisgICAgICAgIFJHQjU2NVRvVVZSb3dfTkVPTio7CisgICAgICAgIFJHQjU2NVRvWVJvd19BbnlfTkVPTio7CiAgICAgICAgIFJHQjU2NVRvWVJvd19DOwotICAgICAgICBSR0I1NjVUb1lSb3dfTkVPTjsKKyAgICAgICAgUkdCNTY1VG9ZUm93X05FT04qOwogICAgICAgICBSR0JBVG9BUkdCOwogICAgICAgICBSR0JBVG9JNDIwOwotICAgICAgICBSR0JBVG9VVlJvd19BbnlfTkVPTjsKKyAgICAgICAgUkdCQVRvVVZSb3dfQW55X05FT04qOwogICAgICAgICBSR0JBVG9VVlJvd19DOwotICAgICAgICBSR0JBVG9VVlJvd19ORU9OOwotICAgICAgICBSR0JBVG9ZUm93X0FueV9ORU9OOworICAgICAgICBSR0JBVG9VVlJvd19ORU9OKjsKKyAgICAgICAgUkdCQVRvWVJvd19BbnlfTkVPTio7CiAgICAgICAgIFJHQkFUb1lSb3dfQzsKLSAgICAgICAgUkdCQVRvWVJvd19ORU9OOworICAgICAgICBSR0JBVG9ZUm93X05FT04qOwogICAgICAgICBSR0JDb2xvck1hdHJpeDsKICAgICAgICAgUkdCQ29sb3JUYWJsZTsKICAgICAgICAgUkdCQ29sb3JUYWJsZVJvd19DOwogICAgICAgICBTY2FsZTsKICAgICAgICAgU2NhbGVBZGRSb3dfMTZfQzsKICAgICAgICAgU2NhbGVBZGRSb3dfQzsKLSAgICAgICAgU2NhbGVBZGRSb3dzX05FT047CisgICAgICAgIFNjYWxlQWRkUm93c19ORU9OKjsKICAgICAgICAgU2NhbGVBUkdCQ29sczY0X0M7Ci0gICAgICAgIFNjYWxlQVJHQkNvbHNfQW55X05FT047CisgICAgICAgIFNjYWxlQVJHQkNvbHNfQW55X05FT04qOwogICAgICAgICBTY2FsZUFSR0JDb2xzX0M7Ci0gICAgICAgIFNjYWxlQVJHQkNvbHNfTkVPTjsKKyAgICAgICAgU2NhbGVBUkdCQ29sc19ORU9OKjsKICAgICAgICAgU2NhbGVBUkdCQ29sc1VwMl9DOwogICAgICAgICBTY2FsZUFSR0JGaWx0ZXJDb2xzNjRfQzsKLSAgICAgICAgU2NhbGVBUkdCRmlsdGVyQ29sc19BbnlfTkVPTjsKKyAgICAgICAgU2NhbGVBUkdCRmlsdGVyQ29sc19BbnlfTkVPTio7CiAgICAgICAgIFNjYWxlQVJHQkZpbHRlckNvbHNfQzsKLSAgICAgICAgU2NhbGVBUkdCRmlsdGVyQ29sc19ORU9OOwotICAgICAgICBTY2FsZUFSR0JSb3dEb3duMl9BbnlfTkVPTjsKLSAgICAgICAgU2NhbGVBUkdCUm93RG93bjJCb3hfQW55X05FT047CisgICAgICAgIFNjYWxlQVJHQkZpbHRlckNvbHNfTkVPTio7CisgICAgICAgIFNjYWxlQVJHQlJvd0Rvd24yX0FueV9ORU9OKjsKKyAgICAgICAgU2NhbGVBUkdCUm93RG93bjJCb3hfQW55X05FT04qOwogICAgICAgICBTY2FsZUFSR0JSb3dEb3duMkJveF9DOwotICAgICAgICBTY2FsZUFSR0JSb3dEb3duMkJveF9ORU9OOworICAgICAgICBTY2FsZUFSR0JSb3dEb3duMkJveF9ORU9OKjsKICAgICAgICAgU2NhbGVBUkdCUm93RG93bjJfQzsKLSAgICAgICAgU2NhbGVBUkdCUm93RG93bjJMaW5lYXJfQW55X05FT047CisgICAgICAgIFNjYWxlQVJHQlJvd0Rvd24yTGluZWFyX0FueV9ORU9OKjsKICAgICAgICAgU2NhbGVBUkdCUm93RG93bjJMaW5lYXJfQzsKLSAgICAgICAgU2NhbGVBUkdCUm93RG93bjJMaW5lYXJfTkVPTjsKLSAgICAgICAgU2NhbGVBUkdCUm93RG93bjJfTkVPTjsKLSAgICAgICAgU2NhbGVBUkdCUm93RG93bkV2ZW5fQW55X05FT047Ci0gICAgICAgIFNjYWxlQVJHQlJvd0Rvd25FdmVuQm94X0FueV9ORU9OOworICAgICAgICBTY2FsZUFSR0JSb3dEb3duMkxpbmVhcl9ORU9OKjsKKyAgICAgICAgU2NhbGVBUkdCUm93RG93bjJfTkVPTio7CisgICAgICAgIFNjYWxlQVJHQlJvd0Rvd25FdmVuX0FueV9ORU9OKjsKKyAgICAgICAgU2NhbGVBUkdCUm93RG93bkV2ZW5Cb3hfQW55X05FT04qOwogICAgICAgICBTY2FsZUFSR0JSb3dEb3duRXZlbkJveF9DOwotICAgICAgICBTY2FsZUFSR0JSb3dEb3duRXZlbkJveF9ORU9OOworICAgICAgICBTY2FsZUFSR0JSb3dEb3duRXZlbkJveF9ORU9OKjsKICAgICAgICAgU2NhbGVBUkdCUm93RG93bkV2ZW5fQzsKLSAgICAgICAgU2NhbGVBUkdCUm93RG93bkV2ZW5fTkVPTjsKKyAgICAgICAgU2NhbGVBUkdCUm93RG93bkV2ZW5fTkVPTio7CiAgICAgICAgIFNjYWxlQ29sc18xNl9DOwogICAgICAgICBTY2FsZUNvbHNfQzsKICAgICAgICAgU2NhbGVDb2xzVXAyXzE2X0M7CkBAIC0zOTAsMTEgKzM5MCwxMSBAQAogICAgICAgICBTY2FsZUZpbHRlckNvbHNfMTZfQzsKICAgICAgICAgU2NhbGVGaWx0ZXJDb2xzNjRfMTZfQzsKICAgICAgICAgU2NhbGVGaWx0ZXJDb2xzNjRfQzsKLSAgICAgICAgU2NhbGVGaWx0ZXJDb2xzX0FueV9ORU9OOworICAgICAgICBTY2FsZUZpbHRlckNvbHNfQW55X05FT04qOwogICAgICAgICBTY2FsZUZpbHRlckNvbHNfQzsKLSAgICAgICAgU2NhbGVGaWx0ZXJDb2xzX05FT047CisgICAgICAgIFNjYWxlRmlsdGVyQ29sc19ORU9OKjsKICAgICAgICAgU2NhbGVGaWx0ZXJSZWR1Y2U7Ci0gICAgICAgIFNjYWxlRmlsdGVyUm93c19ORU9OOworICAgICAgICBTY2FsZUZpbHRlclJvd3NfTkVPTio7CiAgICAgICAgIFNjYWxlT2Zmc2V0OwogICAgICAgICBTY2FsZVBsYW5lOwogICAgICAgICBTY2FsZVBsYW5lXzE2OwpAQCAtNDA1LDEwNCArNDA1LDEwNCBAQAogICAgICAgICBTY2FsZVBsYW5lVmVydGljYWw7CiAgICAgICAgIFNjYWxlUGxhbmVWZXJ0aWNhbF8xNjsKICAgICAgICAgU2NhbGVSb3dEb3duMl8xNl9DOwotICAgICAgICBTY2FsZVJvd0Rvd24yX0FueV9ORU9OOworICAgICAgICBTY2FsZVJvd0Rvd24yX0FueV9ORU9OKjsKICAgICAgICAgU2NhbGVSb3dEb3duMkJveF8xNl9DOwotICAgICAgICBTY2FsZVJvd0Rvd24yQm94X0FueV9ORU9OOworICAgICAgICBTY2FsZVJvd0Rvd24yQm94X0FueV9ORU9OKjsKICAgICAgICAgU2NhbGVSb3dEb3duMkJveF9DOwotICAgICAgICBTY2FsZVJvd0Rvd24yQm94X05FT047CisgICAgICAgIFNjYWxlUm93RG93bjJCb3hfTkVPTio7CiAgICAgICAgIFNjYWxlUm93RG93bjJCb3hfT2RkX0M7Ci0gICAgICAgIFNjYWxlUm93RG93bjJCb3hfT2RkX05FT047CisgICAgICAgIFNjYWxlUm93RG93bjJCb3hfT2RkX05FT04qOwogICAgICAgICBTY2FsZVJvd0Rvd24yX0M7CiAgICAgICAgIFNjYWxlUm93RG93bjJMaW5lYXJfMTZfQzsKLSAgICAgICAgU2NhbGVSb3dEb3duMkxpbmVhcl9BbnlfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duMkxpbmVhcl9BbnlfTkVPTio7CiAgICAgICAgIFNjYWxlUm93RG93bjJMaW5lYXJfQzsKLSAgICAgICAgU2NhbGVSb3dEb3duMkxpbmVhcl9ORU9OOwotICAgICAgICBTY2FsZVJvd0Rvd24yX05FT047CisgICAgICAgIFNjYWxlUm93RG93bjJMaW5lYXJfTkVPTio7CisgICAgICAgIFNjYWxlUm93RG93bjJfTkVPTio7CiAgICAgICAgIFNjYWxlUm93RG93bjM0XzBfQm94XzE2X0M7Ci0gICAgICAgIFNjYWxlUm93RG93bjM0XzBfQm94X0FueV9ORU9OOworICAgICAgICBTY2FsZVJvd0Rvd24zNF8wX0JveF9BbnlfTkVPTio7CiAgICAgICAgIFNjYWxlUm93RG93bjM0XzBfQm94X0M7Ci0gICAgICAgIFNjYWxlUm93RG93bjM0XzBfQm94X05FT047CisgICAgICAgIFNjYWxlUm93RG93bjM0XzBfQm94X05FT04qOwogICAgICAgICBTY2FsZVJvd0Rvd24zNF8xNl9DOwogICAgICAgICBTY2FsZVJvd0Rvd24zNF8xX0JveF8xNl9DOwotICAgICAgICBTY2FsZVJvd0Rvd24zNF8xX0JveF9BbnlfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duMzRfMV9Cb3hfQW55X05FT04qOwogICAgICAgICBTY2FsZVJvd0Rvd24zNF8xX0JveF9DOwotICAgICAgICBTY2FsZVJvd0Rvd24zNF8xX0JveF9ORU9OOwotICAgICAgICBTY2FsZVJvd0Rvd24zNF9BbnlfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duMzRfMV9Cb3hfTkVPTio7CisgICAgICAgIFNjYWxlUm93RG93bjM0X0FueV9ORU9OKjsKICAgICAgICAgU2NhbGVSb3dEb3duMzRfQzsKLSAgICAgICAgU2NhbGVSb3dEb3duMzRfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duMzRfTkVPTio7CiAgICAgICAgIFNjYWxlUm93RG93bjM4XzE2X0M7CiAgICAgICAgIFNjYWxlUm93RG93bjM4XzJfQm94XzE2X0M7Ci0gICAgICAgIFNjYWxlUm93RG93bjM4XzJfQm94X0FueV9ORU9OOworICAgICAgICBTY2FsZVJvd0Rvd24zOF8yX0JveF9BbnlfTkVPTio7CiAgICAgICAgIFNjYWxlUm93RG93bjM4XzJfQm94X0M7Ci0gICAgICAgIFNjYWxlUm93RG93bjM4XzJfQm94X05FT047CisgICAgICAgIFNjYWxlUm93RG93bjM4XzJfQm94X05FT04qOwogICAgICAgICBTY2FsZVJvd0Rvd24zOF8zX0JveF8xNl9DOwotICAgICAgICBTY2FsZVJvd0Rvd24zOF8zX0JveF9BbnlfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duMzhfM19Cb3hfQW55X05FT04qOwogICAgICAgICBTY2FsZVJvd0Rvd24zOF8zX0JveF9DOwotICAgICAgICBTY2FsZVJvd0Rvd24zOF8zX0JveF9ORU9OOwotICAgICAgICBTY2FsZVJvd0Rvd24zOF9BbnlfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duMzhfM19Cb3hfTkVPTio7CisgICAgICAgIFNjYWxlUm93RG93bjM4X0FueV9ORU9OKjsKICAgICAgICAgU2NhbGVSb3dEb3duMzhfQzsKLSAgICAgICAgU2NhbGVSb3dEb3duMzhfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duMzhfTkVPTio7CiAgICAgICAgIFNjYWxlUm93RG93bjRfMTZfQzsKLSAgICAgICAgU2NhbGVSb3dEb3duNF9BbnlfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duNF9BbnlfTkVPTio7CiAgICAgICAgIFNjYWxlUm93RG93bjRCb3hfMTZfQzsKLSAgICAgICAgU2NhbGVSb3dEb3duNEJveF9BbnlfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duNEJveF9BbnlfTkVPTio7CiAgICAgICAgIFNjYWxlUm93RG93bjRCb3hfQzsKLSAgICAgICAgU2NhbGVSb3dEb3duNEJveF9ORU9OOworICAgICAgICBTY2FsZVJvd0Rvd240Qm94X05FT04qOwogICAgICAgICBTY2FsZVJvd0Rvd240X0M7Ci0gICAgICAgIFNjYWxlUm93RG93bjRfTkVPTjsKKyAgICAgICAgU2NhbGVSb3dEb3duNF9ORU9OKjsKICAgICAgICAgU2NhbGVTbG9wZTsKICAgICAgICAgU2V0UGxhbmU7Ci0gICAgICAgIFNldFJvd19BbnlfTkVPTjsKKyAgICAgICAgU2V0Um93X0FueV9ORU9OKjsKICAgICAgICAgU2V0Um93X0M7Ci0gICAgICAgIFNldFJvd19ORU9OOwotICAgICAgICBTb2JlbFJvd19BbnlfTkVPTjsKKyAgICAgICAgU2V0Um93X05FT04qOworICAgICAgICBTb2JlbFJvd19BbnlfTkVPTio7CiAgICAgICAgIFNvYmVsUm93X0M7Ci0gICAgICAgIFNvYmVsUm93X05FT047Ci0gICAgICAgIFNvYmVsVG9QbGFuZVJvd19BbnlfTkVPTjsKKyAgICAgICAgU29iZWxSb3dfTkVPTio7CisgICAgICAgIFNvYmVsVG9QbGFuZVJvd19BbnlfTkVPTio7CiAgICAgICAgIFNvYmVsVG9QbGFuZVJvd19DOwotICAgICAgICBTb2JlbFRvUGxhbmVSb3dfTkVPTjsKKyAgICAgICAgU29iZWxUb1BsYW5lUm93X05FT04qOwogICAgICAgICBTb2JlbFhSb3dfQzsKLSAgICAgICAgU29iZWxYUm93X05FT047Ci0gICAgICAgIFNvYmVsWFlSb3dfQW55X05FT047CisgICAgICAgIFNvYmVsWFJvd19ORU9OKjsKKyAgICAgICAgU29iZWxYWVJvd19BbnlfTkVPTio7CiAgICAgICAgIFNvYmVsWFlSb3dfQzsKLSAgICAgICAgU29iZWxYWVJvd19ORU9OOworICAgICAgICBTb2JlbFhZUm93X05FT04qOwogICAgICAgICBTb2JlbFlSb3dfQzsKLSAgICAgICAgU29iZWxZUm93X05FT047CisgICAgICAgIFNvYmVsWVJvd19ORU9OKjsKICAgICAgICAgU3BsaXRVVlBsYW5lOwotICAgICAgICBTcGxpdFVWUm93X0FueV9ORU9OOworICAgICAgICBTcGxpdFVWUm93X0FueV9ORU9OKjsKICAgICAgICAgU3BsaXRVVlJvd19DOwotICAgICAgICBTcGxpdFVWUm93X05FT047CisgICAgICAgIFNwbGl0VVZSb3dfTkVPTio7CiAgICAgICAgIFVZVllUb0FSR0I7Ci0gICAgICAgIFVZVllUb0FSR0JSb3dfQW55X05FT047CisgICAgICAgIFVZVllUb0FSR0JSb3dfQW55X05FT04qOwogICAgICAgICBVWVZZVG9BUkdCUm93X0M7Ci0gICAgICAgIFVZVllUb0FSR0JSb3dfTkVPTjsKKyAgICAgICAgVVlWWVRvQVJHQlJvd19ORU9OKjsKICAgICAgICAgVVlWWVRvSTQyMDsKICAgICAgICAgVVlWWVRvSTQyMjsKICAgICAgICAgVVlWWVRvTlYxMjsKLSAgICAgICAgVVlWWVRvVVY0MjJSb3dfQW55X05FT047CisgICAgICAgIFVZVllUb1VWNDIyUm93X0FueV9ORU9OKjsKICAgICAgICAgVVlWWVRvVVY0MjJSb3dfQzsKLSAgICAgICAgVVlWWVRvVVY0MjJSb3dfTkVPTjsKLSAgICAgICAgVVlWWVRvVVZSb3dfQW55X05FT047CisgICAgICAgIFVZVllUb1VWNDIyUm93X05FT04qOworICAgICAgICBVWVZZVG9VVlJvd19BbnlfTkVPTio7CiAgICAgICAgIFVZVllUb1VWUm93X0M7Ci0gICAgICAgIFVZVllUb1VWUm93X05FT047Ci0gICAgICAgIFVZVllUb1lSb3dfQW55X05FT047CisgICAgICAgIFVZVllUb1VWUm93X05FT04qOworICAgICAgICBVWVZZVG9ZUm93X0FueV9ORU9OKjsKICAgICAgICAgVVlWWVRvWVJvd19DOwotICAgICAgICBVWVZZVG9ZUm93X05FT047CisgICAgICAgIFVZVllUb1lSb3dfTkVPTio7CiAgICAgICAgIFlVWTJUb0FSR0I7Ci0gICAgICAgIFlVWTJUb0FSR0JSb3dfQW55X05FT047CisgICAgICAgIFlVWTJUb0FSR0JSb3dfQW55X05FT04qOwogICAgICAgICBZVVkyVG9BUkdCUm93X0M7Ci0gICAgICAgIFlVWTJUb0FSR0JSb3dfTkVPTjsKKyAgICAgICAgWVVZMlRvQVJHQlJvd19ORU9OKjsKICAgICAgICAgWVVZMlRvSTQyMDsKICAgICAgICAgWVVZMlRvSTQyMjsKICAgICAgICAgWVVZMlRvTlYxMjsKLSAgICAgICAgWVVZMlRvVVY0MjJSb3dfQW55X05FT047CisgICAgICAgIFlVWTJUb1VWNDIyUm93X0FueV9ORU9OKjsKICAgICAgICAgWVVZMlRvVVY0MjJSb3dfQzsKLSAgICAgICAgWVVZMlRvVVY0MjJSb3dfTkVPTjsKLSAgICAgICAgWVVZMlRvVVZSb3dfQW55X05FT047CisgICAgICAgIFlVWTJUb1VWNDIyUm93X05FT04qOworICAgICAgICBZVVkyVG9VVlJvd19BbnlfTkVPTio7CiAgICAgICAgIFlVWTJUb1VWUm93X0M7Ci0gICAgICAgIFlVWTJUb1VWUm93X05FT047CisgICAgICAgIFlVWTJUb1VWUm93X05FT04qOwogICAgICAgICBZVVkyVG9ZOwotICAgICAgICBZVVkyVG9ZUm93X0FueV9ORU9OOworICAgICAgICBZVVkyVG9ZUm93X0FueV9ORU9OKjsKICAgICAgICAgWVVZMlRvWVJvd19DOwotICAgICAgICBZVVkyVG9ZUm93X05FT047CisgICAgICAgIFlVWTJUb1lSb3dfTkVPTio7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9BbmRyb2lkLmJwCmluZGV4IGU5NDQyMjQuLjdhNjdlNTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0FuZHJvaWQuYnAKQEAgLTMxLDggKzMxLDUgQEAKIAogICAgIHNhbml0aXplOiB7CiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvQW5kcm9pZC5icAppbmRleCA4ZDQ4NmNmLi5iNDk0ZTE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0FuZHJvaWQuYnAKQEAgLTEsOSArMSw2IEBACiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfZmxhY2RlYyIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICB2bmRrOiB7Ci0gICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgfSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIkZMQUNEZWNvZGVyLmNwcCIsCkBAIC0xMSwxMSArOCw2IEBACiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbICIuIiBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJleHRlcm5hbC9mbGFjL2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICBdLAotCiAgICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKIAogICAgIHNhbml0aXplOiB7CkBAIC0yNCwyMyArMTYsMzEgQEAKICAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKIAogICAgIHN0YXRpYzogewotICAgICAgICB3aG9sZV9zdGF0aWNfbGliczogWyJsaWJGTEFDIl0sCisgICAgICAgIHdob2xlX3N0YXRpY19saWJzOiBbCisgICAgICAgICAgICAibGliRkxBQyIsCisgICAgICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgIF0sCiAgICAgfSwKIAogICAgIHNoYXJlZDogewotICAgICAgICBzdGF0aWNfbGliczogWyJsaWJGTEFDIl0sCisgICAgICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICAgICAibGliRkxBQyIsCisgICAgICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgIF0sCisgICAgICAgIGV4cG9ydF9zdGF0aWNfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgICAgICJsaWJGTEFDIiwKKyAgICAgICAgXSwKICAgICB9LAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAotICAgIGhlYWRlcl9saWJzOiBbImxpYm1lZGlhX2hlYWRlcnMiXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICAgICAgImxpYkZMQUMtaGVhZGVycyIsCisgICAgXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmNwcAppbmRleCBhMmI2YWI3Li5jZWYwYmM2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9GTEFDRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuY3BwCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlICJGTEFDRGVjb2Rlci5oIgogCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPiAvLyBmbG9hdF9mcm9tX2kzMgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CkBAIC0xMTcsMTA0ICsxMTgsNDMgQEAKICAgICBtRXJyb3JTdGF0dXMgPSBzdGF0dXM7CiB9CiAKLS8vIENvcHkgc2FtcGxlcyBmcm9tIEZMQUMgbmF0aXZlIDMyLWJpdCBub24taW50ZXJsZWF2ZWQgdG8gMTYtYml0IGludGVybGVhdmVkLgorLy8gQ29weSBzYW1wbGVzIGZyb20gRkxBQyBuYXRpdmUgMzItYml0IG5vbi1pbnRlcmxlYXZlZCB0byAxNi1iaXQgc2lnbmVkCisvLyBvciAzMi1iaXQgZmxvYXQgaW50ZXJsZWF2ZWQuCisvLyBUT0RPOiBDb25zaWRlciBtb3ZpbmcgdG8gYXVkaW9fdXRpbHMuICBTZWUgc2ltaWxhciBjb2RlIGF0IEZMQUNFeHRyYWN0b3IuY3BwCiAvLyBUaGVzZSBhcmUgY2FuZGlkYXRlcyBmb3Igb3B0aW1pemF0aW9uIGlmIG5lZWRlZC4KLXN0YXRpYyB2b2lkIGNvcHlNb25vOCgKK3N0YXRpYyB2b2lkIGNvcHlUbzE2U2lnbmVkKAogICAgICAgICBzaG9ydCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ0RlY29kZXI6OmtNYXhDaGFubmVsc10sCisgICAgICAgIGNvbnN0IGludCAqY29uc3QgKnNyYywKICAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA8PCA4OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weVN0ZXJlbzgoCi0gICAgICAgIHNob3J0ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzXSwKLSAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA8PCA4OwotICAgICAgICAqZHN0KysgPSBzcmNbMV1baV0gPDwgODsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlNdWx0aUNoOCgKLSAgICAgICAgc2hvcnQgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgbkNoYW5uZWxzKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7Ci0gICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV0gPDwgODsKKyAgICAgICAgdW5zaWduZWQgbkNoYW5uZWxzLAorICAgICAgICB1bnNpZ25lZCBiaXRzUGVyU2FtcGxlKSB7CisgICAgY29uc3QgaW50IGxlZnRTaGlmdCA9IDE2IC0gKGludCliaXRzUGVyU2FtcGxlOyAvLyBjYXN0IHRvIGludCB0byBwcmV2ZW50IHVuc2lnbmVkIG92ZXJmbG93LgorICAgIGlmIChsZWZ0U2hpZnQgPj0gMCkgeworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgeworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gc3JjW2NdW2ldIDw8IGxlZnRTaGlmdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IGludCByaWdodFNoaWZ0ID0gLWxlZnRTaGlmdDsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBuQ2hhbm5lbHM7ICsrYykgeworICAgICAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXSA+PiByaWdodFNoaWZ0OworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjb3B5TW9ubzE2KAotICAgICAgICBzaG9ydCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ0RlY29kZXI6OmtNYXhDaGFubmVsc10sCitzdGF0aWMgdm9pZCBjb3B5VG9GbG9hdCgKKyAgICAgICAgZmxvYXQgKmRzdCwKKyAgICAgICAgY29uc3QgaW50ICpjb25zdCAqc3JjLAogICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldOwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weVN0ZXJlbzE2KAotICAgICAgICBzaG9ydCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ0RlY29kZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV07Ci0gICAgICAgICpkc3QrKyA9IHNyY1sxXVtpXTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlNdWx0aUNoMTYoCi0gICAgICAgIHNob3J0ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzXSwKLSAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIG5DaGFubmVscykgeworICAgICAgICB1bnNpZ25lZCBuQ2hhbm5lbHMsCisgICAgICAgIHVuc2lnbmVkIGJpdHNQZXJTYW1wbGUpIHsKKyAgICBjb25zdCB1bnNpZ25lZCBsZWZ0U2hpZnQgPSAzMiAtIGJpdHNQZXJTYW1wbGU7CiAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKICAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7Ci0gICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV07Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIFRPRE86IDI0LWJpdCB2ZXJzaW9ucyBzaG91bGQgZG8gZGl0aGVyaW5nIG9yIG5vaXNlLXNoYXBpbmcsIGhlcmUgb3IgaW4gQXVkaW9GbGluZ2VyCi1zdGF0aWMgdm9pZCBjb3B5TW9ubzI0KAotICAgICAgICBzaG9ydCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ0RlY29kZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPj4gODsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlTdGVyZW8yNCgKLSAgICAgICAgc2hvcnQgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldID4+IDg7Ci0gICAgICAgICpkc3QrKyA9IHNyY1sxXVtpXSA+PiA4OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weU11bHRpQ2gyNCgKLSAgICAgICAgc2hvcnQgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgbkNoYW5uZWxzKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7Ci0gICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV0gPj4gODsKKyAgICAgICAgICAgICpkc3QrKyA9IGZsb2F0X2Zyb21faTMyKHNyY1tjXVtpXSA8PCBsZWZ0U2hpZnQpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMjM4LDggKzE3OCw3IEBACiAgICAgICBtU3RyZWFtSW5mb1ZhbGlkKGZhbHNlKSwKICAgICAgIG1Xcml0ZVJlcXVlc3RlZChmYWxzZSksCiAgICAgICBtV3JpdGVDb21wbGV0ZWQoZmFsc2UpLAotICAgICAgbUVycm9yU3RhdHVzKChGTEFDX19TdHJlYW1EZWNvZGVyRXJyb3JTdGF0dXMpIC0xKSwKLSAgICAgIG1Db3B5KG51bGxwdHIpIHsKKyAgICAgIG1FcnJvclN0YXR1cygoRkxBQ19fU3RyZWFtRGVjb2RlckVycm9yU3RhdHVzKSAtMSkgewogICAgIEFMT0dWKCJjdG9yOiIpOwogICAgIG1lbXNldCgmbVN0cmVhbUluZm8sIDAsIHNpemVvZihtU3RyZWFtSW5mbykpOwogICAgIG1lbXNldCgmbVdyaXRlSGVhZGVyLCAwLCBzaXplb2YobVdyaXRlSGVhZGVyKSk7CkBAIC0zNzksNiArMzE4LDcgQEAKICAgICAgICAgY2FzZSA4OgogICAgICAgICBjYXNlIDE2OgogICAgICAgICBjYXNlIDI0OgorICAgICAgICBjYXNlIDMyOiAvLyBnZW5lcmFsbHkgcmFyZSwgYnV0IGlzIHN1cHBvcnRlZCBpbiB0aGUgZnJhbWV3b3JrCiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgpAQCAtMzg3LDMxICszMjcsNiBAQAogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKLSAgICAvLyBjb25maWd1cmUgdGhlIGFwcHJvcHJpYXRlIGNvcHkgZnVuY3Rpb24sIGRlZmF1bHRpbmcgdG8gdHJlc3Bhc3MKLSAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKLSAgICAgICAgdW5zaWduZWQgbUNoYW5uZWxzOwotICAgICAgICB1bnNpZ25lZCBtQml0c1BlclNhbXBsZTsKLSAgICAgICAgdm9pZCAoKm1Db3B5KShzaG9ydCAqZHN0LCBjb25zdCBpbnQgKiBzcmNba01heENoYW5uZWxzXSwKLSAgICAgICAgICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKTsKLSAgICB9IHRhYmxlW10gPSB7Ci0gICAgICAgIHsgMSwgIDgsIGNvcHlNb25vOCAgICAgfSwKLSAgICAgICAgeyAyLCAgOCwgY29weVN0ZXJlbzggICB9LAotICAgICAgICB7IDgsICA4LCBjb3B5TXVsdGlDaDggIH0sCi0gICAgICAgIHsgMSwgMTYsIGNvcHlNb25vMTYgICAgfSwKLSAgICAgICAgeyAyLCAxNiwgY29weVN0ZXJlbzE2ICB9LAotICAgICAgICB7IDgsIDE2LCBjb3B5TXVsdGlDaDE2IH0sCi0gICAgICAgIHsgMSwgMjQsIGNvcHlNb25vMjQgICAgfSwKLSAgICAgICAgeyAyLCAyNCwgY29weVN0ZXJlbzI0ICB9LAotICAgICAgICB7IDgsIDI0LCBjb3B5TXVsdGlDaDI0IH0sCi0gICAgfTsKLSAgICBmb3IgKGNvbnN0IGF1dG8gJmVudHJ5IDogdGFibGUpIHsKLSAgICAgICAgaWYgKGVudHJ5Lm1DaGFubmVscyA+PSBnZXRDaGFubmVscygpICYmCi0gICAgICAgICAgICAgICAgZW50cnkubUJpdHNQZXJTYW1wbGUgPT0gZ2V0Qml0c1BlclNhbXBsZSgpKSB7Ci0gICAgICAgICAgICBtQ29weSA9IGVudHJ5Lm1Db3B5OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICAvLyBOb3cgd2UgaGF2ZSBhbGwgbWV0YWRhdGEgYmxvY2tzLgogICAgIG1CdWZmZXJQb3MgPSAwOwogICAgIG1CdWZmZXJEYXRhU2l6ZSA9IDA7CkBAIC00MjAsNyArMzM1LDcgQEAKIH0KIAogc3RhdHVzX3QgRkxBQ0RlY29kZXI6OmRlY29kZU9uZUZyYW1lKGNvbnN0IHVpbnQ4X3QgKmluQnVmZmVyLCBzaXplX3QgaW5CdWZmZXJMZW4sCi0gICAgICAgIHNob3J0ICpvdXRCdWZmZXIsIHNpemVfdCAqb3V0QnVmZmVyTGVuKSB7CisgICAgICAgIHZvaWQgKm91dEJ1ZmZlciwgc2l6ZV90ICpvdXRCdWZmZXJMZW4sIGJvb2wgb3V0cHV0RmxvYXQpIHsKICAgICBBTE9HVigiZGVjb2RlT25lRnJhbWU6IGlucHV0IHNpemUoJXp1KSIsIGluQnVmZmVyTGVuKTsKIAogICAgIGlmICghbVN0cmVhbUluZm9WYWxpZCkgewpAQCAtNDY5LDIxICszODQsMzMgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKLSAgICBzaXplX3QgYnVmZmVyU2l6ZSA9IGJsb2Nrc2l6ZSAqIGdldENoYW5uZWxzKCkgKiBzaXplb2Yoc2hvcnQpOworICAgIGNvbnN0IHVuc2lnbmVkIGNoYW5uZWxzID0gZ2V0Q2hhbm5lbHMoKTsKKyAgICBjb25zdCBzaXplX3Qgc2FtcGxlU2l6ZSA9IG91dHB1dEZsb2F0ID8gc2l6ZW9mKGZsb2F0KSA6IHNpemVvZihpbnQxNl90KTsKKyAgICBjb25zdCBzaXplX3QgZnJhbWVTaXplID0gY2hhbm5lbHMgKiBzYW1wbGVTaXplOworICAgIHNpemVfdCBidWZmZXJTaXplID0gYmxvY2tzaXplICogZnJhbWVTaXplOwogICAgIGlmIChidWZmZXJTaXplID4gKm91dEJ1ZmZlckxlbikgewogICAgICAgICBBTE9HVygiZGVjb2RlT25lRnJhbWU6IG91dHB1dCBidWZmZXIgaG9sZHMgb25seSBwYXJ0aWFsIGZyYW1lICV6dTolenUiLAogICAgICAgICAgICAgICAgICpvdXRCdWZmZXJMZW4sIGJ1ZmZlclNpemUpOwotICAgICAgICBibG9ja3NpemUgPSAqb3V0QnVmZmVyTGVuIC8gKGdldENoYW5uZWxzKCkgKiBzaXplb2Yoc2hvcnQpKTsKLSAgICAgICAgYnVmZmVyU2l6ZSA9IGJsb2Nrc2l6ZSAqIGdldENoYW5uZWxzKCkgKiBzaXplb2Yoc2hvcnQpOworICAgICAgICBibG9ja3NpemUgPSAqb3V0QnVmZmVyTGVuIC8gZnJhbWVTaXplOworICAgICAgICBidWZmZXJTaXplID0gYmxvY2tzaXplICogZnJhbWVTaXplOwogICAgIH0KIAotICAgIGlmIChtQ29weSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJkZWNvZGVPbmVGcmFtZTogZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQ6IGNoYW5uZWxzKCVkKSwgQml0c1BlclNhbXBsZSglZCkiLAotICAgICAgICAgICAgICAgIGdldENoYW5uZWxzKCksIGdldEJpdHNQZXJTYW1wbGUoKSk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9CiAgICAgLy8gY29weSBQQ00gZnJvbSBGTEFDIHdyaXRlIGJ1ZmZlciB0byBvdXRwdXQgYnVmZmVyLCB3aXRoIGludGVybGVhdmluZwotICAgICgqbUNvcHkpKG91dEJ1ZmZlciwgbVdyaXRlQnVmZmVyLCBibG9ja3NpemUsIGdldENoYW5uZWxzKCkpOworCisgICAgY29uc3QgdW5zaWduZWQgYml0c1BlclNhbXBsZSA9IGdldEJpdHNQZXJTYW1wbGUoKTsKKyAgICBpZiAob3V0cHV0RmxvYXQpIHsKKyAgICAgICAgY29weVRvRmxvYXQocmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KG91dEJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgIG1Xcml0ZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tzaXplLAorICAgICAgICAgICAgICAgICAgICBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgYml0c1BlclNhbXBsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29weVRvMTZTaWduZWQocmVpbnRlcnByZXRfY2FzdDxzaG9ydCo+KG91dEJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgIG1Xcml0ZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzaXplLAorICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgYml0c1BlclNhbXBsZSk7CisgICAgfQogICAgICpvdXRCdWZmZXJMZW4gPSBidWZmZXJTaXplOwogICAgIHJldHVybiBPSzsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9GTEFDRGVjb2Rlci5oCmluZGV4IDFhMzNjYWUuLjY5NGZjY2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuaApAQCAtNDEsNyArNDEsNyBAQAogCiAgICAgc3RhdHVzX3QgcGFyc2VNZXRhZGF0YShjb25zdCB1aW50OF90ICppbkJ1ZmZlciwgc2l6ZV90IGluQnVmZmVyTGVuKTsKICAgICBzdGF0dXNfdCBkZWNvZGVPbmVGcmFtZShjb25zdCB1aW50OF90ICppbkJ1ZmZlciwgc2l6ZV90IGluQnVmZmVyTGVuLAotICAgICAgICAgICAgc2hvcnQgKm91dEJ1ZmZlciwgc2l6ZV90ICpvdXRCdWZmZXJMZW4pOworICAgICAgICAgICAgdm9pZCAqb3V0QnVmZmVyLCBzaXplX3QgKm91dEJ1ZmZlckxlbiwgYm9vbCBvdXRwdXRGbG9hdCA9IGZhbHNlKTsKICAgICB2b2lkIGZsdXNoKCk7CiAgICAgdmlydHVhbCB+RkxBQ0RlY29kZXIoKTsKIApAQCAtODksOCArODksNiBAQAogICAgIC8vIG1vc3QgcmVjZW50IGVycm9yIHJlcG9ydGVkIGJ5IGxpYkZMQUMgZGVjb2RlcgogICAgIEZMQUNfX1N0cmVhbURlY29kZXJFcnJvclN0YXR1cyBtRXJyb3JTdGF0dXM7CiAKLSAgICB2b2lkICgqbUNvcHkpKHNob3J0ICpkc3QsIGNvbnN0IGludCAqc3JjW2tNYXhDaGFubmVsc10sIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpOwotCiAgICAgc3RhdHVzX3QgaW5pdCgpOwogCiAgICAgLy8gRkxBQyBzdHJlYW0gZGVjb2RlciBjYWxsYmFja3MgYXMgQysrIGluc3RhbmNlIG1ldGhvZHMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODM3ZjY2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZSIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotQVN0YXRlOjpBU3RhdGUoY29uc3Qgc3A8QVN0YXRlPiAmcGFyZW50U3RhdGUpCi0gICAgOiBtUGFyZW50U3RhdGUocGFyZW50U3RhdGUpIHsKLX0KLQotQVN0YXRlOjp+QVN0YXRlKCkgewotfQotCi1zcDxBU3RhdGU+IEFTdGF0ZTo6cGFyZW50U3RhdGUoKSB7Ci0gICAgcmV0dXJuIG1QYXJlbnRTdGF0ZTsKLX0KLQotdm9pZCBBU3RhdGU6OnN0YXRlRW50ZXJlZCgpIHsKLX0KLQotdm9pZCBBU3RhdGU6OnN0YXRlRXhpdGVkKCkgewotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOjpBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lKCkgewotfQotCi1BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOjp+QUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZSgpIHsKLX0KLQotdm9pZCBBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOjpoYW5kbGVNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgc3A8QVN0YXRlPiBzYXZlID0gbVN0YXRlOwotCi0gICAgc3A8QVN0YXRlPiBjdXIgPSBtU3RhdGU7Ci0gICAgd2hpbGUgKGN1ciAhPSBOVUxMICYmICFjdXItPm9uTWVzc2FnZVJlY2VpdmVkKG1zZykpIHsKLSAgICAgICAgLy8gSWYgeW91IGNsYWltIG5vdCB0byBoYXZlIGhhbmRsZWQgdGhlIG1lc3NhZ2UgeW91IHNob3VsZG4ndAotICAgICAgICAvLyBoYXZlIGNhbGxlZCBzZXRTdGF0ZS4uLgotICAgICAgICBDSEVDSyhzYXZlID09IG1TdGF0ZSk7Ci0KLSAgICAgICAgY3VyID0gY3VyLT5wYXJlbnRTdGF0ZSgpOwotICAgIH0KLQotICAgIGlmIChjdXIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQUxPR1coIldhcm5pbmcgbWVzc2FnZSAlcyB1bmhhbmRsZWQgaW4gcm9vdCBzdGF0ZS4iLAotICAgICAgICAgbXNnLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOwotfQotCi12b2lkIEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6OmNoYW5nZVN0YXRlKGNvbnN0IHNwPEFTdGF0ZT4gJnN0YXRlKSB7Ci0gICAgaWYgKHN0YXRlID09IG1TdGF0ZSkgewotICAgICAgICAvLyBRdWljayBleGl0IGZvciB0aGUgZWFzeSBjYXNlLgotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgVmVjdG9yPHNwPEFTdGF0ZT4gPiBBOwotICAgIHNwPEFTdGF0ZT4gY3VyID0gbVN0YXRlOwotICAgIGZvciAoOzspIHsKLSAgICAgICAgQS5wdXNoKGN1cik7Ci0gICAgICAgIGlmIChjdXIgPT0gTlVMTCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY3VyID0gY3VyLT5wYXJlbnRTdGF0ZSgpOwotICAgIH0KLQotICAgIFZlY3RvcjxzcDxBU3RhdGU+ID4gQjsKLSAgICBjdXIgPSBzdGF0ZTsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIEIucHVzaChjdXIpOwotICAgICAgICBpZiAoY3VyID09IE5VTEwpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGN1ciA9IGN1ci0+cGFyZW50U3RhdGUoKTsKLSAgICB9Ci0KLSAgICAvLyBSZW1vdmUgdGhlIGNvbW1vbiB0YWlsLgotICAgIHdoaWxlIChBLnNpemUoKSA+IDAgJiYgQi5zaXplKCkgPiAwICYmIEEudG9wKCkgPT0gQi50b3AoKSkgewotICAgICAgICBBLnBvcCgpOwotICAgICAgICBCLnBvcCgpOwotICAgIH0KLQotICAgIG1TdGF0ZSA9IHN0YXRlOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIEEuZWRpdEl0ZW1BdChpKS0+c3RhdGVFeGl0ZWQoKTsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gQi5zaXplKCk7IGkgPiAwOykgewotICAgICAgICBpLS07Ci0gICAgICAgIEIuZWRpdEl0ZW1BdChpKS0+c3RhdGVFbnRlcmVkKCk7Ci0gICAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5jcHAKaW5kZXggOTkyMTYzNi4uYTI3NjcyMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwCkBAIC02Niw3ICs2Niw3IEBACiAKIC8vIHN0YXRpYwogaW50NjRfdCBBTG9vcGVyOjpHZXROb3dVcygpIHsKLSAgICByZXR1cm4gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpIC8gMTAwMGxsOworICAgIHJldHVybiBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQykgLyAxMDAwTEw7CiB9CiAKIEFMb29wZXI6OkFMb29wZXIoKQpAQCAtMTcwLDcgKzE3MCw5IEBACiAKICAgICBpbnQ2NF90IHdoZW5VczsKICAgICBpZiAoZGVsYXlVcyA+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+IHNlc3Npb24gPSAqc2Vzc2lvbnNUb0FkZC5iZWdpbigpOwotICAgICAgICAgICAgc2Vzc2lvbnNUb0FkZC5lcmFzZShzZXNzaW9uc1RvQWRkLmJlZ2luKCkpOwotCi0gICAgICAgICAgICBtU2Vzc2lvbnMuYWRkKHNlc3Npb24tPnNlc3Npb25JRCgpLCBzZXNzaW9uKTsKLQotICAgICAgICAgICAgQUxPR0koImFkZGVkIGNsaWVudFNlc3Npb24gJWQiLCBzZXNzaW9uLT5zZXNzaW9uSUQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmNwcAppbmRleCAwNGZhYzE5Li5mYjUxY2M1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5jcHAKQEAgLTMxLDcgKzMxLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gc3RhdGljCi1jb25zdCBjaGFyICpBU3RyaW5nOjprRW1wdHlTdHJpbmcgPSAiIjsKK2NvbnN0ZXhwciBjb25zdCBjaGFyICpBU3RyaW5nOjprRW1wdHlTdHJpbmc7CiAKIEFTdHJpbmc6OkFTdHJpbmcoKQogICAgIDogbURhdGEoKGNoYXIgKilrRW1wdHlTdHJpbmcpLApAQCAtMTI1LDEyICsxMjUsMTAgQEAKIH0KIAogdm9pZCBBU3RyaW5nOjpjbGVhcigpIHsKLSAgICBpZiAobURhdGEgJiYgbURhdGEgIT0ga0VtcHR5U3RyaW5nKSB7CisgICAgaWYgKG1EYXRhICE9IGtFbXB0eVN0cmluZykgewogICAgICAgICBmcmVlKG1EYXRhKTsKLSAgICAgICAgbURhdGEgPSBOVUxMOworICAgICAgICBtRGF0YSA9IChjaGFyICopa0VtcHR5U3RyaW5nOwogICAgIH0KLQotICAgIG1EYXRhID0gKGNoYXIgKilrRW1wdHlTdHJpbmc7CiAgICAgbVNpemUgPSAwOwogICAgIG1BbGxvY1NpemUgPSAxOwogfQpAQCAtMzY3LDYgKzM2NSw4IEBACiAvLyBzdGF0aWMKIEFTdHJpbmcgQVN0cmluZzo6RnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCkgewogICAgIHNpemVfdCBzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihwYXJjZWwucmVhZEludDMyKCkpOworICAgIC8vIFRoZSBzdGF0aWMgYW5hbHl6ZXIgaW5jb3JyZWN0bHkgcmVwb3J0cyBhIGZhbHNlLXBvc2l0aXZlIGhlcmUgaW4gYysrMTcuCisgICAgLy8gaHR0cHM6Ly9idWdzLmxsdm0ub3JnL3Nob3dfYnVnLmNnaT9pZD0zODE3NiAuIE5PTElOVE5FWFRMSU5FCiAgICAgcmV0dXJuIEFTdHJpbmcoc3RhdGljX2Nhc3Q8Y29uc3QgY2hhciAqPihwYXJjZWwucmVhZElucGxhY2Uoc2l6ZSkpLCBzaXplKTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwCmluZGV4IGY2NjM1NDIuLjUzM2NkNzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKQEAgLTQsMTIgKzQsMTMgQEAKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogfQogCi1jY19saWJyYXJ5IHsKLSAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25fZGVmYXVsdHMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgdm5kazogewogICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgIH0sCisgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAogICAgIGluY2x1ZGVfZGlyczogWwogICAgICAgICAiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIiwKICAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUiLApAQCAtMjQsNiArMjUsNyBAQAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25faGVhZGVycyIsCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCiAgICAgXSwKIApAQCAtNTUsMTggKzU3LDIyIEBACiAgICAgICAgICJBQnVmZmVyLmNwcCIsCiAgICAgICAgICJBRGVidWcuY3BwIiwKICAgICAgICAgIkFIYW5kbGVyLmNwcCIsCi0gICAgICAgICJBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcCIsCiAgICAgICAgICJBTG9vcGVyLmNwcCIsCiAgICAgICAgICJBTG9vcGVyUm9zdGVyLmNwcCIsCiAgICAgICAgICJBTWVzc2FnZS5jcHAiLAotICAgICAgICAiQU5ldHdvcmtTZXNzaW9uLmNwcCIsCiAgICAgICAgICJBU3RyaW5nLmNwcCIsCiAgICAgICAgICJBU3RyaW5nVXRpbHMuY3BwIiwKKyAgICAgICAgIkF1ZGlvUHJlc2VudGF0aW9uSW5mby5jcHAiLAogICAgICAgICAiQnl0ZVV0aWxzLmNwcCIsCiAgICAgICAgICJDb2xvclV0aWxzLmNwcCIsCisgICAgICAgICJNZWRpYUJ1ZmZlci5jcHAiLAorICAgICAgICAiTWVkaWFCdWZmZXJCYXNlLmNwcCIsCisgICAgICAgICJNZWRpYUJ1ZmZlckdyb3VwLmNwcCIsCiAgICAgICAgICJNZWRpYURlZnMuY3BwIiwKICAgICAgICAgIk1lZGlhS2V5cy5jcHAiLAotICAgICAgICAiUGFyc2VkTWVzc2FnZS5jcHAiLAorICAgICAgICAiTWV0YURhdGEuY3BwIiwKKyAgICAgICAgIk1ldGFEYXRhQmFzZS5jcHAiLAorICAgICAgICAiT3B1c0hlYWRlci5jcHAiLAogICAgICAgICAiYXZjX3V0aWxzLmNwcCIsCiAgICAgICAgICJiYXNlNjQuY3BwIiwKICAgICAgICAgImhleGR1bXAuY3BwIiwKQEAgLTgwLDggKzg2LDIyIEBACiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAogfQorCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9kZWZhdWx0cyJdLAorfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25fd2l0aG91dF9pbWVtb3J5IiwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2RlZmF1bHRzIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1Xbm8tbXVsdGljaGFyIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLUROT19JTUVNT1JZIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BdWRpb1ByZXNlbnRhdGlvbkluZm8uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BdWRpb1ByZXNlbnRhdGlvbkluZm8uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOGU5NjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5jcHAKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyAjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBdWRpb1ByZXNlbnRhdGlvbkluZm8iCisKKyNpbmNsdWRlIDx2ZWN0b3I+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+bUNvbmRpdGlvbi5zaWduYWwoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmNwcAppbmRleCAxNjk1Yzc1Li5hMDhmZWQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCA9ICJ2aWRlby94LXZuZC5vbjIudnA4IjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOSA9ICJ2aWRlby94LXZuZC5vbjIudnA5IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSA9ICJ2aWRlby9hdjAxIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyA9ICJ2aWRlby9hdmMiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQyA9ICJ2aWRlby9oZXZjIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0ID0gInZpZGVvL21wNHYtZXMiOwpAQCAtMzEsNiArMzIsMTAgQEAKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1JBVyA9ICJ2aWRlby9yYXciOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OID0gInZpZGVvL2RvbGJ5LXZpc2lvbiI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19TQ1JBTUJMRUQgPSAidmlkZW8vc2NyYW1ibGVkIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0RJVlggPSAidmlkZW8vZGl2eCI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19ESVZYMyA9ICJ2aWRlby9kaXZ4MyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19YVklEID0gInZpZGVvL3h2aWQiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fTUpQRUcgPSAidmlkZW8veC1tb3Rpb24tanBlZyI7CiAKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiA9ICJhdWRpby8zZ3BwIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiA9ICJhdWRpby9hbXItd2IiOwpAQCAtNTAsMTEgKzU1LDE4IEBACiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NU0dTTSA9ICJhdWRpby9nc20iOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUMzID0gImF1ZGlvL2FjMyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzID0gImF1ZGlvL2VhYzMiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDM19KT0MgPSAiYXVkaW8vZWFjMy1qb2MiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0ID0gImF1ZGlvL2FjNCI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19TQ1JBTUJMRUQgPSAiYXVkaW8vc2NyYW1ibGVkIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FMQUMgPSAiYXVkaW8vYWxhYyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19XTUEgPSAiYXVkaW8veC1tcy13bWEiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVNfQURQQ00gPSAiYXVkaW8veC1hZHBjbS1tcyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19EVklfSU1BX0FEUENNID0gImF1ZGlvL3gtYWRwY20tZHZpLWltYSI7CisKIAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUc0ID0gInZpZGVvL21wNCI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfV0FWID0gImF1ZGlvL3gtd2F2IjsKLWNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9PR0cgPSAiYXBwbGljYXRpb24vb2dnIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9PR0cgPSAiYXVkaW8vb2dnIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NQVRST1NLQSA9ICJ2aWRlby94LW1hdHJvc2thIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlRTID0gInZpZGVvL21wMnRzIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9BVkkgPSAidmlkZW8vYXZpIjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01ldGFEYXRhLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWV0YURhdGEuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZXRhRGF0YS5jcHAKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWV0YURhdGEuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZXRhRGF0YUJhc2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZXRhRGF0YUJhc2UuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZXRhRGF0YUJhc2UuY3BwCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01ldGFEYXRhQmFzZS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL09wdXNIZWFkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxM2U0MWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL09wdXNIZWFkZXIuY3BwCkBAIC0wLDAgKzEsMzUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJPcHVzSGVhZGVyIgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgIk9wdXNIZWFkZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBPcHVzIHVzZXMgVm9yYmlzIGNoYW5uZWwgbWFwcGluZywgYW5kIFZvcmJpcyBjaGFubmVsIG1hcHBpbmcgc3BlY2lmaWVzCisvLyBtYXBwaW5ncyBmb3IgdXAgdG8gOCBjaGFubmVscy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBwYXJ0IG9mIHRoZSBWb3JiaXMgSQorLy8gU3BlY2lmaWNhdGlvbjoKKy8vIGh0dHA6Ly93d3cueGlwaC5vcmcvdm9yYmlzL2RvYy9Wb3JiaXNfSV9zcGVjLmh0bWwKK2NvbnN0ZXhwciBpbnQga01heENoYW5uZWxzID0gODsKKworY29uc3RleHByIHVpbnQ4X3Qga09wdXNDaGFubmVsTWFwW2tNYXhDaGFubmVsc11ba01heENoYW5uZWxzXSA9IHsKKyAgICAgICAgezB9LAorICAgICAgICB7MCwgMX0sCisgICAgICAgIHswLCAyLCAxfSwKKyAgICAgICAgezAsIDEsIDIsIDN9LAorICAgICAgICB7MCwgNCwgMSwgMiwgM30sCisgICAgICAgIHswLCA0LCAxLCAyLCAzLCA1fSwKKyAgICAgICAgezAsIDQsIDEsIDIsIDMsIDUsIDZ9LAorICAgICAgICB7MCwgNiwgMSwgMiwgMywgNCwgNSwgN30sCit9OworCisvLyBTaXplIG9mIHRoZSBPcHVzIGhlYWRlciBleGNsdWRpbmcgb3B0aW9uYWwgbWFwcGluZyBpbmZvcm1hdGlvbi4KK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJTaXplID0gMTk7CisvLyBPZmZzZXQgdG8gbWFnaWMgc3RyaW5nIHRoYXQgc3RhcnRzIE9wdXMgaGVhZGVyLgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlckxhYmVsT2Zmc2V0ID0gMDsKKy8vIE9mZnNldCB0byBPcHVzIHZlcnNpb24gaW4gdGhlIE9wdXMgaGVhZGVyLgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlclZlcnNpb25PZmZzZXQgPSA4OworLy8gT2Zmc2V0IHRvIHRoZSBjaGFubmVsIGNvdW50IGJ5dGUgaW4gdGhlIE9wdXMgaGVhZGVyLgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlckNoYW5uZWxzT2Zmc2V0ID0gOTsKKy8vIE9mZnNldCB0byB0aGUgcHJlLXNraXAgdmFsdWUgaW4gdGhlIE9wdXMgaGVhZGVyLgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlclNraXBTYW1wbGVzT2Zmc2V0ID0gMTA7CisvLyBPZmZzZXQgdG8gc2FtcGxlIHJhdGUgaW4gdGhlIE9wdXMgaGVhZGVyLgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlclNhbXBsZVJhdGVPZmZzZXQgPSAxMjsKKy8vIE9mZnNldCB0byB0aGUgZ2FpbiB2YWx1ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyR2Fpbk9mZnNldCA9IDE2OworLy8gT2Zmc2V0IHRvIHRoZSBjaGFubmVsIG1hcHBpbmcgYnl0ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyQ2hhbm5lbE1hcHBpbmdPZmZzZXQgPSAxODsKKy8vIE9wdXMgSGVhZGVyIGNvbnRhaW5zIGEgc3RyZWFtIG1hcC4gVGhlIG1hcHBpbmcgdmFsdWVzIGFyZSBpbiB0aGUgaGVhZGVyCisvLyBiZXlvbmQgdGhlIGFsd2F5cyBwcmVzZW50IHxrT3B1c0hlYWRlclNpemV8IGJ5dGVzIG9mIGRhdGEuIFRoZSBtYXBwaW5nCisvLyBkYXRhIGNvbnRhaW5zIHN0cmVhbSBjb3VudCwgY291cGxpbmcgaW5mb3JtYXRpb24sIGFuZCBwZXIgY2hhbm5lbCBtYXBwaW5nCisvLyB2YWx1ZXM6CisvLyAgIC0gQnl0ZSAwOiBOdW1iZXIgb2Ygc3RyZWFtcy4KKy8vICAgLSBCeXRlIDE6IE51bWJlciBjb3VwbGVkLgorLy8gICAtIEJ5dGUgMjogU3RhcnRpbmcgYXQgYnl0ZSAyIGFyZSB8aGVhZGVyLT5jaGFubmVsc3wgdWludDggbWFwcGluZworLy8gICAgICAgICAgICAgdmFsdWVzLgorLy8gT2Zmc2V0IHRvIHRoZSBudW1iZXIgb2Ygc3RyZWFtcyBpbiB0aGUgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyTnVtU3RyZWFtc09mZnNldCA9IDE5OworLy8gT2Zmc2V0IHRvIHRoZSBudW1iZXIgb2Ygc3RyZWFtcyB0aGF0IGFyZSBjb3VwbGVkIGluIHRoZSBPcHVzIGhlYWRlci4KK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJOdW1Db3VwbGVkU3RyZWFtc09mZnNldCA9IDIwOworLy8gT2Zmc2V0IHRvIHRoZSBzdHJlYW0gdG8gY2hhbm5lbCBtYXBwaW5nIGluIHRoZSBPcHVzIGhlYWRlci4KK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgPSAyMTsKKworLy8gRGVmYXVsdCBhdWRpbyBvdXRwdXQgY2hhbm5lbCBsYXlvdXQuIFVzZWQgdG8gaW5pdGlhbGl6ZSB8c3RyZWFtX21hcHwgaW4KKy8vIE9wdXNIZWFkZXIsIGFuZCBwYXNzZWQgdG8gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2NyZWF0ZSgpIHdoZW4gdGhlIGhlYWRlcgorLy8gZG9lcyBub3QgY29udGFpbiBtYXBwaW5nIGluZm9ybWF0aW9uLiBUaGUgdmFsdWVzIGFyZSB2YWxpZCBvbmx5IGZvciBtb25vIGFuZAorLy8gc3RlcmVvIG91dHB1dDogT3B1cyBzdHJlYW1zIHdpdGggbW9yZSB0aGFuIDIgY2hhbm5lbHMgcmVxdWlyZSBhIHN0cmVhbSBtYXAuCitjb25zdGV4cHIgaW50IGtNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0ID0gMjsKKworc3RhdGljIHVpbnQxNl90IFJlYWRMRTE2KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhX3NpemUsIHVpbnQzMl90IHJlYWRfb2Zmc2V0KSB7CisgICAgLy8gY2hlY2sgd2hldGhlciB0aGUgMm5kIGJ5dGUgaXMgd2l0aGluIHRoZSBidWZmZXIKKyAgICBpZiAocmVhZF9vZmZzZXQgKyAxID49IGRhdGFfc2l6ZSkgcmV0dXJuIDA7CisgICAgdWludDE2X3QgdmFsOworICAgIHZhbCA9IGRhdGFbcmVhZF9vZmZzZXRdOworICAgIHZhbCB8PSBkYXRhW3JlYWRfb2Zmc2V0ICsgMV0gPDwgODsKKyAgICByZXR1cm4gdmFsOworfQorCisvLyBQYXJzZXMgT3B1cyBIZWFkZXIuIEhlYWRlciBzcGVjOiBodHRwOi8vd2lraS54aXBoLm9yZy9PZ2dPcHVzI0lEX0hlYWRlcgorYm9vbCBQYXJzZU9wdXNIZWFkZXIoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwgT3B1c0hlYWRlciogaGVhZGVyKSB7CisgICAgaWYgKGRhdGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChkYXRhX3NpemUgPCBrT3B1c0hlYWRlclNpemUpIHsKKyAgICAgICAgQUxPR1YoIkhlYWRlciBzaXplIGlzIHRvbyBzbWFsbC4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBoZWFkZXItPmNoYW5uZWxzID0gZGF0YVtrT3B1c0hlYWRlckNoYW5uZWxzT2Zmc2V0XTsKKworICAgIGlmIChoZWFkZXItPmNoYW5uZWxzIDwgMSB8fCBoZWFkZXItPmNoYW5uZWxzID4ga01heENoYW5uZWxzKSB7CisgICAgICAgIEFMT0dWKCJJbnZhbGlkIEhlYWRlciwgYmFkIGNoYW5uZWwgY291bnQ6ICVkIiwgaGVhZGVyLT5jaGFubmVscyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaGVhZGVyLT5za2lwX3NhbXBsZXMgPSBSZWFkTEUxNihkYXRhLCBkYXRhX3NpemUsIGtPcHVzSGVhZGVyU2tpcFNhbXBsZXNPZmZzZXQpOworICAgIGhlYWRlci0+Z2Fpbl9kYiA9IHN0YXRpY19jYXN0PGludDE2X3Q+KFJlYWRMRTE2KGRhdGEsIGRhdGFfc2l6ZSwga09wdXNIZWFkZXJHYWluT2Zmc2V0KSk7CisgICAgaGVhZGVyLT5jaGFubmVsX21hcHBpbmcgPSBkYXRhW2tPcHVzSGVhZGVyQ2hhbm5lbE1hcHBpbmdPZmZzZXRdOworICAgIGlmICghaGVhZGVyLT5jaGFubmVsX21hcHBpbmcpIHsKKyAgICAgICAgaWYgKGhlYWRlci0+Y2hhbm5lbHMgPiBrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dCkgeworICAgICAgICAgICAgQUxPR1YoIkludmFsaWQgSGVhZGVyLCBtaXNzaW5nIHN0cmVhbSBtYXAuIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaGVhZGVyLT5udW1fc3RyZWFtcyA9IDE7CisgICAgICAgIGhlYWRlci0+bnVtX2NvdXBsZWQgPSBoZWFkZXItPmNoYW5uZWxzID4gMTsKKyAgICAgICAgaGVhZGVyLT5zdHJlYW1fbWFwWzBdID0gMDsKKyAgICAgICAgaGVhZGVyLT5zdHJlYW1fbWFwWzFdID0gMTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChkYXRhX3NpemUgPCBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGhlYWRlci0+Y2hhbm5lbHMpIHsKKyAgICAgICAgQUxPR1YoIkludmFsaWQgc3RyZWFtIG1hcDsgaW5zdWZmaWNpZW50IGRhdGEgZm9yIGN1cnJlbnQgY2hhbm5lbCAiCisgICAgICAgICAgICAgICJjb3VudDogJWQiLAorICAgICAgICAgICAgICBoZWFkZXItPmNoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBoZWFkZXItPm51bV9zdHJlYW1zID0gZGF0YVtrT3B1c0hlYWRlck51bVN0cmVhbXNPZmZzZXRdOworICAgIGhlYWRlci0+bnVtX2NvdXBsZWQgPSBkYXRhW2tPcHVzSGVhZGVyTnVtQ291cGxlZFN0cmVhbXNPZmZzZXRdOworICAgIGlmIChoZWFkZXItPm51bV9zdHJlYW1zICsgaGVhZGVyLT5udW1fY291cGxlZCAhPSBoZWFkZXItPmNoYW5uZWxzKSB7CisgICAgICAgIEFMT0dWKCJJbmNvbnNpc3RlbnQgY2hhbm5lbCBtYXBwaW5nLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVyLT5jaGFubmVsczsgKytpKQorICAgICAgICBoZWFkZXItPnN0cmVhbV9tYXBbaV0gPSBkYXRhW2tPcHVzSGVhZGVyU3RyZWFtTWFwT2Zmc2V0ICsgaV07CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2ludCBXcml0ZU9wdXNIZWFkZXIoY29uc3QgT3B1c0hlYWRlciAmaGVhZGVyLCBpbnQgaW5wdXRfc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dHB1dCwgc2l6ZV90IG91dHB1dF9zaXplKSB7CisgICAgLy8gU2VlIGh0dHBzOi8vd2lraS54aXBoLm9yZy9PZ2dPcHVzI0lEX0hlYWRlci4KKyAgICBjb25zdCBzaXplX3QgdG90YWxfc2l6ZSA9IGtPcHVzSGVhZGVyU3RyZWFtTWFwT2Zmc2V0ICsgaGVhZGVyLmNoYW5uZWxzOworICAgIGlmIChvdXRwdXRfc2l6ZSA8IHRvdGFsX3NpemUpIHsKKyAgICAgICAgQUxPR0UoIk91dHB1dCBidWZmZXIgdG9vIHNtYWxsIGZvciBoZWFkZXIuIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvLyBlbnN1cmUgZW50aXJlIGhlYWRlciBpcyBjbGVhcmVkLCBldmVuIHRob3VnaCB3ZSBvdmVyd3JpdGUgbXVjaCBvZiBpdCBiZWxvdworICAgIG1lbXNldChvdXRwdXQsIDAsIG91dHB1dF9zaXplKTsKKworICAgIC8vIFNldCBtYWdpYyBzaWduYXR1cmUuCisgICAgbWVtY3B5KG91dHB1dCArIGtPcHVzSGVhZGVyTGFiZWxPZmZzZXQsICJPcHVzSGVhZCIsIDgpOworICAgIC8vIFNldCBPcHVzIHZlcnNpb24uCisgICAgb3V0cHV0W2tPcHVzSGVhZGVyVmVyc2lvbk9mZnNldF0gPSAxOworICAgIC8vIFNldCBjaGFubmVsIGNvdW50LgorICAgIG91dHB1dFtrT3B1c0hlYWRlckNoYW5uZWxzT2Zmc2V0XSA9ICh1aW50OF90KWhlYWRlci5jaGFubmVsczsKKyAgICAvLyBTZXQgcHJlLXNraXAKKyAgICBtZW1jcHkob3V0cHV0ICsga09wdXNIZWFkZXJTa2lwU2FtcGxlc09mZnNldCwgJmhlYWRlci5za2lwX3NhbXBsZXMsIHNpemVvZih1aW50MTZfdCkpOworICAgIC8vIFNldCBvcmlnaW5hbCBpbnB1dCBzYW1wbGUgcmF0ZSBpbiBIei4KKyAgICBtZW1jcHkob3V0cHV0ICsga09wdXNIZWFkZXJTYW1wbGVSYXRlT2Zmc2V0LCAmaW5wdXRfc2FtcGxlX3JhdGUsIHNpemVvZih1aW50MzJfdCkpOworICAgIC8vIFNldCBvdXRwdXQgZ2FpbiBpbiBkQi4KKyAgICBtZW1jcHkob3V0cHV0ICsga09wdXNIZWFkZXJHYWluT2Zmc2V0LCAmaGVhZGVyLmdhaW5fZGIsIHNpemVvZih1aW50MTZfdCkpOworCisgICAgaWYgKGhlYWRlci5jaGFubmVscyA+IDIpIHsKKyAgICAgICAgLy8gU2V0IGNoYW5uZWwgbWFwcGluZworICAgICAgICBvdXRwdXRba09wdXNIZWFkZXJDaGFubmVsTWFwcGluZ09mZnNldF0gPSAxOworICAgICAgICAvLyBBc3N1bWluZyBubyBjb3VwbGVkIHN0cmVhbXMuIFRoaXMgc2hvdWxkIGFjdHVhbGx5IGJlCisgICAgICAgIC8vIGNoYW5uZWxzKCkgLSB8Y291cGxlZF9zdHJlYW1zfC4KKyAgICAgICAgb3V0cHV0W2tPcHVzSGVhZGVyTnVtU3RyZWFtc09mZnNldF0gPSBoZWFkZXIuY2hhbm5lbHM7CisgICAgICAgIG91dHB1dFtrT3B1c0hlYWRlck51bUNvdXBsZWRTdHJlYW1zT2Zmc2V0XSA9IDA7CisKKyAgICAgICAgLy8gU2V0IHRoZSBhY3R1YWwgc3RyZWFtIG1hcC4KKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoZWFkZXIuY2hhbm5lbHM7ICsraSkgeworICAgICAgICAgICAgb3V0cHV0W2tPcHVzSGVhZGVyU3RyZWFtTWFwT2Zmc2V0ICsgaV0gPSBrT3B1c0NoYW5uZWxNYXBbaGVhZGVyLmNoYW5uZWxzIC0gMV1baV07CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGtPcHVzSGVhZGVyU3RyZWFtTWFwT2Zmc2V0ICsgaGVhZGVyLmNoYW5uZWxzICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgICBvdXRwdXRba09wdXNIZWFkZXJDaGFubmVsTWFwcGluZ09mZnNldF0gPSAwOworICAgICAgICByZXR1cm4ga09wdXNIZWFkZXJDaGFubmVsTWFwcGluZ09mZnNldCArIDE7CisgICAgfQorfQorCitpbnQgV3JpdGVPcHVzSGVhZGVycyhjb25zdCBPcHVzSGVhZGVyICZoZWFkZXIsIGludCBpbnB1dFNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXRwdXQsIHNpemVfdCBvdXRwdXRTaXplLCB1aW50NjRfdCBjb2RlY0RlbGF5LAorICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc2Vla1ByZVJvbGwpIHsKKyAgICBpZiAob3V0cHV0U2l6ZSA8IEFPUFVTX1VOSUZJRURfQ1NEX01JTlNJWkUpIHsKKyAgICAgICAgQUxPR0QoIkJ1ZmZlciBub3QgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdW5pZmllZCBPUFVTIENTRCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGludCBoZWFkZXJMZW4gPSAwOworCisgICAgLy8gQWRkIG9wdXMgaGVhZGVyCisgICAgLyoKKyAgICAgIEZvbGxvd2luZyBpcyB0aGUgQ1NEIHN5bnRheCBmb3Igc2lnbmFsbGluZyBPcHVzSGVhZGVyCisgICAgICAoaHR0cDovL3dpa2kueGlwaC5vcmcvT2dnT3B1cyNJRF9IZWFkZXIpCisKKyAgICAgIE1hcmtlciAoOCBieXRlcykgfCBMZW5ndGggKDggYnl0ZXMpIHwgT3B1c0hlYWRlcgorCisgICAgICBNYXJrZXJzIHN1cHBvcnRlZDoKKyAgICAgIEFPUFVTX0NTRF9PUFVTX0hFQURFUl9NQVJLRVIgLSBTaWduYWxzIE9wdXMgSGVhZGVyCisKKyAgICAgIExlbmd0aCBzaG91bGQgYmUgYSB2YWx1ZSB3aXRoaW4gQU9QVVNfT1BVU0hFQURfTUlOU0laRSBhbmQgQU9QVVNfT1BVU0hFQURfTUFYU0laRS4KKyAgICAqLworCisgICAgbWVtY3B5KG91dHB1dCArIGhlYWRlckxlbiwgQU9QVVNfQ1NEX09QVVNfSEVBREVSX01BUktFUiwgQU9QVVNfTUFSS0VSX1NJWkUpOworICAgIGhlYWRlckxlbiArPSBBT1BVU19NQVJLRVJfU0laRTsKKworICAgIC8vIFBsYWNlIGhvbGRlciBmb3Igb3B1c0hlYWRlciBTaXplCisgICAgaGVhZGVyTGVuICs9IEFPUFVTX0xFTkdUSF9TSVpFOworCisgICAgaW50IGhlYWRlclNpemUgPSBXcml0ZU9wdXNIZWFkZXIoaGVhZGVyLCBpbnB1dFNhbXBsZVJhdGUsIG91dHB1dCArIGhlYWRlckxlbiwKKyAgICAgICAgb3V0cHV0U2l6ZSAtIGhlYWRlckxlbik7CisgICAgaWYgKGhlYWRlclNpemUgPCAwKSB7CisgICAgICAgIEFMT0dEKCIlczogV3JpdGVPcHVzSGVhZGVyIGZhaWxlZCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBoZWFkZXJMZW4gKz0gaGVhZGVyU2l6ZTsKKworICAgIC8vIFVwZGF0ZSBvcHVzIGhlYWRlclNpemUgYWZ0ZXIgQU9QVVNfQ1NEX09QVVNfSEVBREVSX01BUktFUgorICAgIHVpbnQ2NF90IGxlbmd0aCA9IGhlYWRlclNpemU7CisgICAgbWVtY3B5KG91dHB1dCArIEFPUFVTX01BUktFUl9TSVpFLCAmbGVuZ3RoLCBBT1BVU19MRU5HVEhfU0laRSk7CisKKyAgICAvKgorICAgICAgRm9sbG93aW5nIGlzIHRoZSBDU0Qgc3ludGF4IGZvciBzaWduYWxsaW5nIGNvZGVjIGRlbGF5IGFuZAorICAgICAgc2VlayBwcmUtcm9sbCB3aGljaCBpcyB0byBiZSBhcHBlbmRlZCBhZnRlciBPcHVzSGVhZGVyCisKKyAgICAgIE1hcmtlciAoOCBieXRlcykgfCBMZW5ndGggKDggYnl0ZXMpIHwgU2FtcGxlcyBpbiBucyAoOCBieXRlcykKKworICAgICAgTWFya2VycyBzdXBwb3J0ZWQ6CisgICAgICBBT1BVU19DU0RfQ09ERUNfREVMQVlfTUFSS0VSIC0gY29kZWMgZGVsYXkgYXMgc2FtcGxlcyBpbiBucywgcmVwcmVzZW50ZWQgaW4gOCBieXRlcworICAgICAgQU9QVVNfQ1NEX1NFRUtfUFJFUk9MTF9NQVJLRVIgLSBwcmVyb2xsIGFkanVzdG1lbnQgYXMgc2FtcGxlcyBpbiBucywgcmVwcmVzZW50ZWQgaW4gOCBieXRlcworCisgICAgKi8KKyAgICBsZW5ndGggPSBzaXplb2YoY29kZWNEZWxheSk7CisgICAgaWYgKGhlYWRlckxlbiA+IChvdXRwdXRTaXplIC0gQU9QVVNfTUFSS0VSX1NJWkUgLSBBT1BVU19MRU5HVEhfU0laRSAtIGxlbmd0aCkpIHsKKyAgICAgICAgQUxPR0QoIkJ1ZmZlciBub3QgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgY29kZWMgZGVsYXkiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAvLyBBZGQgY29kZWMgZGVsYXkKKyAgICBtZW1jcHkob3V0cHV0ICsgaGVhZGVyTGVuLCBBT1BVU19DU0RfQ09ERUNfREVMQVlfTUFSS0VSLCBBT1BVU19NQVJLRVJfU0laRSk7CisgICAgaGVhZGVyTGVuICs9IEFPUFVTX01BUktFUl9TSVpFOworICAgIG1lbWNweShvdXRwdXQgKyBoZWFkZXJMZW4sICZsZW5ndGgsIEFPUFVTX0xFTkdUSF9TSVpFKTsKKyAgICBoZWFkZXJMZW4gKz0gQU9QVVNfTEVOR1RIX1NJWkU7CisgICAgbWVtY3B5KG91dHB1dCArIGhlYWRlckxlbiwgJmNvZGVjRGVsYXksIGxlbmd0aCk7CisgICAgaGVhZGVyTGVuICs9IGxlbmd0aDsKKworICAgIGxlbmd0aCA9IHNpemVvZihzZWVrUHJlUm9sbCk7CisgICAgaWYgKGhlYWRlckxlbiA+IChvdXRwdXRTaXplIC0gQU9QVVNfTUFSS0VSX1NJWkUgLSBBT1BVU19MRU5HVEhfU0laRSAtIGxlbmd0aCkpIHsKKyAgICAgICAgQUxPR0QoIkJ1ZmZlciBub3QgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgc2VlayBwcmUgcm9sbCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIC8vIEFkZCBza2lwIHByZSByb2xsCisgICAgbWVtY3B5KG91dHB1dCArIGhlYWRlckxlbiwgQU9QVVNfQ1NEX1NFRUtfUFJFUk9MTF9NQVJLRVIsIEFPUFVTX01BUktFUl9TSVpFKTsKKyAgICBoZWFkZXJMZW4gKz0gQU9QVVNfTUFSS0VSX1NJWkU7CisgICAgbWVtY3B5KG91dHB1dCArIGhlYWRlckxlbiwgJmxlbmd0aCwgQU9QVVNfTEVOR1RIX1NJWkUpOworICAgIGhlYWRlckxlbiArPSBBT1BVU19MRU5HVEhfU0laRTsKKyAgICBtZW1jcHkob3V0cHV0ICsgaGVhZGVyTGVuLCAmc2Vla1ByZVJvbGwsIGxlbmd0aCk7CisgICAgaGVhZGVyTGVuICs9IGxlbmd0aDsKKworICAgIHJldHVybiBoZWFkZXJMZW47Cit9CisKK2Jvb2wgSXNPcHVzSGVhZGVyKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBkYXRhX3NpemUpIHsKKyAgICBpZiAoZGF0YV9zaXplIDwgQU9QVVNfTUFSS0VSX1NJWkUpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiAhbWVtY21wKGRhdGEsIEFPUFVTX0NTRF9PUFVTX0hFQURFUl9NQVJLRVIsIEFPUFVTX01BUktFUl9TSVpFKTsKK30KKworYm9vbCBHZXRPcHVzSGVhZGVyQnVmZmVycyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqb3B1c0hlYWRCdWYsIHNpemVfdCAqb3B1c0hlYWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqY29kZWNEZWxheUJ1Ziwgc2l6ZV90ICpjb2RlY0RlbGF5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKnNlZWtQcmVSb2xsQnVmLCBzaXplX3QgKnNlZWtQcmVSb2xsU2l6ZSkgeworICAgICpjb2RlY0RlbGF5QnVmID0gTlVMTDsKKyAgICAqY29kZWNEZWxheVNpemUgPSAwOworICAgICpzZWVrUHJlUm9sbEJ1ZiA9IE5VTEw7CisgICAgKnNlZWtQcmVSb2xsU2l6ZSA9IDA7CisgICAgKm9wdXNIZWFkQnVmID0gTlVMTDsKKyAgICAqb3B1c0hlYWRTaXplID0gMDsKKworICAgIC8vIEFPUFVTX01BUktFUl9TSVpFIGlzIDggIk9wdXNIZWFkIiBpcyBvZiBzaXplIDgKKyAgICBpZiAoZGF0YV9zaXplIDwgOCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gQ2hlY2sgaWYgdGhlIENTRCBpcyBpbiBsZWdhY3kgZm9ybWF0CisgICAgaWYgKCFtZW1jbXAoIk9wdXNIZWFkIiwgZGF0YSwgOCkpIHsKKyAgICAgICAgaWYgKGRhdGFfc2l6ZSA8IEFPUFVTX09QVVNIRUFEX01JTlNJWkUgfHwgZGF0YV9zaXplID4gQU9QVVNfT1BVU0hFQURfTUFYU0laRSkgeworICAgICAgICAgICAgQUxPR0QoIlVuZXhwZWN0ZWQgc2l6ZSBmb3Igb3B1c0hlYWRTaXplICV6dSIsIGRhdGFfc2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgKm9wdXNIZWFkQnVmID0gKHZvaWQgKilkYXRhOworICAgICAgICAqb3B1c0hlYWRTaXplID0gZGF0YV9zaXplOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKG1lbWNtcChBT1BVU19DU0RfTUFSS0VSX1BSRUZJWCwgZGF0YSwgQU9QVVNfQ1NEX01BUktFUl9QUkVGSVhfU0laRSkgPT0gMCkgeworICAgICAgICBzaXplX3QgaSA9IDA7CisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgd2hpbGUgKGkgPD0gZGF0YV9zaXplIC0gQU9QVVNfTUFSS0VSX1NJWkUgLSBBT1BVU19MRU5HVEhfU0laRSkgeworICAgICAgICAgICAgdWludDhfdCAqY3NkQnVmID0gKHVpbnQ4X3QgKilkYXRhICsgaTsKKyAgICAgICAgICAgIGlmICghbWVtY21wKGNzZEJ1ZiwgQU9QVVNfQ1NEX09QVVNfSEVBREVSX01BUktFUiwgQU9QVVNfTUFSS0VSX1NJWkUpKSB7CisgICAgICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZ2YWx1ZSwgY3NkQnVmICsgQU9QVVNfTUFSS0VSX1NJWkUsIHNpemVvZih2YWx1ZSkpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IEFPUFVTX09QVVNIRUFEX01JTlNJWkUgfHwgdmFsdWUgPiBBT1BVU19PUFVTSEVBRF9NQVhTSVpFKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJVbmV4cGVjdGVkIHNpemUgZm9yIG9wdXNIZWFkU2l6ZSAlIiBQUkl1NjQsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpICs9IEFPUFVTX01BUktFUl9TSVpFICsgQU9QVVNfTEVOR1RIX1NJWkUgKyB2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAoaSA+IGRhdGFfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiTWFya2VyIHNpZ25hbHMgYSBoZWFkZXIgdGhhdCBpcyBsYXJnZXIgdGhhbiBpbnB1dCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpvcHVzSGVhZEJ1ZiA9IGNzZEJ1ZiArIEFPUFVTX01BUktFUl9TSVpFICsgQU9QVVNfTEVOR1RIX1NJWkU7CisgICAgICAgICAgICAgICAgKm9wdXNIZWFkU2l6ZSA9IHZhbHVlOworICAgICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1lbWNtcChjc2RCdWYsIEFPUFVTX0NTRF9DT0RFQ19ERUxBWV9NQVJLRVIsIEFPUFVTX01BUktFUl9TSVpFKSkgeworICAgICAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOworICAgICAgICAgICAgICAgIG1lbWNweSgmdmFsdWUsIGNzZEJ1ZiArIEFPUFVTX01BUktFUl9TSVpFLCBzaXplb2YodmFsdWUpKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gc2l6ZW9mKHVpbnQ2NF90KSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiVW5leHBlY3RlZCBzaXplIGZvciBjb2RlY0RlbGF5ICUiIFBSSXU2NCwgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGkgKz0gQU9QVVNfTUFSS0VSX1NJWkUgKyBBT1BVU19MRU5HVEhfU0laRSArIHZhbHVlOworICAgICAgICAgICAgICAgIGlmIChpID4gZGF0YV9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJNYXJrZXIgc2lnbmFscyBhIGhlYWRlciB0aGF0IGlzIGxhcmdlciB0aGFuIGlucHV0Iik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKmNvZGVjRGVsYXlCdWYgPSBjc2RCdWYgKyBBT1BVU19NQVJLRVJfU0laRSArIEFPUFVTX0xFTkdUSF9TSVpFOworICAgICAgICAgICAgICAgICpjb2RlY0RlbGF5U2l6ZSA9IHZhbHVlOworICAgICAgICAgICAgfSBlbHNlIGlmICghbWVtY21wKGNzZEJ1ZiwgQU9QVVNfQ1NEX1NFRUtfUFJFUk9MTF9NQVJLRVIsIEFPUFVTX01BUktFUl9TSVpFKSkgeworICAgICAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOworICAgICAgICAgICAgICAgIG1lbWNweSgmdmFsdWUsIGNzZEJ1ZiArIEFPUFVTX01BUktFUl9TSVpFLCBzaXplb2YodmFsdWUpKTsKKyAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gc2l6ZW9mKHVpbnQ2NF90KSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiVW5leHBlY3RlZCBzaXplIGZvciBzZWVrUHJlUm9sbFNpemUgJSIgUFJJdTY0LCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaSArPSBBT1BVU19NQVJLRVJfU0laRSArIEFPUFVTX0xFTkdUSF9TSVpFICsgdmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKGkgPiBkYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIk1hcmtlciBzaWduYWxzIGEgaGVhZGVyIHRoYXQgaXMgbGFyZ2VyIHRoYW4gaW5wdXQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqc2Vla1ByZVJvbGxCdWYgPSBjc2RCdWYgKyBBT1BVU19NQVJLRVJfU0laRSArIEFPUFVTX0xFTkdUSF9TSVpFOworICAgICAgICAgICAgICAgICpzZWVrUHJlUm9sbFNpemUgPSB2YWx1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmb3VuZDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBpdCBpc24ndCBpbiBlaXRoZXIgZm9ybWF0CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9QYXJzZWRNZXNzYWdlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vUGFyc2VkTWVzc2FnZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OWM5YWQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9QYXJzZWRNZXNzYWdlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTIsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiUGFyc2VkTWVzc2FnZS5oIgotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIHN0YXRpYwotc3A8UGFyc2VkTWVzc2FnZT4gUGFyc2VkTWVzc2FnZTo6UGFyc2UoCi0gICAgICAgIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBzaXplLCBib29sIG5vTW9yZURhdGEsIHNpemVfdCAqbGVuZ3RoKSB7Ci0gICAgc3A8UGFyc2VkTWVzc2FnZT4gbXNnID0gbmV3IFBhcnNlZE1lc3NhZ2U7Ci0gICAgc3NpemVfdCByZXMgPSBtc2ctPnBhcnNlKGRhdGEsIHNpemUsIG5vTW9yZURhdGEpOwotCi0gICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgKmxlbmd0aCA9IDA7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgICpsZW5ndGggPSByZXM7Ci0gICAgcmV0dXJuIG1zZzsKLX0KLQotUGFyc2VkTWVzc2FnZTo6UGFyc2VkTWVzc2FnZSgpIHsKLX0KLQotUGFyc2VkTWVzc2FnZTo6flBhcnNlZE1lc3NhZ2UoKSB7Ci19Ci0KLWJvb2wgUGFyc2VkTWVzc2FnZTo6ZmluZFN0cmluZyhjb25zdCBjaGFyICpuYW1lLCBBU3RyaW5nICp2YWx1ZSkgY29uc3QgewotICAgIEFTdHJpbmcga2V5ID0gbmFtZTsKLSAgICBrZXkudG9sb3dlcigpOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1EaWN0LmluZGV4T2ZLZXkoa2V5KTsKLQotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgdmFsdWUtPmNsZWFyKCk7Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgICp2YWx1ZSA9IG1EaWN0LnZhbHVlQXQoaW5kZXgpOwotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFBhcnNlZE1lc3NhZ2U6OmZpbmRJbnQzMihjb25zdCBjaGFyICpuYW1lLCBpbnQzMl90ICp2YWx1ZSkgY29uc3QgewotICAgIEFTdHJpbmcgc3RyaW5nVmFsdWU7Ci0KLSAgICBpZiAoIWZpbmRTdHJpbmcobmFtZSwgJnN0cmluZ1ZhbHVlKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY2hhciAqZW5kOwotICAgICp2YWx1ZSA9IHN0cnRvbChzdHJpbmdWYWx1ZS5jX3N0cigpLCAmZW5kLCAxMCk7Ci0KLSAgICBpZiAoZW5kID09IHN0cmluZ1ZhbHVlLmNfc3RyKCkgfHwgKmVuZCAhPSAnXDAnKSB7Ci0gICAgICAgICp2YWx1ZSA9IDA7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotY29uc3QgY2hhciAqUGFyc2VkTWVzc2FnZTo6Z2V0Q29udGVudCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUNvbnRlbnQuY19zdHIoKTsKLX0KLQotc3NpemVfdCBQYXJzZWRNZXNzYWdlOjpwYXJzZShjb25zdCBjaGFyICpkYXRhLCBzaXplX3Qgc2l6ZSwgYm9vbCBub01vcmVEYXRhKSB7Ci0gICAgaWYgKHNpemUgPT0gMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgc3NpemVfdCBsYXN0RGljdEluZGV4ID0gLTE7Ci0KLSAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKLSAgICBib29sIGhlYWRlcnNDb21wbGV0ZSA9IGZhbHNlOwotICAgIHdoaWxlIChvZmZzZXQgPCBzaXplKSB7Ci0gICAgICAgIHNpemVfdCBsaW5lRW5kT2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgICB3aGlsZSAobGluZUVuZE9mZnNldCArIDEgPCBzaXplCi0gICAgICAgICAgICAgICAgJiYgKGRhdGFbbGluZUVuZE9mZnNldF0gIT0gJ1xyJwotICAgICAgICAgICAgICAgICAgICAgICAgfHwgZGF0YVtsaW5lRW5kT2Zmc2V0ICsgMV0gIT0gJ1xuJykpIHsKLSAgICAgICAgICAgICsrbGluZUVuZE9mZnNldDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsaW5lRW5kT2Zmc2V0ICsgMSA+PSBzaXplKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBBU3RyaW5nIGxpbmUoJmRhdGFbb2Zmc2V0XSwgbGluZUVuZE9mZnNldCAtIG9mZnNldCk7Ci0KLSAgICAgICAgaWYgKG9mZnNldCA9PSAwKSB7Ci0gICAgICAgICAgICAvLyBTcGVjaWFsIGhhbmRsaW5nIGZvciB0aGUgcmVxdWVzdC9zdGF0dXMgbGluZS4KLQotICAgICAgICAgICAgbURpY3QuYWRkKEFTdHJpbmcoIl8iKSwgbGluZSk7Ci0gICAgICAgICAgICBvZmZzZXQgPSBsaW5lRW5kT2Zmc2V0ICsgMjsKLQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGluZUVuZE9mZnNldCA9PSBvZmZzZXQpIHsKLSAgICAgICAgICAgIC8vIEFuIGVtcHR5IGxpbmUgc2VwYXJhdGVzIGhlYWRlcnMgZnJvbSBib2R5LgotICAgICAgICAgICAgaGVhZGVyc0NvbXBsZXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIG9mZnNldCArPSAyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGluZS5jX3N0cigpWzBdID09ICcgJyB8fCBsaW5lLmNfc3RyKClbMF0gPT0gJ1x0JykgewotICAgICAgICAgICAgLy8gU3VwcG9ydCBmb3IgZm9sZGVkIGhlYWRlciB2YWx1ZXMuCi0KLSAgICAgICAgICAgIGlmIChsYXN0RGljdEluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgaXQncyBtYWxmb3JtZWQgc2luY2UgdGhlIGZpcnN0IGhlYWRlciBsaW5lCi0gICAgICAgICAgICAgICAgLy8gY2Fubm90IGNvbnRpbnVlIGFueXRoaW5nLi4uCi0KLSAgICAgICAgICAgICAgICBBU3RyaW5nICZ2YWx1ZSA9IG1EaWN0LmVkaXRWYWx1ZUF0KGxhc3REaWN0SW5kZXgpOwotICAgICAgICAgICAgICAgIHZhbHVlLmFwcGVuZChsaW5lKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb2Zmc2V0ID0gbGluZUVuZE9mZnNldCArIDI7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNzaXplX3QgY29sb25Qb3MgPSBsaW5lLmZpbmQoIjoiKTsKLSAgICAgICAgaWYgKGNvbG9uUG9zID49IDApIHsKLSAgICAgICAgICAgIEFTdHJpbmcga2V5KGxpbmUsIDAsIGNvbG9uUG9zKTsKLSAgICAgICAgICAgIGtleS50cmltKCk7Ci0gICAgICAgICAgICBrZXkudG9sb3dlcigpOwotCi0gICAgICAgICAgICBsaW5lLmVyYXNlKDAsIGNvbG9uUG9zICsgMSk7Ci0KLSAgICAgICAgICAgIGxhc3REaWN0SW5kZXggPSBtRGljdC5hZGQoa2V5LCBsaW5lKTsKLSAgICAgICAgfQotCi0gICAgICAgIG9mZnNldCA9IGxpbmVFbmRPZmZzZXQgKyAyOwotICAgIH0KLQotICAgIGlmICghaGVhZGVyc0NvbXBsZXRlICYmICghbm9Nb3JlRGF0YSB8fCBvZmZzZXQgPT0gMCkpIHsKLSAgICAgICAgLy8gV2UgZWl0aGVyIHNhdyB0aGUgZW1wdHkgbGluZSBzZXBhcmF0aW5nIGhlYWRlcnMgZnJvbSBib2R5Ci0gICAgICAgIC8vIG9yIHdlIHNhdyBhdCBsZWFzdCB0aGUgc3RhdHVzIGxpbmUgYW5kIGtub3cgdGhhdCBubyBtb3JlIGRhdGEKLSAgICAgICAgLy8gaXMgZ29pbmcgdG8gZm9sbG93LgotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRGljdC5zaXplKCk7ICsraSkgewotICAgICAgICBtRGljdC5lZGl0VmFsdWVBdChpKS50cmltKCk7Ci0gICAgfQotCi0gICAgaW50MzJfdCBjb250ZW50TGVuZ3RoOwotICAgIGlmICghZmluZEludDMyKCJjb250ZW50LWxlbmd0aCIsICZjb250ZW50TGVuZ3RoKSB8fCBjb250ZW50TGVuZ3RoIDwgMCkgewotICAgICAgICBjb250ZW50TGVuZ3RoID0gMDsKLSAgICB9Ci0KLSAgICBzaXplX3QgdG90YWxMZW5ndGggPSBvZmZzZXQgKyBjb250ZW50TGVuZ3RoOwotCi0gICAgaWYgKHNpemUgPCB0b3RhbExlbmd0aCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgbUNvbnRlbnQuc2V0VG8oJmRhdGFbb2Zmc2V0XSwgY29udGVudExlbmd0aCk7Ci0KLSAgICByZXR1cm4gdG90YWxMZW5ndGg7Ci19Ci0KLWJvb2wgUGFyc2VkTWVzc2FnZTo6Z2V0UmVxdWVzdEZpZWxkKHNpemVfdCBpbmRleCwgQVN0cmluZyAqZmllbGQpIGNvbnN0IHsKLSAgICBBU3RyaW5nIGxpbmU7Ci0gICAgQ0hFQ0soZmluZFN0cmluZygiXyIsICZsaW5lKSk7Ci0KLSAgICBzaXplX3QgcHJldk9mZnNldCA9IDA7Ci0gICAgc2l6ZV90IG9mZnNldCA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPD0gaW5kZXg7ICsraSkgewotICAgICAgICBpZiAob2Zmc2V0ID49IGxpbmUuc2l6ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBzc2l6ZV90IHNwYWNlUG9zID0gbGluZS5maW5kKCIgIiwgb2Zmc2V0KTsKLQotICAgICAgICBpZiAoc3BhY2VQb3MgPCAwKSB7Ci0gICAgICAgICAgICBzcGFjZVBvcyA9IGxpbmUuc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJldk9mZnNldCA9IG9mZnNldDsKLSAgICAgICAgb2Zmc2V0ID0gc3BhY2VQb3MgKyAxOwotICAgIH0KLQotICAgIGZpZWxkLT5zZXRUbyhsaW5lLCBwcmV2T2Zmc2V0LCBvZmZzZXQgLSBwcmV2T2Zmc2V0IC0gMSk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBQYXJzZWRNZXNzYWdlOjpnZXRTdGF0dXNDb2RlKGludDMyX3QgKnN0YXR1c0NvZGUpIGNvbnN0IHsKLSAgICBBU3RyaW5nIHN0YXR1c0NvZGVTdHJpbmc7Ci0gICAgaWYgKCFnZXRSZXF1ZXN0RmllbGQoMSwgJnN0YXR1c0NvZGVTdHJpbmcpKSB7Ci0gICAgICAgICpzdGF0dXNDb2RlID0gMDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGNoYXIgKmVuZDsKLSAgICAqc3RhdHVzQ29kZSA9IHN0cnRvbChzdGF0dXNDb2RlU3RyaW5nLmNfc3RyKCksICZlbmQsIDEwKTsKLQotICAgIGlmICgqZW5kICE9ICdcMCcgfHwgZW5kID09IHN0YXR1c0NvZGVTdHJpbmcuY19zdHIoKQotICAgICAgICAgICAgfHwgKCpzdGF0dXNDb2RlKSA8IDEwMCB8fCAoKnN0YXR1c0NvZGUpID4gOTk5KSB7Ci0gICAgICAgICpzdGF0dXNDb2RlID0gMDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1BU3RyaW5nIFBhcnNlZE1lc3NhZ2U6OmRlYnVnU3RyaW5nKCkgY29uc3QgewotICAgIEFTdHJpbmcgbGluZTsKLSAgICBDSEVDSyhmaW5kU3RyaW5nKCJfIiwgJmxpbmUpKTsKLQotICAgIGxpbmUuYXBwZW5kKCJcbiIpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRGljdC5zaXplKCk7ICsraSkgewotICAgICAgICBjb25zdCBBU3RyaW5nICZrZXkgPSBtRGljdC5rZXlBdChpKTsKLSAgICAgICAgY29uc3QgQVN0cmluZyAmdmFsdWUgPSBtRGljdC52YWx1ZUF0KGkpOwotCi0gICAgICAgIGlmIChrZXkgPT0gQVN0cmluZygiXyIpKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGxpbmUuYXBwZW5kKGtleSk7Ci0gICAgICAgIGxpbmUuYXBwZW5kKCI6ICIpOwotICAgICAgICBsaW5lLmFwcGVuZCh2YWx1ZSk7Ci0gICAgICAgIGxpbmUuYXBwZW5kKCJcbiIpOwotICAgIH0KLQotICAgIGxpbmUuYXBwZW5kKCJcbiIpOwotICAgIGxpbmUuYXBwZW5kKG1Db250ZW50KTsKLQotICAgIHJldHVybiBsaW5lOwotfQotCi0vLyBzdGF0aWMKLWJvb2wgUGFyc2VkTWVzc2FnZTo6R2V0QXR0cmlidXRlKAotICAgICAgICBjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICprZXksIEFTdHJpbmcgKnZhbHVlKSB7Ci0gICAgdmFsdWUtPmNsZWFyKCk7Ci0KLSAgICBzaXplX3Qga2V5TGVuID0gc3RybGVuKGtleSk7Ci0KLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIHdoaWxlIChpc3NwYWNlKCpzKSkgewotICAgICAgICAgICAgKytzOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgY2hhciAqY29sb25Qb3MgPSBzdHJjaHIocywgJzsnKTsKLQotICAgICAgICBzaXplX3QgbGVuID0KLSAgICAgICAgICAgIChjb2xvblBvcyA9PSBOVUxMKSA/IHN0cmxlbihzKSA6IGNvbG9uUG9zIC0gczsKLQotICAgICAgICBpZiAobGVuID49IGtleUxlbiArIDEgJiYgc1trZXlMZW5dID09ICc9JyAmJiAhc3RybmNtcChzLCBrZXksIGtleUxlbikpIHsKLSAgICAgICAgICAgIHZhbHVlLT5zZXRUbygmc1trZXlMZW4gKyAxXSwgbGVuIC0ga2V5TGVuIC0gMSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChjb2xvblBvcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBzID0gY29sb25Qb3MgKyAxOwotICAgIH0KLX0KLQotLy8gc3RhdGljCi1ib29sIFBhcnNlZE1lc3NhZ2U6OkdldEludDMyQXR0cmlidXRlKAotICAgICAgICBjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICprZXksIGludDMyX3QgKnZhbHVlKSB7Ci0gICAgQVN0cmluZyBzdHJpbmdWYWx1ZTsKLSAgICBpZiAoIUdldEF0dHJpYnV0ZShzLCBrZXksICZzdHJpbmdWYWx1ZSkpIHsKLSAgICAgICAgKnZhbHVlID0gMDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGNoYXIgKmVuZDsKLSAgICAqdmFsdWUgPSBzdHJ0b2woc3RyaW5nVmFsdWUuY19zdHIoKSwgJmVuZCwgMTApOwotCi0gICAgaWYgKGVuZCA9PSBzdHJpbmdWYWx1ZS5jX3N0cigpIHx8ICplbmQgIT0gJ1wwJykgewotICAgICAgICAqdmFsdWUgPSAwOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmNwcAppbmRleCA4ZjMyNTgyLi44MzRiODhmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuY3BwCkBAIC0yOCwxNCArMjgsMzEgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCisgICAgc2l6ZV90IGJ1ZlNpemUgPSBuIC8gNCAqIDM7CisgICAgc3A8QUJ1ZmZlcj4gYnVmID0gbmV3IEFCdWZmZXIoYnVmU2l6ZSk7CisKKyAgICBpZiAoZGVjb2RlQmFzZTY0KGJ1Zi0+ZGF0YSgpLCAmYnVmU2l6ZSwgcy5jX3N0cigpKSkgeworICAgICAgICBidWYtPnNldFJhbmdlKDAsIGJ1ZlNpemUpOworICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworYm9vbCBkZWNvZGVCYXNlNjQodWludDhfdCAqb3V0LCBzaXplX3QgKmluT3V0QnVmU2l6ZSwgY29uc3QgY2hhciogcykgeworICAgIHNpemVfdCBuID0gc3RybGVuKHMpOworCisgICAgaWYgKChuICUgNCkgIT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCiAgICAgc2l6ZV90IHBhZGRpbmcgPSAwOwotICAgIGlmIChuID49IDEgJiYgcy5jX3N0cigpW24gLSAxXSA9PSAnPScpIHsKKyAgICBpZiAobiA+PSAxICYmIHNbbiAtIDFdID09ICc9JykgewogICAgICAgICBwYWRkaW5nID0gMTsKIAotICAgICAgICBpZiAobiA+PSAyICYmIHMuY19zdHIoKVtuIC0gMl0gPT0gJz0nKSB7CisgICAgICAgIGlmIChuID49IDIgJiYgc1tuIC0gMl0gPT0gJz0nKSB7CiAgICAgICAgICAgICBwYWRkaW5nID0gMjsKIAotICAgICAgICAgICAgaWYgKG4gPj0gMyAmJiBzLmNfc3RyKClbbiAtIDNdID09ICc9JykgeworICAgICAgICAgICAgaWYgKG4gPj0gMyAmJiBzW24gLSAzXSA9PSAnPScpIHsKICAgICAgICAgICAgICAgICBwYWRkaW5nID0gMzsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNDUsMTUgKzYyLDEzIEBACiAgICAgLy8gYWxyZWFkeSBtYWRlIHN1cmUgdGhhdCBuICUgNCA9PSAwLgogICAgIHNpemVfdCBvdXRMZW4gPSAobiAvIDQpICogMyAtIHBhZGRpbmc7CiAKLSAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgQUJ1ZmZlcihvdXRMZW4pOwotICAgIHVpbnQ4X3QgKm91dCA9IGJ1ZmZlci0+ZGF0YSgpOwotICAgIGlmIChvdXQgPT0gTlVMTCB8fCBidWZmZXItPnNpemUoKSA8IG91dExlbikgewotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICBpZiAob3V0ID09IE5VTEwgfHwgKmluT3V0QnVmU2l6ZSA8IG91dExlbikgeworICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHNpemVfdCBqID0gMDsKICAgICB1aW50MzJfdCBhY2N1bSA9IDA7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICAgICAgY2hhciBjID0gcy5jX3N0cigpW2ldOworICAgICAgICBjaGFyIGMgPSBzW2ldOwogICAgICAgICB1bnNpZ25lZCB2YWx1ZTsKICAgICAgICAgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB7CiAgICAgICAgICAgICB2YWx1ZSA9IGMgLSAnQSc7CkBAIC02NiwxMCArODEsMTAgQEAKICAgICAgICAgfSBlbHNlIGlmIChjID09ICcvJyB8fCBjID09ICdfJykgewogICAgICAgICAgICAgdmFsdWUgPSA2MzsKICAgICAgICAgfSBlbHNlIGlmIChjICE9ICc9JykgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAoaSA8IG4gLSBwYWRkaW5nKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB2YWx1ZSA9IDA7CkBAIC04Niw3ICsxMDEsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICAqaW5PdXRCdWZTaXplID0gajsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogc3RhdGljIGNoYXIgZW5jb2RlNkJpdCh1bnNpZ25lZCB4KSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGF0YS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURhdGEuaAppbmRleCA4NWU0Mzc4Li5jNmMxMmZmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGF0YS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEYXRhLmgKQEAgLTc3NCw3ICs3NzQsNyBAQAogICAgICAgICAvKioKICAgICAgICAgICogTW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yLgogICAgICAgICAgKi8KLSAgICAgICAgQ3VzdG9tJiBvcGVyYXRvcj0oQ3VzdG9tICYmbykgeworICAgICAgICBDdXN0b20mIG9wZXJhdG9yPShDdXN0b20gJiZvKSBub2V4Y2VwdCB7CiAgICAgICAgICAgICBpZiAoJm8gIT0gdGhpcykgewogICAgICAgICAgICAgICAgIGlmICh0aGlzLT51c2VkKCkgJiYgIXRoaXMtPmNsZWFyKCkpIHsKICAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX3RyYXAoKTsKQEAgLTc5NSw3ICs3OTUsNyBAQAogICAgICAgICAvKioKICAgICAgICAgICogTW92ZSBjb25zdHJ1Y3Rvci4KICAgICAgICAgICovCi0gICAgICAgIEN1c3RvbShDdXN0b20gJiZvKSA6IEN1c3RvbSgpIHsKKyAgICAgICAgQ3VzdG9tKEN1c3RvbSAmJm8pIG5vZXhjZXB0IDogQ3VzdG9tKCkgewogICAgICAgICAgICAgKnRoaXMgPSBzdGQ6Om1vdmUobyk7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaAppbmRleCBiYWM4ZmE5Li5hYjE3YTAyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaApAQCAtNTMsOSArNTMsMTEgQEAKICNkZWZpbmUgTElURVJBTF9UT19TVFJJTkdfSU5URVJOQUwoeCkgICAgI3gKICNkZWZpbmUgTElURVJBTF9UT19TVFJJTkcoeCkgTElURVJBTF9UT19TVFJJTkdfSU5URVJOQUwoeCkKIAotI2lmZGVmIENIRUNLCi0jdW5kZWYgQ0hFQ0sKLSNlbmRpZgorLy8gYWxsb3cgdG8gdXNlIENIRUNLX09QIGZyb20gYW5kcm9pZC1iYXNlL2xvZ2dpbmcuaAorLy8gVE9ETzogbG9uZ3Rlcm0gcmVwbGFjZSB0aGlzIHdpdGggYW5kcm9pZC1iYXNlL2xvZ2dpbmcuaCwgYnV0IHRoZXJlIGFyZSBzb21lIG51YW5jZXMsIGUuZy4KKy8vIGFuZHJvaWQtYmFzZSBDSEVDS19PUCByZXF1aXJlcyBhIGNvcHkgY29uc3RydWN0b3IsIHdoZXJlYXMgd2UgZG9uJ3QuCisjaWZuZGVmIENIRUNLX09QCisKICNkZWZpbmUgQ0hFQ0soY29uZGl0aW9uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIExPR19BTFdBWVNfRkFUQUxfSUYoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAhKGNvbmRpdGlvbiksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTYzLDUxICs2NSwyMSBAQAogICAgICAgICAgICAgX19GSUxFX18gIjoiIExJVEVSQUxfVE9fU1RSSU5HKF9fTElORV9fKSAgICBcCiAgICAgICAgICAgICAiIENIRUNLKCIgI2NvbmRpdGlvbiAiKSBmYWlsZWQuIikKIAotI2RlZmluZSBNQUtFX0NPTVBBUkFUT1Ioc3VmZml4LG9wKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRlbXBsYXRlPGNsYXNzIEEsIGNsYXNzIEI+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEFTdHJpbmcgQ29tcGFyZV8jI3N1ZmZpeChjb25zdCBBICZhLCBjb25zdCBCICZiKSB7ICAgICAgXAotICAgICAgICBBU3RyaW5nIHJlczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoIShhIG9wIGIpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgcmVzLmFwcGVuZChhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgcmVzLmFwcGVuZCgiIHZzLiAiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgcmVzLmFwcGVuZChiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICByZXR1cm4gcmVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0KLQotTUFLRV9DT01QQVJBVE9SKEVRLD09KQotTUFLRV9DT01QQVJBVE9SKE5FLCE9KQotTUFLRV9DT01QQVJBVE9SKExFLDw9KQotTUFLRV9DT01QQVJBVE9SKEdFLD49KQotTUFLRV9DT01QQVJBVE9SKExULDwpCi1NQUtFX0NPTVBBUkFUT1IoR1QsPikKLQotI2lmZGVmIENIRUNLX09QCi0jdW5kZWYgQ0hFQ0tfT1AKLSNlbmRpZgotCiAjZGVmaW5lIENIRUNLX09QKHgseSxzdWZmaXgsb3ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIEFTdHJpbmcgX19fcmVzID0gQ29tcGFyZV8jI3N1ZmZpeCh4LCB5KTsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmICghX19fcmVzLmVtcHR5KCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IGF1dG8gJmEgPSB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IGF1dG8gJmIgPSB5OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICghKGEgb3AgYikpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICBBU3RyaW5nIF9fX2Z1bGwgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgX19GSUxFX18gIjoiIExJVEVSQUxfVE9fU1RSSU5HKF9fTElORV9fKSAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICIgQ0hFQ0tfIiAjc3VmZml4ICIoICIgI3ggIiwiICN5ICIpIGZhaWxlZDogIjsgICAgICBcCi0gICAgICAgICAgICBfX19mdWxsLmFwcGVuZChfX19yZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfX19mdWxsLmFwcGVuZChhKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfX19mdWxsLmFwcGVuZCgiIHZzLiAiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfX19mdWxsLmFwcGVuZChiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyIsIF9fX2Z1bGwuY19zdHIoKSk7ICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgfSB3aGlsZSAoZmFsc2UpCiAKLSNpZmRlZiBDSEVDS19FUQotI3VuZGVmIENIRUNLX0VRCi0jdW5kZWYgQ0hFQ0tfTkUKLSN1bmRlZiBDSEVDS19MRQotI3VuZGVmIENIRUNLX0xUCi0jdW5kZWYgQ0hFQ0tfR0UKLSN1bmRlZiBDSEVDS19HVAotI2VuZGlmCi0KICNkZWZpbmUgQ0hFQ0tfRVEoeCx5KSAgIENIRUNLX09QKHgseSxFUSw9PSkKICNkZWZpbmUgQ0hFQ0tfTkUoeCx5KSAgIENIRUNLX09QKHgseSxORSwhPSkKICNkZWZpbmUgQ0hFQ0tfTEUoeCx5KSAgIENIRUNLX09QKHgseSxMRSw8PSkKQEAgLTExNSw2ICs4Nyw4IEBACiAjZGVmaW5lIENIRUNLX0dFKHgseSkgICBDSEVDS19PUCh4LHksR0UsPj0pCiAjZGVmaW5lIENIRUNLX0dUKHgseSkgICBDSEVDS19PUCh4LHksR1QsPikKIAorI2VuZGlmCisKICNkZWZpbmUgVFJFU1BBU1MoLi4uKSBcCiAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgX19GSUxFX18gIjoiIExJVEVSQUxfVE9fU1RSSU5HKF9fTElORV9fKSAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FOZXR3b3JrU2Vzc2lvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU5ldHdvcmtTZXNzaW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkM2ViYWEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU5ldHdvcmtTZXNzaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBX05FVFdPUktfU0VTU0lPTl9IXwotCi0jZGVmaW5lIEFfTkVUV09SS19TRVNTSU9OX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+Ci0KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEFNZXNzYWdlOwotCi0vLyBIZWxwZXIgY2xhc3MgdG8gbWFuYWdlIGEgbnVtYmVyIG9mIGxpdmUgc29ja2V0cyAoZGF0YWdyYW0gYW5kIHN0cmVhbS1iYXNlZCkKLS8vIG9uIGEgc2luZ2xlIHRocmVhZC4gQ2xpZW50cyBhcmUgbm90aWZpZWQgYWJvdXQgYWN0aXZpdHkgdGhyb3VnaCBBTWVzc2FnZXMuCi1zdHJ1Y3QgQU5ldHdvcmtTZXNzaW9uIDogcHVibGljIFJlZkJhc2UgewotICAgIEFOZXR3b3JrU2Vzc2lvbigpOwotCi0gICAgc3RhdHVzX3Qgc3RhcnQoKTsKLSAgICBzdGF0dXNfdCBzdG9wKCk7Ci0KLSAgICBzdGF0dXNfdCBjcmVhdGVSVFNQQ2xpZW50KAotICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgdW5zaWduZWQgcG9ydCwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgICAgICBpbnQzMl90ICpzZXNzaW9uSUQpOwotCi0gICAgc3RhdHVzX3QgY3JlYXRlUlRTUFNlcnZlcigKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICZhZGRyLCB1bnNpZ25lZCBwb3J0LAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGludDMyX3QgKnNlc3Npb25JRCk7Ci0KLSAgICBzdGF0dXNfdCBjcmVhdGVVRFBTZXNzaW9uKAotICAgICAgICAgICAgdW5zaWduZWQgbG9jYWxQb3J0LCBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgaW50MzJfdCAqc2Vzc2lvbklEKTsKLQotICAgIHN0YXR1c190IGNyZWF0ZVVEUFNlc3Npb24oCi0gICAgICAgICAgICB1bnNpZ25lZCBsb2NhbFBvcnQsCi0gICAgICAgICAgICBjb25zdCBjaGFyICpyZW1vdGVIb3N0LAotICAgICAgICAgICAgdW5zaWduZWQgcmVtb3RlUG9ydCwKLSAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICAgICAgaW50MzJfdCAqc2Vzc2lvbklEKTsKLQotICAgIHN0YXR1c190IGNvbm5lY3RVRFBTZXNzaW9uKAotICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsIHVuc2lnbmVkIHJlbW90ZVBvcnQpOwotCi0gICAgLy8gcGFzc2l2ZQotICAgIHN0YXR1c190IGNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbigKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICZhZGRyLCB1bnNpZ25lZCBwb3J0LAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGludDMyX3QgKnNlc3Npb25JRCk7Ci0KLSAgICAvLyBhY3RpdmUKLSAgICBzdGF0dXNfdCBjcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb24oCi0gICAgICAgICAgICB1bnNpZ25lZCBsb2NhbFBvcnQsCi0gICAgICAgICAgICBjb25zdCBjaGFyICpyZW1vdGVIb3N0LAotICAgICAgICAgICAgdW5zaWduZWQgcmVtb3RlUG9ydCwKLSAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICAgICAgaW50MzJfdCAqc2Vzc2lvbklEKTsKLQotICAgIHN0YXR1c190IGRlc3Ryb3lTZXNzaW9uKGludDMyX3Qgc2Vzc2lvbklEKTsKLQotICAgIHN0YXR1c190IHNlbmRSZXF1ZXN0KAotICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsIGNvbnN0IHZvaWQgKmRhdGEsIHNzaXplX3Qgc2l6ZSA9IC0xLAotICAgICAgICAgICAgYm9vbCB0aW1lVmFsaWQgPSBmYWxzZSwgaW50NjRfdCB0aW1lVXMgPSAtMWxsKTsKLQotICAgIHN0YXR1c190IHN3aXRjaFRvV2ViU29ja2V0TW9kZShpbnQzMl90IHNlc3Npb25JRCk7Ci0KLSAgICBlbnVtIE5vdGlmaWNhdGlvblJlYXNvbiB7Ci0gICAgICAgIGtXaGF0RXJyb3IsCi0gICAgICAgIGtXaGF0Q29ubmVjdGVkLAotICAgICAgICBrV2hhdENsaWVudENvbm5lY3RlZCwKLSAgICAgICAga1doYXREYXRhLAotICAgICAgICBrV2hhdERhdGFncmFtLAotICAgICAgICBrV2hhdEJpbmFyeURhdGEsCi0gICAgICAgIGtXaGF0V2ViU29ja2V0TWVzc2FnZSwKLSAgICAgICAga1doYXROZXR3b3JrU3RhbGwsCi0gICAgfTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkFOZXR3b3JrU2Vzc2lvbigpOwotCi1wcml2YXRlOgotICAgIHN0cnVjdCBOZXR3b3JrVGhyZWFkOwotICAgIHN0cnVjdCBTZXNzaW9uOwotCi0gICAgTXV0ZXggbUxvY2s7Ci0gICAgc3A8VGhyZWFkPiBtVGhyZWFkOwotCi0gICAgaW50MzJfdCBtTmV4dFNlc3Npb25JRDsKLQotICAgIGludCBtUGlwZUZkWzJdOwotCi0gICAgS2V5ZWRWZWN0b3I8aW50MzJfdCwgc3A8U2Vzc2lvbj4gPiBtU2Vzc2lvbnM7Ci0KLSAgICBlbnVtIE1vZGUgewotICAgICAgICBrTW9kZUNyZWF0ZVVEUFNlc3Npb24sCi0gICAgICAgIGtNb2RlQ3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uUGFzc2l2ZSwKLSAgICAgICAga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25BY3RpdmUsCi0gICAgICAgIGtNb2RlQ3JlYXRlUlRTUFNlcnZlciwKLSAgICAgICAga01vZGVDcmVhdGVSVFNQQ2xpZW50LAotICAgIH07Ci0gICAgc3RhdHVzX3QgY3JlYXRlQ2xpZW50T3JTZXJ2ZXIoCi0gICAgICAgICAgICBNb2RlIG1vZGUsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqYWRkciwKLSAgICAgICAgICAgIHVuc2lnbmVkIHBvcnQsCi0gICAgICAgICAgICBjb25zdCBjaGFyICpyZW1vdGVIb3N0LAotICAgICAgICAgICAgdW5zaWduZWQgcmVtb3RlUG9ydCwKLSAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICAgICAgaW50MzJfdCAqc2Vzc2lvbklEKTsKLQotICAgIHZvaWQgdGhyZWFkTG9vcCgpOwotICAgIHZvaWQgaW50ZXJydXB0KCk7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgTWFrZVNvY2tldE5vbkJsb2NraW5nKGludCBzKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFOZXR3b3JrU2Vzc2lvbik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFfTkVUV09SS19TRVNTSU9OX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmgKaW5kZXggZmYwODZiMy4uMGY2Mjk5YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaApAQCAtOTMsNyArOTMsNyBAQAogICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0OwogCiBwcml2YXRlOgotICAgIHN0YXRpYyBjb25zdCBjaGFyICprRW1wdHlTdHJpbmc7CisgICAgY29uc3RleHByIHN0YXRpYyBjb25zdCBjaGFyICprRW1wdHlTdHJpbmcgPSAiIjsKIAogICAgIGNoYXIgKm1EYXRhOwogICAgIHNpemVfdCBtU2l6ZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGJkNGQ5ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFVRElPX1BSRVNFTlRBVElPTl9JTkZPX0hfCisjZGVmaW5lIEFVRElPX1BSRVNFTlRBVElPTl9JTkZPX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitlbnVtIEF1ZGlvUHJlc2VudGF0aW9uVmVyc2lvbiB7CisgICAgUFJFU0VOVEFUSU9OX1ZFUlNJT05fVU5ERUZJTkVEID0gMCwKKyAgICBQUkVTRU5UQVRJT05fVkVSU0lPTl8xLAorfTsKKworZW51bSBNYXN0ZXJpbmdJbmRpY2F0aW9uIHsKKyAgICBNQVNURVJJTkdfTk9UX0lORElDQVRFRCwKKyAgICBNQVNURVJFRF9GT1JfU1RFUkVPLAorICAgIE1BU1RFUkVEX0ZPUl9TVVJST1VORCwKKyAgICBNQVNURVJFRF9GT1JfM0QsCisgICAgTUFTVEVSRURfRk9SX0hFQURQSE9ORSwKK307CisKK3N0cnVjdCBBdWRpb1ByZXNlbnRhdGlvbiB7CisgICAgdWludDMyX3QgbVZlcnNpb24gPSBQUkVTRU5UQVRJT05fVkVSU0lPTl9VTkRFRklORUQ7CisgICAgaW50MzJfdCBtUHJlc2VudGF0aW9uSWQgPSAtMTsKKyAgICBpbnQzMl90IG1Qcm9ncmFtSWQgPSAtMTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IG1MYWJlbHM7CisgICAgc3RkOjpzdHJpbmcgbUxhbmd1YWdlOworICAgIE1hc3RlcmluZ0luZGljYXRpb24gbU1hc3RlcmluZ0luZGljYXRpb24gPSBNQVNURVJJTkdfTk9UX0lORElDQVRFRDsKKyAgICBib29sIG1BdWRpb0Rlc2NyaXB0aW9uQXZhaWxhYmxlID0gZmFsc2U7CisgICAgYm9vbCBtU3Bva2VuU3VidGl0bGVzQXZhaWxhYmxlID0gZmFsc2U7CisgICAgYm9vbCBtRGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZSA9IGZhbHNlOworfTsKKworc3RydWN0IEF1ZGlvUHJlc2VudGF0aW9uVjEgOiBwdWJsaWMgQXVkaW9QcmVzZW50YXRpb24geworICAgIEF1ZGlvUHJlc2VudGF0aW9uVjEoKSB7CisgICAgICAgIG1WZXJzaW9uID0gUFJFU0VOVEFUSU9OX1ZFUlNJT05fMTsKKyAgICB9Cit9OworCit0eXBlZGVmIHN0ZDo6dmVjdG9yPEF1ZGlvUHJlc2VudGF0aW9uPiBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb247CisKK3ZvaWQgc2VyaWFsaXplQXVkaW9QcmVzZW50YXRpb25zKGNvbnN0IEF1ZGlvUHJlc2VudGF0aW9uQ29sbGVjdGlvbiYgcHJlc2VudGF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpvc3RyZWFtKiBzZXJpYWxpemVkT3V0cHV0KTsKK3N0YXR1c190IGRlc2VyaWFsaXplQXVkaW9QcmVzZW50YXRpb25zKHN0ZDo6aXN0cmVhbSogc2VyaWFsaXplZElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uICpwcmVzZW50YXRpb25zKTsKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQVVESU9fUFJFU0VOVEFUSU9OX0lORk9fSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaAppbmRleCBkNmM3NjhkLi5jZDBhZjJiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oCkBAIC0yNyw2ICsyNyw4IEBACiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KICNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KIAorc3RydWN0IEFNZWRpYUZvcm1hdDsKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQ29sb3JVdGlscyB7CkBAIC0xMzUsNiArMTM3LDkgQEAKICAgICBzdGF0aWMgdm9pZCBjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMoCiAgICAgICAgICAgICBpbnQzMl90IHByaW1hcmllcywgaW50MzJfdCB0cmFuc2ZlciwgaW50MzJfdCBjb2VmZnMsIGJvb2wgZnVsbFJhbmdlLAogICAgICAgICAgICAgQ29sb3JBc3BlY3RzICZhc3BlY3RzKTsKKyAgICBzdGF0aWMgdm9pZCBjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9QbGF0Zm9ybUFzcGVjdHMoCisgICAgICAgIGludDMyX3QgcHJpbWFyaWVzLCBpbnQzMl90IGlzb3RyYW5zZmVyLCBpbnQzMl90IGNvZWZmcywgYm9vbCBmdWxsUmFuZ2UsCisgICAgICAgIGludDMyX3QgKnJhbmdlLCBpbnQzMl90ICpzdGFuZGFyZCwgaW50MzJfdCAqdHJhbnNmZXIpOwogCiAgICAgLy8gdW5wYWNrIGEgdWludDMyX3QgdG8gYSBmdWxsIENvbG9yQXNwZWN0cyBzdHJ1Y3QKICAgICBzdGF0aWMgQ29sb3JBc3BlY3RzIHVucGFja1RvQ29sb3JBc3BlY3RzKHVpbnQzMl90IHBhY2tlZCk7CkBAIC0xODAsNiArMTg1LDggQEAKIAogICAgIC8vIHdyaXRlcyB8aW5mb3wgaW50byBmb3JtYXQuCiAgICAgc3RhdGljIHZvaWQgc2V0SERSU3RhdGljSW5mb0ludG9Gb3JtYXQoY29uc3QgSERSU3RhdGljSW5mbyAmaW5mbywgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOworICAgIC8vIHdyaXRlcyB8aW5mb3wgaW50byBmb3JtYXQuCisgICAgc3RhdGljIHZvaWQgc2V0SERSU3RhdGljSW5mb0ludG9BTWVkaWFGb3JtYXQoY29uc3QgSERSU3RhdGljSW5mbyAmaW5mbywgQU1lZGlhRm9ybWF0ICpmb3JtYXQpOwogfTsKIAogaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZyhhbmRyb2lkOjpDb2xvclV0aWxzOjpDb2xvclN0YW5kYXJkIGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmgKaW5kZXggMjViZTg5Zi4uMWY5ZTYzNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmgKQEAgLTI1LDYgKzI1LDcgQEAKIAogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1ZQODsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19WUDk7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fQVYxOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0FWQzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0OwpAQCAtMzMsNiArMzQsMTAgQEAKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19SQVc7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1NDUkFNQkxFRDsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19ESVZYOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0RJVlgzOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1hWSUQ7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fTUpQRUc7CiAKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkI7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCOwpAQCAtNTIsNyArNTcsMTQgQEAKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NU0dTTTsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQzM7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzX0pPQzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQzQ7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fU0NSQU1CTEVEOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FMQUM7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fV01BOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01TX0FEUENNOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0RWSV9JTUFfQURQQ007CisKIAogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNDsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfV0FWOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTXV0ZXhlZC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTXV0ZXhlZC5oCmluZGV4IDE0M2IxNDAuLjAzNzIwZmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL011dGV4ZWQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NdXRleGVkLmgKQEAgLTEwMyw3ICsxMDMsNyBAQAogICAgIGNsYXNzIExvY2tlZCB7CiAgICAgcHVibGljOgogICAgICAgICBpbmxpbmUgTG9ja2VkKE11dGV4ZWQ8VD4gJm1QYXJlbnQpOwotICAgICAgICBpbmxpbmUgTG9ja2VkKExvY2tlZCAmJmZyb20pIDoKKyAgICAgICAgaW5saW5lIExvY2tlZChMb2NrZWQgJiZmcm9tKSBub2V4Y2VwdCA6CiAgICAgICAgICAgICBtTG9jayhmcm9tLm1Mb2NrKSwKICAgICAgICAgICAgIG1UcmVhc3VyZShmcm9tLm1UcmVhc3VyZSksCiAgICAgICAgICAgICBtTG9ja2VkKGZyb20ubUxvY2tlZCkge30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL09wdXNIZWFkZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL09wdXNIZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTAzN2FmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogVGhlIE9wdXMgc3BlY2lmaWNhdGlvbiBpcyBwYXJ0IG9mIElFVEYgUkZDIDY3MTY6CisgKiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2NzE2CisgKi8KKworI2lmbmRlZiBPUFVTX0hFQURFUl9IXworI2RlZmluZSBPUFVTX0hFQURFUl9IXworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qIENvbnN0YW50cyB1c2VkIGZvciBkZWxpbWl0aW5nIE9wdXMgQ1NEICovCisjZGVmaW5lIEFPUFVTX0NTRF9NQVJLRVJfUFJFRklYICJBT1BVUyIKKyNkZWZpbmUgQU9QVVNfQ1NEX01BUktFUl9QUkVGSVhfU0laRSAoc2l6ZW9mKEFPUFVTX0NTRF9NQVJLRVJfUFJFRklYKSAtIDEpCisjZGVmaW5lIEFPUFVTX0NTRF9PUFVTX0hFQURFUl9NQVJLRVIgQU9QVVNfQ1NEX01BUktFUl9QUkVGSVggIkhEUiIKKyNkZWZpbmUgQU9QVVNfQ1NEX0NPREVDX0RFTEFZX01BUktFUiBBT1BVU19DU0RfTUFSS0VSX1BSRUZJWCAiRExZIgorI2RlZmluZSBBT1BVU19DU0RfU0VFS19QUkVST0xMX01BUktFUiBBT1BVU19DU0RfTUFSS0VSX1BSRUZJWCAiUFJMIgorI2RlZmluZSBBT1BVU19NQVJLRVJfU0laRSA4CisjZGVmaW5lIEFPUFVTX0xFTkdUSF9TSVpFIHNpemVvZih1aW50NjRfdCkKKyNkZWZpbmUgQU9QVVNfQ1NEX0NPREVDX0RFTEFZX1NJWkUgXAorICAgICAoQU9QVVNfTUFSS0VSX1NJWkUpICsgKEFPUFVTX0xFTkdUSF9TSVpFKSArIHNpemVvZih1aW50NjRfdCkKKyNkZWZpbmUgQU9QVVNfQ1NEX1NFRUtfUFJFUk9MTF9TSVpFIFwKKyAgICAgKEFPUFVTX01BUktFUl9TSVpFKSArIChBT1BVU19MRU5HVEhfU0laRSkgKyBzaXplb2YodWludDY0X3QpCisKKy8qIE9wdXNIZWFkIGNzZCBtaW5pbXVtIHNpemUgaXMgMTkgKi8KKyNkZWZpbmUgQU9QVVNfT1BVU0hFQURfTUlOU0laRSAxOQorI2RlZmluZSBBT1BVU19DU0RfT1BVU0hFQURfTUlOU0laRSBcCisgICAgKEFPUFVTX01BUktFUl9TSVpFKSArIChBT1BVU19MRU5HVEhfU0laRSkgKyAoQU9QVVNfT1BVU0hFQURfTUlOU0laRSkKKworI2RlZmluZSBBT1BVU19VTklGSUVEX0NTRF9NSU5TSVpFIFwKKyAgICAoKEFPUFVTX0NTRF9PUFVTSEVBRF9NSU5TSVpFKSArIFwKKyAgICAgKEFPUFVTX0NTRF9DT0RFQ19ERUxBWV9TSVpFKSArIFwKKyAgICAgKEFPUFVTX0NTRF9TRUVLX1BSRVJPTExfU0laRSkpCisKKy8qIE9wdXNIZWFkIGNzZCBhdCBtYXggY2FuIGJlIEFPUFVTX0NTRF9PUFVTSEVBRF9NSU5TSVpFICsgMiArIG1heCBudW1iZXIgb2YgY2hhbm5lbHMgKDI1NSkgKi8KKyNkZWZpbmUgQU9QVVNfT1BVU0hFQURfTUFYU0laRSAoKEFPUFVTX09QVVNIRUFEX01JTlNJWkUpICsgMiArIDI1NSkKKyNkZWZpbmUgQU9QVVNfQ1NEX09QVVNIRUFEX01BWFNJWkUgXAorICAgIChBT1BVU19NQVJLRVJfU0laRSkgKyAoQU9QVVNfTEVOR1RIX1NJWkUpICsgKEFPUFVTX09QVVNIRUFEX01BWFNJWkUpCisKKyNkZWZpbmUgQU9QVVNfVU5JRklFRF9DU0RfTUFYU0laRSBcCisgICAgKChBT1BVU19DU0RfT1BVU0hFQURfTUFYU0laRSkgKyBcCisgICAgIChBT1BVU19DU0RfQ09ERUNfREVMQVlfU0laRSkgKyBcCisgICAgIChBT1BVU19DU0RfU0VFS19QUkVST0xMX1NJWkUpKQorCitzdHJ1Y3QgT3B1c0hlYWRlciB7CisgICAgaW50IGNoYW5uZWxzOworICAgIGludCBjaGFubmVsX21hcHBpbmc7CisgICAgaW50IG51bV9zdHJlYW1zOworICAgIGludCBudW1fY291cGxlZDsKKyAgICBpbnQxNl90IGdhaW5fZGI7CisgICAgaW50IHNraXBfc2FtcGxlczsKKyAgICB1aW50OF90IHN0cmVhbV9tYXBbOF07Cit9OworCitib29sIFBhcnNlT3B1c0hlYWRlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLCBPcHVzSGVhZGVyKiBoZWFkZXIpOworaW50IFdyaXRlT3B1c0hlYWRlcihjb25zdCBPcHVzSGVhZGVyICZoZWFkZXIsIGludCBpbnB1dF9zYW1wbGVfcmF0ZSwgdWludDhfdCogb3V0cHV0LCBzaXplX3Qgb3V0cHV0X3NpemUpOworYm9vbCBHZXRPcHVzSGVhZGVyQnVmZmVycyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqb3B1c0hlYWRCdWYsIHNpemVfdCAqb3B1c0hlYWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqY29kZWNEZWxheUJ1Ziwgc2l6ZV90ICpjb2RlY0RlbGF5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKnNlZWtQcmVSb2xsQnVmLCBzaXplX3QgKnNlZWtQcmVSb2xsU2l6ZSk7CitpbnQgV3JpdGVPcHVzSGVhZGVycyhjb25zdCBPcHVzSGVhZGVyICZoZWFkZXIsIGludCBpbnB1dFNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXRwdXQsIHNpemVfdCBvdXRwdXRTaXplLCB1aW50NjRfdCBjb2RlY0RlbGF5LAorICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc2Vla1ByZVJvbGwpOworYm9vbCBJc09wdXNIZWFkZXIoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSk7Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE9QVVNfSEVBREVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9QYXJzZWRNZXNzYWdlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9QYXJzZWRNZXNzYWdlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNDNhOTMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vUGFyc2VkTWVzc2FnZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBFbmNhcHN1bGF0ZXMgYW4gIkhUVFAvUlRTUCBzdHlsZSIgcmVzcG9uc2UsIGkuZS4gYSBzdGF0dXMgbGluZSwKLS8vIGtleS92YWx1ZSBwYWlycyBtYWtpbmcgdXAgdGhlIGhlYWRlcnMgYW5kIGFuIG9wdGlvbmFsIGJvZHkvY29udGVudC4KLXN0cnVjdCBQYXJzZWRNZXNzYWdlIDogcHVibGljIFJlZkJhc2UgewotICAgIHN0YXRpYyBzcDxQYXJzZWRNZXNzYWdlPiBQYXJzZSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBzaXplLCBib29sIG5vTW9yZURhdGEsIHNpemVfdCAqbGVuZ3RoKTsKLQotICAgIGJvb2wgZmluZFN0cmluZyhjb25zdCBjaGFyICpuYW1lLCBBU3RyaW5nICp2YWx1ZSkgY29uc3Q7Ci0gICAgYm9vbCBmaW5kSW50MzIoY29uc3QgY2hhciAqbmFtZSwgaW50MzJfdCAqdmFsdWUpIGNvbnN0OwotCi0gICAgY29uc3QgY2hhciAqZ2V0Q29udGVudCgpIGNvbnN0OwotCi0gICAgYm9vbCBnZXRSZXF1ZXN0RmllbGQoc2l6ZV90IGluZGV4LCBBU3RyaW5nICpmaWVsZCkgY29uc3Q7Ci0gICAgYm9vbCBnZXRTdGF0dXNDb2RlKGludDMyX3QgKnN0YXR1c0NvZGUpIGNvbnN0OwotCi0gICAgQVN0cmluZyBkZWJ1Z1N0cmluZygpIGNvbnN0OwotCi0gICAgc3RhdGljIGJvb2wgR2V0QXR0cmlidXRlKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmtleSwgQVN0cmluZyAqdmFsdWUpOwotCi0gICAgc3RhdGljIGJvb2wgR2V0SW50MzJBdHRyaWJ1dGUoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICprZXksIGludDMyX3QgKnZhbHVlKTsKLQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+UGFyc2VkTWVzc2FnZSgpOwotCi1wcml2YXRlOgotICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIEFTdHJpbmc+IG1EaWN0OwotICAgIEFTdHJpbmcgbUNvbnRlbnQ7Ci0KLSAgICBQYXJzZWRNZXNzYWdlKCk7Ci0KLSAgICBzc2l6ZV90IHBhcnNlKGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBzaXplLCBib29sIG5vTW9yZURhdGEpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUGFyc2VkTWVzc2FnZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaAppbmRleCBhYmM5NWUwLi42MGZiOWZmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaApAQCAtMjYsNiArMjYsOSBAQAogc3RydWN0IEFTdHJpbmc7CiAKIHNwPEFCdWZmZXI+IGRlY29kZUJhc2U2NChjb25zdCBBU3RyaW5nICZzKTsKKworYm9vbCBkZWNvZGVCYXNlNjQodWludDhfdCAqb3V0LCBzaXplX3QgKmluT3V0QnVmU2l6ZSwgY29uc3QgY2hhciogcyk7CisKIHZvaWQgZW5jb2RlQmFzZTY0KGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBBU3RyaW5nICpvdXQpOwogCiB2b2lkIGVuY29kZUJhc2U2NFVybChjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgQVN0cmluZyAqb3V0KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQW5kcm9pZC5icAppbmRleCAyZTQ5ZmM0Li44NjU1Y2FmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9BbmRyb2lkLmJwCkBAIC0yOSw5ICsyOSw2IEBACiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAogCiAgICAgcHJvZHVjdF92YXJpYWJsZXM6IHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQ2xlYXJNZWRpYUhUVFAuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9DbGVhck1lZGlhSFRUUC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU1N2M4YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvQ2xlYXJNZWRpYUhUVFAuY3BwCkBAIC0wLDAgKzEsMTg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDbGVhck1lZGlhSFRUUCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyTWVkaWFIVFRQLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBDb25uZWN0aW9uLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQ2xlYXJNZWRpYUhUVFA6OkNsZWFyTWVkaWFIVFRQKGNvbnN0IHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+ICZjb25uKQorICAgIDogbUluaXRDaGVjaygoY29ubiAhPSBOVUxMKSA/IE9LIDogTk9fSU5JVCksCisgICAgICBtSFRUUENvbm5lY3Rpb24oY29ubiksCisgICAgICBtQ2FjaGVkU2l6ZVZhbGlkKGZhbHNlKSwKKyAgICAgIG1DYWNoZWRTaXplKDBsbCkgeworfQorCitDbGVhck1lZGlhSFRUUDo6fkNsZWFyTWVkaWFIVFRQKCkgeworfQorCitzdGF0dXNfdCBDbGVhck1lZGlhSFRUUDo6Y29ubmVjdCgKKyAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKKyAgICAgICAgb2ZmNjRfdCAvKiBvZmZzZXQgKi8pIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBleHRIZWFkZXJzOworICAgIGlmIChoZWFkZXJzICE9IE5VTEwpIHsKKyAgICAgICAgZXh0SGVhZGVycyA9ICpoZWFkZXJzOworICAgIH0KKworICAgIGlmIChleHRIZWFkZXJzLmluZGV4T2ZLZXkoU3RyaW5nOCgiVXNlci1BZ2VudCIpKSA8IDApIHsKKyAgICAgICAgZXh0SGVhZGVycy5hZGQoU3RyaW5nOCgiVXNlci1BZ2VudCIpLCBTdHJpbmc4KE1ha2VVc2VyQWdlbnQoKS5jX3N0cigpKSk7CisgICAgfQorCisgICAgbUxhc3RVUkkgPSB1cmk7CisgICAgLy8gcmVjb25uZWN0KCkgY2FsbHMgd2l0aCB1cmkgPT0gb2xkIG1MYXN0VVJJLmNfc3RyKCksIHdoaWNoIGdldHMgemFwcGVkCisgICAgLy8gYXMgcGFydCBvZiB0aGUgYWJvdmUgYXNzaWdubWVudC4gRW5zdXJlIG5vIGFjY2lkZW50YWwgbGF0ZXIgdXNlLgorICAgIHVyaSA9IE5VTEw7CisKKyAgICBib29sIHN1Y2Nlc3MgPSBtSFRUUENvbm5lY3Rpb24tPmNvbm5lY3QobUxhc3RVUkkuY19zdHIoKSwgJmV4dEhlYWRlcnMpOworCisgICAgbUxhc3RIZWFkZXJzID0gZXh0SGVhZGVyczsKKworICAgIG1DYWNoZWRTaXplVmFsaWQgPSBmYWxzZTsKKworICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgIEFTdHJpbmcgc2FuaXRpemVkID0gdXJpRGVidWdTdHJpbmcobUxhc3RVUkkpOworICAgICAgICBtTmFtZSA9IFN0cmluZzg6OmZvcm1hdCgiQ2xlYXJNZWRpYUhUVFAoJXMpIiwgc2FuaXRpemVkLmNfc3RyKCkpOworICAgIH0KKworICAgIHJldHVybiBzdWNjZXNzID8gT0sgOiBVTktOT1dOX0VSUk9SOworfQorCit2b2lkIENsZWFyTWVkaWFIVFRQOjpjbG9zZSgpIHsKKyAgICBkaXNjb25uZWN0KCk7Cit9CisKK3ZvaWQgQ2xlYXJNZWRpYUhUVFA6OmRpc2Nvbm5lY3QoKSB7CisgICAgbU5hbWUgPSBTdHJpbmc4KCJDbGVhck1lZGlhSFRUUCg8ZGlzY29ubmVjdGVkPikiKTsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUhUVFBDb25uZWN0aW9uLT5kaXNjb25uZWN0KCk7Cit9CisKK3N0YXR1c190IENsZWFyTWVkaWFIVFRQOjppbml0Q2hlY2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Cit9CisKK3NzaXplX3QgQ2xlYXJNZWRpYUhUVFA6OnJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKworICAgIHNpemVfdCBudW1CeXRlc1JlYWQgPSAwOworICAgIHdoaWxlIChudW1CeXRlc1JlYWQgPCBzaXplKSB7CisgICAgICAgIHNpemVfdCBjb3B5ID0gc2l6ZSAtIG51bUJ5dGVzUmVhZDsKKworICAgICAgICBpZiAoY29weSA+IDY0ICogMTAyNCkgeworICAgICAgICAgICAgLy8gbGltaXQgdGhlIGJ1ZmZlciBzaXplcyB0cmFuc2ZlcnJlZCBhY3Jvc3MgYmluZGVyIGJvdW5kYXJpZXMKKyAgICAgICAgICAgIC8vIHRvIGF2b2lkIHNwdXJpb3VzIHRyYW5zYWN0aW9uIGZhaWx1cmVzLgorICAgICAgICAgICAgY29weSA9IDY0ICogMTAyNDsKKyAgICAgICAgfQorCisgICAgICAgIHNzaXplX3QgbiA9IG1IVFRQQ29ubmVjdGlvbi0+cmVhZEF0KAorICAgICAgICAgICAgICAgIG9mZnNldCArIG51bUJ5dGVzUmVhZCwgKHVpbnQ4X3QgKilkYXRhICsgbnVtQnl0ZXNSZWFkLCBjb3B5KTsKKworICAgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBuOworICAgICAgICB9IGVsc2UgaWYgKG4gPT0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBudW1CeXRlc1JlYWQgKz0gbjsKKyAgICB9CisKKyAgICBpbnQ2NF90IGRlbGF5VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lVXM7CisKKyAgICBhZGRCYW5kd2lkdGhNZWFzdXJlbWVudChudW1CeXRlc1JlYWQsIGRlbGF5VXMpOworCisgICAgcmV0dXJuIG51bUJ5dGVzUmVhZDsKK30KKworc3RhdHVzX3QgQ2xlYXJNZWRpYUhUVFA6OmdldFNpemUob2ZmNjRfdCAqc2l6ZSkgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIC8vIENhY2hpbmcgdGhlIHJldHVybmVkIHNpemUgc28gdGhhdCBpdCBzdGF5cyB2YWxpZCBldmVuIGFmdGVyIGEKKyAgICAvLyBkaXNjb25uZWN0LiBOdUNhY2hlZFNvdXJjZTIgcmVsaWVzIG9uIHRoaXMuCisKKyAgICBpZiAoIW1DYWNoZWRTaXplVmFsaWQpIHsKKyAgICAgICAgbUNhY2hlZFNpemUgPSBtSFRUUENvbm5lY3Rpb24tPmdldFNpemUoKTsKKyAgICAgICAgbUNhY2hlZFNpemVWYWxpZCA9IHRydWU7CisgICAgfQorCisgICAgKnNpemUgPSBtQ2FjaGVkU2l6ZTsKKworICAgIHJldHVybiAqc2l6ZSA8IDAgPyAqc2l6ZSA6IHN0YXRpY19jYXN0PHN0YXR1c190PihPSyk7Cit9CisKK3VpbnQzMl90IENsZWFyTWVkaWFIVFRQOjpmbGFncygpIHsKKyAgICByZXR1cm4ga1dhbnRzUHJlZmV0Y2hpbmcgfCBrSXNIVFRQQmFzZWRTb3VyY2U7Cit9CisKK3N0YXR1c190IENsZWFyTWVkaWFIVFRQOjpyZWNvbm5lY3RBdE9mZnNldChvZmY2NF90IG9mZnNldCkgeworICAgIHJldHVybiBjb25uZWN0KG1MYXN0VVJJLmNfc3RyKCksICZtTGFzdEhlYWRlcnMsIG9mZnNldCk7Cit9CisKKworU3RyaW5nOCBDbGVhck1lZGlhSFRUUDo6Z2V0VXJpKCkgeworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc4OjplbXB0eSgpOworICAgIH0KKworICAgIFN0cmluZzggdXJpOworICAgIGlmIChPSyA9PSBtSFRUUENvbm5lY3Rpb24tPmdldFVyaSgmdXJpKSkgeworICAgICAgICByZXR1cm4gdXJpOworICAgIH0KKyAgICByZXR1cm4gU3RyaW5nOChtTGFzdFVSSS5jX3N0cigpKTsKK30KKworU3RyaW5nOCBDbGVhck1lZGlhSFRUUDo6Z2V0TUlNRVR5cGUoKSBjb25zdCB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzgoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOworICAgIH0KKworICAgIFN0cmluZzggbWltZVR5cGU7CisgICAgc3RhdHVzX3QgZXJyID0gbUhUVFBDb25uZWN0aW9uLT5nZXRNSU1FVHlwZSgmbWltZVR5cGUpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisgICAgfQorCisgICAgcmV0dXJuIG1pbWVUeXBlOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9IVFRQSGVscGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvSFRUUEhlbHBlci5jcHAKaW5kZXggNzc4NDVlMi4uYjg5NWYwMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9IVFRQSGVscGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL0hUVFBIZWxwZXIuY3BwCkBAIC00MiwxMSArNDIsMTEgQEAKICAgICAgICAgICAgIGVudiwgZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvTWVkaWFIVFRQU2VydmljZSIpKTsKICAgICBDSEVDSyhjbGF6ei5nZXQoKSAhPSBOVUxMKTsKIAotICAgIGptZXRob2RJRCBjb25zdHJ1Y3RJRCA9IGVudi0+R2V0TWV0aG9kSUQoY2xhenouZ2V0KCksICI8aW5pdD4iLCAiKClWIik7CisgICAgam1ldGhvZElEIGNvbnN0cnVjdElEID0gZW52LT5HZXRNZXRob2RJRChjbGF6ei5nZXQoKSwgIjxpbml0PiIsICIoTGphdmEvdXRpbC9MaXN0OylWIik7CiAgICAgQ0hFQ0soY29uc3RydWN0SUQgIT0gTlVMTCk7CiAKICAgICBTY29wZWRMb2NhbFJlZjxqb2JqZWN0PiBodHRwU2VydmljZU9iaigKLSAgICAgICAgICAgIGVudiwgZW52LT5OZXdPYmplY3QoY2xhenouZ2V0KCksIGNvbnN0cnVjdElEKSk7CisgICAgICAgICAgICBlbnYsIGVudi0+TmV3T2JqZWN0KGNsYXp6LmdldCgpLCBjb25zdHJ1Y3RJRCwgTlVMTCkpOwogCiAgICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IGh0dHBTZXJ2aWNlOwogICAgIGlmIChodHRwU2VydmljZU9iai5nZXQoKSAhPSBOVUxMKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAKaW5kZXggN2M5MjQ3ZS4uMGZiYTNkYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cC9NZWRpYUhUVFAuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvTWVkaWFIVFRQLmNwcApAQCAtMzAsMTAgKzMwLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogTWVkaWFIVFRQOjpNZWRpYUhUVFAoY29uc3Qgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gJmNvbm4pCi0gICAgOiBtSW5pdENoZWNrKChjb25uICE9IE5VTEwpID8gT0sgOiBOT19JTklUKSwKLSAgICAgIG1IVFRQQ29ubmVjdGlvbihjb25uKSwKLSAgICAgIG1DYWNoZWRTaXplVmFsaWQoZmFsc2UpLAotICAgICAgbUNhY2hlZFNpemUoMGxsKSwKKyAgICA6IENsZWFyTWVkaWFIVFRQKGNvbm4pLAogICAgICAgbURybU1hbmFnZXJDbGllbnQoTlVMTCkgewogfQogCkBAIC00MSwxMTcgKzM4LDYgQEAKICAgICBjbGVhckRSTVN0YXRlX2woKTsKIH0KIAotc3RhdHVzX3QgTWVkaWFIVFRQOjpjb25uZWN0KAotICAgICAgICBjb25zdCBjaGFyICp1cmksCi0gICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAotICAgICAgICBvZmY2NF90IC8qIG9mZnNldCAqLykgewotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOwotICAgIH0KLQotICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGV4dEhlYWRlcnM7Ci0gICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgewotICAgICAgICBleHRIZWFkZXJzID0gKmhlYWRlcnM7Ci0gICAgfQotCi0gICAgaWYgKGV4dEhlYWRlcnMuaW5kZXhPZktleShTdHJpbmc4KCJVc2VyLUFnZW50IikpIDwgMCkgewotICAgICAgICBleHRIZWFkZXJzLmFkZChTdHJpbmc4KCJVc2VyLUFnZW50IiksIFN0cmluZzgoTWFrZVVzZXJBZ2VudCgpLmNfc3RyKCkpKTsKLSAgICB9Ci0KLSAgICBtTGFzdFVSSSA9IHVyaTsKLSAgICAvLyByZWNvbm5lY3QoKSBjYWxscyB3aXRoIHVyaSA9PSBvbGQgbUxhc3RVUkkuY19zdHIoKSwgd2hpY2ggZ2V0cyB6YXBwZWQKLSAgICAvLyBhcyBwYXJ0IG9mIHRoZSBhYm92ZSBhc3NpZ25tZW50LiBFbnN1cmUgbm8gYWNjaWRlbnRhbCBsYXRlciB1c2UuCi0gICAgdXJpID0gTlVMTDsKLQotICAgIGJvb2wgc3VjY2VzcyA9IG1IVFRQQ29ubmVjdGlvbi0+Y29ubmVjdChtTGFzdFVSSS5jX3N0cigpLCAmZXh0SGVhZGVycyk7Ci0KLSAgICBtTGFzdEhlYWRlcnMgPSBleHRIZWFkZXJzOwotCi0gICAgbUNhY2hlZFNpemVWYWxpZCA9IGZhbHNlOwotCi0gICAgaWYgKHN1Y2Nlc3MpIHsKLSAgICAgICAgQVN0cmluZyBzYW5pdGl6ZWQgPSB1cmlEZWJ1Z1N0cmluZyhtTGFzdFVSSSk7Ci0gICAgICAgIG1OYW1lID0gU3RyaW5nODo6Zm9ybWF0KCJNZWRpYUhUVFAoJXMpIiwgc2FuaXRpemVkLmNfc3RyKCkpOwotICAgIH0KLQotICAgIHJldHVybiBzdWNjZXNzID8gT0sgOiBVTktOT1dOX0VSUk9SOwotfQotCi12b2lkIE1lZGlhSFRUUDo6ZGlzY29ubmVjdCgpIHsKLSAgICBtTmFtZSA9IFN0cmluZzgoIk1lZGlhSFRUUCg8ZGlzY29ubmVjdGVkPikiKTsKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbUhUVFBDb25uZWN0aW9uLT5kaXNjb25uZWN0KCk7Ci19Ci0KLXN0YXR1c190IE1lZGlhSFRUUDo6aW5pdENoZWNrKCkgY29uc3QgewotICAgIHJldHVybiBtSW5pdENoZWNrOwotfQotCi1zc2l6ZV90IE1lZGlhSFRUUDo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOwotICAgIH0KLQotICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotCi0gICAgc2l6ZV90IG51bUJ5dGVzUmVhZCA9IDA7Ci0gICAgd2hpbGUgKG51bUJ5dGVzUmVhZCA8IHNpemUpIHsKLSAgICAgICAgc2l6ZV90IGNvcHkgPSBzaXplIC0gbnVtQnl0ZXNSZWFkOwotCi0gICAgICAgIGlmIChjb3B5ID4gNjQgKiAxMDI0KSB7Ci0gICAgICAgICAgICAvLyBsaW1pdCB0aGUgYnVmZmVyIHNpemVzIHRyYW5zZmVycmVkIGFjcm9zcyBiaW5kZXIgYm91bmRhcmllcwotICAgICAgICAgICAgLy8gdG8gYXZvaWQgc3B1cmlvdXMgdHJhbnNhY3Rpb24gZmFpbHVyZXMuCi0gICAgICAgICAgICBjb3B5ID0gNjQgKiAxMDI0OwotICAgICAgICB9Ci0KLSAgICAgICAgc3NpemVfdCBuID0gbUhUVFBDb25uZWN0aW9uLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgb2Zmc2V0ICsgbnVtQnl0ZXNSZWFkLCAodWludDhfdCAqKWRhdGEgKyBudW1CeXRlc1JlYWQsIGNvcHkpOwotCi0gICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIG47Ci0gICAgICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIG51bUJ5dGVzUmVhZCArPSBuOwotICAgIH0KLQotICAgIGludDY0X3QgZGVsYXlVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKLQotICAgIGFkZEJhbmR3aWR0aE1lYXN1cmVtZW50KG51bUJ5dGVzUmVhZCwgZGVsYXlVcyk7Ci0KLSAgICByZXR1cm4gbnVtQnl0ZXNSZWFkOwotfQotCi1zdGF0dXNfdCBNZWRpYUhUVFA6OmdldFNpemUob2ZmNjRfdCAqc2l6ZSkgewotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOwotICAgIH0KLQotICAgIC8vIENhY2hpbmcgdGhlIHJldHVybmVkIHNpemUgc28gdGhhdCBpdCBzdGF5cyB2YWxpZCBldmVuIGFmdGVyIGEKLSAgICAvLyBkaXNjb25uZWN0LiBOdUNhY2hlZFNvdXJjZTIgcmVsaWVzIG9uIHRoaXMuCi0KLSAgICBpZiAoIW1DYWNoZWRTaXplVmFsaWQpIHsKLSAgICAgICAgbUNhY2hlZFNpemUgPSBtSFRUUENvbm5lY3Rpb24tPmdldFNpemUoKTsKLSAgICAgICAgbUNhY2hlZFNpemVWYWxpZCA9IHRydWU7Ci0gICAgfQotCi0gICAgKnNpemUgPSBtQ2FjaGVkU2l6ZTsKLQotICAgIHJldHVybiAqc2l6ZSA8IDAgPyAqc2l6ZSA6IHN0YXRpY19jYXN0PHN0YXR1c190PihPSyk7Ci19Ci0KLXVpbnQzMl90IE1lZGlhSFRUUDo6ZmxhZ3MoKSB7Ci0gICAgcmV0dXJuIGtXYW50c1ByZWZldGNoaW5nIHwga0lzSFRUUEJhc2VkU291cmNlOwotfQotCi1zdGF0dXNfdCBNZWRpYUhUVFA6OnJlY29ubmVjdEF0T2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KSB7Ci0gICAgcmV0dXJuIGNvbm5lY3QobUxhc3RVUkkuY19zdHIoKSwgJm1MYXN0SGVhZGVycywgb2Zmc2V0KTsKLX0KLQogLy8gRFJNLi4uCiAKIHNwPERlY3J5cHRIYW5kbGU+IE1lZGlhSFRUUDo6RHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciogbWltZSkgewpAQCAtMTc2LDMzICs2Miw2IEBACiAgICAgcmV0dXJuIG1EZWNyeXB0SGFuZGxlOwogfQogCi1TdHJpbmc4IE1lZGlhSFRUUDo6Z2V0VXJpKCkgewotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmc4OjplbXB0eSgpOwotICAgIH0KLQotICAgIFN0cmluZzggdXJpOwotICAgIGlmIChPSyA9PSBtSFRUUENvbm5lY3Rpb24tPmdldFVyaSgmdXJpKSkgewotICAgICAgICByZXR1cm4gdXJpOwotICAgIH0KLSAgICByZXR1cm4gU3RyaW5nOChtTGFzdFVSSS5jX3N0cigpKTsKLX0KLQotU3RyaW5nOCBNZWRpYUhUVFA6OmdldE1JTUVUeXBlKCkgY29uc3QgewotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKLSAgICB9Ci0KLSAgICBTdHJpbmc4IG1pbWVUeXBlOwotICAgIHN0YXR1c190IGVyciA9IG1IVFRQQ29ubmVjdGlvbi0+Z2V0TUlNRVR5cGUoJm1pbWVUeXBlKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZzgoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwotICAgIH0KLQotICAgIHJldHVybiBtaW1lVHlwZTsKLX0KLQogdm9pZCBNZWRpYUhUVFA6OmNsZWFyRFJNU3RhdGVfbCgpIHsKICAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgewogICAgICAgICAvLyBUbyByZWxlYXNlIG1EZWNyeXB0SGFuZGxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5icAppbmRleCA4YTc3NDAxLi5jMGVlMTRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQuYnAKQEAgLTI1LDI1ICsyNSwyNiBAQAogICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY3J5cHRvIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJtZWRpYSIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmhpZGxhbGxvY2F0b3J1dGlscyIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9IVFRQRG93bmxvYWRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9IVFRQRG93bmxvYWRlci5jcHAKaW5kZXggNmMzNDk2My4uYzdlOTJjZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvSFRUUERvd25sb2FkZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0hUVFBEb3dubG9hZGVyLmNwcApAQCAtMjYsOCArMjYsOCBAQAogI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9DbGVhck1lZGlhSFRUUC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5oPgogI2luY2x1ZGUgPG9wZW5zc2wvYWVzLmg+CiAjaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KICNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgpAQCAtMzgsNyArMzgsNyBAQAogSFRUUERvd25sb2FkZXI6OkhUVFBEb3dubG9hZGVyKAogICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCiAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICZoZWFkZXJzKSA6Ci0gICAgbUhUVFBEYXRhU291cmNlKG5ldyBNZWRpYUhUVFAoaHR0cFNlcnZpY2UtPm1ha2VIVFRQQ29ubmVjdGlvbigpKSksCisgICAgbUhUVFBEYXRhU291cmNlKG5ldyBDbGVhck1lZGlhSFRUUChodHRwU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCkpKSwKICAgICBtRXh0cmFIZWFkZXJzKGhlYWRlcnMpLAogICAgIG1EaXNjb25uZWN0aW5nKGZhbHNlKSB7CiB9CkBAIC05MSw3ICs5MSw3IEBACiAKICAgICBpZiAocmVjb25uZWN0KSB7CiAgICAgICAgIGlmICghc3RybmNhc2VjbXAodXJsLCAiZmlsZTovLyIsIDcpKSB7Ci0gICAgICAgICAgICBtRGF0YVNvdXJjZSA9IG5ldyBGaWxlU291cmNlKHVybCArIDcpOworICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBuZXcgQ2xlYXJGaWxlU291cmNlKHVybCArIDcpOwogICAgICAgICB9IGVsc2UgaWYgKHN0cm5jYXNlY21wKHVybCwgImh0dHA6Ly8iLCA3KQogICAgICAgICAgICAgICAgICYmIHN0cm5jYXNlY21wKHVybCwgImh0dHBzOi8vIiwgOCkpIHsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcAppbmRleCA3ZWZmOGViLi45Y2Y5N2M3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwCkBAIC00NCwxMCArNDQsMTAgQEAKIAogLy8gc3RhdGljCiAvLyBCYW5kd2lkdGggU3dpdGNoIE1hcmsgRGVmYXVsdHMKLWNvbnN0IGludDY0X3QgTGl2ZVNlc3Npb246OmtVcFN3aXRjaE1hcmtVcyA9IDE1MDAwMDAwbGw7Ci1jb25zdCBpbnQ2NF90IExpdmVTZXNzaW9uOjprRG93blN3aXRjaE1hcmtVcyA9IDIwMDAwMDAwbGw7Ci1jb25zdCBpbnQ2NF90IExpdmVTZXNzaW9uOjprVXBTd2l0Y2hNYXJnaW5VcyA9IDUwMDAwMDBsbDsKLWNvbnN0IGludDY0X3QgTGl2ZVNlc3Npb246OmtSZXN1bWVUaHJlc2hvbGRVcyA9IDEwMDAwMGxsOworY29uc3QgaW50NjRfdCBMaXZlU2Vzc2lvbjo6a1VwU3dpdGNoTWFya1VzID0gMTUwMDAwMDBMTDsKK2NvbnN0IGludDY0X3QgTGl2ZVNlc3Npb246OmtEb3duU3dpdGNoTWFya1VzID0gMjAwMDAwMDBMTDsKK2NvbnN0IGludDY0X3QgTGl2ZVNlc3Npb246OmtVcFN3aXRjaE1hcmdpblVzID0gNTAwMDAwMExMOworY29uc3QgaW50NjRfdCBMaXZlU2Vzc2lvbjo6a1Jlc3VtZVRocmVzaG9sZFVzID0gMTAwMDAwTEw7CiAKIC8vVE9ETzogcmVkZWZpbmUgdGhpcyBtYXJrIHRvIGEgZmFpciB2YWx1ZQogLy8gZGVmYXVsdCBidWZmZXIgdW5kZXJmbG93IG1hcmsKQEAgLTY2LDkgKzY2LDkgQEAKICAgICAvLyBCYW5kd2lkdGggZXN0aW1hdGlvbiBwYXJhbWV0ZXJzCiAgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga1Nob3J0VGVybUJhbmR3aWR0aEl0ZW1zID0gMzsKICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrTWluQmFuZHdpZHRoSGlzdG9yeUl0ZW1zID0gMjA7Ci0gICAgc3RhdGljIGNvbnN0IGludDY0X3Qga01pbkJhbmR3aWR0aEhpc3RvcnlXaW5kb3dVcyA9IDUwMDAwMDBsbDsgLy8gNSBzZWMKLSAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWF4QmFuZHdpZHRoSGlzdG9yeVdpbmRvd1VzID0gMzAwMDAwMDBsbDsgLy8gMzAgc2VjCi0gICAgc3RhdGljIGNvbnN0IGludDY0X3Qga01heEJhbmR3aWR0aEhpc3RvcnlBZ2VVcyA9IDYwMDAwMDAwbGw7IC8vIDYwIHNlYworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNaW5CYW5kd2lkdGhIaXN0b3J5V2luZG93VXMgPSA1MDAwMDAwTEw7IC8vIDUgc2VjCisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga01heEJhbmR3aWR0aEhpc3RvcnlXaW5kb3dVcyA9IDMwMDAwMDAwTEw7IC8vIDMwIHNlYworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNYXhCYW5kd2lkdGhIaXN0b3J5QWdlVXMgPSA2MDAwMDAwMExMOyAvLyA2MCBzZWMKIAogICAgIHN0cnVjdCBCYW5kd2lkdGhFbnRyeSB7CiAgICAgICAgIGludDY0X3QgbVRpbWVzdGFtcFVzOwpAQCAtMjg0LDcgKzI4NCw3IEBACiAgICAgICBtUHJldkJ1ZmZlclBlcmNlbnRhZ2UoLTEpLAogICAgICAgbUN1ckJhbmR3aWR0aEluZGV4KC0xKSwKICAgICAgIG1PcmlnQmFuZHdpZHRoSW5kZXgoLTEpLAotICAgICAgbUxhc3RCYW5kd2lkdGhCcHMoLTFsbCksCisgICAgICBtTGFzdEJhbmR3aWR0aEJwcygtMUxMKSwKICAgICAgIG1MYXN0QmFuZHdpZHRoU3RhYmxlKGZhbHNlKSwKICAgICAgIG1CYW5kd2lkdGhFc3RpbWF0b3IobmV3IEJhbmR3aWR0aEVzdGltYXRvcigpKSwKICAgICAgIG1NYXhXaWR0aCg3MjApLApAQCAtMjk0LDggKzI5NCw4IEBACiAgICAgICBtU3dhcE1hc2soMCksCiAgICAgICBtU3dpdGNoR2VuZXJhdGlvbigwKSwKICAgICAgIG1TdWJ0aXRsZUdlbmVyYXRpb24oMCksCi0gICAgICBtTGFzdERlcXVldWVkVGltZVVzKDBsbCksCi0gICAgICBtUmVhbFRpbWVCYXNlVXMoMGxsKSwKKyAgICAgIG1MYXN0RGVxdWV1ZWRUaW1lVXMoMExMKSwKKyAgICAgIG1SZWFsVGltZUJhc2VVcygwTEwpLAogICAgICAgbVJlY29uZmlndXJhdGlvbkluUHJvZ3Jlc3MoZmFsc2UpLAogICAgICAgbVN3aXRjaEluUHJvZ3Jlc3MoZmFsc2UpLAogICAgICAgbVVwU3dpdGNoTWFyayhrVXBTd2l0Y2hNYXJrVXMpLApAQCAtNDQ1LDcgKzQ0NSw3IEBACiAgICAgICAgICAgICAgICByZXR1cm4gLUVBR0FJTjsKICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPnNldEludDMyKAotICAgICAgICAgICAgICAgICAgICAidHJhY2tJbmRleCIsIG1QbGF5bGlzdC0+Z2V0U2VsZWN0ZWRJbmRleCgpKTsKKyAgICAgICAgICAgICAgICAgICAgInRyYWNrLWluZGV4IiwgbVBsYXlsaXN0LT5nZXRTZWxlY3RlZEluZGV4KCkpOwogICAgICAgICAgICAgKCphY2Nlc3NVbml0KS0+bWV0YSgpLT5zZXRJbnQ2NCgiYmFzZVVzIiwgbVJlYWxUaW1lQmFzZVVzKTsKICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0gPT0gU1RSRUFNVFlQRV9NRVRBREFUQSkgewogICAgICAgICAgICAgSExTVGltZSBtZFRpbWUoKCphY2Nlc3NVbml0KS0+bWV0YSgpKTsKQEAgLTg0NCw3ICs4NDQsNyBAQAogICAgICAgICAgICAgICAgICAgICAvLyAoSWYgd2UgZG9uJ3QgaGF2ZSB0aGF0IGN1c2hpb24gd2UnZCByYXRoZXIgY2FuY2VsIGFuZCB0cnkgYWdhaW4uKQogICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRlbGF5VXMgPQogICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoVXAgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrVW5kZXJmbG93TWFya01zICogMTAwMGxsICsgMTAwMDAwMGxsKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrVW5kZXJmbG93TWFya01zICogMTAwMExMICsgMTAwMDAwMExMKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMDsKICAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkUmVzdW1lVW50aWwgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHN0b3BQYXJhbXMgPSBtc2c7CkBAIC05NTQsNyArOTU0LDcgQEAKIAogLy8gc3RhdGljCiBib29sIExpdmVTZXNzaW9uOjppc0JhbmR3aWR0aFZhbGlkKGNvbnN0IEJhbmR3aWR0aEl0ZW0gJml0ZW0pIHsKLSAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrQmxhY2tsaXN0V2luZG93VXMgPSAzMDAgKiAxMDAwMDAwbGw7CisgICAgc3RhdGljIGNvbnN0IGludDY0X3Qga0JsYWNrbGlzdFdpbmRvd1VzID0gMzAwICogMTAwMDAwMExMOwogICAgIHJldHVybiBpdGVtLm1MYXN0RmFpbHVyZVVzIDwgMAogICAgICAgICAgICAgfHwgQUxvb3Blcjo6R2V0Tm93VXMoKSAtIGl0ZW0ubUxhc3RGYWlsdXJlVXMgPiBrQmxhY2tsaXN0V2luZG93VXM7CiB9CkBAIC0xMDYwLDcgKzEwNjAsNyBAQAogICAgICAgICAgICAgQmFuZHdpZHRoSXRlbSBpdGVtOwogCiAgICAgICAgICAgICBpdGVtLm1QbGF5bGlzdEluZGV4ID0gaTsKLSAgICAgICAgICAgIGl0ZW0ubUxhc3RGYWlsdXJlVXMgPSAtMWxsOworICAgICAgICAgICAgaXRlbS5tTGFzdEZhaWx1cmVVcyA9IC0xTEw7CiAKICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtZXRhOwogICAgICAgICAgICAgQVN0cmluZyB1cmk7CkBAIC0xMTE0LDcgKzExMTQsNyBAQAogCiAgICAgbVBsYXlsaXN0LT5waWNrUmFuZG9tTWVkaWFJdGVtcygpOwogICAgIGNoYW5nZUNvbmZpZ3VyYXRpb24oCi0gICAgICAgICAgICAwbGwgLyogdGltZVVzICovLCBpbml0aWFsQmFuZHdpZHRoSW5kZXgsIGZhbHNlIC8qIHBpY2tUcmFjayAqLyk7CisgICAgICAgICAgICAwTEwgLyogdGltZVVzICovLCBpbml0aWFsQmFuZHdpZHRoSW5kZXgsIGZhbHNlIC8qIHBpY2tUcmFjayAqLyk7CiB9CiAKIHZvaWQgTGl2ZVNlc3Npb246OmZpbmlzaERpc2Nvbm5lY3QoKSB7CkBAIC0xMTc1LDcgKzExNzUsNyBAQAogICAgIEZldGNoZXJJbmZvIGluZm87CiAgICAgaW5mby5tRmV0Y2hlciA9IG5ldyBQbGF5bGlzdEZldGNoZXIoCiAgICAgICAgICAgICBub3RpZnksIHRoaXMsIHVyaSwgbUN1ckJhbmR3aWR0aEluZGV4LCBtU3VidGl0bGVHZW5lcmF0aW9uKTsKLSAgICBpbmZvLm1EdXJhdGlvblVzID0gLTFsbDsKKyAgICBpbmZvLm1EdXJhdGlvblVzID0gLTFMTDsKICAgICBpbmZvLm1Ub0JlUmVtb3ZlZCA9IGZhbHNlOwogICAgIGluZm8ubVRvQmVSZXN1bWVkID0gZmFsc2U7CiAgICAgbUZldGNoZXJMb29wZXItPnJlZ2lzdGVySGFuZGxlcihpbmZvLm1GZXRjaGVyKTsKQEAgLTEyMzQsNyArMTIzNCw3IEBACiAgICAgICAgIGNvbnN0IEFTdHJpbmcgJnVyaSwgdWludDMyX3Qgc3RyZWFtTWFzaywgaW50NjRfdCB0aW1lVXMsIGJvb2wgbmV3VXJpKSB7CiAgICAgc3NpemVfdCBpbmRleCA9IG1GZXRjaGVySW5mb3MuaW5kZXhPZktleSh1cmkpOwogICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR0UoImRpZCBub3QgZmluZCBmZXRjaGVyIGZvciB1cmk6ICVzIiwgdXJpLmNfc3RyKCkpOworICAgICAgICBBTE9HRSgiZGlkIG5vdCBmaW5kIGZldGNoZXIgZm9yIHVyaTogJXMiLCB1cmlEZWJ1Z1N0cmluZyh1cmkpLmNfc3RyKCkpOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC0xMzg0LDcgKzEzODQsNyBAQAogICAgICAgICB3aGlsZSAoaW5kZXggPiBsb3dlc3RCYW5kd2lkdGgpIHsKICAgICAgICAgICAgIC8vIGJlIGNvbnNlcnZhdGl2ZSAoNzAlKSB0byBhdm9pZCBvdmVyZXN0aW1hdGluZyBhbmQgaW1tZWRpYXRlbHkKICAgICAgICAgICAgIC8vIHN3aXRjaGluZyBkb3duIGFnYWluLgotICAgICAgICAgICAgc2l6ZV90IGFkanVzdGVkQmFuZHdpZHRoQnBzID0gYmFuZHdpZHRoQnBzICogNyAvIDEwOworICAgICAgICAgICAgc2l6ZV90IGFkanVzdGVkQmFuZHdpZHRoQnBzID0gYmFuZHdpZHRoQnBzICogLjdmOwogICAgICAgICAgICAgY29uc3QgQmFuZHdpZHRoSXRlbSAmaXRlbSA9IG1CYW5kd2lkdGhJdGVtc1tpbmRleF07CiAgICAgICAgICAgICBpZiAoaXRlbS5tQmFuZHdpZHRoIDw9IGFkanVzdGVkQmFuZHdpZHRoQnBzCiAgICAgICAgICAgICAgICAgICAgICYmIGlzQmFuZHdpZHRoVmFsaWQoaXRlbSkpIHsKQEAgLTE0NjYsNyArMTQ2Niw3IEBACiB9CiAKIHN0YXR1c190IExpdmVTZXNzaW9uOjpnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKSBjb25zdCB7Ci0gICAgaW50NjRfdCBtYXhEdXJhdGlvblVzID0gLTFsbDsKKyAgICBpbnQ2NF90IG1heER1cmF0aW9uVXMgPSAtMUxMOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUZldGNoZXJJbmZvcy5zaXplKCk7ICsraSkgewogICAgICAgICBpbnQ2NF90IGZldGNoZXJEdXJhdGlvblVzID0gbUZldGNoZXJJbmZvcy52YWx1ZUF0KGkpLm1EdXJhdGlvblVzOwogCkBAIC0xNTkyLDcgKzE1OTIsNyBAQAogICAgICAgICAvLyBEZWxheSBmZXRjaGVyIHJlbW92YWwgaWYgbm90IHBpY2tpbmcgdHJhY2tzLCBBTkQgb2xkIGZldGNoZXIKICAgICAgICAgLy8gaGFzIHN0cmVhbSBtYXNrIHRoYXQgb3ZlcmxhcHMgbmV3IHZhcmlhbnQuIChPa2F5IHRvIGRpc2NhcmQKICAgICAgICAgLy8gb2xkIGZldGNoZXIgbm93LCBpZiBjb21wbGV0ZWx5IG5vIG92ZXJsYXAuKQotICAgICAgICBpZiAoZGlzY2FyZEZldGNoZXIgJiYgdGltZVVzIDwgMGxsICYmICFwaWNrVHJhY2sKKyAgICAgICAgaWYgKGRpc2NhcmRGZXRjaGVyICYmIHRpbWVVcyA8IDBMTCAmJiAhcGlja1RyYWNrCiAgICAgICAgICAgICAgICAgJiYgKGZldGNoZXItPmdldFN0cmVhbVR5cGVNYXNrKCkgJiBzdHJlYW1NYXNrKSkgewogICAgICAgICAgICAgZGlzY2FyZEZldGNoZXIgPSBmYWxzZTsKICAgICAgICAgICAgIGRlbGF5UmVtb3ZhbCA9IHRydWU7CkBAIC0xNjA0LDcgKzE2MDQsNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZmxvYXQgdGhyZXNob2xkID0gMC4wZjsgLy8gZGVmYXVsdCB0byBwYXVzZSBhZnRlciBjdXJyZW50IGJsb2NrICg0N0tieXRlcykKICAgICAgICAgICAgIGJvb2wgZGlzY29ubmVjdCA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKHRpbWVVcyA+PSAwbGwpIHsKKyAgICAgICAgICAgIGlmICh0aW1lVXMgPj0gMExMKSB7CiAgICAgICAgICAgICAgICAgLy8gc2Vla2luZywgbm8gbmVlZCB0byBmaW5pc2ggZmV0Y2hpbmcKICAgICAgICAgICAgICAgICBkaXNjb25uZWN0ID0gdHJ1ZTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoZGVsYXlSZW1vdmFsKSB7CkBAIC0xNjIwLDcgKzE2MjAsNyBAQAogICAgIH0KIAogICAgIHNwPEFNZXNzYWdlPiBtc2c7Ci0gICAgaWYgKHRpbWVVcyA8IDBsbCkgeworICAgIGlmICh0aW1lVXMgPCAwTEwpIHsKICAgICAgICAgLy8gc2tpcCBvbkNoYW5nZUNvbmZpZ3VyYXRpb24yIChkZWNvZGVyIGRlc3RydWN0aW9uKSBpZiBub3Qgc2Vla2luZy4KICAgICAgICAgbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2hhbmdlQ29uZmlndXJhdGlvbjMsIHRoaXMpOwogICAgIH0gZWxzZSB7CkBAIC0xNjU0LDkgKzE2NTQsOSBAQAogICAgIGlmICghbVJlY29uZmlndXJhdGlvbkluUHJvZ3Jlc3MpIHsKICAgICAgICAgaW50MzJfdCBwaWNrVHJhY2sgPSAwOwogICAgICAgICBtc2ctPmZpbmRJbnQzMigicGlja1RyYWNrIiwgJnBpY2tUcmFjayk7Ci0gICAgICAgIGNoYW5nZUNvbmZpZ3VyYXRpb24oLTFsbCAvKiB0aW1lVXMgKi8sIC0xLCBwaWNrVHJhY2spOworICAgICAgICBjaGFuZ2VDb25maWd1cmF0aW9uKC0xTEwgLyogdGltZVVzICovLCAtMSwgcGlja1RyYWNrKTsKICAgICB9IGVsc2UgewotICAgICAgICBtc2ctPnBvc3QoMTAwMDAwMGxsKTsgLy8gcmV0cnkgaW4gMSBzZWMKKyAgICAgICAgbXNnLT5wb3N0KDEwMDAwMDBMTCk7IC8vIHJldHJ5IGluIDEgc2VjCiAgICAgfQogfQogCkBAIC0xNzg4LDcgKzE3ODgsNyBAQAogICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7CiAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInBpY2tUcmFjayIsICZwaWNrVHJhY2spKTsKIAotICAgIGlmICh0aW1lVXMgPCAwbGwpIHsKKyAgICBpZiAodGltZVVzIDwgMExMKSB7CiAgICAgICAgIGlmICghcGlja1RyYWNrKSB7CiAgICAgICAgICAgICAvLyBtU3dhcE1hc2sgY29udGFpbnMgc3RyZWFtcyB0aGF0IGFyZSBpbiBib3RoIG9sZCBhbmQgbmV3IHZhcmlhbnQsCiAgICAgICAgICAgICAvLyAoaW4gbU5ld1N0cmVhbU1hc2sgJiBtU3RyZWFtTWFzaykgYnV0IHdpdGggZGlmZmVyZW50IFVSSXMKQEAgLTIwMDUsNyArMjAwNSw3IEBACiAKICAgICAgICAgICAgIGlmICgobU5ld1N0cmVhbU1hc2sgJiBzdHJlYW0pICYmIG1TdHJlYW1zW2lkeF0ubU5ld1VyaS5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coInN3YXBwaW5nIHN0cmVhbSB0eXBlICVkICVzIHRvIGVtcHR5IHN0cmVhbSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIG1TdHJlYW1zW2lkeF0ubVVyaS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgdXJpRGVidWdTdHJpbmcobVN0cmVhbXNbaWR4XS5tVXJpKS5jX3N0cigpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1TdHJlYW1zW2lkeF0ubVVyaSA9IG1TdHJlYW1zW2lkeF0ubU5ld1VyaTsKICAgICAgICAgICAgIG1TdHJlYW1zW2lkeF0ubU5ld1VyaS5jbGVhcigpOwpAQCAtMjAzMyw3ICsyMDMzLDcgQEAKICAgICAgICAgQ0hFQ0soaWR4ID49IDApOwogICAgICAgICBpZiAobVN0cmVhbXNbaWR4XS5tTmV3VXJpLmVtcHR5KCkpIHsKICAgICAgICAgICAgIEFMT0dXKCJzd2FwcGluZyBleHRyYSBzdHJlYW0gdHlwZSAlZCAlcyB0byBlbXB0eSBzdHJlYW0iLAotICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIG1TdHJlYW1zW2lkeF0ubVVyaS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCB1cmlEZWJ1Z1N0cmluZyhtU3RyZWFtc1tpZHhdLm1VcmkpLmNfc3RyKCkpOwogICAgICAgICB9CiAgICAgICAgIG1TdHJlYW1zW2lkeF0ubVVyaSA9IG1TdHJlYW1zW2lkeF0ubU5ld1VyaTsKICAgICAgICAgbVN0cmVhbXNbaWR4XS5tTmV3VXJpLmNsZWFyKCk7CkBAIC0yMDYyLDcgKzIwNjIsNyBAQAogdm9pZCBMaXZlU2Vzc2lvbjo6c2NoZWR1bGVQb2xsQnVmZmVyaW5nKCkgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRQb2xsQnVmZmVyaW5nLCB0aGlzKTsKICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uKTsKLSAgICBtc2ctPnBvc3QoMTAwMDAwMGxsKTsKKyAgICBtc2ctPnBvc3QoMTAwMDAwMExMKTsKIH0KIAogdm9pZCBMaXZlU2Vzc2lvbjo6Y2FuY2VsUG9sbEJ1ZmZlcmluZygpIHsKQEAgLTIxMzgsNyArMjEzOCw3IEBACiAgICAgICAgICAgICBBTE9HVigic3RvcHBpbmcgbmV3VXJpID0gJXMiLCBuZXdVcmkuY19zdHIoKSk7CiAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUZldGNoZXJJbmZvcy5pbmRleE9mS2V5KG5ld1VyaSk7CiAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImRpZCBub3QgZmluZCBmZXRjaGVyIGZvciBuZXdVcmk6ICVzIiwgbmV3VXJpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIEFMT0dFKCJkaWQgbm90IGZpbmQgZmV0Y2hlciBmb3IgbmV3VXJpOiAlcyIsIHVyaURlYnVnU3RyaW5nKG5ld1VyaSkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBGZXRjaGVySW5mbyAmaW5mbyA9IG1GZXRjaGVySW5mb3MuZWRpdFZhbHVlQXQoaW5kZXgpOwpAQCAtMjIwOCwxMyArMjIwOCwxMyBAQAogICAgICAgICBpbnQ2NF90IHJlYWR5TWFya1VzID0KICAgICAgICAgICAgIChtSW5QcmVwYXJhdGlvblBoYXNlID8KICAgICAgICAgICAgICAgICBtQnVmZmVyaW5nU2V0dGluZ3MubUluaXRpYWxNYXJrTXMgOgotICAgICAgICAgICAgICAgIG1CdWZmZXJpbmdTZXR0aW5ncy5tUmVzdW1lUGxheWJhY2tNYXJrTXMpICogMTAwMGxsOworICAgICAgICAgICAgICAgIG1CdWZmZXJpbmdTZXR0aW5ncy5tUmVzdW1lUGxheWJhY2tNYXJrTXMpICogMTAwMExMOwogICAgICAgICBpZiAoYnVmZmVyZWREdXJhdGlvblVzID4gcmVhZHlNYXJrVXMKICAgICAgICAgICAgICAgICB8fCBtUGFja2V0U291cmNlc1tpXS0+aXNGaW5pc2hlZCgwKSkgewogICAgICAgICAgICAgKytyZWFkeUNvdW50OwogICAgICAgICB9CiAgICAgICAgIGlmICghbVBhY2tldFNvdXJjZXNbaV0tPmlzRmluaXNoZWQoMCkpIHsKLSAgICAgICAgICAgIGlmIChidWZmZXJlZER1cmF0aW9uVXMgPCBrVW5kZXJmbG93TWFya01zICogMTAwMGxsKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyZWREdXJhdGlvblVzIDwga1VuZGVyZmxvd01hcmtNcyAqIDEwMDBMTCkgewogICAgICAgICAgICAgICAgICsrdW5kZXJmbG93Q291bnQ7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoYnVmZmVyZWREdXJhdGlvblVzID4gbVVwU3dpdGNoTWFyaykgewpAQCAtMjMwMCw3ICsyMzAwLDcgQEAKICAgICAgICAgc3NpemVfdCBsb3dlc3RWYWxpZCA9IGdldExvd2VzdFZhbGlkQmFuZHdpZHRoSW5kZXgoKTsKICAgICAgICAgaWYgKG1DdXJCYW5kd2lkdGhJbmRleCA+IGxvd2VzdFZhbGlkKSB7CiAgICAgICAgICAgICBjYW5jZWxCYW5kd2lkdGhTd2l0Y2goKTsKLSAgICAgICAgICAgIGNoYW5nZUNvbmZpZ3VyYXRpb24oLTFsbCwgbG93ZXN0VmFsaWQpOworICAgICAgICAgICAgY2hhbmdlQ29uZmlndXJhdGlvbigtMUxMLCBsb3dlc3RWYWxpZCk7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KQEAgLTIzNzAsNyArMjM3MCw3IEBACiAgICAgICAgICAgICAvLyBpZiBub3QgeWV0IHByZXBhcmVkLCBqdXN0IHJlc3RhcnQgYWdhaW4gd2l0aCBuZXcgYncgaW5kZXguCiAgICAgICAgICAgICAvLyB0aGlzIGlzIGZhc3RlciBhbmQgcGxheWJhY2sgZXhwZXJpZW5jZSBpcyBjbGVhbmVyLgogICAgICAgICAgICAgY2hhbmdlQ29uZmlndXJhdGlvbigKLSAgICAgICAgICAgICAgICAgICAgbUluUHJlcGFyYXRpb25QaGFzZSA/IDAgOiAtMWxsLCBiYW5kd2lkdGhJbmRleCk7CisgICAgICAgICAgICAgICAgICAgIG1JblByZXBhcmF0aW9uUGhhc2UgPyAwIDogLTFMTCwgYmFuZHdpZHRoSW5kZXgpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcAppbmRleCA4YWIzM2Y3Li5jYjk3YTNjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKQEAgLTI1OCw3ICsyNTgsNyBAQAogICAgICAgbUlzRXZlbnQoZmFsc2UpLAogICAgICAgbUZpcnN0U2VxTnVtYmVyKC0xKSwKICAgICAgIG1MYXN0U2VxTnVtYmVyKC0xKSwKLSAgICAgIG1UYXJnZXREdXJhdGlvblVzKC0xbGwpLAorICAgICAgbVRhcmdldER1cmF0aW9uVXMoLTFMTCksCiAgICAgICBtRGlzY29udGludWl0eVNlcSgwKSwKICAgICAgIG1EaXNjb250aW51aXR5Q291bnQoMCksCiAgICAgICBtU2VsZWN0ZWRJbmRleCgtMSkgewpAQCAtNzA2LDYgKzcwNiwxMiBAQAogICAgICAgICArK2xpbmVObzsKICAgICB9CiAKKyAgICAvLyBwbGF5bGlzdCBoYXMgbm8gaXRlbSwgd291bGQgY2F1c2UgZXhjZXB0aW9uCisgICAgaWYgKG1JdGVtcy5zaXplKCkgPT0gMCkgeworICAgICAgICBBTE9HRSgicGxheWxpc3QgaGFzIG5vIGl0ZW0iKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKICAgICAvLyBlcnJvciBjaGVja2luZyBvZiBhbGwgZmllbGRzIHRoYXQncyByZXF1aXJlZCB0byBhcHBlYXIgb25jZQogICAgIC8vIChjdXJyZW50bHkgb25seSBjaGVja2luZyAidGFyZ2V0LWR1cmF0aW9uIiksIGFuZAogICAgIC8vIGluaXRpYWxpemF0aW9uIG9mIHBsYXlsaXN0IHByb3BlcnRpZXMgKGVnLiBtVGFyZ2V0RHVyYXRpb25VcykKQEAgLTcxNiw3ICs3MjIsNyBAQAogICAgICAgICAgICAgQUxPR0UoIk1lZGlhIHBsYXlsaXN0IG1pc3NpbmcgI0VYVC1YLVRBUkdFVERVUkFUSU9OIik7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9Ci0gICAgICAgIG1UYXJnZXREdXJhdGlvblVzID0gdGFyZ2V0RHVyYXRpb25TZWNzICogMTAwMDAwMGxsOworICAgICAgICBtVGFyZ2V0RHVyYXRpb25VcyA9IHRhcmdldER1cmF0aW9uU2VjcyAqIDEwMDAwMDBMTDsKIAogICAgICAgICBtRmlyc3RTZXFOdW1iZXIgPSAwOwogICAgICAgICBpZiAobU1ldGEgIT0gTlVMTCkgewpAQCAtMTE5OSw4ICsxMjA1LDcgQEAKICAgICAgICAgICAgIGlmICh2YWwuc2l6ZSgpIDwgMgogICAgICAgICAgICAgICAgICAgICB8fCB2YWwuY19zdHIoKVswXSAhPSAnIicKICAgICAgICAgICAgICAgICAgICAgfHwgdmFsLmNfc3RyKClbdmFsLnNpemUoKSAtIDFdICE9ICciJykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBxdW90ZWQgc3RyaW5nIGZvciBVUkksIGdvdCAnJXMnIGluc3RlYWQuIiwKLSAgICAgICAgICAgICAgICAgICAgICB2YWwuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgQUxPR0UoIkV4cGVjdGVkIHF1b3RlZCBzdHJpbmcgZm9yIFVSSS4iKTsKIAogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CkBAIC0xMzkxLDYgKzEzOTYsMTkgQEAKICAgICAgICAgY2FzZSAnUURNQyc6CiAgICAgICAgIGNhc2UgJ3VsYXcnOgogICAgICAgICBjYXNlICd2ZHZhJzoKKyAgICAgICAgY2FzZSAnYWMtNCc6CisgICAgICAgIGNhc2UgJ09wdXMnOgorICAgICAgICBjYXNlICdhM2RzJzoKKyAgICAgICAgY2FzZSAnZHRzKyc6CisgICAgICAgIGNhc2UgJ2R0cy0nOgorICAgICAgICBjYXNlICdkdHN4JzoKKyAgICAgICAgY2FzZSAnZHRzeSc6CisgICAgICAgIGNhc2UgJ2VjKzMnOgorICAgICAgICBjYXNlICdtaGExJzoKKyAgICAgICAgY2FzZSAnbWhhMic6CisgICAgICAgIGNhc2UgJ21obTEnOgorICAgICAgICBjYXNlICdtaG0yJzoKKyAgICAgICAgY2FzZSAnc2V2cyc6CiAgICAgICAgICAgICByZXR1cm4gIXN0cmNtcCgiYXVkaW8iLCB0eXBlKTsKIAogICAgICAgICBjYXNlICdhdmMxJzoKQEAgLTE0MzksNiArMTQ1NywzNSBAQAogICAgICAgICBjYXNlICd0Z2EgJzoKICAgICAgICAgY2FzZSAndGlmZic6CiAgICAgICAgIGNhc2UgJ1dSTEUnOgorICAgICAgICBjYXNlICdhM2QxJzoKKyAgICAgICAgY2FzZSAnYTNkMic6CisgICAgICAgIGNhc2UgJ2EzZDMnOgorICAgICAgICBjYXNlICdhM2Q0JzoKKyAgICAgICAgY2FzZSAnYXZjMyc6CisgICAgICAgIGNhc2UgJ2F2YzQnOgorICAgICAgICBjYXNlICdkdmExJzoKKyAgICAgICAgY2FzZSAnZHZhdic6CisgICAgICAgIGNhc2UgJ2R2aDEnOgorICAgICAgICBjYXNlICdkdmhlJzoKKyAgICAgICAgY2FzZSAnaGV2MSc6CisgICAgICAgIGNhc2UgJ2hldjInOgorICAgICAgICBjYXNlICdodmMxJzoKKyAgICAgICAgY2FzZSAnaHZjMic6CisgICAgICAgIGNhc2UgJ2h2dDEnOgorICAgICAgICBjYXNlICdsaGUxJzoKKyAgICAgICAgY2FzZSAnbGh0MSc6CisgICAgICAgIGNhc2UgJ2xodjEnOgorICAgICAgICBjYXNlICdtanBnJzoKKyAgICAgICAgY2FzZSAnbXZjMyc6CisgICAgICAgIGNhc2UgJ212YzQnOgorICAgICAgICBjYXNlICdtdmQxJzoKKyAgICAgICAgY2FzZSAnbXZkMic6CisgICAgICAgIGNhc2UgJ212ZDMnOgorICAgICAgICBjYXNlICdtdmQ0JzoKKyAgICAgICAgY2FzZSAncnY2MCc6CisgICAgICAgIGNhc2UgJ3N2YzInOgorICAgICAgICBjYXNlICd2cDA4JzoKKyAgICAgICAgY2FzZSAndnAwOSc6CiAgICAgICAgICAgICByZXR1cm4gIXN0cmNtcCgidmlkZW8iLCB0eXBlKTsKIAogICAgICAgICBkZWZhdWx0OgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAKaW5kZXggOWYzOWI1ZS4uNjM1ZWNmZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwCkBAIC0xNiw2ICsxNiw3IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiUGxheWxpc3RGZXRjaGVyIgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9taXNjLmg+CiAKQEAgLTQ5LDggKzUwLDggQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gc3RhdGljCi1jb25zdCBpbnQ2NF90IFBsYXlsaXN0RmV0Y2hlcjo6a01pbkJ1ZmZlcmVkRHVyYXRpb25VcyA9IDMwMDAwMDAwbGw7Ci1jb25zdCBpbnQ2NF90IFBsYXlsaXN0RmV0Y2hlcjo6a01heE1vbml0b3JEZWxheVVzID0gMzAwMDAwMGxsOworY29uc3QgaW50NjRfdCBQbGF5bGlzdEZldGNoZXI6OmtNaW5CdWZmZXJlZER1cmF0aW9uVXMgPSAzMDAwMDAwMExMOworY29uc3QgaW50NjRfdCBQbGF5bGlzdEZldGNoZXI6OmtNYXhNb25pdG9yRGVsYXlVcyA9IDMwMDAwMDBMTDsKIC8vIExDTSBvZiAxODggKHNpemUgb2YgYSBUUyBwYWNrZXQpICYgMWsgd29ya3Mgd2VsbAogY29uc3QgaW50MzJfdCBQbGF5bGlzdEZldGNoZXI6OmtEb3dubG9hZEJsb2NrU2l6ZSA9IDQ3ICogMTAyNDsKIApAQCAtMTUxLDI1ICsxNTIsMjYgQEAKICAgICAgIG1VUkkodXJpKSwKICAgICAgIG1GZXRjaGVySUQoaWQpLAogICAgICAgbVN0cmVhbVR5cGVNYXNrKDApLAotICAgICAgbVN0YXJ0VGltZVVzKC0xbGwpLAotICAgICAgbVNlZ21lbnRTdGFydFRpbWVVcygtMWxsKSwKLSAgICAgIG1EaXNjb250aW51aXR5U2VxKC0xbGwpLAorICAgICAgbVN0YXJ0VGltZVVzKC0xTEwpLAorICAgICAgbVNlZ21lbnRTdGFydFRpbWVVcygtMUxMKSwKKyAgICAgIG1EaXNjb250aW51aXR5U2VxKC0xTEwpLAogICAgICAgbVN0YXJ0VGltZVVzUmVsYXRpdmUoZmFsc2UpLAotICAgICAgbUxhc3RQbGF5bGlzdEZldGNoVGltZVVzKC0xbGwpLAotICAgICAgbVBsYXlsaXN0VGltZVVzKC0xbGwpLAorICAgICAgbUxhc3RQbGF5bGlzdEZldGNoVGltZVVzKC0xTEwpLAorICAgICAgbVBsYXlsaXN0VGltZVVzKC0xTEwpLAogICAgICAgbVNlcU51bWJlcigtMSksCiAgICAgICBtTnVtUmV0cmllcygwKSwKKyAgICAgIG1OdW1SZXRyaWVzRm9yTW9uaXRvclF1ZXVlKDApLAogICAgICAgbVN0YXJ0dXAodHJ1ZSksCiAgICAgICBtSURSRm91bmQoZmFsc2UpLAogICAgICAgbVNlZWtNb2RlKExpdmVTZXNzaW9uOjprU2Vla01vZGVFeGFjdFBvc2l0aW9uKSwKICAgICAgIG1UaW1lQ2hhbmdlU2lnbmFsZWQoZmFsc2UpLAotICAgICAgbU5leHRQVFNUaW1lVXMoLTFsbCksCisgICAgICBtTmV4dFBUU1RpbWVVcygtMUxMKSwKICAgICAgIG1Nb25pdG9yUXVldWVHZW5lcmF0aW9uKDApLAogICAgICAgbVN1YnRpdGxlR2VuZXJhdGlvbihzdWJ0aXRsZUdlbmVyYXRpb24pLAotICAgICAgbUxhc3REaXNjb250aW51aXR5U2VxKC0xbGwpLAorICAgICAgbUxhc3REaXNjb250aW51aXR5U2VxKC0xTEwpLAogICAgICAgbVJlZnJlc2hTdGF0ZShJTklUSUFMX01JTklNVU1fUkVMT0FEX0RFTEFZKSwKICAgICAgIG1GaXJzdFBUU1ZhbGlkKGZhbHNlKSwKLSAgICAgIG1GaXJzdFRpbWVVcygtMWxsKSwKKyAgICAgIG1GaXJzdFRpbWVVcygtMUxMKSwKICAgICAgIG1WaWRlb0J1ZmZlcihuZXcgQW5vdGhlclBhY2tldFNvdXJjZShOVUxMKSksCiAgICAgICBtU2FtcGxlQWVzS2V5SXRlbUNoYW5nZWQoZmFsc2UpLAogICAgICAgbVRocmVzaG9sZFJhdGlvKC0xLjBmKSwKQEAgLTE5OSw3ICsyMDEsNyBAQAogICAgIENIRUNLX0dFKHNlcU51bWJlciwgZmlyc3RTZXFOdW1iZXJJblBsYXlsaXN0KTsKICAgICBDSEVDS19MRShzZXFOdW1iZXIsIGxhc3RTZXFOdW1iZXJJblBsYXlsaXN0KTsKIAotICAgIGludDY0X3Qgc2VnbWVudFN0YXJ0VXMgPSAwbGw7CisgICAgaW50NjRfdCBzZWdtZW50U3RhcnRVcyA9IDBMTDsKICAgICBmb3IgKGludDMyX3QgaW5kZXggPSAwOwogICAgICAgICAgICAgaW5kZXggPCBzZXFOdW1iZXIgLSBmaXJzdFNlcU51bWJlckluUGxheWxpc3Q7ICsraW5kZXgpIHsKICAgICAgICAgc3A8QU1lc3NhZ2U+IGl0ZW1NZXRhOwpAQCAtMjM5LDEzICsyNDEsMTMgQEAKIGludDY0X3QgUGxheWxpc3RGZXRjaGVyOjpkZWxheVVzVG9SZWZyZXNoUGxheWxpc3QoKSBjb25zdCB7CiAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CiAKLSAgICBpZiAobVBsYXlsaXN0ID09IE5VTEwgfHwgbUxhc3RQbGF5bGlzdEZldGNoVGltZVVzIDwgMGxsKSB7CisgICAgaWYgKG1QbGF5bGlzdCA9PSBOVUxMIHx8IG1MYXN0UGxheWxpc3RGZXRjaFRpbWVVcyA8IDBMTCkgewogICAgICAgICBDSEVDS19FUSgoaW50KW1SZWZyZXNoU3RhdGUsIChpbnQpSU5JVElBTF9NSU5JTVVNX1JFTE9BRF9ERUxBWSk7Ci0gICAgICAgIHJldHVybiAwbGw7CisgICAgICAgIHJldHVybiAwTEw7CiAgICAgfQogCiAgICAgaWYgKG1QbGF5bGlzdC0+aXNDb21wbGV0ZSgpKSB7Ci0gICAgICAgIHJldHVybiAofjBsbHUgPj4gMSk7CisgICAgICAgIHJldHVybiAofjBMTFUgPj4gMSk7CiAgICAgfQogCiAgICAgaW50NjRfdCB0YXJnZXREdXJhdGlvblVzID0gbVBsYXlsaXN0LT5nZXRUYXJnZXREdXJhdGlvbigpOwpAQCAtMjY3LDcgKzI2OSw3IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIEZJUlNUX1VOQ0hBTkdFRF9SRUxPQURfQVRURU1QVDoKQEAgLTI5NCw3ICsyOTYsNyBAQAogICAgIH0KIAogICAgIGludDY0X3QgZGVsYXlVcyA9IG1MYXN0UGxheWxpc3RGZXRjaFRpbWVVcyArIG1pblBsYXlsaXN0QWdlVXMgLSBub3dVczsKLSAgICByZXR1cm4gZGVsYXlVcyA+IDBsbCA/IGRlbGF5VXMgOiAwbGw7CisgICAgcmV0dXJuIGRlbGF5VXMgPiAwTEwgPyBkZWxheVVzIDogMExMOwogfQogCiBzdGF0dXNfdCBQbGF5bGlzdEZldGNoZXI6OmRlY3J5cHRCdWZmZXIoCkBAIC0zNjQsMTAgKzM2NiwxMCBAQAogICAgICAgICBpZiAoZXJyID09IEVSUk9SX05PVF9DT05ORUNURUQpIHsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9OT1RfQ09OTkVDVEVEOwogICAgICAgICB9IGVsc2UgaWYgKGVyciA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZmV0Y2ggY2lwaGVyIGtleSBmcm9tICclcycuIiwga2V5VVJJLmNfc3RyKCkpOworICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBmZXRjaCBjaXBoZXIga2V5IGZyb20gJyVzJy4iLCB1cmlEZWJ1Z1N0cmluZyhrZXlVUkkpLmNfc3RyKCkpOwogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICB9IGVsc2UgaWYgKGtleS0+c2l6ZSgpICE9IDE2KSB7Ci0gICAgICAgICAgICBBTE9HRSgia2V5IGZpbGUgJyVzJyB3YXNuJ3QgMTYgYnl0ZXMgaW4gc2l6ZS4iLCBrZXlVUkkuY19zdHIoKSk7CisgICAgICAgICAgICBBTE9HRSgia2V5IGZpbGUgJyVzJyB3YXNuJ3QgMTYgYnl0ZXMgaW4gc2l6ZS4iLCB1cmlEZWJ1Z1N0cmluZyhrZXlVUkkpLmNfc3RyKCkpOwogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogCkBAIC04NDgsNyArODUwLDE3IEBACiAgICAgLy8gaW4gdGhlIG1pZGRsZSBvZiBhbiB1bmZpbmlzaGVkIGRvd25sb2FkLCBkZWxheQogICAgIC8vIHBsYXlsaXN0IHJlZnJlc2ggYXMgaXQnbGwgY2hhbmdlIHNlcSBudW1iZXJzCiAgICAgaWYgKCFtRG93bmxvYWRTdGF0ZS0+aGFzU2F2ZWRTdGF0ZSgpKSB7Ci0gICAgICAgIHJlZnJlc2hQbGF5bGlzdCgpOworICAgICAgICBzdGF0dXNfdCBlcnIgPSByZWZyZXNoUGxheWxpc3QoKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgaWYgKG1OdW1SZXRyaWVzRm9yTW9uaXRvclF1ZXVlIDwga01heE51bVJldHJpZXMpIHsKKyAgICAgICAgICAgICAgICArK21OdW1SZXRyaWVzRm9yTW9uaXRvclF1ZXVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBub3RpZnlFcnJvcihlcnIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU51bVJldHJpZXNGb3JNb25pdG9yUXVldWUgPSAwOworICAgICAgICB9CiAgICAgfQogCiAgICAgaW50NjRfdCB0YXJnZXREdXJhdGlvblVzID0ga01pbkJ1ZmZlcmVkRHVyYXRpb25VczsKQEAgLTg1Niw3ICs4NjgsNyBAQAogICAgICAgICB0YXJnZXREdXJhdGlvblVzID0gbVBsYXlsaXN0LT5nZXRUYXJnZXREdXJhdGlvbigpOwogICAgIH0KIAotICAgIGludDY0X3QgYnVmZmVyZWREdXJhdGlvblVzID0gMGxsOworICAgIGludDY0X3QgYnVmZmVyZWREdXJhdGlvblVzID0gMExMOwogICAgIHN0YXR1c190IGZpbmFsUmVzdWx0ID0gT0s7CiAgICAgaWYgKG1TdHJlYW1UeXBlTWFzayA9PSBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9TVUJUSVRMRVMpIHsKICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gcGFja2V0U291cmNlID0KQEAgLTg2OSw3ICs4ODEsNyBAQAogICAgICAgICAvLyBlbnF1ZXVlZCB0byBwcmV2ZW50IHVzIGZyb20gd2FpdGluZyBvbiBhIG5vbi1leGlzdGVudCBzdHJlYW07CiAgICAgICAgIC8vIHdoZW4gd2UgY2Fubm90IG1ha2Ugb3V0IGZyb20gdGhlIG1hbmlmZXN0IHdoYXQgc3RyZWFtcyBhcmUgaW5jbHVkZWQgaW4KICAgICAgICAgLy8gYSBwbGF5bGlzdCB3ZSBtaWdodCBhc3N1bWUgZXh0cmEgc3RyZWFtcy4KLSAgICAgICAgYnVmZmVyZWREdXJhdGlvblVzID0gLTFsbDsKKyAgICAgICAgYnVmZmVyZWREdXJhdGlvblVzID0gLTFMTDsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGFja2V0U291cmNlcy5zaXplKCk7ICsraSkgewogICAgICAgICAgICAgaWYgKChtU3RyZWFtVHlwZU1hc2sgJiBtUGFja2V0U291cmNlcy5rZXlBdChpKSkgPT0gMAogICAgICAgICAgICAgICAgICAgICB8fCBtUGFja2V0U291cmNlc1tpXS0+Z2V0TGF0ZXN0RW5xdWV1ZWRNZXRhKCkgPT0gTlVMTCkgewpAQCAtODgxLDEzICs4OTMsMTMgQEAKIAogICAgICAgICAgICAgRlNMT0dWKG1QYWNrZXRTb3VyY2VzLmtleUF0KGkpLCAiYnVmZmVyZWQgJWxsZCIsIChsb25nIGxvbmcpYnVmZmVyZWRTdHJlYW1EdXJhdGlvblVzKTsKIAotICAgICAgICAgICAgaWYgKGJ1ZmZlcmVkRHVyYXRpb25VcyA9PSAtMWxsCisgICAgICAgICAgICBpZiAoYnVmZmVyZWREdXJhdGlvblVzID09IC0xTEwKICAgICAgICAgICAgICAgICAgfHwgYnVmZmVyZWRTdHJlYW1EdXJhdGlvblVzIDwgYnVmZmVyZWREdXJhdGlvblVzKSB7CiAgICAgICAgICAgICAgICAgYnVmZmVyZWREdXJhdGlvblVzID0gYnVmZmVyZWRTdHJlYW1EdXJhdGlvblVzOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlmIChidWZmZXJlZER1cmF0aW9uVXMgPT0gLTFsbCkgewotICAgICAgICAgICAgYnVmZmVyZWREdXJhdGlvblVzID0gMGxsOworICAgICAgICBpZiAoYnVmZmVyZWREdXJhdGlvblVzID09IC0xTEwpIHsKKyAgICAgICAgICAgIGJ1ZmZlcmVkRHVyYXRpb25VcyA9IDBMTDsKICAgICAgICAgfQogICAgIH0KIApAQCAtOTAwLDEyICs5MTIsMTIgQEAKICAgICAgICAgLy8gb25Eb3dubG9hZE5leHQoKTsKICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdERvd25sb2FkTmV4dCwgdGhpcyk7CiAgICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtTW9uaXRvclF1ZXVlR2VuZXJhdGlvbik7Ci0gICAgICAgIG1zZy0+cG9zdCgxMDAwbCk7CisgICAgICAgIG1zZy0+cG9zdCgxMDAwTCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gV2UnZCBsaWtlIHRvIG1haW50YWluIGJ1ZmZlcmluZyBhYm92ZSBkdXJhdGlvblRvQnVmZmVyVXMsIHNvIHRyeQogICAgICAgICAvLyBhZ2FpbiB3aGVuIGJ1ZmZlciBqdXN0IGFib3V0IHRvIGdvIGJlbG93IGR1cmF0aW9uVG9CdWZmZXJVcwogICAgICAgICAvLyAob3IgYWZ0ZXIgdGFyZ2V0RHVyYXRpb25VcyAvIDIsIHdoaWNoZXZlciBpcyBzbWFsbGVyKS4KLSAgICAgICAgaW50NjRfdCBkZWxheVVzID0gYnVmZmVyZWREdXJhdGlvblVzIC0ga01pbkJ1ZmZlcmVkRHVyYXRpb25VcyArIDEwMDAwMDBsbDsKKyAgICAgICAgaW50NjRfdCBkZWxheVVzID0gYnVmZmVyZWREdXJhdGlvblVzIC0ga01pbkJ1ZmZlcmVkRHVyYXRpb25VcyArIDEwMDAwMDBMTDsKICAgICAgICAgaWYgKGRlbGF5VXMgPiB0YXJnZXREdXJhdGlvblVzIC8gMikgewogICAgICAgICAgICAgZGVsYXlVcyA9IHRhcmdldER1cmF0aW9uVXMgLyAyOwogICAgICAgICB9CkBAIC0xMDcyLDEwICsxMDg0LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBtU2VnbWVudEZpcnN0UFRTID0gLTFsbDsKKyAgICBtU2VnbWVudEZpcnN0UFRTID0gLTFMTDsKIAogICAgIGlmIChtUGxheWxpc3QgIT0gTlVMTCAmJiBtU2VxTnVtYmVyIDwgMCkgewotICAgICAgICBDSEVDS19HRShtU3RhcnRUaW1lVXMsIDBsbCk7CisgICAgICAgIENIRUNLX0dFKG1TdGFydFRpbWVVcywgMExMKTsKIAogICAgICAgICBpZiAobVNlZ21lbnRTdGFydFRpbWVVcyA8IDApIHsKICAgICAgICAgICAgIGlmICghbVBsYXlsaXN0LT5pc0NvbXBsZXRlKCkgJiYgIW1QbGF5bGlzdC0+aXNFdmVudCgpKSB7CkBAIC0xMzY1LDcgKzEzNzcsNyBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChieXRlc1JlYWQgPCAwKSB7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBieXRlc1JlYWQ7Ci0gICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGZldGNoIC50cyBzZWdtZW50IGF0IHVybCAnJXMnIiwgdXJpLmNfc3RyKCkpOworICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBmZXRjaCAudHMgc2VnbWVudCBhdCB1cmwgJyVzJyIsIHVyaURlYnVnU3RyaW5nKHVyaSkuY19zdHIoKSk7CiAgICAgICAgICAgICBub3RpZnlFcnJvcihlcnIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC0xMzc4LDcgKzEzOTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgJiAoTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfQVVESU8KICAgICAgICAgICAgICAgICAgICAgICAgIHwgTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfVklERU8pKSkgewogICAgICAgICAgICAgbVNlc3Npb24tPmFkZEJhbmR3aWR0aE1lYXN1cmVtZW50KGJ5dGVzUmVhZCwgZGVsYXlVcyk7Ci0gICAgICAgICAgICBpZiAoZGVsYXlVcyA+IDIwMDAwMDBsbCkgeworICAgICAgICAgICAgaWYgKGRlbGF5VXMgPiAyMDAwMDAwTEwpIHsKICAgICAgICAgICAgICAgICBGTE9HVigiYnl0ZXNSZWFkICV6ZCB0b29rICUuMmYgc2Vjb25kcyAtIGFibm9ybWFsIGJhbmR3aWR0aCBkaXAiLAogICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNSZWFkLCAoZG91YmxlKWRlbGF5VXMgLyAxLjBlNik7CiAgICAgICAgICAgICB9CkBAIC0xNTUyLDcgKzE1NjQsNyBAQAogICAgICAgICAvLyBpZiB0aGUgcHJldmlvdXMgZmV0Y2hlciBwYXVzZWQgaW4gdGhlIG1pZGRsZSBvZiBhIHNlZ21lbnQsIHdlCiAgICAgICAgIC8vIHdhbnQgdG8gc3RhcnQgYXQgYSBzZWdtZW50IHRoYXQgb3ZlcmxhcHMgdGhlIGxhc3Qgc2FtcGxlCiAgICAgICAgIG1pbkRpZmZVcyA9IC1tUGxheWxpc3QtPmdldFRhcmdldER1cmF0aW9uKCk7Ci0gICAgICAgIG1heERpZmZVcyA9IDBsbDsKKyAgICAgICAgbWF4RGlmZlVzID0gMExMOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIGlmIHRoZSBwcmV2aW91cyBmZXRjaGVyIHBhdXNlZCBhdCB0aGUgZW5kIG9mIGEgc2VnbWVudCwgaWRlYWxseQogICAgICAgICAvLyB3ZSB3YW50IHRvIHN0YXJ0IGF0IHRoZSBzZWdtZW50IHRoYXQncyByb3VnaGx5IGFsaWduZWQgd2l0aCBpdHMKQEAgLTE3MDMsNyArMTcxNSw3IEBACiAgICAgICAgIG1UU1BhcnNlciA9IG5ldyBBVFNQYXJzZXIoQVRTUGFyc2VyOjpUU19USU1FU1RBTVBTX0FSRV9BQlNPTFVURSk7CiAgICAgfQogCi0gICAgaWYgKG1OZXh0UFRTVGltZVVzID49IDBsbCkgeworICAgIGlmIChtTmV4dFBUU1RpbWVVcyA+PSAwTEwpIHsKICAgICAgICAgc3A8QU1lc3NhZ2U+IGV4dHJhID0gbmV3IEFNZXNzYWdlOwogICAgICAgICAvLyBTaW5jZSB3ZSBhcmUgdXNpbmcgYWJzb2x1dGUgdGltZXN0YW1wcywgc2lnbmFsIGFuIG9mZnNldCBvZiAwIHRvIHByZXZlbnQKICAgICAgICAgLy8gQVRTUGFyc2VyIGZyb20gc2tld2luZyB0aGUgdGltZXN0YW1wcyBvZiBhY2Nlc3MgdW5pdHMuCkBAIC0xNzE4LDcgKzE3MzAsNyBAQAogICAgICAgICBtVFNQYXJzZXItPnNpZ25hbERpc2NvbnRpbnVpdHkoCiAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX1RJTUUsIGV4dHJhKTsKIAotICAgICAgICBtTmV4dFBUU1RpbWVVcyA9IC0xbGw7CisgICAgICAgIG1OZXh0UFRTVGltZVVzID0gLTFMTDsKICAgICB9CiAKICAgICBpZiAobVNhbXBsZUFlc0tleUl0ZW1DaGFuZ2VkKSB7CkBAIC0xNzM5LDcgKzE3NTEsNyBAQAogICAgIC8vIHNldFJhbmdlIHRvIGluZGljYXRlIGNvbnN1bWVkIGJ5dGVzLgogICAgIGJ1ZmZlci0+c2V0UmFuZ2UoYnVmZmVyLT5vZmZzZXQoKSArIG9mZnNldCwgYnVmZmVyLT5zaXplKCkgLSBvZmZzZXQpOwogCi0gICAgaWYgKG1TZWdtZW50Rmlyc3RQVFMgPCAwbGwpIHsKKyAgICBpZiAobVNlZ21lbnRGaXJzdFBUUyA8IDBMTCkgewogICAgICAgICAvLyBnZXQgdGhlIHNtYWxsZXN0IGZpcnN0IFBUUyBmcm9tIGFsbCBzdHJlYW1zIHByZXNlbnQgaW4gdGhpcyBwYXJzZXIKICAgICAgICAgZm9yIChzaXplX3QgaSA9IG1QYWNrZXRTb3VyY2VzLnNpemUoKTsgaSA+IDA7KSB7CiAgICAgICAgICAgICBpLS07CkBAIC0xNzYzLDEyICsxNzc1LDEyIEBACiAgICAgICAgICAgICBpZiAobWV0YSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7CiAgICAgICAgICAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG1TZWdtZW50Rmlyc3RQVFMgPCAwbGwgfHwgdGltZVVzIDwgbVNlZ21lbnRGaXJzdFBUUykgeworICAgICAgICAgICAgICAgIGlmIChtU2VnbWVudEZpcnN0UFRTIDwgMExMIHx8IHRpbWVVcyA8IG1TZWdtZW50Rmlyc3RQVFMpIHsKICAgICAgICAgICAgICAgICAgICAgbVNlZ21lbnRGaXJzdFBUUyA9IHRpbWVVczsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1TZWdtZW50Rmlyc3RQVFMgPCAwbGwpIHsKKyAgICAgICAgaWYgKG1TZWdtZW50Rmlyc3RQVFMgPCAwTEwpIHsKICAgICAgICAgICAgIC8vIGRpZG4ndCBmaW5kIGFueSBUUyBwYWNrZXQsIGNhbiByZXR1cm4gZWFybHkKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQpAQCAtMTk4Nyw4ICsxOTk5LDggQEAKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAotICAgIGlmIChtTmV4dFBUU1RpbWVVcyA+PSAwbGwpIHsKLSAgICAgICAgbU5leHRQVFNUaW1lVXMgPSAtMWxsOworICAgIGlmIChtTmV4dFBUU1RpbWVVcyA+PSAwTEwpIHsKKyAgICAgICAgbU5leHRQVFNUaW1lVXMgPSAtMUxMOwogICAgIH0KIAogICAgIC8vIFRoaXMgYmV0dGVyIGJlIGFuIElTTyAxMzgxOC03IChBQUMpIG9yIElTTyAxMzgxOC0xIChNUEVHKSBhdWRpbwpAQCAtMjA4NywxNyArMjA5OSwxNyBAQAogICAgICAgICBwYWNrZXRTb3VyY2UtPnNldEZvcm1hdChtZXRhKTsKICAgICB9CiAKLSAgICBpbnQ2NF90IG51bVNhbXBsZXMgPSAwbGw7CisgICAgaW50NjRfdCBudW1TYW1wbGVzID0gMExMOwogICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKICAgICBDSEVDSyhwYWNrZXRTb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKSk7CiAKLSAgICBpbnQ2NF90IHRpbWVVcyA9IChQVFMgKiAxMDBsbCkgLyA5bGw7CisgICAgaW50NjRfdCB0aW1lVXMgPSAoUFRTICogMTAwTEwpIC8gOUxMOwogICAgIGlmIChtU3RhcnR1cCAmJiAhbUZpcnN0UFRTVmFsaWQpIHsKICAgICAgICAgbUZpcnN0UFRTVmFsaWQgPSB0cnVlOwogICAgICAgICBtRmlyc3RUaW1lVXMgPSB0aW1lVXM7CiAgICAgfQogCi0gICAgaWYgKG1TZWdtZW50Rmlyc3RQVFMgPCAwbGwpIHsKKyAgICBpZiAobVNlZ21lbnRGaXJzdFBUUyA8IDBMTCkgewogICAgICAgICBtU2VnbWVudEZpcnN0UFRTID0gdGltZVVzOwogICAgICAgICBpZiAoIW1TdGFydFRpbWVVc1JlbGF0aXZlKSB7CiAgICAgICAgICAgICAvLyBEdXBsaWNhdGVkIGxvZ2ljIGZyb20gaG93IHdlIGhhbmRsZSAudHMgcGxheWxpc3RzLgpAQCAtMjEyNCw3ICsyMTM2LDEwIEBACiAgICAgc2l6ZV90IG9mZnNldCA9IDA7CiAgICAgd2hpbGUgKG9mZnNldCA8IGJ1ZmZlci0+c2l6ZSgpKSB7CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmFkdHNIZWFkZXIgPSBidWZmZXItPmRhdGEoKSArIG9mZnNldDsKLSAgICAgICAgQ0hFQ0tfTFQob2Zmc2V0ICsgNSwgYnVmZmVyLT5zaXplKCkpOworICAgICAgICBpZiAoYnVmZmVyLT5zaXplKCkgPD0gb2Zmc2V0KzUpIHsKKyAgICAgICAgICAgIEFMT0dWKCJidWZmZXIgZG9lcyBub3QgY29udGFpbiBhIGNvbXBsZXRlIGhlYWRlciIpOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQogICAgICAgICAvLyBub24tY29uc3QgcG9pbnRlciBmb3IgZGVjcnlwdGlvbiBpZiBuZWVkZWQKICAgICAgICAgdWludDhfdCAqYWR0c0ZyYW1lID0gYnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQ7CiAKQEAgLTIxNDcsNyArMjE2Miw3IEBACiAKICAgICAgICAgQ0hFQ0tfTEUob2Zmc2V0ICsgYWFjX2ZyYW1lX2xlbmd0aCwgYnVmZmVyLT5zaXplKCkpOwogCi0gICAgICAgIGludDY0X3QgdW5pdFRpbWVVcyA9IHRpbWVVcyArIG51bVNhbXBsZXMgKiAxMDAwMDAwbGwgLyBzYW1wbGVSYXRlOworICAgICAgICBpbnQ2NF90IHVuaXRUaW1lVXMgPSB0aW1lVXMgKyBudW1TYW1wbGVzICogMTAwMDAwMExMIC8gc2FtcGxlUmF0ZTsKICAgICAgICAgb2Zmc2V0ICs9IGFhY19mcmFtZV9sZW5ndGg7CiAKICAgICAgICAgLy8gRWFjaCBBQUMgZnJhbWUgZW5jb2RlcyAxMDI0IHNhbXBsZXMuCkBAIC0yMjA4LDcgKzIyMjMsNyBAQAogfQogCiB2b2lkIFBsYXlsaXN0RmV0Y2hlcjo6dXBkYXRlRHVyYXRpb24oKSB7Ci0gICAgaW50NjRfdCBkdXJhdGlvblVzID0gMGxsOworICAgIGludDY0X3QgZHVyYXRpb25VcyA9IDBMTDsKICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgbVBsYXlsaXN0LT5zaXplKCk7ICsraW5kZXgpIHsKICAgICAgICAgc3A8QU1lc3NhZ2U+IGl0ZW1NZXRhOwogICAgICAgICBDSEVDSyhtUGxheWxpc3QtPml0ZW1BdCgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmgKaW5kZXggZDdkYjU0YS4uNWQzZjljMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmgKQEAgLTE0NSw2ICsxNDUsNyBAQAogICAgIHNwPE0zVVBhcnNlcj4gbVBsYXlsaXN0OwogICAgIGludDMyX3QgbVNlcU51bWJlcjsKICAgICBpbnQzMl90IG1OdW1SZXRyaWVzOworICAgIGludDMyX3QgbU51bVJldHJpZXNGb3JNb25pdG9yUXVldWU7CiAgICAgYm9vbCBtU3RhcnR1cDsKICAgICBib29sIG1JRFJGb3VuZDsKICAgICBpbnQzMl90IG1TZWVrTW9kZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAKaW5kZXggMzdmOWQ1MC4uNzE1MWQwNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAKQEAgLTMsNiArMywxMCBAQAogCiAgICAgc3JjczogWyJJRDMuY3BwIl0sCiAKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIF0sCisKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVdhbGwiLApAQCAtMTIsOSArMTYsNiBAQAogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKIH0KIApAQCAtNDMsOSArNDQsNiBAQAogCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKIAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcAppbmRleCBhMGE2MmY0Li43OTJhNjhhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvSUQzLmNwcApAQCAtMjEsNiArMjEsOCBAQAogI2luY2x1ZGUgIi4uL2luY2x1ZGUvSUQzLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CkBAIC00MSw3ICs0Myw3IEBACiAgICAgfQogCiAgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICAgICAgb2ZmNjRfdCBhdmFpbGFibGUgPSAob2Zmc2V0ID49IChvZmY2NF90KW1TaXplKSA/IDBsbCA6IG1TaXplIC0gb2Zmc2V0OworICAgICAgICBvZmY2NF90IGF2YWlsYWJsZSA9IChvZmZzZXQgPj0gKG9mZjY0X3QpbVNpemUpID8gMExMIDogbVNpemUgLSBvZmZzZXQ7CiAKICAgICAgICAgc2l6ZV90IGNvcHkgPSAoYXZhaWxhYmxlID4gKG9mZjY0X3Qpc2l6ZSkgPyBzaXplIDogYXZhaWxhYmxlOwogICAgICAgICBtZW1jcHkoZGF0YSwgbURhdGEgKyBvZmZzZXQsIGNvcHkpOwpAQCAtNTYsNiArNTgsNTUgQEAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZW1vcnlTb3VyY2UpOwogfTsKIAorY2xhc3MgRGF0YVNvdXJjZVVud3JhcHBlciA6IHB1YmxpYyBEYXRhU291cmNlQmFzZSB7CisKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBEYXRhU291cmNlVW53cmFwcGVyKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZWhlbHBlcikgeworICAgICAgICBtU291cmNlID0gc291cmNlaGVscGVyOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0IHsgcmV0dXJuIE9LOyB9CisKKyAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCwgb3IgLTEgb24gZmFpbHVyZS4gSXQncyBub3QgYW4gZXJyb3IgaWYKKyAgICAvLyB0aGlzIHJldHVybnMgemVybzsgaXQganVzdCBtZWFucyB0aGUgZ2l2ZW4gb2Zmc2V0IGlzIGVxdWFsIHRvLCBvcgorICAgIC8vIGJleW9uZCwgdGhlIGVuZCBvZiB0aGUgc291cmNlLgorICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgICAgIHJldHVybiBtU291cmNlLT5yZWFkQXQob2Zmc2V0LCBkYXRhLCBzaXplKTsKKyAgICB9CisKKyAgICAvLyBNYXkgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVELgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKSB7CisgICAgICAgIHJldHVybiBtU291cmNlLT5nZXRTaXplKHNpemUpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBnZXRVcmkoY2hhciAqIC8qdXJpU3RyaW5nKi8sIHNpemVfdCAvKmJ1ZmZlclNpemUqLykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGNsb3NlKCkge307Citwcml2YXRlOgorICAgIERhdGFTb3VyY2VIZWxwZXIgKm1Tb3VyY2U7Cit9OworCisKK0lEMzo6SUQzKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZWhlbHBlciwgYm9vbCBpZ25vcmVWMSwgb2ZmNjRfdCBvZmZzZXQpCisgICAgOiBtSXNWYWxpZChmYWxzZSksCisgICAgICBtRGF0YShOVUxMKSwKKyAgICAgIG1TaXplKDApLAorICAgICAgbUZpcnN0RnJhbWVPZmZzZXQoMCksCisgICAgICBtVmVyc2lvbihJRDNfVU5LTk9XTiksCisgICAgICBtUmF3U2l6ZSgwKSB7CisgICAgRGF0YVNvdXJjZVVud3JhcHBlciBzb3VyY2Uoc291cmNlaGVscGVyKTsKKyAgICBtSXNWYWxpZCA9IHBhcnNlVjIoJnNvdXJjZSwgb2Zmc2V0KTsKKworICAgIGlmICghbUlzVmFsaWQgJiYgIWlnbm9yZVYxKSB7CisgICAgICAgIG1Jc1ZhbGlkID0gcGFyc2VWMSgmc291cmNlKTsKKyAgICB9Cit9CisKIElEMzo6SUQzKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGJvb2wgaWdub3JlVjEsIG9mZjY0X3Qgb2Zmc2V0KQogICAgIDogbUlzVmFsaWQoZmFsc2UpLAogICAgICAgbURhdGEoTlVMTCksCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmgKaW5kZXggYTkyNDE5Ny4uOGIyMDE4NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaApAQCAtNTEsMTIgKzUxLDYgQEAKIAogICAgIHZpcnR1YWwgdm9pZCBzZXRCYW5kd2lkdGhIaXN0b3J5U2l6ZShzaXplX3QgbnVtSGlzdG9yeUl0ZW1zKTsKIAotICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQgc29ja2ZkLCB1aWRfdCB1aWQsIHVpbnQzMl90IGtUYWcpOwotICAgIHN0YXRpYyB2b2lkIFVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQpOwotCi0gICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQgc29ja2ZkLCB1aWRfdCB1aWQpOwotICAgIHN0YXRpYyB2b2lkIFVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQgc29ja2ZkKTsKLQogICAgIHZpcnR1YWwgU3RyaW5nOCB0b1N0cmluZygpIHsKICAgICAgICAgcmV0dXJuIG1OYW1lOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSUQzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0lEMy5oCmluZGV4IDdjMjM5MWUuLjVlNDMzZWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSUQzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JRDMuaApAQCAtMjQsNiArMjQsNyBAQAogCiBjbGFzcyBEYXRhU291cmNlQmFzZTsKIGNsYXNzIFN0cmluZzg7CitjbGFzcyBEYXRhU291cmNlSGVscGVyOwogCiBzdHJ1Y3QgSUQzIHsKICAgICBlbnVtIFZlcnNpb24gewpAQCAtMzUsNiArMzYsNyBAQAogICAgICAgICBJRDNfVjJfNCwKICAgICB9OwogCisgICAgZXhwbGljaXQgSUQzKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgYm9vbCBpZ25vcmVWMSA9IGZhbHNlLCBvZmY2NF90IG9mZnNldCA9IDApOwogICAgIGV4cGxpY2l0IElEMyhEYXRhU291cmNlQmFzZSAqc291cmNlLCBib29sIGlnbm9yZVYxID0gZmFsc2UsIG9mZjY0X3Qgb2Zmc2V0ID0gMCk7CiAgICAgSUQzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplLCBib29sIGlnbm9yZVYxID0gZmFsc2UpOwogICAgIH5JRDMoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oCmluZGV4IGY0MzlhMWMuLjU5NmVmYjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaApAQCAtMzcsNiArMzcsOCBAQAogCiAgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwogCisgICAgdmlydHVhbCB2b2lkIGNsb3NlKCk7CisKICAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOwpAQCAtNTEsNiArNTMsOCBAQAogICAgICAgICByZXR1cm4gbU5hbWU7CiAgICAgfQogCisgICAgc3RhdHVzX3QgZ2V0QXZhaWxhYmxlU2l6ZShvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCAqc2l6ZSk7CisKICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKICAgICBzaXplX3QgY2FjaGVkU2l6ZSgpOwpAQCAtMTM1LDcgKzEzOSw3IEBACiAgICAgc3NpemVfdCByZWFkSW50ZXJuYWwob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKICAgICBzdGF0dXNfdCBzZWVrSW50ZXJuYWxfbChvZmY2NF90IG9mZnNldCk7CiAKLSAgICBzaXplX3QgYXBwcm94RGF0YVJlbWFpbmluZ19sKHN0YXR1c190ICpmaW5hbFN0YXR1cykgY29uc3Q7CisgICAgc2l6ZV90IGFwcHJveERhdGFSZW1haW5pbmdfbChvZmY2NF90IG9mZnNldCwgc3RhdHVzX3QgKmZpbmFsU3RhdHVzKSBjb25zdDsKIAogICAgIHZvaWQgcmVzdGFydFByZWZldGNoZXJJZk5lY2Vzc2FyeV9sKAogICAgICAgICAgICAgYm9vbCBpZ25vcmVMb3dXYXRlclRocmVzaG9sZCA9IGZhbHNlLCBib29sIGZvcmNlID0gZmFsc2UpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9Tb2Z0d2FyZVJlbmRlcmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaAppbmRleCBjMjg2NTE2Li42NGRjYTRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaApAQCAtNTEsNyArNTEsNyBAQAogICAgIENvbG9yQ29udmVydGVyICptQ29udmVydGVyOwogICAgIFlVVk1vZGUgbVlVVk1vZGU7CiAgICAgc3A8QU5hdGl2ZVdpbmRvdz4gbU5hdGl2ZVdpbmRvdzsKLSAgICBpbnQzMl90IG1XaWR0aCwgbUhlaWdodDsKKyAgICBpbnQzMl90IG1XaWR0aCwgbUhlaWdodCwgbVN0cmlkZTsKICAgICBpbnQzMl90IG1Dcm9wTGVmdCwgbUNyb3BUb3AsIG1Dcm9wUmlnaHQsIG1Dcm9wQm90dG9tOwogICAgIGludDMyX3QgbUNyb3BXaWR0aCwgbUNyb3BIZWlnaHQ7CiAgICAgaW50MzJfdCBtUm90YXRpb25EZWdyZWVzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaAppbmRleCBmNzhlMTI1Li5jNTA2NzdhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaApAQCAtMjYsNyArMjYsNiBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBEYXRhU291cmNlOwotY2xhc3MgTWVkaWFFeHRyYWN0b3I7CiBzdHJ1Y3QgSW1hZ2VEZWNvZGVyOwogc3RydWN0IEZyYW1lUmVjdDsKIApAQCAtNjYsNiArNjUsNyBAQAogICAgIHNwPEltYWdlRGVjb2Rlcj4gbUltYWdlRGVjb2RlcjsKICAgICBpbnQgbUxhc3RJbWFnZUluZGV4OwogICAgIHZvaWQgcGFyc2VNZXRhRGF0YSgpOworICAgIHZvaWQgcGFyc2VDb2xvckFzcGVjdHMoY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKTsKICAgICAvLyBEZWxldGUgYWxidW0gYXJ0IGFuZCBjbGVhciBtZXRhZGF0YS4KICAgICB2b2lkIGNsZWFyTWV0YWRhdGEoKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKaW5kZXggOTdkMTVhNy4uNzg0ZmQzNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCkBAIC0yMiw3ICsyMiw3IEBACiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvTWV0YWRhdGFCdWZmZXJUeXBlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0luZm8uaD4KICNpbmNsdWRlIDxtZWRpYS9JT01YLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NvZGVjQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZyYW1lUmVuZGVyVHJhY2tlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgpAQCAtMTM3LDYgKzEzNyw3IEBACiAgICAgICAgIGtXaGF0T01YRGllZCAgICAgICAgICAgICAgICAgPSAnT01YZCcsCiAgICAgICAgIGtXaGF0UmVsZWFzZUNvZGVjSW5zdGFuY2UgICAgPSAncmVsQycsCiAgICAgICAgIGtXaGF0Rm9yY2VTdGF0ZVRyYW5zaXRpb24gICAgPSAnZnN0dCcsCisgICAgICAgIGtXaGF0Q2hlY2tJZlN0dWNrICAgICAgICAgICAgPSAnQ3N0aycsCiAgICAgfTsKIAogICAgIGVudW0gewpAQCAtMjM2LDYgKzIzNyw4IEBACiAgICAgYW5kcm9pZF9uYXRpdmVfcmVjdF90IG1MYXN0TmF0aXZlV2luZG93Q3JvcDsKICAgICBpbnQzMl90IG1MYXN0TmF0aXZlV2luZG93RGF0YVNwYWNlOwogICAgIEhEUlN0YXRpY0luZm8gbUxhc3RIRFJTdGF0aWNJbmZvOworICAgIHNwPEFCdWZmZXI+IG1IZHIxMFBsdXNTY3JhdGNoQnVmZmVyOworICAgIHNwPEFCdWZmZXI+IG1MYXN0SGRyMTBQbHVzQnVmZmVyOwogICAgIHNwPEFNZXNzYWdlPiBtQ29uZmlnRm9ybWF0OwogICAgIHNwPEFNZXNzYWdlPiBtSW5wdXRGb3JtYXQ7CiAgICAgc3A8QU1lc3NhZ2U+IG1PdXRwdXRGb3JtYXQ7CkBAIC0yODMsMTIgKzI4NiwxMyBAQAogICAgIGRvdWJsZSBtRnBzOwogICAgIGRvdWJsZSBtQ2FwdHVyZUZwczsKICAgICBib29sIG1DcmVhdGVJbnB1dEJ1ZmZlcnNTdXNwZW5kZWQ7Ci0gICAgdWludDMyX3QgbUxhdGVuY3k7CisgICAgc3RkOjpvcHRpb25hbDx1aW50MzJfdD4gbUxhdGVuY3k7CiAKICAgICBib29sIG1UdW5uZWxlZDsKIAogICAgIE9NWF9JTkRFWFRZUEUgbURlc2NyaWJlQ29sb3JBc3BlY3RzSW5kZXg7CiAgICAgT01YX0lOREVYVFlQRSBtRGVzY3JpYmVIRFJTdGF0aWNJbmZvSW5kZXg7CisgICAgT01YX0lOREVYVFlQRSBtRGVzY3JpYmVIRFIxMFBsdXNJbmZvSW5kZXg7CiAKICAgICBzdGQ6OnNoYXJlZF9wdHI8QUNvZGVjQnVmZmVyQ2hhbm5lbD4gbUJ1ZmZlckNoYW5uZWw7CiAKQEAgLTQyMyw2ICs0MjcsMTEgQEAKICAgICAvLyB1bnNwZWNpZmllZCB2YWx1ZXMuCiAgICAgdm9pZCBvbkRhdGFTcGFjZUNoYW5nZWQoYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjb25zdCBDb2xvckFzcGVjdHMgJmFzcGVjdHMpOwogCisgICAgLy8gbm90aWZpZXMgdGhlIGNvZGVjIHRoYXQgdGhlIGNvbmZpZyB3aXRoIHxjb25maWdJbmRleHwgaGFzIGNoYW5nZWQsIHRoZSB2YWx1ZQorICAgIC8vIGNhbiBiZSBxdWVyaWVkIGJ5IE9NWCBnZXRDb25maWcsIGFuZCB0aGUgY29uZmlnIHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoZSBuZXh0CisgICAgLy8gb3V0cHV0IGJ1ZmZlciBub3RpZmllZCBhZnRlciB0aGlzIGNhbGxiYWNrLgorICAgIHZvaWQgb25Db25maWdVcGRhdGUoT01YX0lOREVYVFlQRSBjb25maWdJbmRleCk7CisKICAgICAvLyBnZXRzIGluZGV4IG9yIHNldHMgaXQgdG8gMCBvbiBlcnJvci4gUmV0dXJucyBlcnJvciBmcm9tIGNvZGVjLgogICAgIHN0YXR1c190IGluaXREZXNjcmliZUhEUlN0YXRpY0luZm9JbmRleCgpOwogCkBAIC00MzQsMTIgKzQ0MywyMiBAQAogICAgIC8vIHNldHMgfHBhcmFtc3wuIFJldHVybnMgdGhlIGNvZGVjIGVycm9yLgogICAgIHN0YXR1c190IHNldEhEUlN0YXRpY0luZm8oY29uc3QgRGVzY3JpYmVIRFJTdGF0aWNJbmZvUGFyYW1zICZwYXJhbXMpOwogCisgICAgLy8gc2V0cyB8aGRyMTBQbHVzSW5mb3wuIFJldHVybnMgdGhlIGNvZGVjIGVycm9yLgorICAgIHN0YXR1c190IHNldEhkcjEwUGx1c0luZm8oY29uc3Qgc3A8QUJ1ZmZlcj4gJmhkcjEwUGx1c0luZm8pOworCiAgICAgLy8gZ2V0cyB8cGFyYW1zfC4gUmV0dXJucyB0aGUgY29kZWMgZXJyb3IuCiAgICAgc3RhdHVzX3QgZ2V0SERSU3RhdGljSW5mbyhEZXNjcmliZUhEUlN0YXRpY0luZm9QYXJhbXMgJnBhcmFtcyk7CiAKICAgICAvLyBnZXRzIEhEUiBzdGF0aWMgaW5mb3JtYXRpb24gZm9yIHRoZSB2aWRlbyBlbmNvZGVyL2RlY29kZXIgcG9ydCBhbmQgc2V0cyB0aGVtIGludG8gfGZvcm1hdHwuCiAgICAgc3RhdHVzX3QgZ2V0SERSU3RhdGljSW5mb0ZvclZpZGVvQ29kZWMoT01YX1UzMiBwb3J0SW5kZXgsIHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKIAorICAgIC8vIGdldHMgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zIHBhcmFtcy4gSWYgfHBhcmFtU2l6ZVVzZWR8IGlzIHplcm8sIGl0J3MKKyAgICAvLyBwb3NzaWJsZSB0aGF0IHRoZSByZXR1cm5lZCBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgb25seSBoYXMgdGhlCisgICAgLy8gblBhcmFtU2l6ZVVzZWQgZmllbGQgdXBkYXRlZCwgYmVjYXVzZSB0aGUgc2l6ZSBvZiB0aGUgc3RvcmFnZSBpcyBpbnN1ZmZpY2llbnQuCisgICAgLy8gSW4gdGhpcyBjYXNlLCBnZXRIRFIxMFBsdXNJbmZvKCkgc2hvdWxkIGJlIGNhbGxlZCBhZ2FpbiB3aXRoIHxwYXJhbVNpemVVc2VkfAorICAgIC8vIHNwZWNpZmllZCB0byB0aGUgcHJldmlvdXMgcmV0dXJuZWQgdmFsdWUuCisgICAgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zKiBnZXRIRFIxMFBsdXNJbmZvKHNpemVfdCBwYXJhbVNpemVVc2VkID0gMCk7CisKICAgICB0eXBlZGVmIHN0cnVjdCBkcmNQYXJhbXMgewogICAgICAgICBpbnQzMl90IGRyY0N1dDsKICAgICAgICAgaW50MzJfdCBkcmNCb29zdDsKQEAgLTQ2MCw2ICs0NzksOCBAQAogCiAgICAgc3RhdHVzX3Qgc2V0dXBFQUMzQ29kZWMoYm9vbCBlbmNvZGVyLCBpbnQzMl90IG51bUNoYW5uZWxzLCBpbnQzMl90IHNhbXBsZVJhdGUpOwogCisgICAgc3RhdHVzX3Qgc2V0dXBBQzRDb2RlYyhib29sIGVuY29kZXIsIGludDMyX3QgbnVtQ2hhbm5lbHMsIGludDMyX3Qgc2FtcGxlUmF0ZSk7CisKICAgICBzdGF0dXNfdCBzZWxlY3RBdWRpb1BvcnRGb3JtYXQoCiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0FVRElPX0NPRElOR1RZUEUgZGVzaXJlZEZvcm1hdCk7CiAKQEAgLTQ2Nyw3ICs0ODgsOCBAQAogICAgIHN0YXR1c190IHNldHVwRzcxMUNvZGVjKGJvb2wgZW5jb2RlciwgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IG51bUNoYW5uZWxzKTsKIAogICAgIHN0YXR1c190IHNldHVwRmxhY0NvZGVjKAotICAgICAgICAgICAgYm9vbCBlbmNvZGVyLCBpbnQzMl90IG51bUNoYW5uZWxzLCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgY29tcHJlc3Npb25MZXZlbCk7CisgICAgICAgICAgICBib29sIGVuY29kZXIsIGludDMyX3QgbnVtQ2hhbm5lbHMsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBjb21wcmVzc2lvbkxldmVsLAorICAgICAgICAgICAgQXVkaW9FbmNvZGluZyBlbmNvZGluZyk7CiAKICAgICBzdGF0dXNfdCBzZXR1cFJhd0F1ZGlvRm9ybWF0KAogICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBudW1DaGFubmVscywKQEAgLTQ3Niw2ICs0OTgsNyBAQAogICAgIHN0YXR1c190IHNldFByaW9yaXR5KGludDMyX3QgcHJpb3JpdHkpOwogICAgIHN0YXR1c190IHNldExhdGVuY3kodWludDMyX3QgbGF0ZW5jeSk7CiAgICAgc3RhdHVzX3QgZ2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSk7CisgICAgc3RhdHVzX3Qgc2V0QXVkaW9QcmVzZW50YXRpb24oaW50MzJfdCBwcmVzZW50YXRpb25JZCwgaW50MzJfdCBwcm9ncmFtSWQpOwogICAgIHN0YXR1c190IHNldE9wZXJhdGluZ1JhdGUoZmxvYXQgcmF0ZUZsb2F0LCBib29sIGlzVmlkZW8pOwogICAgIHN0YXR1c190IGdldEludHJhUmVmcmVzaFBlcmlvZCh1aW50MzJfdCAqaW50cmFSZWZyZXNoUGVyaW9kKTsKICAgICBzdGF0dXNfdCBzZXRJbnRyYVJlZnJlc2hQZXJpb2QodWludDMyX3QgaW50cmFSZWZyZXNoUGVyaW9kLCBib29sIGluQ29uZmlndXJlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmgKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmgKaW5kZXggMjA2ZDMyMi4uYWYwNGRhZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaApAQCAtNDQsNyArNDQsOSBAQAogICAgICAgICAgICAgdWludDMyX3Qgb3V0U2FtcGxlUmF0ZSA9IDAsCiAgICAgICAgICAgICB1aWRfdCB1aWQgPSAtMSwKICAgICAgICAgICAgIHBpZF90IHBpZCA9IC0xLAotICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FLAorICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBzZWxlY3RlZE1pY0RpcmVjdGlvbiA9IE1JQ19ESVJFQ1RJT05fVU5TUEVDSUZJRUQsCisgICAgICAgICAgICBmbG9hdCBzZWxlY3RlZE1pY0ZpZWxkRGltZW5zaW9uID0gTUlDX0ZJRUxEX0RJTUVOU0lPTl9OT1JNQUwpOwogCiAgICAgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CiAKQEAgLTY4LDcgKzcwLDEwIEBACiAgICAgc3RhdHVzX3QgcmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKTsKIAogICAgIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKTsKKyAgICBzdGF0dXNfdCBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKTsKKyAgICBzdGF0dXNfdCBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSk7CiAKKyAgICBzdGF0dXNfdCBnZXRQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSBjb25zdDsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkF1ZGlvU291cmNlKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DbGVhckZpbGVTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTgzNzQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DbGVhckZpbGVTb3VyY2UuaApAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDTEVBUl9GSUxFX1NPVVJDRV9IXworCisjZGVmaW5lIENMRUFSX0ZJTEVfU09VUkNFX0hfCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIENsZWFyRmlsZVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlIHsKK3B1YmxpYzoKKyAgICBDbGVhckZpbGVTb3VyY2UoY29uc3QgY2hhciAqZmlsZW5hbWUpOworICAgIC8vIENsZWFyRmlsZVNvdXJjZSB0YWtlcyBvd25lcnNoaXAgYW5kIHdpbGwgY2xvc2UgdGhlIGZkCisgICAgQ2xlYXJGaWxlU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgeworICAgICAgICByZXR1cm4ga0lzTG9jYWxGaWxlU291cmNlOworICAgIH0KKworICAgIHZpcnR1YWwgU3RyaW5nOCB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIG1OYW1lOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkNsZWFyRmlsZVNvdXJjZSgpOworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXRfbChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgaW50IG1GZDsKKyAgICBpbnQ2NF90IG1PZmZzZXQ7CisgICAgaW50NjRfdCBtTGVuZ3RoOworICAgIE11dGV4IG1Mb2NrOworCitwcml2YXRlOgorICAgIFN0cmluZzggbU5hbWU7CisKKyAgICBDbGVhckZpbGVTb3VyY2UoY29uc3QgQ2xlYXJGaWxlU291cmNlICYpOworICAgIENsZWFyRmlsZVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IENsZWFyRmlsZVNvdXJjZSAmKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ0xFQVJfRklMRV9TT1VSQ0VfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DbGVhck1lZGlhSFRUUC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9DbGVhck1lZGlhSFRUUC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyOTA3YTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyTWVkaWFIVFRQLmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0xFQVJfTUVESUFfSFRUUF9IXworCisjZGVmaW5lIENMRUFSX01FRElBX0hUVFBfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorCisjaW5jbHVkZSAiaW5jbHVkZS9IVFRQQmFzZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBNZWRpYUhUVFBDb25uZWN0aW9uOworCitzdHJ1Y3QgQ2xlYXJNZWRpYUhUVFAgOiBwdWJsaWMgSFRUUEJhc2UgeworICAgIENsZWFyTWVkaWFIVFRQKGNvbnN0IHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+ICZjb25uKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAorICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQpOworCisgICAgdmlydHVhbCB2b2lkIGNsb3NlKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKKworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVjb25uZWN0QXRPZmZzZXQob2ZmNjRfdCBvZmZzZXQpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+Q2xlYXJNZWRpYUhUVFAoKTsKKworICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKTsKKyAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdDsKKworICAgIEFTdHJpbmcgbUxhc3RVUkk7CisKK3ByaXZhdGU6CisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKyAgICBzcDxNZWRpYUhUVFBDb25uZWN0aW9uPiBtSFRUUENvbm5lY3Rpb247CisKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtTGFzdEhlYWRlcnM7CisKKyAgICBib29sIG1DYWNoZWRTaXplVmFsaWQ7CisgICAgb2ZmNjRfdCBtQ2FjaGVkU2l6ZTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENsZWFyTWVkaWFIVFRQKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ0xFQVJfTUVESUFfSFRUUF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oCmluZGV4IDViMzU0M2QuLjc1YjBkOGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmgKQEAgLTM1LDIxICszNSwzMiBAQAogCiAgICAgYm9vbCBpc0RzdFJHQigpIGNvbnN0OwogCisgICAgdm9pZCBzZXRTcmNDb2xvclNwYWNlKHVpbnQzMl90IHN0YW5kYXJkLCB1aW50MzJfdCByYW5nZSwgdWludDMyX3QgdHJhbnNmZXIpOworCiAgICAgc3RhdHVzX3QgY29udmVydCgKICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnNyY0JpdHMsCi0gICAgICAgICAgICBzaXplX3Qgc3JjV2lkdGgsIHNpemVfdCBzcmNIZWlnaHQsCisgICAgICAgICAgICBzaXplX3Qgc3JjV2lkdGgsIHNpemVfdCBzcmNIZWlnaHQsIHNpemVfdCBzcmNTdHJpZGUsCiAgICAgICAgICAgICBzaXplX3Qgc3JjQ3JvcExlZnQsIHNpemVfdCBzcmNDcm9wVG9wLAogICAgICAgICAgICAgc2l6ZV90IHNyY0Nyb3BSaWdodCwgc2l6ZV90IHNyY0Nyb3BCb3R0b20sCiAgICAgICAgICAgICB2b2lkICpkc3RCaXRzLAotICAgICAgICAgICAgc2l6ZV90IGRzdFdpZHRoLCBzaXplX3QgZHN0SGVpZ2h0LAorICAgICAgICAgICAgc2l6ZV90IGRzdFdpZHRoLCBzaXplX3QgZHN0SGVpZ2h0LCBzaXplX3QgZHN0U3RyaWRlLAogICAgICAgICAgICAgc2l6ZV90IGRzdENyb3BMZWZ0LCBzaXplX3QgZHN0Q3JvcFRvcCwKICAgICAgICAgICAgIHNpemVfdCBkc3RDcm9wUmlnaHQsIHNpemVfdCBkc3RDcm9wQm90dG9tKTsKIAogcHJpdmF0ZToKKyAgICBzdHJ1Y3QgQ29sb3JTcGFjZSB7CisgICAgICAgIHVpbnQzMl90IG1TdGFuZGFyZDsKKyAgICAgICAgdWludDMyX3QgbVJhbmdlOworICAgICAgICB1aW50MzJfdCBtVHJhbnNmZXI7CisKKyAgICAgICAgYm9vbCBpc0J0NzA5KCk7CisgICAgICAgIGJvb2wgaXNKcGVnKCk7CisgICAgfTsKKwogICAgIHN0cnVjdCBCaXRtYXBQYXJhbXMgewogICAgICAgICBCaXRtYXBQYXJhbXMoCiAgICAgICAgICAgICAgICAgdm9pZCAqYml0cywKLSAgICAgICAgICAgICAgICBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsCisgICAgICAgICAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LCBzaXplX3Qgc3RyaWRlLAogICAgICAgICAgICAgICAgIHNpemVfdCBjcm9wTGVmdCwgc2l6ZV90IGNyb3BUb3AsCiAgICAgICAgICAgICAgICAgc2l6ZV90IGNyb3BSaWdodCwgc2l6ZV90IGNyb3BCb3R0b20sCiAgICAgICAgICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGcm9tYXQpOwpAQCAtNjUsNiArNzYsNyBAQAogICAgIH07CiAKICAgICBPTVhfQ09MT1JfRk9STUFUVFlQRSBtU3JjRm9ybWF0LCBtRHN0Rm9ybWF0OworICAgIENvbG9yU3BhY2UgbVNyY0NvbG9yU3BhY2U7CiAgICAgdWludDhfdCAqbUNsaXA7CiAKICAgICB1aW50OF90ICppbml0Q2xpcCgpOwpAQCAtNzgsNiArOTAsOSBAQAogICAgIHN0YXR1c190IGNvbnZlcnRZVVY0MjBQbGFuYXJVc2VMaWJZVVYoCiAgICAgICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpOwogCisgICAgc3RhdHVzX3QgY29udmVydFlVVjQyMFNlbWlQbGFuYXJVc2VMaWJZVVYoCisgICAgICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpOworCiAgICAgc3RhdHVzX3QgY29udmVydFlVVjQyMFBsYW5hcjE2KAogICAgICAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0KTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjdhNDczCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKQEAgLTAsMCArMSwxMDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIERBVEFfU09VUkNFX0hfCisKKyNkZWZpbmUgREFUQV9TT1VSQ0VfSF8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9JRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDxkcm0vRHJtTWFuYWdlckNsaWVudC5oPgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgU3RyaW5nODsKKworY2xhc3MgRGF0YVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlQmFzZSwgcHVibGljIHZpcnR1YWwgUmVmQmFzZSB7CitwdWJsaWM6CisgICAgRGF0YVNvdXJjZSgpIDogbVdyYXBwZXIoTlVMTCkge30KKworICAgIC8vIHJldHVybnMgYSBwb2ludGVyIHRvIElEYXRhU291cmNlIGlmIGl0IGlzIHdyYXBwZWQuCisgICAgdmlydHVhbCBzcDxJRGF0YVNvdXJjZT4gZ2V0SURhdGFTb3VyY2UoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHZpcnR1YWwgU3RyaW5nOCB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzgoIjx1bnNwZWNpZmllZD4iKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlY29ubmVjdEF0T2Zmc2V0KG9mZjY0X3QgLypvZmZzZXQqLykgeworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCisgICAgLy8gZm9yIERSTQorICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gRHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciAqIC8qbWltZSovID0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFN0cmluZzggZ2V0VXJpKCkgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBnZXRVcmkoY2hhciAqdXJpU3RyaW5nLCBzaXplX3QgYnVmZmVyU2l6ZSkgZmluYWwgeworICAgICAgICBpbnQgcmV0ID0gc25wcmludGYodXJpU3RyaW5nLCBidWZmZXJTaXplLCAiJXMiLCBnZXRVcmkoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHJldCA+PSAwICYmIHN0YXRpY19jYXN0PHNpemVfdD4ocmV0KSA8IGJ1ZmZlclNpemU7CisgICAgfQorCisgICAgdmlydHVhbCBTdHJpbmc4IGdldE1JTUVUeXBlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisgICAgfQorCisgICAgQ0RhdGFTb3VyY2UgKndyYXAoKSB7CisgICAgICAgIGlmIChtV3JhcHBlcikgeworICAgICAgICAgICAgcmV0dXJuIG1XcmFwcGVyOworICAgICAgICB9CisgICAgICAgIG1XcmFwcGVyID0gbmV3IENEYXRhU291cmNlKCk7CisgICAgICAgIG1XcmFwcGVyLT5oYW5kbGUgPSB0aGlzOworCisgICAgICAgIG1XcmFwcGVyLT5yZWFkQXQgPSBbXSh2b2lkICpoYW5kbGUsIG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgLT4gc3NpemVfdCB7CisgICAgICAgICAgICByZXR1cm4gKChEYXRhU291cmNlKiloYW5kbGUpLT5yZWFkQXQob2Zmc2V0LCBkYXRhLCBzaXplKTsKKyAgICAgICAgfTsKKyAgICAgICAgbVdyYXBwZXItPmdldFNpemUgPSBbXSh2b2lkICpoYW5kbGUsIG9mZjY0X3QgKnNpemUpIC0+IHN0YXR1c190IHsKKyAgICAgICAgICAgIHJldHVybiAoKERhdGFTb3VyY2UqKWhhbmRsZSktPmdldFNpemUoc2l6ZSk7CisgICAgICAgIH07CisgICAgICAgIG1XcmFwcGVyLT5mbGFncyA9IFtdKHZvaWQgKmhhbmRsZSkgLT4gdWludDMyX3QgeworICAgICAgICAgICAgcmV0dXJuICgoRGF0YVNvdXJjZSopaGFuZGxlKS0+ZmxhZ3MoKTsKKyAgICAgICAgfTsKKyAgICAgICAgbVdyYXBwZXItPmdldFVyaSA9IFtdKHZvaWQgKmhhbmRsZSwgY2hhciAqdXJpU3RyaW5nLCBzaXplX3QgYnVmZmVyU2l6ZSkgLT4gYm9vbCB7CisgICAgICAgICAgICByZXR1cm4gKChEYXRhU291cmNlKiloYW5kbGUpLT5nZXRVcmkodXJpU3RyaW5nLCBidWZmZXJTaXplKTsKKyAgICAgICAgfTsKKyAgICAgICAgcmV0dXJuIG1XcmFwcGVyOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkRhdGFTb3VyY2UoKSB7CisgICAgICAgIGRlbGV0ZSBtV3JhcHBlcjsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQ0RhdGFTb3VyY2UgKm1XcmFwcGVyOworICAgIERhdGFTb3VyY2UoY29uc3QgRGF0YVNvdXJjZSAmKTsKKyAgICBEYXRhU291cmNlICZvcGVyYXRvcj0oY29uc3QgRGF0YVNvdXJjZSAmKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gREFUQV9TT1VSQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUJhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjViODNkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlQmFzZS5oCkBAIC0wLDAgKzEsODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIERBVEFfU09VUkNFX0JBU0VfSF8KKworI2RlZmluZSBEQVRBX1NPVVJDRV9CQVNFX0hfCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBTdHJpbmc4OworCitjbGFzcyBEYXRhU291cmNlQmFzZSB7CitwdWJsaWM6CisgICAgZW51bSBGbGFncyB7CisgICAgICAgIGtXYW50c1ByZWZldGNoaW5nICAgICAgPSAxLAorICAgICAgICBrU3RyZWFtZWRGcm9tTG9jYWxIb3N0ID0gMiwKKyAgICAgICAga0lzQ2FjaGluZ0RhdGFTb3VyY2UgICA9IDQsCisgICAgICAgIGtJc0hUVFBCYXNlZFNvdXJjZSAgICAgPSA4LAorICAgICAgICBrSXNMb2NhbEZpbGVTb3VyY2UgICAgID0gMTYsCisgICAgfTsKKworICAgIERhdGFTb3VyY2VCYXNlKCkge30KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3QgPSAwOworCisgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIC0xIG9uIGZhaWx1cmUuIEl0J3Mgbm90IGFuIGVycm9yIGlmCisgICAgLy8gdGhpcyByZXR1cm5zIHplcm87IGl0IGp1c3QgbWVhbnMgdGhlIGdpdmVuIG9mZnNldCBpcyBlcXVhbCB0bywgb3IKKyAgICAvLyBiZXlvbmQsIHRoZSBlbmQgb2YgdGhlIHNvdXJjZS4KKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgPSAwOworCisgICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kczoKKyAgICBib29sIGdldFVJbnQxNihvZmY2NF90IG9mZnNldCwgdWludDE2X3QgKngpOworICAgIGJvb2wgZ2V0VUludDI0KG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCk7IC8vIDMgYnl0ZSBpbnQsIHJldHVybmVkIGFzIGEgMzItYml0IGludAorICAgIGJvb2wgZ2V0VUludDMyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCk7CisgICAgYm9vbCBnZXRVSW50NjQob2ZmNjRfdCBvZmZzZXQsIHVpbnQ2NF90ICp4KTsKKworICAgIC8vIHJlYWQgZWl0aGVyIGludDxOPiBvciBpbnQ8Mk4+IGludG8gYSB1aW50PDJOPl90LCBzaXplIGlzIHRoZSBpbnQgc2l6ZSBpbiBieXRlcy4KKyAgICBib29sIGdldFVJbnQxNlZhcihvZmY2NF90IG9mZnNldCwgdWludDE2X3QgKngsIHNpemVfdCBzaXplKTsKKyAgICBib29sIGdldFVJbnQzMlZhcihvZmY2NF90IG9mZnNldCwgdWludDMyX3QgKngsIHNpemVfdCBzaXplKTsKKyAgICBib29sIGdldFVJbnQ2NFZhcihvZmY2NF90IG9mZnNldCwgdWludDY0X3QgKngsIHNpemVfdCBzaXplKTsKKworICAgIC8vIE1heSByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOworCisgICAgdmlydHVhbCBib29sIGdldFVyaShjaGFyICp1cmlTdHJpbmcsIHNpemVfdCBidWZmZXJTaXplKTsKKworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpIHt9OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdmFpbGFibGVTaXplKG9mZjY0X3QgLypvZmZzZXQqLywgb2ZmNjRfdCAqIC8qc2l6ZSovKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5EYXRhU291cmNlQmFzZSgpIHt9CisKK3ByaXZhdGU6CisgICAgRGF0YVNvdXJjZUJhc2UoY29uc3QgRGF0YVNvdXJjZUJhc2UgJik7CisgICAgRGF0YVNvdXJjZUJhc2UgJm9wZXJhdG9yPShjb25zdCBEYXRhU291cmNlQmFzZSAmKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gREFUQV9TT1VSQ0VfQkFTRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaAppbmRleCA4NjA0ODkwLi5iNjEwZWVmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaApAQCAtMjAsNDcgKzIwLDI5IEBACiAKICNpbmNsdWRlIDxzdGRpby5oPgogCi0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyRmlsZVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogI2luY2x1ZGUgPGRybS9Ecm1NYW5hZ2VyQ2xpZW50Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgRmlsZVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlIHsKK2NsYXNzIEZpbGVTb3VyY2UgOiBwdWJsaWMgQ2xlYXJGaWxlU291cmNlIHsKIHB1YmxpYzoKICAgICBGaWxlU291cmNlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKICAgICAvLyBGaWxlU291cmNlIHRha2VzIG93bmVyc2hpcCBhbmQgd2lsbCBjbG9zZSB0aGUgZmQKICAgICBGaWxlU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7Ci0KICAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7Ci0KLSAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgewotICAgICAgICByZXR1cm4ga0lzTG9jYWxGaWxlU291cmNlOwotICAgIH0KLQogICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gRHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciAqbWltZSk7CiAKLSAgICB2aXJ0dWFsIFN0cmluZzggdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBtTmFtZTsKLSAgICB9Ci0KICAgICBzdGF0aWMgYm9vbCByZXF1aXJlc0RybShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwgY29uc3QgY2hhciAqbWltZSk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5GaWxlU291cmNlKCk7CiAKIHByaXZhdGU6Ci0gICAgaW50IG1GZDsKLSAgICBpbnQ2NF90IG1PZmZzZXQ7Ci0gICAgaW50NjRfdCBtTGVuZ3RoOwotICAgIE11dGV4IG1Mb2NrOwotICAgIFN0cmluZzggbU5hbWU7Ci0KICAgICAvKmZvciBEUk0qLwogICAgIHNwPERlY3J5cHRIYW5kbGU+IG1EZWNyeXB0SGFuZGxlOwogICAgIERybU1hbmFnZXJDbGllbnQgKm1Ecm1NYW5hZ2VyQ2xpZW50OwpAQCAtNjgsNyArNTAsNyBAQAogICAgIHNzaXplX3QgbURybUJ1ZlNpemU7CiAgICAgdW5zaWduZWQgY2hhciAqbURybUJ1ZjsKIAotICAgIHNzaXplX3QgcmVhZEF0RFJNKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgc3NpemVfdCByZWFkQXREUk1fbChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwogCiAgICAgRmlsZVNvdXJjZShjb25zdCBGaWxlU291cmNlICYpOwogICAgIEZpbGVTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBGaWxlU291cmNlICYpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oCmluZGV4IGYwZWJkNDguLmI4M2E5NTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmgKQEAgLTE4LDcgKzE4LDYgQEAKICNkZWZpbmUgSU5URVJGQUNFX1VUSUxTX0hfCiAKICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmgKaW5kZXggZjE4OTQwZC4uNmYxOTAyMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaApAQCAtODIsMTAgKzgyLDYgQEAKICAgICAgICAga1doYXRTd2l0Y2ggICAgICAgICAgICAgICAgICAgICAgICAgID0gJ3N3Y2gnLAogICAgIH07CiAKLSAgICBlbnVtIHsKLSAgICAgICAga01heEN0dHNPZmZzZXRUaW1lVXMgPSAxMDAwMDAwTEwsICAvLyAxIHNlY29uZAotICAgIH07Ci0KICAgICBpbnQgIG1GZDsKICAgICBpbnQgbU5leHRGZDsKICAgICBzcDxNZXRhRGF0YT4gbVN0YXJ0TWV0YTsKQEAgLTExMCw2ICsxMDYsNyBAQAogICAgIHVpbnQzMl90IG1JbnRlcmxlYXZlRHVyYXRpb25VczsKICAgICBpbnQzMl90IG1UaW1lU2NhbGU7CiAgICAgaW50NjRfdCBtU3RhcnRUaW1lc3RhbXBVczsKKyAgICBpbnQzMl90IG1TdGFydFRpbWVPZmZzZXRCRnJhbWVzVXM7IC8vIFN0YXJ0IHRpbWUgb2Zmc2V0IHdoZW4gQiBGcmFtZXMgYXJlIHByZXNlbnQKICAgICBpbnQgbUxhdGl0dWRleDEwMDAwOwogICAgIGludCBtTG9uZ2l0dWRleDEwMDAwOwogICAgIGJvb2wgbUFyZUdlb1RhZ3NBdmFpbGFibGU7CkBAIC0xMjksNiArMTI2LDcgQEAKIAogICAgIHZvaWQgc2V0U3RhcnRUaW1lc3RhbXBVcyhpbnQ2NF90IHRpbWVVcyk7CiAgICAgaW50NjRfdCBnZXRTdGFydFRpbWVzdGFtcFVzKCk7ICAvLyBOb3QgY29uc3QKKyAgICBpbnQzMl90IGdldFN0YXJ0VGltZU9mZnNldEJGcmFtZXNVcygpOwogICAgIHN0YXR1c190IHN0YXJ0VHJhY2tzKE1ldGFEYXRhICpwYXJhbXMpOwogICAgIHNpemVfdCBudW1UcmFja3MoKTsKICAgICBpbnQ2NF90IGVzdGltYXRlTW9vdkJveFNpemUoaW50MzJfdCBiaXRSYXRlKTsKQEAgLTI1NSw3ICsyNTMsOSBAQAogICAgIHZvaWQgaW5pdEludGVybmFsKGludCBmZCwgYm9vbCBpc0ZpcnN0U2Vzc2lvbik7CiAKICAgICAvLyBBY3F1aXJlIGxvY2sgYmVmb3JlIGNhbGxpbmcgdGhlc2UgbWV0aG9kcwotICAgIG9mZjY0X3QgYWRkU2FtcGxlX2woTWVkaWFCdWZmZXIgKmJ1ZmZlciwgYm9vbCB1c2VQcmVmaXgsIGJvb2wgaXNFeGlmLCBzaXplX3QgKmJ5dGVzV3JpdHRlbik7CisgICAgb2ZmNjRfdCBhZGRTYW1wbGVfbCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXIsIGJvb2wgdXNlUHJlZml4LAorICAgICAgICAgICAgdWludDMyX3QgdGlmZkhkck9mZnNldCwgc2l6ZV90ICpieXRlc1dyaXR0ZW4pOwogICAgIHZvaWQgYWRkTGVuZ3RoUHJlZml4ZWRTYW1wbGVfbChNZWRpYUJ1ZmZlciAqYnVmZmVyKTsKICAgICB2b2lkIGFkZE11bHRpcGxlTGVuZ3RoUHJlZml4ZWRTYW1wbGVzX2woTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CiAgICAgdWludDE2X3QgYWRkUHJvcGVydHlfbChjb25zdCBJdGVtUHJvcGVydHkgJik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDFkNDljMWEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vLi4vLi4vbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjZTYzYWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmgKQEAgLTAsMCArMSwyMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0JVRkZFUl9IXworCisjZGVmaW5lIE1FRElBX0JVRkZFUl9IXworCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGxpc3Q+CisKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBQnVmZmVyOworY2xhc3MgTWVkaWFCdWZmZXI7CitjbGFzcyBNZWRpYUJ1ZmZlck9ic2VydmVyOworY2xhc3MgTWV0YURhdGFCYXNlOworCitjbGFzcyBNZWRpYUJ1ZmZlciA6IHB1YmxpYyBNZWRpYUJ1ZmZlckJhc2UgeworcHVibGljOgorICAgIC8vIGFsbG9jYXRpb25zIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIHRoaXMgd2lsbCB1c2Ugc2hhcmVkIG1lbW9yeS4KKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtTaGFyZWRNZW1UaHJlc2hvbGQgPSA2NCAqIDEwMjQ7CisKKyAgICAvLyBUaGUgdW5kZXJseWluZyBkYXRhIHJlbWFpbnMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIhCisgICAgTWVkaWFCdWZmZXIodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgZXhwbGljaXQgTWVkaWFCdWZmZXIoc2l6ZV90IHNpemUpOworCisgICAgZXhwbGljaXQgTWVkaWFCdWZmZXIoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7CisjaWZuZGVmIE5PX0lNRU1PUlkKKyAgICBNZWRpYUJ1ZmZlcihjb25zdCBzcDxJTWVtb3J5PiAmbWVtKSA6CisgICAgICAgIE1lZGlhQnVmZmVyKCh1aW50OF90ICopbWVtLT5wb2ludGVyKCkgKyBzaXplb2YoU2hhcmVkQ29udHJvbCksIG1lbS0+c2l6ZSgpKSB7CisgICAgICAgIC8vIGRlbGVnYXRlIGFuZCBvdmVycmlkZSBtTWVtb3J5CisgICAgICAgIG1NZW1vcnkgPSBtZW07CisgICAgfQorI2VuZGlmCisKKyAgICAvLyBJZiBNZWRpYUJ1ZmZlckdyb3VwIGlzIHNldCwgZGVjcmVtZW50IHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQ7CisgICAgLy8gaWYgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudCBkcm9wcyB0byAwLCByZXR1cm4gdGhlIGJ1ZmZlciB0byB0aGUKKyAgICAvLyBhc3NvY2lhdGVkIE1lZGlhQnVmZmVyR3JvdXAuCisgICAgLy8KKyAgICAvLyBJZiBubyBNZWRpYUJ1ZmZlckdyb3VwIGlzIHNldCwgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudCBtdXN0IGJlIHplcm8KKyAgICAvLyB3aGVuIGNhbGxlZCwgd2hlcmV1cG9uIHRoZSBNZWRpYUJ1ZmZlciBpcyBkZWxldGVkLgorICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCk7CisKKyAgICAvLyBJbmNyZW1lbnRzIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQuCisgICAgLy8gVXNlIG9ubHkgd2hlbiBNZWRpYUJ1ZmZlckdyb3VwIGlzIHNldC4KKyAgICB2aXJ0dWFsIHZvaWQgYWRkX3JlZigpOworCisgICAgdmlydHVhbCB2b2lkICpkYXRhKCkgY29uc3Q7CisgICAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIGNvbnN0OworCisgICAgdmlydHVhbCBzaXplX3QgcmFuZ2Vfb2Zmc2V0KCkgY29uc3Q7CisgICAgdmlydHVhbCBzaXplX3QgcmFuZ2VfbGVuZ3RoKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0X3JhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpOworCisgICAgTWV0YURhdGFCYXNlJiBtZXRhX2RhdGEoKTsKKworICAgIC8vIENsZWFycyBtZXRhIGRhdGEgYW5kIHJlc2V0cyB0aGUgcmFuZ2UgdG8gdGhlIGZ1bGwgZXh0ZW50LgorICAgIHZpcnR1YWwgdm9pZCByZXNldCgpOworCisgICAgdmlydHVhbCB2b2lkIHNldE9ic2VydmVyKE1lZGlhQnVmZmVyT2JzZXJ2ZXIgKmdyb3VwKTsKKworICAgIC8vIHN1bSBvZiBsb2NhbFJlZmNvdW50KCkgYW5kIHJlbW90ZVJlZmNvdW50KCkKKyAgICAvLyBSZXN1bHQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYXBwcm94aW1hdGUgdW5sZXNzIHRoZSByZXN1bHQgcHJlY2x1ZGVzIGNvbmN1cnJlbnQgYWNjZXNzZXMuCisgICAgdmlydHVhbCBpbnQgcmVmY291bnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBsb2NhbFJlZmNvdW50KCkgKyByZW1vdGVSZWZjb3VudCgpOworICAgIH0KKworICAgIC8vIFJlc3VsdCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhcHByb3hpbWF0ZSB1bmxlc3MgdGhlIHJlc3VsdCBwcmVjbHVkZXMgY29uY3VycmVudCBhY2Nlc3Nlcy4KKyAgICB2aXJ0dWFsIGludCBsb2NhbFJlZmNvdW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVJlZkNvdW50LmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgfQorCisgICAgdmlydHVhbCBpbnQgcmVtb3RlUmVmY291bnQoKSBjb25zdCB7CisjaWZuZGVmIE5PX0lNRU1PUlkKKyAgICAgICAgaWYgKG1NZW1vcnkuZ2V0KCkgPT0gbnVsbHB0ciB8fCBtTWVtb3J5LT5wb2ludGVyKCkgPT0gbnVsbHB0cikgcmV0dXJuIDA7CisgICAgICAgIGludDMyX3QgcmVtb3RlUmVmY291bnQgPQorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8U2hhcmVkQ29udHJvbCAqPihtTWVtb3J5LT5wb2ludGVyKCkpLT5nZXRSZW1vdGVSZWZjb3VudCgpOworICAgICAgICAvLyBTYW5pdHkgY2hlY2sgc28gdGhhdCByZW1vdGVSZWZDb3VudCgpIGlzIG5vbi1uZWdhdGl2ZS4KKyAgICAgICAgcmV0dXJuIHJlbW90ZVJlZmNvdW50ID49IDAgPyByZW1vdGVSZWZjb3VudCA6IDA7IC8vIGRvIG5vdCBhbGxvdyBjb3JydXB0ZWQgZGF0YS4KKyNlbHNlCisgICAgICAgIHJldHVybiAwOworI2VuZGlmCisgICAgfQorCisgICAgLy8gcmV0dXJucyBvbGQgdmFsdWUKKyAgICBpbnQgYWRkUmVtb3RlUmVmY291bnQoaW50MzJfdCB2YWx1ZSkgeworI2lmbmRlZiBOT19JTUVNT1JZCisgICAgICAgIGlmIChtTWVtb3J5LmdldCgpID09IG51bGxwdHIgfHwgbU1lbW9yeS0+cG9pbnRlcigpID09IG51bGxwdHIpIHJldHVybiAwOworICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTaGFyZWRDb250cm9sICo+KG1NZW1vcnktPnBvaW50ZXIoKSktPmFkZFJlbW90ZVJlZmNvdW50KHZhbHVlKTsKKyNlbHNlCisgICAgICAgICh2b2lkKSB2YWx1ZTsKKyAgICAgICAgcmV0dXJuIDA7CisjZW5kaWYKKyAgICB9CisKKyAgICBib29sIGlzRGVhZE9iamVjdCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGlzRGVhZE9iamVjdChtTWVtb3J5KTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBpc0RlYWRPYmplY3QoY29uc3Qgc3A8SU1lbW9yeT4gJm1lbW9yeSkgeworI2lmbmRlZiBOT19JTUVNT1JZCisgICAgICAgIGlmIChtZW1vcnkuZ2V0KCkgPT0gbnVsbHB0ciB8fCBtZW1vcnktPnBvaW50ZXIoKSA9PSBudWxscHRyKSByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFNoYXJlZENvbnRyb2wgKj4obWVtb3J5LT5wb2ludGVyKCkpLT5pc0RlYWRPYmplY3QoKTsKKyNlbHNlCisgICAgICAgICh2b2lkKSBtZW1vcnk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorICAgIH0KKworICAgIC8vIFN0aWNreSBvbiBlbmFibGluZyBvZiBzaGFyZWQgbWVtb3J5IE1lZGlhQnVmZmVycy4gQnkgZGVmYXVsdCB3ZSBkb24ndCB1c2UKKyAgICAvLyBzaGFyZWQgbWVtb3J5IGZvciBNZWRpYUJ1ZmZlcnMsIGJ1dCB3ZSBlbmFibGUgdGhpcyBmb3IgdGhvc2UgcHJvY2Vzc2VzCisgICAgLy8gdGhhdCBleHBvcnQgTWVkaWFCdWZmZXJzLgorICAgIHN0YXRpYyB2b2lkIHVzZVNoYXJlZE1lbW9yeSgpIHsKKyAgICAgICAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoCisgICAgICAgICAgICAgICAgJm1Vc2VTaGFyZWRNZW1vcnksIChpbnRfbGVhc3QzMl90KTEsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIC8vIHRydWUgaWYgTWVkaWFCdWZmZXIgaXMgb2JzZXJ2ZWQgKHBhcnQgb2YgYSBNZWRpYUJ1ZmZlckdyb3VwKS4KKyAgICBpbmxpbmUgYm9vbCBpc09ic2VydmVkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU9ic2VydmVyICE9IG51bGxwdHI7CisgICAgfQorCisgICAgdmlydHVhbCB+TWVkaWFCdWZmZXIoKTsKKworICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIE1lZGlhQnVmZmVyR3JvdXA7CisgICAgZnJpZW5kIGNsYXNzIE9NWERlY29kZXI7CisgICAgZnJpZW5kIGNsYXNzIEJuTWVkaWFTb3VyY2U7CisgICAgZnJpZW5kIGNsYXNzIEJwTWVkaWFTb3VyY2U7CisKKyAgICAvLyBGb3IgdXNlIGJ5IE9NWERlY29kZXIsIHJlZmVyZW5jZSBjb3VudCBtdXN0IGJlIDEsIGRyb3AgcmVmZXJlbmNlCisgICAgLy8gY291bnQgdG8gMCB3aXRob3V0IHNpZ25hbGxpbmcgdGhlIG9ic2VydmVyLgorICAgIHZvaWQgY2xhaW0oKTsKKworICAgIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgKm1PYnNlcnZlcjsKKyAgICBzdGQ6OmF0b21pYzxpbnQ+IG1SZWZDb3VudDsKKworICAgIHZvaWQgKm1EYXRhOworICAgIHNpemVfdCBtU2l6ZSwgbVJhbmdlT2Zmc2V0LCBtUmFuZ2VMZW5ndGg7CisgICAgc3A8QUJ1ZmZlcj4gbUJ1ZmZlcjsKKworICAgIGJvb2wgbU93bnNEYXRhOworCisgICAgTWV0YURhdGFCYXNlKiBtTWV0YURhdGE7CisKKyAgICBzdGF0aWMgc3RkOjphdG9taWNfaW50X2xlYXN0MzJfdCBtVXNlU2hhcmVkTWVtb3J5OworCisgICAgTWVkaWFCdWZmZXIoY29uc3QgTWVkaWFCdWZmZXIgJik7CisgICAgTWVkaWFCdWZmZXIgJm9wZXJhdG9yPShjb25zdCBNZWRpYUJ1ZmZlciAmKTsKKworICAgIC8vIFNoYXJlZENvbnRyb2wgYmxvY2sgYXQgdGhlIHN0YXJ0IG9mIElNZW1vcnkuCisgICAgc3RydWN0IFNoYXJlZENvbnRyb2wgeworICAgICAgICBlbnVtIHsKKyAgICAgICAgICAgIEZMQUdfREVBRF9PQkpFQ1QgPSAoMSA8PCAwKSwKKyAgICAgICAgfTsKKworICAgICAgICAvLyByZXR1cm5zIG9sZCB2YWx1ZQorICAgICAgICBpbmxpbmUgaW50MzJfdCBhZGRSZW1vdGVSZWZjb3VudChpbnQzMl90IHZhbHVlKSB7CisgICAgICAgICAgICByZXR1cm4gc3RkOjphdG9taWNfZmV0Y2hfYWRkX2V4cGxpY2l0KAorICAgICAgICAgICAgICAgICAgICAmbVJlbW90ZVJlZmNvdW50LCAoaW50X2xlYXN0MzJfdCl2YWx1ZSwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgaW50MzJfdCBnZXRSZW1vdGVSZWZjb3VudCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KCZtUmVtb3RlUmVmY291bnQsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5lIHZvaWQgc2V0UmVtb3RlUmVmY291bnQoaW50MzJfdCB2YWx1ZSkgeworICAgICAgICAgICAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoCisgICAgICAgICAgICAgICAgICAgICZtUmVtb3RlUmVmY291bnQsIChpbnRfbGVhc3QzMl90KXZhbHVlLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSBib29sIGlzRGVhZE9iamVjdCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAoc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCgKKyAgICAgICAgICAgICAgICAgICAgJm1GbGFncywgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCkgJiBGTEFHX0RFQURfT0JKRUNUKSAhPSAwOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5lIHZvaWQgc2V0RGVhZE9iamVjdCgpIHsKKyAgICAgICAgICAgICh2b2lkKXN0ZDo6YXRvbWljX2ZldGNoX29yX2V4cGxpY2l0KAorICAgICAgICAgICAgICAgICAgICAmbUZsYWdzLCAoaW50X2xlYXN0MzJfdClGTEFHX0RFQURfT0JKRUNULCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSB2b2lkIGNsZWFyKCkgeworICAgICAgICAgICAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoCisgICAgICAgICAgICAgICAgICAgICZtRmxhZ3MsIChpbnRfbGVhc3QzMl90KTAsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOworICAgICAgICAgICAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoCisgICAgICAgICAgICAgICAgICAgICZtUmVtb3RlUmVmY291bnQsIChpbnRfbGVhc3QzMl90KTAsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICAvLyBDYXV0aW9uOiBhdG9taWNfaW50X2Zhc3QzMl90IGlzIDY0IGJpdHMgb24gTFA2NC4KKyAgICAgICAgc3RkOjphdG9taWNfaW50X2xlYXN0MzJfdCBtRmxhZ3M7CisgICAgICAgIHN0ZDo6YXRvbWljX2ludF9sZWFzdDMyX3QgbVJlbW90ZVJlZmNvdW50OworICAgICAgICBpbnQzMl90IHVudXNlZFs2XSBfX2F0dHJpYnV0ZV9fKChfX3VudXNlZF9fKSk7IC8vIGFkZGl0aW9uYWwgYnVmZmVyIHNwYWNlCisgICAgfTsKKworICAgIGlubGluZSBTaGFyZWRDb250cm9sICpnZXRTaGFyZWRDb250cm9sKCkgY29uc3QgeworI2lmbmRlZiBOT19JTUVNT1JZCisgICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTaGFyZWRDb250cm9sICo+KG1NZW1vcnktPnBvaW50ZXIoKSk7CisjZWxzZQorICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisjZW5kaWYKKyAgICAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9CVUZGRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA4MGU0OWIwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi8uLi8uLi9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJjYmZjOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0JVRkZFUl9CQVNFX0hfCisKKyNkZWZpbmUgTUVESUFfQlVGRkVSX0JBU0VfSF8KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lZGlhQnVmZmVyQmFzZTsKK2NsYXNzIE1ldGFEYXRhQmFzZTsKKworY2xhc3MgTWVkaWFCdWZmZXJPYnNlcnZlciB7CitwdWJsaWM6CisgICAgTWVkaWFCdWZmZXJPYnNlcnZlcigpIHt9CisgICAgdmlydHVhbCB+TWVkaWFCdWZmZXJPYnNlcnZlcigpIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpID0gMDsKKworcHJpdmF0ZToKKyAgICBNZWRpYUJ1ZmZlck9ic2VydmVyKGNvbnN0IE1lZGlhQnVmZmVyT2JzZXJ2ZXIgJik7CisgICAgTWVkaWFCdWZmZXJPYnNlcnZlciAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhQnVmZmVyT2JzZXJ2ZXIgJik7Cit9OworCitjbGFzcyBNZWRpYUJ1ZmZlckJhc2UgeworcHVibGljOgorICAgIHN0YXRpYyBNZWRpYUJ1ZmZlckJhc2UgKkNyZWF0ZShzaXplX3Qgc2l6ZSk7CisKKyAgICAvLyBJZiBNZWRpYUJ1ZmZlckdyb3VwIGlzIHNldCwgZGVjcmVtZW50IHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQ7CisgICAgLy8gaWYgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudCBkcm9wcyB0byAwLCByZXR1cm4gdGhlIGJ1ZmZlciB0byB0aGUKKyAgICAvLyBhc3NvY2lhdGVkIE1lZGlhQnVmZmVyR3JvdXAuCisgICAgLy8KKyAgICAvLyBJZiBubyBNZWRpYUJ1ZmZlckdyb3VwIGlzIHNldCwgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudCBtdXN0IGJlIHplcm8KKyAgICAvLyB3aGVuIGNhbGxlZCwgd2hlcmV1cG9uIHRoZSBNZWRpYUJ1ZmZlciBpcyBkZWxldGVkLgorICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCkgPSAwOworCisgICAgLy8gSW5jcmVtZW50cyB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50LgorICAgIC8vIFVzZSBvbmx5IHdoZW4gTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQuCisgICAgdmlydHVhbCB2b2lkIGFkZF9yZWYoKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgKmRhdGEoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgc2l6ZV90IHJhbmdlX29mZnNldCgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHNpemVfdCByYW5nZV9sZW5ndGgoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0X3JhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpID0gMDsKKworICAgIHZpcnR1YWwgTWV0YURhdGFCYXNlJiBtZXRhX2RhdGEoKSA9IDA7CisKKyAgICAvLyBDbGVhcnMgbWV0YSBkYXRhIGFuZCByZXNldHMgdGhlIHJhbmdlIHRvIHRoZSBmdWxsIGV4dGVudC4KKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0T2JzZXJ2ZXIoTWVkaWFCdWZmZXJPYnNlcnZlciAqZ3JvdXApID0gMDsKKworICAgIHZpcnR1YWwgaW50IHJlZmNvdW50KCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCBpbnQgbG9jYWxSZWZjb3VudCgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGludCByZW1vdGVSZWZjb3VudCgpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgfk1lZGlhQnVmZmVyQmFzZSgpIHsKKyAgICAgICAgZGVsZXRlIG1XcmFwcGVyOworICAgICAgICBkZWxldGUgbUZvcm1hdDsKKyAgICB9OworCisgICAgQ01lZGlhQnVmZmVyICp3cmFwKCkgeworICAgICAgICBpZiAobVdyYXBwZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBtV3JhcHBlcjsKKyAgICAgICAgfQorICAgICAgICBtV3JhcHBlciA9IG5ldyBDTWVkaWFCdWZmZXI7CisgICAgICAgIG1XcmFwcGVyLT5oYW5kbGUgPSB0aGlzOworCisgICAgICAgIG1XcmFwcGVyLT5yZWxlYXNlID0gW10odm9pZCAqaGFuZGxlKSAtPiB2b2lkIHsKKyAgICAgICAgICAgICgoTWVkaWFCdWZmZXJCYXNlKiloYW5kbGUpLT5yZWxlYXNlKCk7CisgICAgICAgIH07CisKKyAgICAgICAgbVdyYXBwZXItPmRhdGEgPSBbXSh2b2lkICpoYW5kbGUpIC0+IHZvaWQgKiB7CisgICAgICAgICAgICByZXR1cm4gKChNZWRpYUJ1ZmZlckJhc2UqKWhhbmRsZSktPmRhdGEoKTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+c2l6ZSA9IFtdKHZvaWQgKmhhbmRsZSkgLT4gc2l6ZV90IHsKKyAgICAgICAgICAgIHJldHVybiAoKE1lZGlhQnVmZmVyQmFzZSopaGFuZGxlKS0+c2l6ZSgpOworICAgICAgICB9OworCisgICAgICAgIG1XcmFwcGVyLT5yYW5nZV9vZmZzZXQgPSBbXSh2b2lkICpoYW5kbGUpIC0+IHNpemVfdCB7CisgICAgICAgICAgICByZXR1cm4gKChNZWRpYUJ1ZmZlckJhc2UqKWhhbmRsZSktPnJhbmdlX29mZnNldCgpOworICAgICAgICB9OworCisgICAgICAgIG1XcmFwcGVyLT5yYW5nZV9sZW5ndGggPSBbXSh2b2lkICpoYW5kbGUpIC0+IHNpemVfdCB7CisgICAgICAgICAgICByZXR1cm4gKChNZWRpYUJ1ZmZlckJhc2UqKWhhbmRsZSktPnJhbmdlX2xlbmd0aCgpOworICAgICAgICB9OworCisgICAgICAgIG1XcmFwcGVyLT5zZXRfcmFuZ2UgPSBbXSh2b2lkICpoYW5kbGUsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpIC0+IHZvaWQgeworICAgICAgICAgICAgcmV0dXJuICgoTWVkaWFCdWZmZXJCYXNlKiloYW5kbGUpLT5zZXRfcmFuZ2Uob2Zmc2V0LCBsZW5ndGgpOworICAgICAgICB9OworCisgICAgICAgIG1XcmFwcGVyLT5tZXRhX2RhdGEgPSBbXSh2b2lkICpoYW5kbGUpIC0+IEFNZWRpYUZvcm1hdCogeworICAgICAgICAgICAgaWYgKCgoTWVkaWFCdWZmZXJCYXNlKiloYW5kbGUpLT5tRm9ybWF0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCk7CisgICAgICAgICAgICAgICAgKChNZWRpYUJ1ZmZlckJhc2UqKWhhbmRsZSktPm1Gb3JtYXQgPSBBTWVkaWFGb3JtYXRfZnJvbU1zZygmbXNnKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAoKE1lZGlhQnVmZmVyQmFzZSopaGFuZGxlKS0+bUZvcm1hdDsKKyAgICAgICAgfTsKKworICAgICAgICByZXR1cm4gbVdyYXBwZXI7CisgICAgfQorcHJvdGVjdGVkOgorICAgIE1lZGlhQnVmZmVyQmFzZSgpIHsKKyAgICAgICAgbVdyYXBwZXIgPSBudWxscHRyOworICAgICAgICBtRm9ybWF0ID0gbnVsbHB0cjsKKyAgICB9Citwcml2YXRlOgorICAgIENNZWRpYUJ1ZmZlciAqbVdyYXBwZXI7CisgICAgQU1lZGlhRm9ybWF0ICptRm9ybWF0OworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9CVUZGRVJfQkFTRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDA5YjNkOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uLy4uLy4uL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTYyMTE2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0JVRkZFUl9HUk9VUF9IXworCisjZGVmaW5lIE1FRElBX0JVRkZFUl9HUk9VUF9IXworCisjaW5jbHVkZSA8bGlzdD4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvclByaXYuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgTWVkaWFCdWZmZXJCYXNlOworCitjbGFzcyBNZWRpYUJ1ZmZlckdyb3VwIDogcHVibGljIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgeworcHVibGljOgorICAgIE1lZGlhQnVmZmVyR3JvdXAoc2l6ZV90IGdyb3d0aExpbWl0ID0gMCk7CisKKyAgICAvLyBjcmVhdGUgYSBtZWRpYSBidWZmZXIgZ3JvdXAgd2l0aCBwcmVhbGxvY2F0ZWQgYnVmZmVycworICAgIE1lZGlhQnVmZmVyR3JvdXAoc2l6ZV90IGJ1ZmZlcnMsIHNpemVfdCBidWZmZXJfc2l6ZSwgc2l6ZV90IGdyb3d0aExpbWl0ID0gMCk7CisKKyAgICB+TWVkaWFCdWZmZXJHcm91cCgpOworCisgICAgdm9pZCBhZGRfYnVmZmVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKTsKKworICAgIGJvb2wgaGFzX2J1ZmZlcnMoKTsKKworICAgIC8vIElmIG5vbkJsb2NraW5nIGlzIGZhbHNlLCBpdCBibG9ja3MgdW50aWwgYSBidWZmZXIgaXMgYXZhaWxhYmxlIGFuZAorICAgIC8vIHBhc3NlcyBpdCB0byB0aGUgY2FsbGVyIGluICpidWZmZXIsIHdoaWxlIHJldHVybmluZyBPSy4KKyAgICAvLyBUaGUgcmV0dXJuZWQgYnVmZmVyIHdpbGwgaGF2ZSBhIHJlZmVyZW5jZSBjb3VudCBvZiAxLgorICAgIC8vIElmIG5vbkJsb2NraW5nIGlzIHRydWUgYW5kIGEgYnVmZmVyIGlzIG5vdCBpbW1lZGlhdGVseSBhdmFpbGFibGUsCisgICAgLy8gYnVmZmVyIGlzIHNldCB0byBOVUxMIGFuZCBpdCByZXR1cm5zIFdPVUxEX0JMT0NLLgorICAgIC8vIElmIHJlcXVlc3RlZFNpemUgaXMgMCwgYW55IGZyZWUgTWVkaWFCdWZmZXIgd2lsbCBiZSByZXR1cm5lZC4KKyAgICAvLyBJZiByZXF1ZXN0ZWRTaXplIGlzID4gMCwgdGhlIHJldHVybmVkIE1lZGlhQnVmZmVyIHNob3VsZCBoYXZlIGJ1ZmZlcgorICAgIC8vIHNpemUgb2YgYXQgbGVhc3QgcmVxdXN0ZWRTaXplLgorICAgIHN0YXR1c190IGFjcXVpcmVfYnVmZmVyKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBib29sIG5vbkJsb2NraW5nID0gZmFsc2UsIHNpemVfdCByZXF1ZXN0ZWRTaXplID0gMCk7CisKKyAgICBzaXplX3QgYnVmZmVycygpIGNvbnN0OworCisgICAgLy8gSWYgYnVmZmVyIGlzIG51bGxwdHIsIGhhdmUgYWNxdWlyZV9idWZmZXIoKSBjaGVjayBmb3IgcmVtb3RlIHJlbGVhc2UuCisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKTsKKworICAgIENNZWRpYUJ1ZmZlckdyb3VwICp3cmFwKCkgeworICAgICAgICBpZiAobVdyYXBwZXIpIHsKKyAgICAgICAgICAgIHJldHVybiBtV3JhcHBlcjsKKyAgICAgICAgfQorCisgICAgICAgIG1XcmFwcGVyID0gbmV3IENNZWRpYUJ1ZmZlckdyb3VwOworICAgICAgICBtV3JhcHBlci0+aGFuZGxlID0gdGhpczsKKworICAgICAgICBtV3JhcHBlci0+YWRkX2J1ZmZlciA9IFtdKHZvaWQgKmhhbmRsZSwgc2l6ZV90IHNpemUpIC0+IHZvaWQgeworICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpidWYgPSBNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShzaXplKTsKKyAgICAgICAgICAgICgoTWVkaWFCdWZmZXJHcm91cCopaGFuZGxlKS0+YWRkX2J1ZmZlcihidWYpOworICAgICAgICB9OworCisgICAgICAgIG1XcmFwcGVyLT5pbml0ID0gW10odm9pZCAqaGFuZGxlLAorICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJzLCBzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCBncm93dGhMaW1pdCkgLT4gYm9vbCB7CisgICAgICAgICAgICAoKE1lZGlhQnVmZmVyR3JvdXAqKWhhbmRsZSktPmluaXQoYnVmZmVycywgYnVmZmVyX3NpemUsIGdyb3d0aExpbWl0KTsKKyAgICAgICAgICAvLyAgKChNZWRpYUJ1ZmZlckdyb3VwKiloYW5kbGUpLT5tV3JhcHBlci0+aW5pdCA9IG51bGxwdHI7IC8vIGVuZm9yY2UgY2FsbC1vbmNlCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+YWNxdWlyZV9idWZmZXIgPSBbXSh2b2lkICpoYW5kbGUsCisgICAgICAgICAgICAgICAgQ01lZGlhQnVmZmVyICoqYnVmLCBib29sIG5vbkJsb2NraW5nLCBzaXplX3QgcmVxdWVzdGVkU2l6ZSkgLT4gbWVkaWFfc3RhdHVzX3QgeworICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICphY3F1aXJlZEJ1ZiA9IG51bGxwdHI7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSAoKE1lZGlhQnVmZmVyR3JvdXAqKWhhbmRsZSktPmFjcXVpcmVfYnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAmYWNxdWlyZWRCdWYsIG5vbkJsb2NraW5nLCByZXF1ZXN0ZWRTaXplKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0sgJiYgYWNxdWlyZWRCdWYgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICpidWYgPSBhY3F1aXJlZEJ1Zi0+d3JhcCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqYnVmID0gbnVsbHB0cjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IoZXJyKTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+aGFzX2J1ZmZlcnMgPSBbXSh2b2lkICpoYW5kbGUpIC0+IGJvb2wgeworICAgICAgICAgICAgcmV0dXJuICgoTWVkaWFCdWZmZXJHcm91cCopaGFuZGxlKS0+aGFzX2J1ZmZlcnMoKTsKKyAgICAgICAgfTsKKworICAgICAgICByZXR1cm4gbVdyYXBwZXI7CisgICAgfQorCitwcml2YXRlOgorICAgIENNZWRpYUJ1ZmZlckdyb3VwICptV3JhcHBlcjsKKyAgICBzdHJ1Y3QgSW50ZXJuYWxEYXRhOworICAgIEludGVybmFsRGF0YSAqbUludGVybmFsOworCisgICAgTWVkaWFCdWZmZXJHcm91cChjb25zdCBNZWRpYUJ1ZmZlckdyb3VwICYpOworICAgIE1lZGlhQnVmZmVyR3JvdXAgJm9wZXJhdG9yPShjb25zdCBNZWRpYUJ1ZmZlckdyb3VwICYpOworICAgIHZvaWQgaW5pdChzaXplX3QgYnVmZmVycywgc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QgZ3Jvd3RoTGltaXQpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9CVUZGRVJfR1JPVVBfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmgKaW5kZXggN2Y2YWFlNi4uNmNkNDI2NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmgKQEAgLTMxMyw2ICszMTMsNyBAQAogICAgIHNwPEFMb29wZXI+IG1Db2RlY0xvb3BlcjsKICAgICBzcDxDb2RlY0Jhc2U+IG1Db2RlYzsKICAgICBBU3RyaW5nIG1Db21wb25lbnROYW1lOworICAgIEFTdHJpbmcgbU93bmVyTmFtZTsKICAgICBzcDxNZWRpYUNvZGVjSW5mbz4gbUNvZGVjSW5mbzsKICAgICBzcDxBUmVwbHlUb2tlbj4gbVJlcGx5SUQ7CiAgICAgdWludDMyX3QgbUZsYWdzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaAppbmRleCAzZWY0YzBlLi41MGQ3NzI0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaApAQCAtMzEsNiArMzEsMjEgQEAKIGNvbnN0ZXhwciBpbnQzMl90IEFWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lID0gMHgxMDAwMDsKIGNvbnN0ZXhwciBpbnQzMl90IEFWQ1Byb2ZpbGVDb25zdHJhaW5lZEhpZ2ggICAgID0gMHg4MDAwMDsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19BVkNQcm9maWxlKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVCYXNlbGluZTogICAgICAgICAgICByZXR1cm4gIkJhc2VsaW5lIjsKKyAgICAgICAgY2FzZSBBVkNQcm9maWxlTWFpbjogICAgICAgICAgICAgICAgcmV0dXJuICJNYWluIjsKKyAgICAgICAgY2FzZSBBVkNQcm9maWxlRXh0ZW5kZWQ6ICAgICAgICAgICAgcmV0dXJuICJFeHRlbmRlZCI7CisgICAgICAgIGNhc2UgQVZDUHJvZmlsZUhpZ2g6ICAgICAgICAgICAgICAgIHJldHVybiAiSGlnaCI7CisgICAgICAgIGNhc2UgQVZDUHJvZmlsZUhpZ2gxMDogICAgICAgICAgICAgIHJldHVybiAiSGlnaDEwIjsKKyAgICAgICAgY2FzZSBBVkNQcm9maWxlSGlnaDQyMjogICAgICAgICAgICAgcmV0dXJuICJIaWdoNDIyIjsKKyAgICAgICAgY2FzZSBBVkNQcm9maWxlSGlnaDQ0NDogICAgICAgICAgICAgcmV0dXJuICJIaWdoNDQ0IjsKKyAgICAgICAgY2FzZSBBVkNQcm9maWxlQ29uc3RyYWluZWRCYXNlbGluZTogcmV0dXJuICJDb25zdHJhaW5lZEJhc2VsaW5lIjsKKyAgICAgICAgY2FzZSBBVkNQcm9maWxlQ29uc3RyYWluZWRIaWdoOiAgICAgcmV0dXJuICJDb25zdHJhaW5lZEhpZ2giOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKwogY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWwxICAgICAgID0gMHgwMTsKIGNvbnN0ZXhwciBpbnQzMl90IEFWQ0xldmVsMWIgICAgICA9IDB4MDI7CiBjb25zdGV4cHIgaW50MzJfdCBBVkNMZXZlbDExICAgICAgPSAweDA0OwpAQCAtNDgsNiArNjMsMzUgQEAKIGNvbnN0ZXhwciBpbnQzMl90IEFWQ0xldmVsNSAgICAgICA9IDB4NDAwMDsKIGNvbnN0ZXhwciBpbnQzMl90IEFWQ0xldmVsNTEgICAgICA9IDB4ODAwMDsKIGNvbnN0ZXhwciBpbnQzMl90IEFWQ0xldmVsNTIgICAgICA9IDB4MTAwMDA7Citjb25zdGV4cHIgaW50MzJfdCBBVkNMZXZlbDYgICAgICAgPSAweDIwMDAwOworY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWw2MSAgICAgID0gMHg0MDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWQ0xldmVsNjIgICAgICA9IDB4ODAwMDA7CisKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfQVZDTGV2ZWwoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgQVZDTGV2ZWwxOiAgICAgcmV0dXJuICIxIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDFiOiAgICByZXR1cm4gIjFiIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDExOiAgICByZXR1cm4gIjEuMSI7CisgICAgICAgIGNhc2UgQVZDTGV2ZWwxMjogICAgcmV0dXJuICIxLjIiOworICAgICAgICBjYXNlIEFWQ0xldmVsMTM6ICAgIHJldHVybiAiMS4zIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDI6ICAgICByZXR1cm4gIjIiOworICAgICAgICBjYXNlIEFWQ0xldmVsMjE6ICAgIHJldHVybiAiMi4xIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDIyOiAgICByZXR1cm4gIjIuMiI7CisgICAgICAgIGNhc2UgQVZDTGV2ZWwzOiAgICAgcmV0dXJuICIzIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDMxOiAgICByZXR1cm4gIjMuMSI7CisgICAgICAgIGNhc2UgQVZDTGV2ZWwzMjogICAgcmV0dXJuICIzLjIiOworICAgICAgICBjYXNlIEFWQ0xldmVsNDogICAgIHJldHVybiAiNCI7CisgICAgICAgIGNhc2UgQVZDTGV2ZWw0MTogICAgcmV0dXJuICI0LjEiOworICAgICAgICBjYXNlIEFWQ0xldmVsNDI6ICAgIHJldHVybiAiNC4yIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDU6ICAgICByZXR1cm4gIjUiOworICAgICAgICBjYXNlIEFWQ0xldmVsNTE6ICAgIHJldHVybiAiNS4xIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDUyOiAgICByZXR1cm4gIjUuMiI7CisgICAgICAgIGNhc2UgQVZDTGV2ZWw2OiAgICAgcmV0dXJuICI2IjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDYxOiAgICByZXR1cm4gIjYuMSI7CisgICAgICAgIGNhc2UgQVZDTGV2ZWw2MjogICAgcmV0dXJuICI2LjIiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQogCiBjb25zdGV4cHIgaW50MzJfdCBIMjYzUHJvZmlsZUJhc2VsaW5lICAgICAgICAgICAgID0gMHgwMTsKIGNvbnN0ZXhwciBpbnQzMl90IEgyNjNQcm9maWxlSDMyMENvZGluZyAgICAgICAgICAgPSAweDAyOwpAQCAtNTksNiArMTAzLDIxIEBACiBjb25zdGV4cHIgaW50MzJfdCBIMjYzUHJvZmlsZUludGVybGFjZSAgICAgICAgICAgID0gMHg4MDsKIGNvbnN0ZXhwciBpbnQzMl90IEgyNjNQcm9maWxlSGlnaExhdGVuY3kgICAgICAgICAgPSAweDEwMDsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19IMjYzUHJvZmlsZShpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBIMjYzUHJvZmlsZUJhc2VsaW5lOiAgICAgICAgICAgcmV0dXJuICJCYXNlbGluZSI7CisgICAgICAgIGNhc2UgSDI2M1Byb2ZpbGVIMzIwQ29kaW5nOiAgICAgICAgIHJldHVybiAiSDMyMENvZGluZyI7CisgICAgICAgIGNhc2UgSDI2M1Byb2ZpbGVCYWNrd2FyZENvbXBhdGlibGU6IHJldHVybiAiQmFja3dhcmRDb21wYXRpYmxlIjsKKyAgICAgICAgY2FzZSBIMjYzUHJvZmlsZUlTV1YyOiAgICAgICAgICAgICAgcmV0dXJuICJJU1dWMiI7CisgICAgICAgIGNhc2UgSDI2M1Byb2ZpbGVJU1dWMzogICAgICAgICAgICAgIHJldHVybiAiSVNXVjMiOworICAgICAgICBjYXNlIEgyNjNQcm9maWxlSGlnaENvbXByZXNzaW9uOiAgICByZXR1cm4gIkhpZ2hDb21wcmVzc2lvbiI7CisgICAgICAgIGNhc2UgSDI2M1Byb2ZpbGVJbnRlcm5ldDogICAgICAgICAgIHJldHVybiAiSW50ZXJuZXQiOworICAgICAgICBjYXNlIEgyNjNQcm9maWxlSW50ZXJsYWNlOiAgICAgICAgICByZXR1cm4gIkludGVybGFjZSI7CisgICAgICAgIGNhc2UgSDI2M1Byb2ZpbGVIaWdoTGF0ZW5jeTogICAgICAgIHJldHVybiAiSGlnaExhdGVuY3kiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKwogY29uc3RleHByIGludDMyX3QgSDI2M0xldmVsMTAgICAgICA9IDB4MDE7CiBjb25zdGV4cHIgaW50MzJfdCBIMjYzTGV2ZWwyMCAgICAgID0gMHgwMjsKIGNvbnN0ZXhwciBpbnQzMl90IEgyNjNMZXZlbDMwICAgICAgPSAweDA0OwpAQCAtNjgsNiArMTI3LDIwIEBACiBjb25zdGV4cHIgaW50MzJfdCBIMjYzTGV2ZWw2MCAgICAgID0gMHg0MDsKIGNvbnN0ZXhwciBpbnQzMl90IEgyNjNMZXZlbDcwICAgICAgPSAweDgwOwogCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX0gyNjNMZXZlbChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBIMjYzTGV2ZWwxMDogICByZXR1cm4gIjEwIjsKKyAgICAgICAgY2FzZSBIMjYzTGV2ZWwyMDogICByZXR1cm4gIjIwIjsKKyAgICAgICAgY2FzZSBIMjYzTGV2ZWwzMDogICByZXR1cm4gIjMwIjsKKyAgICAgICAgY2FzZSBIMjYzTGV2ZWw0MDogICByZXR1cm4gIjQwIjsKKyAgICAgICAgY2FzZSBIMjYzTGV2ZWw0NTogICByZXR1cm4gIjQ1IjsKKyAgICAgICAgY2FzZSBIMjYzTGV2ZWw1MDogICByZXR1cm4gIjUwIjsKKyAgICAgICAgY2FzZSBIMjYzTGV2ZWw2MDogICByZXR1cm4gIjYwIjsKKyAgICAgICAgY2FzZSBIMjYzTGV2ZWw3MDogICByZXR1cm4gIjcwIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKwogY29uc3RleHByIGludDMyX3QgTVBFRzRQcm9maWxlU2ltcGxlICAgICAgICAgICAgICA9IDB4MDE7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHNFByb2ZpbGVTaW1wbGVTY2FsYWJsZSAgICAgID0gMHgwMjsKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUc0UHJvZmlsZUNvcmUgICAgICAgICAgICAgICAgPSAweDA0OwpAQCAtODUsNiArMTU4LDI4IEBACiBjb25zdGV4cHIgaW50MzJfdCBNUEVHNFByb2ZpbGVBZHZhbmNlZFNjYWxhYmxlICAgID0gMHg0MDAwOwogY29uc3RleHByIGludDMyX3QgTVBFRzRQcm9maWxlQWR2YW5jZWRTaW1wbGUgICAgICA9IDB4ODAwMDsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19NUEVHNFByb2ZpbGUoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgTVBFRzRQcm9maWxlU2ltcGxlOiAgICAgICAgICAgIHJldHVybiAiU2ltcGxlIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVTaW1wbGVTY2FsYWJsZTogICAgcmV0dXJuICJTaW1wbGVTY2FsYWJsZSI7CisgICAgICAgIGNhc2UgTVBFRzRQcm9maWxlQ29yZTogICAgICAgICAgICAgIHJldHVybiAiQ29yZSI7CisgICAgICAgIGNhc2UgTVBFRzRQcm9maWxlTWFpbjogICAgICAgICAgICAgIHJldHVybiAiTWFpbiI7CisgICAgICAgIGNhc2UgTVBFRzRQcm9maWxlTmJpdDogICAgICAgICAgICAgIHJldHVybiAiTmJpdCI7CisgICAgICAgIGNhc2UgTVBFRzRQcm9maWxlU2NhbGFibGVUZXh0dXJlOiAgIHJldHVybiAiU2NhbGFibGVUZXh0dXJlIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVTaW1wbGVGYWNlOiAgICAgICAgcmV0dXJuICJTaW1wbGVGYWNlIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVTaW1wbGVGQkE6ICAgICAgICAgcmV0dXJuICJTaW1wbGVGQkEiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZUJhc2ljQW5pbWF0ZWQ6ICAgICByZXR1cm4gIkJhc2ljQW5pbWF0ZWQiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZUh5YnJpZDogICAgICAgICAgICByZXR1cm4gIkh5YnJpZCI7CisgICAgICAgIGNhc2UgTVBFRzRQcm9maWxlQWR2YW5jZWRSZWFsVGltZTogIHJldHVybiAiQWR2YW5jZWRSZWFsVGltZSI7CisgICAgICAgIGNhc2UgTVBFRzRQcm9maWxlQ29yZVNjYWxhYmxlOiAgICAgIHJldHVybiAiQ29yZVNjYWxhYmxlIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVBZHZhbmNlZENvZGluZzogICAgcmV0dXJuICJBZHZhbmNlZENvZGluZyI7CisgICAgICAgIGNhc2UgTVBFRzRQcm9maWxlQWR2YW5jZWRDb3JlOiAgICAgIHJldHVybiAiQWR2YW5jZWRDb3JlIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVBZHZhbmNlZFNjYWxhYmxlOiAgcmV0dXJuICJBZHZhbmNlZFNjYWxhYmxlIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZTogICAgcmV0dXJuICJBZHZhbmNlZFNpbXBsZSI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBNUEVHNExldmVsMCAgICAgID0gMHgwMTsKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUc0TGV2ZWwwYiAgICAgPSAweDAyOwogY29uc3RleHByIGludDMyX3QgTVBFRzRMZXZlbDEgICAgICA9IDB4MDQ7CkBAIC05Niw2ICsxOTEsMjIgQEAKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUc0TGV2ZWw1ICAgICAgPSAweDgwOwogY29uc3RleHByIGludDMyX3QgTVBFRzRMZXZlbDYgICAgICA9IDB4MTAwOwogCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX01QRUc0TGV2ZWwoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgTVBFRzRMZXZlbDA6ICAgcmV0dXJuICIwIjsKKyAgICAgICAgY2FzZSBNUEVHNExldmVsMGI6ICByZXR1cm4gIjBiIjsKKyAgICAgICAgY2FzZSBNUEVHNExldmVsMTogICByZXR1cm4gIjEiOworICAgICAgICBjYXNlIE1QRUc0TGV2ZWwyOiAgIHJldHVybiAiMiI7CisgICAgICAgIGNhc2UgTVBFRzRMZXZlbDM6ICAgcmV0dXJuICIzIjsKKyAgICAgICAgY2FzZSBNUEVHNExldmVsM2I6ICByZXR1cm4gIjNiIjsKKyAgICAgICAgY2FzZSBNUEVHNExldmVsNDogICByZXR1cm4gIjQiOworICAgICAgICBjYXNlIE1QRUc0TGV2ZWw0YTogIHJldHVybiAiNGEiOworICAgICAgICBjYXNlIE1QRUc0TGV2ZWw1OiAgIHJldHVybiAiNSI7CisgICAgICAgIGNhc2UgTVBFRzRMZXZlbDY6ICAgcmV0dXJuICI2IjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKwogY29uc3RleHByIGludDMyX3QgTVBFRzJQcm9maWxlU2ltcGxlICAgICAgICAgICAgICA9IDB4MDA7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHMlByb2ZpbGVNYWluICAgICAgICAgICAgICAgID0gMHgwMTsKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUcyUHJvZmlsZTQyMiAgICAgICAgICAgICAgICAgPSAweDAyOwpAQCAtMTAzLDEyICsyMTQsMzUgQEAKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUcyUHJvZmlsZVNwYXRpYWwgICAgICAgICAgICAgPSAweDA0OwogY29uc3RleHByIGludDMyX3QgTVBFRzJQcm9maWxlSGlnaCAgICAgICAgICAgICAgICA9IDB4MDU7CiAKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfTVBFRzJQcm9maWxlKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIE1QRUcyUHJvZmlsZVNpbXBsZTogICAgcmV0dXJuICJTaW1wbGUiOworICAgICAgICBjYXNlIE1QRUcyUHJvZmlsZU1haW46ICAgICAgcmV0dXJuICJNYWluIjsKKyAgICAgICAgY2FzZSBNUEVHMlByb2ZpbGU0MjI6ICAgICAgIHJldHVybiAiNDIyIjsKKyAgICAgICAgY2FzZSBNUEVHMlByb2ZpbGVTTlI6ICAgICAgIHJldHVybiAiU05SIjsKKyAgICAgICAgY2FzZSBNUEVHMlByb2ZpbGVTcGF0aWFsOiAgIHJldHVybiAiU3BhdGlhbCI7CisgICAgICAgIGNhc2UgTVBFRzJQcm9maWxlSGlnaDogICAgICByZXR1cm4gIkhpZ2giOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUcyTGV2ZWxMTCAgICAgPSAweDAwOwogY29uc3RleHByIGludDMyX3QgTVBFRzJMZXZlbE1MICAgICA9IDB4MDE7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHMkxldmVsSDE0ICAgID0gMHgwMjsKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUcyTGV2ZWxITCAgICAgPSAweDAzOwogY29uc3RleHByIGludDMyX3QgTVBFRzJMZXZlbEhQICAgICA9IDB4MDQ7CiAKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfTVBFRzJMZXZlbChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBNUEVHMkxldmVsTEw6ICByZXR1cm4gIkxMIjsKKyAgICAgICAgY2FzZSBNUEVHMkxldmVsTUw6ICByZXR1cm4gIk1MIjsKKyAgICAgICAgY2FzZSBNUEVHMkxldmVsSDE0OiByZXR1cm4gIkgxNCI7CisgICAgICAgIGNhc2UgTVBFRzJMZXZlbEhMOiAgcmV0dXJuICJITCI7CisgICAgICAgIGNhc2UgTVBFRzJMZXZlbEhQOiAgcmV0dXJuICJIUCI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBpbnQzMl90IEFBQ09iamVjdE1haW4gICAgICAgPSAxOwogY29uc3RleHByIGludDMyX3QgQUFDT2JqZWN0TEMgICAgICAgICA9IDI7CiBjb25zdGV4cHIgaW50MzJfdCBBQUNPYmplY3RTU1IgICAgICAgID0gMzsKQEAgLTEyMiwxOSArMjU2LDcwIEBACiBjb25zdGV4cHIgaW50MzJfdCBBQUNPYmplY3RFTEQgICAgICAgID0gMzk7CiBjb25zdGV4cHIgaW50MzJfdCBBQUNPYmplY3RYSEUgICAgICAgID0gNDI7CiAKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfQUFDT2JqZWN0KGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEFBQ09iamVjdE1haW46ICAgICAgICAgcmV0dXJuICJNYWluIjsKKyAgICAgICAgY2FzZSBBQUNPYmplY3RMQzogICAgICAgICAgIHJldHVybiAiTEMiOworICAgICAgICBjYXNlIEFBQ09iamVjdFNTUjogICAgICAgICAgcmV0dXJuICJTU1IiOworICAgICAgICBjYXNlIEFBQ09iamVjdExUUDogICAgICAgICAgcmV0dXJuICJMVFAiOworICAgICAgICBjYXNlIEFBQ09iamVjdEhFOiAgICAgICAgICAgcmV0dXJuICJIRSI7CisgICAgICAgIGNhc2UgQUFDT2JqZWN0U2NhbGFibGU6ICAgICByZXR1cm4gIlNjYWxhYmxlIjsKKyAgICAgICAgY2FzZSBBQUNPYmplY3RFUkxDOiAgICAgICAgIHJldHVybiAiRVJMQyI7CisgICAgICAgIGNhc2UgQUFDT2JqZWN0RVJTY2FsYWJsZTogICByZXR1cm4gIkVSU2NhbGFibGUiOworICAgICAgICBjYXNlIEFBQ09iamVjdExEOiAgICAgICAgICAgcmV0dXJuICJMRCI7CisgICAgICAgIGNhc2UgQUFDT2JqZWN0SEVfUFM6ICAgICAgICByZXR1cm4gIkhFX1BTIjsKKyAgICAgICAgY2FzZSBBQUNPYmplY3RFTEQ6ICAgICAgICAgIHJldHVybiAiRUxEIjsKKyAgICAgICAgY2FzZSBBQUNPYmplY3RYSEU6ICAgICAgICAgIHJldHVybiAiWEhFIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBWUDhMZXZlbF9WZXJzaW9uMCA9IDB4MDE7CiBjb25zdGV4cHIgaW50MzJfdCBWUDhMZXZlbF9WZXJzaW9uMSA9IDB4MDI7CiBjb25zdGV4cHIgaW50MzJfdCBWUDhMZXZlbF9WZXJzaW9uMiA9IDB4MDQ7CiBjb25zdGV4cHIgaW50MzJfdCBWUDhMZXZlbF9WZXJzaW9uMyA9IDB4MDg7CiAKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfVlA4TGV2ZWwoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgVlA4TGV2ZWxfVmVyc2lvbjA6IHJldHVybiAiVjAiOworICAgICAgICBjYXNlIFZQOExldmVsX1ZlcnNpb24xOiByZXR1cm4gIlYxIjsKKyAgICAgICAgY2FzZSBWUDhMZXZlbF9WZXJzaW9uMjogcmV0dXJuICJWMiI7CisgICAgICAgIGNhc2UgVlA4TGV2ZWxfVmVyc2lvbjM6IHJldHVybiAiVjMiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKwogY29uc3RleHByIGludDMyX3QgVlA4UHJvZmlsZU1haW4gPSAweDAxOwogCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX1ZQOFByb2ZpbGUoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgVlA4UHJvZmlsZU1haW46ICAgIHJldHVybiAiTWFpbiI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBWUDlQcm9maWxlMCA9IDB4MDE7CiBjb25zdGV4cHIgaW50MzJfdCBWUDlQcm9maWxlMSA9IDB4MDI7CiBjb25zdGV4cHIgaW50MzJfdCBWUDlQcm9maWxlMiA9IDB4MDQ7CiBjb25zdGV4cHIgaW50MzJfdCBWUDlQcm9maWxlMyA9IDB4MDg7CiBjb25zdGV4cHIgaW50MzJfdCBWUDlQcm9maWxlMkhEUiA9IDB4MTAwMDsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUzSERSID0gMHgyMDAwOworY29uc3RleHByIGludDMyX3QgVlA5UHJvZmlsZTJIRFIxMFBsdXMgPSAweDQwMDA7Citjb25zdGV4cHIgaW50MzJfdCBWUDlQcm9maWxlM0hEUjEwUGx1cyA9IDB4ODAwMDsKKworaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19WUDlQcm9maWxlKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIFZQOVByb2ZpbGUwOiAgICAgICAgICAgcmV0dXJuICIwIjsKKyAgICAgICAgY2FzZSBWUDlQcm9maWxlMTogICAgICAgICAgIHJldHVybiAiMSI7CisgICAgICAgIGNhc2UgVlA5UHJvZmlsZTI6ICAgICAgICAgICByZXR1cm4gIjIiOworICAgICAgICBjYXNlIFZQOVByb2ZpbGUzOiAgICAgICAgICAgcmV0dXJuICIzIjsKKyAgICAgICAgY2FzZSBWUDlQcm9maWxlMkhEUjogICAgICAgIHJldHVybiAiMkhEUiI7CisgICAgICAgIGNhc2UgVlA5UHJvZmlsZTNIRFI6ICAgICAgICByZXR1cm4gIjNIRFIiOworICAgICAgICBjYXNlIFZQOVByb2ZpbGUySERSMTBQbHVzOiAgcmV0dXJuICIySERSUGx1cyI7CisgICAgICAgIGNhc2UgVlA5UHJvZmlsZTNIRFIxMFBsdXM6ICByZXR1cm4gIjNIRFJQbHVzIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQogCiBjb25zdGV4cHIgaW50MzJfdCBWUDlMZXZlbDEgID0gMHgxOwogY29uc3RleHByIGludDMyX3QgVlA5TGV2ZWwxMSA9IDB4MjsKQEAgLTE1MSwxMCArMzM2LDExMiBAQAogY29uc3RleHByIGludDMyX3QgVlA5TGV2ZWw2MSA9IDB4MTAwMDsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOUxldmVsNjIgPSAweDIwMDA7CiAKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfVlA5TGV2ZWwoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgVlA5TGV2ZWwxOiAgICAgcmV0dXJuICIxIjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDExOiAgICByZXR1cm4gIjEuMSI7CisgICAgICAgIGNhc2UgVlA5TGV2ZWwyOiAgICAgcmV0dXJuICIyIjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDIxOiAgICByZXR1cm4gIjIuMSI7CisgICAgICAgIGNhc2UgVlA5TGV2ZWwzOiAgICAgcmV0dXJuICIzIjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDMxOiAgICByZXR1cm4gIjMuMSI7CisgICAgICAgIGNhc2UgVlA5TGV2ZWw0OiAgICAgcmV0dXJuICI0IjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDQxOiAgICByZXR1cm4gIjQuMSI7CisgICAgICAgIGNhc2UgVlA5TGV2ZWw1OiAgICAgcmV0dXJuICI1IjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDUxOiAgICByZXR1cm4gIjUuMSI7CisgICAgICAgIGNhc2UgVlA5TGV2ZWw1MjogICAgcmV0dXJuICI1LjIiOworICAgICAgICBjYXNlIFZQOUxldmVsNjogICAgIHJldHVybiAiNiI7CisgICAgICAgIGNhc2UgVlA5TGV2ZWw2MTogICAgcmV0dXJuICI2LjEiOworICAgICAgICBjYXNlIFZQOUxldmVsNjI6ICAgIHJldHVybiAiNi4yIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKworY29uc3RleHByIGludDMyX3QgQVYxUHJvZmlsZU1haW44ID0gMHgxOworY29uc3RleHByIGludDMyX3QgQVYxUHJvZmlsZU1haW4xMCA9IDB4MjsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMVByb2ZpbGVNYWluMTBIRFIxMCA9IDB4MTAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMVByb2ZpbGVNYWluMTBIRFIxMFBsdXMgPSAweDIwMDA7CisKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfQVYxUHJvZmlsZShpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBBVjFQcm9maWxlTWFpbjg6ICAgICAgICAgICByZXR1cm4gIk1haW44IjsKKyAgICAgICAgY2FzZSBBVjFQcm9maWxlTWFpbjEwOiAgICAgICAgICByZXR1cm4gIk1haW4xMEhEUiI7CisgICAgICAgIGNhc2UgQVYxUHJvZmlsZU1haW4xMEhEUjEwOiAgICAgcmV0dXJuICJNYWluMTBIRFIxMCI7CisgICAgICAgIGNhc2UgQVYxUHJvZmlsZU1haW4xMEhEUjEwUGx1czogcmV0dXJuICJNYWluMTBIRFJQbHVzIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWwyICA9IDB4MTsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsMjEgPSAweDI7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDIyID0gMHg0OworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWwyMyA9IDB4ODsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsMyAgPSAweDEwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWwzMSA9IDB4MjA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDMyID0gMHg0MDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsMzMgPSAweDgwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw0ICA9IDB4MTAwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw0MSA9IDB4MjAwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw0MiA9IDB4NDAwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw0MyA9IDB4ODAwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw1ICA9IDB4MTAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNTEgPSAweDIwMDA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDUyID0gMHg0MDAwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw1MyA9IDB4ODAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNiAgPSAweDEwMDAwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw2MSA9IDB4MjAwMDA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDYyID0gMHg0MDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNjMgPSAweDgwMDAwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw3ICA9IDB4MTAwMDAwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw3MSA9IDB4MjAwMDAwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw3MiA9IDB4NDAwMDAwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw3MyA9IDB4ODAwMDAwOworCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX0FWMUxldmVsKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEFWMUxldmVsMjogICAgIHJldHVybiAiMiI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWwyMTogICAgcmV0dXJuICIyLjEiOworICAgICAgICBjYXNlIEFWMUxldmVsMjI6ICAgIHJldHVybiAiMi4yIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDIzOiAgICByZXR1cm4gIjIuMyI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWwzOiAgICAgcmV0dXJuICIzIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDMxOiAgICByZXR1cm4gIjMuMSI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWwzMjogICAgcmV0dXJuICIzLjIiOworICAgICAgICBjYXNlIEFWMUxldmVsMzM6ICAgIHJldHVybiAiMy4zIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDQ6ICAgICByZXR1cm4gIjQiOworICAgICAgICBjYXNlIEFWMUxldmVsNDE6ICAgIHJldHVybiAiNC4xIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDQyOiAgICByZXR1cm4gIjQuMiI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw0MzogICAgcmV0dXJuICI0LjMiOworICAgICAgICBjYXNlIEFWMUxldmVsNTogICAgIHJldHVybiAiNSI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw1MTogICAgcmV0dXJuICI1LjEiOworICAgICAgICBjYXNlIEFWMUxldmVsNTI6ICAgIHJldHVybiAiNS4yIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDUzOiAgICByZXR1cm4gIjUuMyI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw2OiAgICAgcmV0dXJuICI2IjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDYxOiAgICByZXR1cm4gIjYuMSI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw2MjogICAgcmV0dXJuICI2LjIiOworICAgICAgICBjYXNlIEFWMUxldmVsNjM6ICAgIHJldHVybiAiNi4zIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDc6ICAgICByZXR1cm4gIjciOworICAgICAgICBjYXNlIEFWMUxldmVsNzE6ICAgIHJldHVybiAiNy4xIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDcyOiAgICByZXR1cm4gIjcuMiI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw3MzogICAgcmV0dXJuICI3LjMiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBIRVZDUHJvZmlsZU1haW4gICAgICAgID0gMHgwMTsKIGNvbnN0ZXhwciBpbnQzMl90IEhFVkNQcm9maWxlTWFpbjEwICAgICAgPSAweDAyOwogY29uc3RleHByIGludDMyX3QgSEVWQ1Byb2ZpbGVNYWluU3RpbGwgICA9IDB4MDQ7CiBjb25zdGV4cHIgaW50MzJfdCBIRVZDUHJvZmlsZU1haW4xMEhEUjEwID0gMHgxMDAwOworY29uc3RleHByIGludDMyX3QgSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMFBsdXMgPSAweDIwMDA7CisKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfSEVWQ1Byb2ZpbGUoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgSEVWQ1Byb2ZpbGVNYWluOiAgICAgICAgICAgICAgIHJldHVybiAiTWFpbiI7CisgICAgICAgIGNhc2UgSEVWQ1Byb2ZpbGVNYWluMTA6ICAgICAgICAgICAgIHJldHVybiAiTWFpbjEwIjsKKyAgICAgICAgY2FzZSBIRVZDUHJvZmlsZU1haW5TdGlsbDogICAgICAgICAgcmV0dXJuICJNYWluU3RpbGwiOworICAgICAgICBjYXNlIEhFVkNQcm9maWxlTWFpbjEwSERSMTA6ICAgICAgICByZXR1cm4gIk1haW4xMEhEUjEwIjsKKyAgICAgICAgY2FzZSBIRVZDUHJvZmlsZU1haW4xMEhEUjEwUGx1czogICAgcmV0dXJuICJNYWluMTBIRFIxMFBsdXMiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KIAogY29uc3RleHByIGludDMyX3QgSEVWQ01haW5UaWVyTGV2ZWwxICA9IDB4MTsKIGNvbnN0ZXhwciBpbnQzMl90IEhFVkNIaWdoVGllckxldmVsMSAgPSAweDI7CkBAIC0xODMsNiArNDcwLDM4IEBACiBjb25zdGV4cHIgaW50MzJfdCBIRVZDTWFpblRpZXJMZXZlbDYyID0gMHgxMDAwMDAwOwogY29uc3RleHByIGludDMyX3QgSEVWQ0hpZ2hUaWVyTGV2ZWw2MiA9IDB4MjAwMDAwMDsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19IRVZDVGllckxldmVsKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEhFVkNNYWluVGllckxldmVsMTogICAgcmV0dXJuICJNYWluIDEiOworICAgICAgICBjYXNlIEhFVkNIaWdoVGllckxldmVsMTogICAgcmV0dXJuICJIaWdoIDEiOworICAgICAgICBjYXNlIEhFVkNNYWluVGllckxldmVsMjogICAgcmV0dXJuICJNYWluIDIiOworICAgICAgICBjYXNlIEhFVkNIaWdoVGllckxldmVsMjogICAgcmV0dXJuICJIaWdoIDIiOworICAgICAgICBjYXNlIEhFVkNNYWluVGllckxldmVsMjE6ICAgcmV0dXJuICJNYWluIDIuMSI7CisgICAgICAgIGNhc2UgSEVWQ0hpZ2hUaWVyTGV2ZWwyMTogICByZXR1cm4gIkhpZ2ggMi4xIjsKKyAgICAgICAgY2FzZSBIRVZDTWFpblRpZXJMZXZlbDM6ICAgIHJldHVybiAiTWFpbiAzIjsKKyAgICAgICAgY2FzZSBIRVZDSGlnaFRpZXJMZXZlbDM6ICAgIHJldHVybiAiSGlnaCAzIjsKKyAgICAgICAgY2FzZSBIRVZDTWFpblRpZXJMZXZlbDMxOiAgIHJldHVybiAiTWFpbiAzLjEiOworICAgICAgICBjYXNlIEhFVkNIaWdoVGllckxldmVsMzE6ICAgcmV0dXJuICJIaWdoIDMuMSI7CisgICAgICAgIGNhc2UgSEVWQ01haW5UaWVyTGV2ZWw0OiAgICByZXR1cm4gIk1haW4gNCI7CisgICAgICAgIGNhc2UgSEVWQ0hpZ2hUaWVyTGV2ZWw0OiAgICByZXR1cm4gIkhpZ2ggNCI7CisgICAgICAgIGNhc2UgSEVWQ01haW5UaWVyTGV2ZWw0MTogICByZXR1cm4gIk1haW4gNC4xIjsKKyAgICAgICAgY2FzZSBIRVZDSGlnaFRpZXJMZXZlbDQxOiAgIHJldHVybiAiSGlnaCA0LjEiOworICAgICAgICBjYXNlIEhFVkNNYWluVGllckxldmVsNTogICAgcmV0dXJuICJNYWluIDUiOworICAgICAgICBjYXNlIEhFVkNIaWdoVGllckxldmVsNTogICAgcmV0dXJuICJIaWdoIDUiOworICAgICAgICBjYXNlIEhFVkNNYWluVGllckxldmVsNTE6ICAgcmV0dXJuICJNYWluIDUuMSI7CisgICAgICAgIGNhc2UgSEVWQ0hpZ2hUaWVyTGV2ZWw1MTogICByZXR1cm4gIkhpZ2ggNS4xIjsKKyAgICAgICAgY2FzZSBIRVZDTWFpblRpZXJMZXZlbDUyOiAgIHJldHVybiAiTWFpbiA1LjIiOworICAgICAgICBjYXNlIEhFVkNIaWdoVGllckxldmVsNTI6ICAgcmV0dXJuICJIaWdoIDUuMiI7CisgICAgICAgIGNhc2UgSEVWQ01haW5UaWVyTGV2ZWw2OiAgICByZXR1cm4gIk1haW4gNiI7CisgICAgICAgIGNhc2UgSEVWQ0hpZ2hUaWVyTGV2ZWw2OiAgICByZXR1cm4gIkhpZ2ggNiI7CisgICAgICAgIGNhc2UgSEVWQ01haW5UaWVyTGV2ZWw2MTogICByZXR1cm4gIk1haW4gNi4xIjsKKyAgICAgICAgY2FzZSBIRVZDSGlnaFRpZXJMZXZlbDYxOiAgIHJldHVybiAiSGlnaCA2LjEiOworICAgICAgICBjYXNlIEhFVkNNYWluVGllckxldmVsNjI6ICAgcmV0dXJuICJNYWluIDYuMiI7CisgICAgICAgIGNhc2UgSEVWQ0hpZ2hUaWVyTGV2ZWw2MjogICByZXR1cm4gIkhpZ2ggNi4yIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvblByb2ZpbGVEdmF2UGVyID0gMHgxOwogY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25Qcm9maWxlRHZhdlBlbiA9IDB4MjsKIGNvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEZXIgPSAweDQ7CkBAIC0xOTQsNiArNTEzLDIyIEBACiBjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvblByb2ZpbGVEdmhlU3QgPSAweDEwMDsKIGNvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZTZSA9IDB4MjAwOwogCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX0RvbGJ5VmlzaW9uUHJvZmlsZShpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmF2UGVyOiByZXR1cm4gIkR2YXZQZXIiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZQZW46IHJldHVybiAiRHZhdlBlbiI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25Qcm9maWxlRHZoZURlcjogcmV0dXJuICJEdmhlRGVyIjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmhlRGVuOiByZXR1cm4gIkR2aGVEZW4iOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEdHI6IHJldHVybiAiRHZoZUR0ciI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0bjogcmV0dXJuICJEdmhlU3RuIjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmhlRHRoOiByZXR1cm4gIkR2aGVEdGgiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEdGI6IHJldHVybiAiRHZoZUR0YiI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25Qcm9maWxlRHZoZVN0OiAgcmV0dXJuICJEdmhlU3QiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZTZTogIHJldHVybiAiRHZhdlNlIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKwogY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25MZXZlbEhkMjQgICAgPSAweDE7CiBjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvbkxldmVsSGQzMCAgICA9IDB4MjsKIGNvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uTGV2ZWxGaGQyNCAgID0gMHg0OwpAQCAtMjA0LDEwICs1MzksMzQgQEAKIGNvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uTGV2ZWxVaGQ0OCAgID0gMHg4MDsKIGNvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uTGV2ZWxVaGQ2MCAgID0gMHgxMDA7CiAKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfRG9sYnlWaXNpb25MZXZlbChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvbkxldmVsSGQyNDogIHJldHVybiAiSGQyNCI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25MZXZlbEhkMzA6ICByZXR1cm4gIkhkMzAiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uTGV2ZWxGaGQyNDogcmV0dXJuICJGaGQyNCI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25MZXZlbEZoZDMwOiByZXR1cm4gIkZoZDMwIjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvbkxldmVsRmhkNjA6IHJldHVybiAiRmhkNjAiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uTGV2ZWxVaGQyNDogcmV0dXJuICJVaGQyNCI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25MZXZlbFVoZDMwOiByZXR1cm4gIlVoZDMwIjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvbkxldmVsVWhkNDg6IHJldHVybiAiVWhkNDgiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uTGV2ZWxVaGQ2MDogcmV0dXJuICJVaGQ2MCI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKwogY29uc3RleHByIGludDMyX3QgQklUUkFURV9NT0RFX0NCUiA9IDI7CiBjb25zdGV4cHIgaW50MzJfdCBCSVRSQVRFX01PREVfQ1EgPSAwOwogY29uc3RleHByIGludDMyX3QgQklUUkFURV9NT0RFX1ZCUiA9IDE7CiAKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfQml0cmF0ZU1vZGUoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgQklUUkFURV9NT0RFX0NCUjogIHJldHVybiAiQ0JSIjsKKyAgICAgICAgY2FzZSBCSVRSQVRFX01PREVfQ1E6ICAgcmV0dXJuICJDUSI7CisgICAgICAgIGNhc2UgQklUUkFURV9NT0RFX1ZCUjogIHJldHVybiAiVkJSIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdDEyYml0UkdCNDQ0ICAgICAgICAgICAgID0gMzsKIGNvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdDE2Yml0QVJHQjE1NTUgICAgICAgICAgID0gNTsKIGNvbnN0ZXhwciBpbnQzMl90IENPTE9SX0Zvcm1hdDE2Yml0QVJHQjQ0NDQgICAgICAgICAgID0gNDsKQEAgLTI2MSw2ICs2MjAsNjQgQEAKIGNvbnN0ZXhwciBpbnQzMl90IENPTE9SX1FDT01fRm9ybWF0WVVWNDIwU2VtaVBsYW5hciAgID0gMHg3ZmEzMGMwMDsKIGNvbnN0ZXhwciBpbnQzMl90IENPTE9SX1RJX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIgPSAweDdmMDAwMTAwOwogCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX0NvbG9yRm9ybWF0KGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDEyYml0UkdCNDQ0OiAgICAgICAgICAgICAgIHJldHVybiAiMTJiaXRSR0I0NDQiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDE2Yml0QVJHQjE1NTU6ICAgICAgICAgICAgIHJldHVybiAiMTZiaXRBUkdCMTU1NSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MTZiaXRBUkdCNDQ0NDogICAgICAgICAgICAgcmV0dXJuICIxNmJpdEFSR0I0NDQ0IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQxNmJpdEJHUjU2NTogICAgICAgICAgICAgICByZXR1cm4gIjE2Yml0QkdSNTY1IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NTogICAgICAgICAgICAgICByZXR1cm4gIjE2Yml0UkdCNTY1IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQxOGJpdEFSR0IxNjY1OiAgICAgICAgICAgICByZXR1cm4gIjE4Yml0QVJHQjE2NjUiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDE4Qml0QkdSNjY2OiAgICAgICAgICAgICAgIHJldHVybiAiMThCaXRCR1I2NjYiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDE4Yml0UkdCNjY2OiAgICAgICAgICAgICAgIHJldHVybiAiMThiaXRSR0I2NjYiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDE5Yml0QVJHQjE2NjY6ICAgICAgICAgICAgIHJldHVybiAiMTliaXRBUkdCMTY2NiI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MjRCaXRBQkdSNjY2NjogICAgICAgICAgICAgcmV0dXJuICIyNEJpdEFCR1I2NjY2IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQyNGJpdEFSR0IxODg3OiAgICAgICAgICAgICByZXR1cm4gIjI0Yml0QVJHQjE4ODciOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDI0Qml0QVJHQjY2NjY6ICAgICAgICAgICAgIHJldHVybiAiMjRCaXRBUkdCNjY2NiI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MjRiaXRCR1I4ODg6ICAgICAgICAgICAgICAgcmV0dXJuICIyNGJpdEJHUjg4OCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MjRiaXRSR0I4ODg6ICAgICAgICAgICAgICAgcmV0dXJuICIyNGJpdFJHQjg4OCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MjViaXRBUkdCMTg4ODogICAgICAgICAgICAgcmV0dXJuICIyNWJpdEFSR0IxODg4IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQzMmJpdEFCR1I4ODg4OiAgICAgICAgICAgICByZXR1cm4gIjMyYml0QUJHUjg4ODgiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDMyYml0QVJHQjg4ODg6ICAgICAgICAgICAgIHJldHVybiAiMzJiaXRBUkdCODg4OCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4ODogICAgICAgICAgICAgcmV0dXJuICIzMmJpdEJHUkE4ODg4IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQ4Yml0UkdCMzMyOiAgICAgICAgICAgICAgICByZXR1cm4gIjhiaXRSR0IzMzIiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdENiWUNyWTogICAgICAgICAgICAgICAgICAgIHJldHVybiAiQ2JZQ3JZIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRDcllDYlk6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkNyWUNiWSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0TDE2OiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJMMTYiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdEwyOiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTDIiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdEwyNDogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTDI0IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRMMzI6ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkwzMiI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0TDQ6ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJMNCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0TDg6ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJMOCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0TW9ub2Nocm9tZTogICAgICAgICAgICAgICAgcmV0dXJuICJNb25vY2hyb21lIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRSYXdCYXllcjEwYml0OiAgICAgICAgICAgICByZXR1cm4gIlJhd0JheWVyMTBiaXQiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFJhd0JheWVyOGJpdDogICAgICAgICAgICAgIHJldHVybiAiUmF3QmF5ZXI4Yml0IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRSYXdCYXllcjhiaXRjb21wcmVzc2VkOiAgICByZXR1cm4gIlJhd0JheWVyOGJpdGNvbXByZXNzZWQiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFJHQkFGbGV4aWJsZTogICAgICAgICAgICAgIHJldHVybiAiUkdCQUZsZXhpYmxlIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRSR0JGbGV4aWJsZTogICAgICAgICAgICAgICByZXR1cm4gIlJHQkZsZXhpYmxlIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRTdXJmYWNlOiAgICAgICAgICAgICAgICAgICByZXR1cm4gIlN1cmZhY2UiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlDYllDcjogICAgICAgICAgICAgICAgICAgIHJldHVybiAiWUNiWUNyIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZQ3JZQ2I6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIllDcllDYiI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDExUGFja2VkUGxhbmFyOiAgICAgICAgcmV0dXJuICJZVVY0MTFQYWNrZWRQbGFuYXIiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQxMVBsYW5hcjogICAgICAgICAgICAgIHJldHVybiAiWVVWNDExUGxhbmFyIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTogICAgICAgICAgICByZXR1cm4gIllVVjQyMEZsZXhpYmxlIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRQbGFuYXI6ICAgICAgICByZXR1cm4gIllVVjQyMFBhY2tlZFBsYW5hciI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjogICAgcmV0dXJuICJZVVY0MjBQYWNrZWRTZW1pUGxhbmFyIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6ICAgICAgICAgICAgICByZXR1cm4gIllVVjQyMFBsYW5hciI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjogICAgICAgICAgcmV0dXJuICJZVVY0MjBTZW1pUGxhbmFyIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjJGbGV4aWJsZTogICAgICAgICAgICByZXR1cm4gIllVVjQyMkZsZXhpYmxlIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjJQYWNrZWRQbGFuYXI6ICAgICAgICByZXR1cm4gIllVVjQyMlBhY2tlZFBsYW5hciI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIyUGFja2VkU2VtaVBsYW5hcjogICAgcmV0dXJuICJZVVY0MjJQYWNrZWRTZW1pUGxhbmFyIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjJQbGFuYXI6ICAgICAgICAgICAgICByZXR1cm4gIllVVjQyMlBsYW5hciI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIyU2VtaVBsYW5hcjogICAgICAgICAgcmV0dXJuICJZVVY0MjJTZW1pUGxhbmFyIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0NDRGbGV4aWJsZTogICAgICAgICAgICByZXR1cm4gIllVVjQ0NEZsZXhpYmxlIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0NDRJbnRlcmxlYXZlZDogICAgICAgICByZXR1cm4gIllVVjQ0NEludGVybGVhdmVkIjsKKyAgICAgICAgY2FzZSBDT0xPUl9RQ09NX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6ICAgICByZXR1cm4gIlFDT01fWVVWNDIwU2VtaVBsYW5hciI7CisgICAgICAgIGNhc2UgQ09MT1JfVElfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjogcmV0dXJuICJUSV9ZVVY0MjBQYWNrZWRTZW1pUGxhbmFyIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKwogY29uc3RleHByIGNoYXIgRkVBVFVSRV9BZGFwdGl2ZVBsYXliYWNrW10gICAgICAgPSAiYWRhcHRpdmUtcGxheWJhY2siOwogY29uc3RleHByIGNoYXIgRkVBVFVSRV9JbnRyYVJlZnJlc2hbXSA9ICJpbnRyYS1yZWZyZXNoIjsKIGNvbnN0ZXhwciBjaGFyIEZFQVRVUkVfUGFydGlhbEZyYW1lW10gPSAicGFydGlhbC1mcmFtZSI7CkBAIC0yNzAsNiArNjg3LDcgQEAKIC8vIGZyb20gTWVkaWFGb3JtYXQuamF2YQogY29uc3RleHByIGNoYXIgTUlNRVRZUEVfVklERU9fVlA4W10gPSAidmlkZW8veC12bmQub24yLnZwOCI7CiBjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9WSURFT19WUDlbXSA9ICJ2aWRlby94LXZuZC5vbjIudnA5IjsKK2NvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX1ZJREVPX0FWMVtdID0gInZpZGVvL2F2MDEiOwogY29uc3RleHByIGNoYXIgTUlNRVRZUEVfVklERU9fQVZDW10gPSAidmlkZW8vYXZjIjsKIGNvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX1ZJREVPX0hFVkNbXSA9ICJ2aWRlby9oZXZjIjsKIGNvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX1ZJREVPX01QRUc0W10gPSAidmlkZW8vbXA0di1lcyI7CkBAIC0zMjcsNiArNzQ1LDcgQEAKIGNvbnN0ZXhwciBjaGFyIEtFWV9CSVRSQVRFX01PREVbXSA9ICJiaXRyYXRlLW1vZGUiOwogY29uc3RleHByIGNoYXIgS0VZX0NBX1NFU1NJT05fSURbXSA9ICJjYS1zZXNzaW9uLWlkIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9DQV9TWVNURU1fSURbXSA9ICJjYS1zeXN0ZW0taWQiOworY29uc3RleHByIGNoYXIgS0VZX0NBX1BSSVZBVEVfREFUQVtdID0gImNhLXByaXZhdGUtZGF0YSI7CiBjb25zdGV4cHIgY2hhciBLRVlfQ0FQVFVSRV9SQVRFW10gPSAiY2FwdHVyZS1yYXRlIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9DSEFOTkVMX0NPVU5UW10gPSAiY2hhbm5lbC1jb3VudCI7CiBjb25zdGV4cHIgY2hhciBLRVlfQ0hBTk5FTF9NQVNLW10gPSAiY2hhbm5lbC1tYXNrIjsKQEAgLTMzNSw2ICs3NTQsNyBAQAogY29uc3RleHByIGNoYXIgS0VZX0NPTE9SX1NUQU5EQVJEW10gPSAiY29sb3Itc3RhbmRhcmQiOwogY29uc3RleHByIGNoYXIgS0VZX0NPTE9SX1RSQU5TRkVSW10gPSAiY29sb3ItdHJhbnNmZXIiOwogY29uc3RleHByIGNoYXIgS0VZX0NPTVBMRVhJVFlbXSA9ICJjb21wbGV4aXR5IjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9DUkVBVEVfSU5QVVRfU1VSRkFDRV9TVVNQRU5ERURbXSA9ICJjcmVhdGUtaW5wdXQtYnVmZmVycy1zdXNwZW5kZWQiOwogY29uc3RleHByIGNoYXIgS0VZX0RVUkFUSU9OW10gPSAiZHVyYXRpb25VcyI7CiBjb25zdGV4cHIgY2hhciBLRVlfRkVBVFVSRV9bXSA9ICJmZWF0dXJlLSI7CiBjb25zdGV4cHIgY2hhciBLRVlfRkxBQ19DT01QUkVTU0lPTl9MRVZFTFtdID0gImZsYWMtY29tcHJlc3Npb24tbGV2ZWwiOwpAQCAtMzQyLDYgKzc2Miw3IEBACiBjb25zdGV4cHIgY2hhciBLRVlfR1JJRF9DT0xVTU5TW10gPSAiZ3JpZC1jb2xzIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9HUklEX1JPV1NbXSA9ICJncmlkLXJvd3MiOwogY29uc3RleHByIGNoYXIgS0VZX0hEUl9TVEFUSUNfSU5GT1tdID0gImhkci1zdGF0aWMtaW5mbyI7Citjb25zdGV4cHIgY2hhciBLRVlfSERSMTBfUExVU19JTkZPW10gPSAiaGRyMTAtcGx1cy1pbmZvIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9IRUlHSFRbXSA9ICJoZWlnaHQiOwogY29uc3RleHByIGNoYXIgS0VZX0lfRlJBTUVfSU5URVJWQUxbXSA9ICJpLWZyYW1lLWludGVydmFsIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9JTlRSQV9SRUZSRVNIX1BFUklPRFtdID0gImludHJhLXJlZnJlc2gtcGVyaW9kIjsKQEAgLTM1MywxNCArNzc0LDE4IEBACiBjb25zdGV4cHIgY2hhciBLRVlfTEFOR1VBR0VbXSA9ICJsYW5ndWFnZSI7CiBjb25zdGV4cHIgY2hhciBLRVlfTEFURU5DWVtdID0gImxhdGVuY3kiOwogY29uc3RleHByIGNoYXIgS0VZX0xFVkVMW10gPSAibGV2ZWwiOworY29uc3RleHByIGNoYXIgS0VZX01BWF9CX0ZSQU1FU1tdID0gIm1heC1iZnJhbWVzIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9NQVhfQklUX1JBVEVbXSA9ICJtYXgtYml0cmF0ZSI7Citjb25zdGV4cHIgY2hhciBLRVlfTUFYX0ZQU19UT19FTkNPREVSW10gPSAibWF4LWZwcy10by1lbmNvZGVyIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9NQVhfSEVJR0hUW10gPSAibWF4LWhlaWdodCI7CiBjb25zdGV4cHIgY2hhciBLRVlfTUFYX0lOUFVUX1NJWkVbXSA9ICJtYXgtaW5wdXQtc2l6ZSI7Citjb25zdGV4cHIgY2hhciBLRVlfTUFYX1BUU19HQVBfVE9fRU5DT0RFUltdID0gIm1heC1wdHMtZ2FwLXRvLWVuY29kZXIiOwogY29uc3RleHByIGNoYXIgS0VZX01BWF9XSURUSFtdID0gIm1heC13aWR0aCI7CiBjb25zdGV4cHIgY2hhciBLRVlfTUlNRVtdID0gIm1pbWUiOwogY29uc3RleHByIGNoYXIgS0VZX09QRVJBVElOR19SQVRFW10gPSAib3BlcmF0aW5nLXJhdGUiOwogY29uc3RleHByIGNoYXIgS0VZX09VVFBVVF9SRU9SREVSX0RFUFRIW10gPSAib3V0cHV0LXJlb3JkZXItZGVwdGgiOwogY29uc3RleHByIGNoYXIgS0VZX1BDTV9FTkNPRElOR1tdID0gInBjbS1lbmNvZGluZyI7Citjb25zdGV4cHIgY2hhciBLRVlfUFJFUEVORF9IRUFERVJTX1RPX1NZTkNfRlJBTUVTW10gPSAicHJlcGVuZC1zcHMtcHBzLXRvLWlkci1mcmFtZXMiOwogY29uc3RleHByIGNoYXIgS0VZX1BSSU9SSVRZW10gPSAicHJpb3JpdHkiOwogY29uc3RleHByIGNoYXIgS0VZX1BST0ZJTEVbXSA9ICJwcm9maWxlIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9QVVNIX0JMQU5LX0JVRkZFUlNfT05fU1RPUFtdID0gInB1c2gtYmxhbmstYnVmZmVycy1vbi1zaHV0ZG93biI7CkBAIC00MTAsOCArODM1LDEwIEBACiBjb25zdGV4cHIgaW50MzJfdCBJTkZPX1RSWV9BR0FJTl9MQVRFUiAgICAgICAgPSAtMTsKIGNvbnN0ZXhwciBpbnQzMl90IFZJREVPX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19GSVQgICAgICAgICAgICAgICA9IDE7CiBjb25zdGV4cHIgaW50MzJfdCBWSURFT19TQ0FMSU5HX01PREVfU0NBTEVfVE9fRklUX1dJVEhfQ1JPUFBJTkcgPSAyOworY29uc3RleHByIGNoYXIgUEFSQU1FVEVSX0tFWV9PRkZTRVRfVElNRVtdID0gInRpbWUtb2Zmc2V0LXVzIjsKIGNvbnN0ZXhwciBjaGFyIFBBUkFNRVRFUl9LRVlfUkVRVUVTVF9TWU5DX0ZSQU1FW10gPSAicmVxdWVzdC1zeW5jIjsKIGNvbnN0ZXhwciBjaGFyIFBBUkFNRVRFUl9LRVlfU1VTUEVORFtdID0gImRyb3AtaW5wdXQtZnJhbWVzIjsKK2NvbnN0ZXhwciBjaGFyIFBBUkFNRVRFUl9LRVlfU1VTUEVORF9USU1FW10gPSAiZHJvcC1zdGFydC10aW1lLXVzIjsKIGNvbnN0ZXhwciBjaGFyIFBBUkFNRVRFUl9LRVlfVklERU9fQklUUkFURVtdID0gInZpZGVvLWJpdHJhdGUiOwogCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmgKaW5kZXggNTlmNTdjNy4uZjUzYjIzZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdFdyaXRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuaApAQCAtNDgsNiArNDgsMTMgQEAKICAgICAgKiBhZGRlZCBgTWVkaWFDb2RlY0luZm9gIG9iamVjdC4KICAgICAgKi8KICAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+IGFkZE1lZGlhQ29kZWNJbmZvKCk7CisgICAgLyoqCisgICAgICogRmluZCBhbiBleGlzdGluZyBgTWVkaWFDb2RlY0luZm9gIG9iamVjdCBmb3IgYSBjb2RlYyBuYW1lIGFuZCByZXR1cm4gYQorICAgICAqIGBNZWRpYUNvZGVjSW5mb1dyaXRlcmAgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgZm91bmQgYWRkZWQgYE1lZGlhQ29kZWNJbmZvYC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGBNZWRpYUNvZGVjSW5mb1dyaXRlcmAgb2JqZWN0IGlmIGZvdW5kLCBvciBudWxscHRyIGlmIG5vdCBmb3VuZC4KKyAgICAgKi8KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+IGZpbmRNZWRpYUNvZGVjSW5mbyhjb25zdCBjaGFyICpjb2RlY05hbWUpOwogcHJpdmF0ZToKICAgICBNZWRpYUNvZGVjTGlzdFdyaXRlcigpID0gZGVmYXVsdDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oCmluZGV4IDZhNWM2YjYuLjA5NjM5ZTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmgKQEAgLTcwLDcgKzcwLDEyIEBACiAgICAgRVJST1JfRFJNX0RFVklDRV9SRVZPS0VEICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gOSwKICAgICBFUlJPUl9EUk1fUkVTT1VSQ0VfQlVTWSAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxMCwKICAgICBFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX09VVFBVVF9QUk9URUNUSU9OID0gRFJNX0VSUk9SX0JBU0UgLSAxMSwKLSAgICBFUlJPUl9EUk1fTEFTVF9VU0VEX0VSUk9SQ09ERSAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxMSwKKyAgICBFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX1NFQ1VSSVRZICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxMiwKKyAgICBFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxMywKKyAgICBFUlJPUl9EUk1fUkVTT1VSQ0VfQ09OVEVOVElPTiAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxNCwKKyAgICBFUlJPUl9EUk1fU0VTU0lPTl9MT1NUX1NUQVRFICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxNSwKKyAgICBFUlJPUl9EUk1fSU5WQUxJRF9TVEFURSAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxNiwKKyAgICBFUlJPUl9EUk1fTEFTVF9VU0VEX0VSUk9SQ09ERSAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSAxNiwKIAogICAgIEVSUk9SX0RSTV9WRU5ET1JfTUFYICAgICAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDUwMCwKICAgICBFUlJPUl9EUk1fVkVORE9SX01JTiAgICAgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA5OTksCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlmMThkNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfRVhUUkFDVE9SX0hfCisKKyNkZWZpbmUgTUVESUFfRVhUUkFDVE9SX0hfCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitjbGFzcyBNZXRhRGF0YUJhc2U7CitzdHJ1Y3QgTWVkaWFUcmFjazsKKworCitjbGFzcyBFeHRyYWN0b3JBbGxvY1RyYWNrZXIgeworcHVibGljOgorICAgIEV4dHJhY3RvckFsbG9jVHJhY2tlcigpIHsKKyAgICAgICAgQUxPR0QoImV4dHJhY3RvciBhbGxvY2F0ZWQ6ICVwIiwgdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgfkV4dHJhY3RvckFsbG9jVHJhY2tlcigpIHsKKyAgICAgICAgQUxPR0QoImV4dHJhY3RvciBmcmVlZDogJXAiLCB0aGlzKTsKKyAgICB9Cit9OworCitjbGFzcyBNZWRpYUV4dHJhY3RvcgorLy8gOiBwdWJsaWMgRXh0cmFjdG9yQWxsb2NUcmFja2VyCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB+TWVkaWFFeHRyYWN0b3IoKTsKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpID0gMDsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCkgPSAwOworCisgICAgZW51bSBHZXRUcmFja01ldGFEYXRhRmxhZ3MgeworICAgICAgICBrSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhID0gMQorICAgIH07CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKAorICAgICAgICAgICAgTWV0YURhdGFCYXNlJiBtZXRhLAorICAgICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyA9IDApID0gMDsKKworICAgIC8vIFJldHVybiBjb250YWluZXIgc3BlY2lmaWMgbWV0YS1kYXRhLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorICAgIC8vIHJldHVybnMgYW4gZW1wdHkgbWV0YWRhdGEgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKSA9IDA7CisKKyAgICBlbnVtIEZsYWdzIHsKKyAgICAgICAgQ0FOX1NFRUtfQkFDS1dBUkQgID0gMSwgIC8vIHRoZSAic2VlayAxMHNlY3MgYmFjayBidXR0b24iCisgICAgICAgIENBTl9TRUVLX0ZPUldBUkQgICA9IDIsICAvLyB0aGUgInNlZWsgMTBzZWNzIGZvcndhcmQgYnV0dG9uIgorICAgICAgICBDQU5fUEFVU0UgICAgICAgICAgPSA0LAorICAgICAgICBDQU5fU0VFSyAgICAgICAgICAgPSA4LCAgLy8gdGhlICJzZWVrIGJhciIKKyAgICB9OworCisgICAgLy8gSWYgc3ViY2xhc3NlcyBkbyBfbm90XyBvdmVycmlkZSB0aGlzLCB0aGUgZGVmYXVsdCBpcworICAgIC8vIENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9TRUVLIHwgQ0FOX1BBVVNFCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiAvKmNhc1Rva2VuKi8sIHNpemVfdCAvKnNpemUqLykgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICI8dW5zcGVjaWZpZWQ+IjsgfQorCitwcm90ZWN0ZWQ6CisgICAgTWVkaWFFeHRyYWN0b3IoKTsKKworcHJpdmF0ZToKKyAgICBNZWRpYUV4dHJhY3Rvcihjb25zdCBNZWRpYUV4dHJhY3RvciAmKTsKKyAgICBNZWRpYUV4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhRXh0cmFjdG9yICYpOworfTsKKworY2xhc3MgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBNZWRpYUV4dHJhY3RvckNVbndyYXBwZXIoQ01lZGlhRXh0cmFjdG9yICpwbHVnaW4pOworICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MgPSAwKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpOworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHVpbnQ4X3QqIGNhc1Rva2VuLCBzaXplX3Qgc2l6ZSk7Citwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyKCk7Citwcml2YXRlOgorICAgIENNZWRpYUV4dHJhY3RvciAqcGx1Z2luOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oCmluZGV4IGZiOWY1YmQuLjJhYjk4ZTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaApAQCAtMTksMTAgKzE5LDEwIEBACiAjZGVmaW5lIE1FRElBX0VYVFJBQ1RPUl9GQUNUT1JZX0hfCiAKICNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL2RsZXh0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzUsMjYgKzM1LDI1IEBACiAgICAgICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBjb25zdCBjaGFyICptaW1lID0gTlVMTCk7CiAgICAgc3RhdGljIHNwPElNZWRpYUV4dHJhY3Rvcj4gQ3JlYXRlRnJvbVNlcnZpY2UoCiAgICAgICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBjb25zdCBjaGFyICptaW1lID0gTlVMTCk7Ci0gICAgc3RhdGljIHZvaWQgTG9hZFBsdWdpbnMoY29uc3QgOjpzdGQ6OnN0cmluZyYgYXBrUGF0aCk7CiAgICAgc3RhdGljIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKyAgICBzdGF0aWMgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBnZXRTdXBwb3J0ZWRUeXBlcygpOworICAgIHN0YXRpYyB2b2lkIExvYWRFeHRyYWN0b3JzKCk7CiAKIHByaXZhdGU6CiAgICAgc3RhdGljIE11dGV4IGdQbHVnaW5NdXRleDsKLSAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4+IGdQbHVnaW5zOworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8c3RkOjpsaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+PiBnUGx1Z2luczsKICAgICBzdGF0aWMgYm9vbCBnUGx1Z2luc1JlZ2lzdGVyZWQ7CisgICAgc3RhdGljIGJvb2wgZ0lnbm9yZVZlcnNpb247CiAKLSAgICBzdGF0aWMgdm9pZCBSZWdpc3RlckV4dHJhY3RvcnNJbkFwaygKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFwa1BhdGgsIExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpOwotICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyRXh0cmFjdG9yc0luU3lzdGVtKAotICAgICAgICAgICAgY29uc3QgY2hhciAqbGliRGlyUGF0aCwgTGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCk7CisgICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJFeHRyYWN0b3JzKAorICAgICAgICAgICAgY29uc3QgY2hhciAqbGliRGlyUGF0aCwgY29uc3QgYW5kcm9pZF9kbGV4dGluZm8qIGRsZXh0aW5mbywKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCk7CiAgICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJFeHRyYWN0b3IoCi0gICAgICAgICAgICBjb25zdCBzcDxFeHRyYWN0b3JQbHVnaW4+ICZwbHVnaW4sIExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpOworICAgICAgICAgICAgY29uc3Qgc3A8RXh0cmFjdG9yUGx1Z2luPiAmcGx1Z2luLCBzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpOwogCi0gICAgc3RhdGljIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBzbmlmZihEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiptZXRhLCBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICpmcmVlTWV0YSwKLSAgICAgICAgICAgIHNwPEV4dHJhY3RvclBsdWdpbj4gJnBsdWdpbik7Ci0KLSAgICBzdGF0aWMgdm9pZCBVcGRhdGVFeHRyYWN0b3JzKGNvbnN0IGNoYXIgKm5ld1VwZGF0ZUFwa1BhdGgpOworICAgIHN0YXRpYyB2b2lkICpzbmlmZihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLAorICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiptZXRhLCBGcmVlTWV0YUZ1bmMgKmZyZWVNZXRhLAorICAgICAgICAgICAgc3A8RXh0cmFjdG9yUGx1Z2luPiAmcGx1Z2luLCB1aW50MzJfdCAqY3JlYXRvclZlcnNpb24pOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oCmluZGV4IGZlMGU2MTMuLmFjYWE2YzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaApAQCAtMTksNTAgKzE5LDIxIEBACiAjZGVmaW5lIE1FRElBX0hUVFBfSF8KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgotCi0jaW5jbHVkZSAiaW5jbHVkZS9IVFRQQmFzZS5oIgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0NsZWFyTWVkaWFIVFRQLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IE1lZGlhSFRUUENvbm5lY3Rpb247CiAKLXN0cnVjdCBNZWRpYUhUVFAgOiBwdWJsaWMgSFRUUEJhc2Ugeworc3RydWN0IE1lZGlhSFRUUCA6IHB1YmxpYyBDbGVhck1lZGlhSFRUUCB7CiAgICAgTWVkaWFIVFRQKGNvbnN0IHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+ICZjb25uKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdCgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKLSAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAotICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQpOwotCi0gICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7Ci0KLSAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlY29ubmVjdEF0T2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KTsKLQogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk1lZGlhSFRUUCgpOwogCiAgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyKiBtaW1lKTsKLSAgICB2aXJ0dWFsIFN0cmluZzggZ2V0VXJpKCk7Ci0gICAgdmlydHVhbCBTdHJpbmc4IGdldE1JTUVUeXBlKCkgY29uc3Q7CiAKIHByaXZhdGU6Ci0gICAgc3RhdHVzX3QgbUluaXRDaGVjazsKLSAgICBzcDxNZWRpYUhUVFBDb25uZWN0aW9uPiBtSFRUUENvbm5lY3Rpb247Ci0KLSAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtTGFzdEhlYWRlcnM7Ci0gICAgQVN0cmluZyBtTGFzdFVSSTsKLQotICAgIGJvb2wgbUNhY2hlZFNpemVWYWxpZDsKLSAgICBvZmY2NF90IG1DYWNoZWRTaXplOwotCiAgICAgc3A8RGVjcnlwdEhhbmRsZT4gbURlY3J5cHRIYW5kbGU7CiAgICAgRHJtTWFuYWdlckNsaWVudCAqbURybU1hbmFnZXJDbGllbnQ7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmgKaW5kZXggNjZmNGQ3Mi4uNjlkNmNkZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmgKQEAgLTQ5LDYgKzQ5LDcgQEAKICAgICAgICAgT1VUUFVUX0ZPUk1BVF9XRUJNICAgICAgICA9IDEsCiAgICAgICAgIE9VVFBVVF9GT1JNQVRfVEhSRUVfR1BQICAgPSAyLAogICAgICAgICBPVVRQVVRfRk9STUFUX0hFSUYgICAgICAgID0gMywKKyAgICAgICAgT1VUUFVUX0ZPUk1BVF9PR0cgICAgICAgICA9IDQsCiAgICAgICAgIE9VVFBVVF9GT1JNQVRfTElTVF9FTkQgLy8gbXVzdCBiZSBsYXN0IC0gdXNlZCB0byB2YWxpZGF0ZSBmb3JtYXQgdHlwZQogICAgIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYVNvdXJjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMTYwZjhkMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi8uLi8uLi9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMWUxMjE5My4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vLi4vLi4vbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYzJkZDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oCkBAIC0wLDAgKzEsMzI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRVRBX0RBVEFfQkFTRV9IXworCisjZGVmaW5lIE1FVEFfREFUQV9CQVNFX0hfCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBUaGUgZm9sbG93aW5nIGtleXMgbWFwIHRvIGludDMyX3QgZGF0YSB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KK2VudW0geworICAgIGtLZXlNSU1FVHlwZSAgICAgICAgICA9ICdtaW1lJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5V2lkdGggICAgICAgICAgICAgPSAnd2lkdCcsICAvLyBpbnQzMl90LCBpbWFnZSBwaXhlbAorICAgIGtLZXlIZWlnaHQgICAgICAgICAgICA9ICdoZWlnJywgIC8vIGludDMyX3QsIGltYWdlIHBpeGVsCisgICAga0tleURpc3BsYXlXaWR0aCAgICAgID0gJ2RXaWQnLCAgLy8gaW50MzJfdCwgZGlzcGxheS9wcmVzZW50YXRpb24KKyAgICBrS2V5RGlzcGxheUhlaWdodCAgICAgPSAnZEhndCcsICAvLyBpbnQzMl90LCBkaXNwbGF5L3ByZXNlbnRhdGlvbgorICAgIGtLZXlTQVJXaWR0aCAgICAgICAgICA9ICdzYXJXJywgIC8vIGludDMyX3QsIHNhbXBsZUFzcGVjdFJhdGlvIHdpZHRoCisgICAga0tleVNBUkhlaWdodCAgICAgICAgID0gJ3NhckgnLCAgLy8gaW50MzJfdCwgc2FtcGxlQXNwZWN0UmF0aW8gaGVpZ2h0CisgICAga0tleVRodW1ibmFpbFdpZHRoICAgID0gJ3RoYlcnLCAgLy8gaW50MzJfdCwgdGh1bWJuYWlsIHdpZHRoCisgICAga0tleVRodW1ibmFpbEhlaWdodCAgID0gJ3RoYkgnLCAgLy8gaW50MzJfdCwgdGh1bWJuYWlsIGhlaWdodAorCisgICAgLy8gYSByZWN0YW5nbGUsIGlmIGFic2VudCBhc3N1bWVkIHRvIGJlICgwLCAwLCB3aWR0aCAtIDEsIGhlaWdodCAtIDEpCisgICAga0tleUNyb3BSZWN0ICAgICAgICAgID0gJ2Nyb3AnLAorCisgICAga0tleVJvdGF0aW9uICAgICAgICAgID0gJ3JvdEEnLCAgLy8gaW50MzJfdCAoYW5nbGUgaW4gZGVncmVlcykKKyAgICBrS2V5SUZyYW1lc0ludGVydmFsICAgPSAnaWZpdicsICAvLyBpbnQzMl90CisgICAga0tleVN0cmlkZSAgICAgICAgICAgID0gJ3N0cmQnLCAgLy8gaW50MzJfdAorICAgIGtLZXlTbGljZUhlaWdodCAgICAgICA9ICdzbGh0JywgIC8vIGludDMyX3QKKyAgICBrS2V5Q2hhbm5lbENvdW50ICAgICAgPSAnI2NobicsICAvLyBpbnQzMl90CisgICAga0tleUNoYW5uZWxNYXNrICAgICAgID0gJ2Nobm0nLCAgLy8gaW50MzJfdAorICAgIGtLZXlTYW1wbGVSYXRlICAgICAgICA9ICdzcnRlJywgIC8vIGludDMyX3QgKGF1ZGlvIHNhbXBsaW5nIHJhdGUgSHopCisgICAga0tleVBjbUVuY29kaW5nICAgICAgID0gJ1BDTWUnLCAgLy8gaW50MzJfdCAoYXVkaW8gZW5jb2RpbmcgZW51bSkKKyAgICBrS2V5RnJhbWVSYXRlICAgICAgICAgPSAnZnJtUicsICAvLyBpbnQzMl90ICh2aWRlbyBmcmFtZSByYXRlIGZwcykKKyAgICBrS2V5Qml0UmF0ZSAgICAgICAgICAgPSAnYnJ0ZScsICAvLyBpbnQzMl90IChicHMpCisgICAga0tleU1heEJpdFJhdGUgICAgICAgID0gJ214QnInLCAgLy8gaW50MzJfdCAoYnBzKQorICAgIGtLZXlCaXRzUGVyU2FtcGxlICAgICA9ICdiaXRzJywgIC8vIGludDMyX3QgKGJpdHMgcGVyIHNhbXBsZSkKKyAgICBrS2V5U3RyZWFtSGVhZGVyICAgICAgPSAnc3RIZCcsICAvLyByYXcgZGF0YQorICAgIGtLZXlFU0RTICAgICAgICAgICAgICA9ICdlc2RzJywgIC8vIHJhdyBkYXRhCisgICAga0tleUFBQ1Byb2ZpbGUgICAgICAgID0gJ2FhY3AnLCAgLy8gaW50MzJfdAorICAgIGtLZXlBVkNDICAgICAgICAgICAgICA9ICdhdmNjJywgIC8vIHJhdyBkYXRhCisgICAga0tleUhWQ0MgICAgICAgICAgICAgID0gJ2h2Y2MnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5QVYxQyAgICAgICAgICAgICAgPSAnYXYxYycsICAvLyByYXcgZGF0YQorICAgIGtLZXlUaHVtYm5haWxIVkNDICAgICA9ICd0aHZjJywgIC8vIHJhdyBkYXRhCisgICAga0tleUQyNjMgICAgICAgICAgICAgID0gJ2QyNjMnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5T3B1c0hlYWRlciAgICAgICAgPSAnb2hkcicsICAvLyByYXcgZGF0YQorICAgIGtLZXlPcHVzQ29kZWNEZWxheSAgICA9ICdvY29kJywgIC8vIHVpbnQ2NF90IChjb2RlYyBkZWxheSBpbiBucykKKyAgICBrS2V5T3B1c1NlZWtQcmVSb2xsICAgPSAnb3NwcicsICAvLyB1aW50NjRfdCAoc2VlayBwcmVyb2xsIGluIG5zKQorICAgIGtLZXlWcDlDb2RlY1ByaXZhdGUgICA9ICd2cDlwJywgIC8vIHJhdyBkYXRhICh2cDkgY3NkIGluZm9ybWF0aW9uKQorICAgIGtLZXlJc1N5bmNGcmFtZSAgICAgICA9ICdzeW5jJywgIC8vIGludDMyX3QgKGJvb2wpCisgICAga0tleUlzQ29kZWNDb25maWcgICAgID0gJ2NvbmYnLCAgLy8gaW50MzJfdCAoYm9vbCkKKyAgICBrS2V5SXNNdXhlckRhdGEgICAgICAgPSAnbXV4ZCcsICAvLyBpbnQzMl90IChib29sKQorICAgIGtLZXlUaW1lICAgICAgICAgICAgICA9ICd0aW1lJywgIC8vIGludDY0X3QgKHVzZWNzKQorICAgIGtLZXlEZWNvZGluZ1RpbWUgICAgICA9ICdkZWNUJywgIC8vIGludDY0X3QgKGRlY29kaW5nIHRpbWVzdGFtcCBpbiB1c2VjcykKKyAgICBrS2V5TlRQVGltZSAgICAgICAgICAgPSAnbnRwVCcsICAvLyB1aW50NjRfdCAobnRwLXRpbWVzdGFtcCkKKyAgICBrS2V5VGFyZ2V0VGltZSAgICAgICAgPSAndGFyVCcsICAvLyBpbnQ2NF90ICh1c2VjcykKKyAgICBrS2V5RHJpZnRUaW1lICAgICAgICAgPSAnZGZ0VCcsICAvLyBpbnQ2NF90ICh1c2VjcykKKyAgICBrS2V5QW5jaG9yVGltZSAgICAgICAgPSAnYW5jVCcsICAvLyBpbnQ2NF90ICh1c2VjcykKKyAgICBrS2V5RHVyYXRpb24gICAgICAgICAgPSAnZHVyYScsICAvLyBpbnQ2NF90ICh1c2VjcykKKyAgICBrS2V5UGl4ZWxGb3JtYXQgICAgICAgPSAncGl4ZicsICAvLyBpbnQzMl90CisgICAga0tleUNvbG9yRm9ybWF0ICAgICAgID0gJ2NvbGYnLCAgLy8gaW50MzJfdAorICAgIGtLZXlDb2xvclNwYWNlICAgICAgICA9ICdjb2xzJywgIC8vIGludDMyX3QKKyAgICBrS2V5UGxhdGZvcm1Qcml2YXRlICAgPSAncHJpdicsICAvLyBwb2ludGVyCisgICAga0tleURlY29kZXJDb21wb25lbnQgID0gJ2RlY0MnLCAgLy8gY3N0cmluZworICAgIGtLZXlCdWZmZXJJRCAgICAgICAgICA9ICdiZklEJywKKyAgICBrS2V5TWF4SW5wdXRTaXplICAgICAgPSAnaW5wUycsCisgICAga0tleU1heFdpZHRoICAgICAgICAgID0gJ21heFcnLAorICAgIGtLZXlNYXhIZWlnaHQgICAgICAgICA9ICdtYXhIJywKKyAgICBrS2V5VGh1bWJuYWlsVGltZSAgICAgPSAndGhiVCcsICAvLyBpbnQ2NF90ICh1c2VjcykKKyAgICBrS2V5VHJhY2tJRCAgICAgICAgICAgPSAndHJJRCcsCisgICAga0tleUVuY29kZXJEZWxheSAgICAgID0gJ2VuY2QnLCAgLy8gaW50MzJfdCAoZnJhbWVzKQorICAgIGtLZXlFbmNvZGVyUGFkZGluZyAgICA9ICdlbmNwJywgIC8vIGludDMyX3QgKGZyYW1lcykKKworICAgIGtLZXlBbGJ1bSAgICAgICAgICAgICA9ICdhbGJ1JywgIC8vIGNzdHJpbmcKKyAgICBrS2V5QXJ0aXN0ICAgICAgICAgICAgPSAnYXJ0aScsICAvLyBjc3RyaW5nCisgICAga0tleUFsYnVtQXJ0aXN0ICAgICAgID0gJ2FhcnQnLCAgLy8gY3N0cmluZworICAgIGtLZXlDb21wb3NlciAgICAgICAgICA9ICdjb21wJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5R2VucmUgICAgICAgICAgICAgPSAnZ2VucicsICAvLyBjc3RyaW5nCisgICAga0tleVRpdGxlICAgICAgICAgICAgID0gJ3RpdGwnLCAgLy8gY3N0cmluZworICAgIGtLZXlZZWFyICAgICAgICAgICAgICA9ICd5ZWFyJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5QWxidW1BcnQgICAgICAgICAgPSAnYWxiQScsICAvLyBjb21wcmVzc2VkIGltYWdlIGRhdGEKKyAgICBrS2V5QXV0aG9yICAgICAgICAgICAgPSAnYXV0aCcsICAvLyBjc3RyaW5nCisgICAga0tleUNEVHJhY2tOdW1iZXIgICAgID0gJ2NkdHInLCAgLy8gY3N0cmluZworICAgIGtLZXlEaXNjTnVtYmVyICAgICAgICA9ICdkbnVtJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5RGF0ZSAgICAgICAgICAgICAgPSAnZGF0ZScsICAvLyBjc3RyaW5nCisgICAga0tleVdyaXRlciAgICAgICAgICAgID0gJ3dyaXQnLCAgLy8gY3N0cmluZworICAgIGtLZXlDb21waWxhdGlvbiAgICAgICA9ICdjcGlsJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5TG9jYXRpb24gICAgICAgICAgPSAnbG9jICcsICAvLyBjc3RyaW5nCisgICAga0tleVRpbWVTY2FsZSAgICAgICAgID0gJ3Rtc2wnLCAgLy8gaW50MzJfdAorICAgIGtLZXlDYXB0dXJlRnJhbWVyYXRlICA9ICdjYXBGJywgIC8vIGZsb2F0IChjYXB0dXJlIGZwcykKKworICAgIC8vIHZpZGVvIHByb2ZpbGUgYW5kIGxldmVsCisgICAga0tleVZpZGVvUHJvZmlsZSAgICAgID0gJ3ZwcmYnLCAgLy8gaW50MzJfdAorICAgIGtLZXlWaWRlb0xldmVsICAgICAgICA9ICd2bGV2JywgIC8vIGludDMyX3QKKworICAgIC8vIFNldCB0aGlzIGtleSB0byBlbmFibGUgYXV0aG9yaW5nIGZpbGVzIGluIDY0LWJpdCBvZmZzZXQKKyAgICBrS2V5NjRCaXRGaWxlT2Zmc2V0ICAgPSAnZm9idCcsICAvLyBpbnQzMl90IChib29sKQorICAgIGtLZXkyQnl0ZU5hbExlbmd0aCAgICA9ICcyTkFMJywgIC8vIGludDMyX3QgKGJvb2wpCisKKyAgICAvLyBJZGVudGlmeSB0aGUgZmlsZSBvdXRwdXQgZm9ybWF0IGZvciBhdXRob3JpbmcKKyAgICAvLyBQbGVhc2Ugc2VlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+IGZvciB0aGUgc3VwcG9ydGVkCisgICAgLy8gZmlsZSBvdXRwdXQgZm9ybWF0cy4KKyAgICBrS2V5RmlsZVR5cGUgICAgICAgICAgPSAnZnR5cCcsICAvLyBpbnQzMl90CisKKyAgICAvLyBUcmFjayBhdXRob3JpbmcgcHJvZ3Jlc3Mgc3RhdHVzCisgICAgLy8ga0tleVRyYWNrVGltZVN0YXR1cyBpcyB1c2VkIHRvIHRyYWNrIHByb2dyZXNzIGluIGVsYXBzZWQgdGltZQorICAgIGtLZXlUcmFja1RpbWVTdGF0dXMgICA9ICd0a3RtJywgIC8vIGludDY0X3QKKworICAgIGtLZXlSZWFsVGltZVJlY29yZGluZyA9ICdydHJjJywgIC8vIGJvb2wgKGludDMyX3QpCisgICAga0tleU51bUJ1ZmZlcnMgICAgICAgID0gJ25iYmYnLCAgLy8gaW50MzJfdAorCisgICAgLy8gT2dnIGZpbGVzIGNhbiBiZSB0YWdnZWQgdG8gYmUgYXV0b21hdGljYWxseSBsb29waW5nLi4uCisgICAga0tleUF1dG9Mb29wICAgICAgICAgID0gJ2F1dEwnLCAgLy8gYm9vbCAoaW50MzJfdCkKKworICAgIGtLZXlWYWxpZFNhbXBsZXMgICAgICA9ICd2YWxEJywgIC8vIGludDMyX3QKKworICAgIGtLZXlJc1VucmVhZGFibGUgICAgICA9ICd1bnJlJywgIC8vIGJvb2wgKGludDMyX3QpCisKKyAgICAvLyBBbiBpbmRpY2F0aW9uIHRoYXQgYSB2aWRlbyBidWZmZXIgaGFzIGJlZW4gcmVuZGVyZWQuCisgICAga0tleVJlbmRlcmVkICAgICAgICAgID0gJ3JlbmQnLCAgLy8gYm9vbCAoaW50MzJfdCkKKworICAgIC8vIFRoZSBsYW5ndWFnZSBjb2RlIGZvciB0aGlzIG1lZGlhCisgICAga0tleU1lZGlhTGFuZ3VhZ2UgICAgID0gJ2xhbmcnLCAgLy8gY3N0cmluZworCisgICAgLy8gVGhlIG1hbnVmYWN0dXJlciBjb2RlIGZvciB0aGlzIG1lZGlhCisgICAga0tleU1hbnVmYWN0dXJlciAgPSAnbWFudScsICAvLyBjc3RyaW5nCisKKyAgICAvLyBUbyBzdG9yZSB0aGUgdGltZWQgdGV4dCBmb3JtYXQgZGF0YQorICAgIGtLZXlUZXh0Rm9ybWF0RGF0YSAgICA9ICd0ZXh0JywgIC8vIHJhdyBkYXRhCisKKyAgICBrS2V5UmVxdWlyZXNTZWN1cmVCdWZmZXJzID0gJ3NlY3UnLCAgLy8gYm9vbCAoaW50MzJfdCkKKworICAgIGtLZXlJc0FEVFMgICAgICAgICAgICA9ICdhZHRzJywgIC8vIGJvb2wgKGludDMyX3QpCisgICAga0tleUFBQ0FPVCAgICAgICAgICAgID0gJ2Fhb3QnLCAgLy8gaW50MzJfdAorCisgICAgLy8gSWYgYSBNZWRpYUJ1ZmZlcidzIGRhdGEgcmVwcmVzZW50cyAoYXQgbGVhc3QgcGFydGlhbGx5KSBlbmNyeXB0ZWQKKyAgICAvLyBkYXRhLCB0aGUgZm9sbG93aW5nIGZpZWxkcyBhaWQgaW4gZGVjcnlwdGlvbi4KKyAgICAvLyBUaGUgZGF0YSBjYW4gYmUgdGhvdWdodCBvZiBhcyBwYWlycyBvZiBwbGFpbiBhbmQgZW5jcnlwdGVkIGRhdGEKKyAgICAvLyBmcmFnbWVudHMsIGkuZS4gcGxhaW4gYW5kIGVuY3J5cHRlZCBkYXRhIGFsdGVybmF0ZS4KKyAgICAvLyBUaGUgZmlyc3QgZnJhZ21lbnQgaXMgYnkgY29udmVudGlvbiBwbGFpbiBkYXRhIChpZiB0aGF0J3Mgbm90IHRoZQorICAgIC8vIGNhc2UsIHNpbXBseSBzcGVjaWZ5IHBsYWluIGZyYWdtZW50IHNpemUgb2YgMCkuCisgICAgLy8ga0tleUVuY3J5cHRlZFNpemVzIGFuZCBrS2V5UGxhaW5TaXplcyBlYWNoIG1hcCB0byBhbiBhcnJheSBvZgorICAgIC8vIHNpemVfdCB2YWx1ZXMuIFRoZSBzdW0gdG90YWwgb2YgYWxsIHNpemVfdCB2YWx1ZXMgb2YgYm90aCBhcnJheXMKKyAgICAvLyBtdXN0IGVxdWFsIHRoZSBhbW91bnQgb2YgZGF0YSAoaS5lLiBNZWRpYUJ1ZmZlcidzIHJhbmdlX2xlbmd0aCgpKS4KKyAgICAvLyBJZiBib3RoIGFycmF5cyBhcmUgcHJlc2VudCwgdGhleSBtdXN0IGJlIG9mIHRoZSBzYW1lIHNpemUuCisgICAgLy8gSWYgb25seSBlbmNyeXB0ZWQgc2l6ZXMgYXJlIHByZXNlbnQgaXQgaXMgYXNzdW1lZCB0aGF0IGFsbAorICAgIC8vIHBsYWluIHNpemVzIGFyZSAwLCBpLmUuIGFsbCBmcmFnbWVudHMgYXJlIGVuY3J5cHRlZC4KKyAgICAvLyBUbyBwcm9ncmFtbWF0aWNhbGx5IHNldCB0aGVzZSBhcnJheSwgdXNlIHRoZSBNZXRhRGF0YUJhc2U6OnNldERhdGEgQVBJLCBpLmUuCisgICAgLy8gY29uc3Qgc2l6ZV90IGVuY1NpemVzW107CisgICAgLy8gbWV0YS0+c2V0RGF0YSgKKyAgICAvLyAga0tleUVuY3J5cHRlZFNpemVzLCAwIC8qIHR5cGUgKi8sIGVuY1NpemVzLCBzaXplb2YoZW5jU2l6ZXMpKTsKKyAgICAvLyBBIHBsYWluIHNpemVzIGFycmF5IGJ5IGl0c2VsZiBtYWtlcyBubyBzZW5zZS4KKyAgICBrS2V5RW5jcnlwdGVkU2l6ZXMgICAgPSAnZW5jcicsICAvLyBzaXplX3RbXQorICAgIGtLZXlQbGFpblNpemVzICAgICAgICA9ICdwbGFpJywgIC8vIHNpemVfdFtdCisgICAga0tleUNyeXB0b0tleSAgICAgICAgID0gJ2NyeUsnLCAgLy8gdWludDhfdFsxNl0KKyAgICBrS2V5Q3J5cHRvSVYgICAgICAgICAgPSAnY3J5SScsICAvLyB1aW50OF90WzE2XQorICAgIGtLZXlDcnlwdG9Nb2RlICAgICAgICA9ICdjcnlNJywgIC8vIGludDMyX3QKKworICAgIGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplID0gJ2NyeVMnLCAgLy8gaW50MzJfdAorCisgICAga0tleVBzc2ggICAgICAgICAgICAgID0gJ3Bzc2gnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5Q0FTeXN0ZW1JRCAgICAgICAgPSAnY2FpZCcsICAvLyBpbnQzMl90CisgICAga0tleUNBU2Vzc2lvbklEICAgICAgID0gJ3NlaWQnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5Q0FQcml2YXRlRGF0YSAgICAgPSAnY2FkYycsICAvLyByYXcgZGF0YQorCisgICAga0tleUVuY3J5cHRlZEJ5dGVCbG9jayA9ICdjYmxrJywgIC8vIHVpbnQ4X3QKKyAgICBrS2V5U2tpcEJ5dGVCbG9jayAgICAgPSAnc2JsaycsICAvLyB1aW50OF90CisKKyAgICAvLyBQbGVhc2Ugc2VlIE1lZGlhRm9ybWF0LktFWV9JU19BVVRPU0VMRUNULgorICAgIGtLZXlUcmFja0lzQXV0b3NlbGVjdCA9ICdhdXRvJywgLy8gYm9vbCAoaW50MzJfdCkKKyAgICAvLyBQbGVhc2Ugc2VlIE1lZGlhRm9ybWF0LktFWV9JU19ERUZBVUxULgorICAgIGtLZXlUcmFja0lzRGVmYXVsdCAgICA9ICdkZmx0JywgLy8gYm9vbCAoaW50MzJfdCkKKyAgICAvLyBTaW1pbGFyIHRvIE1lZGlhRm9ybWF0LktFWV9JU19GT1JDRURfU1VCVElUTEUgYnV0IHBlcnRhaW5zIHRvIGF2IHRyYWNrcyBhcyB3ZWxsLgorICAgIGtLZXlUcmFja0lzRm9yY2VkICAgICA9ICdmcmNkJywgLy8gYm9vbCAoaW50MzJfdCkKKworICAgIC8vIEgyNjQgc3VwcGxlbWVudGFsIGVuaGFuY2VtZW50IGluZm9ybWF0aW9uIG9mZnNldHMvc2l6ZXMKKyAgICBrS2V5U0VJICAgICAgICAgICAgICAgPSAnc2VpICcsIC8vIHJhdyBkYXRhCisKKyAgICAvLyBNUEVHIHVzZXIgZGF0YSBvZmZzZXRzCisgICAga0tleU1wZWdVc2VyRGF0YSAgICAgID0gJ21wdWQnLCAvLyBzaXplX3RbXQorCisgICAgLy8gSERSIHJlbGF0ZWQKKyAgICBrS2V5SGRyU3RhdGljSW5mbyAgICA9ICdoZHJTJywgLy8gSERSU3RhdGljSW5mbworICAgIGtLZXlIZHIxMFBsdXNJbmZvICAgID0gJ2hkckQnLCAvLyByYXcgZGF0YQorCisgICAgLy8gY29sb3IgYXNwZWN0cworICAgIGtLZXlDb2xvclJhbmdlICAgICAgID0gJ2NSbmcnLCAvLyBpbnQzMl90LCBjb2xvciByYW5nZSwgdmFsdWUgZGVmaW5lZCBieSBDb2xvckFzcGVjdHMuUmFuZ2UKKyAgICBrS2V5Q29sb3JQcmltYXJpZXMgICA9ICdjUHJtJywgLy8gaW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sb3IgUHJpbWFyaWVzLCB2YWx1ZSBkZWZpbmVkIGJ5IENvbG9yQXNwZWN0cy5QcmltYXJpZXMKKyAgICBrS2V5VHJhbnNmZXJGdW5jdGlvbiA9ICd0RnVuJywgLy8gaW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhbnNmZXIgRnVuY3Rpb24sIHZhbHVlIGRlZmluZWQgYnkgQ29sb3JBc3BlY3RzLlRyYW5zZmVyLgorICAgIGtLZXlDb2xvck1hdHJpeCAgICAgID0gJ2NNdHgnLCAvLyBpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xvciBNYXRyaXgsIHZhbHVlIGRlZmluZWQgYnkgQ29sb3JBc3BlY3RzLk1hdHJpeENvZWZmcy4KKyAgICBrS2V5VGVtcG9yYWxMYXllcklkICA9ICdpTHlyJywgLy8gaW50MzJfdCwgdGVtcG9yYWwgbGF5ZXItaWQuIDAtYmFzZWQgKDAgPT4gYmFzZSBsYXllcikKKyAgICBrS2V5VGVtcG9yYWxMYXllckNvdW50ID0gJ2NMeXInLCAvLyBpbnQzMl90LCBudW1iZXIgb2YgdGVtcG9yYWwgbGF5ZXJzIGVuY29kZWQKKworICAgIGtLZXlUaWxlV2lkdGggICAgICAgID0gJ3RpbFcnLCAvLyBpbnQzMl90LCBIRUlGIHRpbGUgd2lkdGgKKyAgICBrS2V5VGlsZUhlaWdodCAgICAgICA9ICd0aWxIJywgLy8gaW50MzJfdCwgSEVJRiB0aWxlIGhlaWdodAorICAgIGtLZXlHcmlkUm93cyAgICAgICAgID0gJ2dyZFInLCAvLyBpbnQzMl90LCBIRUlGIGdyaWQgcm93cworICAgIGtLZXlHcmlkQ29scyAgICAgICAgID0gJ2dyZEMnLCAvLyBpbnQzMl90LCBIRUlGIGdyaWQgY29sdW1ucworICAgIGtLZXlJY2NQcm9maWxlICAgICAgID0gJ3Byb2YnLCAvLyByYXcgZGF0YSwgSUNDIHByb2ZpbGUgZGF0YQorICAgIGtLZXlJc1ByaW1hcnlJbWFnZSAgID0gJ3ByaW0nLCAvLyBib29sIChpbnQzMl90KSwgaW1hZ2UgdHJhY2sgaXMgdGhlIHByaW1hcnkgaW1hZ2UKKyAgICBrS2V5RnJhbWVDb3VudCAgICAgICA9ICduZnJtJywgLy8gaW50MzJfdCwgdG90YWwgbnVtYmVyIG9mIGZyYW1lIGluIHZpZGVvIHRyYWNrCisgICAga0tleUV4aWZPZmZzZXQgICAgICAgPSAnZXhvZicsIC8vIGludDY0X3QsIEV4aWYgZGF0YSBvZmZzZXQKKyAgICBrS2V5RXhpZlNpemUgICAgICAgICA9ICdleHN6JywgLy8gaW50NjRfdCwgRXhpZiBkYXRhIHNpemUKKyAgICBrS2V5RXhpZlRpZmZPZmZzZXQgICA9ICd0aGRyJywgLy8gaW50MzJfdCwgaWYgPiAwLCBidWZmZXIgY29udGFpbnMgZXhpZiBkYXRhIGJsb2NrIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGlmZiBoZHIgYXQgc3BlY2lmaWVkIG9mZnNldAorICAgIGtLZXlQY21CaWdFbmRpYW4gICAgID0gJ3BjbWInLCAvLyBib29sIChpbnQzMl90KQorCisgICAgLy8gS2V5IGZvciBBTEFDIE1hZ2ljIENvb2tpZQorICAgIGtLZXlBbGFjTWFnaWNDb29raWUgID0gJ2FsbWMnLCAvLyByYXcgZGF0YQorCisgICAgLy8gQUMtNCBBdWRpb1ByZXNlbnRhdGlvbkluZm8KKyAgICBrS2V5QXVkaW9QcmVzZW50YXRpb25JbmZvID0gJ2F1ZFAnLCAgLy8gcmF3IGRhdGEKKworICAgIC8vIG9wYXF1ZSBjb2RlYyBzcGVjaWZpYyBkYXRhIGJlaW5nIHBhc3NlZCBmcm9tIGV4dHJhY3RvciB0byBjb2RlYworICAgIGtLZXlPcGFxdWVDU0QwICAgICAgID0gJ2NzZDAnLAorICAgIGtLZXlPcGFxdWVDU0QxICAgICAgID0gJ2NzZDEnLAorICAgIGtLZXlPcGFxdWVDU0QyICAgICAgID0gJ2NzZDInLAorCisgICAga0tleUhhcHRpY0NoYW5uZWxDb3VudCA9ICdoYXBDJywKK307CisKK2VudW0geworICAgIGtUeXBlRVNEUyAgICAgICAgPSAnZXNkcycsCisgICAga1R5cGVBVkNDICAgICAgICA9ICdhdmNjJywKKyAgICBrVHlwZUhWQ0MgICAgICAgID0gJ2h2Y2MnLAorICAgIGtUeXBlQVYxQyAgICAgICAgPSAnYXYxYycsCisgICAga1R5cGVEMjYzICAgICAgICA9ICdkMjYzJywKK307CisKK2VudW0geworICAgIGtDcnlwdG9Nb2RlVW5lbmNyeXB0ZWQgPSAwLAorICAgIGtDcnlwdG9Nb2RlQWVzQ3RyICAgICAgPSAxLAorICAgIGtDcnlwdG9Nb2RlQWVzQ2JjICAgICAgPSAyLAorfTsKKworY2xhc3MgUGFyY2VsOworCitjbGFzcyBNZXRhRGF0YUJhc2UgeworcHVibGljOgorICAgIE1ldGFEYXRhQmFzZSgpOworICAgIE1ldGFEYXRhQmFzZShjb25zdCBNZXRhRGF0YUJhc2UgJmZyb20pOworICAgIE1ldGFEYXRhQmFzZSYgb3BlcmF0b3IgPSAoY29uc3QgTWV0YURhdGFCYXNlICYpOworCisgICAgdmlydHVhbCB+TWV0YURhdGFCYXNlKCk7CisKKyAgICBlbnVtIFR5cGUgeworICAgICAgICBUWVBFX05PTkUgICAgID0gJ25vbmUnLAorICAgICAgICBUWVBFX0NfU1RSSU5HID0gJ2NzdHInLAorICAgICAgICBUWVBFX0lOVDMyICAgID0gJ2luMzInLAorICAgICAgICBUWVBFX0lOVDY0ICAgID0gJ2luNjQnLAorICAgICAgICBUWVBFX0ZMT0FUICAgID0gJ2Zsb2EnLAorICAgICAgICBUWVBFX1BPSU5URVIgID0gJ3B0ciAnLAorICAgICAgICBUWVBFX1JFQ1QgICAgID0gJ3JlY3QnLAorICAgIH07CisKKyAgICB2b2lkIGNsZWFyKCk7CisgICAgYm9vbCByZW1vdmUodWludDMyX3Qga2V5KTsKKworICAgIGJvb2wgc2V0Q1N0cmluZyh1aW50MzJfdCBrZXksIGNvbnN0IGNoYXIgKnZhbHVlKTsKKyAgICBib29sIHNldEludDMyKHVpbnQzMl90IGtleSwgaW50MzJfdCB2YWx1ZSk7CisgICAgYm9vbCBzZXRJbnQ2NCh1aW50MzJfdCBrZXksIGludDY0X3QgdmFsdWUpOworICAgIGJvb2wgc2V0RmxvYXQodWludDMyX3Qga2V5LCBmbG9hdCB2YWx1ZSk7CisgICAgYm9vbCBzZXRQb2ludGVyKHVpbnQzMl90IGtleSwgdm9pZCAqdmFsdWUpOworCisgICAgYm9vbCBzZXRSZWN0KAorICAgICAgICAgICAgdWludDMyX3Qga2V5LAorICAgICAgICAgICAgaW50MzJfdCBsZWZ0LCBpbnQzMl90IHRvcCwKKyAgICAgICAgICAgIGludDMyX3QgcmlnaHQsIGludDMyX3QgYm90dG9tKTsKKworICAgIGJvb2wgZmluZENTdHJpbmcodWludDMyX3Qga2V5LCBjb25zdCBjaGFyICoqdmFsdWUpIGNvbnN0OworICAgIGJvb2wgZmluZEludDMyKHVpbnQzMl90IGtleSwgaW50MzJfdCAqdmFsdWUpIGNvbnN0OworICAgIGJvb2wgZmluZEludDY0KHVpbnQzMl90IGtleSwgaW50NjRfdCAqdmFsdWUpIGNvbnN0OworICAgIGJvb2wgZmluZEZsb2F0KHVpbnQzMl90IGtleSwgZmxvYXQgKnZhbHVlKSBjb25zdDsKKyAgICBib29sIGZpbmRQb2ludGVyKHVpbnQzMl90IGtleSwgdm9pZCAqKnZhbHVlKSBjb25zdDsKKworICAgIGJvb2wgZmluZFJlY3QoCisgICAgICAgICAgICB1aW50MzJfdCBrZXksCisgICAgICAgICAgICBpbnQzMl90ICpsZWZ0LCBpbnQzMl90ICp0b3AsCisgICAgICAgICAgICBpbnQzMl90ICpyaWdodCwgaW50MzJfdCAqYm90dG9tKSBjb25zdDsKKworICAgIGJvb2wgc2V0RGF0YSh1aW50MzJfdCBrZXksIHVpbnQzMl90IHR5cGUsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIGJvb2wgZmluZERhdGEodWludDMyX3Qga2V5LCB1aW50MzJfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKipkYXRhLCBzaXplX3QgKnNpemUpIGNvbnN0OworCisgICAgYm9vbCBoYXNEYXRhKHVpbnQzMl90IGtleSkgY29uc3Q7CisKKyAgICBTdHJpbmc4IHRvU3RyaW5nKCkgY29uc3Q7CisgICAgdm9pZCBkdW1wVG9Mb2coKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgQnBNZWRpYVNvdXJjZTsKKyAgICBmcmllbmQgY2xhc3MgQm5NZWRpYVNvdXJjZTsKKyAgICBmcmllbmQgY2xhc3MgQm5NZWRpYUV4dHJhY3RvcjsKKyAgICBmcmllbmQgY2xhc3MgTWV0YURhdGE7CisKKyAgICBzdHJ1Y3QgdHlwZWRfZGF0YTsKKyAgICBzdHJ1Y3QgUmVjdDsKKyAgICBzdHJ1Y3QgTWV0YURhdGFJbnRlcm5hbDsKKyAgICBNZXRhRGF0YUludGVybmFsICptSW50ZXJuYWxEYXRhOworICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICZwYXJjZWwpOworICAgIHN0YXR1c190IHVwZGF0ZUZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRVRBX0RBVEFfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmgKaW5kZXggZDVhODA4MC4uZGNhZjI3ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmgKQEAgLTIwLDEzICsyMCwyNCBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KIAorc3RydWN0IEFNZWRpYUZvcm1hdDsKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQUJ1ZmZlcjsKIGJvb2wgTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSwgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworYm9vbCBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKK2Jvb2wgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSwgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOwogYm9vbCBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoTWV0YURhdGFCYXNlICZtZXRhLCB1bnNpZ25lZCBwcm9maWxlLCB1bnNpZ25lZCBzYW1wbGluZ19mcmVxX2luZGV4LAogICAgICAgICB1bnNpZ25lZCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pOwogCitib29sIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHVuc2lnbmVkIHByb2ZpbGUsIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXgsCisgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbik7CisKK3ZvaWQgcGFyc2VWb3JiaXNDb21tZW50KAorICAgICAgICBBTWVkaWFGb3JtYXQgKmZpbGVNZXRhLCBjb25zdCBjaGFyICpjb21tZW50LCBzaXplX3QgY29tbWVudExlbmd0aCk7CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gTUVUQV9EQVRBX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oCmluZGV4IDU0YTcwOTUuLjQzMDcxMTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTnVNZWRpYUV4dHJhY3Rvci5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8bGlzdD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CkBAIC02NCw4ICs2NSw2IEBACiAKICAgICBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCBISW50ZXJmYWNlVG9rZW4gJmNhc1Rva2VuKTsKIAotICAgIHZvaWQgZGlzY29ubmVjdCgpOwotCiAgICAgc2l6ZV90IGNvdW50VHJhY2tzKCkgY29uc3Q7CiAgICAgc3RhdHVzX3QgZ2V0VHJhY2tGb3JtYXQoc2l6ZV90IGluZGV4LCBzcDxBTWVzc2FnZT4gKmZvcm1hdCwgdWludDMyX3QgZmxhZ3MgPSAwKSBjb25zdDsKIApAQCAtOTcsNiArOTYsOCBAQAogCiAgICAgYm9vbCBnZXRDYWNoZWREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzLCBib29sICplb3MpIGNvbnN0OwogCisgICAgc3RhdHVzX3QgZ2V0QXVkaW9QcmVzZW50YXRpb25zKHNpemVfdCB0cmFja0lkeCwgQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uICpwcmVzZW50YXRpb25zKTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk51TWVkaWFFeHRyYWN0b3IoKTsKIApAQCAtMTQ4LDcgKzE0OSw2IEBACiAgICAgICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGUgPQogICAgICAgICAgICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkMpOwogCi0gICAgdm9pZCByZWxlYXNlT25lU2FtcGxlKFRyYWNrSW5mbyAqaW5mbyk7CiAgICAgdm9pZCByZWxlYXNlVHJhY2tTYW1wbGVzKFRyYWNrSW5mbyAqaW5mbyk7CiAgICAgdm9pZCByZWxlYXNlQWxsVHJhY2tTYW1wbGVzKCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT2dnV3JpdGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09nZ1dyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzODM3Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09nZ1dyaXRlci5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE9HR19XUklURVJfSF8KKworI2RlZmluZSBPR0dfV1JJVEVSX0hfCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKK3N0cnVjdCBPZ2dTdHJlYW1TdGF0ZTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgT2dnV3JpdGVyIDogcHVibGljIE1lZGlhV3JpdGVyIHsKKyAgICBPZ2dXcml0ZXIoaW50IGZkKTsKKworICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+JiBzb3VyY2UpOworICAgIHZpcnR1YWwgYm9vbCByZWFjaGVkRU9TKCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YSogcGFyYW1zID0gTlVMTCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgeyByZXR1cm4gcmVzZXQoKTsgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKKworcHJvdGVjdGVkOgorICAgIH5PZ2dXcml0ZXIoKTsKKworcHJpdmF0ZToKKyAgICBpbnQgbUZkOworICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CisgICAgc3A8TWVkaWFTb3VyY2U+IG1Tb3VyY2U7CisgICAgYm9vbCBtU3RhcnRlZCA9IGZhbHNlOworICAgIHZvbGF0aWxlIGJvb2wgbVBhdXNlZCA9IGZhbHNlOworICAgIHZvbGF0aWxlIGJvb2wgbVJlc3VtZWQgPSBmYWxzZTsKKyAgICB2b2xhdGlsZSBib29sIG1Eb25lOworICAgIHZvbGF0aWxlIGJvb2wgbVJlYWNoZWRFT1M7CisgICAgcHRocmVhZF90IG1UaHJlYWQ7CisgICAgaW50NjRfdCBtU2FtcGxlUmF0ZTsKKyAgICBpbnQ2NF90IG1Fc3RpbWF0ZWRTaXplQnl0ZXM7CisgICAgaW50NjRfdCBtRXN0aW1hdGVkRHVyYXRpb25VczsKKworICAgIHN0YXRpYyB2b2lkKiBUaHJlYWRXcmFwcGVyKHZvaWQqKTsKKyAgICBzdGF0dXNfdCB0aHJlYWRGdW5jKCk7CisgICAgYm9vbCBleGNlZWRzRmlsZVNpemVMaW1pdCgpOworICAgIGJvb2wgZXhjZWVkc0ZpbGVEdXJhdGlvbkxpbWl0KCk7CisgICAgc3RhdHVzX3QgcmVzZXQoKTsKKworICAgIGludDMyX3QgbUN1cnJlbnRQYWNrZXRJZDsKKyAgICBPZ2dTdHJlYW1TdGF0ZSogbU9zID0gbnVsbHB0cjsKKworICAgIE9nZ1dyaXRlcihjb25zdCBPZ2dXcml0ZXImKTsKKyAgICBPZ2dXcml0ZXImIG9wZXJhdG9yPShjb25zdCBPZ2dXcml0ZXImKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gT0dHX1dSSVRFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5oCmluZGV4IDI4ZjYwOTQuLjE0MTBhMTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmgKQEAgLTIzLDggKzIzLDExIEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIE9teEluZm9CdWlsZGVyIDogcHVibGljIE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2UgeworcHJpdmF0ZToKKyAgICBib29sIG1BbGxvd1N1cmZhY2VFbmNvZGVyczsgLy8gYWxsb3cgc3VyZmFjZSBlbmNvZGVycworCiBwdWJsaWM6Ci0gICAgT214SW5mb0J1aWxkZXIoKTsKKyAgICBleHBsaWNpdCBPbXhJbmZvQnVpbGRlcihib29sIGFsbG93U3VyZmFjZUVuY29kZXJzKTsKICAgICB+T214SW5mb0J1aWxkZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CiAgICAgc3RhdHVzX3QgYnVpbGRNZWRpYUNvZGVjTGlzdChNZWRpYUNvZGVjTGlzdFdyaXRlciogd3JpdGVyKSBvdmVycmlkZTsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmgKaW5kZXggNTA5ZTY2OS4uOTkyNTExNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFFeHRyYWN0b3IuaApAQCAtMTgsNyArMTgsNyBAQAogI2RlZmluZSBSRU1PVEVfTUVESUFfRVhUUkFDVE9SX0hfCiAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmgKaW5kZXggMWQ3MjBhZi4uMDNkMzg2OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuaApAQCAtMzcsMTIgKzM3LDEzIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAogICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLAogICAgICAgICAgICAgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBib29sIHN1cHBvcnROb25ibG9ja2luZ1JlYWQoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdG9wVGltZVVzKGludDY0X3Qgc3RvcFRpbWVVcyk7CiAKIHByaXZhdGU6CiAgICAgc3A8UmVtb3RlTWVkaWFFeHRyYWN0b3I+IG1FeHRyYWN0b3I7Ci0gICAgTWVkaWFUcmFjayAqbVNvdXJjZTsKKyAgICBNZWRpYVRyYWNrICptVHJhY2s7CiAgICAgc3A8UmVmQmFzZT4gbUV4dHJhY3RvclBsdWdpbjsKIAogICAgIGV4cGxpY2l0IFJlbW90ZU1lZGlhU291cmNlKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmgKaW5kZXggNjg5ZTQ1OC4uYWU1NWM2NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oCkBAIC0xOSw4ICsxOSwxMCBAQAogI2RlZmluZSBTVVJGQUNFX1VUSUxTX0hfCiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CiAKIHN0cnVjdCBBTmF0aXZlV2luZG93OworY2xhc3MgU3VyZmFjZTsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00MCw2ICs0MiwxNSBAQAogc3RhdHVzX3QgbmF0aXZlV2luZG93Q29ubmVjdChBTmF0aXZlV2luZG93ICpzdXJmYWNlLCBjb25zdCBjaGFyICpyZWFzb24pOwogc3RhdHVzX3QgbmF0aXZlV2luZG93RGlzY29ubmVjdChBTmF0aXZlV2luZG93ICpzdXJmYWNlLCBjb25zdCBjaGFyICpyZWFzb24pOwogCisvKioKKyAqIERpc2FibGUgYnVmZmVyIGRyb3BwaW5nIGJlaGF2aW9yIG9mIEJ1ZmZlclF1ZXVlIGlmIHRhcmdldCBzZGsgb2YgYXBwbGljYXRpb24KKyAqIGlzIFEgb3IgbGF0ZXIuIElmIHRoZSBjYWxsZXIgaXMgbm90IGFuIGFwcCAoZS5nLiBNZWRpYVBsYXllciBpbiBtZWRpYXNlcnZlcikKKyAqIHJldGFpbiBidWZmZXIgZHJvcHBpbmcgYmVoYXZpb3IuCisgKgorICogQHJldHVybiBOT19FUlJPUgorICovCitzdGF0dXNfdCBkaXNhYmxlTGVnYWN5QnVmZmVyRHJvcFBvc3RRKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKTsKKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIFNVUkZBQ0VfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaAppbmRleCA2YTI4ZTBiLi5lOGUwYTExIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oCkBAIC0zMCw2ICszMCw4IEBACiAKIHN0cnVjdCBBTWVzc2FnZTsKIHN0YXR1c190IGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZSgKKyAgICAgICAgY29uc3QgTWV0YURhdGFCYXNlICptZXRhLCBzcDxBTWVzc2FnZT4gKmZvcm1hdCk7CitzdGF0dXNfdCBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UoCiAgICAgICAgIGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQpOwogdm9pZCBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGEoCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBzcDxNZXRhRGF0YT4gJm1ldGEpOwpAQCAtNTAsNiArNTIsMTAgQEAKIC8vIFNlbmQgaW5mb3JtYXRpb24gZnJvbSBNZXRhRGF0YSB0byB0aGUgSEFMIHZpYSBBdWRpb1NpbmsKIHN0YXR1c190IHNlbmRNZXRhRGF0YVRvSGFsKHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiYgc2luaywgY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKTsKIAorLy8gUmV0dXJuIHxhdWRpb19vZmZsb2FkX2luZm9fdHwgZmlsbGVkIGZyb20gZ2l2ZW4gbWV0YWRhdGEKK3N0YXR1c190IGdldEF1ZGlvT2ZmbG9hZEluZm8oY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBib29sIGhhc1ZpZGVvLAorICAgICAgICBib29sIGlzU3RyZWFtaW5nLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsIGF1ZGlvX29mZmxvYWRfaW5mb190ICppbmZvKTsKKwogLy8gQ2hlY2sgd2hldGhlciB0aGUgc3RyZWFtIGRlZmluZWQgYnkgbWV0YSBjYW4gYmUgb2ZmbG9hZGVkIHRvIGhhcmR3YXJlCiBib29sIGNhbk9mZmxvYWRTdHJlYW0oY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBib29sIGhhc1ZpZGVvLAogICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5oCmluZGV4IDlkOTdkZmQuLmZjZmNiZWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDE0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTcsODcgKzE3LDI0IEBACiAjaWZuZGVmIFZJREVPX0ZSQU1FX1NDSEVEVUxFUl9IXwogI2RlZmluZSBWSURFT19GUkFNRV9TQ0hFRFVMRVJfSF8KIAotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIElTdXJmYWNlQ29tcG9zZXI7CiAKLXN0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyIDogcHVibGljIFJlZkJhc2Ugeworc3RydWN0IFZpZGVvRnJhbWVTY2hlZHVsZXIgOiBwdWJsaWMgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UgewogICAgIFZpZGVvRnJhbWVTY2hlZHVsZXIoKTsKLQotICAgIC8vIChyZSlpbml0aWFsaXplIHNjaGVkdWxlcgotICAgIHZvaWQgaW5pdChmbG9hdCB2aWRlb0ZwcyA9IC0xKTsKLSAgICAvLyB1c2UgaW4gY2FzZSBvZiB2aWRlbyByZW5kZXItdGltZSBkaXNjb250aW51aXR5LCBlLmcuIHNlZWsKLSAgICB2b2lkIHJlc3RhcnQoKTsKLSAgICAvLyBnZXQgYWRqdXN0ZWQgbmFub3RpbWUgZm9yIGEgdmlkZW8gZnJhbWUgcmVuZGVyIGF0IHJlbmRlclRpbWUKLSAgICBuc2Vjc190IHNjaGVkdWxlKG5zZWNzX3QgcmVuZGVyVGltZSk7Ci0KLSAgICAvLyByZXR1cm5zIHRoZSB2c3luYyBwZXJpb2QgZm9yIHRoZSBtYWluIGRpc3BsYXkKLSAgICBuc2Vjc190IGdldFZzeW5jUGVyaW9kKCk7Ci0KLSAgICAvLyByZXR1cm5zIHRoZSBjdXJyZW50IGZyYW1lcy1wZXItc2Vjb25kLCBvciAwLmYgaWYgbm90IHByaW1lZAotICAgIGZsb2F0IGdldEZyYW1lUmF0ZSgpOwotCi0gICAgdm9pZCByZWxlYXNlKCk7Ci0KLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtIaXN0b3J5U2l6ZSA9IDg7CisgICAgdm9pZCByZWxlYXNlKCkgb3ZlcnJpZGU7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5WaWRlb0ZyYW1lU2NoZWR1bGVyKCk7CiAKIHByaXZhdGU6Ci0gICAgc3RydWN0IFBMTCB7Ci0gICAgICAgIFBMTCgpOwotCi0gICAgICAgIC8vIHJlc2V0IFBMTCB0byBuZXcgUExMCi0gICAgICAgIHZvaWQgcmVzZXQoZmxvYXQgZnBzID0gLTEpOwotICAgICAgICAvLyBrZWVwIGN1cnJlbnQgZXN0aW1hdGUsIGJ1dCByZXN0YXJ0IHBoYXNlCi0gICAgICAgIHZvaWQgcmVzdGFydCgpOwotICAgICAgICAvLyByZXR1cm5zIHBlcmlvZCBvciAwIGlmIG5vdCB5ZXQgcHJpbWVkCi0gICAgICAgIG5zZWNzX3QgYWRkU2FtcGxlKG5zZWNzX3QgdGltZSk7Ci0gICAgICAgIG5zZWNzX3QgZ2V0UGVyaW9kKCkgY29uc3Q7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBuc2Vjc190IG1QZXJpb2Q7Ci0gICAgICAgIG5zZWNzX3QgbVBoYXNlOwotCi0gICAgICAgIGJvb2wgICAgbVByaW1lZDsgICAgICAgIC8vIGhhdmUgYW4gZXN0aW1hdGUgZm9yIHRoZSBwZXJpb2QKLSAgICAgICAgc2l6ZV90ICBtU2FtcGxlc1VzZWRGb3JQcmltaW5nOwotCi0gICAgICAgIG5zZWNzX3QgbUxhc3RUaW1lOyAgICAgIC8vIGxhc3QgaW5wdXQgdGltZQotICAgICAgICBuc2Vjc190IG1SZWZpdEF0OyAgICAgICAvLyBuZXh0IGlucHV0IHRpbWUgdG8gZml0IGF0Ci0KLSAgICAgICAgc2l6ZV90ICBtTnVtU2FtcGxlczsgICAgLy8gY2FuIGdvIHBhc3Qga0hpc3RvcnlTaXplCi0gICAgICAgIG5zZWNzX3QgbVRpbWVzW2tIaXN0b3J5U2l6ZV07Ci0KLSAgICAgICAgdm9pZCB0ZXN0KCk7Ci0gICAgICAgIC8vIHJldHVybnMgd2hldGhlciBmaXQgd2FzIHN1Y2Nlc3NmdWwKLSAgICAgICAgYm9vbCBmaXQobnNlY3NfdCBwaGFzZSwgbnNlY3NfdCBwZXJpb2QsIHNpemVfdCBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgIGludDY0X3QgKmEsIGludDY0X3QgKmIsIGludDY0X3QgKmVycik7Ci0gICAgICAgIHZvaWQgcHJpbWUoc2l6ZV90IG51bVNhbXBsZXMpOwotICAgIH07Ci0KLSAgICB2b2lkIHVwZGF0ZVZzeW5jKCk7Ci0KLSAgICBuc2Vjc190IG1Wc3luY1RpbWU7ICAgICAgICAvLyB2c3luYyB0aW1pbmcgZnJvbSBkaXNwbGF5Ci0gICAgbnNlY3NfdCBtVnN5bmNQZXJpb2Q7Ci0gICAgbnNlY3NfdCBtVnN5bmNSZWZyZXNoQXQ7ICAgLy8gbmV4dCB0aW1lIHRvIHJlZnJlc2ggdGltaW5nIGluZm8KLQotICAgIG5zZWNzX3QgbUxhc3RWc3luY1RpbWU7ICAgIC8vIGVzdGltYXRlZCB2c3luYyB0aW1lIGZvciBsYXN0IGZyYW1lCi0gICAgbnNlY3NfdCBtVGltZUNvcnJlY3Rpb247ICAgLy8gcnVubmluZyBhZGp1c3RtZW50Ci0KLSAgICBQTEwgbVBsbDsgICAgICAgICAgICAgICAgICAvLyBQTEwgZm9yIHZpZGVvIGZyYW1lIHJhdGUgYmFzZWQgb24gcmVuZGVyIHRpbWUKLQorICAgIHZvaWQgdXBkYXRlVnN5bmMoKSBvdmVycmlkZTsKICAgICBzcDxJU3VyZmFjZUNvbXBvc2VyPiBtQ29tcG9zZXI7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhWaWRlb0ZyYW1lU2NoZWR1bGVyKTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gVklERU9fRlJBTUVfU0NIRURVTEVSX0hfCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlcjIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlcjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTFiOWEwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyMi5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVklERU9fRlJBTUVfU0NIRURVTEVSXzJfSF8KKyNkZWZpbmUgVklERU9fRlJBTUVfU0NIRURVTEVSXzJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgVnN5bmNUcmFja2VyOworc3RydWN0IENob3Jlb2dyYXBoZXJUaHJlYWQ7CisKK3N0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyMiA6IHB1YmxpYyBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSB7CisgICAgVmlkZW9GcmFtZVNjaGVkdWxlcjIoKTsKKyAgICB2b2lkIHJlbGVhc2UoKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflZpZGVvRnJhbWVTY2hlZHVsZXIyKCk7CisKK3ByaXZhdGU6CisgICAgdm9pZCB1cGRhdGVWc3luYygpIG92ZXJyaWRlOworCisgICAgbnNlY3NfdCBtQXBwVnN5bmNPZmZzZXQ7CisgICAgbnNlY3NfdCBtU2ZWc3luY09mZnNldDsKKyAgICBzcDxWc3luY1RyYWNrZXI+IG1Wc3luY1RyYWNrZXI7CisgICAgc3A8Q2hvcmVvZ3JhcGhlclRocmVhZD4gbUNob3Jlb2dyYXBoZXJUaHJlYWQ7CisgICAgTXV0ZXggbUxvY2s7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFZJREVPX0ZSQU1FX1NDSEVEVUxFUl8yX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY1ZjcxNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UuaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBWSURFT19GUkFNRV9TQ0hFRFVMRVJfQkFTRV9IXworI2RlZmluZSBWSURFT19GUkFNRV9TQ0hFRFVMRVJfQkFTRV9IXworCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSgpOworCisgICAgLy8gKHJlKWluaXRpYWxpemUgc2NoZWR1bGVyCisgICAgdm9pZCBpbml0KGZsb2F0IHZpZGVvRnBzID0gLTEpOworICAgIC8vIHVzZSBpbiBjYXNlIG9mIHZpZGVvIHJlbmRlci10aW1lIGRpc2NvbnRpbnVpdHksIGUuZy4gc2VlaworICAgIHZvaWQgcmVzdGFydCgpOworICAgIC8vIGdldCBhZGp1c3RlZCBuYW5vdGltZSBmb3IgYSB2aWRlbyBmcmFtZSByZW5kZXIgYXQgcmVuZGVyVGltZQorICAgIG5zZWNzX3Qgc2NoZWR1bGUobnNlY3NfdCByZW5kZXJUaW1lKTsKKworICAgIC8vIHJldHVybnMgdGhlIHZzeW5jIHBlcmlvZCBmb3IgdGhlIG1haW4gZGlzcGxheQorICAgIG5zZWNzX3QgZ2V0VnN5bmNQZXJpb2QoKTsKKworICAgIC8vIHJldHVybnMgdGhlIGN1cnJlbnQgZnJhbWVzLXBlci1zZWNvbmQsIG9yIDAuZiBpZiBub3QgcHJpbWVkCisgICAgZmxvYXQgZ2V0RnJhbWVSYXRlKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpID0gMDsKKworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0hpc3RvcnlTaXplID0gODsKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrTmFub3NJbjFzID0gMTAwMDAwMDAwMDsKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrRGVmYXVsdFZzeW5jUGVyaW9kID0ga05hbm9zSW4xcyAvIDYwOyAgLy8gNjBIegorICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtWc3luY1JlZnJlc2hQZXJpb2QgPSBrTmFub3NJbjFzOyAgICAgICAvLyAxIHNlYworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+VmlkZW9GcmFtZVNjaGVkdWxlckJhc2UoKTsKKworICAgIG5zZWNzX3QgbVZzeW5jVGltZTsgICAgICAgIC8vIHZzeW5jIHRpbWluZyBmcm9tIGRpc3BsYXkKKyAgICBuc2Vjc190IG1Wc3luY1BlcmlvZDsKKyAgICBuc2Vjc190IG1Wc3luY1JlZnJlc2hBdDsgICAvLyBuZXh0IHRpbWUgdG8gcmVmcmVzaCB0aW1pbmcgaW5mbworCitwcml2YXRlOgorICAgIHN0cnVjdCBQTEwgeworICAgICAgICBQTEwoKTsKKworICAgICAgICAvLyByZXNldCBQTEwgdG8gbmV3IFBMTAorICAgICAgICB2b2lkIHJlc2V0KGZsb2F0IGZwcyA9IC0xKTsKKyAgICAgICAgLy8ga2VlcCBjdXJyZW50IGVzdGltYXRlLCBidXQgcmVzdGFydCBwaGFzZQorICAgICAgICB2b2lkIHJlc3RhcnQoKTsKKyAgICAgICAgLy8gcmV0dXJucyBwZXJpb2Qgb3IgMCBpZiBub3QgeWV0IHByaW1lZAorICAgICAgICBuc2Vjc190IGFkZFNhbXBsZShuc2Vjc190IHRpbWUpOworICAgICAgICBuc2Vjc190IGdldFBlcmlvZCgpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgbnNlY3NfdCBtUGVyaW9kOworICAgICAgICBuc2Vjc190IG1QaGFzZTsKKworICAgICAgICBib29sICAgIG1QcmltZWQ7ICAgICAgICAvLyBoYXZlIGFuIGVzdGltYXRlIGZvciB0aGUgcGVyaW9kCisgICAgICAgIHNpemVfdCAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZzsKKworICAgICAgICBuc2Vjc190IG1MYXN0VGltZTsgICAgICAvLyBsYXN0IGlucHV0IHRpbWUKKyAgICAgICAgbnNlY3NfdCBtUmVmaXRBdDsgICAgICAgLy8gbmV4dCBpbnB1dCB0aW1lIHRvIGZpdCBhdAorCisgICAgICAgIHNpemVfdCAgbU51bVNhbXBsZXM7ICAgIC8vIGNhbiBnbyBwYXN0IGtIaXN0b3J5U2l6ZQorICAgICAgICBuc2Vjc190IG1UaW1lc1trSGlzdG9yeVNpemVdOworCisgICAgICAgIHZvaWQgdGVzdCgpOworICAgICAgICAvLyByZXR1cm5zIHdoZXRoZXIgZml0IHdhcyBzdWNjZXNzZnVsCisgICAgICAgIGJvb2wgZml0KG5zZWNzX3QgcGhhc2UsIG5zZWNzX3QgcGVyaW9kLCBzaXplX3QgbnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICBpbnQ2NF90ICphLCBpbnQ2NF90ICpiLCBpbnQ2NF90ICplcnIpOworICAgICAgICB2b2lkIHByaW1lKHNpemVfdCBudW1TYW1wbGVzKTsKKyAgICB9OworCisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZVZzeW5jKCkgPSAwOworCisgICAgbnNlY3NfdCBtTGFzdFZzeW5jVGltZTsgICAgLy8gZXN0aW1hdGVkIHZzeW5jIHRpbWUgZm9yIGxhc3QgZnJhbWUKKyAgICBuc2Vjc190IG1UaW1lQ29ycmVjdGlvbjsgICAvLyBydW5uaW5nIGFkanVzdG1lbnQKKyAgICBQTEwgbVBsbDsgICAgICAgICAgICAgICAgICAvLyBQTEwgZm9yIHZpZGVvIGZyYW1lIHJhdGUgYmFzZWQgb24gcmVuZGVyIHRpbWUKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gVklERU9fRlJBTUVfU0NIRURVTEVSX0JBU0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcAppbmRleCA1Y2M1MDkzLi4xNDgyMDcyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCkBAIC0yMywxMCArMjMsMTAgQEAKICNpbmNsdWRlICJFU1F1ZXVlLmgiCiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy9uYXRpdmUvMS4wL0lEZXNjcmFtYmxlci5oPgotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+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+c2V0QXVkaW9QcmVzZW50YXRpb25zKGluZm8ubUF1ZGlvUHJlc2VudGF0aW9ucyk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoaXNBZGRpbmdTY3JhbWJsZWRTdHJlYW0pIHsKQEAgLTYyNSwyMSArNzYxLDIxIEBACiAgICAgLy8gcmVhc29uYWJsZSBhbW91bnQgb2YgdGltZS4gVG8gaGFuZGxlIHRoZSB3cmFwLWFyb3VuZCwgdXNlIGZhbmN5IG1hdGgKICAgICAvLyB0byBnZXQgYW4gZXh0ZW5kZWQgUFRTIHRoYXQgaXMgd2l0aGluIFstMHhmZmZmZmZmZiwgMHhmZmZmZmZmZl0KICAgICAvLyBvZiB0aGUgbGF0ZXN0IHJlY292ZXJlZCBQVFMuCi0gICAgaWYgKG1MYXN0UmVjb3ZlcmVkUFRTIDwgMGxsKSB7CisgICAgaWYgKG1MYXN0UmVjb3ZlcmVkUFRTIDwgMExMKSB7CiAgICAgICAgIC8vIFVzZSB0aGUgb3JpZ2luYWwgMzNiaXQgbnVtYmVyIGZvciAxc3QgZnJhbWUsIHRoZSByZWFzb24gaXMgdGhhdAogICAgICAgICAvLyBpZiAxc3QgZnJhbWUgd3JhcHMgdG8gbmVnYXRpdmUgdGhhdCdzIGZhciBhd2F5IGZyb20gMCwgd2UgY291bGQKICAgICAgICAgLy8gbmV2ZXIgc3RhcnQuIE9ubHkgc3RhcnQgd3JhcHBpbmcgYXJvdW5kIGZyb20gMm5kIGZyYW1lLgogICAgICAgICBtTGFzdFJlY292ZXJlZFBUUyA9IHN0YXRpY19jYXN0PGludDY0X3Q+KFBUU18zM2JpdCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUxhc3RSZWNvdmVyZWRQVFMgPSBzdGF0aWNfY2FzdDxpbnQ2NF90PigKLSAgICAgICAgICAgICAgICAoKG1MYXN0UmVjb3ZlcmVkUFRTIC0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oUFRTXzMzYml0KSArIDB4MTAwMDAwMDAwbGwpCisgICAgICAgICAgICAgICAgKChtTGFzdFJlY292ZXJlZFBUUyAtIHN0YXRpY19jYXN0PGludDY0X3Q+KFBUU18zM2JpdCkgKyAweDEwMDAwMDAwMExMKQogICAgICAgICAgICAgICAgICYgMHhmZmZmZmZmZTAwMDAwMDAwdWxsKSB8IFBUU18zM2JpdCk7CiAgICAgICAgIC8vIFdlIHN0YXJ0IGZyb20gMCwgYnV0IHJlY292ZXJlZCBQVFMgY291bGQgYmUgc2xpZ2h0bHkgYmVsb3cgMC4KICAgICAgICAgLy8gQ2xhbXAgaXQgdG8gMCBhcyByZXN0IG9mIHRoZSBwaXBlbGluZSBkb2Vzbid0IHRha2UgbmVnYXRpdmUgcHRzLgogICAgICAgICAvLyAoZWcuIHZpZGVvIGlzIHJlYWQgZmlyc3QgYW5kIHN0YXJ0cyBhdCAwLCBidXQgYXVkaW8gc3RhcnRzIGF0IDB4ZmZmZmZmZjApCi0gICAgICAgIGlmIChtTGFzdFJlY292ZXJlZFBUUyA8IDBsbCkgeworICAgICAgICBpZiAobUxhc3RSZWNvdmVyZWRQVFMgPCAwTEwpIHsKICAgICAgICAgICAgIEFMT0dJKCJDbGFtcGluZyBuZWdhdGl2ZSByZWNvdmVyZWQgUFRTICglIiBQUklkNjQgIikgdG8gMCIsIG1MYXN0UmVjb3ZlcmVkUFRTKTsKLSAgICAgICAgICAgIG1MYXN0UmVjb3ZlcmVkUFRTID0gMGxsOworICAgICAgICAgICAgbUxhc3RSZWNvdmVyZWRQVFMgPSAwTEw7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTY4OSw3ICs4MjUsNyBAQAogCiAgICAgaW50NjRfdCB0aW1lVXMgPSAoUFRTICogMTAwKSAvIDk7CiAKLSAgICBpZiAobVBhcnNlci0+bUFic29sdXRlVGltZUFuY2hvclVzID49IDBsbCkgeworICAgIGlmIChtUGFyc2VyLT5tQWJzb2x1dGVUaW1lQW5jaG9yVXMgPj0gMExMKSB7CiAgICAgICAgIHRpbWVVcyArPSBtUGFyc2VyLT5tQWJzb2x1dGVUaW1lQW5jaG9yVXM7CiAgICAgfQogCkBAIC03MTcsMzQgKzg1MywzMyBAQAogc3RhdGljIGNvbnN0IHNpemVfdCBrSW5pdGlhbFN0cmVhbUJ1ZmZlclNpemUgPSAxOTIgKiAxMDI0OwogCiBBVFNQYXJzZXI6OlN0cmVhbTo6U3RyZWFtKAotICAgICAgICBQcm9ncmFtICpwcm9ncmFtLAotICAgICAgICB1bnNpZ25lZCBlbGVtZW50YXJ5UElELAotICAgICAgICB1bnNpZ25lZCBzdHJlYW1UeXBlLAotICAgICAgICB1bnNpZ25lZCBQQ1JfUElELAotICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9JRCkKKyAgICAgICAgUHJvZ3JhbSAqcHJvZ3JhbSwgdW5zaWduZWQgUENSX1BJRCwgY29uc3QgU3RyZWFtSW5mbyAmaW5mbykKICAgICA6IG1Qcm9ncmFtKHByb2dyYW0pLAotICAgICAgbUVsZW1lbnRhcnlQSUQoZWxlbWVudGFyeVBJRCksCi0gICAgICBtU3RyZWFtVHlwZShzdHJlYW1UeXBlKSwKKyAgICAgIG1FbGVtZW50YXJ5UElEKGluZm8ubVBJRCksCisgICAgICBtU3RyZWFtVHlwZShpbmZvLm1UeXBlKSwKKyAgICAgIG1TdHJlYW1UeXBlRXh0KGluZm8ubVR5cGVFeHQpLAogICAgICAgbVBDUl9QSUQoUENSX1BJRCksCiAgICAgICBtRXhwZWN0ZWRDb250aW51aXR5Q291bnRlcigtMSksCiAgICAgICBtUGF5bG9hZFN0YXJ0ZWQoZmFsc2UpLAogICAgICAgbUVPU1JlYWNoZWQoZmFsc2UpLAogICAgICAgbVByZXZQVFMoMCksCiAgICAgICBtUXVldWUoTlVMTCksCi0gICAgICBtU2NyYW1ibGVkKENBX3N5c3RlbV9JRCA+PSAwKSB7Ci0KKyAgICAgIG1TY3JhbWJsZWQoaW5mby5tQ0FEZXNjcmlwdG9yLm1TeXN0ZW1JRCA+PSAwKSwKKyAgICAgIG1BdWRpb1ByZXNlbnRhdGlvbnMoaW5mby5tQXVkaW9QcmVzZW50YXRpb25zKSB7CiAgICAgbVNhbXBsZUVuY3J5cHRlZCA9CiAgICAgICAgICAgICBtU3RyZWFtVHlwZSA9PSBTVFJFQU1UWVBFX0gyNjRfRU5DUllQVEVEIHx8CiAgICAgICAgICAgICBtU3RyZWFtVHlwZSA9PSBTVFJFQU1UWVBFX0FBQ19FTkNSWVBURUQgIHx8CiAgICAgICAgICAgICBtU3RyZWFtVHlwZSA9PSBTVFJFQU1UWVBFX0FDM19FTkNSWVBURUQ7CiAKICAgICBBTE9HVigibmV3IHN0cmVhbSBQSUQgMHglMDJ4LCB0eXBlIDB4JTAyeCwgc2NyYW1ibGVkICVkLCBTYW1wbGVFbmNyeXB0ZWQ6ICVkIiwKLSAgICAgICAgICAgIGVsZW1lbnRhcnlQSUQsIHN0cmVhbVR5cGUsIG1TY3JhbWJsZWQsIG1TYW1wbGVFbmNyeXB0ZWQpOworICAgICAgICAgICAgaW5mby5tUElELCBpbmZvLm1UeXBlLCBtU2NyYW1ibGVkLCBtU2FtcGxlRW5jcnlwdGVkKTsKIAotICAgIHVpbnQzMl90IGZsYWdzID0KLSAgICAgICAgICAgIChpc1ZpZGVvKCkgJiYgbVNjcmFtYmxlZCkgPyBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmtGbGFnX1NjcmFtYmxlZERhdGEgOgotICAgICAgICAgICAgKG1TYW1wbGVFbmNyeXB0ZWQpID8gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjprRmxhZ19TYW1wbGVFbmNyeXB0ZWREYXRhIDoKLSAgICAgICAgICAgIDA7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmICgoKGlzVmlkZW8oKSB8fCBpc0F1ZGlvKCkpICYmIG1TY3JhbWJsZWQpKSB7CisgICAgICAgIGZsYWdzID0gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjprRmxhZ19TY3JhbWJsZWREYXRhOworICAgIH0gZWxzZSBpZiAobVNhbXBsZUVuY3J5cHRlZCkgeworICAgICAgICBmbGFncyA9IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6a0ZsYWdfU2FtcGxlRW5jcnlwdGVkRGF0YTsKKyAgICB9CiAKICAgICBFbGVtZW50YXJ5U3RyZWFtUXVldWU6Ok1vZGUgbW9kZSA9IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6SU5WQUxJRDsKIApAQCAtNzgxLDEzICs5MTYsMjMgQEAKICAgICAgICAgICAgIG1vZGUgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OkFDMzsKICAgICAgICAgICAgIGJyZWFrOwogCisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9FQUMzOgorICAgICAgICAgICAgbW9kZSA9IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6RUFDMzsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9QRVNfUFJJVkFURV9EQVRBOgorICAgICAgICAgICAgaWYgKG1TdHJlYW1UeXBlRXh0ID09IEVYVF9ERVNDUklQVE9SX0RWQl9BQzQpIHsKKyAgICAgICAgICAgICAgICBtb2RlID0gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpBQzQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKwogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfTUVUQURBVEE6CiAgICAgICAgICAgICBtb2RlID0gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpNRVRBREFUQTsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HRSgic3RyZWFtIFBJRCAweCUwMnggaGFzIGludmFsaWQgc3RyZWFtIHR5cGUgMHglMDJ4IiwKLSAgICAgICAgICAgICAgICAgICAgZWxlbWVudGFyeVBJRCwgc3RyZWFtVHlwZSk7CisgICAgICAgICAgICAgICAgICAgIGluZm8ubVBJRCwgaW5mby5tVHlwZSk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC04MDcsNyArOTUyLDEzIEBACiAgICAgICAgICAgICAgICAgICAgIGlzQXVkaW8oKSA/IE1FRElBX01JTUVUWVBFX0FVRElPX1NDUkFNQkxFRAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBNRURJQV9NSU1FVFlQRV9WSURFT19TQ1JBTUJMRUQpOwogICAgICAgICAgICAgLy8gZm9yIE1lZGlhRXh0cmFjdG9yLkNhc0luZm8KLSAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlDQVN5c3RlbUlELCBDQV9zeXN0ZW1fSUQpOworICAgICAgICAgICAgY29uc3QgQ0FEZXNjcmlwdG9yICZkZXNjcmlwdG9yID0gaW5mby5tQ0FEZXNjcmlwdG9yOworICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNBU3lzdGVtSUQsIGRlc2NyaXB0b3IubVN5c3RlbUlEKTsKKworICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5Q0FQcml2YXRlRGF0YSwgMCwKKyAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5tUHJpdmF0ZURhdGEuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLm1Qcml2YXRlRGF0YS5zaXplKCkpOworCiAgICAgICAgICAgICBtU291cmNlID0gbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UobWV0YSk7CiAgICAgICAgIH0KICAgICB9CkBAIC04MjcsMTYgKzk3OCw0MyBAQAogICAgICAgICAgICAgbUJ1ZmZlciA9PSBOVUxMID8gMCA6IG1CdWZmZXItPmNhcGFjaXR5KCksIG5lZWRlZFNpemUsIG1TY3JhbWJsZWQpOwogCiAgICAgc3A8QUJ1ZmZlcj4gbmV3QnVmZmVyLCBuZXdTY3JhbWJsZWRCdWZmZXI7Ci0gICAgc3A8SU1lbW9yeT4gbmV3TWVtOwotICAgIHNwPE1lbW9yeURlYWxlcj4gbmV3RGVhbGVyOworICAgIHNwPFRNZW1vcnk+IG5ld01lbTsKICAgICBpZiAobVNjcmFtYmxlZCkgewotICAgICAgICBzaXplX3QgYWxpZ25tZW50ID0gTWVtb3J5RGVhbGVyOjpnZXRBbGxvY2F0aW9uQWxpZ25tZW50KCk7Ci0gICAgICAgIG5lZWRlZFNpemUgPSAobmVlZGVkU2l6ZSArIChhbGlnbm1lbnQgLSAxKSkgJiB+KGFsaWdubWVudCAtIDEpOwotICAgICAgICAvLyBBbGlnbiB0byBtdWx0aXBsZXMgb2YgNjRLLgotICAgICAgICBuZWVkZWRTaXplID0gKG5lZWRlZFNpemUgKyA2NTUzNSkgJiB+NjU1MzU7Ci0gICAgICAgIG5ld0RlYWxlciA9IG5ldyBNZW1vcnlEZWFsZXIobmVlZGVkU2l6ZSwgIkFUU1BhcnNlciIpOwotICAgICAgICBuZXdNZW0gPSBuZXdEZWFsZXItPmFsbG9jYXRlKG5lZWRlZFNpemUpOwotICAgICAgICBuZXdTY3JhbWJsZWRCdWZmZXIgPSBuZXcgQUJ1ZmZlcihuZXdNZW0tPnBvaW50ZXIoKSwgbmV3TWVtLT5zaXplKCkpOworICAgICAgICBpZiAobUhpZGxBbGxvY2F0b3IgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUhpZGxBbGxvY2F0b3IgPSBUQWxsb2NhdG9yOjpnZXRTZXJ2aWNlKCJhc2htZW0iKTsKKyAgICAgICAgICAgIGlmIChtSGlkbEFsbG9jYXRvciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIltzdHJlYW0gJWRdIGNhbid0IGdldCBoaWRsIGFsbG9jYXRvciIsIG1FbGVtZW50YXJ5UElEKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBoaWRsX21lbW9yeSBoaWRsTWVtVG9rZW47CisgICAgICAgIGJvb2wgc3VjY2VzczsKKyAgICAgICAgYXV0byB0cmFuc1N0YXR1cyA9IG1IaWRsQWxsb2NhdG9yLT5hbGxvY2F0ZSgKKyAgICAgICAgICAgICAgICBuZWVkZWRTaXplLAorICAgICAgICAgICAgICAgIFsmc3VjY2VzcywgJmhpZGxNZW1Ub2tlbl0oCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIHMsCisgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX21lbW9yeSBjb25zdCYgbSkgeworICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gczsKKyAgICAgICAgICAgICAgICAgICAgaGlkbE1lbVRva2VuID0gbTsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoIltzdHJlYW0gJWRdIGhpZGwgYWxsb2NhdG9yIGZhaWxlZCBhdCB0aGUgdHJhbnNwb3J0OiAlcyIsCisgICAgICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCB0cmFuc1N0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghc3VjY2VzcykgeworICAgICAgICAgICAgQUxPR0UoIltzdHJlYW0gJWRdIGhpZGwgYWxsb2NhdG9yIGZhaWxlZCIsIG1FbGVtZW50YXJ5UElEKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBuZXdNZW0gPSBtYXBNZW1vcnkoaGlkbE1lbVRva2VuKTsKKyAgICAgICAgaWYgKG5ld01lbSA9PSBudWxscHRyIHx8IG5ld01lbS0+Z2V0UG9pbnRlcigpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJbc3RyZWFtICVkXSBoaWRsIGZhaWxlZCB0byBtYXAgbWVtb3J5IiwgbUVsZW1lbnRhcnlQSUQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgbmV3U2NyYW1ibGVkQnVmZmVyID0gbmV3IEFCdWZmZXIobmV3TWVtLT5nZXRQb2ludGVyKCksIG5ld01lbS0+Z2V0U2l6ZSgpKTsKIAogICAgICAgICBpZiAobURlc2NyYW1ibGVkQnVmZmVyICE9IE5VTEwpIHsKICAgICAgICAgICAgIG1lbWNweShuZXdTY3JhbWJsZWRCdWZmZXItPmRhdGEoKSwKQEAgLTg0NSwyNCArMTAyMywxNSBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbmV3U2NyYW1ibGVkQnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKICAgICAgICAgfQotICAgICAgICBtTWVtID0gbmV3TWVtOwotICAgICAgICBtRGVhbGVyID0gbmV3RGVhbGVyOworICAgICAgICBtSGlkbE1lbW9yeSA9IG5ld01lbTsKICAgICAgICAgbURlc2NyYW1ibGVkQnVmZmVyID0gbmV3U2NyYW1ibGVkQnVmZmVyOwogCi0gICAgICAgIHNzaXplX3Qgb2Zmc2V0OwotICAgICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgICAgc3A8SU1lbW9yeUhlYXA+IGhlYXAgPSBuZXdNZW0tPmdldE1lbW9yeSgmb2Zmc2V0LCAmc2l6ZSk7Ci0gICAgICAgIGlmIChoZWFwID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQorICAgICAgICBtRGVzY3JhbWJsZXJTcmNCdWZmZXIuaGVhcEJhc2UgPSBoaWRsTWVtVG9rZW47CisgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5vZmZzZXQgPSAwVUxMOworICAgICAgICBtRGVzY3JhbWJsZXJTcmNCdWZmZXIuc2l6ZSA9ICAodWludDY0X3QpbmVlZGVkU2l6ZTsKIAotICAgICAgICBtSGlkbE1lbW9yeSA9IGZyb21IZWFwKGhlYXApOwotICAgICAgICBtRGVzY3JhbWJsZXJTcmNCdWZmZXIuaGVhcEJhc2UgPSAqbUhpZGxNZW1vcnk7Ci0gICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5vZmZzZXQgPSAodWludDY0X3QpIG9mZnNldDsKLSAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLnNpemUgPSAodWludDY0X3QpIHNpemU7Ci0KLSAgICAgICAgQUxPR0QoIltzdHJlYW0gJWRdIGNyZWF0ZWQgc2hhcmVkIGJ1ZmZlciBmb3IgZGVzY3JhbWJsaW5nLCBvZmZzZXQgJXpkLCBzaXplICV6dSIsCi0gICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIG9mZnNldCwgc2l6ZSk7CisgICAgICAgIEFMT0dEKCJbc3RyZWFtICVkXSBjcmVhdGVkIHNoYXJlZCBidWZmZXIgZm9yIGRlc2NyYW1ibGluZywgc2l6ZSAlenUiLAorICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCBuZWVkZWRTaXplKTsKICAgICB9IGVsc2UgewogICAgICAgICAvLyBBbGlnbiB0byBtdWx0aXBsZXMgb2YgNjRLLgogICAgICAgICBuZWVkZWRTaXplID0gKG5lZWRlZFNpemUgKyA2NTUzNSkgJiB+NjU1MzU7CkBAIC05ODYsOSArMTE1NSwxMiBAQAogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfTVBFRzJfQVVESU9fQURUUzoKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0xQQ01fQUMzOgogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfQUMzOgorICAgICAgICBjYXNlIFNUUkVBTVRZUEVfRUFDMzoKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0FBQ19FTkNSWVBURUQ6CiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9BQzNfRU5DUllQVEVEOgogICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9QRVNfUFJJVkFURV9EQVRBOgorICAgICAgICAgICAgcmV0dXJuIG1TdHJlYW1UeXBlRXh0ID09IEVYVF9ERVNDUklQVE9SX0RWQl9BQzQ7CiAKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKQEAgLTEzNDcsNyArMTUxOSw3IEBACiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAotICAgIGlmIChtRGVzY3JhbWJsZWRCdWZmZXIgPT0gTlVMTCB8fCBtTWVtID09IE5VTEwpIHsKKyAgICBpZiAobURlc2NyYW1ibGVkQnVmZmVyID09IE5VTEwgfHwgbUhpZGxNZW1vcnkgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgicmVjZWl2ZWQgc2NyYW1ibGVkIHBhY2tldHMgd2l0aG91dCBzaGFyZWQgbWVtb3J5ISIpOwogCiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwpAQCAtMTM5NSw3ICsxNTY3LDcgQEAKICAgICAvLyBQZXJmb3JtIHRoZSAxc3QgcGFzcyBkZXNjcmFtYmxpbmcgaWYgbmVlZGVkCiAgICAgaWYgKGRlc2NyYW1ibGVCeXRlcyA+IDApIHsKICAgICAgICAgbWVtY3B5KG1EZXNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5kYXRhKCksIGRlc2NyYW1ibGVCeXRlcyk7Ci0gICAgICAgIG1EZXNjcmFtYmxlZEJ1ZmZlci0+c2V0UmFuZ2UoMCwgZGVzY3JhbWJsZUJ5dGVzKTsKKyAgICAgICAgbURlc2NyYW1ibGVkQnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkpOwogCiAgICAgICAgIGhpZGxfdmVjPFN1YlNhbXBsZT4gc3ViU2FtcGxlczsKICAgICAgICAgc3ViU2FtcGxlcy5yZXNpemUoZGVzY3JhbWJsZVN1YlNhbXBsZXMpOwpAQCAtMTQxMiwxMCArMTU4NCw5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICB1aW50NjRfdCBzcmNPZmZzZXQgPSAwLCBkc3RPZmZzZXQgPSAwOwotICAgICAgICAvLyBJZiBzY3JhbWJsZWQgYXQgUEVTLWxldmVsLCBQRVMgaGVhZGVyIHNob3VsZCBiZSBza2lwcGVkCisgICAgICAgIC8vIElmIHNjcmFtYmxlZCBhdCBQRVMtbGV2ZWwsIFBFUyBoZWFkZXIgaXMgaW4gdGhlIGNsZWFyCiAgICAgICAgIGlmIChwZXNTY3JhbWJsaW5nQ29udHJvbCAhPSAwKSB7Ci0gICAgICAgICAgICBzcmNPZmZzZXQgPSBkc3RPZmZzZXQgPSBwZXNPZmZzZXQ7CisgICAgICAgICAgICBzdWJTYW1wbGVzWzBdLm51bUJ5dGVzT2ZDbGVhckRhdGEgPSBwZXNPZmZzZXQ7CiAgICAgICAgICAgICBzdWJTYW1wbGVzWzBdLm51bUJ5dGVzT2ZFbmNyeXB0ZWREYXRhIC09IHBlc09mZnNldDsKICAgICAgICAgfQogCkBAIC0xNDMxLDkgKzE2MDIsOSBAQAogICAgICAgICAgICAgICAgIChTY3JhbWJsaW5nQ29udHJvbCkgc2N0cmwsCiAgICAgICAgICAgICAgICAgc3ViU2FtcGxlcywKICAgICAgICAgICAgICAgICBtRGVzY3JhbWJsZXJTcmNCdWZmZXIsCi0gICAgICAgICAgICAgICAgc3JjT2Zmc2V0LAorICAgICAgICAgICAgICAgIDAgLypzcmNPZmZzZXQqLywKICAgICAgICAgICAgICAgICBkc3RCdWZmZXIsCi0gICAgICAgICAgICAgICAgZHN0T2Zmc2V0LAorICAgICAgICAgICAgICAgIDAgLypkc3RPZmZzZXQqLywKICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJmJ5dGVzV3JpdHRlbiwgJmRldGFpbGVkRXJyb3JdICgKICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBfc3RhdHVzLCB1aW50MzJfdCBfYnl0ZXNXcml0dGVuLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIF9kZXRhaWxlZEVycm9yKSB7CkBAIC0xNDQyLDE3ICsxNjEzLDI5IEBACiAgICAgICAgICAgICAgICAgICAgIGRldGFpbGVkRXJyb3IgPSBfZGV0YWlsZWRFcnJvcjsKICAgICAgICAgICAgICAgICB9KTsKIAotICAgICAgICBpZiAoIXJldHVyblZvaWQuaXNPaygpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiW3N0cmVhbSAlZF0gZGVzY3JhbWJsZSBmYWlsZWQsIHRyYW5zPSVzIiwKLSAgICAgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIHJldHVyblZvaWQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgaWYgKCFyZXR1cm5Wb2lkLmlzT2soKSB8fCBzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgQUxPR0UoIltzdHJlYW0gJWRdIGRlc2NyYW1ibGUgZmFpbGVkLCB0cmFucz0lcywgc3RhdHVzPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIHJldHVyblZvaWQuZGVzY3JpcHRpb24oKS5jX3N0cigpLCBzdGF0dXMpOwogICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgIH0KIAogICAgICAgICBBTE9HVigiW3N0cmVhbSAlZF0gZGVzY3JhbWJsZSBzdWNjZWVkZWQsICVkIGJ5dGVzIiwKICAgICAgICAgICAgICAgICBtRWxlbWVudGFyeVBJRCwgYnl0ZXNXcml0dGVuKTsKLSAgICAgICAgbWVtY3B5KG1CdWZmZXItPmRhdGEoKSwgbURlc2NyYW1ibGVkQnVmZmVyLT5kYXRhKCksIGRlc2NyYW1ibGVCeXRlcyk7CisKKyAgICAgICAgLy8gU2V0IGRlc2NyYW1ibGVCeXRlcyB0byB0aGUgcmV0dXJuZWQgcmVzdWx0LgorICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBtaWdodCBiZSBzbWFsbGVyIHRoYW4gdGhlIHRvdGFsIGxlbmd0aCBvZiBpbnB1dCBkYXRhLgorICAgICAgICAvLyAoZWcuIHdoZW4gd2UncmUgZGVzY3JhbWJsaW5nIHRoZSBQRVMgaGVhZGVyIHBvcnRpb24gb2YgYSBzZWN1cmUgc3RyZWFtLAorICAgICAgICAvLyB0aGUgcGx1Z2luIG1pZ2h0IGN1dCBpdCBvZmYgcmlnaHQgYWZ0ZXIgdGhlIFBFUyBoZWFkZXIuKQorICAgICAgICBkZXNjcmFtYmxlQnl0ZXMgPSBieXRlc1dyaXR0ZW47CiAgICAgfQogCisgICAgLy8gfGJ1ZmZlcnwgcG9pbnRzIHRvIHRoZSBidWZmZXIgZnJvbSB3aGljaCB3ZSdkIHBhcnNlIHRoZSBQRVMgaGVhZGVyLgorICAgIC8vIFdoZW4gdGhlIG91dHB1dCBzdHJlYW0gaXMgc2NyYW1ibGVkLCBpdCBwb2ludHMgdG8gbURlc2NyYW1ibGVkQnVmZmVyCisgICAgLy8gKHVubGVzcyBhbGwgcGFja2V0cyBpbiB0aGlzIFBFUyBhcmUgYWN0dWFsbHkgY2xlYXIsIGluIHdoaWNoIGNhc2UsCisgICAgLy8gaXQgcG9pbnRzIHRvIG1CdWZmZXIgc2luY2Ugd2UgbmV2ZXIgY29waWVkIGludG8gbURlc2NyYW1ibGVkQnVmZmVyKS4KKyAgICAvLyBXaGVuIHRoZSBvdXRwdXQgc3RyZWFtIGlzIGNsZWFyLCBpdCBwb2ludHMgdG8gbUJ1ZmZlciwgYW5kIHdlJ2xsCisgICAgLy8gY29weSBhbGwgZGVzY3JhbWJsZWQgZGF0YSBiYWNrIHRvIG1CdWZmZXIuCisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbUJ1ZmZlcjsKICAgICBpZiAobVF1ZXVlLT5pc1NjcmFtYmxlZCgpKSB7CiAgICAgICAgIC8vIFF1ZXVlIHN1YlNhbXBsZSBpbmZvIGZvciBzY3JhbWJsZWQgcXVldWUKICAgICAgICAgc3A8QUJ1ZmZlcj4gY2xlYXJTaXplc0J1ZmZlciA9IG5ldyBBQnVmZmVyKG1TdWJTYW1wbGVzLnNpemUoKSAqIDQpOwpAQCAtMTQ2NCw4ICsxNjQ3LDcgQEAKICAgICAgICAgZm9yIChhdXRvIGl0ID0gbVN1YlNhbXBsZXMuYmVnaW4oKTsKICAgICAgICAgICAgICAgICBpdCAhPSBtU3ViU2FtcGxlcy5lbmQoKTsgaXQrKywgaSsrKSB7CiAgICAgICAgICAgICBpZiAoKGl0LT50cmFuc3BvcnRfc2NyYW1ibGluZ19tb2RlID09IDAKLSAgICAgICAgICAgICAgICAgICAgJiYgcGVzU2NyYW1ibGluZ0NvbnRyb2wgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgfHwgaSA8IGRlc2NyYW1ibGVTdWJTYW1wbGVzKSB7CisgICAgICAgICAgICAgICAgICAgICYmIHBlc1NjcmFtYmxpbmdDb250cm9sID09IDApKSB7CiAgICAgICAgICAgICAgICAgY2xlYXJTaXplUHRyW2ldID0gaXQtPnN1YlNhbXBsZVNpemU7CiAgICAgICAgICAgICAgICAgZW5jU2l6ZVB0cltpXSA9IDA7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTQ3NCwxNCArMTY1NiwyOSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaXNTeW5jIHw9IGl0LT5yYW5kb21fYWNjZXNzX2luZGljYXRvcjsKICAgICAgICAgfQorCisgICAgICAgIC8vIElmIHNjcmFtYmxlZCBhdCBQRVMtbGV2ZWwsIFBFUyBoZWFkZXIgaXMgaW4gdGhlIGNsZWFyCisgICAgICAgIGlmIChwZXNTY3JhbWJsaW5nQ29udHJvbCAhPSAwKSB7CisgICAgICAgICAgICBjbGVhclNpemVQdHJbMF0gPSBwZXNPZmZzZXQ7CisgICAgICAgICAgICBlbmNTaXplUHRyWzBdIC09IHBlc09mZnNldDsKKyAgICAgICAgfQogICAgICAgICAvLyBQYXNzIHRoZSBvcmlnaW5hbCBUUyBzdWJzYW1wbGUgc2l6ZSBub3cuIFRoZSBQRVMgaGVhZGVyIGFkanVzdAogICAgICAgICAvLyB3aWxsIGJlIGFwcGxpZWQgd2hlbiB0aGUgc2NyYW1ibGVkIEFVIGlzIGRlcXVldWVkLgorICAgICAgICAvLyBOb3RlIHRoYXQgaWYgZGVzY3JhbWJsZUJ5dGVzIGlzIDAsIGl0IG1lYW5zIHRoaXMgUEVTIGNvbnRhaW5zIG9ubHkKKyAgICAgICAgLy8gYWxsIHRzIHBhY2tldHMsIGxlYWRpbmdDbGVhckJ5dGVzIGlzIGVudGlyZSBidWZmZXIgc2l6ZS4KICAgICAgICAgbVF1ZXVlLT5hcHBlbmRTY3JhbWJsZWREYXRhKAotICAgICAgICAgICAgICAgIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpLCBzY3RybCwKLSAgICAgICAgICAgICAgICBpc1N5bmMsIGNsZWFyU2l6ZXNCdWZmZXIsIGVuY1NpemVzQnVmZmVyKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSwKKyAgICAgICAgICAgICAgICAoZGVzY3JhbWJsZUJ5dGVzID4gMCkgPyBkZXNjcmFtYmxlQnl0ZXMgOiBtQnVmZmVyLT5zaXplKCksCisgICAgICAgICAgICAgICAgc2N0cmwsIGlzU3luYywgY2xlYXJTaXplc0J1ZmZlciwgZW5jU2l6ZXNCdWZmZXIpOworCisgICAgICAgIGlmIChkZXNjcmFtYmxlQnl0ZXMgPiAwKSB7CisgICAgICAgICAgICBidWZmZXIgPSBtRGVzY3JhbWJsZWRCdWZmZXI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtZW1jcHkobUJ1ZmZlci0+ZGF0YSgpLCBtRGVzY3JhbWJsZWRCdWZmZXItPmRhdGEoKSwgZGVzY3JhbWJsZUJ5dGVzKTsKICAgICB9CiAKLSAgICBBQml0UmVhZGVyIGJyKG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBBQml0UmVhZGVyIGJyKGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CiAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VQRVMoJmJyLCBldmVudCk7CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC0xNTE0LDYgKzE3MTEsMTMgQEAKICAgICByZXR1cm4gZXJyOwogfQogCit2b2lkIEFUU1BhcnNlcjo6U3RyZWFtOjphZGRBdWRpb1ByZXNlbnRhdGlvbnMoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXRTdHJlYW0oc3RkOjppb3M6Om91dCk7CisgICAgc2VyaWFsaXplQXVkaW9QcmVzZW50YXRpb25zKG1BdWRpb1ByZXNlbnRhdGlvbnMsICZvdXRTdHJlYW0pOworICAgIHNwPEFCdWZmZXI+IGFwID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KG91dFN0cmVhbS5zdHIoKS5kYXRhKCksIG91dFN0cmVhbS5zdHIoKS5zaXplKCkpOworICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRCdWZmZXIoImF1ZGlvLXByZXNlbnRhdGlvbi1pbmZvIiwgYXApOworfQorCiB2b2lkIEFUU1BhcnNlcjo6U3RyZWFtOjpvblBheWxvYWREYXRhKAogICAgICAgICB1bnNpZ25lZCBQVFNfRFRTX2ZsYWdzLCB1aW50NjRfdCBQVFMsIHVpbnQ2NF90IC8qIERUUyAqLywKICAgICAgICAgdW5zaWduZWQgUEVTX3NjcmFtYmxpbmdfY29udHJvbCwKQEAgLTE1MjksNyArMTczMyw3IEBACiAKICAgICBBTE9HVigib25QYXlsb2FkRGF0YSBtU3RyZWFtVHlwZT0weCUwMnggc2l6ZTogJXp1IiwgbVN0cmVhbVR5cGUsIHNpemUpOwogCi0gICAgaW50NjRfdCB0aW1lVXMgPSAwbGw7ICAvLyBubyBwcmVzZW50YXRpb24gdGltZXN0YW1wIGF2YWlsYWJsZS4KKyAgICBpbnQ2NF90IHRpbWVVcyA9IDBMTDsgIC8vIG5vIHByZXNlbnRhdGlvbiB0aW1lc3RhbXAgYXZhaWxhYmxlLgogICAgIGlmIChQVFNfRFRTX2ZsYWdzID09IDIgfHwgUFRTX0RUU19mbGFncyA9PSAzKSB7CiAgICAgICAgIHRpbWVVcyA9IG1Qcm9ncmFtLT5jb252ZXJ0UFRTVG9UaW1lc3RhbXAoUFRTKTsKICAgICB9CkBAIC0xNTY0LDYgKzE3NjgsOSBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1Tb3VyY2UgPSBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShtZXRhKTsKKyAgICAgICAgICAgICAgICBpZiAobUF1ZGlvUHJlc2VudGF0aW9ucy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZEF1ZGlvUHJlc2VudGF0aW9ucyhhY2Nlc3NVbml0KTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbVNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOwogICAgICAgICAgICAgICAgIEFMT0dWKCJvblBheWxvYWREYXRhOiBjcmVhdGVkIEFub3RoZXJQYWNrZXRTb3VyY2UgUElEIDB4JTA4eCBvZiB0eXBlIDB4JTAyeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBtRWxlbWVudGFyeVBJRCwgbVN0cmVhbVR5cGUpOwpAQCAtMTU3Niw2ICsxNzgzLDkgQEAKICAgICAgICAgICAgIGlmIChtU291cmNlLT5nZXRGb3JtYXQoKSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgbVNvdXJjZS0+c2V0Rm9ybWF0KG1RdWV1ZS0+Z2V0Rm9ybWF0KCkpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1BdWRpb1ByZXNlbnRhdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgIGFkZEF1ZGlvUHJlc2VudGF0aW9ucyhhY2Nlc3NVbml0KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1Tb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKICAgICAgICAgfQogCkBAIC0xNjU5LDEwICsxODY5LDEwIEBACiAKIEFUU1BhcnNlcjo6QVRTUGFyc2VyKHVpbnQzMl90IGZsYWdzKQogICAgIDogbUZsYWdzKGZsYWdzKSwKLSAgICAgIG1BYnNvbHV0ZVRpbWVBbmNob3JVcygtMWxsKSwKKyAgICAgIG1BYnNvbHV0ZVRpbWVBbmNob3JVcygtMUxMKSwKICAgICAgIG1UaW1lT2Zmc2V0VmFsaWQoZmFsc2UpLAotICAgICAgbVRpbWVPZmZzZXRVcygwbGwpLAotICAgICAgbUxhc3RSZWNvdmVyZWRQVFMoLTFsbCksCisgICAgICBtVGltZU9mZnNldFVzKDBMTCksCisgICAgICBtTGFzdFJlY292ZXJlZFBUUygtMUxMKSwKICAgICAgIG1OdW1UU1BhY2tldHNQYXJzZWQoMCksCiAgICAgICBtTnVtUENScygwKSB7CiAgICAgbVBTSVNlY3Rpb25zLmFkZCgwIC8qIFBJRCAqLywgbmV3IFBTSVNlY3Rpb24pOwpAQCAtMTcwNCw3ICsxOTE0LDcgQEAKICAgICAgICAgaWYgKChtRmxhZ3MgJiBUU19USU1FU1RBTVBTX0FSRV9BQlNPTFVURSkKICAgICAgICAgICAgICAgICAmJiBleHRyYS0+ZmluZEludDY0KAogICAgICAgICAgICAgICAgICAgICBrQVRTUGFyc2VyS2V5UmVjZW50TWVkaWFUaW1lVXMsICZtZWRpYVRpbWVVcykpIHsKLSAgICAgICAgICAgIGlmIChtQWJzb2x1dGVUaW1lQW5jaG9yVXMgPj0gMGxsKSB7CisgICAgICAgICAgICBpZiAobUFic29sdXRlVGltZUFuY2hvclVzID49IDBMTCkgewogICAgICAgICAgICAgICAgIG1lZGlhVGltZVVzIC09IG1BYnNvbHV0ZVRpbWVBbmNob3JVczsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtVGltZU9mZnNldFZhbGlkKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaAppbmRleCA0NWNhMDZiLi4wZmYyZDdlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BdWRpb1ByZXNlbnRhdGlvbkluZm8uaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KQEAgLTE0Miw2ICsxNDMsNyBAQAogICAgICAgICBTVFJFQU1UWVBFX01QRUcyX1ZJREVPICAgICAgICAgID0gMHgwMiwKICAgICAgICAgU1RSRUFNVFlQRV9NUEVHMV9BVURJTyAgICAgICAgICA9IDB4MDMsCiAgICAgICAgIFNUUkVBTVRZUEVfTVBFRzJfQVVESU8gICAgICAgICAgPSAweDA0LAorICAgICAgICBTVFJFQU1UWVBFX1BFU19QUklWQVRFX0RBVEEgICAgID0gMHgwNiwKICAgICAgICAgU1RSRUFNVFlQRV9NUEVHMl9BVURJT19BRFRTICAgICA9IDB4MGYsCiAgICAgICAgIFNUUkVBTVRZUEVfTVBFRzRfVklERU8gICAgICAgICAgPSAweDEwLAogICAgICAgICBTVFJFQU1UWVBFX01FVEFEQVRBICAgICAgICAgICAgID0gMHgxNSwKQEAgLTE1Myw2ICsxNTUsNyBAQAogICAgICAgICAvLyBTdHJlYW0gdHlwZSAweDgzIGlzIG5vbi1zdGFuZGFyZCwKICAgICAgICAgLy8gaXQgY291bGQgYmUgTFBDTSBvciBUcnVlSEQgQUMzCiAgICAgICAgIFNUUkVBTVRZUEVfTFBDTV9BQzMgICAgICAgICAgICAgPSAweDgzLAorICAgICAgICBTVFJFQU1UWVBFX0VBQzMgICAgICAgICAgICAgICAgID0gMHg4NywKIAogICAgICAgICAvL1NhbXBsZSBFbmNyeXB0ZWQgdHlwZXMKICAgICAgICAgU1RSRUFNVFlQRV9IMjY0X0VOQ1JZUFRFRCAgICAgICA9IDB4REIsCkBAIC0xNjAsNiArMTYzLDIxIEBACiAgICAgICAgIFNUUkVBTVRZUEVfQUMzX0VOQ1JZUFRFRCAgICAgICAgPSAweEMxLAogICAgIH07CiAKKyAgICBlbnVtIHsKKyAgICAgICAgLy8gRnJvbSBJU08vSUVDIDEzODE4LTE6IDIwMDcgKEUpLCBUYWJsZSAyLTQ1CisgICAgICAgIERFU0NSSVBUT1JfQ0EgICAgICAgICAgICAgICAgICAgPSAweDA5LAorCisgICAgICAgIC8vIERWQiBCbHVlQm9vayBBMDM4IFRhYmxlIDEyCisgICAgICAgIERFU0NSSVBUT1JfRFZCX0VYVEVOU0lPTiAgICAgICAgPSAweDdGLAorICAgIH07CisKKyAgICAvLyBEVkIgQmx1ZUJvb2sgQTAzOCBUYWJsZSAxMDkKKyAgICBlbnVtIHsKKyAgICAgICAgRVhUX0RFU0NSSVBUT1JfRFZCX0FDNCAgICAgICAgICAgICAgICAgID0gMHgxNSwKKyAgICAgICAgRVhUX0RFU0NSSVBUT1JfRFZCX0FVRElPX1BSRVNFTEVDVElPTiAgID0gMHgxOSwKKyAgICAgICAgRVhUX0RFU0NSSVBUT1JfRFZCX1JFU0VSVkVEX01BWCAgICAgICAgID0gMHg3RiwKKyAgICB9OworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QVRTUGFyc2VyKCk7CiAKQEAgLTE2OSwxMSArMTg3LDIwIEBACiAgICAgc3RydWN0IFBTSVNlY3Rpb247CiAgICAgc3RydWN0IENhc01hbmFnZXI7CiAgICAgc3RydWN0IENBRGVzY3JpcHRvciB7Ci0gICAgICAgIGludDMyX3QgbVN5c3RlbUlEOworICAgICAgICBDQURlc2NyaXB0b3IoKSA6IG1QSUQoMCksIG1TeXN0ZW1JRCgtMSkge30KICAgICAgICAgdW5zaWduZWQgbVBJRDsKKyAgICAgICAgaW50MzJfdCBtU3lzdGVtSUQ7CiAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1Qcml2YXRlRGF0YTsKICAgICB9OwogCisgICAgc3RydWN0IFN0cmVhbUluZm8geworICAgICAgICB1bnNpZ25lZCBtVHlwZTsKKyAgICAgICAgdW5zaWduZWQgbVR5cGVFeHQ7CisgICAgICAgIHVuc2lnbmVkIG1QSUQ7CisgICAgICAgIENBRGVzY3JpcHRvciBtQ0FEZXNjcmlwdG9yOworICAgICAgICBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb24gbUF1ZGlvUHJlc2VudGF0aW9uczsKKyAgICB9OworCiAgICAgc3A8Q2FzTWFuYWdlcj4gbUNhc01hbmFnZXI7CiAKICAgICB1aW50MzJfdCBtRmxhZ3M7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAKaW5kZXggZmJmMTQ5Ni4uYTUwN2I5MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icApAQCAtMjUsMTcgKzI1LDE5IEBACiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmNyeXB0byIsCiAgICAgICAgICJsaWJtZWRpYSIsCi0gICAgICAgICJsaWJoaWRsYWxsb2NhdG9ydXRpbHMiLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKICAgICBdLAogCiAgICAgd2hvbGVfc3RhdGljX2xpYnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuY3BwCmluZGV4IGVjZTA2OTIuLjYyZTNhNGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmNwcApAQCAtMzUsNyArMzUsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNvbnN0IGludDY0X3Qga05lYXJFT1NNYXJrVXMgPSAyMDAwMDAwbGw7IC8vIDIgc2VjcworY29uc3QgaW50NjRfdCBrTmVhckVPU01hcmtVcyA9IDIwMDAwMDBMTDsgLy8gMiBzZWNzCiAKIEFub3RoZXJQYWNrZXRTb3VyY2U6OkFub3RoZXJQYWNrZXRTb3VyY2UoY29uc3Qgc3A8TWV0YURhdGE+ICZtZXRhKQogICAgIDogbUlzQXVkaW8oZmFsc2UpLApAQCAtMjIzLDkgKzIyMywxNiBAQAogICAgICAgICAgICAgICAgICAgICBrS2V5TXBlZ1VzZXJEYXRhLCAwLCBtcGVnVXNlckRhdGEtPmRhdGEoKSwgbXBlZ1VzZXJEYXRhLT5zaXplKCkpOwogICAgICAgICB9CiAKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYXA7CisgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEJ1ZmZlcigiYXVkaW8tcHJlc2VudGF0aW9uLWluZm8iLCAmYXApICYmIGFwICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGJ1Zm1ldGEuc2V0RGF0YSgKKyAgICAgICAgICAgICAgICAgICAga0tleUF1ZGlvUHJlc2VudGF0aW9uSW5mbywgMCwgYXAtPmRhdGEoKSwgYXAtPnNpemUoKSk7CisgICAgICAgIH0KKwogICAgICAgICBpbnQzMl90IGNyeXB0b01vZGU7CiAgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJjcnlwdG9Nb2RlIiwgJmNyeXB0b01vZGUpKSB7CiAgICAgICAgICAgICBpbnQzMl90IGNyeXB0b0tleTsKKyAgICAgICAgICAgIGludDMyX3QgcGVzT2Zmc2V0OwogICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gY2xlYXJCeXRlc0J1ZmZlciwgZW5jQnl0ZXNCdWZmZXI7CiAKICAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImNyeXB0b0tleSIsICZjcnlwdG9LZXkpKTsKQEAgLTIzMyw2ICsyNDAsOCBAQAogICAgICAgICAgICAgICAgICAgICAmJiBjbGVhckJ5dGVzQnVmZmVyICE9IE5VTEwpOwogICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRCdWZmZXIoImVuY0J5dGVzIiwgJmVuY0J5dGVzQnVmZmVyKQogICAgICAgICAgICAgICAgICAgICAmJiBlbmNCeXRlc0J1ZmZlciAhPSBOVUxMKTsKKyAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoInBlc09mZnNldCIsICZwZXNPZmZzZXQpCisgICAgICAgICAgICAgICAgICAgICYmIChwZXNPZmZzZXQgPj0gMCkgJiYgKHBlc09mZnNldCA8IDY1NTM2KSk7CiAKICAgICAgICAgICAgIGJ1Zm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b01vZGUsIGNyeXB0b01vZGUpOwogCkBAIC0yNDAsNiArMjQ5LDExIEBACiAgICAgICAgICAgICBidWZtZXRhLnNldERhdGEoa0tleUNyeXB0b0lWLCAwLCBhcnJheSwgMTYpOwogCiAgICAgICAgICAgICBhcnJheVswXSA9ICh1aW50OF90KSAoY3J5cHRvS2V5ICYgMHhmZik7CisgICAgICAgICAgICAvLyBhcnJheVsxXSBjb250YWlucyBQRVMgaGVhZGVyIGZsYWcsIHdoaWNoIHdlIGRvbid0IHVzZS4KKyAgICAgICAgICAgIC8vIGFycmF5WzJ+M10gY29udGFpbiB0aGUgUEVTIG9mZnNldC4KKyAgICAgICAgICAgIGFycmF5WzJdID0gKHVpbnQ4X3QpIChwZXNPZmZzZXQgJiAweGZmKTsKKyAgICAgICAgICAgIGFycmF5WzNdID0gKHVpbnQ4X3QpICgocGVzT2Zmc2V0ID4+IDgpICYgMHhmZik7CisKICAgICAgICAgICAgIGJ1Zm1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvS2V5LCAwLCBhcnJheSwgMTYpOwogCiAgICAgICAgICAgICBidWZtZXRhLnNldERhdGEoa0tleVBsYWluU2l6ZXMsIDAsCkBAIC0yODUsNyArMjk5LDcgQEAKICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiZGlzY29udGludWl0eSIsICZkaXNjb250aW51aXR5KSl7CiAgICAgICAgIEFMT0dWKCJxdWV1ZWluZyBhIGRpc2NvbnRpbnVpdHkgd2l0aCBxdWV1ZUFjY2Vzc1VuaXQiKTsKIAotICAgICAgICBtTGFzdFF1ZXVlZFRpbWVVcyA9IDBsbDsKKyAgICAgICAgbUxhc3RRdWV1ZWRUaW1lVXMgPSAwTEw7CiAgICAgICAgIG1FT1NSZXN1bHQgPSBPSzsKICAgICAgICAgbUxhdGVzdEVucXVldWVkTWV0YSA9IE5VTEw7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCmluZGV4IDBmYTlmY2IuLjVhZjdiMjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcApAQCAtODYsNiArODYsMjEgQEAKICAgICBtQ2FzU2Vzc2lvbklkID0gc2Vzc2lvbklkOwogfQogCitzdGF0aWMgaW50MzJfdCByZWFkVmFyaWFibGVCaXRzKEFCaXRSZWFkZXIgJmJpdHMsIGludDMyX3QgbmJpdHMpIHsKKyAgICBpbnQzMl90IHZhbHVlID0gMDsKKyAgICBpbnQzMl90IG1vcmVfYml0cyA9IDE7CisKKyAgICB3aGlsZSAobW9yZV9iaXRzKSB7CisgICAgICAgIHZhbHVlICs9IGJpdHMuZ2V0Qml0cyhuYml0cyk7CisgICAgICAgIG1vcmVfYml0cyA9IGJpdHMuZ2V0Qml0cygxKTsKKyAgICAgICAgaWYgKCFtb3JlX2JpdHMpCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgdmFsdWUrKzsKKyAgICAgICAgdmFsdWUgPDw9IG5iaXRzOworICAgIH0KKyAgICByZXR1cm4gdmFsdWU7Cit9CisKIC8vIFBhcnNlIEFDMyBoZWFkZXIgYXNzdW1pbmcgdGhlIGN1cnJlbnQgcHRyIGlzIHN0YXJ0IHBvc2l0aW9uIG9mIHN5bmNmcmFtZSwKIC8vIHVwZGF0ZSBtZXRhZGF0YSBvbmx5IGFwcGxpY2FibGUsIGFuZCByZXR1cm4gdGhlIHBheWxvYWQgc2l6ZQogc3RhdGljIHVuc2lnbmVkIHBhcnNlQUMzU3luY0ZyYW1lKApAQCAtMTk1LDggKzIxMCwxNTMgQEAKICAgICByZXR1cm4gcGF5bG9hZFNpemU7CiB9CiAKLXN0YXRpYyBib29sIElzU2VlbWluZ2x5VmFsaWRBQzNIZWFkZXIoY29uc3QgdWludDhfdCAqcHRyLCBzaXplX3Qgc2l6ZSkgewotICAgIHJldHVybiBwYXJzZUFDM1N5bmNGcmFtZShwdHIsIHNpemUsIE5VTEwpID4gMDsKKy8vIFBhcnNlIEVBQzMgaGVhZGVyIGFzc3VtaW5nIHRoZSBjdXJyZW50IHB0ciBpcyBzdGFydCBwb3NpdGlvbiBvZiBzeW5jZnJhbWUsCisvLyB1cGRhdGUgbWV0YWRhdGEgb25seSBhcHBsaWNhYmxlLCBhbmQgcmV0dXJuIHRoZSBwYXlsb2FkIHNpemUKKy8vIEFUU0MgQS81MjoyMDEyIEUyLjMuMQorc3RhdGljIHVuc2lnbmVkIHBhcnNlRUFDM1N5bmNGcmFtZSgKKyAgICBjb25zdCB1aW50OF90ICpwdHIsIHNpemVfdCBzaXplLCBzcDxNZXRhRGF0YT4gKm1ldGFEYXRhKSB7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYW5uZWxDb3VudFRhYmxlW10gPSB7MiwgMSwgMiwgMywgMywgNCwgNCwgNX07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsaW5nUmF0ZVRhYmxlW10gPSB7NDgwMDAsIDQ0MTAwLCAzMjAwMH07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsaW5nUmF0ZVRhYmxlMltdID0gezI0MDAwLCAyMjA1MCwgMTYwMDB9OworCisgICAgQUJpdFJlYWRlciBiaXRzKHB0ciwgc2l6ZSk7CisgICAgaWYgKGJpdHMubnVtQml0c0xlZnQoKSA8IDE2KSB7CisgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGJpdHMgbGVmdCBmb3IgZnVydGhlciBwYXJzaW5nIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoYml0cy5nZXRCaXRzKDE2KSAhPSAweDBCNzcpIHsKKyAgICAgICAgQUxPR0UoIk5vIHZhbGlkIHN5bmMgd29yZCBpbiBFQUMzIGhlYWRlciIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyB3ZSBwYXJzZSB1cCB0byBic2lkIHNvIHRoZXJlIG5lZWRzIHRvIGJlIGF0IGxlYXN0IHRoYXQgbWFueSBiaXRzCisgICAgaWYgKGJpdHMubnVtQml0c0xlZnQoKSA8IDIgKyAzICsgMTEgKyAyICsgMiArIDMgKyAxICsgNSkgeworICAgICAgICBBTE9HRSgiTm90IGVub3VnaCBiaXRzIGxlZnQgZm9yIGZ1cnRoZXIgcGFyc2luZyIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBzdHJtdHlwID0gYml0cy5nZXRCaXRzKDIpOworICAgIGlmIChzdHJtdHlwID09IDMpIHsKKyAgICAgICAgQUxPR0UoIkluY29ycmVjdCBzdHJtdHlwIGluIEVBQzMgaGVhZGVyIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHVuc2lnbmVkIHN1YnN0cmVhbWlkID0gYml0cy5nZXRCaXRzKDMpOworICAgIC8vIG9ubHkgdGhlIGZpcnN0IGluZGVwZW5kZW50IHN0cmVhbSBpcyBzdXBwb3J0ZWQKKyAgICBpZiAoKHN0cm10eXAgPT0gMCB8fCBzdHJtdHlwID09IDIpICYmIHN1YnN0cmVhbWlkICE9IDApCisgICAgICAgIHJldHVybiAwOworCisgICAgdW5zaWduZWQgZnJtc2l6ID0gYml0cy5nZXRCaXRzKDExKTsKKyAgICB1bnNpZ25lZCBmc2NvZCA9IGJpdHMuZ2V0Qml0cygyKTsKKworICAgIHVuc2lnbmVkIHNhbXBsaW5nUmF0ZSA9IDA7CisgICAgaWYgKGZzY29kID09IDB4MykgeworICAgICAgICB1bnNpZ25lZCBmc2NvZDIgPSBiaXRzLmdldEJpdHMoMik7CisgICAgICAgIGlmIChmc2NvZDIgPT0gMykgeworICAgICAgICAgICAgQUxPR1coIkluY29ycmVjdCBmc2NvZDIgaW4gRUFDMyBoZWFkZXIiKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZVRhYmxlMltmc2NvZDJdOworICAgIH0gZWxzZSB7CisgICAgICAgIHNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZVRhYmxlW2ZzY29kXTsKKyAgICAgICAgdW5zaWduZWQgbnVtYmxrc2NvZCBfX3VudXNlZCA9IGJpdHMuZ2V0Qml0cygyKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBhY21vZCA9IGJpdHMuZ2V0Qml0cygzKTsKKyAgICB1bnNpZ25lZCBsZmVvbiA9IGJpdHMuZ2V0Qml0cygxKTsKKyAgICB1bnNpZ25lZCBic2lkID0gYml0cy5nZXRCaXRzKDUpOworICAgIGlmIChic2lkIDwgMTEgfHwgYnNpZCA+IDE2KSB7CisgICAgICAgIEFMT0dXKCJJbmNvcnJlY3QgYnNpZCBpbiBFQUMzIGhlYWRlci4gQ291bGQgYmUgQUMtMyBvciBzb21lIHVua25vd24gRUFDMyBmb3JtYXQiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gd2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCB0aGUgZmlyc3QgaW5kZXBlbmRhbnQgc3RyZWFtCisgICAgaWYgKG1ldGFEYXRhICE9IE5VTEwgJiYgKHN0cm10eXAgPT0gMCB8fCBzdHJtdHlwID09IDIpKSB7CisgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxDb3VudCA9IGNoYW5uZWxDb3VudFRhYmxlW2FjbW9kXSArIGxmZW9uOworICAgICAgICBBTE9HVigiRUFDMyBjaGFubmVsQ291bnQgPSAlZCIsIGNoYW5uZWxDb3VudCk7CisgICAgICAgIEFMT0dWKCJFQUMzIHNhbXBsaW5nUmF0ZSA9ICVkIiwgc2FtcGxpbmdSYXRlKTsKKyAgICAgICAgKCptZXRhRGF0YSktPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzKTsKKyAgICAgICAgKCptZXRhRGF0YSktPnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGNoYW5uZWxDb3VudCk7CisgICAgICAgICgqbWV0YURhdGEpLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxpbmdSYXRlKTsKKyAgICAgICAgKCptZXRhRGF0YSktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgfQorCisgICAgdW5zaWduZWQgcGF5bG9hZFNpemUgPSBmcm1zaXogKyAxOworICAgIHBheWxvYWRTaXplIDw8PSAxOyAgLy8gY29udmVydCBmcm9tIDE2LWJpdCB3b3JkcyB0byBieXRlcworCisgICAgcmV0dXJuIHBheWxvYWRTaXplOworfQorCisvLyBQYXJzZSBBQzQgaGVhZGVyIGFzc3VtaW5nIHRoZSBjdXJyZW50IHB0ciBpcyBzdGFydCBwb3NpdGlvbiBvZiBzeW5jZnJhbWUKKy8vIGFuZCB1cGRhdGUgZnJhbWVTaXplIGFuZCBtZXRhZGF0YS4KK3N0YXRpYyBzdGF0dXNfdCBwYXJzZUFDNFN5bmNGcmFtZSgKKyAgICAgICAgY29uc3QgdWludDhfdCAqcHRyLCBzaXplX3Qgc2l6ZSwgdW5zaWduZWQgJmZyYW1lU2l6ZSwgc3A8TWV0YURhdGE+ICptZXRhRGF0YSkgeworICAgIC8vIEVUU0kgVFMgMTAzIDE5MC0yIFYxLjEuMSAoMjAxNS0wOSksIEFubmV4IEMKKyAgICAvLyBUaGUgc3luY193b3JkIGNhbiBiZSBlaXRoZXIgMHhBQzQwIG9yIDB4QUM0MS4KKyAgICBzdGF0aWMgY29uc3QgaW50IGtTeW5jV29yZEFDNDAgPSAweEFDNDA7CisgICAgc3RhdGljIGNvbnN0IGludCBrU3luY1dvcmRBQzQxID0gMHhBQzQxOworCisgICAgc2l6ZV90IGhlYWRlclNpemUgPSAwOworICAgIEFCaXRSZWFkZXIgYml0cyhwdHIsIHNpemUpOworICAgIGludDMyX3Qgc3luY1dvcmQgPSBiaXRzLmdldEJpdHMoMTYpOworICAgIGlmICgoc3luY1dvcmQgIT0ga1N5bmNXb3JkQUM0MCkgJiYgKHN5bmNXb3JkICE9IGtTeW5jV29yZEFDNDEpKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIHN5bmN3b3JkIGluIEFDNCBoZWFkZXIiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgaGVhZGVyU2l6ZSArPSAyOworCisgICAgZnJhbWVTaXplID0gYml0cy5nZXRCaXRzKDE2KTsKKyAgICBoZWFkZXJTaXplICs9IDI7CisgICAgaWYgKGZyYW1lU2l6ZSA9PSAweEZGRkYpIHsKKyAgICAgICAgZnJhbWVTaXplID0gYml0cy5nZXRCaXRzKDI0KTsKKyAgICAgICAgaGVhZGVyU2l6ZSArPSAzOworICAgIH0KKworICAgIGlmIChmcmFtZVNpemUgPT0gMCkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCBmcmFtZSBzaXplIGluIEFDNCBoZWFkZXIiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgZnJhbWVTaXplICs9IGhlYWRlclNpemU7CisgICAgLy8gSWYgdGhlIHN5bmNfd29yZCBpcyAweEFDNDEsIGEgY3JjX3dvcmQgaXMgYWxzbyB0cmFuc21pdHRlZC4KKyAgICBpZiAoc3luY1dvcmQgPT0ga1N5bmNXb3JkQUM0MSkgeworICAgICAgICBmcmFtZVNpemUgKz0gMjsgLy8gY3JjX3dvcmQKKyAgICB9CisgICAgQUxPR1YoIkFDNCBmcmFtZVNpemUgPSAldSIsIGZyYW1lU2l6ZSk7CisKKyAgICAvLyBFVFNJIFRTIDEwMyAxOTAtMiBWMS4xLjEgNi4yLjEuMQorICAgIHVpbnQzMl90IGJpdHN0cmVhbVZlcnNpb24gPSBiaXRzLmdldEJpdHMoMik7CisgICAgaWYgKGJpdHN0cmVhbVZlcnNpb24gPT0gMykgeworICAgICAgICBiaXRzdHJlYW1WZXJzaW9uICs9IHJlYWRWYXJpYWJsZUJpdHMoYml0cywgMik7CisgICAgfQorCisgICAgYml0cy5za2lwQml0cygxMCk7IC8vIFNlcXVlbmNlIENvdW50ZXIKKworICAgIHVpbnQzMl90IGJXYWl0RnJhbWVzID0gYml0cy5nZXRCaXRzKDEpOworICAgIGlmIChiV2FpdEZyYW1lcykgeworICAgICAgICB1aW50MzJfdCB3YWl0RnJhbWVzID0gYml0cy5nZXRCaXRzKDMpOworICAgICAgICBpZiAod2FpdEZyYW1lcyA+IDApIHsKKyAgICAgICAgICAgIGJpdHMuc2tpcEJpdHMoMik7IC8vIGJyX2NvZGU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBFVFNJIFRTIDEwMyAxOTAgVjEuMS4xIFRhYmxlIDgyCisgICAgYm9vbCBmc0luZGV4ID0gYml0cy5nZXRCaXRzKDEpOworICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IGZzSW5kZXggPyA0ODAwMCA6IDQ0MTAwOworCisgICAgaWYgKG1ldGFEYXRhICE9IE5VTEwpIHsKKyAgICAgICAgQUxPR1YoImRlcXVldWVBY2Nlc3NVbml0QUM0IFNldHRpbmcgbUZvcm1hdCIpOworICAgICAgICAoKm1ldGFEYXRhKS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FDNCk7CisgICAgICAgICgqbWV0YURhdGEpLT5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgICAgICAvLyBbRklYTUVdIEFDNCBjaGFubmVsIGNvdW50IGlzIGRlZmluZWQgcGVyIHByZXNlbnRhdGlvbi4gUHJvdmlkZSBhIGRlZmF1bHQgY2hhbm5lbCBjb3VudAorICAgICAgICAvLyBhcyBzdGVyZW8gZm9yIHRoZSBlbnRpcmUgc3RyZWFtLgorICAgICAgICAoKm1ldGFEYXRhKS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgMik7CisgICAgICAgICgqbWV0YURhdGEpLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxpbmdSYXRlKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0aWMgc3RhdHVzX3QgSXNTZWVtaW5nbHlWYWxpZEFDNEhlYWRlcihjb25zdCB1aW50OF90ICpwdHIsIHNpemVfdCBzaXplLCB1bnNpZ25lZCAmZnJhbWVTaXplKSB7CisgICAgcmV0dXJuIHBhcnNlQUM0U3luY0ZyYW1lKHB0ciwgc2l6ZSwgZnJhbWVTaXplLCBOVUxMKTsKIH0KIAogc3RhdGljIGJvb2wgSXNTZWVtaW5nbHlWYWxpZEFEVFNIZWFkZXIoCkBAIC0yNzksNyArNDM5LDggQEAKICAgICAgICAgQUxPR0UoImFwcGVuZGluZyBkYXRhIGFmdGVyIEVPUyIpOwogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KLSAgICBpZiAobUJ1ZmZlciA9PSBOVUxMIHx8IG1CdWZmZXItPnNpemUoKSA9PSAwKSB7CisKKyAgICBpZiAoIWlzU2NyYW1ibGVkKCkgJiYgKG1CdWZmZXIgPT0gTlVMTCB8fCBtQnVmZmVyLT5zaXplKCkgPT0gMCkpIHsKICAgICAgICAgc3dpdGNoIChtTW9kZSkgewogICAgICAgICAgICAgY2FzZSBIMjY0OgogICAgICAgICAgICAgY2FzZSBNUEVHX1ZJREVPOgpAQCAtMzkwLDEyICs1NTEsMTkgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgY2FzZSBBQzM6CisgICAgICAgICAgICBjYXNlIEVBQzM6CiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgdWludDhfdCAqcHRyID0gKHVpbnQ4X3QgKilkYXRhOwogCiAgICAgICAgICAgICAgICAgc3NpemVfdCBzdGFydE9mZnNldCA9IC0xOwogICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChJc1NlZW1pbmdseVZhbGlkQUMzSGVhZGVyKCZwdHJbaV0sIHNpemUgLSBpKSkgeworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBwYXlsb2FkU2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGlmIChtTW9kZSA9PSBBQzMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRTaXplID0gcGFyc2VBQzNTeW5jRnJhbWUoJnB0cltpXSwgc2l6ZSAtIGksIE5VTEwpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1Nb2RlID09IEVBQzMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWRTaXplID0gcGFyc2VFQUMzU3luY0ZyYW1lKCZwdHJbaV0sIHNpemUgLSBpLCBOVUxMKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocGF5bG9hZFNpemUgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE9mZnNldCA9IGk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtNDA2LDcgKzU3NCw3IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0T2Zmc2V0ID4gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HSSgiZm91bmQgc29tZXRoaW5nIHJlc2VtYmxpbmcgYW4gQUMzIHN5bmN3b3JkIGF0ICIKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koImZvdW5kIHNvbWV0aGluZyByZXNlbWJsaW5nIGFuIChFKUFDMyBzeW5jd29yZCBhdCAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJvZmZzZXQgJXpkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQpOwogICAgICAgICAgICAgICAgIH0KQEAgLTQxNiw2ICs1ODQsNDMgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgY2FzZSBBQzQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdWludDhfdCAqcHRyID0gKHVpbnQ4X3QgKilkYXRhOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZyYW1lU2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgc3NpemVfdCBzdGFydE9mZnNldCA9IC0xOworCisgICAgICAgICAgICAgICAgLy8gQSB2YWxpZCBBQzQgc3RyZWFtIHNob3VsZCBoYXZlIG1pbmltdW0gb2YgNyBieXRlcyBpbiBpdHMgYnVmZmVyLgorICAgICAgICAgICAgICAgIC8vIChTeW5jIGhlYWRlciA0IGJ5dGVzICsgQUM0IHRvYyAzIGJ5dGVzKQorICAgICAgICAgICAgICAgIGlmIChzaXplIDwgNykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoSXNTZWVtaW5nbHlWYWxpZEFDNEhlYWRlcigmcHRyW2ldLCBzaXplIC0gaSwgZnJhbWVTaXplKSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRPZmZzZXQgPSBpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnRPZmZzZXQgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHN0YXJ0T2Zmc2V0ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HSSgiZm91bmQgc29tZXRoaW5nIHJlc2VtYmxpbmcgYW4gQUM0IHN5bmN3b3JkIGF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mZnNldCAlemQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE9mZnNldCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmcmFtZVNpemUgIT0gc2l6ZSAtIHN0YXJ0T2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBQzQgZnJhbWUgc2l6ZSBpcyAldSBieXRlcywgd2hpbGUgdGhlIGJ1ZmZlciBzaXplIGlzICV6ZCBieXRlcy4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZVNpemUsIHNpemUgLSBzdGFydE9mZnNldCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgZGF0YSA9ICZwdHJbc3RhcnRPZmZzZXRdOworICAgICAgICAgICAgICAgIHNpemUgLT0gc3RhcnRPZmZzZXQ7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGNhc2UgTVBFR19BVURJTzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB1aW50OF90ICpwdHIgPSAodWludDhfdCAqKWRhdGE7CkBAIC00OTQsNiArNjk5LDcgQEAKIAogdm9pZCBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmFwcGVuZFNjcmFtYmxlZERhdGEoCiAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLAorICAgICAgICBzaXplX3QgbGVhZGluZ0NsZWFyQnl0ZXMsCiAgICAgICAgIGludDMyX3Qga2V5SWQsIGJvb2wgaXNTeW5jLAogICAgICAgICBzcDxBQnVmZmVyPiBjbGVhclNpemVzLCBzcDxBQnVmZmVyPiBlbmNTaXplcykgewogICAgIGlmICghaXNTY3JhbWJsZWQoKSkgewpAQCAtNTIxLDYgKzcyNyw3IEBACiAKICAgICBTY3JhbWJsZWRSYW5nZUluZm8gc2NyYW1ibGVkSW5mbzsKICAgICBzY3JhbWJsZWRJbmZvLm1MZW5ndGggPSBzaXplOworICAgIHNjcmFtYmxlZEluZm8ubUxlYWRpbmdDbGVhckJ5dGVzID0gbGVhZGluZ0NsZWFyQnl0ZXM7CiAgICAgc2NyYW1ibGVkSW5mby5tS2V5SWQgPSBrZXlJZDsKICAgICBzY3JhbWJsZWRJbmZvLm1Jc1N5bmMgPSBpc1N5bmM7CiAgICAgc2NyYW1ibGVkSW5mby5tQ2xlYXJTaXplcyA9IGNsZWFyU2l6ZXM7CkBAIC01MzMsNyArNzQwLDYgQEAKIAogc3A8QUJ1ZmZlcj4gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpkZXF1ZXVlU2NyYW1ibGVkQWNjZXNzVW5pdCgpIHsKICAgICBzaXplX3QgbmV4dFNjYW4gPSBtQnVmZmVyLT5zaXplKCk7Ci0gICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CiAgICAgaW50MzJfdCBwZXNPZmZzZXQgPSAwLCBwZXNTY3JhbWJsaW5nQ29udHJvbCA9IDA7CiAgICAgaW50NjRfdCB0aW1lVXMgPSBmZXRjaFRpbWVzdGFtcChuZXh0U2NhbiwgJnBlc09mZnNldCwgJnBlc1NjcmFtYmxpbmdDb250cm9sKTsKICAgICBpZiAodGltZVVzIDwgMGxsKSB7CkBAIC01NDQsNiArNzUwLDcgQEAKICAgICAvLyByZXR1cm4gc2NyYW1ibGVkIHVuaXQKICAgICBpbnQzMl90IGtleUlkID0gcGVzU2NyYW1ibGluZ0NvbnRyb2wsIGlzU3luYyA9IDAsIHNjcmFtYmxlZExlbmd0aCA9IDA7CiAgICAgc3A8QUJ1ZmZlcj4gY2xlYXJTaXplcywgZW5jU2l6ZXM7CisgICAgc2l6ZV90IGxlYWRpbmdDbGVhckJ5dGVzOwogICAgIHdoaWxlIChtU2NyYW1ibGVkUmFuZ2VJbmZvcy5zaXplKCkgPiBtUmFuZ2VJbmZvcy5zaXplKCkpIHsKICAgICAgICAgYXV0byBpdCA9IG1TY3JhbWJsZWRSYW5nZUluZm9zLmJlZ2luKCk7CiAgICAgICAgIEFMT0dWKCJbc3RyZWFtICVkXSBmZXRjaGluZyBzY3JhbWJsZWQgcmFuZ2U6IHNpemU9JXp1IiwgbU1vZGUsIGl0LT5tTGVuZ3RoKTsKQEAgLTU2MSw2ICs3NjgsNyBAQAogICAgICAgICBjbGVhclNpemVzID0gaXQtPm1DbGVhclNpemVzOwogICAgICAgICBlbmNTaXplcyA9IGl0LT5tRW5jU2l6ZXM7CiAgICAgICAgIGlzU3luYyA9IGl0LT5tSXNTeW5jOworICAgICAgICBsZWFkaW5nQ2xlYXJCeXRlcyA9IGl0LT5tTGVhZGluZ0NsZWFyQnl0ZXM7CiAgICAgICAgIG1TY3JhbWJsZWRSYW5nZUluZm9zLmVyYXNlKGl0KTsKICAgICB9CiAgICAgaWYgKHNjcmFtYmxlZExlbmd0aCA9PSAwKSB7CkBAIC01NjgsMjYgKzc3Niw3NCBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICAvLyBza2lwIHRoZSBQRVMgaGVhZGVyLCBhbmQgY29weSB0aGUgcmVzdCBpbnRvIHNjcmFtYmxlZCBhY2Nlc3MgdW5pdAotICAgIHNwPEFCdWZmZXI+IHNjcmFtYmxlZEFjY2Vzc1VuaXQgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoCi0gICAgICAgICAgICBtU2NyYW1ibGVkQnVmZmVyLT5kYXRhKCkgKyBwZXNPZmZzZXQsCi0gICAgICAgICAgICBzY3JhbWJsZWRMZW5ndGggLSBwZXNPZmZzZXQpOwotCi0gICAgLy8gZml4IHVwIGZpcnN0IHNhbXBsZSBzaXplIGFmdGVyIHNraXBwaW5nIHRoZSBQRVMgaGVhZGVyCi0gICAgaWYgKHBlc09mZnNldCA+IDApIHsKLSAgICAgICAgaW50MzJfdCAmZmlyc3RDbGVhclNpemUgPSAqKGludDMyX3QqKWNsZWFyU2l6ZXMtPmRhdGEoKTsKLSAgICAgICAgaW50MzJfdCAmZmlyc3RFbmNTaXplID0gKihpbnQzMl90KillbmNTaXplcy0+ZGF0YSgpOwotICAgICAgICAvLyBDdXQgYXdheSB0aGUgUEVTIGhlYWRlcgotICAgICAgICBpZiAoZmlyc3RDbGVhclNpemUgPj0gcGVzT2Zmc2V0KSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGlzIGZvciBUUy1sZXZlbCBzY3JhbWJsaW5nLCB3ZSBkZXNjcmFtYmxlZCB0aGUgZmlyc3QKLSAgICAgICAgICAgIC8vIChvciBpdCB3YXMgY2xlYXIgdG8gYmVnaW4gd2l0aCkKLSAgICAgICAgICAgIGZpcnN0Q2xlYXJTaXplIC09IHBlc09mZnNldDsKLSAgICAgICAgfSBlbHNlIGlmIChmaXJzdEVuY1NpemUgPj0gcGVzT2Zmc2V0KSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGJlIFBFUy1sZXZlbCBzY3JhbWJsaW5nCi0gICAgICAgICAgICBmaXJzdEVuY1NpemUgLT0gcGVzT2Zmc2V0OwotICAgICAgICB9CisgICAgLy8gUmV0cmlldmUgdGhlIGxlYWRpbmcgY2xlYXIgYnl0ZXMgaW5mbywgYW5kIHVzZSBpdCB0byBzZXQgdGhlIGNsZWFyCisgICAgLy8gcmFuZ2Ugb24gbUJ1ZmZlci4gTm90ZSB0aGF0IHRoZSBsZWFkaW5nIGNsZWFyIGJ5dGVzIGluY2x1ZGVzIHRoZQorICAgIC8vIFBFUyBoZWFkZXIgcG9ydGlvbiwgd2hpbGUgbUJ1ZmZlciBkb2Vzbid0LgorICAgIGlmICgoaW50MzJfdClsZWFkaW5nQ2xlYXJCeXRlcyA+IHBlc09mZnNldCkgeworICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBsZWFkaW5nQ2xlYXJCeXRlcyAtIHBlc09mZnNldCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CiAgICAgfQogCisgICAgLy8gVHJ5IHRvIHBhcnNlIGZvcm1hdHMsIGFuZCBpZiB1bmF2YWlsYWJsZSBzZXQgdXAgYSBkdW1teSBmb3JtYXQuCisgICAgLy8gT25seSBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgbW9kZXMgZm9yIHNjcmFtYmxlZCBjb250ZW50IGZvciBub3cuCisgICAgLy8gKHdpbGwgYmUgZXhwYW5kZWQgbGF0ZXIpLgorICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKKyAgICAgICAgc3dpdGNoIChtTW9kZSkgeworICAgICAgICAgICAgY2FzZSBIMjY0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgKm1Gb3JtYXQsIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HSSgiQ3JlYXRpbmcgZHVtbXkgQVZDIGZvcm1hdCBmb3Igc2NyYW1ibGVkIGNvbnRlbnQiKTsKKworICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICAgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVdpZHRoLCAxMjgwKTsKKyAgICAgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUhlaWdodCwgNzIwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEFBQzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIU1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICptRm9ybWF0LCBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koIkNyZWF0aW5nIGR1bW15IEFBQyBmb3JtYXQgZm9yIHNjcmFtYmxlZCBjb250ZW50Iik7CisKKyAgICAgICAgICAgICAgICAgICAgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKCptRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLypwcm9maWxlKi8sIDcgLypzYW1wbGluZ19mcmVxX2luZGV4Ki8sIDEgLypjaGFubmVsX2NvbmZpZyovKTsKKyAgICAgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUlzQURUUywgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIE1QRUdfVklERU86CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQUxPR0koIkNyZWF0aW5nIGR1bW15IE1QRUcgZm9ybWF0IGZvciBzY3JhbWJsZWQgY29udGVudCIpOworCisgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKTsKKyAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5V2lkdGgsIDEyODApOworICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlIZWlnaHQsIDcyMCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFMT0dFKCJVbmtub3duIG1vZGUgZm9yIHNjcmFtYmxlZCBjb250ZW50Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBmb3IgTWVkaWFFeHRyYWN0b3IuQ2FzSW5mbworICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5Q0FTeXN0ZW1JRCwgbUNBU3lzdGVtSWQpOworICAgICAgICBtRm9ybWF0LT5zZXREYXRhKGtLZXlDQVNlc3Npb25JRCwKKyAgICAgICAgICAgICAgICAwLCBtQ2FzU2Vzc2lvbklkLmRhdGEoKSwgbUNhc1Nlc3Npb25JZC5zaXplKCkpOworICAgIH0KKworICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIDApOworCisgICAgLy8gY29weSBpbnRvIHNjcmFtYmxlZCBhY2Nlc3MgdW5pdAorICAgIHNwPEFCdWZmZXI+IHNjcmFtYmxlZEFjY2Vzc1VuaXQgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoCisgICAgICAgICAgICBtU2NyYW1ibGVkQnVmZmVyLT5kYXRhKCksIHNjcmFtYmxlZExlbmd0aCk7CisKICAgICBzY3JhbWJsZWRBY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwogICAgIGlmIChpc1N5bmMpIHsKICAgICAgICAgc2NyYW1ibGVkQWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiaXNTeW5jIiwgMSk7CkBAIC02MDAsNiArODU2LDcgQEAKICAgICBzY3JhbWJsZWRBY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDMyKCJjcnlwdG9LZXkiLCBrZXlJZCk7CiAgICAgc2NyYW1ibGVkQWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRCdWZmZXIoImNsZWFyQnl0ZXMiLCBjbGVhclNpemVzKTsKICAgICBzY3JhbWJsZWRBY2Nlc3NVbml0LT5tZXRhKCktPnNldEJ1ZmZlcigiZW5jQnl0ZXMiLCBlbmNTaXplcyk7CisgICAgc2NyYW1ibGVkQWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigicGVzT2Zmc2V0IiwgcGVzT2Zmc2V0KTsKIAogICAgIG1lbW1vdmUobVNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpLAogICAgICAgICAgICAgbVNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpICsgc2NyYW1ibGVkTGVuZ3RoLApAQCAtNjE0LDcgKzg3MSwxMSBAQAogfQogCiBzcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0KCkgewotICAgIGlmICgobUZsYWdzICYga0ZsYWdfQWxpZ25lZERhdGEpICYmIG1Nb2RlID09IEgyNjQgJiYgIWlzU2NyYW1ibGVkKCkpIHsKKyAgICBpZiAoaXNTY3JhbWJsZWQoKSkgeworICAgICAgICByZXR1cm4gZGVxdWV1ZVNjcmFtYmxlZEFjY2Vzc1VuaXQoKTsKKyAgICB9CisKKyAgICBpZiAoKG1GbGFncyAmIGtGbGFnX0FsaWduZWREYXRhKSAmJiBtTW9kZSA9PSBIMjY0KSB7CiAgICAgICAgIGlmIChtUmFuZ2VJbmZvcy5lbXB0eSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQpAQCAtNjQ4LDcgKzkwOSwxMCBAQAogICAgICAgICBjYXNlIEFBQzoKICAgICAgICAgICAgIHJldHVybiBkZXF1ZXVlQWNjZXNzVW5pdEFBQygpOwogICAgICAgICBjYXNlIEFDMzoKLSAgICAgICAgICAgIHJldHVybiBkZXF1ZXVlQWNjZXNzVW5pdEFDMygpOworICAgICAgICBjYXNlIEVBQzM6CisgICAgICAgICAgICByZXR1cm4gZGVxdWV1ZUFjY2Vzc1VuaXRFQUMzKCk7CisgICAgICAgIGNhc2UgQUM0OgorICAgICAgICAgICAgcmV0dXJuIGRlcXVldWVBY2Nlc3NVbml0QUM0KCk7CiAgICAgICAgIGNhc2UgTVBFR19WSURFTzoKICAgICAgICAgICAgIHJldHVybiBkZXF1ZXVlQWNjZXNzVW5pdE1QRUdWaWRlbygpOwogICAgICAgICBjYXNlIE1QRUc0X1ZJREVPOgpAQCAtNjY2LDM0ICs5MzAsMzggQEAKICAgICB9CiB9CiAKLXNwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZUFjY2Vzc1VuaXRBQzMoKSB7CitzcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0RUFDMygpIHsKICAgICB1bnNpZ25lZCBzeW5jU3RhcnRQb3MgPSAwOyAgLy8gaW4gYnl0ZXMKICAgICB1bnNpZ25lZCBwYXlsb2FkU2l6ZSA9IDA7CiAgICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKIAotICAgIEFMT0dWKCJkZXF1ZXVlQWNjZXNzVW5pdF9BQzNbJWRdOiBtQnVmZmVyICVwKCV6dSkiLCBtQVVJbmRleCwgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpOworICAgIEFMT0dWKCJkZXF1ZXVlQWNjZXNzVW5pdEVBQzNbJWRdOiBtQnVmZmVyICVwKCV6dSkiLCBtQVVJbmRleCwKKyAgICAgICAgICAgIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKTsKIAogICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgIGlmIChzeW5jU3RhcnRQb3MgKyAyID49IG1CdWZmZXItPnNpemUoKSkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KIAotICAgICAgICBwYXlsb2FkU2l6ZSA9IHBhcnNlQUMzU3luY0ZyYW1lKAotICAgICAgICAgICAgICAgIG1CdWZmZXItPmRhdGEoKSArIHN5bmNTdGFydFBvcywKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5zaXplKCkgLSBzeW5jU3RhcnRQb3MsCi0gICAgICAgICAgICAgICAgJmZvcm1hdCk7CisgICAgICAgIHVpbnQ4X3QgKnB0ciA9IG1CdWZmZXItPmRhdGEoKSArIHN5bmNTdGFydFBvczsKKyAgICAgICAgc2l6ZV90IHNpemUgPSBtQnVmZmVyLT5zaXplKCkgLSBzeW5jU3RhcnRQb3M7CisgICAgICAgIGlmIChtTW9kZSA9PSBBQzMpIHsKKyAgICAgICAgICAgIHBheWxvYWRTaXplID0gcGFyc2VBQzNTeW5jRnJhbWUocHRyLCBzaXplLCAmZm9ybWF0KTsKKyAgICAgICAgfSBlbHNlIGlmIChtTW9kZSA9PSBFQUMzKSB7CisgICAgICAgICAgICBwYXlsb2FkU2l6ZSA9IHBhcnNlRUFDM1N5bmNGcmFtZShwdHIsIHNpemUsICZmb3JtYXQpOworICAgICAgICB9CiAgICAgICAgIGlmIChwYXlsb2FkU2l6ZSA+IDApIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgQUxPR1YoImRlcXVldWVBY2Nlc3NVbml0X0FDM1slZF06IHN5bmNTdGFydFBvcyAldSBwYXlsb2FkU2l6ZSAldSIsCisgICAgICAgIEFMT0dWKCJkZXF1ZXVlQWNjZXNzVW5pdEVBQzNbJWRdOiBzeW5jU3RhcnRQb3MgJXUgcGF5bG9hZFNpemUgJXUiLAogICAgICAgICAgICAgICAgIG1BVUluZGV4LCBzeW5jU3RhcnRQb3MsIHBheWxvYWRTaXplKTsKIAogICAgICAgICArK3N5bmNTdGFydFBvczsKICAgICB9CiAKICAgICBpZiAobUJ1ZmZlci0+c2l6ZSgpIDwgc3luY1N0YXJ0UG9zICsgcGF5bG9hZFNpemUpIHsKLSAgICAgICAgQUxPR1YoIk5vdCBlbm91Z2ggYnVmZmVyIHNpemUgZm9yIEFDMyIpOworICAgICAgICBBTE9HVigiTm90IGVub3VnaCBidWZmZXIgc2l6ZSBmb3IgRS9BQzMiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC03MDEsNyArOTY5LDYgQEAKICAgICAgICAgbUZvcm1hdCA9IGZvcm1hdDsKICAgICB9CiAKLQogICAgIGludDY0X3QgdGltZVVzID0gZmV0Y2hUaW1lc3RhbXAoc3luY1N0YXJ0UG9zICsgcGF5bG9hZFNpemUpOwogICAgIGlmICh0aW1lVXMgPCAwbGwpIHsKICAgICAgICAgQUxPR0UoIm5lZ2F0aXZlIHRpbWVVcyIpOwpAQCAtNzEwLDcgKzk3NywxMiBAQAogCiAgICAgLy8gTm90IGRlY3J5cHRpbmcgaWYga2V5IGluZm8gbm90IGF2YWlsYWJsZSAoZS5nLiwgc2Nhbm5lci9leHRyYWN0b3IgcGFyc2luZyB0cyBmaWxlcykKICAgICBpZiAobVNhbXBsZURlY3J5cHRvciAhPSBOVUxMKSB7Ci0gICAgICAgIG1TYW1wbGVEZWNyeXB0b3ItPnByb2Nlc3NBQzMobUJ1ZmZlci0+ZGF0YSgpICsgc3luY1N0YXJ0UG9zLCBwYXlsb2FkU2l6ZSk7CisgICAgICAgIGlmIChtTW9kZSA9PSBBQzMpIHsKKyAgICAgICAgICAgIG1TYW1wbGVEZWNyeXB0b3ItPnByb2Nlc3NBQzMobUJ1ZmZlci0+ZGF0YSgpICsgc3luY1N0YXJ0UG9zLCBwYXlsb2FkU2l6ZSk7CisgICAgICAgIH0gZWxzZSBpZiAobU1vZGUgPT0gRUFDMykgeworICAgICAgICAgICAgQUxPR0UoIkVBQzMgQVUgaXMgZW5jcnlwdGVkIGFuZCBkZWNyeXB0aW9uIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAgICAgfQogICAgIG1BVUluZGV4Kys7CiAKQEAgLTczMCw2ICsxMDAyLDY5IEBACiAgICAgcmV0dXJuIGFjY2Vzc1VuaXQ7CiB9CiAKK3NwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZUFjY2Vzc1VuaXRBQzQoKSB7CisgICAgdW5zaWduZWQgc3luY1N0YXJ0UG9zID0gMDsKKyAgICB1bnNpZ25lZCBwYXlsb2FkU2l6ZSA9IDA7CisgICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKKyAgICBBTE9HVigiZGVxdWV1ZUFjY2Vzc1VuaXRfQUM0WyVkXTogbUJ1ZmZlciAlcCglenUpIiwgbUFVSW5kZXgsIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKTsKKworICAgIC8vIEEgdmFsaWQgQUM0IHN0cmVhbSBzaG91bGQgaGF2ZSBtaW5pbXVtIG9mIDcgYnl0ZXMgaW4gaXRzIGJ1ZmZlci4KKyAgICAvLyAoU3luYyBoZWFkZXIgNCBieXRlcyArIEFDNCB0b2MgMyBieXRlcykKKyAgICBpZiAobUJ1ZmZlci0+c2l6ZSgpIDwgNykgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoc3luY1N0YXJ0UG9zICsgMiA+PSBtQnVmZmVyLT5zaXplKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyc2VBQzRTeW5jRnJhbWUoCisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPmRhdGEoKSArIHN5bmNTdGFydFBvcywKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+c2l6ZSgpIC0gc3luY1N0YXJ0UG9zLAorICAgICAgICAgICAgICAgICAgICBwYXlsb2FkU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgJmZvcm1hdCk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgQUxPR1YoImRlcXVldWVBY2Nlc3NVbml0X0FDNFslZF06IHN5bmNTdGFydFBvcyAldSBwYXlsb2FkU2l6ZSAldSIsCisgICAgICAgICAgICAgICAgbUFVSW5kZXgsIHN5bmNTdGFydFBvcywgcGF5bG9hZFNpemUpOworCisgICAgICAgICsrc3luY1N0YXJ0UG9zOworICAgIH0KKworICAgIGlmIChtQnVmZmVyLT5zaXplKCkgPCBzeW5jU3RhcnRQb3MgKyBwYXlsb2FkU2l6ZSkgeworICAgICAgICBBTE9HVigiTm90IGVub3VnaCBidWZmZXIgc2l6ZSBmb3IgQUM0Iik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgbUZvcm1hdCA9IGZvcm1hdDsKKyAgICB9CisKKyAgICBpbnQ2NF90IHRpbWVVcyA9IGZldGNoVGltZXN0YW1wKHN5bmNTdGFydFBvcyArIHBheWxvYWRTaXplKTsKKyAgICBpZiAodGltZVVzIDwgMGxsKSB7CisgICAgICAgIEFMT0dFKCJuZWdhdGl2ZSB0aW1lVXMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIG1BVUluZGV4Kys7CisKKyAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0ID0gbmV3IEFCdWZmZXIoc3luY1N0YXJ0UG9zICsgcGF5bG9hZFNpemUpOworICAgIG1lbWNweShhY2Nlc3NVbml0LT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSwgc3luY1N0YXJ0UG9zICsgcGF5bG9hZFNpemUpOworCisgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKKyAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDMyKCJpc1N5bmMiLCAxKTsKKworICAgIG1lbW1vdmUoCisgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCksCisgICAgICAgICAgICBtQnVmZmVyLT5kYXRhKCkgKyBzeW5jU3RhcnRQb3MgKyBwYXlsb2FkU2l6ZSwKKyAgICAgICAgICAgIG1CdWZmZXItPnNpemUoKSAtIHN5bmNTdGFydFBvcyAtIHBheWxvYWRTaXplKTsKKworICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIG1CdWZmZXItPnNpemUoKSAtIHN5bmNTdGFydFBvcyAtIHBheWxvYWRTaXplKTsKKyAgICByZXR1cm4gYWNjZXNzVW5pdDsKK30KKwogc3A8QUJ1ZmZlcj4gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpkZXF1ZXVlQWNjZXNzVW5pdFBDTUF1ZGlvKCkgewogICAgIGlmIChtQnVmZmVyLT5zaXplKCkgPCA0KSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNzc2LDcgKzExMTEsNyBAQAogICAgIG1lbWNweShhY2Nlc3NVbml0LT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSArIDQsIHBheWxvYWRTaXplKTsKIAogICAgIGludDY0X3QgdGltZVVzID0gZmV0Y2hUaW1lc3RhbXAocGF5bG9hZFNpemUgKyA0KTsKLSAgICBpZiAodGltZVVzIDwgMGxsKSB7CisgICAgaWYgKHRpbWVVcyA8IDBMTCkgewogICAgICAgICBBTE9HRSgiTmVnYXRpdmUgdGltZVVzIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTgxMiw3ICsxMTQ3LDcgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCi0gICAgaWYgKGluZm8ubVRpbWVzdGFtcFVzIDwgMGxsKSB7CisgICAgaWYgKGluZm8ubVRpbWVzdGFtcFVzIDwgMExMKSB7CiAgICAgICAgIEFMT0dFKCJOZWdhdGl2ZSBpbmZvLm1UaW1lc3RhbXBVcyIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC04NTEsMjUgKzExODYsMTEgQEAKICAgICAgICAgYm9vbCBwcm90ZWN0aW9uX2Fic2VudCA9IGJpdHMuZ2V0Qml0cygxKSAhPSAwOwogCiAgICAgICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIHByb2ZpbGUgPSBiaXRzLmdldEJpdHMoMik7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZSA9PSAzdSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJwcm9maWxlIHNob3VsZCBub3QgYmUgMyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCA9IGJpdHMuZ2V0Qml0cyg0KTsKLSAgICAgICAgICAgIGJpdHMuZ2V0Qml0cygxKTsgIC8vIHByaXZhdGVfYml0Ci0gICAgICAgICAgICB1bnNpZ25lZCBjaGFubmVsX2NvbmZpZ3VyYXRpb24gPSBiaXRzLmdldEJpdHMoMyk7Ci0gICAgICAgICAgICBpZiAoY2hhbm5lbF9jb25maWd1cmF0aW9uID09IDB1KSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImNoYW5uZWxfY29uZmlnIHNob3VsZCBub3QgYmUgMCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYml0cy5za2lwQml0cygyKTsgIC8vIG9yaWdpbmFsX2NvcHksIGhvbWUKLQogICAgICAgICAgICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKLSAgICAgICAgICAgIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSgqbUZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSwgc2FtcGxpbmdfZnJlcV9pbmRleCwgY2hhbm5lbF9jb25maWd1cmF0aW9uKTsKLQotICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUlzQURUUywgdHJ1ZSk7CisgICAgICAgICAgICBpZiAoIU1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgICAgICAgICAgICAgKm1Gb3JtYXQsIG1CdWZmZXItPmRhdGEoKSArIG9mZnNldCwgbUJ1ZmZlci0+c2l6ZSgpIC0gb2Zmc2V0KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGU7CiAgICAgICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzOwpAQCAtODg0LDEyICsxMjA1LDEyIEBACiAKICAgICAgICAgICAgIEFMT0dJKCJmb3VuZCBBQUMgY29kZWMgY29uZmlnICglZCBIeiwgJWQgY2hhbm5lbHMpIiwKICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gcHJvZmlsZV9PYmplY3RUeXBlLCBzYW1wbGluZ19mcmVxdWVuY3lfaW5kZXgsIHByaXZhdGVfYml0cywKLSAgICAgICAgICAgIC8vIGNoYW5uZWxfY29uZmlndXJhdGlvbiwgb3JpZ2luYWxfY29weSwgaG9tZQotICAgICAgICAgICAgYml0cy5za2lwQml0cygxMik7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBwcm9maWxlX09iamVjdFR5cGUsIHNhbXBsaW5nX2ZyZXF1ZW5jeV9pbmRleCwgcHJpdmF0ZV9iaXRzLAorICAgICAgICAvLyBjaGFubmVsX2NvbmZpZ3VyYXRpb24sIG9yaWdpbmFsX2NvcHksIGhvbWUKKyAgICAgICAgYml0cy5za2lwQml0cygxMik7CisKICAgICAgICAgLy8gYWR0c192YXJpYWJsZV9oZWFkZXIKIAogICAgICAgICAvLyBjb3B5cmlnaHRfaWRlbnRpZmljYXRpb25fYml0LCBjb3B5cmlnaHRfaWRlbnRpZmljYXRpb25fc3RhcnQKQEAgLTk5Niw3ICsxMzE3LDcgQEAKIAogICAgIH0KIAotICAgIGlmICh0aW1lVXMgPT0gMGxsKSB7CisgICAgaWYgKHRpbWVVcyA9PSAwTEwpIHsKICAgICAgICAgQUxPR1YoIlJldHVybmluZyAwIHRpbWVzdGFtcCIpOwogICAgIH0KIApAQCAtMTAwNCwyNyArMTMyNSw2IEBACiB9CiAKIHNwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZUFjY2Vzc1VuaXRIMjY0KCkgewotICAgIGlmIChpc1NjcmFtYmxlZCgpKSB7Ci0gICAgICAgIGlmIChtQnVmZmVyID09IE5VTEwgfHwgbUJ1ZmZlci0+c2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7Ci0gICAgICAgICAgICBpZiAoIU1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YSgqbUZvcm1hdCwgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIkNyZWF0aW5nIGR1bW15IEFWQyBmb3JtYXQgZm9yIHNjcmFtYmxlZCBjb250ZW50Iik7Ci0gICAgICAgICAgICAgICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKLSAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKLSAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5V2lkdGgsIDEyODApOwotICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlIZWlnaHQsIDcyMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBmb3IgTWVkaWFFeHRyYWN0b3IuQ2FzSW5mbwotICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUNBU3lzdGVtSUQsIG1DQVN5c3RlbUlkKTsKLSAgICAgICAgICAgIG1Gb3JtYXQtPnNldERhdGEoa0tleUNBU2Vzc2lvbklELCAwLAotICAgICAgICAgICAgICAgICAgICBtQ2FzU2Vzc2lvbklkLmRhdGEoKSwgbUNhc1Nlc3Npb25JZC5zaXplKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkZXF1ZXVlU2NyYW1ibGVkQWNjZXNzVW5pdCgpOwotICAgIH0KLQogICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBtQnVmZmVyLT5kYXRhKCk7CiAKICAgICBzaXplX3Qgc2l6ZSA9IG1CdWZmZXItPnNpemUoKTsKQEAgLTExNjAsNyArMTQ2MCw3IEBACiAgICAgICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkgLSBuZXh0U2Nhbik7CiAKICAgICAgICAgICAgIGludDY0X3QgdGltZVVzID0gZmV0Y2hUaW1lc3RhbXAobmV4dFNjYW4pOwotICAgICAgICAgICAgaWYgKHRpbWVVcyA8IDBsbCkgeworICAgICAgICAgICAgaWYgKHRpbWVVcyA8IDBMTCkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJOZWdhdGl2ZSB0aW1lVXMiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgICAgIH0KQEAgLTEyMjYsNiArMTUyNiw3IEBACiAgICAgICAgICAgICAgICAgaGVhZGVyLCAmZnJhbWVTaXplLCAmc2FtcGxpbmdSYXRlLCAmbnVtQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgJmJpdHJhdGUsICZudW1TYW1wbGVzKSkgewogICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBhdWRpbyBmcmFtZSBzaXplIik7CisgICAgICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIDApOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTEyNDUsMTEgKzE1NDYsMjcgQEAKICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkgLSBmcmFtZVNpemUpOwogCiAgICAgaW50NjRfdCB0aW1lVXMgPSBmZXRjaFRpbWVzdGFtcChmcmFtZVNpemUpOwotICAgIGlmICh0aW1lVXMgPCAwbGwpIHsKKyAgICBpZiAodGltZVVzIDwgMExMKSB7CiAgICAgICAgIEFMT0dFKCJOZWdhdGl2ZSB0aW1lVXMiKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCisgICAgaWYgKG1Gb3JtYXQgIT0gTlVMTCkgeworICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICBpZiAobUZvcm1hdC0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpIHsKKyAgICAgICAgICAgIGlmICgobGF5ZXIgPT0gMSkgJiYgc3RyY21wIChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0kpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkF1ZGlvIGxheWVyIGlzIG5vdCBNUEVHX0xBWUVSX0kiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKGxheWVyID09IDIpICYmIHN0cmNtcCAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JSSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQXVkaW8gbGF5ZXIgaXMgbm90IE1QRUdfTEFZRVJfSUkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKGxheWVyID09IDMpICYmIHN0cmNtcCAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRykpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQXVkaW8gbGF5ZXIgaXMgbm90IEFVRElPX01QRUciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CiAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiaXNTeW5jIiwgMSk7CiAKQEAgLTEzMjQsMjUgKzE2NDEsNiBAQAogfQogCiBzcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0TVBFR1ZpZGVvKCkgewotICAgIGlmIChpc1NjcmFtYmxlZCgpKSB7Ci0gICAgICAgIGlmIChtQnVmZmVyID09IE5VTEwgfHwgbUJ1ZmZlci0+c2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dJKCJDcmVhdGluZyBkdW1teSBNUEVHIGZvcm1hdCBmb3Igc2NyYW1ibGVkIGNvbnRlbnQiKTsKLSAgICAgICAgICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7Ci0gICAgICAgICAgICBtRm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpOwotICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVdpZHRoLCAxMjgwKTsKLSAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlIZWlnaHQsIDcyMCk7Ci0KLSAgICAgICAgICAgIC8vIGZvciBNZWRpYUV4dHJhY3Rvci5DYXNJbmZvCi0gICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5Q0FTeXN0ZW1JRCwgbUNBU3lzdGVtSWQpOwotICAgICAgICAgICAgbUZvcm1hdC0+c2V0RGF0YShrS2V5Q0FTZXNzaW9uSUQsIDAsCi0gICAgICAgICAgICAgICAgICAgIG1DYXNTZXNzaW9uSWQuZGF0YSgpLCBtQ2FzU2Vzc2lvbklkLnNpemUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlcXVldWVTY3JhbWJsZWRBY2Nlc3NVbml0KCk7Ci0gICAgfQotCiAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IG1CdWZmZXItPmRhdGEoKTsKICAgICBzaXplX3Qgc2l6ZSA9IG1CdWZmZXItPnNpemUoKTsKIApAQCAtMTQ1MSw3ICsxNzQ5LDcgQEAKICAgICAgICAgICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCBtQnVmZmVyLT5zaXplKCkgLSBvZmZzZXQpOwogCiAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMgPSBmZXRjaFRpbWVzdGFtcChvZmZzZXQpOwotICAgICAgICAgICAgICAgIGlmICh0aW1lVXMgPCAwbGwpIHsKKyAgICAgICAgICAgICAgICBpZiAodGltZVVzIDwgMExMKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOZWdhdGl2ZSB0aW1lVXMiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTY0OCw3ICsxOTQ2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgc2l6ZSk7CiAKICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXMgPSBmZXRjaFRpbWVzdGFtcChvZmZzZXQpOwotICAgICAgICAgICAgICAgICAgICBpZiAodGltZVVzIDwgMGxsKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh0aW1lVXMgPCAwTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOZWdhdGl2ZSB0aW1ldXMiKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oCmluZGV4IGZmY2I1MDIuLjMyMjdmNDcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5oCkBAIC0zOCw2ICszOCw4IEBACiAgICAgICAgIEgyNjQsCiAgICAgICAgIEFBQywKICAgICAgICAgQUMzLAorICAgICAgICBFQUMzLAorICAgICAgICBBQzQsCiAgICAgICAgIE1QRUdfQVVESU8sCiAgICAgICAgIE1QRUdfVklERU8sCiAgICAgICAgIE1QRUc0X1ZJREVPLApAQCAtNTksNiArNjEsNyBAQAogCiAgICAgdm9pZCBhcHBlbmRTY3JhbWJsZWREYXRhKAogICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICBzaXplX3QgbGVhZGluZ0NsZWFyQnl0ZXMsCiAgICAgICAgICAgICBpbnQzMl90IGtleUlkLCBib29sIGlzU3luYywKICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGNsZWFyU2l6ZXMsIHNwPEFCdWZmZXI+IGVuY1NpemVzKTsKIApAQCAtODQsOCArODcsOCBAQAogICAgIH07CiAKICAgICBzdHJ1Y3QgU2NyYW1ibGVkUmFuZ2VJbmZvIHsKLSAgICAgICAgLy9pbnQ2NF90IG1UaW1lc3RhbXBVczsKICAgICAgICAgc2l6ZV90IG1MZW5ndGg7CisgICAgICAgIHNpemVfdCBtTGVhZGluZ0NsZWFyQnl0ZXM7CiAgICAgICAgIGludDMyX3QgbUtleUlkOwogICAgICAgICBpbnQzMl90IG1Jc1N5bmM7CiAgICAgICAgIHNwPEFCdWZmZXI+IG1DbGVhclNpemVzOwpAQCAtMTE1LDcgKzExOCw4IEBACiAKICAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdEgyNjQoKTsKICAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdEFBQygpOwotICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0QUMzKCk7CisgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRFQUMzKCk7CisgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRBQzQoKTsKICAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdE1QRUdBdWRpbygpOwogICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0TVBFR1ZpZGVvKCk7CiAgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRNUEVHNFZpZGVvKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0hsc1NhbXBsZURlY3J5cHRvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0hsc1NhbXBsZURlY3J5cHRvci5jcHAKaW5kZXggZTMyZjY3Ni4uN2Q0NDZhYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9IbHNTYW1wbGVEZWNyeXB0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvSGxzU2FtcGxlRGVjcnlwdG9yLmNwcApAQCAtMTQ5LDYgKzE0OSwxMSBAQAogICAgIH0KIAogICAgIC8vIEFEVFMgaGVhZGVyIGlzIGluY2x1ZGVkIGluIHRoZSBzaXplCisgICAgaWYgKHNpemUgPCBhZHRzSGRyU2l6ZSkgeworICAgICAgICBBTE9HVigicHJvY2Vzc0FBQzogc2l6ZSAoJXp1KSA8IGFkdHNIZHJTaXplICglenUpIiwgc2l6ZSwgYWR0c0hkclNpemUpOworICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjEyODQzMzkzMyIpOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIHNpemVfdCBvZmZzZXQgPSBhZHRzSGRyU2l6ZTsKICAgICBzaXplX3QgcmVtYWluaW5nQnl0ZXMgPSBzaXplIC0gYWR0c0hkclNpemU7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214LmNwcAppbmRleCA0ZTJkMzk4Li5lZWY5Y2UzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXguY3BwCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSA8bGlzdD4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Db3JlLmg+CiAjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfQXNTdHJpbmcuaD4KIApAQCAtMjgsNyArMjcsNiBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XT214Tm9kZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV09teE9ic2VydmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214Lmg+CkBAIC00NSw2ICs0Myw4IEBACiBPbXg6Ok9teCgpIDoKICAgICBtTWFzdGVyKG5ldyBPTVhNYXN0ZXIoKSksCiAgICAgbVBhcnNlcigpIHsKKyAgICAodm9pZCltUGFyc2VyLnBhcnNlWG1sRmlsZXNJblNlYXJjaERpcnMoKTsKKyAgICAodm9pZCltUGFyc2VyLnBhcnNlWG1sUGF0aChtUGFyc2VyLmRlZmF1bHRQcm9maWxpbmdSZXN1bHRzWG1sUGF0aCk7CiB9CiAKIE9teDo6fk9teCgpIHsKQEAgLTEyNCwxMSArMTI0LDExIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB1aW50MzJfdCBxdWlya3MgPSAwOwogICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBxdWlyayA6IGNvZGVjLT5zZWNvbmQucXVpcmtTZXQpIHsKLSAgICAgICAgICAgICAgICBpZiAocXVpcmsgPT0gInJlcXVpcmVzLWFsbG9jYXRlLW9uLWlucHV0LXBvcnRzIikgeworICAgICAgICAgICAgICAgIGlmIChxdWlyayA9PSAicXVpcms6OnJlcXVpcmVzLWFsbG9jYXRlLW9uLWlucHV0LXBvcnRzIikgewogICAgICAgICAgICAgICAgICAgICBxdWlya3MgfD0gT01YTm9kZUluc3RhbmNlOjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uSW5wdXRQb3J0czsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHF1aXJrID09ICJyZXF1aXJlcy1hbGxvY2F0ZS1vbi1vdXRwdXQtcG9ydHMiKSB7CisgICAgICAgICAgICAgICAgaWYgKHF1aXJrID09ICJxdWlyazo6cmVxdWlyZXMtYWxsb2NhdGUtb24tb3V0cHV0LXBvcnRzIikgewogICAgICAgICAgICAgICAgICAgICBxdWlya3MgfD0gT01YTm9kZUluc3RhbmNlOjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uT3V0cHV0UG9ydHM7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTQ2LDggKzE0Niw2IEBACiB9CiAKIFJldHVybjx2b2lkPiBPbXg6OmNyZWF0ZUlucHV0U3VyZmFjZShjcmVhdGVJbnB1dFN1cmZhY2VfY2IgX2hpZGxfY2IpIHsKLSAgICBzcDw6OmFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGJ1ZmZlclByb2R1Y2VyOwotCiAgICAgc3A8T214R3JhcGhpY0J1ZmZlclNvdXJjZT4gZ3JhcGhpY0J1ZmZlclNvdXJjZSA9IG5ldyBPbXhHcmFwaGljQnVmZmVyU291cmNlKCk7CiAgICAgc3RhdHVzX3QgZXJyID0gZ3JhcGhpY0J1ZmZlclNvdXJjZS0+aW5pdENoZWNrKCk7CiAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtMTU3LDEwICsxNTUsOSBAQAogICAgICAgICBfaGlkbF9jYih0b1N0YXR1cyhlcnIpLCBudWxscHRyLCBudWxscHRyKTsKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9Ci0gICAgYnVmZmVyUHJvZHVjZXIgPSBncmFwaGljQnVmZmVyU291cmNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CiAKICAgICBfaGlkbF9jYih0b1N0YXR1cyhPSyksCi0gICAgICAgICAgICBuZXcgVFdHcmFwaGljQnVmZmVyUHJvZHVjZXIoYnVmZmVyUHJvZHVjZXIpLAorICAgICAgICAgICAgZ3JhcGhpY0J1ZmZlclNvdXJjZS0+Z2V0SEdyYXBoaWNCdWZmZXJQcm9kdWNlcl9WMV8wKCksCiAgICAgICAgICAgICBuZXcgVFdHcmFwaGljQnVmZmVyU291cmNlKGdyYXBoaWNCdWZmZXJTb3VyY2UpKTsKICAgICByZXR1cm4gVm9pZCgpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmNwcAppbmRleCA0NDdhZjZmLi42N2Y0NzhlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmNwcApAQCAtMTcsNiArMTcsOCBAQAogI2luY2x1ZGUgPGlvcz4KICNpbmNsdWRlIDxsaXN0PgogCisjZGVmaW5lIExPR19UQUcgIk9teFN0b3JlIgorCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oPgpAQCAtMzAsMTYgKzMyLDMzIEBACiBuYW1lc3BhY2UgVjFfMCB7CiBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24gewogCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjpTdGF0dXM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjpJT214OworCiBPbXhTdG9yZTo6T214U3RvcmUoCisgICAgICAgIGNvbnN0IHNwPElPbXg+ICZvbXgsCiAgICAgICAgIGNvbnN0IGNoYXIqIG93bmVyLAotICAgICAgICBjb25zdCBjaGFyKiBjb25zdCogc2VhcmNoRGlycywKLSAgICAgICAgY29uc3QgY2hhciogbWFpblhtbE5hbWUsCi0gICAgICAgIGNvbnN0IGNoYXIqIHBlcmZvcm1hbmNlWG1sTmFtZSwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZzZWFyY2hEaXJzLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJnhtbE5hbWVzLAogICAgICAgICBjb25zdCBjaGFyKiBwcm9maWxpbmdSZXN1bHRzWG1sUGF0aCkgewotICAgIE1lZGlhQ29kZWNzWG1sUGFyc2VyIHBhcnNlcihzZWFyY2hEaXJzLAotICAgICAgICAgICAgbWFpblhtbE5hbWUsCi0gICAgICAgICAgICBwZXJmb3JtYW5jZVhtbE5hbWUsCi0gICAgICAgICAgICBwcm9maWxpbmdSZXN1bHRzWG1sUGF0aCk7CisgICAgLy8gcmV0cmlldmUgbGlzdCBvZiBvbXggbm9kZXMKKyAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gbm9kZXM7CisgICAgaWYgKG9teCAhPSBudWxscHRyKSB7CisgICAgICAgIG9teC0+bGlzdE5vZGVzKFsmbm9kZXNdKGNvbnN0IFN0YXR1cyAmc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxJT214OjpDb21wb25lbnRJbmZvPiAmbm9kZUxpc3QpIHsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgSU9teDo6Q29tcG9uZW50SW5mbyYgaW5mbyA6IG5vZGVMaXN0KSB7CisgICAgICAgICAgICAgICAgICAgIG5vZGVzLmVtcGxhY2UoaW5mby5tTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIE1lZGlhQ29kZWNzWG1sUGFyc2VyIHBhcnNlcjsKKyAgICBwYXJzZXIucGFyc2VYbWxGaWxlc0luU2VhcmNoRGlycyh4bWxOYW1lcywgc2VhcmNoRGlycyk7CisgICAgaWYgKHByb2ZpbGluZ1Jlc3VsdHNYbWxQYXRoICE9IG51bGxwdHIpIHsKKyAgICAgICAgcGFyc2VyLnBhcnNlWG1sUGF0aChwcm9maWxpbmdSZXN1bHRzWG1sUGF0aCk7CisgICAgfQogICAgIG1QYXJzaW5nU3RhdHVzID0gdG9TdGF0dXMocGFyc2VyLmdldFBhcnNpbmdTdGF0dXMoKSk7CiAKICAgICBjb25zdCBhdXRvJiBzZXJ2aWNlQXR0cmlidXRlTWFwID0gcGFyc2VyLmdldFNlcnZpY2VBdHRyaWJ1dGVNYXAoKTsKQEAgLTYxLDE0ICs4MCwxOCBAQAogICAgICAgICByb2xlLnJvbGUgPSByb2xlUGFpci5maXJzdDsKICAgICAgICAgcm9sZS50eXBlID0gcm9sZVBhaXIuc2Vjb25kLnR5cGU7CiAgICAgICAgIHJvbGUuaXNFbmNvZGVyID0gcm9sZVBhaXIuc2Vjb25kLmlzRW5jb2RlcjsKLSAgICAgICAgLy8gVE9ETzogQ3VycmVudGx5LCBwcmVmZXJQbGF0Zm9ybU5vZGVzIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUgaW4KLSAgICAgICAgLy8gdGhlIHhtbCBmaWxlLiBPbmNlIHdlIGhhdmUgYSB3YXkgdG8gcHJvdmlkZSB0aGlzIGluZm9ybWF0aW9uLCBpdAotICAgICAgICAvLyBzaG91bGQgYmUgcGFyc2VkIHByb3Blcmx5LgotICAgICAgICByb2xlLnByZWZlclBsYXRmb3JtTm9kZXMgPSByb2xlUGFpci5maXJzdC5jb21wYXJlKDAsIDUsICJhdWRpbyIpID09IDA7CisgICAgICAgIHJvbGUucHJlZmVyUGxhdGZvcm1Ob2RlcyA9IGZhbHNlOyAvLyBkZXByZWNhdGVkIGFuZCBpZ25vcmVkLCB1c2luZyByYW5rIGluc3RlYWQKICAgICAgICAgaGlkbF92ZWM8Tm9kZUluZm8+JiBub2RlTGlzdCA9IHJvbGUubm9kZXM7CiAgICAgICAgIG5vZGVMaXN0LnJlc2l6ZShyb2xlUGFpci5zZWNvbmQubm9kZUxpc3Quc2l6ZSgpKTsKICAgICAgICAgc2l6ZV90IGogPSAwOwogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIG5vZGVQYWlyIDogcm9sZVBhaXIuc2Vjb25kLm5vZGVMaXN0KSB7CisgICAgICAgICAgICBpZiAoIW5vZGVzLmNvdW50KG5vZGVQYWlyLnNlY29uZC5uYW1lKSkgeworICAgICAgICAgICAgICAgIC8vIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBPTVggaW5zdGFuY2UKKyAgICAgICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKG5vZGVQYWlyLnNlY29uZC5uYW1lLmNfc3RyKCksICJvbXguIiwgNCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJub2RlIFsiIDw8IG5vZGVQYWlyLnNlY29uZC5uYW1lLmNfc3RyKCkgPDwgIl0gbm90IGZvdW5kIGluIElPbXgiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIE5vZGVJbmZvIG5vZGU7CiAgICAgICAgICAgICBub2RlLm5hbWUgPSBub2RlUGFpci5zZWNvbmQubmFtZTsKICAgICAgICAgICAgIG5vZGUub3duZXIgPSBvd25lcjsKQEAgLTg1LDYgKzEwOCw3IEBACiAgICAgICAgICAgICBub2RlTGlzdFtqXSA9IHN0ZDo6bW92ZShub2RlKTsKICAgICAgICAgICAgICsrajsKICAgICAgICAgfQorICAgICAgICBub2RlTGlzdC5yZXNpemUoaik7CiAgICAgICAgIG1Sb2xlTGlzdFtpXSA9IHN0ZDo6bW92ZShyb2xlKTsKICAgICAgICAgKytpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQuYnAKaW5kZXggM2U2OTQyYi4uZTI2MGNhZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQuYnAKQEAgLTYsMTYgKzYsMTAgQEAKICAgICB9LAogCiAgICAgc3JjczogWwotICAgICAgICAiQldHcmFwaGljQnVmZmVyU291cmNlLmNwcCIsCiAgICAgICAgICJPTVhNYXN0ZXIuY3BwIiwKICAgICAgICAgIk9NWE5vZGVJbnN0YW5jZS5jcHAiLAogICAgICAgICAiT01YVXRpbHMuY3BwIiwKICAgICAgICAgIk9teEdyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIiwKLSAgICAgICAgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuY3BwIiwKLSAgICAgICAgIlNvZnRPTVhDb21wb25lbnQuY3BwIiwKLSAgICAgICAgIlNvZnRPTVhQbHVnaW4uY3BwIiwKLSAgICAgICAgIlNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwIiwKLSAgICAgICAgIlNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuY3BwIiwKICAgICAgICAgIjEuMC9PbXguY3BwIiwKICAgICAgICAgIjEuMC9PbXhTdG9yZS5jcHAiLAogICAgICAgICAiMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmNwcCIsCkBAIC0yOSw2ICsyMyw3IEBACiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAogICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAogICAgIF0sCiAKQEAgLTQzLDcgKzM4LDYgQEAKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJ1aSIsCi0gICAgICAgICJsaWJndWkiLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycXVldWVfaGVscGVyIiwKQEAgLTUyLDE0ICs0NiwxMiBAQAogICAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgICAibGliaGlkbG1lbW9yeSIsCiAgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKLSAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsIC8vIFRPRE8oYi82MjkyMzQ3OSk6IHVzZSBoZWFkZXIgbGlicmFyeQogICAgICAgICAibGlidm5ka3N1cHBvcnQiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKICAgICBdLAogCiAgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwotICAgICAgICAibGlibWVkaWFfb214IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIiwKICAgICAgICAgImxpYnV0aWxzIiwKQEAgLTc4LDEwICs3MCwxMjggQEAKICAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKKworICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdG9teCIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuY3BwIiwKKyAgICAgICAgIlNvZnRPTVhDb21wb25lbnQuY3BwIiwKKyAgICAgICAgIlNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwIiwKKyAgICAgICAgIlNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuY3BwIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCisgICAgXSwKKworICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCisgICAgICAgICItV25vLWRvY3VtZW50YXRpb24iLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdG9teF9wbHVnaW4iLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJTb2Z0T01YUGx1Z2luLmNwcCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9zb2Z0b214IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1Xbm8tdW51c2VkLXBhcmFtZXRlciIsCisgICAgICAgICItV25vLWRvY3VtZW50YXRpb24iLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCit9CisKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCisKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQogCiBjY19saWJyYXJ5X3NoYXJlZCB7CkBAIC05MCw2ICsyMDAsNyBAQAogICAgIHZuZGs6IHsKICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKICAgICB9LAorICAgIGRvdWJsZV9sb2FkYWJsZTogdHJ1ZSwKICAgICBzcmNzOiBbIk9NWFV0aWxzLmNwcCJdLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKICAgICAgICAgImluY2x1ZGUiLApAQCAtMTE0LDEzICsyMjUsNyBAQAogICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAogICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCiB9CiAKLS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1zdWJkaXJzID0gWyJ0ZXN0cyJdCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQldHcmFwaGljQnVmZmVyU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9CV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTMwYTQ2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9CV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkJXR3JhcGhpY0J1ZmZlclNvdXJjZSIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9CV0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Db21wb25lbnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9JbmRleEV4dC5oPgotI2luY2x1ZGUgPG1lZGlhL09NWEJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgY29uc3QgT01YX1UzMiBrUG9ydEluZGV4SW5wdXQgPSAwOwotCi1zdHJ1Y3QgQldHcmFwaGljQnVmZmVyU291cmNlOjpCV09teE5vZGVXcmFwcGVyIDogcHVibGljIElPbXhOb2RlV3JhcHBlciB7Ci0gICAgc3A8SU9NWE5vZGU+IG1PTVhOb2RlOwotCi0gICAgQldPbXhOb2RlV3JhcHBlcihjb25zdCBzcDxJT01YTm9kZT4gJm9teE5vZGUpOiBtT01YTm9kZShvbXhOb2RlKSB7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBlbXB0eUJ1ZmZlcigKLSAgICAgICAgICAgIGludDMyX3QgYnVmZmVySWQsIHVpbnQzMl90IGZsYWdzLAotICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmJ1ZmZlciwKLSAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wLCBpbnQgZmVuY2VGZCkgb3ZlcnJpZGUgewotICAgICAgICByZXR1cm4gbU9NWE5vZGUtPmVtcHR5QnVmZmVyKGJ1ZmZlcklkLCBidWZmZXIsIGZsYWdzLCB0aW1lc3RhbXAsIGZlbmNlRmQpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERhdGFTcGFjZUNoYW5nZWQoCi0gICAgICAgICAgICBpbnQzMl90IGRhdGFTcGFjZSwgaW50MzJfdCBhc3BlY3RzLCBpbnQzMl90IHBpeGVsRm9ybWF0KSBvdmVycmlkZSB7Ci0gICAgICAgIG9teF9tZXNzYWdlIG1zZzsKLSAgICAgICAgbXNnLnR5cGUgPSBvbXhfbWVzc2FnZTo6RVZFTlQ7Ci0gICAgICAgIG1zZy5mZW5jZUZkID0gLTE7Ci0gICAgICAgIG1zZy51LmV2ZW50X2RhdGEuZXZlbnQgPSBPTVhfRXZlbnREYXRhU3BhY2VDaGFuZ2VkOwotICAgICAgICBtc2cudS5ldmVudF9kYXRhLmRhdGExID0gZGF0YVNwYWNlOwotICAgICAgICBtc2cudS5ldmVudF9kYXRhLmRhdGEyID0gYXNwZWN0czsKLSAgICAgICAgbXNnLnUuZXZlbnRfZGF0YS5kYXRhMyA9IHBpeGVsRm9ybWF0OwotICAgICAgICBtT01YTm9kZS0+ZGlzcGF0Y2hNZXNzYWdlKG1zZyk7Ci0gICAgfQotfTsKLQotc3RydWN0IEJXR3JhcGhpY0J1ZmZlclNvdXJjZTo6QldPTVhCdWZmZXJTb3VyY2UgOiBwdWJsaWMgQm5PTVhCdWZmZXJTb3VyY2UgewotICAgIHNwPE9teEdyYXBoaWNCdWZmZXJTb3VyY2U+IG1Tb3VyY2U7Ci0KLSAgICBCV09NWEJ1ZmZlclNvdXJjZShjb25zdCBzcDxPbXhHcmFwaGljQnVmZmVyU291cmNlPiAmc291cmNlKTogbVNvdXJjZShzb3VyY2UpIHsKLSAgICB9Ci0KLSAgICBTdGF0dXMgb25PbXhFeGVjdXRpbmcoKSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiBtU291cmNlLT5vbk9teEV4ZWN1dGluZygpOwotICAgIH0KLQotICAgIFN0YXR1cyBvbk9teElkbGUoKSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiBtU291cmNlLT5vbk9teElkbGUoKTsKLSAgICB9Ci0KLSAgICBTdGF0dXMgb25PbXhMb2FkZWQoKSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiBtU291cmNlLT5vbk9teExvYWRlZCgpOwotICAgIH0KLQotICAgIFN0YXR1cyBvbklucHV0QnVmZmVyQWRkZWQoaW50IGJ1ZmZlcklkKSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiBtU291cmNlLT5vbklucHV0QnVmZmVyQWRkZWQoYnVmZmVySWQpOwotICAgIH0KLQotICAgIFN0YXR1cyBvbklucHV0QnVmZmVyRW1wdGllZCgKLSAgICAgICAgICAgIGludCBidWZmZXJJZCwgY29uc3QgT01YRmVuY2VQYXJjZWxhYmxlJiBmZW5jZVBhcmNlbCkgb3ZlcnJpZGUgewotICAgICAgICByZXR1cm4gbVNvdXJjZS0+b25JbnB1dEJ1ZmZlckVtcHRpZWQoYnVmZmVySWQsIGZlbmNlUGFyY2VsLmdldCgpKTsKLSAgICB9Ci19OwotCi1CV0dyYXBoaWNCdWZmZXJTb3VyY2U6OkJXR3JhcGhpY0J1ZmZlclNvdXJjZSgKLSAgICAgICAgc3A8T214R3JhcGhpY0J1ZmZlclNvdXJjZT4gY29uc3QmIGJhc2UpIDoKLSAgICBtQmFzZShiYXNlKSwKLSAgICBtT01YQnVmZmVyU291cmNlKG5ldyBCV09NWEJ1ZmZlclNvdXJjZShiYXNlKSkgewotfQotCi06OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEJXR3JhcGhpY0J1ZmZlclNvdXJjZTo6Y29uZmlndXJlKAotICAgICAgICBjb25zdCBzcDxJT01YTm9kZT4mIG9teE5vZGUsIGludDMyX3QgZGF0YVNwYWNlKSB7Ci0gICAgLy8gRG8gc2V0SW5wdXRTdXJmYWNlKCkgZmlyc3QsIHRoZSBub2RlIHdpbGwgdHJ5IHRvIGVuYWJsZSBtZXRhZGF0YQotICAgIC8vIG1vZGUgb24gaW5wdXQsIGFuZCBkb2VzIG5lY2Vzc2FyeSBlcnJvciBjaGVja2luZy4gSWYgdGhpcyBmYWlscywKLSAgICAvLyB3ZSBjYW4ndCB1c2UgdGhpcyBpbnB1dCBzdXJmYWNlIG9uIHRoZSBub2RlLgotICAgIHN0YXR1c190IGVyciA9IG9teE5vZGUtPnNldElucHV0U3VyZmFjZShtT01YQnVmZmVyU291cmNlKTsKLSAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IGlucHV0IHN1cmZhY2U6ICVkIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoZXJyKTsKLSAgICB9Ci0KLSAgICAvLyB1c2UgY29uc3VtZXIgdXNhZ2UgYml0cyBxdWVyaWVkIGZyb20gZW5jb2RlciwgYnV0IGFsd2F5cyBhZGQKLSAgICAvLyBIV19WSURFT19FTkNPREVSIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotICAgIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2U7Ci0gICAgaWYgKG9teE5vZGUtPmdldFBhcmFtZXRlcigKLSAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQ29uc3VtZXJVc2FnZUJpdHMsCi0gICAgICAgICAgICAmY29uc3VtZXJVc2FnZSwgc2l6ZW9mKGNvbnN1bWVyVXNhZ2UpKSAhPSBPSykgewotICAgICAgICBjb25zdW1lclVzYWdlID0gMDsKLSAgICB9Ci0KLSAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIGRlZjsKLSAgICBJbml0T01YUGFyYW1zKCZkZWYpOwotICAgIGRlZi5uUG9ydEluZGV4ID0ga1BvcnRJbmRleElucHV0OwotCi0gICAgZXJyID0gb214Tm9kZS0+Z2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiwgJmRlZiwgc2l6ZW9mKGRlZikpOwotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgcG9ydCBkZWZpbml0aW9uOiAlZCIsIGVycik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKFVOS05PV05fRVJST1IpOwotICAgIH0KLQotICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKG1CYXNlLT5jb25maWd1cmUoCi0gICAgICAgICAgICAgIG5ldyBCV09teE5vZGVXcmFwcGVyKG9teE5vZGUpLAotICAgICAgICAgICAgICBkYXRhU3BhY2UsCi0gICAgICAgICAgICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwsCi0gICAgICAgICAgICAgIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgsCi0gICAgICAgICAgICAgIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0LAotICAgICAgICAgICAgICBjb25zdW1lclVzYWdlKSk7Ci19Ci0KLTo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQldHcmFwaGljQnVmZmVyU291cmNlOjpzZXRTdXNwZW5kKAotICAgICAgICBib29sIHN1c3BlbmQsIGludDY0X3QgdGltZVVzKSB7Ci0gICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobUJhc2UtPnNldFN1c3BlbmQoc3VzcGVuZCwgdGltZVVzKSk7Ci19Ci0KLTo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQldHcmFwaGljQnVmZmVyU291cmNlOjpzZXRSZXBlYXRQcmV2aW91c0ZyYW1lRGVsYXlVcygKLSAgICAgICAgaW50NjRfdCByZXBlYXRBZnRlclVzKSB7Ci0gICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobUJhc2UtPnNldFJlcGVhdFByZXZpb3VzRnJhbWVEZWxheVVzKHJlcGVhdEFmdGVyVXMpKTsKLX0KLQotOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBCV0dyYXBoaWNCdWZmZXJTb3VyY2U6OnNldE1heEZwcyhmbG9hdCBtYXhGcHMpIHsKLSAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtQmFzZS0+c2V0TWF4RnBzKG1heEZwcykpOwotfQotCi06OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEJXR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0VGltZUxhcHNlQ29uZmlnKAotICAgICAgICBkb3VibGUgZnBzLCBkb3VibGUgY2FwdHVyZUZwcykgewotICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKG1CYXNlLT5zZXRUaW1lTGFwc2VDb25maWcoCi0gICAgICAgICAgICBmcHMsIGNhcHR1cmVGcHMpKTsKLX0KLQotOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBCV0dyYXBoaWNCdWZmZXJTb3VyY2U6OnNldFN0YXJ0VGltZVVzKAotICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzKSB7Ci0gICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobUJhc2UtPnNldFN0YXJ0VGltZVVzKHN0YXJ0VGltZVVzKSk7Ci19Ci0KLTo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQldHcmFwaGljQnVmZmVyU291cmNlOjpzZXRTdG9wVGltZVVzKAotICAgICAgICBpbnQ2NF90IHN0b3BUaW1lVXMpIHsKLSAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtQmFzZS0+c2V0U3RvcFRpbWVVcyhzdG9wVGltZVVzKSk7Ci19Ci0KLTo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQldHcmFwaGljQnVmZmVyU291cmNlOjpnZXRTdG9wVGltZU9mZnNldFVzKAotICAgICAgICBpbnQ2NF90ICpzdG9wVGltZU9mZnNldFVzKSB7Ci0gICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobUJhc2UtPmdldFN0b3BUaW1lT2Zmc2V0VXMoc3RvcFRpbWVPZmZzZXRVcykpOwotfQotCi06OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEJXR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0Q29sb3JBc3BlY3RzKAotICAgICAgICBpbnQzMl90IGFzcGVjdHMpIHsKLSAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtQmFzZS0+c2V0Q29sb3JBc3BlY3RzKGFzcGVjdHMpKTsKLX0KLQotOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBCV0dyYXBoaWNCdWZmZXJTb3VyY2U6OnNldFRpbWVPZmZzZXRVcygKLSAgICAgICAgaW50NjRfdCB0aW1lT2Zmc2V0c1VzKSB7Ci0gICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobUJhc2UtPnNldFRpbWVPZmZzZXRVcyh0aW1lT2Zmc2V0c1VzKSk7Ci19Ci0KLTo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQldHcmFwaGljQnVmZmVyU291cmNlOjpzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgewotICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKG1CYXNlLT5zaWduYWxFbmRPZklucHV0U3RyZWFtKCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcAppbmRleCAwOTY3YjVmLi44YzVjYTZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcApAQCAtMjksOCArMjksNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLU9NWE1hc3Rlcjo6T01YTWFzdGVyKCkKLSAgICA6IG1WZW5kb3JMaWJIYW5kbGUoTlVMTCkgeworT01YTWFzdGVyOjpPTVhNYXN0ZXIoKSB7CiAKICAgICBwaWRfdCBwaWQgPSBnZXRwaWQoKTsKICAgICBjaGFyIGZpbGVuYW1lWzIwXTsKQEAgLTUyLDQ3ICs1MSw1MiBAQAogICAgIH0KIAogICAgIGFkZFZlbmRvclBsdWdpbigpOwotICAgIGFkZFBsdWdpbihuZXcgU29mdE9NWFBsdWdpbik7CisgICAgYWRkUGxhdGZvcm1QbHVnaW4oKTsKIH0KIAogT01YTWFzdGVyOjp+T01YTWFzdGVyKCkgewogICAgIGNsZWFyUGx1Z2lucygpOwotCi0gICAgaWYgKG1WZW5kb3JMaWJIYW5kbGUgIT0gTlVMTCkgewotICAgICAgICBkbGNsb3NlKG1WZW5kb3JMaWJIYW5kbGUpOwotICAgICAgICBtVmVuZG9yTGliSGFuZGxlID0gTlVMTDsKLSAgICB9CiB9CiAKIHZvaWQgT01YTWFzdGVyOjphZGRWZW5kb3JQbHVnaW4oKSB7CiAgICAgYWRkUGx1Z2luKCJsaWJzdGFnZWZyaWdodGh3LnNvIik7CiB9CiAKLXZvaWQgT01YTWFzdGVyOjphZGRQbHVnaW4oY29uc3QgY2hhciAqbGlibmFtZSkgewotICAgIG1WZW5kb3JMaWJIYW5kbGUgPSBhbmRyb2lkX2xvYWRfc3BoYWxfbGlicmFyeShsaWJuYW1lLCBSVExEX05PVyk7Cit2b2lkIE9NWE1hc3Rlcjo6YWRkUGxhdGZvcm1QbHVnaW4oKSB7CisgICAgYWRkUGx1Z2luKCJsaWJzdGFnZWZyaWdodF9zb2Z0b214X3BsdWdpbi5zbyIpOworfQogCi0gICAgaWYgKG1WZW5kb3JMaWJIYW5kbGUgPT0gTlVMTCkgewordm9pZCBPTVhNYXN0ZXI6OmFkZFBsdWdpbihjb25zdCBjaGFyICpsaWJuYW1lKSB7CisgICAgdm9pZCAqbGliSGFuZGxlID0gYW5kcm9pZF9sb2FkX3NwaGFsX2xpYnJhcnkobGlibmFtZSwgUlRMRF9OT1cpOworCisgICAgaWYgKGxpYkhhbmRsZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICB0eXBlZGVmIE9NWFBsdWdpbkJhc2UgKigqQ3JlYXRlT01YUGx1Z2luRnVuYykoKTsKICAgICBDcmVhdGVPTVhQbHVnaW5GdW5jIGNyZWF0ZU9NWFBsdWdpbiA9CiAgICAgICAgIChDcmVhdGVPTVhQbHVnaW5GdW5jKWRsc3ltKAotICAgICAgICAgICAgICAgIG1WZW5kb3JMaWJIYW5kbGUsICJjcmVhdGVPTVhQbHVnaW4iKTsKKyAgICAgICAgICAgICAgICBsaWJIYW5kbGUsICJjcmVhdGVPTVhQbHVnaW4iKTsKICAgICBpZiAoIWNyZWF0ZU9NWFBsdWdpbikKICAgICAgICAgY3JlYXRlT01YUGx1Z2luID0gKENyZWF0ZU9NWFBsdWdpbkZ1bmMpZGxzeW0oCi0gICAgICAgICAgICAgICAgbVZlbmRvckxpYkhhbmRsZSwgIl9aTjdhbmRyb2lkMTVjcmVhdGVPTVhQbHVnaW5FdiIpOworICAgICAgICAgICAgICAgIGxpYkhhbmRsZSwgIl9aTjdhbmRyb2lkMTVjcmVhdGVPTVhQbHVnaW5FdiIpOwogCisgICAgT01YUGx1Z2luQmFzZSAqcGx1Z2luID0gbnVsbHB0cjsKICAgICBpZiAoY3JlYXRlT01YUGx1Z2luKSB7Ci0gICAgICAgIGFkZFBsdWdpbigoKmNyZWF0ZU9NWFBsdWdpbikoKSk7CisgICAgICAgIHBsdWdpbiA9ICgqY3JlYXRlT01YUGx1Z2luKSgpOworICAgIH0KKworICAgIGlmIChwbHVnaW4pIHsKKyAgICAgICAgbVBsdWdpbnMucHVzaF9iYWNrKHsgcGx1Z2luLCBsaWJIYW5kbGUgfSk7CisgICAgICAgIGFkZFBsdWdpbihwbHVnaW4pOworICAgIH0gZWxzZSB7CisgICAgICAgIGFuZHJvaWRfdW5sb2FkX3NwaGFsX2xpYnJhcnkobGliSGFuZGxlKTsKICAgICB9CiB9CiAKIHZvaWQgT01YTWFzdGVyOjphZGRQbHVnaW4oT01YUGx1Z2luQmFzZSAqcGx1Z2luKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIG1QbHVnaW5zLnB1c2hfYmFjayhwbHVnaW4pOwotCiAgICAgT01YX1UzMiBpbmRleCA9IDA7CiAKICAgICBjaGFyIG5hbWVbMTI4XTsKQEAgLTEyMCwyMCArMTI0LDIwIEBACiB2b2lkIE9NWE1hc3Rlcjo6Y2xlYXJQbHVnaW5zKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKLSAgICB0eXBlZGVmIHZvaWQgKCpEZXN0cm95T01YUGx1Z2luRnVuYykoT01YUGx1Z2luQmFzZSopOwotICAgIERlc3Ryb3lPTVhQbHVnaW5GdW5jIGRlc3Ryb3lPTVhQbHVnaW4gPQotICAgICAgICAoRGVzdHJveU9NWFBsdWdpbkZ1bmMpZGxzeW0oCi0gICAgICAgICAgICAgICAgbVZlbmRvckxpYkhhbmRsZSwgImRlc3Ryb3lPTVhQbHVnaW4iKTsKLQogICAgIG1QbHVnaW5CeUNvbXBvbmVudE5hbWUuY2xlYXIoKTsKKyAgICBtUGx1Z2luQnlJbnN0YW5jZS5jbGVhcigpOwogCi0gICAgZm9yIChMaXN0PE9NWFBsdWdpbkJhc2UgKj46Oml0ZXJhdG9yIGl0ID0gbVBsdWdpbnMuYmVnaW4oKTsKLSAgICAgICAgICAgIGl0ICE9IG1QbHVnaW5zLmVuZCgpOyArK2l0KSB7CisgICAgdHlwZWRlZiB2b2lkICgqRGVzdHJveU9NWFBsdWdpbkZ1bmMpKE9NWFBsdWdpbkJhc2UqKTsKKyAgICBmb3IgKGNvbnN0IFBsdWdpbiAmcGx1Z2luIDogbVBsdWdpbnMpIHsKKyAgICAgICAgRGVzdHJveU9NWFBsdWdpbkZ1bmMgZGVzdHJveU9NWFBsdWdpbiA9CisgICAgICAgICAgICAoRGVzdHJveU9NWFBsdWdpbkZ1bmMpZGxzeW0oCisgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5tTGliSGFuZGxlLCAiZGVzdHJveU9NWFBsdWdpbiIpOwogICAgICAgICBpZiAoZGVzdHJveU9NWFBsdWdpbikKLSAgICAgICAgICAgIGRlc3Ryb3lPTVhQbHVnaW4oKml0KTsKKyAgICAgICAgICAgIGRlc3Ryb3lPTVhQbHVnaW4ocGx1Z2luLm1PbXgpOwogICAgICAgICBlbHNlCi0gICAgICAgICAgICBkZWxldGUgKml0OwotICAgICAgICAqaXQgPSBOVUxMOworICAgICAgICAgICAgZGVsZXRlIHBsdWdpbi5tT214OworCisgICAgICAgIGFuZHJvaWRfdW5sb2FkX3NwaGFsX2xpYnJhcnkocGx1Z2luLm1MaWJIYW5kbGUpOwogICAgIH0KIAogICAgIG1QbHVnaW5zLmNsZWFyKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCmluZGV4IDMyMTEzYzIuLmRkYjRiYTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCkBAIC0xNiw2ICsxNiw3IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiT01YTm9kZUluc3RhbmNlIgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CkBAIC0zMiwxMiArMzMsMTMgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDxndWkvQnVmZmVyUXVldWUuaD4KICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+CisjaW5jbHVkZSA8dWkvRmVuY2UuaD4KICNpbmNsdWRlIDx1dGlscy9taXNjLmg+CiAjaW5jbHVkZSA8dXRpbHMvTmF0aXZlSGFuZGxlLmg+CiAjaW5jbHVkZSA8bWVkaWEvT01YQnVmZmVyLmg+CkBAIC0zNTQsOSArMzU2LDkgQEAKICAgICAgIG1RdWlya3MoMCksCiAgICAgICBtQnVmZmVySURDb3VudCgwKSwKICAgICAgIG1SZXN0b3JlUHRzRmFpbGVkKGZhbHNlKSwKLSAgICAgIG1NYXhUaW1lc3RhbXBHYXBVcygwbGwpLAotICAgICAgbVByZXZPcmlnaW5hbFRpbWVVcygtMWxsKSwKLSAgICAgIG1QcmV2TW9kaWZpZWRUaW1lVXMoLTFsbCkKKyAgICAgIG1NYXhUaW1lc3RhbXBHYXBVcygwTEwpLAorICAgICAgbVByZXZPcmlnaW5hbFRpbWVVcygtMUxMKSwKKyAgICAgIG1QcmV2TW9kaWZpZWRUaW1lVXMoLTFMTCkKIHsKICAgICBtTmFtZSA9IEFEZWJ1Zzo6R2V0RGVidWdOYW1lKG5hbWUpOwogICAgIERFQlVHID0gQURlYnVnOjpHZXREZWJ1Z0xldmVsRnJvbVByb3BlcnR5KG5hbWUsICJkZWJ1Zy5zdGFnZWZyaWdodC5vbXgtZGVidWciKTsKQEAgLTQ1OSw3ICs0NjEsNyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBPTVhfU3RhdGVJZGxlOgpAQCAtNDg2LDcgKzQ4OCw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBDSEVDS19FUShlcnIsIE9NWF9FcnJvck5vbmUpOwogCi0gICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBPTVhfU3RhdGVMb2FkZWQ6CkBAIC01MzUsNiArNTM3LDkgQEAKICAgICB9CiAKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGlmIChtSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KIAogICAgIGlmIChjbWQgPT0gT01YX0NvbW1hbmRTdGF0ZVNldCkgewogICAgICAgICAvLyBUaGVyZSBhcmUgbm8gY29uZmlndXJhdGlvbnMgcGFzdCBmaXJzdCBTdGF0ZVNldCBjb21tYW5kLgpAQCAtNTk5LDYgKzYwNCw5IEBACiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OmdldFBhcmFtZXRlcigKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgdm9pZCAqcGFyYW1zLCBzaXplX3QgLyogc2l6ZSAqLykgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKG1IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQogCiAgICAgaWYgKGlzUHJvaGliaXRlZEluZGV4X2woaW5kZXgpKSB7CiAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjk0MjIwMjAiKTsKQEAgLTYxNyw2ICs2MjUsMTAgQEAKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6c2V0UGFyYW1ldGVyKAogICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCB2b2lkICpwYXJhbXMsIHNpemVfdCBzaXplKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAobUhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKICAgICBPTVhfSU5ERVhFWFRUWVBFIGV4dEluZGV4ID0gKE9NWF9JTkRFWEVYVFRZUEUpaW5kZXg7CiAgICAgQ0xPR19DT05GSUcoc2V0UGFyYW1ldGVyLCAiJXMoJSN4KSwgJXp1QCVwKSIsIGFzU3RyaW5nKGV4dEluZGV4KSwgaW5kZXgsIHNpemUsIHBhcmFtcyk7CiAKQEAgLTYzOCw2ICs2NTAsOSBAQAogc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjpnZXRDb25maWcoCiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIHZvaWQgKnBhcmFtcywgc2l6ZV90IC8qIHNpemUgKi8pIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGlmIChtSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KIAogICAgIGlmIChpc1Byb2hpYml0ZWRJbmRleF9sKGluZGV4KSkgewogICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI5NDIyMDIwIik7CkBAIC02NTYsNiArNjcxLDEwIEBACiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OnNldENvbmZpZygKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3Qgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKG1IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCiAgICAgT01YX0lOREVYRVhUVFlQRSBleHRJbmRleCA9IChPTVhfSU5ERVhFWFRUWVBFKWluZGV4OwogICAgIENMT0dfQ09ORklHKHNldENvbmZpZywgIiVzKCUjeCksICV6dUAlcCkiLCBhc1N0cmluZyhleHRJbmRleCksIGluZGV4LCBzaXplLCBwYXJhbXMpOwogCkBAIC02NzIsNiArNjkxLDkgQEAKIAogc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjpzZXRQb3J0TW9kZShPTVhfVTMyIHBvcnRJbmRleCwgSU9NWDo6UG9ydE1vZGUgbW9kZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKG1IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQogCiAgICAgaWYgKHBvcnRJbmRleCA+PSBORUxFTShtUG9ydE1vZGUpKSB7CiAgICAgICAgIEFMT0dFKCJiLzMxMzg1NzEzLCBwb3J0SW5kZXgoJXUpIiwgcG9ydEluZGV4KTsKQEAgLTg1NCw2ICs4NzYsOSBAQAogc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjpnZXRHcmFwaGljQnVmZmVyVXNhZ2UoCiAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfVTMyKiB1c2FnZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKG1IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQogCiAgICAgT01YX0lOREVYVFlQRSBpbmRleDsKICAgICBPTVhfU1RSSU5HIG5hbWUgPSBjb25zdF9jYXN0PE9NWF9TVFJJTkc+KApAQCAtOTY3LDYgKzk5MiwxMCBAQAogICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLCBPTVhfVTMyIG1heEZyYW1lV2lkdGgsCiAgICAgICAgIE9NWF9VMzIgbWF4RnJhbWVIZWlnaHQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOworICAgIGlmIChtSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKwogICAgIGlmIChtU2FpbGVkKSB7CiAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjk0MjIwMjAiKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMTAwNyw2ICsxMDM2LDEwIEBACiAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCB0dW5uZWxlZCwgT01YX1UzMiBhdWRpb0h3U3luYywKICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqc2lkZWJhbmRIYW5kbGUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b2xvY2sobUxvY2spOworICAgIGlmIChtSGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKwogICAgIGlmIChtU2FpbGVkKSB7CiAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjk0MjIwMjAiKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMTA2MSw2ICsxMDk0LDEwIEBACiAgICAgfQogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAobUhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKICAgICBpZiAoIW1TYWlsZWQpIHsKICAgICAgICAgQUxPR0UoImIvMzU0Njc0NTgiKTsKICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzNTQ2NzQ1OCIpOwpAQCAtMTQ3Nyw2ICsxNTE0LDkgQEAKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6c2V0SW5wdXRTdXJmYWNlKAogICAgICAgICBjb25zdCBzcDxJT01YQnVmZmVyU291cmNlPiAmYnVmZmVyU291cmNlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9sb2NrKG1Mb2NrKTsKKyAgICBpZiAobUhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CiAKICAgICBzdGF0dXNfdCBlcnI7CiAKQEAgLTE1NDMsNiArMTU4Myw5IEBACiAgICAgfQogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAobUhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CiAKICAgICBpZiAoIW1TYWlsZWQpIHsKICAgICAgICAgQUxPR0UoImIvMzU0Njc0NTgiKTsKQEAgLTE1OTksNiArMTY0MiwxMCBAQAogc3RhdHVzX3QgT01YTm9kZUluc3RhbmNlOjpmcmVlQnVmZmVyKAogICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgSU9NWDo6YnVmZmVyX2lkIGJ1ZmZlcikgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKG1IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCiAgICAgQ0xPR19CVUZGRVIoZnJlZUJ1ZmZlciwgIiVzOiV1ICUjeCIsIHBvcnRTdHJpbmcocG9ydEluZGV4KSwgcG9ydEluZGV4LCBidWZmZXIpOwogCiAgICAgcmVtb3ZlQWN0aXZlQnVmZmVyKHBvcnRJbmRleCwgYnVmZmVyKTsKQEAgLTE2MjYsNiArMTY3Myw5IEBACiBzdGF0dXNfdCBPTVhOb2RlSW5zdGFuY2U6OmZpbGxCdWZmZXIoCiAgICAgICAgIElPTVg6OmJ1ZmZlcl9pZCBidWZmZXIsIGNvbnN0IE9NWEJ1ZmZlciAmb214QnVmZmVyLCBpbnQgZmVuY2VGZCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKG1IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQogCiAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlciA9IGZpbmRCdWZmZXJIZWFkZXIoYnVmZmVyLCBrUG9ydEluZGV4T3V0cHV0KTsKICAgICBpZiAoaGVhZGVyID09IE5VTEwpIHsKQEAgLTE2NzYsNiArMTcyNiw5IEBACiAgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXIsIGNvbnN0IE9NWEJ1ZmZlciAmb214QnVmZmVyLAogICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wLCBpbnQgZmVuY2VGZCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKG1IYW5kbGUgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQogCiAgICAgc3dpdGNoIChvbXhCdWZmZXIubUJ1ZmZlclR5cGUpIHsKICAgICBjYXNlIE9NWEJ1ZmZlcjo6a0J1ZmZlclR5cGVQcmVzZXQ6CkBAIC0xODk2LDcgKzE5NDksNyBAQAogaW50NjRfdCBPTVhOb2RlSW5zdGFuY2U6OmdldENvZGVjVGltZXN0YW1wKE9NWF9USUNLUyB0aW1lc3RhbXApIHsKICAgICBpbnQ2NF90IG9yaWdpbmFsVGltZVVzID0gdGltZXN0YW1wOwogCi0gICAgaWYgKG1NYXhUaW1lc3RhbXBHYXBVcyA+IDBsbCkgeworICAgIGlmIChtTWF4VGltZXN0YW1wR2FwVXMgPiAwTEwpIHsKICAgICAgICAgLyogQ2FwIHRpbWVzdGFtcCBnYXAgYmV0d2VlbiBhZGphY2VudCBmcmFtZXMgdG8gc3BlY2lmaWVkIG1heAogICAgICAgICAgKgogICAgICAgICAgKiBJbiB0aGUgc2NlbmFyaW8gb2YgY2FzdCBtaXJyb3JpbmcsIGVuY29kaW5nIGNvdWxkIGJlIHN1c3BlbmRlZCBmb3IKQEAgLTE5MDQsNyArMTk1Nyw3IEBACiAgICAgICAgICAqIHdoZXJlIGVuY29kZXIncyByYXRlIGNvbnRyb2wgbG9naWMgcHJvZHVjZXMgaHVnZSBmcmFtZXMgYWZ0ZXIgYQogICAgICAgICAgKiBsb25nIHBlcmlvZCBvZiBzdXNwZW5zaW9uLgogICAgICAgICAgKi8KLSAgICAgICAgaWYgKG1QcmV2T3JpZ2luYWxUaW1lVXMgPj0gMGxsKSB7CisgICAgICAgIGlmIChtUHJldk9yaWdpbmFsVGltZVVzID49IDBMTCkgewogICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBHYXBVcyA9IG9yaWdpbmFsVGltZVVzIC0gbVByZXZPcmlnaW5hbFRpbWVVczsKICAgICAgICAgICAgIHRpbWVzdGFtcCA9ICh0aW1lc3RhbXBHYXBVcyA8IG1NYXhUaW1lc3RhbXBHYXBVcyA/CiAgICAgICAgICAgICAgICAgdGltZXN0YW1wR2FwVXMgOiBtTWF4VGltZXN0YW1wR2FwVXMpICsgbVByZXZNb2RpZmllZFRpbWVVczsKQEAgLTE5MTIsNyArMTk2NSw3IEBACiAgICAgICAgIEFMT0dWKCJJTiAgdGltZXN0YW1wOiAlbGxkIC0+ICVsbGQiLAogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihvcmlnaW5hbFRpbWVVcyksCiAgICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmc+KHRpbWVzdGFtcCkpOwotICAgIH0gZWxzZSBpZiAobU1heFRpbWVzdGFtcEdhcFVzIDwgMGxsKSB7CisgICAgfSBlbHNlIGlmIChtTWF4VGltZXN0YW1wR2FwVXMgPCAwTEwpIHsKICAgICAgICAgLyoKICAgICAgICAgICogQXBwbHkgYSBmaXhlZCB0aW1lc3RhbXAgZ2FwIGJldHdlZW4gYWRqYWNlbnQgZnJhbWVzLgogICAgICAgICAgKgpAQCAtMTkyMCw3ICsxOTczLDcgQEAKICAgICAgICAgICogb24gZnJhbWVzIGNvdWxkIGdvIGZvcndhcmQgb3IgYmFja3dhcmQuIFNvbWUgZW5jb2RlcnMgbWF5IHNpbGVudGx5CiAgICAgICAgICAqIGRyb3AgZnJhbWVzIHdoZW4gaXQgZ29lcyBiYWNrd2FyZCAob3IgZXZlbiBzdGF5IHVuY2hhbmdlZCkuCiAgICAgICAgICAqLwotICAgICAgICBpZiAobVByZXZPcmlnaW5hbFRpbWVVcyA+PSAwbGwpIHsKKyAgICAgICAgaWYgKG1QcmV2T3JpZ2luYWxUaW1lVXMgPj0gMExMKSB7CiAgICAgICAgICAgICB0aW1lc3RhbXAgPSBtUHJldk1vZGlmaWVkVGltZVVzIC0gbU1heFRpbWVzdGFtcEdhcFVzOwogICAgICAgICB9CiAgICAgICAgIEFMT0dWKCJJTiAgdGltZXN0YW1wOiAlbGxkIC0+ICVsbGQiLApAQCAtMTkzMSw3ICsxOTg0LDcgQEAKICAgICBtUHJldk9yaWdpbmFsVGltZVVzID0gb3JpZ2luYWxUaW1lVXM7CiAgICAgbVByZXZNb2RpZmllZFRpbWVVcyA9IHRpbWVzdGFtcDsKIAotICAgIGlmIChtTWF4VGltZXN0YW1wR2FwVXMgIT0gMGxsICYmICFtUmVzdG9yZVB0c0ZhaWxlZCkgeworICAgIGlmIChtTWF4VGltZXN0YW1wR2FwVXMgIT0gMExMICYmICFtUmVzdG9yZVB0c0ZhaWxlZCkgewogICAgICAgICBtT3JpZ2luYWxUaW1lVXMuYWRkKHRpbWVzdGFtcCwgb3JpZ2luYWxUaW1lVXMpOwogICAgIH0KIApAQCAtMTk2NCw3ICsyMDE3LDcgQEAKIHZvaWQgT01YTm9kZUluc3RhbmNlOjpjb2RlY0J1ZmZlckZpbGxlZChvbXhfbWVzc2FnZSAmbXNnKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIGlmIChtTWF4VGltZXN0YW1wR2FwVXMgPT0gMGxsIHx8IG1SZXN0b3JlUHRzRmFpbGVkKSB7CisgICAgaWYgKG1NYXhUaW1lc3RhbXBHYXBVcyA9PSAwTEwgfHwgbVJlc3RvcmVQdHNGYWlsZWQpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtMTk5MCw2ICsyMDQzLDkgQEAKIHN0YXR1c190IE9NWE5vZGVJbnN0YW5jZTo6Z2V0RXh0ZW5zaW9uSW5kZXgoCiAgICAgICAgIGNvbnN0IGNoYXIgKnBhcmFtZXRlck5hbWUsIE9NWF9JTkRFWFRZUEUgKmluZGV4KSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBpZiAobUhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CiAKICAgICBPTVhfRVJST1JUWVBFIGVyciA9IE9NWF9HZXRFeHRlbnNpb25JbmRleCgKICAgICAgICAgICAgIG1IYW5kbGUsIGNvbnN0X2Nhc3Q8Y2hhciAqPihwYXJhbWV0ZXJOYW1lKSwgaW5kZXgpOwpAQCAtMjE5Niw4ICsyMjUyLDggQEAKICAgICAgICAgICAgICAgICAgICAgLy8gYnVtcCBpbnRlcm5hbC1zdGF0ZSBkZWJ1ZyBsZXZlbCBmb3IgMiBpbnB1dCBhbmQgb3V0cHV0IGZyYW1lcwogICAgICAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlYnVnTG9jayk7CiAgICAgICAgICAgICAgICAgICAgIGJ1bXBEZWJ1Z0xldmVsX2woMiAvKiBudW1JbnB1dEJ1ZmZlcnMgKi8sIDIgLyogbnVtT3V0cHV0QnVmZmVycyAqLyk7CisgICAgICAgICAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICBhcmcyU3RyaW5nID0gcG9ydFN0cmluZyhhcmcyKTsKICAgICAgICAgICAgIH0KQEAgLTIyMDgsNyArMjI2NCw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBPTVhfRXZlbnRQb3J0U2V0dGluZ3NDaGFuZ2VkOgogICAgICAgICAgICAgYXJnMlN0cmluZyA9IGFzU3RyaW5nKChPTVhfSU5ERVhFWFRUWVBFKWFyZzIpOwotICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGFyZzFTdHJpbmcgPSBwb3J0U3RyaW5nKGFyZzEpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuY3BwCmluZGV4IGY3YjU2OWQuLjFiODQ5M2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmNwcApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgpAQCAtMTQ5LDYgKzE1MCw4IEBACiAgICAgICAgICAgICAidmlkZW9fZGVjb2Rlci52cDgiLCAidmlkZW9fZW5jb2Rlci52cDgiIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fVlA5LAogICAgICAgICAgICAgInZpZGVvX2RlY29kZXIudnA5IiwgInZpZGVvX2VuY29kZXIudnA5IiB9LAorICAgICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSwKKyAgICAgICAgICAgICJ2aWRlb19kZWNvZGVyLmF2MSIsICJ2aWRlb19lbmNvZGVyLmF2MSIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcsCiAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5yYXciLCAiYXVkaW9fZW5jb2Rlci5yYXciIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OLApAQCAtMTYzLDYgKzE2NiwxMCBAQAogICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIuYWMzIiwgImF1ZGlvX2VuY29kZXIuYWMzIiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0VBQzMsCiAgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5lYWMzIiwgImF1ZGlvX2VuY29kZXIuZWFjMyIgfSwKKyAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzX0pPQywKKyAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLmVhYzNfam9jIiwgImF1ZGlvX2VuY29kZXIuZWFjM19qb2MiIH0sCisgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0LAorICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIuYWM0IiwgImF1ZGlvX2VuY29kZXIuYWM0IiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQywKICAgICAgICAgICAgICJpbWFnZV9kZWNvZGVyLmhlaWMiLCAiaW1hZ2VfZW5jb2Rlci5oZWljIiB9LAogICAgIH07CkBAIC0yNzMsNiArMjgwLDcgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoIGFzIFlWMTIgaXMgdXNlZCBmb3IgWVVWNDIwUGxhbmFyIGJ5IHNvbWUgY29kZWNzCisgICAgICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuY3BwCmluZGV4IDU1YWZlMDQuLmRkYjQ1OWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAKQEAgLTM0LDcgKzM0LDggQEAKICAgICAgIG1Mb29wZXIobmV3IEFMb29wZXIpLAogICAgICAgbUhhbmRsZXIobmV3IEFIYW5kbGVyUmVmbGVjdG9yPFNpbXBsZVNvZnRPTVhDb21wb25lbnQ+KHRoaXMpKSwKICAgICAgIG1TdGF0ZShPTVhfU3RhdGVMb2FkZWQpLAotICAgICAgbVRhcmdldFN0YXRlKE9NWF9TdGF0ZUxvYWRlZCkgeworICAgICAgbVRhcmdldFN0YXRlKE9NWF9TdGF0ZUxvYWRlZCksCisgICAgICBtRnJhbWVDb25maWcoZmFsc2UpIHsKICAgICBtTG9vcGVyLT5zZXROYW1lKG5hbWUpOwogICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlcik7CiAKQEAgLTIwNCw2ICsyMDUsMjEgQEAKICAgICB9CiB9CiAKK09NWF9FUlJPUlRZUEUgU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRDb25maWcoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zLCBib29sICpmcmFtZUNvbmZpZykgeworICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU2ltcGxlU29mdE9NWENvbXBvbmVudDo6c2V0Q29uZmlnKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgeworICAgIGJvb2wgZnJhbWVDb25maWcgPSBtRnJhbWVDb25maWc7CisgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBpbnRlcm5hbFNldENvbmZpZyhpbmRleCwgcGFyYW1zLCAmZnJhbWVDb25maWcpOworICAgIGlmIChlcnIgPT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBtRnJhbWVDb25maWcgPSBmcmFtZUNvbmZpZzsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKwogT01YX0VSUk9SVFlQRSBTaW1wbGVTb2Z0T01YQ29tcG9uZW50Ojp1c2VCdWZmZXIoCiAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqaGVhZGVyLAogICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwKQEAgLTMzNiw2ICszNTIsMTAgQEAKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcikgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRFbXB0eVRoaXNCdWZmZXIsIG1IYW5kbGVyKTsKICAgICBtc2ctPnNldFBvaW50ZXIoImhlYWRlciIsIGJ1ZmZlcik7CisgICAgaWYgKG1GcmFtZUNvbmZpZykgeworICAgICAgICBtc2ctPnNldEludDMyKCJmcmFtZS1jb25maWciLCBtRnJhbWVDb25maWcpOworICAgICAgICBtRnJhbWVDb25maWcgPSBmYWxzZTsKKyAgICB9CiAgICAgbXNnLT5wb3N0KCk7CiAKICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKQEAgLTM3OCw2ICszOTgsMTAgQEAKICAgICAgICAgewogICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlcjsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoImhlYWRlciIsICh2b2lkICoqKSZoZWFkZXIpKTsKKyAgICAgICAgICAgIGludDMyX3QgZnJhbWVDb25maWc7CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJmcmFtZS1jb25maWciLCAmZnJhbWVDb25maWcpKSB7CisgICAgICAgICAgICAgICAgZnJhbWVDb25maWcgPSAwOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBDSEVDSyhtU3RhdGUgPT0gT01YX1N0YXRlRXhlY3V0aW5nICYmIG1UYXJnZXRTdGF0ZSA9PSBtU3RhdGUpOwogCkBAIC0zOTMsNiArNDE3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soIWJ1ZmZlci0+bU93bmVkQnlVcyk7CiAKICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tT3duZWRCeVVzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tRnJhbWVDb25maWcgPSAoYm9vbClmcmFtZUNvbmZpZzsKIAogICAgICAgICAgICAgICAgICAgICBDSEVDSygobXNnVHlwZSA9PSBrV2hhdEVtcHR5VGhpc0J1ZmZlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHBvcnQtPm1EZWYuZURpciA9PSBPTVhfRGlySW5wdXQpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5jcHAKaW5kZXggMWYzZThjMS4uYTcyMGJjOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmNwcApAQCAtNzEsNiArNzEsMTYgQEAKIHN0YXRpYyBjb25zdCBzaXplX3Qga051bUNvbXBvbmVudHMgPQogICAgIHNpemVvZihrQ29tcG9uZW50cykgLyBzaXplb2Yoa0NvbXBvbmVudHNbMF0pOwogCitleHRlcm4gIkMiIE9NWFBsdWdpbkJhc2UqIGNyZWF0ZU9NWFBsdWdpbigpIHsKKyAgICBBTE9HSSgiY3JlYXRlT01YUGx1Z2luIik7CisgICAgcmV0dXJuIG5ldyBTb2Z0T01YUGx1Z2luKCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBkZXN0cm95T01YUGx1Z2luKE9NWFBsdWdpbkJhc2UqIHBsdWdpbikgeworICAgIEFMT0dJKCJkZXN0cm95T01YUGx1Z2luIik7CisgICAgZGVsZXRlIHBsdWdpbjsKK30KKwogU29mdE9NWFBsdWdpbjo6U29mdE9NWFBsdWdpbigpIHsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwCmluZGV4IDkzNWRjMzQuLmU4NTNkYTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAKQEAgLTE1NCwxMiArMTU0LDEyIEBACiAgICAgb3V0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBvdXRwdXRCdWZmZXJXaWR0aCgpOwogICAgIG91dERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG91dHB1dEJ1ZmZlckhlaWdodCgpOwogICAgIG91dERlZi0+Zm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IG1PdXRwdXRGb3JtYXQ7Ci0gICAgb3V0RGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSA9IG91dERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOwogICAgIG91dERlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IG91dERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKIAogICAgIGludDMyX3QgYnBwID0gKG1PdXRwdXRGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjE2KSA/IDIgOiAxOworICAgIG91dERlZi0+Zm9ybWF0LnZpZGVvLm5TdHJpZGUgPSBvdXREZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCAqIGJwcDsKICAgICBvdXREZWYtPm5CdWZmZXJTaXplID0KLSAgICAgICAgKG91dERlZi0+Zm9ybWF0LnZpZGVvLm5TdHJpZGUgKiBvdXREZWYtPmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgKiBicHAgKiAzKSAvIDI7CisgICAgICAgICAgICAob3V0RGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSAqIG91dERlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCAqIDMpIC8gMjsKIAogICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKmluRGVmID0gJmVkaXRQb3J0SW5mbyhrSW5wdXRQb3J0SW5kZXgpLT5tRGVmOwogICAgIGluRGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CkBAIC01MDIsNyArNTAyLDggQEAKICAgICAgICAgICAgIC8vIFRoZXNlIHZhbHVlcyB3ZXJlIGNob3NlbiB0byBwcmV2ZW50IGludGVnZXIgb3ZlcmZsb3dzIGZ1cnRoZXIgZG93biB0aGUgbGluZSwgYW5kIGRvCiAgICAgICAgICAgICAvLyBub3QgaW5kaWNhdGUgc3VwcG9ydCBmb3IgMzJreDMyayB2aWRlby4KICAgICAgICAgICAgIGlmIChuZXdXaWR0aCA+IDMyNzY4IHx8IG5ld0hlaWdodCA+IDMyNzY4Ci0gICAgICAgICAgICAgICAgICAgIHx8IHZpZGVvX2RlZi0+blN0cmlkZSA+IDMyNzY4IHx8IHZpZGVvX2RlZi0+blNsaWNlSGVpZ2h0ID4gMzI3NjgpIHsKKyAgICAgICAgICAgICAgICAgICAgfHwgdmlkZW9fZGVmLT5uU3RyaWRlID4gMzI3NjggfHwgdmlkZW9fZGVmLT5uU3RyaWRlIDwgLTMyNzY4CisgICAgICAgICAgICAgICAgICAgIHx8IHZpZGVvX2RlZi0+blNsaWNlSGVpZ2h0ID4gMzI3NjgpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiYi8yMjg4NTQyMSIpOwogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CiAgICAgICAgICAgICB9CkBAIC02MDEsMTMgKzYwMiw0MCBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtEZXNjcmliZUhkcjEwUGx1c0luZm9JbmRleDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFzdXBwb3J0RGVzY3JpYmVIZHIxMFBsdXNJbmZvKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1IZHIxMFBsdXNPdXRwdXRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBhdXRvIGl0ID0gbUhkcjEwUGx1c091dHB1dHMuYmVnaW4oKTsKKworICAgICAgICAgICAgICAgIGF1dG8gaW5mbyA9ICgqaXQpLmdldCgpOworCisgICAgICAgICAgICAgICAgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zKiBvdXRQYXJhbXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgKERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyAqKXBhcmFtczsKKworICAgICAgICAgICAgICAgIG91dFBhcmFtcy0+blBhcmFtU2l6ZVVzZWQgPSBpbmZvLT5zaXplKCk7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgYnVmZmVyIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgZG9lcyBub3QgaGF2ZSBlbm91Z2gKKyAgICAgICAgICAgICAgICAvLyBzdG9yYWdlLCByZXR1cm4gdGhlIHNpemUgb25seSBhbmQgZG8gbm90IHJlbW92ZSB0aGUgcGFyYW0geWV0LgorICAgICAgICAgICAgICAgIGlmIChvdXRQYXJhbXMtPm5QYXJhbVNpemUgPj0gaW5mby0+c2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShvdXRQYXJhbXMtPm5WYWx1ZSwgaW5mby0+ZGF0YSgpLCBpbmZvLT5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICBtSGRyMTBQbHVzT3V0cHV0cy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVyZmxvdzsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKICAgICB9CiB9CiAKLU9NWF9FUlJPUlRZUEUgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6c2V0Q29uZmlnKAotICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyl7CitPTVhfRVJST1JUWVBFIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OmludGVybmFsU2V0Q29uZmlnKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcywgYm9vbCAqZnJhbWVDb25maWcpewogICAgIHN3aXRjaCAoKGludClpbmRleCkgewogICAgICAgICBjYXNlIGtEZXNjcmliZUNvbG9yQXNwZWN0c0luZGV4OgogICAgICAgICB7CkBAIC02NTcsMTEgKzY4NSw1NSBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtEZXNjcmliZUhkcjEwUGx1c0luZm9JbmRleDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFzdXBwb3J0RGVzY3JpYmVIZHIxMFBsdXNJbmZvKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3QgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zKiBpblBhcmFtcyA9CisgICAgICAgICAgICAgICAgICAgIChEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICgqZnJhbWVDb25maWcpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgcmVxdWVzdCB0byBhcHBlbmQgdG8gdGhlIGN1cnJlbnQgZnJhbWUgY29uZmlnIHNldC4KKyAgICAgICAgICAgICAgICAvLyBGb3Igbm93LCB3ZSBvbmx5IHN1cHBvcnQga0Rlc2NyaWJlSGRyMTBQbHVzSW5mb0luZGV4LCB3aGljaAorICAgICAgICAgICAgICAgIC8vIHdlIHNpbXBseSByZXBsYWNlIHdpdGggdGhlIGxhc3Qgc2V0IHZhbHVlLgorICAgICAgICAgICAgICAgIGlmIChtSGRyMTBQbHVzSW5wdXRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgKigtLW1IZHIxMFBsdXNJbnB1dHMuZW5kKCkpID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGFyYW1zLT5uVmFsdWUsIGluUGFyYW1zLT5uUGFyYW1TaXplVXNlZCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIklnbm9yaW5nIGtEZXNjcmliZUhkcjEwUGx1c0luZm9JbmRleDogYXBwZW5kIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJhbWUgY29uZmlnIHdoaWxlIG5vIGZyYW1lIGNvbmZpZyBpcyBwcmVzZW50Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgZnJhbWUgY29uZmlnLCBzZXR0aW5nICpmcmFtZUNvbmZpZyB0byB0cnVlIHNvIHRoYXQKKyAgICAgICAgICAgICAgICAvLyB0aGUgY2xpZW50IG1hcmtzIHRoZSBuZXh0IHF1ZXVlZCBpbnB1dCBmcmFtZSB0byBhcHBseSBpdC4KKyAgICAgICAgICAgICAgICAqZnJhbWVDb25maWcgPSB0cnVlOworICAgICAgICAgICAgICAgIG1IZHIxMFBsdXNJbnB1dHMucHVzaF9iYWNrKEFCdWZmZXI6OkNyZWF0ZUFzQ29weSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGluUGFyYW1zLT5uVmFsdWUsIGluUGFyYW1zLT5uUGFyYW1TaXplVXNlZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CiAgICAgfQogfQogCitzcDxBQnVmZmVyPiBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpkZXF1ZXVlSW5wdXRGcmFtZUNvbmZpZygpIHsKKyAgICBhdXRvIGl0ID0gbUhkcjEwUGx1c0lucHV0cy5iZWdpbigpOworICAgIHNwPEFCdWZmZXI+IGluZm8gPSAqaXQ7CisgICAgbUhkcjEwUGx1c0lucHV0cy5lcmFzZShpdCk7CisgICAgcmV0dXJuIGluZm87Cit9CisKK3ZvaWQgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6cXVldWVPdXRwdXRGcmFtZUNvbmZpZyhjb25zdCBzcDxBQnVmZmVyPiAmaW5mbykgeworICAgIG1IZHIxMFBsdXNPdXRwdXRzLnB1c2hfYmFjayhpbmZvKTsKKyAgICBub3RpZnkoT01YX0V2ZW50Q29uZmlnVXBkYXRlLAorICAgICAgICAgICBrT3V0cHV0UG9ydEluZGV4LAorICAgICAgICAgICBrRGVzY3JpYmVIZHIxMFBsdXNJbmZvSW5kZXgsCisgICAgICAgICAgIE5VTEwpOworfQogCiBPTVhfRVJST1JUWVBFIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OmdldEV4dGVuc2lvbkluZGV4KAogICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCkgewpAQCAtNjc2LDYgKzc0OCwxMCBAQAogICAgICAgICAgICAgJiYgc3VwcG9ydERlc2NyaWJlSGRyU3RhdGljSW5mbygpKSB7CiAgICAgICAgICooaW50MzJfdCopaW5kZXggPSBrRGVzY3JpYmVIZHJTdGF0aWNJbmZvSW5kZXg7CiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LmRlc2NyaWJlSERSMTBQbHVzSW5mbyIpCisgICAgICAgICAgICAmJiBzdXBwb3J0RGVzY3JpYmVIZHIxMFBsdXNJbmZvKCkpIHsKKyAgICAgICAgKihpbnQzMl90KilpbmRleCA9IGtEZXNjcmliZUhkcjEwUGx1c0luZm9JbmRleDsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgfQogCiAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmdldEV4dGVuc2lvbkluZGV4KG5hbWUsIGluZGV4KTsKQEAgLTY5Myw2ICs3NjksMTAgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK2Jvb2wgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6c3VwcG9ydERlc2NyaWJlSGRyMTBQbHVzSW5mbygpIHsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIHZvaWQgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6b25SZXNldCgpIHsKICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gTk9ORTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmNwcAppbmRleCAyZmJiYjQ0Li5kNzVhY2RhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuY3BwCkBAIC01NTksNyArNTU5LDcgQEAKICAgICAgICAgaWYgKG5hdGl2ZU1ldGEubkZlbmNlRmQgPj0gMCkgewogICAgICAgICAgICAgc3A8RmVuY2U+IGZlbmNlID0gbmV3IEZlbmNlKG5hdGl2ZU1ldGEubkZlbmNlRmQpOwogICAgICAgICAgICAgbmF0aXZlTWV0YS5uRmVuY2VGZCA9IC0xOwotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gZmVuY2UtPndhaXQoSU9NWDo6a0ZlbmNlVGltZW91dE1zKTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGZlbmNlLT53YWl0KGtGZW5jZVRpbWVvdXRNcyk7CiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIlRpbWVkIG91dCB3YWl0aW5nIG9uIGlucHV0IGZlbmNlIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oCmluZGV4IGE5ZmNlNTUuLjk2Njk2NzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oCkBAIC0xNCw4ICsxNCw4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfT01YX1YxXzBfX0NPTlZFUlNJT05fSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX09NWF9WMV8wX19DT05WRVJTSU9OX0gKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9PTVhfVjFfMF9JTVBMX0NPTlZFUlNJT05fSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX09NWF9WMV8wX0lNUExfQ09OVkVSU0lPTl9ICiAKICNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8bGlzdD4KQEAgLTI5LDE1ICsyOSwxNSBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0JpbmRlci5oPgogI2luY2x1ZGUgPGJpbmRlci9TdGF0dXMuaD4KKyNpbmNsdWRlIDx1aS9CdWZmZXJRdWV1ZURlZnMuaD4KICNpbmNsdWRlIDx1aS9GZW5jZVRpbWUuaD4KICNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgotI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9PTVhGZW5jZVBhcmNlbGFibGUuaD4KICNpbmNsdWRlIDxtZWRpYS9PTVhCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9vbXgvMS4wL0NvbnZlcnNpb24uaD4KICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29udmVyc2lvbi5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21lbW9yeS8xLjAvSU1lbW9yeS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMS4wL0lQcm9kdWNlckxpc3RlbmVyLmg+CkBAIC05OSwxNiArOTksOSBAQAogCiB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcgogICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwotdHlwZWRlZiA6OmFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXIKLSAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKIAotLy8gV2Ugd2FudCB0byB1c2UgYWxsIGZ1bmN0aW9ucyBkZWNsYXJlZCBpbiA6OmFuZHJvaWQ6OmNvbnZlcnNpb24KLXVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmNvbnZlcnNpb247Ci0KLS8vIE5vdyBzcGVjaWZpY2FsbHkgaW5qZWN0IHRoZXNlIHR3byBmdW5jdGlvbnMgaGVyZSwgYmVjYXVzZSB3ZSdyZSBnb2luZyB0bwotLy8gZGVjbGFyZSBmdW5jdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lIGluIHRoaXMgbmFtZXNwYWNlLgotdXNpbmcgOjphbmRyb2lkOjpjb252ZXJzaW9uOjpjb252ZXJ0VG87Ci11c2luZyA6OmFuZHJvaWQ6OmNvbnZlcnNpb246OnRvU3RhdHVzVDsKKy8vIFVzZSB0aGUgY29udmVyc2lvbiBmdW5jdGlvbnMgZnJvbSBsaWJtZWRpYV9vbXggc28gdGhhdCB3ZSBkb24ndCBuZWVkIGxpYmd1aQordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA6OnV0aWxzOwogCiAvKioKICAqIENvbnZlcnNpb24gZnVuY3Rpb25zCkBAIC0xNDMsNTcgKzEzNiw2IEBACiAgKi8KIAogLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgU3RhdHVzYCB0byBgc3RhdHVzX3RgLiBUaGlzIGlzIGZvciBsZWdhY3kgYmluZGVyIGNhbGxzLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBTdGF0dXNgLgotICogXHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBgc3RhdHVzX3RgLgotICovCi0vLyBjb252ZXJ0OiBTdGF0dXMgLT4gc3RhdHVzX3QKLWlubGluZSBzdGF0dXNfdCB0b1N0YXR1c1QoU3RhdHVzIGNvbnN0JiB0KSB7Ci0gICAgc3dpdGNoICh0KSB7Ci0gICAgY2FzZSBTdGF0dXM6Ok5PX0VSUk9SOgotICAgIGNhc2UgU3RhdHVzOjpOQU1FX05PVF9GT1VORDoKLSAgICBjYXNlIFN0YXR1czo6V09VTERfQkxPQ0s6Ci0gICAgY2FzZSBTdGF0dXM6Ok5PX01FTU9SWToKLSAgICBjYXNlIFN0YXR1czo6QUxSRUFEWV9FWElTVFM6Ci0gICAgY2FzZSBTdGF0dXM6Ok5PX0lOSVQ6Ci0gICAgY2FzZSBTdGF0dXM6OkJBRF9WQUxVRToKLSAgICBjYXNlIFN0YXR1czo6REVBRF9PQkpFQ1Q6Ci0gICAgY2FzZSBTdGF0dXM6OklOVkFMSURfT1BFUkFUSU9OOgotICAgIGNhc2UgU3RhdHVzOjpUSU1FRF9PVVQ6Ci0gICAgY2FzZSBTdGF0dXM6OkVSUk9SX1VOU1VQUE9SVEVEOgotICAgIGNhc2UgU3RhdHVzOjpVTktOT1dOX0VSUk9SOgotICAgIGNhc2UgU3RhdHVzOjpSRUxFQVNFX0FMTF9CVUZGRVJTOgotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHQpOwotICAgIGNhc2UgU3RhdHVzOjpCVUZGRVJfTkVFRFNfUkVBTExPQ0FUSU9OOgotICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dXKCJVbnJlY29nbml6ZWQgc3RhdHVzIHZhbHVlOiAlIiBQUklkMzIsIHN0YXRpY19jYXN0PGludDMyX3Q+KHQpKTsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHN0YXR1c190Pih0KTsKLSAgICB9Ci19Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYFJldHVybjxTdGF0dXM+YCB0byBgc3RhdHVzX3RgLiBUaGlzIGlzIGZvciBsZWdhY3kgYmluZGVyCi0gKiBjYWxscy4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgUmV0dXJuPFN0YXR1cz5gLgotICogXHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBgc3RhdHVzX3RgLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gZmlyc3QgY2hlY2sgaWYgXHAgdCBoYXMgYSB0cmFuc3BvcnQgZXJyb3IuIElmIGl0IGRvZXMsIHRoZW4gdGhlCi0gKiByZXR1cm4gdmFsdWUgaXMgdGhlIHRyYW5zcG9ydCBlcnJvciBjb2RlLiBPdGhlcndpc2UsIHRoZSByZXR1cm4gdmFsdWUgaXMKLSAqIGNvbnZlcnRlZCBmcm9tIGBTdGF0dXNgIGNvbnRhaW5lZCBpbnNpZGUgXHAgdC4KLSAqCi0gKiBOb3RlOgotICogLSBUaGlzIGBTdGF0dXNgIGlzIG9teC1zcGVjaWZpYy4gSXQgaXMgZGVmaW5lZCBpbiBgdHlwZXMuaGFsYC4KLSAqIC0gVGhlIG5hbWUgb2YgdGhpcyBmdW5jdGlvbiBpcyBub3QgYGNvbnZlcnRgLgotICovCi0vLyBjb252ZXJ0OiBTdGF0dXMgLT4gc3RhdHVzX3QKLWlubGluZSBzdGF0dXNfdCB0b1N0YXR1c1QoUmV0dXJuPFN0YXR1cz4gY29uc3QmIHQpIHsKLSAgICByZXR1cm4gdC5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdGljX2Nhc3Q8U3RhdHVzPih0KSkgOiBVTktOT1dOX0VSUk9SOwotfQotCi0vKioKICAqIFxicmllZiBDb252ZXJ0IGBzdGF0dXNfdGAgdG8gYFN0YXR1c2AuCiAgKgogICogXHBhcmFtW2luXSBsIFRoZSBzb3VyY2UgYHN0YXR1c190YC4KQEAgLTIxNCw4ICsxNTYsOCBAQAogICAgIGNhc2UgVElNRURfT1VUOgogICAgIGNhc2UgRVJST1JfVU5TVVBQT1JURUQ6CiAgICAgY2FzZSBVTktOT1dOX0VSUk9SOgotICAgIGNhc2UgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UkVMRUFTRV9BTExfQlVGRkVSUzoKLSAgICBjYXNlIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkJVRkZFUl9ORUVEU19SRUFMTE9DQVRJT046CisgICAgY2FzZSBCdWZmZXJRdWV1ZURlZnM6OlJFTEVBU0VfQUxMX0JVRkZFUlM6CisgICAgY2FzZSBCdWZmZXJRdWV1ZURlZnM6OkJVRkZFUl9ORUVEU19SRUFMTE9DQVRJT046CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdGF0dXM+KGwpOwogICAgIGNhc2UgTk9UX0VOT1VHSF9EQVRBOgogICAgICAgICByZXR1cm4gU3RhdHVzOjpCVUZGRVJfTkVFRFNfUkVBTExPQ0FUSU9OOwpAQCAtNTY3LDcgKzUwOSw4IEBACiAgICAgICAgICAgICBhbndCdWZmZXIubmF0aXZlSGFuZGxlID0gdC5uYXRpdmVIYW5kbGU7CiAgICAgICAgICAgICBhbndCdWZmZXIuYXR0ciA9IHQuYXR0ci5hbndCdWZmZXI7CiAgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBncmFwaGljQnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKLSAgICAgICAgICAgIGlmICghY29udmVydFRvKGdyYXBoaWNCdWZmZXIuZ2V0KCksIGFud0J1ZmZlcikpIHsKKyAgICAgICAgICAgIGlmICghOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6dXRpbHM6OmNvbnZlcnRUbygKKyAgICAgICAgICAgICAgICAgICAgZ3JhcGhpY0J1ZmZlci5nZXQoKSwgYW53QnVmZmVyKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICpsID0gT01YQnVmZmVyKGdyYXBoaWNCdWZmZXIpOwpAQCAtNzUxLDQgKzY5NCw0IEBACiB9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKLSNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9PTVhfVjFfMF9fQ09OVkVSU0lPTl9ICisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfT01YX1YxXzBfSU1QTF9DT05WRVJTSU9OX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuaAppbmRleCAwMDZkMmQ5Li4xNWQ0Njk5MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXhTdG9yZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgogCkBAIC00MywxNSArNDQsMTQgQEAKIAogc3RydWN0IE9teFN0b3JlIDogcHVibGljIElPbXhTdG9yZSB7CiAgICAgT214U3RvcmUoCisgICAgICAgICAgICBjb25zdCBzcDxJT214PiAmb214ID0gbnVsbHB0ciwKICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG93bmVyID0gImRlZmF1bHQiLAotICAgICAgICAgICAgY29uc3QgY2hhciogY29uc3QqIHNlYXJjaERpcnMKLSAgICAgICAgICAgICAgICA9IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpkZWZhdWx0U2VhcmNoRGlycywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1haW5YbWxOYW1lCi0gICAgICAgICAgICAgICAgPSBNZWRpYUNvZGVjc1htbFBhcnNlcjo6ZGVmYXVsdE1haW5YbWxOYW1lLAotICAgICAgICAgICAgY29uc3QgY2hhciogcGVyZm9ybWFuY2VYbWxOYW1lCi0gICAgICAgICAgICAgICAgPSBNZWRpYUNvZGVjc1htbFBhcnNlcjo6ZGVmYXVsdFBlcmZvcm1hbmNlWG1sTmFtZSwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIHByb2ZpbGluZ1Jlc3VsdHNYbWxQYXRoCi0gICAgICAgICAgICAgICAgPSBNZWRpYUNvZGVjc1htbFBhcnNlcjo6ZGVmYXVsdFByb2ZpbGluZ1Jlc3VsdHNYbWxQYXRoKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmc2VhcmNoRGlycyA9CisgICAgICAgICAgICAgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmdldERlZmF1bHRTZWFyY2hEaXJzKCksCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJnhtbEZpbGVzID0KKyAgICAgICAgICAgICAgICBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Z2V0RGVmYXVsdFhtbE5hbWVzKCksCisgICAgICAgICAgICBjb25zdCBjaGFyICp4bWxQcm9maWxpbmdSZXN1bHRzUGF0aCA9CisgICAgICAgICAgICAgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRQcm9maWxpbmdSZXN1bHRzWG1sUGF0aCk7CiAKICAgICB2aXJ0dWFsIH5PbXhTdG9yZSgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjJhNjk5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9PTVhfVjFfMF9XR1JBUEhJQ0JVRkZFUlBST0RVQ0VSX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9PTVhfVjFfMF9XR1JBUEhJQ0JVRkZFUlBST0RVQ0VSX0gKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGhhcmR3YXJlIHsKLW5hbWVzcGFjZSBtZWRpYSB7Ci1uYW1lc3BhY2Ugb214IHsKLW5hbWVzcGFjZSBWMV8wIHsKLW5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7Ci0KLXVzaW5nIFRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyID0gOjphbmRyb2lkOjpUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjwKLSAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI+OwotCi19ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KLX0gIC8vIG5hbWVzcGFjZSBWMV8wCi19ICAvLyBuYW1lc3BhY2Ugb214Ci19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLX0gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX09NWF9WMV8wX1dPTVhCVUZGRVJQUk9EVUNFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvQldHcmFwaGljQnVmZmVyU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvQldHcmFwaGljQnVmZmVyU291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZmZmMjIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L0JXR3JhcGhpY0J1ZmZlclNvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQldHUkFQSElDX0JVRkZFUl9TT1VSQ0VfSF8KLSNkZWZpbmUgQldHUkFQSElDX0JVRkZFUl9TT1VSQ0VfSF8KLQotI2luY2x1ZGUgPGJpbmRlci9CaW5kZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvU3RhdHVzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9CbkdyYXBoaWNCdWZmZXJTb3VyY2UuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL0JuT01YQnVmZmVyU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgotCi0jaW5jbHVkZSAiT214R3JhcGhpY0J1ZmZlclNvdXJjZS5oIgotI2luY2x1ZGUgIklPbXhOb2RlV3JhcHBlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXVzaW5nIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM7Ci11c2luZyA6OmFuZHJvaWQ6OkJuR3JhcGhpY0J1ZmZlclNvdXJjZTsKLXVzaW5nIDo6YW5kcm9pZDo6T214R3JhcGhpY0J1ZmZlclNvdXJjZTsKLXVzaW5nIDo6YW5kcm9pZDo6SU9NWE5vZGU7Ci11c2luZyA6OmFuZHJvaWQ6OnNwOwotCi1zdHJ1Y3QgQldHcmFwaGljQnVmZmVyU291cmNlIDogcHVibGljIEJuR3JhcGhpY0J1ZmZlclNvdXJjZSB7Ci0gICAgc3RydWN0IEJXT01YQnVmZmVyU291cmNlOwotICAgIHN0cnVjdCBCV09teE5vZGVXcmFwcGVyOwotCi0gICAgc3A8T214R3JhcGhpY0J1ZmZlclNvdXJjZT4gbUJhc2U7Ci0gICAgc3A8SU9NWEJ1ZmZlclNvdXJjZT4gbU9NWEJ1ZmZlclNvdXJjZTsKLQotICAgIEJXR3JhcGhpY0J1ZmZlclNvdXJjZShzcDxPbXhHcmFwaGljQnVmZmVyU291cmNlPiBjb25zdCAmYmFzZSk7Ci0KLSAgICBTdGF0dXMgY29uZmlndXJlKAotICAgICAgICAgICAgY29uc3Qgc3A8SU9NWE5vZGU+JiBvbXhOb2RlLCBpbnQzMl90IGRhdGFTcGFjZSkgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIHNldFN1c3BlbmQoYm9vbCBzdXNwZW5kLCBpbnQ2NF90IHRpbWVVcykgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIHNldFJlcGVhdFByZXZpb3VzRnJhbWVEZWxheVVzKAotICAgICAgICAgICAgaW50NjRfdCByZXBlYXRBZnRlclVzKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc2V0TWF4RnBzKGZsb2F0IG1heEZwcykgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIHNldFRpbWVMYXBzZUNvbmZpZygKLSAgICAgICAgICAgIGRvdWJsZSBmcHMsIGRvdWJsZSBjYXB0dXJlRnBzKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc2V0U3RhcnRUaW1lVXMoaW50NjRfdCBzdGFydFRpbWVVcykgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIHNldFN0b3BUaW1lVXMoaW50NjRfdCBzdG9wVGltZVVzKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgZ2V0U3RvcFRpbWVPZmZzZXRVcyhpbnQ2NF90KiBzdG9wVGltZU9mZnNldFVzKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc2V0Q29sb3JBc3BlY3RzKGludDMyX3QgYXNwZWN0cykgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIHNldFRpbWVPZmZzZXRVcyhpbnQ2NF90IHRpbWVPZmZzZXRzVXMpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgb3ZlcnJpZGU7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfT01YX1YxXzBfV0dSQVBISUNCVUZGRVJTT1VSQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oCmluZGV4IDg5N2YyODcuLjkzZWFlZjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmgKQEAgLTUyLDEzICs1MiwxNiBAQAogcHJpdmF0ZToKICAgICBjaGFyIG1Qcm9jZXNzTmFtZVsxNl07CiAgICAgTXV0ZXggbUxvY2s7Ci0gICAgTGlzdDxPTVhQbHVnaW5CYXNlICo+IG1QbHVnaW5zOworICAgIHN0cnVjdCBQbHVnaW4geworICAgICAgICBPTVhQbHVnaW5CYXNlICptT214OworICAgICAgICB2b2lkICptTGliSGFuZGxlOworICAgIH07CisgICAgTGlzdDxQbHVnaW4+IG1QbHVnaW5zOwogICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIE9NWFBsdWdpbkJhc2UgKj4gbVBsdWdpbkJ5Q29tcG9uZW50TmFtZTsKICAgICBLZXllZFZlY3RvcjxPTVhfQ09NUE9ORU5UVFlQRSAqLCBPTVhQbHVnaW5CYXNlICo+IG1QbHVnaW5CeUluc3RhbmNlOwogCi0gICAgdm9pZCAqbVZlbmRvckxpYkhhbmRsZTsKLQogICAgIHZvaWQgYWRkVmVuZG9yUGx1Z2luKCk7CisgICAgdm9pZCBhZGRQbGF0Zm9ybVBsdWdpbigpOwogICAgIHZvaWQgYWRkUGx1Z2luKGNvbnN0IGNoYXIgKmxpYm5hbWUpOwogICAgIHZvaWQgYWRkUGx1Z2luKE9NWFBsdWdpbkJhc2UgKnBsdWdpbik7CiAgICAgdm9pZCBjbGVhclBsdWdpbnMoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oCmluZGV4IDFkMWYyYmQuLjZiYmVkZGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaApAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSAiU29mdE9NWENvbXBvbmVudC5oIgogCisjaW5jbHVkZSA8YXRvbWljPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXJSZWZsZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgpAQCAtMjgsNiArMjksNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQUxvb3BlcjsKK3N0cnVjdCBBQnVmZmVyOwogCiBzdHJ1Y3QgQ29kZWNQcm9maWxlTGV2ZWwgewogICAgIE9NWF9VMzIgbVByb2ZpbGU7CkBAIC00OSw2ICs1MSw3IEBACiAgICAgc3RydWN0IEJ1ZmZlckluZm8gewogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqbUhlYWRlcjsKICAgICAgICAgYm9vbCBtT3duZWRCeVVzOworICAgICAgICBib29sIG1GcmFtZUNvbmZpZzsKICAgICB9OwogCiAgICAgc3RydWN0IFBvcnRJbmZvIHsKQEAgLTc2LDYgKzc5LDkgQEAKICAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyk7CiAKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRDb25maWcoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcywgYm9vbCAqZnJhbWVDb25maWcpOworCiAgICAgdmlydHVhbCB2b2lkIG9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpOwogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmZ2V0UG9ydFF1ZXVlKE9NWF9VMzIgcG9ydEluZGV4KTsKIApAQCAtMTAxLDYgKzEwNyw3IEBACiAgICAgT01YX1NUQVRFVFlQRSBtVGFyZ2V0U3RhdGU7CiAKICAgICBWZWN0b3I8UG9ydEluZm8+IG1Qb3J0czsKKyAgICBzdGQ6OmF0b21pY19ib29sIG1GcmFtZUNvbmZpZzsKIAogICAgIGJvb2wgaXNTZXRQYXJhbWV0ZXJBbGxvd2VkKAogICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpIGNvbnN0OwpAQCAtMTE0LDYgKzEyMSw5IEBACiAgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIHNldFBhcmFtZXRlcigKICAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKIAorICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBzZXRDb25maWcoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyk7CisKICAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgdXNlQnVmZmVyKAogICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipidWZmZXIsCiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0T01YQ29tcG9uZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdE9NWENvbXBvbmVudC5oCmluZGV4IDNhYjZmODguLjc5ZjBjNzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0T01YQ29tcG9uZW50LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRPTVhDb21wb25lbnQuaApAQCAtMjEsMTIgKzIxLDE1IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPE9NWF9Db21wb25lbnQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgU29mdE9NWENvbXBvbmVudCA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBlbnVtIHsKKyAgICAgICAga0ZlbmNlVGltZW91dE1zID0gMTAwMAorICAgIH07CiAgICAgU29mdE9NWENvbXBvbmVudCgKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaAppbmRleCA1NmZjNjkxLi5kN2MxNjU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgKQEAgLTIwLDE0ICsyMCwxOSBAQAogCiAjaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgogCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlclJlZmxlY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Db3JlLmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfVmlkZW8uaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9WaWRlb0V4dC5oPgorCiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KIAogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQ4LDYgKzUzLDcgQEAKICAgICBlbnVtIHsKICAgICAgICAga0Rlc2NyaWJlQ29sb3JBc3BlY3RzSW5kZXggPSBrUHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2tJbmRleCArIDEsCiAgICAgICAgIGtEZXNjcmliZUhkclN0YXRpY0luZm9JbmRleCA9IGtQcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFja0luZGV4ICsgMiwKKyAgICAgICAga0Rlc2NyaWJlSGRyMTBQbHVzSW5mb0luZGV4ID0ga1ByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrSW5kZXggKyAzLAogICAgIH07CiAKICAgICBlbnVtIHsKQEAgLTY4LDggKzc0LDggQEAKICAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZ2V0Q29uZmlnKAogICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpOwogCi0gICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIHNldENvbmZpZygKLSAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRDb25maWcoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcywgYm9vbCAqZnJhbWVDb25maWcpOwogCiAgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGdldEV4dGVuc2lvbkluZGV4KAogICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpOwpAQCAtODAsNiArODYsOCBAQAogCiAgICAgdmlydHVhbCBib29sIHN1cHBvcnREZXNjcmliZUhkclN0YXRpY0luZm8oKTsKIAorICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0RGVzY3JpYmVIZHIxMFBsdXNJbmZvKCk7CisKICAgICAvLyBUaGlzIGZ1bmN0aW9uIHNldHMgYm90aCBtaW5pbXVtIGJ1ZmZlciBjb3VudCBhbmQgYWN0dWFsIGJ1ZmZlciBjb3VudCBvZgogICAgIC8vIGlucHV0IHBvcnQgdG8gYmUgfG51bUlucHV0QnVmZmVyc3wuIEl0IHdpbGwgYWxzbyBzZXQgYm90aCBtaW5pbXVtIGJ1ZmZlcgogICAgIC8vIGNvdW50IGFuZCBhY3R1YWwgYnVmZmVyIGNvdW50IG9mIG91dHB1dCBwb3J0IHRvIGJlIHxudW1PdXRwdXRCdWZmZXJzfC4KQEAgLTE2Niw2ICsxNzQsOSBAQAogICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBkdW1wIHRoZSBDb2xvckFzcGVjdHMuCiAgICAgdm9pZCBkdW1wQ29sb3JBc3BlY3RzKGNvbnN0IENvbG9yQXNwZWN0cyAmY29sb3JBc3BlY3RzKTsKIAorICAgIHNwPEFCdWZmZXI+IGRlcXVldWVJbnB1dEZyYW1lQ29uZmlnKCk7CisgICAgdm9pZCBxdWV1ZU91dHB1dEZyYW1lQ29uZmlnKGNvbnN0IHNwPEFCdWZmZXI+ICZpbmZvKTsKKwogcHJpdmF0ZToKICAgICB1aW50MzJfdCBtTWluSW5wdXRCdWZmZXJTaXplOwogICAgIHVpbnQzMl90IG1NaW5Db21wcmVzc2lvblJhdGlvOwpAQCAtMTc0LDYgKzE4NSw5IEBACiAgICAgT01YX1ZJREVPX0NPRElOR1RZUEUgbUNvZGluZ1R5cGU7CiAgICAgY29uc3QgQ29kZWNQcm9maWxlTGV2ZWwgKm1Qcm9maWxlTGV2ZWxzOwogICAgIHNpemVfdCBtTnVtUHJvZmlsZUxldmVsczsKKyAgICB0eXBlZGVmIExpc3Q8c3A8QUJ1ZmZlcj4gPiBIZHIxMFBsdXNJbmZvTGlzdDsKKyAgICBIZHIxMFBsdXNJbmZvTGlzdCBtSGRyMTBQbHVzSW5wdXRzOworICAgIEhkcjEwUGx1c0luZm9MaXN0IG1IZHIxMFBsdXNPdXRwdXRzOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudCk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmgKaW5kZXggMmQ2ZjMxYi4uOWNiNzJkZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oCkBAIC0xOCw3ICsxOCw5IEBACiAKICNkZWZpbmUgU09GVF9WSURFT19FTkNPREVSX09NWF9DT01QT05FTlRfSF8KIAotI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Db3JlLmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfVmlkZW8uaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9WaWRlb0V4dC5oPgogCiAjaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDNiNTIxYWIuLjU2OWZhODggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLmJwCkBAIC05LDcgKzksNiBAQAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYm1lZGlhIiwKICAgICAgICAgImxpYm1lZGlhX29teCIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCkBAIC0xOSwxMiArMTgsMTEgQEAKICAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwubWVtb3J5QDEuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAKaW5kZXggODk1YTRjZS4uY2M4YzIzNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcApAQCAtMTcsNiArMTcsNyBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJPTVhIYXJuZXNzIgogI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiT01YSGFybmVzcy5oIgpAQCAtMjgsNyArMjksNiBAQAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL09NWEJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CkBAIC00MCw5ICs0MCw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1NpbXBsZURlY29kaW5nU291cmNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXguaD4KLSNpbmNsdWRlIDxtZWRpYS9vbXgvMS4wL1dPbXguaD4KICNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+CiAKICNkZWZpbmUgREVGQVVMVF9USU1FT1VUICAgICAgICAgNTAwMDAwCkBAIC04MSwxMiArODAsMTMgQEAKIH0KIAogc3RhdHVzX3QgSGFybmVzczo6aW5pdE9NWCgpIHsKLSAgICB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDsKLSAgICBzcDxJT214PiB0T214ID0gSU9teDo6Z2V0U2VydmljZSgpOwotICAgIGlmICh0T214ID09IG51bGxwdHIpIHsKKyAgICBPTVhDbGllbnQgY2xpZW50OworICAgIGlmIChjbGllbnQuY29ubmVjdCgpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY29ubmVjdCB0byBPTVggdG8gY3JlYXRlIHBlcnNpc3RlbnQgaW5wdXQgc3VyZmFjZS4iKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIG1PTVggPSBuZXcgdXRpbHM6OkxXT214KHRPbXgpOworCisgICAgbU9NWCA9IGNsaWVudC5pbnRlcmZhY2UoKTsKIAogICAgIHJldHVybiBtT01YICE9IDAgPyBPSyA6IE5PX0lOSVQ7CiB9CkBAIC04NDQsNyArODQ0LDcgQEAKIAogICAgICAgICAgICAgY2FzZSAnPyc6CiAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJcbiIpOwotICAgICAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogCiAgICAgICAgICAgICBjYXNlICdoJzoKICAgICAgICAgICAgIGRlZmF1bHQ6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FNUEVHNEF1ZGlvQXNzZW1ibGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0QXVkaW9Bc3NlbWJsZXIuY3BwCmluZGV4IDgyYTA2MzEuLjQzMDJhZWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0QXVkaW9Bc3NlbWJsZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0QXVkaW9Bc3NlbWJsZXIuY3BwCkBAIC00MjMsNiArNDIzLDExIEBACiAgICAgICAgICAgICBDSEVDS19MRShvZmZzZXQgKyAobU90aGVyRGF0YUxlbkJpdHMgLyA4KSwgYnVmZmVyLT5zaXplKCkpOwogICAgICAgICAgICAgb2Zmc2V0ICs9IG1PdGhlckRhdGFMZW5CaXRzIC8gODsKICAgICAgICAgfQorCisgICAgICAgIGlmIChpIDwgbU51bVN1YkZyYW1lcyAmJiBvZmZzZXQgPj0gYnVmZmVyLT5zaXplKCkpIHsKKyAgICAgICAgICAgIEFMT0dXKCJTa2lwIHN1YmZyYW1lcyBhZnRlciAlZCwgdG90YWwgJWQiLCAoaW50KWksIChpbnQpbU51bVN1YkZyYW1lcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChvZmZzZXQgPCBidWZmZXItPnNpemUoKSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVBhY2tldFNvdXJjZS5jcHAKaW5kZXggYzU2MDViNC4uMWFhOGEyMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUGFja2V0U291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FQYWNrZXRTb3VyY2UuY3BwCkBAIC00MTcsNyArNDE3LDcgQEAKICAgICBpZiAoc2Vzc2lvbkRlc2MtPmdldER1cmF0aW9uVXMoJmR1cmF0aW9uVXMpKSB7CiAgICAgICAgIG1Gb3JtYXQtPnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbUZvcm1hdC0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCAtMWxsKTsKKyAgICAgICAgbUZvcm1hdC0+c2V0SW50NjQoa0tleUR1cmF0aW9uLCAtMUxMKTsKICAgICB9CiAKICAgICBtSW5pdENoZWNrID0gT0s7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBBc3NlbWJsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQQXNzZW1ibGVyLmNwcAppbmRleCBjN2E2NWMyLi5iZWZjMjI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBBc3NlbWJsZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUEFzc2VtYmxlci5jcHAKQEAgLTM2LDcgKzM2LDcgQEAKIAogICAgICAgICBpZiAoc3RhdHVzID09IFdST05HX1NFUVVFTkNFX05VTUJFUikgewogICAgICAgICAgICAgaWYgKG1GaXJzdEZhaWx1cmVUaW1lVXMgPj0gMCkgewotICAgICAgICAgICAgICAgIGlmIChBTG9vcGVyOjpHZXROb3dVcygpIC0gbUZpcnN0RmFpbHVyZVRpbWVVcyA+IDEwMDAwbGwpIHsKKyAgICAgICAgICAgICAgICBpZiAoQUxvb3Blcjo6R2V0Tm93VXMoKSAtIG1GaXJzdEZhaWx1cmVUaW1lVXMgPiAxMDAwMExMKSB7CiAgICAgICAgICAgICAgICAgICAgIG1GaXJzdEZhaWx1cmVUaW1lVXMgPSAtMTsKIAogICAgICAgICAgICAgICAgICAgICAvLyBMT0coVkVSQk9TRSkgPDwgIndhaXRlZCB0b28gbG9uZyBmb3IgcGFja2V0LiI7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBDb25uZWN0aW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uY3BwCmluZGV4IGE4NmFiNzQuLjZhNDcwNmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUENvbm5lY3Rpb24uY3BwCkBAIC01MCw3ICs1MCw3IEBACiB9CiAKIC8vIHN0YXRpYwotY29uc3QgaW50NjRfdCBBUlRQQ29ubmVjdGlvbjo6a1NlbGVjdFRpbWVvdXRVcyA9IDEwMDBsbDsKK2NvbnN0IGludDY0X3QgQVJUUENvbm5lY3Rpb246OmtTZWxlY3RUaW1lb3V0VXMgPSAxMDAwTEw7CiAKIHN0cnVjdCBBUlRQQ29ubmVjdGlvbjo6U3RyZWFtSW5mbyB7CiAgICAgaW50IG1SVFBTb2NrZXQ7CkBAIC0xMTgsNyArMTE4LDcgQEAKICAgICBidW1wU29ja2V0QnVmZmVyU2l6ZSgqcnRjcFNvY2tldCk7CiAKICAgICAvKiByYW5kKCkgKiAxMDAwIG1heSBvdmVyZmxvdyBpbnQgdHlwZSwgdXNlIGxvbmcgbG9uZyAqLwotICAgIHVuc2lnbmVkIHN0YXJ0ID0gKHVuc2lnbmVkKSgocmFuZCgpKiAxMDAwbGwpL1JBTkRfTUFYKSArIDE1NTUwOworICAgIHVuc2lnbmVkIHN0YXJ0ID0gKHVuc2lnbmVkKSgocmFuZCgpKiAxMDAwTEwpL1JBTkRfTUFYKSArIDE1NTUwOwogICAgIHN0YXJ0ICY9IH4xOwogCiAgICAgZm9yICh1bnNpZ25lZCBwb3J0ID0gc3RhcnQ7IHBvcnQgPCA2NTUzNjsgcG9ydCArPSAyKSB7CkBAIC0zMDcsNyArMzA3LDcgQEAKIAogICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwogICAgIGlmIChtTGFzdFJlY2VpdmVyUmVwb3J0VGltZVVzIDw9IDAKLSAgICAgICAgICAgIHx8IG1MYXN0UmVjZWl2ZXJSZXBvcnRUaW1lVXMgKyA1MDAwMDAwbGwgPD0gbm93VXMpIHsKKyAgICAgICAgICAgIHx8IG1MYXN0UmVjZWl2ZXJSZXBvcnRUaW1lVXMgKyA1MDAwMDAwTEwgPD0gbm93VXMpIHsKICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoa01heFVEUFNpemUpOwogICAgICAgICBMaXN0PFN0cmVhbUluZm8+OjppdGVyYXRvciBpdCA9IG1TdHJlYW1zLmJlZ2luKCk7CiAgICAgICAgIHdoaWxlIChpdCAhPSBtU3RyZWFtcy5lbmQoKSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFNvdXJjZS5jcHAKaW5kZXggNDgyN2NkMi4uNGFmYTZmNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBTb3VyY2UuY3BwCkBAIC0xODAsNyArMTgwLDcgQEAKICAgICB9CiAKICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLSAgICBpZiAobUxhc3RGSVJSZXF1ZXN0VXMgPj0gMCAmJiBtTGFzdEZJUlJlcXVlc3RVcyArIDUwMDAwMDBsbCA+IG5vd1VzKSB7CisgICAgaWYgKG1MYXN0RklSUmVxdWVzdFVzID49IDAgJiYgbUxhc3RGSVJSZXF1ZXN0VXMgKyA1MDAwMDAwTEwgPiBub3dVcykgewogICAgICAgICAvLyBTZW5kIEZJUiByZXF1ZXN0cyBhdCBtb3N0IGV2ZXJ5IDUgc2Vjcy4KICAgICAgICAgcmV0dXJuOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFBXcml0ZXIuY3BwCmluZGV4IDA2NjdkZjEuLjRmODY3NzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUUFdyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRQV3JpdGVyLmNwcApAQCAtNDAwLDggKzQwMCwxMCBAQAogICAgICAgICBzd2l0Y2ggKGNvdW50KSB7CiAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAwOworICAgICAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICBkYXRhW29mZnNldCsrXSA9IDA7CisgICAgICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOwogICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgIGRhdGFbb2Zmc2V0KytdID0gMDsKICAgICAgICAgfQpAQCAtNDE4LDEwICs0MjAsMTAgQEAKIHVpbnQ2NF90IEFSVFBXcml0ZXI6OkdldE5vd05UUCgpIHsKICAgICB1aW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CiAKLSAgICBub3dVcyArPSAoKDcwbGwgKiAzNjUgKyAxNykgKiAyNCkgKiA2MCAqIDYwICogMTAwMDAwMGxsOworICAgIG5vd1VzICs9ICgoNzBMTCAqIDM2NSArIDE3KSAqIDI0KSAqIDYwICogNjAgKiAxMDAwMDAwTEw7CiAKLSAgICB1aW50NjRfdCBoaSA9IG5vd1VzIC8gMTAwMDAwMGxsOwotICAgIHVpbnQ2NF90IGxvID0gKCgxbGwgPDwgMzIpICogKG5vd1VzICUgMTAwMDAwMGxsKSkgLyAxMDAwMDAwbGw7CisgICAgdWludDY0X3QgaGkgPSBub3dVcyAvIDEwMDAwMDBMTDsKKyAgICB1aW50NjRfdCBsbyA9ICgoMUxMIDw8IDMyKSAqIChub3dVcyAlIDEwMDAwMDBMTCkpIC8gMTAwMDAwMExMOwogCiAgICAgcmV0dXJuIChoaSA8PCAzMikgfCBsbzsKIH0KQEAgLTU3NCw3ICs1NzYsNyBAQAogICAgIGludDY0X3QgdGltZVVzOwogICAgIENIRUNLKG1lZGlhQnVmLT5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKIAotICAgIHVpbnQzMl90IHJ0cFRpbWUgPSBtUlRQVGltZUJhc2UgKyAodGltZVVzICogOSAvIDEwMGxsKTsKKyAgICB1aW50MzJfdCBydHBUaW1lID0gbVJUUFRpbWVCYXNlICsgKHRpbWVVcyAqIDkgLyAxMDBMTCk7CiAKICAgICBjb25zdCB1aW50OF90ICptZWRpYURhdGEgPQogICAgICAgICAoY29uc3QgdWludDhfdCAqKW1lZGlhQnVmLT5kYXRhKCkgKyBtZWRpYUJ1Zi0+cmFuZ2Vfb2Zmc2V0KCk7CkBAIC02NjksNyArNjcxLDcgQEAKICAgICBpbnQ2NF90IHRpbWVVczsKICAgICBDSEVDSyhtZWRpYUJ1Zi0+bWV0YV9kYXRhKCkuZmluZEludDY0KGtLZXlUaW1lLCAmdGltZVVzKSk7CiAKLSAgICB1aW50MzJfdCBydHBUaW1lID0gbVJUUFRpbWVCYXNlICsgKHRpbWVVcyAqIDkgLyAxMDBsbCk7CisgICAgdWludDMyX3QgcnRwVGltZSA9IG1SVFBUaW1lQmFzZSArICh0aW1lVXMgKiA5IC8gMTAwTEwpOwogCiAgICAgY29uc3QgdWludDhfdCAqbWVkaWFEYXRhID0KICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltZWRpYUJ1Zi0+ZGF0YSgpICsgbWVkaWFCdWYtPnJhbmdlX29mZnNldCgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCmluZGV4IDU2MjBjZjguLjc4OWU2MmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgIkFSVFNQQ29ubmVjdGlvbi5oIgorI2luY2x1ZGUgIk5ldHdvcmtVdGlscy5oIgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KQEAgLTM4LDcgKzM5LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gc3RhdGljCi1jb25zdCBpbnQ2NF90IEFSVFNQQ29ubmVjdGlvbjo6a1NlbGVjdFRpbWVvdXRVcyA9IDEwMDBsbDsKK2NvbnN0IGludDY0X3QgQVJUU1BDb25uZWN0aW9uOjprU2VsZWN0VGltZW91dFVzID0gMTAwMExMOwogCiAvLyBzdGF0aWMKIGNvbnN0IEFTdHJpbmcgQVJUU1BDb25uZWN0aW9uOjpzVXNlckFnZW50ID0KQEAgLTU5LDggKzYwLDggQEAKICAgICBpZiAobVNvY2tldCA+PSAwKSB7CiAgICAgICAgIEFMT0dFKCJDb25uZWN0aW9uIGlzIHN0aWxsIG9wZW4sIGNsb3NpbmcgdGhlIHNvY2tldC4iKTsKICAgICAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOwotICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0KTsKKyAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7CisgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0KTsKICAgICAgICAgfQogICAgICAgICBjbG9zZShtU29ja2V0KTsKICAgICAgICAgbVNvY2tldCA9IC0xOwpAQCAtMjE0LDggKzIxNSw4IEBACiAKICAgICBpZiAobVN0YXRlICE9IERJU0NPTk5FQ1RFRCkgewogICAgICAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7Ci0gICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQpOworICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKKyAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQpOwogICAgICAgICB9CiAgICAgICAgIGNsb3NlKG1Tb2NrZXQpOwogICAgICAgICBtU29ja2V0ID0gLTE7CkBAIC0yNTQsNyArMjU1LDcgQEAKIAogICAgIHN0cnVjdCBob3N0ZW50ICplbnQgPSBnZXRob3N0YnluYW1lKGhvc3QuY19zdHIoKSk7CiAgICAgaWYgKGVudCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJVbmtub3duIGhvc3QgJXMiLCBob3N0LmNfc3RyKCkpOworICAgICAgICBBTE9HRSgiVW5rbm93biBob3N0ICVzIiwgdXJpRGVidWdTdHJpbmcoaG9zdCkuY19zdHIoKSk7CiAKICAgICAgICAgcmVwbHktPnNldEludDMyKCJyZXN1bHQiLCAtRU5PRU5UKTsKICAgICAgICAgcmVwbHktPnBvc3QoKTsKQEAgLTI2Niw5ICsyNjcsOSBAQAogICAgIG1Tb2NrZXQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIDApOwogCiAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQsIG1VSUQsCisgICAgICAgIE5ldHdvcmtVdGlsczo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQsIG1VSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSoodWludDMyX3QqKSAiUlRTUCIpOwotICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0LCBtVUlEKTsKKyAgICAgICAgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQsIG1VSUQpOwogICAgIH0KIAogICAgIE1ha2VTb2NrZXRCbG9ja2luZyhtU29ja2V0LCBmYWxzZSk7CkBAIC0yOTcsOCArMjk4LDggQEAKICAgICAgICAgbVN0YXRlID0gRElTQ09OTkVDVEVEOwogCiAgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CisgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOworICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CiAgICAgICAgIH0KICAgICAgICAgY2xvc2UobVNvY2tldCk7CiAgICAgICAgIG1Tb2NrZXQgPSAtMTsKQEAgLTMxNSw4ICszMTYsOCBAQAogCiB2b2lkIEFSVFNQQ29ubmVjdGlvbjo6cGVyZm9ybURpc2Nvbm5lY3QoKSB7CiAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7Ci0gICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CisgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7CisgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQpOwogICAgIH0KICAgICBjbG9zZShtU29ja2V0KTsKICAgICBtU29ja2V0ID0gLTE7CkBAIC0zODksOCArMzkwLDggQEAKIAogICAgICAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7CiAgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CisgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOworICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CiAgICAgICAgIH0KICAgICAgICAgY2xvc2UobVNvY2tldCk7CiAgICAgICAgIG1Tb2NrZXQgPSAtMTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwCmluZGV4IDMyNTA4NGMuLjkyNjM1NjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcApAQCAtODAsNyArODAsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgQUxPR0koIiVzIiwgbGluZS5jX3N0cigpKTsKKyAgICAgICAgQUxPR1YoIiVzIiwgbGluZS5jX3N0cigpKTsKIAogICAgICAgICBzd2l0Y2ggKGxpbmUuY19zdHIoKVswXSkgewogICAgICAgICAgICAgY2FzZSAndic6CkBAIC0yNjEsNyArMjYxLDcgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmIChzdHJuY21wKHZhbHVlLmNfc3RyKCksICJucHQ9IiwgNCkpIHsKKyAgICBpZiAoc3RybmNtcCh2YWx1ZS5jX3N0cigpLCAibnB0PSIsIDQpICYmIHN0cm5jbXAodmFsdWUuY19zdHIoKSwgIm5wdDoiLCA0KSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQuYnAKaW5kZXggZGViZDA3ZS4uOWJjOWM4OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5icApAQCAtMSw1ICsxLDUgQEAKLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfcnRzcCIsCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3J0c3BfZGVmYXVsdHMiLAogCiAgICAgc3JjczogWwogICAgICAgICAiQUFNUkFzc2VtYmxlci5jcHAiLApAQCAtNDYsMTIgKzQ2LDI0IEBACiAgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiB9CiAKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfcnRzcCIsCisKKyAgICBzcmNzOiBbIk5ldHdvcmtVdGlscy5jcHAiXSwKKyAgICBoZWFkZXJfbGliczogWyJsaWJuZXRkX2NsaWVudF9oZWFkZXJzIl0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfcnRzcF9kZWZhdWx0cyJdLAorfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3J0c3BfcGxheWVyMiIsCisKKyAgICBzcmNzOiBbIk5ldHdvcmtVdGlsc0ZvckFwcFByb2MuY3BwIl0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfcnRzcF9kZWZhdWx0cyJdLAorfQorCiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogY2NfdGVzdCB7CkBAIC04OSw4ICsxMDEsNSBAQAogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCiAgICAgfSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCmluZGV4IGM2YzAyNDUuLjQ4YmM4Y2UgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaApAQCAtMzEsNiArMzEsNyBAQAogI2luY2x1ZGUgIkFSVFBDb25uZWN0aW9uLmgiCiAjaW5jbHVkZSAiQVJUU1BDb25uZWN0aW9uLmgiCiAjaW5jbHVkZSAiQVNlc3Npb25EZXNjcmlwdGlvbi5oIgorI2luY2x1ZGUgIk5ldHdvcmtVdGlscy5oIgogCiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgpAQCAtNTQsNiArNTUsMTAgQEAKICNkZWZpbmUgVU5VU0VEX1VOTEVTU19WRVJCT1NFKHgpCiAjZW5kaWYKIAorI2lmbmRlZiBGQUxMVEhST1VHSF9JTlRFTkRFRAorI2RlZmluZSBGQUxMVEhST1VHSF9JTlRFTkRFRCBbW2NsYW5nOjpmYWxsdGhyb3VnaF1dICAvLyBOT0xJTlQKKyNlbmRpZgorCiAvLyBJZiBubyBhY2Nlc3MgdW5pdHMgYXJlIHJlY2VpdmVkIHdpdGhpbiA1IHNlY3MsIGFzc3VtZSB0aGF0IHRoZSBydHAKIC8vIHN0cmVhbSBoYXMgZW5kZWQgYW5kIHNpZ25hbCBlbmQgb2Ygc3RyZWFtLgogc3RhdGljIGludDY0X3Qga0FjY2Vzc1VuaXRUaW1lb3V0VXMgPSAxMDAwMDAwMGxsOwpAQCAtNzAsNiArNzUsOCBAQAogLy8gYSBuZXcgc2VxdWVuY2UuCiBzdGF0aWMgaW50MzJfdCBrTWF4QWxsb3dlZFN0YWxlQWNjZXNzVW5pdHMgPSAyMDsKIAorc3RhdGljIGludDY0X3Qga1RlYXJEb3duVGltZW91dFVzID0gMzAwMDAwMGxsOworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXRpYyBib29sIEdldEF0dHJpYnV0ZShjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICprZXksIEFTdHJpbmcgKnZhbHVlKSB7CkBAIC0zMDYsOCArMzEzLDEwIEBACiAgICAgICAgICAgICBzd2l0Y2ggKGNvdW50KSB7CiAgICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgICBkYXRhW29mZnNldCsrXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgZGF0YVtvZmZzZXQrK10gPSAwOworICAgICAgICAgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgIGRhdGFbb2Zmc2V0KytdID0gMDsKICAgICAgICAgICAgIH0KQEAgLTMzOCw4ICszNDcsNyBAQAogCiAgICAgICAgICAgICBzdHJ1Y3QgaG9zdGVudCAqZW50ID0gZ2V0aG9zdGJ5bmFtZShtU2Vzc2lvbkhvc3QuY19zdHIoKSk7CiAgICAgICAgICAgICBpZiAoZW50ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGxvb2sgdXAgYWRkcmVzcyBvZiBzZXNzaW9uIGhvc3QgJyVzJyIsCi0gICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbkhvc3QuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBsb29rIHVwIGFkZHJlc3Mgb2Ygc2Vzc2lvbiBob3N0Iik7CiAKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CkBAIC01MjQsNyArNTMyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvblVSTC5hcHBlbmQoQVN0cmluZ1ByaW50ZigiJXUiLCBwb3J0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25VUkwuYXBwZW5kKHBhdGgpOwogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0koInJld3JpdHRlbiBzZXNzaW9uIHVybDogJyVzJyIsIG1TZXNzaW9uVVJMLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJyZXdyaXR0ZW4gc2Vzc2lvbiB1cmw6ICclcyciLCBtU2Vzc2lvblVSTC5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKCdjb25uJywgdGhpcyk7CkBAIC03NTEsMTAgKzc1OSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFjay0+bVVzaW5nSW50ZXJsZWF2ZWRUQ1ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgdGFnCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcodHJhY2stPm1SVFBTb2NrZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKHRyYWNrLT5tUlRQU29ja2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKHRyYWNrLT5tUlRDUFNvY2tldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsodHJhY2stPm1SVENQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyh0cmFjay0+bVJUUFNvY2tldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKHRyYWNrLT5tUlRQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyh0cmFjay0+bVJUQ1BTb2NrZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayh0cmFjay0+bVJUQ1BTb2NrZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKHRyYWNrLT5tUlRQU29ja2V0KTsKQEAgLTg4MCwxMCArODg4LDEwIEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSB0YWcKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcoaW5mby0+bVJUUFNvY2tldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRQU29ja2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcoaW5mby0+bVJUQ1BTb2NrZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW5mby0+bVJUQ1BTb2NrZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcoaW5mby0+bVJUUFNvY2tldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW5mby0+bVJUUFNvY2tldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRDUFNvY2tldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW5mby0+bVJUQ1BTb2NrZXQpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZShpbmZvLT5tUlRQU29ja2V0KTsKQEAgLTkyNCw2ICs5MzIsMTQgQEAKICAgICAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiXHJcbiIpOwogCiAgICAgICAgICAgICAgICAgbUNvbm4tPnNlbmRSZXF1ZXN0KHJlcXVlc3QuY19zdHIoKSwgcmVwbHkpOworCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHJlc3BvbnNlIG9mIHRlYXJkb3duIGhhc24ndCBiZWVuIHJlY2VpdmVkIGluIDMgc2Vjb25kcywKKyAgICAgICAgICAgICAgICAvLyBwb3N0ICd0ZWFyJyBtZXNzYWdlIHRvIGF2b2lkIEFOUi4KKyAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJyZWNvbm5lY3QiLCAmcmVjb25uZWN0KSB8fCAhcmVjb25uZWN0KSB7CisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiB0ZWFyZG93biA9IHJlcGx5LT5kdXAoKTsKKyAgICAgICAgICAgICAgICAgICAgdGVhcmRvd24tPnNldEludDMyKCJyZXN1bHQiLCAtRUNPTk5BQk9SVEVEKTsKKyAgICAgICAgICAgICAgICAgICAgdGVhcmRvd24tPnBvc3Qoa1RlYXJEb3duVGltZW91dFVzKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTE2NTksMTIgKzE2NzUsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgJmluZm8tPm1SVFBTb2NrZXQsICZpbmZvLT5tUlRDUFNvY2tldCwgJnJ0cFBvcnQpOwogCiAgICAgICAgICAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgSFRUUEJhc2U6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRQU29ja2V0LCBtVUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSoodWludDMyX3QqKSAiUlRQXyIpOwotICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpSZWdpc3RlclNvY2tldFVzZXJUYWcoaW5mby0+bVJUQ1BTb2NrZXQsIG1VSUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKih1aW50MzJfdCopICJSVFBfIik7Ci0gICAgICAgICAgICAgICAgSFRUUEJhc2U6OlJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW5mby0+bVJUUFNvY2tldCwgbVVJRCk7Ci0gICAgICAgICAgICAgICAgSFRUUEJhc2U6OlJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW5mby0+bVJUQ1BTb2NrZXQsIG1VSUQpOworICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGluZm8tPm1SVFBTb2NrZXQsIG1VSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKih1aW50MzJfdCopICJSVFBfIik7CisgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJUYWcoaW5mby0+bVJUQ1BTb2NrZXQsIG1VSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKih1aW50MzJfdCopICJSVFBfIik7CisgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKGluZm8tPm1SVFBTb2NrZXQsIG1VSUQpOworICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRDUFNvY2tldCwgbVVJRCk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJlcXVlc3QuYXBwZW5kKCJUcmFuc3BvcnQ6IFJUUC9BVlAvVURQO3VuaWNhc3Q7Y2xpZW50X3BvcnQ9Iik7CkBAIC0xOTA2LDcgKzE5MjIsNyBAQAogICAgICAgICAgICAgbUxhc3RNZWRpYVRpbWVVcyA9IG1lZGlhVGltZVVzOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1lZGlhVGltZVVzIDwgMCkgeworICAgICAgICBpZiAobWVkaWFUaW1lVXMgPCAwICYmICFtU2Vla2FibGUpIHsKICAgICAgICAgICAgIEFMT0dWKCJkcm9wcGluZyBlYXJseSBhY2Nlc3NVbml0LiIpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2MzNmI3OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmNwcApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOZXR3b3JrVXRpbHMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJOZXR3b3JrVXRpbHMuaCIKKyNpbmNsdWRlIDxjdXRpbHMvcXRhZ3VpZC5oPgorI2luY2x1ZGUgPE5ldGRDbGllbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzdGF0aWMKK3ZvaWQgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJUYWcoaW50IHNvY2tmZCwgdWlkX3QgdWlkLCB1aW50MzJfdCBrVGFnKSB7CisgICAgaW50IHJlcyA9IHF0YWd1aWRfdGFnU29ja2V0KHNvY2tmZCwga1RhZywgdWlkKTsKKyAgICBpZiAocmVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0YWdnaW5nIHNvY2tldCAlZCBmb3IgdWlkICVkIChNeSBVSUQ9JWQpIiwgc29ja2ZkLCB1aWQsIGdldGV1aWQoKSk7CisgICAgfQorfQorCisvLyBzdGF0aWMKK3ZvaWQgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQgc29ja2ZkKSB7CisgICAgaW50IHJlcyA9IHF0YWd1aWRfdW50YWdTb2NrZXQoc29ja2ZkKTsKKyAgICBpZiAocmVzICE9IDApIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB1bnRhZ2dpbmcgc29ja2V0ICVkIChNeSBVSUQ9JWQpIiwgc29ja2ZkLCBnZXRldWlkKCkpOworICAgIH0KK30KKworLy8gc3RhdGljCit2b2lkIE5ldHdvcmtVdGlsczo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQgc29ja2ZkLCB1aWRfdCB1aWQpIHsKKyAgICBzZXROZXR3b3JrRm9yVXNlcih1aWQsIHNvY2tmZCk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQgc29ja2ZkKSB7CisgICAgUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhzb2NrZmQsIGdldGV1aWQoKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjVlZTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuaApAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBORVRXT1JLX1VUSUxTX0hfCisjZGVmaW5lIE5FVFdPUktfVVRJTFNfSF8KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTmV0d29ya1V0aWxzIHsKKyAgICBzdGF0aWMgdm9pZCBSZWdpc3RlclNvY2tldFVzZXJUYWcoaW50IHNvY2tmZCwgdWlkX3QgdWlkLCB1aW50MzJfdCBrVGFnKTsKKyAgICBzdGF0aWMgdm9pZCBVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQgc29ja2ZkKTsKKworICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW50IHNvY2tmZCwgdWlkX3QgdWlkKTsKKyAgICBzdGF0aWMgdm9pZCBVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW50IHNvY2tmZCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE5FVFdPUktfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzRm9yQXBwUHJvYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlsc0ZvckFwcFByb2MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MjE1OWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlsc0ZvckFwcFByb2MuY3BwCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk5ldHdvcmtVdGlscyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIk5ldHdvcmtVdGlscy5oIgorCisvLyBOZXR3b3JrVXRpbHMgaW1wbGVtZW50YXRpb24gZm9yIGFwcGxpY2F0aW9uIHByb2Nlc3MuCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIHN0YXRpYwordm9pZCBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQsIHVpZF90LCB1aW50MzJfdCkgeworICAgIC8vIE5vIG9wLiBGcmFtZXdvcmsgYWxyZWFkeSBoYW5kbGVzIHRoZSBkYXRhIHVzYWdlIGJpbGxpbmcgZm9yIGFwcGxpY2F0aW9ucy4KK30KKworLy8gc3RhdGljCit2b2lkIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcoaW50KSB7CisgICAgLy8gTm8gb3AuCit9CisKKy8vIHN0YXRpYwordm9pZCBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW50LCB1aWRfdCkgeworICAgIC8vIE5vIG9wLiBGcmFtZXdvcmsgYWxyZWFkeSBoYW5kbGVzIHRoZSBkYXRhIHVzYWdlIGJpbGxpbmcgZm9yIGFwcGxpY2F0aW9ucy4KK30KKworLy8gc3RhdGljCit2b2lkIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCkgeworICAgIC8vIE5vIG9wLgorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwCmluZGV4IGQ0NTljYmQuLjY2NWQ1MWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAKQEAgLTI0LDcgKzI0LDcgQEAKIAogI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUENvbm5lY3Rpb24uaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2xlYXJNZWRpYUhUVFAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CkBAIC00MSw3ICs0MSw3IEBACiAgICAgICBtRmxhZ3MoZmxhZ3MpLAogICAgICAgbU5ldExvb3BlcihuZXcgQUxvb3BlciksCiAgICAgICBtQ2FuY2VsbGVkKGZhbHNlKSwKLSAgICAgIG1IVFRQRGF0YVNvdXJjZShuZXcgTWVkaWFIVFRQKGh0dHBTZXJ2aWNlLT5tYWtlSFRUUENvbm5lY3Rpb24oKSkpIHsKKyAgICAgIG1IVFRQRGF0YVNvdXJjZShuZXcgQ2xlYXJNZWRpYUhUVFAoaHR0cFNlcnZpY2UtPm1ha2VIVFRQQ29ubmVjdGlvbigpKSkgewogICAgIG1OZXRMb29wZXItPnNldE5hbWUoInNkcCBuZXQiKTsKICAgICBtTmV0TG9vcGVyLT5zdGFydChmYWxzZSAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogY2FuQ2FsbEphdmEgKi8sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLmJwCmluZGV4IGE1YWQ2YzYuLjY5MzU2NTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLmJwCkBAIC0xNCw5ICsxNCwzNiBAQAogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICBkaWFnOiB7Ci0gICAgICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIH0sCisgICAgfSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbImxpYm1lZGlhIl0sCit9CisKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0MiIsCisKKyAgICBzcmNzOiBbIlRleHREZXNjcmlwdGlvbnMyLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhcGxheWVyMi1wcm90b3MiLAorICAgICAgICAibGlicHJvdG9idWYtY3BwLWxpdGUiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1Xbm8tbXVsdGljaGFyIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAogICAgIH0sCiAKICAgICBpbmNsdWRlX2RpcnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zMi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGV4dERlc2NyaXB0aW9uczIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkNDJkM2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGV4dERlc2NyaXB0aW9uczIuY3BwCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIlRleHREZXNjcmlwdGlvbnMyLmgiCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1RleHREZXNjcmlwdGlvbnMyOjpUZXh0RGVzY3JpcHRpb25zMigpIHsKK30KKworc3RhdHVzX3QgVGV4dERlc2NyaXB0aW9uczI6OmdldFBsYXllck1lc3NhZ2VPZkRlc2NyaXB0aW9ucygKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc3NpemVfdCBzaXplLAorICAgICAgICB1aW50MzJfdCBmbGFncywgaW50IHRpbWVNcywgUGxheWVyTWVzc2FnZSAqcGxheWVyTXNnKSB7CisgICAgaWYgKGZsYWdzICYgSU5fQkFORF9URVhUXzNHUFApIHsKKyAgICAgICAgaWYgKGZsYWdzICYgR0xPQkFMX0RFU0NSSVBUSU9OUykgeworICAgICAgICAgICAgcmV0dXJuIGV4dHJhY3QzR1BQR2xvYmFsRGVzY3JpcHRpb25zKGRhdGEsIHNpemUsIHBsYXllck1zZyk7CisgICAgICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiBMT0NBTF9ERVNDUklQVElPTlMpIHsKKyAgICAgICAgICAgIHJldHVybiBleHRyYWN0M0dQUExvY2FsRGVzY3JpcHRpb25zKGRhdGEsIHNpemUsIHRpbWVNcywgcGxheWVyTXNnKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZmxhZ3MgJiBPVVRfT0ZfQkFORF9URVhUX1NSVCkgeworICAgICAgICBpZiAoZmxhZ3MgJiBMT0NBTF9ERVNDUklQVElPTlMpIHsKKyAgICAgICAgICAgIHJldHVybiBleHRyYWN0U1JUTG9jYWxEZXNjcmlwdGlvbnMoZGF0YSwgc2l6ZSwgdGltZU1zLCBwbGF5ZXJNc2cpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCisvLyBQYXJzZSB0aGUgU1JUIHRleHQgc2FtcGxlLCBhbmQgc3RvcmUgdGhlIHRpbWluZyBhbmQgdGV4dCBzYW1wbGUgaW4gYSBQbGF5ZXJNZXNzYWdlLgorLy8gVGhlIFBsYXllck1lc3NhZ2Ugd2lsbCBiZSBzZW50IHRvIE1lZGlhUGxheWVyMi5qYXZhIHRocm91Z2ggZXZlbnQsIGFuZCB3aWxsIGJlCisvLyBwYXJzZWQgaW4gVGltZWRUZXh0LmphdmEuCitzdGF0dXNfdCBUZXh0RGVzY3JpcHRpb25zMjo6ZXh0cmFjdFNSVExvY2FsRGVzY3JpcHRpb25zKAorICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzc2l6ZV90IHNpemUsIGludCB0aW1lTXMsIFBsYXllck1lc3NhZ2UgKnBsYXllck1zZykgeworICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoS0VZX0xPQ0FMX1NFVFRJTkcpOworICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoS0VZX1NUQVJUX1RJTUUpOworICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUodGltZU1zKTsKKworICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoS0VZX1NUUlVDVF9URVhUKTsKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2J5dGVzX3ZhbHVlKGRhdGEsIHNpemUpOworCisgICAgcmV0dXJuIE9LOworfQorCisvLyBFeHRyYWN0IHRoZSBsb2NhbCAzR1BQIGRpc3BsYXkgZGVzY3JpcHRpb25zLiAzR1BQIGxvY2FsIGRlc2NyaXB0aW9ucworLy8gYXJlIGFwcGVuZGVkIHRvIHRoZSB0ZXh0IHNhbXBsZSBpZiBhbnkuCitzdGF0dXNfdCBUZXh0RGVzY3JpcHRpb25zMjo6ZXh0cmFjdDNHUFBMb2NhbERlc2NyaXB0aW9ucygKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc3NpemVfdCBzaXplLAorICAgICAgICBpbnQgdGltZU1zLCBQbGF5ZXJNZXNzYWdlICpwbGF5ZXJNc2cpIHsKKworICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoS0VZX0xPQ0FMX1NFVFRJTkcpOworCisgICAgLy8gd3JpdGUgc3RhcnQgdGltZSB0byBkaXNwbGF5IHRoaXMgdGV4dCBzYW1wbGUKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKEtFWV9TVEFSVF9USU1FKTsKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKHRpbWVNcyk7CisKKyAgICBpZiAoc2l6ZSA8IDIpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICBzc2l6ZV90IHRleHRMZW4gPSAoKmRhdGEpIDw8IDggfCAoKihkYXRhICsgMSkpOworCisgICAgaWYgKHNpemUgPCB0ZXh0TGVuICsgMikgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgLy8gd3JpdGUgdGV4dCBzYW1wbGUgbGVuZ3RoIGFuZCB0ZXh0IHNhbXBsZSBpdHNlbGYKKyAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKEtFWV9TVFJVQ1RfVEVYVCk7CisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9ieXRlc192YWx1ZShkYXRhICsgMiwgdGV4dExlbik7CisKKyAgICBpZiAoc2l6ZSA+IHRleHRMZW4gKyAyKSB7CisgICAgICAgIGRhdGEgKz0gKHRleHRMZW4gKyAyKTsKKyAgICAgICAgc2l6ZSAtPSAodGV4dExlbiArIDIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICB3aGlsZSAoc2l6ZSA+PSA4KSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnRtcERhdGEgPSBkYXRhOworICAgICAgICBzc2l6ZV90IGNodW5rU2l6ZSA9IFUzMl9BVCh0bXBEYXRhKTsgICAgICAvLyBzaXplIGluY2x1ZGVzIHNpemUgYW5kIHR5cGUKKyAgICAgICAgdWludDMyX3QgY2h1bmtUeXBlID0gVTMyX0FUKHRtcERhdGEgKyA0KTsKKworICAgICAgICBpZiAoY2h1bmtTaXplIDw9IDggfHwgY2h1bmtTaXplID4gc2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IHJlbWFpbmluZyA9IGNodW5rU2l6ZSAtIDg7CisKKyAgICAgICAgdG1wRGF0YSArPSA4OworCisgICAgICAgIHN3aXRjaChjaHVua1R5cGUpIHsKKyAgICAgICAgICAgIC8vICd0Ym94JyBib3ggdG8gaW5kaWNhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSB0ZXh0IHdpdGggdmFsdWVzCisgICAgICAgICAgICAvLyBvZiB0b3AsIGxlZnQsIGJvdHRvbSBhbmQgcmlnaHQKKyAgICAgICAgICAgIGNhc2UgRk9VUkNDKCd0JywgJ2InLCAnbycsICd4Jyk6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA8IDgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKEtFWV9TVFJVQ1RfVEVYVF9QT1MpOworICAgICAgICAgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoVTE2X0FUKHRtcERhdGEpKTsKKyAgICAgICAgICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKFUxNl9BVCh0bXBEYXRhICsgMikpOworICAgICAgICAgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoVTE2X0FUKHRtcERhdGEgKyA0KSk7CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShVMTZfQVQodG1wRGF0YSArIDYpKTsKKworICAgICAgICAgICAgICAgIHRtcERhdGEgKz0gODsKKyAgICAgICAgICAgICAgICByZW1haW5pbmcgLT0gODsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBkYXRhICs9IGNodW5rU2l6ZTsKKyAgICAgICAgc2l6ZSAtPSBjaHVua1NpemU7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCisvLyBUbyBleHRyYWN0IGJveCAndHgzZycgZGVmaW5lZCBpbiAzR1BQIFRTIDI2LjI0NSwgYW5kIHN0b3JlIGl0IGluIGEgUGxheWVyTWVzc2FnZQorc3RhdHVzX3QgVGV4dERlc2NyaXB0aW9uczI6OmV4dHJhY3QzR1BQR2xvYmFsRGVzY3JpcHRpb25zKAorICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhLCBzc2l6ZV90IHNpemUsIFBsYXllck1lc3NhZ2UgKnBsYXllck1zZykgeworCisgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShLRVlfR0xPQkFMX1NFVFRJTkcpOworCisgICAgd2hpbGUgKHNpemUgPj0gOCkgeworICAgICAgICBzc2l6ZV90IGNodW5rU2l6ZSA9IFUzMl9BVChkYXRhKTsKKyAgICAgICAgdWludDMyX3QgY2h1bmtUeXBlID0gVTMyX0FUKGRhdGEgKyA0KTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqdG1wRGF0YSA9IGRhdGE7CisgICAgICAgIHRtcERhdGEgKz0gODsKKyAgICAgICAgc2l6ZV90IHJlbWFpbmluZyA9IHNpemUgLSA4OworCisgICAgICAgIGlmIChjaHVua1NpemUgPD0gOCB8fCBzaXplIDwgY2h1bmtTaXplKSB7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoKGNodW5rVHlwZSkgeworICAgICAgICAgICAgY2FzZSBGT1VSQ0MoJ3QnLCAneCcsICczJywgJ2cnKToKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nIDwgMTgpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBTa2lwIERJU1BMQVlfRkxBR1MsIFNUUlVDVF9KVVNUSUZJQ0FUSU9OLCBhbmQgQkFDS0dST1VORF9DT0xPUl9SR0JBCisgICAgICAgICAgICAgICAgdG1wRGF0YSArPSAxODsKKyAgICAgICAgICAgICAgICByZW1haW5pbmcgLT0gMTg7CisKKyAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nIDwgOCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoS0VZX1NUUlVDVF9URVhUX1BPUyk7CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShVMTZfQVQodG1wRGF0YSkpOworICAgICAgICAgICAgICAgIHBsYXllck1zZy0+YWRkX3ZhbHVlcygpLT5zZXRfaW50MzJfdmFsdWUoVTE2X0FUKHRtcERhdGEgKyAyKSk7CisgICAgICAgICAgICAgICAgcGxheWVyTXNnLT5hZGRfdmFsdWVzKCktPnNldF9pbnQzMl92YWx1ZShVMTZfQVQodG1wRGF0YSArIDQpKTsKKyAgICAgICAgICAgICAgICBwbGF5ZXJNc2ctPmFkZF92YWx1ZXMoKS0+c2V0X2ludDMyX3ZhbHVlKFUxNl9BVCh0bXBEYXRhICsgNikpOworCisgICAgICAgICAgICAgICAgdG1wRGF0YSArPSA4OworICAgICAgICAgICAgICAgIHJlbWFpbmluZyAtPSAxODsKKyAgICAgICAgICAgICAgICAvLyBJZ25vcmUgcmVtYWluaW5nIGRhdGEuCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZGF0YSArPSBjaHVua1NpemU7CisgICAgICAgIHNpemUgLT0gY2h1bmtTaXplOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zMi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2M3ZDJkMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zMi5oCkBAIC0wLDAgKzEsODggQEAKKyAvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBURVhUX0RFU0NSSVBUSU9OUzJfSF8KKworI2RlZmluZSBURVhUX0RFU0NSSVBUSU9OUzJfSF8KKworI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisKKyNpbmNsdWRlICJtZWRpYXBsYXllcjIucGIuaCIKKwordXNpbmcgYW5kcm9pZDo6bWVkaWE6Ok1lZGlhUGxheWVyMlByb3RvOjpQbGF5ZXJNZXNzYWdlOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFRleHREZXNjcmlwdGlvbnMyIHsKK3B1YmxpYzoKKyAgICBlbnVtIHsKKyAgICAgICAgSU5fQkFORF9URVhUXzNHUFAgICAgICAgICAgICAgPSAweDAxLAorICAgICAgICBPVVRfT0ZfQkFORF9URVhUX1NSVCAgICAgICAgICA9IDB4MDIsCisKKyAgICAgICAgR0xPQkFMX0RFU0NSSVBUSU9OUyAgICAgICAgICAgPSAweDEwMCwKKyAgICAgICAgTE9DQUxfREVTQ1JJUFRJT05TICAgICAgICAgICAgPSAweDIwMCwKKyAgICB9OworCisgICAgc3RhdGljIHN0YXR1c190IGdldFBsYXllck1lc3NhZ2VPZkRlc2NyaXB0aW9ucygKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLCBpbnQgdGltZU1zLCBQbGF5ZXJNZXNzYWdlICpwbGF5ZXJNc2cpOworcHJpdmF0ZToKKyAgICBUZXh0RGVzY3JpcHRpb25zMigpOworCisgICAgZW51bSB7CisgICAgICAgIC8vIFRoZXNlIGtleXMgbXVzdCBiZSBpbiBzeW5jIHdpdGggdGhlIGtleXMgaW4gVGltZWRUZXh0LmphdmEKKyAgICAgICAgS0VZX0RJU1BMQVlfRkxBR1MgICAgICAgICAgICAgICAgID0gMSwgLy8gaW50CisgICAgICAgIEtFWV9TVFlMRV9GTEFHUyAgICAgICAgICAgICAgICAgICA9IDIsIC8vIGludAorICAgICAgICBLRVlfQkFDS0dST1VORF9DT0xPUl9SR0JBICAgICAgICAgPSAzLCAvLyBpbnQKKyAgICAgICAgS0VZX0hJR0hMSUdIVF9DT0xPUl9SR0JBICAgICAgICAgID0gNCwgLy8gaW50CisgICAgICAgIEtFWV9TQ1JPTExfREVMQVkgICAgICAgICAgICAgICAgICA9IDUsIC8vIGludAorICAgICAgICBLRVlfV1JBUF9URVhUICAgICAgICAgICAgICAgICAgICAgPSA2LCAvLyBpbnQKKyAgICAgICAgS0VZX1NUQVJUX1RJTUUgICAgICAgICAgICAgICAgICAgID0gNywgLy8gaW50CisgICAgICAgIEtFWV9TVFJVQ1RfQkxJTktJTkdfVEVYVF9MSVNUICAgICA9IDgsIC8vIExpc3Q8Q2hhclBvcz4KKyAgICAgICAgS0VZX1NUUlVDVF9GT05UX0xJU1QgICAgICAgICAgICAgID0gOSwgLy8gTGlzdDxGb250PgorICAgICAgICBLRVlfU1RSVUNUX0hJR0hMSUdIVF9MSVNUICAgICAgICAgPSAxMCwgLy8gTGlzdDxDaGFyUG9zPgorICAgICAgICBLRVlfU1RSVUNUX0hZUEVSX1RFWFRfTElTVCAgICAgICAgPSAxMSwgLy8gTGlzdDxIeXBlclRleHQ+CisgICAgICAgIEtFWV9TVFJVQ1RfS0FSQU9LRV9MSVNUICAgICAgICAgICA9IDEyLCAvLyBMaXN0PEthcmFva2U+CisgICAgICAgIEtFWV9TVFJVQ1RfU1RZTEVfTElTVCAgICAgICAgICAgICA9IDEzLCAvLyBMaXN0PFN0eWxlPgorICAgICAgICBLRVlfU1RSVUNUX1RFWFRfUE9TICAgICAgICAgICAgICAgPSAxNCwgLy8gVGV4dFBvcworICAgICAgICBLRVlfU1RSVUNUX0pVU1RJRklDQVRJT04gICAgICAgICAgPSAxNSwgLy8gSnVzdGlmaWNhdGlvbgorICAgICAgICBLRVlfU1RSVUNUX1RFWFQgICAgICAgICAgICAgICAgICAgPSAxNiwgLy8gVGV4dAorCisgICAgICAgIEtFWV9HTE9CQUxfU0VUVElORyAgICAgICAgICAgICAgICA9IDEwMSwKKyAgICAgICAgS0VZX0xPQ0FMX1NFVFRJTkcgICAgICAgICAgICAgICAgID0gMTAyLAorICAgICAgICBLRVlfU1RBUlRfQ0hBUiAgICAgICAgICAgICAgICAgICAgPSAxMDMsCisgICAgICAgIEtFWV9FTkRfQ0hBUiAgICAgICAgICAgICAgICAgICAgICA9IDEwNCwKKyAgICAgICAgS0VZX0ZPTlRfSUQgICAgICAgICAgICAgICAgICAgICAgID0gMTA1LAorICAgICAgICBLRVlfRk9OVF9TSVpFICAgICAgICAgICAgICAgICAgICAgPSAxMDYsCisgICAgICAgIEtFWV9URVhUX0NPTE9SX1JHQkEgICAgICAgICAgICAgICA9IDEwNywKKyAgICB9OworCisgICAgc3RhdGljIHN0YXR1c190IGV4dHJhY3RTUlRMb2NhbERlc2NyaXB0aW9ucygKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIGludCB0aW1lTXMsIFBsYXllck1lc3NhZ2UgKnBsYXllck1zZyk7CisgICAgc3RhdGljIHN0YXR1c190IGV4dHJhY3QzR1BQR2xvYmFsRGVzY3JpcHRpb25zKAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZGF0YSwgc3NpemVfdCBzaXplLAorICAgICAgICAgICAgUGxheWVyTWVzc2FnZSAqcGxheWVyTXNnKTsKKyAgICBzdGF0aWMgc3RhdHVzX3QgZXh0cmFjdDNHUFBMb2NhbERlc2NyaXB0aW9ucygKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgIGludCB0aW1lTXMsIFBsYXllck1lc3NhZ2UgKnBsYXllck1zZyk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUZXh0RGVzY3JpcHRpb25zMik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorI2VuZGlmICAvLyBURVhUX0RFU0NSSVBUSU9OUzJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5icAppbmRleCBmOTY4Nzg4Li42NGVjYzJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLmJwCkBAIC0xNCw5ICsxNCw2IEBACiAgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgZGlhZzogewotICAgICAgICAgICAgY2ZpOiB0cnVlLAotICAgICAgICB9LAogICAgIH0sCiAKICAgICBzcmNzOiBbCkBAIC0zNCw0ICszMSw4IEBACiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIF0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuY3BwCmluZGV4IGE1MTIwYjkuLjRkNTA0ZTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuY3BwCkBAIC0zMDUsNiArMzA1LDcgQEAKIH0KIAogc3A8V2VibUVsZW1lbnQ+IFdlYm1FbGVtZW50OjpBdWRpb1RyYWNrRW50cnkoCisgICAgICAgIGNvbnN0IGNoYXIgKmNvZGVjLAogICAgICAgICBpbnQgY2hhbnMsCiAgICAgICAgIGRvdWJsZSByYXRlLAogICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmLApAQCAtMzIyLDcgKzMyMyw3IEBACiAgICAgICAgICAgICB1aWQsCiAgICAgICAgICAgICBsYWNpbmcsCiAgICAgICAgICAgICBsYW5nLAotICAgICAgICAgICAgIkFfVk9SQklTIiwKKyAgICAgICAgICAgIGNvZGVjLAogICAgICAgICAgICAga0F1ZGlvVHlwZSwKICAgICAgICAgICAgIHRyYWNrRW50cnlGaWVsZHMpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmgKaW5kZXggZmZiYmExYi4uYTk0YzIzZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuaApAQCAtNTAsNiArNTAsNyBAQAogICAgIHN0YXRpYyBzcDxXZWJtRWxlbWVudD4gU2VnbWVudEluZm8odWludDY0X3Qgc2NhbGUgPSAxMDAwMDAwLCBkb3VibGUgZHVyID0gMCk7CiAKICAgICBzdGF0aWMgc3A8V2VibUVsZW1lbnQ+IEF1ZGlvVHJhY2tFbnRyeSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvZGVjLAogICAgICAgICAgICAgaW50IGNoYW5zLAogICAgICAgICAgICAgZG91YmxlIHJhdGUsCiAgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWUuY3BwCmluZGV4IDRiMGQ0N2MuLjUyYzMwZWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZS5jcHAKQEAgLTYyLDYgKzYyLDE0IEBACiAgICAgICAgICAgICBtRGF0YSk7CiB9CiAKK3VpbnQ2NF90IFdlYm1GcmFtZTo6Z2V0QWJzVGltZWNvZGUoKSB7CisgICAgcmV0dXJuIG1BYnNUaW1lY29kZTsKK30KKwordm9pZCBXZWJtRnJhbWU6OnVwZGF0ZUFic1RpbWVjb2RlKHVpbnQ2NF90IG5ld0Fic1RpbWVjb2RlKSB7CisgICAgbUFic1RpbWVjb2RlID0gbmV3QWJzVGltZWNvZGU7Cit9CisKIGJvb2wgV2VibUZyYW1lOjpvcGVyYXRvcjwoY29uc3QgV2VibUZyYW1lICZvdGhlcikgY29uc3QgewogICAgIGlmICh0aGlzLT5tRW9zKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZS5oCmluZGV4IGE0MTBhODcuLjQ3ZjI1MjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWUuaApAQCAtMjUsNyArMjUsNyBAQAogcHVibGljOgogICAgIGNvbnN0IGludCBtVHlwZTsKICAgICBjb25zdCBib29sIG1LZXk7Ci0gICAgY29uc3QgdWludDY0X3QgbUFic1RpbWVjb2RlOworICAgIHVpbnQ2NF90IG1BYnNUaW1lY29kZTsKICAgICBjb25zdCBzcDxBQnVmZmVyPiBtRGF0YTsKICAgICBjb25zdCBib29sIG1Fb3M7CiAKQEAgLTMzLDYgKzMzLDggQEAKICAgICBXZWJtRnJhbWUoaW50IHR5cGUsIGJvb2wga2V5LCB1aW50NjRfdCBhYnNUaW1lY29kZSwgTWVkaWFCdWZmZXJCYXNlICpidWYpOwogICAgIH5XZWJtRnJhbWUoKSB7fQogCisgICAgdWludDY0X3QgZ2V0QWJzVGltZWNvZGUoKTsKKyAgICB2b2lkIHVwZGF0ZUFic1RpbWVjb2RlKHVpbnQ2NF90IG5ld0Fic1RpbWVjb2RlKTsKICAgICBzcDxXZWJtRWxlbWVudD4gU2ltcGxlQmxvY2sodWludDY0X3QgYmFzZVRpbWVjb2RlKSBjb25zdDsKIAogICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFdlYm1GcmFtZSAmb3RoZXIpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuY3BwCmluZGV4IDIzMjY5YWYuLjYzMWEyYWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lVGhyZWFkLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZVRocmVhZC5jcHAKQEAgLTc4LDYgKzc4LDcgQEAKICAgICAgIG1WaWRlb0ZyYW1lcyh2aWRlb1RocmVhZC0+bVNpbmspLAogICAgICAgbUF1ZGlvRnJhbWVzKGF1ZGlvVGhyZWFkLT5tU2luayksCiAgICAgICBtQ3VlcyhjdWVzKSwKKyAgICAgIG1TdGFydE9mZnNldFRpbWVjb2RlKFVJTlQ2NF9NQVgpLAogICAgICAgbURvbmUodHJ1ZSkgewogfQogCkBAIC05Miw2ICs5Myw3IEBACiAgICAgICBtVmlkZW9GcmFtZXModmlkZW9Tb3VyY2UpLAogICAgICAgbUF1ZGlvRnJhbWVzKGF1ZGlvU291cmNlKSwKICAgICAgIG1DdWVzKGN1ZXMpLAorICAgICAgbVN0YXJ0T2Zmc2V0VGltZWNvZGUoVUlOVDY0X01BWCksCiAgICAgICBtRG9uZSh0cnVlKSB7CiB9CiAKQEAgLTIxMyw2ICsyMTUsMTEgQEAKICAgICAgICAgY29uc3Qgc3A8V2VibUZyYW1lPiBhdWRpb0ZyYW1lID0gbUF1ZGlvRnJhbWVzLnBlZWsoKTsKICAgICAgICAgQUxPR1YoImEgZnJhbWU6ICVwIiwgYXVkaW9GcmFtZS5nZXQoKSk7CiAKKyAgICAgICAgaWYgKG1TdGFydE9mZnNldFRpbWVjb2RlID09IFVJTlQ2NF9NQVgpIHsKKyAgICAgICAgICAgIG1TdGFydE9mZnNldFRpbWVjb2RlID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjptaW4oYXVkaW9GcmFtZS0+Z2V0QWJzVGltZWNvZGUoKSwgdmlkZW9GcmFtZS0+Z2V0QWJzVGltZWNvZGUoKSk7CisgICAgICAgIH0KKwogICAgICAgICBpZiAodmlkZW9GcmFtZS0+bUVvcyAmJiBhdWRpb0ZyYW1lLT5tRW9zKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjIwLDEwICsyMjcsMTIgQEAKICAgICAgICAgaWYgKCphdWRpb0ZyYW1lIDwgKnZpZGVvRnJhbWUpIHsKICAgICAgICAgICAgIEFMT0dWKCJ0YWtlIGEgZnJhbWUiKTsKICAgICAgICAgICAgIG1BdWRpb0ZyYW1lcy50YWtlKCk7CisgICAgICAgICAgICBhdWRpb0ZyYW1lLT51cGRhdGVBYnNUaW1lY29kZShhdWRpb0ZyYW1lLT5nZXRBYnNUaW1lY29kZSgpIC0gbVN0YXJ0T2Zmc2V0VGltZWNvZGUpOwogICAgICAgICAgICAgb3V0c3RhbmRpbmdGcmFtZXMucHVzaF9iYWNrKGF1ZGlvRnJhbWUpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR1YoInRha2UgdiBmcmFtZSIpOwogICAgICAgICAgICAgbVZpZGVvRnJhbWVzLnRha2UoKTsKKyAgICAgICAgICAgIHZpZGVvRnJhbWUtPnVwZGF0ZUFic1RpbWVjb2RlKHZpZGVvRnJhbWUtPmdldEFic1RpbWVjb2RlKCkgLSBtU3RhcnRPZmZzZXRUaW1lY29kZSk7CiAgICAgICAgICAgICBvdXRzdGFuZGluZ0ZyYW1lcy5wdXNoX2JhY2sodmlkZW9GcmFtZSk7CiAgICAgICAgICAgICBpZiAodmlkZW9GcmFtZS0+bUtleSkKICAgICAgICAgICAgICAgICBudW1WaWRlb0tleUZyYW1lcysrOwpAQCAtMzUwLDcgKzM1OSw2IEBACiAgICAgICAgIGlmIChtU3RhcnRUaW1lVXMgPT0ga1VuaW5pdGlhbGl6ZWQpIHsKICAgICAgICAgICAgIG1TdGFydFRpbWVVcyA9IHRpbWVzdGFtcFVzOwogICAgICAgICB9Ci0gICAgICAgIHRpbWVzdGFtcFVzIC09IG1TdGFydFRpbWVVczsKIAogICAgICAgICBpZiAobVBhdXNlZCAmJiAhbVJlc3VtZWQpIHsKICAgICAgICAgICAgIGxhc3REdXJhdGlvblVzID0gdGltZXN0YW1wVXMgLSBsYXN0VGltZXN0YW1wVXM7CkBAIC0zNjQsMTQgKzM3MiwxNCBAQAogICAgICAgICAvLyBhZGp1c3QgdGltZS1zdGFtcHMgYWZ0ZXIgcGF1c2UvcmVzdW1lCiAgICAgICAgIGlmIChtUmVzdW1lZCkgewogICAgICAgICAgICAgaW50NjRfdCBkdXJFeGNsdWRpbmdFYXJsaWVyUGF1c2VzVXMgPSB0aW1lc3RhbXBVcyAtIHByZXZpb3VzUGF1c2VkRHVyYXRpb25VczsKLSAgICAgICAgICAgIENIRUNLX0dFKGR1ckV4Y2x1ZGluZ0VhcmxpZXJQYXVzZXNVcywgMGxsKTsKKyAgICAgICAgICAgIENIRUNLX0dFKGR1ckV4Y2x1ZGluZ0VhcmxpZXJQYXVzZXNVcywgMExMKTsKICAgICAgICAgICAgIGludDY0X3QgcGF1c2VkRHVyYXRpb25VcyA9IGR1ckV4Y2x1ZGluZ0VhcmxpZXJQYXVzZXNVcyAtIG1UcmFja0R1cmF0aW9uVXM7CiAgICAgICAgICAgICBDSEVDS19HRShwYXVzZWREdXJhdGlvblVzLCBsYXN0RHVyYXRpb25Vcyk7CiAgICAgICAgICAgICBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMgKz0gcGF1c2VkRHVyYXRpb25VcyAtIGxhc3REdXJhdGlvblVzOwogICAgICAgICAgICAgbVJlc3VtZWQgPSBmYWxzZTsKICAgICAgICAgfQogICAgICAgICB0aW1lc3RhbXBVcyAtPSBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXM7Ci0gICAgICAgIENIRUNLX0dFKHRpbWVzdGFtcFVzLCAwbGwpOworICAgICAgICBDSEVDS19HRSh0aW1lc3RhbXBVcywgMExMKTsKIAogICAgICAgICBpbnQzMl90IGlzU3luYyA9IGZhbHNlOwogICAgICAgICBtZC5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLCAmaXNTeW5jKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lVGhyZWFkLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZVRocmVhZC5oCmluZGV4IDc2YzkxZjEuLjFkZGFmOWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lVGhyZWFkLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuaApAQCAtODMsNiArODMsNyBAQAogICAgIExpbmtlZEJsb2NraW5nUXVldWU8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBtVmlkZW9GcmFtZXM7CiAgICAgTGlua2VkQmxvY2tpbmdRdWV1ZTxjb25zdCBzcDxXZWJtRnJhbWU+ID4mIG1BdWRpb0ZyYW1lczsKICAgICBMaXN0PHNwPFdlYm1FbGVtZW50PiA+JiBtQ3VlczsKKyAgICB1aW50NjRfdCBtU3RhcnRPZmZzZXRUaW1lY29kZTsKIAogICAgIHZvbGF0aWxlIGJvb2wgbURvbmU7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibVdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuY3BwCmluZGV4IDRkNzNlYjguLjVlYWFkYmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibVdyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmNwcApAQCAtMjMsNiArMjMsOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL09wdXNIZWFkZXIuaD4KIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogCkBAIC0xMTIsNDYgKzExNCwxMDcgQEAKIC8vIHN0YXRpYwogc3A8V2VibUVsZW1lbnQ+IFdlYm1Xcml0ZXI6OmF1ZGlvVHJhY2soY29uc3Qgc3A8TWV0YURhdGE+JiBtZCkgewogICAgIGludDMyX3QgbkNoYW5uZWxzLCBzYW1wbGVyYXRlOwotICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgY29uc3Qgdm9pZCAqaGVhZGVyRGF0YTE7Ci0gICAgY29uc3QgY2hhciBoZWFkZXJEYXRhMltdID0geyAzLCAndicsICdvJywgJ3InLCAnYicsICdpJywgJ3MnLCA3LCAwLCAwLCAwLAotICAgICAgICAgICAgJ2EnLCAnbicsICdkJywgJ3InLCAnbycsICdpJywgJ2QnLCAwLCAwLCAwLCAwLCAxIH07Ci0gICAgY29uc3Qgdm9pZCAqaGVhZGVyRGF0YTM7Ci0gICAgc2l6ZV90IGhlYWRlclNpemUxLCBoZWFkZXJTaXplMiA9IHNpemVvZihoZWFkZXJEYXRhMiksIGhlYWRlclNpemUzOworICAgIGNvbnN0IGNoYXIqIG1pbWVUeXBlOwogCiAgICAgaWYgKCFtZC0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZuQ2hhbm5lbHMpCi0gICAgICAgICAgICB8fCAhbWQtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZXJhdGUpCi0gICAgICAgICAgICB8fCAhbWQtPmZpbmREYXRhKGtLZXlWb3JiaXNJbmZvLCAmdHlwZSwgJmhlYWRlckRhdGExLCAmaGVhZGVyU2l6ZTEpCi0gICAgICAgICAgICB8fCAhbWQtPmZpbmREYXRhKGtLZXlWb3JiaXNCb29rcywgJnR5cGUsICZoZWFkZXJEYXRhMywgJmhlYWRlclNpemUzKSkgeworICAgICAgICB8fCAhbWQtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZXJhdGUpCisgICAgICAgIHx8ICFtZC0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZVR5cGUpKSB7CiAgICAgICAgIEFMT0dFKCJNaXNzaW5nIGZvcm1hdCBrZXlzIGZvciBhdWRpbyB0cmFjayIpOwogICAgICAgICBtZC0+ZHVtcFRvTG9nKCk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIHNpemVfdCBjb2RlY1ByaXZhdGVTaXplID0gMTsKLSAgICBjb2RlY1ByaXZhdGVTaXplICs9IFhpcGhMYWNlQ29kZUxlbihoZWFkZXJTaXplMSk7Ci0gICAgY29kZWNQcml2YXRlU2l6ZSArPSBYaXBoTGFjZUNvZGVMZW4oaGVhZGVyU2l6ZTIpOwotICAgIGNvZGVjUHJpdmF0ZVNpemUgKz0gaGVhZGVyU2l6ZTEgKyBoZWFkZXJTaXplMiArIGhlYWRlclNpemUzOworICAgIGludDMyX3QgYml0c1BlclNhbXBsZSA9IDA7CisgICAgaWYgKCFtZC0+ZmluZEludDMyKGtLZXlCaXRzUGVyU2FtcGxlLCAmYml0c1BlclNhbXBsZSkpIHsKKyAgICAgICAgQUxPR1YoImtLZXlCaXRzUGVyU2FtcGxlIG5vdCBhdmFpbGFibGUiKTsKKyAgICB9CiAKLSAgICBvZmZfdCBvZmYgPSAwOwotICAgIHNwPEFCdWZmZXI+IGNvZGVjUHJpdmF0ZUJ1ZiA9IG5ldyBBQnVmZmVyKGNvZGVjUHJpdmF0ZVNpemUpOwotICAgIHVpbnQ4X3QgKmNvZGVjUHJpdmF0ZURhdGEgPSBjb2RlY1ByaXZhdGVCdWYtPmRhdGEoKTsKLSAgICBjb2RlY1ByaXZhdGVEYXRhW29mZisrXSA9IDI7CisgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUywgc3RybGVuKE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpKSkgeworICAgICAgICAvLyBPcHVzIGluIFdlYk0gaXMgYSB3ZWxsLWtub3duLCB5ZXQgdW5kZXItZG9jdW1lbnRlZCwgZm9ybWF0LiBUaGUgY29kZWMgcHJpdmF0ZSBkYXRhCisgICAgICAgIC8vIG9mIHRoZSB0cmFjayBpcyBhbiBPcHVzIE9nZyBoZWFkZXIgKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3ODQ1I3NlY3Rpb24tNS4xKQorICAgICAgICAvLyBUaGUgbmFtZSBvZiB0aGUgdHJhY2sgaXNuJ3Qgc3RhbmRhcmRpemVkLCBpdHMgdmFsdWUgc2hvdWxkIGJlICJBX09QVVMiLgorICAgICAgICBPcHVzSGVhZGVyIGhlYWRlcjsKKyAgICAgICAgaGVhZGVyLmNoYW5uZWxzID0gbkNoYW5uZWxzOworICAgICAgICBoZWFkZXIubnVtX3N0cmVhbXMgPSBuQ2hhbm5lbHM7CisgICAgICAgIGhlYWRlci5udW1fY291cGxlZCA9IDA7CisgICAgICAgIC8vIC0gQ2hhbm5lbCBtYXBwaW5nIGZhbWlseSAoOCBiaXRzIHVuc2lnbmVkKQorICAgICAgICAvLyAgLS0gIDAgPSBvbmUgc3RyZWFtOiBtb25vIG9yIEwsUiBzdGVyZW8KKyAgICAgICAgLy8gIC0tICAxID0gY2hhbm5lbHMgaW4gdm9yYmlzIHNwZWMgb3JkZXI6IG1vbm8gb3IgTCxSIHN0ZXJlbyBvciAuLi4gb3IgRkwsQyxGUixSTCxSUixMRkUsIC4uLgorICAgICAgICAvLyAgLS0gIDIuLjI1NCA9IHJlc2VydmVkICh0cmVhdCBhcyAyNTUpCisgICAgICAgIC8vICAtLSAgMjU1ID0gbm8gZGVmaW5lZCBjaGFubmVsIG1lYW5pbmcKKyAgICAgICAgLy8KKyAgICAgICAgLy8gIG91ciBpbXBsZW1lbnRhdGlvbiBlbmNvZGVzOiAgMCwgMSwgb3IgMjU1CisgICAgICAgIGhlYWRlci5jaGFubmVsX21hcHBpbmcgPSAoKG5DaGFubmVscyA+IDgpID8gMjU1IDogKG5DaGFubmVscyA+IDIpKTsKKyAgICAgICAgaGVhZGVyLmdhaW5fZGIgPSAwOworICAgICAgICBoZWFkZXIuc2tpcF9zYW1wbGVzID0gMDsKIAotICAgIG9mZiArPSBYaXBoTGFjZUVuYyhjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJTaXplMSk7Ci0gICAgb2ZmICs9IFhpcGhMYWNlRW5jKGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlclNpemUyKTsKKyAgICAgICAgLy8gaGVhZGVycyBhcmUgMjEtYnl0ZXMgKyBzb21ldGhpbmcgZHJpdmVuIGJ5IGNoYW5uZWwgY291bnQKKyAgICAgICAgLy8gZXhwZWN0IG51bWJlcnMgaW4gdGhlIGxvdyAzMCdzIGhlcmUuIFdyaXRlT3B1c0hlYWRlcigpIHdpbGwgdGVsbCB1cworICAgICAgICAvLyBpZiB0aGluZ3MgYXJlIGJhZC4KKyAgICAgICAgdW5zaWduZWQgY2hhciBoZWFkZXJfZGF0YVsxMDBdOworICAgICAgICBpbnQgaGVhZGVyU2l6ZSA9IFdyaXRlT3B1c0hlYWRlcihoZWFkZXIsIHNhbXBsZXJhdGUsICh1aW50OF90KiloZWFkZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhlYWRlcl9kYXRhKSk7CiAKLSAgICBtZW1jcHkoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyRGF0YTEsIGhlYWRlclNpemUxKTsKLSAgICBvZmYgKz0gaGVhZGVyU2l6ZTE7Ci0gICAgbWVtY3B5KGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlckRhdGEyLCBoZWFkZXJTaXplMik7Ci0gICAgb2ZmICs9IGhlYWRlclNpemUyOwotICAgIG1lbWNweShjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJEYXRhMywgaGVhZGVyU2l6ZTMpOworICAgICAgICBpZiAoaGVhZGVyU2l6ZSA8IDApIHsKKyAgICAgICAgICAgIC8vIGRpZG4ndCBmaWxsIG91dCB0aGF0IGhlYWRlciBmb3Igc29tZSByZWFzb24KKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZ2VuZXJhdGUgT1BVUyBoZWFkZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CiAKLSAgICBzcDxXZWJtRWxlbWVudD4gZW50cnkgPSBXZWJtRWxlbWVudDo6QXVkaW9UcmFja0VudHJ5KAotICAgICAgICAgICAgbkNoYW5uZWxzLAotICAgICAgICAgICAgc2FtcGxlcmF0ZSwKLSAgICAgICAgICAgIGNvZGVjUHJpdmF0ZUJ1Zik7Ci0gICAgcmV0dXJuIGVudHJ5OworICAgICAgICBzaXplX3QgY29kZWNQcml2YXRlU2l6ZSA9IDA7CisgICAgICAgIGNvZGVjUHJpdmF0ZVNpemUgKz0gaGVhZGVyU2l6ZTsKKworICAgICAgICBvZmZfdCBvZmYgPSAwOworICAgICAgICBzcDxBQnVmZmVyPiBjb2RlY1ByaXZhdGVCdWYgPSBuZXcgQUJ1ZmZlcihjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgdWludDhfdCogY29kZWNQcml2YXRlRGF0YSA9IGNvZGVjUHJpdmF0ZUJ1Zi0+ZGF0YSgpOworCisgICAgICAgIG1lbWNweShjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCAodWludDhfdCopaGVhZGVyX2RhdGEsIGhlYWRlclNpemUpOworICAgICAgICBzcDxXZWJtRWxlbWVudD4gZW50cnkgPSBXZWJtRWxlbWVudDo6QXVkaW9UcmFja0VudHJ5KCJBX09QVVMiLCBuQ2hhbm5lbHMsIHNhbXBsZXJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNQcml2YXRlQnVmLCBiaXRzUGVyU2FtcGxlKTsKKyAgICAgICAgcmV0dXJuIGVudHJ5OworICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKSkpIHsKKyAgICAgICAgdWludDMyX3QgdHlwZTsKKyAgICAgICAgY29uc3Qgdm9pZCAqaGVhZGVyRGF0YTE7CisgICAgICAgIGNvbnN0IGNoYXIgaGVhZGVyRGF0YTJbXSA9IHsgMywgJ3YnLCAnbycsICdyJywgJ2InLCAnaScsICdzJywgNywgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAnYScsICduJywgJ2QnLCAncicsICdvJywgJ2knLCAnZCcsIDAsIDAsIDAsIDAsIDEgfTsKKyAgICAgICAgY29uc3Qgdm9pZCAqaGVhZGVyRGF0YTM7CisgICAgICAgIHNpemVfdCBoZWFkZXJTaXplMSwgaGVhZGVyU2l6ZTIgPSBzaXplb2YoaGVhZGVyRGF0YTIpLCBoZWFkZXJTaXplMzsKKworICAgICAgICBpZiAoIW1kLT5maW5kRGF0YShrS2V5T3BhcXVlQ1NEMCwgJnR5cGUsICZoZWFkZXJEYXRhMSwgJmhlYWRlclNpemUxKQorICAgICAgICAgICAgfHwgIW1kLT5maW5kRGF0YShrS2V5T3BhcXVlQ1NEMSwgJnR5cGUsICZoZWFkZXJEYXRhMywgJmhlYWRlclNpemUzKSkgeworICAgICAgICAgICAgQUxPR0UoIk1pc3NpbmcgaGVhZGVyIGZvcm1hdCBrZXlzIGZvciB2b3JiaXMgdHJhY2siKTsKKyAgICAgICAgICAgIG1kLT5kdW1wVG9Mb2coKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IGNvZGVjUHJpdmF0ZVNpemUgPSAxOworICAgICAgICBjb2RlY1ByaXZhdGVTaXplICs9IFhpcGhMYWNlQ29kZUxlbihoZWFkZXJTaXplMSk7CisgICAgICAgIGNvZGVjUHJpdmF0ZVNpemUgKz0gWGlwaExhY2VDb2RlTGVuKGhlYWRlclNpemUyKTsKKyAgICAgICAgY29kZWNQcml2YXRlU2l6ZSArPSBoZWFkZXJTaXplMSArIGhlYWRlclNpemUyICsgaGVhZGVyU2l6ZTM7CisKKyAgICAgICAgb2ZmX3Qgb2ZmID0gMDsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gY29kZWNQcml2YXRlQnVmID0gbmV3IEFCdWZmZXIoY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgIHVpbnQ4X3QgKmNvZGVjUHJpdmF0ZURhdGEgPSBjb2RlY1ByaXZhdGVCdWYtPmRhdGEoKTsKKyAgICAgICAgY29kZWNQcml2YXRlRGF0YVtvZmYrK10gPSAyOworCisgICAgICAgIG9mZiArPSBYaXBoTGFjZUVuYyhjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJTaXplMSk7CisgICAgICAgIG9mZiArPSBYaXBoTGFjZUVuYyhjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJTaXplMik7CisKKyAgICAgICAgbWVtY3B5KGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlckRhdGExLCBoZWFkZXJTaXplMSk7CisgICAgICAgIG9mZiArPSBoZWFkZXJTaXplMTsKKyAgICAgICAgbWVtY3B5KGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlckRhdGEyLCBoZWFkZXJTaXplMik7CisgICAgICAgIG9mZiArPSBoZWFkZXJTaXplMjsKKyAgICAgICAgbWVtY3B5KGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlckRhdGEzLCBoZWFkZXJTaXplMyk7CisKKyAgICAgICAgc3A8V2VibUVsZW1lbnQ+IGVudHJ5ID0gV2VibUVsZW1lbnQ6OkF1ZGlvVHJhY2tFbnRyeSgiQV9WT1JCSVMiLCBuQ2hhbm5lbHMsIHNhbXBsZXJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNQcml2YXRlQnVmLCBiaXRzUGVyU2FtcGxlKTsKKyAgICAgICAgcmV0dXJuIGVudHJ5OworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJUcmFjayAoJXMpIGlzIG5vdCBhIHN1cHBvcnRlZCBhdWRpbyBmb3JtYXQiLCBtaW1lVHlwZSk7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KIH0KIAogc2l6ZV90IFdlYm1Xcml0ZXI6Om51bVRyYWNrcygpIHsKQEAgLTM4MiwxNiArNDQ1LDE4IEBACiAgICAgY29uc3QgY2hhciAqdnA4ID0gTUVESUFfTUlNRVRZUEVfVklERU9fVlA4OwogICAgIGNvbnN0IGNoYXIgKnZwOSA9IE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOTsKICAgICBjb25zdCBjaGFyICp2b3JiaXMgPSBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVM7CisgICAgY29uc3QgY2hhciogb3B1cyA9IE1FRElBX01JTUVUWVBFX0FVRElPX09QVVM7CiAKICAgICBzaXplX3Qgc3RyZWFtSW5kZXg7CiAgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCB2cDgsIHN0cmxlbih2cDgpKSB8fAogICAgICAgICAhc3RybmNhc2VjbXAobWltZSwgdnA5LCBzdHJsZW4odnA5KSkpIHsKICAgICAgICAgc3RyZWFtSW5kZXggPSBrVmlkZW9JbmRleDsKLSAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCB2b3JiaXMsIHN0cmxlbih2b3JiaXMpKSkgeworICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKG1pbWUsIHZvcmJpcywgc3RybGVuKHZvcmJpcykpIHx8CisgICAgICAgICAgICAgICAhc3RybmNhc2VjbXAobWltZSwgb3B1cywgc3RybGVuKG9wdXMpKSkgewogICAgICAgICBzdHJlYW1JbmRleCA9IGtBdWRpb0luZGV4OwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJUcmFjayAoJXMpIG90aGVyIHRoYW4gJXMsICVzIG9yICVzIGlzIG5vdCBzdXBwb3J0ZWQiLAotICAgICAgICAgICAgICBtaW1lLCB2cDgsIHZwOSwgdm9yYmlzKTsKKyAgICAgICAgQUxPR0UoIlRyYWNrICglcykgb3RoZXIgdGhhbiAlcywgJXMsICVzLCBvciAlcyBpcyBub3Qgc3VwcG9ydGVkIiwKKyAgICAgICAgICAgICAgbWltZSwgdnA4LCB2cDksIHZvcmJpcywgb3B1cyk7CiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAKaW5kZXggYTRmYTM0Mi4uMzhkZTgzMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL0FuZHJvaWQuYnAKQEAgLTEsMyArMSw5IEBACitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXJfaGVhZGVycyIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXIiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCkBAIC0xNCw2ICsyMCw3IEBACiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmV4cGF0IiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXhfdXRpbHMiLApAQCAtMzIsMTAgKzM5LDEzIEBACiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIGRpYWc6IHsKLSAgICAgICAgICAgIGNmaTogdHJ1ZSwKLSAgICAgICAgfSwKICAgICB9LAogCiB9CiAKK3hzZF9jb25maWcgeworICAgIG5hbWU6ICJtZWRpYV9jb2RlY3MiLAorICAgIHNyY3M6IFsibWVkaWFfY29kZWNzLnhzZCJdLAorICAgIHBhY2thZ2VfbmFtZTogIm1lZGlhLmNvZGVjcyIsCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwCmluZGV4IGQ5OGUxMjMuLjk3ODNlOWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmNwcApAQCAtMTksMTkgKzE5LDM0IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxleHBhdC5oPgogCi0jaW5jbHVkZSA8Y2N0eXBlPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KKworI2luY2x1ZGUgPGV4cGF0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNjdHlwZT4KKyNpbmNsdWRlIDxzdHJpbmc+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgTUNYUCA9IE1lZGlhQ29kZWNzWG1sUGFyc2VyOworCiBuYW1lc3BhY2UgewogCitib29sIGZpbGVFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcgJnBhdGgpIHsKKyAgICBzdHJ1Y3Qgc3RhdCBmaWxlU3RhdDsKKyAgICByZXR1cm4gc3RhdChwYXRoLmNfc3RyKCksICZmaWxlU3RhdCkgPT0gMCAmJiBTX0lTUkVHKGZpbGVTdGF0LnN0X21vZGUpOworfQorCiAvKioKICAqIFNlYXJjaCBmb3IgYSBmaWxlIGluIGEgbGlzdCBvZiBzZWFyY2ggZGlyZWN0b3JpZXMuCiAgKgpAQCAtNDIsNyArNTcsNyBAQAogICogc2VhcmNoIGNvbnRpbnVlcyB1bnRpbCB0aGUgYG51bGxwdHJgIGVsZW1lbnQgaW4gYHNlYXJjaERpcnNgIGlzIHJlYWNoZWQsIGF0CiAgKiB3aGljaCBwb2ludCB0aGUgZnVuY3Rpb24gcmV0dXJucyBgZmFsc2VgLgogICoKLSAqIFxwYXJhbVtpbl0gc2VhcmNoRGlycyBOdWxsLXRlcm1pbmF0ZWQgYXJyYXkgb2Ygc2VhcmNoIHBhdGhzLgorICogXHBhcmFtW2luXSBzZWFyY2hEaXJzIGFycmF5IG9mIHNlYXJjaCBwYXRocy4KICAqIFxwYXJhbVtpbl0gZmlsZU5hbWUgTmFtZSBvZiB0aGUgZmlsZSB0byBzZWFyY2guCiAgKiBccGFyYW1bb3V0XSBvdXRQYXRoIEZ1bGwgcGF0aCBvZiB0aGUgZmlsZS4gYG91dFBhdGhgIHdpbGwgaG9sZCBhIHZhbGlkIGZpbGUKICAqIG5hbWUgaWYgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIGB0cnVlYC4KQEAgLTUwLDE0ICs2NSwxMyBAQAogICogdmFsaWQgZmlsZSBuYW1lOyBgZmFsc2VgIG90aGVyd2lzZS4KICAqLwogYm9vbCBmaW5kRmlsZUluRGlycygKLSAgICAgICAgY29uc3QgY2hhciogY29uc3QqIHNlYXJjaERpcnMsCi0gICAgICAgIGNvbnN0IGNoYXIgKmZpbGVOYW1lLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJnNlYXJjaERpcnMsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlTmFtZSwKICAgICAgICAgc3RkOjpzdHJpbmcgKm91dFBhdGgpIHsKLSAgICBmb3IgKDsgKnNlYXJjaERpcnMgIT0gbnVsbHB0cjsgKytzZWFyY2hEaXJzKSB7Ci0gICAgICAgICpvdXRQYXRoID0gc3RkOjpzdHJpbmcoKnNlYXJjaERpcnMpICsgIi8iICsgZmlsZU5hbWU7Ci0gICAgICAgIHN0cnVjdCBzdGF0IGZpbGVTdGF0OwotICAgICAgICBpZiAoc3RhdChvdXRQYXRoLT5jX3N0cigpLCAmZmlsZVN0YXQpID09IDAgJiYKLSAgICAgICAgICAgICAgICBTX0lTUkVHKGZpbGVTdGF0LnN0X21vZGUpKSB7CisgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyAmc2VhcmNoRGlyIDogc2VhcmNoRGlycykgeworICAgICAgICBzdGQ6OnN0cmluZyBwYXRoID0gc2VhcmNoRGlyICsgIi8iICsgZmlsZU5hbWU7CisgICAgICAgIGlmIChmaWxlRXhpc3RzKHBhdGgpKSB7CisgICAgICAgICAgICAqb3V0UGF0aCA9IHBhdGg7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KQEAgLTgzLDEyMyArOTcsNDM1IEBACiBib29sIHBhcnNlQm9vbGVhbihjb25zdCBjaGFyKiBzKSB7CiAgICAgcmV0dXJuIHN0cmlFcShzLCAieSIpIHx8CiAgICAgICAgICAgICBzdHJpRXEocywgInllcyIpIHx8CisgICAgICAgICAgICBzdHJpRXEocywgImVuYWJsZWQiKSB8fAogICAgICAgICAgICAgc3RyaUVxKHMsICJ0IikgfHwKICAgICAgICAgICAgIHN0cmlFcShzLCAidHJ1ZSIpIHx8CiAgICAgICAgICAgICBzdHJpRXEocywgIjEiKTsKIH0KIAotc3RhdHVzX3QgbGltaXRGb3VuZE1pc3NpbmdBdHRyKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIgKmF0dHIsIGJvb2wgZm91bmQgPSB0cnVlKSB7Ci0gICAgQUxPR0UoImxpbWl0ICclcycgd2l0aCAlcyclcycgYXR0cmlidXRlIiwgbmFtZSwKLSAgICAgICAgICAgIChmb3VuZCA/ICIiIDogIm5vICIpLCBhdHRyKTsKLSAgICByZXR1cm4gQkFEX1ZBTFVFOworCitzdGF0dXNfdCBjb21iaW5lU3RhdHVzKHN0YXR1c190IGEsIHN0YXR1c190IGIpIHsKKyAgICBpZiAoYSA9PSBOT19JTklUKSB7CisgICAgICAgIHJldHVybiBiOworICAgIH0gZWxzZSBpZiAoKGEgPT0gT0sgJiYgKGIgPT0gTkFNRV9OT1RfRk9VTkQgfHwgYiA9PSBBTFJFQURZX0VYSVNUUyB8fCBiID09IE5PX0lOSVQpKQorICAgICAgICAgICAgfHwgKGIgPT0gT0sgJiYgKGEgPT0gTkFNRV9OT1RfRk9VTkQgfHwgYSA9PSBBTFJFQURZX0VYSVNUUykpKSB7CisgICAgICAgIC8vIGlnbm9yZSBOQU1FX05PVF9GT1VORCBhbmQgQUxSRUFEWV9FWElTVCBlcnJvcnMgYXMgbG9uZyBhcyB0aGUgb3RoZXIgZXJyb3IgaXMgT0sKKyAgICAgICAgLy8gYWxzbyBoYW5kbGUgT0sgKyBOT19JTklUIGhlcmUKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHByZWZlciB0aGUgZmlyc3QgZXJyb3IgcmVzdWx0CisgICAgICAgIHJldHVybiBhID8gOiBiOworICAgIH0KIH0KIAotc3RhdHVzX3QgbGltaXRFcnJvcihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyICptc2cpIHsKLSAgICBBTE9HRSgibGltaXQgJyVzJyAlcyIsIG5hbWUsIG1zZyk7Ci0gICAgcmV0dXJuIEJBRF9WQUxVRTsKK01DWFA6OlN0cmluZ1NldCBwYXJzZUNvbW1hU2VwYXJhdGVkU3RyaW5nU2V0KGNvbnN0IGNoYXIgKnMpIHsKKyAgICBNQ1hQOjpTdHJpbmdTZXQgcmVzdWx0OworICAgIGZvciAoY29uc3QgY2hhciAqcHRyID0gcyA/IDogIiI7ICpwdHI7ICkgeworICAgICAgICBjb25zdCBjaGFyICplbmQgPSBzdHJjaHJudWwocHRyLCAnLCcpOworICAgICAgICBpZiAocHRyICE9IGVuZCkgeyAvLyBza2lwIGVtcHR5IHZhbHVlcworICAgICAgICAgICAgcmVzdWx0LmVtcGxhY2UocHRyLCBlbmQgLSBwdHIpOworICAgICAgICB9CisgICAgICAgIHB0ciA9IGVuZCArICgnXDAnICE9ICplbmQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0dXNfdCBsaW1pdEludmFsaWRBdHRyKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIGF0dHIsIGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gICAgQUxPR0UoImxpbWl0ICclcycgd2l0aCBpbnZhbGlkICclcycgYXR0cmlidXRlICglcykiLCBuYW1lLAotICAgICAgICAgICAgYXR0ciwgdmFsdWUpOwotICAgIHJldHVybiBCQURfVkFMVUU7Ci19CisjZGVmaW5lIFBMT0dEKG1zZywgLi4uKSBcCisgICAgICAgIEFMT0dEKG1zZyAiIGF0IGxpbmUgJXp1IG9mICVzIiwgIyNfX1ZBX0FSR1NfXywgXAorICAgICAgICAgICAgICAgIChzaXplX3QpOjpYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIobVBhcnNlci5nZXQoKSksIG1QYXRoLmNfc3RyKCkpOwogCi19OyAvLyB1bm5hbWVkIG5hbWVzcGFjZQorfSAgLy8gdW5uYW1lZCBuYW1lc3BhY2UKIAotY29uc3RleHByIGNoYXIgY29uc3QqIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpkZWZhdWx0U2VhcmNoRGlyc1tdOwotY29uc3RleHByIGNoYXIgY29uc3QqIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpkZWZhdWx0TWFpblhtbE5hbWU7Ci1jb25zdGV4cHIgY2hhciBjb25zdCogTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRQZXJmb3JtYW5jZVhtbE5hbWU7CitzdHJ1Y3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGwgeworICAgIC8vIHN0YXR1cyArIGVycm9yIG1lc3NhZ2UKKyAgICBzdHJ1Y3QgUmVzdWx0IHsKKyAgICBwcml2YXRlOgorICAgICAgICBzdGF0dXNfdCBtU3RhdHVzOworICAgICAgICBzdGQ6OnN0cmluZyBtRXJyb3I7CisKKyAgICBwdWJsaWM6CisgICAgICAgIFJlc3VsdChzdGF0dXNfdCBzLCBzdGQ6OnN0cmluZyBlcnJvciA9ICIiKQorICAgICAgICAgICAgOiBtU3RhdHVzKHMpLAorICAgICAgICAgICAgICBtRXJyb3IoZXJyb3IpIHsKKyAgICAgICAgICAgIGlmIChlcnJvci5lbXB0eSgpICYmIHMpIHsKKyAgICAgICAgICAgICAgICBtRXJyb3IgPSAiRmFpbGVkICgiICsgc3RkOjpzdHJpbmcoYXNTdHJpbmcocykpICsgIikiOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG9wZXJhdG9yIHN0YXR1c190KCkgY29uc3QgeyByZXR1cm4gbVN0YXR1czsgfQorICAgICAgICBzdGQ6OnN0cmluZyBlcnJvcigpIGNvbnN0IHsgcmV0dXJuIG1FcnJvcjsgfQorICAgIH07CisKKworICAgIC8vIFBhcnNlZCBkYXRhCisgICAgc3RydWN0IERhdGEgeworICAgICAgICAvLyBTZXJ2aWNlIGF0dHJpYnV0ZXMKKyAgICAgICAgQXR0cmlidXRlTWFwIG1TZXJ2aWNlQXR0cmlidXRlTWFwOworICAgICAgICBDb2RlY01hcCBtQ29kZWNNYXA7CisgICAgICAgIFJlc3VsdCBhZGRHbG9iYWwoc3RkOjpzdHJpbmcga2V5LCBzdGQ6OnN0cmluZyB2YWx1ZSwgYm9vbCB1cGRhdGluZyk7CisgICAgfTsKKworICAgIGVudW0gU2VjdGlvbiB7CisgICAgICAgIFNFQ1RJT05fVE9QTEVWRUwsCisgICAgICAgIFNFQ1RJT05fU0VUVElOR1MsCisgICAgICAgIFNFQ1RJT05fREVDT0RFUlMsCisgICAgICAgIFNFQ1RJT05fREVDT0RFUiwKKyAgICAgICAgU0VDVElPTl9ERUNPREVSX1RZUEUsCisgICAgICAgIFNFQ1RJT05fRU5DT0RFUlMsCisgICAgICAgIFNFQ1RJT05fRU5DT0RFUiwKKyAgICAgICAgU0VDVElPTl9FTkNPREVSX1RZUEUsCisgICAgICAgIFNFQ1RJT05fSU5DTFVERSwKKyAgICAgICAgU0VDVElPTl9WQVJJQU5ULAorICAgICAgICBTRUNUSU9OX1VOS05PV04sCisgICAgfTsKKworICAgIC8vIFhNTCBwYXJzaW5nIHN0YXRlCisgICAgc3RydWN0IFN0YXRlIHsKKyAgICBwcml2YXRlOgorICAgICAgICBEYXRhICptRGF0YTsKKworICAgICAgICAvLyBjdXJyZW50IGNvZGVjIGFuZC9vciB0eXBlLCBwbHVzIHdoZXRoZXIgd2UgYXJlIHVwZGF0aW5nCisgICAgICAgIHN0cnVjdCBDb2RlY0FuZFR5cGUgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgbU5hbWU7CisgICAgICAgICAgICBDb2RlY01hcDo6aXRlcmF0b3IgbUNvZGVjOworICAgICAgICAgICAgVHlwZU1hcDo6aXRlcmF0b3IgbVR5cGU7CisgICAgICAgICAgICBib29sIG1VcGRhdGluZzsKKyAgICAgICAgfTsKKworICAgICAgICAvLyB1c2luZyB2ZWN0b3JzIGFzIHdlIG5lZWQgdG8gcmVzZXQgdGhlaXIgc2l6ZXMKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1JbmNsdWRlU3RhY2s7CisgICAgICAgIHN0ZDo6dmVjdG9yPFNlY3Rpb24+IG1TZWN0aW9uU3RhY2s7CisgICAgICAgIHN0ZDo6dmVjdG9yPFN0cmluZ1NldD4gbVZhcmlhbnRzU3RhY2s7CisgICAgICAgIHN0ZDo6dmVjdG9yPENvZGVjQW5kVHlwZT4gbUN1cnJlbnQ7CisKKyAgICBwdWJsaWM6CisgICAgICAgIFN0YXRlKERhdGEgKmRhdGEpOworCisgICAgICAgIERhdGEgJmRhdGEoKSB7IHJldHVybiAqbURhdGE7IH0KKworICAgICAgICAvLyB1c2VkIHRvIHJlc3RvcmUgcGFyc2luZyBzdGF0ZSBhdCBYTUwgaW5jbHVkZSBib3VuZGFyaWVzLCBpbiBjYXNlIHBhcnNpbmcgdGhlIGluY2x1ZGVkCisgICAgICAgIC8vIGZpbGUgZmFpbHMuCisgICAgICAgIHN0cnVjdCBSZXN0b3JlUG9pbnQgeworICAgICAgICAgICAgc2l6ZV90IG51bUluY2x1ZGVzOworICAgICAgICAgICAgc2l6ZV90IG51bVNlY3Rpb25zOworICAgICAgICAgICAgc2l6ZV90IG51bVZhcmlhbnRTZXRzOworICAgICAgICAgICAgc2l6ZV90IG51bUNvZGVjQW5kVHlwZXM7CisgICAgICAgIH07CisKKyAgICAgICAgLy8gbWV0aG9kIG1hbmlwdWxhdGluZyByZXN0b3JlIHBvaW50cyAoYWxsIHN0YXRlIHN0YWNrcykKKyAgICAgICAgUmVzdG9yZVBvaW50IGNyZWF0ZVJlc3RvcmVQb2ludCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAgICAgbUluY2x1ZGVTdGFjay5zaXplKCksIG1TZWN0aW9uU3RhY2suc2l6ZSgpLCBtVmFyaWFudHNTdGFjay5zaXplKCksIG1DdXJyZW50LnNpemUoKQorICAgICAgICAgICAgfTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgcmVzdG9yZShSZXN0b3JlUG9pbnQgcnApIHsKKyAgICAgICAgICAgIENIRUNLX0dFKG1JbmNsdWRlU3RhY2suc2l6ZSgpLCBycC5udW1JbmNsdWRlcyk7CisgICAgICAgICAgICBDSEVDS19HRShtU2VjdGlvblN0YWNrLnNpemUoKSwgcnAubnVtU2VjdGlvbnMpOworICAgICAgICAgICAgQ0hFQ0tfR0UobVZhcmlhbnRzU3RhY2suc2l6ZSgpLCBycC5udW1WYXJpYW50U2V0cyk7CisgICAgICAgICAgICBDSEVDS19HRShtQ3VycmVudC5zaXplKCksIHJwLm51bUNvZGVjQW5kVHlwZXMpOworCisgICAgICAgICAgICBtSW5jbHVkZVN0YWNrLnJlc2l6ZShycC5udW1JbmNsdWRlcyk7CisgICAgICAgICAgICBtU2VjdGlvblN0YWNrLnJlc2l6ZShycC5udW1TZWN0aW9ucyk7CisgICAgICAgICAgICBtVmFyaWFudHNTdGFjay5yZXNpemUocnAubnVtVmFyaWFudFNldHMpOworICAgICAgICAgICAgbUN1cnJlbnQucmVzaXplKHJwLm51bUNvZGVjQW5kVHlwZXMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbWV0aG9kcyBtYW5pcHVsYXRpbmcgdGhlIGluY2x1ZGUgc3RhY2sKKyAgICAgICAgUmVzdWx0IGVudGVySW5jbHVkZShjb25zdCBzdGQ6OnN0cmluZyAmcGF0aCk7CisgICAgICAgIHZvaWQgZXhpdEluY2x1ZGUoKSB7CisgICAgICAgICAgICBtSW5jbHVkZVN0YWNrLnBvcF9iYWNrKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBtZXRob2RzIG1hbmlwdWxhdGluZyB0aGUgY29kZWMvdHlwZSBzdGFjay9zdGF0ZQorICAgICAgICBib29sIGluQ29kZWMoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gIW1DdXJyZW50LmVtcHR5KCkgJiYgbUN1cnJlbnQuYmFjaygpLm1Db2RlYyAhPSBtRGF0YS0+bUNvZGVjTWFwLmVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgYm9vbCBpblR5cGUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gaW5Db2RlYygpCisgICAgICAgICAgICAgICAgICAgICYmIG1DdXJyZW50LmJhY2soKS5tVHlwZSAhPSBtQ3VycmVudC5iYWNrKCkubUNvZGVjLT5zZWNvbmQudHlwZU1hcC5lbmQoKTsKKyAgICAgICAgfQorCisgICAgICAgIFJlc3VsdCBlbnRlck1lZGlhQ29kZWMoYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp0eXBlLCBib29sIHVwZGF0ZSk7CisgICAgICAgIFJlc3VsdCBlbnRlclR5cGUoY29uc3QgY2hhciAqbmFtZSwgYm9vbCB1cGRhdGUpOworICAgICAgICB2b2lkIGV4aXRDb2RlY09yVHlwZSgpIHsKKyAgICAgICAgICAgIG1DdXJyZW50LnBvcF9iYWNrKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBjYW4gb25seSBiZSBjYWxsZWQgd2hlbiBpbkNvZGVjKCkKKyAgICAgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkNvZGVjUHJvcGVydGllcyAmY29kZWMoKSB7CisgICAgICAgICAgICByZXR1cm4gbUN1cnJlbnQuYmFjaygpLm1Db2RlYy0+c2Vjb25kOworICAgICAgICB9CisgICAgICAgIC8vIGNhbiBvbmx5IGJlIGNhbGxlZCB3aGVuIGluQ29kZWMoKQorICAgICAgICBzdGQ6OnN0cmluZyBjb2RlY05hbWUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbUN1cnJlbnQuYmFjaygpLm1OYW1lOworICAgICAgICB9CisgICAgICAgIC8vIGNhbiBvbmx5IGJlIGNhbGxlZCB3aGVuIGluQ29kZWMoKQorICAgICAgICBib29sIHVwZGF0aW5nKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1DdXJyZW50LmJhY2soKS5tVXBkYXRpbmc7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2FuIG9ubHkgYmUgY2FsbGVkIHdoZW4gaW5UeXBlKCkKKyAgICAgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkF0dHJpYnV0ZU1hcCAmdHlwZSgpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ3VycmVudC5iYWNrKCkubVR5cGUtPnNlY29uZDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG1ldGhvZHMgbWFuaXB1bGF0aW5nIHRoZSBzZWN0aW9uIHN0YWNrCisgICAgICAgIFNlY3Rpb24gc2VjdGlvbigpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtU2VjdGlvblN0YWNrLmJhY2soKTsKKyAgICAgICAgfQorICAgICAgICBTZWN0aW9uIGxhc3ROb25JbmNsdWRlU2VjdGlvbigpIGNvbnN0OworICAgICAgICB2b2lkIGVudGVyU2VjdGlvbihTZWN0aW9uIHMpIHsKKyAgICAgICAgICAgIG1TZWN0aW9uU3RhY2sucHVzaF9iYWNrKHMpOworICAgICAgICB9CisgICAgICAgIHZvaWQgZXhpdFNlY3Rpb24oKSB7CisgICAgICAgICAgICBtU2VjdGlvblN0YWNrLnBvcF9iYWNrKCk7CisgICAgICAgICAgICBDSEVDSyghbVNlY3Rpb25TdGFjay5lbXB0eSgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG1ldGhvZHMgbWFuaXB1bGF0aW5nIHRoZSB2YXJpYW50cyBzdGFjaworICAgICAgICBTdHJpbmdTZXQgdmFyaWFudHMoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbVZhcmlhbnRzU3RhY2suYmFjaygpOworICAgICAgICB9CisgICAgICAgIHZvaWQgZW50ZXJWYXJpYW50cyhTdHJpbmdTZXQgdmFyaWFudHMpIHsKKyAgICAgICAgICAgIG1WYXJpYW50c1N0YWNrLnB1c2hfYmFjayh2YXJpYW50cyk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBleGl0VmFyaWFudHMoKSB7CisgICAgICAgICAgICBtVmFyaWFudHNTdGFjay5wb3BfYmFjaygpOworICAgICAgICB9CisKKyAgICAgICAgLy8gdXRpbGl0eSBtZXRob2RzCisKKyAgICAgICAgLy8gdXBkYXRlcyByYW5rLCBkb21haW5zLCB2YXJpYW50cyBhbmQgZW5hYmxlZG5lc3Mgb24gdGhlIGN1cnJlbnQgY29kZWMvdHlwZQorICAgICAgICBSZXN1bHQgdXBkYXRlQ29kZWMoCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcmFuaywgU3RyaW5nU2V0IGRvbWFpbnMsIFN0cmluZ1NldCB2YXJpYW50cywgY29uc3QgY2hhciAqZW5hYmxlZCk7CisgICAgICAgIC8vIGFkZHMgYSBrZXktdmFsdWUgYXR0cmlidXRlIGRldGFpbCB0byB0aGUgY3VycmVudCB0eXBlIG9mIHRoZSBjdXJyZW50IGNvZGVjCisgICAgICAgIHZvaWQgYWRkRGV0YWlsKGNvbnN0IHN0ZDo6c3RyaW5nICZrZXksIGNvbnN0IHN0ZDo6c3RyaW5nICZ2YWx1ZSk7CisgICAgfTsKKworICAgIC8qKiBYTUwgUGFyc2VyIChzdGF0ZSkgKi8KKyAgICBzdHJ1Y3QgUGFyc2VyIHsKKyAgICAgICAgU3RhdGUgKm1TdGF0ZTsKKworICAgICAgICBQYXJzZXIoU3RhdGUgKnN0YXRlLCBzdGQ6OnN0cmluZyBwYXRoKTsKKworICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBwYXJzZXIgc3RhdGUKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFhNTF9QYXJzZXJTdHJ1Y3Q+IG1QYXJzZXI7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1QYXRoOworICAgICAgICBzdGQ6OnN0cmluZyBtSHJlZkJhc2U7CisgICAgICAgIHN0YXR1c190IG1TdGF0dXM7CisKKyAgICAgICAgdm9pZCBwYXJzZVhtbEZpbGUoKTsKKworICAgICAgICAvLyBYTUwgcGFyc2VyIGNhbGxiYWNrcworICAgICAgICBzdGF0aWMgdm9pZCBTdGFydEVsZW1lbnRIYW5kbGVyV3JhcHBlcih2b2lkICptZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmF0dHJzKTsKKyAgICAgICAgc3RhdGljIHZvaWQgRW5kRWxlbWVudEhhbmRsZXJXcmFwcGVyKHZvaWQgKm1lLCBjb25zdCBjaGFyICpuYW1lKTsKKworICAgICAgICB2b2lkIHN0YXJ0RWxlbWVudEhhbmRsZXIoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmF0dHJzKTsKKyAgICAgICAgdm9pZCBlbmRFbGVtZW50SGFuZGxlcihjb25zdCBjaGFyICpuYW1lKTsKKworICAgICAgICB2b2lkIHVwZGF0ZVN0YXR1cyhzdGF0dXNfdCBzdGF0dXMpOworICAgICAgICB2b2lkIGxvZ0FueUVycm9ycyhjb25zdCBSZXN1bHQgJnN0YXR1cykgY29uc3Q7CisgICAgICAgIHN0YXR1c190IGdldFN0YXR1cygpIGNvbnN0IHsgcmV0dXJuIG1TdGF0dXM7IH0KKworICAgICAgICBzdGF0dXNfdCBhZGRBbGlhcyhjb25zdCBjaGFyICoqYXR0cnMpOworICAgICAgICBzdGF0dXNfdCBhZGRGZWF0dXJlKGNvbnN0IGNoYXIgKiphdHRycyk7CisgICAgICAgIHN0YXR1c190IGFkZExpbWl0KGNvbnN0IGNoYXIgKiphdHRycyk7CisgICAgICAgIHN0YXR1c190IGFkZFF1aXJrKGNvbnN0IGNoYXIgKiphdHRycywgY29uc3QgY2hhciAqcHJlZml4ID0gbnVsbHB0cik7CisgICAgICAgIHN0YXR1c190IGFkZFNldHRpbmcoY29uc3QgY2hhciAqKmF0dHJzLCBjb25zdCBjaGFyICpwcmVmaXggPSBudWxscHRyKTsKKyAgICAgICAgc3RhdHVzX3QgZW50ZXJNZWRpYUNvZGVjKGNvbnN0IGNoYXIgKiphdHRycywgYm9vbCBlbmNvZGVyKTsKKyAgICAgICAgc3RhdHVzX3QgZW50ZXJUeXBlKGNvbnN0IGNoYXIgKiphdHRycyk7CisgICAgICAgIHN0YXR1c190IGluY2x1ZGVYbWxGaWxlKGNvbnN0IGNoYXIgKiphdHRycyk7CisgICAgICAgIHN0YXR1c190IGxpbWl0VmFyaWFudHMoY29uc3QgY2hhciAqKmF0dHJzKTsKKworICAgICAgICBzdGF0dXNfdCB1cGRhdGVNZWRpYUNvZGVjKAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnJhbmssIGNvbnN0IFN0cmluZ1NldCAmZG9tYWluLCBjb25zdCBTdHJpbmdTZXQgJnZhcmlhbnRzLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmVuYWJsZWQpOworICAgIH07CisKKyAgICBzdGF0dXNfdCBwYXJzZVhtbEZpbGVzSW5TZWFyY2hEaXJzKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmZpbGVOYW1lcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZzZWFyY2hEaXJzKTsKKworICAgIHN0YXR1c190IHBhcnNlWG1sUGF0aChjb25zdCBzdGQ6OnN0cmluZyAmcGF0aCk7CisKKyAgICAvLyBDb21wdXRlZCBsb25nZXN0IGNvbW1vbiBwcmVmaXgKKyAgICBEYXRhIG1EYXRhOworICAgIFN0YXRlIG1TdGF0ZTsKKworICAgIC8vIFJvbGUgbWFwCisgICAgbXV0YWJsZSBzdGQ6OnN0cmluZyBtQ29tbW9uUHJlZml4OworICAgIG11dGFibGUgUm9sZU1hcCBtUm9sZU1hcDsKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbUxvY2s7CisKKyAgICBzdGF0dXNfdCBtUGFyc2luZ1N0YXR1czsKKworICAgIEltcGwoKQorICAgICAgICA6IG1TdGF0ZSgmbURhdGEpLAorICAgICAgICAgIG1QYXJzaW5nU3RhdHVzKE5PX0lOSVQpIHsKKyAgICB9CisKKyAgICB2b2lkIGdlbmVyYXRlUm9sZU1hcCgpIGNvbnN0OworICAgIHZvaWQgZ2VuZXJhdGVDb21tb25QcmVmaXgoKSBjb25zdDsKKworICAgIGNvbnN0IEF0dHJpYnV0ZU1hcCYgZ2V0U2VydmljZUF0dHJpYnV0ZU1hcCgpIGNvbnN0IHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGd1YXJkKG1Mb2NrKTsKKyAgICAgICAgcmV0dXJuIG1EYXRhLm1TZXJ2aWNlQXR0cmlidXRlTWFwOworICAgIH0KKworICAgIGNvbnN0IENvZGVjTWFwJiBnZXRDb2RlY01hcCgpIGNvbnN0IHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGd1YXJkKG1Mb2NrKTsKKyAgICAgICAgcmV0dXJuIG1EYXRhLm1Db2RlY01hcDsKKyAgICB9CisKKyAgICBjb25zdCBSb2xlTWFwJiBnZXRSb2xlTWFwKCkgY29uc3Q7CisgICAgY29uc3QgY2hhciogZ2V0Q29tbW9uUHJlZml4KCkgY29uc3Q7CisKKyAgICBzdGF0dXNfdCBnZXRQYXJzaW5nU3RhdHVzKCkgY29uc3QgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gZ3VhcmQobUxvY2spOworICAgICAgICByZXR1cm4gbVBhcnNpbmdTdGF0dXM7CisgICAgfQorfTsKKwogY29uc3RleHByIGNoYXIgY29uc3QqIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpkZWZhdWx0UHJvZmlsaW5nUmVzdWx0c1htbFBhdGg7CiAKLU1lZGlhQ29kZWNzWG1sUGFyc2VyOjpNZWRpYUNvZGVjc1htbFBhcnNlcigKLSAgICAgICAgY29uc3QgY2hhciogY29uc3QqIHNlYXJjaERpcnMsCi0gICAgICAgIGNvbnN0IGNoYXIqIG1haW5YbWxOYW1lLAotICAgICAgICBjb25zdCBjaGFyKiBwZXJmb3JtYW5jZVhtbE5hbWUsCi0gICAgICAgIGNvbnN0IGNoYXIqIHByb2ZpbGluZ1Jlc3VsdHNYbWxQYXRoKSA6Ci0gICAgbVBhcnNpbmdTdGF0dXMoTk9fSU5JVCksCi0gICAgbVVwZGF0ZShmYWxzZSksCi0gICAgbUNvZGVjQ291bnRlcigwKSB7Ci0gICAgc3RkOjpzdHJpbmcgcGF0aDsKLSAgICBpZiAoZmluZEZpbGVJbkRpcnMoc2VhcmNoRGlycywgbWFpblhtbE5hbWUsICZwYXRoKSkgewotICAgICAgICBwYXJzZVRvcExldmVsWE1MRmlsZShwYXRoLmNfc3RyKCksIGZhbHNlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiQ2Fubm90IGZpbmQgJXMiLCBtYWluWG1sTmFtZSk7Ci0gICAgICAgIG1QYXJzaW5nU3RhdHVzID0gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgfQotICAgIGlmIChmaW5kRmlsZUluRGlycyhzZWFyY2hEaXJzLCBwZXJmb3JtYW5jZVhtbE5hbWUsICZwYXRoKSkgewotICAgICAgICBwYXJzZVRvcExldmVsWE1MRmlsZShwYXRoLmNfc3RyKCksIHRydWUpOwotICAgIH0KLSAgICBpZiAocHJvZmlsaW5nUmVzdWx0c1htbFBhdGggIT0gbnVsbHB0cikgewotICAgICAgICBwYXJzZVRvcExldmVsWE1MRmlsZShwcm9maWxpbmdSZXN1bHRzWG1sUGF0aCwgdHJ1ZSk7Ci0gICAgfQorTWVkaWFDb2RlY3NYbWxQYXJzZXI6Ok1lZGlhQ29kZWNzWG1sUGFyc2VyKCkKKyAgICA6IG1JbXBsKG5ldyBJbXBsKCkpIHsKIH0KIAotYm9vbCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6cGFyc2VUb3BMZXZlbFhNTEZpbGUoCi0gICAgICAgIGNvbnN0IGNoYXIgKmNvZGVjc194bWwsCi0gICAgICAgIGJvb2wgaWdub3JlX2Vycm9ycykgewotICAgIC8vIGdldCBocmVmX2Jhc2UKLSAgICBjb25zdCBjaGFyICpocmVmX2Jhc2VfZW5kID0gc3RycmNocihjb2RlY3NfeG1sLCAnLycpOwotICAgIGlmIChocmVmX2Jhc2VfZW5kICE9IG51bGxwdHIpIHsKLSAgICAgICAgbUhyZWZCYXNlID0gc3RkOjpzdHJpbmcoY29kZWNzX3htbCwgaHJlZl9iYXNlX2VuZCAtIGNvZGVjc194bWwgKyAxKTsKLSAgICB9CitzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6cGFyc2VYbWxGaWxlc0luU2VhcmNoRGlycygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZmaWxlTmFtZXMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmc2VhcmNoRGlycykgeworICAgIHJldHVybiBtSW1wbC0+cGFyc2VYbWxGaWxlc0luU2VhcmNoRGlycyhmaWxlTmFtZXMsIHNlYXJjaERpcnMpOworfQogCi0gICAgbVBhcnNpbmdTdGF0dXMgPSBPSzsgLy8ga2VlcGluZyB0aGlzIGhlcmUgZm9yIHNhZmV0eQotICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fVE9QTEVWRUw7CitzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6cGFyc2VYbWxQYXRoKGNvbnN0IHN0ZDo6c3RyaW5nICZwYXRoKSB7CisgICAgcmV0dXJuIG1JbXBsLT5wYXJzZVhtbFBhdGgocGF0aCk7Cit9CiAKLSAgICBwYXJzZVhNTEZpbGUoY29kZWNzX3htbCk7Ci0KLSAgICBpZiAobVBhcnNpbmdTdGF0dXMgIT0gT0spIHsKLSAgICAgICAgQUxPR1coInBhcnNlVG9wTGV2ZWxYTUxGaWxlKCVzKSBmYWlsZWQiLCBjb2RlY3NfeG1sKTsKLSAgICAgICAgaWYgKGlnbm9yZV9lcnJvcnMpIHsKLSAgICAgICAgICAgIG1QYXJzaW5nU3RhdHVzID0gT0s7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CitzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6cGFyc2VYbWxGaWxlc0luU2VhcmNoRGlycygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZmaWxlTmFtZXMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmc2VhcmNoRGlycykgeworICAgIHN0YXR1c190IHJlcyA9IE5PX0lOSVQ7CisgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyBmaWxlTmFtZSA6IGZpbGVOYW1lcykgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBOT19JTklUOworICAgICAgICBzdGQ6OnN0cmluZyBwYXRoOworICAgICAgICBpZiAoZmluZEZpbGVJbkRpcnMoc2VhcmNoRGlycywgZmlsZU5hbWUsICZwYXRoKSkgeworICAgICAgICAgICAgZXJyID0gcGFyc2VYbWxQYXRoKHBhdGgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0QoIkNhbm5vdCBmaW5kICVzIiwgcGF0aC5jX3N0cigpKTsKICAgICAgICAgfQotICAgICAgICBtQ29kZWNNYXAuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXMgPSBjb21iaW5lU3RhdHVzKHJlcywgZXJyKTsKICAgICB9Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OnBhcnNlWG1sUGF0aChjb25zdCBzdGQ6OnN0cmluZyAmcGF0aCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBndWFyZChtTG9jayk7CisgICAgaWYgKCFmaWxlRXhpc3RzKHBhdGgpKSB7CisgICAgICAgIEFMT0dEKCJDYW5ub3QgZmluZCAlcyIsIHBhdGguY19zdHIoKSk7CisgICAgICAgIG1QYXJzaW5nU3RhdHVzID0gY29tYmluZVN0YXR1cyhtUGFyc2luZ1N0YXR1cywgTkFNRV9OT1RfRk9VTkQpOworICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgLy8gc2F2ZSBzdGF0ZSAoZXZlbiB0aG91Z2ggd2Ugc2hvdWxkIGFsd2F5cyBiZSBhdCB0b3BsZXZlbCBoZXJlKQorICAgIFN0YXRlOjpSZXN0b3JlUG9pbnQgcnAgPSBtU3RhdGUuY3JlYXRlUmVzdG9yZVBvaW50KCk7CisgICAgUGFyc2VyIHBhcnNlcigmbVN0YXRlLCBwYXRoKTsKKyAgICBwYXJzZXIucGFyc2VYbWxGaWxlKCk7CisgICAgbVN0YXRlLnJlc3RvcmUocnApOworCisgICAgaWYgKHBhcnNlci5nZXRTdGF0dXMoKSAhPSBPSykgeworICAgICAgICBBTE9HRCgicGFyc2VYbWxQYXRoKCVzKSBmYWlsZWQgd2l0aCAlcyIsIHBhdGguY19zdHIoKSwgYXNTdHJpbmcocGFyc2VyLmdldFN0YXR1cygpKSk7CisgICAgfQorICAgIG1QYXJzaW5nU3RhdHVzID0gY29tYmluZVN0YXR1cyhtUGFyc2luZ1N0YXR1cywgcGFyc2VyLmdldFN0YXR1cygpKTsKKyAgICByZXR1cm4gcGFyc2VyLmdldFN0YXR1cygpOwogfQogCiBNZWRpYUNvZGVjc1htbFBhcnNlcjo6fk1lZGlhQ29kZWNzWG1sUGFyc2VyKCkgewogfQogCi12b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpwYXJzZVhNTEZpbGUoY29uc3QgY2hhciAqcGF0aCkgeworTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlN0YXRlOjpTdGF0ZShNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6RGF0YSAqZGF0YSkKKyAgICA6IG1EYXRhKGRhdGEpIHsKKyAgICBtU2VjdGlvblN0YWNrLmVtcGxhY2VfYmFjayhTRUNUSU9OX1RPUExFVkVMKTsKK30KKworTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlNlY3Rpb24KK01lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpTdGF0ZTo6bGFzdE5vbkluY2x1ZGVTZWN0aW9uKCkgY29uc3QgeworICAgIGZvciAoYXV0byBpdCA9IG1TZWN0aW9uU3RhY2suZW5kKCk7IGl0ICE9IG1TZWN0aW9uU3RhY2suYmVnaW4oKTsgLS1pdCkgeworICAgICAgICBpZiAoaXRbLTFdICE9IFNFQ1RJT05fSU5DTFVERSkgeworICAgICAgICAgICAgcmV0dXJuIGl0Wy0xXTsKKyAgICAgICAgfQorICAgIH0KKyAgICBUUkVTUEFTUygibXVzdCBoYXZlIG5vbi1pbmNsdWRlIHNlY3Rpb24iKTsKK30KKwordm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6UGFyc2VyOjp1cGRhdGVTdGF0dXMoc3RhdHVzX3Qgc3RhdHVzKSB7CisgICAgbVN0YXR1cyA9IGNvbWJpbmVTdGF0dXMobVN0YXR1cywgc3RhdHVzKTsKK30KKwordm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6UGFyc2VyOjpsb2dBbnlFcnJvcnMoY29uc3QgUmVzdWx0ICZzdGF0dXMpIGNvbnN0IHsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIGlmIChzdGF0dXMuZXJyb3IoKS5lbXB0eSgpKSB7CisgICAgICAgICAgICBQTE9HRCgiZXJyb3IgJXMiLCBhc1N0cmluZygoc3RhdHVzX3Qpc3RhdHVzKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQTE9HRCgiJXMiLCBzdGF0dXMuZXJyb3IoKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlBhcnNlcjo6UGFyc2VyKFN0YXRlICpzdGF0ZSwgc3RkOjpzdHJpbmcgcGF0aCkKKyAgICA6IG1TdGF0ZShzdGF0ZSksCisgICAgICBtUGF0aChwYXRoKSwKKyAgICAgIG1TdGF0dXMoTk9fSU5JVCkgeworICAgIC8vIGRldGVybWluZSBocmVmX2Jhc2UKKyAgICBzdGQ6OnN0cmluZzo6c2l6ZV90eXBlIGVuZCA9IHBhdGgucmZpbmQoIi8iKTsKKyAgICBpZiAoZW5kICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIG1IcmVmQmFzZSA9IHBhdGguc3Vic3RyKDAsIGVuZCArIDEpOworICAgIH0KK30KKwordm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6UGFyc2VyOjpwYXJzZVhtbEZpbGUoKSB7CisgICAgY29uc3QgY2hhciAqcGF0aCA9IG1QYXRoLmNfc3RyKCk7CisgICAgQUxPR0QoInBhcnNpbmcgJXMuLi4iLCBwYXRoKTsKICAgICBGSUxFICpmaWxlID0gZm9wZW4ocGF0aCwgInIiKTsKIAogICAgIGlmIChmaWxlID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR1coInVuYWJsZSB0byBvcGVuIG1lZGlhIGNvZGVjcyBjb25maWd1cmF0aW9uIHhtbCBmaWxlOiAlcyIsIHBhdGgpOwotICAgICAgICBtUGFyc2luZ1N0YXR1cyA9IE5BTUVfTk9UX0ZPVU5EOworICAgICAgICBBTE9HRCgidW5hYmxlIHRvIG9wZW4gbWVkaWEgY29kZWNzIGNvbmZpZ3VyYXRpb24geG1sIGZpbGU6ICVzIiwgcGF0aCk7CisgICAgICAgIG1TdGF0dXMgPSBOQU1FX05PVF9GT1VORDsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIFhNTF9QYXJzZXIgcGFyc2VyID0gOjpYTUxfUGFyc2VyQ3JlYXRlKG51bGxwdHIpOwotICAgIExPR19GQVRBTF9JRihwYXJzZXIgPT0gbnVsbHB0ciwgIlhNTF9NZWRpYUNvZGVjc1htbFBhcnNlckNyZWF0ZSgpIGZhaWxlZC4iKTsKKyAgICBtUGFyc2VyID0gc3RkOjpzaGFyZWRfcHRyPFhNTF9QYXJzZXJTdHJ1Y3Q+KAorICAgICAgICA6OlhNTF9QYXJzZXJDcmVhdGUobnVsbHB0ciksCisgICAgICAgIFtdKFhNTF9QYXJzZXJTdHJ1Y3QgKnBhcnNlcikgeyA6OlhNTF9QYXJzZXJGcmVlKHBhcnNlcik7IH0pOworICAgIExPR19GQVRBTF9JRighbVBhcnNlciwgIlhNTF9NZWRpYUNvZGVjc1htbFBhcnNlckNyZWF0ZSgpIGZhaWxlZC4iKTsKIAotICAgIDo6WE1MX1NldFVzZXJEYXRhKHBhcnNlciwgdGhpcyk7Ci0gICAgOjpYTUxfU2V0RWxlbWVudEhhbmRsZXIoCi0gICAgICAgICAgICBwYXJzZXIsIFN0YXJ0RWxlbWVudEhhbmRsZXJXcmFwcGVyLCBFbmRFbGVtZW50SGFuZGxlcldyYXBwZXIpOworICAgIDo6WE1MX1NldFVzZXJEYXRhKG1QYXJzZXIuZ2V0KCksIHRoaXMpOworICAgIDo6WE1MX1NldEVsZW1lbnRIYW5kbGVyKG1QYXJzZXIuZ2V0KCksIFN0YXJ0RWxlbWVudEhhbmRsZXJXcmFwcGVyLCBFbmRFbGVtZW50SGFuZGxlcldyYXBwZXIpOwogCiAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgQlVGRl9TSVpFID0gNTEyOwotICAgIHdoaWxlIChtUGFyc2luZ1N0YXR1cyA9PSBPSykgewotICAgICAgICB2b2lkICpidWZmID0gOjpYTUxfR2V0QnVmZmVyKHBhcnNlciwgQlVGRl9TSVpFKTsKKyAgICAvLyB1cGRhdGVTdGF0dXMoT0spOworICAgIGlmIChtU3RhdHVzID09IE5PX0lOSVQpIHsKKyAgICAgICAgbVN0YXR1cyA9IE9LOworICAgIH0KKyAgICB3aGlsZSAobVN0YXR1cyA9PSBPSykgeworICAgICAgICB2b2lkICpidWZmID0gOjpYTUxfR2V0QnVmZmVyKG1QYXJzZXIuZ2V0KCksIEJVRkZfU0laRSk7CiAgICAgICAgIGlmIChidWZmID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgaW4gY2FsbCB0byBYTUxfR2V0QnVmZmVyKCkiKTsKLSAgICAgICAgICAgIG1QYXJzaW5nU3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIEFMT0dEKCJmYWlsZWQgaW4gY2FsbCB0byBYTUxfR2V0QnVmZmVyKCkiKTsKKyAgICAgICAgICAgIG1TdGF0dXMgPSBVTktOT1dOX0VSUk9SOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBpbnQgYnl0ZXNfcmVhZCA9IDo6ZnJlYWQoYnVmZiwgMSwgQlVGRl9TSVpFLCBmaWxlKTsKICAgICAgICAgaWYgKGJ5dGVzX3JlYWQgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZmFpbGVkIGluIGNhbGwgdG8gcmVhZCIpOwotICAgICAgICAgICAgbVBhcnNpbmdTdGF0dXMgPSBFUlJPUl9JTzsKKyAgICAgICAgICAgIEFMT0dEKCJmYWlsZWQgaW4gY2FsbCB0byByZWFkIik7CisgICAgICAgICAgICBtU3RhdHVzID0gRVJST1JfSU87CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCi0gICAgICAgIFhNTF9TdGF0dXMgc3RhdHVzID0gOjpYTUxfUGFyc2VCdWZmZXIocGFyc2VyLCBieXRlc19yZWFkLCBieXRlc19yZWFkID09IDApOworICAgICAgICBYTUxfU3RhdHVzIHN0YXR1cyA9IDo6WE1MX1BhcnNlQnVmZmVyKG1QYXJzZXIuZ2V0KCksIGJ5dGVzX3JlYWQsIGJ5dGVzX3JlYWQgPT0gMCk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gWE1MX1NUQVRVU19PSykgewotICAgICAgICAgICAgQUxPR0UoIm1hbGZvcm1lZCAoJXMpIiwgOjpYTUxfRXJyb3JTdHJpbmcoOjpYTUxfR2V0RXJyb3JDb2RlKHBhcnNlcikpKTsKLSAgICAgICAgICAgIG1QYXJzaW5nU3RhdHVzID0gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgUExPR0QoIm1hbGZvcm1lZCAoJXMpIiwgOjpYTUxfRXJyb3JTdHJpbmcoOjpYTUxfR2V0RXJyb3JDb2RlKG1QYXJzZXIuZ2V0KCkpKSk7CisgICAgICAgICAgICBtU3RhdHVzID0gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMjA4LDM5ICs1MzQsNDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIDo6WE1MX1BhcnNlckZyZWUocGFyc2VyKTsKKyAgICBtUGFyc2VyLnJlc2V0KCk7CiAKICAgICBmY2xvc2UoZmlsZSk7CiAgICAgZmlsZSA9IG51bGxwdHI7CiB9CiAKIC8vIHN0YXRpYwotdm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6U3RhcnRFbGVtZW50SGFuZGxlcldyYXBwZXIoCit2b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpQYXJzZXI6OlN0YXJ0RWxlbWVudEhhbmRsZXJXcmFwcGVyKAogICAgICAgICB2b2lkICptZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmF0dHJzKSB7Ci0gICAgc3RhdGljX2Nhc3Q8TWVkaWFDb2RlY3NYbWxQYXJzZXIqPihtZSktPnN0YXJ0RWxlbWVudEhhbmRsZXIobmFtZSwgYXR0cnMpOworICAgIHN0YXRpY19jYXN0PE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpQYXJzZXIqPihtZSktPnN0YXJ0RWxlbWVudEhhbmRsZXIobmFtZSwgYXR0cnMpOwogfQogCiAvLyBzdGF0aWMKLXZvaWQgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkVuZEVsZW1lbnRIYW5kbGVyV3JhcHBlcih2b2lkICptZSwgY29uc3QgY2hhciAqbmFtZSkgewotICAgIHN0YXRpY19jYXN0PE1lZGlhQ29kZWNzWG1sUGFyc2VyKj4obWUpLT5lbmRFbGVtZW50SGFuZGxlcihuYW1lKTsKK3ZvaWQgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlBhcnNlcjo6RW5kRWxlbWVudEhhbmRsZXJXcmFwcGVyKHZvaWQgKm1lLCBjb25zdCBjaGFyICpuYW1lKSB7CisgICAgc3RhdGljX2Nhc3Q8TWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlBhcnNlcio+KG1lKS0+ZW5kRWxlbWVudEhhbmRsZXIobmFtZSk7CiB9CiAKLXN0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjppbmNsdWRlWE1MRmlsZShjb25zdCBjaGFyICoqYXR0cnMpIHsKK3N0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpQYXJzZXI6OmluY2x1ZGVYbWxGaWxlKGNvbnN0IGNoYXIgKiphdHRycykgewogICAgIGNvbnN0IGNoYXIgKmhyZWYgPSBudWxscHRyOwogICAgIHNpemVfdCBpID0gMDsKICAgICB3aGlsZSAoYXR0cnNbaV0gIT0gbnVsbHB0cikgewotICAgICAgICBpZiAoc3RyRXEoYXR0cnNbaV0sICJocmVmIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaHJlZiA9IGF0dHJzW2ldOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoImluY2x1ZGVYTUxGaWxlOiB1bnJlY29nbml6ZWQgYXR0cmlidXRlOiAlcyIsIGF0dHJzW2ldKTsKKyAgICAgICAgQ0hFQ0soKGkgJiAxKSA9PSAwKTsKKyAgICAgICAgaWYgKGF0dHJzW2kgKyAxXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBQTE9HRCgiSW5jbHVkZTogYXR0cmlidXRlICclcycgaXMgbnVsbCIsIGF0dHJzW2ldKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KKworICAgICAgICBpZiAoc3RyRXEoYXR0cnNbaV0sICJocmVmIikpIHsKKyAgICAgICAgICAgIGhyZWYgPSBhdHRyc1srK2ldOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUExPR0QoIkluY2x1ZGU6IGlnbm9yaW5nIHVucmVjb2duaXplZCBhdHRyaWJ1dGUgJyVzJyIsIGF0dHJzW2ldKTsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgfQogICAgICAgICArK2k7CiAgICAgfQogCisgICAgaWYgKGhyZWYgPT0gbnVsbHB0cikgeworICAgICAgICBQTE9HRCgiSW5jbHVkZSB3aXRoIG5vICdocmVmJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKICAgICAvLyBGb3Igc2VjdXJpdHkgcmVhc29ucyBhbmQgZm9yIHNpbXBsaWNpdHksIGZpbGUgbmFtZXMgY2FuIG9ubHkgY29udGFpbgogICAgIC8vIFthLXpBLVowLTlfLl0gYW5kIG11c3Qgc3RhcnQgd2l0aCAgbWVkaWFfY29kZWNzXyBhbmQgZW5kIHdpdGggLnhtbAogICAgIGZvciAoaSA9IDA7IGhyZWZbaV0gIT0gJ1wwJzsgaSsrKSB7CkBAIC0yNTAsNzQgKzU4NCwxMTQgQEAKICAgICAgICAgICAgICAgICAoaHJlZltpXSA+PSAnYScgJiYgaHJlZltpXSA8PSAneicpKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBBTE9HRSgiaW52YWxpZCBpbmNsdWRlIGZpbGUgbmFtZTogJXMiLCBocmVmKTsKKyAgICAgICAgUExPR0QoImludmFsaWQgaW5jbHVkZSBmaWxlIG5hbWU6ICVzIiwgaHJlZik7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgc3RkOjpzdHJpbmcgZmlsZW5hbWUgPSBocmVmOwogICAgIGlmIChmaWxlbmFtZS5jb21wYXJlKDAsIDEzLCAibWVkaWFfY29kZWNzXyIpICE9IDAgfHwKICAgICAgICAgICAgIGZpbGVuYW1lLmNvbXBhcmUoZmlsZW5hbWUuc2l6ZSgpIC0gNCwgNCwgIi54bWwiKSAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJpbnZhbGlkIGluY2x1ZGUgZmlsZSBuYW1lOiAlcyIsIGhyZWYpOworICAgICAgICBQTE9HRCgiaW52YWxpZCBpbmNsdWRlIGZpbGUgbmFtZTogJXMiLCBocmVmKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgZmlsZW5hbWUuaW5zZXJ0KDAsIG1IcmVmQmFzZSk7CiAKLSAgICBzdGF0dXNfdCBvbGRQYXJzaW5nU3RhdHVzID0gbVBhcnNpbmdTdGF0dXM7CisgICAgUmVzdWx0IHJlcyA9IG1TdGF0ZS0+ZW50ZXJJbmNsdWRlKGZpbGVuYW1lKTsKKyAgICBpZiAocmVzKSB7CisgICAgICAgIGxvZ0FueUVycm9ycyhyZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KIAotICAgIHBhcnNlWE1MRmlsZShmaWxlbmFtZS5jX3N0cigpKTsKLQotICAgIHN0YXR1c190IG5ld1BhcnNpbmdTdGF0dXMgPSBtUGFyc2luZ1N0YXR1czsKLSAgICBtUGFyc2luZ1N0YXR1cyA9IG9sZFBhcnNpbmdTdGF0dXM7Ci0gICAgcmV0dXJuIG5ld1BhcnNpbmdTdGF0dXM7CisgICAgLy8gc2F2ZSBzdGF0ZSBzbyB0aGF0IHdlIGNhbiByZXN1bWUgZXZlbiBpZiBYTUwgcGFyc2luZyBvZiB0aGUgaW5jbHVkZWQgZmlsZSBmYWlsZWQgbWlkd2F5CisgICAgU3RhdGU6OlJlc3RvcmVQb2ludCBycCA9IG1TdGF0ZS0+Y3JlYXRlUmVzdG9yZVBvaW50KCk7CisgICAgUGFyc2VyIHBhcnNlcihtU3RhdGUsIGZpbGVuYW1lKTsKKyAgICBwYXJzZXIucGFyc2VYbWxGaWxlKCk7CisgICAgbVN0YXRlLT5yZXN0b3JlKHJwKTsKKyAgICBtU3RhdGUtPmV4aXRJbmNsdWRlKCk7CisgICAgcmV0dXJuIHBhcnNlci5nZXRTdGF0dXMoKTsKIH0KIAotdm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6c3RhcnRFbGVtZW50SGFuZGxlcigKK01lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpSZXN1bHQKK01lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpTdGF0ZTo6ZW50ZXJJbmNsdWRlKGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlTmFtZSkgeworICAgIGlmIChzdGQ6OmZpbmQobUluY2x1ZGVTdGFjay5iZWdpbigpLCBtSW5jbHVkZVN0YWNrLmVuZCgpLCBmaWxlTmFtZSkKKyAgICAgICAgICAgICE9IG1JbmNsdWRlU3RhY2suZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIHsgQkFEX1ZBTFVFLCAicmVjdXJzaXZlIGluY2x1ZGUgY2hhaW4iIH07CisgICAgfQorICAgIG1JbmNsdWRlU3RhY2suZW1wbGFjZV9iYWNrKGZpbGVOYW1lKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlBhcnNlcjo6c3RhcnRFbGVtZW50SGFuZGxlcigKICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmF0dHJzKSB7CiAgICAgYm9vbCBpblR5cGUgPSB0cnVlOworICAgIFJlc3VsdCBlcnIgPSBOT19JTklUOwogCisgICAgU2VjdGlvbiBzZWN0aW9uID0gbVN0YXRlLT5zZWN0aW9uKCk7CisKKyAgICAvLyBoYW5kbGUgaW5jbHVkZSBhdCBhbnkgbGV2ZWwKICAgICBpZiAoc3RyRXEobmFtZSwgIkluY2x1ZGUiKSkgewotICAgICAgICBpZiAoaW5jbHVkZVhNTEZpbGUoYXR0cnMpID09IE9LKSB7Ci0gICAgICAgICAgICBtU2VjdGlvblN0YWNrLnB1c2hfYmFjayhtQ3VycmVudFNlY3Rpb24pOwotICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9JTkNMVURFOwotICAgICAgICB9CisgICAgICAgIG1TdGF0ZS0+ZW50ZXJTZWN0aW9uKFNFQ1RJT05fSU5DTFVERSk7CisgICAgICAgIHVwZGF0ZVN0YXR1cyhpbmNsdWRlWG1sRmlsZShhdHRycykpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgc3dpdGNoIChtQ3VycmVudFNlY3Rpb24pIHsKKyAgICAvLyBoYW5kbGUgaW5jbHVkZSBzZWN0aW9uICh0b3AgbGV2ZWwpCisgICAgaWYgKHNlY3Rpb24gPT0gU0VDVElPTl9JTkNMVURFKSB7CisgICAgICAgIGlmIChzdHJFcShuYW1lLCAiSW5jbHVkZWQiKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIGltaXRhdGUgcHJpb3IgbGV2ZWwKKyAgICAgICAgc2VjdGlvbiA9IG1TdGF0ZS0+bGFzdE5vbkluY2x1ZGVTZWN0aW9uKCk7CisgICAgfQorCisgICAgc3dpdGNoIChzZWN0aW9uKSB7CiAgICAgICAgIGNhc2UgU0VDVElPTl9UT1BMRVZFTDoKICAgICAgICAgeworICAgICAgICAgICAgU2VjdGlvbiBuZXh0U2VjdGlvbjsKICAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiRGVjb2RlcnMiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fREVDT0RFUlM7CisgICAgICAgICAgICAgICAgbmV4dFNlY3Rpb24gPSBTRUNUSU9OX0RFQ09ERVJTOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShuYW1lLCAiRW5jb2RlcnMiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fRU5DT0RFUlM7CisgICAgICAgICAgICAgICAgbmV4dFNlY3Rpb24gPSBTRUNUSU9OX0VOQ09ERVJTOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShuYW1lLCAiU2V0dGluZ3MiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fU0VUVElOR1M7CisgICAgICAgICAgICAgICAgbmV4dFNlY3Rpb24gPSBTRUNUSU9OX1NFVFRJTkdTOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShuYW1lLCAiTWVkaWFDb2RlY3MiKSB8fCBzdHJFcShuYW1lLCAiSW5jbHVkZWQiKSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIG1TdGF0ZS0+ZW50ZXJTZWN0aW9uKG5leHRTZWN0aW9uKTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgU0VDVElPTl9TRVRUSU5HUzoKICAgICAgICAgewogICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJTZXR0aW5nIikpIHsKLSAgICAgICAgICAgICAgICAodm9pZClhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXMoYXR0cnMpOworICAgICAgICAgICAgICAgIGVyciA9IGFkZFNldHRpbmcoYXR0cnMpOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShuYW1lLCAiVmFyaWFudCIpKSB7CisgICAgICAgICAgICAgICAgZXJyID0gYWRkU2V0dGluZyhhdHRycywgInZhcmlhbnQtIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKG5hbWUsICJEb21haW4iKSkgeworICAgICAgICAgICAgICAgIGVyciA9IGFkZFNldHRpbmcoYXR0cnMsICJkb21haW4tIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB1cGRhdGVTdGF0dXMoZXJyKTsKKyAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSUzoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJNZWRpYUNvZGVjIikpIHsKLSAgICAgICAgICAgICAgICAodm9pZClhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXMoZmFsc2UgLyogZW5jb2RlciAqLywgYXR0cnMpOwotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fREVDT0RFUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KICAgICAgICAgY2FzZSBTRUNUSU9OX0VOQ09ERVJTOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoc3RyRXEobmFtZSwgIk1lZGlhQ29kZWMiKSkgewotICAgICAgICAgICAgICAgICh2b2lkKWFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlcyh0cnVlIC8qIGVuY29kZXIgKi8sIGF0dHJzKTsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX0VOQ09ERVI7CisgICAgICAgICAgICAgICAgZXJyID0gZW50ZXJNZWRpYUNvZGVjKGF0dHJzLCBzZWN0aW9uID09IFNFQ1RJT05fRU5DT0RFUlMpOworICAgICAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhlcnIpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsgLy8gc2tpcCB0aGlzIGVsZW1lbnQgb24gZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRlLT5lbnRlclNlY3Rpb24oU0VDVElPTl9VTktOT1dOKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtU3RhdGUtPmVudGVyVmFyaWFudHMobVN0YXRlLT5jb2RlYygpLnZhcmlhbnRTZXQpOworICAgICAgICAgICAgICAgICAgICBtU3RhdGUtPmVudGVyU2VjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWN0aW9uID09IFNFQ1RJT05fREVDT0RFUlMgPyBTRUNUSU9OX0RFQ09ERVIgOiBTRUNUSU9OX0VOQ09ERVIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMzI2LDEwMyArNzAwLDEyMyBAQAogICAgICAgICBjYXNlIFNFQ1RJT05fRU5DT0RFUjoKICAgICAgICAgewogICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJRdWlyayIpKSB7Ci0gICAgICAgICAgICAgICAgKHZvaWQpYWRkUXVpcmsoYXR0cnMpOworICAgICAgICAgICAgICAgIGVyciA9IGFkZFF1aXJrKGF0dHJzLCAicXVpcms6OiIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShuYW1lLCAiQXR0cmlidXRlIikpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBhZGRRdWlyayhhdHRycywgImF0dHJpYnV0ZTo6Iik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKG5hbWUsICJBbGlhcyIpKSB7CisgICAgICAgICAgICAgICAgZXJyID0gYWRkQWxpYXMoYXR0cnMpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShuYW1lLCAiVHlwZSIpKSB7Ci0gICAgICAgICAgICAgICAgKHZvaWQpYWRkVHlwZUZyb21BdHRyaWJ1dGVzKGF0dHJzLAotICAgICAgICAgICAgICAgICAgICAgICAgKG1DdXJyZW50U2VjdGlvbiA9PSBTRUNUSU9OX0VOQ09ERVIpKTsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgKG1DdXJyZW50U2VjdGlvbiA9PSBTRUNUSU9OX0RFQ09ERVIgPwotICAgICAgICAgICAgICAgICAgICAgICAgU0VDVElPTl9ERUNPREVSX1RZUEUgOiBTRUNUSU9OX0VOQ09ERVJfVFlQRSk7CisgICAgICAgICAgICAgICAgZXJyID0gZW50ZXJUeXBlKGF0dHJzKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7IC8vIHNraXAgdGhpcyBlbGVtZW50IG9uIGVycm9yCisgICAgICAgICAgICAgICAgICAgIG1TdGF0ZS0+ZW50ZXJTZWN0aW9uKFNFQ1RJT05fVU5LTk9XTik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRlLT5lbnRlclNlY3Rpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiA9PSBTRUNUSU9OX0RFQ09ERVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gU0VDVElPTl9ERUNPREVSX1RZUEUgOiBTRUNUSU9OX0VOQ09ERVJfVFlQRSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGluVHlwZSA9IGZhbHNlOwotICAgICAgICAvLyBmYWxsIHRocm91Z2gKKyAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAKICAgICAgICAgY2FzZSBTRUNUSU9OX0RFQ09ERVJfVFlQRToKICAgICAgICAgY2FzZSBTRUNUSU9OX0VOQ09ERVJfVFlQRToKKyAgICAgICAgY2FzZSBTRUNUSU9OX1ZBUklBTlQ6CiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIGlnbm9yZSBsaW1pdHMgYW5kIGZlYXR1cmVzIHNwZWNpZmllZCBvdXRzaWRlIG9mIHR5cGUKLSAgICAgICAgICAgIGJvb2wgb3V0c2lkZSA9ICFpblR5cGUgJiYKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUeXBlID09IG1DdXJyZW50Q29kZWMtPnNlY29uZC50eXBlTWFwLmVuZCgpOwotICAgICAgICAgICAgaWYgKG91dHNpZGUgJiYKLSAgICAgICAgICAgICAgICAgICAgKHN0ckVxKG5hbWUsICJMaW1pdCIpIHx8IHN0ckVxKG5hbWUsICJGZWF0dXJlIikpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nICVzIHNwZWNpZmllZCBvdXRzaWRlIG9mIGEgVHlwZSIsIG5hbWUpOworICAgICAgICAgICAgaWYgKCFtU3RhdGUtPmluVHlwZSgpCisgICAgICAgICAgICAgICAgICAgICYmIChzdHJFcShuYW1lLCAiTGltaXQiKSB8fCBzdHJFcShuYW1lLCAiRmVhdHVyZSIpIHx8IHN0ckVxKG5hbWUsICJWYXJpYW50IikpKSB7CisgICAgICAgICAgICAgICAgUExPR0QoImlnbm9yaW5nICVzIHNwZWNpZmllZCBvdXRzaWRlIG9mIGEgVHlwZSIsIG5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEobmFtZSwgIkxpbWl0IikpIHsKLSAgICAgICAgICAgICAgICAodm9pZClhZGRMaW1pdChhdHRycyk7CisgICAgICAgICAgICAgICAgZXJyID0gYWRkTGltaXQoYXR0cnMpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShuYW1lLCAiRmVhdHVyZSIpKSB7Ci0gICAgICAgICAgICAgICAgKHZvaWQpYWRkRmVhdHVyZShhdHRycyk7CisgICAgICAgICAgICAgICAgZXJyID0gYWRkRmVhdHVyZShhdHRycyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKG5hbWUsICJWYXJpYW50IikgJiYgc2VjdGlvbiAhPSBTRUNUSU9OX1ZBUklBTlQpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBsaW1pdFZhcmlhbnRzKGF0dHJzKTsKKyAgICAgICAgICAgICAgICBtU3RhdGUtPmVudGVyU2VjdGlvbihlcnIgPT0gT0sgPyBTRUNUSU9OX1ZBUklBTlQgOiBTRUNUSU9OX1VOS05PV04pOworICAgICAgICAgICAgfSBlbHNlIGlmIChpblR5cGUKKyAgICAgICAgICAgICAgICAgICAgJiYgKHN0ckVxKG5hbWUsICJBbGlhcyIpIHx8IHN0ckVxKG5hbWUsICJBdHRyaWJ1dGUiKSB8fCBzdHJFcShuYW1lLCAiUXVpcmsiKSkpIHsKKyAgICAgICAgICAgICAgICBQTE9HRCgiaWdub3JpbmcgJXMgc3BlY2lmaWVkIG5vdCBkaXJlY3RseSBpbiBhIE1lZGlhQ29kZWMiLCBuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBOT19JTklUKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhlcnIpOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAorICAgIGlmIChzZWN0aW9uICE9IFNFQ1RJT05fVU5LTk9XTikgeworICAgICAgICBQTE9HRCgiSWdub3JpbmcgdW5yZWNvZ25pemVkIHRhZyA8JXM+IiwgbmFtZSk7CisgICAgfQorICAgIG1TdGF0ZS0+ZW50ZXJTZWN0aW9uKFNFQ1RJT05fVU5LTk9XTik7CiB9CiAKLXZvaWQgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmVuZEVsZW1lbnRIYW5kbGVyKGNvbnN0IGNoYXIgKm5hbWUpIHsKLSAgICBzd2l0Y2ggKG1DdXJyZW50U2VjdGlvbikgewordm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6UGFyc2VyOjplbmRFbGVtZW50SGFuZGxlcihjb25zdCBjaGFyICpuYW1lKSB7CisgICAgLy8gWE1MUGFyc2VyIGhhbmRsZXMgdGFnIG1hdGNoaW5nLCBzbyB3ZSByZWFsbHkganVzdCBuZWVkIHRvIGhhbmRsZSB0aGUgc2VjdGlvbiBzdGF0ZSBoZXJlCisgICAgU2VjdGlvbiBzZWN0aW9uID0gbVN0YXRlLT5zZWN0aW9uKCk7CisgICAgc3dpdGNoIChzZWN0aW9uKSB7CisgICAgICAgIGNhc2UgU0VDVElPTl9JTkNMVURFOgorICAgICAgICB7CisgICAgICAgICAgICAvLyB0aGlzIGNvdWxkIGFsc28gYmUgYW55IG9mOiBJbmNsdWRlZCwgTWVkaWFDb2RlY3MKKyAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiSW5jbHVkZSIpKSB7CisgICAgICAgICAgICAgICAgbVN0YXRlLT5leGl0U2VjdGlvbigpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBTRUNUSU9OX1NFVFRJTkdTOgogICAgICAgICB7CisgICAgICAgICAgICAvLyB0aGlzIGNvdWxkIGFsc28gYmUgYW55IG9mOiBEb21haW4sIFZhcmlhbnQsIFNldHRpbmcKICAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiU2V0dGluZ3MiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fVE9QTEVWRUw7CisgICAgICAgICAgICAgICAgbVN0YXRlLT5leGl0U2VjdGlvbigpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIFNFQ1RJT05fREVDT0RFUlM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiRGVjb2RlcnMiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fVE9QTEVWRUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCiAgICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSUzoKKyAgICAgICAgY2FzZSBTRUNUSU9OX1VOS05PV046CiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiRW5jb2RlcnMiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fVE9QTEVWRUw7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtU3RhdGUtPmV4aXRTZWN0aW9uKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSX1RZUEU6CiAgICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSX1RZUEU6CiAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHRoaXMgY291bGQgYWxzbyBiZSBhbnkgb2Y6IEFsaWFzLCBMaW1pdCwgRmVhdHVyZQogICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJUeXBlIikpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgKG1DdXJyZW50U2VjdGlvbiA9PSBTRUNUSU9OX0RFQ09ERVJfVFlQRSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBTRUNUSU9OX0RFQ09ERVIgOiBTRUNUSU9OX0VOQ09ERVIpOwotCi0gICAgICAgICAgICAgICAgbUN1cnJlbnRUeXBlID0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuZW5kKCk7CisgICAgICAgICAgICAgICAgbVN0YXRlLT5leGl0U2VjdGlvbigpOworICAgICAgICAgICAgICAgIG1TdGF0ZS0+ZXhpdENvZGVjT3JUeXBlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc3RyRXEobmFtZSwgIk1lZGlhQ29kZWMiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fREVDT0RFUlM7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnROYW1lLmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCiAgICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSOgogICAgICAgICB7CisgICAgICAgICAgICAvLyB0aGlzIGNvdWxkIGFsc28gYmUgYW55IG9mOiBBbGlhcywgTGltaXQsIFF1aXJrLCBWYXJpYW50CiAgICAgICAgICAgICBpZiAoc3RyRXEobmFtZSwgIk1lZGlhQ29kZWMiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fRU5DT0RFUlM7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnROYW1lLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbVN0YXRlLT5leGl0U2VjdGlvbigpOworICAgICAgICAgICAgICAgIG1TdGF0ZS0+ZXhpdENvZGVjT3JUeXBlKCk7CisgICAgICAgICAgICAgICAgbVN0YXRlLT5leGl0VmFyaWFudHMoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBTRUNUSU9OX0lOQ0xVREU6CisgICAgICAgIGNhc2UgU0VDVElPTl9WQVJJQU5UOgogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc3RyRXEobmFtZSwgIkluY2x1ZGUiKSAmJiAobVNlY3Rpb25TdGFjay5zaXplKCkgPiAwKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IG1TZWN0aW9uU3RhY2suYmFjaygpOwotICAgICAgICAgICAgICAgIG1TZWN0aW9uU3RhY2sucG9wX2JhY2soKTsKKyAgICAgICAgICAgIC8vIHRoaXMgY291bGQgYWxzbyBiZSBhbnkgb2Y6IEFsaWFzLCBMaW1pdCwgUXVpcmsKKyAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiVmFyaWFudCIpKSB7CisgICAgICAgICAgICAgICAgbVN0YXRlLT5leGl0U2VjdGlvbigpOworICAgICAgICAgICAgICAgIG1TdGF0ZS0+ZXhpdFZhcmlhbnRzKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTQzMCwyNDMgKzgyNCwzMDIgQEAKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KLQogfQogCi1zdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6YWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzKGNvbnN0IGNoYXIgKiphdHRycykgewotICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBudWxscHRyOwotICAgIGNvbnN0IGNoYXIgKnZhbHVlID0gbnVsbHB0cjsKLSAgICBjb25zdCBjaGFyICp1cGRhdGUgPSBudWxscHRyOworc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlBhcnNlcjo6YWRkU2V0dGluZyhjb25zdCBjaGFyICoqYXR0cnMsIGNvbnN0IGNoYXIgKnByZWZpeCkgeworICAgIGNvbnN0IGNoYXIgKmFfbmFtZSA9IG51bGxwdHI7CisgICAgY29uc3QgY2hhciAqYV92YWx1ZSA9IG51bGxwdHI7CisgICAgY29uc3QgY2hhciAqYV91cGRhdGUgPSBudWxscHRyOworICAgIGJvb2wgaXNCb29sZWFuID0gZmFsc2U7CiAKICAgICBzaXplX3QgaSA9IDA7CiAgICAgd2hpbGUgKGF0dHJzW2ldICE9IG51bGxwdHIpIHsKLSAgICAgICAgaWYgKHN0ckVxKGF0dHJzW2ldLCAibmFtZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImFkZFNldHRpbmdGcm9tQXR0cmlidXRlczogbmFtZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5hbWUgPSBhdHRyc1tpXTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInZhbHVlIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzOiB2YWx1ZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhbHVlID0gYXR0cnNbaV07Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJ1cGRhdGUiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXM6IHVwZGF0ZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVwZGF0ZSA9IGF0dHJzW2ldOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoImFkZFNldHRpbmdGcm9tQXR0cmlidXRlczogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJXMiLCBhdHRyc1tpXSk7CisgICAgICAgIENIRUNLKChpICYgMSkgPT0gMCk7CisgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgUExPR0QoIlNldHRpbmc6IGF0dHJpYnV0ZSAnJXMnIGlzIG51bGwiLCBhdHRyc1tpXSk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0ckVxKGF0dHJzW2ldLCAibmFtZSIpKSB7CisgICAgICAgICAgICBhX25hbWUgPSBhdHRyc1srK2ldOworICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAidmFsdWUiKSB8fCBzdHJFcShhdHRyc1tpXSwgImVuYWJsZWQiKSkgeworICAgICAgICAgICAgaWYgKGFfdmFsdWUpIHsKKyAgICAgICAgICAgICAgICBQTE9HRCgiU2V0dGluZzogcmVkdW5kYW50IGF0dHJpYnV0ZSAnJXMnIiwgYXR0cnNbaV0pOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpc0Jvb2xlYW4gPSBzdHJFcShhdHRyc1tpXSwgImVuYWJsZWQiKTsKKyAgICAgICAgICAgIGFfdmFsdWUgPSBhdHRyc1srK2ldOworICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAidXBkYXRlIikpIHsKKyAgICAgICAgICAgIGFfdXBkYXRlID0gYXR0cnNbKytpXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFBMT0dEKCJTZXR0aW5nOiBpZ25vcmluZyB1bnJlY29nbml6ZWQgYXR0cmlidXRlICclcyciLCBhdHRyc1tpXSk7CisgICAgICAgICAgICArK2k7CisgICAgICAgIH0KICAgICAgICAgKytpOwogICAgIH0KIAotICAgIGlmIChuYW1lID09IG51bGxwdHIgfHwgdmFsdWUgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiYWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzOiBuYW1lIG9yIHZhbHVlIHVuc3BlY2lmaWVkIik7CisgICAgaWYgKGFfbmFtZSA9PSBudWxscHRyIHx8IGFfdmFsdWUgPT0gbnVsbHB0cikgeworICAgICAgICBQTE9HRCgiU2V0dGluZyB3aXRoIG5vICduYW1lJyBvciAndmFsdWUnIGF0dHJpYnV0ZSIpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIC8vIEJvb2xlYW4gdmFsdWVzIGFyZSBjb252ZXJ0ZWQgdG8gIjAiIG9yICIxIi4KLSAgICBpZiAoc3RySGFzUHJlZml4KG5hbWUsICJzdXBwb3J0cy0iKSkgewotICAgICAgICB2YWx1ZSA9IHBhcnNlQm9vbGVhbih2YWx1ZSkgPyAiMSIgOiAiMCI7CisgICAgaWYgKHN0ckhhc1ByZWZpeChhX25hbWUsICJzdXBwb3J0cy0iKSB8fCBpc0Jvb2xlYW4pIHsKKyAgICAgICAgYV92YWx1ZSA9IHBhcnNlQm9vbGVhbihhX3ZhbHVlKSA/ICIxIiA6ICIwIjsKICAgICB9CiAKLSAgICBtVXBkYXRlID0gKHVwZGF0ZSAhPSBudWxscHRyKSAmJiBwYXJzZUJvb2xlYW4odXBkYXRlKTsKLSAgICBhdXRvIGF0dHJpYnV0ZSA9IG1TZXJ2aWNlQXR0cmlidXRlTWFwLmZpbmQobmFtZSk7CisgICAgYm9vbCB1cGRhdGUgPSAoYV91cGRhdGUgIT0gbnVsbHB0cikgJiYgcGFyc2VCb29sZWFuKGFfdXBkYXRlKTsKKyAgICBSZXN1bHQgcmVzID0gbVN0YXRlLT5kYXRhKCkuYWRkR2xvYmFsKHN0ZDo6c3RyaW5nKHByZWZpeCA/IDogIiIpICsgYV9uYW1lLCBhX3ZhbHVlLCB1cGRhdGUpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgUExPR0QoIlNldHRpbmc6ICVzIiwgcmVzLmVycm9yKCkuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK01lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpSZXN1bHQgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OkRhdGE6OmFkZEdsb2JhbCgKKyAgICAgICAgc3RkOjpzdHJpbmcga2V5LCBzdGQ6OnN0cmluZyB2YWx1ZSwgYm9vbCB1cGRhdGluZykgeworICAgIGF1dG8gYXR0cmlidXRlID0gbVNlcnZpY2VBdHRyaWJ1dGVNYXAuZmluZChrZXkpOwogICAgIGlmIChhdHRyaWJ1dGUgPT0gbVNlcnZpY2VBdHRyaWJ1dGVNYXAuZW5kKCkpIHsgLy8gTmV3IGF0dHJpYnV0ZSBuYW1lCi0gICAgICAgIGlmIChtVXBkYXRlKSB7Ci0gICAgICAgICAgICBBTE9HRSgiYWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzOiB1cGRhdGluZyBub24tZXhpc3Rpbmcgc2V0dGluZyIpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgaWYgKHVwZGF0aW5nKSB7CisgICAgICAgICAgICByZXR1cm4geyBOQU1FX05PVF9GT1VORCwgImNhbm5vdCB1cGRhdGUgbm9uLWV4aXN0aW5nIHNldHRpbmciIH07CiAgICAgICAgIH0KLSAgICAgICAgbVNlcnZpY2VBdHRyaWJ1dGVNYXAuaW5zZXJ0KEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSkpOworICAgICAgICBtU2VydmljZUF0dHJpYnV0ZU1hcC5pbnNlcnQoQXR0cmlidXRlKGtleSwgdmFsdWUpKTsKICAgICB9IGVsc2UgeyAvLyBFeGlzdGluZyBhdHRyaWJ1dGUgbmFtZQotICAgICAgICBpZiAoIW1VcGRhdGUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXM6IGFkZGluZyBleGlzdGluZyBzZXR0aW5nIik7Ci0gICAgICAgIH0KICAgICAgICAgYXR0cmlidXRlLT5zZWNvbmQgPSB2YWx1ZTsKKyAgICAgICAgaWYgKCF1cGRhdGluZykgeworICAgICAgICAgICAgcmV0dXJuIHsgQUxSRUFEWV9FWElTVFMsICJ1cGRhdGluZyBleGlzdGluZyBzZXR0aW5nIiB9OworICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6YWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzKAotICAgICAgICBib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKiphdHRycykgewotICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBudWxscHRyOwotICAgIGNvbnN0IGNoYXIgKnR5cGUgPSBudWxscHRyOwotICAgIGNvbnN0IGNoYXIgKnVwZGF0ZSA9IG51bGxwdHI7CitzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6UGFyc2VyOjplbnRlck1lZGlhQ29kZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKiphdHRycywgYm9vbCBlbmNvZGVyKSB7CisgICAgY29uc3QgY2hhciAqYV9uYW1lID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyICphX3R5cGUgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIgKmFfdXBkYXRlID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyICphX3JhbmsgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIgKmFfZG9tYWluID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyICphX3ZhcmlhbnQgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIgKmFfZW5hYmxlZCA9IG51bGxwdHI7CiAKICAgICBzaXplX3QgaSA9IDA7CiAgICAgd2hpbGUgKGF0dHJzW2ldICE9IG51bGxwdHIpIHsKLSAgICAgICAgaWYgKHN0ckVxKGF0dHJzW2ldLCAibmFtZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogbmFtZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5hbWUgPSBhdHRyc1tpXTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInR5cGUiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXM6IHR5cGUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0eXBlID0gYXR0cnNbaV07Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJ1cGRhdGUiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXM6IHVwZGF0ZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVwZGF0ZSA9IGF0dHJzW2ldOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJXMiLCBhdHRyc1tpXSk7CisgICAgICAgIENIRUNLKChpICYgMSkgPT0gMCk7CisgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgUExPR0QoIk1lZGlhQ29kZWM6IGF0dHJpYnV0ZSAnJXMnIGlzIG51bGwiLCBhdHRyc1tpXSk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0ckVxKGF0dHJzW2ldLCAibmFtZSIpKSB7CisgICAgICAgICAgICBhX25hbWUgPSBhdHRyc1srK2ldOworICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAidHlwZSIpKSB7CisgICAgICAgICAgICBhX3R5cGUgPSBhdHRyc1srK2ldOworICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAidXBkYXRlIikpIHsKKyAgICAgICAgICAgIGFfdXBkYXRlID0gYXR0cnNbKytpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInJhbmsiKSkgeworICAgICAgICAgICAgYV9yYW5rID0gYXR0cnNbKytpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgImRvbWFpbiIpKSB7CisgICAgICAgICAgICBhX2RvbWFpbiA9IGF0dHJzWysraV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJ2YXJpYW50IikpIHsKKyAgICAgICAgICAgIGFfdmFyaWFudCA9IGF0dHJzWysraV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJlbmFibGVkIikpIHsKKyAgICAgICAgICAgIGFfZW5hYmxlZCA9IGF0dHJzWysraV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQTE9HRCgiTWVkaWFDb2RlYzogaWdub3JpbmcgdW5yZWNvZ25pemVkIGF0dHJpYnV0ZSAnJXMnIiwgYXR0cnNbaV0pOworICAgICAgICAgICAgKytpOworICAgICAgICB9CiAgICAgICAgICsraTsKICAgICB9CiAKLSAgICBpZiAobmFtZSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXM6IG5hbWUgbm90IGZvdW5kIik7CisgICAgaWYgKGFfbmFtZSA9PSBudWxscHRyKSB7CisgICAgICAgIFBMT0dEKCJNZWRpYUNvZGVjIHdpdGggbm8gJ25hbWUnIGF0dHJpYnV0ZSIpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIG1VcGRhdGUgPSAodXBkYXRlICE9IG51bGxwdHIpICYmIHBhcnNlQm9vbGVhbih1cGRhdGUpOwotICAgIG1DdXJyZW50Q29kZWMgPSBtQ29kZWNNYXAuZmluZChuYW1lKTsKLSAgICBpZiAobUN1cnJlbnRDb2RlYyA9PSBtQ29kZWNNYXAuZW5kKCkpIHsgLy8gTmV3IGNvZGVjIG5hbWUKLSAgICAgICAgaWYgKG1VcGRhdGUpIHsKLSAgICAgICAgICAgIEFMT0dXKCJhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXM6IGNhbm5vdCB1cGRhdGUgIgotICAgICAgICAgICAgICAgICAgIm5vbi1leGlzdGluZyBjb2RlYyBcIiVzXCIuIiwgbmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIGJvb2wgdXBkYXRlID0gKGFfdXBkYXRlICE9IG51bGxwdHIpICYmIHBhcnNlQm9vbGVhbihhX3VwZGF0ZSk7CisgICAgaWYgKGFfZG9tYWluICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gZGlzYWJsZSBjb2RlY3Mgd2l0aCBkb21haW4gYnkgZGVmYXVsdCAodW5sZXNzIHVwZGF0aW5nKQorICAgICAgICBpZiAoIWFfZW5hYmxlZCAmJiAhdXBkYXRlKSB7CisgICAgICAgICAgICBhX2VuYWJsZWQgPSAiZmFsc2UiOworICAgICAgICB9CisgICAgfQorCisgICAgUmVzdWx0IHJlcyA9IG1TdGF0ZS0+ZW50ZXJNZWRpYUNvZGVjKGVuY29kZXIsIGFfbmFtZSwgYV90eXBlLCB1cGRhdGUpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgbG9nQW55RXJyb3JzKHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcmV0dXJuIHVwZGF0ZU1lZGlhQ29kZWMoCisgICAgICAgICAgICBhX3JhbmssIHBhcnNlQ29tbWFTZXBhcmF0ZWRTdHJpbmdTZXQoYV9kb21haW4pLAorICAgICAgICAgICAgcGFyc2VDb21tYVNlcGFyYXRlZFN0cmluZ1NldChhX3ZhcmlhbnQpLCBhX2VuYWJsZWQpOworfQorCitNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6UmVzdWx0CitNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6U3RhdGU6OmVudGVyTWVkaWFDb2RlYygKKyAgICAgICAgYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp0eXBlLCBib29sIHVwZGF0aW5nKSB7CisgICAgLy8gc3RvcmUgbmFtZSBldmVuIGluIGNhc2Ugb2YgYW4gZXJyb3IKKyAgICBDb2RlY01hcDo6aXRlcmF0b3IgY29kZWNJdCA9IG1EYXRhLT5tQ29kZWNNYXAuZmluZChuYW1lKTsKKyAgICBUeXBlTWFwOjppdGVyYXRvciB0eXBlSXQ7CisgICAgaWYgKGNvZGVjSXQgPT0gbURhdGEtPm1Db2RlY01hcC5lbmQoKSkgeyAvLyBOZXcgY29kZWMgbmFtZQorICAgICAgICBpZiAodXBkYXRpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiB7IE5BTUVfTk9UX0ZPVU5ELCAiTWVkaWFDb2RlYzogY2Fubm90IHVwZGF0ZSBub24tZXhpc3RpbmcgY29kZWMiIH07CiAgICAgICAgIH0KICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGNvZGVjIGluIG1Db2RlY01hcAotICAgICAgICBtQ3VycmVudENvZGVjID0gbUNvZGVjTWFwLmluc2VydCgKLSAgICAgICAgICAgICAgICBDb2RlYyhuYW1lLCBDb2RlY1Byb3BlcnRpZXMoKSkpLmZpcnN0OworICAgICAgICBjb2RlY0l0ID0gbURhdGEtPm1Db2RlY01hcC5pbnNlcnQoQ29kZWMobmFtZSwgQ29kZWNQcm9wZXJ0aWVzKCkpKS5maXJzdDsKICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgbUN1cnJlbnRUeXBlID0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuaW5zZXJ0KAotICAgICAgICAgICAgICAgICAgICBUeXBlKHR5cGUsIEF0dHJpYnV0ZU1hcCgpKSkuZmlyc3Q7CisgICAgICAgICAgICB0eXBlSXQgPSBjb2RlY0l0LT5zZWNvbmQudHlwZU1hcC5pbnNlcnQoVHlwZSh0eXBlLCBBdHRyaWJ1dGVNYXAoKSkpLmZpcnN0OwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUN1cnJlbnRUeXBlID0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuZW5kKCk7CisgICAgICAgICAgICB0eXBlSXQgPSBjb2RlY0l0LT5zZWNvbmQudHlwZU1hcC5lbmQoKTsKICAgICAgICAgfQotICAgICAgICBtQ3VycmVudENvZGVjLT5zZWNvbmQuaXNFbmNvZGVyID0gZW5jb2RlcjsKLSAgICAgICAgbUN1cnJlbnRDb2RlYy0+c2Vjb25kLm9yZGVyID0gbUNvZGVjQ291bnRlcisrOworICAgICAgICBjb2RlY0l0LT5zZWNvbmQuaXNFbmNvZGVyID0gZW5jb2RlcjsKKyAgICAgICAgY29kZWNJdC0+c2Vjb25kLm9yZGVyID0gbURhdGEtPm1Db2RlY01hcC5zaXplKCk7CiAgICAgfSBlbHNlIHsgLy8gRXhpc3RpbmcgY29kZWMgbmFtZQotICAgICAgICBpZiAoIW1VcGRhdGUpIHsKLSAgICAgICAgICAgIEFMT0dXKCJhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXM6IHRyeWluZyB0byBhZGQgIgotICAgICAgICAgICAgICAgICAgImV4aXN0aW5nIGNvZGVjIFwiJXNcIiIsIG5hbWUpOwotICAgICAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgICAgICBpZiAoIXVwZGF0aW5nKSB7CisgICAgICAgICAgICByZXR1cm4geyBBTFJFQURZX0VYSVNUUywgIk1lZGlhQ29kZWM6IGNhbm5vdCBhZGQgZXhpc3RpbmcgY29kZWMiIH07CiAgICAgICAgIH0KICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgbUN1cnJlbnRUeXBlID0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuZmluZCh0eXBlKTsKLSAgICAgICAgICAgIGlmIChtQ3VycmVudFR5cGUgPT0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiBjYW5ub3QgdXBkYXRlICIKLSAgICAgICAgICAgICAgICAgICAgICAibm9uLWV4aXN0aW5nIHR5cGUgXCIlc1wiIGZvciBjb2RlYyBcIiVzXCIiLAotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIHR5cGVJdCA9IGNvZGVjSXQtPnNlY29uZC50eXBlTWFwLmZpbmQodHlwZSk7CisgICAgICAgICAgICBpZiAodHlwZUl0ID09IGNvZGVjSXQtPnNlY29uZC50eXBlTWFwLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHsgTkFNRV9OT1RfRk9VTkQsICJNZWRpYUNvZGVjOiBjYW5ub3QgdXBkYXRlIG5vbi1leGlzdGluZyB0eXBlIGZvciBjb2RlYyIgfTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGhhcHBlbiBvbmx5IHdoZW4gdGhlIGNvZGVjIGhhcyBhdCBtb3N0IG9uZSB0eXBlLgotICAgICAgICAgICAgbUN1cnJlbnRUeXBlID0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuYmVnaW4oKTsKLSAgICAgICAgICAgIGlmIChtQ3VycmVudFR5cGUgPT0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiBjYW5ub3QgdXBkYXRlICIKLSAgICAgICAgICAgICAgICAgICAgICAiY29kZWMgXCIlc1wiIHdpdGhvdXQgdHlwZSBzcGVjaWZpZWQiLCBuYW1lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgdHlwZUl0ID0gY29kZWNJdC0+c2Vjb25kLnR5cGVNYXAuYmVnaW4oKTsKKyAgICAgICAgICAgIGlmICh0eXBlSXQgPT0gY29kZWNJdC0+c2Vjb25kLnR5cGVNYXAuZW5kKCkKKyAgICAgICAgICAgICAgICAgICAgfHwgY29kZWNJdC0+c2Vjb25kLnR5cGVNYXAuc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4geyBCQURfVkFMVUUsICJNZWRpYUNvZGVjOiBjYW5ub3QgdXBkYXRlIGNvZGVjIHdpdGhvdXQgdHlwZSBzcGVjaWZpZWQiIH07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBtQ3VycmVudC5lbXBsYWNlX2JhY2soQ29kZWNBbmRUeXBle25hbWUsIGNvZGVjSXQsIHR5cGVJdCwgdXBkYXRpbmd9KTsKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjphZGRRdWlyayhjb25zdCBjaGFyICoqYXR0cnMpIHsKLSAgICBpZiAobUN1cnJlbnRDb2RlYyA9PSBtQ29kZWNNYXAuZW5kKCkpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKK3N0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpQYXJzZXI6OnVwZGF0ZU1lZGlhQ29kZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKnJhbmssIGNvbnN0IFN0cmluZ1NldCAmZG9tYWlucywgY29uc3QgU3RyaW5nU2V0ICZ2YXJpYW50cywKKyAgICAgICAgY29uc3QgY2hhciAqZW5hYmxlZCkgeworICAgIENIRUNLKG1TdGF0ZS0+aW5Db2RlYygpKTsKKyAgICBDb2RlY1Byb3BlcnRpZXMgJmNvZGVjID0gbVN0YXRlLT5jb2RlYygpOworCisgICAgaWYgKHJhbmsgIT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRF9JRighY29kZWMucmFuay5lbXB0eSgpICYmIGNvZGVjLnJhbmsgIT0gcmFuaywKKyAgICAgICAgICAgICAgICAiY29kZWMgJyVzJyByYW5rIGNoYW5nZWQgZnJvbSAnJXMnIHRvICclcyciLAorICAgICAgICAgICAgICAgIG1TdGF0ZS0+Y29kZWNOYW1lKCkuY19zdHIoKSwgY29kZWMucmFuay5jX3N0cigpLCByYW5rKTsKKyAgICAgICAgY29kZWMucmFuayA9IHJhbms7CiAgICAgfQogCi0gICAgY29uc3QgY2hhciAqbmFtZSA9IG51bGxwdHI7CisgICAgY29kZWMudmFyaWFudFNldCA9IHZhcmlhbnRzOworCisgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyAmZG9tYWluIDogZG9tYWlucykgeworICAgICAgICBpZiAoZG9tYWluLnNpemUoKSAmJiBkb21haW4uYXQoMCkgPT0gJyEnKSB7CisgICAgICAgICAgICBjb2RlYy5kb21haW5TZXQuZXJhc2UoZG9tYWluLnN1YnN0cigxKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb2RlYy5kb21haW5TZXQuZW1wbGFjZShkb21haW4pOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGVuYWJsZWQgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAocGFyc2VCb29sZWFuKGVuYWJsZWQpKSB7CisgICAgICAgICAgICBjb2RlYy5xdWlya1NldC5lcmFzZSgiYXR0cmlidXRlOjpkaXNhYmxlZCIpOworICAgICAgICAgICAgQUxPR0QoImVuYWJsaW5nICVzIiwgbVN0YXRlLT5jb2RlY05hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvZGVjLnF1aXJrU2V0LmVtcGxhY2UoImF0dHJpYnV0ZTo6ZGlzYWJsZWQiKTsKKyAgICAgICAgICAgIEFMT0dEKCJkaXNhYmxpbmcgJXMiLCBtU3RhdGUtPmNvZGVjTmFtZSgpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlBhcnNlcjo6YWRkUXVpcmsoY29uc3QgY2hhciAqKmF0dHJzLCBjb25zdCBjaGFyICpwcmVmaXgpIHsKKyAgICBDSEVDSyhtU3RhdGUtPmluQ29kZWMoKSk7CisgICAgY29uc3QgY2hhciAqYV9uYW1lID0gbnVsbHB0cjsKIAogICAgIHNpemVfdCBpID0gMDsKICAgICB3aGlsZSAoYXR0cnNbaV0gIT0gbnVsbHB0cikgewotICAgICAgICBpZiAoc3RyRXEoYXR0cnNbaV0sICJuYW1lIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkUXVpcms6IG5hbWUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuYW1lID0gYXR0cnNbaV07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiYWRkUXVpcms6IHVucmVjb2duaXplZCBhdHRyaWJ1dGU6ICVzIiwgYXR0cnNbaV0pOworICAgICAgICBDSEVDSygoaSAmIDEpID09IDApOworICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIFBMT0dEKCJRdWlyazogYXR0cmlidXRlICclcycgaXMgbnVsbCIsIGF0dHJzW2ldKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KKworICAgICAgICBpZiAoc3RyRXEoYXR0cnNbaV0sICJuYW1lIikpIHsKKyAgICAgICAgICAgIGFfbmFtZSA9IGF0dHJzWysraV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQTE9HRCgiUXVpcms6IGlnbm9yaW5nIHVucmVjb2duaXplZCBhdHRyaWJ1dGUgJyVzJyIsIGF0dHJzW2ldKTsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgfQogICAgICAgICArK2k7CiAgICAgfQogCi0gICAgaWYgKG5hbWUgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiYWRkUXVpcms6IG5hbWUgbm90IGZvdW5kIik7CisgICAgaWYgKGFfbmFtZSA9PSBudWxscHRyKSB7CisgICAgICAgIFBMT0dEKCJRdWlyayB3aXRoIG5vICduYW1lJyBhdHRyaWJ1dGUiKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBtQ3VycmVudENvZGVjLT5zZWNvbmQucXVpcmtTZXQuZW1wbGFjZShuYW1lKTsKKyAgICBzdGQ6OnN0cmluZyBrZXkgPSBzdGQ6OnN0cmluZyhwcmVmaXggPyA6ICIiKSArIGFfbmFtZTsKKyAgICBtU3RhdGUtPmNvZGVjKCkucXVpcmtTZXQuZW1wbGFjZShrZXkpOworICAgIEFMT0dWKCJhZGRpbmcgJXMgdG8gJXMiLCBrZXkuY19zdHIoKSwgbVN0YXRlLT5jb2RlY05hbWUoKS5jX3N0cigpKTsKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjphZGRUeXBlRnJvbUF0dHJpYnV0ZXMoY29uc3QgY2hhciAqKmF0dHJzLCBib29sIGVuY29kZXIpIHsKLSAgICBpZiAobUN1cnJlbnRDb2RlYyA9PSBtQ29kZWNNYXAuZW5kKCkpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9CitzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6UGFyc2VyOjplbnRlclR5cGUoY29uc3QgY2hhciAqKmF0dHJzKSB7CisgICAgQ0hFQ0sobVN0YXRlLT5pbkNvZGVjKCkpOwogCi0gICAgY29uc3QgY2hhciAqbmFtZSA9IG51bGxwdHI7Ci0gICAgY29uc3QgY2hhciAqdXBkYXRlID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyICphX25hbWUgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIgKmFfdXBkYXRlID0gbnVsbHB0cjsKIAogICAgIHNpemVfdCBpID0gMDsKICAgICB3aGlsZSAoYXR0cnNbaV0gIT0gbnVsbHB0cikgeworICAgICAgICBDSEVDSygoaSAmIDEpID09IDApOworICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIFBMT0dEKCJUeXBlOiBhdHRyaWJ1dGUgJyVzJyBpcyBudWxsIiwgYXR0cnNbaV0pOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChzdHJFcShhdHRyc1tpXSwgIm5hbWUiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRUeXBlRnJvbUF0dHJpYnV0ZXM6IG5hbWUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuYW1lID0gYXR0cnNbaV07CisgICAgICAgICAgICBhX25hbWUgPSBhdHRyc1srK2ldOwogICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAidXBkYXRlIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkVHlwZUZyb21BdHRyaWJ1dGVzOiB1cGRhdGUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1cGRhdGUgPSBhdHRyc1tpXTsKKyAgICAgICAgICAgIGFfdXBkYXRlID0gYXR0cnNbKytpXTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJhZGRUeXBlRnJvbUF0dHJpYnV0ZXM6IHVucmVjb2duaXplZCBhdHRyaWJ1dGU6ICVzIiwgYXR0cnNbaV0pOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIFBMT0dEKCJUeXBlOiBpZ25vcmluZyB1bnJlY29nbml6ZWQgYXR0cmlidXRlICclcyciLCBhdHRyc1tpXSk7CisgICAgICAgICAgICArK2k7CiAgICAgICAgIH0KICAgICAgICAgKytpOwogICAgIH0KIAotICAgIGlmIChuYW1lID09IG51bGxwdHIpIHsKKyAgICBpZiAoYV9uYW1lID09IG51bGxwdHIpIHsKKyAgICAgICAgUExPR0QoIlR5cGUgd2l0aCBubyAnbmFtZScgYXR0cmlidXRlIik7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgbUN1cnJlbnRDb2RlYy0+c2Vjb25kLmlzRW5jb2RlciA9IGVuY29kZXI7Ci0gICAgbUN1cnJlbnRUeXBlID0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuZmluZChuYW1lKTsKLSAgICBpZiAoIW1VcGRhdGUpIHsKLSAgICAgICAgaWYgKG1DdXJyZW50VHlwZSAhPSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5lbmQoKSkgewotICAgICAgICAgICAgQUxPR1coImFkZFR5cGVGcm9tQXR0cmlidXRlczogdHJ5aW5nIHRvIHVwZGF0ZSAiCi0gICAgICAgICAgICAgICAgICAiZXhpc3RpbmcgdHlwZSBcIiVzXCIiLCBuYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKKyAgICBib29sIHVwZGF0ZSA9IChhX3VwZGF0ZSAhPSBudWxscHRyKSAmJiBwYXJzZUJvb2xlYW4oYV91cGRhdGUpOworICAgIHJldHVybiBtU3RhdGUtPmVudGVyVHlwZShhX25hbWUsIHVwZGF0ZSk7Cit9CisKK01lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpSZXN1bHQKK01lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpTdGF0ZTo6ZW50ZXJUeXBlKGNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgdXBkYXRlKSB7CisgICAgdXBkYXRlID0gdXBkYXRlIHx8IHVwZGF0aW5nKCk7IC8vIGhhbmRsZSBwYXJlbnQKKworICAgIENvZGVjTWFwOjppdGVyYXRvciBjb2RlY0l0ID0gbUN1cnJlbnQuYmFjaygpLm1Db2RlYzsKKyAgICBUeXBlTWFwOjppdGVyYXRvciB0eXBlSXQgPSBjb2RlY0l0LT5zZWNvbmQudHlwZU1hcC5maW5kKG5hbWUpOworICAgIGlmICghdXBkYXRlKSB7CisgICAgICAgIGlmICh0eXBlSXQgIT0gY29kZWNJdC0+c2Vjb25kLnR5cGVNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB7IEFMUkVBRFlfRVhJU1RTLCAidHJ5aW5nIHRvIHVwZGF0ZSBleGlzdGluZyB0eXBlICciICsgc3RkOjpzdHJpbmcobmFtZSkgKyAiJyIgfTsKICAgICAgICAgfQotICAgICAgICBtQ3VycmVudFR5cGUgPSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5pbnNlcnQoCi0gICAgICAgICAgICAgICAgVHlwZShuYW1lLCBBdHRyaWJ1dGVNYXAoKSkpLmZpcnN0OwotICAgIH0gZWxzZSBpZiAobUN1cnJlbnRUeXBlID09IG1DdXJyZW50Q29kZWMtPnNlY29uZC50eXBlTWFwLmVuZCgpKSB7Ci0gICAgICAgIEFMT0dFKCJhZGRUeXBlRnJvbUF0dHJpYnV0ZXM6IHVwZGF0aW5nIG5vbi1leGlzdGluZyB0eXBlIik7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIHR5cGVJdCA9IGNvZGVjSXQtPnNlY29uZC50eXBlTWFwLmluc2VydChUeXBlKG5hbWUsIEF0dHJpYnV0ZU1hcCgpKSkuZmlyc3Q7CisgICAgfSBlbHNlIGlmICh0eXBlSXQgPT0gY29kZWNJdC0+c2Vjb25kLnR5cGVNYXAuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIHsgTkFNRV9OT1RfRk9VTkQsICJhZGRUeXBlOiB1cGRhdGluZyBub24tZXhpc3RpbmcgdHlwZSIgfTsKICAgICB9CisgICAgbUN1cnJlbnQucHVzaF9iYWNrKHsgY29kZWNOYW1lKCksIGNvZGVjSXQsIHR5cGVJdCwgdXBkYXRlIH0pOworICAgIENIRUNLKGluVHlwZSgpKTsKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjphZGRMaW1pdChjb25zdCBjaGFyICoqYXR0cnMpIHsKLSAgICBpZiAobUN1cnJlbnRDb2RlYyA9PSBtQ29kZWNNYXAuZW5kKCkpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgaWYgKG1DdXJyZW50VHlwZSA9PSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5lbmQoKSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQorc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlBhcnNlcjo6YWRkTGltaXQoY29uc3QgY2hhciAqKmF0dHJzKSB7CisgICAgQ0hFQ0sobVN0YXRlLT5pblR5cGUoKSk7CiAgICAgY29uc3QgY2hhciogYV9uYW1lID0gbnVsbHB0cjsKICAgICBjb25zdCBjaGFyKiBhX2RlZmF1bHQgPSBudWxscHRyOwogICAgIGNvbnN0IGNoYXIqIGFfaW4gPSBudWxscHRyOwpAQCAtNjc5LDY5ICsxMTMyLDM5IEBACiAKICAgICBzaXplX3QgaSA9IDA7CiAgICAgd2hpbGUgKGF0dHJzW2ldICE9IG51bGxwdHIpIHsKLSAgICAgICAgaWYgKHN0ckVxKGF0dHJzW2ldLCAibmFtZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImFkZExpbWl0OiBuYW1lIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYV9uYW1lID0gYXR0cnNbaV07Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJkZWZhdWx0IikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IGRlZmF1bHQgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhX2RlZmF1bHQgPSBhdHRyc1tpXTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgImluIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IGluIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYV9pbiA9IGF0dHJzW2ldOwotICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAibWF4IikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IG1heCBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFfbWF4ID0gYXR0cnNbaV07Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJtaW4iKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogbWluIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYV9taW4gPSBhdHRyc1tpXTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInJhbmdlIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IHJhbmdlIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYV9yYW5nZSA9IGF0dHJzW2ldOwotICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAicmFuZ2VzIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IHJhbmdlcyBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFfcmFuZ2VzID0gYXR0cnNbaV07Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJzY2FsZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImFkZExpbWl0OiBzY2FsZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFfc2NhbGUgPSBhdHRyc1tpXTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInZhbHVlIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IHZhbHVlIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYV92YWx1ZSA9IGF0dHJzW2ldOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoImFkZExpbWl0OiB1bnJlY29nbml6ZWQgbGltaXQ6ICVzIiwgYXR0cnNbaV0pOworICAgICAgICBDSEVDSygoaSAmIDEpID09IDApOworICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIFBMT0dEKCJMaW1pdDogYXR0cmlidXRlICclcycgaXMgbnVsbCIsIGF0dHJzW2ldKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KKworICAgICAgICBpZiAoc3RyRXEoYXR0cnNbaV0sICJuYW1lIikpIHsKKyAgICAgICAgICAgIGFfbmFtZSA9IGF0dHJzWysraV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJkZWZhdWx0IikpIHsKKyAgICAgICAgICAgIGFfZGVmYXVsdCA9IGF0dHJzWysraV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJpbiIpKSB7CisgICAgICAgICAgICBhX2luID0gYXR0cnNbKytpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgIm1heCIpKSB7CisgICAgICAgICAgICBhX21heCA9IGF0dHJzWysraV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJtaW4iKSkgeworICAgICAgICAgICAgYV9taW4gPSBhdHRyc1srK2ldOworICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAicmFuZ2UiKSkgeworICAgICAgICAgICAgYV9yYW5nZSA9IGF0dHJzWysraV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJyYW5nZXMiKSkgeworICAgICAgICAgICAgYV9yYW5nZXMgPSBhdHRyc1srK2ldOworICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAic2NhbGUiKSkgeworICAgICAgICAgICAgYV9zY2FsZSA9IGF0dHJzWysraV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJ2YWx1ZSIpKSB7CisgICAgICAgICAgICBhX3ZhbHVlID0gYXR0cnNbKytpXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFBMT0dEKCJMaW1pdDogaWdub3JpbmcgdW5yZWNvZ25pemVkIGxpbWl0OiAlcyIsIGF0dHJzW2ldKTsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgfQogICAgICAgICArK2k7CiAgICAgfQogCiAgICAgaWYgKGFfbmFtZSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJsaW1pdCB3aXRoIG5vICduYW1lJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgUExPR0QoIkxpbWl0IHdpdGggbm8gJ25hbWUnIGF0dHJpYnV0ZSIpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIApAQCAtNzQ5LDggKzExNzIsNTAgQEAKICAgICAvLyBtZWFzdXJlZC1mcmFtZS1yYXRlLCBtZWFzdXJlZC1ibG9ja3MtcGVyLXNlY29uZDogcmFuZ2UKICAgICAvLyBxdWFsaXR5OiByYW5nZSArIGRlZmF1bHQgKyBbc2NhbGVdCiAgICAgLy8gY29tcGxleGl0eTogcmFuZ2UgKyBkZWZhdWx0Ci0gICAgc3RkOjpzdHJpbmcgcmFuZ2U7Ci0gICAgaWYgKHN0ckVxKGFfbmFtZSwgImFzcGVjdC1yYXRpbyIpIHx8CisgICAgc3RkOjpzdHJpbmcga2V5ID0gYV9uYW1lLCB2YWx1ZTsKKworICAgIC8vIGRvbid0IGFsbG93IHNwZWNpZnlpbmcgbW9yZSB0aGFuIG9uZSBvZiB2YWx1ZSwgcmFuZ2Ugb3IgbWluL21heAorICAgIGlmICgoYV92YWx1ZSAhPSBudWxscHRyKSArIChhX3JhbmdlICE9IG51bGxwdHIpICsgKGFfcmFuZ2VzICE9IG51bGxwdHIpCisgICAgICAgICAgICArIChhX21pbiAhPSBudWxscHRyIHx8IGFfbWF4ICE9IG51bGxwdHIpID4gMSkgeworICAgICAgICBQTE9HRCgiTGltaXQgJyVzJyBoYXMgbXVsdGlwbGUgJ21pbicvJ21heCcsICdyYW5nZScsICdyYW5nZXMnIG9yICd2YWx1ZScgYXR0cmlidXRlcyIsCisgICAgICAgICAgICAgICAgYV9uYW1lKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBNaW4vbWF4IGxpbWl0cyAob25seSBjb250YWluaW5nIG1pbiBvciBtYXggYXR0cmlidXRlKQorICAgIC8vCisgICAgLy8gQ3VycmVudCAibWF4IiBsaW1pdHMgYXJlICJjaGFubmVsLWNvdW50IiwgImNvbmN1cnJlbnQtaW5zdGFuY2VzIi4KKyAgICAvLyBUaGVyZSBhcmUgbm8gY3VycmVudCAibWluIiBsaW1pdHMKKyAgICAvLworICAgIC8vIFJhbmdlIGxpbWl0cy4gInJhbmdlIiBpcyBzcGVjaWZpZWQgaW4gZXhhY3RseSBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtczoKKyAgICAvLyAxKSBtaW4tbWF4CisgICAgLy8gMikgdmFsdWUtdmFsdWUKKyAgICAvLyAzKSByYW5nZQorICAgIC8vCisgICAgLy8gQ3VycmVudCByYW5nZSBsaW1pdHMgYXJlICJhc3BlY3QtcmF0aW8iLCAiYml0cmF0ZSIsICJibG9jay1jb3VudCIsICJibG9ja3MtcGVyLXNlY29uZCIsCisgICAgLy8gImNvbXBsZXhpdHkiLCAiZnJhbWUtcmF0ZSIsICJxdWFsaXR5IiwgInNpemUiLCAibWVhc3VyZWQtYmxvY2tzLXBlci1zZWNvbmQiLAorICAgIC8vICJwZXJmb3JtYW5jZS1wb2ludC0qIiwgIm1lYXN1cmVkLWZyYW1lLXJhdGUtKiIKKyAgICAvLworICAgIC8vIE90aGVyIGxpbWl0cyAoY29udGFpbmluZyBvbmx5IHZhbHVlIG9yIHJhbmdlcykKKyAgICAvLworICAgIC8vIEN1cnJlbnQgcmFuZ2VzIGxpbWl0IGlzICJzYW1wbGUtcmF0ZSIKKyAgICBpZiAoKGFfbWluICE9IG51bGxwdHIpIF4gKGFfbWF4ICE9IG51bGxwdHIpKSB7CisgICAgICAgIC8vIG1pbi9tYXggbGltaXQKKyAgICAgICAgaWYgKGFfbWF4ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGtleSA9ICJtYXgtIiArIGtleTsKKyAgICAgICAgICAgIHZhbHVlID0gYV9tYXg7CisgICAgICAgIH0gZWxzZSBpZiAoYV9taW4gIT0gbnVsbHB0cikgeworICAgICAgICAgICAga2V5ID0gIm1pbi0iICsga2V5OworICAgICAgICAgICAgdmFsdWUgPSBhX21pbjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYV9taW4gIT0gbnVsbHB0ciAmJiBhX21heCAhPSBudWxscHRyKSB7CisgICAgICAgIC8vIG1pbi1tYXgKKyAgICAgICAga2V5ICs9ICItcmFuZ2UiOworICAgICAgICB2YWx1ZSA9IGFfbWluICsgc3RkOjpzdHJpbmcoIi0iKSArIGFfbWF4OworICAgIH0gZWxzZSBpZiAoYV92YWx1ZSAhPSBudWxscHRyKSB7CisgICAgICAgIC8vIHZhbHVlLXZhbHVlIG9yIHZhbHVlCisgICAgICAgIHZhbHVlID0gYV92YWx1ZTsKKyAgICAgICAgaWYgKHN0ckVxKGFfbmFtZSwgImFzcGVjdC1yYXRpbyIpIHx8CiAgICAgICAgICAgICBzdHJFcShhX25hbWUsICJiaXRyYXRlIikgfHwKICAgICAgICAgICAgIHN0ckVxKGFfbmFtZSwgImJsb2NrLWNvdW50IikgfHwKICAgICAgICAgICAgIHN0ckVxKGFfbmFtZSwgImJsb2Nrcy1wZXItc2Vjb25kIikgfHwKQEAgLTc1OSwyMjIgKzEyMjQsMjAxIEBACiAgICAgICAgICAgICBzdHJFcShhX25hbWUsICJxdWFsaXR5IikgfHwKICAgICAgICAgICAgIHN0ckVxKGFfbmFtZSwgInNpemUiKSB8fAogICAgICAgICAgICAgc3RyRXEoYV9uYW1lLCAibWVhc3VyZWQtYmxvY2tzLXBlci1zZWNvbmQiKSB8fAorICAgICAgICAgICAgc3RySGFzUHJlZml4KGFfbmFtZSwgInBlcmZvcm1hbmNlLXBvaW50LSIpIHx8CiAgICAgICAgICAgICBzdHJIYXNQcmVmaXgoYV9uYW1lLCAibWVhc3VyZWQtZnJhbWUtcmF0ZS0iKSkgewotICAgICAgICAvLyAicmFuZ2UiIGlzIHNwZWNpZmllZCBpbiBleGFjdGx5IG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1zOgotICAgICAgICAvLyAxKSBtaW4tbWF4Ci0gICAgICAgIC8vIDIpIHZhbHVlLXZhbHVlCi0gICAgICAgIC8vIDMpIHJhbmdlCi0gICAgICAgIGlmIChhX21pbiAhPSBudWxscHRyICYmIGFfbWF4ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIC8vIG1pbi1tYXgKLSAgICAgICAgICAgIGlmIChhX3JhbmdlICE9IG51bGxwdHIgfHwgYV92YWx1ZSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0RXJyb3IoYV9uYW1lLCAiaGFzICdtaW4nIGFuZCAnbWF4JyBhcyB3ZWxsIGFzICdyYW5nZScgb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgIid2YWx1ZScgYXR0cmlidXRlcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmFuZ2UgPSBhX21pbjsKLSAgICAgICAgICAgIHJhbmdlICs9ICctJzsKLSAgICAgICAgICAgIHJhbmdlICs9IGFfbWF4OwotICAgICAgICB9IGVsc2UgaWYgKGFfbWluICE9IG51bGxwdHIgfHwgYV9tYXggIT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0RXJyb3IoYV9uYW1lLCAiaGFzIG9ubHkgJ21pbicgb3IgJ21heCcgYXR0cmlidXRlIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoYV92YWx1ZSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAvLyB2YWx1ZS12YWx1ZQotICAgICAgICAgICAgaWYgKGFfcmFuZ2UgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEVycm9yKGFfbmFtZSwgImhhcyBib3RoICdyYW5nZScgYW5kICd2YWx1ZScgYXR0cmlidXRlcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmFuZ2UgPSBhX3ZhbHVlOwotICAgICAgICAgICAgcmFuZ2UgKz0gJy0nOwotICAgICAgICAgICAgcmFuZ2UgKz0gYV92YWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChhX3JhbmdlID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEVycm9yKGFfbmFtZSwgIndpdGggbm8gJ3JhbmdlJywgJ3ZhbHVlJyBvciAnbWluJy8nbWF4JyBhdHRyaWJ1dGVzIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyByYW5nZQotICAgICAgICAgICAgcmFuZ2UgPSBhX3JhbmdlOworICAgICAgICAgICAga2V5ICs9ICItcmFuZ2UiOworICAgICAgICAgICAgdmFsdWUgKz0gc3RkOjpzdHJpbmcoIi0iKSArIGFfdmFsdWU7CiAgICAgICAgIH0KLQotICAgICAgICAvLyAiYXNwZWN0LXJhdGlvIiByZXF1aXJlcyBzb21lIHNwZWNpYWwgdHJlYXRtZW50LgotICAgICAgICBpZiAoc3RyRXEoYV9uYW1lLCAiYXNwZWN0LXJhdGlvIikpIHsKLSAgICAgICAgICAgIC8vICJhc3BlY3QtcmF0aW8iIG11c3QgaGF2ZSAiaW4iLgotICAgICAgICAgICAgaWYgKGFfaW4gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAiaW4iLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyAiaW4iIG11c3QgYmUgZWl0aGVyICJwaXhlbHMiIG9yICJibG9ja3MiLgotICAgICAgICAgICAgaWYgKCFzdHJFcShhX2luLCAicGl4ZWxzIikgJiYgIXN0ckVxKGFfaW4sICJibG9ja3MiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEludmFsaWRBdHRyKGFfbmFtZSwgImluIiwgYV9pbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBuYW1lIHdpbGwgYmUgInBpeGVsLWFzcGVjdC1yYXRpby1yYW5nZSIgb3IKLSAgICAgICAgICAgIC8vICJibG9jay1hc3BlY3QtcmF0aW8tcmFuZ2UiLgotICAgICAgICAgICAgbUN1cnJlbnRUeXBlLT5zZWNvbmRbCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKGFfaW4pLnN1YnN0cigwLCBzdHJsZW4oYV9pbikgLSAxKSArCi0gICAgICAgICAgICAgICAgICAgICItYXNwZWN0LXJhdGlvLXJhbmdlIl0gPSByYW5nZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEZvciBldmVyeXRoaW5nIGVsc2UgKGFwYXJ0IGZyb20gImFzcGVjdC1yYXRpbyIpLCBzaW1wbHkgYXBwZW5kCi0gICAgICAgICAgICAvLyAiLXJhbmdlIiB0byB0aGUgbmFtZSBmb3IgdGhlIHJhbmdlLXR5cGUgcHJvcGVydHkuCi0gICAgICAgICAgICBtQ3VycmVudFR5cGUtPnNlY29uZFtzdGQ6OnN0cmluZyhhX25hbWUpICsgIi1yYW5nZSJdID0gcmFuZ2U7Ci0KLSAgICAgICAgICAgIC8vIE9ubHkgInF1YWxpdHkiIG1heSBoYXZlICJzY2FsZSIuCi0gICAgICAgICAgICBpZiAoIXN0ckVxKGFfbmFtZSwgInF1YWxpdHkiKSAmJiBhX3NjYWxlICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKGFfbmFtZSwgInNjYWxlIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGFfbmFtZSwgInF1YWxpdHkiKSkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IHZhbHVlIG9mICJxdWFsaXR5LXNjYWxlIiBpcyAibGluZWFyIi4KLSAgICAgICAgICAgICAgICBtQ3VycmVudFR5cGUtPnNlY29uZFsicXVhbGl0eS1zY2FsZSJdID0gYV9zY2FsZSA9PSBudWxscHRyID8KLSAgICAgICAgICAgICAgICAgICAgICAgICJsaW5lYXIiIDogYV9zY2FsZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gInF1YWxpdHkiIGFuZCAiY29tcGxleGl0eSIgbXVzdCBoYXZlICJkZWZhdWx0Ii4KLSAgICAgICAgICAgIC8vIE90aGVyIGxpbWl0cyBtdXN0IG5vdCBoYXZlICJkZWZhdWx0Ii4KLSAgICAgICAgICAgIGlmIChzdHJFcShhX25hbWUsICJxdWFsaXR5IikgfHwgc3RyRXEoYV9uYW1lLCAiY29tcGxleGl0eSIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFfZGVmYXVsdCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAiZGVmYXVsdCIsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gbmFtZSB3aWxsIGJlICJxdWFsaXR5LWRlZmF1bHQiIG9yICJjb21wbGV4aXR5LWRlZmF1bHQiLgotICAgICAgICAgICAgICAgIG1DdXJyZW50VHlwZS0+c2Vjb25kW3N0ZDo6c3RyaW5nKGFfbmFtZSkgKyAiLWRlZmF1bHQiXSA9IGFfZGVmYXVsdDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYV9kZWZhdWx0ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKGFfbmFtZSwgImRlZmF1bHQiLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYV9yYW5nZSAhPSBudWxscHRyKSB7CisgICAgICAgIC8vIHJhbmdlCisgICAgICAgIGtleSArPSAiLXJhbmdlIjsKKyAgICAgICAgdmFsdWUgPSBhX3JhbmdlOworICAgIH0gZWxzZSBpZiAoYV9yYW5nZXMgIT0gbnVsbHB0cikgeworICAgICAgICAvLyByYW5nZXMKKyAgICAgICAga2V5ICs9ICItcmFuZ2VzIjsKKyAgICAgICAgdmFsdWUgPSBhX3JhbmdlczsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAoYV9kZWZhdWx0ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAiZGVmYXVsdCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhX2luICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAiaW4iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYV9zY2FsZSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKGFfbmFtZSwgInNjYWxlIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFfcmFuZ2UgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihhX25hbWUsICJyYW5nZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhX21pbiAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKGFfbmFtZSwgIm1pbiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFfbWF4ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIC8vICJtYXgiIG11c3QgZXhpc3QgaWYgYW5kIG9ubHkgaWYgbmFtZSBpcyAiY2hhbm5lbC1jb3VudCIgb3IKLSAgICAgICAgICAgIC8vICJjb25jdXJyZW50LWluc3RhbmNlcyIuCi0gICAgICAgICAgICAvLyAibWluIiBpcyBub3QgbmNlc3NhcnkuCi0gICAgICAgICAgICBpZiAoc3RyRXEoYV9uYW1lLCAiY2hhbm5lbC1jb3VudCIpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHN0ckVxKGFfbmFtZSwgImNvbmN1cnJlbnQtaW5zdGFuY2VzIikpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFR5cGUtPnNlY29uZFtzdGQ6OnN0cmluZygibWF4LSIpICsgYV9uYW1lXSA9IGFfbWF4OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKGFfbmFtZSwgIm1heCIsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhX25hbWUsICJjaGFubmVsLWNvdW50IikgfHwKLSAgICAgICAgICAgICAgICBzdHJFcShhX25hbWUsICJjb25jdXJyZW50LWluc3RhbmNlcyIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKGFfbmFtZSwgIm1heCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFfcmFuZ2VzICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIC8vICJyYW5nZXMiIG11c3QgZXhpc3QgaWYgYW5kIG9ubHkgaWYgbmFtZSBpcyAic2FtcGxlLXJhdGUiLgotICAgICAgICAgICAgaWYgKHN0ckVxKGFfbmFtZSwgInNhbXBsZS1yYXRlIikpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFR5cGUtPnNlY29uZFsic2FtcGxlLXJhdGUtcmFuZ2VzIl0gPSBhX3JhbmdlczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihhX25hbWUsICJyYW5nZXMiLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYV9uYW1lLCAic2FtcGxlLXJhdGUiKSkgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihhX25hbWUsICJyYW5nZXMiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhX3ZhbHVlICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIC8vICJ2YWx1ZSIgbXVzdCBleGlzdCBpZiBhbmQgb25seSBpZiBuYW1lIGlzICJhbGlnbm1lbnQiIG9yCi0gICAgICAgICAgICAvLyAiYmxvY2stc2l6ZSIuCi0gICAgICAgICAgICBpZiAoc3RyRXEoYV9uYW1lLCAiYWxpZ25tZW50IikgfHwgc3RyRXEoYV9uYW1lLCAiYmxvY2stc2l6ZSIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRUeXBlLT5zZWNvbmRbYV9uYW1lXSA9IGFfdmFsdWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAidmFsdWUiLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYV9uYW1lLCAiYWxpZ25tZW50IikgfHwgc3RyRXEoYV9uYW1lLCAiYmxvY2stc2l6ZSIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKGFfbmFtZSwgInZhbHVlIiwgZmFsc2UpOwotICAgICAgICB9Ci0KKyAgICAgICAgUExPR0QoIkxpbWl0ICclcycgd2l0aCBubyAncmFuZ2UnLCAndmFsdWUnIG9yICdtaW4nLydtYXgnIGF0dHJpYnV0ZXMiLCBhX25hbWUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAorICAgIC8vIGhhbmRsZSAnaW4nIGF0dHJpYnV0ZSAtIHRoaXMgY2hhbmdlcyB0aGUga2V5CisgICAgaWYgKGFfaW4gIT0gbnVsbHB0cikgeworICAgICAgICAvLyBDdXJyZW50bHkgImFzcGVjdC1yYXRpbyIgdXNlcyBpbiBhdHRyaWJ1dGUKKyAgICAgICAgY29uc3Qgc2l6ZV90IGFfaW5fbGVuID0gc3RybGVuKGFfaW4pOworICAgICAgICBrZXkgPSBzdGQ6OnN0cmluZyhhX2luLCBhX2luX2xlbiAtIGFfaW5bYV9pbl9sZW5dID09ICdzJykgKyAnLScgKyBrZXk7CisgICAgfQorCisgICAgLy8gaGFuZGxlICdzY2FsZScgYXR0cmlidXRlIC0gdGhpcyBhZGRzIGEgbmV3IGRldGFpbAorICAgIGlmIChhX3NjYWxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVN0YXRlLT5hZGREZXRhaWwoYV9uYW1lICsgc3RkOjpzdHJpbmcoIi1zY2FsZSIpLCBhX3NjYWxlKTsKKyAgICB9IGVsc2UgaWYgKHN0ckVxKGFfbmFtZSwgInF1YWxpdHkiKSkgeworICAgICAgICAvLyBUaGUgZGVmYXVsdCB2YWx1ZSBvZiAicXVhbGl0eS1zY2FsZSIgaXMgImxpbmVhciIgZXZlbiBpZiB1bnNwZWNpZmllZC4KKyAgICAgICAgbVN0YXRlLT5hZGREZXRhaWwoYV9uYW1lICsgc3RkOjpzdHJpbmcoIi1zY2FsZSIpLCAibGluZWFyIik7CisgICAgfQorCisgICAgLy8gaGFuZGxlICdkZWZhdWx0JyBhdHRyaWJ1dGUgLSB0aGlzIGFkZHMgYSBuZXcgZGV0YWlsCisgICAgaWYgKGFfZGVmYXVsdCAhPSBudWxscHRyKSB7CisgICAgICAgIG1TdGF0ZS0+YWRkRGV0YWlsKGFfbmFtZSArIHN0ZDo6c3RyaW5nKCItZGVmYXVsdCIpLCBhX2RlZmF1bHQpOworICAgIH0KKworICAgIG1TdGF0ZS0+YWRkRGV0YWlsKGtleSwgdmFsdWUpOwogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmFkZEZlYXR1cmUoY29uc3QgY2hhciAqKmF0dHJzKSB7Ci0gICAgaWYgKG1DdXJyZW50Q29kZWMgPT0gbUNvZGVjTWFwLmVuZCgpKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Cit2b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpTdGF0ZTo6YWRkRGV0YWlsKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAma2V5LCBjb25zdCBzdGQ6OnN0cmluZyAmdmFsdWUpIHsKKyAgICBDSEVDSyhpblR5cGUoKSk7CisgICAgQUxPR0koImxpbWl0OiAlcyA9ICVzIiwga2V5LmNfc3RyKCksIHZhbHVlLmNfc3RyKCkpOworICAgIGNvbnN0IFN0cmluZ1NldCAmdmFyaWFudHMgPSBtVmFyaWFudHNTdGFjay5iYWNrKCk7CisgICAgaWYgKHZhcmlhbnRzLmVtcHR5KCkpIHsKKyAgICAgICAgdHlwZSgpW2tleV0gPSB2YWx1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nICZ2YXJpYW50IDogdmFyaWFudHMpIHsKKyAgICAgICAgICAgIHR5cGUoKVt2YXJpYW50ICsgIjo6OiIgKyBrZXldID0gdmFsdWU7CisgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKG1DdXJyZW50VHlwZSA9PSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5lbmQoKSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlBhcnNlcjo6bGltaXRWYXJpYW50cyhjb25zdCBjaGFyICoqYXR0cnMpIHsKKyAgICBjb25zdCBjaGFyKiBhX25hbWUgPSBudWxscHRyOwogCiAgICAgc2l6ZV90IGkgPSAwOwotICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBudWxscHRyOworICAgIHdoaWxlIChhdHRyc1tpXSAhPSBudWxscHRyKSB7CisgICAgICAgIENIRUNLKChpICYgMSkgPT0gMCk7CisgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgUExPR0QoIlZhcmlhbnQ6IGF0dHJpYnV0ZSAnJXMnIGlzIG51bGwiLCBhdHRyc1tpXSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJFcShhdHRyc1tpXSwgIm5hbWUiKSkgeworICAgICAgICAgICAgYV9uYW1lID0gYXR0cnNbKytpXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFBMT0dEKCJWYXJpYW50OiBpZ25vcmluZyB1bnJlY29nbml6ZWQgYXR0cmlidXRlOiAlcyIsIGF0dHJzW2ldKTsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgICAgICArK2k7CisgICAgfQorCisgICAgaWYgKGFfbmFtZSA9PSBudWxscHRyIHx8ICphX25hbWUgPT0gJ1wwJykgeworICAgICAgICBQTE9HRCgiVmFyaWFudCB3aXRoIG5vIG9yIGVtcHR5ICduYW1lJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBTdHJpbmdTZXQgdmFyaWFudHM7CisgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyAmdmFyaWFudCA6IHBhcnNlQ29tbWFTZXBhcmF0ZWRTdHJpbmdTZXQoYV9uYW1lKSkgeworICAgICAgICBpZiAobVN0YXRlLT52YXJpYW50cygpLmNvdW50KHZhcmlhbnQpKSB7CisgICAgICAgICAgICB2YXJpYW50cy5lbXBsYWNlKHZhcmlhbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUExPR0QoIlZhcmlhbnQ6IHZhcmlhbnQgJyVzJyBub3QgaW4gcGFyZW50IHZhcmlhbnRzIiwgdmFyaWFudC5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgbVN0YXRlLT5lbnRlclZhcmlhbnRzKHZhcmlhbnRzKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpQYXJzZXI6OmFkZEZlYXR1cmUoY29uc3QgY2hhciAqKmF0dHJzKSB7CisgICAgQ0hFQ0sobVN0YXRlLT5pblR5cGUoKSk7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGNvbnN0IGNoYXIgKmFfbmFtZSA9IG51bGxwdHI7CiAgICAgaW50MzJfdCBvcHRpb25hbCA9IC0xOwogICAgIGludDMyX3QgcmVxdWlyZWQgPSAtMTsKLSAgICBjb25zdCBjaGFyICp2YWx1ZSA9IG51bGxwdHI7CisgICAgY29uc3QgY2hhciAqYV92YWx1ZSA9IG51bGxwdHI7CiAKICAgICB3aGlsZSAoYXR0cnNbaV0gIT0gbnVsbHB0cikgewotICAgICAgICBpZiAoc3RyRXEoYXR0cnNbaV0sICJuYW1lIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkRmVhdHVyZTogbmFtZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5hbWUgPSBhdHRyc1tpXTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgIm9wdGlvbmFsIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkRmVhdHVyZTogb3B0aW9uYWwgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvcHRpb25hbCA9IHBhcnNlQm9vbGVhbihhdHRyc1tpXSkgPyAxIDogMDsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInJlcXVpcmVkIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkRmVhdHVyZTogcmVxdWlyZWQgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXF1aXJlZCA9IHBhcnNlQm9vbGVhbihhdHRyc1tpXSkgPyAxIDogMDsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInZhbHVlIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkRmVhdHVyZTogdmFsdWUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YWx1ZSA9IGF0dHJzW2ldOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoImFkZEZlYXR1cmU6IHVucmVjb2duaXplZCBhdHRyaWJ1dGU6ICVzIiwgYXR0cnNbaV0pOworICAgICAgICBDSEVDSygoaSAmIDEpID09IDApOworICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIFBMT0dEKCJGZWF0dXJlOiBhdHRyaWJ1dGUgJyVzJyBpcyBudWxsIiwgYXR0cnNbaV0pOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQorCisgICAgICAgIGlmIChzdHJFcShhdHRyc1tpXSwgIm5hbWUiKSkgeworICAgICAgICAgICAgYV9uYW1lID0gYXR0cnNbKytpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgIm9wdGlvbmFsIikpIHsKKyAgICAgICAgICAgIG9wdGlvbmFsID0gcGFyc2VCb29sZWFuKGF0dHJzWysraV0pID8gMSA6IDA7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJyZXF1aXJlZCIpKSB7CisgICAgICAgICAgICByZXF1aXJlZCA9IHBhcnNlQm9vbGVhbihhdHRyc1srK2ldKSA/IDEgOiAwOworICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAidmFsdWUiKSkgeworICAgICAgICAgICAgYV92YWx1ZSA9IGF0dHJzWysraV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQTE9HRCgiRmVhdHVyZTogaWdub3JpbmcgdW5yZWNvZ25pemVkIGF0dHJpYnV0ZSAnJXMnIiwgYXR0cnNbaV0pOworICAgICAgICAgICAgKytpOworICAgICAgICB9CiAgICAgICAgICsraTsKICAgICB9CiAKICAgICAvLyBFdmVyeSBmZWF0dXJlIG11c3QgaGF2ZSBhIG5hbWUuCi0gICAgaWYgKG5hbWUgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiZmVhdHVyZSB3aXRoIG5vICduYW1lJyBhdHRyaWJ1dGUiKTsKKyAgICBpZiAoYV9uYW1lID09IG51bGxwdHIpIHsKKyAgICAgICAgUExPR0QoIkZlYXR1cmUgd2l0aCBubyAnbmFtZScgYXR0cmlidXRlIik7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgaWYgKChvcHRpb25hbCAhPSAtMSkgfHwgKHJlcXVpcmVkICE9IC0xKSkgewotICAgICAgICBpZiAob3B0aW9uYWwgPT0gcmVxdWlyZWQpIHsKLSAgICAgICAgICAgIEFMT0dFKCJmZWF0dXJlICclcycgaXMgYm90aC9uZWl0aGVyIG9wdGlvbmFsIGFuZCByZXF1aXJlZCIsIG5hbWUpOworICAgIGlmIChhX3ZhbHVlICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKG9wdGlvbmFsICE9IC0xIHx8IHJlcXVpcmVkICE9IC0xKSB7CisgICAgICAgICAgICBQTE9HRCgiRmVhdHVyZSAnJXMnIGhhcyBib3RoIHZhbHVlIGFuZCBvcHRpb25hbC9yZXF1aXJlZCBhdHRyaWJ1dGVzIiwgYV9uYW1lKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKChvcHRpb25hbCA9PSAxKSB8fCAocmVxdWlyZWQgPT0gMSkpIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImZlYXR1cmUgJyVzJyBjYW5ub3QgaGF2ZSBleHRyYSAndmFsdWUnIiwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DdXJyZW50VHlwZS0+c2Vjb25kW3N0ZDo6c3RyaW5nKCJmZWF0dXJlLSIpICsgbmFtZV0gPQotICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCA9PSAxID8gIjAiIDogIjEiOwotICAgICAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChvcHRpb25hbCA9PSByZXF1aXJlZCAmJiBvcHRpb25hbCAhPSAtMSkgeworICAgICAgICAgICAgUExPR0QoIkZlYXR1cmUgJyVzJyBpcyBib3RoL25laXRoZXIgb3B0aW9uYWwgYW5kIHJlcXVpcmVkIiwgYV9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KKyAgICAgICAgYV92YWx1ZSA9IChyZXF1aXJlZCA9PSAxIHx8IG9wdGlvbmFsID09IDApID8gIjEiIDogIjAiOwogICAgIH0KLSAgICBtQ3VycmVudFR5cGUtPnNlY29uZFtzdGQ6OnN0cmluZygiZmVhdHVyZS0iKSArIG5hbWVdID0gdmFsdWUgPT0gbnVsbHB0ciA/Ci0gICAgICAgICAgICAiMCIgOiB2YWx1ZTsKKworICAgIG1TdGF0ZS0+YWRkRGV0YWlsKHN0ZDo6c3RyaW5nKCJmZWF0dXJlLSIpICsgYV9uYW1lLCBhX3ZhbHVlID8gOiAiMCIpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlBhcnNlcjo6YWRkQWxpYXMoY29uc3QgY2hhciAqKmF0dHJzKSB7CisgICAgQ0hFQ0sobVN0YXRlLT5pbkNvZGVjKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBjb25zdCBjaGFyICphX25hbWUgPSBudWxscHRyOworCisgICAgd2hpbGUgKGF0dHJzW2ldICE9IG51bGxwdHIpIHsKKyAgICAgICAgQ0hFQ0soKGkgJiAxKSA9PSAwKTsKKyAgICAgICAgaWYgKGF0dHJzW2kgKyAxXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBQTE9HRCgiQWxpYXM6IGF0dHJpYnV0ZSAnJXMnIGlzIG51bGwiLCBhdHRyc1tpXSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0ckVxKGF0dHJzW2ldLCAibmFtZSIpKSB7CisgICAgICAgICAgICBhX25hbWUgPSBhdHRyc1srK2ldOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUExPR0QoIkFsaWFzOiBpZ25vcmluZyB1bnJlY29nbml6ZWQgYXR0cmlidXRlICclcyciLCBhdHRyc1tpXSk7CisgICAgICAgICAgICArK2k7CisgICAgICAgIH0KKyAgICAgICAgKytpOworICAgIH0KKworICAgIC8vIEV2ZXJ5IGZlYXR1cmUgbXVzdCBoYXZlIGEgbmFtZS4KKyAgICBpZiAoYV9uYW1lID09IG51bGxwdHIpIHsKKyAgICAgICAgUExPR0QoIkFsaWFzIHdpdGggbm8gJ25hbWUnIGF0dHJpYnV0ZSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG1TdGF0ZS0+Y29kZWMoKS5hbGlhc2VzLmVtcGxhY2VfYmFjayhhX25hbWUpOwogICAgIHJldHVybiBPSzsKIH0KIAogY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkF0dHJpYnV0ZU1hcCYKLSAgICAgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmdldFNlcnZpY2VBdHRyaWJ1dGVNYXAoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1TZXJ2aWNlQXR0cmlidXRlTWFwOworTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmdldFNlcnZpY2VBdHRyaWJ1dGVNYXAoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRTZXJ2aWNlQXR0cmlidXRlTWFwKCk7CiB9CiAKIGNvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpDb2RlY01hcCYKLSAgICAgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmdldENvZGVjTWFwKCkgY29uc3QgewotICAgIHJldHVybiBtQ29kZWNNYXA7CitNZWRpYUNvZGVjc1htbFBhcnNlcjo6Z2V0Q29kZWNNYXAoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRDb2RlY01hcCgpOwogfQogCiBjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Um9sZU1hcCYKLSAgICAgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmdldFJvbGVNYXAoKSBjb25zdCB7CitNZWRpYUNvZGVjc1htbFBhcnNlcjo6Z2V0Um9sZU1hcCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldFJvbGVNYXAoKTsKK30KKworY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OlJvbGVNYXAmCitNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6Z2V0Um9sZU1hcCgpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gZ3VhcmQobUxvY2spOwogICAgIGlmIChtUm9sZU1hcC5lbXB0eSgpKSB7CiAgICAgICAgIGdlbmVyYXRlUm9sZU1hcCgpOwogICAgIH0KQEAgLTk4Miw2ICsxNDI2LDExIEBACiB9CiAKIGNvbnN0IGNoYXIqIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpnZXRDb21tb25QcmVmaXgoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRDb21tb25QcmVmaXgoKTsKK30KKworY29uc3QgY2hhciogTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OmdldENvbW1vblByZWZpeCgpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gZ3VhcmQobUxvY2spOwogICAgIGlmIChtQ29tbW9uUHJlZml4LmVtcHR5KCkpIHsKICAgICAgICAgZ2VuZXJhdGVDb21tb25QcmVmaXgoKTsKICAgICB9CkBAIC05ODksMTQgKzE0MzgsMTggQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmdldFBhcnNpbmdTdGF0dXMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1QYXJzaW5nU3RhdHVzOworICAgIHJldHVybiBtSW1wbC0+Z2V0UGFyc2luZ1N0YXR1cygpOwogfQogCi12b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpnZW5lcmF0ZVJvbGVNYXAoKSBjb25zdCB7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBjb2RlYyA6IG1Db2RlY01hcCkgewotICAgICAgICBjb25zdCBhdXRvJiBjb2RlY05hbWUgPSBjb2RlYy5maXJzdDsKK3ZvaWQgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OmdlbmVyYXRlUm9sZU1hcCgpIGNvbnN0IHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGNvZGVjIDogbURhdGEubUNvZGVjTWFwKSB7CisgICAgICAgIGNvbnN0IGF1dG8gJmNvZGVjTmFtZSA9IGNvZGVjLmZpcnN0OworICAgICAgICBpZiAoY29kZWNOYW1lID09ICI8ZHVtbXk+IikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KICAgICAgICAgYm9vbCBpc0VuY29kZXIgPSBjb2RlYy5zZWNvbmQuaXNFbmNvZGVyOwogICAgICAgICBzaXplX3Qgb3JkZXIgPSBjb2RlYy5zZWNvbmQub3JkZXI7CisgICAgICAgIHN0ZDo6c3RyaW5nIHJhbmsgPSBjb2RlYy5zZWNvbmQucmFuazsKICAgICAgICAgY29uc3QgYXV0byYgdHlwZU1hcCA9IGNvZGVjLnNlY29uZC50eXBlTWFwOwogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHR5cGUgOiB0eXBlTWFwKSB7CiAgICAgICAgICAgICBjb25zdCBhdXRvJiB0eXBlTmFtZSA9IHR5cGUuZmlyc3Q7CkBAIC0xMDQwLDI1ICsxNDkzLDM1IEBACiAKICAgICAgICAgICAgIE5vZGVJbmZvIG5vZGVJbmZvOwogICAgICAgICAgICAgbm9kZUluZm8ubmFtZSA9IGNvZGVjTmFtZTsKKyAgICAgICAgICAgIC8vIE5PVEU6IG5vIGFsaWFzZXMgYXJlIGV4cG9zZWQgaW4gcm9sZSBpbmZvCisgICAgICAgICAgICAvLyBhdHRyaWJ1dGUgcXVpcmtzIGFyZSBleHBvc2VkIGFzIG5vZGUgYXR0cmlidXRlcwogICAgICAgICAgICAgbm9kZUluZm8uYXR0cmlidXRlTGlzdC5yZXNlcnZlKHR5cGVBdHRyaWJ1dGVNYXAuc2l6ZSgpKTsKICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgYXR0cmlidXRlIDogdHlwZUF0dHJpYnV0ZU1hcCkgewogICAgICAgICAgICAgICAgIG5vZGVJbmZvLmF0dHJpYnV0ZUxpc3QucHVzaF9iYWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRle2F0dHJpYnV0ZS5maXJzdCwgYXR0cmlidXRlLnNlY29uZH0pOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyAmcXVpcmsgOiBjb2RlYy5zZWNvbmQucXVpcmtTZXQpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RySGFzUHJlZml4KHF1aXJrLmNfc3RyKCksICJhdHRyaWJ1dGU6OiIpKSB7CisgICAgICAgICAgICAgICAgICAgIG5vZGVJbmZvLmF0dHJpYnV0ZUxpc3QucHVzaF9iYWNrKEF0dHJpYnV0ZXtxdWlyaywgInByZXNlbnQifSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFyYW5rLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBub2RlSW5mby5hdHRyaWJ1dGVMaXN0LnB1c2hfYmFjayhBdHRyaWJ1dGV7InJhbmsiLCByYW5rfSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBub2RlTGlzdC0+aW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAogICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUob3JkZXIpLCBzdGQ6Om1vdmUobm9kZUluZm8pKSk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKLXZvaWQgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmdlbmVyYXRlQ29tbW9uUHJlZml4KCkgY29uc3QgewotICAgIGlmIChtQ29kZWNNYXAuZW1wdHkoKSkgewordm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6Z2VuZXJhdGVDb21tb25QcmVmaXgoKSBjb25zdCB7CisgICAgaWYgKG1EYXRhLm1Db2RlY01hcC5lbXB0eSgpKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgYXV0byBpID0gbUNvZGVjTWFwLmNiZWdpbigpOworICAgIGF1dG8gaSA9IG1EYXRhLm1Db2RlY01hcC5jYmVnaW4oKTsKICAgICBhdXRvIGZpcnN0ID0gaS0+Zmlyc3QuY2JlZ2luKCk7CiAgICAgYXV0byBsYXN0ID0gaS0+Zmlyc3QuY2VuZCgpOwotICAgIGZvciAoKytpOyBpICE9IG1Db2RlY01hcC5jZW5kKCk7ICsraSkgeworICAgIGZvciAoKytpOyBpICE9IG1EYXRhLm1Db2RlY01hcC5jZW5kKCk7ICsraSkgewogICAgICAgICBsYXN0ID0gc3RkOjptaXNtYXRjaCgKICAgICAgICAgICAgICAgICBmaXJzdCwgbGFzdCwgaS0+Zmlyc3QuY2JlZ2luKCksIGktPmZpcnN0LmNlbmQoKSkuZmlyc3Q7CiAgICAgfQpAQCAtMTA2Niw0ICsxNTI5LDMgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvYXBpL2N1cnJlbnQudHh0IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL2FwaS9jdXJyZW50LnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDdjNTdkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL2FwaS9jdXJyZW50LnR4dApAQCAtMCwwICsxLDE1NCBAQAorLy8gU2lnbmF0dXJlIGZvcm1hdDogMi4wCitwYWNrYWdlIG1lZGlhLmNvZGVjcyB7CisKKyAgcHVibGljIGNsYXNzIEFsaWFzIHsKKyAgICBjdG9yIHB1YmxpYyBBbGlhcygpOworICAgIG1ldGhvZCBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcpOworICB9CisKKyAgcHVibGljIGNsYXNzIERlY29kZXJzIHsKKyAgICBjdG9yIHB1YmxpYyBEZWNvZGVycygpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEuY29kZWNzLk1lZGlhQ29kZWM+IGdldE1lZGlhQ29kZWMoKTsKKyAgfQorCisgIHB1YmxpYyBjbGFzcyBFbmNvZGVycyB7CisgICAgY3RvciBwdWJsaWMgRW5jb2RlcnMoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLmNvZGVjcy5NZWRpYUNvZGVjPiBnZXRNZWRpYUNvZGVjKCk7CisgIH0KKworICBwdWJsaWMgY2xhc3MgRmVhdHVyZSB7CisgICAgY3RvciBwdWJsaWMgRmVhdHVyZSgpOworICAgIG1ldGhvZCBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXRPcHRpb25hbCgpOworICAgIG1ldGhvZCBwdWJsaWMgU3RyaW5nIGdldFJlcXVpcmVkKCk7CisgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRPcHRpb25hbChTdHJpbmcpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRSZXF1aXJlZChTdHJpbmcpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcpOworICB9CisKKyAgcHVibGljIGNsYXNzIEluY2x1ZGUgeworICAgIGN0b3IgcHVibGljIEluY2x1ZGUoKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXRIcmVmKCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldEhyZWYoU3RyaW5nKTsKKyAgfQorCisgIHB1YmxpYyBjbGFzcyBJbmNsdWRlZCB7CisgICAgY3RvciBwdWJsaWMgSW5jbHVkZWQoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLmNvZGVjcy5EZWNvZGVycz4gZ2V0RGVjb2RlcnNfb3B0aW9uYWwoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLmNvZGVjcy5FbmNvZGVycz4gZ2V0RW5jb2RlcnNfb3B0aW9uYWwoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLmNvZGVjcy5JbmNsdWRlPiBnZXRJbmNsdWRlX29wdGlvbmFsKCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxtZWRpYS5jb2RlY3MuU2V0dGluZ3M+IGdldFNldHRpbmdzX29wdGlvbmFsKCk7CisgIH0KKworICBwdWJsaWMgY2xhc3MgTGltaXQgeworICAgIGN0b3IgcHVibGljIExpbWl0KCk7CisgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0SW4oKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXRNYXgoKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXRNaW4oKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXROYW1lKCk7CisgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0UmFuZ2UoKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXRSYW5nZXMoKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXRTY2FsZSgpOworICAgIG1ldGhvZCBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCk7CisgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0X2RlZmF1bHQoKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0SW4oU3RyaW5nKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0TWF4KFN0cmluZyk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldE1pbihTdHJpbmcpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFJhbmdlKFN0cmluZyk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFJhbmdlcyhTdHJpbmcpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRTY2FsZShTdHJpbmcpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRfZGVmYXVsdChTdHJpbmcpOworICB9CisKKyAgcHVibGljIGNsYXNzIE1lZGlhQ29kZWMgeworICAgIGN0b3IgcHVibGljIE1lZGlhQ29kZWMoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLmNvZGVjcy5BbGlhcz4gZ2V0QWxpYXNfb3B0aW9uYWwoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLmNvZGVjcy5RdWlyaz4gZ2V0QXR0cmlidXRlX29wdGlvbmFsKCk7CisgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0RG9tYWluKCk7CisgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0RW5hYmxlZCgpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEuY29kZWNzLkZlYXR1cmU+IGdldEZlYXR1cmVfb3B0aW9uYWwoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLmNvZGVjcy5MaW1pdD4gZ2V0TGltaXRfb3B0aW9uYWwoKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXROYW1lKCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxtZWRpYS5jb2RlY3MuUXVpcms+IGdldFF1aXJrX29wdGlvbmFsKCk7CisgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0UmFuaygpOworICAgIG1ldGhvZCBwdWJsaWMgU3RyaW5nIGdldFR5cGUoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLmNvZGVjcy5UeXBlPiBnZXRUeXBlX29wdGlvbmFsKCk7CisgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0VXBkYXRlKCk7CisgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0VmFyaWFudCgpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEuY29kZWNzLlZhcmlhbnQ+IGdldFZhcmlhbnRfb3B0aW9uYWwoKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0RG9tYWluKFN0cmluZyk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldEVuYWJsZWQoU3RyaW5nKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRSYW5rKFN0cmluZyk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFR5cGUoU3RyaW5nKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0VXBkYXRlKFN0cmluZyk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFZhcmlhbnQoU3RyaW5nKTsKKyAgfQorCisgIHB1YmxpYyBjbGFzcyBNZWRpYUNvZGVjcyB7CisgICAgY3RvciBwdWJsaWMgTWVkaWFDb2RlY3MoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLmNvZGVjcy5EZWNvZGVycz4gZ2V0RGVjb2RlcnNfb3B0aW9uYWwoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLmNvZGVjcy5FbmNvZGVycz4gZ2V0RW5jb2RlcnNfb3B0aW9uYWwoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLmNvZGVjcy5JbmNsdWRlPiBnZXRJbmNsdWRlX29wdGlvbmFsKCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxtZWRpYS5jb2RlY3MuU2V0dGluZ3M+IGdldFNldHRpbmdzX29wdGlvbmFsKCk7CisgIH0KKworICBwdWJsaWMgY2xhc3MgUXVpcmsgeworICAgIGN0b3IgcHVibGljIFF1aXJrKCk7CisgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOworICAgIG1ldGhvZCBwdWJsaWMgU3RyaW5nIGdldFZhbHVlKCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0VmFsdWUoU3RyaW5nKTsKKyAgfQorCisgIHB1YmxpYyBjbGFzcyBTZXR0aW5nIHsKKyAgICBjdG9yIHB1YmxpYyBTZXR0aW5nKCk7CisgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0RW5hYmxlZCgpOworICAgIG1ldGhvZCBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXRVcGRhdGUoKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRFbmFibGVkKFN0cmluZyk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0VXBkYXRlKFN0cmluZyk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyk7CisgIH0KKworICBwdWJsaWMgY2xhc3MgU2V0dGluZ3MgeworICAgIGN0b3IgcHVibGljIFNldHRpbmdzKCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxtZWRpYS5jb2RlY3MuU2V0dGluZz4gZ2V0RG9tYWluX29wdGlvbmFsKCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxtZWRpYS5jb2RlY3MuU2V0dGluZz4gZ2V0U2V0dGluZ19vcHRpb25hbCgpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEuY29kZWNzLlNldHRpbmc+IGdldFZhcmlhbnRfb3B0aW9uYWwoKTsKKyAgfQorCisgIHB1YmxpYyBjbGFzcyBUeXBlIHsKKyAgICBjdG9yIHB1YmxpYyBUeXBlKCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxtZWRpYS5jb2RlY3MuQWxpYXM+IGdldEFsaWFzKCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxtZWRpYS5jb2RlY3MuRmVhdHVyZT4gZ2V0RmVhdHVyZSgpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEuY29kZWNzLkxpbWl0PiBnZXRMaW1pdCgpOworICAgIG1ldGhvZCBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXRVcGRhdGUoKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRVcGRhdGUoU3RyaW5nKTsKKyAgfQorCisgIHB1YmxpYyBjbGFzcyBWYXJpYW50IHsKKyAgICBjdG9yIHB1YmxpYyBWYXJpYW50KCk7CisgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyk7CisgIH0KKworICBwdWJsaWMgY2xhc3MgWG1sUGFyc2VyIHsKKyAgICBjdG9yIHB1YmxpYyBYbWxQYXJzZXIoKTsKKyAgICBtZXRob2QgcHVibGljIHN0YXRpYyBtZWRpYS5jb2RlY3MuSW5jbHVkZWQgcmVhZEluY2x1ZGVkKGphdmEuaW8uSW5wdXRTdHJlYW0pIHRocm93cyBqYXZheC54bWwuZGF0YXR5cGUuRGF0YXR5cGVDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBqYXZhLmlvLklPRXhjZXB0aW9uLCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOworICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIG1lZGlhLmNvZGVjcy5NZWRpYUNvZGVjcyByZWFkTWVkaWFDb2RlY3MoamF2YS5pby5JbnB1dFN0cmVhbSkgdGhyb3dzIGphdmF4LnhtbC5kYXRhdHlwZS5EYXRhdHlwZUNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24sIG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CisgICAgbWV0aG9kIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRUZXh0KG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXIpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uLCBvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyRXhjZXB0aW9uOworICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIHZvaWQgc2tpcChvcmcueG1scHVsbC52MS5YbWxQdWxsUGFyc2VyKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiwgb3JnLnhtbHB1bGwudjEuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKKyAgfQorCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvbW1vbl90aW1lL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvYXBpL2xhc3RfY3VycmVudC50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9jb21tb25fdGltZS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmNvcHkgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL2FwaS9sYXN0X2N1cnJlbnQudHh0CmRpZmYgLS1naXQgYS9tZWRpYS9jb21tb25fdGltZS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL2FwaS9sYXN0X3JlbW92ZWQudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvY29tbW9uX3RpbWUvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpjb3B5IHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9hcGkvbGFzdF9yZW1vdmVkLnR4dApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL2FwaS9yZW1vdmVkLnR4dCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9hcGkvcmVtb3ZlZC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDgwMjE3NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9hcGkvcmVtb3ZlZC50eHQKQEAgLTAsMCArMSBAQAorLy8gU2lnbmF0dXJlIGZvcm1hdDogMi4wCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oCmluZGV4IGNjNjllNTIuLmI2NjZkZTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oCkBAIC0xOSwzNCArMTksMzEgQEAKIAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KIAotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxzZXQ+CiAjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogCitzdHJ1Y3QgWE1MX1BhcnNlclN0cnVjdDsgLy8gZnJvbSBleHBhdCBsaWJyYXJ5CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgTWVkaWFDb2RlY3NYbWxQYXJzZXIgewogcHVibGljOgogCiAgICAgLy8gVHJlYmxpemVkIG1lZGlhIGNvZGVjIGxpc3Qgd2lsbCBiZSBsb2NhdGVkIGluIC9vZG0vZXRjIG9yIC92ZW5kb3IvZXRjLgotICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBjb25zdCogZGVmYXVsdFNlYXJjaERpcnNbXSA9Ci0gICAgICAgICAgICB7Ii9vZG0vZXRjIiwgIi92ZW5kb3IvZXRjIiwgIi9ldGMiLCBudWxscHRyfTsKLSAgICBzdGF0aWMgY29uc3RleHByIGNoYXIgY29uc3QqIGRlZmF1bHRNYWluWG1sTmFtZSA9Ci0gICAgICAgICAgICAibWVkaWFfY29kZWNzLnhtbCI7Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGNvbnN0KiBkZWZhdWx0UGVyZm9ybWFuY2VYbWxOYW1lID0KLSAgICAgICAgICAgICJtZWRpYV9jb2RlY3NfcGVyZm9ybWFuY2UueG1sIjsKKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGdldERlZmF1bHRTZWFyY2hEaXJzKCkgeworICAgICAgICAgICAgcmV0dXJuIHsgIi9vZG0vZXRjIiwgIi92ZW5kb3IvZXRjIiwgIi9ldGMiIH07CisgICAgfQorICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZ2V0RGVmYXVsdFhtbE5hbWVzKCkgeworICAgICAgICAgICAgcmV0dXJuIHsgIm1lZGlhX2NvZGVjcy54bWwiLCAibWVkaWFfY29kZWNzX3BlcmZvcm1hbmNlLnhtbCIgfTsKKyAgICB9CiAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGNvbnN0KiBkZWZhdWx0UHJvZmlsaW5nUmVzdWx0c1htbFBhdGggPQogICAgICAgICAgICAgIi9kYXRhL21pc2MvbWVkaWEvbWVkaWFfY29kZWNzX3Byb2ZpbGluZ19yZXN1bHRzLnhtbCI7CiAKLSAgICBNZWRpYUNvZGVjc1htbFBhcnNlcigKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0KiBzZWFyY2hEaXJzID0gZGVmYXVsdFNlYXJjaERpcnMsCi0gICAgICAgICAgICBjb25zdCBjaGFyKiBtYWluWG1sTmFtZSA9IGRlZmF1bHRNYWluWG1sTmFtZSwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBlcmZvcm1hbmNlWG1sTmFtZSA9IGRlZmF1bHRQZXJmb3JtYW5jZVhtbE5hbWUsCi0gICAgICAgICAgICBjb25zdCBjaGFyKiBwcm9maWxpbmdSZXN1bHRzWG1sUGF0aCA9IGRlZmF1bHRQcm9maWxpbmdSZXN1bHRzWG1sUGF0aCk7CisgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXIoKTsKICAgICB+TWVkaWFDb2RlY3NYbWxQYXJzZXIoKTsKIAogICAgIHR5cGVkZWYgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gQXR0cmlidXRlOwpAQCAtNTUsNyArNTIsNyBAQAogICAgIHR5cGVkZWYgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBBdHRyaWJ1dGVNYXA+IFR5cGU7CiAgICAgdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgQXR0cmlidXRlTWFwPiBUeXBlTWFwOwogCi0gICAgdHlwZWRlZiBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gUXVpcmtTZXQ7CisgICAgdHlwZWRlZiBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gU3RyaW5nU2V0OwogCiAgICAgLyoqCiAgICAgICogUHJvcGVydGllcyBvZiBhIGNvZGVjIChub2RlKQpAQCAtNjMsOCArNjAsMTIgQEAKICAgICBzdHJ1Y3QgQ29kZWNQcm9wZXJ0aWVzIHsKICAgICAgICAgYm9vbCBpc0VuY29kZXI7ICAgIC8vLzwgV2hldGhlciB0aGlzIGNvZGVjIGlzIGFuIGVuY29kZXIgb3IgYSBkZWNvZGVyCiAgICAgICAgIHNpemVfdCBvcmRlcjsgICAgICAvLy88IE9yZGVyIG9mIGFwcGVhcmFuY2UgaW4gdGhlIGZpbGUgKHN0YXJ0aW5nIGZyb20gMCkKLSAgICAgICAgUXVpcmtTZXQgcXVpcmtTZXQ7IC8vLzwgU2V0IG9mIHF1aXJrcyByZXF1ZXN0ZWQgYnkgdGhpcyBjb2RlYworICAgICAgICBTdHJpbmdTZXQgcXVpcmtTZXQ7IC8vLzwgU2V0IG9mIHF1aXJrcyByZXF1ZXN0ZWQgYnkgdGhpcyBjb2RlYworICAgICAgICBTdHJpbmdTZXQgZG9tYWluU2V0OyAvLy88IFNldCBvZiBkb21haW5zIHRoaXMgY29kZWMgaXMgaW4KKyAgICAgICAgU3RyaW5nU2V0IHZhcmlhbnRTZXQ7IC8vLzwgU2V0IG9mIHZhcmlhbnRzIHRoaXMgY29kZWMgaXMgZW5hYmxlZCBvbgogICAgICAgICBUeXBlTWFwIHR5cGVNYXA7ICAgLy8vPCBNYXAgb2YgdHlwZXMgc3VwcG9ydGVkIGJ5IHRoaXMgY29kZWMKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGFsaWFzZXM7IC8vLzwgTmFtZSBhbGlhc2VzIGZvciB0aGlzIGNvZGVjCisgICAgICAgIHN0ZDo6c3RyaW5nIHJhbms7ICAvLy88IFJhbmsgb2YgdGhpcyBjb2RlYy4gVGhpcyBpcyBhIG51bWVyaWMgc3RyaW5nLgogICAgIH07CiAKICAgICB0eXBlZGVmIHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgQ29kZWNQcm9wZXJ0aWVzPiBDb2RlYzsKQEAgLTc2LDYgKzc3LDcgQEAKICAgICBzdHJ1Y3QgTm9kZUluZm8gewogICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOwogICAgICAgICBzdGQ6OnZlY3RvcjxBdHRyaWJ1dGU+IGF0dHJpYnV0ZUxpc3Q7CisgICAgICAgIC8vIG5vdGU6IGFsaWFzZXMgYXJlIG5vdCBleHBvc2VkIGhlcmUgYXMgdGhleSBhcmUgbm90IHBhcnQgb2YgdGhlIHJvbGUgbWFwCiAgICAgfTsKIAogICAgIC8qKgpAQCAtMTE2LDY5ICsxMTgsMzEgQEAKIAogICAgIHN0YXR1c190IGdldFBhcnNpbmdTdGF0dXMoKSBjb25zdDsKIAorICAgIC8qKgorICAgICAqIFBhcnNlIHRvcCBsZXZlbCBYTUwgZmlsZXMgZnJvbSBhIGdyb3VwIG9mIHNlYXJjaCBkaXJlY3Rvcmllcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSB4bWxGaWxlcyBvcmRlcmVkIGxpc3Qgb2YgWE1MIGZpbGUgbmFtZXMgKG5vIHBhdGhzKQorICAgICAqIEBwYXJhbSBzZWFyY2hEaXJzIG9yZGVyZWQgbGlzdCBvZiBwYXRocyB0byBjb25zaWRlcgorICAgICAqCisgICAgICogQHJldHVybiBwYXJzaW5nIHN0YXR1cworICAgICAqLworICAgIHN0YXR1c190IHBhcnNlWG1sRmlsZXNJblNlYXJjaERpcnMoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJnhtbEZpbGVzID0gZ2V0RGVmYXVsdFhtbE5hbWVzKCksCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJnNlYXJjaERpcnMgPSBnZXREZWZhdWx0U2VhcmNoRGlycygpKTsKKworCisgICAgLyoqCisgICAgICogUGFyc2UgYSB0b3AgbGV2ZWwgWE1MIGZpbGUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGF0aCBYTUwgZmlsZSBwYXRoCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHBhcnNpbmcgc3RhdHVzCisgICAgICovCisgICAgc3RhdHVzX3QgcGFyc2VYbWxQYXRoKGNvbnN0IHN0ZDo6c3RyaW5nICZwYXRoKTsKKwogcHJpdmF0ZToKLSAgICBlbnVtIFNlY3Rpb24gewotICAgICAgICBTRUNUSU9OX1RPUExFVkVMLAotICAgICAgICBTRUNUSU9OX1NFVFRJTkdTLAotICAgICAgICBTRUNUSU9OX0RFQ09ERVJTLAotICAgICAgICBTRUNUSU9OX0RFQ09ERVIsCi0gICAgICAgIFNFQ1RJT05fREVDT0RFUl9UWVBFLAotICAgICAgICBTRUNUSU9OX0VOQ09ERVJTLAotICAgICAgICBTRUNUSU9OX0VOQ09ERVIsCi0gICAgICAgIFNFQ1RJT05fRU5DT0RFUl9UWVBFLAotICAgICAgICBTRUNUSU9OX0lOQ0xVREUsCi0gICAgfTsKLQotICAgIHN0YXR1c190IG1QYXJzaW5nU3RhdHVzOwotICAgIFNlY3Rpb24gbUN1cnJlbnRTZWN0aW9uOwotICAgIGJvb2wgbVVwZGF0ZTsKLSAgICBzdGQ6OnZlY3RvcjxTZWN0aW9uPiBtU2VjdGlvblN0YWNrOwotICAgIHN0ZDo6c3RyaW5nIG1IcmVmQmFzZTsKLQotICAgIC8vIFNlcnZpY2UgYXR0cmlidXRlcwotICAgIEF0dHJpYnV0ZU1hcCBtU2VydmljZUF0dHJpYnV0ZU1hcDsKLQotICAgIC8vIENvZGVjIGF0dHJpYnV0ZXMKLSAgICBzdGQ6OnN0cmluZyBtQ3VycmVudE5hbWU7Ci0gICAgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IG1Db2RlY1NldDsKLSAgICBDb2RlYyBtQ29kZWNMaXN0VGVtcFsyMDQ4XTsKLSAgICBDb2RlY01hcCBtQ29kZWNNYXA7Ci0gICAgc2l6ZV90IG1Db2RlY0NvdW50ZXI7Ci0gICAgQ29kZWNNYXA6Oml0ZXJhdG9yIG1DdXJyZW50Q29kZWM7Ci0gICAgVHlwZU1hcDo6aXRlcmF0b3IgbUN1cnJlbnRUeXBlOwotCi0gICAgLy8gUm9sZSBtYXAKLSAgICBtdXRhYmxlIFJvbGVNYXAgbVJvbGVNYXA7Ci0KLSAgICAvLyBDb21wdXRlZCBsb25nZXN0IGNvbW1vbiBwcmVmaXgKLSAgICBtdXRhYmxlIHN0ZDo6c3RyaW5nIG1Db21tb25QcmVmaXg7Ci0KLSAgICBib29sIHBhcnNlVG9wTGV2ZWxYTUxGaWxlKGNvbnN0IGNoYXIgKnBhdGgsIGJvb2wgaWdub3JlX2Vycm9ycyA9IGZhbHNlKTsKLQotICAgIHZvaWQgcGFyc2VYTUxGaWxlKGNvbnN0IGNoYXIgKnBhdGgpOwotCi0gICAgc3RhdGljIHZvaWQgU3RhcnRFbGVtZW50SGFuZGxlcldyYXBwZXIoCi0gICAgICAgICAgICB2b2lkICptZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmF0dHJzKTsKLQotICAgIHN0YXRpYyB2b2lkIEVuZEVsZW1lbnRIYW5kbGVyV3JhcHBlcih2b2lkICptZSwgY29uc3QgY2hhciAqbmFtZSk7Ci0KLSAgICB2b2lkIHN0YXJ0RWxlbWVudEhhbmRsZXIoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKmF0dHJzKTsKLSAgICB2b2lkIGVuZEVsZW1lbnRIYW5kbGVyKGNvbnN0IGNoYXIgKm5hbWUpOwotCi0gICAgc3RhdHVzX3QgaW5jbHVkZVhNTEZpbGUoY29uc3QgY2hhciAqKmF0dHJzKTsKLSAgICBzdGF0dXNfdCBhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXMoY29uc3QgY2hhciAqKmF0dHJzKTsKLSAgICBzdGF0dXNfdCBhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXMoYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICoqYXR0cnMpOwotICAgIHZvaWQgYWRkTWVkaWFDb2RlYyhib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICBjb25zdCBjaGFyICp0eXBlID0gbnVsbHB0cik7Ci0KLSAgICBzdGF0dXNfdCBhZGRRdWlyayhjb25zdCBjaGFyICoqYXR0cnMpOwotICAgIHN0YXR1c190IGFkZFR5cGVGcm9tQXR0cmlidXRlcyhjb25zdCBjaGFyICoqYXR0cnMsIGJvb2wgZW5jb2Rlcik7Ci0gICAgc3RhdHVzX3QgYWRkTGltaXQoY29uc3QgY2hhciAqKmF0dHJzKTsKLSAgICBzdGF0dXNfdCBhZGRGZWF0dXJlKGNvbnN0IGNoYXIgKiphdHRycyk7Ci0gICAgdm9pZCBhZGRUeXBlKGNvbnN0IGNoYXIgKm5hbWUpOwotCi0gICAgdm9pZCBnZW5lcmF0ZVJvbGVNYXAoKSBjb25zdDsKLSAgICB2b2lkIGdlbmVyYXRlQ29tbW9uUHJlZml4KCkgY29uc3Q7CisgICAgc3RydWN0IEltcGw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOwogCiAgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXIoY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXImKSA9IGRlbGV0ZTsKICAgICBNZWRpYUNvZGVjc1htbFBhcnNlciYgb3BlcmF0b3I9KGNvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyJikgPSBkZWxldGU7CkBAIC0xODcsNCArMTUxLDMgQEAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmIC8vIE1FRElBX1NUQUdFRlJJR0hUX1hNTFBBUlNFUl9IXwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvbWVkaWFfY29kZWNzLnhzZCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9tZWRpYV9jb2RlY3MueHNkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZWM1ZDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvbWVkaWFfY29kZWNzLnhzZApAQCAtMCwwICsxLDEyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0gVE9ETzogZGVmaW5lIGEgdGFyZ2V0TmFtZXNwYWNlLiBOb3RlIHRoYXQgaXQgd2lsbCBicmVhayByZXRyb2NvbXBhdGliaWxpdHkgLS0+Cis8eHM6c2NoZW1hIHZlcnNpb249IjIuMCIKKyAgICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCisgICAgICAgICAgIGF0dHJpYnV0ZUZvcm1EZWZhdWx0PSJ1bnF1YWxpZmllZCIKKyAgICAgICAgICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIj4KKyAgICA8eHM6ZWxlbWVudCBuYW1lPSJNZWRpYUNvZGVjcyI+CisgICAgICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSW5jbHVkZSIgdHlwZT0iSW5jbHVkZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTZXR0aW5ncyIgdHlwZT0iU2V0dGluZ3MiLz4KKyAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJEZWNvZGVycyIgdHlwZT0iRGVjb2RlcnMiLz4KKyAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJFbmNvZGVycyIgdHlwZT0iRW5jb2RlcnMiLz4KKyAgICAgICAgICAgIDwveHM6Y2hvaWNlPgorICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDwveHM6ZWxlbWVudD4KKyAgICA8eHM6ZWxlbWVudCBuYW1lPSJJbmNsdWRlZCI+CisgICAgICAgIDx4czpjb21wbGV4VHlwZT4KKyAgICAgICAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSW5jbHVkZSIgdHlwZT0iSW5jbHVkZSIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTZXR0aW5ncyIgdHlwZT0iU2V0dGluZ3MiLz4KKyAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJEZWNvZGVycyIgdHlwZT0iRGVjb2RlcnMiLz4KKyAgICAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJFbmNvZGVycyIgdHlwZT0iRW5jb2RlcnMiLz4KKyAgICAgICAgICAgIDwveHM6Y2hvaWNlPgorICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDwveHM6ZWxlbWVudD4KKyAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iRGVjb2RlcnMiPgorICAgICAgICA8eHM6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJNZWRpYUNvZGVjIiB0eXBlPSJNZWRpYUNvZGVjIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8L3hzOnNlcXVlbmNlPgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkVuY29kZXJzIj4KKyAgICAgICAgPHhzOnNlcXVlbmNlPgorICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTWVkaWFDb2RlYyIgdHlwZT0iTWVkaWFDb2RlYyIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgPC94czpzZXF1ZW5jZT4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJTZXR0aW5ncyI+CisgICAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTZXR0aW5nIiB0eXBlPSJTZXR0aW5nIi8+CisgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJWYXJpYW50IiB0eXBlPSJTZXR0aW5nIi8+CisgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJEb21haW4iIHR5cGU9IlNldHRpbmciLz4KKyAgICAgICAgPC94czpjaG9pY2U+CisgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iTWVkaWFDb2RlYyI+CisgICAgICAgIDx4czpjaG9pY2UgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCI+CisgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJRdWlyayIgdHlwZT0iUXVpcmsiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkF0dHJpYnV0ZSIgdHlwZT0iUXVpcmsiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IlR5cGUiIHR5cGU9IlR5cGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkFsaWFzIiB0eXBlPSJBbGlhcyIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iTGltaXQiIHR5cGU9IkxpbWl0IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJGZWF0dXJlIiB0eXBlPSJGZWF0dXJlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJWYXJpYW50IiB0eXBlPSJWYXJpYW50IiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgIDwveHM6Y2hvaWNlPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InR5cGUiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVwZGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmFuayIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZG9tYWluIiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YXJpYW50IiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJlbmFibGVkIiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJRdWlyayI+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzOnN0cmluZyIvPgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IlR5cGUiPgorICAgICAgICA8eHM6c2VxdWVuY2U+CisgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJBbGlhcyIgdHlwZT0iQWxpYXMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KKyAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkxpbWl0IiB0eXBlPSJMaW1pdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRmVhdHVyZSIgdHlwZT0iRmVhdHVyZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICA8L3hzOnNlcXVlbmNlPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVwZGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQWxpYXMiPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgorICAgIDwveHM6Y29tcGxleFR5cGU+CisgICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkxpbWl0Ij4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJkZWZhdWx0IiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJpbiIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibWF4IiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJtaW4iIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJhbmdlIiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJyYW5nZXMiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InNjYWxlIiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iRmVhdHVyZSI+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ib3B0aW9uYWwiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJlcXVpcmVkIiB0eXBlPSJ4czpzdHJpbmciLz4KKyAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ2YWx1ZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iVmFyaWFudCI+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iU2V0dGluZyI+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVuYWJsZWQiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVwZGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgPC94czpjb21wbGV4VHlwZT4KKyAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iSW5jbHVkZSI+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iaHJlZiIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgPC94czpjb21wbGV4VHlwZT4KKzwveHM6c2NoZW1hPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Z0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Z0cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmOTNlOWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdnRzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMyBAQAorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8KKworY2NfdGVzdCB7CisgICAgbmFtZTogInZ0c19tZWRpYUNvZGVjc192YWxpZGF0ZV90ZXN0IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJWYWxpZGF0ZU1lZGlhQ29kZWNzLmNwcCIKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbi50ZXN0LnV0aWxpdHkiLAorICAgICAgICAibGlieG1sMiIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci92dHMvQW5kcm9pZC5tayBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci92dHMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTI5MGJhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Z0cy9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMjIgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX01PRFVMRSA6PSBWdHNWYWxpZGF0ZU1lZGlhQ29kZWNzCitpbmNsdWRlIHRlc3QvdnRzL3Rvb2xzL2J1aWxkL0FuZHJvaWQuaG9zdF9jb25maWcubWsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci92dHMvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL3Z0cy9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdlZTEwNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci92dHMvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iQ29uZmlnIGZvciBWVFMgVnRzVmFsaWRhdGVNZWRpYUNvZGVjcy4iPgorICAgIDxvcHRpb24gbmFtZT0iY29uZmlnLWRlc2NyaXB0b3I6bWV0YWRhdGEiIGtleT0icGxhbiIgdmFsdWU9InZ0cy10cmVibGUiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5WdHNGaWxlUHVzaGVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJhYm9ydC1vbi1wdXNoLWZhaWx1cmUiIHZhbHVlPSJmYWxzZSIvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZ3JvdXAiIHZhbHVlPSJIb3N0RHJpdmVuVGVzdC5wdXNoIi8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IkRBVEEvZXRjL21lZGlhX2NvZGVjcy54c2QtPi9kYXRhL2xvY2FsL3RtcC9tZWRpYV9jb2RlY3MueHNkIi8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLlZ0c011bHRpRGV2aWNlVGVzdCI+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1tb2R1bGUtbmFtZSIgdmFsdWU9IlZ0c1ZhbGlkYXRlTWVkaWFDb2RlY3MiLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJiaW5hcnktdGVzdC1zb3VyY2UiIHZhbHVlPSJfMzJiaXQ6OkRBVEEvbmF0aXZldGVzdC92dHNfbWVkaWFDb2RlY3NfdmFsaWRhdGVfdGVzdC92dHNfbWVkaWFDb2RlY3NfdmFsaWRhdGVfdGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJiaW5hcnktdGVzdC1zb3VyY2UiIHZhbHVlPSJfNjRiaXQ6OkRBVEEvbmF0aXZldGVzdDY0L3Z0c19tZWRpYUNvZGVjc192YWxpZGF0ZV90ZXN0L3Z0c19tZWRpYUNvZGVjc192YWxpZGF0ZV90ZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImJpbmFyeS10ZXN0LXR5cGUiIHZhbHVlPSJndGVzdCIvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtdGltZW91dCIgdmFsdWU9IjMwcyIvPgorICAgIDwvdGVzdD4KKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci92dHMvVmFsaWRhdGVNZWRpYUNvZGVjcy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdnRzL1ZhbGlkYXRlTWVkaWFDb2RlY3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNzgzM2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvdnRzL1ZhbGlkYXRlTWVkaWFDb2RlY3MuY3BwCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8cmVnZXg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJ1dGlsaXR5L1ZhbGlkYXRlWG1sLmgiCisKK3N0YXRpYyB2b2lkIGdldF9maWxlc19pbl9kaXJzKGNvbnN0IGNoYXIqIGRpcl9wYXRoLCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGZpbGVzKSB7CisgICAgRElSKiBkOworICAgIHN0cnVjdCBkaXJlbnQqIGRlOworCisgICAgZCA9IG9wZW5kaXIoZGlyX3BhdGgpOworICAgIGlmIChkID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHdoaWxlICgoZGUgPSByZWFkZGlyKGQpKSkgeworICAgICAgICBpZiAoZGUtPmRfdHlwZSAhPSBEVF9SRUcpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChzdGQ6OnJlZ2V4X21hdGNoKGRlLT5kX25hbWUsIHN0ZDo6cmVnZXgoIihtZWRpYV9jb2RlY3MpKC4qKSgueG1sKSIpKSkgeworICAgICAgICAgICAgZmlsZXMucHVzaF9iYWNrKGRlLT5kX25hbWUpOworICAgICAgICB9CisgICAgfQorICAgIGNsb3NlZGlyKGQpOworfQorCitURVNUKENoZWNrQ29uZmlnLCBtZWRpYUNvZGVjc1ZhbGlkYXRpb24pIHsKKyAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLAorICAgICAgICAgICAgICAgICAgICJWZXJpZnkgdGhhdCB0aGUgbWVkaWEgY29kZWNzIGZpbGUgIgorICAgICAgICAgICAgICAgICAgICJpcyB2YWxpZCBhY2NvcmRpbmcgdG8gdGhlIHNjaGVtYSIpOworCisgICAgY29uc3QgY2hhciogbG9jYXRpb24gPSAiL3ZlbmRvci9ldGMiOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGZpbGVzOworICAgIGdldF9maWxlc19pbl9kaXJzKGxvY2F0aW9uLCBmaWxlcyk7CisKKyAgICBmb3IgKHN0ZDo6c3RyaW5nIGZpbGVfbmFtZSA6IGZpbGVzKSB7CisgICAgICAgIEVYUEVDVF9PTkVfVkFMSURfWE1MX01VTFRJUExFX0xPQ0FUSU9OUyhmaWxlX25hbWUuY19zdHIoKSwge2xvY2F0aW9ufSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvZGF0YS9sb2NhbC90bXAvbWVkaWFfY29kZWNzLnhzZCIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQuYnAgYi9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5Njg4OTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDcgQEAKKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJyZWdpc3Rlcm1zZXh0IiwKKyAgICBzcmNzOiBbInJlZ2lzdGVyLmNwcCJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorfQorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJtZWRpYXNlcnZlciIsCisKKyAgICBzcmNzOiBbIm1haW5fbWVkaWFzZXJ2ZXIuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlicmVzb3VyY2VtYW5hZ2Vyc2VydmljZSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWFwbGF5ZXJzZXJ2aWNlIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJhbmRyb2lkaWN1IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJyZWdpc3Rlcm1zZXh0IiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZSIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyIiwKKyAgICBdLAorCisgICAgLy8gYmFjayB0byAzMi1iaXQsIGIvMTI2NTAyNjEzCisgICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKKworICAgIGluaXRfcmM6IFsibWVkaWFzZXJ2ZXIucmMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHZpbnRmX2ZyYWdtZW50czogWyJtYW5pZmVzdF9tZWRpYV9jMl9zb2Z0d2FyZS54bWwiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQubWsgYi9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzU5N2RiLi4wMDAwMDAwCi0tLSBhL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaWZuZXEgKCQoQk9BUkRfVVNFX0NVU1RPTV9NRURJQVNFUlZFUkVYVEVOU0lPTlMpLHRydWUpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX1NSQ19GSUxFUyA6PSByZWdpc3Rlci5jcHAKLUxPQ0FMX01PRFVMRSA6PSBsaWJyZWdpc3Rlcm1zZXh0Ci1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotTE9DQUxfQ0ZMQUdTIDo9IC1XZXJyb3IgLVdhbGwKLWluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKLWVuZGlmCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0gICAgICAgIG1haW5fbWVkaWFzZXJ2ZXIuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJyZXNvdXJjZW1hbmFnZXJzZXJ2aWNlIFwKLSAgICAgICAgbGlibG9nIFwKLSAgICAgICAgbGlibWVkaWFwbGF5ZXJzZXJ2aWNlIFwKLSAgICAgICAgbGlidXRpbHMgXAotICAgICAgICBsaWJiaW5kZXIgXAotICAgICAgICBsaWJpY3V1YyBcCi0gICAgICAgIGFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCBcCi0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAotICAgICAgICBsaWJpY3VhbmRyb2lkX3V0aWxzIFwKLSAgICAgICAgbGlicmVnaXN0ZXJtc2V4dAotCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UgXAotICAgICAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyIFwKLQotTE9DQUxfTU9EVUxFOj0gbWVkaWFzZXJ2ZXIKLUxPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKLQotTE9DQUxfSU5JVF9SQyA6PSBtZWRpYXNlcnZlci5yYwotCi1MT0NBTF9DRkxBR1MgOj0gLVdlcnJvciAtV2FsbAotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL21lZGlhL21lZGlhc2VydmVyL21haW5fbWVkaWFzZXJ2ZXIuY3BwIGIvbWVkaWEvbWVkaWFzZXJ2ZXIvbWFpbl9tZWRpYXNlcnZlci5jcHAKaW5kZXggZWNkZGM0OC4uN2IyMmIwNSAxMDA2NDQKLS0tIGEvbWVkaWEvbWVkaWFzZXJ2ZXIvbWFpbl9tZWRpYXNlcnZlci5jcHAKKysrIGIvbWVkaWEvbWVkaWFzZXJ2ZXIvbWFpbl9tZWRpYXNlcnZlci5jcHAKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAibWVkaWFzZXJ2ZXIiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKKyNpbmNsdWRlIDxhaWN1L0FJY3UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgpAQCAtMjUsNyArMjYsNiBAQAogI2luY2x1ZGUgIlJlZ2lzdGVyRXh0ZW5zaW9ucy5oIgogCiAvLyBmcm9tIExPQ0FMX0NfSU5DTFVERVMKLSNpbmNsdWRlICJJY3VVdGlscy5oIgogI2luY2x1ZGUgIk1lZGlhUGxheWVyU2VydmljZS5oIgogI2luY2x1ZGUgIlJlc291cmNlTWFuYWdlclNlcnZpY2UuaCIKIApAQCAtMzgsNyArMzgsNyBAQAogICAgIHNwPFByb2Nlc3NTdGF0ZT4gcHJvYyhQcm9jZXNzU3RhdGU6OnNlbGYoKSk7CiAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbShkZWZhdWx0U2VydmljZU1hbmFnZXIoKSk7CiAgICAgQUxPR0koIlNlcnZpY2VNYW5hZ2VyOiAlcCIsIHNtLmdldCgpKTsKLSAgICBJbml0aWFsaXplSWN1T3JEaWUoKTsKKyAgICBBSWN1X2luaXRpYWxpemVJY3VPckRpZSgpOwogICAgIE1lZGlhUGxheWVyU2VydmljZTo6aW5zdGFudGlhdGUoKTsKICAgICBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOwogICAgIHJlZ2lzdGVyRXh0ZW5zaW9ucygpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbWVkaWFzZXJ2ZXIvbWFuaWZlc3RfbWVkaWFfYzJfc29mdHdhcmUueG1sIGIvbWVkaWEvbWVkaWFzZXJ2ZXIvbWFuaWZlc3RfbWVkaWFfYzJfc29mdHdhcmUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxOTYzMzYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9tZWRpYXNlcnZlci9tYW5pZmVzdF9tZWRpYV9jMl9zb2Z0d2FyZS54bWwKQEAgLTAsMCArMSwxMSBAQAorPG1hbmlmZXN0IHZlcnNpb249IjEuMCIgdHlwZT0iZnJhbWV3b3JrIj4KKyAgICA8aGFsPgorICAgICAgICA8bmFtZT5hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyPC9uYW1lPgorICAgICAgICA8dHJhbnNwb3J0Pmh3YmluZGVyPC90cmFuc3BvcnQ+CisgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KKyAgICAgICAgPGludGVyZmFjZT4KKyAgICAgICAgICAgIDxuYW1lPklDb21wb25lbnRTdG9yZTwvbmFtZT4KKyAgICAgICAgICAgIDxpbnN0YW5jZT5zb2Z0d2FyZTwvaW5zdGFuY2U+CisgICAgICAgIDwvaW50ZXJmYWNlPgorICAgIDwvaGFsPgorPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL21lZGlhL210cC9BbmRyb2lkLmJwIGIvbWVkaWEvbXRwL0FuZHJvaWQuYnAKaW5kZXggMmNmOWI4Mi4uNjZhMzEzOSAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbXRwL0FuZHJvaWQuYnAKQEAgLTU0LDYgKzU0LDMgQEAKICAgICBdLAogfQogCi1zdWJkaXJzID0gWwotICAgICJ0ZXN0cyIsCi1dCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvSU10cERhdGFiYXNlLmggYi9tZWRpYS9tdHAvSU10cERhdGFiYXNlLmgKaW5kZXggMTI0NTA5Mi4uODFmYTYwYyAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL0lNdHBEYXRhYmFzZS5oCisrKyBiL21lZGlhL210cC9JTXRwRGF0YWJhc2UuaApAQCAtMTEyLDggKzExMiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIGJvb2wgc3VjY2VlZGVkKSA9IDA7CiAKICAgICB2aXJ0dWFsIE10cFJlc3BvbnNlQ29kZSAgICAgICAgIGJlZ2luQ29weU9iamVjdChNdHBPYmplY3RIYW5kbGUgaGFuZGxlLCBNdHBPYmplY3RIYW5kbGUgbmV3UGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdHBTdG9yYWdlSUQgbmV3U3RvcmFnZSk7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgICAgICAgICBlbmRDb3B5T2JqZWN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIGJvb2wgc3VjY2VlZGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXRwU3RvcmFnZUlEIG5ld1N0b3JhZ2UpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAgICAgICAgIGVuZENvcHlPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgYm9vbCBzdWNjZWVkZWQpID0gMDsKIH07CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5jcHAgYi9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5jcHAKaW5kZXggOTkyZGM5YS4uNWRiY2QwOCAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuY3BwCisrKyBiL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmNwcApAQCAtNTYxLDcgKzU2MSw3IEBACiAgICAgcmV0dXJuIHByb2Nlc3NlZEJ5dGVzID09IG1QYWNrZXRTaXplID8gcHJvY2Vzc2VkQnl0ZXMgOiAtMTsKIH0KIAotaW50IE10cERhdGFQYWNrZXQ6OndyaXRlKHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxdWVzdCwKK2ludDY0X3QgTXRwRGF0YVBhY2tldDo6d3JpdGUoc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXF1ZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgIFVyYlBhY2tldERpdmlzaW9uTW9kZSBkaXZpc2lvbk1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLAogICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwYXlsb2FkU2l6ZSkgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuaCBiL21lZGlhL210cC9NdHBEYXRhUGFja2V0LmgKaW5kZXggMWRkYjgyMS4uMTM4ZjdiMCAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cERhdGFQYWNrZXQuaAorKysgYi9tZWRpYS9tdHAvTXRwRGF0YVBhY2tldC5oCkBAIC0xMTcsNyArMTE3LDggQEAKICAgICBpbnQgICAgICAgICAgICAgICAgIHdyaXRlKHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxdWVzdCwgVXJiUGFja2V0RGl2aXNpb25Nb2RlIGRpdmlzaW9uTW9kZSk7CiAgICAgLy8gU2ltaWxhciB0byBwcmV2aW91cyB3cml0ZSBtZXRob2QgYnV0IGl0IHJlYWRzIHRoZSBwYXlsb2FkIGZyb20gfGZkfC4gSWYgfHNpemV8IGlzIGxhcmdlciB0aGFuCiAgICAgLy8gTVRQX0JVRkZFUl9TSVpFLCB0aGUgZGF0YSB3aWxsIGJlIHNlbnQgYnkgbXVsdGlwbGUgYnVsayB0cmFuc2ZlciByZXF1ZXN0cy4KLSAgICBpbnQgICAgICAgICAgICAgICAgIHdyaXRlKHN0cnVjdCB1c2JfcmVxdWVzdCAqcmVxdWVzdCwgVXJiUGFja2V0RGl2aXNpb25Nb2RlIGRpdmlzaW9uTW9kZSwKKyAgICAvLyBSZXR1cm4gdHlwZSAoaW50NjRfdCkgaXMgdXNlZCB0byBoYW5kbGUgdGhlIGNhc2UgdGhhdCB0aGUgc2l6ZSBjYW4gYmUgbGFyZ2VyIHRoYW4gMkdCLgorICAgIGludDY0X3QgICAgICAgICAgICAgd3JpdGUoc3RydWN0IHVzYl9yZXF1ZXN0ICpyZXF1ZXN0LCBVcmJQYWNrZXREaXZpc2lvbk1vZGUgZGl2aXNpb25Nb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLCBzaXplX3Qgc2l6ZSk7CiAjZW5kaWYKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERldmljZS5jcHAgYi9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcAppbmRleCA5OTM3OTdhLi45NjY1YzU4IDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcAorKysgYi9tZWRpYS9tdHAvTXRwRGV2aWNlLmNwcApAQCAtNTE2LDcgKzUxNiw3IEBACiAgICAgcmV0dXJuIChNdHBPYmplY3RIYW5kbGUpLTE7CiB9CiAKLWJvb2wgTXRwRGV2aWNlOjpzZW5kT2JqZWN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIGludCBzaXplLCBpbnQgc3JjRkQpIHsKK2Jvb2wgTXRwRGV2aWNlOjpzZW5kT2JqZWN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIHVpbnQzMl90IHNpemUsIGludCBzcmNGRCkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsZyhtTXV0ZXgpOwogCiAgICAgaWYgKG1MYXN0U2VuZE9iamVjdEluZm9UcmFuc2FjdGlvbklEICsgMSAhPSBtVHJhbnNhY3Rpb25JRCB8fApAQCAtNTI5LDcgKzUyOSw3IEBACiAgICAgaWYgKHNlbmRSZXF1ZXN0KE1UUF9PUEVSQVRJT05fU0VORF9PQkpFQ1QpKSB7CiAgICAgICAgIG1EYXRhLnNldE9wZXJhdGlvbkNvZGUobVJlcXVlc3QuZ2V0T3BlcmF0aW9uQ29kZSgpKTsKICAgICAgICAgbURhdGEuc2V0VHJhbnNhY3Rpb25JRChtUmVxdWVzdC5nZXRUcmFuc2FjdGlvbklEKCkpOwotICAgICAgICBjb25zdCBpbnQgd3JpdGVSZXN1bHQgPSBtRGF0YS53cml0ZShtUmVxdWVzdE91dCwgbVBhY2tldERpdmlzaW9uTW9kZSwgc3JjRkQsIHNpemUpOworICAgICAgICBjb25zdCBpbnQ2NF90IHdyaXRlUmVzdWx0ID0gbURhdGEud3JpdGUobVJlcXVlc3RPdXQsIG1QYWNrZXREaXZpc2lvbk1vZGUsIHNyY0ZELCBzaXplKTsKICAgICAgICAgY29uc3QgTXRwUmVzcG9uc2VDb2RlIHJldCA9IHJlYWRSZXNwb25zZSgpOwogICAgICAgICByZXR1cm4gcmV0ID09IE1UUF9SRVNQT05TRV9PSyAmJiB3cml0ZVJlc3VsdCA+IDA7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cERldmljZS5oIGIvbWVkaWEvbXRwL010cERldmljZS5oCmluZGV4IDhjZjllNWUuLjAxYmMzZGIgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBEZXZpY2UuaAorKysgYi9tZWRpYS9tdHAvTXRwRGV2aWNlLmgKQEAgLTEwNCw3ICsxMDQsNyBAQAogICAgIE10cE9iamVjdEluZm8qICAgICAgICAgIGdldE9iamVjdEluZm8oTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CiAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgZ2V0VGh1bWJuYWlsKE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIGludCYgb3V0TGVuZ3RoKTsKICAgICBNdHBPYmplY3RIYW5kbGUgICAgICAgICBzZW5kT2JqZWN0SW5mbyhNdHBPYmplY3RJbmZvKiBpbmZvKTsKLSAgICBib29sICAgICAgICAgICAgICAgICAgICBzZW5kT2JqZWN0KE10cE9iamVjdEhhbmRsZSBoYW5kbGUsIGludCBzaXplLCBpbnQgc3JjRkQpOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIHNlbmRPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSwgdWludDMyX3Qgc2l6ZSwgaW50IHNyY0ZEKTsKICAgICBib29sICAgICAgICAgICAgICAgICAgICBkZWxldGVPYmplY3QoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CiAgICAgTXRwT2JqZWN0SGFuZGxlICAgICAgICAgZ2V0UGFyZW50KE10cE9iamVjdEhhbmRsZSBoYW5kbGUpOwogICAgIE10cFN0b3JhZ2VJRCAgICAgICAgICAgIGdldFN0b3JhZ2VJRChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBGZnNIYW5kbGUuY3BwIGIvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5jcHAKaW5kZXggZjI1ZmM3MS4uYmQ2YTZjNiAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5jcHAKKysrIGIvbWVkaWEvbXRwL010cEZmc0hhbmRsZS5jcHAKQEAgLTQ3LDYgKzQ3LDkgQEAKIGNvbnN0ZXhwciB1bnNpZ25lZCBNQVhfRklMRV9DSFVOS19TSVpFID0gQUlPX0JVRlNfTUFYICogQUlPX0JVRl9MRU47CiAKIGNvbnN0ZXhwciB1aW50MzJfdCBNQVhfTVRQX0ZJTEVfU0laRSA9IDB4RkZGRkZGRkY7CisvLyBOb3RlOiBQT0xMX1RJTUVPVVRfTVMgPSAwIG1lYW5zIHJldHVybiBpbW1lZGlhdGVseSBpLmUuIG5vIHNsZWVwLgorLy8gQW5kIHRoaXMgd2lsbCBjYXVzZSBoaWdoIENQVSB1c2FnZS4KK2NvbnN0ZXhwciBpbnQzMl90IFBPTExfVElNRU9VVF9NUyA9IDUwMDsKIAogc3RydWN0IHRpbWVzcGVjIFpFUk9fVElNRU9VVCA9IHsgMCwgMCB9OwogCkBAIC0yMTIsNyArMjE1LDYgQEAKICAgICB1aW50MTZfdCB2YWx1ZSA9IHNldHVwLT53VmFsdWU7CiAgICAgc3RkOjp2ZWN0b3I8Y2hhcj4gYnVmOwogICAgIGJ1Zi5yZXNpemUobGVuZ3RoKTsKLSAgICBpbnQgcmV0ID0gMDsKIAogICAgIGlmICghKHR5cGUgJiBVU0JfRElSX0lOKSkgewogICAgICAgICBpZiAoOjpyZWFkKG1Db250cm9sLCBidWYuZGF0YSgpLCBsZW5ndGgpICE9IGxlbmd0aCkgewpAQCAtMjI1LDggKzIyNyw4IEBACiAgICAgICAgIGNhc2UgTVRQX1JFUV9SRVNFVDoKICAgICAgICAgY2FzZSBNVFBfUkVRX0NBTkNFTDoKICAgICAgICAgICAgIGVycm5vID0gRUNBTkNFTEVEOwotICAgICAgICAgICAgcmV0ID0gLTE7Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgLy8gICAgYnJlYWs7CiAgICAgICAgIGNhc2UgTVRQX1JFUV9HRVRfREVWSUNFX1NUQVRVUzoKICAgICAgICAgewogICAgICAgICAgICAgaWYgKGxlbmd0aCA8IHNpemVvZihzdHJ1Y3QgbXRwX2RldmljZV9zdGF0dXMpICsgNCkgewpAQCAtMzA2LDcgKzMwOCw3IEBACiAgICAgaW50IGVycm9yID0gMDsKIAogICAgIHdoaWxlIChudW1fZXZlbnRzIDwgbWluX2V2ZW50cykgewotICAgICAgICBpZiAocG9sbChtUG9sbEZkcywgMiwgMCkgPT0gLTEpIHsKKyAgICAgICAgaWYgKHBvbGwobVBvbGxGZHMsIDIsIFBPTExfVElNRU9VVF9NUykgPT0gLTEpIHsKICAgICAgICAgICAgIFBMT0coRVJST1IpIDw8ICJNdHAgZXJyb3IgZHVyaW5nIHBvbGwoKSI7CiAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBQYWNrZXQuY3BwIGIvbWVkaWEvbXRwL010cFBhY2tldC5jcHAKaW5kZXggM2RkNDI0OC4uM2IyOThhOSAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFBhY2tldC5jcHAKKysrIGIvbWVkaWEvbXRwL010cFBhY2tldC5jcHAKQEAgLTE1Nyw3ICsxNTcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPmVuZHBvaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5idWZmZXJfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDApOwogICAgIHJlcXVlc3QtPmFjdHVhbF9sZW5ndGggPSByZXN1bHQ7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwIGIvbWVkaWEvbXRwL010cFNlcnZlci5jcHAKaW5kZXggY2NkZGQ2ZS4uY2E4Y2I3OCAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL010cFNlcnZlci5jcHAKKysrIGIvbWVkaWEvbXRwL010cFNlcnZlci5jcHAKQEAgLTk5LDYgKzk5LDcgQEAKICAgICBNVFBfRVZFTlRfU1RPUkVfQURERUQsCiAgICAgTVRQX0VWRU5UX1NUT1JFX1JFTU9WRUQsCiAgICAgTVRQX0VWRU5UX0RFVklDRV9QUk9QX0NIQU5HRUQsCisgICAgTVRQX0VWRU5UX09CSkVDVF9JTkZPX0NIQU5HRUQsCiB9OwogCiBNdHBTZXJ2ZXI6Ok10cFNlcnZlcihJTXRwRGF0YWJhc2UqIGRhdGFiYXNlLCBpbnQgY29udHJvbEZkLCBib29sIHB0cCwKQEAgLTI1OSw2ICsyNjAsMTEgQEAKICAgICBzZW5kRXZlbnQoTVRQX0VWRU5UX09CSkVDVF9SRU1PVkVELCBoYW5kbGUpOwogfQogCit2b2lkIE10cFNlcnZlcjo6c2VuZE9iamVjdEluZm9DaGFuZ2VkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICBBTE9HVigic2VuZE9iamVjdEluZm9DaGFuZ2VkICVkXG4iLCBoYW5kbGUpOworICAgIHNlbmRFdmVudChNVFBfRVZFTlRfT0JKRUNUX0lORk9fQ0hBTkdFRCwgaGFuZGxlKTsKK30KKwogdm9pZCBNdHBTZXJ2ZXI6OnNlbmRTdG9yZUFkZGVkKE10cFN0b3JhZ2VJRCBpZCkgewogICAgIEFMT0dWKCJzZW5kU3RvcmVBZGRlZCAlMDhYXG4iLCBpZCk7CiAgICAgc2VuZEV2ZW50KE1UUF9FVkVOVF9TVE9SRV9BRERFRCwgaWQpOwpAQCAtNDQyLDYgKzQ0OCw5IEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKKyAgICBpZiAocmVzcG9uc2UgIT0gTVRQX1JFU1BPTlNFX09LKQorICAgICAgQUxPR1coIltNVFBdIGdvdCByZXNwb25zZSAweCVYIGluIGNvbW1hbmQgJXMgKCV4KSIsIHJlc3BvbnNlLAorICAgICAgICAgICAgTXRwRGVidWc6OmdldE9wZXJhdGlvbkNvZGVOYW1lKG9wZXJhdGlvbiksIG9wZXJhdGlvbik7CiAgICAgaWYgKHJlc3BvbnNlID09IE1UUF9SRVNQT05TRV9UUkFOU0FDVElPTl9DQU5DRUxMRUQpCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICBtUmVzcG9uc2Uuc2V0UmVzcG9uc2VDb2RlKHJlc3BvbnNlKTsKQEAgLTY1Miw4ICs2NjEsOCBAQAogICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfUEFSQU1FVEVSOwogICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CiAgICAgTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHkgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMik7Ci0gICAgQUxPR1YoIkdldE9iamVjdFByb3BWYWx1ZSAlZCAlc1xuIiwgaGFuZGxlLAotICAgICAgICAgICAgTXRwRGVidWc6OmdldE9iamVjdFByb3BDb2RlTmFtZShwcm9wZXJ0eSkpOworICAgIEFMT0dWKCJHZXRPYmplY3RQcm9wVmFsdWUgJWQgJXMgKDB4JTA0WClcbiIsIGhhbmRsZSwKKyAgICAgICAgICBNdHBEZWJ1Zzo6Z2V0T2JqZWN0UHJvcENvZGVOYW1lKHByb3BlcnR5KSwgcHJvcGVydHkpOwogCiAgICAgcmV0dXJuIG1EYXRhYmFzZS0+Z2V0T2JqZWN0UHJvcGVydHlWYWx1ZShoYW5kbGUsIHByb3BlcnR5LCBtRGF0YSk7CiB9CkBAIC05NDYsNyArOTU1LDggQEAKICAgICBpZiAoIW1EYXRhLmdldFN0cmluZyhtb2RpZmllZCkpIHJldHVybiBNVFBfUkVTUE9OU0VfSU5WQUxJRF9QQVJBTUVURVI7ICAgICAvLyBkYXRlIG1vZGlmaWVkCiAgICAgLy8ga2V5d29yZHMgZm9sbG93CiAKLSAgICBBTE9HVigibmFtZTogJXMgZm9ybWF0OiAlMDRYXG4iLCAoY29uc3QgY2hhciAqKW5hbWUsIGZvcm1hdCk7CisgICAgQUxPR1YoIm5hbWU6ICVzIGZvcm1hdDogMHglMDRYICglcylcbiIsIChjb25zdCBjaGFyKiluYW1lLCBmb3JtYXQsCisgICAgICAgICAgTXRwRGVidWc6OmdldEZvcm1hdENvZGVOYW1lKGZvcm1hdCkpOwogICAgIHRpbWVfdCBtb2RpZmllZFRpbWU7CiAgICAgaWYgKCFwYXJzZURhdGVUaW1lKG1vZGlmaWVkLCBtb2RpZmllZFRpbWUpKQogICAgICAgICBtb2RpZmllZFRpbWUgPSAwOwpAQCAtOTY3LDkgKzk3NywxMCBAQAogICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PQkpFQ1RfVE9PX0xBUkdFOwogICAgIH0KIAotICAgIEFMT0dEKCJwYXRoOiAlcyBwYXJlbnQ6ICVkIHN0b3JhZ2VJRDogJTA4WCIsIChjb25zdCBjaGFyKilwYXRoLCBwYXJlbnQsIHN0b3JhZ2VJRCk7CisgICAgQUxPR1YoInBhdGg6ICVzIHBhcmVudDogJWQgc3RvcmFnZUlEOiAlMDhYIiwgKGNvbnN0IGNoYXIqKXBhdGgsIHBhcmVudCwgc3RvcmFnZUlEKTsKICAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gbURhdGFiYXNlLT5iZWdpblNlbmRPYmplY3QoKGNvbnN0IGNoYXIqKXBhdGgsIGZvcm1hdCwKICAgICAgICAgICAgIHBhcmVudCwgc3RvcmFnZUlEKTsKKyAgICBBTE9HRCgiaGFuZGxlOiAlZCwgcGFyZW50OiAlZCwgc3RvcmFnZUlEOiAlMDhYIiwgaGFuZGxlLCBwYXJlbnQsIHN0b3JhZ2VJRCk7CiAgICAgaWYgKGhhbmRsZSA9PSBrSW52YWxpZE9iamVjdEhhbmRsZSkgewogICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFNlcnZlci5oIGIvbWVkaWEvbXRwL010cFNlcnZlci5oCmluZGV4IGY2OTM5ZDcuLjFmODc5OWYgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBTZXJ2ZXIuaAorKysgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmgKQEAgLTExNSw2ICsxMTUsNyBAQAogCiAgICAgdm9pZCAgICAgICAgICAgICAgICBzZW5kT2JqZWN0QWRkZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CiAgICAgdm9pZCAgICAgICAgICAgICAgICBzZW5kT2JqZWN0UmVtb3ZlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHNlbmRPYmplY3RJbmZvQ2hhbmdlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKICAgICB2b2lkICAgICAgICAgICAgICAgIHNlbmREZXZpY2VQcm9wZXJ0eUNoYW5nZWQoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkpOwogCiBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL09XTkVSUyBiL21lZGlhL210cC9PV05FUlMKaW5kZXggMjE5MzA3Yi4uMTkyOGJhOCAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL09XTkVSUworKysgYi9tZWRpYS9tdHAvT1dORVJTCkBAIC0xICsxLDcgQEAKLXpoYW5namVycnlAZ29vZ2xlLmNvbQorc2V0IG5vcGFyZW50CisKK21hcmNvbmVAZ29vZ2xlLmNvbQoranNoYXJrZXlAYW5kcm9pZC5jb20KK2phbWVzd2VpQGdvb2dsZS5jb20KK3Jtb2p1bWRlckBnb29nbGUuY29tCisKZGlmZiAtLWdpdCBhL21lZGlhL210cC9Qb3NpeEFzeW5jSU8uY3BwIGIvbWVkaWEvbXRwL1Bvc2l4QXN5bmNJTy5jcHAKaW5kZXggZTY3YzU2OC4uNzJjMDdjYyAxMDA2NDQKLS0tIGEvbWVkaWEvbXRwL1Bvc2l4QXN5bmNJTy5jcHAKKysrIGIvbWVkaWEvbXRwL1Bvc2l4QXN5bmNJTy5jcHAKQEAgLTE1LDQyICsxNSwxMDkgQEAKICAqLwogCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+CiAjaW5jbHVkZSA8bWVtb3J5PgotI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KICNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDx0aHJlYWQ+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlICJQb3NpeEFzeW5jSU8uaCIKIAogbmFtZXNwYWNlIHsKIAotdm9pZCByZWFkX2Z1bmMoc3RydWN0IGFpb2NiICphaW9jYnApIHsKLSAgICBhaW9jYnAtPnJldCA9IFRFTVBfRkFJTFVSRV9SRVRSWShwcmVhZChhaW9jYnAtPmFpb19maWxkZXMsCi0gICAgICAgICAgICAgICAgYWlvY2JwLT5haW9fYnVmLCBhaW9jYnAtPmFpb19uYnl0ZXMsIGFpb2NicC0+YWlvX29mZnNldCkpOwotICAgIGlmIChhaW9jYnAtPnJldCA9PSAtMSkgYWlvY2JwLT5lcnJvciA9IGVycm5vOworc3RkOjp0aHJlYWQgZ1dvcmtlclRocmVhZDsKK3N0ZDo6ZGVxdWU8c3RydWN0IGFpb2NiKj4gZ1dvcmtRdWV1ZTsKK2Jvb2wgZ1N1c3BlbmRlZCA9IHRydWU7CitpbnQgZ0Fpb2NiUmVmY291bnQgPSAwOworc3RkOjptdXRleCBnTG9jazsKK3N0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIGdXYWl0OworCit2b2lkIHdvcmtfZnVuYyh2b2lkICopIHsKKyAgICBwdGhyZWFkX3NldG5hbWVfbnAocHRocmVhZF9zZWxmKCksICJBc3luY0lPIHdvcmsiKTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBzdHJ1Y3QgYWlvY2IgKmFpb2NicDsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsayhnTG9jayk7CisgICAgICAgICAgICBnV2FpdC53YWl0KGxrLCBbXXtyZXR1cm4gZ1dvcmtRdWV1ZS5zaXplKCkgPiAwIHx8IGdTdXNwZW5kZWQ7fSk7CisgICAgICAgICAgICBpZiAoZ1N1c3BlbmRlZCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBhaW9jYnAgPSBnV29ya1F1ZXVlLmJhY2soKTsKKyAgICAgICAgICAgIGdXb3JrUXVldWUucG9wX2JhY2soKTsKKyAgICAgICAgfQorICAgICAgICBDSEVDSyhhaW9jYnAtPnF1ZXVlZCk7CisgICAgICAgIGludCByZXQ7CisgICAgICAgIGlmIChhaW9jYnAtPnJlYWQpIHsKKyAgICAgICAgICAgIHJldCA9IFRFTVBfRkFJTFVSRV9SRVRSWShwcmVhZChhaW9jYnAtPmFpb19maWxkZXMsCisgICAgICAgICAgICAgICAgICAgIGFpb2NicC0+YWlvX2J1ZiwgYWlvY2JwLT5haW9fbmJ5dGVzLCBhaW9jYnAtPmFpb19vZmZzZXQpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldCA9IFRFTVBfRkFJTFVSRV9SRVRSWShwd3JpdGUoYWlvY2JwLT5haW9fZmlsZGVzLAorICAgICAgICAgICAgICAgYWlvY2JwLT5haW9fYnVmLCBhaW9jYnAtPmFpb19uYnl0ZXMsIGFpb2NicC0+YWlvX29mZnNldCkpOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbGsoYWlvY2JwLT5sb2NrKTsKKyAgICAgICAgICAgIGFpb2NicC0+cmV0ID0gcmV0OworICAgICAgICAgICAgaWYgKGFpb2NicC0+cmV0ID09IC0xKSB7CisgICAgICAgICAgICAgICAgYWlvY2JwLT5lcnJvciA9IGVycm5vOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWlvY2JwLT5xdWV1ZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBhaW9jYnAtPmN2Lm5vdGlmeV9hbGwoKTsKKyAgICB9CiB9CiAKLXZvaWQgd3JpdGVfZnVuYyhzdHJ1Y3QgYWlvY2IgKmFpb2NicCkgewotICAgIGFpb2NicC0+cmV0ID0gVEVNUF9GQUlMVVJFX1JFVFJZKHB3cml0ZShhaW9jYnAtPmFpb19maWxkZXMsCi0gICAgICAgICAgICAgICAgYWlvY2JwLT5haW9fYnVmLCBhaW9jYnAtPmFpb19uYnl0ZXMsIGFpb2NicC0+YWlvX29mZnNldCkpOwotICAgIGlmIChhaW9jYnAtPnJldCA9PSAtMSkgYWlvY2JwLT5lcnJvciA9IGVycm5vOworaW50IGFpb19hZGQoc3RydWN0IGFpb2NiICphaW9jYnApIHsKKyAgICBDSEVDSyghYWlvY2JwLT5xdWV1ZWQpOworICAgIGFpb2NicC0+cXVldWVkID0gdHJ1ZTsKKyAgICB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbGsoZ0xvY2spOworICAgICAgICBnV29ya1F1ZXVlLnB1c2hfZnJvbnQoYWlvY2JwKTsKKyAgICB9CisgICAgZ1dhaXQubm90aWZ5X29uZSgpOworICAgIHJldHVybiAwOwogfQogCiB9IC8vIGVuZCBhbm9ueW1vdXMgbmFtZXNwYWNlCiAKK2Fpb2NiOjphaW9jYigpIHsKKyAgICB0aGlzLT5yZXQgPSAwOworICAgIHRoaXMtPnF1ZXVlZCA9IGZhbHNlOworICAgIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsayhnTG9jayk7CisgICAgICAgIGlmIChnQWlvY2JSZWZjb3VudCA9PSAwKSB7CisgICAgICAgICAgICBDSEVDSyhnV29ya1F1ZXVlLnNpemUoKSA9PSAwKTsKKyAgICAgICAgICAgIENIRUNLKGdTdXNwZW5kZWQpOworICAgICAgICAgICAgZ1N1c3BlbmRlZCA9IGZhbHNlOworICAgICAgICAgICAgZ1dvcmtlclRocmVhZCA9IHN0ZDo6dGhyZWFkKHdvcmtfZnVuYywgbnVsbHB0cik7CisgICAgICAgIH0KKyAgICAgICAgZ0Fpb2NiUmVmY291bnQrKzsKKyAgICB9Cit9CisKIGFpb2NiOjp+YWlvY2IoKSB7Ci0gICAgQ0hFQ0soIXRocmVhZC5qb2luYWJsZSgpKTsKKyAgICBDSEVDSyghdGhpcy0+cXVldWVkKTsKKyAgICB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbGsoZ0xvY2spOworICAgICAgICBDSEVDSyghZ1N1c3BlbmRlZCk7CisgICAgICAgIGlmIChnQWlvY2JSZWZjb3VudCA9PSAxKSB7CisgICAgICAgICAgICBDSEVDSyhnV29ya1F1ZXVlLnNpemUoKSA9PSAwKTsKKyAgICAgICAgICAgIGdTdXNwZW5kZWQgPSB0cnVlOworICAgICAgICAgICAgbGsudW5sb2NrKCk7CisgICAgICAgICAgICBnV2FpdC5ub3RpZnlfb25lKCk7CisgICAgICAgICAgICBnV29ya2VyVGhyZWFkLmpvaW4oKTsKKyAgICAgICAgICAgIGxrLmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICBnQWlvY2JSZWZjb3VudC0tOworICAgIH0KIH0KIAogaW50IGFpb19yZWFkKHN0cnVjdCBhaW9jYiAqYWlvY2JwKSB7Ci0gICAgYWlvY2JwLT50aHJlYWQgPSBzdGQ6OnRocmVhZChyZWFkX2Z1bmMsIGFpb2NicCk7Ci0gICAgcmV0dXJuIDA7CisgICAgYWlvY2JwLT5yZWFkID0gdHJ1ZTsKKyAgICByZXR1cm4gYWlvX2FkZChhaW9jYnApOwogfQogCiBpbnQgYWlvX3dyaXRlKHN0cnVjdCBhaW9jYiAqYWlvY2JwKSB7Ci0gICAgYWlvY2JwLT50aHJlYWQgPSBzdGQ6OnRocmVhZCh3cml0ZV9mdW5jLCBhaW9jYnApOwotICAgIHJldHVybiAwOworICAgIGFpb2NicC0+cmVhZCA9IGZhbHNlOworICAgIHJldHVybiBhaW9fYWRkKGFpb2NicCk7CiB9CiAKIGludCBhaW9fZXJyb3IoY29uc3Qgc3RydWN0IGFpb2NiICphaW9jYnApIHsKQEAgLTY0LDcgKzEzMSwxMCBAQAogaW50IGFpb19zdXNwZW5kKHN0cnVjdCBhaW9jYiAqYWlvY2JwW10sIGludCBuLAogICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKikgewogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgICAgIGFpb2NicFtpXS0+dGhyZWFkLmpvaW4oKTsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsayhhaW9jYnBbaV0tPmxvY2spOworICAgICAgICAgICAgYWlvY2JwW2ldLT5jdi53YWl0KGxrLCBbYWlvY2JwLCBpXXtyZXR1cm4gIWFpb2NicFtpXS0+cXVldWVkO30pOworICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiAwOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL1Bvc2l4QXN5bmNJTy5oIGIvbWVkaWEvbXRwL1Bvc2l4QXN5bmNJTy5oCmluZGV4IDU5MGFhZWYuLjJiYjU3MzUgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9Qb3NpeEFzeW5jSU8uaAorKysgYi9tZWRpYS9tdHAvUG9zaXhBc3luY0lPLmgKQEAgLTE3LDEwICsxNywxMSBAQAogI2lmbmRlZiBfUE9TSVhBU1lOQ0lPX0gKICNkZWZpbmUgX1BPU0lYQVNZTkNJT19ICiAKKyNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+CisjaW5jbHVkZSA8bXV0ZXg+CiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8dGltZS5oPgotI2luY2x1ZGUgPHRocmVhZD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAogLyoqCkBAIC0zNSwxMCArMzYsMTUgQEAKICAgICBzaXplX3QgYWlvX25ieXRlczsKIAogICAgIC8vIFVzZWQgaW50ZXJuYWxseQotICAgIHN0ZDo6dGhyZWFkIHRocmVhZDsKKyAgICBib29sIHJlYWQ7CisgICAgYm9vbCBxdWV1ZWQ7CiAgICAgc3NpemVfdCByZXQ7CiAgICAgaW50IGVycm9yOwogCisgICAgc3RkOjptdXRleCBsb2NrOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIGN2OworCisgICAgYWlvY2IoKTsKICAgICB+YWlvY2IoKTsKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9BbmRyb2lkLmJwIGIvbWVkaWEvbmRrL0FuZHJvaWQuYnAKaW5kZXggNGEzNjY4MS4uYTNjYWJkOCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbmRrL0FuZHJvaWQuYnAKQEAgLTMxLDYgKzMxLDEzIEBACiAgICAgbGljZW5zZTogIk5PVElDRSIsCiB9CiAKKy8vIGZvciB1c2Ugd2l0aCBoZWFkZXJfbGlicworY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0KK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJtZWRpYW5kayIsCiAKQEAgLTU0LDkgKzYxLDcgQEAKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCi0gICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKICAgICAgICAgIi1ERVhQT1JUPV9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoXCJkZWZhdWx0XCIpKSkiLAotCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1XYWxsIiwKICAgICBdLApAQCAtNjYsMzUgKzcxLDExMSBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCisgICAgICAgICJsaWJhbmRyb2lkX3J1bnRpbWVfbGF6eSIsCisgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJtZWRpYSIsCiAgICAgICAgICJsaWJtZWRpYV9vbXgiLAotICAgICAgICAibGlibWVkaWFfam5pIiwKKyAgICAgICAgImxpYm1lZGlhX2puaV91dGlscyIsCiAgICAgICAgICJsaWJtZWRpYWRybSIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGliYW5kcm9pZCIsCi0gICAgICAgICJsaWJhbmRyb2lkX3J1bnRpbWUiLAorICAgICAgICAibGlibmF0aXZld2luZG93IiwKICAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCiAgICAgICAgICJsaWJndWkiLAogICAgICAgICAibGlidWkiLAorICAgICAgICAibGlibWVkaWEyX2puaV9jb3JlIiwKKyAgICAgICAgImxpYm1lZGlhbmRrX3V0aWxzIiwKICAgICBdLAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiAKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJndWkiLAorICAgIF0sCisKICAgICBwcm9kdWN0X3ZhcmlhYmxlczogewogICAgICAgICBwZGs6IHsKICAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAogICAgICAgICB9LAogICAgIH0sCisgICAgdmVyc2lvbl9zY3JpcHQ6ICJsaWJtZWRpYW5kay5tYXAudHh0IiwKKyAgICBzdHViczogeworICAgICAgICBzeW1ib2xfZmlsZTogImxpYm1lZGlhbmRrLm1hcC50eHQiLAorICAgICAgICB2ZXJzaW9uczogWyIyOSJdLAorICAgIH0sCisKKyAgICAvLyBCdWc6IGh0dHA6Ly9iLzEyNDUyMjk5NSBsaWJtZWRpYW5kayBoYXMgbGlua2VyIGVycm9ycyB3aGVuIGJ1aWx0IHdpdGgKKyAgICAvLyBjb3ZlcmFnZQorICAgIG5hdGl2ZV9jb3ZlcmFnZTogZmFsc2UsCiB9CiAKIGxsbmRrX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJtZWRpYW5kayIsCiAgICAgc3ltYm9sX2ZpbGU6ICJsaWJtZWRpYW5kay5tYXAudHh0IiwKLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGlibWVkaWFuZGtfdXRpbHMiLAorCisgICAgc3JjczogWworICAgICAgICAiTmRrTWVkaWFEYXRhU291cmNlQ2FsbGJhY2tzLmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbmRrL2luY2x1ZGUiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJBSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0IiwKKyAgICBzcmNzOiBbInRlc3RzL0FJbWFnZVJlYWRlcldpbmRvd0hhbmRsZVRlc3QuY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLURfX0FORFJPSURfVk5ES19fIiwKKyAgICBdLAorICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9uZGsvIiwKKyAgICBdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka0ltYWdlLmNwcCBiL21lZGlhL25kay9OZGtJbWFnZS5jcHAKaW5kZXggMjBiMTY2Ny4uMTg4M2Y2MyAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka0ltYWdlLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrSW1hZ2UuY3BwCkBAIC0yMyw3ICsyMyw3IEBACiAjaW5jbHVkZSAiTmRrSW1hZ2VSZWFkZXJQcml2LmgiCiAKICNpbmNsdWRlIDxhbmRyb2lkX21lZGlhX1V0aWxzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL2FuZHJvaWRfaGFyZHdhcmVfSGFyZHdhcmVCdWZmZXIuaD4KKyNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWQvQUhhcmR3YXJlQnVmZmVySGVscGVycy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgImhhcmR3YXJlL2NhbWVyYTMuaCIKIApAQCAtMTkwLDcgKzE5MCw3IEBACiAKICAgICBhdXRvIGxvY2tlZEJ1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q3B1Q29uc3VtZXI6OkxvY2tlZEJ1ZmZlcj4oKTsKIAotICAgIHVpbnQ2NF90IGdyYWxsb2NVc2FnZSA9IGFuZHJvaWRfaGFyZHdhcmVfSGFyZHdhcmVCdWZmZXJfY29udmVydFRvR3JhbGxvY1VzYWdlQml0cyhtVXNhZ2UpOworICAgIHVpbnQ2NF90IGdyYWxsb2NVc2FnZSA9IEFIYXJkd2FyZUJ1ZmZlcl9jb252ZXJ0VG9HcmFsbG9jVXNhZ2VCaXRzKG1Vc2FnZSk7CiAKICAgICBzdGF0dXNfdCByZXQgPQogICAgICAgICAgICAgbG9ja0ltYWdlRnJvbUJ1ZmZlcihtQnVmZmVyLCBncmFsbG9jVXNhZ2UsIG1CdWZmZXItPm1GZW5jZS0+ZHVwKCksIGxvY2tlZEJ1ZmZlci5nZXQoKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXIuY3BwIGIvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyLmNwcAppbmRleCBiZTYzNWZmLi5iYWE0ZmM3IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXIuY3BwCisrKyBiL21lZGlhL25kay9OZGtJbWFnZVJlYWRlci5jcHAKQEAgLTIxLDEzICsyMSwxNSBAQAogCiAjaW5jbHVkZSAiTmRrSW1hZ2VQcml2LmgiCiAjaW5jbHVkZSAiTmRrSW1hZ2VSZWFkZXJQcml2LmgiCisjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9OZGtJbWFnZS5oPgogCiAjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPGFuZHJvaWRfbWVkaWFfVXRpbHMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvYW5kcm9pZF92aWV3X1N1cmZhY2UuaD4KLSNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvYW5kcm9pZF9oYXJkd2FyZV9IYXJkd2FyZUJ1ZmZlci5oPgorI2luY2x1ZGUgPHVpL1B1YmxpY0Zvcm1hdC5oPgorI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZC9BSGFyZHdhcmVCdWZmZXJIZWxwZXJzLmg+CiAjaW5jbHVkZSA8Z3JhbGxvY3VzYWdlL0dyYWxsb2NVc2FnZUNvbnZlcnNpb24uaD4KKyNpbmNsdWRlIDxndWkvYnVmZmVycXVldWUvMS4wL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKQEAgLTQzLDYgKzQ1LDEwIEBACiBjb25zdCBjaGFyKiBBSW1hZ2VSZWFkZXI6OmtDb250ZXh0S2V5ICAgID0gIkNvbnRleHQiOwogY29uc3QgY2hhciogQUltYWdlUmVhZGVyOjprR3JhcGhpY0J1ZmZlcktleSA9ICJHcmFwaGljQnVmZmVyIjsKIAorc3RhdGljIGNvbnN0ZXhwciBpbnQga1dpbmRvd0hhbFRva2VuU2l6ZU1heCA9IDI1NjsKKworc3RhdGljIG5hdGl2ZV9oYW5kbGVfdCAqY29udmVydEhhbFRva2VuVG9OYXRpdmVIYW5kbGUoY29uc3QgSGFsVG9rZW4gJmhhbFRva2VuKTsKKwogYm9vbAogQUltYWdlUmVhZGVyOjppc1N1cHBvcnRlZEZvcm1hdEFuZFVzYWdlKGludDMyX3QgZm9ybWF0LCB1aW50NjRfdCB1c2FnZSkgewogICAgIC8vIENoZWNrIHdoZXRoZXIgdXNhZ2UgaGFzIGVpdGhlciBDUFVfUkVBRF9PRlRFTiBvciBDUFVfUkVBRCBzZXQuIE5vdGUgdGhhdCBjaGVjayBhZ2FpbnN0CkBAIC01OCwxMSArNjQsMTUgQEAKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4OgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfSlBFRzoKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1JBVzE2OgorICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUkFXX0RFUFRIOgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUkFXX1BSSVZBVEU6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9SQVcxMDoKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1JBVzEyOgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfREVQVEgxNjoKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX0RFUFRIX1BPSU5UX0NMT1VEOgorICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfWTg6CisgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9IRUlDOgorICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfREVQVEhfSlBFRzoKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUFJJVkFURToKICAgICAgICAgICAgIC8vIEZvciBwcml2YXRlIGZvcm1hdCwgY3B1IHVzYWdlIGlzIHByb2hpYml0ZWQuCkBAIC04NCwxMSArOTQsMTUgQEAKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1JHQkFfRlAxNjoKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX0pQRUc6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9SQVcxNjoKKyAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1JBV19ERVBUSDoKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1JBV19QUklWQVRFOgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUkFXMTA6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9SQVcxMjoKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX0RFUFRIMTY6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9ERVBUSF9QT0lOVF9DTE9VRDoKKyAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1k4OgorICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfSEVJQzoKKyAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX0RFUFRIX0pQRUc6CiAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1BSSVZBVEU6CiAgICAgICAgICAgICByZXR1cm4gMDsKQEAgLTI2MSw5ICsyNzUsOSBAQAogbWVkaWFfc3RhdHVzX3QKIEFJbWFnZVJlYWRlcjo6aW5pdCgpIHsKICAgICBQdWJsaWNGb3JtYXQgcHVibGljRm9ybWF0ID0gc3RhdGljX2Nhc3Q8UHVibGljRm9ybWF0PihtRm9ybWF0KTsKLSAgICBtSGFsRm9ybWF0ID0gYW5kcm9pZF92aWV3X1N1cmZhY2VfbWFwUHVibGljRm9ybWF0VG9IYWxGb3JtYXQocHVibGljRm9ybWF0KTsKLSAgICBtSGFsRGF0YVNwYWNlID0gYW5kcm9pZF92aWV3X1N1cmZhY2VfbWFwUHVibGljRm9ybWF0VG9IYWxEYXRhc3BhY2UocHVibGljRm9ybWF0KTsKLSAgICBtSGFsVXNhZ2UgPSBhbmRyb2lkX2hhcmR3YXJlX0hhcmR3YXJlQnVmZmVyX2NvbnZlcnRUb0dyYWxsb2NVc2FnZUJpdHMobVVzYWdlKTsKKyAgICBtSGFsRm9ybWF0ID0gbWFwUHVibGljRm9ybWF0VG9IYWxGb3JtYXQocHVibGljRm9ybWF0KTsKKyAgICBtSGFsRGF0YVNwYWNlID0gbWFwUHVibGljRm9ybWF0VG9IYWxEYXRhc3BhY2UocHVibGljRm9ybWF0KTsKKyAgICBtSGFsVXNhZ2UgPSBBSGFyZHdhcmVCdWZmZXJfY29udmVydFRvR3JhbGxvY1VzYWdlQml0cyhtVXNhZ2UpOwogCiAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2JQcm9kdWNlcjsKICAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBnYkNvbnN1bWVyOwpAQCAtMzAxLDYgKzMxNSw5IEBACiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEJ1ZmZlckl0ZW1Db25zdW1lciBidWZmZXIgZGF0YVNwYWNlIik7CiAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CisgICAgaWYgKG1Vc2FnZSAmIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9QUk9URUNURURfQ09OVEVOVCkgeworICAgICAgICBnYkNvbnN1bWVyLT5zZXRDb25zdW1lcklzUHJvdGVjdGVkKHRydWUpOworICAgIH0KIAogICAgIG1TdXJmYWNlID0gbmV3IFN1cmZhY2UobVByb2R1Y2VyLCAvKmNvbnRyb2xsZWRCeUFwcCovdHJ1ZSk7CiAgICAgaWYgKG1TdXJmYWNlID09IG51bGxwdHIpIHsKQEAgLTM1MCw4ICszNjcsMTAgQEAKICAgICAgICAgICAgICAgaXQgIT0gbUFjcXVpcmVkSW1hZ2VzLmVuZCgpOyBpdCsrKSB7CiAgICAgICAgIEFJbWFnZSogaW1hZ2UgPSAqaXQ7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChpbWFnZS0+bUxvY2spOwotICAgICAgICByZWxlYXNlSW1hZ2VMb2NrZWQoaW1hZ2UsIC8qcmVsZWFzZUZlbmNlRmQqLy0xKTsKKyAgICAgICAgLy8gRG8gbm90IGFsdGVyIG1BY3F1aXJlZEltYWdlcyB3aGlsZSB3ZSBhcmUgaXRlcmF0aW5nIG9uIGl0CisgICAgICAgIHJlbGVhc2VJbWFnZUxvY2tlZChpbWFnZSwgLypyZWxlYXNlRmVuY2VGZCovLTEsIC8qY2xlYXJDYWNoZSovZmFsc2UpOwogICAgIH0KKyAgICBtQWNxdWlyZWRJbWFnZXMuY2xlYXIoKTsKIAogICAgIC8vIERlbGV0ZSBCdWZmZXIgSXRlbXMKICAgICBmb3IgKGF1dG8gaXQgPSBtQnVmZmVycy5iZWdpbigpOwpAQCAtMzYzLDYgKzM4MiwxNSBAQAogICAgICAgICBtQnVmZmVySXRlbUNvbnN1bWVyLT5hYmFuZG9uKCk7CiAgICAgICAgIG1CdWZmZXJJdGVtQ29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIobnVsbHB0cik7CiAgICAgfQorCisgICAgaWYgKG1XaW5kb3dIYW5kbGUgIT0gbnVsbHB0cikgeworICAgICAgICBpbnQgc2l6ZSA9IG1XaW5kb3dIYW5kbGUtPmRhdGFbMF07CisgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IGhhbFRva2VuOworICAgICAgICBoYWxUb2tlbi5zZXRUb0V4dGVybmFsKAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KCZtV2luZG93SGFuZGxlLT5kYXRhWzFdKSwgc2l6ZSk7CisgICAgICAgIGRlbGV0ZUhhbFRva2VuKGhhbFRva2VuKTsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobVdpbmRvd0hhbmRsZSk7CisgICAgfQogfQogCiBtZWRpYV9zdGF0dXNfdApAQCAtNDgxLDcgKzUwOSw3IEBACiB9CiAKIHZvaWQKLUFJbWFnZVJlYWRlcjo6cmVsZWFzZUltYWdlTG9ja2VkKEFJbWFnZSogaW1hZ2UsIGludCByZWxlYXNlRmVuY2VGZCkgeworQUltYWdlUmVhZGVyOjpyZWxlYXNlSW1hZ2VMb2NrZWQoQUltYWdlKiBpbWFnZSwgaW50IHJlbGVhc2VGZW5jZUZkLCBib29sIGNsZWFyQ2FjaGUpIHsKICAgICBCdWZmZXJJdGVtKiBidWZmZXIgPSBpbWFnZS0+bUJ1ZmZlcjsKICAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IGlzIG5vdCBmYXRhbApAQCAtNTA1LDYgKzUzMywxMCBAQAogICAgIGltYWdlLT5tTG9ja2VkQnVmZmVyID0gbnVsbHB0cjsKICAgICBpbWFnZS0+bUlzQ2xvc2VkID0gdHJ1ZTsKIAorICAgIGlmICghY2xlYXJDYWNoZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwogICAgIC8vIGNsZWFudXAgYWNxdWlyZWQgaW1hZ2UgbGlzdAogICAgIGZvciAoYXV0byBpdCA9IG1BY3F1aXJlZEltYWdlcy5iZWdpbigpOwpAQCAtNTIyLDYgKzU1NCwyNSBAQAogICAgIH0KIH0KIAorbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyOjpnZXRXaW5kb3dOYXRpdmVIYW5kbGUobmF0aXZlX2hhbmRsZSAqKmhhbmRsZSkgeworICAgIGlmIChtV2luZG93SGFuZGxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgKmhhbmRsZSA9IG1XaW5kb3dIYW5kbGU7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgfQorICAgIHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGhnYnAgPQorICAgICAgICBuZXcgVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4obVByb2R1Y2VyKTsKKyAgICBIYWxUb2tlbiBoYWxUb2tlbjsKKyAgICBpZiAoIWNyZWF0ZUhhbFRva2VuKGhnYnAsICZoYWxUb2tlbikpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOworICAgIH0KKyAgICBtV2luZG93SGFuZGxlID0gY29udmVydEhhbFRva2VuVG9OYXRpdmVIYW5kbGUoaGFsVG9rZW4pOworICAgIGlmICghbVdpbmRvd0hhbmRsZSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CisgICAgfQorICAgICpoYW5kbGUgPSBtV2luZG93SGFuZGxlOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKIGludAogQUltYWdlUmVhZGVyOjpnZXRCdWZmZXJXaWR0aChCdWZmZXJJdGVtKiBidWZmZXIpIHsKICAgICBpZiAoYnVmZmVyID09IE5VTEwpIHJldHVybiAtMTsKQEAgLTU4NSw2ICs2MzYsMzMgQEAKICAgICB9CiB9CiAKK3N0YXRpYyBuYXRpdmVfaGFuZGxlX3QgKmNvbnZlcnRIYWxUb2tlblRvTmF0aXZlSGFuZGxlKAorICAgICAgICBjb25zdCBIYWxUb2tlbiAmaGFsVG9rZW4pIHsKKyAgICAvLyBXZSBhdHRlbXB0IHRvIHN0b3JlIGhhbFRva2VuIGluIHRoZSBpbnRzIG9mIHRoZSBuYXRpdmVfaGFuZGxlX3QgYWZ0ZXIgaXRzCisgICAgLy8gc2l6ZS4gVGhlIGZpcnN0IGludCBzdG9yZXMgdGhlIHNpemUgb2YgdGhlIHRva2VuLiBXZSBzdG9yZSB0aGlzIGluIGFuIGludAorICAgIC8vIHRvIGF2b2lkIGFsaWdubWVudCBpc3N1ZXMgd2hlcmUgc2l6ZV90IGFuZCBpbnQgZG8gbm90IGhhdmUgdGhlIHNhbWUKKyAgICAvLyBhbGlnbm1lbnQuCisgICAgc2l6ZV90IG5oRGF0YUJ5dGVTaXplID0gaGFsVG9rZW4uc2l6ZSgpOworICAgIGlmIChuaERhdGFCeXRlU2l6ZSA+IGtXaW5kb3dIYWxUb2tlblNpemVNYXgpIHsKKyAgICAgICAgLy8gVGhlIHNpemUgb2YgdGhlIHRva2VuIGlzbid0IHJlYXNvbmFibGUuLgorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc2l6ZV90IG51bUludHMgPSBjZWlsKG5oRGF0YUJ5dGVTaXplIC8gc2l6ZW9mKGludCkpICsgMTsKKworICAgIC8vIFdlIGRvbid0IGNoZWNrIGZvciBvdmVyZmxvdywgd2hldGhlciBudW1JbnRzIGNhbiBmaXQgaW4gYW4gaW50LCBzaW5jZSB3ZQorICAgIC8vIGV4cGVjdCBrV2luZG93SGFsVG9rZW5TaXplTWF4IHRvIGJlIGEgcmVhc29uYWJsZSBsaW1pdC4KKyAgICAvLyBjcmVhdGUgYSBuYXRpdmVfaGFuZGxlX3Qgd2l0aCAwIG51bUZkcyBhbmQgbnVtSW50cyBudW1iZXIgb2YgaW50cy4KKyAgICBuYXRpdmVfaGFuZGxlX3QgKm5oID0KKyAgICAgICAgbmF0aXZlX2hhbmRsZV9jcmVhdGUoMCwgbnVtSW50cyk7CisgICAgaWYgKCFuaCkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgLy8gU3RvcmUgdGhlIHNpemUgb2YgdGhlIHRva2VuIGluIHRoZSBmaXJzdCBpbnQuCisgICAgbmgtPmRhdGFbMF0gPSBuaERhdGFCeXRlU2l6ZTsKKyAgICBtZW1jcHkoJihuaC0+ZGF0YVsxXSksIGhhbFRva2VuLmRhdGEoKSwgbmhEYXRhQnl0ZVNpemUpOworICAgIHJldHVybiBuaDsKK30KKwogRVhQT1JUCiBtZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfbmV3KAogICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCBmb3JtYXQsIGludDMyX3QgbWF4SW1hZ2VzLApAQCAtNTk0LDYgKzY3MiwxOSBAQAogICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfQ1BVX1JFQURfT0ZURU4sIG1heEltYWdlcywgcmVhZGVyKTsKIH0KIAorZXh0ZXJuICJDIiB7CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX2dldFdpbmRvd05hdGl2ZUhhbmRsZSgKKyAgICAgICAgQUltYWdlUmVhZGVyICpyZWFkZXIsIC8qb3V0Ki9uYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpIHsKKyAgICBpZiAocmVhZGVyID09IG51bGxwdHIgfHwgaGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgcmV0dXJuIHJlYWRlci0+Z2V0V2luZG93TmF0aXZlSGFuZGxlKGhhbmRsZSk7Cit9CisKK30gLy9leHRlcm4gIkMiCisKIEVYUE9SVAogbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX25ld1dpdGhVc2FnZSgKICAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3QgZm9ybWF0LCB1aW50NjRfdCB1c2FnZSwKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtJbWFnZVJlYWRlclByaXYuaCBiL21lZGlhL25kay9OZGtJbWFnZVJlYWRlclByaXYuaAppbmRleCBiZWQ4YTIxLi5lMzI4Y2IxIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXJQcml2LmgKKysrIGIvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyUHJpdi5oCkBAIC02OSw2ICs2OSw4IEBACiAgICAgbWVkaWFfc3RhdHVzX3QgYWNxdWlyZU5leHRJbWFnZSgvKm91dCovQUltYWdlKiogaW1hZ2UsIC8qb3V0Ki9pbnQqIGZlbmNlRmQpOwogICAgIG1lZGlhX3N0YXR1c190IGFjcXVpcmVMYXRlc3RJbWFnZSgvKm91dCovQUltYWdlKiogaW1hZ2UsIC8qb3V0Ki9pbnQqIGZlbmNlRmQpOwogCisgICAgbWVkaWFfc3RhdHVzX3QgZ2V0V2luZG93TmF0aXZlSGFuZGxlKC8qb3V0Ki9uYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCiAgICAgQU5hdGl2ZVdpbmRvdyogZ2V0V2luZG93KCkgICAgY29uc3QgeyByZXR1cm4gbVdpbmRvdy5nZXQoKTsgfTsKICAgICBpbnQzMl90ICAgICAgICBnZXRXaWR0aCgpICAgICBjb25zdCB7IHJldHVybiBtV2lkdGg7IH07CiAgICAgaW50MzJfdCAgICAgICAgZ2V0SGVpZ2h0KCkgICAgY29uc3QgeyByZXR1cm4gbUhlaWdodDsgfTsKQEAgLTg2LDcgKzg4LDcgQEAKICAgICBtZWRpYV9zdGF0dXNfdCBhY3F1aXJlSW1hZ2VMb2NrZWQoLypvdXQqL0FJbWFnZSoqIGltYWdlLCAvKm91dCovaW50KiBmZW5jZUZkKTsKIAogICAgIC8vIENhbGxlZCBieSBBSW1hZ2UvfkFJbWFnZVJlYWRlciB0byBjbG9zZSBpbWFnZS4gQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIHRvIGdyYWIgQUltYWdlOjptTG9jawotICAgIHZvaWQgcmVsZWFzZUltYWdlTG9ja2VkKEFJbWFnZSogaW1hZ2UsIGludCByZWxlYXNlRmVuY2VGZCk7CisgICAgdm9pZCByZWxlYXNlSW1hZ2VMb2NrZWQoQUltYWdlKiBpbWFnZSwgaW50IHJlbGVhc2VGZW5jZUZkLCBib29sIGNsZWFyQ2FjaGUgPSB0cnVlKTsKIAogICAgIHN0YXRpYyBpbnQgZ2V0QnVmZmVyV2lkdGgoQnVmZmVySXRlbSogYnVmZmVyKTsKICAgICBzdGF0aWMgaW50IGdldEJ1ZmZlckhlaWdodChCdWZmZXJJdGVtKiBidWZmZXIpOwpAQCAtMTYwLDYgKzE2Miw3IEBACiAgICAgc3A8U3VyZmFjZT4gICAgICAgICAgICAgICAgbVN1cmZhY2U7CiAgICAgc3A8QnVmZmVySXRlbUNvbnN1bWVyPiAgICAgbUJ1ZmZlckl0ZW1Db25zdW1lcjsKICAgICBzcDxBTmF0aXZlV2luZG93PiAgICAgICAgICBtV2luZG93OworICAgIG5hdGl2ZV9oYW5kbGVfdCogICAgICAgICAgIG1XaW5kb3dIYW5kbGUgPSBudWxscHRyOwogCiAgICAgTGlzdDxBSW1hZ2UqPiAgICAgICAgICAgICAgbUFjcXVpcmVkSW1hZ2VzOwogCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAKaW5kZXggNDIyODVmOC4uYzIzZjE5YiAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhQ29kZWMuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcApAQCAtMjEsOCArMjEsOCBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFDb2RlYy5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KICNpbmNsdWRlICJOZGtNZWRpYUNyeXB0b1ByaXYuaCIKLSNpbmNsdWRlICJOZGtNZWRpYUZvcm1hdFByaXYuaCIKIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUNyeXB0by5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFDcnlwdG8uY3BwCmluZGV4IGQ3MTkzY2EuLmNlMmM2NjAgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYUNyeXB0by5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhQ3J5cHRvLmNwcApAQCAtMjAsNyArMjAsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFDcnlwdG8uaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUNvZGVjLmg+Ci0jaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXRQcml2LmgiCisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2Lmg+CiAKIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CkBAIC0yOSw3ICsyOSw2IEBACiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFEcm1TZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CiAjaW5jbHVkZSA8YW5kcm9pZF91dGlsX0JpbmRlci5oPgogCiAjaW5jbHVkZSA8am5pLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2UuY3BwCmluZGV4IDlkMDBlNWUuLjc5NzljMmYgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2UuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2UuY3BwCkBAIC0yMywxNiArMjMsMjMgQEAKICNpbmNsdWRlIDxqbmkuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkX3V0aWxfQmluZGVyLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFEYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9KYXZhVk1IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXBsYXllcjIvSk1lZGlhMkhUVFBTZXJ2aWNlLmg+CiAKICNpbmNsdWRlICIuLi8uLi9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmgiCiAjaW5jbHVkZSAiLi4vLi4vbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCIKKyNpbmNsdWRlICJOZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3NQcml2LmgiCisKIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKQEAgLTQxLDE0ICs0OCwyMCBAQAogICAgIEFNZWRpYURhdGFTb3VyY2VSZWFkQXQgcmVhZEF0OwogICAgIEFNZWRpYURhdGFTb3VyY2VHZXRTaXplIGdldFNpemU7CiAgICAgQU1lZGlhRGF0YVNvdXJjZUNsb3NlIGNsb3NlOworICAgIEFNZWRpYURhdGFTb3VyY2VHZXRBdmFpbGFibGVTaXplIGdldEF2YWlsYWJsZVNpemU7CisgICAgc3A8RGF0YVNvdXJjZT4gbUltcGw7CisgICAgdWludDMyX3QgbUZsYWdzOwogfTsKIAogTmRrRGF0YVNvdXJjZTo6TmRrRGF0YVNvdXJjZShBTWVkaWFEYXRhU291cmNlICpkYXRhU291cmNlKQogICAgIDogbURhdGFTb3VyY2UoQU1lZGlhRGF0YVNvdXJjZV9uZXcoKSkgewotICAgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRSZWFkQXQobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPnJlYWRBdCk7Ci0gICAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldFNpemUobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPmdldFNpemUpOwotICAgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRDbG9zZShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+Y2xvc2UpOwotICAgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRVc2VyZGF0YShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+dXNlcmRhdGEpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0UmVhZEF0KG1EYXRhU291cmNlLCBkYXRhU291cmNlLT5yZWFkQXQpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0U2l6ZShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+Z2V0U2l6ZSk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRDbG9zZShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+Y2xvc2UpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0VXNlcmRhdGEobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPnVzZXJkYXRhKTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldEF2YWlsYWJsZVNpemUobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPmdldEF2YWlsYWJsZVNpemUpOworICAgIG1EYXRhU291cmNlLT5tSW1wbCA9IGRhdGFTb3VyY2UtPm1JbXBsOworICAgIG1EYXRhU291cmNlLT5tRmxhZ3MgPSBkYXRhU291cmNlLT5tRmxhZ3M7CiB9CiAKIE5ka0RhdGFTb3VyY2U6On5OZGtEYXRhU291cmNlKCkgewpAQCAtNTksOSArNzIsMTMgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3VpbnQzMl90IE5ka0RhdGFTb3VyY2U6OmZsYWdzKCkgeworICAgIHJldHVybiBtRGF0YVNvdXJjZS0+bUZsYWdzOworfQorCiBzc2l6ZV90IE5ka0RhdGFTb3VyY2U6OnJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7Ci0gICAgaWYgKG1EYXRhU291cmNlLT5nZXRTaXplID09IE5VTEwgfHwgbURhdGFTb3VyY2UtPnVzZXJkYXRhID09IE5VTEwpIHsKKyAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCA9PSBOVUxMIHx8IG1EYXRhU291cmNlLT51c2VyZGF0YSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtMTsKICAgICB9CiAgICAgcmV0dXJuIG1EYXRhU291cmNlLT5yZWFkQXQobURhdGFTb3VyY2UtPnVzZXJkYXRhLCBvZmZzZXQsIGRhdGEsIHNpemUpOwpAQCAtOTIsNiArMTA5LDk1IEBACiAgICAgfQogfQogCitzdGF0dXNfdCBOZGtEYXRhU291cmNlOjpnZXRBdmFpbGFibGVTaXplKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90ICpzaXplcHRyKSB7CisgICAgb2ZmNjRfdCBzaXplID0gLTE7CisgICAgaWYgKG1EYXRhU291cmNlLT5nZXRBdmFpbGFibGVTaXplICE9IE5VTEwKKyAgICAgICAgICAgICYmIG1EYXRhU291cmNlLT51c2VyZGF0YSAhPSBOVUxMCisgICAgICAgICAgICAmJiBzaXplcHRyICE9IE5VTEwpIHsKKyAgICAgICAgc2l6ZSA9IG1EYXRhU291cmNlLT5nZXRBdmFpbGFibGVTaXplKG1EYXRhU291cmNlLT51c2VyZGF0YSwgb2Zmc2V0KTsKKyAgICAgICAgKnNpemVwdHIgPSBzaXplOworICAgIH0KKyAgICByZXR1cm4gc2l6ZSA+PSAwID8gT0sgOiBVTktOT1dOX0VSUk9SOworfQorCitzdGF0aWMgc3A8TWVkaWFIVFRQU2VydmljZT4gY3JlYXRlTWVkaWFIdHRwU2VydmljZUZyb21KYXZhT2JqKEpOSUVudiAqZW52LCBqb2JqZWN0IG9iaiwgaW50IHZlcnNpb24pIHsKKyAgICBpZiAob2JqID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHN3aXRjaCAodmVyc2lvbikgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhSFRUUFNlcnZpY2U+KGliaW5kZXJGb3JKYXZhT2JqZWN0KGVudiwgb2JqKSk7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHJldHVybiBuZXcgSk1lZGlhMkhUVFBTZXJ2aWNlKGVudiwgb2JqKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KK30KKworc3RhdGljIHNwPE1lZGlhSFRUUFNlcnZpY2U+IGNyZWF0ZU1lZGlhSHR0cFNlcnZpY2VUZW1wbGF0ZSgKKyAgICAgICAgSk5JRW52ICplbnYsCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgY29uc3QgY2hhciAqY2xhenosCisgICAgICAgIGNvbnN0IGNoYXIgKm1ldGhvZCwKKyAgICAgICAgY29uc3QgY2hhciAqc2lnbmF0dXJlLAorICAgICAgICBpbnQgdmVyc2lvbikgeworICAgIGpvYmplY3Qgc2VydmljZSA9IE5VTEw7CisgICAgaWYgKGVudiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJodHRwIHNlcnZpY2UgbXVzdCBiZSBjcmVhdGVkIGZyb20gSmF2YSB0aHJlYWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgamNsYXNzIG1lZGlhaHR0cGNsYXNzID0gZW52LT5GaW5kQ2xhc3MoY2xhenopOworICAgIGlmIChtZWRpYWh0dHBjbGFzcyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJjYW4ndCBmaW5kIE1lZGlhKDIpSHR0cFNlcnZpY2UiKTsKKyAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBqbWV0aG9kSUQgbWVkaWFIdHRwQ3JlYXRlTWV0aG9kID0gZW52LT5HZXRTdGF0aWNNZXRob2RJRChtZWRpYWh0dHBjbGFzcywgbWV0aG9kLCBzaWduYXR1cmUpOworICAgIGlmIChtZWRpYUh0dHBDcmVhdGVNZXRob2QgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiY2FuJ3QgZmluZCBtZXRob2QiKTsKKyAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBqc3RyaW5nIGp1cmkgPSBlbnYtPk5ld1N0cmluZ1VURih1cmkpOworCisgICAgc2VydmljZSA9IGVudi0+Q2FsbFN0YXRpY09iamVjdE1ldGhvZChtZWRpYWh0dHBjbGFzcywgbWVkaWFIdHRwQ3JlYXRlTWV0aG9kLCBqdXJpKTsKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGp1cmkpOworCisgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgIHNwPE1lZGlhSFRUUFNlcnZpY2U+IGh0dHBTZXJ2aWNlID0gY3JlYXRlTWVkaWFIdHRwU2VydmljZUZyb21KYXZhT2JqKGVudiwgc2VydmljZSwgdmVyc2lvbik7CisgICAgcmV0dXJuIGh0dHBTZXJ2aWNlOworCit9CisKK3NwPE1lZGlhSFRUUFNlcnZpY2U+IGNyZWF0ZU1lZGlhSHR0cFNlcnZpY2UoY29uc3QgY2hhciAqdXJpLCBpbnQgdmVyc2lvbikgeworCisgICAgSk5JRW52ICplbnY7CisgICAgY29uc3QgY2hhciAqY2xhenosICptZXRob2QsICpzaWduYXR1cmU7CisKKyAgICBzd2l0Y2ggKHZlcnNpb24pIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOworICAgICAgICAgICAgY2xhenogPSAiYW5kcm9pZC9tZWRpYS9NZWRpYUhUVFBTZXJ2aWNlIjsKKyAgICAgICAgICAgIG1ldGhvZCA9ICJjcmVhdGVIdHRwU2VydmljZUJpbmRlcklmTmVjZXNzYXJ5IjsKKyAgICAgICAgICAgIHNpZ25hdHVyZSA9ICIoTGphdmEvbGFuZy9TdHJpbmc7KUxhbmRyb2lkL29zL0lCaW5kZXI7IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBlbnYgPSBKYXZhVk1IZWxwZXI6OmdldEpOSUVudigpOworICAgICAgICAgICAgY2xhenogPSAiYW5kcm9pZC9tZWRpYS9NZWRpYTJIVFRQU2VydmljZSI7CisgICAgICAgICAgICBtZXRob2QgPSAiY3JlYXRlSFRUUFNlcnZpY2UiOworICAgICAgICAgICAgc2lnbmF0dXJlID0gIihMamF2YS9sYW5nL1N0cmluZzspTGFuZHJvaWQvbWVkaWEvTWVkaWEySFRUUFNlcnZpY2U7IjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIGNyZWF0ZU1lZGlhSHR0cFNlcnZpY2VUZW1wbGF0ZShlbnYsIHVyaSwgY2xhenosIG1ldGhvZCwgc2lnbmF0dXJlLCB2ZXJzaW9uKTsKKworfQorCiBleHRlcm4gIkMiIHsKIAogRVhQT1JUCkBAIC0xMDUsNiArMjExLDMyIEBACiB9CiAKIEVYUE9SVAorQU1lZGlhRGF0YVNvdXJjZSogQU1lZGlhRGF0YVNvdXJjZV9uZXdVcmkoCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgaW50IG51bWhlYWRlcnMsCisgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqa2V5X3ZhbHVlcykgeworCisgICAgc3A8TWVkaWFIVFRQU2VydmljZT4gc2VydmljZSA9IGNyZWF0ZU1lZGlhSHR0cFNlcnZpY2UodXJpLCAvKiB2ZXJzaW9uID0gKi8gMSk7CisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gaGVhZGVyczsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWhlYWRlcnM7ICsraSkgeworICAgICAgICBTdHJpbmc4IGtleTgoa2V5X3ZhbHVlc1tpICogMl0pOworICAgICAgICBTdHJpbmc4IHZhbHVlOChrZXlfdmFsdWVzW2kgKiAyICsgMV0pOworICAgICAgICBoZWFkZXJzLmFkZChrZXk4LCB2YWx1ZTgpOworICAgIH0KKworICAgIHNwPERhdGFTb3VyY2U+IHNvdXJjZSA9IERhdGFTb3VyY2VGYWN0b3J5OjpDcmVhdGVGcm9tVVJJKHNlcnZpY2UsIHVyaSwgJmhlYWRlcnMpOworICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiQU1lZGlhRGF0YVNvdXJjZV9uZXdVcmkgc291cmNlIGlzIG51bGwiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIEFMT0dJKCJBTWVkaWFEYXRhU291cmNlX25ld1VyaSBzb3VyY2UgJXMgZmxhZ3MgJXUiLCBzb3VyY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgc291cmNlLT5mbGFncygpKTsKKyAgICBBTWVkaWFEYXRhU291cmNlKiBhU291cmNlID0gY29udmVydERhdGFTb3VyY2VUb0FNZWRpYURhdGFTb3VyY2Uoc291cmNlKTsKKyAgICBhU291cmNlLT5tSW1wbCA9IHNvdXJjZTsKKyAgICBhU291cmNlLT5tRmxhZ3MgPSBzb3VyY2UtPmZsYWdzKCk7CisgICAgcmV0dXJuIGFTb3VyY2U7Cit9CisKK0VYUE9SVAogdm9pZCBBTWVkaWFEYXRhU291cmNlX2RlbGV0ZShBTWVkaWFEYXRhU291cmNlICptU291cmNlKSB7CiAgICAgQUxPR1YoImR0b3IiKTsKICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CkBAIC0xMzIsNSArMjY0LDE2IEBACiAgICAgbVNvdXJjZS0+Y2xvc2UgPSBjbG9zZTsKIH0KIAorRVhQT1JUCit2b2lkIEFNZWRpYURhdGFTb3VyY2VfY2xvc2UoQU1lZGlhRGF0YVNvdXJjZSAqbVNvdXJjZSkgeworICAgIHJldHVybiBtU291cmNlLT5jbG9zZShtU291cmNlLT51c2VyZGF0YSk7Cit9CisKK0VYUE9SVAordm9pZCBBTWVkaWFEYXRhU291cmNlX3NldEdldEF2YWlsYWJsZVNpemUoQU1lZGlhRGF0YVNvdXJjZSAqbVNvdXJjZSwKKyAgICAgICAgQU1lZGlhRGF0YVNvdXJjZUdldEF2YWlsYWJsZVNpemUgZ2V0QXZhaWxhYmxlU2l6ZSkgeworICAgIG1Tb3VyY2UtPmdldEF2YWlsYWJsZVNpemUgPSBnZXRBdmFpbGFibGVTaXplOworfQorCiB9IC8vIGV4dGVybiAiQyIKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrcy5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlQ2FsbGJhY2tzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmE1N2RhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrcy5jcHAKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3MiCisKKyNpbmNsdWRlICJOZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3NQcml2LmgiCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3JQcml2Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3NpemVfdCBEYXRhU291cmNlX2dldFNpemUodm9pZCAqdXNlcmRhdGEpIHsKKyAgICBEYXRhU291cmNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEYXRhU291cmNlICo+KHVzZXJkYXRhKTsKKyAgICBvZmY2NF90IHNpemUgPSAtMTsKKyAgICBzb3VyY2UtPmdldFNpemUoJnNpemUpOworICAgIHJldHVybiBzaXplOworfQorCitzc2l6ZV90IERhdGFTb3VyY2VfcmVhZEF0KHZvaWQgKnVzZXJkYXRhLCBvZmY2NF90IG9mZnNldCwgdm9pZCAqIGJ1Ziwgc2l6ZV90IHNpemUpIHsKKyAgICBEYXRhU291cmNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEYXRhU291cmNlICo+KHVzZXJkYXRhKTsKKyAgICByZXR1cm4gc291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWYsIHNpemUpOworfQorCit2b2lkIERhdGFTb3VyY2VfY2xvc2Uodm9pZCAqdXNlcmRhdGEpIHsKKyAgICBEYXRhU291cmNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEYXRhU291cmNlICo+KHVzZXJkYXRhKTsKKyAgICBzb3VyY2UtPmNsb3NlKCk7Cit9CisKK3NzaXplX3QgRGF0YVNvdXJjZV9nZXRBdmFpbGFibGVTaXplKHZvaWQgKnVzZXJkYXRhLCBvZmY2NF90IG9mZnNldCkgeworICAgIG9mZjY0X3Qgc2l6ZSA9IC0xOworICAgIERhdGFTb3VyY2UgKnNvdXJjZSA9IHN0YXRpY19jYXN0PERhdGFTb3VyY2UgKj4odXNlcmRhdGEpOworICAgIHNvdXJjZS0+Z2V0QXZhaWxhYmxlU2l6ZShvZmZzZXQsICZzaXplKTsKKyAgICByZXR1cm4gIHNpemU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlQ2FsbGJhY2tzUHJpdi5oIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrc1ByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTAzMzA1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrc1ByaXYuaApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFfTUVESUFfREFUQV9TT1VSQ0VfQ0FMTEJBQ0tTX0gKKworI2RlZmluZSBBX01FRElBX0RBVEFfU09VUkNFX0NBTExCQUNLU19ICisKKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFEYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvci5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3NzaXplX3QgRGF0YVNvdXJjZV9nZXRTaXplKHZvaWQgKnVzZXJkYXRhKTsKKworc3NpemVfdCBEYXRhU291cmNlX3JlYWRBdCh2b2lkICp1c2VyZGF0YSwgb2ZmNjRfdCBvZmZzZXQsIHZvaWQgKiBidWYsIHNpemVfdCBzaXplKTsKKwordm9pZCBEYXRhU291cmNlX2Nsb3NlKHZvaWQgKnVzZXJkYXRhKTsKKworc3NpemVfdCBEYXRhU291cmNlX2dldEF2YWlsYWJsZVNpemUodm9pZCAqdXNlcmRhdGEsIG9mZjY0X3Qgb2Zmc2V0KTsKKworc3RhdGljIGlubGluZSBBTWVkaWFEYXRhU291cmNlKiBjb252ZXJ0RGF0YVNvdXJjZVRvQU1lZGlhRGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlKSB7CisgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBBTWVkaWFEYXRhU291cmNlICptU291cmNlID0gQU1lZGlhRGF0YVNvdXJjZV9uZXcoKTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldFVzZXJkYXRhKG1Tb3VyY2UsIHNvdXJjZS5nZXQoKSk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRSZWFkQXQobVNvdXJjZSwgRGF0YVNvdXJjZV9yZWFkQXQpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0U2l6ZShtU291cmNlLCBEYXRhU291cmNlX2dldFNpemUpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0Q2xvc2UobVNvdXJjZSwgRGF0YVNvdXJjZV9jbG9zZSk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRBdmFpbGFibGVTaXplKG1Tb3VyY2UsIERhdGFTb3VyY2VfZ2V0QXZhaWxhYmxlU2l6ZSk7CisgICAgcmV0dXJuIG1Tb3VyY2U7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQV9NRURJQV9EQVRBX1NPVVJDRV9DQUxMQkFDS1NfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZVByaXYuaCBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VQcml2LmgKaW5kZXggZWE5Yzg2NS4uMTZmZjk3NCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZVByaXYuaAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlUHJpdi5oCkBAIC0zMiw2ICszMiw3IEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgpAQCAtNDMsMTEgKzQ0LDEzIEBACiAgICAgTmRrRGF0YVNvdXJjZShBTWVkaWFEYXRhU291cmNlICopOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7CiAgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICopOwogICAgIHZpcnR1YWwgU3RyaW5nOCB0b1N0cmluZygpOwogICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRNSU1FVHlwZSgpIGNvbnN0OwogICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXZhaWxhYmxlU2l6ZShvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCAqc2l6ZSk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5OZGtEYXRhU291cmNlKCk7CkBAIC01OSw1ICs2Miw3IEBACiAKIH07CiAKK3NwPE1lZGlhSFRUUFNlcnZpY2U+IGNyZWF0ZU1lZGlhSHR0cFNlcnZpY2UoY29uc3QgY2hhciAqdXJpLCBpbnQgdmVyc2lvbik7CisKICNlbmRpZiAvLyBfTkRLX01FRElBX0RBVEFTT1VSQ0VfUFJJVl9ICiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwCmluZGV4IDZkMTBmMWMuLjg1ZGJmZmUgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcApAQCAtMTcsNiArMTcsOSBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogI2RlZmluZSBMT0dfVEFHICJOZGtNZWRpYURybSIKIAorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYURybS5oPgogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KQEAgLTI0LDYgKzI3LDggQEAKICNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25Db250cm9sbGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSURybS5oPgogI2luY2x1ZGUgPG1lZGlhL0lEcm1DbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgpAQCAtNDAsMTAgKzQ1LDMyIEBACiB7CiBwcml2YXRlOgogICAgIEFNZWRpYURybSAqbU9iajsKLSAgICBBTWVkaWFEcm1FdmVudExpc3RlbmVyIG1MaXN0ZW5lcjsKKyAgICBBTWVkaWFEcm1FdmVudExpc3RlbmVyIG1FdmVudExpc3RlbmVyOworICAgIEFNZWRpYURybUV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lciBtRXhwaXJhdGlvblVwZGF0ZUxpc3RlbmVyOworICAgIEFNZWRpYURybUtleXNDaGFuZ2VMaXN0ZW5lciBtS2V5c0NoYW5nZUxpc3RlbmVyOwogCiBwdWJsaWM6Ci0gICAgRHJtTGlzdGVuZXIoQU1lZGlhRHJtICpvYmosIEFNZWRpYURybUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIDogbU9iaihvYmopLCBtTGlzdGVuZXIobGlzdGVuZXIpIHt9CisgICAgRHJtTGlzdGVuZXIoQU1lZGlhRHJtICpvYmosIEFNZWRpYURybUV2ZW50TGlzdGVuZXIgbGlzdGVuZXIpIDogbU9iaihvYmopLAorICAgICAgICAgICAgbUV2ZW50TGlzdGVuZXIobGlzdGVuZXIpLCBtRXhwaXJhdGlvblVwZGF0ZUxpc3RlbmVyKE5VTEwpLCBtS2V5c0NoYW5nZUxpc3RlbmVyKE5VTEwpIHt9CisKKyAgICBEcm1MaXN0ZW5lcihBTWVkaWFEcm0gKm9iaiwgQU1lZGlhRHJtRXhwaXJhdGlvblVwZGF0ZUxpc3RlbmVyIGxpc3RlbmVyKSA6IG1PYmoob2JqKSwKKyAgICAgICAgICAgIG1FdmVudExpc3RlbmVyKE5VTEwpLCBtRXhwaXJhdGlvblVwZGF0ZUxpc3RlbmVyKGxpc3RlbmVyKSwgbUtleXNDaGFuZ2VMaXN0ZW5lcihOVUxMKSB7fQorCisgICAgRHJtTGlzdGVuZXIoQU1lZGlhRHJtICpvYmosIEFNZWRpYURybUtleXNDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgOiBtT2JqKG9iaiksCisgICAgICAgICAgICBtRXZlbnRMaXN0ZW5lcihOVUxMKSwgbUV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lcihOVUxMKSwgbUtleXNDaGFuZ2VMaXN0ZW5lcihsaXN0ZW5lcikge30KKworICAgIHZvaWQgc2V0RXZlbnRMaXN0ZW5lcihBTWVkaWFEcm1FdmVudExpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIG1FdmVudExpc3RlbmVyID0gbGlzdGVuZXI7CisgICAgfQorCisgICAgdm9pZCBzZXRFeHBpcmF0aW9uVXBkYXRlTGlzdGVuZXIoQU1lZGlhRHJtRXhwaXJhdGlvblVwZGF0ZUxpc3RlbmVyIGxpc3RlbmVyKSB7CisgICAgICAgIG1FeHBpcmF0aW9uVXBkYXRlTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICB9CisKKyAgICB2b2lkIHNldEtleXNDaGFuZ2VMaXN0ZW5lcihBTWVkaWFEcm1LZXlzQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICAgICAgbUtleXNDaGFuZ2VMaXN0ZW5lciA9IGxpc3RlbmVyOworICAgIH0KKwogICAgIHZvaWQgbm90aWZ5KERybVBsdWdpbjo6RXZlbnRUeXBlIGV2ZW50VHlwZSwgaW50IGV4dHJhLCBjb25zdCBQYXJjZWwgKm9iaik7CiB9OwogCkBAIC02MiwyNyArODksNzUgQEAKIH07CiAKIHZvaWQgRHJtTGlzdGVuZXI6Om5vdGlmeShEcm1QbHVnaW46OkV2ZW50VHlwZSBldmVudFR5cGUsIGludCBleHRyYSwgY29uc3QgUGFyY2VsICpvYmopIHsKLSAgICBpZiAoIW1MaXN0ZW5lcikgeworICAgIGlmICghbUV2ZW50TGlzdGVuZXIgJiYgIW1FeHBpcmF0aW9uVXBkYXRlTGlzdGVuZXIgJiYgIW1LZXlzQ2hhbmdlTGlzdGVuZXIpIHsKKyAgICAgICAgQUxPR0UoIk5vIGxpc3RlbmVycyBhcmUgc3BlY2lmaWVkIik7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKKyAgICBvYmotPnNldERhdGFQb3NpdGlvbigwKTsKKwogICAgIEFNZWRpYURybVNlc3Npb25JZCBzZXNzaW9uSWQgPSB7TlVMTCwgMH07CiAgICAgaW50MzJfdCBzZXNzaW9uSWRTaXplID0gb2JqLT5yZWFkSW50MzIoKTsKLSAgICBpZiAoc2Vzc2lvbklkU2l6ZSkgewotICAgICAgICB1aW50OF90ICpzZXNzaW9uSWREYXRhID0gbmV3IHVpbnQ4X3Rbc2Vzc2lvbklkU2l6ZV07Ci0gICAgICAgIHNlc3Npb25JZC5wdHIgPSBzZXNzaW9uSWREYXRhOwotICAgICAgICBzZXNzaW9uSWQubGVuZ3RoID0gc2Vzc2lvbklkU2l6ZTsKLSAgICAgICAgb2JqLT5yZWFkKHNlc3Npb25JZERhdGEsIHNlc3Npb25JZC5sZW5ndGgpOworICAgIGlmIChzZXNzaW9uSWRTaXplIDw9IDApIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgc2Vzc2lvbiBpZCBzaXplIik7CisgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpbnQzMl90IGRhdGFTaXplID0gb2JqLT5yZWFkSW50MzIoKTsKLSAgICB1aW50OF90ICpkYXRhID0gTlVMTDsKLSAgICBpZiAoZGF0YVNpemUpIHsKLSAgICAgICAgZGF0YSA9IG5ldyB1aW50OF90W2RhdGFTaXplXTsKLSAgICAgICAgb2JqLT5yZWFkKGRhdGEsIGRhdGFTaXplKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBzZXNzaW9uSWREYXRhKG5ldyB1aW50OF90W3Nlc3Npb25JZFNpemVdKTsKKyAgICBzZXNzaW9uSWQucHRyID0gc2Vzc2lvbklkRGF0YS5nZXQoKTsKKyAgICBzZXNzaW9uSWQubGVuZ3RoID0gc2Vzc2lvbklkU2l6ZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBvYmotPnJlYWQoc2Vzc2lvbklkRGF0YS5nZXQoKSwgc2Vzc2lvbklkLmxlbmd0aCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlYWQgc2Vzc2lvbiBpZCwgZXJyb3I9JWQiLCBlcnIpOworICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgLy8gdHJhbnNsYXRlIERybVBsdWdpbiBldmVudCB0eXBlcyBpbnRvIHRoZWlyIE5ESyBlcXVpdmFsZW50cworICAgIGlmIChEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudEV4cGlyYXRpb25VcGRhdGUgPT0gZXZlbnRUeXBlKSB7CisgICAgICAgIGludDY0X3QgZXhwaXJ5VGltZUluTVMgPSBvYmotPnJlYWRJbnQ2NCgpOworICAgICAgICBpZiAoZXhwaXJ5VGltZUluTVMgPj0gMCkgeworICAgICAgICAgICAgKCptRXhwaXJhdGlvblVwZGF0ZUxpc3RlbmVyKShtT2JqLCAmc2Vzc2lvbklkLCBleHBpcnlUaW1lSW5NUyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlYWQgZXhwaXJ5IHRpbWUsIHN0YXR1cz0lIiBQUklkNjQgIiIsIGV4cGlyeVRpbWVJbk1TKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmIChEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudEtleXNDaGFuZ2UgPT0gZXZlbnRUeXBlKSB7CisgICAgICAgIGludDMyX3QgbnVtS2V5cyA9IDA7CisgICAgICAgIGVyciA9IG9iai0+cmVhZEludDMyKCZudW1LZXlzKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZWFkIG51bWJlciBvZiBrZXlzIHN0YXR1cywgZXJyb3I9JWQiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgVmVjdG9yPEFNZWRpYURybUtleVN0YXR1cz4ga2V5c1N0YXR1czsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gPiBkYXRhUG9pbnRlcnM7CisgICAgICAgIEFNZWRpYURybUtleVN0YXR1cyBrZXlTdGF0dXM7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1LZXlzOyArK2kpIHsKKyAgICAgICAgICAgIGtleVN0YXR1cy5rZXlJZC5wdHIgPSBudWxscHRyOworICAgICAgICAgICAga2V5U3RhdHVzLmtleUlkLmxlbmd0aCA9IDA7CisgICAgICAgICAgICBpbnQzMl90IGlkU2l6ZSA9IG9iai0+cmVhZEludDMyKCk7CisgICAgICAgICAgICBpZiAoaWRTaXplID4gMCkgeworICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGRhdGEobmV3IHVpbnQ4X3RbaWRTaXplXSk7CisgICAgICAgICAgICAgICAgZXJyID0gb2JqLT5yZWFkKGRhdGEuZ2V0KCksIGlkU2l6ZSk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJlYWQga2V5IGRhdGEsIGVycm9yPSVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBrZXlTdGF0dXMua2V5SWQucHRyID0gZGF0YS5nZXQoKTsKKyAgICAgICAgICAgICAgICBrZXlTdGF0dXMua2V5SWQubGVuZ3RoID0gaWRTaXplOworICAgICAgICAgICAgICAgIGRhdGFQb2ludGVycy5wdXNoX2JhY2soc3RkOjptb3ZlKGRhdGEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGtleVN0YXR1cy5rZXlUeXBlID0gc3RhdGljX2Nhc3Q8QU1lZGlhRHJtS2V5U3RhdHVzVHlwZT4ob2JqLT5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICBrZXlzU3RhdHVzLnB1c2goa2V5U3RhdHVzKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgaGFzTmV3VXNhYmxlS2V5ID0gb2JqLT5yZWFkSW50MzIoKTsKKyAgICAgICAgKCptS2V5c0NoYW5nZUxpc3RlbmVyKShtT2JqLCAmc2Vzc2lvbklkLCBrZXlzU3RhdHVzLmFycmF5KCksIG51bUtleXMsIGhhc05ld1VzYWJsZUtleSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBIYW5kbGVzIEFNZWRpYURybUV2ZW50TGlzdGVuZXIgYmVsb3c6CisgICAgLy8gIHRyYW5zbGF0ZXMgRHJtUGx1Z2luIGV2ZW50IHR5cGVzIGludG8gdGhlaXIgTkRLIGVxdWl2YWxlbnRzCiAgICAgQU1lZGlhRHJtRXZlbnRUeXBlIG5ka0V2ZW50VHlwZTsKICAgICBzd2l0Y2goZXZlbnRUeXBlKSB7CiAgICAgICAgIGNhc2UgRHJtUGx1Z2luOjprRHJtUGx1Z2luRXZlbnRQcm92aXNpb25SZXF1aXJlZDoKQEAgLTk3LDE5ICsxNzIsMzAgQEAKICAgICAgICAgY2FzZSBEcm1QbHVnaW46OmtEcm1QbHVnaW5FdmVudFZlbmRvckRlZmluZWQ6CiAgICAgICAgICAgICBuZGtFdmVudFR5cGUgPSBFVkVOVF9WRU5ET1JfREVGSU5FRDsKICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50U2Vzc2lvblJlY2xhaW1lZDoKKyAgICAgICAgICAgIG5ka0V2ZW50VHlwZSA9IEVWRU5UX1NFU1NJT05fUkVDTEFJTUVEOworICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBldmVudCBEcm1QbHVnaW46OkV2ZW50VHlwZSAlZCwgaWdub3JlZCIsIChpbnQpZXZlbnRUeXBlKTsKLSAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICAoKm1MaXN0ZW5lcikobU9iaiwgJnNlc3Npb25JZCwgbmRrRXZlbnRUeXBlLCBleHRyYSwgZGF0YSwgZGF0YVNpemUpOwotCi0gY2xlYW51cDoKLSAgICBkZWxldGUgW10gc2Vzc2lvbklkLnB0cjsKLSAgICBkZWxldGUgW10gZGF0YTsKKyAgICBpbnQzMl90IGRhdGFTaXplID0gb2JqLT5yZWFkSW50MzIoKTsKKyAgICB1aW50OF90ICpkYXRhID0gTlVMTDsKKyAgICBpZiAoZGF0YVNpemUgPiAwKSB7CisgICAgICAgIGRhdGEgPSBuZXcgdWludDhfdFtkYXRhU2l6ZV07CisgICAgICAgIGVyciA9IG9iai0+cmVhZChkYXRhLCBkYXRhU2l6ZSk7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICgqbUV2ZW50TGlzdGVuZXIpKG1PYmosICZzZXNzaW9uSWQsIG5ka0V2ZW50VHlwZSwgZXh0cmEsIGRhdGEsIGRhdGFTaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVhZCBldmVudCBkYXRhLCBlcnJvcj0lZCIsIGVycik7CisgICAgICAgIH0KKyAgICAgICAgZGVsZXRlIFtdIGRhdGE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIHJlYWRpbmcgcGFyY2VsOiBpbnZhbGlkIGV2ZW50IGRhdGEgc2l6ZT0lZCIsIGRhdGFTaXplKTsKKyAgICB9CiB9CiAKLQogZXh0ZXJuICJDIiB7CiAKIHN0YXRpYyBtZWRpYV9zdGF0dXNfdCB0cmFuc2xhdGVTdGF0dXMoc3RhdHVzX3Qgc3RhdHVzKSB7CkBAIC0xNDgsNiArMjM0LDM5IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorc3RhdGljIGJvb2wgU2hvdWxkR2V0QXBwUGFja2FnZU5hbWUodm9pZCkgeworICAgIC8vIENoZWNrIHdoYXQgdGhpcyBkZXZpY2UncyBmaXJzdCBBUEkgbGV2ZWwgd2FzLgorICAgIGludDMyX3QgZmlyc3RBcGlMZXZlbCA9IGFuZHJvaWQ6OmJhc2U6OkdldEludFByb3BlcnR5PGludDMyX3Q+KCJyby5wcm9kdWN0LmZpcnN0X2FwaV9sZXZlbCIsIDApOworICAgIGlmIChmaXJzdEFwaUxldmVsID09IDApIHsKKyAgICAgICAgLy8gRmlyc3QgQVBJIExldmVsIGlzIDAgb24gZmFjdG9yeSBST01zLCBidXQgd2UgY2FuIGFzc3VtZSB0aGUgY3VycmVudCBTREsKKyAgICAgICAgLy8gdmVyc2lvbiBpcyB0aGUgZmlyc3QgaWYgaXQncyBhIGZhY3RvcnkgUk9NLgorICAgICAgICBmaXJzdEFwaUxldmVsID0gYW5kcm9pZDo6YmFzZTo6R2V0SW50UHJvcGVydHk8aW50MzJfdD4oInJvLmJ1aWxkLnZlcnNpb24uc2RrIiwgMCk7CisgICAgfQorICAgIHJldHVybiBmaXJzdEFwaUxldmVsID49IDI5OyAgLy8gQW5kcm9pZCBRCit9CisKK3N0YXRpYyBzdGF0dXNfdCBHZXRBcHBQYWNrYWdlTmFtZShTdHJpbmc4ICpwYWNrYWdlTmFtZSkgeworICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc2VydmljZU1hbmFnZXIgPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBzZXJ2aWNlTWFuYWdlci0+Z2V0U2VydmljZShTdHJpbmcxNigicGVybWlzc2lvbiIpKTsKKworICAgIHNwPElQZXJtaXNzaW9uQ29udHJvbGxlcj4gcGVybWlzc2lvbkNvbnRvbCA9IGludGVyZmFjZV9jYXN0PElQZXJtaXNzaW9uQ29udHJvbGxlcj4oYmluZGVyKTsKKyAgICBpZiAocGVybWlzc2lvbkNvbnRvbCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IHBlcm1pc3Npb24gc2VydmljZSIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBWZWN0b3I8U3RyaW5nMTY+IHBhY2thZ2VzOworICAgIHBlcm1pc3Npb25Db250b2wtPmdldFBhY2thZ2VzRm9yVWlkKGdldHVpZCgpLCBwYWNrYWdlcyk7CisKKyAgICBpZiAocGFja2FnZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gZ2V0IHBhY2thZ2UgbmFtZSBmb3IgY3VycmVudCBVSUQiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgKnBhY2thZ2VOYW1lID0gU3RyaW5nOChwYWNrYWdlc1swXSk7CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0aWMgc3A8SURybT4gQ3JlYXRlRHJtKCkgewogICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBzbS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEuZHJtIikpOwpAQCAtMTcyLDggKzI5MSwxNiBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBTdHJpbmc4IG51bGxQYWNrYWdlTmFtZTsKLSAgICBzdGF0dXNfdCBlcnIgPSBkcm0tPmNyZWF0ZVBsdWdpbih1dWlkLCBudWxsUGFja2FnZU5hbWUpOworICAgIFN0cmluZzggcGFja2FnZU5hbWU7CisgICAgaWYgKFNob3VsZEdldEFwcFBhY2thZ2VOYW1lKCkpIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gR2V0QXBwUGFja2FnZU5hbWUoJnBhY2thZ2VOYW1lKTsKKworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IGRybS0+Y3JlYXRlUGx1Z2luKHV1aWQsIHBhY2thZ2VOYW1lKTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0xOTEsMTMgKzMxOCwxOCBAQAogICAgIH0KIAogICAgIFN0cmluZzggbWltZVN0ciA9IG1pbWVUeXBlID8gU3RyaW5nOChtaW1lVHlwZSkgOiBTdHJpbmc4KCIiKTsKLSAgICByZXR1cm4gZHJtLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkLCBtaW1lU3RyKTsKKyAgICBib29sIGlzU3VwcG9ydGVkID0gZmFsc2U7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZHJtLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkLCBtaW1lU3RyLAorICAgICAgICAgICAgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFVua25vd24sICZpc1N1cHBvcnRlZCk7CisgICAgcmV0dXJuIChzdGF0dXMgPT0gT0spICYmIGlzU3VwcG9ydGVkOwogfQogCiBFWFBPUlQKIEFNZWRpYURybSogQU1lZGlhRHJtX2NyZWF0ZUJ5VVVJRChjb25zdCBBTWVkaWFVVUlEIHV1aWQpIHsKICAgICBBTWVkaWFEcm0gKm1PYmogPSBuZXcgQU1lZGlhRHJtKCk7CiAgICAgbU9iai0+bURybSA9IENyZWF0ZURybUZyb21VVUlEKHV1aWQpOworCisgICAgbU9iai0+bUxpc3RlbmVyLmNsZWFyKCk7CiAgICAgcmV0dXJuIG1PYmo7CiB9CiAKQEAgLTIxNiwxMSArMzQ4LDQ3IEBACiAgICAgaWYgKCFtT2JqIHx8IG1PYmotPm1Ecm0gPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOwogICAgIH0KLSAgICBtT2JqLT5tTGlzdGVuZXIgPSBuZXcgRHJtTGlzdGVuZXIobU9iaiwgbGlzdGVuZXIpOworCisgICAgaWYgKG1PYmotPm1MaXN0ZW5lci5nZXQoKSkgeworICAgICAgICBtT2JqLT5tTGlzdGVuZXItPnNldEV2ZW50TGlzdGVuZXIobGlzdGVuZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1PYmotPm1MaXN0ZW5lciA9IG5ldyBEcm1MaXN0ZW5lcihtT2JqLCBsaXN0ZW5lcik7CisgICAgfQogICAgIG1PYmotPm1Ecm0tPnNldExpc3RlbmVyKG1PYmotPm1MaXN0ZW5lcik7CiAgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAorRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fc2V0T25FeHBpcmF0aW9uVXBkYXRlTGlzdGVuZXIoQU1lZGlhRHJtICptT2JqLAorICAgICAgICBBTWVkaWFEcm1FeHBpcmF0aW9uVXBkYXRlTGlzdGVuZXIgbGlzdGVuZXIpIHsKKyAgICBpZiAoIW1PYmogfHwgbU9iai0+bURybSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgfQorCisgICAgaWYgKG1PYmotPm1MaXN0ZW5lci5nZXQoKSkgeworICAgICAgICBtT2JqLT5tTGlzdGVuZXItPnNldEV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbU9iai0+bUxpc3RlbmVyID0gbmV3IERybUxpc3RlbmVyKG1PYmosIGxpc3RlbmVyKTsKKyAgICB9CisgICAgbU9iai0+bURybS0+c2V0TGlzdGVuZXIobU9iai0+bUxpc3RlbmVyKTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9zZXRPbktleXNDaGFuZ2VMaXN0ZW5lcihBTWVkaWFEcm0gKm1PYmosCisgICAgICAgIEFNZWRpYURybUtleXNDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgeworICAgIGlmICghbU9iaiB8fCBtT2JqLT5tRHJtID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisKKyAgICBpZiAobU9iai0+bUxpc3RlbmVyLmdldCgpKSB7CisgICAgICAgIG1PYmotPm1MaXN0ZW5lci0+c2V0S2V5c0NoYW5nZUxpc3RlbmVyKGxpc3RlbmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtT2JqLT5tTGlzdGVuZXIgPSBuZXcgRHJtTGlzdGVuZXIobU9iaiwgbGlzdGVuZXIpOworICAgIH0KKyAgICBtT2JqLT5tRHJtLT5zZXRMaXN0ZW5lcihtT2JqLT5tTGlzdGVuZXIpOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CiAKIHN0YXRpYyBib29sIGZpbmRJZChBTWVkaWFEcm0gKm1PYmosIGNvbnN0IEFNZWRpYURybUJ5dGVBcnJheSAmaWQsIExpc3Q8aWR2ZWNfdD46Oml0ZXJhdG9yICZpdGVyKSB7CiAgICAgZm9yIChpdGVyID0gbU9iai0+bUlkcy5iZWdpbigpOyBpdGVyICE9IG1PYmotPm1JZHMuZW5kKCk7ICsraXRlcikgewpAQCAtMzA5LDYgKzQ3Nyw3IEBACiAgICAgfQogICAgIFN0cmluZzggZGVmYXVsdFVybDsKICAgICBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlIGtleVJlcXVlc3RUeXBlOworICAgIG1PYmotPm1LZXlSZXF1ZXN0LmNsZWFyKCk7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU9iai0+bURybS0+Z2V0S2V5UmVxdWVzdCgqaXRlciwgbWRJbml0LCBTdHJpbmc4KG1pbWVUeXBlKSwKICAgICAgICAgICAgIG1kS2V5VHlwZSwgbWRPcHRpb25hbFBhcmFtZXRlcnMsIG1PYmotPm1LZXlSZXF1ZXN0LCBkZWZhdWx0VXJsLAogICAgICAgICAgICAgJmtleVJlcXVlc3RUeXBlKTsKQEAgLTU3Niw3ICs3NDUsNyBAQAogICAgIFZlY3Rvcjx1aW50OF90PiBieXRlQXJyYXk7CiAgICAgYnl0ZUFycmF5LmFwcGVuZEFycmF5KHZhbHVlLCB2YWx1ZVNpemUpOwogCi0gICAgcmV0dXJuIHRyYW5zbGF0ZVN0YXR1cyhtT2JqLT5tRHJtLT5nZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4KHByb3BlcnR5TmFtZSksCisgICAgcmV0dXJuIHRyYW5zbGF0ZVN0YXR1cyhtT2JqLT5tRHJtLT5zZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4KHByb3BlcnR5TmFtZSksCiAgICAgICAgICAgICAgICAgICAgIGJ5dGVBcnJheSkpOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRXh0cmFjdG9yLmNwcAppbmRleCBiNWU2MGE0Li5jODNiMjU1IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAKQEAgLTIwLDggKzIwLDkgQEAKIAogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3JQcml2Lmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2Lmg+CiAjaW5jbHVkZSAiTmRrTWVkaWFEYXRhU291cmNlUHJpdi5oIgotI2luY2x1ZGUgIk5ka01lZGlhRm9ybWF0UHJpdi5oIgogCiAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgpAQCAtMzMsMzEgKzM0LDI5IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KLSNpbmNsdWRlIDxhbmRyb2lkX3J1bnRpbWUvQW5kcm9pZFJ1bnRpbWUuaD4KICNpbmNsdWRlIDxhbmRyb2lkX3V0aWxfQmluZGVyLmg+CiAKICNpbmNsdWRlIDxqbmkuaD4KIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKLXN0YXRpYyBtZWRpYV9zdGF0dXNfdCB0cmFuc2xhdGVfZXJyb3Ioc3RhdHVzX3QgZXJyKSB7Ci0gICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICByZXR1cm4gQU1FRElBX09LOwotICAgIH0gZWxzZSBpZiAoZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgIH0gZWxzZSBpZiAoZXJyID09IEVSUk9SX0lPKSB7Ci0gICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87Ci0gICAgfQotCi0gICAgQUxPR0UoInNmIGVycm9yIGNvZGU6ICVkIiwgZXJyKTsKLSAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047Ci19Ci0KIHN0cnVjdCBBTWVkaWFFeHRyYWN0b3IgewogICAgIHNwPE51TWVkaWFFeHRyYWN0b3I+IG1JbXBsOwogICAgIHNwPEFCdWZmZXI+IG1Qc3NoQnVmOwogfTsKIAorc3A8QUJ1ZmZlcj4gVTMyQXJyYXlUb1NpemVCdWYoc2l6ZV90IG51bVN1YlNhbXBsZXMsIHVpbnQzMl90ICpkYXRhKSB7CisgICAgaWYgKG51bVN1YlNhbXBsZXMgPiAgU0laRV9NQVggLyBzaXplb2Yoc2l6ZV90KSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3A8QUJ1ZmZlcj4gc2l6ZWJ1ZiA9IG5ldyBBQnVmZmVyKG51bVN1YlNhbXBsZXMgKiBzaXplb2Yoc2l6ZV90KSk7CisgICAgc2l6ZV90ICpzaXplcyA9IChzaXplX3QgKilzaXplYnVmLT5kYXRhKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IHNpemVzICE9IE5VTEwgJiYgaSA8IG51bVN1YlNhbXBsZXM7IGkrKykgeworICAgICAgICBzaXplc1tpXSA9IGRhdGFbaV07CisgICAgfQorICAgIHJldHVybiBzaXplYnVmOworfQorCiBleHRlcm4gIkMiIHsKIAogRVhQT1JUCkBAIC04Miw0NyArODEsMzUgQEAKICAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKG1EYXRhLT5tSW1wbC0+c2V0RGF0YVNvdXJjZShmZCwgb2Zmc2V0LCBsZW5ndGgpKTsKIH0KIAorbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VXaXRoSGVhZGVycyhBTWVkaWFFeHRyYWN0b3IgKm1EYXRhLAorICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgIGludCBudW1oZWFkZXJzLAorICAgICAgICBjb25zdCBjaGFyICogY29uc3QgKmtleXMsCisgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqdmFsdWVzKSB7CisKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcykiLCB1cmkpOworCisgICAgc3A8TWVkaWFIVFRQU2VydmljZT4gaHR0cFNlcnZpY2UgPSBjcmVhdGVNZWRpYUh0dHBTZXJ2aWNlKHVyaSwgLyogdmVyc2lvbiA9ICovIDEpOworICAgIGlmIChodHRwU2VydmljZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJjYW4ndCBjcmVhdGUgaHR0cCBzZXJ2aWNlIik7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gaGVhZGVyczsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWhlYWRlcnM7ICsraSkgeworICAgICAgICBTdHJpbmc4IGtleTgoa2V5c1tpXSk7CisgICAgICAgIFN0cmluZzggdmFsdWU4KHZhbHVlc1tpXSk7CisgICAgICAgIGhlYWRlcnMuYWRkKGtleTgsIHZhbHVlOCk7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyOworICAgIGVyciA9IG1EYXRhLT5tSW1wbC0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgdXJpLCBudW1oZWFkZXJzID4gMCA/ICZoZWFkZXJzIDogTlVMTCk7CisgICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihlcnIpOworfQorCiBFWFBPUlQKIG1lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlKEFNZWRpYUV4dHJhY3RvciAqbURhdGEsIGNvbnN0IGNoYXIgKmxvY2F0aW9uKSB7Ci0gICAgQUxPR1YoInNldERhdGFTb3VyY2UoJXMpIiwgbG9jYXRpb24pOwotICAgIC8vIFRPRE86IGFkZCBoZWFkZXIgc3VwcG9ydAotCi0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7Ci0gICAgam9iamVjdCBzZXJ2aWNlID0gTlVMTDsKLSAgICBpZiAoZW52ID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoInNldERhdGFTb3VyY2UocGF0aCkgbXVzdCBiZSBjYWxsZWQgZnJvbSBKYXZhIHRocmVhZCIpOwotICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOwotICAgIH0KLQotICAgIGpjbGFzcyBtZWRpYWh0dHBjbGFzcyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL01lZGlhSFRUUFNlcnZpY2UiKTsKLSAgICBpZiAobWVkaWFodHRwY2xhc3MgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiY2FuJ3QgZmluZCBNZWRpYUh0dHBTZXJ2aWNlIik7Ci0gICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBqbWV0aG9kSUQgbWVkaWFIdHRwQ3JlYXRlTWV0aG9kID0gZW52LT5HZXRTdGF0aWNNZXRob2RJRChtZWRpYWh0dHBjbGFzcywKLSAgICAgICAgICAgICJjcmVhdGVIdHRwU2VydmljZUJpbmRlcklmTmVjZXNzYXJ5IiwgIihMamF2YS9sYW5nL1N0cmluZzspTGFuZHJvaWQvb3MvSUJpbmRlcjsiKTsKLSAgICBpZiAobWVkaWFIdHRwQ3JlYXRlTWV0aG9kID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoImNhbid0IGZpbmQgbWV0aG9kIik7Ci0gICAgICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBqc3RyaW5nIGpsb2MgPSBlbnYtPk5ld1N0cmluZ1VURihsb2NhdGlvbik7Ci0KLSAgICBzZXJ2aWNlID0gZW52LT5DYWxsU3RhdGljT2JqZWN0TWV0aG9kKG1lZGlhaHR0cGNsYXNzLCBtZWRpYUh0dHBDcmVhdGVNZXRob2QsIGpsb2MpOwotICAgIGVudi0+RGVsZXRlTG9jYWxSZWYoamxvYyk7Ci0KLSAgICBzcDxJTWVkaWFIVFRQU2VydmljZT4gaHR0cFNlcnZpY2U7Ci0gICAgaWYgKHNlcnZpY2UgIT0gTlVMTCkgewotICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBpYmluZGVyRm9ySmF2YU9iamVjdChlbnYsIHNlcnZpY2UpOwotICAgICAgICBodHRwU2VydmljZSA9IGludGVyZmFjZV9jYXN0PElNZWRpYUhUVFBTZXJ2aWNlPihiaW5kZXIpOwotICAgIH0KLQotICAgIHN0YXR1c190IGVyciA9IG1EYXRhLT5tSW1wbC0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgbG9jYXRpb24sIE5VTEwpOwotICAgIGVudi0+RXhjZXB0aW9uQ2xlYXIoKTsKLSAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKGVycik7CisgICAgcmV0dXJuIEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlV2l0aEhlYWRlcnMobURhdGEsIGxvY2F0aW9uLCAwLCBOVUxMLCBOVUxMKTsKIH0KIAogRVhQT1JUCkBAIC0zNjMsNyArMzUwLDcgQEAKICAgICBpZiAoIW1ldGEtPmZpbmREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgJnR5cGUsICZjcnlwdGVkZGF0YSwgJmNyeXB0ZWRzaXplKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgc2l6ZV90IG51bVN1YlNhbXBsZXMgPSBjcnlwdGVkc2l6ZSAvIHNpemVvZihzaXplX3QpOworICAgIHNpemVfdCBudW1TdWJTYW1wbGVzID0gY3J5cHRlZHNpemUgLyBzaXplb2YodWludDMyX3QpOwogCiAgICAgY29uc3Qgdm9pZCAqY2xlYXJkYXRhOwogICAgIHNpemVfdCBjbGVhcnNpemU7CkBAIC0zOTcsNiArMzg0LDE2IEBACiAgICAgICAgIG1vZGUgPSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19DVFI7CiAgICAgfQogCisgICAgaWYgKHNpemVvZih1aW50MzJfdCkgIT0gc2l6ZW9mKHNpemVfdCkpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gY2xlYXJidWYgICA9IFUzMkFycmF5VG9TaXplQnVmKG51bVN1YlNhbXBsZXMsICh1aW50MzJfdCAqKWNsZWFyZGF0YSk7CisgICAgICAgIHNwPEFCdWZmZXI+IGNyeXB0ZWRidWYgPSBVMzJBcnJheVRvU2l6ZUJ1ZihudW1TdWJTYW1wbGVzLCAodWludDMyX3QgKiljcnlwdGVkZGF0YSk7CisgICAgICAgIGNsZWFyZGF0YSAgID0gY2xlYXJidWYgICAgPT0gTlVMTCA/IE5VTEwgOiBjbGVhcmJ1Zi0+ZGF0YSgpOworICAgICAgICBjcnlwdGVkZGF0YSA9IGNyeXB0ZWRkYXRhID09IE5VTEwgPyBOVUxMIDogY3J5cHRlZGJ1Zi0+ZGF0YSgpOworICAgICAgICBpZihjcnlwdGVkZGF0YSA9PSBOVUxMIHx8IGNsZWFyZGF0YSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKwogICAgIHJldHVybiBBTWVkaWFDb2RlY0NyeXB0b0luZm9fbmV3KAogICAgICAgICAgICAgbnVtU3ViU2FtcGxlcywKICAgICAgICAgICAgICh1aW50OF90Kikga2V5LApAQCAtNDcyLDEyICs0NjksMTYgQEAKICAgICAgICAgbWV0YS0+c2V0QnVmZmVyKEFNRURJQUZPUk1BVF9LRVlfTVBFR19VU0VSX0RBVEEsIG1wZWdVc2VyRGF0YSk7CiAgICAgfQogCi0gICAgcmV0dXJuIEFNRURJQV9PSzsKLX0KKyAgICBjb25zdCB2b2lkICphdWRpb1ByZXNlbnRhdGlvbnNQb2ludGVyOworICAgIHNpemVfdCBhdWRpb1ByZXNlbnRhdGlvbnNMZW5ndGg7CisgICAgaWYgKHNhbXBsZU1ldGEtPmZpbmREYXRhKAorICAgICAgICAgICAga0tleUF1ZGlvUHJlc2VudGF0aW9uSW5mbywgJmRhdGFUeXBlLAorICAgICAgICAgICAgJmF1ZGlvUHJlc2VudGF0aW9uc1BvaW50ZXIsICZhdWRpb1ByZXNlbnRhdGlvbnNMZW5ndGgpKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IGF1ZGlvUHJlc2VudGF0aW9uc0RhdGEgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoCisgICAgICAgICAgICAgICAgYXVkaW9QcmVzZW50YXRpb25zUG9pbnRlciwgYXVkaW9QcmVzZW50YXRpb25zTGVuZ3RoKTsKKyAgICAgICAgbWV0YS0+c2V0QnVmZmVyKEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX0lORk8sIGF1ZGlvUHJlc2VudGF0aW9uc0RhdGEpOworICAgIH0KIAotRVhQT1JUCi1tZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JfZGlzY29ubmVjdChBTWVkaWFFeHRyYWN0b3IgKiBleCkgewotICAgIGV4LT5tSW1wbC0+ZGlzY29ubmVjdCgpOwogICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdC5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwCmluZGV4IGYzMmI4M2UuLjUxMTM4YzggMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdC5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0LmNwcApAQCAtMjAsNDMgKzIwLDIwIEBACiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2Lmg+CiAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgogI2luY2x1ZGUgPGFuZHJvaWRfdXRpbF9CaW5kZXIuaD4KIAogI2luY2x1ZGUgPGpuaS5oPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAotc3RydWN0IEFNZWRpYUZvcm1hdCB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1Gb3JtYXQ7Ci0gICAgU3RyaW5nOCBtRGVidWc7Ci0gICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbVN0cmluZ0NhY2hlOwotfTsKLQogZXh0ZXJuICJDIiB7CiAKLS8vIHByaXZhdGUgZnVuY3Rpb25zIGZvciBjb252ZXJzaW9uIHRvL2Zyb20gQU1lc3NhZ2UKLUFNZWRpYUZvcm1hdCogQU1lZGlhRm9ybWF0X2Zyb21Nc2coY29uc3Qgdm9pZCogZGF0YSkgewotICAgIEFMT0dWKCJwcml2YXRlIGN0b3IiKTsKLSAgICBBTWVkaWFGb3JtYXQqIG1EYXRhID0gbmV3IEFNZWRpYUZvcm1hdCgpOwotICAgIG1EYXRhLT5tRm9ybWF0ID0gKigoc3A8QU1lc3NhZ2U+KilkYXRhKTsKLSAgICBpZiAobURhdGEtPm1Gb3JtYXQgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygiZ290IE5VTEwgZm9ybWF0Iik7Ci0gICAgICAgIG1EYXRhLT5tRm9ybWF0ID0gbmV3IEFNZXNzYWdlOwotICAgIH0KLSAgICByZXR1cm4gbURhdGE7Ci19Ci0KLXZvaWQgQU1lZGlhRm9ybWF0X2dldEZvcm1hdChjb25zdCBBTWVkaWFGb3JtYXQqIG1EYXRhLCB2b2lkKiBkZXN0KSB7Ci0gICAgKigoc3A8QU1lc3NhZ2U+KilkZXN0KSA9IG1EYXRhLT5tRm9ybWF0OwotfQotCi0KIC8qCiAgKiBwdWJsaWMgZnVuY3Rpb24gZm9sbG93CiAgKi8KQEAgLTc0LDYgKzUxLDIxIEBACiAgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAorRVhQT1JUCit2b2lkIEFNZWRpYUZvcm1hdF9jbGVhcihBTWVkaWFGb3JtYXQgKmZvcm1hdCkgeworICAgIGZvcm1hdC0+bUZvcm1hdC0+Y2xlYXIoKTsKK30KKworRVhQT1JUCittZWRpYV9zdGF0dXNfdCBBTWVkaWFGb3JtYXRfY29weShBTWVkaWFGb3JtYXQgKnRvLCBBTWVkaWFGb3JtYXQgKmZyb20pIHsKKyAgICBpZiAoIXRvIHx8ICFmcm9tKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIHRvLT5tRm9ybWF0LT5jbGVhcigpOworICAgIHRvLT5tRm9ybWF0LT5leHRlbmQoZnJvbS0+bUZvcm1hdCk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKwogCiBFWFBPUlQKIGNvbnN0IGNoYXIqIEFNZWRpYUZvcm1hdF90b1N0cmluZyhBTWVkaWFGb3JtYXQgKm1EYXRhKSB7CkBAIC0yNTYsNyArMjQ4LDcgQEAKIH0KIAogRVhQT1JUCi12b2lkIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoQU1lZGlhRm9ybWF0KiBmb3JtYXQsIGNvbnN0IGNoYXIqIG5hbWUsIHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSB7Cit2b2lkIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoQU1lZGlhRm9ybWF0KiBmb3JtYXQsIGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSB7CiAgICAgLy8gdGhlIEFCdWZmZXIodm9pZCosIHNpemVfdCkgY29uc3RydWN0b3IgZG9lc24ndCB0YWtlIG93bmVyc2hpcCBvZiB0aGUgZGF0YSwgc28gY3JlYXRlCiAgICAgLy8gYSBuZXcgYnVmZmVyIGFuZCBjb3B5IHRoZSBkYXRhIGludG8gaXQKICAgICBzcDxBQnVmZmVyPiBidWYgPSBuZXcgQUJ1ZmZlcihzaXplKTsKQEAgLTI3NSw2NSArMjY3LDEyNCBAQAogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX01BWF9PVVRQVVRfQ0hBTk5FTF9DT1VOVCA9ICJhYWMtbWF4LW91dHB1dC1jaGFubmVsX2NvdW50IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19QUk9GSUxFID0gImFhYy1wcm9maWxlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19TQlJfTU9ERSA9ICJhYWMtc2JyLW1vZGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUxCVU0gPSAiYWxidW0iOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlQgPSAiYWxidW1hcnQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlRJU1QgPSAiYWxidW1hcnRpc3QiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVJUSVNUID0gImFydGlzdCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BVURJT19QUkVTRU5UQVRJT05fSU5GTyA9ICJhdWRpby1wcmVzZW50YXRpb24taW5mbyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BVURJT19QUkVTRU5UQVRJT05fUFJFU0VOVEFUSU9OX0lEID0KKyAgICAgICAgImF1ZGlvLXByZXNlbnRhdGlvbi1wcmVzZW50YXRpb24taWQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX1BST0dSQU1fSUQgPSAiYXVkaW8tcHJlc2VudGF0aW9uLXByb2dyYW0taWQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fU0VTU0lPTl9JRCA9ICJhdWRpby1zZXNzaW9uLWlkIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVVEhPUiA9ICJhdXRob3IiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQklUUkFURV9NT0RFID0gImJpdHJhdGUtbW9kZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSA9ICJiaXRyYXRlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSA9ICJiaXRzLXBlci1zYW1wbGUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ0FQVFVSRV9SQVRFID0gImNhcHR1cmUtcmF0ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DRFRSQUNLTlVNQkVSID0gImNkdHJhY2tudW0iOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCA9ICJjaGFubmVsLWNvdW50IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfTUFTSyA9ICJjaGFubmVsLW1hc2siOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfRk9STUFUID0gImNvbG9yLWZvcm1hdCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT0xPUl9SQU5HRSA9ICJjb2xvci1yYW5nZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT0xPUl9TVEFOREFSRCA9ICJjb2xvci1zdGFuZGFyZCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT0xPUl9UUkFOU0ZFUiA9ICJjb2xvci10cmFuc2ZlciI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT01QSUxBVElPTiA9ICJjb21waWxhdGlvbiI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT01QTEVYSVRZID0gImNvbXBsZXhpdHkiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09NUE9TRVIgPSAiY29tcG9zZXIiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JFQVRFX0lOUFVUX1NVUkZBQ0VfU1VTUEVOREVEID0gImNyZWF0ZS1pbnB1dC1idWZmZXJzLXN1c3BlbmRlZCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fREVGQVVMVF9JVl9TSVpFID0gImNyeXB0by1kZWZhdWx0LWl2LXNpemUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9CWVRFX0JMT0NLID0gImNyeXB0by1lbmNyeXB0ZWQtYnl0ZS1ibG9jayI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX1NJWkVTID0gImNyeXB0by1lbmNyeXB0ZWQtc2l6ZXMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0lWID0gImNyeXB0by1pdiI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fS0VZID0gImNyeXB0by1rZXkiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX01PREUgPSAiY3J5cHRvLW1vZGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1BMQUlOX1NJWkVTID0gImNyeXB0by1wbGFpbi1zaXplcyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fU0tJUF9CWVRFX0JMT0NLID0gImNyeXB0by1za2lwLWJ5dGUtYmxvY2siOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEID0gImNzZCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0RfMCA9ICJjc2QtMCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0RfMSA9ICJjc2QtMSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0RfMiA9ICJjc2QtMiI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDID0gImNzZC1hdmMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0hFVkMgPSAiY3NkLWhldmMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRDI2MyA9ICJkMjYzIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RBVEUgPSAiZGF0ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ESVNDTlVNQkVSID0gImRpc2NudW0iOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9DUk9QID0gImNyb3AiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9IRUlHSFQgPSAiZGlzcGxheS1oZWlnaHQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9XSURUSCA9ICJkaXNwbGF5LXdpZHRoIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OID0gImR1cmF0aW9uVXMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9ERUxBWSA9ICJlbmNvZGVyLWRlbGF5IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfUEFERElORyA9ICJlbmNvZGVyLXBhZGRpbmciOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRVNEUyA9ICJlc2RzIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0VYSUZfT0ZGU0VUID0gImV4aWYtb2Zmc2V0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0VYSUZfU0laRSA9ICJleGlmLXNpemUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRkxBQ19DT01QUkVTU0lPTl9MRVZFTCA9ICJmbGFjLWNvbXByZXNzaW9uLWxldmVsIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX0NPVU5UID0gImZyYW1lLWNvdW50IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX1JBVEUgPSAiZnJhbWUtcmF0ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9HRU5SRSA9ICJnZW5yZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9HUklEX0NPTFVNTlMgPSAiZ3JpZC1jb2xzIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0dSSURfUk9XUyA9ICJncmlkLXJvd3MiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSEFQVElDX0NIQU5ORUxfQ09VTlQgPSAiaGFwdGljLWNoYW5uZWwtY291bnQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSERSX1NUQVRJQ19JTkZPID0gImhkci1zdGF0aWMtaW5mbyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9IRFIxMF9QTFVTX0lORk8gPSAiaGRyMTAtcGx1cy1pbmZvIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCA9ICJoZWlnaHQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSUNDX1BST0ZJTEUgPSAiaWNjLXByb2ZpbGUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSU5UUkFfUkVGUkVTSF9QRVJJT0QgPSAiaW50cmEtcmVmcmVzaC1wZXJpb2QiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfQURUUyA9ICJpcy1hZHRzIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0FVVE9TRUxFQ1QgPSAiaXMtYXV0b3NlbGVjdCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19ERUZBVUxUID0gImlzLWRlZmF1bHQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfRk9SQ0VEX1NVQlRJVExFID0gImlzLWZvcmNlZC1zdWJ0aXRsZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FID0gImlzLXN5bmMtZnJhbWUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSV9GUkFNRV9JTlRFUlZBTCA9ICJpLWZyYW1lLWludGVydmFsIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xBTkdVQUdFID0gImxhbmd1YWdlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xBVEVOQ1kgPSAibGF0ZW5jeSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MRVZFTCA9ICJsZXZlbCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MT0NBVElPTiA9ICJsb2NhdGlvbiI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MT09QID0gImxvb3AiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTFlSSUNJU1QgPSAibHlyaWNpc3QiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFOVUZBQ1RVUkVSID0gIm1hbnVmYWN0dXJlciI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfQklUX1JBVEUgPSAibWF4LWJpdHJhdGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX0ZQU19UT19FTkNPREVSID0gIm1heC1mcHMtdG8tZW5jb2RlciI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfSEVJR0hUID0gIm1heC1oZWlnaHQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUgPSAibWF4LWlucHV0LXNpemUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX1BUU19HQVBfVE9fRU5DT0RFUiA9ICJtYXgtcHRzLWdhcC10by1lbmNvZGVyIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9XSURUSCA9ICJtYXgtd2lkdGgiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUlNRSA9ICJtaW1lIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01QRUdfVVNFUl9EQVRBID0gIm1wZWctdXNlci1kYXRhIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01QRUcyX1NUUkVBTV9IRUFERVIgPSAibXBlZzItc3RyZWFtLWhlYWRlciI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9PUEVSQVRJTkdfUkFURSA9ICJvcGVyYXRpbmctcmF0ZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QQ01fRU5DT0RJTkcgPSAicGNtLWVuY29kaW5nIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BSSU9SSVRZID0gInByaW9yaXR5IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BST0ZJTEUgPSAicHJvZmlsZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QQ01fQklHX0VORElBTiA9ICJwY20tYmlnLWVuZGlhbiI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QU1NIID0gInBzc2giOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFVTSF9CTEFOS19CVUZGRVJTX09OX1NUT1AgPSAicHVzaC1ibGFuay1idWZmZXJzLW9uLXNodXRkb3duIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9BRlRFUiA9ICJyZXBlYXQtcHJldmlvdXMtZnJhbWUtYWZ0ZXIiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUk9UQVRJT04gPSAicm90YXRpb24tZGVncmVlcyI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSA9ICJzYW1wbGUtcmF0ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TQVJfSEVJR0hUID0gInNhci1oZWlnaHQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0FSX1dJRFRIID0gInNhci13aWR0aCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TRUkgPSAic2VpIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NMSUNFX0hFSUdIVCA9ICJzbGljZS1oZWlnaHQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU1RSSURFID0gInN0cmlkZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9UQVJHRVRfVElNRSA9ICJ0YXJnZXQtdGltZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9DT1VOVCA9ICJ0ZW1wb3JhbC1sYXllci1jb3VudCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9JRCA9ICJ0ZW1wb3JhbC1sYXllci1pZCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUklORyA9ICJ0cy1zY2hlbWEiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEVYVF9GT1JNQVRfREFUQSA9ICJ0ZXh0LWZvcm1hdC1kYXRhIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9DU0RfSEVWQyA9ICJ0aHVtYm5haWwtY3NkLWhldmMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX0hFSUdIVCA9ICJ0aHVtYm5haWwtaGVpZ2h0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9USU1FID0gInRodW1ibmFpbC10aW1lIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9XSURUSCA9ICJ0aHVtYm5haWwtd2lkdGgiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVElMRV9IRUlHSFQgPSAidGlsZS1oZWlnaHQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVElMRV9XSURUSCA9ICJ0aWxlLXdpZHRoIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMgPSAidGltZVVzIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RJVExFID0gInRpdGxlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lEID0gInRyYWNrLWlkIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lOREVYID0gInRyYWNrLWluZGV4IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1ZBTElEX1NBTVBMRVMgPSAidmFsaWQtc2FtcGxlcyI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9XSURUSCA9ICJ3aWR0aCI7Ci0KK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1lFQVIgPSAieWVhciI7CiAKIH0gLy8gZXh0ZXJuICJDIgogCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXRQcml2LmggYi9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXRQcml2LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2YTY1NjMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0UHJpdi5oCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qCi0gKiBUaGlzIGZpbGUgZGVmaW5lcyBhbiBOREsgQVBJLgotICogRG8gbm90IHJlbW92ZSBtZXRob2RzLgotICogRG8gbm90IGNoYW5nZSBtZXRob2Qgc2lnbmF0dXJlcy4KLSAqIERvIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGNvbnN0YW50cy4KLSAqIERvIG5vdCBjaGFuZ2UgdGhlIHNpemUgb2YgYW55IG9mIHRoZSBjbGFzc2VzIGRlZmluZWQgaW4gaGVyZS4KLSAqIERvIG5vdCByZWZlcmVuY2UgdHlwZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIE5ESy4KLSAqIERvIG5vdCAjaW5jbHVkZSBmaWxlcyB0aGF0IGFyZW4ndCBwYXJ0IG9mIHRoZSBOREsuCi0gKi8KLQotI2lmbmRlZiBfTkRLX01FRElBX0ZPUk1BVF9QUklWX0gKLSNkZWZpbmUgX05ES19NRURJQV9GT1JNQVRfUFJJVl9ICi0KLSNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLUFNZWRpYUZvcm1hdCogQU1lZGlhRm9ybWF0X2Zyb21Nc2codm9pZCopOwotdm9pZCBBTWVkaWFGb3JtYXRfZ2V0Rm9ybWF0KGNvbnN0IEFNZWRpYUZvcm1hdCogbURhdGEsIHZvaWQqIGRlc3QpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gLy8gZXh0ZXJuICJDIgotI2VuZGlmCi0KLSNlbmRpZiAvLyBfTkRLX01FRElBX0ZPUk1BVF9QUklWX0gKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhTXV4ZXIuY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhTXV4ZXIuY3BwCmluZGV4IGRmZmM0ZDcuLmQxOTkyYmYgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYU11eGVyLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFNdXhlci5jcHAKQEAgLTIwLDcgKzIwLDggQEAKIAogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhTXV4ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUNvZGVjLmg+Ci0jaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXRQcml2LmgiCisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvclByaXYuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KIAogCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC0yOSwyMSArMzAsMTIgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CiAjaW5jbHVkZSA8YW5kcm9pZF91dGlsX0JpbmRlci5oPgogCiAjaW5jbHVkZSA8am5pLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCi1zdGF0aWMgbWVkaWFfc3RhdHVzX3QgdHJhbnNsYXRlX2Vycm9yKHN0YXR1c190IGVycikgewotICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKLSAgICB9Ci0gICAgQUxPR0UoInNmIGVycm9yIGNvZGU6ICVkIiwgZXJyKTsKLSAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047Ci19Ci0KIHN0cnVjdCBBTWVkaWFNdXhlciB7CiAgICAgc3A8TWVkaWFNdXhlcj4gbUltcGw7CiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9PV05FUlMgYi9tZWRpYS9uZGsvT1dORVJTCmluZGV4IDExZTgzNDAuLjlkYzQ0MWUgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9PV05FUlMKKysrIGIvbWVkaWEvbmRrL09XTkVSUwpAQCAtMSw1ICsxLDMgQEAKIG1hcmNvbmVAZ29vZ2xlLmNvbQogIyBGb3IgQUltYWdlL0FJbWFnZVJlYWRlcgotZXRhbHZhbGFAZ29vZ2xlLmNvbQoteWluY2hpYXllaEBnb29nbGUuY29tCi16aGlqdW5oZUBnb29nbGUuY29tCitpbmNsdWRlIHBsYXRmb3JtL2ZyYW1ld29ya3MvYXY6L2NhbWVyYS9PV05FUlMKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZS5oCmluZGV4IDE5ZGY3NjAuLjNlNjBkZTAgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2UuaApAQCAtMzYsMTMgKzM2LDEyIEBACiAjaWZuZGVmIF9OREtfSU1BR0VfSAogI2RlZmluZSBfTkRLX0lNQUdFX0gKIAorI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy9jZGVmcy5oPgogCiAjaW5jbHVkZSAiTmRrTWVkaWFFcnJvci5oIgogCi0jaWYgX19BTkRST0lEX0FQSV9fID49IDI2CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZV9idWZmZXIuaD4KLSNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjYgKi8KIAogX19CRUdJTl9ERUNMUwogCkBAIC01MDAsNyArNDk5LDUxIEBACiAgICAgICogPHA+V2hlbiBhbiB7QGxpbmsgQUltYWdlfSBvZiB0aGlzIGZvcm1hdCBpcyBvYnRhaW5lZCBmcm9tIGFuIHtAbGluayBBSW1hZ2VSZWFkZXJ9IG9yCiAgICAgICoge0BsaW5rIEFJbWFnZV9nZXROdW1iZXJPZlBsYW5lcygpfSBtZXRob2Qgd2lsbCByZXR1cm4gemVyby48L3A+CiAgICAgICovCi0gICAgQUlNQUdFX0ZPUk1BVF9QUklWQVRFICAgICAgICAgICA9IDB4MjIKKyAgICBBSU1BR0VfRk9STUFUX1BSSVZBVEUgICAgICAgICAgID0gMHgyMiwKKworICAgIC8qKgorICAgICAqIEFuZHJvaWQgWTggZm9ybWF0LgorICAgICAqCisgICAgICogPHA+WTggaXMgYSBwbGFuYXIgZm9ybWF0IGNvbXByaXNlZCBvZiBhIFd4SCBZIHBsYW5lIG9ubHksIHdpdGggZWFjaCBwaXhlbAorICAgICAqIGJlaW5nIHJlcHJlc2VudGVkIGJ5IDggYml0cy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIGZvcm1hdCBhc3N1bWVzCisgICAgICogPHVsPgorICAgICAqIDxsaT5hbiBldmVuIHdpZHRoPC9saT4KKyAgICAgKiA8bGk+YW4gZXZlbiBoZWlnaHQ8L2xpPgorICAgICAqIDxsaT5hIGhvcml6b250YWwgc3RyaWRlIG11bHRpcGxlIG9mIDE2IHBpeGVsczwvbGk+CisgICAgICogPC91bD4KKyAgICAgKiA8L3A+CisgICAgICoKKyAgICAgKiA8cHJlPiBzaXplID0gc3RyaWRlICogaGVpZ2h0IDwvcHJlPgorICAgICAqCisgICAgICogPHA+Rm9yIGV4YW1wbGUsIHRoZSB7QGxpbmsgQUltYWdlfSBvYmplY3QgY2FuIHByb3ZpZGUgZGF0YQorICAgICAqIGluIHRoaXMgZm9ybWF0IGZyb20gYSB7QGxpbmsgQUNhbWVyYURldmljZX0gKGlmIHN1cHBvcnRlZCkgdGhyb3VnaCBhCisgICAgICoge0BsaW5rIEFJbWFnZVJlYWRlcn0gb2JqZWN0LiBUaGUgbnVtYmVyIG9mIHBsYW5lcyByZXR1cm5lZCBieQorICAgICAqIHtAbGluayBBSW1hZ2VfZ2V0TnVtYmVyT2ZQbGFuZXN9IHdpbGwgYWx3YXlzIGJlIDEuIFRoZSBwaXhlbCBzdHJpZGUgcmV0dXJuZWQgYnkKKyAgICAgKiB7QGxpbmsgQUltYWdlX2dldFBsYW5lUGl4ZWxTdHJpZGV9IHdpbGwgYWx3YXlzIGJlIDEsIGFuZCB0aGUKKyAgICAgKiB7QGxpbmsgQUltYWdlX2dldFBsYW5lUm93U3RyaWRlfSBkZXNjcmliZWQgdGhlIHZlcnRpY2FsIG5laWdoYm9yaW5nIHBpeGVsIGRpc3RhbmNlCisgICAgICogKGluIGJ5dGVzKSBiZXR3ZWVuIGFkamFjZW50IHJvd3MuPC9wPgorICAgICAqCisgICAgICovCisgICAgQUlNQUdFX0ZPUk1BVF9ZOCA9IDB4MjAyMDM4NTksCisKKyAgICAvKioKKyAgICAgKiBDb21wcmVzc2VkIEhFSUMgZm9ybWF0LgorICAgICAqCisgICAgICogPHA+VGhpcyBmb3JtYXQgZGVmaW5lcyB0aGUgSEVJQyBicmFuZCBvZiBIaWdoIEVmZmljaWVuY3kgSW1hZ2UgRmlsZQorICAgICAqIEZvcm1hdCBhcyBkZXNjcmliZWQgaW4gSVNPL0lFQyAyMzAwOC0xMi48L3A+CisgICAgICovCisgICAgQUlNQUdFX0ZPUk1BVF9IRUlDID0gMHg0ODQ1NDk0NiwKKworICAgIC8qKgorICAgICAqIERlcHRoIGF1Z21lbnRlZCBjb21wcmVzc2VkIEpQRUcgZm9ybWF0LgorICAgICAqCisgICAgICogPHA+SlBFRyBjb21wcmVzc2VkIG1haW4gaW1hZ2UgYWxvbmcgd2l0aCBYTVAgZW1iZWRkZWQgZGVwdGggbWV0YWRhdGEKKyAgICAgKiBmb2xsb3dpbmcgSVNPIDE2Njg0LTE6MjAxMShFKS48L3A+CisgICAgICovCisgICAgQUlNQUdFX0ZPUk1BVF9ERVBUSF9KUEVHID0gMHg2OTY1Njk2MywKKwogfTsKIAogLyoqCkBAIC01MjksNyArNTcyLDcgQEAKICAqCiAgKiBAcGFyYW0gaW1hZ2UgVGhlIHtAbGluayBBSW1hZ2V9IHRvIGJlIGRlbGV0ZWQuCiAgKi8KLXZvaWQgQUltYWdlX2RlbGV0ZShBSW1hZ2UqIGltYWdlKTsKK3ZvaWQgQUltYWdlX2RlbGV0ZShBSW1hZ2UqIGltYWdlKSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKICAqIFF1ZXJ5IHRoZSB3aWR0aCBvZiB0aGUgaW5wdXQge0BsaW5rIEFJbWFnZX0uCkBAIC01NDMsNyArNTg2LDcgQEAKICAqICAgICAgICAgPGxpPntAbGluayBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1R9IGlmIHRoZSB7QGxpbmsgQUltYWdlUmVhZGVyfSBnZW5lcmF0ZWQgdGhpcwogICogICAgICAgICAgICAgICAgIGltYWdlIGhhcyBiZWVuIGRlbGV0ZWQuPC9saT48L3VsPgogICovCi1tZWRpYV9zdGF0dXNfdCBBSW1hZ2VfZ2V0V2lkdGgoY29uc3QgQUltYWdlKiBpbWFnZSwgLypvdXQqL2ludDMyX3QqIHdpZHRoKTsKK21lZGlhX3N0YXR1c190IEFJbWFnZV9nZXRXaWR0aChjb25zdCBBSW1hZ2UqIGltYWdlLCAvKm91dCovaW50MzJfdCogd2lkdGgpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qKgogICogUXVlcnkgdGhlIGhlaWdodCBvZiB0aGUgaW5wdXQge0BsaW5rIEFJbWFnZX0uCkBAIC01NTcsNyArNjAwLDcgQEAKICAqICAgICAgICAgPGxpPntAbGluayBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1R9IGlmIHRoZSB7QGxpbmsgQUltYWdlUmVhZGVyfSBnZW5lcmF0ZWQgdGhpcwogICogICAgICAgICAgICAgICAgIGltYWdlIGhhcyBiZWVuIGRlbGV0ZWQuPC9saT48L3VsPgogICovCi1tZWRpYV9zdGF0dXNfdCBBSW1hZ2VfZ2V0SGVpZ2h0KGNvbnN0IEFJbWFnZSogaW1hZ2UsIC8qb3V0Ki9pbnQzMl90KiBoZWlnaHQpOworbWVkaWFfc3RhdHVzX3QgQUltYWdlX2dldEhlaWdodChjb25zdCBBSW1hZ2UqIGltYWdlLCAvKm91dCovaW50MzJfdCogaGVpZ2h0KSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKICAqIFF1ZXJ5IHRoZSBmb3JtYXQgb2YgdGhlIGlucHV0IHtAbGluayBBSW1hZ2V9LgpAQCAtNTczLDcgKzYxNiw3IEBACiAgKiAgICAgICAgIDxsaT57QGxpbmsgQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUfSBpZiB0aGUge0BsaW5rIEFJbWFnZVJlYWRlcn0gZ2VuZXJhdGVkIHRoaXMKICAqICAgICAgICAgICAgICAgICBpbWFnZSBoYXMgYmVlbiBkZWxldGVkLjwvbGk+PC91bD4KICAqLwotbWVkaWFfc3RhdHVzX3QgQUltYWdlX2dldEZvcm1hdChjb25zdCBBSW1hZ2UqIGltYWdlLCAvKm91dCovaW50MzJfdCogZm9ybWF0KTsKK21lZGlhX3N0YXR1c190IEFJbWFnZV9nZXRGb3JtYXQoY29uc3QgQUltYWdlKiBpbWFnZSwgLypvdXQqL2ludDMyX3QqIGZvcm1hdCkgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogLyoqCiAgKiBRdWVyeSB0aGUgY3JvcHBlZCByZWN0YW5nbGUgb2YgdGhlIGlucHV0IHtAbGluayBBSW1hZ2V9LgpAQCAtNTkwLDcgKzYzMyw3IEBACiAgKiAgICAgICAgIDxsaT57QGxpbmsgQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUfSBpZiB0aGUge0BsaW5rIEFJbWFnZVJlYWRlcn0gZ2VuZXJhdGVkIHRoaXMKICAqICAgICAgICAgICAgICAgICBpbWFnZSBoYXMgYmVlbiBkZWxldGVkLjwvbGk+PC91bD4KICAqLwotbWVkaWFfc3RhdHVzX3QgQUltYWdlX2dldENyb3BSZWN0KGNvbnN0IEFJbWFnZSogaW1hZ2UsIC8qb3V0Ki9BSW1hZ2VDcm9wUmVjdCogcmVjdCk7CittZWRpYV9zdGF0dXNfdCBBSW1hZ2VfZ2V0Q3JvcFJlY3QoY29uc3QgQUltYWdlKiBpbWFnZSwgLypvdXQqL0FJbWFnZUNyb3BSZWN0KiByZWN0KSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKICAqIFF1ZXJ5IHRoZSB0aW1lc3RhbXAgb2YgdGhlIGlucHV0IHtAbGluayBBSW1hZ2V9LgpAQCAtNjE0LDcgKzY1Nyw3IEBACiAgKiAgICAgICAgIDxsaT57QGxpbmsgQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUfSBpZiB0aGUge0BsaW5rIEFJbWFnZVJlYWRlcn0gZ2VuZXJhdGVkIHRoaXMKICAqICAgICAgICAgICAgICAgICBpbWFnZSBoYXMgYmVlbiBkZWxldGVkLjwvbGk+PC91bD4KICAqLwotbWVkaWFfc3RhdHVzX3QgQUltYWdlX2dldFRpbWVzdGFtcChjb25zdCBBSW1hZ2UqIGltYWdlLCAvKm91dCovaW50NjRfdCogdGltZXN0YW1wTnMpOworbWVkaWFfc3RhdHVzX3QgQUltYWdlX2dldFRpbWVzdGFtcChjb25zdCBBSW1hZ2UqIGltYWdlLCAvKm91dCovaW50NjRfdCogdGltZXN0YW1wTnMpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qKgogICogUXVlcnkgdGhlIG51bWJlciBvZiBwbGFuZXMgb2YgdGhlIGlucHV0IHtAbGluayBBSW1hZ2V9LgpAQCAtNjMyLDcgKzY3NSw3IEBACiAgKiAgICAgICAgIDxsaT57QGxpbmsgQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUfSBpZiB0aGUge0BsaW5rIEFJbWFnZVJlYWRlcn0gZ2VuZXJhdGVkIHRoaXMKICAqICAgICAgICAgICAgICAgICBpbWFnZSBoYXMgYmVlbiBkZWxldGVkLjwvbGk+PC91bD4KICAqLwotbWVkaWFfc3RhdHVzX3QgQUltYWdlX2dldE51bWJlck9mUGxhbmVzKGNvbnN0IEFJbWFnZSogaW1hZ2UsIC8qb3V0Ki9pbnQzMl90KiBudW1QbGFuZXMpOworbWVkaWFfc3RhdHVzX3QgQUltYWdlX2dldE51bWJlck9mUGxhbmVzKGNvbnN0IEFJbWFnZSogaW1hZ2UsIC8qb3V0Ki9pbnQzMl90KiBudW1QbGFuZXMpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qKgogICogUXVlcnkgdGhlIHBpeGVsIHN0cmlkZSBvZiB0aGUgaW5wdXQge0BsaW5rIEFJbWFnZX0uCkBAIC02NjAsNyArNzAzLDcgQEAKICAqICAgICAgICAgICAgICAgICBmb3IgQ1BVIGFjY2Vzcy48L2xpPjwvdWw+CiAgKi8KIG1lZGlhX3N0YXR1c190IEFJbWFnZV9nZXRQbGFuZVBpeGVsU3RyaWRlKAotICAgICAgICBjb25zdCBBSW1hZ2UqIGltYWdlLCBpbnQgcGxhbmVJZHgsIC8qb3V0Ki9pbnQzMl90KiBwaXhlbFN0cmlkZSk7CisgICAgICAgIGNvbnN0IEFJbWFnZSogaW1hZ2UsIGludCBwbGFuZUlkeCwgLypvdXQqL2ludDMyX3QqIHBpeGVsU3RyaWRlKSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKICAqIFF1ZXJ5IHRoZSByb3cgc3RyaWRlIG9mIHRoZSBpbnB1dCB7QGxpbmsgQUltYWdlfS4KQEAgLTY4Nyw3ICs3MzAsNyBAQAogICogICAgICAgICAgICAgICAgIGZvciBDUFUgYWNjZXNzLjwvbGk+PC91bD4KICAqLwogbWVkaWFfc3RhdHVzX3QgQUltYWdlX2dldFBsYW5lUm93U3RyaWRlKAotICAgICAgICBjb25zdCBBSW1hZ2UqIGltYWdlLCBpbnQgcGxhbmVJZHgsIC8qb3V0Ki9pbnQzMl90KiByb3dTdHJpZGUpOworICAgICAgICBjb25zdCBBSW1hZ2UqIGltYWdlLCBpbnQgcGxhbmVJZHgsIC8qb3V0Ki9pbnQzMl90KiByb3dTdHJpZGUpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qKgogICogR2V0IHRoZSBkYXRhIHBvaW50ZXIgb2YgdGhlIGlucHV0IGltYWdlIGZvciBkaXJlY3QgYXBwbGljYXRpb24gYWNjZXNzLgpAQCAtNzEyLDcgKzc1NSw3IEBACiAgKi8KIG1lZGlhX3N0YXR1c190IEFJbWFnZV9nZXRQbGFuZURhdGEoCiAgICAgICAgIGNvbnN0IEFJbWFnZSogaW1hZ2UsIGludCBwbGFuZUlkeCwKLSAgICAgICAgLypvdXQqL3VpbnQ4X3QqKiBkYXRhLCAvKm91dCovaW50KiBkYXRhTGVuZ3RoKTsKKyAgICAgICAgLypvdXQqL3VpbnQ4X3QqKiBkYXRhLCAvKm91dCovaW50KiBkYXRhTGVuZ3RoKSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI0ICovCiAKQEAgLTczMiw3ICs3NzUsNyBAQAogICoKICAqIEBzZWUgc3luYy5oCiAgKi8KLXZvaWQgQUltYWdlX2RlbGV0ZUFzeW5jKEFJbWFnZSogaW1hZ2UsIGludCByZWxlYXNlRmVuY2VGZCk7Cit2b2lkIEFJbWFnZV9kZWxldGVBc3luYyhBSW1hZ2UqIGltYWdlLCBpbnQgcmVsZWFzZUZlbmNlRmQpIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgogICogR2V0IHRoZSBoYXJkd2FyZSBidWZmZXIgaGFuZGxlIG9mIHRoZSBpbnB1dCBpbWFnZSBpbnRlbmRlZCBmb3IgR1BVIGFuZC9vciBoYXJkd2FyZSBhY2Nlc3MuCkBAIC03NjAsNyArODAzLDcgQEAKICAqCiAgKiBAc2VlIEFJbWFnZVJlYWRlcl9JbWFnZUNhbGxiYWNrCiAgKi8KLW1lZGlhX3N0YXR1c190IEFJbWFnZV9nZXRIYXJkd2FyZUJ1ZmZlcihjb25zdCBBSW1hZ2UqIGltYWdlLCAvKm91dCovQUhhcmR3YXJlQnVmZmVyKiogYnVmZmVyKTsKK21lZGlhX3N0YXR1c190IEFJbWFnZV9nZXRIYXJkd2FyZUJ1ZmZlcihjb25zdCBBSW1hZ2UqIGltYWdlLCAvKm91dCovQUhhcmR3YXJlQnVmZmVyKiogYnVmZmVyKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI2ICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlUmVhZGVyLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZVJlYWRlci5oCmluZGV4IDU3MTQxMGIuLmU1ZDg2M2MgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlUmVhZGVyLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2VSZWFkZXIuaApAQCAtMzcsNiArMzcsOSBAQAogI2RlZmluZSBfTkRLX0lNQUdFX1JFQURFUl9ICiAKICNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNlbmRpZgogCiAjaW5jbHVkZSA8YW5kcm9pZC9uYXRpdmVfd2luZG93Lmg+CiAjaW5jbHVkZSAiTmRrTWVkaWFFcnJvci5oIgpAQCAtODgsNyArOTEsNyBAQAogICovCiBtZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfbmV3KAogICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCBmb3JtYXQsIGludDMyX3QgbWF4SW1hZ2VzLAotICAgICAgICAvKm91dCovQUltYWdlUmVhZGVyKiogcmVhZGVyKTsKKyAgICAgICAgLypvdXQqL0FJbWFnZVJlYWRlcioqIHJlYWRlcikgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogLyoqCiAgKiBEZWxldGUgYW4ge0BsaW5rIEFJbWFnZVJlYWRlcn0gYW5kIHJldHVybiBhbGwgaW1hZ2VzIGdlbmVyYXRlZCBieSB0aGlzIHJlYWRlciB0byBzeXN0ZW0uCkBAIC0xMDAsNyArMTAzLDcgQEAKICAqCiAgKiBAcGFyYW0gcmVhZGVyIFRoZSBpbWFnZSByZWFkZXIgdG8gYmUgZGVsZXRlZC4KICAqLwotdm9pZCBBSW1hZ2VSZWFkZXJfZGVsZXRlKEFJbWFnZVJlYWRlciogcmVhZGVyKTsKK3ZvaWQgQUltYWdlUmVhZGVyX2RlbGV0ZShBSW1hZ2VSZWFkZXIqIHJlYWRlcikgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogLyoqCiAgKiBHZXQgYSB7QGxpbmsgQU5hdGl2ZVdpbmRvd30gdGhhdCBjYW4gYmUgdXNlZCB0byBwcm9kdWNlIHtAbGluayBBSW1hZ2V9IGZvciB0aGlzIGltYWdlIHJlYWRlci4KQEAgLTExNCw3ICsxMTcsNyBAQAogICogICAgICAgICA8bGk+e0BsaW5rIEFNRURJQV9PS30gaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLjwvbGk+CiAgKiAgICAgICAgIDxsaT57QGxpbmsgQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSfSBpZiByZWFkZXIgb3Igd2luZG93IGlzIE5VTEwuPC9saT48L3VsPgogICovCi1tZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfZ2V0V2luZG93KEFJbWFnZVJlYWRlciogcmVhZGVyLCAvKm91dCovQU5hdGl2ZVdpbmRvdyoqIHdpbmRvdyk7CittZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfZ2V0V2luZG93KEFJbWFnZVJlYWRlciogcmVhZGVyLCAvKm91dCovQU5hdGl2ZVdpbmRvdyoqIHdpbmRvdykgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogLyoqCiAgKiBRdWVyeSB0aGUgZGVmYXVsdCB3aWR0aCBvZiB0aGUge0BsaW5rIEFJbWFnZX0gZ2VuZXJhdGVkIGJ5IHRoaXMgcmVhZGVyLCBpbiBwaXhlbHMuCkBAIC0xMzAsNyArMTMzLDcgQEAKICAqICAgICAgICAgPGxpPntAbGluayBBTUVESUFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgogICogICAgICAgICA8bGk+e0BsaW5rIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgcmVhZGVyIG9yIHdpZHRoIGlzIE5VTEwuPC9saT48L3VsPgogICovCi1tZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfZ2V0V2lkdGgoY29uc3QgQUltYWdlUmVhZGVyKiByZWFkZXIsIC8qb3V0Ki9pbnQzMl90KiB3aWR0aCk7CittZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfZ2V0V2lkdGgoY29uc3QgQUltYWdlUmVhZGVyKiByZWFkZXIsIC8qb3V0Ki9pbnQzMl90KiB3aWR0aCkgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogLyoqCiAgKiBRdWVyeSB0aGUgZGVmYXVsdCBoZWlnaHQgb2YgdGhlIHtAbGluayBBSW1hZ2V9IGdlbmVyYXRlZCBieSB0aGlzIHJlYWRlciwgaW4gcGl4ZWxzLgpAQCAtMTQ2LDcgKzE0OSw3IEBACiAgKiAgICAgICAgIDxsaT57QGxpbmsgQU1FRElBX09LfSBpZiB0aGUgbWV0aG9kIGNhbGwgc3VjY2VlZHMuPC9saT4KICAqICAgICAgICAgPGxpPntAbGluayBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIHJlYWRlciBvciBoZWlnaHQgaXMgTlVMTC48L2xpPjwvdWw+CiAgKi8KLW1lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcl9nZXRIZWlnaHQoY29uc3QgQUltYWdlUmVhZGVyKiByZWFkZXIsIC8qb3V0Ki9pbnQzMl90KiBoZWlnaHQpOworbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX2dldEhlaWdodChjb25zdCBBSW1hZ2VSZWFkZXIqIHJlYWRlciwgLypvdXQqL2ludDMyX3QqIGhlaWdodCkgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogLyoqCiAgKiBRdWVyeSB0aGUgZm9ybWF0IG9mIHRoZSB7QGxpbmsgQUltYWdlfSBnZW5lcmF0ZWQgYnkgdGhpcyByZWFkZXIuCkBAIC0xNTksNyArMTYyLDcgQEAKICAqICAgICAgICAgPGxpPntAbGluayBBTUVESUFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgogICogICAgICAgICA8bGk+e0BsaW5rIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgcmVhZGVyIG9yIGZvcm1hdCBpcyBOVUxMLjwvbGk+PC91bD4KICAqLwotbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX2dldEZvcm1hdChjb25zdCBBSW1hZ2VSZWFkZXIqIHJlYWRlciwgLypvdXQqL2ludDMyX3QqIGZvcm1hdCk7CittZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfZ2V0Rm9ybWF0KGNvbnN0IEFJbWFnZVJlYWRlciogcmVhZGVyLCAvKm91dCovaW50MzJfdCogZm9ybWF0KSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKICAqIFF1ZXJ5IHRoZSBtYXhpbXVtIG51bWJlciBvZiBjb25jdXJyZW50bHkgYWNxdWlyZWQge0BsaW5rIEFJbWFnZX1zIG9mIHRoaXMgcmVhZGVyLgpAQCAtMTcyLDcgKzE3NSw3IEBACiAgKiAgICAgICAgIDxsaT57QGxpbmsgQU1FRElBX09LfSBpZiB0aGUgbWV0aG9kIGNhbGwgc3VjY2VlZHMuPC9saT4KICAqICAgICAgICAgPGxpPntAbGluayBBTUVESUFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIHJlYWRlciBvciBtYXhJbWFnZXMgaXMgTlVMTC48L2xpPjwvdWw+CiAgKi8KLW1lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcl9nZXRNYXhJbWFnZXMoY29uc3QgQUltYWdlUmVhZGVyKiByZWFkZXIsIC8qb3V0Ki9pbnQzMl90KiBtYXhJbWFnZXMpOworbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX2dldE1heEltYWdlcyhjb25zdCBBSW1hZ2VSZWFkZXIqIHJlYWRlciwgLypvdXQqL2ludDMyX3QqIG1heEltYWdlcykgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogLyoqCiAgKiBBY3F1aXJlIHRoZSBuZXh0IHtAbGluayBBSW1hZ2V9IGZyb20gdGhlIGltYWdlIHJlYWRlcidzIHF1ZXVlLgpAQCAtMjA4LDcgKzIxMSw3IEBACiAgKgogICogQHNlZSBBSW1hZ2VSZWFkZXJfYWNxdWlyZUxhdGVzdEltYWdlCiAgKi8KLW1lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcl9hY3F1aXJlTmV4dEltYWdlKEFJbWFnZVJlYWRlciogcmVhZGVyLCAvKm91dCovQUltYWdlKiogaW1hZ2UpOworbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX2FjcXVpcmVOZXh0SW1hZ2UoQUltYWdlUmVhZGVyKiByZWFkZXIsIC8qb3V0Ki9BSW1hZ2UqKiBpbWFnZSkgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogLyoqCiAKQEAgLTI1Miw3ICsyNTUsNyBAQAogICoKICAqIEBzZWUgQUltYWdlUmVhZGVyX2FjcXVpcmVOZXh0SW1hZ2UKICAqLwotbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX2FjcXVpcmVMYXRlc3RJbWFnZShBSW1hZ2VSZWFkZXIqIHJlYWRlciwgLypvdXQqL0FJbWFnZSoqIGltYWdlKTsKK21lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcl9hY3F1aXJlTGF0ZXN0SW1hZ2UoQUltYWdlUmVhZGVyKiByZWFkZXIsIC8qb3V0Ki9BSW1hZ2UqKiBpbWFnZSkgX19JTlRST0RVQ0VEX0lOKDI0KTsKIAogCiAvKioKQEAgLTI5Niw3ICsyOTksNyBAQAogICogICAgICAgICA8bGk+e0BsaW5rIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgcmVhZGVyIGlzIE5VTEwuPC9saT48L3VsPgogICovCiBtZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfc2V0SW1hZ2VMaXN0ZW5lcigKLSAgICAgICAgQUltYWdlUmVhZGVyKiByZWFkZXIsIEFJbWFnZVJlYWRlcl9JbWFnZUxpc3RlbmVyKiBsaXN0ZW5lcik7CisgICAgICAgIEFJbWFnZVJlYWRlciogcmVhZGVyLCBBSW1hZ2VSZWFkZXJfSW1hZ2VMaXN0ZW5lciogbGlzdGVuZXIpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjQgKi8KIApAQCAtMzY1LDcgKzM2OCw3IEBACiAgKi8KIG1lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcl9uZXdXaXRoVXNhZ2UoCiAgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBpbnQzMl90IGZvcm1hdCwgdWludDY0X3QgdXNhZ2UsIGludDMyX3QgbWF4SW1hZ2VzLAotICAgICAgICAvKm91dCovIEFJbWFnZVJlYWRlcioqIHJlYWRlcik7CisgICAgICAgIC8qb3V0Ki8gQUltYWdlUmVhZGVyKiogcmVhZGVyKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIEFjcXVpcmUgdGhlIG5leHQge0BsaW5rIEFJbWFnZX0gZnJvbSB0aGUgaW1hZ2UgcmVhZGVyJ3MgcXVldWUgYXN5bmNocm9ub3VzbHkuCkBAIC0zODQsNyArMzg3LDcgQEAKICAqIEBzZWUgc3luY19nZXRfZmVuY2VfaW5mbwogICovCiBtZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfYWNxdWlyZU5leHRJbWFnZUFzeW5jKAotICAgICAgICBBSW1hZ2VSZWFkZXIqIHJlYWRlciwgLypvdXQqL0FJbWFnZSoqIGltYWdlLCAvKm91dCovaW50KiBhY3F1aXJlRmVuY2VGZCk7CisgICAgICAgIEFJbWFnZVJlYWRlciogcmVhZGVyLCAvKm91dCovQUltYWdlKiogaW1hZ2UsIC8qb3V0Ki9pbnQqIGFjcXVpcmVGZW5jZUZkKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKICAqIEFjcXVpcmUgdGhlIGxhdGVzdCB7QGxpbmsgQUltYWdlfSBmcm9tIHRoZSBpbWFnZSByZWFkZXIncyBxdWV1ZSBhc3luY2hyb25vdXNseSwgZHJvcHBpbmcgb2xkZXIKQEAgLTQwNCw3ICs0MDcsNyBAQAogICogQHNlZSBzeW5jX2dldF9mZW5jZV9pbmZvCiAgKi8KIG1lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcl9hY3F1aXJlTGF0ZXN0SW1hZ2VBc3luYygKLSAgICAgICAgQUltYWdlUmVhZGVyKiByZWFkZXIsIC8qb3V0Ki9BSW1hZ2UqKiBpbWFnZSwgLypvdXQqL2ludCogYWNxdWlyZUZlbmNlRmQpOworICAgICAgICBBSW1hZ2VSZWFkZXIqIHJlYWRlciwgLypvdXQqL0FJbWFnZSoqIGltYWdlLCAvKm91dCovaW50KiBhY3F1aXJlRmVuY2VGZCkgX19JTlRST0RVQ0VEX0lOKDI2KTsKIC8qKgogICogU2lnbmF0dXJlIG9mIHRoZSBjYWxsYmFjayB3aGljaCBpcyBjYWxsZWQgd2hlbiB7QGxpbmsgQUltYWdlUmVhZGVyfSBpcyBhYm91dCB0byByZW1vdmUgYSBidWZmZXIuCiAgKgpAQCAtNDU5LDcgKzQ2MiwyNCBAQAogICogQHNlZSBBSW1hZ2VfZ2V0SGFyZHdhcmVCdWZmZXIKICAqLwogbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX3NldEJ1ZmZlclJlbW92ZWRMaXN0ZW5lcigKLSAgICAgICAgQUltYWdlUmVhZGVyKiByZWFkZXIsIEFJbWFnZVJlYWRlcl9CdWZmZXJSZW1vdmVkTGlzdGVuZXIqIGxpc3RlbmVyKTsKKyAgICAgICAgQUltYWdlUmVhZGVyKiByZWFkZXIsIEFJbWFnZVJlYWRlcl9CdWZmZXJSZW1vdmVkTGlzdGVuZXIqIGxpc3RlbmVyKSBfX0lOVFJPRFVDRURfSU4oMjYpOworCisjaWZkZWYgX19BTkRST0lEX1ZOREtfXworLyoKKyAqIEdldCB0aGUgbmF0aXZlX2hhbmRsZV90IGNvcnJlc3BvbmRpbmcgdG8gdGhlIEFOYXRpdmVXaW5kb3cgb3duZWQgYnkgdGhlCisgKiBBSW1hZ2VSZWFkZXIgcHJvdmlkZWQuCisgKgorICogQHBhcmFtIHJlYWRlciBUaGUgaW1hZ2UgcmVhZGVyIG9mIGludGVyZXN0LgorICogQHBhcmFtIGhhbmRsZSBUaGUgb3V0cHV0IG5hdGl2ZV9oYW5kbGVfdC4gVGhpcyBuYXRpdmUgaGFuZGxlIGlzIG93bmVkIGJ5CisgKiAgICAgICAgICAgICAgIHRoaXMgaW1hZ2UgcmVhZGVyLgorICoKKyAqIEByZXR1cm4gQU1FRElBX09LIGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy4KKyAqICAgICAgICAgQU1FRElBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSIGlmIHJlYWRlciBvciBoYW5kbGUgYXJlIE5VTEwuCisgKiAgICAgICAgIEFNRURJQV9FUlJPUl9VTktOT1dOIGlmIHNvbWUgb3RoZXIgZXJyb3IgaXMgZW5jb3VudGVyZWQuCisgKi8KK21lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcl9nZXRXaW5kb3dOYXRpdmVIYW5kbGUoCisgICAgQUltYWdlUmVhZGVyICpyZWFkZXIsIC8qIG91dCAqL25hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisjZW5kaWYKIAogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyNiAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUNvZGVjLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUNvZGVjLmgKaW5kZXggZjRhNTFkMC4uYjNlZTg1MyAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDb2RlYy5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ29kZWMuaApAQCAtMTQsNiArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKy8qKgorICogQGFkZHRvZ3JvdXAgTWVkaWEKKyAqIEB7CisgKi8KKworLyoqCisgKiBAZmlsZSBOZGtNZWRpYUNvZGVjLmgKKyAqLworCiAvKgogICogVGhpcyBmaWxlIGRlZmluZXMgYW4gTkRLIEFQSS4KICAqIERvIG5vdCByZW1vdmUgbWV0aG9kcy4KQEAgLTExOSwyMyArMTI4LDIzIEBACiAgKiBXaGVuIGNvbmZpZ3VyaW5nLCB5b3Ugd2lsbCBuZWVkIHRvIHNwZWNpZnkgd2hldGhlciB0byB1c2UgdGhlIGNvZGVjIGFzIGFuCiAgKiBlbmNvZGVyIG9yIGRlY29kZXIuCiAgKi8KLUFNZWRpYUNvZGVjKiBBTWVkaWFDb2RlY19jcmVhdGVDb2RlY0J5TmFtZShjb25zdCBjaGFyICpuYW1lKTsKK0FNZWRpYUNvZGVjKiBBTWVkaWFDb2RlY19jcmVhdGVDb2RlY0J5TmFtZShjb25zdCBjaGFyICpuYW1lKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIENyZWF0ZSBjb2RlYyBieSBtaW1lIHR5cGUuIE1vc3QgYXBwbGljYXRpb25zIHdpbGwgdXNlIHRoaXMsIHNwZWNpZnlpbmcgYQogICogbWltZSB0eXBlIG9idGFpbmVkIGZyb20gbWVkaWEgZXh0cmFjdG9yLgogICovCi1BTWVkaWFDb2RlYyogQU1lZGlhQ29kZWNfY3JlYXRlRGVjb2RlckJ5VHlwZShjb25zdCBjaGFyICptaW1lX3R5cGUpOworQU1lZGlhQ29kZWMqIEFNZWRpYUNvZGVjX2NyZWF0ZURlY29kZXJCeVR5cGUoY29uc3QgY2hhciAqbWltZV90eXBlKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIENyZWF0ZSBlbmNvZGVyIGJ5IG5hbWUuCiAgKi8KLUFNZWRpYUNvZGVjKiBBTWVkaWFDb2RlY19jcmVhdGVFbmNvZGVyQnlUeXBlKGNvbnN0IGNoYXIgKm1pbWVfdHlwZSk7CitBTWVkaWFDb2RlYyogQU1lZGlhQ29kZWNfY3JlYXRlRW5jb2RlckJ5VHlwZShjb25zdCBjaGFyICptaW1lX3R5cGUpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogZGVsZXRlIHRoZSBjb2RlYyBhbmQgZnJlZSBpdHMgcmVzb3VyY2VzCiAgKi8KLW1lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX2RlbGV0ZShBTWVkaWFDb2RlYyopOworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfZGVsZXRlKEFNZWRpYUNvZGVjKikgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBDb25maWd1cmUgdGhlIGNvZGVjLiBGb3IgZGVjb2RpbmcgeW91IHdvdWxkIHR5cGljYWxseSBnZXQgdGhlIGZvcm1hdCBmcm9tIGFuIGV4dHJhY3Rvci4KQEAgLTE0NSw0MyArMTU0LDQzIEBACiAgICAgICAgIGNvbnN0IEFNZWRpYUZvcm1hdCogZm9ybWF0LAogICAgICAgICBBTmF0aXZlV2luZG93KiBzdXJmYWNlLAogICAgICAgICBBTWVkaWFDcnlwdG8gKmNyeXB0bywKLSAgICAgICAgdWludDMyX3QgZmxhZ3MpOworICAgICAgICB1aW50MzJfdCBmbGFncykgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBTdGFydCB0aGUgY29kZWMuIEEgY29kZWMgbXVzdCBiZSBjb25maWd1cmVkIGJlZm9yZSBpdCBjYW4gYmUgc3RhcnRlZCwgYW5kIG11c3QgYmUgc3RhcnRlZAogICogYmVmb3JlIGJ1ZmZlcnMgY2FuIGJlIHNlbnQgdG8gaXQuCiAgKi8KLW1lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3N0YXJ0KEFNZWRpYUNvZGVjKik7CittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19zdGFydChBTWVkaWFDb2RlYyopIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogU3RvcCB0aGUgY29kZWMuCiAgKi8KLW1lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3N0b3AoQU1lZGlhQ29kZWMqKTsKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3N0b3AoQU1lZGlhQ29kZWMqKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKgogICogRmx1c2ggdGhlIGNvZGVjJ3MgaW5wdXQgYW5kIG91dHB1dC4gQWxsIGluZGljZXMgcHJldmlvdXNseSByZXR1cm5lZCBmcm9tIGNhbGxzIHRvCiAgKiBBTWVkaWFDb2RlY19kZXF1ZXVlSW5wdXRCdWZmZXIgYW5kIEFNZWRpYUNvZGVjX2RlcXVldWVPdXRwdXRCdWZmZXIgYmVjb21lIGludmFsaWQuCiAgKi8KLW1lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX2ZsdXNoKEFNZWRpYUNvZGVjKik7CittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19mbHVzaChBTWVkaWFDb2RlYyopIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogR2V0IGFuIGlucHV0IGJ1ZmZlci4gVGhlIHNwZWNpZmllZCBidWZmZXIgaW5kZXggbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSBvYnRhaW5lZCBmcm9tCiAgKiBkZXF1ZXVlSW5wdXRCdWZmZXIsIGFuZCBub3QgeWV0IHF1ZXVlZC4KICAqLwotdWludDhfdCogQU1lZGlhQ29kZWNfZ2V0SW5wdXRCdWZmZXIoQU1lZGlhQ29kZWMqLCBzaXplX3QgaWR4LCBzaXplX3QgKm91dF9zaXplKTsKK3VpbnQ4X3QqIEFNZWRpYUNvZGVjX2dldElucHV0QnVmZmVyKEFNZWRpYUNvZGVjKiwgc2l6ZV90IGlkeCwgc2l6ZV90ICpvdXRfc2l6ZSkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBHZXQgYW4gb3V0cHV0IGJ1ZmZlci4gVGhlIHNwZWNpZmllZCBidWZmZXIgaW5kZXggbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSBvYnRhaW5lZCBmcm9tCiAgKiBkZXF1ZXVlT3V0cHV0QnVmZmVyLCBhbmQgbm90IHlldCBxdWV1ZWQuCiAgKi8KLXVpbnQ4X3QqIEFNZWRpYUNvZGVjX2dldE91dHB1dEJ1ZmZlcihBTWVkaWFDb2RlYyosIHNpemVfdCBpZHgsIHNpemVfdCAqb3V0X3NpemUpOwordWludDhfdCogQU1lZGlhQ29kZWNfZ2V0T3V0cHV0QnVmZmVyKEFNZWRpYUNvZGVjKiwgc2l6ZV90IGlkeCwgc2l6ZV90ICpvdXRfc2l6ZSkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBHZXQgdGhlIGluZGV4IG9mIHRoZSBuZXh0IGF2YWlsYWJsZSBpbnB1dCBidWZmZXIuIEFuIGFwcCB3aWxsIHR5cGljYWxseSB1c2UgdGhpcyB3aXRoCiAgKiBnZXRJbnB1dEJ1ZmZlcigpIHRvIGdldCBhIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciwgdGhlbiBjb3B5IHRoZSBkYXRhIHRvIGJlIGVuY29kZWQgb3IgZGVjb2RlZAogICogaW50byB0aGUgYnVmZmVyIGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoZSBjb2RlYy4KICAqLwotc3NpemVfdCBBTWVkaWFDb2RlY19kZXF1ZXVlSW5wdXRCdWZmZXIoQU1lZGlhQ29kZWMqLCBpbnQ2NF90IHRpbWVvdXRVcyk7Citzc2l6ZV90IEFNZWRpYUNvZGVjX2RlcXVldWVJbnB1dEJ1ZmZlcihBTWVkaWFDb2RlYyosIGludDY0X3QgdGltZW91dFVzKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKgogICogX19VU0VfRklMRV9PRkZTRVQ2NCBjaGFuZ2VzIHRoZSB0eXBlIG9mIG9mZl90IGluIExQMzIsIHdoaWNoIGNoYW5nZXMgdGhlIEFCSQpAQCAtMjEyLDcgKzIyMSw3IEBACiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3F1ZXVlSW5wdXRCdWZmZXIoQU1lZGlhQ29kZWMqLCBzaXplX3QgaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb2ZmX3RfY29tcGF0IG9mZnNldCwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWUsIHVpbnQzMl90IGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdGltZSwgdWludDMyX3QgZmxhZ3MpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogU2VuZCB0aGUgc3BlY2lmaWVkIGJ1ZmZlciB0byB0aGUgY29kZWMgZm9yIHByb2Nlc3NpbmcuCkBAIC0yMjAsNyArMjI5LDcgQEAKIG1lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3F1ZXVlU2VjdXJlSW5wdXRCdWZmZXIoQU1lZGlhQ29kZWMqLCBzaXplX3QgaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb2ZmX3RfY29tcGF0IG9mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdGltZSwgdWludDMyX3QgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0aW1lLCB1aW50MzJfdCBmbGFncykgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogI3VuZGVmIF9vZmZfdF9jb21wYXQKIApAQCAtMjI4LDIxICsyMzcsMTUgQEAKICAqIEdldCB0aGUgaW5kZXggb2YgdGhlIG5leHQgYXZhaWxhYmxlIGJ1ZmZlciBvZiBwcm9jZXNzZWQgZGF0YS4KICAqLwogc3NpemVfdCBBTWVkaWFDb2RlY19kZXF1ZXVlT3V0cHV0QnVmZmVyKEFNZWRpYUNvZGVjKiwgQU1lZGlhQ29kZWNCdWZmZXJJbmZvICppbmZvLAotICAgICAgICBpbnQ2NF90IHRpbWVvdXRVcyk7Ci1BTWVkaWFGb3JtYXQqIEFNZWRpYUNvZGVjX2dldE91dHB1dEZvcm1hdChBTWVkaWFDb2RlYyopOwotCi0vKioKLSAqIEdldCBmb3JtYXQgb2YgdGhlIGJ1ZmZlci4gVGhlIHNwZWNpZmllZCBidWZmZXIgaW5kZXggbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSBvYnRhaW5lZCBmcm9tCi0gKiBkZXF1ZXVlT3V0cHV0QnVmZmVyLgotICovCi1BTWVkaWFGb3JtYXQqIEFNZWRpYUNvZGVjX2dldEJ1ZmZlckZvcm1hdChBTWVkaWFDb2RlYyosIHNpemVfdCBpbmRleCk7CisgICAgICAgIGludDY0X3QgdGltZW91dFVzKSBfX0lOVFJPRFVDRURfSU4oMjEpOworQU1lZGlhRm9ybWF0KiBBTWVkaWFDb2RlY19nZXRPdXRwdXRGb3JtYXQoQU1lZGlhQ29kZWMqKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIElmIHlvdSBhcmUgZG9uZSB3aXRoIGEgYnVmZmVyLCB1c2UgdGhpcyBjYWxsIHRvIHJldHVybiB0aGUgYnVmZmVyIHRvCiAgKiB0aGUgY29kZWMuIElmIHlvdSBwcmV2aW91c2x5IHNwZWNpZmllZCBhIHN1cmZhY2Ugd2hlbiBjb25maWd1cmluZyB0aGlzCiAgKiB2aWRlbyBkZWNvZGVyIHlvdSBjYW4gb3B0aW9uYWxseSByZW5kZXIgdGhlIGJ1ZmZlci4KICAqLwotbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcmVsZWFzZU91dHB1dEJ1ZmZlcihBTWVkaWFDb2RlYyosIHNpemVfdCBpZHgsIGJvb2wgcmVuZGVyKTsKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3JlbGVhc2VPdXRwdXRCdWZmZXIoQU1lZGlhQ29kZWMqLCBzaXplX3QgaWR4LCBib29sIHJlbmRlcikgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBEeW5hbWljYWxseSBzZXRzIHRoZSBvdXRwdXQgc3VyZmFjZSBvZiBhIGNvZGVjLgpAQCAtMjU0LDcgKzI1Nyw3IEBACiAgKgogICogRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSBKYXZhIGRvY3VtZW50YXRpb24gZm9yIE1lZGlhQ29kZWMuc2V0T3V0cHV0U3VyZmFjZS4KICAqLwotbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc2V0T3V0cHV0U3VyZmFjZShBTWVkaWFDb2RlYyosIEFOYXRpdmVXaW5kb3cqIHN1cmZhY2UpOworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc2V0T3V0cHV0U3VyZmFjZShBTWVkaWFDb2RlYyosIEFOYXRpdmVXaW5kb3cqIHN1cmZhY2UpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogSWYgeW91IGFyZSBkb25lIHdpdGggYSBidWZmZXIsIHVzZSB0aGlzIGNhbGwgdG8gdXBkYXRlIGl0cyBzdXJmYWNlIHRpbWVzdGFtcApAQCAtMjY1LDcgKzI2OCw3IEBACiAgKiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIEphdmEgZG9jdW1lbnRhdGlvbiBmb3IgTWVkaWFDb2RlYy5yZWxlYXNlT3V0cHV0QnVmZmVyLgogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19yZWxlYXNlT3V0cHV0QnVmZmVyQXRUaW1lKAotICAgICAgICBBTWVkaWFDb2RlYyAqbURhdGEsIHNpemVfdCBpZHgsIGludDY0X3QgdGltZXN0YW1wTnMpOworICAgICAgICBBTWVkaWFDb2RlYyAqbURhdGEsIHNpemVfdCBpZHgsIGludDY0X3QgdGltZXN0YW1wTnMpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKICNpZiBfX0FORFJPSURfQVBJX18gPj0gMjYKIApAQCAtMjgxLDcgKzI4NCw3IEBACiAgKiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIEphdmEgZG9jdW1lbnRhdGlvbiBmb3IgTWVkaWFDb2RlYy5jcmVhdGVJbnB1dFN1cmZhY2UuCiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX2NyZWF0ZUlucHV0U3VyZmFjZSgKLSAgICAgICAgQU1lZGlhQ29kZWMgKm1EYXRhLCBBTmF0aXZlV2luZG93ICoqc3VyZmFjZSk7CisgICAgICAgIEFNZWRpYUNvZGVjICptRGF0YSwgQU5hdGl2ZVdpbmRvdyAqKnN1cmZhY2UpIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgogICogQ3JlYXRlcyBhIHBlcnNpc3RlbnQgU3VyZmFjZSB0aGF0IGNhbiBiZSB1c2VkIGFzIHRoZSBpbnB1dCB0byBlbmNvZGVyCkBAIC0yOTcsNyArMzAwLDcgQEAKICAqIEZvciBtb3JlIGRldGFpbHMsIHNlZSB0aGUgSmF2YSBkb2N1bWVudGF0aW9uIGZvciBNZWRpYUNvZGVjLmNyZWF0ZVBlcnNpc3RlbnRJbnB1dFN1cmZhY2UuCiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX2NyZWF0ZVBlcnNpc3RlbnRJbnB1dFN1cmZhY2UoCi0gICAgICAgIEFOYXRpdmVXaW5kb3cgKipzdXJmYWNlKTsKKyAgICAgICAgQU5hdGl2ZVdpbmRvdyAqKnN1cmZhY2UpIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgogICogU2V0IGEgcGVyc2lzdGVudC1zdXJmYWNlIHRoYXQgY2FuIGJlIHVzZWQgYXMgdGhlIGlucHV0IHRvIGVuY29kZXIsIGluIHBsYWNlIG9mIGlucHV0IGJ1ZmZlcnMKQEAgLTMxMCw3ICszMTMsNyBAQAogICogRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSBKYXZhIGRvY3VtZW50YXRpb24gZm9yIE1lZGlhQ29kZWMuc2V0SW5wdXRTdXJmYWNlLgogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19zZXRJbnB1dFN1cmZhY2UoCi0gICAgICAgIEFNZWRpYUNvZGVjICptRGF0YSwgQU5hdGl2ZVdpbmRvdyAqc3VyZmFjZSk7CisgICAgICAgIEFNZWRpYUNvZGVjICptRGF0YSwgQU5hdGl2ZVdpbmRvdyAqc3VyZmFjZSkgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBTaWduYWwgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHRvIHRoZSBjb2RlYyBpbnN0YW5jZS4KQEAgLTMyMSw3ICszMjQsNyBAQAogICogTk9URTogU29tZSBvZiB0aGVzZSBwYXJhbWV0ZXIgY2hhbmdlcyBtYXkgc2lsZW50bHkgZmFpbCB0byBhcHBseS4KICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc2V0UGFyYW1ldGVycygKLSAgICAgICAgQU1lZGlhQ29kZWMgKm1EYXRhLCBjb25zdCBBTWVkaWFGb3JtYXQqIHBhcmFtcyk7CisgICAgICAgIEFNZWRpYUNvZGVjICptRGF0YSwgY29uc3QgQU1lZGlhRm9ybWF0KiBwYXJhbXMpIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgogICogU2lnbmFscyBlbmQtb2Ytc3RyZWFtIG9uIGlucHV0LiBFcXVpdmFsZW50IHRvIHN1Ym1pdHRpbmcgYW4gZW1wdHkgYnVmZmVyIHdpdGgKQEAgLTMzNywyMyArMzQwLDI5IEBACiAgKgogICogRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSBKYXZhIGRvY3VtZW50YXRpb24gZm9yIE1lZGlhQ29kZWMuc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbS4KICAqLwotbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbShBTWVkaWFDb2RlYyAqbURhdGEpOworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbShBTWVkaWFDb2RlYyAqbURhdGEpIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjYgKi8KIAogI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOAogCiAvKioKKyAqIEdldCBmb3JtYXQgb2YgdGhlIGJ1ZmZlci4gVGhlIHNwZWNpZmllZCBidWZmZXIgaW5kZXggbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSBvYnRhaW5lZCBmcm9tCisgKiBkZXF1ZXVlT3V0cHV0QnVmZmVyLgorICovCitBTWVkaWFGb3JtYXQqIEFNZWRpYUNvZGVjX2dldEJ1ZmZlckZvcm1hdChBTWVkaWFDb2RlYyosIHNpemVfdCBpbmRleCkgX19JTlRST0RVQ0VEX0lOKDI4KTsKKworLyoqCiAgKiBHZXQgdGhlIGNvbXBvbmVudCBuYW1lLiBJZiB0aGUgY29kZWMgd2FzIGNyZWF0ZWQgYnkgY3JlYXRlRGVjb2RlckJ5VHlwZQogICogb3IgY3JlYXRlRW5jb2RlckJ5VHlwZSwgd2hhdCBjb21wb25lbnQgaXMgY2hvc2VuIGlzIG5vdCBrbm93biBiZWZvcmVoYW5kLgogICogQ2FsbGVyIHNoYWxsIGNhbGwgQU1lZGlhQ29kZWNfcmVsZWFzZU5hbWUgdG8gZnJlZSB0aGUgcmV0dXJuZWQgcG9pbnRlci4KICAqLwotbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfZ2V0TmFtZShBTWVkaWFDb2RlYyosIGNoYXIqKiBvdXRfbmFtZSk7CittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19nZXROYW1lKEFNZWRpYUNvZGVjKiwgY2hhcioqIG91dF9uYW1lKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCiAvKioKICAqIEZyZWUgdGhlIG1lbW9yeSBwb2ludGVkIGJ5IG5hbWUgd2hpY2ggaXMgcmV0dXJuZWQgYnkgQU1lZGlhQ29kZWNfZ2V0TmFtZS4KICAqLwotdm9pZCBBTWVkaWFDb2RlY19yZWxlYXNlTmFtZShBTWVkaWFDb2RlYyosIGNoYXIqIG5hbWUpOwordm9pZCBBTWVkaWFDb2RlY19yZWxlYXNlTmFtZShBTWVkaWFDb2RlYyosIGNoYXIqIG5hbWUpIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKIC8qKgogICogU2V0IGFuIGFzeW5jaHJvbm91cyBjYWxsYmFjayBmb3IgYWN0aW9uYWJsZSBBTWVkaWFDb2RlYyBldmVudHMuCkBAIC0zNzcsMzIgKzM4NiwzMiBAQAogbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc2V0QXN5bmNOb3RpZnlDYWxsYmFjaygKICAgICAgICAgQU1lZGlhQ29kZWMqLAogICAgICAgICBBTWVkaWFDb2RlY09uQXN5bmNOb3RpZnlDYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgdm9pZCAqdXNlcmRhdGEpOworICAgICAgICB2b2lkICp1c2VyZGF0YSkgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAogLyoqCiAgKiBSZWxlYXNlIHRoZSBjcnlwdG8gaWYgYXBwbGljYWJsZS4KICAqLwotbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcmVsZWFzZUNyeXB0byhBTWVkaWFDb2RlYyopOworbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcmVsZWFzZUNyeXB0byhBTWVkaWFDb2RlYyopIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKIC8qKgogICogQ2FsbCB0aGlzIGFmdGVyIEFNZWRpYUNvZGVjX2NvbmZpZ3VyZSgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5IHRvIGdldCB0aGUgaW5wdXQKICAqIGZvcm1hdCBhY2NlcHRlZCBieSB0aGUgY29kZWMuIERvIHRoaXMgdG8gZGV0ZXJtaW5lIHdoYXQgb3B0aW9uYWwgY29uZmlndXJhdGlvbgogICogcGFyYW1ldGVycyB3ZXJlIHN1cHBvcnRlZCBieSB0aGUgY29kZWMuCiAgKi8KLUFNZWRpYUZvcm1hdCogQU1lZGlhQ29kZWNfZ2V0SW5wdXRGb3JtYXQoQU1lZGlhQ29kZWMqKTsKK0FNZWRpYUZvcm1hdCogQU1lZGlhQ29kZWNfZ2V0SW5wdXRGb3JtYXQoQU1lZGlhQ29kZWMqKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCiAvKioKICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29kZWMgY2Fubm90IHByb2NlZWQgZnVydGhlciwgYnV0IGNhbiBiZSByZWNvdmVyZWQgYnkgc3RvcHBpbmcsCiAgKiBjb25maWd1cmluZywgYW5kIHN0YXJ0aW5nIGFnYWluLgogICovCi1ib29sIEFNZWRpYUNvZGVjQWN0aW9uQ29kZV9pc1JlY292ZXJhYmxlKGludDMyX3QgYWN0aW9uQ29kZSk7Citib29sIEFNZWRpYUNvZGVjQWN0aW9uQ29kZV9pc1JlY292ZXJhYmxlKGludDMyX3QgYWN0aW9uQ29kZSkgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAogLyoqCiAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNvZGVjIGVycm9yIGlzIGEgdHJhbnNpZW50IGlzc3VlLCBwZXJoYXBzIGR1ZSB0bwogICogcmVzb3VyY2UgY29uc3RyYWludHMsIGFuZCB0aGF0IHRoZSBtZXRob2QgKG9yIGVuY29kaW5nL2RlY29kaW5nKSBtYXkgYmUKICAqIHJldHJpZWQgYXQgYSBsYXRlciB0aW1lLgogICovCi1ib29sIEFNZWRpYUNvZGVjQWN0aW9uQ29kZV9pc1RyYW5zaWVudChpbnQzMl90IGFjdGlvbkNvZGUpOworYm9vbCBBTWVkaWFDb2RlY0FjdGlvbkNvZGVfaXNUcmFuc2llbnQoaW50MzJfdCBhY3Rpb25Db2RlKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI4ICovCiAKQEAgLTQzOCw1NCArNDQ3LDU2IEBACiAgICAgICAgIHVpbnQ4X3QgaXZbMTZdLAogICAgICAgICBjcnlwdG9pbmZvX21vZGVfdCBtb2RlLAogICAgICAgICBzaXplX3QgKmNsZWFyYnl0ZXMsCi0gICAgICAgIHNpemVfdCAqZW5jcnlwdGVkYnl0ZXMpOworICAgICAgICBzaXplX3QgKmVuY3J5cHRlZGJ5dGVzKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIGRlbGV0ZSBhbiBBTWVkaWFDb2RlY0NyeXB0b0luZm8gY3JlYXRlZCBwcmV2aW91c2x5IHdpdGggQU1lZGlhQ29kZWNDcnlwdG9JbmZvX25ldywgb3IKICAqIG9idGFpbmVkIGZyb20gQU1lZGlhRXh0cmFjdG9yCiAgKi8KLW1lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19kZWxldGUoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKik7CittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZGVsZXRlKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyopIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogU2V0IHRoZSBjcnlwdG8gcGF0dGVybiBvbiBhbiBBTWVkaWFDcnlwdG9JbmZvIG9iamVjdAogICovCiB2b2lkIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19zZXRQYXR0ZXJuKAogICAgICAgICBBTWVkaWFDb2RlY0NyeXB0b0luZm8gKmluZm8sCi0gICAgICAgIGNyeXB0b2luZm9fcGF0dGVybl90ICpwYXR0ZXJuKTsKKyAgICAgICAgY3J5cHRvaW5mb19wYXR0ZXJuX3QgKnBhdHRlcm4pIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogVGhlIG51bWJlciBvZiBzdWJzYW1wbGVzIHRoYXQgbWFrZSB1cCB0aGUgYnVmZmVyJ3MgY29udGVudHMuCiAgKi8KLXNpemVfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0TnVtU3ViU2FtcGxlcyhBTWVkaWFDb2RlY0NyeXB0b0luZm8qKTsKK3NpemVfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0TnVtU3ViU2FtcGxlcyhBTWVkaWFDb2RlY0NyeXB0b0luZm8qKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIEEgMTYtYnl0ZSBvcGFxdWUga2V5CiAgKi8KLW1lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXRLZXkoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiwgdWludDhfdCAqZHN0KTsKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXRLZXkoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiwgdWludDhfdCAqZHN0KSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIEEgMTYtYnl0ZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IKICAqLwotbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldElWKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyosIHVpbnQ4X3QgKmRzdCk7CittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0SVYoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiwgdWludDhfdCAqZHN0KSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIFRoZSB0eXBlIG9mIGVuY3J5cHRpb24gdGhhdCBoYXMgYmVlbiBhcHBsaWVkLAogICogb25lIG9mIEFNRURJQUNPREVDUllQVE9JTkZPX01PREVfQ0xFQVIgb3IgQU1FRElBQ09ERUNSWVBUT0lORk9fTU9ERV9BRVNfQ1RSLgogICovCi1jcnlwdG9pbmZvX21vZGVfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0TW9kZShBTWVkaWFDb2RlY0NyeXB0b0luZm8qKTsKK2NyeXB0b2luZm9fbW9kZV90IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXRNb2RlKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyopIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogVGhlIG51bWJlciBvZiBsZWFkaW5nIHVuZW5jcnlwdGVkIGJ5dGVzIGluIGVhY2ggc3Vic2FtcGxlLgogICovCi1tZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0Q2xlYXJCeXRlcyhBTWVkaWFDb2RlY0NyeXB0b0luZm8qLCBzaXplX3QgKmRzdCk7CittZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0Q2xlYXJCeXRlcyhBTWVkaWFDb2RlY0NyeXB0b0luZm8qLCBzaXplX3QgKmRzdCkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBUaGUgbnVtYmVyIG9mIHRyYWlsaW5nIGVuY3J5cHRlZCBieXRlcyBpbiBlYWNoIHN1YnNhbXBsZS4KICAqLwotbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldEVuY3J5cHRlZEJ5dGVzKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyosIHNpemVfdCAqZHN0KTsKK21lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXRFbmNyeXB0ZWRCeXRlcyhBTWVkaWFDb2RlY0NyeXB0b0luZm8qLCBzaXplX3QgKmRzdCkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyMSAqLwogCiBfX0VORF9ERUNMUwogCiAjZW5kaWYgLy9fTkRLX01FRElBX0NPREVDX0gKKworLyoqIEB9ICovCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUNyeXB0by5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDcnlwdG8uaAppbmRleCBkMzFkYmRjLi5iY2RmOWEwIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUNyeXB0by5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ3J5cHRvLmgKQEAgLTE0LDYgKzE0LDE0IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisvKioKKyAqIEBhZGR0b2dyb3VwIE1lZGlhCisgKiBAeworICovCisKKy8qKgorICogQGZpbGUgTmRrTWVkaWFDcnlwdG8uaAorICovCiAKIC8qCiAgKiBUaGlzIGZpbGUgZGVmaW5lcyBhbiBOREsgQVBJLgpAQCAtNDEsMTYgKzQ5LDE4IEBACiAKICNpZiBfX0FORFJPSURfQVBJX18gPj0gMjEKIAotYm9vbCBBTWVkaWFDcnlwdG9faXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgQU1lZGlhVVVJRCB1dWlkKTsKK2Jvb2wgQU1lZGlhQ3J5cHRvX2lzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IEFNZWRpYVVVSUQgdXVpZCkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAotYm9vbCBBTWVkaWFDcnlwdG9fcmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KGNvbnN0IGNoYXIgKm1pbWUpOworYm9vbCBBTWVkaWFDcnlwdG9fcmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KGNvbnN0IGNoYXIgKm1pbWUpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKLUFNZWRpYUNyeXB0byogQU1lZGlhQ3J5cHRvX25ldyhjb25zdCBBTWVkaWFVVUlEIHV1aWQsIGNvbnN0IHZvaWQgKmluaXREYXRhLCBzaXplX3QgaW5pdERhdGFTaXplKTsKK0FNZWRpYUNyeXB0byogQU1lZGlhQ3J5cHRvX25ldyhjb25zdCBBTWVkaWFVVUlEIHV1aWQsIGNvbnN0IHZvaWQgKmluaXREYXRhLCBzaXplX3QgaW5pdERhdGFTaXplKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCi12b2lkIEFNZWRpYUNyeXB0b19kZWxldGUoQU1lZGlhQ3J5cHRvKiBjcnlwdG8pOwordm9pZCBBTWVkaWFDcnlwdG9fZGVsZXRlKEFNZWRpYUNyeXB0byogY3J5cHRvKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDIxICovCiAKIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvLyBfTkRLX01FRElBX0NSWVBUT19ICisKKy8qKiBAfSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFEYXRhU291cmNlLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaAppbmRleCA5ZTJlMzUxLi4xNmIxZWIzIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaApAQCAtNDMsMTQgKzQzLDkgQEAKIC8qCiAgKiBBTWVkaWFEYXRhU291cmNlJ3MgY2FsbGJhY2tzIHdpbGwgYmUgaW52b2tlZCBvbiBhbiBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkIHRocmVhZAogICogb3IgdGhyZWFkIHBvb2wuIE5vIGd1YXJhbnRlZXMgYXJlIHByb3ZpZGVkIGFib3V0IHdoaWNoIHRocmVhZChzKSB3aWxsIGJlIHVzZWQgZm9yCi0gKiBjYWxsYmFja3MuIEhvd2V2ZXIsIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCBBTWVkaWFEYXRhU291cmNlJ3MgY2FsbGJhY2tzIHdpbGwgb25seQotICogZXZlciBiZSBpbnZva2VkIGJ5IGEgc2luZ2xlIHRocmVhZCBhdCBhIHRpbWUuCi0gKgotICogVGhlcmUgd2lsbCBiZSBhIHRocmVhZCBzeW5jaHJvbml6YXRpb24gcG9pbnQgYmV0d2VlbiBlYWNoIGNhbGwgdG8gZW5zdXJlIHRoYXQKLSAqIG1vZGlmaWNhdGlvbnMgdG8gdGhlIHN0YXRlIG9mIHlvdXIgQU1lZGlhRGF0YVNvdXJjZSBhcmUgdmlzaWJsZSB0byBmdXR1cmUKLSAqIGNhbGxzLiBUaGlzIG1lYW5zIHlvdSBkb24ndCBuZWVkIHRvIGRvIHlvdXIgb3duIHN5bmNocm9uaXphdGlvbiB1bmxlc3MgeW91J3JlCi0gKiBtb2RpZnlpbmcgdGhlIEFNZWRpYURhdGFTb3VyY2UgZnJvbSBhbm90aGVyIHRocmVhZCB3aGlsZSBpdCdzIGJlaW5nIHVzZWQgYnkgdGhlCi0gKiBmcmFtZXdvcmsuCisgKiBjYWxsYmFja3MuIEZvciBleGFtcGxlLCB8Y2xvc2V8IGNhbiBiZSBpbnZva2VkIGZyb20gYSBkaWZmZXJlbnQgdGhyZWFkIHRoYW4gdGhlCisgKiB0aHJlYWQgaW52b2tpbmcgfHJlYWRBdHwuIEFzIHN1Y2gsIHRoZSBJbXBsZW1lbnRhdGlvbnMgb2YgQU1lZGlhRGF0YVNvdXJjZSBjYWxsYmFja3MKKyAqIG11c3QgYmUgdGhyZWFkc2FmZS4KICAqLwogCiAvKioKQEAgLTc0LDkgKzY5LDE5IEBACiB0eXBlZGVmIHNzaXplX3QgKCpBTWVkaWFEYXRhU291cmNlR2V0U2l6ZSkodm9pZCAqdXNlcmRhdGEpOwogCiAvKioKLSAqIENhbGxlZCB0byBjbG9zZSB0aGUgZGF0YSBzb3VyY2UgYW5kIHJlbGVhc2UgYXNzb2NpYXRlZCByZXNvdXJjZXMuCi0gKiBUaGUgTkRLIG1lZGlhIGZyYW1ld29yayBndWFyYW50ZWVzIHRoYXQgYWZ0ZXIgfGNsb3NlfCBpcyBjYWxsZWQKLSAqIG5vIGZ1dHVyZSBjYWxsYmFja3Mgd2lsbCBiZSBpbnZva2VkIG9uIHRoZSBkYXRhIHNvdXJjZS4KKyAqIENhbGxlZCB0byBjbG9zZSB0aGUgZGF0YSBzb3VyY2UsIHVuYmxvY2sgcmVhZHMsIGFuZCByZWxlYXNlIGFzc29jaWF0ZWQKKyAqIHJlc291cmNlcy4KKyAqCisgKiBUaGUgTkRLIG1lZGlhIGZyYW1ld29yayBndWFyYW50ZWVzIHRoYXQgYWZ0ZXIgdGhlIGZpcnN0IHxjbG9zZXwgaXMKKyAqIGNhbGxlZCwgbm8gZnV0dXJlIGNhbGxiYWNrcyB3aWxsIGJlIGludm9rZWQgb24gdGhlIGRhdGEgc291cmNlIGV4Y2VwdAorICogZm9yIHxjbG9zZXwgaXRzZWxmLgorICoKKyAqIENsb3NpbmcgYSBkYXRhIHNvdXJjZSBhbGxvd3MgcmVhZEF0IGNhbGxzIHRoYXQgd2VyZSBibG9ja2VkIHdhaXRpbmcKKyAqIGZvciBJL08gZGF0YSB0byByZXR1cm4gcHJvbXB0bHkuCisgKgorICogV2hlbiB1c2luZyBBTWVkaWFEYXRhU291cmNlIGFzIGlucHV0IHRvIEFNZWRpYUV4dHJhY3RvciwgY2xvc2luZworICogaGFzIHRoZSBlZmZlY3Qgb2YgdW5ibG9ja2luZyBzbG93IHJlYWRzIGluc2lkZSBvZiBzZXREYXRhU291cmNlCisgKiBhbmQgcmVhZFNhbXBsZURhdGEuCiAgKi8KIHR5cGVkZWYgdm9pZCAoKkFNZWRpYURhdGFTb3VyY2VDbG9zZSkodm9pZCAqdXNlcmRhdGEpOwogCkBAIC04NCwxOSArODksNTEgQEAKICAqIENyZWF0ZSBuZXcgbWVkaWEgZGF0YSBzb3VyY2UuIFJldHVybnMgTlVMTCBpZiBtZW1vcnkgYWxsb2NhdGlvbgogICogZm9yIHRoZSBuZXcgZGF0YSBzb3VyY2Ugb2JqZWN0IGZhaWxzLgogICovCi1BTWVkaWFEYXRhU291cmNlKiBBTWVkaWFEYXRhU291cmNlX25ldygpOworQU1lZGlhRGF0YVNvdXJjZSogQU1lZGlhRGF0YVNvdXJjZV9uZXcoKSBfX0lOVFJPRFVDRURfSU4oMjgpOworCisjaWYgX19BTkRST0lEX0FQSV9fID49IDI5CisKKy8qKgorICogQ2FsbGVkIHRvIGdldCBhbiBlc3RpbWF0ZSBvZiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY2FuIGJlIHJlYWQgZnJvbSB0aGlzIGRhdGEgc291cmNlCisgKiBzdGFydGluZyBhdCB8b2Zmc2V0fCB3aXRob3V0IGJsb2NraW5nIGZvciBJL08uCisgKgorICogUmV0dXJuIC0xIHdoZW4gc3VjaCBhbiBlc3RpbWF0ZSBpcyBub3QgcG9zc2libGUuCisgKi8KK3R5cGVkZWYgc3NpemVfdCAoKkFNZWRpYURhdGFTb3VyY2VHZXRBdmFpbGFibGVTaXplKSh2b2lkICp1c2VyZGF0YSwgb2ZmNjRfdCBvZmZzZXQpOworCisvKioKKyAqIENyZWF0ZSBuZXcgbWVkaWEgZGF0YSBzb3VyY2UuIFJldHVybnMgTlVMTCBpZiBtZW1vcnkgYWxsb2NhdGlvbgorICogZm9yIHRoZSBuZXcgZGF0YSBzb3VyY2Ugb2JqZWN0IGZhaWxzLgorICoKKyAqIFNldCB0aGUgfHVyaXwgZnJvbSB3aGljaCB0aGUgZGF0YSBzb3VyY2Ugd2lsbCByZWFkLAorICogcGx1cyBhZGRpdGlvbmFsIGh0dHAgaGVhZGVycyB3aGVuIGluaXRpYXRpbmcgdGhlIHJlcXVlc3QuCisgKgorICogSGVhZGVycyB3aWxsIGNvbnRhaW4gY29ycmVzcG9uZGluZyBpdGVtcyBmcm9tIHxrZXlfdmFsdWVzfAorICogaW4gdGhlIGZvbGxvd2luZyBmYXNoaW9uOgorICoKKyAqIGtleV92YWx1ZXNbMF06a2V5X3ZhbHVlc1sxXQorICoga2V5X3ZhbHVlc1syXTprZXlfdmFsdWVzWzNdCisgKiAuLi4KKyAqIGtleV92YWx1ZXNbKG51bWhlYWRlcnMgLSAxKSAqIDJdOmtleV92YWx1ZXNbKG51bWhlYWRlcnMgLSAxKSAqIDIgKyAxXQorICoKKyAqLworQU1lZGlhRGF0YVNvdXJjZSogQU1lZGlhRGF0YVNvdXJjZV9uZXdVcmkoY29uc3QgY2hhciAqdXJpLAorICAgICAgICBpbnQgbnVtaGVhZGVycywKKyAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0ICprZXlfdmFsdWVzKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisjZW5kaWYgIC8qX19BTkRST0lEX0FQSV9fID49IDI5ICovCiAKIC8qKgogICogRGVsZXRlIGEgcHJldmlvdXNseSBjcmVhdGVkIG1lZGlhIGRhdGEgc291cmNlLgogICovCi12b2lkIEFNZWRpYURhdGFTb3VyY2VfZGVsZXRlKEFNZWRpYURhdGFTb3VyY2UqKTsKK3ZvaWQgQU1lZGlhRGF0YVNvdXJjZV9kZWxldGUoQU1lZGlhRGF0YVNvdXJjZSopIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKIC8qKgogICogU2V0IGFuIHVzZXIgcHJvdmlkZWQgb3BhcXVlIGhhbmRsZS4gVGhpcyBvcGFxdWUgaGFuZGxlIGlzIHBhc3NlZCBhcwogICogdGhlIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBkYXRhIHNvdXJjZSBjYWxsYmFja3MuCiAgKi8KIHZvaWQgQU1lZGlhRGF0YVNvdXJjZV9zZXRVc2VyZGF0YSgKLSAgICAgICAgQU1lZGlhRGF0YVNvdXJjZSosIHZvaWQgKnVzZXJkYXRhKTsKKyAgICAgICAgQU1lZGlhRGF0YVNvdXJjZSosIHZvaWQgKnVzZXJkYXRhKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCiAvKioKICAqIFNldCBhIGN1c3RvbSBjYWxsYmFjayBmb3Igc3VwcGx5aW5nIHJhbmRvbSBhY2Nlc3MgbWVkaWEgZGF0YSB0byB0aGUKQEAgLTExMSw3ICsxNDgsNyBAQAogICovCiB2b2lkIEFNZWRpYURhdGFTb3VyY2Vfc2V0UmVhZEF0KAogICAgICAgICBBTWVkaWFEYXRhU291cmNlKiwKLSAgICAgICAgQU1lZGlhRGF0YVNvdXJjZVJlYWRBdCk7CisgICAgICAgIEFNZWRpYURhdGFTb3VyY2VSZWFkQXQpIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKIC8qKgogICogU2V0IGEgY3VzdG9tIGNhbGxiYWNrIGZvciBzdXBwbHlpbmcgdGhlIHNpemUgb2YgdGhlIGRhdGEgc291cmNlIHRvIHRoZQpAQCAtMTIyLDcgKzE1OSw3IEBACiAgKi8KIHZvaWQgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRTaXplKAogICAgICAgICBBTWVkaWFEYXRhU291cmNlKiwKLSAgICAgICAgQU1lZGlhRGF0YVNvdXJjZUdldFNpemUpOworICAgICAgICBBTWVkaWFEYXRhU291cmNlR2V0U2l6ZSkgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAogLyoqCiAgKiBTZXQgYSBjdXN0b20gY2FsbGJhY2sgdG8gcmVjZWl2ZSBzaWduYWwgZnJvbSB0aGUgTkRLIG1lZGlhIGZyYW1ld29yawpAQCAtMTMzLDEwICsxNzAsMzQgQEAKICAqLwogdm9pZCBBTWVkaWFEYXRhU291cmNlX3NldENsb3NlKAogICAgICAgICBBTWVkaWFEYXRhU291cmNlKiwKLSAgICAgICAgQU1lZGlhRGF0YVNvdXJjZUNsb3NlKTsKKyAgICAgICAgQU1lZGlhRGF0YVNvdXJjZUNsb3NlKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCiAjZW5kaWYgIC8qX19BTkRST0lEX0FQSV9fID49IDI4ICovCiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjkKKworLyoqCisgKiBDbG9zZSB0aGUgZGF0YSBzb3VyY2UsIHVuYmxvY2sgcmVhZHMsIGFuZCByZWxlYXNlIGFzc29jaWF0ZWQgcmVzb3VyY2VzLgorICoKKyAqIFBsZWFzZSByZWZlciB0byB0aGUgZGVmaW5pdGlvbiBvZiBBTWVkaWFEYXRhU291cmNlQ2xvc2UgZm9yCisgKiBhZGRpdGlvbmFsIGRldGFpbHMuCisgKi8KK3ZvaWQgQU1lZGlhRGF0YVNvdXJjZV9jbG9zZShBTWVkaWFEYXRhU291cmNlKikgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCisgKiBTZXQgYSBjdXN0b20gY2FsbGJhY2sgZm9yIHN1cHBseWluZyB0aGUgZXN0aW1hdGVkIG51bWJlciBvZiBieXRlcworICogdGhhdCBjYW4gYmUgcmVhZCBmcm9tIHRoaXMgZGF0YSBzb3VyY2Ugc3RhcnRpbmcgYXQgYW4gb2Zmc2V0IHdpdGhvdXQKKyAqIGJsb2NraW5nIGZvciBJL08uCisgKgorICogUGxlYXNlIHJlZmVyIHRvIHRoZSBkZWZpbml0aW9uIG9mIEFNZWRpYURhdGFTb3VyY2VHZXRBdmFpbGFibGVTaXplCisgKiBmb3IgYWRkaXRpb25hbCBkZXRhaWxzLgorICovCit2b2lkIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0QXZhaWxhYmxlU2l6ZSgKKyAgICAgICAgQU1lZGlhRGF0YVNvdXJjZSosCisgICAgICAgIEFNZWRpYURhdGFTb3VyY2VHZXRBdmFpbGFibGVTaXplKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisjZW5kaWYgIC8qX19BTkRST0lEX0FQSV9fID49IDI5ICovCisKIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvLyBfTkRLX01FRElBX0RBVEFTT1VSQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFEcm0uaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRHJtLmgKaW5kZXggOWU5ZjRjMy4uMmU0MzhkOSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFEcm0uaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURybS5oCkBAIC0xNCw2ICsxNCwxNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorLyoqCisgKiBAYWRkdG9ncm91cCBNZWRpYQorICogQHsKKyAqLworCisvKioKKyAqIEBmaWxlIE5ka01lZGlhRHJtLmgKKyAqLworCiAvKgogICogVGhpcyBmaWxlIGRlZmluZXMgYW4gTkRLIEFQSS4KICAqIERvIG5vdCByZW1vdmUgbWV0aG9kcy4KQEAgLTQ3LDYgKzU2LDcgQEAKIHR5cGVkZWYgQU1lZGlhRHJtQnl0ZUFycmF5IEFNZWRpYURybVNjb3BlOwogdHlwZWRlZiBBTWVkaWFEcm1CeXRlQXJyYXkgQU1lZGlhRHJtS2V5U2V0SWQ7CiB0eXBlZGVmIEFNZWRpYURybUJ5dGVBcnJheSBBTWVkaWFEcm1TZWN1cmVTdG9wOwordHlwZWRlZiBBTWVkaWFEcm1CeXRlQXJyYXkgQU1lZGlhRHJtS2V5SWQ7CiAKIHR5cGVkZWYgZW51bSBBTWVkaWFEcm1FdmVudFR5cGUgewogICAgIC8qKgpAQCAtNzIsNTkgKzgyLDE4IEBACiAgICAgICogVGhpcyBldmVudCBtYXkgaW5kaWNhdGUgc29tZSBzcGVjaWZpYyB2ZW5kb3ItZGVmaW5lZCBjb25kaXRpb24sIHNlZSB5b3VyCiAgICAgICogRFJNIHByb3ZpZGVyIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMKICAgICAgKi8KLSAgICBFVkVOVF9WRU5ET1JfREVGSU5FRCA9IDQKKyAgICBFVkVOVF9WRU5ET1JfREVGSU5FRCA9IDQsCisKKyAgICAvKioKKyAgICAgKiBUaGlzIGV2ZW50IGluZGljYXRlcyB0aGF0IGEgc2Vzc2lvbiBvcGVuZWQgYnkgdGhlIGFwcCBoYXMgYmVlbiByZWNsYWltZWQKKyAgICAgKiBieSB0aGUgcmVzb3VyY2UgbWFuYWdlci4KKyAgICAgKi8KKyAgICBFVkVOVF9TRVNTSU9OX1JFQ0xBSU1FRCA9IDUsCiB9IEFNZWRpYURybUV2ZW50VHlwZTsKIAotdHlwZWRlZiB2b2lkICgqQU1lZGlhRHJtRXZlbnRMaXN0ZW5lcikoQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLAotICAgICAgICBBTWVkaWFEcm1FdmVudFR5cGUgZXZlbnRUeXBlLCBpbnQgZXh0cmEsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBkYXRhU2l6ZSk7Ci0KLSNpZiBfX0FORFJPSURfQVBJX18gPj0gMjEKLQotLyoqCi0gKiBRdWVyeSBpZiB0aGUgZ2l2ZW4gc2NoZW1lIGlkZW50aWZpZWQgYnkgaXRzIFVVSUQgaXMgc3VwcG9ydGVkIG9uIHRoaXMgZGV2aWNlLCBhbmQKLSAqIHdoZXRoZXIgdGhlIGRybSBwbHVnaW4gaXMgYWJsZSB0byBoYW5kbGUgdGhlIG1lZGlhIGNvbnRhaW5lciBmb3JtYXQgc3BlY2lmaWVkIGJ5IG1pbWVUeXBlLgotICoKLSAqIHV1aWQgaWRlbnRpZmllcyB0aGUgdW5pdmVyc2FsIHVuaXF1ZSBJRCBvZiB0aGUgY3J5cHRvIHNjaGVtZS4gdXVpZCBtdXN0IGJlIDE2IGJ5dGVzLgotICogbWltZVR5cGUgaXMgdGhlIE1JTUUgdHlwZSBvZiB0aGUgbWVkaWEgY29udGFpbmVyLCBlLmcuICJ2aWRlby9tcDQiLiAgSWYgbWltZVR5cGUKLSAqIGlzIG5vdCBrbm93biBvciByZXF1aXJlZCwgaXQgY2FuIGJlIHByb3ZpZGVkIGFzIE5VTEwuCi0gKi8KLWJvb2wgQU1lZGlhRHJtX2lzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgKnV1aWQsIGNvbnN0IGNoYXIgKm1pbWVUeXBlKTsKLQotLyoqCi0gKiBDcmVhdGUgYSBNZWRpYURybSBpbnN0YW5jZSBmcm9tIGEgVVVJRAotICogdXVpZCBpZGVudGlmaWVzIHRoZSB1bml2ZXJzYWwgdW5pcXVlIElEIG9mIHRoZSBjcnlwdG8gc2NoZW1lLiB1dWlkIG11c3QgYmUgMTYgYnl0ZXMuCi0gKi8KLUFNZWRpYURybSogQU1lZGlhRHJtX2NyZWF0ZUJ5VVVJRChjb25zdCB1aW50OF90ICp1dWlkKTsKLQotLyoqCi0gKiBSZWxlYXNlIGEgTWVkaWFEcm0gb2JqZWN0Ci0gKi8KLXZvaWQgQU1lZGlhRHJtX3JlbGVhc2UoQU1lZGlhRHJtICopOwotCi0vKioKLSAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIGFuIGV2ZW50IG9jY3VycwotICoKLSAqIGxpc3RlbmVyIGlzIHRoZSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgaW52b2tlZCBvbiBldmVudAotICovCi1tZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fc2V0T25FdmVudExpc3RlbmVyKEFNZWRpYURybSAqLCBBTWVkaWFEcm1FdmVudExpc3RlbmVyIGxpc3RlbmVyKTsKLQotLyoqCi0gKiBPcGVuIGEgbmV3IHNlc3Npb24gd2l0aCB0aGUgTWVkaWFEcm0gb2JqZWN0LiAgQSBzZXNzaW9uIElEIGlzIHJldHVybmVkLgotICoKLSAqIHJldHVybnMgTUVESUFEUk1fTk9UX1BST1ZJU0lPTkVEX0VSUk9SIGlmIHByb3Zpc2lvbmluZyBpcyBuZWVkZWQKLSAqIHJldHVybnMgTUVESUFEUk1fUkVTT1VSQ0VfQlVTWV9FUlJPUiBpZiByZXF1aXJlZCByZXNvdXJjZXMgYXJlIGluIHVzZQotICovCi1tZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fb3BlblNlc3Npb24oQU1lZGlhRHJtICosIEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkKTsKLQotLyoqCi0gKiBDbG9zZSBhIHNlc3Npb24gb24gdGhlIE1lZGlhRHJtIG9iamVjdCB0aGF0IHdhcyBwcmV2aW91c2x5IG9wZW5lZAotICogd2l0aCBBTWVkaWFEcm1fb3BlblNlc3Npb24uCi0gKi8KLW1lZGlhX3N0YXR1c190IEFNZWRpYURybV9jbG9zZVNlc3Npb24oQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkKTsKLQogdHlwZWRlZiBlbnVtIEFNZWRpYURybUtleVR5cGUgewogICAgIC8qKgotICAgICAqIFRoaXMga2V5IHJlcXVlc3QgdHlwZSBzcGVjaWVzIHRoYXQgdGhlIGtleXMgd2lsbCBiZSBmb3Igb25saW5lIHVzZSwgdGhleSB3aWxsCisgICAgICogVGhpcyBrZXkgcmVxdWVzdCB0eXBlIHNwZWNpZmllcyB0aGF0IHRoZSBrZXlzIHdpbGwgYmUgZm9yIG9ubGluZSB1c2UsIHRoZXkgd2lsbAogICAgICAqIG5vdCBiZSBzYXZlZCB0byB0aGUgZGV2aWNlIGZvciBzdWJzZXF1ZW50IHVzZSB3aGVuIHRoZSBkZXZpY2UgaXMgbm90IGNvbm5lY3RlZAogICAgICAqIHRvIGEgbmV0d29yay4KICAgICAgKi8KQEAgLTE1MCw2ICsxMTksMTE2IEBACiAgICAgY29uc3QgY2hhciAqbVZhbHVlOwogfSBBTWVkaWFEcm1LZXlWYWx1ZTsKIAordHlwZWRlZiBlbnVtIEFNZWRpYUtleVN0YXR1c1R5cGUgeworICAgIC8qKgorICAgICAqIFRoZSBrZXkgaXMgY3VycmVudGx5IHVzYWJsZSB0byBkZWNyeXB0IG1lZGlhIGRhdGEuCisgICAgICovCisgICAgS0VZX1NUQVRVU19UWVBFX1VTQUJMRSwKKworICAgIC8qKgorICAgICAqIFRoZSBrZXkgaXMgbm8gbG9uZ2VyIHVzYWJsZSB0byBkZWNyeXB0IG1lZGlhIGRhdGEgYmVjYXVzZSBpdHMgZXhwaXJhdGlvbgorICAgICAqIHRpbWUgaGFzIHBhc3NlZC4KKyAgICAgKi8KKyAgICBLRVlfU1RBVFVTX1RZUEVfRVhQSVJFRCwKKworICAgIC8qKgorICAgICAqIFRoZSBrZXkgaXMgbm90IGN1cnJlbnRseSB1c2FibGUgdG8gZGVjcnlwdCBtZWRpYSBkYXRhIGJlY2F1c2UgaXRzIG91dHB1dAorICAgICAqIHJlcXVpcmVtZW50cyBjYW5ub3QgY3VycmVudGx5IGJlIG1ldC4KKyAgICAgKi8KKyAgICBLRVlfU1RBVFVTX1RZUEVfT1VUUFVUTk9UQUxMT1dFRCwKKworICAgIC8qKgorICAgICAqIFRoZSBzdGF0dXMgb2YgdGhlIGtleSBpcyBub3QgeWV0IGtub3duIGFuZCBpcyBiZWluZyBkZXRlcm1pbmVkLgorICAgICAqLworICAgIEtFWV9TVEFUVVNfVFlQRV9TVEFUVVNQRU5ESU5HLAorCisgICAgLyoqCisgICAgICogVGhlIGtleSBpcyBub3QgY3VycmVudGx5IHVzYWJsZSB0byBkZWNyeXB0IG1lZGlhIGRhdGEgYmVjYXVzZSBvZiBhbgorICAgICAqIGludGVybmFsIGVycm9yIGluIHByb2Nlc3NpbmcgdW5yZWxhdGVkIHRvIGlucHV0IHBhcmFtZXRlcnMuCisgICAgICovCisgICAgS0VZX1NUQVRVU19UWVBFX0lOVEVSTkFMRVJST1IsCisKK30gQU1lZGlhRHJtS2V5U3RhdHVzVHlwZTsKKwordHlwZWRlZiBzdHJ1Y3QgQU1lZGlhRHJtS2V5U3RhdHVzIHsKKyAgICBBTWVkaWFEcm1LZXlJZCBrZXlJZDsKKyAgICBBTWVkaWFEcm1LZXlTdGF0dXNUeXBlIGtleVR5cGU7Cit9IEFNZWRpYURybUtleVN0YXR1czsKKwordHlwZWRlZiB2b2lkICgqQU1lZGlhRHJtRXZlbnRMaXN0ZW5lcikoQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLAorICAgICAgICBBTWVkaWFEcm1FdmVudFR5cGUgZXZlbnRUeXBlLCBpbnQgZXh0cmEsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBkYXRhU2l6ZSk7CisKK3R5cGVkZWYgdm9pZCAoKkFNZWRpYURybUV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lcikoQU1lZGlhRHJtICosCisgICAgICAgIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLCBpbnQ2NF90IGV4cGlyeVRpbWVJbk1TKTsKKwordHlwZWRlZiB2b2lkICgqQU1lZGlhRHJtS2V5c0NoYW5nZUxpc3RlbmVyKShBTWVkaWFEcm0gKiwKKyAgICAgICAgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsIGNvbnN0IEFNZWRpYURybUtleVN0YXR1cyAqa2V5U3RhdHVzLAorICAgICAgICBzaXplX3QgbnVtS2V5cywgYm9vbCBoYXNOZXdVc2FibGVLZXkpOworCisjaWYgX19BTkRST0lEX0FQSV9fID49IDIxCisKKy8qKgorICogUXVlcnkgaWYgdGhlIGdpdmVuIHNjaGVtZSBpZGVudGlmaWVkIGJ5IGl0cyBVVUlEIGlzIHN1cHBvcnRlZCBvbiB0aGlzIGRldmljZSwgYW5kCisgKiB3aGV0aGVyIHRoZSBkcm0gcGx1Z2luIGlzIGFibGUgdG8gaGFuZGxlIHRoZSBtZWRpYSBjb250YWluZXIgZm9ybWF0IHNwZWNpZmllZCBieSBtaW1lVHlwZS4KKyAqCisgKiB1dWlkIGlkZW50aWZpZXMgdGhlIHVuaXZlcnNhbCB1bmlxdWUgSUQgb2YgdGhlIGNyeXB0byBzY2hlbWUuIHV1aWQgbXVzdCBiZSAxNiBieXRlcy4KKyAqIG1pbWVUeXBlIGlzIHRoZSBNSU1FIHR5cGUgb2YgdGhlIG1lZGlhIGNvbnRhaW5lciwgZS5nLiAidmlkZW8vbXA0Ii4gIElmIG1pbWVUeXBlCisgKiBpcyBub3Qga25vd24gb3IgcmVxdWlyZWQsIGl0IGNhbiBiZSBwcm92aWRlZCBhcyBOVUxMLgorICovCitib29sIEFNZWRpYURybV9pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90ICp1dWlkLAorICAgICAgICBjb25zdCBjaGFyICptaW1lVHlwZSkgX19JTlRST0RVQ0VEX0lOKDIxKTsKKworLyoqCisgKiBDcmVhdGUgYSBNZWRpYURybSBpbnN0YW5jZSBmcm9tIGEgVVVJRAorICogdXVpZCBpZGVudGlmaWVzIHRoZSB1bml2ZXJzYWwgdW5pcXVlIElEIG9mIHRoZSBjcnlwdG8gc2NoZW1lLiB1dWlkIG11c3QgYmUgMTYgYnl0ZXMuCisgKi8KK0FNZWRpYURybSogQU1lZGlhRHJtX2NyZWF0ZUJ5VVVJRChjb25zdCB1aW50OF90ICp1dWlkKSBfX0lOVFJPRFVDRURfSU4oMjEpOworCisvKioKKyAqIFJlbGVhc2UgYSBNZWRpYURybSBvYmplY3QKKyAqLwordm9pZCBBTWVkaWFEcm1fcmVsZWFzZShBTWVkaWFEcm0gKikgX19JTlRST0RVQ0VEX0lOKDIxKTsKKworLyoqCisgKiBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiBhbiBldmVudCBvY2N1cnMKKyAqCisgKiBsaXN0ZW5lciBpcyB0aGUgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGludm9rZWQgb24gZXZlbnQKKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3NldE9uRXZlbnRMaXN0ZW5lcihBTWVkaWFEcm0gKiwKKyAgICAgICAgQU1lZGlhRHJtRXZlbnRMaXN0ZW5lciBsaXN0ZW5lcikgX19JTlRST0RVQ0VEX0lOKDIxKTsKKworLyoqCisgKiBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiBhbiBleHBpcmF0aW9uIHVwZGF0ZSBldmVudCBvY2N1cnMKKyAqCisgKiBsaXN0ZW5lciBpcyB0aGUgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGludm9rZWQgb24gZXZlbnQKKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3NldE9uRXhwaXJhdGlvblVwZGF0ZUxpc3RlbmVyKEFNZWRpYURybSAqLAorICAgICAgICBBTWVkaWFEcm1FeHBpcmF0aW9uVXBkYXRlTGlzdGVuZXIgbGlzdGVuZXIpIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKy8qKgorICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gYSBrZXkgc3RhdHVzIGNoYW5nZSBldmVudCBvY2N1cnMKKyAqCisgKiBsaXN0ZW5lciBpcyB0aGUgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGludm9rZWQgb24gZXZlbnQKKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3NldE9uS2V5c0NoYW5nZUxpc3RlbmVyKEFNZWRpYURybSAqLAorICAgICAgICBBTWVkaWFEcm1LZXlzQ2hhbmdlTGlzdGVuZXIgbGlzdGVuZXIpIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKy8qKgorICogT3BlbiBhIG5ldyBzZXNzaW9uIHdpdGggdGhlIE1lZGlhRHJtIG9iamVjdC4gIEEgc2Vzc2lvbiBJRCBpcyByZXR1cm5lZC4KKyAqCisgKiByZXR1cm5zIE1FRElBRFJNX05PVF9QUk9WSVNJT05FRF9FUlJPUiBpZiBwcm92aXNpb25pbmcgaXMgbmVlZGVkCisgKiByZXR1cm5zIE1FRElBRFJNX1JFU09VUkNFX0JVU1lfRVJST1IgaWYgcmVxdWlyZWQgcmVzb3VyY2VzIGFyZSBpbiB1c2UKKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX29wZW5TZXNzaW9uKEFNZWRpYURybSAqLAorICAgICAgICBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCkgX19JTlRST0RVQ0VEX0lOKDIxKTsKKworLyoqCisgKiBDbG9zZSBhIHNlc3Npb24gb24gdGhlIE1lZGlhRHJtIG9iamVjdCB0aGF0IHdhcyBwcmV2aW91c2x5IG9wZW5lZAorICogd2l0aCBBTWVkaWFEcm1fb3BlblNlc3Npb24uCisgKi8KK21lZGlhX3N0YXR1c190IEFNZWRpYURybV9jbG9zZVNlc3Npb24oQU1lZGlhRHJtICosCisgICAgICAgIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkKSBfX0lOVFJPRFVDRURfSU4oMjEpOworCiAvKioKICAqIEEga2V5IHJlcXVlc3QvcmVzcG9uc2UgZXhjaGFuZ2Ugb2NjdXJzIGJldHdlZW4gdGhlIGFwcCBhbmQgYSBsaWNlbnNlIHNlcnZlcgogICogdG8gb2J0YWluIG9yIHJlbGVhc2Uga2V5cyB1c2VkIHRvIGRlY3J5cHQgZW5jcnlwdGVkIGNvbnRlbnQuCkBAIC0xOTksNyArMjc4LDcgQEAKIG1lZGlhX3N0YXR1c190IEFNZWRpYURybV9nZXRLZXlSZXF1ZXN0KEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TY29wZSAqc2NvcGUsCiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluaXQsIHNpemVfdCBpbml0U2l6ZSwgY29uc3QgY2hhciAqbWltZVR5cGUsIEFNZWRpYURybUtleVR5cGUga2V5VHlwZSwKICAgICAgICAgY29uc3QgQU1lZGlhRHJtS2V5VmFsdWUgKm9wdGlvbmFsUGFyYW1ldGVycywgc2l6ZV90IG51bU9wdGlvbmFsUGFyYW1ldGVycywKLSAgICAgICAgY29uc3QgdWludDhfdCAqKmtleVJlcXVlc3QsIHNpemVfdCAqa2V5UmVxdWVzdFNpemUpOworICAgICAgICBjb25zdCB1aW50OF90ICoqa2V5UmVxdWVzdCwgc2l6ZV90ICprZXlSZXF1ZXN0U2l6ZSkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBBIGtleSByZXNwb25zZSBpcyByZWNlaXZlZCBmcm9tIHRoZSBsaWNlbnNlIHNlcnZlciBieSB0aGUgYXBwLCB0aGVuIGl0IGlzCkBAIC0yMTksNyArMjk4LDggQEAKICAqLwogCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcHJvdmlkZUtleVJlc3BvbnNlKEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TY29wZSAqc2NvcGUsCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnJlc3BvbnNlLCBzaXplX3QgcmVzcG9uc2VTaXplLCBBTWVkaWFEcm1LZXlTZXRJZCAqa2V5U2V0SWQpOworICAgICAgICBjb25zdCB1aW50OF90ICpyZXNwb25zZSwgc2l6ZV90IHJlc3BvbnNlU2l6ZSwKKyAgICAgICAgQU1lZGlhRHJtS2V5U2V0SWQgKmtleVNldElkKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIFJlc3RvcmUgcGVyc2lzdGVkIG9mZmxpbmUga2V5cyBpbnRvIGEgbmV3IHNlc3Npb24uICBrZXlTZXRJZCBpZGVudGlmaWVzIHRoZQpAQCAtMjI5LDE0ICszMDksMTUgQEAKICAqIGtleVNldElkIGlkZW50aWZpZXMgdGhlIHNhdmVkIGtleSBzZXQgdG8gcmVzdG9yZQogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcmVzdG9yZUtleXMoQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLAotICAgICAgICBjb25zdCBBTWVkaWFEcm1LZXlTZXRJZCAqa2V5U2V0SWQpOworICAgICAgICBjb25zdCBBTWVkaWFEcm1LZXlTZXRJZCAqa2V5U2V0SWQpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogUmVtb3ZlIHRoZSBjdXJyZW50IGtleXMgZnJvbSBhIHNlc3Npb24uCiAgKgogICoga2V5U2V0SWQgaWRlbnRpZmllcyBrZXlzIHRvIHJlbW92ZQogICovCi1tZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcmVtb3ZlS2V5cyhBTWVkaWFEcm0gKiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICprZXlTZXRJZCk7CittZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcmVtb3ZlS2V5cyhBTWVkaWFEcm0gKiwKKyAgICAgICAgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICprZXlTZXRJZCkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBSZXF1ZXN0IGFuIGluZm9ybWF0aXZlIGRlc2NyaXB0aW9uIG9mIHRoZSBrZXkgc3RhdHVzIGZvciB0aGUgc2Vzc2lvbi4gIFRoZSBzdGF0dXMgaXMKQEAgLTI1Miw3ICszMzMsNyBAQAogICogYW5kIG51bVBhaXJzIHdpbGwgYmUgc2V0IHRvIHRoZSBudW1iZXIgb2YgcGFpcnMgYXZhaWxhYmxlLgogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcXVlcnlLZXlTdGF0dXMoQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLAotICAgICAgICBBTWVkaWFEcm1LZXlWYWx1ZSAqa2V5VmFsdWVQYWlycywgc2l6ZV90ICpudW1QYWlycyk7CisgICAgICAgIEFNZWRpYURybUtleVZhbHVlICprZXlWYWx1ZVBhaXJzLCBzaXplX3QgKm51bVBhaXJzKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAKIC8qKgpAQCAtMjcxLDcgKzM1Miw3IEBACiAgKiAgICAgICB0aGUgbmV4dCBjYWxsIHRvIGdldFByb3Zpc2lvblJlcXVlc3QuCiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYURybV9nZXRQcm92aXNpb25SZXF1ZXN0KEFNZWRpYURybSAqLCBjb25zdCB1aW50OF90ICoqcHJvdmlzaW9uUmVxdWVzdCwKLSAgICAgICAgc2l6ZV90ICpwcm92aXNpb25SZXF1ZXN0U2l6ZSwgY29uc3QgY2hhciAqKnNlcnZlclVybCk7CisgICAgICAgIHNpemVfdCAqcHJvdmlzaW9uUmVxdWVzdFNpemUsIGNvbnN0IGNoYXIgKipzZXJ2ZXJVcmwpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIAogLyoqCkBAIC0yODYsNyArMzY3LDcgQEAKICAqIHNlcnZlciByZWplY3RlZCB0aGUgcmVxdWVzdAogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlKEFNZWRpYURybSAqLAotICAgICAgICBjb25zdCB1aW50OF90ICpyZXNwb25zZSwgc2l6ZV90IHJlc3BvbnNlU2l6ZSk7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnJlc3BvbnNlLCBzaXplX3QgcmVzcG9uc2VTaXplKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAKIC8qKgpAQCAtMzExLDcgKzM5Miw3IEBACiAgKiBudW1iZXIgcmVxdWlyZWQuCiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYURybV9nZXRTZWN1cmVTdG9wcyhBTWVkaWFEcm0gKiwKLSAgICAgICAgQU1lZGlhRHJtU2VjdXJlU3RvcCAqc2VjdXJlU3RvcHMsIHNpemVfdCAqbnVtU2VjdXJlU3RvcHMpOworICAgICAgICBBTWVkaWFEcm1TZWN1cmVTdG9wICpzZWN1cmVTdG9wcywgc2l6ZV90ICpudW1TZWN1cmVTdG9wcykgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBQcm9jZXNzIHRoZSBTZWN1cmVTdG9wIHNlcnZlciByZXNwb25zZSBtZXNzYWdlIHNzUmVsZWFzZS4gIEFmdGVyIGF1dGhlbnRpY2F0aW5nCkBAIC0zMjAsNyArNDAxLDcgQEAKICAqIHNzUmVsZWFzZSBpcyB0aGUgc2VydmVyIHJlc3BvbnNlIGluZGljYXRpbmcgd2hpY2ggc2VjdXJlIHN0b3BzIHRvIHJlbGVhc2UKICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3JlbGVhc2VTZWN1cmVTdG9wcyhBTWVkaWFEcm0gKiwKLSAgICAgICAgY29uc3QgQU1lZGlhRHJtU2VjdXJlU3RvcCAqc3NSZWxlYXNlKTsKKyAgICAgICAgY29uc3QgQU1lZGlhRHJtU2VjdXJlU3RvcCAqc3NSZWxlYXNlKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIFN0cmluZyBwcm9wZXJ0eSBuYW1lOiBpZGVudGlmaWVzIHRoZSBtYWtlciBvZiB0aGUgRFJNIGVuZ2luZSBwbHVnaW4KQEAgLTM1Myw3ICs0MzQsNyBAQAogICogd2lsbCByZW1haW4gdmFsaWQgdW50aWwgdGhlIG5leHQgY2FsbCB0byBBTWVkaWFEcm1fZ2V0UHJvcGVydHlTdHJpbmcuCiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYURybV9nZXRQcm9wZXJ0eVN0cmluZyhBTWVkaWFEcm0gKiwgY29uc3QgY2hhciAqcHJvcGVydHlOYW1lLAotICAgICAgICBjb25zdCBjaGFyICoqcHJvcGVydHlWYWx1ZSk7CisgICAgICAgIGNvbnN0IGNoYXIgKipwcm9wZXJ0eVZhbHVlKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIEJ5dGUgYXJyYXkgcHJvcGVydHkgbmFtZTogdGhlIGRldmljZSB1bmlxdWUgaWRlbnRpZmllciBpcyBlc3RhYmxpc2hlZCBkdXJpbmcKQEAgLTM2OCwxOSArNDQ5LDE5IEBACiAgKiB3aWxsIHJlbWFpbiB2YWxpZCB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIEFNZWRpYURybV9nZXRQcm9wZXJ0eUJ5dGVBcnJheS4KICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2dldFByb3BlcnR5Qnl0ZUFycmF5KEFNZWRpYURybSAqLCBjb25zdCBjaGFyICpwcm9wZXJ0eU5hbWUsCi0gICAgICAgIEFNZWRpYURybUJ5dGVBcnJheSAqcHJvcGVydHlWYWx1ZSk7CisgICAgICAgIEFNZWRpYURybUJ5dGVBcnJheSAqcHJvcGVydHlWYWx1ZSkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBTZXQgYSBEUk0gZW5naW5lIHBsdWdpbiBTdHJpbmcgcHJvcGVydHkgdmFsdWUuCiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYURybV9zZXRQcm9wZXJ0eVN0cmluZyhBTWVkaWFEcm0gKiwgY29uc3QgY2hhciAqcHJvcGVydHlOYW1lLAotICAgICAgICBjb25zdCBjaGFyICp2YWx1ZSk7CisgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIFNldCBhIERSTSBlbmdpbmUgcGx1Z2luIGJ5dGUgYXJyYXkgcHJvcGVydHkgdmFsdWUuCiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYURybV9zZXRQcm9wZXJ0eUJ5dGVBcnJheShBTWVkaWFEcm0gKiwgY29uc3QgY2hhciAqcHJvcGVydHlOYW1lLAotICAgICAgICBjb25zdCB1aW50OF90ICp2YWx1ZSwgc2l6ZV90IHZhbHVlU2l6ZSk7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnZhbHVlLCBzaXplX3QgdmFsdWVTaXplKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIEluIGFkZGl0aW9uIHRvIHN1cHBvcnRpbmcgZGVjcnlwdGlvbiBvZiBEQVNIIENvbW1vbiBFbmNyeXB0ZWQgTWVkaWEsIHRoZQpAQCAtNDA5LDcgKzQ5MCw3IEBACiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYURybV9lbmNyeXB0KEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwKICAgICAgICAgY29uc3QgY2hhciAqY2lwaGVyQWxnb3JpdGhtLCB1aW50OF90ICprZXlJZCwgdWludDhfdCAqaXYsCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmlucHV0LCB1aW50OF90ICpvdXRwdXQsIHNpemVfdCBkYXRhU2l6ZSk7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmlucHV0LCB1aW50OF90ICpvdXRwdXQsIHNpemVfdCBkYXRhU2l6ZSkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoKICAqIERlY3J5cHQgdGhlIGRhdGEgcmVmZXJlbmNlZCBieSBpbnB1dCBvZiBsZW5ndGggZGF0YVNpemUgdXNpbmcgYWxnb3JpdGhtIHNwZWNpZmllZApAQCAtNDIwLDcgKzUwMSw3IEBACiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYURybV9kZWNyeXB0KEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwKICAgICAgICAgY29uc3QgY2hhciAqY2lwaGVyQWxnb3JpdGhtLCB1aW50OF90ICprZXlJZCwgdWludDhfdCAqaXYsCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmlucHV0LCB1aW50OF90ICpvdXRwdXQsIHNpemVfdCBkYXRhU2l6ZSk7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmlucHV0LCB1aW50OF90ICpvdXRwdXQsIHNpemVfdCBkYXRhU2l6ZSkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoKICAqIEdlbmVyYXRlIGEgc2lnbmF0dXJlIHVzaW5nIHRoZSBzcGVjaWZpZWQgbWFjQWxnb3JpdGhtIG92ZXIgdGhlIG1lc3NhZ2UgZGF0YQpAQCAtNDMzLDcgKzUxNCw3IEBACiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYURybV9zaWduKEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwKICAgICAgICAgY29uc3QgY2hhciAqbWFjQWxnb3JpdGhtLCB1aW50OF90ICprZXlJZCwgdWludDhfdCAqbWVzc2FnZSwgc2l6ZV90IG1lc3NhZ2VTaXplLAotICAgICAgICB1aW50OF90ICpzaWduYXR1cmUsIHNpemVfdCAqc2lnbmF0dXJlU2l6ZSk7CisgICAgICAgIHVpbnQ4X3QgKnNpZ25hdHVyZSwgc2l6ZV90ICpzaWduYXR1cmVTaXplKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKgogICogUGVyZm9ybSBhIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24gdXNpbmcgdGhlIHNwZWNpZmllZCBtYWNBbGdvcml0aG0gb3ZlciB0aGUgbWVzc2FnZQpAQCAtNDQ0LDEwICs1MjUsMTIgQEAKICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3ZlcmlmeShBTWVkaWFEcm0gKiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsCiAgICAgICAgIGNvbnN0IGNoYXIgKm1hY0FsZ29yaXRobSwgdWludDhfdCAqa2V5SWQsIGNvbnN0IHVpbnQ4X3QgKm1lc3NhZ2UsIHNpemVfdCBtZXNzYWdlU2l6ZSwKLSAgICAgICAgY29uc3QgdWludDhfdCAqc2lnbmF0dXJlLCBzaXplX3Qgc2lnbmF0dXJlU2l6ZSk7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNpZ25hdHVyZSwgc2l6ZV90IHNpZ25hdHVyZVNpemUpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjEgKi8KIAogX19FTkRfREVDTFMKIAogI2VuZGlmIC8vX05ES19NRURJQV9EUk1fSAorCisvKiogQH0gKi8KZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXJyb3IuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXJyb3IuaAppbmRleCAxM2FhY2M5Li4yYmUxZDZlIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUVycm9yLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFcnJvci5oCkBAIC0xNCw2ICsxNCwxNCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorLyoqCisgKiBAYWRkdG9ncm91cCBNZWRpYQorICogQHsKKyAqLworCisvKioKKyAqIEBmaWxlIE5ka01lZGlhRXJyb3IuaAorICovCiAKIC8qCiAgKiBUaGlzIGZpbGUgZGVmaW5lcyBhbiBOREsgQVBJLgpAQCAtNTUsNiArNjMsNyBAQAogICAgIEFNRURJQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTiAgICAgPSBBTUVESUFfRVJST1JfQkFTRSAtIDUsCiAgICAgQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU0gICAgICAgICA9IEFNRURJQV9FUlJPUl9CQVNFIC0gNiwKICAgICBBTUVESUFfRVJST1JfSU8gICAgICAgICAgICAgICAgICAgID0gQU1FRElBX0VSUk9SX0JBU0UgLSA3LAorICAgIEFNRURJQV9FUlJPUl9XT1VMRF9CTE9DSyAgICAgICAgICAgPSBBTUVESUFfRVJST1JfQkFTRSAtIDgsCiAKICAgICBBTUVESUFfRFJNX0VSUk9SX0JBU0UgICAgICAgICAgICAgID0gLTIwMDAwLAogICAgIEFNRURJQV9EUk1fTk9UX1BST1ZJU0lPTkVEICAgICAgICAgPSBBTUVESUFfRFJNX0VSUk9SX0JBU0UgLSAxLApAQCAtNzksMyArODgsNSBAQAogX19FTkRfREVDTFMKIAogI2VuZGlmIC8vIF9OREtfTUVESUFfRVJST1JfSAorCisvKiogQH0gKi8KZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oCmluZGV4IGY3YjljZmQuLmUzZDlmZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaApAQCAtMTQsNiArMTQsMTQgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKy8qKgorICogQGFkZHRvZ3JvdXAgTWVkaWEKKyAqIEB7CisgKi8KKworLyoqCisgKiBAZmlsZSBOZGtNZWRpYUV4dHJhY3Rvci5oCisgKi8KIAogLyoKICAqIFRoaXMgZmlsZSBkZWZpbmVzIGFuIE5ESyBBUEkuCkBAIC00Niw0MyArNTQsNDQgQEAKIC8qKgogICogQ3JlYXRlIG5ldyBtZWRpYSBleHRyYWN0b3IKICAqLwotQU1lZGlhRXh0cmFjdG9yKiBBTWVkaWFFeHRyYWN0b3JfbmV3KCk7CitBTWVkaWFFeHRyYWN0b3IqIEFNZWRpYUV4dHJhY3Rvcl9uZXcoKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIERlbGV0ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBtZWRpYSBleHRyYWN0b3IKICAqLwotbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX2RlbGV0ZShBTWVkaWFFeHRyYWN0b3IqKTsKK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9kZWxldGUoQU1lZGlhRXh0cmFjdG9yKikgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiAgU2V0IHRoZSBmaWxlIGRlc2NyaXB0b3IgZnJvbSB3aGljaCB0aGUgZXh0cmFjdG9yIHdpbGwgcmVhZC4KICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VGZChBTWVkaWFFeHRyYWN0b3IqLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LAotICAgICAgICBvZmY2NF90IGxlbmd0aCk7CisgICAgICAgIG9mZjY0X3QgbGVuZ3RoKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIFNldCB0aGUgVVJJIGZyb20gd2hpY2ggdGhlIGV4dHJhY3RvciB3aWxsIHJlYWQuCiAgKi8KLW1lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlKEFNZWRpYUV4dHJhY3RvciosIGNvbnN0IGNoYXIgKmxvY2F0aW9uKTsKLSAgICAgICAgLy8gVE9ETyBzdXBwb3J0IGhlYWRlcnMKK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlKEFNZWRpYUV4dHJhY3RvciosCisgICAgICAgIGNvbnN0IGNoYXIgKmxvY2F0aW9uKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAjaWYgX19BTkRST0lEX0FQSV9fID49IDI4CiAKIC8qKgogICogU2V0IHRoZSBjdXN0b20gZGF0YSBzb3VyY2UgaW1wbGVtZW50YXRpb24gZnJvbSB3aGljaCB0aGUgZXh0cmFjdG9yIHdpbGwgcmVhZC4KICAqLwotbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VDdXN0b20oQU1lZGlhRXh0cmFjdG9yKiwgQU1lZGlhRGF0YVNvdXJjZSAqc3JjKTsKK21lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlQ3VzdG9tKEFNZWRpYUV4dHJhY3RvciosCisgICAgICAgIEFNZWRpYURhdGFTb3VyY2UgKnNyYykgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOCAqLwogCiAvKioKICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHRyYWNrcyBpbiB0aGUgcHJldmlvdXNseSBzcGVjaWZpZWQgbWVkaWEgZmlsZQogICovCi1zaXplX3QgQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrQ291bnQoQU1lZGlhRXh0cmFjdG9yKik7CitzaXplX3QgQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrQ291bnQoQU1lZGlhRXh0cmFjdG9yKikgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBSZXR1cm4gdGhlIGZvcm1hdCBvZiB0aGUgc3BlY2lmaWVkIHRyYWNrLiBUaGUgY2FsbGVyIG11c3QgZnJlZSB0aGUgcmV0dXJuZWQgZm9ybWF0CiAgKi8KLUFNZWRpYUZvcm1hdCogQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrRm9ybWF0KEFNZWRpYUV4dHJhY3RvciosIHNpemVfdCBpZHgpOworQU1lZGlhRm9ybWF0KiBBTWVkaWFFeHRyYWN0b3JfZ2V0VHJhY2tGb3JtYXQoQU1lZGlhRXh0cmFjdG9yKiwgc2l6ZV90IGlkeCkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBTZWxlY3QgdGhlIHNwZWNpZmllZCB0cmFjay4gU3Vic2VxdWVudCBjYWxscyB0byByZWFkU2FtcGxlRGF0YSwgZ2V0U2FtcGxlVHJhY2tJbmRleCBhbmQKQEAgLTkwLDQxICs5OSw0MiBAQAogICogU2VsZWN0aW5nIHRoZSBzYW1lIHRyYWNrIG11bHRpcGxlIHRpbWVzIGhhcyBubyBlZmZlY3QsIHRoZSB0cmFjayBpcwogICogb25seSBzZWxlY3RlZCBvbmNlLgogICovCi1tZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2VsZWN0VHJhY2soQU1lZGlhRXh0cmFjdG9yKiwgc2l6ZV90IGlkeCk7CittZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2VsZWN0VHJhY2soQU1lZGlhRXh0cmFjdG9yKiwgc2l6ZV90IGlkeCkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBVbnNlbGVjdCB0aGUgc3BlY2lmaWVkIHRyYWNrLiBTdWJzZXF1ZW50IGNhbGxzIHRvIHJlYWRTYW1wbGVEYXRhLCBnZXRTYW1wbGVUcmFja0luZGV4IGFuZAogICogZ2V0U2FtcGxlVGltZSBvbmx5IHJldHJpZXZlIGluZm9ybWF0aW9uIGZvciB0aGUgc3Vic2V0IG9mIHRyYWNrcyBzZWxlY3RlZC4uCiAgKi8KLW1lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl91bnNlbGVjdFRyYWNrKEFNZWRpYUV4dHJhY3RvciosIHNpemVfdCBpZHgpOworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3Vuc2VsZWN0VHJhY2soQU1lZGlhRXh0cmFjdG9yKiwgc2l6ZV90IGlkeCkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBSZWFkIHRoZSBjdXJyZW50IHNhbXBsZS4KICAqLwotc3NpemVfdCBBTWVkaWFFeHRyYWN0b3JfcmVhZFNhbXBsZURhdGEoQU1lZGlhRXh0cmFjdG9yKiwgdWludDhfdCAqYnVmZmVyLCBzaXplX3QgY2FwYWNpdHkpOworc3NpemVfdCBBTWVkaWFFeHRyYWN0b3JfcmVhZFNhbXBsZURhdGEoQU1lZGlhRXh0cmFjdG9yKiwKKyAgICAgICAgdWludDhfdCAqYnVmZmVyLCBzaXplX3QgY2FwYWNpdHkpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogUmVhZCB0aGUgY3VycmVudCBzYW1wbGUncyBmbGFncy4KICAqLwotdWludDMyX3QgQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZUZsYWdzKEFNZWRpYUV4dHJhY3RvciopOyAvLyBzZWUgZGVmaW5pdGlvbnMgYmVsb3cKK3VpbnQzMl90IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVGbGFncyhBTWVkaWFFeHRyYWN0b3IqKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIFJldHVybnMgdGhlIHRyYWNrIGluZGV4IHRoZSBjdXJyZW50IHNhbXBsZSBvcmlnaW5hdGVzIGZyb20gKG9yIC0xCiAgKiBpZiBubyBtb3JlIHNhbXBsZXMgYXJlIGF2YWlsYWJsZSkKICAqLwotaW50IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVUcmFja0luZGV4KEFNZWRpYUV4dHJhY3RvciopOworaW50IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVUcmFja0luZGV4KEFNZWRpYUV4dHJhY3RvciopIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogUmV0dXJucyB0aGUgY3VycmVudCBzYW1wbGUncyBwcmVzZW50YXRpb24gdGltZSBpbiBtaWNyb3NlY29uZHMuCiAgKiBvciAtMSBpZiBubyBtb3JlIHNhbXBsZXMgYXJlIGF2YWlsYWJsZS4KICAqLwotaW50NjRfdCBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVGltZShBTWVkaWFFeHRyYWN0b3IqKTsKK2ludDY0X3QgQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVRpbWUoQU1lZGlhRXh0cmFjdG9yKikgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBBZHZhbmNlIHRvIHRoZSBuZXh0IHNhbXBsZS4gUmV0dXJucyBmYWxzZSBpZiBubyBtb3JlIHNhbXBsZSBkYXRhCiAgKiBpcyBhdmFpbGFibGUgKGVuZCBvZiBzdHJlYW0pLgogICovCi1ib29sIEFNZWRpYUV4dHJhY3Rvcl9hZHZhbmNlKEFNZWRpYUV4dHJhY3RvciopOworYm9vbCBBTWVkaWFFeHRyYWN0b3JfYWR2YW5jZShBTWVkaWFFeHRyYWN0b3IqKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiB0eXBlZGVmIGVudW0gewogICAgIEFNRURJQUVYVFJBQ1RPUl9TRUVLX1BSRVZJT1VTX1NZTkMsCkBAIC0xMzUsNyArMTQ1LDggQEAKIC8qKgogICoKICAqLwotbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NlZWtUbyhBTWVkaWFFeHRyYWN0b3IqLCBpbnQ2NF90IHNlZWtQb3NVcywgU2Vla01vZGUgbW9kZSk7CittZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2Vla1RvKEFNZWRpYUV4dHJhY3RvciosCisgICAgICAgIGludDY0X3Qgc2Vla1Bvc1VzLCBTZWVrTW9kZSBtb2RlKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIG1hcHBpbmcgb2YgY3J5cHRvIHNjaGVtZSB1dWlkIHRvIHRoZSBzY2hlbWUgc3BlY2lmaWMgZGF0YSBmb3IgdGhhdCBzY2hlbWUKQEAgLTE1NywxMCArMTY4LDEwIEBACiAvKioKICAqIEdldCB0aGUgUFNTSCBpbmZvIGlmIHByZXNlbnQuCiAgKi8KLVBzc2hJbmZvKiBBTWVkaWFFeHRyYWN0b3JfZ2V0UHNzaEluZm8oQU1lZGlhRXh0cmFjdG9yKik7CitQc3NoSW5mbyogQU1lZGlhRXh0cmFjdG9yX2dldFBzc2hJbmZvKEFNZWRpYUV4dHJhY3RvciopIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIAotQU1lZGlhQ29kZWNDcnlwdG9JbmZvICpBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlQ3J5cHRvSW5mbyhBTWVkaWFFeHRyYWN0b3IgKik7CitBTWVkaWFDb2RlY0NyeXB0b0luZm8gKkFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVDcnlwdG9JbmZvKEFNZWRpYUV4dHJhY3RvciAqKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiBlbnVtIHsKICAgICBBTUVESUFFWFRSQUNUT1JfU0FNUExFX0ZMQUdfU1lOQyA9IDEsCkBAIC0xNzYsNyArMTg3LDcgQEAKICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBhbHdheXMgcmV0dXJuIGEgZm9ybWF0OyBob3dldmVyLCB0aGUgZm9ybWF0IGNvdWxkIGJlIGVtcHR5CiAgKiAobm8ga2V5LXZhbHVlIHBhaXJzKSBpZiB0aGUgbWVkaWEgY29udGFpbmVyIGRvZXMgbm90IHByb3ZpZGUgZm9ybWF0IGluZm9ybWF0aW9uLgogICovCi1BTWVkaWFGb3JtYXQqIEFNZWRpYUV4dHJhY3Rvcl9nZXRGaWxlRm9ybWF0KEFNZWRpYUV4dHJhY3RvciopOworQU1lZGlhRm9ybWF0KiBBTWVkaWFFeHRyYWN0b3JfZ2V0RmlsZUZvcm1hdChBTWVkaWFFeHRyYWN0b3IqKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCiAvKioKICAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgc2FtcGxlIGluIGJ5dGVzLCBvciAtMSB3aGVuIG5vIHNhbXBsZXMgYXJlCkBAIC0xODgsNyArMTk5LDcgQEAKICAqIEFNZWRpYUV4dHJhY3Rvcl9yZWFkU2FtcGxlRGF0YShleCwgYnVmLCBzYW1wbGVTaXplKTsKICAqCiAgKi8KLXNzaXplX3QgQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVNpemUoQU1lZGlhRXh0cmFjdG9yKik7Citzc2l6ZV90IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVTaXplKEFNZWRpYUV4dHJhY3RvciopIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKIC8qKgogICogUmV0dXJucyB0aGUgZHVyYXRpb24gb2YgY2FjaGVkIG1lZGlhIHNhbXBsZXMgZG93bmxvYWRlZCBmcm9tIGEgbmV0d29yayBkYXRhIHNvdXJjZQpAQCAtMjAxLDcgKzIxMiw3IEBACiAgKiBjYWNoZWQgZHVyYXRpb24gY2Fubm90IGJlIGNhbGN1bGF0ZWQgKGJpdHJhdGUsIGR1cmF0aW9uLCBhbmQgZmlsZSBzaXplIGluZm9ybWF0aW9uCiAgKiBub3QgYXZhaWxhYmxlKS4KICAqLwotaW50NjRfdCBBTWVkaWFFeHRyYWN0b3JfZ2V0Q2FjaGVkRHVyYXRpb24oQU1lZGlhRXh0cmFjdG9yICopOworaW50NjRfdCBBTWVkaWFFeHRyYWN0b3JfZ2V0Q2FjaGVkRHVyYXRpb24oQU1lZGlhRXh0cmFjdG9yICopIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKIC8qKgogICogUmVhZCB0aGUgY3VycmVudCBzYW1wbGUncyBtZXRhZGF0YSBmb3JtYXQgaW50byB8Zm10fC4gRXhhbXBsZXMgb2Ygc2FtcGxlIG1ldGFkYXRhIGFyZQpAQCAtMjEyLDcgKzIyMyw4IEBACiAgKiBFeGlzdGluZyBrZXktdmFsdWUgcGFpcnMgaW4gfGZtdHwgd291bGQgYmUgcmVtb3ZlZCBpZiB0aGlzIEFQSSByZXR1cm5zIEFNRURJQV9PSy4KICAqIFRoZSBjb250ZW50cyBvZiB8Zm10fCBpcyB1bmRlZmluZWQgaWYgdGhpcyBBUEkgcmV0dXJucyBBTUVESUFfRVJST1JfKi4KICAqLwotbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZUZvcm1hdChBTWVkaWFFeHRyYWN0b3IgKmV4LCBBTWVkaWFGb3JtYXQgKmZtdCk7CittZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlRm9ybWF0KEFNZWRpYUV4dHJhY3RvciAqZXgsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqZm10KSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI4ICovCiAKQEAgLTIyMSwzICsyMzMsNSBAQAogX19FTkRfREVDTFMKIAogI2VuZGlmIC8vIF9OREtfTUVESUFfRVhUUkFDVE9SX0gKKworLyoqIEB9ICovCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdC5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXQuaAppbmRleCA2ODcwNTRlLi5mZDQzZjM2IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdC5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0LmgKQEAgLTE0LDYgKzE0LDE1IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisvKioKKyAqIEBhZGR0b2dyb3VwIE1lZGlhCisgKiBAeworICovCisKKy8qKgorICogQGZpbGUgTmRrTWVkaWFGb3JtYXQuaAorICovCisKIC8qCiAgKiBUaGlzIGZpbGUgZGVmaW5lcyBhbiBOREsgQVBJLgogICogRG8gbm90IHJlbW92ZSBtZXRob2RzLgpAQCAtMzksMTI4ICs0OCwxOTcgQEAKIAogI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyMQogCi1BTWVkaWFGb3JtYXQgKkFNZWRpYUZvcm1hdF9uZXcoKTsKLW1lZGlhX3N0YXR1c190IEFNZWRpYUZvcm1hdF9kZWxldGUoQU1lZGlhRm9ybWF0Kik7CitBTWVkaWFGb3JtYXQgKkFNZWRpYUZvcm1hdF9uZXcoKSBfX0lOVFJPRFVDRURfSU4oMjEpOworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRm9ybWF0X2RlbGV0ZShBTWVkaWFGb3JtYXQqKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIEh1bWFuIHJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmb3JtYXQuIFRoZSByZXR1cm5lZCBzdHJpbmcgaXMgb3duZWQgYnkgdGhlIGZvcm1hdCwKICAqIGFuZCByZW1haW5zIHZhbGlkIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gdG9TdHJpbmcsIG9yIHVudGlsIHRoZSBmb3JtYXQgaXMgZGVsZXRlZC4KICAqLwotY29uc3QgY2hhciogQU1lZGlhRm9ybWF0X3RvU3RyaW5nKEFNZWRpYUZvcm1hdCopOworY29uc3QgY2hhciogQU1lZGlhRm9ybWF0X3RvU3RyaW5nKEFNZWRpYUZvcm1hdCopIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKLWJvb2wgQU1lZGlhRm9ybWF0X2dldEludDMyKEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIgKm5hbWUsIGludDMyX3QgKm91dCk7Ci1ib29sIEFNZWRpYUZvcm1hdF9nZXRJbnQ2NChBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyICpuYW1lLCBpbnQ2NF90ICpvdXQpOwotYm9vbCBBTWVkaWFGb3JtYXRfZ2V0RmxvYXQoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciAqbmFtZSwgZmxvYXQgKm91dCk7Ci1ib29sIEFNZWRpYUZvcm1hdF9nZXRTaXplKEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCAqb3V0KTsKK2Jvb2wgQU1lZGlhRm9ybWF0X2dldEludDMyKEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIgKm5hbWUsIGludDMyX3QgKm91dCkgX19JTlRST0RVQ0VEX0lOKDIxKTsKK2Jvb2wgQU1lZGlhRm9ybWF0X2dldEludDY0KEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIgKm5hbWUsIGludDY0X3QgKm91dCkgX19JTlRST0RVQ0VEX0lOKDIxKTsKK2Jvb2wgQU1lZGlhRm9ybWF0X2dldEZsb2F0KEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIgKm5hbWUsIGZsb2F0ICpvdXQpIF9fSU5UUk9EVUNFRF9JTigyMSk7Citib29sIEFNZWRpYUZvcm1hdF9nZXRTaXplKEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCAqb3V0KSBfX0lOVFJPRFVDRURfSU4oMjEpOwogLyoqCiAgKiBUaGUgcmV0dXJuZWQgZGF0YSBpcyBvd25lZCBieSB0aGUgZm9ybWF0IGFuZCByZW1haW5zIHZhbGlkIGFzIGxvbmcgYXMgdGhlIG5hbWVkIGVudHJ5CiAgKiBpcyBwYXJ0IG9mIHRoZSBmb3JtYXQuCiAgKi8KLWJvb2wgQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkKiogZGF0YSwgc2l6ZV90ICpzaXplKTsKK2Jvb2wgQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkKiogZGF0YSwgc2l6ZV90ICpzaXplKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogLyoqCiAgKiBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIG93bmVkIGJ5IHRoZSBmb3JtYXQsIGFuZCByZW1haW5zIHZhbGlkIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gZ2V0U3RyaW5nLAogICogb3IgdW50aWwgdGhlIGZvcm1hdCBpcyBkZWxldGVkLgogICovCi1ib29sIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKm91dCk7Citib29sIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqKm91dCkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogCi12b2lkIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyKiBuYW1lLCBpbnQzMl90IHZhbHVlKTsKLXZvaWQgQU1lZGlhRm9ybWF0X3NldEludDY0KEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIqIG5hbWUsIGludDY0X3QgdmFsdWUpOwotdm9pZCBBTWVkaWFGb3JtYXRfc2V0RmxvYXQoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciogbmFtZSwgZmxvYXQgdmFsdWUpOwordm9pZCBBTWVkaWFGb3JtYXRfc2V0SW50MzIoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciogbmFtZSwgaW50MzJfdCB2YWx1ZSkgX19JTlRST0RVQ0VEX0lOKDIxKTsKK3ZvaWQgQU1lZGlhRm9ybWF0X3NldEludDY0KEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIqIG5hbWUsIGludDY0X3QgdmFsdWUpIF9fSU5UUk9EVUNFRF9JTigyMSk7Cit2b2lkIEFNZWRpYUZvcm1hdF9zZXRGbG9hdChBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyKiBuYW1lLCBmbG9hdCB2YWx1ZSkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIC8qKgogICogVGhlIHByb3ZpZGVkIHN0cmluZyBpcyBjb3BpZWQgaW50byB0aGUgZm9ybWF0LgogICovCi12b2lkIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdmFsdWUpOwordm9pZCBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIHZhbHVlKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogLyoqCiAgKiBUaGUgcHJvdmlkZWQgZGF0YSBpcyBjb3BpZWQgaW50byB0aGUgZm9ybWF0LgogICovCi12b2lkIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciogbmFtZSwgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpOwordm9pZCBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAKLQotLyoqCi0gKiBYWFggc2hvdWxkIHRoZXNlIGJlIGludHMvZW51bXMgdGhhdCB3ZSBsb29rIHVwIGluIGEgdGFibGUgYXMgbmVlZGVkPwotICovCi1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUjsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19EUkNfQk9PU1RfRkFDVE9SOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX0RSQ19IRUFWWV9DT01QUkVTU0lPTjsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19EUkNfVEFSR0VUX1JFRkVSRU5DRV9MRVZFTDsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19FTkNPREVEX1RBUkdFVF9MRVZFTDsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19NQVhfT1VUUFVUX0NIQU5ORUxfQ09VTlQ7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfUFJPRklMRTsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19TQlJfTU9ERTsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1NFU1NJT05fSUQ7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9CSVRSQVRFX01PREU7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURTsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NBUFRVUkVfUkFURTsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQ7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX01BU0s7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT0xPUl9GT1JNQVQ7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT0xPUl9SQU5HRTsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1NUQU5EQVJEOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfVFJBTlNGRVI7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT01QTEVYSVRZOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzA7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0RfMTsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF8yOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9DUk9QOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9IRUlHSFQ7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX1dJRFRIOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT047Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9GTEFDX0NPTVBSRVNTSU9OX0xFVkVMOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURTsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0dSSURfQ09MVU1OUzsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0dSSURfUk9XUzsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0hEUl9TVEFUSUNfSU5GTzsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVDsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lOVFJBX1JFRlJFU0hfUEVSSU9EOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfQURUUzsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0FVVE9TRUxFQ1Q7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19ERUZBVUxUOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfRk9SQ0VEX1NVQlRJVExFOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSV9GUkFNRV9JTlRFUlZBTDsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xBTkdVQUdFOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTEFURU5DWTsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xFVkVMOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX0hFSUdIVDsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX1dJRFRIOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUlNRTsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01QRUdfVVNFUl9EQVRBOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfT1BFUkFUSU5HX1JBVEU7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QQ01fRU5DT0RJTkc7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QUklPUklUWTsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BST0ZJTEU7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QVVNIX0JMQU5LX0JVRkZFUlNfT05fU1RPUDsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9BRlRFUjsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1JPVEFUSU9OOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEU7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TRUk7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TTElDRV9IRUlHSFQ7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TVFJJREU7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9JRDsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSSU5HOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVElMRV9IRUlHSFQ7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USUxFX1dJRFRIOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUzsKLWV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lEOwotZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSU5ERVg7Ci1leHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9XSURUSDsKLQorZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IgX19JTlRST0RVQ0VEX0lOKDI4KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19EUkNfQk9PU1RfRkFDVE9SIF9fSU5UUk9EVUNFRF9JTigyOCk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfRFJDX0hFQVZZX0NPTVBSRVNTSU9OIF9fSU5UUk9EVUNFRF9JTigyOCk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfRFJDX1RBUkdFVF9SRUZFUkVOQ0VfTEVWRUwgX19JTlRST0RVQ0VEX0lOKDI4KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19FTkNPREVEX1RBUkdFVF9MRVZFTCBfX0lOVFJPRFVDRURfSU4oMjgpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX01BWF9PVVRQVVRfQ0hBTk5FTF9DT1VOVCBfX0lOVFJPRFVDRURfSU4oMjgpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX1BST0ZJTEUgX19JTlRST0RVQ0VEX0lOKDIxKTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19TQlJfTU9ERSBfX0lOVFJPRFVDRURfSU4oMjgpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fU0VTU0lPTl9JRCBfX0lOVFJPRFVDRURfSU4oMjgpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQklUUkFURV9NT0RFIF9fSU5UUk9EVUNFRF9JTigyOCk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSBfX0lOVFJPRFVDRURfSU4oMjEpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ0FQVFVSRV9SQVRFIF9fSU5UUk9EVUNFRF9JTigyOCk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5UIF9fSU5UUk9EVUNFRF9JTigyMSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX01BU0sgX19JTlRST0RVQ0VEX0lOKDIxKTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX0ZPUk1BVCBfX0lOVFJPRFVDRURfSU4oMjEpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfUkFOR0UgX19JTlRST0RVQ0VEX0lOKDI4KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1NUQU5EQVJEIF9fSU5UUk9EVUNFRF9JTigyOCk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT0xPUl9UUkFOU0ZFUiBfX0lOVFJPRFVDRURfSU4oMjgpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09NUExFWElUWSBfX0lOVFJPRFVDRURfSU4oMjgpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEIF9fSU5UUk9EVUNFRF9JTigyOCk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0RfMCBfX0lOVFJPRFVDRURfSU4oMjgpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzEgX19JTlRST0RVQ0VEX0lOKDI4KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF8yIF9fSU5UUk9EVUNFRF9JTigyOCk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX0NST1AgX19JTlRST0RVQ0VEX0lOKDI4KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfSEVJR0hUIF9fSU5UUk9EVUNFRF9JTigyOCk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX1dJRFRIIF9fSU5UUk9EVUNFRF9JTigyOCk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiBfX0lOVFJPRFVDRURfSU4oMjEpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRkxBQ19DT01QUkVTU0lPTl9MRVZFTCBfX0lOVFJPRFVDRURfSU4oMjEpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURSBfX0lOVFJPRFVDRURfSU4oMjEpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfR1JJRF9DT0xVTU5TIF9fSU5UUk9EVUNFRF9JTigyOCk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9HUklEX1JPV1MgX19JTlRST0RVQ0VEX0lOKDI4KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0hEUl9TVEFUSUNfSU5GTyBfX0lOVFJPRFVDRURfSU4oMjgpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hUIF9fSU5UUk9EVUNFRF9JTigyMSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JTlRSQV9SRUZSRVNIX1BFUklPRCBfX0lOVFJPRFVDRURfSU4oMjgpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfQURUUyBfX0lOVFJPRFVDRURfSU4oMjEpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfQVVUT1NFTEVDVCBfX0lOVFJPRFVDRURfSU4oMjEpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfREVGQVVMVCBfX0lOVFJPRFVDRURfSU4oMjEpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfRk9SQ0VEX1NVQlRJVExFIF9fSU5UUk9EVUNFRF9JTigyMSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JX0ZSQU1FX0lOVEVSVkFMIF9fSU5UUk9EVUNFRF9JTigyMSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MQU5HVUFHRSBfX0lOVFJPRFVDRURfSU4oMjEpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTEFURU5DWSBfX0lOVFJPRFVDRURfSU4oMjgpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTEVWRUwgX19JTlRST0RVQ0VEX0lOKDI4KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9IRUlHSFQgX19JTlRST0RVQ0VEX0lOKDIxKTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFIF9fSU5UUk9EVUNFRF9JTigyMSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfV0lEVEggX19JTlRST0RVQ0VEX0lOKDIxKTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01JTUUgX19JTlRST0RVQ0VEX0lOKDIxKTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01QRUdfVVNFUl9EQVRBIF9fSU5UUk9EVUNFRF9JTigyOCk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9PUEVSQVRJTkdfUkFURSBfX0lOVFJPRFVDRURfSU4oMjgpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HIF9fSU5UUk9EVUNFRF9JTigyOCk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QUklPUklUWSBfX0lOVFJPRFVDRURfSU4oMjgpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFJPRklMRSBfX0lOVFJPRFVDRURfSU4oMjgpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFVTSF9CTEFOS19CVUZGRVJTX09OX1NUT1AgX19JTlRST0RVQ0VEX0lOKDIxKTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9BRlRFUiBfX0lOVFJPRFVDRURfSU4oMjEpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUk9UQVRJT04gX19JTlRST0RVQ0VEX0lOKDI4KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFIF9fSU5UUk9EVUNFRF9JTigyMSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TRUkgX19JTlRST0RVQ0VEX0lOKDI4KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NMSUNFX0hFSUdIVCBfX0lOVFJPRFVDRURfSU4oMjgpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU1RSSURFIF9fSU5UUk9EVUNFRF9JTigyMSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9JRCBfX0lOVFJPRFVDRURfSU4oMjgpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJJTkcgX19JTlRST0RVQ0VEX0lOKDI4KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RJTEVfSEVJR0hUIF9fSU5UUk9EVUNFRF9JTigyOCk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USUxFX1dJRFRIIF9fSU5UUk9EVUNFRF9JTigyOCk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USU1FX1VTIF9fSU5UUk9EVUNFRF9JTigyOCk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9UUkFDS19JRCBfX0lOVFJPRFVDRURfSU4oMjgpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSU5ERVggX19JTlRST0RVQ0VEX0lOKDI4KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1dJRFRIIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDIxICovCiAKICNpZiBfX0FORFJPSURfQVBJX18gPj0gMjgKLWJvb2wgQU1lZGlhRm9ybWF0X2dldERvdWJsZShBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyICpuYW1lLCBkb3VibGUgKm91dCk7Citib29sIEFNZWRpYUZvcm1hdF9nZXREb3VibGUoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciAqbmFtZSwgZG91YmxlICpvdXQpIF9fSU5UUk9EVUNFRF9JTigyOCk7CiBib29sIEFNZWRpYUZvcm1hdF9nZXRSZWN0KEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKmxlZnQsIGludDMyX3QgKnRvcCwgaW50MzJfdCAqcmlnaHQsIGludDMyX3QgKmJvdHRvbSk7CisgICAgICAgIGludDMyX3QgKmxlZnQsIGludDMyX3QgKnRvcCwgaW50MzJfdCAqcmlnaHQsIGludDMyX3QgKmJvdHRvbSkgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAotdm9pZCBBTWVkaWFGb3JtYXRfc2V0RG91YmxlKEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIqIG5hbWUsIGRvdWJsZSB2YWx1ZSk7Ci12b2lkIEFNZWRpYUZvcm1hdF9zZXRTaXplKEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIqIG5hbWUsIHNpemVfdCB2YWx1ZSk7Cit2b2lkIEFNZWRpYUZvcm1hdF9zZXREb3VibGUoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciogbmFtZSwgZG91YmxlIHZhbHVlKSBfX0lOVFJPRFVDRURfSU4oMjgpOwordm9pZCBBTWVkaWFGb3JtYXRfc2V0U2l6ZShBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyKiBuYW1lLCBzaXplX3QgdmFsdWUpIF9fSU5UUk9EVUNFRF9JTigyOCk7CiB2b2lkIEFNZWRpYUZvcm1hdF9zZXRSZWN0KEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIqIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbGVmdCwgaW50MzJfdCB0b3AsIGludDMyX3QgcmlnaHQsIGludDMyX3QgYm90dG9tKTsKKyAgICAgICAgaW50MzJfdCBsZWZ0LCBpbnQzMl90IHRvcCwgaW50MzJfdCByaWdodCwgaW50MzJfdCBib3R0b20pIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI4ICovCiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjkKKy8qKgorICogcmVtb3ZlIGFsbCBrZXkvdmFsdWUgcGFpcnMgZnJvbSB0aGUgZ2l2ZW4gQU1lZGlhRm9ybWF0CisgKi8KK3ZvaWQgQU1lZGlhRm9ybWF0X2NsZWFyKEFNZWRpYUZvcm1hdCopIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKy8qKgorICogY29weSBvbmUgQU1lZGlhRm9ybWF0IHRvIGFub3RoZXIKKyAqLworbWVkaWFfc3RhdHVzX3QgQU1lZGlhRm9ybWF0X2NvcHkoQU1lZGlhRm9ybWF0ICp0bywgQU1lZGlhRm9ybWF0ICpmcm9tKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BTEJVTSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlQgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUSVNUIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BUlRJU1QgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9JTkZPIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BVURJT19QUkVTRU5UQVRJT05fUFJFU0VOVEFUSU9OX0lEIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BVURJT19QUkVTRU5UQVRJT05fUFJPR1JBTV9JRCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVVUSE9SIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NEVFJBQ0tOVU1CRVIgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTVBJTEFUSU9OIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT01QT1NFUiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JFQVRFX0lOUFVUX1NVUkZBQ0VfU1VTUEVOREVEIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fREVGQVVMVF9JVl9TSVpFIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX0JZVEVfQkxPQ0sgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfU0laRVMgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19JViBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX01PREUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19QTEFJTl9TSVpFUyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1NLSVBfQllURV9CTE9DSyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0hFVkMgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0QyNjMgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RBVEUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RJU0NOVU1CRVIgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfREVMQVkgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfUEFERElORyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRVNEUyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9PRkZTRVQgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0VYSUZfU0laRSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfQ09VTlQgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0dFTlJFIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9IQVBUSUNfQ0hBTk5FTF9DT1VOVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSUNDX1BST0ZJTEUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xPQ0FUSU9OIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MT09QIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MWVJJQ0lTVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFOVUZBQ1RVUkVSIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfQklUX1JBVEUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9GUFNfVE9fRU5DT0RFUiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX1BUU19HQVBfVE9fRU5DT0RFUiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTVBFRzJfU1RSRUFNX0hFQURFUiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUENNX0JJR19FTkRJQU4gX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BTU0ggX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBUl9IRUlHSFQgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBUl9XSURUSCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0NPVU5UIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9URVhUX0ZPUk1BVF9EQVRBIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfQ1NEX0hFVkMgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9IRUlHSFQgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9USU1FIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfV0lEVEggX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RJVExFIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9WQUxJRF9TQU1QTEVTIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ZRUFSIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKyNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjkgKi8KKwogX19FTkRfREVDTFMKIAogI2VuZGlmIC8vIF9OREtfTUVESUFfRk9STUFUX0gKKworLyoqIEB9ICovCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYU11eGVyLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYU11eGVyLmgKaW5kZXggMWVjZDFjYS4uNzM5Mzg2NyAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFNdXhlci5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhTXV4ZXIuaApAQCAtMTQsNiArMTQsMTQgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKy8qKgorICogQGFkZHRvZ3JvdXAgTWVkaWEKKyAqIEB7CisgKi8KKworLyoqCisgKiBAZmlsZSBOZGtNZWRpYU11eGVyLmgKKyAqLwogCiAvKgogICogVGhpcyBmaWxlIGRlZmluZXMgYW4gTkRLIEFQSS4KQEAgLTUwLDEyICs1OCwxMiBAQAogLyoqCiAgKiBDcmVhdGUgbmV3IG1lZGlhIG11eGVyCiAgKi8KLUFNZWRpYU11eGVyKiBBTWVkaWFNdXhlcl9uZXcoaW50IGZkLCBPdXRwdXRGb3JtYXQgZm9ybWF0KTsKK0FNZWRpYU11eGVyKiBBTWVkaWFNdXhlcl9uZXcoaW50IGZkLCBPdXRwdXRGb3JtYXQgZm9ybWF0KSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIERlbGV0ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBtZWRpYSBtdXhlcgogICovCi1tZWRpYV9zdGF0dXNfdCBBTWVkaWFNdXhlcl9kZWxldGUoQU1lZGlhTXV4ZXIqKTsKK21lZGlhX3N0YXR1c190IEFNZWRpYU11eGVyX2RlbGV0ZShBTWVkaWFNdXhlciopIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogU2V0IGFuZCBzdG9yZSB0aGUgZ2VvZGF0YSAobGF0aXR1ZGUgYW5kIGxvbmdpdHVkZSkgaW4gdGhlIG91dHB1dCBmaWxlLgpAQCAtNjgsNyArNzYsOCBAQAogICogTGF0aXR1ZGUgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWy05MCwgOTBdLgogICogTG9uZ2l0dWRlIG11c3QgYmUgaW4gdGhlIHJhbmdlIFstMTgwLCAxODBdLgogICovCi1tZWRpYV9zdGF0dXNfdCBBTWVkaWFNdXhlcl9zZXRMb2NhdGlvbihBTWVkaWFNdXhlciosIGZsb2F0IGxhdGl0dWRlLCBmbG9hdCBsb25naXR1ZGUpOworbWVkaWFfc3RhdHVzX3QgQU1lZGlhTXV4ZXJfc2V0TG9jYXRpb24oQU1lZGlhTXV4ZXIqLAorICAgICAgICBmbG9hdCBsYXRpdHVkZSwgZmxvYXQgbG9uZ2l0dWRlKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIFNldHMgdGhlIG9yaWVudGF0aW9uIGhpbnQgZm9yIG91dHB1dCB2aWRlbyBwbGF5YmFjay4KQEAgLTgyLDI2ICs5MSwyNiBAQAogICogVGhlIGFuZ2xlIGlzIHNwZWNpZmllZCBpbiBkZWdyZWVzLCBjbG9ja3dpc2UuCiAgKiBUaGUgc3VwcG9ydGVkIGFuZ2xlcyBhcmUgMCwgOTAsIDE4MCwgYW5kIDI3MCBkZWdyZWVzLgogICovCi1tZWRpYV9zdGF0dXNfdCBBTWVkaWFNdXhlcl9zZXRPcmllbnRhdGlvbkhpbnQoQU1lZGlhTXV4ZXIqLCBpbnQgZGVncmVlcyk7CittZWRpYV9zdGF0dXNfdCBBTWVkaWFNdXhlcl9zZXRPcmllbnRhdGlvbkhpbnQoQU1lZGlhTXV4ZXIqLCBpbnQgZGVncmVlcykgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBBZGRzIGEgdHJhY2sgd2l0aCB0aGUgc3BlY2lmaWVkIGZvcm1hdC4KICAqIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBuZXcgdHJhY2sgb3IgYSBuZWdhdGl2ZSB2YWx1ZSBpbiBjYXNlIG9mIGZhaWx1cmUsCiAgKiB3aGljaCBjYW4gYmUgaW50ZXJwcmV0ZWQgYXMgYSBtZWRpYV9zdGF0dXNfdC4KICAqLwotc3NpemVfdCBBTWVkaWFNdXhlcl9hZGRUcmFjayhBTWVkaWFNdXhlciosIGNvbnN0IEFNZWRpYUZvcm1hdCogZm9ybWF0KTsKK3NzaXplX3QgQU1lZGlhTXV4ZXJfYWRkVHJhY2soQU1lZGlhTXV4ZXIqLCBjb25zdCBBTWVkaWFGb3JtYXQqIGZvcm1hdCkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBTdGFydCB0aGUgbXV4ZXIuIFNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgQU1lZGlhTXV4ZXJfYWRkVHJhY2sgYW5kCiAgKiBiZWZvcmUgQU1lZGlhTXV4ZXJfd3JpdGVTYW1wbGVEYXRhLgogICovCi1tZWRpYV9zdGF0dXNfdCBBTWVkaWFNdXhlcl9zdGFydChBTWVkaWFNdXhlciopOworbWVkaWFfc3RhdHVzX3QgQU1lZGlhTXV4ZXJfc3RhcnQoQU1lZGlhTXV4ZXIqKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIFN0b3BzIHRoZSBtdXhlci4KICAqIE9uY2UgdGhlIG11eGVyIHN0b3BzLCBpdCBjYW4gbm90IGJlIHJlc3RhcnRlZC4KICAqLwotbWVkaWFfc3RhdHVzX3QgQU1lZGlhTXV4ZXJfc3RvcChBTWVkaWFNdXhlciopOworbWVkaWFfc3RhdHVzX3QgQU1lZGlhTXV4ZXJfc3RvcChBTWVkaWFNdXhlciopIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogV3JpdGVzIGFuIGVuY29kZWQgc2FtcGxlIGludG8gdGhlIG11eGVyLgpAQCAtMTExLDEwICsxMjAsMTMgQEAKICAqIGJ5IHRoZSBlbmNvZGVyLikKICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhTXV4ZXJfd3JpdGVTYW1wbGVEYXRhKEFNZWRpYU11eGVyICptdXhlciwKLSAgICAgICAgc2l6ZV90IHRyYWNrSWR4LCBjb25zdCB1aW50OF90ICpkYXRhLCBjb25zdCBBTWVkaWFDb2RlY0J1ZmZlckluZm8gKmluZm8pOworICAgICAgICBzaXplX3QgdHJhY2tJZHgsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsCisgICAgICAgIGNvbnN0IEFNZWRpYUNvZGVjQnVmZmVySW5mbyAqaW5mbykgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyMSAqLwogCiBfX0VORF9ERUNMUwogCiAjZW5kaWYgLy8gX05ES19NRURJQV9NVVhFUl9ICisKKy8qKiBAfSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9OZGtJbWFnZS5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9OZGtJbWFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNjhhNTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9wcml2YXRlL21lZGlhL05ka0ltYWdlLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1BSSVZBVEVfTUVESUFfTkRLSU1BR0VfSF8KKyNkZWZpbmUgX1BSSVZBVEVfTUVESUFfTkRLSU1BR0VfSF8KKy8vIEZvcm1hdHMgbm90IGxpc3RlZCBpbiB0aGUgcHVibGljIEFQSSwgYnV0IHN0aWxsIGF2YWlsYWJsZSB0byBBSW1hZ2VSZWFkZXIKK2VudW0gQUlNQUdFX1BSSVZBVEVfRk9STUFUUyB7CisgICAgLyoqCisgICAgICogVW5wcm9jZXNzZWQgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50IHJhdworICAgICAqIGRlcHRoIG1lYXN1cmVtZW50cywgb3BhcXVlIHdpdGggMTYgYml0CisgICAgICogc2FtcGxlcy4KKyAgICAgKgorICAgICAqLworCisgICAgQUlNQUdFX0ZPUk1BVF9SQVdfREVQVEggPSAweDEwMDIsCit9OworI2VuZGlmIC8vIF9QUklWQVRFX01FRElBX05ES0lNQUdFCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvbGlibWVkaWFuZGsubWFwLnR4dCBiL21lZGlhL25kay9saWJtZWRpYW5kay5tYXAudHh0CmluZGV4IGZiNTY2OTQuLmY2NjZhZDAgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9saWJtZWRpYW5kay5tYXAudHh0CisrKyBiL21lZGlhL25kay9saWJtZWRpYW5kay5tYXAudHh0CkBAIC00LDYgKzQsNyBAQAogICAgIEFJbWFnZVJlYWRlcl9hY3F1aXJlTGF0ZXN0SW1hZ2VBc3luYzsgIyBpbnRyb2R1Y2VkPTI2CiAgICAgQUltYWdlUmVhZGVyX2FjcXVpcmVOZXh0SW1hZ2U7ICMgaW50cm9kdWNlZD0yNAogICAgIEFJbWFnZVJlYWRlcl9hY3F1aXJlTmV4dEltYWdlQXN5bmM7ICMgaW50cm9kdWNlZD0yNgorICAgIEFJbWFnZVJlYWRlcl9nZXRXaW5kb3dOYXRpdmVIYW5kbGU7ICN2bmRrCiAgICAgQUltYWdlUmVhZGVyX2RlbGV0ZTsgIyBpbnRyb2R1Y2VkPTI0CiAgICAgQUltYWdlUmVhZGVyX2dldEZvcm1hdDsgIyBpbnRyb2R1Y2VkPTI0CiAgICAgQUltYWdlUmVhZGVyX2dldEhlaWdodDsgIyBpbnRyb2R1Y2VkPTI0CkBAIC0zMiw1NSArMzMsMTIyIEBACiAgICAgQU1FRElBRk9STUFUX0tFWV9BQUNfRFJDX1RBUkdFVF9SRUZFUkVOQ0VfTEVWRUw7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0FBQ19FTkNPREVEX1RBUkdFVF9MRVZFTDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfQUFDX01BWF9PVVRQVVRfQ0hBTk5FTF9DT1VOVDsgIyB2YXIgaW50cm9kdWNlZD0yOAotICAgIEFNRURJQUZPUk1BVF9LRVlfQUFDX1BST0ZJTEU7ICMgdmFyCisgICAgQU1FRElBRk9STUFUX0tFWV9BQUNfUFJPRklMRTsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfQUFDX1NCUl9NT0RFOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9BTEJVTTsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlQ7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUSVNUOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9BUlRJU1Q7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9JTkZPOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9BVURJT19TRVNTSU9OX0lEOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9BVVRIT1I7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0JJVFJBVEVfTU9ERTsgIyB2YXIgaW50cm9kdWNlZD0yOAotICAgIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEU7ICMgdmFyCisgICAgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURTsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfQklUU19QRVJfU0FNUExFOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9DQVBUVVJFX1JBVEU7ICMgdmFyIGludHJvZHVjZWQ9MjgKLSAgICBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQ7ICMgdmFyCi0gICAgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX01BU0s7ICMgdmFyCi0gICAgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9GT1JNQVQ7ICMgdmFyCisgICAgQU1FRElBRk9STUFUX0tFWV9DRFRSQUNLTlVNQkVSOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5UOyAjIHZhciBpbnRyb2R1Y2VkPTIxCisgICAgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX01BU0s7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX0ZPUk1BVDsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfUkFOR0U7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1NUQU5EQVJEOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9UUkFOU0ZFUjsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ09NUElMQVRJT047ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0NPTVBMRVhJVFk7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NPTVBPU0VSOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DUkVBVEVfSU5QVVRfU1VSRkFDRV9TVVNQRU5ERUQ7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19ERUZBVUxUX0lWX1NJWkU7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfQllURV9CTE9DSzsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9TSVpFUzsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0lWOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fS0VZOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fTU9ERTsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1BMQUlOX1NJWkVTOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fU0tJUF9CWVRFX0JMT0NLOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DU0Q7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8wOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMTsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzI7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF9BVkM7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF9IRVZDOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9EMjYzOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9EQVRFOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9ESVNDTlVNQkVSOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX0NST1A7ICMgdmFyIGludHJvZHVjZWQ9MjgKLSAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OOyAjIHZhcgotICAgIEFNRURJQUZPUk1BVF9LRVlfRkxBQ19DT01QUkVTU0lPTl9MRVZFTDsgIyB2YXIKLSAgICBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX1JBVEU7ICMgdmFyCisgICAgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX0hFSUdIVDsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9XSURUSDsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT047ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfREVMQVk7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfUEFERElORzsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfRVNEUzsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9PRkZTRVQ7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0VYSUZfU0laRTsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfQ09VTlQ7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0ZMQUNfQ09NUFJFU1NJT05fTEVWRUw7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX1JBVEU7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX0dFTlJFOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9HUklEX0NPTFVNTlM7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0dSSURfUk9XUzsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfSEFQVElDX0NIQU5ORUxfQ09VTlQ7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0hEUl9TVEFUSUNfSU5GTzsgIyB2YXIgaW50cm9kdWNlZD0yOAotICAgIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hUOyAjIHZhcgorICAgIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hUOyAjIHZhciBpbnRyb2R1Y2VkPTIxCisgICAgQU1FRElBRk9STUFUX0tFWV9JQ0NfUFJPRklMRTsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfSU5UUkFfUkVGUkVTSF9QRVJJT0Q7ICMgdmFyIGludHJvZHVjZWQ9MjgKLSAgICBBTUVESUFGT1JNQVRfS0VZX0lTX0FEVFM7ICMgdmFyCi0gICAgQU1FRElBRk9STUFUX0tFWV9JU19BVVRPU0VMRUNUOyAjIHZhcgotICAgIEFNRURJQUZPUk1BVF9LRVlfSVNfREVGQVVMVDsgIyB2YXIKLSAgICBBTUVESUFGT1JNQVRfS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRTsgIyB2YXIKLSAgICBBTUVESUFGT1JNQVRfS0VZX0lfRlJBTUVfSU5URVJWQUw7ICMgdmFyCi0gICAgQU1FRElBRk9STUFUX0tFWV9MQU5HVUFHRTsgIyB2YXIKKyAgICBBTUVESUFGT1JNQVRfS0VZX0lTX0FEVFM7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX0lTX0FVVE9TRUxFQ1Q7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX0lTX0RFRkFVTFQ7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRTsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRTsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfSV9GUkFNRV9JTlRFUlZBTDsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfTEFOR1VBR0U7ICMgdmFyIGludHJvZHVjZWQ9MjEKICAgICBBTUVESUFGT1JNQVRfS0VZX0xBVEVOQ1k7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0xFVkVMOyAjIHZhciBpbnRyb2R1Y2VkPTI4Ci0gICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSEVJR0hUOyAjIHZhcgotICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkU7ICMgdmFyCi0gICAgQU1FRElBRk9STUFUX0tFWV9NQVhfV0lEVEg7ICMgdmFyCi0gICAgQU1FRElBRk9STUFUX0tFWV9NSU1FOyAjIHZhcgorICAgIEFNRURJQUZPUk1BVF9LRVlfTE9DQVRJT047ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0xPT1A7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0xZUklDSVNUOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9NQU5VRkFDVFVSRVI7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9CSVRfUkFURTsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0ZQU19UT19FTkNPREVSOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSEVJR0hUOyAjIHZhciBpbnRyb2R1Y2VkPTIxCisgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRTsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX1BUU19HQVBfVE9fRU5DT0RFUjsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX1dJRFRIOyAjIHZhciBpbnRyb2R1Y2VkPTIxCisgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FOyAjIHZhciBpbnRyb2R1Y2VkPTIxCisgICAgQU1FRElBRk9STUFUX0tFWV9NUEVHX1VTRVJfREFUQTsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfTVBFRzJfU1RSRUFNX0hFQURFUjsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfT1BFUkFUSU5HX1JBVEU7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX1BDTV9CSUdfRU5ESUFOOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9QQ01fRU5DT0RJTkc7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1BSSU9SSVRZOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9QUk9GSUxFOyAjIHZhciBpbnRyb2R1Y2VkPTI4Ci0gICAgQU1FRElBRk9STUFUX0tFWV9QVVNIX0JMQU5LX0JVRkZFUlNfT05fU1RPUDsgIyB2YXIKLSAgICBBTUVESUFGT1JNQVRfS0VZX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9BRlRFUjsgIyB2YXIKKyAgICBBTUVESUFGT1JNQVRfS0VZX1BTU0g7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1BVU0hfQkxBTktfQlVGRkVSU19PTl9TVE9QOyAjIHZhciBpbnRyb2R1Y2VkPTIxCisgICAgQU1FRElBRk9STUFUX0tFWV9SRVBFQVRfUFJFVklPVVNfRlJBTUVfQUZURVI7ICMgdmFyIGludHJvZHVjZWQ9MjEKICAgICBBTUVESUFGT1JNQVRfS0VZX1JPVEFUSU9OOyAjIHZhciBpbnRyb2R1Y2VkPTI4Ci0gICAgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURTsgIyB2YXIKKyAgICBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFOyAjIHZhciBpbnRyb2R1Y2VkPTIxCisgICAgQU1FRElBRk9STUFUX0tFWV9TQVJfSEVJR0hUOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9TQVJfV0lEVEg7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1NFSTsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfU0xJQ0VfSEVJR0hUOyAjIHZhciBpbnRyb2R1Y2VkPTI4Ci0gICAgQU1FRElBRk9STUFUX0tFWV9TVFJJREU7ICMgdmFyCisgICAgQU1FRElBRk9STUFUX0tFWV9TVFJJREU7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9DT1VOVDsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfSUQ7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSSU5HOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9URVhUX0ZPUk1BVF9EQVRBOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfQ1NEX0hFVkM7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9IRUlHSFQ7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9USU1FOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfV0lEVEg7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RJVExFOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9USUxFX0hFSUdIVDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfVElMRV9XSURUSDsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUzsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSU5ERVg7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lEOyAjIHZhciBpbnRyb2R1Y2VkPTI4Ci0gICAgQU1FRElBRk9STUFUX0tFWV9XSURUSDsgIyB2YXIKKyAgICBBTUVESUFGT1JNQVRfS0VZX1ZBTElEX1NBTVBMRVM7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1dJRFRIOyAjIHZhciBpbnRyb2R1Y2VkPTIxCisgICAgQU1FRElBRk9STUFUX0tFWV9ZRUFSOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1lZGlhQ29kZWNBY3Rpb25Db2RlX2lzUmVjb3ZlcmFibGU7ICMgaW50cm9kdWNlZD0yOAogICAgIEFNZWRpYUNvZGVjQWN0aW9uQ29kZV9pc1RyYW5zaWVudDsgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2RlbGV0ZTsKQEAgLTEwMCw2ICsxNjgsNyBAQAogICAgIEFNZWRpYUNvZGVjX2RlcXVldWVJbnB1dEJ1ZmZlcjsKICAgICBBTWVkaWFDb2RlY19kZXF1ZXVlT3V0cHV0QnVmZmVyOwogICAgIEFNZWRpYUNvZGVjX2ZsdXNoOworICAgIEFNZWRpYUNvZGVjX2dldEJ1ZmZlckZvcm1hdDsgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQU1lZGlhQ29kZWNfZ2V0SW5wdXRCdWZmZXI7CiAgICAgQU1lZGlhQ29kZWNfZ2V0SW5wdXRGb3JtYXQ7ICMgaW50cm9kdWNlZD0yOAogICAgIEFNZWRpYUNvZGVjX2dldE5hbWU7ICMgaW50cm9kdWNlZD0yOApAQCAtMTMwLDYgKzE5OSw5IEBACiAgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRTaXplOyAgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRSZWFkQXQ7ICAgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRVc2VyZGF0YTsgIyBpbnRyb2R1Y2VkPTI4CisgICAgQU1lZGlhRGF0YVNvdXJjZV9uZXdVcmk7ICAgICAgIyBpbnRyb2R1Y2VkPTI5CisgICAgQU1lZGlhRGF0YVNvdXJjZV9jbG9zZTsgICAgICAgIyBpbnRyb2R1Y2VkPTI5CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRBdmFpbGFibGVTaXplOyAjIGludHJvZHVjZWQ9MjkKICAgICBBTWVkaWFEcm1fY2xvc2VTZXNzaW9uOwogICAgIEFNZWRpYURybV9jcmVhdGVCeVVVSUQ7CiAgICAgQU1lZGlhRHJtX2RlY3J5cHQ7CkBAIC0xNTEsNiArMjIzLDggQEAKICAgICBBTWVkaWFEcm1fc2V0T25FdmVudExpc3RlbmVyOwogICAgIEFNZWRpYURybV9zZXRQcm9wZXJ0eUJ5dGVBcnJheTsKICAgICBBTWVkaWFEcm1fc2V0UHJvcGVydHlTdHJpbmc7CisgICAgQU1lZGlhRHJtX3NldE9uRXhwaXJhdGlvblVwZGF0ZUxpc3RlbmVyOyAjIGludHJvZHVjZWQ9MjkKKyAgICBBTWVkaWFEcm1fc2V0T25LZXlzQ2hhbmdlTGlzdGVuZXI7ICMgaW50cm9kdWNlZD0yOQogICAgIEFNZWRpYURybV9zaWduOwogICAgIEFNZWRpYURybV92ZXJpZnk7CiAgICAgQU1lZGlhRXh0cmFjdG9yX2FkdmFuY2U7CkBAIC0xNzQsNiArMjQ4LDggQEAKICAgICBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUN1c3RvbTsgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VGZDsKICAgICBBTWVkaWFFeHRyYWN0b3JfdW5zZWxlY3RUcmFjazsKKyAgICBBTWVkaWFGb3JtYXRfY2xlYXI7ICMgaW50cm9kdWNlZD0yOQorICAgIEFNZWRpYUZvcm1hdF9jb3B5OyAjIGludHJvZHVjZWQ9MjkKICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlOwogICAgIEFNZWRpYUZvcm1hdF9nZXRCdWZmZXI7CiAgICAgQU1lZGlhRm9ybWF0X2dldERvdWJsZTsgIyBpbnRyb2R1Y2VkPTI4CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvdGVzdHMvQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdC5jcHAgYi9tZWRpYS9uZGsvdGVzdHMvQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2NTA2NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL25kay90ZXN0cy9BSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0LmNwcApAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrSW1hZ2VSZWFkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtJbWFnZS5oPgorI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvTmRrSW1hZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL0FJbWFnZVJlYWRlclV0aWxzLmg+CisjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxndWkvYnVmZmVycXVldWUvMS4wL0gyQkdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPE5ka0ltYWdlUmVhZGVyUHJpdi5oPgorI2luY2x1ZGUgPHZuZGsvaGFyZHdhcmVfYnVmZmVyLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIEhHcmFwaGljQnVmZmVyUHJvZHVjZXIgPSBoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjoKKyAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3VzaW5nIGhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OnV0aWxzOjpIMkJHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit1c2luZyBhaW1nOjpBSW1hZ2VSZWFkZXJfZ2V0SEdCUEZyb21IYW5kbGU7CisKK3R5cGVkZWYgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBRdWV1ZUJ1ZmZlcklucHV0OwordHlwZWRlZiBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCBRdWV1ZUJ1ZmZlck91dHB1dDsKKworc3RhdGljIGNvbnN0ZXhwciB1aW50NjRfdCBrSW1hZ2VCdWZmZXJVc2FnZSA9CisgICAgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0NQVV9XUklURV9PRlRFTjsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtJbWFnZVdpZHRoID0gNjQwOworc3RhdGljIGNvbnN0ZXhwciBpbnQga0ltYWdlSGVpZ2h0ID0gNDgwOworc3RhdGljIGNvbnN0ZXhwciBpbnQga0ltYWdlRm9ybWF0ID0gQUlNQUdFX0ZPUk1BVF9SR0JBXzg4ODg7CitzdGF0aWMgY29uc3RleHByIGludCBrTWF4SW1hZ2VzID0gMTsKKworc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtRdWV1ZUJ1ZmZlcklucHV0VGltZVN0YW1wID0gMTM4NDg4ODYxMTsKK3N0YXRpYyBjb25zdGV4cHIgYm9vbCBrUXVldWVCdWZmZXJJbnB1dElzQXV0b1RpbWVTdGFtcCA9IGZhbHNlOworc3RhdGljIGNvbnN0ZXhwciBhbmRyb2lkX2RhdGFzcGFjZSBrUXVldWVCdWZmZXJJbnB1dERhdGFzcGFjZSA9IEhBTF9EQVRBU1BBQ0VfVU5LTk9XTjsKK3N0YXRpYyBjb25zdCBSZWN0IGtRdWV1ZUJ1ZmZlcklucHV0UmVjdCA9IFJlY3Qoa0ltYWdlV2lkdGgsIGtJbWFnZUhlaWdodCk7CitzdGF0aWMgY29uc3RleHByIGludCBrUXVldWVCdWZmZXJJbnB1dFNjYWxpbmdNb2RlID0gMDsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtRdWV1ZUJ1ZmZlcklucHV0VHJhbnNmb3JtID0gMDsKK3N0YXRpYyBjb25zdCBzcDxGZW5jZT4ga1F1ZXVlQnVmZmVySW5wdXRGZW5jZSA9IEZlbmNlOjpOT19GRU5DRTsKKworc3RhdGljIGNvbnN0ZXhwciBpbnQga09uSW1hZ2VBdmFpbGFibGVXYWl0VXMgPSAxMDAgKiAxMDAwOworCitjbGFzcyBBSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgICBwdWJsaWM6CisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgQUltYWdlUmVhZGVyX25ld1dpdGhVc2FnZShrSW1hZ2VXaWR0aCwga0ltYWdlSGVpZ2h0LCBrSW1hZ2VGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0ltYWdlQnVmZmVyVXNhZ2UgLCBrTWF4SW1hZ2VzLCAmaW1hZ2VSZWFkZXJfKTsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0gQU1FRElBX0VSUk9SX1VOS05PV047CisgICAgICAgIEFTU0VSVF9ORShpbWFnZVJlYWRlcl8sIG51bGxwdHIpOworICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfc2V0SW1hZ2VMaXN0ZW5lcihpbWFnZVJlYWRlcl8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWFnZVJlYWRlckF2YWlsYWJsZUNiXyk7CisgICAgICAgIEFTU0VSVF9FUShyZXQsIEFNRURJQV9PSyk7CisgICAgICAgIHJldCA9IEFJbWFnZVJlYWRlcl9zZXRCdWZmZXJSZW1vdmVkTGlzdGVuZXIoaW1hZ2VSZWFkZXJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbWFnZVJlYWRlckRldGFjaGVkQ2JfKTsKKyAgICAgICAgQVNTRVJUX0VRKHJldCwgQU1FRElBX09LKTsKKyAgICB9CisgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKGltYWdlUmVhZGVyXykgeworICAgICAgICAgICAgQUltYWdlUmVhZGVyX2RlbGV0ZShpbWFnZVJlYWRlcl8pOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBIYW5kbGVJbWFnZUF2YWlsYWJsZSgpIHsKKyAgICAgICAgQUltYWdlICpvdXRJbWFnZSA9IG51bGxwdHI7CisgICAgICAgIG1lZGlhX3N0YXR1c190IHJldCA9IEFNRURJQV9PSzsKKyAgICAgICAgYXV0byBpbWFnZURlbGV0ZXIgPSBbXShBSW1hZ2UgKmltZykgeyBBSW1hZ2VfZGVsZXRlKGltZyk7IH07CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBSW1hZ2UsIGRlY2x0eXBlKGltYWdlRGVsZXRlcik+IGltZyhudWxscHRyLCBpbWFnZURlbGV0ZXIpOworCisgICAgICAgIC8vIFRlc3QgdGhhdCB0aGUgaW1hZ2UgY2FuIGJlIGFjcXVpcmVkLgorICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfYWNxdWlyZU5leHRJbWFnZShpbWFnZVJlYWRlcl8sICZvdXRJbWFnZSk7CisgICAgICAgIEFTU0VSVF9FUShyZXQsIEFNRURJQV9PSyk7CisgICAgICAgIGltZy5yZXNldChvdXRJbWFnZSk7CisgICAgICAgIEFTU0VSVF9ORShpbWcsIG51bGxwdHIpOworCisgICAgICAgIC8vIFRlc3QgdGhhdCB3ZSBjYW4gZ2V0IGEgaGFuZGxlIHRvIHRoZSBpbWFnZSdzIGhhcmR3YXJlIGJ1ZmZlciBhbmQgYQorICAgICAgICAvLyBuYXRpdmUgaGFuZGxlIHRvIGl0LgorICAgICAgICBBSGFyZHdhcmVCdWZmZXIgKmhhcmR3YXJlQnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgcmV0ID0gQUltYWdlX2dldEhhcmR3YXJlQnVmZmVyKGltZy5nZXQoKSwgJmhhcmR3YXJlQnVmZmVyKTsKKyAgICAgICAgQVNTRVJUX0VRKHJldCwgQU1FRElBX09LKTsKKyAgICAgICAgQVNTRVJUX05FKGhhcmR3YXJlQnVmZmVyLCBudWxscHRyKTsKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaCA9IEFIYXJkd2FyZUJ1ZmZlcl9nZXROYXRpdmVIYW5kbGUoaGFyZHdhcmVCdWZmZXIpOworICAgICAgICBBU1NFUlRfTkUobmgsIG51bGxwdHIpOworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2soaW1hZ2VBdmFpbGFibGVNdXRleF8pOworICAgICAgICBpbWFnZUF2YWlsYWJsZV8gPSB0cnVlOworICAgICAgICBpbWFnZUNvbmRWYXJfLm5vdGlmeV9vbmUoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBvbkltYWdlQXZhaWxhYmxlKHZvaWQgKmNvbnRleHQsIEFJbWFnZVJlYWRlciAqcmVhZGVyKSB7CisgICAgICAgICh2b2lkKXJlYWRlcjsKKyAgICAgICAgQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdCAqdGhpc0NvbnRleHQgPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxBSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0ICo+KGNvbnRleHQpOworICAgICAgICB0aGlzQ29udGV4dC0+SGFuZGxlSW1hZ2VBdmFpbGFibGUoKTsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBvbkJ1ZmZlclJlbW92ZWQodm9pZCAqLCBBSW1hZ2VSZWFkZXIgKiwgQUhhcmR3YXJlQnVmZmVyICopIHsKKyAgICB9CisKKyAgICBBSW1hZ2VSZWFkZXIgKmltYWdlUmVhZGVyXyA9IG51bGxwdHI7CisgICAgQUltYWdlUmVhZGVyX0ltYWdlTGlzdGVuZXIgaW1hZ2VSZWFkZXJBdmFpbGFibGVDYl97dGhpcywgb25JbWFnZUF2YWlsYWJsZX07CisgICAgQUltYWdlUmVhZGVyX0J1ZmZlclJlbW92ZWRMaXN0ZW5lciBpbWFnZVJlYWRlckRldGFjaGVkQ2Jfe3RoaXMsIG9uQnVmZmVyUmVtb3ZlZH07CisgICAgc3RkOjptdXRleCBpbWFnZUF2YWlsYWJsZU11dGV4XzsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBpbWFnZUNvbmRWYXJfOworICAgIGJvb2wgaW1hZ2VBdmFpbGFibGVfID0gZmFsc2U7Cit9OworCitzdGF0aWMgdm9pZCBmaWxsUkdCQThCdWZmZXIodWludDhfdCogYnVmLCBpbnQgdywgaW50IGgsIGludCBzdHJpZGUpIHsKKyAgICBjb25zdCBzaXplX3QgUElYRUxfU0laRSA9IDQ7CisgICAgZm9yIChpbnQgeCA9IDA7IHggPCB3OyB4KyspIHsKKyAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBoOyB5KyspIHsKKyAgICAgICAgICAgIG9mZl90IG9mZnNldCA9ICh5ICogc3RyaWRlICsgeCkgKiBQSVhFTF9TSVpFOworICAgICAgICAgICAgZm9yIChpbnQgYyA9IDA7IGMgPCA0OyBjKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgcGFyaXR5WCA9ICh4IC8gKDEgPDwgKGMrMikpKSAmIDE7CisgICAgICAgICAgICAgICAgaW50IHBhcml0eVkgPSAoeSAvICgxIDw8IChjKzIpKSkgJiAxOworICAgICAgICAgICAgICAgIGJ1ZltvZmZzZXQgKyBjXSA9IChwYXJpdHlYIF4gcGFyaXR5WSkgPyAyMzEgOiAzNTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworVEVTVF9GKEFJbWFnZVJlYWRlcldpbmRvd0hhbmRsZVRlc3QsIENyZWF0ZVdpbmRvd05hdGl2ZUhhbmRsZSkgeworICAgIC8vIENoZWNrIHRoYXQgd2UgY2FuIGNyZWF0ZSBhIG5hdGl2ZV9oYW5kbGVfdCBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAgIC8vIEFJbWFnZVJlYWRlci4KKyAgICBuYXRpdmVfaGFuZGxlX3QgKm5oID0gbnVsbHB0cjsKKyAgICBBSW1hZ2VSZWFkZXJfZ2V0V2luZG93TmF0aXZlSGFuZGxlKGltYWdlUmVhZGVyXywgJm5oKTsKKyAgICBBU1NFUlRfTkUobmgsIG51bGxwdHIpOworCisgICAgLy8gQ2hlY2sgdGhhdCB0aGVyZSBhcmUgb25seSBpbnRzIGluIHRoZSBoYW5kbGUuCisgICAgQVNTRVJUX0VRKG5oLT5udW1GZHMsIDApOworICAgIEFTU0VSVF9ORShuaC0+bnVtSW50cywgMCk7CisKKyAgICAvLyBDaGVjayB0aGF0IHRoZSBIR0JQIGNhbiBiZSByZXRyaWV2ZWQgZnJvbSB0aGUgaGFuZGxlLgorICAgIHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGhnYnAgPSAgQUltYWdlUmVhZGVyX2dldEhHQlBGcm9tSGFuZGxlKG5oKTsKKyAgICBBU1NFUlRfTkUoaGdicCwgbnVsbHB0cik7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gaWdicCA9IG5ldyBIMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIoaGdicCk7CisgICAgaW50IGRlcXVldWVkU2xvdCA9IC0xOworICAgIHNwPEZlbmNlPiBkZXF1ZXVlZEZlbmNlOworICAgIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IG91dHB1dDsKKyAgICBBU1NFUlRfRVEoT0ssIGlnYnAtPmNvbm5lY3QobnVsbHB0ciwgTkFUSVZFX1dJTkRPV19BUElfQ1BVLCBmYWxzZSwgJm91dHB1dCkpOworCisgICAgLy8gVGVzdCB0aGF0IHdlIGNhbiBkZXF1ZXVlIGEgYnVmZmVyLgorICAgIEFTU0VSVF9FUShPSywKKyAgICAgICAgICAgICAgfklHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkJVRkZFUl9ORUVEU19SRUFMTE9DQVRJT04gJgorICAgICAgICAgICAgICAgICAgICAgIChpZ2JwLT5kZXF1ZXVlQnVmZmVyKCZkZXF1ZXVlZFNsb3QsICZkZXF1ZXVlZEZlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtJbWFnZVdpZHRoLCBrSW1hZ2VIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0ltYWdlRm9ybWF0LCBrSW1hZ2VCdWZmZXJVc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCBudWxscHRyKSkpOworICAgIEVYUEVDVF9MRSgwLCBkZXF1ZXVlZFNsb3QpOworICAgIEVYUEVDVF9HVChCdWZmZXJRdWV1ZTo6TlVNX0JVRkZFUl9TTE9UUywgZGVxdWV1ZWRTbG90KTsKKworICAgIHNwPEdyYXBoaWNCdWZmZXI+IGRlcXVldWVkQnVmZmVyOworICAgIGlnYnAtPnJlcXVlc3RCdWZmZXIoZGVxdWV1ZWRTbG90LCAmZGVxdWV1ZWRCdWZmZXIpOworICAgIHVpbnQ4X3QqIGltZyA9IG51bGxwdHI7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBkZXF1ZXVlZEJ1ZmZlci0+bG9jayhrSW1hZ2VCdWZmZXJVc2FnZSwgKHZvaWQqKikoJmltZykpKTsKKworICAgIC8vIFdyaXRlIGluIHNvbWUgZHVtbXkgaW1hZ2UgZGF0YS4KKyAgICBmaWxsUkdCQThCdWZmZXIoaW1nLCBkZXF1ZXVlZEJ1ZmZlci0+Z2V0V2lkdGgoKSwgZGVxdWV1ZWRCdWZmZXItPmdldEhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICBkZXF1ZXVlZEJ1ZmZlci0+Z2V0U3RyaWRlKCkpOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgZGVxdWV1ZWRCdWZmZXItPnVubG9jaygpKTsKKyAgICBRdWV1ZUJ1ZmZlcklucHV0IHF1ZXVlQnVmZmVySW5wdXQoa1F1ZXVlQnVmZmVySW5wdXRUaW1lU3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtRdWV1ZUJ1ZmZlcklucHV0SXNBdXRvVGltZVN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUXVldWVCdWZmZXJJbnB1dERhdGFzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1F1ZXVlQnVmZmVySW5wdXRSZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUXVldWVCdWZmZXJJbnB1dFNjYWxpbmdNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUXVldWVCdWZmZXJJbnB1dFRyYW5zZm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1F1ZXVlQnVmZmVySW5wdXRGZW5jZSk7CisgICAgUXVldWVCdWZmZXJPdXRwdXQgcXVldWVCdWZmZXJPdXRwdXQ7CisgICAgQVNTRVJUX0VRKE9LLCBpZ2JwLT5xdWV1ZUJ1ZmZlcihkZXF1ZXVlZFNsb3QsIHF1ZXVlQnVmZmVySW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcXVldWVCdWZmZXJPdXRwdXQpKTsKKyAgICAvLyB3YWl0IHVudGlsIHRoZSBvbkltYWdlQXZhaWxhYmxlIGNhbGxiYWNrIGlzIGNhbGxlZCwgb3IgdGltZW91dCBjb21wbGV0ZXMuCisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGltYWdlQXZhaWxhYmxlTXV0ZXhfKTsKKyAgICBpbWFnZUNvbmRWYXJfLndhaXRfZm9yKGxvY2ssIHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHMoa09uSW1hZ2VBdmFpbGFibGVXYWl0VXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW3RoaXNdeyByZXR1cm4gdGhpcy0+aW1hZ2VBdmFpbGFibGVfO30pOworICAgIEVYUEVDVF9UUlVFKGltYWdlQXZhaWxhYmxlXykgPDwgICJUaW1lZCBvdXQgd2FpdGluZyBmb3IgaW1hZ2UgZGF0YSB0byBiZSBoYW5kbGVkIVxuIjsKK30KKworY2xhc3MgQUltYWdlUmVhZGVyUHJpdmF0ZUZvcm1hdFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyAgcHVibGljOgorICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIGF1dG8gc3RhdHVzID0gQUltYWdlUmVhZGVyX25ldyhrSW1hZ2VXaWR0aCwga0ltYWdlSGVpZ2h0LCBBSU1BR0VfRk9STUFUX1JBV19ERVBUSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtNYXhJbWFnZXMsICZpbWdSZWFkZXIpOworICAgICAgICBFWFBFQ1RfVFJVRShzdGF0dXMgPT0gQU1FRElBX09LKTsKKyAgICB9CisKKyAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAoaW1nUmVhZGVyKSB7CisgICAgICAgICAgICBBSW1hZ2VSZWFkZXJfZGVsZXRlKGltZ1JlYWRlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgQUltYWdlUmVhZGVyICppbWdSZWFkZXIgPSBudWxscHRyOworfTsKKworVEVTVF9GKEFJbWFnZVJlYWRlclByaXZhdGVGb3JtYXRUZXN0LCBDcmVhdGVUZXN0KSB7CisgICAgRVhQRUNUX1RSVUUoaW1nUmVhZGVyICE9IG51bGxwdHIpOworfQorCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5jcHAgYi9tZWRpYS91dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk3YzM0MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL0FJbWFnZVJlYWRlclV0aWxzLmNwcApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGNtYXRoPgorCisjaW5jbHVkZSA8bWVkaWF1dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5oPgorI2luY2x1ZGUgPGhpZGwvSHlicmlkSW50ZXJmYWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaW1nIHsKKwordXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVjOworCitzdGF0aWMgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gY29udmVydE5hdGl2ZUhhbmRsZVRvSEdCUCAoCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKSB7CisgICAgLy8gUmVhZCB0aGUgc2l6ZSBvZiB0aGUgaGFsVG9rZW4gdmVjPHVpbnQ4X3Q+CisgICAgaGlkbF92ZWM8dWludDhfdD4gaGFsVG9rZW47CisgICAgaGFsVG9rZW4uc2V0VG9FeHRlcm5hbCgKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KGNvbnN0X2Nhc3Q8aW50ICo+KCYoaGFuZGxlLT5kYXRhWzFdKSkpLAorICAgICAgICBoYW5kbGUtPmRhdGFbMF0pOworICAgIHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGhnYnAgPQorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpjYXN0RnJvbShyZXRyaWV2ZUhhbEludGVyZmFjZShoYWxUb2tlbikpOworICAgIHJldHVybiBoZ2JwOworfQorCitzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBBSW1hZ2VSZWFkZXJfZ2V0SEdCUEZyb21IYW5kbGUoCisgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUpIHsKKyAgICBpZiAoaGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGlmIChoYW5kbGUtPm51bUZkcyAhPSAwICB8fAorICAgICAgICBoYW5kbGUtPm51bUludHMgPCBzdGQ6OmNlaWwoc2l6ZW9mKHNpemVfdCkgLyBzaXplb2YoaW50KSkpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBjb252ZXJ0TmF0aXZlSGFuZGxlVG9IR0JQKGhhbmRsZSk7Cit9CisKK30gLy9uYW1lc3BhY2UgYWltZworfSAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9BbmRyb2lkLmJwIGIvbWVkaWEvdXRpbHMvQW5kcm9pZC5icAppbmRleCBkNmRhZTViLi4zYWRiNDBmIDEwMDY0NAotLS0gYS9tZWRpYS91dGlscy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL3V0aWxzL0FuZHJvaWQuYnAKQEAgLTE2LDI1ICsxNiw0MyBAQAogICAgIG5hbWU6ICJsaWJtZWRpYXV0aWxzIiwKIAogICAgIHNyY3M6IFsKKyAgICAgICAgIkFJbWFnZVJlYWRlclV0aWxzLmNwcCIsCiAgICAgICAgICJCYXR0ZXJ5Tm90aWZpZXIuY3BwIiwKICAgICAgICAgIklTY2hlZHVsaW5nUG9saWN5U2VydmljZS5jcHAiLAogICAgICAgICAiTWVtb3J5TGVha1RyYWNrVXRpbC5jcHAiLAogICAgICAgICAiUHJvY2Vzc0luZm8uY3BwIiwKICAgICAgICAgIlNjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmNwcCIsCisgICAgICAgICJTZXJ2aWNlVXRpbGl0aWVzLmNwcCIsCisgICAgICAgICJUaW1lQ2hlY2suY3BwIiwKICAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYm1lbXVucmVhY2hhYmxlIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC50b2tlbkAxLjAtdXRpbHMiLAogICAgIF0sCiAKKyAgICBsb2d0YWdzOiBbIkV2ZW50TG9nVGFncy5sb2d0YWdzIl0sCisKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XYWxsIiwKICAgICAgICAgIi1XZXh0cmEiLAogICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKIAorICAgIHByb2R1Y3RfdmFyaWFibGVzOiB7CisgICAgICAgIHByb2R1Y3RfaXNfaW90OiB7CisgICAgICAgICAgICBjZmxhZ3M6IFsiLURUQVJHRVRfQU5EUk9JRF9USElOR1MiXSwKKyAgICAgICAgfSwKKyAgICB9LAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgIC8vIEZvciBhbmRyb2lkX21hbGxvcHQgZGVmaW5pdGlvbnMuCisgICAgICAgICJiaW9uaWMvbGliYy9wcml2YXRlIgorICAgIF0sCiAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL0V2ZW50TG9nVGFncy5sb2d0YWdzIGIvbWVkaWEvdXRpbHMvRXZlbnRMb2dUYWdzLmxvZ3RhZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdmMGVhOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL0V2ZW50TG9nVGFncy5sb2d0YWdzCkBAIC0wLDAgKzEsNDEgQEAKKyMgVGhlIGVudHJpZXMgaW4gdGhpcyBmaWxlIG1hcCBhIHNwYXJzZSBzZXQgb2YgbG9nIHRhZyBudW1iZXJzIHRvIHRhZyBuYW1lcy4KKyMgVGhpcyBpcyBpbnN0YWxsZWQgb24gdGhlIGRldmljZSwgaW4gL3N5c3RlbS9ldGMsIGFuZCBwYXJzZWQgYnkgbG9nY2F0LgorIworIyBUYWcgbnVtYmVycyBhcmUgZGVjaW1hbCBpbnRlZ2VycywgZnJvbSAwIHRvIDJeMzEuICAoTGV0J3MgbGVhdmUgdGhlCisjIG5lZ2F0aXZlIHZhbHVlcyBhbG9uZSBmb3Igbm93LikKKyMKKyMgVGFnIG5hbWVzIGFyZSBvbmUgb3IgbW9yZSBBU0NJSSBsZXR0ZXJzIGFuZCBudW1iZXJzIG9yIHVuZGVyc2NvcmVzLCBpLmUuCisjICJbQS1aXVthLXpdWzAtOV1fIi4gIERvIG5vdCBpbmNsdWRlIHNwYWNlcyBvciBwdW5jdHVhdGlvbiAodGhlIGZvcm1lcgorIyBpbXBhY3RzIGxvZyByZWFkYWJpbGl0eSwgdGhlIGxhdHRlciBtYWtlcyByZWdleCBzZWFyY2hlcyBtb3JlIGFubm95aW5nKS4KKyMKKyMgVGFnIG51bWJlcnMgYW5kIG5hbWVzIGFyZSBzZXBhcmF0ZWQgYnkgd2hpdGVzcGFjZS4gIEJsYW5rIGxpbmVzIGFuZCBsaW5lcworIyBzdGFydGluZyB3aXRoICcjJyBhcmUgaWdub3JlZC4KKyMKKyMgT3B0aW9uYWxseSwgYWZ0ZXIgdGhlIHRhZyBuYW1lcyBjYW4gYmUgcHV0IGEgZGVzY3JpcHRpb24gZm9yIHRoZSB2YWx1ZShzKQorIyBvZiB0aGUgdGFnLiBEZXNjcmlwdGlvbiBhcmUgaW4gdGhlIGZvcm1hdAorIyAgICAoPG5hbWU+fGRhdGEgdHlwZVt8ZGF0YSB1bml0XSkKKyMgTXVsdGlwbGUgdmFsdWVzIGFyZSBzZXBhcmF0ZWQgYnkgY29tbWFzLgorIworIyBUaGUgZGF0YSB0eXBlIGlzIGEgbnVtYmVyIGZyb20gdGhlIGZvbGxvd2luZyB2YWx1ZXM6CisjIDE6IGludAorIyAyOiBsb25nCisjIDM6IHN0cmluZworIyA0OiBsaXN0CisjCisjIFRoZSBkYXRhIHVuaXQgaXMgYSBudW1iZXIgdGFrZW4gZnJvbSB0aGUgZm9sbG93aW5nIGxpc3Q6CisjIDE6IE51bWJlciBvZiBvYmplY3RzCisjIDI6IE51bWJlciBvZiBieXRlcworIyAzOiBOdW1iZXIgb2YgbWlsbGlzZWNvbmRzCisjIDQ6IE51bWJlciBvZiBhbGxvY2F0aW9ucworIyA1OiBJZAorIyA2OiBQZXJjZW50CisjIERlZmF1bHQgdmFsdWUgZm9yIGRhdGEgb2YgdHlwZSBpbnQvbG9uZyBpcyAyIChieXRlcykuCisjCisjIFNlZSBzeXN0ZW0vY29yZS9sb2djYXQvZXZlbnQubG9ndGFncyBmb3IgdGhlIG1hc3RlciBjb3B5IG9mIHRoZSB0YWdzLgorCisjIDYxMDAwIC0gNjExOTkgcmVzZXJ2ZWQgZm9yIGF1ZGlvc2VydmVyCisKKzYxMDAwIGF1ZGlvc2VydmVyX2JpbmRlcl90aW1lb3V0IChjb21tYW5kfDMpCisKKyMgTk9URSAtIHRoZSByYW5nZSAxMDAwMDAwLTIwMDAwMDAgaXMgcmVzZXJ2ZWQgZm9yIHBhcnRuZXJzIGFuZCBvdGhlcnMgd2hvCisjIHdhbnQgdG8gZGVmaW5lIHRoZWlyIG93biBsb2cgdGFncyB3aXRob3V0IGNvbmZsaWN0aW5nIHdpdGggdGhlIGNvcmUgcGxhdGZvcm0uCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9NZW1vcnlMZWFrVHJhY2tVdGlsLmNwcCBiL21lZGlhL3V0aWxzL01lbW9yeUxlYWtUcmFja1V0aWwuY3BwCmluZGV4IDE4ZjVmMjUuLjI5ODhiNTIgMTAwNjQ0Ci0tLSBhL21lZGlhL3V0aWxzL01lbW9yeUxlYWtUcmFja1V0aWwuY3BwCisrKyBiL21lZGlhL3V0aWxzL01lbW9yeUxlYWtUcmFja1V0aWwuY3BwCkBAIC0yMiw2ICsyMiw4IEBACiAjaW5jbHVkZSAibWVkaWEvTWVtb3J5TGVha1RyYWNrVXRpbC5oIgogI2luY2x1ZGUgPHNzdHJlYW0+CiAKKyNpbmNsdWRlIDxiaW9uaWNfbWFsbG9jLmg+CisKIC8qCiAgKiBUaGUgY29kZSBoZXJlIG9yaWdpbmFsbHkgcmVzaWRlZCBpbiBNZWRpYVBsYXllclNlcnZpY2UuY3BwCiAgKi8KQEAgLTQ3LDI5ICs0OSwyMiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWV4dGVybiAiQyIgdm9pZCBnZXRfbWFsbG9jX2xlYWtfaW5mbyh1aW50OF90KiogaW5mbywgc2l6ZV90KiBvdmVyYWxsU2l6ZSwKLSAgICAgICAgc2l6ZV90KiBpbmZvU2l6ZSwgc2l6ZV90KiB0b3RhbE1lbW9yeSwgc2l6ZV90KiBiYWNrdHJhY2VTaXplKTsKLQotZXh0ZXJuICJDIiB2b2lkIGZyZWVfbWFsbG9jX2xlYWtfaW5mbyh1aW50OF90KiBpbmZvKTsKLQogc3RkOjpzdHJpbmcgZHVtcE1lbW9yeUFkZHJlc3NlcyhzaXplX3QgbGltaXQpCiB7Ci0gICAgdWludDhfdCAqaW5mbzsKLSAgICBzaXplX3Qgb3ZlcmFsbFNpemU7Ci0gICAgc2l6ZV90IGluZm9TaXplOwotICAgIHNpemVfdCB0b3RhbE1lbW9yeTsKLSAgICBzaXplX3QgYmFja3RyYWNlU2l6ZTsKLSAgICBnZXRfbWFsbG9jX2xlYWtfaW5mbygmaW5mbywgJm92ZXJhbGxTaXplLCAmaW5mb1NpemUsICZ0b3RhbE1lbW9yeSwgJmJhY2t0cmFjZVNpemUpOworICAgIGFuZHJvaWRfbWFsbG9wdF9sZWFrX2luZm9fdCBsZWFrX2luZm87CisgICAgaWYgKCFhbmRyb2lkX21hbGxvcHQoTV9HRVRfTUFMTE9DX0xFQUtfSU5GTywgJmxlYWtfaW5mbywgc2l6ZW9mKGxlYWtfaW5mbykpKSB7CisgICAgICByZXR1cm4gIiI7CisgICAgfQogCiAgICAgc2l6ZV90IGNvdW50OwotICAgIGlmIChpbmZvID09IG51bGxwdHIgfHwgb3ZlcmFsbFNpemUgPT0gMCB8fCBpbmZvU2l6ZSA9PSAwCi0gICAgICAgICAgICB8fCAoY291bnQgPSBvdmVyYWxsU2l6ZSAvIGluZm9TaXplKSA9PSAwKSB7CisgICAgaWYgKGxlYWtfaW5mby5idWZmZXIgPT0gbnVsbHB0ciB8fCBsZWFrX2luZm8ub3ZlcmFsbF9zaXplID09IDAgfHwgbGVha19pbmZvLmluZm9fc2l6ZSA9PSAwCisgICAgICAgICAgICB8fCAoY291bnQgPSBsZWFrX2luZm8ub3ZlcmFsbF9zaXplIC8gbGVha19pbmZvLmluZm9fc2l6ZSkgPT0gMCkgewogICAgICAgICBBTE9HRCgibm8gbWFsbG9jIGluZm8sIGxpYmMuZGVidWcubWFsbG9jLnByb2dyYW0gcHJvcGVydHkgc2hvdWxkIGJlIHNldCIpOwotICAgICAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKKyAgICAgICAgcmV0dXJuICIiOwogICAgIH0KIAogICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7Ci0gICAgb3NzIDw8IHRvdGFsTWVtb3J5IDw8ICIgYnl0ZXMgaW4gIiA8PCBjb3VudCA8PCAiIGFsbG9jYXRpb25zXG4iOworICAgIG9zcyA8PCBsZWFrX2luZm8udG90YWxfbWVtb3J5IDw8ICIgYnl0ZXMgaW4gIiA8PCBjb3VudCA8PCAiIGFsbG9jYXRpb25zXG4iOwogICAgIG9zcyA8PCAiICBBQkk6ICciIEFCSV9TVFJJTkcgIiciIDw8ICJcblxuIjsKICAgICBpZiAoY291bnQgPiBsaW1pdCkgY291bnQgPSBsaW1pdDsKIApAQCAtODMsMTQgKzc4LDE0IEBACiAgICAgICAgICAgICB1aW50cHRyX3QgYmFja3RyYWNlW107CiAgICAgICAgIH07CiAKLSAgICAgICAgY29uc3QgQWxsb2NFbnRyeSAqIGNvbnN0IGUgPSAoQWxsb2NFbnRyeSAqKShpbmZvICsgaSAqIGluZm9TaXplKTsKKyAgICAgICAgY29uc3QgQWxsb2NFbnRyeSAqIGNvbnN0IGUgPSAoQWxsb2NFbnRyeSAqKShsZWFrX2luZm8uYnVmZmVyICsgaSAqIGxlYWtfaW5mby5pbmZvX3NpemUpOwogCiAgICAgICAgIG9zcyA8PCAoZS0+c2l6ZSAqIGUtPmFsbG9jYXRpb25zKQogICAgICAgICAgICAgICAgIDw8ICIgYnl0ZXMgKCAiIDw8IGUtPnNpemUgPDwgIiBieXRlcyAqICIgPDwgZS0+YWxsb2NhdGlvbnMgPDwgIiBhbGxvY2F0aW9ucyApXG4iOwotICAgICAgICBvc3MgPDwgYmFja3RyYWNlX3N0cmluZyhlLT5iYWNrdHJhY2UsIGJhY2t0cmFjZVNpemUpIDw8ICJcbiI7CisgICAgICAgIG9zcyA8PCBiYWNrdHJhY2Vfc3RyaW5nKGUtPmJhY2t0cmFjZSwgbGVha19pbmZvLmJhY2t0cmFjZV9zaXplKSA8PCAiXG4iOwogICAgIH0KICAgICBvc3MgPDwgIlxuIjsKLSAgICBmcmVlX21hbGxvY19sZWFrX2luZm8oaW5mbyk7CisgICAgYW5kcm9pZF9tYWxsb3B0KE1fRlJFRV9NQUxMT0NfTEVBS19JTkZPLCAmbGVha19pbmZvLCBzaXplb2YobGVha19pbmZvKSk7CiAgICAgcmV0dXJuIG9zcy5zdHIoKTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvU2VydmljZVV0aWxpdGllcy5jcHAgYi9tZWRpYS91dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmZkZWFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvU2VydmljZVV0aWxpdGllcy5jcHAKQEAgLTAsMCArMSwzMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlNlcnZpY2VVdGlsaXRpZXMiCisKKyNpbmNsdWRlIDxiaW5kZXIvQXBwT3BzTWFuYWdlci5oPgorI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNhY2hlLmg+CisjaW5jbHVkZSAibWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmgiCisKKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKy8qIFdoZW4gcGVyZm9ybWluZyBwZXJtaXNzaW9uIGNoZWNrcyB3ZSBkbyBub3QgdXNlIHBlcm1pc3Npb24gY2FjaGUgZm9yCisgKiBydW50aW1lIHBlcm1pc3Npb25zIChwcm90ZWN0aW9uIGxldmVsIGRhbmdlcm91cykgYXMgdGhleSBtYXkgY2hhbmdlIGF0CisgKiBydW50aW1lLiBBbGwgb3RoZXIgcGVybWlzc2lvbnMgKHByb3RlY3Rpb24gbGV2ZWwgbm9ybWFsIGFuZCBkYW5nZXJvdXMpCisgKiBjYW4gYmUgY2FjaGVkIGFzIHRoZXkgbmV2ZXIgY2hhbmdlLiBPZiBjb3Vyc2UgYWxsIHBlcm1pc3Npb24gY2hlY2tlZAorICogaGVyZSBhcmUgcGxhdGZvcm0gZGVmaW5lZC4KKyAqLworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBTdHJpbmcxNiBzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbygiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQ09SRF9BVURJTyIpOworc3RhdGljIGNvbnN0IFN0cmluZzE2IHNNb2RpZnlQaG9uZVN0YXRlKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX1BIT05FX1NUQVRFIik7CitzdGF0aWMgY29uc3QgU3RyaW5nMTYgc01vZGlmeUF1ZGlvUm91dGluZygiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19ST1VUSU5HIik7CisKK3N0YXRpYyBTdHJpbmcxNiByZXNvbHZlQ2FsbGluZ1BhY2thZ2UoUGVybWlzc2lvbkNvbnRyb2xsZXImIHBlcm1pc3Npb25Db250cm9sbGVyLAorICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgdWlkX3QgdWlkKSB7CisgICAgaWYgKG9wUGFja2FnZU5hbWUuc2l6ZSgpID4gMCkgeworICAgICAgICByZXR1cm4gb3BQYWNrYWdlTmFtZTsKKyAgICB9CisgICAgLy8gSW4gc29tZSBjYXNlcyB0aGUgY2FsbGluZyBjb2RlIGhhcyBubyBhY2Nlc3MgdG8gdGhlIHBhY2thZ2UgaXQgcnVucyB1bmRlci4KKyAgICAvLyBGb3IgZXhhbXBsZSwgY29kZSB1c2luZyB0aGUgd2lsaGVsbSBmcmFtZXdvcmsncyBPcGVuU0wtRVMgQVBJcy4gSW4gdGhpcworICAgIC8vIGNhc2Ugd2Ugd2lsbCBnZXQgdGhlIHBhY2thZ2VzIGZvciB0aGUgY2FsbGluZyBVSUQgYW5kIHBpY2sgdGhlIGZpcnN0IG9uZQorICAgIC8vIGZvciBhdHRyaWJ1dGluZyB0aGUgYXBwIG9wLiBUaGlzIHdpbGwgd29yayBjb3JyZWN0bHkgZm9yIHJ1bnRpbWUgcGVybWlzc2lvbnMKKyAgICAvLyBhcyBmb3IgbGVnYWN5IGFwcHMgd2Ugd2lsbCB0b2dnbGUgdGhlIGFwcCBvcCBmb3IgYWxsIHBhY2thZ2VzIGluIHRoZSBVSUQuCisgICAgLy8gVGhlIGNhdmVhdCBpcyB0aGF0IHRoZSBvcGVyYXRpb24gbWF5IGJlIGF0dHJpYnV0ZWQgdG8gdGhlIHdyb25nIHBhY2thZ2UgYW5kCisgICAgLy8gc3RhdHMgYmFzZWQgb24gYXBwIG9wcyBtYXkgYmUgc2xpZ2h0bHkgb2ZmLgorICAgIFZlY3RvcjxTdHJpbmcxNj4gcGFja2FnZXM7CisgICAgcGVybWlzc2lvbkNvbnRyb2xsZXIuZ2V0UGFja2FnZXNGb3JVaWQodWlkLCBwYWNrYWdlcyk7CisgICAgaWYgKHBhY2thZ2VzLmlzRW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiTm8gcGFja2FnZXMgZm9yIHVpZCAlZCIsIHVpZCk7CisgICAgICAgIHJldHVybiBvcFBhY2thZ2VOYW1lOyAvLyBlbXB0eSBzdHJpbmcKKyAgICB9CisgICAgcmV0dXJuIHBhY2thZ2VzWzBdOworfQorCitzdGF0aWMgYm9vbCBjaGVja1JlY29yZGluZ0ludGVybmFsKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsCisgICAgICAgIHVpZF90IHVpZCwgYm9vbCBzdGFydCkgeworICAgIC8vIE9rYXkgdG8gbm90IHRyYWNrIGluIGFwcCBvcHMgYXMgYXVkaW8gc2VydmVyIGlzIHVzIGFuZCBpZgorICAgIC8vIGRldmljZSBpcyByb290ZWQgc2VjdXJpdHkgbW9kZWwgaXMgY29uc2lkZXJlZCBjb21wcm9taXNlZC4KKyAgICBpZiAoaXNBdWRpb1NlcnZlck9yUm9vdFVpZCh1aWQpKSByZXR1cm4gdHJ1ZTsKKworICAgIC8vIFdlIHNwZWNpZnkgYSBwaWQgYW5kIHVpZCBoZXJlIGFzIG1lZGlhc2VydmVyIChha2EgTWVkaWFSZWNvcmRlciBvciBTdGFnZUZyaWdodFJlY29yZGVyKQorICAgIC8vIG1heSBvcGVuIGEgcmVjb3JkIHRyYWNrIG9uIGJlaGFsZiBvZiBhIGNsaWVudC4gIE5vdGUgdGhhdCBwaWQgbWF5IGJlIGEgdGlkLgorICAgIC8vIElNUE9SVEFOVDogRE9OJ1QgVVNFIFBlcm1pc3Npb25DYWNoZSAtIFJVTlRJTUUgUEVSTUlTU0lPTlMgQ0hBTkdFLgorICAgIFBlcm1pc3Npb25Db250cm9sbGVyIHBlcm1pc3Npb25Db250cm9sbGVyOworICAgIGNvbnN0IGJvb2wgb2sgPSBwZXJtaXNzaW9uQ29udHJvbGxlci5jaGVja1Blcm1pc3Npb24oc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8sIHBpZCwgdWlkKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzICVzIiwgU3RyaW5nOChzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbykuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBTdHJpbmcxNiByZXNvbHZlZE9wUGFja2FnZU5hbWUgPSByZXNvbHZlQ2FsbGluZ1BhY2thZ2UoCisgICAgICAgICAgICBwZXJtaXNzaW9uQ29udHJvbGxlciwgb3BQYWNrYWdlTmFtZSwgdWlkKTsKKyAgICBpZiAocmVzb2x2ZWRPcFBhY2thZ2VOYW1lLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBBcHBPcHNNYW5hZ2VyIGFwcE9wczsKKyAgICBjb25zdCBpbnQzMl90IG9wID0gYXBwT3BzLnBlcm1pc3Npb25Ub09wQ29kZShzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbyk7CisgICAgaWYgKHN0YXJ0KSB7CisgICAgICAgIGlmIChhcHBPcHMuc3RhcnRPcE5vVGhyb3cob3AsIHVpZCwgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lLCAvKnN0YXJ0SWZNb2RlRGVmYXVsdCovIGZhbHNlKQorICAgICAgICAgICAgICAgICE9IEFwcE9wc01hbmFnZXI6Ok1PREVfQUxMT1dFRCkgeworICAgICAgICAgICAgQUxPR0UoIlJlcXVlc3QgZGVuaWVkIGJ5IGFwcCBvcDogJWQiLCBvcCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYXBwT3BzLmNoZWNrT3Aob3AsIHVpZCwgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lKSAhPSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0FMTE9XRUQpIHsKKyAgICAgICAgICAgIEFMT0dFKCJSZXF1ZXN0IGRlbmllZCBieSBhcHAgb3A6ICVkIiwgb3ApOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgcmVjb3JkaW5nQWxsb3dlZChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKKyAgICByZXR1cm4gY2hlY2tSZWNvcmRpbmdJbnRlcm5hbChvcFBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgLypzdGFydCovIGZhbHNlKTsKK30KKworYm9vbCBzdGFydFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKKyAgICAgcmV0dXJuIGNoZWNrUmVjb3JkaW5nSW50ZXJuYWwob3BQYWNrYWdlTmFtZSwgcGlkLCB1aWQsIC8qc3RhcnQqLyB0cnVlKTsKK30KKwordm9pZCBmaW5pc2hSZWNvcmRpbmcoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHVpZF90IHVpZCkgeworICAgIC8vIE9rYXkgdG8gbm90IHRyYWNrIGluIGFwcCBvcHMgYXMgYXVkaW8gc2VydmVyIGlzIHVzIGFuZCBpZgorICAgIC8vIGRldmljZSBpcyByb290ZWQgc2VjdXJpdHkgbW9kZWwgaXMgY29uc2lkZXJlZCBjb21wcm9taXNlZC4KKyAgICBpZiAoaXNBdWRpb1NlcnZlck9yUm9vdFVpZCh1aWQpKSByZXR1cm47CisKKyAgICBQZXJtaXNzaW9uQ29udHJvbGxlciBwZXJtaXNzaW9uQ29udHJvbGxlcjsKKyAgICBTdHJpbmcxNiByZXNvbHZlZE9wUGFja2FnZU5hbWUgPSByZXNvbHZlQ2FsbGluZ1BhY2thZ2UoCisgICAgICAgICAgICBwZXJtaXNzaW9uQ29udHJvbGxlciwgb3BQYWNrYWdlTmFtZSwgdWlkKTsKKyAgICBpZiAocmVzb2x2ZWRPcFBhY2thZ2VOYW1lLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBcHBPcHNNYW5hZ2VyIGFwcE9wczsKKyAgICBjb25zdCBpbnQzMl90IG9wID0gYXBwT3BzLnBlcm1pc3Npb25Ub09wQ29kZShzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbyk7CisgICAgYXBwT3BzLmZpbmlzaE9wKG9wLCB1aWQsIHJlc29sdmVkT3BQYWNrYWdlTmFtZSk7Cit9CisKK2Jvb2wgY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCkgeworICAgIGlmIChpc0F1ZGlvU2VydmVyT3JSb290VWlkKHVpZCkpIHJldHVybiB0cnVlOworICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQ2FwdHVyZUF1ZGlvT3V0cHV0KCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19PVVRQVVQiKTsKKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oc0NhcHR1cmVBdWRpb091dHB1dCwgcGlkLCB1aWQpOworICAgIGlmICghb2spIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX09VVFBVVCIpOworICAgIHJldHVybiBvazsKK30KKworYm9vbCBjYXB0dXJlTWVkaWFPdXRwdXRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7CisgICAgaWYgKGlzQXVkaW9TZXJ2ZXJPclJvb3RVaWQodWlkKSkgcmV0dXJuIHRydWU7CisgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNDYXB0dXJlTWVkaWFPdXRwdXQoImFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX01FRElBX09VVFBVVCIpOworICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihzQ2FwdHVyZU1lZGlhT3V0cHV0LCBwaWQsIHVpZCk7CisgICAgaWYgKCFvaykgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfTUVESUFfT1VUUFVUIik7CisgICAgcmV0dXJuIG9rOworfQorCitib29sIGNhcHR1cmVIb3R3b3JkQWxsb3dlZChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKKyAgICAvLyBDQVBUVVJFX0FVRElPX0hPVFdPUkQgcGVybWlzc2lvbiBpbXBsaWVzIFJFQ09SRF9BVURJTyBwZXJtaXNzaW9uCisgICAgYm9vbCBvayA9IHJlY29yZGluZ0FsbG93ZWQob3BQYWNrYWdlTmFtZSwgcGlkLCB1aWQpOworCisgICAgaWYgKG9rKSB7CisgICAgICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQ2FwdHVyZUhvdHdvcmRBbGxvd2VkKCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEIik7CisgICAgICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCisgICAgICAgIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oc0NhcHR1cmVIb3R3b3JkQWxsb3dlZCwgcGlkLCB1aWQpOworICAgIH0KKyAgICBpZiAoIW9rKSBBTE9HRSgiYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fSE9UV09SRCIpOworICAgIHJldHVybiBvazsKK30KKworYm9vbCBzZXR0aW5nc0FsbG93ZWQoKSB7CisgICAgLy8gZ2l2ZW4gdGhpcyBpcyBhIHBlcm1pc3Npb24gY2hlY2ssIGNvdWxkIHRoaXMgYmUgaXNBdWRpb1NlcnZlck9yUm9vdFVpZCgpPworICAgIGlmIChpc0F1ZGlvU2VydmVyVWlkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHJldHVybiB0cnVlOworICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQXVkaW9TZXR0aW5ncygiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19TRVRUSU5HUyIpOworICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCisgICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzQXVkaW9TZXR0aW5ncyk7CisgICAgaWYgKCFvaykgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19TRVRUSU5HUyIpOworICAgIHJldHVybiBvazsKK30KKworYm9vbCBtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkgeworICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCisgICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzTW9kaWZ5QXVkaW9Sb3V0aW5nKTsKKyAgICBpZiAoIW9rKSBBTE9HRSgiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19ST1VUSU5HIik7CisgICAgcmV0dXJuIG9rOworfQorCitib29sIG1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKCkgeworICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzTW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQoCisgICAgICAgICAgICAiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9ERUZBVUxUX0FVRElPX0VGRkVDVFMiKTsKKyAgICAvLyBJTVBPUlRBTlQ6IFVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBub3QgYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBub3QgY2hhbmdlLgorICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc01vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKTsKKworI2lmZGVmIFRBUkdFVF9BTkRST0lEX1RISU5HUworICAgIGlmICghb2spIHsKKyAgICAgICAgLy8gVXNlIGEgc2Vjb25kYXJ5IHBlcm1pc3Npb24gb24gQW5kcm9pZCBUaGluZ3MgdG8gYWxsb3cgYSBtb3JlIGxlbmllbnQgbGV2ZWwgb2YgcHJvdGVjdGlvbi4KKyAgICAgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNNb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQW5kcm9pZFRoaW5nc0FsbG93ZWQoCisgICAgICAgICAgICAgICAgImNvbS5nb29nbGUuYW5kcm9pZC50aGluZ3MucGVybWlzc2lvbi5NT0RJRllfREVGQVVMVF9BVURJT19FRkZFQ1RTIik7CisgICAgICAgIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKAorICAgICAgICAgICAgICAgIHNNb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQW5kcm9pZFRoaW5nc0FsbG93ZWQpOworICAgIH0KKyAgICBpZiAoIW9rKSBBTE9HRSgiY29tLmdvb2dsZS5hbmRyb2lkLnRoaW5ncy5wZXJtaXNzaW9uLk1PRElGWV9ERUZBVUxUX0FVRElPX0VGRkVDVFMiKTsKKyNlbHNlCisgICAgaWYgKCFvaykgQUxPR0UoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfREVGQVVMVF9BVURJT19FRkZFQ1RTIik7CisjZW5kaWYKKyAgICByZXR1cm4gb2s7Cit9CisKK2Jvb2wgZHVtcEFsbG93ZWQoKSB7CisgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNEdW1wKCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpOworICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCisgICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzRHVtcCk7CisgICAgLy8gY29udmVudGlvbiBpcyBmb3IgY2FsbGVyIHRvIGR1bXAgYW4gZXJyb3IgbWVzc2FnZSB0byBmZCBpbnN0ZWFkIG9mIGxvZ2dpbmcgaGVyZQorICAgIC8vaWYgKCFvaykgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKTsKKyAgICByZXR1cm4gb2s7Cit9CisKK2Jvb2wgbW9kaWZ5UGhvbmVTdGF0ZUFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oc01vZGlmeVBob25lU3RhdGUsIHBpZCwgdWlkKTsKKyAgICBBTE9HRV9JRighb2ssICJSZXF1ZXN0IHJlcXVpcmVzICVzIiwgU3RyaW5nOChzTW9kaWZ5UGhvbmVTdGF0ZSkuY19zdHIoKSk7CisgICAgcmV0dXJuIG9rOworfQorCisvLyBwcml2aWxlZ2VkIGJlaGF2aW9yIG5lZWRlZCBieSBEaWFsZXIsIFNldHRpbmdzLCBTZXR1cFdpemFyZCBhbmQgQ2VsbEJyb2FkY2FzdFJlY2VpdmVyCitib29sIGJ5cGFzc0ludGVycnVwdGlvblBvbGljeUFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc1dyaXRlU2VjdXJlU2V0dGluZ3MoImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9TRUNVUkVfU0VUVElOR1MiKTsKKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oc01vZGlmeVBob25lU3RhdGUsIHBpZCwgdWlkKQorICAgICAgICB8fCBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihzV3JpdGVTZWN1cmVTZXR0aW5ncywgcGlkLCB1aWQpCisgICAgICAgIHx8IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKHNNb2RpZnlBdWRpb1JvdXRpbmcsIHBpZCwgdWlkKTsKKyAgICBBTE9HRV9JRighb2ssICJSZXF1ZXN0IHJlcXVpcmVzICVzIG9yICVzIiwKKyAgICAgICAgICAgICBTdHJpbmc4KHNNb2RpZnlQaG9uZVN0YXRlKS5jX3N0cigpLCBTdHJpbmc4KHNXcml0ZVNlY3VyZVNldHRpbmdzKS5jX3N0cigpKTsKKyAgICByZXR1cm4gb2s7Cit9CisKK3N0YXR1c190IGNoZWNrSU1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSkKK3sKKyAgICBpZiAoaU1lbW9yeSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlcyBjaGVjayBmYWlsZWQ6IE5VTEwgSU1lbW9yeSBwb2ludGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IGlNZW1vcnktPmdldE1lbW9yeSgpOworICAgIGlmIChoZWFwID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzIGNoZWNrIGZhaWxlZDogTlVMTCBoZWFwIHBvaW50ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG9mZl90IHNpemUgPSBsc2VlayhoZWFwLT5nZXRIZWFwSUQoKSwgMCwgU0VFS19FTkQpOworICAgIGxzZWVrKGhlYXAtPmdldEhlYXBJRCgpLCAwLCBTRUVLX1NFVCk7CisKKyAgICBpZiAoaU1lbW9yeS0+cG9pbnRlcigpID09IE5VTEwgfHwgc2l6ZSA8IChvZmZfdClpTWVtb3J5LT5zaXplKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzIGNoZWNrIGZhaWxlZDogcG9pbnRlciAlcCBzaXplICV6dSBmZCBzaXplICV1IiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpTWVtb3J5LT5wb2ludGVyKCksIGlNZW1vcnktPnNpemUoKSwgKHVpbnQzMl90KXNpemUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3A8Y29udGVudDo6cG06OklQYWNrYWdlTWFuYWdlck5hdGl2ZT4gTWVkaWFQYWNrYWdlTWFuYWdlcjo6cmV0cmVpdmVQYWNrYWdlTWFuYWdlcigpIHsKKyAgICBjb25zdCBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisgICAgaWYgKHNtID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coIiVzOiBmYWlsZWQgdG8gcmV0cmlldmUgZGVmYXVsdFNlcnZpY2VNYW5hZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3A8SUJpbmRlcj4gcGFja2FnZU1hbmFnZXIgPSBzbS0+Y2hlY2tTZXJ2aWNlKFN0cmluZzE2KG5hdGl2ZVBhY2thZ2VNYW5hZ2VyTmFtZSkpOworICAgIGlmIChwYWNrYWdlTWFuYWdlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlczogZmFpbGVkIHRvIHJldHJpZXZlIG5hdGl2ZSBwYWNrYWdlIG1hbmFnZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8Y29udGVudDo6cG06OklQYWNrYWdlTWFuYWdlck5hdGl2ZT4ocGFja2FnZU1hbmFnZXIpOworfQorCitzdGQ6Om9wdGlvbmFsPGJvb2w+IE1lZGlhUGFja2FnZU1hbmFnZXI6OmRvSXNBbGxvd2VkKHVpZF90IHVpZCkgeworICAgIGlmIChtUGFja2FnZU1hbmFnZXIgPT0gbnVsbHB0cikgeworICAgICAgICAvKiogQ2FuIG5vdCBmZXRjaCBwYWNrYWdlIG1hbmFnZXIgYXQgY29uc3RydWN0aW9uIGl0IG1heSBub3QgeWV0IGJlIHJlZ2lzdGVyZWQuICovCisgICAgICAgIG1QYWNrYWdlTWFuYWdlciA9IHJldHJlaXZlUGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgaWYgKG1QYWNrYWdlTWFuYWdlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IFBsYXliYWNrIGNhcHR1cmUgaXMgZGVuaWVkIGFzIHBhY2thZ2UgbWFuYWdlciBpcyBub3QgcmVhY2hhYmxlIiwgX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwYWNrYWdlTmFtZXM7CisgICAgYXV0byBzdGF0dXMgPSBtUGFja2FnZU1hbmFnZXItPmdldE5hbWVzRm9yVWlkcyh7KGludDMyX3QpdWlkfSwgJnBhY2thZ2VOYW1lcyk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dXKCIlczogUGxheWJhY2sgY2FwdHVyZSBpcyBkZW5pZWQgZm9yIHVpZCAldSBhcyB0aGUgcGFja2FnZSBuYW1lcyBjb3VsZCBub3QgYmUgIgorICAgICAgICAgICAgICAicmV0cmlldmVkIGZyb20gdGhlIHBhY2thZ2UgbWFuYWdlcjogJXMiLCBfX2Z1bmNfXywgdWlkLCBzdGF0dXMudG9TdHJpbmc4KCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7CisgICAgfQorICAgIGlmIChwYWNrYWdlTmFtZXMuZW1wdHkoKSkgeworICAgICAgICBBTE9HVygiJXM6IFBsYXliYWNrIGNhcHR1cmUgZm9yIHVpZCAldSBpcyBkZW5pZWQgYXMgbm8gcGFja2FnZSBuYW1lIGNvdWxkIGJlIHJldHJpZXZlZCAiCisgICAgICAgICAgICAgICJmcm9tIHRoZSBwYWNrYWdlIG1hbmFnZXI6ICVzIiwgX19mdW5jX18sIHVpZCwgc3RhdHVzLnRvU3RyaW5nOCgpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gc3RkOjpudWxsb3B0OworICAgIH0KKyAgICBzdGQ6OnZlY3Rvcjxib29sPiBpc0FsbG93ZWQ7CisgICAgc3RhdHVzID0gbVBhY2thZ2VNYW5hZ2VyLT5pc0F1ZGlvUGxheWJhY2tDYXB0dXJlQWxsb3dlZChwYWNrYWdlTmFtZXMsICZpc0FsbG93ZWQpOworICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HVygiJXM6IFBsYXliYWNrIGNhcHR1cmUgaXMgZGVuaWVkIGZvciB1aWQgJXUgYXMgdGhlIG1hbmlmZXN0IHByb3BlcnR5IGNvdWxkIG5vdCBiZSAiCisgICAgICAgICAgICAgICJyZXRyaWV2ZWQgZnJvbSB0aGUgcGFja2FnZSBtYW5hZ2VyOiAlcyIsIF9fZnVuY19fLCB1aWQsIHN0YXR1cy50b1N0cmluZzgoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKKyAgICB9CisgICAgaWYgKHBhY2thZ2VOYW1lcy5zaXplKCkgIT0gaXNBbGxvd2VkLnNpemUoKSkgeworICAgICAgICBBTE9HVygiJXM6IFBsYXliYWNrIGNhcHR1cmUgaXMgZGVuaWVkIGZvciB1aWQgJXUgYXMgdGhlIHBhY2thZ2UgbWFuYWdlciByZXR1cm5lZCBpbmNvaGVyZW50IgorICAgICAgICAgICAgICAiIHJlc3BvbnNlIHNpemU6ICV6dSAhPSAlenUiLCBfX2Z1bmNfXywgdWlkLCBwYWNrYWdlTmFtZXMuc2l6ZSgpLCBpc0FsbG93ZWQuc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKKyAgICB9CisKKyAgICAvLyBaaXAgdG9nZXRoZXIgcGFja2FnZU5hbWVzIGFuZCBpc0FsbG93ZWQgZm9yIGRlYnVnIGxvZ3MKKyAgICBQYWNrYWdlcyYgcGFja2FnZXMgPSBtRGVidWdMb2dbdWlkXTsKKyAgICBwYWNrYWdlcy5yZXNpemUocGFja2FnZU5hbWVzLnNpemUoKSk7IC8vIFJldXNlIGFsbCBvYmplY3RzCisgICAgc3RkOjp0cmFuc2Zvcm0oYmVnaW4ocGFja2FnZU5hbWVzKSwgZW5kKHBhY2thZ2VOYW1lcyksIGJlZ2luKGlzQWxsb3dlZCksCisgICAgICAgICAgICAgICAgICAgYmVnaW4ocGFja2FnZXMpLCBbXSAoYXV0byYgbmFtZSwgYm9vbCBpc0FsbG93ZWQpIC0+IFBhY2thZ2UgeworICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge3N0ZDo6bW92ZShuYW1lKSwgaXNBbGxvd2VkfTsKKyAgICAgICAgICAgICAgICAgICB9KTsKKworICAgIC8vIE9ubHkgYWxsb3cgcGxheWJhY2sgcmVjb3JkIGlmIGFsbCBwYWNrYWdlcyBpbiB0aGlzIFVJRCBhbGxvdyBpdAorICAgIGJvb2wgcGxheWJhY2tDYXB0dXJlQWxsb3dlZCA9IHN0ZDo6YWxsX29mKGJlZ2luKGlzQWxsb3dlZCksIGVuZChpc0FsbG93ZWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShib29sIGIpIHsgcmV0dXJuIGI7IH0pOworCisgICAgcmV0dXJuIHBsYXliYWNrQ2FwdHVyZUFsbG93ZWQ7Cit9CisKK3ZvaWQgTWVkaWFQYWNrYWdlTWFuYWdlcjo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0IHsKKyAgICBkcHJpbnRmKGZkLCAiJSpzQWxsb3cgcGxheWJhY2sgY2FwdHVyZSBsb2c6XG4iLCBzcGFjZXMsICIiKTsKKyAgICBpZiAobVBhY2thZ2VNYW5hZ2VyID09IG51bGxwdHIpIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiUqc05vIHBhY2thZ2UgbWFuYWdlclxuIiwgc3BhY2VzICsgMiwgIiIpOworICAgIH0KKyAgICBkcHJpbnRmKGZkLCAiJSpzUGFja2FnZSBtYW5hZ2VyIGVycm9yczogJXVcbiIsIHNwYWNlcyArIDIsICIiLCBtUGFja2FnZU1hbmFnZXJFcnJvcnMpOworCisgICAgZm9yIChjb25zdCBhdXRvJiB1aWRDYWNoZSA6IG1EZWJ1Z0xvZykgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHBhY2thZ2UgOiBzdGQ6OmdldDxQYWNrYWdlcz4odWlkQ2FjaGUpKSB7CisgICAgICAgICAgICBkcHJpbnRmKGZkLCAiJSpzLSB1aWQ9JTV1LCBhbGxvd1BsYXliYWNrQ2FwdHVyZT0lcywgcGFja2FnZU5hbWU9JXNcbiIsIHNwYWNlcyArIDIsICIiLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmdldDxjb25zdCB1aWRfdD4odWlkQ2FjaGUpLAorICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLnBsYXliYWNrQ2FwdHVyZUFsbG93ZWQgPyAidHJ1ZSAiIDogImZhbHNlIiwKKyAgICAgICAgICAgICAgICAgICAgcGFja2FnZS5uYW1lLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9UaW1lQ2hlY2suY3BwIGIvbWVkaWEvdXRpbHMvVGltZUNoZWNrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWNmNGVmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvVGltZUNoZWNrLmNwcApAQCAtMCwwICsxLDkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvVGltZUNoZWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvRXZlbnRMb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKiBzdGF0aWMgKi8KK3NwPFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkPiBUaW1lQ2hlY2s6OmdldFRpbWVDaGVja1RocmVhZCgpCit7CisgICAgc3RhdGljIHNwPFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkPiBzVGltZUNoZWNrVGhyZWFkID0gbmV3IFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkKCk7CisgICAgcmV0dXJuIHNUaW1lQ2hlY2tUaHJlYWQ7Cit9CisKK1RpbWVDaGVjazo6VGltZUNoZWNrKGNvbnN0IGNoYXIgKnRhZywgdWludDMyX3QgdGltZW91dE1zKQorICAgIDogbUVuZFRpbWVOcyhnZXRUaW1lQ2hlY2tUaHJlYWQoKS0+c3RhcnRNb25pdG9yaW5nKHRhZywgdGltZW91dE1zKSkKK3sKK30KKworVGltZUNoZWNrOjp+VGltZUNoZWNrKCkgeworICAgIGdldFRpbWVDaGVja1RocmVhZCgpLT5zdG9wTW9uaXRvcmluZyhtRW5kVGltZU5zKTsKK30KKworVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6On5UaW1lQ2hlY2tUaHJlYWQoKQoreworICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOworICAgIHJlcXVlc3RFeGl0KCk7CisgICAgbU1vbml0b3JSZXF1ZXN0cy5jbGVhcigpOworICAgIG1Db25kLnNpZ25hbCgpOworfQorCituc2Vjc190IFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkOjpzdGFydE1vbml0b3JpbmcoY29uc3QgY2hhciAqdGFnLCB1aW50MzJfdCB0aW1lb3V0TXMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobU11dGV4KTsKKyAgICBuc2Vjc190IGVuZFRpbWVOcyA9IHN5c3RlbVRpbWUoKSArIG1pbGxpc2Vjb25kcyh0aW1lb3V0TXMpOworICAgIGZvciAoOyBtTW9uaXRvclJlcXVlc3RzLmluZGV4T2ZLZXkoZW5kVGltZU5zKSA+PSAwOyArK2VuZFRpbWVOcyk7CisgICAgbU1vbml0b3JSZXF1ZXN0cy5hZGQoZW5kVGltZU5zLCB0YWcpOworICAgIG1Db25kLnNpZ25hbCgpOworICAgIHJldHVybiBlbmRUaW1lTnM7Cit9CisKK3ZvaWQgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6OnN0b3BNb25pdG9yaW5nKG5zZWNzX3QgZW5kVGltZU5zKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1NdXRleCk7CisgICAgbU1vbml0b3JSZXF1ZXN0cy5yZW1vdmVJdGVtKGVuZFRpbWVOcyk7CisgICAgbUNvbmQuc2lnbmFsKCk7Cit9CisKK2Jvb2wgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6OnRocmVhZExvb3AoKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IFRJTUVEX09VVDsKKyAgICBjb25zdCBjaGFyICp0YWc7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKKworICAgICAgICBpZiAoZXhpdFBlbmRpbmcoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgbnNlY3NfdCBlbmRUaW1lTnMgPSBJTlQ2NF9NQVg7CisgICAgICAgIC8vIEtleWVkVmVjdG9yIG1Nb25pdG9yUmVxdWVzdHMgaXMgb3JkZXJlZCBzbyB0YWtlIGZpcnN0IGVudHJ5IGFzIG5leHQgdGltZW91dAorICAgICAgICBpZiAobU1vbml0b3JSZXF1ZXN0cy5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgZW5kVGltZU5zID0gbU1vbml0b3JSZXF1ZXN0cy5rZXlBdCgwKTsKKyAgICAgICAgICAgIHRhZyA9IG1Nb25pdG9yUmVxdWVzdHMudmFsdWVBdCgwKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IG5zZWNzX3Qgd2FpdFRpbWVOcyA9IGVuZFRpbWVOcyAtIHN5c3RlbVRpbWUoKTsKKyAgICAgICAgaWYgKHdhaXRUaW1lTnMgPiAwKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBtQ29uZC53YWl0UmVsYXRpdmUobU11dGV4LCB3YWl0VGltZU5zKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIExPR19FVkVOVF9TVFJJTkcoTE9HVEFHX0FVRElPX0JJTkRFUl9USU1FT1VULCB0YWcpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJUaW1lQ2hlY2sgdGltZW91dCBmb3IgJXMiLCB0YWcpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5oIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL0FJbWFnZVJlYWRlclV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzliZGUxZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5oCkBAIC0wLDAgKzEsMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFJTUFHRV9SRUFERVJfVVRJTFNfSAorI2RlZmluZSBBSU1BR0VfUkVBREVSX1VUSUxTX0gKKworI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9idWZmZXJxdWV1ZS8xLjAvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWltZyB7CisKK3VzaW5nIEhHcmFwaGljQnVmZmVyUHJvZHVjZXIgPSBoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworCisvLyBSZXRyaWV2ZXMgSEdyYXBoaWNCdWZmZXJQcm9kdWNlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBuYXRpdmVfaGFuZGxlX3QKKy8vIHByb3ZpZGVkICh0aGlzIG5hdGl2ZSBoYW5kbGUgTVVTVCBoYXZlIGJlZW4gb2J0YWluZWQgYnkgQUltYWdlUmVhZGVyX2dldFdpbmRvd05hdGl2ZUhhbmRsZSgpKS4KK3NwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IEFJbWFnZVJlYWRlcl9nZXRIR0JQRnJvbUhhbmRsZShjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSk7CisKK30vLyBuYW1lc3BhY2UgYWltZworfS8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvL0FJTUFHRV9SRUFERVJfVVRJTFNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL0V2ZW50TG9nLmggYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvRXZlbnRMb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTNkM2JkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL0V2ZW50TG9nLmgKQEAgLTAsMCArMSwyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIEFORFJPSURfQVVESU9fRVZFTlRfTE9HX0hfCisjZGVmaW5lIEFORFJPSURfQVVESU9fRVZFTlRfTE9HX0hfCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8ga2VlcCB2YWx1ZXMgaW4gc3luYyB3aXRoIGZyYW1ld29ya3MvYXYvbWVkaWEvdXRpbHMvRXZlbnRMb2dUYWdzLmxvZ3RhZ3MKK2VudW0geworICBMT0dUQUdfQVVESU9fQklOREVSX1RJTUVPVVQgPSA2MTAwMCwKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9BVURJT19FVkVOVF9MT0dfSF8KZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmggYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNmU2MDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBVVRJTFNfU0VSVklDRVVUSUxJVElFU19ICisjZGVmaW5lIEFORFJPSURfTUVESUFVVElMU19TRVJWSUNFVVRJTElUSUVTX0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9jb250ZW50L3BtL0lQYWNrYWdlTWFuYWdlck5hdGl2ZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25Db250cm9sbGVyLmg+CisjaW5jbHVkZSA8Y3V0aWxzL211bHRpdXNlci5oPgorI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG9wdGlvbmFsPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gQXVkaW8gcGVybWlzc2lvbiB1dGlsaXRpZXMKKworLy8gVXNlZCBmb3IgY2FsbHMgdGhhdCBzaG91bGQgb3JpZ2luYXRlIGZyb20gc3lzdGVtIHNlcnZpY2VzLgorLy8gV2UgYWxsb3cgdGhhdCBzb21lIHNlcnZpY2VzIG1pZ2h0IGhhdmUgc2VwYXJhdGUgcHJvY2Vzc2VzIHRvCisvLyBoYW5kbGUgbXVsdGlwbGUgdXNlcnMsIGUuZy4gdTEwX3N5c3RlbSwgdTEwX2JsdWV0b290aCwgdTEwX3JhZGlvLgorc3RhdGljIGlubGluZSBib29sIGlzU2VydmljZVVpZCh1aWRfdCB1aWQpIHsKKyAgICByZXR1cm4gbXVsdGl1c2VyX2dldF9hcHBfaWQodWlkKSA8IEFJRF9BUFBfU1RBUlQ7Cit9CisKKy8vIFVzZWQgZm9yIGNhbGxzIHRoYXQgc2hvdWxkIG9yaWdpbmF0ZSBmcm9tIGF1ZGlvc2VydmVyLgorc3RhdGljIGlubGluZSBib29sIGlzQXVkaW9TZXJ2ZXJVaWQodWlkX3QgdWlkKSB7CisgICAgcmV0dXJuIHVpZCA9PSBBSURfQVVESU9TRVJWRVI7Cit9CisKKy8vIFVzZWQgZm9yIHNvbWUgcGVybWlzc2lvbiBjaGVja3MuCisvLyBBSURfUk9PVCBpcyBPSyBmb3IgY29tbWFuZC1saW5lIHRlc3RzLiAgTmF0aXZlIGF1ZGlvc2VydmVyIGFsd2F5cyBPSy4KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0F1ZGlvU2VydmVyT3JSb290VWlkKHVpZF90IHVpZCkgeworICAgIHJldHVybiB1aWQgPT0gQUlEX0FVRElPU0VSVkVSIHx8IHVpZCA9PSBBSURfUk9PVDsKK30KKworLy8gVXNlZCBmb3IgY2FsbHMgdGhhdCBzaG91bGQgY29tZSBmcm9tIHN5c3RlbSBzZXJ2ZXIgb3IgaW50ZXJuYWwuCisvLyBOb3RlOiBzeXN0ZW0gc2VydmVyIGlzIG11bHRpcHJvY2VzcyBmb3IgbXVsdGlwbGUgdXNlcnMuICBhdWRpb3NlcnZlciBpcyBub3QuCitzdGF0aWMgaW5saW5lIGJvb2wgaXNBdWRpb1NlcnZlck9yU3lzdGVtU2VydmVyVWlkKHVpZF90IHVpZCkgeworICAgIHJldHVybiBtdWx0aXVzZXJfZ2V0X2FwcF9pZCh1aWQpID09IEFJRF9TWVNURU0gfHwgdWlkID09IEFJRF9BVURJT1NFUlZFUjsKK30KKworLy8gTWVkaWFzZXJ2ZXIgbWF5IGZvcndhcmQgdGhlIGNsaWVudCBQSUQgYW5kIFVJRCBhcyBwYXJ0IG9mIGEgYmluZGVyIGludGVyZmFjZSBjYWxsOworLy8gb3RoZXJ3aXNlIHRoZSBjYWxsaW5nIFVJRCBtdXN0IGJlIGVxdWFsIHRvIHRoZSBjbGllbnQgVUlELgorc3RhdGljIGlubGluZSBib29sIGlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKHVpZF90IHVpZCkgeworICAgIHN3aXRjaCAodWlkKSB7CisgICAgY2FzZSBBSURfTUVESUE6CisgICAgY2FzZSBBSURfQVVESU9TRVJWRVI6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgcmVjb3JkaW5nQWxsb3dlZChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpOworYm9vbCBzdGFydFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpOwordm9pZCBmaW5pc2hSZWNvcmRpbmcoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHVpZF90IHVpZCk7Citib29sIGNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpOworYm9vbCBjYXB0dXJlTWVkaWFPdXRwdXRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKK2Jvb2wgY2FwdHVyZUhvdHdvcmRBbGxvd2VkKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCk7Citib29sIHNldHRpbmdzQWxsb3dlZCgpOworYm9vbCBtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCk7Citib29sIG1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKCk7Citib29sIGR1bXBBbGxvd2VkKCk7Citib29sIG1vZGlmeVBob25lU3RhdGVBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKK2Jvb2wgYnlwYXNzSW50ZXJydXB0aW9uUG9saWN5QWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCk7CisKK3N0YXR1c190IGNoZWNrSU1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSk7CisKK2NsYXNzIE1lZGlhUGFja2FnZU1hbmFnZXIgeworcHVibGljOgorICAgIC8qKiBRdWVyeSB0aGUgUGFja2FnZU1hbmFnZXIgdG8gY2hlY2sgaWYgYWxsIGFwcHMgb2YgYW4gVUlEIGFsbG93IHBsYXliYWNrIGNhcHR1cmUuICovCisgICAgYm9vbCBhbGxvd1BsYXliYWNrQ2FwdHVyZSh1aWRfdCB1aWQpIHsKKyAgICAgICAgYXV0byByZXN1bHQgPSBkb0lzQWxsb3dlZCh1aWQpOworICAgICAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICAgICAgbVBhY2thZ2VNYW5hZ2VyRXJyb3JzKys7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZV9vcihmYWxzZSk7CisgICAgfQorICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCBzcGFjZXMgPSAwKSBjb25zdDsKK3ByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBuYXRpdmVQYWNrYWdlTWFuYWdlck5hbWUgPSAicGFja2FnZV9uYXRpdmUiOworICAgIHN0ZDo6b3B0aW9uYWw8Ym9vbD4gZG9Jc0FsbG93ZWQodWlkX3QgdWlkKTsKKyAgICBzcDxjb250ZW50OjpwbTo6SVBhY2thZ2VNYW5hZ2VyTmF0aXZlPiByZXRyZWl2ZVBhY2thZ2VNYW5hZ2VyKCk7CisgICAgc3A8Y29udGVudDo6cG06OklQYWNrYWdlTWFuYWdlck5hdGl2ZT4gbVBhY2thZ2VNYW5hZ2VyOyAvLyBUbyBjaGVjayBhcHBzIG1hbmlmZXN0CisgICAgdWludF90IG1QYWNrYWdlTWFuYWdlckVycm9ycyA9IDA7CisgICAgc3RydWN0IFBhY2thZ2UgeworICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICBib29sIHBsYXliYWNrQ2FwdHVyZUFsbG93ZWQgPSBmYWxzZTsKKyAgICB9OworICAgIHVzaW5nIFBhY2thZ2VzID0gc3RkOjp2ZWN0b3I8UGFja2FnZT47CisgICAgc3RkOjptYXA8dWlkX3QsIFBhY2thZ2VzPiBtRGVidWdMb2c7Cit9OworfQorCisjZW5kaWYgLy8gQU5EUk9JRF9NRURJQVVUSUxTX1NFUlZJQ0VVVElMSVRJRVNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9UaW1lQ2hlY2suaCBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9UaW1lQ2hlY2suaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9UaW1lQ2hlY2suaApyZW5hbWUgdG8gbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1RpbWVDaGVjay5oCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvQW5kcm9pZC5tayBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWY5ZGM1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIFRoaXMgcGFja2FnZSBpcyBleGNsdWRlZCBmcm9tIGJ1aWxkIGZvciBub3cgc2luY2UgQVBJcyB1c2luZyB0aGlzIGFwayBiZWNhbWUgaGlkZGVuLgotIwotI0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLSNpZm5lcSAoJChUQVJHRVRfQlVJTERfUERLKSx0cnVlKSAjIEJ1aWxkIE1lZGlhQ29tcG9uZW50cyBvbmx5IGlmIHRoaXMgaXMgbm90IGEgUERLIGJ1aWxkLiAgTWVkaWFDb21wb25lbnRzIHdvbid0Ci0jIyBidWlsZCBpbiBQREsgYnVpbGRzIGJlY2F1c2UgZnJhbWV3b3Jrcy9iYXNlL2NvcmUvamF2YSBpcyBub3QgYXZhaWxhYmxlIGJ1dAotIyMgSU1lZGlhU2Vzc2lvbjIuYWlkbCBhbmQgSU1lZGlhQ29udHJvbGxlcjIuYWlkbCBhcmUgdXNpbmcgY2xhc3NlcyBmcm9tCi0jIyBmcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhLgotIwotI2luY2x1ZGUgJChDTEVBUl9WQVJTKQotIwotI0xPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBNZWRpYUNvbXBvbmVudHMKLSNMT0NBTF9NT0RVTEVfT1dORVIgOj0gZ29vZ2xlCi0jCi0jIyBUT0RPOiBjcmVhdGUgYSBzZXBhcmF0ZSBrZXkgZm9yIHRoaXMgcGFja2FnZS4KLSNMT0NBTF9DRVJUSUZJQ0FURSA6PSBwbGF0Zm9ybQotIwotIyMgVE9ETzogVXNlIFN5c3RlbSBTREsgb25jZSBwdWJsaWMgQVBJcyBhcmUgYXBwcm92ZWQKLSMjIExPQ0FMX1NES19WRVJTSU9OIDo9IHN5c3RlbV9jdXJyZW50Ci0jTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTIDo9IHRydWUKLSMKLSNMT0NBTF9TUkNfRklMRVMgOj0gXAotIyAgICAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykgXAotIyAgICAkKGNhbGwgYWxsLUlhaWRsLWZpbGVzLXVuZGVyLCBzcmMpCi0jCi0jTE9DQUxfUFJPR1VBUkRfRkxBR19GSUxFUyA6PSBwcm9ndWFyZC5jZmcKLSMKLSNMT0NBTF9NVUxUSUxJQiA6PSBmaXJzdAotIwotI0xPQ0FMX0pBVkFfTElCUkFSSUVTICs9IGFuZHJvaWQtc3VwcG9ydC1hbm5vdGF0aW9ucwotIwotIyMgVG8gZW1iZWQgbmF0aXZlIGxpYnJhcmllcyBpbiBwYWNrYWdlLCB1bmNvbW1lbnQgdGhlIGxpbmVzIGJlbG93LgotIyNMT0NBTF9NT0RVTEVfVEFHUyA6PSBzYW1wbGVzCi0jI0xPQ0FMX0pOSV9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSMjICAgIGxpYmFhY2V4dHJhY3RvciBcCi0jIyAgICBsaWJhbXJleHRyYWN0b3IgXAotIyMgICAgbGliZmxhY2V4dHJhY3RvciBcCi0jIyAgICBsaWJtaWRpZXh0cmFjdG9yIFwKLSMjICAgIGxpYm1rdmV4dHJhY3RvciBcCi0jIyAgICBsaWJtcDNleHRyYWN0b3IgXAotIyMgICAgbGlibXA0ZXh0cmFjdG9yIFwKLSMjICAgIGxpYm1wZWcyZXh0cmFjdG9yIFwKLSMjICAgIGxpYm9nZ2V4dHJhY3RvciBcCi0jIyAgICBsaWJ3YXZleHRyYWN0b3IgXAotIwotIyMgVE9ETzogUmVtb3ZlIGRlcGVuZGVuY3kgd2l0aCBvdGhlciBzdXBwb3J0IGxpYnJhcmllcy4KLSNMT0NBTF9TVEFUSUNfQU5EUk9JRF9MSUJSQVJJRVMgKz0gXAotIyAgICBhbmRyb2lkLXN1cHBvcnQtdjQgXAotIyAgICBhbmRyb2lkLXN1cHBvcnQtdjctYXBwY29tcGF0IFwKLSMgICAgYW5kcm9pZC1zdXBwb3J0LXY3LXBhbGV0dGUKLSNMT0NBTF9VU0VfQUFQVDIgOj0gdHJ1ZQotIwotI2luY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQotIwotI2VuZGlmICAjIGlmbmVxICgkKFRBUkdFVF9CVUlMRF9QREspLHRydWUpCi0jCi0jaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvQW5kcm9pZE1hbmlmZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTBmZGNhMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHBhY2thZ2U9ImNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZSIKLSAgICBhbmRyb2lkOnZlcnNpb25Db2RlPSIxIgotICAgIGFuZHJvaWQ6dmVyc2lvbk5hbWU9IjEuMCIgPgotCi0gICAgPGFwcGxpY2F0aW9uCi0gICAgICAgIGFuZHJvaWQ6bGFiZWw9Ik1lZGlhIENvbXBvbmVudHMgVXBkYXRlIgotICAgICAgICBhbmRyb2lkOm11bHRpQXJjaD0idHJ1ZSIKLSAgICAgICAgYW5kcm9pZDphbGxvd0JhY2t1cD0iZmFsc2UiCi0gICAgICAgIGFuZHJvaWQ6aGFzQ29kZT0iZmFsc2UiCi0gICAgICAgIGFuZHJvaWQ6ZXh0cmFjdE5hdGl2ZUxpYnM9ImZhbHNlIj4KLSAgICA8L2FwcGxpY2F0aW9uPgotCi08L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Byb2d1YXJkLmNmZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9wcm9ndWFyZC5jZmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YmY3MzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Byb2d1YXJkLmNmZworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSMKLQotIyBLZWVwIGVudHJ5IHBvaW50IGZvciB1cGRhdGFibGUgSmF2YSBjbGFzc2VzCi0ta2VlcCBwdWJsaWMgY2xhc3MgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUZhY3RvcnkgewotICAgcHVibGljIHN0YXRpYyBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpRmFjdG9yeSBpbml0aWFsaXplKGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm8pOwotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdmZDUxZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdjODI1Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI4ZGRlYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWE5Y2Q3NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE5MmFkNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmI3MDdlYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGMzMmQwMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM0NWVlMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDFkMzQxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDZiNjVkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdWJ0aXRsZV9kaXNhYmxlZC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3VidGl0bGVfZGlzYWJsZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzU0ZjYxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdWJ0aXRsZV9kaXNhYmxlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3VidGl0bGVfZW5hYmxlZC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3VidGl0bGVfZW5hYmxlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmOGZlYmUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N1YnRpdGxlX2VuYWJsZWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhhZDMwNWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4N2ZkZTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzM5ZGY3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGMzNDRhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTAzNDIwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3MjNlNDU1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDBjMjVhMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWZkYjljMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDg0NmMxMDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzM2JmNDg0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOTExYjVjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOTRlZDUwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2Y3ZTBjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjU1OGE4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGExYTg0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDlhZWQ3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDA2OGVhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Y2M3NzdjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjA4Nzk1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZDJjOWMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMDJhYjcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N1YnRpdGxlX2Rpc2FibGVkLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdWJ0aXRsZV9kaXNhYmxlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNTRmNjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N1YnRpdGxlX2Rpc2FibGVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdWJ0aXRsZV9lbmFibGVkLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdWJ0aXRsZV9lbmFibGVkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4ZmViZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3VidGl0bGVfZW5hYmxlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ0NmVhNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ3OTBjNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MDFkYzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNGQ1ODYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjYmI3NzIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdjYzk4NDUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAyMjYxN2UxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjZWZlZjNjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWEwMDQ3Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNhNWQ2YTIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDgxMzQzMTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVjODk5Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc3OGUwMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk5MmZjNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM4ODRlNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjYwYWM2NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkyMTA0Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU1YzA2Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEyZDQ5NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjM5MzM2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmM1YTZjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZGQyMTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiN2JkY2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdmZTU3Ni4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE1ZDZhYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWFkZmEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjVmZTBiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YzQ4YTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MWU5MTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU0MjE4YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIzMGZhYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2FhOTAzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2UyZjI5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ODcxZTIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNTdmNjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA0MWIwMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiYjY5NC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGUxMDEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzM1MmMzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNTMyZTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNmJhMzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJhM2I1Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0YmIyMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTU2MTI3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDE3YTlmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliZjYzM2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhNTE4MTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU2YTUzYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDcwNWRjYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGU0ZWEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzY3MjRmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllM2I0MTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmMThhYmQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU4MTEzMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgwYjE5MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OGFiYTNkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTM0ZDViLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5OTU3YjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZDM4NGYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRjNjI5Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhhYjY4NC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWU3Zjc1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWEzY2EzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYWVjZGUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiOGQwYjYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAwYmUzYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzE0ZjFiZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTE4YjQ2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGMyYzAwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZmFlNDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NGMyODkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTFmOTMyNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVlMWY2OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTZmYWZkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTJiZDg3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3M2ExZjguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YzEwNjkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYyYjgwMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRmYmEwMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTdmMmQyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOGY1NDc4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5OTVhZjAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MGI3ZjAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmRkMjE0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjdiZGNkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZmU1NzYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhNWQ2YWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhZGZhMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI1ZmUwYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWM0OGE3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDFlOTExLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlNDIxOGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMzBmYWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdhYTkwMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdlMmYyOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzg3MWUyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzU3ZjYzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwNDFiMDEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYmI2OTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhlMTAxMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMzNTJjMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDUzMmU5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzZiYTMwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYTNiNWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNGJiMjIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM1NzBmNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVhNDAzZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjQ0YmZkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2Q2MDQ4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMGQ1NTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYmM0OGQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRkOGY4ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThiOTBlNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzIzNGE3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2Q0NTJmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4MWNmNWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZDA4YjQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZlYjNmMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZhZThiMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjBmYzA4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMmExNmFjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNTk4Y2MuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NmQxNmQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjA3MDQ1NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU2ZGIxMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjM4MjhhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWNjYzczLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjOGNlZDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkMDFiOWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UzMWRkMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVmNzhlNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhN2MyY2RiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2M1YmVhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjYWQwZDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYTU5MjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjY4N2UyNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWMwNmRiOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MDIyNWJhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTY5N2RlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzN2VjMjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxODQwYmYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTQ0NWUzYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjMzN2M2NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmRkMjE0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjdiZGNkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzRkYzEzMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjE0NjE3Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMzA3NzMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEwNWQ3ZDcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMzhkNTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGU0MDM0OWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmNjdjNDYzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3ZmNlYmY1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZWEzMmE3YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGQ2MmNhMzcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMxMzEyNTYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEzMWUxYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU5NDZhMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg1ZTg3Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFiNDQwMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VhN2UwMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM2MzUzOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc0NWMzYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRhM2JhNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzVjYTE4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWMxODNkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYjY3OWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYzYwNTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4MzkxNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNjM2NhZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzQ0NGNmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQ2Mzc3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYmQxZGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZTcxMDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlmNTk2Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzMmUxYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTY4ZTA0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDIwZGQ5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZTM5ZTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZGMxNWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhhZWJhZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVhNmE0Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGI5MWNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWY2NmY5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZWEzNGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MmRlMDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIxYWEyMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM0YmNjMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjY2YjM1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDVhOGZiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZWIxMzIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYTJiNjAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI4MGFhOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1ZWZlNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzBjYzMxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFlNmZjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ODE2YzkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNDI5MzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBkNWI3Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzAzYTBmZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzJhNjU1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGRlYmMyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZTc4YTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhM2Y5OTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjNmYWQ5ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZkZDhkNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTBmZDVmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjBiNWMxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTFlZjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNzEwZDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYxYzA4MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM0YWEyMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWE2YjMwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNmU4ZmUwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3Yjg0MGUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMjQwNTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFjMThjMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmU5NzUzZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjI5MWIxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzFjNjE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1MDRhNzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3ZTBhNjAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiMWYzZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM1NTFlYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzg2NjdlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmI4MTgzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4OTNmMTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjNWUxNTYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGI2NzllLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWM2MDUxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwODM5MTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzYzNjYWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM0NDRjZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJkNjM3Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGJkMWRhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmU3MTA4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5ZjU5NmIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmMzJlMWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU2OGUwNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQyMGRkOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmUzOWU3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZWRjMTVmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4YWViYWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1YTZhNGYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRiOTFjZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODVmNjZmOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWVhMzRiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTJkZTA0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMWFhMjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzNGJjYzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZmZmEwMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZmN2U1Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmFjNGRjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmE4NmY1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzMDEwOTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzOTZmMGUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE5MDAxYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI3MTU4MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTk2MjA4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjY5NTAwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3ZTFiZDYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkZThmMTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYzMmU5NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFkNWQyZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjBkNTI3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzYxYWUxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYTNmODQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZDE2NmYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJlNTI3ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWViMmE4ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzM3YWY1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmM2YzMWVmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwZDlmNTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmOGViNzcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTZhMGUxNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjc0MjVlMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yzc2ZTE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDJmMWVkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZmRjZGQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZTliODE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyOWU0NDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OWNhODkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGZjNzVkNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWNiZDI3Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZWJiMGFjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjUxNGFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlN2ZlNWMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmYjJjMTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRiNjc5ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFjNjA1MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYjIxMjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljZTdlM2EuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODYwMWNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDkyOGQ3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTJmZDc3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmMTcxYThjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYzhjYjZjYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWM4ODYzZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDkzMzUwMzguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNmE0ODU4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0Y2E2Nzg3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjMwNWQyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDEucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkzOTVkNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAyLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwYTcyODIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMy5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2YwZjUzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZhODBkOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA1LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlYzM5MzkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA1LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNi5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjAyNTM2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDcucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA3LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmEyMjhmNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA4LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwNDI3N2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA4LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wOS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODY1YmZiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTAucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzEwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdjNWQ2Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzExLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyZjRhZDUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzExLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMi5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjMwNjQ4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTMucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzEzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjk5MzI0ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzE0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xNC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4NjE4ZjAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzE0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xNS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTBkNzcwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xNS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAwLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTBkNzcwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAxLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRiNGU1MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAxLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDIucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYjVmMDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAzLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDVjNzU4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmE1YzdmYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDUucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMjg3ZTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA2LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDYucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjdkMGNmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDYucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNy5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA3LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVmYTcyYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA3LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDgucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wOC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NTBlZWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wOC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA5LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDkucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjQ0MzU1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEwLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU4NzdjMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTEucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MjdmMGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEyLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTIucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWIxOWJiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMy5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEzLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY1OTIxZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xNC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0Yjc2YjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xNC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzE1LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTUucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjMwNWQyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YTk1MjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvY3VzdG9tX3Byb2dyZXNzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvY3VzdG9tX3Byb2dyZXNzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTczMWE2ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2N1c3RvbV9wcm9ncmVzcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08bGF5ZXItbGlzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiID4KLSAgICA8aXRlbSBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9iYWNrZ3JvdW5kIj4KLSAgICAgICAgPHNoYXBlIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSIgPgotICAgICAgICAgICAgPHNvbGlkIGFuZHJvaWQ6Y29sb3I9IiMyNjAwMDAwMCIgLz4KLSAgICAgICAgPC9zaGFwZT4KLSAgICA8L2l0ZW0+Ci0gICAgPGl0ZW0gYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvc2Vjb25kYXJ5UHJvZ3Jlc3MiPgotICAgICAgICA8Y2xpcD4KLSAgICAgICAgICAgIDxzaGFwZSBhbmRyb2lkOnNoYXBlPSJyZWN0YW5nbGUiID4KLSAgICAgICAgICAgICAgICA8c29saWQgYW5kcm9pZDpjb2xvcj0iIzVDZmZmZmZmIiAvPgotICAgICAgICAgICAgPC9zaGFwZT4KLSAgICAgICAgPC9jbGlwPgotICAgIDwvaXRlbT4KLSAgICA8aXRlbSBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9wcm9ncmVzcyI+Ci0gICAgICAgIDxjbGlwPgotICAgICAgICAgICAgPHNoYXBlIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSIgPgotICAgICAgICAgICAgICAgIDxzb2xpZCBhbmRyb2lkOmNvbG9yPSIjZmZmZmZmIiAvPgotICAgICAgICAgICAgPC9zaGFwZT4KLSAgICAgICAgPC9jbGlwPgotICAgIDwvaXRlbT4KLTwvbGF5ZXItbGlzdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2N1c3RvbV9wcm9ncmVzc190aHVtYi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2N1c3RvbV9wcm9ncmVzc190aHVtYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMzU5NzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9jdXN0b21fcHJvZ3Jlc3NfdGh1bWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPHNoYXBlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOnNoYXBlPSJvdmFsIiA+Ci0gICAgPHNvbGlkIGFuZHJvaWQ6Y29sb3I9IiNmZmZmZmYiIC8+Ci0gICAgPHNpemUKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IkBkaW1lbi9tY3YyX2N1c3RvbV9wcm9ncmVzc190aHVtYl9zaXplIgotICAgICAgICBhbmRyb2lkOndpZHRoPSJAZGltZW4vbWN2Ml9jdXN0b21fcHJvZ3Jlc3NfdGh1bWJfc2l6ZSIgLz4KLTwvc2hhcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hcnJvd19iYWNrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfYXJyb3dfYmFjay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNWY3MWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hcnJvd19iYWNrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0yMCwxMUg3LjgzbDUuNTksLTUuNTlMMTIsNGwtOCw4IDgsOCAxLjQxLC0xLjQxTDcuODMsMTNIMjB2LTJ6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2FzcGVjdF9yYXRpby54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2FzcGVjdF9yYXRpby54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MjI4ZTYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hc3BlY3RfcmF0aW8ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5LDEyaC0ydjNoLTN2Mmg1di01ek03LDloM0wxMCw3TDUsN3Y1aDJMNyw5ek0yMSwzTDMsM2MtMS4xLDAgLTIsMC45IC0yLDJ2MTRjMCwxLjEgMC45LDIgMiwyaDE4YzEuMSwwIDIsLTAuOSAyLC0yTDIzLDVjMCwtMS4xIC0wLjksLTIgLTIsLTJ6TTIxLDE5LjAxTDMsMTkuMDFMMyw0Ljk5aDE4djE0LjAyeiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hdWRpb3RyYWNrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfYXVkaW90cmFjay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YzEyYjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hdWRpb3RyYWNrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiwzdjkuMjhjLTAuNDcsLTAuMTcgLTAuOTcsLTAuMjggLTEuNSwtMC4yOEM4LjAxLDEyIDYsMTQuMDEgNiwxNi41UzguMDEsMjEgMTAuNSwyMWMyLjMxLDAgNC4yLC0xLjc1IDQuNDUsLTRIMTVWNmg0VjNoLTd6Ii8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfY2hlY2sueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGVjay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyZjcyMGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGVjay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wIDBoMjR2MjRIMHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik05IDE2LjJMNC44IDEybC0xLjQgMS40TDkgMTkgMjEgN2wtMS40LTEuNEw5IDE2LjJ6IiAvPgotPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGV2cm9uX2xlZnQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGV2cm9uX2xlZnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzM2ZDE3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfY2hldnJvbl9sZWZ0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xNS40MSw3LjQxTDE0LDZsLTYsNiA2LDYgMS40MSwtMS40MUwxMC44MywxMnoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfY2hldnJvbl9yaWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZXZyb25fcmlnaHQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjJjZTA5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfY2hldnJvbl9yaWdodC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTAsNkw4LjU5LDcuNDEgMTMuMTcsMTJsLTQuNTgsNC41OUwxMCwxOGw2LC02eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19kZWZhdWx0X2FsYnVtX2ltYWdlLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZGVmYXVsdF9hbGJ1bV9pbWFnZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZWU2NDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19kZWZhdWx0X2FsYnVtX2ltYWdlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSI1MTJkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iNTEyZHAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSI1MTIiCi0gICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iNTEyIj4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjNjE2MTYxIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNIDAgMCBIIDUxMiBWIDUxMiBIIDAgViAwIFoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiM1MjUyNTIiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0yNTYsMTUxdjEyMy4xNGMtNi44OC00LjAyLTE0LjgyLTYuNDgtMjMuMzMtNi40OCBjLTI1Ljc4LDAtNDYuNjcsMjAuODgtNDYuNjcsNDYuNjdjMCwyNS43OCwyMC44OCw0Ni42Nyw0Ni42Nyw0Ni42N3M0Ni42Ny0yMC44OCw0Ni42Ny00Ni42N1YxOTcuNjdIMzI2VjE1MUgyNTZ6IiAvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2ZvcndhcmRfMzAueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19mb3J3YXJkXzMwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VmZGYxNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2ZvcndhcmRfMzAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxncm91cD4KLSAgICAgICAgPGNsaXAtcGF0aCBhbmRyb2lkOnBhdGhEYXRhPSJNMjQsMjRIMFYwaDI0djI0eiBNIDAsMCIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNOS42IDEzLjVoLjRjLjIgMCAuNCwtLjEuNSwtLjJzLjIsLS4yLjIsLS40di0uMnMtLjEsLS4xLC0uMSwtLjIsLS4xLC0uMSwtLjIsLS4xaC0uNXMtLjEuMSwtLjIuMSwtLjEuMSwtLjEuMnYuMmgtMWMwLC0uMiAwLC0uMy4xLC0uNXMuMiwtLjMuMywtLjQuMywtLjIuNCwtLjIuNCwtLjEuNSwtLjFjLjIgMCAuNCAwIC42LjFzLjMuMS41LjIuMi4yLjMuNC4xLjMuMS41di4zcy0uMS4yLC0uMS4zLC0uMS4yLC0uMi4yLC0uMi4xLC0uMy4yYy4yLjEuNC4yLjUuNHMuMi40LjIuNmMwIC4yIDAgLjQsLS4xLjVzLS4yLjMsLS4zLjQsLS4zLjIsLS41LjIsLS40LjEsLS42LjFjLS4yIDAsLS40IDAsLS41LC0uMXMtLjMsLS4xLC0uNSwtLjIsLS4yLC0uMiwtLjMsLS40LC0uMSwtLjQsLS4xLC0uNmguOHYuMnMuMS4xLjEuMi4xLjEuMi4xaC41cy4xLC0uMS4yLC0uMS4xLC0uMS4xLC0uMnYtLjVzLS4xLC0uMSwtLjEsLS4yLC0uMSwtLjEsLS4yLC0uMWgtLjZ2LS43em01LjcuN2MwIC4zIDAgLjYsLS4xLjhsLS4zLjZzLS4zLjMsLS41LjMsLS40LjEsLS42LjEsLS40IDAsLS42LC0uMSwtLjMsLS4yLC0uNSwtLjMsLS4yLC0uMywtLjMsLS42LC0uMSwtLjUsLS4xLC0uOHYtLjdjMCwtLjMgMCwtLjYuMSwtLjhsLjMsLS42cy4zLC0uMy41LC0uMy40LC0uMS42LC0uMS40IDAgLjYuMS4zLjIuNS4zLjIuMy4zLjYuMS41LjEuOHYuN3ptLS45LC0uOHYtLjVzLS4xLC0uMiwtLjEsLS4zLC0uMSwtLjEsLS4yLC0uMiwtLjIsLS4xLC0uMywtLjEsLS4yIDAsLS4zLjFsLS4yLjJzLS4xLjIsLS4xLjN2MnMuMS4yLjEuMy4xLjEuMi4yLjIuMS4zLjEuMiAwIC4zLC0uMWwuMiwtLjJzLjEsLS4yLjEsLS4zdi0xLjV6TTQgMTNjMCA0LjQgMy42IDggOCA4czgsLTMuNiA4LC04aC0yYzAgMy4zLC0yLjcgNiwtNiA2cy02LC0yLjcsLTYsLTYgMi43LC02IDYsLTZ2NGw1LC01LC01LC01djRjLTQuNCAwLC04IDMuNiwtOCA4eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLSAgICA8L2dyb3VwPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Z1bGxzY3JlZW4ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19mdWxsc2NyZWVuLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGI0ZjZiYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Z1bGxzY3JlZW4ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTcsMTRMNSwxNHY1aDV2LTJMNywxN3YtM3pNNSwxMGgyTDcsN2gzTDEwLDVMNSw1djV6TTE3LDE3aC0zdjJoNXYtNWgtMnYzek0xNCw1djJoM3YzaDJMMTksNWgtNXoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZnVsbHNjcmVlbl9leGl0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZnVsbHNjcmVlbl9leGl0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmMyMDRlMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Z1bGxzY3JlZW5fZXhpdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNNSwxNmgzdjNoMnYtNUw1LDE0djJ6TTgsOEw1LDh2Mmg1TDEwLDVMOCw1djN6TTE0LDE5aDJ2LTNoM3YtMmgtNXY1ek0xNiw4TDE2LDVoLTJ2NWg1TDE5LDhoLTN6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2hlbHAueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19oZWxwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQxZDc1ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2hlbHAueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNCI+Ci0KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCAwaDI0djI0SDB6IiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMQotMTdoLTJ2LTJoMnYyem0yLjA3LTcuNzVsLS45IC45MiBDMTMuNDUgMTIuOSAxMyAxMy41IDEzIDE1aC0ydi0uNWMwLTEuMSAuNDUgLTIuMQotMS4xNy0yLjgzbDEuMjQtMS4yNmMuMzctLjM2IC41OSAtLjg2IC41OSAtMS40MSAwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDJIOGMwLTIuMjEKLTEuNzktNCA0LTRzNCAxLjc5IDQgNGMwIC44OC0uMzYgMS42OC0uOTMgMi4yNXoiIC8+Ci08L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2hpZ2hfcXVhbGl0eS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2hpZ2hfcXVhbGl0eS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NmUyMmYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19oaWdoX3F1YWxpdHkueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6d2lkdGg9IjM0ZHAiCi0gICAgYW5kcm9pZDpoZWlnaHQ9IjM0ZHAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNCI+Ci0KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCAwaDI0djI0SDB6IiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTkgNEg1Yy0xLjExIDAtMiAwLjktMiAydjEyYzAgMS4xIDAuODkgMiAyIDJoMTRjMS4xIDAgMi0wLjkgMi0yVjZjMC0xLjEtMC45LTItMi0yem0tOCAxMUg5LjV2LTJoLTJ2Mkg2VjloMS41djIuNWgyVjlIMTF2NnptNy0xYzAgMC41NS0wLjQ1IDEtMSAxaC0wLjc1djEuNWgtMS41VjE1SDE0Yy0wLjU1IDAtMS0wLjQ1LTEtMXYtNGMwLTAuNTUgMC40NSAtMSAxLTFoM2MwLjU1IDAgMSAwLjQ1IDEgMXY0em0tMy41LTAuNWgydi0zaC0ydjN6IiAvPgotPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19sYXVuY2gueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19sYXVuY2gueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2FmNmFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfbGF1bmNoLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOSwxOUg1VjVoN1YzSDVjLTEuMTEsMCAtMiwwLjkgLTIsMnYxNGMwLDEuMSAwLjg5LDIgMiwyaDE0YzEuMSwwIDIsLTAuOSAyLC0ydi03aC0ydjd6TTE0LDN2MmgzLjU5bC05LjgzLDkuODMgMS40MSwxLjQxTDE5LDYuNDFWMTBoMlYzaC03eiIvPgotPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19tdXRlLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfbXV0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2MGFhZWMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19tdXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xNi41LDEyYzAsLTEuNzcgLTEuMDIsLTMuMjkgLTIuNSwtNC4wM3YyLjIxbDIuNDUsMi40NWMwLjAzLC0wLjIgMC4wNSwtMC40MSAwLjA1LC0wLjYzek0xOSwxMmMwLDAuOTQgLTAuMiwxLjgyIC0wLjU0LDIuNjRsMS41MSwxLjUxQzIwLjYzLDE0LjkxIDIxLDEzLjUgMjEsMTJjMCwtNC4yOCAtMi45OSwtNy44NiAtNywtOC43N3YyLjA2YzIuODksMC44NiA1LDMuNTQgNSw2Ljcxek00LjI3LDNMMyw0LjI3IDcuNzMsOUwzLDl2Nmg0bDUsNXYtNi43M2w0LjI1LDQuMjVjLTAuNjcsMC41MiAtMS40MiwwLjkzIC0yLjI1LDEuMTh2Mi4wNmMxLjM4LC0wLjMxIDIuNjMsLTAuOTUgMy42OSwtMS44MUwxOS43MywyMSAyMSwxOS43M2wtOSwtOUw0LjI3LDN6TTEyLDRMOS45MSw2LjA5IDEyLDguMThMMTIsNHoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3BhdXNlX2NpcmNsZV9maWxsZWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3M2JlMjI4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSI0MGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTIsMkM2LjQ4LDIgMiw2LjQ4IDIsMTJzNC40OCwxMCAxMCwxMCAxMCwtNC40OCAxMCwtMTBTMTcuNTIsMiAxMiwyek0xMSwxNkw5LDE2TDksOGgydjh6TTE1LDE2aC0yTDEzLDhoMnY4eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19wbGF5X2NpcmNsZV9maWxsZWQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19wbGF5X2NpcmNsZV9maWxsZWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDM5ZGVmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcGxheV9jaXJjbGVfZmlsbGVkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiwyQzYuNDgsMiAyLDYuNDggMiwxMnM0LjQ4LDEwIDEwLDEwIDEwLC00LjQ4IDEwLC0xMFMxNy41MiwyIDEyLDJ6TTEwLDE2LjV2LTlsNiw0LjUgLTYsNC41eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19yZXBsYXlfY2lyY2xlX2ZpbGxlZC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3JlcGxheV9jaXJjbGVfZmlsbGVkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU2ZDVkOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3JlcGxheV9jaXJjbGVfZmlsbGVkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSI0MGRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgotICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQiCi0gICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQiPgotCi0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTAsMGgyNHYyNEgwVjB6IiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgotICAgICAgICBhbmRyb2lkOmZpbGxUeXBlPSJldmVuT2RkIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTIsMkM2LjQ4LDIsMiw2LjQ4LDIsMTJjMCw1LjUyLDQuNDgsMTAsMTAsMTBjNS41MiwwLDEwLTQuNDgsMTAtMTAKLUMyMiw2LjQ4LDE3LjUyLDIsMTIsMnoKLU0xOCwxMmMwLDMuMzEtMi42OSw2LTYsNmMtMy4zMSwwLTYtMi42OS02LTZoMmMwLDIuMjEsMS43OSw0LDQsNHM0LTEuNzksNC00cy0xLjc5LTQtNC00djNMOCw3bDQtNHYzCi1DMTUuMzEsNiwxOCw4LjY5LDE4LDEyeiIgLz4KLTwvdmVjdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcmV3aW5kXzEwLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcmV3aW5kXzEwLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU1ODZiNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3Jld2luZF8xMC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPGdyb3VwPgotICAgICAgICA8Y2xpcC1wYXRoIGFuZHJvaWQ6cGF0aERhdGE9Ik0wLDBoMjR2MjRIMFYweiBNIDAsMCIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTIgNVYxTDcgNmw1IDVWN2MzLjMgMCA2IDIuNyA2IDZzLTIuNyA2LC02IDYsLTYsLTIuNywtNiwtNkg0YzAgNC40IDMuNiA4IDggOHM4LC0zLjYgOCwtOCwtMy42LC04LC04LC04em0tMS4xIDExSDEwdi0zLjNMOSAxM3YtLjdsMS44LC0uNmguMVYxNnptNC4zLC0xLjhjMCAuMyAwIC42LC0uMS44bC0uMy42cy0uMy4zLC0uNS4zLC0uNC4xLC0uNi4xLC0uNCAwLC0uNiwtLjEsLS4zLC0uMiwtLjUsLS4zLC0uMiwtLjMsLS4zLC0uNiwtLjEsLS41LC0uMSwtLjh2LS43YzAsLS4zIDAsLS42LjEsLS44bC4zLC0uNnMuMywtLjMuNSwtLjMuNCwtLjEuNiwtLjEuNCAwIC42LjFjLjIuMS4zLjIuNS4zcy4yLjMuMy42LjEuNS4xLjh2Ljd6bS0uOSwtLjh2LS41cy0uMSwtLjIsLS4xLC0uMywtLjEsLS4xLC0uMiwtLjIsLS4yLC0uMSwtLjMsLS4xLC0uMiAwLC0uMy4xbC0uMi4ycy0uMS4yLC0uMS4zdjJzLjEuMi4xLjMuMS4xLjIuMi4yLjEuMy4xLjIgMCAuMywtLjFsLjIsLS4ycy4xLC0uMi4xLC0uM3YtMS41eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLSAgICA8L2dyb3VwPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NkLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZWNiNmQyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNCI+Ci0KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCwwaDI0djI0SDBWMHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOSwzSDVDMy44OSwzLDMsMy45LDMsNXYxNGMwLDEuMSwwLjg5LDIsMiwyaDE0YzEuMSwwLDItMC45LDItMlY1QzIxLDMuOSwyMC4xLDMsMTksM3oKLU0xMyw5aDRjMC41NSwwLDEsMC40NSwxLDF2NCBjMCwwLjU1LTAuNDUsMS0xLDFoLTRWOXoKLU05LjUsMTMuNXYtMUg3Yy0wLjU1LDAtMS0wLjQ1LTEtMVYxMGMwLTAuNTUsMC40NS0xLDEtMWgzYzAuNTUsMCwxLDAuNDUsMSwxdjFIOS41di0wLjVoLTJ2MUgxMAotYzAuNTUsMCwxLDAuNDUsMSwxVjE0YzAsMC41NS0wLjQ1LDEtMSwxSDdjLTAuNTUsMC0xLTAuNDUtMS0xdi0xaDEuNXYwLjVIOS41egotTTE0LjUsMTMuNWgydi0zaC0yVjEzLjV6IiAvPgotPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zZXR0aW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NldHRpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU5ZWNjMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NldHRpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOS40MywxMi45OGMwLjA0LC0wLjMyIDAuMDcsLTAuNjQgMC4wNywtMC45OHMtMC4wMywtMC42NiAtMC4wNywtMC45OGwyLjExLC0xLjY1YzAuMTksLTAuMTUgMC4yNCwtMC40MiAwLjEyLC0wLjY0bC0yLC0zLjQ2Yy0wLjEyLC0wLjIyIC0wLjM5LC0wLjMgLTAuNjEsLTAuMjJsLTIuNDksMWMtMC41MiwtMC40IC0xLjA4LC0wLjczIC0xLjY5LC0wLjk4bC0wLjM4LC0yLjY1QzE0LjQ2LDIuMTggMTQuMjUsMiAxNCwyaC00Yy0wLjI1LDAgLTAuNDYsMC4xOCAtMC40OSwwLjQybC0wLjM4LDIuNjVjLTAuNjEsMC4yNSAtMS4xNywwLjU5IC0xLjY5LDAuOThsLTIuNDksLTFjLTAuMjMsLTAuMDkgLTAuNDksMCAtMC42MSwwLjIybC0yLDMuNDZjLTAuMTMsMC4yMiAtMC4wNywwLjQ5IDAuMTIsMC42NGwyLjExLDEuNjVjLTAuMDQsMC4zMiAtMC4wNywwLjY1IC0wLjA3LDAuOThzMC4wMywwLjY2IDAuMDcsMC45OGwtMi4xMSwxLjY1Yy0wLjE5LDAuMTUgLTAuMjQsMC40MiAtMC4xMiwwLjY0bDIsMy40NmMwLjEyLDAuMjIgMC4zOSwwLjMgMC42MSwwLjIybDIuNDksLTFjMC41MiwwLjQgMS4wOCwwLjczIDEuNjksMC45OGwwLjM4LDIuNjVjMC4wMywwLjI0IDAuMjQsMC40MiAwLjQ5LDAuNDJoNGMwLjI1LDAgMC40NiwtMC4xOCAwLjQ5LC0wLjQybDAuMzgsLTIuNjVjMC42MSwtMC4yNSAxLjE3LC0wLjU5IDEuNjksLTAuOThsMi40OSwxYzAuMjMsMC4wOSAwLjQ5LDAgMC42MSwtMC4yMmwyLC0zLjQ2YzAuMTIsLTAuMjIgMC4wNywtMC40OSAtMC4xMiwtMC42NGwtMi4xMSwtMS42NXpNMTIsMTUuNWMtMS45MywwIC0zLjUsLTEuNTcgLTMuNSwtMy41czEuNTcsLTMuNSAzLjUsLTMuNSAzLjUsMS41NyAzLjUsMy41IC0xLjU3LDMuNSAtMy41LDMuNXoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2tpcF9uZXh0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2tpcF9uZXh0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFmMjgxMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NraXBfbmV4dC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSI0MGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNNiwxOGw4LjUsLTZMNiw2djEyek0xNiw2djEyaDJWNmgtMnoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2tpcF9wcmV2aW91cy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NraXBfcHJldmlvdXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWRhMzE0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2tpcF9wcmV2aW91cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSI0MGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNNiw2aDJ2MTJMNiwxOHpNOS41LDEybDguNSw2TDE4LDZ6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3N1YnRpdGxlX29mZi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3N1YnRpdGxlX29mZi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYTcyN2EuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zdWJ0aXRsZV9vZmYueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNCI+Ci0KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCwwaDI0djI0SDBWMHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOS41LDUuNXYxM2gtMTV2LTEzSDE5LjV6IE0xOSw0SDVDMy44OSw0LDMsNC45LDMsNnYxMmMwLDEuMSwwLjg5LDIsMiwyaDE0YzEuMSwwLDItMC45LDItMlY2QzIxLDQuOSwyMC4xLDQsMTksNEwxOSw0eiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTExLDExSDkuNXYtMC41aC0ydjNoMlYxM0gxMXYxYzAsMC41NS0wLjQ1LDEtMSwxSDdjLTAuNTUsMC0xLTAuNDUtMS0xdi00YzAtMC41NSwwLjQ1LTEsMS0xaDNjMC41NSwwLDEsMC40NSwxLDFWMTF6IiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTgsMTFoLTEuNXYtMC41aC0ydjNoMlYxM0gxOHYxYzAsMC41NS0wLjQ1LDEtMSwxaC0zYy0wLjU1LDAtMS0wLjQ1LTEtMXYtNGMwLTAuNTUsMC40NS0xLDEtMWgzYzAuNTUsMCwxLDAuNDUsMSwxVjExeiIgLz4KLTwvdmVjdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc3VidGl0bGVfb24ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zdWJ0aXRsZV9vbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjOTFjMDYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zdWJ0aXRsZV9vbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wIDBoMjR2MjRIMHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOSA0SDVjLTEuMTEgMC0yIDAuOS0yIDJ2MTJjMCAxLjEgMC44OSAyIDIgMmgxNGMxLjEgMCAyLTAuOSAyLTJWNmMwLTEuMS0wLjktMi0yLTJ6bS04IDdIOS41di0wLjVoLTJ2M2gyVjEzSDExdjFjMCAwLjU1LTAuNDUgMS0xIDFIN2MtMC41NSAwLTEtMC40NS0xLTF2LTRjMC0wLjU1IDAuNDUgLTEgMS0xaDNjMC41NSAwIDEgMC40NSAxIDF2MXptNyAwaC0xLjV2LTAuNWgtMnYzaDJWMTNIMTh2MWMwIDAuNTUtMC40NSAxLTEgMWgtM2MtMC41NSAwLTEtMC40NS0xLTF2LTRjMC0wLjU1IDAuNDUgLTEgMS0xaDNjMC41NSAwIDEgMC40NSAxIDF2MXoiIC8+Ci08L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3VubXV0ZS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3VubXV0ZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkZmIyYjkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY191bm11dGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTMsOXY2aDRsNSw1TDEyLDRMNyw5TDMsOXpNMTYuNSwxMmMwLC0xLjc3IC0xLjAyLC0zLjI5IC0yLjUsLTQuMDN2OC4wNWMxLjQ4LC0wLjczIDIuNSwtMi4yNSAyLjUsLTQuMDJ6TTE0LDMuMjN2Mi4wNmMyLjg5LDAuODYgNSwzLjU0IDUsNi43MXMtMi4xMSw1Ljg1IC01LDYuNzF2Mi4wNmM0LjAxLC0wLjkxIDcsLTQuNDkgNywtOC43N3MtMi45OSwtNy44NiAtNywtOC43N3oiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RlZF9kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RlZF9kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEwZmYxMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0ZWRfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhbmltYXRpb24tbGlzdAotICAgICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6b25lc2hvdD0idHJ1ZSI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci08L2FuaW1hdGlvbi1saXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RlZF9saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjZmM3ZmUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFuaW1hdGlvbi1saXN0Ci0gICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDpvbmVzaG90PSJ0cnVlIj4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci08L2FuaW1hdGlvbi1saXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RpbmdfZGFyay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1YWY3YjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19kYXJrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFuaW1hdGlvbi1saXN0Ci0gICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDpvbmVzaG90PSJmYWxzZSI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotPC9hbmltYXRpb24tbGlzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RpbmdfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYjQxNzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19saWdodC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhbmltYXRpb24tbGlzdAotICAgICAgICB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6b25lc2hvdD0iZmFsc2UiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci08L2FuaW1hdGlvbi1saXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fZGFyay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYxZGZhYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9kYXJrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2VkPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RlZF9kYXJrIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2thYmxlPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RpbmdfZGFyayIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyayIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9saWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkM2Q4NGUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2xpZ2h0IiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2thYmxlPSJ0cnVlIiBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RpbmdfbGlnaHQiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodCIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX2Nsb3NlX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODhjOGM3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX2Nsb3NlX2RhcmsueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZGlhbG9nX2Nsb3NlX2RhcmsiIC8+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfbGlnaHQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDUwZTBmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX2Nsb3NlX2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0+Ci0gICAgICAgIDxiaXRtYXAKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDphbHBoYT0iMC44NyIgLz4KLSAgICA8L2l0ZW0+Ci0KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfbWF0ZXJpYWxfYmFja2dyb3VuZF9kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJjN2VjYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2RhcmsueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tIFRoaXMgaXMgdGhlIGNvcHkgb2YgQGRyYXdhYmxlL2FiY19kaWFsb2dfbWF0ZXJpYWxfYmFja2dyb3VuZF9kYXJrIGV4Y2VwdCBmb3IgaW5zZXQKLSAgICAgd2hpY2ggaW5jbHVkZXMgdW5uZWNlc3NhcnkgcGFkZGluZy4gLS0+Ci08c2hhcGUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOnNoYXBlPSJyZWN0YW5nbGUiPgotICAgIDxjb3JuZXJzIGFuZHJvaWQ6cmFkaXVzPSIyZHAiIC8+Ci0gICAgPHNvbGlkIGFuZHJvaWQ6Y29sb3I9IkBjb2xvci9iYWNrZ3JvdW5kX2Zsb2F0aW5nX21hdGVyaWFsX2RhcmsiIC8+Ci08L3NoYXBlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX21hdGVyaWFsX2JhY2tncm91bmRfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfbWF0ZXJpYWxfYmFja2dyb3VuZF9saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxYjIzNWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfbWF0ZXJpYWxfYmFja2dyb3VuZF9saWdodC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gVGhpcyBpcyB0aGUgY29weSBvZiBAZHJhd2FibGUvYWJjX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2xpZ2h0IGV4Y2VwdCBmb3IgaW5zZXQKLSAgICAgd2hpY2ggaW5jbHVkZXMgdW5uZWNlc3NhcnkgcGFkZGluZy4gLS0+Ci08c2hhcGUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOnNoYXBlPSJyZWN0YW5nbGUiPgotICAgIDxjb3JuZXJzIGFuZHJvaWQ6cmFkaXVzPSIyZHAiIC8+Ci0gICAgPHNvbGlkIGFuZHJvaWQ6Y29sb3I9IkBjb2xvci9iYWNrZ3JvdW5kX2Zsb2F0aW5nX21hdGVyaWFsX2xpZ2h0IiAvPgotPC9zaGFwZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2dyb3VwX2NvbGxhcHNlLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZ3JvdXBfY29sbGFwc2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjcyYmM4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZ3JvdXBfY29sbGFwc2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YW5pbWF0aW9uLWxpc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOm9uZXNob3Q9InRydWUiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wMCIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzAxIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDIiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wMyIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzA0IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDUiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wNiIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzA3IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDgiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wOSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzEwIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMTEiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8xMiIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzEzIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMTQiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8xNSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci08L2FuaW1hdGlvbi1saXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9ncm91cF9leHBhbmQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9ncm91cF9leHBhbmQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjNmZGI2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZ3JvdXBfZXhwYW5kLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFuaW1hdGlvbi1saXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDpvbmVzaG90PSJ0cnVlIj4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzAwIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzAxIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzAyIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzAzIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzA0IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzA1IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzA2IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzA3IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzA4IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzA5IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzEwIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzExIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzEyIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzEzIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzE0IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfZXhwYW5kXzE1IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLTwvYW5pbWF0aW9uLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BhdXNlX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYyMThhNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BhdXNlX2RhcmsueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbWVkaWFfcGF1c2VfZGFyayIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BhdXNlX2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfbGlnaHQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZGQxZjAyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbT4KLSAgICAgICAgPGJpdG1hcAotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19tZWRpYV9wYXVzZV9saWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6YWxwaGE9IjAuODciIC8+Ci0gICAgPC9pdGVtPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGxheV9kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGxheV9kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ0NWEzMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BsYXlfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tZWRpYV9wbGF5X2RhcmsiIC8+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGxheV9saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxZmI3YTYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0+Ci0gICAgICAgIDxiaXRtYXAKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfbWVkaWFfcGxheV9saWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6YWxwaGE9IjAuODciIC8+Ci0gICAgPC9pdGVtPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2UxMDhhOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3N0b3BfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tZWRpYV9zdG9wX2RhcmsiIC8+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyYzZjZTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0+Ci0gICAgICAgIDxiaXRtYXAKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfbWVkaWFfc3RvcF9saWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6YWxwaGE9IjAuODciIC8+Ci0gICAgPC9pdGVtPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDRmNGZkNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX3ZvbF90eXBlX2F1ZGlvdHJhY2tfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19hdWRpb3RyYWNrX2RhcmsiIC8+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjOWRiYzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0+Ci0gICAgICAgIDxiaXRtYXAKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfYXVkaW90cmFja19saWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6YWxwaGE9IjAuODciIC8+Ci0gICAgPC9pdGVtPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvaW50ZXJwb2xhdG9yL21yX2Zhc3Rfb3V0X3Nsb3dfaW4ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9pbnRlcnBvbGF0b3IvbXJfZmFzdF9vdXRfc2xvd19pbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiNmExNzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9pbnRlcnBvbGF0b3IvbXJfZmFzdF9vdXRfc2xvd19pbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotICB+IENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAgLS0+Ci0KLTxwYXRoSW50ZXJwb2xhdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmNvbnRyb2xYMT0iMC40IgotICAgIGFuZHJvaWQ6Y29udHJvbFkxPSIwIgotICAgIGFuZHJvaWQ6Y29udHJvbFgyPSIwLjIiCi0gICAgYW5kcm9pZDpjb250cm9sWTI9IjEiLz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvaW50ZXJwb2xhdG9yL21yX2xpbmVhcl9vdXRfc2xvd19pbi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2ludGVycG9sYXRvci9tcl9saW5lYXJfb3V0X3Nsb3dfaW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMGJmMjk4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvaW50ZXJwb2xhdG9yL21yX2xpbmVhcl9vdXRfc2xvd19pbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotICB+IENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAgfgotICB+IExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB+IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgfiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAgfgotICB+ICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gIH4KLSAgfiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIH4gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgfiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgfiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLSAgLS0+Ci0KLTxwYXRoSW50ZXJwb2xhdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmNvbnRyb2xYMT0iMCIKLSAgICBhbmRyb2lkOmNvbnRyb2xZMT0iMCIKLSAgICBhbmRyb2lkOmNvbnRyb2xYMj0iMC4yIgotICAgIGFuZHJvaWQ6Y29udHJvbFkyPSIxIi8+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9tdXNpYy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9tdXNpYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNGQzNjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfbXVzaWMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLQotICAgIDxWaWV3Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRwIgotICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAuMjUiLz4KLQotICAgIDxJbWFnZVZpZXcKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hbGJ1bSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZHAiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMC41IgotICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0Q2VudGVyIgotICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX2RlZmF1bHRfYWxidW1faW1hZ2UiIC8+Ci0KLSAgICA8VmlldwotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwLjI1Ii8+Ci08L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9zZXR0aW5nc19saXN0X2l0ZW0ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE1NmRjYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9zZXR0aW5nc19saXN0X2l0ZW0ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAY29sb3IvYmxhY2tfb3BhY2l0eV83MCI+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+Ci0KLSAgICAgICAgPEltYWdlVmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pY29uIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2ljb25fc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI4ZHAiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIgLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxSZWxhdGl2ZUxheW91dAotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLQotICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbWFpbl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfdGV4dF9oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjJkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGUiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19tYWluX3RleHRfc2l6ZSIvPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdWJfdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX3RleHRfaGVpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYmVsb3c9IkBpZC9tYWluX3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjJkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGVfb3BhY2l0eV83MCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX3N1Yl90ZXh0X3NpemUiLz4KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+Ci0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3N1Yl9zZXR0aW5nc19saXN0X2l0ZW0ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfc3ViX3NldHRpbmdzX2xpc3RfaXRlbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5NDdhNzIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfc3ViX3NldHRpbmdzX2xpc3RfaXRlbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBjb2xvci9ibGFja19vcGFjaXR5XzcwIj4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KLQotICAgICAgICA8SW1hZ2VWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NoZWNrIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2ljb25fc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI4ZHAiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfY2hlY2siLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxSZWxhdGl2ZUxheW91dAotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLQotICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX3RleHRfaGVpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyZHAiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL3doaXRlIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfbWFpbl90ZXh0X3NpemUiLz4KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF90cmFuc3BvcnRfY29udHJvbHMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNhNTk1Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF90cmFuc3BvcnRfY29udHJvbHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iQGRpbWVuL21jdjJfdHJhbnNwb3J0X2NvbnRyb2xzX3BhZGRpbmciCi0gICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IkBkaW1lbi9tY3YyX3RyYW5zcG9ydF9jb250cm9sc19wYWRkaW5nIgotICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0idmlzaWJsZSI+Ci0KLSAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9wcmV2IiBzdHlsZT0iQHN0eWxlL0VtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUHJldmlvdXMiIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcmV3IiBzdHlsZT0iQHN0eWxlL0VtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUmV3IiAvPgotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3BhdXNlIiBzdHlsZT0iQHN0eWxlL0VtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUGF1c2UiIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvZmZ3ZCIgc3R5bGU9IkBzdHlsZS9FbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLkZmd2QiIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvbmV4dCIgc3R5bGU9IkBzdHlsZS9FbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLk5leHQiIC8+Ci08L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX2xhbmRzY2FwZV9tdXNpYy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX2xhbmRzY2FwZV9tdXNpYy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZTcwNTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9sYW5kc2NhcGVfbXVzaWMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iI0IzMDBGRjAwIgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL211c2ljX2ltYWdlIgotICAgICAgICBzdHlsZT0iQHN0eWxlL0Z1bGxNdXNpY0xhbmRzY2FwZS5JbWFnZSI+Ci0KLSAgICAgICAgPEltYWdlVmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hbGJ1bSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbWN2Ml9mdWxsX2FsYnVtX2ltYWdlX2xhbmRzY2FwZV9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX2FsYnVtX2ltYWdlX2xhbmRzY2FwZV9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19kZWZhdWx0X2FsYnVtX2ltYWdlIi8+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXVzaWNfdGV4dCIKLSAgICAgICAgc3R5bGU9IkBzdHlsZS9GdWxsTXVzaWNMYW5kc2NhcGUuVGV4dCI+Ci0KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21jdjJfbXVzaWNfdGl0bGVfdW5rbm93bl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjBzcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJib2xkIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkYiIC8+Ci0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hcnRpc3QiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbWN2Ml9tdXNpY19hcnRpc3RfdW5rbm93bl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTZzcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjQkJCQkJCIiAvPgotICAgIDwvTGluZWFyTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9wb3J0cmFpdF9tdXNpYy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3BvcnRyYWl0X211c2ljLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzVmMWJiMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3BvcnRyYWl0X211c2ljLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXVzaWNfaW1hZ2UiCi0gICAgICAgIHN0eWxlPSJAc3R5bGUvRnVsbE11c2ljUG9ydHJhaXQuSW1hZ2UiPgotCi0gICAgICAgIDxJbWFnZVZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWxidW0iCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZnVsbF9hbGJ1bV9pbWFnZV9wb3J0cmFpdF9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX2FsYnVtX2ltYWdlX3BvcnRyYWl0X3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX2RlZmF1bHRfYWxidW1faW1hZ2UiLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tdXNpY190ZXh0IgotICAgICAgICBzdHlsZT0iQHN0eWxlL0Z1bGxNdXNpY1BvcnRyYWl0LlRleHQiPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aXRsZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbWN2Ml9mdWxsX2FsYnVtX2ltYWdlX3BvcnRyYWl0X3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9tY3YyX211c2ljX3RpdGxlX3Vua25vd25fdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjIwc3AiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTdHlsZT0iYm9sZCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjRkZGRkZGIiAvPgotICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYXJ0aXN0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2Z1bGxfYWxidW1faW1hZ2VfcG9ydHJhaXRfc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21jdjJfbXVzaWNfYXJ0aXN0X3Vua25vd25fdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE2c3AiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iI0JCQkJCQiIgLz4KLSAgICA8L0xpbmVhckxheW91dD4KLTwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjkyZWE1ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3NldHRpbmdzX2xpc3RfaXRlbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2hlaWdodCIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGNvbG9yL2JsYWNrX29wYWNpdHlfNzAiPgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+Ci0KLSAgICAgICAgPEltYWdlVmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9pY29uIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2ljb25fc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbj0iOGRwIgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxSZWxhdGl2ZUxheW91dAotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tYWluX3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX3RleHRfaGVpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMmRwIgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL3doaXRlIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19tYWluX3RleHRfc2l6ZSIvPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zdWJfdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfdGV4dF9oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL21haW5fdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMmRwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IkBjb2xvci93aGl0ZV9vcGFjaXR5XzcwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19zdWJfdGV4dF9zaXplIi8+Ci0gICAgPC9SZWxhdGl2ZUxheW91dD4KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfc3ViX3NldHRpbmdzX2xpc3RfaXRlbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5MTI4ZDAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAY29sb3IvYmxhY2tfb3BhY2l0eV83MCI+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KLQotICAgICAgICA8SW1hZ2VWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NoZWNrIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2ljb25fc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbj0iOGRwIgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX2NoZWNrIi8+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8UmVsYXRpdmVMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2hlaWdodCIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLQotICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfdGV4dF9oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjJkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGUiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX21haW5fdGV4dF9zaXplIi8+Ci0gICAgPC9SZWxhdGl2ZUxheW91dD4KLTwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDkxNDc4NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3RyYW5zcG9ydF9jb250cm9scy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSJAZGltZW4vbWN2Ml90cmFuc3BvcnRfY29udHJvbHNfcGFkZGluZyIKLSAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iQGRpbWVuL21jdjJfdHJhbnNwb3J0X2NvbnRyb2xzX3BhZGRpbmciCi0gICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJ2aXNpYmxlIj4KLQotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3ByZXYiIHN0eWxlPSJAc3R5bGUvRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlByZXZpb3VzIiAvPgotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3JldyIgc3R5bGU9IkBzdHlsZS9GdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUmV3IiAvPgotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3BhdXNlIiBzdHlsZT0iQHN0eWxlL0Z1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QYXVzZSIgLz4KLSAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9mZndkIiBzdHlsZT0iQHN0eWxlL0Z1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5GZndkIiAvPgotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL25leHQiIHN0eWxlPSJAc3R5bGUvRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLk5leHQiIC8+Ci08L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21lZGlhX2NvbnRyb2xsZXIueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbWVkaWFfY29udHJvbGxlci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NThmMDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbWVkaWFfY29udHJvbGxlci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICBhbmRyb2lkOmxheW91dERpcmVjdGlvbj0ibHRyIj4KLQotICAgIDxSZWxhdGl2ZUxheW91dAotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlX2JhciIKLSAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAbGF5b3V0L3RpdGxlX2Jhcl9ncmFkaWVudCIKLSAgICAgICAgc3R5bGU9IkBzdHlsZS9UaXRsZUJhciI+Ci0KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aXRsZV9iYXJfbGVmdCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRMZWZ0PSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KLQotICAgICAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9iYWNrIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRTdGFydD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI1ZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0idmlzaWJsZSIKLSAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1RpdGxlQmFyQnV0dG9uLkJhY2siLz4KLQotICAgICAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aXRsZV90ZXh0IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b1JpZ2h0T2Y9IkBpZC9iYWNrIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWF4TGluZXM9IjEiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iNWRpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iNWRpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxNXNwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjRkZGRkZGRkYiLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aXRsZV9iYXJfcmlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgotCi0gICAgICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hZF9leHRlcm5hbF9saW5rIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI1ZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMGRpcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSI+Ci0KLSAgICAgICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hZF90ZXh0IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI1ZGlwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvTWVkaWFDb250cm9sVmlldzJfYWRfdGV4dCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTBzcCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkZGRiIgLz4KLQotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FkX2xhdW5jaCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1RpdGxlQmFyQnV0dG9uLkxhdW5jaCIgLz4KLSAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgICAgICAgICA8dmlldyBjbGFzcz0iY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuTWVkaWFSb3V0ZUJ1dHRvbiIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2Nhc3QiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGl0bGVCYXJCdXR0b24iIC8+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPC9SZWxhdGl2ZUxheW91dD4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9jZW50ZXJfdmlldyIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZHAiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9taW5pbWFsX2V4dHJhX3ZpZXciCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InJpZ2h0Ij4KLQotICAgICAgICA8SW1hZ2VCdXR0b24KLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZnVsbHNjcmVlbiIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0icmlnaHQiCi0gICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5GdWxsU2NyZWVuIiAvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfY3VzdG9tX3Byb2dyZXNzX3RodW1iX3NpemUiPgotCi0gICAgICAgIDxTZWVrQmFyCi0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3Byb2dyZXNzIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfY3VzdG9tX3Byb2dyZXNzX3RodW1iX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9tY3YyX3NlZWtfYmFyX2Rlc2MiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmc9IjBkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bWF4SGVpZ2h0PSJAZGltZW4vbWN2Ml9jdXN0b21fcHJvZ3Jlc3NfbWF4X3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iQGRpbWVuL21jdjJfY3VzdG9tX3Byb2dyZXNzX21heF9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDplbGV2YXRpb249IjEwZHAiLz4KLQotICAgICAgICA8VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9wcm9ncmVzc19idWZmZXIiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9idWZmZXJfdmlld19oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudEJvdHRvbT0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGNvbG9yL2JvdHRvbV9iYXJfYmFja2dyb3VuZCIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZWxldmF0aW9uPSIwZHAiLz4KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotCi0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYm90dG9tX2JhciIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0NGRwIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBjb2xvci9ib3R0b21fYmFyX2JhY2tncm91bmQiPgotCi0gICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYm90dG9tX2Jhcl9sZWZ0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRTdGFydD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIj4KLQotICAgICAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hZF9za2lwX3RpbWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSI0ZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTJzcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGltZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvUmlnaHRPZj0iQGlkL2JvdHRvbV9iYXJfbGVmdCIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjEwZHAiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTBkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIiA+Ci0KLSAgICAgICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGltZV9jdXJyZW50IgotICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGltZVRleHQuQ3VycmVudCIvPgotICAgICAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aW1lX2ludGVycHVuY3QiCi0gICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9UaW1lVGV4dC5JbnRlcnB1bmN0Ii8+Ci0gICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpbWVfZW5kIgotICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGltZVRleHQuRW5kIi8+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYm90dG9tX2Jhcl9yaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50RW5kPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJyaWdodCI+Ci0KLSAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2Jhc2ljX2NvbnRyb2xzIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgPgotCi0gICAgICAgICAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWRfcmVtYWluaW5nIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjEyc3AiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjRkZGRkZGIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Ci0KLSAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tdXRlIgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5NdXRlIiAvPgotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N1YnRpdGxlIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0Q2VudGVyIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvQm90dG9tQmFyQnV0dG9uLkNDIiAvPgotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2Z1bGxzY3JlZW4iCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvQm90dG9tQmFyQnV0dG9uLkZ1bGxTY3JlZW4iLz4KLSAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9vdmVyZmxvd19yaWdodCIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uT3ZlcmZsb3dSaWdodCIvPgotICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2V4dHJhX2NvbnRyb2xzIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiPgotCi0gICAgICAgICAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2N1c3RvbV9idXR0b25zIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIgLz4KLQotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3ZpZGVvX3F1YWxpdHkiCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvQm90dG9tQmFyQnV0dG9uLlZpZGVvUXVhbGl0eSIgLz4KLSAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zZXR0aW5ncyIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uU2V0dGluZ3MiIC8+Ci0gICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvb3ZlcmZsb3dfbGVmdCIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uT3ZlcmZsb3dMZWZ0Ii8+Ci0gICAgICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgPC9SZWxhdGl2ZUxheW91dD4KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbWluaW1hbF90cmFuc3BvcnRfY29udHJvbHMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbWluaW1hbF90cmFuc3BvcnRfY29udHJvbHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MDBjODBiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21pbmltYWxfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KLQotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3BhdXNlIiBzdHlsZT0iQHN0eWxlL01pbmltYWxUcmFuc3BvcnRDb250cm9sc0J1dHRvbiIgLz4KLTwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2Nob29zZXJfZGlhbG9nLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2Nob29zZXJfZGlhbG9nLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWU4OWUxNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jaG9vc2VyX2RpYWxvZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+Ci0gICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY2hvb3Nlcl90aXRsZSIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMjRkcCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjI0ZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMjRkcCIKLSAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21yX2Nob29zZXJfdGl0bGUiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9ImVuZCIKLSAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlRpdGxlIiAvPgotICAgIDxMaXN0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2Nob29zZXJfbGlzdCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpkaXZpZGVyPSJAYW5kcm9pZDpjb2xvci90cmFuc3BhcmVudCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpkaXZpZGVySGVpZ2h0PSIwZHAiIC8+Ci0gICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9lbXB0eSIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI0MGRwIgotICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSI5MGRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIxNmRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTZkcCIKLSAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIj4KLSAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9tcl9jaG9vc2VyX3NlYXJjaGluZyIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5TZWNvbmRhcnlUZXh0IiAvPgotICAgICAgICA8UHJvZ3Jlc3NCYXIgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjE1MGRwIgotICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmluZGV0ZXJtaW5hdGU9InRydWUiCi0gICAgICAgICAgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9wcm9ncmVzc0JhclN0eWxlSG9yaXpvbnRhbCIgLz4KLSAgICA8L0xpbmVhckxheW91dD4KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY2hvb3Nlcl9saXN0X2l0ZW0ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY2hvb3Nlcl9saXN0X2l0ZW0ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTg4NzliLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2Nob29zZXJfbGlzdF9pdGVtLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI1NmRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyNGRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMjRkcCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiID4KLQotICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9jaG9vc2VyX3JvdXRlX2ljb24iCi0gICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMjRkcCIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjRkcCIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpblJpZ2h0PSIyNGRwIiAvPgotCi0gICAgPExpbmVhckxheW91dCBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iMWRwIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiID4KLQotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9jaG9vc2VyX3JvdXRlX25hbWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjMyZHAiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5QcmltYXJ5VGV4dCIgLz4KLQotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9jaG9vc2VyX3JvdXRlX2Rlc2MiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjI0ZHAiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0ibWFycXVlZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5TZWNvbmRhcnlUZXh0IiAvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi08L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2NvbnRyb2xsZXJfbWF0ZXJpYWxfZGlhbG9nX2IueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY29udHJvbGxlcl9tYXRlcmlhbF9kaWFsb2dfYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMDQ0NzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY29udHJvbGxlcl9tYXRlcmlhbF9kaWFsb2dfYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08RnJhbWVMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfZXhwYW5kYWJsZV9hcmVhIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9ImZpbGxfcGFyZW50Ij4KLSAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbXJfZGlhbG9nX2FyZWEiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9jb2xvckJhY2tncm91bmRGbG9hdGluZyI+Ci0gICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9tcl90aXRsZV9iYXIiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjI0ZHAiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTJkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiID4KLSAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX25hbWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjBkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjcyZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5UaXRsZSIgLz4KLSAgICAgICAgICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL21yX2Nsb3NlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSI0OGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNDhkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb249IkBzdHJpbmcvbXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iP2F0dHIvbWVkaWFSb3V0ZUNsb3NlRHJhd2FibGUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSI/YW5kcm9pZDphdHRyL3NlbGVjdGFibGVJdGVtQmFja2dyb3VuZEJvcmRlcmxlc3MiIC8+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotICAgICAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9tcl9jdXN0b21fY29udHJvbCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgotICAgICAgICA8RnJhbWVMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9tcl9kZWZhdWx0X2NvbnRyb2wiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+Ci0gICAgICAgICAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfYXJ0IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmFkanVzdFZpZXdCb3VuZHM9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpzY2FsZVR5cGU9ImZpdFhZIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9jb2xvclByaW1hcnkiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0idG9wIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KLSAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnNwbGl0TW90aW9uRXZlbnRzPSJmYWxzZSI+Ci0gICAgICAgICAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL21yX21lZGlhX21haW5fY29udHJvbCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iMTZkcCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSIxNmRwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJib3R0b20iCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGhlbWU9Ij9hdHRyL21lZGlhUm91dGVDb250cm9sUGFuZWxUaGVtZU92ZXJsYXkiPgotICAgICAgICAgICAgICAgICAgICA8UmVsYXRpdmVMYXlvdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfcGxheWJhY2tfY29udHJvbCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjI0ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTJkcCIgPgotICAgICAgICAgICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvbXJfY29udHJvbF9wbGF5YmFja19jdHJsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luTGVmdD0iMTJkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21yX2NvbnRyb2xsZXJfcGxheSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hbmRyb2lkOmF0dHIvc2VsZWN0YWJsZUl0ZW1CYWNrZ3JvdW5kQm9yZGVybGVzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY29udHJvbF90aXRsZV9jb250YWluZXIiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF90b0xlZnRPZj0iQGlkL21yX2NvbnRyb2xfcGxheWJhY2tfY3RybCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2NvbnRyb2xfdGl0bGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuUHJpbWFyeVRleHQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9jb250cm9sX3N1YnRpdGxlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlNlY29uZGFyeVRleHQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgotICAgICAgICAgICAgICAgICAgICA8L1JlbGF0aXZlTGF5b3V0PgotICAgICAgICAgICAgICAgICAgICA8VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2NvbnRyb2xfZGl2aWRlciIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iOGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgotICAgICAgICAgICAgICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21yX3ZvbHVtZV9jb250cm9sIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iNDhkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyX3ZlcnRpY2FsIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMjRkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMmRwIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzcGxpdE1vdGlvbkV2ZW50cz0iZmFsc2UiPgotICAgICAgICAgICAgICAgICAgICAgICAgPEltYWdlVmlldwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyNGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjRkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iP2F0dHIvbWVkaWFSb3V0ZUF1ZGlvVHJhY2tEcmF3YWJsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iY2VudGVyIi8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tIFNpbmNlIGRpYWxvZydzIHRvcCBsYXlvdXQgbXJfZXhwYW5kYWJsZV9hcmVhIGlzIGNsaWNrYWJsZSwgaXQgcHJvcGFnYXRlcyBwcmVzc2VkIHN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGl0cyBub24tY2xpY2thYmxlIGNoaWxkcmVuLiBTcGVjaWZ5IGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIiB0byBwcmV2ZW50IHZvbHVtZSBzbGlkZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBoYXZpbmcgZmFsc2UgcHJlc3NlZCBzdGF0ZS4gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfdm9sdW1lX3NsaWRlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI0OGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWF4SGVpZ2h0PSI0OGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNsaWNrYWJsZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9tcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIC8+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tcl9ncm91cF9leHBhbmRfY29sbGFwc2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjQ4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0OGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iMTJkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hbmRyb2lkOmF0dHIvc2VsZWN0YWJsZUl0ZW1CYWNrZ3JvdW5kQm9yZGVybGVzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiLz4KLSAgICAgICAgICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgICAgICAgICAgICAgPGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk92ZXJsYXlMaXN0VmlldwotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21yX3ZvbHVtZV9ncm91cF9saXN0IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IkBkaW1lbi9tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X3BhZGRpbmdfdG9wIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjcm9sbGJhclN0eWxlPSJvdXRzaWRlT3ZlcmxheSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjbGlwVG9QYWRkaW5nPSJmYWxzZSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNwbGl0TW90aW9uRXZlbnRzPSJmYWxzZSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iP2F0dHIvbWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSIgLz4KLSAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgotICAgICAgICA8L0ZyYW1lTGF5b3V0PgotICAgICAgICA8U2Nyb2xsVmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9idXR0b25QYW5lbCIKLSAgICAgICAgICAgIHN0eWxlPSI/YXR0ci9idXR0b25CYXJTdHlsZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZmlsbFZpZXdwb3J0PSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpzY3JvbGxJbmRpY2F0b3JzPSJ0b3B8Ym90dG9tIj4KLSAgICAgICAgICAgIDxhbmRyb2lkLnN1cHBvcnQudjcud2lkZ2V0LkJ1dHRvbkJhckxheW91dAotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJib3R0b20iCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXREaXJlY3Rpb249ImxvY2FsZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0JvdHRvbT0iNGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjEyZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjEyZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSI0ZHAiPgotICAgICAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvYnV0dG9uMyIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYnV0dG9uQmFyTmV1dHJhbEJ1dHRvblN0eWxlIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIvPgotICAgICAgICAgICAgICAgIDxhbmRyb2lkLnN1cHBvcnQudjQud2lkZ2V0LlNwYWNlCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3BhY2VyIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkcCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImludmlzaWJsZSIvPgotICAgICAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvYnV0dG9uMiIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYnV0dG9uQmFyTmVnYXRpdmVCdXR0b25TdHlsZSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiLz4KLSAgICAgICAgICAgICAgICA8QnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2J1dHRvbjEiCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL2J1dHRvbkJhclBvc2l0aXZlQnV0dG9uU3R5bGUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ii8+Ci0gICAgICAgICAgICA8L2FuZHJvaWQuc3VwcG9ydC52Ny53aWRnZXQuQnV0dG9uQmFyTGF5b3V0PgotICAgICAgICA8L1Njcm9sbFZpZXc+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci08L0ZyYW1lTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY29udHJvbGxlcl92b2x1bWVfaXRlbS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jb250cm9sbGVyX3ZvbHVtZV9pdGVtLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg5MDU4Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jb250cm9sbGVyX3ZvbHVtZV9pdGVtLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiPgotICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC92b2x1bWVfaXRlbV9jb250YWluZXIiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faGVpZ2h0IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMjRkcCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI2MGRwIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSI4ZHAiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIgPgotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9uYW1lIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlNlY29uZGFyeVRleHQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnNpbmdsZUxpbmU9InRydWUiIC8+Ci0gICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiPgotICAgICAgICAgICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX3ZvbHVtZV9pdGVtX2ljb24iCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2ljb25fc2l6ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2ljb25fc2l6ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luVG9wPSI4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkJvdHRvbT0iOGRwIgotICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0Q2VudGVyIgotICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNyYz0iP2F0dHIvbWVkaWFSb3V0ZUF1ZGlvVHJhY2tEcmF3YWJsZSIgLz4KLSAgICAgICAgICAgIDxhbmRyb2lkLnN1cHBvcnQudjcuYXBwLk1lZGlhUm91dGVWb2x1bWVTbGlkZXIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21yX3ZvbHVtZV9zbGlkZXIiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNDBkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOm1pbkhlaWdodD0iNDBkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOm1heEhlaWdodD0iNDBkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9tcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIC8+Ci0gICAgICAgIDwvTGluZWFyTGF5b3V0PgotICAgIDwvTGluZWFyTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9zZXR0aW5nc19saXN0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L3NldHRpbmdzX2xpc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTMwNTM4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L3NldHRpbmdzX2xpc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGlzdFZpZXcgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc193aWR0aCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCIKLSAgICBhbmRyb2lkOmRpdmlkZXI9IkBudWxsIgotICAgIGFuZHJvaWQ6ZGl2aWRlckhlaWdodD0iMGRwIj4KLTwvTGlzdFZpZXc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvdGl0bGVfYmFyX2dyYWRpZW50LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L3RpdGxlX2Jhcl9ncmFkaWVudC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMWZjNmUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvdGl0bGVfYmFyX2dyYWRpZW50LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNoYXBlIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOnNoYXBlPSJyZWN0YW5nbGUiPgotICAgIDxncmFkaWVudAotICAgICAgICBhbmRyb2lkOnN0YXJ0Q29sb3I9IkBjb2xvci90aXRsZV9iYXJfZ3JhZGllbnRfc3RhcnQiCi0gICAgICAgIGFuZHJvaWQ6ZW5kQ29sb3I9IkBjb2xvci90aXRsZV9iYXJfZ3JhZGllbnRfZW5kIgotICAgICAgICBhbmRyb2lkOmFuZ2xlPSItMjcwIiAvPgotPC9zaGFwZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hZi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWFmL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzIzMGFkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWFmL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN0ZWxzZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVG9lc3RlbGxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdC1rbm9wcGllIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iVWl0c2FhaS1rbm9wcGllLiBPbnRrb3BwZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlVpdHNhYWkta25vcHBpZS4gS29wcGVsIHRhbnMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iVWl0c2FhaS1rbm9wcGllLiBHZWtvcHBlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJTYWFpIHVpdCBuYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlZpbmQgdGFucyB0b2VzdGVsbGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iT250a29wcGVsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iSG91IG9wIHVpdHNhYWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Ik1hYWsgdG9lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iU3BlZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkxhYXQgd2FnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3RvcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlZvdSB1aXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlZvdSBpbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVta3Vuc3dlcmsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVm9sdW1lZ2x5ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkdlZW4gbWVkaWEgaXMgZ2VraWVzIG5pZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iR2VlbiBpbmxpZ3RpbmcgYmVza2lrYmFhciBuaWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlNhYWkgdGFucyBza2VybSB1aXQiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWFtL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYW0vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5YTE5MDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYW0vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4Yi14Yit4YuT4Ym1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuGImOGIo+GIquGLq+GLjuGJvSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuGLqENhc3Qg4Yqg4Yud4Yir4YitIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdCDhiqDhi53hiKvhiK3hjaIg4YyN4YqV4YqZ4YqQ4Ym1IOGJsOGJi+GIreGMp+GIjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdCDhiqDhi53hiKvhiK0g4Ymg4Yib4YyI4YqT4YqY4Ym1IOGIi+GLrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0IOGKoOGLneGIq+GIreGNoiDhibDhjIjhipPhip3hibfhiI0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdCDhiqDhi7XhiK3hjI0g4YuI4YuwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4YiY4Yij4Yiq4Yur4YuO4Ym94YqVIOGJoOGIm+GMjeGKmOGJtSDhiIvhi60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4YyN4YqV4YqZ4YqQ4Ym1IOGKoOGJi+GIreGMpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkNhc3Qg4Yib4Yu14Yio4YyNIOGKoOGJgeGInSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4Yud4YyLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4Yqg4Yyr4YuN4Ym1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLhiIjhiqDhjY3hibMg4Yqg4YmB4YidIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Yqg4YmB4YidIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4Yqg4Yi14Y2LIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLhiLDhiaXhiLXhiaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLhi6jhiqDhiI3hiaDhiJ0g4Yi14YqQLeGMpeGJoOGJpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLhibDhipXhiLjhiKvhibPhib0g4Yuo4Yu14Yid4Y2FIOGImOGJhuGMo+GMoOGIquGLqyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4Yid4YqV4YidIOGIm+GIheGLsOGIqOGImOGIqOGMgyDhiqDhiI3hibDhiJjhiKjhjKDhiJ0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuGIneGKleGInSDhiJjhiKjhjIMg4Yqg4Yut4YyI4Yqd4YidIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLhiJvhi6sg4YyI4Yy94YqVIOGJoOGImOGLjeGIsOGLtSDhiIvhi60iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWFyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYXIvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4ZmI5N2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYXIvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i2KfZhNmG2LjYp9mFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Itin2YTYo9is2YfYstipIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i2LLYsSDYp9mE2KXYsdiz2KfZhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Itiy2LEg2KfZhNil2LHYs9in2YQuINiq2YUg2YLYt9i5INin2YTYp9iq2LXYp9mEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLYstixINin2YTYpdix2LPYp9mELiDYrNin2LHZjSDYp9mE2KfYqti12KfZhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLYstixINin2YTYpdix2LPYp9mELiDYqtmFINin2YTYp9iq2LXYp9mEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+Itil2LHYs9in2YQg2KXZhNmJIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i2KzYp9ix2Y0g2KfZhNio2K3YqyDYudmGINij2KzZh9iy2KkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i2YLYt9i5INin2YTYp9iq2LXYp9mEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i2KXZitmC2KfZgSDYp9mE2KXYsdiz2KfZhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i2KXYutmE2KfZgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+Itiq2LTYutmK2YQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+Itil2YrZgtin2YEg2YXYpNmC2KoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLYpdmK2YLYp9mBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i2KrZiNiz2YrYuSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i2KrYtdi62YrYsSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Iti12YjYsdipINin2YTYo9mE2KjZiNmFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+Iti02LHZiti3INiq2YXYsdmK2LEg2YXYs9iq2YjZiSDYp9mE2LXZiNiqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLZhNmFINmK2KrZhSDYp9iu2KrZitin2LEg2KPZiiDZiNiz2KfYpti3Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLZhNinINiq2KrZiNmB2LEg2KPZiiDZhdi52YTZiNmF2KfYqiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i2KzYp9ix2Y0g2KXYsdiz2KfZhCDYp9mE2LTYp9i02KkiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWF6L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYXovc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYzYwYWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYXovc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkNpaGF6bGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iWWF5xLFtIGTDvHltyZlzaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IllhecSxbSBkw7x5bcmZc2kuIEJhxJ9sYW50xLEga8mZc2lsZGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IllhecSxbSBkw7x5bcmZc2kuIFFvxZ91bHVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IllhecSxbSBkw7x5bcmZc2kuIFFvxZ91bGR1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkJ1cmEgeWF5xLFtbGF5xLFuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iQ2loYXpsYXIgYXh0YXLEsWzEsXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iQmHEn2xhbnTEsW7EsSBryZlzaW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJZYXnEsW3EsSBkYXlhbmTEsXLEsW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlFhcGFkxLFuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iT3luYWTEsW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkR1cmR1cnVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iRGF5YW5kxLFyxLFuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iR2VuacWfbMmZbmRpcmluIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJZxLHEn2NhbWxhxZ9kxLFyxLFuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxib20gaW5jyZlzyZluyZl0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJTyZlzIGjJmXJtaSBkaXlpcmPJmXlpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJIZcOnIGJpciBtZWRpYSBzZcOnaWxtyZl5aWIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IsaPbMOnYXRhbiBtyZlsdW1hdCB5b3hkdXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVrcmFuIHlhecSxbWxhbsSxciI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYitzcitMYXRuL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYitzcitMYXRuL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjViZDZlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWIrc3IrTGF0bi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVXJlxJFhamkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJEdWdtZSBQcmViYWNpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iRHVnbWUgUHJlYmFjaS4gVmV6YSBqZSBwcmVraW51dGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkR1Z21lIFByZWJhY2kuIFBvdmV6dWplIHNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkR1Z21lIFByZWJhY2kuIFBvdmV6YW4gamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iUHJlYmFjdWogbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJQcm9uYWxhxb5lbmplIHVyZcSRYWphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlByZWtpbmkgdmV6dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlphdXN0YXZpIHByZWJhY2l2YW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iWmF0dm9yaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlB1c3RpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXV6aXJhaiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlphdXN0YXZpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUHJvxaFpcmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNrdXBpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iT21vdCBhbGJ1bWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iS2xpemHEjSB6YSBqYcSNaW51IHp2dWthIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOZW1hIGl6YWJyYW5paCBtZWRpamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5pc3UgZG9zdHVwbmUgbmlrYWt2ZSBpbmZvcm1hY2lqZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUHJlYmFjdWplIHNlIGVrcmFuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iZS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJlL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzM5MWMxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJlL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCh0ZbRgdGC0Y3QvNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItCf0YDRi9C70LDQtNGLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRi9GWIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRi9GWLiDQkNC00LrQu9GO0YfQsNC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0YvRli4g0IbQtNC30LUg0L/QsNC00LrQu9GO0YfRjdC90L3QtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtGL0ZYuINCf0LDQtNC60LvRjtGH0LDQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCi0YDQsNC90YHQu9GW0YDQsNCy0LDRhtGMINC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLQn9C+0YjRg9C6INC/0YDRi9C70LDQtCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQkNC00LvRg9GH0YvRhtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0KHQv9GL0L3RltGG0Ywg0YLRgNCw0L3RgdC70Y/RhtGL0Y4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCX0LDQutGA0YvRhtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0J/RgNCw0LnQs9GA0LDRhtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLQn9GA0YvQv9GL0L3RltGG0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQodC/0YvQvdGW0YbRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItCg0LDQt9Cz0LDRgNC90YPRhtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQl9Cz0LDRgNC90YPRhtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0JLQvtC60LvQsNC00LrQsCDQsNC70YzQsdC+0LzQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLQn9Cw0Z7Qt9GD0L3QvtC6INCz0YPRh9C90LDRgdGG0ZYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCc0LXQtNGL0Y/RhNCw0LnQuyDQvdC1INCy0YvQsdGA0LDQvdGLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQhtC90YTQsNGA0LzQsNGG0YvRjyDQsNC00YHRg9GC0L3RltGH0LDQtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0K3QutGA0LDQvSDRgtGA0LDQvdGB0LvRj9GG0YvRliI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYmcvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iZy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY3MTJkNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iZy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodC40YHRgtC10LzQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQo9GB0YLRgNC+0LnRgdGC0LLQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCR0YPRgtC+0L0g0LfQsCDQv9GA0LXQtNCw0LLQsNC90LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQkdGD0YLQvtC9INC30LAg0L/RgNC10LTQsNCy0LDQvdC1LiDQktGA0YrQt9C60LDRgtCwINC1INC/0YDQtdC60YDQsNGC0LXQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQkdGD0YLQvtC9INC30LAg0L/RgNC10LTQsNCy0LDQvdC1LiDQodCy0YrRgNC30LLQsCDRgdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCR0YPRgtC+0L0g0LfQsCDQv9GA0LXQtNCw0LLQsNC90LUuINCj0YHRgtCw0L3QvtCy0LXQvdCwINC1INCy0YDRitC30LrQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLQn9GA0LXQtNCw0LLQsNC90LUg0LrRitC8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0KLRitGA0YHRj9GCINGB0LUg0YPRgdGC0YDQvtC50YHRgtCy0LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0J/RgNC10LrRgNCw0YLRj9Cy0LDQvdC1INC90LAg0LLRgNGK0LfQutCw0YLQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCh0L/QuNGA0LDQvdC1INC90LAg0L/RgNC10LTQsNCy0LDQvdC10YLQviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JfQsNGC0LLQsNGA0Y/QvdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0J/Rg9GB0LrQsNC90LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCf0L7RgdGC0LDQstGP0L3QtSDQvdCwINC/0LDRg9C30LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQodC/0LjRgNCw0L3QtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItCg0LDQt9Cz0YrQstCw0L3QtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0KHQstC40LLQsNC90LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQntCx0LvQvtC20LrQsCDQvdCwINCw0LvQsdGD0LzQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLQn9C70YrQt9Cz0LDRhyDQt9CwINGB0LjQu9Cw0YLQsCDQvdCwINC30LLRg9C60LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCd0Y/QvNCwINC40LfQsdGA0LDQvdCwINC80YPQu9GC0LjQvNC10LTQuNGPIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQndGP0LzQsCDQvdCw0LvQuNGH0L3QsCDQuNC90YTQvtGA0LzQsNGG0LjRjyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0JXQutGA0LDQvdGK0YIg0YHQtSDQv9GA0LXQtNCw0LLQsCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYm4vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ibi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJmNTkzMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ibi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgprjgpr/gprjgp43gpp/gp4fgpq4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4Kah4Ka/4Kat4Ka+4KaH4Ka44KaX4KeB4Kay4Ka/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4KaV4Ka+4Ka44KeN4KafIOCmleCmsOCmvuCmsCDgpqzgp4vgpqTgpr7gpq4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+4KawIOCmrOCni+CmpOCmvuCmruCntyDgprjgpoLgpq/gp4vgppcg4Kas4Ka/4Kaa4KeN4Kab4Ka/4Kao4KeN4KaoIOCmueCmr+CmvOCnh+Cmm+CnhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4KaV4Ka+4Ka44KeN4KafIOCmleCmsOCmvuCmsCDgpqzgp4vgpqTgpr7gpq7gp7cg4Ka44KaC4Kav4KeL4KaXIOCmleCmsOCmviDgprngpprgp43gppvgp4ciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4KaV4Ka+4Ka44KeN4KafIOCmleCmsOCmvuCmsCDgpqzgp4vgpqTgpr7gpq7gp7cg4Ka44KaC4Kav4KeB4KaV4KeN4KakIOCmueCmr+CmvOCnh+Cmm+CnhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLgpo/gpqTgp4cg4KaV4Ka+4Ka44KeN4KafIOCmleCmsOCngeCmqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCmoeCmv+CmreCmvuCmh+CmuOCml+CngeCmsuCmv+CmleCnhyDgppbgp4vgpoHgppzgpr4g4Ka54Kaa4KeN4Kab4KeHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCmuOCmguCmr+Cni+CmlyDgpqzgpr/gpprgp43gppvgpr/gpqjgp43gpqgg4KaV4Kaw4KeB4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4KaV4Ka+4Ka44KeN4KafIOCmleCmsOCmviDgpqzgpqjgp43gpqcg4KaV4Kaw4KeB4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgpqzgpqjgp43gpqcg4KaV4Kaw4KeB4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4Kaa4Ka+4Kay4Ka+4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgpqzgpr/gprDgpr7gpq4g4Kam4Ka/4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Kal4Ka+4Kau4Ka+4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4Kas4Kah4Ka8IOCmleCmsOCngeCmqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4Ka44KaZ4KeN4KaV4KeB4Kaa4Ka/4KakIOCmleCmsOCngeCmqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCmheCnjeCmr+CmvuCmsuCmrOCmvuCmriDgprbgp4jgprLgpr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4Kat4Kay4Ka/4KaJ4KauIOCmuOCnjeCmsuCmvuCmh+CmoeCmvuCmsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4KaV4KeL4Kao4KeLIOCmruCmv+CmoeCmv+Cmr+CmvOCmviDgpqjgpr/gprDgp43gpqzgpr7gpprgpqgg4KaV4Kaw4Ka+IOCmueCmr+CmvOCmqOCmvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4KaV4KeL4Kao4KeLIOCmpOCmpeCnjeCmryDgpongpqrgprLgpqzgp43gpqcg4Kao4KeH4KaHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgprjgp43gppXgp43gprDgp4Dgpqgg4KaV4Ka+4Ka44KeN4KafIOCmleCmsOCmviDgprngpprgp43gppvgp4ciPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJzL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYnMvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxMWM3NDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYnMvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlVyZcSRYWppIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iRHVnbWUgemEgZW1pdGlyYW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkR1Z21lIHphIGVtaXRpcmFuamUuIFZlemEgamUgcHJla2ludXRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJEdWdtZSB6YSBlbWl0aXJhbmplLiBQb3Zleml2YW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJEdWdtZSB6YSBlbWl0aXJhbmplLiBQb3ZlemFubyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJFbWl0aXJhbmplIG5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iVHJhxb5lbmplIHVyZcSRYWphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlByZWtpbmkgdmV6dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlphdXN0YXZpIHByZWJhY2l2YW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iWmF0dm9yaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHVjaXJhaiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1emlyYWoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJaYXVzdGF2aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlByb8WhaXJpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTa3VwaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Ik9tb3QgYWxidW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IktsaXphxI0gemEgamHEjWludSB6dnVrYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmlqZWRhbiBtZWRpaiBuaWplIG9kYWJyYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5lbWEgZG9zdHVwbmloIGluZm9ybWFjaWphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJQcmViYWN1amUgc2UgZWtyYW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWNhL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtY2Evc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmODVhY2YuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtY2Evc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl1cyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOzIGRcJ2VtZXRyZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdMOzIEVtZXQuIERlc2Nvbm5lY3RhdC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOzIEVtZXQuIFNcJ2VzdMOgIGNvbm5lY3RhbnQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdMOzIEVtZXQuIENvbm5lY3RhdC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iRW1ldCBhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iU1wnZXN0YW4gY2VyY2FudCBkaXNwb3NpdGl1cyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZXNjb25uZWN0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkF0dXJhIGxcJ2VtaXNzacOzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJUYW5jYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHVlaXgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBvc2EgZW4gcGF1c2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJBdHVyYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkRlc3BsZWdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSZXBsZWdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iSW1hdGdlIGRlIGxcJ8OgbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJDb250cm9sIGxsaXNjYW50IGRlIHZvbHVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJObyBzXCdoYSBzZWxlY2Npb25hdCBjYXAgZml0eGVyIG11bHRpbcOoZGlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJObyBoaSBoYSBpbmZvcm1hY2nDsyBkaXNwb25pYmxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJFbWlzc2nDsyBkZSBwYW50YWxsYSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtY3Mvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlhODkyMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0w6ltIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlphxZnDrXplbsOtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iVGxhxI3DrXRrbyBvZGVzw61sw6Fuw60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJUbGHEjcOtdGtvIG9kZXPDrWzDoW7DrS4gT2Rwb2plbm8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlRsYcSNw610a28gb2Rlc8OtbMOhbsOtLiBQxZlpcG9qb3bDoW7DrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJUbGHEjcOtdGtvIG9kZXPDrWzDoW7DrS4gUMWZaXBvamVubyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJPZGVzw61sYXQgZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJIbGVkw6Fuw60gemHFmcOtemVuw60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iT2Rwb2ppdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Ilphc3Rhdml0IG9kZXPDrWzDoW7DrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iWmF2xZnDrXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQxZllaHLDoXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBvemFzdGF2aXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJaYXN0YXZpdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlJvemJhbGl0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTYmFsaXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJPYmFsIGFsYmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iUG9zdXZuw61rIGhsYXNpdG9zdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lYnlsYSB2eWJyw6FuYSDFvsOhZG7DoSBtw6lkaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5lanNvdSBrwqBkaXNwb3ppY2kgxb7DoWRuw6kgaW5mb3JtYWNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJPZGVzw61sw6Fuw60gb2JzYWh1IG9icmF6b3ZreSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZGEvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU3YTc5MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRW5oZWRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3Qta25hcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3Qta25hcC4gRm9yYmluZGVsc2VuIGVyIGFmYnJ1ZHQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3Qta25hcC4gT3ByZXR0ZXIgZm9yYmluZGVsc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdC1rbmFwLiBUaWxzbHV0dGV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3QgdGlsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iRmluZGVyIGVuaGVkZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iQWZicnlkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3RvcCBtZWQgYXQgY2FzdGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Ikx1ayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkFmc3BpbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iU8OmdCBww6UgcGF1c2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iVWR2aWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNranVsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1ncmFmaWsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iTHlkc3R5cmtlc2t5ZGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJJbmdlbiBtZWRpZXIgZXIgbWFya2VyZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkRlciBlciBpbmdlbiB0aWxnw6ZuZ2VsaWdlIG9wbHlzbmluZ2VyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJTa8Omcm1lbiBjYXN0ZXMiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWRlL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2YmY1N2MuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkdlcsOkdGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0LVN5bWJvbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlN0cmVhbWluZy1TY2hhbHRmbMOkY2hlLiBOaWNodCB2ZXJidW5kZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlN0cmVhbWluZy1TY2hhbHRmbMOkY2hlLiBWZXJiaW5kdW5nIHdpcmQgaGVyZ2VzdGVsbHQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iU3RyZWFtaW5nLVNjaGFsdGZsw6RjaGUuIFZlcmJ1bmRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJTdHJlYW1lbiBhdWYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJHZXLDpHRlIHdlcmRlbiBnZXN1Y2h0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJWZXJiaW5kdW5nIHRyZW5uZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdHJlYW1pbmcgYmVlbmRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iU2NobGllw59lbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IldpZWRlcmdlYmVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzaWVyZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJCZWVuZGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTWF4aW1pZXJlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iTWluaW1pZXJlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtY292ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iU2NoaWViZXJlZ2xlciBmw7xyIGRpZSBMYXV0c3TDpHJrZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iS2VpbmUgTWVkaWVuIGF1c2dld8OkaGx0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJLZWluZSBJbmZvcm1hdGlvbmVuIHZlcmbDvGdiYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkJpbGRzY2hpcm0gd2lyZCBnZXN0cmVhbXQuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODJmNjliLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Is6jz43Pg8+EzrfOvM6xIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Is6jz4XPg866zrXPhc6tz4IiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLOms6/z4XOvM+Azq8gQ2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Is6azr/Phc68z4DOryDOvM61z4TOrM60zr/Pg863z4IuIM6Rz4DOv8+Dz4XOvc60zq3OuM63zrrOtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4izprOv8+FzrzPgM6vIM68zrXPhM6szrTOv8+DzrcuIM6jz43Ovc60zrXPg863IM+DzrUgzrXOvs6tzrvOuc6+zrciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4izprOv8+FzrzPgM6vIM68zrXPhM6szrTOv8+DzrfPgi4gzqPPhc69zrTOrc64zrfOus61Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+Is6czrXPhM6szrTOv8+Dzrcgz4POtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Is6Vz43Pgc61z4POtyDPg8+Fz4POus61z4XPjs69Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Is6Rz4DOv8+Dz43Ovc60zrXPg863Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4izpTOuc6xzrrOv8+Azq4gzrzOtc+EzqzOtM6/z4POt8+CIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLOms67zrXOr8+DzrnOvM6/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4izpHOvc6xz4DOsc+BzrHOs8+JzrPOriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4izqDOsc+Nz4POtyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Is6UzrnOsc66zr/PgM6uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4izpHOvc6sz4DPhM+Fzr7OtyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4izqPPjc68z4DPhM+Fzr7OtyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Is6Vzr7Pjs+Gz4XOu867zr8gzqzOu868z4DOv8+FzrwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4izqHPhc64zrzOuc+Dz4TOuc66z4wgzq3Ovc+EzrHPg863z4Igzq7Ph86/z4UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Is6UzrXOvSDOrc+Hzr/Phc69IM61z4DOuc67zrXOs861zq8gzrzOrc+DzrEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Is6UzrXOvSDPhc+AzqzPgc+Hzr/Phc69IM60zrnOsc64zq3Pg865zrzOtc+CIM+AzrvOt8+Bzr/Phs6/z4HOr861z4IiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Is6czrXPhM6szrTOv8+Dzrcgzr/OuM+Mzr3Ot8+CIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yQVUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yQVUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkM2YyMTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckFVL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEZXZpY2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdCBidXR0b24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0IGJ1dHRvbi4gRGlzY29ubmVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGluZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3QgdG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJGaW5kaW5nIGRldmljZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGlzY29ubmVjdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0b3AgY2FzdGluZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQ2xvc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQbGF5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJFeHBhbmQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNvbGxhcHNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW0gYXJ0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlZvbHVtZSBzbGlkZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vIG1lZGlhIHNlbGVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJObyBpbmZvIGF2YWlsYWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQ2FzdGluZyBzY3JlZW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJDQS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJDQS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzZjIxOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yQ0Evc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRldmljZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0IGJ1dHRvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3QgYnV0dG9uLiBEaXNjb25uZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3QgYnV0dG9uLiBDb25uZWN0aW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3QgYnV0dG9uLiBDb25uZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdCB0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkZpbmRpbmcgZGV2aWNlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEaXNjb25uZWN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3RvcCBjYXN0aW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJDbG9zZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlBsYXkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3RvcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iQ29sbGFwc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bSBhcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVm9sdW1lIHNsaWRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTm8gbWVkaWEgc2VsZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5vIGluZm8gYXZhaWxhYmxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJDYXN0aW5nIHNjcmVlbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckdCL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckdCL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDNmMjE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJHQi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGV2aWNlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QgYnV0dG9uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdCBidXR0b24uIERpc2Nvbm5lY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdCBidXR0b24uIENvbm5lY3RpbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdCBidXR0b24uIENvbm5lY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0IHRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iRmluZGluZyBkZXZpY2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRpc2Nvbm5lY3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdG9wIGNhc3RpbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkNsb3NlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUGxheSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXhwYW5kIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJDb2xsYXBzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtIGFydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJWb2x1bWUgc2xpZGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJObyBtZWRpYSBzZWxlY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTm8gaW5mbyBhdmFpbGFibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkNhc3Rpbmcgc2NyZWVuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1ySU4vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1ySU4vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkM2YyMTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tcklOL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEZXZpY2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdCBidXR0b24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0IGJ1dHRvbi4gRGlzY29ubmVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGluZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3QgdG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJGaW5kaW5nIGRldmljZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGlzY29ubmVjdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0b3AgY2FzdGluZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQ2xvc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQbGF5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJFeHBhbmQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNvbGxhcHNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW0gYXJ0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlZvbHVtZSBzbGlkZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vIG1lZGlhIHNlbGVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJObyBpbmZvIGF2YWlsYWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQ2FzdGluZyBzY3JlZW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJYQy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJYQy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTg3MDA3ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yWEMvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCOU3lzdGVt4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAj+KAj+KAjuKAjuKAj+KAjuKAj+KAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjkRldmljZXPigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI7igI/igI/igI7igI7igI/igI/igI7igI/igI7igI/igI7igI7igI/igI/igI7igI/igI7igI7igI7igI/igI/igI/igI7igI/igI7igI7igI7igI/igI/igI7igI7igI7igI/igI/igI7igI/igI/igI/igI7igI7igI/igI/igI/igI/igI/igI7igI/igI/igI/igI/igI/igI7igI/igI7igI7igI7igI7igI/igI7igI7igI7igI/igI5DYXN0IGJ1dHRvbuKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAjuKAj+KAj+KAjuKAj+KAjuKAjuKAj+KAj+KAj+KAjuKAj+KAjuKAjuKAjuKAjkNhc3QgYnV0dG9uLiBEaXNjb25uZWN0ZWTigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAj+KAjuKAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAjuKAj+KAjuKAj+KAjuKAjkNhc3QgYnV0dG9uLiBDb25uZWN0aW5n4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAjuKAj+KAjuKAjuKAj+KAj+KAj+KAjuKAj+KAj+KAjuKAj+KAj+KAj+KAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAjuKAjuKAj+KAjuKAj+KAjuKAjuKAj+KAjuKAj+KAjuKAj+KAjuKAj+KAj+KAjuKAjuKAjuKAj+KAj+KAj+KAjuKAj+KAj+KAj+KAj+KAjuKAj+KAjuKAjuKAj+KAjuKAj+KAjuKAj+KAjkNhc3QgYnV0dG9uLiBDb25uZWN0ZWTigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCOQ2FzdCB0b+KAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAjuKAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjkZpbmRpbmcgZGV2aWNlc+KAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI7igI/igI/igI7igI7igI7igI/igI7igI7igI7igI7igI/igI7igI7igI7igI7igI7igI7igI/igI/igI/igI/igI7igI/igI/igI/igI7igI/igI7igI/igI7igI7igI7igI/igI7igI7igI7igI/igI7igI/igI/igI7igI7igI7igI/igI7igI/igI7igI7igI/igI/igI7igI7igI/igI7igI/igI7igI7igI7igI/igI/igI7igI7igI5EaXNjb25uZWN04oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCOU3RvcCBjYXN0aW5n4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI/igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI/igI/igI/igI7igI7igI7igI/igI/igI/igI7igI7igI/igI/igI/igI7igI/igI7igI/igI7igI/igI7igI/igI7igI/igI/igI/igI/igI7igI7igI7igI7igI7igI/igI/igI/igI/igI7igI/igI7igI/igI/igI/igI7igI7igI/igI7igI/igI/igI/igI7igI7igI5DbG9zZeKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjlBsYXnigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAjuKAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjlBhdXNl4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCOU3RvcOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAjuKAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAj+KAjkV4cGFuZOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCOQ29sbGFwc2XigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI/igI7igI7igI/igI7igI7igI/igI7igI7igI7igI/igI7igI7igI/igI/igI7igI7igI7igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI7igI/igI7igI7igI/igI7igI/igI7igI/igI/igI/igI/igI7igI/igI7igI/igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI7igI7igI7igI7igI/igI5BbGJ1bSBhcnTigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCOVm9sdW1lIHNsaWRlcuKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCOTm8gbWVkaWEgc2VsZWN0ZWTigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAj+KAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAj+KAjuKAj+KAj+KAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAjuKAj+KAj+KAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAjuKAjuKAjk5vIGluZm8gYXZhaWxhYmxl4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI7igI7igI7igI/igI/igI/igI7igI7igI/igI7igI7igI7igI7igI7igI7igI/igI/igI/igI/igI7igI7igI/igI7igI/igI/igI7igI/igI/igI/igI/igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI7igI/igI7igI/igI7igI/igI7igI/igI7igI/igI/igI7igI/igI/igI7igI7igI7igI7igI7igI/igI/igI5DYXN0aW5nIHNjcmVlbuKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDFlYWQxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVzLXJVUy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOzbiBwYXJhIHRyYW5zbWl0aXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCb3TDs24gcGFyYSB0cmFuc21pdGlyIChkZXNjb25lY3RhZG8pIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCb3TDs24gcGFyYSB0cmFuc21pdGlyIChjb25lY3RhbmRvKSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCb3TDs24gcGFyYSB0cmFuc21pdGlyIChjb25lY3RhZG8pIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlRyYW5zbWl0aXIgYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkJ1c2NhbmRvIGRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZXNjb25lY3RhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkRldGVuZXIgbGEgdHJhbnNtaXNpw7NuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJDZXJyYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZXByb2R1Y2lyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJEZXRlbmVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTW9zdHJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iT2N1bHRhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkltYWdlbiBkZWwgw6FsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkNvbnRyb2wgZGVzbGl6YW50ZSBkZWwgdm9sdW1lbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTm8gc2Ugc2VsZWNjaW9uw7MgbmluZ8O6biBjb250ZW5pZG8gbXVsdGltZWRpYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iU2luIGluZm9ybWFjacOzbiBkaXNwb25pYmxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJUcmFuc21pdGllbmRvIHBhbnRhbGxhIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lcy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjQzMDA4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQm90w7NuIGRlIGVudmlhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdMOzbiBkZSBlbnZpYXIuIERlc2NvbmVjdGFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQm90w7NuIGRlIGVudmlhci4gQ29uZWN0YW5kbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCb3TDs24gZGUgZW52aWFyLiBDb25lY3RhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iRW52aWFyIGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJCdXNjYW5kbyBkaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVzY29uZWN0YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJEZXRlbmVyIGVudsOtbyBkZSBjb250ZW5pZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkNlcnJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHVjaXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iRGV0ZW5lciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Ik1vc3RyYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Ik9jdWx0YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJQb3J0YWRhIGRlbCDDoWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbCBkZXNsaXphbnRlIGRlIHZvbHVtZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vIHNlIGhhIHNlbGVjY2lvbmFkbyBuaW5nw7puIG1lZGlvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJObyBoYXkgaW5mb3JtYWNpw7NuIGRpc3BvbmlibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVudmlhbmRvIHBhbnRhbGxhIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ldC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWV0L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTMyMzViLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWV0L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlPDvHN0ZWVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlNlYWRtZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLDnGxla2FuZGVudXBwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iw5xsZWthbmRlbnVwcC4gw5xoZW5kdXMgb24ga2F0a2VzdGF0dWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IsOcbGVrYW5kZW51cHAuIMOcaGVuZGFtaW5lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IsOcbGVrYW5kZW51cHAuIMOcaGVuZGF0dWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iw5xsZWthbmRtaW5lIHNlYWRtZXNzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlNlYWRtZXRlIG90c2ltaW5lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkthdGtlc3RhIMO8aGVuZHVzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iUGVhdGEgw7xsZWthbmRtaW5lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJTdWxnZW1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJFc2l0YW1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBlYXRhbWluZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlBlYXRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTGFpZW5kYW1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkFoZW5kYW1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bWkga3VqdW5kdXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iSGVsaXR1Z2V2dXNlIGxpdWd1ciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTWVlZGlhdCBwb2xlIHZhbGl0dWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IlRlYXZlIHB1dWR1YiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRWtyYWFuaWt1dmEgw7xsZWthbmRtaW5lIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ldS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWV1L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYmExOWU0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWV1L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iR2FpbHVhayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Iklnb3JyaSBib3RvaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJJZ29ydHpla28gYm90b2lhLiBEZXNrb25la3RhdHV0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iSWdvcnR6ZWtvIGJvdG9pYS4gS29uZWt0YXR6ZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iSWdvcnR6ZWtvIGJvdG9pYS4gS29uZWt0YXR1dGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iSWdvcnJpIGhvbmE6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iR2FpbHVhayBiaWxhdHplbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZXNrb25la3RhdHUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJVdHppIGlnb3J0emVhcmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Ikl0eGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJFcnJlcHJvZHV6aXR1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzYXR1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iR2VsZGl0dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlphYmFsZHUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlRvbGVzdHUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bWFyZW4gYXphbGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQm9sdW1lbmFyZW4gZ3JhZHVhdHphaWxlYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iRXogZGEgaGF1dGF0dSBtdWx0aW1lZGlhLWVkdWtpcmlrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJFeiBkYWdvIGluZm9ybWF6aW9yaWsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlBhbnRhaWxhIGlnb3J0emVuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1mYS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZhL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzZjNzc5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZhL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Itiz24zYs9iq2YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i2K/Ys9iq2q/Yp9mH4oCM2YfYpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Itiv2qnZhdmHINin2LHYs9in2YQg2YXYrdiq2YjYpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Itiv2qnZhdmHINmB2LHYs9iq2KfYr9mGLiDYp9ix2KrYqNin2Lcg2YLYt9i5INi02K8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Itiv2qnZhdmHINmB2LHYs9iq2KfYr9mGLiDYr9ix2K3Yp9mEINmF2LHYqtio2LfigIzYs9in2LLbjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLYr9qp2YXZhyDZgdix2LPYqtin2K/Zhi4g2YXYsdiq2KjYtyDYtNivIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+Itin2LHYs9in2YQg2YXYrdiq2YjYpyDYqNmHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i2b7bjNiv2Kcg2qnYsdiv2YYg2K/Ys9iq2q/Yp9mH4oCM2YfYpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLZgti32Lkg2KfYsdiq2KjYp9i3Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i2KrZiNmC2YEg2KfYsdiz2KfZhCDZhdit2KrZiNinIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLYqNiz2KrZhiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+Itm+2K7YtCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i2YXaqdirIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i2KrZiNmC2YEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLYqNiy2LHaryDaqdix2K/ZhiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i2qnZiNqG2qkg2qnYsdiv2YYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLYudqp2LMg2LHZiNuMINis2YTYryDYotmE2KjZiNmFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItmE2LrYstmG2K/ZhyDZhduM2LLYp9mGINi12K/YpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i2LHYs9in2YbZhyDYp9mG2KrYrtin2Kgg2YbYtNiv2Ycg2KfYs9iqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLYp9i32YTYp9i52KfYqiDYr9ixINiv2LPYqtix2LMg2YbbjNiz2KoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Itiv2LHYrdin2YQg2YHYsdiz2KrYp9iv2YYg2LXZgdit2YciPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZpL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZmkvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ODM0MzUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZmkvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iSsOkcmplc3RlbG3DpCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJMYWl0dGVldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QtcGFpbmlrZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3QtcGFpbmlrZS4gWWh0ZXlzIGthdGthaXN0dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdC1wYWluaWtlLiBZaGRpc3RldMOkw6RuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3QtcGFpbmlrZS4gWWhkaXN0ZXR0eSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJTdW9yYXRvaXN0b24ga29oZGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJFdHNpdMOkw6RuIGxhaXR0ZWl0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJLYXRrYWlzZSB5aHRleXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJMb3BldGEgc3VvcmF0b2lzdG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlN1bGplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iVG9pc3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJLZXNrZXl0w6QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJQeXPDpHl0w6QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJMYWFqZW5uYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iVGlpdmlzdMOkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1pbiBrYW5zaWt1dmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iw4TDpG5lbnZvaW1ha2t1dWRlbiBsaXVrdXPDpMOkZGluIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJFaSB2YWxpdHR1YSBtZWRpYWEuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJUaWV0b2phIGVpIG9sZSBzYWF0YXZpbGxhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJTdW9yYXRvaXN0ZXRhYW4gbsOkeXR0w7bDpCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZnItckNBL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZnItckNBL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGY5ODRiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZyLXJDQS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0w6htZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJBcHBhcmVpbHMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCb3V0b24gRGlmZnVzZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCb3V0b24gRGlmZnVzZXIuIETDqWNvbm5lY3TDqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQm91dG9uIERpZmZ1c2VyLiBDb25uZXhpb24gZW4gY291cnPigKYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm91dG9uIERpZmZ1c2VyLiBDb25uZWN0w6kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iRGlmZnVzZXIgc3VyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iUmVjaGVyY2hlIGRcJ2FwcGFyZWlscyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJTZSBkw6ljb25uZWN0ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJBcnLDqnRlciBsYSBkaWZmdXNpb24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkZlcm1lciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkxpcmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkludGVycm9tcHJlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iQXJyw6p0ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJEw6l2ZWxvcHBlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iUsOpZHVpcmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJJbWFnZSBkZSBsXCdhbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJDdXJzZXVyIGRlIHLDqWdsYWdlIGR1IHZvbHVtZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iQXVjdW4gbcOpZGlhIHPDqWxlY3Rpb25uw6kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkF1Y3VuZSBpbmZvcm1hdGlvbiBkaXNwb25pYmxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJEaWZmdXNpb24gZGUgbFwnw6ljcmFuIGVuIGNvdXJzIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1mci9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmMzMTJmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3TDqG1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkFwcGFyZWlscyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Ikljw7RuZSBDYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iSWPDtG5lIENhc3QuIETDqWNvbm5lY3TDqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iSWPDtG5lIENhc3QuIENvbm5leGlvbuKApiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJJY8O0bmUgQ2FzdC4gQ29ubmVjdMOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3RlciBzdXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJSZWNoZXJjaGUgZFwnYXBwYXJlaWxz4oCmIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkTDqWNvbm5lY3RlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkFycsOqdGVyIGxhIGRpZmZ1c2lvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iRmVybWVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iTGVjdHVyZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJBcnLDqnRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkTDqXZlbG9wcGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSw6lkdWlyZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkltYWdlIGRlIGxcJ2FsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkN1cnNldXIgZGUgdm9sdW1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJBdWN1biBtw6lkaWEgc8OpbGVjdGlvbm7DqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iQXVjdW5lIGluZm9ybWF0aW9uIGRpc3BvbmlibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkRpZmZ1c2lvbiBkZSBsXCfDqWNyYW4gZW4gY291cnPigKYiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWdsL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZ2wvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiMmMzNTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZ2wvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCb3TDs24gZGUgZW1pdGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w7NuIGRlIGVtaXRpci4gRGVzY29uZWN0YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCb3TDs24gZGUgZW1pdGlyLiBDb25lY3RhbmRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdMOzbiBkZSBlbWl0aXIuIENvbmVjdGFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJFbWl0aXIgYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkJ1c2NhbmRvIGRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZXNjb25lY3RhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkRldGVyIGVtaXNpw7NuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJQZWNoYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZXByb2R1Y2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iRGV0ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJBbXBsaWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJDb250cmFlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IlBvcnRhZGEgZG8gw6FsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkNvbnRyb2wgZGVzcHJhemFibGUgZG8gdm9sdW1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOb24gc2Ugc2VsZWNjaW9uYXJvbiByZWN1cnNvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTm9uIGhhaSBpbmZvcm1hY2nDs24gZGlzcG/DsWlibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVtaXNpw7NuIGRlIHBhbnRhbGxhIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ndS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWd1L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2Q1ZjNmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWd1L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCquOCqv+CquOCrjeCqn+CqriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgqongqqrgqpXgqrDgqqPgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgqpXgqr7gqrjgq43gqp8g4KqV4Kqw4KuLIOCqrOCqn+CqqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuCqleCqvuCquOCrjeCqnyDgqpXgqrDgq4sg4Kqs4Kqf4KqoLiDgqqHgqr/gqrjgq43gqpXgqqjgq4fgqpXgq43gqp8g4KqV4Kqw4KuN4Kqv4KuB4KqCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgqpXgqr7gqrjgq43gqp8g4KqV4Kqw4KuLIOCqrOCqn+CqqC4g4KqV4Kqo4KuH4KqV4KuN4KqfIOCqpeCqiCDgqrDgqrngq43gqq/gq4HgqoIg4Kqb4KuHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuCqleCqvuCquOCrjeCqnyDgqpXgqrDgq4sg4Kqs4Kqf4KqoLiDgqpXgqqjgq4fgqpXgq43gqp8g4Kql4Kqv4KuB4KqCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCqhuCqqOCqviDgqqrgqrAg4KqV4Kq+4Kq44KuN4KqfIOCqleCqsOCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCqieCqquCqleCqsOCqo+CriyDgqrbgq4vgqqfgq4Ag4Kqw4Kq54KuN4Kqv4Kq+4KqCIOCqm+CrgOCqjyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgqqHgqr/gqrjgq43gqpXgqqjgq4fgqpXgq43gqp8g4KqV4Kqw4KuLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4KqV4Kq+4Kq44KuN4KqfIOCqleCqsOCqteCqvuCqqOCrgeCqgiDgqrDgq4vgqpXgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCqrOCqguCqpyDgqpXgqrDgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgqprgqrLgqr7gqrXgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCqpeCri+CqreCqvuCqteCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCqsOCri+CqleCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCqteCqv+CquOCrjeCqpOCrg+CqpCDgqpXgqrDgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCquOCqguCqleCrgeCqmuCqv+CqpCDgqpXgqrDgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgqobgqrLgq43gqqzgqq4g4KqV4Kqy4Kq+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCqteCrieCqsuCrjeCqr+CrgeCqriDgqrjgq43gqrLgqr7gqofgqqHgqrAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuCqleCri+CqiCDgqq7gq4DgqqHgqr/gqq/gqr4g4Kqq4Kq44KqC4KqmIOCqleCqsOCrh+CqsiDgqqjgqqXgq4AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuCqleCri+CqiCDgqq7gqr7gqrngqr/gqqTgq4Ag4KqJ4Kqq4Kqy4Kqs4KuN4KqnIOCqqOCqpeCrgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4Kq44KuN4KqV4KuN4Kqw4KuA4Kqo4Kqo4KuHIOCqleCqvuCquOCrjeCqnyDgqpXgqrDgq4Ag4Kqw4Kq54KuN4Kqv4Kq+4KqCIOCqm+CrhyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaGkvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oaS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU1MmE1OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oaS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgpLjgpL/gpLjgpY3gpJ/gpK4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4KSh4KS/4KS14KS+4KSH4KS4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4KSV4KS+4KS44KWN4KSfIOCkleCksOClh+CkgiDgpKzgpJ/gpKgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgpJXgpL7gpLjgpY3gpJ8g4KSV4KSw4KWH4KSCIOCkrOCkn+CkqC4g4KSh4KS/4KS44KSV4KSo4KWH4KSV4KWN4KSfIOCkueCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4KSV4KS+4KS44KWN4KSfIOCkleCksOClh+CkgiDgpKzgpJ/gpKguIOCkleCkqOClh+CkleCljeCknyDgpLngpYsg4KSw4KS54KS+IOCkueCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgpJXgpL7gpLjgpY3gpJ8g4KSV4KSw4KWH4KSCIOCkrOCkn+CkqC4g4KSV4KSo4KWH4KSV4KWN4KSfIOCkueCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLgpIfgpLgg4KSq4KSwIOCkleCkvuCkuOCljeKAjeCknyDgpJXgpLDgpYfgpIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgpKHgpL/gpLXgpL7gpIfgpLgg4KSi4KWC4KSC4KSiIOCksOCkueCkviDgpLngpYgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4KSh4KS/4KS44KSV4KSo4KWH4KSV4KWN4KSfIOCkleCksOClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuCkleCkvuCkuOCljeCknyDgpJXgpLDgpKjgpL4g4KSs4KSC4KSmIOCkleCksOClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4KSs4KSC4KSmIOCkleCksOClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCkmuCksuCkvuCkj+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4KSw4KWL4KSV4KWH4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4KSs4KSC4KSmIOCkleCksOClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCkteCkv+CkuOCljeCkpOCkvuCksCDgpJXgpLDgpYfgpIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCkm+Cli+Ckn+CkviDgpJXgpLDgpYfgpIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgpI/gpLLgpY3gpKzgpK4g4KSG4KSw4KWN4KSfIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCkteClieCksuCljeCkr+ClguCkriDgpLjgpY3gpLLgpL7gpIfgpKHgpLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuCkleCli+CkiCDgpK7gpYDgpKHgpL/gpK/gpL4g4KSa4KSv4KSo4KS/4KSkIOCkqOCkueClgOCkgiDgpLngpYgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuCkleCli+CkiCDgpJzgpL7gpKjgpJXgpL7gpLDgpYAg4KSu4KWM4KSc4KWC4KSmIOCkqOCkueClgOCkgiDgpLngpYgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCkuOCljeCkleCljeCksOClgOCkqCDgpJXgpL7gpLjgpY3gpJ8g4KS54KWLIOCksOCkueClgCDgpLngpYgiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWhyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHIvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjNDNlZTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHIvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3VzdGF2Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlVyZcSRYWppIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iR3VtYiB6YSBlbWl0aXJhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iR3VtYiB6YSBlbWl0aXJhbmplLiBWZXphIHByZWtpbnV0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iR3VtYiB6YSBlbWl0aXJhbmplLiBQb3Zleml2YW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJHdW1iIHphIGVtaXRpcmFuamUuIFBvdmV6YW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iRW1pdGlyYW5qZSBuYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlRyYcW+ZW5qZSB1cmXEkWFqYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJQcmVraW5pIHZlenUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJaYXVzdGF2aSBlbWl0aXJhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYXR2YXJhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdWtjaWphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXV6aXJhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iWmF1c3RhdmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJQcm/FoWlyaXZhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTYcW+aW1hbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iTmFzbG92bmljYSBhbGJ1bWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iS2xpemHEjSB6YSBnbGFzbm/Eh3UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5pamUgb2RhYnJhbiBuaWplZGFuIG1lZGlqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJJbmZvcm1hY2lqZSBuaXN1IGRvc3R1cG5lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJFbWl0aXJhbmplIHphc2xvbmEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWh1L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNmJkZmUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iUmVuZHN6ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRXN6a8O2esO2ayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IsOBdGvDvGxkw6lzIGdvbWIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLDgXRrw7xsZMOpcyBnb21iLiBLYXBjc29sYXQgYm9udHZhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLDgXRrw7xsZMOpcyBnb21iLiBDc2F0bGFrb3rDoXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iw4F0a8O8bGTDqXMgZ29tYi4gQ3NhdGxha296dGF0dmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iw4F0a8O8bGTDqXMgaWRlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iRXN6a8O2esO2ayBrZXJlc8Opc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iTGV2w6FsYXN6dMOhcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IsOBdGvDvGxkw6lzIGxlw6FsbMOtdMOhc2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkJlesOhcsOhcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkxlasOhdHN6w6FzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJTesO8bmV0ZWx0ZXTDqXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJMZcOhbGzDrXTDoXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJLaWJvbnTDoXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IsOWc3N6ZWNzdWvDoXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJMZW1lemJvcsOtdMOzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkhhbmdlcsWRc3phYsOhbHl6w7MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5pbmNzIG3DqWRpYSBraXbDoWxhc3p0dmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5pbmNzIGluZm9ybcOhY2nDsyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iS8OpcGVybnnFkXRhcnRhbG9tIMOhdGvDvGxkw6lzZSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHkvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oeS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVjODJiNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oeS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLVgNWh1bTVodWv1aHWgNWjIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItWN1aHWgNaE1aXWgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItWA1aXVvNWh1oDVsdWh1a/VtNWh1bYg1a/VuNWz1aHVryI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItWA1aXVvNWh1oDVsdWh1a/VtNWh1bYg1a/VuNWz1aHVrzog1Y3VodaA1oTVtiDVodW21bvVodW/1b7VodWuINWnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLVgNWl1bzVodaA1bHVodWv1bTVodW2INWv1bjVs9Wh1a86INWN1aHWgNaE1agg1a/VodW61aHVr9aB1b7VuNaC1bQg1aciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i1YDVpdW81aHWgNWx1aHVr9W01aHVtiDVr9W41bPVodWvOiDVjdWh1oDWhNWoINWv1aHVutWh1a/WgdW+1aHVriDVpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLUuNW21b/WgNWl1oQg1b3VodaA1oTVqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItWN1aHWgNaE1aXWgNWrINW41oDVuNW21bjWgtW0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItSx1bbVu9Wh1b/VpdWsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i1LTVodWk1aHWgNWl1oHVttWl1awg1bDVpdW81aHWgNWx1aHVr9W41oLVtNWoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLVk9Wh1a/VpdWsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i1YbVvtWh1aPVodaA1a/VpdWsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLUtNWh1aTVodaAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i1LTVodWk1aHWgNWl1oHVttWl1awiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLUuNW21aTVodaA1bHVodWv1aXVrCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i1L/VuNWu1a/VpdWsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i1LHVrNWi1bjVtNWrINW31aHVutWr1a8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i1YHVodW11bbVqyDVuNaC1arVo9W21bjWgtWp1bXVodW2INWv1aHWgNWj1aHVvtW41oDVq9W5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLVhNWl1aTVq9WhINaG1aHVtdWs1aXWgCDVudWl1bYg1ajVttW/1oDVvtWl1awiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItWP1aXVstWl1a/VuNaC1anVtdW41oLVttW21aXWgNWoINWw1aHVvdWh1bbVpdWs1asg1bnVpdW2Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLUt9Wv1oDVodW21agg1bDVpdW81aHWgNWx1aHVr9W+1bjWgtW0INWnIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pbi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWluL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjI3NTJlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWluL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJQZXJhbmdrYXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJUb21ib2wgQ2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlRvbWJvbCBDYXN0LiBUZXJwdXR1cyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iVG9tYm9sIENhc3QuIE1lbmdodWJ1bmdrYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iVG9tYm9sIENhc3QuIFRlcmh1YnVuZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJUcmFuc21pc2lrYW4ga2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJNZW5jYXJpIHBlcmFuZ2thdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJQdXR1c2thbiBzYW1idW5nYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJIZW50aWthbiBjYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJUdXR1cCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlB1dGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJKZWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iQmVyaGVudGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJMdWFza2FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJDaXV0a2FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iU2FtcHVsIGFsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkJpbGFoIGdlc2VyIHZvbHVtZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iVGlkYWsgYWRhIG1lZGlhIHlhbmcgZGlwaWxpaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iVGlkYWsgYWRhIGluZm8geWFuZyB0ZXJzZWRpYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iVHJhbnNtaXNpIGxheWFyIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pcy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWlzL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTM1ZWE2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWlzL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IktlcmZpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlTDpmtpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iw5p0c2VuZGluZ2FyaG5hcHB1ciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IsOadHNlbmRpbmdhcmhuYXBwdXIuIEFmdGVuZ3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IsOadHNlbmRpbmdhcmhuYXBwdXIuIFRlbmdpc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iw5p0c2VuZGluZ2FyaG5hcHB1ci4gVGVuZ3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iU2VuZGEgw7p0IMOtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTGVpdGHDsCBhw7AgdMOma2p1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJBZnRlbmdqYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3TDtsOwdmEgw7p0c2VuZGluZ3UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Ikxva2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJTcGlsYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iSGzDqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0w7bDsHZhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iU3TDpmtrYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iTWlubmthIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iUGzDtnR1dW1zbGFnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkhsasOzw7BzdHlya3NzbGXDsGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkVuZ2lubiBtacOwaWxsIHZhbGlubiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iRW5nYXIgdXBwbMO9c2luZ2FyIMOtIGJvw7BpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJTa2rDoXIgc2VuZHVyIMO6dCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXQvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzE2ZTNhYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iUHVsc2FudGUgVHJhc21ldHRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iUHVsc2FudGUgVHJhc21ldHRpLiBEaXNjb25uZXNzbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iUHVsc2FudGUgVHJhc21ldHRpLiBDb25uZXNzaW9uZSBpbiBjb3JzbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJQdWxzYW50ZSBUcmFzbWV0dGkuIENvbm5lc3NvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlRyYXNtZXR0aSBhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iUmljZXJjYSBkaSBkaXNwb3NpdGl2aSBpbiBjb3JzbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJTY29sbGVnYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkludGVycm9tcGkgdHJhc21pc3Npb25lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJDaGl1ZGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSaXByb2R1Y2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iSW50ZXJyb21waSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkVzcGFuZGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNvbXByaW1pIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQ29wZXJ0aW5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkRpc3Bvc2l0aXZvIGRpIHNjb3JyaW1lbnRvIGRlbCB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lc3N1biBjb250ZW51dG8gbXVsdGltZWRpYWxlIHNlbGV6aW9uYXRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOZXNzdW5hIGluZm9ybWF6aW9uZSBkaXNwb25pYmlsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iVHJhc21pc3Npb25lIGRlbGxvIHNjaGVybW8gaW4gY29yc28iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWl3L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXcvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MmIwY2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXcvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i157Xoteo15vXqiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLXnteb16nXmdeo15nXnSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuKAj9ec15fXptefINeU16TXotec16ogQ2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuKAj9ec15fXptefINeU16TXotec16ogQ2FzdC4g157XoNeV16rXpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4oCP15zXl9em158g15TXpNei15zXqiBDYXN0LiDXnteq15fXkdeoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuKAj9ec15fXptefINeU16TXotec16ogQ2FzdC4g157Xl9eV15HXqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLXlNei15HXqNeUINeQ15wiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLXnteX16TXqSDXnteb16nXmdeo15nXnSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLXoNeq16ciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLXlNek16HXpyDXkNeqINeU15TXoteR16jXlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i16HXkteV16giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLXlNek16LXnCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i15TXqdeU15QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLXlNek16HXpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IteU16jXl9eRIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLXm9eV15XXpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Itei15jXmdek16og15DXnNeR15XXnSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLXnteX15XXldefINei15XXptee15QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Itec15Ag16DXkdeX16jXlCDXnteT15nXlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i15DXmdefINee15nXk9eiINeW157XmdefIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLXlNei15HXqNeqINee16HXmiDXnteq15HXptei16oiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWphL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGExNDk3MjcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i44K344K544OG44OgIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Iuerr+acqyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuOCreODo+OCueODiOOCouOCpOOCs+ODsyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuOCreODo+OCueODiCDjgqLjgqTjgrPjg7PjgILmjqXntprop6PpmaTmuIjjgb8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuOCreODo+OCueODiCDjgqLjgqTjgrPjg7PjgILmjqXntprkuK0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i44Kt44Oj44K544OIIOOCouOCpOOCs+ODs+OAguaOpee2mua4iOOBvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLjgq3jg6Pjgrnjg4jjgZnjgovjg4fjg5DjgqTjgrkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLnq6/mnKvjgpLmpJzntKLjgZfjgabjgYTjgb7jgZkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i5o6l57aa44KS6Kej6ZmkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i44Kt44Oj44K544OI44KS5YGc5q2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLplonjgZjjgosiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLlho3nlJ8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuS4gOaZguWBnOatoiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuWBnOatoiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuWxlemWiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i5oqY44KK44Gf44Gf44KAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i44Ki44Or44OQ44Og44Ki44O844OIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+Iumfs+mHj+OCueODqeOCpOODgOODvCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i44Oh44OH44Kj44Ki44GM6YG45oqe44GV44KM44Gm44GE44G+44Gb44KTIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLmg4XloLHjgYzjgYLjgorjgb7jgZvjgpMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IueUu+mdouOCkuOCreODo+OCueODiOOBl+OBpuOBhOOBvuOBmSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta2Evc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rYS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RhMDgxYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rYS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLhg6Hhg5jhg6Hhg6Lhg5Thg5vhg5AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4YOb4YOd4YOs4YOn4YOd4YOR4YOY4YOa4YOd4YOR4YOU4YOR4YOYIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4YOi4YOg4YOQ4YOc4YOh4YOa4YOY4YOg4YOU4YOR4YOY4YOhIOGDpuGDmOGDmuGDkOGDmeGDmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuGDouGDoOGDkOGDnOGDoeGDmuGDmOGDoOGDlOGDkeGDmOGDoSDhg6bhg5jhg5rhg5Dhg5nhg5guIOGDkuGDkOGDl+GDmOGDqOGDo+GDmuGDmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4YOi4YOg4YOQ4YOc4YOh4YOa4YOY4YOg4YOU4YOR4YOY4YOhIOGDpuGDmOGDmuGDkOGDmeGDmC4g4YOb4YOY4YOb4YOT4YOY4YOc4YOQ4YOg4YOU4YOd4YOR4YOhIOGDk+GDkOGDmeGDkOGDleGDqOGDmOGDoOGDlOGDkeGDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLhg6Lhg6Dhg5Dhg5zhg6Hhg5rhg5jhg6Dhg5Thg5Hhg5jhg6Eg4YOm4YOY4YOa4YOQ4YOZ4YOYLiDhg5Phg5Dhg5nhg5Dhg5Xhg6jhg5jhg6Dhg5Thg5Hhg6Phg5rhg5giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4YOi4YOg4YOQ4YOc4YOh4YOa4YOY4YOg4YOU4YOR4YOQOiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuGDm+GDneGDrOGDp+GDneGDkeGDmOGDmuGDneGDkeGDlOGDkeGDmOGDoSDhg5vhg53hg6vhg5jhg5Thg5Hhg5AuLi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4YOZ4YOQ4YOV4YOo4YOY4YOg4YOY4YOhIOGDkuGDkOGDrOGDp+GDleGDlOGDouGDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuGDouGDoOGDkOGDnOGDoeGDmuGDmOGDoOGDlOGDkeGDmOGDoSDhg6jhg5Thg6zhg6fhg5Xhg5Thg6Lhg5AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuGDk+GDkOGDruGDo+GDoOGDleGDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuGDk+GDkOGDmeGDleGDoOGDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4YOe4YOQ4YOj4YOW4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4YOo4YOU4YOs4YOn4YOV4YOU4YOi4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4YOS4YOQ4YOo4YOa4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLhg6nhg5Dhg5nhg5Thg6rhg5Xhg5AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLhg5Dhg5rhg5Hhg53hg5vhg5jhg6Eg4YOS4YOQ4YOg4YOU4YOZ4YOQ4YOc4YOYIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuGDruGDm+GDmOGDoSDhg6Hhg5rhg5Dhg5jhg5Phg5Thg6Dhg5giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuGDm+GDlOGDk+GDmOGDkCDhg5Dhg6Dhg6nhg5Thg6Phg5rhg5gg4YOQ4YOgIOGDkOGDoOGDmOGDoSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4YOY4YOc4YOk4YOd4YOg4YOb4YOQ4YOq4YOY4YOQIOGDkOGDoCDhg5Dhg6Dhg5jhg6Eg4YOu4YOU4YOa4YOb4YOY4YOh4YOQ4YOs4YOV4YOT4YOd4YOb4YOYIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLhg5vhg5jhg5vhg5Phg5jhg5zhg5Dhg6Dhg5Thg53hg5Hhg6Eg4YOU4YOZ4YOg4YOQ4YOc4YOY4YOhIOGDkuGDkOGDk+GDkOGDquGDlOGDm+GDkCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta2svc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ray9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRkY2JiMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ray9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQltKv0LnQtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLSmtKx0YDRi9C70pPRi9C70LDRgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCi0YDQsNC90YHQu9GP0YbQuNGP0LvQsNGDINGC0q/QudC80LXRgdGWIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iXCLQotGA0LDQvdGB0LvRj9GG0LjRj9C70LDRg1wiINGC0q/QudC80LXRgdGWLiDQkNC20YvRgNCw0YLRg9C70YsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Ilwi0KLRgNCw0L3RgdC70Y/RhtC40Y/Qu9Cw0YNcIiDRgtKv0LnQvNC10YHRli4g0prQvtGB0YvQu9GD0LTQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJcItCi0YDQsNC90YHQu9GP0YbQuNGP0LvQsNGDXCIg0YLSr9C50LzQtdGB0ZYuINKa0L7RgdGL0LvQtNGLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCa0LXQu9C10YHRltCz0LUg0YLRgNCw0L3RgdC70Y/RhtC40Y/Qu9Cw0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLSmtKx0YDRi9C70pPRi9C70LDRgNC00Ysg0YLQsNCx0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0JDQttGL0YDQsNGC0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQotGA0LDQvdGB0LvRj9GG0LjRj9C70LDRg9C00Ysg0YLQvtKb0YLQsNGC0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCW0LDQsdGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0J7QudC90LDRgtGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLQmtGW0LTRltGA0YLRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCi0L7Sm9GC0LDRgtGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0JbQsNGOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQltC40Y4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQkNC70YzQsdC+0Lwg0YjQtdCx0LXRgNGWIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCU0YvQsdGL0YEg0LTQtdKj0LPQtdC50ZbQvdGW0qMg0LbSr9Cz0ZbRgNGC0LrRltGB0ZYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCV0YjQsdGW0YAg0YLQsNGB0YPRiNGLINGC0LDSo9C00LDQu9C80LDSk9Cw0L0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItKa0L7QuyDQttC10YLRltC80LTRliDQsNKb0L/QsNGA0LDRgiDQttC+0psiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItCt0LrRgNCw0L3QtNGLINGC0YDQsNC90YHQu9GP0YbQuNGP0LvQsNGDIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rbS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWttL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDQ3ODBlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWttL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuGelOGfkuGemuGeluGfkOGek+GfkuGekiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLhnqfhnpThnoDhnprhno7hn40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLhnpThn4rhnrzhno/hnrvhnoThnoHhnrbhnp8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLhnoHhnrbhnp/hnpThn4rhnrzhno/hnrvhnoThn5Yg4Z6U4Z624Z6T4Z6A4Z624Z6P4Z+L4Z6V4Z+S4Z6P4Z624Z6F4Z+LIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLhnoHhnrbhnp/hnpThn4rhnrzhno/hnrvhnoThn5Yg4Z6A4Z+G4Z6W4Z674Z6E4Z6X4Z+S4Z6H4Z624Z6U4Z+LIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuGegeGetuGen+GelOGfiuGevOGej+Geu+GehOGfliDhnpThnrbhnpPhnpfhn5LhnofhnrbhnpThn4vhnqDhnr7hnpkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4Z6U4Z6J4Z+S4Z6H4Z684Z6T4Z6R4Z+FIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4Z6A4Z+G4Z6W4Z674Z6E4Z6f4Z+S4Z6c4Z+C4Z6E4Z6a4Z6A4Z6n4Z6U4Z6A4Z6a4Z6O4Z+NIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuGeleGfkuGeiuGetuGeheGfiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuGeiOGelOGfi+Gel+GfkuGeh+GetuGelOGfiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4Z6U4Z634Z6RIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4Z6F4Z624Z6A4Z+LIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLhnpXhn5LhnqLhnrbhnoAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLhnojhnpThn4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLhnpbhnoThn5LhnprhnrjhnoAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuGelOGehOGfkuGemuGeveGemCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuGen+GfkuGek+GetuGeiuGfg+Gen+Get+Gem+GfkuGelOGfiOGeouGetuGem+Gfi+GelOGfiuGeu+GemCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLhnprhnpThnrbhnprhnoDhnpjhn5Lhnprhnrfhno/hnp/hn4bhnqHhn4HhnoQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuGeguGfkuGemOGetuGek+GegOGetuGemuGeh+GfkuGemuGevuGen+GemOGfgeGejOGfgOGekeGfgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4Z6Y4Z634Z6T4Z6Y4Z624Z6T4Z6W4Z+Q4Z6P4Z+M4Z6Y4Z624Z6T4Z6R4Z+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLhnoDhn4bhnpbhnrvhnoThnoHhnrbhnp/hnqLhn4HhnoDhn5LhnprhnoThn4siPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtuL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta24vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMzdmZGQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta24vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4LK44LK/4LK44LON4LKf4LKCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuCyuOCyvuCyp+CyqOCyl+Cys+CzgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuCyrOCyv+CypOCzjeCypOCysOCyv+CyuOCzgSDgsqzgsp/gsqjgs43igIwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgs4Eg4LKs4LKf4LKo4LON4oCMLiDgsrjgsoLgsqrgsrDgs43gspUg4LKV4LKh4LK/4LKk4LKX4LOK4LKz4LK/4LK44LKy4LK+4LKX4LK/4LKm4LOGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgs4Eg4LKs4LKf4LKo4LON4oCMLiDgsrjgsoLgsqrgsrDgs43gspXgsr/gsrjgsrLgsr7gspfgs4HgsqTgs43gsqTgsr/gsqbgs4YiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4LKs4LK/4LKk4LON4LKk4LKw4LK/4LK44LOBIOCyrOCyn+CyqOCzjeKAjC4g4LK44LKC4LKq4LKw4LON4LKV4LK/4LKk4LKX4LOK4LKC4LKh4LK/4LKm4LOGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCyh+CypuCyleCzjeCyleCzhiDgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgsr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgsrjgsr7gsqfgsqjgspfgsrPgsqjgs43gsqjgs4Eg4LK54LOB4LKh4LOB4LKV4LKy4LK+4LKX4LOB4LKk4LON4LKk4LK/4LKm4LOGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCyuOCyguCyquCysOCzjeCylSDgspXgsqHgsr/gsqTgspfgs4rgsrPgsr/gsrjgs4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgs4HgsrXgsr/gspXgs4Yg4LKo4LK/4LKy4LON4LKy4LK/4LK44LK/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgsq7gs4Hgsprgs43gsprgs4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgsqrgs43gsrLgs4cg4LKu4LK+4LKh4LK/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgsrXgsr/gsrDgsr7gsq4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgsqjgsr/gsrLgs43gsrLgsr/gsrjgsr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgsrXgsr/gsrjgs43gsqTgsrDgsr/gsrjgs4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCyuOCyguCyleCzgeCymuCyv+CyuOCzgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCyhuCysuCzjeCyrOCyruCzjSDgspXgsrLgs4YiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4LK14LK+4LKy4LON4LKv4LOC4LKu4LONIOCyuOCzjeCysuCziOCyoeCysOCzjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4LKv4LK+4LK14LOB4LKm4LOHIOCyruCyvuCyp+CzjeCyr+CyriDgsobgsq/gs43gspXgs4bgsq7gsr7gsqHgsrLgsr7gspfgsr/gsrLgs43gsrIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuCyr+CyvuCyteCzgeCypuCzhyDgsq7gsr7gsrngsr/gsqTgsr8g4LKy4LKt4LON4LKv4LK14LK/4LKy4LON4LKyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgsqrgsrDgsqbgs4bgsq/gsqjgs43gsqjgs4Eg4LKs4LK/4LKk4LON4LKk4LKw4LK/4LK44LKy4LK+4LKX4LOB4LKk4LON4LKk4LK/4LKm4LOGIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rby9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTg5M2E5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuyLnOyKpO2FnCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLquLDquLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLsoITshqEg67KE7Yq8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i7KCE7IahIOuyhO2KvC4g7Jew6rKwIO2VtOygnOuQqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i7KCE7IahIOuyhO2KvC4g7Jew6rKwIOykkSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLsoITshqEg67KE7Yq8LiDsl7DqsrDrkKgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i7KCE7Iah7ZWgIOq4sOq4sCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Iuq4sOq4sOulvCDssL7ripQg7KSRIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuyXsOqysCDtlbTsoJwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLsoITshqEg7KSR7KeAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLri6vquLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLsnqzsg50iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuydvOyLnOykkeyngCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuykkeyngCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Iu2OvOy5mOq4sCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i7KCR6riwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i7JWo67KU7JWE7Yq4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuuzvOulqCDsiqzrnbzsnbTrjZQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuyEoO2Dne2VnCDrr7jrlJTslrQg7JeG7J2MIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLsoJXrs7TqsIAg7JeG7Iq164uI64ukLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i7ZmU66m0IOyghOyGoSDspJEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWt5L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta3kvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3ODEzYWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta3kvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KLRg9GC0YPQvCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQotKv0LfQvNOp0LrRgtOp0YAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLQotGL0YjQutGLINGN0LrRgNCw0L3Qs9CwINGH0YvQs9Cw0YDRg9GDINCx0LDRgdC60YvRh9GLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i0KLRi9GI0LrRiyDRjdC60YDQsNC90LPQsCDRh9GL0LPQsNGA0YPRgyDQsdCw0YHQutGL0YfRiy4g0KLSr9C30LzTqdC6INCw0LbRi9GA0LDQvyDRgtGD0YDQsNGCLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i0KLRi9GI0LrRiyDRjdC60YDQsNC90LPQsCDRh9GL0LPQsNGA0YPRgyDQsdCw0YHQutGL0YfRiy4g0KLSr9C30LzTqdC6INGC0YPRgtCw0YjRg9GD0LTQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLQotGL0YjQutGLINGN0LrRgNCw0L3Qs9CwINGH0YvQs9Cw0YDRg9GDINCx0LDRgdC60YvRh9GLLiDQotKv0LfQvNOp0Log0YLRg9GC0LDRiNGL0L8g0YLRg9GA0LDRgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLQotOp0LzTqdC90LrSr9Cz06kg0YfRi9Cz0LDRgNGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLQotKv0LfQvNOp0LrRgtOp0YAg0LjQt9C00LXQu9Kv0q/QtNOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItCQ0LbRi9GA0LDRgtGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQotGL0YjQuiDRjdC60YDQsNC90LPQsCDRh9GL0LPQsNGA0L3RgyDRgtC+0LrRgtC+0YLRg9GDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQltCw0LHRg9GDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0J7QudC90L7RgtGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCi0YvQvdC00YvRgNGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQotC+0LrRgtC+0YLRg9GDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0JbQsNC50YvQvyDQutOp0YDRgdOp0YLSr9KvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQltGL0LnRi9GI0YLRi9GA0YPRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCQ0LvRjNCx0L7QvCDQvNGD0LrQsNCx0LDRgdGLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItKu0L3QtNKvINC60LDRgtGD0YPQu9Cw0YLRg9GD0YfRgyDRgdGL0LTRi9GA0LzQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0JHQuNGAINC00LAg0LzQtdC00LjQsCDRhNCw0LnQuyDRgtCw0L3QtNCw0LvQs9Cw0L0g0LbQvtC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQrdGHINC80LDQsNC70YvQvNCw0YIg0LbQvtC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQotGL0YjQutGLINGN0LrRgNCw0L3Qs9CwINGH0YvQs9Cw0YDRi9C70YPRg9C00LAiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWxhbmQvZGltZW5zLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWxhbmQvZGltZW5zLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlmMWUxZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sYW5kL2RpbWVucy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPCEtLSBNZWRpYVJvdXRlQ29udHJvbGxlcidzIHZvbHVtZSBncm91cCBsaXN0IC0tPgotICAgIDxlYXQtY29tbWVudCAvPgotICAgIDwhLS0gTWF4aW11bSBoZWlnaHQgb2Ygdm9sdW1lIGdyb3VwIGxpc3QuIC0tPgotICAgIDxkaW1lbiBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X21heF9oZWlnaHQiPjEzMmRwPC9kaW1lbj4KLSAgICA8IS0tIEhlaWdodCBvZiB2b2x1bWUgZ3JvdXAgaXRlbS4gLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9oZWlnaHQiPjYxZHA8L2RpbWVuPgotICAgIDwhLS0gU2l6ZSBvZiBhbiBpdGVtJ3MgaWNvbi4gLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9pY29uX3NpemUiPjE4ZHA8L2RpbWVuPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sby9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWxvL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTczN2RiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWxvL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuC6peC6sOC6muC6u+C6miI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLguq3gurjgupvgurDguoHguq3gupkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgupvgurjgu4jguqHigIvguoTgurLigIvguqrigIvgupfgu4wiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgupvgurjgu4jguqHguqrgurvgu4jguofguqrgurHgupnguo3gurLgupkuIOC6leC6seC6lOC6geC6suC6meC7gOC6iuC6t+C7iOC6reC6oeC6leC7jeC7iOC7geC6peC7ieC6pyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4Lqb4Lq44LuI4Lqh4Lqq4Lq74LuI4LqH4Lqq4Lqx4LqZ4LqN4Lqy4LqZLiDguoHgurPguqXgurHguofgu4Dguorgurfgu4jguq3guqHgupXgu43gu4giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4Lqb4Lq44LuI4Lqh4Lqq4Lq74LuI4LqH4Lqq4Lqx4LqZ4LqN4Lqy4LqZLiDgu4Dguorgurfgu4jguq3guqHgupXgu43gu4jgu4HguqXgu4nguqciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4Lqq4Lq74LuI4LqH4Lqq4Lqx4LqZ4LqN4Lqy4LqZ4Lqr4LqyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4LqB4Lqz4Lql4Lqx4LqH4oCL4LqK4Lqt4LqB4oCL4Lqr4Lqy4oCL4Lqt4Lq44oCL4Lqb4Lqw4oCL4LqB4Lqt4LqZIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuC6leC6seC6lOC6geC6suC6meC7gOC6iuC6t+C7iOC6reC6oeC6leC7jeC7iCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuC6ouC6uOC6lOC6geC6suC6meC6quC6u+C7iOC6h+C6quC6seC6meC6jeC6suC6mSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4Lqb4Lq04LqUIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4Lqr4Lq84Lq04LuJ4LqZIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLguqLgurjgupTguorgurvgu4jguqfguoTgurLguqciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLguqLgurjgupQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLguoLgurDguqvguo3gurLguo0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuC6q+C6jeC7jeC7ieC6peC6u+C6hyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuC7nOC7ieC6suC6m+C6u+C6geC6reC6sOC6peC6sOC6muC7jeC7ieC6siI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgupXgurvguqfgupvgurHguprguqXgurDgupTgurHguprguqrgur3guociPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuC6muC7jeC7iOKAi+C7hOC6lOC7ieKAi+C7gOC6peC6t+C6reC6geKAi+C6oeC6teKAi+C7gOC6lOC6jeKAi+C7g+C6lOKAi+C7hOC6p+C7iSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4Lqa4LuN4LuI4oCL4Lqh4Lq14oCL4LqC4LuN4LuJ4oCL4Lqh4Lq54LqZIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLguoHgurLgupnguqrgurvgu4jguofgup7gurLguprgu5zgu4ngurLguojgu40iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWx0L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbHQvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmMDM2ZDEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbHQvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLErnJlbmdpbmlhaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IlBlcmRhdmltbyBteWd0dWthcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlBlcmRhdmltbyBteWd0dWthcy4gQXRzaWp1bmd0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iUGVyZGF2aW1vIG15Z3R1a2FzLiBQcmlzaWp1bmdpYW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlBlcmRhdmltbyBteWd0dWthcy4gUHJpc2lqdW5ndGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iUGVyZHVvdGkgxK8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJSYW5kYW1pIMSvcmVuZ2luaWFpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkF0anVuZ3RpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3VzdGFiZHl0aSBwZXJkYXZpbcSFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJVxb5kYXJ5dGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJMZWlzdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlByaXN0YWJkeXRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3VzdGFiZHl0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IknFoXNrbGVpc3RpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTdXRyYXVrdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bW8gdmlyxaFlbGlzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkdhcnN1bW8gxaFsaWF1xb5pa2xpcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmVwYXNpcmlua3RhIGpva2lhIG1lZGlqYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iSW5mb3JtYWNpamEgbmVwYXNpZWtpYW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJQZXJkdW9kYW1hcyBla3JhbmFzIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sdi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWx2L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NTQwNjNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWx2L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3TEk21hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkllcsSrY2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQXByYWlkZXMgcG9nYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkFwcmFpZGVzIHBvZ2EuIFNhdmllbm9qdW1zIHDEgXJ0cmF1a3RzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJBcHJhaWRlcyBwb2dhLiBOb3RpZWsgc2F2aWVub2p1bWEgaXp2ZWlkZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJBcHJhaWRlcyBwb2dhLiBTYXZpZW5vanVtcyBpenZlaWRvdHMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQXByYWlkxKvFoWFuYSB1eiBpZXLEq2NpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTm90aWVrIGllcsSrxI11IG1la2zEk8WhYW5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkF0dmllbm90Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQXB0dXLEk3QgYXByYWlkaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQWl6dsSTcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJBdHNrYcWGb3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkFwdHVyxJN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iQXB0dXLEk3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJJenbEk3JzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iU2FrxLxhdXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bWEgdsSBY2nFhsWhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlNrYcS8dW1hIHNsxKtkbmlzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOYXYgYXRsYXPEq3RpIG11bHRpdmlkZXMgZmFpbGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5hdiBwaWVlamFtYSBpbmZvcm3EgWNpamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Ik5vdGllayBla3LEgW5hIGFwcmFpZGUiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1rL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbWsvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyZGVlMzYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbWsvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KHQuNGB0YLQtdC8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItCj0YDQtdC00LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLQmtC+0L/Rh9C10YLQviDQt9CwIENhc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQmtC+0L/Rh9C1INC30LAgQ2FzdC4g0JjRgdC60LvRg9GH0LXQvdC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQmtC+0L/Rh9C1INC30LAgQ2FzdC4g0KHQtSDQv9C+0LLRgNC30YPQstCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCa0L7Qv9GH0LUg0LfQsCBDYXN0LiDQn9C+0LLRgNC30LDQvdC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCV0LzQuNGC0YPQstCw0Zgg0L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItCh0LUg0LHQsNGA0LDQsNGCINGD0YDQtdC00LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0JjRgdC60LvRg9GH0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQodC+0L/RgNC4INCz0L4g0LXQvNC40YLRg9Cy0LDRmtC10YLQviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JfQsNGC0LLQvtGA0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQoNC10L/RgNC+0LTRg9GG0LjRgNCw0ZgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCf0LDRg9C30LjRgNCw0ZgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQodC+0L/RgNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0J/RgNC+0YjQuNGA0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCh0L7QsdC10YDQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCa0L7RgNC40YbQsCDQvdCwINCw0LvQsdGD0LwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0JvQuNC30LPQsNGHINC30LAg0ZjQsNGH0LjQvdCwINC90LAg0LfQstGD0LoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCd0LUg0YHQtSDQuNC30LHRgNCw0L3QuCDQvNC10LTQuNGD0LzQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0J3QtdC80LAg0LTQvtGB0YLQsNC/0L3QuCDQuNC90YTQvtGA0LzQsNGG0LjQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0JXQutGA0LDQvdC+0YIg0YHQtSDQtdC80LjRgtGD0LLQsCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbWwvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tbC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ5MTRiOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tbC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgtLjgtL/gtLjgtY3gtLHgtY3gtLHgtIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4LSJ4LSq4LSV4LSw4LSj4LSZ4LWN4LSZ4LW+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4LSf4LS+4LSq4LWN4LSq4LWB4LSa4LWG4LSv4LWN4LSv4LWB4LSVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4LSV4LS+4LS44LWN4LSx4LWN4LSx4LWNIOC0rOC0n+C1jeC0n+C1ui4g4LS14LS/4LSa4LWN4LSb4LWH4LSm4LS/4LSa4LWN4LSa4LWBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgtJXgtL7gtLjgtY3gtLHgtY3gtLHgtY0g4LSs4LSf4LWN4LSf4LW6LiDgtJXgtKPgtJXgtY3igIzgtLHgtY3gtLHgtYHgtJrgtYbgtK/gtY3gtK/gtYHgtKjgtY3gtKjgtYEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4LSV4LS+4LS44LWN4LSx4LWN4LSx4LWNIOC0rOC0n+C1jeC0n+C1ui4g4LSV4LSj4LSV4LWN4LSx4LWN4LSx4LWB4LSa4LWG4LSv4LWN4LSk4LWBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuC0h+C0pOC0v+C0suC1h+C0leC1jeC0leC1jSDgtJXgtL7gtLjgtY3gtLHgtY3gtLHgtYHgtJrgtYbgtK/gtY3gtK/gtYHgtJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgtIngtKrgtJXgtLDgtKPgtJngtY3gtJngtb4g4LSV4LSj4LWN4LSf4LWG4LSk4LWN4LSk4LWB4LSo4LWN4LSo4LWBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuC0teC0v+C0muC1jeC0m+C1h+C0puC0v+C0leC1jeC0leC1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuC0leC0vuC0uOC1jeC0seC1jeC0seC1geC0muC1huC0r+C1jeC0r+C1vSDgtKjgtL/gtbzgtKTgtY3gtKTgtYHgtJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuC0heC0teC0uOC0vuC0qOC0v+C0quC1jeC0quC0v+C0leC1jeC0leC1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuC0quC1jeC0suC1hyDgtJrgtYbgtK/gtY3gtK/gtYHgtJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuC0pOC1veC0leC1jeC0leC0vuC0suC0giDgtKjgtL/gtbzgtKTgtY3gtKTgtYIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgtKjgtL/gtLDgtY3igI3gtKTgtY3gtKTgtYHgtJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgtLXgtL/gtJXgtLjgtL/gtKrgtY3gtKrgtL/gtJXgtY3gtJXgtYHgtJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuC0muC1geC0sOC1geC0leC1jeC0leC1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuC0huC1veC0rOC0giDgtIbgtbzgtJ/gtY3gtJ/gtY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4LS14LWL4LSz4LS/4LSv4LSCIOC0uOC1jeC0suC1iOC0oeC1vCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4LSu4LWA4LSh4LS/4LSv4LSv4LWK4LSo4LWN4LSo4LWB4LSCIOC0pOC0v+C0sOC0nuC1jeC0nuC1huC0n+C1geC0pOC1jeC0pOC0v+C0n+C1jeC0n+C0v+C0suC1jeC0siI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4LS14LS/4LS14LSw4LSZ4LWN4LSZ4LSz4LWK4LSo4LWN4LSo4LWB4LSCIOC0suC0reC1jeC0r+C0ruC0suC1jeC0siI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4LS44LWN4oCM4LSV4LWN4LSw4LWA4LW7IOC0leC0vuC0uOC1jeC0seC1jeC0seC1geC0muC1huC0r+C1jeC0r+C1geC0qOC1jeC0qOC1gSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbW4vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tbi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWY4N2M5Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tbi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodC40YHRgtC10LwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0KLTqdGF06nTqdGA06nQvNC20q/Sr9C0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0JTQsNC80LbRg9GD0LvQsNGFINGC0L7QstGH0LvRg9GD0YAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQlNCw0LzQttGD0YPQu9Cw0YUg0YLQvtCy0YfQu9GD0YPRgC4g0KHQsNC70YHQsNC9Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQlNCw0LzQttGD0YPQu9Cw0YUg0YLQvtCy0YfQu9GD0YPRgC4g0KXQvtC70LHQvtC2INCx0LDQudC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0JTQsNC80LbRg9GD0LvQsNGFINGC0L7QstGH0LvRg9GD0YAuINCl0L7Qu9Cx0L7Qs9C00YHQvtC9Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCU0LDQvNC20YPRg9C70LDRhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItCi06nRhdOp06nRgNOp0LzQtiDRhdCw0LnQtiDQsdCw0LnQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItCh0LDQu9Cz0LDRhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCU0LDQvNC20YPRg9C70LDRhdGL0LMg0LfQvtCz0YHQvtC+0YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCl0LDQsNGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0KLQvtCz0LvRg9GD0LvQsNGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLQotKv0YAg0LfQvtCz0YHQvtC+0YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQl9C+0LPRgdC+0L7RhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItCU0Y3Qu9Cz0Y3RhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0KXRg9GA0LDQsNGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0KbQvtC80LPQuNC50L0g0LfRg9GA0LDQsyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLQlNGD0YPQvdGLINGC0q/QstGI0LjQvSDRgtCw0LDRgNGD0YPQu9Cw0LPRhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0K/QvNCw0YAg0Ycg0LzQtdC00LjQsCDRgdC+0L3Qs9C+0L7Qs9Kv0LkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItCc0Y3QtNGN0Y3Qu9GN0Lsg0LHQsNC50YXQs9Kv0Lkg0LHQsNC50L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0JTRjdC70LPRjdGG0LjQudCzINC00LDQvNC20YPRg9C70LYg0LHQsNC50L3QsCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tci9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZmYmViYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tci9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgpLjgpL/gpLjgpY3gpJ/gpK4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4KSh4KS/4KS14KWN4KS54KS+4KSH4KS44KWH4KS4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4KSV4KS+4KS44KWN4KSfIOCkrOCkn+CkoyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuCkleCkvuCkuOCljeCknyDgpKzgpJ/gpKMuIOCkoeCkv+CkuOCljeCkleCkqOClh+CkleCljeCknyDgpJXgpYfgpLLgpYciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuCkleCkvuCkuOCljeCknyDgpKzgpJ/gpKMuIOCkleCkqOClh+CkleCljeCknyDgpJXgpLDgpKQg4KSG4KS54KWHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuCkleCkvuCkuOCljeCknyDgpKzgpJ/gpKMuIOCkleCkqOClh+CkleCljeCknyDgpJXgpYfgpLLgpYciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4KSv4KS+4KS14KSwIOCkleCkvuCkuOCljeCknyDgpJXgpLDgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgpKHgpL/gpLXgpY3gpLngpL7gpIfgpLjgpYfgpLgg4KS24KWL4KSn4KSkIOCkhuCkueClhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgpKHgpL/gpLjgpY3igI3gpJXgpKjgpYfgpJXgpY3igI3gpJ8g4KSV4KSw4KS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4KSV4KS+4KS44KWN4KSfIOCkleCksOCko+ClhyDgpKXgpL7gpILgpKzgpLXgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCkrOCkguCkpiDgpJXgpLDgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgpKrgpY3gpLLgpYcg4KSV4KSw4KS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgpLXgpL/gpLDgpL7gpK4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgpKXgpL7gpILgpKzgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgpLXgpL/gpLjgpY3gpKTgpYPgpKQg4KSV4KSw4KS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgpLjgpILgpJXgpYHgpJrgpL/gpKQg4KSV4KSw4KS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4KSF4KSy4KWN4KSs4KSuIOCkleCksuCkviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgpLXgpY3gpLngpYngpLLgpY3gpK/gpYLgpK4g4KS44KWN4KSy4KS+4KSv4KSh4KSwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgpK7gpYDgpKHgpL/gpK/gpL4g4KSo4KS/4KS14KSh4KSy4KS+IOCkqOCkvuCkueClgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4KSV4KWL4KSj4KSk4KWA4KS54KWAIOCkruCkvuCkueCkv+CkpOClgCDgpIngpKrgpLLgpKzgpY3gpKcg4KSo4KS+4KS54KWAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgpLjgpY3gpJXgpY3gpLDgpYDgpKgg4KSV4KS+4KS44KWN4oCN4KSfIOCkleCksOCkpCDgpIbgpLngpYciPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1zL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXMvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NWU0ODAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXMvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlBlcmFudGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCdXRhbmcgSGFudGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQnV0YW5nIGhhbnRhci4gU2FtYnVuZ2FuIGRpcHV0dXNrYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJ1dGFuZyBoYW50YXIuIE1lbnlhbWJ1bmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQnV0YW5nIGhhbnRhci4gRGlzYW1idW5na2FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkhhbnRhciBrZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Ik1lbmNhcmkgcGVyYW50aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJQdXR1c2thbiBzYW1idW5nYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJCZXJoZW50aSBtZW5naGFudGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJUdXR1cCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+Ik1haW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkplZGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJCZXJoZW50aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IktlbWJhbmdrYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlJ1bnR1aGthbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IlNlbmkgYWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iUGVsdW5jdXIga2VsYW50YW5nYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IlRpYWRhIG1lZGlhIGRpcGlsaWgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik1ha2x1bWF0IHRpZGFrIHRlcnNlZGlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJNZW5naGFudGFyIHNrcmluIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1teS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW15L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODNkODA1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW15L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuGAheGAlOGAheGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLhgIXhgIDhgLrhgJXhgIXhgLnhgIXhgIrhgLrhgLjhgJnhgLvhgKzhgLgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLhgIDhgKzhgIXhgLrhgJDhgLrhgJzhgK/hgJXhgLrhgJvhgJThgLog4YCB4YCc4YCv4YCQ4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4YCA4YCs4YCF4YC64YCB4YCc4YCv4YCQ4YC64YGLIOGAgeGAu+GAreGAkOGAuuGAhuGAgOGAuuGAmeGAkeGArOGAuOGAleGAqyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4YCA4YCs4YCF4YC64YCB4YCc4YCv4YCQ4YC64YGLIOGAgeGAu+GAreGAkOGAuuGAhuGAgOGAuuGAlOGAseGAnuGAiuGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLhgIDhgKzhgIXhgLrhgIHhgJzhgK/hgJDhgLrhgYsg4YCB4YC74YCt4YCQ4YC64YCG4YCA4YC64YCR4YCs4YC44YCe4YCK4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuGAgOGArOGAheGAuuGAnOGAr+GAleGAuuGAm+GAlOGAuiDhgIXhgIDhgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLhgIXhgIDhgLrhgJXhgIXhgLnhgIXhgIrhgLrhgLjhgJnhgLvhgKzhgLgg4YCb4YC+4YCs4YCW4YC94YCx4YCB4YC84YCE4YC64YC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuGAhuGAgOGAuuGAnuGAveGAmuGAuuGAmeGAvuGAryDhgJbhgLzhgJDhgLrhgJvhgJThgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLhgIDhgKzhgIXhgLrhgJzhgK/hgJXhgLrhgIHhgLzhgIThgLrhgLgg4YCb4YCV4YC64YCb4YCU4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLhgJXhgK3hgJDhgLrhgJvhgJThgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLhgJbhgL3hgIThgLfhgLrhgJvhgJThgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuGAgeGAj+GAm+GAleGAuuGAm+GAlOGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuGAm+GAleGAuuGAm+GAlOGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuGAluGAvOGAlOGAt+GAuuGAgeGAu+GAm+GAlOGAuuGBgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4YCB4YCx4YCr4YCA4YC64YCe4YCt4YCZ4YC64YC44YCb4YCU4YC6Li4uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4YCh4YCa4YC64YCc4YC64YCY4YCZ4YC64YCV4YCv4YC2Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuGAoeGAnuGAtuGAoeGAkOGAreGAr+GAuOGAoeGAgOGAu+GAmuGAuuGAgeGAu+GAreGAlOGAuuGAnuGAiuGAt+GAuiDhgIbhgJzhgK3hgK/hgIDhgLrhgJLhgKsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuGAmeGAiuGAuuGAnuGAiuGAt+GAuuGAmeGAruGAkuGAruGAmeGAviDhgJnhgJvhgL3hgLHhgLjhgIHhgLvhgJrhgLrhgJHhgKzhgLjhgJXhgKsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuGAoeGAgeGAu+GAgOGAuuGAoeGAnOGAgOGAuiDhgJnhgJvhgJvhgL7hgK3hgJThgK3hgK/hgIThgLrhgJXhgKsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuGAkOGAiuGAuuGAuOGAluGAvOGAkOGAuuGAm+GAseGAuCDhgJnhgLvhgIDhgLrhgJThgL7hgKzhgJXhgLzhgIThgLoiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5iL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNzY0YzkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkVuaGV0ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0LWlrb25ldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3Qta25hcHBlbi4gRnJha29ibGV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0LWtuYXBwZW4uIEtvYmxlciB0aWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdC1rbmFwcGVuLiBUaWxrb2JsZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdCB0aWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJTw7hrZXIgZXR0ZXIgZW5oZXRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJLb2JsZSBmcmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdG9wcCBjYXN0aW5nZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Ikx1a2siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJTcGlsbCBhdiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iU2V0dCBww6UgcGF1c2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlV0dmlkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTa2p1bCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtZ3JhZmlrayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJHbGlkZWJyeXRlciBmb3Igdm9sdW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkR1IGhhciBpa2tlIHZhbGd0IG5vZW4gbWVkaWVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJJbmdlbiBpbmZvcm1hc2pvbiBlciB0aWxnamVuZ2VsaWciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkNhc3RlciBza2plcm1lbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbmUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1uZS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZjMmUxYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1uZS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgpKrgpY3gpLDgpKPgpL7gpLLgpYAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4KSJ4KSq4KSV4KSw4KSj4KS54KSw4KWCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdCDgpKzgpJ/gpKgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0IOCkrOCkn+CkqOClpCDgpJzgpKHgpL7gpKgg4KS14KS/4KSa4KWN4KSb4KWH4KSmIOCkreCkr+CliyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdCDgpKzgpJ/gpKjgpaQg4KSc4KSh4KS+4KSoIOCkueClgeCkgeCkpuCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0IOCkrOCkn+CkqOClpCDgpJzgpKHgpL7gpKgg4KSt4KSv4KWLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCkr+CkuOCkruCkviBDYXN0IOCkl+CksOCljeCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCkr+CkqOCljeCkpOCljeCksOCkueCksOClgiDgpKrgpKTgpY3gpKTgpL4g4KSy4KSX4KS+4KSJ4KSB4KSm4KWIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCkteCkv+CkmuCljeCkm+Clh+CkpiDgpJfgpLDgpY3gpKjgpYHgpLngpYvgpLjgpY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJjYXN0aW5nIOCksOCli+CkleCljeCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4KSs4KSo4KWN4KSmIOCkl+CksOCljeCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCkrOCknOCkvuCkieCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4KSw4KWL4KSV4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4KSw4KWL4KSV4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4KS14KS/4KS44KWN4KSk4KS+4KSwIOCkl+CksOCljeCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4KS44KSC4KSV4KWN4KS34KS/4KSq4KWN4KSkIOCkquCkvuCksOCljeCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCkj+CksuCljeCkrOCkriDgpIbgpLDgpY3gpJ8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4KSt4KWL4KSy4KWN4KSv4KWB4KSu4KSV4KWLIOCkuOCljeCksuCkvuCkh+CkoeCksCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4KSV4KWB4KSo4KWIIOCkruCkv+CkoeCkv+Ckr+CkviDgpJrgpK/gpKgg4KSt4KSP4KSV4KWLIOCkm+CliOCkqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4KSc4KS+4KSo4KSV4KS+4KSw4KWAIOCkieCkquCksuCkrOCljeCkpyDgpJvgpYjgpKgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCkuOCljeCkleCljeCksOCkv+CkqCBjYXN0IOCkl+CksOCljeCkpuCliCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbmwvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVkZjYyZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZWVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkFwcGFyYXRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QtaWNvb24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0LWljb29uLiBWZXJiaW5kaW5nIHZlcmJyb2tlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdC1pY29vbi4gVmVyYmluZGluZyBtYWtlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0LWljb29uLiBWZXJib25kZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdGVuIG5hYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJBcHBhcmF0ZW4gem9la2VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Ikxvc2tvcHBlbGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQ2FzdGVuIHN0b3BwZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlNsdWl0ZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJBZnNwZWxlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iT25kZXJicmVrZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wcGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iVWl0dm91d2VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTYW1lbnZvdXdlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtaG9lcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJWb2x1bWVzY2h1aWZyZWdlbGFhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iR2VlbiBtZWRpYSBnZXNlbGVjdGVlcmQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkdlZW4gaW5mb3JtYXRpZSBiZXNjaGlrYmFhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iU2NoZXJtIGNhc3RlbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcGEvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wYS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI1ZGY3MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wYS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgqLjgqL/gqLjgqJ/gqK4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4Kih4Ki/4Ki14Ki+4KiI4Ki44Ki+4KiCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4KiV4Ki+4Ki44KifIOCorOCon+CoqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuColeCovuCouOConyDgqKzgqJ/gqKjgpaQg4Kih4Ki/4Ki44KiV4Kio4KmI4KiV4KifIOColeCpgOCopOCoviDgqJfgqL/gqIYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuColeCovuCouOConyDgqKzgqJ/gqKjgpaQg4KiV4Kio4KmI4KiV4KifIOColeCpgOCopOCoviDgqJzgqL4g4Kiw4Ki/4Ki54Ki+IOCoueCpiCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgqJXgqL7gqLjgqJ8g4Kis4Kif4Kio4KWkIOColeCoqOCpiOColeConyDgqJXgqYDgqKTgqL4g4KiX4Ki/4KiGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCoj+CopeCphyDgqJXgqL7gqLjgqJ8g4KiV4Kiw4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4Kih4KmA4Ki14Ki+4KiI4Ki44Ki+4KiCIOCoqOCpguCpsCDgqLLgqbHgqK3gqL/gqIYg4Kic4Ki+IOCosOCov+CoueCoviDgqLngqYgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4Kih4Ki/4Ki44KiV4Kio4KmI4KiV4KifIOColeCosOCpiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuColeCovuCouOConyDgqJXgqLDgqKjgqL4g4Kis4Kmw4KimIOColeCosOCpiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4Kis4Kmw4KimIOColeCosOCpiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCoquCosuCphyDgqJXgqLDgqYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCosOCpi+ColeCpiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCorOCpsOCopiDgqJXgqLDgqYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgqLXgqL/gqLjgqKTgqL7gqLAg4KiV4Kiw4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgqKzgqbDgqKYg4KiV4Kiw4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4KiQ4Kiy4Kis4KiuIOCohuCosOConyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgqLXgqYzgqLLgqK/gqYLgqK4g4Ki44Kiy4Ki+4KiI4Kih4KiwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgqJXgqYvgqIgg4Ki14KmAIOCoruCpgOCooeCpgOCohiDgqKjgqLngqYDgqIIg4Kia4KmB4Kij4Ki/4KiGIOCol+Cov+CohiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4KiV4KmL4KiIIOConOCovuCoo+ColeCovuCosOCpgCDgqIngqKrgqLLgqKzgqKcg4Kio4Ki54KmA4KiCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgqLjgqJXgqY3gqLDgqYDgqKgg4Kic4KmL4KmcIOCosOCov+CoueCoviDgqLngqYgiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXBsL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3OTJhNmQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlVyesSFZHplbmlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iUHJ6eWNpc2sgQ2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlByenljaXNrIFByemXFm2xpaiBla3Jhbi4gUm96xYLEhWN6b25vIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJQcnp5Y2lzayBQcnplxZtsaWogZWtyYW4uIMWBxIVjesSZIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlByenljaXNrIFByemXFm2xpaiBla3Jhbi4gUG/FgsSFY3pvbm8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iUHJ6ZXN5xYJhaiBuYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlpuYWpkb3dhbmllIHVyesSFZHplxYQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iT2TFgsSFY3oiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJaYXRyenltYWogcHJ6ZXN5xYJhbmllIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYW1rbmlqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iT2R0d8OzcnoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IldzdHJ6eW1haiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlphdHJ6eW1haiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlJvendpxYQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Ilp3acWEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iT2vFgmFka2EgYWxidW11Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlN1d2FrIGfFgm/Fm25vxZtjaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmllIHd5YnJhbm8gbXVsdGltZWRpw7N3Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJCcmFrIGluZm9ybWFjamkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlByemVzecWCYW0gZWtyYW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0LXJCUi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0LXJCUi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjNjE5ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wdC1yQlIvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCb3TDo28gVHJhbnNtaXRpciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdMOjbyBcIlRyYW5zbWl0aXJcIi4gRGVzY29uZWN0YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCb3TDo28gXCJUcmFuc21pdGlyXCIuIENvbmVjdGFuZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm90w6NvIFwiVHJhbnNtaXRpclwiLiBDb25lY3RhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhbnNtaXRpciBwYXJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTG9jYWxpemFuZG8gZGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2NvbmVjdGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iSW50ZXJyb21wZXIgdHJhbnNtaXNzw6NvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJGZWNoYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZXByb2R1emlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJQYXJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSZWNvbGhlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFydGUgZG8gw6FsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkNvbnRyb2xlIGRlc2xpemFudGUgZGUgdm9sdW1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOZW5odW1hIG3DrWRpYSBzZWxlY2lvbmFkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmVuaHVtYSBpbmZvcm1hw6fDo28gZGlzcG9uw612ZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlRyYW5zbWl0aW5kbyBhIHRlbGEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2YwYTYxZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wdC1yUFQvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCb3TDo28gVHJhbnNtaXRpciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdMOjbyBUcmFuc21pdGlyLiBEZXNsaWdhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOjbyBUcmFuc21pdGlyLiBBIGxpZ2FyLi4uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdMOjbyBUcmFuc21pdGlyLiBMaWdhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhbnNtaXRpciBwYXJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iQSBsb2NhbGl6YXIgZGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2Fzc29jaWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iUGFyYXIgYSB0cmFuc21pc3PDo28iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkZlY2hhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHV6aXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkludGVycm9tcGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iUGFyYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJFeHBhbmRpciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iUmVkdXppciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkltYWdlbSBkbyDDoWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbG8gZGUgZGVzbGl6ZSBkbyB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lbmh1bSBzdXBvcnRlIG11bHRpbcOpZGlhIHNlbGVjaW9uYWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOZW5odW1hIGluZm9ybWHDp8OjbyBkaXNwb27DrXZlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQSB0cmFuc21pdGlyIG8gZWNyw6MiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzYzYxOWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCb3TDo28gVHJhbnNtaXRpciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdMOjbyBcIlRyYW5zbWl0aXJcIi4gRGVzY29uZWN0YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCb3TDo28gXCJUcmFuc21pdGlyXCIuIENvbmVjdGFuZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm90w6NvIFwiVHJhbnNtaXRpclwiLiBDb25lY3RhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhbnNtaXRpciBwYXJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTG9jYWxpemFuZG8gZGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2NvbmVjdGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iSW50ZXJyb21wZXIgdHJhbnNtaXNzw6NvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJGZWNoYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZXByb2R1emlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJQYXJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSZWNvbGhlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFydGUgZG8gw6FsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkNvbnRyb2xlIGRlc2xpemFudGUgZGUgdm9sdW1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOZW5odW1hIG3DrWRpYSBzZWxlY2lvbmFkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmVuaHVtYSBpbmZvcm1hw6fDo28gZGlzcG9uw612ZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlRyYW5zbWl0aW5kbyBhIHRlbGEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXJvL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcm8vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYmIyZjYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcm8vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bveml0aXZlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQnV0b251bCBkZSBwcm9pZWPIm2llIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQnV0b251bCBkZSBwcm9pZWPIm2llLiBEZWNvbmVjdGF0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCdXRvbnVsIGRlIHByb2llY8ibaWUuIFNlIGNvbmVjdGVhesSDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJ1dG9udWwgZGUgcHJvaWVjyJtpZS4gQ29uZWN0YXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iUHJvaWVjdGHIm2kgcGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJTZSBjYXV0xIMgZGlzcG96aXRpdmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVjb25lY3RhyJtpLXbEgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Ik51IG1haSBwcm9pZWN0YcibaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iw45uY2hpZGXIm2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZWRhyJtpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLDjm50cmVydXBlyJtpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iT3ByacibaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4dGluZGXIm2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlJlc3Ryw6JuZ2XIm2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJHcmFmaWNhIGFsYnVtdWx1aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJHbGlzb3IgcGVudHJ1IHZvbHVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOaWNpdW4gZmnImWllciBtZWRpYSBzZWxlY3RhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTnUgc3VudCBkaXNwb25pYmlsZSBpbmZvcm1hyJtpaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iU2UgcHJvaWVjdGVhesSDIGVjcmFudWwiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXJ1L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNDYyZDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KHQuNGB0YLQtdC80LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0KPRgdGC0YDQvtC50YHRgtCy0LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtC40LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtC40LguINCj0YHRgtGA0L7QudGB0YLQstC+INC+0YLQutC70Y7Rh9C10L3Qvi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0LjQuC4g0KPRgdGC0YDQvtC50YHRgtCy0L4g0L/QvtC00LrQu9GO0YfQsNC10YLRgdGPLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtC40LguINCj0YHRgtGA0L7QudGB0YLQstC+INC/0L7QtNC60LvRjtGH0LXQvdC+LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLQktGL0LHQtdGA0LjRgtC1INGD0YHRgtGA0L7QudGB0YLQstC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0J/QvtC40YHQuiDRg9GB0YLRgNC+0LnRgdGC0LLigKYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0J7RgtC60LvRjtGH0LjRgtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0J/RgNC10LrRgNCw0YLQuNGC0Ywg0YLRgNCw0L3RgdC70Y/RhtC40Y4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCX0LDQutGA0YvRgtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0JLQvtGB0L/RgNC+0LjQt9Cy0LXRgdGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCf0YDQuNC+0YHRgtCw0L3QvtCy0LjRgtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i0J7RgdGC0LDQvdC+0LLQuNGC0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQoNCw0LfQstC10YDQvdGD0YLRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0KHQstC10YDQvdGD0YLRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCe0LHQu9C+0LbQutCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCg0LXQs9GD0LvRj9GC0L7RgCDQs9GA0L7QvNC60L7RgdGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCc0LXQtNC40LDRhNCw0LnQuyDQvdC1INCy0YvQsdGA0LDQvSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0JTQsNC90L3Ri9GFINC90LXRgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0J/QvtC00LrQu9GO0YfQtdC90LjQtSDQuiDRg9C00LDQu9C10L3QvdC+0LzRgyDQvNC+0L3QuNGC0L7RgNGDIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zaS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNpL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTVjZTUwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNpL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuC2tOC2r+C3iuC2sOC2reC3kuC2uiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgtovgtrTgt4/gtoLgtpwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgt4Dgt5Lgtprgt4/gt4Eg4La24Lec4Lat4LeK4Lat4La4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4LeA4LeS4Laa4LeP4LeBIOC2tuC3nOC2reC3iuC2reC2uC4g4LeA4LeS4LeD4Lax4LeK4Law4LeSIOC2muC2u+C2sSDgtr3gtq/gt5MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuC3gOC3kuC2muC3j+C3gSDgtrbgt5zgtq3gt4rgtq3gtrgg4LeD4La44LeK4La24Lax4LeK4LawIOC2muC2u+C2uOC3kuC2seC3iiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgt4Dgt5Lgtprgt4/gt4Eg4La24Lec4Lat4LeK4Lat4La4IOC3g+C2uOC3iuC2tuC2seC3iuC2sCDgtprgtrvgtrEg4La94Lav4LeTIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuC3gOC3kuC2muC3j+C3geC2uiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuC2i+C2tOC3j+C2guC2nCDgt4Pgt5ngt4Dgt5PgtrgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4LeA4LeS4LeD4Lax4LeK4Law4LeSIOC2muC2u+C2seC3iuC2sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuC3gOC3kuC2muC3j+C3gSDgtprgt5Lgtrvgt5Pgtrgg4Lax4Lat4La7IOC2muC2u+C2seC3iuC2sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4LeA4LeD4Lax4LeK4LaxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4Law4LeP4LeA4Lax4La6IOC2muC2u+C2seC3iuC2sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4LeA4LeS4La74LeP4La4IOC2nOC2seC3iuC3gOC2seC3iuC2sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuC2seC2reC2uyDgtprgtrvgtrHgt4rgtrEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgtq/gt5Lgtpwg4LeE4La74LeS4Lax4LeK4LaxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgt4Tgtprgt5Tgt4XgtrHgt4rgtrEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgtofgtr3gt4rgtrbgtrgg4Laa4La94LeP4LeAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuC3hOC2rCDgtrTgtrvgt5Lgtrjgt48g4LeD4LeK4La94La64LeS4Lap4La74La6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgtrjgt4/gtrDgt4rigI3gtrrgtrog4Lat4Led4La74LePIOC2seC3kOC2rSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4La94La24LePIOC2nOC2rSDgt4Tgt5Dgtprgt5Ig4Lat4Lec4La74Lat4LeU4La74LeUIOC2seC3nOC2uOC3kOC2rSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4LeA4LeS4Laa4LeP4LeBIOC2reC3kuC2u+C2uiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2svc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zay9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU4YWExMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zay9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0w6ltIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlphcmlhZGVuaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJUbGHEjWlkbG8gcHJlbm9zdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlRsYcSNaWRsbyBwcmVub3N1LiBPZHBvamVuw6kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlRsYcSNaWRsbyBwcmVub3N1LiBQcmlww6FqYSBzYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJUbGHEjWlkbG8gcHJlbm9zdS4gUHJpcG9qZW7DqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQcmVub3MgZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJIxL5hZGFqw7ogc2EgemFyaWFkZW5pYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJPZHBvamnFpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Ilphc3RhdmnFpSBwcmVuw6HFoWFuaWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlphdnJpZcWlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUHJlaHJhxaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBvemFzdGF2acWlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iWmFzdGF2acWlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUm96YmFsacWlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJaYmFsacWlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iT2Jyw6F6b2sgYWxidW11Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlBvc8O6dmHEjSBobGFzaXRvc3RpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOaWUgc8O6IHZ5YnJhbsOpIMW+aWFkbmUgbcOpZGnDoSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmllIHPDuiBrwqBkaXNwb3rDrWNpaSDFvmlhZG5lIGluZm9ybcOhY2llIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJQcmVuw6HFoWEgc2Egb2JyYXpvdmthIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zbC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNsL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2E0Y2U0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNsL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJOYXByYXZlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iR3VtYiB6YSBwcmVkdmFqYW5qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Ikd1bWIgemEgcHJlZHZhamFuamUuIFBvdmV6YXZhIGplIHByZWtpbmplbmEuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJHdW1iIHphIHByZWR2YWphbmplLiBWenBvc3RhdmxqYW5qZSBwb3ZlemF2ZS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iR3VtYiB6YSBwcmVkdmFqYW5qZS4gUG92ZXphdmEgamUgdnpwb3N0YXZsamVuYS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iUHJlZHZhamFuamUgcHJlazoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJJc2thbmplIG5hcHJhdiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJQcmVraW5pIHBvdmV6YXZvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iVXN0YXZpIHByZWR2YWphbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYXByaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlByZWR2YWphbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJaYXVzdGF2aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlVzdGF2aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlJhesWhaXJpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTdHJuaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Ik5hc2xvdm5pY2EgYWxidW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkRyc25payB6YSBnbGFzbm9zdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmkgaXpicmFuZSBwcmVkc3Rhdm5vc3RpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJQb2RhdGtpIG5pc28gbmEgdm9sam8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlByZWR2YWphbmplIHphc2xvbmEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNxL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Evc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxNmUxMTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Evc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJQYWppc2pldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJ1dG9uaSBpIHRyYW5zbWV0aW1pdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJ1dG9uaSBpIHRyYW5zbWV0aW1pdC4gSmUgaSBzaGvDq3B1dHVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCdXRvbmkgaSB0cmFuc21ldGltaXQuIFBvIGxpZGhldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCdXRvbmkgaSB0cmFuc21ldGltaXQuIEplIGkgbGlkaHVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlRyYW5zbWV0byB0ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlBvIGvDq3Jrb24gcGFqaXNqZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJTaGvDq3B1dGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJOZGFsbyB0cmFuc21ldGltaW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Ik1ieWxsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iTHVhaiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1esOrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iTmRhbG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJaZ2plcm9qZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iUGFsb3NlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iS29wZXJ0aW5hIGUgYWxidW1pdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJScsOrc2hxaXTDq3NpIGkgdm9sdW1pdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTnVrIHUgemdqb2RoIGFzbmrDqyBtZWRpYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTnVrIGplcGV0IGFzbmrDqyBpbmZvcm1hY2lvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUG8gdHJhbnNtZXRvbiBla3JhbmluIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zci9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNyL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWFiYWQ1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNyL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCh0LjRgdGC0LXQvCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQo9GA0LXRktCw0ZjQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCU0YPQs9C80LUg0J/RgNC10LHQsNGG0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQlNGD0LPQvNC1INCf0YDQtdCx0LDRhtC4LiDQktC10LfQsCDRmNC1INC/0YDQtdC60LjQvdGD0YLQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i0JTRg9Cz0LzQtSDQn9GA0LXQsdCw0YbQuC4g0J/QvtCy0LXQt9GD0ZjQtSDRgdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCU0YPQs9C80LUg0J/RgNC10LHQsNGG0LguINCf0L7QstC10LfQsNC9INGY0LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0J/RgNC10LHQsNGG0YPRmCDQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0J/RgNC+0L3QsNC70LDQttC10ZrQtSDRg9GA0LXRktCw0ZjQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQn9GA0LXQutC40L3QuCDQstC10LfRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCX0LDRg9GB0YLQsNCy0Lgg0L/RgNC10LHQsNGG0LjQstCw0ZrQtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JfQsNGC0LLQvtGA0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQn9GD0YHRgtC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLQn9Cw0YPQt9C40YDQsNGYIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i0JfQsNGD0YHRgtCw0LLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItCf0YDQvtGI0LjRgNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQodC60YPQv9C4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0J7QvNC+0YIg0LDQu9Cx0YPQvNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCa0LvQuNC30LDRhyDQt9CwINGY0LDRh9C40L3RgyDQt9Cy0YPQutCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLQndC10LzQsCDQuNC30LDQsdGA0LDQvdC40YUg0LzQtdC00LjRmNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQndC40YHRgyDQtNC+0YHRgtGD0L/QvdC1INC90LjQutCw0LrQstC1INC40L3RhNC+0YDQvNCw0YbQuNGY0LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItCf0YDQtdCx0LDRhtGD0ZjQtSDRgdC1INC10LrRgNCw0L0iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN2L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhN2QzZTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkVuaGV0ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0LWtuYXBwZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0LWtuYXBwZW4uIEZyw6Vua29wcGxhZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdC1rbmFwcGVuLiBBbnNsdXRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0LWtuYXBwZW4uIEFuc2x1dGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3RhIHRpbGwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJMZXRhciBlZnRlciBlbmhldGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IktvcHBsYSBmcsOlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlNsdXRhIGNhc3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJTdMOkbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJTcGVsYSB1cHAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iQXZicnl0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iVXTDtmthIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJLb21wcmltZXJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iU2tpdm9tc2xhZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJWb2x5bXJlZ2xhZ2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkluZ2EgbWVkaWEgaGFyIHZhbHRzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJEZXQgZmlubnMgaW5nZW4gaW5mb3JtYXRpb24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlNrw6RybWVuIGNhc3RhcyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3cvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU2MmNiMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJNZnVtbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJWaWZhYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IktpdHVmZSBjaGEga3V0dW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iS2l0dWZlIGNoYSBrdXR1bWEuIEtpbWVvbmRvbGV3YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iS2l0dWZlIGNoYSBrdXR1bWEuIEtpbmF1bmdhbmlzaGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iS2l0dWZlIGNoYSBrdXR1bWEuIEtpbWV1bmdhbmlzaHdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlR1bWEga3dlbnllIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iSW5hdGFmdXRhIHZpZmFhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Ik9uZG9hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQWNoYSBrdXR1bWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkZ1bmdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iQ2hlemEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlNpdGlzaGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTaW1hbWlzaGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJQYW51YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iS3VuamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJTYW5hYSB5YSBhbGJhbXUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iS2l0ZWxlemkgY2hhIHNhdXRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJIYWt1bmEgbWF1ZGh1aSB5YWxpeW9jaGFndWxpd2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ikhha3VuYSBtYWVsZXpvIHlhbGl5b3BhdGlrYW5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJJbmF0dW1hIHNrcmluaSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3c2MDBkcC9kaW1lbnMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3c2MDBkcC9kaW1lbnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDQyMzQ4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3NjAwZHAvZGltZW5zLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLSAgICA8IS0tIFRoZSBwbGF0Zm9ybSdzIGRlc2lyZWQgZml4ZWQgd2lkdGggZm9yIGEgZGlhbG9nIGFsb25nIHRoZSBtYWpvciBheGlzCi0gICAgICAgICAodGhlIHNjcmVlbiBpcyBpbiBsYW5kc2NhcGUpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KLSAgICA8aXRlbSB0eXBlPSJkaW1lbiIgbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21ham9yIj42MCU8L2l0ZW0+Ci0gICAgPCEtLSBUaGUgcGxhdGZvcm0ncyBkZXNpcmVkIGZpeGVkIHdpZHRoIGZvciBhIGRpYWxvZyBhbG9uZyB0aGUgbWlub3IgYXhpcwotICAgICAgICAgKHRoZSBzY3JlZW4gaXMgaW4gcG9ydHJhaXQpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KLSAgICA8aXRlbSB0eXBlPSJkaW1lbiIgbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21pbm9yIj45MCU8L2l0ZW0+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3NzIwZHAvZGltZW5zLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3NzIwZHAvZGltZW5zLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM0YWI4ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdzcyMGRwL2RpbWVucy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPCEtLSBUaGUgcGxhdGZvcm0ncyBkZXNpcmVkIGZpeGVkIHdpZHRoIGZvciBhIGRpYWxvZyBhbG9uZyB0aGUgbWFqb3IgYXhpcwotICAgICAgICAgKHRoZSBzY3JlZW4gaXMgaW4gbGFuZHNjYXBlKS4gVGhpcyBtYXkgYmUgZWl0aGVyIGEgZnJhY3Rpb24gb3IgYSBkaW1lbnNpb24uLS0+Ci0gICAgPGl0ZW0gdHlwZT0iZGltZW4iIG5hbWU9Im1yX2RpYWxvZ19maXhlZF93aWR0aF9tYWpvciI+NTAlPC9pdGVtPgotICAgIDwhLS0gVGhlIHBsYXRmb3JtJ3MgZGVzaXJlZCBmaXhlZCB3aWR0aCBmb3IgYSBkaWFsb2cgYWxvbmcgdGhlIG1pbm9yIGF4aXMKLSAgICAgICAgICh0aGUgc2NyZWVuIGlzIGluIHBvcnRyYWl0KS4gVGhpcyBtYXkgYmUgZWl0aGVyIGEgZnJhY3Rpb24gb3IgYSBkaW1lbnNpb24uLS0+Ci0gICAgPGl0ZW0gdHlwZT0iZGltZW4iIG5hbWU9Im1yX2RpYWxvZ19maXhlZF93aWR0aF9taW5vciI+NzAlPC9pdGVtPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10YS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRhL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTk3OGYzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRhL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCumuCuv+CuuOCvjeCun+CuruCvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgrprgrr7grqTgrqngrpngr43grpXgrrPgr40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgrqTgrr/grrDgr4jgrq/grr/grp/gr4Eg4K6q4K6f4K+N4K6f4K6p4K+NIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4K6F4K6p4K+B4K6q4K+N4K6q4K+B4K6k4K6y4K+NIOCuquCviuCupOCvjeCupOCuvuCuqeCvjS4g4K6k4K+B4K6j4K+N4K6f4K6/4K6V4K+N4K6V4K6q4K+N4K6q4K6f4K+N4K6f4K6k4K+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgroXgrqngr4Hgrqrgr43grqrgr4HgrqTgrrLgr40g4K6q4K+K4K6k4K+N4K6k4K6+4K6p4K+NLiDgrofgrqPgr4jgrpXgr43grpXgrr/grrHgrqTgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4K6F4K6p4K+B4K6q4K+N4K6q4K+B4K6k4K6y4K+NIOCuquCviuCupOCvjeCupOCuvuCuqeCvjS4g4K6H4K6j4K+I4K6V4K+N4K6V4K6q4K+N4K6q4K6f4K+N4K6f4K6k4K+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCuh+CupOCuseCvjeCuleCvgSDgroXgrqngr4Hgrqrgr43grqrgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgrprgrr7grqTgrqngrpngr43grpXgrrPgr4jgrqTgr40g4K6k4K+H4K6f4K+B4K6V4K6/4K6x4K6k4K+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCupOCviuCun+CusOCvjeCuquCviOCupOCvjSDgrqTgr4HgrqPgr43grp/grr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgroXgrqngr4Hgrqrgr43grqrgr4HgrrXgrqTgr4gg4K6o4K6/4K6x4K+B4K6k4K+N4K6k4K+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgrq7gr4Lgrp/gr4Hgrq7gr40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgrofgrq/grpXgr43grpXgr4Hgrq7gr40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCuh+Cun+CviOCuqOCuv+CuseCvgeCupOCvjeCupOCvgeCuruCvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCuqOCuv+CuseCvgeCupOCvjeCupOCvgeCuteCupOCuseCvjeCuleCuvuCuqSDgrqrgr4rgrqTgr43grqTgrr7grqngr40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgrrXgrr/grrDgrr/grrXgrr7grpXgr43grpXgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCumuCvgeCusOCvgeCuleCvjeCuleCvgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCuhuCusuCvjeCuquCuruCvjSDgrobgrrDgr43grp/gr40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4K6S4K6y4K6/4K6v4K6z4K614K+BIOCuuOCvjeCusuCviOCun+CusOCvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4K6u4K+A4K6f4K6/4K6v4K6+IOCujuCupOCvgeCuteCvgeCuruCvjSDgrqTgr4fgrrDgr43grqjgr43grqTgr4bgrp/gr4HgrpXgr43grpXgrqrgr43grqrgrp/grrXgrr/grrLgr43grrLgr4giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuCupOCuleCuteCusuCvjSDgro7grqTgr4HgrrXgr4Hgrq7grr/grrLgr43grrLgr4giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCupOCuv+CusOCviOCur+CviCDgroXgrqngr4Hgrqrgr43grqrgr4HgrpXgrr/grrHgr4DgrrDgr43grpXgrrPgr40iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRlL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkMzEyZTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4LC44LC/4LC44LGN4LCf4LCu4LGNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuCwquCwsOCwv+CwleCwsOCwvuCwsuCxgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuCwquCxjeCwsOCwuOCwvuCwsOCwgiDgsJrgsYfgsK/gsL8g4LCs4LCf4LCo4LGNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4LCq4LGN4LCw4LC44LC+4LCwIOCwrOCwn+CwqOCxjS4g4LCh4LC/4LC44LGN4oCM4LCV4LCo4LGG4LCV4LGN4LCf4LGNIOCwmuCxh+Cwr+CwrOCwoeCwv+CwguCwpuCwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4LCq4LGN4LCw4LC44LC+4LCwIOCwrOCwn+CwqOCxjS4g4LCV4LCo4LGG4LCV4LGN4LCf4LGNIOCwmuCxh+CwuOCxjeCwpOCxi+CwguCwpuCwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgsKrgsY3gsLDgsLjgsL7gsLAg4LCs4LCf4LCo4LGNLiDgsJXgsKjgsYbgsJXgsY3gsJ/gsY0g4LCa4LGH4LCv4LCs4LCh4LC/4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCwpuCxgOCwqOCwv+CwleCwvyDgsKrgsY3gsLDgsLjgsL7gsLDgsIIg4LCa4LGH4LCv4LCC4LCh4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4LCq4LCw4LC/4LCV4LCw4LC+4LCy4LCo4LGBIOCwleCwqOCxgeCwl+CxiuCwguCwn+Cxi+CwguCwpuCwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgsKHgsL/gsLjgsY3igIzgsJXgsKjgsYbgsJXgsY3gsJ/gsY0g4LCa4LGH4LCv4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4LCq4LGN4LCw4LC44LC+4LCw4LC+4LCo4LGN4LCo4LC/IOCwhuCwquCwv+CwteCxh+Cwr+CwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4LCu4LGC4LC44LC/4LC14LGH4LC44LGN4LCk4LGB4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4LCq4LGN4LCy4LGHIOCwmuCxh+CwuOCxjeCwpOCxgeCwguCwpuCwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4LCq4LC+4LCc4LGNIOCwmuCxh+CwuOCxjeCwpOCxgeCwguCwpuCwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCwhuCwquCwv+CwteCxh+Cwr+CwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCwteCwv+CwuOCxjeCwpOCwsOCwv+CwguCwquCwnOCxh+CwuOCxjeCwpOCxgeCwguCwpuCwvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4LCV4LGB4LCm4LC/4LC44LGN4LCk4LGB4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4LCG4LCy4LGN4LCs4LCu4LGNIOCwhuCwsOCxjeCwn+CxjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgsLXgsL7gsLLgsY3gsK/gsYLgsK7gsY0g4LC44LGN4LCy4LCv4LC/4LCh4LCw4LGNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgsK7gsYDgsKHgsL/gsK/gsL4g4LCP4LCm4LGAIOCwjuCwguCwmuCxgeCwleCxi+CwrOCwoeCwsuCxh+CwpuCxgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4LC44LCu4LC+4LCa4LC+4LCw4LCCIOCwheCwguCwpuCxgeCwrOCwvuCwn+CxgeCwsuCxiyDgsLLgsYfgsKbgsYEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCwuOCxjeCwleCxjeCwsOCxgOCwqOCxjeKAjOCwqOCxgSDgsKrgsY3gsLDgsLjgsL7gsLDgsIIg4LCa4LGH4LC44LGN4LCk4LGL4LCC4LCm4LC/Ijwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10aC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRoL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmE4YWU1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRoL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuC4o+C4sOC4muC4miI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLguK3guLjguJvguIHguKPguJPguYwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLguJvguLjguYjguKEgXCLguYHguITguKrguJXguYxcIiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuC4m+C4uOC5iOC4oSBcIuC5geC4hOC4quC4leC5jFwiIOC4ouC4geC5gOC4peC4tOC4geC4geC4suC4o+C5gOC4iuC4t+C5iOC4reC4oeC4leC5iOC4rSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4Lib4Li44LmI4LihIFwi4LmB4LiE4Liq4LiV4LmMXCIg4LiB4Liz4Lil4Lix4LiH4LmA4LiK4Li34LmI4Lit4Lih4LiV4LmI4LitIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuC4m+C4uOC5iOC4oSBcIuC5geC4hOC4quC4leC5jFwiIOC5gOC4iuC4t+C5iOC4reC4oeC4leC5iOC4reC5geC4peC5ieC4pyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLguYHguITguKrguJXguYzguYTguJvguKLguLHguIciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLguIHguLPguKXguLHguIfguITguYnguJnguKvguLLguK3guLjguJvguIHguKPguJPguYwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4Lii4LiB4LmA4Lil4Li04LiB4LiB4Liy4Lij4LmA4LiK4Li34LmI4Lit4Lih4LiV4LmI4LitIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4Lir4Lii4Li44LiU4LmB4LiE4Liq4LiV4LmMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLguJvguLTguJQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLguYDguKXguYjguJkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuC4q+C4ouC4uOC4lOC4iuC4seC5iOC4p+C4hOC4o+C4suC4pyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuC4q+C4ouC4uOC4lCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuC4guC4ouC4suC4oiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4Lii4Li44LiaIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4Lib4LiB4Lit4Lix4Lil4Lia4Lix4LmJ4LihIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuC5geC4luC4muC5gOC4peC4t+C5iOC4reC4meC4m+C4o+C4seC4muC4o+C4sOC4lOC4seC4muC5gOC4quC4teC4ouC4hyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4LmE4Lih4LmI4LmE4LiU4LmJ4LmA4Lil4Li34Lit4LiB4Liq4Li34LmI4Lit4LmE4Lin4LmJIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLguYTguKHguYjguKHguLXguILguYnguK3guKHguLnguKUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuC4geC4s+C4peC4seC4h+C5geC4hOC4quC4leC5jOC4q+C4meC5ieC4suC4iOC4rSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGwvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10bC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThiZTNkMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10bC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iTWdhIERldmljZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJ1dHRvbiBuYSBJLWNhc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCdXR0b24gbmEgSS1jYXN0LiBOYWRpc2tvbmVrdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJ1dHRvbiBuYSBJLWNhc3QuIEt1bW9rb25la3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJ1dHRvbiBuYSBJLWNhc3QuIE5ha2Frb25la3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkktY2FzdCBzYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Ik5hZ2hhaGFuYXAgbmcgbWdhIGRldmljZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJJZGlza29uZWt0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkloaW50byBhbmcgcGFnLWNhc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IklzYXJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iSS1wbGF5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJJLXBhdXNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iSWhpbnRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUGFsYXdha2luIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJJLWNvbGxhcHNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW0gYXJ0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlNsaWRlciBuZyB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IldhbGFuZyBwaW5pbGluZyBtZWRpYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iV2FsYW5nIGF2YWlsYWJsZSBuYSBpbXBvcm1hc3lvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iS2luYS1jYXN0IGFuZyBzY3JlZW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1ZjYzOTIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkNpaGF6bGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iWWF5xLFubGEgZMO8xJ9tZXNpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iWWF5xLFubGEgZMO8xJ9tZXNpLiBCYcSfbGFudMSxIGtlc2lsZGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IllhecSxbmxhIGTDvMSfbWVzaS4gQmHEn2xhbsSxeW9yIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IllhecSxbmxhIGTDvMSfbWVzaS4gQmHEn2xhbmTEsSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLFnnVyYXlhIHlhecSxbmxhOiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkNpaGF6bGFyIGJ1bHVudXlvciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJCYcSfbGFudMSxecSxIGtlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IllhecSxbsSxIGR1cmR1ciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iS2FwYXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJPeW5hdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iRHVyYWtsYXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJEdXJkdXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJHZW5pxZ9sZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkRhcmFsdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYsO8bSBrYXBhxJ/EsSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJTZXMgZMO8emV5aSBrYXlkxLFybWEgw6d1YnXEn3UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik1lZHlhIHNlw6dpbG1lZGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkJpbGdpIHlvayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRWtyYW4geWF5xLFubGFuxLF5b3IiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXVrL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdWsvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMzZDM2NWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdWsvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KHQuNGB0YLQtdC80LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0J/RgNC40YHRgtGA0L7RlyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0ZbRlyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0ZbRly4g0JLRltC04oCZ0ZTQtNC90LDQvdC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtGW0ZcuINCf0ZbQtOKAmdGU0LTQvdCw0L3QvdGPIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0ZbRly4g0J/RltC04oCZ0ZTQtNC90LDQvdC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCi0YDQsNC90YHQu9GO0LLQsNGC0Lgg0L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItCf0L7RiNGD0Log0L/RgNC40YHRgtGA0L7Rl9CyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItCS0ZbQtNC60LvRjtGH0LjRgtC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0J/RgNC40L/QuNC90LjRgtC4INGC0YDQsNC90YHQu9GP0YbRltGOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQl9Cw0LrRgNC40YLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+ItCS0ZbQtNGC0LLQvtGA0LjRgtC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLQn9GA0LjQt9GD0L/QuNC90LjRgtC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i0J/RgNC40L/QuNC90LjRgtC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0KDQvtC30LPQvtGA0L3Rg9GC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCX0LPQvtGA0L3Rg9GC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQntCx0LrQu9Cw0LTQuNC90LrQsCDQsNC70YzQsdC+0LzRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLQn9C+0LLQt9GD0L3QvtC6INCz0YPRh9C90L7RgdGC0ZYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCc0LXQtNGW0LAt0YTQsNC50Lsg0L3QtSDQstC40LHRgNCw0L3QviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0J3QtdC80LDRlCDQtNCw0L3QuNGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQotGA0LDQvdGB0LvRj9GG0ZbRjyDQtdC60YDQsNC90LAiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXVyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdXIvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMmM1OTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdXIvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i2LPYs9m52YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i2KLZhNin2KoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLaqdin2LPZuSDaqdix2YbbkiDaqdinINio2bnZhiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Itqp2KfYs9m5INqp2LHZhtuSINqp2Kcg2KjZudmG25Qg2LrbjNixINmF2YbYs9mE2qkg24HbkiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i2qnYp9iz2bkg2qnYsdmG25Ig2qnYpyDYqNm52YbblCDZhdmG2LPZhNqpINuB2Ygg2LHbgdinINuB25IiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i2qnYp9iz2bkg2qnYsdmG25Ig2qnYpyDYqNm52YbblCDZhdmG2LPZhNqpINuB25IiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i2KfYsyDZhduM2rog2qnYp9iz2bkg2qnYsduM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLYotmE2KfYqiDYqtmE2KfYtCDbgdmIINix24HbkiDbgduM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i2LrbjNixINmF2YbYs9mE2qkg2qnYsduM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLaqdin2LPZuSDaqdix2YbYpyDYqNmG2K8g2qnYsduM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Itio2YbYryDaqdix24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+ItqG2YTYp9im24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i2YXZiNmC2YjZgSDaqdix24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Itix2YjaqduM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLZvtq+24zZhNin2KbbjNq6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLYs9qp24zakduM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLYp9mE2KjZhSDYotix2bkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i2YjYp9mE24zZiNmFINiz2YTYp9im24zaiNixIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLaqdmI2KbbjCDZhduM2ojbjNinINmF2YbYqtiu2Kgg2YbbgduM2rog24HbkiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i2qnZiNim24wg2YXYudmE2YjZhdin2Kog2K/Ys9iq24zYp9ioINmG24HbjNq6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLYs9qp2LHbjNmGINqp2KfYs9m5INuB2Ygg2LHbgduMINuB25IiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXV6L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdXovc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwYTA4MTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdXovc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iVGl6aW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iUXVyaWxtYWxhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IlRyYW5zbGF0c2l5YSB0dWdtYXNpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iVHJhbnNsYXRzaXlhIHR1Z21hc2kuIFV6aWxkaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iVHJhbnNsYXRzaXlhIHR1Z21hc2kuIFVsYW5tb3FkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJUcmFuc2xhdHNpeWEgdHVnbWFzaS4gVWxhbmRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlF1eWlkYWdpZ2EgdHJhbnNsYXRzaXlhIHFpbGlzaDoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJRdXJpbG1hbGFybmkgdG9waXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlVsYW5pc2huaSB1emlzaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlRyYW5zbGF0c2l5YW5pIHRv4oCYeHRhdGlzaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iWW9waXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iQm9zaGxhc2giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlRv4oCYeHRhdGliIHR1cmlzaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlRv4oCYeHRhdGlzaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IllveWlzaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iWWln4oCYaXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxib20gbXVxb3Zhc2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVG92dXNoIGJhbGFuZGxpZ2kgc2xheWRlcmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik11bHRpbWVkaWEgdGFubGFtYWdhbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iSGVjaCBxYW5kYXkgbWHigJlsdW1vdCB5b+KAmHEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVrcmFubmkgdHJhbnNsYXRzaXlhIHFpbGlzaCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdmkvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy12aS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA5OGNjYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy12aS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJI4buHIHRo4buRbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVGhp4bq/dCBi4buLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iTsO6dCB0cnV54buBbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Ik7DunQgdHJ1eeG7gW4uIMSQw6Mgbmfhuq90IGvhur90IG7hu5FpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJOw7p0IHRydXnhu4FuLiDEkGFuZyBr4bq/dCBu4buRaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJOw7p0IHRydXnhu4FuLiDEkMOjIGvhur90IG7hu5FpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlRydXnhu4FuIHThu5tpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4ixJBhbmcgdMOsbSB0aGnhur90IGLhu4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iTmfhuq90IGvhur90IG7hu5FpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iROG7q25nIHRydXnhu4FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLEkMOzbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQaMOhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iVOG6oW0gZOG7q25nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iROG7q25nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTeG7nyBy4buZbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlRodSBn4buNbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuG6om5oIGLDrGEgYWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVGhhbmggdHLGsOG7o3Qgw6JtIGzGsOG7o25nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJLaMO0bmcgY8OzIHBoxrDGoW5nIHRp4buHbiBuw6BvIMSRxrDhu6NjIGNo4buNbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iS2jDtG5nIGPDsyB0aMO0bmcgdGluIG7DoG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IsSQYW5nIHRydXnhu4FuIG3DoG4gaMOsbmgiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUyMmQwMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1yQ04vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i57O757ufIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuiuvuWkhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuaKleWwhOaMiemSriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuaKleWwhOaMiemSruOAguW3suaWreW8gOi/nuaOpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i5oqV5bCE5oyJ6ZKu44CC5q2j5Zyo6L+e5o6lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuaKleWwhOaMiemSruOAguW3sui/nuaOpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLmipXlsITliLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLmraPlnKjmn6Xmib7orr7lpIciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i5pat5byA6L+e5o6lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i5YGc5q2i5oqV5bCEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLlhbPpl60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLmkq3mlL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuaaguWBnCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuWBnOatoiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuWxleW8gCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i5pS26LW3Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i5LiT6L6R5bCB6Z2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+Iumfs+mHj+a7keWdlyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i5pyq6YCJ5oup5Lu75L2V5aqS5L2TIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLmsqHmnInku7vkvZXnm7jlhbPkv6Hmga8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Iuato+WcqOaKleWwhOWxj+W5lSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtckhLL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtckhLL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNTZlNWMyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJISy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLns7vntbEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i6KOd572uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i5oqV5pS+5oyJ6YiVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i5oqV5pS+5oyJ6YiV44CC5bey6Kej6Zmk6YCj5o6lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLmipXmlL7mjInpiJXjgILmraPlnKjpgKPmjqUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i5oqV5pS+5oyJ6YiV44CC5bey6YCj5o6lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuaKleaUvuiHsyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Iuato+WcqOWwi+aJvuijnee9riI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLkuK3mlrfpgKPnt5oiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLlgZzmraLmipXmlL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IumXnOmWiSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuaSreaUviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i5pqr5YGcIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i5YGc5q2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i5bGV6ZaLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLmlLblkIgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLlsIjovK/lsIHpnaIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i6Z+z6YeP5ruR5qG/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLlsJrmnKrpgbjmk4flqpLpq5QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Iuaykuacieips+e0sOizh+aWmSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i5q2j5Zyo5oqV5pS+6J6i5bmVIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjYWZkZTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtclRXL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Iuezu+e1sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLoo53nva4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLmipXmlL7mjInpiJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLmipXmlL7mjInpiJXvvJvlt7LkuK3mlrfpgKPnt5oiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuaKleaUvuaMiemIle+8m+mAo+e3muS4rSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLmipXmlL7mjInpiJXvvJvlt7LpgKPnt5oiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i5oqV5pS+5YiwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i5q2j5Zyo5bCL5om+6KOd572uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuS4reaWt+mAo+e3miI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuWBnOatouaKleaUviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i6Zec6ZaJIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i5pKt5pS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLmmqvlgZwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLlgZzmraIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLlsZXplosiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuaUtuWQiCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuWwiOi8r+WwgemdoiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLpn7Pph4/mu5Hmob8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuacqumBuOWPluS7u+S9leWqkumrlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i5rKS5pyJ5Y+v55So55qE6LOH6KiKIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLmraPlnKjmipXmlL7onqLluZUiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXp1L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtenUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxMDdjNDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtenUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iSXNpc3RpbXUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iQW1hZGl2YXlpc2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJJbmtpbm9iaG8geWUtQ2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Iklua2lub2JobyB5b2t1c2FrYXphLiBLdW5xYW55dWxpd2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Iklua2lub2JobyB5b2t1c2FrYXphLiBLdXlheGh1bnl3YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJJbmtpbm9iaG8geW9rdXNha2F6YS4gS3V4aHVueWl3ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJTYWthemEga3UtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iSXRob2xhIGFtYWRpdmF5aXNpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Ik5xYW11bGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJNaXNhIHVrdXNha2F6YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iVmFsYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkRsYWxhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJNaXNhIGlzaWtoYXNoYW5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iTWlzYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Ik53ZWJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJHb3FhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iVWJ1Y2lrbyBiZS1hbGJoYW11Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IklzaWxheWlkYSBzZXZvbHVtdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iQXlpa2hvIGltaWRpeWEgZWtoZXRoaXdlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJBbHVraG8gdWx3YXppIG9sdXRob2xha2FsYXlvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJJc2lrcmluaSBzb2t1c2FrYXphIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9hcnJheXMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvYXJyYXlzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE4NzMyMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9hcnJheXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cmVzb3VyY2VzPgotICAgIDxpbnRlZ2VyLWFycmF5IG5hbWU9InNwZWVkX211bHRpcGxpZWRfYnlfMTAwIj4KLSAgICAgICAgPGl0ZW0+MjU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjUwPC9pdGVtPgotICAgICAgICA8aXRlbT43NTwvaXRlbT4KLSAgICAgICAgPGl0ZW0+MTAwPC9pdGVtPgotICAgICAgICA8aXRlbT4xMjU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjE1MDwvaXRlbT4KLSAgICAgICAgPGl0ZW0+MjAwPC9pdGVtPgotICAgIDwvaW50ZWdlci1hcnJheT4KLTwvcmVzb3VyY2VzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2F0dHJzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2F0dHJzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTM3Mjg1Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9hdHRycy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPGRlY2xhcmUtc3R5bGVhYmxlIG5hbWU9Ik1lZGlhUm91dGVCdXR0b24iPgotICAgICAgICA8IS0tIFRoaXMgZHJhd2FibGUgaXMgYSBzdGF0ZSBsaXN0IHdoZXJlIHRoZSAiY2hlY2tlZCIgc3RhdGUKLSAgICAgICAgICAgICBpbmRpY2F0ZXMgYWN0aXZlIG1lZGlhIHJvdXRpbmcuICBDaGVja2FibGUgaW5kaWNhdGVzIGNvbm5lY3RpbmcKLSAgICAgICAgICAgICBhbmQgbm9uLWNoZWNrZWQgLyBub24tY2hlY2thYmxlIGluZGljYXRlcwotICAgICAgICAgICAgIHRoYXQgbWVkaWEgaXMgcGxheWluZyB0byB0aGUgbG9jYWwgZGV2aWNlIG9ubHkuIC0tPgotICAgICAgICA8YXR0ciBuYW1lPSJleHRlcm5hbFJvdXRlRW5hYmxlZERyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICAgICAgPCEtLSBUaW50IHRvIGFwcGx5IHRvIHRoZSBtZWRpYSByb3V0ZSBidXR0b24gLS0+Ci0gICAgICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVCdXR0b25UaW50IiBmb3JtYXQ9ImNvbG9yIiAvPgotCi0gICAgICAgIDxhdHRyIG5hbWU9ImFuZHJvaWQ6bWluV2lkdGgiIC8+Ci0gICAgICAgIDxhdHRyIG5hbWU9ImFuZHJvaWQ6bWluSGVpZ2h0IiAvPgotICAgIDwvZGVjbGFyZS1zdHlsZWFibGU+Ci0KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlQnV0dG9uU3R5bGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVDbG9zZURyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlUGxheURyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlUGF1c2VEcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZVN0b3BEcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZUF1ZGlvVHJhY2tEcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZURlZmF1bHRJY29uRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVUdkljb25EcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZVNwZWFrZXJJY29uRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVTcGVha2VyR3JvdXBJY29uRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVDb250cm9sUGFuZWxUaGVtZU92ZXJsYXkiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotCi0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZVRoZW1lIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvY29sb3JzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2NvbG9ycy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YmMyOTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvY29sb3JzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLSAgICA8Y29sb3IgbmFtZT0iZ3JheSI+IzgwODA4MDwvY29sb3I+Ci0gICAgPGNvbG9yIG5hbWU9IndoaXRlIj4jZmZmZmZmPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0id2hpdGVfb3BhY2l0eV83MCI+I0IzZmZmZmZmPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0iYmxhY2tfb3BhY2l0eV83MCI+I0IzMDAwMDAwPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0idGl0bGVfYmFyX2dyYWRpZW50X3N0YXJ0Ij4jNTAwMDAwMDA8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJ0aXRsZV9iYXJfZ3JhZGllbnRfZW5kIj4jMDAwMDAwMDA8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJib3R0b21fYmFyX2JhY2tncm91bmQiPiM0MDIwMjAyMDwvY29sb3I+Ci08L3Jlc291cmNlcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvZGltZW5zLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ3YjAyMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cmVzb3VyY2VzPgotICAgIDwhLS0gRGlhbG9nIHNpemUgLS0+Ci0gICAgPGVhdC1jb21tZW50IC8+Ci0gICAgPCEtLSBUaGUgcGxhdGZvcm0ncyBkZXNpcmVkIGZpeGVkIHdpZHRoIGZvciBhIGRpYWxvZyBhbG9uZyB0aGUgbWFqb3IgYXhpcwotICAgICAgICAgKHRoZSBzY3JlZW4gaXMgaW4gbGFuZHNjYXBlKS4gVGhpcyBtYXkgYmUgZWl0aGVyIGEgZnJhY3Rpb24gb3IgYSBkaW1lbnNpb24uLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2RpYWxvZ19maXhlZF93aWR0aF9tYWpvciI+MzIwZHA8L2RpbWVuPgotICAgIDwhLS0gVGhlIHBsYXRmb3JtJ3MgZGVzaXJlZCBmaXhlZCB3aWR0aCBmb3IgYSBkaWFsb2cgYWxvbmcgdGhlIG1pbm9yIGF4aXMKLSAgICAgICAgICh0aGUgc2NyZWVuIGlzIGluIHBvcnRyYWl0KS4gVGhpcyBtYXkgYmUgZWl0aGVyIGEgZnJhY3Rpb24gb3IgYSBkaW1lbnNpb24uLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2RpYWxvZ19maXhlZF93aWR0aF9taW5vciI+MzIwZHA8L2RpbWVuPgotCi0gICAgPCEtLSBNZWRpYVJvdXRlQ29udHJvbGxlcidzIHZvbHVtZSBncm91cCBsaXN0IC0tPgotICAgIDxlYXQtY29tbWVudCAvPgotICAgIDwhLS0gTWF4aW11bSBoZWlnaHQgb2Ygdm9sdW1lIGdyb3VwIGxpc3QuIC0tPgotICAgIDxkaW1lbiBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X21heF9oZWlnaHQiPjI4OGRwPC9kaW1lbj4KLSAgICA8IS0tIEhlaWdodCBvZiB2b2x1bWUgZ3JvdXAgaXRlbS4gLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9oZWlnaHQiPjY4ZHA8L2RpbWVuPgotICAgIDwhLS0gU2l6ZSBvZiBhbiBpdGVtJ3MgaWNvbi4gLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9pY29uX3NpemUiPjI0ZHA8L2RpbWVuPgotCi0gICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfcGFkZGluZ190b3AiPjE2ZHA8L2RpbWVuPgotICAgIDwhLS0gR3JvdXAgbGlzdCBleHBhbmQvY29sbGFwc2UgYW5pbWF0aW9uIGR1cmF0aW9uLiAtLT4KLSAgICA8aW50ZWdlciBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2FuaW1hdGlvbl9kdXJhdGlvbl9tcyI+NDAwPC9pbnRlZ2VyPgotICAgIDwhLS0gR3JvdXAgbGlzdCBmYWRlIGluIGFuaW1hdGlvbiBkdXJhdGlvbi4gLS0+Ci0gICAgPGludGVnZXIgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9mYWRlX2luX2R1cmF0aW9uX21zIj40MDA8L2ludGVnZXI+Ci0gICAgPCEtLSBHcm91cCBsaXN0IGZhZGUgb3V0IGFuaW1hdGlvbiBkdXJhdGlvbi4gLS0+Ci0gICAgPGludGVnZXIgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9mYWRlX291dF9kdXJhdGlvbl9tcyI+MjAwPC9pbnRlZ2VyPgotCi0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZW1iZWRkZWRfc2V0dGluZ3Nfd2lkdGgiPjE1MGRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQiPjM2ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2VtYmVkZGVkX3NldHRpbmdzX2ljb25fc2l6ZSI+MjBkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZW1iZWRkZWRfc2V0dGluZ3NfdGV4dF9oZWlnaHQiPjE4ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2VtYmVkZGVkX3NldHRpbmdzX21haW5fdGV4dF9zaXplIj4xMnNwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19zdWJfdGV4dF9zaXplIj4xMHNwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX3NldHRpbmdzX3dpZHRoIj4yMjVkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQiPjU0ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfc2V0dGluZ3NfaWNvbl9zaXplIj4zMGRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX3NldHRpbmdzX3RleHRfaGVpZ2h0Ij4yN2RwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX3NldHRpbmdzX21haW5fdGV4dF9zaXplIj4xNnNwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX3NldHRpbmdzX3N1Yl90ZXh0X3NpemUiPjEzc3A8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX3NldHRpbmdzX29mZnNldCI+OGRwPC9kaW1lbj4KLQotICAgIDxkaW1lbiBuYW1lPSJtY3YyX3RyYW5zcG9ydF9jb250cm9sc19wYWRkaW5nIj40ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX3BhdXNlX2ljb25fc2l6ZSI+MzZkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9pY29uX3NpemUiPjI4ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2VtYmVkZGVkX2ljb25fc2l6ZSI+MjRkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfbWluaW1hbF9pY29uX3NpemUiPjI0ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2ljb25fbWFyZ2luIj4xMGRwPC9kaW1lbj4KLQotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfYWxidW1faW1hZ2VfcG9ydHJhaXRfc2l6ZSI+MjMyZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfYWxidW1faW1hZ2VfbGFuZHNjYXBlX3NpemUiPjE3NmRwPC9kaW1lbj4KLQotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2N1c3RvbV9wcm9ncmVzc19tYXhfc2l6ZSI+MmRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9jdXN0b21fcHJvZ3Jlc3NfdGh1bWJfc2l6ZSI+MTJkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfYnVmZmVyX3ZpZXdfaGVpZ2h0Ij41ZHA8L2RpbWVuPgotICAgIDwhLS0gVE9ETzogYWRqdXN0IGJvdHRvbSBiYXIgdmlldyAtLT4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU5N2EzYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLQotICAgIDwhLS0gTmFtZSBmb3IgdGhlIGRlZmF1bHQgc3lzdGVtIHJvdXRlIHByaW9yIHRvIEplbGx5YmVhbi4gW0NIQVIgTElNSVQ9MzBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiPlN5c3RlbTwvc3RyaW5nPgotCi0gICAgPCEtLSBOYW1lIGZvciB0aGUgdXNlciByb3V0ZSBjYXRlZ29yeSBjcmVhdGVkIHdoZW4gcHVibGlzaGluZyByb3V0ZXMgdG8gdGhlIHN5c3RlbSBpbiBKZWxseWJlYW4gYW5kIGFib3ZlLiBbQ0hBUiBMSU1JVD0zMF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiPkRldmljZXM8L3N0cmluZz4KLQotICAgIDwhLS0gU3RyaW5nIHRvIGJlIHNob3duIGFzIGEgdG9vbHRpcCBvZiBNZWRpYVJvdXRlQnV0dG9uCi0gICAgICAgIENhc3QgaXMgdGhlIHN0YW5kYXJkIGFuZHJvaWQgdmVyYiBmb3Igc2VuZGluZyBjb250ZW50IHRvIGEgcmVtb3RlIGRldmljZS4gW0NIQVIgTElNSVQ9NTBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iPkNhc3QgYnV0dG9uPC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gb2YgYSBNZWRpYVJvdXRlQnV0dG9uIGZvciBhY2Nlc3NpYmlsaXR5IHN1cHBvcnQgd2hlbiBubyByZW1vdGUgZGV2aWNlIGlzIGNvbm5lY3RlZC4KLSAgICAgICAgQ2FzdCBpcyB0aGUgc3RhbmRhcmQgYW5kcm9pZCB2ZXJiIGZvciBzZW5kaW5nIGNvbnRlbnQgdG8gYSByZW1vdGUgZGV2aWNlLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCI+Q2FzdCBidXR0b24uIERpc2Nvbm5lY3RlZDwvc3RyaW5nPgotCi0gICAgPCEtLSBDb250ZW50IGRlc2NyaXB0aW9uIG9mIGEgTWVkaWFSb3V0ZUJ1dHRvbiBmb3IgYWNjZXNzaWJpbGl0eSBzdXBwb3J0IHdoaWxlIGNvbm5lY3RpbmcgdG8gYSByZW1vdGUgZGV2aWNlLgotICAgICAgICBDYXN0IGlzIHRoZSBzdGFuZGFyZCBhbmRyb2lkIHZlcmIgZm9yIHNlbmRpbmcgY29udGVudCB0byBhIHJlbW90ZSBkZXZpY2UuIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyI+Q2FzdCBidXR0b24uIENvbm5lY3Rpbmc8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBvZiBhIE1lZGlhUm91dGVCdXR0b24gZm9yIGFjY2Vzc2liaWxpdHkgc3VwcG9ydCB3aGVuIGEgcmVtb3RlIGRldmljZSBpcyBjb25uZWN0ZWQuCi0gICAgICAgIENhc3QgaXMgdGhlIHN0YW5kYXJkIGFuZHJvaWQgdmVyYiBmb3Igc2VuZGluZyBjb250ZW50IHRvIGEgcmVtb3RlIGRldmljZS4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiPkNhc3QgYnV0dG9uLiBDb25uZWN0ZWQ8L3N0cmluZz4KLQotICAgIDwhLS0gVGl0bGUgb2YgdGhlIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nLiBbQ0hBUiBMSU1JVD0zMF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIj5DYXN0IHRvPC9zdHJpbmc+Ci0KLSAgICA8IS0tIFBsYWNlaG9sZGVyIHRleHQgdG8gc2hvdyB3aGVuIG5vIGRldmljZXMgaGF2ZSBiZWVuIGZvdW5kLiBbQ0hBUiBMSU1JVD01MF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyI+RmluZGluZyBkZXZpY2VzPC9zdHJpbmc+Ci0KLSAgICA8IS0tIEJ1dHRvbiB0byBkaXNjb25uZWN0IGZyb20gYSBtZWRpYSByb3V0ZS4gIFtDSEFSIExJTUlUPTMwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCI+RGlzY29ubmVjdDwvc3RyaW5nPgotCi0gICAgPCEtLSBCdXR0b24gdG8gc3RvcCBwbGF5YmFjayBhbmQgZGlzY29ubmVjdCBmcm9tIGEgbWVkaWEgcm91dGUuIFtDSEFSIExJTUlUPTMwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIj5TdG9wIGNhc3Rpbmc8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBkaWFsb2cgY2xvc2UgYnV0dG9uLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iPkNsb3NlPC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogbWVkaWEgcGxheSBidXR0b24uIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5Ij5QbGF5PC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogbWVkaWEgcGF1c2UgYnV0dG9uLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiPlBhdXNlPC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogbWVkaWEgc3RvcCBidXR0b24uIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIj5TdG9wPC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogZ3JvdXAgZXhwYW5kIGJ1dHRvbi4gUHJlc3NpbmcgYnV0dG9uIHNob3dzIGdyb3VwIG1lbWJlcnMgb2YgYSBzZWxlY3RlZCByb3V0ZSBncm91cC4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCI+RXhwYW5kPC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogZ3JvdXAgY29sbGFwc2UgYnV0dG9uLiBQcmVzc2luZyBidXR0b24gaGlkZXMgZ3JvdXAgbWVtYmVycyBvZiBhIHNlbGVjdGVkIHJvdXRlIGdyb3VwLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiPkNvbGxhcHNlPC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogYWxidW0gYXJ0IGJ1dHRvbi4gQ2xpY2tpbmcgb24gdGhlIGFsYnVtIGFydCB0YWtlcyB1c2VyIHRvIGEgcHJlZGVmaW5lZCBhY3Rpdml0eSBwZXIgbWVkaWEgYXBwLiBbQ0hBUiBMSU1JVD01MF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCI+QWxidW0gYXJ0PC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gZm9yIGFjY2Vzc2liaWxpdHkgKG5vdCBzaG93biBvbiB0aGUgc2NyZWVuKTogdm9sdW1lIHNsaWRlci4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiPlZvbHVtZSBzbGlkZXI8L3N0cmluZz4KLQotICAgIDwhLS0gUGxhY2Vob2xkZXIgdGV4dCB0byBzaG93IHdoZW4gbm8gbWVkaWEgaGF2ZSBiZWVuIHNlbGVjdGVkIGZvciBwbGF5YmFjay4gW0NIQVIgTElNSVQ9NTBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCI+Tm8gbWVkaWEgc2VsZWN0ZWQ8L3N0cmluZz4KLQotICAgIDwhLS0gUGxhY2Vob2xkZXIgdGV4dCB0byBzaG93IHdoZW4gbm8gdGl0bGUvZGVzY3JpcHRpb24gaGF2ZSBiZWVuIGZvdW5kIGZvciBhIGdpdmVuIHNvbmcvdmlkZW8uIFtDSEFSIExJTUlUPTUwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiPk5vIGluZm8gYXZhaWxhYmxlPC9zdHJpbmc+Ci0KLSAgICA8IS0tIFBsYWNlaG9sZGVyIHRleHQgaW5kaWNhdGluZyB0aGF0IHRoZSB1c2VyIGlzIGN1cnJlbnRseSBjYXN0aW5nIHNjcmVlbi4gW0NIQVIgTElNSVQ9NTBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiI+Q2FzdGluZyBzY3JlZW48L3N0cmluZz4KLQotICAgIDwhLS0gVGV4dCBmb3IgZXJyb3IgYWxlcnQgd2hlbiBhIHZpZGVvIGNvbnRhaW5lciBpcyBub3QgdmFsaWQgZm9yIHByb2dyZXNzaXZlIGRvd25sb2FkL3BsYXliYWNrLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9IlZpZGVvVmlldzJfZXJyb3JfdGV4dF9pbnZhbGlkX3Byb2dyZXNzaXZlX3BsYXliYWNrIj5UaGlzIHZpZGVvIGlzblwndCB2YWxpZCBmb3Igc3RyZWFtaW5nIHRvIHRoaXMgZGV2aWNlLjwvc3RyaW5nPgotICAgIDwhLS0gVGV4dCBmb3IgZXJyb3IgYWxlcnQgd2hlbiBhIHZpZGVvIGNhbm5vdCBiZSBwbGF5ZWQuIEl0IGNhbiBiZSB1c2VkIGJ5IGFueSBhcHAuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iVmlkZW9WaWV3Ml9lcnJvcl90ZXh0X3Vua25vd24iPkNhblwndCBwbGF5IHRoaXMgdmlkZW8uPC9zdHJpbmc+Ci0gICAgPCEtLSBCdXR0b24gdG8gY2xvc2UgZXJyb3IgYWxlcnQgd2hlbiBhIHZpZGVvIGNhbm5vdCBiZSBwbGF5ZWQuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iVmlkZW9WaWV3Ml9lcnJvcl9idXR0b24iPk9LPC9zdHJpbmc+Ci0KLSAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgYWQgc2tpcCB3YWl0IHRpbWUuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfYWRfc2tpcF93YWl0X3RpbWUiPgotICAgICAgICBZb3UgY2FuIHNraXAgQWQgaW4gPHhsaWZmOmcgaWQ9IndhaXRfdGltZSIgZXhhbXBsZT0iNSI+JTEkZDwveGxpZmY6Zz5zCi0gICAgPC9zdHJpbmc+Ci0gICAgPCEtLSBUZXh0IGZvciBkaXNwbGF5aW5nIGFkIHRvdGFsIHJlbWFpbmluZyB0aW1lLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX2FkX3JlbWFpbmluZ190aW1lIj4KLSAgICAgICAgQWQgwrcgPHhsaWZmOmcgaWQ9InJlbWFpbmluZ190aW1lIiBleGFtcGxlPSIxOjE1Ij4lMSRzPC94bGlmZjpnPiByZW1haW5pbmcKLSAgICA8L3N0cmluZz4KLSAgICA8IS0tIFBsYWNlaG9sZGVyIHRleHQgaW5kaWNhdGluZyB0aGF0IHRoZSB1c2VyIGNhbiBwcmVzcyB0aGUgYnV0dG9uIHRvIGdvIHRvIGFuIGV4dGVybmFsIHdlYnNpdGUuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfYWRfdGV4dCI+VmlzaXQgQWR2ZXJ0aXNlcjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfc3VidGl0bGVfdGV4dCI+Q2xvc2VkIGNhcHRpb248L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX3N1YnRpdGxlX29mZl90ZXh0Ij5PZmY8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX3RleHQiPkF1ZGlvIHRyYWNrPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9hdWRpb190cmFja19ub25lX3RleHQiPk5vbmU8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX3ZpZGVvX3F1YWxpdHlfdGV4dCI+VmlkZW8gcXVhbGl0eTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfdmlkZW9fcXVhbGl0eV9hdXRvX3RleHQiPkF1dG88L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX2hlbHBfdGV4dCI+SGVscCAmYW1wOyBmZWVkYmFjazwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfcGxheWJhY2tfc3BlZWRfdGV4dCI+UGxheWJhY2sgc3BlZWQ8L3N0cmluZz4KLSAgICA8c3RyaW5nLWFycmF5IG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX3BsYXliYWNrX3NwZWVkcyI+Ci0gICAgICAgIDxpdGVtPjAuMjV4PC9pdGVtPgotICAgICAgICA8aXRlbT4wLjV4PC9pdGVtPgotICAgICAgICA8aXRlbT4wLjc1eDwvaXRlbT4KLSAgICAgICAgPGl0ZW0+Tm9ybWFsPC9pdGVtPgotICAgICAgICA8aXRlbT4xLjI1eDwvaXRlbT4KLSAgICAgICAgPGl0ZW0+MS41eDwvaXRlbT4KLSAgICAgICAgPGl0ZW0+Mng8L2l0ZW0+Ci0gICAgPC9zdHJpbmctYXJyYXk+Ci0gICAgPCEtLSBQbGFjZWhvbGRlciB0ZXh0IGZvciBkaXNwbGF5aW5nIHRpbWUuIFVzZWQgdG8gY2FsY3VsYXRlIHdoaWNoIHNpemUgbGF5b3V0IHRvIHVzZS4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml90aW1lX3BsYWNlaG9sZGVyIj4wMDowMDowMDwvc3RyaW5nPgotCi0gICAgPCEtLSBUZXh0IGZvciBkaXNwbGF5aW5nIHN1YnRpdGxlIHRyYWNrIG51bWJlci4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9zdWJ0aXRsZV90cmFja19udW1iZXJfdGV4dCI+Ci0gICAgICAgIFRyYWNrIDx4bGlmZjpnIGlkPSJ0cmFja19udW1iZXIiIGV4YW1wbGU9IjEiPiUxJHM8L3hsaWZmOmc+Ci0gICAgPC9zdHJpbmc+Ci0gICAgPCEtLSBUZXh0IGZvciBkaXNwbGF5aW5nIGF1ZGlvIHRyYWNrIG51bWJlci4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9hdWRpb190cmFja19udW1iZXJfdGV4dCI+Ci0gICAgICAgIFRyYWNrIDx4bGlmZjpnIGlkPSJhdWRpb19udW1iZXIiIGV4YW1wbGU9IjEiPiUxJHM8L3hsaWZmOmc+Ci0gICAgPC9zdHJpbmc+Ci0gICAgPCEtLSBUZXh0IGZvciBkaXNwbGF5aW5nIHVua25vd24gc29uZyB0aXRsZS4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX211c2ljX3RpdGxlX3Vua25vd25fdGV4dCI+U29uZyB0aXRsZSB1bmtub3duPC9zdHJpbmc+Ci0gICAgPCEtLSBUZXh0IGZvciBkaXNwbGF5aW5nIHVua25vd24gYXJ0aXN0IG5hbWUuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9tdXNpY19hcnRpc3RfdW5rbm93bl90ZXh0Ij5BcnRpc3QgdW5rbm93bjwvc3RyaW5nPgotCi0gICAgPCEtLUNvbnRlbnQgRGVzY3JpcHRpb25zIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9iYWNrX2J1dHRvbl9kZXNjIj5CYWNrPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX292ZXJmbG93X2xlZnRfYnV0dG9uX2Rlc2MiPlNlZSBtb3JlIGJ1dHRvbnM8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfb3ZlcmZsb3dfcmlnaHRfYnV0dG9uX2Rlc2MiPkJhY2sgdG8gcHJldmlvdXMgYnV0dG9uIGxpc3Q8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfc2Vla19iYXJfZGVzYyI+UGxheWJhY2sgcHJvZ3Jlc3M8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfc2V0dGluZ3NfYnV0dG9uX2Rlc2MiPlNldHRpbmdzPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX3ZpZGVvX3F1YWxpdHlfYnV0dG9uX2Rlc2MiPlZpZGVvIFF1YWxpdHkgU2VsZWN0aW9uPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX2NjX2lzX29uIj5TdWJ0aXRsZSBpcyBvbi4gQ2xpY2sgdG8gaGlkZSBpdC48L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfY2NfaXNfb2ZmIj5TdWJ0aXRsZSBpcyBvZmYuIENsaWNrIHRvIHNob3cgaXQuPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX3JlcGxheV9idXR0b25fZGVzYyI+UmVwbGF5PC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX3BsYXlfYnV0dG9uX2Rlc2MiPlBsYXk8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfcGF1c2VfYnV0dG9uX2Rlc2MiPlBhdXNlPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX3ByZXZpb3VzX2J1dHRvbl9kZXNjIj5QcmV2aW91cyBtZWRpYTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9uZXh0X2J1dHRvbl9kZXNjIj5OZXh0IG1lZGlhPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX3Jld2luZF9idXR0b25fZGVzYyI+UmV3aW5kIGJ5IDEwIHNlY29uZHM8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfZmZ3ZF9idXR0b25fZGVzYyI+R28gZm9yd2FyZCBieSAzMCBzZWNvbmRzPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX2xhdW5jaF9idXR0b25fZGVzYyI+TGF1bmNoIExpbms8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfbXV0ZWRfYnV0dG9uX2Rlc2MiPk11dGVkLiBDbGljayB0byB1bm11dGU8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfdW5tdXRlZF9idXR0b25fZGVzYyI+Q2xpY2sgdG8gTXV0ZTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9mdWxsX3NjcmVlbl9idXR0b25fZGVzYyI+RnVsbCBzY3JlZW48L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3R5bGUueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3R5bGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YjlhOGVlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0eWxlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHJlc291cmNlcz4KLSAgICA8c3R5bGUgbmFtZT0iRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AbnVsbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfbWFyZ2luIj5AZGltZW4vbWN2Ml9pY29uX21hcmdpbjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzY2FsZVR5cGUiPmZpdFhZPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlByZXZpb3VzIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19za2lwX3ByZXZpb3VzPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfcHJldmlvdXNfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uTmV4dCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfc2tpcF9uZXh0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfbmV4dF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QYXVzZSI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX3BhdXNlX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9wYXVzZV9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfcGF1c2VfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uRmZ3ZCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfZm9yd2FyZF8zMDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2Z1bGxfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2Z1bGxfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX2Zmd2RfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUmV3Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19yZXdpbmRfMTA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9yZXdpbmRfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJFbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AbnVsbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfbWFyZ2luIj5AZGltZW4vbWN2Ml9pY29uX21hcmdpbjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzY2FsZVR5cGUiPmZpdFhZPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QcmV2aW91cyI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfc2tpcF9wcmV2aW91czwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfcHJldmlvdXNfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJFbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLk5leHQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3NraXBfbmV4dDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfbmV4dF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkVtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUGF1c2UiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3BhdXNlX2NpcmNsZV9maWxsZWQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9wYXVzZV9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfcGF1c2VfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3BhdXNlX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5GZndkIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19mb3J3YXJkXzMwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9mZndkX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5SZXciPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3Jld2luZF8xMDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfcmV3aW5kX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iTWluaW1hbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AbnVsbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX3BhdXNlX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9wYXVzZV9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X21hcmdpbiI+QGRpbWVuL21jdjJfaWNvbl9tYXJnaW48L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c2NhbGVUeXBlIj5maXRYWTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19wYXVzZV9jaXJjbGVfZmlsbGVkPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3BhdXNlX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGl0bGVCYXIiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+bWF0Y2hfcGFyZW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPjQ2ZHA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ1N0YXJ0Ij41ZHA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6cGFkZGluZ0VuZCI+NWRwPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGl0bGVCYXJCdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBudWxsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+MzZkcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij4zNmRwPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGl0bGVCYXJCdXR0b24uQmFjayI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfYXJyb3dfYmFjazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9iYWNrX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGl0bGVCYXJCdXR0b24uTGF1bmNoIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19sYXVuY2g8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfbGF1bmNoX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGltZVRleHQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+d3JhcF9jb250ZW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPndyYXBfY29udGVudDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nU3RhcnQiPjRkcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nRW5kIj40ZHA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFN0eWxlIj5ib2xkPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRTaXplIj4xNHNwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmdyYXZpdHkiPmNlbnRlcjwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRpbWVUZXh0LkN1cnJlbnQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+QGNvbG9yL3doaXRlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHQiPkBzdHJpbmcvTWVkaWFDb250cm9sVmlldzJfdGltZV9wbGFjZWhvbGRlcjwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRpbWVUZXh0LkludGVycHVuY3QiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+QGNvbG9yL3doaXRlX29wYWNpdHlfNzA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dCI+wrc8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaW1lVGV4dC5FbmQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnRleHRDb2xvciI+QGNvbG9yL3doaXRlX29wYWNpdHlfNzA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dCI+QHN0cmluZy9NZWRpYUNvbnRyb2xWaWV3Ml90aW1lX3BsYWNlaG9sZGVyPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpiYWNrZ3JvdW5kIj5AbnVsbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X21hcmdpbiI+QGRpbWVuL21jdjJfaWNvbl9tYXJnaW48L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+Y2VudGVyX2hvcml6b250YWw8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c2NhbGVUeXBlIj5maXRYWTwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5DQyI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfc3VidGl0bGVfb2ZmPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX2NjX2lzX29mZjwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5GdWxsU2NyZWVuIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19mdWxsc2NyZWVuPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX2Z1bGxfc2NyZWVuX2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uLk92ZXJmbG93UmlnaHQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2NoZXZyb25fcmlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfb3ZlcmZsb3dfcmlnaHRfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJCb3R0b21CYXJCdXR0b24uT3ZlcmZsb3dMZWZ0Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19jaGV2cm9uX2xlZnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfb3ZlcmZsb3dfbGVmdF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5TZXR0aW5ncyI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfc2V0dGluZ3M8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfc2V0dGluZ3NfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJCb3R0b21CYXJCdXR0b24uTXV0ZSI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfdW5tdXRlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3VubXV0ZWRfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJCb3R0b21CYXJCdXR0b24uVmlkZW9RdWFsaXR5Ij4KLSAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfaGlnaF9xdWFsaXR5PC9pdGVtPgotICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml92aWRlb19xdWFsaXR5X2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbE11c2ljUG9ydHJhaXQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPjBkcDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxNdXNpY1BvcnRyYWl0LkltYWdlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPm1hdGNoX3BhcmVudDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2VpZ2h0Ij4wLjY8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+Y2VudGVyPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbE11c2ljUG9ydHJhaXQuVGV4dCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5tYXRjaF9wYXJlbnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dlaWdodCI+MC40PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmdyYXZpdHkiPnRvcHxjZW50ZXI8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6b3JpZW50YXRpb24iPnZlcnRpY2FsPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbE11c2ljTGFuZHNjYXBlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPjBkcDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxNdXNpY0xhbmRzY2FwZS5JbWFnZSI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+bWF0Y2hfcGFyZW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93ZWlnaHQiPjAuMzU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+Y2VudGVyfHJpZ2h0PC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbE11c2ljTGFuZHNjYXBlLlRleHQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPm1hdGNoX3BhcmVudDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2VpZ2h0Ij4wLjY1PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0Ij4yNGRwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmdyYXZpdHkiPmNlbnRlcnxsZWZ0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOm9yaWVudGF0aW9uIj52ZXJ0aWNhbDwvaXRlbT4KLSAgICA8L3N0eWxlPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3R5bGVzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRlNjkwMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cmVzb3VyY2VzPgotICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuTWVkaWFSb3V0ZXIuTWVkaWFSb3V0ZUJ1dHRvbiIKLSAgICAgICAgICAgIHBhcmVudD0iV2lkZ2V0LkFwcENvbXBhdC5BY3Rpb25CdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJleHRlcm5hbFJvdXRlRW5hYmxlZERyYXdhYmxlIj5AZHJhd2FibGUvbXJfYnV0dG9uX2Rhcms8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJXaWRnZXQuTWVkaWFSb3V0ZXIuTGlnaHQuTWVkaWFSb3V0ZUJ1dHRvbiIKLSAgICAgICAgICAgIHBhcmVudD0iV2lkZ2V0LkFwcENvbXBhdC5MaWdodC5BY3Rpb25CdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJleHRlcm5hbFJvdXRlRW5hYmxlZERyYXdhYmxlIj5AZHJhd2FibGUvbXJfYnV0dG9uX2xpZ2h0PC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuVGl0bGUiIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuQXBwQ29tcGF0LlRpdGxlIiAvPgotCi0gICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlByaW1hcnlUZXh0IiBwYXJlbnQ9IlRleHRBcHBlYXJhbmNlLkFwcENvbXBhdC5TdWJoZWFkIiAvPgotCi0gICAgPHN0eWxlIG5hbWU9IlRleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlNlY29uZGFyeVRleHQiIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuQXBwQ29tcGF0LkJvZHkxIiAvPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zeW1ib2xzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N5bWJvbHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTBlOGM2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N5bWJvbHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLS8qIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0qKgotKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0qKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0qKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoqCi0qKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0qKgotKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0qLwotLS0+Ci08cmVzb3VyY2VzPgotICAgIDwhLS1qYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0iY2MiIC8+Ci0gICAgPGphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJmZndkIiAvPgotICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0ibWVkaWFjb250cm9sbGVyX3Byb2dyZXNzIiAvPgotICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0ibmV4dCIgLz4KLSAgICA8amF2YS1zeW1ib2wgdHlwZT0iaWQiIG5hbWU9InBhdXNlIiAvPgotICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0icHJldiIgLz4KLSAgICA8amF2YS1zeW1ib2wgdHlwZT0iaWQiIG5hbWU9InJldyIgLz4KLSAgICA8amF2YS1zeW1ib2wgdHlwZT0iaWQiIG5hbWU9InRpbWUiIC8+Ci0gICAgPGphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJ0aW1lX2N1cnJlbnQiIC8tLT4KLTwvcmVzb3VyY2VzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3RoZW1lcy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy90aGVtZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWE3NTRiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3RoZW1lcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGhlbWUuTWVkaWFSb3V0ZXIiIHBhcmVudD0iYW5kcm9pZDpUaGVtZS5NYXRlcmlhbCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6d2luZG93Tm9UaXRsZSI+dHJ1ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUJ1dHRvblN0eWxlIj5Ac3R5bGUvV2lkZ2V0Lk1lZGlhUm91dGVyLk1lZGlhUm91dGVCdXR0b248L2l0ZW0+Ci0KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUNsb3NlRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBsYXlEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3BsYXlfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBhdXNlRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlU3RvcERyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIj5AZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlRGVmYXVsdEljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVR2SWNvbkRyYXdhYmxlIj5AZHJhd2FibGUvaWNfdm9sX3R5cGVfdHZfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVNwZWFrZXJJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY192b2xfdHlwZV9zcGVha2VyX2Rhcms8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVTcGVha2VyR3JvdXBJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2Rhcms8L2l0ZW0+Ci0KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSI+QG51bGw8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5NZWRpYVJvdXRlci5MaWdodENvbnRyb2xQYW5lbCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVDb250cm9sUGFuZWxUaGVtZU92ZXJsYXkiPkBzdHlsZS9UaGVtZU92ZXJsYXkuTWVkaWFSb3V0ZXIuTGlnaHQ8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5NZWRpYVJvdXRlci5MaWdodCIgcGFyZW50PSJhbmRyb2lkOlRoZW1lLk1hdGVyaWFsLkxpZ2h0Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dOb1RpdGxlIj50cnVlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQnV0dG9uU3R5bGUiPkBzdHlsZS9XaWRnZXQuTWVkaWFSb3V0ZXIuTGlnaHQuTWVkaWFSb3V0ZUJ1dHRvbjwvaXRlbT4KLQotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQ2xvc2VEcmF3YWJsZSI+QGRyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBsYXlEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3BsYXlfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVQYXVzZURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVTdG9wRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2xpZ2h0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIj5AZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZURlZmF1bHRJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY19tcl9idXR0b25fZ3JleTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVR2SWNvbkRyYXdhYmxlIj5AZHJhd2FibGUvaWNfdm9sX3R5cGVfdHZfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVTcGVha2VySWNvbkRyYXdhYmxlIj5AZHJhd2FibGUvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVNwZWFrZXJHcm91cEljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQ8L2l0ZW0+Ci0KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSI+QG51bGw8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5NZWRpYVJvdXRlci5MaWdodC5EYXJrQ29udHJvbFBhbmVsIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSI+QHN0eWxlL1RoZW1lT3ZlcmxheS5NZWRpYVJvdXRlci5EYXJrPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGhlbWVPdmVybGF5Lk1lZGlhUm91dGVyLkRhcmsiIHBhcmVudD0iYW5kcm9pZDpUaGVtZS5NYXRlcmlhbCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVQbGF5RHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2Rhcms8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVQYXVzZURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVN0b3BEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3N0b3BfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUF1ZGlvVHJhY2tEcmF3YWJsZSI+QGRyYXdhYmxlL21yX3ZvbF90eXBlX2F1ZGlvdHJhY2tfZGFyazwvaXRlbT4KLQotICAgIDwvc3R5bGU+Ci0gICAgPHN0eWxlIG5hbWU9IlRoZW1lT3ZlcmxheS5NZWRpYVJvdXRlci5MaWdodCIgcGFyZW50PSJhbmRyb2lkOlRoZW1lLk1hdGVyaWFsLkxpZ2h0Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBsYXlEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3BsYXlfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVQYXVzZURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVTdG9wRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2xpZ2h0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIj5AZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19saWdodDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9ydW5jdHMuc2ggYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcnVuY3RzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWIxYTFlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9ydW5jdHMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotIyEvYmluL2Jhc2gKLSMgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBVc2FnZSAnLiBydW5jdHMuc2gnCi0KLWZ1bmN0aW9uIF9ydW50ZXN0X2N0c19tZWRpYWNvbXBvbmVudF91c2FnZSgpIHsKLSAgZWNobyAncnVudGVzdC1jdHMtTWVkaWFDb21wb25lbnRzIFtvcHRpb25dOiBCdWlsZCwgZmxhc2ggZGV2aWNlLCcKLSAgZWNobyAnICAgICAgICAgICAgICBhbmQgcnVuIHN1YnNldCBvZiBDdHNNZWRpYVRlc3RDYXNlcyB0aGF0IE1lZGlhQ29tcG9uZW50cyBjb3ZlcnMuJwotICBlY2hvICcgICAgICAgICAgKldhcm5pbmcqIFRoaXMgYnlwYXNzZXMgQ1RTIHNldHVwIChlLmcuIGRvd25sb2FkIG1lZGlhIGNvbnRlbnRzIGZyb20gc2VydmVyKScKLSAgZWNobyAnICAgICAgICAgIEZvciBydW5uaW5nIENUUyBpbiBvZmZpY2lhbCB3YXksIHVzZSBhdGVzdCBvciBjdHMtdHJhZGVmZWQgJwotICBlY2hvICcgICAgIC1ofC0taGVscDogVGhpcyBoZWxwJwotICBlY2hvICcgICAgIC0tc2tpcDogU2tpcCBidWlsZCBhbmQgZmxhc2guIEp1c3QgcmVydW4tdGVzdHMnCi0gIGVjaG8gJyAgICAgLS1taW46IE9ubHkgcmVidWlsZCB0ZXN0cyBhbmQgdXBkYXRhYmxlIGxpYnJhcnkuJwotICBlY2hvICcgICAgIC0tdGVzdDogT25seSByZWJ1aWxkIHRlc3RzJwotICBlY2hvICcgICAgIC1zIFtkZXZpY2VfaWRdOiBTcGVjaWZ5IGEgZGV2aWNlIG5hbWUgdG8gcnVuIHRlc3QgYWdhaW5zdC4nCi0gIGVjaG8gJyAgICAgICAgICAgICAgICAgICAgIFlvdSBjYW4gZGVmaW5lICR7QURCSE9TVH0gaW5zdGVhZC4nCi0gIGVjaG8gJyAgICAgLXIgW2NvdW50XTogUmVwZWF0IHRlc3RzIGZvciBnaXZlbiBjb3VudC4gSXQgd2lsbCBzdG9wIHdoZW4gZmFpbHMuJwotICBlY2hvICcgICAgIC0taWdub3JlOiBLZWVwIHJlcGVhdGluZyB0ZXN0cyBldmVuIHdoZW4gaXQgZmFpbHMuJwotICBlY2hvICcgICAgIC10IFt0ZXN0XTogT25seSBydW4gdGhlIHNwZWNpZmljIHRlc3QuIENhbiBiZSBlaXRoZXIgYSBjbGFzcyBvciBhIG1ldGhvZC4nCi19Ci0KLWZ1bmN0aW9uIHJ1bnRlc3QtY3RzLU1lZGlhQ29tcG9uZW50cygpIHsKLSAgIyBFZGl0IGhlcmUgaWYgeW91IHdhbnQgdG8gc3VwcG9ydCBvdGhlciB0ZXN0cy4KLSAgIyBMaXN0IHVwIGxpYnMgYW5kIGFwa3MgaW4gdGhlIG1lZGlhX2FwaSBuZWVkZWQgZm9yIHRlc3RzLCBhbmQgcGxhY2UgdGVzdCB0YXJnZXQgYXQgdGhlIGxhc3QuCi0gIGxvY2FsIFRFU1RfUEFDS0FHRV9ESVI9KCJmcmFtZXdvcmtzL2F2L3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0IikKLSAgbG9jYWwgVEVTVF9QQUNLQUdFPSgiYW5kcm9pZC5tZWRpYS5jdHMiKQotICBsb2NhbCBCVUlMRF9UQVJHRVRTPSgiTWVkaWFDb21wb25lbnRzIiAiQ3RzTWVkaWFUZXN0Q2FzZXMiKQotICAjIERvbid0IGluY2x1ZGUgTWVkaWFDb21wb25lbnRzIC0tIGlmIHdlIHNpbXBseSBpbnN0YWxsIGl0LCBzeXN0ZW0gc2VydmVyCi0gICMgd291bGRuJ3QgdXNlIHRoZSBpbnN0YWxsZWQgb25lLgotICBsb2NhbCBJTlNUQUxMX1RBUkdFVFM9KCJDdHNNZWRpYVRlc3RDYXNlcyIpCi0gIGxvY2FsIFRFU1RfUlVOTkVSPSJhbmRyb2lkLnN1cHBvcnQudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgotICBsb2NhbCBERVBFTkRFTkNJRVM9KCJtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQiICJhbmRyb2lkLXN1cHBvcnQtdGVzdCIgImNvbXBhdGliaWxpdHktZGV2aWNlLXV0aWwiKQotICBsb2NhbCBERUZBVUxUX1RFU1RfVEFSR0VUPSIiCi0gIERFRkFVTFRfVEVTVF9UQVJHRVQrPSJhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYUJyb3dzZXIyVGVzdCIKLSAgREVGQVVMVF9URVNUX1RBUkdFVCs9IixhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYUNvbnRyb2xsZXIyVGVzdCIKLSAgREVGQVVMVF9URVNUX1RBUkdFVCs9IixhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYU1ldGFkYXRhMlRlc3QiCi0gIERFRkFVTFRfVEVTVF9UQVJHRVQrPSIsYW5kcm9pZC5tZWRpYS5jdHMuTWVkaWFTZXNzaW9uMlRlc3QiCi0gIERFRkFVTFRfVEVTVF9UQVJHRVQrPSIsYW5kcm9pZC5tZWRpYS5jdHMuTWVkaWFTZXNzaW9uMl9QZXJtaXNzaW9uVGVzdCIKLSAgREVGQVVMVF9URVNUX1RBUkdFVCs9IixhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYVNlc3Npb25NYW5hZ2VyX01lZGlhU2Vzc2lvbjJUZXN0IgotICBERUZBVUxUX1RFU1RfVEFSR0VUKz0iLGFuZHJvaWQubWVkaWEuY3RzLlNlc3Npb25Ub2tlbjJUZXN0IgotICBpZiBbWyAteiAiJHtBTkRST0lEX0JVSUxEX1RPUH0iIF1dOyB0aGVuCi0gICAgZWNobyAiTmVlZHMgdG8gbHVuY2ggYSB0YXJnZXQgZmlyc3QiCi0gICAgcmV0dXJuCi0gIGZpCi0KLSAgbG9jYWwgb2xkX3BhdGg9JHtPTERQV0R9Ci0gIHdoaWxlIHRydWU7IGRvCi0gICAgbG9jYWwgT1BUSU9OX1NLSVA9ImZhbHNlIgotICAgIGxvY2FsIE9QVElPTl9NSU49ImZhbHNlIgotICAgIGxvY2FsIE9QVElPTl9URVNUPSJmYWxzZSIKLSAgICBsb2NhbCBPUFRJT05fUkVQRUFUX0NPVU5UPSIxIgotICAgIGxvY2FsIE9QVElPTl9JR05PUkU9ImZhbHNlIgotICAgIGxvY2FsIE9QVElPTl9URVNUX1RBUkdFVD0iJHtERUZBVUxUX1RFU1RfVEFSR0VUfSIKLSAgICBsb2NhbCBhZGJob3N0X2xvY2FsCi0gICAgd2hpbGUgKCggIiQjIiApKTsgZG8KLSAgICAgIGNhc2UgIiR7MX0iIGluCi0gICAgICAgIC1ofC0taGVscCkKLSAgICAgICAgICBfcnVudGVzdF9jdHNfbWVkaWFjb21wb25lbnRfdXNhZ2UKLSAgICAgICAgICByZXR1cm4KLSAgICAgICAgICA7OwotICAgICAgICAtLXNraXApCi0gICAgICAgICAgT1BUSU9OX1NLSVA9InRydWUiCi0gICAgICAgICAgOzsKLSAgICAgICAgLS1taW4pCi0gICAgICAgICAgT1BUSU9OX01JTj0idHJ1ZSIKLSAgICAgICAgICA7OwotICAgICAgICAtLXRlc3QpCi0gICAgICAgICAgT1BUSU9OX1RFU1Q9InRydWUiCi0gICAgICAgICAgOzsKLSAgICAgICAgLXMpCi0gICAgICAgICAgc2hpZnQKLSAgICAgICAgICBhZGJob3N0X2xvY2FsPSR7MX0KLSAgICAgICAgICA7OwotICAgICAgICAtcikKLSAgICAgICAgICBzaGlmdAotICAgICAgICAgIE9QVElPTl9SRVBFQVRfQ09VTlQ9IiR7MX0iCi0gICAgICAgICAgOzsKLSAgICAgICAgLS1pZ25vcmUpCi0gICAgICAgICAgT1BUSU9OX0lHTk9SRT0idHJ1ZSIKLSAgICAgICAgICA7OwotICAgICAgICAtdCkKLSAgICAgICAgICBzaGlmdAotICAgICAgICAgIE9QVElPTl9URVNUX1RBUkdFVD0iJHsxfSIKLSAgICAgIGVzYWMKLSAgICAgIHNoaWZ0Ci0gICAgZG9uZQotCi0gICAgIyBCdWlsZCBhZGIgY29tbWFuZC4KLSAgICBsb2NhbCBhZGIKLSAgICBpZiBbWyAteiAiJHthZGJob3N0X2xvY2FsfSIgXV07IHRoZW4KLSAgICAgIGFkYmhvc3RfbG9jYWw9JHtBREJIT1NUfQotICAgIGZpCi0gICAgaWYgW1sgLXogIiR7YWRiaG9zdF9sb2NhbH0iIF1dOyB0aGVuCi0gICAgICBsb2NhbCBkZXZpY2VfY291bnQ9JChhZGIgZGV2aWNlcyB8IHNlZCAnL15bWzpzcGFjZTpdXSokL2QnIHwgd2MgLWwpCi0gICAgICBpZiBbWyAiJHtkZXZpY2VfY291bnR9IiAhPSAiMiIgXV07IHRoZW4KLSAgICAgICAgZWNobyAiVG9vIG1hbnkgZGV2aWNlcy4gU3BlY2lmeSBhIGRldmljZS4iICYmIGJyZWFrCi0gICAgICBmaQotICAgICAgYWRiPSJhZGIiCi0gICAgZWxzZQotICAgICAgYWRiPSJhZGIgLXMgJHthZGJob3N0X2xvY2FsfSIKLSAgICBmaQotCi0gICAgbG9jYWwgdGFyZ2V0X2Rpcj0iJHtBTkRST0lEX0JVSUxEX1RPUH0vJHtURVNUX1BBQ0tBR0VfRElSfSIKLSAgICAjbG9jYWwgVEVTVF9QQUNLQUdFPSQoc2VkIC1uICdzL14uKlxicGFja2FnZVxiPSJcKFthLXowLTlcLl0qXCkiLiokL1wxL3AnICR7dGFyZ2V0X2Rpcn0vQW5kcm9pZE1hbmlmZXN0LnhtbCkKLQotICAgIGlmIFtbICIke09QVElPTl9TS0lQfSIgIT0gInRydWUiIF1dOyB0aGVuCi0gICAgICAjIEJ1aWxkIGRlcGVuZGVuY2llcyBpZiBuZWVkZWQuCi0gICAgICBsb2NhbCBkZXBlbmRlbmN5Ci0gICAgICBsb2NhbCBidWlsZF9kZXBlbmRlbmN5PSIiCi0gICAgICBmb3IgZGVwZW5kZW5jeSBpbiAke0RFUEVOREVOQ0lFU1tAXX07IGRvCi0gICAgICAgIGlmIFtbICIke2RlcGVuZGVuY3l9IiA9PSAib3V0LyIqIF1dOyB0aGVuCi0gICAgICAgICAgaWYgW1sgISAtZiAke0FORFJPSURfQlVJTERfVE9QfS8ke2RlcGVuZGVuY3l9IF1dOyB0aGVuCi0gICAgICAgICAgICBidWlsZF9kZXBlbmRlbmN5PSJ0cnVlIgotICAgICAgICAgICAgYnJlYWsKLSAgICAgICAgICBmaQotICAgICAgICBlbHNlCi0gICAgICAgICAgaWYgW1sgIiQoZmluZCAke09VVH0gLW5hbWUgJHtkZXBlbmRlbmN5fV9pbnRlcm1lZGlhdGVzIHwgd2MgLWwpIiA9PSAiMCIgXV07IHRoZW4KLSAgICAgICAgICAgIGJ1aWxkX2RlcGVuZGVuY3k9InRydWUiCi0gICAgICAgICAgICBicmVhawotICAgICAgICAgIGZpCi0gICAgICAgIGZpCi0gICAgICBkb25lCi0gICAgICBpZiBbWyAiJHtidWlsZF9kZXBlbmRlbmN5fSIgPT0gInRydWUiIF1dOyB0aGVuCi0gICAgICAgIGVjaG8gIkJ1aWxkaW5nIGRlcGVuZGVuY2llcy4gV2lsbCBvbmx5IHByaW50IHN0ZGVyci4iCi0gICAgICAgIG0gJHtERVBFTkRFTkNJRVNbQF19IC1qID4gL2Rldi9udWxsCi0gICAgICBmaQotCi0gICAgICAjIEJ1aWxkIHRlc3QgYXBrIGFuZCByZXF1aXJlZCBhcGsuCi0gICAgICBsb2NhbCBidWlsZF90YXJnZXRzCi0gICAgICBpZiBbWyAiJHtPUFRJT05fVEVTVH0iID09ICJ0cnVlIiBdXTsgdGhlbgotICAgICAgICBidWlsZF90YXJnZXRzPSIke0lOU1RBTExfVEFSR0VUU1tAXX0iCi0gICAgICBlbGlmIFtbICIke09QVElPTl9NSU59IiA9PSAidHJ1ZSIgXV07IHRoZW4KLSAgICAgICAgYnVpbGRfdGFyZ2V0cz0iJHtCVUlMRF9UQVJHRVRTW0BdfSIKLSAgICAgIGVsc2UKLSAgICAgICAgYnVpbGRfdGFyZ2V0cz0iJHtCVUlMRF9UQVJHRVRTW0BdfSBkcm9pZCIKLSAgICAgIGZpCi0gICAgICBtICR7YnVpbGRfdGFyZ2V0c30gLWogfHwgYnJlYWsKLQotICAgICAgaWYgW1sgIiR7T1BUSU9OX1RFU1R9IiAhPSAidHJ1ZSIgXV07IHRoZW4KLSAgICAgICAgIyBGbGFzaCBvbmx5IHdoZW4gbmVlZGVkCi0gICAgICAgIGxvY2FsIGRldmljZV9idWlsZF90eXBlPSIkKCR7YWRifSBzaGVsbCBnZXRwcm9wIHJvLmJ1aWxkLnR5cGUpIgotICAgICAgICBpZiBbWyAiJHtkZXZpY2VfYnVpbGRfdHlwZX0iID09ICJ1c2VyIiBdXTsgdGhlbgotICAgICAgICAgICMgVXNlciBidWlsZC4gQ2Fubm90IGFkYiBzeW5jCi0gICAgICAgICAgJHthZGJ9IHJlYm9vdCBib290bG9hZGVyCi0gICAgICAgICAgZmFzdGJvb3QgZmxhc2hhbGwKLSAgICAgICAgZWxzZQotICAgICAgICAgICR7YWRifSByb290Ci0gICAgICAgICAgbG9jYWwgZGV2aWNlX3Zlcml0eV9tb2RlPSIkKCR7YWRifSBzaGVsbCBnZXRwcm9wIHJvLmJvb3QudmVyaXR5bW9kZSkiCi0gICAgICAgICAgaWYgW1sgIiR7ZGV2aWNlX3Zlcml0eV9tb2RlfSIgIT0gImRpc2FibGVkIiBdXTsgdGhlbgotICAgICAgICAgICAgJHthZGJ9IGRpc2FibGUtdmVyaXR5Ci0gICAgICAgICAgICAke2FkYn0gcmVib290Ci0gICAgICAgICAgICAke2FkYn0gd2FpdC1mb3ItZGV2aWNlIHx8IGJyZWFrCi0gICAgICAgICAgICAke2FkYn0gcm9vdAotICAgICAgICAgIGZpCi0gICAgICAgICAgJHthZGJ9IHJlbW91bnQKLSAgICAgICAgICAke2FkYn0gc2hlbGwgc3RvcAotICAgICAgICAgICR7YWRifSBzaGVsbCBzZXRwcm9wIGxvZy50YWcuTWVkaWFTZXNzaW9uU2VydmljZSBERUJVRwotICAgICAgICAgICR7YWRifSBzeW5jCi0gICAgICAgICAgJHthZGJ9IHNoZWxsIHN0YXJ0Ci0gICAgICAgIGZpCi0gICAgICAgICR7YWRifSB3YWl0LWZvci1kZXZpY2UgfHwgYnJlYWsKLSAgICAgICAgIyBFbnN1cmUgcGFja2FnZSBtYW5hZ2VyIGlzIGxvYWRlZC4KLSAgICAgICAgIyBUT0RPKGphZXdhbik6IEZpbmQgYmV0dGVyIHdheSB0byB3YWl0Ci0gICAgICAgIHNsZWVwIDE1Ci0gICAgICBmaQotCi0gICAgICAjIEluc3RhbGwgYXBrcwotICAgICAgbG9jYWwgaW5zdGFsbF9mYWlsZWQ9ImZhbHNlIgotICAgICAgZm9yIHRhcmdldCBpbiAke0lOU1RBTExfVEFSR0VUU1tAXX07IGRvCi0gICAgICAgIGxvY2FsIGFwa19wYXRoPSQoZmluZCAke09VVH0vc3lzdGVtICR7T1VUfS9kYXRhIC1uYW1lICR7dGFyZ2V0fS5hcGspCi0gICAgICAgIGxvY2FsIGFwa19udW09JChmaW5kICR7T1VUfS9zeXN0ZW0gJHtPVVR9L2RhdGEgLW5hbWUgJHt0YXJnZXR9LmFwayB8IHdjIC1sKQotICAgICAgICBpZiBbWyAiJHthcGtfbnVtfSIgIT0gIjEiIF1dOyB0aGVuCi0gICAgICAgICAgZWNobyAiQ2Fubm90IGxvY2F0ZSBhICR7dGFyZ2V0fS5hcGsuIEZvdW5kICR7YXBrX251bX0gYXBrcyIgJiYgYnJlYWsKLSAgICAgICAgZmkKLSAgICAgICAgZWNobyAiSW5zdGFsbGluZyAke3RhcmdldH0uYXBrLiBwYXRoPSR7YXBrX3BhdGh9IgotICAgICAgICAke2FkYn0gaW5zdGFsbCAtciAke2Fwa19wYXRofQotICAgICAgICBpZiBbWyAiJHs/fSIgIT0gIjAiIF1dOyB0aGVuCi0gICAgICAgICAgaW5zdGFsbF9mYWlsZWQ9InRydWUiCi0gICAgICAgICAgYnJlYWsKLSAgICAgICAgZmkKLSAgICAgIGRvbmUKLSAgICAgIGlmIFtbICIke2luc3RhbGxfZmFpbGVkfSIgPT0gInRydWUiIF1dOyB0aGVuCi0gICAgICAgIGVjaG8gIkZhaWxlZCB0byBpbnN0YWxsLiBUZXN0IHdvdWxkbid0IHJ1bi4iCi0gICAgICAgIGJyZWFrCi0gICAgICBmaQotICAgIGZpCi0KLSAgICBsb2NhbCB0ZXN0X3RhcmdldD0iIgotICAgIGlmIFtbIC1uICIke09QVElPTl9URVNUX1RBUkdFVH0iIF1dOyB0aGVuCi0gICAgICB0ZXN0X3RhcmdldD0iLWUgY2xhc3MgJHtPUFRJT05fVEVTVF9UQVJHRVR9IgotICAgIGZpCi0KLSAgICBsb2NhbCBpCi0gICAgbG9jYWwgdG1wZmlsZT0kKHRlbXBmaWxlKQotICAgIGZvciAoKGk9MTsgaSA8PSAke09QVElPTl9SRVBFQVRfQ09VTlR9OyBpKyspKTsgZG8KLSAgICAgIGVjaG8gIlJ1biB0ZXN0ICR7aX0vJHtPUFRJT05fUkVQRUFUX0NPVU5UfSIKLSAgICAgICR7YWRifSBzaGVsbCBhbSBpbnN0cnVtZW50ICR7dGVzdF90YXJnZXR9IC13ICR7VEVTVF9QQUNLQUdFfS8ke1RFU1RfUlVOTkVSfSA+JiAke3RtcGZpbGV9Ci0gICAgICBjYXQgJHt0bXBmaWxlfQotICAgICAgaWYgW1sgIiR7T1BUSU9OX0lHTk9SRX0iICE9ICJ0cnVlIiBdXTsgdGhlbgotICAgICAgICBpZiBbWyAtbiAiJChncmVwICR7dG1wZmlsZX0gLWUgJ0ZBSUxVUkVcfGNyYXNoZWQnKSIgXV07IHRoZW4KLSAgICAgICAgICAjIGFtIGluc3RydW1lbnQgZG9lc24ndCByZXR1cm4gZXJyb3IgY29kZSBzbyBuZWVkIHRvIGdyZXAgcmVzdWx0IG1lc3NhZ2UgaW5zdGVhZAotICAgICAgICAgIGJyZWFrCi0gICAgICAgIGZpCi0gICAgICBmaQotICAgIGRvbmUKLSAgICBybSAke3RtcGZpbGV9Ci0gICAgYnJlYWsKLSAgZG9uZQotfQotCi1lY2hvICJGb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBhZGRlZCB0byB5b3VyIGVudmlyb25tZW50OiIKLV9ydW50ZXN0X2N0c19tZWRpYWNvbXBvbmVudF91c2FnZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9JTWVkaWFDb250cm9sbGVyMi5haWRsIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9JTWVkaWFDb250cm9sbGVyMi5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNDg4YjcwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvSU1lZGlhQ29udHJvbGxlcjIuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5JTWVkaWFTZXNzaW9uMjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZnJvbSBNZWRpYVNlc3Npb24yIHRvIE1lZGlhQ29udHJvbGxlcjIuCi0gKiA8cD4KLSAqIEtlZXAgdGhpcyBpbnRlcmZhY2Ugb25ld2F5LiBPdGhlcndpc2UgYSBtYWxpY2lvdXMgYXBwIG1heSBpbXBsZW1lbnQgZmFrZSB2ZXJzaW9uIG9mIHRoaXMsCi0gKiBhbmQgaG9sZHMgY2FsbHMgZnJvbSBzZXNzaW9uIHRvIG1ha2Ugc2Vzc2lvbiBvd25lcihzKSBmcm96ZW4uCi0gKi8KLS8vIFRPRE8oamFld2FuKTogKFBvc3QgUCkgSGFuZGxlIHdoZW4gdGhlIHBsYXlsaXN0IGJlY29tZXMgdG9vIGh1Z2UuCi0vLyAgICAgICAgICAgICAgIE5vdGUgdGhhdCBQYXJjZWxsZWRTbGljZUxpc3QgaXNuJ3QgYSBnb29kIGlkZWEgZm9yIHRoZSBwdXJwb3NlLiAoc2VlOiBiLzM3NDkzNjc3KQotb25ld2F5IGludGVyZmFjZSBJTWVkaWFDb250cm9sbGVyMiB7Ci0gICAgdm9pZCBvblBsYXllclN0YXRlQ2hhbmdlZChpbnQgc3RhdGUpOwotICAgIHZvaWQgb25Qb3NpdGlvbkNoYW5nZWQobG9uZyBldmVudFRpbWVNcywgbG9uZyBwb3NpdGlvbk1zKTsKLSAgICB2b2lkIG9uUGxheWJhY2tTcGVlZENoYW5nZWQoZmxvYXQgc3BlZWQpOwotICAgIHZvaWQgb25CdWZmZXJlZFBvc2l0aW9uQ2hhbmdlZChsb25nIGJ1ZmZlcmVkUG9zaXRpb25Ncyk7Ci0gICAgdm9pZCBvblBsYXlsaXN0Q2hhbmdlZChpbiBMaXN0PEJ1bmRsZT4gcGxheWxpc3QsIGluIEJ1bmRsZSBtZXRhZGF0YSk7Ci0gICAgdm9pZCBvblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKGluIEJ1bmRsZSBtZXRhZGF0YSk7Ci0gICAgdm9pZCBvblBsYXliYWNrSW5mb0NoYW5nZWQoaW4gQnVuZGxlIHBsYXliYWNrSW5mbyk7Ci0gICAgdm9pZCBvblJlcGVhdE1vZGVDaGFuZ2VkKGludCByZXBlYXRNb2RlKTsKLSAgICB2b2lkIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkKGludCBzaHVmZmxlTW9kZSk7Ci0gICAgdm9pZCBvbkVycm9yKGludCBlcnJvckNvZGUsIGluIEJ1bmRsZSBleHRyYXMpOwotCi0gICAgdm9pZCBvbkNvbm5lY3RlZChJTWVkaWFTZXNzaW9uMiBzZXNzaW9uQmluZGVyLCBpbiBCdW5kbGUgY29tbWFuZEdyb3VwLAotICAgICAgICAgICAgaW50IHBsYXllclN0YXRlLCBsb25nIHBvc2l0aW9uRXZlbnRUaW1lTXMsIGxvbmcgcG9zaXRpb25NcywgZmxvYXQgcGxheWJhY2tTcGVlZCwKLSAgICAgICAgICAgIGxvbmcgYnVmZmVyZWRQb3NpdGlvbk1zLCBpbiBCdW5kbGUgcGxheWJhY2tJbmZvLCBpbnQgcmVwZWF0TW9kZSwgaW50IHNodWZmbGVNb2RlLAotICAgICAgICAgICAgaW4gTGlzdDxCdW5kbGU+IHBsYXlsaXN0LCBpbiBQZW5kaW5nSW50ZW50IHNlc3Npb25BY3Rpdml0eSk7Ci0gICAgdm9pZCBvbkRpc2Nvbm5lY3RlZCgpOwotCi0gICAgdm9pZCBvbkN1c3RvbUxheW91dENoYW5nZWQoaW4gTGlzdDxCdW5kbGU+IGNvbW1hbmRCdXR0b25saXN0KTsKLSAgICB2b2lkIG9uQWxsb3dlZENvbW1hbmRzQ2hhbmdlZChpbiBCdW5kbGUgY29tbWFuZHMpOwotCi0gICAgdm9pZCBvbkN1c3RvbUNvbW1hbmQoaW4gQnVuZGxlIGNvbW1hbmQsIGluIEJ1bmRsZSBhcmdzLCBpbiBSZXN1bHRSZWNlaXZlciByZWNlaXZlcik7Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gQnJvd3NlciBzZXBjaWZpYwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICB2b2lkIG9uR2V0TGlicmFyeVJvb3REb25lKGluIEJ1bmRsZSByb290SGludHMsIFN0cmluZyByb290TWVkaWFJZCwgaW4gQnVuZGxlIHJvb3RFeHRyYSk7Ci0gICAgdm9pZCBvbkdldEl0ZW1Eb25lKFN0cmluZyBtZWRpYUlkLCBpbiBCdW5kbGUgcmVzdWx0KTsKLSAgICB2b2lkIG9uQ2hpbGRyZW5DaGFuZ2VkKFN0cmluZyByb290TWVkaWFJZCwgaW50IGl0ZW1Db3VudCwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBvbkdldENoaWxkcmVuRG9uZShTdHJpbmcgcGFyZW50SWQsIGludCBwYWdlLCBpbnQgcGFnZVNpemUsIGluIExpc3Q8QnVuZGxlPiByZXN1bHQsCi0gICAgICAgICAgICBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIG9uU2VhcmNoUmVzdWx0Q2hhbmdlZChTdHJpbmcgcXVlcnksIGludCBpdGVtQ291bnQsIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgb25HZXRTZWFyY2hSZXN1bHREb25lKFN0cmluZyBxdWVyeSwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwgaW4gTGlzdDxCdW5kbGU+IHJlc3VsdCwKLSAgICAgICAgICAgIGluIEJ1bmRsZSBleHRyYXMpOwotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9JTWVkaWFTZXNzaW9uMi5haWRsIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9JTWVkaWFTZXNzaW9uMi5haWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjQ0NjdkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvSU1lZGlhU2Vzc2lvbjIuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLklNZWRpYUNvbnRyb2xsZXIyOwotCi0vKioKLSAqIEludGVyZmFjZSBmcm9tIE1lZGlhQ29udHJvbGxlcjIgdG8gTWVkaWFTZXNzaW9uMi4KLSAqIDxwPgotICogS2VlcCB0aGlzIGludGVyZmFjZSBvbmV3YXkuIE90aGVyd2lzZSBhIG1hbGljaW91cyBhcHAgbWF5IGltcGxlbWVudCBmYWtlIHZlcnNpb24gb2YgdGhpcywKLSAqIGFuZCBob2xkcyBjYWxscyBmcm9tIHNlc3Npb24gdG8gbWFrZSBzZXNzaW9uIG93bmVyKHMpIGZyb3plbi4KLSAqLwotIC8vIFRPRE8oamFld2FuKTogKFBvc3QgUCkgSGFuZGxlIHdoZW4gdGhlIHBsYXlsaXN0IGJlY29tZXMgdG9vIGh1Z2UuCi0gLy8gICAgICAgICAgICAgICBOb3RlIHRoYXQgUGFyY2VsbGVkU2xpY2VMaXN0IGlzbid0IGEgZ29vZCBpZGVhIGZvciB0aGUgcHVycG9zZS4gKHNlZTogYi8zNzQ5MzY3NykKLW9uZXdheSBpbnRlcmZhY2UgSU1lZGlhU2Vzc2lvbjIgewotICAgIC8vIFRPRE8oamFld2FuKTogYWRkIG9uQ29tbWFuZCgpIHRvIHNlbmQgcHJpdmF0ZSBjb21tYW5kCi0KLSAgICAvLyBUT0RPKGphZXdhbik6IChQb3N0IFApIFdlIG1heSBjb25zaWRlciB0byBhZGQgYW5vdGhlciBiaW5kZXIganVzdCBmb3IgdGhlIGNvbm5lY3Rpb24KLSAgICAvLyAgICAgICAgICAgICAgIG5vdCB0byBleHBvc2Ugb3RoZXIgbWV0aG9kcyB0byB0aGUgY29udHJvbGxlciB3aG9zZSBjb25uZWN0aW9uIHdhc24ndCBhY2NlcHRlZC4KLSAgICAvLyAgICAgICAgICAgICAgIEJ1dCB0aGlzIHdvdWxkIGJlIGVub3VnaCBmb3Igbm93IGJlY2F1c2UgaXQncyB0aGUgc2FtZSBhcyBleGlzdGluZwotICAgIC8vICAgICAgICAgICAgICAgTWVkaWFCcm93c2VyIGFuZCBNZWRpYUJyb3dzZXJTZXJ2aWNlLgotICAgIHZvaWQgY29ubmVjdChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBjYWxsaW5nUGFja2FnZSk7Ci0gICAgdm9pZCByZWxlYXNlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcik7Ci0KLSAgICB2b2lkIHNldFZvbHVtZVRvKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IHZhbHVlLCBpbnQgZmxhZ3MpOwotICAgIHZvaWQgYWRqdXN0Vm9sdW1lKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IGRpcmVjdGlvbiwgaW50IGZsYWdzKTsKLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBzZW5kIGNvbW1hbmQKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgdm9pZCBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLAotICAgICAgICAgICAgaW50IGNvbW1hbmRDb2RlLCBpbiBCdW5kbGUgYXJncyk7Ci0gICAgdm9pZCBzZW5kQ3VzdG9tQ29tbWFuZChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGluIEJ1bmRsZSBjb21tYW5kLCBpbiBCdW5kbGUgYXJncywKLSAgICAgICAgICAgIGluIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKTsKLQotICAgIHZvaWQgcHJlcGFyZUZyb21VcmkoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbiBVcmkgdXJpLCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHByZXBhcmVGcm9tU2VhcmNoKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIHF1ZXJ5LCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHByZXBhcmVGcm9tTWVkaWFJZChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBtZWRpYUlkLCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHBsYXlGcm9tVXJpKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gVXJpIHVyaSwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBwbGF5RnJvbVNlYXJjaChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBxdWVyeSwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBwbGF5RnJvbU1lZGlhSWQoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgbWVkaWFJZCwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBzZXRSYXRpbmcoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgbWVkaWFJZCwgaW4gQnVuZGxlIHJhdGluZyk7Ci0KLSAgICB2b2lkIHNldFBsYXlsaXN0KElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gTGlzdDxCdW5kbGU+IHBsYXlsaXN0LCBpbiBCdW5kbGUgbWV0YWRhdGEpOwotICAgIHZvaWQgdXBkYXRlUGxheWxpc3RNZXRhZGF0YShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGluIEJ1bmRsZSBtZXRhZGF0YSk7Ci0gICAgdm9pZCBhZGRQbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgaW5kZXgsIGluIEJ1bmRsZSBtZWRpYUl0ZW0pOwotICAgIHZvaWQgcmVtb3ZlUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gQnVuZGxlIG1lZGlhSXRlbSk7Ci0gICAgdm9pZCByZXBsYWNlUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IGluZGV4LCBpbiBCdW5kbGUgbWVkaWFJdGVtKTsKLSAgICB2b2lkIHNraXBUb1BsYXlsaXN0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGluIEJ1bmRsZSBtZWRpYUl0ZW0pOwotICAgIHZvaWQgc2tpcFRvUHJldmlvdXNJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcik7Ci0gICAgdm9pZCBza2lwVG9OZXh0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIpOwotICAgIHZvaWQgc2V0UmVwZWF0TW9kZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCByZXBlYXRNb2RlKTsKLSAgICB2b2lkIHNldFNodWZmbGVNb2RlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IHNodWZmbGVNb2RlKTsKLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBsaWJyYXJ5IHNlcnZpY2Ugc3BlY2lmaWMKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgdm9pZCBnZXRMaWJyYXJ5Um9vdChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGluIEJ1bmRsZSByb290SGludHMpOwotICAgIHZvaWQgZ2V0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBtZWRpYUlkKTsKLSAgICB2b2lkIGdldENoaWxkcmVuKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIHBhcmVudElkLCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLAotICAgICAgICAgICAgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBzZWFyY2goSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcXVlcnksIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgZ2V0U2VhcmNoUmVzdWx0KElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIHF1ZXJ5LCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLAotICAgICAgICAgICAgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBzdWJzY3JpYmUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcGFyZW50SWQsIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgdW5zdWJzY3JpYmUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcGFyZW50SWQpOwotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUJyb3dzZXIySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUJyb3dzZXIySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTA5MDk5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFCcm93c2VyMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUJyb3dzZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFCcm93c2VyMi5Ccm93c2VyQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFCcm93c2VyMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi1wdWJsaWMgY2xhc3MgTWVkaWFCcm93c2VyMkltcGwgZXh0ZW5kcyBNZWRpYUNvbnRyb2xsZXIySW1wbCBpbXBsZW1lbnRzIE1lZGlhQnJvd3NlcjJQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhQnJvd3NlcjIiOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7IC8vIFRPRE8oamFld2FuKTogY2hhbmdlLgotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYUJyb3dzZXIyIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhQnJvd3NlcjIuQnJvd3NlckNhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHB1YmxpYyBNZWRpYUJyb3dzZXIySW1wbChDb250ZXh0IGNvbnRleHQsIE1lZGlhQnJvd3NlcjIgaW5zdGFuY2UsIFNlc3Npb25Ub2tlbjIgdG9rZW4sCi0gICAgICAgICAgICBFeGVjdXRvciBleGVjdXRvciwgQnJvd3NlckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGluc3RhbmNlLCB0b2tlbiwgZXhlY3V0b3IsIGNhbGxiYWNrKTsKLSAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLQotICAgIEBPdmVycmlkZSBNZWRpYUJyb3dzZXIyIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gKE1lZGlhQnJvd3NlcjIpIHN1cGVyLmdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZ2V0TGlicmFyeVJvb3RfaW1wbChCdW5kbGUgcm9vdEhpbnRzKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXIoKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5nZXRMaWJyYXJ5Um9vdChnZXRDb250cm9sbGVyU3R1YigpLCByb290SGludHMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3Vic2NyaWJlX2ltcGwoU3RyaW5nIHBhcmVudElkLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJlbnRJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcigpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnN1YnNjcmliZShnZXRDb250cm9sbGVyU3R1YigpLCBwYXJlbnRJZCwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgZGlzY29ubmVjdC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVuc3Vic2NyaWJlX2ltcGwoU3RyaW5nIHBhcmVudElkKSB7Ci0gICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJlbnRJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcigpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnVuc3Vic2NyaWJlKGdldENvbnRyb2xsZXJTdHViKCksIHBhcmVudElkKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgZGlzY29ubmVjdC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGdldEl0ZW1faW1wbChTdHJpbmcgbWVkaWFJZCkgewotICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZWRpYUlkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVyKCk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuZ2V0SXRlbShnZXRDb250cm9sbGVyU3R1YigpLCBtZWRpYUlkKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgZGlzY29ubmVjdC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGdldENoaWxkcmVuX2ltcGwoU3RyaW5nIHBhcmVudElkLCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJlbnRJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwYWdlIDwgMSB8fCBwYWdlU2l6ZSA8IDEpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk5laXRoZXIgcGFnZSBub3IgcGFnZVNpemUgc2hvdWxkIGJlIGxlc3MgdGhhbiAxIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVyKCk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuZ2V0Q2hpbGRyZW4oZ2V0Q29udHJvbGxlclN0dWIoKSwgcGFyZW50SWQsIHBhZ2UsIHBhZ2VTaXplLCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2VhcmNoX2ltcGwoU3RyaW5nIHF1ZXJ5LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInF1ZXJ5IHNob3VsZG4ndCBiZSBlbXB0eSIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXIoKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5zZWFyY2goZ2V0Q29udHJvbGxlclN0dWIoKSwgcXVlcnksIGV4dHJhcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlIGRpc2Nvbm5lY3QuCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBnZXRTZWFyY2hSZXN1bHRfaW1wbChTdHJpbmcgcXVlcnksIGludCBwYWdlLCBpbnQgcGFnZVNpemUsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicXVlcnkgc2hvdWxkbid0IGJlIGVtcHR5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhZ2UgPCAxIHx8IHBhZ2VTaXplIDwgMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTmVpdGhlciBwYWdlIG5vciBwYWdlU2l6ZSBzaG91bGQgYmUgbGVzcyB0aGFuIDEiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVyKCk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuZ2V0U2VhcmNoUmVzdWx0KGdldENvbnRyb2xsZXJTdHViKCksIHF1ZXJ5LCBwYWdlLCBwYWdlU2l6ZSwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgZGlzY29ubmVjdC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uR2V0TGlicmFyeVJvb3REb25lKAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIHJvb3RIaW50cywgZmluYWwgU3RyaW5nIHJvb3RNZWRpYUlkLCBmaW5hbCBCdW5kbGUgcm9vdEV4dHJhKSB7Ci0gICAgICAgIGdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkdldExpYnJhcnlSb290RG9uZShnZXRJbnN0YW5jZSgpLCByb290SGludHMsIHJvb3RNZWRpYUlkLCByb290RXh0cmEpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkdldEl0ZW1Eb25lKFN0cmluZyBtZWRpYUlkLCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uR2V0SXRlbURvbmUoZ2V0SW5zdGFuY2UoKSwgbWVkaWFJZCwgaXRlbSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uR2V0Q2hpbGRyZW5Eb25lKFN0cmluZyBwYXJlbnRJZCwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwgTGlzdDxNZWRpYUl0ZW0yPiByZXN1bHQsCi0gICAgICAgICAgICBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkdldENoaWxkcmVuRG9uZShnZXRJbnN0YW5jZSgpLCBwYXJlbnRJZCwgcGFnZSwgcGFnZVNpemUsIHJlc3VsdCwgZXh0cmFzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25TZWFyY2hSZXN1bHRDaGFuZ2VkKFN0cmluZyBxdWVyeSwgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBnZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25TZWFyY2hSZXN1bHRDaGFuZ2VkKGdldEluc3RhbmNlKCksIHF1ZXJ5LCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uR2V0U2VhcmNoUmVzdWx0RG9uZShTdHJpbmcgcXVlcnksIGludCBwYWdlLCBpbnQgcGFnZVNpemUsIExpc3Q8TWVkaWFJdGVtMj4gcmVzdWx0LAotICAgICAgICAgICAgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBnZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25HZXRTZWFyY2hSZXN1bHREb25lKGdldEluc3RhbmNlKCksIHF1ZXJ5LCBwYWdlLCBwYWdlU2l6ZSwgcmVzdWx0LCBleHRyYXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkNoaWxkcmVuQ2hhbmdlZChmaW5hbCBTdHJpbmcgcGFyZW50SWQsIGludCBpdGVtQ291bnQsIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uQ2hpbGRyZW5DaGFuZ2VkKGdldEluc3RhbmNlKCksIHBhcmVudElkLCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFDb250cm9sbGVyMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFDb250cm9sbGVyMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQ5MzY1YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQ29udHJvbGxlcjJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFVF9WT0xVTUU7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9BRERfSVRFTTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1JFTU9WRV9JVEVNOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfUkVQTEFDRV9JVEVNOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX0xJU1Q7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfTElTVF9NRVRBREFUQTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9SRVBFQVRfTU9ERTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9TSFVGRkxFX01PREU7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BMQVlfRlJPTV9NRURJQV9JRDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX1NFQVJDSDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX1VSSTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUFJFUEFSRV9GUk9NX01FRElBX0lEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fU0VBUkNIOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fVVJJOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5TZXJ2aWNlQ29ubmVjdGlvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyLkNvbnRyb2xsZXJDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjIuUGxheWJhY2tJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50LlJlcGVhdE1vZGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQuU2h1ZmZsZU1vZGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbW1hbmRCdXR0b247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZEdyb3VwMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuUmF0aW5nMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFDb250cm9sbGVyMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Vc2VySGFuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLkd1YXJkZWRCeTsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi1wdWJsaWMgY2xhc3MgTWVkaWFDb250cm9sbGVyMkltcGwgaW1wbGVtZW50cyBNZWRpYUNvbnRyb2xsZXIyUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFDb250cm9sbGVyMiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7IC8vIFRPRE8oamFld2FuKTogQ2hhbmdlCi0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhQ29udHJvbGxlcjIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFDb250cm9sbGVyMlN0dWIgbUNvbnRyb2xsZXJTdHViOwotICAgIHByaXZhdGUgZmluYWwgU2Vzc2lvblRva2VuMiBtVG9rZW47Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250cm9sbGVyQ2FsbGJhY2sgbUNhbGxiYWNrOwotICAgIHByaXZhdGUgZmluYWwgRXhlY3V0b3IgbUNhbGxiYWNrRXhlY3V0b3I7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJQmluZGVyLkRlYXRoUmVjaXBpZW50IG1EZWF0aFJlY2lwaWVudDsKLQotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIFNlc3Npb25TZXJ2aWNlQ29ubmVjdGlvbiBtU2VydmljZUNvbm5lY3Rpb247Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNSZWxlYXNlZDsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBMaXN0PE1lZGlhSXRlbTI+IG1QbGF5bGlzdDsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBNZWRpYU1ldGFkYXRhMiBtUGxheWxpc3RNZXRhZGF0YTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBAUmVwZWF0TW9kZSBpbnQgbVJlcGVhdE1vZGU7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgQFNodWZmbGVNb2RlIGludCBtU2h1ZmZsZU1vZGU7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgaW50IG1QbGF5ZXJTdGF0ZTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBsb25nIG1Qb3NpdGlvbkV2ZW50VGltZU1zOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGxvbmcgbVBvc2l0aW9uTXM7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgZmxvYXQgbVBsYXliYWNrU3BlZWQ7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgbG9uZyBtQnVmZmVyZWRQb3NpdGlvbk1zOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIFBsYXliYWNrSW5mbyBtUGxheWJhY2tJbmZvOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIFBlbmRpbmdJbnRlbnQgbVNlc3Npb25BY3Rpdml0eTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBTZXNzaW9uQ29tbWFuZEdyb3VwMiBtQWxsb3dlZENvbW1hbmRzOwotCi0gICAgLy8gQXNzaWdubWVudCBzaG91bGQgYmUgdXNlZCB3aXRoIHRoZSBsb2NrIGhvbGQsIGJ1dCBzaG91bGQgYmUgdXNlZCB3aXRob3V0IGEgbG9jayB0byBwcmV2ZW50Ci0gICAgLy8gcG90ZW50aWFsIGRlYWRsb2NrLgotICAgIC8vIFBvc3RmaXggLUJpbmRlciBpcyBhZGRlZCB0byBleHBsaWNpdGx5IHNob3cgdGhhdCBpdCdzIHBvdGVudGlhbGx5IHJlbW90ZSBwcm9jZXNzIGNhbGwuCi0gICAgLy8gVGVjaG5pY2FsbHkgLUludGVyZmFjZSBpcyBtb3JlIGNvcnJlY3QsIGJ1dCBpdCBtYXkgbWlzcmVhZCB0aGF0IGl0J3MgaW50ZXJmYWNlICh2cyBjbGFzcykKLSAgICAvLyBzbyBsZXQncyBrZWVwIHRoaXMgcG9zdGZpeCB1bnRpbCB3ZSBmaW5kIGJldHRlciBwb3N0Zml4LgotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIHZvbGF0aWxlIElNZWRpYVNlc3Npb24yIG1TZXNzaW9uQmluZGVyOwotCi0gICAgLy8gVE9ETyhqYWV3YW4pOiBSZXF1aXJlIHNlc3Npb24gYWN0aXZlbmVzcyBjaGFuZ2VkIGxpc3RlbmVyLCBiZWNhdXNlIGNvbnRyb2xsZXIgY2FuIGJlCi0gICAgLy8gICAgICAgICAgICAgICBhdmFpbGFibGUgd2hlbiB0aGUgc2Vzc2lvbidzIHBsYXllciBpcyBudWxsLgotICAgIHB1YmxpYyBNZWRpYUNvbnRyb2xsZXIySW1wbChDb250ZXh0IGNvbnRleHQsIE1lZGlhQ29udHJvbGxlcjIgaW5zdGFuY2UsIFNlc3Npb25Ub2tlbjIgdG9rZW4sCi0gICAgICAgICAgICBFeGVjdXRvciBleGVjdXRvciwgQ29udHJvbGxlckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZXh0IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHRva2VuID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInRva2VuIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV4ZWN1dG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImV4ZWN1dG9yIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtQ29udHJvbGxlclN0dWIgPSBuZXcgTWVkaWFDb250cm9sbGVyMlN0dWIodGhpcyk7Ci0gICAgICAgIG1Ub2tlbiA9IHRva2VuOwotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IgPSBleGVjdXRvcjsKLSAgICAgICAgbURlYXRoUmVjaXBpZW50ID0gKCkgLT4gewotICAgICAgICAgICAgbUluc3RhbmNlLmNsb3NlKCk7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgbVNlc3Npb25CaW5kZXIgPSBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoKSB7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogTW9yZSBzYW5pdHkgY2hlY2tzLgotICAgICAgICBpZiAobVRva2VuLmdldFR5cGUoKSA9PSBTZXNzaW9uVG9rZW4yLlRZUEVfU0VTU0lPTikgewotICAgICAgICAgICAgLy8gU2Vzc2lvbgotICAgICAgICAgICAgbVNlcnZpY2VDb25uZWN0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIGNvbm5lY3RUb1Nlc3Npb24oU2Vzc2lvblRva2VuMkltcGwuZnJvbShtVG9rZW4pLmdldFNlc3Npb25CaW5kZXIoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBTZXNzaW9uIHNlcnZpY2UKLSAgICAgICAgICAgIGlmIChQcm9jZXNzLm15VWlkKCkgPT0gUHJvY2Vzcy5TWVNURU1fVUlEKSB7Ci0gICAgICAgICAgICAgICAgLy8gSXQncyBzeXN0ZW0gc2VydmVyIChNZWRpYVNlc3Npb25TZXJ2aWNlKSB0aGF0IHdhbnRzIHRvIG1vbml0b3Igc2Vzc2lvbi4KLSAgICAgICAgICAgICAgICAvLyBEb24ndCBiaW5kIGlmIGFibGUuLgotICAgICAgICAgICAgICAgIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IFNlc3Npb25Ub2tlbjJJbXBsLmZyb20obVRva2VuKS5nZXRTZXNzaW9uQmluZGVyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFVzZSBiaW5kZXIgaW4gdGhlIHNlc3Npb24gdG9rZW4gaW5zdGVhZCBvZiBiaW5kIGJ5IGl0cyBvd24uCi0gICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBzZXJ2ZXIgd2lsbCBob2xkcyB0aGUgYmluZGluZyB0byB0aGUgc2VydmljZSAqZm9yZXZlciogYW5kIHNlcnZpY2UKLSAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBuZXZlciBzdG9wLgotICAgICAgICAgICAgICAgICAgICBtU2VydmljZUNvbm5lY3Rpb24gPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBjb25uZWN0VG9TZXNzaW9uKFNlc3Npb25Ub2tlbjJJbXBsLmZyb20obVRva2VuKS5nZXRTZXNzaW9uQmluZGVyKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAvLyBTaG91bGQgaGFwcGVuIG9ubHkgd2hlbiBzeXN0ZW0gc2VydmVyIHdhbnRzIHRvIGRpc3BhdGNoIG1lZGlhIGtleSBldmVudHMgdG8KLSAgICAgICAgICAgICAgICAgICAgLy8gYSBkZWFkIHNlcnZpY2UuCi0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlN5c3RlbSBzZXJ2ZXIgYmluZHMgdG8gYSBzZXNzaW9uIHNlcnZpY2UuIFNob3VsZCB1bmJpbmQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSB1c2UuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNlcnZpY2VDb25uZWN0aW9uID0gbmV3IFNlc3Npb25TZXJ2aWNlQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgY29ubmVjdFRvU2VydmljZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbm5lY3RUb1NlcnZpY2UoKSB7Ci0gICAgICAgIC8vIFNlcnZpY2UuIE5lZWRzIHRvIGdldCBmcmVzaCBiaW5kZXIgd2hlbmV2ZXIgY29ubmVjdGlvbiBpcyBuZWVkZWQuCi0gICAgICAgIFNlc3Npb25Ub2tlbjJJbXBsIGltcGwgPSBTZXNzaW9uVG9rZW4ySW1wbC5mcm9tKG1Ub2tlbik7Ci0gICAgICAgIGZpbmFsIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhU2Vzc2lvblNlcnZpY2UyLlNFUlZJQ0VfSU5URVJGQUNFKTsKLSAgICAgICAgaW50ZW50LnNldENsYXNzTmFtZShtVG9rZW4uZ2V0UGFja2FnZU5hbWUoKSwgaW1wbC5nZXRTZXJ2aWNlTmFtZSgpKTsKLQotICAgICAgICAvLyBVc2UgYmluZFNlcnZpY2UoKSBpbnN0ZWFkIG9mIHN0YXJ0Rm9yZWdyb3VuZFNlcnZpY2UoKSB0byBzdGFydCBzZXNzaW9uIHNlcnZpY2UgZm9yIHRocmVlCi0gICAgICAgIC8vIHJlYXNvbnMuCi0gICAgICAgIC8vIDEuIFByZXZlbnQgc2Vzc2lvbiBzZXJ2aWNlIG93bmVyJ3Mgc3RvcFNlbGYoKSBmcm9tIGRlc3Ryb3lpbmcgc2VydmljZS4KLSAgICAgICAgLy8gICAgV2l0aCB0aGUgc3RhcnRGb3JlZ3JvdW5kU2VydmljZSgpLCBzZXJ2aWNlJ3MgY2FsbCBvZiBzdG9wU2VsZigpIHdpbGwgdHJpZ2dlciBpbW1lZGlhdGUKLSAgICAgICAgLy8gICAgb25EZXN0cm95KCkgY2FsbHMgb24gdGhlIG1haW4gdGhyZWFkIGV2ZW4gd2hlbiBvbkNvbm5lY3QoKSBpcyBydW5uaW5nIGluIGFub3RoZXIKLSAgICAgICAgLy8gICAgdGhyZWFkLgotICAgICAgICAvLyAyLiBNaW5pbWl6ZSBBUElzIGZvciBkZXZlbG9wZXJzIHRvIHRha2UgY2FyZSBhYm91dC4KLSAgICAgICAgLy8gICAgV2l0aCBiaW5kU2VydmljZSgpLCBkZXZlbG9wZXJzIG9ubHkgbmVlZCB0byB0YWtlIGNhcmUgYWJvdXQgU2VydmljZS5vbkJpbmQoKQotICAgICAgICAvLyAgICBidXQgU2VydmljZS5vblN0YXJ0Q29tbWFuZCgpIHNob3VsZCBiZSBhbHNvIHRha2VuIGNhcmUgYWJvdXQgd2l0aCB0aGUKLSAgICAgICAgLy8gICAgc3RhcnRGb3JlZ3JvdW5kU2VydmljZSgpLgotICAgICAgICAvLyAzLiBGdXR1cmUgc3VwcG9ydCBmb3IgVUktbGVzcyBwbGF5YmFjawotICAgICAgICAvLyAgICBJZiBhIHNlcnZpY2Ugd2FudHMgdG8ga2VlcCBydW5uaW5nLCBpdCBzaG91bGQgYmUgZWl0aGVyIGZvcmVncm91bmQgc2VydmljZSBvcgotICAgICAgICAvLyAgICBib3VuZGVkIHNlcnZpY2UuIEJ1dCB0aGVyZSBoYWQgYmVlbiByZXF1ZXN0IGZvciB0aGUgZmVhdHVyZSBmb3Igc3lzdGVtIGFwcHMKLSAgICAgICAgLy8gICAgYW5kIHVzaW5nIGJpbmRTZXJ2aWNlKCkgd2lsbCBiZSBiZXR0ZXIgZml0IHdpdGggaXQuCi0gICAgICAgIGJvb2xlYW4gcmVzdWx0OwotICAgICAgICBpZiAoUHJvY2Vzcy5teVVpZCgpID09IFByb2Nlc3MuU1lTVEVNX1VJRCkgewotICAgICAgICAgICAgLy8gVXNlIGJpbmRTZXJ2aWNlQXNVc2VyKCkgZm9yIGJpbmRpbmcgZnJvbSBzeXN0ZW0gc2VydmljZSB0byBhdm9pZCBmb2xsb3dpbmcgd2FybmluZy4KLSAgICAgICAgICAgIC8vIENvbnRleHRJbXBsOiBDYWxsaW5nIGEgbWV0aG9kIGluIHRoZSBzeXN0ZW0gcHJvY2VzcyB3aXRob3V0IGEgcXVhbGlmaWVkIHVzZXIKLSAgICAgICAgICAgIHJlc3VsdCA9IG1Db250ZXh0LmJpbmRTZXJ2aWNlQXNVc2VyKGludGVudCwgbVNlcnZpY2VDb25uZWN0aW9uLCBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUsCi0gICAgICAgICAgICAgICAgICAgIFVzZXJIYW5kbGUuZ2V0VXNlckhhbmRsZUZvclVpZChtVG9rZW4uZ2V0VWlkKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG1Db250ZXh0LmJpbmRTZXJ2aWNlKGludGVudCwgbVNlcnZpY2VDb25uZWN0aW9uLCBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcmVzdWx0KSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJiaW5kIHRvICIgKyBtVG9rZW4gKyAiIGZhaWxlZCIpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJiaW5kIHRvICIgKyBtVG9rZW4gKyAiIHN1Y2Nlc3MiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjb25uZWN0VG9TZXNzaW9uKElNZWRpYVNlc3Npb24yIHNlc3Npb25CaW5kZXIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHNlc3Npb25CaW5kZXIuY29ubmVjdChtQ29udHJvbGxlclN0dWIsIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIGNhbGwgY29ubmVjdGlvbiByZXF1ZXN0LiBGcmFtZXdvcmsgd2lsbCByZXRyeSIKLSAgICAgICAgICAgICAgICAgICAgKyAiIGF1dG9tYXRpY2FsbHkiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNsb3NlX2ltcGwoKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVsZWFzZSBmcm9tICIgKyBtVG9rZW4pOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlcjsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKG1Jc1JlbGVhc2VkKSB7Ci0gICAgICAgICAgICAgICAgLy8gUHJldmVudCByZS1lbnRlcmFuY2UgZnJvbSB0aGUgQ29udHJvbGxlckNhbGxiYWNrLm9uRGlzY29ubmVjdGVkKCkKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtSXNSZWxlYXNlZCA9IHRydWU7Ci0gICAgICAgICAgICBpZiAobVNlcnZpY2VDb25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ29udGV4dC51bmJpbmRTZXJ2aWNlKG1TZXJ2aWNlQ29ubmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2VDb25uZWN0aW9uID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOwotICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIgPSBudWxsOwotICAgICAgICAgICAgbUNvbnRyb2xsZXJTdHViLmRlc3Ryb3koKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLmFzQmluZGVyKCkudW5saW5rVG9EZWF0aChtRGVhdGhSZWNpcGllbnQsIDApOwotICAgICAgICAgICAgICAgIGJpbmRlci5yZWxlYXNlKG1Db250cm9sbGVyU3R1Yik7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIE5vLW9wLgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uRGlzY29ubmVjdGVkKG1JbnN0YW5jZSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIElNZWRpYVNlc3Npb24yIGdldFNlc3Npb25CaW5kZXIoKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbkJpbmRlcjsKLSAgICB9Ci0KLSAgICBNZWRpYUNvbnRyb2xsZXIyU3R1YiBnZXRDb250cm9sbGVyU3R1YigpIHsKLSAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyU3R1YjsKLSAgICB9Ci0KLSAgICBFeGVjdXRvciBnZXRDYWxsYmFja0V4ZWN1dG9yKCkgewotICAgICAgICByZXR1cm4gbUNhbGxiYWNrRXhlY3V0b3I7Ci0gICAgfQotCi0gICAgQ29udGV4dCBnZXRDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gbUNvbnRleHQ7Ci0gICAgfQotCi0gICAgTWVkaWFDb250cm9sbGVyMiBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm5zIHNlc3Npb24gYmluZGVyIGlmIHRoZSBjb250cm9sbGVyIGNhbiBzZW5kIHRoZSBjb21tYW5kLgotICAgIElNZWRpYVNlc3Npb24yIGdldFNlc3Npb25CaW5kZXJJZkFibGUoaW50IGNvbW1hbmRDb2RlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmICghbUFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKGNvbW1hbmRDb2RlKSkgewotICAgICAgICAgICAgICAgIC8vIENhbm5vdCBzZW5kIGJlY2F1c2UgaXNuJ3QgYWxsb3dlZCB0by4KLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb250cm9sbGVyIGlzbid0IGFsbG93ZWQgdG8gY2FsbCBjb21tYW5kLCBjb21tYW5kQ29kZT0iCi0gICAgICAgICAgICAgICAgICAgICAgICArIGNvbW1hbmRDb2RlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPKGphZXdhbik6IFNob3VsZCB3ZSBkbyB0aGlzIHdpdGggdGhlIGxvY2sgaG9sZD8KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgIGlmIChiaW5kZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gQ2Fubm90IHNlbmQgYmVjYXVzZSBkaXNjb25uZWN0ZWQuCi0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzIGRpc2Nvbm5lY3RlZCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiaW5kZXI7Ci0gICAgfQotCi0gICAgLy8gUmV0dXJucyBzZXNzaW9uIGJpbmRlciBpZiB0aGUgY29udHJvbGxlciBjYW4gc2VuZCB0aGUgY29tbWFuZC4KLSAgICBJTWVkaWFTZXNzaW9uMiBnZXRTZXNzaW9uQmluZGVySWZBYmxlKFNlc3Npb25Db21tYW5kMiBjb21tYW5kKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmICghbUFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKGNvbW1hbmQpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ29udHJvbGxlciBpc24ndCBhbGxvd2VkIHRvIGNhbGwgY29tbWFuZCwgY29tbWFuZD0iICsgY29tbWFuZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBTaG91bGQgd2UgZG8gdGhpcyB3aXRoIHRoZSBsb2NrIGhvbGQ/Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOwotICAgICAgICBpZiAoYmluZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIENhbm5vdCBzZW5kIGJlY2F1c2UgZGlzY29ubmVjdGVkLgotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpcyBkaXNjb25uZWN0ZWQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYmluZGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4yIGdldFNlc3Npb25Ub2tlbl9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVRva2VuOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGVkX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOwotICAgICAgICByZXR1cm4gYmluZGVyICE9IG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGxheV9pbXBsKCkgewotICAgICAgICBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19QTEFZKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwYXVzZV9pbXBsKCkgewotICAgICAgICBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19QQVVTRSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RvcF9pbXBsKCkgewotICAgICAgICBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19TVE9QKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QbGF5bGlzdEl0ZW1faW1wbChNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNraXBUb1BsYXlsaXN0SXRlbShtQ29udHJvbGxlclN0dWIsIGl0ZW0udG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNraXBUb1ByZXZpb3VzSXRlbV9pbXBsKCkgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5za2lwVG9QcmV2aW91c0l0ZW0obUNvbnRyb2xsZXJTdHViKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvTmV4dEl0ZW1faW1wbCgpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc2tpcFRvTmV4dEl0ZW0obUNvbnRyb2xsZXJTdHViKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChpbnQgY29tbWFuZENvZGUpIHsKLSAgICAgICAgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKGNvbW1hbmRDb2RlLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKGludCBjb21tYW5kQ29kZSwgQnVuZGxlIGFyZ3MpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKG1Db250cm9sbGVyU3R1YiwgY29tbWFuZENvZGUsIGFyZ3MpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUGVuZGluZ0ludGVudCBnZXRTZXNzaW9uQWN0aXZpdHlfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9uQWN0aXZpdHk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Vm9sdW1lVG9faW1wbChpbnQgdmFsdWUsIGludCBmbGFncykgewotICAgICAgICAvLyBUT0RPKGhkbW9vbik6IHNhbml0eSBjaGVjawotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9TRVRfVk9MVU1FKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5zZXRWb2x1bWVUbyhtQ29udHJvbGxlclN0dWIsIHZhbHVlLCBmbGFncyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkanVzdFZvbHVtZV9pbXBsKGludCBkaXJlY3Rpb24sIGludCBmbGFncykgewotICAgICAgICAvLyBUT0RPKGhkbW9vbik6IHNhbml0eSBjaGVjawotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9TRVRfVk9MVU1FKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5hZGp1c3RWb2x1bWUobUNvbnRyb2xsZXJTdHViLCBkaXJlY3Rpb24sIGZsYWdzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZUZyb21VcmlfaW1wbChVcmkgdXJpLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1NFU1NJT05fUFJFUEFSRV9GUk9NX1VSSSk7Ci0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidXJpIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5wcmVwYXJlRnJvbVVyaShtQ29udHJvbGxlclN0dWIsIHVyaSwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlRnJvbVNlYXJjaF9pbXBsKFN0cmluZyBxdWVyeSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKAotICAgICAgICAgICAgICAgIENPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9TRUFSQ0gpOwotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWVyeSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnByZXBhcmVGcm9tU2VhcmNoKG1Db250cm9sbGVyU3R1YiwgcXVlcnksIGV4dHJhcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZUZyb21NZWRpYUlkX2ltcGwoU3RyaW5nIG1lZGlhSWQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZSgKLSAgICAgICAgICAgICAgICBDT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fTUVESUFfSUQpOwotICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZWRpYUlkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5wcmVwYXJlRnJvbU1lZGlhSWQobUNvbnRyb2xsZXJTdHViLCBtZWRpYUlkLCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZS4KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tVXJpX2ltcGwoVXJpIHVyaSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9TRVNTSU9OX1BMQVlfRlJPTV9VUkkpOwotICAgICAgICBpZiAodXJpID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInVyaSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIucGxheUZyb21VcmkobUNvbnRyb2xsZXJTdHViLCB1cmksIGV4dHJhcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGxheUZyb21TZWFyY2hfaW1wbChTdHJpbmcgcXVlcnksIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fU0VBUkNIKTsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicXVlcnkgc2hvdWxkbid0IGJlIGVtcHR5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5wbGF5RnJvbVNlYXJjaChtQ29udHJvbGxlclN0dWIsIHF1ZXJ5LCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZS4KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tTWVkaWFJZF9pbXBsKFN0cmluZyBtZWRpYUlkLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoCi0gICAgICAgICAgICAgICAgQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX01FRElBX0lEKTsKLSAgICAgICAgaWYgKG1lZGlhSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWVkaWFJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIucGxheUZyb21NZWRpYUlkKG1Db250cm9sbGVyU3R1YiwgbWVkaWFJZCwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRSYXRpbmdfaW1wbChTdHJpbmcgbWVkaWFJZCwgUmF0aW5nMiByYXRpbmcpIHsKLSAgICAgICAgaWYgKG1lZGlhSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWVkaWFJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyYXRpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicmF0aW5nIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5zZXRSYXRpbmcobUNvbnRyb2xsZXJTdHViLCBtZWRpYUlkLCByYXRpbmcudG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2VuZEN1c3RvbUNvbW1hbmRfaW1wbChTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCwgQnVuZGxlIGFyZ3MsIFJlc3VsdFJlY2VpdmVyIGNiKSB7Ci0gICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKGNvbW1hbmQpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNlbmRDdXN0b21Db21tYW5kKG1Db250cm9sbGVyU3R1YiwgY29tbWFuZC50b0J1bmRsZSgpLCBhcmdzLCBjYik7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PE1lZGlhSXRlbTI+IGdldFBsYXlsaXN0X2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWxpc3Q7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdF9pbXBsKExpc3Q8TWVkaWFJdGVtMj4gbGlzdCwgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGlzdCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9MSVNUKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0PEJ1bmRsZT4gYnVuZGxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgYnVuZGxlTGlzdC5hZGQobGlzdC5nZXQoaSkudG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCdW5kbGUgbWV0YWRhdGFCdW5kbGUgPSAobWV0YWRhdGEgPT0gbnVsbCkgPyBudWxsIDogbWV0YWRhdGEudG9CdW5kbGUoKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNldFBsYXlsaXN0KG1Db250cm9sbGVyU3R1YiwgYnVuZGxlTGlzdCwgbWV0YWRhdGFCdW5kbGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTIgZ2V0UGxheWxpc3RNZXRhZGF0YV9pbXBsKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXlsaXN0TWV0YWRhdGE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5bGlzdE1ldGFkYXRhX2ltcGwoTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZSgKLSAgICAgICAgICAgICAgICBDT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX0xJU1RfTUVUQURBVEEpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBtZXRhZGF0YUJ1bmRsZSA9IChtZXRhZGF0YSA9PSBudWxsKSA/IG51bGwgOiBtZXRhZGF0YS50b0J1bmRsZSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIudXBkYXRlUGxheWxpc3RNZXRhZGF0YShtQ29udHJvbGxlclN0dWIsIG1ldGFkYXRhQnVuZGxlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZV9pbXBsKCkgewotICAgICAgICBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19QUkVQQVJFKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBmYXN0Rm9yd2FyZF9pbXBsKCkgewotICAgICAgICAvLyBUT0RPKGphZXdhbik6IEltcGxlbWVudCB0aGlzLiBOb3RlIHRoYXQgZmFzdCBmb3J3YXJkIGlzbid0IGEgdHJhbnNwb3J0IGNvbW1hbmQgYW55bW9yZQotICAgICAgICAvL3NlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChNZWRpYVNlc3Npb24yLkNPTU1BTkRfQ09ERV9TRVNTSU9OX0ZBU1RfRk9SV0FSRCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmV3aW5kX2ltcGwoKSB7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogSW1wbGVtZW50IHRoaXMuIE5vdGUgdGhhdCByZXdpbmQgaXNuJ3QgYSB0cmFuc3BvcnQgY29tbWFuZCBhbnltb3JlCi0gICAgICAgIC8vc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKE1lZGlhU2Vzc2lvbjIuQ09NTUFORF9DT0RFX1NFU1NJT05fUkVXSU5EKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZWVrVG9faW1wbChsb25nIHBvcykgewotICAgICAgICBpZiAocG9zIDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicG9zaXRpb24gc2hvdWxkbid0IGJlIG5lZ2F0aXZlIik7Ci0gICAgICAgIH0KLSAgICAgICAgQnVuZGxlIGFyZ3MgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIGFyZ3MucHV0TG9uZyhNZWRpYVNlc3Npb24yU3R1Yi5BUkdVTUVOVF9LRVlfUE9TSVRJT04sIHBvcyk7Ci0gICAgICAgIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1NFRUtfVE8sIGFyZ3MpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZFBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluZGV4IHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9QTEFZTElTVF9BRERfSVRFTSk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuYWRkUGxheWxpc3RJdGVtKG1Db250cm9sbGVyU3R1YiwgaW5kZXgsIGl0ZW0udG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBsYXlsaXN0SXRlbV9pbXBsKE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfUExBWUxJU1RfUkVNT1ZFX0lURU0pOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnJlbW92ZVBsYXlsaXN0SXRlbShtQ29udHJvbGxlclN0dWIsIGl0ZW0udG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VQbGF5bGlzdEl0ZW1faW1wbChpbnQgaW5kZXgsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbmRleCBzaG91bGRuJ3QgYmUgbmVnYXRpdmUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfUExBWUxJU1RfUkVQTEFDRV9JVEVNKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5yZXBsYWNlUGxheWxpc3RJdGVtKG1Db250cm9sbGVyU3R1YiwgaW5kZXgsIGl0ZW0udG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0U2h1ZmZsZU1vZGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1TaHVmZmxlTW9kZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTaHVmZmxlTW9kZV9pbXBsKGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKAotICAgICAgICAgICAgICAgIENPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfU0hVRkZMRV9NT0RFKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5zZXRTaHVmZmxlTW9kZShtQ29udHJvbGxlclN0dWIsIHNodWZmbGVNb2RlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRSZXBlYXRNb2RlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtUmVwZWF0TW9kZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRNb2RlX2ltcGwoaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX1JFUEVBVF9NT0RFKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5zZXRSZXBlYXRNb2RlKG1Db250cm9sbGVyU3R1YiwgcmVwZWF0TW9kZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBQbGF5YmFja0luZm8gZ2V0UGxheWJhY2tJbmZvX2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWJhY2tJbmZvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRQbGF5ZXJTdGF0ZV9pbXBsKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXllclN0YXRlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0Q3VycmVudFBvc2l0aW9uX2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGxvbmcgdGltZURpZmYgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSAtIG1Qb3NpdGlvbkV2ZW50VGltZU1zOwotICAgICAgICAgICAgbG9uZyBleHBlY3RlZFBvc2l0aW9uID0gbVBvc2l0aW9uTXMgKyAobG9uZykgKG1QbGF5YmFja1NwZWVkICogdGltZURpZmYpOwotICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIGV4cGVjdGVkUG9zaXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZsb2F0IGdldFBsYXliYWNrU3BlZWRfaW1wbCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5YmFja1NwZWVkOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0QnVmZmVyZWRQb3NpdGlvbl9pbXBsKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUJ1ZmZlcmVkUG9zaXRpb25NczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUl0ZW0yIGdldEN1cnJlbnRNZWRpYUl0ZW1faW1wbCgpIHsKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBJbXBsZW1lbnQKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoUGxheWVyU3RhdGVDaGFuZ2VzKGZpbmFsIGludCBzdGF0ZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtUGxheWVyU3RhdGUgPSBzdGF0ZTsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5ZXJTdGF0ZUNoYW5nZWQobUluc3RhbmNlLCBzdGF0ZSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vIFRPRE8oamFld2FuKTogUmVuYW1lIHRvIHNlZWsgY29tcGxldGVkCi0gICAgdm9pZCBwdXNoUG9zaXRpb25DaGFuZ2VzKGZpbmFsIGxvbmcgZXZlbnRUaW1lTXMsIGZpbmFsIGxvbmcgcG9zaXRpb25NcykgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtUG9zaXRpb25FdmVudFRpbWVNcyA9IGV2ZW50VGltZU1zOwotICAgICAgICAgICAgbVBvc2l0aW9uTXMgPSBwb3NpdGlvbk1zOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblNlZWtDb21wbGV0ZWQobUluc3RhbmNlLCBwb3NpdGlvbk1zKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoUGxheWJhY2tTcGVlZENoYW5nZXMoZmluYWwgZmxvYXQgc3BlZWQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbVBsYXliYWNrU3BlZWQgPSBzcGVlZDsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5YmFja1NwZWVkQ2hhbmdlZChtSW5zdGFuY2UsIHNwZWVkKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoQnVmZmVyZWRQb3NpdGlvbkNoYW5nZXMoZmluYWwgbG9uZyBidWZmZXJlZFBvc2l0aW9uTXMpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbUJ1ZmZlcmVkUG9zaXRpb25NcyA9IGJ1ZmZlcmVkUG9zaXRpb25NczsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEZpeCB0aGlzIC0tIGl0J3Mgbm93IGJ1ZmZlcmVkIHN0YXRlCi0gICAgICAgICAgICAvL21DYWxsYmFjay5vbkJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VkKG1JbnN0YW5jZSwgYnVmZmVyZWRQb3NpdGlvbk1zKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoUGxheWJhY2tJbmZvQ2hhbmdlcyhmaW5hbCBQbGF5YmFja0luZm8gaW5mbykgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtUGxheWJhY2tJbmZvID0gaW5mbzsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5YmFja0luZm9DaGFuZ2VkKG1JbnN0YW5jZSwgaW5mbyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgcHVzaFBsYXlsaXN0Q2hhbmdlcyhmaW5hbCBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0LCBmaW5hbCBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtUGxheWxpc3QgPSBwbGF5bGlzdDsKLSAgICAgICAgICAgIG1QbGF5bGlzdE1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoIW1JbnN0YW5jZS5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkKG1JbnN0YW5jZSwgcGxheWxpc3QsIG1ldGFkYXRhKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoUGxheWxpc3RNZXRhZGF0YUNoYW5nZXMoTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbVBsYXlsaXN0TWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZChtSW5zdGFuY2UsIG1ldGFkYXRhKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoU2h1ZmZsZU1vZGVDaGFuZ2VzKGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtU2h1ZmZsZU1vZGUgPSBzaHVmZmxlTW9kZTsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25TaHVmZmxlTW9kZUNoYW5nZWQobUluc3RhbmNlLCBzaHVmZmxlTW9kZSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgcHVzaFJlcGVhdE1vZGVDaGFuZ2VzKGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1SZXBlYXRNb2RlID0gcmVwZWF0TW9kZTsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZChtSW5zdGFuY2UsIHJlcGVhdE1vZGUpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hFcnJvcihpbnQgZXJyb3JDb2RlLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkVycm9yKG1JbnN0YW5jZSwgZXJyb3JDb2RlLCBleHRyYXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvLyBTaG91bGQgYmUgdXNlZCB3aXRob3V0IGEgbG9jayB0byBwcmV2ZW50IHBvdGVudGlhbCBkZWFkbG9jay4KLSAgICB2b2lkIG9uQ29ubmVjdGVkTm90TG9ja2VkKElNZWRpYVNlc3Npb24yIHNlc3Npb25CaW5kZXIsCi0gICAgICAgICAgICBmaW5hbCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBhbGxvd2VkQ29tbWFuZHMsCi0gICAgICAgICAgICBmaW5hbCBpbnQgcGxheWVyU3RhdGUsCi0gICAgICAgICAgICBmaW5hbCBsb25nIHBvc2l0aW9uRXZlbnRUaW1lTXMsCi0gICAgICAgICAgICBmaW5hbCBsb25nIHBvc2l0aW9uTXMsCi0gICAgICAgICAgICBmaW5hbCBmbG9hdCBwbGF5YmFja1NwZWVkLAotICAgICAgICAgICAgZmluYWwgbG9uZyBidWZmZXJlZFBvc2l0aW9uTXMsCi0gICAgICAgICAgICBmaW5hbCBQbGF5YmFja0luZm8gaW5mbywKLSAgICAgICAgICAgIGZpbmFsIGludCByZXBlYXRNb2RlLAotICAgICAgICAgICAgZmluYWwgaW50IHNodWZmbGVNb2RlLAotICAgICAgICAgICAgZmluYWwgTGlzdDxNZWRpYUl0ZW0yPiBwbGF5bGlzdCwKLSAgICAgICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5KSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25Db25uZWN0ZWROb3RMb2NrZWQgc2Vzc2lvbkJpbmRlcj0iICsgc2Vzc2lvbkJpbmRlcgotICAgICAgICAgICAgICAgICAgICArICIsIGFsbG93ZWRDb21tYW5kcz0iICsgYWxsb3dlZENvbW1hbmRzKTsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIGNsb3NlID0gZmFsc2U7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbkJpbmRlciA9PSBudWxsIHx8IGFsbG93ZWRDb21tYW5kcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ29ubmVjdGlvbiByZWplY3RlZC4KLSAgICAgICAgICAgICAgICBjbG9zZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgICAgIGlmIChtSXNSZWxlYXNlZCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtU2Vzc2lvbkJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNhbm5vdCBiZSBub3RpZmllZCBhYm91dCB0aGUgY29ubmVjdGlvbiByZXN1bHQgbWFueSB0aW1lcy4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIFByb2JhYmx5IGEgYnVnIG9yIG1hbGljaW91cyBhcHAuIik7Ci0gICAgICAgICAgICAgICAgICAgIGNsb3NlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQWxsb3dlZENvbW1hbmRzID0gYWxsb3dlZENvbW1hbmRzOwotICAgICAgICAgICAgICAgIG1QbGF5ZXJTdGF0ZSA9IHBsYXllclN0YXRlOwotICAgICAgICAgICAgICAgIG1Qb3NpdGlvbkV2ZW50VGltZU1zID0gcG9zaXRpb25FdmVudFRpbWVNczsKLSAgICAgICAgICAgICAgICBtUG9zaXRpb25NcyA9IHBvc2l0aW9uTXM7Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrU3BlZWQgPSBwbGF5YmFja1NwZWVkOwotICAgICAgICAgICAgICAgIG1CdWZmZXJlZFBvc2l0aW9uTXMgPSBidWZmZXJlZFBvc2l0aW9uTXM7Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mbyA9IGluZm87Ci0gICAgICAgICAgICAgICAgbVJlcGVhdE1vZGUgPSByZXBlYXRNb2RlOwotICAgICAgICAgICAgICAgIG1TaHVmZmxlTW9kZSA9IHNodWZmbGVNb2RlOwotICAgICAgICAgICAgICAgIG1QbGF5bGlzdCA9IHBsYXlsaXN0OwotICAgICAgICAgICAgICAgIG1TZXNzaW9uQWN0aXZpdHkgPSBzZXNzaW9uQWN0aXZpdHk7Ci0gICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIgPSBzZXNzaW9uQmluZGVyOwotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEltcGxlbWVudGF0aW9uIGZvciB0aGUgbG9jYWwgYmluZGVyIGlzIG5vLW9wLAotICAgICAgICAgICAgICAgICAgICAvLyBzbyBjYW4gYmUgdXNlZCB3aXRob3V0IHdvcnJ5aW5nIGFib3V0IGRlYWRsb2NrLgotICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlci5hc0JpbmRlcigpLmxpbmtUb0RlYXRoKG1EZWF0aFJlY2lwaWVudCwgMCk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTZXNzaW9uIGRpZWQgdG9vIGVhcmx5LiIsIGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNsb3NlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogS2VlcCBjb21tYW5kcyB0byBwcmV2ZW50cyBpbGxlZ2FsIEFQSSBjYWxscy4KLSAgICAgICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgICAgIC8vIE5vdGU6IFdlIG1heSB0cmlnZ2VyIENvbnRyb2xsZXJDYWxsYmFja3Mgd2l0aCB0aGUgaW5pdGlhbCB2YWx1ZXMKLSAgICAgICAgICAgICAgICAvLyBCdXQgaXQncyBoYXJkIHRvIGRlZmluZSB0aGUgb3JkZXIgb2YgdGhlIGNvbnRyb2xsZXIgY2FsbGJhY2tzCi0gICAgICAgICAgICAgICAgLy8gT25seSBub3RpZnkgYWJvdXQgdGhlCi0gICAgICAgICAgICAgICAgbUNhbGxiYWNrLm9uQ29ubmVjdGVkKG1JbnN0YW5jZSwgYWxsb3dlZENvbW1hbmRzKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgaWYgKGNsb3NlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVHJpY2sgdG8gY2FsbCByZWxlYXNlKCkgd2l0aG91dCBob2xkaW5nIHRoZSBsb2NrLCB0byBwcmV2ZW50IHBvdGVudGlhbCBkZWFkbG9jawotICAgICAgICAgICAgICAgIC8vIHdpdGggdGhlIGRldmVsb3BlcidzIGN1c3RvbSBsb2NrIHdpdGhpbiB0aGUgQ29udHJvbGxlckNhbGxiYWNrLm9uRGlzY29ubmVjdGVkKCkuCi0gICAgICAgICAgICAgICAgbUluc3RhbmNlLmNsb3NlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIG9uQ3VzdG9tQ29tbWFuZChmaW5hbCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCwgZmluYWwgQnVuZGxlIGFyZ3MsCi0gICAgICAgICAgICBmaW5hbCBSZXN1bHRSZWNlaXZlciByZWNlaXZlcikgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uQ3VzdG9tQ29tbWFuZCBjbWQ9IiArIGNvbW1hbmQpOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBEb3VibGUgY2hlY2sgaWYgdGhlIGNvbnRyb2xsZXIgZXhpc3RzLgotICAgICAgICAgICAgbUNhbGxiYWNrLm9uQ3VzdG9tQ29tbWFuZChtSW5zdGFuY2UsIGNvbW1hbmQsIGFyZ3MsIHJlY2VpdmVyKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBvbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQoZmluYWwgU2Vzc2lvbkNvbW1hbmRHcm91cDIgY29tbWFuZHMpIHsKLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25BbGxvd2VkQ29tbWFuZHNDaGFuZ2VkKG1JbnN0YW5jZSwgY29tbWFuZHMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIG9uQ3VzdG9tTGF5b3V0Q2hhbmdlZChmaW5hbCBMaXN0PENvbW1hbmRCdXR0b24+IGxheW91dCkgewotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkN1c3RvbUxheW91dENoYW5nZWQobUluc3RhbmNlLCBsYXlvdXQpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIG9uIHRoZSBtYWluIHRocmVhZC4KLSAgICBwcml2YXRlIGNsYXNzIFNlc3Npb25TZXJ2aWNlQ29ubmVjdGlvbiBpbXBsZW1lbnRzIFNlcnZpY2VDb25uZWN0aW9uIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZUNvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUsIElCaW5kZXIgc2VydmljZSkgewotICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGl0J3MgYWx3YXlzIG1haW4tdGhyZWFkLgotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25TZXJ2aWNlQ29ubmVjdGVkICIgKyBuYW1lICsgIiAiICsgdGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2sKLSAgICAgICAgICAgIGlmICghbVRva2VuLmdldFBhY2thZ2VOYW1lKCkuZXF1YWxzKG5hbWUuZ2V0UGFja2FnZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICBMb2cud3RmKFRBRywgbmFtZSArICIgd2FzIGNvbm5lY3RlZCwgYnV0IGV4cGVjdGVkIHBrZz0iCi0gICAgICAgICAgICAgICAgICAgICAgICArIG1Ub2tlbi5nZXRQYWNrYWdlTmFtZSgpICsgIiB3aXRoIGlkPSIgKyBtVG9rZW4uZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgc2Vzc2lvbkJpbmRlciA9IElNZWRpYVNlc3Npb24yLlN0dWIuYXNJbnRlcmZhY2Uoc2VydmljZSk7Ci0gICAgICAgICAgICBjb25uZWN0VG9TZXNzaW9uKHNlc3Npb25CaW5kZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUpIHsKLSAgICAgICAgICAgIC8vIFRlbXBvcmFsIGxvc2Ugb2YgdGhlIGJpbmRpbmcgYmVjYXVzZSBvZiB0aGUgc2VydmljZSBjcmFzaC4gU3lzdGVtIHdpbGwgYXV0b21hdGljYWxseQotICAgICAgICAgICAgLy8gcmViaW5kLCBzbyBqdXN0IG5vLW9wLgotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZWFsbHk/IEVpdGhlciBkaXNjb25uZWN0IGNsZWFubHkgb3IKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gc2VydmljZSAiICsgbmFtZSArICIgaXMgZGlzY29ubmVjdGVkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQmluZGluZ0RpZWQoQ29tcG9uZW50TmFtZSBuYW1lKSB7Ci0gICAgICAgICAgICAvLyBQZXJtYW5lbnQgbG9zZSBvZiB0aGUgYmluZGluZyBiZWNhdXNlIG9mIHRoZSBzZXJ2aWNlIHBhY2thZ2UgdXBkYXRlIG9yIHJlbW92ZWQuCi0gICAgICAgICAgICAvLyBUaGlzIFNlc3Npb25TZXJ2aWNlUmVjb3JkIHdpbGwgYmUgcmVtb3ZlZCBhY2NvcmRpbmdseSwgYnV0IGZvcmdldCBzZXNzaW9uIGJpbmRlciBoZXJlCi0gICAgICAgICAgICAvLyBmb3Igc3VyZS4KLSAgICAgICAgICAgIG1JbnN0YW5jZS5jbG9zZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQbGF5YmFja0luZm9JbXBsIGltcGxlbWVudHMgUGxheWJhY2tJbmZvUHJvdmlkZXIgewotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUExBWUJBQ0tfVFlQRSA9Ci0gICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEucGxheWJhY2tpbmZvX2ltcGwucGxheWJhY2tfdHlwZSI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OVFJPTF9UWVBFID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5wbGF5YmFja2luZm9faW1wbC5jb250cm9sX3R5cGUiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX01BWF9WT0xVTUUgPQotICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLnBsYXliYWNraW5mb19pbXBsLm1heF92b2x1bWUiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NVUlJFTlRfVk9MVU1FID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5wbGF5YmFja2luZm9faW1wbC5jdXJyZW50X3ZvbHVtZSI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQVVESU9fQVRUUklCVVRFUyA9Ci0gICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEucGxheWJhY2tpbmZvX2ltcGwuYXVkaW9fYXR0cnMiOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgUGxheWJhY2tJbmZvIG1JbnN0YW5jZTsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtUGxheWJhY2tUeXBlOwotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtQ29udHJvbFR5cGU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1NYXhWb2x1bWU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1DdXJyZW50Vm9sdW1lOwotICAgICAgICBwcml2YXRlIGZpbmFsIEF1ZGlvQXR0cmlidXRlcyBtQXVkaW9BdHRyczsKLQotICAgICAgICBwcml2YXRlIFBsYXliYWNrSW5mb0ltcGwoaW50IHBsYXliYWNrVHlwZSwgQXVkaW9BdHRyaWJ1dGVzIGF0dHJzLCBpbnQgY29udHJvbFR5cGUsCi0gICAgICAgICAgICAgICAgaW50IG1heCwgaW50IGN1cnJlbnQpIHsKLSAgICAgICAgICAgIG1QbGF5YmFja1R5cGUgPSBwbGF5YmFja1R5cGU7Ci0gICAgICAgICAgICBtQXVkaW9BdHRycyA9IGF0dHJzOwotICAgICAgICAgICAgbUNvbnRyb2xUeXBlID0gY29udHJvbFR5cGU7Ci0gICAgICAgICAgICBtTWF4Vm9sdW1lID0gbWF4OwotICAgICAgICAgICAgbUN1cnJlbnRWb2x1bWUgPSBjdXJyZW50OwotICAgICAgICAgICAgbUluc3RhbmNlID0gbmV3IFBsYXliYWNrSW5mbyh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldFBsYXliYWNrVHlwZV9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5YmFja1R5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEF1ZGlvQXR0cmlidXRlcyBnZXRBdWRpb0F0dHJpYnV0ZXNfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQXVkaW9BdHRyczsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldENvbnRyb2xUeXBlX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbnRyb2xUeXBlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0TWF4Vm9sdW1lX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1heFZvbHVtZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldEN1cnJlbnRWb2x1bWVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ3VycmVudFZvbHVtZTsKLSAgICAgICAgfQotCi0gICAgICAgIFBsYXliYWNrSW5mbyBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBCdW5kbGUgdG9CdW5kbGUoKSB7Ci0gICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgYnVuZGxlLnB1dEludChLRVlfUExBWUJBQ0tfVFlQRSwgbVBsYXliYWNrVHlwZSk7Ci0gICAgICAgICAgICBidW5kbGUucHV0SW50KEtFWV9DT05UUk9MX1RZUEUsIG1Db250cm9sVHlwZSk7Ci0gICAgICAgICAgICBidW5kbGUucHV0SW50KEtFWV9NQVhfVk9MVU1FLCBtTWF4Vm9sdW1lKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX0NVUlJFTlRfVk9MVU1FLCBtQ3VycmVudFZvbHVtZSk7Ci0gICAgICAgICAgICBidW5kbGUucHV0UGFyY2VsYWJsZShLRVlfQVVESU9fQVRUUklCVVRFUywgbUF1ZGlvQXR0cnMpOwotICAgICAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBQbGF5YmFja0luZm8gY3JlYXRlUGxheWJhY2tJbmZvKGludCBwbGF5YmFja1R5cGUsIEF1ZGlvQXR0cmlidXRlcyBhdHRycywKLSAgICAgICAgICAgICAgICBpbnQgY29udHJvbFR5cGUsIGludCBtYXgsIGludCBjdXJyZW50KSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFBsYXliYWNrSW5mb0ltcGwocGxheWJhY2tUeXBlLCBhdHRycywgY29udHJvbFR5cGUsIG1heCwgY3VycmVudCkKLSAgICAgICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgUGxheWJhY2tJbmZvIGZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICAgICAgaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBpbnQgdm9sdW1lVHlwZSA9IGJ1bmRsZS5nZXRJbnQoS0VZX1BMQVlCQUNLX1RZUEUpOwotICAgICAgICAgICAgZmluYWwgaW50IHZvbHVtZUNvbnRyb2wgPSBidW5kbGUuZ2V0SW50KEtFWV9DT05UUk9MX1RZUEUpOwotICAgICAgICAgICAgZmluYWwgaW50IG1heFZvbHVtZSA9IGJ1bmRsZS5nZXRJbnQoS0VZX01BWF9WT0xVTUUpOwotICAgICAgICAgICAgZmluYWwgaW50IGN1cnJlbnRWb2x1bWUgPSBidW5kbGUuZ2V0SW50KEtFWV9DVVJSRU5UX1ZPTFVNRSk7Ci0gICAgICAgICAgICBmaW5hbCBBdWRpb0F0dHJpYnV0ZXMgYXR0cnMgPSBidW5kbGUuZ2V0UGFyY2VsYWJsZShLRVlfQVVESU9fQVRUUklCVVRFUyk7Ci0KLSAgICAgICAgICAgIHJldHVybiBjcmVhdGVQbGF5YmFja0luZm8odm9sdW1lVHlwZSwgYXR0cnMsIHZvbHVtZUNvbnRyb2wsIG1heFZvbHVtZSwgY3VycmVudFZvbHVtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQ29udHJvbGxlcjJTdHViLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQ29udHJvbGxlcjJTdHViLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZmM1ZGYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUNvbnRyb2xsZXIyU3R1Yi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29tbWFuZEJ1dHRvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kR3JvdXAyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMkltcGwuUGxheWJhY2tJbmZvSW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kQnV0dG9uSW1wbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi1wdWJsaWMgY2xhc3MgTWVkaWFDb250cm9sbGVyMlN0dWIgZXh0ZW5kcyBJTWVkaWFDb250cm9sbGVyMi5TdHViIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhQ29udHJvbGxlcjJTdHViIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gVE9ETyhqYWV3YW4pOiBDaGFuZ2UKLQotICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxNZWRpYUNvbnRyb2xsZXIySW1wbD4gbUNvbnRyb2xsZXI7Ci0KLSAgICBNZWRpYUNvbnRyb2xsZXIyU3R1YihNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyKSB7Ci0gICAgICAgIG1Db250cm9sbGVyID0gbmV3IFdlYWtSZWZlcmVuY2U8Pihjb250cm9sbGVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhQ29udHJvbGxlcjJJbXBsIGdldENvbnRyb2xsZXIoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlciA9IG1Db250cm9sbGVyLmdldCgpOwotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDb250cm9sbGVyIGlzIHJlbGVhc2VkIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZWRpYUJyb3dzZXIySW1wbCBnZXRCcm93c2VyKCkgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIGlmIChjb250cm9sbGVyIGluc3RhbmNlb2YgTWVkaWFCcm93c2VyMkltcGwpIHsKLSAgICAgICAgICAgIHJldHVybiAoTWVkaWFCcm93c2VyMkltcGwpIGNvbnRyb2xsZXI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZGVzdHJveSgpIHsKLSAgICAgICAgbUNvbnRyb2xsZXIuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBsYXllclN0YXRlQ2hhbmdlZChpbnQgc3RhdGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hQbGF5ZXJTdGF0ZUNoYW5nZXMoc3RhdGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUG9zaXRpb25DaGFuZ2VkKGxvbmcgZXZlbnRUaW1lTXMsIGxvbmcgcG9zaXRpb25NcykgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChldmVudFRpbWVNcyA8IDApIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uUG9zaXRpb25DaGFuZ2VkKCk6IElnbm9yaW5nIG5lZ2F0aXZlIGV2ZW50VGltZU1zIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBvc2l0aW9uTXMgPCAwKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvblBvc2l0aW9uQ2hhbmdlZCgpOiBJZ25vcmluZyBuZWdhdGl2ZSBwb3NpdGlvbk1zIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5wdXNoUG9zaXRpb25DaGFuZ2VzKGV2ZW50VGltZU1zLCBwb3NpdGlvbk1zKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBsYXliYWNrU3BlZWRDaGFuZ2VkKGZsb2F0IHNwZWVkKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5wdXNoUGxheWJhY2tTcGVlZENoYW5nZXMoc3BlZWQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQnVmZmVyZWRQb3NpdGlvbkNoYW5nZWQobG9uZyBidWZmZXJlZFBvc2l0aW9uTXMpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnVmZmVyZWRQb3NpdGlvbk1zIDwgMCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25CdWZmZXJlZFBvc2l0aW9uQ2hhbmdlZCgpOiBJZ25vcmluZyBuZWdhdGl2ZSBidWZmZXJlZFBvc2l0aW9uTXMiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hCdWZmZXJlZFBvc2l0aW9uQ2hhbmdlcyhidWZmZXJlZFBvc2l0aW9uTXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUGxheWxpc3RDaGFuZ2VkKExpc3Q8QnVuZGxlPiBwbGF5bGlzdEJ1bmRsZSwgQnVuZGxlIG1ldGFkYXRhQnVuZGxlKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBsYXlsaXN0QnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uUGxheWxpc3RDaGFuZ2VkKCk6IElnbm9yaW5nIG51bGwgcGxheWxpc3QgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBwbGF5bGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBmb3IgKEJ1bmRsZSBidW5kbGUgOiBwbGF5bGlzdEJ1bmRsZSkgewotICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gTWVkaWFJdGVtMi5mcm9tQnVuZGxlKGJ1bmRsZSk7Ci0gICAgICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAib25QbGF5bGlzdENoYW5nZWQoKTogSWdub3JpbmcgbnVsbCBpdGVtIGluIHBsYXlsaXN0Iik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBsYXlsaXN0LmFkZChpdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSA9IE1lZGlhTWV0YWRhdGEyLmZyb21CdW5kbGUobWV0YWRhdGFCdW5kbGUpOwotICAgICAgICBjb250cm9sbGVyLnB1c2hQbGF5bGlzdENoYW5nZXMocGxheWxpc3QsIG1ldGFkYXRhKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKEJ1bmRsZSBtZXRhZGF0YUJ1bmRsZSkgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhID0gTWVkaWFNZXRhZGF0YTIuZnJvbUJ1bmRsZShtZXRhZGF0YUJ1bmRsZSk7Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaFBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VzKG1ldGFkYXRhKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblJlcGVhdE1vZGVDaGFuZ2VkKGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5wdXNoUmVwZWF0TW9kZUNoYW5nZXMocmVwZWF0TW9kZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25QbGF5YmFja0luZm9DaGFuZ2VkKEJ1bmRsZSBwbGF5YmFja0luZm8pIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvblBsYXliYWNrSW5mb0NoYW5nZWQiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIE1lZGlhQ29udHJvbGxlcjIuUGxheWJhY2tJbmZvIGluZm8gPSBQbGF5YmFja0luZm9JbXBsLmZyb21CdW5kbGUocGxheWJhY2tJbmZvKTsKLSAgICAgICAgaWYgKGluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25QbGF5YmFja0luZm9DaGFuZ2VkKCk6IElnbm9yaW5nIG51bGwgcGxheWJhY2tJbmZvIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5wdXNoUGxheWJhY2tJbmZvQ2hhbmdlcyhpbmZvKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblNodWZmbGVNb2RlQ2hhbmdlZChpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hTaHVmZmxlTW9kZUNoYW5nZXMoc2h1ZmZsZU1vZGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoaW50IGVycm9yQ29kZSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaEVycm9yKGVycm9yQ29kZSwgZXh0cmFzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNvbm5lY3RlZChJTWVkaWFTZXNzaW9uMiBzZXNzaW9uQmluZGVyLCBCdW5kbGUgY29tbWFuZEdyb3VwLAotICAgICAgICAgICAgaW50IHBsYXllclN0YXRlLCBsb25nIHBvc2l0aW9uRXZlbnRUaW1lTXMsIGxvbmcgcG9zaXRpb25NcywgZmxvYXQgcGxheWJhY2tTcGVlZCwKLSAgICAgICAgICAgIGxvbmcgYnVmZmVyZWRQb3NpdGlvbk1zLCBCdW5kbGUgcGxheWJhY2tJbmZvLCBpbnQgc2h1ZmZsZU1vZGUsIGludCByZXBlYXRNb2RlLAotICAgICAgICAgICAgTGlzdDxCdW5kbGU+IGl0ZW1CdW5kbGVMaXN0LCBQZW5kaW5nSW50ZW50IHNlc3Npb25BY3Rpdml0eSkgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyID0gbUNvbnRyb2xsZXIuZ2V0KCk7Ci0gICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uQ29ubmVjdGVkIGFmdGVyIE1lZGlhQ29udHJvbGxlcjIuY2xvc2UoKSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IGNvbnRyb2xsZXIuZ2V0Q29udGV4dCgpOwotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IGl0ZW1MaXN0ID0gbnVsbDsKLSAgICAgICAgaWYgKGl0ZW1CdW5kbGVMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGl0ZW1MaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1CdW5kbGVMaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gTWVkaWFJdGVtMi5mcm9tQnVuZGxlKGl0ZW1CdW5kbGVMaXN0LmdldChpKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpdGVtTGlzdC5hZGQoaXRlbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIub25Db25uZWN0ZWROb3RMb2NrZWQoc2Vzc2lvbkJpbmRlciwKLSAgICAgICAgICAgICAgICBTZXNzaW9uQ29tbWFuZEdyb3VwMi5mcm9tQnVuZGxlKGNvbW1hbmRHcm91cCksCi0gICAgICAgICAgICAgICAgcGxheWVyU3RhdGUsIHBvc2l0aW9uRXZlbnRUaW1lTXMsIHBvc2l0aW9uTXMsIHBsYXliYWNrU3BlZWQsIGJ1ZmZlcmVkUG9zaXRpb25NcywKLSAgICAgICAgICAgICAgICBQbGF5YmFja0luZm9JbXBsLmZyb21CdW5kbGUocGxheWJhY2tJbmZvKSwgcmVwZWF0TW9kZSwgc2h1ZmZsZU1vZGUsCi0gICAgICAgICAgICAgICAgaXRlbUxpc3QsIHNlc3Npb25BY3Rpdml0eSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EaXNjb25uZWN0ZWQoKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXIgPSBtQ29udHJvbGxlci5nZXQoKTsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25EaXNjb25uZWN0ZWQgYWZ0ZXIgTWVkaWFDb250cm9sbGVyMi5jbG9zZSgpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5nZXRJbnN0YW5jZSgpLmNsb3NlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DdXN0b21MYXlvdXRDaGFuZ2VkKExpc3Q8QnVuZGxlPiBjb21tYW5kQnV0dG9ubGlzdCkgewotICAgICAgICBpZiAoY29tbWFuZEJ1dHRvbmxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25DdXN0b21MYXlvdXRDaGFuZ2VkKCk6IElnbm9yaW5nIG51bGwgY29tbWFuZEJ1dHRvbmxpc3QiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIExpc3Q8Q29tbWFuZEJ1dHRvbj4gbGF5b3V0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29tbWFuZEJ1dHRvbmxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIENvbW1hbmRCdXR0b24gYnV0dG9uID0gQ29tbWFuZEJ1dHRvbkltcGwuZnJvbUJ1bmRsZShjb21tYW5kQnV0dG9ubGlzdC5nZXQoaSkpOwotICAgICAgICAgICAgaWYgKGJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbGF5b3V0LmFkZChidXR0b24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIub25DdXN0b21MYXlvdXRDaGFuZ2VkKGxheW91dCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BbGxvd2VkQ29tbWFuZHNDaGFuZ2VkKEJ1bmRsZSBjb21tYW5kc0J1bmRsZSkgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGNvbW1hbmRzID0gU2Vzc2lvbkNvbW1hbmRHcm91cDIuZnJvbUJ1bmRsZShjb21tYW5kc0J1bmRsZSk7Ci0gICAgICAgIGlmIChjb21tYW5kcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQoKTogSWdub3JpbmcgbnVsbCBjb21tYW5kcyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIub25BbGxvd2VkQ29tbWFuZHNDaGFuZ2VkKGNvbW1hbmRzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkN1c3RvbUNvbW1hbmQoQnVuZGxlIGNvbW1hbmRCdW5kbGUsIEJ1bmRsZSBhcmdzLCBSZXN1bHRSZWNlaXZlciByZWNlaXZlcikgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFNlc3Npb25Db21tYW5kMiBjb21tYW5kID0gU2Vzc2lvbkNvbW1hbmQyLmZyb21CdW5kbGUoY29tbWFuZEJ1bmRsZSk7Ci0gICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uQ3VzdG9tQ29tbWFuZCgpOiBJZ25vcmluZyBudWxsIGNvbW1hbmQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLm9uQ3VzdG9tQ29tbWFuZChjb21tYW5kLCBhcmdzLCByZWNlaXZlcik7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBNZWRpYUJyb3dzZXIgc3BlY2lmaWMKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uR2V0TGlicmFyeVJvb3REb25lKEJ1bmRsZSByb290SGludHMsIFN0cmluZyByb290TWVkaWFJZCwgQnVuZGxlIHJvb3RFeHRyYSkKLSAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTWVkaWFCcm93c2VyMkltcGwgYnJvd3NlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyb3dzZXIgPSBnZXRCcm93c2VyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnJvd3NlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBicm93c2VyLm9uR2V0TGlicmFyeVJvb3REb25lKHJvb3RIaW50cywgcm9vdE1lZGlhSWQsIHJvb3RFeHRyYSk7Ci0gICAgfQotCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkdldEl0ZW1Eb25lKFN0cmluZyBtZWRpYUlkLCBCdW5kbGUgaXRlbUJ1bmRsZSkgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvbkdldEl0ZW1Eb25lKCk6IElnbm9yaW5nIG51bGwgbWVkaWFJZCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhQnJvd3NlcjJJbXBsIGJyb3dzZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBicm93c2VyID0gZ2V0QnJvd3NlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJyb3dzZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXZpc2l0IGhlcmUuIENvdWxkIGJlIGEgYnVnCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYnJvd3Nlci5vbkdldEl0ZW1Eb25lKG1lZGlhSWQsIE1lZGlhSXRlbTIuZnJvbUJ1bmRsZShpdGVtQnVuZGxlKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25HZXRDaGlsZHJlbkRvbmUoU3RyaW5nIHBhcmVudElkLCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLAotICAgICAgICAgICAgTGlzdDxCdW5kbGU+IGl0ZW1CdW5kbGVMaXN0LCBCdW5kbGUgZXh0cmFzKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvbkdldENoaWxkcmVuRG9uZSgpOiBJZ25vcmluZyBudWxsIHBhcmVudElkIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFCcm93c2VyMkltcGwgYnJvd3NlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyb3dzZXIgPSBnZXRCcm93c2VyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnJvd3NlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgaWYgKGl0ZW1CdW5kbGVMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChCdW5kbGUgYnVuZGxlIDogaXRlbUJ1bmRsZUxpc3QpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKE1lZGlhSXRlbTIuZnJvbUJ1bmRsZShidW5kbGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicm93c2VyLm9uR2V0Q2hpbGRyZW5Eb25lKHBhcmVudElkLCBwYWdlLCBwYWdlU2l6ZSwgcmVzdWx0LCBleHRyYXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU2VhcmNoUmVzdWx0Q2hhbmdlZChTdHJpbmcgcXVlcnksIGludCBpdGVtQ291bnQsIEJ1bmRsZSBleHRyYXMpCi0gICAgICAgICAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uU2VhcmNoUmVzdWx0Q2hhbmdlZCgpOiBJZ25vcmluZyBlbXB0eSBxdWVyeSIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhQnJvd3NlcjJJbXBsIGJyb3dzZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBicm93c2VyID0gZ2V0QnJvd3NlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJyb3dzZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXZpc2l0IGhlcmUuIENvdWxkIGJlIGEgYnVnCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYnJvd3Nlci5vblNlYXJjaFJlc3VsdENoYW5nZWQocXVlcnksIGl0ZW1Db3VudCwgZXh0cmFzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkdldFNlYXJjaFJlc3VsdERvbmUoU3RyaW5nIHF1ZXJ5LCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLAotICAgICAgICAgICAgTGlzdDxCdW5kbGU+IGl0ZW1CdW5kbGVMaXN0LCBCdW5kbGUgZXh0cmFzKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uR2V0U2VhcmNoUmVzdWx0RG9uZSgpOiBJZ25vcmluZyBlbXB0eSBxdWVyeSIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhQnJvd3NlcjJJbXBsIGJyb3dzZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBicm93c2VyID0gZ2V0QnJvd3NlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJyb3dzZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXZpc2l0IGhlcmUuIENvdWxkIGJlIGEgYnVnCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIGlmIChpdGVtQnVuZGxlTGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIGZvciAoQnVuZGxlIGJ1bmRsZSA6IGl0ZW1CdW5kbGVMaXN0KSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChNZWRpYUl0ZW0yLmZyb21CdW5kbGUoYnVuZGxlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJvd3Nlci5vbkdldFNlYXJjaFJlc3VsdERvbmUocXVlcnksIHBhZ2UsIHBhZ2VTaXplLCByZXN1bHQsIGV4dHJhcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DaGlsZHJlbkNoYW5nZWQoU3RyaW5nIHBhcmVudElkLCBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvbkNoaWxkcmVuQ2hhbmdlZCgpOiBJZ25vcmluZyBudWxsIHBhcmVudElkIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFCcm93c2VyMkltcGwgYnJvd3NlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyb3dzZXIgPSBnZXRCcm93c2VyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnJvd3NlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBicm93c2VyLm9uQ2hpbGRyZW5DaGFuZ2VkKHBhcmVudElkLCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUl0ZW0ySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUl0ZW0ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTBhMGYxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFJdGVtMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMi5GTEFHX0JST1dTQUJMRTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yLkZMQUdfUExBWUFCTEU7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5EYXRhU291cmNlRGVzYzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yLkJ1aWxkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yLkZsYWdzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFJdGVtMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuVVVJRDsKLQotcHVibGljIGNsYXNzIE1lZGlhSXRlbTJJbXBsIGltcGxlbWVudHMgTWVkaWFJdGVtMlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0lEID0gImFuZHJvaWQubWVkaWEubWVkaWFpdGVtMi5pZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9GTEFHUyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhaXRlbTIuZmxhZ3MiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUVUQURBVEEgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWl0ZW0yLm1ldGFkYXRhIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1VVSUQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWl0ZW0yLnV1aWQiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYUl0ZW0yIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtSWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUZsYWdzOwotICAgIHByaXZhdGUgZmluYWwgVVVJRCBtVVVJRDsKLSAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGEyIG1NZXRhZGF0YTsKLSAgICBwcml2YXRlIERhdGFTb3VyY2VEZXNjIG1EYXRhU291cmNlRGVzYzsKLQotICAgIC8vIEZyb20gdGhlIHB1YmxpYyBBUEkKLSAgICBwdWJsaWMgTWVkaWFJdGVtMkltcGwoQE5vbk51bGwgU3RyaW5nIG1lZGlhSWQsIEBOdWxsYWJsZSBEYXRhU291cmNlRGVzYyBkc2QsCi0gICAgICAgICAgICBATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEsIEBGbGFncyBpbnQgZmxhZ3MpIHsKLSAgICAgICAgdGhpcyhtZWRpYUlkLCBkc2QsIG1ldGFkYXRhLCBmbGFncywgbnVsbCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZWRpYUl0ZW0ySW1wbChATm9uTnVsbCBTdHJpbmcgbWVkaWFJZCwgQE51bGxhYmxlIERhdGFTb3VyY2VEZXNjIGRzZCwKLSAgICAgICAgICAgIEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSwgQEZsYWdzIGludCBmbGFncywgQE51bGxhYmxlIFVVSUQgdXVpZCkgewotICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZWRpYUlkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1ldGFkYXRhICE9IG51bGwgJiYgIVRleHRVdGlscy5lcXVhbHMobWVkaWFJZCwgbWV0YWRhdGEuZ2V0TWVkaWFJZCgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWV0YWRhdGEncyBpZCBzaG91bGQgYmUgbWF0Y2hlZCB3aXRoIHRoZSBtZWRpYWlkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBtSWQgPSBtZWRpYUlkOwotICAgICAgICBtRGF0YVNvdXJjZURlc2MgPSBkc2Q7Ci0gICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICBtRmxhZ3MgPSBmbGFnczsKLSAgICAgICAgbVVVSUQgPSAodXVpZCA9PSBudWxsKSA/IFVVSUQucmFuZG9tVVVJRCgpIDogdXVpZDsKLQotICAgICAgICBtSW5zdGFuY2UgPSBuZXcgTWVkaWFJdGVtMih0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHNfaW1wbChPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIE1lZGlhSXRlbTIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgTWVkaWFJdGVtMiBvdGhlciA9IChNZWRpYUl0ZW0yKSBvYmo7Ci0gICAgICAgIHJldHVybiBtVVVJRC5lcXVhbHMoKChNZWRpYUl0ZW0ySW1wbCkgb3RoZXIuZ2V0UHJvdmlkZXIoKSkubVVVSUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGlzIG9iamVjdCBhcyBhIGJ1bmRsZSB0byBzaGFyZSBiZXR3ZWVuIHByb2Nlc3Nlcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gYSBuZXcgYnVuZGxlIGluc3RhbmNlCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSB0b0J1bmRsZV9pbXBsKCkgewotICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICBidW5kbGUucHV0U3RyaW5nKEtFWV9JRCwgbUlkKTsKLSAgICAgICAgYnVuZGxlLnB1dEludChLRVlfRkxBR1MsIG1GbGFncyk7Ci0gICAgICAgIGlmIChtTWV0YWRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVuZGxlLnB1dEJ1bmRsZShLRVlfTUVUQURBVEEsIG1NZXRhZGF0YS50b0J1bmRsZSgpKTsKLSAgICAgICAgfQotICAgICAgICBidW5kbGUucHV0U3RyaW5nKEtFWV9VVUlELCBtVVVJRC50b1N0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBNZWRpYUl0ZW0yIGZyb20gdGhlIHtAbGluayBCdW5kbGV9LgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlIHdoaWNoIHdhcyBwdWJsaXNoZWQgYnkge0BsaW5rIE1lZGlhSXRlbTIjdG9CdW5kbGUoKX0uCi0gICAgICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBNZWRpYUl0ZW0yCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZWRpYUl0ZW0yIGZyb21CdW5kbGVfaW1wbChATm9uTnVsbCBCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgU3RyaW5nIHV1aWRTdHJpbmcgPSBidW5kbGUuZ2V0U3RyaW5nKEtFWV9VVUlEKTsKLSAgICAgICAgcmV0dXJuIGZyb21CdW5kbGUoYnVuZGxlLCBVVUlELmZyb21TdHJpbmcodXVpZFN0cmluZykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIE1lZGlhSXRlbTIgZnJvbSB0aGUge0BsaW5rIEJ1bmRsZX0gd2l0aCB0aGUgc3BlY2lmaWVkIHtAbGluayBVVUlEfS4KLSAgICAgKiBJZiB7QGxpbmsgVVVJRH0KLSAgICAgKiBjYW4gYmUgbnVsbCBmb3IgY3JlYXRpbmcgbmV3LgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlIHdoaWNoIHdhcyBwdWJsaXNoZWQgYnkge0BsaW5rIE1lZGlhSXRlbTIjdG9CdW5kbGUoKX0uCi0gICAgICogQHBhcmFtIHV1aWQgQSB7QGxpbmsgVVVJRH0gdG8gb3ZlcnJpZGUuIENhbiBiZSB7QGxpbmsgbnVsbH0gZm9yIG92ZXJyaWRlLgotICAgICAqIEByZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgTWVkaWFJdGVtMgotICAgICAqLwotICAgIHN0YXRpYyBNZWRpYUl0ZW0yIGZyb21CdW5kbGUoQE5vbk51bGwgQnVuZGxlIGJ1bmRsZSwgQE51bGxhYmxlIFVVSUQgdXVpZCkgewotICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IGJ1bmRsZS5nZXRTdHJpbmcoS0VZX0lEKTsKLSAgICAgICAgZmluYWwgQnVuZGxlIG1ldGFkYXRhQnVuZGxlID0gYnVuZGxlLmdldEJ1bmRsZShLRVlfTUVUQURBVEEpOwotICAgICAgICBmaW5hbCBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSA9IE1lZGlhTWV0YWRhdGEyLmZyb21CdW5kbGUobWV0YWRhdGFCdW5kbGUpOwotICAgICAgICBmaW5hbCBpbnQgZmxhZ3MgPSBidW5kbGUuZ2V0SW50KEtFWV9GTEFHUyk7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFJdGVtMkltcGwoaWQsIG51bGwsIG1ldGFkYXRhLCBmbGFncywgdXVpZCkuZ2V0SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhSXRlbTIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZ19pbXBsKCkgewotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIk1lZGlhSXRlbTJ7Iik7Ci0gICAgICAgIHNiLmFwcGVuZCgibUZsYWdzPSIpLmFwcGVuZChtRmxhZ3MpOwotICAgICAgICBzYi5hcHBlbmQoIiwgbU1ldGFkYXRhPSIpLmFwcGVuZChtTWV0YWRhdGEpOwotICAgICAgICBzYi5hcHBlbmQoJ30nKTsKLSAgICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBGbGFncyBpbnQgZ2V0RmxhZ3NfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1GbGFnczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Jyb3dzYWJsZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gKG1GbGFncyAmIEZMQUdfQlJPV1NBQkxFKSAhPSAwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzUGxheWFibGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIChtRmxhZ3MgJiBGTEFHX1BMQVlBQkxFKSAhPSAwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1ldGFkYXRhX2ltcGwoQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGlmIChtZXRhZGF0YSAhPSBudWxsICYmICFUZXh0VXRpbHMuZXF1YWxzKG1JZCwgbWV0YWRhdGEuZ2V0TWVkaWFJZCgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibWV0YWRhdGEncyBpZCBzaG91bGQgYmUgbWF0Y2hlZCB3aXRoIHRoZSBtZWRpYUlkIik7Ci0gICAgICAgIH0KLSAgICAgICAgbU1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBnZXRNZXRhZGF0YV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbU1ldGFkYXRhOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATm9uTnVsbCBTdHJpbmcgZ2V0TWVkaWFJZF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbUlkOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATnVsbGFibGUgRGF0YVNvdXJjZURlc2MgZ2V0RGF0YVNvdXJjZURlc2NfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1EYXRhU291cmNlRGVzYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXJJbXBsIGltcGxlbWVudHMgTWVkaWFJdGVtMlByb3ZpZGVyLkJ1aWxkZXJQcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgQnVpbGRlciBtSW5zdGFuY2U7Ci0gICAgICAgIHByaXZhdGUgQEZsYWdzIGludCBtRmxhZ3M7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1NZWRpYUlkOwotICAgICAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGEyIG1NZXRhZGF0YTsKLSAgICAgICAgcHJpdmF0ZSBEYXRhU291cmNlRGVzYyBtRGF0YVNvdXJjZURlc2M7Ci0KLSAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKEJ1aWxkZXIgaW5zdGFuY2UsIGludCBmbGFncykgewotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBtRmxhZ3MgPSBmbGFnczsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRNZWRpYUlkX2ltcGwoQE51bGxhYmxlIFN0cmluZyBtZWRpYUlkKSB7Ci0gICAgICAgICAgICBtTWVkaWFJZCA9IG1lZGlhSWQ7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldE1ldGFkYXRhX2ltcGwoQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgICAgICBtTWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RGF0YVNvdXJjZURlc2NfaW1wbChATnVsbGFibGUgRGF0YVNvdXJjZURlc2MgZGF0YVNvdXJjZURlc2MpIHsKLSAgICAgICAgICAgIG1EYXRhU291cmNlRGVzYyA9IGRhdGFTb3VyY2VEZXNjOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgTWVkaWFJdGVtMiBidWlsZF9pbXBsKCkgewotICAgICAgICAgICAgU3RyaW5nIGlkID0gKG1NZXRhZGF0YSAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICA/IG1NZXRhZGF0YS5nZXRTdHJpbmcoTWVkaWFNZXRhZGF0YTIuTUVUQURBVEFfS0VZX01FRElBX0lEKSA6IG51bGw7Ci0gICAgICAgICAgICBpZiAoaWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vICBUT0RPKGphZXdhbik6IERvdWJsZSBjaGVjayBpZiBpdHMgc3VmZmljaWVudCAoZS5nLiBVc2UgVVVJRCBpbnN0ZWFkPykKLSAgICAgICAgICAgICAgICBpZCA9IChtTWVkaWFJZCAhPSBudWxsKSA/IG1NZWRpYUlkIDogdG9TdHJpbmcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFJdGVtMkltcGwoaWQsIG1EYXRhU291cmNlRGVzYywgbU1ldGFkYXRhLCBtRmxhZ3MpLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhTGlicmFyeVNlcnZpY2UySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YzNGNkNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhTGlicmFyeVNlcnZpY2UySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5MaWJyYXJ5Um9vdDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLk1lZGlhTGlicmFyeVNlc3Npb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5NZWRpYUxpYnJhcnlTZXNzaW9uLkJ1aWxkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5NZWRpYUxpYnJhcnlTZXNzaW9uLk1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbnRyb2xsZXJJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhTGlicmFyeVNlcnZpY2UyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsLkJ1aWxkZXJCYXNlSW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi1wdWJsaWMgY2xhc3MgTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsIGV4dGVuZHMgTWVkaWFTZXNzaW9uU2VydmljZTJJbXBsIGltcGxlbWVudHMKLSAgICAgICAgTWVkaWFMaWJyYXJ5U2VydmljZTJQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb25TZXJ2aWNlMiBtSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBNZWRpYUxpYnJhcnlTZXNzaW9uIG1MaWJyYXJ5U2Vzc2lvbjsKLQotICAgIHB1YmxpYyBNZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwoTWVkaWFMaWJyYXJ5U2VydmljZTIgaW5zdGFuY2UpIHsKLSAgICAgICAgc3VwZXIoaW5zdGFuY2UpOwotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZV9pbXBsKCkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZV9pbXBsKCk7Ci0KLSAgICAgICAgLy8gRWZmZWN0aXZlbHkgZmluYWwKLSAgICAgICAgTWVkaWFTZXNzaW9uMiBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotICAgICAgICBpZiAoIShzZXNzaW9uIGluc3RhbmNlb2YgTWVkaWFMaWJyYXJ5U2Vzc2lvbikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHBlY3RlZCBNZWRpYUxpYnJhcnlTZXNzaW9uLCBidXQgcmV0dXJuZWQgTWVkaWFTZXNzaW9uMiIpOwotICAgICAgICB9Ci0gICAgICAgIG1MaWJyYXJ5U2Vzc2lvbiA9IChNZWRpYUxpYnJhcnlTZXNzaW9uKSBnZXRTZXNzaW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgaW50IGdldFNlc3Npb25UeXBlKCkgewotICAgICAgICByZXR1cm4gU2Vzc2lvblRva2VuMi5UWVBFX0xJQlJBUllfU0VSVklDRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1lZGlhTGlicmFyeVNlc3Npb25JbXBsIGV4dGVuZHMgTWVkaWFTZXNzaW9uMkltcGwKLSAgICAgICAgICAgIGltcGxlbWVudHMgTWVkaWFMaWJyYXJ5U2Vzc2lvblByb3ZpZGVyIHsKLSAgICAgICAgcHVibGljIE1lZGlhTGlicmFyeVNlc3Npb25JbXBsKENvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICBNZWRpYVBsYXllckJhc2UgcGxheWVyLCBTdHJpbmcgaWQsIE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgICAgIFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlciwKLSAgICAgICAgICAgICAgICBQZW5kaW5nSW50ZW50IHNlc3Npb25BY3Rpdml0eSwgRXhlY3V0b3IgY2FsbGJhY2tFeGVjdXRvciwKLSAgICAgICAgICAgICAgICBNZWRpYUxpYnJhcnlTZXNzaW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHBsYXllciwgaWQsIHBsYXlsaXN0QWdlbnQsIHZvbHVtZVByb3ZpZGVyLCBzZXNzaW9uQWN0aXZpdHksCi0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrRXhlY3V0b3IsIGNhbGxiYWNrKTsKLSAgICAgICAgICAgIC8vIERvbid0IHB1dCBhbnkgZXh0cmEgaW5pdGlhbGl6YXRpb24gaGVyZS4gSGVyZSdzIHRoZSByZWFzb24uCi0gICAgICAgICAgICAvLyBTeXN0ZW0gc2VydmljZSB3aWxsIHJlY29nbml6ZSB0aGlzIHNlc3Npb24gaW5zaWRlIG9mIHRoZSBzdXBlciBjb25zdHJ1Y3RvciBhbmQgd291bGQKLSAgICAgICAgICAgIC8vIGNvbm5lY3QgdG8gdGhpcyBzZXNzaW9uIGFzc3VtaW5nIHRoYXQgaW5pdGlhbGl6YXRpb24gaXMgZmluaXNoZWQuIEhvd2V2ZXIsIGlmIGFueQotICAgICAgICAgICAgLy8gaW5pdGlhbGl6YXRpb24gbG9naWMgaXMgaGVyZSwgY2FsbHMgZnJvbSB0aGUgc2VydmVyIHdvdWxkIGZhaWwuCi0gICAgICAgICAgICAvLyBzZWU6IE1lZGlhU2Vzc2lvbjJTdHViI2Nvbm5lY3QoKQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIE1lZGlhTGlicmFyeVNlc3Npb24gY3JlYXRlSW5zdGFuY2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhTGlicmFyeVNlc3Npb24odGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgTWVkaWFMaWJyYXJ5U2Vzc2lvbiBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAoTWVkaWFMaWJyYXJ5U2Vzc2lvbikgc3VwZXIuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBNZWRpYUxpYnJhcnlTZXNzaW9uQ2FsbGJhY2sgZ2V0Q2FsbGJhY2soKSB7Ci0gICAgICAgICAgICByZXR1cm4gKE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjaykgc3VwZXIuZ2V0Q2FsbGJhY2soKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGlsZHJlbkNoYW5nZWRfaW1wbChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTdHJpbmcgcGFyZW50SWQsCi0gICAgICAgICAgICAgICAgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbnRyb2xsZXIgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFyZW50SWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdldFNlc3Npb25TdHViKCkubm90aWZ5Q2hpbGRyZW5DaGFuZ2VkTm90TG9ja2VkKGNvbnRyb2xsZXIsIHBhcmVudElkLCBpdGVtQ291bnQsCi0gICAgICAgICAgICAgICAgICAgIGV4dHJhcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5Q2hpbGRyZW5DaGFuZ2VkX2ltcGwoU3RyaW5nIHBhcmVudElkLCBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmVudElkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnZXRTZXNzaW9uU3R1YigpLm5vdGlmeUNoaWxkcmVuQ2hhbmdlZE5vdExvY2tlZChwYXJlbnRJZCwgaXRlbUNvdW50LCBleHRyYXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeVNlYXJjaFJlc3VsdENoYW5nZWRfaW1wbChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTdHJpbmcgcXVlcnksCi0gICAgICAgICAgICAgICAgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgZW5zdXJlQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbnRyb2xsZXIgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWVyeSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdldFNlc3Npb25TdHViKCkubm90aWZ5U2VhcmNoUmVzdWx0Q2hhbmdlZChjb250cm9sbGVyLCBxdWVyeSwgaXRlbUNvdW50LCBleHRyYXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVySW1wbAotICAgICAgICAgICAgZXh0ZW5kcyBCdWlsZGVyQmFzZUltcGw8TWVkaWFMaWJyYXJ5U2Vzc2lvbiwgTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrPiB7Ci0gICAgICAgIHB1YmxpYyBCdWlsZGVySW1wbChNZWRpYUxpYnJhcnlTZXJ2aWNlMiBzZXJ2aWNlLCBCdWlsZGVyIGluc3RhbmNlLAotICAgICAgICAgICAgICAgIEV4ZWN1dG9yIGNhbGxiYWNrRXhlY3V0b3IsIE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAgICAgc3VwZXIoc2VydmljZSk7Ci0gICAgICAgICAgICBzZXRTZXNzaW9uQ2FsbGJhY2tfaW1wbChjYWxsYmFja0V4ZWN1dG9yLCBjYWxsYmFjayk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE1lZGlhTGlicmFyeVNlc3Npb24gYnVpbGRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwobUNvbnRleHQsIG1QbGF5ZXIsIG1JZCwgbVBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVQcm92aWRlciwgbVNlc3Npb25BY3Rpdml0eSwgbUNhbGxiYWNrRXhlY3V0b3IsIG1DYWxsYmFjaykuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTGlicmFyeVJvb3RJbXBsIGltcGxlbWVudHMgTGlicmFyeVJvb3RQcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTGlicmFyeVJvb3QgbUluc3RhbmNlOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUm9vdElkOwotICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtRXh0cmFzOwotCi0gICAgICAgIHB1YmxpYyBMaWJyYXJ5Um9vdEltcGwoTGlicmFyeVJvb3QgaW5zdGFuY2UsIFN0cmluZyByb290SWQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIGlmIChyb290SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvb3RJZCBzaG91bGRuJ3QgYmUgbnVsbC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICAgICAgbVJvb3RJZCA9IHJvb3RJZDsKLSAgICAgICAgICAgIG1FeHRyYXMgPSBleHRyYXM7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRSb290SWRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUm9vdElkOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUV4dHJhczsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFNZXRhZGF0YTJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhTWV0YWRhdGEySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjFjNTMyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFNZXRhZGF0YTJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyLio7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyLkJpdG1hcEtleTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyLkJ1aWxkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMi5Mb25nS2V5OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTIuUmF0aW5nS2V5OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTIuVGV4dEtleTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlJhdGluZzI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFNZXRhZGF0YTJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlNYXA7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYU1ldGFkYXRhMkltcGwgaW1wbGVtZW50cyBNZWRpYU1ldGFkYXRhMlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhTWV0YWRhdGEyIjsKLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgTUVUQURBVEFfVFlQRV9MT05HID0gMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX1RZUEVfVEVYVCA9IDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9UWVBFX0JJVE1BUCA9IDI7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9UWVBFX1JBVElORyA9IDM7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9UWVBFX0ZMT0FUID0gNDsKLSAgICBzdGF0aWMgZmluYWwgQXJyYXlNYXA8U3RyaW5nLCBJbnRlZ2VyPiBNRVRBREFUQV9LRVlTX1RZUEU7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUgPSBuZXcgQXJyYXlNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9USVRMRSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQVJUSVNULCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9EVVJBVElPTiwgTUVUQURBVEFfVFlQRV9MT05HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQUxCVU0sIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FVVEhPUiwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfV1JJVEVSLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9DT01QT1NFUiwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQ09NUElMQVRJT04sIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RBVEUsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX1lFQVIsIE1FVEFEQVRBX1RZUEVfTE9ORyk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0dFTlJFLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9UUkFDS19OVU1CRVIsIE1FVEFEQVRBX1RZUEVfTE9ORyk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX05VTV9UUkFDS1MsIE1FVEFEQVRBX1RZUEVfTE9ORyk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU0NfTlVNQkVSLCBNRVRBREFUQV9UWVBFX0xPTkcpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BTEJVTV9BUlRJU1QsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FSVCwgTUVUQURBVEFfVFlQRV9CSVRNQVApOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BUlRfVVJJLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BTEJVTV9BUlQsIE1FVEFEQVRBX1RZUEVfQklUTUFQKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQUxCVU1fQVJUX1VSSSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfVVNFUl9SQVRJTkcsIE1FVEFEQVRBX1RZUEVfUkFUSU5HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfUkFUSU5HLCBNRVRBREFUQV9UWVBFX1JBVElORyk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU1BMQVlfVElUTEUsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU1BMQVlfU1VCVElUTEUsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU1BMQVlfREVTQ1JJUFRJT04sIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU1BMQVlfSUNPTiwgTUVUQURBVEFfVFlQRV9CSVRNQVApOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9ESVNQTEFZX0lDT05fVVJJLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9NRURJQV9JRCwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQlRfRk9MREVSX1RZUEUsIE1FVEFEQVRBX1RZUEVfTE9ORyk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX01FRElBX1VSSSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQURWRVJUSVNFTUVOVCwgTUVUQURBVEFfVFlQRV9MT05HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRE9XTkxPQURfU1RBVFVTLCBNRVRBREFUQV9UWVBFX0xPTkcpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEBUZXh0S2V5Ci0gICAgU3RyaW5nW10gUFJFRkVSUkVEX0RFU0NSSVBUSU9OX09SREVSID0gewotICAgICAgICAgICAgTUVUQURBVEFfS0VZX1RJVExFLAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FSVElTVCwKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BTEJVTSwKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BTEJVTV9BUlRJU1QsCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfV1JJVEVSLAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FVVEhPUiwKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9DT01QT1NFUgotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBAQml0bWFwS2V5Ci0gICAgU3RyaW5nW10gUFJFRkVSUkVEX0JJVE1BUF9PUkRFUiA9IHsKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9ESVNQTEFZX0lDT04sCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfQVJULAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FMQlVNX0FSVAotICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBAVGV4dEtleQotICAgIFN0cmluZ1tdIFBSRUZFUlJFRF9VUklfT1JERVIgPSB7Ci0gICAgICAgICAgICBNRVRBREFUQV9LRVlfRElTUExBWV9JQ09OX1VSSSwKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BUlRfVVJJLAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FMQlVNX0FSVF9VUkkKLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYU1ldGFkYXRhMiBtSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLQotICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMkltcGwoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICBtSW5zdGFuY2UgPSBuZXcgTWVkaWFNZXRhZGF0YTIodGhpcyk7Ci0gICAgICAgIG1CdW5kbGUgPSBidW5kbGU7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhTWV0YWRhdGEyIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5X2ltcGwoU3RyaW5nIGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmNvbnRhaW5zS2V5KGtleSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRUZXh0X2ltcGwoQFRleHRLZXkgU3RyaW5nIGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldENoYXJTZXF1ZW5jZShrZXkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATnVsbGFibGUgU3RyaW5nIGdldE1lZGlhSWRfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZS5nZXRTdHJpbmcoTUVUQURBVEFfS0VZX01FRElBX0lEKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFN0cmluZ19pbXBsKEBUZXh0S2V5IFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCA9IG1CdW5kbGUuZ2V0Q2hhclNlcXVlbmNlKGtleSk7Ci0gICAgICAgIGlmICh0ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0ZXh0LnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0TG9uZ19pbXBsKEBMb25nS2V5IFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRMb25nKGtleSwgMCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJhdGluZzIgZ2V0UmF0aW5nX2ltcGwoQFJhdGluZ0tleSBTdHJpbmcga2V5KSB7Ci0gICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBBZGQgYmFja3dhcmQgY29tcGF0aWJpbGl0eQotICAgICAgICBSYXRpbmcyIHJhdGluZyA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByYXRpbmcgPSBSYXRpbmcyLmZyb21CdW5kbGUobUJ1bmRsZS5nZXRCdW5kbGUoa2V5KSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUsIHZhbHVlIHdhcyBub3QgYSByYXRpbmcKLSAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0byByZXRyaWV2ZSBhIGtleSBhcyBSYXRpbmcuIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJhdGluZzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXRfaW1wbChARmxvYXRLZXkgU3RyaW5nIGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEZsb2F0KGtleSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJpdG1hcCBnZXRCaXRtYXBfaW1wbChAQml0bWFwS2V5IFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBCaXRtYXAgYm1wID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJtcCA9IG1CdW5kbGUuZ2V0UGFyY2VsYWJsZShrZXkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gaWdub3JlLCB2YWx1ZSB3YXMgbm90IGEgYml0bWFwCi0gICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdG8gcmV0cmlldmUgYSBrZXkgYXMgQml0bWFwLiIsIGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBibXA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXNfaW1wbCgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJ1bmRsZShNRVRBREFUQV9LRVlfRVhUUkFTKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZSwgdmFsdWUgd2FzIG5vdCBhbiBidW5kbGUKLSAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0byByZXRyaWV2ZSBhbiBleHRyYSIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgc2l6ZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5zaXplKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNldDxTdHJpbmc+IGtleVNldF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5rZXlTZXQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVuZGxlIHRvQnVuZGxlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFNZXRhZGF0YTIgZnJvbUJ1bmRsZV9pbXBsKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIChidW5kbGUgPT0gbnVsbCkgPyBudWxsIDogbmV3IE1lZGlhTWV0YWRhdGEySW1wbChidW5kbGUpLmdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVySW1wbCBpbXBsZW1lbnRzIE1lZGlhTWV0YWRhdGEyUHJvdmlkZXIuQnVpbGRlclByb3ZpZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYU1ldGFkYXRhMi5CdWlsZGVyIG1JbnN0YW5jZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLQotICAgICAgICBwdWJsaWMgQnVpbGRlckltcGwoTWVkaWFNZXRhZGF0YTIuQnVpbGRlciBpbnN0YW5jZSkgewotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKE1lZGlhTWV0YWRhdGEyLkJ1aWxkZXIgaW5zdGFuY2UsIE1lZGlhTWV0YWRhdGEyIHNvdXJjZSkgewotICAgICAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic291cmNlIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKHNvdXJjZS50b0J1bmRsZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBCdWlsZGVySW1wbChpbnQgbWF4Qml0bWFwU2l6ZSkgewotICAgICAgICAgICAgbUluc3RhbmNlID0gbmV3IE1lZGlhTWV0YWRhdGEyLkJ1aWxkZXIodGhpcyk7Ci0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotCi0gICAgICAgICAgICBmb3IgKFN0cmluZyBrZXkgOiBtQnVuZGxlLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gbUJ1bmRsZS5nZXQoa2V5KTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBCaXRtYXApIHsKLSAgICAgICAgICAgICAgICAgICAgQml0bWFwIGJtcCA9IChCaXRtYXApIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICBpZiAoYm1wLmdldEhlaWdodCgpID4gbWF4Qml0bWFwU2l6ZSB8fCBibXAuZ2V0V2lkdGgoKSA+IG1heEJpdG1hcFNpemUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5wdXRCaXRtYXAoa2V5LCBzY2FsZUJpdG1hcChibXAsIG1heEJpdG1hcFNpemUpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBwdXRUZXh0X2ltcGwoQFRleHRLZXkgU3RyaW5nIGtleSwgQ2hhclNlcXVlbmNlIHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9URVhUKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSAiICsga2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGtleSBjYW5ub3QgYmUgdXNlZCB0byBwdXQgYSBDaGFyU2VxdWVuY2UiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dENoYXJTZXF1ZW5jZShrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgcHV0U3RyaW5nX2ltcGwoQFRleHRLZXkgU3RyaW5nIGtleSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9URVhUKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSAiICsga2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGtleSBjYW5ub3QgYmUgdXNlZCB0byBwdXQgYSBTdHJpbmciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dENoYXJTZXF1ZW5jZShrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgcHV0TG9uZ19pbXBsKEBMb25nS2V5IFN0cmluZyBrZXksIGxvbmcgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5nZXQoa2V5KSAhPSBNRVRBREFUQV9UWVBFX0xPTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIGxvbmciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dExvbmcoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHB1dFJhdGluZ19pbXBsKEBSYXRpbmdLZXkgU3RyaW5nIGtleSwgUmF0aW5nMiB2YWx1ZSkgewotICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmdldChrZXkpICE9IE1FVEFEQVRBX1RZUEVfUkFUSU5HKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSAiICsga2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGtleSBjYW5ub3QgYmUgdXNlZCB0byBwdXQgYSBSYXRpbmciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEJ1bmRsZShrZXksIHZhbHVlLnRvQnVuZGxlKCkpOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBwdXRCaXRtYXBfaW1wbChAQml0bWFwS2V5IFN0cmluZyBrZXksIEJpdG1hcCB2YWx1ZSkgewotICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmdldChrZXkpICE9IE1FVEFEQVRBX1RZUEVfQklUTUFQKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSAiICsga2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGtleSBjYW5ub3QgYmUgdXNlZCB0byBwdXQgYSBCaXRtYXAiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dFBhcmNlbGFibGUoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHB1dEZsb2F0X2ltcGwoQEZsb2F0S2V5IFN0cmluZyBrZXksIGZsb2F0IHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9GTE9BVCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgIiArIGtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBrZXkgY2Fubm90IGJlIHVzZWQgdG8gcHV0IGEgZmxvYXQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEZsb2F0KGtleSwgdmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRFeHRyYXNfaW1wbChCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEJ1bmRsZShNRVRBREFUQV9LRVlfRVhUUkFTLCBidW5kbGUpOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTIgYnVpbGRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFNZXRhZGF0YTJJbXBsKG1CdW5kbGUpLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIEJpdG1hcCBzY2FsZUJpdG1hcChCaXRtYXAgYm1wLCBpbnQgbWF4U2l6ZSkgewotICAgICAgICAgICAgZmxvYXQgbWF4U2l6ZUYgPSBtYXhTaXplOwotICAgICAgICAgICAgZmxvYXQgd2lkdGhTY2FsZSA9IG1heFNpemVGIC8gYm1wLmdldFdpZHRoKCk7Ci0gICAgICAgICAgICBmbG9hdCBoZWlnaHRTY2FsZSA9IG1heFNpemVGIC8gYm1wLmdldEhlaWdodCgpOwotICAgICAgICAgICAgZmxvYXQgc2NhbGUgPSBNYXRoLm1pbih3aWR0aFNjYWxlLCBoZWlnaHRTY2FsZSk7Ci0gICAgICAgICAgICBpbnQgaGVpZ2h0ID0gKGludCkgKGJtcC5nZXRIZWlnaHQoKSAqIHNjYWxlKTsKLSAgICAgICAgICAgIGludCB3aWR0aCA9IChpbnQpIChibXAuZ2V0V2lkdGgoKSAqIHNjYWxlKTsKLSAgICAgICAgICAgIHJldHVybiBCaXRtYXAuY3JlYXRlU2NhbGVkQml0bWFwKGJtcCwgd2lkdGgsIGhlaWdodCwgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFQbGF5bGlzdEFnZW50SW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXlsaXN0QWdlbnRJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmZDRlMWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXlsaXN0QWdlbnRJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5DYWxsYmFja0V4ZWN1dG9yOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50LlBsYXlsaXN0RXZlbnRDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVBsYXlsaXN0QWdlbnRQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXJyYXlNYXA7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLkd1YXJkZWRCeTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi1wdWJsaWMgY2xhc3MgTWVkaWFQbGF5bGlzdEFnZW50SW1wbCBpbXBsZW1lbnRzIE1lZGlhUGxheWxpc3RBZ2VudFByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUGxheWxpc3RBZ2VudCI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBtSW5zdGFuY2U7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheU1hcDxQbGF5bGlzdEV2ZW50Q2FsbGJhY2ssIEV4ZWN1dG9yPiBtQ2FsbGJhY2tzID0gbmV3IEFycmF5TWFwPD4oKTsKLQotICAgIHB1YmxpYyBNZWRpYVBsYXlsaXN0QWdlbnRJbXBsKE1lZGlhUGxheWxpc3RBZ2VudCBpbnN0YW5jZSkgewotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBmaW5hbCBwdWJsaWMgdm9pZCByZWdpc3RlclBsYXlsaXN0RXZlbnRDYWxsYmFja19pbXBsKAotICAgICAgICAgICAgQE5vbk51bGwgQENhbGxiYWNrRXhlY3V0b3IgRXhlY3V0b3IgZXhlY3V0b3IsIEBOb25OdWxsIFBsYXlsaXN0RXZlbnRDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpZiAoZXhlY3V0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZXhlY3V0b3Igc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmIChtQ2FsbGJhY2tzLmdldChjYWxsYmFjaykgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgImNhbGxiYWNrIGlzIGFscmVhZHkgYWRkZWQuIElnbm9yaW5nLiIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFja3MucHV0KGNhbGxiYWNrLCBleGVjdXRvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBmaW5hbCBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyUGxheWxpc3RFdmVudENhbGxiYWNrX2ltcGwoCi0gICAgICAgICAgICBATm9uTnVsbCBQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbUNhbGxiYWNrcy5yZW1vdmUoY2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgZmluYWwgcHVibGljIHZvaWQgbm90aWZ5UGxheWxpc3RDaGFuZ2VkX2ltcGwoKSB7Ci0gICAgICAgIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IGNhbGxiYWNrcyA9IGdldENhbGxiYWNrcygpOwotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0PSBtSW5zdGFuY2UuZ2V0UGxheWxpc3QoKTsKLSAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEgPSBtSW5zdGFuY2UuZ2V0UGxheWxpc3RNZXRhZGF0YSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbGxiYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZmluYWwgUGxheWxpc3RFdmVudENhbGxiYWNrIGNhbGxiYWNrID0gY2FsbGJhY2tzLmtleUF0KGkpOwotICAgICAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3IgPSBjYWxsYmFja3MudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gY2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWQoCi0gICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZSwgcGxheWxpc3QsIG1ldGFkYXRhKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBmaW5hbCBwdWJsaWMgdm9pZCBub3RpZnlQbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZF9pbXBsKCkgewotICAgICAgICBBcnJheU1hcDxQbGF5bGlzdEV2ZW50Q2FsbGJhY2ssIEV4ZWN1dG9yPiBjYWxsYmFja3MgPSBnZXRDYWxsYmFja3MoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYWxsYmFja3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIFBsYXlsaXN0RXZlbnRDYWxsYmFjayBjYWxsYmFjayA9IGNhbGxiYWNrcy5rZXlBdChpKTsKLSAgICAgICAgICAgIGZpbmFsIEV4ZWN1dG9yIGV4ZWN1dG9yID0gY2FsbGJhY2tzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBleGVjdXRvci5leGVjdXRlKCgpIC0+IGNhbGxiYWNrLm9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoCi0gICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZSwgbUluc3RhbmNlLmdldFBsYXlsaXN0TWV0YWRhdGEoKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgZmluYWwgcHVibGljIHZvaWQgbm90aWZ5U2h1ZmZsZU1vZGVDaGFuZ2VkX2ltcGwoKSB7Ci0gICAgICAgIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IGNhbGxiYWNrcyA9IGdldENhbGxiYWNrcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbGxiYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZmluYWwgUGxheWxpc3RFdmVudENhbGxiYWNrIGNhbGxiYWNrID0gY2FsbGJhY2tzLmtleUF0KGkpOwotICAgICAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3IgPSBjYWxsYmFja3MudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gY2FsbGJhY2sub25TaHVmZmxlTW9kZUNoYW5nZWQoCi0gICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZSwgbUluc3RhbmNlLmdldFNodWZmbGVNb2RlKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIGZpbmFsIHB1YmxpYyB2b2lkIG5vdGlmeVJlcGVhdE1vZGVDaGFuZ2VkX2ltcGwoKSB7Ci0gICAgICAgIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IGNhbGxiYWNrcyA9IGdldENhbGxiYWNrcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbGxiYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZmluYWwgUGxheWxpc3RFdmVudENhbGxiYWNrIGNhbGxiYWNrID0gY2FsbGJhY2tzLmtleUF0KGkpOwotICAgICAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3IgPSBjYWxsYmFja3MudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gY2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLCBtSW5zdGFuY2UuZ2V0UmVwZWF0TW9kZSgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQE51bGxhYmxlIExpc3Q8TWVkaWFJdGVtMj4gZ2V0UGxheWxpc3RfaW1wbCgpIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UGxheWxpc3RfaW1wbChATm9uTnVsbCBMaXN0PE1lZGlhSXRlbTI+IGxpc3QsCi0gICAgICAgICAgICBATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIGdldFBsYXlsaXN0TWV0YWRhdGFfaW1wbCgpIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdXBkYXRlUGxheWxpc3RNZXRhZGF0YV9pbXBsKEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZFBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGxheWxpc3RJdGVtX2ltcGwoQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVwbGFjZVBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUGxheWxpc3RJdGVtX2ltcGwoQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUHJldmlvdXNJdGVtX2ltcGwoKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvTmV4dEl0ZW1faW1wbCgpIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFJlcGVhdE1vZGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdE1vZGVfaW1wbChpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0U2h1ZmZsZU1vZGVfaW1wbCgpIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICAgICAgcmV0dXJuIE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfTk9ORTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTaHVmZmxlTW9kZV9pbXBsKGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATnVsbGFibGUgTWVkaWFJdGVtMiBnZXRNZWRpYUl0ZW1faW1wbChATm9uTnVsbCBEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgaWYgKGRzZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkc2Qgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IGl0ZW1MaXN0ID0gbUluc3RhbmNlLmdldFBsYXlsaXN0KCk7Ci0gICAgICAgIGlmIChpdGVtTGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGl0ZW1MaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBpdGVtTGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsICYmIGl0ZW0uZ2V0RGF0YVNvdXJjZURlc2MoKSA9PSBkc2QpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaXRlbTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IGdldENhbGxiYWNrcygpIHsKLSAgICAgICAgQXJyYXlNYXA8UGxheWxpc3RFdmVudENhbGxiYWNrLCBFeGVjdXRvcj4gY2FsbGJhY2tzID0gbmV3IEFycmF5TWFwPD4oKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgY2FsbGJhY2tzLnB1dEFsbChtQ2FsbGJhY2tzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY2FsbGJhY2tzOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVjNjA0Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvbjJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX0NVU1RPTTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yLlRZUEVfTElCUkFSWV9TRVJWSUNFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OX1NFUlZJQ0U7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUmVzb2x2ZUluZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0ZvY3VzUmVxdWVzdDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjIuUGxheWJhY2tJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllckJhc2U7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllckJhc2UuUGxheWVyRXZlbnRDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZS5QbGF5ZXJTdGF0ZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudC5QbGF5bGlzdEV2ZW50Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5CdWlsZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5Db21tYW5kQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmRHcm91cDI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbnRyb2xsZXJJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5PbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5TZXNzaW9uQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbk1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFTZXNzaW9uMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlBhcmNlbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Qcm9jZXNzOwotaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uR3VhcmRlZEJ5OwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi1wdWJsaWMgY2xhc3MgTWVkaWFTZXNzaW9uMkltcGwgaW1wbGVtZW50cyBNZWRpYVNlc3Npb24yUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFTZXNzaW9uMiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7Ly9Mb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFTZXNzaW9uMiBtSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1JZDsKLSAgICBwcml2YXRlIGZpbmFsIEV4ZWN1dG9yIG1DYWxsYmFja0V4ZWN1dG9yOwotICAgIHByaXZhdGUgZmluYWwgU2Vzc2lvbkNhbGxiYWNrIG1DYWxsYmFjazsKLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhU2Vzc2lvbjJTdHViIG1TZXNzaW9uU3R1YjsKLSAgICBwcml2YXRlIGZpbmFsIFNlc3Npb25Ub2tlbjIgbVNlc3Npb25Ub2tlbjsKLSAgICBwcml2YXRlIGZpbmFsIEF1ZGlvTWFuYWdlciBtQXVkaW9NYW5hZ2VyOwotICAgIHByaXZhdGUgZmluYWwgUGVuZGluZ0ludGVudCBtU2Vzc2lvbkFjdGl2aXR5OwotICAgIHByaXZhdGUgZmluYWwgUGxheWVyRXZlbnRDYWxsYmFjayBtUGxheWVyRXZlbnRDYWxsYmFjazsKLSAgICBwcml2YXRlIGZpbmFsIFBsYXlsaXN0RXZlbnRDYWxsYmFjayBtUGxheWxpc3RFdmVudENhbGxiYWNrOwotCi0gICAgLy8gbVBsYXllciBpcyBzZXQgdG8gbnVsbCB3aGVuIHRoZSBzZXNzaW9uIGlzIGNsb3NlZCwgYW5kIHdlIHNob3VsZG4ndCB0aHJvdyBhbiBleGNlcHRpb24KLSAgICAvLyBub3IgbGVhdmUgbG9nIGFsd2F5cyBmb3IgdXNpbmcgbVBsYXllciB3aGVuIGl0J3MgbnVsbC4gSGVyZSdzIHRoZSByZWFzb24uCi0gICAgLy8gV2hlbiBhIE1lZGlhU2Vzc2lvbjIgaXMgY2xvc2VkLCB0aGVyZSBjb3VsZCBiZSBhIHBlbmRlZCBvcGVyYXRpb24gaW4gdGhlIHNlc3Npb24gY2FsbGJhY2sKLSAgICAvLyBleGVjdXRvciB0aGF0IG1heSB3YW50IHRvIGFjY2VzcyB0aGUgcGxheWVyLiBIZXJlJ3MgdGhlIHNhbXBsZSBjb2RlIHNuaXBwZXQgZm9yIHRoYXQuCi0gICAgLy8KLSAgICAvLyAgIHB1YmxpYyB2b2lkIG9uRm9vKCkgewotICAgIC8vICAgICBpZiAobVBsYXllciA9PSBudWxsKSByZXR1cm47IC8vIGZpcnN0IGNoZWNrCi0gICAgLy8gICAgIG1TZXNzaW9uQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRvcigoKSAtPiB7Ci0gICAgLy8gICAgICAgLy8gRXJyb3IuIFNlc3Npb24gbWF5IGJlIGNsb3NlZCBhbmQgbVBsYXllciBjYW4gYmUgbnVsbCBoZXJlLgotICAgIC8vICAgICAgIG1QbGF5ZXIuZm9vKCk7Ci0gICAgLy8gICAgIH0pOwotICAgIC8vICAgfQotICAgIC8vCi0gICAgLy8gQnkgYWRkaW5nIHByb3RlY3RpdmUgY29kZSwgd2UgY2FuIGFsc28gcHJvdGVjdCBBUElzIGZyb20gYmVpbmcgY2FsbGVkIGFmdGVyIHRoZSBjbG9zZSgpCi0gICAgLy8KLSAgICAvLyBUT0RPKGphZXdhbik6IFNob3VsZCB3ZSBwdXQgdm9sYXRpbGUgaGVyZT8KLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBNZWRpYVBsYXllckJhc2UgbVBsYXllcjsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBNZWRpYVBsYXlsaXN0QWdlbnQgbVBsYXlsaXN0QWdlbnQ7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgU2Vzc2lvblBsYXlsaXN0QWdlbnQgbVNlc3Npb25QbGF5bGlzdEFnZW50OwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIFZvbHVtZVByb3ZpZGVyMiBtVm9sdW1lUHJvdmlkZXI7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgUGxheWJhY2tJbmZvIG1QbGF5YmFja0luZm87Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgT25EYXRhU291cmNlTWlzc2luZ0hlbHBlciBtRHNtSGVscGVyOwotCi0gICAgLyoqCi0gICAgICogQ2FuIGJlIG9ubHkgY2FsbGVkIGJ5IHRoZSB7QGxpbmsgQnVpbGRlciNidWlsZCgpfS4KLSAgICAgKiBAcGFyYW0gY29udGV4dAotICAgICAqIEBwYXJhbSBwbGF5ZXIKLSAgICAgKiBAcGFyYW0gaWQKLSAgICAgKiBAcGFyYW0gcGxheWxpc3RBZ2VudAotICAgICAqIEBwYXJhbSB2b2x1bWVQcm92aWRlcgotICAgICAqIEBwYXJhbSBzZXNzaW9uQWN0aXZpdHkKLSAgICAgKiBAcGFyYW0gY2FsbGJhY2tFeGVjdXRvcgotICAgICAqIEBwYXJhbSBjYWxsYmFjawotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVNlc3Npb24ySW1wbChDb250ZXh0IGNvbnRleHQsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIsIFN0cmluZyBpZCwKLSAgICAgICAgICAgIE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIsCi0gICAgICAgICAgICBQZW5kaW5nSW50ZW50IHNlc3Npb25BY3Rpdml0eSwKLSAgICAgICAgICAgIEV4ZWN1dG9yIGNhbGxiYWNrRXhlY3V0b3IsIFNlc3Npb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAvLyBUT0RPKGphZXdhbik6IEtlZXAgb3RoZXIgcGFyYW1zLgotICAgICAgICBtSW5zdGFuY2UgPSBjcmVhdGVJbnN0YW5jZSgpOwotCi0gICAgICAgIC8vIEFyZ3VtZW50IGNoZWNrcyBhcmUgZG9uZSBieSBidWlsZGVyIGFscmVhZHkuCi0gICAgICAgIC8vIEluaXRpYWxpemUgZmluYWxzIGZpcnN0LgotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIG1JZCA9IGlkOwotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IgPSBjYWxsYmFja0V4ZWN1dG9yOwotICAgICAgICBtU2Vzc2lvbkFjdGl2aXR5ID0gc2Vzc2lvbkFjdGl2aXR5OwotICAgICAgICBtU2Vzc2lvblN0dWIgPSBuZXcgTWVkaWFTZXNzaW9uMlN0dWIodGhpcyk7Ci0gICAgICAgIG1BdWRpb01hbmFnZXIgPSAoQXVkaW9NYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BVURJT19TRVJWSUNFKTsKLSAgICAgICAgbVBsYXllckV2ZW50Q2FsbGJhY2sgPSBuZXcgTXlQbGF5ZXJFdmVudENhbGxiYWNrKHRoaXMpOwotICAgICAgICBtUGxheWxpc3RFdmVudENhbGxiYWNrID0gbmV3IE15UGxheWxpc3RFdmVudENhbGxiYWNrKHRoaXMpOwotCi0gICAgICAgIC8vIEluZmVyIHR5cGUgZnJvbSB0aGUgaWQgYW5kIHBhY2thZ2UgbmFtZS4KLSAgICAgICAgU3RyaW5nIGxpYnJhcnlTZXJ2aWNlID0gZ2V0U2VydmljZU5hbWUoY29udGV4dCwgTWVkaWFMaWJyYXJ5U2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UsIGlkKTsKLSAgICAgICAgU3RyaW5nIHNlc3Npb25TZXJ2aWNlID0gZ2V0U2VydmljZU5hbWUoY29udGV4dCwgTWVkaWFTZXNzaW9uU2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UsIGlkKTsKLSAgICAgICAgaWYgKHNlc3Npb25TZXJ2aWNlICE9IG51bGwgJiYgbGlicmFyeVNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQW1iaWd1b3VzIHNlc3Npb24gdHlwZS4gTXVsdGlwbGUiCi0gICAgICAgICAgICAgICAgICAgICsgIiBzZXNzaW9uIHNlcnZpY2VzIGRlZmluZSB0aGUgc2FtZSBpZD0iICsgaWQpOwotICAgICAgICB9IGVsc2UgaWYgKGxpYnJhcnlTZXJ2aWNlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TZXNzaW9uVG9rZW4gPSBuZXcgU2Vzc2lvblRva2VuMkltcGwoUHJvY2Vzcy5teVVpZCgpLCBUWVBFX0xJQlJBUllfU0VSVklDRSwKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgbGlicmFyeVNlcnZpY2UsIGlkLCBtU2Vzc2lvblN0dWIpLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc2Vzc2lvblNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbVNlc3Npb25Ub2tlbiA9IG5ldyBTZXNzaW9uVG9rZW4ySW1wbChQcm9jZXNzLm15VWlkKCksIFRZUEVfU0VTU0lPTl9TRVJWSUNFLAotICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLCBzZXNzaW9uU2VydmljZSwgaWQsIG1TZXNzaW9uU3R1YikuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1TZXNzaW9uVG9rZW4gPSBuZXcgU2Vzc2lvblRva2VuMkltcGwoUHJvY2Vzcy5teVVpZCgpLCBUWVBFX1NFU1NJT04sCi0gICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIG51bGwsIGlkLCBtU2Vzc2lvblN0dWIpLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB1cGRhdGVQbGF5ZXIocGxheWVyLCBwbGF5bGlzdEFnZW50LCB2b2x1bWVQcm92aWRlcik7Ci0KLSAgICAgICAgLy8gQXNrIHNlcnZlciBmb3IgdGhlIHNhbml0eSBjaGVjaywgYW5kIHN0YXJ0cwotICAgICAgICAvLyBTYW5pdHkgY2hlY2sgZm9yIG1ha2luZyBzZXNzaW9uIElEIHVuaXF1ZSAncGVyIHBhY2thZ2UnIGNhbm5vdCBiZSBkb25lIGluIGhlcmUuCi0gICAgICAgIC8vIFNlcnZlciBjYW4gb25seSBrbm93IGlmIHRoZSBwYWNrYWdlIGhhcyBhbm90aGVyIHByb2Nlc3MgYW5kIGhhcyBhbm90aGVyIHNlc3Npb24gd2l0aCB0aGUKLSAgICAgICAgLy8gc2FtZSBpZC4gTm90ZSB0aGF0ICdJRCBpcyB1bmlxdWUgcGVyIHBhY2thZ2UnIGlzIGltcG9ydGFudCBmb3IgY29udHJvbGxlciB0byBkaXN0aW5ndWlzaAotICAgICAgICAvLyBhIHNlc3Npb24gaW4gYW5vdGhlciBwYWNrYWdlLgotICAgICAgICBNZWRpYVNlc3Npb25NYW5hZ2VyIG1hbmFnZXIgPQotICAgICAgICAgICAgICAgIChNZWRpYVNlc3Npb25NYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTUVESUFfU0VTU0lPTl9TRVJWSUNFKTsKLSAgICAgICAgaWYgKCFtYW5hZ2VyLmNyZWF0ZVNlc3Npb24yKG1TZXNzaW9uVG9rZW4pKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJTZXNzaW9uIHdpdGggdGhlIHNhbWUgaWQgaXMgYWxyZWFkeSB1c2VkIGJ5IgotICAgICAgICAgICAgICAgICAgICArICIgYW5vdGhlciBwcm9jZXNzLiBVc2UgTWVkaWFDb250cm9sbGVyMiBpbnN0ZWFkLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgTWVkaWFTZXNzaW9uMiBjcmVhdGVJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24yKHRoaXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTZXJ2aWNlTmFtZShDb250ZXh0IGNvbnRleHQsIFN0cmluZyBzZXJ2aWNlQWN0aW9uLCBTdHJpbmcgaWQpIHsKLSAgICAgICAgUGFja2FnZU1hbmFnZXIgbWFuYWdlciA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKLSAgICAgICAgSW50ZW50IHNlcnZpY2VJbnRlbnQgPSBuZXcgSW50ZW50KHNlcnZpY2VBY3Rpb24pOwotICAgICAgICBzZXJ2aWNlSW50ZW50LnNldFBhY2thZ2UoY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgTGlzdDxSZXNvbHZlSW5mbz4gc2VydmljZXMgPSBtYW5hZ2VyLnF1ZXJ5SW50ZW50U2VydmljZXMoc2VydmljZUludGVudCwKLSAgICAgICAgICAgICAgICBQYWNrYWdlTWFuYWdlci5HRVRfTUVUQV9EQVRBKTsKLSAgICAgICAgU3RyaW5nIHNlcnZpY2VOYW1lID0gbnVsbDsKLSAgICAgICAgaWYgKHNlcnZpY2VzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2VydmljZUlkID0gU2Vzc2lvblRva2VuMkltcGwuZ2V0U2Vzc2lvbklkKHNlcnZpY2VzLmdldChpKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VJZCAhPSBudWxsICYmIFRleHRVdGlscy5lcXVhbHMoaWQsIHNlcnZpY2VJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlcnZpY2VzLmdldChpKS5zZXJ2aWNlSW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZU5hbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQW1iaWd1b3VzIHNlc3Npb24gdHlwZS4gTXVsdGlwbGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBzZXNzaW9uIHNlcnZpY2VzIGRlZmluZSB0aGUgc2FtZSBpZD0iICsgaWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNlcnZpY2VOYW1lID0gc2VydmljZXMuZ2V0KGkpLnNlcnZpY2VJbmZvLm5hbWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZXJ2aWNlTmFtZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5ZXJfaW1wbChATm9uTnVsbCBNZWRpYVBsYXllckJhc2UgcGxheWVyLCBNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwKLSAgICAgICAgICAgIFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlcikgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgaWYgKHBsYXllciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwbGF5ZXIgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVQbGF5ZXIocGxheWVyLCBwbGF5bGlzdEFnZW50LCB2b2x1bWVQcm92aWRlcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBsYXllcihNZWRpYVBsYXllckJhc2UgcGxheWVyLCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQsCi0gICAgICAgICAgICBWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIG9sZFBsYXllcjsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IG9sZEFnZW50OwotICAgICAgICBmaW5hbCBQbGF5YmFja0luZm8gaW5mbyA9IGNyZWF0ZVBsYXliYWNrSW5mbyh2b2x1bWVQcm92aWRlciwgcGxheWVyLmdldEF1ZGlvQXR0cmlidXRlcygpKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgb2xkUGxheWVyID0gbVBsYXllcjsKLSAgICAgICAgICAgIG9sZEFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgICAgICBtUGxheWVyID0gcGxheWVyOwotICAgICAgICAgICAgaWYgKGFnZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2Vzc2lvblBsYXlsaXN0QWdlbnQgPSBuZXcgU2Vzc2lvblBsYXlsaXN0QWdlbnQodGhpcywgbVBsYXllcik7Ci0gICAgICAgICAgICAgICAgaWYgKG1Ec21IZWxwZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvblBsYXlsaXN0QWdlbnQuc2V0T25EYXRhU291cmNlTWlzc2luZ0hlbHBlcihtRHNtSGVscGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWdlbnQgPSBtU2Vzc2lvblBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUGxheWxpc3RBZ2VudCA9IGFnZW50OwotICAgICAgICAgICAgbVZvbHVtZVByb3ZpZGVyID0gdm9sdW1lUHJvdmlkZXI7Ci0gICAgICAgICAgICBtUGxheWJhY2tJbmZvID0gaW5mbzsKLSAgICAgICAgfQotICAgICAgICBpZiAocGxheWVyICE9IG9sZFBsYXllcikgewotICAgICAgICAgICAgcGxheWVyLnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhtQ2FsbGJhY2tFeGVjdXRvciwgbVBsYXllckV2ZW50Q2FsbGJhY2spOwotICAgICAgICAgICAgaWYgKG9sZFBsYXllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2FybmluZzogUG9vcmx5IGltcGxlbWVudCBwbGF5ZXIgbWF5IGlnbm9yZSB0aGlzCi0gICAgICAgICAgICAgICAgb2xkUGxheWVyLnVucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKG1QbGF5ZXJFdmVudENhbGxiYWNrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoYWdlbnQgIT0gb2xkQWdlbnQpIHsKLSAgICAgICAgICAgIGFnZW50LnJlZ2lzdGVyUGxheWxpc3RFdmVudENhbGxiYWNrKG1DYWxsYmFja0V4ZWN1dG9yLCBtUGxheWxpc3RFdmVudENhbGxiYWNrKTsKLSAgICAgICAgICAgIGlmIChvbGRBZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2FybmluZzogUG9vcmx5IGltcGxlbWVudCBwbGF5ZXIgbWF5IGlnbm9yZSB0aGlzCi0gICAgICAgICAgICAgICAgb2xkQWdlbnQudW5yZWdpc3RlclBsYXlsaXN0RXZlbnRDYWxsYmFjayhtUGxheWxpc3RFdmVudENhbGxiYWNrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChvbGRQbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBsYXliYWNrSW5mb0NoYW5nZWQoaW5mbyk7Ci0gICAgICAgICAgICBub3RpZnlQbGF5ZXJVcGRhdGVkTm90TG9ja2VkKG9sZFBsYXllcik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXBlYXQgdGhlIHNhbWUgdGhpbmcgZm9yIHRoZSBwbGF5bGlzdCBhZ2VudC4KLSAgICB9Ci0KLSAgICBwcml2YXRlIFBsYXliYWNrSW5mbyBjcmVhdGVQbGF5YmFja0luZm8oVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyLCBBdWRpb0F0dHJpYnV0ZXMgYXR0cnMpIHsKLSAgICAgICAgUGxheWJhY2tJbmZvIGluZm87Ci0gICAgICAgIGlmICh2b2x1bWVQcm92aWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgc3RyZWFtOwotICAgICAgICAgICAgaWYgKGF0dHJzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdHJlYW0gPSBBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzdHJlYW0gPSBhdHRycy5nZXRWb2x1bWVDb250cm9sU3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBBdWRpb01hbmFnZXIuVVNFX0RFRkFVTFRfU1RSRUFNX1RZUEUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSXQgbWF5IGhhcHBlbiBpZiB0aGUgQXVkaW9BdHRyaWJ1dGVzIGRvZXNuJ3QgaGF2ZSB1c2FnZS4KLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hhbmdlIGl0IHRvIHRoZSBTVFJFQU1fTVVTSUMgYmVjYXVzZSBpdCdzIG5vdCBzdXBwb3J0ZWQgYnkgYXVkaW8gbWFuYWdlcgotICAgICAgICAgICAgICAgICAgICAvLyBmb3IgcXVlcnlpbmcgdm9sdW1lIGxldmVsLgotICAgICAgICAgICAgICAgICAgICBzdHJlYW0gPSBBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGluZm8gPSBNZWRpYUNvbnRyb2xsZXIySW1wbC5QbGF5YmFja0luZm9JbXBsLmNyZWF0ZVBsYXliYWNrSW5mbygKLSAgICAgICAgICAgICAgICAgICAgUGxheWJhY2tJbmZvLlBMQVlCQUNLX1RZUEVfTE9DQUwsCi0gICAgICAgICAgICAgICAgICAgIGF0dHJzLAotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmlzVm9sdW1lRml4ZWQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gVm9sdW1lUHJvdmlkZXIyLlZPTFVNRV9DT05UUk9MX0ZJWEVECi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBWb2x1bWVQcm92aWRlcjIuVk9MVU1FX0NPTlRST0xfQUJTT0xVVEUsCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtTWF4Vm9sdW1lKHN0cmVhbSksCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtVm9sdW1lKHN0cmVhbSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW5mbyA9IE1lZGlhQ29udHJvbGxlcjJJbXBsLlBsYXliYWNrSW5mb0ltcGwuY3JlYXRlUGxheWJhY2tJbmZvKAotICAgICAgICAgICAgICAgICAgICBQbGF5YmFja0luZm8uUExBWUJBQ0tfVFlQRV9SRU1PVEUgLyogQ29udHJvbFR5cGUgKi8sCi0gICAgICAgICAgICAgICAgICAgIGF0dHJzLAotICAgICAgICAgICAgICAgICAgICB2b2x1bWVQcm92aWRlci5nZXRDb250cm9sVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICB2b2x1bWVQcm92aWRlci5nZXRNYXhWb2x1bWUoKSwKLSAgICAgICAgICAgICAgICAgICAgdm9sdW1lUHJvdmlkZXIuZ2V0Q3VycmVudFZvbHVtZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5mbzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbG9zZV9pbXBsKCkgewotICAgICAgICAvLyBTdG9wIHN5c3RlbSBzZXJ2aWNlIGZyb20gbGlzdGVuaW5nIHRoaXMgc2Vzc2lvbiBmaXJzdC4KLSAgICAgICAgTWVkaWFTZXNzaW9uTWFuYWdlciBtYW5hZ2VyID0KLSAgICAgICAgICAgICAgICAoTWVkaWFTZXNzaW9uTWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0Lk1FRElBX1NFU1NJT05fU0VSVklDRSk7Ci0gICAgICAgIG1hbmFnZXIuZGVzdHJveVNlc3Npb24yKG1TZXNzaW9uVG9rZW4pOwotCi0gICAgICAgIGlmIChtU2Vzc2lvblN0dWIgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAic2Vzc2lvbiBpcyBub3cgdW5hdmFpbGFibGUsIGlkPSIgKyBtSWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gSW52YWxpZGF0ZSBwcmV2aW91c2x5IHB1Ymxpc2hlZCBzZXNzaW9uIHN0dWIuCi0gICAgICAgICAgICBtU2Vzc2lvblN0dWIuZGVzdHJveU5vdExvY2tlZCgpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXI7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudDsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgcGxheWVyID0gbVBsYXllcjsKLSAgICAgICAgICAgIG1QbGF5ZXIgPSBudWxsOwotICAgICAgICAgICAgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgICAgIG1QbGF5bGlzdEFnZW50ID0gbnVsbDsKLSAgICAgICAgICAgIG1TZXNzaW9uUGxheWxpc3RBZ2VudCA9IG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBsYXllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBwbGF5ZXIudW5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2sobVBsYXllckV2ZW50Q2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC51bnJlZ2lzdGVyUGxheWxpc3RFdmVudENhbGxiYWNrKG1QbGF5bGlzdEV2ZW50Q2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhUGxheWVyQmFzZSBnZXRQbGF5ZXJfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFBsYXllcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYVBsYXlsaXN0QWdlbnQgZ2V0UGxheWxpc3RBZ2VudF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFZvbHVtZVByb3ZpZGVyMiBnZXRWb2x1bWVQcm92aWRlcl9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVZvbHVtZVByb3ZpZGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4yIGdldFRva2VuX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvblRva2VuOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PENvbnRyb2xsZXJJbmZvPiBnZXRDb25uZWN0ZWRDb250cm9sbGVyc19pbXBsKCkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25TdHViLmdldENvbnRyb2xsZXJzKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0QXVkaW9Gb2N1c1JlcXVlc3RfaW1wbChBdWRpb0ZvY3VzUmVxdWVzdCBhZnIpIHsKLSAgICAgICAgLy8gaW1wbGVtZW50Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGxheV9pbXBsKCkgewotICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBsYXllci5wbGF5KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwYXVzZV9pbXBsKCkgewotICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBsYXllci5wYXVzZSgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3RvcF9pbXBsKCkgewotICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBsYXllci5yZXNldCgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUGxheWxpc3RJdGVtX2ltcGwoQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LnNraXBUb1BsYXlsaXN0SXRlbShpdGVtKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNraXBUb1ByZXZpb3VzSXRlbV9pbXBsKCkgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LnNraXBUb1ByZXZpb3VzSXRlbSgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvTmV4dEl0ZW1faW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC5za2lwVG9OZXh0SXRlbSgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Q3VzdG9tTGF5b3V0X2ltcGwoQE5vbk51bGwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciwKLSAgICAgICAgICAgIEBOb25OdWxsIExpc3Q8Q29tbWFuZEJ1dHRvbj4gbGF5b3V0KSB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChsYXlvdXQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGF5b3V0IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeUN1c3RvbUxheW91dE5vdExvY2tlZChjb250cm9sbGVyLCBsYXlvdXQpOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gVE9ETyhqYWV3YW4pOiBJbXBsZW1lbnQgZm9sbG93cwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRBbGxvd2VkQ29tbWFuZHNfaW1wbChATm9uTnVsbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLAotICAgICAgICAgICAgQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmRHcm91cDIgY29tbWFuZHMpIHsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb21tYW5kcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kcyBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIG1TZXNzaW9uU3R1Yi5zZXRBbGxvd2VkQ29tbWFuZHMoY29udHJvbGxlciwgY29tbWFuZHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNlbmRDdXN0b21Db21tYW5kX2ltcGwoQE5vbk51bGwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciwKLSAgICAgICAgICAgIEBOb25OdWxsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBCdW5kbGUgYXJncywgUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBtU2Vzc2lvblN0dWIuc2VuZEN1c3RvbUNvbW1hbmQoY29udHJvbGxlciwgY29tbWFuZCwgYXJncywgcmVjZWl2ZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNlbmRDdXN0b21Db21tYW5kX2ltcGwoQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQsIEJ1bmRsZSBhcmdzKSB7Ci0gICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBtU2Vzc2lvblN0dWIuc2VuZEN1c3RvbUNvbW1hbmQoY29tbWFuZCwgYXJncyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UGxheWxpc3RfaW1wbChATm9uTnVsbCBMaXN0PE1lZGlhSXRlbTI+IGxpc3QsIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImxpc3Qgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQuc2V0UGxheWxpc3QobGlzdCwgbWV0YWRhdGEpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdXBkYXRlUGxheWxpc3RNZXRhZGF0YV9pbXBsKE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQudXBkYXRlUGxheWxpc3RNZXRhZGF0YShtZXRhZGF0YSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRQbGF5bGlzdEl0ZW1faW1wbChpbnQgaW5kZXgsIEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbmRleCBzaG91bGRuJ3QgYmUgbmVnYXRpdmUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC5hZGRQbGF5bGlzdEl0ZW0oaW5kZXgsIGl0ZW0pOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGxheWxpc3RJdGVtX2ltcGwoQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LnJlbW92ZVBsYXlsaXN0SXRlbShpdGVtKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VQbGF5bGlzdEl0ZW1faW1wbChpbnQgaW5kZXgsIEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbmRleCBzaG91bGRuJ3QgYmUgbmVnYXRpdmUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC5yZXBsYWNlUGxheWxpc3RJdGVtKGluZGV4LCBpdGVtKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaXN0PE1lZGlhSXRlbTI+IGdldFBsYXlsaXN0X2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGFnZW50LmdldFBsYXlsaXN0KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhTWV0YWRhdGEyIGdldFBsYXlsaXN0TWV0YWRhdGFfaW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWdlbnQuZ2V0UGxheWxpc3RNZXRhZGF0YSgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUl0ZW0yIGdldEN1cnJlbnRQbGF5bGlzdEl0ZW1faW1wbCgpIHsKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBJbXBsZW1lbnQKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRSZXBlYXRNb2RlX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGFnZW50LmdldFJlcGVhdE1vZGUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UmVwZWF0TW9kZV9pbXBsKGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQuc2V0UmVwZWF0TW9kZShyZXBlYXRNb2RlKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0U2h1ZmZsZU1vZGVfaW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWdlbnQuZ2V0U2h1ZmZsZU1vZGUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFNodWZmbGVNb2RlX2ltcGwoaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQuc2V0U2h1ZmZsZU1vZGUoc2h1ZmZsZU1vZGUpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZV9pbXBsKCkgewotICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBsYXllci5wcmVwYXJlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZWVrVG9faW1wbChsb25nIHBvcykgewotICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBsYXllci5zZWVrVG8ocG9zKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBAUGxheWVyU3RhdGUgaW50IGdldFBsYXllclN0YXRlX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWVyLmdldFBsYXllclN0YXRlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE1lZGlhUGxheWVyQmFzZS5QTEFZRVJfU1RBVEVfRVJST1I7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0Q3VycmVudFBvc2l0aW9uX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWVyLmdldEN1cnJlbnRQb3NpdGlvbigpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNZWRpYVBsYXllckJhc2UuVU5LTk9XTl9USU1FOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIGdldEJ1ZmZlcmVkUG9zaXRpb25faW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXIuZ2V0QnVmZmVyZWRQb3NpdGlvbigpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNZWRpYVBsYXllckJhc2UuVU5LTk9XTl9USU1FOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUVycm9yX2ltcGwoaW50IGVycm9yQ29kZSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5RXJyb3IoZXJyb3JDb2RlLCBleHRyYXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXJfaW1wbChATm9uTnVsbCBPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyIGhlbHBlcikgewotICAgICAgICBpZiAoaGVscGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImhlbHBlciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1Ec21IZWxwZXIgPSBoZWxwZXI7Ci0gICAgICAgICAgICBpZiAobVNlc3Npb25QbGF5bGlzdEFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2Vzc2lvblBsYXlsaXN0QWdlbnQuc2V0T25EYXRhU291cmNlTWlzc2luZ0hlbHBlcihoZWxwZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2xlYXJPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyX2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1Ec21IZWxwZXIgPSBudWxsOwotICAgICAgICAgICAgaWYgKG1TZXNzaW9uUGxheWxpc3RBZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlc3Npb25QbGF5bGlzdEFnZW50LmNsZWFyT25EYXRhU291cmNlTWlzc2luZ0hlbHBlcigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gUHJvdGVjdGVkIG9yIHByaXZhdGUgbWV0aG9kcwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgLy8gRW5mb3JjZXMgZGV2ZWxvcGVycyB0byBjYWxsIGFsbCB0aGUgbWV0aG9kcyBvbiB0aGUgaW5pdGlhbGx5IGdpdmVuIHRocmVhZAotICAgIC8vIGJlY2F1c2UgY2FsbHMgZnJvbSB0aGUgTWVkaWFDb250cm9sbGVyMiB3aWxsIGJlIHJ1biBvbiB0aGUgdGhyZWFkLgotICAgIC8vIFRPRE8oamFld2FuKTogU2hvdWxkIHdlIGFsbG93IGNhbGxzIGZyb20gdGhlIG11bHRpcGxlIHRocmVhZD8KLSAgICAvLyAgICAgICAgICAgICAgIEkgcHJlZmVyIHRoaXMgd2F5IGJlY2F1c2UgYWxsb3dpbmcgbXVsdGlwbGUgdGhyZWFkIG1heSBjYXNlIHRyaWNreSBpc3N1ZSBsaWtlCi0gICAgLy8gICAgICAgICAgICAgICBiLzYzNDQ2MzYwLiBJZiB0aGUge0BsaW5rICNzZXRQbGF5ZXIoKX0gd2l0aCB7QGNvZGUgbnVsbH0gY2FuIGJlIGNhbGxlZCBmcm9tCi0gICAgLy8gICAgICAgICAgICAgICBhbm90aGVyIHRocmVhZCwgdHJhbnNwb3J0IGNvbnRyb2xzIGNhbiBiZSBjYWxsZWQgYWZ0ZXIgdGhhdC4KLSAgICAvLyAgICAgICAgICAgICAgIFRoYXQncyBiYXNpY2FsbHkgdGhlIGRldmVsb3BlcidzIG1pc3Rha2UsIGJ1dCB0aGV5IGNhbm5vdCB1bmRlcnN0YW5kIHdoYXQncwotICAgIC8vICAgICAgICAgICAgICAgaGFwcGVuaW5nIGJlaGluZCB1bnRpbCB3ZSB0ZWxsIHRoZW0gc28uCi0gICAgLy8gICAgICAgICAgICAgICBJZiBlbmZvcmNpbmcgY2FsbGxpbmcgdGhyZWFkIGRvZXNuJ3QgbG9vayBnb29kLCB3ZSBjYW4gYWx0ZXJuYXRpdmVseSBwaWNrCi0gICAgLy8gICAgICAgICAgICAgICAxLiBBbGxvdyBjYWxscyBmcm9tIHJhbmRvbSB0aHJlYWRzIGZvciBhbGwgbWV0aG9kcy4KLSAgICAvLyAgICAgICAgICAgICAgIDIuIEFsbG93IGNhbGxzIGZyb20gcmFuZG9tIHRocmVhZHMgZm9yIGFsbCBtZXRob2RzLCBleGNlcHQgZm9yIHRoZQotICAgIC8vICAgICAgICAgICAgICAgICAge0BsaW5rICNzZXRQbGF5ZXIoKX0uCi0gICAgdm9pZCBlbnN1cmVDYWxsaW5nVGhyZWFkKCkgewotICAgICAgICAvLyBUT0RPKGphZXdhbik6IFVuY29tbWVudCBvciByZW1vdmUKLSAgICAgICAgLyoKLSAgICAgICAgaWYgKG1IYW5kbGVyLmdldExvb3BlcigpICE9IExvb3Blci5teUxvb3BlcigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJSdW4gdGhpcyBvbiB0aGUgZ2l2ZW4gdGhyZWFkIik7Ci0gICAgICAgIH0qLwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnlQbGF5bGlzdENoYW5nZWRPbkV4ZWN1dG9yKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBsaXN0LCBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBpZiAocGxheWxpc3RBZ2VudCAhPSBtUGxheWxpc3RBZ2VudCkgewotICAgICAgICAgICAgLy8gSWdub3JlIGNhbGxzIGZyb20gdGhlIG9sZCBhZ2VudC4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWQobUluc3RhbmNlLCBwbGF5bGlzdEFnZW50LCBsaXN0LCBtZXRhZGF0YSk7Ci0gICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlQbGF5bGlzdENoYW5nZWROb3RMb2NrZWQobGlzdCwgbWV0YWRhdGEpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnlQbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZE9uRXhlY3V0b3IoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBpZiAocGxheWxpc3RBZ2VudCAhPSBtUGxheWxpc3RBZ2VudCkgewotICAgICAgICAgICAgLy8gSWdub3JlIGNhbGxzIGZyb20gdGhlIG9sZCBhZ2VudC4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2sub25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZChtSW5zdGFuY2UsIHBsYXlsaXN0QWdlbnQsIG1ldGFkYXRhKTsKLSAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkTm90TG9ja2VkKG1ldGFkYXRhKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5UmVwZWF0TW9kZUNoYW5nZWRPbkV4ZWN1dG9yKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgaWYgKHBsYXlsaXN0QWdlbnQgIT0gbVBsYXlsaXN0QWdlbnQpIHsKLSAgICAgICAgICAgIC8vIElnbm9yZSBjYWxscyBmcm9tIHRoZSBvbGQgYWdlbnQuCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWQobUluc3RhbmNlLCBwbGF5bGlzdEFnZW50LCByZXBlYXRNb2RlKTsKLSAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVJlcGVhdE1vZGVDaGFuZ2VkTm90TG9ja2VkKHJlcGVhdE1vZGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnlTaHVmZmxlTW9kZUNoYW5nZWRPbkV4ZWN1dG9yKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgIGlmIChwbGF5bGlzdEFnZW50ICE9IG1QbGF5bGlzdEFnZW50KSB7Ci0gICAgICAgICAgICAvLyBJZ25vcmUgY2FsbHMgZnJvbSB0aGUgb2xkIGFnZW50LgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZChtSW5zdGFuY2UsIHBsYXlsaXN0QWdlbnQsIHNodWZmbGVNb2RlKTsKLSAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVNodWZmbGVNb2RlQ2hhbmdlZE5vdExvY2tlZChzaHVmZmxlTW9kZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeVBsYXllclVwZGF0ZWROb3RMb2NrZWQoTWVkaWFQbGF5ZXJCYXNlIG9sZFBsYXllcikgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXllckJhc2UgcGxheWVyID0gbVBsYXllcjsKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiAoQ2FuIGJlIHBvc3QtUCkgRmluZCBiZXR0ZXIgd2F5IGZvciBwbGF5ZXIuZ2V0UGxheWVyU3RhdGUoKSAvLwotICAgICAgICAvLyAgICAgICAgICAgICAgIEluIHRoZW9yeSwgU2Vzc2lvbi5nZXRYWFgoKSBtYXkgbm90IGJlIHRoZSBzYW1lIGFzIFBsYXllci5nZXRYWFgoKQotICAgICAgICAvLyAgICAgICAgICAgICAgIGFuZCB3ZSBzaG91bGQgbm90aWZ5IGluZm9ybWF0aW9uIG9mIHRoZSBzZXNzaW9uLmdldFhYWCgpIGluc3RlYWQgb2YKLSAgICAgICAgLy8gICAgICAgICAgICAgICBwbGF5ZXIuZ2V0WFhYKCkKLSAgICAgICAgLy8gTm90aWZ5IHRvIGNvbnRyb2xsZXJzIGFzIHdlbGwuCi0gICAgICAgIGZpbmFsIGludCBzdGF0ZSA9IHBsYXllci5nZXRQbGF5ZXJTdGF0ZSgpOwotICAgICAgICBpZiAoc3RhdGUgIT0gb2xkUGxheWVyLmdldFBsYXllclN0YXRlKCkpIHsKLSAgICAgICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlQbGF5ZXJTdGF0ZUNoYW5nZWROb3RMb2NrZWQoc3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgbG9uZyBjdXJyZW50VGltZU1zID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgIGZpbmFsIGxvbmcgcG9zaXRpb24gPSBwbGF5ZXIuZ2V0Q3VycmVudFBvc2l0aW9uKCk7Ci0gICAgICAgIGlmIChwb3NpdGlvbiAhPSBvbGRQbGF5ZXIuZ2V0Q3VycmVudFBvc2l0aW9uKCkpIHsKLSAgICAgICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlQb3NpdGlvbkNoYW5nZWROb3RMb2NrZWQoY3VycmVudFRpbWVNcywgcG9zaXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgZmxvYXQgc3BlZWQgPSBwbGF5ZXIuZ2V0UGxheWJhY2tTcGVlZCgpOwotICAgICAgICBpZiAoc3BlZWQgIT0gb2xkUGxheWVyLmdldFBsYXliYWNrU3BlZWQoKSkgewotICAgICAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBsYXliYWNrU3BlZWRDaGFuZ2VkTm90TG9ja2VkKHNwZWVkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGxvbmcgYnVmZmVyZWRQb3NpdGlvbiA9IHBsYXllci5nZXRCdWZmZXJlZFBvc2l0aW9uKCk7Ci0gICAgICAgIGlmIChidWZmZXJlZFBvc2l0aW9uICE9IG9sZFBsYXllci5nZXRCdWZmZXJlZFBvc2l0aW9uKCkpIHsKLSAgICAgICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlCdWZmZXJlZFBvc2l0aW9uQ2hhbmdlZE5vdExvY2tlZChidWZmZXJlZFBvc2l0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIG1Db250ZXh0OwotICAgIH0KLQotICAgIE1lZGlhU2Vzc2lvbjIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgfQotCi0gICAgTWVkaWFQbGF5ZXJCYXNlIGdldFBsYXllcigpIHsKLSAgICAgICAgcmV0dXJuIG1QbGF5ZXI7Ci0gICAgfQotCi0gICAgTWVkaWFQbGF5bGlzdEFnZW50IGdldFBsYXlsaXN0QWdlbnQoKSB7Ci0gICAgICAgIHJldHVybiBtUGxheWxpc3RBZ2VudDsKLSAgICB9Ci0KLSAgICBFeGVjdXRvciBnZXRDYWxsYmFja0V4ZWN1dG9yKCkgewotICAgICAgICByZXR1cm4gbUNhbGxiYWNrRXhlY3V0b3I7Ci0gICAgfQotCi0gICAgU2Vzc2lvbkNhbGxiYWNrIGdldENhbGxiYWNrKCkgewotICAgICAgICByZXR1cm4gbUNhbGxiYWNrOwotICAgIH0KLQotICAgIE1lZGlhU2Vzc2lvbjJTdHViIGdldFNlc3Npb25TdHViKCkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25TdHViOwotICAgIH0KLQotICAgIFZvbHVtZVByb3ZpZGVyMiBnZXRWb2x1bWVQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1Wb2x1bWVQcm92aWRlcjsKLSAgICB9Ci0KLSAgICBQbGF5YmFja0luZm8gZ2V0UGxheWJhY2tJbmZvKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrSW5mbzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIFBlbmRpbmdJbnRlbnQgZ2V0U2Vzc2lvbkFjdGl2aXR5KCkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25BY3Rpdml0eTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNeVBsYXllckV2ZW50Q2FsbGJhY2sgZXh0ZW5kcyBQbGF5ZXJFdmVudENhbGxiYWNrIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPE1lZGlhU2Vzc2lvbjJJbXBsPiBtU2Vzc2lvbjsKLQotICAgICAgICBwcml2YXRlIE15UGxheWVyRXZlbnRDYWxsYmFjayhNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvbiA9IG5ldyBXZWFrUmVmZXJlbmNlPD4oc2Vzc2lvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQoTWVkaWFQbGF5ZXJCYXNlIG1wYiwgRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgICAgICBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCB8fCBkc2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IGdldE1lZGlhSXRlbShzZXNzaW9uLCBkc2QpOwotICAgICAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25DdXJyZW50TWVkaWFJdGVtQ2hhbmdlZChzZXNzaW9uLmdldEluc3RhbmNlKCksIG1wYiwgaXRlbSk7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyAoamFld2FuKTogTm90aWZ5IGNvbnRyb2xsZXJzIHRocm91Z2ggYXBwcm9wcmlhdGUgY2FsbGJhY2suIChiLzc0NTA1OTM2KQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25NZWRpYVByZXBhcmVkKE1lZGlhUGxheWVyQmFzZSBtcGIsIERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICAgICAgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgfHwgZHNkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBnZXRNZWRpYUl0ZW0oc2Vzc2lvbiwgZHNkKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uTWVkaWFQcmVwYXJlZChzZXNzaW9uLmdldEluc3RhbmNlKCksIG1wYiwgaXRlbSk7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyAoamFld2FuKTogTm90aWZ5IGNvbnRyb2xsZXJzIHRocm91Z2ggYXBwcm9wcmlhdGUgY2FsbGJhY2suIChiLzc0NTA1OTM2KQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5ZXJTdGF0ZUNoYW5nZWQoTWVkaWFQbGF5ZXJCYXNlIG1wYiwgaW50IHN0YXRlKSB7Ci0gICAgICAgICAgICBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblBsYXllclN0YXRlQ2hhbmdlZChzZXNzaW9uLmdldEluc3RhbmNlKCksIG1wYiwgc3RhdGUpOwotICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0U2Vzc2lvblN0dWIoKS5ub3RpZnlQbGF5ZXJTdGF0ZUNoYW5nZWROb3RMb2NrZWQoc3RhdGUpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25CdWZmZXJpbmdTdGF0ZUNoYW5nZWQoTWVkaWFQbGF5ZXJCYXNlIG1wYiwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgc3RhdGUpIHsKLSAgICAgICAgICAgIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsIHx8IGRzZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gZ2V0TWVkaWFJdGVtKHNlc3Npb24sIGRzZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkJ1ZmZlcmluZ1N0YXRlQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgbXBiLCBpdGVtLCBzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyAoamFld2FuKTogTm90aWZ5IGNvbnRyb2xsZXJzIHRocm91Z2ggYXBwcm9wcmlhdGUgY2FsbGJhY2suIChiLzc0NTA1OTM2KQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbjJJbXBsIGdldFNlc3Npb24oKSB7Ci0gICAgICAgICAgICBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gbVNlc3Npb24uZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsICYmIERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2Vzc2lvbiBpcyBjbG9zZWQiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNlc3Npb247Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIE1lZGlhSXRlbTIgZ2V0TWVkaWFJdGVtKE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24sIERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICAgICAgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gc2Vzc2lvbi5nZXRQbGF5bGlzdEFnZW50KCk7Ci0gICAgICAgICAgICBpZiAoYWdlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTZXNzaW9uIGlzIGNsb3NlZCIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gYWdlbnQuZ2V0TWVkaWFJdGVtKGRzZCk7Ci0gICAgICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNvdWxkIG5vdCBmaW5kIG1hdGNoaW5nIGl0ZW0gZm9yIGRzZD0iICsgZHNkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBpdGVtOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgZXh0ZW5kcyBQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgewotICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8TWVkaWFTZXNzaW9uMkltcGw+IG1TZXNzaW9uOwotCi0gICAgICAgIHByaXZhdGUgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2soTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbikgewotICAgICAgICAgICAgbVNlc3Npb24gPSBuZXcgV2Vha1JlZmVyZW5jZTw+KHNlc3Npb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWxpc3RDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBMaXN0PE1lZGlhSXRlbTI+IGxpc3QsCi0gICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBtU2Vzc2lvbi5nZXQoKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLm5vdGlmeVBsYXlsaXN0Q2hhbmdlZE9uRXhlY3V0b3IocGxheWxpc3RBZ2VudCwgbGlzdCwgbWV0YWRhdGEpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBtU2Vzc2lvbi5nZXQoKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLm5vdGlmeVBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkT25FeGVjdXRvcihwbGF5bGlzdEFnZW50LCBtZXRhZGF0YSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25SZXBlYXRNb2RlQ2hhbmdlZChNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwgaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBtU2Vzc2lvbi5nZXQoKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLm5vdGlmeVJlcGVhdE1vZGVDaGFuZ2VkT25FeGVjdXRvcihwbGF5bGlzdEFnZW50LCByZXBlYXRNb2RlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNodWZmbGVNb2RlQ2hhbmdlZChNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwgaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgICAgICBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gbVNlc3Npb24uZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5ub3RpZnlTaHVmZmxlTW9kZUNoYW5nZWRPbkV4ZWN1dG9yKHBsYXlsaXN0QWdlbnQsIHNodWZmbGVNb2RlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQ29tbWFuZEltcGwgaW1wbGVtZW50cyBDb21tYW5kUHJvdmlkZXIgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTU1BTkRfQ09ERQotICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZC5jb21tYW5kX2NvZGUiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTU1BTkRfQ1VTVE9NX0NPTU1BTkQKLSAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmQuY3VzdG9tX2NvbW1hbmQiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTU1BTkRfRVhUUkFTCi0gICAgICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5jb21tYW5kLmV4dHJhcyI7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uQ29tbWFuZDIgbUluc3RhbmNlOwotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtQ29tbWFuZENvZGU7Ci0gICAgICAgIC8vIE5vbm51bGwgaWYgaXQncyBjdXN0b20gY29tbWFuZAotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtQ3VzdG9tQ29tbWFuZDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUV4dHJhczsKLQotICAgICAgICBwdWJsaWMgQ29tbWFuZEltcGwoU2Vzc2lvbkNvbW1hbmQyIGluc3RhbmNlLCBpbnQgY29tbWFuZENvZGUpIHsKLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICAgICAgbUNvbW1hbmRDb2RlID0gY29tbWFuZENvZGU7Ci0gICAgICAgICAgICBtQ3VzdG9tQ29tbWFuZCA9IG51bGw7Ci0gICAgICAgICAgICBtRXh0cmFzID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDb21tYW5kSW1wbChTZXNzaW9uQ29tbWFuZDIgaW5zdGFuY2UsIEBOb25OdWxsIFN0cmluZyBhY3Rpb24sCi0gICAgICAgICAgICAgICAgQE51bGxhYmxlIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIGlmIChhY3Rpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImFjdGlvbiBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBtQ29tbWFuZENvZGUgPSBDT01NQU5EX0NPREVfQ1VTVE9NOwotICAgICAgICAgICAgbUN1c3RvbUNvbW1hbmQgPSBhY3Rpb247Ci0gICAgICAgICAgICBtRXh0cmFzID0gZXh0cmFzOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29tbWFuZENvZGVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29tbWFuZENvZGU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEBOdWxsYWJsZSBTdHJpbmcgZ2V0Q3VzdG9tQ29tbWFuZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1DdXN0b21Db21tYW5kOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBATnVsbGFibGUgQnVuZGxlIGdldEV4dHJhc19pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1FeHRyYXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiBhIG5ldyBCdW5kbGUgaW5zdGFuY2UgZnJvbSB0aGUgQ29tbWFuZAotICAgICAgICAgKi8KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdW5kbGUgdG9CdW5kbGVfaW1wbCgpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBidW5kbGUucHV0SW50KEtFWV9DT01NQU5EX0NPREUsIG1Db21tYW5kQ29kZSk7Ci0gICAgICAgICAgICBidW5kbGUucHV0U3RyaW5nKEtFWV9DT01NQU5EX0NVU1RPTV9DT01NQU5ELCBtQ3VzdG9tQ29tbWFuZCk7Ci0gICAgICAgICAgICBidW5kbGUucHV0QnVuZGxlKEtFWV9DT01NQU5EX0VYVFJBUywgbUV4dHJhcyk7Ci0gICAgICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEByZXR1cm4gYSBuZXcgQ29tbWFuZCBpbnN0YW5jZSBmcm9tIHRoZSBCdW5kbGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgU2Vzc2lvbkNvbW1hbmQyIGZyb21CdW5kbGVfaW1wbChATm9uTnVsbCBCdW5kbGUgY29tbWFuZCkgewotICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBjb2RlID0gY29tbWFuZC5nZXRJbnQoS0VZX0NPTU1BTkRfQ09ERSk7Ci0gICAgICAgICAgICBpZiAoY29kZSAhPSBDT01NQU5EX0NPREVfQ1VTVE9NKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uQ29tbWFuZDIoY29kZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFN0cmluZyBjdXN0b21Db21tYW5kID0gY29tbWFuZC5nZXRTdHJpbmcoS0VZX0NPTU1BTkRfQ1VTVE9NX0NPTU1BTkQpOwotICAgICAgICAgICAgICAgIGlmIChjdXN0b21Db21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2Vzc2lvbkNvbW1hbmQyKGN1c3RvbUNvbW1hbmQsIGNvbW1hbmQuZ2V0QnVuZGxlKEtFWV9DT01NQU5EX0VYVFJBUykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFsc19pbXBsKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIENvbW1hbmRJbXBsKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbW1hbmRJbXBsIG90aGVyID0gKENvbW1hbmRJbXBsKSBvYmo7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IENvbXBhcmUgQ29tbWFuZHMgd2l0aCB0aGUgZ2VuZXJhdGVkIFVVSUQsIGFzIHdlJ3JlIGRvaW5nIGZvciB0aGUgTUkyLgotICAgICAgICAgICAgcmV0dXJuIG1Db21tYW5kQ29kZSA9PSBvdGhlci5tQ29tbWFuZENvZGUKLSAgICAgICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmVxdWFscyhtQ3VzdG9tQ29tbWFuZCwgb3RoZXIubUN1c3RvbUNvbW1hbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGVfaW1wbCgpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBwcmltZSA9IDMxOwotICAgICAgICAgICAgcmV0dXJuICgobUN1c3RvbUNvbW1hbmQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgPyBtQ3VzdG9tQ29tbWFuZC5oYXNoQ29kZSgpIDogMCkgKiBwcmltZSArIG1Db21tYW5kQ29kZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcHJlc2VudCBzZXQgb2Yge0BsaW5rIFNlc3Npb25Db21tYW5kMn0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb21tYW5kR3JvdXBJbXBsIGltcGxlbWVudHMgQ29tbWFuZEdyb3VwUHJvdmlkZXIgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTU1BTkRTID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5tZWRpYXNlc3Npb24yLmNvbW1hbmRncm91cC5jb21tYW5kcyI7Ci0KLSAgICAgICAgLy8gUHJlZml4IGZvciBhbGwgY29tbWFuZCBjb2RlcwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0NPTU1BTkRfQ09ERSA9ICJDT01NQU5EX0NPREVfIjsKLQotICAgICAgICAvLyBQcmVmaXggZm9yIGNvbW1hbmQgY29kZXMgdGhhdCB3aWxsIGJlIHNlbnQgZGlyZWN0bHkgdG8gdGhlIE1lZGlhUGxheWVyQmFzZQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0NPTU1BTkRfQ09ERV9QTEFZQkFDSyA9ICJDT01NQU5EX0NPREVfUExBWUJBQ0tfIjsKLQotICAgICAgICAvLyBQcmVmaXggZm9yIGNvbW1hbmQgY29kZXMgdGhhdCB3aWxsIGJlIHNlbnQgZGlyZWN0bHkgdG8gdGhlIE1lZGlhUGxheWxpc3RBZ2VudAotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUFJFRklYX0NPTU1BTkRfQ09ERV9QTEFZTElTVCA9ICJDT01NQU5EX0NPREVfUExBWUxJU1RfIjsKLQotICAgICAgICBwcml2YXRlIFNldDxTZXNzaW9uQ29tbWFuZDI+IG1Db21tYW5kcyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBtSW5zdGFuY2U7Ci0KLSAgICAgICAgcHVibGljIENvbW1hbmRHcm91cEltcGwoU2Vzc2lvbkNvbW1hbmRHcm91cDIgaW5zdGFuY2UsIE9iamVjdCBvdGhlcikgewotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBpZiAob3RoZXIgIT0gbnVsbCAmJiBvdGhlciBpbnN0YW5jZW9mIENvbW1hbmRHcm91cEltcGwpIHsKLSAgICAgICAgICAgICAgICBtQ29tbWFuZHMuYWRkQWxsKCgoQ29tbWFuZEdyb3VwSW1wbCkgb3RoZXIpLm1Db21tYW5kcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ29tbWFuZEdyb3VwSW1wbCgpIHsKLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IG5ldyBTZXNzaW9uQ29tbWFuZEdyb3VwMih0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRDb21tYW5kX2ltcGwoQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQpIHsKLSAgICAgICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ29tbWFuZHMuYWRkKGNvbW1hbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZEFsbFByZWRlZmluZWRDb21tYW5kc19pbXBsKCkgewotICAgICAgICAgICAgYWRkQ29tbWFuZHNXaXRoUHJlZml4KFBSRUZJWF9DT01NQU5EX0NPREUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhZGRBbGxQbGF5YmFja0NvbW1hbmRzKCkgewotICAgICAgICAgICAgYWRkQ29tbWFuZHNXaXRoUHJlZml4KFBSRUZJWF9DT01NQU5EX0NPREVfUExBWUJBQ0spOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBhZGRBbGxQbGF5bGlzdENvbW1hbmRzKCkgewotICAgICAgICAgICAgYWRkQ29tbWFuZHNXaXRoUHJlZml4KFBSRUZJWF9DT01NQU5EX0NPREVfUExBWUxJU1QpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGFkZENvbW1hbmRzV2l0aFByZWZpeChTdHJpbmcgcHJlZml4KSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IChDYW4gYmUgcG9zdC1QKTogRG9uJ3QgdXNlIHJlZmxlY3Rpb24gZm9yIHRoaXMgcHVycG9zZS4KLSAgICAgICAgICAgIGZpbmFsIEZpZWxkW10gZmllbGRzID0gTWVkaWFTZXNzaW9uMi5jbGFzcy5nZXRGaWVsZHMoKTsKLSAgICAgICAgICAgIGlmIChmaWVsZHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZHNbaV0uZ2V0TmFtZSgpLnN0YXJ0c1dpdGgocHJlZml4KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tbWFuZHMuYWRkKG5ldyBTZXNzaW9uQ29tbWFuZDIoZmllbGRzW2ldLmdldEludChudWxsKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5leHBlY3RlZCAiICsgZmllbGRzW2ldICsgIiBpbiBNZWRpYVNlc3Npb24yIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlQ29tbWFuZF9pbXBsKEBOb25OdWxsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kKSB7Ci0gICAgICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNvbW1hbmRzLnJlbW92ZShjb21tYW5kKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb21tYW5kX2ltcGwoQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQpIHsKLSAgICAgICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbUNvbW1hbmRzLmNvbnRhaW5zKGNvbW1hbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbW1hbmRfaW1wbChpbnQgY29kZSkgewotICAgICAgICAgICAgaWYgKGNvZGUgPT0gQ09NTUFORF9DT0RFX0NVU1RPTSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVzZSBoYXNDb21tYW5kKENvbW1hbmQpIGZvciBjdXN0b20gY29tbWFuZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCA6IG1Db21tYW5kcykgewotICAgICAgICAgICAgICAgIGlmIChjb21tYW5kLmdldENvbW1hbmRDb2RlKCkgPT0gY29kZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFNldDxTZXNzaW9uQ29tbWFuZDI+IGdldENvbW1hbmRzX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q29tbWFuZHMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTZXQ8U2Vzc2lvbkNvbW1hbmQyPiBnZXRDb21tYW5kcygpIHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQobUNvbW1hbmRzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIG5ldyBidW5kbGUgZnJvbSB0aGUgQ29tbWFuZEdyb3VwCi0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1bmRsZSB0b0J1bmRsZV9pbXBsKCkgewotICAgICAgICAgICAgQXJyYXlMaXN0PEJ1bmRsZT4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCA6IG1Db21tYW5kcykgewotICAgICAgICAgICAgICAgIGxpc3QuYWRkKGNvbW1hbmQudG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgYnVuZGxlLnB1dFBhcmNlbGFibGVBcnJheUxpc3QoS0VZX0NPTU1BTkRTLCBsaXN0KTsKLSAgICAgICAgICAgIHJldHVybiBidW5kbGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiBuZXcgaW5zdGFuY2Ugb2YgQ29tbWFuZEdyb3VwIGZyb20gdGhlIGJ1bmRsZQotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBATnVsbGFibGUgU2Vzc2lvbkNvbW1hbmRHcm91cDIgZnJvbUJ1bmRsZV9pbXBsKEJ1bmRsZSBjb21tYW5kcykgewotICAgICAgICAgICAgaWYgKGNvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpc3Q8UGFyY2VsYWJsZT4gbGlzdCA9IGNvbW1hbmRzLmdldFBhcmNlbGFibGVBcnJheUxpc3QoS0VZX0NPTU1BTkRTKTsKLSAgICAgICAgICAgIGlmIChsaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGNvbW1hbmRHcm91cCA9IG5ldyBTZXNzaW9uQ29tbWFuZEdyb3VwMigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgUGFyY2VsYWJsZSBwYXJjZWxhYmxlID0gbGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKCEocGFyY2VsYWJsZSBpbnN0YW5jZW9mIEJ1bmRsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEJ1bmRsZSBjb21tYW5kQnVuZGxlID0gKEJ1bmRsZSkgcGFyY2VsYWJsZTsKLSAgICAgICAgICAgICAgICBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCA9IFNlc3Npb25Db21tYW5kMi5mcm9tQnVuZGxlKGNvbW1hbmRCdW5kbGUpOwotICAgICAgICAgICAgICAgIGlmIChjb21tYW5kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29tbWFuZEdyb3VwLmFkZENvbW1hbmQoY29tbWFuZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNvbW1hbmRHcm91cDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ29udHJvbGxlckluZm9JbXBsIGltcGxlbWVudHMgQ29udHJvbGxlckluZm9Qcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQ29udHJvbGxlckluZm8gbUluc3RhbmNlOwotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBtVWlkOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUGFja2FnZU5hbWU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtSXNUcnVzdGVkOwotICAgICAgICBwcml2YXRlIGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIG1Db250cm9sbGVyQmluZGVyOwotCi0gICAgICAgIHB1YmxpYyBDb250cm9sbGVySW5mb0ltcGwoQ29udGV4dCBjb250ZXh0LCBDb250cm9sbGVySW5mbyBpbnN0YW5jZSwgaW50IHVpZCwKLSAgICAgICAgICAgICAgICBpbnQgcGlkLCBATm9uTnVsbCBTdHJpbmcgcGFja2FnZU5hbWUsIEBOb25OdWxsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocGFja2FnZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFja2FnZU5hbWUgc2hvdWxkbid0IGJlIGVtcHR5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICAgICAgbVVpZCA9IHVpZDsKLSAgICAgICAgICAgIG1QYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotICAgICAgICAgICAgbUNvbnRyb2xsZXJCaW5kZXIgPSBjYWxsYmFjazsKLSAgICAgICAgICAgIE1lZGlhU2Vzc2lvbk1hbmFnZXIgbWFuYWdlciA9Ci0gICAgICAgICAgICAgICAgICAoTWVkaWFTZXNzaW9uTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTUVESUFfU0VTU0lPTl9TRVJWSUNFKTsKLSAgICAgICAgICAgIC8vIEFzayBzZXJ2ZXIgd2hldGhlciB0aGUgY29udHJvbGxlciBpcyB0cnVzdGVkLgotICAgICAgICAgICAgLy8gQXBwIGNhbm5vdCBrbm93IHRoaXMgYmVjYXVzZSBhcHBzIGNhbm5vdCBxdWVyeSBlbmFibGVkIG5vdGlmaWNhdGlvbiBsaXN0ZW5lciBmb3IKLSAgICAgICAgICAgIC8vIGFub3RoZXIgcGFja2FnZSwgYnV0IHN5c3RlbSBzZXJ2ZXIgY2FuIGRvLgotICAgICAgICAgICAgbUlzVHJ1c3RlZCA9IG1hbmFnZXIuaXNUcnVzdGVkRm9yTWVkaWFDb250cm9sKAotICAgICAgICAgICAgICAgICAgICBuZXcgTWVkaWFTZXNzaW9uTWFuYWdlci5SZW1vdGVVc2VySW5mbyhwYWNrYWdlTmFtZSwgcGlkLCB1aWQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBhY2thZ2VOYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0VWlkX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVVpZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1RydXN0ZWRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSXNUcnVzdGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbGxlckJpbmRlci5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFsc19pbXBsKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIENvbnRyb2xsZXJJbmZvKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBlcXVhbHMoKChDb250cm9sbGVySW5mbykgb2JqKS5nZXRQcm92aWRlcigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIkNvbnRyb2xsZXJJbmZvIHtwa2c9IiArIG1QYWNrYWdlTmFtZSArICIsIHVpZD0iICsgbVVpZCArICIsIHRydXN0ZWQ9IgotICAgICAgICAgICAgICAgICAgICArIG1Jc1RydXN0ZWQgKyAifSI7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbGxlckJpbmRlci5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBDb250cm9sbGVySW5mb0ltcGwpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29udHJvbGxlckluZm9JbXBsIG90aGVyID0gKENvbnRyb2xsZXJJbmZvSW1wbCkgb2JqOwotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyQmluZGVyLmFzQmluZGVyKCkuZXF1YWxzKG90aGVyLm1Db250cm9sbGVyQmluZGVyLmFzQmluZGVyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ29udHJvbGxlckluZm8gZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgSUJpbmRlciBnZXRJZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbGxlckJpbmRlci5hc0JpbmRlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgSU1lZGlhQ29udHJvbGxlcjIgZ2V0Q29udHJvbGxlckJpbmRlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbGxlckJpbmRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBDb250cm9sbGVySW5mb0ltcGwgZnJvbShDb250cm9sbGVySW5mbyBjb250cm9sbGVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gKENvbnRyb2xsZXJJbmZvSW1wbCkgY29udHJvbGxlci5nZXRQcm92aWRlcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb21tYW5kQnV0dG9uSW1wbCBpbXBsZW1lbnRzIENvbW1hbmRCdXR0b25Qcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NTUFORAotICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZF9idXR0b24uY29tbWFuZCI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfSUNPTl9SRVNfSUQKLSAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmRfYnV0dG9uLmljb25fcmVzX2lkIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ESVNQTEFZX05BTUUKLSAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmRfYnV0dG9uLmRpc3BsYXlfbmFtZSI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRVhUUkFTCi0gICAgICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5jb21tYW5kX2J1dHRvbi5leHRyYXMiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VOQUJMRUQKLSAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmRfYnV0dG9uLmVuYWJsZWQiOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgQ29tbWFuZEJ1dHRvbiBtSW5zdGFuY2U7Ci0gICAgICAgIHByaXZhdGUgU2Vzc2lvbkNvbW1hbmQyIG1Db21tYW5kOwotICAgICAgICBwcml2YXRlIGludCBtSWNvblJlc0lkOwotICAgICAgICBwcml2YXRlIFN0cmluZyBtRGlzcGxheU5hbWU7Ci0gICAgICAgIHByaXZhdGUgQnVuZGxlIG1FeHRyYXM7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRW5hYmxlZDsKLQotICAgICAgICBwdWJsaWMgQ29tbWFuZEJ1dHRvbkltcGwoQE51bGxhYmxlIFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBpbnQgaWNvblJlc0lkLAotICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBTdHJpbmcgZGlzcGxheU5hbWUsIEJ1bmRsZSBleHRyYXMsIGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICAgICAgbUNvbW1hbmQgPSBjb21tYW5kOwotICAgICAgICAgICAgbUljb25SZXNJZCA9IGljb25SZXNJZDsKLSAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotICAgICAgICAgICAgbUV4dHJhcyA9IGV4dHJhczsKLSAgICAgICAgICAgIG1FbmFibGVkID0gZW5hYmxlZDsKLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IG5ldyBDb21tYW5kQnV0dG9uKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBATnVsbGFibGUKLSAgICAgICAgU2Vzc2lvbkNvbW1hbmQyIGdldENvbW1hbmRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29tbWFuZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldEljb25SZXNJZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1JY29uUmVzSWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEBOdWxsYWJsZSBTdHJpbmcgZ2V0RGlzcGxheU5hbWVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGlzcGxheU5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEBOdWxsYWJsZSBCdW5kbGUgZ2V0RXh0cmFzX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUV4dHJhczsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRW5hYmxlZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBOb25OdWxsIEJ1bmRsZSB0b0J1bmRsZSgpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBidW5kbGUucHV0QnVuZGxlKEtFWV9DT01NQU5ELCBtQ29tbWFuZC50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX0lDT05fUkVTX0lELCBtSWNvblJlc0lkKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX0RJU1BMQVlfTkFNRSwgbURpc3BsYXlOYW1lKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRCdW5kbGUoS0VZX0VYVFJBUywgbUV4dHJhcyk7Ci0gICAgICAgICAgICBidW5kbGUucHV0Qm9vbGVhbihLRVlfRU5BQkxFRCwgbUVuYWJsZWQpOwotICAgICAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBATnVsbGFibGUgQ29tbWFuZEJ1dHRvbiBmcm9tQnVuZGxlKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyKCk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldENvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyLmZyb21CdW5kbGUoYnVuZGxlLmdldEJ1bmRsZShLRVlfQ09NTUFORCkpKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0SWNvblJlc0lkKGJ1bmRsZS5nZXRJbnQoS0VZX0lDT05fUkVTX0lELCAwKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldERpc3BsYXlOYW1lKGJ1bmRsZS5nZXRTdHJpbmcoS0VZX0RJU1BMQVlfTkFNRSkpOwotICAgICAgICAgICAgYnVpbGRlci5zZXRFeHRyYXMoYnVuZGxlLmdldEJ1bmRsZShLRVlfRVhUUkFTKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldEVuYWJsZWQoYnVuZGxlLmdldEJvb2xlYW4oS0VZX0VOQUJMRUQpKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gTWFsZm9ybWVkIG9yIHZlcnNpb24gbWlzbWF0Y2guIFJldHVybiBudWxsIGZvciBub3cuCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQnVpbGRlciBmb3Ige0BsaW5rIENvbW1hbmRCdXR0b259LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVySW1wbCBpbXBsZW1lbnRzIENvbW1hbmRCdXR0b25Qcm92aWRlci5CdWlsZGVyUHJvdmlkZXIgewotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb21tYW5kQnV0dG9uLkJ1aWxkZXIgbUluc3RhbmNlOwotICAgICAgICAgICAgcHJpdmF0ZSBTZXNzaW9uQ29tbWFuZDIgbUNvbW1hbmQ7Ci0gICAgICAgICAgICBwcml2YXRlIGludCBtSWNvblJlc0lkOwotICAgICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbURpc3BsYXlOYW1lOwotICAgICAgICAgICAgcHJpdmF0ZSBCdW5kbGUgbUV4dHJhczsKLSAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRW5hYmxlZDsKLQotICAgICAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKENvbW1hbmRCdXR0b24uQnVpbGRlciBpbnN0YW5jZSkgewotICAgICAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICAgICAgICAgIG1FbmFibGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIHNldENvbW1hbmRfaW1wbChTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCkgewotICAgICAgICAgICAgICAgIG1Db21tYW5kID0gY29tbWFuZDsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBDb21tYW5kQnV0dG9uLkJ1aWxkZXIgc2V0SWNvblJlc0lkX2ltcGwoaW50IHJlc0lkKSB7Ci0gICAgICAgICAgICAgICAgbUljb25SZXNJZCA9IHJlc0lkOwotICAgICAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIENvbW1hbmRCdXR0b24uQnVpbGRlciBzZXREaXNwbGF5TmFtZV9pbXBsKFN0cmluZyBkaXNwbGF5TmFtZSkgewotICAgICAgICAgICAgICAgIG1EaXNwbGF5TmFtZSA9IGRpc3BsYXlOYW1lOwotICAgICAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIENvbW1hbmRCdXR0b24uQnVpbGRlciBzZXRFbmFibGVkX2ltcGwoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgbUVuYWJsZWQgPSBlbmFibGVkOwotICAgICAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIENvbW1hbmRCdXR0b24uQnVpbGRlciBzZXRFeHRyYXNfaW1wbChCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICAgICAgbUV4dHJhcyA9IGV4dHJhczsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBDb21tYW5kQnV0dG9uIGJ1aWxkX2ltcGwoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1FbmFibGVkICYmIG1Db21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRW5hYmxlZCBidXR0b24gbmVlZHMgQ29tbWFuZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZm9yIGNvbnRyb2xsZXIgdG8gaW52b2tlIHRoZSBjb21tYW5kIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtQ29tbWFuZCAhPSBudWxsICYmIG1Db21tYW5kLmdldENvbW1hbmRDb2RlKCkgPT0gQ09NTUFORF9DT0RFX0NVU1RPTQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1JY29uUmVzSWQgPT0gMCB8fCBUZXh0VXRpbHMuaXNFbXB0eShtRGlzcGxheU5hbWUpKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDdXN0b20gY29tbWFuZHMgbmVlZHMgaWNvbiBhbmQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGFuZCBuYW1lIHRvIGRpc3BsYXkiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDb21tYW5kQnV0dG9uSW1wbChtQ29tbWFuZCwgbUljb25SZXNJZCwgbURpc3BsYXlOYW1lLCBtRXh0cmFzLCBtRW5hYmxlZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5tSW5zdGFuY2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEJ1aWxkZXJCYXNlSW1wbDxUIGV4dGVuZHMgTWVkaWFTZXNzaW9uMiwgQyBleHRlbmRzIFNlc3Npb25DYWxsYmFjaz4KLSAgICAgICAgICAgIGltcGxlbWVudHMgQnVpbGRlckJhc2VQcm92aWRlcjxULCBDPiB7Ci0gICAgICAgIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgICAgIE1lZGlhUGxheWVyQmFzZSBtUGxheWVyOwotICAgICAgICBTdHJpbmcgbUlkOwotICAgICAgICBFeGVjdXRvciBtQ2FsbGJhY2tFeGVjdXRvcjsKLSAgICAgICAgQyBtQ2FsbGJhY2s7Ci0gICAgICAgIE1lZGlhUGxheWxpc3RBZ2VudCBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgVm9sdW1lUHJvdmlkZXIyIG1Wb2x1bWVQcm92aWRlcjsKLSAgICAgICAgUGVuZGluZ0ludGVudCBtU2Vzc2lvbkFjdGl2aXR5OwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDb25zdHJ1Y3Rvci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNvbnRleHQgYSBjb250ZXh0Ci0gICAgICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSBwYXJhbWV0ZXIgaXMgbnVsbCwgb3IgdGhlIHBsYXllciBpcyBhCi0gICAgICAgICAqICAgICAge0BsaW5rIE1lZGlhU2Vzc2lvbjJ9IG9yIHtAbGluayBNZWRpYUNvbnRyb2xsZXIyfS4KLSAgICAgICAgICovCi0gICAgICAgIC8vIFRPRE8oamFld2FuKTogQWxzbyBuZWVkIGV4ZWN1dG9yCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyQmFzZUltcGwoQE5vbk51bGwgQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udGV4dCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICAgICAgLy8gRW5zdXJlIG5vbi1udWxsCi0gICAgICAgICAgICBtSWQgPSAiIjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQbGF5ZXJfaW1wbChATm9uTnVsbCBNZWRpYVBsYXllckJhc2UgcGxheWVyKSB7Ci0gICAgICAgICAgICBpZiAocGxheWVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwbGF5ZXIgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1QbGF5ZXIgPSBwbGF5ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0UGxheWxpc3RBZ2VudF9pbXBsKEBOb25OdWxsIE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50KSB7Ci0gICAgICAgICAgICBpZiAocGxheWxpc3RBZ2VudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGxheWxpc3RBZ2VudCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVBsYXlsaXN0QWdlbnQgPSBwbGF5bGlzdEFnZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFZvbHVtZVByb3ZpZGVyX2ltcGwoVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyKSB7Ci0gICAgICAgICAgICBtVm9sdW1lUHJvdmlkZXIgPSB2b2x1bWVQcm92aWRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uQWN0aXZpdHlfaW1wbChQZW5kaW5nSW50ZW50IHBpKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvbkFjdGl2aXR5ID0gcGk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0SWRfaW1wbChATm9uTnVsbCBTdHJpbmcgaWQpIHsKLSAgICAgICAgICAgIGlmIChpZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1JZCA9IGlkOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25DYWxsYmFja19pbXBsKEBOb25OdWxsIEV4ZWN1dG9yIGV4ZWN1dG9yLCBATm9uTnVsbCBDIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBpZiAoZXhlY3V0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImV4ZWN1dG9yIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvciA9IGV4ZWN1dG9yOwotICAgICAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGFic3RyYWN0IFQgYnVpbGRfaW1wbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlckltcGwgZXh0ZW5kcyBCdWlsZGVyQmFzZUltcGw8TWVkaWFTZXNzaW9uMiwgU2Vzc2lvbkNhbGxiYWNrPiB7Ci0gICAgICAgIHB1YmxpYyBCdWlsZGVySW1wbChDb250ZXh0IGNvbnRleHQsIEJ1aWxkZXIgaW5zdGFuY2UpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb24yIGJ1aWxkX2ltcGwoKSB7Ci0gICAgICAgICAgICBpZiAobUNhbGxiYWNrRXhlY3V0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yID0gbUNvbnRleHQuZ2V0TWFpbkV4ZWN1dG9yKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUNhbGxiYWNrID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2sgPSBuZXcgU2Vzc2lvbkNhbGxiYWNrKCkge307Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjJJbXBsKG1Db250ZXh0LCBtUGxheWVyLCBtSWQsIG1QbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgICAgICAgICBtVm9sdW1lUHJvdmlkZXIsIG1TZXNzaW9uQWN0aXZpdHksIG1DYWxsYmFja0V4ZWN1dG9yLCBtQ2FsbGJhY2spLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvbjJTdHViLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvbjJTdHViLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjNjU3ZDcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb24yU3R1Yi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTExMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTIuTGlicmFyeVJvb3Q7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29tbWFuZEJ1dHRvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kR3JvdXAyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5Db250cm9sbGVySW5mbzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlJhdGluZzI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuRGVhZE9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5HdWFyZGVkQnk7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheU1hcDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UySW1wbC5NZWRpYUxpYnJhcnlTZXNzaW9uSW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kQnV0dG9uSW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kR3JvdXBJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsLkNvbnRyb2xsZXJJbmZvSW1wbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYVNlc3Npb24yU3R1YiBleHRlbmRzIElNZWRpYVNlc3Npb24yLlN0dWIgewotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdVTUVOVF9LRVlfUE9TSVRJT04gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5rZXlfcG9zaXRpb24iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfS0VZX0lURU1fSU5ERVggPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5rZXlfaXRlbV9pbmRleCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdVTUVOVF9LRVlfUExBWUxJU1RfUEFSQU1TID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmtleV9wbGF5bGlzdF9wYXJhbXMiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVNlc3Npb24yU3R1YiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7IC8vIFRPRE8oamFld2FuKTogUmVuYW1lLgotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3BhcnNlQXJyYXk8U2Vzc2lvbkNvbW1hbmQyPiBzQ29tbWFuZHNGb3JPbkNvbW1hbmRSZXF1ZXN0ID0KLSAgICAgICAgICAgIG5ldyBTcGFyc2VBcnJheTw+KCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8TWVkaWFTZXNzaW9uMkltcGw+IG1TZXNzaW9uOwotCi0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlNYXA8SUJpbmRlciwgQ29udHJvbGxlckluZm8+IG1Db250cm9sbGVycyA9IG5ldyBBcnJheU1hcDw+KCk7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgZmluYWwgU2V0PElCaW5kZXI+IG1Db25uZWN0aW5nQ29udHJvbGxlcnMgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlNYXA8Q29udHJvbGxlckluZm8sIFNlc3Npb25Db21tYW5kR3JvdXAyPiBtQWxsb3dlZENvbW1hbmRHcm91cE1hcCA9Ci0gICAgICAgICAgICBuZXcgQXJyYXlNYXA8PigpOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TWFwPENvbnRyb2xsZXJJbmZvLCBTZXQ8U3RyaW5nPj4gbVN1YnNjcmlwdGlvbnMgPSBuZXcgQXJyYXlNYXA8PigpOwotCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvbjJTdHViKE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24pIHsKLSAgICAgICAgbVNlc3Npb24gPSBuZXcgV2Vha1JlZmVyZW5jZTw+KHNlc3Npb24pOwotCi0gICAgICAgIHN5bmNocm9uaXplZCAoc0NvbW1hbmRzRm9yT25Db21tYW5kUmVxdWVzdCkgewotICAgICAgICAgICAgaWYgKHNDb21tYW5kc0Zvck9uQ29tbWFuZFJlcXVlc3Quc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICBDb21tYW5kR3JvdXBJbXBsIGdyb3VwID0gbmV3IENvbW1hbmRHcm91cEltcGwoKTsKLSAgICAgICAgICAgICAgICBncm91cC5hZGRBbGxQbGF5YmFja0NvbW1hbmRzKCk7Ci0gICAgICAgICAgICAgICAgZ3JvdXAuYWRkQWxsUGxheWxpc3RDb21tYW5kcygpOwotICAgICAgICAgICAgICAgIFNldDxTZXNzaW9uQ29tbWFuZDI+IGNvbW1hbmRzID0gZ3JvdXAuZ2V0Q29tbWFuZHMoKTsKLSAgICAgICAgICAgICAgICBmb3IgKFNlc3Npb25Db21tYW5kMiBjb21tYW5kIDogY29tbWFuZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgc0NvbW1hbmRzRm9yT25Db21tYW5kUmVxdWVzdC5hcHBlbmQoY29tbWFuZC5nZXRDb21tYW5kQ29kZSgpLCBjb21tYW5kKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXN0cm95Tm90TG9ja2VkKCkgewotICAgICAgICBmaW5hbCBMaXN0PENvbnRyb2xsZXJJbmZvPiBsaXN0OwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvbi5jbGVhcigpOwotICAgICAgICAgICAgbGlzdCA9IGdldENvbnRyb2xsZXJzKCk7Ci0gICAgICAgICAgICBtQ29udHJvbGxlcnMuY2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIElNZWRpYUNvbnRyb2xsZXIyIGNvbnRyb2xsZXJCaW5kZXIgPQotICAgICAgICAgICAgICAgICAgICAoKENvbnRyb2xsZXJJbmZvSW1wbCkgbGlzdC5nZXQoaSkuZ2V0UHJvdmlkZXIoKSkuZ2V0Q29udHJvbGxlckJpbmRlcigpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBTaG91bGQgYmUgdXNlZCB3aXRob3V0IGEgbG9jayBob2xkIHRvIHByZXZlbnQgcG90ZW50aWFsIGRlYWRsb2NrLgotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJCaW5kZXIub25EaXNjb25uZWN0ZWQoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ29udHJvbGxlciBpcyBnb25lLiBTaG91bGQgYmUgZmluZSBiZWNhdXNlIHdlJ3JlIGRlc3Ryb3lpbmcuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbjJJbXBsIGdldFNlc3Npb24oKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBtU2Vzc2lvbi5nZXQoKTsKLSAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCAmJiBERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2Vzc2lvbiBpcyBjbG9zZWQiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzZXNzaW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwgZ2V0TGlicmFyeVNlc3Npb24oKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgaWYgKCEoc2Vzc2lvbiBpbnN0YW5jZW9mIE1lZGlhTGlicmFyeVNlc3Npb25JbXBsKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlNlc3Npb24gaXNuJ3QgYSBsaWJyYXJ5IHNlc3Npb24iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKE1lZGlhTGlicmFyeVNlc3Npb25JbXBsKSBzZXNzaW9uOwotICAgIH0KLQotICAgIC8vIEdldCBjb250cm9sbGVyIGlmIHRoZSBjb21tYW5kIGZyb20gY2FsbGVyIHRvIHNlc3Npb24gaXMgYWJsZSB0byBiZSBoYW5kbGVkLgotICAgIHByaXZhdGUgQ29udHJvbGxlckluZm8gZ2V0Q29udHJvbGxlcklmQWJsZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlckluZm8gPSBtQ29udHJvbGxlcnMuZ2V0KGNhbGxlci5hc0JpbmRlcigpKTsKLSAgICAgICAgICAgIGlmIChjb250cm9sbGVySW5mbyA9PSBudWxsICYmIERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ29udHJvbGxlciBpcyBkaXNjb25uZWN0ZWQiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJJbmZvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gR2V0IGNvbnRyb2xsZXIgaWYgdGhlIGNvbW1hbmQgZnJvbSBjYWxsZXIgdG8gc2Vzc2lvbiBpcyBhYmxlIHRvIGJlIGhhbmRsZWQuCi0gICAgcHJpdmF0ZSBDb250cm9sbGVySW5mbyBnZXRDb250cm9sbGVySWZBYmxlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IGNvbW1hbmRDb2RlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXJJbmZvID0gZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXJJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGFsbG93ZWRDb21tYW5kcyA9IG1BbGxvd2VkQ29tbWFuZEdyb3VwTWFwLmdldChjb250cm9sbGVySW5mbyk7Ci0gICAgICAgICAgICBpZiAoYWxsb3dlZENvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb250cm9sbGVyIHdpdGggbnVsbCBhbGxvd2VkIGNvbW1hbmRzLiBJZ25vcmluZyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFhbGxvd2VkQ29tbWFuZHMuaGFzQ29tbWFuZChjb21tYW5kQ29kZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ29udHJvbGxlciBpc24ndCBhbGxvd2VkIGZvciBjb21tYW5kICIgKyBjb21tYW5kQ29kZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJJbmZvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gR2V0IGNvbnRyb2xsZXIgaWYgdGhlIGNvbW1hbmQgZnJvbSBjYWxsZXIgdG8gc2Vzc2lvbiBpcyBhYmxlIHRvIGJlIGhhbmRsZWQuCi0gICAgcHJpdmF0ZSBDb250cm9sbGVySW5mbyBnZXRDb250cm9sbGVySWZBYmxlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlckluZm8gPSBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlcik7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlckluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmRHcm91cDIgYWxsb3dlZENvbW1hbmRzID0gbUFsbG93ZWRDb21tYW5kR3JvdXBNYXAuZ2V0KGNvbnRyb2xsZXJJbmZvKTsKLSAgICAgICAgICAgIGlmIChhbGxvd2VkQ29tbWFuZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbnRyb2xsZXIgd2l0aCBudWxsIGFsbG93ZWQgY29tbWFuZHMuIElnbm9yaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKGNvbW1hbmQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNvbnRyb2xsZXIgaXNuJ3QgYWxsb3dlZCBmb3IgY29tbWFuZCAiICsgY29tbWFuZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJJbmZvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGJpbmRlciBpZiB0aGUgc2Vzc2lvbiBpcyBhYmxlIHRvIHNlbmQgYSBjb21tYW5kIHRvIHRoZSBjb250cm9sbGVyLgotICAgIHByaXZhdGUgSU1lZGlhQ29udHJvbGxlcjIgZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShDb250cm9sbGVySW5mbyBjb250cm9sbGVyKSB7Ci0gICAgICAgIGlmIChnZXRTZXNzaW9uKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gZ2V0U2Vzc2lvbigpIGFscmVhZHkgbG9nZ2VkIGlmIHNlc3Npb24gaXMgY2xvc2VkLgotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm9JbXBsIGltcGwgPSBDb250cm9sbGVySW5mb0ltcGwuZnJvbShjb250cm9sbGVyKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKG1Db250cm9sbGVycy5nZXQoaW1wbC5nZXRJZCgpKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgIHx8IG1Db25uZWN0aW5nQ29udHJvbGxlcnMuY29udGFpbnMoaW1wbC5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpbXBsLmdldENvbnRyb2xsZXJCaW5kZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY29udHJvbGxlciArICIgaXNuJ3QgY29ubmVjdGVkIG5vciBjb25uZWN0aW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFJldHVybiBiaW5kZXIgaWYgdGhlIHNlc3Npb24gaXMgYWJsZSB0byBzZW5kIGEgY29tbWFuZCB0byB0aGUgY29udHJvbGxlci4KLSAgICBwcml2YXRlIElNZWRpYUNvbnRyb2xsZXIyIGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoQ29udHJvbGxlckluZm8gY29udHJvbGxlciwKLSAgICAgICAgICAgIGludCBjb21tYW5kQ29kZSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBTZXNzaW9uQ29tbWFuZEdyb3VwMiBhbGxvd2VkQ29tbWFuZHMgPSBtQWxsb3dlZENvbW1hbmRHcm91cE1hcC5nZXQoY29udHJvbGxlcik7Ci0gICAgICAgICAgICBpZiAoYWxsb3dlZENvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb250cm9sbGVyIHdpdGggbnVsbCBhbGxvd2VkIGNvbW1hbmRzLiBJZ25vcmluZyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFhbGxvd2VkQ29tbWFuZHMuaGFzQ29tbWFuZChjb21tYW5kQ29kZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ29udHJvbGxlciBpc24ndCBhbGxvd2VkIGZvciBjb21tYW5kICIgKyBjb21tYW5kQ29kZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoY29udHJvbGxlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgb25Db21tYW5kKEBOb25OdWxsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IGNvbW1hbmRDb2RlLAotICAgICAgICAgICAgQE5vbk51bGwgU2Vzc2lvblJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgIGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlciwgY29tbWFuZENvZGUpOwotICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsIHx8IGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyLCBjb21tYW5kQ29kZSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kMiBjb21tYW5kID0gc0NvbW1hbmRzRm9yT25Db21tYW5kUmVxdWVzdC5nZXQoY29tbWFuZENvZGUpOwotICAgICAgICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gYWNjZXB0ZWQgPSBzZXNzaW9uLmdldENhbGxiYWNrKCkub25Db21tYW5kUmVxdWVzdChzZXNzaW9uLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBjb21tYW5kKTsKLSAgICAgICAgICAgICAgICBpZiAoIWFjY2VwdGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIERvbid0IHJ1biByZWplY3RlZCBjb21tYW5kLgotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkNvbW1hbmQgKGNvZGU9IiArIGNvbW1hbmRDb2RlICsgIikgZnJvbSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgY29udHJvbGxlciArICIgd2FzIHJlamVjdGVkIGJ5ICIgKyBzZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcnVubmFibGUucnVuKHNlc3Npb24sIGNvbnRyb2xsZXIpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgb25Ccm93c2VyQ29tbWFuZChATm9uTnVsbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsCi0gICAgICAgICAgICBATm9uTnVsbCBMaWJyYXJ5U2Vzc2lvblJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhTGlicmFyeVNlc3Npb25JbXBsIHNlc3Npb24gPSBnZXRMaWJyYXJ5U2Vzc2lvbigpOwotICAgICAgICAvLyBUT0RPKGphZXdhbik6IENvbnNpZGVyIGNvbW1hbmQgY29kZQotICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIpOwotICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsIHx8IGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBDb25zaWRlciBjb21tYW5kIGNvZGUKLSAgICAgICAgICAgIGlmIChnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlcikgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJ1bm5hYmxlLnJ1bihzZXNzaW9uLCBjb250cm9sbGVyKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5QWxsKGludCBjb21tYW5kQ29kZSwgQE5vbk51bGwgTm90aWZ5UnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgTGlzdDxDb250cm9sbGVySW5mbz4gY29udHJvbGxlcnMgPSBnZXRDb250cm9sbGVycygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xsZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBub3RpZnlJbnRlcm5hbChjb250cm9sbGVycy5nZXQoaSksCi0gICAgICAgICAgICAgICAgICAgIGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoY29udHJvbGxlcnMuZ2V0KGkpLCBjb21tYW5kQ29kZSksIHJ1bm5hYmxlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnlBbGwoQE5vbk51bGwgTm90aWZ5UnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgTGlzdDxDb250cm9sbGVySW5mbz4gY29udHJvbGxlcnMgPSBnZXRDb250cm9sbGVycygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRyb2xsZXJzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBub3RpZnlJbnRlcm5hbChjb250cm9sbGVycy5nZXQoaSksCi0gICAgICAgICAgICAgICAgICAgIGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoY29udHJvbGxlcnMuZ2V0KGkpKSwgcnVubmFibGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeShATm9uTnVsbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBATm9uTnVsbCBOb3RpZnlSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICBub3RpZnlJbnRlcm5hbChjb250cm9sbGVyLCBnZXRDb250cm9sbGVyQmluZGVySWZBYmxlKGNvbnRyb2xsZXIpLCBydW5uYWJsZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeShATm9uTnVsbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBpbnQgY29tbWFuZENvZGUsCi0gICAgICAgICAgICBATm9uTnVsbCBOb3RpZnlSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICBub3RpZnlJbnRlcm5hbChjb250cm9sbGVyLCBnZXRDb250cm9sbGVyQmluZGVySWZBYmxlKGNvbnRyb2xsZXIsIGNvbW1hbmRDb2RlKSwgcnVubmFibGUpOwotICAgIH0KLQotICAgIC8vIERvIG5vdCBjYWxsIHRoaXMgQVBJIGRpcmVjdGx5LiBVc2Ugbm90aWZ5KCkgaW5zdGVhZC4KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5SW50ZXJuYWwoQE5vbk51bGwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciwKLSAgICAgICAgICAgIEBOb25OdWxsIElNZWRpYUNvbnRyb2xsZXIyIGlDb250cm9sbGVyLCBATm9uTnVsbCBOb3RpZnlSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsIHx8IGlDb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcnVubmFibGUucnVuKGNvbnRyb2xsZXIsIGlDb250cm9sbGVyKTsKLSAgICAgICAgfSBjYXRjaCAoRGVhZE9iamVjdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNvbnRyb2xsZXIudG9TdHJpbmcoKSArICIgaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb25Db250cm9sbGVyQ2xvc2VkKGlDb250cm9sbGVyKTsKLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIEN1cnJlbnRseSBpdCdzIFRyYW5zYWN0aW9uVG9vTGFyZ2VFeGNlcHRpb24gb3IgRGVhZFN5c3RlbUV4Y2VwdGlvbi4KLSAgICAgICAgICAgIC8vIFdlJ2QgYmV0dGVyIHRvIGxlYXZlIGxvZyBmb3IgdGhvc2UgY2FzZXMgYmVjYXVzZQotICAgICAgICAgICAgLy8gICAtIFRyYW5zYWN0aW9uVG9vTGFyZ2VFeGNlcHRpb24gbWVhbnMgdGhhdCB3ZSBtYXkgbmVlZCB0byBmaXggb3VyIGNvZGUuCi0gICAgICAgICAgICAvLyAgICAgKGUuZy4gYWRkIHBhZ2luYXRpb24gb3Igc3BlY2lhbCB3YXkgdG8gZGVsaXZlciBCaXRtYXApCi0gICAgICAgICAgICAvLyAgIC0gRGVhZFN5c3RlbUV4Y2VwdGlvbiBtZWFucyB0aGF0IGVycm9ycyBhcm91bmQgaXQgY2FuIGJlIGlnbm9yZWQuCi0gICAgICAgICAgICBMb2cudyhUQUcsICJFeGNlcHRpb24gaW4gIiArIGNvbnRyb2xsZXIudG9TdHJpbmcoKSwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgb25Db250cm9sbGVyQ2xvc2VkKElNZWRpYUNvbnRyb2xsZXIyIGlDb250cm9sbGVyKSB7Ci0gICAgICAgIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXI7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBtQ29udHJvbGxlcnMucmVtb3ZlKGlDb250cm9sbGVyLmFzQmluZGVyKCkpOwotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVsZWFzaW5nICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TdWJzY3JpcHRpb25zLnJlbW92ZShjb250cm9sbGVyKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsIHx8IGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uRGlzY29ubmVjdGVkKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgY29udHJvbGxlcik7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBBSURMIG1ldGhvZHMgZm9yIHNlc3Npb24gb3ZlcnJpZGVzCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNvbm5lY3QoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgY2FsbGluZ1BhY2thZ2UpCi0gICAgICAgICAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBDb250ZXh0IGNvbnRleHQgPSBzZXNzaW9uLmdldENvbnRleHQoKTsKLSAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlckluZm8gPSBuZXcgQ29udHJvbGxlckluZm8oY29udGV4dCwKLSAgICAgICAgICAgICAgICBCaW5kZXIuZ2V0Q2FsbGluZ1VpZCgpLCBCaW5kZXIuZ2V0Q2FsbGluZ1BpZCgpLCBjYWxsaW5nUGFja2FnZSwgY2FsbGVyKTsKLSAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoZ2V0U2Vzc2lvbigpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgLy8gS2VlcCBjb25uZWN0aW5nIGNvbnRyb2xsZXJzLgotICAgICAgICAgICAgICAgIC8vIFRoaXMgaGVscHMgc2Vzc2lvbnMgdG8gY2FsbCBBUElzIGluIHRoZSBvbkNvbm5lY3QoKSAoZS5nLiBzZXRDdXN0b21MYXlvdXQoKSkKLSAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIHBlbmRpbmcgdGhlbS4KLSAgICAgICAgICAgICAgICBtQ29ubmVjdGluZ0NvbnRyb2xsZXJzLmFkZChDb250cm9sbGVySW5mb0ltcGwuZnJvbShjb250cm9sbGVySW5mbykuZ2V0SWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTZXNzaW9uQ29tbWFuZEdyb3VwMiBhbGxvd2VkQ29tbWFuZHMgPSBzZXNzaW9uLmdldENhbGxiYWNrKCkub25Db25uZWN0KAotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXJJbmZvKTsKLSAgICAgICAgICAgIC8vIERvbid0IHJlamVjdCBjb25uZWN0aW9uIGZvciB0aGUgcmVxdWVzdCBmcm9tIHRydXN0ZWQgYXBwLgotICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHNlcnZlciB3aWxsIGZhaWwgdG8gcmV0cmlldmUgc2Vzc2lvbidzIGluZm9ybWF0aW9uIHRvIGRpc3BhdGNoCi0gICAgICAgICAgICAvLyBtZWRpYSBrZXlzIHRvLgotICAgICAgICAgICAgYm9vbGVhbiBhY2NlcHQgPSBhbGxvd2VkQ29tbWFuZHMgIT0gbnVsbCB8fCBjb250cm9sbGVySW5mby5pc1RydXN0ZWQoKTsKLSAgICAgICAgICAgIGlmIChhY2NlcHQpIHsKLSAgICAgICAgICAgICAgICBDb250cm9sbGVySW5mb0ltcGwgY29udHJvbGxlckltcGwgPSBDb250cm9sbGVySW5mb0ltcGwuZnJvbShjb250cm9sbGVySW5mbyk7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkFjY2VwdGluZyBjb25uZWN0aW9uLCBjb250cm9sbGVySW5mbz0iICsgY29udHJvbGxlckluZm8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYWxsb3dlZENvbW1hbmRzPSIgKyBhbGxvd2VkQ29tbWFuZHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYWxsb3dlZENvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHRydXN0ZWQgYXBwcywgc2VuZCBub24tbnVsbCBhbGxvd2VkIGNvbW1hbmRzIHRvIGtlZXAgY29ubmVjdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgYWxsb3dlZENvbW1hbmRzID0gbmV3IFNlc3Npb25Db21tYW5kR3JvdXAyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3RpbmdDb250cm9sbGVycy5yZW1vdmUoY29udHJvbGxlckltcGwuZ2V0SWQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVycy5wdXQoY29udHJvbGxlckltcGwuZ2V0SWQoKSwgIGNvbnRyb2xsZXJJbmZvKTsKLSAgICAgICAgICAgICAgICAgICAgbUFsbG93ZWRDb21tYW5kR3JvdXBNYXAucHV0KGNvbnRyb2xsZXJJbmZvLCBhbGxvd2VkQ29tbWFuZHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBJZiBjb25uZWN0aW9uIGlzIGFjY2VwdGVkLCBub3RpZnkgdGhlIGN1cnJlbnQgc3RhdGUgdG8gdGhlIGNvbnRyb2xsZXIuCi0gICAgICAgICAgICAgICAgLy8gSXQncyBuZWVkZWQgYmVjYXVzZSB3ZSBjYW5ub3QgY2FsbCBzeW5jaHJvbm91cyBjYWxscyBiZXR3ZWVuIHNlc3Npb24vY29udHJvbGxlci4KLSAgICAgICAgICAgICAgICAvLyBOb3RlOiBXZSdyZSBkb2luZyB0aGlzIGFmdGVyIHRoZSBvbkNvbm5lY3Rpb25DaGFuZ2VkKCksIGJ1dCB0aGVyZSdzIG5vIGd1YXJhbnRlZQotICAgICAgICAgICAgICAgIC8vICAgICAgIHRoYXQgZXZlbnRzIGhlcmUgYXJlIG5vdGlmaWVkIGFmdGVyIHRoZSBvbkNvbm5lY3RlZCgpIGJlY2F1c2UKLSAgICAgICAgICAgICAgICAvLyAgICAgICBJTWVkaWFDb250cm9sbGVyMiBpcyBvbmV3YXkgKGkuZS4gYXN5bmMgY2FsbCkgYW5kIFN0dWIgd2lsbAotICAgICAgICAgICAgICAgIC8vICAgICAgIHVzZSB0aHJlYWQgcG9sbCBmb3IgaW5jb21pbmcgY2FsbHMuCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IHBsYXllclN0YXRlID0gc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLmdldFBsYXllclN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgbG9uZyBwb3NpdGlvbkV2ZW50VGltZU1zID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgbG9uZyBwb3NpdGlvbk1zID0gc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLmdldEN1cnJlbnRQb3NpdGlvbigpOwotICAgICAgICAgICAgICAgIGZpbmFsIGZsb2F0IHBsYXliYWNrU3BlZWQgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0UGxheWJhY2tTcGVlZCgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgYnVmZmVyZWRQb3NpdGlvbk1zID0gc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLmdldEJ1ZmZlcmVkUG9zaXRpb24oKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBCdW5kbGUgcGxheWJhY2tJbmZvQnVuZGxlID0gKChNZWRpYUNvbnRyb2xsZXIySW1wbC5QbGF5YmFja0luZm9JbXBsKQotICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRQbGF5YmFja0luZm8oKS5nZXRQcm92aWRlcigpKS50b0J1bmRsZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXBlYXRNb2RlID0gc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLmdldFJlcGVhdE1vZGUoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2h1ZmZsZU1vZGUgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0U2h1ZmZsZU1vZGUoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBQZW5kaW5nSW50ZW50IHNlc3Npb25BY3Rpdml0eSA9IHNlc3Npb24uZ2V0U2Vzc2lvbkFjdGl2aXR5KCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgTGlzdDxNZWRpYUl0ZW0yPiBwbGF5bGlzdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbGxvd2VkQ29tbWFuZHMuaGFzQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX0dFVF9MSVNUKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5nZXRQbGF5bGlzdCgpIDogbnVsbDsKLSAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PEJ1bmRsZT4gcGxheWxpc3RCdW5kbGU7Ci0gICAgICAgICAgICAgICAgaWYgKHBsYXlsaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcGxheWxpc3RCdW5kbGUgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBGaW5kIGEgd2F5IHRvIGF2b2lkIGNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIGV4Y2VwdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwbGF5bGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFJdGVtMiBpdGVtID0gcGxheWxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBpdGVtQnVuZGxlID0gaXRlbS50b0J1bmRsZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVtQnVuZGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWxpc3RCdW5kbGUuYWRkKGl0ZW1CdW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBsYXlsaXN0QnVuZGxlID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBEb3VibGUgY2hlY2sgaWYgc2Vzc2lvbiBpcyBzdGlsbCB0aGVyZSwgYmVjYXVzZSBjbG9zZSgpIGNhbiBiZSBjYWxsZWQgaW4gYW5vdGhlcgotICAgICAgICAgICAgICAgIC8vIHRocmVhZC4KLSAgICAgICAgICAgICAgICBpZiAoZ2V0U2Vzc2lvbigpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBjYWxsZXIub25Db25uZWN0ZWQoTWVkaWFTZXNzaW9uMlN0dWIudGhpcywgYWxsb3dlZENvbW1hbmRzLnRvQnVuZGxlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyU3RhdGUsIHBvc2l0aW9uRXZlbnRUaW1lTXMsIHBvc2l0aW9uTXMsIHBsYXliYWNrU3BlZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyZWRQb3NpdGlvbk1zLCBwbGF5YmFja0luZm9CdW5kbGUsIHJlcGVhdE1vZGUsIHNodWZmbGVNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXlsaXN0QnVuZGxlLCBzZXNzaW9uQWN0aXZpdHkpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENvbnRyb2xsZXIgbWF5IGJlIGRpZWQgcHJlbWF0dXJlbHkuCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlIGhlcmUuCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW5nQ29udHJvbGxlcnMucmVtb3ZlKENvbnRyb2xsZXJJbmZvSW1wbC5mcm9tKGNvbnRyb2xsZXJJbmZvKS5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJlamVjdGluZyBjb25uZWN0aW9uLCBjb250cm9sbGVySW5mbz0iICsgY29udHJvbGxlckluZm8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBjYWxsZXIub25EaXNjb25uZWN0ZWQoKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBDb250cm9sbGVyIG1heSBiZSBkaWVkIHByZW1hdHVyZWx5LgotICAgICAgICAgICAgICAgICAgICAvLyBOb3QgYW4gaXNzdWUgYmVjYXVzZSB3ZSdsbCBpZ25vcmUgaXQgYW55d2F5LgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZShmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb24gewotICAgICAgICBvbkNvbnRyb2xsZXJDbG9zZWQoY2FsbGVyKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRWb2x1bWVUbyhmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIGludCB2YWx1ZSwgZmluYWwgaW50IGZsYWdzKQotICAgICAgICAgICAgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFVF9WT0xVTUUsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyID0gc2Vzc2lvbi5nZXRWb2x1bWVQcm92aWRlcigpOwotICAgICAgICAgICAgICAgICAgICBpZiAodm9sdW1lUHJvdmlkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBTZXQgbG9jYWwgc3RyZWFtIHZvbHVtZQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lUHJvdmlkZXIub25TZXRWb2x1bWVUbyh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGp1c3RWb2x1bWUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgZGlyZWN0aW9uLCBpbnQgZmxhZ3MpCi0gICAgICAgICAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VUX1ZPTFVNRSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIgPSBzZXNzaW9uLmdldFZvbHVtZVByb3ZpZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2b2x1bWVQcm92aWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEFkanVzdCBsb2NhbCBzdHJlYW0gdm9sdW1lCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVQcm92aWRlci5vbkFkanVzdFZvbHVtZShkaXJlY3Rpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwKLSAgICAgICAgICAgIGludCBjb21tYW5kQ29kZSwgQnVuZGxlIGFyZ3MpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgY29tbWFuZENvZGUsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGNvbW1hbmRDb2RlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1BMQVk6Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5wbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19QQVVTRToKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnBhdXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19TVE9QOgotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuc3RvcCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUJBQ0tfUFJFUEFSRToKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnByZXBhcmUoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1NFRUtfVE86Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5zZWVrVG8oYXJncy5nZXRMb25nKEFSR1VNRU5UX0tFWV9QT1NJVElPTikpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJlc2VuZCB1bmtub3duIChuZXcpIGNvbW1hbmRzIHRocm91Z2ggdGhlIGN1c3RvbSBjb21tYW5kLgotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZW5kQ3VzdG9tQ29tbWFuZChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIEJ1bmRsZSBjb21tYW5kQnVuZGxlLAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIGFyZ3MsIGZpbmFsIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCA9IFNlc3Npb25Db21tYW5kMi5mcm9tQnVuZGxlKGNvbW1hbmRCdW5kbGUpOwotICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJzZW5kQ3VzdG9tQ29tbWFuZCgpOiBJZ25vcmluZyBudWxsIGNvbW1hbmQgZnJvbSAiCi0gICAgICAgICAgICAgICAgICAgICsgZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIpKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIsIGNvbW1hbmQpOwotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIsIGNvbW1hbmQpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25DdXN0b21Db21tYW5kKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgY29tbWFuZCwgYXJncywgcmVjZWl2ZXIpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlRnJvbVVyaShmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFVyaSB1cmksCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fVVJJLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1cmkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAicHJlcGFyZUZyb21VcmkoKTogSWdub3JpbmcgbnVsbCB1cmkgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uUHJlcGFyZUZyb21Vcmkoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyLCB1cmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFzKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlRnJvbVNlYXJjaChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBxdWVyeSwKLSAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9TRUFSQ0gsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAicHJlcGFyZUZyb21TZWFyY2goKTogSWdub3JpbmcgZW1wdHkgcXVlcnkgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uUHJlcGFyZUZyb21TZWFyY2goc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIHF1ZXJ5LCBleHRyYXMpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmVGcm9tTWVkaWFJZChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBtZWRpYUlkLAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUFJFUEFSRV9GUk9NX01FRElBX0lELAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAicHJlcGFyZUZyb21NZWRpYUlkKCk6IElnbm9yaW5nIG51bGwgbWVkaWFJZCBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QcmVwYXJlRnJvbU1lZGlhSWQoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBtZWRpYUlkLCBleHRyYXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwbGF5RnJvbVVyaShmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFVyaSB1cmksCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fVVJJLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh1cmkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAicGxheUZyb21VcmkoKTogSWdub3JpbmcgbnVsbCB1cmkgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uUGxheUZyb21Vcmkoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyLCB1cmksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFzKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwbGF5RnJvbVNlYXJjaChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBxdWVyeSwKLSAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BMQVlfRlJPTV9TRUFSQ0gsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAicGxheUZyb21TZWFyY2goKTogSWdub3JpbmcgZW1wdHkgcXVlcnkgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uUGxheUZyb21TZWFyY2goc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIHF1ZXJ5LCBleHRyYXMpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tTWVkaWFJZChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBtZWRpYUlkLAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX01FRElBX0lELAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInBsYXlGcm9tTWVkaWFJZCgpOiBJZ25vcmluZyBudWxsIG1lZGlhSWQgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uUGxheUZyb21NZWRpYUlkKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgY29udHJvbGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUlkLCBleHRyYXMpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFJhdGluZyhmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBtZWRpYUlkLAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIHJhdGluZ0J1bmRsZSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fU0VUX1JBVElORywKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzZXRSYXRpbmcoKTogSWdub3JpbmcgbnVsbCBtZWRpYUlkIGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyYXRpbmdCdW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2V0UmF0aW5nKCk6IElnbm9yaW5nIG51bGwgcmF0aW5nQnVuZGxlIGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFJhdGluZzIgcmF0aW5nID0gUmF0aW5nMi5mcm9tQnVuZGxlKHJhdGluZ0J1bmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyYXRpbmcgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJhdGluZ0J1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2V0UmF0aW5nKCk6IElnbm9yaW5nIG51bGwgcmF0aW5nIGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25TZXRSYXRpbmcoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyLCBtZWRpYUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhdGluZyk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UGxheWxpc3QoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBMaXN0PEJ1bmRsZT4gcGxheWxpc3QsCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgbWV0YWRhdGEpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfTElTVCwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChwbGF5bGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2V0UGxheWxpc3QoKTogSWdub3JpbmcgbnVsbCBwbGF5bGlzdCBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGxheWxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAvLyBSZWNyZWF0ZXMgVVVJRCBpbiB0aGUgcGxheWxpc3QKLSAgICAgICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBNZWRpYUl0ZW0ySW1wbC5mcm9tQnVuZGxlKHBsYXlsaXN0LmdldChpKSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChpdGVtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuc2V0UGxheWxpc3QobGlzdCwgTWVkaWFNZXRhZGF0YTIuZnJvbUJ1bmRsZShtZXRhZGF0YSkpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5bGlzdE1ldGFkYXRhKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgQnVuZGxlIG1ldGFkYXRhKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX0xJU1RfTUVUQURBVEEsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS51cGRhdGVQbGF5bGlzdE1ldGFkYXRhKE1lZGlhTWV0YWRhdGEyLmZyb21CdW5kbGUobWV0YWRhdGEpKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IGluZGV4LCBCdW5kbGUgbWVkaWFJdGVtKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfQUREX0lURU0sCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXRzIHRoZSBVVUlEIGZyb20gdGhlIGluY29taW5nIG1lZGlhIGlkLCBzbyBjb250cm9sbGVyIG1heSByZXVzZSBhIG1lZGlhCi0gICAgICAgICAgICAgICAgICAgIC8vIGl0ZW0gbXVsdGlwbGUgdGltZXMgZm9yIGFkZFBsYXlsaXN0SXRlbS4KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLmFkZFBsYXlsaXN0SXRlbShpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUl0ZW0ySW1wbC5mcm9tQnVuZGxlKG1lZGlhSXRlbSwgbnVsbCkpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVBsYXlsaXN0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIEJ1bmRsZSBtZWRpYUl0ZW0pIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9SRU1PVkVfSVRFTSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gTWVkaWFJdGVtMi5mcm9tQnVuZGxlKG1lZGlhSXRlbSk7Ci0gICAgICAgICAgICAvLyBOb3RlOiBNZWRpYUl0ZW0yIGhhcyBoaWRkZW4gVVVJRCB0byBpZGVudGlmeSBpdCBhY3Jvc3MgdGhlIHByb2Nlc3Nlcy4KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5yZW1vdmVQbGF5bGlzdEl0ZW0oaXRlbSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VQbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgaW5kZXgsIEJ1bmRsZSBtZWRpYUl0ZW0pIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9SRVBMQUNFX0lURU0sCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gUmVzZXRzIHRoZSBVVUlEIGZyb20gdGhlIGluY29taW5nIG1lZGlhIGlkLCBzbyBjb250cm9sbGVyIG1heSByZXVzZSBhIG1lZGlhCi0gICAgICAgICAgICAgICAgICAgIC8vIGl0ZW0gbXVsdGlwbGUgdGltZXMgZm9yIHJlcGxhY2VQbGF5bGlzdEl0ZW0uCi0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5yZXBsYWNlUGxheWxpc3RJdGVtKGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhSXRlbTJJbXBsLmZyb21CdW5kbGUobWVkaWFJdGVtLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgQnVuZGxlIG1lZGlhSXRlbSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NLSVBfVE9fUExBWUxJU1RfSVRFTSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBpZiAobWVkaWFJdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNraXBUb1BsYXlsaXN0SXRlbSgpOiBJZ25vcmluZyBudWxsIG1lZGlhSXRlbSBmcm9tICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBNZWRpYUl0ZW0yIGhhcyBoaWRkZW4gVVVJRCB0byBpZGVudGlmeSBpdCBhY3Jvc3MgdGhlIHByb2Nlc3Nlcy4KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnNraXBUb1BsYXlsaXN0SXRlbShNZWRpYUl0ZW0yLmZyb21CdW5kbGUobWVkaWFJdGVtKSk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUHJldmlvdXNJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcikgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NLSVBfUFJFVl9JVEVNLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5za2lwVG9QcmV2aW91c0l0ZW0oKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TS0lQX05FWFRfSVRFTSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuc2tpcFRvTmV4dEl0ZW0oKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRNb2RlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfUkVQRUFUX01PREUsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnNldFJlcGVhdE1vZGUocmVwZWF0TW9kZSk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U2h1ZmZsZU1vZGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfU0hVRkZMRV9NT0RFLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5zZXRTaHVmZmxlTW9kZShzaHVmZmxlTW9kZSk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIEFJREwgbWV0aG9kcyBmb3IgTGlicmFyeVNlc3Npb24gb3ZlcnJpZGVzCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZ2V0TGlicmFyeVJvb3QoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBCdW5kbGUgcm9vdEhpbnRzKQotICAgICAgICAgICAgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBvbkJyb3dzZXJDb21tYW5kKGNhbGxlciwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGZpbmFsIExpYnJhcnlSb290IHJvb3QgPSBzZXNzaW9uLmdldENhbGxiYWNrKCkub25HZXRMaWJyYXJ5Um9vdChzZXNzaW9uLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIHJvb3RIaW50cyk7Ci0gICAgICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vbkdldExpYnJhcnlSb290RG9uZShyb290SGludHMsCi0gICAgICAgICAgICAgICAgICAgICAgICByb290ID09IG51bGwgPyBudWxsIDogcm9vdC5nZXRSb290SWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QgPT0gbnVsbCA/IG51bGwgOiByb290LmdldEV4dHJhcygpKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBnZXRJdGVtKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIG1lZGlhSWQpCi0gICAgICAgICAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG9uQnJvd3NlckNvbW1hbmQoY2FsbGVyLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKG1lZGlhSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJtZWRpYUlkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIE1lZGlhSXRlbTIgcmVzdWx0ID0gc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uR2V0SXRlbShzZXNzaW9uLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIG1lZGlhSWQpOwotICAgICAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25HZXRJdGVtRG9uZShtZWRpYUlkLCByZXN1bHQgPT0gbnVsbCA/IG51bGwgOiByZXN1bHQudG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZ2V0Q2hpbGRyZW4oZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgcGFyZW50SWQsCi0gICAgICAgICAgICBmaW5hbCBpbnQgcGFnZSwgZmluYWwgaW50IHBhZ2VTaXplLCBmaW5hbCBCdW5kbGUgZXh0cmFzKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG9uQnJvd3NlckNvbW1hbmQoY2FsbGVyLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAicGFyZW50SWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhZ2UgPCAxIHx8IHBhZ2VTaXplIDwgMSkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJOZWl0aGVyIHBhZ2Ugbm9yIHBhZ2VTaXplIHNob3VsZCBiZSBsZXNzIHRoYW4gMSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHJlc3VsdCA9IHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkdldENoaWxkcmVuKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgcGFyZW50SWQsIHBhZ2UsIHBhZ2VTaXplLCBleHRyYXMpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5zaXplKCkgPiBwYWdlU2l6ZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm9uR2V0Q2hpbGRyZW4oKSBzaG91bGRuJ3QgcmV0dXJuIG1lZGlhIGl0ZW1zICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIm1vcmUgdGhhbiBwYWdlU2l6ZS4gcmVzdWx0LnNpemUoKT0iICsgcmVzdWx0LnNpemUoKSArICIgcGFnZVNpemU9IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBwYWdlU2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PEJ1bmRsZT4gYnVuZGxlTGlzdDsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKE1lZGlhSXRlbTIgaXRlbSA6IHJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICBidW5kbGVMaXN0LmFkZChpdGVtID09IG51bGwgPyBudWxsIDogaXRlbS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25HZXRDaGlsZHJlbkRvbmUocGFyZW50SWQsIHBhZ2UsIHBhZ2VTaXplLCBidW5kbGVMaXN0LCBleHRyYXMpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNlYXJjaChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBxdWVyeSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBvbkJyb3dzZXJDb21tYW5kKGNhbGxlciwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzZWFyY2goKTogSWdub3JpbmcgZW1wdHkgcXVlcnkgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uU2VhcmNoKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgY29udHJvbGxlciwgcXVlcnksIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGdldFNlYXJjaFJlc3VsdChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBxdWVyeSwKLSAgICAgICAgICAgIGZpbmFsIGludCBwYWdlLCBmaW5hbCBpbnQgcGFnZVNpemUsIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgb25Ccm93c2VyQ29tbWFuZChjYWxsZXIsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiZ2V0U2VhcmNoUmVzdWx0KCk6IElnbm9yaW5nIGVtcHR5IHF1ZXJ5IGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwYWdlIDwgMSB8fCBwYWdlU2l6ZSA8IDEpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJnZXRTZWFyY2hSZXN1bHQoKTogSWdub3JpbmcgbmVnYXRpdmUgcGFnZSAvIHBhZ2VTaXplLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBwYWdlPSIgKyBwYWdlICsgIiBwYWdlU2l6ZT0iICsgcGFnZVNpemUgKyAiIGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcmVzdWx0ID0gc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uR2V0U2VhcmNoUmVzdWx0KHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgcXVlcnksIHBhZ2UsIHBhZ2VTaXplLCBleHRyYXMpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5zaXplKCkgPiBwYWdlU2l6ZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm9uR2V0U2VhcmNoUmVzdWx0KCkgc2hvdWxkbid0IHJldHVybiBtZWRpYSAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJpdGVtcyBtb3JlIHRoYW4gcGFnZVNpemUuIHJlc3VsdC5zaXplKCk9IiArIHJlc3VsdC5zaXplKCkgKyAiIHBhZ2VTaXplPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgcGFnZVNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgTGlzdDxCdW5kbGU+IGJ1bmRsZUxpc3Q7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidW5kbGVMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICAgICAgZm9yIChNZWRpYUl0ZW0yIGl0ZW0gOiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVuZGxlTGlzdC5hZGQoaXRlbSA9PSBudWxsID8gbnVsbCA6IGl0ZW0udG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidW5kbGVMaXN0ID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uR2V0U2VhcmNoUmVzdWx0RG9uZShxdWVyeSwgcGFnZSwgcGFnZVNpemUsIGJ1bmRsZUxpc3QsIGV4dHJhcyk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3Vic2NyaWJlKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIHBhcmVudElkLAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIG9wdGlvbikgewotICAgICAgICBvbkJyb3dzZXJDb21tYW5kKGNhbGxlciwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic3Vic2NyaWJlKCk6IElnbm9yaW5nIG51bGwgcGFyZW50SWQgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uU3Vic2NyaWJlKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgcGFyZW50SWQsIG9wdGlvbik7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gc3Vic2NyaXB0aW9uID0gbVN1YnNjcmlwdGlvbnMuZ2V0KGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24gPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1TdWJzY3JpcHRpb25zLnB1dChjb250cm9sbGVyLCBzdWJzY3JpcHRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24uYWRkKHBhcmVudElkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdW5zdWJzY3JpYmUoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgcGFyZW50SWQpIHsKLSAgICAgICAgb25Ccm93c2VyQ29tbWFuZChjYWxsZXIsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgInVuc3Vic2NyaWJlKCk6IElnbm9yaW5nIG51bGwgcGFyZW50SWQgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uVW5zdWJzY3JpYmUoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyLCBwYXJlbnRJZCk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgbVN1YnNjcmlwdGlvbnMucmVtb3ZlKGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gQVBJcyBmb3IgTWVkaWFTZXNzaW9uMkltcGwKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAvLyBUT0RPKGphZXdhbik6IChDYW4gYmUgUG9zdC1QKSBOZWVkIGEgd2F5IHRvIGdldCBjb250cm9sbGVyIHdpdGggcGVybWlzc2lvbnMKLSAgICBwdWJsaWMgTGlzdDxDb250cm9sbGVySW5mbz4gZ2V0Q29udHJvbGxlcnMoKSB7Ci0gICAgICAgIEFycmF5TGlzdDxDb250cm9sbGVySW5mbz4gY29udHJvbGxlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQ29udHJvbGxlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjb250cm9sbGVycy5hZGQobUNvbnRyb2xsZXJzLnZhbHVlQXQoaSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb250cm9sbGVyczsKLSAgICB9Ci0KLSAgICAvLyBTaG91bGQgYmUgdXNlZCB3aXRob3V0IGEgbG9jayB0byBwcmV2ZW50IHBvdGVudGlhbCBkZWFkbG9jay4KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlQbGF5ZXJTdGF0ZUNoYW5nZWROb3RMb2NrZWQoaW50IHN0YXRlKSB7Ci0gICAgICAgIG5vdGlmeUFsbCgoY29udHJvbGxlciwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uUGxheWVyU3RhdGVDaGFuZ2VkKHN0YXRlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLy8gVE9ETyhqYWV3YW4pOiBSZW5hbWUKLSAgICBwdWJsaWMgdm9pZCBub3RpZnlQb3NpdGlvbkNoYW5nZWROb3RMb2NrZWQobG9uZyBldmVudFRpbWVNcywgbG9uZyBwb3NpdGlvbk1zKSB7Ci0gICAgICAgIG5vdGlmeUFsbCgoY29udHJvbGxlciwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uUG9zaXRpb25DaGFuZ2VkKGV2ZW50VGltZU1zLCBwb3NpdGlvbk1zKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5UGxheWJhY2tTcGVlZENoYW5nZWROb3RMb2NrZWQoZmxvYXQgc3BlZWQpIHsKLSAgICAgICAgbm90aWZ5QWxsKChjb250cm9sbGVyLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25QbGF5YmFja1NwZWVkQ2hhbmdlZChzcGVlZCk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VkTm90TG9ja2VkKGxvbmcgYnVmZmVyZWRQb3NpdGlvbk1zKSB7Ci0gICAgICAgIG5vdGlmeUFsbCgoY29udHJvbGxlciwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uQnVmZmVyZWRQb3NpdGlvbkNoYW5nZWQoYnVmZmVyZWRQb3NpdGlvbk1zKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5Q3VzdG9tTGF5b3V0Tm90TG9ja2VkKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIExpc3Q8Q29tbWFuZEJ1dHRvbj4gbGF5b3V0KSB7Ci0gICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgTGlzdDxCdW5kbGU+IGxheW91dEJ1bmRsZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGF5b3V0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9ICgoQ29tbWFuZEJ1dHRvbkltcGwpIGxheW91dC5nZXQoaSkuZ2V0UHJvdmlkZXIoKSkudG9CdW5kbGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoYnVuZGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbGF5b3V0QnVuZGxlcy5hZGQoYnVuZGxlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vbkN1c3RvbUxheW91dENoYW5nZWQobGF5b3V0QnVuZGxlcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVBsYXlsaXN0Q2hhbmdlZE5vdExvY2tlZChMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0LCBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBmaW5hbCBMaXN0PEJ1bmRsZT4gYnVuZGxlTGlzdDsKLSAgICAgICAgaWYgKHBsYXlsaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGJ1bmRsZUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGxheWxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAocGxheWxpc3QuZ2V0KGkpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IHBsYXlsaXN0LmdldChpKS50b0J1bmRsZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoYnVuZGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QuYWRkKGJ1bmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBidW5kbGVMaXN0ID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBCdW5kbGUgbWV0YWRhdGFCdW5kbGUgPSAobWV0YWRhdGEgPT0gbnVsbCkgPyBudWxsIDogbWV0YWRhdGEudG9CdW5kbGUoKTsKLSAgICAgICAgbm90aWZ5QWxsKChjb250cm9sbGVyLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoY29udHJvbGxlciwKLSAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9HRVRfTElTVCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uUGxheWxpc3RDaGFuZ2VkKGJ1bmRsZUxpc3QsIG1ldGFkYXRhQnVuZGxlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVyLAotICAgICAgICAgICAgICAgICAgICBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX0dFVF9MSVNUX01FVEFEQVRBKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZChtZXRhZGF0YUJ1bmRsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkTm90TG9ja2VkKE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGZpbmFsIEJ1bmRsZSBtZXRhZGF0YUJ1bmRsZSA9IChtZXRhZGF0YSA9PSBudWxsKSA/IG51bGwgOiBtZXRhZGF0YS50b0J1bmRsZSgpOwotICAgICAgICBub3RpZnlBbGwoU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9HRVRfTElTVF9NRVRBREFUQSwKLSAgICAgICAgICAgICAgICAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKG1ldGFkYXRhQnVuZGxlKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlSZXBlYXRNb2RlQ2hhbmdlZE5vdExvY2tlZChpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICBub3RpZnlBbGwoKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uUmVwZWF0TW9kZUNoYW5nZWQocmVwZWF0TW9kZSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVNodWZmbGVNb2RlQ2hhbmdlZE5vdExvY2tlZChpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgbm90aWZ5QWxsKCh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vblNodWZmbGVNb2RlQ2hhbmdlZChzaHVmZmxlTW9kZSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVBsYXliYWNrSW5mb0NoYW5nZWQoTWVkaWFDb250cm9sbGVyMi5QbGF5YmFja0luZm8gcGxheWJhY2tJbmZvKSB7Ci0gICAgICAgIGZpbmFsIEJ1bmRsZSBwbGF5YmFja0luZm9CdW5kbGUgPQotICAgICAgICAgICAgICAgICgoTWVkaWFDb250cm9sbGVyMkltcGwuUGxheWJhY2tJbmZvSW1wbCkgcGxheWJhY2tJbmZvLmdldFByb3ZpZGVyKCkpLnRvQnVuZGxlKCk7Ci0gICAgICAgIG5vdGlmeUFsbCgodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25QbGF5YmFja0luZm9DaGFuZ2VkKHBsYXliYWNrSW5mb0J1bmRsZSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldEFsbG93ZWRDb21tYW5kcyhDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBjb21tYW5kcykgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtQWxsb3dlZENvbW1hbmRHcm91cE1hcC5wdXQoY29udHJvbGxlciwgY29tbWFuZHMpOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25BbGxvd2VkQ29tbWFuZHNDaGFuZ2VkKGNvbW1hbmRzLnRvQnVuZGxlKCkpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZW5kQ3VzdG9tQ29tbWFuZChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCwgQnVuZGxlIGFyZ3MsCi0gICAgICAgICAgICBSZXN1bHRSZWNlaXZlciByZWNlaXZlcikgewotICAgICAgICBpZiAocmVjZWl2ZXIgIT0gbnVsbCAmJiBjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNvbnRyb2xsZXIgc2hvdWxkbid0IGJlIG51bGwgaWYgcmVzdWx0IHJlY2VpdmVyIGlzIgotICAgICAgICAgICAgICAgICAgICArICIgc3BlY2lmaWVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgQnVuZGxlIGNvbW1hbmRCdW5kbGUgPSBjb21tYW5kLnRvQnVuZGxlKCk7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vbkN1c3RvbUNvbW1hbmQoY29tbWFuZEJ1bmRsZSwgYXJncywgbnVsbCk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlbmRDdXN0b21Db21tYW5kKFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBCdW5kbGUgYXJncykgewotICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgQnVuZGxlIGNvbW1hbmRCdW5kbGUgPSBjb21tYW5kLnRvQnVuZGxlKCk7Ci0gICAgICAgIG5vdGlmeUFsbCgodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25DdXN0b21Db21tYW5kKGNvbW1hbmRCdW5kbGUsIGFyZ3MsIG51bGwpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlFcnJvcihpbnQgZXJyb3JDb2RlLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG5vdGlmeUFsbCgodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25FcnJvcihlcnJvckNvZGUsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBBUElzIGZvciBNZWRpYUxpYnJhcnlTZXNzaW9uSW1wbAotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVNlYXJjaFJlc3VsdENoYW5nZWQoQ29udHJvbGxlckluZm8gY29udHJvbGxlciwgU3RyaW5nIHF1ZXJ5LCBpbnQgaXRlbUNvdW50LAotICAgICAgICAgICAgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uU2VhcmNoUmVzdWx0Q2hhbmdlZChxdWVyeSwgaXRlbUNvdW50LCBleHRyYXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGlsZHJlbkNoYW5nZWROb3RMb2NrZWQoQ29udHJvbGxlckluZm8gY29udHJvbGxlciwgU3RyaW5nIHBhcmVudElkLAotICAgICAgICAgICAgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChpc1N1YnNjcmliZWQoY29udHJvbGxlciwgcGFyZW50SWQpKSB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25DaGlsZHJlbkNoYW5nZWQocGFyZW50SWQsIGl0ZW1Db3VudCwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5Q2hpbGRyZW5DaGFuZ2VkTm90TG9ja2VkKFN0cmluZyBwYXJlbnRJZCwgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBub3RpZnlBbGwoKGNvbnRyb2xsZXIsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAoaXNTdWJzY3JpYmVkKGNvbnRyb2xsZXIsIHBhcmVudElkKSkgewotICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uQ2hpbGRyZW5DaGFuZ2VkKHBhcmVudElkLCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1N1YnNjcmliZWQoQ29udHJvbGxlckluZm8gY29udHJvbGxlciwgU3RyaW5nIHBhcmVudElkKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIFNldDxTdHJpbmc+IHN1YnNjcmlwdGlvbnMgPSBtU3Vic2NyaXB0aW9ucy5nZXQoY29udHJvbGxlcik7Ci0gICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9ucyA9PSBudWxsIHx8ICFzdWJzY3JpcHRpb25zLmNvbnRhaW5zKHBhcmVudElkKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gTWlzYwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIEBGdW5jdGlvbmFsSW50ZXJmYWNlCi0gICAgcHJpdmF0ZSBpbnRlcmZhY2UgU2Vzc2lvblJ1bm5hYmxlIHsKLSAgICAgICAgdm9pZCBydW4oZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiwgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlcik7Ci0gICAgfQotCi0gICAgQEZ1bmN0aW9uYWxJbnRlcmZhY2UKLSAgICBwcml2YXRlIGludGVyZmFjZSBMaWJyYXJ5U2Vzc2lvblJ1bm5hYmxlIHsKLSAgICAgICAgdm9pZCBydW4oZmluYWwgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwgc2Vzc2lvbiwgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlcik7Ci0gICAgfQotCi0gICAgQEZ1bmN0aW9uYWxJbnRlcmZhY2UKLSAgICBwcml2YXRlIGludGVyZmFjZSBOb3RpZnlSdW5uYWJsZSB7Ci0gICAgICAgIHZvaWQgcnVuKGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgaUNvbnRyb2xsZXIpIHRocm93cyBSZW1vdGVFeGNlcHRpb247Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uU2VydmljZTJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMzM2ViNjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQuY29udGVudC5Db250ZXh0Lk5PVElGSUNBVElPTl9TRVJWSUNFOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOwotaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbk1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZS5QbGF5ZXJFdmVudENhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTIuTWVkaWFOb3RpZmljYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMi5Ub2tlblR5cGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFTZXNzaW9uU2VydmljZTJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uR3VhcmRlZEJ5OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLS8vIFRPRE8oamFld2FuKTogTmVlZCBhIHRlc3QgZm9yIHNlc3Npb24gc2VydmljZSBpdHNlbGYuCi1wdWJsaWMgY2xhc3MgTWVkaWFTZXNzaW9uU2VydmljZTJJbXBsIGltcGxlbWVudHMgTWVkaWFTZXNzaW9uU2VydmljZTJQcm92aWRlciB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1QU2Vzc2lvblNlcnZpY2UiOyAvLyB0byBtZWV0IDIzIGNoYXIgbGltaXQgaW4gTG9nIHRhZwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBUT0RPKGphZXdhbik6IENoYW5nZSB0aGlzLiAoYi83NDA5NDYxMSkKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFTZXNzaW9uU2VydmljZTIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgUGxheWVyRXZlbnRDYWxsYmFjayBtQ2FsbGJhY2sgPSBuZXcgU2Vzc2lvblNlcnZpY2VFdmVudENhbGxiYWNrKCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBOb3RpZmljYXRpb25NYW5hZ2VyIG1Ob3RpZmljYXRpb25NYW5hZ2VyOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIEludGVudCBtU3RhcnRTZWxmSW50ZW50OwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc1J1bm5pbmdGb3JlZ3JvdW5kOwotICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uMiBtU2Vzc2lvbjsKLQotICAgIHB1YmxpYyBNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwoTWVkaWFTZXNzaW9uU2VydmljZTIgaW5zdGFuY2UpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwoIiArIGluc3RhbmNlICsgIikiKTsKLSAgICAgICAgfQotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uMiBnZXRTZXNzaW9uX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBnZXRTZXNzaW9uKCk7Ci0gICAgfQotCi0gICAgTWVkaWFTZXNzaW9uMiBnZXRTZXNzaW9uKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNlc3Npb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFOb3RpZmljYXRpb24gb25VcGRhdGVOb3RpZmljYXRpb25faW1wbCgpIHsKLSAgICAgICAgLy8gUHJvdmlkZSBkZWZhdWx0IG5vdGlmaWNhdGlvbiBVSSBsYXRlci4KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25DcmVhdGVfaW1wbCgpIHsKLSAgICAgICAgbU5vdGlmaWNhdGlvbk1hbmFnZXIgPSAoTm90aWZpY2F0aW9uTWFuYWdlcikgbUluc3RhbmNlLmdldFN5c3RlbVNlcnZpY2UoCi0gICAgICAgICAgICAgICAgTk9USUZJQ0FUSU9OX1NFUlZJQ0UpOwotICAgICAgICBtU3RhcnRTZWxmSW50ZW50ID0gbmV3IEludGVudChtSW5zdGFuY2UsIG1JbnN0YW5jZS5nZXRDbGFzcygpKTsKLQotICAgICAgICBTZXNzaW9uVG9rZW4yIHRva2VuID0gbmV3IFNlc3Npb25Ub2tlbjIobUluc3RhbmNlLCBtSW5zdGFuY2UuZ2V0UGFja2FnZU5hbWUoKSwKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotICAgICAgICBpZiAodG9rZW4uZ2V0VHlwZSgpICE9IGdldFNlc3Npb25UeXBlKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJFeHBlY3RlZCBzZXNzaW9uIHNlcnZpY2UsIGJ1dCB3YXMgIiArIHRva2VuLmdldFR5cGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbVNlc3Npb24gPSBtSW5zdGFuY2Uub25DcmVhdGVTZXNzaW9uKHRva2VuLmdldElkKCkpOwotICAgICAgICBpZiAobVNlc3Npb24gPT0gbnVsbCB8fCAhdG9rZW4uZ2V0SWQoKS5lcXVhbHMobVNlc3Npb24uZ2V0VG9rZW4oKS5nZXRJZCgpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4cGVjdGVkIHNlc3Npb24gd2l0aCBpZCAiICsgdG9rZW4uZ2V0SWQoKQotICAgICAgICAgICAgICAgICAgICArICIsIGJ1dCBnb3QgIiArIG1TZXNzaW9uKTsKLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPKGphZXdhbik6IFVuY29tbWVudCBoZXJlLgotICAgICAgICAvLyBtU2Vzc2lvbi5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2sobUNhbGxiYWNrLCBtU2Vzc2lvbi5nZXRFeGVjdXRvcigpKTsKLSAgICB9Ci0KLSAgICBAVG9rZW5UeXBlIGludCBnZXRTZXNzaW9uVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIFNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OX1NFUlZJQ0U7Ci0gICAgfQotCi0gICAgcHVibGljIElCaW5kZXIgb25CaW5kX2ltcGwoSW50ZW50IGludGVudCkgewotICAgICAgICBpZiAoTWVkaWFTZXNzaW9uU2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UuZXF1YWxzKGludGVudC5nZXRBY3Rpb24oKSkpIHsKLSAgICAgICAgICAgIHJldHVybiAoKE1lZGlhU2Vzc2lvbjJJbXBsKSBtU2Vzc2lvbi5nZXRQcm92aWRlcigpKS5nZXRTZXNzaW9uU3R1YigpLmFzQmluZGVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU5vdGlmaWNhdGlvbihpbnQgcGxheWVyU3RhdGUpIHsKLSAgICAgICAgTWVkaWFOb3RpZmljYXRpb24gbWVkaWFOb3RpZmljYXRpb24gPSBtSW5zdGFuY2Uub25VcGRhdGVOb3RpZmljYXRpb24oKTsKLSAgICAgICAgaWYgKG1lZGlhTm90aWZpY2F0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2gocGxheWVyU3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFQbGF5ZXJCYXNlLlBMQVlFUl9TVEFURV9QTEFZSU5HOgotICAgICAgICAgICAgICAgIGlmICghbUlzUnVubmluZ0ZvcmVncm91bmQpIHsKLSAgICAgICAgICAgICAgICAgICAgbUlzUnVubmluZ0ZvcmVncm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc3RhcnRGb3JlZ3JvdW5kU2VydmljZShtU3RhcnRTZWxmSW50ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnN0YXJ0Rm9yZWdyb3VuZChtZWRpYU5vdGlmaWNhdGlvbi5nZXROb3RpZmljYXRpb25JZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhTm90aWZpY2F0aW9uLmdldE5vdGlmaWNhdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFQbGF5ZXJCYXNlLlBMQVlFUl9TVEFURV9JRExFOgotICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXllckJhc2UuUExBWUVSX1NUQVRFX0VSUk9SOgotICAgICAgICAgICAgICAgIGlmIChtSXNSdW5uaW5nRm9yZWdyb3VuZCkgewotICAgICAgICAgICAgICAgICAgICBtSXNSdW5uaW5nRm9yZWdyb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc3RvcEZvcmVncm91bmQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbU5vdGlmaWNhdGlvbk1hbmFnZXIubm90aWZ5KG1lZGlhTm90aWZpY2F0aW9uLmdldE5vdGlmaWNhdGlvbklkKCksCi0gICAgICAgICAgICAgICAgbWVkaWFOb3RpZmljYXRpb24uZ2V0Tm90aWZpY2F0aW9uKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgU2Vzc2lvblNlcnZpY2VFdmVudENhbGxiYWNrIGV4dGVuZHMgUGxheWVyRXZlbnRDYWxsYmFjayB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXllclN0YXRlQ2hhbmdlZChNZWRpYVBsYXllckJhc2UgcGxheWVyLCBpbnQgc3RhdGUpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE1lZGlhTm90aWZpY2F0aW9uSW1wbCBpbXBsZW1lbnRzIE1lZGlhTm90aWZpY2F0aW9uUHJvdmlkZXIgewotICAgICAgICBwcml2YXRlIGludCBtTm90aWZpY2F0aW9uSWQ7Ci0gICAgICAgIHByaXZhdGUgTm90aWZpY2F0aW9uIG1Ob3RpZmljYXRpb247Ci0KLSAgICAgICAgcHVibGljIE1lZGlhTm90aWZpY2F0aW9uSW1wbChNZWRpYU5vdGlmaWNhdGlvbiBpbnN0YW5jZSwgaW50IG5vdGlmaWNhdGlvbklkLAotICAgICAgICAgICAgICAgIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLSAgICAgICAgICAgIGlmIChub3RpZmljYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm5vdGlmaWNhdGlvbiBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU5vdGlmaWNhdGlvbklkID0gbm90aWZpY2F0aW9uSWQ7Ci0gICAgICAgICAgICBtTm90aWZpY2F0aW9uID0gbm90aWZpY2F0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Tm90aWZpY2F0aW9uSWRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTm90aWZpY2F0aW9uSWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE5vdGlmaWNhdGlvbiBnZXROb3RpZmljYXRpb25faW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTm90aWZpY2F0aW9uOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9SYXRpbmcySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9SYXRpbmcySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTU4MTI5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvUmF0aW5nMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuUmF0aW5nMi4qOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5SYXRpbmcyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuUmF0aW5nMi5TdHlsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5SYXRpbmcyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUmF0aW5nMkltcGwgaW1wbGVtZW50cyBSYXRpbmcyUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUmF0aW5nMiI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NUWUxFID0gImFuZHJvaWQubWVkaWEucmF0aW5nMi5zdHlsZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WQUxVRSA9ICJhbmRyb2lkLm1lZGlhLnJhdGluZzIudmFsdWUiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgZmxvYXQgUkFUSU5HX05PVF9SQVRFRCA9IC0xLjBmOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBSYXRpbmcyIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtUmF0aW5nU3R5bGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBmbG9hdCBtUmF0aW5nVmFsdWU7Ci0KLSAgICBwcml2YXRlIFJhdGluZzJJbXBsKEBTdHlsZSBpbnQgcmF0aW5nU3R5bGUsIGZsb2F0IHJhdGluZykgewotICAgICAgICBtUmF0aW5nU3R5bGUgPSByYXRpbmdTdHlsZTsKLSAgICAgICAgbVJhdGluZ1ZhbHVlID0gcmF0aW5nOwotICAgICAgICBtSW5zdGFuY2UgPSBuZXcgUmF0aW5nMih0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiAiUmF0aW5nMjpzdHlsZT0iICsgbVJhdGluZ1N0eWxlICsgIiByYXRpbmc9IgotICAgICAgICAgICAgICAgICsgKG1SYXRpbmdWYWx1ZSA8IDAuMGYgPyAidW5yYXRlZCIgOiBTdHJpbmcudmFsdWVPZihtUmF0aW5nVmFsdWUpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHNfaW1wbChPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFJhdGluZzIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgUmF0aW5nMkltcGwgb3RoZXIgPSAoUmF0aW5nMkltcGwpICgoUmF0aW5nMikgb2JqKS5nZXRQcm92aWRlcigpOwotICAgICAgICByZXR1cm4gbVJhdGluZ1N0eWxlID09IG90aGVyLm1SYXRpbmdTdHlsZQotICAgICAgICAgICAgICAgICYmIG1SYXRpbmdWYWx1ZSA9PSBvdGhlci5tUmF0aW5nVmFsdWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gT2JqZWN0cy5oYXNoKG1SYXRpbmdTdHlsZSwgbVJhdGluZ1ZhbHVlKTsKLSAgICB9Ci0KLSAgICBSYXRpbmcyIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBmcm9tQnVuZGxlX2ltcGwoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgUmF0aW5nMkltcGwoYnVuZGxlLmdldEludChLRVlfU1RZTEUpLCBidW5kbGUuZ2V0RmxvYXQoS0VZX1ZBTFVFKSkuZ2V0SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQnVuZGxlIHRvQnVuZGxlX2ltcGwoKSB7Ci0gICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX1NUWUxFLCBtUmF0aW5nU3R5bGUpOwotICAgICAgICBidW5kbGUucHV0RmxvYXQoS0VZX1ZBTFVFLCBtUmF0aW5nVmFsdWUpOwotICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBuZXdVbnJhdGVkUmF0aW5nX2ltcGwoQFN0eWxlIGludCByYXRpbmdTdHlsZSkgewotICAgICAgICBzd2l0Y2gocmF0aW5nU3R5bGUpIHsKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HX0hFQVJUOgotICAgICAgICAgICAgY2FzZSBSQVRJTkdfVEhVTUJfVVBfRE9XTjoKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzNfU1RBUlM6Ci0gICAgICAgICAgICBjYXNlIFJBVElOR180X1NUQVJTOgotICAgICAgICAgICAgY2FzZSBSQVRJTkdfNV9TVEFSUzoKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HX1BFUkNFTlRBR0U6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcySW1wbChyYXRpbmdTdHlsZSwgUkFUSU5HX05PVF9SQVRFRCkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJhdGluZzIgbmV3SGVhcnRSYXRpbmdfaW1wbChib29sZWFuIGhhc0hlYXJ0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgUmF0aW5nMkltcGwoUkFUSU5HX0hFQVJULCBoYXNIZWFydCA/IDEuMGYgOiAwLjBmKS5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBuZXdUaHVtYlJhdGluZ19pbXBsKGJvb2xlYW4gdGh1bWJJc1VwKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUmF0aW5nMkltcGwoUkFUSU5HX1RIVU1CX1VQX0RPV04sIHRodW1iSXNVcCA/IDEuMGYgOiAwLjBmKS5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBuZXdTdGFyUmF0aW5nX2ltcGwoaW50IHN0YXJSYXRpbmdTdHlsZSwgZmxvYXQgc3RhclJhdGluZykgewotICAgICAgICBmbG9hdCBtYXhSYXRpbmcgPSBSQVRJTkdfTk9UX1JBVEVEOwotICAgICAgICBzd2l0Y2goc3RhclJhdGluZ1N0eWxlKSB7Ci0gICAgICAgICAgICBjYXNlIFJBVElOR18zX1NUQVJTOgotICAgICAgICAgICAgICAgIG1heFJhdGluZyA9IDMuMGY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFJBVElOR180X1NUQVJTOgotICAgICAgICAgICAgICAgIG1heFJhdGluZyA9IDQuMGY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFJBVElOR181X1NUQVJTOgotICAgICAgICAgICAgICAgIG1heFJhdGluZyA9IDUuMGY7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkludmFsaWQgcmF0aW5nIHN0eWxlICgiICsgc3RhclJhdGluZ1N0eWxlICsgIikgZm9yIGEgc3RhciByYXRpbmciKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoKHN0YXJSYXRpbmcgPCAwLjBmKSB8fCAoc3RhclJhdGluZyA+IG1heFJhdGluZykpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIlRyeWluZyB0byBzZXQgb3V0IG9mIHJhbmdlIHN0YXItYmFzZWQgcmF0aW5nIik7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFJhdGluZzJJbXBsKHN0YXJSYXRpbmdTdHlsZSwgc3RhclJhdGluZykuZ2V0SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJhdGluZzIgbmV3UGVyY2VudGFnZVJhdGluZ19pbXBsKGZsb2F0IHBlcmNlbnQpIHsKLSAgICAgICAgaWYgKChwZXJjZW50IDwgMC4wZikgfHwgKHBlcmNlbnQgPiAxMDAuMGYpKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJJbnZhbGlkIHBlcmNlbnRhZ2UtYmFzZWQgcmF0aW5nIHZhbHVlIik7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUmF0aW5nMkltcGwoUkFUSU5HX1BFUkNFTlRBR0UsIHBlcmNlbnQpLmdldEluc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JhdGVkX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtUmF0aW5nVmFsdWUgPj0gMC4wZjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFJhdGluZ1N0eWxlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtUmF0aW5nU3R5bGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaGFzSGVhcnRfaW1wbCgpIHsKLSAgICAgICAgaWYgKG1SYXRpbmdTdHlsZSAhPSBSQVRJTkdfSEVBUlQpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAobVJhdGluZ1ZhbHVlID09IDEuMGYpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNUaHVtYlVwX2ltcGwoKSB7Ci0gICAgICAgIGlmIChtUmF0aW5nU3R5bGUgIT0gUkFUSU5HX1RIVU1CX1VQX0RPV04pIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiAobVJhdGluZ1ZhbHVlID09IDEuMGYpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZsb2F0IGdldFN0YXJSYXRpbmdfaW1wbCgpIHsKLSAgICAgICAgc3dpdGNoIChtUmF0aW5nU3R5bGUpIHsKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzNfU1RBUlM6Ci0gICAgICAgICAgICBjYXNlIFJBVElOR180X1NUQVJTOgotICAgICAgICAgICAgY2FzZSBSQVRJTkdfNV9TVEFSUzoKLSAgICAgICAgICAgICAgICBpZiAobUluc3RhbmNlLmlzUmF0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVJhdGluZ1ZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xLjBmOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZsb2F0IGdldFBlcmNlbnRSYXRpbmdfaW1wbCgpIHsKLSAgICAgICAgaWYgKChtUmF0aW5nU3R5bGUgIT0gUkFUSU5HX1BFUkNFTlRBR0UpIHx8ICFtSW5zdGFuY2UuaXNSYXRlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTEuMGY7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbVJhdGluZ1ZhbHVlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9Sb3V0ZVBsYXllci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9Sb3V0ZVBsYXllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDUwZDM0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvUm91dGVQbGF5ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5EYXRhU291cmNlRGVzYzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLlJlcXVpcmVzQXBpOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYUl0ZW1TdGF0dXM7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhU2Vzc2lvblN0YXR1czsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLlJlbW90ZVBsYXliYWNrQ2xpZW50OwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuUmVtb3RlUGxheWJhY2tDbGllbnQuSXRlbUFjdGlvbkNhbGxiYWNrOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuUmVtb3RlUGxheWJhY2tDbGllbnQuU2Vzc2lvbkFjdGlvbkNhbGxiYWNrOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuUmVtb3RlUGxheWJhY2tDbGllbnQuU3RhdHVzQ2FsbGJhY2s7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1AUmVxdWlyZXNBcGkoYXBpID0gQnVpbGQuVkVSU0lPTl9DT0RFUy5MT0xMSVBPUCkKLXB1YmxpYyBjbGFzcyBSb3V0ZVBsYXllciBleHRlbmRzIE1lZGlhU2Vzc2lvbi5DYWxsYmFjayB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIFBMQVlCQUNLX0FDVElPTlMgPSBQbGF5YmFja1N0YXRlLkFDVElPTl9QQVVTRQotICAgICAgICAgICAgfCBQbGF5YmFja1N0YXRlLkFDVElPTl9QTEFZIHwgUGxheWJhY2tTdGF0ZS5BQ1RJT05fU0VFS19UTwotICAgICAgICAgICAgfCBQbGF5YmFja1N0YXRlLkFDVElPTl9GQVNUX0ZPUldBUkQgfCBQbGF5YmFja1N0YXRlLkFDVElPTl9SRVdJTkQ7Ci0KLSAgICBwcml2YXRlIFJlbW90ZVBsYXliYWNrQ2xpZW50IG1DbGllbnQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVNlc3Npb25JZDsKLSAgICBwcml2YXRlIFN0cmluZyBtSXRlbUlkOwotICAgIHByaXZhdGUgUGxheWVyRXZlbnRDYWxsYmFjayBtQ2FsbGJhY2s7Ci0KLSAgICBwcml2YXRlIFN0YXR1c0NhbGxiYWNrIG1TdGF0dXNDYWxsYmFjayA9IG5ldyBTdGF0dXNDYWxsYmFjaygpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbVN0YXR1c0NoYW5nZWQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMsCi0gICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgIHVwZGF0ZUl0ZW1TdGF0dXMoaXRlbUlkLCBpdGVtU3RhdHVzKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwdWJsaWMgUm91dGVQbGF5ZXIoQ29udGV4dCBjb250ZXh0LCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgbUNsaWVudCA9IG5ldyBSZW1vdGVQbGF5YmFja0NsaWVudChjb250ZXh0LCByb3V0ZSk7Ci0gICAgICAgIG1DbGllbnQuc2V0U3RhdHVzQ2FsbGJhY2sobVN0YXR1c0NhbGxiYWNrKTsKLSAgICAgICAgbUNsaWVudC5zdGFydFNlc3Npb24obnVsbCwgbmV3IFNlc3Npb25BY3Rpb25DYWxsYmFjaygpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU2Vzc2lvblN0YXR1cyhzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBsYXkoKSB7Ci0gICAgICAgIG1DbGllbnQucmVzdW1lKG51bGwsIG5ldyBTZXNzaW9uQWN0aW9uQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25QYXVzZSgpIHsKLSAgICAgICAgbUNsaWVudC5wYXVzZShudWxsLCBuZXcgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU2Vla1RvKGxvbmcgcG9zKSB7Ci0gICAgICAgIG1DbGllbnQuc2VlayhtSXRlbUlkLCBwb3MsIG51bGwsIG5ldyBJdGVtQWN0aW9uQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlSXRlbVN0YXR1cyhpdGVtSWQsIGl0ZW1TdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7Ci0gICAgICAgIG1DbGllbnQuc3RvcChudWxsLCBuZXcgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBsYXllckV2ZW50Q2FsbGJhY2soUGxheWVyRXZlbnRDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvcGVuVmlkZW8oRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgIG1DbGllbnQucGxheShkc2QuZ2V0VXJpKCksICJ2aWRlby9tcDQiLCBudWxsLCAwLCBudWxsLCBuZXcgSXRlbUFjdGlvbkNhbGxiYWNrKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBpdGVtSWQsIE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU2Vzc2lvblN0YXR1cyhzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgICAgIHVwZGF0ZUl0ZW1TdGF0dXMoaXRlbUlkLCBpdGVtU3RhdHVzKTsKLSAgICAgICAgICAgICAgICBwbGF5SW50ZXJuYWwoZHNkLmdldFVyaSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLSAgICAgICAgaWYgKG1DbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNsaWVudC5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtQ2xpZW50ID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjayA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGxheUludGVybmFsKFVyaSB1cmkpIHsKLSAgICAgICAgbUNsaWVudC5wbGF5KHVyaSwgInZpZGVvL21wNCIsIG51bGwsIDAsIG51bGwsIG5ldyBJdGVtQWN0aW9uQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlSXRlbVN0YXR1cyhpdGVtSWQsIGl0ZW1TdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlU2Vzc2lvblN0YXR1cyhTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgewotICAgICAgICBtU2Vzc2lvbklkID0gc2Vzc2lvbklkOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVJdGVtU3RhdHVzKFN0cmluZyBpdGVtSWQsIE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzKSB7Ci0gICAgICAgIG1JdGVtSWQgPSBpdGVtSWQ7Ci0gICAgICAgIGlmIChpdGVtU3RhdHVzID09IG51bGwgfHwgbUNhbGxiYWNrID09IG51bGwpIHJldHVybjsKLSAgICAgICAgbUNhbGxiYWNrLm9uUGxheWVyU3RhdGVDaGFuZ2VkKGl0ZW1TdGF0dXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgUGxheWVyRXZlbnRDYWxsYmFjayB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWVyU3RhdGVDaGFuZ2VkKE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzKSB7IH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25QbGF5bGlzdEFnZW50LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25QbGF5bGlzdEFnZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjNTcwYWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9TZXNzaW9uUGxheWxpc3RBZ2VudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5EYXRhU291cmNlRGVzYzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZS5QbGF5ZXJFdmVudENhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5PbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheU1hcDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLkd1YXJkZWRCeTsKLWltcG9ydCBjb20uYW5kcm9pZC5pbnRlcm5hbC5hbm5vdGF0aW9ucy5WaXNpYmxlRm9yVGVzdGluZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGhyZWFkTG9jYWxSYW5kb207Ci0KLXB1YmxpYyBjbGFzcyBTZXNzaW9uUGxheWxpc3RBZ2VudCBleHRlbmRzIE1lZGlhUGxheWxpc3RBZ2VudCB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTZXNzaW9uUGxheWxpc3RBZ2VudCI7Ci0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgc3RhdGljIGZpbmFsIGludCBFTkRfT0ZfUExBWUxJU1QgPSAtMTsKLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBzdGF0aWMgZmluYWwgaW50IE5PX1ZBTElEX0lURU1TID0gLTI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFBsYXlJdGVtIG1Fb3BQbGF5SXRlbSA9IG5ldyBQbGF5SXRlbShFTkRfT0ZfUExBWUxJU1QsIG51bGwpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUxvY2sgPSBuZXcgT2JqZWN0KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBtU2Vzc2lvbkltcGw7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNeVBsYXllckV2ZW50Q2FsbGJhY2sgbVBsYXllckNhbGxiYWNrOwotCi0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgTWVkaWFQbGF5ZXJCYXNlIG1QbGF5ZXI7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgT25EYXRhU291cmNlTWlzc2luZ0hlbHBlciBtRHNtSGVscGVyOwotICAgIC8vIFRPRE86IENoZWNrIGlmIGhhdmluZyB0aGUgc2FtZSBpdGVtIGlzIG9rYXkgKGIvNzQwOTA3NDEpCi0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgQXJyYXlMaXN0PE1lZGlhSXRlbTI+IG1QbGF5bGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIEFycmF5TGlzdDxNZWRpYUl0ZW0yPiBtU2h1ZmZsZWRMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgTWFwPE1lZGlhSXRlbTIsIERhdGFTb3VyY2VEZXNjPiBtSXRlbURzZE1hcCA9IG5ldyBBcnJheU1hcDw+KCk7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgTWVkaWFNZXRhZGF0YTIgbU1ldGFkYXRhOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGludCBtUmVwZWF0TW9kZTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBpbnQgbVNodWZmbGVNb2RlOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIFBsYXlJdGVtIG1DdXJyZW50OwotCi0gICAgLy8gQ2FsbGVkIG9uIHNlc3Npb24gY2FsbGJhY2sgZXhlY3V0b3IuCi0gICAgcHJpdmF0ZSBjbGFzcyBNeVBsYXllckV2ZW50Q2FsbGJhY2sgZXh0ZW5kcyBQbGF5ZXJFdmVudENhbGxiYWNrIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQoQE5vbk51bGwgTWVkaWFQbGF5ZXJCYXNlIG1wYiwKLSAgICAgICAgICAgICAgICBATnVsbGFibGUgRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgICAgICBpZiAobVBsYXllciAhPSBtcGIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRzZCA9PSBudWxsICYmIG1DdXJyZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChtQ3VycmVudC5zaHVmZmxlZElkeCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgUGxheUl0ZW0gewotICAgICAgICBpbnQgc2h1ZmZsZWRJZHg7Ci0gICAgICAgIERhdGFTb3VyY2VEZXNjIGRzZDsKLSAgICAgICAgTWVkaWFJdGVtMiBtZWRpYUl0ZW07Ci0KLSAgICAgICAgUGxheUl0ZW0oaW50IHNodWZmbGVkSWR4KSB7Ci0gICAgICAgICAgICB0aGlzKHNodWZmbGVkSWR4LCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIFBsYXlJdGVtKGludCBzaHVmZmxlZElkeCwgRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgICAgICB0aGlzLnNodWZmbGVkSWR4ID0gc2h1ZmZsZWRJZHg7Ci0gICAgICAgICAgICBpZiAoc2h1ZmZsZWRJZHggPj0gMCkgewotICAgICAgICAgICAgICAgIHRoaXMubWVkaWFJdGVtID0gbVNodWZmbGVkTGlzdC5nZXQoc2h1ZmZsZWRJZHgpOwotICAgICAgICAgICAgICAgIGlmIChkc2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRzZCA9IHJldHJpZXZlRGF0YVNvdXJjZURlc2NMb2NrZWQodGhpcy5tZWRpYUl0ZW0pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhpcy5kc2QgPSBkc2Q7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICAgICAgaWYgKHRoaXMgPT0gbUVvcFBsYXlJdGVtKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWVkaWFJdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZHNkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2h1ZmZsZWRJZHggPj0gbVNodWZmbGVkTGlzdC5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWVkaWFJdGVtICE9IG1TaHVmZmxlZExpc3QuZ2V0KHNodWZmbGVkSWR4KSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZWRpYUl0ZW0uZ2V0RGF0YVNvdXJjZURlc2MoKSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmICFtZWRpYUl0ZW0uZ2V0RGF0YVNvdXJjZURlc2MoKS5lcXVhbHMoZHNkKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIFNlc3Npb25QbGF5bGlzdEFnZW50KEBOb25OdWxsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb25JbXBsLAotICAgICAgICAgICAgQE5vbk51bGwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllcikgewotICAgICAgICBpZiAoc2Vzc2lvbkltcGwgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2Vzc2lvbkltcGwgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGxheWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBsYXllciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIG1TZXNzaW9uSW1wbCA9IHNlc3Npb25JbXBsOwotICAgICAgICBtUGxheWVyID0gcGxheWVyOwotICAgICAgICBtUGxheWVyQ2FsbGJhY2sgPSBuZXcgTXlQbGF5ZXJFdmVudENhbGxiYWNrKCk7Ci0gICAgICAgIG1QbGF5ZXIucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKG1TZXNzaW9uSW1wbC5nZXRDYWxsYmFja0V4ZWN1dG9yKCksIG1QbGF5ZXJDYWxsYmFjayk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGxheWVyKEBOb25OdWxsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIpIHsKLSAgICAgICAgaWYgKHBsYXllciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwbGF5ZXIgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAocGxheWVyID09IG1QbGF5ZXIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUGxheWVyLnVucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKG1QbGF5ZXJDYWxsYmFjayk7Ci0gICAgICAgICAgICBtUGxheWVyID0gcGxheWVyOwotICAgICAgICAgICAgbVBsYXllci5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2soCi0gICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSW1wbC5nZXRDYWxsYmFja0V4ZWN1dG9yKCksIG1QbGF5ZXJDYWxsYmFjayk7Ci0gICAgICAgICAgICB1cGRhdGVQbGF5ZXJEYXRhU291cmNlTG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyKE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIgaGVscGVyKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1Ec21IZWxwZXIgPSBoZWxwZXI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBjbGVhck9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1Ec21IZWxwZXIgPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBOdWxsYWJsZSBMaXN0PE1lZGlhSXRlbTI+IGdldFBsYXlsaXN0KCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChtUGxheWxpc3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UGxheWxpc3QoQE5vbk51bGwgTGlzdDxNZWRpYUl0ZW0yPiBsaXN0LCBATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGlzdCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbUl0ZW1Ec2RNYXAuY2xlYXIoKTsKLQotICAgICAgICAgICAgbVBsYXlsaXN0LmNsZWFyKCk7Ci0gICAgICAgICAgICBtUGxheWxpc3QuYWRkQWxsKGxpc3QpOwotICAgICAgICAgICAgYXBwbHlTaHVmZmxlTW9kZUxvY2tlZCgpOwotCi0gICAgICAgICAgICBtTWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICAgICAgICAgIG1DdXJyZW50ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQoRU5EX09GX1BMQVlMSVNULCAxKTsKLSAgICAgICAgICAgIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKTsKLSAgICAgICAgfQotICAgICAgICBub3RpZnlQbGF5bGlzdENoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIGdldFBsYXlsaXN0TWV0YWRhdGEoKSB7Ci0gICAgICAgIHJldHVybiBtTWV0YWRhdGE7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdXBkYXRlUGxheWxpc3RNZXRhZGF0YShATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKG1ldGFkYXRhID09IG1NZXRhZGF0YSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeVBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkUGxheWxpc3RJdGVtKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpbmRleCA9IGNsYW1wKGluZGV4LCBtUGxheWxpc3Quc2l6ZSgpKTsKLSAgICAgICAgICAgIGludCBzaHVmZmxlZElkeCA9IGluZGV4OwotICAgICAgICAgICAgbVBsYXlsaXN0LmFkZChpbmRleCwgaXRlbSk7Ci0gICAgICAgICAgICBpZiAobVNodWZmbGVNb2RlID09IE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfTk9ORSkgewotICAgICAgICAgICAgICAgIG1TaHVmZmxlZExpc3QuYWRkKGluZGV4LCBpdGVtKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBpdGVtIGluIHJhbmRvbSBwb3NpdGlvbiBvZiBtU2h1ZmZsZWRMaXN0LgotICAgICAgICAgICAgICAgIHNodWZmbGVkSWR4ID0gVGhyZWFkTG9jYWxSYW5kb20uY3VycmVudCgpLm5leHRJbnQobVNodWZmbGVkTGlzdC5zaXplKCkgKyAxKTsKLSAgICAgICAgICAgICAgICBtU2h1ZmZsZWRMaXN0LmFkZChzaHVmZmxlZElkeCwgaXRlbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWhhc1ZhbGlkSXRlbSgpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChFTkRfT0ZfUExBWUxJU1QsIDEpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5UGxheWxpc3RDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGxheWxpc3RJdGVtKEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKCFtUGxheWxpc3QucmVtb3ZlKGl0ZW0pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNodWZmbGVkTGlzdC5yZW1vdmUoaXRlbSk7Ci0gICAgICAgICAgICBtSXRlbURzZE1hcC5yZW1vdmUoaXRlbSk7Ci0gICAgICAgICAgICB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKTsKLSAgICAgICAgfQotICAgICAgICBub3RpZnlQbGF5bGlzdENoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZXBsYWNlUGxheWxpc3RJdGVtKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobVBsYXlsaXN0LnNpemUoKSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5kZXggPSBjbGFtcChpbmRleCwgbVBsYXlsaXN0LnNpemUoKSAtIDEpOwotICAgICAgICAgICAgaW50IHNodWZmbGVkSWR4ID0gbVNodWZmbGVkTGlzdC5pbmRleE9mKG1QbGF5bGlzdC5nZXQoaW5kZXgpKTsKLSAgICAgICAgICAgIG1JdGVtRHNkTWFwLnJlbW92ZShtU2h1ZmZsZWRMaXN0LmdldChzaHVmZmxlZElkeCkpOwotICAgICAgICAgICAgbVNodWZmbGVkTGlzdC5zZXQoc2h1ZmZsZWRJZHgsIGl0ZW0pOwotICAgICAgICAgICAgbVBsYXlsaXN0LnNldChpbmRleCwgaXRlbSk7Ci0gICAgICAgICAgICBpZiAoIWhhc1ZhbGlkSXRlbSgpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChFTkRfT0ZfUExBWUxJU1QsIDEpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5UGxheWxpc3RDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUGxheWxpc3RJdGVtKEBOb25OdWxsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKCFoYXNWYWxpZEl0ZW0oKSB8fCBpdGVtLmVxdWFscyhtQ3VycmVudC5tZWRpYUl0ZW0pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHNodWZmbGVkSWR4ID0gbVNodWZmbGVkTGlzdC5pbmRleE9mKGl0ZW0pOwotICAgICAgICAgICAgaWYgKHNodWZmbGVkSWR4IDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DdXJyZW50ID0gbmV3IFBsYXlJdGVtKHNodWZmbGVkSWR4KTsKLSAgICAgICAgICAgIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUHJldmlvdXNJdGVtKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAoIWhhc1ZhbGlkSXRlbSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUGxheUl0ZW0gcHJldiA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKG1DdXJyZW50LnNodWZmbGVkSWR4LCAtMSk7Ci0gICAgICAgICAgICBpZiAocHJldiAhPSBtRW9wUGxheUl0ZW0pIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudCA9IHByZXY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKTsKLSAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvTmV4dEl0ZW0oKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmICghaGFzVmFsaWRJdGVtKCkgfHwgbUN1cnJlbnQgPT0gbUVvcFBsYXlJdGVtKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUGxheUl0ZW0gbmV4dCA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKG1DdXJyZW50LnNodWZmbGVkSWR4LCAxKTsKLSAgICAgICAgICAgIGlmIChuZXh0ICE9IG1Fb3BQbGF5SXRlbSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50ID0gbmV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRSZXBlYXRNb2RlKCkgewotICAgICAgICByZXR1cm4gbVJlcGVhdE1vZGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UmVwZWF0TW9kZShpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICBpZiAocmVwZWF0TW9kZSA8IE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FCi0gICAgICAgICAgICAgICAgfHwgcmVwZWF0TW9kZSA+IE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9HUk9VUCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmIChtUmVwZWF0TW9kZSA9PSByZXBlYXRNb2RlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVJlcGVhdE1vZGUgPSByZXBlYXRNb2RlOwotICAgICAgICAgICAgc3dpdGNoIChyZXBlYXRNb2RlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfT05FOgotICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnQgIT0gbnVsbCAmJiBtQ3VycmVudCAhPSBtRW9wUGxheUl0ZW0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5ZXIubG9vcEN1cnJlbnQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfQUxMOgotICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0dST1VQOgotICAgICAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnQgPT0gbUVvcFBsYXlJdGVtKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudCA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKEVORF9PRl9QTEFZTElTVCwgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5ZXJEYXRhU291cmNlTG9ja2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gcGFzcyB0aHJvdWdoCi0gICAgICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfTk9ORToKLSAgICAgICAgICAgICAgICAgICAgbVBsYXllci5sb29wQ3VycmVudChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeVJlcGVhdE1vZGVDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRTaHVmZmxlTW9kZSgpIHsKLSAgICAgICAgcmV0dXJuIG1TaHVmZmxlTW9kZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTaHVmZmxlTW9kZShpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgaWYgKHNodWZmbGVNb2RlIDwgTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FCi0gICAgICAgICAgICAgICAgfHwgc2h1ZmZsZU1vZGUgPiBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0dST1VQKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKG1TaHVmZmxlTW9kZSA9PSBzaHVmZmxlTW9kZSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TaHVmZmxlTW9kZSA9IHNodWZmbGVNb2RlOwotICAgICAgICAgICAgYXBwbHlTaHVmZmxlTW9kZUxvY2tlZCgpOwotICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5U2h1ZmZsZU1vZGVDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgaW50IGdldEN1clNodWZmbGVkSW5kZXgoKSB7Ci0gICAgICAgIHJldHVybiBoYXNWYWxpZEl0ZW0oKSA/IG1DdXJyZW50LnNodWZmbGVkSWR4IDogTk9fVkFMSURfSVRFTVM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhc1ZhbGlkSXRlbSgpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJyZW50ICE9IG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBEYXRhU291cmNlRGVzYyByZXRyaWV2ZURhdGFTb3VyY2VEZXNjTG9ja2VkKE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBEYXRhU291cmNlRGVzYyBkc2QgPSBpdGVtLmdldERhdGFTb3VyY2VEZXNjKCk7Ci0gICAgICAgIGlmIChkc2QgIT0gbnVsbCkgewotICAgICAgICAgICAgbUl0ZW1Ec2RNYXAucHV0KGl0ZW0sIGRzZCk7Ci0gICAgICAgICAgICByZXR1cm4gZHNkOwotICAgICAgICB9Ci0gICAgICAgIGRzZCA9IG1JdGVtRHNkTWFwLmdldChpdGVtKTsKLSAgICAgICAgaWYgKGRzZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZHNkOwotICAgICAgICB9Ci0gICAgICAgIE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIgaGVscGVyID0gbURzbUhlbHBlcjsKLSAgICAgICAgaWYgKGhlbHBlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBEbyBub3QgY2FsbCBvbkRhdGFTb3VyY2VNaXNzaW5nIHdpdGggdGhlIGxvY2sgKGIvNzQwOTA3NDEpLgotICAgICAgICAgICAgZHNkID0gaGVscGVyLm9uRGF0YVNvdXJjZU1pc3NpbmcobVNlc3Npb25JbXBsLmdldEluc3RhbmNlKCksIGl0ZW0pOwotICAgICAgICAgICAgaWYgKGRzZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUl0ZW1Ec2RNYXAucHV0KGl0ZW0sIGRzZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRzZDsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBjb25zaWRlciB0byBjYWxsIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCBpbnNpZGUgKGIvNzQwOTA3NDEpCi0gICAgcHJpdmF0ZSBQbGF5SXRlbSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChpbnQgY3VyU2h1ZmZsZWRJZHgsIGludCBkaXJlY3Rpb24pIHsKLSAgICAgICAgaW50IHNpemUgPSBtUGxheWxpc3Quc2l6ZSgpOwotICAgICAgICBpZiAoY3VyU2h1ZmZsZWRJZHggPT0gRU5EX09GX1BMQVlMSVNUKSB7Ci0gICAgICAgICAgICBjdXJTaHVmZmxlZElkeCA9IChkaXJlY3Rpb24gPiAwKSA/IC0xIDogc2l6ZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgY3VyU2h1ZmZsZWRJZHggKz0gZGlyZWN0aW9uOwotICAgICAgICAgICAgaWYgKGN1clNodWZmbGVkSWR4IDwgMCB8fCBjdXJTaHVmZmxlZElkeCA+PSBtUGxheWxpc3Quc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1SZXBlYXRNb2RlID09IFJFUEVBVF9NT0RFX05PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpID09IHNpemUgLSAxKSA/IG51bGwgOiBtRW9wUGxheUl0ZW07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY3VyU2h1ZmZsZWRJZHggPSBjdXJTaHVmZmxlZElkeCA8IDAgPyBtUGxheWxpc3Quc2l6ZSgpIC0gMSA6IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgRGF0YVNvdXJjZURlc2MgZHNkID0gcmV0cmlldmVEYXRhU291cmNlRGVzY0xvY2tlZChtU2h1ZmZsZWRMaXN0LmdldChjdXJTaHVmZmxlZElkeCkpOwotICAgICAgICAgICAgaWYgKGRzZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQbGF5SXRlbShjdXJTaHVmZmxlZElkeCwgZHNkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCkgewotICAgICAgICBpZiAoIWhhc1ZhbGlkSXRlbSgpIHx8IG1DdXJyZW50LmlzVmFsaWQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGludCBzaHVmZmxlZElkeCA9IG1TaHVmZmxlZExpc3QuaW5kZXhPZihtQ3VycmVudC5tZWRpYUl0ZW0pOwotICAgICAgICBpZiAoc2h1ZmZsZWRJZHggPj0gMCkgewotICAgICAgICAgICAgLy8gQWRkZWQgYW4gaXRlbS4KLSAgICAgICAgICAgIG1DdXJyZW50LnNodWZmbGVkSWR4ID0gc2h1ZmZsZWRJZHg7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUN1cnJlbnQuc2h1ZmZsZWRJZHggPj0gbVNodWZmbGVkTGlzdC5zaXplKCkpIHsKLSAgICAgICAgICAgIG1DdXJyZW50ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQobVNodWZmbGVkTGlzdC5zaXplKCkgLSAxLCAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1DdXJyZW50Lm1lZGlhSXRlbSA9IG1TaHVmZmxlZExpc3QuZ2V0KG1DdXJyZW50LnNodWZmbGVkSWR4KTsKLSAgICAgICAgICAgIGlmIChyZXRyaWV2ZURhdGFTb3VyY2VEZXNjTG9ja2VkKG1DdXJyZW50Lm1lZGlhSXRlbSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQobUN1cnJlbnQuc2h1ZmZsZWRJZHgsIDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQbGF5ZXJEYXRhU291cmNlTG9ja2VkKCkgewotICAgICAgICBpZiAobUN1cnJlbnQgPT0gbnVsbCB8fCBtQ3VycmVudCA9PSBtRW9wUGxheUl0ZW0pIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAobVBsYXllci5nZXRDdXJyZW50RGF0YVNvdXJjZSgpICE9IG1DdXJyZW50LmRzZCkgewotICAgICAgICAgICAgbVBsYXllci5zZXREYXRhU291cmNlKG1DdXJyZW50LmRzZCk7Ci0gICAgICAgICAgICBtUGxheWVyLmxvb3BDdXJyZW50KG1SZXBlYXRNb2RlID09IE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9PTkUpOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE86IENhbGwgc2V0TmV4dERhdGFTb3VyY2UgKGIvNzQwOTA3NDEpCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGx5U2h1ZmZsZU1vZGVMb2NrZWQoKSB7Ci0gICAgICAgIG1TaHVmZmxlZExpc3QuY2xlYXIoKTsKLSAgICAgICAgbVNodWZmbGVkTGlzdC5hZGRBbGwobVBsYXlsaXN0KTsKLSAgICAgICAgaWYgKG1TaHVmZmxlTW9kZSA9PSBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0FMTAotICAgICAgICAgICAgICAgIHx8IG1TaHVmZmxlTW9kZSA9PSBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0dST1VQKSB7Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy5zaHVmZmxlKG1TaHVmZmxlZExpc3QpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gQ2xhbXBzIHZhbHVlIHRvIFswLCBzaXplXQotICAgIHByaXZhdGUgc3RhdGljIGludCBjbGFtcChpbnQgdmFsdWUsIGludCBzaXplKSB7Ci0gICAgICAgIGlmICh2YWx1ZSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAodmFsdWUgPiBzaXplKSA/IHNpemUgOiB2YWx1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25Ub2tlbjJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25Ub2tlbjJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1Y2Y4YzQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9TZXNzaW9uVG9rZW4ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yLlRZUEVfU0VTU0lPTjsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yLlRZUEVfU0VTU0lPTl9TRVJWSUNFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9MSUJSQVJZX1NFUlZJQ0U7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMi5Ub2tlblR5cGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuU2Vzc2lvblRva2VuMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBTZXNzaW9uVG9rZW4ySW1wbCBpbXBsZW1lbnRzIFNlc3Npb25Ub2tlbjJQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9VSUQgPSAiYW5kcm9pZC5tZWRpYS50b2tlbi51aWQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVFlQRSA9ICJhbmRyb2lkLm1lZGlhLnRva2VuLnR5cGUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUEFDS0FHRV9OQU1FID0gImFuZHJvaWQubWVkaWEudG9rZW4ucGFja2FnZV9uYW1lIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFUlZJQ0VfTkFNRSA9ICJhbmRyb2lkLm1lZGlhLnRva2VuLnNlcnZpY2VfbmFtZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9JRCA9ICJhbmRyb2lkLm1lZGlhLnRva2VuLmlkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFU1NJT05fQklOREVSID0gImFuZHJvaWQubWVkaWEudG9rZW4uc2Vzc2lvbl9iaW5kZXIiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uVG9rZW4yIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtVWlkOwotICAgIHByaXZhdGUgZmluYWwgQFRva2VuVHlwZSBpbnQgbVR5cGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVBhY2thZ2VOYW1lOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1TZXJ2aWNlTmFtZTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtSWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBJTWVkaWFTZXNzaW9uMiBtU2Vzc2lvbkJpbmRlcjsKLQotICAgIC8qKgotICAgICAqIFB1YmxpYyBjb25zdHJ1Y3RvciBmb3IgdGhlIGxlZ2FjeSBzdXBwb3J0IChpLmUuIGJyb3dzZXIgY2FuIHRyeSBjb25uZWN0aW5nIHRvIGFueSBicm93c2VyCi0gICAgICogc2VydmljZSBpZiBpdCBrbm93cyB0aGUgc2VydmljZSBuYW1lKQotICAgICAqLwotICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4ySW1wbChDb250ZXh0IGNvbnRleHQsIFNlc3Npb25Ub2tlbjIgaW5zdGFuY2UsCi0gICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBzZXJ2aWNlTmFtZSwgaW50IHVpZCkgewotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocGFja2FnZU5hbWUpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYWNrYWdlTmFtZSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoc2VydmljZU5hbWUpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZXJ2aWNlTmFtZSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgfQotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgLy8gQ2FsY3VsYXRlIHVpZCBpZiBpdCdzIG5vdCBzcGVjaWZpZWQuCi0gICAgICAgIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIG1hbmFnZXIgPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7Ci0gICAgICAgIGlmICh1aWQgPCAwKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHVpZCA9IG1hbmFnZXIuZ2V0UGFja2FnZVVpZChwYWNrYWdlTmFtZSwgMCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOYW1lTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBmaW5kIHBhY2thZ2UgIiArIHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtVWlkID0gdWlkOwotCi0gICAgICAgIC8vIEluZmVyIGlkIGFuZCB0eXBlIGZyb20gcGFja2FnZSBuYW1lIGFuZCBzZXJ2aWNlIG5hbWUKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgbXVsdGktdXNlci4KLSAgICAgICAgU3RyaW5nIGlkID0gZ2V0U2Vzc2lvbklkRnJvbVNlcnZpY2UobWFuYWdlciwgTWVkaWFMaWJyYXJ5U2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UsCi0gICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsIHNlcnZpY2VOYW1lKTsKLSAgICAgICAgaWYgKGlkICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1JZCA9IGlkOwotICAgICAgICAgICAgbVR5cGUgPSBUWVBFX0xJQlJBUllfU0VSVklDRTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIHJldHJ5IHdpdGggc2Vzc2lvbiBzZXJ2aWNlCi0gICAgICAgICAgICBtSWQgPSBnZXRTZXNzaW9uSWRGcm9tU2VydmljZShtYW5hZ2VyLCBNZWRpYVNlc3Npb25TZXJ2aWNlMi5TRVJWSUNFX0lOVEVSRkFDRSwKLSAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsIHNlcnZpY2VOYW1lKTsKLSAgICAgICAgICAgIG1UeXBlID0gVFlQRV9TRVNTSU9OX1NFUlZJQ0U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1JZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZXJ2aWNlICIgKyBzZXJ2aWNlTmFtZSArICIgZG9lc24ndCBpbXBsZW1lbnQiCi0gICAgICAgICAgICAgICAgICAgICsgIiBzZXNzaW9uIHNlcnZpY2Ugbm9yIGxpYnJhcnkgc2VydmljZS4gVXNlIHNlcnZpY2UncyBmdWxsIG5hbWUuIik7Ci0gICAgICAgIH0KLSAgICAgICAgbVBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7Ci0gICAgICAgIG1TZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOwotICAgICAgICBtU2Vzc2lvbkJpbmRlciA9IG51bGw7Ci0gICAgfQotCi0gICAgU2Vzc2lvblRva2VuMkltcGwoaW50IHVpZCwgaW50IHR5cGUsIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHNlcnZpY2VOYW1lLCBTdHJpbmcgaWQsCi0gICAgICAgICAgICBJTWVkaWFTZXNzaW9uMiBzZXNzaW9uQmluZGVyKSB7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogQWRkIHNhbml0eSBjaGVjayAoYi83Mzg2Mzg2NSkKLSAgICAgICAgbVVpZCA9IHVpZDsKLSAgICAgICAgbVR5cGUgPSB0eXBlOwotICAgICAgICBtUGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKLSAgICAgICAgbVNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7Ci0gICAgICAgIG1JZCA9IGlkOwotICAgICAgICBtU2Vzc2lvbkJpbmRlciA9IHNlc3Npb25CaW5kZXI7Ci0gICAgICAgIG1JbnN0YW5jZSA9IG5ldyBTZXNzaW9uVG9rZW4yKHRoaXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRTZXNzaW9uSWRGcm9tU2VydmljZShQYWNrYWdlTWFuYWdlciBtYW5hZ2VyLCBTdHJpbmcgc2VydmljZUludGVyZmFjZSwKLSAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHNlcnZpY2VOYW1lKSB7Ci0gICAgICAgIEludGVudCBzZXJ2aWNlSW50ZW50ID0gbmV3IEludGVudChzZXJ2aWNlSW50ZXJmYWNlKTsKLSAgICAgICAgc2VydmljZUludGVudC5zZXRQYWNrYWdlKHBhY2thZ2VOYW1lKTsKLSAgICAgICAgLy8gVXNlIHF1ZXJ5SW50ZW50U2VydmljZXMgdG8gZmluZCBzZXJ2aWNlcyB3aXRoIE1lZGlhTGlicmFyeVNlcnZpY2UyLlNFUlZJQ0VfSU5URVJGQUNFLgotICAgICAgICAvLyBXZSBjYW5ub3QgdXNlIHJlc29sdmVTZXJ2aWNlIHdpdGggaW50ZW50IHNwZWNpZmllZCBjbGFzcyBuYW1lLCBiZWNhdXNlIHJlc29sdmVTZXJ2aWNlCi0gICAgICAgIC8vIGlnbm9yZXMgYWN0aW9ucyBpZiBJbnRlbnQuc2V0Q2xhc3NOYW1lKCkgaXMgc3BlY2lmaWVkLgotICAgICAgICBMaXN0PFJlc29sdmVJbmZvPiBsaXN0ID0gbWFuYWdlci5xdWVyeUludGVudFNlcnZpY2VzKAotICAgICAgICAgICAgICAgIHNlcnZpY2VJbnRlbnQsIFBhY2thZ2VNYW5hZ2VyLkdFVF9NRVRBX0RBVEEpOwotICAgICAgICBpZiAobGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBSZXNvbHZlSW5mbyByZXNvbHZlSW5mbyA9IGxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlSW5mbyA9PSBudWxsIHx8IHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuZXF1YWxzKHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvLm5hbWUsIHNlcnZpY2VOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0U2Vzc2lvbklkKHJlc29sdmVJbmZvKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgZ2V0U2Vzc2lvbklkKFJlc29sdmVJbmZvIHJlc29sdmVJbmZvKSB7Ci0gICAgICAgIGlmIChyZXNvbHZlSW5mbyA9PSBudWxsIHx8IHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgaWYgKHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvLm1ldGFEYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiByZXNvbHZlSW5mby5zZXJ2aWNlSW5mby5tZXRhRGF0YS5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhU2Vzc2lvblNlcnZpY2UyLlNFUlZJQ0VfTUVUQV9EQVRBLCAiIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU2Vzc2lvblRva2VuMiBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtUGFja2FnZU5hbWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRVaWRfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1VaWQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRJZF9pbXAoKSB7Ci0gICAgICAgIHJldHVybiBtSWQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRUeXBlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtVHlwZTsKLSAgICB9Ci0KLSAgICBTdHJpbmcgZ2V0U2VydmljZU5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtU2VydmljZU5hbWU7Ci0gICAgfQotCi0gICAgSU1lZGlhU2Vzc2lvbjIgZ2V0U2Vzc2lvbkJpbmRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9uQmluZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU2Vzc2lvblRva2VuMiBmcm9tQnVuZGxlX2ltcGwoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGludCB1aWQgPSBidW5kbGUuZ2V0SW50KEtFWV9VSUQpOwotICAgICAgICBmaW5hbCBAVG9rZW5UeXBlIGludCB0eXBlID0gYnVuZGxlLmdldEludChLRVlfVFlQRSwgLTEpOwotICAgICAgICBmaW5hbCBTdHJpbmcgcGFja2FnZU5hbWUgPSBidW5kbGUuZ2V0U3RyaW5nKEtFWV9QQUNLQUdFX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgc2VydmljZU5hbWUgPSBidW5kbGUuZ2V0U3RyaW5nKEtFWV9TRVJWSUNFX05BTUUpOwotICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSBidW5kbGUuZ2V0U3RyaW5nKEtFWV9JRCk7Ci0gICAgICAgIGZpbmFsIElCaW5kZXIgc2Vzc2lvbkJpbmRlciA9IGJ1bmRsZS5nZXRCaW5kZXIoS0VZX1NFU1NJT05fQklOREVSKTsKLQotICAgICAgICAvLyBTYW5pdHkgY2hlY2suCi0gICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgY2FzZSBUWVBFX1NFU1NJT046Ci0gICAgICAgICAgICAgICAgaWYgKHNlc3Npb25CaW5kZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmV4cGVjdGVkIHNlc3Npb25CaW5kZXIgZm9yIHNlc3Npb24sIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBiaW5kZXI9IiArIHNlc3Npb25CaW5kZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVFlQRV9TRVNTSU9OX1NFUlZJQ0U6Ci0gICAgICAgICAgICBjYXNlIFRZUEVfTElCUkFSWV9TRVJWSUNFOgotICAgICAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzZXJ2aWNlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiU2Vzc2lvbiBzZXJ2aWNlIG5lZWRzIHNlcnZpY2UgbmFtZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSW52YWxpZCB0eXBlIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHBhY2thZ2VOYW1lKSB8fCBpZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJQYWNrYWdlIG5hbWUgbm9yIElEIGNhbm5vdCBiZSBudWxsLiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgU2Vzc2lvblRva2VuMkltcGwodWlkLCB0eXBlLCBwYWNrYWdlTmFtZSwgc2VydmljZU5hbWUsIGlkLAotICAgICAgICAgICAgICAgIHNlc3Npb25CaW5kZXIgIT0gbnVsbCA/IElNZWRpYVNlc3Npb24yLlN0dWIuYXNJbnRlcmZhY2Uoc2Vzc2lvbkJpbmRlcikgOiBudWxsKQotICAgICAgICAgICAgICAgIC5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdW5kbGUgdG9CdW5kbGVfaW1wbCgpIHsKLSAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgYnVuZGxlLnB1dEludChLRVlfVUlELCBtVWlkKTsKLSAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhLRVlfUEFDS0FHRV9OQU1FLCBtUGFja2FnZU5hbWUpOwotICAgICAgICBidW5kbGUucHV0U3RyaW5nKEtFWV9TRVJWSUNFX05BTUUsIG1TZXJ2aWNlTmFtZSk7Ci0gICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX0lELCBtSWQpOwotICAgICAgICBidW5kbGUucHV0SW50KEtFWV9UWVBFLCBtVHlwZSk7Ci0gICAgICAgIGJ1bmRsZS5wdXRCaW5kZXIoS0VZX1NFU1NJT05fQklOREVSLAotICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyICE9IG51bGwgPyBtU2Vzc2lvbkJpbmRlci5hc0JpbmRlcigpIDogbnVsbCk7Ci0gICAgICAgIHJldHVybiBidW5kbGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZV9pbXBsKCkgewotICAgICAgICBmaW5hbCBpbnQgcHJpbWUgPSAzMTsKLSAgICAgICAgcmV0dXJuIG1UeXBlCi0gICAgICAgICAgICAgICAgKyBwcmltZSAqIChtVWlkCi0gICAgICAgICAgICAgICAgKyBwcmltZSAqIChtUGFja2FnZU5hbWUuaGFzaENvZGUoKQotICAgICAgICAgICAgICAgICsgcHJpbWUgKiAobUlkLmhhc2hDb2RlKCkKLSAgICAgICAgICAgICAgICArIHByaW1lICogKG1TZXJ2aWNlTmFtZSAhPSBudWxsID8gbVNlcnZpY2VOYW1lLmhhc2hDb2RlKCkgOiAwKSkpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHNfaW1wbChPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFNlc3Npb25Ub2tlbjIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgU2Vzc2lvblRva2VuMkltcGwgb3RoZXIgPSBmcm9tKChTZXNzaW9uVG9rZW4yKSBvYmopOwotICAgICAgICByZXR1cm4gbVVpZCA9PSBvdGhlci5tVWlkCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmVxdWFscyhtUGFja2FnZU5hbWUsIG90aGVyLm1QYWNrYWdlTmFtZSkKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuZXF1YWxzKG1TZXJ2aWNlTmFtZSwgb3RoZXIubVNlcnZpY2VOYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5lcXVhbHMobUlkLCBvdGhlci5tSWQpCi0gICAgICAgICAgICAgICAgJiYgbVR5cGUgPT0gb3RoZXIubVR5cGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZ19pbXBsKCkgewotICAgICAgICByZXR1cm4gIlNlc3Npb25Ub2tlbiB7cGtnPSIgKyBtUGFja2FnZU5hbWUgKyAiIGlkPSIgKyBtSWQgKyAiIHR5cGU9IiArIG1UeXBlCi0gICAgICAgICAgICAgICAgKyAiIHNlcnZpY2U9IiArIG1TZXJ2aWNlTmFtZSArICIgYmluZGVyPSIgKyBtU2Vzc2lvbkJpbmRlciArICJ9IjsKLSAgICB9Ci0KLSAgICBzdGF0aWMgU2Vzc2lvblRva2VuMkltcGwgZnJvbShTZXNzaW9uVG9rZW4yIHRva2VuKSB7Ci0gICAgICAgIHJldHVybiAoKFNlc3Npb25Ub2tlbjJJbXBsKSB0b2tlbi5nZXRQcm92aWRlcigpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1ZvbHVtZVByb3ZpZGVyMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvVm9sdW1lUHJvdmlkZXIySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjIyZTFiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvVm9sdW1lUHJvdmlkZXIySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjIuVk9MVU1FX0NPTlRST0xfQUJTT0xVVEU7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIyLlZPTFVNRV9DT05UUk9MX0ZJWEVEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMi5WT0xVTUVfQ09OVFJPTF9SRUxBVElWRTsKLQotaW1wb3J0IGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZvbHVtZVByb3ZpZGVyMlByb3ZpZGVyOwotCi1wdWJsaWMgY2xhc3MgVm9sdW1lUHJvdmlkZXIySW1wbCBpbXBsZW1lbnRzIFZvbHVtZVByb3ZpZGVyMlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIFZvbHVtZVByb3ZpZGVyMiBtSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUNvbnRyb2xUeXBlOwotICAgIHByaXZhdGUgZmluYWwgaW50IG1NYXhWb2x1bWU7Ci0KLSAgICBwcml2YXRlIGludCBtQ3VycmVudFZvbHVtZTsKLSAgICBwcml2YXRlIENhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHB1YmxpYyBWb2x1bWVQcm92aWRlcjJJbXBsKFZvbHVtZVByb3ZpZGVyMiBpbnN0YW5jZSwKLSAgICAgICAgICAgIEBWb2x1bWVQcm92aWRlcjIuQ29udHJvbFR5cGUgaW50IGNvbnRyb2xUeXBlLCBpbnQgbWF4Vm9sdW1lLCBpbnQgY3VycmVudFZvbHVtZSkgewotICAgICAgICBpZiAoY29udHJvbFR5cGUgIT0gVk9MVU1FX0NPTlRST0xfRklYRUQgJiYgY29udHJvbFR5cGUgIT0gVk9MVU1FX0NPTlRST0xfUkVMQVRJVkUKLSAgICAgICAgICAgICAgICAmJiBjb250cm9sVHlwZSAhPSBWT0xVTUVfQ09OVFJPTF9BQlNPTFVURSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigid3JvbmcgY29udHJvbFR5cGUgIiArIGNvbnRyb2xUeXBlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWF4Vm9sdW1lIDwgMCB8fCBjdXJyZW50Vm9sdW1lIDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidm9sdW1lIHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBtYXhWb2x1bWU9IiArIG1heFZvbHVtZSArICIsIGN1cnJlbnRWb2x1bWU9IiArIGN1cnJlbnRWb2x1bWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjdXJyZW50Vm9sdW1lID4gbWF4Vm9sdW1lKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjdXJyZW50Vm9sdW1lIHNob3VsZG4ndCBiZSBncmVhdGVyIHRoYW4gbWF4Vm9sdW1lIgotICAgICAgICAgICAgICAgICAgICArICIsIG1heFZvbHVtZT0iICsgbWF4Vm9sdW1lICsgIiwgY3VycmVudFZvbHVtZT0iICsgY3VycmVudFZvbHVtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgIG1Db250cm9sVHlwZSA9IGNvbnRyb2xUeXBlOwotICAgICAgICBtTWF4Vm9sdW1lID0gbWF4Vm9sdW1lOwotICAgICAgICBtQ3VycmVudFZvbHVtZSA9IGN1cnJlbnRWb2x1bWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRDb250cm9sVHlwZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbUNvbnRyb2xUeXBlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0TWF4Vm9sdW1lX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtTWF4Vm9sdW1lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0Q3VycmVudFZvbHVtZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbUN1cnJlbnRWb2x1bWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Q3VycmVudFZvbHVtZV9pbXBsKGludCBjdXJyZW50Vm9sdW1lKSB7Ci0gICAgICAgIGlmIChjdXJyZW50Vm9sdW1lIDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY3VycmVudFZvbHVtZSBzaG91bGRuJ3QgYmUgbmVnYXRpdmUiCi0gICAgICAgICAgICAgICAgICAgICsgIiwgY3VycmVudFZvbHVtZT0iICsgY3VycmVudFZvbHVtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRWb2x1bWUgPSBjdXJyZW50Vm9sdW1lOwotICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblZvbHVtZUNoYW5nZWQobUluc3RhbmNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBjYWxsYmFjayB0byByZWNlaXZlIHZvbHVtZSBjaGFuZ2VzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldENhbGxiYWNrKENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExpc3RlbnMgZm9yIGNoYW5nZXMgdG8gdGhlIHZvbHVtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIENhbGxiYWNrIHsKLSAgICAgICAgcHVibGljIGFic3RyYWN0IHZvaWQgb25Wb2x1bWVDaGFuZ2VkKFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9DbG9zZWRDYXB0aW9uUmVuZGVyZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvQ2xvc2VkQ2FwdGlvblJlbmRlcmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmN2VlYzkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9DbG9zZWRDYXB0aW9uUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1MDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3I7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5QYWludDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5UeXBlZmFjZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0OwotaW1wb3J0IGFuZHJvaWQudGV4dC5TcGFubmFibGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZVN0cmluZ0J1aWxkZXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRQYWludDsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuQ2hhcmFjdGVyU3R5bGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LnN0eWxlLlN0eWxlU3BhbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuVW5kZXJsaW5lU3BhbjsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuVXBkYXRlQXBwZWFyYW5jZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5DYXB0aW9uaW5nTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5DYXB0aW9uaW5nTWFuYWdlci5DYXB0aW9uU3R5bGU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQ2FwdGlvbmluZ01hbmFnZXIuQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vLyBOb3RlOiBUaGlzIGlzIGZvcmtlZCBmcm9tIGFuZHJvaWQubWVkaWEuQ2xvc2VkQ2FwdGlvblJlbmRlcmVyIHNpbmNlIFAKLXB1YmxpYyBjbGFzcyBDbG9zZWRDYXB0aW9uUmVuZGVyZXIgZXh0ZW5kcyBTdWJ0aXRsZUNvbnRyb2xsZXIuUmVuZGVyZXIgewotICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIENlYTYwOENDV2lkZ2V0IG1DQ1dpZGdldDsKLQotICAgIHB1YmxpYyBDbG9zZWRDYXB0aW9uUmVuZGVyZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0cyhNZWRpYUZvcm1hdCBmb3JtYXQpIHsKLSAgICAgICAgaWYgKGZvcm1hdC5jb250YWluc0tleShNZWRpYUZvcm1hdC5LRVlfTUlNRSkpIHsKLSAgICAgICAgICAgIFN0cmluZyBtaW1lVHlwZSA9IGZvcm1hdC5nZXRTdHJpbmcoTWVkaWFGb3JtYXQuS0VZX01JTUUpOwotICAgICAgICAgICAgcmV0dXJuIE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1RFWFRfQ0VBXzYwOC5lcXVhbHMobWltZVR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3VidGl0bGVUcmFjayBjcmVhdGVUcmFjayhNZWRpYUZvcm1hdCBmb3JtYXQpIHsKLSAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gZm9ybWF0LmdldFN0cmluZyhNZWRpYUZvcm1hdC5LRVlfTUlNRSk7Ci0gICAgICAgIGlmIChNZWRpYUZvcm1hdC5NSU1FVFlQRV9URVhUX0NFQV82MDguZXF1YWxzKG1pbWVUeXBlKSkgewotICAgICAgICAgICAgaWYgKG1DQ1dpZGdldCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNDV2lkZ2V0ID0gbmV3IENlYTYwOENDV2lkZ2V0KG1Db250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgQ2VhNjA4Q2FwdGlvblRyYWNrKG1DQ1dpZGdldCwgZm9ybWF0KTsKLSAgICAgICAgfQotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiTm8gbWF0Y2hpbmcgZm9ybWF0OiAiICsgZm9ybWF0LnRvU3RyaW5nKCkpOwotICAgIH0KLX0KLQotY2xhc3MgQ2VhNjA4Q2FwdGlvblRyYWNrIGV4dGVuZHMgU3VidGl0bGVUcmFjayB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDZWE2MDhDQ1BhcnNlciBtQ0NQYXJzZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDZWE2MDhDQ1dpZGdldCBtUmVuZGVyaW5nV2lkZ2V0OwotCi0gICAgQ2VhNjA4Q2FwdGlvblRyYWNrKENlYTYwOENDV2lkZ2V0IHJlbmRlcmluZ1dpZGdldCwgTWVkaWFGb3JtYXQgZm9ybWF0KSB7Ci0gICAgICAgIHN1cGVyKGZvcm1hdCk7Ci0KLSAgICAgICAgbVJlbmRlcmluZ1dpZGdldCA9IHJlbmRlcmluZ1dpZGdldDsKLSAgICAgICAgbUNDUGFyc2VyID0gbmV3IENlYTYwOENDUGFyc2VyKG1SZW5kZXJpbmdXaWRnZXQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGF0YShieXRlW10gZGF0YSwgYm9vbGVhbiBlb3MsIGxvbmcgcnVuSUQpIHsKLSAgICAgICAgbUNDUGFyc2VyLnBhcnNlKGRhdGEpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSZW5kZXJpbmdXaWRnZXQgZ2V0UmVuZGVyaW5nV2lkZ2V0KCkgewotICAgICAgICByZXR1cm4gbVJlbmRlcmluZ1dpZGdldDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVWaWV3KFZlY3RvcjxDdWU+IGFjdGl2ZUN1ZXMpIHsKLSAgICAgICAgLy8gT3ZlcnJpZGluZyB3aXRoIE5PLU9QLCBDQyByZW5kZXJpbmcgYnktcGFzc2VzIHRoaXMKLSAgICB9Ci19Ci0KLS8qKgotICogQWJzdHJhY3Qgd2lkZ2V0IGNsYXNzIHRvIHJlbmRlciBhIGNsb3NlZCBjYXB0aW9uIHRyYWNrLgotICovCi1hYnN0cmFjdCBjbGFzcyBDbG9zZWRDYXB0aW9uV2lkZ2V0IGV4dGVuZHMgVmlld0dyb3VwIGltcGxlbWVudHMgU3VidGl0bGVUcmFjay5SZW5kZXJpbmdXaWRnZXQgewotCi0gICAgaW50ZXJmYWNlIENsb3NlZENhcHRpb25MYXlvdXQgewotICAgICAgICB2b2lkIHNldENhcHRpb25TdHlsZShDYXB0aW9uU3R5bGUgY2FwdGlvblN0eWxlKTsKLSAgICAgICAgdm9pZCBzZXRGb250U2NhbGUoZmxvYXQgc2NhbGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENhcHRpb25TdHlsZSBERUZBVUxUX0NBUFRJT05fU1RZTEUgPSBDYXB0aW9uU3R5bGUuREVGQVVMVDsKLQotICAgIC8qKiBDYXB0aW9uaW5nIG1hbmFnZXIsIHVzZWQgdG8gb2J0YWluIGFuZCB0cmFjayBjYXB0aW9uIHByb3BlcnRpZXMuICovCi0gICAgcHJpdmF0ZSBmaW5hbCBDYXB0aW9uaW5nTWFuYWdlciBtTWFuYWdlcjsKLQotICAgIC8qKiBDdXJyZW50IGNhcHRpb24gc3R5bGUuICovCi0gICAgcHJvdGVjdGVkIENhcHRpb25TdHlsZSBtQ2FwdGlvblN0eWxlOwotCi0gICAgLyoqIENhbGxiYWNrIGZvciByZW5kZXJpbmcgY2hhbmdlcy4gKi8KLSAgICBwcm90ZWN0ZWQgT25DaGFuZ2VkTGlzdGVuZXIgbUxpc3RlbmVyOwotCi0gICAgLyoqIENvbmNyZXRlIGxheW91dCBvZiBDQy4gKi8KLSAgICBwcm90ZWN0ZWQgQ2xvc2VkQ2FwdGlvbkxheW91dCBtQ2xvc2VkQ2FwdGlvbkxheW91dDsKLQotICAgIC8qKiBXaGV0aGVyIGEgY2FwdGlvbiBzdHlsZSBjaGFuZ2UgbGlzdGVuZXIgaXMgcmVnaXN0ZXJlZC4gKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gbUhhc0NoYW5nZUxpc3RlbmVyOwotCi0gICAgcHVibGljIENsb3NlZENhcHRpb25XaWRnZXQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIENsb3NlZENhcHRpb25XaWRnZXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIENsb3NlZENhcHRpb25XaWRnZXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZSkgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZSwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIENsb3NlZENhcHRpb25XaWRnZXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsCi0gICAgICAgICAgICBpbnQgZGVmU3R5bGVSZXMpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgZGVmU3R5bGVSZXMpOwotCi0gICAgICAgIC8vIENhbm5vdCByZW5kZXIgdGV4dCBvdmVyIHZpZGVvIHdoZW4gbGF5ZXIgdHlwZSBpcyBoYXJkd2FyZS4KLSAgICAgICAgc2V0TGF5ZXJUeXBlKFZpZXcuTEFZRVJfVFlQRV9TT0ZUV0FSRSwgbnVsbCk7Ci0KLSAgICAgICAgbU1hbmFnZXIgPSAoQ2FwdGlvbmluZ01hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkNBUFRJT05JTkdfU0VSVklDRSk7Ci0gICAgICAgIG1DYXB0aW9uU3R5bGUgPSBERUZBVUxUX0NBUFRJT05fU1RZTEUuYXBwbHlTdHlsZShtTWFuYWdlci5nZXRVc2VyU3R5bGUoKSk7Ci0KLSAgICAgICAgbUNsb3NlZENhcHRpb25MYXlvdXQgPSBjcmVhdGVDYXB0aW9uTGF5b3V0KGNvbnRleHQpOwotICAgICAgICBtQ2xvc2VkQ2FwdGlvbkxheW91dC5zZXRDYXB0aW9uU3R5bGUobUNhcHRpb25TdHlsZSk7Ci0gICAgICAgIG1DbG9zZWRDYXB0aW9uTGF5b3V0LnNldEZvbnRTY2FsZShtTWFuYWdlci5nZXRGb250U2NhbGUoKSk7Ci0gICAgICAgIGFkZFZpZXcoKFZpZXdHcm91cCkgbUNsb3NlZENhcHRpb25MYXlvdXQsIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQsCi0gICAgICAgICAgICAgICAgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7Ci0KLSAgICAgICAgcmVxdWVzdExheW91dCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBhYnN0cmFjdCBDbG9zZWRDYXB0aW9uTGF5b3V0IGNyZWF0ZUNhcHRpb25MYXlvdXQoQ29udGV4dCBjb250ZXh0KTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE9uQ2hhbmdlZExpc3RlbmVyKE9uQ2hhbmdlZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIGZpbmFsIGludCB3aWR0aFNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMod2lkdGgsIE1lYXN1cmVTcGVjLkVYQUNUTFkpOwotICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0U3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhoZWlnaHQsIE1lYXN1cmVTcGVjLkVYQUNUTFkpOwotCi0gICAgICAgIG1lYXN1cmUod2lkdGhTcGVjLCBoZWlnaHRTcGVjKTsKLSAgICAgICAgbGF5b3V0KDAsIDAsIHdpZHRoLCBoZWlnaHQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFZpc2libGUoYm9vbGVhbiB2aXNpYmxlKSB7Ci0gICAgICAgIGlmICh2aXNpYmxlKSB7Ci0gICAgICAgICAgICBzZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLQotICAgICAgICBtYW5hZ2VDaGFuZ2VMaXN0ZW5lcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpIHsKLSAgICAgICAgc3VwZXIub25BdHRhY2hlZFRvV2luZG93KCk7Ci0KLSAgICAgICAgbWFuYWdlQ2hhbmdlTGlzdGVuZXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKLSAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKLQotICAgICAgICBtYW5hZ2VDaGFuZ2VMaXN0ZW5lcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgIHN1cGVyLm9uTWVhc3VyZSh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0gICAgICAgICgoVmlld0dyb3VwKSBtQ2xvc2VkQ2FwdGlvbkxheW91dCkubWVhc3VyZSh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25MYXlvdXQoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbCwgaW50IHQsIGludCByLCBpbnQgYikgewotICAgICAgICAoKFZpZXdHcm91cCkgbUNsb3NlZENhcHRpb25MYXlvdXQpLmxheW91dChsLCB0LCByLCBiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNYW5hZ2VzIHdoZXRoZXIgdGhpcyByZW5kZXJlciBpcyBsaXN0ZW5pbmcgZm9yIGNhcHRpb24gc3R5bGUgY2hhbmdlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGZpbmFsIENhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lciBtQ2FwdGlvbmluZ0xpc3RlbmVyID0gbmV3IENhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVXNlclN0eWxlQ2hhbmdlZChDYXB0aW9uU3R5bGUgdXNlclN0eWxlKSB7Ci0gICAgICAgICAgICBtQ2FwdGlvblN0eWxlID0gREVGQVVMVF9DQVBUSU9OX1NUWUxFLmFwcGx5U3R5bGUodXNlclN0eWxlKTsKLSAgICAgICAgICAgIG1DbG9zZWRDYXB0aW9uTGF5b3V0LnNldENhcHRpb25TdHlsZShtQ2FwdGlvblN0eWxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkZvbnRTY2FsZUNoYW5nZWQoZmxvYXQgZm9udFNjYWxlKSB7Ci0gICAgICAgICAgICBtQ2xvc2VkQ2FwdGlvbkxheW91dC5zZXRGb250U2NhbGUoZm9udFNjYWxlKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIHZvaWQgbWFuYWdlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gbmVlZHNMaXN0ZW5lciA9IGlzQXR0YWNoZWRUb1dpbmRvdygpICYmIGdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEU7Ci0gICAgICAgIGlmIChtSGFzQ2hhbmdlTGlzdGVuZXIgIT0gbmVlZHNMaXN0ZW5lcikgewotICAgICAgICAgICAgbUhhc0NoYW5nZUxpc3RlbmVyID0gbmVlZHNMaXN0ZW5lcjsKLQotICAgICAgICAgICAgaWYgKG5lZWRzTGlzdGVuZXIpIHsKLSAgICAgICAgICAgICAgICBtTWFuYWdlci5hZGRDYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIobUNhcHRpb25pbmdMaXN0ZW5lcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1NYW5hZ2VyLnJlbW92ZUNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcihtQ2FwdGlvbmluZ0xpc3RlbmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoqCi0gKiBDQ1BhcnNlciBwcm9jZXNzZXMgQ0VBLTYwOCBjbG9zZWQgY2FwdGlvbiBkYXRhLgotICoKLSAqIEl0IGNhbGxzIGJhY2sgaW50byBPbkRpc3BsYXlDaGFuZ2VkTGlzdGVuZXIgdXBvbgotICogZGlzcGxheSBjaGFuZ2Ugd2l0aCBzdHlsZWQgdGV4dCBmb3IgcmVuZGVyaW5nLgotICoKLSAqLwotY2xhc3MgQ2VhNjA4Q0NQYXJzZXIgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1BWF9ST1dTID0gMTU7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0NPTFMgPSAzMjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ2VhNjA4Q0NQYXJzZXIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRCA9IC0xOwotCi0gICAgLy8gRUlBLUNFQS02MDg6IFRhYmxlIDcwIC0gQ29udHJvbCBDb2RlcwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSQ0wgPSAweDIwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCUyAgPSAweDIxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBT0YgPSAweDIyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBT04gPSAweDIzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERVIgPSAweDI0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVTIgPSAweDI1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVTMgPSAweDI2OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVTQgPSAweDI3OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGT04gPSAweDI4OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSREMgPSAweDI5OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUUiAgPSAweDJhOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSVEQgPSAweDJiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFRE0gPSAweDJjOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDUiAgPSAweDJkOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTk0gPSAweDJlOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFT0MgPSAweDJmOwotCi0gICAgLy8gVHJhbnNwYXJlbnQgU3BhY2UKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjaGFyIFRTID0gJ1x1MDBBMCc7Ci0KLSAgICAvLyBDYXB0aW9uaW5nIE1vZGVzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfVU5LTk9XTiA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfUEFJTlRfT04gPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT0RFX1JPTExfVVAgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNT0RFX1BPUF9PTiA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfVEVYVCA9IDQ7Ci0KLSAgICBwcml2YXRlIGZpbmFsIERpc3BsYXlMaXN0ZW5lciBtTGlzdGVuZXI7Ci0KLSAgICBwcml2YXRlIGludCBtTW9kZSA9IE1PREVfUEFJTlRfT047Ci0gICAgcHJpdmF0ZSBpbnQgbVJvbGxVcFNpemUgPSA0OwotICAgIHByaXZhdGUgaW50IG1QcmV2Q3RybENvZGUgPSBJTlZBTElEOwotCi0gICAgcHJpdmF0ZSBDQ01lbW9yeSBtRGlzcGxheSA9IG5ldyBDQ01lbW9yeSgpOwotICAgIHByaXZhdGUgQ0NNZW1vcnkgbU5vbkRpc3BsYXkgPSBuZXcgQ0NNZW1vcnkoKTsKLSAgICBwcml2YXRlIENDTWVtb3J5IG1UZXh0TWVtID0gbmV3IENDTWVtb3J5KCk7Ci0KLSAgICBDZWE2MDhDQ1BhcnNlcihEaXNwbGF5TGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcGFyc2UoYnl0ZVtdIGRhdGEpIHsKLSAgICAgICAgQ0NEYXRhW10gY2NEYXRhID0gQ0NEYXRhLmZyb21CeXRlQXJyYXkoZGF0YSk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjY0RhdGEubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2NEYXRhW2ldLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaGFuZGxlQ3RybENvZGUoY2NEYXRhW2ldKQotICAgICAgICAgICAgICAgICAgICB8fCBoYW5kbGVUYWJPZmZzZXRzKGNjRGF0YVtpXSkKLSAgICAgICAgICAgICAgICAgICAgfHwgaGFuZGxlUEFDQ29kZShjY0RhdGFbaV0pCi0gICAgICAgICAgICAgICAgICAgIHx8IGhhbmRsZU1pZFJvd0NvZGUoY2NEYXRhW2ldKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBoYW5kbGVEaXNwbGF5YWJsZUNoYXJzKGNjRGF0YVtpXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnRlcmZhY2UgRGlzcGxheUxpc3RlbmVyIHsKLSAgICAgICAgdm9pZCBvbkRpc3BsYXlDaGFuZ2VkKFNwYW5uYWJsZVN0cmluZ0J1aWxkZXJbXSBzdHlsZWRUZXh0cyk7Ci0gICAgICAgIENhcHRpb25TdHlsZSBnZXRDYXB0aW9uU3R5bGUoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIENDTWVtb3J5IGdldE1lbW9yeSgpIHsKLSAgICAgICAgLy8gZ2V0IHRoZSBDQyBtZW1vcnkgdG8gb3BlcmF0ZSBvbiBmb3IgY3VycmVudCBtb2RlCi0gICAgICAgIHN3aXRjaCAobU1vZGUpIHsKLSAgICAgICAgY2FzZSBNT0RFX1BPUF9PTjoKLSAgICAgICAgICAgIHJldHVybiBtTm9uRGlzcGxheTsKLSAgICAgICAgY2FzZSBNT0RFX1RFWFQ6Ci0gICAgICAgICAgICAvLyBUT0RPKGNoeik6IHN1cHBvcnQgb25seSBjYXB0aW9uIG1vZGUgZm9yIG5vdywKLSAgICAgICAgICAgIC8vIGluIHRleHQgbW9kZSwgZHVtcCBldmVyeXRoaW5nIHRvIHRleHQgbWVtLgotICAgICAgICAgICAgcmV0dXJuIG1UZXh0TWVtOwotICAgICAgICBjYXNlIE1PREVfUEFJTlRfT046Ci0gICAgICAgIGNhc2UgTU9ERV9ST0xMX1VQOgotICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5OwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTG9nLncoVEFHLCAidW5yZWNvZ2luaXplZCBtb2RlOiAiICsgbU1vZGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtRGlzcGxheTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlRGlzcGxheWFibGVDaGFycyhDQ0RhdGEgY2NEYXRhKSB7Ci0gICAgICAgIGlmICghY2NEYXRhLmlzRGlzcGxheWFibGVDaGFyKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEV4dGVuZGVkIGNoYXIgaW5jbHVkZXMgMSBhdXRvbWF0aWMgYmFja3NwYWNlCi0gICAgICAgIGlmIChjY0RhdGEuaXNFeHRlbmRlZENoYXIoKSkgewotICAgICAgICAgICAgZ2V0TWVtb3J5KCkuYnMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGdldE1lbW9yeSgpLndyaXRlVGV4dChjY0RhdGEuZ2V0RGlzcGxheVRleHQoKSk7Ci0KLSAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfUEFJTlRfT04gfHwgbU1vZGUgPT0gTU9ERV9ST0xMX1VQKSB7Ci0gICAgICAgICAgICB1cGRhdGVEaXNwbGF5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlTWlkUm93Q29kZShDQ0RhdGEgY2NEYXRhKSB7Ci0gICAgICAgIFN0eWxlQ29kZSBtID0gY2NEYXRhLmdldE1pZFJvdygpOwotICAgICAgICBpZiAobSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBnZXRNZW1vcnkoKS53cml0ZU1pZFJvd0NvZGUobSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhbmRsZVBBQ0NvZGUoQ0NEYXRhIGNjRGF0YSkgewotICAgICAgICBQQUMgcGFjID0gY2NEYXRhLmdldFBBQygpOwotCi0gICAgICAgIGlmIChwYWMgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfUk9MTF9VUCkgewotICAgICAgICAgICAgICAgIGdldE1lbW9yeSgpLm1vdmVCYXNlbGluZVRvKHBhYy5nZXRSb3coKSwgbVJvbGxVcFNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2V0TWVtb3J5KCkud3JpdGVQQUMocGFjKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVUYWJPZmZzZXRzKENDRGF0YSBjY0RhdGEpIHsKLSAgICAgICAgaW50IHRhYnMgPSBjY0RhdGEuZ2V0VGFiT2Zmc2V0KCk7Ci0KLSAgICAgICAgaWYgKHRhYnMgPiAwKSB7Ci0gICAgICAgICAgICBnZXRNZW1vcnkoKS50YWIodGFicyk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlQ3RybENvZGUoQ0NEYXRhIGNjRGF0YSkgewotICAgICAgICBpbnQgY3RybENvZGUgPSBjY0RhdGEuZ2V0Q3RybENvZGUoKTsKLQotICAgICAgICBpZiAobVByZXZDdHJsQ29kZSAhPSBJTlZBTElEICYmIG1QcmV2Q3RybENvZGUgPT0gY3RybENvZGUpIHsKLSAgICAgICAgICAgIC8vIGRpc2NhcmQgZG91YmxlIGN0cmwgY29kZXMgKGJ1dCBpZiB0aGVyZSdzIGEgM3JkIG9uZSwgd2Ugc3RpbGwgdGFrZSB0aGF0KQotICAgICAgICAgICAgbVByZXZDdHJsQ29kZSA9IElOVkFMSUQ7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaChjdHJsQ29kZSkgewotICAgICAgICBjYXNlIFJDTDoKLSAgICAgICAgICAgIC8vIHNlbGVjdCBwb3Atb24gc3R5bGUKLSAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9QT1BfT047Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBCUzoKLSAgICAgICAgICAgIGdldE1lbW9yeSgpLmJzKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBERVI6Ci0gICAgICAgICAgICBnZXRNZW1vcnkoKS5kZXIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJVMjoKLSAgICAgICAgY2FzZSBSVTM6Ci0gICAgICAgIGNhc2UgUlU0OgotICAgICAgICAgICAgbVJvbGxVcFNpemUgPSAoY3RybENvZGUgLSAweDIzKTsKLSAgICAgICAgICAgIC8vIGVyYXNlIG1lbW9yeSBpZiBjdXJyZW50bHkgaW4gb3RoZXIgc3R5bGUKLSAgICAgICAgICAgIGlmIChtTW9kZSAhPSBNT0RFX1JPTExfVVApIHsKLSAgICAgICAgICAgICAgICBtRGlzcGxheS5lcmFzZSgpOwotICAgICAgICAgICAgICAgIG1Ob25EaXNwbGF5LmVyYXNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBzZWxlY3Qgcm9sbC11cCBzdHlsZQotICAgICAgICAgICAgbU1vZGUgPSBNT0RFX1JPTExfVVA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGT046Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJGbGFzaCBPbiIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUkRDOgotICAgICAgICAgICAgLy8gc2VsZWN0IHBhaW50LW9uIHN0eWxlCi0gICAgICAgICAgICBtTW9kZSA9IE1PREVfUEFJTlRfT047Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUUjoKLSAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9URVhUOwotICAgICAgICAgICAgbVRleHRNZW0uZXJhc2UoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJURDoKLSAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9URVhUOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRURNOgotICAgICAgICAgICAgLy8gZXJhc2UgZGlzcGxheSBtZW1vcnkKLSAgICAgICAgICAgIG1EaXNwbGF5LmVyYXNlKCk7Ci0gICAgICAgICAgICB1cGRhdGVEaXNwbGF5KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBDUjoKLSAgICAgICAgICAgIGlmIChtTW9kZSA9PSBNT0RFX1JPTExfVVApIHsKLSAgICAgICAgICAgICAgICBnZXRNZW1vcnkoKS5yb2xsVXAobVJvbGxVcFNpemUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBnZXRNZW1vcnkoKS5jcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfUk9MTF9VUCkgewotICAgICAgICAgICAgICAgIHVwZGF0ZURpc3BsYXkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVOTToKLSAgICAgICAgICAgIC8vIGVyYXNlIG5vbi1kaXNwbGF5IG1lbW9yeQotICAgICAgICAgICAgbU5vbkRpc3BsYXkuZXJhc2UoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVPQzoKLSAgICAgICAgICAgIC8vIHN3YXAgZGlzcGxheS9ub24tZGlzcGxheSBtZW1vcnkKLSAgICAgICAgICAgIHN3YXBNZW1vcnkoKTsKLSAgICAgICAgICAgIC8vIHN3aXRjaCB0byBwb3Atb24gc3R5bGUKLSAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9QT1BfT047Ci0gICAgICAgICAgICB1cGRhdGVEaXNwbGF5KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBJTlZBTElEOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgbVByZXZDdHJsQ29kZSA9IElOVkFMSUQ7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBtUHJldkN0cmxDb2RlID0gY3RybENvZGU7Ci0KLSAgICAgICAgLy8gaGFuZGxlZAotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlRGlzcGxheSgpIHsKLSAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBDYXB0aW9uU3R5bGUgY2FwdGlvblN0eWxlID0gbUxpc3RlbmVyLmdldENhcHRpb25TdHlsZSgpOwotICAgICAgICAgICAgbUxpc3RlbmVyLm9uRGlzcGxheUNoYW5nZWQobURpc3BsYXkuZ2V0U3R5bGVkVGV4dChjYXB0aW9uU3R5bGUpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzd2FwTWVtb3J5KCkgewotICAgICAgICBDQ01lbW9yeSB0ZW1wID0gbURpc3BsYXk7Ci0gICAgICAgIG1EaXNwbGF5ID0gbU5vbkRpc3BsYXk7Ci0gICAgICAgIG1Ob25EaXNwbGF5ID0gdGVtcDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTdHlsZUNvZGUgewotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX1dISVRFID0gMDsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9HUkVFTiA9IDE7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfQkxVRSA9IDI7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfQ1lBTiA9IDM7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfUkVEID0gNDsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9ZRUxMT1cgPSA1OwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX01BR0VOVEEgPSA2OwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX0lOVkFMSUQgPSA3OwotCi0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgU1RZTEVfSVRBTElDUyAgID0gMHgwMDAwMDAwMTsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBTVFlMRV9VTkRFUkxJTkUgPSAweDAwMDAwMDAyOwotCi0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBtQ29sb3JNYXAgPSB7Ci0gICAgICAgICAgICAiV0hJVEUiLCAiR1JFRU4iLCAiQkxVRSIsICJDWUFOIiwgIlJFRCIsICJZRUxMT1ciLCAiTUFHRU5UQSIsICJJTlZBTElEIgotICAgICAgICB9OwotCi0gICAgICAgIGZpbmFsIGludCBtU3R5bGU7Ci0gICAgICAgIGZpbmFsIGludCBtQ29sb3I7Ci0KLSAgICAgICAgc3RhdGljIFN0eWxlQ29kZSBmcm9tQnl0ZShieXRlIGRhdGEyKSB7Ci0gICAgICAgICAgICBpbnQgc3R5bGUgPSAwOwotICAgICAgICAgICAgaW50IGNvbG9yID0gKGRhdGEyID4+IDEpICYgMHg3OwotCi0gICAgICAgICAgICBpZiAoKGRhdGEyICYgMHgxKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgc3R5bGUgfD0gU1RZTEVfVU5ERVJMSU5FOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoY29sb3IgPT0gQ09MT1JfSU5WQUxJRCkgewotICAgICAgICAgICAgICAgIC8vIFdISVRFIElUQUxJQ1MKLSAgICAgICAgICAgICAgICBjb2xvciA9IENPTE9SX1dISVRFOwotICAgICAgICAgICAgICAgIHN0eWxlIHw9IFNUWUxFX0lUQUxJQ1M7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgU3R5bGVDb2RlKHN0eWxlLCBjb2xvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHlsZUNvZGUoaW50IHN0eWxlLCBpbnQgY29sb3IpIHsKLSAgICAgICAgICAgIG1TdHlsZSA9IHN0eWxlOwotICAgICAgICAgICAgbUNvbG9yID0gY29sb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzSXRhbGljcygpIHsKLSAgICAgICAgICAgIHJldHVybiAobVN0eWxlICYgU1RZTEVfSVRBTElDUykgIT0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNVbmRlcmxpbmUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1TdHlsZSAmIFNUWUxFX1VOREVSTElORSkgIT0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBnZXRDb2xvcigpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29sb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc3RyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgIHN0ci5hcHBlbmQoInsiKTsKLSAgICAgICAgICAgIHN0ci5hcHBlbmQobUNvbG9yTWFwW21Db2xvcl0pOwotICAgICAgICAgICAgaWYgKChtU3R5bGUgJiBTVFlMRV9JVEFMSUNTKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgc3RyLmFwcGVuZCgiLCBJVEFMSUNTIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKG1TdHlsZSAmIFNUWUxFX1VOREVSTElORSkgIT0gMCkgewotICAgICAgICAgICAgICAgIHN0ci5hcHBlbmQoIiwgVU5ERVJMSU5FIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHIuYXBwZW5kKCJ9Iik7Ci0KLSAgICAgICAgICAgIHJldHVybiBzdHIudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFBBQyBleHRlbmRzIFN0eWxlQ29kZSB7Ci0gICAgICAgIGZpbmFsIGludCBtUm93OwotICAgICAgICBmaW5hbCBpbnQgbUNvbDsKLQotICAgICAgICBzdGF0aWMgUEFDIGZyb21CeXRlcyhieXRlIGRhdGExLCBieXRlIGRhdGEyKSB7Ci0gICAgICAgICAgICBpbnRbXSByb3dUYWJsZSA9IHsxMSwgMSwgMywgMTIsIDE0LCA1LCA3LCA5fTsKLSAgICAgICAgICAgIGludCByb3cgPSByb3dUYWJsZVtkYXRhMSAmIDB4MDddICsgKChkYXRhMiAmIDB4MjApID4+IDUpOwotICAgICAgICAgICAgaW50IHN0eWxlID0gMDsKLSAgICAgICAgICAgIGlmICgoZGF0YTIgJiAxKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgc3R5bGUgfD0gU1RZTEVfVU5ERVJMSU5FOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChkYXRhMiAmIDB4MTApICE9IDApIHsKLSAgICAgICAgICAgICAgICAvLyBpbmRlbnQgY29kZQotICAgICAgICAgICAgICAgIGludCBpbmRlbnQgPSAoZGF0YTIgPj4gMSkgJiAweDc7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQQUMocm93LCBpbmRlbnQgKiA0LCBzdHlsZSwgQ09MT1JfV0hJVEUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBzdHlsZSBjb2RlCi0gICAgICAgICAgICAgICAgaW50IGNvbG9yID0gKGRhdGEyID4+IDEpICYgMHg3OwotCi0gICAgICAgICAgICAgICAgaWYgKGNvbG9yID09IENPTE9SX0lOVkFMSUQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV0hJVEUgSVRBTElDUwotICAgICAgICAgICAgICAgICAgICBjb2xvciA9IENPTE9SX1dISVRFOwotICAgICAgICAgICAgICAgICAgICBzdHlsZSB8PSBTVFlMRV9JVEFMSUNTOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBBQyhyb3csIC0xLCBzdHlsZSwgY29sb3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgUEFDKGludCByb3csIGludCBjb2wsIGludCBzdHlsZSwgaW50IGNvbG9yKSB7Ci0gICAgICAgICAgICBzdXBlcihzdHlsZSwgY29sb3IpOwotICAgICAgICAgICAgbVJvdyA9IHJvdzsKLSAgICAgICAgICAgIG1Db2wgPSBjb2w7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzSW5kZW50UEFDKCkgewotICAgICAgICAgICAgcmV0dXJuIChtQ29sID49IDApOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdldFJvdygpIHsKLSAgICAgICAgICAgIHJldHVybiBtUm93OwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdldENvbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29sOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgieyVkLCAlZH0sICVzIiwKLSAgICAgICAgICAgICAgICAgICAgbVJvdywgbUNvbCwgc3VwZXIudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNdXRhYmxlIHZlcnNpb24gb2YgQmFja2dyb3VuZFNwYW4gdG8gZmFjaWxpdGF0ZSB0ZXh0IHJlbmRlcmluZyB3aXRoIGVkZ2Ugc3R5bGVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTXV0YWJsZUJhY2tncm91bmRDb2xvclNwYW4gZXh0ZW5kcyBDaGFyYWN0ZXJTdHlsZQotICAgICAgICAgICAgaW1wbGVtZW50cyBVcGRhdGVBcHBlYXJhbmNlIHsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUNvbG9yOwotCi0gICAgICAgIHB1YmxpYyBNdXRhYmxlQmFja2dyb3VuZENvbG9yU3BhbihpbnQgY29sb3IpIHsKLSAgICAgICAgICAgIG1Db2xvciA9IGNvbG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0QmFja2dyb3VuZENvbG9yKGludCBjb2xvcikgewotICAgICAgICAgICAgbUNvbG9yID0gY29sb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGdldEJhY2tncm91bmRDb2xvcigpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29sb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlRHJhd1N0YXRlKFRleHRQYWludCBkcykgewotICAgICAgICAgICAgZHMuYmdDb2xvciA9IG1Db2xvcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIENDTGluZUJ1aWxkZXIga2VlcHMgdHJhY2sgb2YgZGlzcGxheWFibGUgY2hhcnMsIGFzIHdlbGwgYXMKLSAgICAgKiBNaWRSb3cgc3R5bGVzIGFuZCBQQUNzLCBmb3IgYSBzaW5nbGUgbGluZSBvZiBDQyBtZW1vcnkuCi0gICAgICoKLSAgICAgKiBJdCBnZW5lcmF0ZXMgc3R5bGVkIHRleHQgdmlhIGdldFN0eWxlZFRleHQoKSBtZXRob2QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ0NMaW5lQnVpbGRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nQnVpbGRlciBtRGlzcGxheUNoYXJzOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0eWxlQ29kZVtdIG1NaWRSb3dTdHlsZXM7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3R5bGVDb2RlW10gbVBBQ1N0eWxlczsKLQotICAgICAgICBDQ0xpbmVCdWlsZGVyKFN0cmluZyBzdHIpIHsKLSAgICAgICAgICAgIG1EaXNwbGF5Q2hhcnMgPSBuZXcgU3RyaW5nQnVpbGRlcihzdHIpOwotICAgICAgICAgICAgbU1pZFJvd1N0eWxlcyA9IG5ldyBTdHlsZUNvZGVbbURpc3BsYXlDaGFycy5sZW5ndGgoKV07Ci0gICAgICAgICAgICBtUEFDU3R5bGVzID0gbmV3IFN0eWxlQ29kZVttRGlzcGxheUNoYXJzLmxlbmd0aCgpXTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2V0Q2hhckF0KGludCBpbmRleCwgY2hhciBjaCkgewotICAgICAgICAgICAgbURpc3BsYXlDaGFycy5zZXRDaGFyQXQoaW5kZXgsIGNoKTsKLSAgICAgICAgICAgIG1NaWRSb3dTdHlsZXNbaW5kZXhdID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2V0TWlkUm93QXQoaW50IGluZGV4LCBTdHlsZUNvZGUgbSkgewotICAgICAgICAgICAgbURpc3BsYXlDaGFycy5zZXRDaGFyQXQoaW5kZXgsICcgJyk7Ci0gICAgICAgICAgICBtTWlkUm93U3R5bGVzW2luZGV4XSA9IG07Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldFBBQ0F0KGludCBpbmRleCwgUEFDIHBhYykgewotICAgICAgICAgICAgbVBBQ1N0eWxlc1tpbmRleF0gPSBwYWM7Ci0gICAgICAgIH0KLQotICAgICAgICBjaGFyIGNoYXJBdChpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGlzcGxheUNoYXJzLmNoYXJBdChpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbGVuZ3RoKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5Q2hhcnMubGVuZ3RoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGFwcGx5U3R5bGVTcGFuKAotICAgICAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgc3R5bGVkVGV4dCwKLSAgICAgICAgICAgICAgICBTdHlsZUNvZGUgcywgaW50IHN0YXJ0LCBpbnQgZW5kKSB7Ci0gICAgICAgICAgICBpZiAocy5pc0l0YWxpY3MoKSkgewotICAgICAgICAgICAgICAgIHN0eWxlZFRleHQuc2V0U3BhbigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHlsZVNwYW4oYW5kcm9pZC5ncmFwaGljcy5UeXBlZmFjZS5JVEFMSUMpLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgU3Bhbm5hYmxlLlNQQU5fRVhDTFVTSVZFX0VYQ0xVU0lWRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocy5pc1VuZGVybGluZSgpKSB7Ci0gICAgICAgICAgICAgICAgc3R5bGVkVGV4dC5zZXRTcGFuKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFVuZGVybGluZVNwYW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQsIFNwYW5uYWJsZS5TUEFOX0VYQ0xVU0lWRV9FWENMVVNJVkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBnZXRTdHlsZWRUZXh0KENhcHRpb25TdHlsZSBjYXB0aW9uU3R5bGUpIHsKLSAgICAgICAgICAgIFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIgc3R5bGVkVGV4dCA9IG5ldyBTcGFubmFibGVTdHJpbmdCdWlsZGVyKG1EaXNwbGF5Q2hhcnMpOwotICAgICAgICAgICAgaW50IHN0YXJ0ID0gLTEsIG5leHQgPSAwOwotICAgICAgICAgICAgaW50IHN0eWxlU3RhcnQgPSAtMTsKLSAgICAgICAgICAgIFN0eWxlQ29kZSBjdXJTdHlsZSA9IG51bGw7Ci0gICAgICAgICAgICB3aGlsZSAobmV4dCA8IG1EaXNwbGF5Q2hhcnMubGVuZ3RoKCkpIHsKLSAgICAgICAgICAgICAgICBTdHlsZUNvZGUgbmV3U3R5bGUgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChtTWlkUm93U3R5bGVzW25leHRdICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgbWlkLXJvdyBzdHlsZSBjaGFuZ2UKLSAgICAgICAgICAgICAgICAgICAgbmV3U3R5bGUgPSBtTWlkUm93U3R5bGVzW25leHRdOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVBBQ1N0eWxlc1tuZXh0XSAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIChzdHlsZVN0YXJ0IDwgMCB8fCBzdGFydCA8IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFwcGx5IFBBQyBzdHlsZSBjaGFuZ2UsIG9ubHkgaWY6Ci0gICAgICAgICAgICAgICAgICAgIC8vIDEuIG5vIHN0eWxlIHNldCwgb3IKLSAgICAgICAgICAgICAgICAgICAgLy8gMi4gc3R5bGUgc2V0LCBidXQgcHJldiBjaGFyIGlzIG5vbmUtZGlzcGxheWFibGUKLSAgICAgICAgICAgICAgICAgICAgbmV3U3R5bGUgPSBtUEFDU3R5bGVzW25leHRdOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobmV3U3R5bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjdXJTdHlsZSA9IG5ld1N0eWxlOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVTdGFydCA+PSAwICYmIHN0YXJ0ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5U3R5bGVTcGFuKHN0eWxlZFRleHQsIG5ld1N0eWxlLCBzdHlsZVN0YXJ0LCBuZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzdHlsZVN0YXJ0ID0gbmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobURpc3BsYXlDaGFycy5jaGFyQXQobmV4dCkgIT0gVFMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBuZXh0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFydCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBleHBhbmRlZFN0YXJ0ID0gbURpc3BsYXlDaGFycy5jaGFyQXQoc3RhcnQpID09ICcgJyA/IHN0YXJ0IDogc3RhcnQgLSAxOwotICAgICAgICAgICAgICAgICAgICBpbnQgZXhwYW5kZWRFbmQgPSBtRGlzcGxheUNoYXJzLmNoYXJBdChuZXh0IC0gMSkgPT0gJyAnID8gbmV4dCA6IG5leHQgKyAxOwotICAgICAgICAgICAgICAgICAgICBzdHlsZWRUZXh0LnNldFNwYW4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE11dGFibGVCYWNrZ3JvdW5kQ29sb3JTcGFuKGNhcHRpb25TdHlsZS5iYWNrZ3JvdW5kQ29sb3IpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGFuZGVkU3RhcnQsIGV4cGFuZGVkRW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNwYW5uYWJsZS5TUEFOX0VYQ0xVU0lWRV9FWENMVVNJVkUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc3R5bGVTdGFydCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhcHBseVN0eWxlU3BhbihzdHlsZWRUZXh0LCBjdXJTdHlsZSwgc3R5bGVTdGFydCwgZXhwYW5kZWRFbmQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG5leHQrKzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHN0eWxlZFRleHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENDTWVtb3J5IG1vZGVscyBhIGNvbnNvbGUtc3R5bGUgZGlzcGxheS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDQ01lbW9yeSB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1CbGFua0xpbmU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQ0NMaW5lQnVpbGRlcltdIG1MaW5lcyA9IG5ldyBDQ0xpbmVCdWlsZGVyW01BWF9ST1dTICsgMl07Ci0gICAgICAgIHByaXZhdGUgaW50IG1Sb3c7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Db2w7Ci0KLSAgICAgICAgQ0NNZW1vcnkoKSB7Ci0gICAgICAgICAgICBjaGFyW10gYmxhbmsgPSBuZXcgY2hhcltNQVhfQ09MUyArIDJdOwotICAgICAgICAgICAgQXJyYXlzLmZpbGwoYmxhbmssIFRTKTsKLSAgICAgICAgICAgIG1CbGFua0xpbmUgPSBuZXcgU3RyaW5nKGJsYW5rKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZXJhc2UoKSB7Ci0gICAgICAgICAgICAvLyBlcmFzZSBhbGwgbGluZXMKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUxpbmVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVzW2ldID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Sb3cgPSBNQVhfUk9XUzsKLSAgICAgICAgICAgIG1Db2wgPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBkZXIoKSB7Ci0gICAgICAgICAgICBpZiAobUxpbmVzW21Sb3ddICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Db2w7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAobUxpbmVzW21Sb3ddLmNoYXJBdChpKSAhPSBUUykgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IG1Db2w7IGogPCBtTGluZXNbbVJvd10ubGVuZ3RoKCk7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MaW5lc1tqXS5zZXRDaGFyQXQoaiwgVFMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1MaW5lc1ttUm93XSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHRhYihpbnQgdGFicykgewotICAgICAgICAgICAgbW92ZUN1cnNvckJ5Q29sKHRhYnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBicygpIHsKLSAgICAgICAgICAgIG1vdmVDdXJzb3JCeUNvbCgtMSk7Ci0gICAgICAgICAgICBpZiAobUxpbmVzW21Sb3ddICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbbVJvd10uc2V0Q2hhckF0KG1Db2wsIFRTKTsKLSAgICAgICAgICAgICAgICBpZiAobUNvbCA9PSBNQVhfQ09MUyAtIDEpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU3BlYyByZWNvbW1lbmRhdGlvbjoKLSAgICAgICAgICAgICAgICAgICAgLy8gaWYgY3Vyc29yIHdhcyBhdCBjb2wgMzIsIG1vdmUgY3Vyc29yCi0gICAgICAgICAgICAgICAgICAgIC8vIGJhY2sgdG8gY29sIDMxIGFuZCBlcmFzZSBib3RoIGNvbCAzMSYzMgotICAgICAgICAgICAgICAgICAgICBtTGluZXNbbVJvd10uc2V0Q2hhckF0KE1BWF9DT0xTLCBUUyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBjcigpIHsKLSAgICAgICAgICAgIG1vdmVDdXJzb3JUbyhtUm93ICsgMSwgMSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHJvbGxVcChpbnQgd2luZG93U2l6ZSkgewotICAgICAgICAgICAgaW50IGk7Ci0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IG1Sb3cgLSB3aW5kb3dTaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbaV0gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHN0YXJ0Um93ID0gbVJvdyAtIHdpbmRvd1NpemUgKyAxOwotICAgICAgICAgICAgaWYgKHN0YXJ0Um93IDwgMSkgewotICAgICAgICAgICAgICAgIHN0YXJ0Um93ID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaSA9IHN0YXJ0Um93OyBpIDwgbVJvdzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVzW2ldID0gbUxpbmVzW2kgKyAxXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaSA9IG1Sb3c7IGkgPCBtTGluZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAvLyBjbGVhciBiYXNlIHJvdwotICAgICAgICAgICAgICAgIG1MaW5lc1tpXSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBkZWZhdWx0IHRvIGNvbCAxLCBpbiBjYXNlIFBBQyBpcyBub3Qgc2VudAotICAgICAgICAgICAgbUNvbCA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlVGV4dChTdHJpbmcgdGV4dCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBnZXRMaW5lQnVmZmVyKG1Sb3cpLnNldENoYXJBdChtQ29sLCB0ZXh0LmNoYXJBdChpKSk7Ci0gICAgICAgICAgICAgICAgbW92ZUN1cnNvckJ5Q29sKDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB3cml0ZU1pZFJvd0NvZGUoU3R5bGVDb2RlIG0pIHsKLSAgICAgICAgICAgIGdldExpbmVCdWZmZXIobVJvdykuc2V0TWlkUm93QXQobUNvbCwgbSk7Ci0gICAgICAgICAgICBtb3ZlQ3Vyc29yQnlDb2woMSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlUEFDKFBBQyBwYWMpIHsKLSAgICAgICAgICAgIGlmIChwYWMuaXNJbmRlbnRQQUMoKSkgewotICAgICAgICAgICAgICAgIG1vdmVDdXJzb3JUbyhwYWMuZ2V0Um93KCksIHBhYy5nZXRDb2woKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1vdmVDdXJzb3JUbyhwYWMuZ2V0Um93KCksIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2V0TGluZUJ1ZmZlcihtUm93KS5zZXRQQUNBdChtQ29sLCBwYWMpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcltdIGdldFN0eWxlZFRleHQoQ2FwdGlvblN0eWxlIGNhcHRpb25TdHlsZSkgewotICAgICAgICAgICAgQXJyYXlMaXN0PFNwYW5uYWJsZVN0cmluZ0J1aWxkZXI+IHJvd3MgPSBuZXcgQXJyYXlMaXN0PD4oTUFYX1JPV1MpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gTUFYX1JPV1M7IGkrKykgewotICAgICAgICAgICAgICAgIHJvd3MuYWRkKG1MaW5lc1tpXSAhPSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgICAgIG1MaW5lc1tpXS5nZXRTdHlsZWRUZXh0KGNhcHRpb25TdHlsZSkgOiBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByb3dzLnRvQXJyYXkobmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXJbTUFYX1JPV1NdKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGludCBjbGFtcChpbnQgeCwgaW50IG1pbiwgaW50IG1heCkgewotICAgICAgICAgICAgcmV0dXJuIHggPCBtaW4gPyBtaW4gOiAoeCA+IG1heCA/IG1heCA6IHgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG1vdmVDdXJzb3JUbyhpbnQgcm93LCBpbnQgY29sKSB7Ci0gICAgICAgICAgICBtUm93ID0gY2xhbXAocm93LCAxLCBNQVhfUk9XUyk7Ci0gICAgICAgICAgICBtQ29sID0gY2xhbXAoY29sLCAxLCBNQVhfQ09MUyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgbW92ZUN1cnNvclRvUm93KGludCByb3cpIHsKLSAgICAgICAgICAgIG1Sb3cgPSBjbGFtcChyb3csIDEsIE1BWF9ST1dTKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBtb3ZlQ3Vyc29yQnlDb2woaW50IGNvbCkgewotICAgICAgICAgICAgbUNvbCA9IGNsYW1wKG1Db2wgKyBjb2wsIDEsIE1BWF9DT0xTKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBtb3ZlQmFzZWxpbmVUbyhpbnQgYmFzZVJvdywgaW50IHdpbmRvd1NpemUpIHsKLSAgICAgICAgICAgIGlmIChtUm93ID09IGJhc2VSb3cpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgYWN0dWFsV2luZG93U2l6ZSA9IHdpbmRvd1NpemU7Ci0gICAgICAgICAgICBpZiAoYmFzZVJvdyA8IGFjdHVhbFdpbmRvd1NpemUpIHsKLSAgICAgICAgICAgICAgICBhY3R1YWxXaW5kb3dTaXplID0gYmFzZVJvdzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtUm93IDwgYWN0dWFsV2luZG93U2l6ZSkgewotICAgICAgICAgICAgICAgIGFjdHVhbFdpbmRvd1NpemUgPSBtUm93OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgIGlmIChiYXNlUm93IDwgbVJvdykgewotICAgICAgICAgICAgICAgIC8vIGNvcHkgZnJvbSBib3R0b20gdG8gdG9wIHJvdwotICAgICAgICAgICAgICAgIGZvciAoaSA9IGFjdHVhbFdpbmRvd1NpemUgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgICAgICBtTGluZXNbYmFzZVJvdyAtIGldID0gbUxpbmVzW21Sb3cgLSBpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGNvcHkgZnJvbSB0b3AgdG8gYm90dG9tIHJvdwotICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBhY3R1YWxXaW5kb3dTaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbUxpbmVzW2Jhc2VSb3cgLSBpXSA9IG1MaW5lc1ttUm93IC0gaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gY2xlYXIgcmVzdCBvZiB0aGUgcm93cwotICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8PSBiYXNlUm93IC0gd2luZG93U2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVzW2ldID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaSA9IGJhc2VSb3cgKyAxOyBpIDwgbUxpbmVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVzW2ldID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgQ0NMaW5lQnVpbGRlciBnZXRMaW5lQnVmZmVyKGludCByb3cpIHsKLSAgICAgICAgICAgIGlmIChtTGluZXNbcm93XSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVzW3Jvd10gPSBuZXcgQ0NMaW5lQnVpbGRlcihtQmxhbmtMaW5lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtTGluZXNbcm93XTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogQ0NEYXRhIHBhcnNlcyB0aGUgcmF3IENDIGJ5dGUgcGFpciBpbnRvIGRpc3BsYXlhYmxlIGNoYXJzLAotICAgICAqIG1pc2MgY29udHJvbCBjb2RlcywgTWlkLVJvdyBvciBQcmVhbWJsZSBBZGRyZXNzIENvZGVzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENDRGF0YSB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgYnl0ZSBtVHlwZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBieXRlIG1EYXRhMTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBieXRlIG1EYXRhMjsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBtQ3RybENvZGVNYXAgPSB7Ci0gICAgICAgICAgICAiUkNMIiwgIkJTIiAsICJBT0YiLCAiQU9OIiwKLSAgICAgICAgICAgICJERVIiLCAiUlUyIiwgIlJVMyIsICJSVTQiLAotICAgICAgICAgICAgIkZPTiIsICJSREMiLCAiVFIiICwgIlJURCIsCi0gICAgICAgICAgICAiRURNIiwgIkNSIiAsICJFTk0iLCAiRU9DIiwKLSAgICAgICAgfTsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBtU3BlY2lhbENoYXJNYXAgPSB7Ci0gICAgICAgICAgICAiXHUwMEFFIiwKLSAgICAgICAgICAgICJcdTAwQjAiLAotICAgICAgICAgICAgIlx1MDBCRCIsCi0gICAgICAgICAgICAiXHUwMEJGIiwKLSAgICAgICAgICAgICJcdTIxMjIiLAotICAgICAgICAgICAgIlx1MDBBMiIsCi0gICAgICAgICAgICAiXHUwMEEzIiwKLSAgICAgICAgICAgICJcdTI2NkEiLCAvLyBFaWdodGggbm90ZQotICAgICAgICAgICAgIlx1MDBFMCIsCi0gICAgICAgICAgICAiXHUwMEEwIiwgLy8gVHJhbnNwYXJlbnQgc3BhY2UKLSAgICAgICAgICAgICJcdTAwRTgiLAotICAgICAgICAgICAgIlx1MDBFMiIsCi0gICAgICAgICAgICAiXHUwMEVBIiwKLSAgICAgICAgICAgICJcdTAwRUUiLAotICAgICAgICAgICAgIlx1MDBGNCIsCi0gICAgICAgICAgICAiXHUwMEZCIiwKLSAgICAgICAgfTsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBtU3BhbmlzaENoYXJNYXAgPSB7Ci0gICAgICAgICAgICAvLyBTcGFuaXNoIGFuZCBtaXNjIGNoYXJzCi0gICAgICAgICAgICAiXHUwMEMxIiwgLy8gQQotICAgICAgICAgICAgIlx1MDBDOSIsIC8vIEUKLSAgICAgICAgICAgICJcdTAwRDMiLCAvLyBJCi0gICAgICAgICAgICAiXHUwMERBIiwgLy8gTwotICAgICAgICAgICAgIlx1MDBEQyIsIC8vIFUKLSAgICAgICAgICAgICJcdTAwRkMiLCAvLyB1Ci0gICAgICAgICAgICAiXHUyMDE4IiwgLy8gb3BlbmluZyBzaW5nbGUgcXVvdGUKLSAgICAgICAgICAgICJcdTAwQTEiLCAvLyBpbnZlcnRlZCBleGNsYW1hdGlvbiBtYXJrCi0gICAgICAgICAgICAiKiIsCi0gICAgICAgICAgICAiJyIsCi0gICAgICAgICAgICAiXHUyMDE0IiwgLy8gZW0gZGFzaAotICAgICAgICAgICAgIlx1MDBBOSIsIC8vIENvcHlyaWdodAotICAgICAgICAgICAgIlx1MjEyMCIsIC8vIFNlcnZpY2VtYXJrCi0gICAgICAgICAgICAiXHUyMDIyIiwgLy8gcm91bmQgYnVsbGV0Ci0gICAgICAgICAgICAiXHUyMDFDIiwgLy8gb3BlbmluZyBkb3VibGUgcXVvdGUKLSAgICAgICAgICAgICJcdTIwMUQiLCAvLyBjbG9zaW5nIGRvdWJsZSBxdW90ZQotICAgICAgICAgICAgLy8gRnJlbmNoCi0gICAgICAgICAgICAiXHUwMEMwIiwKLSAgICAgICAgICAgICJcdTAwQzIiLAotICAgICAgICAgICAgIlx1MDBDNyIsCi0gICAgICAgICAgICAiXHUwMEM4IiwKLSAgICAgICAgICAgICJcdTAwQ0EiLAotICAgICAgICAgICAgIlx1MDBDQiIsCi0gICAgICAgICAgICAiXHUwMEVCIiwKLSAgICAgICAgICAgICJcdTAwQ0UiLAotICAgICAgICAgICAgIlx1MDBDRiIsCi0gICAgICAgICAgICAiXHUwMEVGIiwKLSAgICAgICAgICAgICJcdTAwRDQiLAotICAgICAgICAgICAgIlx1MDBEOSIsCi0gICAgICAgICAgICAiXHUwMEY5IiwKLSAgICAgICAgICAgICJcdTAwREIiLAotICAgICAgICAgICAgIlx1MDBBQiIsCi0gICAgICAgICAgICAiXHUwMEJCIgotICAgICAgICB9OwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG1Qcm90dWd1ZXNlQ2hhck1hcCA9IHsKLSAgICAgICAgICAgIC8vIFBvcnR1Z3Vlc2UKLSAgICAgICAgICAgICJcdTAwQzMiLAotICAgICAgICAgICAgIlx1MDBFMyIsCi0gICAgICAgICAgICAiXHUwMENEIiwKLSAgICAgICAgICAgICJcdTAwQ0MiLAotICAgICAgICAgICAgIlx1MDBFQyIsCi0gICAgICAgICAgICAiXHUwMEQyIiwKLSAgICAgICAgICAgICJcdTAwRjIiLAotICAgICAgICAgICAgIlx1MDBENSIsCi0gICAgICAgICAgICAiXHUwMEY1IiwKLSAgICAgICAgICAgICJ7IiwKLSAgICAgICAgICAgICJ9IiwKLSAgICAgICAgICAgICJcXCIsCi0gICAgICAgICAgICAiXiIsCi0gICAgICAgICAgICAiXyIsCi0gICAgICAgICAgICAifCIsCi0gICAgICAgICAgICAifiIsCi0gICAgICAgICAgICAvLyBHZXJtYW4gYW5kIG1pc2MgY2hhcnMKLSAgICAgICAgICAgICJcdTAwQzQiLAotICAgICAgICAgICAgIlx1MDBFNCIsCi0gICAgICAgICAgICAiXHUwMEQ2IiwKLSAgICAgICAgICAgICJcdTAwRjYiLAotICAgICAgICAgICAgIlx1MDBERiIsCi0gICAgICAgICAgICAiXHUwMEE1IiwKLSAgICAgICAgICAgICJcdTAwQTQiLAotICAgICAgICAgICAgIlx1MjUwMiIsIC8vIHZlcnRpY2FsIGJhcgotICAgICAgICAgICAgIlx1MDBDNSIsCi0gICAgICAgICAgICAiXHUwMEU1IiwKLSAgICAgICAgICAgICJcdTAwRDgiLAotICAgICAgICAgICAgIlx1MDBGOCIsCi0gICAgICAgICAgICAiXHUyNTBDIiwgLy8gdG9wLWxlZnQgY29ybmVyCi0gICAgICAgICAgICAiXHUyNTEwIiwgLy8gdG9wLXJpZ2h0IGNvcm5lcgotICAgICAgICAgICAgIlx1MjUxNCIsIC8vIGxvd2VyLWxlZnQgY29ybmVyCi0gICAgICAgICAgICAiXHUyNTE4IiwgLy8gbG93ZXItcmlnaHQgY29ybmVyCi0gICAgICAgIH07Ci0KLSAgICAgICAgc3RhdGljIENDRGF0YVtdIGZyb21CeXRlQXJyYXkoYnl0ZVtdIGRhdGEpIHsKLSAgICAgICAgICAgIENDRGF0YVtdIGNjRGF0YSA9IG5ldyBDQ0RhdGFbZGF0YS5sZW5ndGggLyAzXTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjY0RhdGEubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBjY0RhdGFbaV0gPSBuZXcgQ0NEYXRhKAotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtpICogM10sCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2kgKiAzICsgMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2kgKiAzICsgMl0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gY2NEYXRhOwotICAgICAgICB9Ci0KLSAgICAgICAgQ0NEYXRhKGJ5dGUgdHlwZSwgYnl0ZSBkYXRhMSwgYnl0ZSBkYXRhMikgewotICAgICAgICAgICAgbVR5cGUgPSB0eXBlOwotICAgICAgICAgICAgbURhdGExID0gZGF0YTE7Ci0gICAgICAgICAgICBtRGF0YTIgPSBkYXRhMjsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBnZXRDdHJsQ29kZSgpIHsKLSAgICAgICAgICAgIGlmICgobURhdGExID09IDB4MTQgfHwgbURhdGExID09IDB4MWMpCi0gICAgICAgICAgICAgICAgICAgICYmIG1EYXRhMiA+PSAweDIwICYmIG1EYXRhMiA8PSAweDJmKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1EYXRhMjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEOwotICAgICAgICB9Ci0KLSAgICAgICAgU3R5bGVDb2RlIGdldE1pZFJvdygpIHsKLSAgICAgICAgICAgIC8vIG9ubHkgc3VwcG9ydCBzdGFuZGFyZCBNaWQtcm93IGNvZGVzLCBpZ25vcmUKLSAgICAgICAgICAgIC8vIG9wdGlvbmFsIGJhY2tncm91bmQvZm9yZWdyb3VuZCBtaWQtcm93IGNvZGVzCi0gICAgICAgICAgICBpZiAoKG1EYXRhMSA9PSAweDExIHx8IG1EYXRhMSA9PSAweDE5KQotICAgICAgICAgICAgICAgICAgICAmJiBtRGF0YTIgPj0gMHgyMCAmJiBtRGF0YTIgPD0gMHgyZikgewotICAgICAgICAgICAgICAgIHJldHVybiBTdHlsZUNvZGUuZnJvbUJ5dGUobURhdGEyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgUEFDIGdldFBBQygpIHsKLSAgICAgICAgICAgIGlmICgobURhdGExICYgMHg3MCkgPT0gMHgxMAotICAgICAgICAgICAgICAgICAgICAmJiAobURhdGEyICYgMHg0MCkgPT0gMHg0MAotICAgICAgICAgICAgICAgICAgICAmJiAoKG1EYXRhMSAmIDB4MDcpICE9IDAgfHwgKG1EYXRhMiAmIDB4MjApID09IDApKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBBQy5mcm9tQnl0ZXMobURhdGExLCBtRGF0YTIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZ2V0VGFiT2Zmc2V0KCkgewotICAgICAgICAgICAgaWYgKChtRGF0YTEgPT0gMHgxNyB8fCBtRGF0YTEgPT0gMHgxZikKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MjEgJiYgbURhdGEyIDw9IDB4MjMpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbURhdGEyICYgMHgzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzRGlzcGxheWFibGVDaGFyKCkgewotICAgICAgICAgICAgcmV0dXJuIGlzQmFzaWNDaGFyKCkgfHwgaXNTcGVjaWFsQ2hhcigpIHx8IGlzRXh0ZW5kZWRDaGFyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZ2V0RGlzcGxheVRleHQoKSB7Ci0gICAgICAgICAgICBTdHJpbmcgc3RyID0gZ2V0QmFzaWNDaGFycygpOwotCi0gICAgICAgICAgICBpZiAoc3RyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdHIgPSAgZ2V0U3BlY2lhbENoYXIoKTsKLQotICAgICAgICAgICAgICAgIGlmIChzdHIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzdHIgPSBnZXRFeHRlbmRlZENoYXIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBzdHI7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBjdHJsQ29kZVRvU3RyaW5nKGludCBjdHJsQ29kZSkgewotICAgICAgICAgICAgcmV0dXJuIG1DdHJsQ29kZU1hcFtjdHJsQ29kZSAtIDB4MjBdOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzQmFzaWNDaGFyKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EYXRhMSA+PSAweDIwICYmIG1EYXRhMSA8PSAweDdmOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzU3BlY2lhbENoYXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChtRGF0YTEgPT0gMHgxMSB8fCBtRGF0YTEgPT0gMHgxOSkKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MzAgJiYgbURhdGEyIDw9IDB4M2YpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzRXh0ZW5kZWRDaGFyKCkgewotICAgICAgICAgICAgcmV0dXJuICgobURhdGExID09IDB4MTIgfHwgbURhdGExID09IDB4MUEKLSAgICAgICAgICAgICAgICAgICAgfHwgbURhdGExID09IDB4MTMgfHwgbURhdGExID09IDB4MUIpCi0gICAgICAgICAgICAgICAgICAgICYmIG1EYXRhMiA+PSAweDIwICYmIG1EYXRhMiA8PSAweDNmKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgY2hhciBnZXRCYXNpY0NoYXIoYnl0ZSBkYXRhKSB7Ci0gICAgICAgICAgICBjaGFyIGM7Ci0gICAgICAgICAgICAvLyByZXBsYWNlIHRoZSBub24tQVNDSUkgb25lcwotICAgICAgICAgICAgc3dpdGNoIChkYXRhKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDJBOiBjID0gJ1x1MDBFMSc7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMHg1QzogYyA9ICdcdTAwRTknOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDB4NUU6IGMgPSAnXHUwMEVEJzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDVGOiBjID0gJ1x1MDBGMyc7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMHg2MDogYyA9ICdcdTAwRkEnOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDB4N0I6IGMgPSAnXHUwMEU3JzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDdDOiBjID0gJ1x1MDBGNyc7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMHg3RDogYyA9ICdcdTAwRDEnOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDB4N0U6IGMgPSAnXHUwMEYxJzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDdGOiBjID0gJ1x1MjU4OCc7IGJyZWFrOyAvLyBGdWxsIGJsb2NrCi0gICAgICAgICAgICAgICAgZGVmYXVsdDogYyA9IChjaGFyKSBkYXRhOyBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0QmFzaWNDaGFycygpIHsKLSAgICAgICAgICAgIGlmIChtRGF0YTEgPj0gMHgyMCAmJiBtRGF0YTEgPD0gMHg3ZikgewotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKDIpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGdldEJhc2ljQ2hhcihtRGF0YTEpKTsKLSAgICAgICAgICAgICAgICBpZiAobURhdGEyID49IDB4MjAgJiYgbURhdGEyIDw9IDB4N2YpIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZ2V0QmFzaWNDaGFyKG1EYXRhMikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGdldFNwZWNpYWxDaGFyKCkgewotICAgICAgICAgICAgaWYgKChtRGF0YTEgPT0gMHgxMSB8fCBtRGF0YTEgPT0gMHgxOSkKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MzAgJiYgbURhdGEyIDw9IDB4M2YpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVNwZWNpYWxDaGFyTWFwW21EYXRhMiAtIDB4MzBdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGdldEV4dGVuZGVkQ2hhcigpIHsKLSAgICAgICAgICAgIGlmICgobURhdGExID09IDB4MTIgfHwgbURhdGExID09IDB4MUEpCi0gICAgICAgICAgICAgICAgICAgICYmIG1EYXRhMiA+PSAweDIwICYmIG1EYXRhMiA8PSAweDNmKXsKLSAgICAgICAgICAgICAgICAvLyAxIFNwYW5pc2gvRnJlbmNoIGNoYXIKLSAgICAgICAgICAgICAgICByZXR1cm4gbVNwYW5pc2hDaGFyTWFwW21EYXRhMiAtIDB4MjBdOwotICAgICAgICAgICAgfSBlbHNlIGlmICgobURhdGExID09IDB4MTMgfHwgbURhdGExID09IDB4MUIpCi0gICAgICAgICAgICAgICAgICAgICYmIG1EYXRhMiA+PSAweDIwICYmIG1EYXRhMiA8PSAweDNmKXsKLSAgICAgICAgICAgICAgICAvLyAxIFBvcnR1Z3Vlc2UvR2VybWFuL0RhbmlzaCBjaGFyCi0gICAgICAgICAgICAgICAgcmV0dXJuIG1Qcm90dWd1ZXNlQ2hhck1hcFttRGF0YTIgLSAweDIwXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIFN0cmluZyBzdHI7Ci0KLSAgICAgICAgICAgIGlmIChtRGF0YTEgPCAweDEwICYmIG1EYXRhMiA8IDB4MTApIHsKLSAgICAgICAgICAgICAgICAvLyBOdWxsIFBhZCwgaWdub3JlCi0gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlslZF1OdWxsOiAlMDJ4ICUwMngiLCBtVHlwZSwgbURhdGExLCBtRGF0YTIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgY3RybENvZGUgPSBnZXRDdHJsQ29kZSgpOwotICAgICAgICAgICAgaWYgKGN0cmxDb2RlICE9IElOVkFMSUQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiWyVkXSVzIiwgbVR5cGUsIGN0cmxDb2RlVG9TdHJpbmcoY3RybENvZGUpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IHRhYk9mZnNldCA9IGdldFRhYk9mZnNldCgpOwotICAgICAgICAgICAgaWYgKHRhYk9mZnNldCA+IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiWyVkXVRhYiVkIiwgbVR5cGUsIHRhYk9mZnNldCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFBBQyBwYWMgPSBnZXRQQUMoKTsKLSAgICAgICAgICAgIGlmIChwYWMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJWRdUEFDOiAlcyIsIG1UeXBlLCBwYWMudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFN0eWxlQ29kZSBtID0gZ2V0TWlkUm93KCk7Ci0gICAgICAgICAgICBpZiAobSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlslZF1NaWQtcm93OiAlcyIsIG1UeXBlLCBtLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoaXNEaXNwbGF5YWJsZUNoYXIoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJWRdRGlzcGxheWFibGU6ICVzICglMDJ4ICUwMngpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UeXBlLCBnZXREaXNwbGF5VGV4dCgpLCBtRGF0YTEsIG1EYXRhMik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJWRdSW52YWxpZDogJTAyeCAlMDJ4IiwgbVR5cGUsIG1EYXRhMSwgbURhdGEyKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLyoqCi0gKiBXaWRnZXQgY2FwYWJsZSBvZiByZW5kZXJpbmcgQ0VBLTYwOCBjbG9zZWQgY2FwdGlvbnMuCi0gKi8KLWNsYXNzIENlYTYwOENDV2lkZ2V0IGV4dGVuZHMgQ2xvc2VkQ2FwdGlvbldpZGdldCBpbXBsZW1lbnRzIENlYTYwOENDUGFyc2VyLkRpc3BsYXlMaXN0ZW5lciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUmVjdCBtVGV4dEJvdW5kcyA9IG5ldyBSZWN0KCk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG1EdW1teVRleHQgPSAiMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNCI7Ci0KLSAgICBwdWJsaWMgQ2VhNjA4Q0NXaWRnZXQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIENlYTYwOENDV2lkZ2V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBDZWE2MDhDQ1dpZGdldChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2VhNjA4Q0NXaWRnZXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsCi0gICAgICAgICAgICBpbnQgZGVmU3R5bGVSZXMpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgZGVmU3R5bGVSZXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDbG9zZWRDYXB0aW9uTGF5b3V0IGNyZWF0ZUNhcHRpb25MYXlvdXQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ0NMYXlvdXQoY29udGV4dCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EaXNwbGF5Q2hhbmdlZChTcGFubmFibGVTdHJpbmdCdWlsZGVyW10gc3R5bGVkVGV4dHMpIHsKLSAgICAgICAgKChDQ0xheW91dCkgbUNsb3NlZENhcHRpb25MYXlvdXQpLnVwZGF0ZShzdHlsZWRUZXh0cyk7Ci0KLSAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTGlzdGVuZXIub25DaGFuZ2VkKHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENhcHRpb25TdHlsZSBnZXRDYXB0aW9uU3R5bGUoKSB7Ci0gICAgICAgIHJldHVybiBtQ2FwdGlvblN0eWxlOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENDTGluZUJveCBleHRlbmRzIFRleHRWaWV3IHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgRk9OVF9QQURESU5HX1JBVElPID0gMC43NWY7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEVER0VfT1VUTElORV9SQVRJTyA9IDAuMWY7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEVER0VfU0hBRE9XX1JBVElPID0gMC4wNWY7Ci0gICAgICAgIHByaXZhdGUgZmxvYXQgbU91dGxpbmVXaWR0aDsKLSAgICAgICAgcHJpdmF0ZSBmbG9hdCBtU2hhZG93UmFkaXVzOwotICAgICAgICBwcml2YXRlIGZsb2F0IG1TaGFkb3dPZmZzZXQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgbVRleHRDb2xvciA9IENvbG9yLldISVRFOwotICAgICAgICBwcml2YXRlIGludCBtQmdDb2xvciA9IENvbG9yLkJMQUNLOwotICAgICAgICBwcml2YXRlIGludCBtRWRnZVR5cGUgPSBDYXB0aW9uU3R5bGUuRURHRV9UWVBFX05PTkU7Ci0gICAgICAgIHByaXZhdGUgaW50IG1FZGdlQ29sb3IgPSBDb2xvci5UUkFOU1BBUkVOVDsKLQotICAgICAgICBDQ0xpbmVCb3goQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgICAgIHNldEdyYXZpdHkoR3Jhdml0eS5DRU5URVIpOwotICAgICAgICAgICAgc2V0QmFja2dyb3VuZENvbG9yKENvbG9yLlRSQU5TUEFSRU5UKTsKLSAgICAgICAgICAgIHNldFRleHRDb2xvcihDb2xvci5XSElURSk7Ci0gICAgICAgICAgICBzZXRUeXBlZmFjZShUeXBlZmFjZS5NT05PU1BBQ0UpOwotICAgICAgICAgICAgc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7Ci0KLSAgICAgICAgICAgIGZpbmFsIFJlc291cmNlcyByZXMgPSBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCk7Ci0KLSAgICAgICAgICAgIC8vIGdldCB0aGUgZGVmYXVsdCAod2lsbCBiZSB1cGRhdGVkIGxhdGVyIGR1cmluZyBtZWFzdXJlKQotICAgICAgICAgICAgbU91dGxpbmVXaWR0aCA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uc3VidGl0bGVfb3V0bGluZV93aWR0aCk7Ci0gICAgICAgICAgICBtU2hhZG93UmFkaXVzID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zdWJ0aXRsZV9zaGFkb3dfcmFkaXVzKTsKLSAgICAgICAgICAgIG1TaGFkb3dPZmZzZXQgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN1YnRpdGxlX3NoYWRvd19vZmZzZXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRDYXB0aW9uU3R5bGUoQ2FwdGlvblN0eWxlIGNhcHRpb25TdHlsZSkgewotICAgICAgICAgICAgbVRleHRDb2xvciA9IGNhcHRpb25TdHlsZS5mb3JlZ3JvdW5kQ29sb3I7Ci0gICAgICAgICAgICBtQmdDb2xvciA9IGNhcHRpb25TdHlsZS5iYWNrZ3JvdW5kQ29sb3I7Ci0gICAgICAgICAgICBtRWRnZVR5cGUgPSBjYXB0aW9uU3R5bGUuZWRnZVR5cGU7Ci0gICAgICAgICAgICBtRWRnZUNvbG9yID0gY2FwdGlvblN0eWxlLmVkZ2VDb2xvcjsKLQotICAgICAgICAgICAgc2V0VGV4dENvbG9yKG1UZXh0Q29sb3IpOwotICAgICAgICAgICAgaWYgKG1FZGdlVHlwZSA9PSBDYXB0aW9uU3R5bGUuRURHRV9UWVBFX0RST1BfU0hBRE9XKSB7Ci0gICAgICAgICAgICAgICAgc2V0U2hhZG93TGF5ZXIobVNoYWRvd1JhZGl1cywgbVNoYWRvd09mZnNldCwgbVNoYWRvd09mZnNldCwgbUVkZ2VDb2xvcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNldFNoYWRvd0xheWVyKDAsIDAsIDAsIDApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgICAgICBmbG9hdCBmb250U2l6ZSA9IE1lYXN1cmVTcGVjLmdldFNpemUoaGVpZ2h0TWVhc3VyZVNwZWMpICogRk9OVF9QQURESU5HX1JBVElPOwotICAgICAgICAgICAgc2V0VGV4dFNpemUoVHlwZWRWYWx1ZS5DT01QTEVYX1VOSVRfUFgsIGZvbnRTaXplKTsKLQotICAgICAgICAgICAgbU91dGxpbmVXaWR0aCA9IEVER0VfT1VUTElORV9SQVRJTyAqIGZvbnRTaXplICsgMS4wZjsKLSAgICAgICAgICAgIG1TaGFkb3dSYWRpdXMgPSBFREdFX1NIQURPV19SQVRJTyAqIGZvbnRTaXplICsgMS4wZjs7Ci0gICAgICAgICAgICBtU2hhZG93T2Zmc2V0ID0gbVNoYWRvd1JhZGl1czsKLQotICAgICAgICAgICAgLy8gc2V0IGZvbnQgc2NhbGUgaW4gdGhlIFggZGlyZWN0aW9uIHRvIG1hdGNoIHRoZSByZXF1aXJlZCB3aWR0aAotICAgICAgICAgICAgc2V0U2NhbGVYKDEuMGYpOwotICAgICAgICAgICAgZ2V0UGFpbnQoKS5nZXRUZXh0Qm91bmRzKG1EdW1teVRleHQsIDAsIG1EdW1teVRleHQubGVuZ3RoKCksIG1UZXh0Qm91bmRzKTsKLSAgICAgICAgICAgIGZsb2F0IGFjdHVhbFRleHRXaWR0aCA9IG1UZXh0Qm91bmRzLndpZHRoKCk7Ci0gICAgICAgICAgICBmbG9hdCByZXF1aXJlZFRleHRXaWR0aCA9IE1lYXN1cmVTcGVjLmdldFNpemUod2lkdGhNZWFzdXJlU3BlYyk7Ci0gICAgICAgICAgICBzZXRTY2FsZVgocmVxdWlyZWRUZXh0V2lkdGggLyBhY3R1YWxUZXh0V2lkdGgpOwotCi0gICAgICAgICAgICBzdXBlci5vbk1lYXN1cmUod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uRHJhdyhDYW52YXMgYykgewotICAgICAgICAgICAgaWYgKG1FZGdlVHlwZSA9PSBDYXB0aW9uU3R5bGUuRURHRV9UWVBFX1VOU1BFQ0lGSUVECi0gICAgICAgICAgICAgICAgICAgIHx8IG1FZGdlVHlwZSA9PSBDYXB0aW9uU3R5bGUuRURHRV9UWVBFX05PTkUKLSAgICAgICAgICAgICAgICAgICAgfHwgbUVkZ2VUeXBlID09IENhcHRpb25TdHlsZS5FREdFX1RZUEVfRFJPUF9TSEFET1cpIHsKLSAgICAgICAgICAgICAgICAvLyB0aGVzZSBlZGdlIHN0eWxlcyBkb24ndCByZXF1aXJlIGEgc2Vjb25kIHBhc3MKLSAgICAgICAgICAgICAgICBzdXBlci5vbkRyYXcoYyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUVkZ2VUeXBlID09IENhcHRpb25TdHlsZS5FREdFX1RZUEVfT1VUTElORSkgewotICAgICAgICAgICAgICAgIGRyYXdFZGdlT3V0bGluZShjKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gUmFpc2VkIG9yIGRlcHJlc3NlZAotICAgICAgICAgICAgICAgIGRyYXdFZGdlUmFpc2VkT3JEZXByZXNzZWQoYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZHJhd0VkZ2VPdXRsaW5lKENhbnZhcyBjKSB7Ci0gICAgICAgICAgICBUZXh0UGFpbnQgdGV4dFBhaW50ID0gZ2V0UGFpbnQoKTsKLQotICAgICAgICAgICAgUGFpbnQuU3R5bGUgcHJldmlvdXNTdHlsZSA9IHRleHRQYWludC5nZXRTdHlsZSgpOwotICAgICAgICAgICAgUGFpbnQuSm9pbiBwcmV2aW91c0pvaW4gPSB0ZXh0UGFpbnQuZ2V0U3Ryb2tlSm9pbigpOwotICAgICAgICAgICAgZmxvYXQgcHJldmlvdXNXaWR0aCA9IHRleHRQYWludC5nZXRTdHJva2VXaWR0aCgpOwotCi0gICAgICAgICAgICBzZXRUZXh0Q29sb3IobUVkZ2VDb2xvcik7Ci0gICAgICAgICAgICB0ZXh0UGFpbnQuc2V0U3R5bGUoUGFpbnQuU3R5bGUuRklMTF9BTkRfU1RST0tFKTsKLSAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHJva2VKb2luKFBhaW50LkpvaW4uUk9VTkQpOwotICAgICAgICAgICAgdGV4dFBhaW50LnNldFN0cm9rZVdpZHRoKG1PdXRsaW5lV2lkdGgpOwotCi0gICAgICAgICAgICAvLyBEcmF3IG91dGxpbmUgYW5kIGJhY2tncm91bmQgb25seS4KLSAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjKTsKLQotICAgICAgICAgICAgLy8gUmVzdG9yZSBvcmlnaW5hbCBzZXR0aW5ncy4KLSAgICAgICAgICAgIHNldFRleHRDb2xvcihtVGV4dENvbG9yKTsKLSAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHlsZShwcmV2aW91c1N0eWxlKTsKLSAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHJva2VKb2luKHByZXZpb3VzSm9pbik7Ci0gICAgICAgICAgICB0ZXh0UGFpbnQuc2V0U3Ryb2tlV2lkdGgocHJldmlvdXNXaWR0aCk7Ci0KLSAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgYmFja2dyb3VuZC4KLSAgICAgICAgICAgIHNldEJhY2tncm91bmRTcGFucyhDb2xvci5UUkFOU1BBUkVOVCk7Ci0gICAgICAgICAgICAvLyBEcmF3IGZvcmVncm91bmQgb25seS4KLSAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjKTsKLSAgICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIGJhY2tncm91bmQuCi0gICAgICAgICAgICBzZXRCYWNrZ3JvdW5kU3BhbnMobUJnQ29sb3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGRyYXdFZGdlUmFpc2VkT3JEZXByZXNzZWQoQ2FudmFzIGMpIHsKLSAgICAgICAgICAgIFRleHRQYWludCB0ZXh0UGFpbnQgPSBnZXRQYWludCgpOwotCi0gICAgICAgICAgICBQYWludC5TdHlsZSBwcmV2aW91c1N0eWxlID0gdGV4dFBhaW50LmdldFN0eWxlKCk7Ci0gICAgICAgICAgICB0ZXh0UGFpbnQuc2V0U3R5bGUoUGFpbnQuU3R5bGUuRklMTCk7Ci0KLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gcmFpc2VkID0gbUVkZ2VUeXBlID09IENhcHRpb25TdHlsZS5FREdFX1RZUEVfUkFJU0VEOwotICAgICAgICAgICAgZmluYWwgaW50IGNvbG9yVXAgPSByYWlzZWQgPyBDb2xvci5XSElURSA6IG1FZGdlQ29sb3I7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY29sb3JEb3duID0gcmFpc2VkID8gbUVkZ2VDb2xvciA6IENvbG9yLldISVRFOwotICAgICAgICAgICAgZmluYWwgZmxvYXQgb2Zmc2V0ID0gbVNoYWRvd1JhZGl1cyAvIDJmOwotCi0gICAgICAgICAgICAvLyBEcmF3IGJhY2tncm91bmQgYW5kIHRleHQgd2l0aCBzaGFkb3cgdXAKLSAgICAgICAgICAgIHNldFNoYWRvd0xheWVyKG1TaGFkb3dSYWRpdXMsIC1vZmZzZXQsIC1vZmZzZXQsIGNvbG9yVXApOwotICAgICAgICAgICAgc3VwZXIub25EcmF3KGMpOwotCi0gICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGJhY2tncm91bmQuCi0gICAgICAgICAgICBzZXRCYWNrZ3JvdW5kU3BhbnMoQ29sb3IuVFJBTlNQQVJFTlQpOwotCi0gICAgICAgICAgICAvLyBEcmF3IHRleHQgd2l0aCBzaGFkb3cgZG93bgotICAgICAgICAgICAgc2V0U2hhZG93TGF5ZXIobVNoYWRvd1JhZGl1cywgK29mZnNldCwgK29mZnNldCwgY29sb3JEb3duKTsKLSAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjKTsKLQotICAgICAgICAgICAgLy8gUmVzdG9yZSBzZXR0aW5ncwotICAgICAgICAgICAgdGV4dFBhaW50LnNldFN0eWxlKHByZXZpb3VzU3R5bGUpOwotCi0gICAgICAgICAgICAvLyBSZXN0b3JlIHRoZSBiYWNrZ3JvdW5kLgotICAgICAgICAgICAgc2V0QmFja2dyb3VuZFNwYW5zKG1CZ0NvbG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRCYWNrZ3JvdW5kU3BhbnMoaW50IGNvbG9yKSB7Ci0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGV4dCA9IGdldFRleHQoKTsKLSAgICAgICAgICAgIGlmICh0ZXh0IGluc3RhbmNlb2YgU3Bhbm5hYmxlKSB7Ci0gICAgICAgICAgICAgICAgU3Bhbm5hYmxlIHNwYW5uYWJsZSA9IChTcGFubmFibGUpIHRleHQ7Ci0gICAgICAgICAgICAgICAgQ2VhNjA4Q0NQYXJzZXIuTXV0YWJsZUJhY2tncm91bmRDb2xvclNwYW5bXSBiZ1NwYW5zID0gc3Bhbm5hYmxlLmdldFNwYW5zKAotICAgICAgICAgICAgICAgICAgICAgICAgMCwgc3Bhbm5hYmxlLmxlbmd0aCgpLCBDZWE2MDhDQ1BhcnNlci5NdXRhYmxlQmFja2dyb3VuZENvbG9yU3Bhbi5jbGFzcyk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBiZ1NwYW5zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJnU3BhbnNbaV0uc2V0QmFja2dyb3VuZENvbG9yKGNvbG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDQ0xheW91dCBleHRlbmRzIExpbmVhckxheW91dCBpbXBsZW1lbnRzIENsb3NlZENhcHRpb25MYXlvdXQgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1JPV1MgPSBDZWE2MDhDQ1BhcnNlci5NQVhfUk9XUzsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgU0FGRV9BUkVBX1JBVElPID0gMC45ZjsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIENDTGluZUJveFtdIG1MaW5lQm94ZXMgPSBuZXcgQ0NMaW5lQm94W01BWF9ST1dTXTsKLQotICAgICAgICBDQ0xheW91dChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICAgICAgc2V0R3Jhdml0eShHcmF2aXR5LlNUQVJUKTsKLSAgICAgICAgICAgIHNldE9yaWVudGF0aW9uKExpbmVhckxheW91dC5WRVJUSUNBTCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9ST1dTOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZUJveGVzW2ldID0gbmV3IENDTGluZUJveChnZXRDb250ZXh0KCkpOwotICAgICAgICAgICAgICAgIGFkZFZpZXcobUxpbmVCb3hlc1tpXSwgTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwgTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q2FwdGlvblN0eWxlKENhcHRpb25TdHlsZSBjYXB0aW9uU3R5bGUpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1JPV1M7IGkrKykgewotICAgICAgICAgICAgICAgIG1MaW5lQm94ZXNbaV0uc2V0Q2FwdGlvblN0eWxlKGNhcHRpb25TdHlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0Rm9udFNjYWxlKGZsb2F0IGZvbnRTY2FsZSkgewotICAgICAgICAgICAgLy8gSWdub3JlcyB0aGUgZm9udCBzY2FsZSBjaGFuZ2VzIG9mIHRoZSBzeXN0ZW0gd2lkZSBDQyBwcmVmZXJlbmNlLgotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCB1cGRhdGUoU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcltdIHRleHRCdWZmZXIpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1JPV1M7IGkrKykgewotICAgICAgICAgICAgICAgIGlmICh0ZXh0QnVmZmVyW2ldICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXS5zZXRUZXh0KHRleHRCdWZmZXJbaV0sIFRleHRWaWV3LkJ1ZmZlclR5cGUuU1BBTk5BQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXS5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgICAgIHN1cGVyLm9uTWVhc3VyZSh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0KLSAgICAgICAgICAgIGludCBzYWZlV2lkdGggPSBnZXRNZWFzdXJlZFdpZHRoKCk7Ci0gICAgICAgICAgICBpbnQgc2FmZUhlaWdodCA9IGdldE1lYXN1cmVkSGVpZ2h0KCk7Ci0KLSAgICAgICAgICAgIC8vIENFQS02MDggYXNzdW1lcyA0OjMgdmlkZW8KLSAgICAgICAgICAgIGlmIChzYWZlV2lkdGggKiAzID49IHNhZmVIZWlnaHQgKiA0KSB7Ci0gICAgICAgICAgICAgICAgc2FmZVdpZHRoID0gc2FmZUhlaWdodCAqIDQgLyAzOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzYWZlSGVpZ2h0ID0gc2FmZVdpZHRoICogMyAvIDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYWZlV2lkdGggKj0gU0FGRV9BUkVBX1JBVElPOwotICAgICAgICAgICAgc2FmZUhlaWdodCAqPSBTQUZFX0FSRUFfUkFUSU87Ci0KLSAgICAgICAgICAgIGludCBsaW5lSGVpZ2h0ID0gc2FmZUhlaWdodCAvIE1BWF9ST1dTOwotICAgICAgICAgICAgaW50IGxpbmVIZWlnaHRNZWFzdXJlU3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygKLSAgICAgICAgICAgICAgICAgICAgbGluZUhlaWdodCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSk7Ci0gICAgICAgICAgICBpbnQgbGluZVdpZHRoTWVhc3VyZVNwZWMgPSBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoCi0gICAgICAgICAgICAgICAgICAgIHNhZmVXaWR0aCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSk7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1JPV1M7IGkrKykgewotICAgICAgICAgICAgICAgIG1MaW5lQm94ZXNbaV0ubWVhc3VyZShsaW5lV2lkdGhNZWFzdXJlU3BlYywgbGluZUhlaWdodE1lYXN1cmVTcGVjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkxheW91dChib29sZWFuIGNoYW5nZWQsIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7Ci0gICAgICAgICAgICAvLyBzYWZlIGNhcHRpb24gYXJlYQotICAgICAgICAgICAgaW50IHZpZXdQb3J0V2lkdGggPSByIC0gbDsKLSAgICAgICAgICAgIGludCB2aWV3UG9ydEhlaWdodCA9IGIgLSB0OwotICAgICAgICAgICAgaW50IHNhZmVXaWR0aCwgc2FmZUhlaWdodDsKLSAgICAgICAgICAgIC8vIENFQS02MDggYXNzdW1lcyA0OjMgdmlkZW8KLSAgICAgICAgICAgIGlmICh2aWV3UG9ydFdpZHRoICogMyA+PSB2aWV3UG9ydEhlaWdodCAqIDQpIHsKLSAgICAgICAgICAgICAgICBzYWZlV2lkdGggPSB2aWV3UG9ydEhlaWdodCAqIDQgLyAzOwotICAgICAgICAgICAgICAgIHNhZmVIZWlnaHQgPSB2aWV3UG9ydEhlaWdodDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2FmZVdpZHRoID0gdmlld1BvcnRXaWR0aDsKLSAgICAgICAgICAgICAgICBzYWZlSGVpZ2h0ID0gdmlld1BvcnRXaWR0aCAqIDMgLyA0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2FmZVdpZHRoICo9IFNBRkVfQVJFQV9SQVRJTzsKLSAgICAgICAgICAgIHNhZmVIZWlnaHQgKj0gU0FGRV9BUkVBX1JBVElPOwotICAgICAgICAgICAgaW50IGxlZnQgPSAodmlld1BvcnRXaWR0aCAtIHNhZmVXaWR0aCkgLyAyOwotICAgICAgICAgICAgaW50IHRvcCA9ICh2aWV3UG9ydEhlaWdodCAtIHNhZmVIZWlnaHQpIC8gMjsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfUk9XUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXS5sYXlvdXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgdG9wICsgc2FmZUhlaWdodCAqIGkgLyBNQVhfUk9XUywKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgKyBzYWZlV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICB0b3AgKyBzYWZlSGVpZ2h0ICogKGkgKyAxKSAvIE1BWF9ST1dTKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvTWVkaWFUaW1lUHJvdmlkZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvTWVkaWFUaW1lUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWYzNmQ3Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL01lZGlhVGltZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlOwotCi0vLyBOb3RlOiBUaGlzIGlzIGp1c3QgY29waWVkIGZyb20gYW5kcm9pZC5tZWRpYS5NZWRpYVRpbWVQcm92aWRlci4KLXB1YmxpYyBpbnRlcmZhY2UgTWVkaWFUaW1lUHJvdmlkZXIgewotICAgIC8vIHdlIGRvIG5vdCBhbGxvdyBuZWdhdGl2ZSBtZWRpYSB0aW1lCi0gICAgLyoqCi0gICAgICogUHJlc2VudGF0aW9uIHRpbWUgdmFsdWUgaWYgbm8gdGltZWQgZXZlbnQgbm90aWZpY2F0aW9uIGlzIHJlcXVlc3RlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgc3RhdGljIGxvbmcgTk9fVElNRSA9IC0xOwotCi0gICAgLyoqCi0gICAgICogQ2FuY2VscyBhbGwgcHJldmlvdXMgbm90aWZpY2F0aW9uIHJlcXVlc3QgZnJvbSB0aGlzIGxpc3RlbmVyIGlmIGFueS4gIEl0Ci0gICAgICogcmVnaXN0ZXJzIHRoZSBsaXN0ZW5lciB0byBnZXQgc2VlayBhbmQgc3RvcCBub3RpZmljYXRpb25zLiAgSWYgdGltZVVzIGlzCi0gICAgICogbm90IG5lZ2F0aXZlLCBpdCBhbHNvIHJlZ2lzdGVycyB0aGUgbGlzdGVuZXIgZm9yIGEgdGltZWQgZXZlbnQKLSAgICAgKiBub3RpZmljYXRpb24gd2hlbiB0aGUgcHJlc2VudGF0aW9uIHRpbWUgcmVhY2hlcyAoYmVjb21lcyBncmVhdGVyKSB0aGFuCi0gICAgICogdGhlIHZhbHVlIHNwZWNpZmllZC4gIFRoaXMgaGFwcGVucyBpbW1lZGlhdGVseSBpZiB0aGUgY3VycmVudCBtZWRpYSB0aW1lCi0gICAgICogaXMgbGFyZ2VyIHRoYW4gb3IgZXF1YWwgdG8gdGltZVVzLgotICAgICAqCi0gICAgICogQHBhcmFtIHRpbWVVcyBwcmVzZW50YXRpb24gdGltZSB0byBnZXQgdGltZWQgZXZlbnQgY2FsbGJhY2sgYXQgKG9yCi0gICAgICogICAgICAgICAgICAgICB7QGxpbmsgI05PX1RJTUV9KQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUF0KGxvbmcgdGltZVVzLCBPbk1lZGlhVGltZUxpc3RlbmVyIGxpc3RlbmVyKTsKLQotICAgIC8qKgotICAgICAqIENhbmNlbHMgYWxsIHByZXZpb3VzIG5vdGlmaWNhdGlvbiByZXF1ZXN0IGZyb20gdGhpcyBsaXN0ZW5lciBpZiBhbnkuICBJdAotICAgICAqIHJlZ2lzdGVycyB0aGUgbGlzdGVuZXIgdG8gZ2V0IHNlZWsgYW5kIHN0b3Agbm90aWZpY2F0aW9ucy4gIElmIHRoZSBtZWRpYQotICAgICAqIGlzIHN0b3BwZWQsIHRoZSBsaXN0ZW5lciB3aWxsIGltbWVkaWF0ZWx5IHJlY2VpdmUgYSBzdG9wIG5vdGlmaWNhdGlvbi4KLSAgICAgKiBPdGhlcndpc2UsIGl0IHdpbGwgcmVjZWl2ZSBhIHRpbWVkIGV2ZW50IG5vdGlmaWNhdG9uLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNjaGVkdWxlVXBkYXRlKE9uTWVkaWFUaW1lTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0gICAgLyoqCi0gICAgICogQ2FuY2VscyBhbGwgcHJldmlvdXMgbm90aWZpY2F0aW9uIHJlcXVlc3QgZnJvbSB0aGlzIGxpc3RlbmVyIGlmIGFueS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjYW5jZWxOb3RpZmljYXRpb25zKE9uTWVkaWFUaW1lTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBjdXJyZW50IHByZXNlbnRhdGlvbiB0aW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIHByZWNpc2UgICBXaGV0aGVyIGdldHRpbmcgYSBwcmVjaXNlIHRpbWUgaXMgaW1wb3J0YW50LiBUaGlzIGlzCi0gICAgICogICAgICAgICAgICAgICAgICBtb3JlIGNvc3RseS4KLSAgICAgKiBAcGFyYW0gbW9ub3RvbmljIFdoZXRoZXIgcmV0dXJuZWQgdGltZSBzaG91bGQgYmUgbW9ub3RvbmljOiB0aGF0IGlzLAotICAgICAqICAgICAgICAgICAgICAgICAgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIHRoZSBsYXN0IHJldHVybmVkIHRpbWUuICBEb24ndAotICAgICAqICAgICAgICAgICAgICAgICAgYWx3YXlzIHNldCB0aGlzIHRvIHRydWUuICBFLmcuIHRoaXMgaGFzIHVuZGVzaXJlZAotICAgICAqICAgICAgICAgICAgICAgICAgY29uc2VxdWVuY2VzIGlmIHRoZSBtZWRpYSBpcyBzZWVrZWQgYmV0d2VlbiBjYWxscy4KLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGUgbWVkaWEgaXMgbm90IGluaXRpYWxpemVkCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0Q3VycmVudFRpbWVVcyhib29sZWFuIHByZWNpc2UsIGJvb2xlYW4gbW9ub3RvbmljKQotICAgICAgICAgICAgdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIE9uTWVkaWFUaW1lTGlzdGVuZXIgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHJlZ2lzdGVyZWQgdGltZSB3YXMgcmVhY2hlZCBuYXR1cmFsbHkuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB0aW1lVXMgY3VycmVudCBtZWRpYSB0aW1lCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIG9uVGltZWRFdmVudChsb25nIHRpbWVVcyk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBtZWRpYSB0aW1lIGNoYW5nZWQgZHVlIHRvIHNlZWtpbmcuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB0aW1lVXMgY3VycmVudCBtZWRpYSB0aW1lCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIG9uU2Vlayhsb25nIHRpbWVVcyk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBwbGF5YmFjayBzdG9wcGVkLiAgVGhpcyBpcyBub3QgY2FsbGVkIG9uIHBhdXNlLCBvbmx5Ci0gICAgICAgICAqIG9uIGZ1bGwgc3RvcCwgYXQgd2hpY2ggcG9pbnQgdGhlcmUgaXMgbm8gZnVydGhlciBjdXJyZW50IG1lZGlhIHRpbWUuCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIG9uU3RvcCgpOwotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9TdWJ0aXRsZUNvbnRyb2xsZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvU3VidGl0bGVDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZDU1ZDcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9TdWJ0aXRsZUNvbnRyb2xsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlOwotCi1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUZvcm1hdDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMi5UcmFja0luZm87Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5DYXB0aW9uaW5nTWFuYWdlcjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlLlN1YnRpdGxlVHJhY2suUmVuZGVyaW5nV2lkZ2V0OwotCi0vLyBOb3RlOiBUaGlzIGlzIGZvcmtlZCBmcm9tIGFuZHJvaWQubWVkaWEuU3VidGl0bGVDb250cm9sbGVyIHNpbmNlIFAKLS8qKgotICogVGhlIHN1YnRpdGxlIGNvbnRyb2xsZXIgcHJvdmlkZXMgdGhlIGFyY2hpdGVjdHVyZSB0byBkaXNwbGF5IHN1YnRpdGxlcyBmb3IgYQotICogbWVkaWEgc291cmNlLiAgSXQgYWxsb3dzIHNwZWNpZnlpbmcgd2hpY2ggdHJhY2tzIHRvIGRpc3BsYXksIG9uIHdoaWNoIGFuY2hvcgotICogdG8gZGlzcGxheSB0aGVtLCBhbmQgYWxzbyBhbGxvd3MgYWRkaW5nIGV4dGVybmFsLCBvdXQtb2YtYmFuZCBzdWJ0aXRsZSB0cmFja3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBTdWJ0aXRsZUNvbnRyb2xsZXIgewotICAgIHByaXZhdGUgTWVkaWFUaW1lUHJvdmlkZXIgbVRpbWVQcm92aWRlcjsKLSAgICBwcml2YXRlIFZlY3RvcjxSZW5kZXJlcj4gbVJlbmRlcmVyczsKLSAgICBwcml2YXRlIFZlY3RvcjxTdWJ0aXRsZVRyYWNrPiBtVHJhY2tzOwotICAgIHByaXZhdGUgU3VidGl0bGVUcmFjayBtU2VsZWN0ZWRUcmFjazsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVNob3dpbmc7Ci0gICAgcHJpdmF0ZSBDYXB0aW9uaW5nTWFuYWdlciBtQ2FwdGlvbmluZ01hbmFnZXI7Ci0gICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdIQVRfU0hPVyA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdIQVRfSElERSA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFdIQVRfU0VMRUNUX1RSQUNLID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0hBVF9TRUxFQ1RfREVGQVVMVF9UUkFDSyA9IDQ7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIuQ2FsbGJhY2sgbUNhbGxiYWNrID0gbmV3IEhhbmRsZXIuQ2FsbGJhY2soKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7Ci0gICAgICAgICAgICBjYXNlIFdIQVRfU0hPVzoKLSAgICAgICAgICAgICAgICBkb1Nob3coKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGNhc2UgV0hBVF9ISURFOgotICAgICAgICAgICAgICAgIGRvSGlkZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgY2FzZSBXSEFUX1NFTEVDVF9UUkFDSzoKLSAgICAgICAgICAgICAgICBkb1NlbGVjdFRyYWNrKChTdWJ0aXRsZVRyYWNrKW1zZy5vYmopOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgY2FzZSBXSEFUX1NFTEVDVF9ERUZBVUxUX1RSQUNLOgotICAgICAgICAgICAgICAgIGRvU2VsZWN0RGVmYXVsdFRyYWNrKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIENhcHRpb25pbmdNYW5hZ2VyLkNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lciBtQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyID0KLSAgICAgICAgbmV3IENhcHRpb25pbmdNYW5hZ2VyLkNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25FbmFibGVkQ2hhbmdlZChib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBzZWxlY3REZWZhdWx0VHJhY2soKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkxvY2FsZUNoYW5nZWQoTG9jYWxlIGxvY2FsZSkgewotICAgICAgICAgICAgICAgIHNlbGVjdERlZmF1bHRUcmFjaygpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgcHVibGljIFN1YnRpdGxlQ29udHJvbGxlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsLCBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgc3VidGl0bGUgY29udHJvbGxlciBmb3IgYSBtZWRpYSBwbGF5YmFjayBvYmplY3QgdGhhdCBpbXBsZW1lbnRzCi0gICAgICogdGhlIE1lZGlhVGltZVByb3ZpZGVyIGludGVyZmFjZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0aW1lUHJvdmlkZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgU3VidGl0bGVDb250cm9sbGVyKAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgTWVkaWFUaW1lUHJvdmlkZXIgdGltZVByb3ZpZGVyLAotICAgICAgICAgICAgTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbVRpbWVQcm92aWRlciA9IHRpbWVQcm92aWRlcjsKLSAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0KLSAgICAgICAgbVJlbmRlcmVycyA9IG5ldyBWZWN0b3I8UmVuZGVyZXI+KCk7Ci0gICAgICAgIG1TaG93aW5nID0gZmFsc2U7Ci0gICAgICAgIG1UcmFja3MgPSBuZXcgVmVjdG9yPFN1YnRpdGxlVHJhY2s+KCk7Ci0gICAgICAgIG1DYXB0aW9uaW5nTWFuYWdlciA9Ci0gICAgICAgICAgICAoQ2FwdGlvbmluZ01hbmFnZXIpY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ0FQVElPTklOR19TRVJWSUNFKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICBtQ2FwdGlvbmluZ01hbmFnZXIucmVtb3ZlQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKAotICAgICAgICAgICAgICAgIG1DYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIpOwotICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGF2YWlsYWJsZSBzdWJ0aXRsZSB0cmFja3MgZm9yIHRoaXMgbWVkaWEuIFRoZXNlIGluY2x1ZGUKLSAgICAgKiB0aGUgdHJhY2tzIGZvdW5kIGJ5IHtAbGluayBNZWRpYVBsYXllcn0gYXMgd2VsbCBhcyBhbnkgdHJhY2tzIGFkZGVkCi0gICAgICogbWFudWFsbHkgdmlhIHtAbGluayAjYWRkVHJhY2t9LgotICAgICAqLwotICAgIHB1YmxpYyBTdWJ0aXRsZVRyYWNrW10gZ2V0VHJhY2tzKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQobVRyYWNrcykgewotICAgICAgICAgICAgU3VidGl0bGVUcmFja1tdIHRyYWNrcyA9IG5ldyBTdWJ0aXRsZVRyYWNrW21UcmFja3Muc2l6ZSgpXTsKLSAgICAgICAgICAgIG1UcmFja3MudG9BcnJheSh0cmFja3MpOwotICAgICAgICAgICAgcmV0dXJuIHRyYWNrczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBzdWJ0aXRsZSB0cmFjawotICAgICAqLwotICAgIHB1YmxpYyBTdWJ0aXRsZVRyYWNrIGdldFNlbGVjdGVkVHJhY2soKSB7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0ZWRUcmFjazsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFJlbmRlcmluZ1dpZGdldCBnZXRSZW5kZXJpbmdXaWRnZXQoKSB7Ci0gICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbVNlbGVjdGVkVHJhY2suZ2V0UmVuZGVyaW5nV2lkZ2V0KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VsZWN0cyBhIHN1YnRpdGxlIHRyYWNrLiAgQXMgYSByZXN1bHQsIHRoaXMgdHJhY2sgd2lsbCByZWNlaXZlCi0gICAgICogaW4tYmFuZCBkYXRhIGZyb20gdGhlIHtAbGluayBNZWRpYVBsYXllcn0uICBIb3dldmVyLCB0aGlzIGRvZXMKLSAgICAgKiBub3QgY2hhbmdlIHRoZSBzdWJ0aXRsZSB2aXNpYmlsaXR5LgotICAgICAqCi0gICAgICogU2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSBhbmNob3IncyAoVUkpIHRocmVhZC4ge0BzZWUgI0FuY2hvci5nZXRTdWJ0aXRsZUxvb3Blcn0KLSAgICAgKgotICAgICAqIEBwYXJhbSB0cmFjayBUaGUgc3VidGl0bGUgdHJhY2sgdG8gc2VsZWN0LiAgVGhpcyBtdXN0IGJlIG9uZSBvZiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgdHJhY2tzIGluIHtAbGluayAjZ2V0VHJhY2tzfS4KLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHRyYWNrIHdhcyBzdWNjZXNzZnVsbHkgc2VsZWN0ZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gc2VsZWN0VHJhY2soU3VidGl0bGVUcmFjayB0cmFjaykgewotICAgICAgICBpZiAodHJhY2sgIT0gbnVsbCAmJiAhbVRyYWNrcy5jb250YWlucyh0cmFjaykpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb2Nlc3NPbkFuY2hvcihtSGFuZGxlci5vYnRhaW5NZXNzYWdlKFdIQVRfU0VMRUNUX1RSQUNLLCB0cmFjaykpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9TZWxlY3RUcmFjayhTdWJ0aXRsZVRyYWNrIHRyYWNrKSB7Ci0gICAgICAgIG1UcmFja0lzRXhwbGljaXQgPSB0cnVlOwotICAgICAgICBpZiAobVNlbGVjdGVkVHJhY2sgPT0gdHJhY2spIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2VsZWN0ZWRUcmFjay5oaWRlKCk7Ci0gICAgICAgICAgICBtU2VsZWN0ZWRUcmFjay5zZXRUaW1lUHJvdmlkZXIobnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtU2VsZWN0ZWRUcmFjayA9IHRyYWNrOwotICAgICAgICBpZiAobUFuY2hvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQW5jaG9yLnNldFN1YnRpdGxlV2lkZ2V0KGdldFJlbmRlcmluZ1dpZGdldCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2VsZWN0ZWRUcmFjay5zZXRUaW1lUHJvdmlkZXIobVRpbWVQcm92aWRlcik7Ci0gICAgICAgICAgICBtU2VsZWN0ZWRUcmFjay5zaG93KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1MaXN0ZW5lci5vblN1YnRpdGxlVHJhY2tTZWxlY3RlZCh0cmFjayk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSBkZWZhdWx0IHN1YnRpdGxlIHRyYWNrIGJhc2VkIG9uIHN5c3RlbSBwcmVmZXJlbmNlcywgb3IgbnVsbCwKLSAgICAgKiBpZiBubyBzdWNoIHRyYWNrIGV4aXN0cyBpbiB0aGlzIG1hbmFnZXIuCi0gICAgICoKLSAgICAgKiBTdXBwb3J0cyBITFMtZmxhZ3M6IEFVVE9TRUxFQ1QsIEZPUkNFRCAmIERFRkFVTFQuCi0gICAgICoKLSAgICAgKiAxLiBJZiBjYXB0aW9uaW5nIGlzIGRpc2FibGVkLCBvbmx5IGNvbnNpZGVyIEZPUkNFRCB0cmFja3MuIE90aGVyd2lzZSwKLSAgICAgKiBjb25zaWRlciBhbGwgdHJhY2tzLCBidXQgcHJlZmVyIG5vbi1GT1JDRUQgb25lcy4KLSAgICAgKiAyLiBJZiB1c2VyIHNlbGVjdGVkICJEZWZhdWx0IiBjYXB0aW9uIGxhbmd1YWdlOgotICAgICAqICAgYS4gSWYgdGhlcmUgaXMgYSBjb25zaWRlcmVkIHRyYWNrIHdpdGggREVGQVVMVD15ZXMsIHJldHVybnMgdGhhdCB0cmFjawotICAgICAqICAgICAgKGZhdm9yIHRoZSBmaXJzdCBvbmUgaW4gdGhlIGN1cnJlbnQgbGFuZ3VhZ2UgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbgotICAgICAqICAgICAgb25lIGRlZmF1bHQgdHJhY2tzLCBvciB0aGUgZmlyc3QgaW4gZ2VuZXJhbCBpZiBub25lIG9mIHRoZW0gYXJlIGluCi0gICAgICogICAgICB0aGUgY3VycmVudCBsYW5ndWFnZSkuCi0gICAgICogICBiLiBPdGhlcndpc2UsIGlmIHRoZXJlIGlzIGEgdHJhY2sgd2l0aCBBVVRPU0VMRUNUPXllcyBpbiB0aGUgY3VycmVudAotICAgICAqICAgICAgbGFuZ3VhZ2UsIHJldHVybiB0aGF0IG9uZS4KLSAgICAgKiAgIGMuIElmIHRoZXJlIGFyZSBubyBkZWZhdWx0IHRyYWNrcywgYW5kIG5vIGF1dG9zZWxlY3RhYmxlIHRyYWNrcyBpbiB0aGUKLSAgICAgKiAgICAgIGN1cnJlbnQgbGFuZ3VhZ2UsIHJldHVybiBudWxsLgotICAgICAqIDMuIElmIHRoZXJlIGlzIGEgdHJhY2sgd2l0aCB0aGUgY2FwdGlvbiBsYW5ndWFnZSwgc2VsZWN0IHRoYXQgb25lLiAgUHJlZmVyCi0gICAgICogdGhlIG9uZSB3aXRoIEFVVE9TRUxFQ1Q9bm8uCi0gICAgICoKLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZXMgZm9yIHRoZXNlIGZsYWdzIGFyZSBERUZBVUxUPW5vLCBBVVRPU0VMRUNUPXllcwotICAgICAqIGFuZCBGT1JDRUQ9bm8uCi0gICAgICovCi0gICAgcHVibGljIFN1YnRpdGxlVHJhY2sgZ2V0RGVmYXVsdFRyYWNrKCkgewotICAgICAgICBTdWJ0aXRsZVRyYWNrIGJlc3RUcmFjayA9IG51bGw7Ci0gICAgICAgIGludCBiZXN0U2NvcmUgPSAtMTsKLQotICAgICAgICBMb2NhbGUgc2VsZWN0ZWRMb2NhbGUgPSBtQ2FwdGlvbmluZ01hbmFnZXIuZ2V0TG9jYWxlKCk7Ci0gICAgICAgIExvY2FsZSBsb2NhbGUgPSBzZWxlY3RlZExvY2FsZTsKLSAgICAgICAgaWYgKGxvY2FsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBsb2NhbGUgPSBMb2NhbGUuZ2V0RGVmYXVsdCgpOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gc2VsZWN0Rm9yY2VkID0gIW1DYXB0aW9uaW5nTWFuYWdlci5pc0VuYWJsZWQoKTsKLQotICAgICAgICBzeW5jaHJvbml6ZWQobVRyYWNrcykgewotICAgICAgICAgICAgZm9yIChTdWJ0aXRsZVRyYWNrIHRyYWNrOiBtVHJhY2tzKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFGb3JtYXQgZm9ybWF0ID0gdHJhY2suZ2V0Rm9ybWF0KCk7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGxhbmd1YWdlID0gZm9ybWF0LmdldFN0cmluZyhNZWRpYUZvcm1hdC5LRVlfTEFOR1VBR0UpOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gZm9yY2VkID0KLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRSwgMCkgIT0gMDsKLSAgICAgICAgICAgICAgICBib29sZWFuIGF1dG9zZWxlY3QgPQotICAgICAgICAgICAgICAgICAgICBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfSVNfQVVUT1NFTEVDVCwgMSkgIT0gMDsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzX2RlZmF1bHQgPQotICAgICAgICAgICAgICAgICAgICBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfSVNfREVGQVVMVCwgMCkgIT0gMDsKLQotICAgICAgICAgICAgICAgIGJvb2xlYW4gbGFuZ3VhZ2VNYXRjaGVzID0KLSAgICAgICAgICAgICAgICAgICAgKGxvY2FsZSA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgIGxvY2FsZS5nZXRMYW5ndWFnZSgpLmVxdWFscygiIikgfHwKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxlLmdldElTTzNMYW5ndWFnZSgpLmVxdWFscyhsYW5ndWFnZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxlLmdldExhbmd1YWdlKCkuZXF1YWxzKGxhbmd1YWdlKSk7Ci0gICAgICAgICAgICAgICAgLy8gaXNfZGVmYXVsdCBpcyBtZWFuaW5nbGVzcyB1bmxlc3MgY2FwdGlvbiBsYW5ndWFnZSBpcyAnZGVmYXVsdCcKLSAgICAgICAgICAgICAgICBpbnQgc2NvcmUgPSAoZm9yY2VkID8gMCA6IDgpICsKLSAgICAgICAgICAgICAgICAgICAgKCgoc2VsZWN0ZWRMb2NhbGUgPT0gbnVsbCkgJiYgaXNfZGVmYXVsdCkgPyA0IDogMCkgKwotICAgICAgICAgICAgICAgICAgICAoYXV0b3NlbGVjdCA/IDAgOiAyKSArIChsYW5ndWFnZU1hdGNoZXMgPyAxIDogMCk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoc2VsZWN0Rm9yY2VkICYmICFmb3JjZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gd2UgdHJlYXQgbnVsbCBsb2NhbGUvbGFuZ3VhZ2UgYXMgbWF0Y2hpbmcgYW55IGxhbmd1YWdlCi0gICAgICAgICAgICAgICAgaWYgKChzZWxlY3RlZExvY2FsZSA9PSBudWxsICYmIGlzX2RlZmF1bHQpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChsYW5ndWFnZU1hdGNoZXMgJiYKLSAgICAgICAgICAgICAgICAgICAgIChhdXRvc2VsZWN0IHx8IGZvcmNlZCB8fCBzZWxlY3RlZExvY2FsZSAhPSBudWxsKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3JlID4gYmVzdFNjb3JlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBiZXN0U2NvcmUgPSBzY29yZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RUcmFjayA9IHRyYWNrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiZXN0VHJhY2s7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1UcmFja0lzRXhwbGljaXQgPSBmYWxzZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVZpc2liaWxpdHlJc0V4cGxpY2l0ID0gZmFsc2U7Ci0KLSAgICAvKiogc2hvdWxkIGJlIGNhbGxlZCBmcm9tIGFuY2hvciB0aHJlYWQgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3REZWZhdWx0VHJhY2soKSB7Ci0gICAgICAgIHByb2Nlc3NPbkFuY2hvcihtSGFuZGxlci5vYnRhaW5NZXNzYWdlKFdIQVRfU0VMRUNUX0RFRkFVTFRfVFJBQ0spKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9TZWxlY3REZWZhdWx0VHJhY2soKSB7Ci0gICAgICAgIGlmIChtVHJhY2tJc0V4cGxpY2l0KSB7Ci0gICAgICAgICAgICAvLyBJZiB0cmFjayBzZWxlY3Rpb24gaXMgZXhwbGljaXQsIGJ1dCB2aXNpYmlsaXR5Ci0gICAgICAgICAgICAvLyBpcyBub3QsIGl0IGZhbGxzIGJhY2sgdG8gdGhlIGNhcHRpb25pbmcgc2V0dGluZwotICAgICAgICAgICAgaWYgKCFtVmlzaWJpbGl0eUlzRXhwbGljaXQpIHsKLSAgICAgICAgICAgICAgICBpZiAobUNhcHRpb25pbmdNYW5hZ2VyLmlzRW5hYmxlZCgpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChtU2VsZWN0ZWRUcmFjayAhPSBudWxsICYmCi0gICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRUcmFjay5nZXRGb3JtYXQoKS5nZXRJbnRlZ2VyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhRm9ybWF0LktFWV9JU19GT1JDRURfU1VCVElUTEUsIDApICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNob3coKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIG1TZWxlY3RlZFRyYWNrLmdldFRyYWNrVHlwZSgpID09IFRyYWNrSW5mby5NRURJQV9UUkFDS19UWVBFX1NVQlRJVExFKSB7Ci0gICAgICAgICAgICAgICAgICAgIGhpZGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVZpc2liaWxpdHlJc0V4cGxpY2l0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSBjYW4gaGF2ZSBhIGRlZmF1bHQgKGZvcmNlZCkgdHJhY2sgZXZlbiBpZiBjYXB0aW9uaW5nCi0gICAgICAgIC8vIGlzIG5vdCBlbmFibGVkLiAgVGhpcyBpcyBoYW5kbGVkIGJ5IGdldERlZmF1bHRUcmFjaygpLgotICAgICAgICAvLyBTaG93IHRoaXMgdHJhY2sgdW5sZXNzIHN1YnRpdGxlcyB3ZXJlIGV4cGxpY2l0bHkgaGlkZGVuLgotICAgICAgICBTdWJ0aXRsZVRyYWNrIHRyYWNrID0gZ2V0RGVmYXVsdFRyYWNrKCk7Ci0gICAgICAgIGlmICh0cmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZWxlY3RUcmFjayh0cmFjayk7Ci0gICAgICAgICAgICBtVHJhY2tJc0V4cGxpY2l0ID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAoIW1WaXNpYmlsaXR5SXNFeHBsaWNpdCkgewotICAgICAgICAgICAgICAgIHNob3coKTsKLSAgICAgICAgICAgICAgICBtVmlzaWJpbGl0eUlzRXhwbGljaXQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiBtdXN0IGJlIGNhbGxlZCBmcm9tIGFuY2hvciB0aHJlYWQgKi8KLSAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgY2hlY2tBbmNob3JMb29wZXIoKTsKLSAgICAgICAgaGlkZSgpOwotICAgICAgICBzZWxlY3RUcmFjayhudWxsKTsKLSAgICAgICAgbVRyYWNrcy5jbGVhcigpOwotICAgICAgICBtVHJhY2tJc0V4cGxpY2l0ID0gZmFsc2U7Ci0gICAgICAgIG1WaXNpYmlsaXR5SXNFeHBsaWNpdCA9IGZhbHNlOwotICAgICAgICBtQ2FwdGlvbmluZ01hbmFnZXIucmVtb3ZlQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKAotICAgICAgICAgICAgICAgIG1DYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSBuZXcsIGV4dGVybmFsIHN1YnRpdGxlIHRyYWNrIHRvIHRoZSBtYW5hZ2VyLgotICAgICAqCi0gICAgICogQHBhcmFtIGZvcm1hdCB0aGUgZm9ybWF0IG9mIHRoZSB0cmFjayB0aGF0IHdpbGwgaW5jbHVkZSBhdCBsZWFzdAotICAgICAqICAgICAgICAgICAgICAgdGhlIE1JTUUgdHlwZSB7QGxpbmsgTWVkaWFGb3JtYXRAS0VZX01JTUV9LgotICAgICAqIEByZXR1cm4gdGhlIGNyZWF0ZWQge0BsaW5rIFN1YnRpdGxlVHJhY2t9IG9iamVjdAotICAgICAqLwotICAgIHB1YmxpYyBTdWJ0aXRsZVRyYWNrIGFkZFRyYWNrKE1lZGlhRm9ybWF0IGZvcm1hdCkgewotICAgICAgICBzeW5jaHJvbml6ZWQobVJlbmRlcmVycykgewotICAgICAgICAgICAgZm9yIChSZW5kZXJlciByZW5kZXJlcjogbVJlbmRlcmVycykgewotICAgICAgICAgICAgICAgIGlmIChyZW5kZXJlci5zdXBwb3J0cyhmb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN1YnRpdGxlVHJhY2sgdHJhY2sgPSByZW5kZXJlci5jcmVhdGVUcmFjayhmb3JtYXQpOwotICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkKG1UcmFja3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVRyYWNrcy5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FwdGlvbmluZ01hbmFnZXIuYWRkQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tzLmFkZCh0cmFjayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJhY2s7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdyB0aGUgc2VsZWN0ZWQgKG9yIGRlZmF1bHQpIHN1YnRpdGxlIHRyYWNrLgotICAgICAqCi0gICAgICogU2hvdWxkIGJlIGNhbGxlZCBmcm9tIHRoZSBhbmNob3IncyAoVUkpIHRocmVhZC4ge0BzZWUgI0FuY2hvci5nZXRTdWJ0aXRsZUxvb3Blcn0KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzaG93KCkgewotICAgICAgICBwcm9jZXNzT25BbmNob3IobUhhbmRsZXIub2J0YWluTWVzc2FnZShXSEFUX1NIT1cpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZG9TaG93KCkgewotICAgICAgICBtU2hvd2luZyA9IHRydWU7Ci0gICAgICAgIG1WaXNpYmlsaXR5SXNFeHBsaWNpdCA9IHRydWU7Ci0gICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2VsZWN0ZWRUcmFjay5zaG93KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIaWRlIHRoZSBzZWxlY3RlZCAob3IgZGVmYXVsdCkgc3VidGl0bGUgdHJhY2suCi0gICAgICoKLSAgICAgKiBTaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIGFuY2hvcidzIChVSSkgdGhyZWFkLiB7QHNlZSAjQW5jaG9yLmdldFN1YnRpdGxlTG9vcGVyfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGhpZGUoKSB7Ci0gICAgICAgIHByb2Nlc3NPbkFuY2hvcihtSGFuZGxlci5vYnRhaW5NZXNzYWdlKFdIQVRfSElERSkpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb0hpZGUoKSB7Ci0gICAgICAgIG1WaXNpYmlsaXR5SXNFeHBsaWNpdCA9IHRydWU7Ci0gICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2VsZWN0ZWRUcmFjay5oaWRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVNob3dpbmcgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2UgZm9yIHN1cHBvcnRpbmcgYSBzaW5nbGUgb3IgbXVsdGlwbGUgc3VidGl0bGUgdHlwZXMgaW4ge0BsaW5rCi0gICAgICogTWVkaWFQbGF5ZXJ9LgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgUmVuZGVyZXIgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIGJ5IHtAbGluayBNZWRpYVBsYXllcn0ncyB7QGxpbmsgU3VidGl0bGVDb250cm9sbGVyfSB3aGVuIGEgbmV3Ci0gICAgICAgICAqIHN1YnRpdGxlIHRyYWNrIGlzIGRldGVjdGVkLCB0byBzZWUgaWYgaXQgc2hvdWxkIHVzZSB0aGlzIG9iamVjdCB0bwotICAgICAgICAgKiBwYXJzZSBhbmQgZGlzcGxheSB0aGlzIHN1YnRpdGxlIHRyYWNrLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZm9ybWF0IHRoZSBmb3JtYXQgb2YgdGhlIHRyYWNrIHRoYXQgd2lsbCBpbmNsdWRlIGF0IGxlYXN0Ci0gICAgICAgICAqICAgICAgICAgICAgICAgdGhlIE1JTUUgdHlwZSB7QGxpbmsgTWVkaWFGb3JtYXRAS0VZX01JTUV9LgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIHRyYWNrIGZvcm1hdCBpcyBzdXBwb3J0ZWQgYnkgdGhpcwotICAgICAgICAgKiByZW5kZXJlcgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGFic3RyYWN0IGJvb2xlYW4gc3VwcG9ydHMoTWVkaWFGb3JtYXQgZm9ybWF0KTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIGJ5IHtAbGluayBNZWRpYVBsYXllcn0ncyB7QGxpbmsgU3VidGl0bGVDb250cm9sbGVyfSBmb3IgZWFjaAotICAgICAgICAgKiBzdWJ0aXRsZSB0cmFjayB0aGF0IHdhcyBkZXRlY3RlZCBhbmQgaXMgc3VwcG9ydGVkIGJ5IHRoaXMgb2JqZWN0IHRvCi0gICAgICAgICAqIGNyZWF0ZSBhIHtAbGluayBTdWJ0aXRsZVRyYWNrfSBvYmplY3QuICBUaGlzIG9iamVjdCB3aWxsIGJlIGNyZWF0ZWQKLSAgICAgICAgICogZm9yIGVhY2ggdHJhY2sgdGhhdCB3YXMgZm91bmQuICBJZiB0aGUgdHJhY2sgaXMgc2VsZWN0ZWQgZm9yIGRpc3BsYXksCi0gICAgICAgICAqIHRoaXMgb2JqZWN0IHdpbGwgYmUgdXNlZCB0byBwYXJzZSBhbmQgZGlzcGxheSB0aGUgdHJhY2sgZGF0YS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGZvcm1hdCB0aGUgZm9ybWF0IG9mIHRoZSB0cmFjayB0aGF0IHdpbGwgaW5jbHVkZSBhdCBsZWFzdAotICAgICAgICAgKiAgICAgICAgICAgICAgIHRoZSBNSU1FIHR5cGUge0BsaW5rIE1lZGlhRm9ybWF0QEtFWV9NSU1FfS4KLSAgICAgICAgICogQHJldHVybiBhIHtAbGluayBTdWJ0aXRsZVRyYWNrfSBvYmplY3QgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcGFyc2UKLSAgICAgICAgICogYW5kIHJlbmRlciB0aGUgc3VidGl0bGUgdHJhY2suCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYWJzdHJhY3QgU3VidGl0bGVUcmFjayBjcmVhdGVUcmFjayhNZWRpYUZvcm1hdCBmb3JtYXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBzdXBwb3J0IGZvciBhIHN1YnRpdGxlIGZvcm1hdCBpbiB7QGxpbmsgTWVkaWFQbGF5ZXJ9LgotICAgICAqCi0gICAgICogQHBhcmFtIHJlbmRlcmVyIGEge0BsaW5rIFN1YnRpdGxlQ29udHJvbGxlci5SZW5kZXJlcn0gb2JqZWN0IHRoYXQgYWRkcwotICAgICAqICAgICAgICAgICAgICAgICBzdXBwb3J0IGZvciBhIHN1YnRpdGxlIGZvcm1hdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWdpc3RlclJlbmRlcmVyKFJlbmRlcmVyIHJlbmRlcmVyKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtUmVuZGVyZXJzKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIGhvdyB0byBnZXQgYXZhaWxhYmxlIHJlbmRlcmVycyBpbiB0aGUgc3lzdGVtCi0gICAgICAgICAgICBpZiAoIW1SZW5kZXJlcnMuY29udGFpbnMocmVuZGVyZXIpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyBzaG91bGQgYWRkZWQgcmVuZGVyZXJzIG92ZXJyaWRlIGV4aXN0aW5nIG9uZXMgKHRvIGFsbG93IHJlcGxhY2luZz8pCi0gICAgICAgICAgICAgICAgbVJlbmRlcmVycy5hZGQocmVuZGVyZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzUmVuZGVyZXJGb3IoTWVkaWFGb3JtYXQgZm9ybWF0KSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtUmVuZGVyZXJzKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIGhvdyB0byBnZXQgYXZhaWxhYmxlIHJlbmRlcmVycyBpbiB0aGUgc3lzdGVtCi0gICAgICAgICAgICBmb3IgKFJlbmRlcmVyIHJlbmRlcmVyOiBtUmVuZGVyZXJzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlbmRlcmVyLnN1cHBvcnRzKGZvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3VidGl0bGUgYW5jaG9yLCBhbiBvYmplY3QgdGhhdCBpcyBhYmxlIHRvIGRpc3BsYXkgYSBzdWJ0aXRsZSByZW5kZXJlciwKLSAgICAgKiBlLmcuIGEgVmlkZW9WaWV3LgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgQW5jaG9yIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuY2hvciBzaG91bGQgdXNlIHRoZSBzdXBwbGllZCBzdWJ0aXRsZSByZW5kZXJpbmcgd2lkZ2V0LCBvcgotICAgICAgICAgKiBub25lIGlmIGl0IGlzIG51bGwuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZVdpZGdldChSZW5kZXJpbmdXaWRnZXQgc3VidGl0bGVXaWRnZXQpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbmNob3JzIHByb3ZpZGUgdGhlIGxvb3BlciBvbiB3aGljaCBhbGwgdHJhY2sgdmlzaWJpbGl0eSBjaGFuZ2VzCi0gICAgICAgICAqICh0cmFjay5zaG93L2hpZGUsIHNldFN1YnRpdGxlV2lkZ2V0KSB3aWxsIHRha2UgcGxhY2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTG9vcGVyIGdldFN1YnRpdGxlTG9vcGVyKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBBbmNob3IgbUFuY2hvcjsKLQotICAgIC8qKgotICAgICAqICBjYWxsZWQgZnJvbSBhbmNob3IncyBsb29wZXIgKGlmIGFueSwgYm90aCB3aGVuIHVuc2V0dGluZyBhbmQKLSAgICAgKiAgc2V0dGluZykKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRBbmNob3IoQW5jaG9yIGFuY2hvcikgewotICAgICAgICBpZiAobUFuY2hvciA9PSBhbmNob3IpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQW5jaG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNoZWNrQW5jaG9yTG9vcGVyKCk7Ci0gICAgICAgICAgICBtQW5jaG9yLnNldFN1YnRpdGxlV2lkZ2V0KG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIG1BbmNob3IgPSBhbmNob3I7Ci0gICAgICAgIG1IYW5kbGVyID0gbnVsbDsKLSAgICAgICAgaWYgKG1BbmNob3IgIT0gbnVsbCkgewotICAgICAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcihtQW5jaG9yLmdldFN1YnRpdGxlTG9vcGVyKCksIG1DYWxsYmFjayk7Ci0gICAgICAgICAgICBjaGVja0FuY2hvckxvb3BlcigpOwotICAgICAgICAgICAgbUFuY2hvci5zZXRTdWJ0aXRsZVdpZGdldChnZXRSZW5kZXJpbmdXaWRnZXQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY2hlY2tBbmNob3JMb29wZXIoKSB7Ci0gICAgICAgIGFzc2VydCBtSGFuZGxlciAhPSBudWxsIDogIlNob3VsZCBoYXZlIGEgbG9vcGVyIGFscmVhZHkiOwotICAgICAgICBhc3NlcnQgTG9vcGVyLm15TG9vcGVyKCkgPT0gbUhhbmRsZXIuZ2V0TG9vcGVyKCkKLSAgICAgICAgICAgICAgICA6ICJNdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBhbmNob3IncyBsb29wZXIiOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzT25BbmNob3IoTWVzc2FnZSBtKSB7Ci0gICAgICAgIGFzc2VydCBtSGFuZGxlciAhPSBudWxsIDogIlNob3VsZCBoYXZlIGEgbG9vcGVyIGFscmVhZHkiOwotICAgICAgICBpZiAoTG9vcGVyLm15TG9vcGVyKCkgPT0gbUhhbmRsZXIuZ2V0TG9vcGVyKCkpIHsKLSAgICAgICAgICAgIG1IYW5kbGVyLmRpc3BhdGNoTWVzc2FnZShtKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRNZXNzYWdlKG0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludGVyZmFjZSBMaXN0ZW5lciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIHN1YnRpdGxlIHRyYWNrIGhhcyBiZWVuIHNlbGVjdGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gdHJhY2sgc2VsZWN0ZWQgc3VidGl0bGUgdHJhY2sgb3IgbnVsbAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25TdWJ0aXRsZVRyYWNrU2VsZWN0ZWQoU3VidGl0bGVUcmFjayB0cmFjayk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0ZW5lciBtTGlzdGVuZXI7Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL1N1YnRpdGxlVHJhY2suamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvU3VidGl0bGVUcmFjay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjkwNjRhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvU3VidGl0bGVUcmFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjk2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGU7Ci0KLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyLlRyYWNrSW5mbzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlN1YnRpdGxlRGF0YTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9uZ1NwYXJzZUFycmF5OwotaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotLy8gTm90ZTogVGhpcyBpcyBmb3JrZWQgZnJvbSBhbmRyb2lkLm1lZGlhLlN1YnRpdGxlVHJhY2sgc2luY2UgUAotLyoqCi0gKiBBIHN1YnRpdGxlIHRyYWNrIGFic3RyYWN0IGJhc2UgY2xhc3MgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgcGFyc2luZyBhbmQgZGlzcGxheWluZwotICogYW4gaW5zdGFuY2Ugb2YgYSBwYXJ0aWN1bGFyIHR5cGUgb2Ygc3VidGl0bGUuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBTdWJ0aXRsZVRyYWNrIGltcGxlbWVudHMgTWVkaWFUaW1lUHJvdmlkZXIuT25NZWRpYVRpbWVMaXN0ZW5lciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTdWJ0aXRsZVRyYWNrIjsKLSAgICBwcml2YXRlIGxvbmcgbUxhc3RVcGRhdGVUaW1lTXM7Ci0gICAgcHJpdmF0ZSBsb25nIG1MYXN0VGltZU1zOwotCi0gICAgcHJpdmF0ZSBSdW5uYWJsZSBtUnVubmFibGU7Ci0KLSAgICBmaW5hbCBwcml2YXRlIExvbmdTcGFyc2VBcnJheTxSdW4+IG1SdW5zQnlFbmRUaW1lID0gbmV3IExvbmdTcGFyc2VBcnJheTxSdW4+KCk7Ci0gICAgZmluYWwgcHJpdmF0ZSBMb25nU3BhcnNlQXJyYXk8UnVuPiBtUnVuc0J5SUQgPSBuZXcgTG9uZ1NwYXJzZUFycmF5PFJ1bj4oKTsKLQotICAgIHByaXZhdGUgQ3VlTGlzdCBtQ3VlczsKLSAgICBmaW5hbCBwcml2YXRlIFZlY3RvcjxDdWU+IG1BY3RpdmVDdWVzID0gbmV3IFZlY3RvcjxDdWU+KCk7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gbVZpc2libGU7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBERUJVRyA9IGZhbHNlOwotCi0gICAgcHJvdGVjdGVkIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOwotCi0gICAgcHJpdmF0ZSBNZWRpYUZvcm1hdCBtRm9ybWF0OwotCi0gICAgcHVibGljIFN1YnRpdGxlVHJhY2soTWVkaWFGb3JtYXQgZm9ybWF0KSB7Ci0gICAgICAgIG1Gb3JtYXQgPSBmb3JtYXQ7Ci0gICAgICAgIG1DdWVzID0gbmV3IEN1ZUxpc3QoKTsKLSAgICAgICAgY2xlYXJBY3RpdmVDdWVzKCk7Ci0gICAgICAgIG1MYXN0VGltZU1zID0gLTE7Ci0gICAgfQotCi0gICAgcHVibGljIGZpbmFsIE1lZGlhRm9ybWF0IGdldEZvcm1hdCgpIHsKLSAgICAgICAgcmV0dXJuIG1Gb3JtYXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBsb25nIG1OZXh0U2NoZWR1bGVkVGltZU1zID0gLTE7Ci0KLSAgICBwdWJsaWMgdm9pZCBvbkRhdGEoU3VidGl0bGVEYXRhIGRhdGEpIHsKLSAgICAgICAgbG9uZyBydW5JRCA9IGRhdGEuZ2V0U3RhcnRUaW1lVXMoKSArIDE7Ci0gICAgICAgIG9uRGF0YShkYXRhLmdldERhdGEoKSwgdHJ1ZSAvKiBlb3MgKi8sIHJ1bklEKTsKLSAgICAgICAgc2V0UnVuRGlzY2FyZFRpbWVNcygKLSAgICAgICAgICAgICAgICBydW5JRCwKLSAgICAgICAgICAgICAgICAoZGF0YS5nZXRTdGFydFRpbWVVcygpICsgZGF0YS5nZXREdXJhdGlvblVzKCkpIC8gMTAwMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlcmUgaXMgaW5wdXQgZGF0YSBmb3IgdGhlIHN1YnRpdGxlIHRyYWNrLiAgVGhlCi0gICAgICogY29tcGxldGUgc3VidGl0bGUgZm9yIGEgdHJhY2sgY2FuIGluY2x1ZGUgbXVsdGlwbGUgd2hvbGUgdW5pdHMKLSAgICAgKiAocnVucykuICBFYWNoIG9mIHRoZXNlIHVuaXRzIGNhbiBoYXZlIG11bHRpcGxlIHNlY3Rpb25zLiAgVGhlCi0gICAgICogY29udGVudHMgb2YgYSBydW4gYXJlIHN1Ym1pdHRlZCBpbiBzZXF1ZW50aWFsIG9yZGVyLCB3aXRoIGVvcwotICAgICAqIGluZGljYXRpbmcgdGhlIGxhc3Qgc2VjdGlvbiBvZiB0aGUgcnVuLiAgQ2FsbHMgZnJvbSBkaWZmZXJlbnQKLSAgICAgKiBydW5zIG11c3Qgbm90IGJlIGludGVybWl4ZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGF0YSBzdWJ0aXRsZSBkYXRhIGJ5dGUgYnVmZmVyCi0gICAgICogQHBhcmFtIGVvcyB0cnVlIGlmIHRoaXMgaXMgdGhlIGxhc3Qgc2VjdGlvbiBvZiB0aGUgcnVuLgotICAgICAqIEBwYXJhbSBydW5JRCBtb3N0bHktdW5pcXVlIElEIGZvciB0aGlzIHJ1biBvZiBkYXRhLiAgU3VidGl0bGUgY3VlcwotICAgICAqICAgICAgICAgICAgICB3aXRoIHJ1bklEIG9mIDAgYXJlIGRpc2NhcmRlZCBpbW1lZGlhdGVseSBhZnRlcgotICAgICAqICAgICAgICAgICAgICBkaXNwbGF5LiAgQ3VlcyB3aXRoIHJ1bklEIG9mIH4wIGFyZSBkaXNjYXJkZWQKLSAgICAgKiAgICAgICAgICAgICAgb25seSBhdCB0aGUgZGVsZXRpb24gb2YgdGhlIHRyYWNrIG9iamVjdC4gIEN1ZXMKLSAgICAgKiAgICAgICAgICAgICAgd2l0aCBvdGhlciBydW5JRC1zIGFyZSBkaXNjYXJkZWQgYXQgdGhlIGVuZCBvZiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgcnVuLCB3aGljaCBkZWZhdWx0cyB0byB0aGUgbGF0ZXN0IHRpbWVzdGFtcCBvZgotICAgICAqICAgICAgICAgICAgICBhbnkgb2YgaXRzIGN1ZXMgKHdpdGggdGhpcyBydW5JRCkuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgb25EYXRhKGJ5dGVbXSBkYXRhLCBib29sZWFuIGVvcywgbG9uZyBydW5JRCk7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiBhZGRpbmcgdGhlIHN1YnRpdGxlIHJlbmRlcmluZyB3aWRnZXQgdG8gdGhlIHZpZXcgaGllcmFyY2h5LAotICAgICAqIGFzIHdlbGwgYXMgd2hlbiBzaG93aW5nIG9yIGhpZGluZyB0aGUgc3VidGl0bGUgdHJhY2ssIG9yIHdoZW4gdGhlIHZpZGVvCi0gICAgICogc3VyZmFjZSBwb3NpdGlvbiBoYXMgY2hhbmdlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhlIHdpZGdldCB0aGF0IHJlbmRlcnMgdGhpcyBzdWJ0aXRsZSB0cmFjay4gRm9yIG1vc3QgcmVuZGVyZXJzCi0gICAgICogICAgICAgICB0aGVyZSBzaG91bGQgYmUgYSBzaW5nbGUgc2hhcmVkIGluc3RhbmNlIHRoYXQgaXMgdXNlZCBmb3IgYWxsCi0gICAgICogICAgICAgICB0cmFja3Mgc3VwcG9ydGVkIGJ5IHRoYXQgcmVuZGVyZXIsIGFzIGF0IG1vc3Qgb25lIHN1YnRpdGxlIHRyYWNrCi0gICAgICogICAgICAgICBpcyB2aXNpYmxlIGF0IG9uZSB0aW1lLgotICAgICAqLwotICAgIHB1YmxpYyBhYnN0cmFjdCBSZW5kZXJpbmdXaWRnZXQgZ2V0UmVuZGVyaW5nV2lkZ2V0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgYWN0aXZlIGN1ZXMgaGF2ZSBjaGFuZ2VkLCBhbmQgdGhlIGNvbnRlbnRzIG9mIHRoZSBzdWJ0aXRsZQotICAgICAqIHZpZXcgc2hvdWxkIGJlIHVwZGF0ZWQuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHZvaWQgdXBkYXRlVmlldyhWZWN0b3I8Q3VlPiBhY3RpdmVDdWVzKTsKLQotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgdm9pZCB1cGRhdGVBY3RpdmVDdWVzKGJvb2xlYW4gcmVidWlsZCwgbG9uZyB0aW1lTXMpIHsKLSAgICAgICAgLy8gb3V0LW9mLW9yZGVyIHRpbWVzIG1lYW4gc2Vla2luZyBvciBuZXcgYWN0aXZlIGN1ZXMgYmVpbmcgYWRkZWQKLSAgICAgICAgLy8gKGR1cmluZyB0aGVpciBvd24gdGltZXNwYW4pCi0gICAgICAgIGlmIChyZWJ1aWxkIHx8IG1MYXN0VXBkYXRlVGltZU1zID4gdGltZU1zKSB7Ci0gICAgICAgICAgICBjbGVhckFjdGl2ZUN1ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvcihJdGVyYXRvcjxQYWlyPExvbmcsIEN1ZT4gPiBpdCA9Ci0gICAgICAgICAgICAgICAgbUN1ZXMuZW50cmllc0JldHdlZW4obUxhc3RVcGRhdGVUaW1lTXMsIHRpbWVNcykuaXRlcmF0b3IoKTsgaXQuaGFzTmV4dCgpOyApIHsKLSAgICAgICAgICAgIFBhaXI8TG9uZywgQ3VlPiBldmVudCA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgIEN1ZSBjdWUgPSBldmVudC5zZWNvbmQ7Ci0KLSAgICAgICAgICAgIGlmIChjdWUubUVuZFRpbWVNcyA9PSBldmVudC5maXJzdCkgewotICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBwYXN0IGN1ZXMKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIlJlbW92aW5nICIgKyBjdWUpOwotICAgICAgICAgICAgICAgIG1BY3RpdmVDdWVzLnJlbW92ZShjdWUpOwotICAgICAgICAgICAgICAgIGlmIChjdWUubVJ1bklEID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChjdWUubVN0YXJ0VGltZU1zID09IGV2ZW50LmZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgLy8gYWRkIG5ldyBjdWVzCi0gICAgICAgICAgICAgICAgLy8gVFJJQ0tZOiB0aGlzIHdpbGwgaGFwcGVuIGluIHN0YXJ0IG9yZGVyCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJBZGRpbmcgIiArIGN1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1ZS5tSW5uZXJUaW1lc01zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VlLm9uVGltZSh0aW1lTXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQWN0aXZlQ3Vlcy5hZGQoY3VlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY3VlLm1Jbm5lclRpbWVzTXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIGN1ZSBpcyBtb2RpZmllZAotICAgICAgICAgICAgICAgIGN1ZS5vblRpbWUodGltZU1zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIGNvbXBsZXRlIGFueSBydW5zICovCi0gICAgICAgIHdoaWxlIChtUnVuc0J5RW5kVGltZS5zaXplKCkgPiAwICYmCi0gICAgICAgICAgICAgICBtUnVuc0J5RW5kVGltZS5rZXlBdCgwKSA8PSB0aW1lTXMpIHsKLSAgICAgICAgICAgIHJlbW92ZVJ1bnNCeUVuZFRpbWVJbmRleCgwKTsgLy8gcmVtb3ZlcyBlbGVtZW50Ci0gICAgICAgIH0KLSAgICAgICAgbUxhc3RVcGRhdGVUaW1lTXMgPSB0aW1lTXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlbW92ZVJ1bnNCeUVuZFRpbWVJbmRleChpbnQgaXgpIHsKLSAgICAgICAgUnVuIHJ1biA9IG1SdW5zQnlFbmRUaW1lLnZhbHVlQXQoaXgpOwotICAgICAgICB3aGlsZSAocnVuICE9IG51bGwpIHsKLSAgICAgICAgICAgIEN1ZSBjdWUgPSBydW4ubUZpcnN0Q3VlOwotICAgICAgICAgICAgd2hpbGUgKGN1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUN1ZXMucmVtb3ZlKGN1ZSk7Ci0gICAgICAgICAgICAgICAgQ3VlIG5leHRDdWUgPSBjdWUubU5leHRJblJ1bjsKLSAgICAgICAgICAgICAgICBjdWUubU5leHRJblJ1biA9IG51bGw7Ci0gICAgICAgICAgICAgICAgY3VlID0gbmV4dEN1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1SdW5zQnlJRC5yZW1vdmUocnVuLm1SdW5JRCk7Ci0gICAgICAgICAgICBSdW4gbmV4dFJ1biA9IHJ1bi5tTmV4dFJ1bkF0RW5kVGltZU1zOwotICAgICAgICAgICAgcnVuLm1QcmV2UnVuQXRFbmRUaW1lTXMgPSBudWxsOwotICAgICAgICAgICAgcnVuLm1OZXh0UnVuQXRFbmRUaW1lTXMgPSBudWxsOwotICAgICAgICAgICAgcnVuID0gbmV4dFJ1bjsKLSAgICAgICAgfQotICAgICAgICBtUnVuc0J5RW5kVGltZS5yZW1vdmVBdChpeCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZmluYWxpemUoKSB0aHJvd3MgVGhyb3dhYmxlIHsKLSAgICAgICAgLyogcmVtb3ZlIGFsbCBjdWVzICh1bnRhbmdsZSBhbGwgY3Jvc3MtbGlua3MpICovCi0gICAgICAgIGludCBzaXplID0gbVJ1bnNCeUVuZFRpbWUuc2l6ZSgpOwotICAgICAgICBmb3IoaW50IGl4ID0gc2l6ZSAtIDE7IGl4ID49IDA7IGl4LS0pIHsKLSAgICAgICAgICAgIHJlbW92ZVJ1bnNCeUVuZFRpbWVJbmRleChpeCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdXBlci5maW5hbGl6ZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3luY2hyb25pemVkIHZvaWQgdGFrZVRpbWUobG9uZyB0aW1lTXMpIHsKLSAgICAgICAgbUxhc3RUaW1lTXMgPSB0aW1lTXM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIGNsZWFyQWN0aXZlQ3VlcygpIHsKLSAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJDbGVhcmluZyAiICsgbUFjdGl2ZUN1ZXMuc2l6ZSgpICsgIiBhY3RpdmUgY3VlcyIpOwotICAgICAgICBtQWN0aXZlQ3Vlcy5jbGVhcigpOwotICAgICAgICBtTGFzdFVwZGF0ZVRpbWVNcyA9IC0xOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIHNjaGVkdWxlVGltZWRFdmVudHMoKSB7Ci0gICAgICAgIC8qIGdldCB0aW1lcyBmb3IgdGhlIG5leHQgZXZlbnQgKi8KLSAgICAgICAgaWYgKG1UaW1lUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbU5leHRTY2hlZHVsZWRUaW1lTXMgPSBtQ3Vlcy5uZXh0VGltZUFmdGVyKG1MYXN0VGltZU1zKTsKLSAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAic2NoZWQgQCIgKyBtTmV4dFNjaGVkdWxlZFRpbWVNcyArICIgYWZ0ZXIgIiArIG1MYXN0VGltZU1zKTsKLSAgICAgICAgICAgIG1UaW1lUHJvdmlkZXIubm90aWZ5QXQoCi0gICAgICAgICAgICAgICAgICAgIG1OZXh0U2NoZWR1bGVkVGltZU1zID49IDAgPwotICAgICAgICAgICAgICAgICAgICAgICAgKG1OZXh0U2NoZWR1bGVkVGltZU1zICogMTAwMCkgOiBNZWRpYVRpbWVQcm92aWRlci5OT19USU1FLAotICAgICAgICAgICAgICAgICAgICB0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uVGltZWRFdmVudChsb25nIHRpbWVVcykgewotICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIm9uVGltZWRFdmVudCAiICsgdGltZVVzKTsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICBsb25nIHRpbWVNcyA9IHRpbWVVcyAvIDEwMDA7Ci0gICAgICAgICAgICB1cGRhdGVBY3RpdmVDdWVzKGZhbHNlLCB0aW1lTXMpOwotICAgICAgICAgICAgdGFrZVRpbWUodGltZU1zKTsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVWaWV3KG1BY3RpdmVDdWVzKTsKLSAgICAgICAgc2NoZWR1bGVUaW1lZEV2ZW50cygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU2Vlayhsb25nIHRpbWVVcykgewotICAgICAgICBpZiAoREVCVUcpIExvZy5kKFRBRywgIm9uU2VlayAiICsgdGltZVVzKTsKLSAgICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgICAgICBsb25nIHRpbWVNcyA9IHRpbWVVcyAvIDEwMDA7Ci0gICAgICAgICAgICB1cGRhdGVBY3RpdmVDdWVzKHRydWUsIHRpbWVNcyk7Ci0gICAgICAgICAgICB0YWtlVGltZSh0aW1lTXMpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVZpZXcobUFjdGl2ZUN1ZXMpOwotICAgICAgICBzY2hlZHVsZVRpbWVkRXZlbnRzKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdG9wKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAib25TdG9wIik7Ci0gICAgICAgICAgICBjbGVhckFjdGl2ZUN1ZXMoKTsKLSAgICAgICAgICAgIG1MYXN0VGltZU1zID0gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlVmlldyhtQWN0aXZlQ3Vlcyk7Ci0gICAgICAgIG1OZXh0U2NoZWR1bGVkVGltZU1zID0gLTE7Ci0gICAgICAgIG1UaW1lUHJvdmlkZXIubm90aWZ5QXQoTWVkaWFUaW1lUHJvdmlkZXIuTk9fVElNRSwgdGhpcyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE1lZGlhVGltZVByb3ZpZGVyIG1UaW1lUHJvdmlkZXI7Ci0KLSAgICBwdWJsaWMgdm9pZCBzaG93KCkgewotICAgICAgICBpZiAobVZpc2libGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1WaXNpYmxlID0gdHJ1ZTsKLSAgICAgICAgUmVuZGVyaW5nV2lkZ2V0IHJlbmRlcmluZ1dpZGdldCA9IGdldFJlbmRlcmluZ1dpZGdldCgpOwotICAgICAgICBpZiAocmVuZGVyaW5nV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlbmRlcmluZ1dpZGdldC5zZXRWaXNpYmxlKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtVGltZVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UaW1lUHJvdmlkZXIuc2NoZWR1bGVVcGRhdGUodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBoaWRlKCkgewotICAgICAgICBpZiAoIW1WaXNpYmxlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVRpbWVQcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVGltZVByb3ZpZGVyLmNhbmNlbE5vdGlmaWNhdGlvbnModGhpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgUmVuZGVyaW5nV2lkZ2V0IHJlbmRlcmluZ1dpZGdldCA9IGdldFJlbmRlcmluZ1dpZGdldCgpOwotICAgICAgICBpZiAocmVuZGVyaW5nV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlbmRlcmluZ1dpZGdldC5zZXRWaXNpYmxlKGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBtVmlzaWJsZSA9IGZhbHNlOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBzeW5jaHJvbml6ZWQgYm9vbGVhbiBhZGRDdWUoQ3VlIGN1ZSkgewotICAgICAgICBtQ3Vlcy5hZGQoY3VlKTsKLQotICAgICAgICBpZiAoY3VlLm1SdW5JRCAhPSAwKSB7Ci0gICAgICAgICAgICBSdW4gcnVuID0gbVJ1bnNCeUlELmdldChjdWUubVJ1bklEKTsKLSAgICAgICAgICAgIGlmIChydW4gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJ1biA9IG5ldyBSdW4oKTsKLSAgICAgICAgICAgICAgICBtUnVuc0J5SUQucHV0KGN1ZS5tUnVuSUQsIHJ1bik7Ci0gICAgICAgICAgICAgICAgcnVuLm1FbmRUaW1lTXMgPSBjdWUubUVuZFRpbWVNczsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocnVuLm1FbmRUaW1lTXMgPCBjdWUubUVuZFRpbWVNcykgewotICAgICAgICAgICAgICAgIHJ1bi5tRW5kVGltZU1zID0gY3VlLm1FbmRUaW1lTXM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGxpbmstdXAgY3VlcyBpbiB0aGUgc2FtZSBydW4KLSAgICAgICAgICAgIGN1ZS5tTmV4dEluUnVuID0gcnVuLm1GaXJzdEN1ZTsKLSAgICAgICAgICAgIHJ1bi5tRmlyc3RDdWUgPSBjdWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpZiBhIGN1ZSBpcyBhZGRlZCB0aGF0IHNob3VsZCBiZSB2aXNpYmxlLCBuZWVkIHRvIHJlZnJlc2ggdmlldwotICAgICAgICBsb25nIG5vd01zID0gLTE7Ci0gICAgICAgIGlmIChtVGltZVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbm93TXMgPSBtVGltZVByb3ZpZGVyLmdldEN1cnJlbnRUaW1lVXMoCi0gICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBwcmVjaXNlICovLCB0cnVlIC8qIG1vbm90b25pYyAqLykgLyAxMDAwOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBoYW5kbGUgYXMgaXQgd2UgYXJlIG5vdCBwbGF5aW5nCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIm1WaXNpYmxlPSIgKyBtVmlzaWJsZSArICIsICIgKwotICAgICAgICAgICAgICAgIGN1ZS5tU3RhcnRUaW1lTXMgKyAiIDw9ICIgKyBub3dNcyArICIsICIgKwotICAgICAgICAgICAgICAgIGN1ZS5tRW5kVGltZU1zICsgIiA+PSAiICsgbUxhc3RUaW1lTXMpOwotCi0gICAgICAgIGlmIChtVmlzaWJsZSAmJgotICAgICAgICAgICAgICAgIGN1ZS5tU3RhcnRUaW1lTXMgPD0gbm93TXMgJiYKLSAgICAgICAgICAgICAgICAvLyB3ZSBkb24ndCB0cnVzdCBub3dNcywgc28gY2hlY2sgYW55IGN1ZSBzaW5jZSBsYXN0IGNhbGxiYWNrCi0gICAgICAgICAgICAgICAgY3VlLm1FbmRUaW1lTXMgPj0gbUxhc3RUaW1lTXMpIHsKLSAgICAgICAgICAgIGlmIChtUnVubmFibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtUnVubmFibGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgU3VidGl0bGVUcmFjayB0cmFjayA9IHRoaXM7Ci0gICAgICAgICAgICBmaW5hbCBsb25nIHRoZW5NcyA9IG5vd01zOwotICAgICAgICAgICAgbVJ1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiB3aXRoIHN5bmNocm9uaXplZCwgaXQgaXMgcG9zc2libGUgdGhhdCB3ZSBhcmUgZ29pbmcKLSAgICAgICAgICAgICAgICAgICAgLy8gdG8gZG8gbXVsdGlwbGUgdXBkYXRlcyBhcyB0aGUgcnVubmFibGUgY291bGQgYmUgYWxyZWFkeQotICAgICAgICAgICAgICAgICAgICAvLyBydW5uaW5nLgotICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKHRyYWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUnVubmFibGUgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQWN0aXZlQ3Vlcyh0cnVlLCB0aGVuTXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlVmlldyhtQWN0aXZlQ3Vlcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgLy8gZGVsYXkgdXBkYXRlIHNvIHdlIGRvbid0IHVwZGF0ZSB2aWV3IG9uIGV2ZXJ5IGN1ZS4gIFRPRE8gd2h5IDEwPwotICAgICAgICAgICAgaWYgKG1IYW5kbGVyLnBvc3REZWxheWVkKG1SdW5uYWJsZSwgMTAgLyogZGVsYXkgKi8pKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsICJzY2hlZHVsaW5nIHVwZGF0ZSIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy53KFRBRywgImZhaWxlZCB0byBzY2hlZHVsZSBzdWJ0aXRsZSB2aWV3IHVwZGF0ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVZpc2libGUgJiYKLSAgICAgICAgICAgICAgICBjdWUubUVuZFRpbWVNcyA+PSBtTGFzdFRpbWVNcyAmJgotICAgICAgICAgICAgICAgIChjdWUubVN0YXJ0VGltZU1zIDwgbU5leHRTY2hlZHVsZWRUaW1lTXMgfHwKLSAgICAgICAgICAgICAgICAgbU5leHRTY2hlZHVsZWRUaW1lTXMgPCAwKSkgewotICAgICAgICAgICAgc2NoZWR1bGVUaW1lZEV2ZW50cygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBzZXRUaW1lUHJvdmlkZXIoTWVkaWFUaW1lUHJvdmlkZXIgdGltZVByb3ZpZGVyKSB7Ci0gICAgICAgIGlmIChtVGltZVByb3ZpZGVyID09IHRpbWVQcm92aWRlcikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtVGltZVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UaW1lUHJvdmlkZXIuY2FuY2VsTm90aWZpY2F0aW9ucyh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBtVGltZVByb3ZpZGVyID0gdGltZVByb3ZpZGVyOwotICAgICAgICBpZiAobVRpbWVQcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVGltZVByb3ZpZGVyLnNjaGVkdWxlVXBkYXRlKHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBzdGF0aWMgY2xhc3MgQ3VlTGlzdCB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiQ3VlTGlzdCI7Ci0gICAgICAgIC8vIHNpbXBsaXN0aWMsIGluZWZmaWNpZW50IGltcGxlbWVudGF0aW9uCi0gICAgICAgIHByaXZhdGUgU29ydGVkTWFwPExvbmcsIFZlY3RvcjxDdWU+ID4gbUN1ZXM7Ci0gICAgICAgIHB1YmxpYyBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGFkZEV2ZW50KEN1ZSBjdWUsIGxvbmcgdGltZU1zKSB7Ci0gICAgICAgICAgICBWZWN0b3I8Q3VlPiBjdWVzID0gbUN1ZXMuZ2V0KHRpbWVNcyk7Ci0gICAgICAgICAgICBpZiAoY3VlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY3VlcyA9IG5ldyBWZWN0b3I8Q3VlPigyKTsKLSAgICAgICAgICAgICAgICBtQ3Vlcy5wdXQodGltZU1zLCBjdWVzKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY3Vlcy5jb250YWlucyhjdWUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gZG8gbm90IGR1cGxpY2F0ZSBjdWVzCi0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjdWVzLmFkZChjdWUpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcmVtb3ZlRXZlbnQoQ3VlIGN1ZSwgbG9uZyB0aW1lTXMpIHsKLSAgICAgICAgICAgIFZlY3RvcjxDdWU+IGN1ZXMgPSBtQ3Vlcy5nZXQodGltZU1zKTsKLSAgICAgICAgICAgIGlmIChjdWVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjdWVzLnJlbW92ZShjdWUpOwotICAgICAgICAgICAgICAgIGlmIChjdWVzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DdWVzLnJlbW92ZSh0aW1lTXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZChDdWUgY3VlKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUgbm9uLXBvc2l0aXZlLWR1cmF0aW9uIGN1ZXMKLSAgICAgICAgICAgIGlmIChjdWUubVN0YXJ0VGltZU1zID49IGN1ZS5tRW5kVGltZU1zKQotICAgICAgICAgICAgICAgIHJldHVybjsKLQotICAgICAgICAgICAgaWYgKCFhZGRFdmVudChjdWUsIGN1ZS5tU3RhcnRUaW1lTXMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBsb25nIGxhc3RUaW1lTXMgPSBjdWUubVN0YXJ0VGltZU1zOwotICAgICAgICAgICAgaWYgKGN1ZS5tSW5uZXJUaW1lc01zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGxvbmcgdGltZU1zOiBjdWUubUlubmVyVGltZXNNcykgewotICAgICAgICAgICAgICAgICAgICBpZiAodGltZU1zID4gbGFzdFRpbWVNcyAmJiB0aW1lTXMgPCBjdWUubUVuZFRpbWVNcykgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkRXZlbnQoY3VlLCB0aW1lTXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFRpbWVNcyA9IHRpbWVNczsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYWRkRXZlbnQoY3VlLCBjdWUubUVuZFRpbWVNcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoQ3VlIGN1ZSkgewotICAgICAgICAgICAgcmVtb3ZlRXZlbnQoY3VlLCBjdWUubVN0YXJ0VGltZU1zKTsKLSAgICAgICAgICAgIGlmIChjdWUubUlubmVyVGltZXNNcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChsb25nIHRpbWVNczogY3VlLm1Jbm5lclRpbWVzTXMpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRXZlbnQoY3VlLCB0aW1lTXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlbW92ZUV2ZW50KGN1ZSwgY3VlLm1FbmRUaW1lTXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEl0ZXJhYmxlPFBhaXI8TG9uZywgQ3VlPj4gZW50cmllc0JldHdlZW4oCi0gICAgICAgICAgICAgICAgZmluYWwgbG9uZyBsYXN0VGltZU1zLCBmaW5hbCBsb25nIHRpbWVNcykgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBJdGVyYWJsZTxQYWlyPExvbmcsIEN1ZT4gPigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgSXRlcmF0b3I8UGFpcjxMb25nLCBDdWU+ID4gaXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAic2xpY2UgKCIgKyBsYXN0VGltZU1zICsgIiwgIiArIHRpbWVNcyArICJdPSIpOwotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnRyeUl0ZXJhdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3Vlcy5zdWJNYXAobGFzdFRpbWVNcyArIDEsIHRpbWVNcyArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBFbnRyeUl0ZXJhdG9yKG51bGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBsb25nIG5leHRUaW1lQWZ0ZXIobG9uZyB0aW1lTXMpIHsKLSAgICAgICAgICAgIFNvcnRlZE1hcDxMb25nLCBWZWN0b3I8Q3VlPj4gdGFpbCA9IG51bGw7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIHRhaWwgPSBtQ3Vlcy50YWlsTWFwKHRpbWVNcyArIDEpOwotICAgICAgICAgICAgICAgIGlmICh0YWlsICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhaWwuZmlyc3RLZXkoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgIH0gY2F0Y2goTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY2xhc3MgRW50cnlJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yPFBhaXI8TG9uZywgQ3VlPiA+IHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gIW1Eb25lOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBQYWlyPExvbmcsIEN1ZT4gbmV4dCgpIHsKLSAgICAgICAgICAgICAgICBpZiAobURvbmUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtTGFzdEVudHJ5ID0gbmV3IFBhaXI8TG9uZywgQ3VlPigKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50VGltZU1zLCBtTGlzdEl0ZXJhdG9yLm5leHQoKSk7Ci0gICAgICAgICAgICAgICAgbUxhc3RMaXN0SXRlcmF0b3IgPSBtTGlzdEl0ZXJhdG9yOwotICAgICAgICAgICAgICAgIGlmICghbUxpc3RJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbmV4dEtleSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbUxhc3RFbnRyeTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICAgICAgLy8gb25seSBhbGxvdyByZW1vdmluZyBlbmQgdGFncwotICAgICAgICAgICAgICAgIGlmIChtTGFzdExpc3RJdGVyYXRvciA9PSBudWxsIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGFzdEVudHJ5LnNlY29uZC5tRW5kVGltZU1zICE9IG1MYXN0RW50cnkuZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiIik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGVuZC1jdWUKLSAgICAgICAgICAgICAgICBtTGFzdExpc3RJdGVyYXRvci5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICBtTGFzdExpc3RJdGVyYXRvciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKG1DdWVzLmdldChtTGFzdEVudHJ5LmZpcnN0KS5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtQ3Vlcy5yZW1vdmUobUxhc3RFbnRyeS5maXJzdCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHJlc3Qgb2YgdGhlIGN1ZXMKLSAgICAgICAgICAgICAgICBDdWUgY3VlID0gbUxhc3RFbnRyeS5zZWNvbmQ7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlRXZlbnQoY3VlLCBjdWUubVN0YXJ0VGltZU1zKTsKLSAgICAgICAgICAgICAgICBpZiAoY3VlLm1Jbm5lclRpbWVzTXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGxvbmcgdGltZU1zOiBjdWUubUlubmVyVGltZXNNcykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlRXZlbnQoY3VlLCB0aW1lTXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgRW50cnlJdGVyYXRvcihTb3J0ZWRNYXA8TG9uZywgVmVjdG9yPEN1ZT4gPiBjdWVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cudihUQUcsIGN1ZXMgKyAiIik7Ci0gICAgICAgICAgICAgICAgbVJlbWFpbmluZ0N1ZXMgPSBjdWVzOwotICAgICAgICAgICAgICAgIG1MYXN0TGlzdEl0ZXJhdG9yID0gbnVsbDsKLSAgICAgICAgICAgICAgICBuZXh0S2V5KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCBuZXh0S2V5KCkgewotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUmVtYWluaW5nQ3VlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oIiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUaW1lTXMgPSBtUmVtYWluaW5nQ3Vlcy5maXJzdEtleSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUxpc3RJdGVyYXRvciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0N1ZXMuZ2V0KG1DdXJyZW50VGltZU1zKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVtYWluaW5nQ3VlcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZW1haW5pbmdDdWVzLnRhaWxNYXAobUN1cnJlbnRUaW1lTXMgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0N1ZXMgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbURvbmUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoRWxlbWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRG9uZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUmVtYWluaW5nQ3VlcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGlzdEl0ZXJhdG9yID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gd2hpbGUgKCFtTGlzdEl0ZXJhdG9yLmhhc05leHQoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgbG9uZyBtQ3VycmVudFRpbWVNczsKLSAgICAgICAgICAgIHByaXZhdGUgSXRlcmF0b3I8Q3VlPiBtTGlzdEl0ZXJhdG9yOwotICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Eb25lOwotICAgICAgICAgICAgcHJpdmF0ZSBTb3J0ZWRNYXA8TG9uZywgVmVjdG9yPEN1ZT4gPiBtUmVtYWluaW5nQ3VlczsKLSAgICAgICAgICAgIHByaXZhdGUgSXRlcmF0b3I8Q3VlPiBtTGFzdExpc3RJdGVyYXRvcjsKLSAgICAgICAgICAgIHByaXZhdGUgUGFpcjxMb25nLEN1ZT4gbUxhc3RFbnRyeTsKLSAgICAgICAgfQotCi0gICAgICAgIEN1ZUxpc3QoKSB7Ci0gICAgICAgICAgICBtQ3VlcyA9IG5ldyBUcmVlTWFwPExvbmcsIFZlY3RvcjxDdWU+PigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDdWUgewotICAgICAgICBwdWJsaWMgbG9uZyBtU3RhcnRUaW1lTXM7Ci0gICAgICAgIHB1YmxpYyBsb25nIG1FbmRUaW1lTXM7Ci0gICAgICAgIHB1YmxpYyBsb25nW10gbUlubmVyVGltZXNNczsKLSAgICAgICAgcHVibGljIGxvbmcgbVJ1bklEOwotCi0gICAgICAgIHB1YmxpYyBDdWUgbU5leHRJblJ1bjsKLQotICAgICAgICBwdWJsaWMgdm9pZCBvblRpbWUobG9uZyB0aW1lTXMpIHsgfQotICAgIH0KLQotICAgIC8qKiB1cGRhdGUgbVJ1bnNCeUVuZFRpbWUgKHdpdGggZGVmYXVsdCBlbmQgdGltZSkgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5pc2hlZFJ1bihsb25nIHJ1bklEKSB7Ci0gICAgICAgIGlmIChydW5JRCAhPSAwICYmIHJ1bklEICE9IH4wKSB7Ci0gICAgICAgICAgICBSdW4gcnVuID0gbVJ1bnNCeUlELmdldChydW5JRCk7Ci0gICAgICAgICAgICBpZiAocnVuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBydW4uc3RvcmVCeUVuZFRpbWVNcyhtUnVuc0J5RW5kVGltZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogdXBkYXRlIG1SdW5zQnlFbmRUaW1lIHdpdGggZ2l2ZW4gZW5kIHRpbWUgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSdW5EaXNjYXJkVGltZU1zKGxvbmcgcnVuSUQsIGxvbmcgdGltZU1zKSB7Ci0gICAgICAgIGlmIChydW5JRCAhPSAwICYmIHJ1bklEICE9IH4wKSB7Ci0gICAgICAgICAgICBSdW4gcnVuID0gbVJ1bnNCeUlELmdldChydW5JRCk7Ci0gICAgICAgICAgICBpZiAocnVuICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBydW4ubUVuZFRpbWVNcyA9IHRpbWVNczsKLSAgICAgICAgICAgICAgICBydW4uc3RvcmVCeUVuZFRpbWVNcyhtUnVuc0J5RW5kVGltZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogd2hldGhlciB0aGlzIGlzIGEgdGV4dCB0cmFjayB3aG8gZmlyZXMgZXZlbnRzIGluc3RlYWQgZ2V0dGluZyByZW5kZXJlZCAqLwotICAgIHB1YmxpYyBpbnQgZ2V0VHJhY2tUeXBlKCkgewotICAgICAgICByZXR1cm4gZ2V0UmVuZGVyaW5nV2lkZ2V0KCkgPT0gbnVsbAotICAgICAgICAgICAgICAgID8gVHJhY2tJbmZvLk1FRElBX1RSQUNLX1RZUEVfVElNRURURVhUCi0gICAgICAgICAgICAgICAgOiBUcmFja0luZm8uTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFJ1biB7Ci0gICAgICAgIHB1YmxpYyBDdWUgbUZpcnN0Q3VlOwotICAgICAgICBwdWJsaWMgUnVuIG1OZXh0UnVuQXRFbmRUaW1lTXM7Ci0gICAgICAgIHB1YmxpYyBSdW4gbVByZXZSdW5BdEVuZFRpbWVNczsKLSAgICAgICAgcHVibGljIGxvbmcgbUVuZFRpbWVNcyA9IC0xOwotICAgICAgICBwdWJsaWMgbG9uZyBtUnVuSUQgPSAwOwotICAgICAgICBwcml2YXRlIGxvbmcgbVN0b3JlZEVuZFRpbWVNcyA9IC0xOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0b3JlQnlFbmRUaW1lTXMoTG9uZ1NwYXJzZUFycmF5PFJ1bj4gcnVuc0J5RW5kVGltZSkgewotICAgICAgICAgICAgLy8gcmVtb3ZlIG9sZCB2YWx1ZSBpZiBhbnkKLSAgICAgICAgICAgIGludCBpeCA9IHJ1bnNCeUVuZFRpbWUuaW5kZXhPZktleShtU3RvcmVkRW5kVGltZU1zKTsKLSAgICAgICAgICAgIGlmIChpeCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1QcmV2UnVuQXRFbmRUaW1lTXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBhc3NlcnQodGhpcyA9PSBydW5zQnlFbmRUaW1lLnZhbHVlQXQoaXgpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1OZXh0UnVuQXRFbmRUaW1lTXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcnVuc0J5RW5kVGltZS5yZW1vdmVBdChpeCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBydW5zQnlFbmRUaW1lLnNldFZhbHVlQXQoaXgsIG1OZXh0UnVuQXRFbmRUaW1lTXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlbW92ZUF0RW5kVGltZU1zKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGFkZCBuZXcgdmFsdWUKLSAgICAgICAgICAgIGlmIChtRW5kVGltZU1zID49IDApIHsKLSAgICAgICAgICAgICAgICBtUHJldlJ1bkF0RW5kVGltZU1zID0gbnVsbDsKLSAgICAgICAgICAgICAgICBtTmV4dFJ1bkF0RW5kVGltZU1zID0gcnVuc0J5RW5kVGltZS5nZXQobUVuZFRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgaWYgKG1OZXh0UnVuQXRFbmRUaW1lTXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtTmV4dFJ1bkF0RW5kVGltZU1zLm1QcmV2UnVuQXRFbmRUaW1lTXMgPSB0aGlzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBydW5zQnlFbmRUaW1lLnB1dChtRW5kVGltZU1zLCB0aGlzKTsKLSAgICAgICAgICAgICAgICBtU3RvcmVkRW5kVGltZU1zID0gbUVuZFRpbWVNczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZUF0RW5kVGltZU1zKCkgewotICAgICAgICAgICAgUnVuIHByZXYgPSBtUHJldlJ1bkF0RW5kVGltZU1zOwotCi0gICAgICAgICAgICBpZiAobVByZXZSdW5BdEVuZFRpbWVNcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVByZXZSdW5BdEVuZFRpbWVNcy5tTmV4dFJ1bkF0RW5kVGltZU1zID0gbU5leHRSdW5BdEVuZFRpbWVNczsKLSAgICAgICAgICAgICAgICBtUHJldlJ1bkF0RW5kVGltZU1zID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtTmV4dFJ1bkF0RW5kVGltZU1zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtTmV4dFJ1bkF0RW5kVGltZU1zLm1QcmV2UnVuQXRFbmRUaW1lTXMgPSBwcmV2OwotICAgICAgICAgICAgICAgIG1OZXh0UnVuQXRFbmRUaW1lTXMgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW50ZXJmYWNlIGZvciByZW5kZXJpbmcgc3VidGl0bGVzIG9udG8gYSBDYW52YXMuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBSZW5kZXJpbmdXaWRnZXQgewotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgd2lkZ2V0J3MgY2FsbGJhY2ssIHdoaWNoIGlzIHVzZWQgdG8gc2VuZCB1cGRhdGVzIHdoZW4gdGhlCi0gICAgICAgICAqIHJlbmRlcmVkIGRhdGEgaGFzIGNoYW5nZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayB1cGRhdGUgY2FsbGJhY2sKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE9uQ2hhbmdlZExpc3RlbmVyKE9uQ2hhbmdlZExpc3RlbmVyIGNhbGxiYWNrKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgd2lkZ2V0J3Mgc2l6ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHdpZHRoIHdpZHRoIGluIHBpeGVscwotICAgICAgICAgKiBAcGFyYW0gaGVpZ2h0IGhlaWdodCBpbiBwaXhlbHMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFNpemUoaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB3aGV0aGVyIHRoZSB3aWRnZXQgc2hvdWxkIGRyYXcgc3VidGl0bGVzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gdmlzaWJsZSB0cnVlIGlmIHN1YnRpdGxlcyBzaG91bGQgYmUgZHJhd24sIGZhbHNlIG90aGVyd2lzZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZW5kZXJzIHN1YnRpdGxlcyBvbnRvIGEge0BsaW5rIENhbnZhc30uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjIGNhbnZhcyBvbiB3aGljaCB0byByZW5kZXIgc3VidGl0bGVzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBkcmF3KENhbnZhcyBjKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHdpZGdldCBpcyBhdHRhY2hlZCB0byBhIHdpbmRvdy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgd2lkZ2V0IGlzIGRldGFjaGVkIGZyb20gYSB3aW5kb3cuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsYmFjayB1c2VkIHRvIHNlbmQgdXBkYXRlcyBhYm91dCBjaGFuZ2VzIHRvIHJlbmRlcmluZyBkYXRhLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludGVyZmFjZSBPbkNoYW5nZWRMaXN0ZW5lciB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSByZW5kZXJpbmcgZGF0YSBoYXMgY2hhbmdlZC4KLSAgICAgICAgICAgICAqCi0gICAgICAgICAgICAgKiBAcGFyYW0gcmVuZGVyaW5nV2lkZ2V0IHRoZSB3aWRnZXQgd2hvc2UgZGF0YSBoYXMgY2hhbmdlZAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZWQoUmVuZGVyaW5nV2lkZ2V0IHJlbmRlcmluZ1dpZGdldCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3VwZGF0ZS9BcGlGYWN0b3J5LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3VwZGF0ZS9BcGlGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YmU1NDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS91cGRhdGUvQXBpRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLk5vdGlmaWNhdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQXBwbGljYXRpb25JbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFCcm93c2VyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQnJvd3NlcjIuQnJvd3NlckNhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjIuQ29udHJvbGxlckNhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTIuTGlicmFyeVJvb3Q7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5NZWRpYUxpYnJhcnlTZXNzaW9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTIuTWVkaWFMaWJyYXJ5U2Vzc2lvbi5NZWRpYUxpYnJhcnlTZXNzaW9uQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZEdyb3VwMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29udHJvbGxlckluZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLlNlc3Npb25DYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTIuTWVkaWFOb3RpZmljYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5SYXRpbmcyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUJyb3dzZXIyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFDb250cm9sVmlldzJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUNvbnRyb2xsZXIyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFJdGVtMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhTGlicmFyeVNlcnZpY2UyUHJvdmlkZXIuTGlicmFyeVJvb3RQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYU1ldGFkYXRhMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhUGxheWxpc3RBZ2VudFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhU2Vzc2lvbjJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVNlc3Npb24yUHJvdmlkZXIuQnVpbGRlckJhc2VQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVNlc3Npb24yUHJvdmlkZXIuQ29tbWFuZEJ1dHRvblByb3ZpZGVyLkJ1aWxkZXJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVNlc3Npb25TZXJ2aWNlMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhU2Vzc2lvblNlcnZpY2UyUHJvdmlkZXIuTWVkaWFOb3RpZmljYXRpb25Qcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5TZXNzaW9uVG9rZW4yUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuU3RhdGljUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVmlkZW9WaWV3MlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZpZXdHcm91cFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZvbHVtZVByb3ZpZGVyMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuSUludGVyZmFjZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbFZpZXcyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlZpZGVvVmlldzI7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5JTWVkaWFDb250cm9sbGVyMjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUJyb3dzZXIySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0ySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsLkxpYnJhcnlSb290SW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50SW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24ySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuUmF0aW5nMkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC53aWRnZXQuTWVkaWFDb250cm9sVmlldzJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcySW1wbDsKLQotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQXBpRmFjdG9yeSBpbXBsZW1lbnRzIFN0YXRpY1Byb3ZpZGVyIHsKLSAgICBwcml2YXRlIEFwaUZhY3RvcnkoKSB7IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgU3RhdGljUHJvdmlkZXIgaW5pdGlhbGl6ZShBcHBsaWNhdGlvbkluZm8gdXBkYXRhYmxlSW5mbykgewotICAgICAgICBBcGlIZWxwZXIuaW5pdGlhbGl6ZSh1cGRhdGFibGVJbmZvKTsKLSAgICAgICAgcmV0dXJuIG5ldyBBcGlGYWN0b3J5KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhQ29udHJvbGxlcjJQcm92aWRlciBjcmVhdGVNZWRpYUNvbnRyb2xsZXIyKAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBNZWRpYUNvbnRyb2xsZXIyIGluc3RhbmNlLCBTZXNzaW9uVG9rZW4yIHRva2VuLAotICAgICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IsIENvbnRyb2xsZXJDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhQ29udHJvbGxlcjJJbXBsKGNvbnRleHQsIGluc3RhbmNlLCB0b2tlbiwgZXhlY3V0b3IsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFCcm93c2VyMlByb3ZpZGVyIGNyZWF0ZU1lZGlhQnJvd3NlcjIoQ29udGV4dCBjb250ZXh0LCBNZWRpYUJyb3dzZXIyIGluc3RhbmNlLAotICAgICAgICAgICAgU2Vzc2lvblRva2VuMiB0b2tlbiwgRXhlY3V0b3IgZXhlY3V0b3IsIEJyb3dzZXJDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhQnJvd3NlcjJJbXBsKGNvbnRleHQsIGluc3RhbmNlLCB0b2tlbiwgZXhlY3V0b3IsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uMlByb3ZpZGVyLkNvbW1hbmRQcm92aWRlciBjcmVhdGVNZWRpYVNlc3Npb24yQ29tbWFuZCgKLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kMiBpbnN0YW5jZSwgaW50IGNvbW1hbmRDb2RlLCBTdHJpbmcgYWN0aW9uLCBCdW5kbGUgZXh0cmEpIHsKLSAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsICYmIGV4dHJhID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEltcGwoaW5zdGFuY2UsIGNvbW1hbmRDb2RlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRJbXBsKGluc3RhbmNlLCBhY3Rpb24sIGV4dHJhKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2Vzc2lvbkNvbW1hbmQyIGZyb21CdW5kbGVfTWVkaWFTZXNzaW9uMkNvbW1hbmQoQnVuZGxlIGNvbW1hbmQpIHsKLSAgICAgICAgcmV0dXJuIE1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRJbXBsLmZyb21CdW5kbGVfaW1wbChjb21tYW5kKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uMlByb3ZpZGVyLkNvbW1hbmRHcm91cFByb3ZpZGVyIGNyZWF0ZU1lZGlhU2Vzc2lvbjJDb21tYW5kR3JvdXAoCi0gICAgICAgICAgICBTZXNzaW9uQ29tbWFuZEdyb3VwMiBpbnN0YW5jZSwgU2Vzc2lvbkNvbW1hbmRHcm91cDIgb3RoZXIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kR3JvdXBJbXBsKGluc3RhbmNlLAotICAgICAgICAgICAgICAgIChvdGhlciA9PSBudWxsKSA/IG51bGwgOiBvdGhlci5nZXRQcm92aWRlcigpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2Vzc2lvbkNvbW1hbmRHcm91cDIgZnJvbUJ1bmRsZV9NZWRpYVNlc3Npb24yQ29tbWFuZEdyb3VwKEJ1bmRsZSBjb21tYW5kcykgewotICAgICAgICByZXR1cm4gTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEdyb3VwSW1wbC5mcm9tQnVuZGxlX2ltcGwoY29tbWFuZHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYVNlc3Npb24yUHJvdmlkZXIuQ29udHJvbGxlckluZm9Qcm92aWRlciBjcmVhdGVNZWRpYVNlc3Npb24yQ29udHJvbGxlckluZm8oCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIENvbnRyb2xsZXJJbmZvIGluc3RhbmNlLCBpbnQgdWlkLCBpbnQgcGlkLCBTdHJpbmcgcGFja2FnZU5hbWUsCi0gICAgICAgICAgICBJSW50ZXJmYWNlIGNhbGxiYWNrKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uMkltcGwuQ29udHJvbGxlckluZm9JbXBsKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgaW5zdGFuY2UsIHVpZCwgcGlkLCBwYWNrYWdlTmFtZSwgKElNZWRpYUNvbnRyb2xsZXIyKSBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJQcm92aWRlciBjcmVhdGVNZWRpYVNlc3Npb24yQ29tbWFuZEJ1dHRvbkJ1aWxkZXIoCi0gICAgICAgICAgICBNZWRpYVNlc3Npb24yLkNvbW1hbmRCdXR0b24uQnVpbGRlciBpbnN0YW5jZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRCdXR0b25JbXBsLkJ1aWxkZXJJbXBsKGluc3RhbmNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQnVpbGRlckJhc2VQcm92aWRlcjxNZWRpYVNlc3Npb24yLCBTZXNzaW9uQ2FsbGJhY2s+IGNyZWF0ZU1lZGlhU2Vzc2lvbjJCdWlsZGVyKAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBNZWRpYVNlc3Npb24yLkJ1aWxkZXIgaW5zdGFuY2UpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24ySW1wbC5CdWlsZGVySW1wbChjb250ZXh0LCBpbnN0YW5jZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvblNlcnZpY2UyUHJvdmlkZXIgY3JlYXRlTWVkaWFTZXNzaW9uU2VydmljZTIoTWVkaWFTZXNzaW9uU2VydmljZTIgaW5zdGFuY2UpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwoaW5zdGFuY2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYU5vdGlmaWNhdGlvblByb3ZpZGVyIGNyZWF0ZU1lZGlhU2Vzc2lvblNlcnZpY2UyTWVkaWFOb3RpZmljYXRpb24oCi0gICAgICAgICAgICBNZWRpYU5vdGlmaWNhdGlvbiBpbnN0YW5jZSwgaW50IG5vdGlmaWNhdGlvbklkLCBOb3RpZmljYXRpb24gbm90aWZpY2F0aW9uKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uU2VydmljZTJJbXBsLk1lZGlhTm90aWZpY2F0aW9uSW1wbCgKLSAgICAgICAgICAgICAgICBpbnN0YW5jZSwgbm90aWZpY2F0aW9uSWQsIG5vdGlmaWNhdGlvbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvblNlcnZpY2UyUHJvdmlkZXIgY3JlYXRlTWVkaWFMaWJyYXJ5U2VydmljZTIoTWVkaWFMaWJyYXJ5U2VydmljZTIgaW5zdGFuY2UpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwoaW5zdGFuY2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyQmFzZVByb3ZpZGVyPE1lZGlhTGlicmFyeVNlc3Npb24sIE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjaz4KLSAgICAgICAgY3JlYXRlTWVkaWFMaWJyYXJ5U2VydmljZTJCdWlsZGVyKE1lZGlhTGlicmFyeVNlcnZpY2UyIHNlcnZpY2UsCi0gICAgICAgICAgICBNZWRpYUxpYnJhcnlTZXNzaW9uLkJ1aWxkZXIgaW5zdGFuY2UsIEV4ZWN1dG9yIGNhbGxiYWNrRXhlY3V0b3IsCi0gICAgICAgICAgICBNZWRpYUxpYnJhcnlTZXNzaW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwuQnVpbGRlckltcGwoc2VydmljZSwgaW5zdGFuY2UsIGNhbGxiYWNrRXhlY3V0b3IsCi0gICAgICAgICAgICAgICAgY2FsbGJhY2spOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMaWJyYXJ5Um9vdFByb3ZpZGVyIGNyZWF0ZU1lZGlhTGlicmFyeVNlcnZpY2UyTGlicmFyeVJvb3QoCi0gICAgICAgICAgICBMaWJyYXJ5Um9vdCBpbnN0YW5jZSwgU3RyaW5nIHJvb3RJZCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICByZXR1cm4gbmV3IExpYnJhcnlSb290SW1wbChpbnN0YW5jZSwgcm9vdElkLCBleHRyYXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUNvbnRyb2xWaWV3MlByb3ZpZGVyIGNyZWF0ZU1lZGlhQ29udHJvbFZpZXcyKE1lZGlhQ29udHJvbFZpZXcyIGluc3RhbmNlLAotICAgICAgICAgICAgVmlld0dyb3VwUHJvdmlkZXIgc3VwZXJQcm92aWRlciwgVmlld0dyb3VwUHJvdmlkZXIgcHJpdmF0ZVByb3ZpZGVyLAotICAgICAgICAgICAgQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFDb250cm9sVmlldzJJbXBsKGluc3RhbmNlLCBzdXBlclByb3ZpZGVyLCBwcml2YXRlUHJvdmlkZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWaWRlb1ZpZXcyUHJvdmlkZXIgY3JlYXRlVmlkZW9WaWV3MigKLSAgICAgICAgICAgIFZpZGVvVmlldzIgaW5zdGFuY2UsIFZpZXdHcm91cFByb3ZpZGVyIHN1cGVyUHJvdmlkZXIsIFZpZXdHcm91cFByb3ZpZGVyIHByaXZhdGVQcm92aWRlciwKLSAgICAgICAgICAgIEBOdWxsYWJsZSBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICByZXR1cm4gbmV3IFZpZGVvVmlldzJJbXBsKGluc3RhbmNlLCBzdXBlclByb3ZpZGVyLCBwcml2YXRlUHJvdmlkZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4yUHJvdmlkZXIgY3JlYXRlU2Vzc2lvblRva2VuMihDb250ZXh0IGNvbnRleHQsIFNlc3Npb25Ub2tlbjIgaW5zdGFuY2UsCi0gICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBzZXJ2aWNlTmFtZSwgaW50IHVpZCkgewotICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25Ub2tlbjJJbXBsKGNvbnRleHQsIGluc3RhbmNlLCBwYWNrYWdlTmFtZSwgc2VydmljZU5hbWUsIHVpZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNlc3Npb25Ub2tlbjIgZnJvbUJ1bmRsZV9TZXNzaW9uVG9rZW4yKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIFNlc3Npb25Ub2tlbjJJbXBsLmZyb21CdW5kbGVfaW1wbChidW5kbGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUl0ZW0yUHJvdmlkZXIuQnVpbGRlclByb3ZpZGVyIGNyZWF0ZU1lZGlhSXRlbTJCdWlsZGVyKE1lZGlhSXRlbTIuQnVpbGRlciBpbnN0YW5jZSwKLSAgICAgICAgICAgIGludCBmbGFncykgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhSXRlbTJJbXBsLkJ1aWxkZXJJbXBsKGluc3RhbmNlLCBmbGFncyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhSXRlbTIgZnJvbUJ1bmRsZV9NZWRpYUl0ZW0yKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIE1lZGlhSXRlbTJJbXBsLmZyb21CdW5kbGVfaW1wbChidW5kbGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWb2x1bWVQcm92aWRlcjJQcm92aWRlciBjcmVhdGVWb2x1bWVQcm92aWRlcjIoVm9sdW1lUHJvdmlkZXIyIGluc3RhbmNlLCBpbnQgY29udHJvbFR5cGUsCi0gICAgICAgICAgICBpbnQgbWF4Vm9sdW1lLCBpbnQgY3VycmVudFZvbHVtZSkgewotICAgICAgICByZXR1cm4gbmV3IFZvbHVtZVByb3ZpZGVyMkltcGwoaW5zdGFuY2UsIGNvbnRyb2xUeXBlLCBtYXhWb2x1bWUsIGN1cnJlbnRWb2x1bWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMiBmcm9tQnVuZGxlX01lZGlhTWV0YWRhdGEyKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIE1lZGlhTWV0YWRhdGEySW1wbC5mcm9tQnVuZGxlX2ltcGwoYnVuZGxlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTJQcm92aWRlci5CdWlsZGVyUHJvdmlkZXIgY3JlYXRlTWVkaWFNZXRhZGF0YTJCdWlsZGVyKAotICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIuQnVpbGRlciBpbnN0YW5jZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhTWV0YWRhdGEySW1wbC5CdWlsZGVySW1wbChpbnN0YW5jZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhTWV0YWRhdGEyUHJvdmlkZXIuQnVpbGRlclByb3ZpZGVyIGNyZWF0ZU1lZGlhTWV0YWRhdGEyQnVpbGRlcigKLSAgICAgICAgICAgIE1lZGlhTWV0YWRhdGEyLkJ1aWxkZXIgaW5zdGFuY2UsIE1lZGlhTWV0YWRhdGEyIHNvdXJjZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhTWV0YWRhdGEySW1wbC5CdWlsZGVySW1wbChpbnN0YW5jZSwgc291cmNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmF0aW5nMiBmcm9tQnVuZGxlX1JhdGluZzIoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwuZnJvbUJ1bmRsZV9pbXBsKGJ1bmRsZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJhdGluZzIgbmV3VW5yYXRlZFJhdGluZ19SYXRpbmcyKGludCByYXRpbmdTdHlsZSkgewotICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwubmV3VW5yYXRlZFJhdGluZ19pbXBsKHJhdGluZ1N0eWxlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmF0aW5nMiBuZXdIZWFydFJhdGluZ19SYXRpbmcyKGJvb2xlYW4gaGFzSGVhcnQpIHsKLSAgICAgICAgcmV0dXJuIFJhdGluZzJJbXBsLm5ld0hlYXJ0UmF0aW5nX2ltcGwoaGFzSGVhcnQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSYXRpbmcyIG5ld1RodW1iUmF0aW5nX1JhdGluZzIoYm9vbGVhbiB0aHVtYklzVXApIHsKLSAgICAgICAgcmV0dXJuIFJhdGluZzJJbXBsLm5ld1RodW1iUmF0aW5nX2ltcGwodGh1bWJJc1VwKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmF0aW5nMiBuZXdTdGFyUmF0aW5nX1JhdGluZzIoaW50IHN0YXJSYXRpbmdTdHlsZSwgZmxvYXQgc3RhclJhdGluZykgewotICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwubmV3U3RhclJhdGluZ19pbXBsKHN0YXJSYXRpbmdTdHlsZSwgc3RhclJhdGluZyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJhdGluZzIgbmV3UGVyY2VudGFnZVJhdGluZ19SYXRpbmcyKGZsb2F0IHBlcmNlbnQpIHsKLSAgICAgICAgcmV0dXJuIFJhdGluZzJJbXBsLm5ld1BlcmNlbnRhZ2VSYXRpbmdfaW1wbChwZXJjZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFQbGF5bGlzdEFnZW50UHJvdmlkZXIgY3JlYXRlTWVkaWFQbGF5bGlzdEFnZW50KE1lZGlhUGxheWxpc3RBZ2VudCBpbnN0YW5jZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhUGxheWxpc3RBZ2VudEltcGwoaW5zdGFuY2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvdXBkYXRlL0FwaUhlbHBlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS91cGRhdGUvQXBpSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkOGJiNDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS91cGRhdGUvQXBpSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGU7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHRXcmFwcGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlcy5UaGVtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlhtbFJlc291cmNlUGFyc2VyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLkd1YXJkZWRCeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQud2lkZ2V0LlNwYWNlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52Ny53aWRnZXQuQnV0dG9uQmFyTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkxheW91dEluZmxhdGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5NZWRpYVJvdXRlQnV0dG9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk1lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5NZWRpYVJvdXRlVm9sdW1lU2xpZGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk92ZXJsYXlMaXN0VmlldzsKLQotcHVibGljIGZpbmFsIGNsYXNzIEFwaUhlbHBlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgQXBwbGljYXRpb25JbmZvIHNVcGRhdGFibGVJbmZvOwotCi0gICAgQEd1YXJkZWRCeSgidGhpcyIpCi0gICAgcHJpdmF0ZSBzdGF0aWMgVGhlbWUgc0xpYlRoZW1lOwotCi0gICAgcHJpdmF0ZSBBcGlIZWxwZXIoKSB7IH0KLQotICAgIHN0YXRpYyB2b2lkIGluaXRpYWxpemUoQXBwbGljYXRpb25JbmZvIHVwZGF0YWJsZUluZm8pIHsKLSAgICAgICAgaWYgKHNVcGRhdGFibGVJbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImluaXRpYWxpemUgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2UiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNVcGRhdGFibGVJbmZvID0gdXBkYXRhYmxlSW5mbzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJlc291cmNlcyBnZXRMaWJSZXNvdXJjZXMoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBnZXRMaWJUaGVtZShjb250ZXh0KS5nZXRSZXNvdXJjZXMoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRoZW1lIGdldExpYlRoZW1lKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBpZiAoc0xpYlRoZW1lICE9IG51bGwpIHJldHVybiBzTGliVGhlbWU7Ci0KLSAgICAgICAgcmV0dXJuIGdldExpYlRoZW1lU3luY2hyb25pemVkKGNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGhlbWUgZ2V0TGliVGhlbWUoQ29udGV4dCBjb250ZXh0LCBpbnQgdGhlbWVJZCkgewotICAgICAgICBUaGVtZSB0aGVtZSA9IGdldExpYlJlc291cmNlcyhjb250ZXh0KS5uZXdUaGVtZSgpOwotICAgICAgICB0aGVtZS5hcHBseVN0eWxlKHRoZW1lSWQsIHRydWUpOwotICAgICAgICByZXR1cm4gdGhlbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYXlvdXRJbmZsYXRlciBnZXRMYXlvdXRJbmZsYXRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGdldExheW91dEluZmxhdGVyKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgTGF5b3V0SW5mbGF0ZXIgZ2V0TGF5b3V0SW5mbGF0ZXIoQ29udGV4dCBjb250ZXh0LCBUaGVtZSB0aGVtZSkgewotICAgICAgICBpZiAodGhlbWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhlbWUgPSBnZXRMaWJUaGVtZShjb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE8gKGIvNzI5NzU5NzYpOiBBdm9pZCB0byB1c2UgQ29udGV4dFRoZW1lV3JhcHBlciB3aXRoIGFwcCBjb250ZXh0IGFuZCBsaWIgdGhlbWUuCi0gICAgICAgIExheW91dEluZmxhdGVyIGxheW91dEluZmxhdGVyID0gTGF5b3V0SW5mbGF0ZXIuZnJvbShjb250ZXh0KS5jbG9uZUluQ29udGV4dCgKLSAgICAgICAgICAgICAgICBuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihjb250ZXh0LCB0aGVtZSkpOwotICAgICAgICBsYXlvdXRJbmZsYXRlci5zZXRGYWN0b3J5MihuZXcgTGF5b3V0SW5mbGF0ZXIuRmFjdG9yeTIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlVmlldygKLSAgICAgICAgICAgICAgICAgICAgVmlldyBwYXJlbnQsIFN0cmluZyBuYW1lLCBDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICAgICAgICAgIGlmIChNZWRpYVJvdXRlQnV0dG9uLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlQnV0dG9uKGNvbnRleHQsIGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKE1lZGlhUm91dGVWb2x1bWVTbGlkZXIuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVWb2x1bWVTbGlkZXIoY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uLmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24oY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoT3ZlcmxheUxpc3RWaWV3LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBPdmVybGF5TGlzdFZpZXcoY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoQnV0dG9uQmFyTGF5b3V0LmNsYXNzLmdldENhbm9uaWNhbE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBCdXR0b25CYXJMYXlvdXQoY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoU3BhY2UuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNwYWNlKGNvbnRleHQsIGF0dHJzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KFN0cmluZyBuYW1lLCBDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICAgICAgICAgIHJldHVybiBvbkNyZWF0ZVZpZXcobnVsbCwgbmFtZSwgY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIGxheW91dEluZmxhdGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVmlldyBpbmZsYXRlTGliTGF5b3V0KENvbnRleHQgY29udGV4dCwgaW50IGxpYlJlc0lkKSB7Ci0gICAgICAgIHJldHVybiBpbmZsYXRlTGliTGF5b3V0KGNvbnRleHQsIGdldExpYlRoZW1lKGNvbnRleHQpLCBsaWJSZXNJZCwgbnVsbCwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVmlldyBpbmZsYXRlTGliTGF5b3V0KENvbnRleHQgY29udGV4dCwgVGhlbWUgdGhlbWUsIGludCBsaWJSZXNJZCkgewotICAgICAgICByZXR1cm4gaW5mbGF0ZUxpYkxheW91dChjb250ZXh0LCB0aGVtZSwgbGliUmVzSWQsIG51bGwsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFZpZXcgaW5mbGF0ZUxpYkxheW91dChDb250ZXh0IGNvbnRleHQsIFRoZW1lIHRoZW1lLCBpbnQgbGliUmVzSWQsCi0gICAgICAgICAgICBATnVsbGFibGUgVmlld0dyb3VwIHJvb3QsIGJvb2xlYW4gYXR0YWNoVG9Sb290KSB7Ci0gICAgICAgIHRyeSAoWG1sUmVzb3VyY2VQYXJzZXIgcGFyc2VyID0gZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLmdldExheW91dChsaWJSZXNJZCkpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRMYXlvdXRJbmZsYXRlcihjb250ZXh0LCB0aGVtZSkuaW5mbGF0ZShwYXJzZXIsIHJvb3QsIGF0dGFjaFRvUm9vdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBzeW5jaHJvbml6ZWQgVGhlbWUgZ2V0TGliVGhlbWVTeW5jaHJvbml6ZWQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChzTGliVGhlbWUgIT0gbnVsbCkgcmV0dXJuIHNMaWJUaGVtZTsKLQotICAgICAgICBpZiAoc1VwZGF0YWJsZUluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW5pdGlhbGl6ZSBoYXNuJ3QgYmVlbiBjYWxsZWQgeWV0Iik7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIHNMaWJUaGVtZSA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0UmVzb3VyY2VzRm9yQXBwbGljYXRpb24oc1VwZGF0YWJsZUluZm8pLm5ld1RoZW1lKCk7Ci0gICAgICAgIH0gY2F0Y2ggKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcGkyNC9tZWRpYS9NZWRpYVJvdXRlckFwaTI0LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBpMjQvbWVkaWEvTWVkaWFSb3V0ZXJBcGkyNC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTQ2YWY2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcGkyNC9tZWRpYS9NZWRpYVJvdXRlckFwaTI0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLS8vIEBAUmVxdWlyZXNBcGkoMjQpCi1maW5hbCBjbGFzcyBNZWRpYVJvdXRlckFwaTI0IHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlSW5mbyB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldERldmljZVR5cGUoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0RGV2aWNlVHlwZSgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzZThkNDcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC52aWV3LkFjdGlvblByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci0KLS8qKgotICogVGhlIG1lZGlhIHJvdXRlIGFjdGlvbiBwcm92aWRlciBkaXNwbGF5cyBhIHtAbGluayBNZWRpYVJvdXRlQnV0dG9uIG1lZGlhIHJvdXRlIGJ1dHRvbn0KLSAqIGluIHRoZSBhcHBsaWNhdGlvbidzIHtAbGluayBBY3Rpb25CYXJ9IHRvIGFsbG93IHRoZSB1c2VyIHRvIHNlbGVjdCByb3V0ZXMgYW5kCi0gKiB0byBjb250cm9sIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUuCi0gKiA8cD4KLSAqIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHNwZWNpZnkgdGhlIGtpbmRzIG9mIHJvdXRlcyB0aGF0IHRoZSB1c2VyIHNob3VsZCBiZSBhbGxvd2VkCi0gKiB0byBzZWxlY3QgYnkgc3BlY2lmeWluZyBhIHtAbGluayBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3J9IHdpdGggdGhlCi0gKiB7QGxpbmsgI3NldFJvdXRlU2VsZWN0b3J9IG1ldGhvZC4KLSAqIDwvcD48cD4KLSAqIFJlZmVyIHRvIHtAbGluayBNZWRpYVJvdXRlQnV0dG9ufSBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgYnV0dG9uIHRoYXQgd2lsbAotICogYXBwZWFyIGluIHRoZSBhY3Rpb24gYmFyIG1lbnUuICBOb3RlIHRoYXQgaW5zdGVhZCBvZiBkaXNhYmxpbmcgdGhlIGJ1dHRvbgotICogd2hlbiBubyByb3V0ZXMgYXJlIGF2YWlsYWJsZSwgdGhlIGFjdGlvbiBwcm92aWRlciB3aWxsIGluc3RlYWQgbWFrZSB0aGUKLSAqIG1lbnUgaXRlbSBpbnZpc2libGUuICBJbiB0aGlzIHdheSwgdGhlIGJ1dHRvbiB3aWxsIG9ubHkgYmUgdmlzaWJsZSB3aGVuIGl0Ci0gKiBpcyBwb3NzaWJsZSBmb3IgdGhlIHVzZXIgdG8gZGlzY292ZXIgYW5kIHNlbGVjdCBhIG1hdGNoaW5nIHJvdXRlLgotICogPC9wPgotICoKLSAqIDxoMz5QcmVyZXF1aXNpdGVzPC9oMz4KLSAqIDxwPgotICogVG8gdXNlIHRoZSBtZWRpYSByb3V0ZSBhY3Rpb24gcHJvdmlkZXIsIHRoZSBhY3Rpdml0eSBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YKLSAqIHtAbGluayBBcHBDb21wYXRBY3Rpdml0eX0gZnJvbSB0aGUgPGNvZGU+YW5kcm9pZC5zdXBwb3J0LnY3LmFwcGNvbXBhdDwvY29kZT4KLSAqIHN1cHBvcnQgbGlicmFyeS4gIFJlZmVyIHRvIHN1cHBvcnQgbGlicmFyeSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgotICogPC9wPgotICoKLSAqIDxoMz5FeGFtcGxlPC9oMz4KLSAqIDxwPgotICogPC9wPjxwPgotICogVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBkZWZpbmUgYSBtZW51IHJlc291cmNlIHRvIGluY2x1ZGUgdGhlIHByb3ZpZGVyIGluIHRoZQotICogYWN0aW9uIGJhciBvcHRpb25zIG1lbnUuICBOb3RlIHRoYXQgdGhlIHN1cHBvcnQgbGlicmFyeSBhY3Rpb24gYmFyIHVzZXMgYXR0cmlidXRlcwotICogdGhhdCBhcmUgZGVmaW5lZCBpbiB0aGUgYXBwbGljYXRpb24ncyByZXNvdXJjZSBuYW1lc3BhY2UgcmF0aGVyIHRoYW4gdGhlIGZyYW1ld29yaydzCi0gKiByZXNvdXJjZSBuYW1lc3BhY2UgdG8gY29uZmlndXJlIGVhY2ggaXRlbS4KLSAqIDwvcD48cHJlPgotICogJmx0O21lbnUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICogICAgICAgICB4bWxuczphcHA9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMtYXV0byI+Ci0gKiAgICAgJmx0O2l0ZW0gYW5kcm9pZDppZD0iQCtpZC9tZWRpYV9yb3V0ZV9tZW51X2l0ZW0iCi0gKiAgICAgICAgIGFuZHJvaWQ6dGl0bGU9IkBzdHJpbmcvbWVkaWFfcm91dGVfbWVudV90aXRsZSIKLSAqICAgICAgICAgYXBwOnNob3dBc0FjdGlvbj0iYWx3YXlzIgotICogICAgICAgICBhcHA6YWN0aW9uUHJvdmlkZXJDbGFzcz0iYW5kcm9pZC5zdXBwb3J0LnY3LmFwcC5NZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIiLz4KLSAqICZsdDsvbWVudT4KLSAqIDwvcHJlPjxwPgotICogVGhlbiBjb25maWd1cmUgdGhlIG1lbnUgYW5kIHNldCB0aGUgcm91dGUgc2VsZWN0b3IgZm9yIHRoZSBjaG9vc2VyLgotICogPC9wPjxwcmU+Ci0gKiBwdWJsaWMgY2xhc3MgTXlBY3Rpdml0eSBleHRlbmRzIEFwcENvbXBhdEFjdGl2aXR5IHsKLSAqICAgICBwcml2YXRlIE1lZGlhUm91dGVyIG1Sb3V0ZXI7Ci0gKiAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlci5DYWxsYmFjayBtQ2FsbGJhY2s7Ci0gKiAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVNlbGVjdG9yOwotICoKLSAqICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gKiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0gKgotICogICAgICAgICBtUm91dGVyID0gTWVkaWFyb3V0ZXIuZ2V0SW5zdGFuY2UodGhpcyk7Ci0gKiAgICAgICAgIG1TZWxlY3RvciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcigpCi0gKiAgICAgICAgICAgICAgICAgLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTykKLSAqICAgICAgICAgICAgICAgICAuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spCi0gKiAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gKiAgICAgICAgIG1DYWxsYmFjayA9IG5ldyBNeUNhbGxiYWNrKCk7Ci0gKiAgICAgfQotICoKLSAqICAgICAvLyBBZGQgdGhlIGNhbGxiYWNrIG9uIHN0YXJ0IHRvIHRlbGwgdGhlIG1lZGlhIHJvdXRlciB3aGF0IGtpbmRzIG9mIHJvdXRlcwotICogICAgIC8vIHRoZSBhcHBsaWNhdGlvbiBpcyBpbnRlcmVzdGVkIGluIHNvIHRoYXQgaXQgY2FuIHRyeSB0byBkaXNjb3ZlciBzdWl0YWJsZSBvbmVzLgotICogICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKSB7Ci0gKiAgICAgICAgIHN1cGVyLm9uU3RhcnQoKTsKLSAqCi0gKiAgICAgICAgIG1lZGlhUm91dGVyLmFkZENhbGxiYWNrKG1TZWxlY3RvciwgbUNhbGxiYWNrLAotICogICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlkpOwotICoKLSAqICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gbWVkaWFSb3V0ZXIudXBkYXRlU2VsZWN0ZWRSb3V0ZShtU2VsZWN0b3IpOwotICogICAgICAgICAvLyBkbyBzb21ldGhpbmcgd2l0aCB0aGUgcm91dGUuLi4KLSAqICAgICB9Ci0gKgotICogICAgIC8vIFJlbW92ZSB0aGUgc2VsZWN0b3Igb24gc3RvcCB0byB0ZWxsIHRoZSBtZWRpYSByb3V0ZXIgdGhhdCBpdCBubyBsb25nZXIKLSAqICAgICAvLyBuZWVkcyB0byBpbnZlc3QgZWZmb3J0IHRyeWluZyB0byBkaXNjb3ZlciByb3V0ZXMgb2YgdGhlc2Uga2luZHMgZm9yIG5vdy4KLSAqICAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7Ci0gKiAgICAgICAgIHN1cGVyLm9uU3RvcCgpOwotICoKLSAqICAgICAgICAgbWVkaWFSb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAqICAgICB9Ci0gKgotICogICAgIHB1YmxpYyBib29sZWFuIG9uQ3JlYXRlT3B0aW9uc01lbnUoTWVudSBtZW51KSB7Ci0gKiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlT3B0aW9uc01lbnUobWVudSk7Ci0gKgotICogICAgICAgICBnZXRNZW51SW5mbGF0ZXIoKS5pbmZsYXRlKFIubWVudS5zYW1wbGVfbWVkaWFfcm91dGVyX21lbnUsIG1lbnUpOwotICoKLSAqICAgICAgICAgTWVudUl0ZW0gbWVkaWFSb3V0ZU1lbnVJdGVtID0gbWVudS5maW5kSXRlbShSLmlkLm1lZGlhX3JvdXRlX21lbnVfaXRlbSk7Ci0gKiAgICAgICAgIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciBtZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIgPQotICogICAgICAgICAgICAgICAgIChNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIpTWVudUl0ZW1Db21wYXQuZ2V0QWN0aW9uUHJvdmlkZXIobWVkaWFSb3V0ZU1lbnVJdGVtKTsKLSAqICAgICAgICAgbWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyLnNldFJvdXRlU2VsZWN0b3IobVNlbGVjdG9yKTsKLSAqICAgICAgICAgcmV0dXJuIHRydWU7Ci0gKiAgICAgfQotICoKLSAqICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE15Q2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlci5DYWxsYmFjayB7Ci0gKiAgICAgICAgIC8vIEltcGxlbWVudCBjYWxsYmFjayBtZXRob2RzIGFzIG5lZWRlZC4KLSAqICAgICB9Ci0gKiB9Ci0gKiA8L3ByZT4KLSAqCi0gKiBAc2VlICNzZXRSb3V0ZVNlbGVjdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIgZXh0ZW5kcyBBY3Rpb25Qcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlciBtUm91dGVyOwotICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZXJDYWxsYmFjayBtQ2FsbGJhY2s7Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSBtRGlhbG9nRmFjdG9yeSA9IE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5LmdldERlZmF1bHQoKTsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVCdXR0b24gbUJ1dHRvbjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIGFjdGlvbiBwcm92aWRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQpOwotCi0gICAgICAgIG1Sb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShjb250ZXh0KTsKLSAgICAgICAgbUNhbGxiYWNrID0gbmV3IE1lZGlhUm91dGVyQ2FsbGJhY2sodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuCi0gICAgICogc2VsZWN0IHVzaW5nIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNlbGVjdG9yLCBuZXZlciBudWxsLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIE1lZGlhUm91dGVTZWxlY3RvciBnZXRSb3V0ZVNlbGVjdG9yKCkgewotICAgICAgICByZXR1cm4gbVNlbGVjdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbgotICAgICAqIHNlbGVjdCB1c2luZyB0aGUgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yLCBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoQE5vbk51bGwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW1TZWxlY3Rvci5lcXVhbHMoc2VsZWN0b3IpKSB7Ci0gICAgICAgICAgICAvLyBGSVhNRTogV2UgY3VycmVudGx5IGhhdmUgbm8gd2F5IG9mIGtub3dpbmcgd2hldGhlciB0aGUgYWN0aW9uIHByb3ZpZGVyCi0gICAgICAgICAgICAvLyBpcyBzdGlsbCBuZWVkZWQgYnkgdGhlIFVJLiAgVW5mb3J0dW5hdGVseSB0aGlzIG1lYW5zIHRoZSBhY3Rpb24gcHJvdmlkZXIKLSAgICAgICAgICAgIC8vIG1heSBsZWFrIGNhbGxiYWNrcyB1bnRpbCBnYXJiYWdlIGNvbGxlY3Rpb24gb2NjdXJzLiAgVGhpcyBtYXkgcmVzdWx0IGluCi0gICAgICAgICAgICAvLyBtZWRpYSByb3V0ZSBwcm92aWRlcnMgZG9pbmcgbW9yZSB3b3JrIHRoYW4gbmVjZXNzYXJ5IGluIHRoZSBzaG9ydCB0ZXJtCi0gICAgICAgICAgICAvLyB3aGlsZSB0cnlpbmcgdG8gZGlzY292ZXIgcm91dGVzIHRoYXQgYXJlIG5vIGxvbmdlciBvZiBpbnRlcmVzdCB0byB0aGUKLSAgICAgICAgICAgIC8vIGFwcGxpY2F0aW9uLiAgVG8gc29sdmUgdGhpcyBwcm9ibGVtLCB0aGUgYWN0aW9uIHByb3ZpZGVyIHdpbGwgbmVlZCBzb21lCi0gICAgICAgICAgICAvLyBpbmRpY2F0aW9uIGZyb20gdGhlIGZyYW1ld29yayB0aGF0IGl0IGlzIGJlaW5nIGRlc3Ryb3llZC4KLSAgICAgICAgICAgIGlmICghbVNlbGVjdG9yLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghc2VsZWN0b3IuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhzZWxlY3RvciwgbUNhbGxiYWNrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TZWxlY3RvciA9IHNlbGVjdG9yOwotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0KLSAgICAgICAgICAgIGlmIChtQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQnV0dG9uLnNldFJvdXRlU2VsZWN0b3Ioc2VsZWN0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnkgdG8gdXNlIHdoZW4gc2hvd2luZyB0aGUgcm91dGUgY2hvb3NlcgotICAgICAqIG9yIGNvbnRyb2xsZXIgZGlhbG9nLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZGlhbG9nIGZhY3RvcnksIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgZ2V0RGlhbG9nRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIG1EaWFsb2dGYWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIGRpYWxvZyBmYWN0b3J5IHRvIHVzZSB3aGVuIHNob3dpbmcgdGhlIHJvdXRlIGNob29zZXIKLSAgICAgKiBvciBjb250cm9sbGVyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmYWN0b3J5IFRoZSBkaWFsb2cgZmFjdG9yeSwgbXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREaWFsb2dGYWN0b3J5KEBOb25OdWxsIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgaWYgKGZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZmFjdG9yeSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobURpYWxvZ0ZhY3RvcnkgIT0gZmFjdG9yeSkgewotICAgICAgICAgICAgbURpYWxvZ0ZhY3RvcnkgPSBmYWN0b3J5OwotCi0gICAgICAgICAgICBpZiAobUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUJ1dHRvbi5zZXREaWFsb2dGYWN0b3J5KGZhY3RvcnkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgYXNzb2NpYXRlZCBtZWRpYSByb3V0ZSBidXR0b24sIG9yIG51bGwgaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbiBjcmVhdGVkLgotICAgICAqLwotICAgIEBOdWxsYWJsZQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQnV0dG9uIGdldE1lZGlhUm91dGVCdXR0b24oKSB7Ci0gICAgICAgIHJldHVybiBtQnV0dG9uOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBtZWRpYSByb3V0ZSBidXR0b24gaXMgYmVpbmcgY3JlYXRlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgdGhlIGJ1dHRvbi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVCdXR0b24gb25DcmVhdGVNZWRpYVJvdXRlQnV0dG9uKCkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVCdXR0b24oZ2V0Q29udGV4dCgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygiZGVwcmVjYXRpb24iKQotICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlQWN0aW9uVmlldygpIHsKLSAgICAgICAgaWYgKG1CdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAib25DcmVhdGVBY3Rpb25WaWV3OiB0aGlzIEFjdGlvblByb3ZpZGVyIGlzIGFscmVhZHkgYXNzb2NpYXRlZCAiICsKLSAgICAgICAgICAgICAgICAgICAgIndpdGggYSBtZW51IGl0ZW0uIERvbid0IHJldXNlIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciBpbnN0YW5jZXMhICIgKwotICAgICAgICAgICAgICAgICAgICAiQWJhbmRvbmluZyB0aGUgb2xkIG1lbnUgaXRlbS4uLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUJ1dHRvbiA9IG9uQ3JlYXRlTWVkaWFSb3V0ZUJ1dHRvbigpOwotICAgICAgICBtQnV0dG9uLnNldENoZWF0U2hlZXRFbmFibGVkKHRydWUpOwotICAgICAgICBtQnV0dG9uLnNldFJvdXRlU2VsZWN0b3IobVNlbGVjdG9yKTsKLSAgICAgICAgbUJ1dHRvbi5zZXREaWFsb2dGYWN0b3J5KG1EaWFsb2dGYWN0b3J5KTsKLSAgICAgICAgbUJ1dHRvbi5zZXRMYXlvdXRQYXJhbXMobmV3IFZpZXdHcm91cC5MYXlvdXRQYXJhbXMoCi0gICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsCi0gICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpKTsKLSAgICAgICAgcmV0dXJuIG1CdXR0b247Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25QZXJmb3JtRGVmYXVsdEFjdGlvbigpIHsKLSAgICAgICAgaWYgKG1CdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1CdXR0b24uc2hvd0RpYWxvZygpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvdmVycmlkZXNJdGVtVmlzaWJpbGl0eSgpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNWaXNpYmxlKCkgewotICAgICAgICByZXR1cm4gbVJvdXRlci5pc1JvdXRlQXZhaWxhYmxlKG1TZWxlY3RvciwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5BVkFJTEFCSUxJVFlfRkxBR19JR05PUkVfREVGQVVMVF9ST1VURSk7Ci0gICAgfQotCi0gICAgdm9pZCByZWZyZXNoUm91dGUoKSB7Ci0gICAgICAgIHJlZnJlc2hWaXNpYmlsaXR5KCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVyLkNhbGxiYWNrIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlcj4gbVByb3ZpZGVyV2VhazsKLQotICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZXJDYWxsYmFjayhNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIgcHJvdmlkZXIpIHsKLSAgICAgICAgICAgIG1Qcm92aWRlcldlYWsgPSBuZXcgV2Vha1JlZmVyZW5jZTxNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXI+KHByb3ZpZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQWRkZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKHJvdXRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVJlbW92ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKHJvdXRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKHJvdXRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckFkZGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUocm91dGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlByb3ZpZGVySW5mbyBwcm92aWRlcikgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKHJvdXRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Qcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZShyb3V0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHJlZnJlc2hSb3V0ZShNZWRpYVJvdXRlciByb3V0ZXIpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciBwcm92aWRlciA9IG1Qcm92aWRlcldlYWsuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHByb3ZpZGVyLnJlZnJlc2hSb3V0ZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByb3V0ZXIucmVtb3ZlQ2FsbGJhY2sodGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVCdXR0b24uamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUJ1dHRvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGU4YTYzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUJ1dHRvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eTsKLWltcG9ydCBhbmRyb2lkLmFwcC5GcmFnbWVudE1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHRXcmFwcGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29sb3JTdGF0ZUxpc3Q7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5UeXBlZEFycmF5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQW5pbWF0aW9uRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLm9zLkFzeW5jVGFzazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGVDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY3LndpZGdldC5Ub29sdGlwQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlNvdW5kRWZmZWN0Q29uc3RhbnRzOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVTZWxlY3RvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOwotCi0vKioKLSAqIFRoZSBtZWRpYSByb3V0ZSBidXR0b24gYWxsb3dzIHRoZSB1c2VyIHRvIHNlbGVjdCByb3V0ZXMgYW5kIHRvIGNvbnRyb2wgdGhlCi0gKiBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUuCi0gKiA8cD4KLSAqIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHNwZWNpZnkgdGhlIGtpbmRzIG9mIHJvdXRlcyB0aGF0IHRoZSB1c2VyIHNob3VsZCBiZSBhbGxvd2VkCi0gKiB0byBzZWxlY3QgYnkgc3BlY2lmeWluZyBhIHtAbGluayBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3J9IHdpdGggdGhlCi0gKiB7QGxpbmsgI3NldFJvdXRlU2VsZWN0b3J9IG1ldGhvZC4KLSAqIDwvcD48cD4KLSAqIFdoZW4gdGhlIGRlZmF1bHQgcm91dGUgaXMgc2VsZWN0ZWQgb3Igd2hlbiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlIGRvZXMgbm90Ci0gKiBtYXRjaCB0aGUge0BsaW5rICNnZXRSb3V0ZVNlbGVjdG9yKCkgc2VsZWN0b3J9LCB0aGUgYnV0dG9uIHdpbGwgYXBwZWFyIGluCi0gKiBhbiBpbmFjdGl2ZSBzdGF0ZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGlzIG5vdCBjb25uZWN0ZWQgdG8gYQotICogcm91dGUgb2YgdGhlIGtpbmQgdGhhdCBpdCB3YW50cyB0byB1c2UuICBDbGlja2luZyBvbiB0aGUgYnV0dG9uIG9wZW5zCi0gKiBhIHtAbGluayBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ30gdG8gYWxsb3cgdGhlIHVzZXIgdG8gc2VsZWN0IGEgcm91dGUuCi0gKiBJZiBubyBub24tZGVmYXVsdCByb3V0ZXMgbWF0Y2ggdGhlIHNlbGVjdG9yIGFuZCBpdCBpcyBub3QgcG9zc2libGUgZm9yIGFuIGFjdGl2ZQotICogc2NhbiB0byBkaXNjb3ZlciBhbnkgbWF0Y2hpbmcgcm91dGVzLCB0aGVuIHRoZSBidXR0b24gaXMgZGlzYWJsZWQgYW5kIGNhbm5vdAotICogYmUgY2xpY2tlZC4KLSAqIDwvcD48cD4KLSAqIFdoZW4gYSBub24tZGVmYXVsdCByb3V0ZSBpcyBzZWxlY3RlZCB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdG9yLCB0aGUgYnV0dG9uIHdpbGwKLSAqIGFwcGVhciBpbiBhbiBhY3RpdmUgc3RhdGUgaW5kaWNhdGluZyB0aGF0IHRoZSBhcHBsaWNhdGlvbiBpcyBjb25uZWN0ZWQKLSAqIHRvIGEgcm91dGUgb2YgdGhlIGtpbmQgdGhhdCBpdCB3YW50cyB0byB1c2UuICBUaGUgYnV0dG9uIG1heSBhbHNvIGFwcGVhcgotICogaW4gYW4gaW50ZXJtZWRpYXJ5IGNvbm5lY3Rpbmcgc3RhdGUgaWYgdGhlIHJvdXRlIGlzIGluIHRoZSBwcm9jZXNzIG9mIGNvbm5lY3RpbmcKLSAqIHRvIHRoZSBkZXN0aW5hdGlvbiBidXQgaGFzIG5vdCB5ZXQgY29tcGxldGVkIGRvaW5nIHNvLiAgSW4gZWl0aGVyIGNhc2UsIGNsaWNraW5nCi0gKiBvbiB0aGUgYnV0dG9uIG9wZW5zIGEge0BsaW5rIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nfSB0byBhbGxvdyB0aGUgdXNlcgotICogdG8gY29udHJvbCBvciBkaXNjb25uZWN0IGZyb20gdGhlIGN1cnJlbnQgcm91dGUuCi0gKiA8L3A+Ci0gKgotICogPGgzPlByZXJlcXVpc2l0ZXM8L2gzPgotICogPHA+Ci0gKiBUbyB1c2UgdGhlIG1lZGlhIHJvdXRlIGJ1dHRvbiwgdGhlIGFjdGl2aXR5IG11c3QgYmUgYSBzdWJjbGFzcyBvZgotICoge0BsaW5rIEZyYWdtZW50QWN0aXZpdHl9IGZyb20gdGhlIDxjb2RlPmFuZHJvaWQuc3VwcG9ydC52NDwvY29kZT4KLSAqIHN1cHBvcnQgbGlicmFyeS4gIFJlZmVyIHRvIHN1cHBvcnQgbGlicmFyeSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzLgotICogPC9wPgotICoKLSAqIEBzZWUgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyCi0gKiBAc2VlICNzZXRSb3V0ZVNlbGVjdG9yCi0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlQnV0dG9uIGV4dGVuZHMgVmlldyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlQnV0dG9uIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDSE9PU0VSX0ZSQUdNRU5UX1RBRyA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhcm91dGVyOk1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDT05UUk9MTEVSX0ZSQUdNRU5UX1RBRyA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhcm91dGVyOk1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlciBtUm91dGVyOwotICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZXJDYWxsYmFjayBtQ2FsbGJhY2s7Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7Ci0gICAgcHJpdmF0ZSBpbnQgbVJvdXRlQ2FsbGJhY2tGbGFnczsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IG1EaWFsb2dGYWN0b3J5ID0gTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkuZ2V0RGVmYXVsdCgpOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1BdHRhY2hlZFRvV2luZG93OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3BhcnNlQXJyYXk8RHJhd2FibGUuQ29uc3RhbnRTdGF0ZT4gc1JlbW90ZUluZGljYXRvckNhY2hlID0KLSAgICAgICAgICAgIG5ldyBTcGFyc2VBcnJheTw+KDIpOwotICAgIHByaXZhdGUgUmVtb3RlSW5kaWNhdG9yTG9hZGVyIG1SZW1vdGVJbmRpY2F0b3JMb2FkZXI7Ci0gICAgcHJpdmF0ZSBEcmF3YWJsZSBtUmVtb3RlSW5kaWNhdG9yOwotICAgIHByaXZhdGUgYm9vbGVhbiBtUmVtb3RlQWN0aXZlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNDb25uZWN0aW5nOwotCi0gICAgcHJpdmF0ZSBDb2xvclN0YXRlTGlzdCBtQnV0dG9uVGludDsKLSAgICBwcml2YXRlIGludCBtTWluV2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbU1pbkhlaWdodDsKLQotICAgIC8vIFRoZSBjaGVja2VkIHN0YXRlIGlzIHVzZWQgd2hlbiBjb25uZWN0ZWQgdG8gYSByZW1vdGUgcm91dGUuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gQ0hFQ0tFRF9TVEFURV9TRVQgPSB7Ci0gICAgICAgIGFuZHJvaWQuUi5hdHRyLnN0YXRlX2NoZWNrZWQKLSAgICB9OwotCi0gICAgLy8gVGhlIGNoZWNrYWJsZSBzdGF0ZSBpcyB1c2VkIHdoaWxlIGNvbm5lY3RpbmcgdG8gYSByZW1vdGUgcm91dGUuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50W10gQ0hFQ0tBQkxFX1NUQVRFX1NFVCA9IHsKLSAgICAgICAgYW5kcm9pZC5SLmF0dHIuc3RhdGVfY2hlY2thYmxlCi0gICAgfTsKLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQnV0dG9uKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQnV0dG9uKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIFIuYXR0ci5tZWRpYVJvdXRlQnV0dG9uU3R5bGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQnV0dG9uKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHN1cGVyKE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuY3JlYXRlVGhlbWVkQnV0dG9uQ29udGV4dChjb250ZXh0KSwgYXR0cnMsIGRlZlN0eWxlQXR0cik7Ci0gICAgICAgIGNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0KLSAgICAgICAgbVJvdXRlciA9IE1lZGlhUm91dGVyLmdldEluc3RhbmNlKGNvbnRleHQpOwotICAgICAgICBtQ2FsbGJhY2sgPSBuZXcgTWVkaWFSb3V0ZXJDYWxsYmFjaygpOwotCi0gICAgICAgIFJlc291cmNlcy5UaGVtZSB0aGVtZSA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkubmV3VGhlbWUoKTsKLSAgICAgICAgdGhlbWUuYXBwbHlTdHlsZShNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFJvdXRlclRoZW1lSWQoY29udGV4dCksIHRydWUpOwotICAgICAgICBUeXBlZEFycmF5IGEgPSB0aGVtZS5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKGF0dHJzLAotICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLk1lZGlhUm91dGVCdXR0b24sIGRlZlN0eWxlQXR0ciwgMCk7Ci0KLSAgICAgICAgbUJ1dHRvblRpbnQgPSBhLmdldENvbG9yU3RhdGVMaXN0KFIuc3R5bGVhYmxlLk1lZGlhUm91dGVCdXR0b25fbWVkaWFSb3V0ZUJ1dHRvblRpbnQpOwotICAgICAgICBtTWluV2lkdGggPSBhLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5NZWRpYVJvdXRlQnV0dG9uX2FuZHJvaWRfbWluV2lkdGgsIDApOwotICAgICAgICBtTWluSGVpZ2h0ID0gYS5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5zdHlsZWFibGUuTWVkaWFSb3V0ZUJ1dHRvbl9hbmRyb2lkX21pbkhlaWdodCwgMCk7Ci0gICAgICAgIGludCByZW1vdGVJbmRpY2F0b3JSZXNJZCA9IGEuZ2V0UmVzb3VyY2VJZCgKLSAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5NZWRpYVJvdXRlQnV0dG9uX2V4dGVybmFsUm91dGVFbmFibGVkRHJhd2FibGUsIDApOwotICAgICAgICBhLnJlY3ljbGUoKTsKLQotICAgICAgICBpZiAocmVtb3RlSW5kaWNhdG9yUmVzSWQgIT0gMCkgewotICAgICAgICAgICAgRHJhd2FibGUuQ29uc3RhbnRTdGF0ZSByZW1vdGVJbmRpY2F0b3JTdGF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIHNSZW1vdGVJbmRpY2F0b3JDYWNoZS5nZXQocmVtb3RlSW5kaWNhdG9yUmVzSWQpOwotICAgICAgICAgICAgaWYgKHJlbW90ZUluZGljYXRvclN0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzZXRSZW1vdGVJbmRpY2F0b3JEcmF3YWJsZShyZW1vdGVJbmRpY2F0b3JTdGF0ZS5uZXdEcmF3YWJsZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvckxvYWRlciA9IG5ldyBSZW1vdGVJbmRpY2F0b3JMb2FkZXIocmVtb3RlSW5kaWNhdG9yUmVzSWQpOwotICAgICAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3JMb2FkZXIuZXhlY3V0ZU9uRXhlY3V0b3IoQXN5bmNUYXNrLlRIUkVBRF9QT09MX0VYRUNVVE9SKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHVwZGF0ZUNvbnRlbnREZXNjcmlwdGlvbigpOwotICAgICAgICBzZXRDbGlja2FibGUodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuCi0gICAgICogc2VsZWN0IHVzaW5nIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNlbGVjdG9yLCBuZXZlciBudWxsLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIE1lZGlhUm91dGVTZWxlY3RvciBnZXRSb3V0ZVNlbGVjdG9yKCkgewotICAgICAgICByZXR1cm4gbVNlbGVjdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbgotICAgICAqIHNlbGVjdCB1c2luZyB0aGUgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIHNldFJvdXRlU2VsZWN0b3Ioc2VsZWN0b3IsIDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbgotICAgICAqIHNlbGVjdCB1c2luZyB0aGUgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yLgotICAgICAqIEBwYXJhbSBmbGFncyBGbGFncyB0byBjb250cm9sIHRoZSBiZWhhdmlvciBvZiB0aGUgY2FsbGJhY2suIE1heSBiZSB6ZXJvIG9yIGEgY29tYmluYXRpb24gb2YKLSAgICAgKiAgICAgICAgICAgICAge0BsaW5rICNNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU59IGFuZAotICAgICAqICAgICAgICAgICAgICB7QGxpbmsgI01lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFN9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yLCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgaWYgKG1TZWxlY3Rvci5lcXVhbHMoc2VsZWN0b3IpICYmIG1Sb3V0ZUNhbGxiYWNrRmxhZ3MgPT0gZmxhZ3MpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1TZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCB8fCBzZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG1TZWxlY3RvciA9IHNlbGVjdG9yOwotICAgICAgICBtUm91dGVDYWxsYmFja0ZsYWdzID0gZmxhZ3M7Ci0KLSAgICAgICAgaWYgKG1BdHRhY2hlZFRvV2luZG93KSB7Ci0gICAgICAgICAgICBtUm91dGVyLmFkZENhbGxiYWNrKHNlbGVjdG9yLCBtQ2FsbGJhY2ssIGZsYWdzKTsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnkgdG8gdXNlIHdoZW4gc2hvd2luZyB0aGUgcm91dGUgY2hvb3NlcgotICAgICAqIG9yIGNvbnRyb2xsZXIgZGlhbG9nLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZGlhbG9nIGZhY3RvcnksIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgZ2V0RGlhbG9nRmFjdG9yeSgpIHsKLSAgICAgICAgcmV0dXJuIG1EaWFsb2dGYWN0b3J5OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIGRpYWxvZyBmYWN0b3J5IHRvIHVzZSB3aGVuIHNob3dpbmcgdGhlIHJvdXRlIGNob29zZXIKLSAgICAgKiBvciBjb250cm9sbGVyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmYWN0b3J5IFRoZSBkaWFsb2cgZmFjdG9yeSwgbXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXREaWFsb2dGYWN0b3J5KEBOb25OdWxsIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IGZhY3RvcnkpIHsKLSAgICAgICAgaWYgKGZhY3RvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZmFjdG9yeSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBtRGlhbG9nRmFjdG9yeSA9IGZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2hvdyB0aGUgcm91dGUgY2hvb3NlciBvciBjb250cm9sbGVyIGRpYWxvZy4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgZGVmYXVsdCByb3V0ZSBpcyBzZWxlY3RlZCBvciBpZiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlIGRvZXMKLSAgICAgKiBub3QgbWF0Y2ggdGhlIHtAbGluayAjZ2V0Um91dGVTZWxlY3RvciBzZWxlY3Rvcn0sIHRoZW4gc2hvd3MgdGhlIHJvdXRlIGNob29zZXIgZGlhbG9nLgotICAgICAqIE90aGVyd2lzZSwgc2hvd3MgdGhlIHJvdXRlIGNvbnRyb2xsZXIgZGlhbG9nIHRvIG9mZmVyIHRoZSB1c2VyCi0gICAgICogYSBjaG9pY2UgdG8gZGlzY29ubmVjdCBmcm9tIHRoZSByb3V0ZSBvciBwZXJmb3JtIG90aGVyIGNvbnRyb2wgYWN0aW9ucwotICAgICAqIHN1Y2ggYXMgc2V0dGluZyB0aGUgcm91dGUncyB2b2x1bWUuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSBhcHBsaWNhdGlvbiBjYW4gY3VzdG9taXplIHRoZSBkaWFsb2dzIGJ5IGNhbGxpbmcge0BsaW5rICNzZXREaWFsb2dGYWN0b3J5fQotICAgICAqIHRvIHByb3ZpZGUgYSBjdXN0b21pemVkIGRpYWxvZyBmYWN0b3J5LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgZGlhbG9nIHdhcyBhY3R1YWxseSBzaG93bi4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBhY3Rpdml0eSBpcyBub3QgYSBzdWJjbGFzcyBvZgotICAgICAqIHtAbGluayBGcmFnbWVudEFjdGl2aXR5fS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzaG93RGlhbG9nKCkgewotICAgICAgICBpZiAoIW1BdHRhY2hlZFRvV2luZG93KSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBGcmFnbWVudE1hbmFnZXIgZm0gPSBnZXRBY3Rpdml0eSgpLmdldEZyYWdtZW50TWFuYWdlcigpOwotICAgICAgICBpZiAoZm0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlIGFjdGl2aXR5IG11c3QgYmUgYSBzdWJjbGFzcyBvZiBGcmFnbWVudEFjdGl2aXR5Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtUm91dGVyLmdldFNlbGVjdGVkUm91dGUoKTsKLSAgICAgICAgaWYgKHJvdXRlLmlzRGVmYXVsdE9yQmx1ZXRvb3RoKCkgfHwgIXJvdXRlLm1hdGNoZXNTZWxlY3RvcihtU2VsZWN0b3IpKSB7Ci0gICAgICAgICAgICBpZiAoZm0uZmluZEZyYWdtZW50QnlUYWcoQ0hPT1NFUl9GUkFHTUVOVF9UQUcpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzaG93RGlhbG9nKCk6IFJvdXRlIGNob29zZXIgZGlhbG9nIGFscmVhZHkgc2hvd2luZyEiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50IGYgPQotICAgICAgICAgICAgICAgICAgICBtRGlhbG9nRmFjdG9yeS5vbkNyZWF0ZUNob29zZXJEaWFsb2dGcmFnbWVudCgpOwotICAgICAgICAgICAgZi5zZXRSb3V0ZVNlbGVjdG9yKG1TZWxlY3Rvcik7Ci0gICAgICAgICAgICBmLnNob3coZm0sIENIT09TRVJfRlJBR01FTlRfVEFHKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChmbS5maW5kRnJhZ21lbnRCeVRhZyhDT05UUk9MTEVSX0ZSQUdNRU5UX1RBRykgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNob3dEaWFsb2coKTogUm91dGUgY29udHJvbGxlciBkaWFsb2cgYWxyZWFkeSBzaG93aW5nISIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQgZiA9Ci0gICAgICAgICAgICAgICAgICAgIG1EaWFsb2dGYWN0b3J5Lm9uQ3JlYXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50KCk7Ci0gICAgICAgICAgICBmLnNob3coZm0sIENPTlRST0xMRVJfRlJBR01FTlRfVEFHKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgQWN0aXZpdHkgZ2V0QWN0aXZpdHkoKSB7Ci0gICAgICAgIC8vIEdyb3NzIHdheSBvZiB1bndyYXBwaW5nIHRoZSBBY3Rpdml0eSBzbyB3ZSBjYW4gZ2V0IHRoZSBGcmFnbWVudE1hbmFnZXIKLSAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOwotICAgICAgICB3aGlsZSAoY29udGV4dCBpbnN0YW5jZW9mIENvbnRleHRXcmFwcGVyKSB7Ci0gICAgICAgICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIEFjdGl2aXR5KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChBY3Rpdml0eSljb250ZXh0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY29udGV4dCA9ICgoQ29udGV4dFdyYXBwZXIpY29udGV4dCkuZ2V0QmFzZUNvbnRleHQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgdG8gZW5hYmxlIHNob3dpbmcgYSB0b2FzdCB3aXRoIHRoZSBjb250ZW50IGRlc2NyaXB0b3Igb2YgdGhlCi0gICAgICogYnV0dG9uIHdoZW4gdGhlIGJ1dHRvbiBpcyBsb25nIHByZXNzZWQuCi0gICAgICovCi0gICAgdm9pZCBzZXRDaGVhdFNoZWV0RW5hYmxlZChib29sZWFuIGVuYWJsZSkgewotICAgICAgICBUb29sdGlwQ29tcGF0LnNldFRvb2x0aXBUZXh0KHRoaXMsIGVuYWJsZQotICAgICAgICAgICAgICAgID8gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhnZXRDb250ZXh0KCkpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRTdHJpbmcoUi5zdHJpbmcubXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24pCi0gICAgICAgICAgICAgICAgOiBudWxsKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBwZXJmb3JtQ2xpY2soKSB7Ci0gICAgICAgIC8vIFNlbmQgdGhlIGFwcHJvcHJpYXRlIGFjY2Vzc2liaWxpdHkgZXZlbnRzIGFuZCBjYWxsIGxpc3RlbmVycwotICAgICAgICBib29sZWFuIGhhbmRsZWQgPSBzdXBlci5wZXJmb3JtQ2xpY2soKTsKLSAgICAgICAgaWYgKCFoYW5kbGVkKSB7Ci0gICAgICAgICAgICBwbGF5U291bmRFZmZlY3QoU291bmRFZmZlY3RDb25zdGFudHMuQ0xJQ0spOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzaG93RGlhbG9nKCkgfHwgaGFuZGxlZDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgaW50W10gb25DcmVhdGVEcmF3YWJsZVN0YXRlKGludCBleHRyYVNwYWNlKSB7Ci0gICAgICAgIGZpbmFsIGludFtdIGRyYXdhYmxlU3RhdGUgPSBzdXBlci5vbkNyZWF0ZURyYXdhYmxlU3RhdGUoZXh0cmFTcGFjZSArIDEpOwotCi0gICAgICAgIC8vIFRlY2huaWNhbGx5IHdlIHNob3VsZCBiZSBoYW5kbGluZyB0aGlzIG1vcmUgY29tcGxldGVseSwgYnV0IHRoZXNlCi0gICAgICAgIC8vIGFyZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGhlcmUuIENoZWNrYWJsZSBpcyB1c2VkIHRvIGV4cHJlc3MgdGhlIGNvbm5lY3RpbmcKLSAgICAgICAgLy8gZHJhd2FibGUgc3RhdGUgYW5kIGl0J3MgbXV0dWFsbHkgZXhjbHVzaXZlIHdpdGggY2hlY2sgZm9yIHRoZSBwdXJwb3NlcwotICAgICAgICAvLyBvZiBzdGF0ZSBzZWxlY3Rpb24gaGVyZS4KLSAgICAgICAgaWYgKG1Jc0Nvbm5lY3RpbmcpIHsKLSAgICAgICAgICAgIG1lcmdlRHJhd2FibGVTdGF0ZXMoZHJhd2FibGVTdGF0ZSwgQ0hFQ0tBQkxFX1NUQVRFX1NFVCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobVJlbW90ZUFjdGl2ZSkgewotICAgICAgICAgICAgbWVyZ2VEcmF3YWJsZVN0YXRlcyhkcmF3YWJsZVN0YXRlLCBDSEVDS0VEX1NUQVRFX1NFVCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRyYXdhYmxlU3RhdGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZHJhd2FibGVTdGF0ZUNoYW5nZWQoKSB7Ci0gICAgICAgIHN1cGVyLmRyYXdhYmxlU3RhdGVDaGFuZ2VkKCk7Ci0KLSAgICAgICAgaWYgKG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50W10gbXlEcmF3YWJsZVN0YXRlID0gZ2V0RHJhd2FibGVTdGF0ZSgpOwotICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvci5zZXRTdGF0ZShteURyYXdhYmxlU3RhdGUpOwotICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGRyYXdhYmxlIHRvIHVzZSBhcyB0aGUgcmVtb3RlIHJvdXRlIGluZGljYXRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSZW1vdGVJbmRpY2F0b3JEcmF3YWJsZShEcmF3YWJsZSBkKSB7Ci0gICAgICAgIGlmIChtUmVtb3RlSW5kaWNhdG9yTG9hZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3JMb2FkZXIuY2FuY2VsKGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3Iuc2V0Q2FsbGJhY2sobnVsbCk7Ci0gICAgICAgICAgICB1bnNjaGVkdWxlRHJhd2FibGUobVJlbW90ZUluZGljYXRvcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1CdXR0b25UaW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkID0gRHJhd2FibGVDb21wYXQud3JhcChkLm11dGF0ZSgpKTsKLSAgICAgICAgICAgICAgICBEcmF3YWJsZUNvbXBhdC5zZXRUaW50TGlzdChkLCBtQnV0dG9uVGludCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkLnNldENhbGxiYWNrKHRoaXMpOwotICAgICAgICAgICAgZC5zZXRTdGF0ZShnZXREcmF3YWJsZVN0YXRlKCkpOwotICAgICAgICAgICAgZC5zZXRWaXNpYmxlKGdldFZpc2liaWxpdHkoKSA9PSBWSVNJQkxFLCBmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbVJlbW90ZUluZGljYXRvciA9IGQ7Ci0KLSAgICAgICAgcmVmcmVzaERyYXdhYmxlU3RhdGUoKTsKLSAgICAgICAgaWYgKG1BdHRhY2hlZFRvV2luZG93ICYmIG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIG1SZW1vdGVJbmRpY2F0b3IuZ2V0Q3VycmVudCgpIGluc3RhbmNlb2YgQW5pbWF0aW9uRHJhd2FibGUpIHsKLSAgICAgICAgICAgIEFuaW1hdGlvbkRyYXdhYmxlIGN1ckRyYXdhYmxlID0gKEFuaW1hdGlvbkRyYXdhYmxlKSBtUmVtb3RlSW5kaWNhdG9yLmdldEN1cnJlbnQoKTsKLSAgICAgICAgICAgIGlmIChtSXNDb25uZWN0aW5nKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFjdXJEcmF3YWJsZS5pc1J1bm5pbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBjdXJEcmF3YWJsZS5zdGFydCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVJlbW90ZUFjdGl2ZSkgewotICAgICAgICAgICAgICAgIGlmIChjdXJEcmF3YWJsZS5pc1J1bm5pbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBjdXJEcmF3YWJsZS5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGN1ckRyYXdhYmxlLnNlbGVjdERyYXdhYmxlKGN1ckRyYXdhYmxlLmdldE51bWJlck9mRnJhbWVzKCkgLSAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBib29sZWFuIHZlcmlmeURyYXdhYmxlKERyYXdhYmxlIHdobykgewotICAgICAgICByZXR1cm4gc3VwZXIudmVyaWZ5RHJhd2FibGUod2hvKSB8fCB3aG8gPT0gbVJlbW90ZUluZGljYXRvcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBqdW1wRHJhd2FibGVzVG9DdXJyZW50U3RhdGUoKSB7Ci0gICAgICAgIC8vIFdlIGNhbid0IGNhbGwgc3VwZXIgdG8gaGFuZGxlIHRoZSBiYWNrZ3JvdW5kIHNvIHdlIGRvIGl0IG91cnNlbHZlcy4KLSAgICAgICAgLy9zdXBlci5qdW1wRHJhd2FibGVzVG9DdXJyZW50U3RhdGUoKTsKLSAgICAgICAgaWYgKGdldEJhY2tncm91bmQoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBEcmF3YWJsZUNvbXBhdC5qdW1wVG9DdXJyZW50U3RhdGUoZ2V0QmFja2dyb3VuZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEhhbmRsZSBvdXIgb3duIHJlbW90ZSBpbmRpY2F0b3IuCi0gICAgICAgIGlmIChtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIERyYXdhYmxlQ29tcGF0Lmp1bXBUb0N1cnJlbnRTdGF0ZShtUmVtb3RlSW5kaWNhdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFZpc2liaWxpdHkoaW50IHZpc2liaWxpdHkpIHsKLSAgICAgICAgc3VwZXIuc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLQotICAgICAgICBpZiAobVJlbW90ZUluZGljYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yLnNldFZpc2libGUoZ2V0VmlzaWJpbGl0eSgpID09IFZJU0lCTEUsIGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpIHsKLSAgICAgICAgc3VwZXIub25BdHRhY2hlZFRvV2luZG93KCk7Ci0KLSAgICAgICAgbUF0dGFjaGVkVG9XaW5kb3cgPSB0cnVlOwotICAgICAgICBpZiAoIW1TZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2sobVNlbGVjdG9yLCBtQ2FsbGJhY2ssIG1Sb3V0ZUNhbGxiYWNrRmxhZ3MpOwotICAgICAgICB9Ci0gICAgICAgIHJlZnJlc2hSb3V0ZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgewotICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IGZhbHNlOwotICAgICAgICBpZiAoIW1TZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN1cGVyLm9uRGV0YWNoZWRGcm9tV2luZG93KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgZmluYWwgaW50IHdpZHRoU2l6ZSA9IE1lYXN1cmVTcGVjLmdldFNpemUod2lkdGhNZWFzdXJlU3BlYyk7Ci0gICAgICAgIGZpbmFsIGludCBoZWlnaHRTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYyk7Ci0gICAgICAgIGZpbmFsIGludCB3aWR0aE1vZGUgPSBNZWFzdXJlU3BlYy5nZXRNb2RlKHdpZHRoTWVhc3VyZVNwZWMpOwotICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0TW9kZSA9IE1lYXN1cmVTcGVjLmdldE1vZGUoaGVpZ2h0TWVhc3VyZVNwZWMpOwotCi0gICAgICAgIGZpbmFsIGludCB3aWR0aCA9IE1hdGgubWF4KG1NaW5XaWR0aCwgbVJlbW90ZUluZGljYXRvciAhPSBudWxsID8KLSAgICAgICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yLmdldEludHJpbnNpY1dpZHRoKCkgKyBnZXRQYWRkaW5nTGVmdCgpICsgZ2V0UGFkZGluZ1JpZ2h0KCkgOiAwKTsKLSAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IE1hdGgubWF4KG1NaW5IZWlnaHQsIG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbCA/Ci0gICAgICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvci5nZXRJbnRyaW5zaWNIZWlnaHQoKSArIGdldFBhZGRpbmdUb3AoKSArIGdldFBhZGRpbmdCb3R0b20oKSA6IDApOwotCi0gICAgICAgIGludCBtZWFzdXJlZFdpZHRoOwotICAgICAgICBzd2l0Y2ggKHdpZHRoTW9kZSkgewotICAgICAgICAgICAgY2FzZSBNZWFzdXJlU3BlYy5FWEFDVExZOgotICAgICAgICAgICAgICAgIG1lYXN1cmVkV2lkdGggPSB3aWR0aFNpemU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lYXN1cmVTcGVjLkFUX01PU1Q6Ci0gICAgICAgICAgICAgICAgbWVhc3VyZWRXaWR0aCA9IE1hdGgubWluKHdpZHRoU2l6ZSwgd2lkdGgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGNhc2UgTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQ6Ci0gICAgICAgICAgICAgICAgbWVhc3VyZWRXaWR0aCA9IHdpZHRoOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG1lYXN1cmVkSGVpZ2h0OwotICAgICAgICBzd2l0Y2ggKGhlaWdodE1vZGUpIHsKLSAgICAgICAgICAgIGNhc2UgTWVhc3VyZVNwZWMuRVhBQ1RMWToKLSAgICAgICAgICAgICAgICBtZWFzdXJlZEhlaWdodCA9IGhlaWdodFNpemU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lYXN1cmVTcGVjLkFUX01PU1Q6Ci0gICAgICAgICAgICAgICAgbWVhc3VyZWRIZWlnaHQgPSBNYXRoLm1pbihoZWlnaHRTaXplLCBoZWlnaHQpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGNhc2UgTWVhc3VyZVNwZWMuVU5TUEVDSUZJRUQ6Ci0gICAgICAgICAgICAgICAgbWVhc3VyZWRIZWlnaHQgPSBoZWlnaHQ7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBzZXRNZWFzdXJlZERpbWVuc2lvbihtZWFzdXJlZFdpZHRoLCBtZWFzdXJlZEhlaWdodCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKLSAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7Ci0KLSAgICAgICAgaWYgKG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgaW50IGxlZnQgPSBnZXRQYWRkaW5nTGVmdCgpOwotICAgICAgICAgICAgZmluYWwgaW50IHJpZ2h0ID0gZ2V0V2lkdGgoKSAtIGdldFBhZGRpbmdSaWdodCgpOwotICAgICAgICAgICAgZmluYWwgaW50IHRvcCA9IGdldFBhZGRpbmdUb3AoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBib3R0b20gPSBnZXRIZWlnaHQoKSAtIGdldFBhZGRpbmdCb3R0b20oKTsKLQotICAgICAgICAgICAgZmluYWwgaW50IGRyYXdXaWR0aCA9IG1SZW1vdGVJbmRpY2F0b3IuZ2V0SW50cmluc2ljV2lkdGgoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBkcmF3SGVpZ2h0ID0gbVJlbW90ZUluZGljYXRvci5nZXRJbnRyaW5zaWNIZWlnaHQoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBkcmF3TGVmdCA9IGxlZnQgKyAocmlnaHQgLSBsZWZ0IC0gZHJhd1dpZHRoKSAvIDI7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgZHJhd1RvcCA9IHRvcCArIChib3R0b20gLSB0b3AgLSBkcmF3SGVpZ2h0KSAvIDI7Ci0KLSAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3Iuc2V0Qm91bmRzKGRyYXdMZWZ0LCBkcmF3VG9wLAotICAgICAgICAgICAgICAgICAgICBkcmF3TGVmdCArIGRyYXdXaWR0aCwgZHJhd1RvcCArIGRyYXdIZWlnaHQpOwotICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvci5kcmF3KGNhbnZhcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHJlZnJlc2hSb3V0ZSgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gbVJvdXRlci5nZXRTZWxlY3RlZFJvdXRlKCk7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gaXNSZW1vdGUgPSAhcm91dGUuaXNEZWZhdWx0T3JCbHVldG9vdGgoKSAmJiByb3V0ZS5tYXRjaGVzU2VsZWN0b3IobVNlbGVjdG9yKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBpc0Nvbm5lY3RpbmcgPSBpc1JlbW90ZSAmJiByb3V0ZS5pc0Nvbm5lY3RpbmcoKTsKLSAgICAgICAgYm9vbGVhbiBuZWVkc1JlZnJlc2ggPSBmYWxzZTsKLSAgICAgICAgaWYgKG1SZW1vdGVBY3RpdmUgIT0gaXNSZW1vdGUpIHsKLSAgICAgICAgICAgIG1SZW1vdGVBY3RpdmUgPSBpc1JlbW90ZTsKLSAgICAgICAgICAgIG5lZWRzUmVmcmVzaCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Jc0Nvbm5lY3RpbmcgIT0gaXNDb25uZWN0aW5nKSB7Ci0gICAgICAgICAgICBtSXNDb25uZWN0aW5nID0gaXNDb25uZWN0aW5nOwotICAgICAgICAgICAgbmVlZHNSZWZyZXNoID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuZWVkc1JlZnJlc2gpIHsKLSAgICAgICAgICAgIHVwZGF0ZUNvbnRlbnREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgcmVmcmVzaERyYXdhYmxlU3RhdGUoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgIHNldEVuYWJsZWQobVJvdXRlci5pc1JvdXRlQXZhaWxhYmxlKG1TZWxlY3RvciwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQVZBSUxBQklMSVRZX0ZMQUdfSUdOT1JFX0RFRkFVTFRfUk9VVEUpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVJlbW90ZUluZGljYXRvciAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgbVJlbW90ZUluZGljYXRvci5nZXRDdXJyZW50KCkgaW5zdGFuY2VvZiBBbmltYXRpb25EcmF3YWJsZSkgewotICAgICAgICAgICAgQW5pbWF0aW9uRHJhd2FibGUgY3VyRHJhd2FibGUgPSAoQW5pbWF0aW9uRHJhd2FibGUpIG1SZW1vdGVJbmRpY2F0b3IuZ2V0Q3VycmVudCgpOwotICAgICAgICAgICAgaWYgKG1BdHRhY2hlZFRvV2luZG93KSB7Ci0gICAgICAgICAgICAgICAgaWYgKChuZWVkc1JlZnJlc2ggfHwgaXNDb25uZWN0aW5nKSAmJiAhY3VyRHJhd2FibGUuaXNSdW5uaW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VyRHJhd2FibGUuc3RhcnQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzUmVtb3RlICYmICFpc0Nvbm5lY3RpbmcpIHsKLSAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSByb3V0ZSBpcyBhbHJlYWR5IGNvbm5lY3RlZCBiZWZvcmUgdGhlIHZpZXcgaXMgYXR0YWNoZWQsIHNob3cgdGhlIGxhc3QKLSAgICAgICAgICAgICAgICAvLyBmcmFtZSBvZiB0aGUgY29ubmVjdGVkIGFuaW1hdGlvbiBpbW1lZGlhdGVseS4KLSAgICAgICAgICAgICAgICBpZiAoY3VyRHJhd2FibGUuaXNSdW5uaW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY3VyRHJhd2FibGUuc3RvcCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjdXJEcmF3YWJsZS5zZWxlY3REcmF3YWJsZShjdXJEcmF3YWJsZS5nZXROdW1iZXJPZkZyYW1lcygpIC0gMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlQ29udGVudERlc2NyaXB0aW9uKCkgewotICAgICAgICBpbnQgcmVzSWQ7Ci0gICAgICAgIGlmIChtSXNDb25uZWN0aW5nKSB7Ci0gICAgICAgICAgICByZXNJZCA9IFIuc3RyaW5nLm1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3Rpbmc7Ci0gICAgICAgIH0gZWxzZSBpZiAobVJlbW90ZUFjdGl2ZSkgewotICAgICAgICAgICAgcmVzSWQgPSBSLnN0cmluZy5tcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXNJZCA9IFIuc3RyaW5nLm1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZDsKLSAgICAgICAgfQotICAgICAgICBzZXRDb250ZW50RGVzY3JpcHRpb24oQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhnZXRDb250ZXh0KCkpLmdldFN0cmluZyhyZXNJZCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVyLkNhbGxiYWNrIHsKLSAgICAgICAgTWVkaWFSb3V0ZXJDYWxsYmFjaygpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQWRkZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVJlbW92ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGluZm8pIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGluZm8pIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJBZGRlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlByb3ZpZGVySW5mbyBwcm92aWRlcikgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlclJlbW92ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Qcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUmVtb3RlSW5kaWNhdG9yTG9hZGVyIGV4dGVuZHMgQXN5bmNUYXNrPFZvaWQsIFZvaWQsIERyYXdhYmxlPiB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1SZXNJZDsKLQotICAgICAgICBSZW1vdGVJbmRpY2F0b3JMb2FkZXIoaW50IHJlc0lkKSB7Ci0gICAgICAgICAgICBtUmVzSWQgPSByZXNJZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgRHJhd2FibGUgZG9JbkJhY2tncm91bmQoVm9pZC4uLiBwYXJhbXMpIHsKLSAgICAgICAgICAgIHJldHVybiBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGdldENvbnRleHQoKSkuZ2V0RHJhd2FibGUobVJlc0lkKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RFeGVjdXRlKERyYXdhYmxlIHJlbW90ZUluZGljYXRvcikgewotICAgICAgICAgICAgY2FjaGVBbmRSZXNldChyZW1vdGVJbmRpY2F0b3IpOwotICAgICAgICAgICAgc2V0UmVtb3RlSW5kaWNhdG9yRHJhd2FibGUocmVtb3RlSW5kaWNhdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNhbmNlbGxlZChEcmF3YWJsZSByZW1vdGVJbmRpY2F0b3IpIHsKLSAgICAgICAgICAgIGNhY2hlQW5kUmVzZXQocmVtb3RlSW5kaWNhdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBjYWNoZUFuZFJlc2V0KERyYXdhYmxlIHJlbW90ZUluZGljYXRvcikgewotICAgICAgICAgICAgaWYgKHJlbW90ZUluZGljYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc1JlbW90ZUluZGljYXRvckNhY2hlLnB1dChtUmVzSWQsIHJlbW90ZUluZGljYXRvci5nZXRDb25zdGFudFN0YXRlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvckxvYWRlciA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDaG9vc2VyRGlhbG9nLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDaG9vc2VyRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYzY0ZDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ2hvb3NlckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8uQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvLkNPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElORzsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZzsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52Ny5hcHAuQXBwQ29tcGF0RGlhbG9nOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5BZGFwdGVyVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVTZWxlY3RvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db21wYXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgcm91dGUgY2hvb3NlciBkaWFsb2cgZm9yIHtAbGluayBNZWRpYVJvdXRlcn0uCi0gKiA8cD4KLSAqIFRoaXMgZGlhbG9nIGFsbG93cyB0aGUgdXNlciB0byBjaG9vc2UgYSByb3V0ZSB0aGF0IG1hdGNoZXMgYSBnaXZlbiBzZWxlY3Rvci4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIE1lZGlhUm91dGVCdXR0b24KLSAqIEBzZWUgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyBleHRlbmRzIERpYWxvZyB7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZUNob29zZXJEaWFsb2ciOwotCi0gICAgLy8gRG8gbm90IHVwZGF0ZSB0aGUgcm91dGUgbGlzdCBpbW1lZGlhdGVseSB0byBhdm9pZCB1bm5hdHVyYWwgZGlhbG9nIGNoYW5nZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFVQREFURV9ST1VURVNfREVMQVlfTVMgPSAzMDBMOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1VQREFURV9ST1VURVMgPSAxOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlciBtUm91dGVyOwotICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZXJDYWxsYmFjayBtQ2FsbGJhY2s7Ci0KLSAgICBwcml2YXRlIFRleHRWaWV3IG1UaXRsZVZpZXc7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOwotICAgIHByaXZhdGUgQXJyYXlMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gbVJvdXRlczsKLSAgICBwcml2YXRlIFJvdXRlQWRhcHRlciBtQWRhcHRlcjsKLSAgICBwcml2YXRlIExpc3RWaWV3IG1MaXN0VmlldzsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUF0dGFjaGVkVG9XaW5kb3c7Ci0gICAgcHJpdmF0ZSBsb25nIG1MYXN0VXBkYXRlVGltZTsKLSAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1lc3NhZ2Uud2hhdCkgewotICAgICAgICAgICAgICAgIGNhc2UgTVNHX1VQREFURV9ST1VURVM6Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVJvdXRlcygoTGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+KSBtZXNzYWdlLm9iaik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2coQ29udGV4dCBjb250ZXh0LCBpbnQgdGhlbWUpIHsKLSAgICAgICAgLy8gVE9ETyAoYi83Mjk3NTk3Nik6IEF2b2lkIHRvIHVzZSBDb250ZXh0VGhlbWVXcmFwcGVyIHdpdGggYXBwIGNvbnRleHQgYW5kIGxpYiB0aGVtZS4KLSAgICAgICAgc3VwZXIobmV3IENvbnRleHRUaGVtZVdyYXBwZXIoY29udGV4dCwgQXBpSGVscGVyLmdldExpYlRoZW1lKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRSb3V0ZXJUaGVtZUlkKGNvbnRleHQpKSksIHRoZW1lKTsKLSAgICAgICAgY29udGV4dCA9IGdldENvbnRleHQoKTsKLQotICAgICAgICBtUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoY29udGV4dCk7Ci0gICAgICAgIG1DYWxsYmFjayA9IG5ldyBNZWRpYVJvdXRlckNhbGxiYWNrKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuIHNlbGVjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNlbGVjdG9yLCBuZXZlciBudWxsLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIE1lZGlhUm91dGVTZWxlY3RvciBnZXRSb3V0ZVNlbGVjdG9yKCkgewotICAgICAgICByZXR1cm4gbVNlbGVjdG9yOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbiBzZWxlY3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yLCBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoQE5vbk51bGwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoIW1TZWxlY3Rvci5lcXVhbHMoc2VsZWN0b3IpKSB7Ci0gICAgICAgICAgICBtU2VsZWN0b3IgPSBzZWxlY3RvcjsKLQotICAgICAgICAgICAgaWYgKG1BdHRhY2hlZFRvV2luZG93KSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICAgICAgICAgICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2soc2VsZWN0b3IsIG1DYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZXMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB0byBmaWx0ZXIgdGhlIHNldCBvZiByb3V0ZXMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3QuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXRlcmF0ZXMgb3ZlciBhbGwgcm91dGVzIGluIHRoZSBwcm92aWRlZCBsaXN0IGFuZAotICAgICAqIHJlbW92ZXMgdGhvc2UgZm9yIHdoaWNoIHtAbGluayAjb25GaWx0ZXJSb3V0ZX0gcmV0dXJucyBmYWxzZS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcm91dGVzIFRoZSBsaXN0IG9mIHJvdXRlcyB0byBmaWx0ZXIgaW4tcGxhY2UsIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25GaWx0ZXJSb3V0ZXMoQE5vbk51bGwgTGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IHJvdXRlcykgewotICAgICAgICBmb3IgKGludCBpID0gcm91dGVzLnNpemUoKTsgaS0tID4gMDsgKSB7Ci0gICAgICAgICAgICBpZiAoIW9uRmlsdGVyUm91dGUocm91dGVzLmdldChpKSkpIHsKLSAgICAgICAgICAgICAgICByb3V0ZXMucmVtb3ZlKGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3QuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyB0cnVlIGZvciBlbmFibGVkIG5vbi1kZWZhdWx0IHJvdXRlcyB0aGF0Ci0gICAgICogbWF0Y2ggdGhlIHNlbGVjdG9yLiAgU3ViY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gZmlsdGVyIHJvdXRlcwotICAgICAqIGRpZmZlcmVudGx5LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdG8gY29uc2lkZXIsIG5ldmVyIG51bGwuCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSByb3V0ZSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGNob29zZXIgZGlhbG9nLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIG9uRmlsdGVyUm91dGUoQE5vbk51bGwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIHJldHVybiAhcm91dGUuaXNEZWZhdWx0T3JCbHVldG9vdGgoKSAmJiByb3V0ZS5pc0VuYWJsZWQoKQotICAgICAgICAgICAgICAgICYmIHJvdXRlLm1hdGNoZXNTZWxlY3RvcihtU2VsZWN0b3IpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKENoYXJTZXF1ZW5jZSB0aXRsZSkgewotICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQodGl0bGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFRpdGxlKGludCB0aXRsZUlkKSB7Ci0gICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dCh0aXRsZUlkKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0KLSAgICAgICAgc2V0Q29udGVudFZpZXcoQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQoZ2V0Q29udGV4dCgpLCBBcGlIZWxwZXIuZ2V0TGliVGhlbWUoZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0Um91dGVyVGhlbWVJZChnZXRDb250ZXh0KCkpKSwKLSAgICAgICAgICAgICAgICBSLmxheW91dC5tcl9jaG9vc2VyX2RpYWxvZykpOwotCi0gICAgICAgIG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgbUFkYXB0ZXIgPSBuZXcgUm91dGVBZGFwdGVyKGdldENvbnRleHQoKSwgbVJvdXRlcyk7Ci0gICAgICAgIG1MaXN0VmlldyA9IChMaXN0VmlldylmaW5kVmlld0J5SWQoUi5pZC5tcl9jaG9vc2VyX2xpc3QpOwotICAgICAgICBtTGlzdFZpZXcuc2V0QWRhcHRlcihtQWRhcHRlcik7Ci0gICAgICAgIG1MaXN0Vmlldy5zZXRPbkl0ZW1DbGlja0xpc3RlbmVyKG1BZGFwdGVyKTsKLSAgICAgICAgbUxpc3RWaWV3LnNldEVtcHR5VmlldyhmaW5kVmlld0J5SWQoYW5kcm9pZC5SLmlkLmVtcHR5KSk7Ci0gICAgICAgIG1UaXRsZVZpZXcgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9jaG9vc2VyX3RpdGxlKTsKLQotICAgICAgICB1cGRhdGVMYXlvdXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB3aWR0aCBvZiB0aGUgZGlhbG9nLiBBbHNvIGNhbGxlZCB3aGVuIGNvbmZpZ3VyYXRpb24gY2hhbmdlcy4KLSAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZUxheW91dCgpIHsKLSAgICAgICAgZ2V0V2luZG93KCkuc2V0TGF5b3V0KE1lZGlhUm91dGVEaWFsb2dIZWxwZXIuZ2V0RGlhbG9nV2lkdGgoZ2V0Q29udGV4dCgpKSwKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKLQotICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IHRydWU7Ci0gICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2sobVNlbGVjdG9yLCBtQ2FsbGJhY2ssIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTik7Ci0gICAgICAgIHJlZnJlc2hSb3V0ZXMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKLSAgICAgICAgbUF0dGFjaGVkVG9XaW5kb3cgPSBmYWxzZTsKLSAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfVVBEQVRFX1JPVVRFUyk7Ci0KLSAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWZyZXNoZXMgdGhlIGxpc3Qgb2Ygcm91dGVzIHRoYXQgYXJlIHNob3duIGluIHRoZSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWZyZXNoUm91dGVzKCkgewotICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgIEFycmF5TGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IHJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8PihtUm91dGVyLmdldFJvdXRlcygpKTsKLSAgICAgICAgICAgIG9uRmlsdGVyUm91dGVzKHJvdXRlcyk7Ci0gICAgICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KHJvdXRlcywgUm91dGVDb21wYXJhdG9yLnNJbnN0YW5jZSk7Ci0gICAgICAgICAgICBpZiAoU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgLSBtTGFzdFVwZGF0ZVRpbWUgPj0gVVBEQVRFX1JPVVRFU19ERUxBWV9NUykgewotICAgICAgICAgICAgICAgIHVwZGF0ZVJvdXRlcyhyb3V0ZXMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhNU0dfVVBEQVRFX1JPVVRFUyk7Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2VBdFRpbWUobUhhbmRsZXIub2J0YWluTWVzc2FnZShNU0dfVVBEQVRFX1JPVVRFUywgcm91dGVzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VXBkYXRlVGltZSArIFVQREFURV9ST1VURVNfREVMQVlfTVMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCB1cGRhdGVSb3V0ZXMoTGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IHJvdXRlcykgewotICAgICAgICBtTGFzdFVwZGF0ZVRpbWUgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgbVJvdXRlcy5jbGVhcigpOwotICAgICAgICBtUm91dGVzLmFkZEFsbChyb3V0ZXMpOwotICAgICAgICBtQWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUm91dGVBZGFwdGVyIGV4dGVuZHMgQXJyYXlBZGFwdGVyPE1lZGlhUm91dGVyLlJvdXRlSW5mbz4KLSAgICAgICAgICAgIGltcGxlbWVudHMgTGlzdFZpZXcuT25JdGVtQ2xpY2tMaXN0ZW5lciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgRHJhd2FibGUgbURlZmF1bHRJY29uOwotICAgICAgICBwcml2YXRlIGZpbmFsIERyYXdhYmxlIG1Udkljb247Ci0gICAgICAgIHByaXZhdGUgZmluYWwgRHJhd2FibGUgbVNwZWFrZXJJY29uOwotICAgICAgICBwcml2YXRlIGZpbmFsIERyYXdhYmxlIG1TcGVha2VyR3JvdXBJY29uOwotCi0gICAgICAgIHB1YmxpYyBSb3V0ZUFkYXB0ZXIoQ29udGV4dCBjb250ZXh0LCBMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gcm91dGVzKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCAwLCByb3V0ZXMpOwotCi0gICAgICAgICAgICBUeXBlZEFycmF5IHN0eWxlZEF0dHJpYnV0ZXMgPSBBcGlIZWxwZXIuZ2V0TGliVGhlbWUoY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRSb3V0ZXJUaGVtZUlkKGNvbnRleHQpKS5vYnRhaW5TdHlsZWRBdHRyaWJ1dGVzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBpbnRbXSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuYXR0ci5tZWRpYVJvdXRlRGVmYXVsdEljb25EcmF3YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5hdHRyLm1lZGlhUm91dGVUdkljb25EcmF3YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5hdHRyLm1lZGlhUm91dGVTcGVha2VySWNvbkRyYXdhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmF0dHIubWVkaWFSb3V0ZVNwZWFrZXJHcm91cEljb25EcmF3YWJsZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotCi0gICAgICAgICAgICBtRGVmYXVsdEljb24gPSBzdHlsZWRBdHRyaWJ1dGVzLmdldERyYXdhYmxlKDApOwotICAgICAgICAgICAgbVR2SWNvbiA9IHN0eWxlZEF0dHJpYnV0ZXMuZ2V0RHJhd2FibGUoMSk7Ci0gICAgICAgICAgICBtU3BlYWtlckljb24gPSBzdHlsZWRBdHRyaWJ1dGVzLmdldERyYXdhYmxlKDIpOwotICAgICAgICAgICAgbVNwZWFrZXJHcm91cEljb24gPSBzdHlsZWRBdHRyaWJ1dGVzLmdldERyYXdhYmxlKDMpOwotICAgICAgICAgICAgc3R5bGVkQXR0cmlidXRlcy5yZWN5Y2xlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gYXJlQWxsSXRlbXNFbmFibGVkKCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRJdGVtKHBvc2l0aW9uKS5pc0VuYWJsZWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgewotICAgICAgICAgICAgVmlldyB2aWV3ID0gY29udmVydFZpZXc7Ci0gICAgICAgICAgICBpZiAodmlldyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdmlldyA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KGdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJUaGVtZShnZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0Um91dGVyVGhlbWVJZChnZXRDb250ZXh0KCkpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0Lm1yX2Nob29zZXJfbGlzdF9pdGVtLCBwYXJlbnQsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBUZXh0VmlldyB0ZXh0MSA9IChUZXh0Vmlldykgdmlldy5maW5kVmlld0J5SWQoUi5pZC5tcl9jaG9vc2VyX3JvdXRlX25hbWUpOwotICAgICAgICAgICAgVGV4dFZpZXcgdGV4dDIgPSAoVGV4dFZpZXcpIHZpZXcuZmluZFZpZXdCeUlkKFIuaWQubXJfY2hvb3Nlcl9yb3V0ZV9kZXNjKTsKLSAgICAgICAgICAgIHRleHQxLnNldFRleHQocm91dGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IHJvdXRlLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICBib29sZWFuIGlzQ29ubmVjdGVkT3JDb25uZWN0aW5nID0KLSAgICAgICAgICAgICAgICAgICAgcm91dGUuZ2V0Q29ubmVjdGlvblN0YXRlKCkgPT0gQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCByb3V0ZS5nZXRDb25uZWN0aW9uU3RhdGUoKSA9PSBDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkc7Ci0gICAgICAgICAgICBpZiAoaXNDb25uZWN0ZWRPckNvbm5lY3RpbmcgJiYgIVRleHRVdGlscy5pc0VtcHR5KGRlc2NyaXB0aW9uKSkgewotICAgICAgICAgICAgICAgIHRleHQxLnNldEdyYXZpdHkoR3Jhdml0eS5CT1RUT00pOwotICAgICAgICAgICAgICAgIHRleHQyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICB0ZXh0Mi5zZXRUZXh0KGRlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGV4dDEuc2V0R3Jhdml0eShHcmF2aXR5LkNFTlRFUl9WRVJUSUNBTCk7Ci0gICAgICAgICAgICAgICAgdGV4dDIuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgIHRleHQyLnNldFRleHQoIiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmlldy5zZXRFbmFibGVkKHJvdXRlLmlzRW5hYmxlZCgpKTsKLQotICAgICAgICAgICAgSW1hZ2VWaWV3IGljb25WaWV3ID0gKEltYWdlVmlldykgdmlldy5maW5kVmlld0J5SWQoUi5pZC5tcl9jaG9vc2VyX3JvdXRlX2ljb24pOwotICAgICAgICAgICAgaWYgKGljb25WaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpY29uVmlldy5zZXRJbWFnZURyYXdhYmxlKGdldEljb25EcmF3YWJsZShyb3V0ZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHZpZXc7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBpZiAocm91dGUuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICByb3V0ZS5zZWxlY3QoKTsKLSAgICAgICAgICAgICAgICBkaXNtaXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIERyYXdhYmxlIGdldEljb25EcmF3YWJsZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIFVyaSBpY29uVXJpID0gcm91dGUuZ2V0SWNvblVyaSgpOwotICAgICAgICAgICAgaWYgKGljb25VcmkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIGlzID0gZ2V0Q29udGV4dCgpLmdldENvbnRlbnRSZXNvbHZlcigpLm9wZW5JbnB1dFN0cmVhbShpY29uVXJpKTsKLSAgICAgICAgICAgICAgICAgICAgRHJhd2FibGUgZHJhd2FibGUgPSBEcmF3YWJsZS5jcmVhdGVGcm9tU3RyZWFtKGlzLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRyYXdhYmxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkcmF3YWJsZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIGxvYWQgIiArIGljb25VcmksIGUpOwotICAgICAgICAgICAgICAgICAgICAvLyBGYWxscyBiYWNrLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBnZXREZWZhdWx0SWNvbkRyYXdhYmxlKHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgRHJhd2FibGUgZ2V0RGVmYXVsdEljb25EcmF3YWJsZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSB0eXBlIG9mIHRoZSByZWNlaXZlciBkZXZpY2UgaXMgc3BlY2lmaWVkLCB1c2UgaXQuCi0gICAgICAgICAgICBzd2l0Y2ggKHJvdXRlLmdldERldmljZVR5cGUoKSkgewotICAgICAgICAgICAgICAgIGNhc2UgIE1lZGlhUm91dGVyLlJvdXRlSW5mby5ERVZJQ0VfVFlQRV9UVjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1Udkljb247Ci0gICAgICAgICAgICAgICAgY2FzZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uREVWSUNFX1RZUEVfU1BFQUtFUjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1TcGVha2VySWNvbjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBtYWtlIHRoZSBiZXN0IGd1ZXNzIGJhc2VkIG9uIG90aGVyIHJvdXRlIGluZm9ybWF0aW9uLgotICAgICAgICAgICAgaWYgKHJvdXRlIGluc3RhbmNlb2YgTWVkaWFSb3V0ZXIuUm91dGVHcm91cCkgewotICAgICAgICAgICAgICAgIC8vIE9ubHkgc3BlYWtlcnMgY2FuIGJlIGdyb3VwZWQgZm9yIG5vdy4KLSAgICAgICAgICAgICAgICByZXR1cm4gbVNwZWFrZXJHcm91cEljb247Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbURlZmF1bHRJY29uOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgewotICAgICAgICBNZWRpYVJvdXRlckNhbGxiYWNrKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVBZGRlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVJlbW92ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGluZm8pIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlU2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBSb3V0ZUNvbXBhcmF0b3IgaW1wbGVtZW50cyBDb21wYXJhdG9yPE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gewotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFJvdXRlQ29tcGFyYXRvciBzSW5zdGFuY2UgPSBuZXcgUm91dGVDb21wYXJhdG9yKCk7Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8gbGhzLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcmhzKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGhzLmdldE5hbWUoKS5jb21wYXJlVG9JZ25vcmVDYXNlKHJocy5nZXROYW1lKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVlNmIyOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nOwotaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZ0ZyYWdtZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuQ29uZmlndXJhdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOwotCi0vKioKLSAqIE1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nIGZyYWdtZW50LgotICogPHA+Ci0gKiBDcmVhdGVzIGEge0BsaW5rIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nfS4gIFRoZSBhcHBsaWNhdGlvbiBtYXkgc3ViY2xhc3MKLSAqIHRoaXMgZGlhbG9nIGZyYWdtZW50IHRvIGN1c3RvbWl6ZSB0aGUgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50IGV4dGVuZHMgRGlhbG9nRnJhZ21lbnQgewotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIEFSR1VNRU5UX1NFTEVDVE9SID0gInNlbGVjdG9yIjsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cgbURpYWxvZzsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cgZnJhZ21lbnQuCi0gICAgICogPHA+Ci0gICAgICogQWxsIHN1YmNsYXNzZXMgb2YgdGhpcyBjbGFzcyBtdXN0IGFsc28gcG9zc2VzcyBhIGRlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50KCkgewotICAgICAgICBzZXRDYW5jZWxhYmxlKHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbiBzZWxlY3QuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzZWxlY3RvciwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGdldFJvdXRlU2VsZWN0b3IoKSB7Ci0gICAgICAgIGVuc3VyZVJvdXRlU2VsZWN0b3IoKTsKLSAgICAgICAgcmV0dXJuIG1TZWxlY3RvcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5zdXJlUm91dGVTZWxlY3RvcigpIHsKLSAgICAgICAgaWYgKG1TZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBCdW5kbGUgYXJncyA9IGdldEFyZ3VtZW50cygpOwotICAgICAgICAgICAgaWYgKGFyZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5mcm9tQnVuZGxlKGFyZ3MuZ2V0QnVuZGxlKEFSR1VNRU5UX1NFTEVDVE9SKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdGhhdCB0aGUgdXNlciBjYW4gc2VsZWN0LgotICAgICAqIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgZnJhZ21lbnQgaXMgYWRkZWQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHRvIHNldC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRSb3V0ZVNlbGVjdG9yKE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgewotICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgZW5zdXJlUm91dGVTZWxlY3RvcigpOwotICAgICAgICBpZiAoIW1TZWxlY3Rvci5lcXVhbHMoc2VsZWN0b3IpKSB7Ci0gICAgICAgICAgICBtU2VsZWN0b3IgPSBzZWxlY3RvcjsKLQotICAgICAgICAgICAgQnVuZGxlIGFyZ3MgPSBnZXRBcmd1bWVudHMoKTsKLSAgICAgICAgICAgIGlmIChhcmdzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhcmdzID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXJncy5wdXRCdW5kbGUoQVJHVU1FTlRfU0VMRUNUT1IsIHNlbGVjdG9yLmFzQnVuZGxlKCkpOwotICAgICAgICAgICAgc2V0QXJndW1lbnRzKGFyZ3MpOwotCi0gICAgICAgICAgICBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyBkaWFsb2cgPSAoTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cpZ2V0RGlhbG9nKCk7Ci0gICAgICAgICAgICBpZiAoZGlhbG9nICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBkaWFsb2cuc2V0Um91dGVTZWxlY3RvcihzZWxlY3Rvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgY2hvb3NlciBkaWFsb2cgaXMgYmVpbmcgY3JlYXRlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgdGhlIGRpYWxvZy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nIG9uQ3JlYXRlQ2hvb3NlckRpYWxvZygKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nKGNvbnRleHQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBEaWFsb2cgb25DcmVhdGVEaWFsb2coQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBtRGlhbG9nID0gb25DcmVhdGVDaG9vc2VyRGlhbG9nKGdldENvbnRleHQoKSwgc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgbURpYWxvZy5zZXRSb3V0ZVNlbGVjdG9yKGdldFJvdXRlU2VsZWN0b3IoKSk7Ci0gICAgICAgIHJldHVybiBtRGlhbG9nOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKLSAgICAgICAgc3VwZXIub25Db25maWd1cmF0aW9uQ2hhbmdlZChuZXdDb25maWcpOwotICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRGlhbG9nLnVwZGF0ZUxheW91dCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZy5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjBjZmNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2cuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0ODYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlQ29tcGF0LkFDVElPTl9QQVVTRTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZUNvbXBhdC5BQ1RJT05fUExBWTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZUNvbXBhdC5BQ1RJT05fUExBWV9QQVVTRTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZUNvbXBhdC5BQ1RJT05fU1RPUDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkFsZXJ0RGlhbG9nOwotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcEZhY3Rvcnk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuUmVtb3RlRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLk1lZGlhRGVzY3JpcHRpb25Db21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLk1lZGlhTWV0YWRhdGFDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLnNlc3Npb24uTWVkaWFDb250cm9sbGVyQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbkNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC51dGlsLk9iamVjdHNDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnRDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY3LmdyYXBoaWNzLlBhbGV0dGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0VGhlbWVXcmFwcGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5LZXlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXcuTWVhc3VyZVNwZWM7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld1RyZWVPYnNlcnZlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5RXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFjY2Vzc2liaWxpdHkuQWNjZXNzaWJpbGl0eU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFscGhhQW5pbWF0aW9uOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uU2V0OwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQW5pbWF0aW9uVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3I7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5UcmFuc2Zvcm1hdGlvbjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlRyYW5zbGF0ZUFuaW1hdGlvbjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVsYXRpdmVMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Vla0JhcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLlI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5PdmVybGF5TGlzdFZpZXcuT3ZlcmxheU9iamVjdDsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuVGltZVVuaXQ7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSByb3V0ZSBjb250cm9sbGVyIGRpYWxvZyBmb3Ige0BsaW5rIE1lZGlhUm91dGVyfS4KLSAqIDxwPgotICogVGhpcyBkaWFsb2cgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbnRyb2wgb3IgZGlzY29ubmVjdCBmcm9tIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUuCi0gKiA8L3A+Ci0gKgotICogQHNlZSBNZWRpYVJvdXRlQnV0dG9uCi0gKiBAc2VlIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlcgotICovCi1wdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2cgZXh0ZW5kcyBBbGVydERpYWxvZyB7Ci0gICAgLy8gVGFncyBzaG91bGQgYmUgbGVzcyB0aGFuIDI0IGNoYXJhY3RlcnMgbG9uZyAoc2VlIGRvY3MgZm9yIGFuZHJvaWQudXRpbC5Mb2cuaXNMb2dnYWJsZSgpKQotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVDdHJsRGlhbG9nIjsKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIC8vIFRpbWUgdG8gd2FpdCBiZWZvcmUgdXBkYXRpbmcgdGhlIHZvbHVtZSB3aGVuIHRoZSB1c2VyIGxldHMgZ28gb2YgdGhlIHNlZWsgYmFyCi0gICAgLy8gdG8gYWxsb3cgdGhlIHJvdXRlIHByb3ZpZGVyIHRpbWUgdG8gcHJvcGFnYXRlIHRoZSBjaGFuZ2UgYW5kIHB1Ymxpc2ggYSBuZXcKLSAgICAvLyByb3V0ZSBkZXNjcmlwdG9yLgotICAgIHN0YXRpYyBmaW5hbCBpbnQgVk9MVU1FX1VQREFURV9ERUxBWV9NSUxMSVMgPSA1MDA7Ci0gICAgc3RhdGljIGZpbmFsIGludCBDT05ORUNUSU9OX1RJTUVPVVRfTUlMTElTID0gKGludCkgVGltZVVuaXQuU0VDT05EUy50b01pbGxpcygzMEwpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVVFRPTl9ORVVUUkFMX1JFU19JRCA9IGFuZHJvaWQuUi5pZC5idXR0b24zOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgQlVUVE9OX0RJU0NPTk5FQ1RfUkVTX0lEID0gYW5kcm9pZC5SLmlkLmJ1dHRvbjI7Ci0gICAgc3RhdGljIGZpbmFsIGludCBCVVRUT05fU1RPUF9SRVNfSUQgPSBhbmRyb2lkLlIuaWQuYnV0dG9uMTsKLQotICAgIGZpbmFsIE1lZGlhUm91dGVyIG1Sb3V0ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlckNhbGxiYWNrIG1DYWxsYmFjazsKLSAgICBmaW5hbCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gbVJvdXRlOwotCi0gICAgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUNyZWF0ZWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1BdHRhY2hlZFRvV2luZG93OwotCi0gICAgcHJpdmF0ZSBpbnQgbURpYWxvZ0NvbnRlbnRXaWR0aDsKLQotICAgIHByaXZhdGUgVmlldyBtQ3VzdG9tQ29udHJvbFZpZXc7Ci0KLSAgICBwcml2YXRlIEJ1dHRvbiBtRGlzY29ubmVjdEJ1dHRvbjsKLSAgICBwcml2YXRlIEJ1dHRvbiBtU3RvcENhc3RpbmdCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtUGxheWJhY2tDb250cm9sQnV0dG9uOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbUNsb3NlQnV0dG9uOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uIG1Hcm91cEV4cGFuZENvbGxhcHNlQnV0dG9uOwotCi0gICAgcHJpdmF0ZSBGcmFtZUxheW91dCBtRXhwYW5kYWJsZUFyZWFMYXlvdXQ7Ci0gICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbURpYWxvZ0FyZWFMYXlvdXQ7Ci0gICAgRnJhbWVMYXlvdXQgbURlZmF1bHRDb250cm9sTGF5b3V0OwotICAgIHByaXZhdGUgRnJhbWVMYXlvdXQgbUN1c3RvbUNvbnRyb2xMYXlvdXQ7Ci0gICAgcHJpdmF0ZSBJbWFnZVZpZXcgbUFydFZpZXc7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtVGl0bGVWaWV3OwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVN1YnRpdGxlVmlldzsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1Sb3V0ZU5hbWVUZXh0VmlldzsKLQotICAgIHByaXZhdGUgYm9vbGVhbiBtVm9sdW1lQ29udHJvbEVuYWJsZWQgPSB0cnVlOwotICAgIC8vIExheW91dCBmb3IgbWVkaWEgY29udHJvbGxlcnMgaW5jbHVkaW5nIHBsYXkvcGF1c2UgYnV0dG9uIGFuZCB0aGUgbWFpbiB2b2x1bWUgc2xpZGVyLgotICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1NZWRpYU1haW5Db250cm9sTGF5b3V0OwotICAgIHByaXZhdGUgUmVsYXRpdmVMYXlvdXQgbVBsYXliYWNrQ29udHJvbExheW91dDsKLSAgICBwcml2YXRlIExpbmVhckxheW91dCBtVm9sdW1lQ29udHJvbExheW91dDsKLSAgICBwcml2YXRlIFZpZXcgbURpdmlkZXJWaWV3OwotCi0gICAgT3ZlcmxheUxpc3RWaWV3IG1Wb2x1bWVHcm91cExpc3Q7Ci0gICAgVm9sdW1lR3JvdXBBZGFwdGVyIG1Wb2x1bWVHcm91cEFkYXB0ZXI7Ci0gICAgcHJpdmF0ZSBMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gbUdyb3VwTWVtYmVyUm91dGVzOwotICAgIFNldDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkOwotICAgIHByaXZhdGUgU2V0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZDsKLSAgICBTZXQ8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiBtR3JvdXBNZW1iZXJSb3V0ZXNBbmltYXRpbmdXaXRoQml0bWFwOwotICAgIFNlZWtCYXIgbVZvbHVtZVNsaWRlcjsKLSAgICBWb2x1bWVDaGFuZ2VMaXN0ZW5lciBtVm9sdW1lQ2hhbmdlTGlzdGVuZXI7Ci0gICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIG1Sb3V0ZUluVm9sdW1lU2xpZGVyVG91Y2hlZDsKLSAgICBwcml2YXRlIGludCBtVm9sdW1lR3JvdXBMaXN0SXRlbUljb25TaXplOwotICAgIHByaXZhdGUgaW50IG1Wb2x1bWVHcm91cExpc3RJdGVtSGVpZ2h0OwotICAgIHByaXZhdGUgaW50IG1Wb2x1bWVHcm91cExpc3RNYXhIZWlnaHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVZvbHVtZUdyb3VwTGlzdFBhZGRpbmdUb3A7Ci0gICAgTWFwPE1lZGlhUm91dGVyLlJvdXRlSW5mbywgU2Vla0Jhcj4gbVZvbHVtZVNsaWRlck1hcDsKLQotICAgIE1lZGlhQ29udHJvbGxlckNvbXBhdCBtTWVkaWFDb250cm9sbGVyOwotICAgIE1lZGlhQ29udHJvbGxlckNhbGxiYWNrIG1Db250cm9sbGVyQ2FsbGJhY2s7Ci0gICAgUGxheWJhY2tTdGF0ZUNvbXBhdCBtU3RhdGU7Ci0gICAgTWVkaWFEZXNjcmlwdGlvbkNvbXBhdCBtRGVzY3JpcHRpb247Ci0KLSAgICBGZXRjaEFydFRhc2sgbUZldGNoQXJ0VGFzazsKLSAgICBCaXRtYXAgbUFydEljb25CaXRtYXA7Ci0gICAgVXJpIG1BcnRJY29uVXJpOwotICAgIGJvb2xlYW4gbUFydEljb25Jc0xvYWRlZDsKLSAgICBCaXRtYXAgbUFydEljb25Mb2FkZWRCaXRtYXA7Ci0gICAgaW50IG1BcnRJY29uQmFja2dyb3VuZENvbG9yOwotCi0gICAgYm9vbGVhbiBtSGFzUGVuZGluZ1VwZGF0ZTsKLSAgICBib29sZWFuIG1QZW5kaW5nVXBkYXRlQW5pbWF0aW9uTmVlZGVkOwotCi0gICAgYm9vbGVhbiBtSXNHcm91cEV4cGFuZGVkOwotICAgIGJvb2xlYW4gbUlzR3JvdXBMaXN0QW5pbWF0aW5nOwotICAgIGJvb2xlYW4gbUlzR3JvdXBMaXN0QW5pbWF0aW9uUGVuZGluZzsKLSAgICBpbnQgbUdyb3VwTGlzdEFuaW1hdGlvbkR1cmF0aW9uTXM7Ci0gICAgcHJpdmF0ZSBpbnQgbUdyb3VwTGlzdEZhZGVJbkR1cmF0aW9uTXM7Ci0gICAgcHJpdmF0ZSBpbnQgbUdyb3VwTGlzdEZhZGVPdXREdXJhdGlvbk1zOwotCi0gICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUludGVycG9sYXRvcjsKLSAgICBwcml2YXRlIEludGVycG9sYXRvciBtTGluZWFyT3V0U2xvd0luSW50ZXJwb2xhdG9yOwotICAgIHByaXZhdGUgSW50ZXJwb2xhdG9yIG1GYXN0T3V0U2xvd0luSW50ZXJwb2xhdG9yOwotICAgIHByaXZhdGUgSW50ZXJwb2xhdG9yIG1BY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvcjsKLQotICAgIGZpbmFsIEFjY2Vzc2liaWxpdHlNYW5hZ2VyIG1BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKLQotICAgIFJ1bm5hYmxlIG1Hcm91cExpc3RGYWRlSW5BbmltYXRpb24gPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBzdGFydEdyb3VwTGlzdEZhZGVJbkFuaW1hdGlvbigpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2coQ29udGV4dCBjb250ZXh0LCBpbnQgdGhlbWUpIHsKLSAgICAgICAgLy8gVE9ETyAoYi83Mjk3NTk3Nik6IEF2b2lkIHRvIHVzZSBDb250ZXh0VGhlbWVXcmFwcGVyIHdpdGggYXBwIGNvbnRleHQgYW5kIGxpYiB0aGVtZS4KLSAgICAgICAgc3VwZXIobmV3IENvbnRleHRUaGVtZVdyYXBwZXIoY29udGV4dCwgQXBpSGVscGVyLmdldExpYlRoZW1lKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRSb3V0ZXJUaGVtZUlkKGNvbnRleHQpKSksIHRoZW1lKTsKLSAgICAgICAgbUNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0KLSAgICAgICAgbUNvbnRyb2xsZXJDYWxsYmFjayA9IG5ldyBNZWRpYUNvbnRyb2xsZXJDYWxsYmFjaygpOwotICAgICAgICBtUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UobUNvbnRleHQpOwotICAgICAgICBtQ2FsbGJhY2sgPSBuZXcgTWVkaWFSb3V0ZXJDYWxsYmFjaygpOwotICAgICAgICBtUm91dGUgPSBtUm91dGVyLmdldFNlbGVjdGVkUm91dGUoKTsKLSAgICAgICAgc2V0TWVkaWFTZXNzaW9uKG1Sb3V0ZXIuZ2V0TWVkaWFTZXNzaW9uVG9rZW4oKSk7Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3RQYWRkaW5nVG9wID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X3BhZGRpbmdfdG9wKTsKLSAgICAgICAgbUFjY2Vzc2liaWxpdHlNYW5hZ2VyID0KLSAgICAgICAgICAgICAgICAoQWNjZXNzaWJpbGl0eU1hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BQ0NFU1NJQklMSVRZX1NFUlZJQ0UpOwotICAgICAgICBtTGluZWFyT3V0U2xvd0luSW50ZXJwb2xhdG9yID0gQW5pbWF0aW9uVXRpbHMubG9hZEludGVycG9sYXRvcigKLSAgICAgICAgICAgICAgICBtQ29udGV4dCwgYW5kcm9pZC5SLmludGVycG9sYXRvci5saW5lYXJfb3V0X3Nsb3dfaW4pOwotICAgICAgICBtRmFzdE91dFNsb3dJbkludGVycG9sYXRvciA9IEFuaW1hdGlvblV0aWxzLmxvYWRJbnRlcnBvbGF0b3IoCi0gICAgICAgICAgICAgICAgbUNvbnRleHQsIGFuZHJvaWQuUi5pbnRlcnBvbGF0b3IuZmFzdF9vdXRfc2xvd19pbik7Ci0gICAgICAgIG1BY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvciA9IG5ldyBBY2NlbGVyYXRlRGVjZWxlcmF0ZUludGVycG9sYXRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdXRlIHRoYXQgdGhpcyBkaWFsb2cgaXMgY29udHJvbGxpbmcuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBnZXRSb3V0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1Sb3V0ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVyLlJvdXRlR3JvdXAgZ2V0R3JvdXAoKSB7Ci0gICAgICAgIGlmIChtUm91dGUgaW5zdGFuY2VvZiBNZWRpYVJvdXRlci5Sb3V0ZUdyb3VwKSB7Ci0gICAgICAgICAgICByZXR1cm4gKE1lZGlhUm91dGVyLlJvdXRlR3JvdXApIG1Sb3V0ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm92aWRlcyB0aGUgc3ViY2xhc3MgYW4gb3Bwb3J0dW5pdHkgdG8gY3JlYXRlIGEgdmlldyB0aGF0IHdpbGwgcmVwbGFjZSB0aGUgZGVmYXVsdCBtZWRpYQotICAgICAqIGNvbnRyb2xzIGZvciB0aGUgY3VycmVudGx5IHBsYXlpbmcgY29udGVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzYXZlZEluc3RhbmNlU3RhdGUgVGhlIGRpYWxvZydzIHNhdmVkIGluc3RhbmNlIHN0YXRlLgotICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIGNvbnRyb2wgdmlldywgb3IgbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyBWaWV3IG9uQ3JlYXRlTWVkaWFDb250cm9sVmlldyhCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1lZGlhIGNvbnRyb2wgdmlldyB0aGF0IHdhcyBjcmVhdGVkIGJ5IHtAbGluayAjb25DcmVhdGVNZWRpYUNvbnRyb2xWaWV3KEJ1bmRsZSl9LgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbWVkaWEgY29udHJvbCB2aWV3LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIFZpZXcgZ2V0TWVkaWFDb250cm9sVmlldygpIHsKLSAgICAgICAgcmV0dXJuIG1DdXN0b21Db250cm9sVmlldzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgdG8gZW5hYmxlIHRoZSB2b2x1bWUgc2xpZGVyIGFuZCB2b2x1bWUgY29udHJvbCB1c2luZyB0aGUgdm9sdW1lIGtleXMKLSAgICAgKiB3aGVuIHRoZSByb3V0ZSBzdXBwb3J0cyBpdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBpcyB0cnVlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRWb2x1bWVDb250cm9sRW5hYmxlZChib29sZWFuIGVuYWJsZSkgewotICAgICAgICBpZiAobVZvbHVtZUNvbnRyb2xFbmFibGVkICE9IGVuYWJsZSkgewotICAgICAgICAgICAgbVZvbHVtZUNvbnRyb2xFbmFibGVkID0gZW5hYmxlOwotICAgICAgICAgICAgaWYgKG1DcmVhdGVkKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgd2hldGhlciB0byBlbmFibGUgdGhlIHZvbHVtZSBzbGlkZXIgYW5kIHZvbHVtZSBjb250cm9sIHVzaW5nIHRoZSB2b2x1bWUga2V5cwotICAgICAqIHdoZW4gdGhlIHJvdXRlIHN1cHBvcnRzIGl0LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVm9sdW1lQ29udHJvbEVuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBtVm9sdW1lQ29udHJvbEVuYWJsZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBzZXNzaW9uIHRvIHVzZSBmb3IgbWV0YWRhdGEgYW5kIHRyYW5zcG9ydCBjb250cm9scy4gVGhlIGRpYWxvZwotICAgICAqIHdpbGwgbGlzdGVuIHRvIGNoYW5nZXMgb24gdGhpcyBzZXNzaW9uIGFuZCB1cGRhdGUgdGhlIFVJIGF1dG9tYXRpY2FsbHkgaW4KLSAgICAgKiByZXNwb25zZSB0byBjaGFuZ2VzLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlc3Npb25Ub2tlbiBUaGUgdG9rZW4gZm9yIHRoZSBzZXNzaW9uIHRvIHVzZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0TWVkaWFTZXNzaW9uKE1lZGlhU2Vzc2lvbkNvbXBhdC5Ub2tlbiBzZXNzaW9uVG9rZW4pIHsKLSAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci51bnJlZ2lzdGVyQ2FsbGJhY2sobUNvbnRyb2xsZXJDYWxsYmFjayk7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2Vzc2lvblRva2VuID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1BdHRhY2hlZFRvV2luZG93KSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIgPSBuZXcgTWVkaWFDb250cm9sbGVyQ29tcGF0KG1Db250ZXh0LCBzZXNzaW9uVG9rZW4pOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiRXJyb3IgY3JlYXRpbmcgbWVkaWEgY29udHJvbGxlciBpbiBzZXRNZWRpYVNlc3Npb24uIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5yZWdpc3RlckNhbGxiYWNrKG1Db250cm9sbGVyQ2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICAgIE1lZGlhTWV0YWRhdGFDb21wYXQgbWV0YWRhdGEgPSBtTWVkaWFDb250cm9sbGVyID09IG51bGwgPyBudWxsCi0gICAgICAgICAgICAgICAgOiBtTWVkaWFDb250cm9sbGVyLmdldE1ldGFkYXRhKCk7Ci0gICAgICAgIG1EZXNjcmlwdGlvbiA9IG1ldGFkYXRhID09IG51bGwgPyBudWxsIDogbWV0YWRhdGEuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgbVN0YXRlID0gbU1lZGlhQ29udHJvbGxlciA9PSBudWxsID8gbnVsbCA6IG1NZWRpYUNvbnRyb2xsZXIuZ2V0UGxheWJhY2tTdGF0ZSgpOwotICAgICAgICB1cGRhdGVBcnRJY29uSWZOZWVkZWQoKTsKLSAgICAgICAgdXBkYXRlKGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzZXNzaW9uIHRvIHVzZSBmb3IgbWV0YWRhdGEgYW5kIHRyYW5zcG9ydCBjb250cm9scy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHRva2VuIGZvciB0aGUgc2Vzc2lvbiB0byB1c2Ugb3IgbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVNlc3Npb25Db21wYXQuVG9rZW4gZ2V0TWVkaWFTZXNzaW9uKCkgewotICAgICAgICByZXR1cm4gbU1lZGlhQ29udHJvbGxlciA9PSBudWxsID8gbnVsbCA6IG1NZWRpYUNvbnRyb2xsZXIuZ2V0U2Vzc2lvblRva2VuKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25DcmVhdGUoQnVuZGxlIHNhdmVkSW5zdGFuY2VTdGF0ZSkgewotICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotCi0gICAgICAgIGdldFdpbmRvdygpLnNldEJhY2tncm91bmREcmF3YWJsZVJlc291cmNlKGFuZHJvaWQuUi5jb2xvci50cmFuc3BhcmVudCk7Ci0KLSAgICAgICAgc2V0Q29udGVudFZpZXcoQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUNvbnRleHQsCi0gICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlRoZW1lKG1Db250ZXh0LCBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFJvdXRlclRoZW1lSWQobUNvbnRleHQpKSwKLSAgICAgICAgICAgICAgICBSLmxheW91dC5tcl9jb250cm9sbGVyX21hdGVyaWFsX2RpYWxvZ19iKSk7Ci0KLSAgICAgICAgLy8gUmVtb3ZlIHRoZSBuZXV0cmFsIGJ1dHRvbi4KLSAgICAgICAgZmluZFZpZXdCeUlkKEJVVFRPTl9ORVVUUkFMX1JFU19JRCkuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotCi0gICAgICAgIENsaWNrTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQ2xpY2tMaXN0ZW5lcigpOwotCi0gICAgICAgIG1FeHBhbmRhYmxlQXJlYUxheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2V4cGFuZGFibGVfYXJlYSk7Ci0gICAgICAgIG1FeHBhbmRhYmxlQXJlYUxheW91dC5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIG1EaWFsb2dBcmVhTGF5b3V0ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfZGlhbG9nX2FyZWEpOwotICAgICAgICBtRGlhbG9nQXJlYUxheW91dC5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgICAgIC8vIEVhdCB1bmhhbmRsZWQgdG91Y2ggZXZlbnRzLgotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgaW50IGNvbG9yID0gTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRCdXR0b25UZXh0Q29sb3IobUNvbnRleHQpOwotICAgICAgICBtRGlzY29ubmVjdEJ1dHRvbiA9IGZpbmRWaWV3QnlJZChCVVRUT05fRElTQ09OTkVDVF9SRVNfSUQpOwotICAgICAgICBtRGlzY29ubmVjdEJ1dHRvbi5zZXRUZXh0KAotICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldFN0cmluZyhSLnN0cmluZy5tcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QpKTsKLSAgICAgICAgbURpc2Nvbm5lY3RCdXR0b24uc2V0VGV4dENvbG9yKGNvbG9yKTsKLSAgICAgICAgbURpc2Nvbm5lY3RCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKGxpc3RlbmVyKTsKLQotICAgICAgICBtU3RvcENhc3RpbmdCdXR0b24gPSBmaW5kVmlld0J5SWQoQlVUVE9OX1NUT1BfUkVTX0lEKTsKLSAgICAgICAgbVN0b3BDYXN0aW5nQnV0dG9uLnNldFRleHQoCi0gICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0U3RyaW5nKFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nKSk7Ci0gICAgICAgIG1TdG9wQ2FzdGluZ0J1dHRvbi5zZXRUZXh0Q29sb3IoY29sb3IpOwotICAgICAgICBtU3RvcENhc3RpbmdCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKGxpc3RlbmVyKTsKLQotICAgICAgICBtUm91dGVOYW1lVGV4dFZpZXcgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9uYW1lKTsKLSAgICAgICAgbUNsb3NlQnV0dG9uID0gZmluZFZpZXdCeUlkKFIuaWQubXJfY2xvc2UpOwotICAgICAgICBtQ2xvc2VCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgbUN1c3RvbUNvbnRyb2xMYXlvdXQgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9jdXN0b21fY29udHJvbCk7Ci0gICAgICAgIG1EZWZhdWx0Q29udHJvbExheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2RlZmF1bHRfY29udHJvbCk7Ci0KLSAgICAgICAgLy8gU3RhcnQgdGhlIHNlc3Npb24gYWN0aXZpdHkgd2hlbiBhIGNvbnRlbnQgaXRlbSAoYWxidW0gYXJ0LCB0aXRsZSBvciBzdWJ0aXRsZSkgaXMgY2xpY2tlZC4KLSAgICAgICAgVmlldy5PbkNsaWNrTGlzdGVuZXIgb25DbGlja0xpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgICAgIGlmIChtTWVkaWFDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgUGVuZGluZ0ludGVudCBwaSA9IG1NZWRpYUNvbnRyb2xsZXIuZ2V0U2Vzc2lvbkFjdGl2aXR5KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpLnNlbmQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNtaXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChQZW5kaW5nSW50ZW50LkNhbmNlbGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsIHBpICsgIiB3YXMgbm90IHNlbnQsIGl0IGhhZCBiZWVuIGNhbmNlbGVkLiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBtQXJ0VmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2FydCk7Ci0gICAgICAgIG1BcnRWaWV3LnNldE9uQ2xpY2tMaXN0ZW5lcihvbkNsaWNrTGlzdGVuZXIpOwotICAgICAgICBmaW5kVmlld0J5SWQoUi5pZC5tcl9jb250cm9sX3RpdGxlX2NvbnRhaW5lcikuc2V0T25DbGlja0xpc3RlbmVyKG9uQ2xpY2tMaXN0ZW5lcik7Ci0KLSAgICAgICAgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9tZWRpYV9tYWluX2NvbnRyb2wpOwotICAgICAgICBtRGl2aWRlclZpZXcgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9jb250cm9sX2RpdmlkZXIpOwotCi0gICAgICAgIG1QbGF5YmFja0NvbnRyb2xMYXlvdXQgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9wbGF5YmFja19jb250cm9sKTsKLSAgICAgICAgbVRpdGxlVmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2NvbnRyb2xfdGl0bGUpOwotICAgICAgICBtU3VidGl0bGVWaWV3ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfY29udHJvbF9zdWJ0aXRsZSk7Ci0gICAgICAgIG1QbGF5YmFja0NvbnRyb2xCdXR0b24gPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9jb250cm9sX3BsYXliYWNrX2N0cmwpOwotICAgICAgICBtUGxheWJhY2tDb250cm9sQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihsaXN0ZW5lcik7Ci0KLSAgICAgICAgbVZvbHVtZUNvbnRyb2xMYXlvdXQgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl92b2x1bWVfY29udHJvbCk7Ci0gICAgICAgIG1Wb2x1bWVDb250cm9sTGF5b3V0LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgbVZvbHVtZVNsaWRlciA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX3ZvbHVtZV9zbGlkZXIpOwotICAgICAgICBtVm9sdW1lU2xpZGVyLnNldFRhZyhtUm91dGUpOwotICAgICAgICBtVm9sdW1lQ2hhbmdlTGlzdGVuZXIgPSBuZXcgVm9sdW1lQ2hhbmdlTGlzdGVuZXIoKTsKLSAgICAgICAgbVZvbHVtZVNsaWRlci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcihtVm9sdW1lQ2hhbmdlTGlzdGVuZXIpOwotCi0gICAgICAgIG1Wb2x1bWVHcm91cExpc3QgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl92b2x1bWVfZ3JvdXBfbGlzdCk7Ci0gICAgICAgIG1Hcm91cE1lbWJlclJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPigpOwotICAgICAgICBtVm9sdW1lR3JvdXBBZGFwdGVyID0gbmV3IFZvbHVtZUdyb3VwQWRhcHRlcihtVm9sdW1lR3JvdXBMaXN0LmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXMpOwotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnNldEFkYXB0ZXIobVZvbHVtZUdyb3VwQWRhcHRlcik7Ci0gICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc0FuaW1hdGluZ1dpdGhCaXRtYXAgPSBuZXcgSGFzaFNldDw+KCk7Ci0KLSAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5zZXRNZWRpYUNvbnRyb2xzQmFja2dyb3VuZENvbG9yKG1Db250ZXh0LAotICAgICAgICAgICAgICAgIG1NZWRpYU1haW5Db250cm9sTGF5b3V0LCBtVm9sdW1lR3JvdXBMaXN0LCBnZXRHcm91cCgpICE9IG51bGwpOwotICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLnNldFZvbHVtZVNsaWRlckNvbG9yKG1Db250ZXh0LAotICAgICAgICAgICAgICAgIChNZWRpYVJvdXRlVm9sdW1lU2xpZGVyKSBtVm9sdW1lU2xpZGVyLCBtTWVkaWFNYWluQ29udHJvbExheW91dCk7Ci0gICAgICAgIG1Wb2x1bWVTbGlkZXJNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIG1Wb2x1bWVTbGlkZXJNYXAucHV0KG1Sb3V0ZSwgbVZvbHVtZVNsaWRlcik7Ci0KLSAgICAgICAgbUdyb3VwRXhwYW5kQ29sbGFwc2VCdXR0b24gPQotICAgICAgICAgICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLm1yX2dyb3VwX2V4cGFuZF9jb2xsYXBzZSk7Ci0gICAgICAgIG1Hcm91cEV4cGFuZENvbGxhcHNlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgbUlzR3JvdXBFeHBhbmRlZCA9ICFtSXNHcm91cEV4cGFuZGVkOwotICAgICAgICAgICAgICAgIGlmIChtSXNHcm91cEV4cGFuZGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsb2FkSW50ZXJwb2xhdG9yKCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0SGVpZ2h0KHRydWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgbG9hZEludGVycG9sYXRvcigpOwotICAgICAgICBtR3JvdXBMaXN0QW5pbWF0aW9uRHVyYXRpb25NcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldEludGVnZXIoCi0gICAgICAgICAgICAgICAgUi5pbnRlZ2VyLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfYW5pbWF0aW9uX2R1cmF0aW9uX21zKTsKLSAgICAgICAgbUdyb3VwTGlzdEZhZGVJbkR1cmF0aW9uTXMgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRJbnRlZ2VyKAotICAgICAgICAgICAgICAgIFIuaW50ZWdlci5tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2ZhZGVfaW5fZHVyYXRpb25fbXMpOwotICAgICAgICBtR3JvdXBMaXN0RmFkZU91dER1cmF0aW9uTXMgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRJbnRlZ2VyKAotICAgICAgICAgICAgICAgIFIuaW50ZWdlci5tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2ZhZGVfb3V0X2R1cmF0aW9uX21zKTsKLQotICAgICAgICBtQ3VzdG9tQ29udHJvbFZpZXcgPSBvbkNyZWF0ZU1lZGlhQ29udHJvbFZpZXcoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAgICAgICAgaWYgKG1DdXN0b21Db250cm9sVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ3VzdG9tQ29udHJvbExheW91dC5hZGRWaWV3KG1DdXN0b21Db250cm9sVmlldyk7Ci0gICAgICAgICAgICBtQ3VzdG9tQ29udHJvbExheW91dC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUNyZWF0ZWQgPSB0cnVlOwotICAgICAgICB1cGRhdGVMYXlvdXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB3aWR0aCBvZiB0aGUgZGlhbG9nLiBBbHNvIGNhbGxlZCB3aGVuIGNvbmZpZ3VyYXRpb24gY2hhbmdlcy4KLSAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZUxheW91dCgpIHsKLSAgICAgICAgaW50IHdpZHRoID0gTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5nZXREaWFsb2dXaWR0aChtQ29udGV4dCk7Ci0gICAgICAgIGdldFdpbmRvdygpLnNldExheW91dCh3aWR0aCwgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQpOwotCi0gICAgICAgIFZpZXcgZGVjb3JWaWV3ID0gZ2V0V2luZG93KCkuZ2V0RGVjb3JWaWV3KCk7Ci0gICAgICAgIG1EaWFsb2dDb250ZW50V2lkdGggPSB3aWR0aCAtIGRlY29yVmlldy5nZXRQYWRkaW5nTGVmdCgpIC0gZGVjb3JWaWV3LmdldFBhZGRpbmdSaWdodCgpOwotCi0gICAgICAgIFJlc291cmNlcyByZXMgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KTsKLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdEl0ZW1JY29uU2l6ZSA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faWNvbl9zaXplKTsKLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdEl0ZW1IZWlnaHQgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgIFIuZGltZW4ubXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2hlaWdodCk7Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3RNYXhIZWlnaHQgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgIFIuZGltZW4ubXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9tYXhfaGVpZ2h0KTsKLQotICAgICAgICAvLyBGZXRjaCBhcnQgaWNvbnMgYWdhaW4gZm9yIGxheW91dCBjaGFuZ2VzIHRvIHJlc2l6ZSBpdCBhY2NvcmRpbmdseQotICAgICAgICBtQXJ0SWNvbkJpdG1hcCA9IG51bGw7Ci0gICAgICAgIG1BcnRJY29uVXJpID0gbnVsbDsKLSAgICAgICAgdXBkYXRlQXJ0SWNvbklmTmVlZGVkKCk7Ci0gICAgICAgIHVwZGF0ZShmYWxzZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKLSAgICAgICAgbUF0dGFjaGVkVG9XaW5kb3cgPSB0cnVlOwotCi0gICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2soTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZLCBtQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UUyk7Ci0gICAgICAgIHNldE1lZGlhU2Vzc2lvbihtUm91dGVyLmdldE1lZGlhU2Vzc2lvblRva2VuKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgewotICAgICAgICBtUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7Ci0gICAgICAgIHNldE1lZGlhU2Vzc2lvbihudWxsKTsKLSAgICAgICAgbUF0dGFjaGVkVG9XaW5kb3cgPSBmYWxzZTsKLSAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvbktleURvd24oaW50IGtleUNvZGUsIEtleUV2ZW50IGV2ZW50KSB7Ci0gICAgICAgIGlmIChrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfVk9MVU1FX0RPV04KLSAgICAgICAgICAgICAgICB8fCBrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfVk9MVU1FX1VQKSB7Ci0gICAgICAgICAgICBtUm91dGUucmVxdWVzdFVwZGF0ZVZvbHVtZShrZXlDb2RlID09IEtleUV2ZW50LktFWUNPREVfVk9MVU1FX0RPV04gPyAtMSA6IDEpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5RG93bihrZXlDb2RlLCBldmVudCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25LZXlVcChpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfRE9XTgotICAgICAgICAgICAgICAgIHx8IGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfVVApIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5vbktleVVwKGtleUNvZGUsIGV2ZW50KTsKLSAgICB9Ci0KLSAgICB2b2lkIHVwZGF0ZShib29sZWFuIGFuaW1hdGUpIHsKLSAgICAgICAgLy8gRGVmZXIgZGlhbG9nIHVwZGF0ZXMgaWYgYSB1c2VyIGlzIGFkanVzdGluZyBhIHZvbHVtZSBpbiB0aGUgbGlzdAotICAgICAgICBpZiAobVJvdXRlSW5Wb2x1bWVTbGlkZXJUb3VjaGVkICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1IYXNQZW5kaW5nVXBkYXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIG1QZW5kaW5nVXBkYXRlQW5pbWF0aW9uTmVlZGVkIHw9IGFuaW1hdGU7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUhhc1BlbmRpbmdVcGRhdGUgPSBmYWxzZTsKLSAgICAgICAgbVBlbmRpbmdVcGRhdGVBbmltYXRpb25OZWVkZWQgPSBmYWxzZTsKLSAgICAgICAgaWYgKCFtUm91dGUuaXNTZWxlY3RlZCgpIHx8IG1Sb3V0ZS5pc0RlZmF1bHRPckJsdWV0b290aCgpKSB7Ci0gICAgICAgICAgICBkaXNtaXNzKCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtQ3JlYXRlZCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbVJvdXRlTmFtZVRleHRWaWV3LnNldFRleHQobVJvdXRlLmdldE5hbWUoKSk7Ci0gICAgICAgIG1EaXNjb25uZWN0QnV0dG9uLnNldFZpc2liaWxpdHkobVJvdXRlLmNhbkRpc2Nvbm5lY3QoKSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0gICAgICAgIGlmIChtQ3VzdG9tQ29udHJvbFZpZXcgPT0gbnVsbCAmJiBtQXJ0SWNvbklzTG9hZGVkKSB7Ci0gICAgICAgICAgICBpZiAoaXNCaXRtYXBSZWN5Y2xlZChtQXJ0SWNvbkxvYWRlZEJpdG1hcCkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW4ndCBzZXQgYXJ0d29yayBpbWFnZSB3aXRoIHJlY3ljbGVkIGJpdG1hcDogIiArIG1BcnRJY29uTG9hZGVkQml0bWFwKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUFydFZpZXcuc2V0SW1hZ2VCaXRtYXAobUFydEljb25Mb2FkZWRCaXRtYXApOwotICAgICAgICAgICAgICAgIG1BcnRWaWV3LnNldEJhY2tncm91bmRDb2xvcihtQXJ0SWNvbkJhY2tncm91bmRDb2xvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbGVhckxvYWRlZEJpdG1hcCgpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVZvbHVtZUNvbnRyb2xMYXlvdXQoKTsKLSAgICAgICAgdXBkYXRlUGxheWJhY2tDb250cm9sTGF5b3V0KCk7Ci0gICAgICAgIHVwZGF0ZUxheW91dEhlaWdodChhbmltYXRlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNCaXRtYXBSZWN5Y2xlZChCaXRtYXAgYml0bWFwKSB7Ci0gICAgICAgIHJldHVybiBiaXRtYXAgIT0gbnVsbCAmJiBiaXRtYXAuaXNSZWN5Y2xlZCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KCkgewotICAgICAgICByZXR1cm4gbUN1c3RvbUNvbnRyb2xWaWV3ID09IG51bGwgJiYgKG1EZXNjcmlwdGlvbiAhPSBudWxsIHx8IG1TdGF0ZSAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBoZWlnaHQgb2YgbWFpbiBtZWRpYSBjb250cm9sbGVyIHdoaWNoIGluY2x1ZGVzIHBsYXliYWNrIGNvbnRyb2wgYW5kIG1hc3RlcgotICAgICAqIHZvbHVtZSBjb250cm9sLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IGdldE1haW5Db250cm9sbGVySGVpZ2h0KGJvb2xlYW4gc2hvd1BsYXliYWNrQ29udHJvbCkgewotICAgICAgICBpbnQgaGVpZ2h0ID0gMDsKLSAgICAgICAgaWYgKHNob3dQbGF5YmFja0NvbnRyb2wgfHwgbVZvbHVtZUNvbnRyb2xMYXlvdXQuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgewotICAgICAgICAgICAgaGVpZ2h0ICs9IG1NZWRpYU1haW5Db250cm9sTGF5b3V0LmdldFBhZGRpbmdUb3AoKQotICAgICAgICAgICAgICAgICAgICArIG1NZWRpYU1haW5Db250cm9sTGF5b3V0LmdldFBhZGRpbmdCb3R0b20oKTsKLSAgICAgICAgICAgIGlmIChzaG93UGxheWJhY2tDb250cm9sKSB7Ci0gICAgICAgICAgICAgICAgaGVpZ2h0ICs9ICBtUGxheWJhY2tDb250cm9sTGF5b3V0LmdldE1lYXN1cmVkSGVpZ2h0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVZvbHVtZUNvbnRyb2xMYXlvdXQuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgewotICAgICAgICAgICAgICAgIGhlaWdodCArPSBtVm9sdW1lQ29udHJvbExheW91dC5nZXRNZWFzdXJlZEhlaWdodCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNob3dQbGF5YmFja0NvbnRyb2wgJiYgbVZvbHVtZUNvbnRyb2xMYXlvdXQuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgewotICAgICAgICAgICAgICAgIGhlaWdodCArPSBtRGl2aWRlclZpZXcuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGVpZ2h0OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVNZWRpYUNvbnRyb2xWaXNpYmlsaXR5KGJvb2xlYW4gY2FuU2hvd1BsYXliYWNrQ29udHJvbExheW91dCkgewotICAgICAgICAvLyBUT0RPOiBVcGRhdGUgdGhlIHRvcCBhbmQgYm90dG9tIHBhZGRpbmcgb2YgdGhlIGNvbnRyb2wgbGF5b3V0IGFjY29yZGluZyB0byB0aGUgZGlzcGxheQotICAgICAgICAvLyBoZWlnaHQuCi0gICAgICAgIG1EaXZpZGVyVmlldy5zZXRWaXNpYmlsaXR5KChtVm9sdW1lQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFCi0gICAgICAgICAgICAgICAgJiYgY2FuU2hvd1BsYXliYWNrQ29udHJvbExheW91dCkgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotICAgICAgICBtTWVkaWFNYWluQ29udHJvbExheW91dC5zZXRWaXNpYmlsaXR5KChtVm9sdW1lQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5HT05FCi0gICAgICAgICAgICAgICAgJiYgIWNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQpID8gVmlldy5HT05FIDogVmlldy5WSVNJQkxFKTsKLSAgICB9Ci0KLSAgICB2b2lkIHVwZGF0ZUxheW91dEhlaWdodChmaW5hbCBib29sZWFuIGFuaW1hdGUpIHsKLSAgICAgICAgLy8gV2UgbmVlZCB0byBkZWZlciB0aGUgdXBkYXRlIHVudGlsIHRoZSBmaXJzdCBsYXlvdXQgaGFzIG9jY3VycmVkLCBhcyB3ZSBkb24ndCB5ZXQga25vdyB0aGUKLSAgICAgICAgLy8gb3ZlcmFsbCB2aXNpYmxlIGRpc3BsYXkgc2l6ZSBpbiB3aGljaCB0aGUgd2luZG93IHRoaXMgdmlldyBpcyBhdHRhY2hlZCB0byBoYXMgYmVlbgotICAgICAgICAvLyBwb3NpdGlvbmVkIGluLgotICAgICAgICBtRGVmYXVsdENvbnRyb2xMYXlvdXQucmVxdWVzdExheW91dCgpOwotICAgICAgICBWaWV3VHJlZU9ic2VydmVyIG9ic2VydmVyID0gbURlZmF1bHRDb250cm9sTGF5b3V0LmdldFZpZXdUcmVlT2JzZXJ2ZXIoKTsKLSAgICAgICAgb2JzZXJ2ZXIuYWRkT25HbG9iYWxMYXlvdXRMaXN0ZW5lcihuZXcgVmlld1RyZWVPYnNlcnZlci5Pbkdsb2JhbExheW91dExpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkdsb2JhbExheW91dCgpIHsKLSAgICAgICAgICAgICAgICBtRGVmYXVsdENvbnRyb2xMYXlvdXQuZ2V0Vmlld1RyZWVPYnNlcnZlcigpLnJlbW92ZUdsb2JhbE9uTGF5b3V0TGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICAgICAgaWYgKG1Jc0dyb3VwTGlzdEFuaW1hdGluZykgewotICAgICAgICAgICAgICAgICAgICBtSXNHcm91cExpc3RBbmltYXRpb25QZW5kaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXRIZWlnaHRJbnRlcm5hbChhbmltYXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVwZGF0ZXMgdGhlIGhlaWdodCBvZiB2aWV3cyBhbmQgaGlkZSBhcnR3b3JrIG9yIG1ldGFkYXRhIGlmIHNwYWNlIGlzIGxpbWl0ZWQuCi0gICAgICovCi0gICAgdm9pZCB1cGRhdGVMYXlvdXRIZWlnaHRJbnRlcm5hbChib29sZWFuIGFuaW1hdGUpIHsKLSAgICAgICAgLy8gTWVhc3VyZSB0aGUgc2l6ZSBvZiB3aWRnZXRzIGFuZCBnZXQgdGhlIGhlaWdodCBvZiBtYWluIGNvbXBvbmVudHMuCi0gICAgICAgIGludCBvbGRIZWlnaHQgPSBnZXRMYXlvdXRIZWlnaHQobU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQpOwotICAgICAgICBzZXRMYXlvdXRIZWlnaHQobU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQsIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKLSAgICAgICAgdXBkYXRlTWVkaWFDb250cm9sVmlzaWJpbGl0eShjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KCkpOwotICAgICAgICBWaWV3IGRlY29yVmlldyA9IGdldFdpbmRvdygpLmdldERlY29yVmlldygpOwotICAgICAgICBkZWNvclZpZXcubWVhc3VyZSgKLSAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoZ2V0V2luZG93KCkuZ2V0QXR0cmlidXRlcygpLndpZHRoLCBNZWFzdXJlU3BlYy5FWEFDVExZKSwKLSAgICAgICAgICAgICAgICBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRCk7Ci0gICAgICAgIHNldExheW91dEhlaWdodChtTWVkaWFNYWluQ29udHJvbExheW91dCwgb2xkSGVpZ2h0KTsKLSAgICAgICAgaW50IGFydFZpZXdIZWlnaHQgPSAwOwotICAgICAgICBpZiAobUN1c3RvbUNvbnRyb2xWaWV3ID09IG51bGwgJiYgbUFydFZpZXcuZ2V0RHJhd2FibGUoKSBpbnN0YW5jZW9mIEJpdG1hcERyYXdhYmxlKSB7Ci0gICAgICAgICAgICBCaXRtYXAgYXJ0ID0gKChCaXRtYXBEcmF3YWJsZSkgbUFydFZpZXcuZ2V0RHJhd2FibGUoKSkuZ2V0Qml0bWFwKCk7Ci0gICAgICAgICAgICBpZiAoYXJ0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhcnRWaWV3SGVpZ2h0ID0gZ2V0RGVzaXJlZEFydEhlaWdodChhcnQuZ2V0V2lkdGgoKSwgYXJ0LmdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICBtQXJ0Vmlldy5zZXRTY2FsZVR5cGUoYXJ0LmdldFdpZHRoKCkgPj0gYXJ0LmdldEhlaWdodCgpCi0gICAgICAgICAgICAgICAgICAgICAgICA/IEltYWdlVmlldy5TY2FsZVR5cGUuRklUX1hZIDogSW1hZ2VWaWV3LlNjYWxlVHlwZS5GSVRfQ0VOVEVSKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnQgbWFpbkNvbnRyb2xsZXJIZWlnaHQgPSBnZXRNYWluQ29udHJvbGxlckhlaWdodChjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KCkpOwotICAgICAgICBpbnQgdm9sdW1lR3JvdXBMaXN0Q291bnQgPSBtR3JvdXBNZW1iZXJSb3V0ZXMuc2l6ZSgpOwotICAgICAgICAvLyBTY2FsZSBkb3duIHZvbHVtZSBncm91cCBsaXN0IGl0ZW1zIGluIGxhbmRzY2FwZSBtb2RlLgotICAgICAgICBpbnQgZXhwYW5kZWRHcm91cExpc3RIZWlnaHQgPSBnZXRHcm91cCgpID09IG51bGwgPyAwIDoKLSAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBMaXN0SXRlbUhlaWdodCAqIGdldEdyb3VwKCkuZ2V0Um91dGVzKCkuc2l6ZSgpOwotICAgICAgICBpZiAodm9sdW1lR3JvdXBMaXN0Q291bnQgPiAwKSB7Ci0gICAgICAgICAgICBleHBhbmRlZEdyb3VwTGlzdEhlaWdodCArPSBtVm9sdW1lR3JvdXBMaXN0UGFkZGluZ1RvcDsKLSAgICAgICAgfQotICAgICAgICBleHBhbmRlZEdyb3VwTGlzdEhlaWdodCA9IE1hdGgubWluKGV4cGFuZGVkR3JvdXBMaXN0SGVpZ2h0LCBtVm9sdW1lR3JvdXBMaXN0TWF4SGVpZ2h0KTsKLSAgICAgICAgaW50IHZpc2libGVHcm91cExpc3RIZWlnaHQgPSBtSXNHcm91cEV4cGFuZGVkID8gZXhwYW5kZWRHcm91cExpc3RIZWlnaHQgOiAwOwotCi0gICAgICAgIGludCBkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCA9Ci0gICAgICAgICAgICAgICAgTWF0aC5tYXgoYXJ0Vmlld0hlaWdodCwgdmlzaWJsZUdyb3VwTGlzdEhlaWdodCkgKyBtYWluQ29udHJvbGxlckhlaWdodDsKLSAgICAgICAgUmVjdCB2aXNpYmxlUmVjdCA9IG5ldyBSZWN0KCk7Ci0gICAgICAgIGRlY29yVmlldy5nZXRXaW5kb3dWaXNpYmxlRGlzcGxheUZyYW1lKHZpc2libGVSZWN0KTsKLSAgICAgICAgLy8gSGVpZ2h0IG9mIG5vbi1jb250cm9sIHZpZXdzIGluIGRlY29yIHZpZXcuCi0gICAgICAgIC8vIFRoaXMgaW5jbHVkZXMgdGl0bGUgYmFyLCBidXR0b24gYmFyLCBhbmQgZGlhbG9nJ3MgdmVydGljYWwgcGFkZGluZyB3aGljaCBzaG91bGQgYmUKLSAgICAgICAgLy8gYWx3YXlzIHNob3duLgotICAgICAgICBpbnQgbm9uQ29udHJvbFZpZXdIZWlnaHQgPSBtRGlhbG9nQXJlYUxheW91dC5nZXRNZWFzdXJlZEhlaWdodCgpCi0gICAgICAgICAgICAgICAgLSBtRGVmYXVsdENvbnRyb2xMYXlvdXQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKLSAgICAgICAgLy8gTWF4aW11bSBhbGxvd2VkIGhlaWdodCBmb3IgY29udHJvbHMgdG8gZml0IHNjcmVlbi4KLSAgICAgICAgaW50IG1heGltdW1Db250cm9sVmlld0hlaWdodCA9IHZpc2libGVSZWN0LmhlaWdodCgpIC0gbm9uQ29udHJvbFZpZXdIZWlnaHQ7Ci0KLSAgICAgICAgLy8gU2hvdyBhcnR3b3JrIGlmIGl0IGZpdHMgdGhlIHNjcmVlbi4KLSAgICAgICAgaWYgKG1DdXN0b21Db250cm9sVmlldyA9PSBudWxsICYmIGFydFZpZXdIZWlnaHQgPiAwCi0gICAgICAgICAgICAgICAgJiYgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgPD0gbWF4aW11bUNvbnRyb2xWaWV3SGVpZ2h0KSB7Ci0gICAgICAgICAgICBtQXJ0Vmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBzZXRMYXlvdXRIZWlnaHQobUFydFZpZXcsIGFydFZpZXdIZWlnaHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGdldExheW91dEhlaWdodChtVm9sdW1lR3JvdXBMaXN0KSArIG1NZWRpYU1haW5Db250cm9sTGF5b3V0LmdldE1lYXN1cmVkSGVpZ2h0KCkKLSAgICAgICAgICAgICAgICAgICAgPj0gbURlZmF1bHRDb250cm9sTGF5b3V0LmdldE1lYXN1cmVkSGVpZ2h0KCkpIHsKLSAgICAgICAgICAgICAgICBtQXJ0Vmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcnRWaWV3SGVpZ2h0ID0gMDsKLSAgICAgICAgICAgIGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0ID0gdmlzaWJsZUdyb3VwTGlzdEhlaWdodCArIG1haW5Db250cm9sbGVySGVpZ2h0OwotICAgICAgICB9Ci0gICAgICAgIC8vIFNob3cgdGhlIHBsYXliYWNrIGNvbnRyb2wgaWYgaXQgZml0cyB0aGUgc2NyZWVuLgotICAgICAgICBpZiAoY2FuU2hvd1BsYXliYWNrQ29udHJvbExheW91dCgpCi0gICAgICAgICAgICAgICAgJiYgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgPD0gbWF4aW11bUNvbnRyb2xWaWV3SGVpZ2h0KSB7Ci0gICAgICAgICAgICBtUGxheWJhY2tDb250cm9sTGF5b3V0LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1QbGF5YmFja0NvbnRyb2xMYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZU1lZGlhQ29udHJvbFZpc2liaWxpdHkobVBsYXliYWNrQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKTsKLSAgICAgICAgbWFpbkNvbnRyb2xsZXJIZWlnaHQgPSBnZXRNYWluQ29udHJvbGxlckhlaWdodCgKLSAgICAgICAgICAgICAgICBtUGxheWJhY2tDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpOwotICAgICAgICBkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCA9Ci0gICAgICAgICAgICAgICAgTWF0aC5tYXgoYXJ0Vmlld0hlaWdodCwgdmlzaWJsZUdyb3VwTGlzdEhlaWdodCkgKyBtYWluQ29udHJvbGxlckhlaWdodDsKLQotICAgICAgICAvLyBMaW1pdCB0aGUgdm9sdW1lIGdyb3VwIGxpc3QgaGVpZ2h0IHRvIGZpdCB0aGUgc2NyZWVuLgotICAgICAgICBpZiAoZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgPiBtYXhpbXVtQ29udHJvbFZpZXdIZWlnaHQpIHsKLSAgICAgICAgICAgIHZpc2libGVHcm91cExpc3RIZWlnaHQgLT0gKGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0IC0gbWF4aW11bUNvbnRyb2xWaWV3SGVpZ2h0KTsKLSAgICAgICAgICAgIGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0ID0gbWF4aW11bUNvbnRyb2xWaWV3SGVpZ2h0OwotICAgICAgICB9Ci0gICAgICAgIC8vIFVwZGF0ZSB0aGUgbGF5b3V0cyB3aXRoIHRoZSBjb21wdXRlZCBoZWlnaHRzLgotICAgICAgICBtTWVkaWFNYWluQ29udHJvbExheW91dC5jbGVhckFuaW1hdGlvbigpOwotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LmNsZWFyQW5pbWF0aW9uKCk7Ci0gICAgICAgIG1EZWZhdWx0Q29udHJvbExheW91dC5jbGVhckFuaW1hdGlvbigpOwotICAgICAgICBpZiAoYW5pbWF0ZSkgewotICAgICAgICAgICAgYW5pbWF0ZUxheW91dEhlaWdodChtTWVkaWFNYWluQ29udHJvbExheW91dCwgbWFpbkNvbnRyb2xsZXJIZWlnaHQpOwotICAgICAgICAgICAgYW5pbWF0ZUxheW91dEhlaWdodChtVm9sdW1lR3JvdXBMaXN0LCB2aXNpYmxlR3JvdXBMaXN0SGVpZ2h0KTsKLSAgICAgICAgICAgIGFuaW1hdGVMYXlvdXRIZWlnaHQobURlZmF1bHRDb250cm9sTGF5b3V0LCBkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXRMYXlvdXRIZWlnaHQobU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQsIG1haW5Db250cm9sbGVySGVpZ2h0KTsKLSAgICAgICAgICAgIHNldExheW91dEhlaWdodChtVm9sdW1lR3JvdXBMaXN0LCB2aXNpYmxlR3JvdXBMaXN0SGVpZ2h0KTsKLSAgICAgICAgICAgIHNldExheW91dEhlaWdodChtRGVmYXVsdENvbnRyb2xMYXlvdXQsIGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0KTsKLSAgICAgICAgfQotICAgICAgICAvLyBNYXhpbWl6ZSB0aGUgd2luZG93IHNpemUgd2l0aCBhIHRyYW5zcGFyZW50IGxheW91dCBpbiBhZHZhbmNlIGZvciBzbW9vdGggYW5pbWF0aW9uLgotICAgICAgICBzZXRMYXlvdXRIZWlnaHQobUV4cGFuZGFibGVBcmVhTGF5b3V0LCB2aXNpYmxlUmVjdC5oZWlnaHQoKSk7Ci0gICAgICAgIHJlYnVpbGRWb2x1bWVHcm91cExpc3QoYW5pbWF0ZSk7Ci0gICAgfQotCi0gICAgdm9pZCB1cGRhdGVWb2x1bWVHcm91cEl0ZW1IZWlnaHQoVmlldyBpdGVtKSB7Ci0gICAgICAgIExpbmVhckxheW91dCBjb250YWluZXIgPSAoTGluZWFyTGF5b3V0KSBpdGVtLmZpbmRWaWV3QnlJZChSLmlkLnZvbHVtZV9pdGVtX2NvbnRhaW5lcik7Ci0gICAgICAgIHNldExheW91dEhlaWdodChjb250YWluZXIsIG1Wb2x1bWVHcm91cExpc3RJdGVtSGVpZ2h0KTsKLSAgICAgICAgVmlldyBpY29uID0gaXRlbS5maW5kVmlld0J5SWQoUi5pZC5tcl92b2x1bWVfaXRlbV9pY29uKTsKLSAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcyBscCA9IGljb24uZ2V0TGF5b3V0UGFyYW1zKCk7Ci0gICAgICAgIGxwLndpZHRoID0gbVZvbHVtZUdyb3VwTGlzdEl0ZW1JY29uU2l6ZTsKLSAgICAgICAgbHAuaGVpZ2h0ID0gbVZvbHVtZUdyb3VwTGlzdEl0ZW1JY29uU2l6ZTsKLSAgICAgICAgaWNvbi5zZXRMYXlvdXRQYXJhbXMobHApOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhbmltYXRlTGF5b3V0SGVpZ2h0KGZpbmFsIFZpZXcgdmlldywgaW50IHRhcmdldEhlaWdodCkgewotICAgICAgICBmaW5hbCBpbnQgc3RhcnRWYWx1ZSA9IGdldExheW91dEhlaWdodCh2aWV3KTsKLSAgICAgICAgZmluYWwgaW50IGVuZFZhbHVlID0gdGFyZ2V0SGVpZ2h0OwotICAgICAgICBBbmltYXRpb24gYW5pbSA9IG5ldyBBbmltYXRpb24oKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHByb3RlY3RlZCB2b2lkIGFwcGx5VHJhbnNmb3JtYXRpb24oZmxvYXQgaW50ZXJwb2xhdGVkVGltZSwgVHJhbnNmb3JtYXRpb24gdCkgewotICAgICAgICAgICAgICAgIGludCBoZWlnaHQgPSBzdGFydFZhbHVlIC0gKGludCkgKChzdGFydFZhbHVlIC0gZW5kVmFsdWUpICogaW50ZXJwb2xhdGVkVGltZSk7Ci0gICAgICAgICAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KHZpZXcsIGhlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGFuaW0uc2V0RHVyYXRpb24obUdyb3VwTGlzdEFuaW1hdGlvbkR1cmF0aW9uTXMpOwotICAgICAgICBpZiAoYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMjEpIHsKLSAgICAgICAgICAgIGFuaW0uc2V0SW50ZXJwb2xhdG9yKG1JbnRlcnBvbGF0b3IpOwotICAgICAgICB9Ci0gICAgICAgIHZpZXcuc3RhcnRBbmltYXRpb24oYW5pbSk7Ci0gICAgfQotCi0gICAgdm9pZCBsb2FkSW50ZXJwb2xhdG9yKCkgewotICAgICAgICBtSW50ZXJwb2xhdG9yID0KLSAgICAgICAgICAgICAgICBtSXNHcm91cEV4cGFuZGVkID8gbUxpbmVhck91dFNsb3dJbkludGVycG9sYXRvciA6IG1GYXN0T3V0U2xvd0luSW50ZXJwb2xhdG9yOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVWb2x1bWVDb250cm9sTGF5b3V0KCkgewotICAgICAgICBpZiAoaXNWb2x1bWVDb250cm9sQXZhaWxhYmxlKG1Sb3V0ZSkpIHsKLSAgICAgICAgICAgIGlmIChtVm9sdW1lQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5HT05FKSB7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZUNvbnRyb2xMYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIG1Wb2x1bWVTbGlkZXIuc2V0TWF4KG1Sb3V0ZS5nZXRWb2x1bWVNYXgoKSk7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZVNsaWRlci5zZXRQcm9ncmVzcyhtUm91dGUuZ2V0Vm9sdW1lKCkpOwotICAgICAgICAgICAgICAgIG1Hcm91cEV4cGFuZENvbGxhcHNlQnV0dG9uLnNldFZpc2liaWxpdHkoZ2V0R3JvdXAoKSA9PSBudWxsID8gVmlldy5HT05FCi0gICAgICAgICAgICAgICAgICAgICAgICA6IFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtVm9sdW1lQ29udHJvbExheW91dC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVidWlsZFZvbHVtZUdyb3VwTGlzdChib29sZWFuIGFuaW1hdGUpIHsKLSAgICAgICAgTGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IHJvdXRlcyA9IGdldEdyb3VwKCkgPT0gbnVsbCA/IG51bGwgOiBnZXRHcm91cCgpLmdldFJvdXRlcygpOwotICAgICAgICBpZiAocm91dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlcy5jbGVhcigpOwotICAgICAgICAgICAgbVZvbHVtZUdyb3VwQWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOwotICAgICAgICB9IGVsc2UgaWYgKE1lZGlhUm91dGVEaWFsb2dIZWxwZXIubGlzdFVub3JkZXJlZEVxdWFscyhtR3JvdXBNZW1iZXJSb3V0ZXMsIHJvdXRlcykpIHsKLSAgICAgICAgICAgIG1Wb2x1bWVHcm91cEFkYXB0ZXIubm90aWZ5RGF0YVNldENoYW5nZWQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEhhc2hNYXA8TWVkaWFSb3V0ZXIuUm91dGVJbmZvLCBSZWN0PiBwcmV2aW91c1JvdXRlQm91bmRNYXAgPSBhbmltYXRlCi0gICAgICAgICAgICAgICAgICAgID8gTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5nZXRJdGVtQm91bmRNYXAobVZvbHVtZUdyb3VwTGlzdCwgbVZvbHVtZUdyb3VwQWRhcHRlcikKLSAgICAgICAgICAgICAgICAgICAgOiBudWxsOwotICAgICAgICAgICAgSGFzaE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIEJpdG1hcERyYXdhYmxlPiBwcmV2aW91c1JvdXRlQml0bWFwTWFwID0gYW5pbWF0ZQotICAgICAgICAgICAgICAgICAgICA/IE1lZGlhUm91dGVEaWFsb2dIZWxwZXIuZ2V0SXRlbUJpdG1hcE1hcChtQ29udGV4dCwgbVZvbHVtZUdyb3VwTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBBZGFwdGVyKSA6IG51bGw7Ci0gICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCA9Ci0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVEaWFsb2dIZWxwZXIuZ2V0SXRlbXNBZGRlZChtR3JvdXBNZW1iZXJSb3V0ZXMsIHJvdXRlcyk7Ci0gICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNSZW1vdmVkID0gTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5nZXRJdGVtc1JlbW92ZWQobUdyb3VwTWVtYmVyUm91dGVzLAotICAgICAgICAgICAgICAgICAgICByb3V0ZXMpOwotICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzLmFkZEFsbCgwLCBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCk7Ci0gICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXMucmVtb3ZlQWxsKG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQpOwotICAgICAgICAgICAgbVZvbHVtZUdyb3VwQWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOwotICAgICAgICAgICAgaWYgKGFuaW1hdGUgJiYgbUlzR3JvdXBFeHBhbmRlZAotICAgICAgICAgICAgICAgICAgICAmJiBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZC5zaXplKCkgKyBtR3JvdXBNZW1iZXJSb3V0ZXNSZW1vdmVkLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBhbmltYXRlR3JvdXBMaXN0SXRlbXMocHJldmlvdXNSb3V0ZUJvdW5kTWFwLCBwcmV2aW91c1JvdXRlQml0bWFwTWFwKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQgPSBudWxsOwotICAgICAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFuaW1hdGVHcm91cExpc3RJdGVtcyhmaW5hbCBNYXA8TWVkaWFSb3V0ZXIuUm91dGVJbmZvLCBSZWN0PiBwcmV2aW91c1JvdXRlQm91bmRNYXAsCi0gICAgICAgICAgICBmaW5hbCBNYXA8TWVkaWFSb3V0ZXIuUm91dGVJbmZvLCBCaXRtYXBEcmF3YWJsZT4gcHJldmlvdXNSb3V0ZUJpdG1hcE1hcCkgewotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnJlcXVlc3RMYXlvdXQoKTsKLSAgICAgICAgbUlzR3JvdXBMaXN0QW5pbWF0aW5nID0gdHJ1ZTsKLSAgICAgICAgVmlld1RyZWVPYnNlcnZlciBvYnNlcnZlciA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Vmlld1RyZWVPYnNlcnZlcigpOwotICAgICAgICBvYnNlcnZlci5hZGRPbkdsb2JhbExheW91dExpc3RlbmVyKG5ldyBWaWV3VHJlZU9ic2VydmVyLk9uR2xvYmFsTGF5b3V0TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uR2xvYmFsTGF5b3V0KCkgewotICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cExpc3QuZ2V0Vmlld1RyZWVPYnNlcnZlcigpLnJlbW92ZUdsb2JhbE9uTGF5b3V0TGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICAgICAgYW5pbWF0ZUdyb3VwTGlzdEl0ZW1zSW50ZXJuYWwocHJldmlvdXNSb3V0ZUJvdW5kTWFwLCBwcmV2aW91c1JvdXRlQml0bWFwTWFwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBhbmltYXRlR3JvdXBMaXN0SXRlbXNJbnRlcm5hbCgKLSAgICAgICAgICAgIE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIFJlY3Q+IHByZXZpb3VzUm91dGVCb3VuZE1hcCwKLSAgICAgICAgICAgIE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIEJpdG1hcERyYXdhYmxlPiBwcmV2aW91c1JvdXRlQml0bWFwTWFwKSB7Ci0gICAgICAgIGlmIChtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCA9PSBudWxsIHx8IG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGludCBncm91cFNpemVEZWx0YSA9IG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLnNpemUoKSAtIG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQuc2l6ZSgpOwotICAgICAgICBib29sZWFuIGxpc3RlbmVyUmVnaXN0ZXJlZCA9IGZhbHNlOwotICAgICAgICBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQW5pbWF0aW9uLkFuaW1hdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblN0YXJ0KEFuaW1hdGlvbiBhbmltYXRpb24pIHsKLSAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnN0YXJ0QW5pbWF0aW9uQWxsKCk7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5wb3N0RGVsYXllZChtR3JvdXBMaXN0RmFkZUluQW5pbWF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgbUdyb3VwTGlzdEFuaW1hdGlvbkR1cmF0aW9uTXMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdGlvbiBhbmltYXRpb24pIHsgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uUmVwZWF0KEFuaW1hdGlvbiBhbmltYXRpb24pIHsgfQotICAgICAgICB9OwotCi0gICAgICAgIC8vIEFuaW1hdGUgdmlzaWJsZSBpdGVtcyBmcm9tIHByZXZpb3VzIHBvc2l0aW9ucyB0byBjdXJyZW50IHBvc2l0aW9ucyBleGNlcHQgcm91dGVzIGFkZGVkCi0gICAgICAgIC8vIGp1c3QgYmVmb3JlLiBBZGRlZCByb3V0ZXMgd2lsbCByZW1haW4gaGlkZGVuIHVudGlsIHRyYW5zbGF0ZSBhbmltYXRpb24gZmluaXNoZXMuCi0gICAgICAgIGludCBmaXJzdCA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtVm9sdW1lR3JvdXBMaXN0LmdldENoaWxkQ291bnQoKTsgKytpKSB7Ci0gICAgICAgICAgICBWaWV3IHZpZXcgPSBtVm9sdW1lR3JvdXBMaXN0LmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpbnQgcG9zaXRpb24gPSBmaXJzdCArIGk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtVm9sdW1lR3JvdXBBZGFwdGVyLmdldEl0ZW0ocG9zaXRpb24pOwotICAgICAgICAgICAgUmVjdCBwcmV2aW91c0JvdW5kcyA9IHByZXZpb3VzUm91dGVCb3VuZE1hcC5nZXQocm91dGUpOwotICAgICAgICAgICAgaW50IGN1cnJlbnRUb3AgPSB2aWV3LmdldFRvcCgpOwotICAgICAgICAgICAgaW50IHByZXZpb3VzVG9wID0gcHJldmlvdXNCb3VuZHMgIT0gbnVsbCA/IHByZXZpb3VzQm91bmRzLnRvcAotICAgICAgICAgICAgICAgICAgICA6IChjdXJyZW50VG9wICsgbVZvbHVtZUdyb3VwTGlzdEl0ZW1IZWlnaHQgKiBncm91cFNpemVEZWx0YSk7Ci0gICAgICAgICAgICBBbmltYXRpb25TZXQgYW5pbVNldCA9IG5ldyBBbmltYXRpb25TZXQodHJ1ZSk7Ci0gICAgICAgICAgICBpZiAobUdyb3VwTWVtYmVyUm91dGVzQWRkZWQgIT0gbnVsbCAmJiBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZC5jb250YWlucyhyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICBwcmV2aW91c1RvcCA9IGN1cnJlbnRUb3A7Ci0gICAgICAgICAgICAgICAgQW5pbWF0aW9uIGFscGhhQW5pbSA9IG5ldyBBbHBoYUFuaW1hdGlvbigwLjBmLCAwLjBmKTsKLSAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RHVyYXRpb24obUdyb3VwTGlzdEZhZGVJbkR1cmF0aW9uTXMpOwotICAgICAgICAgICAgICAgIGFuaW1TZXQuYWRkQW5pbWF0aW9uKGFscGhhQW5pbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBbmltYXRpb24gdHJhbnNsYXRpb25BbmltID0gbmV3IFRyYW5zbGF0ZUFuaW1hdGlvbigwLCAwLCBwcmV2aW91c1RvcCAtIGN1cnJlbnRUb3AsIDApOwotICAgICAgICAgICAgdHJhbnNsYXRpb25BbmltLnNldER1cmF0aW9uKG1Hcm91cExpc3RBbmltYXRpb25EdXJhdGlvbk1zKTsKLSAgICAgICAgICAgIGFuaW1TZXQuYWRkQW5pbWF0aW9uKHRyYW5zbGF0aW9uQW5pbSk7Ci0gICAgICAgICAgICBhbmltU2V0LnNldEZpbGxBZnRlcih0cnVlKTsKLSAgICAgICAgICAgIGFuaW1TZXQuc2V0RmlsbEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBhbmltU2V0LnNldEludGVycG9sYXRvcihtSW50ZXJwb2xhdG9yKTsKLSAgICAgICAgICAgIGlmICghbGlzdGVuZXJSZWdpc3RlcmVkKSB7Ci0gICAgICAgICAgICAgICAgbGlzdGVuZXJSZWdpc3RlcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBhbmltU2V0LnNldEFuaW1hdGlvbkxpc3RlbmVyKGxpc3RlbmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZpZXcuY2xlYXJBbmltYXRpb24oKTsKLSAgICAgICAgICAgIHZpZXcuc3RhcnRBbmltYXRpb24oYW5pbVNldCk7Ci0gICAgICAgICAgICBwcmV2aW91c1JvdXRlQm91bmRNYXAucmVtb3ZlKHJvdXRlKTsKLSAgICAgICAgICAgIHByZXZpb3VzUm91dGVCaXRtYXBNYXAucmVtb3ZlKHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIElmIGEgbWVtYmVyIHJvdXRlIGRvZXNuJ3QgZXhpc3QgYW55IGxvbmdlciwgaXQgY2FuIGJlIGVpdGhlciByZW1vdmVkIG9yIG1vdmVkIG91dCBvZiB0aGUKLSAgICAgICAgLy8gTGlzdFZpZXcgbGF5b3V0IGJvdW5kYXJ5LiBJbiB0aGlzIGNhc2UsIHVzZSB0aGUgcHJldmlvdXNseSBjYXB0dXJlZCBiaXRtYXBzIGZvcgotICAgICAgICAvLyBhbmltYXRpb24uCi0gICAgICAgIGZvciAoTWFwLkVudHJ5PE1lZGlhUm91dGVyLlJvdXRlSW5mbywgQml0bWFwRHJhd2FibGU+IGl0ZW0KLSAgICAgICAgICAgICAgICA6IHByZXZpb3VzUm91dGVCaXRtYXBNYXAuZW50cnlTZXQoKSkgewotICAgICAgICAgICAgZmluYWwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gaXRlbS5nZXRLZXkoKTsKLSAgICAgICAgICAgIGZpbmFsIEJpdG1hcERyYXdhYmxlIGJpdG1hcCA9IGl0ZW0uZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgIGZpbmFsIFJlY3QgYm91bmRzID0gcHJldmlvdXNSb3V0ZUJvdW5kTWFwLmdldChyb3V0ZSk7Ci0gICAgICAgICAgICBPdmVybGF5T2JqZWN0IG9iamVjdCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZC5jb250YWlucyhyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICBvYmplY3QgPSBuZXcgT3ZlcmxheU9iamVjdChiaXRtYXAsIGJvdW5kcykuc2V0QWxwaGFBbmltYXRpb24oMS4wZiwgMC4wZikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREdXJhdGlvbihtR3JvdXBMaXN0RmFkZU91dER1cmF0aW9uTXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW50ZXJwb2xhdG9yKG1JbnRlcnBvbGF0b3IpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgZGVsdGFZID0gZ3JvdXBTaXplRGVsdGEgKiBtVm9sdW1lR3JvdXBMaXN0SXRlbUhlaWdodDsKLSAgICAgICAgICAgICAgICBvYmplY3QgPSBuZXcgT3ZlcmxheU9iamVjdChiaXRtYXAsIGJvdW5kcykuc2V0VHJhbnNsYXRlWUFuaW1hdGlvbihkZWx0YVkpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0RHVyYXRpb24obUdyb3VwTGlzdEFuaW1hdGlvbkR1cmF0aW9uTXMpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0SW50ZXJwb2xhdG9yKG1JbnRlcnBvbGF0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAuc2V0QW5pbWF0aW9uRW5kTGlzdGVuZXIobmV3IE92ZXJsYXlPYmplY3QuT25BbmltYXRpb25FbmRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZCgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzQW5pbWF0aW5nV2l0aEJpdG1hcC5yZW1vdmUocm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBBZGFwdGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzQW5pbWF0aW5nV2l0aEJpdG1hcC5hZGQocm91dGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5hZGRPdmVybGF5T2JqZWN0KG9iamVjdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHN0YXJ0R3JvdXBMaXN0RmFkZUluQW5pbWF0aW9uKCkgewotICAgICAgICBjbGVhckdyb3VwTGlzdEFuaW1hdGlvbih0cnVlKTsKLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5yZXF1ZXN0TGF5b3V0KCk7Ci0gICAgICAgIFZpZXdUcmVlT2JzZXJ2ZXIgb2JzZXJ2ZXIgPSBtVm9sdW1lR3JvdXBMaXN0LmdldFZpZXdUcmVlT2JzZXJ2ZXIoKTsKLSAgICAgICAgb2JzZXJ2ZXIuYWRkT25HbG9iYWxMYXlvdXRMaXN0ZW5lcihuZXcgVmlld1RyZWVPYnNlcnZlci5Pbkdsb2JhbExheW91dExpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkdsb2JhbExheW91dCgpIHsKLSAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LmdldFZpZXdUcmVlT2JzZXJ2ZXIoKS5yZW1vdmVHbG9iYWxPbkxheW91dExpc3RlbmVyKHRoaXMpOwotICAgICAgICAgICAgICAgIHN0YXJ0R3JvdXBMaXN0RmFkZUluQW5pbWF0aW9uSW50ZXJuYWwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBzdGFydEdyb3VwTGlzdEZhZGVJbkFuaW1hdGlvbkludGVybmFsKCkgewotICAgICAgICBpZiAobUdyb3VwTWVtYmVyUm91dGVzQWRkZWQgIT0gbnVsbCAmJiBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZC5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgZmFkZUluQWRkZWRSb3V0ZXMoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZpbmlzaEFuaW1hdGlvbih0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZmluaXNoQW5pbWF0aW9uKGJvb2xlYW4gYW5pbWF0ZSkgewotICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCA9IG51bGw7Ci0gICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQgPSBudWxsOwotICAgICAgICBtSXNHcm91cExpc3RBbmltYXRpbmcgPSBmYWxzZTsKLSAgICAgICAgaWYgKG1Jc0dyb3VwTGlzdEFuaW1hdGlvblBlbmRpbmcpIHsKLSAgICAgICAgICAgIG1Jc0dyb3VwTGlzdEFuaW1hdGlvblBlbmRpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgIHVwZGF0ZUxheW91dEhlaWdodChhbmltYXRlKTsKLSAgICAgICAgfQotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGZhZGVJbkFkZGVkUm91dGVzKCkgewotICAgICAgICBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIgbGlzdGVuZXIgPSBuZXcgQW5pbWF0aW9uLkFuaW1hdGlvbkxpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblN0YXJ0KEFuaW1hdGlvbiBhbmltYXRpb24pIHsgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKEFuaW1hdGlvbiBhbmltYXRpb24pIHsKLSAgICAgICAgICAgICAgICBmaW5pc2hBbmltYXRpb24odHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25SZXBlYXQoQW5pbWF0aW9uIGFuaW1hdGlvbikgeyB9Ci0gICAgICAgIH07Ci0gICAgICAgIGJvb2xlYW4gbGlzdGVuZXJSZWdpc3RlcmVkID0gZmFsc2U7Ci0gICAgICAgIGludCBmaXJzdCA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtVm9sdW1lR3JvdXBMaXN0LmdldENoaWxkQ291bnQoKTsgKytpKSB7Ci0gICAgICAgICAgICBWaWV3IHZpZXcgPSBtVm9sdW1lR3JvdXBMaXN0LmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpbnQgcG9zaXRpb24gPSBmaXJzdCArIGk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtVm9sdW1lR3JvdXBBZGFwdGVyLmdldEl0ZW0ocG9zaXRpb24pOwotICAgICAgICAgICAgaWYgKG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLmNvbnRhaW5zKHJvdXRlKSkgewotICAgICAgICAgICAgICAgIEFuaW1hdGlvbiBhbHBoYUFuaW0gPSBuZXcgQWxwaGFBbmltYXRpb24oMC4wZiwgMS4wZik7Ci0gICAgICAgICAgICAgICAgYWxwaGFBbmltLnNldER1cmF0aW9uKG1Hcm91cExpc3RGYWRlSW5EdXJhdGlvbk1zKTsKLSAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RmlsbEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgYWxwaGFBbmltLnNldEZpbGxBZnRlcih0cnVlKTsKLSAgICAgICAgICAgICAgICBpZiAoIWxpc3RlbmVyUmVnaXN0ZXJlZCkgewotICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lclJlZ2lzdGVyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0QW5pbWF0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB2aWV3LmNsZWFyQW5pbWF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgdmlldy5zdGFydEFuaW1hdGlvbihhbHBoYUFuaW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBjbGVhckdyb3VwTGlzdEFuaW1hdGlvbihib29sZWFuIGV4Y2VwdEFkZGVkUm91dGVzKSB7Ci0gICAgICAgIGludCBmaXJzdCA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtVm9sdW1lR3JvdXBMaXN0LmdldENoaWxkQ291bnQoKTsgKytpKSB7Ci0gICAgICAgICAgICBWaWV3IHZpZXcgPSBtVm9sdW1lR3JvdXBMaXN0LmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpbnQgcG9zaXRpb24gPSBmaXJzdCArIGk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtVm9sdW1lR3JvdXBBZGFwdGVyLmdldEl0ZW0ocG9zaXRpb24pOwotICAgICAgICAgICAgaWYgKGV4Y2VwdEFkZGVkUm91dGVzICYmIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQuY29udGFpbnMocm91dGUpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMaW5lYXJMYXlvdXQgY29udGFpbmVyID0gKExpbmVhckxheW91dCkgdmlldy5maW5kVmlld0J5SWQoUi5pZC52b2x1bWVfaXRlbV9jb250YWluZXIpOwotICAgICAgICAgICAgY29udGFpbmVyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIEFuaW1hdGlvblNldCBhbmltU2V0ID0gbmV3IEFuaW1hdGlvblNldCh0cnVlKTsKLSAgICAgICAgICAgIEFuaW1hdGlvbiBhbHBoYUFuaW0gPSBuZXcgQWxwaGFBbmltYXRpb24oMS4wZiwgMS4wZik7Ci0gICAgICAgICAgICBhbHBoYUFuaW0uc2V0RHVyYXRpb24oMCk7Ci0gICAgICAgICAgICBhbmltU2V0LmFkZEFuaW1hdGlvbihhbHBoYUFuaW0pOwotICAgICAgICAgICAgQW5pbWF0aW9uIHRyYW5zbGF0aW9uQW5pbSA9IG5ldyBUcmFuc2xhdGVBbmltYXRpb24oMCwgMCwgMCwgMCk7Ci0gICAgICAgICAgICB0cmFuc2xhdGlvbkFuaW0uc2V0RHVyYXRpb24oMCk7Ci0gICAgICAgICAgICBhbmltU2V0LnNldEZpbGxBZnRlcih0cnVlKTsKLSAgICAgICAgICAgIGFuaW1TZXQuc2V0RmlsbEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICB2aWV3LmNsZWFyQW5pbWF0aW9uKCk7Ci0gICAgICAgICAgICB2aWV3LnN0YXJ0QW5pbWF0aW9uKGFuaW1TZXQpOwotICAgICAgICB9Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc3RvcEFuaW1hdGlvbkFsbCgpOwotICAgICAgICBpZiAoIWV4Y2VwdEFkZGVkUm91dGVzKSB7Ci0gICAgICAgICAgICBmaW5pc2hBbmltYXRpb24oZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBsYXliYWNrQ29udHJvbExheW91dCgpIHsKLSAgICAgICAgaWYgKGNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQoKSkgewotICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHRpdGxlID0gbURlc2NyaXB0aW9uID09IG51bGwgPyBudWxsIDogbURlc2NyaXB0aW9uLmdldFRpdGxlKCk7Ci0gICAgICAgICAgICBib29sZWFuIGhhc1RpdGxlID0gIVRleHRVdGlscy5pc0VtcHR5KHRpdGxlKTsKLQotICAgICAgICAgICAgQ2hhclNlcXVlbmNlIHN1YnRpdGxlID0gbURlc2NyaXB0aW9uID09IG51bGwgPyBudWxsIDogbURlc2NyaXB0aW9uLmdldFN1YnRpdGxlKCk7Ci0gICAgICAgICAgICBib29sZWFuIGhhc1N1YnRpdGxlID0gIVRleHRVdGlscy5pc0VtcHR5KHN1YnRpdGxlKTsKLQotICAgICAgICAgICAgYm9vbGVhbiBzaG93VGl0bGUgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2xlYW4gc2hvd1N1YnRpdGxlID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAobVJvdXRlLmdldFByZXNlbnRhdGlvbkRpc3BsYXlJZCgpCi0gICAgICAgICAgICAgICAgICAgICE9IE1lZGlhUm91dGVyLlJvdXRlSW5mby5QUkVTRU5UQVRJT05fRElTUExBWV9JRF9OT05FKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIHVzZXIgaXMgY3VycmVudGx5IGNhc3Rpbmcgc2NyZWVuLgotICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dChBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5tcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuKSk7Ci0gICAgICAgICAgICAgICAgc2hvd1RpdGxlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVN0YXRlID09IG51bGwgfHwgbVN0YXRlLmdldFN0YXRlKCkgPT0gUGxheWJhY2tTdGF0ZUNvbXBhdC5TVEFURV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgLy8gU2hvdyAiTm8gbWVkaWEgc2VsZWN0ZWQiIGFzIHdlIGRvbid0IHlldCBrbm93IHRoZSBwbGF5YmFjayBzdGF0ZS4KLSAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQoQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcubXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCkpOwotICAgICAgICAgICAgICAgIHNob3dUaXRsZSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFoYXNUaXRsZSAmJiAhaGFzU3VidGl0bGUpIHsKLSAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQoQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcubXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSkpOwotICAgICAgICAgICAgICAgIHNob3dUaXRsZSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChoYXNUaXRsZSkgewotICAgICAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQodGl0bGUpOwotICAgICAgICAgICAgICAgICAgICBzaG93VGl0bGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaGFzU3VidGl0bGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRUZXh0KHN1YnRpdGxlKTsKLSAgICAgICAgICAgICAgICAgICAgc2hvd1N1YnRpdGxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVGl0bGVWaWV3LnNldFZpc2liaWxpdHkoc2hvd1RpdGxlID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VmlzaWJpbGl0eShzaG93U3VidGl0bGUgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotCi0gICAgICAgICAgICBpZiAobVN0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzUGxheWluZyA9IG1TdGF0ZS5nZXRTdGF0ZSgpID09IFBsYXliYWNrU3RhdGVDb21wYXQuU1RBVEVfQlVGRkVSSU5HCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBtU3RhdGUuZ2V0U3RhdGUoKSA9PSBQbGF5YmFja1N0YXRlQ29tcGF0LlNUQVRFX1BMQVlJTkc7Ci0gICAgICAgICAgICAgICAgQ29udGV4dCBwbGF5YmFja0NvbnRyb2xCdXR0b25Db250ZXh0ID0gbVBsYXliYWNrQ29udHJvbEJ1dHRvbi5nZXRDb250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiB2aXNpYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpbnQgaWNvbkRyYXdhYmxlQXR0ciA9IDA7Ci0gICAgICAgICAgICAgICAgaW50IGljb25EZXNjUmVzSWQgPSAwOwotICAgICAgICAgICAgICAgIGlmIChpc1BsYXlpbmcgJiYgaXNQYXVzZUFjdGlvblN1cHBvcnRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGljb25EcmF3YWJsZUF0dHIgPSBSLmF0dHIubWVkaWFSb3V0ZVBhdXNlRHJhd2FibGU7Ci0gICAgICAgICAgICAgICAgICAgIGljb25EZXNjUmVzSWQgPSBSLnN0cmluZy5tcl9jb250cm9sbGVyX3BhdXNlOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNQbGF5aW5nICYmIGlzU3RvcEFjdGlvblN1cHBvcnRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGljb25EcmF3YWJsZUF0dHIgPSBSLmF0dHIubWVkaWFSb3V0ZVN0b3BEcmF3YWJsZTsKLSAgICAgICAgICAgICAgICAgICAgaWNvbkRlc2NSZXNJZCA9IFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfc3RvcDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc1BsYXlpbmcgJiYgaXNQbGF5QWN0aW9uU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWNvbkRyYXdhYmxlQXR0ciA9IFIuYXR0ci5tZWRpYVJvdXRlUGxheURyYXdhYmxlOwotICAgICAgICAgICAgICAgICAgICBpY29uRGVzY1Jlc0lkID0gUi5zdHJpbmcubXJfY29udHJvbGxlcl9wbGF5OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHZpc2libGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrQ29udHJvbEJ1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2libGUgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgIGlmICh2aXNpYmxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja0NvbnRyb2xCdXR0b24uc2V0SW1hZ2VSZXNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFRoZW1lUmVzb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja0NvbnRyb2xCdXR0b25Db250ZXh0LCBpY29uRHJhd2FibGVBdHRyKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja0NvbnRyb2xCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrQ29udHJvbEJ1dHRvbkNvbnRleHQuZ2V0UmVzb3VyY2VzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRUZXh0KGljb25EZXNjUmVzSWQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNQbGF5QWN0aW9uU3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gKG1TdGF0ZS5nZXRBY3Rpb25zKCkgJiAoQUNUSU9OX1BMQVkgfCBBQ1RJT05fUExBWV9QQVVTRSkpICE9IDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUGF1c2VBY3Rpb25TdXBwb3J0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAobVN0YXRlLmdldEFjdGlvbnMoKSAmIChBQ1RJT05fUEFVU0UgfCBBQ1RJT05fUExBWV9QQVVTRSkpICE9IDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU3RvcEFjdGlvblN1cHBvcnRlZCgpIHsKLSAgICAgICAgcmV0dXJuIChtU3RhdGUuZ2V0QWN0aW9ucygpICYgQUNUSU9OX1NUT1ApICE9IDA7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBpc1ZvbHVtZUNvbnRyb2xBdmFpbGFibGUoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIHJldHVybiBtVm9sdW1lQ29udHJvbEVuYWJsZWQgJiYgcm91dGUuZ2V0Vm9sdW1lSGFuZGxpbmcoKQotICAgICAgICAgICAgICAgID09IE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19WT0xVTUVfVkFSSUFCTEU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldExheW91dEhlaWdodChWaWV3IHZpZXcpIHsKLSAgICAgICAgcmV0dXJuIHZpZXcuZ2V0TGF5b3V0UGFyYW1zKCkuaGVpZ2h0OwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHNldExheW91dEhlaWdodChWaWV3IHZpZXcsIGludCBoZWlnaHQpIHsKLSAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcyBscCA9IHZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7Ci0gICAgICAgIGxwLmhlaWdodCA9IGhlaWdodDsKLSAgICAgICAgdmlldy5zZXRMYXlvdXRQYXJhbXMobHApOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gdXJpRXF1YWxzKFVyaSB1cmkxLCBVcmkgdXJpMikgewotICAgICAgICBpZiAodXJpMSAhPSBudWxsICYmIHVyaTEuZXF1YWxzKHVyaTIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmICh1cmkxID09IG51bGwgJiYgdXJpMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBkZXNpcmVkIGFydCBoZWlnaHQgdG8gZml0IGludG8gY29udHJvbGxlciBkaWFsb2cuCi0gICAgICovCi0gICAgaW50IGdldERlc2lyZWRBcnRIZWlnaHQoaW50IG9yaWdpbmFsV2lkdGgsIGludCBvcmlnaW5hbEhlaWdodCkgewotICAgICAgICBpZiAob3JpZ2luYWxXaWR0aCA+PSBvcmlnaW5hbEhlaWdodCkgewotICAgICAgICAgICAgLy8gRm9yIGxhbmRzY2FwZSBhcnQsIGZpdCB3aWR0aCB0byBkaWFsb2cgd2lkdGguCi0gICAgICAgICAgICByZXR1cm4gKGludCkgKChmbG9hdCkgbURpYWxvZ0NvbnRlbnRXaWR0aCAqIG9yaWdpbmFsSGVpZ2h0IC8gb3JpZ2luYWxXaWR0aCArIDAuNWYpOwotICAgICAgICB9Ci0gICAgICAgIC8vIEZvciBwb3J0cmFpdCBhcnQsIGZpdCBoZWlnaHQgdG8gMTY6OSByYXRpbyBjYXNlJ3MgaGVpZ2h0LgotICAgICAgICByZXR1cm4gKGludCkgKChmbG9hdCkgbURpYWxvZ0NvbnRlbnRXaWR0aCAqIDkgLyAxNiArIDAuNWYpOwotICAgIH0KLQotICAgIHZvaWQgdXBkYXRlQXJ0SWNvbklmTmVlZGVkKCkgewotICAgICAgICBpZiAobUN1c3RvbUNvbnRyb2xWaWV3ICE9IG51bGwgfHwgIWlzSWNvbkNoYW5nZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRmV0Y2hBcnRUYXNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1GZXRjaEFydFRhc2suY2FuY2VsKHRydWUpOwotICAgICAgICB9Ci0gICAgICAgIG1GZXRjaEFydFRhc2sgPSBuZXcgRmV0Y2hBcnRUYXNrKCk7Ci0gICAgICAgIG1GZXRjaEFydFRhc2suZXhlY3V0ZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENsZWFyIHRoZSBiaXRtYXAgbG9hZGVkIGJ5IEZldGNoQXJ0VGFzay4gV2lsbCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxvYWRlZCBiaXRtYXBzIGFyZSBhcHBsaWVkCi0gICAgICogdG8gYXJ0d29yaywgb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqLwotICAgIHZvaWQgY2xlYXJMb2FkZWRCaXRtYXAoKSB7Ci0gICAgICAgIG1BcnRJY29uSXNMb2FkZWQgPSBmYWxzZTsKLSAgICAgICAgbUFydEljb25Mb2FkZWRCaXRtYXAgPSBudWxsOwotICAgICAgICBtQXJ0SWNvbkJhY2tncm91bmRDb2xvciA9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIGEgbmV3IGFydCBpbWFnZSBpcyBkaWZmZXJlbnQgZnJvbSBhbiBvcmlnaW5hbCBhcnQgaW1hZ2UuIENvbXBhcmVzCi0gICAgICogQml0bWFwIG9iamVjdHMgZmlyc3QsIGFuZCB0aGVuIGNvbXBhcmVzIFVSSXMgb25seSBpZiBiaXRtYXAgaXMgdW5jaGFuZ2VkIHdpdGgKLSAgICAgKiBhIG51bGwgdmFsdWUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSWNvbkNoYW5nZWQoKSB7Ci0gICAgICAgIEJpdG1hcCBuZXdCaXRtYXAgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0SWNvbkJpdG1hcCgpOwotICAgICAgICBVcmkgbmV3VXJpID0gbURlc2NyaXB0aW9uID09IG51bGwgPyBudWxsIDogbURlc2NyaXB0aW9uLmdldEljb25VcmkoKTsKLSAgICAgICAgQml0bWFwIG9sZEJpdG1hcCA9IG1GZXRjaEFydFRhc2sgPT0gbnVsbCA/IG1BcnRJY29uQml0bWFwIDogbUZldGNoQXJ0VGFzay5nZXRJY29uQml0bWFwKCk7Ci0gICAgICAgIFVyaSBvbGRVcmkgPSBtRmV0Y2hBcnRUYXNrID09IG51bGwgPyBtQXJ0SWNvblVyaSA6IG1GZXRjaEFydFRhc2suZ2V0SWNvblVyaSgpOwotICAgICAgICBpZiAob2xkQml0bWFwICE9IG5ld0JpdG1hcCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAob2xkQml0bWFwID09IG51bGwgJiYgIXVyaUVxdWFscyhvbGRVcmksIG5ld1VyaSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVyQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlci5DYWxsYmFjayB7Ci0gICAgICAgIE1lZGlhUm91dGVyQ2FsbGJhY2soKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuc2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIHVwZGF0ZShmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIHVwZGF0ZSh0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVm9sdW1lQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgU2Vla0JhciB2b2x1bWVTbGlkZXIgPSBtVm9sdW1lU2xpZGVyTWFwLmdldChyb3V0ZSk7Ci0gICAgICAgICAgICBpbnQgdm9sdW1lID0gcm91dGUuZ2V0Vm9sdW1lKCk7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblJvdXRlVm9sdW1lQ2hhbmdlZCgpLCByb3V0ZS5nZXRWb2x1bWU6IiArIHZvbHVtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodm9sdW1lU2xpZGVyICE9IG51bGwgJiYgbVJvdXRlSW5Wb2x1bWVTbGlkZXJUb3VjaGVkICE9IHJvdXRlKSB7Ci0gICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldFByb2dyZXNzKHZvbHVtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE1lZGlhQ29udHJvbGxlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFDb250cm9sbGVyQ29tcGF0LkNhbGxiYWNrIHsKLSAgICAgICAgTWVkaWFDb250cm9sbGVyQ2FsbGJhY2soKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZXNzaW9uRGVzdHJveWVkKCkgewotICAgICAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIudW5yZWdpc3RlckNhbGxiYWNrKG1Db250cm9sbGVyQ2FsbGJhY2spOwotICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWJhY2tTdGF0ZUNoYW5nZWQoUGxheWJhY2tTdGF0ZUNvbXBhdCBzdGF0ZSkgewotICAgICAgICAgICAgbVN0YXRlID0gc3RhdGU7Ci0gICAgICAgICAgICB1cGRhdGUoZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uTWV0YWRhdGFDaGFuZ2VkKE1lZGlhTWV0YWRhdGFDb21wYXQgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgIG1EZXNjcmlwdGlvbiA9IG1ldGFkYXRhID09IG51bGwgPyBudWxsIDogbWV0YWRhdGEuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIHVwZGF0ZUFydEljb25JZk5lZWRlZCgpOwotICAgICAgICAgICAgdXBkYXRlKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQ2xpY2tMaXN0ZW5lciBpbXBsZW1lbnRzIFZpZXcuT25DbGlja0xpc3RlbmVyIHsKLSAgICAgICAgQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgaW50IGlkID0gdi5nZXRJZCgpOwotICAgICAgICAgICAgaWYgKGlkID09IEJVVFRPTl9TVE9QX1JFU19JRCB8fCBpZCA9PSBCVVRUT05fRElTQ09OTkVDVF9SRVNfSUQpIHsKLSAgICAgICAgICAgICAgICBpZiAobVJvdXRlLmlzU2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBtUm91dGVyLnVuc2VsZWN0KGlkID09IEJVVFRPTl9TVE9QX1JFU19JRCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1NUT1BQRUQgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLlVOU0VMRUNUX1JFQVNPTl9ESVNDT05ORUNURUQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkaXNtaXNzKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlkID09IFIuaWQubXJfY29udHJvbF9wbGF5YmFja19jdHJsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xsZXIgIT0gbnVsbCAmJiBtU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzUGxheWluZyA9IG1TdGF0ZS5nZXRTdGF0ZSgpID09IFBsYXliYWNrU3RhdGVDb21wYXQuU1RBVEVfUExBWUlORzsKLSAgICAgICAgICAgICAgICAgICAgaW50IGFjdGlvbkRlc2NSZXNJZCA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1BsYXlpbmcgJiYgaXNQYXVzZUFjdGlvblN1cHBvcnRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkucGF1c2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkRlc2NSZXNJZCA9IFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfcGF1c2U7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNQbGF5aW5nICYmIGlzU3RvcEFjdGlvblN1cHBvcnRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkuc3RvcCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uRGVzY1Jlc0lkID0gUi5zdHJpbmcubXJfY29udHJvbGxlcl9zdG9wOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc1BsYXlpbmcgJiYgaXNQbGF5QWN0aW9uU3VwcG9ydGVkKCkpewotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpLnBsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbkRlc2NSZXNJZCA9IFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfcGxheTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBBbm5vdW5jZSB0aGUgYWN0aW9uIGZvciBhY2Nlc3NpYmlsaXR5LgotICAgICAgICAgICAgICAgICAgICBpZiAobUFjY2Vzc2liaWxpdHlNYW5hZ2VyICE9IG51bGwgJiYgbUFjY2Vzc2liaWxpdHlNYW5hZ2VyLmlzRW5hYmxlZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgYWN0aW9uRGVzY1Jlc0lkICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudCBldmVudCA9IEFjY2Vzc2liaWxpdHlFdmVudC5vYnRhaW4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjY2Vzc2liaWxpdHlFdmVudENvbXBhdC5UWVBFX0FOTk9VTkNFTUVOVCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5zZXRQYWNrYWdlTmFtZShtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnNldENsYXNzTmFtZShnZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBldmVudC5nZXRUZXh0KCkuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRTdHJpbmcoYWN0aW9uRGVzY1Jlc0lkKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQWNjZXNzaWJpbGl0eU1hbmFnZXIuc2VuZEFjY2Vzc2liaWxpdHlFdmVudChldmVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlkID09IFIuaWQubXJfY2xvc2UpIHsKLSAgICAgICAgICAgICAgICBkaXNtaXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFZvbHVtZUNoYW5nZUxpc3RlbmVyIGltcGxlbWVudHMgU2Vla0Jhci5PblNlZWtCYXJDaGFuZ2VMaXN0ZW5lciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUnVubmFibGUgbVN0b3BUcmFja2luZ1RvdWNoID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Sb3V0ZUluVm9sdW1lU2xpZGVyVG91Y2hlZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZUluVm9sdW1lU2xpZGVyVG91Y2hlZCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtSGFzUGVuZGluZ1VwZGF0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlKG1QZW5kaW5nVXBkYXRlQW5pbWF0aW9uTmVlZGVkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBWb2x1bWVDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0VHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKLSAgICAgICAgICAgIGlmIChtUm91dGVJblZvbHVtZVNsaWRlclRvdWNoZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Wb2x1bWVTbGlkZXIucmVtb3ZlQ2FsbGJhY2tzKG1TdG9wVHJhY2tpbmdUb3VjaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUm91dGVJblZvbHVtZVNsaWRlclRvdWNoZWQgPSAoTWVkaWFSb3V0ZXIuUm91dGVJbmZvKSBzZWVrQmFyLmdldFRhZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RvcFRyYWNraW5nVG91Y2goU2Vla0JhciBzZWVrQmFyKSB7Ci0gICAgICAgICAgICAvLyBEZWZlciByZXNldHRpbmcgbVZvbHVtZVNsaWRlclRvdWNoZWQgdG8gYWxsb3cgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyCi0gICAgICAgICAgICAvLyBhIGxpdHRsZSB0aW1lIHRvIHNldHRsZSBpbnRvIGl0cyBuZXcgc3RhdGUgYW5kIHB1Ymxpc2ggdGhlIGZpbmFsCi0gICAgICAgICAgICAvLyB2b2x1bWUgdXBkYXRlLgotICAgICAgICAgICAgbVZvbHVtZVNsaWRlci5wb3N0RGVsYXllZChtU3RvcFRyYWNraW5nVG91Y2gsIFZPTFVNRV9VUERBVEVfREVMQVlfTUlMTElTKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblByb2dyZXNzQ2hhbmdlZChTZWVrQmFyIHNlZWtCYXIsIGludCBwcm9ncmVzcywgYm9vbGVhbiBmcm9tVXNlcikgewotICAgICAgICAgICAgaWYgKGZyb21Vc2VyKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gKE1lZGlhUm91dGVyLlJvdXRlSW5mbykgc2Vla0Jhci5nZXRUYWcoKTsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25Qcm9ncmVzc0NoYW5nZWQoKTogY2FsbGluZyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiTWVkaWFSb3V0ZXIuUm91dGVJbmZvLnJlcXVlc3RTZXRWb2x1bWUoIiArIHByb2dyZXNzICsgIikiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcm91dGUucmVxdWVzdFNldFZvbHVtZShwcm9ncmVzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFZvbHVtZUdyb3VwQWRhcHRlciBleHRlbmRzIEFycmF5QWRhcHRlcjxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IHsKLSAgICAgICAgZmluYWwgZmxvYXQgbURpc2FibGVkQWxwaGE7Ci0KLSAgICAgICAgcHVibGljIFZvbHVtZUdyb3VwQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIExpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiBvYmplY3RzKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCAwLCBvYmplY3RzKTsKLSAgICAgICAgICAgIG1EaXNhYmxlZEFscGhhID0gTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXREaXNhYmxlZEFscGhhKGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZChpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGZpbmFsIGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIHBhcmVudCkgewotICAgICAgICAgICAgVmlldyB2ID0gY29udmVydFZpZXc7Ci0gICAgICAgICAgICBpZiAodiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdiA9IExheW91dEluZmxhdGVyLmZyb20ocGFyZW50LmdldENvbnRleHQoKSkuaW5mbGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0Lm1yX2NvbnRyb2xsZXJfdm9sdW1lX2l0ZW0sIHBhcmVudCwgZmFsc2UpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVWb2x1bWVHcm91cEl0ZW1IZWlnaHQodik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IGdldEl0ZW0ocG9zaXRpb24pOwotICAgICAgICAgICAgaWYgKHJvdXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIGlzRW5hYmxlZCA9IHJvdXRlLmlzRW5hYmxlZCgpOwotCi0gICAgICAgICAgICAgICAgVGV4dFZpZXcgcm91dGVOYW1lID0gKFRleHRWaWV3KSB2LmZpbmRWaWV3QnlJZChSLmlkLm1yX25hbWUpOwotICAgICAgICAgICAgICAgIHJvdXRlTmFtZS5zZXRFbmFibGVkKGlzRW5hYmxlZCk7Ci0gICAgICAgICAgICAgICAgcm91dGVOYW1lLnNldFRleHQocm91dGUuZ2V0TmFtZSgpKTsKLQotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVWb2x1bWVTbGlkZXIgdm9sdW1lU2xpZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChNZWRpYVJvdXRlVm9sdW1lU2xpZGVyKSB2LmZpbmRWaWV3QnlJZChSLmlkLm1yX3ZvbHVtZV9zbGlkZXIpOwotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuc2V0Vm9sdW1lU2xpZGVyQ29sb3IoCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuZ2V0Q29udGV4dCgpLCB2b2x1bWVTbGlkZXIsIG1Wb2x1bWVHcm91cExpc3QpOwotICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRUYWcocm91dGUpOwotICAgICAgICAgICAgICAgIG1Wb2x1bWVTbGlkZXJNYXAucHV0KHJvdXRlLCB2b2x1bWVTbGlkZXIpOwotICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRIaWRlVGh1bWIoIWlzRW5hYmxlZCk7Ci0gICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNFbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1ZvbHVtZUNvbnRyb2xBdmFpbGFibGUocm91dGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0TWF4KHJvdXRlLmdldFZvbHVtZU1heCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRQcm9ncmVzcyhyb3V0ZS5nZXRWb2x1bWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIobVZvbHVtZUNoYW5nZUxpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRNYXgoMTAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRQcm9ncmVzcygxMDApOwotICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgSW1hZ2VWaWV3IHZvbHVtZUl0ZW1JY29uID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChJbWFnZVZpZXcpIHYuZmluZFZpZXdCeUlkKFIuaWQubXJfdm9sdW1lX2l0ZW1faWNvbik7Ci0gICAgICAgICAgICAgICAgdm9sdW1lSXRlbUljb24uc2V0QWxwaGEoaXNFbmFibGVkID8gMHhGRiA6IChpbnQpICgweEZGICogbURpc2FibGVkQWxwaGEpKTsKLQotICAgICAgICAgICAgICAgIC8vIElmIG92ZXJsYXkgYml0bWFwIGV4aXN0cywgcmVhbCB2aWV3IHNob3VsZCByZW1haW4gaGlkZGVuIHVudGlsCi0gICAgICAgICAgICAgICAgLy8gdGhlIGFuaW1hdGlvbiBlbmRzLgotICAgICAgICAgICAgICAgIExpbmVhckxheW91dCBjb250YWluZXIgPSAoTGluZWFyTGF5b3V0KSB2LmZpbmRWaWV3QnlJZChSLmlkLnZvbHVtZV9pdGVtX2NvbnRhaW5lcik7Ci0gICAgICAgICAgICAgICAgY29udGFpbmVyLnNldFZpc2liaWxpdHkobUdyb3VwTWVtYmVyUm91dGVzQW5pbWF0aW5nV2l0aEJpdG1hcC5jb250YWlucyhyb3V0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgID8gVmlldy5JTlZJU0lCTEUgOiBWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgICAgICAgICAgLy8gUm91dGVzIHdoaWNoIGFyZSBiZWluZyBhZGRlZCB3aWxsIGJlIGludmlzaWJsZSB1bnRpbCBhbmltYXRpb24gZW5kcy4KLSAgICAgICAgICAgICAgICBpZiAobUdyb3VwTWVtYmVyUm91dGVzQWRkZWQgIT0gbnVsbCAmJiBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZC5jb250YWlucyhyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQW5pbWF0aW9uIGFscGhhQW5pbSA9IG5ldyBBbHBoYUFuaW1hdGlvbigwLjBmLCAwLjBmKTsKLSAgICAgICAgICAgICAgICAgICAgYWxwaGFBbmltLnNldER1cmF0aW9uKDApOwotICAgICAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RmlsbEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXRGaWxsQWZ0ZXIodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIHYuY2xlYXJBbmltYXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgdi5zdGFydEFuaW1hdGlvbihhbHBoYUFuaW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB2OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBGZXRjaEFydFRhc2sgZXh0ZW5kcyBBc3luY1Rhc2s8Vm9pZCwgVm9pZCwgQml0bWFwPiB7Ci0gICAgICAgIC8vIFNob3cgYW5pbWF0aW9uIG9ubHkgd2hlbiBmZXRjaGluZyB0YWtlcyBhIGxvbmcgdGltZS4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBTSE9XX0FOSU1fVElNRV9USFJFU0hPTERfTUlMTElTID0gMTIwTDsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIEJpdG1hcCBtSWNvbkJpdG1hcDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBVcmkgbUljb25Vcmk7Ci0gICAgICAgIHByaXZhdGUgaW50IG1CYWNrZ3JvdW5kQ29sb3I7Ci0gICAgICAgIHByaXZhdGUgbG9uZyBtU3RhcnRUaW1lTWlsbGlzOwotCi0gICAgICAgIEZldGNoQXJ0VGFzaygpIHsKLSAgICAgICAgICAgIEJpdG1hcCBiaXRtYXAgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0SWNvbkJpdG1hcCgpOwotICAgICAgICAgICAgaWYgKGlzQml0bWFwUmVjeWNsZWQoYml0bWFwKSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbid0IGZldGNoIHRoZSBnaXZlbiBhcnQgYml0bWFwIGJlY2F1c2UgaXQncyBhbHJlYWR5IHJlY3ljbGVkLiIpOwotICAgICAgICAgICAgICAgIGJpdG1hcCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtSWNvbkJpdG1hcCA9IGJpdG1hcDsKLSAgICAgICAgICAgIG1JY29uVXJpID0gbURlc2NyaXB0aW9uID09IG51bGwgPyBudWxsIDogbURlc2NyaXB0aW9uLmdldEljb25VcmkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBCaXRtYXAgZ2V0SWNvbkJpdG1hcCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSWNvbkJpdG1hcDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBVcmkgZ2V0SWNvblVyaSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSWNvblVyaTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblByZUV4ZWN1dGUoKSB7Ci0gICAgICAgICAgICBtU3RhcnRUaW1lTWlsbGlzID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCk7Ci0gICAgICAgICAgICBjbGVhckxvYWRlZEJpdG1hcCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBCaXRtYXAgZG9JbkJhY2tncm91bmQoVm9pZC4uLiBhcmcpIHsKLSAgICAgICAgICAgIEJpdG1hcCBhcnQgPSBudWxsOwotICAgICAgICAgICAgaWYgKG1JY29uQml0bWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBhcnQgPSBtSWNvbkJpdG1hcDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUljb25VcmkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChzdHJlYW0gPSBvcGVuSW5wdXRTdHJlYW1CeVNjaGVtZShtSWNvblVyaSkpID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlVuYWJsZSB0byBvcGVuOiAiICsgbUljb25VcmkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gUXVlcnkgYXJ0IHNpemUuCi0gICAgICAgICAgICAgICAgICAgIEJpdG1hcEZhY3RvcnkuT3B0aW9ucyBvcHRpb25zID0gbmV3IEJpdG1hcEZhY3RvcnkuT3B0aW9ucygpOwotICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmluSnVzdERlY29kZUJvdW5kcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIEJpdG1hcEZhY3RvcnkuZGVjb2RlU3RyZWFtKHN0cmVhbSwgbnVsbCwgb3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLm91dFdpZHRoID09IDAgfHwgb3B0aW9ucy5vdXRIZWlnaHQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gUmV3aW5kIHRoZSBzdHJlYW0gaW4gb3JkZXIgdG8gcmVzdGFydCBhcnQgZGVjb2RpbmcuCi0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucmVzZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFpbGVkIHRvIHJld2luZCB0aGUgc3RyZWFtLCB0cnkgdG8gcmVvcGVuIGl0LgotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHN0cmVhbSA9IG9wZW5JbnB1dFN0cmVhbUJ5U2NoZW1lKG1JY29uVXJpKSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlVuYWJsZSB0byBvcGVuOiAiICsgbUljb25VcmkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIENhbGN1bGF0ZSByZXF1aXJlZCBzaXplIHRvIGRlY29kZSB0aGUgYXJ0IGFuZCBwb3NzaWJseSByZXNpemUgaXQuCi0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaW5KdXN0RGVjb2RlQm91bmRzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGludCByZXFIZWlnaHQgPSBnZXREZXNpcmVkQXJ0SGVpZ2h0KG9wdGlvbnMub3V0V2lkdGgsIG9wdGlvbnMub3V0SGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJhdGlvID0gb3B0aW9ucy5vdXRIZWlnaHQgLyByZXFIZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaW5TYW1wbGVTaXplID0gTWF0aC5tYXgoMSwgSW50ZWdlci5oaWdoZXN0T25lQml0KHJhdGlvKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc0NhbmNlbGxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhcnQgPSBCaXRtYXBGYWN0b3J5LmRlY29kZVN0cmVhbShzdHJlYW0sIG51bGwsIG9wdGlvbnMpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJVbmFibGUgdG8gb3BlbjogIiArIG1JY29uVXJpLCBlKTsKLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RyZWFtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaXNCaXRtYXBSZWN5Y2xlZChhcnQpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2FuJ3QgdXNlIHJlY3ljbGVkIGJpdG1hcDogIiArIGFydCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYXJ0ICE9IG51bGwgJiYgYXJ0LmdldFdpZHRoKCkgPCBhcnQuZ2V0SGVpZ2h0KCkpIHsKLSAgICAgICAgICAgICAgICAvLyBQb3J0cmFpdCBhcnQgcmVxdWlyZXMgZG9taW5hbnQgY29sb3IgYXMgYmFja2dyb3VuZCBjb2xvci4KLSAgICAgICAgICAgICAgICBQYWxldHRlIHBhbGV0dGUgPSBuZXcgUGFsZXR0ZS5CdWlsZGVyKGFydCkubWF4aW11bUNvbG9yQ291bnQoMSkuZ2VuZXJhdGUoKTsKLSAgICAgICAgICAgICAgICBtQmFja2dyb3VuZENvbG9yID0gcGFsZXR0ZS5nZXRTd2F0Y2hlcygpLmlzRW1wdHkoKQotICAgICAgICAgICAgICAgICAgICAgICAgPyAwIDogcGFsZXR0ZS5nZXRTd2F0Y2hlcygpLmdldCgwKS5nZXRSZ2IoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBhcnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25Qb3N0RXhlY3V0ZShCaXRtYXAgYXJ0KSB7Ci0gICAgICAgICAgICBtRmV0Y2hBcnRUYXNrID0gbnVsbDsKLSAgICAgICAgICAgIGlmICghT2JqZWN0c0NvbXBhdC5lcXVhbHMobUFydEljb25CaXRtYXAsIG1JY29uQml0bWFwKQotICAgICAgICAgICAgICAgICAgICB8fCAhT2JqZWN0c0NvbXBhdC5lcXVhbHMobUFydEljb25VcmksIG1JY29uVXJpKSkgewotICAgICAgICAgICAgICAgIG1BcnRJY29uQml0bWFwID0gbUljb25CaXRtYXA7Ci0gICAgICAgICAgICAgICAgbUFydEljb25Mb2FkZWRCaXRtYXAgPSBhcnQ7Ci0gICAgICAgICAgICAgICAgbUFydEljb25VcmkgPSBtSWNvblVyaTsKLSAgICAgICAgICAgICAgICBtQXJ0SWNvbkJhY2tncm91bmRDb2xvciA9IG1CYWNrZ3JvdW5kQ29sb3I7Ci0gICAgICAgICAgICAgICAgbUFydEljb25Jc0xvYWRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbG9uZyBlbGFwc2VkVGltZU1pbGxpcyA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpIC0gbVN0YXJ0VGltZU1pbGxpczsKLSAgICAgICAgICAgICAgICAvLyBMb2FkZWQgYml0bWFwIHdpbGwgYmUgYXBwbGllZCBvbiB0aGUgbmV4dCB1cGRhdGUKLSAgICAgICAgICAgICAgICB1cGRhdGUoZWxhcHNlZFRpbWVNaWxsaXMgPiBTSE9XX0FOSU1fVElNRV9USFJFU0hPTERfTUlMTElTKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgSW5wdXRTdHJlYW0gb3BlbklucHV0U3RyZWFtQnlTY2hlbWUoVXJpIHVyaSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIFN0cmluZyBzY2hlbWUgPSB1cmkuZ2V0U2NoZW1lKCkudG9Mb3dlckNhc2UoKTsKLSAgICAgICAgICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoQ29udGVudFJlc29sdmVyLlNDSEVNRV9BTkRST0lEX1JFU09VUkNFLmVxdWFscyhzY2hlbWUpCi0gICAgICAgICAgICAgICAgICAgIHx8IENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfQ09OVEVOVC5lcXVhbHMoc2NoZW1lKQotICAgICAgICAgICAgICAgICAgICB8fCBDb250ZW50UmVzb2x2ZXIuU0NIRU1FX0ZJTEUuZXF1YWxzKHNjaGVtZSkpIHsKLSAgICAgICAgICAgICAgICBzdHJlYW0gPSBtQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKS5vcGVuSW5wdXRTdHJlYW0odXJpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgVVJMIHVybCA9IG5ldyBVUkwodXJpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIFVSTENvbm5lY3Rpb24gY29ubiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgICAgIGNvbm4uc2V0Q29ubmVjdFRpbWVvdXQoQ09OTkVDVElPTl9USU1FT1VUX01JTExJUyk7Ci0gICAgICAgICAgICAgICAgY29ubi5zZXRSZWFkVGltZW91dChDT05ORUNUSU9OX1RJTUVPVVRfTUlMTElTKTsKLSAgICAgICAgICAgICAgICBzdHJlYW0gPSBjb25uLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gKHN0cmVhbSA9PSBudWxsKSA/IG51bGwgOiBuZXcgQnVmZmVyZWRJbnB1dFN0cmVhbShzdHJlYW0pOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE1ZDc0Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nRnJhZ21lbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi0vKioKLSAqIE1lZGlhIHJvdXRlIGNvbnRyb2xsZXIgZGlhbG9nIGZyYWdtZW50LgotICogPHA+Ci0gKiBDcmVhdGVzIGEge0BsaW5rIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nfS4gIFRoZSBhcHBsaWNhdGlvbiBtYXkgc3ViY2xhc3MKLSAqIHRoaXMgZGlhbG9nIGZyYWdtZW50IHRvIGN1c3RvbWl6ZSB0aGUgbWVkaWEgcm91dGUgY29udHJvbGxlciBkaWFsb2cuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50IGV4dGVuZHMgRGlhbG9nRnJhZ21lbnQgewotICAgIHByaXZhdGUgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2cgbURpYWxvZzsKLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbWVkaWEgcm91dGUgY29udHJvbGxlciBkaWFsb2cgZnJhZ21lbnQuCi0gICAgICogPHA+Ci0gICAgICogQWxsIHN1YmNsYXNzZXMgb2YgdGhpcyBjbGFzcyBtdXN0IGFsc28gcG9zc2VzcyBhIGRlZmF1bHQgY29uc3RydWN0b3IuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50KCkgewotICAgICAgICBzZXRDYW5jZWxhYmxlKHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBjb250cm9sbGVyIGRpYWxvZyBpcyBiZWluZyBjcmVhdGVkLgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB0aGUgZGlhbG9nLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2cgb25DcmVhdGVDb250cm9sbGVyRGlhbG9nKAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2coY29udGV4dCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIERpYWxvZyBvbkNyZWF0ZURpYWxvZyhCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIG1EaWFsb2cgPSBvbkNyZWF0ZUNvbnRyb2xsZXJEaWFsb2coZ2V0Q29udGV4dCgpLCBzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICByZXR1cm4gbURpYWxvZzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7Ci0gICAgICAgIHN1cGVyLm9uU3RvcCgpOwotICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRGlhbG9nLmNsZWFyR3JvdXBMaXN0QW5pbWF0aW9uKGZhbHNlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ29uZmlndXJhdGlvbkNoYW5nZWQoQ29uZmlndXJhdGlvbiBuZXdDb25maWcpIHsKLSAgICAgICAgc3VwZXIub25Db25maWd1cmF0aW9uQ2hhbmdlZChuZXdDb25maWcpOwotICAgICAgICBpZiAobURpYWxvZyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRGlhbG9nLnVwZGF0ZUxheW91dCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlhbG9nRmFjdG9yeS5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlhbG9nRmFjdG9yeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWVhZjM5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotCi0vKioKLSAqIFRoZSBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeSBpcyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgdGhlIG1lZGlhIHJvdXRlCi0gKiBjaG9vc2VyIGFuZCBjb250cm9sbGVyIGRpYWxvZ3MgYXMgbmVlZGVkLgotICogPHA+Ci0gKiBUaGUgYXBwbGljYXRpb24gY2FuIGN1c3RvbWl6ZSB0aGUgZGlhbG9ncyBieSBwcm92aWRpbmcgYSBzdWJjbGFzcyBvZiB0aGUKLSAqIGRpYWxvZyBmYWN0b3J5IHRvIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZUJ1dHRvbn0gdXNpbmcgdGhlCi0gKiB7QGxpbmsgTWVkaWFSb3V0ZUJ1dHRvbiNzZXREaWFsb2dGYWN0b3J5IHNldERpYWxvZ0ZhY3Rvcnl9IG1ldGhvZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSBzRGVmYXVsdCA9IG5ldyBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSgpOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGRlZmF1bHQgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnkuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5KCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGRlZmF1bHQgZmFjdG9yeSBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGRlZmF1bHQgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnksIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IGdldERlZmF1bHQoKSB7Ci0gICAgICAgIHJldHVybiBzRGVmYXVsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgY2hvb3NlciBkaWFsb2cgaXMgYmVpbmcgb3BlbmVkIGFuZCBpdCBpcyB0aW1lIHRvIGNyZWF0ZSB0aGUgZnJhZ21lbnQuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3JlYXRlIGEgY3VzdG9taXplZCBmcmFnbWVudC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZyBmcmFnbWVudCwgbXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50IG9uQ3JlYXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50KCkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGUgY29udHJvbGxlciBkaWFsb2cgaXMgYmVpbmcgb3BlbmVkIGFuZCBpdCBpcyB0aW1lIHRvIGNyZWF0ZSB0aGUgZnJhZ21lbnQuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3JlYXRlIGEgY3VzdG9taXplZCBmcmFnbWVudC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSByb3V0ZSBjb250cm9sbGVyIGRpYWxvZyBmcmFnbWVudCwgbXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50IG9uQ3JlYXRlQ29udHJvbGxlckRpYWxvZ0ZyYWdtZW50KCkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVEaWFsb2dIZWxwZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWFiZjdiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuRGlzcGxheU1ldHJpY3M7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5BcnJheUFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotZmluYWwgY2xhc3MgTWVkaWFSb3V0ZURpYWxvZ0hlbHBlciB7Ci0gICAgLyoqCi0gICAgICogVGhlIGZyYW1ld29yayBzaG91bGQgc2V0IHRoZSBkaWFsb2cgd2lkdGggcHJvcGVybHksIGJ1dCBzb21laG93IGl0IGRvZXNuJ3Qgd29yaywgaGVuY2UKLSAgICAgKiBkdXBsaWNhdGluZyBhIHNpbWlsYXIgbG9naWMgaGVyZSB0byBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIGRpYWxvZyB3aWR0aC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGludCBnZXREaWFsb2dXaWR0aChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgRGlzcGxheU1ldHJpY3MgbWV0cmljcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0RGlzcGxheU1ldHJpY3MoKTsKLSAgICAgICAgYm9vbGVhbiBpc1BvcnRyYWl0ID0gbWV0cmljcy53aWR0aFBpeGVscyA8IG1ldHJpY3MuaGVpZ2h0UGl4ZWxzOwotCi0gICAgICAgIFR5cGVkVmFsdWUgdmFsdWUgPSBuZXcgVHlwZWRWYWx1ZSgpOwotICAgICAgICBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLmdldFZhbHVlKGlzUG9ydHJhaXQKLSAgICAgICAgICAgICAgICA/IFIuZGltZW4ubXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21pbm9yCi0gICAgICAgICAgICAgICAgOiBSLmRpbWVuLm1yX2RpYWxvZ19maXhlZF93aWR0aF9tYWpvciwgdmFsdWUsIHRydWUpOwotICAgICAgICBpZiAodmFsdWUudHlwZSA9PSBUeXBlZFZhbHVlLlRZUEVfRElNRU5TSU9OKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGludCkgdmFsdWUuZ2V0RGltZW5zaW9uKG1ldHJpY3MpOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLnR5cGUgPT0gVHlwZWRWYWx1ZS5UWVBFX0ZSQUNUSU9OKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGludCkgdmFsdWUuZ2V0RnJhY3Rpb24obWV0cmljcy53aWR0aFBpeGVscywgbWV0cmljcy53aWR0aFBpeGVscyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHR3byBsaXN0cyByZWdhcmRsZXNzIG9mIG9yZGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3QxIEEgbGlzdAotICAgICAqIEBwYXJhbSBsaXN0MiBBIGxpc3QgdG8gYmUgY29tcGFyZWQgd2l0aCB7QGNvZGUgbGlzdDF9Ci0gICAgICogQHJldHVybiBUcnVlIGlmIHR3byBsaXN0cyBoYXZlIGV4YWN0bHkgc2FtZSBpdGVtcyByZWdhcmRsZXNzIG9mIG9yZGVyLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8RT4gYm9vbGVhbiBsaXN0VW5vcmRlcmVkRXF1YWxzKExpc3Q8RT4gbGlzdDEsIExpc3Q8RT4gbGlzdDIpIHsKLSAgICAgICAgSGFzaFNldDxFPiBzZXQxID0gbmV3IEhhc2hTZXQ8PihsaXN0MSk7Ci0gICAgICAgIEhhc2hTZXQ8RT4gc2V0MiA9IG5ldyBIYXNoU2V0PD4obGlzdDIpOwotICAgICAgICByZXR1cm4gc2V0MS5lcXVhbHMoc2V0Mik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdHdvIGxpc3RzIGFuZCByZXR1cm5zIGEgc2V0IG9mIGl0ZW1zIHdoaWNoIGV4aXN0Ci0gICAgICogYWZ0ZXItbGlzdCBidXQgYmVmb3JlLWxpc3QsIHdoaWNoIG1lYW5zIG5ld2x5IGFkZGVkIGl0ZW1zLgotICAgICAqCi0gICAgICogQHBhcmFtIGJlZm9yZSBBIGxpc3QKLSAgICAgKiBAcGFyYW0gYWZ0ZXIgQSBsaXN0IHRvIGJlIGNvbXBhcmVkIHdpdGgge0Bjb2RlIGJlZm9yZX0KLSAgICAgKiBAcmV0dXJuIEEgc2V0IG9mIGl0ZW1zIHdoaWNoIGNvbnRhaW5zIG5ld2x5IGFkZGVkIGl0ZW1zIHdoaWxlCi0gICAgICogY29tcGFyaW5nIHtAY29kZSBhZnRlcn0gdG8ge0Bjb2RlIGJlZm9yZX0uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8RT4gU2V0PEU+IGdldEl0ZW1zQWRkZWQoTGlzdDxFPiBiZWZvcmUsIExpc3Q8RT4gYWZ0ZXIpIHsKLSAgICAgICAgSGFzaFNldDxFPiBzZXQgPSBuZXcgSGFzaFNldDw+KGFmdGVyKTsKLSAgICAgICAgc2V0LnJlbW92ZUFsbChiZWZvcmUpOwotICAgICAgICByZXR1cm4gc2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmVzIHR3byBsaXN0cyBhbmQgcmV0dXJucyBhIHNldCBvZiBpdGVtcyB3aGljaCBleGlzdAotICAgICAqIGJlZm9yZS1saXN0IGJ1dCBhZnRlci1saXN0LCB3aGljaCBtZWFucyByZW1vdmVkIGl0ZW1zLgotICAgICAqCi0gICAgICogQHBhcmFtIGJlZm9yZSBBIGxpc3QKLSAgICAgKiBAcGFyYW0gYWZ0ZXIgQSBsaXN0IHRvIGJlIGNvbXBhcmVkIHdpdGgge0Bjb2RlIGJlZm9yZX0KLSAgICAgKiBAcmV0dXJuIEEgc2V0IG9mIGl0ZW1zIHdoaWNoIGNvbnRhaW5zIHJlbW92ZWQgaXRlbXMgd2hpbGUKLSAgICAgKiBjb21wYXJpbmcge0Bjb2RlIGFmdGVyfSB0byB7QGNvZGUgYmVmb3JlfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxFPiBTZXQ8RT4gZ2V0SXRlbXNSZW1vdmVkKExpc3Q8RT4gYmVmb3JlLCBMaXN0PEU+IGFmdGVyKSB7Ci0gICAgICAgIEhhc2hTZXQ8RT4gc2V0ID0gbmV3IEhhc2hTZXQ8PihiZWZvcmUpOwotICAgICAgICBzZXQucmVtb3ZlQWxsKGFmdGVyKTsKLSAgICAgICAgcmV0dXJuIHNldDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYW4gaXRlbS1SZWN0IG1hcCB3aGljaCBpbmRpY2F0ZXMgd2hlcmUgbWVtYmVyCi0gICAgICogaXRlbXMgYXJlIGxvY2F0ZWQgaW4gdGhlIGdpdmVuIExpc3RWaWV3LgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3RWaWV3IEEgbGlzdCB2aWV3Ci0gICAgICogQHBhcmFtIGFkYXB0ZXIgQW4gYXJyYXkgYWRhcHRlciB3aGljaCBjb250YWlucyBhbiBhcnJheSBvZiBpdGVtcy4KLSAgICAgKiBAcmV0dXJuIEEgbWFwIG9mIGl0ZW1zIGFuZCBib3VuZHMgb2YgdGhlaXIgdmlld3MgbG9jYXRlZCBpbiB0aGUgZ2l2ZW4gbGlzdCB2aWV3LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgPEU+IEhhc2hNYXA8RSwgUmVjdD4gZ2V0SXRlbUJvdW5kTWFwKExpc3RWaWV3IGxpc3RWaWV3LAotICAgICAgICAgICAgQXJyYXlBZGFwdGVyPEU+IGFkYXB0ZXIpIHsKLSAgICAgICAgSGFzaE1hcDxFLCBSZWN0PiBpdGVtQm91bmRNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIGludCBmaXJzdFZpc2libGVQb3NpdGlvbiA9IGxpc3RWaWV3LmdldEZpcnN0VmlzaWJsZVBvc2l0aW9uKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFZpZXcuZ2V0Q2hpbGRDb3VudCgpOyArK2kpIHsKLSAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGZpcnN0VmlzaWJsZVBvc2l0aW9uICsgaTsKLSAgICAgICAgICAgIEUgaXRlbSA9IGFkYXB0ZXIuZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBWaWV3IHZpZXcgPSBsaXN0Vmlldy5nZXRDaGlsZEF0KGkpOwotICAgICAgICAgICAgaXRlbUJvdW5kTWFwLnB1dChpdGVtLAotICAgICAgICAgICAgICAgICAgICBuZXcgUmVjdCh2aWV3LmdldExlZnQoKSwgdmlldy5nZXRUb3AoKSwgdmlldy5nZXRSaWdodCgpLCB2aWV3LmdldEJvdHRvbSgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGl0ZW1Cb3VuZE1hcDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZW5lcmF0ZXMgYW4gaXRlbS1CaXRtYXBEcmF3YWJsZSBtYXAgd2hpY2ggc3RvcmVzIHNuYXBzaG90cwotICAgICAqIG9mIG1lbWJlciBpdGVtcyBpbiB0aGUgZ2l2ZW4gTGlzdFZpZXcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCBBIGNvbnRleHQKLSAgICAgKiBAcGFyYW0gbGlzdFZpZXcgQSBsaXN0IHZpZXcKLSAgICAgKiBAcGFyYW0gYWRhcHRlciBBbiBhcnJheSBhZGFwdGVyIHdoaWNoIGNvbnRhaW5zIGFuIGFycmF5IG9mIGl0ZW1zLgotICAgICAqIEByZXR1cm4gQSBtYXAgb2YgaXRlbXMgYW5kIHNuYXBzaG90cyBvZiB0aGVpciB2aWV3cyBpbiB0aGUgZ2l2ZW4gbGlzdCB2aWV3LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgPEU+IEhhc2hNYXA8RSwgQml0bWFwRHJhd2FibGU+IGdldEl0ZW1CaXRtYXBNYXAoQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgTGlzdFZpZXcgbGlzdFZpZXcsIEFycmF5QWRhcHRlcjxFPiBhZGFwdGVyKSB7Ci0gICAgICAgIEhhc2hNYXA8RSwgQml0bWFwRHJhd2FibGU+IGl0ZW1CaXRtYXBNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIGludCBmaXJzdFZpc2libGVQb3NpdGlvbiA9IGxpc3RWaWV3LmdldEZpcnN0VmlzaWJsZVBvc2l0aW9uKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFZpZXcuZ2V0Q2hpbGRDb3VudCgpOyArK2kpIHsKLSAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGZpcnN0VmlzaWJsZVBvc2l0aW9uICsgaTsKLSAgICAgICAgICAgIEUgaXRlbSA9IGFkYXB0ZXIuZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBWaWV3IHZpZXcgPSBsaXN0Vmlldy5nZXRDaGlsZEF0KGkpOwotICAgICAgICAgICAgaXRlbUJpdG1hcE1hcC5wdXQoaXRlbSwgZ2V0Vmlld0JpdG1hcChjb250ZXh0LCB2aWV3KSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGl0ZW1CaXRtYXBNYXA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgQml0bWFwRHJhd2FibGUgZ2V0Vmlld0JpdG1hcChDb250ZXh0IGNvbnRleHQsIFZpZXcgdmlldykgewotICAgICAgICBCaXRtYXAgYml0bWFwID0gQml0bWFwLmNyZWF0ZUJpdG1hcCh2aWV3LmdldFdpZHRoKCksIHZpZXcuZ2V0SGVpZ2h0KCksCi0gICAgICAgICAgICAgICAgQml0bWFwLkNvbmZpZy5BUkdCXzg4ODgpOwotICAgICAgICBDYW52YXMgY2FudmFzID0gbmV3IENhbnZhcyhiaXRtYXApOwotICAgICAgICB2aWV3LmRyYXcoY2FudmFzKTsKLSAgICAgICAgcmV0dXJuIG5ldyBCaXRtYXBEcmF3YWJsZShjb250ZXh0LmdldFJlc291cmNlcygpLCBiaXRtYXApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVEaXNjb3ZlcnlGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmVlMTE4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuRnJhZ21lbnQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOwotCi0vKioKLSAqIE1lZGlhIHJvdXRlIGRpc2NvdmVyeSBmcmFnbWVudC4KLSAqIDxwPgotICogVGhpcyBmcmFnbWVudCB0YWtlcyBjYXJlIG9mIHJlZ2lzdGVyaW5nIGEgY2FsbGJhY2sgZm9yIG1lZGlhIHJvdXRlIGRpc2NvdmVyeQotICogZHVyaW5nIHRoZSB7QGxpbmsgRnJhZ21lbnQjb25TdGFydCBvblN0YXJ0KCl9IHBoYXNlCi0gKiBhbmQgcmVtb3ZpbmcgaXQgZHVyaW5nIHRoZSB7QGxpbmsgRnJhZ21lbnQjb25TdG9wIG9uU3RvcCgpfSBwaGFzZS4KLSAqIDwvcD48cD4KLSAqIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHN1cHBseSBhIHJvdXRlIHNlbGVjdG9yIHRvIHNwZWNpZnkgdGhlIGtpbmRzIG9mIHJvdXRlcwotICogdG8gZGlzY292ZXIuICBUaGUgYXBwbGljYXRpb24gbWF5IGFsc28gb3ZlcnJpZGUge0BsaW5rICNvbkNyZWF0ZUNhbGxiYWNrfSB0bwotICogcHJvdmlkZSB0aGUge0BsaW5rIE1lZGlhUm91dGVyfSBjYWxsYmFjayB0byByZWdpc3Rlci4KLSAqIDwvcD48cD4KLSAqIE5vdGUgdGhhdCB0aGUgZGlzY292ZXJ5IGNhbGxiYWNrIG1ha2VzIHRoZSBhcHBsaWNhdGlvbiBiZSBjb25uZWN0ZWQgd2l0aCBhbGwgdGhlCi0gKiB7QGxpbmsgYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UgbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZXN9Ci0gKiB3aGlsZSBpdCBpcyByZWdpc3RlcmVkLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50IGV4dGVuZHMgRnJhZ21lbnQgewotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIEFSR1VNRU5UX1NFTEVDVE9SID0gInNlbGVjdG9yIjsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIgbVJvdXRlcjsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3I7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlci5DYWxsYmFjayBtQ2FsbGJhY2s7Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50KCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1lZGlhIHJvdXRlciBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZXIgZ2V0TWVkaWFSb3V0ZXIoKSB7Ci0gICAgICAgIGVuc3VyZVJvdXRlcigpOwotICAgICAgICByZXR1cm4gbVJvdXRlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5zdXJlUm91dGVyKCkgewotICAgICAgICBpZiAobVJvdXRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0byBiZSBkaXNjb3ZlcmVkLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2VsZWN0b3IsIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVTZWxlY3RvciBnZXRSb3V0ZVNlbGVjdG9yKCkgewotICAgICAgICBlbnN1cmVSb3V0ZVNlbGVjdG9yKCk7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRvIGJlIGRpc2NvdmVyZWQuCi0gICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBmcmFnbWVudCBpcyBhZGRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBlbnN1cmVSb3V0ZVNlbGVjdG9yKCk7Ci0gICAgICAgIGlmICghbVNlbGVjdG9yLmVxdWFscyhzZWxlY3RvcikpIHsKLSAgICAgICAgICAgIG1TZWxlY3RvciA9IHNlbGVjdG9yOwotCi0gICAgICAgICAgICBCdW5kbGUgYXJncyA9IGdldEFyZ3VtZW50cygpOwotICAgICAgICAgICAgaWYgKGFyZ3MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFyZ3MgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcmdzLnB1dEJ1bmRsZShBUkdVTUVOVF9TRUxFQ1RPUiwgc2VsZWN0b3IuYXNCdW5kbGUoKSk7Ci0gICAgICAgICAgICBzZXRBcmd1bWVudHMoYXJncyk7Ci0KLSAgICAgICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgICAgICAgICAgICBtUm91dGVyLmFkZENhbGxiYWNrKG1TZWxlY3RvciwgbUNhbGxiYWNrLCBvblByZXBhcmVDYWxsYmFja0ZsYWdzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVuc3VyZVJvdXRlU2VsZWN0b3IoKSB7Ci0gICAgICAgIGlmIChtU2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgQnVuZGxlIGFyZ3MgPSBnZXRBcmd1bWVudHMoKTsKLSAgICAgICAgICAgIGlmIChhcmdzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuZnJvbUJ1bmRsZShhcmdzLmdldEJ1bmRsZShBUkdVTUVOVF9TRUxFQ1RPUikpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1TZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHRvIGNyZWF0ZSB0aGUge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayBjYWxsYmFja30KLSAgICAgKiB0aGF0IHdpbGwgYmUgcmVnaXN0ZXJlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBjYWxsYmFjayBkb2VzIG5vdGhpbmcuICBUaGUgYXBwbGljYXRpb24gbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvCi0gICAgICogc3VwcGx5IGl0cyBvd24gY2FsbGJhY2suCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbmV3IGNhbGxiYWNrLCBvciBudWxsIGlmIG5vIGNhbGxiYWNrIHNob3VsZCBiZSByZWdpc3RlcmVkLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlci5DYWxsYmFjayBvbkNyZWF0ZUNhbGxiYWNrKCkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVyLkNhbGxiYWNrKCkgeyB9OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB0byBwcmVwYXJlIHRoZSBjYWxsYmFjayBmbGFncyB0aGF0IHdpbGwgYmUgdXNlZCB3aGVuIHRoZQotICAgICAqIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgY2FsbGJhY2t9IGlzIHJlZ2lzdGVyZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gcmV0dXJucyB7QGxpbmsgTWVkaWFSb3V0ZXIjQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWX0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZGVzaXJlZCBjYWxsYmFjayBmbGFncy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IG9uUHJlcGFyZUNhbGxiYWNrRmxhZ3MoKSB7Ci0gICAgICAgIHJldHVybiBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKSB7Ci0gICAgICAgIHN1cGVyLm9uU3RhcnQoKTsKLQotICAgICAgICBlbnN1cmVSb3V0ZVNlbGVjdG9yKCk7Ci0gICAgICAgIGVuc3VyZVJvdXRlcigpOwotICAgICAgICBtQ2FsbGJhY2sgPSBvbkNyZWF0ZUNhbGxiYWNrKCk7Ci0gICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhtU2VsZWN0b3IsIG1DYWxsYmFjaywgb25QcmVwYXJlQ2FsbGJhY2tGbGFncygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKLSAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgc3VwZXIub25TdG9wKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24uamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMGE5NWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yRmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmZDb2xvckZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkFuaW1hdGlvbkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5jb250ZW50LkNvbnRleHRDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLlI7Ci0KLS8qKgotICogQ2hldnJvbi9DYXJldCBidXR0b24gdG8gZXhwYW5kL2NvbGxhcHNlIGdyb3VwIHZvbHVtZSBsaXN0IHdpdGggYW5pbWF0aW9uLgotICovCi1wdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uIGV4dGVuZHMgSW1hZ2VCdXR0b24gewotICAgIGZpbmFsIEFuaW1hdGlvbkRyYXdhYmxlIG1FeHBhbmRBbmltYXRpb25EcmF3YWJsZTsKLSAgICBmaW5hbCBBbmltYXRpb25EcmF3YWJsZSBtQ29sbGFwc2VBbmltYXRpb25EcmF3YWJsZTsKLSAgICBmaW5hbCBTdHJpbmcgbUV4cGFuZEdyb3VwRGVzY3JpcHRpb247Ci0gICAgZmluYWwgU3RyaW5nIG1Db2xsYXBzZUdyb3VwRGVzY3JpcHRpb247Ci0gICAgYm9vbGVhbiBtSXNHcm91cEV4cGFuZGVkOwotICAgIE9uQ2xpY2tMaXN0ZW5lciBtTGlzdGVuZXI7Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24oQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0cikgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyKTsKLSAgICAgICAgbUV4cGFuZEFuaW1hdGlvbkRyYXdhYmxlID0gKEFuaW1hdGlvbkRyYXdhYmxlKQotICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5tcl9ncm91cF9leHBhbmQpOwotICAgICAgICBtQ29sbGFwc2VBbmltYXRpb25EcmF3YWJsZSA9IChBbmltYXRpb25EcmF3YWJsZSkKLSAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLmdldERyYXdhYmxlKFIuZHJhd2FibGUubXJfZ3JvdXBfY29sbGFwc2UpOwotCi0gICAgICAgIENvbG9yRmlsdGVyIGZpbHRlciA9IG5ldyBQb3J0ZXJEdWZmQ29sb3JGaWx0ZXIoCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRDb250cm9sbGVyQ29sb3IoY29udGV4dCwgZGVmU3R5bGVBdHRyKSwKLSAgICAgICAgICAgICAgICBQb3J0ZXJEdWZmLk1vZGUuU1JDX0lOKTsKLSAgICAgICAgbUV4cGFuZEFuaW1hdGlvbkRyYXdhYmxlLnNldENvbG9yRmlsdGVyKGZpbHRlcik7Ci0gICAgICAgIG1Db2xsYXBzZUFuaW1hdGlvbkRyYXdhYmxlLnNldENvbG9yRmlsdGVyKGZpbHRlcik7Ci0KLSAgICAgICAgbUV4cGFuZEdyb3VwRGVzY3JpcHRpb24gPQotICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0U3RyaW5nKFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwKTsKLSAgICAgICAgbUNvbGxhcHNlR3JvdXBEZXNjcmlwdGlvbiA9Ci0gICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXRTdHJpbmcoUi5zdHJpbmcubXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCk7Ci0KLSAgICAgICAgc2V0SW1hZ2VEcmF3YWJsZShtRXhwYW5kQW5pbWF0aW9uRHJhd2FibGUuZ2V0RnJhbWUoMCkpOwotICAgICAgICBzZXRDb250ZW50RGVzY3JpcHRpb24obUV4cGFuZEdyb3VwRGVzY3JpcHRpb24pOwotCi0gICAgICAgIHN1cGVyLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdmlldykgewotICAgICAgICAgICAgICAgIG1Jc0dyb3VwRXhwYW5kZWQgPSAhbUlzR3JvdXBFeHBhbmRlZDsKLSAgICAgICAgICAgICAgICBpZiAobUlzR3JvdXBFeHBhbmRlZCkgewotICAgICAgICAgICAgICAgICAgICBzZXRJbWFnZURyYXdhYmxlKG1FeHBhbmRBbmltYXRpb25EcmF3YWJsZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1FeHBhbmRBbmltYXRpb25EcmF3YWJsZS5zdGFydCgpOwotICAgICAgICAgICAgICAgICAgICBzZXRDb250ZW50RGVzY3JpcHRpb24obUNvbGxhcHNlR3JvdXBEZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0SW1hZ2VEcmF3YWJsZShtQ29sbGFwc2VBbmltYXRpb25EcmF3YWJsZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1Db2xsYXBzZUFuaW1hdGlvbkRyYXdhYmxlLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHNldENvbnRlbnREZXNjcmlwdGlvbihtRXhwYW5kR3JvdXBEZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtTGlzdGVuZXIub25DbGljayh2aWV3KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE9uQ2xpY2tMaXN0ZW5lcihPbkNsaWNrTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlVm9sdW1lU2xpZGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVWb2x1bWVTbGlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDA1ZDIwZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVWb2x1bWVTbGlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvcnRlckR1ZmY7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Vla0JhcjsKLQotLyoqCi0gKiBWb2x1bWUgc2xpZGVyIHdpdGggc2hvd2luZywgaGlkaW5nLCBhbmQgYXBwbHlpbmcgYWxwaGEgc3VwcG9ydHMgdG8gdGhlIHRodW1iLgotICovCi1wdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlciBleHRlbmRzIFNlZWtCYXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZVZvbHVtZVNsaWRlciI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1EaXNhYmxlZEFscGhhOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1IaWRlVGh1bWI7Ci0gICAgcHJpdmF0ZSBEcmF3YWJsZSBtVGh1bWI7Ci0gICAgcHJpdmF0ZSBpbnQgbUNvbG9yOwotCi0gICAgcHVibGljIE1lZGlhUm91dGVWb2x1bWVTbGlkZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhUm91dGVWb2x1bWVTbGlkZXIoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOwotICAgICAgICBtRGlzYWJsZWRBbHBoYSA9IE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0RGlzYWJsZWRBbHBoYShjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0cikgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyKTsKLSAgICAgICAgbURpc2FibGVkQWxwaGEgPSBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldERpc2FibGVkQWxwaGEoY29udGV4dCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgZHJhd2FibGVTdGF0ZUNoYW5nZWQoKSB7Ci0gICAgICAgIHN1cGVyLmRyYXdhYmxlU3RhdGVDaGFuZ2VkKCk7Ci0gICAgICAgIGludCBhbHBoYSA9IGlzRW5hYmxlZCgpID8gMHhGRiA6IChpbnQpICgweEZGICogbURpc2FibGVkQWxwaGEpOwotCi0gICAgICAgIC8vIFRoZSB0aHVtYiBkcmF3YWJsZSBpcyBhIGNvbGxlY3Rpb24gb2YgZHJhd2FibGVzIGFuZCBpdHMgY3VycmVudCBkcmF3YWJsZXMgYXJlIGNoYW5nZWQgcGVyCi0gICAgICAgIC8vIHN0YXRlLiBBcHBseSB0aGUgY29sb3IgZmlsdGVyIGFuZCBhbHBoYSBvbiBldmVyeSBzdGF0ZSBjaGFuZ2UuCi0gICAgICAgIGlmIChtVGh1bWIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVRodW1iLnNldENvbG9yRmlsdGVyKG1Db2xvciwgUG9ydGVyRHVmZi5Nb2RlLlNSQ19JTik7Ci0gICAgICAgICAgICBtVGh1bWIuc2V0QWxwaGEoYWxwaGEpOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2V0UHJvZ3Jlc3NEcmF3YWJsZSgpLnNldENvbG9yRmlsdGVyKG1Db2xvciwgUG9ydGVyRHVmZi5Nb2RlLlNSQ19JTik7Ci0gICAgICAgIGdldFByb2dyZXNzRHJhd2FibGUoKS5zZXRBbHBoYShhbHBoYSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VGh1bWIoRHJhd2FibGUgdGh1bWIpIHsKLSAgICAgICAgbVRodW1iID0gdGh1bWI7Ci0gICAgICAgIHN1cGVyLnNldFRodW1iKG1IaWRlVGh1bWIgPyBudWxsIDogbVRodW1iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHdoZXRoZXIgdG8gc2hvdyBvciBoaWRlIHRodW1iLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEhpZGVUaHVtYihib29sZWFuIGhpZGVUaHVtYikgewotICAgICAgICBpZiAobUhpZGVUaHVtYiA9PSBoaWRlVGh1bWIpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtSGlkZVRodW1iID0gaGlkZVRodW1iOwotICAgICAgICBzdXBlci5zZXRUaHVtYihtSGlkZVRodW1iID8gbnVsbCA6IG1UaHVtYik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgdm9sdW1lIHNsaWRlciBjb2xvci4gVGhlIGNoYW5nZSB0YWtlcyBlZmZlY3QgbmV4dCB0aW1lIGRyYXdhYmxlIHN0YXRlIGlzIGNoYW5nZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGNvbG9yIGNhbm5vdCBiZSB0cmFuc2x1Y2VudCwgb3RoZXJ3aXNlIHRoZSB1bmRlcmx5aW5nIHByb2dyZXNzIGJhciB3aWxsIGJlIHNlZW4gdGhyb3VnaAotICAgICAqIHRoZSB0aHVtYi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q29sb3IoaW50IGNvbG9yKSB7Ci0gICAgICAgIGlmIChtQ29sb3IgPT0gY29sb3IpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoQ29sb3IuYWxwaGEoY29sb3IpICE9IDB4RkYpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIlZvbHVtZSBzbGlkZXIgY29sb3IgY2Fubm90IGJlIHRyYW5zbHVjZW50OiAjIiArIEludGVnZXIudG9IZXhTdHJpbmcoY29sb3IpKTsKLSAgICAgICAgfQotICAgICAgICBtQ29sb3IgPSBjb2xvcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVyVGhlbWVIZWxwZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2YwNDJmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5JbnREZWY7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmdyYXBoaWNzLkNvbG9yVXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlR5cGVkVmFsdWU7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci0KLWZpbmFsIGNsYXNzIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IE1JTl9DT05UUkFTVCA9IDMuMGY7Ci0KLSAgICBASW50RGVmKHtDT0xPUl9EQVJLX09OX0xJR0hUX0JBQ0tHUk9VTkQsIENPTE9SX1dISVRFX09OX0RBUktfQkFDS0dST1VORH0pCi0gICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQotICAgIHByaXZhdGUgQGludGVyZmFjZSBDb250cm9sbGVyQ29sb3JUeXBlIHt9Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX0RBUktfT05fTElHSFRfQkFDS0dST1VORCA9IDB4REUwMDAwMDA7IC8qIE9wYWNpdHkgb2YgODclICovCi0gICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9XSElURV9PTl9EQVJLX0JBQ0tHUk9VTkQgPSBDb2xvci5XSElURTsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlcigpIHsKLSAgICB9Ci0KLSAgICBzdGF0aWMgQ29udGV4dCBjcmVhdGVUaGVtZWRCdXR0b25Db250ZXh0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICAvLyBBcHBseSBiYXNlIE1lZGlhIFJvdXRlciB0aGVtZS4KLSAgICAgICAgY29udGV4dCA9IG5ldyBDb250ZXh0VGhlbWVXcmFwcGVyKGNvbnRleHQsIGdldFJvdXRlclRoZW1lSWQoY29udGV4dCkpOwotCi0gICAgICAgIC8vIEFwcGx5IGN1c3RvbSBNZWRpYSBSb3V0ZXIgdGhlbWUuCi0gICAgICAgIGludCBzdHlsZSA9IGdldFRoZW1lUmVzb3VyY2UoY29udGV4dCwgUi5hdHRyLm1lZGlhUm91dGVUaGVtZSk7Ci0gICAgICAgIGlmIChzdHlsZSAhPSAwKSB7Ci0gICAgICAgICAgICBjb250ZXh0ID0gbmV3IENvbnRleHRUaGVtZVdyYXBwZXIoY29udGV4dCwgc3R5bGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUaGUgZm9sbG93aW5nIHR3byBtZXRob2RzIGFyZSB0byBiZSB1c2VkIGluIGNvbmp1bmN0aW9uLiBUaGV5IHNob3VsZCBiZSB1c2VkIHRvIHByZXBhcmUKLSAgICAgKiB0aGUgY29udGV4dCBhbmQgdGhlbWUgZm9yIGEgc3VwZXIgY2xhc3MgY29uc3RydWN0b3IgKHRoZSBsYXR0ZXIgbWV0aG9kIHJlbGllcyBvbiB0aGUKLSAgICAgKiBmb3JtZXIgbWV0aG9kIHRvIHByb3Blcmx5IHByZXBhcmUgdGhlIGNvbnRleHQpOgotICAgICAqICAgc3VwZXIoY29udGV4dCA9IGNyZWF0ZVRoZW1lZERpYWxvZ0NvbnRleHQoY29udGV4dCwgdGhlbWUpLAotICAgICAqICAgICAgICAgICBjcmVhdGVUaGVtZWREaWFsb2dTdHlsZShjb250ZXh0KSk7Ci0gICAgICoKLSAgICAgKiBJdCB3aWxsIGFwcGx5IHRoZW1lIGluIHRoZSBmb2xsb3dpbmcgb3JkZXIgKHN0eWxlIGxvb2t1cHMgd2lsbCBiZSBkb25lIGluIHJldmVyc2UpOgotICAgICAqICAgMSkgQ3VycmVudCB0aGVtZQotICAgICAqICAgMikgU3VwcGxpZWQgdGhlbWUKLSAgICAgKiAgIDMpIEJhc2UgTWVkaWEgUm91dGVyIHRoZW1lCi0gICAgICogICA0KSBDdXN0b20gTWVkaWEgUm91dGVyIHRoZW1lLCBpZiBwcm92aWRlZAotICAgICAqLwotICAgIHN0YXRpYyBDb250ZXh0IGNyZWF0ZVRoZW1lZERpYWxvZ0NvbnRleHQoQ29udGV4dCBjb250ZXh0LCBpbnQgdGhlbWUsIGJvb2xlYW4gYWxlcnREaWFsb2cpIHsKLSAgICAgICAgLy8gMSkgQ3VycmVudCB0aGVtZSBpcyBhbHJlYWR5IGFwcGxpZWQgdG8gdGhlIGNvbnRleHQKLQotICAgICAgICAvLyAyKSBJZiBubyB0aGVtZSBpcyBzdXBwbGllZCwgbG9vayBpdCB1cCBmcm9tIHRoZSBjb250ZXh0IChkaWFsb2dUaGVtZS9hbGVydERpYWxvZ1RoZW1lKQotICAgICAgICBpZiAodGhlbWUgPT0gMCkgewotICAgICAgICAgICAgdGhlbWUgPSBnZXRUaGVtZVJlc291cmNlKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICFhbGVydERpYWxvZyA/IGFuZHJvaWQuUi5hdHRyLmRpYWxvZ1RoZW1lIDogYW5kcm9pZC5SLmF0dHIuYWxlcnREaWFsb2dUaGVtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gICAgQXBwbHkgaXQKLSAgICAgICAgY29udGV4dCA9IG5ldyBDb250ZXh0VGhlbWVXcmFwcGVyKGNvbnRleHQsIHRoZW1lKTsKLQotICAgICAgICAvLyAzKSBJZiBhIGN1c3RvbSBNZWRpYSBSb3V0ZXIgdGhlbWUgaXMgcHJvdmlkZWQgdGhlbiBhcHBseSB0aGUgYmFzZSB0aGVtZQotICAgICAgICBpZiAoZ2V0VGhlbWVSZXNvdXJjZShjb250ZXh0LCBSLmF0dHIubWVkaWFSb3V0ZVRoZW1lKSAhPSAwKSB7Ci0gICAgICAgICAgICBjb250ZXh0ID0gbmV3IENvbnRleHRUaGVtZVdyYXBwZXIoY29udGV4dCwgZ2V0Um91dGVyVGhlbWVJZChjb250ZXh0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29udGV4dDsKLSAgICB9Ci0gICAgLy8gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgcHJldmlvdXMgbWV0aG9kLgotICAgIHN0YXRpYyBpbnQgY3JlYXRlVGhlbWVkRGlhbG9nU3R5bGUoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIC8vIDQpIEFwcGx5IHRoZSBjdXN0b20gTWVkaWEgUm91dGVyIHRoZW1lCi0gICAgICAgIGludCB0aGVtZSA9IGdldFRoZW1lUmVzb3VyY2UoY29udGV4dCwgUi5hdHRyLm1lZGlhUm91dGVUaGVtZSk7Ci0gICAgICAgIGlmICh0aGVtZSA9PSAwKSB7Ci0gICAgICAgICAgICAvLyAzKSBObyBjdXN0b20gTWVkaWFSb3V0ZXIgdGhlbWUgd2FzIHByb3ZpZGVkIHNvIGFwcGx5IHRoZSBiYXNlIHRoZW1lIGluc3RlYWQKLSAgICAgICAgICAgIHRoZW1lID0gZ2V0Um91dGVyVGhlbWVJZChjb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0aGVtZTsKLSAgICB9Ci0gICAgLy8gRU5ELiBQcmV2aW91cyB0d28gbWV0aG9kcyBzaG91bGQgYmUgdXNlZCBpbiBjb25qdW5jdGlvbi4KLQotICAgIHN0YXRpYyBpbnQgZ2V0VGhlbWVSZXNvdXJjZShDb250ZXh0IGNvbnRleHQsIGludCBhdHRyKSB7Ci0gICAgICAgIFR5cGVkVmFsdWUgdmFsdWUgPSBuZXcgVHlwZWRWYWx1ZSgpOwotICAgICAgICByZXR1cm4gY29udGV4dC5nZXRUaGVtZSgpLnJlc29sdmVBdHRyaWJ1dGUoYXR0ciwgdmFsdWUsIHRydWUpID8gdmFsdWUucmVzb3VyY2VJZCA6IDA7Ci0gICAgfQotCi0gICAgc3RhdGljIGZsb2F0IGdldERpc2FibGVkQWxwaGEoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFR5cGVkVmFsdWUgdmFsdWUgPSBuZXcgVHlwZWRWYWx1ZSgpOwotICAgICAgICByZXR1cm4gY29udGV4dC5nZXRUaGVtZSgpLnJlc29sdmVBdHRyaWJ1dGUoYW5kcm9pZC5SLmF0dHIuZGlzYWJsZWRBbHBoYSwgdmFsdWUsIHRydWUpCi0gICAgICAgICAgICAgICAgPyB2YWx1ZS5nZXRGbG9hdCgpIDogMC41ZjsKLSAgICB9Ci0KLSAgICBzdGF0aWMgQENvbnRyb2xsZXJDb2xvclR5cGUgaW50IGdldENvbnRyb2xsZXJDb2xvcihDb250ZXh0IGNvbnRleHQsIGludCBzdHlsZSkgewotICAgICAgICBpbnQgcHJpbWFyeUNvbG9yID0gZ2V0VGhlbWVDb2xvcihjb250ZXh0LCBzdHlsZSwgYW5kcm9pZC5SLmF0dHIuY29sb3JQcmltYXJ5KTsKLSAgICAgICAgaWYgKHByaW1hcnlDb2xvciA9PSAwKSB7Ci0gICAgICAgICAgICBwcmltYXJ5Q29sb3IgPSBnZXRUaGVtZUNvbG9yKGNvbnRleHQsIHN0eWxlLCBhbmRyb2lkLlIuYXR0ci5jb2xvclByaW1hcnkpOwotICAgICAgICAgICAgaWYgKHByaW1hcnlDb2xvciA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcHJpbWFyeUNvbG9yID0gMHhGRjAwMDAwMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoQ29sb3JVdGlscy5jYWxjdWxhdGVDb250cmFzdChDT0xPUl9XSElURV9PTl9EQVJLX0JBQ0tHUk9VTkQsIHByaW1hcnlDb2xvcikKLSAgICAgICAgICAgICAgICA+PSBNSU5fQ09OVFJBU1QpIHsKLSAgICAgICAgICAgIHJldHVybiBDT0xPUl9XSElURV9PTl9EQVJLX0JBQ0tHUk9VTkQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENPTE9SX0RBUktfT05fTElHSFRfQkFDS0dST1VORDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgaW50IGdldEJ1dHRvblRleHRDb2xvcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaW50IHByaW1hcnlDb2xvciA9IGdldFRoZW1lQ29sb3IoY29udGV4dCwgMCwgYW5kcm9pZC5SLmF0dHIuY29sb3JQcmltYXJ5KTsKLSAgICAgICAgaW50IGJhY2tncm91bmRDb2xvciA9IGdldFRoZW1lQ29sb3IoY29udGV4dCwgMCwgYW5kcm9pZC5SLmF0dHIuY29sb3JCYWNrZ3JvdW5kKTsKLQotICAgICAgICBpZiAoQ29sb3JVdGlscy5jYWxjdWxhdGVDb250cmFzdChwcmltYXJ5Q29sb3IsIGJhY2tncm91bmRDb2xvcikgPCBNSU5fQ09OVFJBU1QpIHsKLSAgICAgICAgICAgIC8vIERlZmF1bHQgdG8gY29sb3JBY2NlbnQgaWYgdGhlIGNvbnRyYXN0IHJhdGlvIGlzIGxvdy4KLSAgICAgICAgICAgIHJldHVybiBnZXRUaGVtZUNvbG9yKGNvbnRleHQsIDAsIGFuZHJvaWQuUi5hdHRyLmNvbG9yQWNjZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJpbWFyeUNvbG9yOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHNldE1lZGlhQ29udHJvbHNCYWNrZ3JvdW5kQ29sb3IoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIFZpZXcgbWFpbkNvbnRyb2xzLCBWaWV3IGdyb3VwQ29udHJvbHMsIGJvb2xlYW4gaGFzR3JvdXApIHsKLSAgICAgICAgaW50IHByaW1hcnlDb2xvciA9IGdldFRoZW1lQ29sb3IoY29udGV4dCwgMCwgYW5kcm9pZC5SLmF0dHIuY29sb3JQcmltYXJ5KTsKLSAgICAgICAgaW50IHByaW1hcnlEYXJrQ29sb3IgPSBnZXRUaGVtZUNvbG9yKGNvbnRleHQsIDAsIGFuZHJvaWQuUi5hdHRyLmNvbG9yUHJpbWFyeURhcmspOwotICAgICAgICBpZiAoaGFzR3JvdXAgJiYgZ2V0Q29udHJvbGxlckNvbG9yKGNvbnRleHQsIDApID09IENPTE9SX0RBUktfT05fTElHSFRfQkFDS0dST1VORCkgewotICAgICAgICAgICAgLy8gSW5zdGVhZCBvZiBzaG93aW5nIGRhcmsgY29udHJvbHMgaW4gYSBwb3NzaWJseSBkYXJrIChpLmUuIHRoZSBwcmltYXJ5IGRhcmspLCBtb2RlbAotICAgICAgICAgICAgLy8gdGhlIHdoaXRlIGRpYWxvZyBhbmQgdXNlIHRoZSBwcmltYXJ5IGNvbG9yIGZvciB0aGUgZ3JvdXAgY29udHJvbHMuCi0gICAgICAgICAgICBwcmltYXJ5RGFya0NvbG9yID0gcHJpbWFyeUNvbG9yOwotICAgICAgICAgICAgcHJpbWFyeUNvbG9yID0gQ29sb3IuV0hJVEU7Ci0gICAgICAgIH0KLSAgICAgICAgbWFpbkNvbnRyb2xzLnNldEJhY2tncm91bmRDb2xvcihwcmltYXJ5Q29sb3IpOwotICAgICAgICBncm91cENvbnRyb2xzLnNldEJhY2tncm91bmRDb2xvcihwcmltYXJ5RGFya0NvbG9yKTsKLSAgICAgICAgLy8gQWxzbyBzdG9yZSB0aGUgYmFja2dyb3VuZCBjb2xvcnMgdG8gdGhlIHZpZXcgdGFncy4gVGhleSBhcmUgdXNlZCBpbgotICAgICAgICAvLyBzZXRWb2x1bWVTbGlkZXJDb2xvcigpIGJlbG93LgotICAgICAgICBtYWluQ29udHJvbHMuc2V0VGFnKHByaW1hcnlDb2xvcik7Ci0gICAgICAgIGdyb3VwQ29udHJvbHMuc2V0VGFnKHByaW1hcnlEYXJrQ29sb3IpOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHNldFZvbHVtZVNsaWRlckNvbG9yKAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBNZWRpYVJvdXRlVm9sdW1lU2xpZGVyIHZvbHVtZVNsaWRlciwgVmlldyBiYWNrZ3JvdW5kVmlldykgewotICAgICAgICBpbnQgY29udHJvbGxlckNvbG9yID0gZ2V0Q29udHJvbGxlckNvbG9yKGNvbnRleHQsIDApOwotICAgICAgICBpZiAoQ29sb3IuYWxwaGEoY29udHJvbGxlckNvbG9yKSAhPSAweEZGKSB7Ci0gICAgICAgICAgICAvLyBDb21wb3NpdGUgd2l0aCB0aGUgYmFja2dyb3VuZCBpbiBvcmRlciBub3QgdG8gc2hvdyB0aGUgdW5kZXJseWluZyBwcm9ncmVzcyBiYXIKLSAgICAgICAgICAgIC8vIHRocm91Z2ggdGhlIHRodW1iLgotICAgICAgICAgICAgaW50IGJhY2tncm91bmRDb2xvciA9IChpbnQpIGJhY2tncm91bmRWaWV3LmdldFRhZygpOwotICAgICAgICAgICAgY29udHJvbGxlckNvbG9yID0gQ29sb3JVdGlscy5jb21wb3NpdGVDb2xvcnMoY29udHJvbGxlckNvbG9yLCBiYWNrZ3JvdW5kQ29sb3IpOwotICAgICAgICB9Ci0gICAgICAgIHZvbHVtZVNsaWRlci5zZXRDb2xvcihjb250cm9sbGVyQ29sb3IpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNMaWdodFRoZW1lKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBUeXBlZFZhbHVlIHZhbHVlID0gbmV3IFR5cGVkVmFsdWUoKTsKLSAgICAgICAgLy8gVE9ETyhzdW5nc29vKTogU3dpdGNoIHRvIGNvbS5hbmRyb2lkLmludGVybmFsLlIuYXR0ci5pc0xpZ2h0VGhlbWUKLSAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0VGhlbWUoKS5yZXNvbHZlQXR0cmlidXRlKGFuZHJvaWQuc3VwcG9ydC52Ny5hcHBjb21wYXQuUi5hdHRyLmlzTGlnaHRUaGVtZSwKLSAgICAgICAgICAgICAgICB2YWx1ZSwgdHJ1ZSkgJiYgdmFsdWUuZGF0YSAhPSAwOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCBnZXRUaGVtZUNvbG9yKENvbnRleHQgY29udGV4dCwgaW50IHN0eWxlLCBpbnQgYXR0cikgewotICAgICAgICBpZiAoc3R5bGUgIT0gMCkgewotICAgICAgICAgICAgaW50W10gYXR0cnMgPSB7IGF0dHIgfTsKLSAgICAgICAgICAgIFR5cGVkQXJyYXkgdGEgPSBjb250ZXh0Lm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoc3R5bGUsIGF0dHJzKTsKLSAgICAgICAgICAgIGludCBjb2xvciA9IHRhLmdldENvbG9yKDAsIDApOwotICAgICAgICAgICAgdGEucmVjeWNsZSgpOwotICAgICAgICAgICAgaWYgKGNvbG9yICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gY29sb3I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7Ci0gICAgICAgIGNvbnRleHQuZ2V0VGhlbWUoKS5yZXNvbHZlQXR0cmlidXRlKGF0dHIsIHZhbHVlLCB0cnVlKTsKLSAgICAgICAgaWYgKHZhbHVlLnJlc291cmNlSWQgIT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0UmVzb3VyY2VzKCkuZ2V0Q29sb3IodmFsdWUucmVzb3VyY2VJZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlLmRhdGE7Ci0gICAgfQotCi0gICAgc3RhdGljIGludCBnZXRSb3V0ZXJUaGVtZUlkKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBpbnQgdGhlbWVJZDsKLSAgICAgICAgaWYgKGlzTGlnaHRUaGVtZShjb250ZXh0KSkgewotICAgICAgICAgICAgaWYgKGdldENvbnRyb2xsZXJDb2xvcihjb250ZXh0LCAwKSA9PSBDT0xPUl9EQVJLX09OX0xJR0hUX0JBQ0tHUk9VTkQpIHsKLSAgICAgICAgICAgICAgICB0aGVtZUlkID0gUi5zdHlsZS5UaGVtZV9NZWRpYVJvdXRlcl9MaWdodDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhlbWVJZCA9IFIuc3R5bGUuVGhlbWVfTWVkaWFSb3V0ZXJfTGlnaHRfRGFya0NvbnRyb2xQYW5lbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChnZXRDb250cm9sbGVyQ29sb3IoY29udGV4dCwgMCkgPT0gQ09MT1JfREFSS19PTl9MSUdIVF9CQUNLR1JPVU5EKSB7Ci0gICAgICAgICAgICAgICAgdGhlbWVJZCA9IFIuc3R5bGUuVGhlbWVfTWVkaWFSb3V0ZXJfTGlnaHRDb250cm9sUGFuZWw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRoZW1lSWQgPSBSLnN0eWxlLlRoZW1lX01lZGlhUm91dGVyOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGVtZUlkOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvT3ZlcmxheUxpc3RWaWV3LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL092ZXJsYXlMaXN0Vmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDBkZWUyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvT3ZlcmxheUxpc3RWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5JbnRlcnBvbGF0b3I7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBBIExpc3RWaWV3IHdoaWNoIGhhcyBhbiBhZGRpdGlvbmFsIG92ZXJsYXkgbGF5ZXIuIHtAbGluayBCaXRtYXBEcmF3YWJsZX0KLSAqIGNhbiBiZSBhZGRlZCB0byB0aGUgbGF5ZXIgYW5kIGNhbiBiZSBhbmltYXRlZC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE92ZXJsYXlMaXN0VmlldyBleHRlbmRzIExpc3RWaWV3IHsKLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8T3ZlcmxheU9iamVjdD4gbU92ZXJsYXlPYmplY3RzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KLSAgICBwdWJsaWMgT3ZlcmxheUxpc3RWaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT3ZlcmxheUxpc3RWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT3ZlcmxheUxpc3RWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYW4gb2JqZWN0IHRvIHRoZSBvdmVybGF5IGxheWVyLgotICAgICAqCi0gICAgICogQHBhcmFtIG9iamVjdCBBbiBvYmplY3QgdG8gYmUgYWRkZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkT3ZlcmxheU9iamVjdChPdmVybGF5T2JqZWN0IG9iamVjdCkgewotICAgICAgICBtT3ZlcmxheU9iamVjdHMuYWRkKG9iamVjdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RhcnRzIGFsbCBhbmltYXRpb25zIG9mIG9iamVjdHMgaW4gdGhlIG92ZXJsYXkgbGF5ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRBbmltYXRpb25BbGwoKSB7Ci0gICAgICAgIGZvciAoT3ZlcmxheU9iamVjdCBvYmplY3QgOiBtT3ZlcmxheU9iamVjdHMpIHsKLSAgICAgICAgICAgIGlmICghb2JqZWN0LmlzQW5pbWF0aW9uU3RhcnRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgb2JqZWN0LnN0YXJ0QW5pbWF0aW9uKGdldERyYXdpbmdUaW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcHMgYWxsIGFuaW1hdGlvbnMgb2Ygb2JqZWN0cyBpbiB0aGUgb3ZlcmxheSBsYXllci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdG9wQW5pbWF0aW9uQWxsKCkgewotICAgICAgICBmb3IgKE92ZXJsYXlPYmplY3Qgb2JqZWN0IDogbU92ZXJsYXlPYmplY3RzKSB7Ci0gICAgICAgICAgICBvYmplY3Quc3RvcEFuaW1hdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EcmF3KENhbnZhcyBjYW52YXMpIHsKLSAgICAgICAgc3VwZXIub25EcmF3KGNhbnZhcyk7Ci0gICAgICAgIGlmIChtT3ZlcmxheU9iamVjdHMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgSXRlcmF0b3I8T3ZlcmxheU9iamVjdD4gaXQgPSBtT3ZlcmxheU9iamVjdHMuaXRlcmF0b3IoKTsKLSAgICAgICAgICAgIHdoaWxlIChpdC5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICBPdmVybGF5T2JqZWN0IG9iamVjdCA9IGl0Lm5leHQoKTsKLSAgICAgICAgICAgICAgICBCaXRtYXBEcmF3YWJsZSBiaXRtYXAgPSBvYmplY3QuZ2V0Qml0bWFwRHJhd2FibGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoYml0bWFwICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgYml0bWFwLmRyYXcoY2FudmFzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFvYmplY3QudXBkYXRlKGdldERyYXdpbmdUaW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGl0LnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgY2xhc3MgdGhhdCByZXByZXNlbnRzIGFuIG9iamVjdCB0byBiZSBzaG93biBpbiB0aGUgb3ZlcmxheSBsYXllci4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIE92ZXJsYXlPYmplY3QgewotICAgICAgICBwcml2YXRlIEJpdG1hcERyYXdhYmxlIG1CaXRtYXA7Ci0gICAgICAgIHByaXZhdGUgZmxvYXQgbUN1cnJlbnRBbHBoYSA9IDEuMGY7Ci0gICAgICAgIHByaXZhdGUgUmVjdCBtQ3VycmVudEJvdW5kczsKLSAgICAgICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUludGVycG9sYXRvcjsKLSAgICAgICAgcHJpdmF0ZSBsb25nIG1EdXJhdGlvbjsKLSAgICAgICAgcHJpdmF0ZSBSZWN0IG1TdGFydFJlY3Q7Ci0gICAgICAgIHByaXZhdGUgaW50IG1EZWx0YVk7Ci0gICAgICAgIHByaXZhdGUgZmxvYXQgbVN0YXJ0QWxwaGEgPSAxLjBmOwotICAgICAgICBwcml2YXRlIGZsb2F0IG1FbmRBbHBoYSA9IDEuMGY7Ci0gICAgICAgIHByaXZhdGUgbG9uZyBtU3RhcnRUaW1lOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUlzQW5pbWF0aW9uU3RhcnRlZDsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1Jc0FuaW1hdGlvbkVuZGVkOwotICAgICAgICBwcml2YXRlIE9uQW5pbWF0aW9uRW5kTGlzdGVuZXIgbUxpc3RlbmVyOwotCi0gICAgICAgIHB1YmxpYyBPdmVybGF5T2JqZWN0KEJpdG1hcERyYXdhYmxlIGJpdG1hcCwgUmVjdCBzdGFydFJlY3QpIHsKLSAgICAgICAgICAgIG1CaXRtYXAgPSBiaXRtYXA7Ci0gICAgICAgICAgICBtU3RhcnRSZWN0ID0gc3RhcnRSZWN0OwotICAgICAgICAgICAgbUN1cnJlbnRCb3VuZHMgPSBuZXcgUmVjdChzdGFydFJlY3QpOwotICAgICAgICAgICAgaWYgKG1CaXRtYXAgIT0gbnVsbCAmJiBtQ3VycmVudEJvdW5kcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUJpdG1hcC5zZXRBbHBoYSgoaW50KSAobUN1cnJlbnRBbHBoYSAqIDI1NSkpOwotICAgICAgICAgICAgICAgIG1CaXRtYXAuc2V0Qm91bmRzKG1DdXJyZW50Qm91bmRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBiaXRtYXAgdGhhdCB0aGlzIG9iamVjdCByZXByZXNlbnRzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIEJpdG1hcERyYXdhYmxlIHRoYXQgdGhpcyBvYmplY3QgaGFzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJpdG1hcERyYXdhYmxlIGdldEJpdG1hcERyYXdhYmxlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1CaXRtYXA7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgc3RhcnRlZCBzdGF0dXMgb2YgdGhlIGFuaW1hdGlvbi4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBhbmltYXRpb24gaGFzIHN0YXJ0ZWQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQW5pbWF0aW9uU3RhcnRlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSXNBbmltYXRpb25TdGFydGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgYW5pbWF0aW9uIGZvciB2YXJ5aW5nIGFscGhhLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc3RhcnRBbHBoYSBTdGFydGluZyBhbHBoYSB2YWx1ZSBmb3IgdGhlIGFuaW1hdGlvbiwgd2hlcmUgMS4wIG1lYW5zCi0gICAgICAgICAqIGZ1bGx5IG9wYXF1ZSBhbmQgMC4wIG1lYW5zIGZ1bGx5IHRyYW5zcGFyZW50LgotICAgICAgICAgKiBAcGFyYW0gZW5kQWxwaGEgRW5kaW5nIGFscGhhIHZhbHVlIGZvciB0aGUgYW5pbWF0aW9uLgotICAgICAgICAgKiBAcmV0dXJuIFRoaXMgT3ZlcmxheU9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5pbmcgb2YgY2FsbHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT3ZlcmxheU9iamVjdCBzZXRBbHBoYUFuaW1hdGlvbihmbG9hdCBzdGFydEFscGhhLCBmbG9hdCBlbmRBbHBoYSkgewotICAgICAgICAgICAgbVN0YXJ0QWxwaGEgPSBzdGFydEFscGhhOwotICAgICAgICAgICAgbUVuZEFscGhhID0gZW5kQWxwaGE7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIGFuaW1hdGlvbiBmb3IgbW92aW5nIG9iamVjdHMgdmVydGljYWxseS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGRlbHRhWSBEaXN0YW5jZSB0byBtb3ZlIGluIHBpeGVscy4KLSAgICAgICAgICogQHJldHVybiBUaGlzIE92ZXJsYXlPYmplY3QgdG8gYWxsb3cgZm9yIGNoYWluaW5nIG9mIGNhbGxzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE92ZXJsYXlPYmplY3Qgc2V0VHJhbnNsYXRlWUFuaW1hdGlvbihpbnQgZGVsdGFZKSB7Ci0gICAgICAgICAgICBtRGVsdGFZID0gZGVsdGFZOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyBob3cgbG9uZyB0aGUgYW5pbWF0aW9uIHdpbGwgbGFzdC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGR1cmF0aW9uIER1cmF0aW9uIGluIG1pbGxpc2Vjb25kcwotICAgICAgICAgKiBAcmV0dXJuIFRoaXMgT3ZlcmxheU9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5pbmcgb2YgY2FsbHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT3ZlcmxheU9iamVjdCBzZXREdXJhdGlvbihsb25nIGR1cmF0aW9uKSB7Ci0gICAgICAgICAgICBtRHVyYXRpb24gPSBkdXJhdGlvbjsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIGFjY2VsZXJhdGlvbiBjdXJ2ZSBmb3IgdGhpcyBhbmltYXRpb24uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpbnRlcnBvbGF0b3IgVGhlIGludGVycG9sYXRvciB3aGljaCBkZWZpbmVzIHRoZSBhY2NlbGVyYXRpb24gY3VydmUKLSAgICAgICAgICogQHJldHVybiBUaGlzIE92ZXJsYXlPYmplY3QgdG8gYWxsb3cgZm9yIGNoYWluaW5nIG9mIGNhbGxzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE92ZXJsYXlPYmplY3Qgc2V0SW50ZXJwb2xhdG9yKEludGVycG9sYXRvciBpbnRlcnBvbGF0b3IpIHsKLSAgICAgICAgICAgIG1JbnRlcnBvbGF0b3IgPSBpbnRlcnBvbGF0b3I7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCaW5kcyBhbiBhbmltYXRpb24gZW5kIGxpc3RlbmVyIHRvIHRoZSBhbmltYXRpb24uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBsaXN0ZW5lciB0aGUgYW5pbWF0aW9uIGVuZCBsaXN0ZW5lciB0byBiZSBub3RpZmllZC4KLSAgICAgICAgICogQHJldHVybiBUaGlzIE92ZXJsYXlPYmplY3QgdG8gYWxsb3cgZm9yIGNoYWluaW5nIG9mIGNhbGxzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE92ZXJsYXlPYmplY3Qgc2V0QW5pbWF0aW9uRW5kTGlzdGVuZXIoT25BbmltYXRpb25FbmRMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTdGFydHMgdGhlIGFuaW1hdGlvbiBhbmQgc2V0cyB0aGUgc3RhcnQgdGltZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHN0YXJ0VGltZSBTdGFydCB0aW1lIHRvIGJlIHNldCBpbiBNaWxsaXMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0QW5pbWF0aW9uKGxvbmcgc3RhcnRUaW1lKSB7Ci0gICAgICAgICAgICBtU3RhcnRUaW1lID0gc3RhcnRUaW1lOwotICAgICAgICAgICAgbUlzQW5pbWF0aW9uU3RhcnRlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU3RvcHMgdGhlIGFuaW1hdGlvbi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0b3BBbmltYXRpb24oKSB7Ci0gICAgICAgICAgICBtSXNBbmltYXRpb25TdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIG1Jc0FuaW1hdGlvbkVuZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1MaXN0ZW5lci5vbkFuaW1hdGlvbkVuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGN1bGF0ZXMgYW5kIHVwZGF0ZXMgY3VycmVudCBib3VuZHMgYW5kIGFscGhhIHZhbHVlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY3VycmVudFRpbWUgQ3VycmVudCB0aW1lLmluIG1pbGxpcwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gdXBkYXRlKGxvbmcgY3VycmVudFRpbWUpIHsKLSAgICAgICAgICAgIGlmIChtSXNBbmltYXRpb25FbmRlZCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZsb2F0IG5vcm1hbGl6ZWRUaW1lID0gKGN1cnJlbnRUaW1lIC0gbVN0YXJ0VGltZSkgLyAoZmxvYXQpIG1EdXJhdGlvbjsKLSAgICAgICAgICAgIG5vcm1hbGl6ZWRUaW1lID0gTWF0aC5tYXgoMC4wZiwgTWF0aC5taW4oMS4wZiwgbm9ybWFsaXplZFRpbWUpKTsKLSAgICAgICAgICAgIGlmICghbUlzQW5pbWF0aW9uU3RhcnRlZCkgewotICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRUaW1lID0gMC4wZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZsb2F0IGludGVycG9sYXRlZFRpbWUgPSAobUludGVycG9sYXRvciA9PSBudWxsKSA/IG5vcm1hbGl6ZWRUaW1lCi0gICAgICAgICAgICAgICAgICAgIDogbUludGVycG9sYXRvci5nZXRJbnRlcnBvbGF0aW9uKG5vcm1hbGl6ZWRUaW1lKTsKLSAgICAgICAgICAgIGludCBkZWx0YVkgPSAoaW50KSAobURlbHRhWSAqIGludGVycG9sYXRlZFRpbWUpOwotICAgICAgICAgICAgbUN1cnJlbnRCb3VuZHMudG9wID0gbVN0YXJ0UmVjdC50b3AgKyBkZWx0YVk7Ci0gICAgICAgICAgICBtQ3VycmVudEJvdW5kcy5ib3R0b20gPSBtU3RhcnRSZWN0LmJvdHRvbSArIGRlbHRhWTsKLSAgICAgICAgICAgIG1DdXJyZW50QWxwaGEgPSBtU3RhcnRBbHBoYSArIChtRW5kQWxwaGEgLSBtU3RhcnRBbHBoYSkgKiBpbnRlcnBvbGF0ZWRUaW1lOwotICAgICAgICAgICAgaWYgKG1CaXRtYXAgIT0gbnVsbCAmJiBtQ3VycmVudEJvdW5kcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUJpdG1hcC5zZXRBbHBoYSgoaW50KSAobUN1cnJlbnRBbHBoYSAqIDI1NSkpOwotICAgICAgICAgICAgICAgIG1CaXRtYXAuc2V0Qm91bmRzKG1DdXJyZW50Qm91bmRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtSXNBbmltYXRpb25TdGFydGVkICYmIG5vcm1hbGl6ZWRUaW1lID49IDEuMGYpIHsKLSAgICAgICAgICAgICAgICBtSXNBbmltYXRpb25FbmRlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lci5vbkFuaW1hdGlvbkVuZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAhbUlzQW5pbWF0aW9uRW5kZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQW4gYW5pbWF0aW9uIGxpc3RlbmVyIHRoYXQgcmVjZWl2ZXMgbm90aWZpY2F0aW9ucyB3aGVuIHRoZSBhbmltYXRpb24gZW5kcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnRlcmZhY2UgT25BbmltYXRpb25FbmRMaXN0ZW5lciB7Ci0gICAgICAgICAgICAvKioKLSAgICAgICAgICAgICAqIE5vdGlmaWVzIHRoZSBlbmQgb2YgdGhlIGFuaW1hdGlvbi4KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9qZWxseWJlYW4tbXIxL01lZGlhUm91dGVySmVsbHliZWFuTXIxLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuLW1yMS9NZWRpYVJvdXRlckplbGx5YmVhbk1yMS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODUzOWJkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9qZWxseWJlYW4tbXIxL01lZGlhUm91dGVySmVsbHliZWFuTXIxLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5kaXNwbGF5LkRpc3BsYXlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLlJlcXVpcmVzQXBpOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5GaWVsZDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotLy8gQEBSZXF1aXJlc0FwaSgxNykKLWZpbmFsIGNsYXNzIE1lZGlhUm91dGVySmVsbHliZWFuTXIxIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVySmVsbHliZWFuTXIxIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZUNhbGxiYWNrKENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ2FsbGJhY2tQcm94eTxDYWxsYmFjaz4oY2FsbGJhY2spOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUm91dGVJbmZvIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRW5hYmxlZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5pc0VuYWJsZWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgRGlzcGxheSBnZXRQcmVzZW50YXRpb25EaXNwbGF5KE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgLy8gYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8uZ2V0UHJlc2VudGF0aW9uRGlzcGxheSgpIHdhcwotICAgICAgICAgICAgLy8gYWRkZWQgaW4gQVBJIDE3LiBIb3dldmVyLCBzb21lIGZhY3RvcnkgcmVsZWFzZXMgb2YgSkIgTVIxIG1pc3NlZCBpdC4KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFByZXNlbnRhdGlvbkRpc3BsYXkoKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEVycm9yIGV4KSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGdldCBwcmVzZW50YXRpb24gZGlzcGxheSBmb3IgdGhlIHJvdXRlLiIsIGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlckplbGx5YmVhbi5DYWxsYmFjayB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZChPYmplY3Qgcm91dGVPYmopOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdvcmthcm91bmQgdGhlIGZhY3QgdGhhdCB0aGUgdmVyc2lvbiBvZiBNZWRpYVJvdXRlci5hZGRDYWxsYmFjaygpIHRoYXQgYWNjZXB0cyBhCi0gICAgICogZmxhZyB0byBwZXJmb3JtIGFuIGFjdGl2ZSBzY2FuIGRvZXMgbm90IGV4aXN0IGluIEpCIE1SMSBzbyB3ZSBuZWVkIHRvIGZvcmNlCi0gICAgICogd2lmaSBkaXNwbGF5IHNjYW5zIGRpcmVjdGx5IHRocm91Z2ggdGhlIERpc3BsYXlNYW5hZ2VyLgotICAgICAqIERvIG5vdCB1c2Ugb24gSkIgTVIyIGFuZCBhYm92ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEFjdGl2ZVNjYW5Xb3JrYXJvdW5kIGltcGxlbWVudHMgUnVubmFibGUgewotICAgICAgICAvLyBUaW1lIGJldHdlZW4gd2lmaSBkaXNwbGF5IHNjYW5zIHdoZW4gYWN0aXZlbHkgc2Nhbm5pbmcgaW4gbWlsbGlzZWNvbmRzLgotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0lGSV9ESVNQTEFZX1NDQU5fSU5URVJWQUwgPSAxNTAwMDsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIERpc3BsYXlNYW5hZ2VyIG1EaXNwbGF5TWFuYWdlcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyOwotICAgICAgICBwcml2YXRlIE1ldGhvZCBtU2NhbldpZmlEaXNwbGF5c01ldGhvZDsKLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUFjdGl2ZWx5U2Nhbm5pbmdXaWZpRGlzcGxheXM7Ci0KLSAgICAgICAgcHVibGljIEFjdGl2ZVNjYW5Xb3JrYXJvdW5kKENvbnRleHQgY29udGV4dCwgSGFuZGxlciBoYW5kbGVyKSB7Ci0gICAgICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UICE9IDE3KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1EaXNwbGF5TWFuYWdlciA9IChEaXNwbGF5TWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuRElTUExBWV9TRVJWSUNFKTsKLSAgICAgICAgICAgIG1IYW5kbGVyID0gaGFuZGxlcjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbVNjYW5XaWZpRGlzcGxheXNNZXRob2QgPSBEaXNwbGF5TWFuYWdlci5jbGFzcy5nZXRNZXRob2QoInNjYW5XaWZpRGlzcGxheXMiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0QWN0aXZlU2NhblJvdXRlVHlwZXMoaW50IHJvdXRlVHlwZXMpIHsKLSAgICAgICAgICAgIC8vIE9uIEpCIE1SMSwgdGhlcmUgaXMgbm8gQVBJIHRvIHNjYW4gd2lmaSBkaXNwbGF5IHJvdXRlcy4KLSAgICAgICAgICAgIC8vIEluc3RlYWQgd2UgbXVzdCBtYWtlIGEgZGlyZWN0IGNhbGwgaW50byB0aGUgRGlzcGxheU1hbmFnZXIgdG8gc2NhbgotICAgICAgICAgICAgLy8gd2lmaSBkaXNwbGF5cyBvbiB0aGlzIHZlcnNpb24gYnV0IG9ubHkgd2hlbiBsaXZlIHZpZGVvIHJvdXRlcyBhcmUgcmVxdWVzdGVkLgotICAgICAgICAgICAgLy8gU2VlIGFsc28gdGhlIEplbGx5YmVhbk1yMkltcGwgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBtZXRob2QuCi0gICAgICAgICAgICAvLyBUaGlzIHdhcyBmaXhlZCBpbiBKQiBNUjIgYnkgYWRkaW5nIGEgbmV3IG92ZXJsb2FkIG9mIGFkZENhbGxiYWNrKCkgdG8KLSAgICAgICAgICAgIC8vIGVuYWJsZSBhY3RpdmUgc2Nhbm5pbmcgb24gcmVxdWVzdC4KLSAgICAgICAgICAgIGlmICgocm91dGVUeXBlcyAmIE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfTElWRV9WSURFTykgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmICghbUFjdGl2ZWx5U2Nhbm5pbmdXaWZpRGlzcGxheXMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TY2FuV2lmaURpc3BsYXlzTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVseVNjYW5uaW5nV2lmaURpc3BsYXlzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1IYW5kbGVyLnBvc3QodGhpcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3Qgc2NhbiBmb3Igd2lmaSBkaXNwbGF5cyBiZWNhdXNlIHRoZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIkRpc3BsYXlNYW5hZ2VyLnNjYW5XaWZpRGlzcGxheXMoKSBtZXRob2QgaXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJub3QgYXZhaWxhYmxlIG9uIHRoaXMgZGV2aWNlLiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobUFjdGl2ZWx5U2Nhbm5pbmdXaWZpRGlzcGxheXMpIHsKLSAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZWx5U2Nhbm5pbmdXaWZpRGlzcGxheXMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKHRoaXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBpZiAobUFjdGl2ZWx5U2Nhbm5pbmdXaWZpRGlzcGxheXMpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBtU2NhbldpZmlEaXNwbGF5c01ldGhvZC5pbnZva2UobURpc3BsYXlNYW5hZ2VyKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBzY2FuIGZvciB3aWZpIGRpc3BsYXlzLiIsIGV4KTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBzY2FuIGZvciB3aWZpIGRpc3BsYXlzLiIsIGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdERlbGF5ZWQodGhpcywgV0lGSV9ESVNQTEFZX1NDQU5fSU5URVJWQUwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV29ya2Fyb3VuZCB0aGUgZmFjdCB0aGF0IHRoZSBpc0Nvbm5lY3RpbmcoKSBtZXRob2QgZG9lcyBub3QgZXhpc3QgaW4gSkIgTVIxLgotICAgICAqIERvIG5vdCB1c2Ugb24gSkIgTVIyIGFuZCBhYm92ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIElzQ29ubmVjdGluZ1dvcmthcm91bmQgewotICAgICAgICBwcml2YXRlIE1ldGhvZCBtR2V0U3RhdHVzQ29kZU1ldGhvZDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVN0YXR1c0Nvbm5lY3Rpbmc7Ci0KLSAgICAgICAgcHVibGljIElzQ29ubmVjdGluZ1dvcmthcm91bmQoKSB7Ci0gICAgICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UICE9IDE3KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgRmllbGQgc3RhdHVzQ29ubmVjdGluZ0ZpZWxkID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvLmNsYXNzLmdldEZpZWxkKCJTVEFUVVNfQ09OTkVDVElORyIpOwotICAgICAgICAgICAgICAgIG1TdGF0dXNDb25uZWN0aW5nID0gc3RhdHVzQ29ubmVjdGluZ0ZpZWxkLmdldEludChudWxsKTsKLSAgICAgICAgICAgICAgICBtR2V0U3RhdHVzQ29kZU1ldGhvZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mby5jbGFzcy5nZXRNZXRob2QoImdldFN0YXR1c0NvZGUiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGluZyhPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0KLSAgICAgICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqOwotCi0gICAgICAgICAgICBpZiAobUdldFN0YXR1c0NvZGVNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBzdGF0dXNDb2RlID0gKEludGVnZXIpbUdldFN0YXR1c0NvZGVNZXRob2QuaW52b2tlKHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1c0NvZGUgPT0gbVN0YXR1c0Nvbm5lY3Rpbmc7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEFzc3VtZSBub3QgY29ubmVjdGluZy4KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBDYWxsYmFja1Byb3h5PFQgZXh0ZW5kcyBDYWxsYmFjaz4KLSAgICAgICAgICAgIGV4dGVuZHMgTWVkaWFSb3V0ZXJKZWxseWJlYW4uQ2FsbGJhY2tQcm94eTxUPiB7Ci0gICAgICAgIHB1YmxpYyBDYWxsYmFja1Byb3h5KFQgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIHN1cGVyKGNhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUHJlc2VudGF0aW9uRGlzcGxheUNoYW5nZWQoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIsCi0gICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlUHJlc2VudGF0aW9uRGlzcGxheUNoYW5nZWQocm91dGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi1tcjIvTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9qZWxseWJlYW4tbXIyL01lZGlhUm91dGVySmVsbHliZWFuTXIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMDM1NDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi1tcjIvTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotLy8gQEBSZXF1aXJlc0FwaSgxOCkKLWZpbmFsIGNsYXNzIE1lZGlhUm91dGVySmVsbHliZWFuTXIyIHsKLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXREZWZhdWx0Um91dGUoT2JqZWN0IHJvdXRlck9iaikgewotICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuZ2V0RGVmYXVsdFJvdXRlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZENhbGxiYWNrKE9iamVjdCByb3V0ZXJPYmosIGludCB0eXBlcywgT2JqZWN0IGNhbGxiYWNrT2JqLCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuYWRkQ2FsbGJhY2sodHlwZXMsCi0gICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuQ2FsbGJhY2spY2FsbGJhY2tPYmosIGZsYWdzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlSW5mbyB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgQ2hhclNlcXVlbmNlIGdldERlc2NyaXB0aW9uKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNDb25uZWN0aW5nKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmlzQ29ubmVjdGluZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBVc2VyUm91dGVJbmZvIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldERlc2NyaXB0aW9uKE9iamVjdCByb3V0ZU9iaiwgQ2hhclNlcXVlbmNlIGRlc2NyaXB0aW9uKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0RGVzY3JpcHRpb24oZGVzY3JpcHRpb24pOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi9NZWRpYVJvdXRlckplbGx5YmVhbi5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi9NZWRpYVJvdXRlckplbGx5YmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYmI1OWI4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9qZWxseWJlYW4vTWVkaWFSb3V0ZXJKZWxseWJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8vIEBAUmVxdWlyZXNBcGkoMTYpCi1maW5hbCBjbGFzcyBNZWRpYVJvdXRlckplbGx5YmVhbiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlckplbGx5YmVhbiI7Ci0KLSAgICAvLyBhbmRyb2lkLm1lZGlhLkF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAgPSAweDgwOwotICAgIC8vIGFuZHJvaWQubWVkaWEuQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTID0gMHgxMDA7Ci0gICAgLy8gYW5kcm9pZC5tZWRpYS5BdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVIgPSAweDIwMDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfT1VUX0JMVUVUT09USCA9IDB4ODAgfCAweDEwMCB8IDB4MjAwOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUk9VVEVfVFlQRV9MSVZFX0FVRElPID0gMHgxOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPVVRFX1RZUEVfTElWRV9WSURFTyA9IDB4MjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBST1VURV9UWVBFX1VTRVIgPSAweDAwODAwMDAwOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQUxMX1JPVVRFX1RZUEVTID0KLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfTElWRV9BVURJTwotICAgICAgICAgICAgfCBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX0xJVkVfVklERU8KLSAgICAgICAgICAgIHwgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9VU0VSOwotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0TWVkaWFSb3V0ZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5NRURJQV9ST1VURVJfU0VSVklDRSk7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyAicmF3dHlwZXMiLCAidW5jaGVja2VkIiB9KQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSb3V0ZXMoT2JqZWN0IHJvdXRlck9iaikgewotICAgICAgICBmaW5hbCBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciA9IChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iajsKLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gcm91dGVyLmdldFJvdXRlQ291bnQoKTsKLSAgICAgICAgTGlzdCBvdXQgPSBuZXcgQXJyYXlMaXN0KGNvdW50KTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBvdXQuYWRkKHJvdXRlci5nZXRSb3V0ZUF0KGkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb3V0OwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiwgInVuY2hlY2tlZCIgfSkKLSAgICBwdWJsaWMgc3RhdGljIExpc3QgZ2V0Q2F0ZWdvcmllcyhPYmplY3Qgcm91dGVyT2JqKSB7Ci0gICAgICAgIGZpbmFsIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyID0gKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqOwotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSByb3V0ZXIuZ2V0Q2F0ZWdvcnlDb3VudCgpOwotICAgICAgICBMaXN0IG91dCA9IG5ldyBBcnJheUxpc3QoY291bnQpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIG91dC5hZGQocm91dGVyLmdldENhdGVnb3J5QXQoaSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvdXQ7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0U2VsZWN0ZWRSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBpbnQgdHlwZSkgewotICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuZ2V0U2VsZWN0ZWRSb3V0ZSh0eXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2VsZWN0Um91dGUoT2JqZWN0IHJvdXRlck9iaiwgaW50IHR5cGVzLCBPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuc2VsZWN0Um91dGUodHlwZXMsCi0gICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkQ2FsbGJhY2soT2JqZWN0IHJvdXRlck9iaiwgaW50IHR5cGVzLCBPYmplY3QgY2FsbGJhY2tPYmopIHsKLSAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuYWRkQ2FsbGJhY2sodHlwZXMsCi0gICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuQ2FsbGJhY2spY2FsbGJhY2tPYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVDYWxsYmFjayhPYmplY3Qgcm91dGVyT2JqLCBPYmplY3QgY2FsbGJhY2tPYmopIHsKLSAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikucmVtb3ZlQ2FsbGJhY2soCi0gICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuQ2FsbGJhY2spY2FsbGJhY2tPYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVJvdXRlQ2F0ZWdvcnkoT2JqZWN0IHJvdXRlck9iaiwKLSAgICAgICAgICAgIFN0cmluZyBuYW1lLCBib29sZWFuIGlzR3JvdXBhYmxlKSB7Ci0gICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5jcmVhdGVSb3V0ZUNhdGVnb3J5KG5hbWUsIGlzR3JvdXBhYmxlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVVc2VyUm91dGUoT2JqZWN0IHJvdXRlck9iaiwgT2JqZWN0IGNhdGVnb3J5T2JqKSB7Ci0gICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5jcmVhdGVVc2VyUm91dGUoCi0gICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVDYXRlZ29yeSljYXRlZ29yeU9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGFkZFVzZXJSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikuYWRkVXNlclJvdXRlKAotICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZW1vdmVVc2VyUm91dGUoT2JqZWN0IHJvdXRlck9iaiwgT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmopLnJlbW92ZVVzZXJSb3V0ZSgKLSAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVDYWxsYmFjayhDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICByZXR1cm4gbmV3IENhbGxiYWNrUHJveHk8Q2FsbGJhY2s+KGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBjcmVhdGVWb2x1bWVDYWxsYmFjayhWb2x1bWVDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICByZXR1cm4gbmV3IFZvbHVtZUNhbGxiYWNrUHJveHk8Vm9sdW1lQ2FsbGJhY2s+KGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgYm9vbGVhbiBjaGVja1JvdXRlZFRvQmx1ZXRvb3RoKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgQXVkaW9NYW5hZ2VyIGF1ZGlvTWFuYWdlciA9IChBdWRpb01hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZSgKLSAgICAgICAgICAgICAgICAgICAgQ29udGV4dC5BVURJT19TRVJWSUNFKTsKLSAgICAgICAgICAgIE1ldGhvZCBtZXRob2QgPSBhdWRpb01hbmFnZXIuZ2V0Q2xhc3MoKS5nZXREZWNsYXJlZE1ldGhvZCgKLSAgICAgICAgICAgICAgICAgICAgImdldERldmljZXNGb3JTdHJlYW0iLCBpbnQuY2xhc3MpOwotICAgICAgICAgICAgaW50IGRldmljZSA9IChJbnRlZ2VyKSBtZXRob2QuaW52b2tlKGF1ZGlvTWFuYWdlciwgQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQyk7Ci0gICAgICAgICAgICByZXR1cm4gKGRldmljZSAmIERFVklDRV9PVVRfQkxVRVRPT1RIKSAhPSAwOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSb3V0ZUluZm8gewotICAgICAgICBwdWJsaWMgc3RhdGljIENoYXJTZXF1ZW5jZSBnZXROYW1lKE9iamVjdCByb3V0ZU9iaiwgQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0TmFtZShjb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgQ2hhclNlcXVlbmNlIGdldFN0YXR1cyhPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRTdGF0dXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFN1cHBvcnRlZFR5cGVzKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFN1cHBvcnRlZFR5cGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRDYXRlZ29yeShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRDYXRlZ29yeSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBEcmF3YWJsZSBnZXRJY29uRHJhd2FibGUoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0SWNvbkRyYXdhYmxlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRQbGF5YmFja1R5cGUoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0UGxheWJhY2tUeXBlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRQbGF5YmFja1N0cmVhbShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRQbGF5YmFja1N0cmVhbSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Vm9sdW1lKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFZvbHVtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Vm9sdW1lTWF4KE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFZvbHVtZU1heCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0Vm9sdW1lSGFuZGxpbmcoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0Vm9sdW1lSGFuZGxpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldFRhZyhPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRUYWcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRUYWcoT2JqZWN0IHJvdXRlT2JqLCBPYmplY3QgdGFnKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRUYWcodGFnKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCByZXF1ZXN0U2V0Vm9sdW1lKE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZSkgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikucmVxdWVzdFNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcXVlc3RVcGRhdGVWb2x1bWUoT2JqZWN0IHJvdXRlT2JqLCBpbnQgZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5yZXF1ZXN0VXBkYXRlVm9sdW1lKGRpcmVjdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRHcm91cChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRHcm91cCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzR3JvdXAoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gcm91dGVPYmogaW5zdGFuY2VvZiBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlR3JvdXA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlR3JvdXAgewotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJyYXd0eXBlcyIsICJ1bmNoZWNrZWQiIH0pCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRHcm91cGVkUm91dGVzKE9iamVjdCBncm91cE9iaikgewotICAgICAgICAgICAgZmluYWwgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUdyb3VwIGdyb3VwID0KLSAgICAgICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVHcm91cClncm91cE9iajsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGdyb3VwLmdldFJvdXRlQ291bnQoKTsKLSAgICAgICAgICAgIExpc3Qgb3V0ID0gbmV3IEFycmF5TGlzdChjb3VudCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBvdXQuYWRkKGdyb3VwLmdldFJvdXRlQXQoaSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG91dDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVXNlclJvdXRlSW5mbyB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXROYW1lKE9iamVjdCByb3V0ZU9iaiwgQ2hhclNlcXVlbmNlIG5hbWUpIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXROYW1lKG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFN0YXR1cyhPYmplY3Qgcm91dGVPYmosIENoYXJTZXF1ZW5jZSBzdGF0dXMpIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRTdGF0dXMoc3RhdHVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRJY29uRHJhd2FibGUoT2JqZWN0IHJvdXRlT2JqLCBEcmF3YWJsZSBpY29uKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0SWNvbkRyYXdhYmxlKGljb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFBsYXliYWNrVHlwZShPYmplY3Qgcm91dGVPYmosIGludCB0eXBlKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0UGxheWJhY2tUeXBlKHR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFBsYXliYWNrU3RyZWFtKE9iamVjdCByb3V0ZU9iaiwgaW50IHN0cmVhbSkgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFBsYXliYWNrU3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Vm9sdW1lKE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZSkgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZvbHVtZU1heChPYmplY3Qgcm91dGVPYmosIGludCB2b2x1bWVNYXgpIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRWb2x1bWVNYXgodm9sdW1lTWF4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWb2x1bWVIYW5kbGluZyhPYmplY3Qgcm91dGVPYmosIGludCB2b2x1bWVIYW5kbGluZykgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFZvbHVtZUhhbmRsaW5nKHZvbHVtZUhhbmRsaW5nKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWb2x1bWVDYWxsYmFjayhPYmplY3Qgcm91dGVPYmosIE9iamVjdCB2b2x1bWVDYWxsYmFja09iaikgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFZvbHVtZUNhbGxiYWNrKAotICAgICAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Wb2x1bWVDYWxsYmFjayl2b2x1bWVDYWxsYmFja09iaik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UmVtb3RlQ29udHJvbENsaWVudChPYmplY3Qgcm91dGVPYmosIE9iamVjdCByY2NPYmopIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRSZW1vdGVDb250cm9sQ2xpZW50KAotICAgICAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5SZW1vdGVDb250cm9sQ2xpZW50KXJjY09iaik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlQ2F0ZWdvcnkgewotICAgICAgICBwdWJsaWMgc3RhdGljIENoYXJTZXF1ZW5jZSBnZXROYW1lKE9iamVjdCBjYXRlZ29yeU9iaiwgQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlQ2F0ZWdvcnkpY2F0ZWdvcnlPYmopLmdldE5hbWUoY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJyYXd0eXBlcyIsICJ1bmNoZWNrZWQiIH0pCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRSb3V0ZXMoT2JqZWN0IGNhdGVnb3J5T2JqKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Qgb3V0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlQ2F0ZWdvcnkpY2F0ZWdvcnlPYmopLmdldFJvdXRlcyhvdXQpOwotICAgICAgICAgICAgcmV0dXJuIG91dDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFN1cHBvcnRlZFR5cGVzKE9iamVjdCBjYXRlZ29yeU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUNhdGVnb3J5KWNhdGVnb3J5T2JqKS5nZXRTdXBwb3J0ZWRUeXBlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzR3JvdXBhYmxlKE9iamVjdCBjYXRlZ29yeU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUNhdGVnb3J5KWNhdGVnb3J5T2JqKS5pc0dyb3VwYWJsZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQ2FsbGJhY2sgewotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlU2VsZWN0ZWQoaW50IHR5cGUsIE9iamVjdCByb3V0ZU9iaik7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKGludCB0eXBlLCBPYmplY3Qgcm91dGVPYmopOwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQWRkZWQoT2JqZWN0IHJvdXRlT2JqKTsKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVJlbW92ZWQoT2JqZWN0IHJvdXRlT2JqKTsKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUNoYW5nZWQoT2JqZWN0IHJvdXRlT2JqKTsKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUdyb3VwZWQoT2JqZWN0IHJvdXRlT2JqLCBPYmplY3QgZ3JvdXBPYmosIGludCBpbmRleCk7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbmdyb3VwZWQoT2JqZWN0IHJvdXRlT2JqLCBPYmplY3QgZ3JvdXBPYmopOwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVm9sdW1lQ2hhbmdlZChPYmplY3Qgcm91dGVPYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFZvbHVtZUNhbGxiYWNrIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVTZXRSZXF1ZXN0KE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZSk7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lVXBkYXRlUmVxdWVzdChPYmplY3Qgcm91dGVPYmosIGludCBkaXJlY3Rpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdvcmthcm91bmQgZm9yIGxpbWl0YXRpb25zIG9mIHNlbGVjdFJvdXRlKCkgb24gSkIgYW5kIEpCIE1SMS4KLSAgICAgKiBEbyBub3QgdXNlIG9uIEpCIE1SMiBhbmQgYWJvdmUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTZWxlY3RSb3V0ZVdvcmthcm91bmQgewotICAgICAgICBwcml2YXRlIE1ldGhvZCBtU2VsZWN0Um91dGVJbnRNZXRob2Q7Ci0KLSAgICAgICAgcHVibGljIFNlbGVjdFJvdXRlV29ya2Fyb3VuZCgpIHsKLSAgICAgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPCAxNiB8fCBCdWlsZC5WRVJTSU9OLlNES19JTlQgPiAxNykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0Um91dGVJbnRNZXRob2QgPSBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLmNsYXNzLmdldE1ldGhvZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3RSb3V0ZUludCIsIGludC5jbGFzcywgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8uY2xhc3MpOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3RSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBpbnQgdHlwZXMsIE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIgPSAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmo7Ci0gICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9Ci0gICAgICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iajsKLQotICAgICAgICAgICAgaW50IHJvdXRlVHlwZXMgPSByb3V0ZS5nZXRTdXBwb3J0ZWRUeXBlcygpOwotICAgICAgICAgICAgaWYgKChyb3V0ZVR5cGVzICYgUk9VVEVfVFlQRV9VU0VSKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gSGFuZGxlIG5vbi11c2VyIHJvdXRlcy4KLSAgICAgICAgICAgICAgICAvLyBPbiBKQiBhbmQgSkIgTVIxLCB0aGUgc2VsZWN0Um91dGUoKSBBUEkgb25seSBzdXBwb3J0cyBwcm9ncmFtbWF0aWNhbGx5Ci0gICAgICAgICAgICAgICAgLy8gc2VsZWN0aW5nIHVzZXIgcm91dGVzLiAgU28gaW5zdGVhZCB3ZSByZWx5IG9uIHRoZSBoaWRkZW4gc2VsZWN0Um91dGVJbnQoKQotICAgICAgICAgICAgICAgIC8vIG1ldGhvZCBvbiB0aGVzZSB2ZXJzaW9ucyBvZiB0aGUgcGxhdGZvcm0uCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBsaW1pdGF0aW9uIHdhcyByZW1vdmVkIGluIEpCIE1SMi4KLSAgICAgICAgICAgICAgICBpZiAobVNlbGVjdFJvdXRlSW50TWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RSb3V0ZUludE1ldGhvZC5pbnZva2Uocm91dGVyLCB0eXBlcywgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBzdWNjZXNzIQotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgcHJvZ3JhbW1hdGljYWxseSBzZWxlY3Qgbm9uLXVzZXIgcm91dGUuICAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIk1lZGlhIHJvdXRpbmcgbWF5IG5vdCB3b3JrLiIsIGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IHByb2dyYW1tYXRpY2FsbHkgc2VsZWN0IG5vbi11c2VyIHJvdXRlLiAgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJNZWRpYSByb3V0aW5nIG1heSBub3Qgd29yay4iLCBleCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgcHJvZ3JhbW1hdGljYWxseSBzZWxlY3Qgbm9uLXVzZXIgcm91dGUgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgImJlY2F1c2UgdGhlIHBsYXRmb3JtIGlzIG1pc3NpbmcgdGhlIHNlbGVjdFJvdXRlSW50KCkgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm1ldGhvZC4gIE1lZGlhIHJvdXRpbmcgbWF5IG5vdCB3b3JrLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRGVmYXVsdCBoYW5kbGluZy4KLSAgICAgICAgICAgIHJvdXRlci5zZWxlY3RSb3V0ZSh0eXBlcywgcm91dGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV29ya2Fyb3VuZCB0aGUgZmFjdCB0aGF0IHRoZSBnZXREZWZhdWx0Um91dGUoKSBtZXRob2QgZG9lcyBub3QgZXhpc3QgaW4gSkIgYW5kIEpCIE1SMS4KLSAgICAgKiBEbyBub3QgdXNlIG9uIEpCIE1SMiBhbmQgYWJvdmUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBHZXREZWZhdWx0Um91dGVXb3JrYXJvdW5kIHsKLSAgICAgICAgcHJpdmF0ZSBNZXRob2QgbUdldFN5c3RlbUF1ZGlvUm91dGVNZXRob2Q7Ci0KLSAgICAgICAgcHVibGljIEdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQoKSB7Ci0gICAgICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UIDwgMTYgfHwgQnVpbGQuVkVSU0lPTi5TREtfSU5UID4gMTcpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUdldFN5c3RlbUF1ZGlvUm91dGVNZXRob2QgPQotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5jbGFzcy5nZXRNZXRob2QoImdldFN5c3RlbUF1ZGlvUm91dGUiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE9iamVjdCBnZXREZWZhdWx0Um91dGUoT2JqZWN0IHJvdXRlck9iaikgewotICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIgPSAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmo7Ci0KLSAgICAgICAgICAgIGlmIChtR2V0U3lzdGVtQXVkaW9Sb3V0ZU1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1HZXRTeXN0ZW1BdWRpb1JvdXRlTWV0aG9kLmludm9rZShyb3V0ZXIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBDb3VsZCBub3QgZmluZCB0aGUgbWV0aG9kIG9yIGl0IGRvZXMgbm90IHdvcmsuCi0gICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGZpcnN0IHJvdXRlIGFuZCBob3BlIGZvciB0aGUgYmVzdC4KLSAgICAgICAgICAgIHJldHVybiByb3V0ZXIuZ2V0Um91dGVBdCgwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBDYWxsYmFja1Byb3h5PFQgZXh0ZW5kcyBDYWxsYmFjaz4KLSAgICAgICAgICAgIGV4dGVuZHMgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayB7Ci0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBUIG1DYWxsYmFjazsKLQotICAgICAgICBwdWJsaWMgQ2FsbGJhY2tQcm94eShUIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlU2VsZWN0ZWQoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIsCi0gICAgICAgICAgICAgICAgaW50IHR5cGUsIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZVNlbGVjdGVkKHR5cGUsIHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5zZWxlY3RlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBpbnQgdHlwZSwgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlVW5zZWxlY3RlZCh0eXBlLCByb3V0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUFkZGVkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAotICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZUFkZGVkKHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUm91dGVSZW1vdmVkKHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUm91dGVDaGFuZ2VkKHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlR3JvdXBlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlR3JvdXAgZ3JvdXAsIGludCBpbmRleCkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUm91dGVHcm91cGVkKHJvdXRlLCBncm91cCwgaW5kZXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbmdyb3VwZWQoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIsCi0gICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUsCi0gICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUdyb3VwIGdyb3VwKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZVVuZ3JvdXBlZChyb3V0ZSwgZ3JvdXApOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVWb2x1bWVDaGFuZ2VkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAotICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZVZvbHVtZUNoYW5nZWQocm91dGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIFZvbHVtZUNhbGxiYWNrUHJveHk8VCBleHRlbmRzIFZvbHVtZUNhbGxiYWNrPgotICAgICAgICAgICAgZXh0ZW5kcyBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlZvbHVtZUNhbGxiYWNrIHsKLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIFQgbUNhbGxiYWNrOwotCi0gICAgICAgIHB1YmxpYyBWb2x1bWVDYWxsYmFja1Byb3h5KFQgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lU2V0UmVxdWVzdChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSwKLSAgICAgICAgICAgICAgICBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Wb2x1bWVTZXRSZXF1ZXN0KHJvdXRlLCB2b2x1bWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lVXBkYXRlUmVxdWVzdChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSwKLSAgICAgICAgICAgICAgICBpbnQgZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Wb2x1bWVVcGRhdGVSZXF1ZXN0KHJvdXRlLCBkaXJlY3Rpb24pOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhQ29udHJvbEludGVudC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhQ29udHJvbEludGVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZDllNzc3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYUNvbnRyb2xJbnRlbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLQotLyoqCi0gKiBDb25zdGFudHMgZm9yIG1lZGlhIGNvbnRyb2wgaW50ZW50cy4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBkZWNsYXJlcyBhIHNldCBvZiBzdGFuZGFyZCBtZWRpYSBjb250cm9sIGludGVudCBjYXRlZ29yaWVzIGFuZCBhY3Rpb25zIHRoYXQKLSAqIGFwcGxpY2F0aW9ucyBjYW4gdXNlIHRvIGlkZW50aWZ5IHRoZSBjYXBhYmlsaXRpZXMgb2YgbWVkaWEgcm91dGVzIGFuZCBjb250cm9sIHRoZW0uCi0gKiA8L3A+Ci0gKgotICogPGgzPk1lZGlhIGNvbnRyb2wgaW50ZW50IGNhdGVnb3JpZXM8L2gzPgotICogPHA+Ci0gKiBNZWRpYSBjb250cm9sIGludGVudCBjYXRlZ29yaWVzIHNwZWNpZnkgbWVhbnMgYnkgd2hpY2ggYXBwbGljYXRpb25zIGNhbgotICogc2VuZCBtZWRpYSB0byB0aGUgZGVzdGluYXRpb24gb2YgYSBtZWRpYSByb3V0ZS4gIENhdGVnb3JpZXMgYXJlIHNvbWV0aW1lcyByZWZlcnJlZAotICogdG8gYXMgZGVzY3JpYmluZyAidHlwZXMiIG9yICJraW5kcyIgb2Ygcm91dGVzLgotICogPC9wPjxwPgotICogRm9yIGV4YW1wbGUsIGlmIGEgcm91dGUgc3VwcG9ydHMgdGhlIHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFjayBjYXRlZ29yeX0sCi0gKiB0aGVuIGFuIGFwcGxpY2F0aW9uIGNhbiBhc2sgaXQgdG8gcGxheSBtZWRpYSByZW1vdGVseSBieSBzZW5kaW5nIGEKLSAqIHtAbGluayAjQUNUSU9OX1BMQVkgcGxheX0gb3Ige0BsaW5rICNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfSBpbnRlbnQgd2l0aCB0aGUgVXJpIG9mIHRoZQotICogbWVkaWEgY29udGVudCB0byBwbGF5LiAgU3VjaCBhIHJvdXRlIG1heSB0aGVuIGJlIHJlZmVycmVkIHRvIGFzCi0gKiBhICJyZW1vdGUgcGxheWJhY2sgcm91dGUiIGJlY2F1c2UgaXQgc3VwcG9ydHMgcmVtb3RlIHBsYXliYWNrIHJlcXVlc3RzLiAgSXQgaXMgY29tbW9uCi0gKiBmb3IgYSByb3V0ZSB0byBzdXBwb3J0IG11bHRpcGxlIGNhdGVnb3JpZXMgb2YgcmVxdWVzdHMgYXQgdGhlIHNhbWUgdGltZSwgc3VjaCBhcwotICogbGl2ZSBhdWRpbyBhbmQgbGl2ZSB2aWRlby4KLSAqIDwvcD48cD4KLSAqIFRoZSBmb2xsb3dpbmcgc3RhbmRhcmQgcm91dGUgY2F0ZWdvcmllcyBhcmUgZGVmaW5lZC4KLSAqIDwvcD48dWw+Ci0gKiA8bGk+e0BsaW5rICNDQVRFR09SWV9MSVZFX0FVRElPIExpdmUgYXVkaW99OiBUaGUgcm91dGUgc3VwcG9ydHMgc3RyZWFtaW5nIGxpdmUgYXVkaW8KLSAqIGZyb20gdGhlIGRldmljZSB0byB0aGUgZGVzdGluYXRpb24uICBMaXZlIGF1ZGlvIHJvdXRlcyBpbmNsdWRlIGxvY2FsIHNwZWFrZXJzCi0gKiBhbmQgQmx1ZXRvb3RoIGhlYWRzZXRzLgotICogPGxpPntAbGluayAjQ0FURUdPUllfTElWRV9WSURFTyBMaXZlIHZpZGVvfTogVGhlIHJvdXRlIHN1cHBvcnRzIHN0cmVhbWluZyBsaXZlIHZpZGVvCi0gKiBmcm9tIHRoZSBkZXZpY2UgdG8gdGhlIGRlc3RpbmF0aW9uLiAgTGl2ZSB2aWRlbyByb3V0ZXMgaW5jbHVkZSBsb2NhbCBkaXNwbGF5cwotICogYW5kIHdpcmVsZXNzIGRpc3BsYXlzIHRoYXQgc3VwcG9ydCBtaXJyb3JpbmcgYW5kCi0gKiB7QGxpbmsgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbnN9LiAgTGl2ZSB2aWRlbyByb3V0ZXMgdHlwaWNhbGx5IGFsc28KLSAqIHN1cHBvcnQgbGl2ZSBhdWRpbyBjYXBhYmlsaXRpZXMuCi0gKiA8bGk+e0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgUmVtb3RlIHBsYXliYWNrfTogVGhlIHJvdXRlIHN1cHBvcnRzIHNlbmRpbmcKLSAqIHJlbW90ZSBwbGF5YmFjayByZXF1ZXN0cyBmb3IgbWVkaWEgY29udGVudCB0byB0aGUgZGVzdGluYXRpb24uICBUaGUgY29udGVudCB0byBiZQotICogcGxheWVkIGlzIGlkZW50aWZpZWQgYnkgYSBVcmkgYW5kIG1pbWUtdHlwZS4KLSAqIDwvdWw+PHA+Ci0gKiBNZWRpYSByb3V0ZSBwcm92aWRlcnMgbWF5IGRlZmluZSBjdXN0b20gbWVkaWEgY29udHJvbCBpbnRlbnQgY2F0ZWdvcmllcyBvZiB0aGVpciBvd24gaW4KLSAqIGFkZGl0aW9uIHRvIHRoZSBzdGFuZGFyZCBvbmVzLiAgQ3VzdG9tIGNhdGVnb3JpZXMgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBhIHZhcmlldHkKLSAqIG9mIGZlYXR1cmVzIHRvIGFwcGxpY2F0aW9ucyB0aGF0IHJlY29nbml6ZSBhbmQga25vdyBob3cgdG8gdXNlIHRoZW0uICBGb3IgZXhhbXBsZSwKLSAqIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgbWlnaHQgZGVmaW5lIGEgY3VzdG9tIGNhdGVnb3J5IHRvIGluZGljYXRlIHRoYXQgaXRzIHJvdXRlcwotICogc3VwcG9ydCBhIHNwZWNpYWwgZGV2aWNlLXNwZWNpZmljIGNvbnRyb2wgaW50ZXJmYWNlIGluIGFkZGl0aW9uIHRvIG90aGVyCi0gKiBzdGFuZGFyZCBmZWF0dXJlcy4KLSAqIDwvcD48cD4KLSAqIEFwcGxpY2F0aW9ucyBjYW4gZGV0ZXJtaW5lIHdoaWNoIGNhdGVnb3JpZXMgYSByb3V0ZSBzdXBwb3J0cyBieSB1c2luZyB0aGUKLSAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkgTWVkaWFSb3V0ZXIuUm91dGVJbmZvLnN1cHBvcnRzQ29udHJvbENhdGVnb3J5fQotICogb3Ige0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNnZXRDb250cm9sRmlsdGVycyBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uZ2V0Q29udHJvbEZpbHRlcnN9Ci0gKiBtZXRob2RzLiAgQXBwbGljYXRpb25zIGNhbiBhbHNvIHNwZWNpZnkgdGhlIHR5cGVzIG9mIHJvdXRlcyB0aGF0IHRoZXkgd2FudCB0byB1c2UgYnkKLSAqIGNyZWF0aW5nIHtAbGluayBNZWRpYVJvdXRlU2VsZWN0b3IgbWVkaWEgcm91dGUgc2VsZWN0b3JzfSB0aGF0IGNvbnRhaW4gdGhlIGRlc2lyZWQKLSAqIGNhdGVnb3JpZXMgYW5kIGFyZSB1c2VkIHRvIGZpbHRlciByb3V0ZXMgaW4gc2V2ZXJhbCBwYXJ0cyBvZiB0aGUgbWVkaWEgcm91dGVyIEFQSS4KLSAqIDwvcD4KLSAqCi0gKiA8aDM+TWVkaWEgY29udHJvbCBpbnRlbnQgYWN0aW9uczwvaDM+Ci0gKiA8cD4KLSAqIE1lZGlhIGNvbnRyb2wgaW50ZW50IGFjdGlvbnMgc3BlY2lmeSBwYXJ0aWN1bGFyIGZ1bmN0aW9ucyB0aGF0IGFwcGxpY2F0aW9ucwotICogY2FuIGFzayB0aGUgZGVzdGluYXRpb24gb2YgYSBtZWRpYSByb3V0ZSB0byBwZXJmb3JtLiAgTWVkaWEgcm91dGUgY29udHJvbCByZXF1ZXN0cwotICogdGFrZSB0aGUgZm9ybSBvZiBpbnRlbnRzIGluIGEgc2ltaWxhciBtYW5uZXIgdG8gb3RoZXIgaW50ZW50cyB1c2VkIHRvIHN0YXJ0IGFjdGl2aXRpZXMKLSAqIG9yIHNlbmQgYnJvYWRjYXN0cy4gIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgbWVkaWEgY29udHJvbCBpbnRlbnRzIGFyZSBkaXJlY3RlZCB0bwotICogcm91dGVzIHJhdGhlciB0aGFuIGFjdGl2aXR5IG9yIGJyb2FkY2FzdCByZWNlaXZlciBjb21wb25lbnRzLgotICogPC9wPjxwPgotICogRWFjaCBtZWRpYSByb3V0ZSBjb250cm9sIGludGVudCBzcGVjaWZpZXMgYW4gYWN0aW9uLCBhIGNhdGVnb3J5IGFuZCBzb21lIG51bWJlciBvZiBwYXJhbWV0ZXJzCi0gKiB0aGF0IGFyZSBzdXBwbGllZCBhcyBleHRyYXMuICBBcHBsaWNhdGlvbnMgc2VuZCBtZWRpYSBjb250cm9sIHJlcXVlc3RzIHRvIHJvdXRlcyB1c2luZyB0aGUKLSAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0IE1lZGlhUm91dGVyLlJvdXRlSW5mby5zZW5kQ29udHJvbFJlcXVlc3R9Ci0gKiBtZXRob2QgYW5kIHJlY2VpdmUgcmVzdWx0cyB2aWEgYSBjYWxsYmFjay4KLSAqIDwvcD48cD4KLSAqIEFsbCBtZWRpYSBjb250cm9sIGludGVudCBhY3Rpb25zIGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIG1lZGlhIGNvbnRyb2wgaW50ZW50IGNhdGVnb3JpZXMKLSAqIHRoYXQgc3VwcG9ydCB0aGVtLiAgVGh1cyBvbmx5IHJlbW90ZSBwbGF5YmFjayByb3V0ZXMgbWF5IHBlcmZvcm0gcmVtb3RlIHBsYXliYWNrIGFjdGlvbnMuCi0gKiBUaGUgZG9jdW1lbnRhdGlvbiBvZiBlYWNoIGFjdGlvbiBzcGVjaWZpZXMgdGhlIGNhdGVnb3J5IHRvIHdoaWNoIHRoZSBhY3Rpb24gYmVsb25ncywKLSAqIHRoZSBwYXJhbWV0ZXJzIGl0IHJlcXVpcmVzLCBhbmQgdGhlIHJlc3VsdHMgaXQgcmV0dXJucy4KLSAqIDwvcD4KLSAqCi0gKiA8aDM+TGl2ZSBhdWRpbyBhbmQgbGl2ZSB2aWRlbyByb3V0ZXM8L2gzPgotICogPHA+Ci0gKiB7QGxpbmsgI0NBVEVHT1JZX0xJVkVfQVVESU8gTGl2ZSBhdWRpb30gYW5kIHtAbGluayAjQ0FURUdPUllfTElWRV9WSURFTyBsaXZlIHZpZGVvfQotICogcm91dGVzIHByZXNlbnQgbWVkaWEgdXNpbmcgc3RhbmRhcmQgc3lzdGVtIGludGVyZmFjZXMgc3VjaCBhcyBhdWRpbyBzdHJlYW1zLAotICoge0BsaW5rIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbiBwcmVzZW50YXRpb25zfSBvciBkaXNwbGF5IG1pcnJvcmluZy4gIFRoZXNlIHJvdXRlcyBhcmUKLSAqIHRoZSBlYXNpZXN0IHRvIHVzZSBiZWNhdXNlIGFwcGxpY2F0aW9ucyBzaW1wbHkgcmVuZGVyIGNvbnRlbnQgbG9jYWxseSBvbiB0aGUgZGV2aWNlCi0gKiBhbmQgdGhlIHN5c3RlbSBzdHJlYW1zIGl0IHRvIHRoZSByb3V0ZSBkZXN0aW5hdGlvbiBhdXRvbWF0aWNhbGx5LgotICogPC9wPjxwPgotICogSW4gbW9zdCBjYXNlcywgYXBwbGljYXRpb25zIGNhbiBzdHJlYW0gY29udGVudCB0byBsaXZlIGF1ZGlvIGFuZCBsaXZlIHZpZGVvIHJvdXRlcyBpbgotICogdGhlIHNhbWUgd2F5IHRoZXkgd291bGQgcGxheSB0aGUgY29udGVudCBsb2NhbGx5IHdpdGhvdXQgYW55IG1vZGlmaWNhdGlvbi4gIEhvd2V2ZXIsCi0gKiBhcHBsaWNhdGlvbnMgbWF5IGFsc28gYmUgYWJsZSB0byB0YWtlIGFkdmFudGFnZSBvZiBtb3JlIHNvcGhpc3RpY2F0ZWQgZmVhdHVyZXMgc3VjaAotICogYXMgc2Vjb25kLXNjcmVlbiBwcmVzZW50YXRpb24gQVBJcyB0aGF0IGFyZSBwYXJ0aWN1bGFyIHRvIHRoZXNlIHJvdXRlcy4KLSAqIDwvcD4KLSAqCi0gKiA8aDM+UmVtb3RlIHBsYXliYWNrIHJvdXRlczwvaDM+Ci0gKiA8cD4KLSAqIHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIFJlbW90ZSBwbGF5YmFja30gcm91dGVzIHByZXNlbnQgbWVkaWEgcmVtb3RlbHkKLSAqIGJ5IHBsYXlpbmcgY29udGVudCBmcm9tIGEgVXJpLgotICogVGhlc2Ugcm91dGVzIGRlc3RpbmF0aW9ucyB0YWtlIHJlc3BvbnNpYmlsaXR5IGZvciBmZXRjaGluZyBhbmQgcmVuZGVyaW5nIGNvbnRlbnQKLSAqIG9uIHRoZWlyIG93bi4gIEFwcGxpY2F0aW9ucyBkbyBub3QgcmVuZGVyIHRoZSBjb250ZW50IHRoZW1zZWx2ZXM7IGluc3RlYWQsIGFwcGxpY2F0aW9ucwotICogc2VuZCBjb250cm9sIHJlcXVlc3RzIHRvIGluaXRpYXRlIHBsYXksIHBhdXNlLCByZXN1bWUsIG9yIHN0b3AgbWVkaWEgaXRlbXMgYW5kIHJlY2VpdmUKLSAqIHN0YXR1cyB1cGRhdGVzIGFzIHRoZXkgY2hhbmdlIHN0YXRlLgotICogPC9wPgotICoKLSAqIDxoND5TZXNzaW9uczwvaDQ+Ci0gKiA8cD4KLSAqIEVhY2ggcmVtb3RlIG1lZGlhIHBsYXliYWNrIGFjdGlvbiBpcyBjb25kdWN0ZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhIHNlc3Npb24uCi0gKiBTZXNzaW9ucyBhcmUgdXNlZCB0byBwcmV2ZW50IGFwcGxpY2F0aW9ucyBmcm9tIGFjY2lkZW50YWxseSBpbnRlcmZlcmluZyB3aXRoIG9uZQotICogYW5vdGhlciBiZWNhdXNlIGF0IG1vc3Qgb25lIHNlc3Npb24gY2FuIGJlIHZhbGlkIGF0IGEgdGltZS4KLSAqIDwvcD48cD4KLSAqIEEgc2Vzc2lvbiBjYW4gYmUgY3JlYXRlZCB1c2luZyB0aGUge0BsaW5rICNBQ1RJT05fU1RBUlRfU0VTU0lPTiBzdGFydCBzZXNzaW9uIGFjdGlvbn0KLSAqIGFuZCB0ZXJtaW5hdGVkIHVzaW5nIHRoZSB7QGxpbmsgI0FDVElPTl9FTkRfU0VTU0lPTiBlbmQgc2Vzc2lvbiBhY3Rpb259IHdoZW4gdGhlCi0gKiByb3V0ZSBwcm92aWRlcyBleHBsaWNpdCBzZXNzaW9uIG1hbmFnZW1lbnQgZmVhdHVyZXMuCi0gKiA8L3A+PHA+Ci0gKiBFeHBsaWNpdCBzZXNzaW9uIG1hbmFnZW1lbnQgd2FzIGFkZGVkIGluIGEgbGF0ZXIgcmV2aXNpb24gb2YgdGhlIHByb3RvY29sIHNvIG5vdAotICogYWxsIHJvdXRlcyBzdXBwb3J0IGl0LiAgSWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgZXhwbGljaXQgc2Vzc2lvbiBtYW5hZ2VtZW50Ci0gKiB0aGVuIGltcGxpY2l0IHNlc3Npb24gbWFuYWdlbWVudCBtYXkgc3RpbGwgYmUgdXNlZC4gIEltcGxpY2l0IHNlc3Npb24gbWFuYWdlbWVudAotICogcmVsaWVzIG9uIHRoZSB1c2Ugb2YgdGhlIHtAbGluayAjQUNUSU9OX1BMQVkgcGxheX0gYW5kIHtAbGluayAjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0KLSAqIGFjdGlvbnMgd2hpY2ggaGF2ZSB0aGUgc2lkZS1lZmZlY3Qgb2YgY3JlYXRpbmcgYSBuZXcgc2Vzc2lvbiBpZiBub25lIGlzIHByb3ZpZGVkCi0gKiBhcyBhcmd1bWVudC4KLSAqIDwvcD48cD4KLSAqIFdoZW4gYSBuZXcgc2Vzc2lvbiBpcyBjcmVhdGVkLCB0aGUgcHJldmlvdXMgc2Vzc2lvbiBpcyBpbnZhbGlkYXRlZCBhbmQgYW55IG9uZ29pbmcKLSAqIG1lZGlhIHBsYXliYWNrIGlzIHN0b3BwZWQgYmVmb3JlIHRoZSByZXF1ZXN0ZWQgYWN0aW9uIGlzIHBlcmZvcm1lZC4gIEFueSBhdHRlbXB0Ci0gKiB0byB1c2UgYW4gaW52YWxpZGF0ZWQgc2Vzc2lvbiB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gIChQcm90b2NvbCBpbXBsZW1lbnRhdGlvbnMKLSAqIGFyZSBlbmNvdXJhZ2VkIHRvIGFnZ3Jlc3NpdmVseSBkaXNjYXJkIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCBpbnZhbGlkYXRlZCBzZXNzaW9ucwotICogc2luY2UgaXQgaXMgbm8gbG9uZ2VyIG9mIHVzZS4pCi0gKiA8L3A+PHA+Ci0gKiBFYWNoIHNlc3Npb24gaXMgaWRlbnRpZmllZCBieSBhIHVuaXF1ZSBzZXNzaW9uIGlkIHRoYXQgbWF5IGJlIHVzZWQgdG8gY29udHJvbAotICogdGhlIHNlc3Npb24gdXNpbmcgYWN0aW9ucyBzdWNoIGFzIHBhdXNlLCByZXN1bWUsIHN0b3AgYW5kIGVuZCBzZXNzaW9uLgotICogPC9wPgotICoKLSAqIDxoND5NZWRpYSBpdGVtczwvaDQ+Ci0gKiA8cD4KLSAqIEVhY2ggc3VjY2Vzc2Z1bCB7QGxpbmsgI0FDVElPTl9QTEFZIHBsYXl9IG9yIHtAbGluayAjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0gYWN0aW9uCi0gKiByZXR1cm5zIGEgdW5pcXVlIG1lZGlhIGl0ZW0gaWQgdGhhdCBhbiBhcHBsaWNhdGlvbiBjYW4gdXNlIHRvIG1vbml0b3IgYW5kIGNvbnRyb2wKLSAqIHBsYXliYWNrLiAgVGhlIG1lZGlhIGl0ZW0gaWQgbWF5IGJlIHBhc3NlZCB0byBvdGhlciBhY3Rpb25zIHN1Y2ggYXMKLSAqIHtAbGluayAjQUNUSU9OX1NFRUsgc2Vla30gb3Ige0BsaW5rICNBQ1RJT05fR0VUX1NUQVRVUyBnZXQgc3RhdHVzfS4gIEl0IHdpbGwgYWxzbyBhcHBlYXIKLSAqIGFzIGEgcGFyYW1ldGVyIGluIHN0YXR1cyB1cGRhdGUgYnJvYWRjYXN0cyB0byBpZGVudGlmeSB0aGUgYXNzb2NpYXRlZCBwbGF5YmFjayByZXF1ZXN0LgotICogPC9wPjxwPgotICogRWFjaCBtZWRpYSBpdGVtIGlzIHNjb3BlZCB0byB0aGUgc2Vzc2lvbiBpbiB3aGljaCBpdCB3YXMgY3JlYXRlZC4gIFRoZXJlZm9yZSBtZWRpYSBpdGVtCi0gKiBpZHMgYXJlIG9ubHkgZXZlciB1c2VkIHRvZ2V0aGVyIHdpdGggc2Vzc2lvbiBpZHMuICBNZWRpYSBpdGVtIGlkcyBhcmUgbWVhbmluZ2xlc3MKLSAqIG9uIHRoZWlyIG93bi4gIFdoZW4gdGhlIHNlc3Npb24gaXMgaW52YWxpZGF0ZWQsIGFsbCBvZiBpdHMgbWVkaWEgaXRlbXMgYXJlIGFsc28KLSAqIGludmFsaWRhdGVkLgotICogPC9wPgotICoKLSAqIDxoND5UaGUgcGxheWJhY2sgcXVldWU8L2g0PgotICogPHA+Ci0gKiBFYWNoIHNlc3Npb24gaGFzIGl0cyBvd24gcGxheWJhY2sgcXVldWUgdGhhdCBjb25zaXN0cyBvZiB0aGUgbWVkaWEgaXRlbXMgdGhhdAotICogYXJlIHBlbmRpbmcsIHBsYXlpbmcsIGJ1ZmZlcmluZyBvciBwYXVzZWQuICBJdGVtcyBhcmUgYWRkZWQgdG8gdGhlIHF1ZXVlIHdoZW4KLSAqIGEgcGxheWJhY2sgcmVxdWVzdCBpcyBpc3N1ZWQuICBJdGVtcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZSB3aGVuIHRoZXkgYXJlIG5vCi0gKiBsb25nZXIgZWxpZ2libGUgZm9yIHBsYXliYWNrIChlbnRlciB0ZXJtaW5hbCBzdGF0ZXMpLgotICogPC9wPjxwPgotICogQXMgZGVzY3JpYmVkIGluIHRoZSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzfSBjbGFzcywgbWVkaWEgaXRlbXMgaW5pdGlhbGx5Ci0gKiBzdGFydCBpbiBhIHBlbmRpbmcgc3RhdGUsIHRyYW5zaXRpb24gdG8gdGhlIHBsYXlpbmcgKG9yIGJ1ZmZlcmluZyBvciBwYXVzZWQpIHN0YXRlCi0gKiBkdXJpbmcgcGxheWJhY2ssIGFuZCBlbmQgaW4gYSBmaW5pc2hlZCwgY2FuY2VsZWQsIGludmFsaWRhdGVkIG9yIGVycm9yIHN0YXRlLgotICogT25jZSB0aGUgY3VycmVudCBpdGVtIGVudGVycyBhIHRlcm1pbmFsIHN0YXRlLCBwbGF5YmFjayBwcm9jZWVkcyBvbiB0byB0aGUKLSAqIG5leHQgaXRlbS4KLSAqIDwvcD48cD4KLSAqIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHJvdXRlIHN1cHBvcnRzIHF1ZXVpbmcgYnkgY2hlY2tpbmcKLSAqIHdoZXRoZXIgdGhlIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IGFjdGlvbiBpcyBkZWNsYXJlZCBpbiB0aGUgcm91dGUncyBjb250cm9sIGZpbHRlcgotICogdXNpbmcge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzdXBwb3J0c0NvbnRyb2xSZXF1ZXN0IFJvdXRlSW5mby5zdXBwb3J0c0NvbnRyb2xSZXF1ZXN0fS4KLSAqIDwvcD48cD4KLSAqIElmIHRoZSB7QGxpbmsgI0FDVElPTl9FTlFVRVVFfSBhY3Rpb24gaXMgc3VwcG9ydGVkIGJ5IHRoZSByb3V0ZSwgdGhlbiB0aGUgcm91dGUgcHJvbWlzZXMKLSAqIHRvIGFsbG93IGF0IGxlYXN0IHR3byBpdGVtcyAocG9zc2libHkgbW9yZSkgdG8gYmUgZW5xdWV1ZWQgYXQgYSB0aW1lLiAgRW5xdWV1ZWQgaXRlbXMgcGxheQotICogYmFjayB0byBiYWNrIG9uZSBhZnRlciB0aGUgb3RoZXIgYXMgdGhlIHByZXZpb3VzIGl0ZW0gY29tcGxldGVzLiAgSWRlYWxseSB0aGVyZSBzaG91bGQKLSAqIGJlIG5vIGF1ZGlibGUgcGF1c2UgYmV0d2VlbiBpdGVtcyBmb3Igc3RhbmRhcmQgYXVkaW8gY29udGVudCB0eXBlcy4KLSAqIDwvcD48cD4KLSAqIElmIHRoZSB7QGxpbmsgI0FDVElPTl9FTlFVRVVFfSBhY3Rpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgcm91dGUsIHRoZW4gdGhlIHF1ZXVlCi0gKiBlZmZlY3RpdmVseSBjb250YWlucyBhdCBtb3N0IG9uZSBpdGVtIGF0IGEgdGltZS4gIEVhY2ggcGxheSBhY3Rpb24gaGFzIHRoZSBlZmZlY3Qgb2YKLSAqIGNsZWFyaW5nIHRoZSBxdWV1ZSBhbmQgcmVzZXR0aW5nIGl0cyBzdGF0ZSBiZWZvcmUgdGhlIG5leHQgaXRlbSBpcyBwbGF5ZWQuCi0gKiA8L3A+Ci0gKgotICogPGg0PkltcGFjdCBvZiBwYXVzZSwgcmVzdW1lLCBzdG9wIGFuZCBwbGF5IGFjdGlvbnMgb24gdGhlIHBsYXliYWNrIHF1ZXVlPC9oND4KLSAqIDxwPgotICogVGhlIHBhdXNlLCByZXN1bWUgYW5kIHN0b3AgYWN0aW9ucyBhZmZlY3QgdGhlIHNlc3Npb24ncyB3aG9sZSBxdWV1ZS4gIFBhdXNlIGNhdXNlcwotICogdGhlIHBsYXliYWNrIHF1ZXVlIHRvIGJlIHN1c3BlbmRlZCBubyBtYXR0ZXIgd2hpY2ggaXRlbSBpcyBjdXJyZW50bHkgcGxheWluZy4KLSAqIFJlc3VtZSByZXZlcnNlcyB0aGUgZWZmZWN0cyBvZiBwYXVzZS4gIFN0b3AgY2xlYXJzIHRoZSBxdWV1ZSBhbmQgYWxzbyByZXNldHMKLSAqIHRoZSBwYXVzZSBmbGFnIGp1c3QgbGlrZSByZXN1bWUuCi0gKiA8L3A+PHA+Ci0gKiBBcyBkZXNjcmliZWQgZWFybGllciwgdGhlIHBsYXkgYWN0aW9uIGhhcyB0aGUgZWZmZWN0IG9mIGNsZWFyaW5nIHRoZSBxdWV1ZQotICogYW5kIGNvbXBsZXRlbHkgcmVzZXR0aW5nIGl0cyBzdGF0ZSAobGlrZSB0aGUgc3RvcCBhY3Rpb24pIHRoZW4gZW5xdWV1aW5nIGEKLSAqIG5ldyBtZWRpYSBpdGVtIHRvIGJlIHBsYXllZCBpbW1lZGlhdGVseS4gIFBsYXkgaXMgdGhlcmVmb3JlIGVxdWl2YWxlbnQKLSAqIHRvIHN0b3AgZm9sbG93ZWQgYnkgYW4gYWN0aW9uIHRvIGVucXVldWUgYW4gaXRlbS4KLSAqIDwvcD48cD4KLSAqIFRoZSBwbGF5IGFjdGlvbiBpcyBhbHNvIHNwZWNpYWwgaW4gdGhhdCBpdCBjYW4gYmUgdXNlZCB0byBjcmVhdGUgbmV3IHNlc3Npb25zLgotICogQW4gYXBwbGljYXRpb24gd2l0aCBzaW1wbGUgbmVlZHMgbWF5IGZpbmQgdGhhdCBpdCBvbmx5IG5lZWRzIHRvIHVzZSBwbGF5Ci0gKiAoYW5kIG9jY2FzaW9uYWxseSBzdG9wKSB0byBjb250cm9sIHBsYXliYWNrLgotICogPC9wPgotICoKLSAqIDxoND5SZXNvbHZpbmcgY29uZmxpY3RzIGJldHdlZW4gYXBwbGljYXRpb25zPC9oND4KLSAqIDxwPgotICogV2hlbiBhbiBhcHBsaWNhdGlvbiBoYXMgYSB2YWxpZCBzZXNzaW9uLCBpdCBpcyBlc3NlbnRpYWxseSBpbiBjb250cm9sIG9mIHJlbW90ZSBwbGF5YmFjawotICogb24gdGhlIHJvdXRlLiAgTm8gb3RoZXIgYXBwbGljYXRpb24gY2FuIHZpZXcgb3IgbW9kaWZ5IHRoZSByZW1vdGUgcGxheWJhY2sgc3RhdGUKLSAqIG9mIHRoYXQgYXBwbGljYXRpb24ncyBzZXNzaW9uIHdpdGhvdXQga25vd2luZyBpdHMgaWQuCi0gKiA8L3A+PHA+Ci0gKiBIb3dldmVyLCBvdGhlciBhcHBsaWNhdGlvbnMgY2FuIHBlcmZvcm0gYWN0aW9ucyB0aGF0IGhhdmUgdGhlIGVmZmVjdCBvZiBzdG9wcGluZwotICogcGxheWJhY2sgYW5kIGludmFsaWRhdGluZyB0aGUgY3VycmVudCBzZXNzaW9uLiAgV2hlbiB0aGlzIG9jY3VycywgdGhlIGZvcm1lciBhcHBsaWNhdGlvbgotICogd2lsbCBiZSBpbmZvcm1lZCB0aGF0IGl0IGhhcyBsb3N0IGNvbnRyb2wgYnkgd2F5IG9mIGluZGl2aWR1YWwgbWVkaWEgaXRlbSBzdGF0dXMKLSAqIHVwZGF0ZSBicm9hZGNhc3RzIHRoYXQgaW5kaWNhdGUgdGhhdCBpdHMgcXVldWVkIG1lZGlhIGl0ZW1zIGhhdmUgYmVjb21lCi0gKiB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzI1BMQVlCQUNLX1NUQVRFX0lOVkFMSURBVEVEIGludmFsaWRhdGVkfS4gIFRoaXMgYnJvYWRjYXN0Ci0gKiBpbXBsaWVzIHRoYXQgcGxheWJhY2sgd2FzIHRlcm1pbmF0ZWQgYWJub3JtYWxseSBieSBhbiBleHRlcm5hbCBjYXVzZS4KLSAqIDwvcD48cD4KLSAqIEFwcGxpY2F0aW9ucyBzaG91bGQgaGFuZGxlIGNvbmZsaWN0cyBjb25zZXJ2YXRpdmVseSB0byBhbGxvdyBvdGhlciBhcHBsaWNhdGlvbnMgdG8KLSAqIHNtb290aGx5IGFzc3VtZSBjb250cm9sIG92ZXIgdGhlIHJvdXRlLiAgV2hlbiBhIGNvbmZsaWN0IG9jY3VycywgdGhlIGN1cnJlbnRseSBwbGF5aW5nCi0gKiBhcHBsaWNhdGlvbiBzaG91bGQgcmVsZWFzZSBpdHMgc2Vzc2lvbiBhbmQgYWxsb3cgdGhlIG5ldyBhcHBsaWNhdGlvbiB0byB1c2UgdGhlCi0gKiByb3V0ZSB1bnRpbCBzdWNoIHRpbWUgYXMgdGhlIHVzZXIgaW50ZXJ2ZW5lcyB0byB0YWtlIG92ZXIgdGhlIHJvdXRlIGFnYWluIGFuZCBiZWdpbgotICogYSBuZXcgcGxheWJhY2sgc2Vzc2lvbi4KLSAqIDwvcD4KLSAqCi0gKiA8aDQ+QmFzaWMgYWN0aW9uczwvaDQ+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgYmFzaWMgYWN0aW9ucyBtdXN0IGJlIHN1cHBvcnRlZCAoYWxsIG9yIG5vdGhpbmcpIGJ5IGFsbCByZW1vdGUKLSAqIHBsYXliYWNrIHJvdXRlcy4gIFRoZXNlIGFjdGlvbnMgZm9ybSB0aGUgYmFzaXMgb2YgdGhlIHJlbW90ZSBwbGF5YmFjayBwcm90b2NvbAotICogYW5kIGFyZSByZXF1aXJlZCBpbiBhbGwgaW1wbGVtZW50YXRpb25zLgotICogPC9wPjx1bD4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9QTEFZIFBsYXl9OiBTdGFydHMgcGxheWluZyBjb250ZW50IHNwZWNpZmllZCBieSBhIGdpdmVuIFVyaQotICogYW5kIHJldHVybnMgYSBuZXcgbWVkaWEgaXRlbSBpZCB0byBkZXNjcmliZSB0aGUgcmVxdWVzdC4gIEltcGxpY2l0bHkgY3JlYXRlcyBhIG5ldwotICogc2Vzc2lvbiBpZiBubyBzZXNzaW9uIGlkIHdhcyBzcGVjaWZpZWQgYXMgYSBwYXJhbWV0ZXIuCi0gKiA8bGk+e0BsaW5rICNBQ1RJT05fU0VFSyBTZWVrfTogU2V0cyB0aGUgY29udGVudCBwbGF5YmFjayBwb3NpdGlvbiBvZiBhIHNwZWNpZmljIG1lZGlhIGl0ZW0uCi0gKiA8bGk+e0BsaW5rICNBQ1RJT05fR0VUX1NUQVRVUyBHZXQgc3RhdHVzfTogR2V0cyB0aGUgc3RhdHVzIG9mIGEgbWVkaWEgaXRlbQotICogaW5jbHVkaW5nIHRoZSBpdGVtJ3MgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbiBhbmQgcHJvZ3Jlc3MuCi0gKiA8bGk+e0BsaW5rICNBQ1RJT05fUEFVU0UgUGF1c2V9OiBQYXVzZXMgcGxheWJhY2sgb2YgdGhlIHF1ZXVlLgotICogPGxpPntAbGluayAjQUNUSU9OX1JFU1VNRSBSZXN1bWV9OiBSZXN1bWVzIHBsYXliYWNrIG9mIHRoZSBxdWV1ZS4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9TVE9QIFN0b3B9OiBTdG9wcyBwbGF5YmFjaywgY2xlYXJzIHRoZSBxdWV1ZSwgYW5kIHJlc2V0cyB0aGUKLSAqIHBhdXNlIHN0YXRlLgotICogPC91bD4KLSAqCi0gKiA8aDQ+UXVldWUgYWN0aW9uczwvaDQ+Ci0gKiA8cD4KLSAqIFRoZSBmb2xsb3dpbmcgcXVldWUgYWN0aW9ucyBtdXN0IGJlIHN1cHBvcnRlZCAoYWxsIG9yIG5vdGhpbmcpIGJ5IHJlbW90ZQotICogcGxheWJhY2sgcm91dGVzIHRoYXQgb2ZmZXIgb3B0aW9uYWwgcXVldWluZyBjYXBhYmlsaXRpZXMuCi0gKiA8L3A+PHVsPgotICogPGxpPntAbGluayAjQUNUSU9OX0VOUVVFVUUgRW5xdWV1ZX06IEVucXVldWVzIGNvbnRlbnQgc3BlY2lmaWVkIGJ5IGEgZ2l2ZW4gVXJpCi0gKiBhbmQgcmV0dXJucyBhIG5ldyBtZWRpYSBpdGVtIGlkIHRvIGRlc2NyaWJlIHRoZSByZXF1ZXN0LiAgSW1wbGljaXRseSBjcmVhdGVzIGEgbmV3Ci0gKiBzZXNzaW9uIGlmIG5vIHNlc3Npb24gaWQgd2FzIHNwZWNpZmllZCBhcyBhIHBhcmFtZXRlci4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9SRU1PVkUgUmVtb3ZlfTogUmVtb3ZlcyBhIHNwZWNpZmllZCBtZWRpYSBpdGVtIGZyb20gdGhlIHF1ZXVlLgotICogPC91bD4KLSAqCi0gKiA8aDQ+U2Vzc2lvbiBhY3Rpb25zPC9oND4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBzZXNzaW9uIGFjdGlvbnMgbXVzdCBiZSBzdXBwb3J0ZWQgKGFsbCBvciBub3RoaW5nKSBieSByZW1vdGUKLSAqIHBsYXliYWNrIHJvdXRlcyB0aGF0IG9mZmVyIG9wdGlvbmFsIHNlc3Npb24gbWFuYWdlbWVudCBjYXBhYmlsaXRpZXMuCi0gKiA8L3A+PHVsPgotICogPGxpPntAbGluayAjQUNUSU9OX1NUQVJUX1NFU1NJT04gU3RhcnQgc2Vzc2lvbn06IFN0YXJ0cyBhIG5ldyBzZXNzaW9uIGV4cGxpY2l0bHkuCi0gKiA8bGk+e0BsaW5rICNBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTIEdldCBzZXNzaW9uIHN0YXR1c306IEdldHMgdGhlIHN0YXR1cyBvZiBhIHNlc3Npb24uCi0gKiA8bGk+e0BsaW5rICNBQ1RJT05fRU5EX1NFU1NJT04gRW5kIHNlc3Npb259OiBFbmRzIGEgc2Vzc2lvbiBleHBsaWNpdGx5LgotICogPC91bD4KLSAqCi0gKiA8aDQ+SW1wbGVtZW50YXRpb24gbm90ZTwvaDQ+Ci0gKiA8cD4KLSAqIEltcGxlbWVudGF0aW9ucyBvZiB0aGUgcmVtb3RlIHBsYXliYWNrIHByb3RvY29sIG11c3QgaW1wbGVtZW50IDxlbT5hbGw8L2VtPiBvZiB0aGUKLSAqIGRvY3VtZW50ZWQgYWN0aW9ucywgcGFyYW1ldGVycyBhbmQgcmVzdWx0cy4gIE5vdGUgdGhhdCB0aGUgZG9jdW1lbnRhdGlvbiBpcyB3cml0dGVuIGZyb20KLSAqIHRoZSBwZXJzcGVjdGl2ZSBvZiBhIGNsaWVudCBvZiB0aGUgcHJvdG9jb2wuICBJbiBwYXJ0aWN1bGFyLCB3aGVuZXZlciBhIHBhcmFtZXRlcgotICogaXMgZGVzY3JpYmVkIGFzIGJlaW5nICJvcHRpb25hbCIsIGl0IGlzIG9ubHkgZnJvbSB0aGUgcGVyc3BlY3RpdmUgb2YgdGhlIGNsaWVudC4KLSAqIENvbXBsaWFudCBtZWRpYSByb3V0ZSBwcm92aWRlciBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBwcm90b2NvbCBtdXN0IHN1cHBvcnQgYWxsCi0gKiBvZiB0aGUgZmVhdHVyZXMgZGVzY3JpYmVkIGhlcmVpbi4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhQ29udHJvbEludGVudCB7Ci0gICAgLyogUm91dGUgY2F0ZWdvcmllcy4gKi8KLQotICAgIC8qKgotICAgICAqIE1lZGlhIGNvbnRyb2wgY2F0ZWdvcnk6IExpdmUgYXVkaW8uCi0gICAgICogPHA+Ci0gICAgICogQSByb3V0ZSB0aGF0IHN1cHBvcnRzIGxpdmUgYXVkaW8gcm91dGluZyB3aWxsIGFsbG93IHRoZSBtZWRpYSBhdWRpbyBzdHJlYW0KLSAgICAgKiB0byBiZSBzZW50IHRvIHN1cHBvcnRlZCBkZXN0aW5hdGlvbnMuICBUaGlzIGNhbiBpbmNsdWRlIGludGVybmFsIHNwZWFrZXJzIG9yCi0gICAgICogYXVkaW8gamFja3Mgb24gdGhlIGRldmljZSBpdHNlbGYsIEEyRFAgZGV2aWNlcywgYW5kIG1vcmUuCi0gICAgICogPC9wPjxwPgotICAgICAqIFdoZW4gYSBsaXZlIGF1ZGlvIHJvdXRlIGlzIHNlbGVjdGVkLCBhdWRpbyByb3V0aW5nIGlzIHRyYW5zcGFyZW50IHRvIHRoZSBhcHBsaWNhdGlvbi4KLSAgICAgKiBBbGwgYXVkaW8gcGxheWVkIG9uIHRoZSBtZWRpYSBzdHJlYW0gd2lsbCBiZSByb3V0ZWQgdG8gdGhlIHNlbGVjdGVkIGRlc3RpbmF0aW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBSZWZlciB0byB0aGUgY2xhc3MgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBhYm91dCBsaXZlIGF1ZGlvIHJvdXRlcy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0FURUdPUllfTElWRV9BVURJTyA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5jYXRlZ29yeS5MSVZFX0FVRElPIjsKLQotICAgIC8qKgotICAgICAqIE1lZGlhIGNvbnRyb2wgY2F0ZWdvcnk6IExpdmUgdmlkZW8uCi0gICAgICogPHA+Ci0gICAgICogQSByb3V0ZSB0aGF0IHN1cHBvcnRzIGxpdmUgdmlkZW8gcm91dGluZyB3aWxsIGFsbG93IGEgbWlycm9yZWQgdmVyc2lvbgotICAgICAqIG9mIHRoZSBkZXZpY2UncyBwcmltYXJ5IGRpc3BsYXkgb3IgYSBjdXN0b21pemVkCi0gICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbiBQcmVzZW50YXRpb259IHRvIGJlIHNlbnQgdG8gc3VwcG9ydGVkCi0gICAgICogZGVzdGluYXRpb25zLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBXaGVuIGEgbGl2ZSB2aWRlbyByb3V0ZSBpcyBzZWxlY3RlZCwgYXVkaW8gYW5kIHZpZGVvIHJvdXRpbmcgaXMgdHJhbnNwYXJlbnQKLSAgICAgKiB0byB0aGUgYXBwbGljYXRpb24uICBCeSBkZWZhdWx0LCBhdWRpbyBhbmQgdmlkZW8gaXMgcm91dGVkIHRvIHRoZSBzZWxlY3RlZAotICAgICAqIGRlc3RpbmF0aW9uLiAgRm9yIGNlcnRhaW4gbGl2ZSB2aWRlbyByb3V0ZXMsIHRoZSBhcHBsaWNhdGlvbiBtYXkgYWxzbyB1c2UgYQotICAgICAqIHtAbGluayBhbmRyb2lkLmFwcC5QcmVzZW50YXRpb24gUHJlc2VudGF0aW9ufSB0byByZXBsYWNlIHRoZSBtaXJyb3JlZCB2aWV3Ci0gICAgICogb24gdGhlIGV4dGVybmFsIGRpc3BsYXkgd2l0aCBkaWZmZXJlbnQgY29udGVudC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUmVmZXIgdG8gdGhlIGNsYXNzIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgYWJvdXQgbGl2ZSB2aWRlbyByb3V0ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jZ2V0UHJlc2VudGF0aW9uRGlzcGxheSgpCi0gICAgICogQHNlZSBhbmRyb2lkLmFwcC5QcmVzZW50YXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9MSVZFX1ZJREVPID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmNhdGVnb3J5LkxJVkVfVklERU8iOwotCi0gICAgLyoqCi0gICAgICogTWVkaWEgY29udHJvbCBjYXRlZ29yeTogUmVtb3RlIHBsYXliYWNrLgotICAgICAqIDxwPgotICAgICAqIEEgcm91dGUgdGhhdCBzdXBwb3J0cyByZW1vdGUgcGxheWJhY2sgcm91dGluZyB3aWxsIGFsbG93IGFuIGFwcGxpY2F0aW9uIHRvIHNlbmQKLSAgICAgKiByZXF1ZXN0cyB0byBwbGF5IGNvbnRlbnQgcmVtb3RlbHkgdG8gc3VwcG9ydGVkIGRlc3RpbmF0aW9ucy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUmVtb3RlIHBsYXliYWNrIHJvdXRlcyBkZXN0aW5hdGlvbnMgb3BlcmF0ZSBpbmRlcGVuZGVudGx5IG9mIHRoZSBsb2NhbCBkZXZpY2UuCi0gICAgICogV2hlbiBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSBpcyBzZWxlY3RlZCwgdGhlIGFwcGxpY2F0aW9uIGNhbiBjb250cm9sIHRoZSBjb250ZW50Ci0gICAgICogcGxheWluZyBvbiB0aGUgZGVzdGluYXRpb24gYnkgc2VuZGluZyBtZWRpYSBjb250cm9sIGFjdGlvbnMgdG8gdGhlIHJvdXRlLgotICAgICAqIFRoZSBhcHBsaWNhdGlvbiBtYXkgYWxzbyByZWNlaXZlIHN0YXR1cyB1cGRhdGVzIGZyb20gdGhlIHJvdXRlIHJlZ2FyZGluZwotICAgICAqIHJlbW90ZSBwbGF5YmFjay4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUmVmZXIgdG8gdGhlIGNsYXNzIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMgYWJvdXQgcmVtb3RlIHBsYXliYWNrIHJvdXRlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmNhdGVnb3J5LlJFTU9URV9QTEFZQkFDSyI7Ci0KLSAgICAvKiBSZW1vdGUgcGxheWJhY2sgYWN0aW9ucyB0aGF0IGFmZmVjdCBpbmRpdmlkdWFsIGl0ZW1zLiAqLwotCi0gICAgLyoqCi0gICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBQbGF5IG1lZGlhIGl0ZW0uCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQotICAgICAqIG1lZGlhIGNvbnRyb2wuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIGNhdXNlcyBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSB0byBzdGFydCBwbGF5aW5nIGNvbnRlbnQgd2l0aAotICAgICAqIHRoZSB7QGxpbmsgVXJpfSBzcGVjaWZpZWQgaW4gdGhlIHtAbGluayBJbnRlbnR9J3Mge0BsaW5rIEludGVudCNnZXREYXRhKCkgZGF0YSB1cml9LgotICAgICAqIFRoZSBhY3Rpb24gcmV0dXJucyBhIG1lZGlhIHNlc3Npb24gaWQgYW5kIG1lZGlhIGl0ZW0gaWQgd2hpY2ggY2FuIGJlIHVzZWQKLSAgICAgKiB0byBjb250cm9sIHBsYXliYWNrIHVzaW5nIG90aGVyIHJlbW90ZSBwbGF5YmFjayBhY3Rpb25zLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBPbmNlIGluaXRpYXRlZCwgcGxheWJhY2sgb2YgdGhlIHNwZWNpZmllZCBjb250ZW50IHdpbGwgYmUgbWFuYWdlZCBpbmRlcGVuZGVudGx5Ci0gICAgICogYnkgdGhlIGRlc3RpbmF0aW9uLiAgVGhlIGFwcGxpY2F0aW9uIHdpbGwgcmVjZWl2ZSBzdGF0dXMgdXBkYXRlcyBhcyB0aGUgc3RhdGUKLSAgICAgKiBvZiB0aGUgbWVkaWEgaXRlbSBjaGFuZ2VzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiB0aGUgZGF0YSB1cmkgc3BlY2lmaWVzIGFuIEhUVFAgb3IgSFRUUFMgc2NoZW1lLCB0aGVuIHRoZSBkZXN0aW5hdGlvbiBpcwotICAgICAqIHJlc3BvbnNpYmxlIGZvciBmb2xsb3dpbmcgSFRUUCByZWRpcmVjdHMgdG8gYSByZWFzb25hYmxlIGRlcHRoIG9mIGF0IGxlYXN0IDMKLSAgICAgKiBsZXZlbHMgYXMgbWlnaHQgdHlwaWNhbGx5IGJlIGhhbmRsZWQgYnkgYSB3ZWIgYnJvd3Nlci4gIElmIGFuIEhUVFAgZXJyb3IKLSAgICAgKiBvY2N1cnMsIHRoZW4gdGhlIGRlc3RpbmF0aW9uIHNob3VsZCBzZW5kIGEge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyBzdGF0dXMgdXBkYXRlfQotICAgICAqIGJhY2sgdG8gdGhlIGNsaWVudCBpbmRpY2F0aW5nIHRoZSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzI1BMQVlCQUNLX1NUQVRFX0VSUk9SIGVycm9yfQotICAgICAqIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMjZ2V0UGxheWJhY2tTdGF0ZSgpIHBsYXliYWNrIHN0YXRlfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+T25lIGl0ZW0gYXQgYSB0aW1lPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBFYWNoIHN1Y2Nlc3NmdWwgcGxheSBhY3Rpb24gPGVtPnJlcGxhY2VzPC9lbT4gdGhlIHByZXZpb3VzIHBsYXkgYWN0aW9uLgotICAgICAqIElmIGFuIGl0ZW0gaXMgYWxyZWFkeSBwbGF5aW5nLCB0aGVuIGl0IGlzIGNhbmNlbGVkLCB0aGUgc2Vzc2lvbidzIHBsYXliYWNrIHF1ZXVlCi0gICAgICogaXMgY2xlYXJlZCBhbmQgdGhlIG5ldyBpdGVtIGJlZ2lucyBwbGF5aW5nIGltbWVkaWF0ZWx5IChyZWdhcmRsZXNzIG9mCi0gICAgICogd2hldGhlciB0aGUgcHJldmlvdXNseSBwbGF5aW5nIGl0ZW0gaGFkIGJlZW4gcGF1c2VkKS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxheSBpcyB0aGVyZWZvcmUgZXF1aXZhbGVudCB0byB7QGxpbmsgI0FDVElPTl9TVE9QIHN0b3B9IGZvbGxvd2VkIGJ5IGFuIGFjdGlvbgotICAgICAqIHRvIGVucXVldWUgYSBuZXcgbWVkaWEgaXRlbSB0byBiZSBwbGF5ZWQgaW1tZWRpYXRlbHkuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlNlc3Npb25zPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIHJlcXVlc3QgaGFzIHRoZSBlZmZlY3Qgb2YgaW1wbGljaXRseSBjcmVhdGluZyBhIG1lZGlhIHNlc3Npb24gd2hlbmV2ZXIgdGhlCi0gICAgICogYXBwbGljYXRpb24gZG9lcyBub3Qgc3BlY2lmeSB0aGUge0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEIHNlc3Npb24gaWR9IHBhcmFtZXRlci4KLSAgICAgKiBCZWNhdXNlIHRoZXJlIGNhbiBvbmx5IGJlIGF0IG1vc3Qgb25lIHZhbGlkIHNlc3Npb24gYXQgYSB0aW1lLCBjcmVhdGluZyBhIG5ldyBzZXNzaW9uCi0gICAgICogaGFzIHRoZSBzaWRlLWVmZmVjdCBvZiBpbnZhbGlkYXRpbmcgYW55IGV4aXN0aW5nIHNlc3Npb25zIGFuZCB0aGVpciBtZWRpYSBpdGVtcywKLSAgICAgKiB0aGVuIGhhbmRsaW5nIHRoZSBwbGF5YmFjayByZXF1ZXN0IHdpdGggYSBuZXcgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSWYgdGhlIGFwcGxpY2F0aW9uIHNwZWNpZmllcyBhbiBpbnZhbGlkIHNlc3Npb24gaWQsIHRoZW4gYW4gZXJyb3IgaXMgcmV0dXJuZWQuCi0gICAgICogV2hlbiB0aGlzIGhhcHBlbnMsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgYXNzdW1lIHRoYXQgaXRzIHNlc3Npb24KLSAgICAgKiBpcyBubyBsb25nZXIgdmFsaWQuICBUbyBvYnRhaW4gYSBuZXcgc2Vzc2lvbiwgdGhlIGFwcGxpY2F0aW9uIG1heSB0cnkgYWdhaW4KLSAgICAgKiBhbmQgb21pdCB0aGUgc2Vzc2lvbiBpZCBwYXJhbWV0ZXIuICBIb3dldmVyLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkCi0gICAgICogb25seSByZXRyeSByZXF1ZXN0cyBkdWUgdG8gYW4gZXhwbGljaXQgYWN0aW9uIHBlcmZvcm1lZCBieSB0aGUgdXNlciwKLSAgICAgKiBzdWNoIGFzIHRoZSB1c2VyIGNsaWNraW5nIG9uIGEgInBsYXkiIGJ1dHRvbiBpbiB0aGUgVUksIHNpbmNlIGFub3RoZXIKLSAgICAgKiBhcHBsaWNhdGlvbiBtYXkgYmUgdHJ5aW5nIHRvIHRha2UgY29udHJvbCBvZiB0aGUgcm91dGUgYW5kIHRoZSBmb3JtZXIKLSAgICAgKiBhcHBsaWNhdGlvbiBzaG91bGQgdHJ5IHRvIHN0YXkgb3V0IG9mIGl0cyB3YXkuCi0gICAgICogPC9wPjxwPgotICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHNlc3Npb25zLCBxdWV1ZXMgYW5kIG1lZGlhIGl0ZW1zLCBwbGVhc2UgcmVmZXIgdG8gdGhlCi0gICAgICogY2xhc3MgZG9jdW1lbnRhdGlvbi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZQotICAgICAqIHNlc3Npb24gdG8gd2hpY2ggdGhlIHBsYXliYWNrIHJlcXVlc3QgYmVsb25ncy4gIElmIG9taXR0ZWQsIGEgbmV3IHNlc3Npb24KLSAgICAgKiBpcyBjcmVhdGVkIGltcGxpY2l0bHkuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9DT05URU5UX1BPU0lUSU9OfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGluaXRpYWwKLSAgICAgKiBjb250ZW50IHBsYXliYWNrIHBvc2l0aW9uIGFzIGEgbG9uZyBpbnRlZ2VyIG51bWJlciBvZiBtaWxsaXNlY29uZHMgZnJvbQotICAgICAqIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbnRlbnQuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9NRVRBREFUQX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIG1ldGFkYXRhIGFzc29jaWF0ZWQKLSAgICAgKiB3aXRoIHRoZSBjb250ZW50IHN1Y2ggYXMgdGhlIHRpdGxlIG9mIGEgc29uZy4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVJ9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyBhCi0gICAgICoge0BsaW5rIFBlbmRpbmdJbnRlbnR9IGZvciBhIGJyb2FkY2FzdCByZWNlaXZlciB0aGF0IHdpbGwgcmVjZWl2ZSBzdGF0dXMgdXBkYXRlcwotICAgICAqIGFib3V0IHRoZSBtZWRpYSBpdGVtLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZQotICAgICAqIHNlc3Npb24gdGhhdCB3YXMgYWZmZWN0ZWQgYnkgdGhlIHJlcXVlc3QuICBUaGlzIHdpbGwgYmUgYSBuZXcgc2Vzc2lvbiBpbgotICAgICAqIHRoZSBjYXNlIHdoZXJlIG5vIHNlc3Npb24gaWQgd2FzIHN1cHBsaWVkIGFzIGEgcGFyYW1ldGVyLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQotICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fSUR9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgYW4gb3BhcXVlIHN0cmluZyBpZGVudGlmaWVyCi0gICAgICogdG8gdXNlIHRvIHJlZmVyIHRvIHRoZSBtZWRpYSBpdGVtIGluIHN1YnNlcXVlbnQgcmVxdWVzdHMgc3VjaCBhcwotICAgICAqIHtAbGluayAjQUNUSU9OX0dFVF9TVEFUVVN9LgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBpbml0aWFsIHN0YXR1cyBvZgotICAgICAqIHRoZSBuZXcgbWVkaWEgaXRlbS4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlN0YXR1cyB1cGRhdGVzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgY2xpZW50IHN1cHBsaWVzIGFuCi0gICAgICoge0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgaXRlbSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyfQotICAgICAqIHRoZW4gdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIHN0YXR1cyB1cGRhdGVzIHRvIHRoZSByZWNlaXZlcgotICAgICAqIHdoZW4gc2lnbmlmaWNhbnQgbWVkaWEgaXRlbSBzdGF0ZSBjaGFuZ2VzIG9jY3VyIHN1Y2ggYXMgd2hlbiBwbGF5YmFjayBzdGFydHMgb3IKLSAgICAgKiBzdG9wcy4gIFRoZSByZWNlaXZlciB3aWxsIG5vdCBiZSBpbnZva2VkIGZvciBjb250ZW50IHBsYXliYWNrIHBvc2l0aW9uIGNoYW5nZXMuCi0gICAgICogVGhlIGFwcGxpY2F0aW9uIG1heSByZXRyaWV2ZSB0aGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbiB3aGVuIG5lY2Vzc2FyeQotICAgICAqIHVzaW5nIHRoZSB7QGxpbmsgI0FDVElPTl9HRVRfU1RBVFVTfSByZXF1ZXN0LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBSZWZlciB0byB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzfSBmb3IgZGV0YWlscy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIGEgc2Vzc2lvbiBpZCB3YXMgcHJvdmlkZWQgYnV0IGlzIHVua25vd24gb3IKLSAgICAgKiBubyBsb25nZXIgdmFsaWQsIGlmIHRoZSBpdGVtIFVyaSBvciBjb250ZW50IHR5cGUgaXMgbm90IHN1cHBvcnRlZCwgb3IgaWYKLSAgICAgKiBhbnkgb3RoZXIgYXJndW1lbnRzIGFyZSBpbnZhbGlkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5FeGFtcGxlPC9oMz4KLSAgICAgKiA8cHJlPgotICAgICAqIE1lZGlhUm91dGVyIG1lZGlhUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoY29udGV4dCk7Ci0gICAgICogTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gbWVkaWFSb3V0ZXIuZ2V0U2VsZWN0ZWRSb3V0ZSgpOwotICAgICAqIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUExBWSk7Ci0gICAgICogaW50ZW50LmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spOwotICAgICAqIGludGVudC5zZXREYXRhQW5kVHlwZSgiaHR0cDovL2V4YW1wbGUuY29tL3ZpZGVvcy9tb3ZpZS5tcDQiLCAidmlkZW8vbXA0Iik7Ci0gICAgICogaWYgKHJvdXRlLnN1cHBvcnRzQ29udHJvbFJlcXVlc3QoaW50ZW50KSkgewotICAgICAqICAgICBNZWRpYVJvdXRlci5Db250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrID0gbmV3IE1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2soKSB7Ci0gICAgICogICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSkgewotICAgICAqICAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0IHN1Y2NlZWRlZC4KLSAgICAgKiAgICAgICAgICAgICAvLyBQbGF5YmFjayBtYXkgYmUgY29udHJvbGxlZCB1c2luZyB0aGUgcmV0dXJuZWQgc2Vzc2lvbiBhbmQgaXRlbSBpZC4KLSAgICAgKiAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkID0gZGF0YS5nZXRTdHJpbmcoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fSUQpOwotICAgICAqICAgICAgICAgICAgIFN0cmluZyBpdGVtSWQgPSBkYXRhLmdldFN0cmluZyhNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9JRCk7Ci0gICAgICogICAgICAgICAgICAgTWVkaWFJdGVtU3RhdHVzIHN0YXR1cyA9IE1lZGlhSXRlbVN0YXR1cy5mcm9tQnVuZGxlKGRhdGEuZ2V0QnVuZGxlKAotICAgICAqICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fU1RBVFVTKSk7Ci0gICAgICogICAgICAgICAgICAgLy8gLi4uCi0gICAgICogICAgICAgICB9Ci0gICAgICoKLSAgICAgKiAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICogICAgICAgICAgICAgLy8gQW4gZXJyb3Igb2NjdXJyZWQhCi0gICAgICogICAgICAgICB9Ci0gICAgICogICAgIH07Ci0gICAgICogICAgIHJvdXRlLnNlbmRDb250cm9sUmVxdWVzdChpbnRlbnQsIGNhbGxiYWNrKTsKLSAgICAgKiB9PC9wcmU+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKLSAgICAgKiBAc2VlICNBQ1RJT05fU0VFSwotICAgICAqIEBzZWUgI0FDVElPTl9HRVRfU1RBVFVTCi0gICAgICogQHNlZSAjQUNUSU9OX1BBVVNFCi0gICAgICogQHNlZSAjQUNUSU9OX1JFU1VNRQotICAgICAqIEBzZWUgI0FDVElPTl9TVE9QCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1BMQVkgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLlBMQVkiOwotCi0gICAgLyoqCi0gICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBFbnF1ZXVlIG1lZGlhIGl0ZW0uCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQotICAgICAqIG1lZGlhIGNvbnRyb2wuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIHdvcmtzIGp1c3QgbGlrZSB7QGxpbmsgI0FDVElPTl9QTEFZIHBsYXl9IGV4Y2VwdCB0aGF0IGl0IGRvZXMKLSAgICAgKiBub3QgY2xlYXIgdGhlIHF1ZXVlIG9yIHJlc2V0IHRoZSBwYXVzZSBzdGF0ZSB3aGVuIGl0IGVucXVldWVzIHRoZQotICAgICAqIG5ldyBtZWRpYSBpdGVtIGludG8gdGhlIHNlc3Npb24ncyBwbGF5YmFjayBxdWV1ZS4gIFRoaXMgYWN0aW9uIG9ubHkKLSAgICAgKiBlbnF1ZXVlcyBhIG1lZGlhIGl0ZW0gd2l0aCBubyBvdGhlciBzaWRlLWVmZmVjdHMgb24gdGhlIHF1ZXVlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiB0aGUgcXVldWUgaXMgY3VycmVudGx5IGVtcHR5IGFuZCB0aGVuIHRoZSBpdGVtIHdpbGwgcGxheSBpbW1lZGlhdGVseQotICAgICAqIChhc3N1bWluZyB0aGUgcXVldWUgaXMgbm90IHBhdXNlZCkuICBPdGhlcndpc2UsIHRoZSBpdGVtIHdpbGwgcGxheQotICAgICAqIGFmdGVyIGFsbCBlYXJsaWVyIGl0ZW1zIGluIHRoZSBxdWV1ZSBoYXZlIGZpbmlzaGVkIG9yIGJlZW4gcmVtb3ZlZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIGVucXVldWUgYWN0aW9uIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBuZXcgc2Vzc2lvbnMganVzdCBsaWtlIHBsYXkuCi0gICAgICogSXRzIHBhcmFtZXRlcnMgYW5kIHJlc3VsdHMgYXJlIGFsc28gdGhlIHNhbWUuICBPbmx5IHRoZSBxdWV1aW5nIGJlaGF2aW9yCi0gICAgICogaXMgZGlmZmVyZW50LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0VOUVVFVUUgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLkVOUVVFVUUiOwotCi0gICAgLyoqCi0gICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBTZWVrIG1lZGlhIGl0ZW0gdG8gYSBuZXcgcGxheWJhY2sgcG9zaXRpb24uCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQotICAgICAqIG1lZGlhIGNvbnRyb2wuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIGNhdXNlcyBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSB0byBtb2RpZnkgdGhlIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24KLSAgICAgKiBvZiB0aGUgc3BlY2lmaWVkIG1lZGlhIGl0ZW0uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIG9ubHkgYWZmZWN0cyB0aGUgcGxheWJhY2sgcG9zaXRpb24gb2YgdGhlIG1lZGlhIGl0ZW07IG5vdCBpdHMgcGxheWJhY2sgc3RhdGUuCi0gICAgICogSWYgdGhlIHBsYXliYWNrIHF1ZXVlIGlzIHBhdXNlZCwgdGhlbiBzZWVraW5nIHNldHMgdGhlIHBvc2l0aW9uIGJ1dCB0aGUgaXRlbQotICAgICAqIHJlbWFpbnMgcGF1c2VkLiAgTGlrZXdpc2UgaWYgdGhlIGl0ZW0gaXMgcGxheWluZywgdGhlbiBzZWVraW5nIHdpbGwgY2F1c2UgcGxheWJhY2sKLSAgICAgKiB0byBqdW1wIHRvIHRoZSBuZXcgcG9zaXRpb24gYW5kIGNvbnRpbnVlIHBsYXlpbmcgZnJvbSB0aGF0IHBvaW50LiAgSWYgdGhlIGl0ZW0gaGFzCi0gICAgICogbm90IHlldCBzdGFydGVkIHBsYXlpbmcsIHRoZW4gdGhlIG5ldyBwbGF5YmFjayBwb3NpdGlvbiBpcyByZW1lbWJlcmVkIGJ5IHRoZQotICAgICAqIHF1ZXVlIGFuZCB1c2VkIGFzIHRoZSBpdGVtJ3MgaW5pdGlhbCBjb250ZW50IHBvc2l0aW9uIHdoZW4gcGxheWJhY2sgZXZlbnR1YWxseSBiZWdpbnMuCi0gICAgICogPC9wPjxwPgotICAgICAqIElmIHN1Y2Nlc3NmdWwsIHRoZSBtZWRpYSBpdGVtJ3MgcGxheWJhY2sgcG9zaXRpb24gaXMgY2hhbmdlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZSBzZXNzaW9uCi0gICAgICogdG8gd2hpY2ggdGhlIG1lZGlhIGl0ZW0gYmVsb25ncy4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG1lZGlhIGl0ZW0gaWQgb2YKLSAgICAgKiB0aGUgbWVkaWEgaXRlbSB0byBzZWVrLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fQ09OVEVOVF9QT1NJVElPTn0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBuZXcKLSAgICAgKiBjb250ZW50IHBvc2l0aW9uIGZvciBwbGF5YmFjayBhcyBhIGxvbmcgaW50ZWdlciBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGZyb20KLSAgICAgKiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb250ZW50LgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihvcHRpb25hbCwgb2xkIGltcGxlbWVudGF0aW9ucyBtYXkKLSAgICAgKiBvbWl0IHRoaXMga2V5KTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU30gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbmV3IHN0YXR1cyBvZgotICAgICAqIHRoZSBtZWRpYSBpdGVtLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIG9yIG1lZGlhIGl0ZW0gaWQgYXJlIHVua25vd24KLSAgICAgKiBvciBubyBsb25nZXIgdmFsaWQsIGlmIHRoZSBjb250ZW50IHBvc2l0aW9uIGlzIGludmFsaWQsIG9yIGlmIHRoZSBtZWRpYSBpdGVtCi0gICAgICogaXMgaW4gYSB0ZXJtaW5hbCBzdGF0ZS4KLSAgICAgKiA8L3A+PHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU0VFSyA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uU0VFSyI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IEdldCBtZWRpYSBpdGVtIHBsYXliYWNrIHN0YXR1cwotICAgICAqIGFuZCBwcm9ncmVzcyBpbmZvcm1hdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gYXNrcyBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSB0byBwcm92aWRlIHVwZGF0ZWQgcGxheWJhY2sgc3RhdHVzIGFuZCBwcm9ncmVzcwotICAgICAqIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzcGVjaWZpZWQgbWVkaWEgaXRlbS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZSBzZXNzaW9uCi0gICAgICogdG8gd2hpY2ggdGhlIG1lZGlhIGl0ZW0gYmVsb25ncy4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG1lZGlhIGl0ZW0gaWQgb2YKLSAgICAgKiB0aGUgbWVkaWEgaXRlbSB0byBxdWVyeS4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5Ci0gICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9TVEFUVVN9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGN1cnJlbnQgc3RhdHVzIG9mCi0gICAgICogdGhlIG1lZGlhIGl0ZW0uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgb3IgbWVkaWEgaXRlbSBpZCBhcmUgdW5rbm93bgotICAgICAqIG9yIG5vIGxvbmdlciB2YWxpZC4KLSAgICAgKiA8L3A+PHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKLSAgICAgKiBAc2VlICNFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fR0VUX1NUQVRVUyA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uR0VUX1NUQVRVUyI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFJlbW92ZSBtZWRpYSBpdGVtIGZyb20gc2Vzc2lvbidzIHF1ZXVlLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBhc2tzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIHJlbW92ZSB0aGUgc3BlY2lmaWVkIG1lZGlhIGl0ZW0KLSAgICAgKiBmcm9tIHRoZSBzZXNzaW9uJ3MgcGxheWJhY2sgcXVldWUuICBJZiB0aGUgY3VycmVudCBpdGVtIGlzIHJlbW92ZWQsIHRoZW4KLSAgICAgKiBwbGF5YmFjayB3aWxsIHByb2NlZWQgdG8gdGhlIG5leHQgbWVkaWEgaXRlbSAoYXNzdW1pbmcgdGhlIHF1ZXVlIGhhcyBub3QgYmVlbgotICAgICAqIHBhdXNlZCkuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIGRvZXMgbm90IGFmZmVjdCB0aGUgcGF1c2Ugc3RhdGUgb2YgdGhlIHF1ZXVlLiAgSWYgdGhlIHF1ZXVlIHdhcyBwYXVzZWQKLSAgICAgKiB0aGVuIGl0IHJlbWFpbnMgcGF1c2VkIChldmVuIGlmIGl0IGlzIG5vdyBlbXB0eSkgdW50aWwgYSByZXN1bWUsIHN0b3Agb3IgcGxheQotICAgICAqIGFjdGlvbiBpcyBpc3N1ZWQgdGhhdCBjYXVzZXMgdGhlIHBhdXNlIHN0YXRlIHRvIGJlIGNsZWFyZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUgc2Vzc2lvbgotICAgICAqIHRvIHdoaWNoIHRoZSBtZWRpYSBpdGVtIGJlbG9uZ3MuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBtZWRpYSBpdGVtIGlkIG9mCi0gICAgICogdGhlIG1lZGlhIGl0ZW0gdG8gcmVtb3ZlLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihvcHRpb25hbCwgb2xkIGltcGxlbWVudGF0aW9ucyBtYXkKLSAgICAgKiBvbWl0IHRoaXMga2V5KTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU30gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbmV3IHN0YXR1cyBvZgotICAgICAqIHRoZSBtZWRpYSBpdGVtLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIG9yIG1lZGlhIGl0ZW0gaWQgYXJlIHVua25vd24KLSAgICAgKiBvciBubyBsb25nZXIgdmFsaWQsIG9yIGlmIHRoZSBtZWRpYSBpdGVtIGlzIGluIGEgdGVybWluYWwgc3RhdGUgKGFuZCB0aGVyZWZvcmUKLSAgICAgKiBubyBsb25nZXIgaW4gdGhlIHF1ZXVlKS4KLSAgICAgKiA8L3A+PHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUkVNT1ZFID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5SRU1PVkUiOwotCi0gICAgLyogUmVtb3RlIHBsYXliYWNrIGFjdGlvbnMgdGhhdCBhZmZlY3QgdGhlIHdob2xlIHBsYXliYWNrIHF1ZXVlLiAqLwotCi0gICAgLyoqCi0gICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBQYXVzZSBtZWRpYSBwbGF5YmFjay4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIHRoZSBwbGF5YmFjayBxdWV1ZSBvZiB0aGUgc3BlY2lmaWVkIHNlc3Npb24gdG8gYmUgcGF1c2VkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlIHNlc3Npb24KLSAgICAgKiB3aG9zZSBwbGF5YmFjayBxdWV1ZSBpcyB0byBiZSBwYXVzZWQuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQotICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIGlzIHVua25vd24gb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqIEBzZWUgI0FDVElPTl9SRVNVTUUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUEFVU0UgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLlBBVVNFIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogUmVzdW1lIG1lZGlhIHBsYXliYWNrICh1bnBhdXNlKS4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIHRoZSBwbGF5YmFjayBxdWV1ZSBvZiB0aGUgc3BlY2lmaWVkIHNlc3Npb24gdG8gYmUgcmVzdW1lZC4KLSAgICAgKiBSZXZlcnNlcyB0aGUgZWZmZWN0cyBvZiB7QGxpbmsgI0FDVElPTl9QQVVTRX0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUgc2Vzc2lvbgotICAgICAqIHdob3NlIHBsYXliYWNrIHF1ZXVlIGlzIHRvIGJlIHJlc3VtZWQuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQotICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIGlzIHVua25vd24gb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqIEBzZWUgI0FDVElPTl9QQVVTRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9SRVNVTUUgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLlJFU1VNRSI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFN0b3AgbWVkaWEgcGxheWJhY2sgKGNsZWFyIHF1ZXVlIGFuZCB1bnBhdXNlKS4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIHN0b3AgcGxheWJhY2ssIGNhbmNlbCBhbmQgcmVtb3ZlCi0gICAgICogYWxsIG1lZGlhIGl0ZW1zIGZyb20gdGhlIHNlc3Npb24ncyBtZWRpYSBpdGVtIHF1ZXVlIGFuZCwgcmVzZXQgdGhlIHF1ZXVlJ3MKLSAgICAgKiBwYXVzZSBzdGF0ZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSWYgc3VjY2Vzc2Z1bCwgdGhlIHN0YXR1cyBvZiBhbGwgbWVkaWEgaXRlbXMgaW4gdGhlIHF1ZXVlIGlzIHNldCB0bwotICAgICAqIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMjUExBWUJBQ0tfU1RBVEVfQ0FOQ0VMRUQgY2FuY2VsZWR9IGFuZCBhIHN0YXR1cyB1cGRhdGUgaXMgc2VudAotICAgICAqIHRvIHRoZSBhcHByb3ByaWF0ZSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVycyBpbmRpY2F0aW5nIHRoZSBuZXcgc3RhdHVzIG9mIGVhY2ggaXRlbS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mCi0gICAgICogdGhlIHNlc3Npb24gd2hvc2UgcGxheWJhY2sgcXVldWUgaXMgdG8gYmUgc3RvcHBlZCAoY2xlYXJlZCBhbmQgdW5wYXVzZWQpLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihvcHRpb25hbCwgb2xkIGltcGxlbWVudGF0aW9ucyBtYXkKLSAgICAgKiBvbWl0IHRoaXMga2V5KTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPkVycm9yczwvaDM+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgc2Vzc2lvbiBpZCBpcyB1bmtub3duIG9yIG5vIGxvbmdlciB2YWxpZC4KLSAgICAgKiA8L3A+PHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU1RPUCA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uU1RPUCI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFN0YXJ0IHNlc3Npb24uCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQotICAgICAqIG1lZGlhIGNvbnRyb2wuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIGNhdXNlcyBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSB0byBpbnZhbGlkYXRlIHRoZSBjdXJyZW50IHNlc3Npb24KLSAgICAgKiBhbmQgc3RhcnQgYSBuZXcgc2Vzc2lvbi4gIFRoZSBuZXcgc2Vzc2lvbiBpbml0aWFsbHkgaGFzIGFuIGVtcHR5IHF1ZXVlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiBzdWNjZXNzZnVsLCB0aGUgc3RhdHVzIG9mIGFsbCBtZWRpYSBpdGVtcyBpbiB0aGUgcHJldmlvdXMgc2Vzc2lvbidzIHF1ZXVlIGlzIHNldCB0bwotICAgICAqIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMjUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUQgaW52YWxpZGF0ZWR9IGFuZCBhIHN0YXR1cyB1cGRhdGUKLSAgICAgKiBpcyBzZW50IHRvIHRoZSBhcHByb3ByaWF0ZSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVycyBpbmRpY2F0aW5nIHRoZSBuZXcgc3RhdHVzCi0gICAgICogb2YgZWFjaCBpdGVtLiAgVGhlIHByZXZpb3VzIHNlc3Npb24gYmVjb21lcyBubyBsb25nZXIgdmFsaWQgYW5kIHRoZSBuZXcgc2Vzc2lvbgotICAgICAqIHRha2VzIGNvbnRyb2wgb2YgdGhlIHJvdXRlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU19VUERBVEVfUkVDRUlWRVJ9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyBhCi0gICAgICoge0BsaW5rIFBlbmRpbmdJbnRlbnR9IGZvciBhIGJyb2FkY2FzdCByZWNlaXZlciB0aGF0IHdpbGwgcmVjZWl2ZSBzdGF0dXMgdXBkYXRlcwotICAgICAqIGFib3V0IHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX01FU1NBR0VfUkVDRUlWRVJ9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyBhCi0gICAgICoge0BsaW5rIFBlbmRpbmdJbnRlbnR9IGZvciBhIGJyb2FkY2FzdCByZWNlaXZlciB0aGF0IHdpbGwgcmVjZWl2ZSBtZXNzYWdlcyBmcm9tCi0gICAgICogdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlCi0gICAgICogc2Vzc2lvbiB0aGF0IHdhcyBzdGFydGVkIGJ5IHRoZSByZXF1ZXN0LiAgVGhpcyB3aWxsIGFsd2F5cyBiZSBhIGJyYW5kIG5ldyBzZXNzaW9uCi0gICAgICogZGlzdGluY3QgZnJvbSBhbnkgb3RoZXIgcHJldmlvdXNseSBjcmVhdGVkIHNlc3Npb25zLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZQotICAgICAqIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlN0YXR1cyB1cGRhdGVzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgY2xpZW50IHN1cHBsaWVzIGEKLSAgICAgKiB7QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUiBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyfQotICAgICAqIHRoZW4gdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGlzIHJlc3BvbnNpYmxlIGZvciBzZW5kaW5nIHN0YXR1cyB1cGRhdGVzIHRvIHRoZSByZWNlaXZlcgotICAgICAqIHdoZW4gc2lnbmlmaWNhbnQgbWVkaWEgc2Vzc2lvbiBzdGF0ZSBjaGFuZ2VzIG9jY3VyIHN1Y2ggYXMgd2hlbiB0aGUgc2Vzc2lvbidzCi0gICAgICogcXVldWUgaXMgcGF1c2VkIG9yIHJlc3VtZWQgb3Igd2hlbiB0aGUgc2Vzc2lvbiBpcyB0ZXJtaW5hdGVkIG9yIGludmFsaWRhdGVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBSZWZlciB0byB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzfSBmb3IgZGV0YWlscy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+Q3VzdG9tIG1lc3NhZ2VzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgY2xpZW50IHN1cHBsaWVzIGEge0BsaW5rICNFWFRSQV9NRVNTQUdFX1JFQ0VJVkVSIG1lc3NhZ2UgcmVjZWl2ZXJ9Ci0gICAgICogdGhlbiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgbWVzc2FnZXMgdG8gdGhlIHJlY2VpdmVyCi0gICAgICogd2hlbiB0aGUgc2Vzc2lvbiBoYXMgYW55IG1lc3NhZ2VzIHRvIHNlbmQuCi0gICAgICogPC9wPjxwPgotICAgICAqIFJlZmVyIHRvIHtAbGluayAjRVhUUkFfTUVTU0FHRX0gZm9yIGRldGFpbHMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPkVycm9yczwvaDM+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgc2Vzc2lvbiBjb3VsZCBub3QgYmUgY3JlYXRlZC4KLSAgICAgKiA8L3A+PHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU1RBUlRfU0VTU0lPTiA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uU1RBUlRfU0VTU0lPTiI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IEdldCBtZWRpYSBzZXNzaW9uIHN0YXR1cyBpbmZvcm1hdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gYXNrcyBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSB0byBwcm92aWRlIHVwZGF0ZWQgc3RhdHVzIGluZm9ybWF0aW9uCi0gICAgICogYWJvdXQgdGhlIHNwZWNpZmllZCBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlCi0gICAgICogc2Vzc2lvbiB3aG9zZSBzdGF0dXMgaXMgdG8gYmUgcmV0cmlldmVkLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUKLSAgICAgKiBjdXJyZW50IHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPkVycm9yczwvaDM+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgc2Vzc2lvbiBpZCBpcyB1bmtub3duIG9yIG5vIGxvbmdlciB2YWxpZC4KLSAgICAgKiA8L3A+PHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0VSUk9SX0NPREV9IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgY2F1c2Ugb2YgdGhlIGVycm9yLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKiBAc2VlICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sKLSAgICAgKiBAc2VlICNFWFRSQV9TRVNTSU9OX1NUQVRVU19VUERBVEVfUkVDRUlWRVIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uR0VUX1NFU1NJT05fU1RBVFVTIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogRW5kIHNlc3Npb24uCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQotICAgICAqIG1lZGlhIGNvbnRyb2wuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIGNhdXNlcyBhIHJlbW90ZSBwbGF5YmFjayByb3V0ZSB0byBlbmQgdGhlIHNwZWNpZmllZCBzZXNzaW9uLgotICAgICAqIFRoZSBzZXNzaW9uIGJlY29tZXMgbm8gbG9uZ2VyIHZhbGlkIGFuZCB0aGUgcm91dGUgY2Vhc2VzIHRvIGJlIHVuZGVyIGNvbnRyb2wKLSAgICAgKiBvZiB0aGUgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSWYgc3VjY2Vzc2Z1bCwgdGhlIHN0YXR1cyBvZiB0aGUgc2Vzc2lvbiBpcyBzZXQgdG8KLSAgICAgKiB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzI1NFU1NJT05fU1RBVEVfRU5ERUR9IGFuZCBhIHN0YXR1cyB1cGRhdGUgaXMgc2VudCB0bwotICAgICAqIHRoZSBzZXNzaW9uJ3Mgc3RhdHVzIHVwZGF0ZSByZWNlaXZlci4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogQWRkaXRpb25hbGx5LCB0aGUgc3RhdHVzIG9mIGFsbCBtZWRpYSBpdGVtcyBpbiB0aGUgcXVldWUgaXMgc2V0IHRvCi0gICAgICoge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyNQTEFZQkFDS19TVEFURV9DQU5DRUxFRCBjYW5jZWxlZH0gYW5kIGEgc3RhdHVzIHVwZGF0ZSBpcyBzZW50Ci0gICAgICogdG8gdGhlIGFwcHJvcHJpYXRlIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzIGluZGljYXRpbmcgdGhlIG5ldyBzdGF0dXMgb2YgZWFjaCBpdGVtLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YKLSAgICAgKiB0aGUgc2Vzc2lvbiB0byBlbmQuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZQotICAgICAqIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPkVycm9yczwvaDM+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgc2Vzc2lvbiBpZCBpcyB1bmtub3duIG9yIG5vIGxvbmdlciB2YWxpZC4KLSAgICAgKiBJbiBvdGhlciB3b3JkcywgaXQgaXMgYW4gZXJyb3IgdG8gYXR0ZW1wdCB0byBlbmQgYSBzZXNzaW9uIG90aGVyIHRoYW4gdGhlCi0gICAgICogY3VycmVudCBzZXNzaW9uLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9FTkRfU0VTU0lPTiA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uRU5EX1NFU1NJT04iOwotCi0gICAgLyoqCi0gICAgICogQ3VzdG9tIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBTZW5kIHtAbGluayAjRVhUUkFfTUVTU0FHRX0uCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBhY3Rpb24gYXNrcyBhIHJvdXRlIHRvIGhhbmRsZSBhIG1lc3NhZ2UgZGVzY3JpYmVkIGJ5IEVYVFJBX01FU1NBR0UuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUgc2Vzc2lvbgotICAgICAqIHRvIHdoaWNoIHdpbGwgaGFuZGxlIHRoaXMgbWVzc2FnZS4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9NRVNTQUdFfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG1lc3NhZ2UgdG8gc2VuZC4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiBBbnkgbWVzc2FnZXMgZGVmaW5lZCBieSBlYWNoIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICAgICAqCi0gICAgICogPGgzPkVycm9yczwvaDM+Ci0gICAgICogQW55IGVycm9yIG1lc3NhZ2VzIGRlZmluZWQgYnkgZWFjaCBtZWRpYSByb3V0ZSBwcm92aWRlci4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TRU5EX01FU1NBR0UgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLlNFTkRfTUVTU0FHRSI7Ci0KLSAgICAvKiBFeHRyYXMgYW5kIHJlbGF0ZWQgY29uc3RhbnRzLiAqLwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBzZXNzaW9uIGlkLgotICAgICAqIDxwPgotICAgICAqIEFuIG9wYXF1ZSB1bmlxdWUgaWRlbnRpZmllciB0aGF0IGlkZW50aWZpZXMgdGhlIHJlbW90ZSBwbGF5YmFjayBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBVc2VkIHdpdGggdmFyaW91cyBhY3Rpb25zIHRvIHNwZWNpZnkgdGhlIGlkIG9mIHRoZSBtZWRpYSBzZXNzaW9uIHRvIGJlIGNvbnRyb2xsZWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIEluY2x1ZGVkIGluIGJyb2FkY2FzdCBpbnRlbnRzIHNlbnQgdG8KLSAgICAgKiB7QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUiBpdGVtIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzfSB0byBpZGVudGlmeQotICAgICAqIHRoZSBzZXNzaW9uIHRvIHdoaWNoIHRoZSBpdGVtIGluIHF1ZXN0aW9uIGJlbG9uZ3MuCi0gICAgICogPC9wPjxwPgotICAgICAqIEluY2x1ZGVkIGluIGJyb2FkY2FzdCBpbnRlbnRzIHNlbnQgdG8KLSAgICAgKiB7QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUiBzZXNzaW9uIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzfSB0byBpZGVudGlmeQotICAgICAqIHRoZSBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB1bmlxdWUgc3RyaW5nIHZhbHVlIGdlbmVyYXRlZCBieSB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIKLSAgICAgKiB0byByZXByZXNlbnQgb25lIHBhcnRpY3VsYXIgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI0FDVElPTl9TRUVLCi0gICAgICogQHNlZSAjQUNUSU9OX0dFVF9TVEFUVVMKLSAgICAgKiBAc2VlICNBQ1RJT05fUEFVU0UKLSAgICAgKiBAc2VlICNBQ1RJT05fUkVTVU1FCi0gICAgICogQHNlZSAjQUNUSU9OX1NUT1AKLSAgICAgKiBAc2VlICNBQ1RJT05fU1RBUlRfU0VTU0lPTgotICAgICAqIEBzZWUgI0FDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMKLSAgICAgKiBAc2VlICNBQ1RJT05fRU5EX1NFU1NJT04KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9TRVNTSU9OX0lEID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5TRVNTSU9OX0lEIjsKLQotICAgIC8qKgotICAgICAqIEJ1bmRsZSBleHRyYTogTWVkaWEgc2Vzc2lvbiBzdGF0dXMuCi0gICAgICogPHA+Ci0gICAgICogUmV0dXJuZWQgYXMgYSByZXN1bHQgZnJvbSBtZWRpYSBzZXNzaW9uIGFjdGlvbnMgc3VjaCBhcyB7QGxpbmsgI0FDVElPTl9TVEFSVF9TRVNTSU9OfSwKLSAgICAgKiB7QGxpbmsgI0FDVElPTl9QQVVTRX0sIGFuZCB7QGxpbmsgI0FDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVN9Ci0gICAgICogdG8gZGVzY3JpYmUgdGhlIHN0YXR1cyBvZiB0aGUgc3BlY2lmaWVkIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIEluY2x1ZGVkIGluIGJyb2FkY2FzdCBpbnRlbnRzIHNlbnQgdG8KLSAgICAgKiB7QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUiBzZXNzaW9uIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzfSB0byBwcm92aWRlCi0gICAgICogdXBkYXRlZCBzdGF0dXMgaW5mb3JtYXRpb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBhbmRyb2lkLm9zLkJ1bmRsZX0gb2YgZGF0YSB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgaW50bwotICAgICAqIGEge0BsaW5rIE1lZGlhU2Vzc2lvblN0YXR1c30gb2JqZWN0IHVzaW5nCi0gICAgICoge0BsaW5rIE1lZGlhU2Vzc2lvblN0YXR1cyNmcm9tQnVuZGxlIE1lZGlhU2Vzc2lvblN0YXR1cy5mcm9tQnVuZGxlfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI0FDVElPTl9TRUVLCi0gICAgICogQHNlZSAjQUNUSU9OX0dFVF9TVEFUVVMKLSAgICAgKiBAc2VlICNBQ1RJT05fUEFVU0UKLSAgICAgKiBAc2VlICNBQ1RJT05fUkVTVU1FCi0gICAgICogQHNlZSAjQUNUSU9OX1NUT1AKLSAgICAgKiBAc2VlICNBQ1RJT05fU1RBUlRfU0VTU0lPTgotICAgICAqIEBzZWUgI0FDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMKLSAgICAgKiBAc2VlICNBQ1RJT05fRU5EX1NFU1NJT04KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9TRVNTSU9OX1NUQVRVUyA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuU0VTU0lPTl9TVEFUVVMiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBzZXNzaW9uIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXIuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1NUQVJUX1NFU1NJT059IHRvIHNwZWNpZnkgYSB7QGxpbmsgUGVuZGluZ0ludGVudH0gZm9yIGEKLSAgICAgKiBicm9hZGNhc3QgcmVjZWl2ZXIgdGhhdCB3aWxsIHJlY2VpdmUgc3RhdHVzIHVwZGF0ZXMgYWJvdXQgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFdoZW5ldmVyIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24gY2hhbmdlcywgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHdpbGwKLSAgICAgKiBzZW5kIGEgYnJvYWRjYXN0IHRvIHRoZSBwZW5kaW5nIGludGVudCB3aXRoIGV4dHJhcyB0aGF0IGlkZW50aWZ5IHRoZSBzZXNzaW9uCi0gICAgICogaWQgYW5kIGl0cyB1cGRhdGVkIHN0YXR1cy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5Ccm9hZGNhc3QgZXh0cmFzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mCi0gICAgICogdGhlIHNlc3Npb24uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZQotICAgICAqIHNlc3Npb24gYXMgYSBidW5kbGUgdGhhdCBjYW4gYmUgZGVjb2RlZCBpbnRvIGEge0BsaW5rIE1lZGlhU2Vzc2lvblN0YXR1c30gb2JqZWN0LgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fU1RBUlRfU0VTU0lPTgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUiA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIjsKLQotICAgIC8qKgotICAgICAqIEJ1bmRsZSBleHRyYTogTWVkaWEgbWVzc2FnZSByZWNlaXZlci4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fU1RBUlRfU0VTU0lPTn0gdG8gc3BlY2lmeSBhIHtAbGluayBQZW5kaW5nSW50ZW50fSBmb3IgYQotICAgICAqIGJyb2FkY2FzdCByZWNlaXZlciB0aGF0IHdpbGwgcmVjZWl2ZSBtZXNzYWdlcyBmcm9tIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBXaGVuIHRoZSBtZWRpYSBzZXNzaW9uIGhhcyBhIG1lc3NhZ2UgdG8gc2VuZCwgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHdpbGwKLSAgICAgKiBzZW5kIGEgYnJvYWRjYXN0IHRvIHRoZSBwZW5kaW5nIGludGVudCB3aXRoIGV4dHJhcyB0aGF0IGlkZW50aWZ5IHRoZSBzZXNzaW9uCi0gICAgICogaWQgYW5kIGl0cyBtZXNzYWdlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgUGVuZGluZ0ludGVudH0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPkJyb2FkY2FzdCBleHRyYXM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YKLSAgICAgKiB0aGUgc2Vzc2lvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9NRVNTQUdFfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG1lc3NhZ2UgZnJvbQotICAgICAqIHRoZSBzZXNzaW9uIGFzIGEgYnVuZGxlIG9iamVjdC4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSAjQUNUSU9OX1NUQVJUX1NFU1NJT04KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9NRVNTQUdFX1JFQ0VJVkVSID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5NRVNTQUdFX1JFQ0VJVkVSIjsKLQotICAgIC8qKgotICAgICAqIEJ1bmRsZSBleHRyYTogTWVkaWEgaXRlbSBpZC4KLSAgICAgKiA8cD4KLSAgICAgKiBBbiBvcGFxdWUgdW5pcXVlIGlkZW50aWZpZXIgcmV0dXJuZWQgYXMgYSByZXN1bHQgZnJvbSB7QGxpbmsgI0FDVElPTl9QTEFZfSBvcgotICAgICAqIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IHRoYXQgcmVwcmVzZW50cyB0aGUgbWVkaWEgaXRlbSB0aGF0IHdhcyBjcmVhdGVkIGJ5IHRoZQotICAgICAqIHBsYXliYWNrIHJlcXVlc3QuCi0gICAgICogPC9wPjxwPgotICAgICAqIFVzZWQgd2l0aCB2YXJpb3VzIGFjdGlvbnMgdG8gc3BlY2lmeSB0aGUgaWQgb2YgdGhlIG1lZGlhIGl0ZW0gdG8gYmUgY29udHJvbGxlZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bwotICAgICAqIHtAbGluayAjRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzfSB0byBpZGVudGlmeQotICAgICAqIHRoZSBpdGVtIGluIHF1ZXN0aW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB1bmlxdWUgc3RyaW5nIHZhbHVlIGdlbmVyYXRlZCBieSB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIKLSAgICAgKiB0byByZXByZXNlbnQgb25lIHBhcnRpY3VsYXIgbWVkaWEgaXRlbS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI0FDVElPTl9FTlFVRVVFCi0gICAgICogQHNlZSAjQUNUSU9OX1NFRUsKLSAgICAgKiBAc2VlICNBQ1RJT05fR0VUX1NUQVRVUwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0lURU1fSUQgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLklURU1fSUQiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBpdGVtIHN0YXR1cy4KLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5lZCBhcyBhIHJlc3VsdCBmcm9tIG1lZGlhIGl0ZW0gYWN0aW9ucyBzdWNoIGFzIHtAbGluayAjQUNUSU9OX1BMQVl9LAotICAgICAqIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9LCB7QGxpbmsgI0FDVElPTl9TRUVLfSwgYW5kIHtAbGluayAjQUNUSU9OX0dFVF9TVEFUVVN9Ci0gICAgICogdG8gZGVzY3JpYmUgdGhlIHN0YXR1cyBvZiB0aGUgc3BlY2lmaWVkIG1lZGlhIGl0ZW0uCi0gICAgICogPC9wPjxwPgotICAgICAqIEluY2x1ZGVkIGluIGJyb2FkY2FzdCBpbnRlbnRzIHNlbnQgdG8KLSAgICAgKiB7QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUiBpdGVtIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzfSB0byBwcm92aWRlCi0gICAgICogdXBkYXRlZCBzdGF0dXMgaW5mb3JtYXRpb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBhbmRyb2lkLm9zLkJ1bmRsZX0gb2YgZGF0YSB0aGF0IGNhbiBiZSBjb252ZXJ0ZWQgaW50bwotICAgICAqIGEge0BsaW5rIE1lZGlhSXRlbVN0YXR1c30gb2JqZWN0IHVzaW5nCi0gICAgICoge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyNmcm9tQnVuZGxlIE1lZGlhSXRlbVN0YXR1cy5mcm9tQnVuZGxlfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI0FDVElPTl9FTlFVRVVFCi0gICAgICogQHNlZSAjQUNUSU9OX1NFRUsKLSAgICAgKiBAc2VlICNBQ1RJT05fR0VUX1NUQVRVUwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0lURU1fU1RBVFVTID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5JVEVNX1NUQVRVUyI7Ci0KLSAgICAvKioKLSAgICAgKiBMb25nIGV4dHJhOiBNZWRpYSBpdGVtIGNvbnRlbnQgcG9zaXRpb24uCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1BMQVl9IG9yIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IHRvIHNwZWNpZnkgdGhlCi0gICAgICogc3RhcnRpbmcgcGxheWJhY2sgcG9zaXRpb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI0FDVElPTl9TRUVLfSB0byBzZXQgYSBuZXcgcGxheWJhY2sgcG9zaXRpb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIGxvbmcgaW50ZWdlciBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgY29udGVudC4KLSAgICAgKiA8cD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX0VOUVVFVUUKLSAgICAgKiBAc2VlICNBQ1RJT05fU0VFSwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0lURU1fQ09OVEVOVF9QT1NJVElPTiA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuSVRFTV9QT1NJVElPTiI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIGl0ZW0gbWV0YWRhdGEuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1BMQVl9IG9yIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IHRvIHNwZWNpZnkgbWV0YWRhdGEKLSAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhlIGNvbnRlbnQgb2YgYSBtZWRpYSBpdGVtLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgYW5kcm9pZC5vcy5CdW5kbGV9IG9mIG1ldGFkYXRhIGtleS12YWx1ZSBwYWlycyBhcyBkZWZpbmVkCi0gICAgICogaW4ge0BsaW5rIE1lZGlhSXRlbU1ldGFkYXRhfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI0FDVElPTl9FTlFVRVVFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9NRVRBREFUQSA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuSVRFTV9NRVRBREFUQSI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IEhUVFAgcmVxdWVzdCBoZWFkZXJzLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI0FDVElPTl9QTEFZfSBvciB7QGxpbmsgI0FDVElPTl9FTlFVRVVFfSB0byBzcGVjaWZ5IEhUVFAgcmVxdWVzdAotICAgICAqIGhlYWRlcnMgdG8gYmUgaW5jbHVkZWQgd2hlbiBmZXRjaGluZyB0byB0aGUgY29udGVudCBpbmRpY2F0ZWQgYnkgdGhlIG1lZGlhCi0gICAgICogaXRlbSdzIGRhdGEgVXJpLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGV4dHJhIG1heSBiZSB1c2VkIHRvIHByb3ZpZGUgYXV0aGVudGljYXRpb24gdG9rZW5zIGFuZCBvdGhlcgotICAgICAqIHBhcmFtZXRlcnMgdG8gdGhlIHNlcnZlciBzZXBhcmF0ZWx5IGZyb20gdGhlIG1lZGlhIGl0ZW0ncyBkYXRhIFVyaS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfSBvZiBzdHJpbmcgYmFzZWQga2V5LXZhbHVlIHBhaXJzCi0gICAgICogdGhhdCBkZXNjcmliZSB0aGUgSFRUUCByZXF1ZXN0IGhlYWRlcnMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNlZSAjQUNUSU9OX1BMQVkKLSAgICAgKiBAc2VlICNBQ1RJT05fRU5RVUVVRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0lURU1fSFRUUF9IRUFERVJTID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5IVFRQX0hFQURFUlMiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBpdGVtIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXIuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1BMQVl9IG9yIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IHRvIHNwZWNpZnkKLSAgICAgKiBhIHtAbGluayBQZW5kaW5nSW50ZW50fSBmb3IgYQotICAgICAqIGJyb2FkY2FzdCByZWNlaXZlciB0aGF0IHdpbGwgcmVjZWl2ZSBzdGF0dXMgdXBkYXRlcyBhYm91dCBhIHBhcnRpY3VsYXIKLSAgICAgKiBtZWRpYSBpdGVtLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBXaGVuZXZlciB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBpdGVtIGNoYW5nZXMsIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciB3aWxsCi0gICAgICogc2VuZCBhIGJyb2FkY2FzdCB0byB0aGUgcGVuZGluZyBpbnRlbnQgd2l0aCBleHRyYXMgdGhhdCBpZGVudGlmeSB0aGUgc2Vzc2lvbgotICAgICAqIHRvIHdoaWNoIHRoZSBpdGVtIGJlbG9uZ3MsIHRoZSBzZXNzaW9uIHN0YXR1cywgdGhlIGl0ZW0ncyBpZAotICAgICAqIGFuZCB0aGUgaXRlbSdzIHVwZGF0ZWQgc3RhdHVzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgc2FtZSBwZW5kaW5nIGludGVudCBhbmQgYnJvYWRjYXN0IHJlY2VpdmVyIG1heSBiZSBzaGFyZWQgYnkgYW55IG51bWJlciBvZgotICAgICAqIG1lZGlhIGl0ZW1zIHNpbmNlIHRoZSBicm9hZGNhc3QgaW50ZW50IGluY2x1ZGVzIHRoZSBtZWRpYSBzZXNzaW9uIGlkCi0gICAgICogYW5kIG1lZGlhIGl0ZW0gaWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBQZW5kaW5nSW50ZW50fS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+QnJvYWRjYXN0IGV4dHJhczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZgotICAgICAqIHRoZSBzZXNzaW9uIHRvIHdoaWNoIHRoZSBpdGVtIGluIHF1ZXN0aW9uIGJlbG9uZ3MuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5Ci0gICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBtZWRpYSBpdGVtIGlkIG9mIHRoZQotICAgICAqIG1lZGlhIGl0ZW0gaW4gcXVlc3Rpb24uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9TVEFUVVN9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZQotICAgICAqIGl0ZW0gYXMgYSBidW5kbGUgdGhhdCBjYW4gYmUgZGVjb2RlZCBpbnRvIGEge0BsaW5rIE1lZGlhSXRlbVN0YXR1c30gb2JqZWN0LgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI0FDVElPTl9FTlFVRVVFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZXNzYWdlLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI0FDVElPTl9TRU5EX01FU1NBR0V9LCBhbmQgaW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bwotICAgICAqIHtAbGluayAjRVhUUkFfTUVTU0FHRV9SRUNFSVZFUiBtZXNzYWdlIHJlY2VpdmVyc30gdG8gZGVzY3JpYmUgYSBtZXNzYWdlIGJldHdlZW4gYQotICAgICAqIHNlc3Npb24gYW5kIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBhbmRyb2lkLm9zLkJ1bmRsZX0uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX01FU1NBR0UgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuTUVTU0FHRSI7Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlZ2VyIGV4dHJhOiBFcnJvciBjb2RlLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCBhbGwgbWVkaWEgY29udHJvbCByZXF1ZXN0cyB0byBkZXNjcmliZSB0aGUgY2F1c2Ugb2YgYW4gZXJyb3IuCi0gICAgICogVGhpcyBleHRyYSBtYXkgYmUgb21pdHRlZCB3aGVuIHRoZSBlcnJvciBpcyB1bmtub3duLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgb25lIG9mOiB7QGxpbmsgI0VSUk9SX1VOS05PV059LCB7QGxpbmsgI0VSUk9SX1VOU1VQUE9SVEVEX09QRVJBVElPTn0sCi0gICAgICoge0BsaW5rICNFUlJPUl9JTlZBTElEX1NFU1NJT05fSUR9LCB7QGxpbmsgI0VSUk9SX0lOVkFMSURfSVRFTV9JRH0uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0VSUk9SX0NPREUgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuRVJST1JfQ09ERSI7Ci0KLSAgICAvKioKLSAgICAgKiBFcnJvciBjb2RlOiBBbiB1bmtub3duIGVycm9yIG9jY3VycmVkLgotICAgICAqCi0gICAgICogQHNlZSAjRVhUUkFfRVJST1JfQ09ERQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX1VOS05PV04gPSAwOwotCi0gICAgLyoqCi0gICAgICogRXJyb3IgY29kZTogVGhlIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkLgotICAgICAqCi0gICAgICogQHNlZSAjRVhUUkFfRVJST1JfQ09ERQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX1VOU1VQUE9SVEVEX09QRVJBVElPTiA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBFcnJvciBjb2RlOiBUaGUgc2Vzc2lvbiBpZCBzcGVjaWZpZWQgaW4gdGhlIHJlcXVlc3Qgd2FzIGludmFsaWQuCi0gICAgICoKLSAgICAgKiBAc2VlICNFWFRSQV9FUlJPUl9DT0RFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfSU5WQUxJRF9TRVNTSU9OX0lEID0gMjsKLQotICAgIC8qKgotICAgICAqIEVycm9yIGNvZGU6IFRoZSBpdGVtIGlkIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCB3YXMgaW52YWxpZC4KLSAgICAgKgotICAgICAqIEBzZWUgI0VYVFJBX0VSUk9SX0NPREUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9JTlZBTElEX0lURU1fSUQgPSAzOwotCi0gICAgcHJpdmF0ZSBNZWRpYUNvbnRyb2xJbnRlbnQoKSB7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhSXRlbU1ldGFkYXRhLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFJdGVtTWV0YWRhdGEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUyZGRiNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFJdGVtTWV0YWRhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLQotLyoqCi0gKiBDb25zdGFudHMgZm9yIHNwZWNpZnlpbmcgbWV0YWRhdGEgYWJvdXQgYSBtZWRpYSBpdGVtIGFzIGEge0BsaW5rIEJ1bmRsZX0uCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgcGFydCBvZiB0aGUgcmVtb3RlIHBsYXliYWNrIHByb3RvY29sIGRlc2NyaWJlZCBieSB0aGUKLSAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgTWVkaWFDb250cm9sSW50ZW50fSBjbGFzcy4KLSAqIDwvcD48cD4KLSAqIE1lZGlhIGl0ZW0gbWV0YWRhdGEgaXMgZGVzY3JpYmVkIGFzIGEgYnVuZGxlIG9mIGtleS92YWx1ZSBwYWlycyBhcyBkZWZpbmVkCi0gKiBpbiB0aGlzIGNsYXNzLiAgVGhlIGRvY3VtZW50YXRpb24gc3BlY2lmaWVzIHRoZSB0eXBlIG9mIHZhbHVlIGFzc29jaWF0ZWQKLSAqIHdpdGggZWFjaCBrZXkuCi0gKiA8L3A+PHA+Ci0gKiBBbiBhcHBsaWNhdGlvbiBtYXkgc3BlY2lmeSBhZGRpdGlvbmFsIGN1c3RvbSBtZXRhZGF0YSBrZXlzIGJ1dCB0aGVyZSBpcyBubyBndWFyYW50ZWUKLSAqIHRoYXQgdGhleSB3aWxsIGJlIHJlY29nbml6ZWQgYnkgdGhlIGRlc3RpbmF0aW9uLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFJdGVtTWV0YWRhdGEgewotICAgIC8qCi0gICAgICogTm90ZTogTWVkaWFNZXRhZGF0YVJldHJpZXZlciBhbHNvIGRlZmluZXMgYSBjb2xsZWN0aW9uIG9mIG1ldGFkYXRhIGtleXMgdGhhdCBjYW4gYmUKLSAgICAgKiByZXRyaWV2ZWQgZnJvbSBhIGNvbnRlbnQgc3RyZWFtIGFsdGhvdWdoIHRoZSByZXByZXNlbnRhdGlvbiBpcyBzb21ld2hhdCBkaWZmZXJlbnQgaGVyZQotICAgICAqIHNpbmNlIHdlIGFyZSBzZW5kaW5nIHRoZSBkYXRhIHRvIGEgcmVtb3RlIGVuZHBvaW50LgotICAgICAqLwotCi0gICAgcHJpdmF0ZSBNZWRpYUl0ZW1NZXRhZGF0YSgpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcga2V5OiBBbGJ1bSBhcnRpc3QgbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBzdHJpbmcgc3VpdGFibGUgZm9yIGRpc3BsYXkuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BTEJVTV9BUlRJU1QgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BTEJVTV9BUlRJU1QiOwotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGtleTogQWxidW0gdGl0bGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBkaXNwbGF5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQUxCVU1fVElUTEUgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BTEJVTV9USVRMRSI7Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcga2V5OiBBcnR3b3JrIFVyaS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBzdHJpbmcgVVJJIGZvciBhbiBpbWFnZSBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVkaWEgaXRlbSwKLSAgICAgKiBzdWNoIGFzIGFsYnVtIG9yIGNvdmVyIGFydC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FSVFdPUktfVVJJID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQVJUV09SS19VUkkiOwotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGtleTogQXJ0aXN0IG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBkaXNwbGF5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQVJUSVNUID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQVJUSVNUIjsKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBrZXk6IEF1dGhvciBuYW1lLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHN0cmluZyBzdWl0YWJsZSBmb3IgZGlzcGxheS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FVVEhPUiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkFVVEhPUiI7Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcga2V5OiBDb21wb3NlciBuYW1lLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHN0cmluZyBzdWl0YWJsZSBmb3IgZGlzcGxheS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTVBPU0VSID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQ09NUE9TRVIiOwotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGtleTogVHJhY2sgdGl0bGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBkaXNwbGF5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVElUTEUgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5USVRMRSI7Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlZ2VyIGtleTogWWVhciBvZiBwdWJsaWNhdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYW4gaW50ZWdlciB5ZWFyIG51bWJlci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1lFQVIgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5ZRUFSIjsKLQotICAgIC8qKgotICAgICAqIEludGVnZXIga2V5OiBUcmFjayBudW1iZXIgKHN1Y2ggYXMgYSB0cmFjayBvbiBhIENEKS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBvbmUtYmFzZWQgaW50ZWdlciB0cmFjayBudW1iZXIuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9UUkFDS19OVU1CRVIgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5UUkFDS19OVU1CRVIiOwotCi0gICAgLyoqCi0gICAgICogSW50ZWdlciBrZXk6IERpc2MgbnVtYmVyIHdpdGhpbiBhIGNvbGxlY3Rpb24uCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgb25lLWJhc2VkIGludGVnZXIgZGlzYyBudW1iZXIuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ESVNDX05VTUJFUiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkRJU0NfTlVNQkVSIjsKLQotICAgIC8qKgotICAgICAqIExvbmcga2V5OiBJdGVtIHBsYXliYWNrIGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSA8Y29kZT5sb25nPC9jb2RlPiBudW1iZXIgb2YgbWlsbGlzZWNvbmRzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgZHVyYXRpb24gbWV0YWRhdGEgaXMgb25seSBhIGhpbnQgdG8gZW5hYmxlIGEgcmVtb3RlIG1lZGlhIHBsYXllciB0bwotICAgICAqIGd1ZXNzIHRoZSBkdXJhdGlvbiBvZiB0aGUgY29udGVudCBiZWZvcmUgaXQgYWN0dWFsbHkgb3BlbnMgdGhlIG1lZGlhIHN0cmVhbS4KLSAgICAgKiBUaGUgcmVtb3RlIG1lZGlhIHBsYXllciBzaG91bGQgc3RpbGwgZGV0ZXJtaW5lIHRoZSBhY3R1YWwgY29udGVudCBkdXJhdGlvbiBmcm9tCi0gICAgICogdGhlIG1lZGlhIHN0cmVhbSBpdHNlbGYgaW5kZXBlbmRlbnQgb2YgdGhlIHZhbHVlIHRoYXQgbWF5IGJlIHNwZWNpZmllZCBieSB0aGlzIGtleS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RVUkFUSU9OID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuRFVSQVRJT04iOwotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhSXRlbVN0YXR1cy5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhSXRlbVN0YXR1cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGVhMmQ1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYUl0ZW1TdGF0dXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM5MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnV0aWwuVGltZVV0aWxzOwotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUgcGxheWJhY2sgc3RhdHVzIG9mIGEgbWVkaWEgaXRlbS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIHRoZSByZW1vdGUgcGxheWJhY2sgcHJvdG9jb2wgZGVzY3JpYmVkIGJ5IHRoZQotICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBNZWRpYUNvbnRyb2xJbnRlbnR9IGNsYXNzLgotICogPC9wPjxwPgotICogQXMgYSBtZWRpYSBpdGVtIGlzIHBsYXllZCwgaXQgdHJhbnNpdGlvbnMgdGhyb3VnaCBhIHNlcXVlbmNlIG9mIHN0YXRlcyBpbmNsdWRpbmc6Ci0gKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX1BFTkRJTkcgcGVuZGluZ30sIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfQlVGRkVSSU5HIGJ1ZmZlcmluZ30sCi0gKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX1BMQVlJTkcgcGxheWluZ30sIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUEFVU0VEIHBhdXNlZH0sCi0gKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0ZJTklTSEVEIGZpbmlzaGVkfSwge0BsaW5rICNQTEFZQkFDS19TVEFURV9DQU5DRUxFRCBjYW5jZWxlZH0sCi0gKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0lOVkFMSURBVEVEIGludmFsaWRhdGVkfSwgYW5kCi0gKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0VSUk9SIGVycm9yfS4gIFJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uIG9mIGVhY2ggc3RhdGUKLSAqIGZvciBhbiBleHBsYW5hdGlvbiBvZiBpdHMgbWVhbmluZy4KLSAqIDwvcD48cD4KLSAqIFdoaWxlIHRoZSBpdGVtIGlzIHBsYXlpbmcsIHRoZSBwbGF5YmFjayBzdGF0dXMgbWF5IGFsc28gaW5jbHVkZSBwcm9ncmVzcyBpbmZvcm1hdGlvbgotICogYWJvdXQgdGhlIHtAbGluayAjZ2V0Q29udGVudFBvc2l0aW9uIGNvbnRlbnQgcG9zaXRpb259IGFuZAotICoge0BsaW5rICNnZXRDb250ZW50RHVyYXRpb24gY29udGVudCBkdXJhdGlvbn0gYWx0aG91Z2ggbm90IGFsbCByb3V0ZSBkZXN0aW5hdGlvbnMKLSAqIHdpbGwgcmVwb3J0IGl0LgotICogPC9wPjxwPgotICogVG8gbW9uaXRvciBwbGF5YmFjayBzdGF0dXMsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgc3VwcGx5IGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9IHRvIHVzZSBhcyB0aGUKLSAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIGl0ZW0gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcn0KLSAqIGZvciBhIGdpdmVuIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheWJhY2sgcmVxdWVzdH0uICBOb3RlIHRoYXQKLSAqIHRoZSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyIHdpbGwgb25seSBiZSBpbnZva2VkIGZvciBtYWpvciBzdGF0dXMgY2hhbmdlcyBzdWNoIGFzIGEKLSAqIHRyYW5zaXRpb24gZnJvbSBwbGF5aW5nIHRvIGZpbmlzaGVkLgotICogPC9wPjxwIGNsYXNzPSJub3RlIj4KLSAqIFRoZSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyIHdpbGwgbm90IGJlIGludm9rZWQgZm9yIG1pbm9yIHByb2dyZXNzIHVwZGF0ZXMgc3VjaCBhcwotICogY2hhbmdlcyB0byBwbGF5YmFjayBwb3NpdGlvbiBvciBkdXJhdGlvbi4gIElmIHRoZSBhcHBsaWNhdGlvbiB3YW50cyB0byBtb25pdG9yCi0gKiBwbGF5YmFjayBwcm9ncmVzcywgdGhlbiBpdCBtdXN0IHVzZSB0aGUKLSAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TVEFUVVMgZ2V0IHN0YXR1cyByZXF1ZXN0fSB0byBwb2xsIGZvciBjaGFuZ2VzCi0gKiBwZXJpb2RpY2FsbHkgYW5kIGVzdGltYXRlIHRoZSBwbGF5YmFjayBwb3NpdGlvbiB3aGlsZSBwbGF5aW5nLiAgTm90ZSB0aGF0IHRoZXJlIG1heQotICogYmUgYSBzaWduaWZpY2FudCBwb3dlciBpbXBhY3QgdG8gcG9sbGluZyBzbyB0aGUgYXBwbGljYXRpb24gaXMgYWR2aXNlZCBvbmx5Ci0gKiB0byBwb2xsIHdoZW4gdGhlIHNjcmVlbiBpcyBvbiBhbmQgbmV2ZXIgbW9yZSB0aGFuIGFib3V0IG9uY2UgZXZlcnkgNSBzZWNvbmRzIG9yIHNvLgotICogPC9wPjxwPgotICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZCB1c2luZyBhIHtAbGluayBCdWlsZGVyfSBpbnN0YW5jZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhSXRlbVN0YXR1cyB7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVElNRVNUQU1QID0gInRpbWVzdGFtcCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUExBWUJBQ0tfU1RBVEUgPSAicGxheWJhY2tTdGF0ZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OVEVOVF9QT1NJVElPTiA9ICJjb250ZW50UG9zaXRpb24iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTlRFTlRfRFVSQVRJT04gPSAiY29udGVudER1cmF0aW9uIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FWFRSQVMgPSAiZXh0cmFzIjsKLQotICAgIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotCi0gICAgLyoqCi0gICAgICogUGxheWJhY2sgc3RhdGU6IFBlbmRpbmcuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIGl0ZW0gaGFzIG5vdCB5ZXQgc3RhcnRlZCBwbGF5YmFjayBidXQgd2lsbCBiZSBwbGF5ZWQgZXZlbnR1YWxseS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfUEVORElORyA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogUGxheWluZy4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgaXRlbSBpcyBjdXJyZW50bHkgcGxheWluZy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfUExBWUlORyA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogUGF1c2VkLgotICAgICAqIDxwPgotICAgICAqIEluZGljYXRlcyB0aGF0IHBsYXliYWNrIG9mIHRoZSBtZWRpYSBpdGVtIGhhcyBiZWVuIHBhdXNlZC4gIFBsYXliYWNrIGNhbiBiZQotICAgICAqIHJlc3VtZWQgdXNpbmcgdGhlIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFU1VNRSByZXN1bWV9IGFjdGlvbi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfUEFVU0VEID0gMjsKLQotICAgIC8qKgotICAgICAqIFBsYXliYWNrIHN0YXRlOiBCdWZmZXJpbmcgb3Igc2Vla2luZyB0byBhIG5ldyBwb3NpdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgaXRlbSBoYXMgYmVlbiB0ZW1wb3JhcmlseSBpbnRlcnJ1cHRlZAotICAgICAqIHRvIGZldGNoIG1vcmUgY29udGVudC4gIFBsYXliYWNrIHdpbGwgY29udGludWUgYXV0b21hdGljYWxseQotICAgICAqIHdoZW4gZW5vdWdoIGNvbnRlbnQgaGFzIGJlZW4gYnVmZmVyZWQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1NUQVRFX0JVRkZFUklORyA9IDM7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogRmluaXNoZWQuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIGl0ZW0gcGxheWVkIHRvIHRoZSBlbmQgb2YgdGhlIGNvbnRlbnQgYW5kIGZpbmlzaGVkIG5vcm1hbGx5LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBIGZpbmlzaGVkIG1lZGlhIGl0ZW0gY2Fubm90IGJlIHJlc3VtZWQuICBUbyBwbGF5IHRoZSBjb250ZW50IGFnYWluLCB0aGUgYXBwbGljYXRpb24KLSAgICAgKiBtdXN0IHNlbmQgYSBuZXcge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5fSBvcgotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0gYWN0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9GSU5JU0hFRCA9IDQ7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogQ2FuY2VsZWQuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIGl0ZW0gd2FzIGV4cGxpY2l0bHkgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZSBieSB0aGUKLSAgICAgKiBhcHBsaWNhdGlvbi4gIEl0ZW1zIG1heSBiZSBjYW5jZWxlZCBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBxdWV1ZSB1c2luZwotICAgICAqIHRoZSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRU1PVkUgcmVtb3ZlfSBvcgotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUT1Agc3RvcH0gYWN0aW9uIG9yIGJ5IGlzc3VpbmcKLSAgICAgKiBhbm90aGVyIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheX0gYWN0aW9uIHRoYXQgaGFzIHRoZQotICAgICAqIHNpZGUtZWZmZWN0IG9mIGNsZWFyaW5nIHRoZSBxdWV1ZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogQSBjYW5jZWxlZCBtZWRpYSBpdGVtIGNhbm5vdCBiZSByZXN1bWVkLiAgVG8gcGxheSB0aGUgY29udGVudCBhZ2FpbiwgdGhlCi0gICAgICogYXBwbGljYXRpb24gbXVzdCBzZW5kIGEgbmV3IHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheX0gb3IKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFIGVucXVldWV9IGFjdGlvbi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfQ0FOQ0VMRUQgPSA1OwotCi0gICAgLyoqCi0gICAgICogUGxheWJhY2sgc3RhdGU6IEludmFsaWRhdGVkLgotICAgICAqIDxwPgotICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBpdGVtIHdhcyBpbnZhbGlkYXRlZCBwZXJtYW5lbnRseSBhbmQgaW52b2x1bnRhcmlseS4KLSAgICAgKiBUaGlzIHN0YXRlIGlzIHVzZWQgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbWVkaWEgaXRlbSB3YXMgaW52YWxpZGF0ZWQgYW5kIHJlbW92ZWQKLSAgICAgKiBmcm9tIHRoZSBxdWV1ZSBiZWNhdXNlIHRoZSBzZXNzaW9uIHRvIHdoaWNoIGl0IGJlbG9uZ3Mgd2FzIGludmFsaWRhdGVkCi0gICAgICogKHR5cGljYWxseSBieSBhbm90aGVyIGFwcGxpY2F0aW9uIHRha2luZyBjb250cm9sIG9mIHRoZSByb3V0ZSkuCi0gICAgICogPC9wPjxwPgotICAgICAqIFdoZW4gaW52YWxpZGF0aW9uIG9jY3VycywgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBnZW5lcmFsbHkgd2FpdCBmb3IgdGhlIHVzZXIKLSAgICAgKiB0byBwZXJmb3JtIGFuIGV4cGxpY2l0IGFjdGlvbiwgc3VjaCBhcyBjbGlja2luZyBvbiBhIHBsYXkgYnV0dG9uIGluIHRoZSBVSSwKLSAgICAgKiBiZWZvcmUgY3JlYXRpbmcgYSBuZXcgbWVkaWEgc2Vzc2lvbiB0byBhdm9pZCB1bm5lY2Vzc2FyaWx5IGludGVycnVwdGluZwotICAgICAqIGFub3RoZXIgYXBwbGljYXRpb24gdGhhdCBtYXkgaGF2ZSBqdXN0IHN0YXJ0ZWQgdXNpbmcgdGhlIHJvdXRlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBbiBpbnZhbGlkYXRlZCBtZWRpYSBpdGVtIGNhbm5vdCBiZSByZXN1bWVkLiAgVG8gcGxheSB0aGUgY29udGVudCBhZ2FpbiwgdGhlIGFwcGxpY2F0aW9uCi0gICAgICogbXVzdCBzZW5kIGEgbmV3IHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheX0gb3IKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFIGVucXVldWV9IGFjdGlvbi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUQgPSA2OwotCi0gICAgLyoqCi0gICAgICogUGxheWJhY2sgc3RhdGU6IFBsYXliYWNrIGhhbHRlZCBvciBhYm9ydGVkIGR1ZSB0byBhbiBlcnJvci4KLSAgICAgKiA8cD4KLSAgICAgKiBFeGFtcGxlcyBvZiBlcnJvcnMgYXJlIG5vIG5ldHdvcmsgY29ubmVjdGl2aXR5IHdoZW4gYXR0ZW1wdGluZyB0byByZXRyaWV2ZSBjb250ZW50Ci0gICAgICogZnJvbSBhIHNlcnZlciwgb3IgZXhwaXJlZCB1c2VyIGNyZWRlbnRpYWxzIHdoZW4gdHJ5aW5nIHRvIHBsYXkgc3Vic2NyaXB0aW9uLWJhc2VkCi0gICAgICogY29udGVudC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogQSBtZWRpYSBpdGVtIGluIHRoZSBlcnJvciBzdGF0ZSBjYW5ub3QgYmUgcmVzdW1lZC4gIFRvIHBsYXkgdGhlIGNvbnRlbnQgYWdhaW4sCi0gICAgICogdGhlIGFwcGxpY2F0aW9uIG11c3Qgc2VuZCBhIG5ldyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZIHBsYXl9IG9yCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfSBhY3Rpb24uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1NUQVRFX0VSUk9SID0gNzsKLQotICAgIC8qKgotICAgICAqIEludGVnZXIgZXh0cmE6IEhUVFAgc3RhdHVzIGNvZGUuCi0gICAgICogPHA+Ci0gICAgICogU3BlY2lmaWVzIHRoZSBIVFRQIHN0YXR1cyBjb2RlIHRoYXQgd2FzIGVuY291bnRlcmVkIHdoZW4gdGhlIGNvbnRlbnQKLSAgICAgKiB3YXMgcmVxdWVzdGVkIGFmdGVyIGFsbCByZWRpcmVjdHMgd2VyZSBmb2xsb3dlZC4gIFRoaXMga2V5IG9ubHkgbmVlZHMgdG8KLSAgICAgKiBzcGVjaWZpZWQgd2hlbiB0aGUgY29udGVudCB1cmkgdXNlcyB0aGUgSFRUUCBvciBIVFRQUyBzY2hlbWUgYW5kIGFuIGVycm9yCi0gICAgICogb2NjdXJyZWQuICBUaGlzIGtleSBtYXkgYmUgb21pdHRlZCBpZiB0aGUgY29udGVudCB3YXMgYWJsZSB0byBiZSBwbGF5ZWQKLSAgICAgKiBzdWNjZXNzZnVsbHk7IHRoZXJlIGlzIG5vIG5lZWQgdG8gcmVwb3J0IGEgMjAwIChPSykgc3RhdHVzIGNvZGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyIEhUVFAgc3RhdHVzIGNvZGUsIHN1Y2ggYXMgNDAxIChVbmF1dGhvcml6ZWQpLAotICAgICAqIDQwNCAoTm90IEZvdW5kKSwgb3IgNTAwIChTZXJ2ZXIgRXJyb3IpLCBvciAwIGlmIG5vbmUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0hUVFBfU1RBVFVTX0NPREUgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuc3RhdHVzLmV4dHJhLkhUVFBfU1RBVFVTX0NPREUiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBIVFRQIHJlc3BvbnNlIGhlYWRlcnMuCi0gICAgICogPHA+Ci0gICAgICogU3BlY2lmaWVzIHRoZSBIVFRQIHJlc3BvbnNlIGhlYWRlcnMgdGhhdCB3ZXJlIHJldHVybmVkIHdoZW4gdGhlIGNvbnRlbnQgd2FzCi0gICAgICogcmVxdWVzdGVkIGZyb20gdGhlIG5ldHdvcmsuICBUaGUgaGVhZGVycyBtYXkgaW5jbHVkZSBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgICogYWJvdXQgdGhlIGNvbnRlbnQgb3IgYW55IGVycm9ycyBjb25kaXRpb25zIHRoYXQgd2VyZSBlbmNvdW50ZXJlZCB3aGlsZQotICAgICAqIHRyeWluZyB0byBmZXRjaCB0aGUgY29udGVudC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfSBvZiBzdHJpbmcgYmFzZWQga2V5LXZhbHVlIHBhaXJzCi0gICAgICogdGhhdCBkZXNjcmliZSB0aGUgSFRUUCByZXNwb25zZSBoZWFkZXJzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9IVFRQX1JFU1BPTlNFX0hFQURFUlMgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuc3RhdHVzLmV4dHJhLkhUVFBfUkVTUE9OU0VfSEVBREVSUyI7Ci0KLSAgICBNZWRpYUl0ZW1TdGF0dXMoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICBtQnVuZGxlID0gYnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRpbWVzdGFtcCBhc3NvY2lhdGVkIHdpdGggdGhlIHN0YXR1cyBpbmZvcm1hdGlvbiBpbgotICAgICAqIG1pbGxpc2Vjb25kcyBzaW5jZSBib290IGluIHRoZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lfSB0aW1lIGJhc2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzdGF0dXMgdGltZXN0YW1wIGluIHRoZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lKCl9IHRpbWUgYmFzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRUaW1lc3RhbXAoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldExvbmcoS0VZX1RJTUVTVEFNUCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcGxheWJhY2sgc3RhdGUgb2YgdGhlIG1lZGlhIGl0ZW0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBwbGF5YmFjayBzdGF0ZS4gIE9uZSBvZiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX1BFTkRJTkd9LAotICAgICAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUExBWUlOR30sIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUEFVU0VEfSwKLSAgICAgKiB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0JVRkZFUklOR30sIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfRklOSVNIRUR9LAotICAgICAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfQ0FOQ0VMRUR9LCB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0lOVkFMSURBVEVEfSwKLSAgICAgKiBvciB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0VSUk9SfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFBsYXliYWNrU3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfUExBWUJBQ0tfU1RBVEUsIFBMQVlCQUNLX1NUQVRFX0VSUk9SKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjb250ZW50IHBsYXliYWNrIHBvc2l0aW9uIGFzIGEgbG9uZyBpbnRlZ2VyIG51bWJlciBvZiBtaWxsaXNlY29uZHMKLSAgICAgKiBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbnRlbnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50IHBsYXliYWNrIHBvc2l0aW9uIGluIG1pbGxpc2Vjb25kcywgb3IgLTEgaWYgdW5rbm93bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRDb250ZW50UG9zaXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldExvbmcoS0VZX0NPTlRFTlRfUE9TSVRJT04sIC0xKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0b3RhbCBkdXJhdGlvbiBvZiB0aGUgY29udGVudCB0byBiZSBwbGF5ZWQgYXMgYSBsb25nIGludGVnZXIgbnVtYmVyIG9mCi0gICAgICogbWlsbGlzZWNvbmRzLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udGVudCBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMsIG9yIC0xIGlmIHVua25vd24uCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgZ2V0Q29udGVudER1cmF0aW9uKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRMb25nKEtFWV9DT05URU5UX0RVUkFUSU9OLCAtMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGJ1bmRsZSBvZiBleHRyYXMgZm9yIHRoaXMgc3RhdHVzIG9iamVjdC4KLSAgICAgKiBUaGUgZXh0cmFzIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgbWVkaWEgcm91dGVyIGJ1dCB0aGV5IG1heSBiZSB1c2VkCi0gICAgICogYnkgYXBwbGljYXRpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRCdW5kbGUoS0VZX0VYVFJBUyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJNZWRpYUl0ZW1TdGF0dXN7ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJ0aW1lc3RhbXA9Iik7Ci0gICAgICAgIFRpbWVVdGlscy5mb3JtYXREdXJhdGlvbihTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSAtIGdldFRpbWVzdGFtcCgpLCByZXN1bHQpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgbXMgYWdvIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgcGxheWJhY2tTdGF0ZT0iKS5hcHBlbmQocGxheWJhY2tTdGF0ZVRvU3RyaW5nKGdldFBsYXliYWNrU3RhdGUoKSkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGNvbnRlbnRQb3NpdGlvbj0iKS5hcHBlbmQoZ2V0Q29udGVudFBvc2l0aW9uKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGNvbnRlbnREdXJhdGlvbj0iKS5hcHBlbmQoZ2V0Q29udGVudER1cmF0aW9uKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGV4dHJhcz0iKS5hcHBlbmQoZ2V0RXh0cmFzKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgfSIpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHBsYXliYWNrU3RhdGVUb1N0cmluZyhpbnQgcGxheWJhY2tTdGF0ZSkgewotICAgICAgICBzd2l0Y2ggKHBsYXliYWNrU3RhdGUpIHsKLSAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfU1RBVEVfUEVORElORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gInBlbmRpbmciOwotICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19TVEFURV9CVUZGRVJJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJidWZmZXJpbmciOwotICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19TVEFURV9QTEFZSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiAicGxheWluZyI7Ci0gICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX1BBVVNFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gInBhdXNlZCI7Ci0gICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX0ZJTklTSEVEOgotICAgICAgICAgICAgICAgIHJldHVybiAiZmluaXNoZWQiOwotICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19TVEFURV9DQU5DRUxFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImNhbmNlbGVkIjsKLSAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkYXRlZCI7Ci0gICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX0VSUk9SOgotICAgICAgICAgICAgICAgIHJldHVybiAiZXJyb3IiOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKHBsYXliYWNrU3RhdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgYnVuZGxlIGZvciBzZXJpYWxpemF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCByZXByZXNlbnRlZCBhcyBhIGJ1bmRsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIGFzQnVuZGxlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBidW5kbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIGJ1bmRsZSB3YXMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhSXRlbVN0YXR1cyBmcm9tQnVuZGxlKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZSAhPSBudWxsID8gbmV3IE1lZGlhSXRlbVN0YXR1cyhidW5kbGUpIDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzIG1lZGlhIGl0ZW0gc3RhdHVzIG9iamVjdHN9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSBpdGVtIHN0YXR1cyBidWlsZGVyIHVzaW5nIHRoZSBjdXJyZW50IHRpbWUgYXMgdGhlCi0gICAgICAgICAqIHJlZmVyZW5jZSB0aW1lc3RhbXAuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBwbGF5YmFja1N0YXRlIFRoZSBpdGVtIHBsYXliYWNrIHN0YXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoaW50IHBsYXliYWNrU3RhdGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBzZXRUaW1lc3RhbXAoU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkpOwotICAgICAgICAgICAgc2V0UGxheWJhY2tTdGF0ZShwbGF5YmFja1N0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgbWVkaWEgaXRlbSBzdGF0dXMgYnVpbGRlciB3aG9zZSBpbml0aWFsIGNvbnRlbnRzIGFyZQotICAgICAgICAgKiBjb3BpZWQgZnJvbSBhbiBleGlzdGluZyBzdGF0dXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlcihNZWRpYUl0ZW1TdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzdGF0dXMgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZShzdGF0dXMubUJ1bmRsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgdGltZXN0YW1wIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RhdHVzIGluZm9ybWF0aW9uIGluCi0gICAgICAgICAqIG1pbGxpc2Vjb25kcyBzaW5jZSBib290IGluIHRoZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lfSB0aW1lIGJhc2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRUaW1lc3RhbXAobG9uZyBlbGFwc2VkUmVhbHRpbWVUaW1lc3RhbXApIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0TG9uZyhLRVlfVElNRVNUQU1QLCBlbGFwc2VkUmVhbHRpbWVUaW1lc3RhbXApOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcGxheWJhY2sgc3RhdGUgb2YgdGhlIG1lZGlhIGl0ZW0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRQbGF5YmFja1N0YXRlKGludCBwbGF5YmFja1N0YXRlKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfUExBWUJBQ0tfU1RBVEUsIHBsYXliYWNrU3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgY29udGVudCBwbGF5YmFjayBwb3NpdGlvbiBhcyBhIGxvbmcgaW50ZWdlciBudW1iZXIgb2YgbWlsbGlzZWNvbmRzCi0gICAgICAgICAqIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgY29udGVudC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldENvbnRlbnRQb3NpdGlvbihsb25nIHBvc2l0aW9uTWlsbGlzZWNvbmRzKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dExvbmcoS0VZX0NPTlRFTlRfUE9TSVRJT04sIHBvc2l0aW9uTWlsbGlzZWNvbmRzKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSBjb250ZW50IHRvIGJlIHBsYXllZCBhcyBhIGxvbmcgaW50ZWdlciBudW1iZXIKLSAgICAgICAgICogb2YgbWlsbGlzZWNvbmRzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Q29udGVudER1cmF0aW9uKGxvbmcgZHVyYXRpb25NaWxsaXNlY29uZHMpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0TG9uZyhLRVlfQ09OVEVOVF9EVVJBVElPTiwgZHVyYXRpb25NaWxsaXNlY29uZHMpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyBhIGJ1bmRsZSBvZiBleHRyYXMgZm9yIHRoaXMgc3RhdHVzIG9iamVjdC4KLSAgICAgICAgICogVGhlIGV4dHJhcyB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIG1lZGlhIHJvdXRlciBidXQgdGhleSBtYXkgYmUgdXNlZAotICAgICAgICAgKiBieSBhcHBsaWNhdGlvbnMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRFeHRyYXMoQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRCdW5kbGUoS0VZX0VYVFJBUywgZXh0cmFzKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEJ1aWxkcyB0aGUge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyBtZWRpYSBpdGVtIHN0YXR1cyBvYmplY3R9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE1lZGlhSXRlbVN0YXR1cyBidWlsZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFJdGVtU3RhdHVzKG1CdW5kbGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVEZXNjcmlwdG9yLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJjODRmYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50U2VuZGVyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBEZXNjcmliZXMgdGhlIHByb3BlcnRpZXMgb2YgYSByb3V0ZS4KLSAqIDxwPgotICogRWFjaCByb3V0ZSBpcyB1bmlxdWVseSBpZGVudGlmaWVkIGJ5IGFuIG9wYXF1ZSBpZCBzdHJpbmcuICBUaGlzIHRva2VuCi0gKiBtYXkgdGFrZSBhbnkgZm9ybSBhcyBsb25nIGFzIGl0IGlzIHVuaXF1ZSB3aXRoaW4gdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICogPC9wPjxwPgotICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZCB1c2luZyBhIHtAbGluayBCdWlsZGVyfSBpbnN0YW5jZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVEZXNjcmlwdG9yIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9JRCA9ICJpZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfR1JPVVBfTUVNQkVSX0lEUyA9ICJncm91cE1lbWJlcklkcyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTkFNRSA9ICJuYW1lIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERVNDUklQVElPTiA9ICJzdGF0dXMiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0lDT05fVVJJID0gImljb25VcmkiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VOQUJMRUQgPSAiZW5hYmxlZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OTkVDVElORyA9ICJjb25uZWN0aW5nIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05ORUNUSU9OX1NUQVRFID0gImNvbm5lY3Rpb25TdGF0ZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OVFJPTF9GSUxURVJTID0gImNvbnRyb2xGaWx0ZXJzIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QTEFZQkFDS19UWVBFID0gInBsYXliYWNrVHlwZSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUExBWUJBQ0tfU1RSRUFNID0gInBsYXliYWNrU3RyZWFtIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9ERVZJQ0VfVFlQRSA9ICJkZXZpY2VUeXBlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WT0xVTUUgPSAidm9sdW1lIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WT0xVTUVfTUFYID0gInZvbHVtZU1heCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVk9MVU1FX0hBTkRMSU5HID0gInZvbHVtZUhhbmRsaW5nIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QUkVTRU5UQVRJT05fRElTUExBWV9JRCA9ICJwcmVzZW50YXRpb25EaXNwbGF5SWQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VYVFJBUyA9ICJleHRyYXMiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NBTl9ESVNDT05ORUNUID0gImNhbkRpc2Nvbm5lY3QiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFVFRJTkdTX0lOVEVOVCA9ICJzZXR0aW5nc0ludGVudCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUlOX0NMSUVOVF9WRVJTSU9OID0gIm1pbkNsaWVudFZlcnNpb24iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX01BWF9DTElFTlRfVkVSU0lPTiA9ICJtYXhDbGllbnRWZXJzaW9uIjsKLQotICAgIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotICAgIExpc3Q8SW50ZW50RmlsdGVyPiBtQ29udHJvbEZpbHRlcnM7Ci0KLSAgICBNZWRpYVJvdXRlRGVzY3JpcHRvcihCdW5kbGUgYnVuZGxlLCBMaXN0PEludGVudEZpbHRlcj4gY29udHJvbEZpbHRlcnMpIHsKLSAgICAgICAgbUJ1bmRsZSA9IGJ1bmRsZTsKLSAgICAgICAgbUNvbnRyb2xGaWx0ZXJzID0gY29udHJvbEZpbHRlcnM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcm91dGUgaWQgYXNzb2NpYXRlZCB3aXRoIGEgcm91dGUgZGVzY3JpcHRvciBmdW5jdGlvbnMgYXMgYSBzdGFibGUKLSAgICAgKiBpZGVudGlmaWVyIGZvciB0aGUgcm91dGUgYW5kIG11c3QgYmUgdW5pcXVlIGFtb25nIGFsbCByb3V0ZXMgb2ZmZXJlZAotICAgICAqIGJ5IHRoZSBwcm92aWRlci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRJZCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0U3RyaW5nKEtFWV9JRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZ3JvdXAgbWVtYmVyIGlkcyBvZiB0aGUgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogQSByb3V0ZSBkZXNjcmlwdG9yIHRoYXQgaGFzIG9uZSBvciBtb3JlIGdyb3VwIG1lbWJlciByb3V0ZSBpZHMKLSAgICAgKiByZXByZXNlbnRzIGEgcm91dGUgZ3JvdXAuIEEgbWVtYmVyIHJvdXRlIG1heSBiZWxvbmcgdG8gYW5vdGhlciBncm91cC4KLSAgICAgKiA8L3A+Ci0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0R3JvdXBNZW1iZXJJZHMoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldFN0cmluZ0FycmF5TGlzdChLRVlfR1JPVVBfTUVNQkVSX0lEUyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdXNlci12aXNpYmxlIG5hbWUgb2YgdGhlIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoZSByb3V0ZSBuYW1lIGlkZW50aWZpZXMgdGhlIGRlc3RpbmF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSByb3V0ZS4KLSAgICAgKiBJdCBtYXkgYmUgYSB1c2VyLXN1cHBsaWVkIG5hbWUsIGFuIGFsaWFzLCBvciBkZXZpY2Ugc2VyaWFsIG51bWJlci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRTdHJpbmcoS0VZX05BTUUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHVzZXItdmlzaWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJvdXRlIGRlc2NyaXB0aW9uIGRlc2NyaWJlcyB0aGUga2luZCBvZiBkZXN0aW5hdGlvbiByZXByZXNlbnRlZCBieSB0aGUgcm91dGUuCi0gICAgICogSXQgbWF5IGJlIGEgdXNlci1zdXBwbGllZCBzdHJpbmcsIGEgbW9kZWwgbnVtYmVyIG9yIGJyYW5kIG9mIGRldmljZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0U3RyaW5nKEtFWV9ERVNDUklQVElPTik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgVVJJIG9mIHRoZSBpY29uIHJlcHJlc2VudGluZyB0aGlzIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaWNvbiB3aWxsIGJlIHVzZWQgaW4gcGlja2VyIFVJcyBpZiBhdmFpbGFibGUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBVcmkgZ2V0SWNvblVyaSgpIHsKLSAgICAgICAgU3RyaW5nIGljb25VcmkgPSBtQnVuZGxlLmdldFN0cmluZyhLRVlfSUNPTl9VUkkpOwotICAgICAgICByZXR1cm4gaWNvblVyaSA9PSBudWxsID8gbnVsbCA6IFVyaS5wYXJzZShpY29uVXJpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHdoZXRoZXIgdGhlIHJvdXRlIGlzIGVuYWJsZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRCb29sZWFuKEtFWV9FTkFCTEVELCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHdoZXRoZXIgdGhlIHJvdXRlIGlzIGNvbm5lY3RpbmcuCi0gICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjZ2V0Q29ubmVjdGlvblN0YXRlfSBpbnN0ZWFkCi0gICAgICovCi0gICAgQERlcHJlY2F0ZWQKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RpbmcoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJvb2xlYW4oS0VZX0NPTk5FQ1RJTkcsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjb25uZWN0aW9uIHN0YXRlIG9mIHRoZSByb3V0ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhpcyByb3V0ZToKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElOR30sIG9yCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRH0uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRDb25uZWN0aW9uU3RhdGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfQ09OTkVDVElPTl9TVEFURSwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgd2hldGhlciB0aGUgcm91dGUgY2FuIGJlIGRpc2Nvbm5lY3RlZCB3aXRob3V0IHN0b3BwaW5nIHBsYXliYWNrLgotICAgICAqIDxwPgotICAgICAqIFRoZSByb3V0ZSBjYW4gbm9ybWFsbHkgYmUgZGlzY29ubmVjdGVkIHdpdGhvdXQgc3RvcHBpbmcgcGxheWJhY2sgd2hlbgotICAgICAqIHRoZSBkZXN0aW5hdGlvbiBkZXZpY2Ugb24gdGhlIHJvdXRlIGlzIGNvbm5lY3RlZCB0byB0d28gb3IgbW9yZSBzb3VyY2UKLSAgICAgKiBkZXZpY2VzLiBUaGUgcm91dGUgcHJvdmlkZXIgc2hvdWxkIHVwZGF0ZSB0aGUgcm91dGUgaW1tZWRpYXRlbHkgd2hlbiB0aGUKLSAgICAgKiBudW1iZXIgb2YgY29ubmVjdGVkIGRldmljZXMgY2hhbmdlcy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVG8gc3BlY2lmeSB0aGF0IHRoZSByb3V0ZSBzaG91bGQgZGlzY29ubmVjdCB3aXRob3V0IHN0b3BwaW5nIHVzZQotICAgICAqIHtAbGluayBNZWRpYVJvdXRlciN1bnNlbGVjdChpbnQpfSB3aXRoCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9ESVNDT05ORUNURUR9LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5EaXNjb25uZWN0QW5kS2VlcFBsYXlpbmcoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJvb2xlYW4oS0VZX0NBTl9ESVNDT05ORUNULCBmYWxzZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiB7QGxpbmsgSW50ZW50U2VuZGVyfSBmb3Igc3RhcnRpbmcgYSBzZXR0aW5ncyBhY3Rpdml0eSBmb3IgdGhpcwotICAgICAqIHJvdXRlLiBUaGUgYWN0aXZpdHkgbWF5IGhhdmUgc3BlY2lmaWMgcm91dGUgc2V0dGluZ3Mgb3IgZ2VuZXJhbCBzZXR0aW5ncwotICAgICAqIGZvciB0aGUgY29ubmVjdGVkIGRldmljZSBvciByb3V0ZSBwcm92aWRlci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQW4ge0BsaW5rIEludGVudFNlbmRlcn0gdG8gc3RhcnQgYSBzZXR0aW5ncyBhY3Rpdml0eS4KLSAgICAgKi8KLSAgICBwdWJsaWMgSW50ZW50U2VuZGVyIGdldFNldHRpbmdzQWN0aXZpdHkoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldFBhcmNlbGFibGUoS0VZX1NFVFRJTkdTX0lOVEVOVCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcm91dGUncyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fSBmaWx0ZXJzLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PEludGVudEZpbHRlcj4gZ2V0Q29udHJvbEZpbHRlcnMoKSB7Ci0gICAgICAgIGVuc3VyZUNvbnRyb2xGaWx0ZXJzKCk7Ci0gICAgICAgIHJldHVybiBtQ29udHJvbEZpbHRlcnM7Ci0gICAgfQotCi0gICAgdm9pZCBlbnN1cmVDb250cm9sRmlsdGVycygpIHsKLSAgICAgICAgaWYgKG1Db250cm9sRmlsdGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtQ29udHJvbEZpbHRlcnMgPSBtQnVuZGxlLjxJbnRlbnRGaWx0ZXI+Z2V0UGFyY2VsYWJsZUFycmF5TGlzdChLRVlfQ09OVFJPTF9GSUxURVJTKTsKLSAgICAgICAgICAgIGlmIChtQ29udHJvbEZpbHRlcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db250cm9sRmlsdGVycyA9IENvbGxlY3Rpb25zLjxJbnRlbnRGaWx0ZXI+ZW1wdHlMaXN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB0eXBlIG9mIHBsYXliYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgdHlwZSBvZiBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZToKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI1BMQVlCQUNLX1RZUEVfTE9DQUx9IG9yCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19UWVBFX1JFTU9URX0uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRQbGF5YmFja1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfUExBWUJBQ0tfVFlQRSwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvLlBMQVlCQUNLX1RZUEVfUkVNT1RFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByb3V0ZSdzIHBsYXliYWNrIHN0cmVhbS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFBsYXliYWNrU3RyZWFtKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX1BMQVlCQUNLX1NUUkVBTSwgLTEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIHJlY2VpdmVyIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHR5cGUgb2YgdGhlIHJlY2VpdmVyIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZToKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0RFVklDRV9UWVBFX1RWfSBvcgotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jREVWSUNFX1RZUEVfU1BFQUtFUn0uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXREZXZpY2VUeXBlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX0RFVklDRV9UWVBFKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByb3V0ZSdzIGN1cnJlbnQgdm9sdW1lLCBvciAwIGlmIHVua25vd24uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRWb2x1bWUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfVk9MVU1FKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByb3V0ZSdzIG1heGltdW0gdm9sdW1lLCBvciAwIGlmIHVua25vd24uCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRWb2x1bWVNYXgoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfVk9MVU1FX01BWCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCBob3cgdm9sdW1lIGlzIGhhbmRsZWQgb24gdGhlIHJvdXRlLgotICAgICAqCi0gICAgICogQHJldHVybiBIb3cgdm9sdW1lIGlzIGhhbmRsZWQgb24gdGhlIHJvdXRlOgotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVk9MVU1FX0ZJWEVEfSBvcgotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVk9MVU1FX1ZBUklBQkxFfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFZvbHVtZUhhbmRsaW5nKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX1ZPTFVNRV9IQU5ETElORywKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVk9MVU1FX0ZJWEVEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByb3V0ZSdzIHByZXNlbnRhdGlvbiBkaXNwbGF5IGlkLCBvciAtMSBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoCi0gICAgICAgICAgICAgICAgS0VZX1BSRVNFTlRBVElPTl9ESVNQTEFZX0lELCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUFJFU0VOVEFUSU9OX0RJU1BMQVlfSURfTk9ORSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGJ1bmRsZSBvZiBleHRyYXMgZm9yIHRoaXMgcm91dGUgZGVzY3JpcHRvci4KLSAgICAgKiBUaGUgZXh0cmFzIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgbWVkaWEgcm91dGVyIGJ1dCB0aGV5IG1heSBiZSB1c2VkCi0gICAgICogYnkgYXBwbGljYXRpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBCdW5kbGUgZ2V0RXh0cmFzKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRCdW5kbGUoS0VZX0VYVFJBUyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWluaW11bSBjbGllbnQgdmVyc2lvbiByZXF1aXJlZCBmb3IgdGhpcyByb3V0ZS4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgcHVibGljIGludCBnZXRNaW5DbGllbnRWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX01JTl9DTElFTlRfVkVSU0lPTiwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfVkVSU0lPTl9TVEFSVCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWF4aW11bSBjbGllbnQgdmVyc2lvbiByZXF1aXJlZCBmb3IgdGhpcyByb3V0ZS4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgcHVibGljIGludCBnZXRNYXhDbGllbnRWZXJzaW9uKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX01BWF9DTElFTlRfVkVSU0lPTiwgSW50ZWdlci5NQVhfVkFMVUUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgZGVzY3JpcHRvciBoYXMgYWxsIG9mIHRoZSByZXF1aXJlZCBmaWVsZHMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLSAgICAgICAgZW5zdXJlQ29udHJvbEZpbHRlcnMoKTsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGdldElkKCkpCi0gICAgICAgICAgICAgICAgfHwgVGV4dFV0aWxzLmlzRW1wdHkoZ2V0TmFtZSgpKQotICAgICAgICAgICAgICAgIHx8IG1Db250cm9sRmlsdGVycy5jb250YWlucyhudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiTWVkaWFSb3V0ZURlc2NyaXB0b3J7ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJpZD0iKS5hcHBlbmQoZ2V0SWQoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZ3JvdXBNZW1iZXJJZHM9IikuYXBwZW5kKGdldEdyb3VwTWVtYmVySWRzKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIG5hbWU9IikuYXBwZW5kKGdldE5hbWUoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZGVzY3JpcHRpb249IikuYXBwZW5kKGdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGljb25Vcmk9IikuYXBwZW5kKGdldEljb25VcmkoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgaXNFbmFibGVkPSIpLmFwcGVuZChpc0VuYWJsZWQoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgaXNDb25uZWN0aW5nPSIpLmFwcGVuZChpc0Nvbm5lY3RpbmcoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgY29ubmVjdGlvblN0YXRlPSIpLmFwcGVuZChnZXRDb25uZWN0aW9uU3RhdGUoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgY29udHJvbEZpbHRlcnM9IikuYXBwZW5kKEFycmF5cy50b1N0cmluZyhnZXRDb250cm9sRmlsdGVycygpLnRvQXJyYXkoKSkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHBsYXliYWNrVHlwZT0iKS5hcHBlbmQoZ2V0UGxheWJhY2tUeXBlKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHBsYXliYWNrU3RyZWFtPSIpLmFwcGVuZChnZXRQbGF5YmFja1N0cmVhbSgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBkZXZpY2VUeXBlPSIpLmFwcGVuZChnZXREZXZpY2VUeXBlKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHZvbHVtZT0iKS5hcHBlbmQoZ2V0Vm9sdW1lKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHZvbHVtZU1heD0iKS5hcHBlbmQoZ2V0Vm9sdW1lTWF4KCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHZvbHVtZUhhbmRsaW5nPSIpLmFwcGVuZChnZXRWb2x1bWVIYW5kbGluZygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBwcmVzZW50YXRpb25EaXNwbGF5SWQ9IikuYXBwZW5kKGdldFByZXNlbnRhdGlvbkRpc3BsYXlJZCgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBleHRyYXM9IikuYXBwZW5kKGdldEV4dHJhcygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBpc1ZhbGlkPSIpLmFwcGVuZChpc1ZhbGlkKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIG1pbkNsaWVudFZlcnNpb249IikuYXBwZW5kKGdldE1pbkNsaWVudFZlcnNpb24oKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgbWF4Q2xpZW50VmVyc2lvbj0iKS5hcHBlbmQoZ2V0TWF4Q2xpZW50VmVyc2lvbigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIH0iKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgYnVuZGxlIGZvciBzZXJpYWxpemF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCByZXByZXNlbnRlZCBhcyBhIGJ1bmRsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIGFzQnVuZGxlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBidW5kbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIGJ1bmRsZSB3YXMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhUm91dGVEZXNjcmlwdG9yIGZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gYnVuZGxlICE9IG51bGwgPyBuZXcgTWVkaWFSb3V0ZURlc2NyaXB0b3IoYnVuZGxlLCBudWxsKSA6IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRlciBmb3Ige0BsaW5rIE1lZGlhUm91dGVEZXNjcmlwdG9yIG1lZGlhIHJvdXRlIGRlc2NyaXB0b3JzfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IG1Hcm91cE1lbWJlcklkczsKLSAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPiBtQ29udHJvbEZpbHRlcnM7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBkZXNjcmlwdG9yIGJ1aWxkZXIuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpZCBUaGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICogQHBhcmFtIG5hbWUgVGhlIHVzZXItdmlzaWJsZSBuYW1lIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKFN0cmluZyBpZCwgU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBzZXRJZChpZCk7Ci0gICAgICAgICAgICBzZXROYW1lKG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBkZXNjcmlwdG9yIGJ1aWxkZXIgd2hvc2UgaW5pdGlhbCBjb250ZW50cyBhcmUKLSAgICAgICAgICogY29waWVkIGZyb20gYW4gZXhpc3RpbmcgZGVzY3JpcHRvci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKE1lZGlhUm91dGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJkZXNjcmlwdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoZGVzY3JpcHRvci5tQnVuZGxlKTsKLQotICAgICAgICAgICAgZGVzY3JpcHRvci5lbnN1cmVDb250cm9sRmlsdGVycygpOwotICAgICAgICAgICAgaWYgKCFkZXNjcmlwdG9yLm1Db250cm9sRmlsdGVycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtQ29udHJvbEZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0PEludGVudEZpbHRlcj4oZGVzY3JpcHRvci5tQ29udHJvbEZpbHRlcnMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHVuaXF1ZSBpZCBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGUgcm91dGUgaWQgYXNzb2NpYXRlZCB3aXRoIGEgcm91dGUgZGVzY3JpcHRvciBmdW5jdGlvbnMgYXMgYSBzdGFibGUKLSAgICAgICAgICogaWRlbnRpZmllciBmb3IgdGhlIHJvdXRlIGFuZCBtdXN0IGJlIHVuaXF1ZSBhbW9uZyBhbGwgcm91dGVzIG9mZmVyZWQKLSAgICAgICAgICogYnkgdGhlIHByb3ZpZGVyLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRJZChTdHJpbmcgaWQpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0U3RyaW5nKEtFWV9JRCwgaWQpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkcyBhIGdyb3VwIG1lbWJlciBpZCBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBBIHJvdXRlIGRlc2NyaXB0b3IgdGhhdCBoYXMgb25lIG9yIG1vcmUgZ3JvdXAgbWVtYmVyIHJvdXRlIGlkcwotICAgICAgICAgKiByZXByZXNlbnRzIGEgcm91dGUgZ3JvdXAuIEEgbWVtYmVyIHJvdXRlIG1heSBiZWxvbmcgdG8gYW5vdGhlciBncm91cC4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkR3JvdXBNZW1iZXJJZChTdHJpbmcgZ3JvdXBNZW1iZXJJZCkgewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KGdyb3VwTWVtYmVySWQpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZ3JvdXBNZW1iZXJJZCBtdXN0IG5vdCBiZSBlbXB0eSIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUdyb3VwTWVtYmVySWRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJJZHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUdyb3VwTWVtYmVySWRzLmNvbnRhaW5zKGdyb3VwTWVtYmVySWQpKSB7Ci0gICAgICAgICAgICAgICAgbUdyb3VwTWVtYmVySWRzLmFkZChncm91cE1lbWJlcklkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZHMgYSBsaXN0IG9mIGdyb3VwIG1lbWJlciBpZHMgb2YgdGhlIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogQSByb3V0ZSBkZXNjcmlwdG9yIHRoYXQgaGFzIG9uZSBvciBtb3JlIGdyb3VwIG1lbWJlciByb3V0ZSBpZHMKLSAgICAgICAgICogcmVwcmVzZW50cyBhIHJvdXRlIGdyb3VwLiBBIG1lbWJlciByb3V0ZSBtYXkgYmVsb25nIHRvIGFub3RoZXIgZ3JvdXAuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZEdyb3VwTWVtYmVySWRzKENvbGxlY3Rpb248U3RyaW5nPiBncm91cE1lbWJlcklkcykgewotICAgICAgICAgICAgaWYgKGdyb3VwTWVtYmVySWRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJncm91cE1lbWJlcklkcyBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghZ3JvdXBNZW1iZXJJZHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZ3JvdXBNZW1iZXJJZCA6IGdyb3VwTWVtYmVySWRzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEdyb3VwTWVtYmVySWQoZ3JvdXBNZW1iZXJJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgdXNlci12aXNpYmxlIG5hbWUgb2YgdGhlIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhlIHJvdXRlIG5hbWUgaWRlbnRpZmllcyB0aGUgZGVzdGluYXRpb24gcmVwcmVzZW50ZWQgYnkgdGhlIHJvdXRlLgotICAgICAgICAgKiBJdCBtYXkgYmUgYSB1c2VyLXN1cHBsaWVkIG5hbWUsIGFuIGFsaWFzLCBvciBkZXZpY2Ugc2VyaWFsIG51bWJlci4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRTdHJpbmcoS0VZX05BTUUsIG5hbWUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgdXNlci12aXNpYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSByb3V0ZSBkZXNjcmlwdGlvbiBkZXNjcmliZXMgdGhlIGtpbmQgb2YgZGVzdGluYXRpb24gcmVwcmVzZW50ZWQgYnkgdGhlIHJvdXRlLgotICAgICAgICAgKiBJdCBtYXkgYmUgYSB1c2VyLXN1cHBsaWVkIHN0cmluZywgYSBtb2RlbCBudW1iZXIgb3IgYnJhbmQgb2YgZGV2aWNlLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXREZXNjcmlwdGlvbihTdHJpbmcgZGVzY3JpcHRpb24pIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0U3RyaW5nKEtFWV9ERVNDUklQVElPTiwgZGVzY3JpcHRpb24pOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgVVJJIG9mIHRoZSBpY29uIHJlcHJlc2VudGluZyB0aGlzIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhpcyBpY29uIHdpbGwgYmUgdXNlZCBpbiBwaWNrZXIgVUlzIGlmIGF2YWlsYWJsZS4KLSAgICAgICAgICogPC9wPjxwPgotICAgICAgICAgKiBUaGUgVVJJIG11c3QgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgZm9ybWF0czoKLSAgICAgICAgICogPHVsPgotICAgICAgICAgKiA8bGk+Y29udGVudCAoe0BsaW5rIGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXIjU0NIRU1FX0NPTlRFTlR9KTwvbGk+Ci0gICAgICAgICAqIDxsaT5hbmRyb2lkLnJlc291cmNlICh7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciNTQ0hFTUVfQU5EUk9JRF9SRVNPVVJDRX0pCi0gICAgICAgICAqIDwvbGk+Ci0gICAgICAgICAqIDxsaT5maWxlICh7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciNTQ0hFTUVfRklMRX0pPC9saT4KLSAgICAgICAgICogPC91bD4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0SWNvblVyaShVcmkgaWNvblVyaSkgewotICAgICAgICAgICAgaWYgKGljb25VcmkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImljb25VcmkgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUJ1bmRsZS5wdXRTdHJpbmcoS0VZX0lDT05fVVJJLCBpY29uVXJpLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB3aGV0aGVyIHRoZSByb3V0ZSBpcyBlbmFibGVkLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogRGlzYWJsZWQgcm91dGVzIHJlcHJlc2VudCByb3V0ZXMgdGhhdCBhIHJvdXRlIHByb3ZpZGVyIGtub3dzIGFib3V0LCBzdWNoIGFzIHBhaXJlZAotICAgICAgICAgKiBXaWZpIERpc3BsYXkgcmVjZWl2ZXJzLCBidXQgdGhhdCBhcmUgbm90IGN1cnJlbnRseSBhdmFpbGFibGUgZm9yIHVzZS4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RW5hYmxlZChib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0Qm9vbGVhbihLRVlfRU5BQkxFRCwgZW5hYmxlZCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIHJvdXRlIGlzIGluIHRoZSBwcm9jZXNzIG9mIGNvbm5lY3RpbmcgYW5kIGlzIG5vdCB5ZXQKLSAgICAgICAgICogcmVhZHkgZm9yIHVzZS4KLSAgICAgICAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjc2V0Q29ubmVjdGlvblN0YXRlfSBpbnN0ZWFkLgotICAgICAgICAgKi8KLSAgICAgICAgQERlcHJlY2F0ZWQKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Q29ubmVjdGluZyhib29sZWFuIGNvbm5lY3RpbmcpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0Qm9vbGVhbihLRVlfQ09OTkVDVElORywgY29ubmVjdGluZyk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIGNvbm5lY3Rpb24gc3RhdGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjb25uZWN0aW9uU3RhdGUgVGhlIGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhlIHJvdXRlOgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEfSwKLSAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkd9LCBvcgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEfS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldENvbm5lY3Rpb25TdGF0ZShpbnQgY29ubmVjdGlvblN0YXRlKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfQ09OTkVDVElPTl9TVEFURSwgY29ubmVjdGlvblN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgd2hldGhlciB0aGUgcm91dGUgY2FuIGJlIGRpc2Nvbm5lY3RlZCB3aXRob3V0IHN0b3BwaW5nIHBsYXliYWNrLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Q2FuRGlzY29ubmVjdChib29sZWFuIGNhbkRpc2Nvbm5lY3QpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0Qm9vbGVhbihLRVlfQ0FOX0RJU0NPTk5FQ1QsIGNhbkRpc2Nvbm5lY3QpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyBhbiBpbnRlbnQgc2VuZGVyIGZvciBsYXVuY2hpbmcgdGhlIHNldHRpbmdzIGFjdGl2aXR5IGZvciB0aGlzCi0gICAgICAgICAqIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0U2V0dGluZ3NBY3Rpdml0eShJbnRlbnRTZW5kZXIgaXMpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0UGFyY2VsYWJsZShLRVlfU0VUVElOR1NfSU5URU5ULCBpcyk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIGEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGludGVudH0gZmlsdGVyIGZvciB0aGUgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRDb250cm9sRmlsdGVyKEludGVudEZpbHRlciBmaWx0ZXIpIHsKLSAgICAgICAgICAgIGlmIChmaWx0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImZpbHRlciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtQ29udHJvbEZpbHRlcnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db250cm9sRmlsdGVycyA9IG5ldyBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtQ29udHJvbEZpbHRlcnMuY29udGFpbnMoZmlsdGVyKSkgewotICAgICAgICAgICAgICAgIG1Db250cm9sRmlsdGVycy5hZGQoZmlsdGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZHMgYSBsaXN0IG9mIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBpbnRlbnR9IGZpbHRlcnMgZm9yIHRoZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZENvbnRyb2xGaWx0ZXJzKENvbGxlY3Rpb248SW50ZW50RmlsdGVyPiBmaWx0ZXJzKSB7Ci0gICAgICAgICAgICBpZiAoZmlsdGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZmlsdGVycyBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghZmlsdGVycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKEludGVudEZpbHRlciBmaWx0ZXIgOiBmaWx0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZENvbnRyb2xGaWx0ZXIoZmlsdGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIHBsYXliYWNrIHR5cGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBwbGF5YmFja1R5cGUgVGhlIHBsYXliYWNrIHR5cGUgb2YgdGhlIHJvdXRlOgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI1BMQVlCQUNLX1RZUEVfTE9DQUx9IG9yCi0gICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVFlQRV9SRU1PVEV9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0UGxheWJhY2tUeXBlKGludCBwbGF5YmFja1R5cGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9QTEFZQkFDS19UWVBFLCBwbGF5YmFja1R5cGUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyBwbGF5YmFjayBzdHJlYW0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRQbGF5YmFja1N0cmVhbShpbnQgcGxheWJhY2tTdHJlYW0pIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9QTEFZQkFDS19TVFJFQU0sIHBsYXliYWNrU3RyZWFtKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgcmVjZWl2ZXIgZGV2aWNlIHR5cGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkZXZpY2VUeXBlIFRoZSByZWNlaXZlIGRldmljZSB0eXBlIG9mIHRoZSByb3V0ZToKLSAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNERVZJQ0VfVFlQRV9UVn0gb3IKLSAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNERVZJQ0VfVFlQRV9TUEVBS0VSfS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldERldmljZVR5cGUoaW50IGRldmljZVR5cGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9ERVZJQ0VfVFlQRSwgZGV2aWNlVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIGN1cnJlbnQgdm9sdW1lLCBvciAwIGlmIHVua25vd24uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRWb2x1bWUoaW50IHZvbHVtZSkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX1ZPTFVNRSwgdm9sdW1lKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgbWF4aW11bSB2b2x1bWUsIG9yIDAgaWYgdW5rbm93bi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFZvbHVtZU1heChpbnQgdm9sdW1lTWF4KSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfVk9MVU1FX01BWCwgdm9sdW1lTWF4KTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3Mgdm9sdW1lIGhhbmRsaW5nLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gdm9sdW1lSGFuZGxpbmcgaG93IHZvbHVtZSBpcyBoYW5kbGVkIG9uIHRoZSByb3V0ZToKLSAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19WT0xVTUVfRklYRUR9IG9yCi0gICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVk9MVU1FX1ZBUklBQkxFfS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFZvbHVtZUhhbmRsaW5nKGludCB2b2x1bWVIYW5kbGluZykgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX1ZPTFVNRV9IQU5ETElORywgdm9sdW1lSGFuZGxpbmcpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyBwcmVzZW50YXRpb24gZGlzcGxheSBpZCwgb3IgLTEgaWYgbm9uZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFByZXNlbnRhdGlvbkRpc3BsYXlJZChpbnQgcHJlc2VudGF0aW9uRGlzcGxheUlkKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfUFJFU0VOVEFUSU9OX0RJU1BMQVlfSUQsIHByZXNlbnRhdGlvbkRpc3BsYXlJZCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIGEgYnVuZGxlIG9mIGV4dHJhcyBmb3IgdGhpcyByb3V0ZSBkZXNjcmlwdG9yLgotICAgICAgICAgKiBUaGUgZXh0cmFzIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgbWVkaWEgcm91dGVyIGJ1dCB0aGV5IG1heSBiZSB1c2VkCi0gICAgICAgICAqIGJ5IGFwcGxpY2F0aW9ucy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEV4dHJhcyhCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEJ1bmRsZShLRVlfRVhUUkFTLCBleHRyYXMpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyBtaW5pbXVtIGNsaWVudCB2ZXJzaW9uLgotICAgICAgICAgKiBBIHJvdXRlciB3aG9zZSB2ZXJzaW9uIGlzIGxvd2VyIHRoYW4gdGhpcyB3aWxsIG5vdCBiZSBhYmxlIHRvIGNvbm5lY3QgdG8gdGhpcyByb3V0ZS4KLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldE1pbkNsaWVudFZlcnNpb24oaW50IG1pblZlcnNpb24pIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9NSU5fQ0xJRU5UX1ZFUlNJT04sIG1pblZlcnNpb24pOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyBtYXhpbXVtIGNsaWVudCB2ZXJzaW9uLgotICAgICAgICAgKiBBIHJvdXRlciB3aG9zZSB2ZXJzaW9uIGlzIGhpZ2hlciB0aGFuIHRoaXMgd2lsbCBub3QgYmUgYWJsZSB0byBjb25uZWN0IHRvIHRoaXMgcm91dGUuCi0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRNYXhDbGllbnRWZXJzaW9uKGludCBtYXhWZXJzaW9uKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfTUFYX0NMSUVOVF9WRVJTSU9OLCBtYXhWZXJzaW9uKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEJ1aWxkcyB0aGUge0BsaW5rIE1lZGlhUm91dGVEZXNjcmlwdG9yIG1lZGlhIHJvdXRlIGRlc2NyaXB0b3J9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVEZXNjcmlwdG9yIGJ1aWxkKCkgewotICAgICAgICAgICAgaWYgKG1Db250cm9sRmlsdGVycyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUJ1bmRsZS5wdXRQYXJjZWxhYmxlQXJyYXlMaXN0KEtFWV9DT05UUk9MX0ZJTFRFUlMsIG1Db250cm9sRmlsdGVycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUdyb3VwTWVtYmVySWRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQnVuZGxlLnB1dFN0cmluZ0FycmF5TGlzdChLRVlfR1JPVVBfTUVNQkVSX0lEUywgbUdyb3VwTWVtYmVySWRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZURlc2NyaXB0b3IobUJ1bmRsZSwgbUNvbnRyb2xGaWx0ZXJzKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzOTYyN2YuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUga2luZHMgb2Ygcm91dGVzIHRoYXQgdGhlIG1lZGlhIHJvdXRlciB3b3VsZCBsaWtlIHRvIGRpc2NvdmVyCi0gKiBhbmQgd2hldGhlciB0byBwZXJmb3JtIGFjdGl2ZSBzY2FubmluZy4KLSAqIDxwPgotICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFTEVDVE9SID0gInNlbGVjdG9yIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FDVElWRV9TQ0FOID0gImFjdGl2ZVNjYW4iOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbWVkaWEgcm91dGUgZGlzY292ZXJ5IHJlcXVlc3QuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHJvdXRlIHNlbGVjdG9yIHRoYXQgc3BlY2lmaWVzIHRoZSBraW5kcyBvZiByb3V0ZXMgdG8gZGlzY292ZXIuCi0gICAgICogQHBhcmFtIGFjdGl2ZVNjYW4gVHJ1ZSBpZiBhY3RpdmUgc2Nhbm5pbmcgc2hvdWxkIGJlIHBlcmZvcm1lZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yLCBib29sZWFuIGFjdGl2ZVNjYW4pIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIG1TZWxlY3RvciA9IHNlbGVjdG9yOwotICAgICAgICBtQnVuZGxlLnB1dEJ1bmRsZShLRVlfU0VMRUNUT1IsIHNlbGVjdG9yLmFzQnVuZGxlKCkpOwotICAgICAgICBtQnVuZGxlLnB1dEJvb2xlYW4oS0VZX0FDVElWRV9TQ0FOLCBhY3RpdmVTY2FuKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0KEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgbUJ1bmRsZSA9IGJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByb3V0ZSBzZWxlY3RvciB0aGF0IHNwZWNpZmllcyB0aGUga2luZHMgb2Ygcm91dGVzIHRvIGRpc2NvdmVyLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlU2VsZWN0b3IgZ2V0U2VsZWN0b3IoKSB7Ci0gICAgICAgIGVuc3VyZVNlbGVjdG9yKCk7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0b3I7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVuc3VyZVNlbGVjdG9yKCkgewotICAgICAgICBpZiAobVNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5mcm9tQnVuZGxlKG1CdW5kbGUuZ2V0QnVuZGxlKEtFWV9TRUxFQ1RPUikpOwotICAgICAgICAgICAgaWYgKG1TZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIGFjdGl2ZSBzY2FubmluZyBzaG91bGQgYmUgcGVyZm9ybWVkLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlciNDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0FjdGl2ZVNjYW4oKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJvb2xlYW4oS0VZX0FDVElWRV9TQ0FOKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGRpc2NvdmVyeSByZXF1ZXN0IGhhcyBhbGwgb2YgdGhlIHJlcXVpcmVkIGZpZWxkcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICBlbnN1cmVTZWxlY3RvcigpOwotICAgICAgICByZXR1cm4gbVNlbGVjdG9yLmlzVmFsaWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3Qgb3RoZXIgPSAoTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QpbzsKLSAgICAgICAgICAgIHJldHVybiBnZXRTZWxlY3RvcigpLmVxdWFscyhvdGhlci5nZXRTZWxlY3RvcigpKQotICAgICAgICAgICAgICAgICAgICAmJiBpc0FjdGl2ZVNjYW4oKSA9PSBvdGhlci5pc0FjdGl2ZVNjYW4oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNlbGVjdG9yKCkuaGFzaENvZGUoKSBeIChpc0FjdGl2ZVNjYW4oKSA/IDEgOiAwKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIkRpc2NvdmVyeVJlcXVlc3R7IHNlbGVjdG9yPSIpLmFwcGVuZChnZXRTZWxlY3RvcigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBhY3RpdmVTY2FuPSIpLmFwcGVuZChpc0FjdGl2ZVNjYW4oKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgaXNWYWxpZD0iKS5hcHBlbmQoaXNWYWxpZCgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIH0iKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgYnVuZGxlIGZvciBzZXJpYWxpemF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCByZXByZXNlbnRlZCBhcyBhIGJ1bmRsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIGFzQnVuZGxlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBidW5kbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIGJ1bmRsZSB3YXMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IGZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gYnVuZGxlICE9IG51bGwgPyBuZXcgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QoYnVuZGxlKSA6IG51bGw7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWEyZTFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC51dGlsLk9iamVjdHNDb21wYXQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2s7Ci0KLS8qKgotICogTWVkaWEgcm91dGUgcHJvdmlkZXJzIGFyZSB1c2VkIHRvIHB1Ymxpc2ggYWRkaXRpb25hbCBtZWRpYSByb3V0ZXMgZm9yCi0gKiB1c2Ugd2l0aGluIGFuIGFwcGxpY2F0aW9uLiAgTWVkaWEgcm91dGUgcHJvdmlkZXJzIG1heSBhbHNvIGJlIGRlY2xhcmVkCi0gKiBhcyBhIHNlcnZpY2UgdG8gcHVibGlzaCBhZGRpdGlvbmFsIG1lZGlhIHJvdXRlcyB0byBhbGwgYXBwbGljYXRpb25zCi0gKiBpbiB0aGUgc3lzdGVtLgotICogPHA+Ci0gKiBUaGUgcHVycG9zZSBvZiBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGlzIHRvIGRpc2NvdmVyIG1lZGlhIHJvdXRlcyB0aGF0IHNhdGlzZnkKLSAqIHRoZSBjcml0ZXJpYSBzcGVjaWZpZWQgYnkgdGhlIGN1cnJlbnQge0BsaW5rIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0fSBhbmQgcHVibGlzaCBhCi0gKiB7QGxpbmsgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvcn0gd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBlYWNoIHJvdXRlIGJ5IGNhbGxpbmcKLSAqIHtAbGluayAjc2V0RGVzY3JpcHRvcn0gdG8gbm90aWZ5IHRoZSBjdXJyZW50bHkgcmVnaXN0ZXJlZCB7QGxpbmsgQ2FsbGJhY2t9LgotICogPC9wPjxwPgotICogVGhlIHByb3ZpZGVyIHNob3VsZCB3YXRjaCBmb3IgY2hhbmdlcyB0byB0aGUgZGlzY292ZXJ5IHJlcXVlc3QgYnkgaW1wbGVtZW50aW5nCi0gKiB7QGxpbmsgI29uRGlzY292ZXJ5UmVxdWVzdENoYW5nZWR9IGFuZCB1cGRhdGluZyB0aGUgc2V0IG9mIHJvdXRlcyB0aGF0IGl0IGlzCi0gKiBhdHRlbXB0aW5nIHRvIGRpc2NvdmVyLiAgSXQgc2hvdWxkIGFsc28gaGFuZGxlIHJvdXRlIGNvbnRyb2wgcmVxdWVzdHMgc3VjaAotICogYXMgdm9sdW1lIGNoYW5nZXMgb3Ige0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGludGVudHN9Ci0gKiBieSBpbXBsZW1lbnRpbmcge0BsaW5rICNvbkNyZWF0ZVJvdXRlQ29udHJvbGxlcn0gdG8gcmV0dXJuIGEge0BsaW5rIFJvdXRlQ29udHJvbGxlcn0KLSAqIGZvciBhIHBhcnRpY3VsYXIgcm91dGUuCi0gKiA8L3A+PHA+Ci0gKiBBIG1lZGlhIHJvdXRlIHByb3ZpZGVyIG1heSBiZSB1c2VkIHByaXZhdGVseSB3aXRoaW4gdGhlIHNjb3BlIG9mIGEgc2luZ2xlCi0gKiBhcHBsaWNhdGlvbiBwcm9jZXNzIGJ5IGNhbGxpbmcge0BsaW5rIE1lZGlhUm91dGVyI2FkZFByb3ZpZGVyIE1lZGlhUm91dGVyLmFkZFByb3ZpZGVyfQotICogdG8gYWRkIGl0IHRvIHRoZSBsb2NhbCB7QGxpbmsgTWVkaWFSb3V0ZXJ9LiAgQSBtZWRpYSByb3V0ZSBwcm92aWRlciBtYXkgYWxzbyBiZSBtYWRlCi0gKiBhdmFpbGFibGUgZ2xvYmFsbHkgdG8gYWxsIGFwcGxpY2F0aW9ucyBieSByZWdpc3RlcmluZyBhIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlfQotICogaW4gdGhlIHByb3ZpZGVyJ3MgbWFuaWZlc3QuICBXaGVuIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBpcyByZWdpc3RlcmVkCi0gKiBhcyBhIHNlcnZpY2UsIGFsbCBhcHBsaWNhdGlvbnMgdGhhdCB1c2UgdGhlIG1lZGlhIHJvdXRlciBBUEkgd2lsbCBiZSBhYmxlIHRvCi0gKiBkaXNjb3ZlciBhbmQgdXNlZCB0aGUgcHJvdmlkZXIncyByb3V0ZXMgd2l0aG91dCBoYXZpbmcgdG8gaW5zdGFsbCBhbnl0aGluZyBlbHNlLgotICogPC9wPjxwPgotICogVGhpcyBvYmplY3QgbXVzdCBvbmx5IGJlIGFjY2Vzc2VkIG9uIHRoZSBtYWluIHRocmVhZC4KLSAqIDwvcD4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1lZGlhUm91dGVQcm92aWRlciB7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNU0dfREVMSVZFUl9ERVNDUklQVE9SX0NIQU5HRUQgPSAxOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTVNHX0RFTElWRVJfRElTQ09WRVJZX1JFUVVFU1RfQ0hBTkdFRCA9IDI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlck1ldGFkYXRhIG1NZXRhZGF0YTsKLSAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVySGFuZGxlciBtSGFuZGxlciA9IG5ldyBQcm92aWRlckhhbmRsZXIoKTsKLQotICAgIHByaXZhdGUgQ2FsbGJhY2sgbUNhbGxiYWNrOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBtRGlzY292ZXJ5UmVxdWVzdDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVBlbmRpbmdEaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIG1EZXNjcmlwdG9yOwotICAgIHByaXZhdGUgYm9vbGVhbiBtUGVuZGluZ0Rlc2NyaXB0b3JDaGFuZ2U7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGV4dCBUaGUgY29udGV4dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVByb3ZpZGVyKEBOb25OdWxsIENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIE1lZGlhUm91dGVQcm92aWRlcihDb250ZXh0IGNvbnRleHQsIFByb3ZpZGVyTWV0YWRhdGEgbWV0YWRhdGEpIHsKLSAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udGV4dCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIGlmIChtZXRhZGF0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBtTWV0YWRhdGEgPSBuZXcgUHJvdmlkZXJNZXRhZGF0YShuZXcgQ29tcG9uZW50TmFtZShjb250ZXh0LCBnZXRDbGFzcygpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNvbnRleHQgb2YgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBDb250ZXh0IGdldENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBtQ29udGV4dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwcm92aWRlcidzIGhhbmRsZXIgd2hpY2ggaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBtYWluIHRocmVhZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgSGFuZGxlciBnZXRIYW5kbGVyKCkgewotICAgICAgICByZXR1cm4gbUhhbmRsZXI7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBzb21lIG1ldGFkYXRhIGFib3V0IHRoZSBwcm92aWRlcidzIGltcGxlbWVudGF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBQcm92aWRlck1ldGFkYXRhIGdldE1ldGFkYXRhKCkgewotICAgICAgICByZXR1cm4gbU1ldGFkYXRhOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcHJvdmlkZXIncyBkZXNjcmlwdG9yIGNoYW5nZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHVzZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldENhbGxiYWNrKEBOdWxsYWJsZSBDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBNZWRpYVJvdXRlci5jaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY3VycmVudCBkaXNjb3ZlcnkgcmVxdWVzdCB3aGljaCBpbmZvcm1zIHRoZSBwcm92aWRlciBhYm91dCB0aGUKLSAgICAgKiBraW5kcyBvZiByb3V0ZXMgdG8gZGlzY292ZXIgYW5kIHdoZXRoZXIgdG8gcGVyZm9ybSBhY3RpdmUgc2Nhbm5pbmcuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IGRpc2NvdmVyeSByZXF1ZXN0LCBvciBudWxsIGlmIG5vIGRpc2NvdmVyeSBpcyBuZWVkZWQgYXQgdGhpcyB0aW1lLgotICAgICAqCi0gICAgICogQHNlZSAjb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZAotICAgICAqLwotICAgIEBOdWxsYWJsZQotICAgIHB1YmxpYyBmaW5hbCBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBnZXREaXNjb3ZlcnlSZXF1ZXN0KCkgewotICAgICAgICByZXR1cm4gbURpc2NvdmVyeVJlcXVlc3Q7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGRpc2NvdmVyeSByZXF1ZXN0IHRvIGluZm9ybSB0aGUgcHJvdmlkZXIgYWJvdXQgdGhlIGtpbmRzIG9mCi0gICAgICogcm91dGVzIHRoYXQgaXRzIGNsaWVudHMgd291bGQgbGlrZSB0byBkaXNjb3ZlciBhbmQgd2hldGhlciB0byBwZXJmb3JtIGFjdGl2ZSBzY2FubmluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBkaXNjb3ZlcnkgcmVxdWVzdCwgb3IgbnVsbCBpZiBubyBkaXNjb3ZlcnkgaXMgbmVlZGVkIGF0IHRoaXMgdGltZS4KLSAgICAgKgotICAgICAqIEBzZWUgI29uRGlzY292ZXJ5UmVxdWVzdENoYW5nZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgdm9pZCBzZXREaXNjb3ZlcnlSZXF1ZXN0KE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgTWVkaWFSb3V0ZXIuY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgaWYgKE9iamVjdHNDb21wYXQuZXF1YWxzKG1EaXNjb3ZlcnlSZXF1ZXN0LCByZXF1ZXN0KSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbURpc2NvdmVyeVJlcXVlc3QgPSByZXF1ZXN0OwotICAgICAgICBpZiAoIW1QZW5kaW5nRGlzY292ZXJ5UmVxdWVzdENoYW5nZSkgewotICAgICAgICAgICAgbVBlbmRpbmdEaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlID0gdHJ1ZTsKLSAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX0RFTElWRVJfRElTQ09WRVJZX1JFUVVFU1RfQ0hBTkdFRCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGRlbGl2ZXJEaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZCgpIHsKLSAgICAgICAgbVBlbmRpbmdEaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlID0gZmFsc2U7Ci0gICAgICAgIG9uRGlzY292ZXJ5UmVxdWVzdENoYW5nZWQobURpc2NvdmVyeVJlcXVlc3QpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHdoZW4gdGhlIHtAbGluayBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBkaXNjb3ZlcnkgcmVxdWVzdH0KLSAgICAgKiBoYXMgY2hhbmdlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBXaGVuZXZlciBhbiBhcHBsaWNhdGlvbnMgY2FsbHMge0BsaW5rIE1lZGlhUm91dGVyI2FkZENhbGxiYWNrfSB0byByZWdpc3RlcgotICAgICAqIGEgY2FsbGJhY2ssIGl0IGFsc28gcHJvdmlkZXMgYSBzZWxlY3RvciB0byBzcGVjaWZ5IHRoZSBraW5kcyBvZiByb3V0ZXMgdGhhdAotICAgICAqIGl0IGlzIGludGVyZXN0ZWQgaW4uICBUaGUgbWVkaWEgcm91dGVyIGNvbWJpbmVzIGFsbCBvZiB0aGVzZSBzZWxlY3RvcnMgdG9nZXRoZXIKLSAgICAgKiB0byBnZW5lcmF0ZSBhIHtAbGluayBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdH0gYW5kIG5vdGlmaWVzIGVhY2ggcHJvdmlkZXIgd2hlbiBhIGNoYW5nZQotICAgICAqIG9jY3VycyBieSBjYWxsaW5nIHtAbGluayAjc2V0RGlzY292ZXJ5UmVxdWVzdH0gd2hpY2ggcG9zdHMgYSBtZXNzYWdlIHRvIGludm9rZQotICAgICAqIHRoaXMgbWV0aG9kIGFzeW5jaHJvbm91c2x5LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgcHJvdmlkZXIgc2hvdWxkIGV4YW1pbmUgdGhlIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBjYXRlZ29yaWVzfQotICAgICAqIGluIHRoZSBkaXNjb3ZlcnkgcmVxdWVzdCdzIHtAbGluayBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3J9IHRvIGRldGVybWluZSB3aGF0Ci0gICAgICoga2luZHMgb2Ygcm91dGVzIGl0IHNob3VsZCB0cnkgdG8gZGlzY292ZXIgYW5kIHdoZXRoZXIgaXQgc2hvdWxkIHBlcmZvcm0gYWN0aXZlCi0gICAgICogb3IgcGFzc2l2ZSBzY2Fucy4gIEluIG1hbnkgY2FzZXMsIHRoZSBwcm92aWRlciBtYXkgYmUgYWJsZSB0byBzYXZlIHBvd2VyIGJ5Ci0gICAgICogZGV0ZXJtaW5pbmcgdGhhdCB0aGUgc2VsZWN0b3IgZG9lcyBub3QgY29udGFpbiBhbnkgY2F0ZWdvcmllcyB0aGF0IGl0IHN1cHBvcnRzCi0gICAgICogYW5kIGl0IGNhbiB0aGVyZWZvcmUgYXZvaWQgcGVyZm9ybWluZyBhbnkgc2NhbnMgYXQgYWxsLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZXF1ZXN0IFRoZSBuZXcgZGlzY292ZXJ5IHJlcXVlc3QsIG9yIG51bGwgaWYgbm8gZGlzY292ZXJ5IGlzIG5lZWRlZCBhdCB0aGlzIHRpbWUuCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyI2FkZENhbGxiYWNrCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZChATnVsbGFibGUgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHByb3ZpZGVyJ3MgZGVzY3JpcHRvci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVzY3JpcHRvciBkZXNjcmliZXMgdGhlIHN0YXRlIG9mIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBhbmQKLSAgICAgKiB0aGUgcm91dGVzIHRoYXQgaXQgcHVibGlzaGVzLiAgV2F0Y2ggZm9yIGNoYW5nZXMgdG8gdGhlIGRlc2NyaXB0b3IKLSAgICAgKiBieSByZWdpc3RlcmluZyBhIHtAbGluayBDYWxsYmFjayBjYWxsYmFja30gd2l0aCB7QGxpbmsgI3NldENhbGxiYWNrfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAc2VlIENhbGxiYWNrI29uRGVzY3JpcHRvckNoYW5nZWQKLSAgICAgKi8KLSAgICBATnVsbGFibGUKLSAgICBwdWJsaWMgZmluYWwgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKCkgewotICAgICAgICByZXR1cm4gbURlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgcHJvdmlkZXIncyBkZXNjcmlwdG9yLgotICAgICAqIDxwPgotICAgICAqIFRoZSBwcm92aWRlciBtdXN0IGNhbGwgdGhpcyBtZXRob2QgdG8gbm90aWZ5IHRoZSBjdXJyZW50bHkgcmVnaXN0ZXJlZAotICAgICAqIHtAbGluayBDYWxsYmFjayBjYWxsYmFja30gYWJvdXQgdGhlIGNoYW5nZSB0byB0aGUgcHJvdmlkZXIncyBkZXNjcmlwdG9yLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yIFRoZSB1cGRhdGVkIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEBzZWUgQ2FsbGJhY2sjb25EZXNjcmlwdG9yQ2hhbmdlZAotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldERlc2NyaXB0b3IoQE51bGxhYmxlIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICBNZWRpYVJvdXRlci5jaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAobURlc2NyaXB0b3IgIT0gZGVzY3JpcHRvcikgewotICAgICAgICAgICAgbURlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgICAgICAgICAgaWYgKCFtUGVuZGluZ0Rlc2NyaXB0b3JDaGFuZ2UpIHsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ0Rlc2NyaXB0b3JDaGFuZ2UgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1IYW5kbGVyLnNlbmRFbXB0eU1lc3NhZ2UoTVNHX0RFTElWRVJfREVTQ1JJUFRPUl9DSEFOR0VEKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZGVsaXZlckRlc2NyaXB0b3JDaGFuZ2VkKCkgewotICAgICAgICBtUGVuZGluZ0Rlc2NyaXB0b3JDaGFuZ2UgPSBmYWxzZTsKLQotICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkRlc2NyaXB0b3JDaGFuZ2VkKHRoaXMsIG1EZXNjcmlwdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHRvIG9idGFpbiBhIHJvdXRlIGNvbnRyb2xsZXIgZm9yIGEgcGFydGljdWxhciByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgbWVkaWEgcm91dGVyIHdpbGwgaW52b2tlIHRoZSB7QGxpbmsgUm91dGVDb250cm9sbGVyI29uUmVsZWFzZX0gbWV0aG9kIG9mIHRoZSByb3V0ZQotICAgICAqIGNvbnRyb2xsZXIgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkIHRvIGFsbG93IGl0IHRvIGZyZWUgaXRzIHJlc291cmNlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcm91dGVJZCBUaGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZS4KLSAgICAgKiBAcmV0dXJuIFRoZSByb3V0ZSBjb250cm9sbGVyLiAgUmV0dXJucyBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggcm91dGUgb3IgaWYgdGhlIHJvdXRlCi0gICAgICogY2Fubm90IGJlIGNvbnRyb2xsZWQgdXNpbmcgdGhlIHJvdXRlIGNvbnRyb2xsZXIgaW50ZXJmYWNlLgotICAgICAqLwotICAgIEBOdWxsYWJsZQotICAgIHB1YmxpYyBSb3V0ZUNvbnRyb2xsZXIgb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoQE5vbk51bGwgU3RyaW5nIHJvdXRlSWQpIHsKLSAgICAgICAgaWYgKHJvdXRlSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGVJZCBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHRvIG9idGFpbiBhIHJvdXRlIGNvbnRyb2xsZXIgZm9yIGEgcGFydGljdWxhciByb3V0ZSB3aGljaCBpcyBhCi0gICAgICogbWVtYmVyIG9mIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUdyb3VwfS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgbWVkaWEgcm91dGVyIHdpbGwgaW52b2tlIHRoZSB7QGxpbmsgUm91dGVDb250cm9sbGVyI29uUmVsZWFzZX0gbWV0aG9kIG9mIHRoZSByb3V0ZQotICAgICAqIGNvbnRyb2xsZXIgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkIHRvIGFsbG93IGl0IHRvIGZyZWUgaXRzIHJlc291cmNlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcm91dGVJZCBUaGUgdW5pcXVlIGlkIG9mIHRoZSBtZW1iZXIgcm91dGUuCi0gICAgICogQHBhcmFtIHJvdXRlR3JvdXBJZCBUaGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZSBncm91cC4KLSAgICAgKiBAcmV0dXJuIFRoZSByb3V0ZSBjb250cm9sbGVyLiAgUmV0dXJucyBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggcm91dGUgb3IgaWYgdGhlIHJvdXRlCi0gICAgICogY2Fubm90IGJlIGNvbnRyb2xsZWQgdXNpbmcgdGhlIHJvdXRlIGNvbnRyb2xsZXIgaW50ZXJmYWNlLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICBATnVsbGFibGUKLSAgICBwdWJsaWMgUm91dGVDb250cm9sbGVyIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKEBOb25OdWxsIFN0cmluZyByb3V0ZUlkLAotICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIHJvdXRlR3JvdXBJZCkgewotICAgICAgICBpZiAocm91dGVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUlkIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJvdXRlR3JvdXBJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUdyb3VwSWQgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIocm91dGVJZCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRGVzY3JpYmVzIHByb3BlcnRpZXMgb2YgdGhlIHJvdXRlIHByb3ZpZGVyJ3MgaW1wbGVtZW50YXRpb24uCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQcm92aWRlck1ldGFkYXRhIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb21wb25lbnROYW1lIG1Db21wb25lbnROYW1lOwotCi0gICAgICAgIFByb3ZpZGVyTWV0YWRhdGEoQ29tcG9uZW50TmFtZSBjb21wb25lbnROYW1lKSB7Ci0gICAgICAgICAgICBpZiAoY29tcG9uZW50TmFtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tcG9uZW50TmFtZSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgcHJvdmlkZXIncyBwYWNrYWdlIG5hbWUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db21wb25lbnROYW1lLmdldFBhY2thZ2VOYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgcHJvdmlkZXIncyBjb21wb25lbnQgbmFtZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBDb21wb25lbnROYW1lIGdldENvbXBvbmVudE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbXBvbmVudE5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiAiUHJvdmlkZXJNZXRhZGF0YXsgY29tcG9uZW50TmFtZT0iCi0gICAgICAgICAgICAgICAgICAgICsgbUNvbXBvbmVudE5hbWUuZmxhdHRlblRvU2hvcnRTdHJpbmcoKSArICIgfSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm92aWRlcyBjb250cm9sIG92ZXIgYSBwYXJ0aWN1bGFyIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoZSBtZWRpYSByb3V0ZXIgb2J0YWlucyBhIHJvdXRlIGNvbnRyb2xsZXIgZm9yIGEgcm91dGUgd2hlbmV2ZXIgaXQgbmVlZHMKLSAgICAgKiB0byBjb250cm9sIGEgcm91dGUuICBXaGVuIGEgcm91dGUgaXMgc2VsZWN0ZWQsIHRoZSBtZWRpYSByb3V0ZXIgaW52b2tlcwotICAgICAqIHRoZSB7QGxpbmsgI29uU2VsZWN0fSBtZXRob2Qgb2YgaXRzIHJvdXRlIGNvbnRyb2xsZXIuICBXaGlsZSBzZWxlY3RlZCwKLSAgICAgKiB0aGUgbWVkaWEgcm91dGVyIG1heSBjYWxsIG90aGVyIG1ldGhvZHMgb2YgdGhlIHJvdXRlIGNvbnRyb2xsZXIgdG8KLSAgICAgKiByZXF1ZXN0IHRoYXQgaXQgcGVyZm9ybSBjZXJ0YWluIGFjdGlvbnMgdG8gdGhlIHJvdXRlLiAgV2hlbiBhIHJvdXRlIGlzCi0gICAgICogdW5zZWxlY3RlZCwgdGhlIG1lZGlhIHJvdXRlciBpbnZva2VzIHRoZSB7QGxpbmsgI29uVW5zZWxlY3R9IG1ldGhvZCBvZiBpdHMKLSAgICAgKiByb3V0ZSBjb250cm9sbGVyLiAgV2hlbiB0aGUgbWVkaWEgcm91dGUgbm8gbG9uZ2VyIG5lZWRzIHRoZSByb3V0ZSBjb250cm9sbGVyCi0gICAgICogaXQgd2lsbCBpbnZva2UgdGhlIHtAbGluayAjb25SZWxlYXNlfSBtZXRob2QgdG8gYWxsb3cgdGhlIHJvdXRlIGNvbnRyb2xsZXIKLSAgICAgKiB0byBmcmVlIGl0cyByZXNvdXJjZXMuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZXJlIG1heSBiZSBtdWx0aXBsZSByb3V0ZSBjb250cm9sbGVycyBzaW11bHRhbmVvdXNseSBhY3RpdmUgZm9yIHRoZQotICAgICAqIHNhbWUgcm91dGUuICBFYWNoIHJvdXRlIGNvbnRyb2xsZXIgd2lsbCBiZSByZWxlYXNlZCBzZXBhcmF0ZWx5LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBbGwgb3BlcmF0aW9ucyBvbiB0aGUgcm91dGUgY29udHJvbGxlciBhcmUgYXN5bmNocm9ub3VzIGFuZAotICAgICAqIHJlc3VsdHMgYXJlIGNvbW11bmljYXRlZCB2aWEgY2FsbGJhY2tzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFJvdXRlQ29udHJvbGxlciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBSZWxlYXNlcyB0aGUgcm91dGUgY29udHJvbGxlciwgYWxsb3dpbmcgaXQgdG8gZnJlZSBpdHMgcmVzb3VyY2VzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25SZWxlYXNlKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNlbGVjdHMgdGhlIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25TZWxlY3QoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVW5zZWxlY3RzIHRoZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVW5zZWxlY3QoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogVW5zZWxlY3RzIHRoZSByb3V0ZSBhbmQgcHJvdmlkZXMgYSByZWFzb24uIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uCi0gICAgICAgICAqIGNhbGxzIHtAbGluayAjb25VbnNlbGVjdCgpfS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSByZWFzb24gcHJvdmlkZWQgd2lsbCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAgICAgICAgICogPHVsPgotICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9VTktOT1dOfTwvbGk+Ci0gICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX0RJU0NPTk5FQ1RFRH08L2xpPgotICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9TVE9QUEVEfTwvbGk+Ci0gICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUR9PC9saT4KLSAgICAgICAgICogPC91bD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJlYXNvbiBUaGUgcmVhc29uIGZvciB1bnNlbGVjdGluZyB0aGUgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblVuc2VsZWN0KGludCByZWFzb24pIHsKLSAgICAgICAgICAgIG9uVW5zZWxlY3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXF1ZXN0cyB0byBzZXQgdGhlIHZvbHVtZSBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB2b2x1bWUgVGhlIG5ldyB2b2x1bWUgdmFsdWUgYmV0d2VlbiAwIGFuZCB7QGxpbmsgTWVkaWFSb3V0ZURlc2NyaXB0b3IjZ2V0Vm9sdW1lTWF4fS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2V0Vm9sdW1lKGludCB2b2x1bWUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXF1ZXN0cyBhbiBpbmNyZW1lbnRhbCB2b2x1bWUgdXBkYXRlIGZvciB0aGUgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkZWx0YSBUaGUgZGVsdGEgdG8gYWRkIHRvIHRoZSBjdXJyZW50IHZvbHVtZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVXBkYXRlVm9sdW1lKGludCBkZWx0YSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBlcmZvcm1zIGEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSByZXF1ZXN0Ci0gICAgICAgICAqIGFzeW5jaHJvbm91c2x5IG9uIGJlaGFsZiBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpbnRlbnQgQSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fS4KLSAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIEEge0BsaW5rIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2t9IHRvIGludm9rZSB3aXRoIHRoZSByZXN1bHQKLSAgICAgICAgICogb2YgdGhlIHJlcXVlc3QsIG9yIG51bGwgaWYgbm8gcmVzdWx0IGlzIHJlcXVpcmVkLgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNvbnRyb2xsZXIgaW50ZW5kcyB0byBoYW5kbGUgdGhlIHJlcXVlc3QgYW5kIHdpbGwKLSAgICAgICAgICogaW52b2tlIHRoZSBjYWxsYmFjayB3aGVuIGZpbmlzaGVkLiAgRmFsc2UgaWYgdGhlIGNvbnRyb2xsZXIgd2lsbCBub3QKLSAgICAgICAgICogaGFuZGxlIHRoZSByZXF1ZXN0IGFuZCB3aWxsIG5vdCBpbnZva2UgdGhlIGNhbGxiYWNrLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25Db250cm9sUmVxdWVzdChJbnRlbnQgaW50ZW50LCBATnVsbGFibGUgQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGJhY2sgd2hpY2ggaXMgaW52b2tlZCB3aGVuIHJvdXRlIGluZm9ybWF0aW9uIGJlY29tZXMgYXZhaWxhYmxlIG9yIGNoYW5nZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDYWxsYmFjayB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBpbmZvcm1hdGlvbiBhYm91dCBhIHJvdXRlIHByb3ZpZGVyIGFuZCBpdHMgcm91dGVzIGNoYW5nZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBwcm92aWRlciBUaGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgdGhhdCBjaGFuZ2VkLCBuZXZlciBudWxsLgotICAgICAgICAgKiBAcGFyYW0gZGVzY3JpcHRvciBUaGUgbmV3IG1lZGlhIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzY3JpcHRvckNoYW5nZWQoQE5vbk51bGwgTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyLAotICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUHJvdmlkZXJIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgICAgIFByb3ZpZGVySGFuZGxlcigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU0dfREVMSVZFUl9ERVNDUklQVE9SX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJEZXNjcmlwdG9yQ2hhbmdlZCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19ERUxJVkVSX0RJU0NPVkVSWV9SRVFVRVNUX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGRlbGl2ZXJEaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjFjZTA5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBEZXNjcmliZXMgdGhlIHN0YXRlIG9mIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgYW5kIHRoZSByb3V0ZXMgdGhhdCBpdCBwdWJsaXNoZXMuCi0gKiA8cD4KLSAqIFRoaXMgb2JqZWN0IGlzIGltbXV0YWJsZSBvbmNlIGNyZWF0ZWQgdXNpbmcgYSB7QGxpbmsgQnVpbGRlcn0gaW5zdGFuY2UuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1JPVVRFUyA9ICJyb3V0ZXMiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLSAgICBwcml2YXRlIExpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+IG1Sb3V0ZXM7Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IoQnVuZGxlIGJ1bmRsZSwgTGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gcm91dGVzKSB7Ci0gICAgICAgIG1CdW5kbGUgPSBidW5kbGU7Ci0gICAgICAgIG1Sb3V0ZXMgPSByb3V0ZXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbGlzdCBvZiBhbGwgcm91dGVzIHRoYXQgdGhpcyBwcm92aWRlciBoYXMgcHVibGlzaGVkLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPiBnZXRSb3V0ZXMoKSB7Ci0gICAgICAgIGVuc3VyZVJvdXRlcygpOwotICAgICAgICByZXR1cm4gbVJvdXRlczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5zdXJlUm91dGVzKCkgewotICAgICAgICBpZiAobVJvdXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8QnVuZGxlPiByb3V0ZUJ1bmRsZXMgPSBtQnVuZGxlLjxCdW5kbGU+Z2V0UGFyY2VsYWJsZUFycmF5TGlzdChLRVlfUk9VVEVTKTsKLSAgICAgICAgICAgIGlmIChyb3V0ZUJ1bmRsZXMgPT0gbnVsbCB8fCByb3V0ZUJ1bmRsZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlcyA9IENvbGxlY3Rpb25zLjxNZWRpYVJvdXRlRGVzY3JpcHRvcj5lbXB0eUxpc3QoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gcm91dGVCdW5kbGVzLnNpemUoKTsKLSAgICAgICAgICAgICAgICBtUm91dGVzID0gbmV3IEFycmF5TGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4oY291bnQpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBtUm91dGVzLmFkZChNZWRpYVJvdXRlRGVzY3JpcHRvci5mcm9tQnVuZGxlKHJvdXRlQnVuZGxlcy5nZXQoaSkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IgYW5kIGFsbCBvZiB0aGUgcm91dGVzIHRoYXQKLSAgICAgKiBpdCBjb250YWlucyBoYXZlIGFsbCBvZiB0aGUgcmVxdWlyZWQgZmllbGRzLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgdmVyaWZpY2F0aW9uIGlzIGRlZXAuICBJZiB0aGUgcHJvdmlkZXIgZGVzY3JpcHRvciBpcyBrbm93biB0byBiZQotICAgICAqIHZhbGlkIHRoZW4gaXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjYWxsIHtAbGluayAjaXNWYWxpZH0gb24gZWFjaCBvZiBpdHMgcm91dGVzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICBlbnN1cmVSb3V0ZXMoKTsKLSAgICAgICAgZmluYWwgaW50IHJvdXRlQ291bnQgPSBtUm91dGVzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3V0ZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVEZXNjcmlwdG9yIHJvdXRlID0gbVJvdXRlcy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAocm91dGUgPT0gbnVsbCB8fCAhcm91dGUuaXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvcnsgIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoInJvdXRlcz0iKS5hcHBlbmQoCi0gICAgICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKGdldFJvdXRlcygpLnRvQXJyYXkoKSkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGlzVmFsaWQ9IikuYXBwZW5kKGlzVmFsaWQoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiB9Iik7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIGJ1bmRsZSBmb3Igc2VyaWFsaXphdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgcmVwcmVzZW50ZWQgYXMgYSBidW5kbGUuCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSBhc0J1bmRsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmcm9tIGEgYnVuZGxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHJldHVybiBUaGUgbmV3IGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBidW5kbGUgd2FzIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gYnVuZGxlICE9IG51bGwgPyBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvcihidW5kbGUsIG51bGwpIDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBtZWRpYSByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yc30uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLSAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+IG1Sb3V0ZXM7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgbWVkaWEgcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciBidWlsZGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoKSB7Ci0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yIGJ1aWxkZXIgd2hvc2UgaW5pdGlhbCBjb250ZW50cyBhcmUKLSAgICAgICAgICogY29waWVkIGZyb20gYW4gZXhpc3RpbmcgZGVzY3JpcHRvci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImRlc2NyaXB0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZShkZXNjcmlwdG9yLm1CdW5kbGUpOwotCi0gICAgICAgICAgICBkZXNjcmlwdG9yLmVuc3VyZVJvdXRlcygpOwotICAgICAgICAgICAgaWYgKCFkZXNjcmlwdG9yLm1Sb3V0ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+KGRlc2NyaXB0b3IubVJvdXRlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkcyBhIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkUm91dGUoTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGUgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVJvdXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+KCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1Sb3V0ZXMuY29udGFpbnMocm91dGUpKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGUgZGVzY3JpcHRvciBhbHJlYWR5IGFkZGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUm91dGVzLmFkZChyb3V0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIGEgbGlzdCBvZiByb3V0ZXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRSb3V0ZXMoQ29sbGVjdGlvbjxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gcm91dGVzKSB7Ci0gICAgICAgICAgICBpZiAocm91dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZXMgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXJvdXRlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKE1lZGlhUm91dGVEZXNjcmlwdG9yIHJvdXRlIDogcm91dGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZFJvdXRlKHJvdXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBsaXN0IG9mIHJvdXRlcy4KLSAgICAgICAgICovCi0gICAgICAgIEJ1aWxkZXIgc2V0Um91dGVzKENvbGxlY3Rpb248TWVkaWFSb3V0ZURlc2NyaXB0b3I+IHJvdXRlcykgewotICAgICAgICAgICAgaWYgKHJvdXRlcyA9PSBudWxsIHx8IHJvdXRlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVzID0gbnVsbDsKLSAgICAgICAgICAgICAgICBtQnVuZGxlLnJlbW92ZShLRVlfUk9VVEVTKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8Pihyb3V0ZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQnVpbGRzIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBtZWRpYSByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yfS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGJ1aWxkKCkgewotICAgICAgICAgICAgaWYgKG1Sb3V0ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1Sb3V0ZXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIEFycmF5TGlzdDxCdW5kbGU+IHJvdXRlQnVuZGxlcyA9IG5ldyBBcnJheUxpc3Q8QnVuZGxlPihjb3VudCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJvdXRlQnVuZGxlcy5hZGQobVJvdXRlcy5nZXQoaSkuYXNCdW5kbGUoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1CdW5kbGUucHV0UGFyY2VsYWJsZUFycmF5TGlzdChLRVlfUk9VVEVTLCByb3V0ZUJ1bmRsZXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yKG1CdW5kbGUsIG1Sb3V0ZXMpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlclByb3RvY29sLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiZTkzNDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlclByb3RvY29sLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NlbmdlcjsKLQotLyoqCi0gKiBEZWZpbmVzIHRoZSBjb21tdW5pY2F0aW9uIHByb3RvY29sIGZvciBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlcy4KLSAqLwotYWJzdHJhY3QgY2xhc3MgTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wgewotICAgIC8qKgotICAgICAqIFRoZSB7QGxpbmsgSW50ZW50fSB0aGF0IG11c3QgYmUgZGVjbGFyZWQgYXMgaGFuZGxlZCBieSB0aGUgc2VydmljZS4KLSAgICAgKiBQdXQgdGhpcyBpbiB5b3VyIG1hbmlmZXN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfSU5URVJGQUNFID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UiOwotCi0gICAgLyoKLSAgICAgKiBNZXNzYWdlcyBzZW50IGZyb20gdGhlIGNsaWVudCB0byB0aGUgc2VydmljZS4KLSAgICAgKiBETyBOT1QgUkVOVU1CRVIgVEhFU0UhCi0gICAgICovCi0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBSZWdpc3RlciBjbGllbnQuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiBjbGllbnQgdmVyc2lvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfUkVHSVNURVIgPSAxOwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogVW5yZWdpc3RlciBjbGllbnQuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1VOUkVHSVNURVIgPSAyOwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogQ3JlYXRlIHJvdXRlIGNvbnRyb2xsZXIuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiByb3V0ZSBjb250cm9sbGVyIGlkCi0gICAgICogLSBDTElFTlRfREFUQV9ST1VURV9JRCA6IHJvdXRlIGlkIHN0cmluZwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfQ1JFQVRFX1JPVVRFX0NPTlRST0xMRVIgPSAzOwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogUmVsZWFzZSByb3V0ZSBjb250cm9sbGVyLgotICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBhcmcyICAgIDogcm91dGUgY29udHJvbGxlciBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfUkVMRUFTRV9ST1VURV9DT05UUk9MTEVSID0gNDsKLQotICAgIC8qKiAoY2xpZW50IHYxKQotICAgICAqIFNlbGVjdCByb3V0ZS4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gYXJnMiAgICA6IHJvdXRlIGNvbnRyb2xsZXIgaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1NFTEVDVF9ST1VURSA9IDU7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBVbnNlbGVjdCByb3V0ZS4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gYXJnMiAgICA6IHJvdXRlIGNvbnRyb2xsZXIgaWQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1VOU0VMRUNUX1JPVVRFID0gNjsKLQotICAgIC8qKiAoY2xpZW50IHYxKQotICAgICAqIFNldCByb3V0ZSB2b2x1bWUuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiByb3V0ZSBjb250cm9sbGVyIGlkCi0gICAgICogLSBDTElFTlRfREFUQV9WT0xVTUUgOiB2b2x1bWUgaW50ZWdlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfU0VUX1JPVVRFX1ZPTFVNRSA9IDc7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBVcGRhdGUgcm91dGUgdm9sdW1lLgotICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBhcmcyICAgIDogcm91dGUgY29udHJvbGxlciBpZAotICAgICAqIC0gQ0xJRU5UX0RBVEFfVk9MVU1FIDogdm9sdW1lIGRlbHRhIGludGVnZXIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1VQREFURV9ST1VURV9WT0xVTUUgPSA4OwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogUm91dGUgY29udHJvbCByZXF1ZXN0LgotICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBhcmcyICAgIDogcm91dGUgY29udHJvbGxlciBpZAotICAgICAqIC0gb2JqICAgICA6IG1lZGlhIGNvbnRyb2wgaW50ZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19ST1VURV9DT05UUk9MX1JFUVVFU1QgPSA5OwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogU2V0cyB0aGUgZGlzY292ZXJ5IHJlcXVlc3QuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIG9iaiAgICAgOiBkaXNjb3ZlcnkgcmVxdWVzdCBidW5kbGUsIG9yIG51bGwgaWYgbm9uZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfU0VUX0RJU0NPVkVSWV9SRVFVRVNUID0gMTA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfREFUQV9ST1VURV9JRCA9ICJyb3V0ZUlkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfREFUQV9ST1VURV9MSUJSQVJZX0dST1VQID0gInJvdXRlR3JvdXBJZCI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX0RBVEFfVk9MVU1FID0gInZvbHVtZSI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ0xJRU5UX0RBVEFfVU5TRUxFQ1RfUkVBU09OID0gInVuc2VsZWN0UmVhc29uIjsKLQotICAgIC8qCi0gICAgICogTWVzc2FnZXMgc2VudCBmcm9tIHRoZSBzZXJ2aWNlIHRvIHRoZSBjbGllbnQuCi0gICAgICogRE8gTk9UIFJFTlVNQkVSIFRIRVNFIQotICAgICAqLwotCi0gICAgLyoqIChzZXJ2aWNlIHYxKQotICAgICAqIEdlbmVyaWMgZmFpbHVyZSBzZW50IGluIHJlc3BvbnNlIHRvIGFueSB1bnJlY29nbml6ZWQgb3IgbWFsZm9ybWVkIHJlcXVlc3QuCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfTVNHX0dFTkVSSUNfRkFJTFVSRSA9IDA7Ci0KLSAgICAvKiogKHNlcnZpY2UgdjEpCi0gICAgICogR2VuZXJpYyBmYWlsdXJlIHNlbnQgaW4gcmVzcG9uc2UgdG8gYSBzdWNjZXNzZnVsIG1lc3NhZ2UuCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfTVNHX0dFTkVSSUNfU1VDQ0VTUyA9IDE7Ci0KLSAgICAvKiogKHNlcnZpY2UgdjEpCi0gICAgICogUmVnaXN0cmF0aW9uIHN1Y2NlZWRlZC4KLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBhcmcyICAgIDogc2VydmVyIHZlcnNpb24KLSAgICAgKiAtIG9iaiAgICAgOiByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yIGJ1bmRsZSwgb3IgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfTVNHX1JFR0lTVEVSRUQgPSAyOwotCi0gICAgLyoqIChzZXJ2aWNlIHYxKQotICAgICAqIFJvdXRlIGNvbnRyb2wgcmVxdWVzdCBzdWNjZXNzIHJlc3VsdC4KLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBvYmogICAgIDogcmVzdWx0IGRhdGEgYnVuZGxlLCBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX1NVQ0NFRURFRCA9IDM7Ci0KLSAgICAvKiogKHNlcnZpY2UgdjEpCi0gICAgICogUm91dGUgY29udHJvbCByZXF1ZXN0IGZhaWx1cmUgcmVzdWx0LgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIG9iaiAgICAgOiByZXN1bHQgZGF0YSBidW5kbGUsIG9yIG51bGwKLSAgICAgKiAtIFNFUlZJQ0VfREFUQV9FUlJPUjogZXJyb3IgbWVzc2FnZQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9GQUlMRUQgPSA0OwotCi0gICAgLyoqIChzZXJ2aWNlIHYxKQotICAgICAqIFJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IgY2hhbmdlZC4gICh1bnNvbGljaXRlZCBldmVudCkKLSAgICAgKiAtIGFyZzEgICAgOiByZXNlcnZlZCAoMCkKLSAgICAgKiAtIG9iaiAgICAgOiByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yIGJ1bmRsZSwgb3IgbnVsbAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfTVNHX0RFU0NSSVBUT1JfQ0hBTkdFRCA9IDU7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBTRVJWSUNFX0RBVEFfRVJST1IgPSAiZXJyb3IiOwotCi0gICAgLyoKLSAgICAgKiBSZWNvZ25pemVkIGNsaWVudCB2ZXJzaW9uIG51bWJlcnMuICAoUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuKQotICAgICAqIERPIE5PVCBSRU5VTUJFUiBUSEVTRSEKLSAgICAgKi8KLQotICAgIC8qKgotICAgICAqIFRoZSBjbGllbnQgdmVyc2lvbiB1c2VkIGZyb20gdGhlIGJlZ2lubmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfVkVSU0lPTl8xID0gMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjbGllbnQgdmVyc2lvbiB1c2VkIGZyb20gc3VwcG9ydCBsaWJyYXJ5IHYyNC4xLjAuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX1ZFUlNJT05fMiA9IDI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgY3VycmVudCBjbGllbnQgdmVyc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfVkVSU0lPTl9DVVJSRU5UID0gQ0xJRU5UX1ZFUlNJT05fMjsKLQotICAgIC8qCi0gICAgICogUmVjb2duaXplZCBzZXJ2ZXIgdmVyc2lvbiBudW1iZXJzLiAgKFJlc2VydmVkIGZvciBmdXR1cmUgdXNlLikKLSAgICAgKiBETyBOT1QgUkVOVU1CRVIgVEhFU0UhCi0gICAgICovCi0KLSAgICAvKioKLSAgICAgKiBUaGUgc2VydmljZSB2ZXJzaW9uIHVzZWQgZnJvbSB0aGUgYmVnaW5uaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfVkVSU0lPTl8xID0gMTsKLQotICAgIC8qKgotICAgICAqIFRoZSBjdXJyZW50IHNlcnZpY2UgdmVyc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX1ZFUlNJT05fQ1VSUkVOVCA9IFNFUlZJQ0VfVkVSU0lPTl8xOwotCi0gICAgc3RhdGljIGZpbmFsIGludCBDTElFTlRfVkVSU0lPTl9TVEFSVCA9IENMSUVOVF9WRVJTSU9OXzE7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIG1lc3NlbmdlciBvYmplY3QgaXMgdmFsaWQuCi0gICAgICogPHA+Ci0gICAgICogVGhlIG1lc3NlbmdlciBjb25zdHJ1Y3RvciBhbmQgdW5wYXJjZWxpbmcgY29kZSBkb2VzIG5vdCBjaGVjayB3aGV0aGVyIHRoZQotICAgICAqIHByb3ZpZGVkIElCaW5kZXIgaXMgYSB2YWxpZCBJTWVzc2VuZ2VyIG9iamVjdC4gIEFzIGEgcmVzdWx0LCBpdCdzIHBvc3NpYmxlCi0gICAgICogZm9yIGEgcGVlciB0byBzZW5kIGFuIGludmFsaWQgSUJpbmRlciB0aGF0IHdpbGwgcmVzdWx0IGluIGNyYXNoZXMgZG93bnN0cmVhbS4KLSAgICAgKiBUaGlzIG1ldGhvZCBjaGVja3MgdGhhdCB0aGUgbWVzc2VuZ2VyIGlzIGluIGEgdmFsaWQgc3RhdGUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkUmVtb3RlTWVzc2VuZ2VyKE1lc3NlbmdlciBtZXNzZW5nZXIpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJldHVybiBtZXNzZW5nZXIgIT0gbnVsbCAmJiBtZXNzZW5nZXIuZ2V0QmluZGVyKCkgIT0gbnVsbDsKLSAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vIElmIHRoZSBtZXNzZW5nZXIgd2FzIGNvbnN0cnVjdGVkIHdpdGggYSBiaW5kZXIgaW50ZXJmYWNlIG90aGVyIHRoYW4KLSAgICAgICAgICAgIC8vIElNZXNzZW5nZXIgdGhlbiB0aGUgY2FsbCB0byBnZXRCaW5kZXIoKSB3aWxsIGNyYXNoIHdpdGggYW4gTlBFLgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlclNlcnZpY2UuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzY2RlMTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlclNlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfREFUQV9ST1VURV9JRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX0RBVEFfUk9VVEVfTElCUkFSWV9HUk9VUDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX0RBVEFfVU5TRUxFQ1RfUkVBU09OOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9EQVRBX1ZPTFVNRTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19DUkVBVEVfUk9VVEVfQ09OVFJPTExFUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfTVNHX1JFR0lTVEVSOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1JFTEVBU0VfUk9VVEVfQ09OVFJPTExFUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19ST1VURV9DT05UUk9MX1JFUVVFU1Q7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX01TR19TRUxFQ1RfUk9VVEU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfU0VUX0RJU0NPVkVSWV9SRVFVRVNUOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1NFVF9ST1VURV9WT0xVTUU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX01TR19VTlJFR0lTVEVSOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1VOU0VMRUNUX1JPVVRFOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1VQREFURV9ST1VURV9WT0xVTUU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX1ZFUlNJT05fMTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX0RBVEFfRVJST1I7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9GQUlMRUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9TVUNDRUVERUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0RFU0NSSVBUT1JfQ0hBTkdFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfR0VORVJJQ19GQUlMVVJFOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5TRVJWSUNFX01TR19HRU5FUklDX1NVQ0NFU1M7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuU0VSVklDRV9NU0dfUkVHSVNURVJFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX1ZFUlNJT05fQ1VSUkVOVDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5pc1ZhbGlkUmVtb3RlTWVzc2VuZ2VyOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuU2VydmljZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuRGVhZE9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlci5EZWF0aFJlY2lwaWVudDsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzZW5nZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uVmlzaWJsZUZvclRlc3Rpbmc7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnV0aWwuT2JqZWN0c0NvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi0vKioKLSAqIEJhc2UgY2xhc3MgZm9yIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2VzLgotICogPHA+Ci0gKiBBIG1lZGlhIHJvdXRlciB3aWxsIGJpbmQgdG8gbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZXMgd2hlbiBhIGNhbGxiYWNrIGlzIGFkZGVkIHZpYQotICoge0BsaW5rIE1lZGlhUm91dGVyI2FkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciwgTWVkaWFSb3V0ZXIuQ2FsbGJhY2ssIGludCl9IHdpdGggYSBkaXNjb3ZlcnkKLSAqIGZsYWc6IHtAbGluayBNZWRpYVJvdXRlciNDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZfSwKLSAqIHtAbGluayBNZWRpYVJvdXRlciNDQUxMQkFDS19GTEFHX0ZPUkNFX0RJU0NPVkVSWX0sIG9yCi0gKiB7QGxpbmsgTWVkaWFSb3V0ZXIjQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOfSwgYW5kIHdpbGwgdW5iaW5kIHdoZW4gdGhlIGNhbGxiYWNrCi0gKiBpcyByZW1vdmVkIHZpYSB7QGxpbmsgTWVkaWFSb3V0ZXIjcmVtb3ZlQ2FsbGJhY2soTWVkaWFSb3V0ZXIuQ2FsbGJhY2spfS4KLSAqIDwvcD48cD4KLSAqIFRvIGltcGxlbWVudCB5b3VyIG93biBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlLCBleHRlbmQgdGhpcyBjbGFzcyBhbmQKLSAqIG92ZXJyaWRlIHRoZSB7QGxpbmsgI29uQ3JlYXRlTWVkaWFSb3V0ZVByb3ZpZGVyfSBtZXRob2QgdG8gcmV0dXJuIGFuCi0gKiBpbnN0YW5jZSBvZiB5b3VyIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJ9LgotICogPC9wPjxwPgotICogRGVjbGFyZSB5b3VyIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2UgaW4geW91ciBhcHBsaWNhdGlvbiBtYW5pZmVzdAotICogbGlrZSB0aGlzOgotICogPC9wPgotICogPHByZT4KLSAqICAgJmx0O3NlcnZpY2UgYW5kcm9pZDpuYW1lPSIuTXlNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlIgotICogICAgICAgICAgIGFuZHJvaWQ6bGFiZWw9IkBzdHJpbmcvbXlfbWVkaWFfcm91dGVfcHJvdmlkZXJfc2VydmljZSI+Ci0gKiAgICAgICAmbHQ7aW50ZW50LWZpbHRlcj4KLSAqICAgICAgICAgICAmbHQ7YWN0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlIiAvPgotICogICAgICAgJmx0Oy9pbnRlbnQtZmlsdGVyPgotICogICAmbHQ7L3NlcnZpY2U+Ci0gKiA8L3ByZT4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UgZXh0ZW5kcyBTZXJ2aWNlIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlUHJvdmlkZXJTcnYiOyAvLyBtYXguIDIzIGNoYXJzCi0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxDbGllbnRSZWNvcmQ+IG1DbGllbnRzID0gbmV3IEFycmF5TGlzdDxDbGllbnRSZWNvcmQ+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBSZWNlaXZlSGFuZGxlciBtUmVjZWl2ZUhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZXNzZW5nZXIgbVJlY2VpdmVNZXNzZW5nZXI7Ci0gICAgZmluYWwgUHJpdmF0ZUhhbmRsZXIgbVByaXZhdGVIYW5kbGVyOwotICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXJDYWxsYmFjayBtUHJvdmlkZXJDYWxsYmFjazsKLQotICAgIE1lZGlhUm91dGVQcm92aWRlciBtUHJvdmlkZXI7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBtQ29tcG9zaXRlRGlzY292ZXJ5UmVxdWVzdDsKLQotICAgIC8qKgotICAgICAqIFRoZSB7QGxpbmsgSW50ZW50fSB0aGF0IG11c3QgYmUgZGVjbGFyZWQgYXMgaGFuZGxlZCBieSB0aGUgc2VydmljZS4KLSAgICAgKiBQdXQgdGhpcyBpbiB5b3VyIG1hbmlmZXN0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfSU5URVJGQUNFID0gTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuU0VSVklDRV9JTlRFUkZBQ0U7Ci0KLSAgICAvKgotICAgICAqIFByaXZhdGUgbWVzc2FnZXMgdXNlZCBpbnRlcm5hbGx5LiAgKFllcywgeW91IGNhbiByZW51bWJlciB0aGVzZS4pCi0gICAgICovCi0KLSAgICBzdGF0aWMgZmluYWwgaW50IFBSSVZBVEVfTVNHX0NMSUVOVF9ESUVEID0gMTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlKCkgewotICAgICAgICBtUmVjZWl2ZUhhbmRsZXIgPSBuZXcgUmVjZWl2ZUhhbmRsZXIodGhpcyk7Ci0gICAgICAgIG1SZWNlaXZlTWVzc2VuZ2VyID0gbmV3IE1lc3NlbmdlcihtUmVjZWl2ZUhhbmRsZXIpOwotICAgICAgICBtUHJpdmF0ZUhhbmRsZXIgPSBuZXcgUHJpdmF0ZUhhbmRsZXIoKTsKLSAgICAgICAgbVByb3ZpZGVyQ2FsbGJhY2sgPSBuZXcgUHJvdmlkZXJDYWxsYmFjaygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgc3lzdGVtIHdoZW4gaXQgaXMgdGltZSB0byBjcmVhdGUgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgb2ZmZXJlZCBieSB0aGlzIHNlcnZpY2UsIG9yIG51bGwgaWYKLSAgICAgKiB0aGlzIHNlcnZpY2UgaGFzIGRlY2lkZWQgbm90IHRvIG9mZmVyIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IE1lZGlhUm91dGVQcm92aWRlciBvbkNyZWF0ZU1lZGlhUm91dGVQcm92aWRlcigpOwotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgb2ZmZXJlZCBieSB0aGlzIHNlcnZpY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBvZmZlcmVkIGJ5IHRoaXMgc2VydmljZSwgb3IgbnVsbCBpZgotICAgICAqIGl0IGhhcyBub3QgeWV0IGJlZW4gY3JlYXRlZC4KLSAgICAgKgotICAgICAqIEBzZWUgI29uQ3JlYXRlTWVkaWFSb3V0ZVByb3ZpZGVyKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVByb3ZpZGVyIGdldE1lZGlhUm91dGVQcm92aWRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1Qcm92aWRlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmQoSW50ZW50IGludGVudCkgewotICAgICAgICBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhTRVJWSUNFX0lOVEVSRkFDRSkpIHsKLSAgICAgICAgICAgIGlmIChtUHJvdmlkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlciA9IG9uQ3JlYXRlTWVkaWFSb3V0ZVByb3ZpZGVyKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3ZpZGVyUGFja2FnZSA9IHByb3ZpZGVyLmdldE1ldGFkYXRhKCkuZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFwcm92aWRlclBhY2thZ2UuZXF1YWxzKGdldFBhY2thZ2VOYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJvbkNyZWF0ZU1lZGlhUm91dGVQcm92aWRlcigpIHJldHVybmVkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYSBwcm92aWRlciB3aG9zZSBwYWNrYWdlIG5hbWUgZG9lcyBub3QgbWF0Y2ggdGhlIHBhY2thZ2UgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJuYW1lIG9mIHRoZSBzZXJ2aWNlLiAgQSBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlIGNhbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm9ubHkgZXhwb3J0IGl0cyBvd24gbWVkaWEgcm91dGUgcHJvdmlkZXJzLiAgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJQcm92aWRlciBwYWNrYWdlIG5hbWU6ICIgKyBwcm92aWRlclBhY2thZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLiAgU2VydmljZSBwYWNrYWdlIG5hbWU6ICIgKyBnZXRQYWNrYWdlTmFtZSgpICsgIi4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtUHJvdmlkZXIgPSBwcm92aWRlcjsKLSAgICAgICAgICAgICAgICAgICAgbVByb3ZpZGVyLnNldENhbGxiYWNrKG1Qcm92aWRlckNhbGxiYWNrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbVJlY2VpdmVNZXNzZW5nZXIuZ2V0QmluZGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25VbmJpbmQoSW50ZW50IGludGVudCkgewotICAgICAgICBpZiAobVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Qcm92aWRlci5zZXRDYWxsYmFjayhudWxsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIub25VbmJpbmQoaW50ZW50KTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uUmVnaXN0ZXJDbGllbnQoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwgaW50IHZlcnNpb24pIHsKLSAgICAgICAgaWYgKHZlcnNpb24gPj0gQ0xJRU5UX1ZFUlNJT05fMSkgewotICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZENsaWVudChtZXNzZW5nZXIpOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBuZXcgQ2xpZW50UmVjb3JkKG1lc3NlbmdlciwgdmVyc2lvbik7Ci0gICAgICAgICAgICAgICAgaWYgKGNsaWVudC5yZWdpc3RlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DbGllbnRzLmFkZChjbGllbnQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUmVnaXN0ZXJlZCwgdmVyc2lvbj0iICsgdmVyc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RJZCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBtUHJvdmlkZXIuZ2V0RGVzY3JpcHRvcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFJlcGx5KG1lc3NlbmdlciwgU0VSVklDRV9NU0dfUkVHSVNURVJFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLCBTRVJWSUNFX1ZFUlNJT05fQ1VSUkVOVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRGVzY3JpcHRvckJ1bmRsZUZvckNsaWVudFZlcnNpb24oZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQubVZlcnNpb24pLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25VbnJlZ2lzdGVyQ2xpZW50KE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQpIHsKLSAgICAgICAgaW50IGluZGV4ID0gZmluZENsaWVudChtZXNzZW5nZXIpOwotICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgQ2xpZW50UmVjb3JkIGNsaWVudCA9IG1DbGllbnRzLnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFVucmVnaXN0ZXJlZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xpZW50LmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCBvbkJpbmRlckRpZWQoTWVzc2VuZ2VyIG1lc3NlbmdlcikgewotICAgICAgICBpbnQgaW5kZXggPSBmaW5kQ2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gbUNsaWVudHMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogQmluZGVyIGRpZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsaWVudC5kaXNwb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBib29sZWFuIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBpbnQgY29udHJvbGxlcklkLCBTdHJpbmcgcm91dGVJZCwgU3RyaW5nIHJvdXRlR3JvdXBJZCkgewotICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGNsaWVudC5jcmVhdGVSb3V0ZUNvbnRyb2xsZXIocm91dGVJZCwgcm91dGVHcm91cElkLCBjb250cm9sbGVySWQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgY29udHJvbGxlciBjcmVhdGVkLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgcm91dGVJZD0iICsgcm91dGVJZCArICIsIHJvdXRlR3JvdXBJZD0iICsgcm91dGVHcm91cElkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VuZEdlbmVyaWNTdWNjZXNzKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBvblJlbGVhc2VSb3V0ZUNvbnRyb2xsZXIoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwKLSAgICAgICAgICAgIGludCBjb250cm9sbGVySWQpIHsKLSAgICAgICAgQ2xpZW50UmVjb3JkIGNsaWVudCA9IGdldENsaWVudChtZXNzZW5nZXIpOwotICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjbGllbnQucmVsZWFzZVJvdXRlQ29udHJvbGxlcihjb250cm9sbGVySWQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgY29udHJvbGxlciByZWxlYXNlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VuZEdlbmVyaWNTdWNjZXNzKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBvblNlbGVjdFJvdXRlKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBpbnQgY29udHJvbGxlcklkKSB7Ci0gICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQotICAgICAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Um91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udHJvbGxlci5vblNlbGVjdCgpOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIHNlbGVjdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kR2VuZXJpY1N1Y2Nlc3MobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uVW5zZWxlY3RSb3V0ZShNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLAotICAgICAgICAgICAgaW50IGNvbnRyb2xsZXJJZCwgaW50IHJlYXNvbikgewotICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0KLSAgICAgICAgICAgICAgICAgICAgY2xpZW50LmdldFJvdXRlQ29udHJvbGxlcihjb250cm9sbGVySWQpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25VbnNlbGVjdChyZWFzb24pOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIHVuc2VsZWN0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25TZXRSb3V0ZVZvbHVtZShNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLAotICAgICAgICAgICAgaW50IGNvbnRyb2xsZXJJZCwgaW50IHZvbHVtZSkgewotICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0KLSAgICAgICAgICAgICAgICAgICAgY2xpZW50LmdldFJvdXRlQ29udHJvbGxlcihjb250cm9sbGVySWQpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25TZXRWb2x1bWUodm9sdW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSb3V0ZSB2b2x1bWUgY2hhbmdlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkICsgIiwgdm9sdW1lPSIgKyB2b2x1bWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kR2VuZXJpY1N1Y2Nlc3MobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uVXBkYXRlUm91dGVWb2x1bWUoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwKLSAgICAgICAgICAgIGludCBjb250cm9sbGVySWQsIGludCBkZWx0YSkgewotICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0KLSAgICAgICAgICAgICAgICAgICAgY2xpZW50LmdldFJvdXRlQ29udHJvbGxlcihjb250cm9sbGVySWQpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25VcGRhdGVWb2x1bWUoZGVsdGEpOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIHZvbHVtZSB1cGRhdGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQgKyAiLCBkZWx0YT0iICsgZGVsdGEpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kR2VuZXJpY1N1Y2Nlc3MobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uUm91dGVDb250cm9sUmVxdWVzdChmaW5hbCBNZXNzZW5nZXIgbWVzc2VuZ2VyLCBmaW5hbCBpbnQgcmVxdWVzdElkLAotICAgICAgICAgICAgZmluYWwgaW50IGNvbnRyb2xsZXJJZCwgZmluYWwgSW50ZW50IGludGVudCkgewotICAgICAgICBmaW5hbCBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0KLSAgICAgICAgICAgICAgICAgICAgY2xpZW50LmdldFJvdXRlQ29udHJvbGxlcihjb250cm9sbGVySWQpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2sgPSBudWxsOwotICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0SWQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayA9IG5ldyBNZWRpYVJvdXRlci5Db250cm9sUmVxdWVzdENhbGxiYWNrKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIGNvbnRyb2wgcmVxdWVzdCBzdWNjZWVkZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaW50ZW50PSIgKyBpbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGRhdGE9IiArIGRhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluZENsaWVudChtZXNzZW5nZXIpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFJlcGx5KG1lc3NlbmdlciwgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX1NVQ0NFRURFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsIDAsIGRhdGEsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKFN0cmluZyBlcnJvciwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSb3V0ZSBjb250cm9sIHJlcXVlc3QgZmFpbGVkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGludGVudD0iICsgaW50ZW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBlcnJvcj0iICsgZXJyb3IgKyAiLCBkYXRhPSIgKyBkYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmRDbGllbnQobWVzc2VuZ2VyKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhTRVJWSUNFX0RBVEFfRVJST1IsIGVycm9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRSZXBseShtZXNzZW5nZXIsIFNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9GQUlMRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCwgMCwgZGF0YSwgYnVuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRSZXBseShtZXNzZW5nZXIsIFNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9GQUlMRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCwgMCwgZGF0YSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVyLm9uQ29udHJvbFJlcXVlc3QoaW50ZW50LCBjYWxsYmFjaykpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIGNvbnRyb2wgcmVxdWVzdCBkZWxpdmVyZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQgKyAiLCBpbnRlbnQ9IiArIGludGVudCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uU2V0RGlzY292ZXJ5UmVxdWVzdChNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLAotICAgICAgICAgICAgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYm9vbGVhbiBhY3R1YWxseUNoYW5nZWQgPSBjbGllbnQuc2V0RGlzY292ZXJ5UmVxdWVzdChyZXF1ZXN0KTsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogU2V0IGRpc2NvdmVyeSByZXF1ZXN0LCByZXF1ZXN0PSIgKyByZXF1ZXN0Ci0gICAgICAgICAgICAgICAgICAgICAgICArICIsIGFjdHVhbGx5Q2hhbmdlZD0iICsgYWN0dWFsbHlDaGFuZ2VkCi0gICAgICAgICAgICAgICAgICAgICAgICArICIsIGNvbXBvc2l0ZURpc2NvdmVyeVJlcXVlc3Q9IiArIG1Db21wb3NpdGVEaXNjb3ZlcnlSZXF1ZXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCBzZW5kRGVzY3JpcHRvckNoYW5nZWQoTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DbGllbnRzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gbUNsaWVudHMuZ2V0KGkpOwotICAgICAgICAgICAgc2VuZFJlcGx5KGNsaWVudC5tTWVzc2VuZ2VyLCBTRVJWSUNFX01TR19ERVNDUklQVE9SX0NIQU5HRUQsIDAsIDAsCi0gICAgICAgICAgICAgICAgICAgIGNyZWF0ZURlc2NyaXB0b3JCdW5kbGVGb3JDbGllbnRWZXJzaW9uKGRlc2NyaXB0b3IsIGNsaWVudC5tVmVyc2lvbiksIG51bGwpOwotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBTZW50IGRlc2NyaXB0b3IgY2hhbmdlIGV2ZW50LCBkZXNjcmlwdG9yPSIgKyBkZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHN0YXRpYyBCdW5kbGUgY3JlYXRlRGVzY3JpcHRvckJ1bmRsZUZvckNsaWVudFZlcnNpb24oTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yLAotICAgICAgICAgICAgaW50IGNsaWVudFZlcnNpb24pIHsKLSAgICAgICAgaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIgPQotICAgICAgICAgICAgICAgIG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLkJ1aWxkZXIoZGVzY3JpcHRvcik7Ci0gICAgICAgIGJ1aWxkZXIuc2V0Um91dGVzKG51bGwpOwotICAgICAgICBmb3IgKE1lZGlhUm91dGVEZXNjcmlwdG9yIHJvdXRlIDogZGVzY3JpcHRvci5nZXRSb3V0ZXMoKSkgewotICAgICAgICAgICAgaWYgKGNsaWVudFZlcnNpb24gPj0gcm91dGUuZ2V0TWluQ2xpZW50VmVyc2lvbigpCi0gICAgICAgICAgICAgICAgICAgICYmIGNsaWVudFZlcnNpb24gPD0gcm91dGUuZ2V0TWF4Q2xpZW50VmVyc2lvbigpKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hZGRSb3V0ZShyb3V0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKS5hc0J1bmRsZSgpOwotICAgIH0KLQotICAgIGJvb2xlYW4gdXBkYXRlQ29tcG9zaXRlRGlzY292ZXJ5UmVxdWVzdCgpIHsKLSAgICAgICAgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgY29tcG9zaXRlID0gbnVsbDsKLSAgICAgICAgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIgc2VsZWN0b3JCdWlsZGVyID0gbnVsbDsKLSAgICAgICAgYm9vbGVhbiBhY3RpdmVTY2FuID0gZmFsc2U7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DbGllbnRzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0ID0gbUNsaWVudHMuZ2V0KGkpLm1EaXNjb3ZlcnlSZXF1ZXN0OwotICAgICAgICAgICAgaWYgKHJlcXVlc3QgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiAoIXJlcXVlc3QuZ2V0U2VsZWN0b3IoKS5pc0VtcHR5KCkgfHwgcmVxdWVzdC5pc0FjdGl2ZVNjYW4oKSkpIHsKLSAgICAgICAgICAgICAgICBhY3RpdmVTY2FuIHw9IHJlcXVlc3QuaXNBY3RpdmVTY2FuKCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbXBvc2l0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZSA9IHJlcXVlc3Q7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlbGVjdG9yQnVpbGRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RvckJ1aWxkZXIgPSBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIoY29tcG9zaXRlLmdldFNlbGVjdG9yKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yQnVpbGRlci5hZGRTZWxlY3RvcihyZXF1ZXN0LmdldFNlbGVjdG9yKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoc2VsZWN0b3JCdWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbXBvc2l0ZSA9IG5ldyBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdChzZWxlY3RvckJ1aWxkZXIuYnVpbGQoKSwgYWN0aXZlU2Nhbik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFPYmplY3RzQ29tcGF0LmVxdWFscyhtQ29tcG9zaXRlRGlzY292ZXJ5UmVxdWVzdCwgY29tcG9zaXRlKSkgewotICAgICAgICAgICAgbUNvbXBvc2l0ZURpc2NvdmVyeVJlcXVlc3QgPSBjb21wb3NpdGU7Ci0gICAgICAgICAgICBtUHJvdmlkZXIuc2V0RGlzY292ZXJ5UmVxdWVzdChjb21wb3NpdGUpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgQ2xpZW50UmVjb3JkIGdldENsaWVudChNZXNzZW5nZXIgbWVzc2VuZ2VyKSB7Ci0gICAgICAgIGludCBpbmRleCA9IGZpbmRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgcmV0dXJuIGluZGV4ID49IDAgPyBtQ2xpZW50cy5nZXQoaW5kZXgpIDogbnVsbDsKLSAgICB9Ci0KLSAgICBpbnQgZmluZENsaWVudChNZXNzZW5nZXIgbWVzc2VuZ2VyKSB7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1DbGllbnRzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gbUNsaWVudHMuZ2V0KGkpOwotICAgICAgICAgICAgaWYgKGNsaWVudC5oYXNNZXNzZW5nZXIobWVzc2VuZ2VyKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBzZW5kR2VuZXJpY0ZhaWx1cmUoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCkgewotICAgICAgICBpZiAocmVxdWVzdElkICE9IDApIHsKLSAgICAgICAgICAgIHNlbmRSZXBseShtZXNzZW5nZXIsIFNFUlZJQ0VfTVNHX0dFTkVSSUNfRkFJTFVSRSwgcmVxdWVzdElkLCAwLCBudWxsLCBudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgc2VuZEdlbmVyaWNTdWNjZXNzKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQpIHsKLSAgICAgICAgaWYgKHJlcXVlc3RJZCAhPSAwKSB7Ci0gICAgICAgICAgICBzZW5kUmVwbHkobWVzc2VuZ2VyLCBTRVJWSUNFX01TR19HRU5FUklDX1NVQ0NFU1MsIHJlcXVlc3RJZCwgMCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgdm9pZCBzZW5kUmVwbHkoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHdoYXQsCi0gICAgICAgICAgICBpbnQgcmVxdWVzdElkLCBpbnQgYXJnLCBPYmplY3Qgb2JqLCBCdW5kbGUgZGF0YSkgewotICAgICAgICBNZXNzYWdlIG1zZyA9IE1lc3NhZ2Uub2J0YWluKCk7Ci0gICAgICAgIG1zZy53aGF0ID0gd2hhdDsKLSAgICAgICAgbXNnLmFyZzEgPSByZXF1ZXN0SWQ7Ci0gICAgICAgIG1zZy5hcmcyID0gYXJnOwotICAgICAgICBtc2cub2JqID0gb2JqOwotICAgICAgICBtc2cuc2V0RGF0YShkYXRhKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG1lc3Nlbmdlci5zZW5kKG1zZyk7Ci0gICAgICAgIH0gY2F0Y2ggKERlYWRPYmplY3RFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIC8vIFRoZSBjbGllbnQgZGllZC4KLSAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3Qgc2VuZCBtZXNzYWdlIHRvICIgKyBnZXRDbGllbnRJZChtZXNzZW5nZXIpLCBleCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGdldENsaWVudElkKE1lc3NlbmdlciBtZXNzZW5nZXIpIHsKLSAgICAgICAgcmV0dXJuICJDbGllbnQgY29ubmVjdGlvbiAiICsgbWVzc2VuZ2VyLmdldEJpbmRlcigpLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBQcml2YXRlSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgewotICAgICAgICBQcml2YXRlSGFuZGxlcigpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1zZy53aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBQUklWQVRFX01TR19DTElFTlRfRElFRDoKLSAgICAgICAgICAgICAgICAgICAgb25CaW5kZXJEaWVkKChNZXNzZW5nZXIpbXNnLm9iaik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBQcm92aWRlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZVByb3ZpZGVyLkNhbGxiYWNrIHsKLSAgICAgICAgUHJvdmlkZXJDYWxsYmFjaygpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkRlc2NyaXB0b3JDaGFuZ2VkKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlciwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIHNlbmREZXNjcmlwdG9yQ2hhbmdlZChkZXNjcmlwdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQ2xpZW50UmVjb3JkIGltcGxlbWVudHMgRGVhdGhSZWNpcGllbnQgewotICAgICAgICBwdWJsaWMgZmluYWwgTWVzc2VuZ2VyIG1NZXNzZW5nZXI7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBpbnQgbVZlcnNpb247Ci0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBtRGlzY292ZXJ5UmVxdWVzdDsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIFNwYXJzZUFycmF5PE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXI+IG1Db250cm9sbGVycyA9Ci0gICAgICAgICAgICAgICAgbmV3IFNwYXJzZUFycmF5PE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXI+KCk7Ci0KLSAgICAgICAgcHVibGljIENsaWVudFJlY29yZChNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgdmVyc2lvbikgewotICAgICAgICAgICAgbU1lc3NlbmdlciA9IG1lc3NlbmdlcjsKLSAgICAgICAgICAgIG1WZXJzaW9uID0gdmVyc2lvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHJlZ2lzdGVyKCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtTWVzc2VuZ2VyLmdldEJpbmRlcigpLmxpbmtUb0RlYXRoKHRoaXMsIDApOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyRGllZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgICAgIGludCBjb3VudCA9IG1Db250cm9sbGVycy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBtQ29udHJvbGxlcnMudmFsdWVBdChpKS5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Db250cm9sbGVycy5jbGVhcigpOwotCi0gICAgICAgICAgICBtTWVzc2VuZ2VyLmdldEJpbmRlcigpLnVubGlua1RvRGVhdGgodGhpcywgMCk7Ci0KLSAgICAgICAgICAgIHNldERpc2NvdmVyeVJlcXVlc3QobnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNNZXNzZW5nZXIoTWVzc2VuZ2VyIG90aGVyKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1lc3Nlbmdlci5nZXRCaW5kZXIoKSA9PSBvdGhlci5nZXRCaW5kZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGNyZWF0ZVJvdXRlQ29udHJvbGxlcihTdHJpbmcgcm91dGVJZCwgU3RyaW5nIHJvdXRlR3JvdXBJZCwKLSAgICAgICAgICAgICAgICBpbnQgY29udHJvbGxlcklkKSB7Ci0gICAgICAgICAgICBpZiAobUNvbnRyb2xsZXJzLmluZGV4T2ZLZXkoY29udHJvbGxlcklkKSA8IDApIHsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPSByb3V0ZUdyb3VwSWQgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgPyBtUHJvdmlkZXIub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIocm91dGVJZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIDogbVByb3ZpZGVyLm9uQ3JlYXRlUm91dGVDb250cm9sbGVyKHJvdXRlSWQsIHJvdXRlR3JvdXBJZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtQ29udHJvbGxlcnMucHV0KGNvbnRyb2xsZXJJZCwgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHJlbGVhc2VSb3V0ZUNvbnRyb2xsZXIoaW50IGNvbnRyb2xsZXJJZCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0gbUNvbnRyb2xsZXJzLmdldChjb250cm9sbGVySWQpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db250cm9sbGVycy5yZW1vdmUoY29udHJvbGxlcklkKTsKLSAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIgZ2V0Um91dGVDb250cm9sbGVyKGludCBjb250cm9sbGVySWQpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbGxlcnMuZ2V0KGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZXREaXNjb3ZlcnlSZXF1ZXN0KE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgICAgIGlmICghT2JqZWN0c0NvbXBhdC5lcXVhbHMobURpc2NvdmVyeVJlcXVlc3QsIHJlcXVlc3QpKSB7Ci0gICAgICAgICAgICAgICAgbURpc2NvdmVyeVJlcXVlc3QgPSByZXF1ZXN0OwotICAgICAgICAgICAgICAgIHJldHVybiB1cGRhdGVDb21wb3NpdGVEaXNjb3ZlcnlSZXF1ZXN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBSdW5zIG9uIGEgYmluZGVyIHRocmVhZC4KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGJpbmRlckRpZWQoKSB7Ci0gICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIub2J0YWluTWVzc2FnZShQUklWQVRFX01TR19DTElFTlRfRElFRCwgbU1lc3Nlbmdlcikuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDbGllbnRJZChtTWVzc2VuZ2VyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXIgdGhhdCByZWNlaXZlcyBtZXNzYWdlcyBmcm9tIGNsaWVudHMuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpbm5lciBjbGFzcyBpcyBzdGF0aWMgYW5kIG9ubHkgcmV0YWlucyBhIHdlYWsgcmVmZXJlbmNlIHRvIHRoZSBzZXJ2aWNlCi0gICAgICogdG8gcHJldmVudCB0aGUgc2VydmljZSBmcm9tIGJlaW5nIGxlYWtlZCBpbiBjYXNlIG9uZSBvZiB0aGUgY2xpZW50cyBpcyBob2xkaW5nIGFuCi0gICAgICogYWN0aXZlIHJlZmVyZW5jZSB0byB0aGUgc2VydmVyJ3MgbWVzc2VuZ2VyLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGhhbmRsZXIgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGhhbmRsZSBhbnkgbWVzc2FnZXMgb3RoZXIgdGhhbiB0aG9zZQotICAgICAqIHRoYXQgY29tZSBmcm9tIHRoZSBjbGllbnQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlY2VpdmVIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlPiBtU2VydmljZVJlZjsKLQotICAgICAgICBwdWJsaWMgUmVjZWl2ZUhhbmRsZXIoTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZSBzZXJ2aWNlKSB7Ci0gICAgICAgICAgICBtU2VydmljZVJlZiA9IG5ldyBXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2U+KHNlcnZpY2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lc3NlbmdlciBtZXNzZW5nZXIgPSBtc2cucmVwbHlUbzsKLSAgICAgICAgICAgIGlmIChpc1ZhbGlkUmVtb3RlTWVzc2VuZ2VyKG1lc3NlbmdlcikpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2hhdCA9IG1zZy53aGF0OwotICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXF1ZXN0SWQgPSBtc2cuYXJnMTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYXJnID0gbXNnLmFyZzI7Ci0gICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IG9iaiA9IG1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgZmluYWwgQnVuZGxlIGRhdGEgPSBtc2cucGVla0RhdGEoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3NNZXNzYWdlKHdoYXQsIG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcsIG9iaiwgZGF0YSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGdldENsaWVudElkKG1lc3NlbmdlcikgKyAiOiBNZXNzYWdlIGZhaWxlZCwgd2hhdD0iICsgd2hhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHJlcXVlc3RJZD0iICsgcmVxdWVzdElkICsgIiwgYXJnPSIgKyBhcmcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBvYmo9IiArIG9iaiArICIsIGRhdGE9IiArIGRhdGEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNlbmRHZW5lcmljRmFpbHVyZShtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiSWdub3JpbmcgbWVzc2FnZSB3aXRob3V0IHZhbGlkIHJlcGx5IG1lc3Nlbmdlci4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoaW50IHdoYXQsCi0gICAgICAgICAgICAgICAgTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwgaW50IGFyZywgT2JqZWN0IG9iaiwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2Ugc2VydmljZSA9IG1TZXJ2aWNlUmVmLmdldCgpOwotICAgICAgICAgICAgaWYgKHNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAod2hhdCkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfUkVHSVNURVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblJlZ2lzdGVyQ2xpZW50KG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcpOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19VTlJFR0lTVEVSOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25VbnJlZ2lzdGVyQ2xpZW50KG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfQ1JFQVRFX1JPVVRFX0NPTlRST0xMRVI6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyByb3V0ZUlkID0gZGF0YS5nZXRTdHJpbmcoQ0xJRU5UX0RBVEFfUk9VVEVfSUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJvdXRlR3JvdXBJZCA9IGRhdGEuZ2V0U3RyaW5nKENMSUVOVF9EQVRBX1JPVVRFX0xJQlJBUllfR1JPVVApOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uQ3JlYXRlUm91dGVDb250cm9sbGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZywgcm91dGVJZCwgcm91dGVHcm91cElkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDTElFTlRfTVNHX1JFTEVBU0VfUk9VVEVfQ09OVFJPTExFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uUmVsZWFzZVJvdXRlQ29udHJvbGxlcihtZXNzZW5nZXIsIHJlcXVlc3RJZCwgYXJnKTsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfU0VMRUNUX1JPVVRFOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25TZWxlY3RSb3V0ZShtZXNzZW5nZXIsIHJlcXVlc3RJZCwgYXJnKTsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfVU5TRUxFQ1RfUk9VVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmVhc29uID0gZGF0YSA9PSBudWxsID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1VOS05PV04KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkYXRhLmdldEludChDTElFTlRfREFUQV9VTlNFTEVDVF9SRUFTT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1VOS05PV04pOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25VbnNlbGVjdFJvdXRlKG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcsIHJlYXNvbik7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDTElFTlRfTVNHX1NFVF9ST1VURV9WT0xVTUU6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB2b2x1bWUgPSBkYXRhLmdldEludChDTElFTlRfREFUQV9WT0xVTUUsIC0xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2x1bWUgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uU2V0Um91dGVWb2x1bWUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzZW5nZXIsIHJlcXVlc3RJZCwgYXJnLCB2b2x1bWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfVVBEQVRFX1JPVVRFX1ZPTFVNRTogewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbHRhID0gZGF0YS5nZXRJbnQoQ0xJRU5UX0RBVEFfVk9MVU1FLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25VcGRhdGVSb3V0ZVZvbHVtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcsIGRlbHRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDTElFTlRfTVNHX1JPVVRFX0NPTlRST0xfUkVRVUVTVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBJbnRlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblJvdXRlQ29udHJvbFJlcXVlc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzZW5nZXIsIHJlcXVlc3RJZCwgYXJnLCAoSW50ZW50KW9iaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfU0VUX0RJU0NPVkVSWV9SRVFVRVNUOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwgfHwgb2JqIGluc3RhbmNlb2YgQnVuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdC5mcm9tQnVuZGxlKChCdW5kbGUpb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblNldERpc2NvdmVyeVJlcXVlc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzZW5nZXIsIHJlcXVlc3RJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgIT0gbnVsbCAmJiByZXF1ZXN0LmlzVmFsaWQoKSA/IHJlcXVlc3QgOiBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlU2VsZWN0b3IuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlU2VsZWN0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY2OWIxOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVNlbGVjdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBjYXBhYmlsaXRpZXMgb2Ygcm91dGVzIHRoYXQgYXBwbGljYXRpb25zIHdvdWxkIGxpa2UgdG8gZGlzY292ZXIgYW5kIHVzZS4KLSAqIDxwPgotICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZCB1c2luZyBhIHtAbGluayBCdWlsZGVyfSBpbnN0YW5jZS4KLSAqIDwvcD4KLSAqCi0gKiA8aDM+RXhhbXBsZTwvaDM+Ci0gKiA8cHJlPgotICogTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yQnVpbGRlciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcigpCi0gKiAgICAgICAgIC5hZGRDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfVklERU8pCi0gKiAgICAgICAgIC5hZGRDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSykKLSAqICAgICAgICAgLmJ1aWxkKCk7Ci0gKgotICogTWVkaWFSb3V0ZXIgcm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoY29udGV4dCk7Ci0gKiByb3V0ZXIuYWRkQ2FsbGJhY2soc2VsZWN0b3IsIGNhbGxiYWNrLCBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZKTsKLSAqIDwvcHJlPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZVNlbGVjdG9yIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05UUk9MX0NBVEVHT1JJRVMgPSAiY29udHJvbENhdGVnb3JpZXMiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLSAgICBMaXN0PFN0cmluZz4gbUNvbnRyb2xDYXRlZ29yaWVzOwotCi0gICAgLyoqCi0gICAgICogQW4gZW1wdHkgbWVkaWEgcm91dGUgc2VsZWN0b3IgdGhhdCB3aWxsIG5vdCBtYXRjaCBhbnkgcm91dGVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWVkaWFSb3V0ZVNlbGVjdG9yIEVNUFRZID0gbmV3IE1lZGlhUm91dGVTZWxlY3RvcihuZXcgQnVuZGxlKCksIG51bGwpOwotCi0gICAgTWVkaWFSb3V0ZVNlbGVjdG9yKEJ1bmRsZSBidW5kbGUsIExpc3Q8U3RyaW5nPiBjb250cm9sQ2F0ZWdvcmllcykgewotICAgICAgICBtQnVuZGxlID0gYnVuZGxlOwotICAgICAgICBtQ29udHJvbENhdGVnb3JpZXMgPSBjb250cm9sQ2F0ZWdvcmllczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBjYXRlZ29yaWVzfSBpbiB0aGUgc2VsZWN0b3IuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIGNhdGVnb3JpZXMuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRDb250cm9sQ2F0ZWdvcmllcygpIHsKLSAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgcmV0dXJuIG1Db250cm9sQ2F0ZWdvcmllczsKLSAgICB9Ci0KLSAgICB2b2lkIGVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCkgewotICAgICAgICBpZiAobUNvbnRyb2xDYXRlZ29yaWVzID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Db250cm9sQ2F0ZWdvcmllcyA9IG1CdW5kbGUuZ2V0U3RyaW5nQXJyYXlMaXN0KEtFWV9DT05UUk9MX0NBVEVHT1JJRVMpOwotICAgICAgICAgICAgaWYgKG1Db250cm9sQ2F0ZWdvcmllcyA9PSBudWxsIHx8IG1Db250cm9sQ2F0ZWdvcmllcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtQ29udHJvbENhdGVnb3JpZXMgPSBDb2xsZWN0aW9ucy48U3RyaW5nPmVtcHR5TGlzdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3RvciBjb250YWlucyB0aGUgc3BlY2lmaWVkIGNhdGVnb3J5LgotICAgICAqCi0gICAgICogQHBhcmFtIGNhdGVnb3J5IFRoZSBjYXRlZ29yeSB0byBjaGVjay4KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGNhdGVnb3J5IGlzIHByZXNlbnQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ29udHJvbENhdGVnb3J5KFN0cmluZyBjYXRlZ29yeSkgewotICAgICAgICBpZiAoY2F0ZWdvcnkgIT0gbnVsbCkgewotICAgICAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBjYXRlZ29yeUNvdW50ID0gbUNvbnRyb2xDYXRlZ29yaWVzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2F0ZWdvcnlDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Db250cm9sQ2F0ZWdvcmllcy5nZXQoaSkuZXF1YWxzKGNhdGVnb3J5KSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VsZWN0b3IgbWF0Y2hlcyBhdCBsZWFzdCBvbmUgb2YgdGhlIHNwZWNpZmllZCBjb250cm9sIGZpbHRlcnMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZmlsdGVycyBUaGUgbGlzdCBvZiBjb250cm9sIGZpbHRlcnMgdG8gY29uc2lkZXIuCi0gICAgICogQHJldHVybiBUcnVlIGlmIGEgbWF0Y2ggaXMgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlc0NvbnRyb2xGaWx0ZXJzKExpc3Q8SW50ZW50RmlsdGVyPiBmaWx0ZXJzKSB7Ci0gICAgICAgIGlmIChmaWx0ZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY2F0ZWdvcnlDb3VudCA9IG1Db250cm9sQ2F0ZWdvcmllcy5zaXplKCk7Ci0gICAgICAgICAgICBpZiAoY2F0ZWdvcnlDb3VudCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGZpbHRlckNvdW50ID0gZmlsdGVycy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWx0ZXJDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIEludGVudEZpbHRlciBmaWx0ZXIgPSBmaWx0ZXJzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGNhdGVnb3J5Q291bnQ7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWx0ZXIuaGFzQ2F0ZWdvcnkobUNvbnRyb2xDYXRlZ29yaWVzLmdldChqKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBzZWxlY3RvciBjb250YWlucyBhbGwgb2YgdGhlIGNhcGFiaWxpdGllcyBkZXNjcmliZWQKLSAgICAgKiBieSB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBzZWxlY3RvciB0byBiZSBleGFtaW5lZC4KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyBzZWxlY3RvciBjb250YWlucyBhbGwgb2YgdGhlIGNhcGFiaWxpdGllcyBkZXNjcmliZWQKLSAgICAgKiBieSB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgewotICAgICAgICBpZiAoc2VsZWN0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgICAgIHNlbGVjdG9yLmVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbnRyb2xDYXRlZ29yaWVzLmNvbnRhaW5zQWxsKHNlbGVjdG9yLm1Db250cm9sQ2F0ZWdvcmllcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VsZWN0b3IgZG9lcyBub3Qgc3BlY2lmeSBhbnkgY2FwYWJpbGl0aWVzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0gICAgICAgIGVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgIHJldHVybiBtQ29udHJvbENhdGVnb3JpZXMuaXNFbXB0eSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2VsZWN0b3IgaGFzIGFsbCBvZiB0aGUgcmVxdWlyZWQgZmllbGRzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgICAgIGVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgIGlmIChtQ29udHJvbENhdGVnb3JpZXMuY29udGFpbnMobnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICAgICAgaWYgKG8gaW5zdGFuY2VvZiBNZWRpYVJvdXRlU2VsZWN0b3IpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVTZWxlY3RvciBvdGhlciA9IChNZWRpYVJvdXRlU2VsZWN0b3IpbzsKLSAgICAgICAgICAgIGVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgICAgICBvdGhlci5lbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sQ2F0ZWdvcmllcy5lcXVhbHMob3RoZXIubUNvbnRyb2xDYXRlZ29yaWVzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgcmV0dXJuIG1Db250cm9sQ2F0ZWdvcmllcy5oYXNoQ29kZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiTWVkaWFSb3V0ZVNlbGVjdG9yeyAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiY29udHJvbENhdGVnb3JpZXM9IikuYXBwZW5kKAotICAgICAgICAgICAgICAgIEFycmF5cy50b1N0cmluZyhnZXRDb250cm9sQ2F0ZWdvcmllcygpLnRvQXJyYXkoKSkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgfSIpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBidW5kbGUgZm9yIHNlcmlhbGl6YXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHJlcHJlc2VudGVkIGFzIGEgYnVuZGxlLgotICAgICAqLwotICAgIHB1YmxpYyBCdW5kbGUgYXNCdW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZnJvbSBhIGJ1bmRsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEByZXR1cm4gVGhlIG5ldyBpbnN0YW5jZSwgb3IgbnVsbCBpZiB0aGUgYnVuZGxlIHdhcyBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGZyb21CdW5kbGUoQE51bGxhYmxlIEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZSAhPSBudWxsID8gbmV3IE1lZGlhUm91dGVTZWxlY3RvcihidW5kbGUsIG51bGwpIDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgTWVkaWFSb3V0ZVNlbGVjdG9yIG1lZGlhIHJvdXRlIHNlbGVjdG9yc30uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBBcnJheUxpc3Q8U3RyaW5nPiBtQ29udHJvbENhdGVnb3JpZXM7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgbWVkaWEgcm91dGUgc2VsZWN0b3IgYnVpbGRlci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBzZWxlY3RvciBkZXNjcmlwdG9yIGJ1aWxkZXIgd2hvc2UgaW5pdGlhbCBjb250ZW50cyBhcmUKLSAgICAgICAgICogY29waWVkIGZyb20gYW4gZXhpc3Rpbmcgc2VsZWN0b3IuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlcihATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZWxlY3Rvci5lbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICAgICAgaWYgKCFzZWxlY3Rvci5tQ29udHJvbENhdGVnb3JpZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xDYXRlZ29yaWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KHNlbGVjdG9yLm1Db250cm9sQ2F0ZWdvcmllcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkcyBhIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBjYXRlZ29yeX0gdG8gdGhlIGJ1aWxkZXIuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjYXRlZ29yeSBUaGUgY2F0ZWdvcnkgdG8gYWRkIHRvIHRoZSBzZXQgb2YgZGVzaXJlZCBjYXBhYmlsaXRpZXMsIHN1Y2ggYXMKLSAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX0FVRElPfS4KLSAgICAgICAgICogQHJldHVybiBUaGUgYnVpbGRlciBpbnN0YW5jZSBmb3IgY2hhaW5pbmcuCi0gICAgICAgICAqLwotICAgICAgICBATm9uTnVsbAotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRDb250cm9sQ2F0ZWdvcnkoQE5vbk51bGwgU3RyaW5nIGNhdGVnb3J5KSB7Ci0gICAgICAgICAgICBpZiAoY2F0ZWdvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhdGVnb3J5IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Db250cm9sQ2F0ZWdvcmllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xDYXRlZ29yaWVzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1Db250cm9sQ2F0ZWdvcmllcy5jb250YWlucyhjYXRlZ29yeSkpIHsKLSAgICAgICAgICAgICAgICBtQ29udHJvbENhdGVnb3JpZXMuYWRkKGNhdGVnb3J5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZHMgYSBsaXN0IG9mIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBjYXRlZ29yaWVzfSB0byB0aGUgYnVpbGRlci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNhdGVnb3JpZXMgVGhlIGxpc3QgY2F0ZWdvcmllcyB0byBhZGQgdG8gdGhlIHNldCBvZiBkZXNpcmVkIGNhcGFiaWxpdGllcywKLSAgICAgICAgICogc3VjaCBhcyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfQVVESU99LgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBidWlsZGVyIGluc3RhbmNlIGZvciBjaGFpbmluZy4KLSAgICAgICAgICovCi0gICAgICAgIEBOb25OdWxsCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZENvbnRyb2xDYXRlZ29yaWVzKEBOb25OdWxsIENvbGxlY3Rpb248U3RyaW5nPiBjYXRlZ29yaWVzKSB7Ci0gICAgICAgICAgICBpZiAoY2F0ZWdvcmllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2F0ZWdvcmllcyBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghY2F0ZWdvcmllcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBjYXRlZ29yeSA6IGNhdGVnb3JpZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkQ29udHJvbENhdGVnb3J5KGNhdGVnb3J5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIHRoZSBjb250ZW50cyBvZiBhbiBleGlzdGluZyBtZWRpYSByb3V0ZSBzZWxlY3RvciB0byB0aGUgYnVpbGRlci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciB3aG9zZSBjb250ZW50cyBhcmUgdG8gYmUgYWRkZWQuCi0gICAgICAgICAqIEByZXR1cm4gVGhlIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nLgotICAgICAgICAgKi8KLSAgICAgICAgQE5vbk51bGwKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkU2VsZWN0b3IoQE5vbk51bGwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYWRkQ29udHJvbENhdGVnb3JpZXMoc2VsZWN0b3IuZ2V0Q29udHJvbENhdGVnb3JpZXMoKSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCdWlsZHMgdGhlIHtAbGluayBNZWRpYVJvdXRlU2VsZWN0b3IgbWVkaWEgcm91dGUgc2VsZWN0b3J9LgotICAgICAgICAgKi8KLSAgICAgICAgQE5vbk51bGwKLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVTZWxlY3RvciBidWlsZCgpIHsKLSAgICAgICAgICAgIGlmIChtQ29udHJvbENhdGVnb3JpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBidW5kbGUucHV0U3RyaW5nQXJyYXlMaXN0KEtFWV9DT05UUk9MX0NBVEVHT1JJRVMsIG1Db250cm9sQ2F0ZWdvcmllcyk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVTZWxlY3RvcihidW5kbGUsIG1Db250cm9sQ2F0ZWdvcmllcyk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGIwMDUyZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLkludERlZjsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuQWN0aXZpdHlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZW50UmVzb2x2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRTZW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyLk5hbWVOb3RGb3VuZEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuYXBwLkFjdGl2aXR5TWFuYWdlckNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuaGFyZHdhcmUuZGlzcGxheS5EaXNwbGF5TWFuYWdlckNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuVm9sdW1lUHJvdmlkZXJDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC51dGlsLlBhaXI7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5EaXNwbGF5OwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXIuUHJvdmlkZXJNZXRhZGF0YTsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXI7Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogTWVkaWFSb3V0ZXIgYWxsb3dzIGFwcGxpY2F0aW9ucyB0byBjb250cm9sIHRoZSByb3V0aW5nIG9mIG1lZGlhIGNoYW5uZWxzCi0gKiBhbmQgc3RyZWFtcyBmcm9tIHRoZSBjdXJyZW50IGRldmljZSB0byBleHRlcm5hbCBzcGVha2VycyBhbmQgZGVzdGluYXRpb24gZGV2aWNlcy4KLSAqIDxwPgotICogQSBNZWRpYVJvdXRlciBpbnN0YW5jZSBpcyByZXRyaWV2ZWQgdGhyb3VnaCB7QGxpbmsgI2dldEluc3RhbmNlfS4gIEFwcGxpY2F0aW9ucwotICogY2FuIHF1ZXJ5IHRoZSBtZWRpYSByb3V0ZXIgYWJvdXQgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZSBhbmQgaXRzIGNhcGFiaWxpdGllcwotICogdG8gZGV0ZXJtaW5lIGhvdyB0byBzZW5kIGNvbnRlbnQgdG8gdGhlIHJvdXRlJ3MgZGVzdGluYXRpb24uICBBcHBsaWNhdGlvbnMgY2FuCi0gKiBhbHNvIHtAbGluayBSb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0IHNlbmQgY29udHJvbCByZXF1ZXN0c30gdG8gdGhlIHJvdXRlCi0gKiB0byBhc2sgdGhlIHJvdXRlJ3MgZGVzdGluYXRpb24gdG8gcGVyZm9ybSBjZXJ0YWluIHJlbW90ZSBjb250cm9sIGZ1bmN0aW9ucwotICogc3VjaCBhcyBwbGF5aW5nIG1lZGlhLgotICogPC9wPjxwPgotICogU2VlIGFsc28ge0BsaW5rIE1lZGlhUm91dGVQcm92aWRlcn0gZm9yIGluZm9ybWF0aW9uIG9uIGhvdyBhbiBhcHBsaWNhdGlvbgotICogY2FuIHB1Ymxpc2ggbmV3IG1lZGlhIHJvdXRlcyB0byB0aGUgbWVkaWEgcm91dGVyLgotICogPC9wPjxwPgotICogVGhlIG1lZGlhIHJvdXRlciBBUEkgaXMgbm90IHRocmVhZC1zYWZlOyBhbGwgaW50ZXJhY3Rpb25zIHdpdGggaXQgbXVzdCBiZQotICogZG9uZSBmcm9tIHRoZSBtYWluIHRocmVhZCBvZiB0aGUgcHJvY2Vzcy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVyIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlciI7Ci0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7Ci0KLSAgICAvKioKLSAgICAgKiBQYXNzZWQgdG8ge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyI29uVW5zZWxlY3QoaW50KX0KLSAgICAgKiBhbmQge0BsaW5rIENhbGxiYWNrI29uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyLCBSb3V0ZUluZm8sIGludCl9IHdoZW4gdGhlIHJlYXNvbiB0aGUgcm91dGUKLSAgICAgKiB3YXMgdW5zZWxlY3RlZCBpcyB1bmtub3duLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOU0VMRUNUX1JFQVNPTl9VTktOT1dOID0gMDsKLSAgICAvKioKLSAgICAgKiBQYXNzZWQgdG8ge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyI29uVW5zZWxlY3QoaW50KX0KLSAgICAgKiBhbmQge0BsaW5rIENhbGxiYWNrI29uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyLCBSb3V0ZUluZm8sIGludCl9IHdoZW4gdGhlIHVzZXIgcHJlc3NlZAotICAgICAqIHRoZSBkaXNjb25uZWN0IGJ1dHRvbiB0byBkaXNjb25uZWN0IGFuZCBrZWVwIHBsYXlpbmcuCi0gICAgICogPHA+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVEZXNjcmlwdG9yI2NhbkRpc2Nvbm5lY3RBbmRLZWVwUGxheWluZygpCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TRUxFQ1RfUkVBU09OX0RJU0NPTk5FQ1RFRCA9IDE7Ci0gICAgLyoqCi0gICAgICogUGFzc2VkIHRvIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciNvblVuc2VsZWN0KGludCl9Ci0gICAgICogYW5kIHtAbGluayBDYWxsYmFjayNvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciwgUm91dGVJbmZvLCBpbnQpfSB3aGVuIHRoZSB1c2VyIHByZXNzZWQKLSAgICAgKiB0aGUgc3RvcCBjYXN0aW5nIGJ1dHRvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNFTEVDVF9SRUFTT05fU1RPUFBFRCA9IDI7Ci0gICAgLyoqCi0gICAgICogUGFzc2VkIHRvIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciNvblVuc2VsZWN0KGludCl9Ci0gICAgICogYW5kIHtAbGluayBDYWxsYmFjayNvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciwgUm91dGVJbmZvLCBpbnQpfSB3aGVuIHRoZSB1c2VyIHNlbGVjdGVkCi0gICAgICogYSBkaWZmZXJlbnQgcm91dGUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUQgPSAzOwotCi0gICAgLy8gTWFpbnRhaW5zIGdsb2JhbCBtZWRpYSByb3V0ZXIgc3RhdGUgZm9yIHRoZSBwcm9jZXNzLgotICAgIC8vIFRoaXMgZmllbGQgaXMgaW5pdGlhbGl6ZWQgaW4gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoKSBiZWZvcmUgYW55Ci0gICAgLy8gTWVkaWFSb3V0ZXIgb2JqZWN0cyBhcmUgaW5zdGFudGlhdGVkIHNvIGl0IGlzIGd1YXJhbnRlZWQgdG8gYmUKLSAgICAvLyB2YWxpZCB3aGVuZXZlciBhbnkgaW5zdGFuY2UgbWV0aG9kIGlzIGludm9rZWQuCi0gICAgc3RhdGljIEdsb2JhbE1lZGlhUm91dGVyIHNHbG9iYWw7Ci0KLSAgICAvLyBDb250ZXh0LWJvdW5kIHN0YXRlIG9mIHRoZSBtZWRpYSByb3V0ZXIuCi0gICAgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBmaW5hbCBBcnJheUxpc3Q8Q2FsbGJhY2tSZWNvcmQ+IG1DYWxsYmFja1JlY29yZHMgPSBuZXcgQXJyYXlMaXN0PENhbGxiYWNrUmVjb3JkPigpOwotCi0gICAgQEludERlZihmbGFnID0gdHJ1ZSwKLSAgICAgICAgICAgIHZhbHVlID0gewotICAgICAgICAgICAgICAgICAgICBDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU4sCi0gICAgICAgICAgICAgICAgICAgIENBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlksCi0gICAgICAgICAgICAgICAgICAgIENBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFMKLSAgICAgICAgICAgIH0KLSAgICApCi0gICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQotICAgIHByaXZhdGUgQGludGVyZmFjZSBDYWxsYmFja0ZsYWdzIHt9Ci0KLSAgICAvKioKLSAgICAgKiBGbGFnIGZvciB7QGxpbmsgI2FkZENhbGxiYWNrfTogQWN0aXZlbHkgc2NhbiBmb3Igcm91dGVzIHdoaWxlIHRoaXMgY2FsbGJhY2sKLSAgICAgKiBpcyByZWdpc3RlcmVkLgotICAgICAqIDxwPgotICAgICAqIFdoZW4gdGhpcyBmbGFnIGlzIHNwZWNpZmllZCwgdGhlIG1lZGlhIHJvdXRlciB3aWxsIGFjdGl2ZWx5IHNjYW4gZm9yIG5ldwotICAgICAqIHJvdXRlcy4gIENlcnRhaW4gcm91dGVzLCBzdWNoIGFzIHdpZmkgZGlzcGxheSByb3V0ZXMsIG1heSBub3QgYmUgZGlzY292ZXJhYmxlCi0gICAgICogZXhjZXB0IHdoZW4gYWN0aXZlbHkgc2Nhbm5pbmcuICBUaGlzIGZsYWcgaXMgdHlwaWNhbGx5IHVzZWQgd2hlbiB0aGUgcm91dGUgcGlja2VyCi0gICAgICogZGlhbG9nIGhhcyBiZWVuIG9wZW5lZCBieSB0aGUgdXNlciB0byBlbnN1cmUgdGhhdCB0aGUgcm91dGUgaW5mb3JtYXRpb24gaXMKLSAgICAgKiB1cCB0byBkYXRlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBY3RpdmUgc2Nhbm5pbmcgbWF5IGNvbnN1bWUgYSBzaWduaWZpY2FudCBhbW91bnQgb2YgcG93ZXIgYW5kIG1heSBoYXZlIGludHJ1c2l2ZQotICAgICAqIGVmZmVjdHMgb24gd2lyZWxlc3MgY29ubmVjdGl2aXR5LiAgVGhlcmVmb3JlIGl0IGlzIGltcG9ydGFudCB0aGF0IGFjdGl2ZSBzY2FubmluZwotICAgICAqIG9ubHkgYmUgcmVxdWVzdGVkIHdoZW4gaXQgaXMgYWN0dWFsbHkgbmVlZGVkIHRvIHNhdGlzZnkgYSB1c2VyIHJlcXVlc3QgdG8KLSAgICAgKiBkaXNjb3ZlciBhbmQgc2VsZWN0IGEgbmV3IHJvdXRlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGZsYWcgaW1wbGllcyB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUll9IGJ1dCBwZXJmb3JtaW5nCi0gICAgICogYWN0aXZlIHNjYW5zIGlzIG11Y2ggbW9yZSBleHBlbnNpdmUgdGhhbiBhIG5vcm1hbCBkaXNjb3ZlcnkgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlICNDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOID0gMSA8PCAwOwotCi0gICAgLyoqCi0gICAgICogRmxhZyBmb3Ige0BsaW5rICNhZGRDYWxsYmFja306IERvIG5vdCBmaWx0ZXIgcm91dGUgZXZlbnRzLgotICAgICAqIDxwPgotICAgICAqIFdoZW4gdGhpcyBmbGFnIGlzIHNwZWNpZmllZCwgdGhlIGNhbGxiYWNrIHdpbGwgYmUgaW52b2tlZCBmb3IgZXZlbnRzIHRoYXQgYWZmZWN0IGFueQotICAgICAqIHJvdXRlIGV2ZW4gaWYgdGhleSBkbyBub3QgbWF0Y2ggdGhlIGNhbGxiYWNrJ3MgZmlsdGVyLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTID0gMSA8PCAxOwotCi0gICAgLyoqCi0gICAgICogRmxhZyBmb3Ige0BsaW5rICNhZGRDYWxsYmFja306IFJlcXVlc3QgcGFzc2l2ZSByb3V0ZSBkaXNjb3Zlcnkgd2hpbGUgdGhpcwotICAgICAqIGNhbGxiYWNrIGlzIHJlZ2lzdGVyZWQsIGV4Y2VwdCBvbiB7QGxpbmsgQWN0aXZpdHlNYW5hZ2VyI2lzTG93UmFtRGV2aWNlIGxvdy1SQU0gZGV2aWNlc30uCi0gICAgICogPHA+Ci0gICAgICogV2hlbiB0aGlzIGZsYWcgaXMgc3BlY2lmaWVkLCB0aGUgbWVkaWEgcm91dGVyIHdpbGwgdHJ5IHRvIGRpc2NvdmVyIHJvdXRlcy4KLSAgICAgKiBBbHRob3VnaCByb3V0ZSBkaXNjb3ZlcnkgaXMgaW50ZW5kZWQgdG8gYmUgZWZmaWNpZW50LCBjaGVja2luZyBmb3IgbmV3IHJvdXRlcyBtYXkKLSAgICAgKiByZXN1bHQgaW4gc29tZSBuZXR3b3JrIGFjdGl2aXR5IGFuZCBjb3VsZCBzbG93bHkgZHJhaW4gdGhlIGJhdHRlcnkuICBUaGVyZWZvcmUKLSAgICAgKiBhcHBsaWNhdGlvbnMgc2hvdWxkIG9ubHkgc3BlY2lmeSB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUll9IHdoZW4KLSAgICAgKiB0aGV5IGFyZSBydW5uaW5nIGluIHRoZSBmb3JlZ3JvdW5kIGFuZCB3b3VsZCBsaWtlIHRvIHByb3ZpZGUgdGhlIHVzZXIgd2l0aCB0aGUKLSAgICAgKiBvcHRpb24gb2YgY29ubmVjdGluZyB0byBuZXcgcm91dGVzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBcHBsaWNhdGlvbnMgc2hvdWxkIHR5cGljYWxseSBhZGQgYSBjYWxsYmFjayB1c2luZyB0aGlzIGZsYWcgaW4gdGhlCi0gICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5IGFjdGl2aXR5J3N9IHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblN0YXJ0IG9uU3RhcnR9Ci0gICAgICogbWV0aG9kIGFuZCByZW1vdmUgaXQgaW4gdGhlIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eSNvblN0b3Agb25TdG9wfSBtZXRob2QuCi0gICAgICogVGhlIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjcuYXBwLk1lZGlhUm91dGVEaXNjb3ZlcnlGcmFnbWVudH0gZnJhZ21lbnQgbWF5Ci0gICAgICogYWxzbyBiZSB1c2VkIGZvciB0aGlzIHB1cnBvc2UuCi0gICAgICogPC9wPjxwIGNsYXNzPSJub3RlIj4KLSAgICAgKiBPbiB7QGxpbmsgQWN0aXZpdHlNYW5hZ2VyI2lzTG93UmFtRGV2aWNlIGxvdy1SQU0gZGV2aWNlc30gdGhpcyBmbGFnCi0gICAgICogd2lsbCBiZSBpZ25vcmVkLiAgUmVmZXIgdG8KLSAgICAgKiB7QGxpbmsgI2FkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciwgQ2FsbGJhY2ssIGludCkgYWRkQ2FsbGJhY2t9IGZvciBkZXRhaWxzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgYW5kcm9pZC5zdXBwb3J0LnY3LmFwcC5NZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZID0gMSA8PCAyOwotCi0gICAgLyoqCi0gICAgICogRmxhZyBmb3Ige0BsaW5rICNhZGRDYWxsYmFja306IFJlcXVlc3QgcGFzc2l2ZSByb3V0ZSBkaXNjb3Zlcnkgd2hpbGUgdGhpcwotICAgICAqIGNhbGxiYWNrIGlzIHJlZ2lzdGVyZWQsIGV2ZW4gb24ge0BsaW5rIEFjdGl2aXR5TWFuYWdlciNpc0xvd1JhbURldmljZSBsb3ctUkFNIGRldmljZXN9LgotICAgICAqIDxwIGNsYXNzPSJub3RlIj4KLSAgICAgKiBUaGlzIGZsYWcgaGFzIGEgc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgaW1wYWN0IG9uIGxvdy1SQU0gZGV2aWNlcwotICAgICAqIHNpbmNlIGl0IG1heSBjYXVzZSBtYW55IG1lZGlhIHJvdXRlIHByb3ZpZGVycyB0byBiZSBzdGFydGVkIHNpbXVsdGFuZW91c2x5LgotICAgICAqIEl0IGlzIG11Y2ggYmV0dGVyIHRvIHVzZSB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUll9IGluc3RlYWQgdG8gYXZvaWQKLSAgICAgKiBwZXJmb3JtaW5nIHBhc3NpdmUgZGlzY292ZXJ5IG9uIHRoZXNlIGRldmljZXMgYWx0b2dldGhlci4gIFJlZmVyIHRvCi0gICAgICoge0BsaW5rICNhZGRDYWxsYmFjayhNZWRpYVJvdXRlU2VsZWN0b3IsIENhbGxiYWNrLCBpbnQpIGFkZENhbGxiYWNrfSBmb3IgZGV0YWlscy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlIGFuZHJvaWQuc3VwcG9ydC52Ny5hcHAuTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0FMTEJBQ0tfRkxBR19GT1JDRV9ESVNDT1ZFUlkgPSAxIDw8IDM7Ci0KLSAgICAvKioKLSAgICAgKiBGbGFnIGZvciB7QGxpbmsgI2lzUm91dGVBdmFpbGFibGV9OiBJZ25vcmUgdGhlIGRlZmF1bHQgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBmbGFnIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBtYXRjaGluZyBub24tZGVmYXVsdCByb3V0ZSBpcyBhdmFpbGFibGUuCi0gICAgICogVGhpcyBjb25zdHJhaW50IG1heSBiZSB1c2VkIHRvIGRlY2lkZSB3aGV0aGVyIHRvIG9mZmVyIHRoZSByb3V0ZSBjaG9vc2VyIGRpYWxvZwotICAgICAqIHRvIHRoZSB1c2VyLiAgVGhlcmUgaXMgbm8gcG9pbnQgb2ZmZXJpbmcgdGhlIGNob29zZXIgaWYgdGhlcmUgYXJlIG5vCi0gICAgICogbm9uLWRlZmF1bHQgY2hvaWNlcy4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQVZBSUxBQklMSVRZX0ZMQUdfSUdOT1JFX0RFRkFVTFRfUk9VVEUgPSAxIDw8IDA7Ci0KLSAgICAvKioKLSAgICAgKiBGbGFnIGZvciB7QGxpbmsgI2lzUm91dGVBdmFpbGFibGV9OiBSZXF1aXJlIGFuIGFjdHVhbCByb3V0ZSB0byBiZSBtYXRjaGVkLgotICAgICAqIDxwPgotICAgICAqIElmIHRoaXMgZmxhZyBpcyBub3Qgc2V0LCB0aGVuIHtAbGluayAjaXNSb3V0ZUF2YWlsYWJsZX0gd2lsbCByZXR1cm4gdHJ1ZQotICAgICAqIGlmIGl0IGlzIHBvc3NpYmxlIHRvIGRpc2NvdmVyIGEgbWF0Y2hpbmcgcm91dGUgZXZlbiBpZiBkaXNjb3ZlcnkgaXMgbm90IGluCi0gICAgICogcHJvZ3Jlc3Mgb3IgaWYgbm8gbWF0Y2hpbmcgcm91dGUgaGFzIHlldCBiZWVuIGZvdW5kLiAgVGhpcyBmZWF0dXJlIGlzIHVzZWQgdG8KLSAgICAgKiBzYXZlIHJlc291cmNlcyBieSByZW1vdmluZyB0aGUgbmVlZCB0byBwZXJmb3JtIHBhc3NpdmUgcm91dGUgZGlzY292ZXJ5IG9uCi0gICAgICoge0BsaW5rIEFjdGl2aXR5TWFuYWdlciNpc0xvd1JhbURldmljZSBsb3ctUkFNIGRldmljZXN9LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGVuIHtAbGluayAjaXNSb3V0ZUF2YWlsYWJsZX0gd2lsbCBvbmx5IHJldHVybiB0cnVlIGlmCi0gICAgICogYSBtYXRjaGluZyByb3V0ZSBoYXMgYWN0dWFsbHkgYmVlbiBkaXNjb3ZlcmVkLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVkFJTEFCSUxJVFlfRkxBR19SRVFVSVJFX01BVENIID0gMSA8PCAxOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYW4gaW5zdGFuY2Ugb2YgdGhlIG1lZGlhIHJvdXRlciBzZXJ2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udGV4dC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgYXBwbGljYXRpb24gaXMgcmVzcG9uc2libGUgZm9yIGhvbGRpbmcgYSBzdHJvbmcgcmVmZXJlbmNlIHRvIHRoZSByZXR1cm5lZAotICAgICAqIHtAbGluayBNZWRpYVJvdXRlcn0gaW5zdGFuY2UsIHN1Y2ggYXMgYnkgc3RvcmluZyB0aGUgaW5zdGFuY2UgaW4gYSBmaWVsZCBvZgotICAgICAqIHRoZSB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHl9LCB0byBlbnN1cmUgdGhhdCB0aGUgbWVkaWEgcm91dGVyIHJlbWFpbnMgYWxpdmUKLSAgICAgKiBhcyBsb25nIGFzIHRoZSBhcHBsaWNhdGlvbiBpcyB1c2luZyBpdHMgZmVhdHVyZXMuCi0gICAgICogPC9wPjxwPgotICAgICAqIEluIG90aGVyIHdvcmRzLCB0aGUgc3VwcG9ydCBsaWJyYXJ5IG9ubHkgaG9sZHMgYSB7QGxpbmsgV2Vha1JlZmVyZW5jZSB3ZWFrIHJlZmVyZW5jZX0KLSAgICAgKiB0byBlYWNoIG1lZGlhIHJvdXRlciBpbnN0YW5jZS4gIFdoZW4gdGhlcmUgYXJlIG5vIHJlbWFpbmluZyBzdHJvbmcgcmVmZXJlbmNlcyB0byB0aGUKLSAgICAgKiBtZWRpYSByb3V0ZXIgaW5zdGFuY2UsIGFsbCBvZiBpdHMgY2FsbGJhY2tzIHdpbGwgYmUgcmVtb3ZlZCBhbmQgcm91dGUgZGlzY292ZXJ5Ci0gICAgICogd2lsbCBubyBsb25nZXIgYmUgcGVyZm9ybWVkIG9uIGl0cyBiZWhhbGYuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgbWVkaWEgcm91dGVyIGluc3RhbmNlIGZvciB0aGUgY29udGV4dC4gIFRoZSBhcHBsaWNhdGlvbiBtdXN0IGhvbGQKLSAgICAgKiBhIHN0cm9uZyByZWZlcmVuY2UgdG8gdGhpcyBvYmplY3QgYXMgbG9uZyBhcyBpdCBpcyBpbiB1c2UuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZWRpYVJvdXRlciBnZXRJbnN0YW5jZShATm9uTnVsbCBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udGV4dCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgaWYgKHNHbG9iYWwgPT0gbnVsbCkgewotICAgICAgICAgICAgc0dsb2JhbCA9IG5ldyBHbG9iYWxNZWRpYVJvdXRlcihjb250ZXh0LmdldEFwcGxpY2F0aW9uQ29udGV4dCgpKTsKLSAgICAgICAgICAgIHNHbG9iYWwuc3RhcnQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXRSb3V0ZXIoY29udGV4dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZXN9IGN1cnJlbnRseSBrbm93biB0bwotICAgICAqIHRoaXMgbWVkaWEgcm91dGVyLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFJvdXRlSW5mbz4gZ2V0Um91dGVzKCkgewotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0Um91dGVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUge0BsaW5rIE1lZGlhUm91dGVyLlByb3ZpZGVySW5mbyByb3V0ZSBwcm92aWRlcnN9Ci0gICAgICogY3VycmVudGx5IGtub3duIHRvIHRoaXMgbWVkaWEgcm91dGVyLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFByb3ZpZGVySW5mbz4gZ2V0UHJvdmlkZXJzKCkgewotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0UHJvdmlkZXJzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGVmYXVsdCByb3V0ZSBmb3IgcGxheWluZyBtZWRpYSBjb250ZW50IG9uIHRoZSBzeXN0ZW0uCi0gICAgICogPHA+Ci0gICAgICogVGhlIHN5c3RlbSBhbHdheXMgcHJvdmlkZXMgYSBkZWZhdWx0IHJvdXRlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGRlZmF1bHQgcm91dGUsIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gbmV2ZXIgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBSb3V0ZUluZm8gZ2V0RGVmYXVsdFJvdXRlKCkgewotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0RGVmYXVsdFJvdXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhIGJsdWV0b290aCByb3V0ZSBmb3IgcGxheWluZyBtZWRpYSBjb250ZW50IG9uIHRoZSBzeXN0ZW0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEEgYmx1ZXRvb3RoIHJvdXRlLCBpZiBleGlzdCwgb3RoZXJ3aXNlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIFJvdXRlSW5mbyBnZXRCbHVldG9vdGhSb3V0ZSgpIHsKLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIHJldHVybiBzR2xvYmFsLmdldEJsdWV0b290aFJvdXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgZXhhbWluZSB0aGUgcm91dGUncwotICAgICAqIHtAbGluayBSb3V0ZUluZm8jZ2V0Q29udHJvbEZpbHRlcnMgbWVkaWEgY29udHJvbCBpbnRlbnQgZmlsdGVyc30gdG8gYXNzZXNzIHRoZQotICAgICAqIGNhcGFiaWxpdGllcyBvZiB0aGUgcm91dGUgYmVmb3JlIGF0dGVtcHRpbmcgdG8gdXNlIGl0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5FeGFtcGxlPC9oMz4KLSAgICAgKiA8cHJlPgotICAgICAqIHB1YmxpYyBib29sZWFuIHBsYXlNb3ZpZSgpIHsKLSAgICAgKiAgICAgTWVkaWFSb3V0ZXIgbWVkaWFSb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShjb250ZXh0KTsKLSAgICAgKiAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gbWVkaWFSb3V0ZXIuZ2V0U2VsZWN0ZWRSb3V0ZSgpOwotICAgICAqCi0gICAgICogICAgIC8vIEZpcnN0IHRyeSB1c2luZyB0aGUgcmVtb3RlIHBsYXliYWNrIGludGVyZmFjZSwgaWYgc3VwcG9ydGVkLgotICAgICAqICAgICBpZiAocm91dGUuc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSykpIHsKLSAgICAgKiAgICAgICAgIC8vIFRoZSByb3V0ZSBzdXBwb3J0cyByZW1vdGUgcGxheWJhY2suCi0gICAgICogICAgICAgICAvLyBUcnkgdG8gc2VuZCBpdCB0aGUgVXJpIG9mIHRoZSBtb3ZpZSB0byBwbGF5LgotICAgICAqICAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QTEFZKTsKLSAgICAgKiAgICAgICAgIGludGVudC5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKTsKLSAgICAgKiAgICAgICAgIGludGVudC5zZXREYXRhQW5kVHlwZSgiaHR0cDovL2V4YW1wbGUuY29tL3ZpZGVvcy9tb3ZpZS5tcDQiLCAidmlkZW8vbXA0Iik7Ci0gICAgICogICAgICAgICBpZiAocm91dGUuc3VwcG9ydHNDb250cm9sUmVxdWVzdChpbnRlbnQpKSB7Ci0gICAgICogICAgICAgICAgICAgcm91dGUuc2VuZENvbnRyb2xSZXF1ZXN0KGludGVudCwgbnVsbCk7Ci0gICAgICogICAgICAgICAgICAgcmV0dXJuIHRydWU7IC8vIHNlbnQgdGhlIHJlcXVlc3QgdG8gcGxheSB0aGUgbW92aWUKLSAgICAgKiAgICAgICAgIH0KLSAgICAgKiAgICAgfQotICAgICAqCi0gICAgICogICAgIC8vIElmIHJlbW90ZSBwbGF5YmFjayB3YXMgbm90IHBvc3NpYmxlLCB0aGVuIHBsYXkgbG9jYWxseS4KLSAgICAgKiAgICAgaWYgKHJvdXRlLnN1cHBvcnRzQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKSkgewotICAgICAqICAgICAgICAgLy8gVGhlIHJvdXRlIHN1cHBvcnRzIGxpdmUgdmlkZW8gc3RyZWFtaW5nLgotICAgICAqICAgICAgICAgLy8gUHJlcGFyZSB0byBwbGF5IGNvbnRlbnQgbG9jYWxseSBpbiBhIHdpbmRvdyBvciBpbiBhIHByZXNlbnRhdGlvbi4KLSAgICAgKiAgICAgICAgIHJldHVybiBwbGF5TW92aWVJbldpbmRvdygpOwotICAgICAqICAgICB9Ci0gICAgICoKLSAgICAgKiAgICAgLy8gTmVpdGhlciBpbnRlcmZhY2UgaXMgc3VwcG9ydGVkLCBzbyB3ZSBjYW4ndCBwbGF5IHRoZSBtb3ZpZSB0byB0aGlzIHJvdXRlLgotICAgICAqICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICogfQotICAgICAqIDwvcHJlPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2VsZWN0ZWQgcm91dGUsIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gbmV2ZXIgYmUgbnVsbC4KLSAgICAgKgotICAgICAqIEBzZWUgUm91dGVJbmZvI2dldENvbnRyb2xGaWx0ZXJzCi0gICAgICogQHNlZSBSb3V0ZUluZm8jc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkKLSAgICAgKiBAc2VlIFJvdXRlSW5mbyNzdXBwb3J0c0NvbnRyb2xSZXF1ZXN0Ci0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgUm91dGVJbmZvIGdldFNlbGVjdGVkUm91dGUoKSB7Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXRTZWxlY3RlZFJvdXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgc2VsZWN0ZWQgcm91dGUgaWYgaXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yLCBvdGhlcndpc2UKLSAgICAgKiBzZWxlY3RzIHRoZSBkZWZhdWx0IHJvdXRlIGFuZCByZXR1cm5zIGl0LiBJZiB0aGVyZSBpcyBvbmUgbGl2ZSBhdWRpbyByb3V0ZQotICAgICAqICh1c3VhbGx5IEJsdWV0b290aCBBMkRQKSwgaXQgd2lsbCBiZSBzZWxlY3RlZCBpbnN0ZWFkIG9mIGRlZmF1bHQgcm91dGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHRvIG1hdGNoLgotICAgICAqIEByZXR1cm4gVGhlIHByZXZpb3VzbHkgc2VsZWN0ZWQgcm91dGUgaWYgaXQgbWF0Y2hlZCB0aGUgc2VsZWN0b3IsIG90aGVyd2lzZSB0aGUKLSAgICAgKiBuZXdseSBzZWxlY3RlZCBkZWZhdWx0IHJvdXRlIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gbmV2ZXIgYmUgbnVsbC4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZVNlbGVjdG9yCi0gICAgICogQHNlZSBSb3V0ZUluZm8jbWF0Y2hlc1NlbGVjdG9yCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgUm91dGVJbmZvIHVwZGF0ZVNlbGVjdGVkUm91dGUoQE5vbk51bGwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJ1cGRhdGVTZWxlY3RlZFJvdXRlOiAiICsgc2VsZWN0b3IpOwotICAgICAgICB9Ci0gICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IHNHbG9iYWwuZ2V0U2VsZWN0ZWRSb3V0ZSgpOwotICAgICAgICBpZiAoIXJvdXRlLmlzRGVmYXVsdE9yQmx1ZXRvb3RoKCkgJiYgIXJvdXRlLm1hdGNoZXNTZWxlY3RvcihzZWxlY3RvcikpIHsKLSAgICAgICAgICAgIHJvdXRlID0gc0dsb2JhbC5jaG9vc2VGYWxsYmFja1JvdXRlKCk7Ci0gICAgICAgICAgICBzR2xvYmFsLnNlbGVjdFJvdXRlKHJvdXRlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcm91dGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VsZWN0cyB0aGUgc3BlY2lmaWVkIHJvdXRlLgotICAgICAqCi0gICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0byBzZWxlY3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VsZWN0Um91dGUoQE5vbk51bGwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIGlmIChyb3V0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJzZWxlY3RSb3V0ZTogIiArIHJvdXRlKTsKLSAgICAgICAgfQotICAgICAgICBzR2xvYmFsLnNlbGVjdFJvdXRlKHJvdXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVbnNlbGVjdHMgdGhlIGN1cnJlbnQgcm91bmQgYW5kIHNlbGVjdHMgdGhlIGRlZmF1bHQgcm91dGUgaW5zdGVhZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVhc29uIGdpdmVuIG11c3QgYmUgb25lIG9mOgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9VTktOT1dOfTwvbGk+Ci0gICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fRElTQ09OTkVDVEVEfTwvbGk+Ci0gICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fU1RPUFBFRH08L2xpPgotICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUR9PC9saT4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHBhcmFtIHJlYXNvbiBUaGUgcmVhc29uIGZvciBkaXNjb25uZWN0aW5nIHRoZSBjdXJyZW50IHJvdXRlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHVuc2VsZWN0KGludCByZWFzb24pIHsKLSAgICAgICAgaWYgKHJlYXNvbiA8IE1lZGlhUm91dGVyLlVOU0VMRUNUX1JFQVNPTl9VTktOT1dOIHx8Ci0gICAgICAgICAgICAgICAgcmVhc29uID4gTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuc3VwcG9ydGVkIHJlYXNvbiB0byB1bnNlbGVjdCByb3V0ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIC8vIENob29zZSB0aGUgZmFsbGJhY2sgcm91dGUgaWYgaXQncyBub3QgYWxyZWFkeSBzZWxlY3RlZC4KLSAgICAgICAgLy8gT3RoZXJ3aXNlLCBzZWxlY3QgdGhlIGRlZmF1bHQgcm91dGUuCi0gICAgICAgIFJvdXRlSW5mbyBmYWxsYmFja1JvdXRlID0gc0dsb2JhbC5jaG9vc2VGYWxsYmFja1JvdXRlKCk7Ci0gICAgICAgIGlmIChzR2xvYmFsLmdldFNlbGVjdGVkUm91dGUoKSAhPSBmYWxsYmFja1JvdXRlKSB7Ci0gICAgICAgICAgICBzR2xvYmFsLnNlbGVjdFJvdXRlKGZhbGxiYWNrUm91dGUsIHJlYXNvbik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzR2xvYmFsLnNlbGVjdFJvdXRlKHNHbG9iYWwuZ2V0RGVmYXVsdFJvdXRlKCksIHJlYXNvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgYSByb3V0ZSB0aGF0IG1hdGNoZXMgdGhlIHNwZWNpZmllZCBzZWxlY3Rvci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIGFueSBhdmFpbGFibGUgcm91dGVzIHRoYXQgbWF0Y2ggdGhlCi0gICAgICogc2VsZWN0b3IgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkgYXJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuIElmIHRoZQotICAgICAqIHtAbGluayAjQVZBSUxBQklMSVRZX0ZMQUdfSUdOT1JFX0RFRkFVTFRfUk9VVEV9IGZsYWcgaXMgc3BlY2lmaWVkLCB0aGVuCi0gICAgICogdGhlIG1ldGhvZCB3aWxsIG9ubHkgY29uc2lkZXIgbm9uLWRlZmF1bHQgcm91dGVzLgotICAgICAqIDwvcD4KLSAgICAgKiA8cCBjbGFzcz0ibm90ZSI+Ci0gICAgICogT24ge0BsaW5rIEFjdGl2aXR5TWFuYWdlciNpc0xvd1JhbURldmljZSBsb3ctUkFNIGRldmljZXN9IHRoaXMgbWV0aG9kCi0gICAgICogd2lsbCByZXR1cm4gdHJ1ZSBpZiBpdCBpcyBwb3NzaWJsZSB0byBkaXNjb3ZlciBhIG1hdGNoaW5nIHJvdXRlIGV2ZW4gaWYKLSAgICAgKiBkaXNjb3ZlcnkgaXMgbm90IGluIHByb2dyZXNzIG9yIGlmIG5vIG1hdGNoaW5nIHJvdXRlIGhhcyB5ZXQgYmVlbiBmb3VuZC4KLSAgICAgKiBVc2Uge0BsaW5rICNBVkFJTEFCSUxJVFlfRkxBR19SRVFVSVJFX01BVENIfSB0byByZXF1aXJlIGFuIGFjdHVhbCBtYXRjaC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHRvIG1hdGNoLgotICAgICAqIEBwYXJhbSBmbGFncyBGbGFncyB0byBjb250cm9sIHRoZSBkZXRlcm1pbmF0aW9uIG9mIHdoZXRoZXIgYSByb3V0ZSBtYXkgYmUKLSAgICAgKiAgICAgICAgICAgIGF2YWlsYWJsZS4gTWF5IGJlIHplcm8gb3Igc29tZSBjb21iaW5hdGlvbiBvZgotICAgICAqICAgICAgICAgICAge0BsaW5rICNBVkFJTEFCSUxJVFlfRkxBR19JR05PUkVfREVGQVVMVF9ST1VURX0gYW5kCi0gICAgICogICAgICAgICAgICB7QGxpbmsgI0FWQUlMQUJJTElUWV9GTEFHX1JFUVVJUkVfTUFUQ0h9LgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBhIG1hdGNoaW5nIHJvdXRlIG1heSBiZSBhdmFpbGFibGUuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNSb3V0ZUF2YWlsYWJsZShATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IsIGludCBmbGFncykgewotICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIHJldHVybiBzR2xvYmFsLmlzUm91dGVBdmFpbGFibGUoc2VsZWN0b3IsIGZsYWdzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayB0byBkaXNjb3ZlciByb3V0ZXMgdGhhdCBtYXRjaCB0aGUgc2VsZWN0b3IgYW5kIHRvIHJlY2VpdmUKLSAgICAgKiBldmVudHMgd2hlbiB0aGV5IGNoYW5nZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlzIGEgY29udmVuaWVuY2UgbWV0aG9kIHRoYXQgaGFzIHRoZSBzYW1lIGVmZmVjdCBhcyBjYWxsaW5nCi0gICAgICoge0BsaW5rICNhZGRDYWxsYmFjayhNZWRpYVJvdXRlU2VsZWN0b3IsIENhbGxiYWNrLCBpbnQpfSB3aXRob3V0IGZsYWdzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHJvdXRlIHNlbGVjdG9yIHRoYXQgaW5kaWNhdGVzIHRoZSBraW5kcyBvZiByb3V0ZXMgdGhhdCB0aGUKLSAgICAgKiBjYWxsYmFjayB3b3VsZCBsaWtlIHRvIGRpc2NvdmVyLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gYWRkLgotICAgICAqIEBzZWUgI3JlbW92ZUNhbGxiYWNrCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkQ2FsbGJhY2soTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yLCBDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBhZGRDYWxsYmFjayhzZWxlY3RvciwgY2FsbGJhY2ssIDApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGRpc2NvdmVyIHJvdXRlcyB0aGF0IG1hdGNoIHRoZSBzZWxlY3RvciBhbmQgdG8gcmVjZWl2ZQotICAgICAqIGV2ZW50cyB3aGVuIHRoZXkgY2hhbmdlLgotICAgICAqIDxwPgotICAgICAqIFRoZSBzZWxlY3RvciBkZXNjcmliZXMgdGhlIGtpbmRzIG9mIHJvdXRlcyB0aGF0IHRoZSBhcHBsaWNhdGlvbiB3YW50cyB0bwotICAgICAqIGRpc2NvdmVyLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBhcHBsaWNhdGlvbiB3YW50cyB0byB1c2UKLSAgICAgKiBsaXZlIGF1ZGlvIHJvdXRlcyB0aGVuIGl0IHNob3VsZCBpbmNsdWRlIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9BVURJTyBsaXZlIGF1ZGlvIG1lZGlhIGNvbnRyb2wgaW50ZW50IGNhdGVnb3J5fQotICAgICAqIGluIGl0cyBzZWxlY3RvciB3aGVuIGl0IGFkZHMgYSBjYWxsYmFjayB0byB0aGUgbWVkaWEgcm91dGVyLgotICAgICAqIFRoZSBzZWxlY3RvciBtYXkgaW5jbHVkZSBhbnkgbnVtYmVyIG9mIGNhdGVnb3JpZXMuCi0gICAgICogPC9wPjxwPgotICAgICAqIElmIHRoZSBjYWxsYmFjayBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQsIHRoZW4gdGhlIHNlbGVjdG9yIGlzIGFkZGVkIHRvCi0gICAgICogdGhlIHNldCBvZiBzZWxlY3RvcnMgYmVpbmcgbW9uaXRvcmVkIGJ5IHRoZSBjYWxsYmFjay4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogQnkgZGVmYXVsdCwgdGhlIGNhbGxiYWNrIHdpbGwgb25seSBiZSBpbnZva2VkIGZvciBldmVudHMgdGhhdCBhZmZlY3Qgcm91dGVzCi0gICAgICogdGhhdCBtYXRjaCB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yLiAgRXZlbnQgZmlsdGVyaW5nIG1heSBiZSBkaXNhYmxlZCBieSBzcGVjaWZ5aW5nCi0gICAgICogdGhlIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UU30gZmxhZyB3aGVuIHRoZSBjYWxsYmFjayBpcyByZWdpc3RlcmVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBcHBsaWNhdGlvbnMgc2hvdWxkIHVzZSB0aGUge0BsaW5rICNpc1JvdXRlQXZhaWxhYmxlfSBtZXRob2QgdG8gZGV0ZXJtaW5lCi0gICAgICogd2hldGhlciBpcyBpdCBwb3NzaWJsZSB0byBkaXNjb3ZlciBhIHJvdXRlIHdpdGggdGhlIGRlc2lyZWQgY2FwYWJpbGl0aWVzCi0gICAgICogYW5kIHRoZXJlZm9yZSB3aGV0aGVyIHRoZSBtZWRpYSByb3V0ZSBidXR0b24gc2hvdWxkIGJlIHNob3duIHRvIHRoZSB1c2VyLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUge0BsaW5rICNDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZfSBmbGFnIHNob3VsZCBiZSB1c2VkIHdoaWxlIHRoZSBhcHBsaWNhdGlvbgotICAgICAqIGlzIGluIHRoZSBmb3JlZ3JvdW5kIHRvIHJlcXVlc3QgdGhhdCBwYXNzaXZlIGRpc2NvdmVyeSBiZSBwZXJmb3JtZWQgaWYgdGhlcmUgYXJlCi0gICAgICogc3VmZmljaWVudCByZXNvdXJjZXMgdG8gYWxsb3cgY29udGludW91cyBwYXNzaXZlIGRpc2NvdmVyeS4KLSAgICAgKiBPbiB7QGxpbmsgQWN0aXZpdHlNYW5hZ2VyI2lzTG93UmFtRGV2aWNlIGxvdy1SQU0gZGV2aWNlc30gdGhpcyBmbGFnIHdpbGwgYmUKLSAgICAgKiBpZ25vcmVkIHRvIGNvbnNlcnZlIHJlc291cmNlcy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19GT1JDRV9ESVNDT1ZFUll9IGZsYWcgc2hvdWxkIGJlIHVzZWQgd2hlbgotICAgICAqIHBhc3NpdmUgZGlzY292ZXJ5IGFic29sdXRlbHkgbXVzdCBiZSBwZXJmb3JtZWQsIGV2ZW4gb24gbG93LVJBTSBkZXZpY2VzLgotICAgICAqIFRoaXMgZmxhZyBoYXMgYSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBpbXBhY3Qgb24gbG93LVJBTSBkZXZpY2VzCi0gICAgICogc2luY2UgaXQgbWF5IGNhdXNlIG1hbnkgbWVkaWEgcm91dGUgcHJvdmlkZXJzIHRvIGJlIHN0YXJ0ZWQgc2ltdWx0YW5lb3VzbHkuCi0gICAgICogSXQgaXMgbXVjaCBiZXR0ZXIgdG8gdXNlIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWX0gaW5zdGVhZCB0byBhdm9pZAotICAgICAqIHBlcmZvcm1pbmcgcGFzc2l2ZSBkaXNjb3Zlcnkgb24gdGhlc2UgZGV2aWNlcyBhbHRvZ2V0aGVyLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUge0BsaW5rICNDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU59IGZsYWcgc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGUKLSAgICAgKiBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZyBpcyBzaG93aW5nIHRvIGNvbmZpcm0gdGhlIHByZXNlbmNlIG9mIGF2YWlsYWJsZQotICAgICAqIHJvdXRlcyB0aGF0IHRoZSB1c2VyIG1heSBjb25uZWN0IHRvLiAgVGhpcyBmbGFnIG1heSB1c2Ugc3Vic3RhbnRpYWxseSBtb3JlCi0gICAgICogcG93ZXIuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPkV4YW1wbGU8L2gzPgotICAgICAqIDxwcmU+Ci0gICAgICogcHVibGljIGNsYXNzIE15QWN0aXZpdHkgZXh0ZW5kcyBBY3Rpdml0eSB7Ci0gICAgICogICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIgbVJvdXRlcjsKLSAgICAgKiAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlci5DYWxsYmFjayBtQ2FsbGJhY2s7Ci0gICAgICogICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvcjsKLSAgICAgKgotICAgICAqICAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICogICAgICAgICBzdXBlci5vbkNyZWF0ZShzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAqCi0gICAgICogICAgICAgICBtUm91dGVyID0gTWVkaWFyb3V0ZXIuZ2V0SW5zdGFuY2UodGhpcyk7Ci0gICAgICogICAgICAgICBtQ2FsbGJhY2sgPSBuZXcgTXlDYWxsYmFjaygpOwotICAgICAqICAgICAgICAgbVNlbGVjdG9yID0gbmV3IE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyKCkKLSAgICAgKiAgICAgICAgICAgICAgICAgLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTykKLSAgICAgKiAgICAgICAgICAgICAgICAgLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKQotICAgICAqICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgKiAgICAgfQotICAgICAqCi0gICAgICogICAgIC8vIEFkZCB0aGUgY2FsbGJhY2sgb24gc3RhcnQgdG8gdGVsbCB0aGUgbWVkaWEgcm91dGVyIHdoYXQga2luZHMgb2Ygcm91dGVzCi0gICAgICogICAgIC8vIHRoZSBhcHBsaWNhdGlvbiBpcyBpbnRlcmVzdGVkIGluIHNvIHRoYXQgaXQgY2FuIHRyeSB0byBkaXNjb3ZlciBzdWl0YWJsZSBvbmVzLgotICAgICAqICAgICBwdWJsaWMgdm9pZCBvblN0YXJ0KCkgewotICAgICAqICAgICAgICAgc3VwZXIub25TdGFydCgpOwotICAgICAqCi0gICAgICogICAgICAgICBtZWRpYVJvdXRlci5hZGRDYWxsYmFjayhtU2VsZWN0b3IsIG1DYWxsYmFjaywKLSAgICAgKiAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWSk7Ci0gICAgICoKLSAgICAgKiAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1lZGlhUm91dGVyLnVwZGF0ZVNlbGVjdGVkUm91dGUobVNlbGVjdG9yKTsKLSAgICAgKiAgICAgICAgIC8vIGRvIHNvbWV0aGluZyB3aXRoIHRoZSByb3V0ZS4uLgotICAgICAqICAgICB9Ci0gICAgICoKLSAgICAgKiAgICAgLy8gUmVtb3ZlIHRoZSBzZWxlY3RvciBvbiBzdG9wIHRvIHRlbGwgdGhlIG1lZGlhIHJvdXRlciB0aGF0IGl0IG5vIGxvbmdlcgotICAgICAqICAgICAvLyBuZWVkcyB0byBpbnZlc3QgZWZmb3J0IHRyeWluZyB0byBkaXNjb3ZlciByb3V0ZXMgb2YgdGhlc2Uga2luZHMgZm9yIG5vdy4KLSAgICAgKiAgICAgcHVibGljIHZvaWQgb25TdG9wKCkgewotICAgICAqICAgICAgICAgc3VwZXIub25TdG9wKCk7Ci0gICAgICoKLSAgICAgKiAgICAgICAgIG1lZGlhUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7Ci0gICAgICogICAgIH0KLSAgICAgKgotICAgICAqICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE15Q2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlci5DYWxsYmFjayB7Ci0gICAgICogICAgICAgICAvLyBJbXBsZW1lbnQgY2FsbGJhY2sgbWV0aG9kcyBhcyBuZWVkZWQuCi0gICAgICogICAgIH0KLSAgICAgKiB9Ci0gICAgICogPC9wcmU+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgQSByb3V0ZSBzZWxlY3RvciB0aGF0IGluZGljYXRlcyB0aGUga2luZHMgb2Ygcm91dGVzIHRoYXQgdGhlCi0gICAgICogY2FsbGJhY2sgd291bGQgbGlrZSB0byBkaXNjb3Zlci4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIGFkZC4KLSAgICAgKiBAcGFyYW0gZmxhZ3MgRmxhZ3MgdG8gY29udHJvbCB0aGUgYmVoYXZpb3Igb2YgdGhlIGNhbGxiYWNrLgotICAgICAqIE1heSBiZSB6ZXJvIG9yIGEgY29tYmluYXRpb24gb2Yge0BsaW5rICNDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU59IGFuZAotICAgICAqIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UU30uCi0gICAgICogQHNlZSAjcmVtb3ZlQ2FsbGJhY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRDYWxsYmFjayhATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IsIEBOb25OdWxsIENhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgQENhbGxiYWNrRmxhZ3MgaW50IGZsYWdzKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNhbGxiYWNrID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhbGxiYWNrIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImFkZENhbGxiYWNrOiBzZWxlY3Rvcj0iICsgc2VsZWN0b3IKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBjYWxsYmFjaz0iICsgY2FsbGJhY2sgKyAiLCBmbGFncz0iICsgSW50ZWdlci50b0hleFN0cmluZyhmbGFncykpOwotICAgICAgICB9Ci0KLSAgICAgICAgQ2FsbGJhY2tSZWNvcmQgcmVjb3JkOwotICAgICAgICBpbnQgaW5kZXggPSBmaW5kQ2FsbGJhY2tSZWNvcmQoY2FsbGJhY2spOwotICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICByZWNvcmQgPSBuZXcgQ2FsbGJhY2tSZWNvcmQodGhpcywgY2FsbGJhY2spOwotICAgICAgICAgICAgbUNhbGxiYWNrUmVjb3Jkcy5hZGQocmVjb3JkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlY29yZCA9IG1DYWxsYmFja1JlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgfQotICAgICAgICBib29sZWFuIHVwZGF0ZU5lZWRlZCA9IGZhbHNlOwotICAgICAgICBpZiAoKGZsYWdzICYgfnJlY29yZC5tRmxhZ3MpICE9IDApIHsKLSAgICAgICAgICAgIHJlY29yZC5tRmxhZ3MgfD0gZmxhZ3M7Ci0gICAgICAgICAgICB1cGRhdGVOZWVkZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcmVjb3JkLm1TZWxlY3Rvci5jb250YWlucyhzZWxlY3RvcikpIHsKLSAgICAgICAgICAgIHJlY29yZC5tU2VsZWN0b3IgPSBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIocmVjb3JkLm1TZWxlY3RvcikKLSAgICAgICAgICAgICAgICAgICAgLmFkZFNlbGVjdG9yKHNlbGVjdG9yKQotICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgICAgIHVwZGF0ZU5lZWRlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHVwZGF0ZU5lZWRlZCkgewotICAgICAgICAgICAgc0dsb2JhbC51cGRhdGVEaXNjb3ZlcnlSZXF1ZXN0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgY2FsbGJhY2suICBJdCB3aWxsIG5vIGxvbmdlciByZWNlaXZlIGV2ZW50cyBhYm91dAotICAgICAqIGNoYW5nZXMgdG8gbWVkaWEgcm91dGVzLgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byByZW1vdmUuCi0gICAgICogQHNlZSAjYWRkQ2FsbGJhY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVDYWxsYmFjayhATm9uTnVsbCBDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVtb3ZlQ2FsbGJhY2s6IGNhbGxiYWNrPSIgKyBjYWxsYmFjayk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgaW5kZXggPSBmaW5kQ2FsbGJhY2tSZWNvcmQoY2FsbGJhY2spOwotICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgbUNhbGxiYWNrUmVjb3Jkcy5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgc0dsb2JhbC51cGRhdGVEaXNjb3ZlcnlSZXF1ZXN0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBmaW5kQ2FsbGJhY2tSZWNvcmQoQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNhbGxiYWNrUmVjb3Jkcy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgaWYgKG1DYWxsYmFja1JlY29yZHMuZ2V0KGkpLm1DYWxsYmFjayA9PSBjYWxsYmFjaykgewotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWdpc3RlcnMgYSBtZWRpYSByb3V0ZSBwcm92aWRlciB3aXRoaW4gdGhpcyBhcHBsaWNhdGlvbiBwcm9jZXNzLgotICAgICAqIDxwPgotICAgICAqIFRoZSBwcm92aWRlciB3aWxsIGJlIGFkZGVkIHRvIHRoZSBsaXN0IG9mIHByb3ZpZGVycyB0aGF0IGFsbCB7QGxpbmsgTWVkaWFSb3V0ZXJ9Ci0gICAgICogaW5zdGFuY2VzIHdpdGhpbiB0aGlzIHByb2Nlc3MgY2FuIHVzZSB0byBkaXNjb3ZlciByb3V0ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHByb3ZpZGVySW5zdGFuY2UgVGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGluc3RhbmNlIHRvIGFkZC4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZVByb3ZpZGVyCi0gICAgICogQHNlZSAjcmVtb3ZlQ2FsbGJhY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRQcm92aWRlcihATm9uTnVsbCBNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXJJbnN0YW5jZSkgewotICAgICAgICBpZiAocHJvdmlkZXJJbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwcm92aWRlckluc3RhbmNlIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImFkZFByb3ZpZGVyOiAiICsgcHJvdmlkZXJJbnN0YW5jZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc0dsb2JhbC5hZGRQcm92aWRlcihwcm92aWRlckluc3RhbmNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVbnJlZ2lzdGVycyBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHdpdGhpbiB0aGlzIGFwcGxpY2F0aW9uIHByb2Nlc3MuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHByb3ZpZGVyIHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0IG9mIHByb3ZpZGVycyB0aGF0IGFsbCB7QGxpbmsgTWVkaWFSb3V0ZXJ9Ci0gICAgICogaW5zdGFuY2VzIHdpdGhpbiB0aGlzIHByb2Nlc3MgY2FuIHVzZSB0byBkaXNjb3ZlciByb3V0ZXMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHByb3ZpZGVySW5zdGFuY2UgVGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGluc3RhbmNlIHRvIHJlbW92ZS4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZVByb3ZpZGVyCi0gICAgICogQHNlZSAjYWRkQ2FsbGJhY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQcm92aWRlcihATm9uTnVsbCBNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXJJbnN0YW5jZSkgewotICAgICAgICBpZiAocHJvdmlkZXJJbnN0YW5jZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwcm92aWRlckluc3RhbmNlIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInJlbW92ZVByb3ZpZGVyOiAiICsgcHJvdmlkZXJJbnN0YW5jZSk7Ci0gICAgICAgIH0KLSAgICAgICAgc0dsb2JhbC5yZW1vdmVQcm92aWRlcihwcm92aWRlckluc3RhbmNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgcmVtb3RlIGNvbnRyb2wgY2xpZW50IHRvIGVuYWJsZSByZW1vdGUgY29udHJvbCBvZiB0aGUgdm9sdW1lCi0gICAgICogb2YgdGhlIHNlbGVjdGVkIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZW1vdGUgY29udHJvbCBjbGllbnQgbXVzdCBoYXZlIHByZXZpb3VzbHkgYmVlbiByZWdpc3RlcmVkIHdpdGgKLSAgICAgKiB0aGUgYXVkaW8gbWFuYWdlciB1c2luZyB0aGUge0BsaW5rIGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyI3JlZ2lzdGVyUmVtb3RlQ29udHJvbENsaWVudAotICAgICAqIEF1ZGlvTWFuYWdlci5yZWdpc3RlclJlbW90ZUNvbnRyb2xDbGllbnR9IG1ldGhvZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVtb3RlQ29udHJvbENsaWVudCBUaGUge0BsaW5rIGFuZHJvaWQubWVkaWEuUmVtb3RlQ29udHJvbENsaWVudH0gdG8gcmVnaXN0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYWRkUmVtb3RlQ29udHJvbENsaWVudChATm9uTnVsbCBPYmplY3QgcmVtb3RlQ29udHJvbENsaWVudCkgewotICAgICAgICBpZiAocmVtb3RlQ29udHJvbENsaWVudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyZW1vdGVDb250cm9sQ2xpZW50IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImFkZFJlbW90ZUNvbnRyb2xDbGllbnQ6ICIgKyByZW1vdGVDb250cm9sQ2xpZW50KTsKLSAgICAgICAgfQotICAgICAgICBzR2xvYmFsLmFkZFJlbW90ZUNvbnRyb2xDbGllbnQocmVtb3RlQ29udHJvbENsaWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyBhIHJlbW90ZSBjb250cm9sIGNsaWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZW1vdGVDb250cm9sQ2xpZW50IFRoZSB7QGxpbmsgYW5kcm9pZC5tZWRpYS5SZW1vdGVDb250cm9sQ2xpZW50fQotICAgICAqICAgICAgICAgICAgdG8gdW5yZWdpc3Rlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZW1vdmVSZW1vdGVDb250cm9sQ2xpZW50KEBOb25OdWxsIE9iamVjdCByZW1vdGVDb250cm9sQ2xpZW50KSB7Ci0gICAgICAgIGlmIChyZW1vdGVDb250cm9sQ2xpZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJlbW90ZUNvbnRyb2xDbGllbnQgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJyZW1vdmVSZW1vdGVDb250cm9sQ2xpZW50OiAiICsgcmVtb3RlQ29udHJvbENsaWVudCk7Ci0gICAgICAgIH0KLSAgICAgICAgc0dsb2JhbC5yZW1vdmVSZW1vdGVDb250cm9sQ2xpZW50KHJlbW90ZUNvbnRyb2xDbGllbnQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHNlc3Npb24gdG8gZW5hYmxlIHJlbW90ZSBjb250cm9sIG9mIHRoZSB2b2x1bWUgb2YgdGhlCi0gICAgICogc2VsZWN0ZWQgcm91dGUuIFRoaXMgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZCBvZgotICAgICAqIHtAbGluayAjYWRkUmVtb3RlQ29udHJvbENsaWVudH0gd2hlbiB1c2luZyBtZWRpYSBzZXNzaW9ucy4gU2V0IHRoZQotICAgICAqIHNlc3Npb24gdG8gbnVsbCB0byBjbGVhciBpdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZWRpYVNlc3Npb24gVGhlIHtAbGluayBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9ufSB0bwotICAgICAqICAgICAgICAgICAgdXNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhU2Vzc2lvbihPYmplY3QgbWVkaWFTZXNzaW9uKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkTWVkaWFTZXNzaW9uOiAiICsgbWVkaWFTZXNzaW9uKTsKLSAgICAgICAgfQotICAgICAgICBzR2xvYmFsLnNldE1lZGlhU2Vzc2lvbihtZWRpYVNlc3Npb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBjb21wYXQgbWVkaWEgc2Vzc2lvbiB0byBlbmFibGUgcmVtb3RlIGNvbnRyb2wgb2YgdGhlIHZvbHVtZSBvZiB0aGUKLSAgICAgKiBzZWxlY3RlZCByb3V0ZS4gVGhpcyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mCi0gICAgICoge0BsaW5rICNhZGRSZW1vdGVDb250cm9sQ2xpZW50fSB3aGVuIHVzaW5nIHtAbGluayBNZWRpYVNlc3Npb25Db21wYXR9LgotICAgICAqIFNldCB0aGUgc2Vzc2lvbiB0byBudWxsIHRvIGNsZWFyIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lZGlhU2Vzc2lvbgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhU2Vzc2lvbkNvbXBhdChNZWRpYVNlc3Npb25Db21wYXQgbWVkaWFTZXNzaW9uKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkTWVkaWFTZXNzaW9uQ29tcGF0OiAiICsgbWVkaWFTZXNzaW9uKTsKLSAgICAgICAgfQotICAgICAgICBzR2xvYmFsLnNldE1lZGlhU2Vzc2lvbkNvbXBhdChtZWRpYVNlc3Npb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVNlc3Npb25Db21wYXQuVG9rZW4gZ2V0TWVkaWFTZXNzaW9uVG9rZW4oKSB7Ci0gICAgICAgIHJldHVybiBzR2xvYmFsLmdldE1lZGlhU2Vzc2lvblRva2VuKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5zdXJlcyB0aGF0IGNhbGxzIGludG8gdGhlIG1lZGlhIHJvdXRlciBhcmUgb24gdGhlIGNvcnJlY3QgdGhyZWFkLgotICAgICAqIEl0IHBheXMgdG8gYmUgYSBsaXR0bGUgcGFyYW5vaWQgd2hlbiBnbG9iYWwgc3RhdGUgaW52YXJpYW50cyBhcmUgYXQgcmlzay4KLSAgICAgKi8KLSAgICBzdGF0aWMgdm9pZCBjaGVja0NhbGxpbmdUaHJlYWQoKSB7Ci0gICAgICAgIGlmIChMb29wZXIubXlMb29wZXIoKSAhPSBMb29wZXIuZ2V0TWFpbkxvb3BlcigpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgbWVkaWEgcm91dGVyIHNlcnZpY2UgbXVzdCBvbmx5IGJlICIKLSAgICAgICAgICAgICAgICAgICAgKyAiYWNjZXNzZWQgb24gdGhlIGFwcGxpY2F0aW9uJ3MgbWFpbiB0aHJlYWQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgPFQ+IGJvb2xlYW4gZXF1YWwoVCBhLCBUIGIpIHsKLSAgICAgICAgcmV0dXJuIGEgPT0gYiB8fCAoYSAhPSBudWxsICYmIGIgIT0gbnVsbCAmJiBhLmVxdWFscyhiKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgYSBtZWRpYSByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBFYWNoIG1lZGlhIHJvdXRlIGhhcyBhIGxpc3Qgb2Yge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfQotICAgICAqIHtAbGluayAjZ2V0Q29udHJvbEZpbHRlcnMgaW50ZW50IGZpbHRlcnN9IHRoYXQgZGVzY3JpYmUgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGUKLSAgICAgKiByb3V0ZSBhbmQgdGhlIG1hbm5lciBpbiB3aGljaCBpdCBpcyB1c2VkIGFuZCBjb250cm9sbGVkLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJvdXRlSW5mbyB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXJJbmZvIG1Qcm92aWRlcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbURlc2NyaXB0b3JJZDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVVuaXF1ZUlkOwotICAgICAgICBwcml2YXRlIFN0cmluZyBtTmFtZTsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbURlc2NyaXB0aW9uOwotICAgICAgICBwcml2YXRlIFVyaSBtSWNvblVyaTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVkOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUNvbm5lY3Rpbmc7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Db25uZWN0aW9uU3RhdGU7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQ2FuRGlzY29ubmVjdDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPiBtQ29udHJvbEZpbHRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVBsYXliYWNrVHlwZTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVBsYXliYWNrU3RyZWFtOwotICAgICAgICBwcml2YXRlIGludCBtRGV2aWNlVHlwZTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVZvbHVtZUhhbmRsaW5nOwotICAgICAgICBwcml2YXRlIGludCBtVm9sdW1lOwotICAgICAgICBwcml2YXRlIGludCBtVm9sdW1lTWF4OwotICAgICAgICBwcml2YXRlIERpc3BsYXkgbVByZXNlbnRhdGlvbkRpc3BsYXk7Ci0gICAgICAgIHByaXZhdGUgaW50IG1QcmVzZW50YXRpb25EaXNwbGF5SWQgPSBQUkVTRU5UQVRJT05fRElTUExBWV9JRF9OT05FOwotICAgICAgICBwcml2YXRlIEJ1bmRsZSBtRXh0cmFzOwotICAgICAgICBwcml2YXRlIEludGVudFNlbmRlciBtU2V0dGluZ3NJbnRlbnQ7Ci0gICAgICAgIE1lZGlhUm91dGVEZXNjcmlwdG9yIG1EZXNjcmlwdG9yOwotCi0gICAgICAgIEBJbnREZWYoe0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVELCBDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkcsCi0gICAgICAgICAgICAgICAgQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUR9KQotICAgICAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi0gICAgICAgIHByaXZhdGUgQGludGVyZmFjZSBDb25uZWN0aW9uU3RhdGUge30KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGRlZmF1bHQgY29ubmVjdGlvbiBzdGF0ZSBpbmRpY2F0aW5nIHRoZSByb3V0ZSBpcyBkaXNjb25uZWN0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldENvbm5lY3Rpb25TdGF0ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQgPSAwOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBIGNvbm5lY3Rpb24gc3RhdGUgaW5kaWNhdGluZyB0aGUgcm91dGUgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgY29ubmVjdGluZyBhbmQgaXMgbm90IHlldAotICAgICAgICAgKiByZWFkeSBmb3IgdXNlLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXRDb25uZWN0aW9uU3RhdGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElORyA9IDE7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgY29ubmVjdGlvbiBzdGF0ZSBpbmRpY2F0aW5nIHRoZSByb3V0ZSBpcyBjb25uZWN0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldENvbm5lY3Rpb25TdGF0ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUQgPSAyOwotCi0gICAgICAgIEBJbnREZWYoe1BMQVlCQUNLX1RZUEVfTE9DQUwsUExBWUJBQ0tfVFlQRV9SRU1PVEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi0gICAgICAgIHByaXZhdGUgQGludGVyZmFjZSBQbGF5YmFja1R5cGUge30KLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGRlZmF1bHQgcGxheWJhY2sgdHlwZSwgImxvY2FsIiwgaW5kaWNhdGluZyB0aGUgcHJlc2VudGF0aW9uIG9mIHRoZSBtZWRpYQotICAgICAgICAgKiBpcyBoYXBwZW5pbmcgb24gdGhlIHNhbWUgZGV2aWNlIChlLmcuIGEgcGhvbmUsIGEgdGFibGV0KSBhcyB3aGVyZSBpdCBpcwotICAgICAgICAgKiBjb250cm9sbGVkIGZyb20uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldFBsYXliYWNrVHlwZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfVFlQRV9MT0NBTCA9IDA7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgcGxheWJhY2sgdHlwZSBpbmRpY2F0aW5nIHRoZSBwcmVzZW50YXRpb24gb2YgdGhlIG1lZGlhIGlzIGhhcHBlbmluZyBvbgotICAgICAgICAgKiBhIGRpZmZlcmVudCBkZXZpY2UgKGkuZS4gdGhlIHJlbW90ZSBkZXZpY2UpIHRoYW4gd2hlcmUgaXQgaXMgY29udHJvbGxlZCBmcm9tLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXRQbGF5YmFja1R5cGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1RZUEVfUkVNT1RFID0gMTsKLQotICAgICAgICBASW50RGVmKHtERVZJQ0VfVFlQRV9VTktOT1dOLCBERVZJQ0VfVFlQRV9UViwgREVWSUNFX1RZUEVfU1BFQUtFUiwgREVWSUNFX1RZUEVfQkxVRVRPT1RIfSkKLSAgICAgICAgQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQotICAgICAgICBwcml2YXRlIEBpbnRlcmZhY2UgRGV2aWNlVHlwZSB7fQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgZGVmYXVsdCByZWNlaXZlciBkZXZpY2UgdHlwZSBvZiB0aGUgcm91dGUgaW5kaWNhdGluZyB0aGUgdHlwZSBpcyB1bmtub3duLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXREZXZpY2VUeXBlCi0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfVFlQRV9VTktOT1dOID0gMDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQSByZWNlaXZlciBkZXZpY2UgdHlwZSBvZiB0aGUgcm91dGUgaW5kaWNhdGluZyB0aGUgcHJlc2VudGF0aW9uIG9mIHRoZSBtZWRpYSBpcyBoYXBwZW5pbmcKLSAgICAgICAgICogb24gYSBUVi4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0RGV2aWNlVHlwZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1RZUEVfVFYgPSAxOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBIHJlY2VpdmVyIGRldmljZSB0eXBlIG9mIHRoZSByb3V0ZSBpbmRpY2F0aW5nIHRoZSBwcmVzZW50YXRpb24gb2YgdGhlIG1lZGlhIGlzIGhhcHBlbmluZwotICAgICAgICAgKiBvbiBhIHNwZWFrZXIuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldERldmljZVR5cGUKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9UWVBFX1NQRUFLRVIgPSAyOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBIHJlY2VpdmVyIGRldmljZSB0eXBlIG9mIHRoZSByb3V0ZSBpbmRpY2F0aW5nIHRoZSBwcmVzZW50YXRpb24gb2YgdGhlIG1lZGlhIGlzIGhhcHBlbmluZwotICAgICAgICAgKiBvbiBhIGJsdWV0b290aCBkZXZpY2Ugc3VjaCBhcyBhIGJsdWV0b290aCBzcGVha2VyLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXREZXZpY2VUeXBlCi0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfVFlQRV9CTFVFVE9PVEggPSAzOwotCi0gICAgICAgIEBJbnREZWYoe1BMQVlCQUNLX1ZPTFVNRV9GSVhFRCxQTEFZQkFDS19WT0xVTUVfVkFSSUFCTEV9KQotICAgICAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi0gICAgICAgIHByaXZhdGUgQGludGVyZmFjZSBQbGF5YmFja1ZvbHVtZSB7fQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBQbGF5YmFjayBpbmZvcm1hdGlvbiBpbmRpY2F0aW5nIHRoZSBwbGF5YmFjayB2b2x1bWUgaXMgZml4ZWQsIGkuZS4gaXQgY2Fubm90IGJlCi0gICAgICAgICAqIGNvbnRyb2xsZWQgZnJvbSB0aGlzIG9iamVjdC4gQW4gZXhhbXBsZSBvZiBmaXhlZCBwbGF5YmFjayB2b2x1bWUgaXMgYSByZW1vdGUgcGxheWVyLAotICAgICAgICAgKiBwbGF5aW5nIG92ZXIgSERNSSB3aGVyZSB0aGUgdXNlciBwcmVmZXJzIHRvIGNvbnRyb2wgdGhlIHZvbHVtZSBvbiB0aGUgSERNSSBzaW5rLCByYXRoZXIKLSAgICAgICAgICogdGhhbiBhdHRlbnVhdGUgYXQgdGhlIHNvdXJjZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0Vm9sdW1lSGFuZGxpbmcKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1ZPTFVNRV9GSVhFRCA9IDA7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBsYXliYWNrIGluZm9ybWF0aW9uIGluZGljYXRpbmcgdGhlIHBsYXliYWNrIHZvbHVtZSBpcyB2YXJpYWJsZSBhbmQgY2FuIGJlIGNvbnRyb2xsZWQKLSAgICAgICAgICogZnJvbSB0aGlzIG9iamVjdC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0Vm9sdW1lSGFuZGxpbmcKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRSA9IDE7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBkZWZhdWx0IHByZXNlbnRhdGlvbiBkaXNwbGF5IGlkIGluZGljYXRpbmcgbm8gcHJlc2VudGF0aW9uIGRpc3BsYXkgaXMgYXNzb2NpYXRlZAotICAgICAgICAgKiB3aXRoIHRoZSByb3V0ZS4KLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRVNFTlRBVElPTl9ESVNQTEFZX0lEX05PTkUgPSAtMTsKLQotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENIQU5HRV9HRU5FUkFMID0gMSA8PCAwOwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENIQU5HRV9WT0xVTUUgPSAxIDw8IDE7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFX1BSRVNFTlRBVElPTl9ESVNQTEFZID0gMSA8PCAyOwotCi0gICAgICAgIC8vIFNob3VsZCBtYXRjaCB0byBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuUEFDS0FHRV9OQU1FLgotICAgICAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFNZU1RFTV9NRURJQV9ST1VURV9QUk9WSURFUl9QQUNLQUdFX05BTUUgPSAiYW5kcm9pZCI7Ci0KLSAgICAgICAgUm91dGVJbmZvKFByb3ZpZGVySW5mbyBwcm92aWRlciwgU3RyaW5nIGRlc2NyaXB0b3JJZCwgU3RyaW5nIHVuaXF1ZUlkKSB7Ci0gICAgICAgICAgICBtUHJvdmlkZXIgPSBwcm92aWRlcjsKLSAgICAgICAgICAgIG1EZXNjcmlwdG9ySWQgPSBkZXNjcmlwdG9ySWQ7Ci0gICAgICAgICAgICBtVW5pcXVlSWQgPSB1bmlxdWVJZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwcm92aWRlciBvZiB0aGlzIG1lZGlhIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFByb3ZpZGVySW5mbyBnZXRQcm92aWRlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBtUHJvdmlkZXI7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSByb3V0ZSB1bmlxdWUgaWQgZnVuY3Rpb25zIGFzIGEgc3RhYmxlIGlkZW50aWZpZXIgYnkgd2hpY2ggdGhlIHJvdXRlIGlzIGtub3duLgotICAgICAgICAgKiBGb3IgZXhhbXBsZSwgYW4gYXBwbGljYXRpb24gY2FuIHVzZSB0aGlzIGlkIGFzIGEgdG9rZW4gdG8gcmVtZW1iZXIgdGhlCi0gICAgICAgICAqIHNlbGVjdGVkIHJvdXRlIGFjcm9zcyByZXN0YXJ0cyBvciB0byBjb21tdW5pY2F0ZSBpdHMgaWRlbnRpdHkgdG8gYSBzZXJ2aWNlLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIHVuaXF1ZSBpZCBvZiB0aGUgcm91dGUsIG5ldmVyIG51bGwuCi0gICAgICAgICAqLwotICAgICAgICBATm9uTnVsbAotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1VbmlxdWVJZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSB1c2VyLXZpc2libGUgbmFtZSBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGUgcm91dGUgbmFtZSBpZGVudGlmaWVzIHRoZSBkZXN0aW5hdGlvbiByZXByZXNlbnRlZCBieSB0aGUgcm91dGUuCi0gICAgICAgICAqIEl0IG1heSBiZSBhIHVzZXItc3VwcGxpZWQgbmFtZSwgYW4gYWxpYXMsIG9yIGRldmljZSBzZXJpYWwgbnVtYmVyLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIHVzZXItdmlzaWJsZSBuYW1lIG9mIGEgbWVkaWEgcm91dGUuICBUaGlzIGlzIHRoZSBzdHJpbmcgcHJlc2VudGVkCi0gICAgICAgICAqIHRvIHVzZXJzIHdobyBtYXkgc2VsZWN0IHRoaXMgYXMgdGhlIGFjdGl2ZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSB1c2VyLXZpc2libGUgZGVzY3JpcHRpb24gb2YgdGhlIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhlIHJvdXRlIGRlc2NyaXB0aW9uIGRlc2NyaWJlcyB0aGUga2luZCBvZiBkZXN0aW5hdGlvbiByZXByZXNlbnRlZCBieSB0aGUgcm91dGUuCi0gICAgICAgICAqIEl0IG1heSBiZSBhIHVzZXItc3VwcGxpZWQgc3RyaW5nLCBhIG1vZGVsIG51bWJlciBvciBicmFuZCBvZiBkZXZpY2UuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgZGVzY3JpcHRpb24gb2YgdGhlIHJvdXRlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICAgICAqLwotICAgICAgICBATnVsbGFibGUKLSAgICAgICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGVzY3JpcHRpb247Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgVVJJIG9mIHRoZSBpY29uIHJlcHJlc2VudGluZyB0aGlzIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhpcyBpY29uIHdpbGwgYmUgdXNlZCBpbiBwaWNrZXIgVUlzIGlmIGF2YWlsYWJsZS4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBVUkkgb2YgdGhlIGljb24gcmVwcmVzZW50aW5nIHRoaXMgcm91dGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBVcmkgZ2V0SWNvblVyaSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSWNvblVyaTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyByb3V0ZSBpcyBlbmFibGVkIGFuZCBtYXkgYmUgc2VsZWN0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGVuYWJsZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUVuYWJsZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBjb25uZWN0aW5nIGFuZCBpcyBub3QKLSAgICAgICAgICogeWV0IHJlYWR5IGZvciB1c2UuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGluIHRoZSBwcm9jZXNzIG9mIGNvbm5lY3RpbmcuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0Nvbm5lY3RpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbm5lY3Rpbmc7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhpcyByb3V0ZToge0BsaW5rICNDT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRH0sCi0gICAgICAgICAqIHtAbGluayAjQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HfSwgb3Ige0BsaW5rICNDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRH0uCi0gICAgICAgICAqLwotICAgICAgICBAQ29ubmVjdGlvblN0YXRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29ubmVjdGlvblN0YXRlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db25uZWN0aW9uU3RhdGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcm91dGUgaXMgY3VycmVudGx5IHNlbGVjdGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyByb3V0ZSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIjZ2V0U2VsZWN0ZWRSb3V0ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNTZWxlY3RlZCgpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0U2VsZWN0ZWRSb3V0ZSgpID09IHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcm91dGUgaXMgdGhlIGRlZmF1bHQgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIHRoZSBkZWZhdWx0IHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhUm91dGVyI2dldERlZmF1bHRSb3V0ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0KCkgewotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXREZWZhdWx0Um91dGUoKSA9PSB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGEgYmx1ZXRvb3RoIHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyByb3V0ZSBpcyBhIGJsdWV0b290aCByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBNZWRpYVJvdXRlciNnZXRCbHVldG9vdGhSb3V0ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNCbHVldG9vdGgoKSB7Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgICAgIHJldHVybiBzR2xvYmFsLmdldEJsdWV0b290aFJvdXRlKCkgPT0gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyByb3V0ZSBpcyB0aGUgZGVmYXVsdCByb3V0ZSBhbmQgdGhlIGRldmljZSBzcGVha2VyLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyByb3V0ZSBpcyB0aGUgZGVmYXVsdCByb3V0ZSBhbmQgdGhlIGRldmljZSBzcGVha2VyLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEZXZpY2VTcGVha2VyKCkgewotICAgICAgICAgICAgaW50IGRlZmF1bHRBdWRpb1JvdXRlTmFtZVJlc291cmNlSWQgPSBSZXNvdXJjZXMuZ2V0U3lzdGVtKCkuZ2V0SWRlbnRpZmllcigKLSAgICAgICAgICAgICAgICAgICAgImRlZmF1bHRfYXVkaW9fcm91dGVfbmFtZSIsICJzdHJpbmciLCAiYW5kcm9pZCIpOwotICAgICAgICAgICAgcmV0dXJuIGlzRGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgICAgICYmIFJlc291cmNlcy5nZXRTeXN0ZW0oKS5nZXRUZXh0KGRlZmF1bHRBdWRpb1JvdXRlTmFtZVJlc291cmNlSWQpLmVxdWFscyhtTmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyBhIGxpc3Qgb2Yge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGludGVudH0gZmlsdGVycyB0aGF0Ci0gICAgICAgICAqIGRlc2NyaWJlIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhpcyByb3V0ZSBhbmQgdGhlIG1lZGlhIGNvbnRyb2wgYWN0aW9ucyB0aGF0Ci0gICAgICAgICAqIGl0IHN1cHBvcnRzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIEEgbGlzdCBvZiBpbnRlbnQgZmlsdGVycyB0aGF0IHNwZWNpZmllcyB0aGUgbWVkaWEgY29udHJvbCBpbnRlbnRzIHRoYXQKLSAgICAgICAgICogdGhpcyByb3V0ZSBzdXBwb3J0cy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQKLSAgICAgICAgICogQHNlZSAjc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkKLSAgICAgICAgICogQHNlZSAjc3VwcG9ydHNDb250cm9sUmVxdWVzdAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIExpc3Q8SW50ZW50RmlsdGVyPiBnZXRDb250cm9sRmlsdGVycygpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbEZpbHRlcnM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBhdCBsZWFzdCBvbmUgb2YgdGhlIGNhcGFiaWxpdGllcwotICAgICAgICAgKiBkZXNjcmliZWQgYnkgYSBtZWRpYSByb3V0ZSBzZWxlY3Rvci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBzZWxlY3RvciB0aGF0IHNwZWNpZmllcyB0aGUgY2FwYWJpbGl0aWVzIHRvIGNoZWNrLgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIGF0IGxlYXN0IG9uZSBvZiB0aGUgY2FwYWJpbGl0aWVzCi0gICAgICAgICAqIGRlc2NyaWJlZCBpbiB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzU2VsZWN0b3IoQE5vbk51bGwgTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgcmV0dXJuIHNlbGVjdG9yLm1hdGNoZXNDb250cm9sRmlsdGVycyhtQ29udHJvbEZpbHRlcnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgdGhlIHNwZWNpZmllZAotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IGNhdGVnb3J5LgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogTWVkaWEgY29udHJvbCBjYXRlZ29yaWVzIGRlc2NyaWJlIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhpcyByb3V0ZQotICAgICAgICAgKiBzdWNoIGFzIHdoZXRoZXIgaXQgc3VwcG9ydHMgbGl2ZSBhdWRpbyBzdHJlYW1pbmcgb3IgcmVtb3RlIHBsYXliYWNrLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjYXRlZ29yeSBBIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbH0gY2F0ZWdvcnkKLSAgICAgICAgICogc3VjaCBhcyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfQVVESU99LAotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfVklERU99LAotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDS30sIG9yIGEgcHJvdmlkZXItZGVmaW5lZAotICAgICAgICAgKiBtZWRpYSBjb250cm9sIGNhdGVnb3J5LgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQgaW50ZW50IGNhdGVnb3J5LgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudAotICAgICAgICAgKiBAc2VlICNnZXRDb250cm9sRmlsdGVycwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoQE5vbk51bGwgU3RyaW5nIGNhdGVnb3J5KSB7Ci0gICAgICAgICAgICBpZiAoY2F0ZWdvcnkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNhdGVnb3J5IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgICAgICBpbnQgY291bnQgPSBtQ29udHJvbEZpbHRlcnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Db250cm9sRmlsdGVycy5nZXQoaSkuaGFzQ2F0ZWdvcnkoY2F0ZWdvcnkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQKLSAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSBjYXRlZ29yeSBhbmQgYWN0aW9uLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogTWVkaWEgY29udHJvbCBhY3Rpb25zIGRlc2NyaWJlIHNwZWNpZmljIHJlcXVlc3RzIHRoYXQgYW4gYXBwbGljYXRpb24KLSAgICAgICAgICogY2FuIGFzayBhIHJvdXRlIHRvIHBlcmZvcm0uCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNhdGVnb3J5IEEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSBjYXRlZ29yeQotICAgICAgICAgKiBzdWNoIGFzIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9BVURJT30sCi0gICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9WSURFT30sCi0gICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLfSwgb3IgYSBwcm92aWRlci1kZWZpbmVkCi0gICAgICAgICAqIG1lZGlhIGNvbnRyb2wgY2F0ZWdvcnkuCi0gICAgICAgICAqIEBwYXJhbSBhY3Rpb24gQSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IGFjdGlvbgotICAgICAgICAgKiBzdWNoIGFzIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVl9LgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQgaW50ZW50IGFjdGlvbi4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQKLSAgICAgICAgICogQHNlZSAjZ2V0Q29udHJvbEZpbHRlcnMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzQ29udHJvbEFjdGlvbihATm9uTnVsbCBTdHJpbmcgY2F0ZWdvcnksIEBOb25OdWxsIFN0cmluZyBhY3Rpb24pIHsKLSAgICAgICAgICAgIGlmIChjYXRlZ29yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2F0ZWdvcnkgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYWN0aW9uIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgICAgICBpbnQgY291bnQgPSBtQ29udHJvbEZpbHRlcnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG1Db250cm9sRmlsdGVycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbHRlci5oYXNDYXRlZ29yeShjYXRlZ29yeSkgJiYgZmlsdGVyLmhhc0FjdGlvbihhY3Rpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHRoZSBzcGVjaWZpZWQKLSAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSByZXF1ZXN0LgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogTWVkaWEgY29udHJvbCByZXF1ZXN0cyBhcmUgdXNlZCB0byByZXF1ZXN0IHRoZSByb3V0ZSB0byBwZXJmb3JtCi0gICAgICAgICAqIGFjdGlvbnMgc3VjaCBhcyBzdGFydGluZyByZW1vdGUgcGxheWJhY2sgb2YgYSBtZWRpYSBpdGVtLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpbnRlbnQgQSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fS4KLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoZSByb3V0ZSBjYW4gaGFuZGxlIHRoZSBzcGVjaWZpZWQgaW50ZW50LgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudAotICAgICAgICAgKiBAc2VlICNnZXRDb250cm9sRmlsdGVycwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDb250cm9sUmVxdWVzdChATm9uTnVsbCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICBpZiAoaW50ZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnRlbnQgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgICAgIENvbnRlbnRSZXNvbHZlciBjb250ZW50UmVzb2x2ZXIgPSBzR2xvYmFsLmdldENvbnRlbnRSZXNvbHZlcigpOwotICAgICAgICAgICAgaW50IGNvdW50ID0gbUNvbnRyb2xGaWx0ZXJzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtQ29udHJvbEZpbHRlcnMuZ2V0KGkpLm1hdGNoKGNvbnRlbnRSZXNvbHZlciwgaW50ZW50LCB0cnVlLCBUQUcpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNlbmRzIGEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSByZXF1ZXN0IHRvIGJlIHBlcmZvcm1lZAotICAgICAgICAgKiBhc3luY2hyb25vdXNseSBieSB0aGUgcm91dGUncyBkZXN0aW5hdGlvbi4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIE1lZGlhIGNvbnRyb2wgcmVxdWVzdHMgYXJlIHVzZWQgdG8gcmVxdWVzdCB0aGUgcm91dGUgdG8gcGVyZm9ybQotICAgICAgICAgKiBhY3Rpb25zIHN1Y2ggYXMgc3RhcnRpbmcgcmVtb3RlIHBsYXliYWNrIG9mIGEgbWVkaWEgaXRlbS4KLSAgICAgICAgICogPC9wPjxwPgotICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBvbmx5IGJlIGNhbGxlZCBvbiBhIHNlbGVjdGVkIHJvdXRlLiAgQ29udHJvbCByZXF1ZXN0cwotICAgICAgICAgKiBzZW50IHRvIHVuc2VsZWN0ZWQgcm91dGVzIHdpbGwgZmFpbC4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gaW50ZW50IEEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGludGVudH0uCi0gICAgICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIHtAbGluayBDb250cm9sUmVxdWVzdENhbGxiYWNrfSB0byBpbnZva2Ugd2l0aCB0aGUgcmVzdWx0Ci0gICAgICAgICAqIG9mIHRoZSByZXF1ZXN0LCBvciBudWxsIGlmIG5vIHJlc3VsdCBpcyByZXF1aXJlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlbmRDb250cm9sUmVxdWVzdChATm9uTnVsbCBJbnRlbnQgaW50ZW50LAotICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBpZiAoaW50ZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpbnRlbnQgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgICAgIHNHbG9iYWwuc2VuZENvbnRyb2xSZXF1ZXN0KHRoaXMsIGludGVudCwgY2FsbGJhY2spOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHR5cGUgb2YgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIHR5cGUgb2YgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGU6IHtAbGluayAjUExBWUJBQ0tfVFlQRV9MT0NBTH0KLSAgICAgICAgICogb3Ige0BsaW5rICNQTEFZQkFDS19UWVBFX1JFTU9URX0uCi0gICAgICAgICAqLwotICAgICAgICBAUGxheWJhY2tUeXBlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UGxheWJhY2tUeXBlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5YmFja1R5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgYXVkaW8gc3RyZWFtIG92ZXIgd2hpY2ggdGhlIHBsYXliYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlIGlzIHBlcmZvcm1lZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgc3RyZWFtIG92ZXIgd2hpY2ggdGhlIHBsYXliYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlIGlzIHBlcmZvcm1lZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UGxheWJhY2tTdHJlYW0oKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrU3RyZWFtOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHR5cGUgb2YgdGhlIHJlY2VpdmVyIGRldmljZSBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgdHlwZSBvZiB0aGUgcmVjZWl2ZXIgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlOgotICAgICAgICAgKiB7QGxpbmsgI0RFVklDRV9UWVBFX1RWfSBvciB7QGxpbmsgI0RFVklDRV9UWVBFX1NQRUFLRVJ9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBnZXREZXZpY2VUeXBlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EZXZpY2VUeXBlOwotICAgICAgICB9Ci0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRGVmYXVsdE9yQmx1ZXRvb3RoKCkgewotICAgICAgICAgICAgaWYgKGlzRGVmYXVsdCgpIHx8IG1EZXZpY2VUeXBlID09IERFVklDRV9UWVBFX0JMVUVUT09USCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIHBsYXRmb3JtIHZlcnNpb24gMjMgb3IgYmVsb3cgd2hlcmUgdGhlIHN5c3RlbSByb3V0ZQotICAgICAgICAgICAgLy8gcHJvdmlkZXIgZG9lc24ndCBzcGVjaWZ5IGRldmljZSB0eXBlIGZvciBibHVldG9vdGggbWVkaWEgcm91dGVzLgotICAgICAgICAgICAgcmV0dXJuIGlzU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyKHRoaXMpCi0gICAgICAgICAgICAgICAgICAgICYmIHN1cHBvcnRzQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKQotICAgICAgICAgICAgICAgICAgICAmJiAhc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfVklERU8pOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSByb3V0ZSBpcyBzZWxlY3RhYmxlLgotICAgICAgICAgKi8KLSAgICAgICAgYm9vbGVhbiBpc1NlbGVjdGFibGUoKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIHRlc3RzIHdoZXRoZXIgdGhlIHJvdXRlIGlzIHN0aWxsIHZhbGlkIGFuZCBlbmFibGVkLgotICAgICAgICAgICAgLy8gVGhlIHJvdXRlIGRlc2NyaXB0b3IgZmllbGQgaXMgc2V0IHRvIG51bGwgd2hlbiB0aGUgcm91dGUgaXMgcmVtb3ZlZC4KLSAgICAgICAgICAgIHJldHVybiBtRGVzY3JpcHRvciAhPSBudWxsICYmIG1FbmFibGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc1N5c3RlbU1lZGlhUm91dGVQcm92aWRlcihNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIHJldHVybiBUZXh0VXRpbHMuZXF1YWxzKHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKS5nZXRNZXRhZGF0YSgpLmdldFBhY2thZ2VOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgIFNZU1RFTV9NRURJQV9ST1VURV9QUk9WSURFUl9QQUNLQUdFX05BTUUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgaG93IHZvbHVtZSBpcyBoYW5kbGVkIG9uIHRoZSByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBIb3cgdm9sdW1lIGlzIGhhbmRsZWQgb24gdGhlIHJvdXRlOiB7QGxpbmsgI1BMQVlCQUNLX1ZPTFVNRV9GSVhFRH0KLSAgICAgICAgICogb3Ige0BsaW5rICNQTEFZQkFDS19WT0xVTUVfVkFSSUFCTEV9LgotICAgICAgICAgKi8KLSAgICAgICAgQFBsYXliYWNrVm9sdW1lCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Vm9sdW1lSGFuZGxpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVZvbHVtZUhhbmRsaW5nOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIGN1cnJlbnQgdm9sdW1lIGZvciB0aGlzIHJvdXRlLiBEZXBlbmRpbmcgb24gdGhlIHJvdXRlLCB0aGlzIG1heSBvbmx5Ci0gICAgICAgICAqIGJlIHZhbGlkIGlmIHRoZSByb3V0ZSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIHZvbHVtZSBhdCB3aGljaCB0aGUgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUgaXMgcGVyZm9ybWVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBnZXRWb2x1bWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVZvbHVtZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIHZvbHVtZSBhdCB3aGljaCB0aGUgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUgaXMgcGVyZm9ybWVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBtYXhpbXVtIHZvbHVtZSBhdCB3aGljaCB0aGUgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoCi0gICAgICAgICAqIHRoaXMgcm91dGUgaXMgcGVyZm9ybWVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBnZXRWb2x1bWVNYXgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVZvbHVtZU1heDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHdoZXRoZXIgdGhpcyByb3V0ZSBzdXBwb3J0cyBkaXNjb25uZWN0aW5nIHdpdGhvdXQgaW50ZXJydXB0aW5nCi0gICAgICAgICAqIHBsYXliYWNrLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhpcyByb3V0ZSBjYW4gZGlzY29ubmVjdCB3aXRob3V0IHN0b3BwaW5nIHBsYXliYWNrLAotICAgICAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGNhbkRpc2Nvbm5lY3QoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNhbkRpc2Nvbm5lY3Q7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVxdWVzdHMgYSB2b2x1bWUgY2hhbmdlIGZvciB0aGlzIHJvdXRlIGFzeW5jaHJvbm91c2x5LgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhpcyBmdW5jdGlvbiBtYXkgb25seSBiZSBjYWxsZWQgb24gYSBzZWxlY3RlZCByb3V0ZS4gIEl0IHdpbGwgaGF2ZQotICAgICAgICAgKiBubyBlZmZlY3QgaWYgdGhlIHJvdXRlIGlzIGN1cnJlbnRseSB1bnNlbGVjdGVkLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB2b2x1bWUgVGhlIG5ldyB2b2x1bWUgdmFsdWUgYmV0d2VlbiAwIGFuZCB7QGxpbmsgI2dldFZvbHVtZU1heH0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0U2V0Vm9sdW1lKGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgc0dsb2JhbC5yZXF1ZXN0U2V0Vm9sdW1lKHRoaXMsIE1hdGgubWluKG1Wb2x1bWVNYXgsIE1hdGgubWF4KDAsIHZvbHVtZSkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXF1ZXN0cyBhbiBpbmNyZW1lbnRhbCB2b2x1bWUgdXBkYXRlIGZvciB0aGlzIHJvdXRlIGFzeW5jaHJvbm91c2x5LgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhpcyBmdW5jdGlvbiBtYXkgb25seSBiZSBjYWxsZWQgb24gYSBzZWxlY3RlZCByb3V0ZS4gIEl0IHdpbGwgaGF2ZQotICAgICAgICAgKiBubyBlZmZlY3QgaWYgdGhlIHJvdXRlIGlzIGN1cnJlbnRseSB1bnNlbGVjdGVkLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkZWx0YSBUaGUgZGVsdGEgdG8gYWRkIHRvIHRoZSBjdXJyZW50IHZvbHVtZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RVcGRhdGVWb2x1bWUoaW50IGRlbHRhKSB7Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgICAgIGlmIChkZWx0YSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgc0dsb2JhbC5yZXF1ZXN0VXBkYXRlVm9sdW1lKHRoaXMsIGRlbHRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSB7QGxpbmsgRGlzcGxheX0gdGhhdCBzaG91bGQgYmUgdXNlZCBieSB0aGUgYXBwbGljYXRpb24gdG8gc2hvdwotICAgICAgICAgKiBhIHtAbGluayBhbmRyb2lkLmFwcC5QcmVzZW50YXRpb259IG9uIGFuIGV4dGVybmFsIGRpc3BsYXkgd2hlbiB0aGlzIHJvdXRlIGlzIHNlbGVjdGVkLgotICAgICAgICAgKiBEZXBlbmRpbmcgb24gdGhlIHJvdXRlLCB0aGlzIG1heSBvbmx5IGJlIHZhbGlkIGlmIHRoZSByb3V0ZSBpcyBjdXJyZW50bHkKLSAgICAgICAgICogc2VsZWN0ZWQuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGUgcHJlZmVycmVkIHByZXNlbnRhdGlvbiBkaXNwbGF5IG1heSBjaGFuZ2UgaW5kZXBlbmRlbnRseSBvZiB0aGUgcm91dGUKLSAgICAgICAgICogYmVpbmcgc2VsZWN0ZWQgb3IgdW5zZWxlY3RlZC4gIEZvciBleGFtcGxlLCB0aGUgcHJlc2VudGF0aW9uIGRpc3BsYXkKLSAgICAgICAgICogb2YgdGhlIGRlZmF1bHQgc3lzdGVtIHJvdXRlIG1heSBjaGFuZ2Ugd2hlbiBhbiBleHRlcm5hbCBIRE1JIGRpc3BsYXkgaXMgY29ubmVjdGVkCi0gICAgICAgICAqIG9yIGRpc2Nvbm5lY3RlZCBldmVuIHRob3VnaCB0aGUgcm91dGUgaXRzZWxmIGhhcyBub3QgY2hhbmdlZC4KLSAgICAgICAgICogPC9wPjxwPgotICAgICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgcmV0dXJuIG51bGwgaWYgdGhlcmUgaXMgbm8gZXh0ZXJuYWwgZGlzcGxheSBhc3NvY2lhdGVkIHdpdGgKLSAgICAgICAgICogdGhlIHJvdXRlIG9yIGlmIHRoZSBkaXNwbGF5IGlzIG5vdCByZWFkeSB0byBzaG93IFVJIHlldC4KLSAgICAgICAgICogPC9wPjxwPgotICAgICAgICAgKiBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGxpc3RlbiBmb3IgY2hhbmdlcyB0byB0aGUgcHJlc2VudGF0aW9uIGRpc3BsYXkKLSAgICAgICAgICogdXNpbmcgdGhlIHtAbGluayBDYWxsYmFjayNvblJvdXRlUHJlc2VudGF0aW9uRGlzcGxheUNoYW5nZWR9IGNhbGxiYWNrIGFuZAotICAgICAgICAgKiBzaG93IG9yIGRpc21pc3MgaXRzIHtAbGluayBhbmRyb2lkLmFwcC5QcmVzZW50YXRpb259IGFjY29yZGluZ2x5IHdoZW4gdGhlIGRpc3BsYXkKLSAgICAgICAgICogYmVjb21lcyBhdmFpbGFibGUgb3IgaXMgcmVtb3ZlZC4KLSAgICAgICAgICogPC9wPjxwPgotICAgICAgICAgKiBUaGlzIG1ldGhvZCBvbmx5IG1ha2VzIHNlbnNlIGZvcgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfVklERU8gbGl2ZSB2aWRlb30gcm91dGVzLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIHByZWZlcnJlZCBwcmVzZW50YXRpb24gZGlzcGxheSB0byB1c2Ugd2hlbiB0aGlzIHJvdXRlIGlzCi0gICAgICAgICAqIHNlbGVjdGVkIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9WSURFTwotICAgICAgICAgKiBAc2VlIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbgotICAgICAgICAgKi8KLSAgICAgICAgQE51bGxhYmxlCi0gICAgICAgIHB1YmxpYyBEaXNwbGF5IGdldFByZXNlbnRhdGlvbkRpc3BsYXkoKSB7Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgICAgIGlmIChtUHJlc2VudGF0aW9uRGlzcGxheUlkID49IDAgJiYgbVByZXNlbnRhdGlvbkRpc3BsYXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1QcmVzZW50YXRpb25EaXNwbGF5ID0gc0dsb2JhbC5nZXREaXNwbGF5KG1QcmVzZW50YXRpb25EaXNwbGF5SWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1QcmVzZW50YXRpb25EaXNwbGF5OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHJvdXRlJ3MgcHJlc2VudGF0aW9uIGRpc3BsYXkgaWQsIG9yIC0xIGlmIG5vbmUuCi0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgICAgICBwdWJsaWMgaW50IGdldFByZXNlbnRhdGlvbkRpc3BsYXlJZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUHJlc2VudGF0aW9uRGlzcGxheUlkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgYSBjb2xsZWN0aW9uIG9mIGV4dHJhIHByb3BlcnRpZXMgYWJvdXQgdGhpcyByb3V0ZSB0aGF0IHdlcmUgc3VwcGxpZWQKLSAgICAgICAgICogYnkgaXRzIG1lZGlhIHJvdXRlIHByb3ZpZGVyLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICAgICAqLwotICAgICAgICBATnVsbGFibGUKLSAgICAgICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUV4dHJhczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIGFuIGludGVudCBzZW5kZXIgZm9yIGxhdW5jaGluZyBhIHNldHRpbmdzIGFjdGl2aXR5IGZvciB0aGlzCi0gICAgICAgICAqIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgQE51bGxhYmxlCi0gICAgICAgIHB1YmxpYyBJbnRlbnRTZW5kZXIgZ2V0U2V0dGluZ3NJbnRlbnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVNldHRpbmdzSW50ZW50OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNlbGVjdHMgdGhpcyBtZWRpYSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdCgpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgc0dsb2JhbC5zZWxlY3RSb3V0ZSh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuICJNZWRpYVJvdXRlci5Sb3V0ZUluZm97IHVuaXF1ZUlkPSIgKyBtVW5pcXVlSWQKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBuYW1lPSIgKyBtTmFtZQotICAgICAgICAgICAgICAgICAgICArICIsIGRlc2NyaXB0aW9uPSIgKyBtRGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgICAgKyAiLCBpY29uVXJpPSIgKyBtSWNvblVyaQotICAgICAgICAgICAgICAgICAgICArICIsIGVuYWJsZWQ9IiArIG1FbmFibGVkCi0gICAgICAgICAgICAgICAgICAgICsgIiwgY29ubmVjdGluZz0iICsgbUNvbm5lY3RpbmcKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBjb25uZWN0aW9uU3RhdGU9IiArIG1Db25uZWN0aW9uU3RhdGUKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBjYW5EaXNjb25uZWN0PSIgKyBtQ2FuRGlzY29ubmVjdAotICAgICAgICAgICAgICAgICAgICArICIsIHBsYXliYWNrVHlwZT0iICsgbVBsYXliYWNrVHlwZQotICAgICAgICAgICAgICAgICAgICArICIsIHBsYXliYWNrU3RyZWFtPSIgKyBtUGxheWJhY2tTdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgKyAiLCBkZXZpY2VUeXBlPSIgKyBtRGV2aWNlVHlwZQotICAgICAgICAgICAgICAgICAgICArICIsIHZvbHVtZUhhbmRsaW5nPSIgKyBtVm9sdW1lSGFuZGxpbmcKLSAgICAgICAgICAgICAgICAgICAgKyAiLCB2b2x1bWU9IiArIG1Wb2x1bWUKLSAgICAgICAgICAgICAgICAgICAgKyAiLCB2b2x1bWVNYXg9IiArIG1Wb2x1bWVNYXgKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBwcmVzZW50YXRpb25EaXNwbGF5SWQ9IiArIG1QcmVzZW50YXRpb25EaXNwbGF5SWQKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBleHRyYXM9IiArIG1FeHRyYXMKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBzZXR0aW5nc0ludGVudD0iICsgbVNldHRpbmdzSW50ZW50Ci0gICAgICAgICAgICAgICAgICAgICsgIiwgcHJvdmlkZXJQYWNrYWdlTmFtZT0iICsgbVByb3ZpZGVyLmdldFBhY2thZ2VOYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiIH0iOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IG1heWJlVXBkYXRlRGVzY3JpcHRvcihNZWRpYVJvdXRlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBpbnQgY2hhbmdlcyA9IDA7Ci0gICAgICAgICAgICBpZiAobURlc2NyaXB0b3IgIT0gZGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgIGNoYW5nZXMgPSB1cGRhdGVEZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNoYW5nZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgdXBkYXRlRGVzY3JpcHRvcihNZWRpYVJvdXRlRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBpbnQgY2hhbmdlcyA9IDA7Ci0gICAgICAgICAgICBtRGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gICAgICAgICAgICBpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFlcXVhbChtTmFtZSwgZGVzY3JpcHRvci5nZXROYW1lKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1OYW1lID0gZGVzY3JpcHRvci5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghZXF1YWwobURlc2NyaXB0aW9uLCBkZXNjcmlwdG9yLmdldERlc2NyaXB0aW9uKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EZXNjcmlwdGlvbiA9IGRlc2NyaXB0b3IuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFlcXVhbChtSWNvblVyaSwgZGVzY3JpcHRvci5nZXRJY29uVXJpKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1JY29uVXJpID0gZGVzY3JpcHRvci5nZXRJY29uVXJpKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtRW5hYmxlZCAhPSBkZXNjcmlwdG9yLmlzRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FbmFibGVkID0gZGVzY3JpcHRvci5pc0VuYWJsZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1Db25uZWN0aW5nICE9IGRlc2NyaXB0b3IuaXNDb25uZWN0aW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3RpbmcgPSBkZXNjcmlwdG9yLmlzQ29ubmVjdGluZygpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3Rpb25TdGF0ZSAhPSBkZXNjcmlwdG9yLmdldENvbm5lY3Rpb25TdGF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uU3RhdGUgPSBkZXNjcmlwdG9yLmdldENvbm5lY3Rpb25TdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIW1Db250cm9sRmlsdGVycy5lcXVhbHMoZGVzY3JpcHRvci5nZXRDb250cm9sRmlsdGVycygpKSkgewotICAgICAgICAgICAgICAgICAgICBtQ29udHJvbEZpbHRlcnMuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xGaWx0ZXJzLmFkZEFsbChkZXNjcmlwdG9yLmdldENvbnRyb2xGaWx0ZXJzKCkpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrVHlwZSAhPSBkZXNjcmlwdG9yLmdldFBsYXliYWNrVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja1R5cGUgPSBkZXNjcmlwdG9yLmdldFBsYXliYWNrVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrU3RyZWFtICE9IGRlc2NyaXB0b3IuZ2V0UGxheWJhY2tTdHJlYW0oKSkgewotICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2tTdHJlYW0gPSBkZXNjcmlwdG9yLmdldFBsYXliYWNrU3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtRGV2aWNlVHlwZSAhPSBkZXNjcmlwdG9yLmdldERldmljZVR5cGUoKSkgewotICAgICAgICAgICAgICAgICAgICBtRGV2aWNlVHlwZSA9IGRlc2NyaXB0b3IuZ2V0RGV2aWNlVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVZvbHVtZUhhbmRsaW5nICE9IGRlc2NyaXB0b3IuZ2V0Vm9sdW1lSGFuZGxpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBtVm9sdW1lSGFuZGxpbmcgPSBkZXNjcmlwdG9yLmdldFZvbHVtZUhhbmRsaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUwgfCBDSEFOR0VfVk9MVU1FOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVZvbHVtZSAhPSBkZXNjcmlwdG9yLmdldFZvbHVtZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Wb2x1bWUgPSBkZXNjcmlwdG9yLmdldFZvbHVtZSgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMIHwgQ0hBTkdFX1ZPTFVNRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1Wb2x1bWVNYXggIT0gZGVzY3JpcHRvci5nZXRWb2x1bWVNYXgoKSkgewotICAgICAgICAgICAgICAgICAgICBtVm9sdW1lTWF4ID0gZGVzY3JpcHRvci5nZXRWb2x1bWVNYXgoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTCB8IENIQU5HRV9WT0xVTUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtUHJlc2VudGF0aW9uRGlzcGxheUlkICE9IGRlc2NyaXB0b3IuZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbkRpc3BsYXlJZCA9IGRlc2NyaXB0b3IuZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmVzZW50YXRpb25EaXNwbGF5ID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTCB8IENIQU5HRV9QUkVTRU5UQVRJT05fRElTUExBWTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFlcXVhbChtRXh0cmFzLCBkZXNjcmlwdG9yLmdldEV4dHJhcygpKSkgewotICAgICAgICAgICAgICAgICAgICBtRXh0cmFzID0gZGVzY3JpcHRvci5nZXRFeHRyYXMoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFlcXVhbChtU2V0dGluZ3NJbnRlbnQsIGRlc2NyaXB0b3IuZ2V0U2V0dGluZ3NBY3Rpdml0eSgpKSkgewotICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NJbnRlbnQgPSBkZXNjcmlwdG9yLmdldFNldHRpbmdzQWN0aXZpdHkoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1DYW5EaXNjb25uZWN0ICE9IGRlc2NyaXB0b3IuY2FuRGlzY29ubmVjdEFuZEtlZXBQbGF5aW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNhbkRpc2Nvbm5lY3QgPSBkZXNjcmlwdG9yLmNhbkRpc2Nvbm5lY3RBbmRLZWVwUGxheWluZygpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMIHwgQ0hBTkdFX1BSRVNFTlRBVElPTl9ESVNQTEFZOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjaGFuZ2VzOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGdldERlc2NyaXB0b3JJZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGVzY3JpcHRvcklkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqIEBoaWRlICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXIgZ2V0UHJvdmlkZXJJbnN0YW5jZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUHJvdmlkZXIuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5mb3JtYXRpb24gYWJvdXQgYSByb3V0ZSB0aGF0IGNvbnNpc3RzIG9mIG11bHRpcGxlIG90aGVyIHJvdXRlcyBpbiBhIGdyb3VwLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFJvdXRlR3JvdXAgZXh0ZW5kcyBSb3V0ZUluZm8gewotICAgICAgICBwcml2YXRlIExpc3Q8Um91dGVJbmZvPiBtUm91dGVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KLSAgICAgICAgUm91dGVHcm91cChQcm92aWRlckluZm8gcHJvdmlkZXIsIFN0cmluZyBkZXNjcmlwdG9ySWQsIFN0cmluZyB1bmlxdWVJZCkgewotICAgICAgICAgICAgc3VwZXIocHJvdmlkZXIsIGRlc2NyaXB0b3JJZCwgdW5pcXVlSWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIG51bWJlciBvZiByb3V0ZXMgaW4gdGhpcyBncm91cAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBnZXRSb3V0ZUNvdW50KCkgewotICAgICAgICAgICAgcmV0dXJuIG1Sb3V0ZXMuc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIHJvdXRlIGluIHRoaXMgZ3JvdXAgYXQgdGhlIHNwZWNpZmllZCBpbmRleAotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gaW5kZXggSW5kZXggdG8gZmV0Y2gKLSAgICAgICAgICogQHJldHVybiBUaGUgcm91dGUgYXQgaW5kZXgKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBSb3V0ZUluZm8gZ2V0Um91dGVBdChpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUm91dGVzLmdldChpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgcm91dGVzIGluIHRoaXMgZ3JvdXAKLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgbGlzdCBvZiB0aGUgcm91dGVzIGluIHRoaXMgZ3JvdXAKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBMaXN0PFJvdXRlSW5mbz4gZ2V0Um91dGVzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Sb3V0ZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcihzdXBlci50b1N0cmluZygpKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnWycpOwotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVJvdXRlcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHNiLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICAgICAgICBzYi5hcHBlbmQobVJvdXRlcy5nZXQoaSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2IuYXBwZW5kKCddJyk7Ci0gICAgICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBpbnQgbWF5YmVVcGRhdGVEZXNjcmlwdG9yKE1lZGlhUm91dGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKG1EZXNjcmlwdG9yICE9IGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgICAgICBtRGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMaXN0PFN0cmluZz4gZ3JvdXBNZW1iZXJJZHMgPSBkZXNjcmlwdG9yLmdldEdyb3VwTWVtYmVySWRzKCk7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8Um91dGVJbmZvPiByb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IGdyb3VwTWVtYmVySWRzLnNpemUoKSAhPSBtUm91dGVzLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChTdHJpbmcgZ3JvdXBNZW1iZXJJZCA6IGdyb3VwTWVtYmVySWRzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdW5pcXVlSWQgPSBzR2xvYmFsLmdldFVuaXF1ZUlkKGdldFByb3ZpZGVyKCksIGdyb3VwTWVtYmVySWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVJbmZvIGdyb3VwTWVtYmVyID0gc0dsb2JhbC5nZXRSb3V0ZSh1bmlxdWVJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ3JvdXBNZW1iZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlcy5hZGQoZ3JvdXBNZW1iZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2hhbmdlZCAmJiAhbVJvdXRlcy5jb250YWlucyhncm91cE1lbWJlcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVzID0gcm91dGVzOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIChjaGFuZ2VkID8gQ0hBTkdFX0dFTkVSQUwgOiAwKSB8IHN1cGVyLnVwZGF0ZURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgb2JqZWN0IG1heSBiZSB1c2VkIHRvIGRldGVybWluZSB3aGljaCBtZWRpYSByb3V0ZSBwcm92aWRlciBoYXMKLSAgICAgKiBwdWJsaXNoZWQgYSBwYXJ0aWN1bGFyIHJvdXRlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByb3ZpZGVySW5mbyB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZVByb3ZpZGVyIG1Qcm92aWRlckluc3RhbmNlOwotICAgICAgICBwcml2YXRlIGZpbmFsIExpc3Q8Um91dGVJbmZvPiBtUm91dGVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlck1ldGFkYXRhIG1NZXRhZGF0YTsKLSAgICAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIG1EZXNjcmlwdG9yOwotICAgICAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzb3VyY2VzOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVJlc291cmNlc05vdEF2YWlsYWJsZTsKLQotICAgICAgICBQcm92aWRlckluZm8oTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyKSB7Ci0gICAgICAgICAgICBtUHJvdmlkZXJJbnN0YW5jZSA9IHByb3ZpZGVyOwotICAgICAgICAgICAgbU1ldGFkYXRhID0gcHJvdmlkZXIuZ2V0TWV0YWRhdGEoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBwcm92aWRlcidzIHVuZGVybHlpbmcge0BsaW5rIE1lZGlhUm91dGVQcm92aWRlcn0gaW5zdGFuY2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZVByb3ZpZGVyIGdldFByb3ZpZGVySW5zdGFuY2UoKSB7Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgICAgIHJldHVybiBtUHJvdmlkZXJJbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlTmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTWV0YWRhdGEuZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBjb21wb25lbnQgbmFtZSBvZiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQ29tcG9uZW50TmFtZSBnZXRDb21wb25lbnROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG1NZXRhZGF0YS5nZXRDb21wb25lbnROYW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZXN9IHB1Ymxpc2hlZCBieSB0aGlzIHJvdXRlIHByb3ZpZGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIExpc3Q8Um91dGVJbmZvPiBnZXRSb3V0ZXMoKSB7Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgICAgIHJldHVybiBtUm91dGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVzb3VyY2VzIGdldFJlc291cmNlcygpIHsKLSAgICAgICAgICAgIGlmIChtUmVzb3VyY2VzID09IG51bGwgJiYgIW1SZXNvdXJjZXNOb3RBdmFpbGFibGUpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBnZXRQYWNrYWdlTmFtZSgpOwotICAgICAgICAgICAgICAgIENvbnRleHQgY29udGV4dCA9IHNHbG9iYWwuZ2V0UHJvdmlkZXJDb250ZXh0KHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoY29udGV4dCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMgPSBjb250ZXh0LmdldFJlc291cmNlcygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlVuYWJsZSB0byBvYnRhaW4gcmVzb3VyY2VzIGZvciByb3V0ZSBwcm92aWRlciBwYWNrYWdlOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBwYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXNOb3RBdmFpbGFibGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtUmVzb3VyY2VzOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiB1cGRhdGVEZXNjcmlwdG9yKE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgaWYgKG1EZXNjcmlwdG9yICE9IGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgICAgICBtRGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZmluZFJvdXRlQnlEZXNjcmlwdG9ySWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtUm91dGVzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtUm91dGVzLmdldChpKS5tRGVzY3JpcHRvcklkLmVxdWFscyhpZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIk1lZGlhUm91dGVyLlJvdXRlUHJvdmlkZXJJbmZveyBwYWNrYWdlTmFtZT0iICsgZ2V0UGFja2FnZU5hbWUoKQotICAgICAgICAgICAgICAgICAgICArICIgfSI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2UgZm9yIHJlY2VpdmluZyBldmVudHMgYWJvdXQgbWVkaWEgcm91dGluZyBjaGFuZ2VzLgotICAgICAqIEFsbCBtZXRob2RzIG9mIHRoaXMgaW50ZXJmYWNlIHdpbGwgYmUgY2FsbGVkIGZyb20gdGhlIGFwcGxpY2F0aW9uJ3MgbWFpbiB0aHJlYWQuCi0gICAgICogPHA+Ci0gICAgICogQSBDYWxsYmFjayB3aWxsIG9ubHkgcmVjZWl2ZSBldmVudHMgcmVsZXZhbnQgdG8gcm91dGVzIHRoYXQgdGhlIGNhbGxiYWNrCi0gICAgICogd2FzIHJlZ2lzdGVyZWQgZm9yIHVubGVzcyB0aGUge0BsaW5rIE1lZGlhUm91dGVyI0NBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFN9Ci0gICAgICogZmxhZyB3YXMgc3BlY2lmaWVkIGluIHtAbGluayBNZWRpYVJvdXRlciNhZGRDYWxsYmFjayhNZWRpYVJvdXRlU2VsZWN0b3IsIENhbGxiYWNrLCBpbnQpfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyI2FkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciwgQ2FsbGJhY2ssIGludCkKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyI3JlbW92ZUNhbGxiYWNrKENhbGxiYWNrKQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ2FsbGJhY2sgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHN1cHBsaWVkIG1lZGlhIHJvdXRlIGJlY29tZXMgc2VsZWN0ZWQgYXMgdGhlIGFjdGl2ZSByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdGhhdCBoYXMgYmVlbiBzZWxlY3RlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVTZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBzdXBwbGllZCBtZWRpYSByb3V0ZSBiZWNvbWVzIHVuc2VsZWN0ZWQgYXMgdGhlIGFjdGl2ZSByb3V0ZS4KLSAgICAgICAgICogRm9yIGRldGFpbGVkIHJlYXNvbiwgb3ZlcnJpZGUge0BsaW5rICNvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciwgUm91dGVJbmZvLCBpbnQpfQotICAgICAgICAgKiBpbnN0ZWFkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0aGF0IGhhcyBiZWVuIHVuc2VsZWN0ZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBzdXBwbGllZCBtZWRpYSByb3V0ZSBiZWNvbWVzIHVuc2VsZWN0ZWQgYXMgdGhlIGFjdGl2ZSByb3V0ZS4KLSAgICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY2FsbHMge0BsaW5rICNvblJvdXRlVW5zZWxlY3RlZH0uCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGUgcmVhc29uIHByb3ZpZGVkIHdpbGwgYmUgb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgICAqIDx1bD4KLSAgICAgICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fVU5LTk9XTn08L2xpPgotICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9ESVNDT05ORUNURUR9PC9saT4KLSAgICAgICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fU1RPUFBFRH08L2xpPgotICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9ST1VURV9DSEFOR0VEfTwvbGk+Ci0gICAgICAgICAqIDwvdWw+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRoYXQgaGFzIGJlZW4gdW5zZWxlY3RlZC4KLSAgICAgICAgICogQHBhcmFtIHJlYXNvbiBUaGUgcmVhc29uIGZvciB1bnNlbGVjdGluZyB0aGUgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIFJvdXRlSW5mbyByb3V0ZSwgaW50IHJlYXNvbikgewotICAgICAgICAgICAgb25Sb3V0ZVVuc2VsZWN0ZWQocm91dGVyLCByb3V0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSByb3V0ZSBoYXMgYmVlbiBhZGRlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdGhhdCBoYXMgYmVjb21lIGF2YWlsYWJsZSBmb3IgdXNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUFkZGVkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSByb3V0ZSBoYXMgYmVlbiByZW1vdmVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0aGF0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSBhdmFpbGFiaWxpdHkuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgcHJvcGVydHkgb2YgdGhlIGluZGljYXRlZCBtZWRpYSByb3V0ZSBoYXMgY2hhbmdlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdGhhdCB3YXMgY2hhbmdlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSByb3V0ZSdzIHZvbHVtZSBjaGFuZ2VzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB3aG9zZSB2b2x1bWUgY2hhbmdlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVWb2x1bWVDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSByb3V0ZSdzIHByZXNlbnRhdGlvbiBkaXNwbGF5IGNoYW5nZXMuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbmV2ZXIgdGhlIHJvdXRlJ3MgcHJlc2VudGF0aW9uIGRpc3BsYXkgYmVjb21lcwotICAgICAgICAgKiBhdmFpbGFibGUsIGlzIHJlbW92ZWQgb3IgaGFzIGNoYW5nZXMgdG8gc29tZSBvZiBpdHMgcHJvcGVydGllcyAoc3VjaCBhcyBpdHMgc2l6ZSkuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgd2hvc2UgcHJlc2VudGF0aW9uIGRpc3BsYXkgY2hhbmdlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBSb3V0ZUluZm8jZ2V0UHJlc2VudGF0aW9uRGlzcGxheSgpCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUHJlc2VudGF0aW9uRGlzcGxheUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGhhcyBiZWVuIGFkZGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHByb3ZpZGVyIFRoZSBwcm92aWRlciB0aGF0IGhhcyBiZWNvbWUgYXZhaWxhYmxlIGZvciB1c2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyQWRkZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBQcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGhhcyBiZWVuIHJlbW92ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcHJvdmlkZXIgVGhlIHByb3ZpZGVyIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIGF2YWlsYWJpbGl0eS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJSZW1vdmVkKE1lZGlhUm91dGVyIHJvdXRlciwgUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBwcm9wZXJ0eSBvZiB0aGUgaW5kaWNhdGVkIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGhhcyBjaGFuZ2VkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHByb3ZpZGVyIFRoZSBwcm92aWRlciB0aGF0IHdhcyBjaGFuZ2VkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBQcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrIHdoaWNoIGlzIGludm9rZWQgd2l0aCB0aGUgcmVzdWx0IG9mIGEgbWVkaWEgY29udHJvbCByZXF1ZXN0LgotICAgICAqCi0gICAgICogQHNlZSBSb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDb250cm9sUmVxdWVzdENhbGxiYWNrIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgY29udHJvbCByZXF1ZXN0IHN1Y2NlZWRzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBSZXN1bHQgZGF0YSwgb3IgbnVsbCBpZiBub25lLgotICAgICAgICAgKiBDb250ZW50cyBkZXBlbmQgb24gdGhlIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBhY3Rpb259LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIGNvbnRyb2wgcmVxdWVzdCBmYWlscy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGVycm9yIEEgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2Ugd2hpY2ggbWF5IGJlIHNob3duIHRvIHRoZSB1c2VyLCBvciBudWxsCi0gICAgICAgICAqIGlmIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IgaXMgdW5jbGVhci4KLSAgICAgICAgICogQHBhcmFtIGRhdGEgRXJyb3IgZGF0YSwgb3IgbnVsbCBpZiBub25lLgotICAgICAgICAgKiBDb250ZW50cyBkZXBlbmQgb24gdGhlIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBhY3Rpb259LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihTdHJpbmcgZXJyb3IsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBDYWxsYmFja1JlY29yZCB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBNZWRpYVJvdXRlciBtUm91dGVyOwotICAgICAgICBwdWJsaWMgZmluYWwgQ2FsbGJhY2sgbUNhbGxiYWNrOwotICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvcjsKLSAgICAgICAgcHVibGljIGludCBtRmxhZ3M7Ci0KLSAgICAgICAgcHVibGljIENhbGxiYWNrUmVjb3JkKE1lZGlhUm91dGVyIHJvdXRlciwgQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIgPSByb3V0ZXI7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGZpbHRlclJvdXRlRXZlbnQoUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1GbGFncyAmIENBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFMpICE9IDAKLSAgICAgICAgICAgICAgICAgICAgfHwgcm91dGUubWF0Y2hlc1NlbGVjdG9yKG1TZWxlY3Rvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHbG9iYWwgc3RhdGUgZm9yIHRoZSBtZWRpYSByb3V0ZXIuCi0gICAgICogPHA+Ci0gICAgICogTWVkaWEgcm91dGVzIGFuZCBtZWRpYSByb3V0ZSBwcm92aWRlcnMgYXJlIGdsb2JhbCB0byB0aGUgcHJvY2VzczsgdGhlaXIKLSAgICAgKiBzdGF0ZSBhbmQgdGhlIGJ1bGsgb2YgdGhlIG1lZGlhIHJvdXRlciBpbXBsZW1lbnRhdGlvbiBsaXZlcyBoZXJlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBHbG9iYWxNZWRpYVJvdXRlcgotICAgICAgICAgICAgaW1wbGVtZW50cyBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuU3luY0NhbGxiYWNrLAotICAgICAgICAgICAgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcldhdGNoZXIuQ2FsbGJhY2sgewotICAgICAgICBmaW5hbCBDb250ZXh0IG1BcHBsaWNhdGlvbkNvbnRleHQ7Ci0gICAgICAgIGZpbmFsIEFycmF5TGlzdDxXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVyPj4gbVJvdXRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8Um91dGVJbmZvPiBtUm91dGVzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTWFwPFBhaXI8U3RyaW5nLCBTdHJpbmc+LCBTdHJpbmc+IG1VbmlxdWVJZE1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8UHJvdmlkZXJJbmZvPiBtUHJvdmlkZXJzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQ+IG1SZW1vdGVDb250cm9sQ2xpZW50cyA9Ci0gICAgICAgICAgICAgICAgbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIGZpbmFsIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQuUGxheWJhY2tJbmZvIG1QbGF5YmFja0luZm8gPQotICAgICAgICAgICAgICAgIG5ldyBSZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0LlBsYXliYWNrSW5mbygpOwotICAgICAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyQ2FsbGJhY2sgbVByb3ZpZGVyQ2FsbGJhY2sgPSBuZXcgUHJvdmlkZXJDYWxsYmFjaygpOwotICAgICAgICBmaW5hbCBDYWxsYmFja0hhbmRsZXIgbUNhbGxiYWNrSGFuZGxlciA9IG5ldyBDYWxsYmFja0hhbmRsZXIoKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBEaXNwbGF5TWFuYWdlckNvbXBhdCBtRGlzcGxheU1hbmFnZXI7Ci0gICAgICAgIGZpbmFsIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlciBtU3lzdGVtUHJvdmlkZXI7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtTG93UmFtOwotCi0gICAgICAgIHByaXZhdGUgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcldhdGNoZXIgbVJlZ2lzdGVyZWRQcm92aWRlcldhdGNoZXI7Ci0gICAgICAgIHByaXZhdGUgUm91dGVJbmZvIG1EZWZhdWx0Um91dGU7Ci0gICAgICAgIHByaXZhdGUgUm91dGVJbmZvIG1CbHVldG9vdGhSb3V0ZTsKLSAgICAgICAgUm91dGVJbmZvIG1TZWxlY3RlZFJvdXRlOwotICAgICAgICBwcml2YXRlIFJvdXRlQ29udHJvbGxlciBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXI7Ci0gICAgICAgIC8vIEEgbWFwIGZyb20gcm91dGUgZGVzY3JpcHRvciBJRCB0byBSb3V0ZUNvbnRyb2xsZXIgZm9yIHRoZSBtZW1iZXIgcm91dGVzIGluIHRoZSBjdXJyZW50bHkKLSAgICAgICAgLy8gc2VsZWN0ZWQgcm91dGUgZ3JvdXAuCi0gICAgICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgUm91dGVDb250cm9sbGVyPiBtUm91dGVDb250cm9sbGVyTWFwID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBwcml2YXRlIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IG1EaXNjb3ZlcnlSZXF1ZXN0OwotICAgICAgICBwcml2YXRlIE1lZGlhU2Vzc2lvblJlY29yZCBtTWVkaWFTZXNzaW9uOwotICAgICAgICBNZWRpYVNlc3Npb25Db21wYXQgbVJjY01lZGlhU2Vzc2lvbjsKLSAgICAgICAgcHJpdmF0ZSBNZWRpYVNlc3Npb25Db21wYXQgbUNvbXBhdFNlc3Npb247Ci0gICAgICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uQ29tcGF0Lk9uQWN0aXZlQ2hhbmdlTGlzdGVuZXIgbVNlc3Npb25BY3RpdmVMaXN0ZW5lciA9Ci0gICAgICAgICAgICAgICAgbmV3IE1lZGlhU2Vzc2lvbkNvbXBhdC5PbkFjdGl2ZUNoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFjdGl2ZUNoYW5nZWQoKSB7Ci0gICAgICAgICAgICAgICAgaWYobVJjY01lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtUmNjTWVkaWFTZXNzaW9uLmlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlbW90ZUNvbnRyb2xDbGllbnQobVJjY01lZGlhU2Vzc2lvbi5nZXRSZW1vdGVDb250cm9sQ2xpZW50KCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUmVtb3RlQ29udHJvbENsaWVudChtUmNjTWVkaWFTZXNzaW9uLmdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgR2xvYmFsTWVkaWFSb3V0ZXIoQ29udGV4dCBhcHBsaWNhdGlvbkNvbnRleHQpIHsKLSAgICAgICAgICAgIG1BcHBsaWNhdGlvbkNvbnRleHQgPSBhcHBsaWNhdGlvbkNvbnRleHQ7Ci0gICAgICAgICAgICBtRGlzcGxheU1hbmFnZXIgPSBEaXNwbGF5TWFuYWdlckNvbXBhdC5nZXRJbnN0YW5jZShhcHBsaWNhdGlvbkNvbnRleHQpOwotICAgICAgICAgICAgbUxvd1JhbSA9IEFjdGl2aXR5TWFuYWdlckNvbXBhdC5pc0xvd1JhbURldmljZSgKLSAgICAgICAgICAgICAgICAgICAgKEFjdGl2aXR5TWFuYWdlcilhcHBsaWNhdGlvbkNvbnRleHQuZ2V0U3lzdGVtU2VydmljZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0LkFDVElWSVRZX1NFUlZJQ0UpKTsKLQotICAgICAgICAgICAgLy8gQWRkIHRoZSBzeXN0ZW0gbWVkaWEgcm91dGUgcHJvdmlkZXIgZm9yIGludGVyb3BlcmF0aW5nIHdpdGgKLSAgICAgICAgICAgIC8vIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyLiAgVGhpcyBvbmUgaXMgc3BlY2lhbCBhbmQgcmVjZWl2ZXMKLSAgICAgICAgICAgIC8vIHN5bmNocm9uaXphdGlvbiBtZXNzYWdlcyBmcm9tIHRoZSBtZWRpYSByb3V0ZXIuCi0gICAgICAgICAgICBtU3lzdGVtUHJvdmlkZXIgPSBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIub2J0YWluKGFwcGxpY2F0aW9uQ29udGV4dCwgdGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzdGFydCgpIHsKLSAgICAgICAgICAgIGFkZFByb3ZpZGVyKG1TeXN0ZW1Qcm92aWRlcik7Ci0KLSAgICAgICAgICAgIC8vIFN0YXJ0IHdhdGNoaW5nIGZvciByb3V0ZXMgcHVibGlzaGVkIGJ5IHJlZ2lzdGVyZWQgbWVkaWEgcm91dGUKLSAgICAgICAgICAgIC8vIHByb3ZpZGVyIHNlcnZpY2VzLgotICAgICAgICAgICAgbVJlZ2lzdGVyZWRQcm92aWRlcldhdGNoZXIgPSBuZXcgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcldhdGNoZXIoCi0gICAgICAgICAgICAgICAgICAgIG1BcHBsaWNhdGlvbkNvbnRleHQsIHRoaXMpOwotICAgICAgICAgICAgbVJlZ2lzdGVyZWRQcm92aWRlcldhdGNoZXIuc3RhcnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlciBnZXRSb3V0ZXIoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlciByb3V0ZXI7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVJvdXRlcnMuc2l6ZSgpOyAtLWkgPj0gMDsgKSB7Ci0gICAgICAgICAgICAgICAgcm91dGVyID0gbVJvdXRlcnMuZ2V0KGkpLmdldCgpOwotICAgICAgICAgICAgICAgIGlmIChyb3V0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtUm91dGVycy5yZW1vdmUoaSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyb3V0ZXIubUNvbnRleHQgPT0gY29udGV4dCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm91dGVyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJvdXRlciA9IG5ldyBNZWRpYVJvdXRlcihjb250ZXh0KTsKLSAgICAgICAgICAgIG1Sb3V0ZXJzLmFkZChuZXcgV2Vha1JlZmVyZW5jZTxNZWRpYVJvdXRlcj4ocm91dGVyKSk7Ci0gICAgICAgICAgICByZXR1cm4gcm91dGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbnRlbnRSZXNvbHZlciBnZXRDb250ZW50UmVzb2x2ZXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUFwcGxpY2F0aW9uQ29udGV4dC5nZXRDb250ZW50UmVzb2x2ZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDb250ZXh0IGdldFByb3ZpZGVyQ29udGV4dChTdHJpbmcgcGFja2FnZU5hbWUpIHsKLSAgICAgICAgICAgIGlmIChwYWNrYWdlTmFtZS5lcXVhbHMoU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyLlBBQ0tBR0VfTkFNRSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUFwcGxpY2F0aW9uQ29udGV4dDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1BcHBsaWNhdGlvbkNvbnRleHQuY3JlYXRlUGFja2FnZUNvbnRleHQoCi0gICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwgQ29udGV4dC5DT05URVhUX1JFU1RSSUNURUQpOwotICAgICAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRGlzcGxheSBnZXREaXNwbGF5KGludCBkaXNwbGF5SWQpIHsKLSAgICAgICAgICAgIHJldHVybiBtRGlzcGxheU1hbmFnZXIuZ2V0RGlzcGxheShkaXNwbGF5SWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2VuZENvbnRyb2xSZXF1ZXN0KFJvdXRlSW5mbyByb3V0ZSwKLSAgICAgICAgICAgICAgICBJbnRlbnQgaW50ZW50LCBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBpZiAocm91dGUgPT0gbVNlbGVjdGVkUm91dGUgJiYgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGVDb250cm9sbGVyLm9uQ29udHJvbFJlcXVlc3QoaW50ZW50LCBjYWxsYmFjaykpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2sub25FcnJvcihudWxsLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RTZXRWb2x1bWUoUm91dGVJbmZvIHJvdXRlLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICBpZiAocm91dGUgPT0gbVNlbGVjdGVkUm91dGUgJiYgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIub25TZXRWb2x1bWUodm9sdW1lKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1Sb3V0ZUNvbnRyb2xsZXJNYXAuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBtUm91dGVDb250cm9sbGVyTWFwLmdldChyb3V0ZS5tRGVzY3JpcHRvcklkKTsKLSAgICAgICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25TZXRWb2x1bWUodm9sdW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZXF1ZXN0VXBkYXRlVm9sdW1lKFJvdXRlSW5mbyByb3V0ZSwgaW50IGRlbHRhKSB7Ci0gICAgICAgICAgICBpZiAocm91dGUgPT0gbVNlbGVjdGVkUm91dGUgJiYgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIub25VcGRhdGVWb2x1bWUoZGVsdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFJvdXRlSW5mbyBnZXRSb3V0ZShTdHJpbmcgdW5pcXVlSWQpIHsKLSAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIGluZm8gOiBtUm91dGVzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluZm8ubVVuaXF1ZUlkLmVxdWFscyh1bmlxdWVJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZm87Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTGlzdDxSb3V0ZUluZm8+IGdldFJvdXRlcygpIHsKLSAgICAgICAgICAgIHJldHVybiBtUm91dGVzOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxQcm92aWRlckluZm8+IGdldFByb3ZpZGVycygpIHsKLSAgICAgICAgICAgIHJldHVybiBtUHJvdmlkZXJzOwotICAgICAgICB9Ci0KLSAgICAgICAgQE5vbk51bGwgUm91dGVJbmZvIGdldERlZmF1bHRSb3V0ZSgpIHsKLSAgICAgICAgICAgIGlmIChtRGVmYXVsdFJvdXRlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gb25jZSB0aGUgbWVkaWEgcm91dGVyIGhhcyBiZWVuIGZ1bGx5Ci0gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZWQgYnV0IGl0IGlzIGdvb2QgdG8gY2hlY2sgZm9yIHRoZSBlcnJvciBpbiBjYXNlIHRoZXJlCi0gICAgICAgICAgICAgICAgLy8gaXMgYSBidWcgaW4gcHJvdmlkZXIgaW5pdGlhbGl6YXRpb24uCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlcmUgaXMgbm8gZGVmYXVsdCByb3V0ZS4gICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIlRoZSBtZWRpYSByb3V0ZXIgaGFzIG5vdCB5ZXQgYmVlbiBmdWxseSBpbml0aWFsaXplZC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtRGVmYXVsdFJvdXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgUm91dGVJbmZvIGdldEJsdWV0b290aFJvdXRlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1CbHVldG9vdGhSb3V0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBOb25OdWxsIFJvdXRlSW5mbyBnZXRTZWxlY3RlZFJvdXRlKCkgewotICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gb25jZSB0aGUgbWVkaWEgcm91dGVyIGhhcyBiZWVuIGZ1bGx5Ci0gICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZWQgYnV0IGl0IGlzIGdvb2QgdG8gY2hlY2sgZm9yIHRoZSBlcnJvciBpbiBjYXNlIHRoZXJlCi0gICAgICAgICAgICAgICAgLy8gaXMgYSBidWcgaW4gcHJvdmlkZXIgaW5pdGlhbGl6YXRpb24uCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlcmUgaXMgbm8gY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlLiAgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiVGhlIG1lZGlhIHJvdXRlciBoYXMgbm90IHlldCBiZWVuIGZ1bGx5IGluaXRpYWxpemVkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1TZWxlY3RlZFJvdXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZWxlY3RSb3V0ZShATm9uTnVsbCBSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIHNlbGVjdFJvdXRlKHJvdXRlLCBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fUk9VVEVfQ0hBTkdFRCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNlbGVjdFJvdXRlKEBOb25OdWxsIFJvdXRlSW5mbyByb3V0ZSwgaW50IHVuc2VsZWN0UmVhc29uKSB7Ci0gICAgICAgICAgICBpZiAoIW1Sb3V0ZXMuY29udGFpbnMocm91dGUpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSWdub3JpbmcgYXR0ZW1wdCB0byBzZWxlY3QgcmVtb3ZlZCByb3V0ZTogIiArIHJvdXRlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIXJvdXRlLm1FbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSWdub3JpbmcgYXR0ZW1wdCB0byBzZWxlY3QgZGlzYWJsZWQgcm91dGU6ICIgKyByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0U2VsZWN0ZWRSb3V0ZUludGVybmFsKHJvdXRlLCB1bnNlbGVjdFJlYXNvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1JvdXRlQXZhaWxhYmxlKE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvciwgaW50IGZsYWdzKSB7Ci0gICAgICAgICAgICBpZiAoc2VsZWN0b3IuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBPbiBsb3ctUkFNIGRldmljZXMsIGRvIG5vdCByZWx5IG9uIGFjdHVhbCBkaXNjb3ZlcnkgcmVzdWx0cyB1bmxlc3MgYXNrZWQgdG8uCi0gICAgICAgICAgICBpZiAoKGZsYWdzICYgQVZBSUxBQklMSVRZX0ZMQUdfUkVRVUlSRV9NQVRDSCkgPT0gMCAmJiBtTG93UmFtKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgYW55IGV4aXN0aW5nIHJvdXRlcyBtYXRjaCB0aGUgc2VsZWN0b3IuCi0gICAgICAgICAgICBmaW5hbCBpbnQgcm91dGVDb3VudCA9IG1Sb3V0ZXMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3V0ZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBSb3V0ZUluZm8gcm91dGUgPSBtUm91dGVzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgQVZBSUxBQklMSVRZX0ZMQUdfSUdOT1JFX0RFRkFVTFRfUk9VVEUpICE9IDAKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHJvdXRlLmlzRGVmYXVsdE9yQmx1ZXRvb3RoKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChyb3V0ZS5tYXRjaGVzU2VsZWN0b3Ioc2VsZWN0b3IpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gSXQgZG9lc24ndCBsb29rIGxpa2Ugd2UgY2FuIGZpbmQgYSBtYXRjaGluZyByb3V0ZSByaWdodCBub3cuCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVEaXNjb3ZlcnlSZXF1ZXN0KCkgewotICAgICAgICAgICAgLy8gQ29tYmluZSBhbGwgb2YgdGhlIGNhbGxiYWNrIHNlbGVjdG9ycyBhbmQgYWN0aXZlIHNjYW4gZmxhZ3MuCi0gICAgICAgICAgICBib29sZWFuIGRpc2NvdmVyID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sZWFuIGFjdGl2ZVNjYW4gPSBmYWxzZTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUm91dGVycy5zaXplKCk7IC0taSA+PSAwOyApIHsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlciByb3V0ZXIgPSBtUm91dGVycy5nZXQoaSkuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJvdXRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJzLnJlbW92ZShpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSByb3V0ZXIubUNhbGxiYWNrUmVjb3Jkcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY291bnQ7IGorKykgewotICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2tSZWNvcmQgY2FsbGJhY2sgPSByb3V0ZXIubUNhbGxiYWNrUmVjb3Jkcy5nZXQoaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFkZFNlbGVjdG9yKGNhbGxiYWNrLm1TZWxlY3Rvcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGNhbGxiYWNrLm1GbGFncyAmIENBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTikgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVNjYW4gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdmVyID0gdHJ1ZTsgLy8gcGVyZm9ybSBhY3RpdmUgc2NhbiBpbXBsaWVzIHJlcXVlc3QgZGlzY292ZXJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGNhbGxiYWNrLm1GbGFncyAmIENBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlkpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1Mb3dSYW0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY292ZXIgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoY2FsbGJhY2subUZsYWdzICYgQ0FMTEJBQ0tfRkxBR19GT1JDRV9ESVNDT1ZFUlkpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3ZlciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IgPSBkaXNjb3ZlciA/IGJ1aWxkZXIuYnVpbGQoKSA6IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGRpc2NvdmVyeSByZXF1ZXN0LgotICAgICAgICAgICAgaWYgKG1EaXNjb3ZlcnlSZXF1ZXN0ICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgbURpc2NvdmVyeVJlcXVlc3QuZ2V0U2VsZWN0b3IoKS5lcXVhbHMoc2VsZWN0b3IpCi0gICAgICAgICAgICAgICAgICAgICYmIG1EaXNjb3ZlcnlSZXF1ZXN0LmlzQWN0aXZlU2NhbigpID09IGFjdGl2ZVNjYW4pIHsKLSAgICAgICAgICAgICAgICByZXR1cm47IC8vIG5vIGNoYW5nZQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHNlbGVjdG9yLmlzRW1wdHkoKSAmJiAhYWN0aXZlU2NhbikgewotICAgICAgICAgICAgICAgIC8vIERpc2NvdmVyeSBpcyBub3QgbmVlZGVkLgotICAgICAgICAgICAgICAgIGlmIChtRGlzY292ZXJ5UmVxdWVzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gbm8gY2hhbmdlCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1EaXNjb3ZlcnlSZXF1ZXN0ID0gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gRGlzY292ZXJ5IGlzIG5lZWRlZC4KLSAgICAgICAgICAgICAgICBtRGlzY292ZXJ5UmVxdWVzdCA9IG5ldyBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdChzZWxlY3RvciwgYWN0aXZlU2Nhbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJVcGRhdGVkIGRpc2NvdmVyeSByZXF1ZXN0OiAiICsgbURpc2NvdmVyeVJlcXVlc3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRpc2NvdmVyICYmICFhY3RpdmVTY2FuICYmIG1Mb3dSYW0pIHsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJGb3JjaW5nIHBhc3NpdmUgcm91dGUgZGlzY292ZXJ5IG9uIGEgbG93LVJBTSBkZXZpY2UsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgInN5c3RlbSBwZXJmb3JtYW5jZSBtYXkgYmUgYWZmZWN0ZWQuICBQbGVhc2UgY29uc2lkZXIgdXNpbmcgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWSBpbnN0ZWFkIG9mICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIkNBTExCQUNLX0ZMQUdfRk9SQ0VfRElTQ09WRVJZLiIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBOb3RpZnkgcHJvdmlkZXJzLgotICAgICAgICAgICAgZmluYWwgaW50IHByb3ZpZGVyQ291bnQgPSBtUHJvdmlkZXJzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdmlkZXJDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbVByb3ZpZGVycy5nZXQoaSkubVByb3ZpZGVySW5zdGFuY2Uuc2V0RGlzY292ZXJ5UmVxdWVzdChtRGlzY292ZXJ5UmVxdWVzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgYWRkUHJvdmlkZXIoTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVySW5zdGFuY2UpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRQcm92aWRlckluZm8ocHJvdmlkZXJJbnN0YW5jZSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gMS4gQWRkIHRoZSBwcm92aWRlciB0byB0aGUgbGlzdC4KLSAgICAgICAgICAgICAgICBQcm92aWRlckluZm8gcHJvdmlkZXIgPSBuZXcgUHJvdmlkZXJJbmZvKHByb3ZpZGVySW5zdGFuY2UpOwotICAgICAgICAgICAgICAgIG1Qcm92aWRlcnMuYWRkKHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUHJvdmlkZXIgYWRkZWQ6ICIgKyBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1BST1ZJREVSX0FEREVELCBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgLy8gMi4gQ3JlYXRlIHRoZSBwcm92aWRlcidzIGNvbnRlbnRzLgotICAgICAgICAgICAgICAgIHVwZGF0ZVByb3ZpZGVyQ29udGVudHMocHJvdmlkZXIsIHByb3ZpZGVySW5zdGFuY2UuZ2V0RGVzY3JpcHRvcigpKTsKLSAgICAgICAgICAgICAgICAvLyAzLiBSZWdpc3RlciB0aGUgcHJvdmlkZXIgY2FsbGJhY2suCi0gICAgICAgICAgICAgICAgcHJvdmlkZXJJbnN0YW5jZS5zZXRDYWxsYmFjayhtUHJvdmlkZXJDYWxsYmFjayk7Ci0gICAgICAgICAgICAgICAgLy8gNC4gU2V0IHRoZSBkaXNjb3ZlcnkgcmVxdWVzdC4KLSAgICAgICAgICAgICAgICBwcm92aWRlckluc3RhbmNlLnNldERpc2NvdmVyeVJlcXVlc3QobURpc2NvdmVyeVJlcXVlc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3ZpZGVyKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlckluc3RhbmNlKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kUHJvdmlkZXJJbmZvKHByb3ZpZGVySW5zdGFuY2UpOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAvLyAxLiBVbnJlZ2lzdGVyIHRoZSBwcm92aWRlciBjYWxsYmFjay4KLSAgICAgICAgICAgICAgICBwcm92aWRlckluc3RhbmNlLnNldENhbGxiYWNrKG51bGwpOwotICAgICAgICAgICAgICAgIC8vIDIuIENsZWFyIHRoZSBkaXNjb3ZlcnkgcmVxdWVzdC4KLSAgICAgICAgICAgICAgICBwcm92aWRlckluc3RhbmNlLnNldERpc2NvdmVyeVJlcXVlc3QobnVsbCk7Ci0gICAgICAgICAgICAgICAgLy8gMy4gRGVsZXRlIHRoZSBwcm92aWRlcidzIGNvbnRlbnRzLgotICAgICAgICAgICAgICAgIFByb3ZpZGVySW5mbyBwcm92aWRlciA9IG1Qcm92aWRlcnMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICB1cGRhdGVQcm92aWRlckNvbnRlbnRzKHByb3ZpZGVyLCBudWxsKTsKLSAgICAgICAgICAgICAgICAvLyA0LiBSZW1vdmUgdGhlIHByb3ZpZGVyIGZyb20gdGhlIGxpc3QuCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlByb3ZpZGVyIHJlbW92ZWQ6ICIgKyBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1BST1ZJREVSX1JFTU9WRUQsIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICBtUHJvdmlkZXJzLnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHVwZGF0ZVByb3ZpZGVyRGVzY3JpcHRvcihNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRQcm92aWRlckluZm8ocHJvdmlkZXJJbnN0YW5jZSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcHJvdmlkZXIncyBjb250ZW50cy4KLSAgICAgICAgICAgICAgICBQcm92aWRlckluZm8gcHJvdmlkZXIgPSBtUHJvdmlkZXJzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUHJvdmlkZXJDb250ZW50cyhwcm92aWRlciwgZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBmaW5kUHJvdmlkZXJJbmZvKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlckluc3RhbmNlKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtUHJvdmlkZXJzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtUHJvdmlkZXJzLmdldChpKS5tUHJvdmlkZXJJbnN0YW5jZSA9PSBwcm92aWRlckluc3RhbmNlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQcm92aWRlckNvbnRlbnRzKFByb3ZpZGVySW5mbyBwcm92aWRlciwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIHByb3ZpZGVyRGVzY3JpcHRvcikgewotICAgICAgICAgICAgaWYgKHByb3ZpZGVyLnVwZGF0ZURlc2NyaXB0b3IocHJvdmlkZXJEZXNjcmlwdG9yKSkgewotICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBhbGwgZXhpc3Rpbmcgcm91dGVzIGFuZCByZW9yZGVyIHRoZW0gdG8gbWF0Y2gKLSAgICAgICAgICAgICAgICAvLyB0aGUgb3JkZXIgb2YgdGhlaXIgZGVzY3JpcHRvcnMuCi0gICAgICAgICAgICAgICAgaW50IHRhcmdldEluZGV4ID0gMDsKLSAgICAgICAgICAgICAgICBib29sZWFuIHNlbGVjdGVkUm91dGVEZXNjcmlwdG9yQ2hhbmdlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIGlmIChwcm92aWRlckRlc2NyaXB0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXJEZXNjcmlwdG9yLmlzVmFsaWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gcm91dGVEZXNjcmlwdG9ycyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyRGVzY3JpcHRvci5nZXRSb3V0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCByb3V0ZUNvdW50ID0gcm91dGVEZXNjcmlwdG9ycy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGluZyByb3V0ZSBncm91cCdzIGNvbnRlbnRzIHJlcXVpcmVzIGFsbCBtZW1iZXIgcm91dGVzJyBpbmZvcm1hdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgZ3JvdXBzIHRvIHRoZSBsaXN0cyBhbmQgdXBkYXRlIHRoZW0gbGF0ZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFBhaXI8Um91dGVJbmZvLCBNZWRpYVJvdXRlRGVzY3JpcHRvcj4+IGFkZGVkR3JvdXBzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMaXN0PFBhaXI8Um91dGVJbmZvLCBNZWRpYVJvdXRlRGVzY3JpcHRvcj4+IHVwZGF0ZWRHcm91cHMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcm91dGVDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGVEZXNjcmlwdG9yID0gcm91dGVEZXNjcmlwdG9ycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIGlkID0gcm91dGVEZXNjcmlwdG9yLmdldElkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHNvdXJjZUluZGV4ID0gcHJvdmlkZXIuZmluZFJvdXRlQnlEZXNjcmlwdG9ySWQoaWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMS4gQWRkIHRoZSByb3V0ZSB0byB0aGUgbGlzdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHVuaXF1ZUlkID0gYXNzaWduUm91dGVVbmlxdWVJZChwcm92aWRlciwgaWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGlzR3JvdXAgPSByb3V0ZURlc2NyaXB0b3IuZ2V0R3JvdXBNZW1iZXJJZHMoKSAhPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZUluZm8gcm91dGUgPSBpc0dyb3VwID8gbmV3IFJvdXRlR3JvdXAocHJvdmlkZXIsIGlkLCB1bmlxdWVJZCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSb3V0ZUluZm8ocHJvdmlkZXIsIGlkLCB1bmlxdWVJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLm1Sb3V0ZXMuYWRkKHRhcmdldEluZGV4KyssIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlcy5hZGQocm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyLiBDcmVhdGUgdGhlIHJvdXRlJ3MgY29udGVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc0dyb3VwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZEdyb3Vwcy5hZGQobmV3IFBhaXI8Pihyb3V0ZSwgcm91dGVEZXNjcmlwdG9yKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5tYXliZVVwZGF0ZURlc2NyaXB0b3Iocm91dGVEZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMuIE5vdGlmeSBjbGllbnRzIGFib3V0IGFkZGl0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgYWRkZWQ6ICIgKyByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoQ2FsbGJhY2tIYW5kbGVyLk1TR19ST1VURV9BRERFRCwgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZUluZGV4IDwgdGFyZ2V0SW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSWdub3Jpbmcgcm91dGUgZGVzY3JpcHRvciB3aXRoIGR1cGxpY2F0ZSBpZDogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcm91dGVEZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxLiBSZW9yZGVyIHRoZSByb3V0ZSB3aXRoaW4gdGhlIGxpc3QuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IHByb3ZpZGVyLm1Sb3V0ZXMuZ2V0KHNvdXJjZUluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc3dhcChwcm92aWRlci5tUm91dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUluZGV4LCB0YXJnZXRJbmRleCsrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi4gVXBkYXRlIHRoZSByb3V0ZSdzIGNvbnRlbnRzLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGUgaW5zdGFuY2VvZiBSb3V0ZUdyb3VwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVkR3JvdXBzLmFkZChuZXcgUGFpcjw+KHJvdXRlLCByb3V0ZURlc2NyaXB0b3IpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMuIE5vdGlmeSBjbGllbnRzIGFib3V0IGNoYW5nZXMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXBkYXRlUm91dGVEZXNjcmlwdG9yQW5kTm90aWZ5KHJvdXRlLCByb3V0ZURlc2NyaXB0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGUgPT0gbVNlbGVjdGVkUm91dGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRSb3V0ZURlc2NyaXB0b3JDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIG5ldyBhbmQvb3IgZXhpc3RpbmcgZ3JvdXBzLgotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChQYWlyPFJvdXRlSW5mbywgTWVkaWFSb3V0ZURlc2NyaXB0b3I+IHBhaXIgOiBhZGRlZEdyb3VwcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IHBhaXIuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGUubWF5YmVVcGRhdGVEZXNjcmlwdG9yKHBhaXIuc2Vjb25kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgYWRkZWQ6ICIgKyByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX0FEREVELCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFBhaXI8Um91dGVJbmZvLCBNZWRpYVJvdXRlRGVzY3JpcHRvcj4gcGFpciA6IHVwZGF0ZWRHcm91cHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZUluZm8gcm91dGUgPSBwYWlyLmZpcnN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVSb3V0ZURlc2NyaXB0b3JBbmROb3RpZnkocm91dGUsIHBhaXIuc2Vjb25kKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBtU2VsZWN0ZWRSb3V0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRSb3V0ZURlc2NyaXB0b3JDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIklnbm9yaW5nIGludmFsaWQgcHJvdmlkZXIgZGVzY3JpcHRvcjogIiArIHByb3ZpZGVyRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBEaXNwb3NlIGFsbCByZW1haW5pbmcgcm91dGVzIHRoYXQgZG8gbm90IGhhdmUgbWF0Y2hpbmcgZGVzY3JpcHRvcnMuCi0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHByb3ZpZGVyLm1Sb3V0ZXMuc2l6ZSgpIC0gMTsgaSA+PSB0YXJnZXRJbmRleDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIDEuIERlbGV0ZSB0aGUgcm91dGUncyBjb250ZW50cy4KLSAgICAgICAgICAgICAgICAgICAgUm91dGVJbmZvIHJvdXRlID0gcHJvdmlkZXIubVJvdXRlcy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIHJvdXRlLm1heWJlVXBkYXRlRGVzY3JpcHRvcihudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gMi4gUmVtb3ZlIHRoZSByb3V0ZSBmcm9tIHRoZSBsaXN0LgotICAgICAgICAgICAgICAgICAgICBtUm91dGVzLnJlbW92ZShyb3V0ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBzZWxlY3RlZCByb3V0ZSBpZiBuZWVkZWQuCi0gICAgICAgICAgICAgICAgdXBkYXRlU2VsZWN0ZWRSb3V0ZUlmTmVlZGVkKHNlbGVjdGVkUm91dGVEZXNjcmlwdG9yQ2hhbmdlZCk7Ci0KLSAgICAgICAgICAgICAgICAvLyBOb3cgbm90aWZ5IGNsaWVudHMgYWJvdXQgcm91dGVzIHRoYXQgd2VyZSByZW1vdmVkLgotICAgICAgICAgICAgICAgIC8vIFdlIGRvIHRoaXMgYWZ0ZXIgdXBkYXRpbmcgdGhlIHNlbGVjdGVkIHJvdXRlIHRvIGVuc3VyZQotICAgICAgICAgICAgICAgIC8vIHRoYXQgdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIgb2JzZXJ2ZXMgdGhlIG5ldyByb3V0ZQotICAgICAgICAgICAgICAgIC8vIHNlbGVjdGlvbiBiZWZvcmUgdGhlIHJlbW92YWwgc2luY2UgcmVtb3ZpbmcgdGhlIGN1cnJlbnRseQotICAgICAgICAgICAgICAgIC8vIHNlbGVjdGVkIHJvdXRlIG1heSBoYXZlIHNpZGUtZWZmZWN0cy4KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gcHJvdmlkZXIubVJvdXRlcy5zaXplKCkgLSAxOyBpID49IHRhcmdldEluZGV4OyBpLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgUm91dGVJbmZvIHJvdXRlID0gcHJvdmlkZXIubVJvdXRlcy5yZW1vdmUoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgcmVtb3ZlZDogIiArIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoQ2FsbGJhY2tIYW5kbGVyLk1TR19ST1VURV9SRU1PVkVELCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gTm90aWZ5IHByb3ZpZGVyIGNoYW5nZWQuCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlByb3ZpZGVyIGNoYW5nZWQ6ICIgKyBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1BST1ZJREVSX0NIQU5HRUQsIHByb3ZpZGVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IHVwZGF0ZVJvdXRlRGVzY3JpcHRvckFuZE5vdGlmeShSb3V0ZUluZm8gcm91dGUsCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGVEZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBpbnQgY2hhbmdlcyA9IHJvdXRlLm1heWJlVXBkYXRlRGVzY3JpcHRvcihyb3V0ZURlc2NyaXB0b3IpOwotICAgICAgICAgICAgaWYgKGNoYW5nZXMgIT0gMCkgewotICAgICAgICAgICAgICAgIGlmICgoY2hhbmdlcyAmIFJvdXRlSW5mby5DSEFOR0VfR0VORVJBTCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdXRlIGNoYW5nZWQ6ICIgKyByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfQ0hBTkdFRCwgcm91dGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKGNoYW5nZXMgJiBSb3V0ZUluZm8uQ0hBTkdFX1ZPTFVNRSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdXRlIHZvbHVtZSBjaGFuZ2VkOiAiICsgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX1ZPTFVNRV9DSEFOR0VELCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgoY2hhbmdlcyAmIFJvdXRlSW5mby5DSEFOR0VfUFJFU0VOVEFUSU9OX0RJU1BMQVkpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3V0ZSBwcmVzZW50YXRpb24gZGlzcGxheSBjaGFuZ2VkOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTVNHX1JPVVRFX1BSRVNFTlRBVElPTl9ESVNQTEFZX0NIQU5HRUQsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY2hhbmdlczsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGFzc2lnblJvdXRlVW5pcXVlSWQoUHJvdmlkZXJJbmZvIHByb3ZpZGVyLCBTdHJpbmcgcm91dGVEZXNjcmlwdG9ySWQpIHsKLSAgICAgICAgICAgIC8vIEFsdGhvdWdoIHJvdXRlIGRlc2NyaXB0b3IgaWRzIGFyZSB1bmlxdWUgd2l0aGluIGEgcHJvdmlkZXIsIGl0J3MKLSAgICAgICAgICAgIC8vIHBvc3NpYmxlIGZvciB0aGVyZSB0byBiZSB0d28gcHJvdmlkZXJzIHdpdGggdGhlIHNhbWUgcGFja2FnZSBuYW1lLgotICAgICAgICAgICAgLy8gVGhlcmVmb3JlIHdlIG11c3QgZGVkdXBlIHRoZSBjb21wb3NpdGUgaWQuCi0gICAgICAgICAgICBTdHJpbmcgY29tcG9uZW50TmFtZSA9IHByb3ZpZGVyLmdldENvbXBvbmVudE5hbWUoKS5mbGF0dGVuVG9TaG9ydFN0cmluZygpOwotICAgICAgICAgICAgU3RyaW5nIHVuaXF1ZUlkID0gY29tcG9uZW50TmFtZSArICI6IiArIHJvdXRlRGVzY3JpcHRvcklkOwotICAgICAgICAgICAgaWYgKGZpbmRSb3V0ZUJ5VW5pcXVlSWQodW5pcXVlSWQpIDwgMCkgewotICAgICAgICAgICAgICAgIG1VbmlxdWVJZE1hcC5wdXQobmV3IFBhaXI8Pihjb21wb25lbnROYW1lLCByb3V0ZURlc2NyaXB0b3JJZCksIHVuaXF1ZUlkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdW5pcXVlSWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJFaXRoZXIgIiArIHJvdXRlRGVzY3JpcHRvcklkICsgIiBpc24ndCB1bmlxdWUgaW4gIiArIGNvbXBvbmVudE5hbWUKLSAgICAgICAgICAgICAgICAgICAgKyAiIG9yIHdlJ3JlIHRyeWluZyB0byBhc3NpZ24gYSB1bmlxdWUgSUQgZm9yIGFuIGFscmVhZHkgYWRkZWQgcm91dGUiKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAyOyA7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBuZXdVbmlxdWVJZCA9IFN0cmluZy5mb3JtYXQoTG9jYWxlLlVTLCAiJXNfJWQiLCB1bmlxdWVJZCwgaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbmRSb3V0ZUJ5VW5pcXVlSWQobmV3VW5pcXVlSWQpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBtVW5pcXVlSWRNYXAucHV0KG5ldyBQYWlyPD4oY29tcG9uZW50TmFtZSwgcm91dGVEZXNjcmlwdG9ySWQpLCBuZXdVbmlxdWVJZCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdVbmlxdWVJZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBmaW5kUm91dGVCeVVuaXF1ZUlkKFN0cmluZyB1bmlxdWVJZCkgewotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVJvdXRlcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobVJvdXRlcy5nZXQoaSkubVVuaXF1ZUlkLmVxdWFscyh1bmlxdWVJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0VW5pcXVlSWQoUHJvdmlkZXJJbmZvIHByb3ZpZGVyLCBTdHJpbmcgcm91dGVEZXNjcmlwdG9ySWQpIHsKLSAgICAgICAgICAgIFN0cmluZyBjb21wb25lbnROYW1lID0gcHJvdmlkZXIuZ2V0Q29tcG9uZW50TmFtZSgpLmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCk7Ci0gICAgICAgICAgICByZXR1cm4gbVVuaXF1ZUlkTWFwLmdldChuZXcgUGFpcjw+KGNvbXBvbmVudE5hbWUsIHJvdXRlRGVzY3JpcHRvcklkKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgdXBkYXRlU2VsZWN0ZWRSb3V0ZUlmTmVlZGVkKGJvb2xlYW4gc2VsZWN0ZWRSb3V0ZURlc2NyaXB0b3JDaGFuZ2VkKSB7Ci0gICAgICAgICAgICAvLyBVcGRhdGUgZGVmYXVsdCByb3V0ZS4KLSAgICAgICAgICAgIGlmIChtRGVmYXVsdFJvdXRlICE9IG51bGwgJiYgIW1EZWZhdWx0Um91dGUuaXNTZWxlY3RhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDbGVhcmluZyB0aGUgZGVmYXVsdCByb3V0ZSBiZWNhdXNlIGl0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImlzIG5vIGxvbmdlciBzZWxlY3RhYmxlOiAiICsgbURlZmF1bHRSb3V0ZSk7Ci0gICAgICAgICAgICAgICAgbURlZmF1bHRSb3V0ZSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobURlZmF1bHRSb3V0ZSA9PSBudWxsICYmICFtUm91dGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIHJvdXRlIDogbVJvdXRlcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTeXN0ZW1EZWZhdWx0Um91dGUocm91dGUpICYmIHJvdXRlLmlzU2VsZWN0YWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRGVmYXVsdFJvdXRlID0gcm91dGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJGb3VuZCBkZWZhdWx0IHJvdXRlOiAiICsgbURlZmF1bHRSb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVXBkYXRlIGJsdWV0b290aCByb3V0ZS4KLSAgICAgICAgICAgIGlmIChtQmx1ZXRvb3RoUm91dGUgIT0gbnVsbCAmJiAhbUJsdWV0b290aFJvdXRlLmlzU2VsZWN0YWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiQ2xlYXJpbmcgdGhlIGJsdWV0b290aCByb3V0ZSBiZWNhdXNlIGl0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImlzIG5vIGxvbmdlciBzZWxlY3RhYmxlOiAiICsgbUJsdWV0b290aFJvdXRlKTsKLSAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoUm91dGUgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhSb3V0ZSA9PSBudWxsICYmICFtUm91dGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIHJvdXRlIDogbVJvdXRlcykgewotICAgICAgICAgICAgICAgICAgICBpZiAoaXNTeXN0ZW1MaXZlQXVkaW9Pbmx5Um91dGUocm91dGUpICYmIHJvdXRlLmlzU2VsZWN0YWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQmx1ZXRvb3RoUm91dGUgPSByb3V0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkZvdW5kIGJsdWV0b290aCByb3V0ZTogIiArIG1CbHVldG9vdGhSb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gVXBkYXRlIHNlbGVjdGVkIHJvdXRlLgotICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlID09IG51bGwgfHwgIW1TZWxlY3RlZFJvdXRlLmlzU2VsZWN0YWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiVW5zZWxlY3RpbmcgdGhlIGN1cnJlbnQgcm91dGUgYmVjYXVzZSBpdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJpcyBubyBsb25nZXIgc2VsZWN0YWJsZTogIiArIG1TZWxlY3RlZFJvdXRlKTsKLSAgICAgICAgICAgICAgICBzZXRTZWxlY3RlZFJvdXRlSW50ZXJuYWwoY2hvb3NlRmFsbGJhY2tSb3V0ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1VOS05PV04pOwotICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3RlZFJvdXRlRGVzY3JpcHRvckNoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIHRoZSBzZWxlY3RlZCByb3V0ZSBpcyBhIHJvdXRlIGdyb3VwLCBzZWxlY3QvdW5zZWxlY3Qgcm91dGUgY29udHJvbGxlcnMKLSAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIGFkZGVkL3JlbW92ZWQgcm91dGUgbWVtYmVycy4KLSAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgaW5zdGFuY2VvZiBSb3V0ZUdyb3VwKSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8Um91dGVJbmZvPiByb3V0ZXMgPSAoKFJvdXRlR3JvdXApIG1TZWxlY3RlZFJvdXRlKS5nZXRSb3V0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gQnVpbGQgYSBzZXQgb2YgZGVzY3JpcHRvciBJRHMgZm9yIHRoZSBuZXcgcm91dGUgZ3JvdXAuCi0gICAgICAgICAgICAgICAgICAgIFNldDxTdHJpbmc+IGlkU2V0ID0gbmV3IEhhc2hTZXQ8PigpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKFJvdXRlSW5mbyByb3V0ZSA6IHJvdXRlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWRTZXQuYWRkKHJvdXRlLm1EZXNjcmlwdG9ySWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIFVuc2VsZWN0IHJvdXRlIGNvbnRyb2xsZXJzIGZvciB0aGUgcmVtb3ZlZCByb3V0ZXMuCi0gICAgICAgICAgICAgICAgICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxTdHJpbmcsIFJvdXRlQ29udHJvbGxlcj4+IGl0ZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZUNvbnRyb2xsZXJNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1hcC5FbnRyeTxTdHJpbmcsIFJvdXRlQ29udHJvbGxlcj4gZW50cnkgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaWRTZXQuY29udGFpbnMoZW50cnkuZ2V0S2V5KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25VbnNlbGVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlci5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBTZWxlY3Qgcm91dGUgY29udHJvbGxlcnMgZm9yIHRoZSBhZGRlZCByb3V0ZXMuCi0gICAgICAgICAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIHJvdXRlIDogcm91dGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1Sb3V0ZUNvbnRyb2xsZXJNYXAuY29udGFpbnNLZXkocm91dGUubURlc2NyaXB0b3JJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9IHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9uQ3JlYXRlUm91dGVDb250cm9sbGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5tRGVzY3JpcHRvcklkLCBtU2VsZWN0ZWRSb3V0ZS5tRGVzY3JpcHRvcklkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uU2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlQ29udHJvbGxlck1hcC5wdXQocm91dGUubURlc2NyaXB0b3JJZCwgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBwbGF5YmFjayBpbmZvIGJlY2F1c2UgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHJvdXRlIGhhdmUgY2hhbmdlZC4KLSAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja0luZm9Gcm9tU2VsZWN0ZWRSb3V0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgUm91dGVJbmZvIGNob29zZUZhbGxiYWNrUm91dGUoKSB7Ci0gICAgICAgICAgICAvLyBXaGVuIHRoZSBjdXJyZW50IHJvdXRlIGlzIHJlbW92ZWQgb3Igbm8gbG9uZ2VyIHNlbGVjdGFibGUsCi0gICAgICAgICAgICAvLyB3ZSB3YW50IHRvIHJldmVydCB0byBhIGxpdmUgYXVkaW8gcm91dGUgaWYgdGhlcmUgaXMKLSAgICAgICAgICAgIC8vIG9uZSAodXN1YWxseSBCbHVldG9vdGggQTJEUCkuICBGYWlsaW5nIHRoYXQsIHVzZQotICAgICAgICAgICAgLy8gdGhlIGRlZmF1bHQgcm91dGUuCi0gICAgICAgICAgICBmb3IgKFJvdXRlSW5mbyByb3V0ZSA6IG1Sb3V0ZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAocm91dGUgIT0gbURlZmF1bHRSb3V0ZQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgaXNTeXN0ZW1MaXZlQXVkaW9Pbmx5Um91dGUocm91dGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiByb3V0ZS5pc1NlbGVjdGFibGUoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcm91dGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1EZWZhdWx0Um91dGU7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNTeXN0ZW1MaXZlQXVkaW9Pbmx5Um91dGUoUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICByZXR1cm4gcm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpID09IG1TeXN0ZW1Qcm92aWRlcgotICAgICAgICAgICAgICAgICAgICAmJiByb3V0ZS5zdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTykKLSAgICAgICAgICAgICAgICAgICAgJiYgIXJvdXRlLnN1cHBvcnRzQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1N5c3RlbURlZmF1bHRSb3V0ZShSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIHJldHVybiByb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkgPT0gbVN5c3RlbVByb3ZpZGVyCi0gICAgICAgICAgICAgICAgICAgICYmIHJvdXRlLm1EZXNjcmlwdG9ySWQuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlci5ERUZBVUxUX1JPVVRFX0lEKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRTZWxlY3RlZFJvdXRlSW50ZXJuYWwoQE5vbk51bGwgUm91dGVJbmZvIHJvdXRlLCBpbnQgdW5zZWxlY3RSZWFzb24pIHsKLSAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGUgZm9sbG93aW5nIGxvZ2dpbmcgd2hlbiBubyBsb25nZXIgbmVlZGVkLgotICAgICAgICAgICAgaWYgKHNHbG9iYWwgPT0gbnVsbCB8fCAobUJsdWV0b290aFJvdXRlICE9IG51bGwgJiYgcm91dGUuaXNEZWZhdWx0KCkpKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgU3RhY2tUcmFjZUVsZW1lbnRbXSBjYWxsU3RhY2sgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpLmdldFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAvLyBjYWxsU3RhY2tbM10gaXMgdGhlIGNhbGxlciBvZiB0aGlzIG1ldGhvZC4KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMzsgaSA8IGNhbGxTdGFjay5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBTdGFja1RyYWNlRWxlbWVudCBjYWxsZXIgPSBjYWxsU3RhY2tbaV07Ci0gICAgICAgICAgICAgICAgICAgIHNiLmFwcGVuZChjYWxsZXIuZ2V0Q2xhc3NOYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiLiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChjYWxsZXIuZ2V0TWV0aG9kTmFtZSgpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIjoiKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoY2FsbGVyLmdldExpbmVOdW1iZXIoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIgICIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc0dsb2JhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNldFNlbGVjdGVkUm91dGVJbnRlcm5hbCBpcyBjYWxsZWQgd2hpbGUgc0dsb2JhbCBpcyBudWxsOiBwa2dOYW1lPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIG1BcHBsaWNhdGlvbkNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSArICIsIGNhbGxlcnM9IiArIHNiLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkRlZmF1bHQgcm91dGUgaXMgc2VsZWN0ZWQgd2hpbGUgYSBCVCByb3V0ZSBpcyBhdmFpbGFibGU6IHBrZ05hbWU9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUFwcGxpY2F0aW9uQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpICsgIiwgY2FsbGVycz0iICsgc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgIT0gcm91dGUpIHsKLSAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdXRlIHVuc2VsZWN0ZWQ6ICIgKyBtU2VsZWN0ZWRSb3V0ZSArICIgcmVhc29uOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgdW5zZWxlY3RSZWFzb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX1VOU0VMRUNURUQsIG1TZWxlY3RlZFJvdXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2VsZWN0UmVhc29uKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIub25VbnNlbGVjdCh1bnNlbGVjdFJlYXNvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbVJvdXRlQ29udHJvbGxlck1hcC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgOiBtUm91dGVDb250cm9sbGVyTWFwLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblVuc2VsZWN0KHVuc2VsZWN0UmVhc29uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlQ29udHJvbGxlck1hcC5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGUgPSByb3V0ZTsKLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgPSByb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5tRGVzY3JpcHRvcklkKTsKLSAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGVDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGVDb250cm9sbGVyLm9uU2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3V0ZSBzZWxlY3RlZDogIiArIG1TZWxlY3RlZFJvdXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfU0VMRUNURUQsIG1TZWxlY3RlZFJvdXRlKTsKLQotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSBpbnN0YW5jZW9mIFJvdXRlR3JvdXApIHsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxSb3V0ZUluZm8+IHJvdXRlcyA9ICgoUm91dGVHcm91cCkgbVNlbGVjdGVkUm91dGUpLmdldFJvdXRlcygpOwotICAgICAgICAgICAgICAgICAgICBtUm91dGVDb250cm9sbGVyTWFwLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIHIgOiByb3V0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5nZXRQcm92aWRlckluc3RhbmNlKCkub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgci5tRGVzY3JpcHRvcklkLCBtU2VsZWN0ZWRSb3V0ZS5tRGVzY3JpcHRvcklkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25TZWxlY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZUNvbnRyb2xsZXJNYXAucHV0KHIubURlc2NyaXB0b3JJZCwgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja0luZm9Gcm9tU2VsZWN0ZWRSb3V0ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3lzdGVtUm91dGVTZWxlY3RlZEJ5RGVzY3JpcHRvcklkKFN0cmluZyBpZCkgewotICAgICAgICAgICAgLy8gU3lzdGVtIHJvdXRlIGlzIHNlbGVjdGVkLCBkbyBub3Qgc3luYyB0aGUgcm91dGUgd2Ugc2VsZWN0ZWQgYmVmb3JlLgotICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5yZW1vdmVNZXNzYWdlcyhDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX1NFTEVDVEVEKTsKLSAgICAgICAgICAgIGludCBwcm92aWRlckluZGV4ID0gZmluZFByb3ZpZGVySW5mbyhtU3lzdGVtUHJvdmlkZXIpOwotICAgICAgICAgICAgaWYgKHByb3ZpZGVySW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIFByb3ZpZGVySW5mbyBwcm92aWRlciA9IG1Qcm92aWRlcnMuZ2V0KHByb3ZpZGVySW5kZXgpOwotICAgICAgICAgICAgICAgIGludCByb3V0ZUluZGV4ID0gcHJvdmlkZXIuZmluZFJvdXRlQnlEZXNjcmlwdG9ySWQoaWQpOwotICAgICAgICAgICAgICAgIGlmIChyb3V0ZUluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIubVJvdXRlcy5nZXQocm91dGVJbmRleCkuc2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkUmVtb3RlQ29udHJvbENsaWVudChPYmplY3QgcmNjKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kUmVtb3RlQ29udHJvbENsaWVudFJlY29yZChyY2MpOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQgcmVjb3JkID0gbmV3IFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQocmNjKTsKLSAgICAgICAgICAgICAgICBtUmVtb3RlQ29udHJvbENsaWVudHMuYWRkKHJlY29yZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVSZW1vdGVDb250cm9sQ2xpZW50KE9iamVjdCByY2MpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkKHJjYyk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQgcmVjb3JkID0gbVJlbW90ZUNvbnRyb2xDbGllbnRzLnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICAgICAgcmVjb3JkLmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhU2Vzc2lvbihPYmplY3Qgc2Vzc2lvbikgewotICAgICAgICAgICAgc2V0TWVkaWFTZXNzaW9uUmVjb3JkKHNlc3Npb24gIT0gbnVsbCA/IG5ldyBNZWRpYVNlc3Npb25SZWNvcmQoc2Vzc2lvbikgOiBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhU2Vzc2lvbkNvbXBhdChmaW5hbCBNZWRpYVNlc3Npb25Db21wYXQgc2Vzc2lvbikgewotICAgICAgICAgICAgbUNvbXBhdFNlc3Npb24gPSBzZXNzaW9uOwotICAgICAgICAgICAgaWYgKGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IDIxKSB7Ci0gICAgICAgICAgICAgICAgc2V0TWVkaWFTZXNzaW9uUmVjb3JkKHNlc3Npb24gIT0gbnVsbCA/IG5ldyBNZWRpYVNlc3Npb25SZWNvcmQoc2Vzc2lvbikgOiBudWxsKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMTQpIHsKLSAgICAgICAgICAgICAgICBpZiAobVJjY01lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlbW92ZVJlbW90ZUNvbnRyb2xDbGllbnQobVJjY01lZGlhU2Vzc2lvbi5nZXRSZW1vdGVDb250cm9sQ2xpZW50KCkpOwotICAgICAgICAgICAgICAgICAgICBtUmNjTWVkaWFTZXNzaW9uLnJlbW92ZU9uQWN0aXZlQ2hhbmdlTGlzdGVuZXIobVNlc3Npb25BY3RpdmVMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1SY2NNZWRpYVNlc3Npb24gPSBzZXNzaW9uOwotICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5hZGRPbkFjdGl2ZUNoYW5nZUxpc3RlbmVyKG1TZXNzaW9uQWN0aXZlTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbi5pc0FjdGl2ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRSZW1vdGVDb250cm9sQ2xpZW50KHNlc3Npb24uZ2V0UmVtb3RlQ29udHJvbENsaWVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBzZXRNZWRpYVNlc3Npb25SZWNvcmQoTWVkaWFTZXNzaW9uUmVjb3JkIG1lZGlhU2Vzc2lvblJlY29yZCkgewotICAgICAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uY2xlYXJWb2x1bWVIYW5kbGluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbiA9IG1lZGlhU2Vzc2lvblJlY29yZDsKLSAgICAgICAgICAgIGlmIChtZWRpYVNlc3Npb25SZWNvcmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrSW5mb0Zyb21TZWxlY3RlZFJvdXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTWVkaWFTZXNzaW9uQ29tcGF0LlRva2VuIGdldE1lZGlhU2Vzc2lvblRva2VuKCkgewotICAgICAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtTWVkaWFTZXNzaW9uLmdldFRva2VuKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1Db21wYXRTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUNvbXBhdFNlc3Npb24uZ2V0U2Vzc2lvblRva2VuKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGZpbmRSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkKE9iamVjdCByY2MpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1SZW1vdGVDb250cm9sQ2xpZW50cy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkIHJlY29yZCA9IG1SZW1vdGVDb250cm9sQ2xpZW50cy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlY29yZC5nZXRSZW1vdGVDb250cm9sQ2xpZW50KCkgPT0gcmNjKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVQbGF5YmFja0luZm9Gcm9tU2VsZWN0ZWRSb3V0ZSgpIHsKLSAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mby52b2x1bWUgPSBtU2VsZWN0ZWRSb3V0ZS5nZXRWb2x1bWUoKTsKLSAgICAgICAgICAgICAgICBtUGxheWJhY2tJbmZvLnZvbHVtZU1heCA9IG1TZWxlY3RlZFJvdXRlLmdldFZvbHVtZU1heCgpOwotICAgICAgICAgICAgICAgIG1QbGF5YmFja0luZm8udm9sdW1lSGFuZGxpbmcgPSBtU2VsZWN0ZWRSb3V0ZS5nZXRWb2x1bWVIYW5kbGluZygpOwotICAgICAgICAgICAgICAgIG1QbGF5YmFja0luZm8ucGxheWJhY2tTdHJlYW0gPSBtU2VsZWN0ZWRSb3V0ZS5nZXRQbGF5YmFja1N0cmVhbSgpOwotICAgICAgICAgICAgICAgIG1QbGF5YmFja0luZm8ucGxheWJhY2tUeXBlID0gbVNlbGVjdGVkUm91dGUuZ2V0UGxheWJhY2tUeXBlKCk7Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtUmVtb3RlQ29udHJvbENsaWVudHMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkIHJlY29yZCA9IG1SZW1vdGVDb250cm9sQ2xpZW50cy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlY29yZC51cGRhdGVQbGF5YmFja0luZm8oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgPT0gZ2V0RGVmYXVsdFJvdXRlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtU2VsZWN0ZWRSb3V0ZSA9PSBnZXRCbHVldG9vdGhSb3V0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBMb2NhbCByb3V0ZQotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5jbGVhclZvbHVtZUhhbmRsaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBAVm9sdW1lUHJvdmlkZXJDb21wYXQuQ29udHJvbFR5cGUgaW50IGNvbnRyb2xUeXBlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lUHJvdmlkZXJDb21wYXQuVk9MVU1FX0NPTlRST0xfRklYRUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBsYXliYWNrSW5mby52b2x1bWVIYW5kbGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVk9MVU1FX1ZBUklBQkxFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbFR5cGUgPSBWb2x1bWVQcm92aWRlckNvbXBhdC5WT0xVTUVfQ09OVFJPTF9BQlNPTFVURTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uY29uZmlndXJlVm9sdW1lKGNvbnRyb2xUeXBlLCBtUGxheWJhY2tJbmZvLnZvbHVtZU1heCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mby52b2x1bWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uY2xlYXJWb2x1bWVIYW5kbGluZygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUHJvdmlkZXJDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVQcm92aWRlci5DYWxsYmFjayB7Ci0gICAgICAgICAgICBQcm92aWRlckNhbGxiYWNrKCkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzY3JpcHRvckNoYW5nZWQoTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVQcm92aWRlckRlc2NyaXB0b3IocHJvdmlkZXIsIGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBNZWRpYVNlc3Npb25SZWNvcmQgewotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb25Db21wYXQgbU1zQ29tcGF0OwotCi0gICAgICAgICAgICBwcml2YXRlIEBWb2x1bWVQcm92aWRlckNvbXBhdC5Db250cm9sVHlwZSBpbnQgbUNvbnRyb2xUeXBlOwotICAgICAgICAgICAgcHJpdmF0ZSBpbnQgbU1heFZvbHVtZTsKLSAgICAgICAgICAgIHByaXZhdGUgVm9sdW1lUHJvdmlkZXJDb21wYXQgbVZwQ29tcGF0OwotCi0gICAgICAgICAgICBwdWJsaWMgTWVkaWFTZXNzaW9uUmVjb3JkKE9iamVjdCBtZWRpYVNlc3Npb24pIHsKLSAgICAgICAgICAgICAgICBtTXNDb21wYXQgPSBNZWRpYVNlc3Npb25Db21wYXQuZnJvbU1lZGlhU2Vzc2lvbihtQXBwbGljYXRpb25Db250ZXh0LCBtZWRpYVNlc3Npb24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgTWVkaWFTZXNzaW9uUmVjb3JkKE1lZGlhU2Vzc2lvbkNvbXBhdCBtZWRpYVNlc3Npb25Db21wYXQpIHsKLSAgICAgICAgICAgICAgICBtTXNDb21wYXQgPSBtZWRpYVNlc3Npb25Db21wYXQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGNvbmZpZ3VyZVZvbHVtZShAVm9sdW1lUHJvdmlkZXJDb21wYXQuQ29udHJvbFR5cGUgaW50IGNvbnRyb2xUeXBlLAotICAgICAgICAgICAgICAgICAgICBpbnQgbWF4LCBpbnQgY3VycmVudCkgewotICAgICAgICAgICAgICAgIGlmIChtVnBDb21wYXQgIT0gbnVsbCAmJiBjb250cm9sVHlwZSA9PSBtQ29udHJvbFR5cGUgJiYgbWF4ID09IG1NYXhWb2x1bWUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZW4ndCBjaGFuZ2VkIGNvbnRyb2wgdHlwZSBvciBtYXgganVzdCBzZXQgdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIG5ldyBjdXJyZW50IHZvbHVtZQotICAgICAgICAgICAgICAgICAgICBtVnBDb21wYXQuc2V0Q3VycmVudFZvbHVtZShjdXJyZW50KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UgY3JlYXRlIGEgbmV3IHByb3ZpZGVyIGFuZCB1cGRhdGUKLSAgICAgICAgICAgICAgICAgICAgbVZwQ29tcGF0ID0gbmV3IFZvbHVtZVByb3ZpZGVyQ29tcGF0KGNvbnRyb2xUeXBlLCBtYXgsIGN1cnJlbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25TZXRWb2x1bWVUbyhmaW5hbCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGUucmVxdWVzdFNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25BZGp1c3RWb2x1bWUoZmluYWwgaW50IGRpcmVjdGlvbikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlLnJlcXVlc3RVcGRhdGVWb2x1bWUoZGlyZWN0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9OwotICAgICAgICAgICAgICAgICAgICBtTXNDb21wYXQuc2V0UGxheWJhY2tUb1JlbW90ZShtVnBDb21wYXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgY2xlYXJWb2x1bWVIYW5kbGluZygpIHsKLSAgICAgICAgICAgICAgICBtTXNDb21wYXQuc2V0UGxheWJhY2tUb0xvY2FsKG1QbGF5YmFja0luZm8ucGxheWJhY2tTdHJlYW0pOwotICAgICAgICAgICAgICAgIG1WcENvbXBhdCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb25Db21wYXQuVG9rZW4gZ2V0VG9rZW4oKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1Nc0NvbXBhdC5nZXRTZXNzaW9uVG9rZW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZmluYWwgY2xhc3MgUmVtb3RlQ29udHJvbENsaWVudFJlY29yZAotICAgICAgICAgICAgICAgIGltcGxlbWVudHMgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdC5Wb2x1bWVDYWxsYmFjayB7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQgbVJjY0NvbXBhdDsKLSAgICAgICAgICAgIHByaXZhdGUgYm9vbGVhbiBtRGlzY29ubmVjdGVkOwotCi0gICAgICAgICAgICBwdWJsaWMgUmVtb3RlQ29udHJvbENsaWVudFJlY29yZChPYmplY3QgcmNjKSB7Ci0gICAgICAgICAgICAgICAgbVJjY0NvbXBhdCA9IFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQub2J0YWluKG1BcHBsaWNhdGlvbkNvbnRleHQsIHJjYyk7Ci0gICAgICAgICAgICAgICAgbVJjY0NvbXBhdC5zZXRWb2x1bWVDYWxsYmFjayh0aGlzKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja0luZm8oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIE9iamVjdCBnZXRSZW1vdGVDb250cm9sQ2xpZW50KCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtUmNjQ29tcGF0LmdldFJlbW90ZUNvbnRyb2xDbGllbnQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgZGlzY29ubmVjdCgpIHsKLSAgICAgICAgICAgICAgICBtRGlzY29ubmVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtUmNjQ29tcGF0LnNldFZvbHVtZUNhbGxiYWNrKG51bGwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5YmFja0luZm8oKSB7Ci0gICAgICAgICAgICAgICAgbVJjY0NvbXBhdC5zZXRQbGF5YmFja0luZm8obVBsYXliYWNrSW5mbyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVTZXRSZXF1ZXN0KGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1EaXNjb25uZWN0ZWQgJiYgbVNlbGVjdGVkUm91dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZS5yZXF1ZXN0U2V0Vm9sdW1lKHZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lVXBkYXRlUmVxdWVzdChpbnQgZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtRGlzY29ubmVjdGVkICYmIG1TZWxlY3RlZFJvdXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGUucmVxdWVzdFVwZGF0ZVZvbHVtZShkaXJlY3Rpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQ2FsbGJhY2tIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxDYWxsYmFja1JlY29yZD4gbVRlbXBDYWxsYmFja1JlY29yZHMgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PENhbGxiYWNrUmVjb3JkPigpOwotCi0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1RZUEVfTUFTSyA9IDB4ZmYwMDsKLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVFlQRV9ST1VURSA9IDB4MDEwMDsKLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVFlQRV9QUk9WSURFUiA9IDB4MDIwMDsKLQotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX0FEREVEID0gTVNHX1RZUEVfUk9VVEUgfCAxOwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX1JFTU9WRUQgPSBNU0dfVFlQRV9ST1VURSB8IDI7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUk9VVEVfQ0hBTkdFRCA9IE1TR19UWVBFX1JPVVRFIHwgMzsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19ST1VURV9WT0xVTUVfQ0hBTkdFRCA9IE1TR19UWVBFX1JPVVRFIHwgNDsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19ST1VURV9QUkVTRU5UQVRJT05fRElTUExBWV9DSEFOR0VEID0gTVNHX1RZUEVfUk9VVEUgfCA1OwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX1NFTEVDVEVEID0gTVNHX1RZUEVfUk9VVEUgfCA2OwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX1VOU0VMRUNURUQgPSBNU0dfVFlQRV9ST1VURSB8IDc7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19QUk9WSURFUl9BRERFRCA9IE1TR19UWVBFX1BST1ZJREVSIHwgMTsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19QUk9WSURFUl9SRU1PVkVEID0gTVNHX1RZUEVfUFJPVklERVIgfCAyOwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BST1ZJREVSX0NIQU5HRUQgPSBNU0dfVFlQRV9QUk9WSURFUiB8IDM7Ci0KLSAgICAgICAgICAgIENhbGxiYWNrSGFuZGxlcigpIHsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgcG9zdChpbnQgbXNnLCBPYmplY3Qgb2JqKSB7Ci0gICAgICAgICAgICAgICAgb2J0YWluTWVzc2FnZShtc2csIG9iaikuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHBvc3QoaW50IG1zZywgT2JqZWN0IG9iaiwgaW50IGFyZykgewotICAgICAgICAgICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG9idGFpbk1lc3NhZ2UobXNnLCBvYmopOwotICAgICAgICAgICAgICAgIG1lc3NhZ2UuYXJnMSA9IGFyZzsKLSAgICAgICAgICAgICAgICBtZXNzYWdlLnNlbmRUb1RhcmdldCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2hhdCA9IG1zZy53aGF0OwotICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCBvYmogPSBtc2cub2JqOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBhcmcgPSBtc2cuYXJnMTsKLQotICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1TR19ST1VURV9DSEFOR0VECi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBnZXRTZWxlY3RlZFJvdXRlKCkuZ2V0SWQoKS5lcXVhbHMoKChSb3V0ZUluZm8pIG9iaikuZ2V0SWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlU2VsZWN0ZWRSb3V0ZUlmTmVlZGVkKHRydWUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFN5bmNocm9uaXplIHN0YXRlIHdpdGggdGhlIHN5c3RlbSBtZWRpYSByb3V0ZXIuCi0gICAgICAgICAgICAgICAgc3luY1dpdGhTeXN0ZW1Qcm92aWRlcih3aGF0LCBvYmopOwotCi0gICAgICAgICAgICAgICAgLy8gSW52b2tlIGFsbCByZWdpc3RlcmVkIGNhbGxiYWNrcy4KLSAgICAgICAgICAgICAgICAvLyBCdWlsZCBhIGxpc3Qgb2YgY2FsbGJhY2tzIGJlZm9yZSBpbnZva2luZyB0aGVtIGluIGNhc2UgY2FsbGJhY2tzCi0gICAgICAgICAgICAgICAgLy8gYXJlIGFkZGVkIG9yIHJlbW92ZWQgZHVyaW5nIGRpc3BhdGNoLgotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUm91dGVycy5zaXplKCk7IC0taSA+PSAwOyApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyIHJvdXRlciA9IG1Sb3V0ZXJzLmdldChpKS5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJzLnJlbW92ZShpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRlbXBDYWxsYmFja1JlY29yZHMuYWRkQWxsKHJvdXRlci5tQ2FsbGJhY2tSZWNvcmRzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjYWxsYmFja0NvdW50ID0gbVRlbXBDYWxsYmFja1JlY29yZHMuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbGxiYWNrQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgaW52b2tlQ2FsbGJhY2sobVRlbXBDYWxsYmFja1JlY29yZHMuZ2V0KGkpLCB3aGF0LCBvYmosIGFyZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICBtVGVtcENhbGxiYWNrUmVjb3Jkcy5jbGVhcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIHN5bmNXaXRoU3lzdGVtUHJvdmlkZXIoaW50IHdoYXQsIE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHdoYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfQURERUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUHJvdmlkZXIub25TeW5jUm91dGVBZGRlZCgoUm91dGVJbmZvKSBvYmopOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX1JFTU9WRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUHJvdmlkZXIub25TeW5jUm91dGVSZW1vdmVkKChSb3V0ZUluZm8pIG9iaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1Qcm92aWRlci5vblN5bmNSb3V0ZUNoYW5nZWQoKFJvdXRlSW5mbykgb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9TRUxFQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1Qcm92aWRlci5vblN5bmNSb3V0ZVNlbGVjdGVkKChSb3V0ZUluZm8pIG9iaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCBpbnZva2VDYWxsYmFjayhDYWxsYmFja1JlY29yZCByZWNvcmQsIGludCB3aGF0LCBPYmplY3Qgb2JqLCBpbnQgYXJnKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgTWVkaWFSb3V0ZXIgcm91dGVyID0gcmVjb3JkLm1Sb3V0ZXI7Ci0gICAgICAgICAgICAgICAgZmluYWwgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgY2FsbGJhY2sgPSByZWNvcmQubUNhbGxiYWNrOwotICAgICAgICAgICAgICAgIHN3aXRjaCAod2hhdCAmIE1TR19UWVBFX01BU0spIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfVFlQRV9ST1VURTogewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUm91dGVJbmZvIHJvdXRlID0gKFJvdXRlSW5mbylvYmo7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlY29yZC5maWx0ZXJSb3V0ZUV2ZW50KHJvdXRlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfQURERUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUm91dGVBZGRlZChyb3V0ZXIsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfUkVNT1ZFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZVJlbW92ZWQocm91dGVyLCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUm91dGVDaGFuZ2VkKHJvdXRlciwgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9WT0xVTUVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZVZvbHVtZUNoYW5nZWQocm91dGVyLCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX1BSRVNFTlRBVElPTl9ESVNQTEFZX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZChyb3V0ZXIsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfU0VMRUNURUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUm91dGVTZWxlY3RlZChyb3V0ZXIsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfVU5TRUxFQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZVVuc2VsZWN0ZWQocm91dGVyLCByb3V0ZSwgYXJnKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19UWVBFX1BST1ZJREVSOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBQcm92aWRlckluZm8gcHJvdmlkZXIgPSAoUHJvdmlkZXJJbmZvKW9iajsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAod2hhdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1BST1ZJREVSX0FEREVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblByb3ZpZGVyQWRkZWQocm91dGVyLCBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1BST1ZJREVSX1JFTU9WRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUHJvdmlkZXJSZW1vdmVkKHJvdXRlciwgcHJvdmlkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19QUk9WSURFUl9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblByb3ZpZGVyQ2hhbmdlZChyb3V0ZXIsIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFTZXNzaW9uU3RhdHVzLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFTZXNzaW9uU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMDY1OTYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhU2Vzc2lvblN0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudXRpbC5UaW1lVXRpbHM7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBwbGF5YmFjayBzdGF0dXMgb2YgYSBtZWRpYSBzZXNzaW9uLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgdGhlIHJlbW90ZSBwbGF5YmFjayBwcm90b2NvbCBkZXNjcmliZWQgYnkgdGhlCi0gKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IE1lZGlhQ29udHJvbEludGVudH0gY2xhc3MuCi0gKiA8L3A+PHA+Ci0gKiBXaGVuIGEgbWVkaWEgc2Vzc2lvbiBpcyBjcmVhdGVkLCBpdCBpcyBpbml0aWFsbHkgaW4gdGhlCi0gKiB7QGxpbmsgI1NFU1NJT05fU1RBVEVfQUNUSVZFIGFjdGl2ZX0gc3RhdGUuICBXaGVuIHRoZSBtZWRpYSBzZXNzaW9uIGVuZHMKLSAqIG5vcm1hbGx5LCBpdCB0cmFuc2l0aW9ucyB0byB0aGUge0BsaW5rICNTRVNTSU9OX1NUQVRFX0VOREVEIGVuZGVkfSBzdGF0ZS4KLSAqIElmIHRoZSBtZWRpYSBzZXNzaW9uIGlzIGludmFsaWRhdGVkIGR1ZSB0byBhbm90aGVyIHNlc3Npb24gZm9yY2libHkgdGFraW5nCi0gKiBjb250cm9sIG9mIHRoZSByb3V0ZSwgdGhlbiBpdCB0cmFuc2l0aW9ucyB0byB0aGUKLSAqIHtAbGluayAjU0VTU0lPTl9TVEFURV9JTlZBTElEQVRFRCBpbnZhbGlkYXRlZH0gc3RhdGUuCi0gKiBSZWZlciB0byB0aGUgZG9jdW1lbnRhdGlvbiBvZiBlYWNoIHN0YXRlIGZvciBhbiBleHBsYW5hdGlvbiBvZiBpdHMgbWVhbmluZy4KLSAqIDwvcD48cD4KLSAqIFRvIG1vbml0b3Igc2Vzc2lvbiBzdGF0dXMsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQgc3VwcGx5IGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9IHRvIHVzZSBhcyB0aGUKLSAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIHNlc3Npb24gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcn0KLSAqIGZvciBhIGdpdmVuIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUQVJUX1NFU1NJT04gc2Vzc2lvbiBzdGFydCByZXF1ZXN0fS4KLSAqIDwvcD48cD4KLSAqIFRoaXMgb2JqZWN0IGlzIGltbXV0YWJsZSBvbmNlIGNyZWF0ZWQgdXNpbmcgYSB7QGxpbmsgQnVpbGRlcn0gaW5zdGFuY2UuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYVNlc3Npb25TdGF0dXMgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RJTUVTVEFNUCA9ICJ0aW1lc3RhbXAiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFU1NJT05fU1RBVEUgPSAic2Vzc2lvblN0YXRlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9RVUVVRV9QQVVTRUQgPSAicXVldWVQYXVzZWQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VYVFJBUyA9ICJleHRyYXMiOwotCi0gICAgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0KLSAgICAvKioKLSAgICAgKiBTZXNzaW9uIHN0YXRlOiBBY3RpdmUuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIHNlc3Npb24gaXMgYWN0aXZlIGFuZCBpbiBjb250cm9sIG9mIHRoZSByb3V0ZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VTU0lPTl9TVEFURV9BQ1RJVkUgPSAwOwotCi0gICAgLyoqCi0gICAgICogU2Vzc2lvbiBzdGF0ZTogRW5kZWQuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIHNlc3Npb24gd2FzIGVuZGVkIG5vcm1hbGx5IHVzaW5nIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VORF9TRVNTSU9OIGVuZCBzZXNzaW9ufSBhY3Rpb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIEEgdGVybWluYXRlZCBtZWRpYSBzZXNzaW9uIGNhbm5vdCBiZSB1c2VkIGFueW1vcmUuICBUbyBwbGF5IG1vcmUgbWVkaWEsIHRoZQotICAgICAqIGFwcGxpY2F0aW9uIG11c3Qgc3RhcnQgYSBuZXcgc2Vzc2lvbi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VTU0lPTl9TVEFURV9FTkRFRCA9IDE7Ci0KLSAgICAvKioKLSAgICAgKiBTZXNzaW9uIHN0YXRlOiBJbnZhbGlkYXRlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgc2Vzc2lvbiB3YXMgaW52YWxpZGF0ZWQgaW52b2x1bnRhcmlseSBkdWUgdG8KLSAgICAgKiBhbm90aGVyIHNlc3Npb24gdGFraW5nIGNvbnRyb2wgb2YgdGhlIHJvdXRlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBbiBpbnZhbGlkYXRlZCBtZWRpYSBzZXNzaW9uIGNhbm5vdCBiZSB1c2VkIGFueW1vcmUuICBUbyBwbGF5IG1vcmUgbWVkaWEsIHRoZQotICAgICAqIGFwcGxpY2F0aW9uIG11c3Qgc3RhcnQgYSBuZXcgc2Vzc2lvbi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VTU0lPTl9TVEFURV9JTlZBTElEQVRFRCA9IDI7Ci0KLSAgICBNZWRpYVNlc3Npb25TdGF0dXMoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICBtQnVuZGxlID0gYnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRpbWVzdGFtcCBhc3NvY2lhdGVkIHdpdGggdGhlIHN0YXR1cyBpbmZvcm1hdGlvbiBpbgotICAgICAqIG1pbGxpc2Vjb25kcyBzaW5jZSBib290IGluIHRoZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lfSB0aW1lIGJhc2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzdGF0dXMgdGltZXN0YW1wIGluIHRoZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lKCl9IHRpbWUgYmFzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRUaW1lc3RhbXAoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldExvbmcoS0VZX1RJTUVTVEFNUCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgc2Vzc2lvbiBzdGF0ZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNlc3Npb24gc3RhdGUuICBPbmUgb2Yge0BsaW5rICNTRVNTSU9OX1NUQVRFX0FDVElWRX0sCi0gICAgICoge0BsaW5rICNTRVNTSU9OX1NUQVRFX0VOREVEfSwgb3Ige0BsaW5rICNTRVNTSU9OX1NUQVRFX0lOVkFMSURBVEVEfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFNlc3Npb25TdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9TRVNTSU9OX1NUQVRFLCBTRVNTSU9OX1NUQVRFX0lOVkFMSURBVEVEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlc3Npb24ncyBxdWV1ZSBpcyBwYXVzZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHNlc3Npb24ncyBxdWV1ZSBpcyBwYXVzZWQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNRdWV1ZVBhdXNlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0Qm9vbGVhbihLRVlfUVVFVUVfUEFVU0VEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgYnVuZGxlIG9mIGV4dHJhcyBmb3IgdGhpcyBzdGF0dXMgb2JqZWN0LgotICAgICAqIFRoZSBleHRyYXMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgYnV0IHRoZXkgbWF5IGJlIHVzZWQKLSAgICAgKiBieSBhcHBsaWNhdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXMoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJ1bmRsZShLRVlfRVhUUkFTKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIk1lZGlhU2Vzc2lvblN0YXR1c3sgIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoInRpbWVzdGFtcD0iKTsKLSAgICAgICAgVGltZVV0aWxzLmZvcm1hdER1cmF0aW9uKFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpIC0gZ2V0VGltZXN0YW1wKCksIHJlc3VsdCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiBtcyBhZ28iKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBzZXNzaW9uU3RhdGU9IikuYXBwZW5kKHNlc3Npb25TdGF0ZVRvU3RyaW5nKGdldFNlc3Npb25TdGF0ZSgpKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgcXVldWVQYXVzZWQ9IikuYXBwZW5kKGlzUXVldWVQYXVzZWQoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZXh0cmFzPSIpLmFwcGVuZChnZXRFeHRyYXMoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiB9Iik7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgc2Vzc2lvblN0YXRlVG9TdHJpbmcoaW50IHNlc3Npb25TdGF0ZSkgewotICAgICAgICBzd2l0Y2ggKHNlc3Npb25TdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBTRVNTSU9OX1NUQVRFX0FDVElWRToKLSAgICAgICAgICAgICAgICByZXR1cm4gImFjdGl2ZSI7Ci0gICAgICAgICAgICBjYXNlIFNFU1NJT05fU1RBVEVfRU5ERUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJlbmRlZCI7Ci0gICAgICAgICAgICBjYXNlIFNFU1NJT05fU1RBVEVfSU5WQUxJREFURUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJpbnZhbGlkYXRlZCI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcoc2Vzc2lvblN0YXRlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIGJ1bmRsZSBmb3Igc2VyaWFsaXphdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgcmVwcmVzZW50ZWQgYXMgYSBidW5kbGUuCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSBhc0J1bmRsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmcm9tIGEgYnVuZGxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHJldHVybiBUaGUgbmV3IGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBidW5kbGUgd2FzIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZWRpYVNlc3Npb25TdGF0dXMgZnJvbUJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHJldHVybiBidW5kbGUgIT0gbnVsbCA/IG5ldyBNZWRpYVNlc3Npb25TdGF0dXMoYnVuZGxlKSA6IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGRlciBmb3Ige0BsaW5rIE1lZGlhU2Vzc2lvblN0YXR1cyBtZWRpYSBzZXNzaW9uIHN0YXR1cyBvYmplY3RzfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgbWVkaWEgc2Vzc2lvbiBzdGF0dXMgYnVpbGRlciB1c2luZyB0aGUgY3VycmVudCB0aW1lIGFzIHRoZQotICAgICAgICAgKiByZWZlcmVuY2UgdGltZXN0YW1wLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvblN0YXRlIFRoZSBzZXNzaW9uIHN0YXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoaW50IHNlc3Npb25TdGF0ZSkgewotICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIHNldFRpbWVzdGFtcChTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSk7Ci0gICAgICAgICAgICBzZXRTZXNzaW9uU3RhdGUoc2Vzc2lvblN0YXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDcmVhdGVzIGEgbWVkaWEgc2Vzc2lvbiBzdGF0dXMgYnVpbGRlciB3aG9zZSBpbml0aWFsIGNvbnRlbnRzIGFyZQotICAgICAgICAgKiBjb3BpZWQgZnJvbSBhbiBleGlzdGluZyBzdGF0dXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlcihNZWRpYVNlc3Npb25TdGF0dXMgc3RhdHVzKSB7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzdGF0dXMgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZShzdGF0dXMubUJ1bmRsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgdGltZXN0YW1wIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RhdHVzIGluZm9ybWF0aW9uIGluCi0gICAgICAgICAqIG1pbGxpc2Vjb25kcyBzaW5jZSBib290IGluIHRoZSB7QGxpbmsgU3lzdGVtQ2xvY2sjZWxhcHNlZFJlYWx0aW1lfSB0aW1lIGJhc2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRUaW1lc3RhbXAobG9uZyBlbGFwc2VkUmVhbHRpbWVUaW1lc3RhbXApIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0TG9uZyhLRVlfVElNRVNUQU1QLCBlbGFwc2VkUmVhbHRpbWVUaW1lc3RhbXApOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgc2Vzc2lvbiBzdGF0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFNlc3Npb25TdGF0ZShpbnQgc2Vzc2lvblN0YXRlKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfU0VTU0lPTl9TVEFURSwgc2Vzc2lvblN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgd2hldGhlciB0aGUgcXVldWUgaXMgcGF1c2VkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0UXVldWVQYXVzZWQoYm9vbGVhbiBxdWV1ZVBhdXNlZCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRCb29sZWFuKEtFWV9RVUVVRV9QQVVTRUQsIHF1ZXVlUGF1c2VkKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgYSBidW5kbGUgb2YgZXh0cmFzIGZvciB0aGlzIHN0YXR1cyBvYmplY3QuCi0gICAgICAgICAqIFRoZSBleHRyYXMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgYnV0IHRoZXkgbWF5IGJlIHVzZWQKLSAgICAgICAgICogYnkgYXBwbGljYXRpb25zLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RXh0cmFzKEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0QnVuZGxlKEtFWV9FWFRSQVMsIGV4dHJhcyk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCdWlsZHMgdGhlIHtAbGluayBNZWRpYVNlc3Npb25TdGF0dXMgbWVkaWEgc2Vzc2lvbiBzdGF0dXMgb2JqZWN0fS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb25TdGF0dXMgYnVpbGQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvblN0YXR1cyhtQnVuZGxlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGU0ZTI4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX0RBVEFfUk9VVEVfSUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9EQVRBX1JPVVRFX0xJQlJBUllfR1JPVVA7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9EQVRBX1VOU0VMRUNUX1JFQVNPTjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfREFUQV9WT0xVTUU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfQ1JFQVRFX1JPVVRFX0NPTlRST0xMRVI7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX01TR19SRUdJU1RFUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19SRUxFQVNFX1JPVVRFX0NPTlRST0xMRVI7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfUk9VVEVfQ09OVFJPTF9SRVFVRVNUOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9NU0dfU0VMRUNUX1JPVVRFOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1NFVF9ESVNDT1ZFUllfUkVRVUVTVDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19TRVRfUk9VVEVfVk9MVU1FOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9NU0dfVU5SRUdJU1RFUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19VTlNFTEVDVF9ST1VURTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19VUERBVEVfUk9VVEVfVk9MVU1FOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9WRVJTSU9OX0NVUlJFTlQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuU0VSVklDRV9EQVRBX0VSUk9SOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5TRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfRkFJTEVEOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5TRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfU1VDQ0VFREVEOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5TRVJWSUNFX01TR19ERVNDUklQVE9SX0NIQU5HRUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0dFTkVSSUNfRkFJTFVSRTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfR0VORVJJQ19TVUNDRVNTOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLlNFUlZJQ0VfTVNHX1JFR0lTVEVSRUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuU0VSVklDRV9WRVJTSU9OXzE7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuaXNWYWxpZFJlbW90ZU1lc3NlbmdlcjsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuRGVhZE9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlci5EZWF0aFJlY2lwaWVudDsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzZW5nZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXk7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2s7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBNYWludGFpbnMgYSBjb25uZWN0aW9uIHRvIGEgcGFydGljdWxhciBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlLgotICovCi1maW5hbCBjbGFzcyBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyIGV4dGVuZHMgTWVkaWFSb3V0ZVByb3ZpZGVyCi0gICAgICAgIGltcGxlbWVudHMgU2VydmljZUNvbm5lY3Rpb24gewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVQcm92aWRlclByb3h5IjsgIC8vIG1heC4gMjMgY2hhcnMKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIHByaXZhdGUgZmluYWwgQ29tcG9uZW50TmFtZSBtQ29tcG9uZW50TmFtZTsKLSAgICBmaW5hbCBQcml2YXRlSGFuZGxlciBtUHJpdmF0ZUhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8Q29udHJvbGxlcj4gbUNvbnRyb2xsZXJzID0gbmV3IEFycmF5TGlzdDxDb250cm9sbGVyPigpOwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1TdGFydGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBtQm91bmQ7Ci0gICAgcHJpdmF0ZSBDb25uZWN0aW9uIG1BY3RpdmVDb25uZWN0aW9uOwotICAgIHByaXZhdGUgYm9vbGVhbiBtQ29ubmVjdGlvblJlYWR5OwotCi0gICAgcHVibGljIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIoQ29udGV4dCBjb250ZXh0LCBDb21wb25lbnROYW1lIGNvbXBvbmVudE5hbWUpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgbmV3IFByb3ZpZGVyTWV0YWRhdGEoY29tcG9uZW50TmFtZSkpOwotCi0gICAgICAgIG1Db21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZTsKLSAgICAgICAgbVByaXZhdGVIYW5kbGVyID0gbmV3IFByaXZhdGVIYW5kbGVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJvdXRlQ29udHJvbGxlciBvbkNyZWF0ZVJvdXRlQ29udHJvbGxlcihATm9uTnVsbCBTdHJpbmcgcm91dGVJZCkgewotICAgICAgICBpZiAocm91dGVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUlkIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZVJvdXRlQ29udHJvbGxlcihyb3V0ZUlkLCBudWxsKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUm91dGVDb250cm9sbGVyIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKAotICAgICAgICAgICAgQE5vbk51bGwgU3RyaW5nIHJvdXRlSWQsIEBOb25OdWxsIFN0cmluZyByb3V0ZUdyb3VwSWQpIHsKLSAgICAgICAgaWYgKHJvdXRlSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGVJZCBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyb3V0ZUdyb3VwSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGVHcm91cElkIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNyZWF0ZVJvdXRlQ29udHJvbGxlcihyb3V0ZUlkLCByb3V0ZUdyb3VwSWQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGlzY292ZXJ5UmVxdWVzdENoYW5nZWQoTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBpZiAobUNvbm5lY3Rpb25SZWFkeSkgewotICAgICAgICAgICAgbUFjdGl2ZUNvbm5lY3Rpb24uc2V0RGlzY292ZXJ5UmVxdWVzdChyZXF1ZXN0KTsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVCaW5kaW5nKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSwgSUJpbmRlciBzZXJ2aWNlKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogQ29ubmVjdGVkIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUJvdW5kKSB7Ci0gICAgICAgICAgICBkaXNjb25uZWN0KCk7Ci0KLSAgICAgICAgICAgIE1lc3NlbmdlciBtZXNzZW5nZXIgPSAoc2VydmljZSAhPSBudWxsID8gbmV3IE1lc3NlbmdlcihzZXJ2aWNlKSA6IG51bGwpOwotICAgICAgICAgICAgaWYgKGlzVmFsaWRSZW1vdGVNZXNzZW5nZXIobWVzc2VuZ2VyKSkgewotICAgICAgICAgICAgICAgIENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKG1lc3Nlbmdlcik7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24ucmVnaXN0ZXIoKSkgewotICAgICAgICAgICAgICAgICAgICBtQWN0aXZlQ29ubmVjdGlvbiA9IGNvbm5lY3Rpb247Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBSZWdpc3RyYXRpb24gZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgdGhpcyArICI6IFNlcnZpY2UgcmV0dXJuZWQgaW52YWxpZCBtZXNzZW5nZXIgYmluZGVyIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VEaXNjb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBuYW1lKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogU2VydmljZSBkaXNjb25uZWN0ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBkaXNjb25uZWN0KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJTZXJ2aWNlIGNvbm5lY3Rpb24gIiArIG1Db21wb25lbnROYW1lLmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQ29tcG9uZW50TmFtZShTdHJpbmcgcGFja2FnZU5hbWUsIFN0cmluZyBjbGFzc05hbWUpIHsKLSAgICAgICAgcmV0dXJuIG1Db21wb25lbnROYW1lLmdldFBhY2thZ2VOYW1lKCkuZXF1YWxzKHBhY2thZ2VOYW1lKQotICAgICAgICAgICAgICAgICYmIG1Db21wb25lbnROYW1lLmdldENsYXNzTmFtZSgpLmVxdWFscyhjbGFzc05hbWUpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgICAgICBpZiAoIW1TdGFydGVkKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBTdGFydGluZyIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtU3RhcnRlZCA9IHRydWU7Ci0gICAgICAgICAgICB1cGRhdGVCaW5kaW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdG9wKCkgewotICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IFN0b3BwaW5nIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1TdGFydGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB1cGRhdGVCaW5kaW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWJpbmRJZkRpc2Nvbm5lY3RlZCgpIHsKLSAgICAgICAgaWYgKG1BY3RpdmVDb25uZWN0aW9uID09IG51bGwgJiYgc2hvdWxkQmluZCgpKSB7Ci0gICAgICAgICAgICB1bmJpbmQoKTsKLSAgICAgICAgICAgIGJpbmQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVCaW5kaW5nKCkgewotICAgICAgICBpZiAoc2hvdWxkQmluZCgpKSB7Ci0gICAgICAgICAgICBiaW5kKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB1bmJpbmQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBzaG91bGRCaW5kKCkgewotICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgIC8vIEJpbmQgd2hlbmV2ZXIgdGhlcmUgaXMgYSBkaXNjb3ZlcnkgcmVxdWVzdC4KLSAgICAgICAgICAgIGlmIChnZXREaXNjb3ZlcnlSZXF1ZXN0KCkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBCaW5kIHdoZW5ldmVyIHRoZSBhcHBsaWNhdGlvbiBoYXMgYW4gYWN0aXZlIHJvdXRlIGNvbnRyb2xsZXIuCi0gICAgICAgICAgICAvLyBUaGlzIG1lYW5zIHRoYXQgb25lIG9mIHRoaXMgcHJvdmlkZXIncyByb3V0ZXMgaXMgc2VsZWN0ZWQuCi0gICAgICAgICAgICBpZiAoIW1Db250cm9sbGVycy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGJpbmQoKSB7Ci0gICAgICAgIGlmICghbUJvdW5kKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBCaW5kaW5nIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEludGVudCBzZXJ2aWNlID0gbmV3IEludGVudChNZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX0lOVEVSRkFDRSk7Ci0gICAgICAgICAgICBzZXJ2aWNlLnNldENvbXBvbmVudChtQ29tcG9uZW50TmFtZSk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1Cb3VuZCA9IGdldENvbnRleHQoKS5iaW5kU2VydmljZShzZXJ2aWNlLCB0aGlzLCBDb250ZXh0LkJJTkRfQVVUT19DUkVBVEUpOwotICAgICAgICAgICAgICAgIGlmICghbUJvdW5kICYmIERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IEJpbmQgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogQmluZCBmYWlsZWQiLCBleCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVuYmluZCgpIHsKLSAgICAgICAgaWYgKG1Cb3VuZCkgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogVW5iaW5kaW5nIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1Cb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgZGlzY29ubmVjdCgpOwotICAgICAgICAgICAgZ2V0Q29udGV4dCgpLnVuYmluZFNlcnZpY2UodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFJvdXRlQ29udHJvbGxlciBjcmVhdGVSb3V0ZUNvbnRyb2xsZXIoU3RyaW5nIHJvdXRlSWQsIFN0cmluZyByb3V0ZUdyb3VwSWQpIHsKLSAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvcigpOwotICAgICAgICBpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPiByb3V0ZXMgPSBkZXNjcmlwdG9yLmdldFJvdXRlcygpOwotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gcm91dGVzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhUm91dGVEZXNjcmlwdG9yIHJvdXRlID0gcm91dGVzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAocm91dGUuZ2V0SWQoKS5lcXVhbHMocm91dGVJZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQ29udHJvbGxlciBjb250cm9sbGVyID0gbmV3IENvbnRyb2xsZXIocm91dGVJZCwgcm91dGVHcm91cElkKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXJzLmFkZChjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uUmVhZHkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIuYXR0YWNoQ29ubmVjdGlvbihtQWN0aXZlQ29ubmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlQmluZGluZygpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udHJvbGxlcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgdm9pZCBvbkNvbm5lY3Rpb25SZWFkeShDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLSAgICAgICAgaWYgKG1BY3RpdmVDb25uZWN0aW9uID09IGNvbm5lY3Rpb24pIHsKLSAgICAgICAgICAgIG1Db25uZWN0aW9uUmVhZHkgPSB0cnVlOwotICAgICAgICAgICAgYXR0YWNoQ29udHJvbGxlcnNUb0Nvbm5lY3Rpb24oKTsKLQotICAgICAgICAgICAgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCA9IGdldERpc2NvdmVyeVJlcXVlc3QoKTsKLSAgICAgICAgICAgIGlmIChyZXF1ZXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQWN0aXZlQ29ubmVjdGlvbi5zZXREaXNjb3ZlcnlSZXF1ZXN0KHJlcXVlc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBvbkNvbm5lY3Rpb25EaWVkKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotICAgICAgICBpZiAobUFjdGl2ZUNvbm5lY3Rpb24gPT0gY29ubmVjdGlvbikgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogU2VydmljZSBjb25uZWN0aW9uIGRpZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRpc2Nvbm5lY3QoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgb25Db25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbiBjb25uZWN0aW9uLCBTdHJpbmcgZXJyb3IpIHsKLSAgICAgICAgaWYgKG1BY3RpdmVDb25uZWN0aW9uID09IGNvbm5lY3Rpb24pIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IFNlcnZpY2UgY29ubmVjdGlvbiBlcnJvciAtICIgKyBlcnJvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1bmJpbmQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgb25Db25uZWN0aW9uRGVzY3JpcHRvckNoYW5nZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uLAotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgIGlmIChtQWN0aXZlQ29ubmVjdGlvbiA9PSBjb25uZWN0aW9uKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBEZXNjcmlwdG9yIGNoYW5nZWQsIGRlc2NyaXB0b3I9IiArIGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0RGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkaXNjb25uZWN0KCkgewotICAgICAgICBpZiAobUFjdGl2ZUNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0RGVzY3JpcHRvcihudWxsKTsKLSAgICAgICAgICAgIG1Db25uZWN0aW9uUmVhZHkgPSBmYWxzZTsKLSAgICAgICAgICAgIGRldGFjaENvbnRyb2xsZXJzRnJvbUNvbm5lY3Rpb24oKTsKLSAgICAgICAgICAgIG1BY3RpdmVDb25uZWN0aW9uLmRpc3Bvc2UoKTsKLSAgICAgICAgICAgIG1BY3RpdmVDb25uZWN0aW9uID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgb25Db250cm9sbGVyUmVsZWFzZWQoQ29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgICAgIG1Db250cm9sbGVycy5yZW1vdmUoY29udHJvbGxlcik7Ci0gICAgICAgIGNvbnRyb2xsZXIuZGV0YWNoQ29ubmVjdGlvbigpOwotICAgICAgICB1cGRhdGVCaW5kaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGF0dGFjaENvbnRyb2xsZXJzVG9Db25uZWN0aW9uKCkgewotICAgICAgICBpbnQgY291bnQgPSBtQ29udHJvbGxlcnMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIG1Db250cm9sbGVycy5nZXQoaSkuYXR0YWNoQ29ubmVjdGlvbihtQWN0aXZlQ29ubmVjdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGV0YWNoQ29udHJvbGxlcnNGcm9tQ29ubmVjdGlvbigpIHsKLSAgICAgICAgaW50IGNvdW50ID0gbUNvbnRyb2xsZXJzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBtQ29udHJvbGxlcnMuZ2V0KGkpLmRldGFjaENvbm5lY3Rpb24oKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQ29udHJvbGxlciBleHRlbmRzIFJvdXRlQ29udHJvbGxlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Sb3V0ZUlkOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUm91dGVHcm91cElkOwotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtU2VsZWN0ZWQ7Ci0gICAgICAgIHByaXZhdGUgaW50IG1QZW5kaW5nU2V0Vm9sdW1lID0gLTE7Ci0gICAgICAgIHByaXZhdGUgaW50IG1QZW5kaW5nVXBkYXRlVm9sdW1lRGVsdGE7Ci0KLSAgICAgICAgcHJpdmF0ZSBDb25uZWN0aW9uIG1Db25uZWN0aW9uOwotICAgICAgICBwcml2YXRlIGludCBtQ29udHJvbGxlcklkOwotCi0gICAgICAgIHB1YmxpYyBDb250cm9sbGVyKFN0cmluZyByb3V0ZUlkLCBTdHJpbmcgcm91dGVHcm91cElkKSB7Ci0gICAgICAgICAgICBtUm91dGVJZCA9IHJvdXRlSWQ7Ci0gICAgICAgICAgICBtUm91dGVHcm91cElkID0gcm91dGVHcm91cElkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYXR0YWNoQ29ubmVjdGlvbihDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLSAgICAgICAgICAgIG1Db25uZWN0aW9uID0gY29ubmVjdGlvbjsKLSAgICAgICAgICAgIG1Db250cm9sbGVySWQgPSBjb25uZWN0aW9uLmNyZWF0ZVJvdXRlQ29udHJvbGxlcihtUm91dGVJZCwgbVJvdXRlR3JvdXBJZCk7Ci0gICAgICAgICAgICBpZiAobVNlbGVjdGVkKSB7Ci0gICAgICAgICAgICAgICAgY29ubmVjdGlvbi5zZWxlY3RSb3V0ZShtQ29udHJvbGxlcklkKTsKLSAgICAgICAgICAgICAgICBpZiAobVBlbmRpbmdTZXRWb2x1bWUgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnNldFZvbHVtZShtQ29udHJvbGxlcklkLCBtUGVuZGluZ1NldFZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nU2V0Vm9sdW1lID0gLTE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtUGVuZGluZ1VwZGF0ZVZvbHVtZURlbHRhICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi51cGRhdGVWb2x1bWUobUNvbnRyb2xsZXJJZCwgbVBlbmRpbmdVcGRhdGVWb2x1bWVEZWx0YSk7Ci0gICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nVXBkYXRlVm9sdW1lRGVsdGEgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGRldGFjaENvbm5lY3Rpb24oKSB7Ci0gICAgICAgICAgICBpZiAobUNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uLnJlbGVhc2VSb3V0ZUNvbnRyb2xsZXIobUNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24gPSBudWxsOwotICAgICAgICAgICAgICAgIG1Db250cm9sbGVySWQgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVsZWFzZSgpIHsKLSAgICAgICAgICAgIG9uQ29udHJvbGxlclJlbGVhc2VkKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2VsZWN0KCkgewotICAgICAgICAgICAgbVNlbGVjdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24uc2VsZWN0Um91dGUobUNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25VbnNlbGVjdCgpIHsKLSAgICAgICAgICAgIG9uVW5zZWxlY3QoTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1VOS05PV04pOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVW5zZWxlY3QoaW50IHJlYXNvbikgewotICAgICAgICAgICAgbVNlbGVjdGVkID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAobUNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uLnVuc2VsZWN0Um91dGUobUNvbnRyb2xsZXJJZCwgcmVhc29uKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNldFZvbHVtZShpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICBpZiAobUNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uLnNldFZvbHVtZShtQ29udHJvbGxlcklkLCB2b2x1bWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ1NldFZvbHVtZSA9IHZvbHVtZTsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ1VwZGF0ZVZvbHVtZURlbHRhID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblVwZGF0ZVZvbHVtZShpbnQgZGVsdGEpIHsKLSAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24udXBkYXRlVm9sdW1lKG1Db250cm9sbGVySWQsIGRlbHRhKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVBlbmRpbmdVcGRhdGVWb2x1bWVEZWx0YSArPSBkZWx0YTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNvbnRyb2xSZXF1ZXN0KEludGVudCBpbnRlbnQsIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1Db25uZWN0aW9uLnNlbmRDb250cm9sUmVxdWVzdChtQ29udHJvbGxlcklkLCBpbnRlbnQsIGNhbGxiYWNrKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQ29ubmVjdGlvbiBpbXBsZW1lbnRzIERlYXRoUmVjaXBpZW50IHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZXNzZW5nZXIgbVNlcnZpY2VNZXNzZW5nZXI7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUmVjZWl2ZUhhbmRsZXIgbVJlY2VpdmVIYW5kbGVyOwotICAgICAgICBwcml2YXRlIGZpbmFsIE1lc3NlbmdlciBtUmVjZWl2ZU1lc3NlbmdlcjsKLQotICAgICAgICBwcml2YXRlIGludCBtTmV4dFJlcXVlc3RJZCA9IDE7Ci0gICAgICAgIHByaXZhdGUgaW50IG1OZXh0Q29udHJvbGxlcklkID0gMTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVNlcnZpY2VWZXJzaW9uOyAvLyBub24temVybyB3aGVuIHJlZ2lzdHJhdGlvbiBjb21wbGV0ZQotCi0gICAgICAgIHByaXZhdGUgaW50IG1QZW5kaW5nUmVnaXN0ZXJSZXF1ZXN0SWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3BhcnNlQXJyYXk8Q29udHJvbFJlcXVlc3RDYWxsYmFjaz4gbVBlbmRpbmdDYWxsYmFja3MgPQotICAgICAgICAgICAgICAgIG5ldyBTcGFyc2VBcnJheTxDb250cm9sUmVxdWVzdENhbGxiYWNrPigpOwotCi0gICAgICAgIHB1YmxpYyBDb25uZWN0aW9uKE1lc3NlbmdlciBzZXJ2aWNlTWVzc2VuZ2VyKSB7Ci0gICAgICAgICAgICBtU2VydmljZU1lc3NlbmdlciA9IHNlcnZpY2VNZXNzZW5nZXI7Ci0gICAgICAgICAgICBtUmVjZWl2ZUhhbmRsZXIgPSBuZXcgUmVjZWl2ZUhhbmRsZXIodGhpcyk7Ci0gICAgICAgICAgICBtUmVjZWl2ZU1lc3NlbmdlciA9IG5ldyBNZXNzZW5nZXIobVJlY2VpdmVIYW5kbGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHJlZ2lzdGVyKCkgewotICAgICAgICAgICAgbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZCA9IG1OZXh0UmVxdWVzdElkKys7Ci0gICAgICAgICAgICBpZiAoIXNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfUkVHSVNURVIsCi0gICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nUmVnaXN0ZXJSZXF1ZXN0SWQsCi0gICAgICAgICAgICAgICAgICAgIENMSUVOVF9WRVJTSU9OX0NVUlJFTlQsIG51bGwsIG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1TZXJ2aWNlTWVzc2VuZ2VyLmdldEJpbmRlcigpLmxpbmtUb0RlYXRoKHRoaXMsIDApOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyRGllZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfVU5SRUdJU1RFUiwgMCwgMCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICBtUmVjZWl2ZUhhbmRsZXIuZGlzcG9zZSgpOwotICAgICAgICAgICAgbVNlcnZpY2VNZXNzZW5nZXIuZ2V0QmluZGVyKCkudW5saW5rVG9EZWF0aCh0aGlzLCAwKTsKLQotICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgZmFpbFBlbmRpbmdDYWxsYmFja3MoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgZmFpbFBlbmRpbmdDYWxsYmFja3MoKSB7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtUGVuZGluZ0NhbGxiYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nQ2FsbGJhY2tzLnZhbHVlQXQoaSkub25FcnJvcihudWxsLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1QZW5kaW5nQ2FsbGJhY2tzLmNsZWFyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkdlbmVyaWNGYWlsdXJlKGludCByZXF1ZXN0SWQpIHsKLSAgICAgICAgICAgIGlmIChyZXF1ZXN0SWQgPT0gbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZCkgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nUmVnaXN0ZXJSZXF1ZXN0SWQgPSAwOwotICAgICAgICAgICAgICAgIG9uQ29ubmVjdGlvbkVycm9yKHRoaXMsICJSZWdpc3RyYXRpb24gZmFpbGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrID0gbVBlbmRpbmdDYWxsYmFja3MuZ2V0KHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nQ2FsbGJhY2tzLnJlbW92ZShyZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uRXJyb3IobnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uR2VuZXJpY1N1Y2Nlc3MoaW50IHJlcXVlc3RJZCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvblJlZ2lzdGVyZWQoaW50IHJlcXVlc3RJZCwgaW50IHNlcnZpY2VWZXJzaW9uLAotICAgICAgICAgICAgICAgIEJ1bmRsZSBkZXNjcmlwdG9yQnVuZGxlKSB7Ci0gICAgICAgICAgICBpZiAobVNlcnZpY2VWZXJzaW9uID09IDAKLSAgICAgICAgICAgICAgICAgICAgJiYgcmVxdWVzdElkID09IG1QZW5kaW5nUmVnaXN0ZXJSZXF1ZXN0SWQKLSAgICAgICAgICAgICAgICAgICAgJiYgc2VydmljZVZlcnNpb24gPj0gU0VSVklDRV9WRVJTSU9OXzEpIHsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ1JlZ2lzdGVyUmVxdWVzdElkID0gMDsKLSAgICAgICAgICAgICAgICBtU2VydmljZVZlcnNpb24gPSBzZXJ2aWNlVmVyc2lvbjsKLSAgICAgICAgICAgICAgICBvbkNvbm5lY3Rpb25EZXNjcmlwdG9yQ2hhbmdlZCh0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5mcm9tQnVuZGxlKGRlc2NyaXB0b3JCdW5kbGUpKTsKLSAgICAgICAgICAgICAgICBvbkNvbm5lY3Rpb25SZWFkeSh0aGlzKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uRGVzY3JpcHRvckNoYW5nZWQoQnVuZGxlIGRlc2NyaXB0b3JCdW5kbGUpIHsKLSAgICAgICAgICAgIGlmIChtU2VydmljZVZlcnNpb24gIT0gMCkgewotICAgICAgICAgICAgICAgIG9uQ29ubmVjdGlvbkRlc2NyaXB0b3JDaGFuZ2VkKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLmZyb21CdW5kbGUoZGVzY3JpcHRvckJ1bmRsZSkpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25Db250cm9sUmVxdWVzdFN1Y2NlZWRlZChpbnQgcmVxdWVzdElkLCBCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjayA9IG1QZW5kaW5nQ2FsbGJhY2tzLmdldChyZXF1ZXN0SWQpOwotICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ0NhbGxiYWNrcy5yZW1vdmUocmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJlc3VsdChkYXRhKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ29udHJvbFJlcXVlc3RGYWlsZWQoaW50IHJlcXVlc3RJZCwgU3RyaW5nIGVycm9yLCBCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjayA9IG1QZW5kaW5nQ2FsbGJhY2tzLmdldChyZXF1ZXN0SWQpOwotICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ0NhbGxiYWNrcy5yZW1vdmUocmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICBjYWxsYmFjay5vbkVycm9yKGVycm9yLCBkYXRhKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBiaW5kZXJEaWVkKCkgewotICAgICAgICAgICAgbVByaXZhdGVIYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgb25Db25uZWN0aW9uRGllZChDb25uZWN0aW9uLnRoaXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBjcmVhdGVSb3V0ZUNvbnRyb2xsZXIoU3RyaW5nIHJvdXRlSWQsIFN0cmluZyByb3V0ZUdyb3VwSWQpIHsKLSAgICAgICAgICAgIGludCBjb250cm9sbGVySWQgPSBtTmV4dENvbnRyb2xsZXJJZCsrOwotICAgICAgICAgICAgQnVuZGxlIGRhdGEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBkYXRhLnB1dFN0cmluZyhDTElFTlRfREFUQV9ST1VURV9JRCwgcm91dGVJZCk7Ci0gICAgICAgICAgICBkYXRhLnB1dFN0cmluZyhDTElFTlRfREFUQV9ST1VURV9MSUJSQVJZX0dST1VQLCByb3V0ZUdyb3VwSWQpOwotICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19DUkVBVEVfUk9VVEVfQ09OVFJPTExFUiwKLSAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgY29udHJvbGxlcklkLCBudWxsLCBkYXRhKTsKLSAgICAgICAgICAgIHJldHVybiBjb250cm9sbGVySWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCByZWxlYXNlUm91dGVDb250cm9sbGVyKGludCBjb250cm9sbGVySWQpIHsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfUkVMRUFTRV9ST1VURV9DT05UUk9MTEVSLAotICAgICAgICAgICAgICAgICAgICBtTmV4dFJlcXVlc3RJZCsrLCBjb250cm9sbGVySWQsIG51bGwsIG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0Um91dGUoaW50IGNvbnRyb2xsZXJJZCkgewotICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19TRUxFQ1RfUk9VVEUsCi0gICAgICAgICAgICAgICAgICAgIG1OZXh0UmVxdWVzdElkKyssIGNvbnRyb2xsZXJJZCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB1bnNlbGVjdFJvdXRlKGludCBjb250cm9sbGVySWQsIGludCByZWFzb24pIHsKLSAgICAgICAgICAgIEJ1bmRsZSBleHRyYXMgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBleHRyYXMucHV0SW50KENMSUVOVF9EQVRBX1VOU0VMRUNUX1JFQVNPTiwgcmVhc29uKTsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfVU5TRUxFQ1RfUk9VVEUsCi0gICAgICAgICAgICAgICAgICAgIG1OZXh0UmVxdWVzdElkKyssIGNvbnRyb2xsZXJJZCwgbnVsbCwgZXh0cmFzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFZvbHVtZShpbnQgY29udHJvbGxlcklkLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICBCdW5kbGUgZGF0YSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGRhdGEucHV0SW50KENMSUVOVF9EQVRBX1ZPTFVNRSwgdm9sdW1lKTsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfU0VUX1JPVVRFX1ZPTFVNRSwKLSAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgY29udHJvbGxlcklkLCBudWxsLCBkYXRhKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVZvbHVtZShpbnQgY29udHJvbGxlcklkLCBpbnQgZGVsdGEpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBkYXRhID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgZGF0YS5wdXRJbnQoQ0xJRU5UX0RBVEFfVk9MVU1FLCBkZWx0YSk7Ci0gICAgICAgICAgICBzZW5kUmVxdWVzdChDTElFTlRfTVNHX1VQREFURV9ST1VURV9WT0xVTUUsCi0gICAgICAgICAgICAgICAgICAgIG1OZXh0UmVxdWVzdElkKyssIGNvbnRyb2xsZXJJZCwgbnVsbCwgZGF0YSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzZW5kQ29udHJvbFJlcXVlc3QoaW50IGNvbnRyb2xsZXJJZCwgSW50ZW50IGludGVudCwKLSAgICAgICAgICAgICAgICBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBpbnQgcmVxdWVzdElkID0gbU5leHRSZXF1ZXN0SWQrKzsKLSAgICAgICAgICAgIGlmIChzZW5kUmVxdWVzdChDTElFTlRfTVNHX1JPVVRFX0NPTlRST0xfUkVRVUVTVCwKLSAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLCBjb250cm9sbGVySWQsIGludGVudCwgbnVsbCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtUGVuZGluZ0NhbGxiYWNrcy5wdXQocmVxdWVzdElkLCBjYWxsYmFjayk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0RGlzY292ZXJ5UmVxdWVzdChNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgICAgICBzZW5kUmVxdWVzdChDTElFTlRfTVNHX1NFVF9ESVNDT1ZFUllfUkVRVUVTVCwKLSAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgMCwgcmVxdWVzdCAhPSBudWxsID8gcmVxdWVzdC5hc0J1bmRsZSgpIDogbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gc2VuZFJlcXVlc3QoaW50IHdoYXQsIGludCByZXF1ZXN0SWQsIGludCBhcmcsIE9iamVjdCBvYmosIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICBNZXNzYWdlIG1zZyA9IE1lc3NhZ2Uub2J0YWluKCk7Ci0gICAgICAgICAgICBtc2cud2hhdCA9IHdoYXQ7Ci0gICAgICAgICAgICBtc2cuYXJnMSA9IHJlcXVlc3RJZDsKLSAgICAgICAgICAgIG1zZy5hcmcyID0gYXJnOwotICAgICAgICAgICAgbXNnLm9iaiA9IG9iajsKLSAgICAgICAgICAgIG1zZy5zZXREYXRhKGRhdGEpOwotICAgICAgICAgICAgbXNnLnJlcGx5VG8gPSBtUmVjZWl2ZU1lc3NlbmdlcjsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2VNZXNzZW5nZXIuc2VuZChtc2cpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfSBjYXRjaCAoRGVhZE9iamVjdEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBzZXJ2aWNlIGRpZWQuCi0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBpZiAod2hhdCAhPSBDTElFTlRfTVNHX1VOUkVHSVNURVIpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ291bGQgbm90IHNlbmQgbWVzc2FnZSB0byBzZXJ2aWNlLiIsIGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBQcml2YXRlSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgewotICAgICAgICBQcml2YXRlSGFuZGxlcigpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhhbmRsZXIgdGhhdCByZWNlaXZlcyBtZXNzYWdlcyBmcm9tIHRoZSBzZXJ2ZXIuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpbm5lciBjbGFzcyBpcyBzdGF0aWMgYW5kIG9ubHkgcmV0YWlucyBhIHdlYWsgcmVmZXJlbmNlIHRvIHRoZSBjb25uZWN0aW9uCi0gICAgICogdG8gcHJldmVudCB0aGUgY2xpZW50IGZyb20gYmVpbmcgbGVha2VkIGluIGNhc2UgdGhlIHNlcnZpY2UgaXMgaG9sZGluZyBhbgotICAgICAqIGFjdGl2ZSByZWZlcmVuY2UgdG8gdGhlIGNsaWVudCdzIG1lc3Nlbmdlci4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBoYW5kbGVyIHNob3VsZCBub3QgYmUgdXNlZCB0byBoYW5kbGUgYW55IG1lc3NhZ2VzIG90aGVyIHRoYW4gdGhvc2UKLSAgICAgKiB0aGF0IGNvbWUgZnJvbSB0aGUgc2VydmljZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVjZWl2ZUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPENvbm5lY3Rpb24+IG1Db25uZWN0aW9uUmVmOwotCi0gICAgICAgIHB1YmxpYyBSZWNlaXZlSGFuZGxlcihDb25uZWN0aW9uIGNvbm5lY3Rpb24pIHsKLSAgICAgICAgICAgIG1Db25uZWN0aW9uUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8Q29ubmVjdGlvbj4oY29ubmVjdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAgICAgbUNvbm5lY3Rpb25SZWYuY2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBoYW5kbGVNZXNzYWdlKE1lc3NhZ2UgbXNnKSB7Ci0gICAgICAgICAgICBDb25uZWN0aW9uIGNvbm5lY3Rpb24gPSBtQ29ubmVjdGlvblJlZi5nZXQoKTsKLSAgICAgICAgICAgIGlmIChjb25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2hhdCA9IG1zZy53aGF0OwotICAgICAgICAgICAgICAgIGZpbmFsIGludCByZXF1ZXN0SWQgPSBtc2cuYXJnMTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgYXJnID0gbXNnLmFyZzI7Ci0gICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IG9iaiA9IG1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgZmluYWwgQnVuZGxlIGRhdGEgPSBtc2cucGVla0RhdGEoKTsKLSAgICAgICAgICAgICAgICBpZiAoIXByb2Nlc3NNZXNzYWdlKGNvbm5lY3Rpb24sIHdoYXQsIHJlcXVlc3RJZCwgYXJnLCBvYmosIGRhdGEpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVW5oYW5kbGVkIG1lc3NhZ2UgZnJvbSBzZXJ2ZXI6ICIgKyBtc2cpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIHByb2Nlc3NNZXNzYWdlKENvbm5lY3Rpb24gY29ubmVjdGlvbiwKLSAgICAgICAgICAgICAgICBpbnQgd2hhdCwgaW50IHJlcXVlc3RJZCwgaW50IGFyZywgT2JqZWN0IG9iaiwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgIHN3aXRjaCAod2hhdCkgewotICAgICAgICAgICAgICAgIGNhc2UgU0VSVklDRV9NU0dfR0VORVJJQ19GQUlMVVJFOgotICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLm9uR2VuZXJpY0ZhaWx1cmUocmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNFUlZJQ0VfTVNHX0dFTkVSSUNfU1VDQ0VTUzoKLSAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi5vbkdlbmVyaWNTdWNjZXNzKHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX01TR19SRUdJU1RFUkVEOgotICAgICAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwgfHwgb2JqIGluc3RhbmNlb2YgQnVuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5vblJlZ2lzdGVyZWQocmVxdWVzdElkLCBhcmcsIChCdW5kbGUpb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgU0VSVklDRV9NU0dfREVTQ1JJUFRPUl9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwgfHwgb2JqIGluc3RhbmNlb2YgQnVuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5vbkRlc2NyaXB0b3JDaGFuZ2VkKChCdW5kbGUpb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX1NVQ0NFRURFRDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsIHx8IG9iaiBpbnN0YW5jZW9mIEJ1bmRsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbm5lY3Rpb24ub25Db250cm9sUmVxdWVzdFN1Y2NlZWRlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLCAoQnVuZGxlKW9iaik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9GQUlMRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogaW5zdGFuY2VvZiBCdW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBlcnJvciA9IChkYXRhID09IG51bGwgPyBudWxsIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXRTdHJpbmcoU0VSVklDRV9EQVRBX0VSUk9SKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5vbkNvbnRyb2xSZXF1ZXN0RmFpbGVkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsIGVycm9yLCAoQnVuZGxlKW9iaik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcldhdGNoZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTFmNjQ3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uU2VydmljZUluZm87Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLS8qKgotICogV2F0Y2hlcyBmb3IgbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZXMgdG8gYmUgaW5zdGFsbGVkLgotICogQWRkcyBhIHByb3ZpZGVyIHRvIHRoZSBtZWRpYSByb3V0ZXIgZm9yIGVhY2ggcmVnaXN0ZXJlZCBzZXJ2aWNlLgotICoKLSAqIEBzZWUgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcgotICovCi1maW5hbCBjbGFzcyBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgZmluYWwgQ2FsbGJhY2sgbUNhbGxiYWNrOwotICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlcjsKLSAgICBwcml2YXRlIGZpbmFsIFBhY2thZ2VNYW5hZ2VyIG1QYWNrYWdlTWFuYWdlcjsKLQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXI+IG1Qcm92aWRlcnMgPQotICAgICAgICAgICAgbmV3IEFycmF5TGlzdDxSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyPigpOwotICAgIHByaXZhdGUgYm9vbGVhbiBtUnVubmluZzsKLQotICAgIHB1YmxpYyBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlcihDb250ZXh0IGNvbnRleHQsIENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgICAgIG1IYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKLSAgICAgICAgbVBhY2thZ2VNYW5hZ2VyID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgICAgICBpZiAoIW1SdW5uaW5nKSB7Ci0gICAgICAgICAgICBtUnVubmluZyA9IHRydWU7Ci0KLSAgICAgICAgICAgIEludGVudEZpbHRlciBmaWx0ZXIgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fUEFDS0FHRV9BRERFRCk7Ci0gICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fUEFDS0FHRV9SRU1PVkVEKTsKLSAgICAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9QQUNLQUdFX0NIQU5HRUQpOwotICAgICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfUkVQTEFDRUQpOwotICAgICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfUkVTVEFSVEVEKTsKLSAgICAgICAgICAgIGZpbHRlci5hZGREYXRhU2NoZW1lKCJwYWNrYWdlIik7Ci0gICAgICAgICAgICBtQ29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1TY2FuUGFja2FnZXNSZWNlaXZlciwgZmlsdGVyLCBudWxsLCBtSGFuZGxlcik7Ci0KLSAgICAgICAgICAgIC8vIFNjYW4gcGFja2FnZXMuCi0gICAgICAgICAgICAvLyBBbHNvIGhhcyB0aGUgc2lkZS1lZmZlY3Qgb2YgcmVzdGFydGluZyBwcm92aWRlcnMgaWYgbmVlZGVkLgotICAgICAgICAgICAgbUhhbmRsZXIucG9zdChtU2NhblBhY2thZ2VzUnVubmFibGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RvcCgpIHsKLSAgICAgICAgaWYgKG1SdW5uaW5nKSB7Ci0gICAgICAgICAgICBtUnVubmluZyA9IGZhbHNlOwotCi0gICAgICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIobVNjYW5QYWNrYWdlc1JlY2VpdmVyKTsKLSAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZUNhbGxiYWNrcyhtU2NhblBhY2thZ2VzUnVubmFibGUpOwotCi0gICAgICAgICAgICAvLyBTdG9wIGFsbCBwcm92aWRlcnMuCi0gICAgICAgICAgICBmb3IgKGludCBpID0gbVByb3ZpZGVycy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgewotICAgICAgICAgICAgICAgIG1Qcm92aWRlcnMuZ2V0KGkpLnN0b3AoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc2NhblBhY2thZ2VzKCkgewotICAgICAgICBpZiAoIW1SdW5uaW5nKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBZGQgcHJvdmlkZXJzIGZvciBhbGwgbmV3IHNlcnZpY2VzLgotICAgICAgICAvLyBSZW9yZGVyIHRoZSBsaXN0IHNvIHRoYXQgcHJvdmlkZXJzIGxlZnQgYXQgdGhlIGVuZCB3aWxsIGJlIHRoZSBvbmVzIHRvIHJlbW92ZS4KLSAgICAgICAgaW50IHRhcmdldEluZGV4ID0gMDsKLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZS5TRVJWSUNFX0lOVEVSRkFDRSk7Ci0gICAgICAgIGZvciAoUmVzb2x2ZUluZm8gcmVzb2x2ZUluZm8gOiBtUGFja2FnZU1hbmFnZXIucXVlcnlJbnRlbnRTZXJ2aWNlcyhpbnRlbnQsIDApKSB7Ci0gICAgICAgICAgICBTZXJ2aWNlSW5mbyBzZXJ2aWNlSW5mbyA9IHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvOwotICAgICAgICAgICAgaWYgKHNlcnZpY2VJbmZvICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgc291cmNlSW5kZXggPSBmaW5kUHJvdmlkZXIoc2VydmljZUluZm8ucGFja2FnZU5hbWUsIHNlcnZpY2VJbmZvLm5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChzb3VyY2VJbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIobUNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IENvbXBvbmVudE5hbWUoc2VydmljZUluZm8ucGFja2FnZU5hbWUsIHNlcnZpY2VJbmZvLm5hbWUpKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIuc3RhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgbVByb3ZpZGVycy5hZGQodGFyZ2V0SW5kZXgrKywgcHJvdmlkZXIpOwotICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2suYWRkUHJvdmlkZXIocHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlSW5kZXggPj0gdGFyZ2V0SW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlciA9IG1Qcm92aWRlcnMuZ2V0KHNvdXJjZUluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIuc3RhcnQoKTsgLy8gcmVzdGFydCB0aGUgcHJvdmlkZXIgaWYgbmVlZGVkCi0gICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyLnJlYmluZElmRGlzY29ubmVjdGVkKCk7Ci0gICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnN3YXAobVByb3ZpZGVycywgc291cmNlSW5kZXgsIHRhcmdldEluZGV4KyspOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlbW92ZSBwcm92aWRlcnMgZm9yIG1pc3Npbmcgc2VydmljZXMuCi0gICAgICAgIGlmICh0YXJnZXRJbmRleCA8IG1Qcm92aWRlcnMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gbVByb3ZpZGVycy5zaXplKCkgLSAxOyBpID49IHRhcmdldEluZGV4OyBpLS0pIHsKLSAgICAgICAgICAgICAgICBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyID0gbVByb3ZpZGVycy5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrLnJlbW92ZVByb3ZpZGVyKHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICBtUHJvdmlkZXJzLnJlbW92ZShwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgcHJvdmlkZXIuc3RvcCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZmluZFByb3ZpZGVyKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICBpbnQgY291bnQgPSBtUHJvdmlkZXJzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyID0gbVByb3ZpZGVycy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAocHJvdmlkZXIuaGFzQ29tcG9uZW50TmFtZShwYWNrYWdlTmFtZSwgY2xhc3NOYW1lKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIEJyb2FkY2FzdFJlY2VpdmVyIG1TY2FuUGFja2FnZXNSZWNlaXZlciA9IG5ldyBCcm9hZGNhc3RSZWNlaXZlcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIHNjYW5QYWNrYWdlcygpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgUnVubmFibGUgbVNjYW5QYWNrYWdlc1J1bm5hYmxlID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgc2NhblBhY2thZ2VzKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHVibGljIGludGVyZmFjZSBDYWxsYmFjayB7Ci0gICAgICAgIHZvaWQgYWRkUHJvdmlkZXIoTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyKTsKLSAgICAgICAgdm9pZCByZW1vdmVQcm92aWRlcihNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVtb3RlQ29udHJvbENsaWVudENvbXBhdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MjY0NDliLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uUmVxdWlyZXNBcGk7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmLldlYWtSZWZlcmVuY2U7Ci0KLS8qKgotICogUHJvdmlkZXMgYWNjZXNzIHRvIGZlYXR1cmVzIG9mIHRoZSByZW1vdGUgY29udHJvbCBjbGllbnQuCi0gKgotICogSGlkZGVuIGZvciBub3cgYnV0IHdlIG1pZ2h0IHdhbnQgdG8gbWFrZSB0aGlzIGF2YWlsYWJsZSB0byBhcHBsaWNhdGlvbnMKLSAqIGluIHRoZSBmdXR1cmUuCi0gKi8KLWFic3RyYWN0IGNsYXNzIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQgewotICAgIHByb3RlY3RlZCBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByb3RlY3RlZCBmaW5hbCBPYmplY3QgbVJjYzsKLSAgICBwcm90ZWN0ZWQgVm9sdW1lQ2FsbGJhY2sgbVZvbHVtZUNhbGxiYWNrOwotCi0gICAgcHJvdGVjdGVkIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQoQ29udGV4dCBjb250ZXh0LCBPYmplY3QgcmNjKSB7Ci0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbVJjYyA9IHJjYzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQgb2J0YWluKENvbnRleHQgY29udGV4dCwgT2JqZWN0IHJjYykgewotICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IDE2KSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEplbGx5YmVhbkltcGwoY29udGV4dCwgcmNjKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IExlZ2FjeUltcGwoY29udGV4dCwgcmNjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSB7Ci0gICAgICAgIHJldHVybiBtUmNjOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgcGxheWJhY2sgaW5mb3JtYXRpb24uCi0gICAgICogTXVzdCBiZSBjYWxsZWQgYXQgbGVhc3Qgb25jZSB0byBhdHRhY2ggdG8gdGhlIHJlbW90ZSBjb250cm9sIGNsaWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmZvIFRoZSBwbGF5YmFjayBpbmZvcm1hdGlvbi4gIE11c3Qgbm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0UGxheWJhY2tJbmZvKFBsYXliYWNrSW5mbyBpbmZvKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGNhbGxiYWNrIHRvIHJlY2VpdmUgdm9sdW1lIGNoYW5nZSByZXF1ZXN0cyBmcm9tIHRoZSByZW1vdGUgY29udHJvbCBjbGllbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIHZvbHVtZSBjYWxsYmFjayB0byB1c2Ugb3IgbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZvbHVtZUNhbGxiYWNrKFZvbHVtZUNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIG1Wb2x1bWVDYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNwZWNpZmllcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGxheWJhY2suCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQbGF5YmFja0luZm8gewotICAgICAgICBwdWJsaWMgaW50IHZvbHVtZTsKLSAgICAgICAgcHVibGljIGludCB2b2x1bWVNYXg7Ci0gICAgICAgIHB1YmxpYyBpbnQgdm9sdW1lSGFuZGxpbmcgPSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVk9MVU1FX0ZJWEVEOwotICAgICAgICBwdWJsaWMgaW50IHBsYXliYWNrU3RyZWFtID0gQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQzsKLSAgICAgICAgcHVibGljIGludCBwbGF5YmFja1R5cGUgPSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVFlQRV9SRU1PVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdm9sdW1lIHVwZGF0ZXMgYXJlIHJlcXVlc3RlZCBieSB0aGUgcmVtb3RlIGNvbnRyb2wgY2xpZW50LgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgVm9sdW1lQ2FsbGJhY2sgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHZvbHVtZSBzaG91bGQgYmUgaW5jcmVhc2VkIG9yIGRlY3JlYXNlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGRpcmVjdGlvbiBBbiBpbnRlZ2VyIGluZGljYXRpbmcgd2hldGhlciB0aGUgdm9sdW1lIGlzIHRvIGJlIGluY3JlYXNlZAotICAgICAgICAgKiAocG9zaXRpdmUgdmFsdWUpIG9yIGRlY3JlYXNlZCAobmVnYXRpdmUgdmFsdWUpLgotICAgICAgICAgKiBGb3IgYnVuZGxlZCBjaGFuZ2VzLCB0aGUgYWJzb2x1dGUgdmFsdWUgaW5kaWNhdGVzIHRoZSBudW1iZXIgb2YgY2hhbmdlcwotICAgICAgICAgKiBpbiB0aGUgc2FtZSBkaXJlY3Rpb24sIGUuZy4gKzMgY29ycmVzcG9uZHMgdG8gdGhyZWUgInZvbHVtZSB1cCIgY2hhbmdlcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lVXBkYXRlUmVxdWVzdChpbnQgZGlyZWN0aW9uKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHZvbHVtZSBmb3IgdGhlIHJvdXRlIHNob3VsZCBiZSBzZXQgdG8gdGhlIGdpdmVuIHZhbHVlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gdm9sdW1lIEFuIGludGVnZXIgaW5kaWNhdGluZyB0aGUgbmV3IHZvbHVtZSB2YWx1ZSB0aGF0IHNob3VsZCBiZSB1c2VkLAotICAgICAgICAgKiBhbHdheXMgYmV0d2VlbiAwIGFuZCB0aGUgdmFsdWUgc2V0IGJ5IHtAbGluayBQbGF5YmFja0luZm8jdm9sdW1lTWF4fS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lU2V0UmVxdWVzdChpbnQgdm9sdW1lKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMZWdhY3kgaW1wbGVtZW50YXRpb24gZm9yIHBsYXRmb3JtIHZlcnNpb25zIHByaW9yIHRvIEplbGx5YmVhbi4KLSAgICAgKiBEb2VzIG5vdGhpbmcuCi0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIExlZ2FjeUltcGwgZXh0ZW5kcyBSZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0IHsKLSAgICAgICAgcHVibGljIExlZ2FjeUltcGwoQ29udGV4dCBjb250ZXh0LCBPYmplY3QgcmNjKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCByY2MpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50YXRpb24gZm9yIEplbGx5YmVhbi4KLSAgICAgKgotICAgICAqIFRoZSBiYXNpYyBpZGVhIG9mIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgdG8gYXR0YWNoIHRoZSBSQ0MgdG8gYSBVc2VyUm91dGVJbmZvCi0gICAgICogaW4gb3JkZXIgdG8gaG9vayB1cCBzdHJlYW0gbWV0YWRhdGEgYW5kIHZvbHVtZSBjYWxsYmFja3MgYmVjYXVzZSB0aGVyZSBpcyBubwotICAgICAqIG90aGVyIEFQSSBhdmFpbGFibGUgdG8gZG8gc28gaW4gdGhpcyBwbGF0Zm9ybSB2ZXJzaW9uLiAgVGhlIFVzZXJSb3V0ZUluZm8gaXRzZWxmCi0gICAgICogaXMgbm90IGF0dGFjaGVkIHRvIHRoZSBNZWRpYVJvdXRlciBzbyBpdCBpcyB0cmFuc3BhcmVudCB0byB0aGUgdXNlci4KLSAgICAgKi8KLSAgICAvLyBAQFJlcXVpcmVzQXBpKDE2KQotICAgIHN0YXRpYyBjbGFzcyBKZWxseWJlYW5JbXBsIGV4dGVuZHMgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdCB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Sb3V0ZXJPYmo7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Vc2VyUm91dGVDYXRlZ29yeU9iajsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbVVzZXJSb3V0ZU9iajsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1SZWdpc3RlcmVkOwotCi0gICAgICAgIHB1YmxpYyBKZWxseWJlYW5JbXBsKENvbnRleHQgY29udGV4dCwgT2JqZWN0IHJjYykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgcmNjKTsKLQotICAgICAgICAgICAgbVJvdXRlck9iaiA9IE1lZGlhUm91dGVySmVsbHliZWFuLmdldE1lZGlhUm91dGVyKGNvbnRleHQpOwotICAgICAgICAgICAgbVVzZXJSb3V0ZUNhdGVnb3J5T2JqID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uY3JlYXRlUm91dGVDYXRlZ29yeSgKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlck9iaiwgIiIsIGZhbHNlKTsKLSAgICAgICAgICAgIG1Vc2VyUm91dGVPYmogPSBNZWRpYVJvdXRlckplbGx5YmVhbi5jcmVhdGVVc2VyUm91dGUoCi0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJPYmosIG1Vc2VyUm91dGVDYXRlZ29yeU9iaik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0UGxheWJhY2tJbmZvKFBsYXliYWNrSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZSgKLSAgICAgICAgICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiwgaW5mby52b2x1bWUpOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVNYXgoCi0gICAgICAgICAgICAgICAgICAgIG1Vc2VyUm91dGVPYmosIGluZm8udm9sdW1lTWF4KTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0Vm9sdW1lSGFuZGxpbmcoCi0gICAgICAgICAgICAgICAgICAgIG1Vc2VyUm91dGVPYmosIGluZm8udm9sdW1lSGFuZGxpbmcpOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRQbGF5YmFja1N0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiwgaW5mby5wbGF5YmFja1N0cmVhbSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFBsYXliYWNrVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiwgaW5mby5wbGF5YmFja1R5cGUpOwotCi0gICAgICAgICAgICBpZiAoIW1SZWdpc3RlcmVkKSB7Ci0gICAgICAgICAgICAgICAgbVJlZ2lzdGVyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0Vm9sdW1lQ2FsbGJhY2sobVVzZXJSb3V0ZU9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLmNyZWF0ZVZvbHVtZUNhbGxiYWNrKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgVm9sdW1lQ2FsbGJhY2tXcmFwcGVyKHRoaXMpKSk7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRSZW1vdGVDb250cm9sQ2xpZW50KG1Vc2VyUm91dGVPYmosIG1SY2MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgVm9sdW1lQ2FsbGJhY2tXcmFwcGVyCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50cyBNZWRpYVJvdXRlckplbGx5YmVhbi5Wb2x1bWVDYWxsYmFjayB7Ci0gICAgICAgICAgICAvLyBVbmZvcnR1bmF0ZWx5LCB0aGUgZnJhbWV3b3JrIG5ldmVyIHVucmVnaXN0ZXJzIGl0cyB2b2x1bWUgb2JzZXJ2ZXIgZnJvbQotICAgICAgICAgICAgLy8gdGhlIGF1ZGlvIHNlcnZpY2Ugc28gdGhlIFVzZXJSb3V0ZUluZm8gb2JqZWN0IG1heSBsZWFrIGFsb25nIHdpdGgKLSAgICAgICAgICAgIC8vIGFueSBjYWxsYmFja3MgdGhhdCB3ZSBhdHRhY2ggdG8gaXQuICBVc2UgYSB3ZWFrIHJlZmVyZW5jZSB0byBwcmV2ZW50Ci0gICAgICAgICAgICAvLyB0aGUgdm9sdW1lIGNhbGxiYWNrIGZyb20gaG9sZGluZyBzdHJvbmcgcmVmZXJlbmNlcyB0byBhbnl0aGluZyBpbXBvcnRhbnQuCi0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8SmVsbHliZWFuSW1wbD4gbUltcGxXZWFrOwotCi0gICAgICAgICAgICBwdWJsaWMgVm9sdW1lQ2FsbGJhY2tXcmFwcGVyKEplbGx5YmVhbkltcGwgaW1wbCkgewotICAgICAgICAgICAgICAgIG1JbXBsV2VhayA9IG5ldyBXZWFrUmVmZXJlbmNlPEplbGx5YmVhbkltcGw+KGltcGwpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lVXBkYXRlUmVxdWVzdChPYmplY3Qgcm91dGVPYmosIGludCBkaXJlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICBKZWxseWJlYW5JbXBsIGltcGwgPSBtSW1wbFdlYWsuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGltcGwgIT0gbnVsbCAmJiBpbXBsLm1Wb2x1bWVDYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGltcGwubVZvbHVtZUNhbGxiYWNrLm9uVm9sdW1lVXBkYXRlUmVxdWVzdChkaXJlY3Rpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVNldFJlcXVlc3QoT2JqZWN0IHJvdXRlT2JqLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICAgICAgSmVsbHliZWFuSW1wbCBpbXBsID0gbUltcGxXZWFrLmdldCgpOwotICAgICAgICAgICAgICAgIGlmIChpbXBsICE9IG51bGwgJiYgaW1wbC5tVm9sdW1lQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBpbXBsLm1Wb2x1bWVDYWxsYmFjay5vblZvbHVtZVNldFJlcXVlc3Qodm9sdW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvUmVtb3RlUGxheWJhY2tDbGllbnQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZW1vdGVQbGF5YmFja0NsaWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmUxNDk3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZW1vdGVQbGF5YmFja0NsaWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudXRpbC5PYmplY3RzQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLS8qKgotICogQSBoZWxwZXIgY2xhc3MgZm9yIHBsYXlpbmcgbWVkaWEgb24gcmVtb3RlIHJvdXRlcyB1c2luZyB0aGUgcmVtb3RlIHBsYXliYWNrIHByb3RvY29sCi0gKiBkZWZpbmVkIGJ5IHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnR9LgotICogPHA+Ci0gKiBUaGUgY2xpZW50IG1haW50YWlucyBzZXNzaW9uIHN0YXRlIGFuZCBvZmZlcnMgYSBzaW1wbGlmaWVkIGludGVyZmFjZSBmb3IgaXNzdWluZwotICogcmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgaW50ZW50cyB0byBhIHNpbmdsZSByb3V0ZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIFJlbW90ZVBsYXliYWNrQ2xpZW50IHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJSZW1vdGVQbGF5YmFja0NsaWVudCI7Ci0gICAgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gbVJvdXRlOwotICAgIHByaXZhdGUgZmluYWwgQWN0aW9uUmVjZWl2ZXIgbUFjdGlvblJlY2VpdmVyOwotICAgIHByaXZhdGUgZmluYWwgUGVuZGluZ0ludGVudCBtSXRlbVN0YXR1c1BlbmRpbmdJbnRlbnQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQZW5kaW5nSW50ZW50IG1TZXNzaW9uU3RhdHVzUGVuZGluZ0ludGVudDsKLSAgICBwcml2YXRlIGZpbmFsIFBlbmRpbmdJbnRlbnQgbU1lc3NhZ2VQZW5kaW5nSW50ZW50OwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Sb3V0ZVN1cHBvcnRzUmVtb3RlUGxheWJhY2s7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Sb3V0ZVN1cHBvcnRzUXVldWluZzsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVJvdXRlU3VwcG9ydHNTZXNzaW9uTWFuYWdlbWVudDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVJvdXRlU3VwcG9ydHNNZXNzYWdpbmc7Ci0KLSAgICBTdHJpbmcgbVNlc3Npb25JZDsKLSAgICBTdGF0dXNDYWxsYmFjayBtU3RhdHVzQ2FsbGJhY2s7Ci0gICAgT25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lciBtT25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lcjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSByZW1vdGUgcGxheWJhY2sgY2xpZW50IGZvciBhIHJvdXRlLgotICAgICAqCi0gICAgICogQHBhcmFtIHJvdXRlIFRoZSBtZWRpYSByb3V0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVtb3RlUGxheWJhY2tDbGllbnQoQ29udGV4dCBjb250ZXh0LCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udGV4dCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJvdXRlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbVJvdXRlID0gcm91dGU7Ci0KLSAgICAgICAgSW50ZW50RmlsdGVyIGFjdGlvbkZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKLSAgICAgICAgYWN0aW9uRmlsdGVyLmFkZEFjdGlvbihBY3Rpb25SZWNlaXZlci5BQ1RJT05fSVRFTV9TVEFUVVNfQ0hBTkdFRCk7Ci0gICAgICAgIGFjdGlvbkZpbHRlci5hZGRBY3Rpb24oQWN0aW9uUmVjZWl2ZXIuQUNUSU9OX1NFU1NJT05fU1RBVFVTX0NIQU5HRUQpOwotICAgICAgICBhY3Rpb25GaWx0ZXIuYWRkQWN0aW9uKEFjdGlvblJlY2VpdmVyLkFDVElPTl9NRVNTQUdFX1JFQ0VJVkVEKTsKLSAgICAgICAgbUFjdGlvblJlY2VpdmVyID0gbmV3IEFjdGlvblJlY2VpdmVyKCk7Ci0gICAgICAgIGNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtQWN0aW9uUmVjZWl2ZXIsIGFjdGlvbkZpbHRlcik7Ci0KLSAgICAgICAgSW50ZW50IGl0ZW1TdGF0dXNJbnRlbnQgPSBuZXcgSW50ZW50KEFjdGlvblJlY2VpdmVyLkFDVElPTl9JVEVNX1NUQVRVU19DSEFOR0VEKTsKLSAgICAgICAgaXRlbVN0YXR1c0ludGVudC5zZXRQYWNrYWdlKGNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgICAgIG1JdGVtU3RhdHVzUGVuZGluZ0ludGVudCA9IFBlbmRpbmdJbnRlbnQuZ2V0QnJvYWRjYXN0KAotICAgICAgICAgICAgICAgIGNvbnRleHQsIDAsIGl0ZW1TdGF0dXNJbnRlbnQsIDApOwotCi0gICAgICAgIEludGVudCBzZXNzaW9uU3RhdHVzSW50ZW50ID0gbmV3IEludGVudChBY3Rpb25SZWNlaXZlci5BQ1RJT05fU0VTU0lPTl9TVEFUVVNfQ0hBTkdFRCk7Ci0gICAgICAgIHNlc3Npb25TdGF0dXNJbnRlbnQuc2V0UGFja2FnZShjb250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICBtU2Vzc2lvblN0YXR1c1BlbmRpbmdJbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEJyb2FkY2FzdCgKLSAgICAgICAgICAgICAgICBjb250ZXh0LCAwLCBzZXNzaW9uU3RhdHVzSW50ZW50LCAwKTsKLQotICAgICAgICBJbnRlbnQgbWVzc2FnZUludGVudCA9IG5ldyBJbnRlbnQoQWN0aW9uUmVjZWl2ZXIuQUNUSU9OX01FU1NBR0VfUkVDRUlWRUQpOwotICAgICAgICBtZXNzYWdlSW50ZW50LnNldFBhY2thZ2UoY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgbU1lc3NhZ2VQZW5kaW5nSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QoCi0gICAgICAgICAgICAgICAgY29udGV4dCwgMCwgbWVzc2FnZUludGVudCwgMCk7Ci0gICAgICAgIGRldGVjdEZlYXR1cmVzKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVsZWFzZXMgcmVzb3VyY2VzIG93bmVkIGJ5IHRoZSBjbGllbnQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZSgpIHsKLSAgICAgICAgbUNvbnRleHQudW5yZWdpc3RlclJlY2VpdmVyKG1BY3Rpb25SZWNlaXZlcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyByZW1vdGUgcGxheWJhY2suCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgcmVtb3RlIHBsYXliYWNrLCB0aGVuIG5vbmUgb2YgdGhlIGZ1bmN0aW9uYWxpdHkKLSAgICAgKiBvZmZlcmVkIGJ5IHRoZSBjbGllbnQgd2lsbCBiZSBhdmFpbGFibGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgYWxsIG9mIHRoZSBmb2xsb3dpbmcKLSAgICAgKiBhY3Rpb25zOiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZIHBsYXl9LAotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NFRUsgc2Vla30sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NUQVRVUyBnZXQgc3RhdHVzfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QQVVTRSBwYXVzZX0sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVTVU1FIHJlc3VtZX0sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RPUCBzdG9wfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgcmVtb3RlIHBsYXliYWNrIGlzIHN1cHBvcnRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHF1ZXVpbmcgZmVhdHVyZXMuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgcXVldWluZywgdGhlbiBhdCBtb3N0IG9uZSBtZWRpYSBpdGVtIGNhbiBiZSBwbGF5ZWQKLSAgICAgKiBhdCBhIHRpbWUgYW5kIHRoZSB7QGxpbmsgI2VucXVldWV9IG1ldGhvZCB3aWxsIG5vdCBiZSBhdmFpbGFibGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgYWxsIG9mIHRoZSBiYXNpYyByZW1vdGUgcGxheWJhY2sKLSAgICAgKiBhY3Rpb25zIGFuZCBhbGwgb2YgdGhlIGZvbGxvd2luZyBhY3Rpb25zOgotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVNT1ZFIHJlbW92ZX0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHF1ZXVpbmcgaXMgc3VwcG9ydGVkLiAgSW1wbGllcyB7QGxpbmsgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWR9Ci0gICAgICogaXMgYWxzbyB0cnVlLgotICAgICAqCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUXVldWluZ1N1cHBvcnRlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1Sb3V0ZVN1cHBvcnRzUXVldWluZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHNlc3Npb24gbWFuYWdlbWVudCBmZWF0dXJlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBzZXNzaW9uIG1hbmFnZW1lbnQsIHRoZW4gdGhlIHNlc3Npb24gd2lsbAotICAgICAqIG5vdCBiZSBjcmVhdGVkIHVudGlsIHRoZSBmaXJzdCBtZWRpYSBpdGVtIGlzIHBsYXllZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBhbGwgb2YgdGhlIGJhc2ljIHJlbW90ZSBwbGF5YmFjawotICAgICAqIGFjdGlvbnMgYW5kIGFsbCBvZiB0aGUgZm9sbG93aW5nIGFjdGlvbnM6Ci0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RBUlRfU0VTU0lPTiBzdGFydCBzZXNzaW9ufSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMgZ2V0IHNlc3Npb24gc3RhdHVzfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTkRfU0VTU0lPTiBlbmQgc2Vzc2lvbn0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHNlc3Npb24gbWFuYWdlbWVudCBpcyBzdXBwb3J0ZWQuCi0gICAgICogSW1wbGllcyB7QGxpbmsgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWR9IGlzIGFsc28gdHJ1ZS4KLSAgICAgKgotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Nlc3Npb25NYW5hZ2VtZW50U3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gbVJvdXRlU3VwcG9ydHNTZXNzaW9uTWFuYWdlbWVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIG1lc3NhZ2VzLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgYWxsIG9mIHRoZSBiYXNpYyByZW1vdGUgcGxheWJhY2sKLSAgICAgKiBhY3Rpb25zIGFuZCBhbGwgb2YgdGhlIGZvbGxvd2luZyBhY3Rpb25zOgotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUQVJUX1NFU1NJT04gc3RhcnQgc2Vzc2lvbn0sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU0VORF9NRVNTQUdFIHNlbmQgbWVzc2FnZX0sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5EX1NFU1NJT04gZW5kIHNlc3Npb259LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBzZXNzaW9uIG1hbmFnZW1lbnQgaXMgc3VwcG9ydGVkLgotICAgICAqIEltcGxpZXMge0BsaW5rICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkfSBpcyBhbHNvIHRydWUuCi0gICAgICoKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNNZXNzYWdpbmdTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBtUm91dGVTdXBwb3J0c01lc3NhZ2luZzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHNlc3Npb24gaWQgaWYgdGhlcmUgaXMgb25lLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY3VycmVudCBzZXNzaW9uIGlkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRTZXNzaW9uSWQoKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbklkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGN1cnJlbnQgc2Vzc2lvbiBpZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJdCBpcyB1c3VhbGx5IG5vdCBuZWNlc3NhcnkgdG8gc2V0IHRoZSBzZXNzaW9uIGlkIGV4cGxpY2l0bHkgc2luY2UKLSAgICAgKiBpdCBpcyBjcmVhdGVkIGFzIGEgc2lkZS1lZmZlY3Qgb2Ygb3RoZXIgcmVxdWVzdHMgc3VjaCBhcwotICAgICAqIHtAbGluayAjcGxheX0sIHtAbGluayAjZW5xdWV1ZX0sIGFuZCB7QGxpbmsgI3N0YXJ0U2Vzc2lvbn0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHNlc3Npb25JZCBUaGUgbmV3IHNlc3Npb24gaWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRTZXNzaW9uSWQoU3RyaW5nIHNlc3Npb25JZCkgewotICAgICAgICBpZiAoIU9iamVjdHNDb21wYXQuZXF1YWxzKG1TZXNzaW9uSWQsIHNlc3Npb25JZCkpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlNlc3Npb24gaWQgaXMgbm93OiAiICsgc2Vzc2lvbklkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7Ci0gICAgICAgICAgICBpZiAobVN0YXR1c0NhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU3RhdHVzQ2FsbGJhY2sub25TZXNzaW9uQ2hhbmdlZChzZXNzaW9uSWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjbGllbnQgY3VycmVudGx5IGhhcyBhIHNlc3Npb24uCi0gICAgICogPHA+Ci0gICAgICogRXF1aXZhbGVudCB0byBjaGVja2luZyB3aGV0aGVyIHtAbGluayAjZ2V0U2Vzc2lvbklkfSByZXR1cm5zIGEgbm9uLW51bGwgcmVzdWx0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGVyZSBpcyBhIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNTZXNzaW9uKCkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25JZCAhPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBjYWxsYmFjayB0aGF0IHNob3VsZCByZWNlaXZlIHN0YXR1cyB1cGRhdGVzIHdoZW4gdGhlIHN0YXRlIG9mCi0gICAgICogbWVkaWEgc2Vzc2lvbnMgb3IgbWVkaWEgaXRlbXMgY3JlYXRlZCBieSB0aGlzIGluc3RhbmNlIG9mIHRoZSByZW1vdGUKLSAgICAgKiBwbGF5YmFjayBjbGllbnQgY2hhbmdlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgY2FsbGJhY2sgc2hvdWxkIGJlIHNldCBiZWZvcmUgdGhlIHNlc3Npb24gaXMgY3JlYXRlZCBvciBhbnkgcGxheQotICAgICAqIGNvbW1hbmRzIGFyZSBpc3N1ZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBzZXQuICBNYXkgYmUgbnVsbCB0byByZW1vdmUgdGhlIHByZXZpb3VzIGNhbGxiYWNrLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFN0YXR1c0NhbGxiYWNrKFN0YXR1c0NhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIG1TdGF0dXNDYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgYSBjYWxsYmFjayB0aGF0IHNob3VsZCByZWNlaXZlIG1lc3NhZ2VzIHdoZW4gYSBtZXNzYWdlIGlzIHNlbnQgZnJvbQotICAgICAqIG1lZGlhIHNlc3Npb25zIGNyZWF0ZWQgYnkgdGhpcyBpbnN0YW5jZSBvZiB0aGUgcmVtb3RlIHBsYXliYWNrIGNsaWVudCBjaGFuZ2VzLgotICAgICAqIDxwPgotICAgICAqIFRoZSBjYWxsYmFjayBzaG91bGQgYmUgc2V0IGJlZm9yZSB0aGUgc2Vzc2lvbiBpcyBjcmVhdGVkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUgY2FsbGJhY2sgdG8gc2V0LiAgTWF5IGJlIG51bGwgdG8gcmVtb3ZlIHRoZSBwcmV2aW91cyBjYWxsYmFjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRPbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyKE9uTWVzc2FnZVJlY2VpdmVkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbU9uTWVzc2FnZVJlY2VpdmVkTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gcGxheSBhIG1lZGlhIGl0ZW0uCi0gICAgICogPHA+Ci0gICAgICogQ2xlYXJzIHRoZSBxdWV1ZSBhbmQgc3RhcnRzIHBsYXlpbmcgdGhlIG5ldyBpdGVtIGltbWVkaWF0ZWx5LiAgSWYgdGhlIHF1ZXVlCi0gICAgICogd2FzIHByZXZpb3VzbHkgcGF1c2VkLCB0aGVuIGl0IGlzIHJlc3VtZWQgYXMgYSBzaWRlLWVmZmVjdCBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLiAgSWYgbm8gc2Vzc2lvbiBpcyBhdmFpbGFibGUsIHRoZW4KLSAgICAgKiBvbmUgaXMgY3JlYXRlZCBpbXBsaWNpdGx5LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBBQ1RJT05fUExBWX0gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGVudFVyaSBUaGUgY29udGVudCBVcmkgdG8gcGxheS4KLSAgICAgKiBAcGFyYW0gbWltZVR5cGUgVGhlIG1pbWUgdHlwZSBvZiB0aGUgY29udGVudCwgb3IgbnVsbCBpZiB1bmtub3duLgotICAgICAqIEBwYXJhbSBwb3NpdGlvbk1pbGxpcyBUaGUgaW5pdGlhbCBjb250ZW50IHBvc2l0aW9uIGZvciB0aGUgaXRlbSBpbiBtaWxsaXNlY29uZHMsCi0gICAgICogb3IgPGNvZGU+MDwvY29kZT4gdG8gc3RhcnQgYXQgdGhlIGJlZ2lubmluZy4KLSAgICAgKiBAcGFyYW0gbWV0YWRhdGEgVGhlIG1lZGlhIGl0ZW0gbWV0YWRhdGEgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWX0gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgcmVtb3RlIHBsYXliYWNrLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGxheShVcmkgY29udGVudFVyaSwgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgbWV0YWRhdGEsCi0gICAgICAgICAgICBsb25nIHBvc2l0aW9uTWlsbGlzLCBCdW5kbGUgZXh0cmFzLCBJdGVtQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgcGxheU9yRW5xdWV1ZShjb250ZW50VXJpLCBtaW1lVHlwZSwgbWV0YWRhdGEsIHBvc2l0aW9uTWlsbGlzLAotICAgICAgICAgICAgICAgIGV4dHJhcywgY2FsbGJhY2ssIE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUExBWSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIGVucXVldWUgYSBtZWRpYSBpdGVtLgotICAgICAqIDxwPgotICAgICAqIEVucXVldWVzIGEgbmV3IGl0ZW0gdG8gcGxheS4gIElmIHRoZSBxdWV1ZSB3YXMgcHJldmlvdXNseSBwYXVzZWQsIHRoZW4gd2lsbAotICAgICAqIHJlbWFpbiBwYXVzZWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLiAgSWYgbm8gc2Vzc2lvbiBpcyBhdmFpbGFibGUsIHRoZW4KLSAgICAgKiBvbmUgaXMgY3JlYXRlZCBpbXBsaWNpdGx5LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5RVUVVRSBBQ1RJT05fRU5RVUVVRX0gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY29udGVudFVyaSBUaGUgY29udGVudCBVcmkgdG8gZW5xdWV1ZS4KLSAgICAgKiBAcGFyYW0gbWltZVR5cGUgVGhlIG1pbWUgdHlwZSBvZiB0aGUgY29udGVudCwgb3IgbnVsbCBpZiB1bmtub3duLgotICAgICAqIEBwYXJhbSBwb3NpdGlvbk1pbGxpcyBUaGUgaW5pdGlhbCBjb250ZW50IHBvc2l0aW9uIGZvciB0aGUgaXRlbSBpbiBtaWxsaXNlY29uZHMsCi0gICAgICogb3IgPGNvZGU+MDwvY29kZT4gdG8gc3RhcnQgYXQgdGhlIGJlZ2lubmluZy4KLSAgICAgKiBAcGFyYW0gbWV0YWRhdGEgVGhlIG1lZGlhIGl0ZW0gbWV0YWRhdGEgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5RVUVVRX0gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgcXVldWluZy4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqIEBzZWUgI2lzUXVldWluZ1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGVucXVldWUoVXJpIGNvbnRlbnRVcmksIFN0cmluZyBtaW1lVHlwZSwgQnVuZGxlIG1ldGFkYXRhLAotICAgICAgICAgICAgbG9uZyBwb3NpdGlvbk1pbGxpcywgQnVuZGxlIGV4dHJhcywgSXRlbUFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHBsYXlPckVucXVldWUoY29udGVudFVyaSwgbWltZVR5cGUsIG1ldGFkYXRhLCBwb3NpdGlvbk1pbGxpcywKLSAgICAgICAgICAgICAgICBleHRyYXMsIGNhbGxiYWNrLCBNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0VOUVVFVUUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwbGF5T3JFbnF1ZXVlKFVyaSBjb250ZW50VXJpLCBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBtZXRhZGF0YSwKLSAgICAgICAgICAgIGxvbmcgcG9zaXRpb25NaWxsaXMsIEJ1bmRsZSBleHRyYXMsCi0gICAgICAgICAgICBmaW5hbCBJdGVtQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2ssIFN0cmluZyBhY3Rpb24pIHsKLSAgICAgICAgaWYgKGNvbnRlbnRVcmkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udGVudFVyaSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3dJZlJlbW90ZVBsYXliYWNrTm90U3VwcG9ydGVkKCk7Ci0gICAgICAgIGlmIChhY3Rpb24uZXF1YWxzKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fRU5RVUVVRSkpIHsKLSAgICAgICAgICAgIHRocm93SWZRdWV1aW5nTm90U3VwcG9ydGVkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChhY3Rpb24pOwotICAgICAgICBpbnRlbnQuc2V0RGF0YUFuZFR5cGUoY29udGVudFVyaSwgbWltZVR5cGUpOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUiwKLSAgICAgICAgICAgICAgICBtSXRlbVN0YXR1c1BlbmRpbmdJbnRlbnQpOwotICAgICAgICBpZiAobWV0YWRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX01FVEFEQVRBLCBtZXRhZGF0YSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBvc2l0aW9uTWlsbGlzICE9IDApIHsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9DT05URU5UX1BPU0lUSU9OLCBwb3NpdGlvbk1pbGxpcyk7Ci0gICAgICAgIH0KLSAgICAgICAgcGVyZm9ybUl0ZW1BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBudWxsLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gc2VlayB0byBhIG5ldyBwb3NpdGlvbiBpbiBhIG1lZGlhIGl0ZW0uCi0gICAgICogPHA+Ci0gICAgICogU2Vla3MgdG8gYSBuZXcgcG9zaXRpb24uICBJZiB0aGUgcXVldWUgd2FzIHByZXZpb3VzbHkgcGF1c2VkIHRoZW4gaXQKLSAgICAgKiByZW1haW5zIHBhdXNlZCBidXQgdGhlIGl0ZW0ncyBuZXcgcG9zaXRpb24gaXMgc3RpbGwgcmVtZW1iZXJlZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TRUVLIEFDVElPTl9TRUVLfSBmb3IKLSAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpdGVtSWQgVGhlIGl0ZW0gaWQuCi0gICAgICogQHBhcmFtIHBvc2l0aW9uTWlsbGlzIFRoZSBuZXcgY29udGVudCBwb3NpdGlvbiBmb3IgdGhlIGl0ZW0gaW4gbWlsbGlzZWNvbmRzLAotICAgICAqIG9yIDxjb2RlPjA8L2NvZGU+IHRvIHN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcuCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU0VFS30gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TRUVLCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlZWsoU3RyaW5nIGl0ZW1JZCwgbG9uZyBwb3NpdGlvbk1pbGxpcywgQnVuZGxlIGV4dHJhcywKLSAgICAgICAgICAgIEl0ZW1BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpZiAoaXRlbUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW1JZCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1NFRUspOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fQ09OVEVOVF9QT1NJVElPTiwgcG9zaXRpb25NaWxsaXMpOwotICAgICAgICBwZXJmb3JtSXRlbUFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGl0ZW1JZCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIGdldCB0aGUgc3RhdHVzIG9mIGEgbWVkaWEgaXRlbS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TVEFUVVMgQUNUSU9OX0dFVF9TVEFUVVN9IGZvcgotICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZW1JZCBUaGUgaXRlbSBpZC4KLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9HRVRfU1RBVFVTfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TVEFUVVMKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2V0U3RhdHVzKFN0cmluZyBpdGVtSWQsIEJ1bmRsZSBleHRyYXMsIEl0ZW1BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpZiAoaXRlbUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW1JZCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0dFVF9TVEFUVVMpOwotICAgICAgICBwZXJmb3JtSXRlbUFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGl0ZW1JZCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIHJlbW92ZSBhIG1lZGlhIGl0ZW0gZnJvbSB0aGUgcXVldWUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRU1PVkUgQUNUSU9OX1JFTU9WRX0gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlbUlkIFRoZSBpdGVtIGlkLgotICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFTU9WRX0gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHF1ZXVpbmcuCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVNT1ZFCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqIEBzZWUgI2lzUXVldWluZ1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZShTdHJpbmcgaXRlbUlkLCBCdW5kbGUgZXh0cmFzLCBJdGVtQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgaWYgKGl0ZW1JZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtSWQgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHRocm93SWZRdWV1aW5nTm90U3VwcG9ydGVkKCk7Ci0gICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9SRU1PVkUpOwotICAgICAgICBwZXJmb3JtSXRlbUFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGl0ZW1JZCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIHBhdXNlIG1lZGlhIHBsYXliYWNrLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLiAgSWYgcGxheWJhY2sgaXMgYWxyZWFkeSBwYXVzZWQKLSAgICAgKiB0aGVuIHRoZSByZXF1ZXN0IGhhcyBubyBlZmZlY3QuCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QQVVTRSBBQ1RJT05fUEFVU0V9IGZvcgotICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUEFVU0V9IGludGVudCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCi0gICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUEFVU0UKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcGF1c2UoQnVuZGxlIGV4dHJhcywgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QQVVTRSk7Ci0gICAgICAgIHBlcmZvcm1TZXNzaW9uQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIHJlc3VtZSAodW5wYXVzZSkgbWVkaWEgcGxheWJhY2suCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiBwbGF5YmFjayBpcyBub3QgcGF1c2VkCi0gICAgICogdGhlbiB0aGUgcmVxdWVzdCBoYXMgbm8gZWZmZWN0LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVTVU1FIEFDVElPTl9SRVNVTUV9IGZvcgotICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVTVU1FfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFU1VNRQotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZXN1bWUoQnVuZGxlIGV4dHJhcywgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9SRVNVTUUpOwotICAgICAgICBwZXJmb3JtU2Vzc2lvbkFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGV4dHJhcywgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBzdG9wIG1lZGlhIHBsYXliYWNrIGFuZCBjbGVhciB0aGUgbWVkaWEgcGxheWJhY2sgcXVldWUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiB0aGUgcXVldWUgaXMgYWxyZWFkeQotICAgICAqIGVtcHR5IHRoZW4gdGhlIHJlcXVlc3QgaGFzIG5vIGVmZmVjdC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUT1AgQUNUSU9OX1NUT1B9IGZvcgotICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RPUH0gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVE9QCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0b3AoQnVuZGxlIGV4dHJhcywgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TVE9QKTsKLSAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gc3RhcnQgYSBuZXcgbWVkaWEgcGxheWJhY2sgc2Vzc2lvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgYXBwbGljYXRpb24gbXVzdCB3YWl0IGZvciB0aGUgY2FsbGJhY2sgdG8gaW5kaWNhdGUgdGhhdCB0aGlzIHJlcXVlc3QKLSAgICAgKiBpcyBjb21wbGV0ZSBiZWZvcmUgaXNzdWluZyBvdGhlciByZXF1ZXN0cyB0aGF0IGFmZmVjdCB0aGUgc2Vzc2lvbi4gIElmIHRoaXMKLSAgICAgKiByZXF1ZXN0IGlzIHN1Y2Nlc3NmdWwgdGhlbiB0aGUgcHJldmlvdXMgc2Vzc2lvbiB3aWxsIGJlIGludmFsaWRhdGVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RBUlRfU0VTU0lPTiBBQ1RJT05fU1RBUlRfU0VTU0lPTn0KLSAgICAgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVEFSVF9TRVNTSU9OfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBzZXNzaW9uIG1hbmFnZW1lbnQuCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RBUlRfU0VTU0lPTgotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKiBAc2VlICNpc1Nlc3Npb25NYW5hZ2VtZW50U3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RhcnRTZXNzaW9uKEJ1bmRsZSBleHRyYXMsIFNlc3Npb25BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICB0aHJvd0lmU2Vzc2lvbk1hbmFnZW1lbnROb3RTdXBwb3J0ZWQoKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1NUQVJUX1NFU1NJT04pOwotICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUiwKLSAgICAgICAgICAgICAgICBtU2Vzc2lvblN0YXR1c1BlbmRpbmdJbnRlbnQpOwotICAgICAgICBpZiAobVJvdXRlU3VwcG9ydHNNZXNzYWdpbmcpIHsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfTUVTU0FHRV9SRUNFSVZFUiwgbU1lc3NhZ2VQZW5kaW5nSW50ZW50KTsKLSAgICAgICAgfQotICAgICAgICBwZXJmb3JtU2Vzc2lvbkFjdGlvbihpbnRlbnQsIG51bGwsIGV4dHJhcywgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgbWVzc2FnZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NFTkRfTUVTU0FHRX0gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVzc2FnZSBBIGJ1bmRsZSBtZXNzYWdlIGRlbm90aW5nIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjRVhUUkFfTUVTU0FHRX0uCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4gcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBtZXNzYWdlcy4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TRU5EX01FU1NBR0UKLSAgICAgKiBAc2VlICNpc01lc3NhZ2luZ1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbmRNZXNzYWdlKEJ1bmRsZSBtZXNzYWdlLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLSAgICAgICAgdGhyb3dJZk1lc3NhZ2VOb3RTdXBwb3J0ZWQoKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1NFTkRfTUVTU0FHRSk7Ci0gICAgICAgIHBlcmZvcm1TZXNzaW9uQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgbWVzc2FnZSwgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBnZXQgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgcGxheWJhY2sgc2Vzc2lvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUwotICAgICAqIEFDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVN9IGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVU30gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHNlc3Npb24gbWFuYWdlbWVudC4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICogQHNlZSAjaXNTZXNzaW9uTWFuYWdlbWVudFN1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGdldFNlc3Npb25TdGF0dXMoQnVuZGxlIGV4dHJhcywgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHRocm93SWZTZXNzaW9uTWFuYWdlbWVudE5vdFN1cHBvcnRlZCgpOwotICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTKTsKLSAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gZW5kIHRoZSBtZWRpYSBwbGF5YmFjayBzZXNzaW9uLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLiAgSWYgdGhpcyByZXF1ZXN0IGlzIHN1Y2Nlc3NmdWwsCi0gICAgICogdGhlIHtAbGluayAjZ2V0U2Vzc2lvbklkIHNlc3Npb24gaWQgcHJvcGVydHl9IHdpbGwgYmUgc2V0IHRvIG51bGwgYWZ0ZXIKLSAgICAgKiB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VORF9TRVNTSU9OIEFDVElPTl9FTkRfU0VTU0lPTn0KLSAgICAgKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTkRfU0VTU0lPTn0gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHNlc3Npb24gbWFuYWdlbWVudC4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTkRfU0VTU0lPTgotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKiBAc2VlICNpc1Nlc3Npb25NYW5hZ2VtZW50U3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5kU2Vzc2lvbihCdW5kbGUgZXh0cmFzLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgdGhyb3dJZlNlc3Npb25NYW5hZ2VtZW50Tm90U3VwcG9ydGVkKCk7Ci0gICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9FTkRfU0VTU0lPTik7Ci0gICAgICAgIHBlcmZvcm1TZXNzaW9uQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBlcmZvcm1JdGVtQWN0aW9uKGZpbmFsIEludGVudCBpbnRlbnQsCi0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgc2Vzc2lvbklkLCBmaW5hbCBTdHJpbmcgaXRlbUlkLAotICAgICAgICAgICAgQnVuZGxlIGV4dHJhcywgZmluYWwgSXRlbUFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGludGVudC5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKTsKLSAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fSUQsIHNlc3Npb25JZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGl0ZW1JZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fSUQsIGl0ZW1JZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV4dHJhcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmFzKGV4dHJhcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nUmVxdWVzdChpbnRlbnQpOwotICAgICAgICBtUm91dGUuc2VuZENvbnRyb2xSZXF1ZXN0KGludGVudCwgbmV3IE1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkUmVzdWx0ID0gaW5mZXJNaXNzaW5nUmVzdWx0KHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdldFN0cmluZyhNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9JRCkpOwotICAgICAgICAgICAgICAgICAgICBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cyA9IE1lZGlhU2Vzc2lvblN0YXR1cy5mcm9tQnVuZGxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0QnVuZGxlKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX1NUQVRVUykpOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkUmVzdWx0ID0gaW5mZXJNaXNzaW5nUmVzdWx0KGl0ZW1JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdldFN0cmluZyhNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9JRCkpOwotICAgICAgICAgICAgICAgICAgICBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cyA9IE1lZGlhSXRlbVN0YXR1cy5mcm9tQnVuZGxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0QnVuZGxlKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX1NUQVRVUykpOwotICAgICAgICAgICAgICAgICAgICBhZG9wdFNlc3Npb24oc2Vzc2lvbklkUmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb25JZFJlc3VsdCAhPSBudWxsICYmIGl0ZW1JZFJlc3VsdCAhPSBudWxsICYmIGl0ZW1TdGF0dXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVjZWl2ZWQgcmVzdWx0IGZyb20gIiArIGludGVudC5nZXRBY3Rpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiBkYXRhPSIgKyBidW5kbGVUb1N0cmluZyhkYXRhKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzZXNzaW9uSWQ9IiArIHNlc3Npb25JZFJlc3VsdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzZXNzaW9uU3RhdHVzPSIgKyBzZXNzaW9uU3RhdHVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGl0ZW1JZD0iICsgaXRlbUlkUmVzdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGl0ZW1TdGF0dXM9IiArIGl0ZW1TdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25SZXN1bHQoZGF0YSwgc2Vzc2lvbklkUmVzdWx0LCBzZXNzaW9uU3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtSWRSZXN1bHQsIGl0ZW1TdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGhhbmRsZUludmFsaWRSZXN1bHQoaW50ZW50LCBjYWxsYmFjaywgZGF0YSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihTdHJpbmcgZXJyb3IsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoaW50ZW50LCBjYWxsYmFjaywgZXJyb3IsIGRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGVyZm9ybVNlc3Npb25BY3Rpb24oZmluYWwgSW50ZW50IGludGVudCwgZmluYWwgU3RyaW5nIHNlc3Npb25JZCwKLSAgICAgICAgICAgIEJ1bmRsZSBleHRyYXMsIGZpbmFsIFNlc3Npb25BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpbnRlbnQuYWRkQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyk7Ci0gICAgICAgIGlmIChzZXNzaW9uSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX0lELCBzZXNzaW9uSWQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChleHRyYXMgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhcyhleHRyYXMpOwotICAgICAgICB9Ci0gICAgICAgIGxvZ1JlcXVlc3QoaW50ZW50KTsKLSAgICAgICAgbVJvdXRlLnNlbmRDb250cm9sUmVxdWVzdChpbnRlbnQsIG5ldyBNZWRpYVJvdXRlci5Db250cm9sUmVxdWVzdENhbGxiYWNrKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZFJlc3VsdCA9IGluZmVyTWlzc2luZ1Jlc3VsdChzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXRTdHJpbmcoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fSUQpKTsKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMgPSBNZWRpYVNlc3Npb25TdGF0dXMuZnJvbUJ1bmRsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdldEJ1bmRsZShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9TVEFUVVMpKTsKLSAgICAgICAgICAgICAgICAgICAgYWRvcHRTZXNzaW9uKHNlc3Npb25JZFJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uSWRSZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVjZWl2ZWQgcmVzdWx0IGZyb20gIiArIGludGVudC5nZXRBY3Rpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiOiBkYXRhPSIgKyBidW5kbGVUb1N0cmluZyhkYXRhKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzZXNzaW9uSWQ9IiArIHNlc3Npb25JZFJlc3VsdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzZXNzaW9uU3RhdHVzPSIgKyBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25SZXN1bHQoZGF0YSwgc2Vzc2lvbklkUmVzdWx0LCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9FTkRfU0VTU0lPTikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHNlc3Npb25JZFJlc3VsdC5lcXVhbHMobVNlc3Npb25JZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U2Vzc2lvbklkKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBoYW5kbGVJbnZhbGlkUmVzdWx0KGludGVudCwgY2FsbGJhY2ssIGRhdGEpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU3RyaW5nIGVycm9yLCBCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKGludGVudCwgY2FsbGJhY2ssIGVycm9yLCBkYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBhZG9wdFNlc3Npb24oU3RyaW5nIHNlc3Npb25JZCkgewotICAgICAgICBpZiAoc2Vzc2lvbklkICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNldFNlc3Npb25JZChzZXNzaW9uSWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBoYW5kbGVJbnZhbGlkUmVzdWx0KEludGVudCBpbnRlbnQsIEFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgTG9nLncoVEFHLCAiUmVjZWl2ZWQgaW52YWxpZCByZXN1bHQgZGF0YSBmcm9tICIgKyBpbnRlbnQuZ2V0QWN0aW9uKCkKLSAgICAgICAgICAgICAgICArICI6IGRhdGE9IiArIGJ1bmRsZVRvU3RyaW5nKGRhdGEpKTsKLSAgICAgICAgY2FsbGJhY2sub25FcnJvcihudWxsLCBNZWRpYUNvbnRyb2xJbnRlbnQuRVJST1JfVU5LTk9XTiwgZGF0YSk7Ci0gICAgfQotCi0gICAgdm9pZCBoYW5kbGVFcnJvcihJbnRlbnQgaW50ZW50LCBBY3Rpb25DYWxsYmFjayBjYWxsYmFjaywKLSAgICAgICAgICAgIFN0cmluZyBlcnJvciwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgZmluYWwgaW50IGNvZGU7Ci0gICAgICAgIGlmIChkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvZGUgPSBkYXRhLmdldEludChNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfRVJST1JfQ09ERSwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sSW50ZW50LkVSUk9SX1VOS05PV04pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29kZSA9IE1lZGlhQ29udHJvbEludGVudC5FUlJPUl9VTktOT1dOOwotICAgICAgICB9Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiUmVjZWl2ZWQgZXJyb3IgZnJvbSAiICsgaW50ZW50LmdldEFjdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICsgIjogZXJyb3I9IiArIGVycm9yCi0gICAgICAgICAgICAgICAgICAgICsgIiwgY29kZT0iICsgY29kZQotICAgICAgICAgICAgICAgICAgICArICIsIGRhdGE9IiArIGJ1bmRsZVRvU3RyaW5nKGRhdGEpKTsKLSAgICAgICAgfQotICAgICAgICBjYWxsYmFjay5vbkVycm9yKGVycm9yLCBjb2RlLCBkYXRhKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZGV0ZWN0RmVhdHVyZXMoKSB7Ci0gICAgICAgIG1Sb3V0ZVN1cHBvcnRzUmVtb3RlUGxheWJhY2sgPSByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUExBWSkKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU0VFSykKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fR0VUX1NUQVRVUykKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUEFVU0UpCi0gICAgICAgICAgICAgICAgJiYgcm91dGVTdXBwb3J0c0FjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1JFU1VNRSkKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU1RPUCk7Ci0gICAgICAgIG1Sb3V0ZVN1cHBvcnRzUXVldWluZyA9IG1Sb3V0ZVN1cHBvcnRzUmVtb3RlUGxheWJhY2sKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fRU5RVUVVRSkKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUkVNT1ZFKTsKLSAgICAgICAgbVJvdXRlU3VwcG9ydHNTZXNzaW9uTWFuYWdlbWVudCA9IG1Sb3V0ZVN1cHBvcnRzUmVtb3RlUGxheWJhY2sKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU1RBUlRfU0VTU0lPTikKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9FTkRfU0VTU0lPTik7Ci0gICAgICAgIG1Sb3V0ZVN1cHBvcnRzTWVzc2FnaW5nID0gZG9lc1JvdXRlU3VwcG9ydE1lc3NhZ2luZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiByb3V0ZVN1cHBvcnRzQWN0aW9uKFN0cmluZyBhY3Rpb24pIHsKLSAgICAgICAgcmV0dXJuIG1Sb3V0ZS5zdXBwb3J0c0NvbnRyb2xBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSywgYWN0aW9uKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gZG9lc1JvdXRlU3VwcG9ydE1lc3NhZ2luZygpIHsKLSAgICAgICAgZm9yIChJbnRlbnRGaWx0ZXIgZmlsdGVyIDogbVJvdXRlLmdldENvbnRyb2xGaWx0ZXJzKCkpIHsKLSAgICAgICAgICAgIGlmIChmaWx0ZXIuaGFzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU0VORF9NRVNTQUdFKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGhyb3dJZlJlbW90ZVBsYXliYWNrTm90U3VwcG9ydGVkKCkgewotICAgICAgICBpZiAoIW1Sb3V0ZVN1cHBvcnRzUmVtb3RlUGxheWJhY2spIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgcmVtb3RlIHBsYXliYWNrLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRocm93SWZRdWV1aW5nTm90U3VwcG9ydGVkKCkgewotICAgICAgICBpZiAoIW1Sb3V0ZVN1cHBvcnRzUXVldWluZykgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBxdWV1aW5nLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRocm93SWZTZXNzaW9uTWFuYWdlbWVudE5vdFN1cHBvcnRlZCgpIHsKLSAgICAgICAgaWYgKCFtUm91dGVTdXBwb3J0c1Nlc3Npb25NYW5hZ2VtZW50KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0ICIKLSAgICAgICAgICAgICAgICAgICAgKyAic2Vzc2lvbiBtYW5hZ2VtZW50LiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRocm93SWZNZXNzYWdlTm90U3VwcG9ydGVkKCkgewotICAgICAgICBpZiAoIW1Sb3V0ZVN1cHBvcnRzTWVzc2FnaW5nKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IG1lc3NhZ2UuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKSB7Ci0gICAgICAgIGlmIChtU2Vzc2lvbklkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgaW5mZXJNaXNzaW5nUmVzdWx0KFN0cmluZyByZXF1ZXN0LCBTdHJpbmcgcmVzdWx0KSB7Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gUmVzdWx0IGlzIG1pc3NpbmcuCi0gICAgICAgICAgICByZXR1cm4gcmVxdWVzdDsKLSAgICAgICAgfQotICAgICAgICBpZiAocmVxdWVzdCA9PSBudWxsIHx8IHJlcXVlc3QuZXF1YWxzKHJlc3VsdCkpIHsKLSAgICAgICAgICAgIC8vIFJlcXVlc3QgZGlkbid0IHNwZWNpZnkgYSB2YWx1ZSBvciByZXN1bHQgbWF0Y2hlcyByZXF1ZXN0LgotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICAvLyBSZXN1bHQgY29uZmxpY3RzIHdpdGggcmVxdWVzdC4KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBsb2dSZXF1ZXN0KEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJTZW5kaW5nIHJlcXVlc3Q6ICIgKyBpbnRlbnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBidW5kbGVUb1N0cmluZyhCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIGlmIChidW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVuZGxlLnNpemUoKTsgLy8gZm9yY2UgYnVuZGxlIHRvIGJlIHVucGFyY2VsbGVkCi0gICAgICAgICAgICByZXR1cm4gYnVuZGxlLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICJudWxsIjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIEFjdGlvblJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgewotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fSVRFTV9TVEFUVVNfQ0hBTkdFRCA9Ci0gICAgICAgICAgICAgICAgImFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5hY3Rpb25zLkFDVElPTl9JVEVNX1NUQVRVU19DSEFOR0VEIjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NFU1NJT05fU1RBVFVTX0NIQU5HRUQgPQotICAgICAgICAgICAgICAgICJhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuYWN0aW9ucy5BQ1RJT05fU0VTU0lPTl9TVEFUVVNfQ0hBTkdFRCI7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9NRVNTQUdFX1JFQ0VJVkVEID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLmFjdGlvbnMuQUNUSU9OX01FU1NBR0VfUkVDRUlWRUQiOwotCi0gICAgICAgIEFjdGlvblJlY2VpdmVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVjZWl2ZShDb250ZXh0IGNvbnRleHQsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fSUQpOwotICAgICAgICAgICAgaWYgKHNlc3Npb25JZCA9PSBudWxsIHx8ICFzZXNzaW9uSWQuZXF1YWxzKG1TZXNzaW9uSWQpKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRGlzY2FyZGluZyBzcHVyaW91cyBzdGF0dXMgY2FsbGJhY2sgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAid2l0aCBtaXNzaW5nIG9yIGludmFsaWQgc2Vzc2lvbiBpZDogc2Vzc2lvbklkPSIgKyBzZXNzaW9uSWQpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMgPSBNZWRpYVNlc3Npb25TdGF0dXMuZnJvbUJ1bmRsZSgKLSAgICAgICAgICAgICAgICAgICAgaW50ZW50LmdldEJ1bmRsZUV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX1NUQVRVUykpOwotICAgICAgICAgICAgU3RyaW5nIGFjdGlvbiA9IGludGVudC5nZXRBY3Rpb24oKTsKLSAgICAgICAgICAgIGlmIChhY3Rpb24uZXF1YWxzKEFDVElPTl9JVEVNX1NUQVRVU19DSEFOR0VEKSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBpdGVtSWQgPSBpbnRlbnQuZ2V0U3RyaW5nRXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fSUQpOwotICAgICAgICAgICAgICAgIGlmIChpdGVtSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJEaXNjYXJkaW5nIHNwdXJpb3VzIHN0YXR1cyBjYWxsYmFjayB3aXRoIG1pc3NpbmcgaXRlbSBpZC4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzID0gTWVkaWFJdGVtU3RhdHVzLmZyb21CdW5kbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0QnVuZGxlRXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fU1RBVFVTKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW1TdGF0dXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJEaXNjYXJkaW5nIHNwdXJpb3VzIHN0YXR1cyBjYWxsYmFjayB3aXRoIG1pc3NpbmcgaXRlbSBzdGF0dXMuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVjZWl2ZWQgaXRlbSBzdGF0dXMgY2FsbGJhY2s6IHNlc3Npb25JZD0iICsgc2Vzc2lvbklkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzZXNzaW9uU3RhdHVzPSIgKyBzZXNzaW9uU3RhdHVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBpdGVtSWQ9IiArIGl0ZW1JZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaXRlbVN0YXR1cz0iICsgaXRlbVN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1TdGF0dXNDYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0dXNDYWxsYmFjay5vbkl0ZW1TdGF0dXNDaGFuZ2VkKGludGVudC5nZXRFeHRyYXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMsIGl0ZW1JZCwgaXRlbVN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEFDVElPTl9TRVNTSU9OX1NUQVRVU19DSEFOR0VEKSkgewotICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uU3RhdHVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRGlzY2FyZGluZyBzcHVyaW91cyBtZWRpYSBzdGF0dXMgY2FsbGJhY2sgd2l0aCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyJtaXNzaW5nIHNlc3Npb24gc3RhdHVzLiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJlY2VpdmVkIHNlc3Npb24gc3RhdHVzIGNhbGxiYWNrOiBzZXNzaW9uSWQ9IiArIHNlc3Npb25JZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgc2Vzc2lvblN0YXR1cz0iICsgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1TdGF0dXNDYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0dXNDYWxsYmFjay5vblNlc3Npb25TdGF0dXNDaGFuZ2VkKGludGVudC5nZXRFeHRyYXMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uLmVxdWFscyhBQ1RJT05fTUVTU0FHRV9SRUNFSVZFRCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVjZWl2ZWQgbWVzc2FnZSBjYWxsYmFjazogc2Vzc2lvbklkPSIgKyBzZXNzaW9uSWQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtT25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Pbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyLm9uTWVzc2FnZVJlY2VpdmVkKHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0QnVuZGxlRXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX01FU1NBR0UpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIGNhbGxiYWNrIHRoYXQgd2lsbCByZWNlaXZlIG1lZGlhIHN0YXR1cyB1cGRhdGVzLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgU3RhdHVzQ2FsbGJhY2sgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHN0YXR1cyBvZiBhIG1lZGlhIGl0ZW0gY2hhbmdlcy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGRhdGEgVGhlIHJlc3VsdCBkYXRhIGJ1bmRsZS4KLSAgICAgICAgICogQHBhcmFtIHNlc3Npb25JZCBUaGUgc2Vzc2lvbiBpZC4KLSAgICAgICAgICogQHBhcmFtIHNlc3Npb25TdGF0dXMgVGhlIHNlc3Npb24gc3RhdHVzLCBvciBudWxsIGlmIHVua25vd24uCi0gICAgICAgICAqIEBwYXJhbSBpdGVtSWQgVGhlIGl0ZW0gaWQuCi0gICAgICAgICAqIEBwYXJhbSBpdGVtU3RhdHVzIFRoZSBpdGVtIHN0YXR1cy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uSXRlbVN0YXR1c0NoYW5nZWQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMsCi0gICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgc3RhdHVzIG9mIGEgbWVkaWEgc2Vzc2lvbiBjaGFuZ2VzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgcmVzdWx0IGRhdGEgYnVuZGxlLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFRoZSBzZXNzaW9uIGlkLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvblN0YXR1cyBUaGUgc2Vzc2lvbiBzdGF0dXMsIG9yIG51bGwgaWYgdW5rbm93bi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2Vzc2lvblN0YXR1c0NoYW5nZWQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgc2Vzc2lvbiBvZiB0aGUgcmVtb3RlIHBsYXliYWNrIGNsaWVudCBjaGFuZ2VzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFRoZSBuZXcgc2Vzc2lvbiBpZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2Vzc2lvbkNoYW5nZWQoU3RyaW5nIHNlc3Npb25JZCkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQmFzZSBjYWxsYmFjayB0eXBlIGZvciByZW1vdGUgcGxheWJhY2sgcmVxdWVzdHMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBBY3Rpb25DYWxsYmFjayB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIGNvbnRyb2wgcmVxdWVzdCBmYWlscy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGVycm9yIEEgbG9jYWxpemVkIGVycm9yIG1lc3NhZ2Ugd2hpY2ggbWF5IGJlIHNob3duIHRvIHRoZSB1c2VyLCBvciBudWxsCi0gICAgICAgICAqIGlmIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IgaXMgdW5jbGVhci4KLSAgICAgICAgICogQHBhcmFtIGNvZGUgVGhlIGVycm9yIGNvZGUsIG9yIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjRVJST1JfVU5LTk9XTn0gaWYgdW5rbm93bi4KLSAgICAgICAgICogQHBhcmFtIGRhdGEgVGhlIGVycm9yIGRhdGEgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKFN0cmluZyBlcnJvciwgaW50IGNvZGUsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsYmFjayBmb3IgcmVtb3RlIHBsYXliYWNrIHJlcXVlc3RzIHRoYXQgb3BlcmF0ZSBvbiBpdGVtcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEl0ZW1BY3Rpb25DYWxsYmFjayBleHRlbmRzIEFjdGlvbkNhbGxiYWNrIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSByZXF1ZXN0IHN1Y2NlZWRzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgcmVzdWx0IGRhdGEgYnVuZGxlLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFRoZSBzZXNzaW9uIGlkLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvblN0YXR1cyBUaGUgc2Vzc2lvbiBzdGF0dXMsIG9yIG51bGwgaWYgdW5rbm93bi4KLSAgICAgICAgICogQHBhcmFtIGl0ZW1JZCBUaGUgaXRlbSBpZC4KLSAgICAgICAgICogQHBhcmFtIGl0ZW1TdGF0dXMgVGhlIGl0ZW0gc3RhdHVzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzLAotICAgICAgICAgICAgICAgIFN0cmluZyBpdGVtSWQsIE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsYmFjayBmb3IgcmVtb3RlIHBsYXliYWNrIHJlcXVlc3RzIHRoYXQgb3BlcmF0ZSBvbiBzZXNzaW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIFNlc3Npb25BY3Rpb25DYWxsYmFjayBleHRlbmRzIEFjdGlvbkNhbGxiYWNrIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSByZXF1ZXN0IHN1Y2NlZWRzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgcmVzdWx0IGRhdGEgYnVuZGxlLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFRoZSBzZXNzaW9uIGlkLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvblN0YXR1cyBUaGUgc2Vzc2lvbiBzdGF0dXMsIG9yIG51bGwgaWYgdW5rbm93bi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLCBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBjYWxsYmFjayB0aGF0IHdpbGwgcmVjZWl2ZSBtZXNzYWdlcyBmcm9tIG1lZGlhIHNlc3Npb25zLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgT25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lc3NhZ2UgcmVjZWl2ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIHNlc3Npb24gaWQuCi0gICAgICAgICAqIEBwYXJhbSBtZXNzYWdlIEEgYnVuZGxlIG1lc3NhZ2UgZGVub3Rpbmcge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNFWFRSQV9NRVNTQUdFfS4KLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoU3RyaW5nIHNlc3Npb25JZCwgQnVuZGxlIG1lc3NhZ2UpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9TeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9TeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM4NDkxZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLlJlcXVpcmVzQXBpOwotaW1wb3J0IGFuZHJvaWQudmlldy5EaXNwbGF5OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotLyoqCi0gKiBQcm92aWRlcyByb3V0ZXMgZm9yIGJ1aWx0LWluIHN5c3RlbSBkZXN0aW5hdGlvbnMgc3VjaCBhcyB0aGUgbG9jYWwgZGlzcGxheQotICogYW5kIHNwZWFrZXIuICBPbiBKZWxseWJlYW4gYW5kIG5ld2VyIHBsYXRmb3JtIHJlbGVhc2VzLCBxdWVyaWVzIHRoZSBmcmFtZXdvcmsKLSAqIE1lZGlhUm91dGVyIGZvciBmcmFtZXdvcmstcHJvdmlkZWQgcm91dGVzIGFuZCByZWdpc3RlcnMgbm9uLWZyYW1ld29yay1wcm92aWRlZAotICogcm91dGVzIGFzIHVzZXIgcm91dGVzLgotICovCi1hYnN0cmFjdCBjbGFzcyBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIgZXh0ZW5kcyBNZWRpYVJvdXRlUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyIjsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFBBQ0tBR0VfTkFNRSA9ICJhbmRyb2lkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBERUZBVUxUX1JPVVRFX0lEID0gIkRFRkFVTFRfUk9VVEUiOwotCi0gICAgcHJvdGVjdGVkIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgbmV3IFByb3ZpZGVyTWV0YWRhdGEobmV3IENvbXBvbmVudE5hbWUoUEFDS0FHRV9OQU1FLAotICAgICAgICAgICAgICAgIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlci5jbGFzcy5nZXROYW1lKCkpKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIgb2J0YWluKENvbnRleHQgY29udGV4dCwgU3luY0NhbGxiYWNrIHN5bmNDYWxsYmFjaykgewotICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IDI0KSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEFwaTI0SW1wbChjb250ZXh0LCBzeW5jQ2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMTgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSmVsbHliZWFuTXIySW1wbChjb250ZXh0LCBzeW5jQ2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMTcpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSmVsbHliZWFuTXIxSW1wbChjb250ZXh0LCBzeW5jQ2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMTYpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSmVsbHliZWFuSW1wbChjb250ZXh0LCBzeW5jQ2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTGVnYWN5SW1wbChjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgdGhlIG1lZGlhIHJvdXRlciB3aGVuIGEgcm91dGUgaXMgYWRkZWQgdG8gc3luY2hyb25pemUgc3RhdGUgd2l0aAotICAgICAqIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlQWRkZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgd2hlbiBhIHJvdXRlIGlzIHJlbW92ZWQgdG8gc3luY2hyb25pemUgc3RhdGUgd2l0aAotICAgICAqIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlUmVtb3ZlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgdGhlIG1lZGlhIHJvdXRlciB3aGVuIGEgcm91dGUgaXMgY2hhbmdlZCB0byBzeW5jaHJvbml6ZSBzdGF0ZSB3aXRoCi0gICAgICogdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TeW5jUm91dGVDaGFuZ2VkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHdoZW4gYSByb3V0ZSBpcyBzZWxlY3RlZCB0byBzeW5jaHJvbml6ZSBzdGF0ZSB3aXRoCi0gICAgICogdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TeW5jUm91dGVTZWxlY3RlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsYmFja3MgaW50byB0aGUgbWVkaWEgcm91dGVyIHRvIHN5bmNocm9uaXplIHN0YXRlIHdpdGggdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBTeW5jQ2FsbGJhY2sgewotICAgICAgICB2b2lkIG9uU3lzdGVtUm91dGVTZWxlY3RlZEJ5RGVzY3JpcHRvcklkKFN0cmluZyBpZCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXREZWZhdWx0Um91dGUoKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0U3lzdGVtUm91dGUoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExlZ2FjeSBpbXBsZW1lbnRhdGlvbiBmb3IgcGxhdGZvcm0gdmVyc2lvbnMgcHJpb3IgdG8gSmVsbHliZWFuLgotICAgICAqLwotICAgIHN0YXRpYyBjbGFzcyBMZWdhY3lJbXBsIGV4dGVuZHMgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyIHsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVFJFQU0gPSBBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDOwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+IENPTlRST0xfRklMVEVSUzsKLSAgICAgICAgc3RhdGljIHsKLSAgICAgICAgICAgIEludGVudEZpbHRlciBmID0gbmV3IEludGVudEZpbHRlcigpOwotICAgICAgICAgICAgZi5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTyk7Ci0gICAgICAgICAgICBmLmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKTsKLQotICAgICAgICAgICAgQ09OVFJPTF9GSUxURVJTID0gbmV3IEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+KCk7Ci0gICAgICAgICAgICBDT05UUk9MX0ZJTFRFUlMuYWRkKGYpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgQXVkaW9NYW5hZ2VyIG1BdWRpb01hbmFnZXI7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgVm9sdW1lQ2hhbmdlUmVjZWl2ZXIgbVZvbHVtZUNoYW5nZVJlY2VpdmVyOwotICAgICAgICBpbnQgbUxhc3RSZXBvcnRlZFZvbHVtZSA9IC0xOwotCi0gICAgICAgIHB1YmxpYyBMZWdhY3lJbXBsKENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgICAgICBtQXVkaW9NYW5hZ2VyID0gKEF1ZGlvTWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BVURJT19TRVJWSUNFKTsKLSAgICAgICAgICAgIG1Wb2x1bWVDaGFuZ2VSZWNlaXZlciA9IG5ldyBWb2x1bWVDaGFuZ2VSZWNlaXZlcigpOwotCi0gICAgICAgICAgICBjb250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobVZvbHVtZUNoYW5nZVJlY2VpdmVyLAotICAgICAgICAgICAgICAgICAgICBuZXcgSW50ZW50RmlsdGVyKFZvbHVtZUNoYW5nZVJlY2VpdmVyLlZPTFVNRV9DSEFOR0VEX0FDVElPTikpOwotICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBwdWJsaXNoUm91dGVzKCkgewotICAgICAgICAgICAgUmVzb3VyY2VzIHIgPSBnZXRDb250ZXh0KCkuZ2V0UmVzb3VyY2VzKCk7Ci0gICAgICAgICAgICBpbnQgbWF4Vm9sdW1lID0gbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1NYXhWb2x1bWUoUExBWUJBQ0tfU1RSRUFNKTsKLSAgICAgICAgICAgIG1MYXN0UmVwb3J0ZWRWb2x1bWUgPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbVZvbHVtZShQTEFZQkFDS19TVFJFQU0pOwotICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IgZGVmYXVsdFJvdXRlID0gbmV3IE1lZGlhUm91dGVEZXNjcmlwdG9yLkJ1aWxkZXIoCi0gICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUk9VVEVfSUQsIHIuZ2V0U3RyaW5nKFIuc3RyaW5nLm1yX3N5c3RlbV9yb3V0ZV9uYW1lKSkKLSAgICAgICAgICAgICAgICAgICAgLmFkZENvbnRyb2xGaWx0ZXJzKENPTlRST0xfRklMVEVSUykKLSAgICAgICAgICAgICAgICAgICAgLnNldFBsYXliYWNrU3RyZWFtKFBMQVlCQUNLX1NUUkVBTSkKLSAgICAgICAgICAgICAgICAgICAgLnNldFBsYXliYWNrVHlwZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVFlQRV9MT0NBTCkKLSAgICAgICAgICAgICAgICAgICAgLnNldFZvbHVtZUhhbmRsaW5nKE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19WT0xVTUVfVkFSSUFCTEUpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRWb2x1bWVNYXgobWF4Vm9sdW1lKQotICAgICAgICAgICAgICAgICAgICAuc2V0Vm9sdW1lKG1MYXN0UmVwb3J0ZWRWb2x1bWUpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotCi0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIHByb3ZpZGVyRGVzY3JpcHRvciA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLkJ1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAuYWRkUm91dGUoZGVmYXVsdFJvdXRlKQotICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgICAgIHNldERlc2NyaXB0b3IocHJvdmlkZXJEZXNjcmlwdG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgUm91dGVDb250cm9sbGVyIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKFN0cmluZyByb3V0ZUlkKSB7Ci0gICAgICAgICAgICBpZiAocm91dGVJZC5lcXVhbHMoREVGQVVMVF9ST1VURV9JRCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERlZmF1bHRSb3V0ZUNvbnRyb2xsZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgY2xhc3MgRGVmYXVsdFJvdXRlQ29udHJvbGxlciBleHRlbmRzIFJvdXRlQ29udHJvbGxlciB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2V0Vm9sdW1lKGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShQTEFZQkFDS19TVFJFQU0sIHZvbHVtZSwgMCk7Ci0gICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVXBkYXRlVm9sdW1lKGludCBkZWx0YSkgewotICAgICAgICAgICAgICAgIGludCB2b2x1bWUgPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbVZvbHVtZShQTEFZQkFDS19TVFJFQU0pOwotICAgICAgICAgICAgICAgIGludCBtYXhWb2x1bWUgPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbU1heFZvbHVtZShQTEFZQkFDS19TVFJFQU0pOwotICAgICAgICAgICAgICAgIGludCBuZXdWb2x1bWUgPSBNYXRoLm1pbihtYXhWb2x1bWUsIE1hdGgubWF4KDAsIHZvbHVtZSArIGRlbHRhKSk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1ZvbHVtZSAhPSB2b2x1bWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoUExBWUJBQ0tfU1RSRUFNLCB2b2x1bWUsIDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBjbGFzcyBWb2x1bWVDaGFuZ2VSZWNlaXZlciBleHRlbmRzIEJyb2FkY2FzdFJlY2VpdmVyIHsKLSAgICAgICAgICAgIC8vIFRoZXNlIGNvbnN0YW50cyBjb21lIGZyb20gQXVkaW9NYW5hZ2VyLgotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgVk9MVU1FX0NIQU5HRURfQUNUSU9OID0KLSAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuVk9MVU1FX0NIQU5HRURfQUNUSU9OIjsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1ZPTFVNRV9TVFJFQU1fVFlQRSA9Ci0gICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLkVYVFJBX1ZPTFVNRV9TVFJFQU1fVFlQRSI7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9WT0xVTUVfU1RSRUFNX1ZBTFVFID0KLSAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuRVhUUkFfVk9MVU1FX1NUUkVBTV9WQUxVRSI7Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgICAgIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKFZPTFVNRV9DSEFOR0VEX0FDVElPTikpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHN0cmVhbVR5cGUgPSBpbnRlbnQuZ2V0SW50RXh0cmEoRVhUUkFfVk9MVU1FX1NUUkVBTV9UWVBFLCAtMSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW1UeXBlID09IFBMQVlCQUNLX1NUUkVBTSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHZvbHVtZSA9IGludGVudC5nZXRJbnRFeHRyYShFWFRSQV9WT0xVTUVfU1RSRUFNX1ZBTFVFLCAtMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodm9sdW1lID49IDAgJiYgdm9sdW1lICE9IG1MYXN0UmVwb3J0ZWRWb2x1bWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBKZWxseWJlYW4gaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgLy8gQEBSZXF1aXJlc0FwaSgxNikKLSAgICBzdGF0aWMgY2xhc3MgSmVsbHliZWFuSW1wbCBleHRlbmRzIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlcgotICAgICAgICAgICAgaW1wbGVtZW50cyBNZWRpYVJvdXRlckplbGx5YmVhbi5DYWxsYmFjaywgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVm9sdW1lQ2FsbGJhY2sgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPiBMSVZFX0FVRElPX0NPTlRST0xfRklMVEVSUzsKLSAgICAgICAgc3RhdGljIHsKLSAgICAgICAgICAgIEludGVudEZpbHRlciBmID0gbmV3IEludGVudEZpbHRlcigpOwotICAgICAgICAgICAgZi5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTyk7Ci0KLSAgICAgICAgICAgIExJVkVfQVVESU9fQ09OVFJPTF9GSUxURVJTID0gbmV3IEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+KCk7Ci0gICAgICAgICAgICBMSVZFX0FVRElPX0NPTlRST0xfRklMVEVSUy5hZGQoZik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPiBMSVZFX1ZJREVPX0NPTlRST0xfRklMVEVSUzsKLSAgICAgICAgc3RhdGljIHsKLSAgICAgICAgICAgIEludGVudEZpbHRlciBmID0gbmV3IEludGVudEZpbHRlcigpOwotICAgICAgICAgICAgZi5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTyk7Ci0KLSAgICAgICAgICAgIExJVkVfVklERU9fQ09OVFJPTF9GSUxURVJTID0gbmV3IEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+KCk7Ci0gICAgICAgICAgICBMSVZFX1ZJREVPX0NPTlRST0xfRklMVEVSUy5hZGQoZik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGZpbmFsIFN5bmNDYWxsYmFjayBtU3luY0NhbGxiYWNrOwotCi0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBPYmplY3QgbVJvdXRlck9iajsKLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBtQ2FsbGJhY2tPYmo7Ci0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBPYmplY3QgbVZvbHVtZUNhbGxiYWNrT2JqOwotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IG1Vc2VyUm91dGVDYXRlZ29yeU9iajsKLSAgICAgICAgcHJvdGVjdGVkIGludCBtUm91dGVUeXBlczsKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gbUFjdGl2ZVNjYW47Ci0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIG1DYWxsYmFja1JlZ2lzdGVyZWQ7Ci0KLSAgICAgICAgLy8gTWFpbnRhaW5zIGFuIGFzc29jaWF0aW9uIGZyb20gZnJhbWV3b3JrIHJvdXRlcyB0byBzdXBwb3J0IGxpYnJhcnkgcm91dGVzLgotICAgICAgICAvLyBOb3RlIHRoYXQgd2UgY2Fubm90IHVzZSB0aGUgdGFnIGZpZWxkIGZvciB0aGlzIGJlY2F1c2UgYW4gYXBwbGljYXRpb24gbWF5Ci0gICAgICAgIC8vIGhhdmUgcHVibGlzaGVkIGl0cyBvd24gdXNlciByb3V0ZXMgdG8gdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIgYW5kIGFscmVhZHkKLSAgICAgICAgLy8gdXNlZCB0aGUgdGFnIGZvciBpdHMgb3duIHB1cnBvc2VzLgotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgQXJyYXlMaXN0PFN5c3RlbVJvdXRlUmVjb3JkPiBtU3lzdGVtUm91dGVSZWNvcmRzID0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFN5c3RlbVJvdXRlUmVjb3JkPigpOwotCi0gICAgICAgIC8vIE1haW50YWlucyBhbiBhc3NvY2lhdGlvbiBmcm9tIHN1cHBvcnQgbGlicmFyeSByb3V0ZXMgdG8gZnJhbWV3b3JrIHJvdXRlcy4KLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIEFycmF5TGlzdDxVc2VyUm91dGVSZWNvcmQ+IG1Vc2VyUm91dGVSZWNvcmRzID0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFVzZXJSb3V0ZVJlY29yZD4oKTsKLQotICAgICAgICBwcml2YXRlIE1lZGlhUm91dGVySmVsbHliZWFuLlNlbGVjdFJvdXRlV29ya2Fyb3VuZCBtU2VsZWN0Um91dGVXb3JrYXJvdW5kOwotICAgICAgICBwcml2YXRlIE1lZGlhUm91dGVySmVsbHliZWFuLkdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQgbUdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQ7Ci0KLSAgICAgICAgcHVibGljIEplbGx5YmVhbkltcGwoQ29udGV4dCBjb250ZXh0LCBTeW5jQ2FsbGJhY2sgc3luY0NhbGxiYWNrKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgICAgIG1TeW5jQ2FsbGJhY2sgPSBzeW5jQ2FsbGJhY2s7Ci0gICAgICAgICAgICBtUm91dGVyT2JqID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uZ2V0TWVkaWFSb3V0ZXIoY29udGV4dCk7Ci0gICAgICAgICAgICBtQ2FsbGJhY2tPYmogPSBjcmVhdGVDYWxsYmFja09iaigpOwotICAgICAgICAgICAgbVZvbHVtZUNhbGxiYWNrT2JqID0gY3JlYXRlVm9sdW1lQ2FsbGJhY2tPYmooKTsKLQotICAgICAgICAgICAgUmVzb3VyY2VzIHIgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpOwotICAgICAgICAgICAgbVVzZXJSb3V0ZUNhdGVnb3J5T2JqID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uY3JlYXRlUm91dGVDYXRlZ29yeSgKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlck9iaiwgci5nZXRTdHJpbmcoUi5zdHJpbmcubXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lKSwgZmFsc2UpOwotCi0gICAgICAgICAgICB1cGRhdGVTeXN0ZW1Sb3V0ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgUm91dGVDb250cm9sbGVyIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKFN0cmluZyByb3V0ZUlkKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmRCeURlc2NyaXB0b3JJZChyb3V0ZUlkKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3lzdGVtUm91dGVDb250cm9sbGVyKHJlY29yZC5tUm91dGVPYmopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZChNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgICAgICBpbnQgbmV3Um91dGVUeXBlcyA9IDA7Ci0gICAgICAgICAgICBib29sZWFuIG5ld0FjdGl2ZVNjYW4gPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChyZXF1ZXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IgPSByZXF1ZXN0LmdldFNlbGVjdG9yKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IGNhdGVnb3JpZXMgPSBzZWxlY3Rvci5nZXRDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IGNhdGVnb3JpZXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2F0ZWdvcnkgPSBjYXRlZ29yaWVzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNhdGVnb3J5LmVxdWFscyhNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld1JvdXRlVHlwZXMgfD0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX0FVRElPOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNhdGVnb3J5LmVxdWFscyhNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld1JvdXRlVHlwZXMgfD0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX1ZJREVPOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3Um91dGVUeXBlcyB8PSBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX1VTRVI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmV3QWN0aXZlU2NhbiA9IHJlcXVlc3QuaXNBY3RpdmVTY2FuKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtUm91dGVUeXBlcyAhPSBuZXdSb3V0ZVR5cGVzIHx8IG1BY3RpdmVTY2FuICE9IG5ld0FjdGl2ZVNjYW4pIHsKLSAgICAgICAgICAgICAgICBtUm91dGVUeXBlcyA9IG5ld1JvdXRlVHlwZXM7Ci0gICAgICAgICAgICAgICAgbUFjdGl2ZVNjYW4gPSBuZXdBY3RpdmVTY2FuOwotICAgICAgICAgICAgICAgIHVwZGF0ZVN5c3RlbVJvdXRlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVBZGRlZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGlmIChhZGRTeXN0ZW1Sb3V0ZU5vUHVibGlzaChyb3V0ZU9iaikpIHsKLSAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgdXBkYXRlU3lzdGVtUm91dGVzKCkgewotICAgICAgICAgICAgdXBkYXRlQ2FsbGJhY2soKTsKLSAgICAgICAgICAgIGJvb2xlYW4gY2hhbmdlZCA9IGZhbHNlOwotICAgICAgICAgICAgZm9yIChPYmplY3Qgcm91dGVPYmogOiBNZWRpYVJvdXRlckplbGx5YmVhbi5nZXRSb3V0ZXMobVJvdXRlck9iaikpIHsKLSAgICAgICAgICAgICAgICBjaGFuZ2VkIHw9IGFkZFN5c3RlbVJvdXRlTm9QdWJsaXNoKHJvdXRlT2JqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGFkZFN5c3RlbVJvdXRlTm9QdWJsaXNoKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgaWYgKGdldFVzZXJSb3V0ZVJlY29yZChyb3V0ZU9iaikgPT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopIDwgMCkgewotICAgICAgICAgICAgICAgIFN0cmluZyBpZCA9IGFzc2lnblJvdXRlSWQocm91dGVPYmopOwotICAgICAgICAgICAgICAgIFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCA9IG5ldyBTeXN0ZW1Sb3V0ZVJlY29yZChyb3V0ZU9iaiwgaWQpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVN5c3RlbVJvdXRlRGVzY3JpcHRvcihyZWNvcmQpOwotICAgICAgICAgICAgICAgIG1TeXN0ZW1Sb3V0ZVJlY29yZHMuYWRkKHJlY29yZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBhc3NpZ25Sb3V0ZUlkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgLy8gVE9ETzogVGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIgc2hvdWxkIHN1cHBseSBhIHVuaXF1ZSByb3V0ZSBpZCB0aGF0Ci0gICAgICAgICAgICAvLyB3ZSBjYW4gdXNlIGhlcmUuICBGb3Igbm93IHdlIHVzZSBhIGhhc2ggb2YgdGhlIHJvdXRlIG5hbWUgYW5kIHRha2UgY2FyZQotICAgICAgICAgICAgLy8gdG8gZGVkdXBlIGl0LgotICAgICAgICAgICAgYm9vbGVhbiBpc0RlZmF1bHQgPSAoZ2V0RGVmYXVsdFJvdXRlKCkgPT0gcm91dGVPYmopOwotICAgICAgICAgICAgU3RyaW5nIGlkID0gaXNEZWZhdWx0ID8gREVGQVVMVF9ST1VURV9JRCA6Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoTG9jYWxlLlVTLCAiUk9VVEVfJTA4eCIsIGdldFJvdXRlTmFtZShyb3V0ZU9iaikuaGFzaENvZGUoKSk7Ci0gICAgICAgICAgICBpZiAoZmluZFN5c3RlbVJvdXRlUmVjb3JkQnlEZXNjcmlwdG9ySWQoaWQpIDwgMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBpZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAyOyA7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBuZXdJZCA9IFN0cmluZy5mb3JtYXQoTG9jYWxlLlVTLCAiJXNfJWQiLCBpZCwgaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZEJ5RGVzY3JpcHRvcklkKG5ld0lkKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld0lkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGlmIChnZXRVc2VyUm91dGVSZWNvcmQocm91dGVPYmopID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1Sb3V0ZVJlY29yZHMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGlmIChnZXRVc2VyUm91dGVSZWNvcmQocm91dGVPYmopID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlU3lzdGVtUm91dGVEZXNjcmlwdG9yKHJlY29yZCk7Ci0gICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVZvbHVtZUNoYW5nZWQoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0VXNlclJvdXRlUmVjb3JkKHJvdXRlT2JqKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGludCBuZXdWb2x1bWUgPSBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0Vm9sdW1lKHJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1ZvbHVtZSAhPSByZWNvcmQubVJvdXRlRGVzY3JpcHRvci5nZXRWb2x1bWUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3IgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlcihyZWNvcmQubVJvdXRlRGVzY3JpcHRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFZvbHVtZShuZXdWb2x1bWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVTZWxlY3RlZChpbnQgdHlwZSwgT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBpZiAocm91dGVPYmogIT0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uZ2V0U2VsZWN0ZWRSb3V0ZShtUm91dGVyT2JqLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5BTExfUk9VVEVfVFlQRVMpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZSBoYXMgYWxyZWFkeSBjaGFuZ2VkIHNvIHRoaXMgY2FsbGJhY2sKLSAgICAgICAgICAgICAgICAvLyBpcyBzdGFsZS4gIERyb3AgaXQgdG8gcHJldmVudCBnZXR0aW5nIGludG8gc3luYyBsb29wcy4KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFVzZXJSb3V0ZVJlY29yZCB1c2VyUm91dGVSZWNvcmQgPSBnZXRVc2VyUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgaWYgKHVzZXJSb3V0ZVJlY29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdXNlclJvdXRlUmVjb3JkLm1Sb3V0ZS5zZWxlY3QoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gU2VsZWN0IHRoZSByb3V0ZSBpZiBpdCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgY29tcGF0IG1lZGlhIHJvdXRlci4KLSAgICAgICAgICAgICAgICAvLyBJZiBub3QsIHdlIHdpbGwgc2VsZWN0IGl0IGluc3RlYWQgd2hlbiB0aGUgcm91dGUgaXMgYWRkZWQuCi0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIG1TeW5jQ2FsbGJhY2sub25TeXN0ZW1Sb3V0ZVNlbGVjdGVkQnlEZXNjcmlwdG9ySWQocmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3JJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKGludCB0eXBlLCBPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gd2hlbiBhIHJvdXRlIGlzIHVuc2VsZWN0ZWQuCi0gICAgICAgICAgICAvLyBXZSBvbmx5IG5lZWQgdG8gaGFuZGxlIHdoZW4gYSByb3V0ZSBpcyBzZWxlY3RlZC4KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlR3JvdXBlZChPYmplY3Qgcm91dGVPYmosIE9iamVjdCBncm91cE9iaiwgaW50IGluZGV4KSB7Ci0gICAgICAgICAgICAvLyBSb3V0ZSBncm91cGluZyBpcyBkZXByZWNhdGVkIGFuZCBubyBsb25nZXIgc3VwcG9ydGVkLgotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbmdyb3VwZWQoT2JqZWN0IHJvdXRlT2JqLCBPYmplY3QgZ3JvdXBPYmopIHsKLSAgICAgICAgICAgIC8vIFJvdXRlIGdyb3VwaW5nIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuCi0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVTZXRSZXF1ZXN0KE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZSkgewotICAgICAgICAgICAgVXNlclJvdXRlUmVjb3JkIHJlY29yZCA9IGdldFVzZXJSb3V0ZVJlY29yZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICBpZiAocmVjb3JkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlLnJlcXVlc3RTZXRWb2x1bWUodm9sdW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVVwZGF0ZVJlcXVlc3QoT2JqZWN0IHJvdXRlT2JqLCBpbnQgZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICBVc2VyUm91dGVSZWNvcmQgcmVjb3JkID0gZ2V0VXNlclJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKLSAgICAgICAgICAgIGlmIChyZWNvcmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGUucmVxdWVzdFVwZGF0ZVZvbHVtZShkaXJlY3Rpb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlQWRkZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBpZiAocm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpICE9IHRoaXMpIHsKLSAgICAgICAgICAgICAgICBPYmplY3Qgcm91dGVPYmogPSBNZWRpYVJvdXRlckplbGx5YmVhbi5jcmVhdGVVc2VyUm91dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVyT2JqLCBtVXNlclJvdXRlQ2F0ZWdvcnlPYmopOwotICAgICAgICAgICAgICAgIFVzZXJSb3V0ZVJlY29yZCByZWNvcmQgPSBuZXcgVXNlclJvdXRlUmVjb3JkKHJvdXRlLCByb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLnNldFRhZyhyb3V0ZU9iaiwgcmVjb3JkKTsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZUNhbGxiYWNrKHJvdXRlT2JqLCBtVm9sdW1lQ2FsbGJhY2tPYmopOwotICAgICAgICAgICAgICAgIHVwZGF0ZVVzZXJSb3V0ZVByb3BlcnRpZXMocmVjb3JkKTsKLSAgICAgICAgICAgICAgICBtVXNlclJvdXRlUmVjb3Jkcy5hZGQocmVjb3JkKTsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5hZGRVc2VyUm91dGUobVJvdXRlck9iaiwgcm91dGVPYmopOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB0aGUgbmV3bHkgYWRkZWQgcm91dGUgaXMgdGhlIGNvdW50ZXJwYXJ0IG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKLSAgICAgICAgICAgICAgICAvLyByb3V0ZSBpbiB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlciB0aGVuIGVuc3VyZSBpdCBpcyBzZWxlY3RlZCBpbgotICAgICAgICAgICAgICAgIC8vIHRoZSBjb21wYXQgbWVkaWEgcm91dGVyLgotICAgICAgICAgICAgICAgIE9iamVjdCByb3V0ZU9iaiA9IE1lZGlhUm91dGVySmVsbHliZWFuLmdldFNlbGVjdGVkUm91dGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVyT2JqLCBNZWRpYVJvdXRlckplbGx5YmVhbi5BTExfUk9VVEVfVFlQRVMpOwotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBpZiAocmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3JJZC5lcXVhbHMocm91dGUuZ2V0RGVzY3JpcHRvcklkKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5zZWxlY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblN5bmNSb3V0ZVJlbW92ZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBpZiAocm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpICE9IHRoaXMpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kVXNlclJvdXRlUmVjb3JkKHJvdXRlKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBVc2VyUm91dGVSZWNvcmQgcmVjb3JkID0gbVVzZXJSb3V0ZVJlY29yZHMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLnNldFRhZyhyZWNvcmQubVJvdXRlT2JqLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVDYWxsYmFjayhyZWNvcmQubVJvdXRlT2JqLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4ucmVtb3ZlVXNlclJvdXRlKG1Sb3V0ZXJPYmosIHJlY29yZC5tUm91dGVPYmopOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblN5bmNSb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBpZiAocm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpICE9IHRoaXMpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kVXNlclJvdXRlUmVjb3JkKHJvdXRlKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBVc2VyUm91dGVSZWNvcmQgcmVjb3JkID0gbVVzZXJSb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlVXNlclJvdXRlUHJvcGVydGllcyhyZWNvcmQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblN5bmNSb3V0ZVNlbGVjdGVkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgaWYgKCFyb3V0ZS5pc1NlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlIGhhcyBhbHJlYWR5IGNoYW5nZWQgc28gdGhpcyBjYWxsYmFjawotICAgICAgICAgICAgICAgIC8vIGlzIHN0YWxlLiAgRHJvcCBpdCB0byBwcmV2ZW50IGdldHRpbmcgaW50byBzeW5jIGxvb3BzLgotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKSAhPSB0aGlzKSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFVzZXJSb3V0ZVJlY29yZChyb3V0ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgVXNlclJvdXRlUmVjb3JkIHJlY29yZCA9IG1Vc2VyUm91dGVSZWNvcmRzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIHNlbGVjdFJvdXRlKHJlY29yZC5tUm91dGVPYmopOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkQnlEZXNjcmlwdG9ySWQocm91dGUuZ2V0RGVzY3JpcHRvcklkKCkpOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0Um91dGUocmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgcHVibGlzaFJvdXRlcygpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuQnVpbGRlciBidWlsZGVyID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuQnVpbGRlcigpOwotICAgICAgICAgICAgaW50IGNvdW50ID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFkZFJvdXRlKG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGkpLm1Sb3V0ZURlc2NyaXB0b3IpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXREZXNjcmlwdG9yKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgaW50IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGkpLm1Sb3V0ZU9iaiA9PSByb3V0ZU9iaikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgaW50IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZEJ5RGVzY3JpcHRvcklkKFN0cmluZyBpZCkgewotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaSkubVJvdXRlRGVzY3JpcHRvcklkLmVxdWFscyhpZCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIGludCBmaW5kVXNlclJvdXRlUmVjb3JkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVVzZXJSb3V0ZVJlY29yZHMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Vc2VyUm91dGVSZWNvcmRzLmdldChpKS5tUm91dGUgPT0gcm91dGUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIFVzZXJSb3V0ZVJlY29yZCBnZXRVc2VyUm91dGVSZWNvcmQoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBPYmplY3QgdGFnID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldFRhZyhyb3V0ZU9iaik7Ci0gICAgICAgICAgICByZXR1cm4gdGFnIGluc3RhbmNlb2YgVXNlclJvdXRlUmVjb3JkID8gKFVzZXJSb3V0ZVJlY29yZCl0YWcgOiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlU3lzdGVtUm91dGVEZXNjcmlwdG9yKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCkgewotICAgICAgICAgICAgLy8gV2UgbXVzdCBhbHdheXMgcmVjcmVhdGUgdGhlIHJvdXRlIGRlc2NyaXB0b3Igd2hlbiBtYWtpbmcgYW55IGNoYW5nZXMKLSAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhleSBhcmUgaW50ZW5kZWQgdG8gYmUgaW1tdXRhYmxlIG9uY2UgcHVibGlzaGVkLgotICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlciBidWlsZGVyID0gbmV3IE1lZGlhUm91dGVEZXNjcmlwdG9yLkJ1aWxkZXIoCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVEZXNjcmlwdG9ySWQsIGdldFJvdXRlTmFtZShyZWNvcmQubVJvdXRlT2JqKSk7Ci0gICAgICAgICAgICBvbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKHJlY29yZCwgYnVpbGRlcik7Ci0gICAgICAgICAgICByZWNvcmQubVJvdXRlRGVzY3JpcHRvciA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBTdHJpbmcgZ2V0Um91dGVOYW1lKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgLy8gUm91dGVzIHNob3VsZCBub3QgaGF2ZSBudWxsIG5hbWVzIGJ1dCBpdCBtYXkgaGFwcGVuIGZvciBiYWRseSBjb25maWd1cmVkCi0gICAgICAgICAgICAvLyB1c2VyIHJvdXRlcy4gIFdlIHRvbGVyYXRlIHRoaXMgYnkgdXNpbmcgYW4gZW1wdHkgbmFtZSBzdHJpbmcgaGVyZSBidXQKLSAgICAgICAgICAgIC8vIHN1Y2ggdW5uYW1lZCByb3V0ZXMgd2lsbCBiZSBkaXNjYXJkZWQgYnkgdGhlIG1lZGlhIHJvdXRlciB1cHN0cmVhbQotICAgICAgICAgICAgLy8gKHdpdGggYSBsb2cgbWVzc2FnZSBzbyB3ZSBjYW4gdHJhY2sgZG93biB0aGUgcHJvYmxlbSkuCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgbmFtZSA9IE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXROYW1lKHJvdXRlT2JqLCBnZXRDb250ZXh0KCkpOwotICAgICAgICAgICAgcmV0dXJuIG5hbWUgIT0gbnVsbCA/IG5hbWUudG9TdHJpbmcoKSA6ICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25CdWlsZFN5c3RlbVJvdXRlRGVzY3JpcHRvcihTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQsCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICAgICAgICBpbnQgc3VwcG9ydGVkVHlwZXMgPSBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0U3VwcG9ydGVkVHlwZXMoCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVPYmopOwotICAgICAgICAgICAgaWYgKChzdXBwb3J0ZWRUeXBlcyAmIE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfTElWRV9BVURJTykgIT0gMCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkQ29udHJvbEZpbHRlcnMoTElWRV9BVURJT19DT05UUk9MX0ZJTFRFUlMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChzdXBwb3J0ZWRUeXBlcyAmIE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfTElWRV9WSURFTykgIT0gMCkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkQ29udHJvbEZpbHRlcnMoTElWRV9WSURFT19DT05UUk9MX0ZJTFRFUlMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBidWlsZGVyLnNldFBsYXliYWNrVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldFBsYXliYWNrVHlwZShyZWNvcmQubVJvdXRlT2JqKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldFBsYXliYWNrU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0UGxheWJhY2tTdHJlYW0ocmVjb3JkLm1Sb3V0ZU9iaikpOwotICAgICAgICAgICAgYnVpbGRlci5zZXRWb2x1bWUoCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXRWb2x1bWUocmVjb3JkLm1Sb3V0ZU9iaikpOwotICAgICAgICAgICAgYnVpbGRlci5zZXRWb2x1bWVNYXgoCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXRWb2x1bWVNYXgocmVjb3JkLm1Sb3V0ZU9iaikpOwotICAgICAgICAgICAgYnVpbGRlci5zZXRWb2x1bWVIYW5kbGluZygKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldFZvbHVtZUhhbmRsaW5nKHJlY29yZC5tUm91dGVPYmopKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVVzZXJSb3V0ZVByb3BlcnRpZXMoVXNlclJvdXRlUmVjb3JkIHJlY29yZCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXROYW1lKAotICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlT2JqLCByZWNvcmQubVJvdXRlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFBsYXliYWNrVHlwZSgKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaiwgcmVjb3JkLm1Sb3V0ZS5nZXRQbGF5YmFja1R5cGUoKSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFBsYXliYWNrU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlT2JqLCByZWNvcmQubVJvdXRlLmdldFBsYXliYWNrU3RyZWFtKCkpOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWUoCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVPYmosIHJlY29yZC5tUm91dGUuZ2V0Vm9sdW1lKCkpOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVNYXgoCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVPYmosIHJlY29yZC5tUm91dGUuZ2V0Vm9sdW1lTWF4KCkpOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVIYW5kbGluZygKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaiwgcmVjb3JkLm1Sb3V0ZS5nZXRWb2x1bWVIYW5kbGluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUNhbGxiYWNrKCkgewotICAgICAgICAgICAgaWYgKG1DYWxsYmFja1JlZ2lzdGVyZWQpIHsKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2tSZWdpc3RlcmVkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4ucmVtb3ZlQ2FsbGJhY2sobVJvdXRlck9iaiwgbUNhbGxiYWNrT2JqKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Sb3V0ZVR5cGVzICE9IDApIHsKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2tSZWdpc3RlcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5hZGRDYWxsYmFjayhtUm91dGVyT2JqLCBtUm91dGVUeXBlcywgbUNhbGxiYWNrT2JqKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlQ2FsbGJhY2tPYmooKSB7Ci0gICAgICAgICAgICByZXR1cm4gTWVkaWFSb3V0ZXJKZWxseWJlYW4uY3JlYXRlQ2FsbGJhY2sodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGNyZWF0ZVZvbHVtZUNhbGxiYWNrT2JqKCkgewotICAgICAgICAgICAgcmV0dXJuIE1lZGlhUm91dGVySmVsbHliZWFuLmNyZWF0ZVZvbHVtZUNhbGxiYWNrKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgc2VsZWN0Um91dGUoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBpZiAobVNlbGVjdFJvdXRlV29ya2Fyb3VuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdFJvdXRlV29ya2Fyb3VuZCA9IG5ldyBNZWRpYVJvdXRlckplbGx5YmVhbi5TZWxlY3RSb3V0ZVdvcmthcm91bmQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TZWxlY3RSb3V0ZVdvcmthcm91bmQuc2VsZWN0Um91dGUobVJvdXRlck9iaiwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uQUxMX1JPVVRFX1RZUEVTLCByb3V0ZU9iaik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBnZXREZWZhdWx0Um91dGUoKSB7Ci0gICAgICAgICAgICBpZiAobUdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1HZXREZWZhdWx0Um91dGVXb3JrYXJvdW5kID0gbmV3IE1lZGlhUm91dGVySmVsbHliZWFuLkdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZC5nZXREZWZhdWx0Um91dGUobVJvdXRlck9iaik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBnZXRTeXN0ZW1Sb3V0ZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmRCeURlc2NyaXB0b3JJZChyb3V0ZS5nZXREZXNjcmlwdG9ySWQoKSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCkubVJvdXRlT2JqOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVwcmVzZW50cyBhIHJvdXRlIHRoYXQgaXMgcHJvdmlkZWQgYnkgdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIKLSAgICAgICAgICogYW5kIHB1Ymxpc2hlZCBieSB0aGlzIHJvdXRlIHByb3ZpZGVyIHRvIHRoZSBzdXBwb3J0IGxpYnJhcnkgbWVkaWEgcm91dGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjbGFzcyBTeXN0ZW1Sb3V0ZVJlY29yZCB7Ci0gICAgICAgICAgICBwdWJsaWMgZmluYWwgT2JqZWN0IG1Sb3V0ZU9iajsKLSAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBTdHJpbmcgbVJvdXRlRGVzY3JpcHRvcklkOwotICAgICAgICAgICAgcHVibGljIE1lZGlhUm91dGVEZXNjcmlwdG9yIG1Sb3V0ZURlc2NyaXB0b3I7IC8vIGFzc2lnbmVkIGltbWVkaWF0ZWx5IGFmdGVyIGNyZWF0aW9uCi0KLSAgICAgICAgICAgIHB1YmxpYyBTeXN0ZW1Sb3V0ZVJlY29yZChPYmplY3Qgcm91dGVPYmosIFN0cmluZyBpZCkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZU9iaiA9IHJvdXRlT2JqOwotICAgICAgICAgICAgICAgIG1Sb3V0ZURlc2NyaXB0b3JJZCA9IGlkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlcHJlc2VudHMgYSByb3V0ZSB0aGF0IGlzIHByb3ZpZGVkIGJ5IHRoZSBzdXBwb3J0IGxpYnJhcnkgbWVkaWEgcm91dGVyCi0gICAgICAgICAqIGFuZCBwdWJsaXNoZWQgYnkgdGhpcyByb3V0ZSBwcm92aWRlciB0byB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlci4KLSAgICAgICAgICovCi0gICAgICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2xhc3MgVXNlclJvdXRlUmVjb3JkIHsKLSAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gbVJvdXRlOwotICAgICAgICAgICAgcHVibGljIGZpbmFsIE9iamVjdCBtUm91dGVPYmo7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBVc2VyUm91dGVSZWNvcmQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlLCBPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgICAgICBtUm91dGUgPSByb3V0ZTsKLSAgICAgICAgICAgICAgICBtUm91dGVPYmogPSByb3V0ZU9iajsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2xhc3MgU3lzdGVtUm91dGVDb250cm9sbGVyIGV4dGVuZHMgUm91dGVDb250cm9sbGVyIHsKLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Sb3V0ZU9iajsKLQotICAgICAgICAgICAgcHVibGljIFN5c3RlbVJvdXRlQ29udHJvbGxlcihPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgICAgICBtUm91dGVPYmogPSByb3V0ZU9iajsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNldFZvbHVtZShpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLnJlcXVlc3RTZXRWb2x1bWUobVJvdXRlT2JqLCB2b2x1bWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVXBkYXRlVm9sdW1lKGludCBkZWx0YSkgewotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5yZXF1ZXN0VXBkYXRlVm9sdW1lKG1Sb3V0ZU9iaiwgZGVsdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSmVsbHliZWFuIE1SMSBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKi8KLSAgICAvLyBAQFJlcXVpcmVzQXBpKDE3KQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEplbGx5YmVhbk1yMUltcGwgZXh0ZW5kcyBKZWxseWJlYW5JbXBsCi0gICAgICAgICAgICBpbXBsZW1lbnRzIE1lZGlhUm91dGVySmVsbHliZWFuTXIxLkNhbGxiYWNrIHsKLSAgICAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5BY3RpdmVTY2FuV29ya2Fyb3VuZCBtQWN0aXZlU2Nhbldvcmthcm91bmQ7Ci0gICAgICAgIHByaXZhdGUgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuSXNDb25uZWN0aW5nV29ya2Fyb3VuZCBtSXNDb25uZWN0aW5nV29ya2Fyb3VuZDsKLQotICAgICAgICBwdWJsaWMgSmVsbHliZWFuTXIxSW1wbChDb250ZXh0IGNvbnRleHQsIFN5bmNDYWxsYmFjayBzeW5jQ2FsbGJhY2spIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVByZXNlbnRhdGlvbkRpc3BsYXlDaGFuZ2VkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIERpc3BsYXkgbmV3UHJlc2VudGF0aW9uRGlzcGxheSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5Sb3V0ZUluZm8uZ2V0UHJlc2VudGF0aW9uRGlzcGxheShyb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgaW50IG5ld1ByZXNlbnRhdGlvbkRpc3BsYXlJZCA9IChuZXdQcmVzZW50YXRpb25EaXNwbGF5ICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgICAgID8gbmV3UHJlc2VudGF0aW9uRGlzcGxheS5nZXREaXNwbGF5SWQoKSA6IC0xKTsKLSAgICAgICAgICAgICAgICBpZiAobmV3UHJlc2VudGF0aW9uRGlzcGxheUlkCi0gICAgICAgICAgICAgICAgICAgICAgICAhPSByZWNvcmQubVJvdXRlRGVzY3JpcHRvci5nZXRQcmVzZW50YXRpb25EaXNwbGF5SWQoKSkgewotICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlRGVzY3JpcHRvciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVEZXNjcmlwdG9yLkJ1aWxkZXIocmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNldFByZXNlbnRhdGlvbkRpc3BsYXlJZChuZXdQcmVzZW50YXRpb25EaXNwbGF5SWQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25CdWlsZFN5c3RlbVJvdXRlRGVzY3JpcHRvcihTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQsCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICAgICAgICBzdXBlci5vbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKHJlY29yZCwgYnVpbGRlcik7Ci0KLSAgICAgICAgICAgIGlmICghTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuUm91dGVJbmZvLmlzRW5hYmxlZChyZWNvcmQubVJvdXRlT2JqKSkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpc0Nvbm5lY3RpbmcocmVjb3JkKSkgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuc2V0Q29ubmVjdGluZyh0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgRGlzcGxheSBwcmVzZW50YXRpb25EaXNwbGF5ID0KLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuUm91dGVJbmZvLmdldFByZXNlbnRhdGlvbkRpc3BsYXkocmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uRGlzcGxheSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5zZXRQcmVzZW50YXRpb25EaXNwbGF5SWQocHJlc2VudGF0aW9uRGlzcGxheS5nZXREaXNwbGF5SWQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBzdXBlci51cGRhdGVDYWxsYmFjaygpOwotCi0gICAgICAgICAgICBpZiAobUFjdGl2ZVNjYW5Xb3JrYXJvdW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQWN0aXZlU2Nhbldvcmthcm91bmQgPSBuZXcgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuQWN0aXZlU2Nhbldvcmthcm91bmQoCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRDb250ZXh0KCksIGdldEhhbmRsZXIoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQWN0aXZlU2Nhbldvcmthcm91bmQuc2V0QWN0aXZlU2NhblJvdXRlVHlwZXMobUFjdGl2ZVNjYW4gPyBtUm91dGVUeXBlcyA6IDApOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlQ2FsbGJhY2tPYmooKSB7Ci0gICAgICAgICAgICByZXR1cm4gTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuY3JlYXRlQ2FsbGJhY2sodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0Nvbm5lY3RpbmcoU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkKSB7Ci0gICAgICAgICAgICBpZiAobUlzQ29ubmVjdGluZ1dvcmthcm91bmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Jc0Nvbm5lY3RpbmdXb3JrYXJvdW5kID0gbmV3IE1lZGlhUm91dGVySmVsbHliZWFuTXIxLklzQ29ubmVjdGluZ1dvcmthcm91bmQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtSXNDb25uZWN0aW5nV29ya2Fyb3VuZC5pc0Nvbm5lY3RpbmcocmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBKZWxseWJlYW4gTVIyIGltcGxlbWVudGF0aW9uLgotICAgICAqLwotICAgIC8vIEBAUmVxdWlyZXNBcGkoMTgpCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSmVsbHliZWFuTXIySW1wbCBleHRlbmRzIEplbGx5YmVhbk1yMUltcGwgewotICAgICAgICBwdWJsaWMgSmVsbHliZWFuTXIySW1wbChDb250ZXh0IGNvbnRleHQsIFN5bmNDYWxsYmFjayBzeW5jQ2FsbGJhY2spIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25CdWlsZFN5c3RlbVJvdXRlRGVzY3JpcHRvcihTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQsCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICAgICAgICBzdXBlci5vbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKHJlY29yZCwgYnVpbGRlcik7Ci0KLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBkZXNjcmlwdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuTXIyLlJvdXRlSW5mby5nZXREZXNjcmlwdGlvbihyZWNvcmQubVJvdXRlT2JqKTsKLSAgICAgICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbi50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZWxlY3RSb3V0ZShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLnNlbGVjdFJvdXRlKG1Sb3V0ZXJPYmosCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLkFMTF9ST1VURV9UWVBFUywgcm91dGVPYmopOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgZ2V0RGVmYXVsdFJvdXRlKCkgewotICAgICAgICAgICAgcmV0dXJuIE1lZGlhUm91dGVySmVsbHliZWFuTXIyLmdldERlZmF1bHRSb3V0ZShtUm91dGVyT2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVVc2VyUm91dGVQcm9wZXJ0aWVzKFVzZXJSb3V0ZVJlY29yZCByZWNvcmQpIHsKLSAgICAgICAgICAgIHN1cGVyLnVwZGF0ZVVzZXJSb3V0ZVByb3BlcnRpZXMocmVjb3JkKTsKLQotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuVXNlclJvdXRlSW5mby5zZXREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaiwgcmVjb3JkLm1Sb3V0ZS5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDYWxsYmFjaygpIHsKLSAgICAgICAgICAgIGlmIChtQ2FsbGJhY2tSZWdpc3RlcmVkKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4ucmVtb3ZlQ2FsbGJhY2sobVJvdXRlck9iaiwgbUNhbGxiYWNrT2JqKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUNhbGxiYWNrUmVnaXN0ZXJlZCA9IHRydWU7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbk1yMi5hZGRDYWxsYmFjayhtUm91dGVyT2JqLCBtUm91dGVUeXBlcywgbUNhbGxiYWNrT2JqLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTCi0gICAgICAgICAgICAgICAgICAgIHwgKG1BY3RpdmVTY2FuID8gTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOIDogMCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIGlzQ29ubmVjdGluZyhTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQpIHsKLSAgICAgICAgICAgIHJldHVybiBNZWRpYVJvdXRlckplbGx5YmVhbk1yMi5Sb3V0ZUluZm8uaXNDb25uZWN0aW5nKHJlY29yZC5tUm91dGVPYmopOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBpMjQgaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgLy8gQEBSZXF1aXJlc0FwaSgyNCkKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBcGkyNEltcGwgZXh0ZW5kcyBKZWxseWJlYW5NcjJJbXBsIHsKLSAgICAgICAgcHVibGljIEFwaTI0SW1wbChDb250ZXh0IGNvbnRleHQsIFN5bmNDYWxsYmFjayBzeW5jQ2FsbGJhY2spIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25CdWlsZFN5c3RlbVJvdXRlRGVzY3JpcHRvcihTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICAgICAgICBzdXBlci5vbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKHJlY29yZCwgYnVpbGRlcik7Ci0KLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGV2aWNlVHlwZShNZWRpYVJvdXRlckFwaTI0LlJvdXRlSW5mby5nZXREZXZpY2VUeXBlKHJlY29yZC5tUm91dGVPYmopKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9wYWNrYWdlLmh0bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvcGFja2FnZS5odG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTJhYWYyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTxodG1sPgotCi08Ym9keT4KLQotPHA+Q29udGFpbnMgQVBJcyB0aGF0IGNvbnRyb2wgdGhlIHJvdXRpbmcgb2YgbWVkaWEgY2hhbm5lbHMgYW5kIHN0cmVhbXMgZnJvbSB0aGUgY3VycmVudCBkZXZpY2UKLSAgdG8gZXh0ZXJuYWwgc3BlYWtlcnMgYW5kIGRlc3RpbmF0aW9uIGRldmljZXMuPC9wPgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9CYXNlTGF5b3V0LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9CYXNlTGF5b3V0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiNjQ3MWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvQmFzZUxheW91dC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5WaWV3R3JvdXBQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5MYXlvdXRQYXJhbXM7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cC5NYXJnaW5MYXlvdXRQYXJhbXM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotCi1wdWJsaWMgY2xhc3MgQmFzZUxheW91dCBleHRlbmRzIFZpZXdHcm91cEltcGwgewotICAgIHByaXZhdGUgZmluYWwgVmlld0dyb3VwIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIFZpZXdHcm91cFByb3ZpZGVyIG1TdXBlclByb3ZpZGVyOwotICAgIHByaXZhdGUgZmluYWwgVmlld0dyb3VwUHJvdmlkZXIgbVByaXZhdGVQcm92aWRlcjsKLQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PFZpZXc+IG1NYXRjaFBhcmVudENoaWxkcmVuID0gbmV3IEFycmF5TGlzdDw+KDEpOwotCi0gICAgcHVibGljIEJhc2VMYXlvdXQoVmlld0dyb3VwIGluc3RhbmNlLAotICAgICAgICAgICAgVmlld0dyb3VwUHJvdmlkZXIgc3VwZXJQcm92aWRlciwgVmlld0dyb3VwUHJvdmlkZXIgcHJpdmF0ZVByb3ZpZGVyKSB7Ci0gICAgICAgIHN1cGVyKGluc3RhbmNlLCBzdXBlclByb3ZpZGVyLCBwcml2YXRlUHJvdmlkZXIpOwotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIgPSBzdXBlclByb3ZpZGVyOwotICAgICAgICBtUHJpdmF0ZVByb3ZpZGVyID0gcHJpdmF0ZVByb3ZpZGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNoZWNrTGF5b3V0UGFyYW1zX2ltcGwoTGF5b3V0UGFyYW1zIHApIHsKLSAgICAgICAgcmV0dXJuIHAgaW5zdGFuY2VvZiBNYXJnaW5MYXlvdXRQYXJhbXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExheW91dFBhcmFtcyBnZW5lcmF0ZURlZmF1bHRMYXlvdXRQYXJhbXNfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNYXJnaW5MYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtc19pbXBsKEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICByZXR1cm4gbmV3IE1hcmdpbkxheW91dFBhcmFtcyhtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLCBhdHRycyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtc19pbXBsKExheW91dFBhcmFtcyBscCkgewotICAgICAgICBpZiAobHAgaW5zdGFuY2VvZiBNYXJnaW5MYXlvdXRQYXJhbXMpIHsKLSAgICAgICAgICAgIHJldHVybiBscDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IE1hcmdpbkxheW91dFBhcmFtcyhscCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25NZWFzdXJlX2ltcGwoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgewotICAgICAgICBpbnQgY291bnQgPSBtSW5zdGFuY2UuZ2V0Q2hpbGRDb3VudCgpOwotCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gbWVhc3VyZU1hdGNoUGFyZW50Q2hpbGRyZW4gPQotICAgICAgICAgICAgICAgIFZpZXcuTWVhc3VyZVNwZWMuZ2V0TW9kZSh3aWR0aE1lYXN1cmVTcGVjKSAhPSBWaWV3Lk1lYXN1cmVTcGVjLkVYQUNUTFkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIFZpZXcuTWVhc3VyZVNwZWMuZ2V0TW9kZShoZWlnaHRNZWFzdXJlU3BlYykgIT0gVmlldy5NZWFzdXJlU3BlYy5FWEFDVExZOwotICAgICAgICBtTWF0Y2hQYXJlbnRDaGlsZHJlbi5jbGVhcigpOwotCi0gICAgICAgIGludCBtYXhIZWlnaHQgPSAwOwotICAgICAgICBpbnQgbWF4V2lkdGggPSAwOwotICAgICAgICBpbnQgY2hpbGRTdGF0ZSA9IDA7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gbUluc3RhbmNlLmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpZiAoY2hpbGQuZ2V0VmlzaWJpbGl0eSgpICE9IFZpZXcuR09ORSkgewotICAgICAgICAgICAgICAgIG1Qcml2YXRlUHJvdmlkZXIubWVhc3VyZUNoaWxkV2l0aE1hcmdpbnNfaW1wbCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLCB3aWR0aE1lYXN1cmVTcGVjLCAwLCBoZWlnaHRNZWFzdXJlU3BlYywgMCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgTWFyZ2luTGF5b3V0UGFyYW1zIGxwID0gKE1hcmdpbkxheW91dFBhcmFtcykgY2hpbGQuZ2V0TGF5b3V0UGFyYW1zKCk7Ci0gICAgICAgICAgICAgICAgbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKSArIGxwLmxlZnRNYXJnaW4gKyBscC5yaWdodE1hcmdpbik7Ci0gICAgICAgICAgICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5tYXgobWF4SGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKSArIGxwLnRvcE1hcmdpbiArIGxwLmJvdHRvbU1hcmdpbik7Ci0gICAgICAgICAgICAgICAgY2hpbGRTdGF0ZSA9IGNoaWxkU3RhdGUgfCBjaGlsZC5nZXRNZWFzdXJlZFN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1lYXN1cmVNYXRjaFBhcmVudENoaWxkcmVuKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChscC53aWR0aCA9PSBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAuaGVpZ2h0ID09IExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NYXRjaFBhcmVudENoaWxkcmVuLmFkZChjaGlsZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBY2NvdW50IGZvciBwYWRkaW5nIHRvbwotICAgICAgICBtYXhXaWR0aCArPSBnZXRQYWRkaW5nTGVmdFdpdGhGb3JlZ3JvdW5kKCkgKyBnZXRQYWRkaW5nUmlnaHRXaXRoRm9yZWdyb3VuZCgpOwotICAgICAgICBtYXhIZWlnaHQgKz0gZ2V0UGFkZGluZ1RvcFdpdGhGb3JlZ3JvdW5kKCkgKyBnZXRQYWRkaW5nQm90dG9tV2l0aEZvcmVncm91bmQoKTsKLQotICAgICAgICAvLyBDaGVjayBhZ2FpbnN0IG91ciBtaW5pbXVtIGhlaWdodCBhbmQgd2lkdGgKLSAgICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5tYXgobWF4SGVpZ2h0LCBtUHJpdmF0ZVByb3ZpZGVyLmdldFN1Z2dlc3RlZE1pbmltdW1IZWlnaHRfaW1wbCgpKTsKLSAgICAgICAgbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwgbVByaXZhdGVQcm92aWRlci5nZXRTdWdnZXN0ZWRNaW5pbXVtV2lkdGhfaW1wbCgpKTsKLQotICAgICAgICAvLyBDaGVjayBhZ2FpbnN0IG91ciBmb3JlZ3JvdW5kJ3MgbWluaW11bSBoZWlnaHQgYW5kIHdpZHRoCi0gICAgICAgIGZpbmFsIERyYXdhYmxlIGRyYXdhYmxlID0gbUluc3RhbmNlLmdldEZvcmVncm91bmQoKTsKLSAgICAgICAgaWYgKGRyYXdhYmxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1heEhlaWdodCA9IE1hdGgubWF4KG1heEhlaWdodCwgZHJhd2FibGUuZ2V0TWluaW11bUhlaWdodCgpKTsKLSAgICAgICAgICAgIG1heFdpZHRoID0gTWF0aC5tYXgobWF4V2lkdGgsIGRyYXdhYmxlLmdldE1pbmltdW1XaWR0aCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1Qcml2YXRlUHJvdmlkZXIuc2V0TWVhc3VyZWREaW1lbnNpb25faW1wbCgKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UucmVzb2x2ZVNpemVBbmRTdGF0ZShtYXhXaWR0aCwgd2lkdGhNZWFzdXJlU3BlYywgY2hpbGRTdGF0ZSksCi0gICAgICAgICAgICAgICAgbUluc3RhbmNlLnJlc29sdmVTaXplQW5kU3RhdGUobWF4SGVpZ2h0LCBoZWlnaHRNZWFzdXJlU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkU3RhdGUgPDwgVmlldy5NRUFTVVJFRF9IRUlHSFRfU1RBVEVfU0hJRlQpKTsKLQotICAgICAgICBjb3VudCA9IG1NYXRjaFBhcmVudENoaWxkcmVuLnNpemUoKTsKLSAgICAgICAgaWYgKGNvdW50ID4gMSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IG1NYXRjaFBhcmVudENoaWxkcmVuLmdldChpKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBNYXJnaW5MYXlvdXRQYXJhbXMgbHAgPSAoTWFyZ2luTGF5b3V0UGFyYW1zKSBjaGlsZC5nZXRMYXlvdXRQYXJhbXMoKTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIGludCBjaGlsZFdpZHRoTWVhc3VyZVNwZWM7Ci0gICAgICAgICAgICAgICAgaWYgKGxwLndpZHRoID09IExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHdpZHRoID0gTWF0aC5tYXgoMCwgbUluc3RhbmNlLmdldE1lYXN1cmVkV2lkdGgoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gZ2V0UGFkZGluZ0xlZnRXaXRoRm9yZWdyb3VuZCgpIC0gZ2V0UGFkZGluZ1JpZ2h0V2l0aEZvcmVncm91bmQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbHAubGVmdE1hcmdpbiAtIGxwLnJpZ2h0TWFyZ2luKTsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGRXaWR0aE1lYXN1cmVTcGVjID0gVmlldy5NZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lkdGgsIFZpZXcuTWVhc3VyZVNwZWMuRVhBQ1RMWSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGRXaWR0aE1lYXN1cmVTcGVjID0gbUluc3RhbmNlLmdldENoaWxkTWVhc3VyZVNwZWMod2lkdGhNZWFzdXJlU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQYWRkaW5nTGVmdFdpdGhGb3JlZ3JvdW5kKCkgKyBnZXRQYWRkaW5nUmlnaHRXaXRoRm9yZWdyb3VuZCgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLmxlZnRNYXJnaW4gKyBscC5yaWdodE1hcmdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC53aWR0aCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IGNoaWxkSGVpZ2h0TWVhc3VyZVNwZWM7Ci0gICAgICAgICAgICAgICAgaWYgKGxwLmhlaWdodCA9PSBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBNYXRoLm1heCgwLCBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRIZWlnaHQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gZ2V0UGFkZGluZ1RvcFdpdGhGb3JlZ3JvdW5kKCkgLSBnZXRQYWRkaW5nQm90dG9tV2l0aEZvcmVncm91bmQoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbHAudG9wTWFyZ2luIC0gbHAuYm90dG9tTWFyZ2luKTsKLSAgICAgICAgICAgICAgICAgICAgY2hpbGRIZWlnaHRNZWFzdXJlU3BlYyA9IFZpZXcuTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlaWdodCwgVmlldy5NZWFzdXJlU3BlYy5FWEFDVExZKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjaGlsZEhlaWdodE1lYXN1cmVTcGVjID0gbUluc3RhbmNlLmdldENoaWxkTWVhc3VyZVNwZWMoaGVpZ2h0TWVhc3VyZVNwZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UGFkZGluZ1RvcFdpdGhGb3JlZ3JvdW5kKCkgKyBnZXRQYWRkaW5nQm90dG9tV2l0aEZvcmVncm91bmQoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC50b3BNYXJnaW4gKyBscC5ib3R0b21NYXJnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAuaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBjaGlsZC5tZWFzdXJlKGNoaWxkV2lkdGhNZWFzdXJlU3BlYywgY2hpbGRIZWlnaHRNZWFzdXJlU3BlYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkxheW91dF9pbXBsKGJvb2xlYW4gY2hhbmdlZCwgaW50IGxlZnQsIGludCB0b3AsIGludCByaWdodCwgaW50IGJvdHRvbSkgewotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtSW5zdGFuY2UuZ2V0Q2hpbGRDb3VudCgpOwotCi0gICAgICAgIGZpbmFsIGludCBwYXJlbnRMZWZ0ID0gZ2V0UGFkZGluZ0xlZnRXaXRoRm9yZWdyb3VuZCgpOwotICAgICAgICBmaW5hbCBpbnQgcGFyZW50UmlnaHQgPSByaWdodCAtIGxlZnQgLSBnZXRQYWRkaW5nUmlnaHRXaXRoRm9yZWdyb3VuZCgpOwotCi0gICAgICAgIGZpbmFsIGludCBwYXJlbnRUb3AgPSBnZXRQYWRkaW5nVG9wV2l0aEZvcmVncm91bmQoKTsKLSAgICAgICAgZmluYWwgaW50IHBhcmVudEJvdHRvbSA9IGJvdHRvbSAtIHRvcCAtIGdldFBhZGRpbmdCb3R0b21XaXRoRm9yZWdyb3VuZCgpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgZmluYWwgVmlldyBjaGlsZCA9IG1JbnN0YW5jZS5nZXRDaGlsZEF0KGkpOwotICAgICAgICAgICAgaWYgKGNoaWxkLmdldFZpc2liaWxpdHkoKSAhPSBWaWV3LkdPTkUpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBNYXJnaW5MYXlvdXRQYXJhbXMgbHAgPSAoTWFyZ2luTGF5b3V0UGFyYW1zKSBjaGlsZC5nZXRMYXlvdXRQYXJhbXMoKTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IGNoaWxkLmdldE1lYXN1cmVkV2lkdGgoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gY2hpbGQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKLQotICAgICAgICAgICAgICAgIGludCBjaGlsZExlZnQ7Ci0gICAgICAgICAgICAgICAgaW50IGNoaWxkVG9wOwotCi0gICAgICAgICAgICAgICAgY2hpbGRMZWZ0ID0gcGFyZW50TGVmdCArIChwYXJlbnRSaWdodCAtIHBhcmVudExlZnQgLSB3aWR0aCkgLyAyICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxwLmxlZnRNYXJnaW4gLSBscC5yaWdodE1hcmdpbjsKLQotICAgICAgICAgICAgICAgIGNoaWxkVG9wID0gcGFyZW50VG9wICsgKHBhcmVudEJvdHRvbSAtIHBhcmVudFRvcCAtIGhlaWdodCkgLyAyICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxwLnRvcE1hcmdpbiAtIGxwLmJvdHRvbU1hcmdpbjsKLQotICAgICAgICAgICAgICAgIGNoaWxkLmxheW91dChjaGlsZExlZnQsIGNoaWxkVG9wLCBjaGlsZExlZnQgKyB3aWR0aCwgY2hpbGRUb3AgKyBoZWlnaHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gc2hvdWxkRGVsYXlDaGlsZFByZXNzZWRTdGF0ZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0UGFkZGluZ0xlZnRXaXRoRm9yZWdyb3VuZCgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZS5pc0ZvcmVncm91bmRJbnNpZGVQYWRkaW5nKCkgPyBNYXRoLm1heChtSW5zdGFuY2UuZ2V0UGFkZGluZ0xlZnQoKSwgMCkgOgotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5nZXRQYWRkaW5nTGVmdCgpICsgMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRQYWRkaW5nUmlnaHRXaXRoRm9yZWdyb3VuZCgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZS5pc0ZvcmVncm91bmRJbnNpZGVQYWRkaW5nKCkgPyBNYXRoLm1heChtSW5zdGFuY2UuZ2V0UGFkZGluZ1JpZ2h0KCksIDApIDoKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UuZ2V0UGFkZGluZ1JpZ2h0KCkgKyAwOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldFBhZGRpbmdUb3BXaXRoRm9yZWdyb3VuZCgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZS5pc0ZvcmVncm91bmRJbnNpZGVQYWRkaW5nKCkgPyBNYXRoLm1heChtSW5zdGFuY2UuZ2V0UGFkZGluZ1RvcCgpLCAwKSA6Ci0gICAgICAgICAgICAgICAgbUluc3RhbmNlLmdldFBhZGRpbmdUb3AoKSArIDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0UGFkZGluZ0JvdHRvbVdpdGhGb3JlZ3JvdW5kKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlLmlzRm9yZWdyb3VuZEluc2lkZVBhZGRpbmcoKSA/IE1hdGgubWF4KG1JbnN0YW5jZS5nZXRQYWRkaW5nQm90dG9tKCksIDApIDoKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UuZ2V0UGFkZGluZ0JvdHRvbSgpICsgMDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9NZWRpYUNvbnRyb2xWaWV3MkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L01lZGlhQ29udHJvbFZpZXcySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWZmMTUwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L01lZGlhQ29udHJvbFZpZXcySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTcyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYUNvbnRyb2xsZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhQ29udHJvbFZpZXcyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVmlld0dyb3VwUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJhc2VBZGFwdGVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkJ1dHRvbjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZUJ1dHRvbjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lkxpc3RWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0Lk1lZGlhQ29udHJvbFZpZXcyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlByb2dyZXNzQmFyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlBvcHVwV2luZG93OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlJlbGF0aXZlTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlNlZWtCYXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Vla0Jhci5PblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLlI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuTWVkaWFSb3V0ZUJ1dHRvbjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Gb3JtYXR0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLQotcHVibGljIGNsYXNzIE1lZGlhQ29udHJvbFZpZXcySW1wbCBleHRlbmRzIEJhc2VMYXlvdXQgaW1wbGVtZW50cyBNZWRpYUNvbnRyb2xWaWV3MlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhQ29udHJvbFZpZXcyIjsKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFDb250cm9sVmlldzIgbUluc3RhbmNlOwotCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdVTUVOVF9LRVlfRlVMTFNDUkVFTiA9ICJmdWxsU2NyZWVuIjsKLQotICAgIC8vIFRPRE86IE1vdmUgdGhlc2UgY29uc3RhbnRzIHRvIHB1YmxpYyBhcGkgdG8gc3VwcG9ydCBjdXN0b20gdmlkZW8gdmlldy4KLSAgICAvLyBUT0RPOiBDb21iaW5lIHRoZXNlIGNvbnN0YW50cyBpbnRvIG9uZSByZWdhcmRpbmcgVHJhY2tJbmZvLgotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZJREVPX1RSQUNLX0NPVU5UID0gIlZpZGVvVHJhY2tDb3VudCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQVVESU9fVFJBQ0tfQ09VTlQgPSAiQXVkaW9UcmFja0NvdW50IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TVUJUSVRMRV9UUkFDS19DT1VOVCA9ICJTdWJ0aXRsZVRyYWNrQ291bnQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BMQVlCQUNLX1NQRUVEID0gIlBsYXliYWNrU3BlZWQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NFTEVDVEVEX0FVRElPX0lOREVYID0gIlNlbGVjdGVkQXVkaW9JbmRleCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VMRUNURURfU1VCVElUTEVfSU5ERVggPSAiU2VsZWN0ZWRTdWJ0aXRsZUluZGV4IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX1VQREFURV9UUkFDS19TVEFUVVMgPSAiVXBkYXRlVHJhY2tTdGF0dXMiOwotCi0gICAgLy8gVE9ETzogUmVtb3ZlIHRoaXMgb25jZSBpbnRlZ3JhdGluZyB3aXRoIE1lZGlhU2Vzc2lvbjIgJiBNZWRpYU1ldGFkYXRhMgotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NUQVRFX0lTX0FEVkVSVElTRU1FTlQgPSAiTWVkaWFUeXBlQWR2ZXJ0aXNlbWVudCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBFVkVOVF9VUERBVEVfTUVESUFfVFlQRV9TVEFUVVMgPSAiVXBkYXRlTWVkaWFUeXBlU3RhdHVzIjsKLQotICAgIC8vIFN0cmluZyBmb3Igc2VuZGluZyBjb21tYW5kIHRvIHNob3cgc3VidGl0bGUgdG8gTWVkaWFTZXNzaW9uLgotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9TSE9XX1NVQlRJVExFID0gInNob3dTdWJ0aXRsZSI7Ci0gICAgLy8gU3RyaW5nIGZvciBzZW5kaW5nIGNvbW1hbmQgdG8gaGlkZSBzdWJ0aXRsZSB0byBNZWRpYVNlc3Npb24uCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX0hJREVfU1VCVElUTEUgPSAiaGlkZVN1YnRpdGxlIjsKLSAgICAvLyBUT0RPOiByZW1vdmUgb25jZSB0aGUgaW1wbGVtZW50YXRpb24gaXMgcmV2aXNlZAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfU0VUX0ZVTExTQ1JFRU4gPSAic2V0RnVsbHNjcmVlbiI7Ci0gICAgLy8gU3RyaW5nIGZvciBzZW5kaW5nIGNvbW1hbmQgdG8gc2VsZWN0IGF1ZGlvIHRyYWNrIHRvIE1lZGlhU2Vzc2lvbi4KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfU0VMRUNUX0FVRElPX1RSQUNLID0gIlNlbGVjdFRyYWNrIjsKLSAgICAvLyBTdHJpbmcgZm9yIHNlbmRpbmcgY29tbWFuZCB0byBzZXQgcGxheWJhY2sgc3BlZWQgdG8gTWVkaWFTZXNzaW9uLgotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9TRVRfUExBWUJBQ0tfU1BFRUQgPSAiU2V0UGxheWJhY2tTcGVlZCI7Ci0gICAgLy8gU3RyaW5nIGZvciBzZW5kaW5nIGNvbW1hbmQgdG8gbXV0ZSBhdWRpbyB0byBNZWRpYVNlc3Npb24uCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX01VVEU9ICJNdXRlIjsKLSAgICAvLyBTdHJpbmcgZm9yIHNlbmRpbmcgY29tbWFuZCB0byB1bm11dGUgYXVkaW8gdG8gTWVkaWFTZXNzaW9uLgotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9VTk1VVEUgPSAiVW5tdXRlIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRUSU5HU19NT0RFX0FVRElPX1RSQUNLID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUVElOR1NfTU9ERV9QTEFZQkFDS19TUEVFRCA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVFRJTkdTX01PREVfSEVMUCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVFRJTkdTX01PREVfU1VCVElUTEVfVFJBQ0sgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRUSU5HU19NT0RFX1ZJREVPX1FVQUxJVFkgPSA0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRUSU5HU19NT0RFX01BSU4gPSA1OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TUEVFRF8xeF9JTkRFWCA9IDM7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfVFlQRV9ERUZBVUxUID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfVFlQRV9NVVNJQyA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1FRElBX1RZUEVfQURWRVJUSVNFTUVOVCA9IDI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX0VNQkVEREVEID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX0ZVTEwgPSAxOwotICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBNaW5pbWFsIHNpemUgdHlwZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX01JTklNQUwgPSAyOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9QUk9HUkVTUyA9IDEwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUFJPR1JFU1NfVVBEQVRFX1RJTUVfTVMgPSAxMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVdJTkRfVElNRV9NUyA9IDEwMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGT1JXQVJEX1RJTUVfTVMgPSAzMDAwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQURfU0tJUF9XQUlUX1RJTUVfTVMgPSA1MDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRVNPVVJDRV9OT05fRVhJU1RFTlQgPSAtMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUkVTT1VSQ0VfRU1QVFkgPSAiIjsKLQotICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXNvdXJjZXM7Ci0gICAgcHJpdmF0ZSBNZWRpYUNvbnRyb2xsZXIgbUNvbnRyb2xsZXI7Ci0gICAgcHJpdmF0ZSBNZWRpYUNvbnRyb2xsZXIuVHJhbnNwb3J0Q29udHJvbHMgbUNvbnRyb2xzOwotICAgIHByaXZhdGUgUGxheWJhY2tTdGF0ZSBtUGxheWJhY2tTdGF0ZTsKLSAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGEgbU1ldGFkYXRhOwotICAgIHByaXZhdGUgaW50IG1EdXJhdGlvbjsKLSAgICBwcml2YXRlIGludCBtUHJldlN0YXRlOwotICAgIHByaXZhdGUgaW50IG1QcmV2V2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbVByZXZIZWlnaHQ7Ci0gICAgcHJpdmF0ZSBpbnQgbU9yaWdpbmFsTGVmdEJhcldpZHRoOwotICAgIHByaXZhdGUgaW50IG1WaWRlb1RyYWNrQ291bnQ7Ci0gICAgcHJpdmF0ZSBpbnQgbUF1ZGlvVHJhY2tDb3VudDsKLSAgICBwcml2YXRlIGludCBtU3VidGl0bGVUcmFja0NvdW50OwotICAgIHByaXZhdGUgaW50IG1TZXR0aW5nc01vZGU7Ci0gICAgcHJpdmF0ZSBpbnQgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4OwotICAgIHByaXZhdGUgaW50IG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleDsKLSAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRWaWRlb1F1YWxpdHlJbmRleDsKLSAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRTcGVlZEluZGV4OwotICAgIHByaXZhdGUgaW50IG1FbWJlZGRlZFNldHRpbmdzSXRlbVdpZHRoOwotICAgIHByaXZhdGUgaW50IG1GdWxsU2V0dGluZ3NJdGVtV2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbUVtYmVkZGVkU2V0dGluZ3NJdGVtSGVpZ2h0OwotICAgIHByaXZhdGUgaW50IG1GdWxsU2V0dGluZ3NJdGVtSGVpZ2h0OwotICAgIHByaXZhdGUgaW50IG1TZXR0aW5nc1dpbmRvd01hcmdpbjsKLSAgICBwcml2YXRlIGludCBtTWVkaWFUeXBlOwotICAgIHByaXZhdGUgaW50IG1TaXplVHlwZTsKLSAgICBwcml2YXRlIGxvbmcgbVBsYXliYWNrQWN0aW9uczsKLSAgICBwcml2YXRlIGJvb2xlYW4gbURyYWdnaW5nOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNGdWxsU2NyZWVuOwotICAgIHByaXZhdGUgYm9vbGVhbiBtT3ZlcmZsb3dFeHBhbmRlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzU3RvcHBlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVN1YnRpdGxlSXNFbmFibGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBtU2Vla0F2YWlsYWJsZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzQWR2ZXJ0aXNlbWVudDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzTXV0ZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbU5lZWRVWFVwZGF0ZTsKLQotICAgIC8vIFJlbGF0aW5nIHRvIFRpdGxlIEJhciBWaWV3Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbVJvb3Q7Ci0gICAgcHJpdmF0ZSBWaWV3IG1UaXRsZUJhcjsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1UaXRsZVZpZXc7Ci0gICAgcHJpdmF0ZSBWaWV3IG1BZEV4dGVybmFsTGluazsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1CYWNrQnV0dG9uOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZUJ1dHRvbiBtUm91dGVCdXR0b247Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVJvdXRlU2VsZWN0b3I7Ci0KLSAgICAvLyBSZWxhdGluZyB0byBDZW50ZXIgVmlldwotICAgIHByaXZhdGUgVmlld0dyb3VwIG1DZW50ZXJWaWV3OwotICAgIHByaXZhdGUgVmlldyBtVHJhbnNwb3J0Q29udHJvbHM7Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtUGxheVBhdXNlQnV0dG9uOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbUZmd2RCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtUmV3QnV0dG9uOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbU5leHRCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtUHJldkJ1dHRvbjsKLQotICAgIC8vIFJlbGF0aW5nIHRvIE1pbmltYWwgRXh0cmEgVmlldwotICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1NaW5pbWFsRXh0cmFWaWV3OwotCi0gICAgLy8gUmVsYXRpbmcgdG8gUHJvZ3Jlc3MgQmFyIFZpZXcKLSAgICBwcml2YXRlIFByb2dyZXNzQmFyIG1Qcm9ncmVzczsKLSAgICBwcml2YXRlIFZpZXcgbVByb2dyZXNzQnVmZmVyOwotCi0gICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhciBWaWV3Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUJvdHRvbUJhcjsKLQotICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIgTGVmdCBWaWV3Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUJvdHRvbUJhckxlZnRWaWV3OwotICAgIHByaXZhdGUgVmlld0dyb3VwIG1UaW1lVmlldzsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1FbmRUaW1lOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbUN1cnJlbnRUaW1lOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbUFkU2tpcFZpZXc7Ci0gICAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIG1Gb3JtYXRCdWlsZGVyOwotICAgIHByaXZhdGUgRm9ybWF0dGVyIG1Gb3JtYXR0ZXI7Ci0KLSAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyIFJpZ2h0IFZpZXcKLSAgICBwcml2YXRlIFZpZXdHcm91cCBtQm90dG9tQmFyUmlnaHRWaWV3OwotICAgIHByaXZhdGUgVmlld0dyb3VwIG1CYXNpY0NvbnRyb2xzOwotICAgIHByaXZhdGUgVmlld0dyb3VwIG1FeHRyYUNvbnRyb2xzOwotICAgIHByaXZhdGUgVmlld0dyb3VwIG1DdXN0b21CdXR0b25zOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbVN1YnRpdGxlQnV0dG9uOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbUZ1bGxTY3JlZW5CdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtT3ZlcmZsb3dCdXR0b25SaWdodDsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1PdmVyZmxvd0J1dHRvbkxlZnQ7Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtTXV0ZUJ1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1WaWRlb1F1YWxpdHlCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtU2V0dGluZ3NCdXR0b247Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtQWRSZW1haW5pbmdWaWV3OwotCi0gICAgLy8gUmVsYXRpbmcgdG8gU2V0dGluZ3MgTGlzdCBWaWV3Ci0gICAgcHJpdmF0ZSBMaXN0VmlldyBtU2V0dGluZ3NMaXN0VmlldzsKLSAgICBwcml2YXRlIFBvcHVwV2luZG93IG1TZXR0aW5nc1dpbmRvdzsKLSAgICBwcml2YXRlIFNldHRpbmdzQWRhcHRlciBtU2V0dGluZ3NBZGFwdGVyOwotICAgIHByaXZhdGUgU3ViU2V0dGluZ3NBZGFwdGVyIG1TdWJTZXR0aW5nc0FkYXB0ZXI7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVNldHRpbmdzTWFpblRleHRzTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtU2V0dGluZ3NTdWJUZXh0c0xpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PEludGVnZXI+IG1TZXR0aW5nc0ljb25JZHNMaXN0OwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1TdWJ0aXRsZURlc2NyaXB0aW9uc0xpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbUF1ZGlvVHJhY2tMaXN0OwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1WaWRlb1F1YWxpdHlMaXN0OwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1QbGF5YmFja1NwZWVkVGV4dExpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PEZsb2F0PiBtUGxheWJhY2tTcGVlZExpc3Q7Ci0KLSAgICBwdWJsaWMgTWVkaWFDb250cm9sVmlldzJJbXBsKE1lZGlhQ29udHJvbFZpZXcyIGluc3RhbmNlLAotICAgICAgICAgICAgVmlld0dyb3VwUHJvdmlkZXIgc3VwZXJQcm92aWRlciwgVmlld0dyb3VwUHJvdmlkZXIgcHJpdmF0ZVByb3ZpZGVyKSB7Ci0gICAgICAgIHN1cGVyKGluc3RhbmNlLCBzdXBlclByb3ZpZGVyLCBwcml2YXRlUHJvdmlkZXIpOwotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKEBOdWxsYWJsZSBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICBtUmVzb3VyY2VzID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgLy8gSW5mbGF0ZSBNZWRpYUNvbnRyb2xWaWV3MiBmcm9tIFhNTAotICAgICAgICBtUm9vdCA9IG1ha2VDb250cm9sbGVyVmlldygpOwotICAgICAgICBtSW5zdGFuY2UuYWRkVmlldyhtUm9vdCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFTZXNzaW9uVG9rZW5faW1wbChTZXNzaW9uVG9rZW4yIHRva2VuKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T25GdWxsU2NyZWVuTGlzdGVuZXJfaW1wbChNZWRpYUNvbnRyb2xWaWV3Mi5PbkZ1bGxTY3JlZW5MaXN0ZW5lciBsKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Q29udHJvbGxlcl9pbXBsKE1lZGlhQ29udHJvbGxlciBjb250cm9sbGVyKSB7Ci0gICAgICAgIG1Db250cm9sbGVyID0gY29udHJvbGxlcjsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNvbnRyb2xzID0gY29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpOwotICAgICAgICAgICAgLy8gU2V0IG1NZXRhZGF0YSBhbmQgbVBsYXliYWNrU3RhdGUgdG8gZXhpc3RpbmcgTWVkaWFTZXNzaW9uIHZhcmlhYmxlcyBzaW5jZSB0aGV5IG1heQotICAgICAgICAgICAgLy8gYmUgY2FsbGVkIGJlZm9yZSB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkCi0gICAgICAgICAgICBtUGxheWJhY2tTdGF0ZSA9IG1Db250cm9sbGVyLmdldFBsYXliYWNrU3RhdGUoKTsKLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1Db250cm9sbGVyLmdldE1ldGFkYXRhKCk7Ci0gICAgICAgICAgICB1cGRhdGVEdXJhdGlvbigpOwotICAgICAgICAgICAgdXBkYXRlVGl0bGUoKTsKLQotICAgICAgICAgICAgbUNvbnRyb2xsZXIucmVnaXN0ZXJDYWxsYmFjayhuZXcgTWVkaWFDb250cm9sbGVyQ2FsbGJhY2soKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRCdXR0b25WaXNpYmlsaXR5X2ltcGwoaW50IGJ1dHRvbiwgaW50IHZpc2liaWxpdHkpIHsKLSAgICAgICAgLy8gVE9ETzogYWRkIG1lbWJlciB2YXJpYWJsZXMgZm9yIEZhc3QtRm9yd2FyZC9QcnZpb3VzL1Jld2luZCBidXR0b25zIHRvIHNhdmUgdmlzaWJpbGl0eSBpbgotICAgICAgICAvLyBvcmRlciB0byBwcmV2ZW50IGJlaW5nIG92ZXJyaWRlbiBpbnNpZGUgdXBkYXRlTGF5b3V0KCkuCi0gICAgICAgIHN3aXRjaCAoYnV0dG9uKSB7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9QTEFZX1BBVVNFOgotICAgICAgICAgICAgICAgIGlmIChtUGxheVBhdXNlQnV0dG9uICE9IG51bGwgJiYgY2FuUGF1c2UoKSkgewotICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fRkZXRDoKLSAgICAgICAgICAgICAgICBpZiAobUZmd2RCdXR0b24gIT0gbnVsbCAmJiBjYW5TZWVrRm9yd2FyZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fUkVXOgotICAgICAgICAgICAgICAgIGlmIChtUmV3QnV0dG9uICE9IG51bGwgJiYgY2FuU2Vla0JhY2t3YXJkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX05FWFQ6Ci0gICAgICAgICAgICAgICAgaWYgKG1OZXh0QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9QUkVWOgotICAgICAgICAgICAgICAgIGlmIChtUHJldkJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmV2QnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fU1VCVElUTEU6Ci0gICAgICAgICAgICAgICAgaWYgKG1TdWJ0aXRsZUJ1dHRvbiAhPSBudWxsICYmIG1TdWJ0aXRsZVRyYWNrQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX0ZVTExfU0NSRUVOOgotICAgICAgICAgICAgICAgIGlmIChtRnVsbFNjcmVlbkJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fT1ZFUkZMT1c6Ci0gICAgICAgICAgICAgICAgaWYgKG1PdmVyZmxvd0J1dHRvblJpZ2h0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbU92ZXJmbG93QnV0dG9uUmlnaHQuc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9NVVRFOgotICAgICAgICAgICAgICAgIGlmIChtTXV0ZUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NdXRlQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fU0VUVElOR1M6Ci0gICAgICAgICAgICAgICAgaWYgKG1TZXR0aW5nc0J1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc0J1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZXF1ZXN0UGxheUJ1dHRvbkZvY3VzX2ltcGwoKSB7Ci0gICAgICAgIGlmIChtUGxheVBhdXNlQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24ucmVxdWVzdEZvY3VzKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldEFjY2Vzc2liaWxpdHlDbGFzc05hbWVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIE1lZGlhQ29udHJvbFZpZXcyLmNsYXNzLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gVE9ETzogU2hvdWxkIHRoaXMgZnVuY3Rpb24gYmUgcmVtb3ZlZD8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRyYWNrYmFsbEV2ZW50X2ltcGwoTW90aW9uRXZlbnQgZXYpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uTWVhc3VyZV9pbXBsKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgc3VwZXIub25NZWFzdXJlX2ltcGwod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOwotCi0gICAgICAgIC8vIFVwZGF0ZSBsYXlvdXQgd2hlbiB0aGlzIHZpZXcncyB3aWR0aCBjaGFuZ2VzIGluIG9yZGVyIHRvIGF2b2lkIGFueSBVSSBvdmVybGFwIGJldHdlZW4KLSAgICAgICAgLy8gdHJhbnNwb3J0IGNvbnRyb2xzLgotICAgICAgICBpZiAobVByZXZXaWR0aCAhPSBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRXaWR0aCgpCi0gICAgICAgICAgICAgICAgfHwgbVByZXZIZWlnaHQgIT0gbUluc3RhbmNlLmdldE1lYXN1cmVkSGVpZ2h0KCkgfHwgbU5lZWRVWFVwZGF0ZSkgewotICAgICAgICAgICAgLy8gRGlzbWlzcyBTZXR0aW5nc1dpbmRvdyBpZiBpdCBpcyBzaG93aW5nLgotICAgICAgICAgICAgbVNldHRpbmdzV2luZG93LmRpc21pc3MoKTsKLQotICAgICAgICAgICAgLy8gVGhlc2Ugdmlld3MgbWF5IG5vdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgeWV0LgotICAgICAgICAgICAgaWYgKG1UcmFuc3BvcnRDb250cm9scy5nZXRXaWR0aCgpID09IDAgfHwgbVRpbWVWaWV3LmdldFdpZHRoKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IGN1cnJXaWR0aCA9IG1JbnN0YW5jZS5nZXRNZWFzdXJlZFdpZHRoKCk7Ci0gICAgICAgICAgICBpbnQgY3VyckhlaWdodCA9IG1JbnN0YW5jZS5nZXRNZWFzdXJlZEhlaWdodCgpOwotICAgICAgICAgICAgV2luZG93TWFuYWdlciBtYW5hZ2VyID0gKFdpbmRvd01hbmFnZXIpIG1JbnN0YW5jZS5nZXRDb250ZXh0KCkuZ2V0QXBwbGljYXRpb25Db250ZXh0KCkKLSAgICAgICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5XSU5ET1dfU0VSVklDRSk7Ci0gICAgICAgICAgICBQb2ludCBzY3JlZW5TaXplID0gbmV3IFBvaW50KCk7Ci0gICAgICAgICAgICBtYW5hZ2VyLmdldERlZmF1bHREaXNwbGF5KCkuZ2V0U2l6ZShzY3JlZW5TaXplKTsKLSAgICAgICAgICAgIGludCBzY3JlZW5XaWR0aCA9IHNjcmVlblNpemUueDsKLSAgICAgICAgICAgIGludCBzY3JlZW5IZWlnaHQgPSBzY3JlZW5TaXplLnk7Ci0gICAgICAgICAgICBpbnQgZnVsbEljb25TaXplID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi5tY3YyX2Z1bGxfaWNvbl9zaXplKTsKLSAgICAgICAgICAgIGludCBlbWJlZGRlZEljb25TaXplID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgICAgIFIuZGltZW4ubWN2Ml9lbWJlZGRlZF9pY29uX3NpemUpOwotICAgICAgICAgICAgaW50IG1hcmdpblNpemUgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLm1jdjJfaWNvbl9tYXJnaW4pOwotCi0gICAgICAgICAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgQWR2ZXJ0aXNlbWVudCBNb2RlLgotICAgICAgICAgICAgaWYgKG1NZWRpYVR5cGUgPT0gTUVESUFfVFlQRV9ERUZBVUxUKSB7Ci0gICAgICAgICAgICAgICAgLy8gTWF4IG51bWJlciBvZiBpY29ucyBpbnNpZGUgQm90dG9tQmFyUmlnaHRWaWV3IGZvciBNdXNpYyBtb2RlIGlzIDQuCi0gICAgICAgICAgICAgICAgaW50IG1heEljb25Db3VudCA9IDQ7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0KG1heEljb25Db3VudCwgZnVsbEljb25TaXplLCBlbWJlZGRlZEljb25TaXplLCBtYXJnaW5TaXplLCBjdXJyV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJySGVpZ2h0LCBzY3JlZW5XaWR0aCwgc2NyZWVuSGVpZ2h0KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobU1lZGlhVHlwZSA9PSBNRURJQV9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1OZWVkVVhVcGRhdGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gT25lLXRpbWUgb3BlcmF0aW9uIGZvciBNdXNpYyBtZWRpYSB0eXBlCi0gICAgICAgICAgICAgICAgICAgIG1CYXNpY0NvbnRyb2xzLnJlbW92ZVZpZXcobU11dGVCdXR0b24pOwotICAgICAgICAgICAgICAgICAgICBtRXh0cmFDb250cm9scy5hZGRWaWV3KG1NdXRlQnV0dG9uLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvUXVhbGl0eUJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRmZ3ZEJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1SZXdCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbU5lZWRVWFVwZGF0ZSA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgLy8gTWF4IG51bWJlciBvZiBpY29ucyBpbnNpZGUgQm90dG9tQmFyUmlnaHRWaWV3IGZvciBNdXNpYyBtb2RlIGlzIDMuCi0gICAgICAgICAgICAgICAgaW50IG1heEljb25Db3VudCA9IDM7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0KG1heEljb25Db3VudCwgZnVsbEljb25TaXplLCBlbWJlZGRlZEljb25TaXplLCBtYXJnaW5TaXplLCBjdXJyV2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJySGVpZ2h0LCBzY3JlZW5XaWR0aCwgc2NyZWVuSGVpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1QcmV2V2lkdGggPSBjdXJyV2lkdGg7Ci0gICAgICAgICAgICBtUHJldkhlaWdodCA9IGN1cnJIZWlnaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETzogbW92ZSB0aGlzIHRvIGEgZGlmZmVyZW50IGxvY2F0aW9uLgotICAgICAgICAvLyBVcGRhdGUgdGl0bGUgYmFyIHBhcmFtZXRlcnMgaW4gb3JkZXIgdG8gYXZvaWQgb3ZlcmxhcCBiZXR3ZWVuIHRpdGxlIHZpZXcgYW5kIHRoZSByaWdodAotICAgICAgICAvLyBzaWRlIG9mIHRoZSB0aXRsZSBiYXIuCi0gICAgICAgIHVwZGF0ZVRpdGxlQmFyTGF5b3V0KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZF9pbXBsKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICBzdXBlci5zZXRFbmFibGVkX2ltcGwoZW5hYmxlZCk7Ci0KLSAgICAgICAgLy8gVE9ETzogTWVyZ2UgdGhlIGJlbG93IGNvZGUgd2l0aCBkaXNhYmxlVW5zdXBwb3J0ZWRCdXR0b25zKCkuCi0gICAgICAgIGlmIChtUGxheVBhdXNlQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUZmd2RCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVJld0J1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUmV3QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1OZXh0QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1QcmV2QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QcmV2QnV0dG9uLnNldEVuYWJsZWQoZW5hYmxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Qcm9ncmVzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUHJvZ3Jlc3Muc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICBkaXNhYmxlVW5zdXBwb3J0ZWRCdXR0b25zKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25WaXNpYmlsaXR5QWdncmVnYXRlZF9pbXBsKGJvb2xlYW4gaXNWaXNpYmxlKSB7Ci0gICAgICAgIHN1cGVyLm9uVmlzaWJpbGl0eUFnZ3JlZ2F0ZWRfaW1wbChpc1Zpc2libGUpOwotCi0gICAgICAgIGlmIChpc1Zpc2libGUpIHsKLSAgICAgICAgICAgIGRpc2FibGVVbnN1cHBvcnRlZEJ1dHRvbnMoKTsKLSAgICAgICAgICAgIG1JbnN0YW5jZS5yZW1vdmVDYWxsYmFja3MobVVwZGF0ZVByb2dyZXNzKTsKLSAgICAgICAgICAgIG1JbnN0YW5jZS5wb3N0KG1VcGRhdGVQcm9ncmVzcyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UucmVtb3ZlQ2FsbGJhY2tzKG1VcGRhdGVQcm9ncmVzcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSb3V0ZVNlbGVjdG9yKE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgewotICAgICAgICBtUm91dGVTZWxlY3RvciA9IHNlbGVjdG9yOwotICAgICAgICBpZiAobVJvdXRlU2VsZWN0b3IgIT0gbnVsbCAmJiAhbVJvdXRlU2VsZWN0b3IuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBtUm91dGVCdXR0b24uc2V0Um91dGVTZWxlY3RvcihzZWxlY3RvciwgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOKTsKLSAgICAgICAgICAgIG1Sb3V0ZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUm91dGVCdXR0b24uc2V0Um91dGVTZWxlY3RvcihNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFkpOwotICAgICAgICAgICAgbVJvdXRlQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIFByb3RlY3RlZCBvciBwcml2YXRlIG1ldGhvZHMKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1BsYXlpbmcoKSB7Ci0gICAgICAgIGlmIChtUGxheWJhY2tTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrU3RhdGUuZ2V0U3RhdGUoKSA9PSBQbGF5YmFja1N0YXRlLlNUQVRFX1BMQVlJTkc7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldEN1cnJlbnRQb3NpdGlvbigpIHsKLSAgICAgICAgbVBsYXliYWNrU3RhdGUgPSBtQ29udHJvbGxlci5nZXRQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgIGlmIChtUGxheWJhY2tTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gKGludCkgbVBsYXliYWNrU3RhdGUuZ2V0UG9zaXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRCdWZmZXJQZXJjZW50YWdlKCkgewotICAgICAgICBpZiAobUR1cmF0aW9uID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIG1QbGF5YmFja1N0YXRlID0gbUNvbnRyb2xsZXIuZ2V0UGxheWJhY2tTdGF0ZSgpOwotICAgICAgICBpZiAobVBsYXliYWNrU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgbG9uZyBidWZmZXJlZFBvcyA9IG1QbGF5YmFja1N0YXRlLmdldEJ1ZmZlcmVkUG9zaXRpb24oKTsKLSAgICAgICAgICAgIHJldHVybiAoYnVmZmVyZWRQb3MgPT0gLTEpID8gLTEgOiAoaW50KSAoYnVmZmVyZWRQb3MgKiAxMDAgLyBtRHVyYXRpb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjYW5QYXVzZSgpIHsKLSAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAobVBsYXliYWNrU3RhdGUuZ2V0QWN0aW9ucygpICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUEFVU0UpICE9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNhblNlZWtCYWNrd2FyZCgpIHsKLSAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAobVBsYXliYWNrU3RhdGUuZ2V0QWN0aW9ucygpICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUkVXSU5EKSAhPSAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBjYW5TZWVrRm9yd2FyZCgpIHsKLSAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAobVBsYXliYWNrU3RhdGUuZ2V0QWN0aW9ucygpICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fRkFTVF9GT1JXQVJEKSAhPSAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSB0aGUgdmlldyB0aGF0IGhvbGRzIHRoZSB3aWRnZXRzIHRoYXQgY29udHJvbCBwbGF5YmFjay4KLSAgICAgKiBEZXJpdmVkIGNsYXNzZXMgY2FuIG92ZXJyaWRlIHRoaXMgdG8gY3JlYXRlIHRoZWlyIG93bi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNvbnRyb2xsZXIgdmlldy4KLSAgICAgKiBAaGlkZSBUaGlzIGRvZXNuJ3Qgd29yayBhcyBhZHZlcnRpc2VkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIFZpZXdHcm91cCBtYWtlQ29udHJvbGxlclZpZXcoKSB7Ci0gICAgICAgIFZpZXdHcm91cCByb290ID0gKFZpZXdHcm91cCkgQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICBSLmxheW91dC5tZWRpYV9jb250cm9sbGVyKTsKLSAgICAgICAgaW5pdENvbnRyb2xsZXJWaWV3KHJvb3QpOwotICAgICAgICByZXR1cm4gcm9vdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdENvbnRyb2xsZXJWaWV3KFZpZXdHcm91cCB2KSB7Ci0gICAgICAgIC8vIFJlbGF0aW5nIHRvIFRpdGxlIEJhciBWaWV3Ci0gICAgICAgIG1UaXRsZUJhciA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGl0bGVfYmFyKTsKLSAgICAgICAgbVRpdGxlVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGl0bGVfdGV4dCk7Ci0gICAgICAgIG1BZEV4dGVybmFsTGluayA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYWRfZXh0ZXJuYWxfbGluayk7Ci0gICAgICAgIG1CYWNrQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5iYWNrKTsKLSAgICAgICAgaWYgKG1CYWNrQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1CYWNrQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtQmFja0xpc3RlbmVyKTsKLSAgICAgICAgICAgIG1CYWNrQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotICAgICAgICBtUm91dGVCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLmNhc3QpOwotCi0gICAgICAgIC8vIFJlbGF0aW5nIHRvIENlbnRlciBWaWV3Ci0gICAgICAgIG1DZW50ZXJWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC5jZW50ZXJfdmlldyk7Ci0gICAgICAgIG1UcmFuc3BvcnRDb250cm9scyA9IGluZmxhdGVUcmFuc3BvcnRDb250cm9scyhSLmxheW91dC5lbWJlZGRlZF90cmFuc3BvcnRfY29udHJvbHMpOwotICAgICAgICBtQ2VudGVyVmlldy5hZGRWaWV3KG1UcmFuc3BvcnRDb250cm9scyk7Ci0KLSAgICAgICAgLy8gUmVsYXRpbmcgdG8gTWluaW1hbCBFeHRyYSBWaWV3Ci0gICAgICAgIG1NaW5pbWFsRXh0cmFWaWV3ID0gKExpbmVhckxheW91dCkgdi5maW5kVmlld0J5SWQoUi5pZC5taW5pbWFsX2V4dHJhX3ZpZXcpOwotICAgICAgICBMaW5lYXJMYXlvdXQuTGF5b3V0UGFyYW1zIHBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgKExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMpIG1NaW5pbWFsRXh0cmFWaWV3LmdldExheW91dFBhcmFtcygpOwotICAgICAgICBpbnQgaWNvblNpemUgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLm1jdjJfZW1iZWRkZWRfaWNvbl9zaXplKTsKLSAgICAgICAgaW50IG1hcmdpblNpemUgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLm1jdjJfaWNvbl9tYXJnaW4pOwotICAgICAgICBwYXJhbXMuc2V0TWFyZ2lucygwLCAoaWNvblNpemUgKyBtYXJnaW5TaXplICogMikgKiAoLTEpLCAwLCAwKTsKLSAgICAgICAgbU1pbmltYWxFeHRyYVZpZXcuc2V0TGF5b3V0UGFyYW1zKHBhcmFtcyk7Ci0gICAgICAgIG1NaW5pbWFsRXh0cmFWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICAvLyBSZWxhdGluZyB0byBQcm9ncmVzcyBCYXIgVmlldwotICAgICAgICBtUHJvZ3Jlc3MgPSB2LmZpbmRWaWV3QnlJZChSLmlkLnByb2dyZXNzKTsKLSAgICAgICAgaWYgKG1Qcm9ncmVzcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobVByb2dyZXNzIGluc3RhbmNlb2YgU2Vla0JhcikgewotICAgICAgICAgICAgICAgIFNlZWtCYXIgc2Vla2VyID0gKFNlZWtCYXIpIG1Qcm9ncmVzczsKLSAgICAgICAgICAgICAgICBzZWVrZXIuc2V0T25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIobVNlZWtMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgc2Vla2VyLnNldFByb2dyZXNzRHJhd2FibGUobVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmN1c3RvbV9wcm9ncmVzcykpOwotICAgICAgICAgICAgICAgIHNlZWtlci5zZXRUaHVtYihtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuY3VzdG9tX3Byb2dyZXNzX3RodW1iKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUHJvZ3Jlc3Muc2V0TWF4KE1BWF9QUk9HUkVTUyk7Ci0gICAgICAgIH0KLSAgICAgICAgbVByb2dyZXNzQnVmZmVyID0gdi5maW5kVmlld0J5SWQoUi5pZC5wcm9ncmVzc19idWZmZXIpOwotCi0gICAgICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIgVmlldwotICAgICAgICBtQm90dG9tQmFyID0gdi5maW5kVmlld0J5SWQoUi5pZC5ib3R0b21fYmFyKTsKLQotICAgICAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyIExlZnQgVmlldwotICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmJvdHRvbV9iYXJfbGVmdCk7Ci0gICAgICAgIG1UaW1lVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGltZSk7Ci0gICAgICAgIG1FbmRUaW1lID0gdi5maW5kVmlld0J5SWQoUi5pZC50aW1lX2VuZCk7Ci0gICAgICAgIG1DdXJyZW50VGltZSA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGltZV9jdXJyZW50KTsKLSAgICAgICAgbUFkU2tpcFZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmFkX3NraXBfdGltZSk7Ci0gICAgICAgIG1Gb3JtYXRCdWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgbUZvcm1hdHRlciA9IG5ldyBGb3JtYXR0ZXIobUZvcm1hdEJ1aWxkZXIsIExvY2FsZS5nZXREZWZhdWx0KCkpOwotCi0gICAgICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIgUmlnaHQgVmlldwotICAgICAgICBtQm90dG9tQmFyUmlnaHRWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC5ib3R0b21fYmFyX3JpZ2h0KTsKLSAgICAgICAgbUJhc2ljQ29udHJvbHMgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmJhc2ljX2NvbnRyb2xzKTsKLSAgICAgICAgbUV4dHJhQ29udHJvbHMgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmV4dHJhX2NvbnRyb2xzKTsKLSAgICAgICAgbUN1c3RvbUJ1dHRvbnMgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmN1c3RvbV9idXR0b25zKTsKLSAgICAgICAgbVN1YnRpdGxlQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5zdWJ0aXRsZSk7Ci0gICAgICAgIGlmIChtU3VidGl0bGVCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtU3VidGl0bGVMaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLmZ1bGxzY3JlZW4pOwotICAgICAgICBpZiAobUZ1bGxTY3JlZW5CdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1GdWxsU2NyZWVuTGlzdGVuZXIpOwotICAgICAgICAgICAgLy8gVE9ETzogU2hvdyBGdWxsc2NyZWVuIGJ1dHRvbiB3aGVuIG9ubHkgaXQgaXMgcG9zc2libGUuCi0gICAgICAgIH0KLSAgICAgICAgbU92ZXJmbG93QnV0dG9uUmlnaHQgPSB2LmZpbmRWaWV3QnlJZChSLmlkLm92ZXJmbG93X3JpZ2h0KTsKLSAgICAgICAgaWYgKG1PdmVyZmxvd0J1dHRvblJpZ2h0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1PdmVyZmxvd0J1dHRvblJpZ2h0LnNldE9uQ2xpY2tMaXN0ZW5lcihtT3ZlcmZsb3dSaWdodExpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtT3ZlcmZsb3dCdXR0b25MZWZ0ID0gdi5maW5kVmlld0J5SWQoUi5pZC5vdmVyZmxvd19sZWZ0KTsKLSAgICAgICAgaWYgKG1PdmVyZmxvd0J1dHRvbkxlZnQgIT0gbnVsbCkgewotICAgICAgICAgICAgbU92ZXJmbG93QnV0dG9uTGVmdC5zZXRPbkNsaWNrTGlzdGVuZXIobU92ZXJmbG93TGVmdExpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtTXV0ZUJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQubXV0ZSk7Ci0gICAgICAgIGlmIChtTXV0ZUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTXV0ZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobU11dGVCdXR0b25MaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgbVNldHRpbmdzQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5zZXR0aW5ncyk7Ci0gICAgICAgIGlmIChtU2V0dGluZ3NCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVNldHRpbmdzQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtU2V0dGluZ3NCdXR0b25MaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgbVZpZGVvUXVhbGl0eUJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQudmlkZW9fcXVhbGl0eSk7Ci0gICAgICAgIGlmIChtVmlkZW9RdWFsaXR5QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1WaWRlb1F1YWxpdHlCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1WaWRlb1F1YWxpdHlMaXN0ZW5lcik7Ci0gICAgICAgIH0KLSAgICAgICAgbUFkUmVtYWluaW5nVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYWRfcmVtYWluaW5nKTsKLQotICAgICAgICAvLyBSZWxhdGluZyB0byBTZXR0aW5ncyBMaXN0IFZpZXcKLSAgICAgICAgaW5pdGlhbGl6ZVNldHRpbmdzTGlzdHMoKTsKLSAgICAgICAgbVNldHRpbmdzTGlzdFZpZXcgPSAoTGlzdFZpZXcpIEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgUi5sYXlvdXQuc2V0dGluZ3NfbGlzdCk7Ci0gICAgICAgIG1TZXR0aW5nc0FkYXB0ZXIgPSBuZXcgU2V0dGluZ3NBZGFwdGVyKG1TZXR0aW5nc01haW5UZXh0c0xpc3QsIG1TZXR0aW5nc1N1YlRleHRzTGlzdCwKLSAgICAgICAgICAgICAgICBtU2V0dGluZ3NJY29uSWRzTGlzdCk7Ci0gICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIgPSBuZXcgU3ViU2V0dGluZ3NBZGFwdGVyKG51bGwsIDApOwotICAgICAgICBtU2V0dGluZ3NMaXN0Vmlldy5zZXRBZGFwdGVyKG1TZXR0aW5nc0FkYXB0ZXIpOwotICAgICAgICBtU2V0dGluZ3NMaXN0Vmlldy5zZXRDaG9pY2VNb2RlKExpc3RWaWV3LkNIT0lDRV9NT0RFX1NJTkdMRSk7Ci0gICAgICAgIG1TZXR0aW5nc0xpc3RWaWV3LnNldE9uSXRlbUNsaWNrTGlzdGVuZXIobVNldHRpbmdzSXRlbUNsaWNrTGlzdGVuZXIpOwotCi0gICAgICAgIG1FbWJlZGRlZFNldHRpbmdzSXRlbVdpZHRoID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tY3YyX2VtYmVkZGVkX3NldHRpbmdzX3dpZHRoKTsKLSAgICAgICAgbUZ1bGxTZXR0aW5nc0l0ZW1XaWR0aCA9IG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4ubWN2Ml9mdWxsX3NldHRpbmdzX3dpZHRoKTsKLSAgICAgICAgbUVtYmVkZGVkU2V0dGluZ3NJdGVtSGVpZ2h0ID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCk7Ci0gICAgICAgIG1GdWxsU2V0dGluZ3NJdGVtSGVpZ2h0ID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0KTsKLSAgICAgICAgbVNldHRpbmdzV2luZG93TWFyZ2luID0gKC0xKSAqIG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgIFIuZGltZW4ubWN2Ml9zZXR0aW5nc19vZmZzZXQpOwotICAgICAgICBtU2V0dGluZ3NXaW5kb3cgPSBuZXcgUG9wdXBXaW5kb3cobVNldHRpbmdzTGlzdFZpZXcsIG1FbWJlZGRlZFNldHRpbmdzSXRlbVdpZHRoLAotICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULCB0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEaXNhYmxlIHBhdXNlIG9yIHNlZWsgYnV0dG9ucyBpZiB0aGUgc3RyZWFtIGNhbm5vdCBiZSBwYXVzZWQgb3Igc2Vla2VkLgotICAgICAqIFRoaXMgcmVxdWlyZXMgdGhlIGNvbnRyb2wgaW50ZXJmYWNlIHRvIGJlIGEgTWVkaWFQbGF5ZXJDb250cm9sRXh0Ci0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGRpc2FibGVVbnN1cHBvcnRlZEJ1dHRvbnMoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBpZiAobVBsYXlQYXVzZUJ1dHRvbiAhPSBudWxsICYmICFjYW5QYXVzZSgpKSB7Ci0gICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtUmV3QnV0dG9uICE9IG51bGwgJiYgIWNhblNlZWtCYWNrd2FyZCgpKSB7Ci0gICAgICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtRmZ3ZEJ1dHRvbiAhPSBudWxsICYmICFjYW5TZWVrRm9yd2FyZCgpKSB7Ci0gICAgICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUT0RPIFdoYXQgd2UgcmVhbGx5IHNob3VsZCBkbyBpcyBhZGQgYSBjYW5TZWVrIHRvIHRoZSBNZWRpYVBsYXllckNvbnRyb2wgaW50ZXJmYWNlOwotICAgICAgICAgICAgLy8gdGhpcyBzY2hlbWUgY2FuIGJyZWFrIHRoZSBjYXNlIHdoZW4gYXBwbGljYXRpb25zIHdhbnQgdG8gYWxsb3cgc2VlayB0aHJvdWdoIHRoZQotICAgICAgICAgICAgLy8gcHJvZ3Jlc3MgYmFyIGJ1dCBkaXNhYmxlIGZvcndhcmQvYmFja3dhcmQgYnV0dG9ucy4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBIb3dldmVyLCBjdXJyZW50bHkgdGhlIGZsYWdzIFNFRUtfQkFDS1dBUkRfQVZBSUxBQkxFLCBTRUVLX0ZPUldBUkRfQVZBSUxBQkxFLAotICAgICAgICAgICAgLy8gYW5kIFNFRUtfQVZBSUxBQkxFIGFyZSBhbGwgKHVuKXNldCB0b2dldGhlcjsgYXMgc3VjaCB0aGUgYWZvcmVtZW50aW9uZWQgaXNzdWUKLSAgICAgICAgICAgIC8vIHNob3VsZG4ndCBhcmlzZSBpbiBleGlzdGluZyBhcHBsaWNhdGlvbnMuCi0gICAgICAgICAgICBpZiAobVByb2dyZXNzICE9IG51bGwgJiYgIWNhblNlZWtCYWNrd2FyZCgpICYmICFjYW5TZWVrRm9yd2FyZCgpKSB7Ci0gICAgICAgICAgICAgICAgbVByb2dyZXNzLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJbmNvbXBhdGlibGVDbGFzc0NoYW5nZUVycm9yIGV4KSB7Ci0gICAgICAgICAgICAvLyBXZSB3ZXJlIGdpdmVuIGFuIG9sZCB2ZXJzaW9uIG9mIHRoZSBpbnRlcmZhY2UsIHRoYXQgZG9lc24ndCBoYXZlCi0gICAgICAgICAgICAvLyB0aGUgY2FuUGF1c2UvY2FuU2Vla1hZWiBtZXRob2RzLiBUaGlzIGlzIE9LLCBpdCBqdXN0IG1lYW5zIHdlCi0gICAgICAgICAgICAvLyBhc3N1bWUgdGhlIG1lZGlhIGNhbiBiZSBwYXVzZWQgYW5kIHNlZWtlZCwgYW5kIHNvIHdlIGRvbid0IGRpc2FibGUKLSAgICAgICAgICAgIC8vIHRoZSBidXR0b25zLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBtVXBkYXRlUHJvZ3Jlc3MgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBpbnQgcG9zID0gc2V0UHJvZ3Jlc3MoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNTaG93aW5nID0gbUluc3RhbmNlLmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEU7Ci0gICAgICAgICAgICBpZiAoIW1EcmFnZ2luZyAmJiBpc1Nob3dpbmcgJiYgaXNQbGF5aW5nKCkpIHsKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UucG9zdERlbGF5ZWQobVVwZGF0ZVByb2dyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9QUk9HUkVTU19VUERBVEVfVElNRV9NUyAtIChwb3MgJSBERUZBVUxUX1BST0dSRVNTX1VQREFURV9USU1FX01TKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgc3RyaW5nRm9yVGltZShpbnQgdGltZU1zKSB7Ci0gICAgICAgIGludCB0b3RhbFNlY29uZHMgPSB0aW1lTXMgLyAxMDAwOwotCi0gICAgICAgIGludCBzZWNvbmRzID0gdG90YWxTZWNvbmRzICUgNjA7Ci0gICAgICAgIGludCBtaW51dGVzID0gKHRvdGFsU2Vjb25kcyAvIDYwKSAlIDYwOwotICAgICAgICBpbnQgaG91cnMgPSB0b3RhbFNlY29uZHMgLyAzNjAwOwotCi0gICAgICAgIG1Gb3JtYXRCdWlsZGVyLnNldExlbmd0aCgwKTsKLSAgICAgICAgaWYgKGhvdXJzID4gMCkgewotICAgICAgICAgICAgcmV0dXJuIG1Gb3JtYXR0ZXIuZm9ybWF0KCIlZDolMDJkOiUwMmQiLCBob3VycywgbWludXRlcywgc2Vjb25kcykudG9TdHJpbmcoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBtRm9ybWF0dGVyLmZvcm1hdCgiJTAyZDolMDJkIiwgbWludXRlcywgc2Vjb25kcykudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgaW50IHNldFByb2dyZXNzKCkgewotICAgICAgICBpZiAobUNvbnRyb2xsZXIgPT0gbnVsbCB8fCBtRHJhZ2dpbmcpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGludCBwb3NpdGlvbk9uUHJvZ3Jlc3NCYXIgPSAwOwotICAgICAgICBpbnQgY3VycmVudFBvc2l0aW9uID0gZ2V0Q3VycmVudFBvc2l0aW9uKCk7Ci0gICAgICAgIGlmIChtRHVyYXRpb24gPiAwKSB7Ci0gICAgICAgICAgICBwb3NpdGlvbk9uUHJvZ3Jlc3NCYXIgPSAoaW50KSAoTUFYX1BST0dSRVNTICogKGxvbmcpIGN1cnJlbnRQb3NpdGlvbiAvIG1EdXJhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1Qcm9ncmVzcyAhPSBudWxsICYmIGN1cnJlbnRQb3NpdGlvbiAhPSBtRHVyYXRpb24pIHsKLSAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRQcm9ncmVzcyhwb3NpdGlvbk9uUHJvZ3Jlc3NCYXIpOwotICAgICAgICAgICAgLy8gSWYgdGhlIG1lZGlhIGlzIGEgbG9jYWwgZmlsZSwgdGhlcmUgaXMgbm8gbmVlZCB0byBzZXQgYSBidWZmZXIsIHNvIHNldCBzZWNvbmRhcnkKLSAgICAgICAgICAgIC8vIHByb2dyZXNzIHRvIG1heGltdW0uCi0gICAgICAgICAgICBpZiAoZ2V0QnVmZmVyUGVyY2VudGFnZSgpIDwgMCkgewotICAgICAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRTZWNvbmRhcnlQcm9ncmVzcyhNQVhfUFJPR1JFU1MpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUHJvZ3Jlc3Muc2V0U2Vjb25kYXJ5UHJvZ3Jlc3MoZ2V0QnVmZmVyUGVyY2VudGFnZSgpICogMTApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1FbmRUaW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1FbmRUaW1lLnNldFRleHQoc3RyaW5nRm9yVGltZShtRHVyYXRpb24pKTsKLQotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ3VycmVudFRpbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgbUN1cnJlbnRUaW1lLnNldFRleHQoc3RyaW5nRm9yVGltZShjdXJyZW50UG9zaXRpb24pKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSXNBZHZlcnRpc2VtZW50KSB7Ci0gICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHJlbWFpbmluZyBudW1iZXIgb2Ygc2Vjb25kcyB1bnRpbCB0aGUgZmlyc3QgNSBzZWNvbmRzIG9mIHRoZQotICAgICAgICAgICAgLy8gYWR2ZXJ0aXNlbWVudC4KLSAgICAgICAgICAgIGlmIChtQWRTa2lwVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRQb3NpdGlvbiA8PSBBRF9TS0lQX1dBSVRfVElNRV9NUykgewotICAgICAgICAgICAgICAgICAgICBpZiAobUFkU2tpcFZpZXcuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuR09ORSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUFkU2tpcFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBza2lwVGltZVRleHQgPSBtUmVzb3VyY2VzLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9hZF9za2lwX3dhaXRfdGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFEX1NLSVBfV0FJVF9USU1FX01TIC0gY3VycmVudFBvc2l0aW9uKSAvIDEwMDAgKyAxKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1BZFNraXBWaWV3LnNldFRleHQoc2tpcFRpbWVUZXh0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAobUFkU2tpcFZpZXcuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUFkU2tpcFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1OZXh0QnV0dG9uLmNsZWFyQ29sb3JGaWx0ZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcmVtYWluaW5nIG51bWJlciBvZiBzZWNvbmRzIG9mIHRoZSBhZHZlcnRpc2VtZW50LgotICAgICAgICAgICAgaWYgKG1BZFJlbWFpbmluZ1ZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCByZW1haW5pbmdUaW1lID0KLSAgICAgICAgICAgICAgICAgICAgICAgIChtRHVyYXRpb24gLSBjdXJyZW50UG9zaXRpb24gPCAwKSA/IDAgOiAobUR1cmF0aW9uIC0gY3VycmVudFBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVtYWluaW5nVGltZVRleHQgPSBtUmVzb3VyY2VzLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2FkX3JlbWFpbmluZ190aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nRm9yVGltZShyZW1haW5pbmdUaW1lKSk7Ci0gICAgICAgICAgICAgICAgbUFkUmVtYWluaW5nVmlldy5zZXRUZXh0KHJlbWFpbmluZ1RpbWVUZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3VycmVudFBvc2l0aW9uOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0b2dnbGVQYXVzZVBsYXlTdGF0ZSgpIHsKLSAgICAgICAgaWYgKGlzUGxheWluZygpKSB7Ci0gICAgICAgICAgICBtQ29udHJvbHMucGF1c2UoKTsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3BsYXlfY2lyY2xlX2ZpbGxlZCwgbnVsbCkpOwotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfcGxheV9idXR0b25fZGVzYykpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUNvbnRyb2xzLnBsYXkoKTsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3BhdXNlX2NpcmNsZV9maWxsZWQsIG51bGwpKTsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BhdXNlX2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUaGVyZSBhcmUgdHdvIHNjZW5hcmlvcyB0aGF0IGNhbiB0cmlnZ2VyIHRoZSBzZWVrYmFyIGxpc3RlbmVyIHRvIHRyaWdnZXI6Ci0gICAgLy8KLSAgICAvLyBUaGUgZmlyc3QgaXMgdGhlIHVzZXIgdXNpbmcgdGhlIHRvdWNocGFkIHRvIGFkanVzdCB0aGUgcG9zaXRpdG9uIG9mIHRoZQotICAgIC8vIHNlZWtiYXIncyB0aHVtYi4gSW4gdGhpcyBjYXNlIG9uU3RhcnRUcmFja2luZ1RvdWNoIGlzIGNhbGxlZCBmb2xsb3dlZCBieQotICAgIC8vIGEgbnVtYmVyIG9mIG9uUHJvZ3Jlc3NDaGFuZ2VkIG5vdGlmaWNhdGlvbnMsIGNvbmNsdWRlZCBieSBvblN0b3BUcmFja2luZ1RvdWNoLgotICAgIC8vIFdlJ3JlIHNldHRpbmcgdGhlIGZpZWxkICJtRHJhZ2dpbmciIHRvIHRydWUgZm9yIHRoZSBkdXJhdGlvbiBvZiB0aGUgZHJhZ2dpbmcKLSAgICAvLyBzZXNzaW9uIHRvIGF2b2lkIGp1bXBzIGluIHRoZSBwb3NpdGlvbiBpbiBjYXNlIG9mIG9uZ29pbmcgcGxheWJhY2suCi0gICAgLy8KLSAgICAvLyBUaGUgc2Vjb25kIHNjZW5hcmlvIGludm9sdmVzIHRoZSB1c2VyIG9wZXJhdGluZyB0aGUgc2Nyb2xsIGJhbGwsIGluIHRoaXMKLSAgICAvLyBjYXNlIHRoZXJlIFdPTidUIEJFIG9uU3RhcnRUcmFja2luZ1RvdWNoL29uU3RvcFRyYWNraW5nVG91Y2ggbm90aWZpY2F0aW9ucywKLSAgICAvLyB3ZSB3aWxsIHNpbXBseSBhcHBseSB0aGUgdXBkYXRlZCBwb3NpdGlvbiB3aXRob3V0IHN1c3BlbmRpbmcgcmVndWxhciB1cGRhdGVzLgotICAgIHByaXZhdGUgZmluYWwgT25TZWVrQmFyQ2hhbmdlTGlzdGVuZXIgbVNlZWtMaXN0ZW5lciA9IG5ldyBPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRUcmFja2luZ1RvdWNoKFNlZWtCYXIgYmFyKSB7Ci0gICAgICAgICAgICBpZiAoIW1TZWVrQXZhaWxhYmxlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtRHJhZ2dpbmcgPSB0cnVlOwotCi0gICAgICAgICAgICAvLyBCeSByZW1vdmluZyB0aGVzZSBwZW5kaW5nIHByb2dyZXNzIG1lc3NhZ2VzIHdlIG1ha2Ugc3VyZQotICAgICAgICAgICAgLy8gdGhhdCBhKSB3ZSB3b24ndCB1cGRhdGUgdGhlIHByb2dyZXNzIHdoaWxlIHRoZSB1c2VyIGFkanVzdHMKLSAgICAgICAgICAgIC8vIHRoZSBzZWVrYmFyIGFuZCBiKSBvbmNlIHRoZSB1c2VyIGlzIGRvbmUgZHJhZ2dpbmcgdGhlIHRodW1iCi0gICAgICAgICAgICAvLyB3ZSB3aWxsIHBvc3Qgb25lIG9mIHRoZXNlIG1lc3NhZ2VzIHRvIHRoZSBxdWV1ZSBhZ2FpbiBhbmQKLSAgICAgICAgICAgIC8vIHRoaXMgZW5zdXJlcyB0aGF0IHRoZXJlIHdpbGwgYmUgZXhhY3RseSBvbmUgbWVzc2FnZSBxdWV1ZWQgdXAuCi0gICAgICAgICAgICBtSW5zdGFuY2UucmVtb3ZlQ2FsbGJhY2tzKG1VcGRhdGVQcm9ncmVzcyk7Ci0KLSAgICAgICAgICAgIC8vIENoZWNrIGlmIHBsYXliYWNrIGlzIGN1cnJlbnRseSBzdG9wcGVkLiBJbiB0aGlzIGNhc2UsIHVwZGF0ZSB0aGUgcGF1c2UgYnV0dG9uIHRvCi0gICAgICAgICAgICAvLyBzaG93IHRoZSBwbGF5IGltYWdlIGluc3RlYWQgb2YgdGhlIHJlcGxheSBpbWFnZS4KLSAgICAgICAgICAgIGlmIChtSXNTdG9wcGVkKSB7Ci0gICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3BsYXlfY2lyY2xlX2ZpbGxlZCwgbnVsbCkpOwotICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wbGF5X2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgICAgICAgICAgbUlzU3RvcHBlZCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKFNlZWtCYXIgYmFyLCBpbnQgcHJvZ3Jlc3MsIGJvb2xlYW4gZnJvbVVzZXIpIHsKLSAgICAgICAgICAgIGlmICghbVNlZWtBdmFpbGFibGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWZyb21Vc2VyKSB7Ci0gICAgICAgICAgICAgICAgLy8gV2UncmUgbm90IGludGVyZXN0ZWQgaW4gcHJvZ3JhbW1hdGljYWxseSBnZW5lcmF0ZWQgY2hhbmdlcyB0bwotICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9ncmVzcyBiYXIncyBwb3NpdGlvbi4KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUR1cmF0aW9uID4gMCkgewotICAgICAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IChpbnQpICgoKGxvbmcpIG1EdXJhdGlvbiAqIHByb2dyZXNzKSAvIE1BWF9QUk9HUkVTUyk7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xzLnNlZWtUbyhwb3NpdGlvbik7Ci0KLSAgICAgICAgICAgICAgICBpZiAobUN1cnJlbnRUaW1lICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUaW1lLnNldFRleHQoc3RyaW5nRm9yVGltZShwb3NpdGlvbikpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0b3BUcmFja2luZ1RvdWNoKFNlZWtCYXIgYmFyKSB7Ci0gICAgICAgICAgICBpZiAoIW1TZWVrQXZhaWxhYmxlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbURyYWdnaW5nID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIHNldFByb2dyZXNzKCk7Ci0KLSAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IHByb2dyZXNzIGlzIHByb3Blcmx5IHVwZGF0ZWQgaW4gdGhlIGZ1dHVyZSwKLSAgICAgICAgICAgIC8vIHRoZSBjYWxsIHRvIHNob3coKSBkb2VzIG5vdCBndWFyYW50ZWUgdGhpcyBiZWNhdXNlIGl0IGlzIGEKLSAgICAgICAgICAgIC8vIG5vLW9wIGlmIHdlIGFyZSBhbHJlYWR5IHNob3dpbmcuCi0gICAgICAgICAgICBtSW5zdGFuY2UucG9zdChtVXBkYXRlUHJvZ3Jlc3MpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbVBsYXlQYXVzZUxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIHRvZ2dsZVBhdXNlUGxheVN0YXRlKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtUmV3TGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgaW50IHBvcyA9IGdldEN1cnJlbnRQb3NpdGlvbigpIC0gUkVXSU5EX1RJTUVfTVM7Ci0gICAgICAgICAgICBtQ29udHJvbHMuc2Vla1RvKHBvcyk7Ci0gICAgICAgICAgICBzZXRQcm9ncmVzcygpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbUZmd2RMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBpbnQgcG9zID0gZ2V0Q3VycmVudFBvc2l0aW9uKCkgKyBGT1JXQVJEX1RJTUVfTVM7Ci0gICAgICAgICAgICBtQ29udHJvbHMuc2Vla1RvKHBvcyk7Ci0gICAgICAgICAgICBzZXRQcm9ncmVzcygpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbU5leHRMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBtQ29udHJvbHMuc2tpcFRvTmV4dCgpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbVByZXZMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBtQ29udHJvbHMuc2tpcFRvUHJldmlvdXMoKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1CYWNrTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtU3VidGl0bGVMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBtU2V0dGluZ3NNb2RlID0gU0VUVElOR1NfTU9ERV9TVUJUSVRMRV9UUkFDSzsKLSAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0VGV4dHMobVN1YnRpdGxlRGVzY3JpcHRpb25zTGlzdCk7Ci0gICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldENoZWNrUG9zaXRpb24obVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KTsKLSAgICAgICAgICAgIGRpc3BsYXlTZXR0aW5nc1dpbmRvdyhtU3ViU2V0dGluZ3NBZGFwdGVyKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1WaWRlb1F1YWxpdHlMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBtU2V0dGluZ3NNb2RlID0gU0VUVElOR1NfTU9ERV9WSURFT19RVUFMSVRZOwotICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5zZXRUZXh0cyhtVmlkZW9RdWFsaXR5TGlzdCk7Ci0gICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldENoZWNrUG9zaXRpb24obVNlbGVjdGVkVmlkZW9RdWFsaXR5SW5kZXgpOwotICAgICAgICAgICAgZGlzcGxheVNldHRpbmdzV2luZG93KG1TdWJTZXR0aW5nc0FkYXB0ZXIpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbUZ1bGxTY3JlZW5MaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzRW50ZXJpbmdGdWxsU2NyZWVuID0gIW1Jc0Z1bGxTY3JlZW47Ci0gICAgICAgICAgICAvLyBUT0RPOiBSZS1hcnJhbmdlIHRoZSBidXR0b24gbGF5b3V0cyBhY2NvcmRpbmcgdG8gdGhlIFVYLgotICAgICAgICAgICAgaWYgKGlzRW50ZXJpbmdGdWxsU2NyZWVuKSB7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19mdWxsc2NyZWVuX2V4aXQsIG51bGwpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19mdWxsc2NyZWVuLCBudWxsKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBCdW5kbGUgYXJncyA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGFyZ3MucHV0Qm9vbGVhbihBUkdVTUVOVF9LRVlfRlVMTFNDUkVFTiwgaXNFbnRlcmluZ0Z1bGxTY3JlZW4pOwotICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoQ09NTUFORF9TRVRfRlVMTFNDUkVFTiwgYXJncywgbnVsbCk7Ci0KLSAgICAgICAgICAgIG1Jc0Z1bGxTY3JlZW4gPSBpc0VudGVyaW5nRnVsbFNjcmVlbjsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1PdmVyZmxvd1JpZ2h0TGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgbUJhc2ljQ29udHJvbHMuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbUV4dHJhQ29udHJvbHMuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbU92ZXJmbG93TGVmdExpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1CYXNpY0NvbnRyb2xzLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1FeHRyYUNvbnRyb2xzLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1NdXRlQnV0dG9uTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgaWYgKCFtSXNNdXRlKSB7Ci0gICAgICAgICAgICAgICAgbU11dGVCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19tdXRlLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgbU11dGVCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9tdXRlZF9idXR0b25fZGVzYykpOwotICAgICAgICAgICAgICAgIG1Jc011dGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLnNlbmRDb21tYW5kKENPTU1BTkRfTVVURSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1NdXRlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfdW5tdXRlLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgbU11dGVCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml91bm11dGVkX2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgICAgICAgICAgbUlzTXV0ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLnNlbmRDb21tYW5kKENPTU1BTkRfVU5NVVRFLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1TZXR0aW5nc0J1dHRvbkxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1TZXR0aW5nc01vZGUgPSBTRVRUSU5HU19NT0RFX01BSU47Ci0gICAgICAgICAgICBtU2V0dGluZ3NBZGFwdGVyLnNldFN1YlRleHRzKG1TZXR0aW5nc1N1YlRleHRzTGlzdCk7Ci0gICAgICAgICAgICBkaXNwbGF5U2V0dGluZ3NXaW5kb3cobVNldHRpbmdzQWRhcHRlcik7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyIG1TZXR0aW5nc0l0ZW1DbGlja0xpc3RlbmVyCi0gICAgICAgICAgICA9IG5ldyBBZGFwdGVyVmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25JdGVtQ2xpY2soQWRhcHRlclZpZXc8Pz4gcGFyZW50LCBWaWV3IHZpZXcsIGludCBwb3NpdGlvbiwgbG9uZyBpZCkgewotICAgICAgICAgICAgc3dpdGNoIChtU2V0dGluZ3NNb2RlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRUSU5HU19NT0RFX01BSU46Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA9PSBTRVRUSU5HU19NT0RFX0FVRElPX1RSQUNLKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldFRleHRzKG1BdWRpb1RyYWNrTGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldENoZWNrUG9zaXRpb24obVNlbGVjdGVkQXVkaW9UcmFja0luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc01vZGUgPSBTRVRUSU5HU19NT0RFX0FVRElPX1RSQUNLOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09IFNFVFRJTkdTX01PREVfUExBWUJBQ0tfU1BFRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0VGV4dHMobVBsYXliYWNrU3BlZWRUZXh0TGlzdCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldENoZWNrUG9zaXRpb24obVNlbGVjdGVkU3BlZWRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NNb2RlID0gU0VUVElOR1NfTU9ERV9QTEFZQkFDS19TUEVFRDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwb3NpdGlvbiA9PSBTRVRUSU5HU19NT0RFX0hFTFApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzLgotICAgICAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzV2luZG93LmRpc21pc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBkaXNwbGF5U2V0dGluZ3NXaW5kb3cobVN1YlNldHRpbmdzQWRhcHRlcik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU0VUVElOR1NfTU9ERV9BVURJT19UUkFDSzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uICE9IG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkQXVkaW9UcmFja0luZGV4ID0gcG9zaXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvVHJhY2tDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGUgZXh0cmEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmEucHV0SW50KEtFWV9TRUxFQ1RFRF9BVURJT19JTkRFWCwgcG9zaXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLnNlbmRDb21tYW5kKENPTU1BTkRfU0VMRUNUX0FVRElPX1RSQUNLLCBleHRyYSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3Quc2V0KFNFVFRJTkdTX01PREVfQVVESU9fVFJBQ0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuZ2V0TWFpblRleHQocG9zaXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNFVFRJTkdTX01PREVfUExBWUJBQ0tfU1BFRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiAhPSBtU2VsZWN0ZWRTcGVlZEluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRTcGVlZEluZGV4ID0gcG9zaXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGUgZXh0cmEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHRyYS5wdXRGbG9hdChLRVlfUExBWUJBQ0tfU1BFRUQsIG1QbGF5YmFja1NwZWVkTGlzdC5nZXQocG9zaXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLnNlbmRDb21tYW5kKENPTU1BTkRfU0VUX1BMQVlCQUNLX1NQRUVELCBleHRyYSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3Quc2V0KFNFVFRJTkdTX01PREVfUExBWUJBQ0tfU1BFRUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuZ2V0TWFpblRleHQocG9zaXRpb24pKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNFVFRJTkdTX01PREVfSEVMUDoKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMuCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU0VUVElOR1NfTU9ERV9TVUJUSVRMRV9UUkFDSzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uICE9IG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4ID0gcG9zaXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVuZGxlIGV4dHJhID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhLnB1dEludChLRVlfU0VMRUNURURfU1VCVElUTEVfSU5ERVgsIHBvc2l0aW9uIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9TSE9XX1NVQlRJVExFLCBleHRyYSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfc3VidGl0bGVfb24sIG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9jY19pc19vbikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUlzRW5hYmxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVyLnNlbmRDb21tYW5kKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfSElERV9TVUJUSVRMRSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfc3VidGl0bGVfb2ZmLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfY2NfaXNfb2ZmKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVJc0VuYWJsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNFVFRJTkdTX01PREVfVklERU9fUVVBTElUWToKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogYWRkIHN1cHBvcnQgZm9yIHZpZGVvIHF1YWxpdHkKLSAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkVmlkZW9RdWFsaXR5SW5kZXggPSBwb3NpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzV2luZG93LmRpc21pc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUR1cmF0aW9uKCkgewotICAgICAgICBpZiAobU1ldGFkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChtTWV0YWRhdGEuY29udGFpbnNLZXkoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfRFVSQVRJT04pKSB7Ci0gICAgICAgICAgICAgICAgbUR1cmF0aW9uID0gKGludCkgbU1ldGFkYXRhLmdldExvbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfRFVSQVRJT04pOwotICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBwcm9ncmVzcyBiYXIKLSAgICAgICAgICAgICAgICBzZXRQcm9ncmVzcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVRpdGxlKCkgewotICAgICAgICBpZiAobU1ldGFkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChtTWV0YWRhdGEuY29udGFpbnNLZXkoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfVElUTEUpKSB7Ci0gICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KG1NZXRhZGF0YS5nZXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfVElUTEUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRoZSB0aXRsZSBiYXIgaXMgbWFkZSB1cCBvZiB0d28gc2VwYXJhdGUgTGluZWFyTGF5b3V0cy4gSWYgdGhlIHN1bSBvZiB0aGUgdHdvIGJhcnMgYXJlCi0gICAgLy8gZ3JlYXRlciB0aGFuIHRoZSBsZW5ndGggb2YgdGhlIHRpdGxlIGJhciwgcmVkdWNlIHRoZSBzaXplIG9mIHRoZSBsZWZ0IGJhciAod2hpY2ggbWFrZXMgdGhlCi0gICAgLy8gVGV4dFZpZXcgdGhhdCBjb250YWlucyB0aGUgdGl0bGUgb2YgdGhlIG1lZGlhIGZpbGUgc2hyaW5rKS4KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlVGl0bGVCYXJMYXlvdXQoKSB7Ci0gICAgICAgIGlmIChtVGl0bGVCYXIgIT0gbnVsbCkgewotICAgICAgICAgICAgaW50IHRpdGxlQmFyV2lkdGggPSBtVGl0bGVCYXIuZ2V0V2lkdGgoKTsKLQotICAgICAgICAgICAgVmlldyBsZWZ0QmFyID0gbVRpdGxlQmFyLmZpbmRWaWV3QnlJZChSLmlkLnRpdGxlX2Jhcl9sZWZ0KTsKLSAgICAgICAgICAgIFZpZXcgcmlnaHRCYXIgPSBtVGl0bGVCYXIuZmluZFZpZXdCeUlkKFIuaWQudGl0bGVfYmFyX3JpZ2h0KTsKLSAgICAgICAgICAgIGludCBsZWZ0QmFyV2lkdGggPSBsZWZ0QmFyLmdldFdpZHRoKCk7Ci0gICAgICAgICAgICBpbnQgcmlnaHRCYXJXaWR0aCA9IHJpZ2h0QmFyLmdldFdpZHRoKCk7Ci0KLSAgICAgICAgICAgIFJlbGF0aXZlTGF5b3V0LkxheW91dFBhcmFtcyBwYXJhbXMgPQotICAgICAgICAgICAgICAgICAgICAoUmVsYXRpdmVMYXlvdXQuTGF5b3V0UGFyYW1zKSBsZWZ0QmFyLmdldExheW91dFBhcmFtcygpOwotICAgICAgICAgICAgaWYgKGxlZnRCYXJXaWR0aCArIHJpZ2h0QmFyV2lkdGggPiB0aXRsZUJhcldpZHRoKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW1zLndpZHRoID0gdGl0bGVCYXJXaWR0aCAtIHJpZ2h0QmFyV2lkdGg7Ci0gICAgICAgICAgICAgICAgbU9yaWdpbmFsTGVmdEJhcldpZHRoID0gbGVmdEJhcldpZHRoOwotICAgICAgICAgICAgfSBlbHNlIGlmIChsZWZ0QmFyV2lkdGggKyByaWdodEJhcldpZHRoIDwgdGl0bGVCYXJXaWR0aCAmJiBtT3JpZ2luYWxMZWZ0QmFyV2lkdGggIT0gMCkgewotICAgICAgICAgICAgICAgIHBhcmFtcy53aWR0aCA9IG1PcmlnaW5hbExlZnRCYXJXaWR0aDsKLSAgICAgICAgICAgICAgICBtT3JpZ2luYWxMZWZ0QmFyV2lkdGggPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbGVmdEJhci5zZXRMYXlvdXRQYXJhbXMocGFyYW1zKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVBdWRpb01ldGFkYXRhKCkgewotICAgICAgICBpZiAobU1lZGlhVHlwZSAhPSBNRURJQV9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobU1ldGFkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgIFN0cmluZyB0aXRsZVRleHQgPSAiIjsKLSAgICAgICAgICAgIFN0cmluZyBhcnRpc3RUZXh0ID0gIiI7Ci0gICAgICAgICAgICBpZiAobU1ldGFkYXRhLmNvbnRhaW5zS2V5KE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX1RJVExFKSkgewotICAgICAgICAgICAgICAgIHRpdGxlVGV4dCA9IG1NZXRhZGF0YS5nZXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfVElUTEUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aXRsZVRleHQgPSBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX211c2ljX3RpdGxlX3Vua25vd25fdGV4dCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtTWV0YWRhdGEuY29udGFpbnNLZXkoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfQVJUSVNUKSkgewotICAgICAgICAgICAgICAgIGFydGlzdFRleHQgPSBtTWV0YWRhdGEuZ2V0U3RyaW5nKE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX0FSVElTVCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFydGlzdFRleHQgPSBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX211c2ljX2FydGlzdF91bmtub3duX3RleHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVcGRhdGUgdGl0bGUgZm9yIEVtYmVkZGVkIHNpemUgdHlwZQotICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KHRpdGxlVGV4dCArICIgLSAiICsgYXJ0aXN0VGV4dCk7Ci0KLSAgICAgICAgICAgIC8vIFNldCB0byB0cnVlIHRvIHVwZGF0ZSBsYXlvdXQgaW5zaWRlIG9uTWVhc3VyZSgpCi0gICAgICAgICAgICBtTmVlZFVYVXBkYXRlID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVMYXlvdXQoKSB7Ci0gICAgICAgIGlmIChtSXNBZHZlcnRpc2VtZW50KSB7Ci0gICAgICAgICAgICBtUmV3QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1QcmV2QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1UaW1lVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0KLSAgICAgICAgICAgIG1BZFNraXBWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1BZFJlbWFpbmluZ1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbUFkRXh0ZXJuYWxMaW5rLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLQotICAgICAgICAgICAgbVByb2dyZXNzLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRDb2xvckZpbHRlcihSLmNvbG9yLmdyYXkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtUHJldkJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtVGltZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgICAgICBtQWRTa2lwVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtQWRSZW1haW5pbmdWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1BZEV4dGVybmFsTGluay5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0KLSAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIG1OZXh0QnV0dG9uLmNsZWFyQ29sb3JGaWx0ZXIoKTsKLSAgICAgICAgICAgIGRpc2FibGVVbnN1cHBvcnRlZEJ1dHRvbnMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVMYXlvdXQoaW50IG1heEljb25Db3VudCwgaW50IGZ1bGxJY29uU2l6ZSwgaW50IGVtYmVkZGVkSWNvblNpemUsCi0gICAgICAgICAgICAgaW50IG1hcmdpblNpemUsIGludCBjdXJyV2lkdGgsIGludCBjdXJySGVpZ2h0LCBpbnQgc2NyZWVuV2lkdGgsIGludCBzY3JlZW5IZWlnaHQpIHsKLSAgICAgICAgaW50IGZ1bGxCb3R0b21CYXJSaWdodFdpZHRoTWF4ID0gZnVsbEljb25TaXplICogbWF4SWNvbkNvdW50Ci0gICAgICAgICAgICAgICAgKyBtYXJnaW5TaXplICogKG1heEljb25Db3VudCAqIDIpOwotICAgICAgICBpbnQgZW1iZWRkZWRCb3R0b21CYXJSaWdodFdpZHRoTWF4ID0gZW1iZWRkZWRJY29uU2l6ZSAqIG1heEljb25Db3VudAotICAgICAgICAgICAgICAgICsgbWFyZ2luU2l6ZSAqIChtYXhJY29uQ291bnQgKiAyKTsKLSAgICAgICAgaW50IGZ1bGxXaWR0aCA9IG1UcmFuc3BvcnRDb250cm9scy5nZXRXaWR0aCgpICsgbVRpbWVWaWV3LmdldFdpZHRoKCkKLSAgICAgICAgICAgICAgICArIGZ1bGxCb3R0b21CYXJSaWdodFdpZHRoTWF4OwotICAgICAgICBpbnQgZW1iZWRkZWRXaWR0aCA9IG1UaW1lVmlldy5nZXRXaWR0aCgpICsgZW1iZWRkZWRCb3R0b21CYXJSaWdodFdpZHRoTWF4OwotICAgICAgICBpbnQgc2NyZWVuTWF4TGVuZ3RoID0gTWF0aC5tYXgoc2NyZWVuV2lkdGgsIHNjcmVlbkhlaWdodCk7Ci0KLSAgICAgICAgaWYgKGZ1bGxXaWR0aCA+IHNjcmVlbk1heExlbmd0aCkgewotICAgICAgICAgICAgLy8gVE9ETzogc2NyZWVuIG1heSBiZSBzbWFsbGVyIHRoYW4gdGhlIGxlbmd0aCBuZWVkZWQgZm9yIEZ1bGwgc2l6ZS4KLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNGdWxsU2l6ZSA9IChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfREVGQVVMVCkgPyAoY3VycldpZHRoID09IHNjcmVlbk1heExlbmd0aCkgOgotICAgICAgICAgICAgICAgIChjdXJyV2lkdGggPT0gc2NyZWVuV2lkdGggJiYgY3VyckhlaWdodCA9PSBzY3JlZW5IZWlnaHQpOwotCi0gICAgICAgIGlmIChpc0Z1bGxTaXplKSB7Ci0gICAgICAgICAgICBpZiAobVNpemVUeXBlICE9IFNJWkVfVFlQRV9GVUxMKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0Rm9yU2l6ZUNoYW5nZShTSVpFX1RZUEVfRlVMTCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYVR5cGUgPT0gTUVESUFfVFlQRV9NVVNJQykgewotICAgICAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZW1iZWRkZWRXaWR0aCA8PSBjdXJyV2lkdGgpIHsKLSAgICAgICAgICAgIGlmIChtU2l6ZVR5cGUgIT0gU0laRV9UWVBFX0VNQkVEREVEKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0Rm9yU2l6ZUNoYW5nZShTSVpFX1RZUEVfRU1CRURERUQpOwotICAgICAgICAgICAgICAgIGlmIChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1TaXplVHlwZSAhPSBTSVpFX1RZUEVfTUlOSU1BTCkgewotICAgICAgICAgICAgICAgIHVwZGF0ZUxheW91dEZvclNpemVDaGFuZ2UoU0laRV9UWVBFX01JTklNQUwpOwotICAgICAgICAgICAgICAgIGlmIChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUxheW91dEZvclNpemVDaGFuZ2UoaW50IHNpemVUeXBlKSB7Ci0gICAgICAgIG1TaXplVHlwZSA9IHNpemVUeXBlOwotICAgICAgICBSZWxhdGl2ZUxheW91dC5MYXlvdXRQYXJhbXMgdGltZVZpZXdQYXJhbXMgPQotICAgICAgICAgICAgICAgIChSZWxhdGl2ZUxheW91dC5MYXlvdXRQYXJhbXMpIG1UaW1lVmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgU2Vla0JhciBzZWVrZXIgPSAoU2Vla0JhcikgbVByb2dyZXNzOwotICAgICAgICBzd2l0Y2ggKG1TaXplVHlwZSkgewotICAgICAgICAgICAgY2FzZSBTSVpFX1RZUEVfRU1CRURERUQ6Ci0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gVGl0bGUgQmFyCi0gICAgICAgICAgICAgICAgbVRpdGxlQmFyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICBtQmFja0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBGdWxsIFNjcmVlbiBCdXR0b24KLSAgICAgICAgICAgICAgICBtTWluaW1hbEV4dHJhVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24gPSBtQm90dG9tQmFyUmlnaHRWaWV3LmZpbmRWaWV3QnlJZChSLmlkLmZ1bGxzY3JlZW4pOwotICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtRnVsbFNjcmVlbkxpc3RlbmVyKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIENlbnRlciBWaWV3Ci0gICAgICAgICAgICAgICAgbUNlbnRlclZpZXcucmVtb3ZlQWxsVmlld3MoKTsKLSAgICAgICAgICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcucmVtb3ZlVmlldyhtVHJhbnNwb3J0Q29udHJvbHMpOwotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXJMZWZ0Vmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgbVRyYW5zcG9ydENvbnRyb2xzID0gaW5mbGF0ZVRyYW5zcG9ydENvbnRyb2xzKFIubGF5b3V0LmVtYmVkZGVkX3RyYW5zcG9ydF9jb250cm9scyk7Ci0gICAgICAgICAgICAgICAgbUNlbnRlclZpZXcuYWRkVmlldyhtVHJhbnNwb3J0Q29udHJvbHMpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gUHJvZ3Jlc3MgQmFyCi0gICAgICAgICAgICAgICAgc2Vla2VyLnNldFRodW1iKG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5jdXN0b21fcHJvZ3Jlc3NfdGh1bWIpKTsKLSAgICAgICAgICAgICAgICBtUHJvZ3Jlc3NCdWZmZXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhcgotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIGlmICh0aW1lVmlld1BhcmFtcy5nZXRSdWxlKFJlbGF0aXZlTGF5b3V0LkxFRlRfT0YpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdGltZVZpZXdQYXJhbXMucmVtb3ZlUnVsZShSZWxhdGl2ZUxheW91dC5MRUZUX09GKTsKLSAgICAgICAgICAgICAgICAgICAgdGltZVZpZXdQYXJhbXMuYWRkUnVsZShSZWxhdGl2ZUxheW91dC5SSUdIVF9PRiwgUi5pZC5ib3R0b21fYmFyX2xlZnQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU0laRV9UWVBFX0ZVTEw6Ci0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gVGl0bGUgQmFyCi0gICAgICAgICAgICAgICAgbVRpdGxlQmFyLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICBtQmFja0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBGdWxsIFNjcmVlbiBCdXR0b24KLSAgICAgICAgICAgICAgICBtTWluaW1hbEV4dHJhVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24gPSBtQm90dG9tQmFyUmlnaHRWaWV3LmZpbmRWaWV3QnlJZChSLmlkLmZ1bGxzY3JlZW4pOwotICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtRnVsbFNjcmVlbkxpc3RlbmVyKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIENlbnRlciBWaWV3Ci0gICAgICAgICAgICAgICAgbUNlbnRlclZpZXcucmVtb3ZlQWxsVmlld3MoKTsKLSAgICAgICAgICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcucmVtb3ZlVmlldyhtVHJhbnNwb3J0Q29udHJvbHMpOwotICAgICAgICAgICAgICAgIG1UcmFuc3BvcnRDb250cm9scyA9IGluZmxhdGVUcmFuc3BvcnRDb250cm9scyhSLmxheW91dC5mdWxsX3RyYW5zcG9ydF9jb250cm9scyk7Ci0gICAgICAgICAgICAgICAgbUJvdHRvbUJhckxlZnRWaWV3LmFkZFZpZXcobVRyYW5zcG9ydENvbnRyb2xzLCAwKTsKLSAgICAgICAgICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gUHJvZ3Jlc3MgQmFyCi0gICAgICAgICAgICAgICAgc2Vla2VyLnNldFRodW1iKG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5jdXN0b21fcHJvZ3Jlc3NfdGh1bWIpKTsKLSAgICAgICAgICAgICAgICBtUHJvZ3Jlc3NCdWZmZXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhcgotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIGlmICh0aW1lVmlld1BhcmFtcy5nZXRSdWxlKFJlbGF0aXZlTGF5b3V0LlJJR0hUX09GKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVWaWV3UGFyYW1zLnJlbW92ZVJ1bGUoUmVsYXRpdmVMYXlvdXQuUklHSFRfT0YpOwotICAgICAgICAgICAgICAgICAgICB0aW1lVmlld1BhcmFtcy5hZGRSdWxlKFJlbGF0aXZlTGF5b3V0LkxFRlRfT0YsIFIuaWQuYm90dG9tX2Jhcl9yaWdodCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTSVpFX1RZUEVfTUlOSU1BTDoKLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBUaXRsZSBCYXIKLSAgICAgICAgICAgICAgICBtVGl0bGVCYXIuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgIG1CYWNrQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIEZ1bGwgU2NyZWVuIEJ1dHRvbgotICAgICAgICAgICAgICAgIG1NaW5pbWFsRXh0cmFWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbiA9IG1NaW5pbWFsRXh0cmFWaWV3LmZpbmRWaWV3QnlJZChSLmlkLmZ1bGxzY3JlZW4pOwotICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtRnVsbFNjcmVlbkxpc3RlbmVyKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIENlbnRlciBWaWV3Ci0gICAgICAgICAgICAgICAgbUNlbnRlclZpZXcucmVtb3ZlQWxsVmlld3MoKTsKLSAgICAgICAgICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcucmVtb3ZlVmlldyhtVHJhbnNwb3J0Q29udHJvbHMpOwotICAgICAgICAgICAgICAgIG1UcmFuc3BvcnRDb250cm9scyA9IGluZmxhdGVUcmFuc3BvcnRDb250cm9scyhSLmxheW91dC5taW5pbWFsX3RyYW5zcG9ydF9jb250cm9scyk7Ci0gICAgICAgICAgICAgICAgbUNlbnRlclZpZXcuYWRkVmlldyhtVHJhbnNwb3J0Q29udHJvbHMpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gUHJvZ3Jlc3MgQmFyCi0gICAgICAgICAgICAgICAgc2Vla2VyLnNldFRodW1iKG51bGwpOwotICAgICAgICAgICAgICAgIG1Qcm9ncmVzc0J1ZmZlci5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyCi0gICAgICAgICAgICAgICAgbUJvdHRvbUJhci5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbVRpbWVWaWV3LnNldExheW91dFBhcmFtcyh0aW1lVmlld1BhcmFtcyk7Ci0KLSAgICAgICAgaWYgKGlzUGxheWluZygpKSB7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19wYXVzZV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wYXVzZV9idXR0b25fZGVzYykpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfcGxheV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wbGF5X2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUlzRnVsbFNjcmVlbikgewotICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2Z1bGxzY3JlZW5fZXhpdCwgbnVsbCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2Z1bGxzY3JlZW4sIG51bGwpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgVmlldyBpbmZsYXRlVHJhbnNwb3J0Q29udHJvbHMoaW50IGxheW91dElkKSB7Ci0gICAgICAgIFZpZXcgdiA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksIGxheW91dElkKTsKLSAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQucGF1c2UpOwotICAgICAgICBpZiAobVBsYXlQYXVzZUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnJlcXVlc3RGb2N1cygpOwotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobVBsYXlQYXVzZUxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtRmZ3ZEJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQuZmZ3ZCk7Ci0gICAgICAgIGlmIChtRmZ3ZEJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUZmd2RMaXN0ZW5lcik7Ci0gICAgICAgICAgICBpZiAobU1lZGlhVHlwZSA9PSBNRURJQV9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1SZXdCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLnJldyk7Ci0gICAgICAgIGlmIChtUmV3QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1SZXdCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1SZXdMaXN0ZW5lcik7Ci0gICAgICAgICAgICBpZiAobU1lZGlhVHlwZSA9PSBNRURJQV9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETzogQWRkIHN1cHBvcnQgZm9yIE5leHQgYW5kIFByZXZpb3VzIGJ1dHRvbnMKLSAgICAgICAgbU5leHRCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLm5leHQpOwotICAgICAgICBpZiAobU5leHRCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1OZXh0TGlzdGVuZXIpOwotICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgICAgIG1QcmV2QnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5wcmV2KTsKLSAgICAgICAgaWYgKG1QcmV2QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QcmV2QnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtUHJldkxpc3RlbmVyKTsKLSAgICAgICAgICAgIG1QcmV2QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdGlhbGl6ZVNldHRpbmdzTGlzdHMoKSB7Ci0gICAgICAgIG1TZXR0aW5nc01haW5UZXh0c0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgbVNldHRpbmdzTWFpblRleHRzTGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfYXVkaW9fdHJhY2tfdGV4dCkpOwotICAgICAgICBtU2V0dGluZ3NNYWluVGV4dHNMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9wbGF5YmFja19zcGVlZF90ZXh0KSk7Ci0gICAgICAgIG1TZXR0aW5nc01haW5UZXh0c0xpc3QuYWRkKAotICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2hlbHBfdGV4dCkpOwotCi0gICAgICAgIG1TZXR0aW5nc1N1YlRleHRzTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3QuYWRkKAotICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX25vbmVfdGV4dCkpOwotICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3QuYWRkKAotICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nQXJyYXkoCi0gICAgICAgICAgICAgICAgICAgICAgICBSLmFycmF5Lk1lZGlhQ29udHJvbFZpZXcyX3BsYXliYWNrX3NwZWVkcylbUExBWUJBQ0tfU1BFRURfMXhfSU5ERVhdKTsKLSAgICAgICAgbVNldHRpbmdzU3ViVGV4dHNMaXN0LmFkZChSRVNPVVJDRV9FTVBUWSk7Ci0KLSAgICAgICAgbVNldHRpbmdzSWNvbklkc0xpc3QgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7Ci0gICAgICAgIG1TZXR0aW5nc0ljb25JZHNMaXN0LmFkZChSLmRyYXdhYmxlLmljX2F1ZGlvdHJhY2spOwotICAgICAgICBtU2V0dGluZ3NJY29uSWRzTGlzdC5hZGQoUi5kcmF3YWJsZS5pY19wbGF5X2NpcmNsZV9maWxsZWQpOwotICAgICAgICBtU2V0dGluZ3NJY29uSWRzTGlzdC5hZGQoUi5kcmF3YWJsZS5pY19oZWxwKTsKLQotICAgICAgICBtQXVkaW9UcmFja0xpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgbUF1ZGlvVHJhY2tMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9hdWRpb190cmFja19ub25lX3RleHQpKTsKLQotICAgICAgICBtVmlkZW9RdWFsaXR5TGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBtVmlkZW9RdWFsaXR5TGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfdmlkZW9fcXVhbGl0eV9hdXRvX3RleHQpKTsKLQotICAgICAgICBtUGxheWJhY2tTcGVlZFRleHRMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KEFycmF5cy5hc0xpc3QoCi0gICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmdBcnJheShSLmFycmF5Lk1lZGlhQ29udHJvbFZpZXcyX3BsYXliYWNrX3NwZWVkcykpKTsKLSAgICAgICAgLy8gU2VsZWN0IHRoZSAiMXgiIHNwZWVkIGFzIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgICAgICBtU2VsZWN0ZWRTcGVlZEluZGV4ID0gUExBWUJBQ0tfU1BFRURfMXhfSU5ERVg7Ci0KLSAgICAgICAgbVBsYXliYWNrU3BlZWRMaXN0ID0gbmV3IEFycmF5TGlzdDxGbG9hdD4oKTsKLSAgICAgICAgaW50W10gc3BlZWRzID0gbVJlc291cmNlcy5nZXRJbnRBcnJheShSLmFycmF5LnNwZWVkX211bHRpcGxpZWRfYnlfMTAwKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcGVlZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgIGZsb2F0IHNwZWVkID0gKGZsb2F0KSBzcGVlZHNbaV0gLyAxMDAuMGY7Ci0gICAgICAgICAgICBtUGxheWJhY2tTcGVlZExpc3QuYWRkKHNwZWVkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkaXNwbGF5U2V0dGluZ3NXaW5kb3coQmFzZUFkYXB0ZXIgYWRhcHRlcikgewotICAgICAgICAvLyBTZXQgQWRhcHRlcgotICAgICAgICBtU2V0dGluZ3NMaXN0Vmlldy5zZXRBZGFwdGVyKGFkYXB0ZXIpOwotCi0gICAgICAgIC8vIFNldCB3aWR0aCBvZiB3aW5kb3cKLSAgICAgICAgaW50IGl0ZW1XaWR0aCA9IChtU2l6ZVR5cGUgPT0gU0laRV9UWVBFX0VNQkVEREVEKQotICAgICAgICAgICAgICAgID8gbUVtYmVkZGVkU2V0dGluZ3NJdGVtV2lkdGggOiBtRnVsbFNldHRpbmdzSXRlbVdpZHRoOwotICAgICAgICBtU2V0dGluZ3NXaW5kb3cuc2V0V2lkdGgoaXRlbVdpZHRoKTsKLQotICAgICAgICAvLyBDYWxjdWxhdGUgaGVpZ2h0IG9mIHdpbmRvdyBhbmQgc2hvdwotICAgICAgICBpbnQgaXRlbUhlaWdodCA9IChtU2l6ZVR5cGUgPT0gU0laRV9UWVBFX0VNQkVEREVEKQotICAgICAgICAgICAgICAgID8gbUVtYmVkZGVkU2V0dGluZ3NJdGVtSGVpZ2h0IDogbUZ1bGxTZXR0aW5nc0l0ZW1IZWlnaHQ7Ci0gICAgICAgIGludCB0b3RhbEhlaWdodCA9IGFkYXB0ZXIuZ2V0Q291bnQoKSAqIGl0ZW1IZWlnaHQ7Ci0gICAgICAgIG1TZXR0aW5nc1dpbmRvdy5kaXNtaXNzKCk7Ci0gICAgICAgIG1TZXR0aW5nc1dpbmRvdy5zaG93QXNEcm9wRG93bihtSW5zdGFuY2UsIG1TZXR0aW5nc1dpbmRvd01hcmdpbiwKLSAgICAgICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3dNYXJnaW4gLSB0b3RhbEhlaWdodCwgR3Jhdml0eS5CT1RUT00gfCBHcmF2aXR5LlJJR0hUKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIE1lZGlhQ29udHJvbGxlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFDb250cm9sbGVyLkNhbGxiYWNrIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWJhY2tTdGF0ZUNoYW5nZWQoUGxheWJhY2tTdGF0ZSBzdGF0ZSkgewotICAgICAgICAgICAgbVBsYXliYWNrU3RhdGUgPSBzdGF0ZTsKLQotICAgICAgICAgICAgLy8gVXBkYXRlIHBhdXNlIGJ1dHRvbiBkZXBlbmRpbmcgb24gcGxheWJhY2sgc3RhdGUgZm9yIHRoZSBmb2xsb3dpbmcgdHdvIHJlYXNvbnM6Ci0gICAgICAgICAgICAvLyAgIDEpIE5lZWQgdG8gaGFuZGxlIGNhc2Ugd2hlcmUgYXBwIGN1c3RvbWl6ZXMgcGxheWJhY2sgc3RhdGUgYmVoYXZpb3Igd2hlbiBhcHAKLSAgICAgICAgICAgIC8vICAgICAgYWN0aXZpdHkgaXMgcmVzdW1lZC4KLSAgICAgICAgICAgIC8vICAgMikgTmVlZCB0byBoYW5kbGUgY2FzZSB3aGVyZSB0aGUgbWVkaWEgZmlsZSByZWFjaGVzIGVuZCBvZiBkdXJhdGlvbi4KLSAgICAgICAgICAgIGlmIChtUGxheWJhY2tTdGF0ZS5nZXRTdGF0ZSgpICE9IG1QcmV2U3RhdGUpIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKG1QbGF5YmFja1N0YXRlLmdldFN0YXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBQbGF5YmFja1N0YXRlLlNUQVRFX1BMQVlJTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19wYXVzZV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wYXVzZV9idXR0b25fZGVzYykpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnJlbW92ZUNhbGxiYWNrcyhtVXBkYXRlUHJvZ3Jlc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnBvc3QobVVwZGF0ZVByb2dyZXNzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFBsYXliYWNrU3RhdGUuU1RBVEVfUEFVU0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfcGxheV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wbGF5X2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBQbGF5YmFja1N0YXRlLlNUQVRFX1NUT1BQRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19yZXBsYXlfY2lyY2xlX2ZpbGxlZCwgbnVsbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfcmVwbGF5X2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSXNTdG9wcGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1QcmV2U3RhdGUgPSBtUGxheWJhY2tTdGF0ZS5nZXRTdGF0ZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVBsYXliYWNrQWN0aW9ucyAhPSBtUGxheWJhY2tTdGF0ZS5nZXRBY3Rpb25zKCkpIHsKLSAgICAgICAgICAgICAgICBsb25nIG5ld0FjdGlvbnMgPSBtUGxheWJhY2tTdGF0ZS5nZXRBY3Rpb25zKCk7Ci0gICAgICAgICAgICAgICAgaWYgKChuZXdBY3Rpb25zICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUEFVU0UpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgobmV3QWN0aW9ucyAmIFBsYXliYWNrU3RhdGUuQUNUSU9OX1JFV0lORCkgIT0gMAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbU1lZGlhVHlwZSAhPSBNRURJQV9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtUmV3QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZXdCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgobmV3QWN0aW9ucyAmIFBsYXliYWNrU3RhdGUuQUNUSU9OX0ZBU1RfRk9SV0FSRCkgIT0gMAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbU1lZGlhVHlwZSAhPSBNRURJQV9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtRmZ3ZEJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChuZXdBY3Rpb25zICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fU0VFS19UTykgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtU2Vla0F2YWlsYWJsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbVNlZWtBdmFpbGFibGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrQWN0aW9ucyA9IG5ld0FjdGlvbnM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEFkZCBidXR0b25zIGlmIGN1c3RvbSBhY3Rpb25zIGFyZSBwcmVzZW50LgotICAgICAgICAgICAgTGlzdDxQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbj4gY3VzdG9tQWN0aW9ucyA9IG1QbGF5YmFja1N0YXRlLmdldEN1c3RvbUFjdGlvbnMoKTsKLSAgICAgICAgICAgIG1DdXN0b21CdXR0b25zLnJlbW92ZUFsbFZpZXdzKCk7Ci0gICAgICAgICAgICBpZiAoY3VzdG9tQWN0aW9ucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbiBhY3Rpb24gOiBjdXN0b21BY3Rpb25zKSB7Ci0gICAgICAgICAgICAgICAgICAgIEltYWdlQnV0dG9uIGJ1dHRvbiA9IG5ldyBJbWFnZUJ1dHRvbihtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwgLyogQXR0cmlidXRlU2V0ICovLCAwIC8qIFN0eWxlICovKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogQXBwbHkgUi5zdHlsZS5Cb3R0b21CYXJCdXR0b24gdG8gdGhpcyBidXR0b24gdXNpbmcgbGlicmFyeSBjb250ZXh0LgotICAgICAgICAgICAgICAgICAgICAvLyBSZWZlciBDb25zdHJ1Y3RvciB3aXRoIGFyZ3VtZW50IChpbnQgZGVmU3R5bGVSZXMpIG9mIFZpZXcuamF2YQotICAgICAgICAgICAgICAgICAgICBidXR0b24uc2V0SW1hZ2VSZXNvdXJjZShhY3Rpb24uZ2V0SWNvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgYnV0dG9uLnNldFRvb2x0aXBUZXh0KGFjdGlvbi5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgYWN0aW9uU3RyaW5nID0gYWN0aW9uLmdldEFjdGlvbigpLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IEN1cnJlbnRseSwgd2UgYXJlIGp1c3Qgc2VuZGluZyBleHRyYXMgdGhhdCBjYW1lIGZyb20gc2Vzc2lvbi4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJcyBpdCB0aGUgcmlnaHQgYmVoYXZpb3I/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xzLnNlbmRDdXN0b21BY3Rpb24oYWN0aW9uU3RyaW5nLCBhY3Rpb24uZ2V0RXh0cmFzKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgICAgICAgICBtQ3VzdG9tQnV0dG9ucy5hZGRWaWV3KGJ1dHRvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uTWV0YWRhdGFDaGFuZ2VkKE1lZGlhTWV0YWRhdGEgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICAgICAgdXBkYXRlRHVyYXRpb24oKTsKLSAgICAgICAgICAgIHVwZGF0ZVRpdGxlKCk7Ci0gICAgICAgICAgICB1cGRhdGVBdWRpb01ldGFkYXRhKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZXNzaW9uRXZlbnQoU3RyaW5nIGV2ZW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBFVkVOVF9VUERBVEVfVFJBQ0tfU1RBVFVTOgotICAgICAgICAgICAgICAgICAgICBtVmlkZW9UcmFja0NvdW50ID0gZXh0cmFzLmdldEludChLRVlfVklERU9fVFJBQ0tfQ09VTlQpOwotICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBvbmUgb3IgbW9yZSBhdWRpbyB0cmFja3MsIGFuZCB0aGlzIGluZm9ybWF0aW9uIGhhcyBub3QgYmVlbgotICAgICAgICAgICAgICAgICAgICAvLyByZWZsZWN0ZWQgaW50byB0aGUgU2V0dGluZ3Mgd2luZG93IHlldCwgYXV0b21hdGljYWxseSBjaGVjayB0aGUgZmlyc3QgdHJhY2suCi0gICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgdGhlIEF1ZGlvIFRyYWNrIHNlbGVjdGlvbiB3aWxsIGJlIGRlZmF1bHRlZCB0byAiTm9uZSIuCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrQ291bnQgPSBleHRyYXMuZ2V0SW50KEtFWV9BVURJT19UUkFDS19DT1VOVCk7Ci0gICAgICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvVHJhY2tDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGFkZCBtb3JlIHRleHQgYWJvdXQgdHJhY2sgaW5mby4KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUF1ZGlvVHJhY2tDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHRyYWNrID0gbVJlc291cmNlcy5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9hdWRpb190cmFja19udW1iZXJfdGV4dCwgaSArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrTGlzdC5hZGQodHJhY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2hhbmdlIHN1YiB0ZXh0IGluc2lkZSB0aGUgU2V0dGluZ3Mgd2luZG93LgotICAgICAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzU3ViVGV4dHNMaXN0LnNldChTRVRUSU5HU19NT0RFX0FVRElPX1RSQUNLLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9UcmFja0xpc3QuZ2V0KDApKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrTGlzdC5hZGQobVJlc291cmNlcy5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX25vbmVfdGV4dCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtVmlkZW9UcmFja0NvdW50ID09IDAgJiYgbUF1ZGlvVHJhY2tDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVR5cGUgPSBNRURJQV9UWVBFX01VU0lDOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlVHJhY2tDb3VudCA9IGV4dHJhcy5nZXRJbnQoS0VZX1NVQlRJVExFX1RSQUNLX0NPVU5UKTsKLSAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlRGVzY3JpcHRpb25zTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICAgICAgICAgICAgICBpZiAobVN1YnRpdGxlVHJhY2tDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZURlc2NyaXB0aW9uc0xpc3QuYWRkKG1SZXNvdXJjZXMuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9zdWJ0aXRsZV9vZmZfdGV4dCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtU3VidGl0bGVUcmFja0NvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHJhY2sgPSBtUmVzb3VyY2VzLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX3N1YnRpdGxlX3RyYWNrX251bWJlcl90ZXh0LCBpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlRGVzY3JpcHRpb25zTGlzdC5hZGQodHJhY2spOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEVWRU5UX1VQREFURV9NRURJQV9UWVBFX1NUQVRVUzoKLSAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBuZXdTdGF0dXMgPSBleHRyYXMuZ2V0Qm9vbGVhbihLRVlfU1RBVEVfSVNfQURWRVJUSVNFTUVOVCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0dXMgIT0gbUlzQWR2ZXJ0aXNlbWVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUlzQWR2ZXJ0aXNlbWVudCA9IG5ld1N0YXR1czsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZUxheW91dCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBTZXR0aW5nc0FkYXB0ZXIgZXh0ZW5kcyBCYXNlQWRhcHRlciB7Ci0gICAgICAgIHByaXZhdGUgTGlzdDxJbnRlZ2VyPiBtSWNvbklkczsKLSAgICAgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbU1haW5UZXh0czsKLSAgICAgICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVN1YlRleHRzOwotCi0gICAgICAgIHB1YmxpYyBTZXR0aW5nc0FkYXB0ZXIoTGlzdDxTdHJpbmc+IG1haW5UZXh0cywgQE51bGxhYmxlIExpc3Q8U3RyaW5nPiBzdWJUZXh0cywKLSAgICAgICAgICAgICAgICBATnVsbGFibGUgTGlzdDxJbnRlZ2VyPiBpY29uSWRzKSB7Ci0gICAgICAgICAgICBtTWFpblRleHRzID0gbWFpblRleHRzOwotICAgICAgICAgICAgbVN1YlRleHRzID0gc3ViVGV4dHM7Ci0gICAgICAgICAgICBtSWNvbklkcyA9IGljb25JZHM7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVTdWJUZXh0cyhMaXN0PFN0cmluZz4gc3ViVGV4dHMpIHsKLSAgICAgICAgICAgIG1TdWJUZXh0cyA9IHN1YlRleHRzOwotICAgICAgICAgICAgbm90aWZ5RGF0YVNldENoYW5nZWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFpblRleHQoaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICBpZiAobU1haW5UZXh0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgbU1haW5UZXh0cy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1NYWluVGV4dHMuZ2V0KHBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gUkVTT1VSQ0VfRU1QVFk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKLSAgICAgICAgICAgIHJldHVybiAobU1haW5UZXh0cyA9PSBudWxsKSA/IDAgOiBtTWFpblRleHRzLnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgbG9uZyBnZXRJdGVtSWQoaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICAvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yi0tZG9lcyBub3QgaGF2ZSBhbnkgcHVycG9zZSBoZXJlCi0gICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcy4KLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBPYmplY3QgZ2V0SXRlbShpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgICAgIC8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViLS1kb2VzIG5vdCBoYXZlIGFueSBwdXJwb3NlIGhlcmUKLSAgICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzLgotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFZpZXcgZ2V0VmlldyhpbnQgcG9zaXRpb24sIFZpZXcgY29udmVydFZpZXcsIFZpZXdHcm91cCBjb250YWluZXIpIHsKLSAgICAgICAgICAgIFZpZXcgcm93OwotICAgICAgICAgICAgaWYgKG1TaXplVHlwZSA9PSBTSVpFX1RZUEVfRlVMTCkgewotICAgICAgICAgICAgICAgIHJvdyA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBSLmxheW91dC5mdWxsX3NldHRpbmdzX2xpc3RfaXRlbSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJvdyA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBSLmxheW91dC5lbWJlZGRlZF9zZXR0aW5nc19saXN0X2l0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVGV4dFZpZXcgbWFpblRleHRWaWV3ID0gKFRleHRWaWV3KSByb3cuZmluZFZpZXdCeUlkKFIuaWQubWFpbl90ZXh0KTsKLSAgICAgICAgICAgIFRleHRWaWV3IHN1YlRleHRWaWV3ID0gKFRleHRWaWV3KSByb3cuZmluZFZpZXdCeUlkKFIuaWQuc3ViX3RleHQpOwotICAgICAgICAgICAgSW1hZ2VWaWV3IGljb25WaWV3ID0gKEltYWdlVmlldykgcm93LmZpbmRWaWV3QnlJZChSLmlkLmljb24pOwotCi0gICAgICAgICAgICAvLyBTZXQgbWFpbiB0ZXh0Ci0gICAgICAgICAgICBtYWluVGV4dFZpZXcuc2V0VGV4dChtTWFpblRleHRzLmdldChwb3NpdGlvbikpOwotCi0gICAgICAgICAgICAvLyBSZW1vdmUgc3ViIHRleHQgYW5kIGNlbnRlciB0aGUgbWFpbiB0ZXh0IGlmIHN1YiB0ZXh0cyBkbyBub3QgZXhpc3QgYXQgYWxsIG9yIHRoZSBzdWIKLSAgICAgICAgICAgIC8vIHRleHQgYXQgdGhpcyBwYXJ0aWN1bGFyIHBvc2l0aW9uIGlzIGVtcHR5LgotICAgICAgICAgICAgaWYgKG1TdWJUZXh0cyA9PSBudWxsIHx8IG1TdWJUZXh0cy5nZXQocG9zaXRpb24pID09IFJFU09VUkNFX0VNUFRZKSB7Ci0gICAgICAgICAgICAgICAgc3ViVGV4dFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHNldCBzdWIgdGV4dC4KLSAgICAgICAgICAgICAgICBzdWJUZXh0Vmlldy5zZXRUZXh0KG1TdWJUZXh0cy5nZXQocG9zaXRpb24pKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUmVtb3ZlIG1haW4gaWNvbiBhbmQgc2V0IHZpc2liaWxpdHkgdG8gZ29uZSBpZiBpY29ucyBhcmUgc2V0IHRvIG51bGwgb3IgdGhlIGljb24gYXQKLSAgICAgICAgICAgIC8vIHRoaXMgcGFydGljdWxhciBwb3NpdGlvbiBpcyBzZXQgdG8gUkVTT1VSQ0VfTk9OX0VYSVNURU5ULgotICAgICAgICAgICAgaWYgKG1JY29uSWRzID09IG51bGwgfHwgbUljb25JZHMuZ2V0KHBvc2l0aW9uKSA9PSBSRVNPVVJDRV9OT05fRVhJU1RFTlQpIHsKLSAgICAgICAgICAgICAgICBpY29uVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgc2V0IG1haW4gaWNvbi4KLSAgICAgICAgICAgICAgICBpY29uVmlldy5zZXRJbWFnZURyYXdhYmxlKG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUobUljb25JZHMuZ2V0KHBvc2l0aW9uKSwgbnVsbCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJvdzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFN1YlRleHRzKExpc3Q8U3RyaW5nPiBzdWJUZXh0cykgewotICAgICAgICAgICAgbVN1YlRleHRzID0gc3ViVGV4dHM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBleHRlbmQgdGhpcyBjbGFzcyBmcm9tIFNldHRpbmdzQWRhcHRlcgotICAgIHByaXZhdGUgY2xhc3MgU3ViU2V0dGluZ3NBZGFwdGVyIGV4dGVuZHMgQmFzZUFkYXB0ZXIgewotICAgICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtVGV4dHM7Ci0gICAgICAgIHByaXZhdGUgaW50IG1DaGVja1Bvc2l0aW9uOwotCi0gICAgICAgIHB1YmxpYyBTdWJTZXR0aW5nc0FkYXB0ZXIoTGlzdDxTdHJpbmc+IHRleHRzLCBpbnQgY2hlY2tQb3NpdGlvbikgewotICAgICAgICAgICAgbVRleHRzID0gdGV4dHM7Ci0gICAgICAgICAgICBtQ2hlY2tQb3NpdGlvbiA9IGNoZWNrUG9zaXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldE1haW5UZXh0KGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgaWYgKG1UZXh0cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgbVRleHRzLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVRleHRzLmdldChwb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFJFU09VUkNFX0VNUFRZOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1UZXh0cyA9PSBudWxsKSA/IDAgOiBtVGV4dHMuc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBsb25nIGdldEl0ZW1JZChpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgICAgIC8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViLS1kb2VzIG5vdCBoYXZlIGFueSBwdXJwb3NlIGhlcmUKLSAgICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzLgotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRJdGVtKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWItLWRvZXMgbm90IGhhdmUgYW55IHB1cnBvc2UgaGVyZQotICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMuCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIGNvbnRhaW5lcikgewotICAgICAgICAgICAgVmlldyByb3c7Ci0gICAgICAgICAgICBpZiAobVNpemVUeXBlID09IFNJWkVfVFlQRV9GVUxMKSB7Ci0gICAgICAgICAgICAgICAgcm93ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0LmZ1bGxfc3ViX3NldHRpbmdzX2xpc3RfaXRlbSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJvdyA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICBSLmxheW91dC5lbWJlZGRlZF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFRleHRWaWV3IHRleHRWaWV3ID0gKFRleHRWaWV3KSByb3cuZmluZFZpZXdCeUlkKFIuaWQudGV4dCk7Ci0gICAgICAgICAgICBJbWFnZVZpZXcgY2hlY2tWaWV3ID0gKEltYWdlVmlldykgcm93LmZpbmRWaWV3QnlJZChSLmlkLmNoZWNrKTsKLQotICAgICAgICAgICAgdGV4dFZpZXcuc2V0VGV4dChtVGV4dHMuZ2V0KHBvc2l0aW9uKSk7Ci0gICAgICAgICAgICBpZiAocG9zaXRpb24gIT0gbUNoZWNrUG9zaXRpb24pIHsKLSAgICAgICAgICAgICAgICBjaGVja1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LklOVklTSUJMRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcm93OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0VGV4dHMoTGlzdDxTdHJpbmc+IHRleHRzKSB7Ci0gICAgICAgICAgICBtVGV4dHMgPSB0ZXh0czsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldENoZWNrUG9zaXRpb24oaW50IGNoZWNrUG9zaXRpb24pIHsKLSAgICAgICAgICAgIG1DaGVja1Bvc2l0aW9uID0gY2hlY2tQb3NpdGlvbjsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1N1YnRpdGxlVmlldy5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvU3VidGl0bGVWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3YjJjZDEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvU3VidGl0bGVWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNhbnZhczsKLWltcG9ydCBhbmRyb2lkLm9zLkxvb3BlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkZyYW1lTGF5b3V0OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGUuU3VidGl0bGVDb250cm9sbGVyLkFuY2hvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZS5TdWJ0aXRsZVRyYWNrLlJlbmRlcmluZ1dpZGdldDsKLQotY2xhc3MgU3VidGl0bGVWaWV3IGV4dGVuZHMgRnJhbWVMYXlvdXQgaW1wbGVtZW50cyBBbmNob3IgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU3VidGl0bGVWaWV3IjsKLQotICAgIHByaXZhdGUgUmVuZGVyaW5nV2lkZ2V0IG1TdWJ0aXRsZVdpZGdldDsKLSAgICBwcml2YXRlIFJlbmRlcmluZ1dpZGdldC5PbkNoYW5nZWRMaXN0ZW5lciBtU3VidGl0bGVzQ2hhbmdlZExpc3RlbmVyOwotCi0gICAgcHVibGljIFN1YnRpdGxlVmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3VidGl0bGVWaWV3KENvbnRleHQgY29udGV4dCwgQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3VidGl0bGVWaWV3KENvbnRleHQgY29udGV4dCwgQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0cikgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBTdWJ0aXRsZVZpZXcoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIEBOdWxsYWJsZSBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCBkZWZTdHlsZVJlcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGVXaWRnZXQoUmVuZGVyaW5nV2lkZ2V0IHN1YnRpdGxlV2lkZ2V0KSB7Ci0gICAgICAgIGlmIChtU3VidGl0bGVXaWRnZXQgPT0gc3VidGl0bGVXaWRnZXQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gYXR0YWNoZWRUb1dpbmRvdyA9IGlzQXR0YWNoZWRUb1dpbmRvdygpOwotICAgICAgICBpZiAobVN1YnRpdGxlV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChhdHRhY2hlZFRvV2luZG93KSB7Ci0gICAgICAgICAgICAgICAgbVN1YnRpdGxlV2lkZ2V0Lm9uRGV0YWNoZWRGcm9tV2luZG93KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1TdWJ0aXRsZVdpZGdldC5zZXRPbkNoYW5nZWRMaXN0ZW5lcihudWxsKTsKLSAgICAgICAgfQotICAgICAgICBtU3VidGl0bGVXaWRnZXQgPSBzdWJ0aXRsZVdpZGdldDsKLQotICAgICAgICBpZiAoc3VidGl0bGVXaWRnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1TdWJ0aXRsZXNDaGFuZ2VkTGlzdGVuZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TdWJ0aXRsZXNDaGFuZ2VkTGlzdGVuZXIgPSBuZXcgUmVuZGVyaW5nV2lkZ2V0Lk9uQ2hhbmdlZExpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25DaGFuZ2VkKFJlbmRlcmluZ1dpZGdldCByZW5kZXJpbmdXaWRnZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNldFdpbGxOb3REcmF3KGZhbHNlKTsKLSAgICAgICAgICAgIHN1YnRpdGxlV2lkZ2V0LnNldE9uQ2hhbmdlZExpc3RlbmVyKG1TdWJ0aXRsZXNDaGFuZ2VkTGlzdGVuZXIpOwotCi0gICAgICAgICAgICBpZiAoYXR0YWNoZWRUb1dpbmRvdykgewotICAgICAgICAgICAgICAgIHN1YnRpdGxlV2lkZ2V0Lm9uQXR0YWNoZWRUb1dpbmRvdygpOwotICAgICAgICAgICAgICAgIHJlcXVlc3RMYXlvdXQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldFdpbGxOb3REcmF3KHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMb29wZXIgZ2V0U3VidGl0bGVMb29wZXIoKSB7Ci0gICAgICAgIHJldHVybiBMb29wZXIuZ2V0TWFpbkxvb3BlcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvdygpIHsKLSAgICAgICAgc3VwZXIub25BdHRhY2hlZFRvV2luZG93KCk7Ci0KLSAgICAgICAgaWYgKG1TdWJ0aXRsZVdpZGdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU3VidGl0bGVXaWRnZXQub25BdHRhY2hlZFRvV2luZG93KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvdygpIHsKLSAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKLQotICAgICAgICBpZiAobVN1YnRpdGxlV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TdWJ0aXRsZVdpZGdldC5vbkRldGFjaGVkRnJvbVdpbmRvdygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25MYXlvdXQoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSB7Ci0gICAgICAgIHN1cGVyLm9uTGF5b3V0KGNoYW5nZWQsIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7Ci0KLSAgICAgICAgaWYgKG1TdWJ0aXRsZVdpZGdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBnZXRXaWR0aCgpIC0gZ2V0UGFkZGluZ0xlZnQoKSAtIGdldFBhZGRpbmdSaWdodCgpOwotICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IGdldEhlaWdodCgpIC0gZ2V0UGFkZGluZ1RvcCgpIC0gZ2V0UGFkZGluZ0JvdHRvbSgpOwotCi0gICAgICAgICAgICBtU3VidGl0bGVXaWRnZXQuc2V0U2l6ZSh3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGNhbnZhcykgewotICAgICAgICBzdXBlci5kcmF3KGNhbnZhcyk7Ci0KLSAgICAgICAgaWYgKG1TdWJ0aXRsZVdpZGdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgc2F2ZUNvdW50ID0gY2FudmFzLnNhdmUoKTsKLSAgICAgICAgICAgIGNhbnZhcy50cmFuc2xhdGUoZ2V0UGFkZGluZ0xlZnQoKSwgZ2V0UGFkZGluZ1RvcCgpKTsKLSAgICAgICAgICAgIG1TdWJ0aXRsZVdpZGdldC5kcmF3KGNhbnZhcyk7Ci0gICAgICAgICAgICBjYW52YXMucmVzdG9yZVRvQ291bnQoc2F2ZUNvdW50KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0QWNjZXNzaWJpbGl0eUNsYXNzTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIFN1YnRpdGxlVmlldy5jbGFzcy5nZXROYW1lKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9TdXJmYWNlVmlldy5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9TdXJmYWNlVmlldy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzkyZTg1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvU3VyZmFjZVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZUhvbGRlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3Mi5WSUVXX1RZUEVfU1VSRkFDRVZJRVc7Ci0KLWNsYXNzIFZpZGVvU3VyZmFjZVZpZXcgZXh0ZW5kcyBTdXJmYWNlVmlldyBpbXBsZW1lbnRzIFZpZGVvVmlld0ludGVyZmFjZSwgU3VyZmFjZUhvbGRlci5DYWxsYmFjayB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJWaWRlb1N1cmZhY2VWaWV3IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gU1RPUFNISVA6IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLSAgICBwcml2YXRlIFN1cmZhY2VIb2xkZXIgbVN1cmZhY2VIb2xkZXIgPSBudWxsOwotICAgIHByaXZhdGUgU3VyZmFjZUxpc3RlbmVyIG1TdXJmYWNlTGlzdGVuZXIgPSBudWxsOwotICAgIHByaXZhdGUgTWVkaWFQbGF5ZXIyIG1NZWRpYVBsYXllcjsKLSAgICAvLyBBIGZsYWcgdG8gaW5kaWNhdGUgdGFraW5nIG92ZXIgb3RoZXIgdmlldyBzaG91bGQgYmUgcHJvY2VlZC4KLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzVGFraW5nT3Zlck9sZFZpZXc7Ci0gICAgcHJpdmF0ZSBWaWRlb1ZpZXdJbnRlcmZhY2UgbU9sZFZpZXc7Ci0KLQotICAgIHB1YmxpYyBWaWRlb1N1cmZhY2VWaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBWaWRlb1N1cmZhY2VWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBWaWRlb1N1cmZhY2VWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZpZGVvU3VyZmFjZVZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlZlN0eWxlUmVzKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIGRlZlN0eWxlUmVzKTsKLSAgICAgICAgZ2V0SG9sZGVyKCkuYWRkQ2FsbGJhY2sodGhpcyk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIGltcGxlbWVudHMgVmlkZW9WaWV3SW50ZXJmYWNlCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIoTWVkaWFQbGF5ZXIyIG1wKSB7Ci0gICAgICAgIExvZy5kKFRBRywgImFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKCk6IG1TdXJmYWNlSG9sZGVyOiAiICsgbVN1cmZhY2VIb2xkZXIpOwotICAgICAgICBpZiAobXAgPT0gbnVsbCB8fCAhaGFzQXZhaWxhYmxlU3VyZmFjZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgbXAuc2V0RGlzcGxheShtU3VyZmFjZUhvbGRlcik7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFN1cmZhY2VMaXN0ZW5lcihTdXJmYWNlTGlzdGVuZXIgbCkgewotICAgICAgICBtU3VyZmFjZUxpc3RlbmVyID0gbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFZpZXdUeXBlKCkgewotICAgICAgICByZXR1cm4gVklFV19UWVBFX1NVUkZBQ0VWSUVXOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhUGxheWVyKE1lZGlhUGxheWVyMiBtcCkgewotICAgICAgICBtTWVkaWFQbGF5ZXIgPSBtcDsKLSAgICAgICAgaWYgKG1Jc1Rha2luZ092ZXJPbGRWaWV3KSB7Ci0gICAgICAgICAgICB0YWtlT3ZlcihtT2xkVmlldyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0YWtlT3ZlcihATm9uTnVsbCBWaWRlb1ZpZXdJbnRlcmZhY2Ugb2xkVmlldykgewotICAgICAgICBpZiAoYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIobU1lZGlhUGxheWVyKSkgewotICAgICAgICAgICAgKChWaWV3KSBvbGRWaWV3KS5zZXRWaXNpYmlsaXR5KEdPTkUpOwotICAgICAgICAgICAgbUlzVGFraW5nT3Zlck9sZFZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgIG1PbGRWaWV3ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZVRha2VPdmVyRG9uZSh0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Jc1Rha2luZ092ZXJPbGRWaWV3ID0gdHJ1ZTsKLSAgICAgICAgICAgIG1PbGRWaWV3ID0gb2xkVmlldzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGhhc0F2YWlsYWJsZVN1cmZhY2UoKSB7Ci0gICAgICAgIHJldHVybiAobVN1cmZhY2VIb2xkZXIgIT0gbnVsbCAmJiBtU3VyZmFjZUhvbGRlci5nZXRTdXJmYWNlKCkgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIGltcGxlbWVudHMgU3VyZmFjZUhvbGRlci5DYWxsYmFjawotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VDcmVhdGVkKFN1cmZhY2VIb2xkZXIgaG9sZGVyKSB7Ci0gICAgICAgIExvZy5kKFRBRywgInN1cmZhY2VDcmVhdGVkOiBtU3VyZmFjZUhvbGRlcjogIiArIG1TdXJmYWNlSG9sZGVyICsgIiwgbmV3IGhvbGRlcjogIiArIGhvbGRlcik7Ci0gICAgICAgIG1TdXJmYWNlSG9sZGVyID0gaG9sZGVyOwotICAgICAgICBpZiAobUlzVGFraW5nT3Zlck9sZFZpZXcpIHsKLSAgICAgICAgICAgIHRha2VPdmVyKG1PbGRWaWV3KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKG1NZWRpYVBsYXllcik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobVN1cmZhY2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBSZWN0IHJlY3QgPSBtU3VyZmFjZUhvbGRlci5nZXRTdXJmYWNlRnJhbWUoKTsKLSAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlQ3JlYXRlZCh0aGlzLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3VyZmFjZUNoYW5nZWQoU3VyZmFjZUhvbGRlciBob2xkZXIsIGludCBmb3JtYXQsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICBpZiAobVN1cmZhY2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZUNoYW5nZWQodGhpcywgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdXJmYWNlRGVzdHJveWVkKFN1cmZhY2VIb2xkZXIgaG9sZGVyKSB7Ci0gICAgICAgIC8vIEFmdGVyIHdlIHJldHVybiBmcm9tIHRoaXMgd2UgY2FuJ3QgdXNlIHRoZSBzdXJmYWNlIGFueSBtb3JlCi0gICAgICAgIG1TdXJmYWNlSG9sZGVyID0gbnVsbDsKLSAgICAgICAgaWYgKG1TdXJmYWNlTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VEZXN0cm95ZWQodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBJbnZlc3RpZ2F0ZSB0aGUgd2F5IHRvIG1vdmUgb25NZWFzdXJlKCkgY29kZSBpbnRvIEZyYW1lTGF5b3V0LgotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgIGludCB2aWRlb1dpZHRoID0gKG1NZWRpYVBsYXllciA9PSBudWxsKSA/IDAgOiBtTWVkaWFQbGF5ZXIuZ2V0VmlkZW9XaWR0aCgpOwotICAgICAgICBpbnQgdmlkZW9IZWlnaHQgPSAobU1lZGlhUGxheWVyID09IG51bGwpID8gMCA6IG1NZWRpYVBsYXllci5nZXRWaWRlb0hlaWdodCgpOwotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uTWVhc3VyZSgiICsgTWVhc3VyZVNwZWMudG9TdHJpbmcod2lkdGhNZWFzdXJlU3BlYykgKyAiLCAiCi0gICAgICAgICAgICAgICAgICAgICsgTWVhc3VyZVNwZWMudG9TdHJpbmcoaGVpZ2h0TWVhc3VyZVNwZWMpICsgIikiKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiBtZWFzdXJlZFNpemU6ICIgKyBnZXRNZWFzdXJlZFdpZHRoKCkgKyAiLyIgKyBnZXRNZWFzdXJlZEhlaWdodCgpKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiB2aWV3U2l6ZTogIiArIGdldFdpZHRoKCkgKyAiLyIgKyBnZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICIgbVZpZGVvV2lkdGgvaGVpZ2h0OiAiICsgdmlkZW9XaWR0aCArICIsICIgKyB2aWRlb0hlaWdodCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgd2lkdGggPSBnZXREZWZhdWx0U2l6ZSh2aWRlb1dpZHRoLCB3aWR0aE1lYXN1cmVTcGVjKTsKLSAgICAgICAgaW50IGhlaWdodCA9IGdldERlZmF1bHRTaXplKHZpZGVvSGVpZ2h0LCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0KLSAgICAgICAgaWYgKHZpZGVvV2lkdGggPiAwICYmIHZpZGVvSGVpZ2h0ID4gMCkgewotICAgICAgICAgICAgaW50IHdpZHRoU3BlY1NpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKHdpZHRoTWVhc3VyZVNwZWMpOwotICAgICAgICAgICAgaW50IGhlaWdodFNwZWNTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYyk7Ci0KLSAgICAgICAgICAgIHdpZHRoID0gd2lkdGhTcGVjU2l6ZTsKLSAgICAgICAgICAgIGhlaWdodCA9IGhlaWdodFNwZWNTaXplOwotCi0gICAgICAgICAgICAvLyBmb3IgY29tcGF0aWJpbGl0eSwgd2UgYWRqdXN0IHNpemUgYmFzZWQgb24gYXNwZWN0IHJhdGlvCi0gICAgICAgICAgICBpZiAodmlkZW9XaWR0aCAqIGhlaWdodCA8IHdpZHRoICogdmlkZW9IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICB3aWR0aCA9IGhlaWdodCAqIHZpZGVvV2lkdGggLyB2aWRlb0hlaWdodDsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiaW1hZ2UgdG9vIHdpZGUsIGNvcnJlY3RpbmcuIHdpZHRoOiAiICsgd2lkdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAodmlkZW9XaWR0aCAqIGhlaWdodCA+IHdpZHRoICogdmlkZW9IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICBoZWlnaHQgPSB3aWR0aCAqIHZpZGVvSGVpZ2h0IC8gdmlkZW9XaWR0aDsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiaW1hZ2UgdG9vIHRhbGwsIGNvcnJlY3RpbmcuIGhlaWdodDogIiArIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gbm8gc2l6ZSB5ZXQsIGp1c3QgYWRvcHQgdGhlIGdpdmVuIHNwZWMgc2l6ZXMKLSAgICAgICAgfQotICAgICAgICBzZXRNZWFzdXJlZERpbWVuc2lvbih3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJlbmQgb2Ygb25NZWFzdXJlKCkiKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiBtZWFzdXJlZFNpemU6ICIgKyBnZXRNZWFzdXJlZFdpZHRoKCkgKyAiLyIgKyBnZXRNZWFzdXJlZEhlaWdodCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiVmlld1R5cGU6IFN1cmZhY2VWaWV3IC8gVmlzaWJpbGl0eTogIiArIGdldFZpc2liaWxpdHkoKQotICAgICAgICAgICAgICAgICsgIiAvIHN1cmZhY2VIb2xkZXI6ICIgKyBtU3VyZmFjZUhvbGRlcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1RleHR1cmVWaWV3LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1RleHR1cmVWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyNGEzYWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9UZXh0dXJlVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5TdXJmYWNlVGV4dHVyZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLlJlcXVpcmVzQXBpOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuU3VyZmFjZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVGV4dHVyZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3Mi5WSUVXX1RZUEVfVEVYVFVSRVZJRVc7Ci0KLUBSZXF1aXJlc0FwaSgyNikKLWNsYXNzIFZpZGVvVGV4dHVyZVZpZXcgZXh0ZW5kcyBUZXh0dXJlVmlldwotICAgICAgICBpbXBsZW1lbnRzIFZpZGVvVmlld0ludGVyZmFjZSwgVGV4dHVyZVZpZXcuU3VyZmFjZVRleHR1cmVMaXN0ZW5lciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJWaWRlb1RleHR1cmVWaWV3IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gU1RPUFNISVA6IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIHByaXZhdGUgU3VyZmFjZVRleHR1cmUgbVN1cmZhY2VUZXh0dXJlOwotICAgIHByaXZhdGUgU3VyZmFjZSBtU3VyZmFjZTsKLSAgICBwcml2YXRlIFN1cmZhY2VMaXN0ZW5lciBtU3VyZmFjZUxpc3RlbmVyOwotICAgIHByaXZhdGUgTWVkaWFQbGF5ZXIyIG1NZWRpYVBsYXllcjsKLSAgICAvLyBBIGZsYWcgdG8gaW5kaWNhdGUgdGFraW5nIG92ZXIgb3RoZXIgdmlldyBzaG91bGQgYmUgcHJvY2VlZC4KLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzVGFraW5nT3Zlck9sZFZpZXc7Ci0gICAgcHJpdmF0ZSBWaWRlb1ZpZXdJbnRlcmZhY2UgbU9sZFZpZXc7Ci0KLSAgICBwdWJsaWMgVmlkZW9UZXh0dXJlVmlldyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmlkZW9UZXh0dXJlVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmlkZW9UZXh0dXJlVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0cikgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBWaWRlb1RleHR1cmVWaWV3KAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCBkZWZTdHlsZVJlcyk7Ci0gICAgICAgIHNldFN1cmZhY2VUZXh0dXJlTGlzdGVuZXIodGhpcyk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIGltcGxlbWVudHMgVmlkZW9WaWV3SW50ZXJmYWNlCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIoTWVkaWFQbGF5ZXIyIG1wKSB7Ci0gICAgICAgIExvZy5kKFRBRywgImFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKCk6IG1TdXJmYWNlVGV4dHVyZTogIiArIG1TdXJmYWNlVGV4dHVyZSk7Ci0gICAgICAgIGlmIChtcCA9PSBudWxsIHx8ICFoYXNBdmFpbGFibGVTdXJmYWNlKCkpIHsKLSAgICAgICAgICAgIC8vIFN1cmZhY2UgaXMgbm90IHJlYWR5LgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIG1wLnNldFN1cmZhY2UobVN1cmZhY2UpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTdXJmYWNlTGlzdGVuZXIoU3VyZmFjZUxpc3RlbmVyIGwpIHsKLSAgICAgICAgbVN1cmZhY2VMaXN0ZW5lciA9IGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRWaWV3VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIFZJRVdfVFlQRV9URVhUVVJFVklFVzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRNZWRpYVBsYXllcihNZWRpYVBsYXllcjIgbXApIHsKLSAgICAgICAgbU1lZGlhUGxheWVyID0gbXA7Ci0gICAgICAgIGlmIChtSXNUYWtpbmdPdmVyT2xkVmlldykgewotICAgICAgICAgICAgdGFrZU92ZXIobU9sZFZpZXcpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdGFrZU92ZXIoQE5vbk51bGwgVmlkZW9WaWV3SW50ZXJmYWNlIG9sZFZpZXcpIHsKLSAgICAgICAgaWYgKGFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKG1NZWRpYVBsYXllcikpIHsKLSAgICAgICAgICAgICgoVmlldykgb2xkVmlldykuc2V0VmlzaWJpbGl0eShHT05FKTsKLSAgICAgICAgICAgIG1Jc1Rha2luZ092ZXJPbGRWaWV3ID0gZmFsc2U7Ci0gICAgICAgICAgICBtT2xkVmlldyA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobVN1cmZhY2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VUYWtlT3ZlckRvbmUodGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtSXNUYWtpbmdPdmVyT2xkVmlldyA9IHRydWU7Ci0gICAgICAgICAgICBtT2xkVmlldyA9IG9sZFZpZXc7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNBdmFpbGFibGVTdXJmYWNlKCkgewotICAgICAgICByZXR1cm4gKG1TdXJmYWNlVGV4dHVyZSAhPSBudWxsICYmICFtU3VyZmFjZVRleHR1cmUuaXNSZWxlYXNlZCgpICYmIG1TdXJmYWNlICE9IG51bGwpOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBpbXBsZW1lbnRzIFRleHR1cmVWaWV3LlN1cmZhY2VUZXh0dXJlTGlzdGVuZXIKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VUZXh0dXJlQXZhaWxhYmxlKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2VUZXh0dXJlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAib25TdXJmYWNlVGV4dHVyZUF2YWlsYWJsZTogbVN1cmZhY2VUZXh0dXJlOiAiICsgbVN1cmZhY2VUZXh0dXJlCi0gICAgICAgICAgICAgICAgKyAiLCBuZXcgc3VyZmFjZTogIiArIHN1cmZhY2VUZXh0dXJlKTsKLSAgICAgICAgbVN1cmZhY2VUZXh0dXJlID0gc3VyZmFjZVRleHR1cmU7Ci0gICAgICAgIG1TdXJmYWNlID0gbmV3IFN1cmZhY2UobVN1cmZhY2VUZXh0dXJlKTsKLSAgICAgICAgaWYgKG1Jc1Rha2luZ092ZXJPbGRWaWV3KSB7Ci0gICAgICAgICAgICB0YWtlT3ZlcihtT2xkVmlldyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihtTWVkaWFQbGF5ZXIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlQ3JlYXRlZCh0aGlzLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZVRleHR1cmVTaXplQ2hhbmdlZChTdXJmYWNlVGV4dHVyZSBzdXJmYWNlVGV4dHVyZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlQ2hhbmdlZCh0aGlzLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgfQotICAgICAgICAvLyByZXF1ZXN0TGF5b3V0KCk7ICAvLyBUT0RPOiBmaWd1cmUgb3V0IGlmIGl0IHNob3VsZCBiZSBjYWxsZWQgaGVyZT8KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VUZXh0dXJlVXBkYXRlZChTdXJmYWNlVGV4dHVyZSBzdXJmYWNlKSB7Ci0gICAgICAgIC8vIG5vLW9wCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25TdXJmYWNlVGV4dHVyZURlc3Ryb3llZChTdXJmYWNlVGV4dHVyZSBzdXJmYWNlVGV4dHVyZSkgewotICAgICAgICBpZiAobVN1cmZhY2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZURlc3Ryb3llZCh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBtU3VyZmFjZVRleHR1cmUgPSBudWxsOwotICAgICAgICBtU3VyZmFjZSA9IG51bGw7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uTWVhc3VyZShpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgIGludCB2aWRlb1dpZHRoID0gKG1NZWRpYVBsYXllciA9PSBudWxsKSA/IDAgOiBtTWVkaWFQbGF5ZXIuZ2V0VmlkZW9XaWR0aCgpOwotICAgICAgICBpbnQgdmlkZW9IZWlnaHQgPSAobU1lZGlhUGxheWVyID09IG51bGwpID8gMCA6IG1NZWRpYVBsYXllci5nZXRWaWRlb0hlaWdodCgpOwotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uTWVhc3VyZSgiICsgTWVhc3VyZVNwZWMudG9TdHJpbmcod2lkdGhNZWFzdXJlU3BlYykgKyAiLCAiCi0gICAgICAgICAgICAgICAgICAgICsgTWVhc3VyZVNwZWMudG9TdHJpbmcoaGVpZ2h0TWVhc3VyZVNwZWMpICsgIikiKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiBtZWFzdXJlZFNpemU6ICIgKyBnZXRNZWFzdXJlZFdpZHRoKCkgKyAiLyIgKyBnZXRNZWFzdXJlZEhlaWdodCgpKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiB2aWV3U2l6ZTogIiArIGdldFdpZHRoKCkgKyAiLyIgKyBnZXRIZWlnaHQoKSk7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICIgbVZpZGVvV2lkdGgvaGVpZ2h0OiAiICsgdmlkZW9XaWR0aCArICIsICIgKyB2aWRlb0hlaWdodCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgd2lkdGggPSBnZXREZWZhdWx0U2l6ZSh2aWRlb1dpZHRoLCB3aWR0aE1lYXN1cmVTcGVjKTsKLSAgICAgICAgaW50IGhlaWdodCA9IGdldERlZmF1bHRTaXplKHZpZGVvSGVpZ2h0LCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0KLSAgICAgICAgaWYgKHZpZGVvV2lkdGggPiAwICYmIHZpZGVvSGVpZ2h0ID4gMCkgewotICAgICAgICAgICAgaW50IHdpZHRoU3BlY1NpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKHdpZHRoTWVhc3VyZVNwZWMpOwotICAgICAgICAgICAgaW50IGhlaWdodFNwZWNTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYyk7Ci0KLSAgICAgICAgICAgIHdpZHRoID0gd2lkdGhTcGVjU2l6ZTsKLSAgICAgICAgICAgIGhlaWdodCA9IGhlaWdodFNwZWNTaXplOwotCi0gICAgICAgICAgICAvLyBmb3IgY29tcGF0aWJpbGl0eSwgd2UgYWRqdXN0IHNpemUgYmFzZWQgb24gYXNwZWN0IHJhdGlvCi0gICAgICAgICAgICBpZiAodmlkZW9XaWR0aCAqIGhlaWdodCA8IHdpZHRoICogdmlkZW9IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICB3aWR0aCA9IGhlaWdodCAqIHZpZGVvV2lkdGggLyB2aWRlb0hlaWdodDsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiaW1hZ2UgdG9vIHdpZGUsIGNvcnJlY3RpbmcuIHdpZHRoOiAiICsgd2lkdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAodmlkZW9XaWR0aCAqIGhlaWdodCA+IHdpZHRoICogdmlkZW9IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICBoZWlnaHQgPSB3aWR0aCAqIHZpZGVvSGVpZ2h0IC8gdmlkZW9XaWR0aDsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiaW1hZ2UgdG9vIHRhbGwsIGNvcnJlY3RpbmcuIGhlaWdodDogIiArIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gbm8gc2l6ZSB5ZXQsIGp1c3QgYWRvcHQgdGhlIGdpdmVuIHNwZWMgc2l6ZXMKLSAgICAgICAgfQotICAgICAgICBzZXRNZWFzdXJlZERpbWVuc2lvbih3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuaShUQUcsICJlbmQgb2Ygb25NZWFzdXJlKCkiKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiBtZWFzdXJlZFNpemU6ICIgKyBnZXRNZWFzdXJlZFdpZHRoKCkgKyAiLyIgKyBnZXRNZWFzdXJlZEhlaWdodCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiAiVmlld1R5cGU6IFRleHR1cmVWaWV3IC8gVmlzaWJpbGl0eTogIiArIGdldFZpc2liaWxpdHkoKQotICAgICAgICAgICAgICAgICsgIiAvIHN1cmZhY2VUZXh0dXJlOiAiICsgbVN1cmZhY2VUZXh0dXJlOwotCi0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3MkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvVmlldzJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3Mjc5ZDYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3MkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uQWN0aXZpdHlJbmZvOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBvaW50OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRm9jdXNSZXF1ZXN0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuRGF0YVNvdXJjZURlc2M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyLk1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjIuT25TdWJ0aXRsZURhdGFMaXN0ZW5lcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMkltcGw7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TdWJ0aXRsZURhdGE7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhUmV0cmlldmVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWV0YWRhdGE7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5QbGF5YmFja1BhcmFtczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlRpbWVkVGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFDb250cm9sbGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYUNvbnRyb2xsZXIuUGxheWJhY2tJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZpZGVvVmlldzJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5WaWV3R3JvdXBQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5QYWlyOwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtczsKLWltcG9ydCBhbmRyb2lkLnZpZXcuV2luZG93TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTWVkaWFDb250cm9sVmlldzI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3MjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmdyYXBoaWNzLnBhbGV0dGUuUGFsZXR0ZTsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5Sb3V0ZVBsYXllcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZS5DbG9zZWRDYXB0aW9uUmVuZGVyZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGUuU3VidGl0bGVDb250cm9sbGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlLlN1YnRpdGxlVHJhY2s7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhSXRlbVN0YXR1czsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhQ29udHJvbEludGVudDsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi1wdWJsaWMgY2xhc3MgVmlkZW9WaWV3MkltcGwgZXh0ZW5kcyBCYXNlTGF5b3V0Ci0gICAgICAgIGltcGxlbWVudHMgVmlkZW9WaWV3MlByb3ZpZGVyLCBWaWRlb1ZpZXdJbnRlcmZhY2UuU3VyZmFjZUxpc3RlbmVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlZpZGVvVmlldzIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBTVE9QU0hJUDogTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgREVGQVVMVF9TSE9XX0NPTlRST0xMRVJfSU5URVJWQUxfTVMgPSAyMDAwOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWRlb1ZpZXcyIG1JbnN0YW5jZTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9FUlJPUiA9IC0xOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9JRExFID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUFJFUEFSSU5HID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUFJFUEFSRUQgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QTEFZSU5HID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUEFVU0VEID0gNDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU1RBVEVfUExBWUJBQ0tfQ09NUExFVEVEID0gNTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1RSQUNLX0lOREVYID0gLTE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgSU5WQUxJRF9TUEVFRCA9IDBmOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWkVfVFlQRV9FTUJFRERFRCA9IDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWkVfVFlQRV9GVUxMID0gMTsKLSAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgTWluaW1hbCBzaXplIHR5cGUuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNJWkVfVFlQRV9NSU5JTUFMID0gMjsKLQotICAgIHByaXZhdGUgQWNjZXNzaWJpbGl0eU1hbmFnZXIgbUFjY2Vzc2liaWxpdHlNYW5hZ2VyOwotICAgIHByaXZhdGUgQXVkaW9NYW5hZ2VyIG1BdWRpb01hbmFnZXI7Ci0gICAgcHJpdmF0ZSBBdWRpb0F0dHJpYnV0ZXMgbUF1ZGlvQXR0cmlidXRlczsKLSAgICBwcml2YXRlIGludCBtQXVkaW9Gb2N1c1R5cGUgPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19HQUlOOyAvLyBsZWdhY3kgZm9jdXMgZ2FpbgotCi0gICAgcHJpdmF0ZSBQYWlyPEV4ZWN1dG9yLCBWaWRlb1ZpZXcyLk9uQ3VzdG9tQWN0aW9uTGlzdGVuZXI+IG1DdXN0b21BY3Rpb25MaXN0ZW5lclJlY29yZDsKLSAgICBwcml2YXRlIFZpZGVvVmlldzIuT25WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lciBtVmlld1R5cGVDaGFuZ2VkTGlzdGVuZXI7Ci0gICAgcHJpdmF0ZSBWaWRlb1ZpZXcyLk9uRnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lciBtRnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lcjsKLQotICAgIHByaXZhdGUgVmlkZW9WaWV3SW50ZXJmYWNlIG1DdXJyZW50VmlldzsKLSAgICBwcml2YXRlIFZpZGVvVGV4dHVyZVZpZXcgbVRleHR1cmVWaWV3OwotICAgIHByaXZhdGUgVmlkZW9TdXJmYWNlVmlldyBtU3VyZmFjZVZpZXc7Ci0KLSAgICBwcml2YXRlIE1lZGlhUGxheWVyMiBtTWVkaWFQbGF5ZXI7Ci0gICAgcHJpdmF0ZSBEYXRhU291cmNlRGVzYyBtRHNkOwotICAgIHByaXZhdGUgTWVkaWFDb250cm9sVmlldzIgbU1lZGlhQ29udHJvbFZpZXc7Ci0gICAgcHJpdmF0ZSBNZWRpYVNlc3Npb24gbU1lZGlhU2Vzc2lvbjsKLSAgICBwcml2YXRlIE1lZGlhQ29udHJvbGxlciBtTWVkaWFDb250cm9sbGVyOwotICAgIHByaXZhdGUgTWV0YWRhdGEgbU1ldGFkYXRhOwotICAgIHByaXZhdGUgTWVkaWFNZXRhZGF0YTIgbU1lZGlhTWV0YWRhdGE7Ci0gICAgcHJpdmF0ZSBNZWRpYU1ldGFkYXRhUmV0cmlldmVyIG1SZXRyaWV2ZXI7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1OZWVkVXBkYXRlTWVkaWFUeXBlOwotICAgIHByaXZhdGUgQnVuZGxlIG1NZWRpYVR5cGVEYXRhOwotICAgIHByaXZhdGUgU3RyaW5nIG1UaXRsZTsKLQotICAgIC8vIFRPRE86IG1vdmUgbXVzaWMgdmlldyBpbnNpZGUgU3VyZmFjZVZpZXcvVGV4dHVyZVZpZXcgb3IgaW1wbGVtZW50IFZpZGVvVmlld0ludGVyZmFjZS4KLSAgICBwcml2YXRlIFdpbmRvd01hbmFnZXIgbU1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlc291cmNlczsKLSAgICBwcml2YXRlIFZpZXcgbU11c2ljVmlldzsKLSAgICBwcml2YXRlIERyYXdhYmxlIG1NdXNpY0FsYnVtRHJhd2FibGU7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbU11c2ljVGl0bGVUZXh0OwotICAgIHByaXZhdGUgU3RyaW5nIG1NdXNpY0FydGlzdFRleHQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc011c2ljTWVkaWFUeXBlOwotICAgIHByaXZhdGUgaW50IG1QcmV2V2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbVByZXZIZWlnaHQ7Ci0gICAgcHJpdmF0ZSBpbnQgbURvbWluYW50Q29sb3I7Ci0gICAgcHJpdmF0ZSBpbnQgbVNpemVUeXBlOwotCi0gICAgcHJpdmF0ZSBQbGF5YmFja1N0YXRlLkJ1aWxkZXIgbVN0YXRlQnVpbGRlcjsKLSAgICBwcml2YXRlIExpc3Q8UGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24+IG1DdXN0b21BY3Rpb25MaXN0OwotICAgIHByaXZhdGUgaW50IG1UYXJnZXRTdGF0ZSA9IFNUQVRFX0lETEU7Ci0gICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX0lETEU7Ci0gICAgcHJpdmF0ZSBpbnQgbUN1cnJlbnRCdWZmZXJQZXJjZW50YWdlOwotICAgIHByaXZhdGUgbG9uZyBtU2Vla1doZW5QcmVwYXJlZDsgIC8vIHJlY29yZGluZyB0aGUgc2VlayBwb3NpdGlvbiB3aGlsZSBwcmVwYXJpbmcKLQotICAgIHByaXZhdGUgaW50IG1WaWRlb1dpZHRoOwotICAgIHByaXZhdGUgaW50IG1WaWRlb0hlaWdodDsKLQotICAgIHByaXZhdGUgQXJyYXlMaXN0PEludGVnZXI+IG1WaWRlb1RyYWNrSW5kaWNlczsKLSAgICBwcml2YXRlIEFycmF5TGlzdDxJbnRlZ2VyPiBtQXVkaW9UcmFja0luZGljZXM7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8UGFpcjxJbnRlZ2VyLCBTdWJ0aXRsZVRyYWNrPj4gbVN1YnRpdGxlVHJhY2tJbmRpY2VzOwotICAgIHByaXZhdGUgU3VidGl0bGVDb250cm9sbGVyIG1TdWJ0aXRsZUNvbnRyb2xsZXI7Ci0KLSAgICAvLyBzZWxlY3RlZCB2aWRlby9hdWRpby9zdWJ0aXRsZSB0cmFjayBpbmRleCBhcyBNZWRpYVBsYXllcjIgcmV0dXJucwotICAgIHByaXZhdGUgaW50IG1TZWxlY3RlZFZpZGVvVHJhY2tJbmRleDsKLSAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXg7Ci0gICAgcHJpdmF0ZSBpbnQgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4OwotCi0gICAgcHJpdmF0ZSBTdWJ0aXRsZVZpZXcgbVN1YnRpdGxlVmlldzsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVN1YnRpdGxlRW5hYmxlZDsKLQotICAgIHByaXZhdGUgZmxvYXQgbVNwZWVkOwotICAgIC8vIFRPRE86IFJlbW92ZSBtRmFsbGJhY2tTcGVlZCB3aGVuIGludGVncmF0aW9uIHdpdGggTWVkaWFQbGF5ZXIyJ3MgbmV3IHNldFBsYXliYWNrUGFyYW1zKCkuCi0gICAgLy8gUmVmZXI6IGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMW56QWZuczZpMmhKM1JrYVVyZTNRTVQ2d3NEZWRKNU9OTGlBX09PQkZGWDgvZWRpdAotICAgIHByaXZhdGUgZmxvYXQgbUZhbGxiYWNrU3BlZWQ7ICAvLyBrZWVwIHRoZSBvcmlnaW5hbCBzcGVlZCBiZWZvcmUgJ3BhdXNlJyBpcyBjYWxsZWQuCi0gICAgcHJpdmF0ZSBmbG9hdCBtVm9sdW1lTGV2ZWxGbG9hdDsKLSAgICBwcml2YXRlIGludCBtVm9sdW1lTGV2ZWw7Ci0KLSAgICBwcml2YXRlIGxvbmcgbVNob3dDb250cm9sbGVySW50ZXJ2YWxNczsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIgbU1lZGlhUm91dGVyOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1Sb3V0ZVNlbGVjdG9yOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIG1Sb3V0ZTsKLSAgICBwcml2YXRlIFJvdXRlUGxheWVyIG1Sb3V0ZVBsYXllcjsKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgbVJvdXRlckNhbGxiYWNrID0gbmV3IE1lZGlhUm91dGVyLkNhbGxiYWNrKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBpZiAocm91dGUuc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSykpIHsKLSAgICAgICAgICAgICAgICAvLyBTdG9wIGxvY2FsIHBsYXliYWNrIChpZiBuZWNlc3NhcnkpCi0gICAgICAgICAgICAgICAgcmVzZXRQbGF5ZXIoKTsKLSAgICAgICAgICAgICAgICBtUm91dGUgPSByb3V0ZTsKLSAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIgPSBuZXcgUm91dGVQbGF5ZXIobUluc3RhbmNlLmdldENvbnRleHQoKSwgcm91dGUpOwotICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5zZXRQbGF5ZXJFdmVudENhbGxiYWNrKG5ldyBSb3V0ZVBsYXllci5QbGF5ZXJFdmVudENhbGxiYWNrKCkgewotICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25QbGF5ZXJTdGF0ZUNoYW5nZWQoTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrU3RhdGUuQnVpbGRlciBwc0J1aWxkZXIgPSBuZXcgUGxheWJhY2tTdGF0ZS5CdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwc0J1aWxkZXIuc2V0QWN0aW9ucyhSb3V0ZVBsYXllci5QTEFZQkFDS19BQ1RJT05TKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgcG9zaXRpb24gPSBpdGVtU3RhdHVzLmdldENvbnRlbnRQb3NpdGlvbigpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChpdGVtU3RhdHVzLmdldFBsYXliYWNrU3RhdGUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFJdGVtU3RhdHVzLlBMQVlCQUNLX1NUQVRFX1BFTkRJTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzQnVpbGRlci5zZXRTdGF0ZShQbGF5YmFja1N0YXRlLlNUQVRFX05PTkUsIHBvc2l0aW9uLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX0lETEU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFJdGVtU3RhdHVzLlBMQVlCQUNLX1NUQVRFX1BMQVlJTkc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzQnVpbGRlci5zZXRTdGF0ZShQbGF5YmFja1N0YXRlLlNUQVRFX1BMQVlJTkcsIHBvc2l0aW9uLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BMQVlJTkc7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFJdGVtU3RhdHVzLlBMQVlCQUNLX1NUQVRFX1BBVVNFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNCdWlsZGVyLnNldFN0YXRlKFBsYXliYWNrU3RhdGUuU1RBVEVfUEFVU0VELCBwb3NpdGlvbiwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFJdGVtU3RhdHVzLlBMQVlCQUNLX1NUQVRFX0JVRkZFUklORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNCdWlsZGVyLnNldFN0YXRlKFBsYXliYWNrU3RhdGUuU1RBVEVfQlVGRkVSSU5HLCBwb3NpdGlvbiwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFJdGVtU3RhdHVzLlBMQVlCQUNLX1NUQVRFX0ZJTklTSEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc0J1aWxkZXIuc2V0U3RhdGUoUGxheWJhY2tTdGF0ZS5TVEFURV9TVE9QUEVELCBwb3NpdGlvbiwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QTEFZQkFDS19DT01QTEVURUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBQbGF5YmFja1N0YXRlIHBiU3RhdGUgPSBwc0J1aWxkZXIuYnVpbGQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uc2V0UGxheWJhY2tTdGF0ZShwYlN0YXRlKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YS5CdWlsZGVyIG1tQnVpbGRlciA9IG5ldyBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1tQnVpbGRlci5wdXRMb25nKE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX0RVUkFUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtU3RhdHVzLmdldENvbnRlbnREdXJhdGlvbigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uc2V0TWV0YWRhdGEobW1CdWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgLy8gU3RhcnQgcmVtb3RlIHBsYXliYWNrIChpZiBuZWNlc3NhcnkpCi0gICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyLm9wZW5WaWRlbyhtRHNkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSwgaW50IHJlYXNvbikgewotICAgICAgICAgICAgaWYgKG1Sb3V0ZSAhPSBudWxsICYmIG1Sb3V0ZVBsYXllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyLnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Sb3V0ZSA9PSByb3V0ZSkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocmVhc29uICE9IE1lZGlhUm91dGVyLlVOU0VMRUNUX1JFQVNPTl9ST1VURV9DSEFOR0VEKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogUmVzdW1lIGxvY2FsIHBsYXliYWNrICAoaWYgbmVjZXNzYXJ5KQotICAgICAgICAgICAgICAgIG9wZW5WaWRlbyhtRHNkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwdWJsaWMgVmlkZW9WaWV3MkltcGwoVmlkZW9WaWV3MiBpbnN0YW5jZSwKLSAgICAgICAgICAgIFZpZXdHcm91cFByb3ZpZGVyIHN1cGVyUHJvdmlkZXIsIFZpZXdHcm91cFByb3ZpZGVyIHByaXZhdGVQcm92aWRlcikgewotICAgICAgICBzdXBlcihpbnN0YW5jZSwgc3VwZXJQcm92aWRlciwgcHJpdmF0ZVByb3ZpZGVyKTsKLSAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZShATnVsbGFibGUgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyLCBpbnQgZGVmU3R5bGVSZXMpIHsKLSAgICAgICAgbVZpZGVvV2lkdGggPSAwOwotICAgICAgICBtVmlkZW9IZWlnaHQgPSAwOwotICAgICAgICBtU3BlZWQgPSAxLjBmOwotICAgICAgICBtRmFsbGJhY2tTcGVlZCA9IG1TcGVlZDsKLSAgICAgICAgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4ID0gSU5WQUxJRF9UUkFDS19JTkRFWDsKLSAgICAgICAgLy8gVE9ETzogYWRkIGF0dHJpYnV0ZXMgdG8gZ2V0IHRoaXMgdmFsdWUuCi0gICAgICAgIG1TaG93Q29udHJvbGxlckludGVydmFsTXMgPSBERUZBVUxUX1NIT1dfQ09OVFJPTExFUl9JTlRFUlZBTF9NUzsKLQotICAgICAgICBtQWNjZXNzaWJpbGl0eU1hbmFnZXIgPSBBY2Nlc3NpYmlsaXR5TWFuYWdlci5nZXRJbnN0YW5jZShtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKLQotICAgICAgICBtQXVkaW9NYW5hZ2VyID0gKEF1ZGlvTWFuYWdlcikgbUluc3RhbmNlLmdldENvbnRleHQoKQotICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQVVESU9fU0VSVklDRSk7Ci0gICAgICAgIG1BdWRpb0F0dHJpYnV0ZXMgPSBuZXcgQXVkaW9BdHRyaWJ1dGVzLkJ1aWxkZXIoKS5zZXRVc2FnZShBdWRpb0F0dHJpYnV0ZXMuVVNBR0VfTUVESUEpCi0gICAgICAgICAgICAgICAgLnNldENvbnRlbnRUeXBlKEF1ZGlvQXR0cmlidXRlcy5DT05URU5UX1RZUEVfTU9WSUUpLmJ1aWxkKCk7Ci0gICAgICAgIG1JbnN0YW5jZS5zZXRGb2N1c2FibGUodHJ1ZSk7Ci0gICAgICAgIG1JbnN0YW5jZS5zZXRGb2N1c2FibGVJblRvdWNoTW9kZSh0cnVlKTsKLSAgICAgICAgbUluc3RhbmNlLnJlcXVlc3RGb2N1cygpOwotCi0gICAgICAgIC8vIFRPRE86IHRyeSB0byBrZWVwIGEgc2luZ2xlIGNoaWxkIGF0IGEgdGltZSByYXRoZXIgdGhhbiBhbHdheXMgaGF2aW5nIGJvdGguCi0gICAgICAgIG1UZXh0dXJlVmlldyA9IG5ldyBWaWRlb1RleHR1cmVWaWV3KG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOwotICAgICAgICBtU3VyZmFjZVZpZXcgPSBuZXcgVmlkZW9TdXJmYWNlVmlldyhtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgTGF5b3V0UGFyYW1zIHBhcmFtcyA9IG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKLSAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKLSAgICAgICAgbVRleHR1cmVWaWV3LnNldExheW91dFBhcmFtcyhwYXJhbXMpOwotICAgICAgICBtU3VyZmFjZVZpZXcuc2V0TGF5b3V0UGFyYW1zKHBhcmFtcyk7Ci0gICAgICAgIG1UZXh0dXJlVmlldy5zZXRTdXJmYWNlTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIG1TdXJmYWNlVmlldy5zZXRTdXJmYWNlTGlzdGVuZXIodGhpcyk7Ci0gICAgICAgIG1JbnN0YW5jZS5hZGRWaWV3KG1UZXh0dXJlVmlldyk7Ci0gICAgICAgIG1JbnN0YW5jZS5hZGRWaWV3KG1TdXJmYWNlVmlldyk7Ci0KLSAgICAgICAgbVN1YnRpdGxlVmlldyA9IG5ldyBTdWJ0aXRsZVZpZXcobUluc3RhbmNlLmdldENvbnRleHQoKSk7Ci0gICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0TGF5b3V0UGFyYW1zKHBhcmFtcyk7Ci0gICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0QmFja2dyb3VuZENvbG9yKDApOwotICAgICAgICBtSW5zdGFuY2UuYWRkVmlldyhtU3VidGl0bGVWaWV3KTsKLQotICAgICAgICBib29sZWFuIGVuYWJsZUNvbnRyb2xWaWV3ID0gKGF0dHJzID09IG51bGwpIHx8IGF0dHJzLmdldEF0dHJpYnV0ZUJvb2xlYW5WYWx1ZSgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiwKLSAgICAgICAgICAgICAgICAiZW5hYmxlQ29udHJvbFZpZXciLCB0cnVlKTsKLSAgICAgICAgaWYgKGVuYWJsZUNvbnRyb2xWaWV3KSB7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldyA9IG5ldyBNZWRpYUNvbnRyb2xWaWV3MihtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1TdWJ0aXRsZUVuYWJsZWQgPSAoYXR0cnMgPT0gbnVsbCkgfHwgYXR0cnMuZ2V0QXR0cmlidXRlQm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiLAotICAgICAgICAgICAgICAgICJlbmFibGVTdWJ0aXRsZSIsIGZhbHNlKTsKLQotICAgICAgICAvLyBUT0RPOiBDaG9vc2UgVGV4dHVyZVZpZXcgd2hlbiBTdXJmYWNlVmlldyBjYW5ub3QgYmUgY3JlYXRlZC4KLSAgICAgICAgLy8gQ2hvb3NlIHN1cmZhY2UgdmlldyBieSBkZWZhdWx0Ci0gICAgICAgIGludCB2aWV3VHlwZSA9IChhdHRycyA9PSBudWxsKSA/IFZpZGVvVmlldzIuVklFV19UWVBFX1NVUkZBQ0VWSUVXCi0gICAgICAgICAgICAgICAgOiBhdHRycy5nZXRBdHRyaWJ1dGVJbnRWYWx1ZSgKLSAgICAgICAgICAgICAgICAiaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiwKLSAgICAgICAgICAgICAgICAidmlld1R5cGUiLCBWaWRlb1ZpZXcyLlZJRVdfVFlQRV9TVVJGQUNFVklFVyk7Ci0gICAgICAgIGlmICh2aWV3VHlwZSA9PSBWaWRlb1ZpZXcyLlZJRVdfVFlQRV9TVVJGQUNFVklFVykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAidmlld1R5cGUgYXR0cmlidXRlIGlzIHN1cmZhY2VWaWV3LiIpOwotICAgICAgICAgICAgbVRleHR1cmVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1TdXJmYWNlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtQ3VycmVudFZpZXcgPSBtU3VyZmFjZVZpZXc7Ci0gICAgICAgIH0gZWxzZSBpZiAodmlld1R5cGUgPT0gVmlkZW9WaWV3Mi5WSUVXX1RZUEVfVEVYVFVSRVZJRVcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInZpZXdUeXBlIGF0dHJpYnV0ZSBpcyB0ZXh0dXJlVmlldy4iKTsKLSAgICAgICAgICAgIG1UZXh0dXJlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtU3VyZmFjZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbUN1cnJlbnRWaWV3ID0gbVRleHR1cmVWaWV3OwotICAgICAgICB9Ci0KLSAgICAgICAgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcigpOwotICAgICAgICBidWlsZGVyLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKTsKLSAgICAgICAgYnVpbGRlci5hZGRDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfQVVESU8pOwotICAgICAgICBidWlsZGVyLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTyk7Ci0gICAgICAgIG1Sb3V0ZVNlbGVjdG9yID0gYnVpbGRlci5idWlsZCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhQ29udHJvbFZpZXcyX2ltcGwoTWVkaWFDb250cm9sVmlldzIgbWVkaWFDb250cm9sVmlldywgbG9uZyBpbnRlcnZhbE1zKSB7Ci0gICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3ID0gbWVkaWFDb250cm9sVmlldzsKLSAgICAgICAgbVNob3dDb250cm9sbGVySW50ZXJ2YWxNcyA9IGludGVydmFsTXM7Ci0gICAgICAgIC8vIFRPRE86IENhbGwgTWVkaWFDb250cm9sVmlldzIuc2V0Um91dGVTZWxlY3RvciBvbmx5IHdoZW4gY2FzdCBhdmFpbGFsYmUuCi0gICAgICAgICgoTWVkaWFDb250cm9sVmlldzJJbXBsKSBtTWVkaWFDb250cm9sVmlldy5nZXRQcm92aWRlcigpKS5zZXRSb3V0ZVNlbGVjdG9yKG1Sb3V0ZVNlbGVjdG9yKTsKLQotICAgICAgICBpZiAobUluc3RhbmNlLmlzQXR0YWNoZWRUb1dpbmRvdygpKSB7Ci0gICAgICAgICAgICBhdHRhY2hNZWRpYUNvbnRyb2xWaWV3KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFDb250cm9sbGVyIGdldE1lZGlhQ29udHJvbGxlcl9pbXBsKCkgewotICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNZWRpYVNlc3Npb24gaW5zdGFuY2UgaXMgbm90IGF2YWlsYWJsZS4iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbU1lZGlhQ29udHJvbGxlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2Vzc2lvblRva2VuMiBnZXRNZWRpYVNlc3Npb25Ub2tlbl9pbXBsKCkgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcwotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFDb250cm9sVmlldzIgZ2V0TWVkaWFDb250cm9sVmlldzJfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1NZWRpYUNvbnRyb2xWaWV3OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMiBnZXRNZWRpYU1ldGFkYXRhX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtTWVkaWFNZXRhZGF0YTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRNZWRpYU1ldGFkYXRhX2ltcGwoTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgLy8gVE9ETzogaW50ZWdyYXRlIHRoaXMgd2l0aCBNZWRpYVNlc3Npb24yI01lZGlhSXRlbTIKLSAgICAgICAgbU1lZGlhTWV0YWRhdGEgPSBtZXRhZGF0YTsKLQotICAgICAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgaGFuZGxpbmcgd2Vic2l0ZSBsaW5rCi0gICAgICAgIG1NZWRpYVR5cGVEYXRhID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICBib29sZWFuIGlzQWQgPSBtZXRhZGF0YSA9PSBudWxsID8KLSAgICAgICAgICAgICAgICBmYWxzZSA6IG1ldGFkYXRhLmdldExvbmcoTWVkaWFNZXRhZGF0YTIuTUVUQURBVEFfS0VZX0FEVkVSVElTRU1FTlQpICE9IDA7Ci0gICAgICAgIG1NZWRpYVR5cGVEYXRhLnB1dEJvb2xlYW4oCi0gICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9TVEFURV9JU19BRFZFUlRJU0VNRU5ULCBpc0FkKTsKLQotICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTWVkaWFTZXNzaW9uLnNlbmRTZXNzaW9uRXZlbnQoCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhQ29udHJvbFZpZXcySW1wbC5FVkVOVF9VUERBVEVfTUVESUFfVFlQRV9TVEFUVVMsIG1NZWRpYVR5cGVEYXRhKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFVwZGF0ZSBsYXRlciBpbnNpZGUgT25QcmVwYXJlZExpc3RlbmVyIGFmdGVyIE1lZGlhU2Vzc2lvbiBpcyBpbml0aWFsaXplZC4KLSAgICAgICAgICAgIG1OZWVkVXBkYXRlTWVkaWFUeXBlID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFN1YnRpdGxlRW5hYmxlZF9pbXBsKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIGlmIChlbmFibGUgIT0gbVN1YnRpdGxlRW5hYmxlZCkgewotICAgICAgICAgICAgc2VsZWN0T3JEZXNlbGVjdFN1YnRpdGxlKGVuYWJsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbVN1YnRpdGxlRW5hYmxlZCA9IGVuYWJsZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1N1YnRpdGxlRW5hYmxlZF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVN1YnRpdGxlRW5hYmxlZDsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiByZW1vdmUgc2V0U3BlZWRfaW1wbCBvbmNlIE1lZGlhQ29udHJvbGxlcjIgaXMgcmVhZHkuCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U3BlZWRfaW1wbChmbG9hdCBzcGVlZCkgewotICAgICAgICBpZiAoc3BlZWQgPD0gMC4wZikgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiVW5zdXBwb3J0ZWQgc3BlZWQgKCIgKyBzcGVlZCArICIpIGlzIGlnbm9yZWQuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbVNwZWVkID0gc3BlZWQ7Ci0gICAgICAgIGlmIChtTWVkaWFQbGF5ZXIgIT0gbnVsbCAmJiBtTWVkaWFQbGF5ZXIuaXNQbGF5aW5nKCkpIHsKLSAgICAgICAgICAgIGFwcGx5U3BlZWQoKTsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0QXVkaW9Gb2N1c1JlcXVlc3RfaW1wbChpbnQgZm9jdXNHYWluKSB7Ci0gICAgICAgIGlmIChmb2N1c0dhaW4gIT0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfTk9ORQotICAgICAgICAgICAgICAgICYmIGZvY3VzR2FpbiAhPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19HQUlOCi0gICAgICAgICAgICAgICAgJiYgZm9jdXNHYWluICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX0dBSU5fVFJBTlNJRU5UCi0gICAgICAgICAgICAgICAgJiYgZm9jdXNHYWluICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX0dBSU5fVFJBTlNJRU5UX01BWV9EVUNLCi0gICAgICAgICAgICAgICAgJiYgZm9jdXNHYWluICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX0dBSU5fVFJBTlNJRU5UX0VYQ0xVU0lWRSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiSWxsZWdhbCBhdWRpbyBmb2N1cyB0eXBlICIgKyBmb2N1c0dhaW4pOwotICAgICAgICB9Ci0gICAgICAgIG1BdWRpb0ZvY3VzVHlwZSA9IGZvY3VzR2FpbjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRBdWRpb0F0dHJpYnV0ZXNfaW1wbChBdWRpb0F0dHJpYnV0ZXMgYXR0cmlidXRlcykgewotICAgICAgICBpZiAoYXR0cmlidXRlcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIG51bGwgQXVkaW9BdHRyaWJ1dGVzIik7Ci0gICAgICAgIH0KLSAgICAgICAgbUF1ZGlvQXR0cmlidXRlcyA9IGF0dHJpYnV0ZXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VmlkZW9QYXRoX2ltcGwoU3RyaW5nIHBhdGgpIHsKLSAgICAgICAgbUluc3RhbmNlLnNldFZpZGVvVXJpKFVyaS5wYXJzZShwYXRoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VmlkZW9VcmlfaW1wbChVcmkgdXJpKSB7Ci0gICAgICAgIG1JbnN0YW5jZS5zZXRWaWRlb1VyaSh1cmksIG51bGwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFZpZGVvVXJpX2ltcGwoVXJpIHVyaSwgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzKSB7Ci0gICAgICAgIERhdGFTb3VyY2VEZXNjLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBEYXRhU291cmNlRGVzYy5CdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIuc2V0RGF0YVNvdXJjZShtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLCB1cmksIGhlYWRlcnMsIG51bGwpOwotICAgICAgICBtSW5zdGFuY2Uuc2V0RGF0YVNvdXJjZShidWlsZGVyLmJ1aWxkKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhSXRlbV9pbXBsKE1lZGlhSXRlbTIgbWVkaWFJdGVtKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0RGF0YVNvdXJjZV9pbXBsKERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICBtRHNkID0gZHNkOwotICAgICAgICBtU2Vla1doZW5QcmVwYXJlZCA9IDA7Ci0gICAgICAgIG9wZW5WaWRlbyhkc2QpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFZpZXdUeXBlX2ltcGwoaW50IHZpZXdUeXBlKSB7Ci0gICAgICAgIGlmICh2aWV3VHlwZSA9PSBtQ3VycmVudFZpZXcuZ2V0Vmlld1R5cGUoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIFZpZGVvVmlld0ludGVyZmFjZSB0YXJnZXRWaWV3OwotICAgICAgICBpZiAodmlld1R5cGUgPT0gVmlkZW9WaWV3Mi5WSUVXX1RZUEVfVEVYVFVSRVZJRVcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInN3aXRjaGluZyB0byBUZXh0dXJlVmlldyIpOwotICAgICAgICAgICAgdGFyZ2V0VmlldyA9IG1UZXh0dXJlVmlldzsKLSAgICAgICAgfSBlbHNlIGlmICh2aWV3VHlwZSA9PSBWaWRlb1ZpZXcyLlZJRVdfVFlQRV9TVVJGQUNFVklFVykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAic3dpdGNoaW5nIHRvIFN1cmZhY2VWaWV3Iik7Ci0gICAgICAgICAgICB0YXJnZXRWaWV3ID0gbVN1cmZhY2VWaWV3OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biB2aWV3IHR5cGU6ICIgKyB2aWV3VHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgKChWaWV3KSB0YXJnZXRWaWV3KS5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIHRhcmdldFZpZXcudGFrZU92ZXIobUN1cnJlbnRWaWV3KTsKLSAgICAgICAgbUluc3RhbmNlLnJlcXVlc3RMYXlvdXQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFZpZXdUeXBlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtQ3VycmVudFZpZXcuZ2V0Vmlld1R5cGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21BY3Rpb25zX2ltcGwoCi0gICAgICAgICAgICBMaXN0PFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uPiBhY3Rpb25MaXN0LAotICAgICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IsIFZpZGVvVmlldzIuT25DdXN0b21BY3Rpb25MaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtQ3VzdG9tQWN0aW9uTGlzdCA9IGFjdGlvbkxpc3Q7Ci0gICAgICAgIG1DdXN0b21BY3Rpb25MaXN0ZW5lclJlY29yZCA9IG5ldyBQYWlyPD4oZXhlY3V0b3IsIGxpc3RlbmVyKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBuZXcgcGxheWJhY2sgYnVpbGRlciBpbiBvcmRlciB0byBjbGVhciBleGlzdGluZyB0aGUgY3VzdG9tIGFjdGlvbnMuCi0gICAgICAgIG1TdGF0ZUJ1aWxkZXIgPSBudWxsOwotICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T25WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lcl9pbXBsKFZpZGVvVmlldzIuT25WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lciBsKSB7Ci0gICAgICAgIG1WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lciA9IGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0RnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lcl9pbXBsKFZpZGVvVmlldzIuT25GdWxsU2NyZWVuUmVxdWVzdExpc3RlbmVyIGwpIHsKLSAgICAgICAgbUZ1bGxTY3JlZW5SZXF1ZXN0TGlzdGVuZXIgPSBsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQXR0YWNoZWRUb1dpbmRvd19pbXBsKCkgewotICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3dfaW1wbCgpOwotCi0gICAgICAgIC8vIENyZWF0ZSBNZWRpYVNlc3Npb24KLSAgICAgICAgbU1lZGlhU2Vzc2lvbiA9IG5ldyBNZWRpYVNlc3Npb24obUluc3RhbmNlLmdldENvbnRleHQoKSwgIlZpZGVvVmlldzJNZWRpYVNlc3Npb24iKTsKLSAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRDYWxsYmFjayhuZXcgTWVkaWFTZXNzaW9uQ2FsbGJhY2soKSk7Ci0gICAgICAgIG1NZWRpYVNlc3Npb24uc2V0QWN0aXZlKHRydWUpOwotICAgICAgICBtTWVkaWFDb250cm9sbGVyID0gbU1lZGlhU2Vzc2lvbi5nZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIG1NZWRpYVJvdXRlciA9IE1lZGlhUm91dGVyLmdldEluc3RhbmNlKG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOwotICAgICAgICBtTWVkaWFSb3V0ZXIuc2V0TWVkaWFTZXNzaW9uKG1NZWRpYVNlc3Npb24pOwotICAgICAgICBtTWVkaWFSb3V0ZXIuYWRkQ2FsbGJhY2sobVJvdXRlU2VsZWN0b3IsIG1Sb3V0ZXJDYWxsYmFjayk7Ci0gICAgICAgIGF0dGFjaE1lZGlhQ29udHJvbFZpZXcoKTsKLSAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgYWZ0ZXIgbW92aW5nIE1lZGlhU2Vzc2lvbiBjcmVhdGluZyBjb2RlIGluc2lkZSBpbml0aWFsaXppbmcgVmlkZW9WaWV3MgotICAgICAgICBpZiAobUN1cnJlbnRTdGF0ZSA9PSBTVEFURV9QUkVQQVJFRCkgewotICAgICAgICAgICAgZXh0cmFjdFRyYWNrcygpOwotICAgICAgICAgICAgZXh0cmFjdE1ldGFkYXRhKCk7Ci0gICAgICAgICAgICBleHRyYWN0QXVkaW9NZXRhZGF0YSgpOwotICAgICAgICAgICAgaWYgKG1OZWVkVXBkYXRlTWVkaWFUeXBlKSB7Ci0gICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZW5kU2Vzc2lvbkV2ZW50KAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLkVWRU5UX1VQREFURV9NRURJQV9UWVBFX1NUQVRVUywKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVR5cGVEYXRhKTsKLSAgICAgICAgICAgICAgICBtTmVlZFVwZGF0ZU1lZGlhVHlwZSA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3dfaW1wbCgpIHsKLSAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3dfaW1wbCgpOwotCi0gICAgICAgIG1NZWRpYVNlc3Npb24ucmVsZWFzZSgpOwotICAgICAgICBtTWVkaWFTZXNzaW9uID0gbnVsbDsKLSAgICAgICAgbU1lZGlhQ29udHJvbGxlciA9IG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRBY2Nlc3NpYmlsaXR5Q2xhc3NOYW1lX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBWaWRlb1ZpZXcyLmNsYXNzLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uVG91Y2hFdmVudCgpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChldi5nZXRBY3Rpb24oKSA9PSBNb3Rpb25FdmVudC5BQ1RJT05fVVAgJiYgbU1lZGlhQ29udHJvbFZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKCFtSXNNdXNpY01lZGlhVHlwZSB8fCBtU2l6ZVR5cGUgIT0gU0laRV9UWVBFX0ZVTEwpIHsKLSAgICAgICAgICAgICAgICB0b2dnbGVNZWRpYUNvbnRyb2xWaWV3VmlzaWJpbGl0eSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHN1cGVyLm9uVG91Y2hFdmVudF9pbXBsKGV2KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRyYWNrYmFsbEV2ZW50X2ltcGwoTW90aW9uRXZlbnQgZXYpIHsKLSAgICAgICAgaWYgKGV2LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCAmJiBtTWVkaWFDb250cm9sVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIW1Jc011c2ljTWVkaWFUeXBlIHx8IG1TaXplVHlwZSAhPSBTSVpFX1RZUEVfRlVMTCkgewotICAgICAgICAgICAgICAgIHRvZ2dsZU1lZGlhQ29udHJvbFZpZXdWaXNpYmlsaXR5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3VwZXIub25UcmFja2JhbGxFdmVudF9pbXBsKGV2KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaFRvdWNoRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICAvLyBUT0RPOiBUZXN0IHRvdWNoIGV2ZW50IGhhbmRsaW5nIGxvZ2ljIHRob3JvdWdobHkgYW5kIHNpbXBsaWZ5IHRoZSBsb2dpYy4KLSAgICAgICAgcmV0dXJuIHN1cGVyLmRpc3BhdGNoVG91Y2hFdmVudF9pbXBsKGV2KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbk1lYXN1cmVfaW1wbChpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgIHN1cGVyLm9uTWVhc3VyZV9pbXBsKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKLQotICAgICAgICBpZiAobUlzTXVzaWNNZWRpYVR5cGUpIHsKLSAgICAgICAgICAgIGlmIChtUHJldldpZHRoICE9IG1JbnN0YW5jZS5nZXRNZWFzdXJlZFdpZHRoKCkKLSAgICAgICAgICAgICAgICAgICAgfHwgbVByZXZIZWlnaHQgIT0gbUluc3RhbmNlLmdldE1lYXN1cmVkSGVpZ2h0KCkpIHsKLSAgICAgICAgICAgICAgICBpbnQgY3VycldpZHRoID0gbUluc3RhbmNlLmdldE1lYXN1cmVkV2lkdGgoKTsKLSAgICAgICAgICAgICAgICBpbnQgY3VyckhlaWdodCA9IG1JbnN0YW5jZS5nZXRNZWFzdXJlZEhlaWdodCgpOwotICAgICAgICAgICAgICAgIFBvaW50IHNjcmVlblNpemUgPSBuZXcgUG9pbnQoKTsKLSAgICAgICAgICAgICAgICBtTWFuYWdlci5nZXREZWZhdWx0RGlzcGxheSgpLmdldFNpemUoc2NyZWVuU2l6ZSk7Ci0gICAgICAgICAgICAgICAgaW50IHNjcmVlbldpZHRoID0gc2NyZWVuU2l6ZS54OwotICAgICAgICAgICAgICAgIGludCBzY3JlZW5IZWlnaHQgPSBzY3JlZW5TaXplLnk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY3VycldpZHRoID09IHNjcmVlbldpZHRoICYmIGN1cnJIZWlnaHQgPT0gc2NyZWVuSGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBvcmllbnRhdGlvbiA9IHJldHJpZXZlT3JpZW50YXRpb24oKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uID09IEFjdGl2aXR5SW5mby5TQ1JFRU5fT1JJRU5UQVRJT05fTEFORFNDQVBFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZsYXRlTXVzaWNWaWV3KFIubGF5b3V0LmZ1bGxfbGFuZHNjYXBlX211c2ljKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZmxhdGVNdXNpY1ZpZXcoUi5sYXlvdXQuZnVsbF9wb3J0cmFpdF9tdXNpYyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAobVNpemVUeXBlICE9IFNJWkVfVFlQRV9GVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2l6ZVR5cGUgPSBTSVpFX1RZUEVfRlVMTDsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBleGlzdGluZyBtRmFkZU91dCBjYWxsYmFjawotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcucmVtb3ZlQ2FsbGJhY2tzKG1GYWRlT3V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU2l6ZVR5cGUgIT0gU0laRV9UWVBFX0VNQkVEREVEKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2l6ZVR5cGUgPSBTSVpFX1RZUEVfRU1CRURERUQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZsYXRlTXVzaWNWaWV3KFIubGF5b3V0LmVtYmVkZGVkX211c2ljKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCBuZXcgbUZhZGVPdXQgY2FsbGJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnBvc3REZWxheWVkKG1GYWRlT3V0LCBtU2hvd0NvbnRyb2xsZXJJbnRlcnZhbE1zKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUHJldldpZHRoID0gY3VycldpZHRoOwotICAgICAgICAgICAgICAgIG1QcmV2SGVpZ2h0ID0gY3VyckhlaWdodDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIEltcGxlbWVudHMgVmlkZW9WaWV3SW50ZXJmYWNlLlN1cmZhY2VMaXN0ZW5lcgotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdXJmYWNlQ3JlYXRlZChWaWV3IHZpZXcsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uU3VyZmFjZUNyZWF0ZWQoKS4gbUN1cnJlbnRTdGF0ZT0iICsgbUN1cnJlbnRTdGF0ZQotICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlICsgIiwgd2lkdGgvaGVpZ2h0OiAiICsgd2lkdGggKyAiLyIgKyBoZWlnaHQKLSAgICAgICAgICAgICAgICAgICAgKyAiLCAiICsgdmlldy50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmVlZFRvU3RhcnQoKSkgewotICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpLnBsYXkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZURlc3Ryb3llZChWaWV3IHZpZXcpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvblN1cmZhY2VEZXN0cm95ZWQoKS4gbUN1cnJlbnRTdGF0ZT0iICsgbUN1cnJlbnRTdGF0ZQotICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlICsgIiwgIiArIHZpZXcudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDaGFuZ2VkKFZpZXcgdmlldywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIC8vIFRPRE86IERvIHdlIG5lZWQgdG8gY2FsbCByZXF1ZXN0TGF5b3V0IGhlcmU/Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25TdXJmYWNlQ2hhbmdlZCgpLiB3aWR0aC9oZWlnaHQ6ICIgKyB3aWR0aCArICIvIiArIGhlaWdodAotICAgICAgICAgICAgICAgICAgICArICIsICIgKyB2aWV3LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdXJmYWNlVGFrZU92ZXJEb25lKFZpZGVvVmlld0ludGVyZmFjZSB2aWV3KSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25TdXJmYWNlVGFrZU92ZXJEb25lKCkuIE5vdyBjdXJyZW50IHZpZXcgaXM6ICIgKyB2aWV3KTsKLSAgICAgICAgfQotICAgICAgICBtQ3VycmVudFZpZXcgPSB2aWV3OwotICAgICAgICBpZiAobVZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lci5vblZpZXdUeXBlQ2hhbmdlZChtSW5zdGFuY2UsIHZpZXcuZ2V0Vmlld1R5cGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5lZWRUb1N0YXJ0KCkpIHsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5wbGF5KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBQcm90ZWN0ZWQgb3IgcHJpdmF0ZSBtZXRob2RzCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBwcml2YXRlIHZvaWQgYXR0YWNoTWVkaWFDb250cm9sVmlldygpIHsKLSAgICAgICAgLy8gR2V0IE1lZGlhQ29udHJvbGxlciBmcm9tIE1lZGlhU2Vzc2lvbiBhbmQgc2V0IGl0IGluc2lkZSBNZWRpYUNvbnRyb2xWaWV3Ci0gICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnNldENvbnRyb2xsZXIobU1lZGlhU2Vzc2lvbi5nZXRDb250cm9sbGVyKCkpOwotCi0gICAgICAgIExheW91dFBhcmFtcyBwYXJhbXMgPQotICAgICAgICAgICAgICAgIG5ldyBMYXlvdXRQYXJhbXMoTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCk7Ci0gICAgICAgIG1JbnN0YW5jZS5hZGRWaWV3KG1NZWRpYUNvbnRyb2xWaWV3LCBwYXJhbXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0luUGxheWJhY2tTdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIChtTWVkaWFQbGF5ZXIgIT0gbnVsbCB8fCBtUm91dGVQbGF5ZXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAmJiBtQ3VycmVudFN0YXRlICE9IFNUQVRFX0VSUk9SCi0gICAgICAgICAgICAgICAgJiYgbUN1cnJlbnRTdGF0ZSAhPSBTVEFURV9JRExFCi0gICAgICAgICAgICAgICAgJiYgbUN1cnJlbnRTdGF0ZSAhPSBTVEFURV9QUkVQQVJJTkc7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIG5lZWRUb1N0YXJ0KCkgewotICAgICAgICByZXR1cm4gKG1NZWRpYVBsYXllciAhPSBudWxsIHx8IG1Sb3V0ZVBsYXllciAhPSBudWxsKQotICAgICAgICAgICAgICAgICYmIG1DdXJyZW50U3RhdGUgIT0gU1RBVEVfUExBWUlORwotICAgICAgICAgICAgICAgICYmIG1UYXJnZXRTdGF0ZSA9PSBTVEFURV9QTEFZSU5HOwotICAgIH0KLQotICAgIC8vIENyZWF0ZXMgYSBNZWRpYVBsYXllcjIgaW5zdGFuY2UgYW5kIHByZXBhcmUgcGxheWJhY2suCi0gICAgcHJpdmF0ZSB2b2lkIG9wZW5WaWRlbyhEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgVXJpIHVyaSA9IGRzZC5nZXRVcmkoKTsKLSAgICAgICAgTWFwPFN0cmluZywgU3RyaW5nPiBoZWFkZXJzID0gZHNkLmdldFVyaUhlYWRlcnMoKTsKLSAgICAgICAgcmVzZXRQbGF5ZXIoKTsKLSAgICAgICAgaWYgKGlzUmVtb3RlUGxheWJhY2soKSkgewotICAgICAgICAgICAgbVJvdXRlUGxheWVyLm9wZW5WaWRlbyhkc2QpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQXVkaW9Gb2N1c1R5cGUgIT0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfTk9ORSkgewotICAgICAgICAgICAgLy8gVE9ETyB0aGlzIHNob3VsZCBoYXZlIGEgZm9jdXMgbGlzdGVuZXIKLSAgICAgICAgICAgIEF1ZGlvRm9jdXNSZXF1ZXN0IGZvY3VzUmVxdWVzdDsKLSAgICAgICAgICAgIGZvY3VzUmVxdWVzdCA9IG5ldyBBdWRpb0ZvY3VzUmVxdWVzdC5CdWlsZGVyKG1BdWRpb0ZvY3VzVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgLnNldEF1ZGlvQXR0cmlidXRlcyhtQXVkaW9BdHRyaWJ1dGVzKQotICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgICAgIG1BdWRpb01hbmFnZXIucmVxdWVzdEF1ZGlvRm9jdXMoZm9jdXNSZXF1ZXN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvcGVuVmlkZW8oKTogY3JlYXRpbmcgbmV3IE1lZGlhUGxheWVyMiBpbnN0YW5jZS4iKTsKLSAgICAgICAgICAgIG1NZWRpYVBsYXllciA9IG5ldyBNZWRpYVBsYXllcjJJbXBsKCk7Ci0gICAgICAgICAgICBtU3VyZmFjZVZpZXcuc2V0TWVkaWFQbGF5ZXIobU1lZGlhUGxheWVyKTsKLSAgICAgICAgICAgIG1UZXh0dXJlVmlldy5zZXRNZWRpYVBsYXllcihtTWVkaWFQbGF5ZXIpOwotICAgICAgICAgICAgbUN1cnJlbnRWaWV3LmFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKG1NZWRpYVBsYXllcik7Ci0KLSAgICAgICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IG1JbnN0YW5jZS5nZXRDb250ZXh0KCk7Ci0gICAgICAgICAgICAvLyBUT0RPOiBBZGQgdGltZWx5IGZpcmluZyBsb2dpYyBmb3IgbW9yZSBhY2N1cmF0ZSBzeW5jIGJldHdlZW4gQ0MgYW5kIHZpZGVvIGZyYW1lCi0gICAgICAgICAgICBtU3VidGl0bGVDb250cm9sbGVyID0gbmV3IFN1YnRpdGxlQ29udHJvbGxlcihjb250ZXh0KTsKLSAgICAgICAgICAgIG1TdWJ0aXRsZUNvbnRyb2xsZXIucmVnaXN0ZXJSZW5kZXJlcihuZXcgQ2xvc2VkQ2FwdGlvblJlbmRlcmVyKGNvbnRleHQpKTsKLSAgICAgICAgICAgIG1TdWJ0aXRsZUNvbnRyb2xsZXIuc2V0QW5jaG9yKChTdWJ0aXRsZUNvbnRyb2xsZXIuQW5jaG9yKSBtU3VidGl0bGVWaWV3KTsKLSAgICAgICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yID0gbmV3IEV4ZWN1dG9yKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoUnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgICAgICAgICAgICAgcnVubmFibGUucnVuKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZXRNZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKGV4ZWN1dG9yLCBtTWVkaWFQbGF5ZXIyQ2FsbGJhY2spOwotCi0gICAgICAgICAgICBtQ3VycmVudEJ1ZmZlclBlcmNlbnRhZ2UgPSAtMTsKLSAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZXREYXRhU291cmNlKGRzZCk7Ci0gICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0QXVkaW9BdHRyaWJ1dGVzKG1BdWRpb0F0dHJpYnV0ZXMpOwotICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNldE9uU3VidGl0bGVEYXRhTGlzdGVuZXIobVN1YnRpdGxlTGlzdGVuZXIpOwotICAgICAgICAgICAgLy8gd2UgZG9uJ3Qgc2V0IHRoZSB0YXJnZXQgc3RhdGUgaGVyZSBlaXRoZXIsIGJ1dCBwcmVzZXJ2ZSB0aGUKLSAgICAgICAgICAgIC8vIHRhcmdldCBzdGF0ZSB0aGF0IHdhcyB0aGVyZSBiZWZvcmUuCi0gICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUFJFUEFSSU5HOwotICAgICAgICAgICAgbU1lZGlhUGxheWVyLnByZXBhcmUoKTsKLQotICAgICAgICAgICAgLy8gU2F2ZSBmaWxlIG5hbWUgYXMgdGl0bGUgc2luY2UgdGhlIGZpbGUgbWF5IG5vdCBoYXZlIGEgdGl0bGUgTWV0YWRhdGEuCi0gICAgICAgICAgICBtVGl0bGUgPSB1cmkuZ2V0UGF0aCgpOwotICAgICAgICAgICAgU3RyaW5nIHNjaGVtZSA9IHVyaS5nZXRTY2hlbWUoKTsKLSAgICAgICAgICAgIGlmIChzY2hlbWUgIT0gbnVsbCAmJiBzY2hlbWUuZXF1YWxzKCJmaWxlIikpIHsKLSAgICAgICAgICAgICAgICBtVGl0bGUgPSB1cmkuZ2V0TGFzdFBhdGhTZWdtZW50KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUmV0cmlldmVyID0gbmV3IE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIoKTsKLSAgICAgICAgICAgIG1SZXRyaWV2ZXIuc2V0RGF0YVNvdXJjZShtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLCB1cmkpOwotCi0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvcGVuVmlkZW8oKS4gbUN1cnJlbnRTdGF0ZT0iICsgbUN1cnJlbnRTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBtVGFyZ2V0U3RhdGU9IiArIG1UYXJnZXRTdGF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIG9wZW4gY29udGVudDogIiArIHVyaSwgZXgpOwotICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX0VSUk9SOwotICAgICAgICAgICAgbVRhcmdldFN0YXRlID0gU1RBVEVfRVJST1I7Ci0gICAgICAgICAgICBtTWVkaWFQbGF5ZXIyQ2FsbGJhY2sub25FcnJvcihtTWVkaWFQbGF5ZXIsIGRzZCwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyLk1FRElBX0VSUk9SX1VOS05PV04sIE1lZGlhUGxheWVyMi5NRURJQV9FUlJPUl9JTyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFJlc2V0IHRoZSBtZWRpYSBwbGF5ZXIgaW4gYW55IHN0YXRlCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHJlc2V0UGxheWVyKCkgewotICAgICAgICBpZiAobU1lZGlhUGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lZGlhUGxheWVyMiBwbGF5ZXIgPSBtTWVkaWFQbGF5ZXI7Ci0gICAgICAgICAgICBuZXcgQXN5bmNUYXNrPE1lZGlhUGxheWVyMiwgVm9pZCwgVm9pZD4oKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHJvdGVjdGVkIFZvaWQgZG9JbkJhY2tncm91bmQoTWVkaWFQbGF5ZXIyLi4uIHBsYXllcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogRml4IE5QRSB3aGlsZSBNZWRpYVBsYXllcjIuY2xvc2UoKQotICAgICAgICAgICAgICAgICAgICAvL3BsYXllcnNbMF0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfS5leGVjdXRlT25FeGVjdXRvcihBc3luY1Rhc2suU0VSSUFMX0VYRUNVVE9SLCBwbGF5ZXIpOwotICAgICAgICAgICAgbU1lZGlhUGxheWVyID0gbnVsbDsKLSAgICAgICAgICAgIG1UZXh0dXJlVmlldy5zZXRNZWRpYVBsYXllcihudWxsKTsKLSAgICAgICAgICAgIG1TdXJmYWNlVmlldy5zZXRNZWRpYVBsYXllcihudWxsKTsKLSAgICAgICAgICAgIC8vbVBlbmRpbmdTdWJ0aXRsZVRyYWNrcy5jbGVhcigpOwotICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX0lETEU7Ci0gICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9JRExFOwotICAgICAgICAgICAgaWYgKG1BdWRpb0ZvY3VzVHlwZSAhPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19OT05FKSB7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5hYmFuZG9uQXVkaW9Gb2N1cyhudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtVmlkZW9XaWR0aCA9IDA7Ci0gICAgICAgIG1WaWRlb0hlaWdodCA9IDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBsYXliYWNrU3RhdGUoKSB7Ci0gICAgICAgIGlmIChtU3RhdGVCdWlsZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIEdldCB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBwbGF5ZXIgZm9yIHRoaXMgc3RyZWFtCi0gICAgICAgICAgICBtTWV0YWRhdGEgPSBtTWVkaWFQbGF5ZXIuZ2V0TWV0YWRhdGEoTWVkaWFQbGF5ZXIyLk1FVEFEQVRBX0FMTCwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyLkJZUEFTU19NRVRBREFUQV9GSUxURVIpOwotCi0gICAgICAgICAgICAvLyBBZGQgUGxheSBhY3Rpb24gYXMgZGVmYXVsdAotICAgICAgICAgICAgbG9uZyBwbGF5YmFja0FjdGlvbnMgPSBQbGF5YmFja1N0YXRlLkFDVElPTl9QTEFZOwotICAgICAgICAgICAgaWYgKG1NZXRhZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtTWV0YWRhdGEuaGFzKE1ldGFkYXRhLlBBVVNFX0FWQUlMQUJMRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1NZXRhZGF0YS5nZXRCb29sZWFuKE1ldGFkYXRhLlBBVVNFX0FWQUlMQUJMRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tBY3Rpb25zIHw9IFBsYXliYWNrU3RhdGUuQUNUSU9OX1BBVVNFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIW1NZXRhZGF0YS5oYXMoTWV0YWRhdGEuU0VFS19CQUNLV0FSRF9BVkFJTEFCTEUpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBtTWV0YWRhdGEuZ2V0Qm9vbGVhbihNZXRhZGF0YS5TRUVLX0JBQ0tXQVJEX0FWQUlMQUJMRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tBY3Rpb25zIHw9IFBsYXliYWNrU3RhdGUuQUNUSU9OX1JFV0lORDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFtTWV0YWRhdGEuaGFzKE1ldGFkYXRhLlNFRUtfRk9SV0FSRF9BVkFJTEFCTEUpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBtTWV0YWRhdGEuZ2V0Qm9vbGVhbihNZXRhZGF0YS5TRUVLX0ZPUldBUkRfQVZBSUxBQkxFKSkgewotICAgICAgICAgICAgICAgICAgICBwbGF5YmFja0FjdGlvbnMgfD0gUGxheWJhY2tTdGF0ZS5BQ1RJT05fRkFTVF9GT1JXQVJEOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIW1NZXRhZGF0YS5oYXMoTWV0YWRhdGEuU0VFS19BVkFJTEFCTEUpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBtTWV0YWRhdGEuZ2V0Qm9vbGVhbihNZXRhZGF0YS5TRUVLX0FWQUlMQUJMRSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tBY3Rpb25zIHw9IFBsYXliYWNrU3RhdGUuQUNUSU9OX1NFRUtfVE87Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBwbGF5YmFja0FjdGlvbnMgfD0gKFBsYXliYWNrU3RhdGUuQUNUSU9OX1BBVVNFIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrU3RhdGUuQUNUSU9OX1JFV0lORCB8IFBsYXliYWNrU3RhdGUuQUNUSU9OX0ZBU1RfRk9SV0FSRCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICBQbGF5YmFja1N0YXRlLkFDVElPTl9TRUVLX1RPKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1TdGF0ZUJ1aWxkZXIgPSBuZXcgUGxheWJhY2tTdGF0ZS5CdWlsZGVyKCk7Ci0gICAgICAgICAgICBtU3RhdGVCdWlsZGVyLnNldEFjdGlvbnMocGxheWJhY2tBY3Rpb25zKTsKLQotICAgICAgICAgICAgaWYgKG1DdXN0b21BY3Rpb25MaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uIGFjdGlvbiA6IG1DdXN0b21BY3Rpb25MaXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdGF0ZUJ1aWxkZXIuYWRkQ3VzdG9tQWN0aW9uKGFjdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1TdGF0ZUJ1aWxkZXIuc2V0U3RhdGUoZ2V0Q29ycmVzcG9uZGluZ1BsYXliYWNrU3RhdGUoKSwKLSAgICAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuZ2V0Q3VycmVudFBvc2l0aW9uKCksIG1TcGVlZCk7Ci0gICAgICAgIGlmIChtQ3VycmVudFN0YXRlICE9IFNUQVRFX0VSUk9SCi0gICAgICAgICAgICAmJiBtQ3VycmVudFN0YXRlICE9IFNUQVRFX0lETEUKLSAgICAgICAgICAgICYmIG1DdXJyZW50U3RhdGUgIT0gU1RBVEVfUFJFUEFSSU5HKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiB0aGlzIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoIE1lZGlhUGxheWVyMi5nZXRCdWZmZXJlZFBvc2l0aW9uKCkgb25jZSBpdCBpcwotICAgICAgICAgICAgLy8gaW1wbGVtZW50ZWQuCi0gICAgICAgICAgICBpZiAobUN1cnJlbnRCdWZmZXJQZXJjZW50YWdlID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgbVN0YXRlQnVpbGRlci5zZXRCdWZmZXJlZFBvc2l0aW9uKC0xKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVN0YXRlQnVpbGRlci5zZXRCdWZmZXJlZFBvc2l0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpIChtQ3VycmVudEJ1ZmZlclBlcmNlbnRhZ2UgLyAxMDAuMCAqIG1NZWRpYVBsYXllci5nZXREdXJhdGlvbigpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZXQgUGxheWJhY2tTdGF0ZSBmb3IgTWVkaWFTZXNzaW9uCi0gICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIFBsYXliYWNrU3RhdGUgc3RhdGUgPSBtU3RhdGVCdWlsZGVyLmJ1aWxkKCk7Ci0gICAgICAgICAgICBtTWVkaWFTZXNzaW9uLnNldFBsYXliYWNrU3RhdGUoc3RhdGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0Q29ycmVzcG9uZGluZ1BsYXliYWNrU3RhdGUoKSB7Ci0gICAgICAgIHN3aXRjaCAobUN1cnJlbnRTdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBTVEFURV9FUlJPUjoKLSAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9FUlJPUjsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfSURMRToKLSAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9OT05FOwotICAgICAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBsYXliYWNrU3RhdGUuU1RBVEVfQ09OTkVDVElORzsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSRUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBsYXliYWNrU3RhdGUuU1RBVEVfUEFVU0VEOwotICAgICAgICAgICAgY2FzZSBTVEFURV9QTEFZSU5HOgotICAgICAgICAgICAgICAgIHJldHVybiBQbGF5YmFja1N0YXRlLlNUQVRFX1BMQVlJTkc7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX1BMQVlCQUNLX0NPTVBMRVRFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9TVE9QUEVEOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIG1GYWRlT3V0ID0gbmV3IFJ1bm5hYmxlKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgaWYgKG1DdXJyZW50U3RhdGUgPT0gU1RBVEVfUExBWUlORykgewotICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIHZvaWQgc2hvd0NvbnRyb2xsZXIoKSB7Ci0gICAgICAgIC8vIFRPRE86IERlY2lkZSB3aGF0IHRvIHNob3cgd2hlbiB0aGUgc3RhdGUgaXMgbm90IGluIHBsYXliYWNrIHN0YXRlCi0gICAgICAgIGlmIChtTWVkaWFDb250cm9sVmlldyA9PSBudWxsIHx8ICFpc0luUGxheWJhY2tTdGF0ZSgpCi0gICAgICAgICAgICAgICAgfHwgKG1Jc011c2ljTWVkaWFUeXBlICYmIG1TaXplVHlwZSA9PSBTSVpFX1RZUEVfRlVMTCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtTWVkaWFDb250cm9sVmlldy5yZW1vdmVDYWxsYmFja3MobUZhZGVPdXQpOwotICAgICAgICBtTWVkaWFDb250cm9sVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIGlmIChtU2hvd0NvbnRyb2xsZXJJbnRlcnZhbE1zICE9IDAKLSAgICAgICAgICAgICYmICFtQWNjZXNzaWJpbGl0eU1hbmFnZXIuaXNUb3VjaEV4cGxvcmF0aW9uRW5hYmxlZCgpKSB7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5wb3N0RGVsYXllZChtRmFkZU91dCwgbVNob3dDb250cm9sbGVySW50ZXJ2YWxNcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdG9nZ2xlTWVkaWFDb250cm9sVmlld1Zpc2liaWxpdHkoKSB7Ci0gICAgICAgIGlmIChtTWVkaWFDb250cm9sVmlldy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5yZW1vdmVDYWxsYmFja3MobUZhZGVPdXQpOwotICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhcHBseVNwZWVkKCkgewotICAgICAgICBQbGF5YmFja1BhcmFtcyBwYXJhbXMgPSBtTWVkaWFQbGF5ZXIuZ2V0UGxheWJhY2tQYXJhbXMoKS5hbGxvd0RlZmF1bHRzKCk7Ci0gICAgICAgIGlmIChtU3BlZWQgIT0gcGFyYW1zLmdldFNwZWVkKCkpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgcGFyYW1zLnNldFNwZWVkKG1TcGVlZCk7Ci0gICAgICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNldFBsYXliYWNrUGFyYW1zKHBhcmFtcyk7Ci0gICAgICAgICAgICAgICAgbUZhbGxiYWNrU3BlZWQgPSBtU3BlZWQ7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIlBsYXliYWNrUGFyYW1zIGhhcyB1bnN1cHBvcnRlZCB2YWx1ZTogIiArIGUpOwotICAgICAgICAgICAgICAgIC8vIFRPRE86IHNob3VsZCByZXZpc2UgdGhpcyBwYXJ0IGFmdGVyIGludGVncmF0aW5nIHdpdGggTVAyLgotICAgICAgICAgICAgICAgIC8vIElmIG1TcGVlZCBoYWQgYW4gaWxsZWdhbCB2YWx1ZSBmb3Igc3BlZWQgcmF0ZSwgc3lzdGVtIHdpbGwgZGV0ZXJtaW5lIGJlc3QKLSAgICAgICAgICAgICAgICAvLyBoYW5kbGluZyAoc2VlIFBsYXliYWNrUGFyYW1zLkFVRElPX0ZBTExCQUNLX01PREVfREVGQVVMVCkuCi0gICAgICAgICAgICAgICAgLy8gTm90ZTogVGhlIHByZS1NUDIgcmV0dXJucyAwLjBmIHdoZW4gaXQgaXMgcGF1c2VkLiBJbiB0aGlzIGNhc2UsIFZpZGVvVmlldzIgd2lsbAotICAgICAgICAgICAgICAgIC8vIHVzZSBtRmFsbGJhY2tTcGVlZCBpbnN0ZWFkLgotICAgICAgICAgICAgICAgIGZsb2F0IGZhbGxiYWNrU3BlZWQgPSBtTWVkaWFQbGF5ZXIuZ2V0UGxheWJhY2tQYXJhbXMoKS5hbGxvd0RlZmF1bHRzKCkuZ2V0U3BlZWQoKTsKLSAgICAgICAgICAgICAgICBpZiAoZmFsbGJhY2tTcGVlZCA+IDAuMGYpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZhbGxiYWNrU3BlZWQgPSBmYWxsYmFja1NwZWVkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtU3BlZWQgPSBtRmFsbGJhY2tTcGVlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1JlbW90ZVBsYXliYWNrKCkgewotICAgICAgICBpZiAobU1lZGlhQ29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgUGxheWJhY2tJbmZvIHBsYXliYWNrSW5mbyA9IG1NZWRpYUNvbnRyb2xsZXIuZ2V0UGxheWJhY2tJbmZvKCk7Ci0gICAgICAgIHJldHVybiBwbGF5YmFja0luZm8gIT0gbnVsbAotICAgICAgICAgICAgICAgICYmIHBsYXliYWNrSW5mby5nZXRQbGF5YmFja1R5cGUoKSA9PSBQbGF5YmFja0luZm8uUExBWUJBQ0tfVFlQRV9SRU1PVEU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHNlbGVjdE9yRGVzZWxlY3RTdWJ0aXRsZShib29sZWFuIHNlbGVjdCkgewotICAgICAgICBpZiAoIWlzSW5QbGF5YmFja1N0YXRlKCkpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoc2VsZWN0KSB7Ci0gICAgICAgICAgICBpZiAobVN1YnRpdGxlVHJhY2tJbmRpY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBtYWtlIHRoaXMgc2VsZWN0aW9uIGR5bmFtaWMKLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXggPSBtU3VidGl0bGVUcmFja0luZGljZXMuZ2V0KDApLmZpcnN0OwotICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUNvbnRyb2xsZXIuc2VsZWN0VHJhY2sobVN1YnRpdGxlVHJhY2tJbmRpY2VzLmdldCgwKS5zZWNvbmQpOwotICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZWxlY3RUcmFjayhtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXgpOwotICAgICAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCAhPSBJTlZBTElEX1RSQUNLX0lOREVYKSB7Ci0gICAgICAgICAgICAgICAgbU1lZGlhUGxheWVyLmRlc2VsZWN0VHJhY2sobVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KTsKLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXggPSBJTlZBTElEX1RSQUNLX0lOREVYOwotICAgICAgICAgICAgICAgIG1TdWJ0aXRsZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4dHJhY3RUcmFja3MoKSB7Ci0gICAgICAgIExpc3Q8TWVkaWFQbGF5ZXIyLlRyYWNrSW5mbz4gdHJhY2tJbmZvcyA9IG1NZWRpYVBsYXllci5nZXRUcmFja0luZm8oKTsKLSAgICAgICAgbVZpZGVvVHJhY2tJbmRpY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIG1BdWRpb1RyYWNrSW5kaWNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBtU3VidGl0bGVUcmFja0luZGljZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgbVN1YnRpdGxlQ29udHJvbGxlci5yZXNldCgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRyYWNrSW5mb3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGludCB0cmFja1R5cGUgPSB0cmFja0luZm9zLmdldChpKS5nZXRUcmFja1R5cGUoKTsKLSAgICAgICAgICAgIGlmICh0cmFja1R5cGUgPT0gTWVkaWFQbGF5ZXIyLlRyYWNrSW5mby5NRURJQV9UUkFDS19UWVBFX1ZJREVPKSB7Ci0gICAgICAgICAgICAgICAgbVZpZGVvVHJhY2tJbmRpY2VzLmFkZChpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhY2tUeXBlID09IE1lZGlhUGxheWVyMi5UcmFja0luZm8uTUVESUFfVFJBQ0tfVFlQRV9BVURJTykgewotICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrSW5kaWNlcy5hZGQoaSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRyYWNrVHlwZSA9PSBNZWRpYVBsYXllcjIuVHJhY2tJbmZvLk1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUKLSAgICAgICAgICAgICAgICAgICAgfHwgdHJhY2tUeXBlID09IE1lZGlhUGxheWVyMi5UcmFja0luZm8uTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQpIHsKLSAgICAgICAgICAgICAgICBTdWJ0aXRsZVRyYWNrIHRyYWNrID0gbVN1YnRpdGxlQ29udHJvbGxlci5hZGRUcmFjayh0cmFja0luZm9zLmdldChpKS5nZXRGb3JtYXQoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlVHJhY2tJbmRpY2VzLmFkZChuZXcgUGFpcjw+KGksIHRyYWNrKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFNlbGVjdCBmaXJzdCB0cmFja3MgYXMgZGVmYXVsdAotICAgICAgICBpZiAobVZpZGVvVHJhY2tJbmRpY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1TZWxlY3RlZFZpZGVvVHJhY2tJbmRleCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1BdWRpb1RyYWNrSW5kaWNlcy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXggPSAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtVmlkZW9UcmFja0luZGljZXMuc2l6ZSgpID09IDAgJiYgbUF1ZGlvVHJhY2tJbmRpY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1Jc011c2ljTWVkaWFUeXBlID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIEJ1bmRsZSBkYXRhID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICBkYXRhLnB1dEludChNZWRpYUNvbnRyb2xWaWV3MkltcGwuS0VZX1ZJREVPX1RSQUNLX0NPVU5ULCBtVmlkZW9UcmFja0luZGljZXMuc2l6ZSgpKTsKLSAgICAgICAgZGF0YS5wdXRJbnQoTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9BVURJT19UUkFDS19DT1VOVCwgbUF1ZGlvVHJhY2tJbmRpY2VzLnNpemUoKSk7Ci0gICAgICAgIGRhdGEucHV0SW50KE1lZGlhQ29udHJvbFZpZXcySW1wbC5LRVlfU1VCVElUTEVfVFJBQ0tfQ09VTlQsIG1TdWJ0aXRsZVRyYWNrSW5kaWNlcy5zaXplKCkpOwotICAgICAgICBpZiAobVN1YnRpdGxlVHJhY2tJbmRpY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIHNlbGVjdE9yRGVzZWxlY3RTdWJ0aXRsZShtU3VidGl0bGVFbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICBtTWVkaWFTZXNzaW9uLnNlbmRTZXNzaW9uRXZlbnQoTWVkaWFDb250cm9sVmlldzJJbXBsLkVWRU5UX1VQREFURV9UUkFDS19TVEFUVVMsIGRhdGEpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleHRyYWN0TWV0YWRhdGEoKSB7Ci0gICAgICAgIC8vIEdldCBhbmQgc2V0IGR1cmF0aW9uIGFuZCB0aXRsZSB2YWx1ZXMgYXMgTWVkaWFNZXRhZGF0YSBmb3IgTWVkaWFDb250cm9sVmlldzIKLSAgICAgICAgTWVkaWFNZXRhZGF0YS5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgTWVkaWFNZXRhZGF0YS5CdWlsZGVyKCk7Ci0gICAgICAgIGlmIChtTWV0YWRhdGEgIT0gbnVsbCAmJiBtTWV0YWRhdGEuaGFzKE1ldGFkYXRhLlRJVExFKSkgewotICAgICAgICAgICAgbVRpdGxlID0gbU1ldGFkYXRhLmdldFN0cmluZyhNZXRhZGF0YS5USVRMRSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnVpbGRlci5wdXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfVElUTEUsIG1UaXRsZSk7Ci0gICAgICAgIGJ1aWxkZXIucHV0TG9uZygKLSAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9EVVJBVElPTiwgbU1lZGlhUGxheWVyLmdldER1cmF0aW9uKCkpOwotCi0gICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uc2V0TWV0YWRhdGEoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBleHRyYWN0QXVkaW9NZXRhZGF0YSgpIHsKLSAgICAgICAgaWYgKCFtSXNNdXNpY01lZGlhVHlwZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbVJlc291cmNlcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUluc3RhbmNlLmdldENvbnRleHQoKSk7Ci0gICAgICAgIG1NYW5hZ2VyID0gKFdpbmRvd01hbmFnZXIpIG1JbnN0YW5jZS5nZXRDb250ZXh0KCkuZ2V0QXBwbGljYXRpb25Db250ZXh0KCkKLSAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJTkRPV19TRVJWSUNFKTsKLQotICAgICAgICBieXRlW10gYWxidW0gPSBtUmV0cmlldmVyLmdldEVtYmVkZGVkUGljdHVyZSgpOwotICAgICAgICBpZiAoYWxidW0gIT0gbnVsbCkgewotICAgICAgICAgICAgQml0bWFwIGJpdG1hcCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlQnl0ZUFycmF5KGFsYnVtLCAwLCBhbGJ1bS5sZW5ndGgpOwotICAgICAgICAgICAgbU11c2ljQWxidW1EcmF3YWJsZSA9IG5ldyBCaXRtYXBEcmF3YWJsZShiaXRtYXApOwotCi0gICAgICAgICAgICAvLyBUT0RPOiByZXBsYWNlIHdpdGggdmlzdWFsaXplcgotICAgICAgICAgICAgUGFsZXR0ZS5nZW5lcmF0ZUFzeW5jKGJpdG1hcCwgbmV3IFBhbGV0dGUuUGFsZXR0ZUFzeW5jTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25HZW5lcmF0ZWQoUGFsZXR0ZSBwYWxldHRlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGFkZCBkb21pbmFudCBjb2xvciBmb3IgZGVmYXVsdCBhbGJ1bSBpbWFnZS4KLSAgICAgICAgICAgICAgICAgICAgbURvbWluYW50Q29sb3IgPSBwYWxldHRlLmdldERvbWluYW50Q29sb3IoMCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTXVzaWNWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NdXNpY1ZpZXcuc2V0QmFja2dyb3VuZENvbG9yKG1Eb21pbmFudENvbG9yKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU11c2ljQWxidW1EcmF3YWJsZSA9IG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19kZWZhdWx0X2FsYnVtX2ltYWdlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyB0aXRsZSA9IG1SZXRyaWV2ZXIuZXh0cmFjdE1ldGFkYXRhKE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX1RJVExFKTsKLSAgICAgICAgaWYgKHRpdGxlICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1NdXNpY1RpdGxlVGV4dCA9IHRpdGxlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU11c2ljVGl0bGVUZXh0ID0gbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9tdXNpY190aXRsZV91bmtub3duX3RleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIGFydGlzdCA9IG1SZXRyaWV2ZXIuZXh0cmFjdE1ldGFkYXRhKE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIuTUVUQURBVEFfS0VZX0FSVElTVCk7Ci0gICAgICAgIGlmIChhcnRpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgbU11c2ljQXJ0aXN0VGV4dCA9IGFydGlzdDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1NdXNpY0FydGlzdFRleHQgPSBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX211c2ljX2FydGlzdF91bmtub3duX3RleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gU2VuZCB0aXRsZSBhbmQgYXJ0aXN0IHN0cmluZyB0byBNZWRpYUNvbnRyb2xWaWV3MgotICAgICAgICBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIoKTsKLSAgICAgICAgYnVpbGRlci5wdXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfVElUTEUsIG1NdXNpY1RpdGxlVGV4dCk7Ci0gICAgICAgIGJ1aWxkZXIucHV0U3RyaW5nKE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX0FSVElTVCwgbU11c2ljQXJ0aXN0VGV4dCk7Ci0gICAgICAgIG1NZWRpYVNlc3Npb24uc2V0TWV0YWRhdGEoYnVpbGRlci5idWlsZCgpKTsKLQotICAgICAgICAvLyBEaXNwbGF5IEVtYmVkZGVkIG1vZGUgYXMgZGVmYXVsdAotICAgICAgICBtSW5zdGFuY2UucmVtb3ZlVmlldyhtU3VyZmFjZVZpZXcpOwotICAgICAgICBtSW5zdGFuY2UucmVtb3ZlVmlldyhtVGV4dHVyZVZpZXcpOwotICAgICAgICBpbmZsYXRlTXVzaWNWaWV3KFIubGF5b3V0LmVtYmVkZGVkX211c2ljKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCByZXRyaWV2ZU9yaWVudGF0aW9uKCkgewotICAgICAgICBEaXNwbGF5TWV0cmljcyBkbSA9IFJlc291cmNlcy5nZXRTeXN0ZW0oKS5nZXREaXNwbGF5TWV0cmljcygpOwotICAgICAgICBpbnQgd2lkdGggPSBkbS53aWR0aFBpeGVsczsKLSAgICAgICAgaW50IGhlaWdodCA9IGRtLmhlaWdodFBpeGVsczsKLQotICAgICAgICByZXR1cm4gKGhlaWdodCA+IHdpZHRoKSA/Ci0gICAgICAgICAgICAgICAgQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9QT1JUUkFJVCA6Ci0gICAgICAgICAgICAgICAgQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9MQU5EU0NBUEU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluZmxhdGVNdXNpY1ZpZXcoaW50IGxheW91dElkKSB7Ci0gICAgICAgIG1JbnN0YW5jZS5yZW1vdmVWaWV3KG1NdXNpY1ZpZXcpOwotCi0gICAgICAgIFZpZXcgdiA9IEFwaUhlbHBlci5pbmZsYXRlTGliTGF5b3V0KG1JbnN0YW5jZS5nZXRDb250ZXh0KCksIGxheW91dElkKTsKLSAgICAgICAgdi5zZXRCYWNrZ3JvdW5kQ29sb3IobURvbWluYW50Q29sb3IpOwotCi0gICAgICAgIEltYWdlVmlldyBhbGJ1bVZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmFsYnVtKTsKLSAgICAgICAgaWYgKGFsYnVtVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhbGJ1bVZpZXcuc2V0SW1hZ2VEcmF3YWJsZShtTXVzaWNBbGJ1bURyYXdhYmxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFRleHRWaWV3IHRpdGxlVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQudGl0bGUpOwotICAgICAgICBpZiAodGl0bGVWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRpdGxlVmlldy5zZXRUZXh0KG1NdXNpY1RpdGxlVGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBUZXh0VmlldyBhcnRpc3RWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC5hcnRpc3QpOwotICAgICAgICBpZiAoYXJ0aXN0VmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhcnRpc3RWaWV3LnNldFRleHQobU11c2ljQXJ0aXN0VGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtTXVzaWNWaWV3ID0gdjsKLSAgICAgICAgbUluc3RhbmNlLmFkZFZpZXcobU11c2ljVmlldywgMCk7Ci0gICAgfQotCi0gICAgT25TdWJ0aXRsZURhdGFMaXN0ZW5lciBtU3VidGl0bGVMaXN0ZW5lciA9Ci0gICAgICAgICAgICBuZXcgT25TdWJ0aXRsZURhdGFMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblN1YnRpdGxlRGF0YShNZWRpYVBsYXllcjIgbXAsIFN1YnRpdGxlRGF0YSBkYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25TdWJ0aXRsZURhdGEoKTogZ2V0VHJhY2tJbmRleDogIiArIGRhdGEuZ2V0VHJhY2tJbmRleCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgZ2V0Q3VycmVudFBvc2l0aW9uOiAiICsgbXAuZ2V0Q3VycmVudFBvc2l0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBnZXRTdGFydFRpbWVVcygpOiAiICsgZGF0YS5nZXRTdGFydFRpbWVVcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgZGlmZjogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChkYXRhLmdldFN0YXJ0VGltZVVzKCkvMTAwMCAtIG1wLmdldEN1cnJlbnRQb3NpdGlvbigpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJtcywgZ2V0RHVyYXRpb25VcygpOiAiICsgZGF0YS5nZXREdXJhdGlvblVzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKLQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCA9IGRhdGEuZ2V0VHJhY2tJbmRleCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT0gbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblN1YnRpdGxlRGF0YSgpOiBnZXRUcmFja0luZGV4OiAiICsgZGF0YS5nZXRUcmFja0luZGV4KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzZWxlY3RlZCB0cmFjayBpbmRleDogIiArIG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZm9yIChQYWlyPEludGVnZXIsIFN1YnRpdGxlVHJhY2s+IHAgOiBtU3VidGl0bGVUcmFja0luZGljZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwLmZpcnN0ID09IGluZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VidGl0bGVUcmFjayB0cmFjayA9IHAuc2Vjb25kOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLm9uRGF0YShkYXRhKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0KLSAgICBNZWRpYVBsYXllcjJFdmVudENhbGxiYWNrIG1NZWRpYVBsYXllcjJDYWxsYmFjayA9Ci0gICAgICAgICAgICBuZXcgTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjaygpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblZpZGVvU2l6ZUNoYW5nZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25WaWRlb1NpemVDaGFuZ2VkKCk6IHNpemU6ICIgKyB3aWR0aCArICIvIiArIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvV2lkdGggPSBtcC5nZXRWaWRlb1dpZHRoKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1WaWRlb0hlaWdodCA9IG1wLmdldFZpZGVvSGVpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25WaWRlb1NpemVDaGFuZ2VkKCk6IG1WaWRlb1NpemU6IiArIG1WaWRlb1dpZHRoICsgIi8iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbVZpZGVvSGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobVZpZGVvV2lkdGggIT0gMCAmJiBtVmlkZW9IZWlnaHQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnJlcXVlc3RMYXlvdXQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSB0aW1lZCB0ZXh0IHJlbGF0ZWQgY29kZSBsYXRlciBvbmNlIHJlbGV2YW50IFJlbmRlcmVyIGlzIGRlZmluZWQuCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBqdXN0IGZvciBkZWJ1Z2dpbmcgcHVycG9zZS4KLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblRpbWVkVGV4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBUaW1lZFRleHQgdGV4dCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiVGltZWRUZXh0OiAiICsgdGV4dC5nZXRUZXh0KCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSW5mbygKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgd2hhdCwgaW50IGV4dHJhKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5NRURJQV9JTkZPX01FVEFEQVRBX1VQREFURSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdFRyYWNrcygpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fUFJFUEFSRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25QcmVwYXJlZChtcCwgZHNkKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5NRURJQV9JTkZPX1BMQVlCQUNLX0NPTVBMRVRFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm9uQ29tcGxldGlvbihtcCwgZHNkKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5NRURJQV9JTkZPX0JVRkZFUklOR19VUERBVEUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25CdWZmZXJpbmdVcGRhdGUobXAsIGRzZCwgZXh0cmEpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgZnJhbWV3b3JrRXJyLCBpbnQgaW1wbEVycikgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkVycm9yOiAiICsgZnJhbWV3b3JrRXJyICsgIiwiICsgaW1wbEVycik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9FUlJPUjsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tTdGF0ZSgpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTWVkaWFDb250cm9sVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNhbGxDb21wbGV0ZWQoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuQ0FMTF9DT01QTEVURURfU0VFS19UTyAmJiBzdGF0dXMgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tTdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIG9uUHJlcGFyZWQoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJPblByZXBhcmVkTGlzdGVuZXIoKS4gbUN1cnJlbnRTdGF0ZT0iICsgbUN1cnJlbnRTdGF0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUFJFUEFSRUQ7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhbmQgc2V0IHBsYXliYWNrIHN0YXRlIGZvciBNZWRpYUNvbnRyb2xWaWV3MgotICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogY2hhbmdlIHRoaXMgdG8gc2VuZCBUcmFja0luZm9zIHRvIE1lZGlhQ29udHJvbFZpZXcyCi0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGNyZWF0ZSBNZWRpYVNlc3Npb24gd2hlbiBpbml0aWFsaXppbmcgVmlkZW9WaWV3MgotICAgICAgICAgICAgICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0VHJhY2tzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0TWV0YWRhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RBdWRpb01ldGFkYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAobU1lZGlhQ29udHJvbFZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcuc2V0RW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbnQgdmlkZW9XaWR0aCA9IG1wLmdldFZpZGVvV2lkdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHZpZGVvSGVpZ2h0ID0gbXAuZ2V0VmlkZW9IZWlnaHQoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBtU2Vla1doZW5QcmVwYXJlZCBtYXkgYmUgY2hhbmdlZCBhZnRlciBzZWVrVG8oKSBjYWxsCi0gICAgICAgICAgICAgICAgICAgIGxvbmcgc2Vla1RvUG9zaXRpb24gPSBtU2Vla1doZW5QcmVwYXJlZDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlZWtUb1Bvc2l0aW9uICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5zZWVrVG8oc2Vla1RvUG9zaXRpb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvV2lkdGggIT0gMCAmJiB2aWRlb0hlaWdodCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW9XaWR0aCAhPSBtVmlkZW9XaWR0aCB8fCB2aWRlb0hlaWdodCAhPSBtVmlkZW9IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiT25QcmVwYXJlZExpc3RlbmVyKCkgOiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiIHZpZGVvIHNpemU6ICIgKyB2aWRlb1dpZHRoICsgIi8iICsgdmlkZW9IZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICIgbWVhc3VyZWRTaXplOiAiICsgbUluc3RhbmNlLmdldE1lYXN1cmVkV2lkdGgoKSArICIvIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUluc3RhbmNlLmdldE1lYXN1cmVkSGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICIgdmlld1NpemU6ICIgKyBtSW5zdGFuY2UuZ2V0V2lkdGgoKSArICIvIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUluc3RhbmNlLmdldEhlaWdodCgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvV2lkdGggPSB2aWRlb1dpZHRoOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0hlaWdodCA9IHZpZGVvSGVpZ2h0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5yZXF1ZXN0TGF5b3V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZWVkVG9TdGFydCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpLnBsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGtub3cgdGhlIHZpZGVvIHNpemUgeWV0LCBidXQgc2hvdWxkIHN0YXJ0IGFueXdheS4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSB2aWRlbyBzaXplIG1pZ2h0IGJlIHJlcG9ydGVkIHRvIHVzIGxhdGVyLgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRUb1N0YXJ0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkucGxheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIG9uQ29tcGxldGlvbihNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUExBWUJBQ0tfQ09NUExFVEVEOwotICAgICAgICAgICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9QTEFZQkFDS19DT01QTEVURUQ7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb0ZvY3VzVHlwZSAhPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmFiYW5kb25BdWRpb0ZvY3VzKG51bGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIG9uQnVmZmVyaW5nVXBkYXRlKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgcGVyY2VudCkgewotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudEJ1ZmZlclBlcmNlbnRhZ2UgPSBwZXJjZW50OwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQotICAgIHByaXZhdGUgY2xhc3MgTWVkaWFTZXNzaW9uQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVNlc3Npb24uQ2FsbGJhY2sgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Db21tYW5kKFN0cmluZyBjb21tYW5kLCBCdW5kbGUgYXJncywgUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKLSAgICAgICAgICAgIGlmIChpc1JlbW90ZVBsYXliYWNrKCkpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIub25Db21tYW5kKGNvbW1hbmQsIGFyZ3MsIHJlY2VpdmVyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChjb21tYW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfU0hPV19TVUJUSVRMRToKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJ0aXRsZUluZGV4ID0gYXJncy5nZXRJbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29udHJvbFZpZXcySW1wbC5LRVlfU0VMRUNURURfU1VCVElUTEVfSU5ERVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVkFMSURfVFJBQ0tfSU5ERVgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnRpdGxlSW5kZXggIT0gSU5WQUxJRF9UUkFDS19JTkRFWCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdWJ0aXRsZVRyYWNrSW5kZXggPSBtU3VidGl0bGVUcmFja0luZGljZXMuZ2V0KHN1YnRpdGxlSW5kZXgpLmZpcnN0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdWJ0aXRsZVRyYWNrSW5kZXggIT0gbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCA9IHN1YnRpdGxlVHJhY2tJbmRleDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnNldFN1YnRpdGxlRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9ISURFX1NVQlRJVExFOgotICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnNldFN1YnRpdGxlRW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9TRVRfRlVMTFNDUkVFTjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtRnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5SZXF1ZXN0TGlzdGVuZXIub25GdWxsU2NyZWVuUmVxdWVzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuZ2V0Qm9vbGVhbihNZWRpYUNvbnRyb2xWaWV3MkltcGwuQVJHVU1FTlRfS0VZX0ZVTExTQ1JFRU4pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX1NFTEVDVF9BVURJT19UUkFDSzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb0luZGV4ID0gYXJncy5nZXRJbnQoTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9TRUxFQ1RFRF9BVURJT19JTkRFWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WQUxJRF9UUkFDS19JTkRFWCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9JbmRleCAhPSBJTlZBTElEX1RSQUNLX0lOREVYKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvVHJhY2tJbmRleCA9IG1BdWRpb1RyYWNrSW5kaWNlcy5nZXQoYXVkaW9JbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvVHJhY2tJbmRleCAhPSBtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkQXVkaW9UcmFja0luZGV4ID0gYXVkaW9UcmFja0luZGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2VsZWN0VHJhY2sobVNlbGVjdGVkQXVkaW9UcmFja0luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9TRVRfUExBWUJBQ0tfU1BFRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzcGVlZCA9IGFyZ3MuZ2V0RmxvYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29udHJvbFZpZXcySW1wbC5LRVlfUExBWUJBQ0tfU1BFRUQsIElOVkFMSURfU1BFRUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNwZWVkICE9IElOVkFMSURfU1BFRUQgJiYgc3BlZWQgIT0gbVNwZWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnNldFNwZWVkKHNwZWVkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3BlZWQgPSBzcGVlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX01VVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lTGV2ZWwgPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMsIDAsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfVU5NVVRFOgotICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQywgbVZvbHVtZUxldmVsLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNob3dDb250cm9sbGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DdXN0b21BY3Rpb24oU3RyaW5nIGFjdGlvbiwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgbUN1c3RvbUFjdGlvbkxpc3RlbmVyUmVjb3JkLmZpcnN0LmV4ZWN1dGUoKCkgLT4KLSAgICAgICAgICAgICAgICAgICAgbUN1c3RvbUFjdGlvbkxpc3RlbmVyUmVjb3JkLnNlY29uZC5vbkN1c3RvbUFjdGlvbihhY3Rpb24sIGV4dHJhcykpOwotICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXkoKSB7Ci0gICAgICAgICAgICBpZiAoaXNJblBsYXliYWNrU3RhdGUoKSAmJiAobUN1cnJlbnRWaWV3Lmhhc0F2YWlsYWJsZVN1cmZhY2UoKSB8fCBtSXNNdXNpY01lZGlhVHlwZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNSZW1vdGVQbGF5YmFjaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5vblBsYXkoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhcHBseVNwZWVkKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5wbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QTEFZSU5HOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QTEFZSU5HOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVRhcmdldFN0YXRlID0gU1RBVEVfUExBWUlORzsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uUGxheSgpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNob3dDb250cm9sbGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QYXVzZSgpIHsKLSAgICAgICAgICAgIGlmIChpc0luUGxheWJhY2tTdGF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzUmVtb3RlUGxheWJhY2soKSkgewotICAgICAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIub25QYXVzZSgpOwotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUEFVU0VEOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobU1lZGlhUGxheWVyLmlzUGxheWluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5wYXVzZSgpOwotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUEFVU0VEOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVRhcmdldFN0YXRlID0gU1RBVEVfUEFVU0VEOwotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25QYXVzZSgpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNob3dDb250cm9sbGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZWVrVG8obG9uZyBwb3MpIHsKLSAgICAgICAgICAgIGlmIChpc0luUGxheWJhY2tTdGF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGlzUmVtb3RlUGxheWJhY2soKSkgewotICAgICAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIub25TZWVrVG8ocG9zKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2Vla1RvKHBvcywgTWVkaWFQbGF5ZXIyLlNFRUtfUFJFVklPVVNfU1lOQyk7Ci0gICAgICAgICAgICAgICAgICAgIG1TZWVrV2hlblByZXBhcmVkID0gMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1TZWVrV2hlblByZXBhcmVkID0gcG9zOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7Ci0gICAgICAgICAgICBpZiAoaXNSZW1vdGVQbGF5YmFjaygpKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyLm9uU3RvcCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXNldFBsYXllcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvVmlld0ludGVyZmFjZS5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3SW50ZXJmYWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1NGQ0N2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3SW50ZXJmYWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldDsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotCi1pbnRlcmZhY2UgVmlkZW9WaWV3SW50ZXJmYWNlIHsKLSAgICAvKioKLSAgICAgKiBBc3NpZ25zIHRoZSB2aWV3J3Mgc3VyZmFjZSB0byB0aGUgZ2l2ZW4gTWVkaWFQbGF5ZXIyIGluc3RhbmNlLgotICAgICAqCi0gICAgICogQHBhcmFtIG1wIE1lZGlhUGxheWVyMgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3VyZmFjZSBpcyBzdWNjZXNzZnVsbHkgYXNzaWduZWQsIGZhbHNlIGlmIG5vdC4gSXQgd2lsbCBmYWlsIHRvIGFzc2lnbgotICAgICAqICAgICAgICAgaWYgYW55IG9mIE1lZGlhUGxheWVyMiBvciBzdXJmYWNlIGlzIHVuYXZhaWxhYmxlLgotICAgICAqLwotICAgIGJvb2xlYW4gYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIoTWVkaWFQbGF5ZXIyIG1wKTsKLSAgICB2b2lkIHNldFN1cmZhY2VMaXN0ZW5lcihTdXJmYWNlTGlzdGVuZXIgbCk7Ci0gICAgaW50IGdldFZpZXdUeXBlKCk7Ci0gICAgdm9pZCBzZXRNZWRpYVBsYXllcihNZWRpYVBsYXllcjIgbXApOwotCi0gICAgLyoqCi0gICAgICogVGFrZXMgb3ZlciBvbGRWaWV3LiBJdCBtZWFucyB0aGF0IHRoZSBNZWRpYVBsYXllcjIgd2lsbCBzdGFydCByZW5kZXJpbmcgb24gdGhpcyB2aWV3LgotICAgICAqIFRoZSB2aXNpYmlsaXR5IG9mIG9sZFZpZXcgd2lsbCBiZSBzZXQgYXMge0BsaW5rIFZpZXcuR09ORX0uIElmIHRoZSB2aWV3IGRvZXNuJ3QgaGF2ZSBhCi0gICAgICogTWVkaWFQbGF5ZXIyIGluc3RhbmNlIG9yIGl0cyBzdXJmYWNlIGlzIG5vdCBhdmFpbGFibGUsIHRoZSBhY3R1YWwgZXhlY3V0aW9uIGlzIGRlZmVycmVkIHVudGlsCi0gICAgICogYSBNZWRpYVBsYXllcjIgaW5zdGFuY2UgaXMgc2V0IGJ5IHtAbGluayAjc2V0TWVkaWFQbGF5ZXJ9IG9yIGl0cyBzdXJmYWNlIGJlY29tZXMgYXZhaWxhYmxlLgotICAgICAqIHtAbGluayBTdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlVGFrZU92ZXJEb25lfSB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBhY3R1YWwgZXhlY3V0aW9uIGlzCi0gICAgICogZG9uZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvbGRWaWV3IFRoZSB2aWV3IHRoYXQgTWVkaWFQbGF5ZXIyIGlzIGN1cnJlbnRseSByZW5kZXJpbmcgb24uCi0gICAgICovCi0gICAgdm9pZCB0YWtlT3ZlcihATm9uTnVsbCBWaWRlb1ZpZXdJbnRlcmZhY2Ugb2xkVmlldyk7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgaWYgdGhlIHZpZXcncyBzdXJmYWNlIGlzIGF2YWlsYWJsZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgc3VyZmFjZSBpcyBhdmFpbGFibGUuCi0gICAgICovCi0gICAgYm9vbGVhbiBoYXNBdmFpbGFibGVTdXJmYWNlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBBbiBpbnN0YW5jZSBvZiBWaWRlb1ZpZXdJbnRlcmZhY2UgY2FsbHMgdGhlc2Ugc3VyZmFjZSBub3RpZmljYXRpb24gbWV0aG9kcyBhY2NvcmRpbmdseSBpZgotICAgICAqIGEgbGlzdGVuZXIgaGFzIGJlZW4gcmVnaXN0ZXJlZCB2aWEge0BsaW5rICNzZXRTdXJmYWNlTGlzdGVuZXIoU3VyZmFjZUxpc3RlbmVyKX0uCi0gICAgICovCi0gICAgaW50ZXJmYWNlIFN1cmZhY2VMaXN0ZW5lciB7Ci0gICAgICAgIHZvaWQgb25TdXJmYWNlQ3JlYXRlZChWaWV3IHZpZXcsIGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci0gICAgICAgIHZvaWQgb25TdXJmYWNlRGVzdHJveWVkKFZpZXcgdmlldyk7Ci0gICAgICAgIHZvaWQgb25TdXJmYWNlQ2hhbmdlZChWaWV3IHZpZXcsIGludCB3aWR0aCwgaW50IGhlaWdodCk7Ci0gICAgICAgIHZvaWQgb25TdXJmYWNlVGFrZU92ZXJEb25lKFZpZGVvVmlld0ludGVyZmFjZSB2aWV3KTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWV3R3JvdXBJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWV3R3JvdXBJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMDY4MjYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlld0dyb3VwSW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVmlld0dyb3VwUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTW90aW9uRXZlbnQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIFZpZXdHcm91cEltcGwgaW1wbGVtZW50cyBWaWV3R3JvdXBQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3R3JvdXBQcm92aWRlciBtU3VwZXJQcm92aWRlcjsKLQotICAgIHB1YmxpYyBWaWV3R3JvdXBJbXBsKFZpZXdHcm91cCBpbnN0YW5jZSwKLSAgICAgICAgICAgIFZpZXdHcm91cFByb3ZpZGVyIHN1cGVyUHJvdmlkZXIsIFZpZXdHcm91cFByb3ZpZGVyIHByaXZhdGVQcm92aWRlcikgewotICAgICAgICBtU3VwZXJQcm92aWRlciA9IHN1cGVyUHJvdmlkZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93X2ltcGwoKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLm9uQXR0YWNoZWRUb1dpbmRvd19pbXBsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3dfaW1wbCgpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIub25EZXRhY2hlZEZyb21XaW5kb3dfaW1wbCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0QWNjZXNzaWJpbGl0eUNsYXNzTmFtZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZ2V0QWNjZXNzaWJpbGl0eUNsYXNzTmFtZV9pbXBsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gb25Ub3VjaEV2ZW50X2ltcGwoTW90aW9uRXZlbnQgZXYpIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLm9uVG91Y2hFdmVudF9pbXBsKGV2KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRyYWNrYmFsbEV2ZW50X2ltcGwoTW90aW9uRXZlbnQgZXYpIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLm9uVHJhY2tiYWxsRXZlbnRfaW1wbChldik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25GaW5pc2hJbmZsYXRlX2ltcGwoKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLm9uRmluaXNoSW5mbGF0ZV9pbXBsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0RW5hYmxlZF9pbXBsKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICBtU3VwZXJQcm92aWRlci5zZXRFbmFibGVkX2ltcGwoZW5hYmxlZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25WaXNpYmlsaXR5QWdncmVnYXRlZF9pbXBsKGJvb2xlYW4gaXNWaXNpYmxlKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLm9uVmlzaWJpbGl0eUFnZ3JlZ2F0ZWRfaW1wbChpc1Zpc2libGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uTGF5b3V0X2ltcGwoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLm9uTGF5b3V0X2ltcGwoY2hhbmdlZCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbk1lYXN1cmVfaW1wbChpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLm9uTWVhc3VyZV9pbXBsKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFN1Z2dlc3RlZE1pbmltdW1XaWR0aF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZ2V0U3VnZ2VzdGVkTWluaW11bVdpZHRoX2ltcGwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFN1Z2dlc3RlZE1pbmltdW1IZWlnaHRfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLmdldFN1Z2dlc3RlZE1pbmltdW1IZWlnaHRfaW1wbCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1lYXN1cmVkRGltZW5zaW9uX2ltcGwoaW50IG1lYXN1cmVkV2lkdGgsIGludCBtZWFzdXJlZEhlaWdodCkgewotICAgICAgICBtU3VwZXJQcm92aWRlci5zZXRNZWFzdXJlZERpbWVuc2lvbl9pbXBsKG1lYXN1cmVkV2lkdGgsIG1lYXN1cmVkSGVpZ2h0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBkaXNwYXRjaFRvdWNoRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZGlzcGF0Y2hUb3VjaEV2ZW50X2ltcGwoZXYpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNoZWNrTGF5b3V0UGFyYW1zX2ltcGwoVmlld0dyb3VwLkxheW91dFBhcmFtcyBwKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5jaGVja0xheW91dFBhcmFtc19pbXBsKHApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGdlbmVyYXRlRGVmYXVsdExheW91dFBhcmFtc19pbXBsKCkgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zX2ltcGwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVmlld0dyb3VwLkxheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtc19pbXBsKEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZ2VuZXJhdGVMYXlvdXRQYXJhbXNfaW1wbChhdHRycyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgZ2VuZXJhdGVMYXlvdXRQYXJhbXNfaW1wbChWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGxwKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5nZW5lcmF0ZUxheW91dFBhcmFtc19pbXBsKGxwKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGREZWxheUNoaWxkUHJlc3NlZFN0YXRlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5zaG91bGREZWxheUNoaWxkUHJlc3NlZFN0YXRlX2ltcGwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBtZWFzdXJlQ2hpbGRXaXRoTWFyZ2luc19pbXBsKFZpZXcgY2hpbGQsCi0gICAgICAgIGludCBwYXJlbnRXaWR0aE1lYXN1cmVTcGVjLCBpbnQgd2lkdGhVc2VkLCBpbnQgcGFyZW50SGVpZ2h0TWVhc3VyZVNwZWMsIGludCBoZWlnaHRVc2VkKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLm1lYXN1cmVDaGlsZFdpdGhNYXJnaW5zX2ltcGwoY2hpbGQsCi0gICAgICAgICAgICAgICAgcGFyZW50V2lkdGhNZWFzdXJlU3BlYywgd2lkdGhVc2VkLCBwYXJlbnRIZWlnaHRNZWFzdXJlU3BlYywgaGVpZ2h0VXNlZCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Rlc3RzL0FuZHJvaWQubWsgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRkZmQyYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLQotTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIDo9IFwKLSAgICBhbmRyb2lkLnRlc3QucnVubmVyLnN0dWJzIFwKLSAgICBhbmRyb2lkLnRlc3QuYmFzZS5zdHVicyBcCi0gICAgbW9ja2l0by10YXJnZXQtbWludXMtanVuaXQ0IFwKLSAgICBqdW5pdAotCi1MT0NBTF9TUkNfRklMRVMgOj0gJChjYWxsIGFsbC1qYXZhLWZpbGVzLXVuZGVyLCBzcmMpCi0KLUxPQ0FMX1BBQ0tBR0VfTkFNRSA6PSBNZWRpYUNvbXBvbmVudHNUZXN0Ci0KLUxPQ0FMX0lOU1RSVU1FTlRBVElPTl9GT1IgOj0gTWVkaWFDb21wb25lbnRzCi0KLUxPQ0FMX1BSSVZBVEVfUExBVEZPUk1fQVBJUyA6PSB0cnVlCi0KLUxPQ0FMX0NFUlRJRklDQVRFIDo9IHBsYXRmb3JtCi0KLWluY2x1ZGUgJChCVUlMRF9QQUNLQUdFKQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzI1NTI2NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgICAgcGFja2FnZT0iY29tLmFuZHJvaWQubWVkaWEudGVzdHMiPgotCi0gICAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6bGFiZWw9Ik1lZGlhIEFQSSBUZXN0Ij4KLSAgICAgICAgPHVzZXMtbGlicmFyeSBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5ydW5uZXIiIC8+Ci0gICAgPC9hcHBsaWNhdGlvbj4KLQotICAgIDwhLS0KLSAgICBUbyBydW4gdGhlIHRlc3RzIHVzZSB0aGUgY29tbWFuZDoKLSAgICAiYWRiIHNoZWxsIGFtIGluc3RydW1lbnQgLXcgY29tLmFuZHJvaWQubWVkaWEudGVzdHMvYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiCi0gICAgLS0+Ci0gICAgPGluc3RydW1lbnRhdGlvbgotICAgICAgICBhbmRyb2lkOm5hbWU9ImFuZHJvaWQudGVzdC5JbnN0cnVtZW50YXRpb25UZXN0UnVubmVyIgotICAgICAgICBhbmRyb2lkOnRhcmdldFBhY2thZ2U9ImNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZSIKLSAgICAgICAgYW5kcm9pZDpsYWJlbD0iTWVkaWEgQVBJIHRlc3QiIC8+Ci0KLTwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25QbGF5bGlzdEFnZW50VGVzdC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Rlc3RzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9TZXNzaW9uUGxheWxpc3RBZ2VudFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmViMDg0OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25QbGF5bGlzdEFnZW50VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLm1vY2tpdG8uTW9ja2l0by4qOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXM7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5EYXRhU291cmNlRGVzYzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZS5QbGF5ZXJFdmVudENhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuT25EYXRhU291cmNlTWlzc2luZ0hlbHBlcjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlclRocmVhZDsKLWltcG9ydCBhbmRyb2lkLnRlc3QuQW5kcm9pZFRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmp1bml0LkFmdGVyOwotaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmU7Ci1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLm1vY2tpdG8uTWF0Y2hlcnM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5jb25jdXJyZW50LkV4ZWN1dG9yOwotCi0vKioKLSAqIFRlc3RzIHtAbGluayBTZXNzaW9uUGxheWxpc3RBZ2VudH0uCi0gKi8KLXB1YmxpYyBjbGFzcyBTZXNzaW9uUGxheWxpc3RBZ2VudFRlc3QgZXh0ZW5kcyBBbmRyb2lkVGVzdENhc2UgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiU2Vzc2lvblBsYXlsaXN0QWdlbnRUZXN0IjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0FJVF9USU1FX01TID0gMTAwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9SRVBFQVRfTU9ERSA9IC0xMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfU0hVRkZMRV9NT0RFID0gLTEwMDsKLQotICAgIHByaXZhdGUgSGFuZGxlciBtSGFuZGxlcjsKLSAgICBwcml2YXRlIEV4ZWN1dG9yIG1IYW5kbGVyRXhlY3V0b3I7Ci0KLSAgICBwcml2YXRlIE9iamVjdCBtV2FpdExvY2sgPSBuZXcgT2JqZWN0KCk7Ci0gICAgcHJpdmF0ZSBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uMkltcGwgbVNlc3Npb25JbXBsOwotICAgIHByaXZhdGUgTWVkaWFQbGF5ZXJCYXNlIG1QbGF5ZXI7Ci0gICAgcHJpdmF0ZSBQbGF5ZXJFdmVudENhbGxiYWNrIG1QbGF5ZXJFdmVudENhbGxiYWNrOwotICAgIHByaXZhdGUgU2Vzc2lvblBsYXlsaXN0QWdlbnQgbUFnZW50OwotICAgIHByaXZhdGUgT25EYXRhU291cmNlTWlzc2luZ0hlbHBlciBtRGF0YVNvdXJjZUhlbHBlcjsKLSAgICBwcml2YXRlIE15UGxheWxpc3RFdmVudENhbGxiYWNrIG1FdmVudENhbGxiYWNrOwotCi0gICAgcHVibGljIGNsYXNzIE15UGxheWxpc3RFdmVudENhbGxiYWNrIGV4dGVuZHMgTWVkaWFQbGF5bGlzdEFnZW50LlBsYXlsaXN0RXZlbnRDYWxsYmFjayB7Ci0gICAgICAgIGJvb2xlYW4gb25QbGF5bGlzdENoYW5nZWRDYWxsZWQ7Ci0gICAgICAgIGJvb2xlYW4gb25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZENhbGxlZDsKLSAgICAgICAgYm9vbGVhbiBvblJlcGVhdE1vZGVDaGFuZ2VkQ2FsbGVkOwotICAgICAgICBib29sZWFuIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkQ2FsbGVkOwotCi0gICAgICAgIHByaXZhdGUgT2JqZWN0IG1XYWl0TG9jazsKLQotICAgICAgICBwdWJsaWMgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2soT2JqZWN0IHdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBtV2FpdExvY2sgPSB3YWl0TG9jazsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgICAgICAgb25QbGF5bGlzdENoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkQ2FsbGVkID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXlsaXN0Q2hhbmdlZChNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwgTGlzdDxNZWRpYUl0ZW0yPiBsaXN0LAotICAgICAgICAgICAgICAgIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgICAgIG9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBtV2FpdExvY2subm90aWZ5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgICAgIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgICAgIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWRDYWxsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1XYWl0TG9jay5ub3RpZnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUmVwZWF0TW9kZUNoYW5nZWQoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsIGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgICAgIG9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1XYWl0TG9jay5ub3RpZnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICAgICAgb25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1XYWl0TG9jay5ub3RpZnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBjbGFzcyBNeURhdGFTb3VyY2VIZWxwZXIgaW1wbGVtZW50cyBPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBEYXRhU291cmNlRGVzYyBvbkRhdGFTb3VyY2VNaXNzaW5nKE1lZGlhU2Vzc2lvbjIgc2Vzc2lvbiwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgICAgICBpZiAoaXRlbS5nZXRNZWRpYUlkKCkuY29udGFpbnMoIldJVEhPVVRfRFNEIikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgRGF0YVNvdXJjZURlc2MuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgIC5zZXREYXRhU291cmNlKGdldENvbnRleHQoKSwgVXJpLnBhcnNlKCJkc2Q6Ly90ZXN0IikpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRNZWRpYUlkKGl0ZW0uZ2V0TWVkaWFJZCgpKQotICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBjbGFzcyBNb2NrUGxheWVyIGV4dGVuZHMgTWVkaWFQbGF5ZXJCYXNlIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHBsYXkoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcHJlcGFyZSgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBwYXVzZSgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCByZXNldCgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0KCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlZWtUbyhsb25nIHBvcykgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UGxheWVyU3RhdGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldEJ1ZmZlcmluZ1N0YXRlKCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0QXVkaW9BdHRyaWJ1dGVzKEF1ZGlvQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEF1ZGlvQXR0cmlidXRlcyBnZXRBdWRpb0F0dHJpYnV0ZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXREYXRhU291cmNlKERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE5leHREYXRhU291cmNlKERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldE5leHREYXRhU291cmNlcyhMaXN0PERhdGFTb3VyY2VEZXNjPiBkc2RzKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIERhdGFTb3VyY2VEZXNjIGdldEN1cnJlbnREYXRhU291cmNlKCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgbG9vcEN1cnJlbnQoYm9vbGVhbiBsb29wKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0UGxheWJhY2tTcGVlZChmbG9hdCBzcGVlZCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFBsYXllclZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgZmxvYXQgZ2V0UGxheWVyVm9sdW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKEV4ZWN1dG9yIGUsIFBsYXllckV2ZW50Q2FsbGJhY2sgY2IpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB1bnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhQbGF5ZXJFdmVudENhbGxiYWNrIGNiKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBCZWZvcmUKLSAgICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBtQ29udGV4dCA9IGdldENvbnRleHQoKTsKLSAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgZGV4bWFrZXIgYnVnOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2RleG1ha2VyL2lzc3Vlcy9kZXRhaWw/aWQ9MgotICAgICAgICAvLyBEZXhtYWtlciBpcyB1c2VkIGJ5IG1vY2tpdG8uCi0gICAgICAgIFN5c3RlbS5zZXRQcm9wZXJ0eSgiZGV4bWFrZXIuZGV4Y2FjaGUiLCBtQ29udGV4dC5nZXRDYWNoZURpcigpLmdldFBhdGgoKSk7Ci0KLSAgICAgICAgSGFuZGxlclRocmVhZCBoYW5kbGVyVGhyZWFkID0gbmV3IEhhbmRsZXJUaHJlYWQoIlNlc3Npb25QbGF5bGlzdEFnZW50Iik7Ci0gICAgICAgIGhhbmRsZXJUaHJlYWQuc3RhcnQoKTsKLSAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcihoYW5kbGVyVGhyZWFkLmdldExvb3BlcigpKTsKLSAgICAgICAgbUhhbmRsZXJFeGVjdXRvciA9IChydW5uYWJsZSkgLT4gewotICAgICAgICAgICAgbUhhbmRsZXIucG9zdChydW5uYWJsZSk7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgbVBsYXllciA9IG1vY2soTW9ja1BsYXllci5jbGFzcyk7Ci0gICAgICAgIGRvQW5zd2VyKGludm9jYXRpb24gLT4gewotICAgICAgICAgICAgT2JqZWN0W10gYXJncyA9IGludm9jYXRpb24uZ2V0QXJndW1lbnRzKCk7Ci0gICAgICAgICAgICBtUGxheWVyRXZlbnRDYWxsYmFjayA9IChQbGF5ZXJFdmVudENhbGxiYWNrKSBhcmdzWzFdOwotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0pLndoZW4obVBsYXllcikucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKE1hdGNoZXJzLmFueSgpLCBNYXRjaGVycy5hbnkoKSk7Ci0KLSAgICAgICAgbVNlc3Npb25JbXBsID0gbW9jayhNZWRpYVNlc3Npb24ySW1wbC5jbGFzcyk7Ci0gICAgICAgIG1EYXRhU291cmNlSGVscGVyID0gbmV3IE15RGF0YVNvdXJjZUhlbHBlcigpOwotICAgICAgICBtQWdlbnQgPSBuZXcgU2Vzc2lvblBsYXlsaXN0QWdlbnQobVNlc3Npb25JbXBsLCBtUGxheWVyKTsKLSAgICAgICAgbUFnZW50LnNldE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIobURhdGFTb3VyY2VIZWxwZXIpOwotICAgICAgICBtRXZlbnRDYWxsYmFjayA9IG5ldyBNeVBsYXlsaXN0RXZlbnRDYWxsYmFjayhtV2FpdExvY2spOwotICAgICAgICBtQWdlbnQucmVnaXN0ZXJQbGF5bGlzdEV2ZW50Q2FsbGJhY2sobUhhbmRsZXJFeGVjdXRvciwgbUV2ZW50Q2FsbGJhY2spOwotICAgIH0KLQotICAgIEBBZnRlcgotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1IYW5kbGVyLmdldExvb3BlcigpLnF1aXRTYWZlbHkoKTsKLSAgICAgICAgbUhhbmRsZXIgPSBudWxsOwotICAgICAgICBtSGFuZGxlckV4ZWN1dG9yID0gbnVsbDsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRBbmRHZXRTaHVmbGxlTW9kZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgc2h1ZmZsZU1vZGUgPSBtQWdlbnQuZ2V0U2h1ZmZsZU1vZGUoKTsKLSAgICAgICAgaWYgKHNodWZmbGVNb2RlICE9IE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfTk9ORSkgewotICAgICAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICAgICAgbUFnZW50LnNldFNodWZmbGVNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfTk9ORSk7Ci0gICAgICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uU2h1ZmZsZU1vZGVDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX05PTkUsIG1BZ2VudC5nZXRTaHVmZmxlTW9kZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2V0U2h1ZmZsZU1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9BTEwpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0FMTCwgbUFnZW50LmdldFNodWZmbGVNb2RlKCkpOwotCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2V0U2h1ZmZsZU1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9HUk9VUCk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfR1JPVVAsIG1BZ2VudC5nZXRTaHVmZmxlTW9kZSgpKTsKLQotICAgICAgICAvLyBJTlZBTElEX1NIVUZGTEVfTU9ERSB3aWxsIG5vdCBjaGFuZ2UgdGhlIHNodWZmbGUgbW9kZS4KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRTaHVmZmxlTW9kZShJTlZBTElEX1NIVUZGTEVfTU9ERSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2UobUV2ZW50Q2FsbGJhY2sub25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0dST1VQLCBtQWdlbnQuZ2V0U2h1ZmZsZU1vZGUoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0QW5kR2V0UmVwZWF0TW9kZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgcmVwZWF0TW9kZSA9IG1BZ2VudC5nZXRSZXBlYXRNb2RlKCk7Ci0gICAgICAgIGlmIChyZXBlYXRNb2RlICE9IE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FKSB7Ci0gICAgICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfTk9ORSk7Ci0gICAgICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FLCBtQWdlbnQuZ2V0UmVwZWF0TW9kZSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfT05FKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfT05FLCBtQWdlbnQuZ2V0UmVwZWF0TW9kZSgpKTsKLQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0FMTCk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblJlcGVhdE1vZGVDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0FMTCwgbUFnZW50LmdldFJlcGVhdE1vZGUoKSk7Ci0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9HUk9VUCk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblJlcGVhdE1vZGVDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0dST1VQLCBtQWdlbnQuZ2V0UmVwZWF0TW9kZSgpKTsKLQotICAgICAgICAvLyBJTlZBTElEX1NIVUZGTEVfTU9ERSB3aWxsIG5vdCBjaGFuZ2UgdGhlIHNodWZmbGUgbW9kZS4KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKElOVkFMSURfUkVQRUFUX01PREUpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydEZhbHNlKG1FdmVudENhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfR1JPVVAsIG1BZ2VudC5nZXRSZXBlYXRNb2RlKCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNldFBsYXlsaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBsaXN0U2l6ZSA9IDEwOwotICAgICAgICBjcmVhdGVBbmRTZXRQbGF5bGlzdCgxMCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0U2l6ZSwgbUFnZW50LmdldFBsYXlsaXN0KCkuc2l6ZSgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNraXBJdGVtcygpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgbGlzdFNpemUgPSA1OwotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0ID0gY3JlYXRlQW5kU2V0UGxheWxpc3QobGlzdFNpemUpOwotCi0gICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FKTsKLSAgICAgICAgLy8gVGVzdCBza2lwVG9QbGF5bGlzdEl0ZW0KLSAgICAgICAgZm9yIChpbnQgaSA9IGxpc3RTaXplIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICAgICAgICAgIG1BZ2VudC5za2lwVG9QbGF5bGlzdEl0ZW0ocGxheWxpc3QuZ2V0KGkpKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhpLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRlc3Qgc2tpcFRvTmV4dEl0ZW0KLSAgICAgICAgLy8gY3VyUGxheVBvcyA9IDAKLSAgICAgICAgZm9yIChpbnQgY3VyUGxheVBvcyA9IDA7IGN1clBsYXlQb3MgPCBsaXN0U2l6ZSAtIDE7ICsrY3VyUGxheVBvcykgewotICAgICAgICAgICAgbUFnZW50LnNraXBUb05leHRJdGVtKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY3VyUGxheVBvcyArIDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgICAgICB9Ci0gICAgICAgIG1BZ2VudC5za2lwVG9OZXh0SXRlbSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMobGlzdFNpemUgLSAxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBUZXN0IHNraXBUb1ByZXZpb3VzCi0gICAgICAgIC8vIGN1clBsYXlQb3MgPSBsaXN0U2l6ZSAtIDEKLSAgICAgICAgZm9yIChpbnQgY3VyUGxheVBvcyA9IGxpc3RTaXplIC0gMTsgY3VyUGxheVBvcyA+IDA7IC0tY3VyUGxheVBvcykgewotICAgICAgICAgICAgbUFnZW50LnNraXBUb1ByZXZpb3VzSXRlbSgpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGN1clBsYXlQb3MgLSAxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICAgICAgfQotICAgICAgICBtQWdlbnQuc2tpcFRvUHJldmlvdXNJdGVtKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfQUxMKTsKLSAgICAgICAgLy8gVGVzdCBza2lwVG9QcmV2aW91cyB3aXRoIHJlcGVhdCBtb2RlIGFsbAotICAgICAgICAvLyBjdXJQbGF5UG9zID0gMAotICAgICAgICBtQWdlbnQuc2tpcFRvUHJldmlvdXNJdGVtKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0U2l6ZSAtIDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFRlc3Qgc2tpcFRvTmV4dCB3aXRoIHJlcGVhdCBtb2RlIGFsbAotICAgICAgICAvLyBjdXJQbGF5UG9zID0gbGlzdFNpemUgLSAxCi0gICAgICAgIG1BZ2VudC5za2lwVG9OZXh0SXRlbSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgbUFnZW50LnNraXBUb1ByZXZpb3VzSXRlbSgpOwotICAgICAgICAvLyBjdXJQbGF5UG9zID0gbGlzdFNpemUgLSAxLCBuZXh0UGxheVBvcyA9IDAKLSAgICAgICAgLy8gVGVzdCBuZXh0IHBsYXkgcG9zIGFmdGVyIHNldHRpbmcgcmVwZWF0IG1vZGUgbm9uZS4KLSAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkUpOwotICAgICAgICBhc3NlcnRFcXVhbHMobGlzdFNpemUgLSAxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RFZGl0UGxheWxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGxpc3RTaXplID0gNTsKLSAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBwbGF5bGlzdCA9IGNyZWF0ZUFuZFNldFBsYXlsaXN0KGxpc3RTaXplKTsKLQotICAgICAgICAvLyBUZXN0IGFkZCBpdGVtOiBbMCAoY3VyKSwgMSwgMiwgMywgNF0gLT4gWzAgKGN1ciksIDEsIDUsIDIsIDMsIDRdCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIE1lZGlhSXRlbTIgaXRlbV81ID0gZ2VuZXJhdGVNZWRpYUl0ZW0oNSk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5hZGQoMiwgaXRlbV81KTsKLSAgICAgICAgICAgIG1BZ2VudC5hZGRQbGF5bGlzdEl0ZW0oMiwgaXRlbV81KTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIC8vIE1vdmUgY3VycmVudDogWzAgKGN1ciksIDEsIDUsIDIsIDMsIDRdIC0+IFswLCAxLCA1IChjdXIpLCAyLCAzLCA0XQotICAgICAgICBtQWdlbnQuc2tpcFRvUGxheWxpc3RJdGVtKGl0ZW1fNSk7Ci0gICAgICAgIC8vIFJlbW92ZSBjdXJyZW50IGl0ZW06IFswLCAxLCA1IChjdXIpLCAyLCAzLCA0XSAtPiBbMCwgMSwgMiAoY3VyKSwgMywgNF0KLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShpdGVtXzUpOwotICAgICAgICAgICAgbUFnZW50LnJlbW92ZVBsYXlsaXN0SXRlbShpdGVtXzUpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBSZW1vdmUgcHJldmlvdXMgaXRlbTogWzAsIDEsIDIgKGN1ciksIDMsIDRdIC0+IFswLCAyIChjdXIpLCAzLCA0XQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBNZWRpYUl0ZW0yIHByZXZpb3VzSXRlbSA9IHBsYXlsaXN0LmdldCgxKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShwcmV2aW91c0l0ZW0pOwotICAgICAgICAgICAgbUFnZW50LnJlbW92ZVBsYXlsaXN0SXRlbShwcmV2aW91c0l0ZW0pOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBSZW1vdmUgbmV4dCBpdGVtOiBbMCwgMiAoY3VyKSwgMywgNF0gLT4gWzAsIDIgKGN1ciksIDRdCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIE1lZGlhSXRlbTIgbmV4dEl0ZW0gPSBwbGF5bGlzdC5nZXQoMik7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5yZW1vdmUobmV4dEl0ZW0pOwotICAgICAgICAgICAgbUFnZW50LnJlbW92ZVBsYXlsaXN0SXRlbShuZXh0SXRlbSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFJlcGxhY2UgaXRlbTogWzAsIDIgKGN1ciksIDRdIC0+IFswLCAyIChjdXIpLCA1XQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3Quc2V0KDIsIGl0ZW1fNSk7Ci0gICAgICAgICAgICBtQWdlbnQucmVwbGFjZVBsYXlsaXN0SXRlbSgyLCBpdGVtXzUpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBNb3ZlIGxhc3QgYW5kIHJlbW92ZSB0aGUgbGFzdCBpdGVtOiBbMCwgMiAoY3VyKSwgNV0gLT4gWzAsIDIsIDUgKGN1cildIC0+IFswLCAyIChjdXIpXQotICAgICAgICBNZWRpYUl0ZW0yIGxhc3RJdGVtID0gcGxheWxpc3QuZ2V0KDEpOwotICAgICAgICBtQWdlbnQuc2tpcFRvUGxheWxpc3RJdGVtKGxhc3RJdGVtKTsKLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShsYXN0SXRlbSk7Ci0gICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKGxhc3RJdGVtKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gUmVtb3ZlIGFsbCBpdGVtcwotICAgICAgICBmb3IgKGludCBpID0gcGxheWxpc3Quc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IHBsYXlsaXN0LmdldChpKTsKLSAgICAgICAgICAgIG1BZ2VudC5za2lwVG9QbGF5bGlzdEl0ZW0oaXRlbSk7Ci0gICAgICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgICAgICBwbGF5bGlzdC5yZW1vdmUoaXRlbSk7Ci0gICAgICAgICAgICAgICAgbUFnZW50LnJlbW92ZVBsYXlsaXN0SXRlbShpdGVtKTsKLSAgICAgICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoU2Vzc2lvblBsYXlsaXN0QWdlbnQuTk9fVkFMSURfSVRFTVMsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgIH0KLQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0UGxheWxpc3RXaXRoSW52YWxpZEl0ZW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGxpc3RTaXplID0gMjsKLSAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBwbGF5bGlzdCA9IGNyZWF0ZUFuZFNldFBsYXlsaXN0KGxpc3RTaXplKTsKLQotICAgICAgICAvLyBBZGQgaXRlbTogWzAgKGN1ciksIDFdIC0+IFswIChjdXIpLCAzIChub19kc2QpLCAxXQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBNZWRpYUl0ZW0yIGludmFsaWRJdGVtMiA9IGdlbmVyYXRlTWVkaWFJdGVtV2l0aG91dERhdGFTb3VyY2VEZXNjKDIpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3QuYWRkKDEsIGludmFsaWRJdGVtMik7Ci0gICAgICAgICAgICBtQWdlbnQuYWRkUGxheWxpc3RJdGVtKDEsIGludmFsaWRJdGVtMik7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFRlc3Qgc2tpcCB0byBuZXh0IGl0ZW06ICBbMCAoY3VyKSwgMiAobm9fZHNkKSwgMV0gLT4gWzAsIDIgKG5vX2RzZCksIDEgKGN1cildCi0gICAgICAgIG1BZ2VudC5za2lwVG9OZXh0SXRlbSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gVGVzdCBza2lwIHRvIHByZXZpb3VzIGl0ZW06IFswLCAyIChub19kc2QpLCAxIChjdXIpXSAtPiBbMCAoY3VyKSwgMiAobm9fZHNkKSwgMV0KLSAgICAgICAgbUFnZW50LnNraXBUb1ByZXZpb3VzSXRlbSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gUmVtb3ZlIGN1cnJlbnQgaXRlbTogWzAgKGN1ciksIDIgKG5vX2RzZCksIDFdIC0+IFsyIChub19kc2QpLCAxIChjdXIpXQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBwbGF5bGlzdC5nZXQoMCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5yZW1vdmUoaXRlbSk7Ci0gICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKGl0ZW0pOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBSZW1vdmUgY3VycmVudCBpdGVtOiBbMiAobm9fZHNkKSwgMSAoY3VyKV0gLT4gWzIgKG5vX2RzZCldCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIGl0ZW0gPSBwbGF5bGlzdC5nZXQoMSk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5yZW1vdmUoaXRlbSk7Ci0gICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKGl0ZW0pOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXNzaW9uUGxheWxpc3RBZ2VudC5OT19WQUxJRF9JVEVNUywgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gQWRkIGludmFsaWQgaXRlbTogWzIgKG5vX2RzZCldIC0+IFswIChub19kc2QpLCAyIChub19kc2QpXQotICAgICAgICBNZWRpYUl0ZW0yIGludmFsaWRJdGVtMCA9IGdlbmVyYXRlTWVkaWFJdGVtV2l0aG91dERhdGFTb3VyY2VEZXNjKDApOwotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3QuYWRkKDAsIGludmFsaWRJdGVtMCk7Ci0gICAgICAgICAgICBtQWdlbnQuYWRkUGxheWxpc3RJdGVtKDAsIGludmFsaWRJdGVtMCk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlc3Npb25QbGF5bGlzdEFnZW50Lk5PX1ZBTElEX0lURU1TLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBBZGQgdmFsaWQgaXRlbTogWzAgKG5vX2RzZCksIDIgKG5vX2RzZCldIC0+IFswIChub19kc2QpLCAxLCAyIChub19kc2QpXQotICAgICAgICBNZWRpYUl0ZW0yIGludmFsaWRJdGVtMSA9IGdlbmVyYXRlTWVkaWFJdGVtKDEpOwotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3QuYWRkKDEsIGludmFsaWRJdGVtMSk7Ci0gICAgICAgICAgICBtQWdlbnQuYWRkUGxheWxpc3RJdGVtKDEsIGludmFsaWRJdGVtMSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFJlcGxhY2UgdGhlIHZhbGlkIGl0ZW0gd2l0aCBhbiBpbnZhbGlkIGl0ZW06Ci0gICAgICAgIC8vIFswIChub19kc2QpLCAxIChjdXIpLCAyIChub19kc2QpXSAtPiBbMCAobm9fZHNkKSwgMyAobm9fZHNkKSwgMiAobm9fZHNkKV0KLSAgICAgICAgTWVkaWFJdGVtMiBpbnZhbGlkSXRlbTMgPSBnZW5lcmF0ZU1lZGlhSXRlbVdpdGhvdXREYXRhU291cmNlRGVzYygzKTsKLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnNldCgxLCBpbnZhbGlkSXRlbTMpOwotICAgICAgICAgICAgbUFnZW50LnJlcGxhY2VQbGF5bGlzdEl0ZW0oMSwgaW52YWxpZEl0ZW0zKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2Vzc2lvblBsYXlsaXN0QWdlbnQuRU5EX09GX1BMQVlMSVNULCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQbGF5bGlzdEFmdGVyT25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGxpc3RTaXplID0gMjsKLSAgICAgICAgdmVyaWZ5KG1QbGF5ZXIpLnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhNYXRjaGVycy5hbnkoKSwgTWF0Y2hlcnMuYW55KCkpOwotCi0gICAgICAgIGNyZWF0ZUFuZFNldFBsYXlsaXN0KGxpc3RTaXplKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIG1QbGF5ZXJFdmVudENhbGxiYWNrLm9uQ3VycmVudERhdGFTb3VyY2VDaGFuZ2VkKG1QbGF5ZXIsIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgICAgIG1QbGF5ZXJFdmVudENhbGxiYWNrLm9uQ3VycmVudERhdGFTb3VyY2VDaGFuZ2VkKG1QbGF5ZXIsIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2Vzc2lvblBsYXlsaXN0QWdlbnQuRU5EX09GX1BMQVlMSVNULCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICBtQWdlbnQuc2tpcFRvTmV4dEl0ZW0oKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlc3Npb25QbGF5bGlzdEFnZW50LkVORF9PRl9QTEFZTElTVCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX09ORSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXNzaW9uUGxheWxpc3RBZ2VudC5FTkRfT0ZfUExBWUxJU1QsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9BTEwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgICAgIG1QbGF5ZXJFdmVudENhbGxiYWNrLm9uQ3VycmVudERhdGFTb3VyY2VDaGFuZ2VkKG1QbGF5ZXIsIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgICAgIG1QbGF5ZXJFdmVudENhbGxiYWNrLm9uQ3VycmVudERhdGFTb3VyY2VDaGFuZ2VkKG1QbGF5ZXIsIG51bGwpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PE1lZGlhSXRlbTI+IGNyZWF0ZUFuZFNldFBsYXlsaXN0KGludCBsaXN0U2l6ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gaXRlbXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0U2l6ZTsgKytpKSB7Ci0gICAgICAgICAgICBpdGVtcy5hZGQoZ2VuZXJhdGVNZWRpYUl0ZW0oaSkpOwotICAgICAgICB9Ci0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2V0UGxheWxpc3QoaXRlbXMsIG51bGwpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpdGVtczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXNzZXJ0UGxheWxpc3RFcXVhbHMoTGlzdDxNZWRpYUl0ZW0yPiBleHBlY3RlZCwgTGlzdDxNZWRpYUl0ZW0yPiBhY3R1YWwpIHsKLSAgICAgICAgaWYgKGV4cGVjdGVkID09IGFjdHVhbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFRydWUoZXhwZWN0ZWQgIT0gbnVsbCAmJiBhY3R1YWwgIT0gbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5zaXplKCksIGFjdHVhbC5zaXplKCkpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKGV4cGVjdGVkLmdldChpKS5lcXVhbHMoYWN0dWFsLmdldChpKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZWRpYUl0ZW0yIGdlbmVyYXRlTWVkaWFJdGVtV2l0aG91dERhdGFTb3VyY2VEZXNjKGludCBrZXkpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUl0ZW0yLkJ1aWxkZXIoMCkKLSAgICAgICAgICAgICAgICAuc2V0TWVkaWFJZCgiVEVTVF9NRURJQV9JRF9XSVRIT1VUX0RTRF8iICsga2V5KQotICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFJdGVtMiBnZW5lcmF0ZU1lZGlhSXRlbShpbnQga2V5KSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFJdGVtMi5CdWlsZGVyKDApCi0gICAgICAgICAgICAgICAgLnNldE1lZGlhSWQoIlRFU1RfTUVESUFfSURfIiArIGtleSkKLSAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9PV05FUlMgYi9wYWNrYWdlcy9PV05FUlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiYzRjZWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvT1dORVJTCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1ha2Vyc3RlbkBnb29nbGUuY29tCi1kd2thbmdAZ29vZ2xlLmNvbQotamFld2FuQGdvb2dsZS5jb20KLW1hcmNvbmVAZ29vZ2xlLmNvbQotc3VuZ3Nvb0Bnb29nbGUuY29tCi13amlhQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL09XTkVSUyBiL3NlcnZpY2VzL09XTkVSUwppbmRleCBkNWQwMGRhLi42NmE0YmNiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9PV05FUlMKKysrIGIvc2VydmljZXMvT1dORVJTCkBAIC0xLDQgKzEsNyBAQAorY2h6QGdvb2dsZS5jb20KIGVsYXVyZW50QGdvb2dsZS5jb20KK2Vzc2lja0Bnb29nbGUuY29tCiBldGFsdmFsYUBnb29nbGUuY29tCiBna2FzdGVuQGdvb2dsZS5jb20KIGh1bmdhQGdvb2dsZS5jb20KK21hcmNvbmVAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmFkNTRiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw3MyBAQAorCisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliYXVkaW9mbGluZ2VyIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkF1ZGlvRmxpbmdlci5jcHAiLAorICAgICAgICAiQXVkaW9Id0RldmljZS5jcHAiLAorICAgICAgICAiQXVkaW9TdHJlYW1PdXQuY3BwIiwKKyAgICAgICAgIkF1ZGlvV2F0Y2hkb2cuY3BwIiwKKyAgICAgICAgIkJ1ZkxvZy5jcHAiLAorICAgICAgICAiRWZmZWN0cy5jcHAiLAorICAgICAgICAiRmFzdENhcHR1cmUuY3BwIiwKKyAgICAgICAgIkZhc3RDYXB0dXJlRHVtcFN0YXRlLmNwcCIsCisgICAgICAgICJGYXN0Q2FwdHVyZVN0YXRlLmNwcCIsCisgICAgICAgICJGYXN0TWl4ZXIuY3BwIiwKKyAgICAgICAgIkZhc3RNaXhlckR1bXBTdGF0ZS5jcHAiLAorICAgICAgICAiRmFzdE1peGVyU3RhdGUuY3BwIiwKKyAgICAgICAgIkZhc3RUaHJlYWQuY3BwIiwKKyAgICAgICAgIkZhc3RUaHJlYWREdW1wU3RhdGUuY3BwIiwKKyAgICAgICAgIkZhc3RUaHJlYWRTdGF0ZS5jcHAiLAorICAgICAgICAiTkJBSU9fVGVlLmNwcCIsCisgICAgICAgICJQYXRjaFBhbmVsLmNwcCIsCisgICAgICAgICJTcGRpZlN0cmVhbU91dC5jcHAiLAorICAgICAgICAiU3RhdGVRdWV1ZS5jcHAiLAorICAgICAgICAiVGhyZWFkcy5jcHAiLAorICAgICAgICAiVHJhY2tzLmNwcCIsCisgICAgICAgICJUeXBlZExvZ2dlci5jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9tZWRpYWxvZyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2hhbCIsCisgICAgICAgICJsaWJhdWRpb3Byb2Nlc3NpbmciLAorICAgICAgICAibGliYXVkaW9zcGRpZiIsCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKKyAgICAgICAgImxpYm1lZGlhbG9nc2VydmljZSIsCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJuYmFpbyIsCisgICAgICAgICJsaWJuYmxvZyIsCisgICAgICAgICJsaWJwb3dlcm1hbmFnZXIiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJtZW11bnJlYWNoYWJsZSIsCisgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAorICAgICAgICAibGlidmlicmF0b3IiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliY3B1c3RhdHMiLAorICAgICAgICAibGlic25kZmlsZSIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURTVEFURV9RVUVVRV9JTlNUQU5USUFUSU9OUz1cIlN0YXRlUXVldWVJbnN0YW50aWF0aW9ucy5jcHBcIiIsCisgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgaW50ZWdlcl9vdmVyZmxvdzogdHJ1ZSwKKyAgICB9LAorCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDE5ZTY0Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotICAgIFNlcnZpY2VVdGlsaXRpZXMuY3BwCi0KLSMgRklYTUUgTW92ZSB0aGlzIGxpYnJhcnkgdG8gZnJhbWV3b3Jrcy9uYXRpdmUKLUxPQ0FMX01PRFVMRSA6PSBsaWJzZXJ2aWNldXRpbGl0eQotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJjdXRpbHMgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJsb2cgXAotICAgIGxpYmJpbmRlcgotCi1MT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSAgICAgICAgICAgICAgIFwKLSAgICBBdWRpb0ZsaW5nZXIuY3BwICAgICAgICAgICAgXAotICAgIFRocmVhZHMuY3BwICAgICAgICAgICAgICAgICBcCi0gICAgVHJhY2tzLmNwcCAgICAgICAgICAgICAgICAgIFwKLSAgICBBdWRpb0h3RGV2aWNlLmNwcCAgICAgICAgICAgXAotICAgIEF1ZGlvU3RyZWFtT3V0LmNwcCAgICAgICAgICBcCi0gICAgU3BkaWZTdHJlYW1PdXQuY3BwICAgICAgICAgIFwKLSAgICBFZmZlY3RzLmNwcCAgICAgICAgICAgICAgICAgXAotICAgIFBhdGNoUGFuZWwuY3BwICAgICAgICAgICAgICBcCi0gICAgU3RhdGVRdWV1ZS5jcHAgICAgICAgICAgICAgIFwKLSAgICBCdWZMb2cuY3BwICAgICAgICAgICAgICAgICAgXAotICAgIFR5cGVkTG9nZ2VyLmNwcAotCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5IFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL21lZGlhbG9nIFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmF1ZGlvaGFsIFwKLSAgICBsaWJhdWRpb3Byb2Nlc3NpbmcgXAotICAgIGxpYmF1ZGlvc3BkaWYgXAotICAgIGxpYmF1ZGlvdXRpbHMgXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYmxvZyBcCi0gICAgbGliYmluZGVyIFwKLSAgICBsaWJhdWRpb2NsaWVudCBcCi0gICAgbGlibWVkaWFsb2dzZXJ2aWNlIFwKLSAgICBsaWJtZWRpYXV0aWxzIFwKLSAgICBsaWJuYmFpbyBcCi0gICAgbGlibmJsb2cgXAotICAgIGxpYnBvd2VybWFuYWdlciBcCi0gICAgbGlic2VydmljZXV0aWxpdHkgXAotICAgIGxpYm1lZGlhdXRpbHMgXAotICAgIGxpYm1lbXVucmVhY2hhYmxlIFwKLSAgICBsaWJtZWRpYV9oZWxwZXIKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgbGliY3B1c3RhdHMgXAotCi1MT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQotCi1MT0NBTF9NT0RVTEU6PSBsaWJhdWRpb2ZsaW5nZXIKLQotTE9DQUxfU1JDX0ZJTEVTICs9IFwKLSAgICBBdWRpb1dhdGNoZG9nLmNwcCAgICAgICAgXAotICAgIEZhc3RDYXB0dXJlLmNwcCAgICAgICAgICBcCi0gICAgRmFzdENhcHR1cmVEdW1wU3RhdGUuY3BwIFwKLSAgICBGYXN0Q2FwdHVyZVN0YXRlLmNwcCAgICAgXAotICAgIEZhc3RNaXhlci5jcHAgICAgICAgICAgICBcCi0gICAgRmFzdE1peGVyRHVtcFN0YXRlLmNwcCAgIFwKLSAgICBGYXN0TWl4ZXJTdGF0ZS5jcHAgICAgICAgXAotICAgIEZhc3RUaHJlYWQuY3BwICAgICAgICAgICBcCi0gICAgRmFzdFRocmVhZER1bXBTdGF0ZS5jcHAgIFwKLSAgICBGYXN0VGhyZWFkU3RhdGUuY3BwCi0KLUxPQ0FMX0NGTEFHUyArPSAtRFNUQVRFX1FVRVVFX0lOU1RBTlRJQVRJT05TPSciU3RhdGVRdWV1ZUluc3RhbnRpYXRpb25zLmNwcCInCi0KLUxPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCi0KLUxPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAppbmRleCBjNzdkMDgyLi4wYjc0NWFjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcApAQCAtMjMsMTIgKzIzLDEzIEBACiAjaW5jbHVkZSA8ZGlyZW50Lmg+CiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC9vcy9JRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL211bHRpdXNlci5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgpAQCAtNDUsOSArNDYsMTAgQEAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8YXVkaW9tYW5hZ2VyL0F1ZGlvTWFuYWdlci5oPgogCiAjaW5jbHVkZSAiQXVkaW9GbGluZ2VyLmgiCi0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgorI2luY2x1ZGUgIk5CQUlPX1RlZS5oIgogCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KIApAQCAtNTYsNyArNTgsNiBAQAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2VmZmVjdF9hZWMuaD4KIAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KLSNpbmNsdWRlIDxhdWRpb191dGlscy9zdHJpbmcuaD4KIAogI2luY2x1ZGUgPHBvd2VybWFuYWdlci9Qb3dlck1hbmFnZXIuaD4KIApAQCAtNjQsOCArNjUsOCBAQAogI2luY2x1ZGUgPG1lZGlhL01lbW9yeUxlYWtUcmFja1V0aWwuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9QaXBlLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUGlwZVJlYWRlci5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CiAjaW5jbHVkZSA8bWVkaWF1dGlscy9CYXR0ZXJ5Tm90aWZpZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KIAogLy8jZGVmaW5lIEJVRkxPR19OREVCVUcgMApAQCAtMTAwLDE3ICsxMDEsNiBAQAogCiB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6Om1TY3JlZW5TdGF0ZTsKIAotCi0jaWZkZWYgVEVFX1NJTksKLWJvb2wgQXVkaW9GbGluZ2VyOjptVGVlU2lua0lucHV0RW5hYmxlZCA9IGZhbHNlOwotYm9vbCBBdWRpb0ZsaW5nZXI6Om1UZWVTaW5rT3V0cHV0RW5hYmxlZCA9IGZhbHNlOwotYm9vbCBBdWRpb0ZsaW5nZXI6Om1UZWVTaW5rVHJhY2tFbmFibGVkID0gZmFsc2U7Ci0KLXNpemVfdCBBdWRpb0ZsaW5nZXI6Om1UZWVTaW5rSW5wdXRGcmFtZXMgPSBrVGVlU2lua0lucHV0RnJhbWVzRGVmYXVsdDsKLXNpemVfdCBBdWRpb0ZsaW5nZXI6Om1UZWVTaW5rT3V0cHV0RnJhbWVzID0ga1RlZVNpbmtPdXRwdXRGcmFtZXNEZWZhdWx0Owotc2l6ZV90IEF1ZGlvRmxpbmdlcjo6bVRlZVNpbmtUcmFja0ZyYW1lcyA9IGtUZWVTaW5rVHJhY2tGcmFtZXNEZWZhdWx0OwotI2VuZGlmCi0KIC8vIEluIG9yZGVyIHRvIGF2b2lkIGludmFsaWRhdGluZyBvZmZsb2FkZWQgdHJhY2tzIGVhY2ggdGltZSBhIFZpc3VhbGl6ZXIgaXMgdHVybmVkIG9uIGFuZCBvZmYKIC8vIHdlIGRlZmluZSBhIG1pbmltdW0gdGltZSBkdXJpbmcgd2hpY2ggYSBnbG9iYWwgZWZmZWN0IGlzIGNvbnNpZGVyZWQgZW5hYmxlZC4KIHN0YXRpYyBjb25zdCBuc2Vjc190IGtNaW5HbG9iYWxFZmZlY3RFbmFibGV0aW1lTnMgPSBzZWNvbmRzKDcyMDApOwpAQCAtMTM0LDYgKzEyNCwyMSBAQAogICAgIH0KIH0KIAorLy8gS2VlcCBhIHN0cm9uZyByZWZlcmVuY2UgdG8gZXh0ZXJuYWwgdmlicmF0b3Igc2VydmljZQorc3RhdGljIHNwPG9zOjpJRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U+IHNFeHRlcm5hbFZpYnJhdG9yU2VydmljZTsKKworc3RhdGljIHNwPG9zOjpJRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U+IGdldEV4dGVybmFsVmlicmF0b3JTZXJ2aWNlKCkgeworICAgIGlmIChzRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2UgPT0gMCkgeworICAgICAgICBzcCA8SUJpbmRlcj4gYmluZGVyID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmdldFNlcnZpY2UoCisgICAgICAgICAgICBTdHJpbmcxNigiZXh0ZXJuYWxfdmlicmF0b3Jfc2VydmljZSIpKTsKKyAgICAgICAgaWYgKGJpbmRlciAhPSAwKSB7CisgICAgICAgICAgICBzRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2UgPQorICAgICAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PG9zOjpJRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U+KGJpbmRlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHNFeHRlcm5hbFZpYnJhdG9yU2VydmljZTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGQ6OnN0cmluZyBmb3JtYXRUb1N0cmluZyhhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKQEAgLTE2MCw2ICsxNjUsNyBAQAogICAgICAgbVRvdGFsTWVtb3J5KDApLAogICAgICAgbUNsaWVudFNoYXJlZEhlYXBTaXplKGtNaW5pbXVtQ2xpZW50U2hhcmVkSGVhcFNpemVCeXRlcyksCiAgICAgICBtR2xvYmFsRWZmZWN0RW5hYmxlVGltZSgwKSwKKyAgICAgIG1QYXRjaFBhbmVsKHRoaXMpLAogICAgICAgbVN5c3RlbVJlYWR5KGZhbHNlKQogewogICAgIC8vIHVuc2lnbmVkIGluc3RlYWQgb2YgYXVkaW9fdW5pcXVlX2lkX3VzZV90LCBiZWNhdXNlICsrIG9wZXJhdG9yIGlzIHVuYXZhaWxhYmxlIGZvciBlbnVtCkBAIC0xNjgsNyArMTc0LDYgQEAKICAgICAgICAgbU5leHRVbmlxdWVJZHNbdXNlXSA9IEFVRElPX1VOSVFVRV9JRF9VU0VfTUFYOwogICAgIH0KIAotICAgIGdldHBpZF9jYWNoZWQgPSBnZXRwaWQoKTsKICAgICBjb25zdCBib29sIGRvTG9nID0gcHJvcGVydHlfZ2V0X2Jvb2woInJvLnRlc3RfaGFybmVzcyIsIGZhbHNlKTsKICAgICBpZiAoZG9Mb2cpIHsKICAgICAgICAgbUxvZ01lbW9yeURlYWxlciA9IG5ldyBNZW1vcnlEZWFsZXIoa0xvZ01lbW9yeVNpemUsICJMb2dXcml0ZXJzIiwKQEAgLTE4NSwyNyArMTkwLDYgQEAKICAgICBtRWZmZWN0c0ZhY3RvcnlIYWwgPSBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTo6Y3JlYXRlKCk7CiAKICAgICBtTWVkaWFMb2dOb3RpZmllci0+cnVuKCJNZWRpYUxvZ05vdGlmaWVyIik7Ci0KLSNpZmRlZiBURUVfU0lOSwotICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICAodm9pZCkgcHJvcGVydHlfZ2V0KCJyby5kZWJ1Z2dhYmxlIiwgdmFsdWUsICIwIik7Ci0gICAgaW50IGRlYnVnZ2FibGUgPSBhdG9pKHZhbHVlKTsKLSAgICBpbnQgdGVlRW5hYmxlZCA9IDA7Ci0gICAgaWYgKGRlYnVnZ2FibGUpIHsKLSAgICAgICAgKHZvaWQpIHByb3BlcnR5X2dldCgiYWYudGVlIiwgdmFsdWUsICIwIik7Ci0gICAgICAgIHRlZUVuYWJsZWQgPSBhdG9pKHZhbHVlKTsKLSAgICB9Ci0gICAgLy8gRklYTUUgc3ltYm9saWMgY29uc3RhbnRzIGhlcmUKLSAgICBpZiAodGVlRW5hYmxlZCAmIDEpIHsKLSAgICAgICAgbVRlZVNpbmtJbnB1dEVuYWJsZWQgPSB0cnVlOwotICAgIH0KLSAgICBpZiAodGVlRW5hYmxlZCAmIDIpIHsKLSAgICAgICAgbVRlZVNpbmtPdXRwdXRFbmFibGVkID0gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKHRlZUVuYWJsZWQgJiA0KSB7Ci0gICAgICAgIG1UZWVTaW5rVHJhY2tFbmFibGVkID0gdHJ1ZTsKLSAgICB9Ci0jZW5kaWYKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6Om9uRmlyc3RSZWYoKQpAQCAtMjI2LDggKzIxMCw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBtUGF0Y2hQYW5lbCA9IG5ldyBQYXRjaFBhbmVsKHRoaXMpOwotCiAgICAgbU1vZGUgPSBBVURJT19NT0RFX05PUk1BTDsKIAogICAgIGdBdWRpb0ZsaW5nZXIgPSB0aGlzOwpAQCAtMjQzLDYgKzIyNSwxNCBAQAogICAgICAgICAvLyBjbG9zZU91dHB1dF9ub252aXJ0dWFsKCkgd2lsbCByZW1vdmUgc3BlY2lmaWVkIGVudHJ5IGZyb20gbVBsYXliYWNrVGhyZWFkcwogICAgICAgICBjbG9zZU91dHB1dF9ub252aXJ0dWFsKG1QbGF5YmFja1RocmVhZHMua2V5QXQoMCkpOwogICAgIH0KKyAgICB3aGlsZSAoIW1NbWFwVGhyZWFkcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgaW8gPSBtTW1hcFRocmVhZHMua2V5QXQoMCk7CisgICAgICAgIGlmIChtTW1hcFRocmVhZHMudmFsdWVBdCgwKS0+aXNPdXRwdXQoKSkgeworICAgICAgICAgICAgY2xvc2VPdXRwdXRfbm9udmlydHVhbChpbyk7IC8vIHJlbW92ZXMgZW50cnkgZnJvbSBtTW1hcFRocmVhZHMKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNsb3NlSW5wdXRfbm9udmlydHVhbChpbyk7ICAvLyByZW1vdmVzIGVudHJ5IGZyb20gbU1tYXBUaHJlYWRzCisgICAgICAgIH0KKyAgICB9CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb0h3RGV2cy5zaXplKCk7IGkrKykgewogICAgICAgICAvLyBubyBtSGFyZHdhcmVMb2NrIG5lZWRlZCwgYXMgdGhlcmUgYXJlIG5vIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhpcwpAQCAtMzA2LDIwICsyOTYsMjYgQEAKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fREVGQVVMVDsKICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgbG9jYWxBdHRyID0gKmF0dHI7CiAgICAgaWYgKGRpcmVjdGlvbiA9PSBNbWFwU3RyZWFtSW50ZXJmYWNlOjpESVJFQ1RJT05fT1VUUFVUKSB7CiAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGZ1bGxDb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CiAgICAgICAgIGZ1bGxDb25maWcuc2FtcGxlX3JhdGUgPSBjb25maWctPnNhbXBsZV9yYXRlOwogICAgICAgICBmdWxsQ29uZmlnLmNoYW5uZWxfbWFzayA9IGNvbmZpZy0+Y2hhbm5lbF9tYXNrOwogICAgICAgICBmdWxsQ29uZmlnLmZvcm1hdCA9IGNvbmZpZy0+Zm9ybWF0OwotICAgICAgICByZXQgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cihhdHRyLCAmaW8sCisgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBzZWNvbmRhcnlPdXRwdXRzOworCisgICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JBdHRyKCZsb2NhbEF0dHIsICZpbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsU2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtVHlwZSwgY2xpZW50LmNsaWVudFBpZCwgY2xpZW50LmNsaWVudFVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZ1bGxDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoQVVESU9fT1VUUFVUX0ZMQUdfTU1BUF9OT0lSUSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQsICZwb3J0SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZCwgJnBvcnRJZCwgJnNlY29uZGFyeU91dHB1dHMpOworICAgICAgICBBTE9HV19JRighc2Vjb25kYXJ5T3V0cHV0cy5lbXB0eSgpLAorICAgICAgICAgICAgICAgICAiJXMgZG9lcyBub3Qgc3VwcG9ydCBzZWNvbmRhcnkgb3V0cHV0cywgaWdub3JpbmcgdGhlbSIsIF9fZnVuY19fKTsKICAgICB9IGVsc2UgewotICAgICAgICByZXQgPSBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGb3JBdHRyKGF0dHIsICZpbywKKyAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OmdldElucHV0Rm9yQXR0cigmbG9jYWxBdHRyLCAmaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVDT1JEX1JJSURfSU5WQUxJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxTZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LmNsaWVudFBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuY2xpZW50VWlkLApAQCAtMzM2LDEyICszMzIsMTIgQEAKICAgICBzcDxNbWFwVGhyZWFkPiB0aHJlYWQgPSBtTW1hcFRocmVhZHMudmFsdWVGb3IoaW8pOwogICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICBpbnRlcmZhY2UgPSBuZXcgTW1hcFRocmVhZEhhbmRsZSh0aHJlYWQpOwotICAgICAgICB0aHJlYWQtPmNvbmZpZ3VyZShhdHRyLCBzdHJlYW1UeXBlLCBhY3R1YWxTZXNzaW9uSWQsIGNhbGxiYWNrLCAqZGV2aWNlSWQsIHBvcnRJZCk7CisgICAgICAgIHRocmVhZC0+Y29uZmlndXJlKCZsb2NhbEF0dHIsIHN0cmVhbVR5cGUsIGFjdHVhbFNlc3Npb25JZCwgY2FsbGJhY2ssICpkZXZpY2VJZCwgcG9ydElkKTsKICAgICAgICAgKmhhbmRsZSA9IHBvcnRJZDsKICAgICAgICAgKnNlc3Npb25JZCA9IGFjdHVhbFNlc3Npb25JZDsKICAgICB9IGVsc2UgewogICAgICAgICBpZiAoZGlyZWN0aW9uID09IE1tYXBTdHJlYW1JbnRlcmZhY2U6OkRJUkVDVElPTl9PVVRQVVQpIHsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KGlvLCBzdHJlYW1UeXBlLCBhY3R1YWxTZXNzaW9uSWQpOworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQocG9ydElkKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQocG9ydElkKTsKICAgICAgICAgfQpAQCAtMzUzLDYgKzM0OSwyNyBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKKy8qIHN0YXRpYyAqLworaW50IEF1ZGlvRmxpbmdlcjo6b25FeHRlcm5hbFZpYnJhdGlvblN0YXJ0KGNvbnN0IHNwPG9zOjpFeHRlcm5hbFZpYnJhdGlvbj4mIGV4dGVybmFsVmlicmF0aW9uKSB7CisgICAgc3A8b3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZT4gZXZzID0gZ2V0RXh0ZXJuYWxWaWJyYXRvclNlcnZpY2UoKTsKKyAgICBpZiAoZXZzICE9IDApIHsKKyAgICAgICAgaW50MzJfdCByZXQ7CisgICAgICAgIGJpbmRlcjo6U3RhdHVzIHN0YXR1cyA9IGV2cy0+b25FeHRlcm5hbFZpYnJhdGlvblN0YXJ0KCpleHRlcm5hbFZpYnJhdGlvbiwgJnJldCk7CisgICAgICAgIGlmIChzdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBBdWRpb01peGVyOjpIQVBUSUNfU0NBTEVfTVVURTsKK30KKworLyogc3RhdGljICovCit2b2lkIEF1ZGlvRmxpbmdlcjo6b25FeHRlcm5hbFZpYnJhdGlvblN0b3AoY29uc3Qgc3A8b3M6OkV4dGVybmFsVmlicmF0aW9uPiYgZXh0ZXJuYWxWaWJyYXRpb24pIHsKKyAgICBzcDxvczo6SUV4dGVybmFsVmlicmF0b3JTZXJ2aWNlPiBldnMgPSBnZXRFeHRlcm5hbFZpYnJhdG9yU2VydmljZSgpOworICAgIGlmIChldnMgIT0gMCkgeworICAgICAgICBldnMtPm9uRXh0ZXJuYWxWaWJyYXRpb25TdG9wKCpleHRlcm5hbFZpYnJhdGlvbik7CisgICAgfQorfQorCiBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGF1ZGlvX2ludGVyZmFjZXNbXSA9IHsKICAgICBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSwKICAgICBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfQTJEUCwKQEAgLTQ1MywxNSArNDcwLDggQEAKIAogYm9vbCBBdWRpb0ZsaW5nZXI6OmR1bXBUcnlMb2NrKE11dGV4JiBtdXRleCkKIHsKLSAgICBib29sIGxvY2tlZCA9IGZhbHNlOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0R1bXBMb2NrUmV0cmllczsgKytpKSB7Ci0gICAgICAgIGlmIChtdXRleC50cnlMb2NrKCkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGxvY2tlZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB1c2xlZXAoa0R1bXBMb2NrU2xlZXBVcyk7Ci0gICAgfQotICAgIHJldHVybiBsb2NrZWQ7CisgICAgc3RhdHVzX3QgZXJyID0gbXV0ZXgudGltZWRMb2NrKGtEdW1wTG9ja1RpbWVvdXROcyk7CisgICAgcmV0dXJuIGVyciA9PSBOT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKQEAgLTQ3OCw3ICs0ODgsNyBAQAogICAgICAgICAgICAgbUhhcmR3YXJlTG9jay51bmxvY2soKTsKICAgICAgICAgfQogCi0gICAgICAgIGJvb2wgbG9ja2VkID0gZHVtcFRyeUxvY2sobUxvY2spOworICAgICAgICBjb25zdCBib29sIGxvY2tlZCA9IGR1bXBUcnlMb2NrKG1Mb2NrKTsKIAogICAgICAgICAvLyBmYWlsZWQgdG8gbG9jayAtIEF1ZGlvRmxpbmdlciBpcyBwcm9iYWJseSBkZWFkbG9ja2VkCiAgICAgICAgIGlmICghbG9ja2VkKSB7CkBAIC01MzQsMTIgKzU0NCwyMiBAQAogICAgICAgICAgICAgZGV2LT5kdW1wKGZkKTsKICAgICAgICAgfQogCi0jaWZkZWYgVEVFX1NJTksKLSAgICAgICAgLy8gZHVtcCB0aGUgc2VyaWFsbHkgc2hhcmVkIHJlY29yZCB0ZWUgc2luawotICAgICAgICBpZiAobVJlY29yZFRlZVNvdXJjZSAhPSAwKSB7Ci0gICAgICAgICAgICBkdW1wVGVlKGZkLCBtUmVjb3JkVGVlU291cmNlLCBBVURJT19JT19IQU5ETEVfTk9ORSwgJ0MnKTsKLSAgICAgICAgfQotI2VuZGlmCisgICAgICAgIG1QYXRjaFBhbmVsLmR1bXAoZmQpOworCisgICAgICAgIC8vIGR1bXAgZXh0ZXJuYWwgc2V0UGFyYW1ldGVycworICAgICAgICBhdXRvIGR1bXBMb2dnZXIgPSBbZmRdKFNpbXBsZUxvZyYgbG9nZ2VyLCBjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgICAgICAgICBkcHJpbnRmKGZkLCAiXG4lcyBzZXRQYXJhbWV0ZXJzOlxuIiwgbmFtZSk7CisgICAgICAgICAgICBsb2dnZXIuZHVtcChmZCwgIiAgICAiIC8qIHByZWZpeCAqLyk7CisgICAgICAgIH07CisgICAgICAgIGR1bXBMb2dnZXIobVJlamVjdGVkU2V0UGFyYW1ldGVyTG9nLCAiUmVqZWN0ZWQiKTsKKyAgICAgICAgZHVtcExvZ2dlcihtQXBwU2V0UGFyYW1ldGVyTG9nLCAiQXBwIik7CisgICAgICAgIGR1bXBMb2dnZXIobVN5c3RlbVNldFBhcmFtZXRlckxvZywgIlN5c3RlbSIpOworCisgICAgICAgIC8vIGR1bXAgaGlzdG9yaWNhbCB0aHJlYWRzIGluIHRoZSBsYXN0IDEwIHNlY29uZHMKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgdGhyZWFkTG9nID0gbVRocmVhZExvZy5kdW1wVG9TdHJpbmcoCisgICAgICAgICAgICAgICAgIkhpc3RvcmljYWwgVGhyZWFkIExvZyAiLCAwIC8qIGxpbmVzICovLAorICAgICAgICAgICAgICAgIGF1ZGlvX3V0aWxzX2dldF9yZWFsX3RpbWVfbnMoKSAtIDEwICogNjAgKiBOQU5PU19QRVJfU0VDT05EKTsKKyAgICAgICAgd3JpdGUoZmQsIHRocmVhZExvZy5jX3N0cigpLCB0aHJlYWRMb2cuc2l6ZSgpKTsKIAogICAgICAgICBCVUZMT0dfUkVTRVQ7CiAKQEAgLTU0Nyw2ICs1NjcsMTAgQEAKICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICB9CiAKKyNpZmRlZiBURUVfU0lOSworICAgICAgICAvLyBOQkFJT19UZWUgZHVtcCBpcyBzYWZlIHRvIGNhbGwgb3V0c2lkZSBvZiBBRiBsb2NrLgorICAgICAgICBOQkFJT19UZWU6OmR1bXBBbGwoZmQsICJfRFVNUCIpOworI2VuZGlmCiAgICAgICAgIC8vIGFwcGVuZCBhIGNvcHkgb2YgbWVkaWEubG9nIGhlcmUgYnkgZm9yd2FyZGluZyBmZCB0byBpdCwgYnV0IGRvbid0IGF0dGVtcHQKICAgICAgICAgLy8gdG8gbG9va3VwIHRoZSBzZXJ2aWNlIGlmIGl0J3Mgbm90IHJ1bm5pbmcsIGFzIGl0IHdpbGwgYmxvY2sgZm9yIGEgc2Vjb25kCiAgICAgICAgIGlmIChzTWVkaWFMb2dTZXJ2aWNlQXNCaW5kZXIgIT0gMCkgewpAQCAtNjYyLDExICs2ODYsMTYgQEAKICAgICBzdGF0dXNfdCBsU3RhdHVzOwogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZTsKICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IHNlY29uZGFyeU91dHB1dHM7CiAKICAgICBib29sIHVwZGF0ZVBpZCA9IChpbnB1dC5jbGllbnRJbmZvLmNsaWVudFBpZCA9PSAtMSk7CiAgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKICAgICB1aWRfdCBjbGllbnRVaWQgPSBpbnB1dC5jbGllbnRJbmZvLmNsaWVudFVpZDsKLSAgICBpZiAoIWlzVHJ1c3RlZENhbGxpbmdVaWQoY2FsbGluZ1VpZCkpIHsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBlZmZlY3RUaHJlYWRJZCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIHN0ZDo6dmVjdG9yPGludD4gZWZmZWN0SWRzOworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBsb2NhbEF0dHIgPSBpbnB1dC5hdHRyOworCisgICAgaWYgKCFpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZChjYWxsaW5nVWlkKSkgewogICAgICAgICBBTE9HV19JRihjbGllbnRVaWQgIT0gY2FsbGluZ1VpZCwKICAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyAlZCIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYWxsaW5nVWlkLCBjbGllbnRVaWQpOwpAQCAtNjc0LDggKzcwMyw4IEBACiAgICAgICAgIHVwZGF0ZVBpZCA9IHRydWU7CiAgICAgfQogICAgIHBpZF90IGNsaWVudFBpZCA9IGlucHV0LmNsaWVudEluZm8uY2xpZW50UGlkOworICAgIGNvbnN0IHBpZF90IGNhbGxpbmdQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgaWYgKHVwZGF0ZVBpZCkgewotICAgICAgICBjb25zdCBwaWRfdCBjYWxsaW5nUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwogICAgICAgICBBTE9HV19JRihjbGllbnRQaWQgIT0gLTEgJiYgY2xpZW50UGlkICE9IGNhbGxpbmdQaWQsCiAgICAgICAgICAgICAgICAgICIlcyB1aWQgJWQgcGlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyBwaWQgJWQiLAogICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2FsbGluZ1VpZCwgY2FsbGluZ1BpZCwgY2xpZW50UGlkKTsKQEAgLTY5MywxMCArNzIyLDkgQEAKICAgICBvdXRwdXQuc2Vzc2lvbklkID0gc2Vzc2lvbklkOwogICAgIG91dHB1dC5vdXRwdXRJZCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIG91dHB1dC5zZWxlY3RlZERldmljZUlkID0gaW5wdXQuc2VsZWN0ZWREZXZpY2VJZDsKLQotICAgIGxTdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cigmaW5wdXQuYXR0ciwgJm91dHB1dC5vdXRwdXRJZCwgc2Vzc2lvbklkLCAmc3RyZWFtVHlwZSwKKyAgICBsU3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckF0dHIoJmxvY2FsQXR0ciwgJm91dHB1dC5vdXRwdXRJZCwgc2Vzc2lvbklkLCAmc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50UGlkLCBjbGllbnRVaWQsICZpbnB1dC5jb25maWcsIGlucHV0LmZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LnNlbGVjdGVkRGV2aWNlSWQsICZwb3J0SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LnNlbGVjdGVkRGV2aWNlSWQsICZwb3J0SWQsICZzZWNvbmRhcnlPdXRwdXRzKTsKIAogICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SIHx8IG91dHB1dC5vdXRwdXRJZCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICBBTE9HRSgiY3JlYXRlVHJhY2soKSBnZXRPdXRwdXRGb3JBdHRyKCkgcmV0dXJuIGVycm9yICVkIG9yIGludmFsaWQgb3V0cHV0IGhhbmRsZSIsIGxTdGF0dXMpOwpAQCAtNzU1LDE4ICs3ODMsODEgQEAKICAgICAgICAgb3V0cHV0Lm5vdGlmaWNhdGlvbkZyYW1lQ291bnQgPSBpbnB1dC5ub3RpZmljYXRpb25GcmFtZUNvdW50OwogICAgICAgICBvdXRwdXQuZmxhZ3MgPSBpbnB1dC5mbGFnczsKIAotICAgICAgICB0cmFjayA9IHRocmVhZC0+Y3JlYXRlVHJhY2tfbChjbGllbnQsIHN0cmVhbVR5cGUsIGlucHV0LmF0dHIsICZvdXRwdXQuc2FtcGxlUmF0ZSwKKyAgICAgICAgdHJhY2sgPSB0aHJlYWQtPmNyZWF0ZVRyYWNrX2woY2xpZW50LCBzdHJlYW1UeXBlLCBsb2NhbEF0dHIsICZvdXRwdXQuc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uZmlnLmZvcm1hdCwgaW5wdXQuY29uZmlnLmNoYW5uZWxfbWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dC5mcmFtZUNvdW50LCAmb3V0cHV0Lm5vdGlmaWNhdGlvbkZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Lm5vdGlmaWNhdGlvbnNQZXJCdWZmZXIsIGlucHV0LnNwZWVkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5zaGFyZWRCdWZmZXIsIHNlc3Npb25JZCwgJm91dHB1dC5mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY2xpZW50SW5mby5jbGllbnRUaWQsIGNsaWVudFVpZCwgJmxTdGF0dXMsIHBvcnRJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxpbmdQaWQsIGlucHV0LmNsaWVudEluZm8uY2xpZW50VGlkLCBjbGllbnRVaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsU3RhdHVzLCBwb3J0SWQpOwogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChsU3RhdHVzID09IE5PX0VSUk9SKSAmJiAodHJhY2sgPT0gMCkpOwogICAgICAgICAvLyB3ZSBkb24ndCBhYm9ydCB5ZXQgaWYgbFN0YXR1cyAhPSBOT19FUlJPUjsgdGhlcmUgaXMgc3RpbGwgd29yayB0byBiZSBkb25lIHJlZ2FyZGxlc3MKIAogICAgICAgICBvdXRwdXQuYWZGcmFtZUNvdW50ID0gdGhyZWFkLT5mcmFtZUNvdW50KCk7CiAgICAgICAgIG91dHB1dC5hZlNhbXBsZVJhdGUgPSB0aHJlYWQtPnNhbXBsZVJhdGUoKTsKICAgICAgICAgb3V0cHV0LmFmTGF0ZW5jeU1zID0gdGhyZWFkLT5sYXRlbmN5KCk7CisgICAgICAgIG91dHB1dC5wb3J0SWQgPSBwb3J0SWQ7CisKKyAgICAgICAgaWYgKGxTdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIC8vIENvbm5lY3Qgc2Vjb25kYXJ5IG91dHB1dHMuIEZhaWx1cmUgb24gYSBzZWNvbmRhcnkgb3V0cHV0IG11c3Qgbm90IGltcGVkIHRoZSBwcmltYXJ5CisgICAgICAgICAgICAvLyBBbnkgc2Vjb25kYXJ5IG91dHB1dCBzZXR1cCBmYWlsdXJlIHdpbGwgbGVhZCB0byBhIGRlc3luYyBiZXR3ZWVuIHRoZSBBUCBhbmQgQUYgdW50aWwKKyAgICAgICAgICAgIC8vIHRoZSB0cmFjayBpcyBkZXN0cm95ZWQuCisgICAgICAgICAgICBUZWVQYXRjaGVzIHRlZVBhdGNoZXM7CisgICAgICAgICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IHNlY29uZGFyeU91dHB1dCA6IHNlY29uZGFyeU91dHB1dHMpIHsKKyAgICAgICAgICAgICAgICBQbGF5YmFja1RocmVhZCAqc2Vjb25kYXJ5VGhyZWFkID0gY2hlY2tQbGF5YmFja1RocmVhZF9sKHNlY29uZGFyeU91dHB1dCk7CisgICAgICAgICAgICAgICAgaWYgKHNlY29uZGFyeVRocmVhZCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJubyBwbGF5YmFjayB0aHJlYWQgZm91bmQgZm9yIHNlY29uZGFyeSBvdXRwdXQgJWQiLCBvdXRwdXQub3V0cHV0SWQpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCA9IHN0ZDo6bGNtKHRocmVhZC0+ZnJhbWVDb3VudCgpLCBzZWNvbmRhcnlUaHJlYWQtPmZyYW1lQ291bnQoKSk7CisKKyAgICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CisgICAgICAgICAgICAgICAgYXV0byBpbkNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9tYXNrX291dF90b19pbihpbnB1dC5jb25maWcuY2hhbm5lbF9tYXNrKTsKKyAgICAgICAgICAgICAgICBzcCBwYXRjaFJlY29yZCA9IG5ldyBSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkKG51bGxwdHIgLyogdGhyZWFkICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uZmlnLmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIC8qIGJ1ZmZlciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpMCAvKiBidWZmZXJTaXplICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19ESVJFQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwbnMgLyogdGltZW91dCAqLyk7CisgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcGF0Y2hSZWNvcmQtPmluaXRDaGVjaygpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlNlY29uZGFyeSBvdXRwdXQgcGF0Y2hSZWNvcmQgaW5pdCBmYWlsZWQ6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gVE9ETzogV2UgY291bGQgY2hlY2sgY29tcGF0aWJpbGl0eSBvZiB0aGUgc2Vjb25kYXJ5VGhyZWFkIHdpdGggdGhlIFBhdGNoVHJhY2sKKyAgICAgICAgICAgICAgICAvLyBmb3IgZmFzdCB1c2FnZTogdGhyZWFkIGhhcyBmYXN0IG1peGVyLCBzYW1wbGUgcmF0ZSBtYXRjaGVzLCBldGMuOworICAgICAgICAgICAgICAgIC8vIGZvciBub3csIHdlIGV4Y2x1ZGUgZmFzdCB0cmFja3MgYnkgcmVtb3ZpbmcgdGhlIEZhc3QgZmxhZy4KKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBvdXRwdXRGbGFncyA9CisgICAgICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKG91dHB1dC5mbGFncyAmIH5BVURJT19PVVRQVVRfRkxBR19GQVNUKTsKKyAgICAgICAgICAgICAgICBzcCBwYXRjaFRyYWNrID0gbmV3IFBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrKHNlY29uZGFyeVRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbmZpZy5jaGFubmVsX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25maWcuZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoUmVjb3JkLT5idWZmZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoUmVjb3JkLT5idWZmZXJTaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBucyAvKiB0aW1lb3V0ICovKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBwYXRjaFRyYWNrLT5pbml0Q2hlY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJTZWNvbmRhcnkgb3V0cHV0IHBhdGNoVHJhY2sgaW5pdCBmYWlsZWQ6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRlZVBhdGNoZXMucHVzaF9iYWNrKHtwYXRjaFJlY29yZCwgcGF0Y2hUcmFja30pOworICAgICAgICAgICAgICAgIHNlY29uZGFyeVRocmVhZC0+YWRkUGF0Y2hUcmFjayhwYXRjaFRyYWNrKTsKKyAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIHRoZSBkb3duc3RyZWFtIHBhdGNoVHJhY2sgb24gdGhlIHNlY29uZGFyeVRocmVhZCB0ZW1wb3JhcmlseSBvdXRsaXZlcworICAgICAgICAgICAgICAgIC8vIG91ciBjcmVhdGVkIHRyYWNrLCBlbnN1cmUgdGhlIGNvcnJlc3BvbmRpbmcgcGF0Y2hSZWNvcmQgaXMgc3RpbGwgYWxpdmUuCisgICAgICAgICAgICAgICAgcGF0Y2hUcmFjay0+c2V0UGVlclByb3h5KHBhdGNoUmVjb3JkLCB0cnVlIC8qIGhvbGRSZWZlcmVuY2UgKi8pOworICAgICAgICAgICAgICAgIHBhdGNoUmVjb3JkLT5zZXRQZWVyUHJveHkocGF0Y2hUcmFjaywgZmFsc2UgLyogaG9sZFJlZmVyZW5jZSAqLyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmFjay0+c2V0VGVlUGF0Y2hlcyhzdGQ6Om1vdmUodGVlUGF0Y2hlcykpOworICAgICAgICB9CiAKICAgICAgICAgLy8gbW92ZSBlZmZlY3QgY2hhaW4gdG8gdGhpcyBvdXRwdXQgdGhyZWFkIGlmIGFuIGVmZmVjdCBvbiBzYW1lIHNlc3Npb24gd2FzIHdhaXRpbmcKICAgICAgICAgLy8gZm9yIGEgdHJhY2sgdG8gYmUgY3JlYXRlZApAQCAtNzc0LDcgKzg2NSwxMCBAQAogICAgICAgICAgICAgLy8gbm8gcmlzayBvZiBkZWFkbG9jayBiZWNhdXNlIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaXMgaGVsZAogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9kbCh0aHJlYWQtPm1Mb2NrKTsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfc2woZWZmZWN0VGhyZWFkLT5tTG9jayk7Ci0gICAgICAgICAgICBtb3ZlRWZmZWN0Q2hhaW5fbChzZXNzaW9uSWQsIGVmZmVjdFRocmVhZCwgdGhyZWFkLCB0cnVlKTsKKyAgICAgICAgICAgIGlmIChtb3ZlRWZmZWN0Q2hhaW5fbChzZXNzaW9uSWQsIGVmZmVjdFRocmVhZCwgdGhyZWFkKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGVmZmVjdFRocmVhZElkID0gdGhyZWFkLT5pZCgpOworICAgICAgICAgICAgICAgIGVmZmVjdElkcyA9IHRocmVhZC0+Z2V0RWZmZWN0SWRzX2woc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8vIExvb2sgZm9yIHN5bmMgZXZlbnRzIGF3YWl0aW5nIGZvciBhIHNlc3Npb24gdG8gYmUgdXNlZC4KQEAgLTgwOCwxMiArOTAyLDE4IEBACiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKKyAgICAvLyBlZmZlY3RUaHJlYWRJZCBpcyBub3QgTk9ORSBpZiBhbiBlZmZlY3QgY2hhaW4gY29ycmVzcG9uZGluZyB0byB0aGUgdHJhY2sgc2Vzc2lvbgorICAgIC8vIHdhcyBmb3VuZCBvbiBhbm90aGVyIHRocmVhZCBhbmQgbXVzdCBiZSBtb3ZlZCBvbiB0aGlzIHRocmVhZAorICAgIGlmIChlZmZlY3RUaHJlYWRJZCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICBBdWRpb1N5c3RlbTo6bW92ZUVmZmVjdHNUb0lvKGVmZmVjdElkcywgZWZmZWN0VGhyZWFkSWQpOworICAgIH0KKwogICAgIC8vIHJldHVybiBoYW5kbGUgdG8gY2xpZW50CiAgICAgdHJhY2tIYW5kbGUgPSBuZXcgVHJhY2tIYW5kbGUodHJhY2spOwogCiBFeGl0OgogICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SICYmIG91dHB1dC5vdXRwdXRJZCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChvdXRwdXQub3V0cHV0SWQsIHN0cmVhbVR5cGUsIHNlc3Npb25JZCk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KHBvcnRJZCk7CiAgICAgfQogICAgICpzdGF0dXMgPSBsU3RhdHVzOwogICAgIHJldHVybiB0cmFja0hhbmRsZTsKQEAgLTkxNyw2ICsxMDE3LDQwIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnNldE1hc3RlckJhbGFuY2UoZmxvYXQgYmFsYW5jZSkKK3sKKyAgICBzdGF0dXNfdCByZXQgPSBpbml0Q2hlY2soKTsKKyAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLy8gY2hlY2sgY2FsbGluZyBwZXJtaXNzaW9ucworICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIC8vIGNoZWNrIHJhbmdlCisgICAgaWYgKGlzbmFuKGJhbGFuY2UpIHx8IGZhYnMoYmFsYW5jZSkgPiAxLmYpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgLy8gc2hvcnQgY3V0LgorICAgIGlmIChtTWFzdGVyQmFsYW5jZSA9PSBiYWxhbmNlKSByZXR1cm4gTk9fRVJST1I7CisKKyAgICBtTWFzdGVyQmFsYW5jZSA9IGJhbGFuY2U7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS0+aXNEdXBsaWNhdGluZygpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSktPnNldE1hc3RlckJhbGFuY2UoYmFsYW5jZSk7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpCiB7CiAgICAgc3RhdHVzX3QgcmV0ID0gaW5pdENoZWNrKCk7CkBAIC0xMDU2LDYgKzExOTAsMTMgQEAKICAgICByZXR1cm4gbWFzdGVyVm9sdW1lX2woKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpnZXRNYXN0ZXJCYWxhbmNlKGZsb2F0ICpiYWxhbmNlKSBjb25zdAoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgKmJhbGFuY2UgPSBnZXRNYXN0ZXJCYWxhbmNlX2woKTsKKyAgICByZXR1cm4gTk9fRVJST1I7IC8vIGlmIGNhbGxlZCB0aHJvdWdoIGJpbmRlciwgbWF5IHJldHVybiBhIHRyYW5zYWN0aW9uYWwgZXJyb3IKK30KKwogYm9vbCBBdWRpb0ZsaW5nZXI6Om1hc3Rlck11dGUoKSBjb25zdAogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC0xMDY3LDYgKzEyMDgsMTEgQEAKICAgICByZXR1cm4gbU1hc3RlclZvbHVtZTsKIH0KIAorZmxvYXQgQXVkaW9GbGluZ2VyOjpnZXRNYXN0ZXJCYWxhbmNlX2woKSBjb25zdAoreworICAgIHJldHVybiBtTWFzdGVyQmFsYW5jZTsKK30KKwogYm9vbCBBdWRpb0ZsaW5nZXI6Om1hc3Rlck11dGVfbCgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1NYXN0ZXJNdXRlOwpAQCAtMTA3OCw5ICsxMjI0LDkgQEAKICAgICAgICAgQUxPR1coImNoZWNrU3RyZWFtVHlwZSgpIGludmFsaWQgc3RyZWFtICVkIiwgc3RyZWFtKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgcGlkX3QgY2FsbGVyID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UICYmIGNhbGxlciAhPSBnZXRwaWRfY2FjaGVkKSB7Ci0gICAgICAgIEFMT0dXKCJjaGVja1N0cmVhbVR5cGUoKSBwaWQgJWQgY2Fubm90IHVzZSBpbnRlcm5hbCBzdHJlYW0gdHlwZSAlZCIsIGNhbGxlciwgc3RyZWFtKTsKKyAgICBjb25zdCB1aWRfdCBjYWxsZXJVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQgJiYgIWlzQXVkaW9TZXJ2ZXJVaWQoY2FsbGVyVWlkKSkgeworICAgICAgICBBTE9HVygiY2hlY2tTdHJlYW1UeXBlKCkgdWlkICVkIGNhbm5vdCB1c2UgaW50ZXJuYWwgc3RyZWFtIHR5cGUgJWQiLCBjYWxsZXJVaWQsIHN0cmVhbSk7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKQEAgLTExMDIsNyArMTI0OCw4IEBACiAgICAgaWYgKG91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBBTE9HX0FTU0VSVChzdHJlYW0gIT0gQVVESU9fU1RSRUFNX1BBVENILCAiYXR0ZW1wdCB0byBjaGFuZ2UgQVVESU9fU1RSRUFNX1BBVENIIHZvbHVtZSIpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RyZWFtID09IEFVRElPX1NUUkVBTV9QQVRDSCAmJiB2YWx1ZSAhPSAxLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgIkFVRElPX1NUUkVBTV9QQVRDSCBtdXN0IGhhdmUgZnVsbCBzY2FsZSB2b2x1bWUiKTsKIAogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBWb2x1bWVJbnRlcmZhY2UgKnZvbHVtZUludGVyZmFjZSA9IGdldFZvbHVtZUludGVyZmFjZV9sKG91dHB1dCk7CkBAIC0xMTgwLDYgKzEzMjcsMjMgQEAKICAgICB9CiB9CiAKKy8vIGZvcndhcmRBdWRpb0h3U3luY1RvRG93bnN0cmVhbVBhdGNoZXNfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCit2b2lkIEF1ZGlvRmxpbmdlcjo6Zm9yd2FyZFBhcmFtZXRlcnNUb0Rvd25zdHJlYW1QYXRjaGVzX2woCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHVwU3RyZWFtLCBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+Jik+IHVzZVRocmVhZCkKK3sKKyAgICBzdGQ6OnZlY3RvcjxQYXRjaFBhbmVsOjpTb2Z0d2FyZVBhdGNoPiBzd1BhdGNoZXM7CisgICAgaWYgKG1QYXRjaFBhbmVsLmdldERvd25zdHJlYW1Tb2Z0d2FyZVBhdGNoZXModXBTdHJlYW0sICZzd1BhdGNoZXMpICE9IE9LKSByZXR1cm47CisgICAgQUxPR1ZfSUYoIXN3UGF0Y2hlcy5lbXB0eSgpLCAiJXMgZm91bmQgJXp1IGRvd25zdHJlYW0gcGF0Y2hlcyBmb3Igc3RyZWFtIElEICVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBzd1BhdGNoZXMuc2l6ZSgpLCB1cFN0cmVhbSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBzd1BhdGNoIDogc3dQYXRjaGVzKSB7CisgICAgICAgIHNwPFBsYXliYWNrVGhyZWFkPiBkb3duU3RyZWFtID0gY2hlY2tQbGF5YmFja1RocmVhZF9sKHN3UGF0Y2guZ2V0UGxheWJhY2tUaHJlYWRIYW5kbGUoKSk7CisgICAgICAgIGlmIChkb3duU3RyZWFtICE9IE5VTEwgJiYgKHVzZVRocmVhZCA9PSBudWxscHRyIHx8IHVzZVRocmVhZChkb3duU3RyZWFtKSkpIHsKKyAgICAgICAgICAgIGRvd25TdHJlYW0tPnNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlycyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIC8vIEZpbHRlciByZXNlcnZlZCBrZXlzIGZyb20gc2V0UGFyYW1ldGVycygpIGJlZm9yZSBmb3J3YXJkaW5nIHRvIGF1ZGlvIEhBTCBvciBhY3RpbmcgdXBvbi4KIC8vIFNvbWUga2V5cyBhcmUgdXNlZCBmb3IgYXVkaW8gcm91dGluZyBhbmQgYXVkaW8gcGF0aCBjb25maWd1cmF0aW9uIGFuZCBzaG91bGQgYmUgcmVzZXJ2ZWQgZm9yIHVzZQogLy8gYnkgYXVkaW8gcG9saWN5IGFuZCBhdWRpbyBmbGluZ2VyIGZvciBmdW5jdGlvbmFsLCBwcml2YWN5IGFuZCBzZWN1cml0eSByZWFzb25zLgpAQCAtMTIwMCwyMyArMTM2NCwzOSBAQAogICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzKSwKICAgICB9OwogCi0gICAgLy8gbXVsdGl1c2VyIGZyaWVuZGx5IGFwcCBJRCBjaGVjayBmb3IgcmVxdWVzdHMgY29taW5nIGZyb20gYXVkaW9zZXJ2ZXIKLSAgICBpZiAobXVsdGl1c2VyX2dldF9hcHBfaWQoY2FsbGluZ1VpZCkgPT0gQUlEX0FVRElPU0VSVkVSKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICBpZiAoaXNBdWRpb1NlcnZlclVpZChjYWxsaW5nVWlkKSkgeworICAgICAgICByZXR1cm47IC8vIG5vIG5lZWQgdG8gZmlsdGVyIGlmIGF1ZGlvc2VydmVyLgogICAgIH0KIAogICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoa2V5VmFsdWVQYWlycyk7CiAgICAgU3RyaW5nOCB2YWx1ZTsKKyAgICBBdWRpb1BhcmFtZXRlciByZWplY3RlZFBhcmFtOwogICAgIGZvciAoYXV0byYga2V5IDoga1Jlc2VydmVkUGFyYW1ldGVycykgewogICAgICAgICBpZiAocGFyYW0uZ2V0KGtleSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HVygiJXM6IGZpbHRlcmluZyBrZXkgJXMgdmFsdWUgJXMgZnJvbSB1aWQgJWQiLAotICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGtleS5zdHJpbmcoKSwgdmFsdWUuc3RyaW5nKCksIGNhbGxpbmdVaWQpOworICAgICAgICAgICAgcmVqZWN0ZWRQYXJhbS5hZGQoa2V5LCB2YWx1ZSk7CiAgICAgICAgICAgICBwYXJhbS5yZW1vdmUoa2V5KTsKICAgICAgICAgfQogICAgIH0KKyAgICBsb2dGaWx0ZXJlZFBhcmFtZXRlcnMocGFyYW0uc2l6ZSgpICsgcmVqZWN0ZWRQYXJhbS5zaXplKCksIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdGVkUGFyYW0uc2l6ZSgpLCByZWplY3RlZFBhcmFtLnRvU3RyaW5nKCksIGNhbGxpbmdVaWQpOwogICAgIGtleVZhbHVlUGFpcnMgPSBwYXJhbS50b1N0cmluZygpOwogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6bG9nRmlsdGVyZWRQYXJhbWV0ZXJzKHNpemVfdCBvcmlnaW5hbEtWUFNpemUsIGNvbnN0IFN0cmluZzgmIG9yaWdpbmFsS1ZQcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHJlamVjdGVkS1ZQU2l6ZSwgY29uc3QgU3RyaW5nOCYgcmVqZWN0ZWRLVlBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCBjYWxsaW5nVWlkKSB7CisgICAgYXV0byBwcmVmaXggPSBTdHJpbmc4Ojpmb3JtYXQoIlVJRCAlNWQiLCBjYWxsaW5nVWlkKTsKKyAgICBhdXRvIHN1ZmZpeCA9IFN0cmluZzg6OmZvcm1hdCgiJXp1IEtWUCByZWNlaXZlZDogJXMiLCBvcmlnaW5hbEtWUFNpemUsIG9yaWdpbmFsS1ZQcy5jX3N0cigpKTsKKyAgICBpZiAocmVqZWN0ZWRLVlBTaXplICE9IDApIHsKKyAgICAgICAgYXV0byBlcnJvciA9IFN0cmluZzg6OmZvcm1hdCgiJXp1IEtWUCByZWplY3RlZDogJXMiLCByZWplY3RlZEtWUFNpemUsIHJlamVjdGVkS1ZQcy5jX3N0cigpKTsKKyAgICAgICAgQUxPR1coIiVzOiAlcywgJXMsICVzIiwgX19mdW5jX18sIHByZWZpeC5jX3N0cigpLCBlcnJvci5jX3N0cigpLCBzdWZmaXguY19zdHIoKSk7CisgICAgICAgIG1SZWplY3RlZFNldFBhcmFtZXRlckxvZy5sb2coIiVzLCAlcywgJXMiLCBwcmVmaXguY19zdHIoKSwgZXJyb3IuY19zdHIoKSwgc3VmZml4LmNfc3RyKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIGF1dG8mIGxvZ2dlciA9IChpc1NlcnZpY2VVaWQoY2FsbGluZ1VpZCkgPyBtU3lzdGVtU2V0UGFyYW1ldGVyTG9nIDogbUFwcFNldFBhcmFtZXRlckxvZyk7CisgICAgICAgIGxvZ2dlci5sb2coIiVzLCAlcyIsIHByZWZpeC5jX3N0cigpLCBzdWZmaXguY19zdHIoKSk7CisgICAgfQorfQorCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnNldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpCiB7CiAgICAgQUxPR1YoInNldFBhcmFtZXRlcnMoKTogaW8gJWQsIGtleXZhbHVlICVzLCBjYWxsaW5nIHBpZCAlZCBjYWxsaW5nIHVpZCAlZCIsCkBAIC0xMjk2LDcgKzE0NzYsOSBAQAogICAgICAgICB9CiAgICAgfQogICAgIGlmICh0aHJlYWQgIT0gMCkgewotICAgICAgICByZXR1cm4gdGhyZWFkLT5zZXRQYXJhbWV0ZXJzKGZpbHRlcmVkS2V5VmFsdWVQYWlycyk7CisgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IHRocmVhZC0+c2V0UGFyYW1ldGVycyhmaWx0ZXJlZEtleVZhbHVlUGFpcnMpOworICAgICAgICBmb3J3YXJkUGFyYW1ldGVyc1RvRG93bnN0cmVhbVBhdGNoZXNfbCh0aHJlYWQtPmlkKCksIGZpbHRlcmVkS2V5VmFsdWVQYWlycyk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogICAgIHJldHVybiBCQURfVkFMVUU7CiB9CkBAIC0xNDcyLDMwICsxNjU0LDM2IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpyZW1vdmVOb3RpZmljYXRpb25DbGllbnQocGlkX3QgcGlkKQogewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3RkOjp2ZWN0b3I8IHNwPEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlPiA+IHJlbW92ZWRFZmZlY3RzOwogICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9jbChtQ2xpZW50TG9jayk7Ci0gICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnJlbW92ZUl0ZW0ocGlkKTsKLSAgICB9CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfY2wobUNsaWVudExvY2spOworICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMucmVtb3ZlSXRlbShwaWQpOworICAgICAgICB9CiAKLSAgICBBTE9HVigiJWQgZGllZCwgcmVsZWFzaW5nIGl0cyBzZXNzaW9ucyIsIHBpZCk7Ci0gICAgc2l6ZV90IG51bSA9IG1BdWRpb1Nlc3Npb25SZWZzLnNpemUoKTsKLSAgICBib29sIHJlbW92ZWQgPSBmYWxzZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bTsgKSB7Ci0gICAgICAgIEF1ZGlvU2Vzc2lvblJlZiAqcmVmID0gbUF1ZGlvU2Vzc2lvblJlZnMuaXRlbUF0KGkpOwotICAgICAgICBBTE9HVigiIHBpZCAlZCBAICV6dSIsIHJlZi0+bVBpZCwgaSk7Ci0gICAgICAgIGlmIChyZWYtPm1QaWQgPT0gcGlkKSB7Ci0gICAgICAgICAgICBBTE9HVigiIHJlbW92aW5nIGVudHJ5IGZvciBwaWQgJWQgc2Vzc2lvbiAlZCIsIHBpZCwgcmVmLT5tU2Vzc2lvbmlkKTsKLSAgICAgICAgICAgIG1BdWRpb1Nlc3Npb25SZWZzLnJlbW92ZUF0KGkpOwotICAgICAgICAgICAgZGVsZXRlIHJlZjsKLSAgICAgICAgICAgIHJlbW92ZWQgPSB0cnVlOwotICAgICAgICAgICAgbnVtLS07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpKys7CisgICAgICAgIEFMT0dWKCIlZCBkaWVkLCByZWxlYXNpbmcgaXRzIHNlc3Npb25zIiwgcGlkKTsKKyAgICAgICAgc2l6ZV90IG51bSA9IG1BdWRpb1Nlc3Npb25SZWZzLnNpemUoKTsKKyAgICAgICAgYm9vbCByZW1vdmVkID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtOyApIHsKKyAgICAgICAgICAgIEF1ZGlvU2Vzc2lvblJlZiAqcmVmID0gbUF1ZGlvU2Vzc2lvblJlZnMuaXRlbUF0KGkpOworICAgICAgICAgICAgQUxPR1YoIiBwaWQgJWQgQCAlenUiLCByZWYtPm1QaWQsIGkpOworICAgICAgICAgICAgaWYgKHJlZi0+bVBpZCA9PSBwaWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiIHJlbW92aW5nIGVudHJ5IGZvciBwaWQgJWQgc2Vzc2lvbiAlZCIsIHBpZCwgcmVmLT5tU2Vzc2lvbmlkKTsKKyAgICAgICAgICAgICAgICBtQXVkaW9TZXNzaW9uUmVmcy5yZW1vdmVBdChpKTsKKyAgICAgICAgICAgICAgICBkZWxldGUgcmVmOworICAgICAgICAgICAgICAgIHJlbW92ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIG51bS0tOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlbW92ZWQpIHsKKyAgICAgICAgICAgIHJlbW92ZWRFZmZlY3RzID0gcHVyZ2VTdGFsZUVmZmVjdHNfbCgpOwogICAgICAgICB9CiAgICAgfQotICAgIGlmIChyZW1vdmVkKSB7Ci0gICAgICAgIHB1cmdlU3RhbGVFZmZlY3RzX2woKTsKKyAgICBmb3IgKGF1dG8mIGVmZmVjdCA6IHJlbW92ZWRFZmZlY3RzKSB7CisgICAgICAgIGVmZmVjdC0+dXBkYXRlUG9saWN5U3RhdGUoKTsKICAgICB9CiB9CiAKQEAgLTE1MjEsMTggKzE3MDksMzUgQEAKIH0KIAogLy8gZ2V0RWZmZWN0VGhyZWFkX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZAotc3A8QXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZD4gQXVkaW9GbGluZ2VyOjpnZXRFZmZlY3RUaHJlYWRfbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAotICAgICAgICBpbnQgRWZmZWN0SWQpCitzcDxBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U+IEF1ZGlvRmxpbmdlcjo6Z2V0RWZmZWN0VGhyZWFkX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgaW50IGVmZmVjdElkKQogewotICAgIHNwPFBsYXliYWNrVGhyZWFkPiB0aHJlYWQ7CisgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSktPmdldEVmZmVjdChzZXNzaW9uSWQsIEVmZmVjdElkKSAhPSAwKSB7CisgICAgICAgIGlmIChtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSktPmdldEVmZmVjdChzZXNzaW9uSWQsIGVmZmVjdElkKSAhPSAwKSB7CiAgICAgICAgICAgICBBTE9HX0FTU0VSVCh0aHJlYWQgPT0gMCk7CiAgICAgICAgICAgICB0aHJlYWQgPSBtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSk7CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBpZiAodGhyZWFkICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHRocmVhZDsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUmVjb3JkVGhyZWFkcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobVJlY29yZFRocmVhZHMudmFsdWVBdChpKS0+Z2V0RWZmZWN0KHNlc3Npb25JZCwgZWZmZWN0SWQpICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKHRocmVhZCA9PSAwKTsKKyAgICAgICAgICAgIHRocmVhZCA9IG1SZWNvcmRUaHJlYWRzLnZhbHVlQXQoaSk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHRocmVhZCAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiB0aHJlYWQ7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1tYXBUaHJlYWRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtTW1hcFRocmVhZHMudmFsdWVBdChpKS0+Z2V0RWZmZWN0KHNlc3Npb25JZCwgZWZmZWN0SWQpICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKHRocmVhZCA9PSAwKTsKKyAgICAgICAgICAgIHRocmVhZCA9IG1NbWFwVGhyZWFkcy52YWx1ZUF0KGkpOworICAgICAgICB9CisgICAgfQogICAgIHJldHVybiB0aHJlYWQ7CiB9CiAKQEAgLTE2MzYsNyArMTg0MSw3IEBACiAgICAgYm9vbCB1cGRhdGVQaWQgPSAoaW5wdXQuY2xpZW50SW5mby5jbGllbnRQaWQgPT0gLTEpOwogICAgIGNvbnN0IHVpZF90IGNhbGxpbmdVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CiAgICAgdWlkX3QgY2xpZW50VWlkID0gaW5wdXQuY2xpZW50SW5mby5jbGllbnRVaWQ7Ci0gICAgaWYgKCFpc1RydXN0ZWRDYWxsaW5nVWlkKGNhbGxpbmdVaWQpKSB7CisgICAgaWYgKCFpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZChjYWxsaW5nVWlkKSkgewogICAgICAgICBBTE9HV19JRihjbGllbnRVaWQgIT0gY2FsbGluZ1VpZCwKICAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyAlZCIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYWxsaW5nVWlkLCBjbGllbnRVaWQpOwpAQCAtMTY0NCw4ICsxODQ5LDggQEAKICAgICAgICAgdXBkYXRlUGlkID0gdHJ1ZTsKICAgICB9CiAgICAgcGlkX3QgY2xpZW50UGlkID0gaW5wdXQuY2xpZW50SW5mby5jbGllbnRQaWQ7CisgICAgY29uc3QgcGlkX3QgY2FsbGluZ1BpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICBpZiAodXBkYXRlUGlkKSB7Ci0gICAgICAgIGNvbnN0IHBpZF90IGNhbGxpbmdQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgICAgIEFMT0dXX0lGKGNsaWVudFBpZCAhPSAtMSAmJiBjbGllbnRQaWQgIT0gY2FsbGluZ1BpZCwKICAgICAgICAgICAgICAgICAgIiVzIHVpZCAlZCBwaWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzIHBpZCAlZCIsCiAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjYWxsaW5nVWlkLCBjYWxsaW5nUGlkLCBjbGllbnRQaWQpOwpAQCAtMTY5NCw2ICsxODk5LDcgQEAKICAgICAgICAgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKICAgICB9CiAgICAgbFN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRJbnB1dEZvckF0dHIoJmlucHV0LmF0dHIsICZvdXRwdXQuaW5wdXRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQucmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgY29tcGFyZSB0byBBdWRpb1RyYWNrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFBpZCwKQEAgLTE3MDEsMTIgKzE5MDcsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQub3BQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0LmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmZsYWdzLCAmb3V0cHV0LnNlbGVjdGVkRGV2aWNlSWQsICZwb3J0SWQpOworICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJjcmVhdGVSZWNvcmQoKSBnZXRJbnB1dEZvckF0dHIgcmV0dXJuIGVycm9yICVkIiwgbFN0YXR1cyk7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CiAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIFJlY29yZFRocmVhZCAqdGhyZWFkID0gY2hlY2tSZWNvcmRUaHJlYWRfbChvdXRwdXQuaW5wdXRJZCk7CiAgICAgICAgIGlmICh0aHJlYWQgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoImNyZWF0ZVJlY29yZCgpIGNoZWNrUmVjb3JkVGhyZWFkX2wgZmFpbGVkIik7CisgICAgICAgICAgICBBTE9HRSgiY3JlYXRlUmVjb3JkKCkgY2hlY2tSZWNvcmRUaHJlYWRfbCBmYWlsZWQsIGlucHV0IGhhbmRsZSAlZCIsIG91dHB1dC5pbnB1dElkKTsKICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgIH0KQEAgLTE3MjEsNyArMTkzMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbmZpZy5mb3JtYXQsIGlucHV0LmNvbmZpZy5jaGFubmVsX21hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQuZnJhbWVDb3VudCwgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0Lm5vdGlmaWNhdGlvbkZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFVpZCwgJm91dHB1dC5mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCwgY2xpZW50VWlkLCAmb3V0cHV0LmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jbGllbnRJbmZvLmNsaWVudFRpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxTdGF0dXMsIHBvcnRJZCk7CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKGxTdGF0dXMgPT0gTk9fRVJST1IpICYmIChyZWNvcmRUcmFjayA9PSAwKSk7CkBAIC0xNzUxLDYgKzE5NjEsNyBAQAogCiAgICAgb3V0cHV0LmNibGsgPSByZWNvcmRUcmFjay0+Z2V0Q2JsaygpOwogICAgIG91dHB1dC5idWZmZXJzID0gcmVjb3JkVHJhY2stPmdldEJ1ZmZlcnMoKTsKKyAgICBvdXRwdXQucG9ydElkID0gcG9ydElkOwogCiAgICAgLy8gcmV0dXJuIGhhbmRsZSB0byBjbGllbnQKICAgICByZWNvcmRIYW5kbGUgPSBuZXcgUmVjb3JkSGFuZGxlKHJlY29yZFRyYWNrKTsKQEAgLTE4NTQsNiArMjA2NSwxMCBAQAogCiAgICAgICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0lETEU7CiAgICAgfQorICAgIGlmIChzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCkgPT0gMCkgeworICAgICAgICAvLyBBbiBNU0QgbW9kdWxlIGlzIGluc2VydGVkIGJlZm9yZSBoYXJkd2FyZSBtb2R1bGVzIGluIG9yZGVyIHRvIG1peCBlbmNvZGVkIHN0cmVhbXMuCisgICAgICAgIGZsYWdzID0gc3RhdGljX2Nhc3Q8QXVkaW9Id0RldmljZTo6RmxhZ3M+KGZsYWdzIHwgQXVkaW9Id0RldmljZTo6QUhXRF9JU19JTlNFUlQpOworICAgIH0KIAogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUgPSAoYXVkaW9fbW9kdWxlX2hhbmRsZV90KSBuZXh0VW5pcXVlSWQoQVVESU9fVU5JUVVFX0lEX1VTRV9NT0RVTEUpOwogICAgIG1BdWRpb0h3RGV2cy5hZGQoaGFuZGxlLCBuZXcgQXVkaW9Id0RldmljZShoYW5kbGUsIG5hbWUsIGRldiwgZmxhZ3MpKTsKQEAgLTE4ODUsNyArMjEwMCw3IEBACiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnNldExvd1JhbURldmljZShib29sIGlzTG93UmFtRGV2aWNlLCBpbnQ2NF90IHRvdGFsTWVtb3J5KQogewogICAgIHVpZF90IHVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICBpZiAodWlkICE9IEFJRF9TWVNURU0pIHsKKyAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPclN5c3RlbVNlcnZlclVpZCh1aWQpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTE5MzAsNiArMjE0NSwyOCBAQAogICAgIHJldHVybiBtQ2xpZW50U2hhcmVkSGVhcFNpemU7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQoreworICAgIEFMT0dWKF9fZnVuY19fKTsKKworICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGU7CisgICAgaWYgKGNvbmZpZy0+dHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgIG1vZHVsZSA9IGNvbmZpZy0+ZXh0LmRldmljZS5od19tb2R1bGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbW9kdWxlID0gY29uZmlnLT5leHQubWl4Lmh3X21vZHVsZTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9Id0RldnMuaW5kZXhPZktleShtb2R1bGUpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coIiVzKCkgYmFkIGh3IG1vZHVsZSAlZCIsIF9fZnVuY19fLCBtb2R1bGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UgPSBtQXVkaW9Id0RldnMudmFsdWVBdChpbmRleCk7CisgICAgcmV0dXJuIGF1ZGlvSHdEZXZpY2UtPmh3RGV2aWNlKCktPnNldEF1ZGlvUG9ydENvbmZpZyhjb25maWcpOworfQorCiBhdWRpb19od19zeW5jX3QgQXVkaW9GbGluZ2VyOjpnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtMTk3NSw3ICsyMjEyLDEwIEBACiAgICAgICAgIGlmIChzZXNzaW9ucyAmIFRocmVhZEJhc2U6OlRSQUNLX1NFU1NJT04pIHsKICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKICAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1Id0F2U3luYyksIHZhbHVlKTsKLSAgICAgICAgICAgIHRocmVhZC0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIFN0cmluZzgga2V5VmFsdWVQYWlycyA9IHBhcmFtLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB0aHJlYWQtPnNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlycyk7CisgICAgICAgICAgICBmb3J3YXJkUGFyYW1ldGVyc1RvRG93bnN0cmVhbVBhdGNoZXNfbCh0aHJlYWQtPmlkKCksIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IHNwPFBsYXliYWNrVGhyZWFkPiYgdGhyZWFkKSB7IHJldHVybiB0aHJlYWQtPnVzZXNId0F2U3luYygpOyB9KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpAQCAtMjAyMSw3ICsyMjYxLDEwIEBACiAgICAgICAgIEFMT0dWKCJzZXRBdWRpb0h3U3luY0ZvclNlc3Npb25fbCBmb3VuZCBJRCAlZCBmb3Igc2Vzc2lvbiAlZCIsIHN5bmNJZCwgc2Vzc2lvbklkKTsKICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOwogICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtSHdBdlN5bmMpLCBzeW5jSWQpOwotICAgICAgICB0aHJlYWQtPnNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7CisgICAgICAgIFN0cmluZzgga2V5VmFsdWVQYWlycyA9IHBhcmFtLnRvU3RyaW5nKCk7CisgICAgICAgIHRocmVhZC0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgZm9yd2FyZFBhcmFtZXRlcnNUb0Rvd25zdHJlYW1QYXRjaGVzX2wodGhyZWFkLT5pZCgpLCBrZXlWYWx1ZVBhaXJzLAorICAgICAgICAgICAgICAgIFtdKGNvbnN0IHNwPFBsYXliYWNrVGhyZWFkPiYgdGhyZWFkKSB7IHJldHVybiB0aHJlYWQtPnVzZXNId0F2U3luYygpOyB9KTsKICAgICB9CiB9CiAKQEAgLTIxMTEsNiArMjM1NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgKm91dHB1dCwgdGhyZWFkLmdldCgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1QbGF5YmFja1RocmVhZHMuYWRkKCpvdXRwdXQsIHRocmVhZCk7CisgICAgICAgICAgICBtUGF0Y2hQYW5lbC5ub3RpZnlTdHJlYW1PcGVuZWQob3V0SHdEZXYsICpvdXRwdXQpOwogICAgICAgICAgICAgcmV0dXJuIHRocmVhZDsKICAgICAgICAgfQogICAgIH0KQEAgLTIyMDksNiArMjQ1Myw4IEBACiAgICAgICAgIGlmIChwbGF5YmFja1RocmVhZCAhPSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HVigiY2xvc2VPdXRwdXQoKSAlZCIsIG91dHB1dCk7CiAKKyAgICAgICAgICAgIGR1bXBUb1RocmVhZExvZ19sKHBsYXliYWNrVGhyZWFkKTsKKwogICAgICAgICAgICAgaWYgKHBsYXliYWNrVGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6TUlYRVIpIHsKICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS0+aXNEdXBsaWNhdGluZygpKSB7CkBAIC0yMjMxLDcgKzI0NzcsNyBAQAogICAgICAgICAgICAgICAgICAgICBWZWN0b3I8IHNwPEVmZmVjdENoYWluPiA+IGVmZmVjdENoYWlucyA9IHBsYXliYWNrVGhyZWFkLT5nZXRFZmZlY3RDaGFpbnNfbCgpOwogICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdENoYWlucy5zaXplKCk7IGkgKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVFZmZlY3RDaGFpbl9sKGVmZmVjdENoYWluc1tpXS0+c2Vzc2lvbklkKCksIHBsYXliYWNrVGhyZWFkLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RUaHJlYWQsIHRydWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RUaHJlYWQpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMjI0MCwxMiArMjQ4NiwxNCBAQAogICAgICAgICAgICAgaWYgKG1tYXBUaHJlYWQgPT0gMCkgewogICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBkdW1wVG9UaHJlYWRMb2dfbChtbWFwVGhyZWFkKTsKICAgICAgICAgICAgIG1NbWFwVGhyZWFkcy5yZW1vdmVJdGVtKG91dHB1dCk7CiAgICAgICAgICAgICBBTE9HRCgiY2xvc2luZyBtbWFwVGhyZWFkICVwIiwgbW1hcFRocmVhZC5nZXQoKSk7CiAgICAgICAgIH0KICAgICAgICAgY29uc3Qgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IGlvRGVzYyA9IG5ldyBBdWRpb0lvRGVzY3JpcHRvcigpOwogICAgICAgICBpb0Rlc2MtPm1Jb0hhbmRsZSA9IG91dHB1dDsKICAgICAgICAgaW9Db25maWdDaGFuZ2VkKEFVRElPX09VVFBVVF9DTE9TRUQsIGlvRGVzYyk7CisgICAgICAgIG1QYXRjaFBhbmVsLm5vdGlmeVN0cmVhbUNsb3NlZChvdXRwdXQpOwogICAgIH0KICAgICAvLyBUaGUgdGhyZWFkIGVudGl0eSAoYWN0aXZlIHVuaXQgb2YgZXhlY3V0aW9uKSBpcyBubyBsb25nZXIgcnVubmluZyBoZXJlLAogICAgIC8vIGJ1dCB0aGUgVGhyZWFkQmFzZSBjb250YWluZXIgc3RpbGwgZXhpc3RzLgpAQCAtMjI3NCw3ICsyNTIyLDcgQEAKICAgICBkZWxldGUgb3V0OwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6Y2xvc2VPdXRwdXRJbnRlcm5hbF9sKGNvbnN0IHNwPFBsYXliYWNrVGhyZWFkPiYgdGhyZWFkKQordm9pZCBBdWRpb0ZsaW5nZXI6OmNsb3NlVGhyZWFkSW50ZXJuYWxfbChjb25zdCBzcDxQbGF5YmFja1RocmVhZD4mIHRocmVhZCkKIHsKICAgICBtUGxheWJhY2tUaHJlYWRzLnJlbW92ZUl0ZW0odGhyZWFkLT5tSWQpOwogICAgIHRocmVhZC0+ZXhpdCgpOwpAQCAtMjMyNiw3ICsyNTc0LDggQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBvcGVuSW5wdXRfbChtb2R1bGUsIGlucHV0LCBjb25maWcsICpkZXZpY2VzLCBhZGRyZXNzLCBzb3VyY2UsIGZsYWdzKTsKKyAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBvcGVuSW5wdXRfbCgKKyAgICAgICAgICAgIG1vZHVsZSwgaW5wdXQsIGNvbmZpZywgKmRldmljZXMsIGFkZHJlc3MsIHNvdXJjZSwgZmxhZ3MsIEFVRElPX0RFVklDRV9OT05FLCBTdHJpbmc4e30pOwogCiAgICAgaWYgKHRocmVhZCAhPSAwKSB7CiAgICAgICAgIC8vIG5vdGlmeSBjbGllbnQgcHJvY2Vzc2VzIG9mIHRoZSBuZXcgaW5wdXQgY3JlYXRpb24KQEAgLTIzNDIsNyArMjU5MSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBvdXRwdXREZXZpY2VBZGRyZXNzKQogewogICAgIEF1ZGlvSHdEZXZpY2UgKmluSHdEZXYgPSBmaW5kU3VpdGFibGVId0Rldl9sKG1vZHVsZSwgZGV2aWNlcyk7CiAgICAgaWYgKGluSHdEZXYgPT0gTlVMTCkgewpAQCAtMjM1MCw2ICsyNjAxLDkgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCisgICAgLy8gU29tZSBmbGFncyBhcmUgc3BlY2lmaWMgdG8gZnJhbWV3b3JrIGFuZCBtdXN0IG5vdCBsZWFrIHRvIHRoZSBIQUwuCisgICAgZmxhZ3MgPSBzdGF0aWNfY2FzdDxhdWRpb19pbnB1dF9mbGFnc190PihmbGFncyAmIH5BVURJT19JTlBVVF9GUkFNRVdPUktfRkxBR1MpOworCiAgICAgLy8gQXVkaW8gUG9saWN5IGNhbiByZXF1ZXN0IGEgc3BlY2lmaWMgaGFuZGxlIGZvciBoYXJkd2FyZSBob3R3b3JkLgogICAgIC8vIFRoZSBnb2FsIGhlcmUgaXMgbm90IHRvIHJlLW9wZW4gYW4gYWxyZWFkeSBvcGVuZWQgaW5wdXQuCiAgICAgLy8gSXQgaXMgdG8gdXNlIGEgcHJlLWFzc2lnbmVkIEkvTyBoYW5kbGUuCkBAIC0yMzY4LDcgKzI2MjIsOCBAQAogICAgIHNwPERldmljZUhhbEludGVyZmFjZT4gaW5Id0hhbCA9IGluSHdEZXYtPmh3RGV2aWNlKCk7CiAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+IGluU3RyZWFtOwogICAgIHN0YXR1c190IHN0YXR1cyA9IGluSHdIYWwtPm9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgICAgICppbnB1dCwgZGV2aWNlcywgJmhhbGNvbmZpZywgZmxhZ3MsIGFkZHJlc3Muc3RyaW5nKCksIHNvdXJjZSwgJmluU3RyZWFtKTsKKyAgICAgICAgICAgICppbnB1dCwgZGV2aWNlcywgJmhhbGNvbmZpZywgZmxhZ3MsIGFkZHJlc3Muc3RyaW5nKCksIHNvdXJjZSwKKyAgICAgICAgICAgIG91dHB1dERldmljZSwgb3V0cHV0RGV2aWNlQWRkcmVzcywgJmluU3RyZWFtKTsKICAgICBBTE9HVigib3BlbklucHV0X2woKSBvcGVuSW5wdXRTdHJlYW0gcmV0dXJuZWQgaW5wdXQgJXAsIGRldmljZXMgJSN4LCBTYW1wbGluZ1JhdGUgJWQiCiAgICAgICAgICAgICIsIEZvcm1hdCAlI3gsIENoYW5uZWxzICUjeCwgZmxhZ3MgJSN4LCBzdGF0dXMgJWQgYWRkciAlcyIsCiAgICAgICAgICAgICBpblN0cmVhbS5nZXQoKSwKQEAgLTIzOTEsNyArMjY0Niw4IEBACiAgICAgICAgIEFMT0dWKCJvcGVuSW5wdXRfbCgpIHJlb3BlbmluZyB3aXRoIHByb3Bvc2VkIHNhbXBsaW5nIHJhdGUgYW5kIGNoYW5uZWwgbWFzayIpOwogICAgICAgICBpblN0cmVhbS5jbGVhcigpOwogICAgICAgICBzdGF0dXMgPSBpbkh3SGFsLT5vcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICAgICAgKmlucHV0LCBkZXZpY2VzLCAmaGFsY29uZmlnLCBmbGFncywgYWRkcmVzcy5zdHJpbmcoKSwgc291cmNlLCAmaW5TdHJlYW0pOworICAgICAgICAgICAgICAgICppbnB1dCwgZGV2aWNlcywgJmhhbGNvbmZpZywgZmxhZ3MsIGFkZHJlc3Muc3RyaW5nKCksIHNvdXJjZSwKKyAgICAgICAgICAgICAgICBvdXRwdXREZXZpY2UsIG91dHB1dERldmljZUFkZHJlc3MsICZpblN0cmVhbSk7CiAgICAgICAgIC8vIEZJWE1FIGxvZyB0aGlzIG5ldyBzdGF0dXM7IEhBTCBzaG91bGQgbm90IHByb3Bvc2UgYW55IGZ1cnRoZXIgY2hhbmdlcwogICAgIH0KIApAQCAtMjQwNyw1NSArMjY2Myw2IEBACiAgICAgICAgICAgICAgICAgICAgIHRocmVhZC5nZXQoKSk7CiAgICAgICAgICAgICByZXR1cm4gdGhyZWFkOwogICAgICAgICB9IGVsc2UgewotI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgICAgICAvLyBUcnkgdG8gcmUtdXNlIG1vc3QgcmVjZW50bHkgdXNlZCBQaXBlIHRvIGFyY2hpdmUgYSBjb3B5IG9mIGlucHV0IGZvciBkdW1wc3lzLAotICAgICAgICAgICAgLy8gb3IgKHJlLSljcmVhdGUgaWYgY3VycmVudCBQaXBlIGlzIGlkbGUgYW5kIGRvZXMgbm90IG1hdGNoIHRoZSBuZXcgZm9ybWF0Ci0gICAgICAgICAgICBzcDxOQkFJT19TaW5rPiB0ZWVTaW5rOwotICAgICAgICAgICAgZW51bSB7Ci0gICAgICAgICAgICAgICAgVEVFX1NJTktfTk8sICAgIC8vIGRvbid0IGNvcHkgaW5wdXQKLSAgICAgICAgICAgICAgICBURUVfU0lOS19ORVcsICAgLy8gY29weSBpbnB1dCB1c2luZyBhIG5ldyBwaXBlCi0gICAgICAgICAgICAgICAgVEVFX1NJTktfT0xELCAgIC8vIGNvcHkgaW5wdXQgdXNpbmcgYW4gZXhpc3RpbmcgcGlwZQotICAgICAgICAgICAgfSBraW5kOwotICAgICAgICAgICAgTkJBSU9fRm9ybWF0IGZvcm1hdCA9IEZvcm1hdF9mcm9tX1NSX0MoaGFsY29uZmlnLnNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhoYWxjb25maWcuY2hhbm5lbF9tYXNrKSwgaGFsY29uZmlnLmZvcm1hdCk7Ci0gICAgICAgICAgICBpZiAoIW1UZWVTaW5rSW5wdXRFbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05POwotICAgICAgICAgICAgfSBlbHNlIGlmICghRm9ybWF0X2lzVmFsaWQoZm9ybWF0KSkgewotICAgICAgICAgICAgICAgIGtpbmQgPSBURUVfU0lOS19OTzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVJlY29yZFRlZVNpbmsgPT0gMCkgewotICAgICAgICAgICAgICAgIGtpbmQgPSBURUVfU0lOS19ORVc7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1SZWNvcmRUZWVTaW5rLT5nZXRTdHJvbmdDb3VudCgpICE9IDEpIHsKLSAgICAgICAgICAgICAgICBraW5kID0gVEVFX1NJTktfTk87Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKEZvcm1hdF9pc0VxdWFsKGZvcm1hdCwgbVJlY29yZFRlZVNpbmstPmZvcm1hdCgpKSkgewotICAgICAgICAgICAgICAgIGtpbmQgPSBURUVfU0lOS19PTEQ7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGtpbmQgPSBURUVfU0lOS19ORVc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKGtpbmQpIHsKLSAgICAgICAgICAgIGNhc2UgVEVFX1NJTktfTkVXOiB7Ci0gICAgICAgICAgICAgICAgUGlwZSAqcGlwZSA9IG5ldyBQaXBlKG1UZWVTaW5rSW5wdXRGcmFtZXMsIGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgICAgICAgICAgICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbMV0gPSB7Zm9ybWF0fTsKLSAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gcGlwZS0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7Ci0gICAgICAgICAgICAgICAgUGlwZVJlYWRlciAqcGlwZVJlYWRlciA9IG5ldyBQaXBlUmVhZGVyKCpwaXBlKTsKLSAgICAgICAgICAgICAgICBudW1Db3VudGVyT2ZmZXJzID0gMDsKLSAgICAgICAgICAgICAgICBpbmRleCA9IHBpcGVSZWFkZXItPm5lZ290aWF0ZShvZmZlcnMsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOwotICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGluZGV4ID09IDApOwotICAgICAgICAgICAgICAgIG1SZWNvcmRUZWVTaW5rID0gcGlwZTsKLSAgICAgICAgICAgICAgICBtUmVjb3JkVGVlU291cmNlID0gcGlwZVJlYWRlcjsKLSAgICAgICAgICAgICAgICB0ZWVTaW5rID0gcGlwZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRFRV9TSU5LX09MRDoKLSAgICAgICAgICAgICAgICB0ZWVTaW5rID0gbVJlY29yZFRlZVNpbms7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFRFRV9TSU5LX05POgotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSNlbmRpZgotCiAgICAgICAgICAgICAvLyBTdGFydCByZWNvcmQgdGhyZWFkCiAgICAgICAgICAgICAvLyBSZWNvcmRUaHJlYWQgcmVxdWlyZXMgYm90aCBpbnB1dCBhbmQgb3V0cHV0IGRldmljZSBpbmRpY2F0aW9uIHRvIGZvcndhcmQgdG8gYXVkaW8KICAgICAgICAgICAgIC8vIHByZSBwcm9jZXNzaW5nIG1vZHVsZXMKQEAgLTI0NjUsOSArMjY3Miw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlPdXRwdXREZXZpY2VfbCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUmVhZHkKLSNpZmRlZiBURUVfU0lOSwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHRlZVNpbmsKLSNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgbVJlY29yZFRocmVhZHMuYWRkKCppbnB1dCwgdGhyZWFkKTsKICAgICAgICAgICAgIEFMT0dWKCJvcGVuSW5wdXRfbCgpIGNyZWF0ZWQgcmVjb3JkIHRocmVhZDogSUQgJWQgdGhyZWFkICVwIiwgKmlucHV0LCB0aHJlYWQuZ2V0KCkpOwpAQCAtMjQ5Niw2ICsyNzAwLDggQEAKICAgICAgICAgaWYgKHJlY29yZFRocmVhZCAhPSAwKSB7CiAgICAgICAgICAgICBBTE9HVigiY2xvc2VJbnB1dCgpICVkIiwgaW5wdXQpOwogCisgICAgICAgICAgICBkdW1wVG9UaHJlYWRMb2dfbChyZWNvcmRUaHJlYWQpOworCiAgICAgICAgICAgICAvLyBJZiB3ZSBzdGlsbCBoYXZlIGVmZmVjdCBjaGFpbnMsIGl0IG1lYW5zIHRoYXQgYSBjbGllbnQgc3RpbGwgaG9sZHMgYSBoYW5kbGUKICAgICAgICAgICAgIC8vIG9uIGF0IGxlYXN0IG9uZSBlZmZlY3QuIFdlIG11c3QgZWl0aGVyIG1vdmUgdGhlIGNoYWluIHRvIGFuIGV4aXN0aW5nIHRocmVhZCB3aXRoIHRoZQogICAgICAgICAgICAgLy8gc2FtZSBzZXNzaW9uIElEIG9yIHB1dCBpdCBhc2lkZSBpbiBjYXNlIGEgbmV3IHJlY29yZCB0aHJlYWQgaXMgb3BlbmVkIGZvciBhCkBAIC0yNTM4LDYgKzI3NDQsNyBAQAogICAgICAgICAgICAgaWYgKG1tYXBUaHJlYWQgPT0gMCkgewogICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBkdW1wVG9UaHJlYWRMb2dfbChtbWFwVGhyZWFkKTsKICAgICAgICAgICAgIG1NbWFwVGhyZWFkcy5yZW1vdmVJdGVtKGlucHV0KTsKICAgICAgICAgfQogICAgICAgICBjb25zdCBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gaW9EZXNjID0gbmV3IEF1ZGlvSW9EZXNjcmlwdG9yKCk7CkBAIC0yNTY3LDcgKzI3NzQsNyBAQAogICAgIGRlbGV0ZSBpbjsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OmNsb3NlSW5wdXRJbnRlcm5hbF9sKGNvbnN0IHNwPFJlY29yZFRocmVhZD4mIHRocmVhZCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpjbG9zZVRocmVhZEludGVybmFsX2woY29uc3Qgc3A8UmVjb3JkVGhyZWFkPiYgdGhyZWFkKQogewogICAgIG1SZWNvcmRUaHJlYWRzLnJlbW92ZUl0ZW0odGhyZWFkLT5tSWQpOwogICAgIGNsb3NlSW5wdXRGaW5pc2godGhyZWFkKTsKQEAgLTI2MDUsNyArMjgxMiw4IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBwaWRfdCBjYWxsZXIgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgQUxPR1YoImFjcXVpcmluZyAlZCBmcm9tICVkLCBmb3IgJWQiLCBhdWRpb1Nlc3Npb24sIGNhbGxlciwgcGlkKTsKLSAgICBpZiAocGlkICE9IC0xICYmIChjYWxsZXIgPT0gZ2V0cGlkX2NhY2hlZCkpIHsKKyAgICBjb25zdCB1aWRfdCBjYWxsZXJVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgaWYgKHBpZCAhPSAtMSAmJiBpc0F1ZGlvU2VydmVyVWlkKGNhbGxlclVpZCkpIHsgLy8gY2hlY2sgbXVzdCBtYXRjaCByZWxlYXNlQXVkaW9TZXNzaW9uSWQoKQogICAgICAgICBjYWxsZXIgPSBwaWQ7CiAgICAgfQogCkBAIC0yNjM2LDI5ICsyODQ0LDQwIEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQoYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbiwgcGlkX3QgcGlkKQogewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcGlkX3QgY2FsbGVyID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotICAgIEFMT0dWKCJyZWxlYXNpbmcgJWQgZnJvbSAlZCBmb3IgJWQiLCBhdWRpb1Nlc3Npb24sIGNhbGxlciwgcGlkKTsKLSAgICBpZiAocGlkICE9IC0xICYmIChjYWxsZXIgPT0gZ2V0cGlkX2NhY2hlZCkpIHsKLSAgICAgICAgY2FsbGVyID0gcGlkOwotICAgIH0KLSAgICBzaXplX3QgbnVtID0gbUF1ZGlvU2Vzc2lvblJlZnMuc2l6ZSgpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKLSAgICAgICAgQXVkaW9TZXNzaW9uUmVmICpyZWYgPSBtQXVkaW9TZXNzaW9uUmVmcy5pdGVtQXQoaSk7Ci0gICAgICAgIGlmIChyZWYtPm1TZXNzaW9uaWQgPT0gYXVkaW9TZXNzaW9uICYmIHJlZi0+bVBpZCA9PSBjYWxsZXIpIHsKLSAgICAgICAgICAgIHJlZi0+bUNudC0tOwotICAgICAgICAgICAgQUxPR1YoIiBkZWNyZW1lbnRlZCByZWZjb3VudCB0byAlZCIsIHJlZi0+bUNudCk7Ci0gICAgICAgICAgICBpZiAocmVmLT5tQ250ID09IDApIHsKLSAgICAgICAgICAgICAgICBtQXVkaW9TZXNzaW9uUmVmcy5yZW1vdmVBdChpKTsKLSAgICAgICAgICAgICAgICBkZWxldGUgcmVmOwotICAgICAgICAgICAgICAgIHB1cmdlU3RhbGVFZmZlY3RzX2woKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKKyAgICBzdGQ6OnZlY3Rvcjwgc3A8RWZmZWN0TW9kdWxlPiA+IHJlbW92ZWRFZmZlY3RzOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgcGlkX3QgY2FsbGVyID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgICAgICBBTE9HVigicmVsZWFzaW5nICVkIGZyb20gJWQgZm9yICVkIiwgYXVkaW9TZXNzaW9uLCBjYWxsZXIsIHBpZCk7CisgICAgICAgIGNvbnN0IHVpZF90IGNhbGxlclVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICAgICAgaWYgKHBpZCAhPSAtMSAmJiBpc0F1ZGlvU2VydmVyVWlkKGNhbGxlclVpZCkpIHsgLy8gY2hlY2sgbXVzdCBtYXRjaCBhY3F1aXJlQXVkaW9TZXNzaW9uSWQoKQorICAgICAgICAgICAgY2FsbGVyID0gcGlkOwogICAgICAgICB9CisgICAgICAgIHNpemVfdCBudW0gPSBtQXVkaW9TZXNzaW9uUmVmcy5zaXplKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKyAgICAgICAgICAgIEF1ZGlvU2Vzc2lvblJlZiAqcmVmID0gbUF1ZGlvU2Vzc2lvblJlZnMuaXRlbUF0KGkpOworICAgICAgICAgICAgaWYgKHJlZi0+bVNlc3Npb25pZCA9PSBhdWRpb1Nlc3Npb24gJiYgcmVmLT5tUGlkID09IGNhbGxlcikgeworICAgICAgICAgICAgICAgIHJlZi0+bUNudC0tOworICAgICAgICAgICAgICAgIEFMT0dWKCIgZGVjcmVtZW50ZWQgcmVmY291bnQgdG8gJWQiLCByZWYtPm1DbnQpOworICAgICAgICAgICAgICAgIGlmIChyZWYtPm1DbnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtQXVkaW9TZXNzaW9uUmVmcy5yZW1vdmVBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlZjsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8IHNwPEVmZmVjdE1vZHVsZT4gPiBlZmZlY3RzID0gcHVyZ2VTdGFsZUVmZmVjdHNfbCgpOworICAgICAgICAgICAgICAgICAgICByZW1vdmVkRWZmZWN0cy5pbnNlcnQocmVtb3ZlZEVmZmVjdHMuZW5kKCksIGVmZmVjdHMuYmVnaW4oKSwgZWZmZWN0cy5lbmQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBJZiB0aGUgY2FsbGVyIGlzIGF1ZGlvc2VydmVyIGl0IGlzIGxpa2VseSB0aGF0IHRoZSBzZXNzaW9uIGJlaW5nIHJlbGVhc2VkIHdhcyBhY3F1aXJlZAorICAgICAgICAvLyBvbiBiZWhhbGYgb2YgYSBwcm9jZXNzIG5vdCBpbiBub3RpZmljYXRpb24gY2xpZW50cyBhbmQgd2UgaWdub3JlIHRoZSB3YXJuaW5nLgorICAgICAgICBBTE9HV19JRighaXNBdWRpb1NlcnZlclVpZChjYWxsZXJVaWQpLAorICAgICAgICAgICAgICAgICAic2Vzc2lvbiBpZCAlZCBub3QgZm91bmQgZm9yIHBpZCAlZCIsIGF1ZGlvU2Vzc2lvbiwgY2FsbGVyKTsKICAgICB9Ci0gICAgLy8gSWYgdGhlIGNhbGxlciBpcyBtZWRpYXNlcnZlciBpdCBpcyBsaWtlbHkgdGhhdCB0aGUgc2Vzc2lvbiBiZWluZyByZWxlYXNlZCB3YXMgYWNxdWlyZWQKLSAgICAvLyBvbiBiZWhhbGYgb2YgYSBwcm9jZXNzIG5vdCBpbiBub3RpZmljYXRpb24gY2xpZW50cyBhbmQgd2UgaWdub3JlIHRoZSB3YXJuaW5nLgotICAgIEFMT0dXX0lGKGNhbGxlciAhPSBnZXRwaWRfY2FjaGVkLCAic2Vzc2lvbiBpZCAlZCBub3QgZm91bmQgZm9yIHBpZCAlZCIsIGF1ZGlvU2Vzc2lvbiwgY2FsbGVyKTsKKworRXhpdDoKKyAgICBmb3IgKGF1dG8mIGVmZmVjdCA6IHJlbW92ZWRFZmZlY3RzKSB7CisgICAgICAgIGVmZmVjdC0+dXBkYXRlUG9saWN5U3RhdGUoKTsKKyAgICB9CiB9CiAKIGJvb2wgQXVkaW9GbGluZ2VyOjppc1Nlc3Npb25BY3F1aXJlZF9sKGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24pCkBAIC0yNjczLDExICsyODkyLDEyIEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6cHVyZ2VTdGFsZUVmZmVjdHNfbCgpIHsKK3N0ZDo6dmVjdG9yPHNwPEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlPj4gQXVkaW9GbGluZ2VyOjpwdXJnZVN0YWxlRWZmZWN0c19sKCkgewogCiAgICAgQUxPR1YoInB1cmdpbmcgc3RhbGUgZWZmZWN0cyIpOwogCiAgICAgVmVjdG9yPCBzcDxFZmZlY3RDaGFpbj4gPiBjaGFpbnM7CisgICAgc3RkOjp2ZWN0b3I8IHNwPEVmZmVjdE1vZHVsZT4gPiByZW1vdmVkRWZmZWN0czsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgewogICAgICAgICBzcDxQbGF5YmFja1RocmVhZD4gdCA9IG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKTsKQEAgLTI2ODksNiArMjkwOSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CisKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1SZWNvcmRUaHJlYWRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPFJlY29yZFRocmVhZD4gdCA9IG1SZWNvcmRUaHJlYWRzLnZhbHVlQXQoaSk7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0LT5tTG9jayk7CkBAIC0yNjk4LDYgKzI5MTksMTUgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1tYXBUaHJlYWRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPE1tYXBUaHJlYWQ+IHQgPSBtTW1hcFRocmVhZHMudmFsdWVBdChpKTsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHQtPm1Mb2NrKTsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCB0LT5tRWZmZWN0Q2hhaW5zLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICBzcDxFZmZlY3RDaGFpbj4gZWMgPSB0LT5tRWZmZWN0Q2hhaW5zW2pdOworICAgICAgICAgICAgY2hhaW5zLnB1c2goZWMpOworICAgICAgICB9CisgICAgfQorCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjaGFpbnMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGVjID0gY2hhaW5zW2ldOwogICAgICAgICBpbnQgc2Vzc2lvbmlkID0gZWMtPnNlc3Npb25JZCgpOwpAQCAtMjcyNiwxMSArMjk1NiwyMiBAQAogICAgICAgICAgICAgICAgIGlmIChlZmZlY3QtPnB1cmdlSGFuZGxlcygpKSB7CiAgICAgICAgICAgICAgICAgICAgIHQtPmNoZWNrU3VzcGVuZE9uRWZmZWN0RW5hYmxlZF9sKGVmZmVjdCwgZmFsc2UsIGVmZmVjdC0+c2Vzc2lvbklkKCkpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6dW5yZWdpc3RlckVmZmVjdChlZmZlY3QtPmlkKCkpOworICAgICAgICAgICAgICAgIHJlbW92ZWRFZmZlY3RzLnB1c2hfYmFjayhlZmZlY3QpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybjsKKyAgICByZXR1cm4gcmVtb3ZlZEVmZmVjdHM7Cit9CisKKy8vIGR1bXBUb1RocmVhZExvZ19sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKK3ZvaWQgQXVkaW9GbGluZ2VyOjpkdW1wVG9UaHJlYWRMb2dfbChjb25zdCBzcDxUaHJlYWRCYXNlPiAmdGhyZWFkKQoreworICAgIGF1ZGlvX3V0aWxzOjpGZFRvU3RyaW5nIGZkVG9TdHJpbmc7CisgICAgY29uc3QgaW50IGZkID0gZmRUb1N0cmluZy5mZCgpOworICAgIGlmIChmZCA+PSAwKSB7CisgICAgICAgIHRocmVhZC0+ZHVtcChmZCwge30gLyogYXJncyAqLyk7CisgICAgICAgIG1UaHJlYWRMb2cubG9ncygtMSAvKiB0aW1lICovLCBmZFRvU3RyaW5nLmdldFN0cmluZ0FuZENsb3NlKCkpOworICAgIH0KIH0KIAogLy8gY2hlY2tUaHJlYWRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCkBAIC0yOTM4LDE2ICszMTc5LDc0IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6Z2V0RWZmZWN0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICpwVXVpZCwKLSAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcikgY29uc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwVHlwZVV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlZmVycmVkVHlwZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcikgY29uc3QKIHsKKyAgICBpZiAocFV1aWQgPT0gTlVMTCB8fCBwVHlwZVV1aWQgPT0gTlVMTCB8fCBkZXNjcmlwdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnlIYWwuZ2V0KCkpIHsKLSAgICAgICAgcmV0dXJuIG1FZmZlY3RzRmFjdG9yeUhhbC0+Z2V0RGVzY3JpcHRvcihwVXVpZCwgZGVzY3JpcHRvcik7Ci0gICAgfSBlbHNlIHsKKworICAgIGlmICghbUVmZmVjdHNGYWN0b3J5SGFsLmdldCgpKSB7CiAgICAgICAgIHJldHVybiAtRU5PREVWOwogICAgIH0KLX0KIAorICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGlmICghRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U6OmlzTnVsbFV1aWQocFV1aWQpKSB7CisgICAgICAgIC8vIElmIHV1aWQgaXMgc3BlY2lmaWVkLCByZXF1ZXN0IGVmZmVjdCBkZXNjcmlwdG9yIGZyb20gdGhhdC4KKyAgICAgICAgc3RhdHVzID0gbUVmZmVjdHNGYWN0b3J5SGFsLT5nZXREZXNjcmlwdG9yKHBVdWlkLCBkZXNjcmlwdG9yKTsKKyAgICB9IGVsc2UgaWYgKCFFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTo6aXNOdWxsVXVpZChwVHlwZVV1aWQpKSB7CisgICAgICAgIC8vIElmIHV1aWQgaXMgbm90IHNwZWNpZmllZCwgbG9vayBmb3IgYW4gYXZhaWxhYmxlIGltcGxlbWVudGF0aW9uCisgICAgICAgIC8vIG9mIHRoZSByZXF1aXJlZCB0eXBlIGluc3RlYWQuCisKKyAgICAgICAgLy8gVXNlIGEgdGVtcG9yYXJ5IGRlc2NyaXB0b3IgdG8gYXZvaWQgbW9kaWZ5aW5nIHxkZXNjcmlwdG9yfCBpbiB0aGUgZmFpbHVyZSBjYXNlLgorICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2M7CisgICAgICAgIGRlc2MuZmxhZ3MgPSAwOyAvLyBwcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmcKKworICAgICAgICB1aW50MzJfdCBudW1FZmZlY3RzID0gMDsKKyAgICAgICAgc3RhdHVzID0gbUVmZmVjdHNGYWN0b3J5SGFsLT5xdWVyeU51bWJlckVmZmVjdHMoJm51bUVmZmVjdHMpOworICAgICAgICBpZiAoc3RhdHVzIDwgMCkgeworICAgICAgICAgICAgQUxPR1coImdldEVmZmVjdERlc2NyaXB0b3IoKSBlcnJvciAlZCBmcm9tIEZhY3RvcnlIYWwgcXVlcnlOdW1iZXJFZmZlY3RzIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1FZmZlY3RzOyBpKyspIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1FZmZlY3RzRmFjdG9yeUhhbC0+Z2V0RGVzY3JpcHRvcihpLCAmZGVzYyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzIDwgMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJnZXRFZmZlY3REZXNjcmlwdG9yKCkgZXJyb3IgJWQgZnJvbSBGYWN0b3J5SGFsIGdldERlc2NyaXB0b3IiLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1lbWNtcCgmZGVzYy50eXBlLCBwVHlwZVV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIElmIG1hdGNoaW5nIHR5cGUgZm91bmQgc2F2ZSBlZmZlY3QgZGVzY3JpcHRvci4KKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgKmRlc2NyaXB0b3IgPSBkZXNjOworCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBubyBwcmVmZXJyZWQgZmxhZyBvciB0aGlzIGRlc2NyaXB0b3IgbWF0Y2hlcyB0aGUgcHJlZmVycmVkCisgICAgICAgICAgICAgICAgLy8gZmxhZywgc3VjY2VzcyEgSWYgdGhpcyBkZXNjcmlwdG9yIGRvZXNuJ3QgbWF0Y2ggdGhlIHByZWZlcnJlZAorICAgICAgICAgICAgICAgIC8vIGZsYWcsIGNvbnRpbnVlIGVudW1lcmF0aW9uIGluIGNhc2UgYSBiZXR0ZXIgbWF0Y2hpbmcgdmVyc2lvbiBvZiB0aGlzCisgICAgICAgICAgICAgICAgLy8gZWZmZWN0IHR5cGUgaXMgYXZhaWxhYmxlLiBOb3RlIHRoYXQgdGhpcyBtZWFucyBpZiBubyBlZmZlY3Qgd2l0aCBhCisgICAgICAgICAgICAgICAgLy8gY29ycmVjdCBmbGFnIGlzIGZvdW5kLCB0aGUgZGVzY3JpcHRvciByZXR1cm5lZCB3aWxsIGNvcnJlc3BvbmQgdG8gdGhlCisgICAgICAgICAgICAgICAgLy8gbGFzdCBlZmZlY3QgdGhhdCBhdCBsZWFzdCBoYWQgYSBtYXRjaGluZyB0eXBlIHV1aWQgKGlmIGFueSkuCisgICAgICAgICAgICAgICAgaWYgKHByZWZlcnJlZFR5cGVGbGFnID09IEVGRkVDVF9GTEFHX1RZUEVfTUFTSyB8fAorICAgICAgICAgICAgICAgICAgICAoZGVzYy5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gcHJlZmVycmVkVHlwZUZsYWcpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgc3RhdHVzID0gTkFNRV9OT1RfRk9VTkQ7CisgICAgICAgICAgICBBTE9HVygiZ2V0RWZmZWN0RGVzY3JpcHRvcigpOiBFZmZlY3Qgbm90IGZvdW5kIGJ5IHR5cGUuIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCJnZXRFZmZlY3REZXNjcmlwdG9yKCk6IEVpdGhlciB1dWlkIG9yIHR5cGUgdXVpZCBtdXN0IGJlIG5vbi1udWxsIFVVSURzLiIpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQogCiBzcDxJRWZmZWN0PiBBdWRpb0ZsaW5nZXI6OmNyZWF0ZUVmZmVjdCgKICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2MsCkBAIC0yOTY2LDcgKzMyNjUsNyBAQAogICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYzsKIAogICAgIGNvbnN0IHVpZF90IGNhbGxpbmdVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgaWYgKHBpZCA9PSAtMSB8fCAhaXNUcnVzdGVkQ2FsbGluZ1VpZChjYWxsaW5nVWlkKSkgeworICAgIGlmIChwaWQgPT0gLTEgfHwgIWlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKGNhbGxpbmdVaWQpKSB7CiAgICAgICAgIGNvbnN0IHBpZF90IGNhbGxpbmdQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgICAgIEFMT0dXX0lGKHBpZCAhPSAtMSAmJiBwaWQgIT0gY2FsbGluZ1BpZCwKICAgICAgICAgICAgICAgICAgIiVzIHVpZCAlZCBwaWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzIHBpZCAlZCIsCkBAIC0yOTgyLDg0ICszMjgxLDU1IEBACiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKLSAgICAvLyBjaGVjayBhdWRpbyBzZXR0aW5ncyBwZXJtaXNzaW9uIGZvciBnbG9iYWwgZWZmZWN0cwotICAgIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYICYmICFzZXR0aW5nc0FsbG93ZWQoKSkgewotICAgICAgICBsU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KLSAgICAvLyBTZXNzaW9uIEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFIGlzIHJlc2VydmVkIGZvciBvdXRwdXQgc3RhZ2UgZWZmZWN0cwotICAgIC8vIHRoYXQgY2FuIG9ubHkgYmUgY3JlYXRlZCBieSBhdWRpbyBwb2xpY3kgbWFuYWdlciAocnVubmluZyBpbiBzYW1lIHByb2Nlc3MpCi0gICAgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSAmJiBnZXRwaWRfY2FjaGVkICE9IHBpZCkgewotICAgICAgICBsU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgICAgIGdvdG8gRXhpdDsKLSAgICB9Ci0KICAgICBpZiAobUVmZmVjdHNGYWN0b3J5SGFsID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBubyBlZmZlY3RzIGZhY3RvcnkgaGFsIiwgX19mdW5jX18pOwogICAgICAgICBsU3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KIAotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLQotICAgICAgICBpZiAoIUVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOjppc051bGxVdWlkKCZwRGVzYy0+dXVpZCkpIHsKLSAgICAgICAgICAgIC8vIGlmIHV1aWQgaXMgc3BlY2lmaWVkLCByZXF1ZXN0IGVmZmVjdCBkZXNjcmlwdG9yCi0gICAgICAgICAgICBsU3RhdHVzID0gbUVmZmVjdHNGYWN0b3J5SGFsLT5nZXREZXNjcmlwdG9yKCZwRGVzYy0+dXVpZCwgJmRlc2MpOwotICAgICAgICAgICAgaWYgKGxTdGF0dXMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUVmZmVjdCgpIGVycm9yICVkIGZyb20gRWZmZWN0R2V0RGVzY3JpcHRvciIsIGxTdGF0dXMpOwotICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGlmIHV1aWQgaXMgbm90IHNwZWNpZmllZCwgbG9vayBmb3IgYW4gYXZhaWxhYmxlIGltcGxlbWVudGF0aW9uCi0gICAgICAgICAgICAvLyBvZiB0aGUgcmVxdWlyZWQgdHlwZSBpbiBlZmZlY3QgZmFjdG9yeQotICAgICAgICAgICAgaWYgKEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOjppc051bGxVdWlkKCZwRGVzYy0+dHlwZSkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlRWZmZWN0KCkgbm8gZWZmZWN0IHR5cGUiKTsKLSAgICAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpbnQzMl90IG51bUVmZmVjdHMgPSAwOwotICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkOwotICAgICAgICAgICAgZC5mbGFncyA9IDA7IC8vIHByZXZlbnQgY29tcGlsZXIgd2FybmluZwotICAgICAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwotCi0gICAgICAgICAgICBsU3RhdHVzID0gbUVmZmVjdHNGYWN0b3J5SGFsLT5xdWVyeU51bWJlckVmZmVjdHMoJm51bUVmZmVjdHMpOwotICAgICAgICAgICAgaWYgKGxTdGF0dXMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUVmZmVjdCgpIGVycm9yICVkIGZyb20gRWZmZWN0UXVlcnlOdW1iZXJFZmZlY3RzIiwgbFN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgZ290byBFeGl0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bUVmZmVjdHM7IGkrKykgewotICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBtRWZmZWN0c0ZhY3RvcnlIYWwtPmdldERlc2NyaXB0b3IoaSwgJmRlc2MpOwotICAgICAgICAgICAgICAgIGlmIChsU3RhdHVzIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlRWZmZWN0KCkgZXJyb3IgJWQgZnJvbSBFZmZlY3RRdWVyeUVmZmVjdCIsIGxTdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1lbWNtcCgmZGVzYy50eXBlLCAmcERlc2MtPnR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAvLyBJZiBtYXRjaGluZyB0eXBlIGZvdW5kIHNhdmUgZWZmZWN0IGRlc2NyaXB0b3IuIElmIHRoZSBzZXNzaW9uIGlzCi0gICAgICAgICAgICAgICAgICAgIC8vIDAgYW5kIHRoZSBlZmZlY3QgaXMgbm90IGF1eGlsaWFyeSwgY29udGludWUgZW51bWVyYXRpb24gaW4gY2FzZQotICAgICAgICAgICAgICAgICAgICAvLyBhbiBhdXhpbGlhcnkgdmVyc2lvbiBvZiB0aGlzIGVmZmVjdCB0eXBlIGlzIGF2YWlsYWJsZQotICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGQgPSBkZXNjOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbklkICE9IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlRWZmZWN0KCkgZWZmZWN0IG5vdCBmb3VuZCIpOwotICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEZvciBzYW1lIGVmZmVjdCB0eXBlLCBjaG9zZSBhdXhpbGlhcnkgdmVyc2lvbiBvdmVyIGluc2VydCB2ZXJzaW9uIGlmCi0gICAgICAgICAgICAvLyBjb25uZWN0IHRvIG91dHB1dCBtaXggKENvbXBsaWFuY2UgdG8gT3BlblNMIEVTKQotICAgICAgICAgICAgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVggJiYKLSAgICAgICAgICAgICAgICAgICAgKGQuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spICE9IEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZKSB7Ci0gICAgICAgICAgICAgICAgZGVzYyA9IGQ7Ci0gICAgICAgICAgICB9CisgICAgLy8gY2hlY2sgYXVkaW8gc2V0dGluZ3MgcGVybWlzc2lvbiBmb3IgZ2xvYmFsIGVmZmVjdHMKKyAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgeworICAgICAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IG5vIHBlcm1pc3Npb24gZm9yIEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIGxTdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFKSB7CisgICAgICAgIGlmICghaXNBdWRpb1NlcnZlclVpZChjYWxsaW5nVWlkKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBvbmx5IEFQTSBjYW4gY3JlYXRlIHVzaW5nIEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFIiwgX19mdW5jX18pOworICAgICAgICAgICAgbFN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOworICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKGlvID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEFQTSBtdXN0IHNwZWNpZnkgb3V0cHV0IHdoZW4gdXNpbmcgQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gZ2VuZXJhbCBzZXNzaW9uSWQuCisKKyAgICAgICAgaWYgKGF1ZGlvX3VuaXF1ZV9pZF9nZXRfdXNlKHNlc3Npb25JZCkgIT0gQVVESU9fVU5JUVVFX0lEX1VTRV9TRVNTSU9OKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgc2Vzc2lvbklkICVkIiwgX19mdW5jX18sIHNlc3Npb25JZCk7CisgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGNoZWNrIGlmIHRoZSBjYWxsaW5nVWlkIChsaW1pdGVkIHRvIHBpZCkgaXMgaW4gbUF1ZGlvU2Vzc2lvblJlZnMKKyAgICAgICAgLy8gdG8gcHJldmVudCBjcmVhdGluZyBhbiBlZmZlY3Qgd2hlbiBvbmUgZG9lc24ndCBhY3R1YWxseSBoYXZlIHRyYWNrIHdpdGggdGhhdCBzZXNzaW9uPwogICAgIH0KKwogICAgIHsKKyAgICAgICAgLy8gR2V0IHRoZSBmdWxsIGVmZmVjdCBkZXNjcmlwdG9yIGZyb20gdGhlIHV1aWQvdHlwZS4KKyAgICAgICAgLy8gSWYgdGhlIHNlc3Npb24gaXMgdGhlIG91dHB1dCBtaXgsIHByZWZlciBhbiBhdXhpbGlhcnkgZWZmZWN0LAorICAgICAgICAvLyBvdGhlcndpc2Ugbm8gcHJlZmVyZW5jZS4KKyAgICAgICAgdWludDMyX3QgcHJlZmVycmVkVHlwZSA9IChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSA6IEVGRkVDVF9GTEFHX1RZUEVfTUFTSyk7CisgICAgICAgIGxTdGF0dXMgPSBnZXRFZmZlY3REZXNjcmlwdG9yKCZwRGVzYy0+dXVpZCwgJnBEZXNjLT50eXBlLCBwcmVmZXJyZWRUeXBlLCAmZGVzYyk7CisgICAgICAgIGlmIChsU3RhdHVzIDwgMCkgeworICAgICAgICAgICAgQUxPR1coImNyZWF0ZUVmZmVjdCgpIGVycm9yICVkIGZyb20gZ2V0RWZmZWN0RGVzY3JpcHRvciIsIGxTdGF0dXMpOworICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICB9CiAKICAgICAgICAgLy8gRG8gbm90IGFsbG93IGF1eGlsaWFyeSBlZmZlY3RzIG9uIGEgc2Vzc2lvbiBkaWZmZXJlbnQgZnJvbSAwIChvdXRwdXQgbWl4KQogICAgICAgICBpZiAoc2Vzc2lvbklkICE9IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCAmJgpAQCAtMzA5Miw0MSArMzM2MiwzNiBAQAogICAgICAgICAvLyBvdXRwdXQgdGhyZWFkcy4KICAgICAgICAgLy8gSWYgb3V0cHV0IGlzIDAgaGVyZSwgc2Vzc2lvbklkIGlzIG5laXRoZXIgU0VTU0lPTl9PVVRQVVRfU1RBR0Ugbm9yIFNFU1NJT05fT1VUUFVUX01JWAogICAgICAgICAvLyBiZWNhdXNlIG9mIGNvZGUgY2hlY2tpbmcgb3V0cHV0IHdoZW4gZW50ZXJpbmcgdGhlIGZ1bmN0aW9uLgotICAgICAgICAvLyBOb3RlOiBpbyBpcyBuZXZlciAwIHdoZW4gY3JlYXRpbmcgYW4gZWZmZWN0IG9uIGFuIGlucHV0CisgICAgICAgIC8vIE5vdGU6IGlvIGlzIG5ldmVyIEFVRElPX0lPX0hBTkRMRV9OT05FIHdoZW4gY3JlYXRpbmcgYW4gZWZmZWN0IG9uIGFuIGlucHV0IGJ5IEFQTS4KKyAgICAgICAgLy8gQW4gQXVkaW9FZmZlY3QgY3JlYXRlZCBmcm9tIHRoZSBKYXZhIEFQSSB3aWxsIGhhdmUgaW8gYXMgQVVESU9fSU9fSEFORExFX05PTkUuCiAgICAgICAgIGlmIChpbyA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSkgewotICAgICAgICAgICAgICAgIC8vIG91dHB1dCBtdXN0IGJlIHNwZWNpZmllZCBieSBBdWRpb1BvbGljeU1hbmFnZXIgd2hlbiB1c2luZyBzZXNzaW9uCi0gICAgICAgICAgICAgICAgLy8gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UKLSAgICAgICAgICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgLy8gbG9vayBmb3IgdGhlIHRocmVhZCB3aGVyZSB0aGUgc3BlY2lmaWVkIGF1ZGlvIHNlc3Npb24gaXMgcHJlc2VudAorICAgICAgICAgICAgaW8gPSBmaW5kSW9IYW5kbGVCeVNlc3Npb25JZF9sKHNlc3Npb25JZCwgbVBsYXliYWNrVGhyZWFkcyk7CisgICAgICAgICAgICBpZiAoaW8gPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBpbyA9IGZpbmRJb0hhbmRsZUJ5U2Vzc2lvbklkX2woc2Vzc2lvbklkLCBtUmVjb3JkVGhyZWFkcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW8gPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBpbyA9IGZpbmRJb0hhbmRsZUJ5U2Vzc2lvbklkX2woc2Vzc2lvbklkLCBtTW1hcFRocmVhZHMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBJZiB5b3Ugd2lzaCB0byBjcmVhdGUgYSBSZWNvcmQgcHJlcHJvY2Vzc2luZyBBdWRpb0VmZmVjdCBpbiBKYXZhLAorICAgICAgICAgICAgLy8geW91IE1VU1QgY3JlYXRlIGFuIEF1ZGlvUmVjb3JkIGZpcnN0IGFuZCBrZWVwIGl0IGFsaXZlIHNvIGl0IGlzIHBpY2tlZCB1cCBhYm92ZS4KKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSBpdCB3aWxsIGZhaWwgd2hlbiBjcmVhdGVkIG9uIGEgUGxheWJhY2sgdGhyZWFkIGJ5IGxlZ2FjeQorICAgICAgICAgICAgLy8gaGFuZGxpbmcgYmVsb3cuICBEaXR0byB3aXRoIE1tYXAsIHRoZSBhc3NvY2lhdGVkIE1tYXAgdHJhY2sgbXVzdCBiZSBjcmVhdGVkCisgICAgICAgICAgICAvLyBiZWZvcmUgY3JlYXRpbmcgdGhlIEF1ZGlvRWZmZWN0IG9yIHRoZSBpbyBoYW5kbGUgbXVzdCBiZSBzcGVjaWZpZWQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gRGV0ZWN0IGlmIHRoZSBlZmZlY3QgaXMgY3JlYXRlZCBhZnRlciBhbiBBdWRpb1JlY29yZCBpcyBkZXN0cm95ZWQuCisgICAgICAgICAgICBpZiAoZ2V0T3JwaGFuRWZmZWN0Q2hhaW5fbChzZXNzaW9uSWQpLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGVmZmVjdCAlcyB3aXRoIG5vIHNwZWNpZmllZCBpbyBoYW5kbGUgaXMgZGVuaWVkIGJlY2F1c2UgdGhlIEF1ZGlvUmVjb3JkIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBmb3Igc2Vzc2lvbiAlZCBubyBsb25nZXIgZXhpc3RzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZGVzYy5uYW1lLCBzZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBsb29rIGZvciB0aGUgdGhyZWFkIHdoZXJlIHRoZSBzcGVjaWZpZWQgYXVkaW8gc2Vzc2lvbiBpcyBwcmVzZW50Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBzZXNzaW9uVHlwZSA9IG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS0+aGFzQXVkaW9TZXNzaW9uKHNlc3Npb25JZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNlc3Npb25UeXBlICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaW8gPSBtUGxheWJhY2tUaHJlYWRzLmtleUF0KGkpOwotICAgICAgICAgICAgICAgICAgICAvLyB0aHJlYWQgd2l0aCBzYW1lIGVmZmVjdCBzZXNzaW9uIGlzIHByZWZlcmFibGUKLSAgICAgICAgICAgICAgICAgICAgaWYgKChzZXNzaW9uVHlwZSAmIFRocmVhZEJhc2U6OkVGRkVDVF9TRVNTSU9OKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpbyA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVJlY29yZFRocmVhZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1SZWNvcmRUaHJlYWRzLnZhbHVlQXQoaSktPmhhc0F1ZGlvU2Vzc2lvbihzZXNzaW9uSWQpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlvID0gbVJlY29yZFRocmVhZHMua2V5QXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpbyA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1tYXBUaHJlYWRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTW1hcFRocmVhZHMudmFsdWVBdChpKS0+aGFzQXVkaW9TZXNzaW9uKHNlc3Npb25JZCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW8gPSBtTW1hcFRocmVhZHMua2V5QXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gTGVnYWN5IGhhbmRsaW5nIG9mIGNyZWF0aW5nIGFuIGVmZmVjdCBvbiBhbiBleHBpcmVkIG9yIG1hZGUtdXAKKyAgICAgICAgICAgIC8vIHNlc3Npb24gaWQuICBXZSB0aGluayB0aGF0IGl0IGlzIGEgUGxheWJhY2sgZWZmZWN0LgorICAgICAgICAgICAgLy8KICAgICAgICAgICAgIC8vIElmIG5vIG91dHB1dCB0aHJlYWQgY29udGFpbnMgdGhlIHJlcXVlc3RlZCBzZXNzaW9uIElELCBkZWZhdWx0IHRvCiAgICAgICAgICAgICAvLyBmaXJzdCBvdXRwdXQuIFRoZSBlZmZlY3QgY2hhaW4gd2lsbCBiZSBtb3ZlZCB0byB0aGUgY29ycmVjdCBvdXRwdXQKICAgICAgICAgICAgIC8vIHRocmVhZCB3aGVuIGEgdHJhY2sgd2l0aCB0aGUgc2FtZSBzZXNzaW9uIElEIGlzIGNyZWF0ZWQKQEAgLTMxODcsOCArMzQ1MiwxNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IgJiYgbFN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgewotICAgICAgICAvLyBoYW5kbGUgbXVzdCBiZSBjbGVhcmVkIG91dHNpZGUgbG9jay4KKyAgICBpZiAobFN0YXR1cyA9PSBOT19FUlJPUiB8fCBsU3RhdHVzID09IEFMUkVBRFlfRVhJU1RTKSB7CisgICAgICAgIC8vIENoZWNrIENQVSBhbmQgbWVtb3J5IHVzYWdlCisgICAgICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0ID0gaGFuZGxlLT5lZmZlY3QoKS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChlZmZlY3QgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc3RhdHVzX3QgclN0YXR1cyA9IGVmZmVjdC0+dXBkYXRlUG9saWN5U3RhdGUoKTsKKyAgICAgICAgICAgIGlmIChyU3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgbFN0YXR1cyA9IHJTdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgewogICAgICAgICBoYW5kbGUuY2xlYXIoKTsKICAgICB9CiAKQEAgLTMyMjAsMTQgKzM0OTMsMzAgQEAKIAogICAgIE11dGV4OjpBdXRvbG9jayBfZGwoZHN0VGhyZWFkLT5tTG9jayk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9zbChzcmNUaHJlYWQtPm1Mb2NrKTsKLSAgICByZXR1cm4gbW92ZUVmZmVjdENoYWluX2woc2Vzc2lvbklkLCBzcmNUaHJlYWQsIGRzdFRocmVhZCwgZmFsc2UpOworICAgIHJldHVybiBtb3ZlRWZmZWN0Q2hhaW5fbChzZXNzaW9uSWQsIHNyY1RocmVhZCwgZHN0VGhyZWFkKTsKIH0KIAorCit2b2lkIEF1ZGlvRmxpbmdlcjo6c2V0RWZmZWN0U3VzcGVuZGVkKGludCBlZmZlY3RJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdXNwZW5kZWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IGdldEVmZmVjdFRocmVhZF9sKHNlc3Npb25JZCwgZWZmZWN0SWQpOworICAgIGlmICh0aHJlYWQgPT0gbnVsbHB0cikgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX3NsKHRocmVhZC0+bUxvY2spOworICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0ID0gdGhyZWFkLT5nZXRFZmZlY3RfbChzZXNzaW9uSWQsIGVmZmVjdElkKTsKKyAgICB0aHJlYWQtPnNldEVmZmVjdFN1c3BlbmRlZF9sKCZlZmZlY3QtPmRlc2MoKS50eXBlLCBzdXNwZW5kZWQsIHNlc3Npb25JZCk7Cit9CisKKwogLy8gbW92ZUVmZmVjdENoYWluX2wgbXVzdCBiZSBjYWxsZWQgd2l0aCBib3RoIHNyY1RocmVhZCBhbmQgZHN0VGhyZWFkIG1Mb2NrcyBoZWxkCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Om1vdmVFZmZlY3RDaGFpbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQgKnNyY1RocmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZCAqZHN0VGhyZWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlUmVnaXN0ZXIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQgKmRzdFRocmVhZCkKIHsKICAgICBBTE9HVigibW92ZUVmZmVjdENoYWluX2woKSBzZXNzaW9uICVkIGZyb20gdGhyZWFkICVwIHRvIHRocmVhZCAlcCIsCiAgICAgICAgICAgICBzZXNzaW9uSWQsIHNyY1RocmVhZCwgZHN0VGhyZWFkKTsKQEAgLTMyODMsMzYgKzM1NzIsNjggQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHN0cmF0ZWd5ID0gZHN0Q2hhaW4tPnN0cmF0ZWd5KCk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHJlUmVnaXN0ZXIpIHsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjp1bnJlZ2lzdGVyRWZmZWN0KGVmZmVjdC0+aWQoKSk7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVnaXN0ZXJFZmZlY3QoJmVmZmVjdC0+ZGVzYygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFRocmVhZC0+aWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0LT5pZCgpKTsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzZXRFZmZlY3RFbmFibGVkKGVmZmVjdC0+aWQoKSwgZWZmZWN0LT5pc0VuYWJsZWQoKSk7Ci0gICAgICAgIH0KICAgICAgICAgZWZmZWN0ID0gY2hhaW4tPmdldEVmZmVjdEZyb21JZF9sKDApOwogICAgIH0KIAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZW1vdmVkLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBzcmNUaHJlYWQtPmFkZEVmZmVjdF9sKHJlbW92ZWRbaV0pOwotICAgICAgICAgICAgaWYgKGRzdENoYWluICE9IDAgJiYgcmVSZWdpc3RlcikgewotICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjp1bnJlZ2lzdGVyRWZmZWN0KHJlbW92ZWRbaV0tPmlkKCkpOwotICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWdpc3RlckVmZmVjdCgmcmVtb3ZlZFtpXS0+ZGVzYygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNUaHJlYWQtPmlkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZWRbaV0tPmlkKCkpOwotICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzZXRFZmZlY3RFbmFibGVkKGVmZmVjdC0+aWQoKSwgZWZmZWN0LT5pc0VuYWJsZWQoKSk7Ci0gICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Om1vdmVBdXhFZmZlY3RUb0lvKGludCBFZmZlY3RJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+JiBkc3RUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPFBsYXliYWNrVGhyZWFkPiAqc3JjVGhyZWFkKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgc3A8UGxheWJhY2tUaHJlYWQ+IHRocmVhZCA9CisgICAgICAgIHN0YXRpY19jYXN0PFBsYXliYWNrVGhyZWFkICo+KGdldEVmZmVjdFRocmVhZF9sKEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwgRWZmZWN0SWQpLmdldCgpKTsKKworICAgIGlmIChFZmZlY3RJZCAhPSAwICYmIHRocmVhZCAhPSAwICYmIGRzdFRocmVhZCAhPSB0aHJlYWQuZ2V0KCkpIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9kbChkc3RUaHJlYWQtPm1Mb2NrKTsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9zbCh0aHJlYWQtPm1Mb2NrKTsKKyAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IHNyY0NoYWluID0gdGhyZWFkLT5nZXRFZmZlY3RDaGFpbl9sKEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCk7CisgICAgICAgIHNwPEVmZmVjdENoYWluPiBkc3RDaGFpbjsKKyAgICAgICAgaWYgKHNyY0NoYWluID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorCisgICAgICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0ID0gc3JjQ2hhaW4tPmdldEVmZmVjdEZyb21JZF9sKEVmZmVjdElkKTsKKyAgICAgICAgaWYgKGVmZmVjdCA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgdGhyZWFkLT5yZW1vdmVFZmZlY3RfbChlZmZlY3QpOworICAgICAgICBzdGF0dXMgPSBkc3RUaHJlYWQtPmFkZEVmZmVjdF9sKGVmZmVjdCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHRocmVhZC0+YWRkRWZmZWN0X2woZWZmZWN0KTsKKyAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgZ290byBFeGl0OworICAgICAgICB9CisKKyAgICAgICAgZHN0Q2hhaW4gPSBlZmZlY3QtPmNoYWluKCkucHJvbW90ZSgpOworICAgICAgICBpZiAoZHN0Q2hhaW4gPT0gMCkgeworICAgICAgICAgICAgdGhyZWFkLT5hZGRFZmZlY3RfbChlZmZlY3QpOworICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKworRXhpdDoKKyAgICAgICAgLy8gcmVtb3ZlRWZmZWN0X2woKSBoYXMgc3RvcHBlZCB0aGUgZWZmZWN0IGlmIGl0IHdhcyBhY3RpdmUgc28gaXQgbXVzdCBiZSByZXN0YXJ0ZWQKKyAgICAgICAgaWYgKGVmZmVjdC0+c3RhdGUoKSA9PSBFZmZlY3RNb2R1bGU6OkFDVElWRSB8fAorICAgICAgICAgICAgZWZmZWN0LT5zdGF0ZSgpID09IEVmZmVjdE1vZHVsZTo6U1RPUFBJTkcpIHsKKyAgICAgICAgICAgIGVmZmVjdC0+c3RhcnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgc3JjVGhyZWFkICE9IG51bGxwdHIpIHsKKyAgICAgICAgKnNyY1RocmVhZCA9IHRocmVhZDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwogYm9vbCBBdWRpb0ZsaW5nZXI6OmlzTm9uT2ZmbG9hZGFibGVHbG9iYWxFZmZlY3RFbmFibGVkX2woKQogewogICAgIGlmIChtR2xvYmFsRWZmZWN0RW5hYmxlVGltZSAhPSAwICYmCkBAIC0zMzkzLDEzNiArMzcxNCw2IEBACiB9CiAKIAotc3RydWN0IEVudHJ5IHsKLSNkZWZpbmUgVEVFX01BWF9GSUxFTkFNRSAzMiAvLyAlWSVtJWQlSCVNJVNfJWQud2F2ID0gNCsyKzIrMisyKzIrMSsxKzQrMSA9IDIxCi0gICAgY2hhciBtRmlsZU5hbWVbVEVFX01BWF9GSUxFTkFNRV07Ci19OwotCi1pbnQgY29tcGFyRW50cnkoY29uc3Qgdm9pZCAqcDEsIGNvbnN0IHZvaWQgKnAyKQotewotICAgIHJldHVybiBzdHJjbXAoKChjb25zdCBFbnRyeSAqKSBwMSktPm1GaWxlTmFtZSwgKChjb25zdCBFbnRyeSAqKSBwMiktPm1GaWxlTmFtZSk7Ci19Ci0KLSNpZmRlZiBURUVfU0lOSwotdm9pZCBBdWRpb0ZsaW5nZXI6OmR1bXBUZWUoaW50IGZkLCBjb25zdCBzcDxOQkFJT19Tb3VyY2U+JiBzb3VyY2UsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBjaGFyIHN1ZmZpeCkKLXsKLSAgICBOQkFJT19Tb3VyY2UgKnRlZVNvdXJjZSA9IHNvdXJjZS5nZXQoKTsKLSAgICBpZiAodGVlU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgLy8gLndhdiByb3RhdGlvbgotICAgICAgICAvLyBUaGVyZSBpcyBhIGJlbmlnbiByYWNlIGNvbmRpdGlvbiBpZiAyIHRocmVhZHMgY2FsbCB0aGlzIHNpbXVsdGFuZW91c2x5LgotICAgICAgICAvLyBUaGV5IHdvdWxkIGJvdGggdHJhdmVyc2UgdGhlIGRpcmVjdG9yeSwgYnV0IHRoZSByZXN1bHQgd291bGQgc2ltcGx5IGJlCi0gICAgICAgIC8vIGZhaWx1cmVzIGF0IHVubGluaygpIHdoaWNoIGFyZSBpZ25vcmVkLiAgSXQncyBhbHNvIHVubGlrZWx5IHNpbmNlCi0gICAgICAgIC8vIG5vcm1hbGx5IGR1bXBzeXMgaXMgb25seSBkb25lIGJ5IGJ1Z3JlcG9ydCBvciBmcm9tIHRoZSBjb21tYW5kIGxpbmUuCi0gICAgICAgIGNoYXIgdGVlUGF0aFtQQVRIX01BWF0gPSAiL2RhdGEvbWlzYy9hdWRpb3NlcnZlciI7Ci0gICAgICAgIHNpemVfdCB0ZWVQYXRoTGVuID0gc3RybGVuKHRlZVBhdGgpOwotICAgICAgICBESVIgKmRpciA9IG9wZW5kaXIodGVlUGF0aCk7Ci0gICAgICAgIHRlZVBhdGhbdGVlUGF0aExlbisrXSA9ICcvJzsKLSAgICAgICAgaWYgKGRpciAhPSBOVUxMKSB7Ci0jZGVmaW5lIFRFRV9NQVhfU09SVCAyMCAvLyBudW1iZXIgb2YgZW50cmllcyB0byBzb3J0Ci0jZGVmaW5lIFRFRV9NQVhfS0VFUCAxMCAvLyBudW1iZXIgb2YgZW50cmllcyB0byBrZWVwCi0gICAgICAgICAgICBzdHJ1Y3QgRW50cnkgZW50cmllc1tURUVfTUFYX1NPUlRdOwotICAgICAgICAgICAgc2l6ZV90IGVudHJ5Q291bnQgPSAwOwotICAgICAgICAgICAgd2hpbGUgKGVudHJ5Q291bnQgPCBURUVfTUFYX1NPUlQpIHsKLSAgICAgICAgICAgICAgICBlcnJubyA9IDA7IC8vIGNsZWFyIGVycm5vIGJlZm9yZSByZWFkZGlyKCkgdG8gdHJhY2sgcG90ZW50aWFsIGVycm9ycy4KLSAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgZGlyZW50ICpyZXN1bHQgPSByZWFkZGlyKGRpcik7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXX0lGKGVycm5vICE9IDAsICJ0ZWUgcmVhZGRpcigpIGZhaWx1cmUgJXMiLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gaWdub3JlIG5vbiAud2F2IGZpbGUgZW50cmllcwotICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBuYW1lTGVuID0gc3RybGVuKHJlc3VsdC0+ZF9uYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAobmFtZUxlbiA8PSA0IHx8IG5hbWVMZW4gPj0gVEVFX01BWF9GSUxFTkFNRSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyY21wKCZyZXN1bHQtPmRfbmFtZVtuYW1lTGVuIC0gNF0sICIud2F2IikpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICh2b2lkKWF1ZGlvX3V0aWxzX3N0cmxjcHkoZW50cmllc1tlbnRyeUNvdW50KytdLm1GaWxlTmFtZSwgcmVzdWx0LT5kX25hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKHZvaWQpIGNsb3NlZGlyKGRpcik7Ci0gICAgICAgICAgICBpZiAoZW50cnlDb3VudCA+IFRFRV9NQVhfS0VFUCkgewotICAgICAgICAgICAgICAgIHFzb3J0KGVudHJpZXMsIGVudHJ5Q291bnQsIHNpemVvZihFbnRyeSksIGNvbXBhckVudHJ5KTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5Q291bnQgLSBURUVfTUFYX0tFRVA7ICsraSkgewotICAgICAgICAgICAgICAgICAgICBzdHJjcHkoJnRlZVBhdGhbdGVlUGF0aExlbl0sIGVudHJpZXNbaV0ubUZpbGVOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQpIHVubGluayh0ZWVQYXRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZmQgPj0gMCkgewotICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICJ1bmFibGUgdG8gcm90YXRlIHRlZXMgaW4gJS4qczogJXNcbiIsIChpbnQpIHRlZVBhdGhMZW4sIHRlZVBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNoYXIgdGVlVGltZVsxNl07Ci0gICAgICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotICAgICAgICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKLSAgICAgICAgc3RydWN0IHRtIHRtOwotICAgICAgICBsb2NhbHRpbWVfcigmdHYudHZfc2VjLCAmdG0pOwotICAgICAgICBzdHJmdGltZSh0ZWVUaW1lLCBzaXplb2YodGVlVGltZSksICIlWSVtJWQlSCVNJVMiLCAmdG0pOwotICAgICAgICBzbnByaW50ZigmdGVlUGF0aFt0ZWVQYXRoTGVuXSwgc2l6ZW9mKHRlZVBhdGgpIC0gdGVlUGF0aExlbiwgIiVzXyVkXyVjLndhdiIsIHRlZVRpbWUsIGlkLAotICAgICAgICAgICAgICAgIHN1ZmZpeCk7Ci0gICAgICAgIC8vIGlmIDIgZHVtcHN5cyBhcmUgZG9uZSB3aXRoaW4gMSBzZWNvbmQsIGFuZCByb3RhdGlvbiBkaWRuJ3Qgd29yaywgdGhlbiBkaXNjYXJkIDJuZAotICAgICAgICBpbnQgdGVlRmQgPSBvcGVuKHRlZVBhdGgsIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTCB8IE9fTk9GT0xMT1csIFNfSVJVU1IgfCBTX0lXVVNSKTsKLSAgICAgICAgaWYgKHRlZUZkID49IDApIHsKLSAgICAgICAgICAgIC8vIEZJWE1FIHVzZSBsaWJzbmRmaWxlCi0gICAgICAgICAgICBjaGFyIHdhdkhlYWRlcls0NF07Ci0gICAgICAgICAgICBtZW1jcHkod2F2SGVhZGVyLAotICAgICAgICAgICAgICAgICJSSUZGXDBcMFwwXDBXQVZFZm10IFwyMFwwXDBcMFwxXDBcMlwwXDEwNFwyNTRcMFwwXDBcMFwwXDBcNFwwXDIwXDBkYXRhXDBcMFwwXDAiLAotICAgICAgICAgICAgICAgIHNpemVvZih3YXZIZWFkZXIpKTsKLSAgICAgICAgICAgIE5CQUlPX0Zvcm1hdCBmb3JtYXQgPSB0ZWVTb3VyY2UtPmZvcm1hdCgpOwotICAgICAgICAgICAgdW5zaWduZWQgY2hhbm5lbENvdW50ID0gRm9ybWF0X2NoYW5uZWxDb3VudChmb3JtYXQpOwotICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IEZvcm1hdF9zYW1wbGVSYXRlKGZvcm1hdCk7Ci0gICAgICAgICAgICBzaXplX3QgZnJhbWVTaXplID0gRm9ybWF0X2ZyYW1lU2l6ZShmb3JtYXQpOwotICAgICAgICAgICAgd2F2SGVhZGVyWzIyXSA9IGNoYW5uZWxDb3VudDsgICAgICAgLy8gbnVtYmVyIG9mIGNoYW5uZWxzCi0gICAgICAgICAgICB3YXZIZWFkZXJbMjRdID0gc2FtcGxlUmF0ZTsgICAgICAgICAvLyBzYW1wbGUgcmF0ZQotICAgICAgICAgICAgd2F2SGVhZGVyWzI1XSA9IHNhbXBsZVJhdGUgPj4gODsKLSAgICAgICAgICAgIHdhdkhlYWRlclszMl0gPSBmcmFtZVNpemU7ICAgICAgICAgIC8vIGJsb2NrIGFsaWdubWVudAotICAgICAgICAgICAgd2F2SGVhZGVyWzMzXSA9IGZyYW1lU2l6ZSA+PiA4OwotICAgICAgICAgICAgd3JpdGUodGVlRmQsIHdhdkhlYWRlciwgc2l6ZW9mKHdhdkhlYWRlcikpOwotICAgICAgICAgICAgc2l6ZV90IHRvdGFsID0gMDsKLSAgICAgICAgICAgIGJvb2wgZmlyc3RSZWFkID0gdHJ1ZTsKLSNkZWZpbmUgVEVFX1NJTktfUkVBRCAxMDI0ICAgICAgICAgICAgICAgICAgICAgIC8vIGZyYW1lcyBwZXIgSS9PIG9wZXJhdGlvbgotICAgICAgICAgICAgdm9pZCAqYnVmZmVyID0gbWFsbG9jKFRFRV9TSU5LX1JFQUQgKiBmcmFtZVNpemUpOwotICAgICAgICAgICAgZm9yICg7OykgewotICAgICAgICAgICAgICAgIHNpemVfdCBjb3VudCA9IFRFRV9TSU5LX1JFQUQ7Ci0gICAgICAgICAgICAgICAgc3NpemVfdCBhY3R1YWwgPSB0ZWVTb3VyY2UtPnJlYWQoYnVmZmVyLCBjb3VudCk7Ci0gICAgICAgICAgICAgICAgYm9vbCB3YXNGaXJzdFJlYWQgPSBmaXJzdFJlYWQ7Ci0gICAgICAgICAgICAgICAgZmlyc3RSZWFkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKGFjdHVhbCA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhY3R1YWwgPT0gKHNzaXplX3QpIE9WRVJSVU4gJiYgd2FzRmlyc3RSZWFkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoYWN0dWFsIDw9IChzc2l6ZV90KWNvdW50KTsKLSAgICAgICAgICAgICAgICB3cml0ZSh0ZWVGZCwgYnVmZmVyLCBhY3R1YWwgKiBmcmFtZVNpemUpOwotICAgICAgICAgICAgICAgIHRvdGFsICs9IGFjdHVhbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZyZWUoYnVmZmVyKTsKLSAgICAgICAgICAgIGxzZWVrKHRlZUZkLCAob2ZmX3QpIDQsIFNFRUtfU0VUKTsKLSAgICAgICAgICAgIHVpbnQzMl90IHRlbXAgPSA0NCArIHRvdGFsICogZnJhbWVTaXplIC0gODsKLSAgICAgICAgICAgIC8vIEZJWE1FIG5vdCBiaWctZW5kaWFuIHNhZmUKLSAgICAgICAgICAgIHdyaXRlKHRlZUZkLCAmdGVtcCwgc2l6ZW9mKHRlbXApKTsKLSAgICAgICAgICAgIGxzZWVrKHRlZUZkLCAob2ZmX3QpIDQwLCBTRUVLX1NFVCk7Ci0gICAgICAgICAgICB0ZW1wID0gIHRvdGFsICogZnJhbWVTaXplOwotICAgICAgICAgICAgLy8gRklYTUUgbm90IGJpZy1lbmRpYW4gc2FmZQotICAgICAgICAgICAgd3JpdGUodGVlRmQsICZ0ZW1wLCBzaXplb2YodGVtcCkpOwotICAgICAgICAgICAgY2xvc2UodGVlRmQpOwotICAgICAgICAgICAgLy8gVE9ETyBTaG91bGQgY3JlYXRlIGZpbGUgd2l0aCB0ZW1wb3JhcnkgbmFtZSBhbmQgdGhlbiByZW5hbWUgdG8gZmluYWwgaWYgbm9uLWVtcHR5LgotICAgICAgICAgICAgaWYgKHRvdGFsID4gMCkgewotICAgICAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICJ0ZWUgY29waWVkIHRvICVzXG4iLCB0ZWVQYXRoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHVubGluayh0ZWVQYXRoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgZHByaW50ZihmZCwgInVuYWJsZSB0byBjcmVhdGUgdGVlICVzOiAlc1xuIiwgdGVlUGF0aCwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLSNlbmRpZgotCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6b25UcmFuc2FjdCgKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaAppbmRleCA5NjNhODdkLi43MmU2NjlhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCkBAIC0yMSwxMyArMjEsMTkgQEAKICNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSA8YXRvbWljPgogI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPGNocm9ubz4KICNpbmNsdWRlIDxkZXF1ZT4KICNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bnVtZXJpYz4KKyNpbmNsdWRlIDxvcHRpb25hbD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDxzdGRpbnQuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxsaW1pdHMuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQvb3MvQm5FeHRlcm5hbFZpYnJhdGlvbkNvbnRyb2xsZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAKICNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CkBAIC00OCw3ICs1NCw5IEBACiAjaW5jbHVkZSA8dXRpbHMvVHlwZUhlbHBlcnMuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAorI2luY2x1ZGUgPGJpbmRlci9BcHBPcHNNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL0JpbmRlclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSUFwcE9wc0NhbGxiYWNrLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgogCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CkBAIC02Miw3ICs3MCwxMCBAQAogI2luY2x1ZGUgPG1lZGlhL0xpbmVhck1hcC5oPgogI2luY2x1ZGUgPG1lZGlhL1ZvbHVtZVNoYXBlci5oPgogCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2xvY2suaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9GZFRvU3RyaW5nLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvU2ltcGxlTG9nLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvVGltZXN0YW1wVmVyaWZpZXIuaD4KIAogI2luY2x1ZGUgIkZhc3RDYXB0dXJlLmgiCiAjaW5jbHVkZSAiRmFzdE1peGVyLmgiCkBAIC03MSw2ICs4Miw3IEBACiAjaW5jbHVkZSAiQXVkaW9TdHJlYW1PdXQuaCIKICNpbmNsdWRlICJTcGRpZlN0cmVhbU91dC5oIgogI2luY2x1ZGUgIkF1ZGlvSHdEZXZpY2UuaCIKKyNpbmNsdWRlICJOQkFJT19UZWUuaCIKIAogI2luY2x1ZGUgPHBvd2VybWFuYWdlci9JUG93ZXJNYW5hZ2VyLmg+CiAKQEAgLTc4LDYgKzkwLDggQEAKICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvRWZmZWN0U2hhcmVkLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmg+CiAKKyNpbmNsdWRlIDx2aWJyYXRvci9FeHRlcm5hbFZpYnJhdGlvbi5oPgorCiAjaW5jbHVkZSAiYW5kcm9pZC9tZWRpYS9CbkF1ZGlvUmVjb3JkLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTEzMSw2ICsxNDUsMTAgQEAKICAgICB2aXJ0dWFsICAgICBmbG9hdCAgICAgICBtYXN0ZXJWb2x1bWUoKSBjb25zdDsKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBtYXN0ZXJNdXRlKCkgY29uc3Q7CiAKKyAgICAvLyBCYWxhbmNlIHZhbHVlIG11c3QgYmUgd2l0aGluIC0xLmYgKGxlZnQgb25seSkgdG8gMS5mIChyaWdodCBvbmx5KSBpbmNsdXNpdmUuCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKSBvdmVycmlkZTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRNYXN0ZXJCYWxhbmNlKGZsb2F0ICpiYWxhbmNlKSBjb25zdCBvdmVycmlkZTsKKwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZmxvYXQgdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgc2V0U3RyZWFtTXV0ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCBtdXRlZCk7CkBAIC0yMDIsNiArMjIwLDggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKSBjb25zdDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RWZmZWN0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICpwVXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcFR5cGVVdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcikgY29uc3Q7CiAKICAgICB2aXJ0dWFsIHNwPElFZmZlY3Q+IGNyZWF0ZUVmZmVjdCgKQEAgLTIxOSw2ICsyMzksMTAgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IG1vdmVFZmZlY3RzKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsIGF1ZGlvX2lvX2hhbmRsZV90IHNyY091dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdE91dHB1dCk7CiAKKyAgICAgICAgICAgIHZvaWQgc2V0RWZmZWN0U3VzcGVuZGVkKGludCBlZmZlY3RJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1c3BlbmRlZCkgb3ZlcnJpZGU7CisKICAgICB2aXJ0dWFsIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBsb2FkSHdNb2R1bGUoY29uc3QgY2hhciAqbmFtZSk7CiAKICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFByaW1hcnlPdXRwdXRTYW1wbGluZ1JhdGUoKTsKQEAgLTI3Niw2ICszMDAsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPE1tYXBTdHJlYW1DYWxsYmFjaz4mIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPE1tYXBTdHJlYW1JbnRlcmZhY2U+JiBpbnRlcmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqaGFuZGxlKTsKKworICAgIHN0YXRpYyBpbnQgb25FeHRlcm5hbFZpYnJhdGlvblN0YXJ0KGNvbnN0IHNwPG9zOjpFeHRlcm5hbFZpYnJhdGlvbj4mIGV4dGVybmFsVmlicmF0aW9uKTsKKyAgICBzdGF0aWMgdm9pZCBvbkV4dGVybmFsVmlicmF0aW9uU3RvcChjb25zdCBzcDxvczo6RXh0ZXJuYWxWaWJyYXRpb24+JiBleHRlcm5hbFZpYnJhdGlvbik7CiBwcml2YXRlOgogICAgIC8vIEZJWE1FIFRoZSA0MDAgaXMgdGVtcG9yYXJpbHkgdG9vIGhpZ2ggdW50aWwgYSBsZWFrIG9mIHdyaXRlcnMgaW4gbWVkaWEubG9nIGlzIGZpeGVkLgogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0xvZ01lbW9yeVNpemUgPSA0MDAgKiAxMDI0OwpAQCAtMzQ2LDcgKzM3Myw2IEBACiAKICAgICBBdWRpb0h3RGV2aWNlKiAgICAgICAgICBmaW5kU3VpdGFibGVId0Rldl9sKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyk7Ci0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgcHVyZ2VTdGFsZUVmZmVjdHNfbCgpOwogCiAgICAgLy8gU2V0IGtFbmFibGVFeHRlbmRlZENoYW5uZWxzIHRvIHRydWUgdG8gZW5hYmxlIGdyZWF0ZXIgdGhhbiBzdGVyZW8gb3V0cHV0CiAgICAgLy8gZm9yIHRoZSBNaXhlclRocmVhZCBhbmQgZGV2aWNlIHNpbmsuICBOdW1iZXIgb2YgY2hhbm5lbHMgYWxsb3dlZCBpcwpAQCAtMzU3LDE2ICszODMsMTcgQEAKICAgICBzdGF0aWMgaW5saW5lIGJvb2wgaXNWYWxpZFBjbVNpbmtDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgewogICAgICAgICBzd2l0Y2ggKGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfcmVwcmVzZW50YXRpb24oY2hhbm5lbE1hc2spKSB7CiAgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9QT1NJVElPTjogewotICAgICAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gRkNDXzI7IC8vIHN0ZXJlbyBpcyBkZWZhdWx0Ci0gICAgICAgICAgICBpZiAoa0VuYWJsZUV4dGVuZGVkQ2hhbm5lbHMpIHsKLSAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICAgIGlmIChjaGFubmVsQ291bnQgPCBGQ0NfMiAvLyBtb25vIGlzIG5vdCBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBjaGFubmVsQ291bnQgPiBBdWRpb01peGVyOjpNQVhfTlVNX0NIQU5ORUxTKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBIYXB0aWMgY2hhbm5lbCBtYXNrIGlzIG9ubHkgYXBwbGljYWJsZSBmb3IgY2hhbm5lbCBwb3NpdGlvbiBtYXNrLgorICAgICAgICAgICAgY29uc3QgdWludDMyX3QgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKAorICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzayAmIH5BVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpOworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgbWF4Q2hhbm5lbENvdW50ID0ga0VuYWJsZUV4dGVuZGVkQ2hhbm5lbHMKKyAgICAgICAgICAgICAgICAgICAgPyBBdWRpb01peGVyOjpNQVhfTlVNX0NIQU5ORUxTIDogRkNDXzI7CisgICAgICAgICAgICBpZiAoY2hhbm5lbENvdW50IDwgRkNDXzIgLy8gbW9ubyBpcyBub3Qgc3VwcG9ydGVkIGF0IHRoaXMgdGltZQorICAgICAgICAgICAgICAgICAgICB8fCBjaGFubmVsQ291bnQgPiBtYXhDaGFubmVsQ291bnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IGNoYW5uZWxNYXNrIGlzIHRoZSAiY2Fub25pY2FsIiBvbmUgd2UgZXhwZWN0IGZvciB0aGUgY2hhbm5lbENvdW50LgotICAgICAgICAgICAgcmV0dXJuIGNoYW5uZWxNYXNrID09IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChjaGFubmVsQ291bnQpOworICAgICAgICAgICAgcmV0dXJuIGF1ZGlvX2NoYW5uZWxfcG9zaXRpb25fbWFza19pc19vdXRfY2Fub25pY2FsKGNoYW5uZWxNYXNrKTsKICAgICAgICAgICAgIH0KICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX0lOREVYOgogICAgICAgICAgICAgaWYgKGtFbmFibGVFeHRlbmRlZENoYW5uZWxzKSB7CkBAIC00MDksMTMgKzQzNiwxNyBAQAogICAgIHN0YXRpYyB1aW50MzJfdCAgICAgICAgIG1TY3JlZW5TdGF0ZTsKIAogICAgIC8vIEludGVybmFsIGR1bXAgdXRpbGl0aWVzLgotICAgIHN0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrUmV0cmllcyA9IDUwOwotICAgIHN0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrU2xlZXBVcyA9IDIwMDAwOworICAgIHN0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrVGltZW91dE5zID0gMSAqIE5BTk9TX1BFUl9TRUNPTkQ7CiAgICAgc3RhdGljIGJvb2wgZHVtcFRyeUxvY2soTXV0ZXgmIG11dGV4KTsKICAgICB2b2lkIGR1bXBQZXJtaXNzaW9uRGVuaWFsKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAgICAgdm9pZCBkdW1wQ2xpZW50cyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogICAgIHZvaWQgZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCisgICAgU2ltcGxlTG9nIG1UaHJlYWRMb2d7MTZ9OyAvLyAxNiBUaHJlYWQgaGlzdG9yeSBsaW1pdAorCisgICAgY2xhc3MgVGhyZWFkQmFzZTsKKyAgICB2b2lkIGR1bXBUb1RocmVhZExvZ19sKGNvbnN0IHNwPFRocmVhZEJhc2U+ICZ0aHJlYWQpOworCiAgICAgLy8gLS0tIENsaWVudCAtLS0KICAgICBjbGFzcyBDbGllbnQgOiBwdWJsaWMgUmVmQmFzZSB7CiAgICAgcHVibGljOgpAQCAtNTAyLDYgKzUzMyw5IEBACiAgICAgY2xhc3MgRWZmZWN0Q2hhaW47CiAKICAgICBzdHJ1Y3QgQXVkaW9TdHJlYW1JbjsKKyAgICBzdHJ1Y3QgVGVlUGF0Y2g7CisgICAgdXNpbmcgVGVlUGF0Y2hlcyA9IHN0ZDo6dmVjdG9yPFRlZVBhdGNoPjsKKwogCiAgICAgc3RydWN0ICBzdHJlYW1fdHlwZV90IHsKICAgICAgICAgc3RyZWFtX3R5cGVfdCgpCkBAIC01MjgsNiArNTYyLDI2IEBACiAKICNpbmNsdWRlICJQYXRjaFBhbmVsLmgiCiAKKyAgICAvLyBGaW5kIGlvIGhhbmRsZSBieSBzZXNzaW9uIGlkLgorICAgIC8vIFByZWZlcmVuY2UgaXMgZ2l2ZW4gdG8gYW4gaW8gaGFuZGxlIHdpdGggYSBtYXRjaGluZyBlZmZlY3QgY2hhaW4gdG8gc2Vzc2lvbiBpZC4KKyAgICAvLyBJZiBub25lIGZvdW5kLCBBVURJT19JT19IQU5ETEVfTk9ORSBpcyByZXR1cm5lZC4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICBzdGF0aWMgYXVkaW9faW9faGFuZGxlX3QgZmluZElvSGFuZGxlQnlTZXNzaW9uSWRfbCgKKyAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsIGNvbnN0IFQmIHRocmVhZHMpIHsKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRocmVhZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNlc3Npb25UeXBlID0gdGhyZWFkcy52YWx1ZUF0KGkpLT5oYXNBdWRpb1Nlc3Npb24oc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIGlmIChzZXNzaW9uVHlwZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaW8gPSB0aHJlYWRzLmtleUF0KGkpOworICAgICAgICAgICAgICAgIGlmICgoc2Vzc2lvblR5cGUgJiBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OkVGRkVDVF9TRVNTSU9OKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBlZmZlY3QgY2hhaW4gaGVyZS4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGlvOworICAgIH0KKwogICAgIC8vIHNlcnZlciBzaWRlIG9mIHRoZSBjbGllbnQncyBJQXVkaW9UcmFjawogICAgIGNsYXNzIFRyYWNrSGFuZGxlIDogcHVibGljIGFuZHJvaWQ6OkJuQXVkaW9UcmFjayB7CiAgICAgcHVibGljOgpAQCAtNTQwLDYgKzU5NCw3IEBACiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcGF1c2UoKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBhdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpOwogICAgICAgICB2aXJ0dWFsIG1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXR1cyBhcHBseVZvbHVtZVNoYXBlcigKICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pIG92ZXJyaWRlOwpAQCAtNTY0LDYgKzYxOSwxMCBAQAogICAgICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgc3RvcCgpOwogICAgICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgZ2V0QWN0aXZlTWljcm9waG9uZXMoCiAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpOworICAgICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgc2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbigKKyAgICAgICAgICAgICAgICBpbnQgLyphdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90Ki8gZGlyZWN0aW9uKTsKKyAgICAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyAgIHNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKTsKKwogICAgIHByaXZhdGU6CiAgICAgICAgIGNvbnN0IHNwPFJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s+IG1SZWNvcmRUcmFjazsKIApAQCAtNjA1LDcgKzY2NCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgb3V0cHV0RGV2aWNlQWRkcmVzcyk7CiAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IG9wZW5PdXRwdXRfbChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKQEAgLTYzOCw4ICs2OTksMTEgQEAKIAogICAgICAgICAgICAgICBzdGF0dXNfdCBtb3ZlRWZmZWN0Q2hhaW5fbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrVGhyZWFkICpzcmNUaHJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxheWJhY2tUaHJlYWQgKmRzdFRocmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlUmVnaXN0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrVGhyZWFkICpkc3RUaHJlYWQpOworCisgICAgICAgICAgICAgIHN0YXR1c190IG1vdmVBdXhFZmZlY3RUb0lvKGludCBFZmZlY3RJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+JiBkc3RUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPFBsYXliYWNrVGhyZWFkPiAqc3JjVGhyZWFkKTsKIAogICAgICAgICAgICAgICAvLyByZXR1cm4gdGhyZWFkIGFzc29jaWF0ZWQgd2l0aCBwcmltYXJ5IGhhcmR3YXJlIGRldmljZSwgb3IgTlVMTAogICAgICAgICAgICAgICBQbGF5YmFja1RocmVhZCAqcHJpbWFyeVBsYXliYWNrVGhyZWFkX2woKSBjb25zdDsKQEAgLTY0OCw3ICs3MTIsNyBAQAogICAgICAgICAgICAgICAvLyByZXR1cm4gdGhlIHBsYXliYWNrIHRocmVhZCB3aXRoIHNtYWxsZXN0IEhBTCBidWZmZXIgc2l6ZSwgYW5kIHByZWZlciBmYXN0CiAgICAgICAgICAgICAgIFBsYXliYWNrVGhyZWFkICpmYXN0UGxheWJhY2tUaHJlYWRfbCgpIGNvbnN0OwogCi0gICAgICAgICAgICAgIHNwPFBsYXliYWNrVGhyZWFkPiBnZXRFZmZlY3RUaHJlYWRfbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLCBpbnQgRWZmZWN0SWQpOworICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiBnZXRFZmZlY3RUaHJlYWRfbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLCBpbnQgZWZmZWN0SWQpOwogCiAKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByZW1vdmVDbGllbnRfbChwaWRfdCBwaWQpOwpAQCAtNjc0LDcgKzczOCwxMiBAQAogICAgICAgICAgICAgICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBlZmZlY3Qgd2FzIGZvdW5kIGluIG1PcnBoYW5FZmZlY3RDaGFpbnMsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgdXBkYXRlT3JwaGFuRWZmZWN0Q2hhaW5zKGNvbnN0IHNwPEVmZmVjdE1vZHVsZT4mIGVmZmVjdCk7CiAKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjwgc3A8RWZmZWN0TW9kdWxlPiA+IHB1cmdlU3RhbGVFZmZlY3RzX2woKTsKKwogICAgICAgICAgICAgICAgIHZvaWQgYnJvYWNhc3RQYXJhbWV0ZXJzVG9SZWNvcmRUaHJlYWRzX2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CisgICAgICAgICAgICAgICAgdm9pZCBmb3J3YXJkUGFyYW1ldGVyc1RvRG93bnN0cmVhbVBhdGNoZXNfbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHVwU3RyZWFtLCBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IHNwPFBsYXliYWNrVGhyZWFkPiYpPiB1c2VUaHJlYWQgPSBudWxscHRyKTsKIAogICAgIC8vIEF1ZGlvU3RyZWFtSW4gaXMgaW1tdXRhYmxlLCBzbyB0aGVpciBmaWVsZHMgYXJlIGNvbnN0LgogICAgIC8vIEZvciBlbXBoYXNpcywgd2UgY291bGQgYWxzbyBtYWtlIGFsbCBwb2ludGVycyB0byB0aGVtIGJlICJjb25zdCAqIiwKQEAgLTY5MSw2ICs3NjAsMTEgQEAKICAgICAgICAgICAgIGF1ZGlvSHdEZXYoZGV2KSwgc3RyZWFtKGluKSwgZmxhZ3MoZmxhZ3MpIHt9CiAgICAgfTsKIAorICAgIHN0cnVjdCBUZWVQYXRjaCB7CisgICAgICAgIHNwPFJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ+IHBhdGNoUmVjb3JkOworICAgICAgICBzcDxQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjaz4gcGF0Y2hUcmFjazsKKyAgICB9OworCiAgICAgLy8gZm9yIG1BdWRpb1Nlc3Npb25SZWZzIG9ubHkKICAgICBzdHJ1Y3QgQXVkaW9TZXNzaW9uUmVmIHsKICAgICAgICAgQXVkaW9TZXNzaW9uUmVmKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uaWQsIHBpZF90IHBpZCkgOgpAQCAtNzUyLDYgKzgyNiw3IEBACiAgICAgICAgICAgICAgICAgLy8gbWVtYmVyIHZhcmlhYmxlcyBiZWxvdyBhcmUgcHJvdGVjdGVkIGJ5IG1Mb2NrCiAgICAgICAgICAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hc3RlclZvbHVtZTsKICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWFzdGVyTXV0ZTsKKyAgICAgICAgICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWFzdGVyQmFsYW5jZSA9IDAuZjsKICAgICAgICAgICAgICAgICAvLyBlbmQgb2YgdmFyaWFibGVzIHByb3RlY3RlZCBieSBtTG9jawogCiAgICAgICAgICAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19pb19oYW5kbGVfdCwgc3A8UmVjb3JkVGhyZWFkPiA+ICAgIG1SZWNvcmRUaHJlYWRzOwpAQCAtNzY5LDYgKzg0NCw3IEBACiAgICAgICAgICAgICAgICAgVmVjdG9yPEF1ZGlvU2Vzc2lvblJlZio+IG1BdWRpb1Nlc3Npb25SZWZzOwogCiAgICAgICAgICAgICAgICAgZmxvYXQgICAgICAgbWFzdGVyVm9sdW1lX2woKSBjb25zdDsKKyAgICAgICAgICAgICAgICBmbG9hdCAgICAgICBnZXRNYXN0ZXJCYWxhbmNlX2woKSBjb25zdDsKICAgICAgICAgICAgICAgICBib29sICAgICAgICBtYXN0ZXJNdXRlX2woKSBjb25zdDsKICAgICAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbG9hZEh3TW9kdWxlX2woY29uc3QgY2hhciAqbmFtZSk7CiAKQEAgLTc5MSw0NCArODY3LDE5IEBACiAKICAgICAvLyBmb3IgdXNlIGZyb20gZGVzdHJ1Y3RvcgogICAgIHN0YXR1c190ICAgIGNsb3NlT3V0cHV0X25vbnZpcnR1YWwoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKLSAgICB2b2lkICAgICAgICBjbG9zZU91dHB1dEludGVybmFsX2woY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+JiB0aHJlYWQpOworICAgIHZvaWQgICAgICAgIGNsb3NlVGhyZWFkSW50ZXJuYWxfbChjb25zdCBzcDxQbGF5YmFja1RocmVhZD4mIHRocmVhZCk7CiAgICAgc3RhdHVzX3QgICAgY2xvc2VJbnB1dF9ub252aXJ0dWFsKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKLSAgICB2b2lkICAgICAgICBjbG9zZUlucHV0SW50ZXJuYWxfbChjb25zdCBzcDxSZWNvcmRUaHJlYWQ+JiB0aHJlYWQpOworICAgIHZvaWQgICAgICAgIGNsb3NlVGhyZWFkSW50ZXJuYWxfbChjb25zdCBzcDxSZWNvcmRUaHJlYWQ+JiB0aHJlYWQpOwogICAgIHZvaWQgICAgICAgIHNldEF1ZGlvSHdTeW5jRm9yU2Vzc2lvbl9sKFBsYXliYWNrVGhyZWFkICp0aHJlYWQsIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpOwogCiAgICAgc3RhdHVzX3QgICAgY2hlY2tTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdDsKIAogICAgIHZvaWQgICAgICAgIGZpbHRlclJlc2VydmVkUGFyYW1ldGVycyhTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzLCB1aWRfdCBjYWxsaW5nVWlkKTsKLQotI2lmZGVmIFRFRV9TSU5LCi0gICAgLy8gYWxsIHJlY29yZCB0aHJlYWRzIHNlcmlhbGx5IHNoYXJlIGEgY29tbW9uIHRlZSBzaW5rLCB3aGljaCBpcyByZS1jcmVhdGVkIG9uIGZvcm1hdCBjaGFuZ2UKLSAgICBzcDxOQkFJT19TaW5rPiAgIG1SZWNvcmRUZWVTaW5rOwotICAgIHNwPE5CQUlPX1NvdXJjZT4gbVJlY29yZFRlZVNvdXJjZTsKLSNlbmRpZgorICAgIHZvaWQgICAgICAgIGxvZ0ZpbHRlcmVkUGFyYW1ldGVycyhzaXplX3Qgb3JpZ2luYWxLVlBTaXplLCBjb25zdCBTdHJpbmc4JiBvcmlnaW5hbEtWUHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByZWplY3RlZEtWUFNpemUsIGNvbnN0IFN0cmluZzgmIHJlamVjdGVkS1ZQcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgY2FsbGluZ1VpZCk7CiAKIHB1YmxpYzoKLQotI2lmZGVmIFRFRV9TSU5LCi0gICAgLy8gdGVlIHNpbmssIGlmIGVuYWJsZWQgYnkgcHJvcGVydHksIGFsbG93cyBkdW1wc3lzIHRvIHdyaXRlIG1vc3QgcmVjZW50IGF1ZGlvIHRvIC53YXYgZmlsZQotICAgIHN0YXRpYyB2b2lkIGR1bXBUZWUoaW50IGZkLCBjb25zdCBzcDxOQkFJT19Tb3VyY2U+JiBzb3VyY2UsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBjaGFyIHN1ZmZpeCk7Ci0KLSAgICAvLyB3aGV0aGVyIHRlZSBzaW5rIGlzIGVuYWJsZWQgYnkgcHJvcGVydHkKLSAgICBzdGF0aWMgYm9vbCBtVGVlU2lua0lucHV0RW5hYmxlZDsKLSAgICBzdGF0aWMgYm9vbCBtVGVlU2lua091dHB1dEVuYWJsZWQ7Ci0gICAgc3RhdGljIGJvb2wgbVRlZVNpbmtUcmFja0VuYWJsZWQ7Ci0KLSAgICAvLyBydW50aW1lIGNvbmZpZ3VyZWQgc2l6ZSBvZiBlYWNoIHRlZSBzaW5rIHBpcGUsIGluIGZyYW1lcwotICAgIHN0YXRpYyBzaXplX3QgbVRlZVNpbmtJbnB1dEZyYW1lczsKLSAgICBzdGF0aWMgc2l6ZV90IG1UZWVTaW5rT3V0cHV0RnJhbWVzOwotICAgIHN0YXRpYyBzaXplX3QgbVRlZVNpbmtUcmFja0ZyYW1lczsKLQotICAgIC8vIGNvbXBpbGUtdGltZSBkZWZhdWx0IHNpemUgb2YgdGVlIHNpbmsgcGlwZXMsIGluIGZyYW1lcwotICAgIC8vIDB4MjAwMDAwIHN0ZXJlbyAxNi1iaXQgUENNIGZyYW1lcyA9IDQ3LjUgc2Vjb25kcyBhdCA0NC4xIGtIeiwgOCBtZWdhYnl0ZXMKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtUZWVTaW5rSW5wdXRGcmFtZXNEZWZhdWx0ID0gMHgyMDAwMDA7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrVGVlU2lua091dHB1dEZyYW1lc0RlZmF1bHQgPSAweDIwMDAwMDsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtUZWVTaW5rVHJhY2tGcmFtZXNEZWZhdWx0ID0gMHgyMDAwMDA7Ci0jZW5kaWYKLQogICAgIC8vIFRoZXNlIG1ldGhvZHMgcmVhZCB2YXJpYWJsZXMgYXRvbWljYWxseSB3aXRob3V0IG1Mb2NrLAogICAgIC8vIHRob3VnaCB0aGUgdmFyaWFibGVzIGFyZSB1cGRhdGVkIHdpdGggbUxvY2suCiAgICAgYm9vbCAgICBpc0xvd1JhbURldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1Jc0xvd1JhbURldmljZTsgfQpAQCAtODQzLDEwICs4OTQsMTUgQEAKIAogICAgIG5zZWNzX3QgbUdsb2JhbEVmZmVjdEVuYWJsZVRpbWU7ICAvLyB3aGVuIGEgZ2xvYmFsIGVmZmVjdCB3YXMgbGFzdCBlbmFibGVkCiAKLSAgICBzcDxQYXRjaFBhbmVsPiBtUGF0Y2hQYW5lbDsKKyAgICAvLyBwcm90ZWN0ZWQgYnkgbUxvY2sKKyAgICBQYXRjaFBhbmVsIG1QYXRjaFBhbmVsOwogICAgIHNwPEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlPiBtRWZmZWN0c0ZhY3RvcnlIYWw7CiAKLSAgICBib29sICAgICAgICBtU3lzdGVtUmVhZHk7CisgICAgYm9vbCAgICAgICBtU3lzdGVtUmVhZHk7CisKKyAgICBTaW1wbGVMb2cgIG1SZWplY3RlZFNldFBhcmFtZXRlckxvZzsKKyAgICBTaW1wbGVMb2cgIG1BcHBTZXRQYXJhbWV0ZXJMb2c7CisgICAgU2ltcGxlTG9nICBtU3lzdGVtU2V0UGFyYW1ldGVyTG9nOwogfTsKIAogI3VuZGVmIElOQ0xVRElOR19GUk9NX0FVRElPRkxJTkdFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSHdEZXZpY2UuaAppbmRleCBlYjgyNmM2Li5kNDI5OWIwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmgKQEAgLTM1LDYgKzM1LDkgQEAKICAgICBlbnVtIEZsYWdzIHsKICAgICAgICAgQUhXRF9DQU5fU0VUX01BU1RFUl9WT0xVTUUgID0gMHgxLAogICAgICAgICBBSFdEX0NBTl9TRVRfTUFTVEVSX01VVEUgICAgPSAweDIsCisgICAgICAgIC8vIE1lYW5zIHRoYXQgdGhpcyBpc24ndCBhIHRlcm1pbmFsIG1vZHVsZSwgYW5kIHNvZnR3YXJlIHBhdGNoZXMKKyAgICAgICAgLy8gYXJlIHVzZWQgdG8gdHJhbnNwb3J0IGF1ZGlvIGRhdGEgZnVydGhlci4KKyAgICAgICAgQUhXRF9JU19JTlNFUlQgICAgICAgICAgICAgID0gMHg0LAogICAgIH07CiAKICAgICBBdWRpb0h3RGV2aWNlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUsCkBAIC01NSw2ICs1OCwxMCBAQAogICAgICAgICByZXR1cm4gKDAgIT0gKG1GbGFncyAmIEFIV0RfQ0FOX1NFVF9NQVNURVJfTVVURSkpOwogICAgIH0KIAorICAgIGJvb2wgaXNJbnNlcnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiAoMCAhPSAobUZsYWdzICYgQUhXRF9JU19JTlNFUlQpKTsKKyAgICB9CisKICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbUhhbmRsZTsgfQogICAgIGNvbnN0IGNoYXIgKm1vZHVsZU5hbWUoKSBjb25zdCB7IHJldHVybiBtTW9kdWxlTmFtZTsgfQogICAgIHNwPERldmljZUhhbEludGVyZmFjZT4gaHdEZXZpY2UoKSBjb25zdCB7IHJldHVybiBtSHdEZXZpY2U7IH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9TdHJlYW1PdXQuY3BwCmluZGV4IDFkNGIzZmUuLmE2MGE1ZjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvU3RyZWFtT3V0LmNwcApAQCAtNjYsOCArNjYsOSBAQAogICAgIC8vIE1haW50YWluIGEgNjQtYml0IHJlbmRlciBwb3NpdGlvbiB1c2luZyB0aGUgMzItYml0IHJlc3VsdCBmcm9tIHRoZSBIQUwuCiAgICAgLy8gVGhpcyBkZWx0YSBjYWxjdWxhdGlvbiByZWxpZXMgb24gdGhlIGFyaXRobWV0aWMgb3ZlcmZsb3cgYmVoYXZpb3IKICAgICAvLyBvZiBpbnRlZ2Vycy4gRm9yIGV4YW1wbGUgKDEwMCAtIDB4RkZGRkZGRjApID0gMTE2LgotICAgIHVpbnQzMl90IHRydW5jYXRlZFBvc2l0aW9uID0gKHVpbnQzMl90KW1SZW5kZXJQb3NpdGlvbjsKLSAgICBpbnQzMl90IGRlbHRhSGFsUG9zaXRpb24gPSAoaW50MzJfdCkoaGFsUG9zaXRpb24gLSB0cnVuY2F0ZWRQb3NpdGlvbik7CisgICAgY29uc3QgdWludDMyX3QgdHJ1bmNhdGVkUG9zaXRpb24gPSAodWludDMyX3QpbVJlbmRlclBvc2l0aW9uOworICAgIGludDMyX3QgZGVsdGFIYWxQb3NpdGlvbjsgLy8gaW5pdGlhbGl6YXRpb24gbm90IG5lZWRlZCwgb3ZlcndpdHRlbiBieSBfX2J1aWx0aW5fc3ViX292ZXJmbG93KCkKKyAgICAodm9pZCkgX19idWlsdGluX3N1Yl9vdmVyZmxvdyhoYWxQb3NpdGlvbiwgdHJ1bmNhdGVkUG9zaXRpb24sICZkZWx0YUhhbFBvc2l0aW9uKTsKICAgICBpZiAoZGVsdGFIYWxQb3NpdGlvbiA+IDApIHsKICAgICAgICAgbVJlbmRlclBvc2l0aW9uICs9IGRlbHRhSGFsUG9zaXRpb247CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0J1ZkxvZy5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQnVmTG9nLmNwcAppbmRleCBhZTk2MDM2Li41ZjZhY2EwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQnVmTG9nLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQnVmTG9nLmNwcApAQCAtMTE1LDcgKzExNSw3IEBACiAgICAgICAgIHVuc2lnbmVkIGludCBzYW1wbGluZ1JhdGUsCiAgICAgICAgIHNpemVfdCBtYXhCeXRlcyA9IDApIDogbUlkKGlkKSwgbUZvcm1hdChmb3JtYXQpLCBtQ2hhbm5lbHMoY2hhbm5lbHMpLAogICAgICAgICAgICAgICAgIG1TYW1wbGluZ1JhdGUoc2FtcGxpbmdSYXRlKSwgbU1heEJ5dGVzKG1heEJ5dGVzKSB7Ci0gICAgbUJ5dGVDb3VudCA9IDBsOworICAgIG1CeXRlQ291bnQgPSAwOwogICAgIG1QYXVzZWQgPSBmYWxzZTsKICAgICBpZiAodGFnICE9IE5VTEwpIHsKICAgICAgICAgKHZvaWQpYXVkaW9fdXRpbHNfc3RybGNweShtVGFnLCB0YWcpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCmluZGV4IDIwNDdkZmQuLjNjNGZiYmEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKQEAgLTMxLDkgKzMxLDkgQEAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAKICNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKLSNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtNTAsNiArNTAsOCBAQAogI2RlZmluZSBBTE9HVlYoYS4uLikgZG8geyB9IHdoaWxlKDApCiAjZW5kaWYKIAorI2RlZmluZSBERUZBVUxUX09VVFBVVF9TQU1QTEVfUkFURSA0ODAwMAorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE2Niw2ICsxNjgsNjggQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6dXBkYXRlUG9saWN5U3RhdGUoKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGJvb2wgZG9SZWdpc3RlciA9IGZhbHNlOworICAgIGJvb2wgcmVnaXN0ZXJlZCA9IGZhbHNlOworICAgIGJvb2wgZG9FbmFibGUgPSBmYWxzZTsKKyAgICBib29sIGVuYWJsZWQgPSBmYWxzZTsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBpbzsKKyAgICB1aW50MzJfdCBzdHJhdGVneTsKKworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgLy8gcmVnaXN0ZXIgZWZmZWN0IHdoZW4gZmlyc3QgaGFuZGxlIGlzIGF0dGFjaGVkIGFuZCB1bnJlZ2lzdGVyIHdoZW4gbGFzdCBoYW5kbGUgaXMgcmVtb3ZlZAorICAgICAgICBpZiAobVBvbGljeVJlZ2lzdGVyZWQgIT0gbUhhbmRsZXMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgZG9SZWdpc3RlciA9IHRydWU7CisgICAgICAgICAgICBtUG9saWN5UmVnaXN0ZXJlZCA9IG1IYW5kbGVzLnNpemUoKSA+IDA7CisgICAgICAgICAgICBpZiAobVBvbGljeVJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgc3AgPEVmZmVjdENoYWluPiBjaGFpbiA9IG1DaGFpbi5wcm9tb3RlKCk7CisgICAgICAgICAgICAgIHNwIDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKKworICAgICAgICAgICAgICBpZiAodGhyZWFkID09IG51bGxwdHIgfHwgY2hhaW4gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlvID0gdGhyZWFkLT5pZCgpOworICAgICAgICAgICAgICAgIHN0cmF0ZWd5ID0gY2hhaW4tPnN0cmF0ZWd5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gZW5hYmxlIGVmZmVjdCB3aGVuIHJlZ2lzdGVyZWQgYWNjb3JkaW5nIHRvIGVuYWJsZSBzdGF0ZSByZXF1ZXN0ZWQgYnkgY29udHJvbGxpbmcgaGFuZGxlCisgICAgICAgIGlmIChtSGFuZGxlcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBFZmZlY3RIYW5kbGUgKmhhbmRsZSA9IGNvbnRyb2xIYW5kbGVfbCgpOworICAgICAgICAgICAgaWYgKGhhbmRsZSAhPSBudWxscHRyICYmIG1Qb2xpY3lFbmFibGVkICE9IGhhbmRsZS0+ZW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgZG9FbmFibGUgPSB0cnVlOworICAgICAgICAgICAgICAgIG1Qb2xpY3lFbmFibGVkID0gaGFuZGxlLT5lbmFibGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmVnaXN0ZXJlZCA9IG1Qb2xpY3lSZWdpc3RlcmVkOworICAgICAgICBlbmFibGVkID0gbVBvbGljeUVuYWJsZWQ7CisgICAgICAgIG1Qb2xpY3lMb2NrLmxvY2soKTsKKyAgICB9CisgICAgQUxPR1YoIiVzIG5hbWUgJXMgaWQgJWQgc2Vzc2lvbiAlZCBkb1JlZ2lzdGVyICVkIHJlZ2lzdGVyZWQgJWQgZG9FbmFibGUgJWQgZW5hYmxlZCAlZCIsCisgICAgICAgIF9fZnVuY19fLCBtRGVzY3JpcHRvci5uYW1lLCBtSWQsIG1TZXNzaW9uSWQsIGRvUmVnaXN0ZXIsIHJlZ2lzdGVyZWQsIGRvRW5hYmxlLCBlbmFibGVkKTsKKyAgICBpZiAoZG9SZWdpc3RlcikgeworICAgICAgICBpZiAocmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OnJlZ2lzdGVyRWZmZWN0KAorICAgICAgICAgICAgICAgICZtRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICBpbywKKyAgICAgICAgICAgICAgICBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLAorICAgICAgICAgICAgICAgIG1JZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6dW5yZWdpc3RlckVmZmVjdChtSWQpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChyZWdpc3RlcmVkICYmIGRvRW5hYmxlKSB7CisgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzZXRFZmZlY3RFbmFibGVkKG1JZCwgZW5hYmxlZCk7CisgICAgfQorICAgIG1Qb2xpY3lMb2NrLnVubG9jaygpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCiBzc2l6ZV90IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpyZW1vdmVIYW5kbGUoRWZmZWN0SGFuZGxlICpoYW5kbGUpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTIyOCw3ICsyOTIsNiBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgc3NpemVfdCBudW1IYW5kbGVzID0gcmVtb3ZlSGFuZGxlX2woaGFuZGxlKTsKICAgICBpZiAoKG51bUhhbmRsZXMgPT0gMCkgJiYgKCFtUGlubmVkIHx8IHVucGluSWZMYXN0KSkgewotICAgICAgICBBdWRpb1N5c3RlbTo6dW5yZWdpc3RlckVmZmVjdChtSWQpOwogICAgICAgICBzcDxBdWRpb0ZsaW5nZXI+IGFmID0gbUF1ZGlvRmxpbmdlci5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChhZiAhPSAwKSB7CiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKQEAgLTI0Niw3ICszMDksNyBAQAogICAgIHN3aXRjaCAobVN0YXRlKSB7CiAgICAgY2FzZSBSRVNUQVJUOgogICAgICAgICByZXNldF9sKCk7Ci0gICAgICAgIC8vIEZBTEwgVEhST1VHSAorICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKIAogICAgIGNhc2UgU1RBUlRJTkc6CiAgICAgICAgIC8vIGNsZWFyIGF1eGlsaWFyeSBlZmZlY3QgaW5wdXQgYnVmZmVyIGZvciBuZXh0IGFjY3VtdWxhdGlvbgpAQCAtMjYzLDcgKzMyNiw5IEBACiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBTVE9QUElORzoKLSAgICAgICAgaWYgKHN0b3BfbCgpID09IE5PX0VSUk9SKSB7CisgICAgICAgIC8vIHZvbHVtZSBjb250cm9sIGZvciBvZmZsb2FkIGFuZCBkaXJlY3QgdGhyZWFkcyBtdXN0IHRha2UgZWZmZWN0IGltbWVkaWF0ZWx5LgorICAgICAgICBpZiAoc3RvcF9sKCkgPT0gTk9fRVJST1IKKyAgICAgICAgICAgICYmICEoaXNWb2x1bWVDb250cm9sKCkgJiYgaXNPZmZsb2FkZWRPckRpcmVjdCgpKSkgewogICAgICAgICAgICAgbURpc2FibGVXYWl0Q250ID0gbU1heERpc2FibGVXYWl0Q250OwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbURpc2FibGVXYWl0Q250ID0gMTsgLy8gd2lsbCBjYXVzZSBpbW1lZGlhdGUgdHJhbnNpdGlvbiB0byBJRExFCkBAIC0zMDUsOCArMzcwLDggQEAKICAgICAvLyBpbnB1dCBhbmQgb3V0cHV0IGVmZmVjdCBidWZmZXJzIHdpdGhvdXQgYW4gaW50ZXJtZWRpYXJ5IGVmZmVjdCBwcm9jZXNzLgogICAgIC8vIFRPRE86IGNvbnNpZGVyIGltcGxlbWVudGluZyBjaGFubmVsIGNvbnZlcnNpb24uCiAgICAgY29uc3Qgc2l6ZV90IHNhZmVJbnB1dE91dHB1dFNhbXBsZUNvdW50ID0KLSAgICAgICAgICAgIGluQ2hhbm5lbENvdW50ICE9IG91dENoYW5uZWxDb3VudCA/IDAKLSAgICAgICAgICAgICAgICAgICAgOiBvdXRDaGFubmVsQ291bnQgKiBzdGQ6Om1pbigKKyAgICAgICAgICAgIG1JbkNoYW5uZWxDb3VudFJlcXVlc3RlZCAhPSBtT3V0Q2hhbm5lbENvdW50UmVxdWVzdGVkID8gMAorICAgICAgICAgICAgICAgICAgICA6IG1PdXRDaGFubmVsQ291bnRSZXF1ZXN0ZWQgKiBzdGQ6Om1pbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50KTsKICAgICBjb25zdCBhdXRvIGFjY3VtdWxhdGVJbnB1dFRvT3V0cHV0ID0gW3RoaXMsIHNhZmVJbnB1dE91dHB1dFNhbXBsZUNvdW50XSgpIHsKQEAgLTQ3Niw3ICs1NDEsMTIgQEAKICAgICAgICAgLy8gYWNjdW11bGF0ZSBpbnB1dCBvbnRvIG91dHB1dAogICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBtQ2hhaW4ucHJvbW90ZSgpOwogICAgICAgICBpZiAoY2hhaW4uZ2V0KCkgIT0gbnVsbHB0ciAmJiBjaGFpbi0+YWN0aXZlVHJhY2tDbnQoKSAhPSAwKSB7Ci0gICAgICAgICAgICBhY2N1bXVsYXRlSW5wdXRUb091dHB1dCgpOworICAgICAgICAgICAgLy8gc2ltaWxhciBoYW5kbGluZyB3aXRoIGRhdGFfYnlwYXNzIGFib3ZlLgorICAgICAgICAgICAgaWYgKG1Db25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgeworICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVJbnB1dFRvT3V0cHV0KCk7CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURQorICAgICAgICAgICAgICAgIGNvcHlJbnB1dFRvT3V0cHV0KCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC01NDcsNyArNjE3LDE0IEBACiAKICAgICBtQ29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEVGRkVDVF9CVUZGRVJfRk9STUFUOwogICAgIG1Db25maWcub3V0cHV0Q2ZnLmZvcm1hdCA9IEVGRkVDVF9CVUZGRVJfRk9STUFUOwotICAgIG1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gdGhyZWFkLT5zYW1wbGVSYXRlKCk7CisKKyAgICAvLyBEb24ndCB1c2Ugc2FtcGxlIHJhdGUgZm9yIHRocmVhZCBpZiBlZmZlY3QgaXNuJ3Qgb2ZmbG9hZGFibGUuCisgICAgaWYgKCh0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpPRkZMT0FEKSAmJiAhaXNPZmZsb2FkZWQoKSkgeworICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IERFRkFVTFRfT1VUUFVUX1NBTVBMRV9SQVRFOworICAgICAgICBBTE9HVigiT3ZlcnJpZGluZyBlZmZlY3QgaW5wdXQgYXMgNDhrSHoiKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHRocmVhZC0+c2FtcGxlUmF0ZSgpOworICAgIH0KICAgICBtQ29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSBtQ29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZTsKICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IE5VTEw7CiAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwpAQCAtNzc4LDYgKzg1NSwxNiBAQAogICAgIH0KICAgICBzdGF0dXNfdCBjbWRTdGF0dXMgPSBOT19FUlJPUjsKICAgICB1aW50MzJfdCBzaXplID0gc2l6ZW9mKHN0YXR1c190KTsKKworICAgIGlmIChpc1ZvbHVtZUNvbnRyb2woKSAmJiBpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKKyAgICAgICAgc3A8RWZmZWN0Q2hhaW4+Y2hhaW4gPSBtQ2hhaW4ucHJvbW90ZSgpOworICAgICAgICAvLyBXZSBoYXZlIHRoZSBFZmZlY3RDaGFpbiBhbmQgRWZmZWN0TW9kdWxlIGxvY2ssIHBlcm1pdCBhIHJlZW50cmFudCBjYWxsIHRvIHNldFZvbHVtZToKKyAgICAgICAgLy8gcmVzZXRWb2x1bWVfbCAtLT4gc2V0Vm9sdW1lX2wgLS0+IEVmZmVjdE1vZHVsZTo6c2V0Vm9sdW1lCisgICAgICAgIG1TZXRWb2x1bWVSZWVudHJhbnRUaWQgPSBnZXR0aWQoKTsKKyAgICAgICAgY2hhaW4tPnJlc2V0Vm9sdW1lX2woKTsKKyAgICAgICAgbVNldFZvbHVtZVJlZW50cmFudFRpZCA9IElOVkFMSURfUElEOworICAgIH0KKwogICAgIHN0YXR1c190IHN0YXR1cyA9IG1FZmZlY3RJbnRlcmZhY2UtPmNvbW1hbmQoRUZGRUNUX0NNRF9ESVNBQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCkBAIC05MTcsMTEgKzEwMDQsNiBAQAogICAgIEFMT0dWKCJzZXRFbmFibGVkICVwIGVuYWJsZWQgJWQiLCB0aGlzLCBlbmFibGVkKTsKIAogICAgIGlmIChlbmFibGVkICE9IGlzRW5hYmxlZCgpKSB7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzZXRFZmZlY3RFbmFibGVkKG1JZCwgZW5hYmxlZCk7Ci0gICAgICAgIGlmIChlbmFibGVkICYmIHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotCiAgICAgICAgIHN3aXRjaCAobVN0YXRlKSB7CiAgICAgICAgIC8vIGdvaW5nIGZyb20gZGlzYWJsZWQgdG8gZW5hYmxlZAogICAgICAgICBjYXNlIElETEU6CkBAIC05OTMsNiArMTA3NSwxNiBAQAogICAgIH0KIH0KIAorYm9vbCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6aXNPZmZsb2FkZWRPckRpcmVjdCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIChtVGhyZWFkVHlwZSA9PSBUaHJlYWRCYXNlOjpPRkZMT0FEIHx8IG1UaHJlYWRUeXBlID09IFRocmVhZEJhc2U6OkRJUkVDVCk7Cit9CisKK2Jvb2wgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OmlzVm9sdW1lQ29udHJvbEVuYWJsZWQoKSBjb25zdAoreworICAgIHJldHVybiAoaXNWb2x1bWVDb250cm9sKCkgJiYgKGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSA/IGlzRW5hYmxlZCgpIDogaXNQcm9jZXNzRW5hYmxlZCgpKSk7Cit9CisKIHZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnNldEluQnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcikgewogICAgIEFMT0dWVigic2V0SW5CdWZmZXIgJXAiLCgmYnVmZmVyKSk7CiAKQEAgLTEwOTEsNyArMTE4Myw3IEBACiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpzZXRWb2x1bWUodWludDMyX3QgKmxlZnQsIHVpbnQzMl90ICpyaWdodCwgYm9vbCBjb250cm9sbGVyKQogewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b0xvY2tSZWVudHJhbnQgX2wobUxvY2ssIG1TZXRWb2x1bWVSZWVudHJhbnRUaWQpOwogICAgIGlmIChtU3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBtU3RhdHVzOwogICAgIH0KQEAgLTExMDAsNyArMTE5Miw4IEBACiAgICAgLy8gaWYgY29udHJvbGxlciBmbGFnIGlzIHNldCAoTm90ZSB0aGF0IGNvbnRyb2xsZXIgPT0gVFJVRSA9PiBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCBzZXQpCiAgICAgaWYgKGlzUHJvY2Vzc0VuYWJsZWQoKSAmJgogICAgICAgICAgICAgKChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1ZPTFVNRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTCB8fAotICAgICAgICAgICAgKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVk9MVU1FX01BU0spID09IEVGRkVDVF9GTEFHX1ZPTFVNRV9JTkQpKSB7CisgICAgICAgICAgICAgKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVk9MVU1FX01BU0spID09IEVGRkVDVF9GTEFHX1ZPTFVNRV9JTkQgfHwKKyAgICAgICAgICAgICAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19WT0xVTUVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVk9MVU1FX01PTklUT1IpKSB7CiAgICAgICAgIHVpbnQzMl90IHZvbHVtZVsyXTsKICAgICAgICAgdWludDMyX3QgKnBWb2x1bWUgPSBOVUxMOwogICAgICAgICB1aW50MzJfdCBzaXplID0gc2l6ZW9mKHZvbHVtZSk7CkBAIC0xMTIyLDYgKzEyMTUsMTkgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OnNldFZvbHVtZUZvck91dHB1dF9sKHVpbnQzMl90IGxlZnQsIHVpbnQzMl90IHJpZ2h0KQoreworICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgIGlmICh0aHJlYWQgIT0gMCAmJgorICAgICAgICAodGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6T0ZGTE9BRCB8fCB0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpESVJFQ1QpICYmCisgICAgICAgICFpc05vbk9mZmxvYWRhYmxlRW5hYmxlZF9sKCkpIHsKKyAgICAgICAgUGxheWJhY2tUaHJlYWQgKnQgPSAoUGxheWJhY2tUaHJlYWQgKil0aHJlYWQuZ2V0KCk7CisgICAgICAgIGZsb2F0IHZvbF9sID0gKGZsb2F0KWxlZnQgLyAoMSA8PCAyNCk7CisgICAgICAgIGZsb2F0IHZvbF9yID0gKGZsb2F0KXJpZ2h0IC8gKDEgPDwgMjQpOworICAgICAgICB0LT5zZXRWb2x1bWVGb3JPdXRwdXRfbCh2b2xfbCwgdm9sX3IpOworICAgIH0KK30KKwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnNldERldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQogewogICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKQEAgLTEyMDMsMTQgKzEzMDksMTEgQEAKIHsKICAgICBib29sIGVuYWJsZWQgPSBmYWxzZTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUhhbmRsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgRWZmZWN0SGFuZGxlICpoYW5kbGUgPSBtSGFuZGxlc1tpXTsKLSAgICAgICAgaWYgKGhhbmRsZSAhPSBOVUxMICYmICFoYW5kbGUtPmRpc2Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICBpZiAoaGFuZGxlLT5oYXNDb250cm9sKCkpIHsKLSAgICAgICAgICAgICAgICBlbmFibGVkID0gaGFuZGxlLT5lbmFibGVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICBFZmZlY3RIYW5kbGUgKmhhbmRsZSA9IGNvbnRyb2xIYW5kbGVfbCgpOworICAgIGlmIChoYW5kbGUgIT0gTlVMTCkgeworICAgICAgICBlbmFibGVkID0gaGFuZGxlLT5lbmFibGVkKCk7CiAgICAgfQorICAgIG1IYW5kbGVzLmNsZWFyKCk7CiAgICAgcmV0dXJuIGVuYWJsZWQ7CiB9CiAKQEAgLTEyODIsNiArMTM4NSw3IEBACiAgICAgY2FzZSBFRkZFQ1RfRkxBR19WT0xVTUVfTk9ORTogcy5hcHBlbmQoIm5vbmUiKTsgYnJlYWs7CiAgICAgY2FzZSBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTDogcy5hcHBlbmQoImltcGxlbWVudHMgY29udHJvbCIpOyBicmVhazsKICAgICBjYXNlIEVGRkVDVF9GTEFHX1ZPTFVNRV9JTkQ6IHMuYXBwZW5kKCJyZXF1aXJlcyBpbmRpY2F0aW9uIik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfVk9MVU1FX01PTklUT1I6IHMuYXBwZW5kKCJtb25pdG9ycyB2b2x1bWUiKTsgYnJlYWs7CiAgICAgZGVmYXVsdDogcy5hcHBlbmQoInVua25vd24vcmVzZXJ2ZWQiKTsgYnJlYWs7CiAgICAgfQogICAgIHMuYXBwZW5kKCIsICIpOwpAQCAtMTM4NCw5ICsxNDg4LDEwIEBACiAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlx0XHRDb3VsZCBub3QgbG9jayBGeCBtdXRleDpcbiIpOwogICAgIH0KIAotICAgIHJlc3VsdC5hcHBlbmQoIlx0XHRTZXNzaW9uIFN0YXR1cyBTdGF0ZSBFbmdpbmU6XG4iKTsKLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJcdFx0JTA1ZCAgICUwM2QgICAgJTAzZCAgICVwXG4iLAotICAgICAgICAgICAgbVNlc3Npb25JZCwgbVN0YXR1cywgbVN0YXRlLCBtRWZmZWN0SW50ZXJmYWNlLmdldCgpKTsKKyAgICByZXN1bHQuYXBwZW5kKCJcdFx0U2Vzc2lvbiBTdGF0dXMgU3RhdGUgUmVnaXN0ZXJlZCBFbmFibGVkIFN1c3BlbmRlZCBFbmdpbmU6XG4iKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJcdFx0JTA1ZCAgICUwM2QgICAgJTAzZCAgICVzICAgICAgICAgICVzICAgICAgICVzICAgICAgICAgJXBcbiIsCisgICAgICAgICAgICBtU2Vzc2lvbklkLCBtU3RhdHVzLCBtU3RhdGUsIG1Qb2xpY3lSZWdpc3RlcmVkID8gInkiIDogIm4iLCBtUG9saWN5RW5hYmxlZCA/ICJ5IiA6ICJuIiwKKyAgICAgICAgICAgIG1TdXNwZW5kZWQgPyAieSIgOiAibiIsIG1FZmZlY3RJbnRlcmZhY2UuZ2V0KCkpOwogCiAgICAgcmVzdWx0LmFwcGVuZCgiXHRcdERlc2NyaXB0b3I6XG4iKTsKICAgICBjaGFyIHV1aWRTdHJbNjRdOwpAQCAtMTQ0OSw2ICsxNTU0LDExIEBACiAKICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQubGVuZ3RoKCkpOwogCisgICAgaWYgKG1FZmZlY3RJbnRlcmZhY2UgIT0gMCkgeworICAgICAgICBkcHJpbnRmKGZkLCAiXHRFZmZlY3QgSUQgJWQgSEFMIGR1bXA6XG4iLCBtSWQpOworICAgICAgICAodm9pZCltRWZmZWN0SW50ZXJmYWNlLT5kdW1wKGZkKTsKKyAgICB9CisKICAgICBpZiAobG9ja2VkKSB7CiAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgIH0KQEAgLTE1MTYsNiArMTYyNiwxMiBAQAogCiAgICAgbUVuYWJsZWQgPSB0cnVlOwogCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZWZmZWN0LT51cGRhdGVQb2xpY3lTdGF0ZSgpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgbUVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBlZmZlY3QtPnRocmVhZCgpLnByb21vdGUoKTsKICAgICBpZiAodGhyZWFkICE9IDApIHsKICAgICAgICAgdGhyZWFkLT5jaGVja1N1c3BlbmRPbkVmZmVjdEVuYWJsZWQoZWZmZWN0LCB0cnVlLCBlZmZlY3QtPnNlc3Npb25JZCgpKTsKQEAgLTE1MjYsNyArMTY0Miw3IEBACiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBlZmZlY3QtPnNldEVuYWJsZWQodHJ1ZSk7CisgICAgc3RhdHVzID0gZWZmZWN0LT5zZXRFbmFibGVkKHRydWUpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgaWYgKHRocmVhZCAhPSAwKSB7CiAgICAgICAgICAgICB0aHJlYWQtPmNoZWNrU3VzcGVuZE9uRWZmZWN0RW5hYmxlZChlZmZlY3QsIGZhbHNlLCBlZmZlY3QtPnNlc3Npb25JZCgpKTsKQEAgLTE1NjksNiArMTY4NSw4IEBACiAgICAgfQogICAgIG1FbmFibGVkID0gZmFsc2U7CiAKKyAgICBlZmZlY3QtPnVwZGF0ZVBvbGljeVN0YXRlKCk7CisKICAgICBpZiAoZWZmZWN0LT5zdXNwZW5kZWQoKSkgewogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQpAQCAtMTYwNCwyMCArMTcyMiwxNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIG1EaXNjb25uZWN0ZWQgPSB0cnVlOwotICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZDsKICAgICB7CiAgICAgICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0ID0gbUVmZmVjdC5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChlZmZlY3QgIT0gMCkgewotICAgICAgICAgICAgdGhyZWFkID0gZWZmZWN0LT50aHJlYWQoKS5wcm9tb3RlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHRocmVhZCAhPSAwKSB7Ci0gICAgICAgIHRocmVhZC0+ZGlzY29ubmVjdEVmZmVjdEhhbmRsZSh0aGlzLCB1bnBpbklmTGFzdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gdHJ5IHRvIGNsZWFudXAgYXMgbXVjaCBhcyB3ZSBjYW4KLSAgICAgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3QgPSBtRWZmZWN0LnByb21vdGUoKTsKLSAgICAgICAgaWYgKGVmZmVjdCAhPSAwICYmIGVmZmVjdC0+ZGlzY29ubmVjdEhhbmRsZSh0aGlzLCB1bnBpbklmTGFzdCkgPiAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiJXMgRWZmZWN0IGhhbmRsZSAlcCBkaXNjb25uZWN0ZWQgYWZ0ZXIgdGhyZWFkIGRlc3RydWN0aW9uIiwgX19GVU5DVElPTl9fLCB0aGlzKTsKKyAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IGVmZmVjdC0+dGhyZWFkKCkucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKHRocmVhZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgdGhyZWFkLT5kaXNjb25uZWN0RWZmZWN0SGFuZGxlKHRoaXMsIHVucGluSWZMYXN0KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZWZmZWN0LT5kaXNjb25uZWN0SGFuZGxlKHRoaXMsIHVucGluSWZMYXN0KSA+IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMgRWZmZWN0IGhhbmRsZSAlcCBkaXNjb25uZWN0ZWQgYWZ0ZXIgdGhyZWFkIGRlc3RydWN0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHRoaXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWZmZWN0LT51cGRhdGVQb2xpY3lTdGF0ZSgpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0xODE1LDcgKzE5MzAsNyBAQAogICAgIGJvb2wgbG9ja2VkID0gbUNibGsgIT0gTlVMTCAmJiBBdWRpb0ZsaW5nZXI6OmR1bXBUcnlMb2NrKG1DYmxrLT5sb2NrKTsKIAogICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIlx0XHRcdCU1ZCAgICAlNWQgICUzcyAgICAlM3MgICU1dSAgJTV1XG4iLAotICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWRfY2FjaGVkIDogbUNsaWVudC0+cGlkKCksCisgICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZCgpIDogbUNsaWVudC0+cGlkKCksCiAgICAgICAgICAgICBtUHJpb3JpdHksCiAgICAgICAgICAgICBtSGFzQ29udHJvbCA/ICJ5ZXMiIDogIm5vIiwKICAgICAgICAgICAgIGxvY2tlZCA/ICJ5ZXMiIDogIm5vIiwKQEAgLTE4OTEsNiArMjAwNiwxNiBAQAogICAgIHJldHVybiAwOwogfQogCitzdGQ6OnZlY3RvcjxpbnQ+IEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OmdldEVmZmVjdElkcygpCit7CisgICAgc3RkOjp2ZWN0b3I8aW50PiBpZHM7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlkcy5wdXNoX2JhY2sobUVmZmVjdHNbaV0tPmlkKCkpOworICAgIH0KKyAgICByZXR1cm4gaWRzOworfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OmNsZWFySW5wdXRCdWZmZXIoKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC0yMjAwLDggKzIzMjUsNyBAQAogCiAgICAgLy8gZmlyc3QgdXBkYXRlIHZvbHVtZSBjb250cm9sbGVyCiAgICAgZm9yIChzaXplX3QgaSA9IHNpemU7IGkgPiAwOyBpLS0pIHsKLSAgICAgICAgaWYgKG1FZmZlY3RzW2kgLSAxXS0+aXNQcm9jZXNzRW5hYmxlZCgpICYmCi0gICAgICAgICAgICAobUVmZmVjdHNbaSAtIDFdLT5kZXNjKCkuZmxhZ3MgJiBFRkZFQ1RfRkxBR19WT0xVTUVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwpIHsKKyAgICAgICAgaWYgKG1FZmZlY3RzW2kgLSAxXS0+aXNWb2x1bWVDb250cm9sRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICBjdHJsSWR4ID0gaSAtIDE7CiAgICAgICAgICAgICBoYXNDb250cm9sID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjIyOSw3ICsyMzUzLDcgQEAKICAgICB9CiAgICAgLy8gdGhlbiBpbmRpY2F0ZSB2b2x1bWUgdG8gYWxsIG90aGVyIGVmZmVjdHMgaW4gY2hhaW4uCiAgICAgLy8gUGFzcyBhbHRlcmVkIHZvbHVtZSB0byBlZmZlY3RzIGJlZm9yZSB2b2x1bWUgY29udHJvbGxlcgotICAgIC8vIGFuZCByZXF1ZXN0ZWQgdm9sdW1lIHRvIGVmZmVjdHMgYWZ0ZXIgY29udHJvbGxlcgorICAgIC8vIGFuZCByZXF1ZXN0ZWQgdm9sdW1lIHRvIGVmZmVjdHMgYWZ0ZXIgY29udHJvbGxlciBvciB3aXRoIHZvbHVtZSBtb25pdG9yIGZsYWcKICAgICB1aW50MzJfdCBsVm9sID0gbmV3TGVmdDsKICAgICB1aW50MzJfdCByVm9sID0gbmV3UmlnaHQ7CiAKQEAgLTIyNDIsMTEgKzIzNjYsMTggQEAKICAgICAgICAgICAgIGxWb2wgPSAqbGVmdDsKICAgICAgICAgICAgIHJWb2wgPSAqcmlnaHQ7CiAgICAgICAgIH0KLSAgICAgICAgbUVmZmVjdHNbaV0tPnNldFZvbHVtZSgmbFZvbCwgJnJWb2wsIGZhbHNlKTsKKyAgICAgICAgLy8gUGFzcyByZXF1ZXN0ZWQgdm9sdW1lIGRpcmVjdGx5IGlmIHRoaXMgaXMgdm9sdW1lIG1vbml0b3IgbW9kdWxlCisgICAgICAgIGlmIChtRWZmZWN0c1tpXS0+aXNWb2x1bWVNb25pdG9yKCkpIHsKKyAgICAgICAgICAgIG1FZmZlY3RzW2ldLT5zZXRWb2x1bWUobGVmdCwgcmlnaHQsIGZhbHNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1FZmZlY3RzW2ldLT5zZXRWb2x1bWUoJmxWb2wsICZyVm9sLCBmYWxzZSk7CisgICAgICAgIH0KICAgICB9CiAgICAgKmxlZnQgPSBuZXdMZWZ0OwogICAgICpyaWdodCA9IG5ld1JpZ2h0OwogCisgICAgc2V0Vm9sdW1lRm9yT3V0cHV0X2woKmxlZnQsICpyaWdodCk7CisKICAgICByZXR1cm4gaGFzQ29udHJvbDsKIH0KIApAQCAtMjI3MywxMyArMjQwNCwxMCBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwogICAgIFN0cmluZzggcmVzdWx0OwogCi0gICAgc2l6ZV90IG51bUVmZmVjdHMgPSBtRWZmZWN0cy5zaXplKCk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICV6dSBlZmZlY3RzIGZvciBzZXNzaW9uICVkXG4iLCBudW1FZmZlY3RzLCBtU2Vzc2lvbklkKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgY29uc3Qgc2l6ZV90IG51bUVmZmVjdHMgPSBtRWZmZWN0cy5zaXplKCk7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICAgICV6dSBlZmZlY3RzIGZvciBzZXNzaW9uICVkXG4iLCBudW1FZmZlY3RzLCBtU2Vzc2lvbklkKTsKIAogICAgIGlmIChudW1FZmZlY3RzKSB7CiAgICAgICAgIGJvb2wgbG9ja2VkID0gQXVkaW9GbGluZ2VyOjpkdW1wVHJ5TG9jayhtTG9jayk7CkBAIC0yMzA3LDYgKzI0MzUsOCBAQAogICAgICAgICBpZiAobG9ja2VkKSB7CiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogICAgIH0KIH0KIApAQCAtMjUwOCw2ICsyNjM4LDExIEBACiBib29sIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OmlzTm9uT2ZmbG9hZGFibGVFbmFibGVkKCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBpc05vbk9mZmxvYWRhYmxlRW5hYmxlZF9sKCk7Cit9CisKK2Jvb2wgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6aXNOb25PZmZsb2FkYWJsZUVuYWJsZWRfbCgpCit7CiAgICAgc2l6ZV90IHNpemUgPSBtRWZmZWN0cy5zaXplKCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgICAgICAgaWYgKG1FZmZlY3RzW2ldLT5pc0VuYWJsZWQoKSAmJiAhbUVmZmVjdHNbaV0tPmlzT2ZmbG9hZGFibGUoKSkgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmgKaW5kZXggMjMyN2JiOS4uMjIwODc0ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5oCkBAIC04NSw2ICs4NSw4IEBACiAgICAgc3RhdHVzX3QgICAgc2V0RW5hYmxlZF9sKGJvb2wgZW5hYmxlZCk7CiAgICAgYm9vbCBpc0VuYWJsZWQoKSBjb25zdDsKICAgICBib29sIGlzUHJvY2Vzc0VuYWJsZWQoKSBjb25zdDsKKyAgICBib29sIGlzT2ZmbG9hZGVkT3JEaXJlY3QoKSBjb25zdDsKKyAgICBib29sIGlzVm9sdW1lQ29udHJvbEVuYWJsZWQoKSBjb25zdDsKIAogICAgIHZvaWQgICAgICAgIHNldEluQnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcik7CiAgICAgaW50MTZfdCAgICAgKmluQnVmZmVyKCkgY29uc3QgewpAQCAtOTUsNyArOTcsOCBAQAogICAgICAgICByZXR1cm4gbU91dEJ1ZmZlciAhPSAwID8gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4obU91dEJ1ZmZlci0+cHRyKCkpIDogTlVMTDsKICAgICB9CiAgICAgdm9pZCAgICAgICAgc2V0Q2hhaW4oY29uc3Qgd3A8RWZmZWN0Q2hhaW4+JiBjaGFpbikgeyBtQ2hhaW4gPSBjaGFpbjsgfQotICAgIHZvaWQgICAgICAgIHNldFRocmVhZChjb25zdCB3cDxUaHJlYWRCYXNlPiYgdGhyZWFkKSB7IG1UaHJlYWQgPSB0aHJlYWQ7IH0KKyAgICB2b2lkICAgICAgICBzZXRUaHJlYWQoY29uc3Qgd3A8VGhyZWFkQmFzZT4mIHRocmVhZCkKKyAgICAgICAgICAgICAgICAgICAgeyBtVGhyZWFkID0gdGhyZWFkOyBtVGhyZWFkVHlwZSA9IHRocmVhZC5wcm9tb3RlKCktPnR5cGUoKTsgfQogICAgIGNvbnN0IHdwPFRocmVhZEJhc2U+JiB0aHJlYWQoKSB7IHJldHVybiBtVGhyZWFkOyB9CiAKICAgICBzdGF0dXNfdCBhZGRIYW5kbGUoRWZmZWN0SGFuZGxlICpoYW5kbGUpOwpAQCAtMTI4LDExICsxMzEsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX0hXX0FDQ19NQVNLKSA9PSAwOyB9CiAgICAgYm9vbCAgICAgICAgICAgICBpc1Byb2Nlc3NJbXBsZW1lbnRlZCgpIGNvbnN0CiAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19OT19QUk9DRVNTKSA9PSAwOyB9CisgICAgYm9vbCAgICAgICAgICAgICBpc1ZvbHVtZUNvbnRyb2woKSBjb25zdAorICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVk9MVU1FX01BU0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkw7IH0KKyAgICBib29sICAgICAgICAgICAgIGlzVm9sdW1lTW9uaXRvcigpIGNvbnN0CisgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19WT0xVTUVfTUFTSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBFRkZFQ1RfRkxBR19WT0xVTUVfTU9OSVRPUjsgfQogICAgIHN0YXR1c190ICAgICAgICAgc2V0T2ZmbG9hZGVkKGJvb2wgb2ZmbG9hZGVkLCBhdWRpb19pb19oYW5kbGVfdCBpbyk7CiAgICAgYm9vbCAgICAgICAgICAgICBpc09mZmxvYWRlZCgpIGNvbnN0OwogICAgIHZvaWQgICAgICAgICAgICAgYWRkRWZmZWN0VG9IYWxfbCgpOwogICAgIHZvaWQgICAgICAgICAgICAgcmVsZWFzZV9sKCk7CiAKKyAgICBzdGF0dXNfdCAgICAgICAgIHVwZGF0ZVBvbGljeVN0YXRlKCk7CisKICAgICB2b2lkICAgICAgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAogcHJpdmF0ZToKQEAgLTE1MCw2ICsxNjEsNyBAQAogCiBtdXRhYmxlIE11dGV4ICAgICAgICAgICAgICAgbUxvY2s7ICAgICAgLy8gbXV0ZXggZm9yIHByb2Nlc3MsIGNvbW1hbmRzIGFuZCBoYW5kbGVzIGxpc3QgcHJvdGVjdGlvbgogICAgIHdwPFRocmVhZEJhc2U+ICAgICAgbVRocmVhZDsgICAgLy8gcGFyZW50IHRocmVhZAorICAgIFRocmVhZEJhc2U6OnR5cGVfdCAgbVRocmVhZFR5cGU7IC8vIHBhcmVudCB0aHJlYWQgdHlwZQogICAgIHdwPEVmZmVjdENoYWluPiAgICAgbUNoYWluOyAgICAgLy8gcGFyZW50IGVmZmVjdCBjaGFpbgogICAgIGNvbnN0IGludCAgICAgICAgICAgbUlkOyAgICAgICAgLy8gdGhpcyBpbnN0YW5jZSB1bmlxdWUgSUQKICAgICBjb25zdCBhdWRpb19zZXNzaW9uX3QgbVNlc3Npb25JZDsgLy8gYXVkaW8gc2Vzc2lvbiBJRApAQCAtMTc2LDYgKzE4OCwzNCBAQAogICAgIHVpbnQzMl90IG1JbkNoYW5uZWxDb3VudFJlcXVlc3RlZDsKICAgICB1aW50MzJfdCBtT3V0Q2hhbm5lbENvdW50UmVxdWVzdGVkOwogI2VuZGlmCisKKyAgICBjbGFzcyBBdXRvTG9ja1JlZW50cmFudCB7CisgICAgcHVibGljOgorICAgICAgICBBdXRvTG9ja1JlZW50cmFudChNdXRleCYgbXV0ZXgsIHBpZF90IGFsbG93ZWRUaWQpCisgICAgICAgICAgICA6IG1NdXRleChnZXR0aWQoKSA9PSBhbGxvd2VkVGlkID8gbnVsbHB0ciA6ICZtdXRleCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKG1NdXRleCAhPSBudWxscHRyKSBtTXV0ZXgtPmxvY2soKTsKKyAgICAgICAgfQorICAgICAgICB+QXV0b0xvY2tSZWVudHJhbnQoKSB7CisgICAgICAgICAgICBpZiAobU11dGV4ICE9IG51bGxwdHIpIG1NdXRleC0+dW5sb2NrKCk7CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICBNdXRleCAqIGNvbnN0IG1NdXRleDsKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0ZXhwciBwaWRfdCBJTlZBTElEX1BJRCA9IChwaWRfdCktMTsKKyAgICAvLyB0aGlzIHRpZCBpcyBhbGxvd2VkIHRvIGNhbGwgc2V0Vm9sdW1lKCkgd2l0aG91dCBhY3F1aXJpbmcgdGhlIG11dGV4LgorICAgIHBpZF90IG1TZXRWb2x1bWVSZWVudHJhbnRUaWQgPSBJTlZBTElEX1BJRDsKKworICAgIC8vIEF1ZGlvIHBvbGljeSBlZmZlY3Qgc3RhdGUgbWFuYWdlbWVudAorICAgIC8vIE11dGV4IHByb3RlY3RpbmcgdHJhbnNhY3Rpb25zIHdpdGggYXVkaW8gcG9saWN5IG1hbmFnZXIgYXMgbUxvY2sgY2Fubm90CisgICAgLy8gYmUgaGVsZCB0byBhdm9pZCBjcm9zcyBkZWFkbG9ja3Mgd2l0aCBhdWRpbyBwb2xpY3kgbXV0ZXgKKyAgICBNdXRleCAgIG1Qb2xpY3lMb2NrOworICAgIC8vIEVmZmVjdCBpcyByZWdpc3RlcmVkIGluIEFQTSBvciBub3QKKyAgICBib29sICAgIG1Qb2xpY3lSZWdpc3RlcmVkID0gZmFsc2U7CisgICAgLy8gRWZmZWN0IGVuYWJsZWQgc3RhdGUgY29tbXVuaWNhdGVkIHRvIEFQTS4gRW5hYmxlZCBzdGF0ZSBjb3JyZXNwb25kcyB0bworICAgIC8vIHN0YXRlIHJlcXVlc3RlZCBieSB0aGUgRWZmZWN0SGFuZGxlIHdpdGggY29udHJvbAorICAgIGJvb2wgICAgbVBvbGljeUVuYWJsZWQgPSBmYWxzZTsKIH07CiAKIC8vIFRoZSBFZmZlY3RIYW5kbGUgY2xhc3MgaW1wbGVtZW50cyB0aGUgSUVmZmVjdCBpbnRlcmZhY2UuIEl0IHByb3ZpZGVzIHJlc291cmNlcwpAQCAtMzA2LDYgKzM0Niw3IEBACiAgICAgc3A8RWZmZWN0TW9kdWxlPiBnZXRFZmZlY3RGcm9tRGVzY19sKGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpOwogICAgIHNwPEVmZmVjdE1vZHVsZT4gZ2V0RWZmZWN0RnJvbUlkX2woaW50IGlkKTsKICAgICBzcDxFZmZlY3RNb2R1bGU+IGdldEVmZmVjdEZyb21UeXBlX2woY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSk7CisgICAgc3RkOjp2ZWN0b3I8aW50PiBnZXRFZmZlY3RJZHMoKTsKICAgICAvLyBGSVhNRSB1c2UgZmxvYXQgdG8gaW1wcm92ZSB0aGUgZHluYW1pYyByYW5nZQogICAgIGJvb2wgc2V0Vm9sdW1lX2wodWludDMyX3QgKmxlZnQsIHVpbnQzMl90ICpyaWdodCwgYm9vbCBmb3JjZSA9IGZhbHNlKTsKICAgICB2b2lkIHJlc2V0Vm9sdW1lX2woKTsKQEAgLTM1Myw2ICszOTQsNyBAQAogCiAgICAgLy8gQXQgbGVhc3Qgb25lIG5vbiBvZmZsb2FkYWJsZSBlZmZlY3QgaW4gdGhlIGNoYWluIGlzIGVuYWJsZWQKICAgICBib29sIGlzTm9uT2ZmbG9hZGFibGVFbmFibGVkKCk7CisgICAgYm9vbCBpc05vbk9mZmxvYWRhYmxlRW5hYmxlZF9sKCk7CiAKICAgICB2b2lkIHN5bmNIYWxFZmZlY3RzU3RhdGUoKTsKIApAQCAtNDAzLDYgKzQ0NSw4IEBACiAKICAgICB2b2lkIHNldFRocmVhZChjb25zdCBzcDxUaHJlYWRCYXNlPiYgdGhyZWFkKTsKIAorICAgIHZvaWQgc2V0Vm9sdW1lRm9yT3V0cHV0X2wodWludDMyX3QgbGVmdCwgdWludDMyX3QgcmlnaHQpOworCiAgICAgICAgICAgICAgd3A8VGhyZWFkQmFzZT4gbVRocmVhZDsgICAgIC8vIHBhcmVudCBtaXhlciB0aHJlYWQKICAgICBtdXRhYmxlICBNdXRleCBtTG9jazsgICAgICAgIC8vIG11dGV4IHByb3RlY3RpbmcgZWZmZWN0IGxpc3QKICAgICAgICAgICAgICBWZWN0b3I8IHNwPEVmZmVjdE1vZHVsZT4gPiBtRWZmZWN0czsgLy8gbGlzdCBvZiBlZmZlY3QgbW9kdWxlcwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5jcHAKaW5kZXggZDA2Mzc3Mi4uZGQ4NGJmMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmUuY3BwCkBAIC0yMCw2ICsyMCw3IEBACiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19BVURJTwogCiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Zvcm1hdC5oPgogI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+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+bU5CTG9nV3JpdGVyICE9IE5VTEwgPworICAgICAgICAgICAgICAgICAgICBuZXh0LT5tTkJMb2dXcml0ZXIgOiBtRHVtbXlOQkxvZ1dyaXRlci5nZXQoKTsKKyAgICAgICAgICAgIHNldE5CTG9nV3JpdGVyKHRsTkJMb2dXcml0ZXIpOyAvLyBGYXN0TWl4ZXIgaW5mb3JtcyBpdHMgQXVkaW9NaXhlciwgRmFzdENhcHR1cmUgaWdub3JlcwogCiAgICAgICAgICAgICAvLyBXZSB3YW50IHRvIGFsd2F5cyBoYXZlIGEgdmFsaWQgcmVmZXJlbmNlIHRvIHRoZSBwcmV2aW91cyAobm9uLWlkbGUpIHN0YXRlLgogICAgICAgICAgICAgLy8gSG93ZXZlciwgdGhlIHN0YXRlIHF1ZXVlIG9ubHkgZ3VhcmFudGVlcyBhY2Nlc3MgdG8gY3VycmVudCBhbmQgcHJldmlvdXMgc3RhdGVzLgpAQCAtMjYwLDYgKzI1OSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtSXNXYXJtID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1NZWFzdXJlZFdhcm11cFRzID0gbU1lYXN1cmVkV2FybXVwVHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBtRHVtcFN0YXRlLT5tV2FybXVwQ3ljbGVzID0gbVdhcm11cEN5Y2xlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtZWFzdXJlZFdhcm11cE1zID0gKG1NZWFzdXJlZFdhcm11cFRzLnR2X3NlYyAqIDFlMykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobU1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyAqIDFlLTYpOworICAgICAgICAgICAgICAgICAgICAgICAgTE9HX1dBUk1VUF9USU1FKG1lYXN1cmVkV2FybXVwTXMpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1TbGVlcE5zID0gLTE7CkBAIC0yNzAsNiArMjcyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJ1bmRlcnJ1bjogdGltZSBzaW5jZSBsYXN0IGN5Y2xlICVkLiUwM2xkIHNlYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIHNlYywgbnNlYyAvIDEwMDAwMDBMKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1VbmRlcnJ1bnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR19VTkRFUlJVTihhdWRpb191dGlsc19uc19mcm9tX3RpbWVzcGVjKCZuZXdUcykpOwogICAgICAgICAgICAgICAgICAgICAgICAgbUlnbm9yZU5leHRPdmVycnVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuc2VjIDwgbU92ZXJydW5OcykgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1JZ25vcmVOZXh0T3ZlcnJ1bikgewpAQCAtMjc5LDYgKzI4Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm92ZXJydW46IHRpbWUgc2luY2UgbGFzdCBjeWNsZSAlZC4lMDNsZCBzZWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgc2VjLCBuc2VjIC8gMTAwMDAwMEwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1PdmVycnVucysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR19PVkVSUlVOKGF1ZGlvX3V0aWxzX25zX2Zyb21fdGltZXNwZWMoJm5ld1RzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGZvcmNlcyBhIG1pbmltdW0gY3ljbGUgdGltZS4gSXQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBjb21wZW5zYXRlcyBmb3IgYW4gYXVkaW8gSEFMIHdpdGggaml0dGVyIGR1ZSB0byBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uCkBAIC0zMzksNiArMzQzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2Ugc3RvcmVzICMxLCAjMiwgIzMgYXJlIG5vdCBhdG9taWMgd2l0aCByZXNwZWN0IHRvIGVhY2ggb3RoZXIsCiAgICAgICAgICAgICAgICAgICAgIC8vIG9yIHdpdGggcmVzcGVjdCB0byBzdG9yZSAjNCBiZWxvdwogICAgICAgICAgICAgICAgICAgICBtRHVtcFN0YXRlLT5tTW9ub3RvbmljTnNbaV0gPSBtb25vdG9uaWNOczsKKyAgICAgICAgICAgICAgICAgICAgTE9HX1dPUktfVElNRShtb25vdG9uaWNOcyk7CiAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1Mb2FkTnNbaV0gPSBsb2FkTnM7CiAjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCiAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1DcHVrSHpbaV0gPSBrSHo7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuaAppbmRleCAyYTcxNDE0Li4zZjZiMjA2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmgKQEAgLTc4LDEyICs3OCwxMSBAQAogICAgIHVuc2lnbmVkICAgICAgICBtQ29sZEdlbjsgICAgICAgLy8gbGFzdCBvYnNlcnZlZCBtQ29sZEdlbgogICAgIGJvb2wgICAgICAgICAgICBtSXNXYXJtOyAgICAgICAgLy8gdHJ1ZSBtZWFucyByZWFkeSB0byBtaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxzZSBtZWFucyB3YWl0IGZvciB3YXJtdXAgYmVmb3JlIG1peGluZwotICAgIHN0cnVjdCB0aW1lc3BlYyBtTWVhc3VyZWRXYXJtdXBUczsgIC8vIGhvdyBsb25nIGRpZCBpdCB0YWtlIGZvciB3YXJtdXAgdG8gY29tcGxldGUKLSAgICB1aW50MzJfdCAgICAgICAgbVdhcm11cEN5Y2xlczsgIC8vIGNvdW50ZXIgb2YgbnVtYmVyIG9mIGxvb3AgY3ljbGVzIGR1cmluZyB3YXJtdXAgcGhhc2UKLSAgICB1aW50MzJfdCAgICAgICAgbVdhcm11cENvbnNlY3V0aXZlSW5SYW5nZUN5Y2xlczsgICAgLy8gbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGN5Y2xlcyBpbiByYW5nZQotICAgIE5CTG9nOjpXcml0ZXIgICBtRHVtbXlOQkxvZ1dyaXRlcjsKLSAgICBOQkxvZzo6V3JpdGVyKiAgbU5CTG9nV3JpdGVyOyAgIC8vIGFsd2F5cyBub24tbnVsbHB0cjogcmVhbCBOQkxvZzo6V3JpdGVyKiBvciAmbUR1bW15TkJMb2dXcml0ZXIKLSAgICBzdGF0dXNfdCAgICAgICAgbVRpbWVzdGFtcFN0YXR1czsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgICBtTWVhc3VyZWRXYXJtdXBUczsgIC8vIGhvdyBsb25nIGRpZCBpdCB0YWtlIGZvciB3YXJtdXAgdG8gY29tcGxldGUKKyAgICB1aW50MzJfdCAgICAgICAgICBtV2FybXVwQ3ljbGVzOyAgLy8gY291bnRlciBvZiBudW1iZXIgb2YgbG9vcCBjeWNsZXMgZHVyaW5nIHdhcm11cCBwaGFzZQorICAgIHVpbnQzMl90ICAgICAgICAgIG1XYXJtdXBDb25zZWN1dGl2ZUluUmFuZ2VDeWNsZXM7ICAgIC8vIG51bWJlciBvZiBjb25zZWN1dGl2ZSBjeWNsZXMgaW4gcmFuZ2UKKyAgICBjb25zdCBzcDxOQkxvZzo6V3JpdGVyPiBtRHVtbXlOQkxvZ1dyaXRlcntuZXcgTkJMb2c6OldyaXRlcigpfTsKKyAgICBzdGF0dXNfdCAgICAgICAgICBtVGltZXN0YW1wU3RhdHVzOwogCiAgICAgRmFzdFRocmVhZFN0YXRlOjpDb21tYW5kIG1Db21tYW5kOwogICAgIGJvb2wgICAgICAgICAgICBtQXR0ZW1wdGVkV3JpdGU7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTW1hcFRyYWNrcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL01tYXBUcmFja3MuaAppbmRleCA2ZjU0NmMzLi5iODNmNmI1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTW1hcFRyYWNrcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9NbWFwVHJhY2tzLmgKQEAgLTI4LDggKzI4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc091dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IGNyZWF0b3JQaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NbWFwVHJhY2soKTsKIApAQCAtMzksOCArNDEsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHRyaWdnZXJTZXNzaW9uKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHN0b3AoKTsKICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzRmFzdFRyYWNrKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzRGlyZWN0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQogCi0gICAgIHN0YXRpYyB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7CisgICAgICAgICAgICB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBhcHBlbmREdW1wKFN0cmluZzgmIHJlc3VsdCwgYm9vbCBhY3RpdmUpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm90ZWN0ZWQgYnkgTU1hcFRocmVhZDo6bUxvY2sKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9OQkFJT19UZWUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL05CQUlPX1RlZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMwODNkNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9OQkFJT19UZWUuY3BwCkBAIC0wLDAgKzEsNTE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJOQkFJT19UZWUiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGZ1dHVyZT4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Zvcm1hdC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3NuZGZpbGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9QaXBlUmVhZGVyLmg+CisKKyNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSAiTkJBSU9fVGVlLmgiCisKKy8vIEVuYWJsZWQgd2l0aCBURUVfU0lOSyBpbiBDb25maWd1cmF0aW9uLmgKKyNpZmRlZiBURUVfU0lOSworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qCisgVGVlIGZpbGVuYW1lcyBnZW5lcmF0ZWQgYXMgZm9sbG93czoKKworICJhZnRlZV9EYXRlX1RocmVhZElkX0NfcmVhc29uLndhdiIgUmVjb3JkVGhyZWFkCisgImFmdGVlX0RhdGVfVGhyZWFkSWRfTV9yZWFzb24ud2F2IiBNaXhlclRocmVhZCAoTm9ybWFsKQorICJhZnRlZV9EYXRlX1RocmVhZElkX0ZfcmVhc29uLndhdiIgTWl4ZXJUaHJlYWQgKEZhc3QpCisgImFmdGVlX0RhdGVfVGhyZWFkSWRfVHJhY2tJZF9SX3JlYXNvbi53YXYiIFJlY29yZFRyYWNrCisgImFmdGVlX0RhdGVfVGhyZWFkSWRfVHJhY2tJZF9UcmFja05hbWVfVF9yZWFzb24ud2F2IiBQbGF5YmFja1RyYWNrCisKKyB3aGVyZSBEYXRlID0gWVlZWW1tZGRfSEhNTVNTX01TRUMKKworIHdoZXJlIFJlYXNvbiA9IFsgRFRPUiB8IERVTVAgfCBSRU1PVkUgXQorCisgRXhhbXBsZXM6CisgIGFmdGVlXzIwMTgwNDI0XzE1MzgxMV8wMzhfMTNfNTdfMl9UX1JFTU9WRS53YXYKKyAgYWZ0ZWVfMjAxODA0MjRfMTUzODExXzIxOF8xM181N18yX1RfUkVNT1ZFLndhdgorICBhZnRlZV8yMDE4MDQyNF8xNTM4MTFfMzc4XzEzXzU3XzJfVF9SRU1PVkUud2F2CisgIGFmdGVlXzIwMTgwNDI0XzE1MzgyNV8xNDdfNjJfQ19EVU1QLndhdgorICBhZnRlZV8yMDE4MDQyNF8xNTM4MjVfMTQ4XzYyXzU5X1JfRFVNUC53YXYKKyAgYWZ0ZWVfMjAxODA0MjRfMTUzODI1XzE0OV8xM19GX0RVTVAud2F2CisgIGFmdGVlXzIwMTgwNDI0XzE1Mzg0Ml8xMjVfNjJfNTlfUl9SRU1PVkUud2F2CisgIGFmdGVlXzIwMTgwNDI0XzE1Mzg0Ml8xNjhfNjJfQ19EVE9SLndhdgorKi8KKworc3RhdGljIGNvbnN0ZXhwciBjaGFyIERFRkFVTFRfUFJFRklYW10gPSAiYWZ0ZWVfIjsKK3N0YXRpYyBjb25zdGV4cHIgY2hhciBERUZBVUxUX0RJUkVDVE9SWVtdID0gIi9kYXRhL21pc2MvYXVkaW9zZXJ2ZXIiOworc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgREVGQVVMVF9USFJFQURQT09MX1NJWkUgPSA4OworCisvKiogQXVkaW9GaWxlSGFuZGxlciBtYW5hZ2VzIHRlbXBvcmFyeSBhdWRpbyB3YXYgZmlsZXMgd2l0aCBhIGxlYXN0IHJlY2VudGx5IGNyZWF0ZWQKKyAgICByZXRlbnRpb24gcG9saWN5LgorCisgICAgVGhlIHRlbXBvcmFyeSBmaWxlbmFtZXMgYXJlIHN5c3RlbWF0aWNhbGx5IGdlbmVyYXRlZC4gQSBjb21tb24gZmlsZW5hbWUgcHJlZml4LAorICAgIHN0b3JhZ2UgZGlyZWN0b3J5LCBhbmQgY29uY3VycmVuY3kgcG9vbCBhcmUgcGFzc2VkIGluIG9uIGNyZWF0aW5nIHRoZSBvYmplY3QuCisKKyAgICBUZW1wb3JhcnkgZmlsZXMgYXJlIGNyZWF0ZWQgYnkgImNyZWF0ZSIsIHdoaWNoIHJldHVybnMgYSBmaWxlbmFtZSBnZW5lcmF0ZWQgYnkKKworICAgIHByZWZpeCArIDE0IGNoYXIgZGF0ZSArIHN1ZmZpeAorCisgICAgVE9ETyBNb3ZlIHRvIGF1ZGlvX3V0aWxzLgorICAgIFRPRE8gQXZvaWQgcG9pbnRpbmcgdHdvIEF1ZGlvRmlsZUhhbmRsZXJzIHRvIHRoZSBzYW1lIGRpcmVjdG9yeSBhbmQgcHJlZml4CisgICAgYXMgd2UgZG9uJ3QgaGF2ZSBhIHByZWZpeCBzcGVjaWZpYyBsb2NrIGZpbGUuICovCisKK2NsYXNzIEF1ZGlvRmlsZUhhbmRsZXIgeworcHVibGljOgorCisgICAgQXVkaW9GaWxlSGFuZGxlcihjb25zdCBzdGQ6OnN0cmluZyAmcHJlZml4LCBjb25zdCBzdGQ6OnN0cmluZyAmZGlyZWN0b3J5LCBzaXplX3QgcG9vbCkKKyAgICAgICAgOiBtVGhyZWFkUG9vbChwb29sKQorICAgICAgICAsIG1QcmVmaXgocHJlZml4KQorICAgIHsKKyAgICAgICAgKHZvaWQpc2V0RGlyZWN0b3J5KGRpcmVjdG9yeSk7CisgICAgfQorCisgICAgLyoqIHJldHVybnMgZmlsZW5hbWUgb2YgY3JlYXRlZCBhdWRpbyBmaWxlLCBlbHNlIGVtcHR5IHN0cmluZyBvbiBmYWlsdXJlLiAqLworICAgIHN0ZDo6c3RyaW5nIGNyZWF0ZSgKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3NpemVfdCAvKiBmcmFtZXNfcmVhZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiAvKiBidWZmZXIgKi8sIHNpemVfdCAvKiBzaXplX2luX2ZyYW1lcyAqLyk+IHJlYWRlciwKKyAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc3VmZml4KTsKKworcHJpdmF0ZToKKyAgICAvKiogc2V0cyB0aGUgY3VycmVudCBkaXJlY3RvcnkuIHRoaXMgaXMgY3VycmVudGx5IHByaXZhdGUgdG8gYXZvaWQgY29uZnVzaW9uCisgICAgICAgIHdoZW4gY2hhbmdpbmcgd2hpbGUgcGVuZGluZyBvcGVyYXRpb25zIGFyZSBvY2N1cnJpbmcgKGl0J3Mgb2theSwgYnV0CisgICAgICAgIHdlYWtseSBzeW5jaHJvbml6ZWQpLiAqLworICAgIHN0YXR1c190IHNldERpcmVjdG9yeShjb25zdCBzdGQ6OnN0cmluZyAmZGlyZWN0b3J5KTsKKworICAgIC8qKiBjbGVhbnMgY3VycmVudCBkaXJlY3RvcnkgYW5kIHJldHVybnMgdGhlIGRpcmVjdG9yeSBuYW1lIGRvbmUuICovCisgICAgc3RhdHVzX3QgY2xlYW4oc3RkOjpzdHJpbmcgKmRpciA9IG51bGxwdHIpOworCisgICAgLyoqIGNyZWF0ZXMgYW4gYXVkaW8gZmlsZSBmcm9tIGEgcmVhZGVyIGZ1bmN0b3IgcGFzc2VkIGluLiAqLworICAgIHN0YXR1c190IGNyZWF0ZUludGVybmFsKAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxzc2l6ZV90IC8qIGZyYW1lc19yZWFkICovCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqIC8qIGJ1ZmZlciAqLywgc2l6ZV90IC8qIHNpemVfaW5fZnJhbWVzICovKT4gcmVhZGVyLAorICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlbmFtZSk7CisKKyAgICBzdGF0aWMgYm9vbCBpc0RpcmVjdG9yeVZhbGlkKGNvbnN0IHN0ZDo6c3RyaW5nICZkaXJlY3RvcnkpIHsKKyAgICAgICAgcmV0dXJuIGRpcmVjdG9yeS5zaXplKCkgPiAwICYmIGRpcmVjdG9yeVswXSA9PSAnLyc7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVGaWxlbmFtZShjb25zdCBzdGQ6OnN0cmluZyAmc3VmZml4KSBjb25zdCB7CisgICAgICAgIGNoYXIgZmlsZVRpbWVbc2l6ZW9mKCJZWVlZbW1kZF9ISE1NU1NfXDAiKV07CisgICAgICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgICAgICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKyAgICAgICAgc3RydWN0IHRtIHRtOworICAgICAgICBsb2NhbHRpbWVfcigmdHYudHZfc2VjLCAmdG0pOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHN0cmZ0aW1lKGZpbGVUaW1lLCBzaXplb2YoZmlsZVRpbWUpLCAiJVklbSVkXyVIJU0lU18iLCAmdG0pID09IDAsCisgICAgICAgICAgICAiaW5jb3JyZWN0IGZpbGVUaW1lIGJ1ZmZlciIpOworICAgICAgICBjaGFyIG1zZWNbNF07CisgICAgICAgICh2b2lkKXNucHJpbnRmKG1zZWMsIHNpemVvZihtc2VjKSwgIiUwM2QiLCAoaW50KSh0di50dl91c2VjIC8gMTAwMCkpOworICAgICAgICByZXR1cm4gbVByZWZpeCArIGZpbGVUaW1lICsgbXNlYyArIHN1ZmZpeCArICIud2F2IjsKKyAgICB9CisKKyAgICBib29sIGlzTWFuYWdlZEZpbGVuYW1lKGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICAgICAgY29uc3RleHByIHNpemVfdCBGSUxFTkFNRV9MRU5fREFURSA9IDQgKyAyICsgMiAvLyAlWSVtJWQlCisgICAgICAgICAgICArIDEgKyAyICsgMiArIDIgLy8gX0glTSVTCisgICAgICAgICAgICArIDEgKyAzOyAvL19NU0VDCisgICAgICAgIGNvbnN0IHNpemVfdCBwcmVmaXhMZW4gPSBtUHJlZml4LnNpemUoKTsKKyAgICAgICAgY29uc3Qgc2l6ZV90IG5hbWVMZW4gPSBzdHJsZW4obmFtZSk7CisKKyAgICAgICAgLy8gcmVqZWN0IG9uIHNpemUsIHByZWZpeCwgYW5kIC53YXYKKyAgICAgICAgaWYgKG5hbWVMZW4gPCBwcmVmaXhMZW4gKyBGSUxFTkFNRV9MRU5fREFURSArIDQgLyogLndhdiAqLworICAgICAgICAgICAgIHx8IHN0cm5jbXAobmFtZSwgbVByZWZpeC5jX3N0cigpLCBwcmVmaXhMZW4pICE9IDAKKyAgICAgICAgICAgICB8fCBzdHJjbXAobmFtZSArIG5hbWVMZW4gLSA0LCAiLndhdiIpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZhbGlkYXRlIGRhdGUgcG9ydGlvbgorICAgICAgICBjb25zdCBjaGFyICpkYXRlID0gbmFtZSArIHByZWZpeExlbjsKKyAgICAgICAgcmV0dXJuIHN0ZDo6YWxsX29mKGRhdGUsIGRhdGUgKyA4LCBpc2RpZ2l0KQorICAgICAgICAgICAgJiYgZGF0ZVs4XSA9PSAnXycKKyAgICAgICAgICAgICYmIHN0ZDo6YWxsX29mKGRhdGUgKyA5LCBkYXRlICsgMTUsIGlzZGlnaXQpCisgICAgICAgICAgICAmJiBkYXRlWzE1XSA9PSAnXycKKyAgICAgICAgICAgICYmIHN0ZDo6YWxsX29mKGRhdGUgKyAxNiwgZGF0ZSArIDE5LCBpc2RpZ2l0KTsKKyAgICB9CisKKyAgICAvLyB5ZXQgYW5vdGhlciBUaHJlYWRQb29sIGltcGxlbWVudGF0aW9uLgorICAgIGNsYXNzIFRocmVhZFBvb2wgeworICAgIHB1YmxpYzoKKyAgICAgICAgVGhyZWFkUG9vbChzaXplX3Qgc2l6ZSkKKyAgICAgICAgICAgIDogbVRocmVhZFBvb2xTaXplKHNpemUpCisgICAgICAgIHsgfQorCisgICAgICAgIC8qKiBsYXVuY2hlcyB0YXNrICJuYW1lIiB3aXRoIGFzc29jaWF0ZWQgZnVuY3Rpb24gImZ1bmMiLgorICAgICAgICAgICAgaWYgdGhlIHRocmVhZHBvb2wgaXMgZXhoYXVzdGVkLCBpdCB3aWxsIGxhdW5jaCBvbiBjYWxsaW5nIGZ1bmN0aW9uICovCisgICAgICAgIHN0YXR1c190IGxhdW5jaChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgc3RkOjpmdW5jdGlvbjxzdGF0dXNfdCgpPiBmdW5jKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnBhaXI8CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcsIHN0ZDo6ZnV0dXJlPHN0YXR1c190Pj4+IG1GdXR1cmVzOyAvLyBHVUFSREVEX0JZKG1Mb2NrKQorCisgICAgICAgIGNvbnN0IHNpemVfdCBtVGhyZWFkUG9vbFNpemU7CisgICAgfSBtVGhyZWFkUG9vbDsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1QcmVmaXg7CisgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICBzdGQ6OnN0cmluZyBtRGlyZWN0b3J5OyAgICAgICAgIC8vIEdVQVJERURfQlkobUxvY2spCisgICAgc3RkOjpkZXF1ZTxzdGQ6OnN0cmluZz4gbUZpbGVzOyAvLyBHVUFSREVEX0JZKG1Mb2NrKSAgc29ydGVkIGxpc3Qgb2YgZmlsZXMgYnkgY3JlYXRpb24gdGltZQorCisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgRlJBTUVTX1BFUl9SRUFEID0gMTAyNDsKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBNQVhfRklMRVNfUkVBRCA9IDEwMjQ7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgTUFYX0ZJTEVTX0tFRVAgPSAzMjsKK307CisKKy8qIHN0YXRpYyAqLwordm9pZCBOQkFJT19UZWU6Ok5CQUlPX1RlZUltcGw6OmR1bXBUZWUoCisgICAgICAgIGludCBmZCwgY29uc3QgTkJBSU9fU2lua1NvdXJjZSAmc2lua1NvdXJjZSwgY29uc3Qgc3RkOjpzdHJpbmcgJnN1ZmZpeCkKK3sKKyAgICAvLyBTaW5nbGV0b24uIENvbnN0cnVjdGVkIHRocmVhZC1zYWZlIG9uIGZpcnN0IGNhbGwsIG5ldmVyIGRlc3Ryb3llZC4KKyAgICBzdGF0aWMgQXVkaW9GaWxlSGFuZGxlciBhdWRpb0ZpbGVIYW5kbGVyKAorICAgICAgICAgICAgREVGQVVMVF9QUkVGSVgsIERFRkFVTFRfRElSRUNUT1JZLCBERUZBVUxUX1RIUkVBRFBPT0xfU0laRSk7CisKKyAgICBhdXRvICZzb3VyY2UgPSBzaW5rU291cmNlLnNlY29uZDsKKyAgICBpZiAoc291cmNlLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBmb3JtYXQgPSBzb3VyY2UtPmZvcm1hdCgpOworICAgIGJvb2wgZmlyc3RSZWFkID0gdHJ1ZTsKKyAgICBzdGQ6OnN0cmluZyBmaWxlbmFtZSA9IGF1ZGlvRmlsZUhhbmRsZXIuY3JlYXRlKAorICAgICAgICAgICAgLy8gdGhpcyBmdW5jdG9yIG11c3Qgbm90IGhvbGQgcmVmZXJlbmNlcyB0byBzdGFjaworICAgICAgICAgICAgW2ZpcnN0UmVhZCwgc2lua1NvdXJjZV0gKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGZyYW1lcykgbXV0YWJsZSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gJnNvdXJjZSA9IHNpbmtTb3VyY2Uuc2Vjb25kOworICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGFjdHVhbFJlYWQgPSBzb3VyY2UtPnJlYWQoYnVmZmVyLCBmcmFtZXMpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWN0dWFsUmVhZCA9PSAoc3NpemVfdClPVkVSUlVOICYmIGZpcnN0UmVhZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjaGVjayBvbmNlCisgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxSZWFkID0gc291cmNlLT5yZWFkKGJ1ZmZlciwgZnJhbWVzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmaXJzdFJlYWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjdHVhbFJlYWQ7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIEZvcm1hdF9zYW1wbGVSYXRlKGZvcm1hdCksCisgICAgICAgICAgICBGb3JtYXRfY2hhbm5lbENvdW50KGZvcm1hdCksCisgICAgICAgICAgICBmb3JtYXQubUZvcm1hdCwKKyAgICAgICAgICAgIHN1ZmZpeCk7CisKKyAgICBpZiAoZmQgPj0gMCAmJiBmaWxlbmFtZS5zaXplKCkgPiAwKSB7CisgICAgICAgIGRwcmludGYoZmQsICJ0ZWUgd3JvdGUgdG8gJXNcbiIsIGZpbGVuYW1lLmNfc3RyKCkpOworICAgIH0KK30KKworLyogc3RhdGljICovCitOQkFJT19UZWU6Ok5CQUlPX1RlZUltcGw6Ok5CQUlPX1NpbmtTb3VyY2UgTkJBSU9fVGVlOjpOQkFJT19UZWVJbXBsOjptYWtlU2lua1NvdXJjZSgKKyAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0ICZmb3JtYXQsIHNpemVfdCBmcmFtZXMsIGJvb2wgKmVuYWJsZWQpCit7CisgICAgaWYgKEZvcm1hdF9pc1ZhbGlkKGZvcm1hdCkgJiYgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQubUZvcm1hdCkpIHsKKyAgICAgICAgUGlwZSAqcGlwZSA9IG5ldyBQaXBlKGZyYW1lcywgZm9ybWF0KTsKKyAgICAgICAgc2l6ZV90IG51bUNvdW50ZXJPZmZlcnMgPSAwOworICAgICAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzWzFdID0ge2Zvcm1hdH07CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBwaXBlLT5uZWdvdGlhdGUob2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKKyAgICAgICAgaWYgKGluZGV4ICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJwaXBlIGZhaWx1cmUgdG8gbmVnb3RpYXRlOiAlemQiLCBpbmRleCk7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgUGlwZVJlYWRlciAqcGlwZVJlYWRlciA9IG5ldyBQaXBlUmVhZGVyKCpwaXBlKTsKKyAgICAgICAgbnVtQ291bnRlck9mZmVycyA9IDA7CisgICAgICAgIGluZGV4ID0gcGlwZVJlYWRlci0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7CisgICAgICAgIGlmIChpbmRleCAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVygicGlwZVJlYWRlciBmYWlsdXJlIHRvIG5lZ290aWF0ZTogJXpkIiwgaW5kZXgpOworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisgICAgICAgIGlmIChlbmFibGVkICE9IG51bGxwdHIpICplbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHtwaXBlLCBwaXBlUmVhZGVyfTsKKyAgICB9CitleGl0OgorICAgIGlmIChlbmFibGVkICE9IG51bGxwdHIpICplbmFibGVkID0gZmFsc2U7CisgICAgcmV0dXJuIHtudWxscHRyLCBudWxscHRyfTsKK30KKworc3RkOjpzdHJpbmcgQXVkaW9GaWxlSGFuZGxlcjo6Y3JlYXRlKAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNzaXplX3QgLyogZnJhbWVzX3JlYWQgKi8KKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiAvKiBidWZmZXIgKi8sIHNpemVfdCAvKiBzaXplX2luX2ZyYW1lcyAqLyk+IHJlYWRlciwKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50LAorICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzdWZmaXgpCit7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmlsZW5hbWUgPSBnZW5lcmF0ZUZpbGVuYW1lKHN1ZmZpeCk7CisKKyAgICBpZiAobVRocmVhZFBvb2wubGF1bmNoKHN0ZDo6c3RyaW5nKCJjcmVhdGUgIikgKyBmaWxlbmFtZSwKKyAgICAgICAgICAgIFs9XSgpIHsgcmV0dXJuIGNyZWF0ZUludGVybmFsKHJlYWRlciwgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50LCBmb3JtYXQsIGZpbGVuYW1lKTsgfSkKKyAgICAgICAgICAgID09IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBmaWxlbmFtZTsKKyAgICB9CisgICAgcmV0dXJuICIiOworfQorCitzdGF0dXNfdCBBdWRpb0ZpbGVIYW5kbGVyOjpzZXREaXJlY3RvcnkoY29uc3Qgc3RkOjpzdHJpbmcgJmRpcmVjdG9yeSkKK3sKKyAgICBpZiAoIWlzRGlyZWN0b3J5VmFsaWQoZGlyZWN0b3J5KSkgcmV0dXJuIEJBRF9WQUxVRTsKKworICAgIC8vIFRPRE86IGNvbnNpZGVyIHVzaW5nIHN0ZDo6ZmlsZXN5c3RlbSBpbiBDKysxNworICAgIERJUiAqZGlyID0gb3BlbmRpcihkaXJlY3RvcnkuY19zdHIoKSk7CisKKyAgICBpZiAoZGlyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coIiVzOiBjYW5ub3Qgb3BlbiBkaXJlY3RvcnkgJXMiLCBfX2Z1bmNfXywgZGlyZWN0b3J5LmNfc3RyKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNpemVfdCB0b1JlbW92ZSA9IDA7CisgICAgZGVjbHR5cGUobUZpbGVzKSBmaWxlczsKKworICAgIHdoaWxlIChmaWxlcy5zaXplKCkgPCBNQVhfRklMRVNfUkVBRCkgeworICAgICAgICBlcnJubyA9IDA7CisgICAgICAgIGNvbnN0IHN0cnVjdCBkaXJlbnQgKnJlc3VsdCA9IHJlYWRkaXIoZGlyKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HV19JRihlcnJubyAhPSAwLCAiJXM6IHJlYWRkaXIgZmFpbHVyZSAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8gaXMgaXQgYSBtYW5hZ2VkIGZpbGVuYW1lPworICAgICAgICBpZiAoIWlzTWFuYWdlZEZpbGVuYW1lKHJlc3VsdC0+ZF9uYW1lKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZmlsZXMuZW1wbGFjZV9iYWNrKHJlc3VsdC0+ZF9uYW1lKTsKKyAgICB9CisgICAgKHZvaWQpY2xvc2VkaXIoZGlyKTsKKworICAgIC8vIE9QVElNSVpBVElPTjogd2UgZG9uJ3QgbmVlZCB0byBzdGF0IGVhY2ggZmlsZSwgdGhlIGZpbGVuYW1lcyBuYW1lcyBhcmUKKyAgICAvLyBhbHJlYWR5IChyb3VnaGx5KSBvcmRlcmVkIGJ5IGNyZWF0aW9uIGRhdGUuICB3ZSB1c2Ugc3RkOjpkZXF1ZSBpbnN0ZWFkCisgICAgLy8gb2Ygc3RkOjpzZXQgZm9yIGZhc3RlciBpbnNlcnRpb24gYW5kIHNvcnRpbmcgdGltZXMuCisKKyAgICBpZiAoZmlsZXMuc2l6ZSgpID4gTUFYX0ZJTEVTX0tFRVApIHsKKyAgICAgICAgLy8gcmVtb3ZlZCBmaWxlcyBjYW4gdXNlIGEgcGFydGl0aW9uIChubyBuZWVkIHRvIGRvIGEgZnVsbCBzb3J0KS4KKyAgICAgICAgdG9SZW1vdmUgPSBmaWxlcy5zaXplKCkgLSBNQVhfRklMRVNfS0VFUDsKKyAgICAgICAgc3RkOjpudGhfZWxlbWVudChmaWxlcy5iZWdpbigpLCBmaWxlcy5iZWdpbigpICsgdG9SZW1vdmUgLSAxLCBmaWxlcy5lbmQoKSk7CisgICAgfQorCisgICAgLy8ga2VwdCBmaWxlcyBtdXN0IGJlIHNvcnRlZC4KKyAgICBzdGQ6OnNvcnQoZmlsZXMuYmVnaW4oKSArIHRvUmVtb3ZlLCBmaWxlcy5lbmQoKSk7CisKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisKKyAgICAgICAgbURpcmVjdG9yeSA9IGRpcmVjdG9yeTsKKyAgICAgICAgbUZpbGVzID0gc3RkOjptb3ZlKGZpbGVzKTsKKyAgICB9CisKKyAgICBpZiAodG9SZW1vdmUgPiAwKSB7IC8vIGxhdW5jaCBhIGNsZWFuIGluIGJhY2tncm91bmQuCisgICAgICAgICh2b2lkKW1UaHJlYWRQb29sLmxhdW5jaCgKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZygiY2xlYW5pbmcgIikgKyBkaXJlY3RvcnksIFt0aGlzXSgpIHsgcmV0dXJuIGNsZWFuKCk7IH0pOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvRmlsZUhhbmRsZXI6OmNsZWFuKHN0ZDo6c3RyaW5nICpkaXJlY3RvcnkpCit7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGZpbGVzVG9SZW1vdmU7CisgICAgc3RkOjpzdHJpbmcgZGlyOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1Mb2NrKTsKKworICAgICAgICBpZiAoIWlzRGlyZWN0b3J5VmFsaWQobURpcmVjdG9yeSkpIHJldHVybiBOT19JTklUOworCisgICAgICAgIGRpciA9IG1EaXJlY3Rvcnk7CisgICAgICAgIGlmIChtRmlsZXMuc2l6ZSgpID4gTUFYX0ZJTEVTX0tFRVApIHsKKyAgICAgICAgICAgIHNpemVfdCB0b1JlbW92ZSA9IG1GaWxlcy5zaXplKCkgLSBNQVhfRklMRVNfS0VFUDsKKworICAgICAgICAgICAgLy8gdXNlIG1vdmUgYW5kIGVyYXNlIHRvIGVmZmljaWVudGx5IHRyYW5zZmVyIHN0ZDo6c3RyaW5nCisgICAgICAgICAgICBzdGQ6Om1vdmUobUZpbGVzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgIG1GaWxlcy5iZWdpbigpICsgdG9SZW1vdmUsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihmaWxlc1RvUmVtb3ZlKSk7CisgICAgICAgICAgICBtRmlsZXMuZXJhc2UobUZpbGVzLmJlZ2luKCksIG1GaWxlcy5iZWdpbigpICsgdG9SZW1vdmUpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgZGlycCA9IGRpciArICIvIjsKKyAgICAvLyByZW1vdmUgZmlsZXMgb3V0c2lkZSBvZiBsb2NrIGZvciBiZXR0ZXIgY29uY3VycmVuY3kuCisgICAgZm9yIChjb25zdCBhdXRvICZmaWxlIDogZmlsZXNUb1JlbW92ZSkgeworICAgICAgICAodm9pZCl1bmxpbmsoKGRpcnAgKyBmaWxlKS5jX3N0cigpKTsKKyAgICB9CisKKyAgICAvLyByZXR1cm4gdGhlIGRpcmVjdG9yeSBpZiByZXF1ZXN0ZWQuCisgICAgaWYgKGRpcmVjdG9yeSAhPSBudWxscHRyKSB7CisgICAgICAgICpkaXJlY3RvcnkgPSBkaXI7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9GaWxlSGFuZGxlcjo6VGhyZWFkUG9vbDo6bGF1bmNoKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgc3RkOjpmdW5jdGlvbjxzdGF0dXNfdCgpPiBmdW5jKQoreworICAgIGlmIChtVGhyZWFkUG9vbFNpemUgPiAxKSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisgICAgICAgIGlmIChtRnV0dXJlcy5zaXplKCkgPj0gbVRocmVhZFBvb2xTaXplKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBtRnV0dXJlcy5iZWdpbigpOyBpdCAhPSBtRnV0dXJlcy5lbmQoKTspIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZmlsZW5hbWUgPSBpdC0+Zmlyc3Q7CisgICAgICAgICAgICAgICAgc3RkOjpmdXR1cmU8c3RhdHVzX3Q+ICZmdXR1cmUgPSBpdC0+c2Vjb25kOworICAgICAgICAgICAgICAgIGlmICghZnV0dXJlLnZhbGlkKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6c2Vjb25kcygwKSkgPT0gc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IGZ1dHVyZSAlcyByZWFkeSIsIF9fZnVuY19fLCBmaWxlbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBtRnV0dXJlcy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBmdXR1cmUgJXMgbm90IHJlYWR5IiwgX19mdW5jX18sIGZpbGVuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobUZ1dHVyZXMuc2l6ZSgpIDwgbVRocmVhZFBvb2xTaXplKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IGRlZmVycmVkIGNhbGxpbmcgJXMiLCBfX2Z1bmNfXywgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIG1GdXR1cmVzLmVtcGxhY2VfYmFjayhuYW1lLCBzdGQ6OmFzeW5jKHN0ZDo6bGF1bmNoOjphc3luYywgZnVuYykpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCIlczogaW1tZWRpYXRlIGNhbGxpbmcgJXMiLCBfX2Z1bmNfXywgbmFtZS5jX3N0cigpKTsKKyAgICByZXR1cm4gZnVuYygpOworfQorCitzdGF0dXNfdCBBdWRpb0ZpbGVIYW5kbGVyOjpjcmVhdGVJbnRlcm5hbCgKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxzc2l6ZV90IC8qIGZyYW1lc19yZWFkICovCisgICAgICAgICAgICAgICAgICAgICh2b2lkICogLyogYnVmZmVyICovLCBzaXplX3QgLyogc2l6ZV9pbl9mcmFtZXMgKi8pPiByZWFkZXIsCisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZmlsZW5hbWUpCit7CisgICAgLy8gQXR0ZW1wdCB0byBjaG9vc2UgdGhlIGJlc3QgbWF0Y2hpbmcgZmlsZSBmb3JtYXQuCisgICAgLy8gV2UgY2FuIGNob29zZSBhbnkgc2ZfZm9ybWF0CisgICAgLy8gYnV0IHdyaXRlRm9ybWF0IG11c3QgYmUgb25lIG9mIDE2LCAzMiwgZmxvYXQKKyAgICAvLyBkdWUgdG8gc2Zfd3JpdGVmIGNvbXBhdGliaWxpdHkuCisgICAgaW50IHNmX2Zvcm1hdDsKKyAgICBhdWRpb19mb3JtYXRfdCB3cml0ZUZvcm1hdDsKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV84X0JJVDoKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICBzZl9mb3JtYXQgPSBTRl9GT1JNQVRfUENNXzE2OworICAgICAgICB3cml0ZUZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgICAgICBBTE9HVigiJXM6ICVzIHVzaW5nIFBDTV8xNiBmb3IgZm9ybWF0ICUjeCIsIF9fZnVuY19fLCBmaWxlbmFtZS5jX3N0cigpLCBmb3JtYXQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fOF8yNF9CSVQ6CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQ6CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzMyX0JJVDoKKyAgICAgICAgc2ZfZm9ybWF0ID0gU0ZfRk9STUFUX1BDTV8zMjsKKyAgICAgICAgd3JpdGVGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzMyX0JJVDsKKyAgICAgICAgQUxPR1YoIiVzOiAlcyB1c2luZyBQQ01fMzIgZm9yIGZvcm1hdCAlI3giLCBfX2Z1bmNfXywgZmlsZW5hbWUuY19zdHIoKSwgZm9ybWF0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICBzZl9mb3JtYXQgPSBTRl9GT1JNQVRfRkxPQVQ7CisgICAgICAgIHdyaXRlRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKKyAgICAgICAgQUxPR1YoIiVzOiAlcyB1c2luZyBQQ01fRkxPQVQgZm9yIGZvcm1hdCAlI3giLCBfX2Z1bmNfXywgZmlsZW5hbWUuY19zdHIoKSwgZm9ybWF0KTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgLy8gVE9ETzoKKyAgICAgICAgLy8gaGFuZGxlIGF1ZGlvX2hhc19wcm9wb3J0aW9uYWxfZnJhbWVzKCkgZm9ybWF0cy4KKyAgICAgICAgLy8gaGFuZGxlIGNvbXByZXNzZWQgZm9ybWF0cyBhcyBzaW5nbGUgYnl0ZSBmaWxlcy4KKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBkaXJlY3Rvcnk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gY2xlYW4oJmRpcmVjdG9yeSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBzdGQ6OnN0cmluZyBkaXJQcmVmaXggPSBkaXJlY3RvcnkgKyAiLyI7CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBwYXRoID0gZGlyUHJlZml4ICsgZmlsZW5hbWU7CisKKyAgICAvKiBjb25zdCAqLyBTRl9JTkZPIGluZm8gPSB7CisgICAgICAgIC5mcmFtZXMgPSAwLAorICAgICAgICAuc2FtcGxlcmF0ZSA9IChpbnQpc2FtcGxlUmF0ZSwKKyAgICAgICAgLmNoYW5uZWxzID0gKGludCljaGFubmVsQ291bnQsCisgICAgICAgIC5mb3JtYXQgPSBTRl9GT1JNQVRfV0FWIHwgc2ZfZm9ybWF0LAorICAgIH07CisgICAgU05ERklMRSAqc2YgPSBzZl9vcGVuKHBhdGguY19zdHIoKSwgU0ZNX1dSSVRFLCAmaW5mbyk7CisgICAgaWYgKHNmID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHNpemVfdCB0b3RhbCA9IDA7CisgICAgdm9pZCAqYnVmZmVyID0gbWFsbG9jKEZSQU1FU19QRVJfUkVBRCAqIHN0ZDo6bWF4KAorICAgICAgICAgICAgY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZSh3cml0ZUZvcm1hdCksIC8vb3V0cHV0IGZyYW1lc2l6ZQorICAgICAgICAgICAgY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpKSk7IC8vIGlucHV0IGZyYW1lc2l6ZQorICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICBzZl9jbG9zZShzZik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgZm9yICg7OykgeworICAgICAgICBjb25zdCBzc2l6ZV90IGFjdHVhbFJlYWQgPSByZWFkZXIoYnVmZmVyLCBGUkFNRVNfUEVSX1JFQUQpOworICAgICAgICBpZiAoYWN0dWFsUmVhZCA8PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbnZlcnQgaW5wdXQgZm9ybWF0IHRvIHdyaXRlRm9ybWF0IGFzIG5lZWRlZC4KKyAgICAgICAgaWYgKGZvcm1hdCAhPSB3cml0ZUZvcm1hdCkgeworICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCB3cml0ZUZvcm1hdCwgYnVmZmVyLCBmb3JtYXQsIGFjdHVhbFJlYWQgKiBpbmZvLmNoYW5uZWxzKTsKKyAgICAgICAgfQorCisgICAgICAgIHNzaXplX3QgcmVhbGx5V3JpdHRlbjsKKyAgICAgICAgc3dpdGNoICh3cml0ZUZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICAgICAgcmVhbGx5V3JpdHRlbiA9IHNmX3dyaXRlZl9zaG9ydChzZiwgKGNvbnN0IGludDE2X3QgKilidWZmZXIsIGFjdHVhbFJlYWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8zMl9CSVQ6CisgICAgICAgICAgICByZWFsbHlXcml0dGVuID0gc2Zfd3JpdGVmX2ludChzZiwgKGNvbnN0IGludDMyX3QgKilidWZmZXIsIGFjdHVhbFJlYWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIHJlYWxseVdyaXR0ZW4gPSBzZl93cml0ZWZfZmxvYXQoc2YsIChjb25zdCBmbG9hdCAqKWJ1ZmZlciwgYWN0dWFsUmVhZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzOiAlcyB3cml0ZUZvcm1hdDogJSN4IiwgX19mdW5jX18sIGZpbGVuYW1lLmNfc3RyKCksIHdyaXRlRm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlYWxseVdyaXR0ZW4gPCAwKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6ICVzIHdyaXRlIGVycm9yOiAlemQiLCBfX2Z1bmNfXywgZmlsZW5hbWUuY19zdHIoKSwgcmVhbGx5V3JpdHRlbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB0b3RhbCArPSByZWFsbHlXcml0dGVuOworICAgICAgICBpZiAocmVhbGx5V3JpdHRlbiA8IGFjdHVhbFJlYWQpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogJXMgd3JpdGUgc2hvcnQgY291bnQ6ICV6ZCA8ICV6ZCIsCisgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZmlsZW5hbWUuY19zdHIoKSwgcmVhbGx5V3JpdHRlbiwgYWN0dWFsUmVhZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBzZl9jbG9zZShzZik7CisgICAgZnJlZShidWZmZXIpOworICAgIGlmICh0b3RhbCA9PSAwKSB7CisgICAgICAgICh2b2lkKXVubGluayhwYXRoLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgIH0KKworICAgIC8vIFN1Y2Nlc3M6IGFkZCBvdXIgbmFtZSB0byBtYW5hZ2VkIGZpbGVzLgorICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1Mb2NrKTsKKyAgICAgICAgLy8gd2VhayBzeW5jaHJvbml6YXRpb24gLSBvbmx5IHVwZGF0ZSBtRmlsZXMgaWYgdGhlIGRpcmVjdG9yeSBoYXNuJ3QgY2hhbmdlZC4KKyAgICAgICAgaWYgKG1EaXJlY3RvcnkgPT0gZGlyZWN0b3J5KSB7CisgICAgICAgICAgICBtRmlsZXMuZW1wbGFjZV9iYWNrKGZpbGVuYW1lKTsgIC8vIGFkZCB0byB0aGUgZW5kIHRvIHByZXNlcnZlIHNvcnQuCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOyAvLyByZXR1cm4gZnVsbCBwYXRoCit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIFRFRV9TSU5LCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTkJBSU9fVGVlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTkJBSU9fVGVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkOGNjOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9OQkFJT19UZWUuaApAQCAtMCwwICsxLDMyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEVuYWJsZWQgd2l0aCBURUVfU0lOSyBpbiBDb25maWd1cmF0aW9uLmgKKyNpZm5kZWYgQU5EUk9JRF9OQkFJT19URUVfSAorI2RlZmluZSBBTkRST0lEX05CQUlPX1RFRV9ICisKKyNpZmRlZiBURUVfU0lOSworCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHNldD4KKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFRoZSBOQkFJT19UZWUgdXNlcyB0aGUgTkJBSU8gUGlwZSBhbmQgUGlwZVJlYWRlciBmb3Igbm9uYmxvY2tpbmcKKyAqIGRhdGEgY29sbGVjdGlvbiwgZm9yIGV2ZW50dWFsIGR1bXAgdG8gbG9nIGZpbGVzLgorICogU2VlIGh0dHBzOi8vc291cmNlLmFuZHJvaWQuY29tL2RldmljZXMvYXVkaW8vZGVidWdnaW5nIGZvciBob3cgdG8KKyAqIGVuYWJsZSBieSByby5kZWJ1Z2dhYmxlIGFuZCBhZi50ZWUgcHJvcGVydGllcy4KKyAqCisgKiBUaGUgd3JpdGUoKSBpbnRvIHRoZSBOQkFJT19UZWUgaXMgdGhlcmVmb3JlIG5vbmJsb2NraW5nLAorICogYnV0IGNoYW5naW5nIE5CQUlPX1RlZSBmb3JtYXRzIHdpdGggc2V0KCkgY2Fubm90IGJlIGRvbmUgZHVyaW5nIGEgd3JpdGUoKTsKKyAqIHVzdWFsbHkgdGhlIGNhbGxlciBhbHJlYWR5IGltcGxlbWVudHMgdGhpcyBtdXR1YWwgZXhjbHVzaW9uLgorICoKKyAqIEFsbCBvdGhlciBjYWxscyBleGNlcHQgc2V0KCkgdnMgd3JpdGUoKSBtYXkgb2NjdXIgYXQgYW55IHRpbWUuCisgKgorICogZHVtcCgpIGRpc3J1cHRpb24gaXMgbWluaW1pemVkIHRvIHRoZSBjYWxsZXIgc2luY2Ugc3lzdGVtIGNhbGxzIGFyZSBleGVjdXRlZAorICogaW4gYW4gYXN5bmNocm9ub3VzIHRocmVhZCAod2hlbiBwb3NzaWJsZSkuCisgKgorICogQ3VycmVudGx5IHRoZSBOQkFJT19UZWUgaXMgImhhcmR3aXJlZCIgZm9yIEF1ZGlvRmxpbmdlciBzdXBwb3J0LgorICoKKyAqIFNvbWUgQXVkaW9GbGluZ2VyIHNwZWNpZmljIG5vdGVzOgorICoKKyAqIDEpIFRlZXMgY2FwdHVyZSBvbmx5IGxpbmVhciBQQ00gZGF0YS4KKyAqIDIpIFRlZXMgd2l0aG91dCBhbnkgZGF0YSB3cml0dGVuIGFyZSBjb25zaWRlcmVkIGVtcHR5IGFuZCBkbyBub3QgZ2VuZXJhdGUKKyAqICAgIGFueSBvdXRwdXQgZmlsZXMuCisgKiAyKSBPbmNlIGEgVGVlIGR1bXBzIGRhdGEsIGl0IGlzIGNvbnNpZGVyZWQgImVtcHRpZWQiIGFuZCBuZXcgZGF0YQorICogICAgbmVlZHMgdG8gYmUgd3JpdHRlbiBiZWZvcmUgYW5vdGhlciBUZWUgZmlsZSBpcyBnZW5lcmF0ZWQuCisgKiAzKSBUZWUgZmlsZSBmb3JtYXQgaXMKKyAqICAgIFdBViBpbnRlZ2VyIFBDTSAxNiBiaXQgZm9yIEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQsIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgorICogICAgV0FWIGludGVnZXIgUENNIDMyIGJpdCBmb3IgQVVESU9fRk9STUFUX1BDTV84XzI0X0JJVCwgQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VECisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzMyX0JJVC4KKyAqICAgIFdBViBmbG9hdCBQQ00gMzIgYml0IGZvciBBVURJT19GT1JNQVRfUENNX0ZMT0FULgorICoKKyAqIElucHV0X1RocmVhZDoKKyAqIDEpIENhcHR1cmUgYnVmZmVyIGlzIHRlZWQgd2hlbiByZWFkIGZyb20gdGhlIEhBTCwgYmVmb3JlIHJlc2FtcGxpbmcgZm9yIHRoZSBBdWRpb1JlY29yZAorICogICAgY2xpZW50LgorICoKKyAqIE91dHB1dF9UaHJlYWQ6CisgKiAxKSBNaXhlclRocmVhZHMgd2lsbCB0ZWUgYXQgdGhlIEZhc3RNaXhlciBvdXRwdXQgKGlmIGl0IGhhcyBvbmUpIG9yIGF0IHRoZQorICogICAgTm9ybWFsTWl4ZXIgb3V0cHV0IChpZiBubyBGYXN0TWl4ZXIpLgorICogMikgRHVwbGljYXRpbmdUaHJlYWRzIGRvIG5vdCB0ZWUgYW55IG1peGVkIGRhdGEuIEFwcGx5IGEgdGVlIG9uIHRoZSBkb3duc3RyZWFtIE91dHB1dFRyYWNrCisgKiAgICBvciBvbiB0aGUgdXBzdHJlYW0gcGxheWJhY2sgVHJhY2tzLgorICogMykgRGlyZWN0VGhyZWFkcyBhbmQgT2ZmbG9hZFRocmVhZHMgZG8gbm90IHRlZSBhbnkgZGF0YS4gVGhlIHVwc3RyZWFtIHRyYWNrCisgKiAgICAoaWYgbGluZWFyIFBDTSBmb3JtYXQpIG1heSBiZSB0ZWVkIHRvIGRpc2NvdmVyIGRhdGEuCisgKiA0KSBNbWFwVGhyZWFkcyBhcmUgbm90IHN1cHBvcnRlZC4KKyAqCisgKiBUcmFja3M6CisgKiAxKSBSZWNvcmRUcmFja3MgYW5kIHBsYXliYWNrIFRyYWNrcyB0ZWUgYXMgZGF0YSBpcyBiZWluZyB3cml0dGVuIHRvIG9yCisgKiAgICByZWFkIGZyb20gdGhlIHNoYXJlZCBjbGllbnQtc2VydmVyIHRyYWNrIGJ1ZmZlciBieSB0aGUgYXNzb2NpYXRlZCBUaHJlYWRzLgorICogMikgVGhlIG1lY2hhbmlzbSBpcyBvbiB0aGUgQXVkaW9CdWZmZXJQcm92aWRlciByZWxlYXNlKCkgc28gbGFyZ2Ugc3RhdGljIFRyYWNrCisgKiAgICBwbGF5YmFjayBtYXkgbm90IHNob3cgYW55IFRlZSBkYXRhIGRlcGVuZGluZyBvbiB3aGVuIGl0IGlzIHJlbGVhc2VkLgorICogMykgV2hlbiBhIHRyYWNrIGJlY29tZXMgaW5hY3RpdmUsIHRoZSBUaHJlYWQgd2lsbCB0cmlnZ2VyIGEgZHVtcC4KKyAqLworCitjbGFzcyBOQkFJT19UZWUgeworcHVibGljOgorICAgIC8qIFRFRV9GTEFHIGlzIHVzZWQgaW4gc2V0KCkgYW5kIG11c3QgbWF0Y2ggdGhlIGZsYWdzIGZvciB0aGUgYWYudGVlIHByb3BlcnR5CisgICAgICAgZ2l2ZW4gaW4gaHR0cHM6Ly9zb3VyY2UuYW5kcm9pZC5jb20vZGV2aWNlcy9hdWRpby9kZWJ1Z2dpbmcKKyAgICAqLworICAgIGVudW0gVEVFX0ZMQUcgeworICAgICAgICBURUVfRkxBR19OT05FID0gMCwKKyAgICAgICAgVEVFX0ZMQUdfSU5QVVRfVEhSRUFEID0gKDEgPDwgMCksICAvLyB0cmVhdCBhcyBhIFRlZSBmb3IgaW5wdXQgKENhcHR1cmUpIFRocmVhZHMKKyAgICAgICAgVEVFX0ZMQUdfT1VUUFVUX1RIUkVBRCA9ICgxIDw8IDEpLCAvLyB0cmVhdCBhcyBhIFRlZSBmb3Igb3V0cHV0IChQbGF5YmFjaykgVGhyZWFkcworICAgICAgICBURUVfRkxBR19UUkFDSyA9ICgxIDw8IDIpLCAgICAgICAgIC8vIHRyZWF0IGFzIGEgVGVlIGZvciB0cmFja3MgKFJlY29yZCBhbmQgUGxheWJhY2spCisgICAgfTsKKworICAgIE5CQUlPX1RlZSgpCisgICAgICAgIDogbVRlZShzdGQ6Om1ha2Vfc2hhcmVkPE5CQUlPX1RlZUltcGw+KCkpCisgICAgeworICAgICAgICBnZXRSdW5uaW5nVGVlcygpLmFkZChtVGVlKTsKKyAgICB9CisKKyAgICB+TkJBSU9fVGVlKCkgeworICAgICAgICBnZXRSdW5uaW5nVGVlcygpLnJlbW92ZShtVGVlKTsKKyAgICAgICAgZHVtcCgtMSwgIl9EVE9SIik7IC8vIGxvZyBhbnkgZGF0YSByZW1haW5pbmcgaW4gVGVlLgorICAgIH0KKworICAgIC8qKgorICAgICAqIFxicmllZiBzZXQgaXMgdXNlZCBmb3IgZGVmZXJyZWQgY29uZmlndXJhdGlvbiBvZiBUZWUuCisgICAgICoKKyAgICAgKiAgTWF5IGJlIGNhbGxlZCBhbnl0aW1lIGV4Y2VwdCBjb25jdXJyZW50bHkgd2l0aCB3cml0ZSgpLgorICAgICAqCisgICAgICogXHBhcmFtIGZvcm1hdCBOQkFJT19Gb3JtYXQgdXNlZCB0byBvcGVuIE5CQUlPIHBpcGVzCisgICAgICogXHBhcmFtIGZsYWdzIChodHRwczovL3NvdXJjZS5hbmRyb2lkLmNvbS9kZXZpY2VzL2F1ZGlvL2RlYnVnZ2luZykKKyAgICAgKiAgICAgICAgICAgICAgLSBURUVfRkxBR19OT05FIHRvIGJ5cGFzcyBhZi50ZWUgcHJvcGVydHkgY2hlY2tzIChkZWZhdWx0KTsKKyAgICAgKiAgICAgICAgICAgICAgLSBURUVfRkxBR19JTlBVVF9USFJFQUQgdG8gY2hlY2sgYWYudGVlIGlmIGlucHV0IHRocmVhZCBsb2dnaW5nIHNldDsKKyAgICAgKiAgICAgICAgICAgICAgLSBURUVfRkxBR19PVVRQVVRfVEhSRUFEIHRvIGNoZWNrIGFmLnRlZSBpZiBvdXRwdXQgdGhyZWFkIGxvZ2dpbmcgc2V0OworICAgICAqICAgICAgICAgICAgICAtIFRFRV9GTEFHX1RSQUNLIHRvIGNoZWNrIGFmLnRlZSBpZiB0cmFjayBsb2dnaW5nIHNldC4KKyAgICAgKiBccGFyYW0gZnJhbWVzIG51bWJlciBvZiBmcmFtZXMgdG8gb3BlbiB0aGUgTkJBSU8gcGlwZSAoc2V0IHRvIDAgdG8gdXNlIGRlZmF1bHQpLgorICAgICAqCisgICAgICogXHJldHVybgorICAgICAqICAgICAgICAgLSBOT19FUlJPUiBvbiBzdWNjZXNzIChvciBmb3JtYXQgdW5jaGFuZ2VkKQorICAgICAqICAgICAgICAgLSBCQURfVkFMVUUgaWYgZm9ybWF0IG9yIGZsYWdzIGludmFsaWQuCisgICAgICogICAgICAgICAtIFBFUk1JU1NJT05fREVOSUVEIGlmIGZsYWdzIG5vdCBhbGxvd2VkIGJ5IGFmLnRlZQorICAgICAqLworCisgICAgc3RhdHVzX3Qgc2V0KGNvbnN0IE5CQUlPX0Zvcm1hdCAmZm9ybWF0LAorICAgICAgICAgICAgVEVFX0ZMQUcgZmxhZ3MgPSBURUVfRkxBR19OT05FLCBzaXplX3QgZnJhbWVzID0gMCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRlZS0+c2V0KGZvcm1hdCwgZmxhZ3MsIGZyYW1lcyk7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc2V0KHVpbnQzMl90IHNhbXBsZVJhdGUsIHVpbnQzMl90IGNoYW5uZWxDb3VudCwgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgVEVFX0ZMQUcgZmxhZ3MgPSBURUVfRkxBR19OT05FLCBzaXplX3QgZnJhbWVzID0gMCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRlZS0+c2V0KEZvcm1hdF9mcm9tX1NSX0Moc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50LCBmb3JtYXQpLCBmbGFncywgZnJhbWVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgd3JpdGUgZGF0YSB0byB0aGUgdGVlLgorICAgICAqCisgICAgICogVGhpcyBjYWxsIGlzIGxvY2sgZnJlZSAoYXMgc2hhcmVkIHBvaW50ZXIgYW5kIE5CQUlPIGlzIGxvY2sgZnJlZSk7CisgICAgICogbWF5IGJlIGNhbGxlZCBzaW11bHRhbmVvdXMgdG8gYWxsIG1ldGhvZHMgZXhjZXB0IHNldCgpLgorICAgICAqCisgICAgICogXHBhcmFtIGJ1ZmZlciB0byB3cml0ZSB0byBwaXBlLgorICAgICAqIFxwYXJhbSBmcmFtZUNvdW50IGluIGZyYW1lcyBhcyBzcGVjaWZpZWQgYnkgdGhlIGZvcm1hdCBwYXNzZWQgdG8gc2V0KCkKKyAgICAgKi8KKworICAgIHZvaWQgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgZnJhbWVDb3VudCkgY29uc3QgeworICAgICAgICBtVGVlLT53cml0ZShidWZmZXIsIGZyYW1lQ291bnQpOworICAgIH0KKworICAgIC8qKiBzZXRzIFRlZSBpZCBzdHJpbmcgd2hpY2ggaWRlbnRpZmllcyB0aGUgZ2VuZXJhdGVkIGZpbGUgKHNob3VsZCBiZSB1bmlxdWUpLiAqLworICAgIHZvaWQgc2V0SWQoY29uc3Qgc3RkOjpzdHJpbmcgJmlkKSBjb25zdCB7CisgICAgICAgIG1UZWUtPnNldElkKGlkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgZHVtcCB0aGUgYXVkaW8gY29udGVudCB3cml0dGVuIHRvIHRoZSBUZWUuCisgICAgICoKKyAgICAgKiBccGFyYW0gZmQgZmlsZSBkZXNjcmlwdG9yIHRvIHdyaXRlIGR1bXBlZCBmaWxlbmFtZSBmb3IgbG9nZ2luZywgdXNlIC0xIHRvIGlnbm9yZS4KKyAgICAgKiBccGFyYW0gcmVhc29uIHN0cmluZyBzdWZmaXggdG8gYXBwZW5kIHRvIHRoZSBnZW5lcmF0ZWQgZmlsZS4KKyAgICAgKi8KKyAgICB2b2lkIGR1bXAoaW50IGZkLCBjb25zdCBzdGQ6OnN0cmluZyAmcmVhc29uID0gIiIpIGNvbnN0IHsKKyAgICAgICAgbVRlZS0+ZHVtcChmZCwgcmVhc29uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgZHVtcCBhbGwgVGVlcyBjdXJyZW50bHkgYWxpdmUuCisgICAgICoKKyAgICAgKiBccGFyYW0gZmQgZmlsZSBkZXNjcmlwdG9yIHRvIHdyaXRlIGR1bXBlZCBmaWxlbmFtZSBmb3IgbG9nZ2luZywgdXNlIC0xIHRvIGlnbm9yZS4KKyAgICAgKiBccGFyYW0gcmVhc29uIHN0cmluZyBzdWZmaXggdG8gYXBwZW5kIHRvIHRoZSBnZW5lcmF0ZWQgZmlsZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBkdW1wQWxsKGludCBmZCwgY29uc3Qgc3RkOjpzdHJpbmcgJnJlYXNvbiA9ICIiKSB7CisgICAgICAgIGdldFJ1bm5pbmdUZWVzKCkuZHVtcChmZCwgcmVhc29uKTsKKyAgICB9CisKK3ByaXZhdGU6CisKKyAgICAvKiogVGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRlZSAtIHRoZSBsaWZldGltZSBpcyB0aHJvdWdoCisgICAgICAgIGEgc2hhcmVkIHBvaW50ZXIgc28gZGVzdHJ1Y3Rpb24gb2YgdGhlIE5CQUlPX1RlZSBjb250YWluZXIgbWF5IHByb2NlZWQKKyAgICAgICAgZXZlbiB0aG91Z2ggZHVtcGluZyBpcyBvY2N1cnJpbmcuICovCisgICAgY2xhc3MgTkJBSU9fVGVlSW1wbCB7CisgICAgcHVibGljOgorICAgICAgICBzdGF0dXNfdCBzZXQoY29uc3QgTkJBSU9fRm9ybWF0ICZmb3JtYXQsIFRFRV9GTEFHIGZsYWdzLCBzaXplX3QgZnJhbWVzKSB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IHRlZUNvbmZpZyA9IHByb3BlcnR5X2dldF9ib29sKCJyby5kZWJ1Z2dhYmxlIiwgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgPyBwcm9wZXJ0eV9nZXRfaW50MzIoImFmLnRlZSIsIDApIDogMDsKKworICAgICAgICAgICAgLy8gY2hlY2sgdGhlIHR5cGUgb2YgVGVlCisgICAgICAgICAgICBjb25zdCBURUVfRkxBRyB0eXBlID0gVEVFX0ZMQUcoCisgICAgICAgICAgICAgICAgICAgIGZsYWdzICYgKFRFRV9GTEFHX0lOUFVUX1RIUkVBRCB8IFRFRV9GTEFHX09VVFBVVF9USFJFQUQgfCBURUVfRkxBR19UUkFDSykpOworCisgICAgICAgICAgICAvLyBwYXJhbWV0ZXIgZmxhZ3MgY2FuJ3Qgc2VsZWN0IG11bHRpcGxlIHR5cGVzLgorICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9wb3Bjb3VudCh0eXBlKSA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBpZiB0eXBlIGlzIHNldCwgd2UgY2hlY2sgdG8gc2VlIGlmIGl0IGlzIHBlcm1pdHRlZCBieSBjb25maWd1cmF0aW9uLgorICAgICAgICAgICAgaWYgKHR5cGUgIT0gMCAmJiAodHlwZSAmIHRlZUNvbmZpZykgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIG51bWJlciBvZiBmcmFtZXMgZm9yIFRlZQorICAgICAgICAgICAgaWYgKGZyYW1lcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogY29uc2lkZXIgdmFyeWluZyBmcmFtZSBjb3VudCBiYXNlZCBvbiB0eXBlLgorICAgICAgICAgICAgICAgIGZyYW1lcyA9IERFRkFVTFRfVEVFX0ZSQU1FUzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGNoZWNrIG1pbmltdW0gbnVtYmVyIG9mIGZyYW1lcz8KKworICAgICAgICAgICAgLy8gZG9uJ3QgZG8gYW55dGhpbmcgaWYgZm9ybWF0IGFuZCBmcmFtZXMgYXJlIHRoZSBzYW1lLgorICAgICAgICAgICAgaWYgKEZvcm1hdF9pc0VxdWFsKGZvcm1hdCwgbUZvcm1hdCkgJiYgZnJhbWVzID09IG1GcmFtZXMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgZW5hYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgYXV0byBzaW5rc291cmNlID0gbWFrZVNpbmtTb3VyY2UoZm9ybWF0LCBmcmFtZXMsICZlbmFibGVkKTsKKworICAgICAgICAgICAgLy8gZW5hYmxlZCBpcyBzZXQgaWYgbWFrZVNpbmtTb3VyY2UgaXMgc3VjY2Vzc2Z1bC4KKyAgICAgICAgICAgIC8vIE5vdGU6IGFzIG1lbnRpb25lZCBpbiBOQkFJT19UZWU6OnNldCgpLCBkb24ndCBjYWxsIHNldCgpIHdoaWxlIHdyaXRlKCkgaXMKKyAgICAgICAgICAgIC8vIG9uZ29pbmcuCisgICAgICAgICAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisgICAgICAgICAgICAgICAgbUZsYWdzID0gZmxhZ3M7CisgICAgICAgICAgICAgICAgbUZvcm1hdCA9IGZvcm1hdDsgLy8gY291bGQgZ2V0IHRoaXMgZnJvbSB0aGUgU2luay4KKyAgICAgICAgICAgICAgICBtRnJhbWVzID0gZnJhbWVzOworICAgICAgICAgICAgICAgIG1TaW5rU291cmNlID0gc3RkOjptb3ZlKHNpbmtzb3VyY2UpOworICAgICAgICAgICAgICAgIG1FbmFibGVkLnN0b3JlKHRydWUpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldElkKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCkgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1Mb2NrKTsKKyAgICAgICAgICAgIG1JZCA9IGlkOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBkdW1wKGludCBmZCwgY29uc3Qgc3RkOjpzdHJpbmcgJnJlYXNvbikgeworICAgICAgICAgICAgaWYgKCFtRGF0YVJlYWR5LmV4Y2hhbmdlKGZhbHNlKSkgcmV0dXJuOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3VmZml4OworICAgICAgICAgICAgTkJBSU9fU2lua1NvdXJjZSBzaW5rU291cmNlOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisgICAgICAgICAgICAgICAgc3VmZml4ID0gbUlkICsgcmVhc29uOworICAgICAgICAgICAgICAgIHNpbmtTb3VyY2UgPSBtU2lua1NvdXJjZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGR1bXBUZWUoZmQsIHNpbmtTb3VyY2UsIHN1ZmZpeCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgIGlmICghbUVuYWJsZWQubG9hZCgpIHx8IGZyYW1lQ291bnQgPT0gMCkgcmV0dXJuOworICAgICAgICAgICAgKHZvaWQpbVNpbmtTb3VyY2UuZmlyc3QtPndyaXRlKGJ1ZmZlciwgZnJhbWVDb3VudCk7CisgICAgICAgICAgICBtRGF0YVJlYWR5LnN0b3JlKHRydWUpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICAvLyBUUklDS1k6IFdlIG5lZWQgdG8ga2VlcCB0aGUgTkJBSU9fU2luayBhbmQgTkJBSU9fU291cmNlIGJvdGggYWxpdmUgYXQgdGhlIHNhbWUgdGltZQorICAgICAgICAvLyBiZWNhdXNlIFBpcGVSZWFkZXIgaG9sZHMgYSBuYWtlZCByZWZlcmVuY2UgKG5vdCBhIHN0cm9uZyBvciB3ZWFrIHBvaW50ZXIpIHRvIFBpcGUuCisgICAgICAgIHVzaW5nIE5CQUlPX1NpbmtTb3VyY2UgPSBzdGQ6OnBhaXI8c3A8TkJBSU9fU2luaz4sIHNwPE5CQUlPX1NvdXJjZT4+OworCisgICAgICAgIHN0YXRpYyB2b2lkIGR1bXBUZWUoaW50IGZkLCBjb25zdCBOQkFJT19TaW5rU291cmNlJiBzaW5rU291cmNlLCBjb25zdCBzdGQ6OnN0cmluZyYgc3VmZml4KTsKKworICAgICAgICBzdGF0aWMgTkJBSU9fU2lua1NvdXJjZSBtYWtlU2lua1NvdXJjZSgKKyAgICAgICAgICAgICAgICBjb25zdCBOQkFJT19Gb3JtYXQgJmZvcm1hdCwgc2l6ZV90IGZyYW1lcywgYm9vbCAqZW5hYmxlZCk7CisKKyAgICAgICAgLy8gMHgyMDAwMDAgc3RlcmVvIDE2LWJpdCBQQ00gZnJhbWVzID0gNDcuNSBzZWNvbmRzIGF0IDQ0LjEga0h6LCA4IG1lZ2FieXRlcworICAgICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBERUZBVUxUX1RFRV9GUkFNRVMgPSAweDIwMDAwMDsKKworICAgICAgICAvLyBhdG9taWMgc3RhdHVzIGNoZWNraW5nCisgICAgICAgIHN0ZDo6YXRvbWljPGJvb2w+IG1FbmFibGVke2ZhbHNlfTsKKyAgICAgICAgc3RkOjphdG9taWM8Ym9vbD4gbURhdGFSZWFkeXtmYWxzZX07CisKKyAgICAgICAgLy8gbG9ja2VkIGR1bXAgaW5mb3JtYXRpb24KKyAgICAgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1Mb2NrOworICAgICAgICBzdGQ6OnN0cmluZyBtSWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHVUFSREVEX0JZKG1Mb2NrKQorICAgICAgICBURUVfRkxBRyBtRmxhZ3MgPSBURUVfRkxBR19OT05FOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHVUFSREVEX0JZKG1Mb2NrKQorICAgICAgICBOQkFJT19Gb3JtYXQgbUZvcm1hdCA9IEZvcm1hdF9JbnZhbGlkOyAgICAgICAgICAgICAgICAgICAvLyBHVUFSREVEX0JZKG1Mb2NrKQorICAgICAgICBzaXplX3QgbUZyYW1lcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHVUFSREVEX0JZKG1Mb2NrKQorICAgICAgICBOQkFJT19TaW5rU291cmNlIG1TaW5rU291cmNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHVUFSREVEX0JZKG1Mb2NrKQorICAgIH07CisKKyAgICAvKiogUnVubmluZ1RlZXMgdHJhY2tzIGN1cnJlbnQgcnVubmluZyB0ZWVzIGZvciBkdW1wIHB1cnBvc2VzLgorICAgICAgICBJdCBpcyBpbXBsZW1lbnRlZCB0byBoYXZlIG1pbmltYWwgbG9ja2VkIHJlZ2lvbnMsIHRvIGJlIHRyYW5zcGFyZW50IHRvIHRoZSBjYWxsZXIuICovCisgICAgY2xhc3MgUnVubmluZ1RlZXMgeworICAgIHB1YmxpYzoKKyAgICAgICAgdm9pZCBhZGQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE5CQUlPX1RlZUltcGw+ICZ0ZWUpIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisgICAgICAgICAgICBBTE9HV19JRighbVRlZXMuZW1wbGFjZSh0ZWUpLnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiAlcCBhbHJlYWR5IGV4aXN0cyBpbiBtVGVlcyIsIF9fZnVuY19fLCB0ZWUuZ2V0KCkpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCByZW1vdmUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE5CQUlPX1RlZUltcGw+ICZ0ZWUpIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisgICAgICAgICAgICBBTE9HV19JRihtVGVlcy5lcmFzZSh0ZWUpICE9IDEsCisgICAgICAgICAgICAgICAgICAgICIlczogJXAgZG9lc24ndCBleGlzdCBpbiBtVGVlcyIsIF9fZnVuY19fLCB0ZWUuZ2V0KCkpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBkdW1wKGludCBmZCwgY29uc3Qgc3RkOjpzdHJpbmcgJnJlYXNvbikgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPE5CQUlPX1RlZUltcGw+PiB0ZWVzOyAvLyBzYWZlIHNuYXBzaG90IG9mIHRlZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobUxvY2spOworICAgICAgICAgICAgICAgIHRlZXMuaW5zZXJ0KHRlZXMuZW5kKCksIG1UZWVzLmJlZ2luKCksIG1UZWVzLmVuZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmdGVlIDogdGVlcykgeworICAgICAgICAgICAgICAgIHRlZS0+ZHVtcChmZCwgcmVhc29uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICAgICAgc3RkOjpzZXQ8c3RkOjpzaGFyZWRfcHRyPE5CQUlPX1RlZUltcGw+PiBtVGVlczsgLy8gR1VBUkRFRF9CWShtTG9jaykKKyAgICB9OworCisgICAgLy8gc2luZ2xldG9uCisgICAgc3RhdGljIFJ1bm5pbmdUZWVzICZnZXRSdW5uaW5nVGVlcygpIHsKKyAgICAgICAgc3RhdGljIFJ1bm5pbmdUZWVzIHJ1bm5pbmdUZWVzOworICAgICAgICByZXR1cm4gcnVubmluZ1RlZXM7CisgICAgfQorCisgICAgLy8gVGhlIE5CQUlPIFRlZUltcGwgbWF5IGhhdmUgbGlmZXRpbWUgbG9uZ2VyIHRoYW4gTkJBSU9fVGVlIGlmCisgICAgLy8gUnVubmluZ1RlZXM6OmR1bXAoKSBpcyBiZWluZyBjYWxsZWQgc2ltdWx0YW5lb3VzIHRvIH5OQkFJT19UZWUoKS4KKyAgICAvLyBUaGlzIGlzIGFsbG93ZWQgZm9yIG1heGltdW0gY29uY3VycmVuY3kuCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE5CQUlPX1RlZUltcGw+IG1UZWU7Cit9OyAvLyBOQkFJT19UZWUKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gVEVFX1NJTksKKyNlbmRpZiAvLyAhQU5EUk9JRF9OQkFJT19URUVfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwCmluZGV4IGU1Y2I4YTIuLmVkYjMzMWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAKQEAgLTI0LDggKzI0LDkgQEAKICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAKICNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKLSNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9QYXRjaEJ1aWxkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC00OSwxMTEgKzUwLDc3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cykKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtUGF0Y2hQYW5lbCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtUGF0Y2hQYW5lbC0+bGlzdEF1ZGlvUG9ydHMobnVtX3BvcnRzLCBwb3J0cyk7Ci0gICAgfQotICAgIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBtUGF0Y2hQYW5lbC5saXN0QXVkaW9Qb3J0cyhudW1fcG9ydHMsIHBvcnRzKTsKIH0KIAogLyogR2V0IHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQgKi8KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1QYXRjaFBhbmVsICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1QYXRjaFBhbmVsLT5nZXRBdWRpb1BvcnQocG9ydCk7Ci0gICAgfQotICAgIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBtUGF0Y2hQYW5lbC5nZXRBdWRpb1BvcnQocG9ydCk7CiB9CiAKLQogLyogQ29ubmVjdCBhIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMgKi8KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6Y3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1QYXRjaFBhbmVsICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1QYXRjaFBhbmVsLT5jcmVhdGVBdWRpb1BhdGNoKHBhdGNoLCBoYW5kbGUpOwotICAgIH0KLSAgICByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gbVBhdGNoUGFuZWwuY3JlYXRlQXVkaW9QYXRjaChwYXRjaCwgaGFuZGxlKTsKIH0KIAogLyogRGlzY29ubmVjdCBhIHBhdGNoICovCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtUGF0Y2hQYW5lbCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtUGF0Y2hQYW5lbC0+cmVsZWFzZUF1ZGlvUGF0Y2goaGFuZGxlKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIG1QYXRjaFBhbmVsLnJlbGVhc2VBdWRpb1BhdGNoKGhhbmRsZSk7CiB9CiAKLQogLyogTGlzdCBjb25uZWN0ZWQgYXVkaW8gcG9ydHMgYW5kIHRoZXkgYXR0cmlidXRlcyAqLwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1QYXRjaFBhbmVsICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1QYXRjaFBhbmVsLT5saXN0QXVkaW9QYXRjaGVzKG51bV9wYXRjaGVzLCBwYXRjaGVzKTsKKyAgICByZXR1cm4gbVBhdGNoUGFuZWwubGlzdEF1ZGlvUGF0Y2hlcyhudW1fcGF0Y2hlcywgcGF0Y2hlcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6U29mdHdhcmVQYXRjaDo6Z2V0TGF0ZW5jeU1zX2woZG91YmxlICpsYXRlbmN5TXMpIGNvbnN0Cit7CisgICAgY29uc3QgYXV0byYgaXRlciA9IG1QYXRjaFBhbmVsLm1QYXRjaGVzLmZpbmQobVBhdGNoSGFuZGxlKTsKKyAgICBpZiAoaXRlciAhPSBtUGF0Y2hQYW5lbC5tUGF0Y2hlcy5lbmQoKSkgeworICAgICAgICByZXR1cm4gaXRlci0+c2Vjb25kLmdldExhdGVuY3lNcyhsYXRlbmN5TXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHJldHVybiBOT19JTklUOwotfQotCi0vKiBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uICovCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtUGF0Y2hQYW5lbCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtUGF0Y2hQYW5lbC0+c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7Ci0gICAgfQotICAgIHJldHVybiBOT19JTklUOwotfQotCi0KLUF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6UGF0Y2hQYW5lbChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbUF1ZGlvRmxpbmdlcihhdWRpb0ZsaW5nZXIpCi17Ci19Ci0KLUF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6flBhdGNoUGFuZWwoKQotewogfQogCiAvKiBMaXN0IGNvbm5lY3RlZCBhdWRpbyBwb3J0cyBhbmQgdGhlaXIgYXR0cmlidXRlcyAqLwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpsaXN0QXVkaW9Qb3J0cyh1bnNpZ25lZCBpbnQgKm51bV9wb3J0cyBfX3VudXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzIF9fdW51c2VkKQogewotICAgIEFMT0dWKCJsaXN0QXVkaW9Qb3J0cyIpOworICAgIEFMT0dWKF9fZnVuY19fKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIC8qIEdldCBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0ICovCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCBfX3VudXNlZCkKIHsKLSAgICBBTE9HVigiZ2V0QXVkaW9Qb3J0Iik7CisgICAgQUxPR1YoX19mdW5jX18pOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotCiAvKiBDb25uZWN0IGEgcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCiB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFsSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgc3A8QXVkaW9GbGluZ2VyPiBhdWRpb2ZsaW5nZXIgPSBtQXVkaW9GbGluZ2VyLnByb21vdGUoKTsKICAgICBpZiAoaGFuZGxlID09IE5VTEwgfHwgcGF0Y2ggPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIG51bV9zb3VyY2VzICVkIG51bV9zaW5rcyAlZCBoYW5kbGUgJWQiLAotICAgICAgICAgIHBhdGNoLT5udW1fc291cmNlcywgcGF0Y2gtPm51bV9zaW5rcywgKmhhbmRsZSk7Ci0gICAgaWYgKGF1ZGlvZmxpbmdlciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KKyAgICBBTE9HVigiJXMoKSBudW1fc291cmNlcyAlZCBudW1fc2lua3MgJWQgaGFuZGxlICVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBwYXRjaC0+bnVtX3NvdXJjZXMsIHBhdGNoLT5udW1fc2lua3MsICpoYW5kbGUpOworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogCi0gICAgaWYgKHBhdGNoLT5udW1fc291cmNlcyA9PSAwIHx8IHBhdGNoLT5udW1fc291cmNlcyA+IEFVRElPX1BBVENIX1BPUlRTX01BWCB8fAotICAgICAgICAgICAgKHBhdGNoLT5udW1fc2lua3MgPT0gMCAmJiBwYXRjaC0+bnVtX3NvdXJjZXMgIT0gMikgfHwKLSAgICAgICAgICAgIHBhdGNoLT5udW1fc2lua3MgPiBBVURJT19QQVRDSF9QT1JUU19NQVgpIHsKKyAgICBpZiAoIWF1ZGlvX3BhdGNoX2lzX3ZhbGlkKHBhdGNoKSB8fCAocGF0Y2gtPm51bV9zaW5rcyA9PSAwICYmIHBhdGNoLT5udW1fc291cmNlcyAhPSAyKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICAvLyBsaW1pdCBudW1iZXIgb2Ygc291cmNlcyB0byAxIGZvciBub3cgb3IgMiBzb3VyY2VzIGZvciBzcGVjaWFsIGNyb3NzIGh3IG1vZHVsZSBjYXNlLgpAQCAtMTYzLDgxICsxMzAsNzMgQEAKICAgICB9CiAKICAgICBpZiAoKmhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7ICpoYW5kbGUgIT0gMCAmJiBpbmRleCA8IG1QYXRjaGVzLnNpemUoKTsgaW5kZXgrKykgewotICAgICAgICAgICAgaWYgKCpoYW5kbGUgPT0gbVBhdGNoZXNbaW5kZXhdLT5tSGFuZGxlKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSByZW1vdmluZyBwYXRjaCBoYW5kbGUgJWQiLCAqaGFuZGxlKTsKLSAgICAgICAgICAgICAgICBoYWxIYW5kbGUgPSBtUGF0Y2hlc1tpbmRleF0tPm1IYWxIYW5kbGU7Ci0gICAgICAgICAgICAgICAgUGF0Y2ggKnJlbW92ZWRQYXRjaCA9IG1QYXRjaGVzW2luZGV4XTsKLSAgICAgICAgICAgICAgICAvLyBmcmVlIHJlc291cmNlcyBvd25lZCBieSB0aGUgcmVtb3ZlZCBwYXRjaCBpZiBhcHBsaWNhYmxlCi0gICAgICAgICAgICAgICAgLy8gMSkgaWYgYSBzb2Z0d2FyZSBwYXRjaCBpcyBwcmVzZW50LCByZWxlYXNlIHRoZSBwbGF5YmFjayBhbmQgY2FwdHVyZSB0aHJlYWRzIGFuZAotICAgICAgICAgICAgICAgIC8vIHRyYWNrcyBjcmVhdGVkLiBUaGlzIHdpbGwgYWxzbyByZWxlYXNlIHRoZSBjb3JyZXNwb25kaW5nIGF1ZGlvIEhBTCBwYXRjaGVzCi0gICAgICAgICAgICAgICAgaWYgKChyZW1vdmVkUGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZQotICAgICAgICAgICAgICAgICAgICAgICAgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAocmVtb3ZlZFBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSAhPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2xlYXJQYXRjaENvbm5lY3Rpb25zKHJlbW92ZWRQYXRjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIDIpIGlmIHRoZSBuZXcgcGF0Y2ggYW5kIG9sZCBwYXRjaCBzb3VyY2Ugb3Igc2luayBhcmUgZGV2aWNlcyBmcm9tIGRpZmZlcmVudAotICAgICAgICAgICAgICAgIC8vIGh3IG1vZHVsZXMsICBjbGVhciB0aGUgYXVkaW8gSEFMIHBhdGNoZXMgbm93IGJlY2F1c2UgdGhleSB3aWxsIG5vdCBiZSB1cGRhdGVkCi0gICAgICAgICAgICAgICAgLy8gYnkgY2FsbCB0byBjcmVhdGVfYXVkaW9fcGF0Y2goKSBiZWxvdyB3aGljaCB3aWxsIGhhcHBlbiBvbiBhIGRpZmZlcmVudCBIVyBtb2R1bGUKLSAgICAgICAgICAgICAgICBpZiAoaGFsSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBod01vZHVsZSA9IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChyZW1vdmVkUGF0Y2gtPm1BdWRpb1BhdGNoLnNvdXJjZXNbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKChwYXRjaC0+c291cmNlc1swXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIChyZW1vdmVkUGF0Y2gtPm1BdWRpb1BhdGNoLnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGUgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGh3TW9kdWxlID0gcmVtb3ZlZFBhdGNoLT5tQXVkaW9QYXRjaC5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChwYXRjaC0+bnVtX3NpbmtzID09IDApIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChyZW1vdmVkUGF0Y2gtPm1BdWRpb1BhdGNoLnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwYXRjaC0+c2lua3NbMF0udHlwZSAhPSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbW92ZWRQYXRjaC0+bUF1ZGlvUGF0Y2guc2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGUgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGUpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgb24gKHBhdGNoLT5udW1fc2lua3MgPT0gMCk6IHRoaXMgc2l0dWF0aW9uIHNob3VsZCBub3QgaGFwcGVuIGFzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVzZSBzcGVjaWFsIHBhdGNoZXMgYXJlIG9ubHkgY3JlYXRlZCBieSB0aGUgcG9saWN5IG1hbmFnZXIgYnV0IGp1c3QKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIGNhc2UsIHN5c3RlbWF0aWNhbGx5IGNsZWFyIHRoZSBIQUwgcGF0Y2guCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgcmVtb3ZlZFBhdGNoLT5tQXVkaW9QYXRjaC5udW1fc2lua3MgY2Fubm90IGJlIDAgaGVyZSBiZWNhdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBoYWxIYW5kbGUgd291bGQgYmUgQVVESU9fUEFUQ0hfSEFORExFX05PTkUgaW4gdGhpcyBjYXNlLgotICAgICAgICAgICAgICAgICAgICAgICAgaHdNb2R1bGUgPSByZW1vdmVkUGF0Y2gtPm1BdWRpb1BhdGNoLnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChod01vZHVsZSAhPSBBVURJT19NT0RVTEVfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KGh3TW9kdWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBod0RldmljZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy52YWx1ZUF0KGluZGV4KS0+aHdEZXZpY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBod0RldmljZS0+cmVsZWFzZUF1ZGlvUGF0Y2goaGFsSGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUGF0Y2hlcy5yZW1vdmVBdChpbmRleCk7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIHJlbW92ZWRQYXRjaDsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgYXV0byBpdGVyID0gbVBhdGNoZXMuZmluZCgqaGFuZGxlKTsKKyAgICAgICAgaWYgKGl0ZXIgIT0gbVBhdGNoZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcygpIHJlbW92aW5nIHBhdGNoIGhhbmRsZSAlZCIsIF9fZnVuY19fLCAqaGFuZGxlKTsKKyAgICAgICAgICAgIFBhdGNoICZyZW1vdmVkUGF0Y2ggPSBpdGVyLT5zZWNvbmQ7CisgICAgICAgICAgICAvLyBmcmVlIHJlc291cmNlcyBvd25lZCBieSB0aGUgcmVtb3ZlZCBwYXRjaCBpZiBhcHBsaWNhYmxlCisgICAgICAgICAgICAvLyAxKSBpZiBhIHNvZnR3YXJlIHBhdGNoIGlzIHByZXNlbnQsIHJlbGVhc2UgdGhlIHBsYXliYWNrIGFuZCBjYXB0dXJlIHRocmVhZHMgYW5kCisgICAgICAgICAgICAvLyB0cmFja3MgY3JlYXRlZC4gVGhpcyB3aWxsIGFsc28gcmVsZWFzZSB0aGUgY29ycmVzcG9uZGluZyBhdWRpbyBIQUwgcGF0Y2hlcworICAgICAgICAgICAgaWYgKHJlbW92ZWRQYXRjaC5pc1NvZnR3YXJlKCkpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVkUGF0Y2guY2xlYXJDb25uZWN0aW9ucyh0aGlzKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIDIpIGlmIHRoZSBuZXcgcGF0Y2ggYW5kIG9sZCBwYXRjaCBzb3VyY2Ugb3Igc2luayBhcmUgZGV2aWNlcyBmcm9tIGRpZmZlcmVudAorICAgICAgICAgICAgLy8gaHcgbW9kdWxlcywgIGNsZWFyIHRoZSBhdWRpbyBIQUwgcGF0Y2hlcyBub3cgYmVjYXVzZSB0aGV5IHdpbGwgbm90IGJlIHVwZGF0ZWQKKyAgICAgICAgICAgIC8vIGJ5IGNhbGwgdG8gY3JlYXRlX2F1ZGlvX3BhdGNoKCkgYmVsb3cgd2hpY2ggd2lsbCBoYXBwZW4gb24gYSBkaWZmZXJlbnQgSFcgbW9kdWxlCisgICAgICAgICAgICBpZiAocmVtb3ZlZFBhdGNoLm1IYWxIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgaHdNb2R1bGUgPSBBVURJT19NT0RVTEVfSEFORExFX05PTkU7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICZvbGRQYXRjaCA9IHJlbW92ZWRQYXRjaC5tQXVkaW9QYXRjaDsKKyAgICAgICAgICAgICAgICBpZiAob2xkUGF0Y2guc291cmNlc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChwYXRjaC0+c291cmNlc1swXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkUGF0Y2guc291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaHdNb2R1bGUgPSBvbGRQYXRjaC5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0Y2gtPm51bV9zaW5rcyA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAob2xkUGF0Y2guc2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXRjaC0+c2lua3NbMF0udHlwZSAhPSBBVURJT19QT1JUX1RZUEVfREVWSUNFIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkUGF0Y2guc2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGUgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGUpKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIG9uIChwYXRjaC0+bnVtX3NpbmtzID09IDApOiB0aGlzIHNpdHVhdGlvbiBzaG91bGQgbm90IGhhcHBlbiBhcworICAgICAgICAgICAgICAgICAgICAvLyB0aGVzZSBzcGVjaWFsIHBhdGNoZXMgYXJlIG9ubHkgY3JlYXRlZCBieSB0aGUgcG9saWN5IG1hbmFnZXIgYnV0IGp1c3QKKyAgICAgICAgICAgICAgICAgICAgLy8gaW4gY2FzZSwgc3lzdGVtYXRpY2FsbHkgY2xlYXIgdGhlIEhBTCBwYXRjaC4KKyAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHJlbW92ZWRQYXRjaC5tQXVkaW9QYXRjaC5udW1fc2lua3MgY2Fubm90IGJlIDAgaGVyZSBiZWNhdXNlCisgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZWRQYXRjaC5tSGFsSGFuZGxlIHdvdWxkIGJlIEFVRElPX1BBVENIX0hBTkRMRV9OT05FIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICAgICAgaHdNb2R1bGUgPSBvbGRQYXRjaC5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBod0RldmljZSA9IGZpbmRId0RldmljZUJ5TW9kdWxlKGh3TW9kdWxlKTsKKyAgICAgICAgICAgICAgICBpZiAoaHdEZXZpY2UgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBod0RldmljZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocmVtb3ZlZFBhdGNoLm1IYWxIYW5kbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1QYXRjaGVzLmVyYXNlKGl0ZXIpOworICAgICAgICAgICAgcmVtb3ZlU29mdHdhcmVQYXRjaEZyb21JbnNlcnRlZE1vZHVsZXMoKmhhbmRsZSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBQYXRjaCAqbmV3UGF0Y2ggPSBuZXcgUGF0Y2gocGF0Y2gpOworICAgIFBhdGNoIG5ld1BhdGNoeypwYXRjaH07CisgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGluc2VydGVkTW9kdWxlID0gQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FOwogCiAgICAgc3dpdGNoIChwYXRjaC0+c291cmNlc1swXS50eXBlKSB7CiAgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX0RFVklDRTogewogICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IHNyY01vZHVsZSA9IHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlOwotICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLmluZGV4T2ZLZXkoc3JjTW9kdWxlKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGJhZCBzcmMgaHcgbW9kdWxlICVkIiwgc3JjTW9kdWxlKTsKKyAgICAgICAgICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UgPSBmaW5kQXVkaW9Id0RldmljZUJ5TW9kdWxlKHNyY01vZHVsZSk7CisgICAgICAgICAgICBpZiAoIWF1ZGlvSHdEZXZpY2UpIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLnZhbHVlQXQoaW5kZXgpOwogICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKICAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IG9ubHkgb25lIHNpbmsgaWYgY29ubmVjdGlvbiB0byBhIG1peCBvciBhY3Jvc3MgSFcgbW9kdWxlcwogICAgICAgICAgICAgICAgIGlmICgocGF0Y2gtPnNpbmtzW2ldLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzW2ldLmV4dC5taXguaHdfbW9kdWxlICE9IHNyY01vZHVsZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhdGNoLT5zaW5rc1tpXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS5od19tb2R1bGUgIT0gc3JjTW9kdWxlKSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5udW1fc2lua3MgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIG11bHRpcGxlIHNpbmtzIGZvciBtaXggb3IgYWNyb3NzIG1vZHVsZXMgbm90IHN1cHBvcnRlZCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gcmVqZWN0IGNvbm5lY3Rpb24gdG8gZGlmZmVyZW50IHNpbmsgdHlwZXMKICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLnR5cGUgIT0gcGF0Y2gtPnNpbmtzWzBdLnR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBkaWZmZXJlbnQgc2luayB0eXBlcyBpbiBzYW1lIHBhdGNoIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgZGlmZmVyZW50IHNpbmsgdHlwZXMgaW4gc2FtZSBwYXRjaCBub3Qgc3VwcG9ydGVkIiwgX19mdW5jX18pOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICB9CkBAIC0yNTIsNDIgKzIxMSw1NiBAQAogICAgICAgICAgICAgICAgICgocGF0Y2gtPnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgJiYKICAgICAgICAgICAgICAgICAgKChwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGUgIT0gc3JjTW9kdWxlKSB8fAogICAgICAgICAgICAgICAgICAgIWF1ZGlvSHdEZXZpY2UtPnN1cHBvcnRzQXVkaW9QYXRjaGVzKCkpKSkgeworICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2UgPSBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS50eXBlOworICAgICAgICAgICAgICAgIFN0cmluZzggb3V0cHV0RGV2aWNlQWRkcmVzcyA9IFN0cmluZzgocGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5udW1fc291cmNlcyA9PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c291cmNlc1sxXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9NSVggfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGF0Y2gtPm51bV9zaW5rcyAhPSAwICYmIHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSAhPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMV0uZXh0Lm1peC5od19tb2R1bGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGludmFsaWQgc291cmNlIGNvbWJpbmF0aW9uIik7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBpbnZhbGlkIHNvdXJjZSBjb21iaW5hdGlvbiIsIF9fZnVuY19fKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb2ZsaW5nZXItPmNoZWNrUGxheWJhY2tUaHJlYWRfbChwYXRjaC0+c291cmNlc1sxXS5leHQubWl4LmhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1BhdGNoLT5tUGxheWJhY2tUaHJlYWQgPSAoTWl4ZXJUaHJlYWQgKil0aHJlYWQuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRmxpbmdlci5jaGVja1BsYXliYWNrVGhyZWFkX2wocGF0Y2gtPnNvdXJjZXNbMV0uZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgY2Fubm90IGdldCBwbGF5YmFjayB0aHJlYWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGNhbm5vdCBnZXQgcGxheWJhY2sgdGhyZWFkIiwgX19mdW5jX18pOwogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgcGxheWJhY2sgdGhyZWFkIGlzIHJldXNlZCwgc28gaXQgaXMgbm90IGNsb3NlZCB3aGVuIHBhdGNoIGlzIGNsZWFyZWQKKyAgICAgICAgICAgICAgICAgICAgbmV3UGF0Y2gubVBsYXliYWNrLnNldFRocmVhZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFBsYXliYWNrVGhyZWFkKj4odGhyZWFkLmdldCgpKSwgZmFsc2UgLypjbG9zZVRocmVhZCovKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS50eXBlOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5vcGVuT3V0cHV0X2woCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBwYXRjaC0+c2lua3NbMF0uc2FtcGxlX3JhdGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IHBhdGNoLT5zaW5rc1swXS5jaGFubmVsX21hc2s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IHBhdGNoLT5zaW5rc1swXS5mb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IHBhdGNoLT5zaW5rc1swXS5mbGFncy5vdXRwdXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbUF1ZGlvRmxpbmdlci5vcGVuT3V0cHV0X2woCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3UGF0Y2gtPm1QbGF5YmFja1RocmVhZCA9IChQbGF5YmFja1RocmVhZCAqKXRocmVhZC5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImF1ZGlvZmxpbmdlci0+b3Blbk91dHB1dF9sKCkgcmV0dXJuZWQgJXAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGF0Y2gtPm1QbGF5YmFja1RocmVhZC5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERldmljZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJtQXVkaW9GbGluZ2VyLm9wZW5PdXRwdXRfbCgpIHJldHVybmVkICVwIiwgdGhyZWFkLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBOT19NRU1PUlk7CiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbmV3UGF0Y2gubVBsYXliYWNrLnNldFRocmVhZChyZWludGVycHJldF9jYXN0PFBsYXliYWNrVGhyZWFkKj4odGhyZWFkLmdldCgpKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLnR5cGU7CiAgICAgICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOChwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmFkZHJlc3MpOwpAQCAtMjk3LDUyICsyNzAsNjcgQEAKICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNvdXJjZXNbMF0uY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURSkgewogICAgICAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBwYXRjaC0+c291cmNlc1swXS5zYW1wbGVfcmF0ZTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5zYW1wbGVSYXRlKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IG5ld1BhdGNoLm1QbGF5YmFjay50aHJlYWQoKS0+c2FtcGxlUmF0ZSgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNvdXJjZXNbMF0uY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0spIHsKICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IHBhdGNoLT5zb3VyY2VzWzBdLmNoYW5uZWxfbWFzazsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfaW5fbWFza19mcm9tX2NvdW50KG5ld1BhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmNoYW5uZWxDb3VudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGF1ZGlvX2NoYW5uZWxfaW5fbWFza19mcm9tX2NvdW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhdGNoLm1QbGF5YmFjay50aHJlYWQoKS0+Y2hhbm5lbENvdW50KCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNvdXJjZXNbMF0uY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQpIHsKICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IHBhdGNoLT5zb3VyY2VzWzBdLmZvcm1hdDsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gbmV3UGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+Zm9ybWF0KCk7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBuZXdQYXRjaC5tUGxheWJhY2sudGhyZWFkKCktPmZvcm1hdCgpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRkxBR1MgPworICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZmxhZ3MuaW5wdXQgOiBBVURJT19JTlBVVF9GTEFHX05PTkU7CiAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBhdWRpb2ZsaW5nZXItPm9wZW5JbnB1dF9sKHNyY01vZHVsZSwKKyAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtQXVkaW9GbGluZ2VyLm9wZW5JbnB1dF9sKHNyY01vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9NSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSk7Ci0gICAgICAgICAgICAgICAgbmV3UGF0Y2gtPm1SZWNvcmRUaHJlYWQgPSAoUmVjb3JkVGhyZWFkICopdGhyZWFkLmdldCgpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJhdWRpb2ZsaW5nZXItPm9wZW5JbnB1dF9sKCkgcmV0dXJuZWQgJXAgaW5DaGFubmVsTWFzayAlMDh4IiwKLSAgICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC0+bVJlY29yZFRocmVhZC5nZXQoKSwgY29uZmlnLmNoYW5uZWxfbWFzayk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1BhdGNoLT5tUmVjb3JkVGhyZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGV2aWNlQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgQUxPR1YoIm1BdWRpb0ZsaW5nZXIub3BlbklucHV0X2woKSByZXR1cm5lZCAlcCBpbkNoYW5uZWxNYXNrICUwOHgiLAorICAgICAgICAgICAgICAgICAgICAgIHRocmVhZC5nZXQoKSwgY29uZmlnLmNoYW5uZWxfbWFzayk7CisgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IE5PX01FTU9SWTsKICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBjcmVhdGVQYXRjaENvbm5lY3Rpb25zKG5ld1BhdGNoLCBwYXRjaCk7CisgICAgICAgICAgICAgICAgbmV3UGF0Y2gubVJlY29yZC5zZXRUaHJlYWQocmVpbnRlcnByZXRfY2FzdDxSZWNvcmRUaHJlYWQqPih0aHJlYWQuZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBuZXdQYXRjaC5jcmVhdGVDb25uZWN0aW9ucyh0aGlzKTsKICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGF1ZGlvSHdEZXZpY2UtPmlzSW5zZXJ0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWRNb2R1bGUgPSBhdWRpb0h3RGV2aWNlLT5oYW5kbGUoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tSZWNvcmRUaHJlYWRfbCgKKyAgICAgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbUF1ZGlvRmxpbmdlci5jaGVja1JlY29yZFRocmVhZF9sKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tNbWFwVGhyZWFkX2wocGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZCA9IG1BdWRpb0ZsaW5nZXIuY2hlY2tNbWFwVGhyZWFkX2wocGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgYmFkIGNhcHR1cmUgSS9PIGhhbmRsZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGJhZCBjYXB0dXJlIEkvTyBoYW5kbGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNlbmRDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnQocGF0Y2gsICZoYWxIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgc3RhbGUgYXVkaW8gcGF0Y2ggd2l0aCBzYW1lIGlucHV0IGFzIHNpbmsgaWYgYW55CisgICAgICAgICAgICAgICAgICAgIGZvciAoYXV0byYgaXRlciA6IG1QYXRjaGVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlci5zZWNvbmQubUF1ZGlvUGF0Y2guc2lua3NbMF0uZXh0Lm1peC5oYW5kbGUgPT0gdGhyZWFkLT5pZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBhdGNoZXMuZXJhc2UoaXRlci5maXJzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGh3RGV2aWNlID0gYXVkaW9Id0RldmljZS0+aHdEZXZpY2UoKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gaHdEZXZpY2UtPmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2gtPm51bV9zb3VyY2VzLApAQCAtMzU2LDkgKzM0NCw5IEBACiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX01JWDogewogICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IHNyY01vZHVsZSA9ICBwYXRjaC0+c291cmNlc1swXS5leHQubWl4Lmh3X21vZHVsZTsKLSAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KHNyY01vZHVsZSk7CisgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvRmxpbmdlci5tQXVkaW9Id0RldnMuaW5kZXhPZktleShzcmNNb2R1bGUpOwogICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgYmFkIHNyYyBodyBtb2R1bGUgJWQiLCBzcmNNb2R1bGUpOworICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGJhZCBzcmMgaHcgbW9kdWxlICVkIiwgX19mdW5jX18sIHNyY01vZHVsZSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgIH0KQEAgLTM2Niw4ICszNTQsOCBAQAogICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBBVURJT19ERVZJQ0VfTk9ORTsKICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7CiAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1tpXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBpbnZhbGlkIHNpbmsgdHlwZSAlZCBmb3IgbWl4IHNvdXJjZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1tpXS50eXBlKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgaW52YWxpZCBzaW5rIHR5cGUgJWQgZm9yIG1peCBzb3VyY2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBwYXRjaC0+c2lua3NbaV0udHlwZSk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgIH0KQEAgLTM3OSwzMTkgKzM2Nyw0NTEgQEAKICAgICAgICAgICAgICAgICB0eXBlIHw9IHBhdGNoLT5zaW5rc1tpXS5leHQuZGV2aWNlLnR5cGU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvZmxpbmdlci0+Y2hlY2tQbGF5YmFja1RocmVhZF9sKHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9GbGluZ2VyLmNoZWNrUGxheWJhY2tUaHJlYWRfbChwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CiAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgICAgICAgICB0aHJlYWQgPSBhdWRpb2ZsaW5nZXItPmNoZWNrTW1hcFRocmVhZF9sKHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICB0aHJlYWQgPSBtQXVkaW9GbGluZ2VyLmNoZWNrTW1hcFRocmVhZF9sKHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlKTsKICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBiYWQgcGxheWJhY2sgSS9PIGhhbmRsZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGJhZCBwbGF5YmFjayBJL08gaGFuZGxlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodGhyZWFkID09IGF1ZGlvZmxpbmdlci0+cHJpbWFyeVBsYXliYWNrVGhyZWFkX2woKSkgeworICAgICAgICAgICAgaWYgKHRocmVhZCA9PSBtQXVkaW9GbGluZ2VyLnByaW1hcnlQbGF5YmFja1RocmVhZF9sKCkpIHsKICAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7CiAgICAgICAgICAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCAoaW50KXR5cGUpOwogCi0gICAgICAgICAgICAgICAgYXVkaW9mbGluZ2VyLT5icm9hY2FzdFBhcmFtZXRlcnNUb1JlY29yZFRocmVhZHNfbChwYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBtQXVkaW9GbGluZ2VyLmJyb2FjYXN0UGFyYW1ldGVyc1RvUmVjb3JkVGhyZWFkc19sKHBhcmFtLnRvU3RyaW5nKCkpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNlbmRDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnQocGF0Y2gsICZoYWxIYW5kbGUpOworCisgICAgICAgICAgICAvLyByZW1vdmUgc3RhbGUgYXVkaW8gcGF0Y2ggd2l0aCBzYW1lIG91dHB1dCBhcyBzb3VyY2UgaWYgYW55CisgICAgICAgICAgICBmb3IgKGF1dG8mIGl0ZXIgOiBtUGF0Y2hlcykgeworICAgICAgICAgICAgICAgIGlmIChpdGVyLnNlY29uZC5tQXVkaW9QYXRjaC5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlID09IHRocmVhZC0+aWQoKSkgeworICAgICAgICAgICAgICAgICAgICBtUGF0Y2hlcy5lcmFzZShpdGVyLmZpcnN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgIH0KIGV4aXQ6Ci0gICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzdGF0dXMgJWQiLCBzdGF0dXMpOworICAgIEFMT0dWKCIlcygpIHN0YXR1cyAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOwogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgKmhhbmRsZSA9IChhdWRpb19wYXRjaF9oYW5kbGVfdCkgYXVkaW9mbGluZ2VyLT5uZXh0VW5pcXVlSWQoQVVESU9fVU5JUVVFX0lEX1VTRV9QQVRDSCk7Ci0gICAgICAgIG5ld1BhdGNoLT5tSGFuZGxlID0gKmhhbmRsZTsKLSAgICAgICAgbmV3UGF0Y2gtPm1IYWxIYW5kbGUgPSBoYWxIYW5kbGU7Ci0gICAgICAgIG1QYXRjaGVzLmFkZChuZXdQYXRjaCk7Ci0gICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgYWRkZWQgbmV3IHBhdGNoIGhhbmRsZSAlZCBoYWxIYW5kbGUgJWQiLCAqaGFuZGxlLCBoYWxIYW5kbGUpOworICAgICAgICAqaGFuZGxlID0gKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSBtQXVkaW9GbGluZ2VyLm5leHRVbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX1BBVENIKTsKKyAgICAgICAgbmV3UGF0Y2gubUhhbEhhbmRsZSA9IGhhbEhhbmRsZTsKKyAgICAgICAgbVBhdGNoZXMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCpoYW5kbGUsIHN0ZDo6bW92ZShuZXdQYXRjaCkpKTsKKyAgICAgICAgaWYgKGluc2VydGVkTW9kdWxlICE9IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgYWRkU29mdHdhcmVQYXRjaFRvSW5zZXJ0ZWRNb2R1bGVzKGluc2VydGVkTW9kdWxlLCAqaGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiJXMoKSBhZGRlZCBuZXcgcGF0Y2ggaGFuZGxlICVkIGhhbEhhbmRsZSAlZCIsIF9fZnVuY19fLCAqaGFuZGxlLCBoYWxIYW5kbGUpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGNsZWFyUGF0Y2hDb25uZWN0aW9ucyhuZXdQYXRjaCk7Ci0gICAgICAgIGRlbGV0ZSBuZXdQYXRjaDsKKyAgICAgICAgbmV3UGF0Y2guY2xlYXJDb25uZWN0aW9ucyh0aGlzKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpjcmVhdGVQYXRjaENvbm5lY3Rpb25zKFBhdGNoICpwYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKmF1ZGlvUGF0Y2gpCitBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OlBhdGNoOjp+UGF0Y2goKQoreworICAgIEFMT0dFX0lGKGlzU29mdHdhcmUoKSwgIlNvZnR3YXJlIHBhdGNoIGNvbm5lY3Rpb25zIGxlYWtlZCAlZCAlZCIsCisgICAgICAgICAgICBtUmVjb3JkLmhhbmRsZSgpLCBtUGxheWJhY2suaGFuZGxlKCkpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OlBhdGNoOjpjcmVhdGVDb25uZWN0aW9ucyhQYXRjaFBhbmVsICpwYW5lbCkKIHsKICAgICAvLyBjcmVhdGUgcGF0Y2ggZnJvbSBzb3VyY2UgZGV2aWNlIHRvIHJlY29yZCB0aHJlYWQgaW5wdXQKLSAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggc3ViUGF0Y2g7Ci0gICAgc3ViUGF0Y2gubnVtX3NvdXJjZXMgPSAxOwotICAgIHN1YlBhdGNoLnNvdXJjZXNbMF0gPSBhdWRpb1BhdGNoLT5zb3VyY2VzWzBdOwotICAgIHN1YlBhdGNoLm51bV9zaW5rcyA9IDE7Ci0KLSAgICBwYXRjaC0+bVJlY29yZFRocmVhZC0+Z2V0QXVkaW9Qb3J0Q29uZmlnKCZzdWJQYXRjaC5zaW5rc1swXSk7Ci0gICAgc3ViUGF0Y2guc2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9NSUM7Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBjcmVhdGVBdWRpb1BhdGNoKCZzdWJQYXRjaCwgJnBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUpOworICAgIHN0YXR1c190IHN0YXR1cyA9IHBhbmVsLT5jcmVhdGVBdWRpb1BhdGNoKAorICAgICAgICAgICAgUGF0Y2hCdWlsZGVyKCkuYWRkU291cmNlKG1BdWRpb1BhdGNoLnNvdXJjZXNbMF0pLgorICAgICAgICAgICAgICAgIGFkZFNpbmsobVJlY29yZC50aHJlYWQoKSwgeyAuc291cmNlID0gQVVESU9fU09VUkNFX01JQyB9KS5wYXRjaCgpLAorICAgICAgICAgICAgbVJlY29yZC5oYW5kbGVQdHIoKSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBwYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgICAgICptUmVjb3JkLmhhbmRsZVB0cigpID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCiAgICAgLy8gY3JlYXRlIHBhdGNoIGZyb20gcGxheWJhY2sgdGhyZWFkIG91dHB1dCB0byBzaW5rIGRldmljZQotICAgIGlmIChhdWRpb1BhdGNoLT5udW1fc2lua3MgIT0gMCkgewotICAgICAgICBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5nZXRBdWRpb1BvcnRDb25maWcoJnN1YlBhdGNoLnNvdXJjZXNbMF0pOwotICAgICAgICBzdWJQYXRjaC5zaW5rc1swXSA9IGF1ZGlvUGF0Y2gtPnNpbmtzWzBdOwotICAgICAgICBzdGF0dXMgPSBjcmVhdGVBdWRpb1BhdGNoKCZzdWJQYXRjaCwgJnBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSk7CisgICAgaWYgKG1BdWRpb1BhdGNoLm51bV9zaW5rcyAhPSAwKSB7CisgICAgICAgIHN0YXR1cyA9IHBhbmVsLT5jcmVhdGVBdWRpb1BhdGNoKAorICAgICAgICAgICAgICAgIFBhdGNoQnVpbGRlcigpLmFkZFNvdXJjZShtUGxheWJhY2sudGhyZWFkKCkpLmFkZFNpbmsobUF1ZGlvUGF0Y2guc2lua3NbMF0pLnBhdGNoKCksCisgICAgICAgICAgICAgICAgbVBsYXliYWNrLmhhbmRsZVB0cigpKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgICAgICAgICAqbVBsYXliYWNrLmhhbmRsZVB0cigpID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgcGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgICAgICptUGxheWJhY2suaGFuZGxlUHRyKCkgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICB9CiAKICAgICAvLyB1c2UgYSBwc2V1ZG8gTENNIGJldHdlZW4gaW5wdXQgYW5kIG91dHB1dCBmcmFtZWNvdW50Ci0gICAgc2l6ZV90IHBsYXliYWNrRnJhbWVDb3VudCA9IHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmZyYW1lQ291bnQoKTsKKyAgICBzaXplX3QgcGxheWJhY2tGcmFtZUNvdW50ID0gbVBsYXliYWNrLnRocmVhZCgpLT5mcmFtZUNvdW50KCk7CiAgICAgaW50IHBsYXliYWNrU2hpZnQgPSBfX2J1aWx0aW5fY3R6KHBsYXliYWNrRnJhbWVDb3VudCk7Ci0gICAgc2l6ZV90IHJlY29yZEZyYW1lY291bnQgPSBwYXRjaC0+bVJlY29yZFRocmVhZC0+ZnJhbWVDb3VudCgpOwotICAgIGludCBzaGlmdCA9IF9fYnVpbHRpbl9jdHoocmVjb3JkRnJhbWVjb3VudCk7CisgICAgc2l6ZV90IHJlY29yZEZyYW1lQ291bnQgPSBtUmVjb3JkLnRocmVhZCgpLT5mcmFtZUNvdW50KCk7CisgICAgaW50IHNoaWZ0ID0gX19idWlsdGluX2N0eihyZWNvcmRGcmFtZUNvdW50KTsKICAgICBpZiAocGxheWJhY2tTaGlmdCA8IHNoaWZ0KSB7CiAgICAgICAgIHNoaWZ0ID0gcGxheWJhY2tTaGlmdDsKICAgICB9Ci0gICAgc2l6ZV90IGZyYW1lQ291bnQgPSAocGxheWJhY2tGcmFtZUNvdW50ICogcmVjb3JkRnJhbWVjb3VudCkgPj4gc2hpZnQ7Ci0gICAgQUxPR1YoImNyZWF0ZVBhdGNoQ29ubmVjdGlvbnMoKSBwbGF5ZnJhbWVDb3VudCAlenUgcmVjb3JkRnJhbWVjb3VudCAlenUgZnJhbWVDb3VudCAlenUiLAotICAgICAgICAgIHBsYXliYWNrRnJhbWVDb3VudCwgcmVjb3JkRnJhbWVjb3VudCwgZnJhbWVDb3VudCk7CisgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAocGxheWJhY2tGcmFtZUNvdW50ICogcmVjb3JkRnJhbWVDb3VudCkgPj4gc2hpZnQ7CisgICAgQUxPR1YoIiVzKCkgcGxheWZyYW1lQ291bnQgJXp1IHJlY29yZEZyYW1lQ291bnQgJXp1IGZyYW1lQ291bnQgJXp1IiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBwbGF5YmFja0ZyYW1lQ291bnQsIHJlY29yZEZyYW1lQ291bnQsIGZyYW1lQ291bnQpOwogCiAgICAgLy8gY3JlYXRlIGEgc3BlY2lhbCByZWNvcmQgdHJhY2sgdG8gY2FwdHVyZSBmcm9tIHJlY29yZCB0aHJlYWQKLSAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5jaGFubmVsQ291bnQoKTsKKyAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBtUGxheWJhY2sudGhyZWFkKCktPmNoYW5uZWxDb3VudCgpOwogICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGluQ2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX2luX21hc2tfZnJvbV9jb3VudChjaGFubmVsQ291bnQpOwotICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG91dENoYW5uZWxNYXNrID0gcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+Y2hhbm5lbE1hc2soKTsKLSAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+c2FtcGxlUmF0ZSgpOwotICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA9IHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmZvcm1hdCgpOworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG91dENoYW5uZWxNYXNrID0gbVBsYXliYWNrLnRocmVhZCgpLT5jaGFubmVsTWFzaygpOworICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSBtUGxheWJhY2sudGhyZWFkKCktPnNhbXBsZVJhdGUoKTsKKyAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBtUGxheWJhY2sudGhyZWFkKCktPmZvcm1hdCgpOwogCi0gICAgcGF0Y2gtPm1QYXRjaFJlY29yZCA9IG5ldyBSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm1SZWNvcmRUaHJlYWQuZ2V0KCksCisgICAgYXVkaW9fZm9ybWF0X3QgaW5wdXRGb3JtYXQgPSBtUmVjb3JkLnRocmVhZCgpLT5mb3JtYXQoKTsKKyAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20oaW5wdXRGb3JtYXQpKSB7CisgICAgICAgIC8vIFRoZSBwbGF5YmFja1RocmVhZCBmb3JtYXQgd2lsbCBzYXkgUENNIGZvciBJRUM2MTkzNyBwYWNrZXRpemVkIHN0cmVhbS4KKyAgICAgICAgLy8gVXNlIHJlY29yZFRocmVhZCBmb3JtYXQuCisgICAgICAgIGZvcm1hdCA9IGlucHV0Rm9ybWF0OworICAgIH0KKyAgICBhdWRpb19pbnB1dF9mbGFnc190IGlucHV0RmxhZ3MgPSBtQXVkaW9QYXRjaC5zb3VyY2VzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRkxBR1MgPworICAgICAgICAgICAgbUF1ZGlvUGF0Y2guc291cmNlc1swXS5mbGFncy5pbnB1dCA6IEFVRElPX0lOUFVUX0ZMQUdfTk9ORTsKKyAgICBpZiAoc2FtcGxlUmF0ZSA9PSBtUmVjb3JkLnRocmVhZCgpLT5zYW1wbGVSYXRlKCkgJiYKKyAgICAgICAgICAgIGluQ2hhbm5lbE1hc2sgPT0gbVJlY29yZC50aHJlYWQoKS0+Y2hhbm5lbE1hc2soKSAmJgorICAgICAgICAgICAgbVJlY29yZC50aHJlYWQoKS0+ZmFzdFRyYWNrQXZhaWxhYmxlKCkgJiYKKyAgICAgICAgICAgIG1SZWNvcmQudGhyZWFkKCktPmhhc0Zhc3RDYXB0dXJlKCkpIHsKKyAgICAgICAgLy8gQ3JlYXRlIGEgZmFzdCB0cmFjayBpZiB0aGUgcmVjb3JkIHRocmVhZCBoYXMgZmFzdCBjYXB0dXJlIHRvIGdldCBiZXR0ZXIgcGVyZm9ybWFuY2UuCisgICAgICAgIC8vIE9ubHkgZW5hYmxlIGZhc3QgbW9kZSB3aGVuIHRoZXJlIGlzIG5vIHJlc2FtcGxlIG5lZWRlZC4KKyAgICAgICAgaW5wdXRGbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSAoaW5wdXRGbGFncyB8IEFVRElPX0lOUFVUX0ZMQUdfRkFTVCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRmFzdCBtb2RlIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBjYXNlLgorICAgICAgICBpbnB1dEZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIChpbnB1dEZsYWdzICYgfkFVRElPX0lOUFVUX0ZMQUdfRkFTVCk7CisgICAgfQorICAgIHNwPFJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ+IHRlbXBSZWNvcmRUcmFjayA9IG5ldyAoc3RkOjpub3Rocm93KSBSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlY29yZC50aHJlYWQoKS5nZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KTAgLyogYnVmZmVyU2l6ZSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSk7Ci0gICAgaWYgKHBhdGNoLT5tUGF0Y2hSZWNvcmQgPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLSAgICBzdGF0dXMgPSBwYXRjaC0+bVBhdGNoUmVjb3JkLT5pbml0Q2hlY2soKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0RmxhZ3MpOworICAgIHN0YXR1cyA9IG1SZWNvcmQuY2hlY2tUcmFjayh0ZW1wUmVjb3JkVHJhY2suZ2V0KCkpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9Ci0gICAgcGF0Y2gtPm1SZWNvcmRUaHJlYWQtPmFkZFBhdGNoUmVjb3JkKHBhdGNoLT5tUGF0Y2hSZWNvcmQpOworCisgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3Qgb3V0cHV0RmxhZ3MgPSBtQXVkaW9QYXRjaC5zaW5rc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTID8KKyAgICAgICAgICAgIG1BdWRpb1BhdGNoLnNpbmtzWzBdLmZsYWdzLm91dHB1dCA6IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX1BBVENIOworICAgIGlmIChtQXVkaW9QYXRjaC5udW1fc291cmNlcyA9PSAyICYmIG1BdWRpb1BhdGNoLnNvdXJjZXNbMV0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgIC8vICJyZXVzZSBvbmUgZXhpc3Rpbmcgb3V0cHV0IG1peCIgY2FzZQorICAgICAgICBzdHJlYW1UeXBlID0gbUF1ZGlvUGF0Y2guc291cmNlc1sxXS5leHQubWl4LnVzZWNhc2Uuc3RyZWFtOworICAgIH0KKyAgICBpZiAobVBsYXliYWNrLnRocmVhZCgpLT5oYXNGYXN0TWl4ZXIoKSkgeworICAgICAgICAvLyBDcmVhdGUgYSBmYXN0IHRyYWNrIGlmIHRoZSBwbGF5YmFjayB0aHJlYWQgaGFzIGZhc3QgbWl4ZXIgdG8gZ2V0IGJldHRlciBwZXJmb3JtYW5jZS4KKyAgICAgICAgLy8gTm90ZTogd2Ugc2hvdWxkIGhhdmUgbWF0Y2hpbmcgY2hhbm5lbCBtYXNrLCBzYW1wbGUgcmF0ZSwgYW5kIGZvcm1hdCBieSB0aGUgbG9naWMgYWJvdmUuCisgICAgICAgIG91dHB1dEZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAob3V0cHV0RmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19GQVNUKTsKKyAgICB9IGVsc2UgeworICAgICAgICBvdXRwdXRGbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKG91dHB1dEZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX0ZBU1QpOworICAgIH0KIAogICAgIC8vIGNyZWF0ZSBhIHNwZWNpYWwgcGxheWJhY2sgdHJhY2sgdG8gcmVuZGVyIHRvIHBsYXliYWNrIHRocmVhZC4KICAgICAvLyB0aGlzIHRyYWNrIGlzIGdpdmVuIHRoZSBzYW1lIGJ1ZmZlciBhcyB0aGUgUGF0Y2hSZWNvcmQgYnVmZmVyCi0gICAgcGF0Y2gtPm1QYXRjaFRyYWNrID0gbmV3IFBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5tUGxheWJhY2tUaHJlYWQuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9QYXRjaC0+c291cmNlc1sxXS5leHQubWl4LnVzZWNhc2Uuc3RyZWFtLAorICAgIHNwPFBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrPiB0ZW1wUGF0Y2hUcmFjayA9IG5ldyAoc3RkOjpub3Rocm93KSBQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2sudGhyZWFkKCkuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dENoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQtPmJ1ZmZlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQtPmJ1ZmZlclNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FKTsKLSAgICBzdGF0dXMgPSBwYXRjaC0+bVBhdGNoVHJhY2stPmluaXRDaGVjaygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBSZWNvcmRUcmFjay0+YnVmZmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFJlY29yZFRyYWNrLT5idWZmZXJTaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RmxhZ3MpOworICAgIHN0YXR1cyA9IG1QbGF5YmFjay5jaGVja1RyYWNrKHRlbXBQYXRjaFRyYWNrLmdldCgpKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQotICAgIHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmFkZFBhdGNoVHJhY2socGF0Y2gtPm1QYXRjaFRyYWNrKTsKIAogICAgIC8vIHRpZSBwbGF5YmFjayBhbmQgcmVjb3JkIHRyYWNrcyB0b2dldGhlcgotICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQtPnNldFBlZXJQcm94eShwYXRjaC0+bVBhdGNoVHJhY2suZ2V0KCkpOwotICAgIHBhdGNoLT5tUGF0Y2hUcmFjay0+c2V0UGVlclByb3h5KHBhdGNoLT5tUGF0Y2hSZWNvcmQuZ2V0KCkpOworICAgIG1SZWNvcmQuc2V0VHJhY2tBbmRQZWVyKHRlbXBSZWNvcmRUcmFjaywgdGVtcFBhdGNoVHJhY2spOworICAgIG1QbGF5YmFjay5zZXRUcmFja0FuZFBlZXIodGVtcFBhdGNoVHJhY2ssIHRlbXBSZWNvcmRUcmFjayk7CiAKICAgICAvLyBzdGFydCBjYXB0dXJlIGFuZCBwbGF5YmFjawotICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQtPnN0YXJ0KEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUsIEFVRElPX1NFU1NJT05fTk9ORSk7Ci0gICAgcGF0Y2gtPm1QYXRjaFRyYWNrLT5zdGFydCgpOworICAgIG1SZWNvcmQudHJhY2soKS0+c3RhcnQoQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfTk9ORSwgQVVESU9fU0VTU0lPTl9OT05FKTsKKyAgICBtUGxheWJhY2sudHJhY2soKS0+c3RhcnQoKTsKIAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpjbGVhclBhdGNoQ29ubmVjdGlvbnMoUGF0Y2ggKnBhdGNoKQordm9pZCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OlBhdGNoOjpjbGVhckNvbm5lY3Rpb25zKFBhdGNoUGFuZWwgKnBhbmVsKQogewotICAgIHNwPEF1ZGlvRmxpbmdlcj4gYXVkaW9mbGluZ2VyID0gbUF1ZGlvRmxpbmdlci5wcm9tb3RlKCk7Ci0gICAgaWYgKGF1ZGlvZmxpbmdlciA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKKyAgICBBTE9HVigiJXMoKSBtUmVjb3JkLmhhbmRsZSAlZCBtUGxheWJhY2suaGFuZGxlICVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtUmVjb3JkLmhhbmRsZSgpLCBtUGxheWJhY2suaGFuZGxlKCkpOworICAgIG1SZWNvcmQuc3RvcFRyYWNrKCk7CisgICAgbVBsYXliYWNrLnN0b3BUcmFjaygpOworICAgIG1SZWNvcmQuY2xlYXJUcmFja1BlZXIoKTsgLy8gbVJlY29yZCBzdG9wIGlzIHN5bmNocm9ub3VzLiBCcmVhayBQZWVyUHJveHkgc3A8PiBjeWNsZS4KKyAgICBtUmVjb3JkLmNsb3NlQ29ubmVjdGlvbnMocGFuZWwpOworICAgIG1QbGF5YmFjay5jbG9zZUNvbm5lY3Rpb25zKHBhbmVsKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpQYXRjaDo6Z2V0TGF0ZW5jeU1zKGRvdWJsZSAqbGF0ZW5jeU1zKSBjb25zdAoreworICAgIGlmICghaXNTb2Z0d2FyZSgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisKKyAgICBhdXRvIHJlY29yZFRyYWNrID0gbVJlY29yZC5jb25zdF90cmFjaygpOworICAgIGlmIChyZWNvcmRUcmFjay5nZXQoKSA9PSBudWxscHRyKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisKKyAgICBhdXRvIHBsYXliYWNrVHJhY2sgPSBtUGxheWJhY2suY29uc3RfdHJhY2soKTsKKyAgICBpZiAocGxheWJhY2tUcmFjay5nZXQoKSA9PSBudWxscHRyKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisKKyAgICAvLyBMYXRlbmN5IGluZm9ybWF0aW9uIGZvciB0cmFja3MgbWF5IGJlIGNhbGxlZCB3aXRob3V0IG9idGFpbmluZworICAgIC8vIHRoZSB1bmRlcmx5aW5nIHRocmVhZCBsb2NrLgorICAgIC8vCisgICAgLy8gV2UgdXNlIHJlY29yZCBzZXJ2ZXIgbGF0ZW5jeSArIHBsYXliYWNrIHRyYWNrIGxhdGVuY3kgKGdlbmVyYWxseSBzbWFsbGVyIHRoYW4gdGhlCisgICAgLy8gcmV2ZXJzZSBkdWUgdG8gaW50ZXJuYWwgYmlhc2VzKS4KKyAgICAvLworICAgIC8vIFRPRE86IGlzIHRoaXMgc3RhYmxlIGVub3VnaD8gQ29uc2lkZXIgYSBQYXRjaFRyYWNrIHN5bmNocm9uaXplZCB2ZXJzaW9uIG9mIHRoaXMuCisKKyAgICAvLyBGb3IgUENNIHRyYWNrcyBnZXQgc2VydmVyIGxhdGVuY3kuCisgICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20ocmVjb3JkVHJhY2stPmZvcm1hdCgpKSkgeworICAgICAgICBkb3VibGUgcmVjb3JkU2VydmVyTGF0ZW5jeU1zLCBwbGF5YmFja1RyYWNrTGF0ZW5jeU1zOworICAgICAgICBpZiAocmVjb3JkVHJhY2stPmdldFNlcnZlckxhdGVuY3lNcygmcmVjb3JkU2VydmVyTGF0ZW5jeU1zKSA9PSBPSworICAgICAgICAgICAgICAgICYmIHBsYXliYWNrVHJhY2stPmdldFRyYWNrTGF0ZW5jeU1zKCZwbGF5YmFja1RyYWNrTGF0ZW5jeU1zKSA9PSBPSykgeworICAgICAgICAgICAgKmxhdGVuY3lNcyA9IHJlY29yZFNlcnZlckxhdGVuY3lNcyArIHBsYXliYWNrVHJhY2tMYXRlbmN5TXM7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBBTE9HVigiY2xlYXJQYXRjaENvbm5lY3Rpb25zKCkgcGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSAlZCBwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUgJWQiLAotICAgICAgICAgIHBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUsIHBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSk7CisgICAgLy8gU2VlIGlmIGtlcm5lbCBsYXRlbmNpZXMgYXJlIGF2YWlsYWJsZS4KKyAgICAvLyBJZiBzbywgZG8gYSBmcmFtZSBkaWZmIGFuZCB0aW1lIGRpZmZlcmVuY2UgY29tcHV0YXRpb24gdG8gZXN0aW1hdGUKKyAgICAvLyB0aGUgdG90YWwgcGF0Y2ggbGF0ZW5jeS4gVGhpcyByZXF1aXJlcyB0aGF0IGZyYW1lIGNvdW50cyBhcmUgcmVwb3J0ZWQgYnkgdGhlCisgICAgLy8gSEFMIGFyZSBtYXRjaGVkIHByb3Blcmx5IGluIHRoZSBjYXNlIG9mIHJlY29yZCBvdmVycnVucyBhbmQgcGxheWJhY2sgdW5kZXJydW5zLgorICAgIFRocmVhZEJhc2U6OlRyYWNrQmFzZTo6RnJhbWVUaW1lIHJlY29yZEZUe30sIHBsYXlGVHt9OworICAgIHJlY29yZFRyYWNrLT5nZXRLZXJuZWxGcmFtZVRpbWUoJnJlY29yZEZUKTsKKyAgICBwbGF5YmFja1RyYWNrLT5nZXRLZXJuZWxGcmFtZVRpbWUoJnBsYXlGVCk7CisgICAgaWYgKHJlY29yZEZULnRpbWVOcyA+IDAgJiYgcGxheUZULnRpbWVOcyA+IDApIHsKKyAgICAgICAgY29uc3QgaW50NjRfdCBmcmFtZURpZmYgPSByZWNvcmRGVC5mcmFtZXMgLSBwbGF5RlQuZnJhbWVzOworICAgICAgICBjb25zdCBpbnQ2NF90IHRpbWVEaWZmTnMgPSByZWNvcmRGVC50aW1lTnMgLSBwbGF5RlQudGltZU5zOwogCi0gICAgaWYgKHBhdGNoLT5tUGF0Y2hSZWNvcmQgIT0gMCkgewotICAgICAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLT5zdG9wKCk7Ci0gICAgfQotICAgIGlmIChwYXRjaC0+bVBhdGNoVHJhY2sgIT0gMCkgewotICAgICAgICBwYXRjaC0+bVBhdGNoVHJhY2stPnN0b3AoKTsKLSAgICB9Ci0gICAgaWYgKHBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgcmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSk7Ci0gICAgICAgIHBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICB9Ci0gICAgaWYgKHBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICByZWxlYXNlQXVkaW9QYXRjaChwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUpOwotICAgICAgICBwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICB9Ci0gICAgaWYgKHBhdGNoLT5tUmVjb3JkVGhyZWFkICE9IDApIHsKLSAgICAgICAgaWYgKHBhdGNoLT5tUGF0Y2hSZWNvcmQgIT0gMCkgewotICAgICAgICAgICAgcGF0Y2gtPm1SZWNvcmRUaHJlYWQtPmRlbGV0ZVBhdGNoUmVjb3JkKHBhdGNoLT5tUGF0Y2hSZWNvcmQpOworICAgICAgICAvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IHRoZSBwYXRjaCB0cmFjayBhbmQgcGF0Y2ggcmVjb3JkIGhhdmUgYSBsYXJnZSB0aW1lIGRpc3Bhcml0eSBiZWNhdXNlCisgICAgICAgIC8vIG9uZSB0aHJlYWQgcnVucyBidXQgYW5vdGhlciBpcyBzdG9wcGVkLiAgV2UgYXJiaXRyYXJpbHkgY2hvb3NlIHRoZSBtYXhpbXVtIHRpbWVzdGFtcAorICAgICAgICAvLyB0aW1lIGRpZmZlcmVuY2UgYmFzZWQgb24gaG93IG9mdGVuIHdlIGV4cGVjdCB0aGUgdGltZXN0YW1wcyB0byB1cGRhdGUgaW4gbm9ybWFsIG9wZXJhdGlvbgorICAgICAgICAvLyAodHlwaWNhbCBzaG91bGQgYmUgbm8gbW9yZSB0aGFuIDUwIG1zKS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gSWYgdGhlIHRpbWVzdGFtcHMgYXJlbid0IHNhbXBsZWQgY2xvc2UgZW5vdWdoLCB0aGUgcGF0Y2ggbGF0ZW5jeSBpcyBub3QKKyAgICAgICAgLy8gY29uc2lkZXJlZCB2YWxpZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gVE9ETzogY2hhbmdlIHRoaXMgYmFzZWQgb24gbW9yZSBleHBlcmltZW50cy4KKyAgICAgICAgY29uc3RleHByIGludDY0X3QgbWF4VmFsaWRUaW1lRGlmZk5zID0gMjAwICogTkFOT1NfUEVSX01JTExJU0VDT05EOworICAgICAgICBpZiAoc3RkOjphYnModGltZURpZmZOcykgPCBtYXhWYWxpZFRpbWVEaWZmTnMpIHsKKyAgICAgICAgICAgICpsYXRlbmN5TXMgPSBmcmFtZURpZmYgKiAxZTMgLyByZWNvcmRUcmFjay0+c2FtcGxlUmF0ZSgpCisgICAgICAgICAgICAgICAgICAgLSB0aW1lRGlmZk5zICogMWUtNjsKKyAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQotICAgICAgICBhdWRpb2ZsaW5nZXItPmNsb3NlSW5wdXRJbnRlcm5hbF9sKHBhdGNoLT5tUmVjb3JkVGhyZWFkKTsKLSAgICB9Ci0gICAgaWYgKHBhdGNoLT5tUGxheWJhY2tUaHJlYWQgIT0gMCkgewotICAgICAgICBpZiAocGF0Y2gtPm1QYXRjaFRyYWNrICE9IDApIHsKLSAgICAgICAgICAgIHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmRlbGV0ZVBhdGNoVHJhY2socGF0Y2gtPm1QYXRjaFRyYWNrKTsKLSAgICAgICAgfQotICAgICAgICAvLyBpZiBudW0gc291cmNlcyA9PSAyIHdlIGFyZSByZXVzaW5nIGFuIGV4aXN0aW5nIHBsYXliYWNrIHRocmVhZCBzbyB3ZSBkbyBub3QgY2xvc2UgaXQKLSAgICAgICAgaWYgKHBhdGNoLT5tQXVkaW9QYXRjaC5udW1fc291cmNlcyAhPSAyKSB7Ci0gICAgICAgICAgICBhdWRpb2ZsaW5nZXItPmNsb3NlT3V0cHV0SW50ZXJuYWxfbChwYXRjaC0+bVBsYXliYWNrVGhyZWFkKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocGF0Y2gtPm1SZWNvcmRUaHJlYWQgIT0gMCkgewotICAgICAgICBpZiAocGF0Y2gtPm1QYXRjaFJlY29yZCAhPSAwKSB7Ci0gICAgICAgICAgICBwYXRjaC0+bVBhdGNoUmVjb3JkLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcGF0Y2gtPm1SZWNvcmRUaHJlYWQuY2xlYXIoKTsKLSAgICB9Ci0gICAgaWYgKHBhdGNoLT5tUGxheWJhY2tUaHJlYWQgIT0gMCkgewotICAgICAgICBpZiAocGF0Y2gtPm1QYXRjaFRyYWNrICE9IDApIHsKLSAgICAgICAgICAgIHBhdGNoLT5tUGF0Y2hUcmFjay5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIHBhdGNoLT5tUGxheWJhY2tUaHJlYWQuY2xlYXIoKTsKICAgICB9CiAKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK1N0cmluZzggQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpQYXRjaDo6ZHVtcChhdWRpb19wYXRjaF9oYW5kbGVfdCBteUhhbmRsZSkgY29uc3QKK3sKKyAgICAvLyBUT0RPOiBDb25zaWRlciB0YWJsZSBkdW1wIGZvcm0gZm9yIHBhdGNoZXMsIGp1c3QgbGlrZSB0cmFja3MuCisgICAgU3RyaW5nOCByZXN1bHQgPSBTdHJpbmc4Ojpmb3JtYXQoIlBhdGNoICVkOiB0aHJlYWQgJXAgPT4gdGhyZWFkICVwIiwKKyAgICAgICAgICAgIG15SGFuZGxlLCBtUmVjb3JkLmNvbnN0X3RocmVhZCgpLmdldCgpLCBtUGxheWJhY2suY29uc3RfdGhyZWFkKCkuZ2V0KCkpOworCisgICAgLy8gYWRkIGxhdGVuY3kgaWYgaXQgZXhpc3RzCisgICAgZG91YmxlIGxhdGVuY3lNczsKKyAgICBpZiAoZ2V0TGF0ZW5jeU1zKCZsYXRlbmN5TXMpID09IE9LKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgbGF0ZW5jeTogJS4ybGYgbXMiLCBsYXRlbmN5TXMpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiAvKiBEaXNjb25uZWN0IGEgcGF0Y2ggKi8KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6cmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQogewotICAgIEFMT0dWKCJyZWxlYXNlQXVkaW9QYXRjaCBoYW5kbGUgJWQiLCBoYW5kbGUpOworICAgIEFMT0dWKCIlcyBoYW5kbGUgJWQiLCBfX2Z1bmNfXywgaGFuZGxlKTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBzaXplX3QgaW5kZXg7CiAKLSAgICBzcDxBdWRpb0ZsaW5nZXI+IGF1ZGlvZmxpbmdlciA9IG1BdWRpb0ZsaW5nZXIucHJvbW90ZSgpOwotICAgIGlmIChhdWRpb2ZsaW5nZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0KLSAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBtUGF0Y2hlcy5zaXplKCk7IGluZGV4KyspIHsKLSAgICAgICAgaWYgKGhhbmRsZSA9PSBtUGF0Y2hlc1tpbmRleF0tPm1IYW5kbGUpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChpbmRleCA9PSBtUGF0Y2hlcy5zaXplKCkpIHsKKyAgICBhdXRvIGl0ZXIgPSBtUGF0Y2hlcy5maW5kKGhhbmRsZSk7CisgICAgaWYgKGl0ZXIgPT0gbVBhdGNoZXMuZW5kKCkpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgUGF0Y2ggKnJlbW92ZWRQYXRjaCA9IG1QYXRjaGVzW2luZGV4XTsKLSAgICBtUGF0Y2hlcy5yZW1vdmVBdChpbmRleCk7CisgICAgUGF0Y2ggJnJlbW92ZWRQYXRjaCA9IGl0ZXItPnNlY29uZDsKKyAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggJnBhdGNoID0gcmVtb3ZlZFBhdGNoLm1BdWRpb1BhdGNoOwogCi0gICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCA9ICZyZW1vdmVkUGF0Y2gtPm1BdWRpb1BhdGNoOwotCi0gICAgc3dpdGNoIChwYXRjaC0+c291cmNlc1swXS50eXBlKSB7CisgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICZzcmMgPSBwYXRjaC5zb3VyY2VzWzBdOworICAgIHN3aXRjaCAoc3JjLnR5cGUpIHsKICAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfREVWSUNFOiB7Ci0gICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3Qgc3JjTW9kdWxlID0gcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGU7Ci0gICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMuaW5kZXhPZktleShzcmNNb2R1bGUpOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlQXVkaW9QYXRjaCgpIGJhZCBzcmMgaHcgbW9kdWxlICVkIiwgc3JjTW9kdWxlKTsKKyAgICAgICAgICAgIHNwPERldmljZUhhbEludGVyZmFjZT4gaHdEZXZpY2UgPSBmaW5kSHdEZXZpY2VCeU1vZHVsZShzcmMuZXh0LmRldmljZS5od19tb2R1bGUpOworICAgICAgICAgICAgaWYgKGh3RGV2aWNlID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBiYWQgc3JjIGh3IG1vZHVsZSAlZCIsIF9fZnVuY19fLCBzcmMuZXh0LmRldmljZS5od19tb2R1bGUpOwogICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHJlbW92ZWRQYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FIHx8Ci0gICAgICAgICAgICAgICAgICAgIHJlbW92ZWRQYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBjbGVhclBhdGNoQ29ubmVjdGlvbnMocmVtb3ZlZFBhdGNoKTsKKyAgICAgICAgICAgIGlmIChyZW1vdmVkUGF0Y2guaXNTb2Z0d2FyZSgpKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlZFBhdGNoLmNsZWFyQ29ubmVjdGlvbnModGhpcyk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7Ci0gICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5jaGVja1JlY29yZFRocmVhZF9sKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICBpZiAocGF0Y2guc2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUgPSBwYXRjaC5zaW5rc1swXS5leHQubWl4LmhhbmRsZTsKKyAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtQXVkaW9GbGluZ2VyLmNoZWNrUmVjb3JkVGhyZWFkX2woaW9IYW5kbGUpOwogICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICB0aHJlYWQgPSBhdWRpb2ZsaW5nZXItPmNoZWNrTW1hcFRocmVhZF9sKHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIHRocmVhZCA9IG1BdWRpb0ZsaW5nZXIuY2hlY2tNbWFwVGhyZWFkX2woaW9IYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlQXVkaW9QYXRjaCgpIGJhZCBjYXB0dXJlIEkvTyBoYW5kbGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGJhZCBjYXB0dXJlIEkvTyBoYW5kbGUgJWQiLCBfX2Z1bmNfXywgaW9IYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZW5kUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudChyZW1vdmVkUGF0Y2gtPm1IYWxIYW5kbGUpOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnQocmVtb3ZlZFBhdGNoLm1IYWxIYW5kbGUpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgICAgICAgICAgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBod0RldmljZSA9IGF1ZGlvSHdEZXZpY2UtPmh3RGV2aWNlKCk7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gaHdEZXZpY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHJlbW92ZWRQYXRjaC0+bUhhbEhhbmRsZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gaHdEZXZpY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHJlbW92ZWRQYXRjaC5tSGFsSGFuZGxlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBBVURJT19QT1JUX1RZUEVfTUlYOiB7Ci0gICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3Qgc3JjTW9kdWxlID0gIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaHdfbW9kdWxlOwotICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLmluZGV4T2ZLZXkoc3JjTW9kdWxlKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygicmVsZWFzZUF1ZGlvUGF0Y2goKSBiYWQgc3JjIGh3IG1vZHVsZSAlZCIsIHNyY01vZHVsZSk7CisgICAgICAgICAgICBpZiAoZmluZEh3RGV2aWNlQnlNb2R1bGUoc3JjLmV4dC5taXguaHdfbW9kdWxlKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgYmFkIHNyYyBodyBtb2R1bGUgJWQiLCBfX2Z1bmNfXywgc3JjLmV4dC5taXguaHdfbW9kdWxlKTsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvZmxpbmdlci0+Y2hlY2tQbGF5YmFja1RocmVhZF9sKHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlID0gc3JjLmV4dC5taXguaGFuZGxlOworICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbUF1ZGlvRmxpbmdlci5jaGVja1BsYXliYWNrVGhyZWFkX2woaW9IYW5kbGUpOwogICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5jaGVja01tYXBUaHJlYWRfbChwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgdGhyZWFkID0gbUF1ZGlvRmxpbmdlci5jaGVja01tYXBUaHJlYWRfbChpb0hhbmRsZSk7CiAgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlQXVkaW9QYXRjaCgpIGJhZCBwbGF5YmFjayBJL08gaGFuZGxlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgYmFkIHBsYXliYWNrIEkvTyBoYW5kbGUgJWQiLCBfX2Z1bmNfXywgaW9IYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnQocmVtb3ZlZFBhdGNoLT5tSGFsSGFuZGxlKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHRocmVhZC0+c2VuZFJlbGVhc2VBdWRpb1BhdGNoQ29uZmlnRXZlbnQocmVtb3ZlZFBhdGNoLm1IYWxIYW5kbGUpOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgZGVsZXRlIHJlbW92ZWRQYXRjaDsKKyAgICBtUGF0Y2hlcy5lcmFzZShpdGVyKTsKKyAgICByZW1vdmVTb2Z0d2FyZVBhdGNoRnJvbUluc2VydGVkTW9kdWxlcyhoYW5kbGUpOwogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLQogLyogTGlzdCBjb25uZWN0ZWQgYXVkaW8gcG9ydHMgYW5kIHRoZXkgYXR0cmlidXRlcyAqLwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzIF9fdW51c2VkKQogewotICAgIEFMT0dWKCJsaXN0QXVkaW9QYXRjaGVzIik7CisgICAgQUxPR1YoX19mdW5jX18pOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotLyogU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbiAqLwotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmdldERvd25zdHJlYW1Tb2Z0d2FyZVBhdGNoZXMoCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHN0cmVhbSwKKyAgICAgICAgc3RkOjp2ZWN0b3I8QXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpTb2Z0d2FyZVBhdGNoPiAqcGF0Y2hlcykgY29uc3QKIHsKLSAgICBBTE9HVigic2V0QXVkaW9Qb3J0Q29uZmlnIik7Ci0KLSAgICBzcDxBdWRpb0ZsaW5nZXI+IGF1ZGlvZmxpbmdlciA9IG1BdWRpb0ZsaW5nZXIucHJvbW90ZSgpOwotICAgIGlmIChhdWRpb2ZsaW5nZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG1vZHVsZSA6IG1JbnNlcnRlZE1vZHVsZXMpIHsKKyAgICAgICAgaWYgKG1vZHVsZS5zZWNvbmQuc3RyZWFtcy5jb3VudChzdHJlYW0pKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHBhdGNoSGFuZGxlIDogbW9kdWxlLnNlY29uZC5zd19wYXRjaGVzKSB7CisgICAgICAgICAgICAgICAgY29uc3QgYXV0byYgcGF0Y2hfaXRlciA9IG1QYXRjaGVzLmZpbmQocGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgICAgIGlmIChwYXRjaF9pdGVyICE9IG1QYXRjaGVzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhdGNoICZwYXRjaCA9IHBhdGNoX2l0ZXItPnNlY29uZDsKKyAgICAgICAgICAgICAgICAgICAgcGF0Y2hlcy0+ZW1wbGFjZV9iYWNrKCp0aGlzLCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC5tUGxheWJhY2suY29uc3RfdGhyZWFkKCktPmlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gubVJlY29yZC5jb25zdF90aHJlYWQoKS0+aWQoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlN0YWxlIHBhdGNoIGhhbmRsZSBpbiB0aGUgY2FjaGU6ICVkIiwgcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQogICAgIH0KKyAgICAvLyBUaGUgc3RyZWFtIGlzIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IG9mIGluc2VydGVkIG1vZHVsZXMuCisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KIAotICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGU7Ci0gICAgaWYgKGNvbmZpZy0+dHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7Ci0gICAgICAgIG1vZHVsZSA9IGNvbmZpZy0+ZXh0LmRldmljZS5od19tb2R1bGU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbW9kdWxlID0gY29uZmlnLT5leHQubWl4Lmh3X21vZHVsZTsKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpub3RpZnlTdHJlYW1PcGVuZWQoCisgICAgICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UsIGF1ZGlvX2lvX2hhbmRsZV90IHN0cmVhbSkKK3sKKyAgICBpZiAoYXVkaW9Id0RldmljZS0+aXNJbnNlcnQoKSkgeworICAgICAgICBtSW5zZXJ0ZWRNb2R1bGVzW2F1ZGlvSHdEZXZpY2UtPmhhbmRsZSgpXS5zdHJlYW1zLmluc2VydChzdHJlYW0pOwogICAgIH0KK30KIAotICAgIHNzaXplX3QgaW5kZXggPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KG1vZHVsZSk7Cit2b2lkIEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6bm90aWZ5U3RyZWFtQ2xvc2VkKGF1ZGlvX2lvX2hhbmRsZV90IHN0cmVhbSkKK3sKKyAgICBmb3IgKGF1dG8mIG1vZHVsZSA6IG1JbnNlcnRlZE1vZHVsZXMpIHsKKyAgICAgICAgbW9kdWxlLnNlY29uZC5zdHJlYW1zLmVyYXNlKHN0cmVhbSk7CisgICAgfQorfQorCitBdWRpb0h3RGV2aWNlKiBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmZpbmRBdWRpb0h3RGV2aWNlQnlNb2R1bGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSkKK3sKKyAgICBpZiAobW9kdWxlID09IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORSkgcmV0dXJuIG51bGxwdHI7CisgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb0ZsaW5nZXIubUF1ZGlvSHdEZXZzLmluZGV4T2ZLZXkobW9kdWxlKTsKICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJzZXRBdWRpb1BvcnRDb25maWcoKSBiYWQgaHcgbW9kdWxlICVkIiwgbW9kdWxlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR1coIiVzKCkgYmFkIGh3IG1vZHVsZSAlZCIsIF9fZnVuY19fLCBtb2R1bGUpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIG1BdWRpb0ZsaW5nZXIubUF1ZGlvSHdEZXZzLnZhbHVlQXQoaW5kZXgpOworfQorCitzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6ZmluZEh3RGV2aWNlQnlNb2R1bGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSkKK3sKKyAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlID0gZmluZEF1ZGlvSHdEZXZpY2VCeU1vZHVsZShtb2R1bGUpOworICAgIHJldHVybiBhdWRpb0h3RGV2aWNlID8gYXVkaW9Id0RldmljZS0+aHdEZXZpY2UoKSA6IG51bGxwdHI7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjphZGRTb2Z0d2FyZVBhdGNoVG9JbnNlcnRlZE1vZHVsZXMoCisgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBtSW5zZXJ0ZWRNb2R1bGVzW21vZHVsZV0uc3dfcGF0Y2hlcy5pbnNlcnQoaGFuZGxlKTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OnJlbW92ZVNvZnR3YXJlUGF0Y2hGcm9tSW5zZXJ0ZWRNb2R1bGVzKAorICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgZm9yIChhdXRvJiBtb2R1bGUgOiBtSW5zZXJ0ZWRNb2R1bGVzKSB7CisgICAgICAgIG1vZHVsZS5zZWNvbmQuc3dfcGF0Y2hlcy5lcmFzZShoYW5kbGUpOworICAgIH0KK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmR1bXAoaW50IGZkKSBjb25zdAoreworICAgIFN0cmluZzggcGF0Y2hQYW5lbER1bXA7CisgICAgY29uc3QgY2hhciAqaW5kZW50ID0gIiAgIjsKKworICAgIC8vIE9ubHkgZHVtcCBzb2Z0d2FyZSBwYXRjaGVzLgorICAgIGJvb2wgaGVhZGVyUHJpbnRlZCA9IGZhbHNlOworICAgIGZvciAoY29uc3QgYXV0byYgaXRlciA6IG1QYXRjaGVzKSB7CisgICAgICAgIGlmIChpdGVyLnNlY29uZC5pc1NvZnR3YXJlKCkpIHsKKyAgICAgICAgICAgIGlmICghaGVhZGVyUHJpbnRlZCkgeworICAgICAgICAgICAgICAgIHBhdGNoUGFuZWxEdW1wICs9ICJcblNvZnR3YXJlIHBhdGNoZXM6XG4iOworICAgICAgICAgICAgICAgIGhlYWRlclByaW50ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcGF0Y2hQYW5lbER1bXAuYXBwZW5kRm9ybWF0KCIlcyVzXG4iLCBpbmRlbnQsIGl0ZXIuc2Vjb25kLmR1bXAoaXRlci5maXJzdCkuc3RyaW5nKCkpOworICAgICAgICB9CiAgICAgfQogCi0gICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLnZhbHVlQXQoaW5kZXgpOwotICAgIHJldHVybiBhdWRpb0h3RGV2aWNlLT5od0RldmljZSgpLT5zZXRBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKKyAgICBoZWFkZXJQcmludGVkID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBhdXRvJiBtb2R1bGUgOiBtSW5zZXJ0ZWRNb2R1bGVzKSB7CisgICAgICAgIGlmICghbW9kdWxlLnNlY29uZC5zdHJlYW1zLmVtcHR5KCkgfHwgIW1vZHVsZS5zZWNvbmQuc3dfcGF0Y2hlcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBpZiAoIWhlYWRlclByaW50ZWQpIHsKKyAgICAgICAgICAgICAgICBwYXRjaFBhbmVsRHVtcCArPSAiXG5UcmFja2VkIGluc2VydGVkIG1vZHVsZXM6XG4iOworICAgICAgICAgICAgICAgIGhlYWRlclByaW50ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nOCBtb2R1bGVEdW1wID0gU3RyaW5nODo6Zm9ybWF0KCJNb2R1bGUgJWQ6IEkvTyBoYW5kbGVzOiAiLCBtb2R1bGUuZmlyc3QpOworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzdHJlYW0gOiBtb2R1bGUuc2Vjb25kLnN0cmVhbXMpIHsKKyAgICAgICAgICAgICAgICBtb2R1bGVEdW1wLmFwcGVuZEZvcm1hdCgiJWQgIiwgc3RyZWFtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1vZHVsZUR1bXAuYXBwZW5kKCI7IFNXIFBhdGNoZXM6ICIpOworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwYXRjaCA6IG1vZHVsZS5zZWNvbmQuc3dfcGF0Y2hlcykgeworICAgICAgICAgICAgICAgIG1vZHVsZUR1bXAuYXBwZW5kRm9ybWF0KCIlZCAiLCBwYXRjaCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXRjaFBhbmVsRHVtcC5hcHBlbmRGb3JtYXQoIiVzJXNcbiIsIGluZGVudCwgbW9kdWxlRHVtcC5zdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXBhdGNoUGFuZWxEdW1wLmlzRW1wdHkoKSkgeworICAgICAgICB3cml0ZShmZCwgcGF0Y2hQYW5lbER1bXAuc3RyaW5nKCksIHBhdGNoUGFuZWxEdW1wLnNpemUoKSk7CisgICAgfQogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuaAppbmRleCBkMzdjMGQzLi4xODFlMjdjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmgKQEAgLTE5LDEzICsxOSwzMyBAQAogICAgICNlcnJvciBUaGlzIGhlYWRlciBmaWxlIHNob3VsZCBvbmx5IGJlIGluY2x1ZGVkIGZyb20gQXVkaW9GbGluZ2VyLmgKICNlbmRpZgogCi1jbGFzcyBQYXRjaFBhbmVsIDogcHVibGljIFJlZkJhc2UgeworCisvLyBQYXRjaFBhbmVsIGlzIGNvbmNlYWxlZCB3aXRoaW4gQXVkaW9GbGluZ2VyLCB0aGVpciBsaWZldGltZXMgYXJlIHRoZSBzYW1lLgorY2xhc3MgUGF0Y2hQYW5lbCB7CiBwdWJsaWM6CisgICAgY2xhc3MgU29mdHdhcmVQYXRjaCB7CisgICAgICBwdWJsaWM6CisgICAgICAgIFNvZnR3YXJlUGF0Y2goY29uc3QgUGF0Y2hQYW5lbCAmcGF0Y2hQYW5lbCwgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgcGxheWJhY2tUaHJlYWRIYW5kbGUsIGF1ZGlvX2lvX2hhbmRsZV90IHJlY29yZFRocmVhZEhhbmRsZSkKKyAgICAgICAgICAgICAgICA6IG1QYXRjaFBhbmVsKHBhdGNoUGFuZWwpLCBtUGF0Y2hIYW5kbGUocGF0Y2hIYW5kbGUpLAorICAgICAgICAgICAgICAgICAgbVBsYXliYWNrVGhyZWFkSGFuZGxlKHBsYXliYWNrVGhyZWFkSGFuZGxlKSwKKyAgICAgICAgICAgICAgICAgIG1SZWNvcmRUaHJlYWRIYW5kbGUocmVjb3JkVGhyZWFkSGFuZGxlKSB7fQorICAgICAgICBTb2Z0d2FyZVBhdGNoKGNvbnN0IFNvZnR3YXJlUGF0Y2gmKSA9IGRlZmF1bHQ7CisgICAgICAgIFNvZnR3YXJlUGF0Y2gmIG9wZXJhdG9yPShjb25zdCBTb2Z0d2FyZVBhdGNoJikgPSBkZWZhdWx0OwogCi0gICAgY2xhc3MgUGF0Y2g7CisgICAgICAgIC8vIE11c3QgYmUgY2FsbGVkIHVuZGVyIEF1ZGlvRmxpbmdlcjo6bUxvY2sKKyAgICAgICAgc3RhdHVzX3QgZ2V0TGF0ZW5jeU1zX2woZG91YmxlICpsYXRlbmN5TXMpIGNvbnN0OworICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBnZXRQYXRjaEhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1QYXRjaEhhbmRsZTsgfTsKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0UGxheWJhY2tUaHJlYWRIYW5kbGUoKSBjb25zdCB7IHJldHVybiBtUGxheWJhY2tUaHJlYWRIYW5kbGU7IH07CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldFJlY29yZFRocmVhZEhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1SZWNvcmRUaHJlYWRIYW5kbGU7IH07CisgICAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBQYXRjaFBhbmVsICZtUGF0Y2hQYW5lbDsKKyAgICAgICAgY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbVBhdGNoSGFuZGxlOworICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBtUGxheWJhY2tUaHJlYWRIYW5kbGU7CisgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IG1SZWNvcmRUaHJlYWRIYW5kbGU7CisgICAgfTsKIAotICAgIGV4cGxpY2l0IFBhdGNoUGFuZWwoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyKTsKLSAgICB2aXJ0dWFsIH5QYXRjaFBhbmVsKCk7CisgICAgZXhwbGljaXQgUGF0Y2hQYW5lbChBdWRpb0ZsaW5nZXIqIGF1ZGlvRmxpbmdlcikgOiBtQXVkaW9GbGluZ2VyKCphdWRpb0ZsaW5nZXIpIHt9CiAKICAgICAvKiBMaXN0IGNvbm5lY3RlZCBhdWRpbyBwb3J0cyBhbmQgdGhlaXIgYXR0cmlidXRlcyAqLwogICAgIHN0YXR1c190IGxpc3RBdWRpb1BvcnRzKHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLApAQCAtNDUsNDYgKzY1LDE1NyBAQAogICAgIHN0YXR1c190IGxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzKTsKIAotICAgIC8qIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24gKi8KLSAgICBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworICAgIC8vIFJldHJpZXZlcyBhbGwgY3VycmVudGx5IGVzdHJhYmxpc2hlZCBzb2Z0d2FyZSBwYXRjaGVzIGZvciBhIHN0cmVhbQorICAgIC8vIG9wZW5lZCBvbiBhbiBpbnRlcm1lZGlhdGUgbW9kdWxlLgorICAgIHN0YXR1c190IGdldERvd25zdHJlYW1Tb2Z0d2FyZVBhdGNoZXMoYXVkaW9faW9faGFuZGxlX3Qgc3RyZWFtLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U29mdHdhcmVQYXRjaD4gKnBhdGNoZXMpIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgY3JlYXRlUGF0Y2hDb25uZWN0aW9ucyhQYXRjaCAqcGF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKmF1ZGlvUGF0Y2gpOwotICAgIHZvaWQgY2xlYXJQYXRjaENvbm5lY3Rpb25zKFBhdGNoICpwYXRjaCk7CisgICAgLy8gTm90aWZpZXMgcGF0Y2ggcGFuZWwgYWJvdXQgYWxsIG9wZW5lZCBhbmQgY2xvc2VkIHN0cmVhbXMuCisgICAgdm9pZCBub3RpZnlTdHJlYW1PcGVuZWQoQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSwgYXVkaW9faW9faGFuZGxlX3Qgc3RyZWFtKTsKKyAgICB2b2lkIG5vdGlmeVN0cmVhbUNsb3NlZChhdWRpb19pb19oYW5kbGVfdCBzdHJlYW0pOworCisgICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVGhyZWFkVHlwZSwgdHlwZW5hbWUgVHJhY2tUeXBlPgorICAgIGNsYXNzIEVuZHBvaW50IHsKKyAgICBwdWJsaWM6CisgICAgICAgIEVuZHBvaW50KCkgPSBkZWZhdWx0OworICAgICAgICBFbmRwb2ludChjb25zdCBFbmRwb2ludCYpID0gZGVsZXRlOworICAgICAgICBFbmRwb2ludCYgb3BlcmF0b3I9KGNvbnN0IEVuZHBvaW50JikgPSBkZWxldGU7CisgICAgICAgIEVuZHBvaW50KEVuZHBvaW50JiYgb3RoZXIpIG5vZXhjZXB0IHsgc3dhcChvdGhlcik7IH0KKyAgICAgICAgRW5kcG9pbnQmIG9wZXJhdG9yPShFbmRwb2ludCYmIG90aGVyKSBub2V4Y2VwdCB7CisgICAgICAgICAgICBzd2FwKG90aGVyKTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgICAgICB+RW5kcG9pbnQoKSB7CisgICAgICAgICAgICBBTE9HRV9JRihtSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAiQSBub24gZW1wdHkgUGF0Y2ggRW5kcG9pbnQgbGVha2VkLCBoYW5kbGUgJWQiLCBtSGFuZGxlKTsKKyAgICAgICAgfQorCisgICAgICAgIHN0YXR1c190IGNoZWNrVHJhY2soVHJhY2tUeXBlICp0cmFja09yTnVsbCkgY29uc3QgeworICAgICAgICAgICAgaWYgKHRyYWNrT3JOdWxsID09IG51bGxwdHIpIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICByZXR1cm4gdHJhY2tPck51bGwtPmluaXRDaGVjaygpOworICAgICAgICB9CisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1IYW5kbGU7IH0KKyAgICAgICAgc3A8VGhyZWFkVHlwZT4gdGhyZWFkKCkgeyByZXR1cm4gbVRocmVhZDsgfQorICAgICAgICBzcDxUcmFja1R5cGU+IHRyYWNrKCkgeyByZXR1cm4gbVRyYWNrOyB9CisgICAgICAgIHNwPGNvbnN0IFRocmVhZFR5cGU+IGNvbnN0X3RocmVhZCgpIGNvbnN0IHsgcmV0dXJuIG1UaHJlYWQ7IH0KKyAgICAgICAgc3A8Y29uc3QgVHJhY2tUeXBlPiBjb25zdF90cmFjaygpIGNvbnN0IHsgcmV0dXJuIG1UcmFjazsgfQorCisgICAgICAgIHZvaWQgY2xvc2VDb25uZWN0aW9ucyhQYXRjaFBhbmVsICpwYW5lbCkgeworICAgICAgICAgICAgaWYgKG1IYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBwYW5lbC0+cmVsZWFzZUF1ZGlvUGF0Y2gobUhhbmRsZSk7CisgICAgICAgICAgICAgICAgbUhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1UaHJlYWQgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChtVHJhY2sgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtVGhyZWFkLT5kZWxldGVQYXRjaFRyYWNrKG1UcmFjayk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtQ2xvc2VUaHJlYWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFuZWwtPm1BdWRpb0ZsaW5nZXIuY2xvc2VUaHJlYWRJbnRlcm5hbF9sKG1UaHJlYWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCogaGFuZGxlUHRyKCkgeyByZXR1cm4gJm1IYW5kbGU7IH0KKyAgICAgICAgdm9pZCBzZXRUaHJlYWQoY29uc3Qgc3A8VGhyZWFkVHlwZT4mIHRocmVhZCwgYm9vbCBjbG9zZVRocmVhZCA9IHRydWUpIHsKKyAgICAgICAgICAgIG1UaHJlYWQgPSB0aHJlYWQ7CisgICAgICAgICAgICBtQ2xvc2VUaHJlYWQgPSBjbG9zZVRocmVhZDsKKyAgICAgICAgfQorICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICAgICAgdm9pZCBzZXRUcmFja0FuZFBlZXIoY29uc3Qgc3A8VHJhY2tUeXBlPiYgdHJhY2ssIGNvbnN0IHNwPFQ+ICZwZWVyKSB7CisgICAgICAgICAgICBtVHJhY2sgPSB0cmFjazsKKyAgICAgICAgICAgIG1UaHJlYWQtPmFkZFBhdGNoVHJhY2sobVRyYWNrKTsKKyAgICAgICAgICAgIG1UcmFjay0+c2V0UGVlclByb3h5KHBlZXIsIHRydWUgLyogaG9sZFJlZmVyZW5jZSAqLyk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBjbGVhclRyYWNrUGVlcigpIHsgaWYgKG1UcmFjaykgbVRyYWNrLT5jbGVhclBlZXJQcm94eSgpOyB9CisgICAgICAgIHZvaWQgc3RvcFRyYWNrKCkgeyBpZiAobVRyYWNrKSBtVHJhY2stPnN0b3AoKTsgfQorCisgICAgICAgIHZvaWQgc3dhcChFbmRwb2ludCAmb3RoZXIpIG5vZXhjZXB0IHsKKyAgICAgICAgICAgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgICAgICAgICAgIHN3YXAobVRocmVhZCwgb3RoZXIubVRocmVhZCk7CisgICAgICAgICAgICBzd2FwKG1DbG9zZVRocmVhZCwgb3RoZXIubUNsb3NlVGhyZWFkKTsKKyAgICAgICAgICAgIHN3YXAobUhhbmRsZSwgb3RoZXIubUhhbmRsZSk7CisgICAgICAgICAgICBzd2FwKG1UcmFjaywgb3RoZXIubVRyYWNrKTsKKyAgICAgICAgfQorCisgICAgICAgIGZyaWVuZCB2b2lkIHN3YXAoRW5kcG9pbnQgJmEsIEVuZHBvaW50ICZiKSBub2V4Y2VwdCB7CisgICAgICAgICAgICBhLnN3YXAoYik7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHNwPFRocmVhZFR5cGU+IG1UaHJlYWQ7CisgICAgICAgIGJvb2wgbUNsb3NlVGhyZWFkID0gdHJ1ZTsKKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbUhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICBzcDxUcmFja1R5cGU+IG1UcmFjazsKKyAgICB9OwogCiAgICAgY2xhc3MgUGF0Y2ggewogICAgIHB1YmxpYzoKLSAgICAgICAgZXhwbGljaXQgUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCkgOgotICAgICAgICAgICAgbUF1ZGlvUGF0Y2goKnBhdGNoKSwgbUhhbmRsZShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSksCi0gICAgICAgICAgICBtSGFsSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSwgbVJlY29yZFBhdGNoSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSwKLSAgICAgICAgICAgIG1QbGF5YmFja1BhdGNoSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7fQotICAgICAgICB+UGF0Y2goKSB7fQorICAgICAgICBleHBsaWNpdCBQYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggJnBhdGNoKSA6IG1BdWRpb1BhdGNoKHBhdGNoKSB7fQorICAgICAgICB+UGF0Y2goKTsKKyAgICAgICAgUGF0Y2goY29uc3QgUGF0Y2gmKSA9IGRlbGV0ZTsKKyAgICAgICAgUGF0Y2goUGF0Y2gmJikgPSBkZWZhdWx0OworICAgICAgICBQYXRjaCYgb3BlcmF0b3I9KGNvbnN0IFBhdGNoJikgPSBkZWxldGU7CisgICAgICAgIFBhdGNoJiBvcGVyYXRvcj0oUGF0Y2gmJikgPSBkZWZhdWx0OwogCisgICAgICAgIHN0YXR1c190IGNyZWF0ZUNvbm5lY3Rpb25zKFBhdGNoUGFuZWwgKnBhbmVsKTsKKyAgICAgICAgdm9pZCBjbGVhckNvbm5lY3Rpb25zKFBhdGNoUGFuZWwgKnBhbmVsKTsKKyAgICAgICAgYm9vbCBpc1NvZnR3YXJlKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1SZWNvcmQuaGFuZGxlKCkgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUgfHwKKyAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrLmhhbmRsZSgpICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOyB9CisKKyAgICAgICAgLy8gcmV0dXJucyB0aGUgbGF0ZW5jeSBvZiB0aGUgcGF0Y2ggKGZyb20gcmVjb3JkIHRvIHBsYXliYWNrKS4KKyAgICAgICAgc3RhdHVzX3QgZ2V0TGF0ZW5jeU1zKGRvdWJsZSAqbGF0ZW5jeU1zKSBjb25zdDsKKworICAgICAgICBTdHJpbmc4IGR1bXAoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbXlIYW5kbGUpIGNvbnN0OworCisgICAgICAgIC8vIE5vdGUgdGhhdCBhdWRpb19wYXRjaDo6aWQgaXMgb25seSB1bmlxdWUgd2l0aGluIGEgSEFMIG1vZHVsZQogICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggICAgICAgICAgICAgIG1BdWRpb1BhdGNoOwotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAgICAgICAgICAgIG1IYW5kbGU7CiAgICAgICAgIC8vIGhhbmRsZSBmb3IgYXVkaW8gSEFMIHBhdGNoIGhhbmRsZSBwcmVzZW50IG9ubHkgd2hlbiB0aGUgYXVkaW8gSEFMIHZlcnNpb24gaXMgPj0gMy4wCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICAgICAgICAgICAgbUhhbEhhbmRsZTsKKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgICAgICAgICAgICBtSGFsSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAgICAgICAgIC8vIGJlbG93IG1lbWJlcnMgYXJlIHVzZWQgYnkgYSBzb2Z0d2FyZSBhdWRpbyBwYXRjaCBjb25uZWN0aW5nIGEgc291cmNlIGRldmljZSBmcm9tIGEKICAgICAgICAgLy8gZ2l2ZW4gYXVkaW8gSFcgbW9kdWxlIHRvIGEgc2luayBkZXZpY2Ugb24gYW4gb3RoZXIgYXVkaW8gSFcgbW9kdWxlLgotICAgICAgICAvLyBwbGF5YmFjayB0aHJlYWQgY3JlYXRlZCBieSBjcmVhdGVBdWRpb1BhdGNoKCkgYW5kIHJlbGVhc2VkIGJ5IGNsZWFyUGF0Y2hDb25uZWN0aW9ucygpIGlmCi0gICAgICAgIC8vIG5vIGV4aXN0aW5nIHBsYXliYWNrIHRocmVhZCBjYW4gYmUgdXNlZCBieSB0aGUgc29mdHdhcmUgcGF0Y2gKLSAgICAgICAgc3A8UGxheWJhY2tUaHJlYWQ+ICAgICAgICAgICAgICBtUGxheWJhY2tUaHJlYWQ7Ci0gICAgICAgIC8vIGF1ZGlvIHRyYWNrIGNyZWF0ZWQgYnkgY3JlYXRlUGF0Y2hDb25uZWN0aW9ucygpIGFuZCByZWxlYXNlZCBieSBjbGVhclBhdGNoQ29ubmVjdGlvbnMoKQotICAgICAgICBzcDxQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjaz4gIG1QYXRjaFRyYWNrOwotICAgICAgICAvLyByZWNvcmQgdGhyZWFkIGNyZWF0ZWQgYnkgY3JlYXRlQXVkaW9QYXRjaCgpIGFuZCByZWxlYXNlZCBieSBjbGVhclBhdGNoQ29ubmVjdGlvbnMoKQotICAgICAgICBzcDxSZWNvcmRUaHJlYWQ+ICAgICAgICAgICAgICAgIG1SZWNvcmRUaHJlYWQ7Ci0gICAgICAgIC8vIGF1ZGlvIHJlY29yZCBjcmVhdGVkIGJ5IGNyZWF0ZVBhdGNoQ29ubmVjdGlvbnMoKSBhbmQgcmVsZWFzZWQgYnkgY2xlYXJQYXRjaENvbm5lY3Rpb25zKCkKLSAgICAgICAgc3A8UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZD4gICBtUGF0Y2hSZWNvcmQ7Ci0gICAgICAgIC8vIGhhbmRsZSBmb3IgYXVkaW8gcGF0Y2ggY29ubmVjdGluZyBzb3VyY2UgZGV2aWNlIHRvIHJlY29yZCB0aHJlYWQgaW5wdXQuCi0gICAgICAgIC8vIGNyZWF0ZWQgYnkgY3JlYXRlUGF0Y2hDb25uZWN0aW9ucygpIGFuZCByZWxlYXNlZCBieSBjbGVhclBhdGNoQ29ubmVjdGlvbnMoKQotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAgICAgICAgICAgIG1SZWNvcmRQYXRjaEhhbmRsZTsKLSAgICAgICAgLy8gaGFuZGxlIGZvciBhdWRpbyBwYXRjaCBjb25uZWN0aW5nIHBsYXliYWNrIHRocmVhZCBvdXRwdXQgdG8gc2luayBkZXZpY2UKLSAgICAgICAgLy8gY3JlYXRlZCBieSBjcmVhdGVQYXRjaENvbm5lY3Rpb25zKCkgYW5kIHJlbGVhc2VkIGJ5IGNsZWFyUGF0Y2hDb25uZWN0aW9ucygpCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICAgICAgICAgICAgbVBsYXliYWNrUGF0Y2hIYW5kbGU7Ci0KKyAgICAgICAgLy8gdGhlIG9iamVjdHMgYXJlIGNyZWF0ZWQgYnkgY3JlYXRlQ29ubmVjdGlvbnMoKSBhbmQgcmVsZWFzZWQgYnkgY2xlYXJDb25uZWN0aW9ucygpCisgICAgICAgIC8vIHBsYXliYWNrIHRocmVhZCBpcyBjcmVhdGVkIGlmIG5vIGV4aXN0aW5nIHBsYXliYWNrIHRocmVhZCBjYW4gYmUgdXNlZAorICAgICAgICAvLyBjb25uZWN0cyBwbGF5YmFjayB0aHJlYWQgb3V0cHV0IHRvIHNpbmsgZGV2aWNlCisgICAgICAgIEVuZHBvaW50PFBsYXliYWNrVGhyZWFkLCBQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjaz4gbVBsYXliYWNrOworICAgICAgICAvLyBjb25uZWN0cyBzb3VyY2UgZGV2aWNlIHRvIHJlY29yZCB0aHJlYWQgaW5wdXQKKyAgICAgICAgRW5kcG9pbnQ8UmVjb3JkVGhyZWFkLCBSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkPiBtUmVjb3JkOwogICAgIH07CiAKLXByaXZhdGU6Ci0gICAgY29uc3Qgd3A8QXVkaW9GbGluZ2VyPiAgICAgIG1BdWRpb0ZsaW5nZXI7Ci0gICAgU29ydGVkVmVjdG9yIDxQYXRjaCAqPiAgICAgIG1QYXRjaGVzOworICAgIEF1ZGlvSHdEZXZpY2UqIGZpbmRBdWRpb0h3RGV2aWNlQnlNb2R1bGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSk7CisgICAgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBmaW5kSHdEZXZpY2VCeU1vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlKTsKKyAgICB2b2lkIGFkZFNvZnR3YXJlUGF0Y2hUb0luc2VydGVkTW9kdWxlcygKKyAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CisgICAgdm9pZCByZW1vdmVTb2Z0d2FyZVBhdGNoRnJvbUluc2VydGVkTW9kdWxlcyhhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworCisgICAgQXVkaW9GbGluZ2VyICZtQXVkaW9GbGluZ2VyOworICAgIHN0ZDo6bWFwPGF1ZGlvX3BhdGNoX2hhbmRsZV90LCBQYXRjaD4gbVBhdGNoZXM7CisKKyAgICAvLyBUaGlzIG1hcCBhbGxvd3MgZ29pbmcgZnJvbSBhIHRocmVhZCB0byAiZG93bnN0cmVhbSIgc29mdHdhcmUgcGF0Y2hlcworICAgIC8vIHdoZW4gYSBwcm9jZXNzaW5nIG1vZHVsZSBpbnNlcnRlZCBpbiBiZXR3ZWVuLiBFeGFtcGxlOgorICAgIC8vCisgICAgLy8gIGZyb20gbWFwIHZhbHVlLnN0cmVhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwIGtleQorICAgIC8vICBbTWl4ZXIgdGhyZWFkXSAtLT4gW1ZpcnR1YWwgb3V0cHV0IGRldmljZV0gLS0+IFtQcm9jZXNzaW5nIG1vZHVsZV0gLS0tXAorICAgIC8vICAgICAgIFtIYXJ3YXJlIG1vZHVsZV0gPC0tIFtQaHlzaWNhbCBvdXRwdXQgZGV2aWNlXSA8LS0gW1MvVyBQYXRjaF0gPC0tLworICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gbWFwIHZhbHVlLnN3X3BhdGNoZXMKKyAgICAvLworICAgIC8vIFRoaXMgYWxsb3dzIHRoZSBtaXhlciB0aHJlYWQgdG8gbG9vayB1cCB0aGUgdGhyZWFkcyBvZiB0aGUgc29mdHdhcmUgcGF0Y2gKKyAgICAvLyBmb3IgcHJvcGFnYXRpbmcgdGltaW5nIGluZm8sIHBhcmFtZXRlcnMsIGV0Yy4KKyAgICAvLworICAgIC8vIFRoZSBjdXJyZW50IGFzc3VtcHRpb25zIGFyZToKKyAgICAvLyAgIDEpIFRoZSBwcm9jZXNzaW5nIG1vZHVsZSBhY3RzIGFzIGEgbWl4ZXIgd2l0aCBzZXZlcmFsIG91dHB1dHMgd2hpY2gKKyAgICAvLyAgICAgIHJlcHJlc2VudCBkaWZmZXJlbnRseSBkb3dubWl4ZWQgYW5kIC8gb3IgZW5jb2RlZCB2ZXJzaW9ucyBvZiB0aGUgc2FtZQorICAgIC8vICAgICAgbWl4ZWQgc3RyZWFtLiBUaGVyZSBpcyBubyAxOjEgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiB0aGUgaW5wdXQgc3RyZWFtcworICAgIC8vICAgICAgYW5kIHRoZSBzb2Z0d2FyZSBwYXRjaGVzLCBidXQgcmF0aGVyIGEgTjpOIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4KKyAgICAvLyAgICAgIGEgZ3JvdXAgb2Ygc3RyZWFtcyBhbmQgYSBncm91cCBvZiBwYXRjaGVzLgorICAgIC8vICAgMikgVGhlcmUgYXJlIG9ubHkgYSBjb3VwbGUgb2YgaW5zZXJ0ZWQgcHJvY2Vzc2luZyBtb2R1bGVzIGluIHRoZSBzeXN0ZW0sCisgICAgLy8gICAgICBzbyB3aGVuIGxvb2tpbmcgZm9yIGEgc3RyZWFtIG9yIHBhdGNoIGhhbmRsZSB3ZSBjYW4gaXRlcmF0ZSBvdmVyCisgICAgLy8gICAgICBhbGwgbW9kdWxlcy4KKyAgICBzdHJ1Y3QgTW9kdWxlQ29ubmVjdGlvbnMgeworICAgICAgICBzdGQ6OnNldDxhdWRpb19pb19oYW5kbGVfdD4gc3RyZWFtczsKKyAgICAgICAgc3RkOjpzZXQ8YXVkaW9fcGF0Y2hfaGFuZGxlX3Q+IHN3X3BhdGNoZXM7CisgICAgfTsKKyAgICBzdGQ6Om1hcDxhdWRpb19tb2R1bGVfaGFuZGxlX3QsIE1vZHVsZUNvbm5lY3Rpb25zPiBtSW5zZXJ0ZWRNb2R1bGVzOwogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmgKaW5kZXggYTc4YmU5OS4uYTA5Mzg5MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BsYXliYWNrVHJhY2tzLmgKQEAgLTE5LDYgKzE5LDQyIEBACiAgICAgI2Vycm9yIFRoaXMgaGVhZGVyIGZpbGUgc2hvdWxkIG9ubHkgYmUgaW5jbHVkZWQgZnJvbSBBdWRpb0ZsaW5nZXIuaAogI2VuZGlmCiAKKy8vIENoZWNrcyBhbmQgbW9uaXRvcnMgT1BfUExBWV9BVURJTworY2xhc3MgT3BQbGF5QXVkaW9Nb25pdG9yIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorICAgIH5PcFBsYXlBdWRpb01vbml0b3IoKSBvdmVycmlkZTsKKyAgICBib29sIGhhc09wUGxheUF1ZGlvKCkgY29uc3Q7CisKKyAgICBzdGF0aWMgc3A8T3BQbGF5QXVkaW9Nb25pdG9yPiBjcmVhdGVJZk5lZWRlZCgKKyAgICAgICAgICAgIHVpZF90IHVpZCwgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyLCBpbnQgaWQsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSk7CisKK3ByaXZhdGU6CisgICAgT3BQbGF5QXVkaW9Nb25pdG9yKHVpZF90IHVpZCwgYXVkaW9fdXNhZ2VfdCB1c2FnZSwgaW50IGlkKTsKKyAgICB2b2lkIG9uRmlyc3RSZWYoKSBvdmVycmlkZTsKKyAgICBzdGF0aWMgdm9pZCBnZXRQYWNrYWdlc0ZvclVpZCh1aWRfdCB1aWQsIFZlY3RvcjxTdHJpbmcxNj4mIHBhY2thZ2VzKTsKKworICAgIEFwcE9wc01hbmFnZXIgbUFwcE9wc01hbmFnZXI7CisKKyAgICBjbGFzcyBQbGF5QXVkaW9PcENhbGxiYWNrIDogcHVibGljIEJuQXBwT3BzQ2FsbGJhY2sgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgUGxheUF1ZGlvT3BDYWxsYmFjayhjb25zdCB3cDxPcFBsYXlBdWRpb01vbml0b3I+JiBtb25pdG9yKTsKKyAgICAgICAgdm9pZCBvcENoYW5nZWQoaW50MzJfdCBvcCwgY29uc3QgU3RyaW5nMTYmIHBhY2thZ2VOYW1lKSBvdmVycmlkZTsKKworICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IHdwPE9wUGxheUF1ZGlvTW9uaXRvcj4gbU1vbml0b3I7CisgICAgfTsKKworICAgIHNwPFBsYXlBdWRpb09wQ2FsbGJhY2s+IG1PcENhbGxiYWNrOworICAgIC8vIGNhbGxlZCBieSBQbGF5QXVkaW9PcENhbGxiYWNrIHdoZW4gT1BfUExBWV9BVURJTyBpcyB1cGRhdGVkIGluIEFwcE9wIGNhbGxiYWNrCisgICAgdm9pZCBjaGVja1BsYXlBdWRpb0ZvclVzYWdlKCk7CisKKyAgICBzdGQ6OmF0b21pY19ib29sIG1IYXNPcFBsYXlBdWRpbzsKKyAgICBWZWN0b3I8U3RyaW5nMTY+IG1QYWNrYWdlczsKKyAgICBjb25zdCB1aWRfdCBtVWlkOworICAgIGNvbnN0IGludDMyX3QgbVVzYWdlOyAvLyBvbiBwdXJwb3NlIG5vdCBhdWRpb191c2FnZV90IGJlY2F1c2UgYWx3YXlzIGNoZWNrZWQgaW4gYXBwT3BzIGFzIGludDMyX3QKKyAgICBjb25zdCBpbnQgbUlkOyAvLyBmb3IgbG9nZ2luZyBwdXJwb3NlcyBvbmx5Cit9OworCiAvLyBwbGF5YmFjayB0cmFjawogY2xhc3MgVHJhY2sgOiBwdWJsaWMgVHJhY2tCYXNlLCBwdWJsaWMgVm9sdW1lUHJvdmlkZXIgewogcHVibGljOgpAQCAtMzQsNiArNzAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgY3JlYXRvclBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfdHlwZSB0eXBlLApAQCAtNDEsMjIgKzc4LDE1IEBACiAgICAgdmlydHVhbCAgICAgICAgICAgICB+VHJhY2soKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGluaXRDaGVjaygpIGNvbnN0OwogCi0gICAgc3RhdGljICB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7CisgICAgICAgICAgICB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBhcHBlbmREdW1wKFN0cmluZzgmIHJlc3VsdCwgYm9vbCBhY3RpdmUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6U1lOQ19FVkVOVF9OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24gPSBBVURJT19TRVNTSU9OX05PTkUpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCA9IEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24gPSBBVURJT19TRVNTSU9OX05PTkUpOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgc3RvcCgpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgcGF1c2UoKTsKIAogICAgICAgICAgICAgdm9pZCAgICAgICAgZmx1c2goKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIGRlc3Ryb3koKTsKLSAgICAgICAgICAgIGludCAgICAgICAgIG5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQotICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0TmFtZShpbnQgbmFtZSkgewotICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobU5hbWUgPj0gMCAmJiBuYW1lID49IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAiJXMgYm90aCBvbGQgbmFtZSAlZCBhbmQgbmV3IG5hbWUgJWQgYXJlIHZhbGlkIiwgX19mdW5jX18sIG1OYW1lLCBuYW1lKTsKLSAgICAgICAgICAgICAgICBtTmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICB9CiAKICAgICB2aXJ0dWFsIHVpbnQzMl90ICAgIHNhbXBsZVJhdGUoKSBjb25zdDsKIApAQCAtNjUsMTIgKzk1LDE1IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBib29sICAgICAgICBpc09mZmxvYWRlZCgpIGNvbnN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSAhPSAwOyB9Ci0gICAgICAgICAgICBib29sICAgICAgICBpc0RpcmVjdCgpIGNvbnN0IHsgcmV0dXJuIChtRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICE9IDA7IH0KKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzRGlyZWN0KCkgY29uc3Qgb3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgIT0gMDsgfQogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNPZmZsb2FkZWRPckRpcmVjdCgpIGNvbnN0IHsgcmV0dXJuIChtRmxhZ3MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIChBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkpICE9IDA7IH0KKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzU3RhdGljKCkgY29uc3QgeyByZXR1cm4gIG1TaGFyZWRCdWZmZXIuZ2V0KCkgIT0gbnVsbHB0cjsgfQogCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOworICAgICAgICAgICAgc3RhdHVzX3QgICAgc2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCk7CiAgICAgICAgICAgICBzdGF0dXNfdCAgICBhdHRhY2hBdXhFZmZlY3QoaW50IEVmZmVjdElkKTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIHNldEF1eEJ1ZmZlcihpbnQgRWZmZWN0SWQsIGludDMyX3QgKmJ1ZmZlcik7CiAgICAgICAgICAgICBpbnQzMl90ICAgICAqYXV4QnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbUF1eEJ1ZmZlcjsgfQpAQCAtODcsNiArMTIwLDEwIEBACiAKICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzRmFzdFRyYWNrKCkgY29uc3QgeyByZXR1cm4gKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpICE9IDA7IH0KIAorICAgICAgICAgICAgZG91YmxlICAgICAgYnVmZmVyTGF0ZW5jeU1zKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpc1N0YXRpYygpID8gMC4gOiBUcmFja0Jhc2U6OmJ1ZmZlckxhdGVuY3lNcygpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCiAvLyBpbXBsZW1lbnQgdm9sdW1lIGhhbmRsaW5nLgogICAgIG1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXR1cyBhcHBseVZvbHVtZVNoYXBlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCkBAIC0xMTEsNiArMTQ4LDI2IEBACiAgICAgLyoqIENvcHkgdGhlIHRyYWNrIG1ldGFkYXRhIGluIHRoZSBwcm92aWRlZCBpdGVyYXRvci4gVGhyZWFkIHNhZmUuICovCiAgICAgdmlydHVhbCB2b2lkICAgIGNvcHlNZXRhZGF0YVRvKE1ldGFkYXRhSW5zZXJ0ZXImIGJhY2tJbnNlcnRlcikgY29uc3Q7CiAKKyAgICAgICAgICAgIC8qKiBSZXR1cm4gaGFwdGljIHBsYXliYWNrIG9mIHRoZSB0cmFjayBpcyBlbmFibGVkIG9yIG5vdCwgdXNlZCBpbiBtaXhlci4gKi8KKyAgICAgICAgICAgIGJvb2wgICAgZ2V0SGFwdGljUGxheWJhY2tFbmFibGVkKCkgY29uc3QgeyByZXR1cm4gbUhhcHRpY1BsYXliYWNrRW5hYmxlZDsgfQorICAgICAgICAgICAgLyoqIFNldCBoYXB0aWMgcGxheWJhY2sgb2YgdGhlIHRyYWNrIGlzIGVuYWJsZWQgb3Igbm90LCBzaG91bGQgYmUKKyAgICAgICAgICAgICAqICBzZXQgYWZ0ZXIgcXVlcnkgb3IgZ2V0IGNhbGxiYWNrIGZyb20gdmlicmF0b3Igc2VydmljZSAqLworICAgICAgICAgICAgdm9pZCAgICBzZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoYm9vbCBoYXB0aWNQbGF5YmFja0VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBtSGFwdGljUGxheWJhY2tFbmFibGVkID0gaGFwdGljUGxheWJhY2tFbmFibGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyoqIFJldHVybiBhdCB3aGF0IGludGVuc2l0eSB0byBwbGF5IGhhcHRpY3MsIHVzZWQgaW4gbWl4ZXIuICovCisgICAgICAgICAgICBBdWRpb01peGVyOjpoYXB0aWNfaW50ZW5zaXR5X3QgZ2V0SGFwdGljSW50ZW5zaXR5KCkgY29uc3QgeyByZXR1cm4gbUhhcHRpY0ludGVuc2l0eTsgfQorICAgICAgICAgICAgLyoqIFNldCBpbnRlbnNpdHkgb2YgaGFwdGljIHBsYXliYWNrLCBzaG91bGQgYmUgc2V0IGFmdGVyIHF1ZXJ5aW5nIHZpYnJhdG9yIHNlcnZpY2UuICovCisgICAgICAgICAgICB2b2lkICAgIHNldEhhcHRpY0ludGVuc2l0eShBdWRpb01peGVyOjpoYXB0aWNfaW50ZW5zaXR5X3QgaGFwdGljSW50ZW5zaXR5KSB7CisgICAgICAgICAgICAgICAgaWYgKEF1ZGlvTWl4ZXI6OmlzVmFsaWRIYXB0aWNJbnRlbnNpdHkoaGFwdGljSW50ZW5zaXR5KSkgeworICAgICAgICAgICAgICAgICAgICBtSGFwdGljSW50ZW5zaXR5ID0gaGFwdGljSW50ZW5zaXR5OworICAgICAgICAgICAgICAgICAgICBzZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQobUhhcHRpY0ludGVuc2l0eSAhPSBBdWRpb01peGVyOjpIQVBUSUNfU0NBTEVfTVVURSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8b3M6OkV4dGVybmFsVmlicmF0aW9uPiBnZXRFeHRlcm5hbFZpYnJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIG1FeHRlcm5hbFZpYnJhdGlvbjsgfQorCisgICAgICAgICAgICB2b2lkICAgIHNldFRlZVBhdGNoZXMoVGVlUGF0Y2hlcyB0ZWVQYXRjaGVzKTsKKwogcHJvdGVjdGVkOgogICAgIC8vIGZvciBudW1lcm91cwogICAgIGZyaWVuZCBjbGFzcyBQbGF5YmFja1RocmVhZDsKQEAgLTEyMSw4ICsxNzgsOCBAQAogICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihUcmFjayk7CiAKICAgICAvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcik7Ci0gICAgLy8gcmVsZWFzZUJ1ZmZlcigpIG5vdCBvdmVycmlkZGVuCisgICAgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikgb3ZlcnJpZGU7CisgICAgdm9pZCByZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKSBvdmVycmlkZTsKIAogICAgIC8vIEV4dGVuZGVkQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKICAgICB2aXJ0dWFsIHNpemVfdCBmcmFtZXNSZWFkeSgpIGNvbnN0OwpAQCAtMTQwLDcgKzE5Nyw3IEBACiAgICAgYm9vbCBpc1Jlc3VtZVBlbmRpbmcoKTsKICAgICB2b2lkIHJlc3VtZUFjaygpOwogICAgIHZvaWQgdXBkYXRlVHJhY2tGcmFtZUluZm8oaW50NjRfdCB0cmFja0ZyYW1lc1JlbGVhc2VkLCBpbnQ2NF90IHNpbmtGcmFtZXNXcml0dGVuLAotICAgICAgICAgICAgY29uc3QgRXh0ZW5kZWRUaW1lc3RhbXAgJnRpbWVTdGFtcCk7CisgICAgICAgICAgICB1aW50MzJfdCBoYWxTYW1wbGVSYXRlLCBjb25zdCBFeHRlbmRlZFRpbWVzdGFtcCAmdGltZVN0YW1wKTsKIAogICAgIHNwPElNZW1vcnk+IHNoYXJlZEJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1TaGFyZWRCdWZmZXI7IH0KIApAQCAtMTU5LDYgKzIxNiwxMCBAQAogCiAgICAgaW50IGZhc3RJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1GYXN0SW5kZXg7IH0KIAorICAgIGJvb2wgaXNQbGF5YmFja1Jlc3RyaWN0ZWQoKSBjb25zdCB7CisgICAgICAgIC8vIFRoZSBtb25pdG9yIGlzIG9ubHkgY3JlYXRlZCBmb3IgdHJhY2tzIHRoYXQgY2FuIGJlIHNpbGVuY2VkLgorICAgICAgICByZXR1cm4gbU9wUGxheUF1ZGlvTW9uaXRvciA/ICFtT3BQbGF5QXVkaW9Nb25pdG9yLT5oYXNPcFBsYXlBdWRpbygpIDogZmFsc2U7IH0KKwogcHJvdGVjdGVkOgogCiAgICAgLy8gRklMTEVEIHN0YXRlIGlzIHVzZWQgZm9yIHN1cHByZXNzaW5nIHZvbHVtZSByYW1wIGF0IGJlZ2luIG9mIHBsYXlpbmcKQEAgLTE3MSw3ICsyMzIsNiBAQAogCiAgICAgYm9vbCAgICAgICAgICAgICAgICBtUmVzZXREb25lOwogICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbVR5cGU7Ci0gICAgaW50ICAgICAgICAgICAgICAgICBtTmFtZTsKICAgICBlZmZlY3RfYnVmZmVyX3QgICAgICptTWFpbkJ1ZmZlcjsKIAogICAgIGludDMyX3QgICAgICAgICAgICAgKm1BdXhCdWZmZXI7CkBAIC0xODgsNyArMjQ4LDMxIEBACiAKICAgICBzcDxtZWRpYTo6Vm9sdW1lSGFuZGxlcj4gIG1Wb2x1bWVIYW5kbGVyOyAvLyBoYW5kbGVzIG11bHRpcGxlIFZvbHVtZVNoYXBlciBjb25maWdzIGFuZCBvcGVyYXRpb25zCiAKKyAgICBzcDxPcFBsYXlBdWRpb01vbml0b3I+ICBtT3BQbGF5QXVkaW9Nb25pdG9yOworCisgICAgYm9vbCAgICAgICAgICAgICAgICBtSGFwdGljUGxheWJhY2tFbmFibGVkID0gZmFsc2U7IC8vIGluZGljYXRlcyBoYXB0aWMgcGxheWJhY2sgZW5hYmxlZCBvciBub3QKKyAgICAvLyBpbnRlbnNpdHkgdG8gcGxheSBoYXB0aWMgZGF0YQorICAgIEF1ZGlvTWl4ZXI6OmhhcHRpY19pbnRlbnNpdHlfdCBtSGFwdGljSW50ZW5zaXR5ID0gQXVkaW9NaXhlcjo6SEFQVElDX1NDQUxFX01VVEU7CisgICAgY2xhc3MgQXVkaW9WaWJyYXRpb25Db250cm9sbGVyIDogcHVibGljIG9zOjpCbkV4dGVybmFsVmlicmF0aW9uQ29udHJvbGxlciB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBBdWRpb1ZpYnJhdGlvbkNvbnRyb2xsZXIoVHJhY2sqIHRyYWNrKSA6IG1UcmFjayh0cmFjaykge30KKyAgICAgICAgYmluZGVyOjpTdGF0dXMgbXV0ZSgvKm91dCovIGJvb2wgKnJldCkgb3ZlcnJpZGU7CisgICAgICAgIGJpbmRlcjo6U3RhdHVzIHVubXV0ZSgvKm91dCovIGJvb2wgKnJldCkgb3ZlcnJpZGU7CisgICAgcHJpdmF0ZToKKyAgICAgICAgVHJhY2sqIGNvbnN0IG1UcmFjazsKKyAgICB9OworICAgIHNwPEF1ZGlvVmlicmF0aW9uQ29udHJvbGxlcj4gbUF1ZGlvVmlicmF0aW9uQ29udHJvbGxlcjsKKyAgICBzcDxvczo6RXh0ZXJuYWxWaWJyYXRpb24+ICAgIG1FeHRlcm5hbFZpYnJhdGlvbjsKKwogcHJpdmF0ZToKKyAgICB2b2lkICAgICAgICAgICAgICAgIGludGVyY2VwdEJ1ZmZlcihjb25zdCBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXImIGJ1ZmZlcik7CisgICAgLyoqIFdyaXRlIHRoZSBzb3VyY2UgZGF0YSBpbiB0aGUgYnVmZmVyIHByb3ZpZGVyLiBAcmV0dXJuIHdyaXR0ZW4gZnJhbWUgY291bnQuICovCisgICAgc2l6ZV90ICAgICAgICAgICAgICB3cml0ZUZyYW1lcyhBdWRpb0J1ZmZlclByb3ZpZGVyKiBkZXN0LCBjb25zdCB2b2lkKiBzcmMsIHNpemVfdCBmcmFtZUNvdW50KTsKKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgRj4KKyAgICB2b2lkICAgICAgICAgICAgICAgIGZvckVhY2hUZWVQYXRjaFRyYWNrKEYgZikgeworICAgICAgICBmb3IgKGF1dG8mIHRwIDogbVRlZVBhdGNoZXMpIHsgZih0cC5wYXRjaFRyYWNrKTsgfQorICAgIH07CisKICAgICAvLyBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgb25seSBmb3IgZmFzdCB0cmFja3MsIGFuZCBzaG91bGQgYmUgaW4gYSBzdWJjbGFzcwogICAgIGludCAgICAgICAgICAgICAgICAgbUZhc3RJbmRleDsgLy8gaW5kZXggd2l0aGluIEZhc3RNaXhlclN0YXRlOjptRmFzdFRyYWNrc1tdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWl0aGVyIG1GYXN0SW5kZXggPT0gLTEgaWYgbm90IGlzRmFzdFRyYWNrKCkKQEAgLTIwOCw2ICsyOTIsNyBAQAogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG1GbGFnczsKICAgICAvLyBJZiB0aGUgbGFzdCB0cmFjayBjaGFuZ2Ugd2FzIG5vdGlmaWVkIHRvIHRoZSBjbGllbnQgd2l0aCByZWFkQW5kQ2xlYXJIYXNDaGFuZ2VkCiAgICAgc3RkOjphdG9taWNfZmxhZyAgICAgbUNoYW5nZU5vdGlmaWVkID0gQVRPTUlDX0ZMQUdfSU5JVDsKKyAgICBUZWVQYXRjaGVzICBtVGVlUGF0Y2hlczsKIH07ICAvLyBlbmQgb2YgVHJhY2sKIAogCkBAIC0yMzMsNyArMzE4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbiA9IEFVRElPX1NFU1NJT05fTk9ORSk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICBzdG9wKCk7Ci0gICAgICAgICAgICBib29sICAgICAgICB3cml0ZSh2b2lkKiBkYXRhLCB1aW50MzJfdCBmcmFtZXMpOworICAgICAgICAgICAgc3NpemVfdCAgICAgd3JpdGUodm9pZCogZGF0YSwgdWludDMyX3QgZnJhbWVzKTsKICAgICAgICAgICAgIGJvb2wgICAgICAgIGJ1ZmZlclF1ZXVlRW1wdHkoKSBjb25zdCB7IHJldHVybiBtQnVmZmVyUXVldWUuc2l6ZSgpID09IDA7IH0KICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzQWN0aXZlKCkgY29uc3QgeyByZXR1cm4gbUFjdGl2ZTsgfQogICAgIGNvbnN0IHdwPFRocmVhZEJhc2U+JiB0aHJlYWQoKSBjb25zdCB7IHJldHVybiBtVGhyZWFkOyB9CkBAIC0yNDEsNiArMzI2LDE4IEBACiAgICAgICAgICAgICB2b2lkICAgICAgICBjb3B5TWV0YWRhdGFUbyhNZXRhZGF0YUluc2VydGVyJiBiYWNrSW5zZXJ0ZXIpIGNvbnN0IG92ZXJyaWRlOwogICAgIC8qKiBTZXQgdGhlIG1ldGFkYXRhcyBvZiB0aGUgdXBzdHJlYW0gdHJhY2tzLiBUaHJlYWQgc2FmZS4gKi8KICAgICAgICAgICAgIHZvaWQgICAgICAgIHNldE1ldGFkYXRhcyhjb25zdCBTb3VyY2VNZXRhZGF0YXMmIG1ldGFkYXRhcyk7CisgICAgLyoqIHJldHVybnMgY2xpZW50IHRpbWVzdGFtcCB0byB0aGUgdXBzdHJlYW0gZHVwbGljYXRpbmcgdGhyZWFkLiAqLworICAgIEV4dGVuZGVkVGltZXN0YW1wICAgZ2V0Q2xpZW50UHJveHlUaW1lc3RhbXAoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VydmVyIC0ga2VybmVsIGRpZmZlcmVuY2UgaXMgbm90IHRydWUgbGF0ZW5jeSB3aGVuIGRyYWluZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpLmUuIG1TZXJ2ZXJQcm94eS0+aXNEcmFpbmVkKCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgdGltZXN0YW1wOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBtQ2xpZW50UHJveHktPmdldFRpbWVzdGFtcCgmdGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbiBzdWNjZXNzLCB0aGUgdGltZXN0YW1wIExPQ0FUSU9OX1NFUlZFUiBhbmQgTE9DQVRJT05fS0VSTkVMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW50cmllcyB3aWxsIGJlIHByb3Blcmx5IGZpbGxlZC4gSWYgZ2V0VGltZXN0YW1wKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyB1bnN1Y2Nlc3NmdWwsIHRoZW4gYSBkZWZhdWx0IGluaXRpYWxpemVkIHRpbWVzdGFtcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh3aXRoIG1UaW1lTnNbXSBmaWxsZWQgd2l0aCAtMSdzKSBpcyByZXR1cm5lZC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGltZXN0YW1wOworICAgICAgICAgICAgICAgICAgICAgICAgfQogCiBwcml2YXRlOgogICAgIHN0YXR1c190ICAgICAgICAgICAgb2J0YWluQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyLApAQCAtMjU3LDYgKzM1NCw3IEBACiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmU7CiAgICAgRHVwbGljYXRpbmdUaHJlYWQqIGNvbnN0ICAgIG1Tb3VyY2VUaHJlYWQ7IC8vIGZvciB3YWl0VGltZU1zKCkgaW4gd3JpdGUoKQogICAgIHNwPEF1ZGlvVHJhY2tDbGllbnRQcm94eT4gICBtQ2xpZW50UHJveHk7CisKICAgICAvKiogQXR0cmlidXRlcyBvZiB0aGUgc291cmNlIHRyYWNrcy4KICAgICAgKgogICAgICAqIFRoaXMgbWVtYmVyIG11c3QgYmUgYWNjZXNzZWQgd2l0aCBtVHJhY2tNZXRhZGF0YXNNdXRleCB0YWtlbi4KQEAgLTI3NCw3ICszNzIsNyBAQAogfTsgIC8vIGVuZCBvZiBPdXRwdXRUcmFjawogCiAvLyBwbGF5YmFjayB0cmFjaywgdXNlZCBieSBQYXRjaFBhbmVsCi1jbGFzcyBQYXRjaFRyYWNrIDogcHVibGljIFRyYWNrLCBwdWJsaWMgUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyIHsKK2NsYXNzIFBhdGNoVHJhY2sgOiBwdWJsaWMgVHJhY2ssIHB1YmxpYyBQYXRjaFRyYWNrQmFzZSB7CiBwdWJsaWM6CiAKICAgICAgICAgICAgICAgICAgICAgICAgIFBhdGNoVHJhY2soUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkLApAQCAtMjg1LDcgKzM4Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaW1lb3V0JiB0aW1lb3V0ID0ge30pOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgflBhdGNoVHJhY2soKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc3RhcnQoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCA9CkBAIC0zMDEsMTIgKzQwMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0aW1lT3V0ID0gTlVMTCk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKFByb3h5OjpCdWZmZXIqIGJ1ZmZlcik7CiAKLSAgICAgICAgICAgIHZvaWQgc2V0UGVlclByb3h5KFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciAqcHJveHkpIHsgbVBlZXJQcm94eSA9IHByb3h5OyB9Ci0KIHByaXZhdGU6CiAgICAgICAgICAgICB2b2lkIHJlc3RhcnRJZkRpc2FibGVkKCk7CiAKLSAgICBzcDxDbGllbnRQcm94eT4gICAgICAgICAgICAgbVByb3h5OwotICAgIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciogICBtUGVlclByb3h5OwotICAgIHN0cnVjdCB0aW1lc3BlYyAgICAgICAgICAgICBtUGVlclRpbWVvdXQ7CiB9OyAgLy8gZW5kIG9mIFBhdGNoVHJhY2sKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaAppbmRleCBmYzJkYmJiLi4wODY2MGRkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oCkBAIC0zMiw2ICszMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IGNyZWF0b3JQaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfdHlwZSB0eXBlLApAQCAtNTEsNyArNTIsNyBAQAogICAgICAgICAgICAgYm9vbCAgICAgICAgc2V0T3ZlcmZsb3coKSB7IGJvb2wgdG1wID0gbU92ZXJmbG93OyBtT3ZlcmZsb3cgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRtcDsgfQogCi0gICAgc3RhdGljICB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7CisgICAgICAgICAgICB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBhcHBlbmREdW1wKFN0cmluZzgmIHJlc3VsdCwgYm9vbCBhY3RpdmUpOwogCiAgICAgICAgICAgICB2b2lkICAgICAgICBoYW5kbGVTeW5jU3RhcnRFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCk7CkBAIC02MywxMiArNjQsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4dGVuZGVkVGltZXN0YW1wICZ0aW1lc3RhbXApOwogCiAgICAgdmlydHVhbCBib29sICAgICAgICBpc0Zhc3RUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtRmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0ZBU1QpICE9IDA7IH0KKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzRGlyZWN0KCkgY29uc3Qgb3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gKG1GbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRElSRUNUKSAhPSAwOyB9CiAKICAgICAgICAgICAgIHZvaWQgICAgICAgIHNldFNpbGVuY2VkKGJvb2wgc2lsZW5jZWQpIHsgaWYgKCFpc1BhdGNoVHJhY2soKSkgbVNpbGVuY2VkID0gc2lsZW5jZWQ7IH0KICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzU2lsZW5jZWQoKSBjb25zdCB7IHJldHVybiBtU2lsZW5jZWQ7IH0KIAogICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpOwogCisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKTsKKyAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKTsKKworICAgIHN0YXRpYyAgYm9vbCAgICAgICAgY2hlY2tTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAoZmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkMpID09IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKIHByaXZhdGU6CiAgICAgZnJpZW5kIGNsYXNzIEF1ZGlvRmxpbmdlcjsgIC8vIGZvciBtU3RhdGUKIApAQCAtMTAyLDcgKzExNCw3IEBACiB9OwogCiAvLyBwbGF5YmFjayB0cmFjaywgdXNlZCBieSBQYXRjaFBhbmVsCi1jbGFzcyBQYXRjaFJlY29yZCA6IHZpcnR1YWwgcHVibGljIFJlY29yZFRyYWNrLCBwdWJsaWMgUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyIHsKK2NsYXNzIFBhdGNoUmVjb3JkIDogcHVibGljIFJlY29yZFRyYWNrLCBwdWJsaWMgUGF0Y2hUcmFja0Jhc2UgewogcHVibGljOgogCiAgICAgUGF0Y2hSZWNvcmQoUmVjb3JkVGhyZWFkICpyZWNvcmRUaHJlYWQsCkBAIC0xMTIsNyArMTI0LDggQEAKICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCiAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyk7CisgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICBjb25zdCBUaW1lb3V0JiB0aW1lb3V0ID0ge30pOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgflBhdGNoUmVjb3JkKCk7CiAKICAgICAvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQpAQCAtMTIzLDExICsxMzYsNCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb2J0YWluQnVmZmVyKFByb3h5OjpCdWZmZXIgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVPdXQgPSBOVUxMKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHJlbGVhc2VCdWZmZXIoUHJveHk6OkJ1ZmZlciAqYnVmZmVyKTsKLQotICAgIHZvaWQgc2V0UGVlclByb3h5KFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciAqcHJveHkpIHsgbVBlZXJQcm94eSA9IHByb3h5OyB9Ci0KLXByaXZhdGU6Ci0gICAgc3A8Q2xpZW50UHJveHk+ICAgICAgICAgICAgIG1Qcm94eTsKLSAgICBQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIqICAgbVBlZXJQcm94eTsKLSAgICBzdHJ1Y3QgdGltZXNwZWMgICAgICAgICAgICAgbVBlZXJUaW1lb3V0OwogfTsgIC8vIGVuZCBvZiBQYXRjaFJlY29yZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTI2N2VhLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPGJpbmRlci9BcHBPcHNNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ2FjaGUuaD4KLSNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KLSNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCi0KLS8qIFdoZW4gcGVyZm9ybWluZyBwZXJtaXNzaW9uIGNoZWNrcyB3ZSBkbyBub3QgdXNlIHBlcm1pc3Npb24gY2FjaGUgZm9yCi0gKiBydW50aW1lIHBlcm1pc3Npb25zIChwcm90ZWN0aW9uIGxldmVsIGRhbmdlcm91cykgYXMgdGhleSBtYXkgY2hhbmdlIGF0Ci0gKiBydW50aW1lLiBBbGwgb3RoZXIgcGVybWlzc2lvbnMgKHByb3RlY3Rpb24gbGV2ZWwgbm9ybWFsIGFuZCBkYW5nZXJvdXMpCi0gKiBjYW4gYmUgY2FjaGVkIGFzIHRoZXkgbmV2ZXIgY2hhbmdlLiBPZiBjb3Vyc2UgYWxsIHBlcm1pc3Npb24gY2hlY2tlZAotICogaGVyZSBhcmUgcGxhdGZvcm0gZGVmaW5lZC4KLSAqLwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbygiYW5kcm9pZC5wZXJtaXNzaW9uLlJFQ09SRF9BVURJTyIpOwotCi0vLyBOb3QgdmFsaWQgdW50aWwgaW5pdGlhbGl6ZWQgYnkgQXVkaW9GbGluZ2VyIGNvbnN0cnVjdG9yLiAgSXQgd291bGQgaGF2ZSB0byBiZQotLy8gcmUtaW5pdGlhbGl6ZWQgaWYgdGhlIHByb2Nlc3MgY29udGFpbmluZyBBdWRpb0ZsaW5nZXIgc2VydmljZSBmb3JrcyAod2hpY2ggaXQgZG9lc24ndCkuCi0vLyBUaGlzIGlzIG9mdGVuIHVzZWQgdG8gdmFsaWRhdGUgYmluZGVyIGludGVyZmFjZSBjYWxscyB3aXRoaW4gYXVkaW9zZXJ2ZXIKLS8vIChlLmcuIEF1ZGlvUG9saWN5TWFuYWdlciB0byBBdWRpb0ZsaW5nZXIpLgotcGlkX3QgZ2V0cGlkX2NhY2hlZDsKLQotLy8gQSB0cnVzdGVkIGNhbGxpbmcgVUlEIG1heSBzcGVjaWZ5IHRoZSBjbGllbnQgVUlEIGFzIHBhcnQgb2YgYSBiaW5kZXIgaW50ZXJmYWNlIGNhbGwuCi0vLyBvdGhlcndpc2UgdGhlIGNhbGxpbmcgVUlEIG11c3QgYmUgZXF1YWwgdG8gdGhlIGNsaWVudCBVSUQuCi1ib29sIGlzVHJ1c3RlZENhbGxpbmdVaWQodWlkX3QgdWlkKSB7Ci0gICAgc3dpdGNoICh1aWQpIHsKLSAgICBjYXNlIEFJRF9NRURJQToKLSAgICBjYXNlIEFJRF9BVURJT1NFUlZFUjoKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLX0KLQotc3RhdGljIFN0cmluZzE2IHJlc29sdmVDYWxsaW5nUGFja2FnZShQZXJtaXNzaW9uQ29udHJvbGxlciYgcGVybWlzc2lvbkNvbnRyb2xsZXIsCi0gICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCB1aWRfdCB1aWQpIHsKLSAgICBpZiAob3BQYWNrYWdlTmFtZS5zaXplKCkgPiAwKSB7Ci0gICAgICAgIHJldHVybiBvcFBhY2thZ2VOYW1lOwotICAgIH0KLSAgICAvLyBJbiBzb21lIGNhc2VzIHRoZSBjYWxsaW5nIGNvZGUgaGFzIG5vIGFjY2VzcyB0byB0aGUgcGFja2FnZSBpdCBydW5zIHVuZGVyLgotICAgIC8vIEZvciBleGFtcGxlLCBjb2RlIHVzaW5nIHRoZSB3aWxoZWxtIGZyYW1ld29yaydzIE9wZW5TTC1FUyBBUElzLiBJbiB0aGlzCi0gICAgLy8gY2FzZSB3ZSB3aWxsIGdldCB0aGUgcGFja2FnZXMgZm9yIHRoZSBjYWxsaW5nIFVJRCBhbmQgcGljayB0aGUgZmlyc3Qgb25lCi0gICAgLy8gZm9yIGF0dHJpYnV0aW5nIHRoZSBhcHAgb3AuIFRoaXMgd2lsbCB3b3JrIGNvcnJlY3RseSBmb3IgcnVudGltZSBwZXJtaXNzaW9ucwotICAgIC8vIGFzIGZvciBsZWdhY3kgYXBwcyB3ZSB3aWxsIHRvZ2dsZSB0aGUgYXBwIG9wIGZvciBhbGwgcGFja2FnZXMgaW4gdGhlIFVJRC4KLSAgICAvLyBUaGUgY2F2ZWF0IGlzIHRoYXQgdGhlIG9wZXJhdGlvbiBtYXkgYmUgYXR0cmlidXRlZCB0byB0aGUgd3JvbmcgcGFja2FnZSBhbmQKLSAgICAvLyBzdGF0cyBiYXNlZCBvbiBhcHAgb3BzIG1heSBiZSBzbGlnaHRseSBvZmYuCi0gICAgVmVjdG9yPFN0cmluZzE2PiBwYWNrYWdlczsKLSAgICBwZXJtaXNzaW9uQ29udHJvbGxlci5nZXRQYWNrYWdlc0ZvclVpZCh1aWQsIHBhY2thZ2VzKTsKLSAgICBpZiAocGFja2FnZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCJObyBwYWNrYWdlcyBmb3IgdWlkICVkIiwgdWlkKTsKLSAgICAgICAgcmV0dXJuIG9wUGFja2FnZU5hbWU7IC8vIGVtcHR5IHN0cmluZwotICAgIH0KLSAgICByZXR1cm4gcGFja2FnZXNbMF07Ci19Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc0F1ZGlvU2VydmVyT3JSb290KHVpZF90IHVpZCkgewotICAgIC8vIEFJRF9ST09UIGlzIE9LIGZvciBjb21tYW5kLWxpbmUgdGVzdHMuICBOYXRpdmUgdW5mb3JrZWQgYXVkaW9zZXJ2ZXIgYWx3YXlzIE9LLgotICAgIHJldHVybiB1aWQgPT0gQUlEX1JPT1QgfHwgdWlkID09IEFJRF9BVURJT1NFUlZFUiA7Ci19Ci0KLXN0YXRpYyBib29sIGNoZWNrUmVjb3JkaW5nSW50ZXJuYWwoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwKLSAgICAgICAgdWlkX3QgdWlkLCBib29sIHN0YXJ0KSB7Ci0gICAgLy8gT2theSB0byBub3QgdHJhY2sgaW4gYXBwIG9wcyBhcyBhdWRpbyBzZXJ2ZXIgaXMgdXMgYW5kIGlmCi0gICAgLy8gZGV2aWNlIGlzIHJvb3RlZCBzZWN1cml0eSBtb2RlbCBpcyBjb25zaWRlcmVkIGNvbXByb21pc2VkLgotICAgIGlmIChpc0F1ZGlvU2VydmVyT3JSb290KHVpZCkpIHJldHVybiB0cnVlOwotCi0gICAgLy8gV2Ugc3BlY2lmeSBhIHBpZCBhbmQgdWlkIGhlcmUgYXMgbWVkaWFzZXJ2ZXIgKGFrYSBNZWRpYVJlY29yZGVyIG9yIFN0YWdlRnJpZ2h0UmVjb3JkZXIpCi0gICAgLy8gbWF5IG9wZW4gYSByZWNvcmQgdHJhY2sgb24gYmVoYWxmIG9mIGEgY2xpZW50LiAgTm90ZSB0aGF0IHBpZCBtYXkgYmUgYSB0aWQuCi0gICAgLy8gSU1QT1JUQU5UOiBET04nVCBVU0UgUGVybWlzc2lvbkNhY2hlIC0gUlVOVElNRSBQRVJNSVNTSU9OUyBDSEFOR0UuCi0gICAgUGVybWlzc2lvbkNvbnRyb2xsZXIgcGVybWlzc2lvbkNvbnRyb2xsZXI7Ci0gICAgY29uc3QgYm9vbCBvayA9IHBlcm1pc3Npb25Db250cm9sbGVyLmNoZWNrUGVybWlzc2lvbihzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbywgcGlkLCB1aWQpOwotICAgIGlmICghb2spIHsKLSAgICAgICAgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgJXMiLCBTdHJpbmc4KHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIFN0cmluZzE2IHJlc29sdmVkT3BQYWNrYWdlTmFtZSA9IHJlc29sdmVDYWxsaW5nUGFja2FnZSgKLSAgICAgICAgICAgIHBlcm1pc3Npb25Db250cm9sbGVyLCBvcFBhY2thZ2VOYW1lLCB1aWQpOwotICAgIGlmIChyZXNvbHZlZE9wUGFja2FnZU5hbWUuc2l6ZSgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEFwcE9wc01hbmFnZXIgYXBwT3BzOwotICAgIGNvbnN0IGludDMyX3Qgb3AgPSBhcHBPcHMucGVybWlzc2lvblRvT3BDb2RlKHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKTsKLSAgICBpZiAoc3RhcnQpIHsKLSAgICAgICAgaWYgKGFwcE9wcy5zdGFydE9wTm9UaHJvdyhvcCwgdWlkLCByZXNvbHZlZE9wUGFja2FnZU5hbWUsIC8qc3RhcnRJZk1vZGVEZWZhdWx0Ki8gZmFsc2UpCi0gICAgICAgICAgICAgICAgIT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9BTExPV0VEKSB7Ci0gICAgICAgICAgICBBTE9HRSgiUmVxdWVzdCBkZW5pZWQgYnkgYXBwIG9wOiAlZCIsIG9wKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChhcHBPcHMubm90ZU9wKG9wLCB1aWQsIHJlc29sdmVkT3BQYWNrYWdlTmFtZSkgIT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9BTExPV0VEKSB7Ci0gICAgICAgICAgICBBTE9HRSgiUmVxdWVzdCBkZW5pZWQgYnkgYXBwIG9wOiAlZCIsIG9wKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIHJlY29yZGluZ0FsbG93ZWQoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7Ci0gICAgcmV0dXJuIGNoZWNrUmVjb3JkaW5nSW50ZXJuYWwob3BQYWNrYWdlTmFtZSwgcGlkLCB1aWQsIC8qc3RhcnQqLyBmYWxzZSk7Ci19Ci0KLWJvb2wgc3RhcnRSZWNvcmRpbmcoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7Ci0gICAgIHJldHVybiBjaGVja1JlY29yZGluZ0ludGVybmFsKG9wUGFja2FnZU5hbWUsIHBpZCwgdWlkLCAvKnN0YXJ0Ki8gdHJ1ZSk7Ci19Ci0KLXZvaWQgZmluaXNoUmVjb3JkaW5nKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCB1aWRfdCB1aWQpIHsKLSAgICAvLyBPa2F5IHRvIG5vdCB0cmFjayBpbiBhcHAgb3BzIGFzIGF1ZGlvIHNlcnZlciBpcyB1cyBhbmQgaWYKLSAgICAvLyBkZXZpY2UgaXMgcm9vdGVkIHNlY3VyaXR5IG1vZGVsIGlzIGNvbnNpZGVyZWQgY29tcHJvbWlzZWQuCi0gICAgaWYgKGlzQXVkaW9TZXJ2ZXJPclJvb3QodWlkKSkgcmV0dXJuOwotCi0gICAgUGVybWlzc2lvbkNvbnRyb2xsZXIgcGVybWlzc2lvbkNvbnRyb2xsZXI7Ci0gICAgU3RyaW5nMTYgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lID0gcmVzb2x2ZUNhbGxpbmdQYWNrYWdlKAotICAgICAgICAgICAgcGVybWlzc2lvbkNvbnRyb2xsZXIsIG9wUGFja2FnZU5hbWUsIHVpZCk7Ci0gICAgaWYgKHJlc29sdmVkT3BQYWNrYWdlTmFtZS5zaXplKCkgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQXBwT3BzTWFuYWdlciBhcHBPcHM7Ci0gICAgY29uc3QgaW50MzJfdCBvcCA9IGFwcE9wcy5wZXJtaXNzaW9uVG9PcENvZGUoc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8pOwotICAgIGFwcE9wcy5maW5pc2hPcChvcCwgdWlkLCByZXNvbHZlZE9wUGFja2FnZU5hbWUpOwotfQotCi1ib29sIGNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKLSAgICBpZiAoZ2V0cGlkX2NhY2hlZCA9PSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpIHJldHVybiB0cnVlOwotICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQ2FwdHVyZUF1ZGlvT3V0cHV0KCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19PVVRQVVQiKTsKLSAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oc0NhcHR1cmVBdWRpb091dHB1dCwgcGlkLCB1aWQpOwotICAgIGlmICghb2spIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX09VVFBVVCIpOwotICAgIHJldHVybiBvazsKLX0KLQotYm9vbCBjYXB0dXJlSG90d29yZEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKLSAgICAvLyBDQVBUVVJFX0FVRElPX0hPVFdPUkQgcGVybWlzc2lvbiBpbXBsaWVzIFJFQ09SRF9BVURJTyBwZXJtaXNzaW9uCi0gICAgYm9vbCBvayA9IHJlY29yZGluZ0FsbG93ZWQoU3RyaW5nMTYoIiIpLCBwaWQsIHVpZCk7Ci0KLSAgICBpZiAob2spIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNDYXB0dXJlSG90d29yZEFsbG93ZWQoImFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX0hPVFdPUkQiKTsKLSAgICAgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KLSAgICAgICAgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0NhcHR1cmVIb3R3b3JkQWxsb3dlZCk7Ci0gICAgfQotICAgIGlmICghb2spIEFMT0dFKCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEIik7Ci0gICAgcmV0dXJuIG9rOwotfQotCi1ib29sIHNldHRpbmdzQWxsb3dlZCgpIHsKLSAgICBpZiAoZ2V0cGlkX2NhY2hlZCA9PSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpIHJldHVybiB0cnVlOwotICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQXVkaW9TZXR0aW5ncygiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19TRVRUSU5HUyIpOwotICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCi0gICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzQXVkaW9TZXR0aW5ncyk7Ci0gICAgaWYgKCFvaykgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19TRVRUSU5HUyIpOwotICAgIHJldHVybiBvazsKLX0KLQotYm9vbCBtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkgewotICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzTW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19ST1VUSU5HIik7Ci0gICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KLSAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNNb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKTsKLSAgICBpZiAoIW9rKSBBTE9HRSgiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9BVURJT19ST1VUSU5HIik7Ci0gICAgcmV0dXJuIG9rOwotfQotCi1ib29sIGR1bXBBbGxvd2VkKCkgewotICAgIC8vIGRvbid0IG9wdGltaXplIGZvciBzYW1lIHBpZCwgc2luY2UgbWVkaWFzZXJ2ZXIgbmV2ZXIgZHVtcHMgaXRzZWxmCi0gICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNEdW1wKCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpOwotICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCi0gICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzRHVtcCk7Ci0gICAgLy8gY29udmVudGlvbiBpcyBmb3IgY2FsbGVyIHRvIGR1bXAgYW4gZXJyb3IgbWVzc2FnZSB0byBmZCBpbnN0ZWFkIG9mIGxvZ2dpbmcgaGVyZQotICAgIC8vaWYgKCFvaykgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKTsKLSAgICByZXR1cm4gb2s7Ci19Ci0KLWJvb2wgbW9kaWZ5UGhvbmVTdGF0ZUFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKLSAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc01vZGlmeVBob25lU3RhdGUoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfUEhPTkVfU1RBVEUiKTsKLSAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oc01vZGlmeVBob25lU3RhdGUsIHBpZCwgdWlkKTsKLSAgICBpZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX1BIT05FX1NUQVRFIik7Ci0gICAgcmV0dXJuIG9rOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ1YWRhMS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ29udHJvbGxlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWV4dGVybiBwaWRfdCBnZXRwaWRfY2FjaGVkOwotYm9vbCBpc1RydXN0ZWRDYWxsaW5nVWlkKHVpZF90IHVpZCk7Ci1ib29sIHJlY29yZGluZ0FsbG93ZWQoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKLWJvb2wgc3RhcnRSZWNvcmRpbmcoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKLXZvaWQgZmluaXNoUmVjb3JkaW5nKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCB1aWRfdCB1aWQpOwotYm9vbCBjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKLWJvb2wgY2FwdHVyZUhvdHdvcmRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKLWJvb2wgc2V0dGluZ3NBbGxvd2VkKCk7Ci1ib29sIG1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKTsKLWJvb2wgZHVtcEFsbG93ZWQoKTsKLWJvb2wgbW9kaWZ5UGhvbmVTdGF0ZUFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpOwotfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCmluZGV4IGRjYWQ4NjYuLmNlNDA4YmUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKQEAgLTIzLDYgKzIzLDggQEAKICNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KQEAgLTM2LDEwICszOCwxMyBAQAogCiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvQmFsYW5jZS5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2NoYW5uZWxzLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvbW9ub19ibGVuZC5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9mb3JtYXQuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9taW5pZmxvYXQuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9zYWZlX21hdGguaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfbnMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfYWVjLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CkBAIC01NCw2ICs1OSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvQmF0dGVyeU5vdGlmaWVyLmg+CiAKKyNpbmNsdWRlIDxhdWRpb21hbmFnZXIvQXVkaW9NYW5hZ2VyLmg+CiAjaW5jbHVkZSA8cG93ZXJtYW5hZ2VyL1Bvd2VyTWFuYWdlci5oPgogCiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KQEAgLTYyLDggKzY4LDggQEAKICNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKICNpbmNsdWRlICJGYXN0TWl4ZXIuaCIKICNpbmNsdWRlICJGYXN0Q2FwdHVyZS5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKLSNpbmNsdWRlICJtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmgiCisjaW5jbHVkZSA8bWVkaWF1dGlscy9TY2hlZHVsaW5nUG9saWN5U2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogCiAjaWZkZWYgQUREX0JBVFRFUllfREFUQQogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KQEAgLTcxLDcgKzc3LDcgQEAKICNlbmRpZgogCiAjaWZkZWYgREVCVUdfQ1BVX1VTQUdFCi0jaW5jbHVkZSA8Y3B1c3RhdHMvQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL1N0YXRpc3RpY3MuaD4KICNpbmNsdWRlIDxjcHVzdGF0cy9UaHJlYWRDcHVVc2FnZS5oPgogI2VuZGlmCiAKQEAgLTIwMCw3ICsyMDYsNyBAQAogLy8gSW5pdGlhbGx5IHRoaXMgaGVhcCBpcyB1c2VkIHRvIGFsbG9jYXRlIGNsaWVudCBidWZmZXJzIGZvciAiZmFzdCIgQXVkaW9SZWNvcmQuCiAvLyBFdmVudHVhbGx5IGl0IHdpbGwgYmUgdGhlIHNpbmdsZSBidWZmZXIgdGhhdCBGYXN0Q2FwdHVyZSB3cml0ZXMgaW50byB2aWEgSEFMIHJlYWQoKSwKIC8vIGFuZCB0aGF0IGFsbCAiZmFzdCIgQXVkaW9SZWNvcmQgY2xpZW50cyByZWFkIGZyb20uICBJbiBlaXRoZXIgY2FzZSwgdGhlIHNpemUgY2FuIGJlIHNtYWxsLgotc3RhdGljIGNvbnN0IHNpemVfdCBrUmVjb3JkVGhyZWFkUmVhZE9ubHlIZWFwU2l6ZSA9IDB4NDAwMDsKK3N0YXRpYyBjb25zdCBzaXplX3Qga1JlY29yZFRocmVhZFJlYWRPbmx5SGVhcFNpemUgPSAweEQwMDA7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMzMzLDkgKzMzOSw5IEBACiAjaWZkZWYgREVCVUdfQ1BVX1VTQUdFCiBwcml2YXRlOgogICAgIFRocmVhZENwdVVzYWdlIG1DcHVVc2FnZTsgICAgICAgICAgIC8vIGluc3RhbnRhbmVvdXMgdGhyZWFkIENQVSB1c2FnZSBpbiB3YWxsIGNsb2NrIG5zCi0gICAgQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcyBtV2NTdGF0czsgLy8gc3RhdGlzdGljcyBvbiB0aHJlYWQgQ1BVIHVzYWdlIGluIHdhbGwgY2xvY2sgbnMKKyAgICBhdWRpb191dGlsczo6U3RhdGlzdGljczxkb3VibGU+IG1XY1N0YXRzOyAvLyBzdGF0aXN0aWNzIG9uIHRocmVhZCBDUFUgdXNhZ2UgaW4gd2FsbCBjbG9jayBucwogCi0gICAgQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcyBtSHpTdGF0czsgLy8gc3RhdGlzdGljcyBvbiB0aHJlYWQgQ1BVIHVzYWdlIGluIGN5Y2xlcworICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbUh6U3RhdHM7IC8vIHN0YXRpc3RpY3Mgb24gdGhyZWFkIENQVSB1c2FnZSBpbiBjeWNsZXMKIAogICAgIGludCBtQ3B1TnVtOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocmVhZCdzIGN1cnJlbnQgQ1BVIG51bWJlcgogICAgIGludCBtQ3B1a0h6OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyZXF1ZW5jeSBvZiB0aHJlYWQncyBjdXJyZW50IENQVSBpbiBrSHoKQEAgLTM2MSw3ICszNjcsNyBAQAogCiAgICAgLy8gcmVjb3JkIHNhbXBsZSBmb3Igd2FsbCBjbG9jayBzdGF0aXN0aWNzCiAgICAgaWYgKHZhbGlkKSB7Ci0gICAgICAgIG1XY1N0YXRzLnNhbXBsZSh3Y05zKTsKKyAgICAgICAgbVdjU3RhdHMuYWRkKHdjTnMpOwogICAgIH0KIAogICAgIC8vIGdldCB0aGUgY3VycmVudCBDUFUgbnVtYmVyCkBAIC0zODAsMjYgKzM4NiwyNiBAQAogCiAgICAgLy8gaWYgbm8gY2hhbmdlIGluIENQVSBudW1iZXIgb3IgZnJlcXVlbmN5LCB0aGVuIHJlY29yZCBzYW1wbGUgZm9yIGN5Y2xlIHN0YXRpc3RpY3MKICAgICBpZiAodmFsaWQgJiYgbUNwdWtIeiA+IDApIHsKLSAgICAgICAgZG91YmxlIGN5Y2xlcyA9IHdjTnMgKiBjcHVrSHogKiAwLjAwMDAwMTsKLSAgICAgICAgbUh6U3RhdHMuc2FtcGxlKGN5Y2xlcyk7CisgICAgICAgIGNvbnN0IGRvdWJsZSBjeWNsZXMgPSB3Y05zICogY3B1a0h6ICogMC4wMDAwMDE7CisgICAgICAgIG1IelN0YXRzLmFkZChjeWNsZXMpOwogICAgIH0KIAotICAgIHVuc2lnbmVkIG4gPSBtV2NTdGF0cy5uKCk7CisgICAgY29uc3QgdW5zaWduZWQgbiA9IG1XY1N0YXRzLmdldE4oKTsKICAgICAvLyBtQ3B1VXNhZ2UuZWxhcHNlZCgpIGlzIGV4cGVuc2l2ZSwgc28gZG9uJ3QgY2FsbCBpdCBldmVyeSBsb29wCiAgICAgaWYgKChuICYgMTI3KSA9PSAxKSB7Ci0gICAgICAgIGxvbmcgbG9uZyBlbGFwc2VkID0gbUNwdVVzYWdlLmVsYXBzZWQoKTsKKyAgICAgICAgY29uc3QgbG9uZyBsb25nIGVsYXBzZWQgPSBtQ3B1VXNhZ2UuZWxhcHNlZCgpOwogICAgICAgICBpZiAoZWxhcHNlZCA+PSBERUJVR19DUFVfVVNBR0UgKiAxMDAwMDAwMDAwTEwpIHsKLSAgICAgICAgICAgIGRvdWJsZSBwZXJMb29wID0gZWxhcHNlZCAvIChkb3VibGUpIG47Ci0gICAgICAgICAgICBkb3VibGUgcGVyTG9vcDEwMCA9IHBlckxvb3AgKiAwLjAxOwotICAgICAgICAgICAgZG91YmxlIHBlckxvb3AxayA9IHBlckxvb3AgKiAwLjAwMTsKLSAgICAgICAgICAgIGRvdWJsZSBtZWFuID0gbVdjU3RhdHMubWVhbigpOwotICAgICAgICAgICAgZG91YmxlIHN0ZGRldiA9IG1XY1N0YXRzLnN0ZGRldigpOwotICAgICAgICAgICAgZG91YmxlIG1pbmltdW0gPSBtV2NTdGF0cy5taW5pbXVtKCk7Ci0gICAgICAgICAgICBkb3VibGUgbWF4aW11bSA9IG1XY1N0YXRzLm1heGltdW0oKTsKLSAgICAgICAgICAgIGRvdWJsZSBtZWFuQ3ljbGVzID0gbUh6U3RhdHMubWVhbigpOwotICAgICAgICAgICAgZG91YmxlIHN0ZGRldkN5Y2xlcyA9IG1IelN0YXRzLnN0ZGRldigpOwotICAgICAgICAgICAgZG91YmxlIG1pbkN5Y2xlcyA9IG1IelN0YXRzLm1pbmltdW0oKTsKLSAgICAgICAgICAgIGRvdWJsZSBtYXhDeWNsZXMgPSBtSHpTdGF0cy5tYXhpbXVtKCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgcGVyTG9vcCA9IGVsYXBzZWQgLyAoZG91YmxlKSBuOworICAgICAgICAgICAgY29uc3QgZG91YmxlIHBlckxvb3AxMDAgPSBwZXJMb29wICogMC4wMTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBwZXJMb29wMWsgPSBwZXJMb29wICogMC4wMDE7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbWVhbiA9IG1XY1N0YXRzLmdldE1lYW4oKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBzdGRkZXYgPSBtV2NTdGF0cy5nZXRTdGREZXYoKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtaW5pbXVtID0gbVdjU3RhdHMuZ2V0TWluKCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbWF4aW11bSA9IG1XY1N0YXRzLmdldE1heCgpOworICAgICAgICAgICAgY29uc3QgZG91YmxlIG1lYW5DeWNsZXMgPSBtSHpTdGF0cy5nZXRNZWFuKCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgc3RkZGV2Q3ljbGVzID0gbUh6U3RhdHMuZ2V0U3RkRGV2KCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbWluQ3ljbGVzID0gbUh6U3RhdHMuZ2V0TWluKCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbWF4Q3ljbGVzID0gbUh6U3RhdHMuZ2V0TWF4KCk7CiAgICAgICAgICAgICBtQ3B1VXNhZ2UucmVzZXRFbGFwc2VkKCk7CiAgICAgICAgICAgICBtV2NTdGF0cy5yZXNldCgpOwogICAgICAgICAgICAgbUh6U3RhdHMucmVzZXQoKTsKQEAgLTQ1Myw1MCArNDU5LDYgQEAKICAgICB9CiB9CiAKLXN0ZDo6c3RyaW5nIGRldmljZXNUb1N0cmluZyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlcykKLXsKLSAgICBzdGQ6OnN0cmluZyByZXN1bHQ7Ci0gICAgaWYgKGRldmljZXMgJiBBVURJT19ERVZJQ0VfQklUX0lOKSB7Ci0gICAgICAgIElucHV0RGV2aWNlQ29udmVydGVyOjptYXNrVG9TdHJpbmcoZGV2aWNlcywgcmVzdWx0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBPdXRwdXREZXZpY2VDb252ZXJ0ZXI6Om1hc2tUb1N0cmluZyhkZXZpY2VzLCByZXN1bHQpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGQ6OnN0cmluZyBpbnB1dEZsYWdzVG9TdHJpbmcoYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKLXsKLSAgICBzdGQ6OnN0cmluZyByZXN1bHQ7Ci0gICAgSW5wdXRGbGFnQ29udmVydGVyOjptYXNrVG9TdHJpbmcoZmxhZ3MsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RkOjpzdHJpbmcgb3V0cHV0RmxhZ3NUb1N0cmluZyhhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykKLXsKLSAgICBzdGQ6OnN0cmluZyByZXN1bHQ7Ci0gICAgT3V0cHV0RmxhZ0NvbnZlcnRlcjo6bWFza1RvU3RyaW5nKGZsYWdzLCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLWNvbnN0IGNoYXIgKnNvdXJjZVRvU3RyaW5nKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKLXsKLSAgICBzd2l0Y2ggKHNvdXJjZSkgewotICAgIGNhc2UgQVVESU9fU09VUkNFX0RFRkFVTFQ6ICAgICAgICAgICAgICByZXR1cm4gImRlZmF1bHQiOwotICAgIGNhc2UgQVVESU9fU09VUkNFX01JQzogICAgICAgICAgICAgICAgICByZXR1cm4gIm1pYyI7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LOiAgICAgICAgIHJldHVybiAidm9pY2UgdXBsaW5rIjsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSzogICAgICAgcmV0dXJuICJ2b2ljZSBkb3dubGluayI7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTDogICAgICAgICAgIHJldHVybiAidm9pY2UgY2FsbCI7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfQ0FNQ09SREVSOiAgICAgICAgICAgIHJldHVybiAiY2FtY29yZGVyIjsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTjogICAgcmV0dXJuICJ2b2ljZSByZWNvZ25pdGlvbiI7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTjogIHJldHVybiAidm9pY2UgY29tbXVuaWNhdGlvbiI7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWDogICAgICAgIHJldHVybiAicmVtb3RlIHN1Ym1peCI7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQ6ICAgICAgICAgIHJldHVybiAidW5wcm9jZXNzZWQiOwotICAgIGNhc2UgQVVESU9fU09VUkNFX0ZNX1RVTkVSOiAgICAgICAgICAgICByZXR1cm4gIkZNIHR1bmVyIjsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9IT1RXT1JEOiAgICAgICAgICAgICAgcmV0dXJuICJob3R3b3JkIjsKLSAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ1bmtub3duIjsKLSAgICB9Ci19Ci0KIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6VGhyZWFkQmFzZShjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLAogICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0RGV2aWNlLCBhdWRpb19kZXZpY2VzX3QgaW5EZXZpY2UsIHR5cGVfdCB0eXBlLCBib29sIHN5c3RlbVJlYWR5KQogICAgIDogICBUaHJlYWQoZmFsc2UgLypjYW5DYWxsSmF2YSovKSwKQEAgLTUyOCw2ICs0OTAsOCBAQAogICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBJSW50ZXJmYWNlOjphc0JpbmRlcihtUG93ZXJNYW5hZ2VyKTsKICAgICAgICAgYmluZGVyLT51bmxpbmtUb0RlYXRoKG1EZWF0aFJlY2lwaWVudCk7CiAgICAgfQorCisgICAgc2VuZFN0YXRpc3RpY3ModHJ1ZSAvKiBmb3JjZSAqLyk7CiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6cmVhZHlUb1J1bigpCkBAIC02MDIsMTYgKzU2NiwyNyBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpzZW5kSW9Db25maWdFdmVudChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpzZW5kSW9Db25maWdFdmVudChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woZXZlbnQsIHBpZCk7CisgICAgc2VuZElvQ29uZmlnRXZlbnRfbChldmVudCwgcGlkLCBwb3J0SWQpOwogfQogCiAvLyBzZW5kSW9Db25maWdFdmVudF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCi12b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6c2VuZElvQ29uZmlnRXZlbnRfbChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpzZW5kSW9Db25maWdFdmVudF9sKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgc3A8Q29uZmlnRXZlbnQ+IGNvbmZpZ0V2ZW50ID0gKENvbmZpZ0V2ZW50ICopbmV3IElvQ29uZmlnRXZlbnQoZXZlbnQsIHBpZCk7CisgICAgLy8gVGhlIGF1ZGlvIHN0YXRpc3RpY3MgaGlzdG9yeSBpcyBleHBvbmVudGlhbGx5IHdlaWdodGVkIHRvIGZvcmdldCBldmVudHMKKyAgICAvLyBhYm91dCBmaXZlIG9yIG1vcmUgc2Vjb25kcyBpbiB0aGUgcGFzdC4gIEluIG9yZGVyIHRvIGhhdmUKKyAgICAvLyBjcmlzcGVyIHN0YXRpc3RpY3MgZm9yIG1lZGlhbWV0cmljcywgd2UgcmVzZXQgdGhlIHN0YXRpc3RpY3Mgb24KKyAgICAvLyBhbiBJb0NvbmZpZ0V2ZW50LCB0byByZWZsZWN0IGRpZmZlcmVudCBwcm9wZXJ0aWVzIGZvciBhIG5ldyBkZXZpY2UuCisgICAgbUlvSml0dGVyTXMucmVzZXQoKTsKKyAgICBtTGF0ZW5jeU1zLnJlc2V0KCk7CisgICAgbVByb2Nlc3NUaW1lTXMucmVzZXQoKTsKKyAgICBtVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eSgpOworCisgICAgc3A8Q29uZmlnRXZlbnQ+IGNvbmZpZ0V2ZW50ID0gKENvbmZpZ0V2ZW50ICopbmV3IElvQ29uZmlnRXZlbnQoZXZlbnQsIHBpZCwgcG9ydElkKTsKICAgICBzZW5kQ29uZmlnRXZlbnRfbChjb25maWdFdmVudCk7CiB9CiAKQEAgLTY5NCw3ICs2NjksNyBAQAogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIENGR19FVkVOVF9JTzogewogICAgICAgICAgICAgSW9Db25maWdFdmVudERhdGEgKmRhdGEgPSAoSW9Db25maWdFdmVudERhdGEgKilldmVudC0+bURhdGEuZ2V0KCk7Ci0gICAgICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoZGF0YS0+bUV2ZW50LCBkYXRhLT5tUGlkKTsKKyAgICAgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChkYXRhLT5tRXZlbnQsIGRhdGEtPm1QaWQsIGRhdGEtPm1Qb3J0SWQpOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIENGR19FVkVOVF9TRVRfUEFSQU1FVEVSOiB7CiAgICAgICAgICAgICBTZXRQYXJhbWV0ZXJDb25maWdFdmVudERhdGEgKmRhdGEgPSAoU2V0UGFyYW1ldGVyQ29uZmlnRXZlbnREYXRhICopZXZlbnQtPm1EYXRhLmdldCgpOwpAQCAtNzExLDggKzY4Niw4IEBACiAgICAgICAgICAgICBldmVudC0+bVN0YXR1cyA9IGNyZWF0ZUF1ZGlvUGF0Y2hfbCgmZGF0YS0+bVBhdGNoLCAmZGF0YS0+bUhhbmRsZSk7CiAgICAgICAgICAgICBjb25zdCBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0RGV2aWNlKCk7CiAgICAgICAgICAgICBtTG9jYWxMb2cubG9nKCJDRkdfRVZFTlRfQ1JFQVRFX0FVRElPX1BBVENIOiBvbGQgZGV2aWNlICUjeCAoJXMpIG5ldyBkZXZpY2UgJSN4ICglcykiLAotICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpb2xkRGV2aWNlLCBkZXZpY2VzVG9TdHJpbmcob2xkRGV2aWNlKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpbmV3RGV2aWNlLCBkZXZpY2VzVG9TdHJpbmcobmV3RGV2aWNlKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKW9sZERldmljZSwgdG9TdHJpbmcob2xkRGV2aWNlKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpbmV3RGV2aWNlLCB0b1N0cmluZyhuZXdEZXZpY2UpLmNfc3RyKCkpOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIENGR19FVkVOVF9SRUxFQVNFX0FVRElPX1BBVENIOiB7CiAgICAgICAgICAgICBjb25zdCBhdWRpb19kZXZpY2VzX3Qgb2xkRGV2aWNlID0gZ2V0RGV2aWNlKCk7CkBAIC03MjEsOCArNjk2LDggQEAKICAgICAgICAgICAgIGV2ZW50LT5tU3RhdHVzID0gcmVsZWFzZUF1ZGlvUGF0Y2hfbChkYXRhLT5tSGFuZGxlKTsKICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXREZXZpY2UoKTsKICAgICAgICAgICAgIG1Mb2NhbExvZy5sb2coIkNGR19FVkVOVF9SRUxFQVNFX0FVRElPX1BBVENIOiBvbGQgZGV2aWNlICUjeCAoJXMpIG5ldyBkZXZpY2UgJSN4ICglcykiLAotICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpb2xkRGV2aWNlLCBkZXZpY2VzVG9TdHJpbmcob2xkRGV2aWNlKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpbmV3RGV2aWNlLCBkZXZpY2VzVG9TdHJpbmcobmV3RGV2aWNlKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKW9sZERldmljZSwgdG9TdHJpbmcob2xkRGV2aWNlKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpbmV3RGV2aWNlLCB0b1N0cmluZyhuZXdEZXZpY2UpLmNfc3RyKCkpOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR19BU1NFUlQoZmFsc2UsICJwcm9jZXNzQ29uZmlnRXZlbnRzX2woKSB1bmtub3duIGV2ZW50IHR5cGUgJWQiLCBldmVudC0+bVR5cGUpOwpAQCAtNzQ5LDYgKzcyNCw3IEBACiAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfZ2V0X3JlcHJlc2VudGF0aW9uKG1hc2spOwogCiAgICAgc3dpdGNoIChyZXByZXNlbnRhdGlvbikgeworICAgIC8vIFRyYXZlbCBhbGwgc2luZ2xlIGJpdCBjaGFubmVsIG1hc2sgdG8gY29udmVydCBjaGFubmVsIG1hc2sgdG8gc3RyaW5nLgogICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9QT1NJVElPTjogewogICAgICAgICBpZiAob3V0cHV0KSB7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlQpIHMuYXBwZW5kKCJmcm9udC1sZWZ0LCAiKTsKQEAgLTc2OSw2ICs3NDUsMTAgQEAKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfTEVGVCkgcy5hcHBlbmQoInRvcC1iYWNrLWxlZnQsICIpOwogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19DRU5URVIpIHMuYXBwZW5kKCJ0b3AtYmFjay1jZW50ZXIsICIgKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfUklHSFQpIHMuYXBwZW5kKCJ0b3AtYmFjay1yaWdodCwgIiApOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfU0lERV9MRUZUKSBzLmFwcGVuZCgidG9wLXNpZGUtbGVmdCwgIiApOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9UT1BfU0lERV9SSUdIVCkgcy5hcHBlbmQoInRvcC1zaWRlLXJpZ2h0LCAiICk7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0hBUFRJQ19CKSBzLmFwcGVuZCgiaGFwdGljLUIsICIgKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfSEFQVElDX0EpIHMuYXBwZW5kKCJoYXB0aWMtQSwgIiApOwogICAgICAgICAgICAgaWYgKG1hc2sgJiB+QVVESU9fQ0hBTk5FTF9PVVRfQUxMKSBzLmFwcGVuZCgidW5rbm93biwgICIpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0xFRlQpIHMuYXBwZW5kKCJsZWZ0LCAiKTsKQEAgLTc4Myw2ICs3NjMsMTIgQEAKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9YX0FYSVMpIHMuYXBwZW5kKCJYLCAiKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9ZX0FYSVMpIHMuYXBwZW5kKCJZLCAiKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9aX0FYSVMpIHMuYXBwZW5kKCJaLCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9CQUNLX0xFRlQpIHMuYXBwZW5kKCJiYWNrLWxlZnQsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0JBQ0tfUklHSFQpIHMuYXBwZW5kKCJiYWNrLXJpZ2h0LCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9DRU5URVIpIHMuYXBwZW5kKCJjZW50ZXIsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX0xPV19GUkVRVUVOQ1kpIHMuYXBwZW5kKCJsb3cgZnJlcSwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fVE9QX0xFRlQpIHMuYXBwZW5kKCJ0b3AtbGVmdCwgIiApOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1RPUF9SSUdIVCkgcy5hcHBlbmQoInRvcC1yaWdodCwgIiApOwogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX1VQTElOSykgcy5hcHBlbmQoInZvaWNlLXVwbGluaywgIik7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfRE5MSU5LKSBzLmFwcGVuZCgidm9pY2UtZG5saW5rLCAiKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgfkFVRElPX0NIQU5ORUxfSU5fQUxMKSBzLmFwcGVuZCgidW5rbm93biwgICIpOwpAQCAtODA0LDEyICs3OTAsOCBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmR1bXBCYXNlKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQogICAgIGRwcmludGYoZmQsICJcbiVzIHRocmVhZCAlcCwgbmFtZSAlcywgdGlkICVkLCB0eXBlICVkICglcyk6XG4iLCBpc091dHB1dCgpID8gIk91dHB1dCIgOiAiSW5wdXQiLAogICAgICAgICAgICAgdGhpcywgbVRocmVhZE5hbWUsIGdldFRpZCgpLCB0eXBlKCksIHRocmVhZFR5cGVUb1N0cmluZyh0eXBlKCkpKTsKIApAQCAtODE4LDYgKzgwMCwyMSBAQAogICAgICAgICBkcHJpbnRmKGZkLCAiICBUaHJlYWQgbWF5IGJlIGRlYWRsb2NrZWRcbiIpOwogICAgIH0KIAorICAgIGR1bXBCYXNlX2woZmQsIGFyZ3MpOworICAgIGR1bXBJbnRlcm5hbHNfbChmZCwgYXJncyk7CisgICAgZHVtcFRyYWNrc19sKGZkLCBhcmdzKTsKKyAgICBkdW1wRWZmZWN0Q2hhaW5zX2woZmQsIGFyZ3MpOworCisgICAgaWYgKGxvY2tlZCkgeworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICB9CisKKyAgICBkcHJpbnRmKGZkLCAiICBMb2NhbCBsb2c6XG4iKTsKKyAgICBtTG9jYWxMb2cuZHVtcChmZCwgIiAgICIgLyogcHJlZml4ICovLCA0MCAvKiBsaW5lcyAqLyk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpkdW1wQmFzZV9sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKK3sKICAgICBkcHJpbnRmKGZkLCAiICBJL08gaGFuZGxlOiAlZFxuIiwgbUlkKTsKICAgICBkcHJpbnRmKGZkLCAiICBTdGFuZGJ5OiAlc1xuIiwgbVN0YW5kYnkgPyAieWVzIiA6ICJubyIpOwogICAgIGRwcmludGYoZmQsICIgIFNhbXBsZSByYXRlOiAldSBIelxuIiwgbVNhbXBsZVJhdGUpOwpAQCAtODMyLDYgKzgyOSw4IEBACiAgICAgZHByaW50ZihmZCwgIiAgUGVuZGluZyBjb25maWcgZXZlbnRzOiIpOwogICAgIHNpemVfdCBudW1Db25maWcgPSBtQ29uZmlnRXZlbnRzLnNpemUoKTsKICAgICBpZiAobnVtQ29uZmlnKSB7CisgICAgICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgICAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1Db25maWc7IGkrKykgewogICAgICAgICAgICAgbUNvbmZpZ0V2ZW50c1tpXS0+ZHVtcChidWZmZXIsIFNJWkUpOwogICAgICAgICAgICAgZHByaW50ZihmZCwgIlxuICAgICVzIiwgYnVmZmVyKTsKQEAgLTg0MSwyMCArODQwLDQ3IEBACiAgICAgICAgIGRwcmludGYoZmQsICIgbm9uZVxuIik7CiAgICAgfQogICAgIC8vIE5vdGU6IG91dHB1dCBkZXZpY2UgbWF5IGJlIHVzZWQgYnkgY2FwdHVyZSB0aHJlYWRzIGZvciBlZmZlY3RzIHN1Y2ggYXMgQUVDLgotICAgIGRwcmludGYoZmQsICIgIE91dHB1dCBkZXZpY2U6ICUjeCAoJXMpXG4iLCBtT3V0RGV2aWNlLCBkZXZpY2VzVG9TdHJpbmcobU91dERldmljZSkuY19zdHIoKSk7Ci0gICAgZHByaW50ZihmZCwgIiAgSW5wdXQgZGV2aWNlOiAlI3ggKCVzKVxuIiwgbUluRGV2aWNlLCBkZXZpY2VzVG9TdHJpbmcobUluRGV2aWNlKS5jX3N0cigpKTsKLSAgICBkcHJpbnRmKGZkLCAiICBBdWRpbyBzb3VyY2U6ICVkICglcylcbiIsIG1BdWRpb1NvdXJjZSwgc291cmNlVG9TdHJpbmcobUF1ZGlvU291cmNlKSk7CisgICAgZHByaW50ZihmZCwgIiAgT3V0cHV0IGRldmljZTogJSN4ICglcylcbiIsIG1PdXREZXZpY2UsIHRvU3RyaW5nKG1PdXREZXZpY2UpLmNfc3RyKCkpOworICAgIGRwcmludGYoZmQsICIgIElucHV0IGRldmljZTogJSN4ICglcylcbiIsIG1JbkRldmljZSwgdG9TdHJpbmcobUluRGV2aWNlKS5jX3N0cigpKTsKKyAgICBkcHJpbnRmKGZkLCAiICBBdWRpbyBzb3VyY2U6ICVkICglcylcbiIsIG1BdWRpb1NvdXJjZSwgdG9TdHJpbmcobUF1ZGlvU291cmNlKS5jX3N0cigpKTsKIAotICAgIGlmIChsb2NrZWQpIHsKLSAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgLy8gRHVtcCB0aW1lc3RhbXAgc3RhdGlzdGljcyBmb3IgdGhlIFRocmVhZCB0eXBlcyB0aGF0IHN1cHBvcnQgaXQuCisgICAgaWYgKG1UeXBlID09IFJFQ09SRAorICAgICAgICAgICAgfHwgbVR5cGUgPT0gTUlYRVIKKyAgICAgICAgICAgIHx8IG1UeXBlID09IERVUExJQ0FUSU5HCisgICAgICAgICAgICB8fCBtVHlwZSA9PSBESVJFQ1QKKyAgICAgICAgICAgIHx8IG1UeXBlID09IE9GRkxPQUQpIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgVGltZXN0YW1wIHN0YXRzOiAlc1xuIiwgbVRpbWVzdGFtcFZlcmlmaWVyLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIGRwcmludGYoZmQsICIgIFRpbWVzdGFtcCBjb3JyZWN0ZWQ6ICVzXG4iLCBpc1RpbWVzdGFtcENvcnJlY3Rpb25FbmFibGVkKCkgPyAieWVzIiA6ICJubyIpOworICAgIH0KKworICAgIGlmIChtTGFzdElvQmVnaW5OcyA+IDApIHsgLy8gTU1BUCBtYXkgbm90IHNldCB0aGlzCisgICAgICAgIGRwcmludGYoZmQsICIgIExhc3QgJXMgb2NjdXJyZWQgKG1zZWNzKTogJWxsZFxuIiwKKyAgICAgICAgICAgICAgICBpc091dHB1dCgpID8gIndyaXRlIiA6ICJyZWFkIiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKSAoc3lzdGVtVGltZSgpIC0gbUxhc3RJb0JlZ2luTnMpIC8gTkFOT1NfUEVSX01JTExJU0VDT05EKTsKKyAgICB9CisKKyAgICBpZiAobVByb2Nlc3NUaW1lTXMuZ2V0TigpID4gMCkgeworICAgICAgICBkcHJpbnRmKGZkLCAiICBQcm9jZXNzIHRpbWUgbXMgc3RhdHM6ICVzXG4iLCBtUHJvY2Vzc1RpbWVNcy50b1N0cmluZygpLmNfc3RyKCkpOworICAgIH0KKworICAgIGlmIChtSW9KaXR0ZXJNcy5nZXROKCkgPiAwKSB7CisgICAgICAgIGRwcmludGYoZmQsICIgIEhhbCAlcyBqaXR0ZXIgbXMgc3RhdHM6ICVzXG4iLAorICAgICAgICAgICAgICAgIGlzT3V0cHV0KCkgPyAid3JpdGUiIDogInJlYWQiLAorICAgICAgICAgICAgICAgIG1Jb0ppdHRlck1zLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgfQorCisgICAgaWYgKG1MYXRlbmN5TXMuZ2V0TigpID4gMCkgeworICAgICAgICBkcHJpbnRmKGZkLCAiICBUaHJlYWRsb29wICVzIGxhdGVuY3kgc3RhdHM6ICVzXG4iLAorICAgICAgICAgICAgICAgIGlzT3V0cHV0KCkgPyAid3JpdGUiIDogInJlYWQiLAorICAgICAgICAgICAgICAgIG1MYXRlbmN5TXMudG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpkdW1wRWZmZWN0Q2hhaW5zKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpkdW1wRWZmZWN0Q2hhaW5zX2woaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQogewogICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwogICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwogCiAgICAgc2l6ZV90IG51bUVmZmVjdENoYWlucyA9IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgJXp1IEVmZmVjdCBDaGFpbnNcbiIsIG51bUVmZmVjdENoYWlucyk7CkBAIC0xMjgzLDcgKzEzMDksNiBAQAogICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbjsKICAgICBib29sIGNoYWluQ3JlYXRlZCA9IGZhbHNlOwogICAgIGJvb2wgZWZmZWN0Q3JlYXRlZCA9IGZhbHNlOwotICAgIGJvb2wgZWZmZWN0UmVnaXN0ZXJlZCA9IGZhbHNlOwogICAgIGF1ZGlvX3VuaXF1ZV9pZF90IGVmZmVjdElkID0gQVVESU9fVU5JUVVFX0lEX1VTRV9VTlNQRUNJRklFRDsKIAogICAgIGxTdGF0dXMgPSBpbml0Q2hlY2soKTsKQEAgLTEzMTksMTMgKzEzNDQsNiBAQAogCiAgICAgICAgIGlmIChlZmZlY3QgPT0gMCkgewogICAgICAgICAgICAgZWZmZWN0SWQgPSBtQXVkaW9GbGluZ2VyLT5uZXh0VW5pcXVlSWQoQVVESU9fVU5JUVVFX0lEX1VTRV9FRkZFQ1QpOwotICAgICAgICAgICAgLy8gQ2hlY2sgQ1BVIGFuZCBtZW1vcnkgdXNhZ2UKLSAgICAgICAgICAgIGxTdGF0dXMgPSBBdWRpb1N5c3RlbTo6cmVnaXN0ZXJFZmZlY3QoCi0gICAgICAgICAgICAgICAgICAgIGRlc2MsIG1JZCwgY2hhaW4tPnN0cmF0ZWd5KCksIHNlc3Npb25JZCwgZWZmZWN0SWQpOwotICAgICAgICAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlZmZlY3RSZWdpc3RlcmVkID0gdHJ1ZTsKICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIG5ldyBlZmZlY3QgbW9kdWxlIGlmIG5vbmUgcHJlc2VudCBpbiB0aGUgY2hhaW4KICAgICAgICAgICAgIGxTdGF0dXMgPSBjaGFpbi0+Y3JlYXRlRWZmZWN0X2woZWZmZWN0LCB0aGlzLCBkZXNjLCBlZmZlY3RJZCwgc2Vzc2lvbklkLCBwaW5uZWQpOwogICAgICAgICAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKQEAgLTEzNTUsOSArMTM3Myw2IEBACiAgICAgICAgIGlmIChlZmZlY3RDcmVhdGVkKSB7CiAgICAgICAgICAgICBjaGFpbi0+cmVtb3ZlRWZmZWN0X2woZWZmZWN0KTsKICAgICAgICAgfQotICAgICAgICBpZiAoZWZmZWN0UmVnaXN0ZXJlZCkgewotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnVucmVnaXN0ZXJFZmZlY3QoZWZmZWN0SWQpOwotICAgICAgICB9CiAgICAgICAgIGlmIChjaGFpbkNyZWF0ZWQpIHsKICAgICAgICAgICAgIHJlbW92ZUVmZmVjdENoYWluX2woY2hhaW4pOwogICAgICAgICB9CkBAIC0xMzg4LDcgKzE0MDMsNiBAQAogICAgIH0KICAgICBpZiAocmVtb3ZlKSB7CiAgICAgICAgIG1BdWRpb0ZsaW5nZXItPnVwZGF0ZU9ycGhhbkVmZmVjdENoYWlucyhlZmZlY3QpOwotICAgICAgICBBdWRpb1N5c3RlbTo6dW5yZWdpc3RlckVmZmVjdChlZmZlY3QtPmlkKCkpOwogICAgICAgICBpZiAoaGFuZGxlLT5lbmFibGVkKCkpIHsKICAgICAgICAgICAgIGNoZWNrU3VzcGVuZE9uRWZmZWN0RW5hYmxlZChlZmZlY3QsIGZhbHNlLCBlZmZlY3QtPnNlc3Npb25JZCgpKTsKICAgICAgICAgfQpAQCAtMTQwOSw2ICsxNDIzLDEyIEBACiAgICAgcmV0dXJuIGNoYWluICE9IDAgPyBjaGFpbi0+Z2V0RWZmZWN0RnJvbUlkX2woZWZmZWN0SWQpIDogMDsKIH0KIAorc3RkOjp2ZWN0b3I8aW50PiBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmdldEVmZmVjdElkc19sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpCit7CisgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbChzZXNzaW9uSWQpOworICAgIHJldHVybiBjaGFpbiAhPSBudWxscHRyID8gY2hhaW4tPmdldEVmZmVjdElkcygpIDogc3RkOjp2ZWN0b3I8aW50Pnt9OworfQorCiAvLyBQbGF5YmFja1RocmVhZDo6YWRkRWZmZWN0X2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgYW5kCiAvLyBQbGF5YmFja1RocmVhZDo6bUxvY2sgaGVsZAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjphZGRFZmZlY3RfbChjb25zdCBzcDxFZmZlY3RNb2R1bGU+JiBlZmZlY3QpCkBAIC0xNTE5LDcgKzE1MzksNyBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKIHsKICAgICBjb25maWctPnR5cGUgPSBBVURJT19QT1JUX1RZUEVfTUlYOwogICAgIGNvbmZpZy0+ZXh0Lm1peC5oYW5kbGUgPSBtSWQ7CkBAIC0xNTcxLDYgKzE1OTEsOSBAQAogICAgIC0tbUJhdHRlcnlDb3VudGVyW3RyYWNrLT51aWQoKV0uc2Vjb25kOwogICAgIC8vIG1MYXRlc3RBY3RpdmVUcmFjayBpcyBub3QgY2xlYXJlZCBldmVuIGlmIGlzIHRoZSBzYW1lIGFzIHRyYWNrLgogICAgIG1IYXNDaGFuZ2VkID0gdHJ1ZTsKKyNpZmRlZiBURUVfU0lOSworICAgIHRyYWNrLT5kdW1wVGVlKC0xIC8qIGZkICovLCAiX1JFTU9WRSIpOworI2VuZGlmCiAgICAgcmV0dXJuIGluZGV4OwogfQogCkBAIC0xNjQ1LDYgKzE2NjgsNjUgQEAKICAgICBtV2FpdFdvcmtDVi5icm9hZGNhc3QoKTsKIH0KIAorLy8gQ2FsbCBvbmx5IGZyb20gdGhyZWFkTG9vcCgpIG9yIHdoZW4gaXQgaXMgaWRsZS4KKy8vIERvIG5vdCBjYWxsIGZyb20gaGlnaCBwZXJmb3JtYW5jZSBjb2RlIGFzIHRoaXMgbWF5IGRvIGJpbmRlciBycGMgdG8gdGhlIE1lZGlhTWV0cmljcyBzZXJ2aWNlLgordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnNlbmRTdGF0aXN0aWNzKGJvb2wgZm9yY2UpCit7CisgICAgLy8gRG8gbm90IGxvZyBpZiB3ZSBoYXZlIG5vIHN0YXRzLgorICAgIC8vIFdlIGNob29zZSB0aGUgdGltZXN0YW1wIHZlcmlmaWVyIGJlY2F1c2UgaXQgaXMgdGhlIG1vc3QgbGlrZWx5IGl0ZW0gdG8gYmUgcHJlc2VudC4KKyAgICBjb25zdCBpbnQ2NF90IG5zdGF0cyA9IG1UaW1lc3RhbXBWZXJpZmllci5nZXROKCkgLSBtTGFzdFJlY29yZGVkVGltZXN0YW1wVmVyaWZpZXJOOworICAgIGlmIChuc3RhdHMgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gRG9uJ3QgbG9nIG1vcmUgZnJlcXVlbnRseSB0aGFuIG9uY2UgcGVyIDEyIGhvdXJzLgorICAgIC8vIFdlIHVzZSBCT09UVElNRSB0byBpbmNsdWRlIHN1c3BlbmQgdGltZS4KKyAgICBjb25zdCBpbnQ2NF90IHRpbWVOcyA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfQk9PVFRJTUUpOworICAgIGNvbnN0IGludDY0X3Qgc2luY2VOcyA9IHRpbWVOcyAtIG1MYXN0UmVjb3JkZWRUaW1lTnM7IC8vIG9rIGlmIG1MYXN0UmVjb3JkZWRUaW1lTnMgPSAwCisgICAgaWYgKCFmb3JjZSAmJiBzaW5jZU5zIDw9IDEyICogTkFOT1NfUEVSX0hPVVIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1MYXN0UmVjb3JkZWRUaW1lc3RhbXBWZXJpZmllck4gPSBtVGltZXN0YW1wVmVyaWZpZXIuZ2V0TigpOworICAgIG1MYXN0UmVjb3JkZWRUaW1lTnMgPSB0aW1lTnM7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFBbmFseXRpY3NJdGVtPiBpdGVtKE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKCJhdWRpb3RocmVhZCIpKTsKKworI2RlZmluZSBNTV9QUkVGSVggImFuZHJvaWQubWVkaWEuYXVkaW90aHJlYWQuIiAvLyBhdm9pZCBjdXQtbi1wYXN0ZSBlcnJvcnMuCisKKyAgICAvLyB0aHJlYWQgY29uZmlndXJhdGlvbgorICAgIGl0ZW0tPnNldEludDMyKE1NX1BSRUZJWCAiaWQiLCAoaW50MzJfdCltSWQpOyAvLyBJTyBoYW5kbGUKKyAgICAvLyBpdGVtLT5zZXRJbnQzMihNTV9QUkVGSVggInBvcnRJZCIsIChpbnQzMl90KW1Qb3J0SWQpOworICAgIGl0ZW0tPnNldENTdHJpbmcoTU1fUFJFRklYICJ0eXBlIiwgdGhyZWFkVHlwZVRvU3RyaW5nKG1UeXBlKSk7CisgICAgaXRlbS0+c2V0SW50MzIoTU1fUFJFRklYICJzYW1wbGVSYXRlIiwgKGludDMyX3QpbVNhbXBsZVJhdGUpOworICAgIGl0ZW0tPnNldEludDY0KE1NX1BSRUZJWCAiY2hhbm5lbE1hc2siLCAoaW50NjRfdCltQ2hhbm5lbE1hc2spOworICAgIGl0ZW0tPnNldENTdHJpbmcoTU1fUFJFRklYICJlbmNvZGluZyIsIHRvU3RyaW5nKG1Gb3JtYXQpLmNfc3RyKCkpOworICAgIGl0ZW0tPnNldEludDMyKE1NX1BSRUZJWCAiZnJhbWVDb3VudCIsIChpbnQzMl90KW1GcmFtZUNvdW50KTsKKyAgICBpdGVtLT5zZXRDU3RyaW5nKE1NX1BSRUZJWCAib3V0RGV2aWNlIiwgdG9TdHJpbmcobU91dERldmljZSkuY19zdHIoKSk7CisgICAgaXRlbS0+c2V0Q1N0cmluZyhNTV9QUkVGSVggImluRGV2aWNlIiwgdG9TdHJpbmcobUluRGV2aWNlKS5jX3N0cigpKTsKKworICAgIC8vIHRocmVhZCBzdGF0aXN0aWNzCisgICAgaWYgKG1Jb0ppdHRlck1zLmdldE4oKSA+IDApIHsKKyAgICAgICAgaXRlbS0+c2V0RG91YmxlKE1NX1BSRUZJWCAiaW9KaXR0ZXJNcy5tZWFuIiwgbUlvSml0dGVyTXMuZ2V0TWVhbigpKTsKKyAgICAgICAgaXRlbS0+c2V0RG91YmxlKE1NX1BSRUZJWCAiaW9KaXR0ZXJNcy5zdGQiLCBtSW9KaXR0ZXJNcy5nZXRTdGREZXYoKSk7CisgICAgfQorICAgIGlmIChtUHJvY2Vzc1RpbWVNcy5nZXROKCkgPiAwKSB7CisgICAgICAgIGl0ZW0tPnNldERvdWJsZShNTV9QUkVGSVggInByb2Nlc3NUaW1lTXMubWVhbiIsIG1Qcm9jZXNzVGltZU1zLmdldE1lYW4oKSk7CisgICAgICAgIGl0ZW0tPnNldERvdWJsZShNTV9QUkVGSVggInByb2Nlc3NUaW1lTXMuc3RkIiwgbVByb2Nlc3NUaW1lTXMuZ2V0U3RkRGV2KCkpOworICAgIH0KKyAgICBjb25zdCBhdXRvIHRzaml0dGVyID0gbVRpbWVzdGFtcFZlcmlmaWVyLmdldEppdHRlck1zKCk7CisgICAgaWYgKHRzaml0dGVyLmdldE4oKSA+IDApIHsKKyAgICAgICAgaXRlbS0+c2V0RG91YmxlKE1NX1BSRUZJWCAidGltZXN0YW1wSml0dGVyTXMubWVhbiIsIHRzaml0dGVyLmdldE1lYW4oKSk7CisgICAgICAgIGl0ZW0tPnNldERvdWJsZShNTV9QUkVGSVggInRpbWVzdGFtcEppdHRlck1zLnN0ZCIsIHRzaml0dGVyLmdldFN0ZERldigpKTsKKyAgICB9CisgICAgaWYgKG1MYXRlbmN5TXMuZ2V0TigpID4gMCkgeworICAgICAgICBpdGVtLT5zZXREb3VibGUoTU1fUFJFRklYICJsYXRlbmN5TXMubWVhbiIsIG1MYXRlbmN5TXMuZ2V0TWVhbigpKTsKKyAgICAgICAgaXRlbS0+c2V0RG91YmxlKE1NX1BSRUZJWCAibGF0ZW5jeU1zLnN0ZCIsIG1MYXRlbmN5TXMuZ2V0U3RkRGV2KCkpOworICAgIH0KKworICAgIGl0ZW0tPnNlbGZyZWNvcmQoKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gICAgICBQbGF5YmFjawogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTY3NCw3ICsxNzU2LDcgQEAKICAgICAgICAgLy8gbVN0cmVhbVR5cGVzW10gaW5pdGlhbGl6ZWQgaW4gY29uc3RydWN0b3IgYm9keQogICAgICAgICBtVHJhY2tzKHR5cGUgPT0gTUlYRVIpLAogICAgICAgICBtT3V0cHV0KG91dHB1dCksCi0gICAgICAgIG1MYXN0V3JpdGVUaW1lKC0xKSwgbU51bVdyaXRlcygwKSwgbU51bURlbGF5ZWRXcml0ZXMoMCksIG1JbldyaXRlKGZhbHNlKSwKKyAgICAgICAgbU51bVdyaXRlcygwKSwgbU51bURlbGF5ZWRXcml0ZXMoMCksIG1JbldyaXRlKGZhbHNlKSwKICAgICAgICAgbU1peGVyU3RhdHVzKE1JWEVSX0lETEUpLAogICAgICAgICBtTWl4ZXJTdGF0dXNJZ25vcmluZ0Zhc3RUcmFja3MoTUlYRVJfSURMRSksCiAgICAgICAgIG1TdGFuZGJ5RGVsYXlOcyhBdWRpb0ZsaW5nZXI6Om1TdGFuZGJ5VGltZUluTnNlY3MpLApAQCAtMTcwOSwxMCArMTc5MSwyMSBAQAogICAgICAgICBpZiAobU91dHB1dC0+YXVkaW9Id0Rldi0+Y2FuU2V0TWFzdGVyTXV0ZSgpKSB7CiAgICAgICAgICAgICBtTWFzdGVyTXV0ZSA9IGZhbHNlOwogICAgICAgICB9CisgICAgICAgIG1Jc01zZERldmljZSA9IHN0cmNtcCgKKyAgICAgICAgICAgICAgICBtT3V0cHV0LT5hdWRpb0h3RGV2LT5tb2R1bGVOYW1lKCksIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpID09IDA7CiAgICAgfQogCiAgICAgcmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpOwogCisgICAgLy8gVE9ETzogV2UgbWF5IGFsc28gbWF0Y2ggb24gYWRkcmVzcyBhcyB3ZWxsIGFzIGRldmljZSB0eXBlIGZvcgorICAgIC8vIEFVRElPX0RFVklDRV9PVVRfQlVTLCBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQLCBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgKKyAgICBpZiAodHlwZSA9PSBNSVhFUiB8fCB0eXBlID09IERJUkVDVCkgeworICAgICAgICBtVGltZXN0YW1wQ29ycmVjdGVkRGV2aWNlcyA9IChhdWRpb19kZXZpY2VzX3QpcHJvcGVydHlfZ2V0X2ludDY0KAorICAgICAgICAgICAgICAgICJhdWRpby50aW1lc3RhbXAuY29ycmVjdGVkX291dHB1dF9kZXZpY2VzIiwKKyAgICAgICAgICAgICAgICAoaW50NjRfdCkobUlzTXNkRGV2aWNlID8gQVVESU9fREVWSUNFX09VVF9CVVMgLy8gdHVybiBvbiBieSBkZWZhdWx0IGZvciBNU0QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVVESU9fREVWSUNFX05PTkUpKTsKKyAgICB9CisKICAgICAvLyArKyBvcGVyYXRvciBkb2VzIG5vdCBjb21waWxlCiAgICAgZm9yIChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IEFVRElPX1NUUkVBTV9NSU47IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsKICAgICAgICAgICAgIHN0cmVhbSA9IChhdWRpb19zdHJlYW1fdHlwZV90KSAoc3RyZWFtICsgMSkpIHsKQEAgLTE3MzIsMTYgKzE4MjUsMjQgQEAKICAgICBmcmVlKG1FZmZlY3RCdWZmZXIpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQorLy8gVGhyZWFkIHZpcnR1YWxzCisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6b25GaXJzdFJlZigpCiB7Ci0gICAgZHVtcEludGVybmFscyhmZCwgYXJncyk7Ci0gICAgZHVtcFRyYWNrcyhmZCwgYXJncyk7Ci0gICAgZHVtcEVmZmVjdENoYWlucyhmZCwgYXJncyk7Ci0gICAgZHByaW50ZihmZCwgIiAgTG9jYWwgbG9nOlxuIik7Ci0gICAgbUxvY2FsTG9nLmR1bXAoZmQsICIgICAiIC8qIHByZWZpeCAqLywgNDAgLyogbGluZXMgKi8pOworICAgIHJ1bihtVGhyZWFkTmFtZSwgQU5EUk9JRF9QUklPUklUWV9VUkdFTlRfQVVESU8pOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQorLy8gVGhyZWFkQmFzZSB2aXJ0dWFscwordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpwcmVFeGl0KCkKK3sKKyAgICBBTE9HVigiICBwcmVFeGl0KCkiKTsKKyAgICAvLyBGSVhNRSB0aGlzIGlzIHVzaW5nIGhhcmQtY29kZWQgc3RyaW5ncyBidXQgaW4gdGhlIGZ1dHVyZSwgdGhpcyBmdW5jdGlvbmFsaXR5IHdpbGwgYmUKKyAgICAvLyAgICAgICBjb252ZXJ0ZWQgdG8gdXNlIGF1ZGlvIEhBTCBleHRlbnNpb25zIHJlcXVpcmVkIHRvIHN1cHBvcnQgdHVubmVsaW5nCisgICAgc3RhdHVzX3QgcmVzdWx0ID0gbU91dHB1dC0+c3RyZWFtLT5zZXRQYXJhbWV0ZXJzKFN0cmluZzgoImV4aXRpbmc9MSIpKTsKKyAgICBBTE9HRV9JRihyZXN1bHQgIT0gT0ssICJFcnJvciB3aGVuIHNldHRpbmcgcGFyYW1ldGVycyBvbiBleGl0OiAlZCIsIHJlc3VsdCk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6ZHVtcFRyYWNrc19sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKICAgICBTdHJpbmc4IHJlc3VsdDsKIApAQCAtMTc3Myw3ICsxODc0LDcgQEAKICAgICBpZiAobnVtdHJhY2tzKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgb2Ygd2hpY2ggJXp1IGFyZSBhY3RpdmVcbiIsIG51bWFjdGl2ZSk7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKLSAgICAgICAgVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKKyAgICAgICAgbVRyYWNrc1swXS0+YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bXRyYWNrczsgKytpKSB7CiAgICAgICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwogICAgICAgICAgICAgaWYgKHRyYWNrICE9IDApIHsKQEAgLTE3OTMsNyArMTg5NCw3IEBACiAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgVGhlIGZvbGxvd2luZyB0cmFja3MgYXJlIGluIHRoZSBhY3RpdmUgbGlzdCBidXQiCiAgICAgICAgICAgICAgICAgIiBub3QgaW4gdGhlIHRyYWNrIGxpc3RcbiIpOwogICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7Ci0gICAgICAgIFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CisgICAgICAgIG1BY3RpdmVUcmFja3NbMF0tPmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1hY3RpdmU7ICsraSkgewogICAgICAgICAgICAgc3A8VHJhY2s+IHRyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXTsKICAgICAgICAgICAgIGlmIChtVHJhY2tzLmluZGV4T2YodHJhY2spIDwgMCkgewpAQCAtMTgwNiwxMyArMTkwNywxNCBAQAogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpkdW1wSW50ZXJuYWxzX2woaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewotICAgIGR1bXBCYXNlKGZkLCBhcmdzKTsKLQorICAgIGRwcmludGYoZmQsICIgIE1hc3RlciBtdXRlOiAlc1xuIiwgbU1hc3Rlck11dGUgPyAib24iIDogIm9mZiIpOworICAgIGlmIChtSGFwdGljQ2hhbm5lbE1hc2sgIT0gQVVESU9fQ0hBTk5FTF9OT05FKSB7CisgICAgICAgIGRwcmludGYoZmQsICIgIEhhcHRpYyBjaGFubmVsIG1hc2s6ICUjeCAoJXMpXG4iLCBtSGFwdGljQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tUb1N0cmluZyhtSGFwdGljQ2hhbm5lbE1hc2ssIHRydWUgLyogb3V0cHV0ICovKS5jX3N0cigpKTsKKyAgICB9CiAgICAgZHByaW50ZihmZCwgIiAgTm9ybWFsIGZyYW1lIGNvdW50OiAlenVcbiIsIG1Ob3JtYWxGcmFtZUNvdW50KTsKLSAgICBkcHJpbnRmKGZkLCAiICBMYXN0IHdyaXRlIG9jY3VycmVkIChtc2Vjcyk6ICVsbHVcbiIsCi0gICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBuczJtcyhzeXN0ZW1UaW1lKCkgLSBtTGFzdFdyaXRlVGltZSkpOwogICAgIGRwcmludGYoZmQsICIgIFRvdGFsIHdyaXRlczogJWRcbiIsIG1OdW1Xcml0ZXMpOwogICAgIGRwcmludGYoZmQsICIgIERlbGF5ZWQgd3JpdGVzOiAlZFxuIiwgbU51bURlbGF5ZWRXcml0ZXMpOwogICAgIGRwcmludGYoZmQsICIgIEJsb2NrZWQgaW4gd3JpdGU6ICVzXG4iLCBtSW5Xcml0ZSA/ICJ5ZXMiIDogIm5vIik7CkBAIC0xODI1LDcgKzE5MjcsNyBAQAogICAgIEF1ZGlvU3RyZWFtT3V0ICpvdXRwdXQgPSBtT3V0cHV0OwogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gb3V0cHV0ICE9IE5VTEwgPyBvdXRwdXQtPmZsYWdzIDogQVVESU9fT1VUUFVUX0ZMQUdfTk9ORTsKICAgICBkcHJpbnRmKGZkLCAiICBBdWRpb1N0cmVhbU91dDogJXAgZmxhZ3MgJSN4ICglcylcbiIsCi0gICAgICAgICAgICBvdXRwdXQsIGZsYWdzLCBvdXRwdXRGbGFnc1RvU3RyaW5nKGZsYWdzKS5jX3N0cigpKTsKKyAgICAgICAgICAgIG91dHB1dCwgZmxhZ3MsIHRvU3RyaW5nKGZsYWdzKS5jX3N0cigpKTsKICAgICBkcHJpbnRmKGZkLCAiICBGcmFtZXMgd3JpdHRlbjogJWxsZFxuIiwgKGxvbmcgbG9uZyltRnJhbWVzV3JpdHRlbik7CiAgICAgZHByaW50ZihmZCwgIiAgU3VzcGVuZGVkIGZyYW1lczogJWxsZFxuIiwgKGxvbmcgbG9uZyltU3VzcGVuZGVkRnJhbWVzKTsKICAgICBpZiAobVBpcGVTaW5rLmdldCgpICE9IG51bGxwdHIpIHsKQEAgLTE4MzcsMjMgKzE5MzksNiBAQAogICAgIH0KIH0KIAotLy8gVGhyZWFkIHZpcnR1YWxzCi0KLXZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6b25GaXJzdFJlZigpCi17Ci0gICAgcnVuKG1UaHJlYWROYW1lLCBBTkRST0lEX1BSSU9SSVRZX1VSR0VOVF9BVURJTyk7Ci19Ci0KLS8vIFRocmVhZEJhc2UgdmlydHVhbHMKLXZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6cHJlRXhpdCgpCi17Ci0gICAgQUxPR1YoIiAgcHJlRXhpdCgpIik7Ci0gICAgLy8gRklYTUUgdGhpcyBpcyB1c2luZyBoYXJkLWNvZGVkIHN0cmluZ3MgYnV0IGluIHRoZSBmdXR1cmUsIHRoaXMgZnVuY3Rpb25hbGl0eSB3aWxsIGJlCi0gICAgLy8gICAgICAgY29udmVydGVkIHRvIHVzZSBhdWRpbyBIQUwgZXh0ZW5zaW9ucyByZXF1aXJlZCB0byBzdXBwb3J0IHR1bm5lbGluZwotICAgIHN0YXR1c190IHJlc3VsdCA9IG1PdXRwdXQtPnN0cmVhbS0+c2V0UGFyYW1ldGVycyhTdHJpbmc4KCJleGl0aW5nPTEiKSk7Ci0gICAgQUxPR0VfSUYocmVzdWx0ICE9IE9LLCAiRXJyb3Igd2hlbiBzZXR0aW5nIHBhcmFtZXRlcnMgb24gZXhpdDogJWQiLCByZXN1bHQpOwotfQotCiAvLyBQbGF5YmFja1RocmVhZDo6Y3JlYXRlVHJhY2tfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCiBzcDxBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjaz4gQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Y3JlYXRlVHJhY2tfbCgKICAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpDbGllbnQ+JiBjbGllbnQsCkBAIC0xODY5LDYgKzE5NTQsNyBAQAogICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkQnVmZmVyLAogICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAqZmxhZ3MsCisgICAgICAgIHBpZF90IGNyZWF0b3JQaWQsCiAgICAgICAgIHBpZF90IHRpZCwKICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICBzdGF0dXNfdCAqc3RhdHVzLApAQCAtMTg4MCwxMSArMTk2NiwxNyBAQAogICAgIHN0YXR1c190IGxTdGF0dXM7CiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3Qgb3V0cHV0RmxhZ3MgPSBtT3V0cHV0LT5mbGFnczsKICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCByZXF1ZXN0ZWRGbGFncyA9ICpmbGFnczsKKyAgICB1aW50MzJfdCBzYW1wbGVSYXRlOworCisgICAgaWYgKHNoYXJlZEJ1ZmZlciAhPSAwICYmIGNoZWNrSU1lbW9yeShzaGFyZWRCdWZmZXIpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CiAKICAgICBpZiAoKnBTYW1wbGVSYXRlID09IDApIHsKICAgICAgICAgKnBTYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CiAgICAgfQotICAgIHVpbnQzMl90IHNhbXBsZVJhdGUgPSAqcFNhbXBsZVJhdGU7CisgICAgc2FtcGxlUmF0ZSA9ICpwU2FtcGxlUmF0ZTsKIAogICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgRkFTVCBmbGFnIGNvbnNpZGVyZWQgT0sgaWYgZmFzdCBtaXhlciBpcyBwcmVzZW50CiAgICAgaWYgKGhhc0Zhc3RNaXhlcigpKSB7CkBAIC0xOTA1LDcgKzE5OTcsNyBAQAogICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpICYmCiAgICAgICAgICAgICAvLyBUT0RPOiBleHRyYWN0IGFzIGEgZGF0YSBsaWJyYXJ5IGZ1bmN0aW9uIHRoYXQgY2hlY2tzIHRoYXQgYSBjb21wdXRhdGlvbmFsbHkKICAgICAgICAgICAgIC8vIGV4cGVuc2l2ZSBkb3dubWl4ZXIgaXMgbm90IHJlcXVpcmVkOiBpc0Zhc3RPdXRwdXRDaGFubmVsQ29udmVyc2lvbigpCi0gICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gbUNoYW5uZWxNYXNrIHx8CisgICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gKG1DaGFubmVsTWFzayB8IG1IYXB0aWNDaGFubmVsTWFzaykgfHwKICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxNYXNrICE9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyB8fAogICAgICAgICAgICAgICAgICAgICAoY2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICYmIG1DaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8gKi8pKSAmJgpAQCAtMjA0Myw5ICsyMTM1LDE1IEBACiAgICAgICAgICAgICAvLyBub3RpZnkgZXZlcnkgSEFMIGJ1ZmZlciwgcmVnYXJkbGVzcyBvZiB0aGUgc2l6ZSBvZiB0aGUgdHJhY2sgYnVmZmVyCiAgICAgICAgICAgICBtYXhOb3RpZmljYXRpb25GcmFtZXMgPSBtRnJhbWVDb3VudDsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEZvciBub3JtYWwgdHJhY2tzLCB1c2UgYXQgbGVhc3QgZG91YmxlLWJ1ZmZlcmluZyBpZiBubyBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uLAotICAgICAgICAgICAgLy8gb3IgYXQgbGVhc3QgdHJpcGxlLWJ1ZmZlcmluZyBpZiB0aGVyZSBpcyBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uCi0gICAgICAgICAgICBjb25zdCBpbnQgbkJ1ZmZlcmluZyA9IHNhbXBsZVJhdGUgPT0gbVNhbXBsZVJhdGUgPyAyIDogMzsKKyAgICAgICAgICAgIC8vIFRyaXBsZSBidWZmZXIgdGhlIG5vdGlmaWNhdGlvbiBwZXJpb2QgZm9yIGEgdHJpcGxlIGJ1ZmZlcmVkIG1peGVyIHBlcmlvZDsKKyAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgZG91YmxlIGJ1ZmZlcmluZyBmb3IgdGhlIG5vdGlmaWNhdGlvbiBwZXJpb2QgaXMgZmluZS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUT0RPOiBUaGlzIHNob3VsZCBiZSBtb3ZlZCB0byBBdWRpb1RyYWNrIHRvIG1vZGlmeSB0aGUgbm90aWZpY2F0aW9uIHBlcmlvZAorICAgICAgICAgICAgLy8gb24gQXVkaW9UcmFjazo6c2V0QnVmZmVyU2l6ZUluRnJhbWVzKCkgY2hhbmdlcy4KKyAgICAgICAgICAgIGNvbnN0IGludCBuQnVmZmVyaW5nID0KKyAgICAgICAgICAgICAgICAgICAgKHVpbnQ2NF90e2ZyYW1lQ291bnR9ICogbVNhbXBsZVJhdGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyAodWludDY0X3R7bU5vcm1hbEZyYW1lQ291bnR9ICogc2FtcGxlUmF0ZSkgPT0gMyA/IDMgOiAyOworCiAgICAgICAgICAgICBtYXhOb3RpZmljYXRpb25GcmFtZXMgPSBmcmFtZUNvdW50IC8gbkJ1ZmZlcmluZzsKICAgICAgICAgICAgIC8vIElmIGNsaWVudCByZXF1ZXN0ZWQgYSBmYXN0IHRyYWNrIGJ1dCB0aGlzIHdhcyBkZW5pZWQsIHRoZW4gdXNlIHRoZSBzbWFsbGVyIG1heGltdW0uCiAgICAgICAgICAgICBpZiAocmVxdWVzdGVkRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19GQVNUKSB7CkBAIC0yMTQwLDcgKzIyMzgsNyBAQAogICAgICAgICB0cmFjayA9IG5ldyBUcmFjayh0aGlzLCBjbGllbnQsIHN0cmVhbVR5cGUsIGF0dHIsIHNhbXBsZVJhdGUsIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogYnVmZmVyICovLCAoc2l6ZV90KTAgLyogYnVmZmVyU2l6ZSAqLywgc2hhcmVkQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHVpZCwgKmZsYWdzLCBUcmFja0Jhc2U6OlRZUEVfREVGQVVMVCwgcG9ydElkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCBjcmVhdG9yUGlkLCB1aWQsICpmbGFncywgVHJhY2tCYXNlOjpUWVBFX0RFRkFVTFQsIHBvcnRJZCk7CiAKICAgICAgICAgbFN0YXR1cyA9IHRyYWNrICE9IDAgPyB0cmFjay0+aW5pdENoZWNrKCkgOiAoc3RhdHVzX3QpIE5PX01FTU9SWTsKICAgICAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKQEAgLTIxNzQsNDggKzIyNzIsMTcgQEAKIH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXNzaXplX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2tzPFQ+OjphZGQoY29uc3Qgc3A8VD4gJnRyYWNrKQotewotICAgIGNvbnN0IHNzaXplX3QgaW5kZXggPSBtVHJhY2tzLmFkZCh0cmFjayk7Ci0gICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgLy8gc2V0IG5hbWUgZm9yIHRyYWNrIHdoZW4gYWRkaW5nLgotICAgICAgICBpbnQgbmFtZTsKLSAgICAgICAgaWYgKG1VbnVzZWRUcmFja05hbWVzLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIG5hbWUgPSBtVHJhY2tzLnNpemUoKSAtIDE7IC8vIG5ldyBuYW1lIHswIC4uLiBzaXplLTF9LgotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gcmV1c2Ugc21hbGxlc3QgbmFtZSBmb3IgZGVsZXRlZCB0cmFjay4KLSAgICAgICAgICAgIGF1dG8gaXQgPSBtVW51c2VkVHJhY2tOYW1lcy5iZWdpbigpOwotICAgICAgICAgICAgbmFtZSA9ICppdDsKLSAgICAgICAgICAgICh2b2lkKW1VbnVzZWRUcmFja05hbWVzLmVyYXNlKGl0KTsKLSAgICAgICAgfQotICAgICAgICB0cmFjay0+c2V0TmFtZShuYW1lKTsKLSAgICB9IGVsc2UgewotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJjYW5ub3QgYWRkIHRyYWNrIik7Ci0gICAgfQotICAgIHJldHVybiBpbmRleDsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KIHNzaXplX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2tzPFQ+OjpyZW1vdmUoY29uc3Qgc3A8VD4gJnRyYWNrKQogewotICAgIGNvbnN0IGludCBuYW1lID0gdHJhY2stPm5hbWUoKTsKKyAgICBjb25zdCBpbnQgdHJhY2tJZCA9IHRyYWNrLT5pZCgpOwogICAgIGNvbnN0IHNzaXplX3QgaW5kZXggPSBtVHJhY2tzLnJlbW92ZSh0cmFjayk7CiAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgLy8gaW52YWxpZGF0ZSBuYW1lIHdoZW4gcmVtb3ZpbmcgZnJvbSBtVHJhY2tzLgotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG5hbWUgPCAwLCAiaW52YWxpZCBuYW1lICVkIGZvciB0cmFjayBvbiBtVHJhY2tzIiwgbmFtZSk7Ci0KLSAgICAgICAgaWYgKG1TYXZlRGVsZXRlZFRyYWNrTmFtZXMpIHsKKyAgICAgICAgaWYgKG1TYXZlRGVsZXRlZFRyYWNrSWRzKSB7CiAgICAgICAgICAgICAvLyBXZSBjYW4ndCBkaXJlY3RseSBhY2Nlc3MgbUF1ZGlvTWl4ZXIgc2luY2UgdGhlIGNhbGxlciBtYXkgYmUgb3V0c2lkZSBvZiB0aHJlYWRMb29wLgotICAgICAgICAgICAgLy8gSW5zdGVhZCwgd2UgYWRkIHRvIG1EZWxldGVkVHJhY2tOYW1lcyB3aGljaCBpcyBzb2xlbHkgdXNlZCBmb3IgbUF1ZGlvTWl4ZXIgdXBkYXRlLAorICAgICAgICAgICAgLy8gSW5zdGVhZCwgd2UgYWRkIHRvIG1EZWxldGVkVHJhY2tJZHMgd2hpY2ggaXMgc29sZWx5IHVzZWQgZm9yIG1BdWRpb01peGVyIHVwZGF0ZSwKICAgICAgICAgICAgIC8vIHRvIGJlIGhhbmRsZWQgd2hlbiBNaXhlclRocmVhZDo6cHJlcGFyZVRyYWNrc19sKCkgbmV4dCBjaGFuZ2VzIG1BdWRpb01peGVyLgotICAgICAgICAgICAgbURlbGV0ZWRUcmFja05hbWVzLmVtcGxhY2UobmFtZSk7CisgICAgICAgICAgICBtRGVsZXRlZFRyYWNrSWRzLmVtcGxhY2UodHJhY2tJZCk7CiAgICAgICAgIH0KLQotICAgICAgICBtVW51c2VkVHJhY2tOYW1lcy5lbXBsYWNlKG5hbWUpOwotICAgICAgICB0cmFjay0+c2V0TmFtZShUOjpUUkFDS19OQU1FX1BFTkRJTkcpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobmFtZSA+PSAwLAotICAgICAgICAgICAgICAgICJ2YWxpZCBuYW1lICVkIGZvciB0cmFjayBub3QgaW4gbVRyYWNrcyAocmV0dXJuZWQgJXpkKSIsIG5hbWUsIGluZGV4KTsKICAgICB9CiAgICAgcmV0dXJuIGluZGV4OwogfQpAQCAtMjI1MSw2ICsyMzE4LDExIEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnNldE1hc3RlckJhbGFuY2UoZmxvYXQgYmFsYW5jZSkKK3sKKyAgICBtTWFzdGVyQmFsYW5jZS5zdG9yZShiYWxhbmNlKTsKK30KKwogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpzZXRNYXN0ZXJNdXRlKGJvb2wgbXV0ZWQpCiB7CiAgICAgaWYgKGlzRHVwbGljYXRpbmcoKSkgewpAQCAtMjI4Niw2ICsyMzU4LDExIEBACiAgICAgcmV0dXJuIG1TdHJlYW1UeXBlc1tzdHJlYW1dLnZvbHVtZTsKIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpzZXRWb2x1bWVGb3JPdXRwdXRfbChmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgY29uc3QKK3sKKyAgICBtT3V0cHV0LT5zdHJlYW0tPnNldFZvbHVtZShsZWZ0LCByaWdodCk7Cit9CisKIC8vIGFkZFRyYWNrX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmFkZFRyYWNrX2woY29uc3Qgc3A8VHJhY2s+JiB0cmFjaykKIHsKQEAgLTIyOTgsMTUgKzIzNzUsMTMgQEAKICAgICAgICAgaWYgKHRyYWNrLT5pc0V4dGVybmFsVHJhY2soKSkgewogICAgICAgICAgICAgVHJhY2tCYXNlOjp0cmFja19zdGF0ZSBzdGF0ZSA9IHRyYWNrLT5tU3RhdGU7CiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzdGFydE91dHB1dChtSWQsIHRyYWNrLT5zdHJlYW1UeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzdGFydE91dHB1dCh0cmFjay0+cG9ydElkKCkpOwogICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgLy8gYWJvcnQgdHJhY2sgd2FzIHN0b3BwZWQvcGF1c2VkIHdoaWxlIHdlIHJlbGVhc2VkIHRoZSBsb2NrCiAgICAgICAgICAgICBpZiAoc3RhdGUgIT0gdHJhY2stPm1TdGF0ZSkgewogICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KG1JZCwgdHJhY2stPnN0cmVhbVR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQodHJhY2stPnBvcnRJZCgpKTsKICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0yMzE5LDYgKzIzOTQsNyBAQAogICAgICAgICAgICAgLy8gdG8gdHJhY2sgdGhlIHNwZWFrZXIgdXNhZ2UKICAgICAgICAgICAgIGFkZEJhdHRlcnlEYXRhKElNZWRpYVBsYXllclNlcnZpY2U6OmtCYXR0ZXJ5RGF0YUF1ZGlvRmxpbmdlclN0YXJ0KTsKICNlbmRpZgorICAgICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBVURJT19DTElFTlRfU1RBUlRFRCwgdHJhY2stPmNyZWF0b3JQaWQoKSwgdHJhY2stPnBvcnRJZCgpKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIHNldCByZXRyeSBjb3VudCBmb3IgYnVmZmVyIGZpbGwKQEAgLTIzMzUsNiArMjQxMSwyNSBAQAogICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2hhcmVkQnVmZmVyKCkgIT0gMCA/IFRyYWNrOjpGU19GSUxMRUQgOiBUcmFjazo6RlNfRklMTElORzsKICAgICAgICAgfQogCisgICAgICAgIGlmICgodHJhY2stPmNoYW5uZWxNYXNrKCkgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpICE9IEFVRElPX0NIQU5ORUxfTk9ORQorICAgICAgICAgICAgICAgICYmIG1IYXB0aWNDaGFubmVsTWFzayAhPSBBVURJT19DSEFOTkVMX05PTkUpIHsKKyAgICAgICAgICAgIC8vIFVubG9jayBkdWUgdG8gVmlicmF0b3JTZXJ2aWNlIHdpbGwgbG9jayBmb3IgdGhpcyBjYWxsIGFuZCB3aWxsCisgICAgICAgICAgICAvLyBjYWxsIFRyYWNrcy5tdXRlL3VubXV0ZSB3aGljaCBhbHNvIHJlcXVpcmUgdGhyZWFkJ3MgbG9jay4KKyAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgY29uc3QgaW50IGludGVuc2l0eSA9IEF1ZGlvRmxpbmdlcjo6b25FeHRlcm5hbFZpYnJhdGlvblN0YXJ0KAorICAgICAgICAgICAgICAgICAgICB0cmFjay0+Z2V0RXh0ZXJuYWxWaWJyYXRpb24oKSk7CisgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICB0cmFjay0+c2V0SGFwdGljSW50ZW5zaXR5KHN0YXRpY19jYXN0PEF1ZGlvTWl4ZXI6OmhhcHRpY19pbnRlbnNpdHlfdD4oaW50ZW5zaXR5KSk7CisgICAgICAgICAgICAvLyBIYXB0aWMgcGxheWJhY2sgc2hvdWxkIGJlIGVuYWJsZWQgYnkgdmlicmF0b3Igc2VydmljZS4KKyAgICAgICAgICAgIGlmICh0cmFjay0+Z2V0SGFwdGljUGxheWJhY2tFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIGhhcHRpYyBwbGF5YmFjayBvZiBhbGwgYWN0aXZlIHRyYWNrIHRvIGVuc3VyZSBvbmx5CisgICAgICAgICAgICAgICAgLy8gb25lIHRyYWNrIHBsYXlpbmcgaGFwdGljIGlmIGN1cnJlbnQgdHJhY2sgc2hvdWxkIHBsYXkgaGFwdGljLgorICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmdCA6IG1BY3RpdmVUcmFja3MpIHsKKyAgICAgICAgICAgICAgICAgICAgdC0+c2V0SGFwdGljUGxheWJhY2tFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICB0cmFjay0+bVJlc2V0RG9uZSA9IGZhbHNlOwogICAgICAgICB0cmFjay0+bVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzID0gMDsKICAgICAgICAgbUFjdGl2ZVRyYWNrcy5hZGQodHJhY2spOwpAQCAtMjQwMCw3ICsyNDk1LDE2IEBACiAgICAgcmV0dXJuIFN0cmluZzgoKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjppb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQpIHsKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobU91dHB1dCA9PSBudWxscHRyIHx8IG1PdXRwdXQtPnN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbU91dHB1dC0+c3RyZWFtLT5zZWxlY3RQcmVzZW50YXRpb24ocHJlc2VudGF0aW9uSWQsIHByb2dyYW1JZCk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6aW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpIHsKICAgICBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gZGVzYyA9IG5ldyBBdWRpb0lvRGVzY3JpcHRvcigpOwogICAgIEFMT0dWKCJQbGF5YmFja1RocmVhZDo6aW9Db25maWdDaGFuZ2VkLCB0aHJlYWQgJXAsIGV2ZW50ICVkIiwgdGhpcywgZXZlbnQpOwogCkBAIC0yNDE5LDcgKzI1MjMsMTAgQEAKICAgICAgICAgZGVzYy0+bUZyYW1lQ291bnRIQUwgPSBtRnJhbWVDb3VudDsKICAgICAgICAgZGVzYy0+bUxhdGVuY3kgPSBsYXRlbmN5X2woKTsKICAgICAgICAgYnJlYWs7Ci0KKyAgICBjYXNlIEFVRElPX0NMSUVOVF9TVEFSVEVEOgorICAgICAgICBkZXNjLT5tUGF0Y2ggPSBtUGF0Y2g7CisgICAgICAgIGRlc2MtPm1Qb3J0SWQgPSBwb3J0SWQ7CisgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVVESU9fT1VUUFVUX0NMT1NFRDoKICAgICBkZWZhdWx0OgogICAgICAgICBicmVhazsKQEAgLTI0NTcsNiArMjU2NCwxMSBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgLy8gcmVqZWN0IG91dCBvZiBzZXF1ZW5jZSByZXF1ZXN0cwogICAgIGlmICgobURyYWluU2VxdWVuY2UgJiAxKSAmJiAoc2VxdWVuY2UgPT0gbURyYWluU2VxdWVuY2UpKSB7CisgICAgICAgIC8vIFJlZ2lzdGVyIGRpc2NvbnRpbnVpdHkgd2hlbiBIVyBkcmFpbiBpcyBjb21wbGV0ZWQgYmVjYXVzZSB0aGF0IGNhbiBjYXVzZQorICAgICAgICAvLyB0aGUgdGltZXN0YW1wIGZyYW1lIHBvc2l0aW9uIHRvIHJlc2V0IHRvIDAgZm9yIGRpcmVjdCBhbmQgb2ZmbG9hZCB0aHJlYWRzLgorICAgICAgICAvLyAoT3V0IG9mIHNlcXVlbmNlIHJlcXVlc3RzIGFyZSBpZ25vcmVkLCBzaW5jZSB0aGUgZGlzY29udGludWl0eSB3b3VsZCBiZSBoYW5kbGVkCisgICAgICAgIC8vIGVsc2V3aGVyZSwgZS5nLiBpbiBmbHVzaCkuCisgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7CiAgICAgICAgIG1EcmFpblNlcXVlbmNlICY9IH4xOwogICAgICAgICBtV2FpdFdvcmtDVi5zaWduYWwoKTsKICAgICB9CkBAIC0yNDc2LDYgKzI1ODgsNyBAQAogICAgICAgICAgICAgICAgIG1DaGFubmVsTWFzayk7CiAgICAgfQogICAgIG1DaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2sobUNoYW5uZWxNYXNrKTsKKyAgICBtQmFsYW5jZS5zZXRDaGFubmVsTWFzayhtQ2hhbm5lbE1hc2spOwogCiAgICAgLy8gR2V0IGFjdHVhbCBIQUwgZm9ybWF0LgogICAgIHN0YXR1c190IHJlc3VsdCA9IG1PdXRwdXQtPnN0cmVhbS0+Z2V0Rm9ybWF0KCZtSEFMRm9ybWF0KTsKQEAgLTI1OTUsNyArMjcwOCw3IEBACiAgICAgZnJlZShtTWl4ZXJCdWZmZXIpOwogICAgIG1NaXhlckJ1ZmZlciA9IE5VTEw7CiAgICAgaWYgKG1NaXhlckJ1ZmZlckVuYWJsZWQpIHsKLSAgICAgICAgbU1peGVyQnVmZmVyRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsgLy8gYWxzbyB2YWxpZDogQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCisgICAgICAgIG1NaXhlckJ1ZmZlckZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7IC8vIG5vIGxvbmdlciB2YWxpZDogQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCiAgICAgICAgIG1NaXhlckJ1ZmZlclNpemUgPSBtTm9ybWFsRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQKICAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobU1peGVyQnVmZmVyRm9ybWF0KTsKICAgICAgICAgKHZvaWQpcG9zaXhfbWVtYWxpZ24oJm1NaXhlckJ1ZmZlciwgMzIsIG1NaXhlckJ1ZmZlclNpemUpOwpAQCAtMjYwOSw2ICsyNzIyLDExIEBACiAgICAgICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtRWZmZWN0QnVmZmVyLCAzMiwgbUVmZmVjdEJ1ZmZlclNpemUpOwogICAgIH0KIAorICAgIG1IYXB0aWNDaGFubmVsTWFzayA9IG1DaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKKyAgICBtQ2hhbm5lbE1hc2sgJj0gfm1IYXB0aWNDaGFubmVsTWFzazsKKyAgICBtSGFwdGljQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1IYXB0aWNDaGFubmVsTWFzayk7CisgICAgbUNoYW5uZWxDb3VudCAtPSBtSGFwdGljQ2hhbm5lbENvdW50OworCiAgICAgLy8gZm9yY2UgcmVjb25maWd1cmF0aW9uIG9mIGVmZmVjdCBjaGFpbnMgYW5kIGVuZ2luZXMgdG8gdGFrZSBuZXcgYnVmZmVyIHNpemUgYW5kIGF1ZGlvCiAgICAgLy8gcGFyYW1ldGVycyBpbnRvIGFjY291bnQKICAgICAvLyBOb3RlIHRoYXQgbUxvY2sgaXMgbm90IGhlbGQgd2hlbiByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCkgaXMgY2FsbGVkIGZyb20gdGhlIGNvbnN0cnVjdG9yCkBAIC0yNjE3LDcgKzI3MzUsOCBAQAogICAgIC8vIGNyZWF0ZSBhIGNvcHkgb2YgbUVmZmVjdENoYWlucyBhcyBjYWxsaW5nIG1vdmVFZmZlY3RDaGFpbl9sKCkgY2FuIHJlb3JkZXIgc29tZSBlZmZlY3QgY2hhaW5zCiAgICAgVmVjdG9yPCBzcDxFZmZlY3RDaGFpbj4gPiBlZmZlY3RDaGFpbnMgPSBtRWZmZWN0Q2hhaW5zOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0Q2hhaW5zLnNpemUoKTsgaSArKykgewotICAgICAgICBtQXVkaW9GbGluZ2VyLT5tb3ZlRWZmZWN0Q2hhaW5fbChlZmZlY3RDaGFpbnNbaV0tPnNlc3Npb25JZCgpLCB0aGlzLCB0aGlzLCBmYWxzZSk7CisgICAgICAgIG1BdWRpb0ZsaW5nZXItPm1vdmVFZmZlY3RDaGFpbl9sKGVmZmVjdENoYWluc1tpXS0+c2Vzc2lvbklkKCksCisgICAgICAgICAgICB0aGlzLyogc3JjVGhyZWFkICovLCB0aGlzLyogZHN0VGhyZWFkICovKTsKICAgICB9CiB9CiAKQEAgLTI2NzcsMjggKzI3OTYsNiBAQAogICAgIH0KIH0KIAotLy8gaGFzQXVkaW9TZXNzaW9uX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKLXVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Omhhc0F1ZGlvU2Vzc2lvbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpIGNvbnN0Ci17Ci0gICAgdWludDMyX3QgcmVzdWx0ID0gMDsKLSAgICBpZiAoZ2V0RWZmZWN0Q2hhaW5fbChzZXNzaW9uSWQpICE9IDApIHsKLSAgICAgICAgcmVzdWx0ID0gRUZGRUNUX1NFU1NJT047Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJhY2tzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHNwPFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07Ci0gICAgICAgIGlmIChzZXNzaW9uSWQgPT0gdHJhY2stPnNlc3Npb25JZCgpICYmICF0cmFjay0+aXNJbnZhbGlkKCkpIHsKLSAgICAgICAgICAgIHJlc3VsdCB8PSBUUkFDS19TRVNTSU9OOwotICAgICAgICAgICAgaWYgKHRyYWNrLT5pc0Zhc3RUcmFjaygpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0IHw9IEZBU1RfU0VTU0lPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQogdWludDMyX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Z2V0U3RyYXRlZ3lGb3JTZXNzaW9uX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkKIHsKICAgICAvLyBzZXNzaW9uIEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCBpcyBwbGFjZWQgaW4gc2FtZSBzdHJhdGVneSBhcyBNVVNJQyBzdHJlYW0gc28gdGhhdApAQCAtMjc3NiwyNCArMjg3MywxOCBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjp0aHJlYWRMb29wX3JlbW92ZVRyYWNrcygKICAgICAgICAgY29uc3QgVmVjdG9yPCBzcDxUcmFjaz4gPiYgdHJhY2tzVG9SZW1vdmUpCiB7Ci0gICAgc2l6ZV90IGNvdW50ID0gdHJhY2tzVG9SZW1vdmUuc2l6ZSgpOwotICAgIGlmIChjb3VudCA+IDApIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDAgOyBpIDwgY291bnQgOyBpKyspIHsKLSAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrPiYgdHJhY2sgPSB0cmFja3NUb1JlbW92ZS5pdGVtQXQoaSk7Ci0gICAgICAgICAgICBpZiAodHJhY2stPmlzRXh0ZXJuYWxUcmFjaygpKSB7Ci0gICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQobUlkLCB0cmFjay0+c3RyZWFtVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgLy8gTWlzY2VsbGFuZW91cyB0cmFjayBjbGVhbnVwIHdoZW4gcmVtb3ZlZCBmcm9tIHRoZSBhY3RpdmUgbGlzdCwKKyAgICAvLyBjYWxsZWQgd2l0aG91dCBUaHJlYWQgbG9jayBidXQgc3luY2hyb25pemVkIHdpdGggdGhyZWFkTG9vcCBwcm9jZXNzaW5nLgogI2lmZGVmIEFERF9CQVRURVJZX0RBVEEKLSAgICAgICAgICAgICAgICAvLyB0byB0cmFjayB0aGUgc3BlYWtlciB1c2FnZQotICAgICAgICAgICAgICAgIGFkZEJhdHRlcnlEYXRhKElNZWRpYVBsYXllclNlcnZpY2U6OmtCYXR0ZXJ5RGF0YUF1ZGlvRmxpbmdlclN0b3ApOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChtSWQsIHRyYWNrLT5zdHJlYW1UeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zZXNzaW9uSWQoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYgdHJhY2sgOiB0cmFja3NUb1JlbW92ZSkgeworICAgICAgICBpZiAodHJhY2stPmlzRXh0ZXJuYWxUcmFjaygpKSB7CisgICAgICAgICAgICAvLyB0byB0cmFjayB0aGUgc3BlYWtlciB1c2FnZQorICAgICAgICAgICAgYWRkQmF0dGVyeURhdGEoSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhQXVkaW9GbGluZ2VyU3RvcCk7CiAgICAgICAgIH0KICAgICB9CisjZWxzZQorICAgICh2b2lkKXRyYWNrc1RvUmVtb3ZlOyAvLyBzdXBwcmVzcyB1bnVzZWQgd2FybmluZworI2VuZGlmCiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Y2hlY2tTaWxlbnRNb2RlX2woKQpAQCAtMjg0NSw2ICsyOTM2LDkgQEAKICAgICAgICAgQVRSQUNFX0VORCgpOwogICAgICAgICBpZiAoZnJhbWVzV3JpdHRlbiA+IDApIHsKICAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGZyYW1lc1dyaXR0ZW4gKiBtRnJhbWVTaXplOworI2lmZGVmIFRFRV9TSU5LCisgICAgICAgICAgICBtVGVlLndyaXRlKChjaGFyICopbVNpbmtCdWZmZXIgKyBvZmZzZXQsIGZyYW1lc1dyaXR0ZW4pOworI2VuZGlmCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSBmcmFtZXNXcml0dGVuOwogICAgICAgICB9CkBAIC0yOTg0LDcgKzMwNzgsNyBAQAogICAgICAgICAvLyBPbmx5IG9uZSBlZmZlY3QgY2hhaW4gY2FuIGJlIHByZXNlbnQgaW4gZGlyZWN0IG91dHB1dCB0aHJlYWQgYW5kIGl0IHVzZXMKICAgICAgICAgLy8gdGhlIHNpbmsgYnVmZmVyIGFzIGlucHV0CiAgICAgICAgIGlmIChtVHlwZSAhPSBESVJFQ1QpIHsKLSAgICAgICAgICAgIHNpemVfdCBudW1TYW1wbGVzID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50OworICAgICAgICAgICAgc2l6ZV90IG51bVNhbXBsZXMgPSBtTm9ybWFsRnJhbWVDb3VudCAqIChtQ2hhbm5lbENvdW50ICsgbUhhcHRpY0NoYW5uZWxDb3VudCk7CiAgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBtQXVkaW9GbGluZ2VyLT5tRWZmZWN0c0ZhY3RvcnlIYWwtPmFsbG9jYXRlQnVmZmVyKAogICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzICogc2l6ZW9mKGVmZmVjdF9idWZmZXJfdCksCiAgICAgICAgICAgICAgICAgICAgICZoYWxJbkJ1ZmZlcik7CkBAIC0zMTI1LDggKzMyMTksOCBAQAogICAgIFZlY3Rvcjwgc3A8VHJhY2s+ID4gdHJhY2tzVG9SZW1vdmU7CiAKICAgICBtU3RhbmRieVRpbWVOcyA9IHN5c3RlbVRpbWUoKTsKLSAgICBuc2Vjc190IGxhc3RXcml0ZUZpbmlzaGVkID0gLTE7IC8vIHRpbWUgbGFzdCBzZXJ2ZXIgd3JpdGUgY29tcGxldGVkCi0gICAgaW50NjRfdCBsYXN0RnJhbWVzV3JpdHRlbiA9IC0xOyAvLyB0cmFjayBjaGFuZ2VzIGluIHRpbWVzdGFtcCBzZXJ2ZXIgZnJhbWVzIHdyaXR0ZW4KKyAgICBpbnQ2NF90IGxhc3RMb29wQ291bnRXcml0dGVuID0gLTI7IC8vIG5ldmVyIG1hdGNoZXMgInByZXZpb3VzIiBsb29wLCB3aGVuIGxvb3BDb3VudCA9IDAuCisgICAgaW50NjRfdCBsYXN0RnJhbWVzV3JpdHRlbiA9IC0xOyAgICAvLyB0cmFjayBjaGFuZ2VzIGluIHRpbWVzdGFtcCBzZXJ2ZXIgZnJhbWVzIHdyaXR0ZW4KIAogICAgIC8vIE1JWEVSCiAgICAgbnNlY3NfdCBsYXN0V2FybmluZyA9IDA7CkBAIC0zMTYyLDcgKzMyNTYsMTggQEAKIAogICAgIGNoZWNrU2lsZW50TW9kZV9sKCk7CiAKLSAgICB3aGlsZSAoIWV4aXRQZW5kaW5nKCkpCisgICAgLy8gRElSRUNUIGFuZCBPRkZMT0FEIHRocmVhZHMgc2hvdWxkIHJlc2V0IGZyYW1lIGNvdW50IHRvIHplcm8gb24gc3RvcC9mbHVzaAorICAgIC8vIFRPRE86IGFkZCBjb25maXJtYXRpb24gY2hlY2tzOgorICAgIC8vIDEpIERJUkVDVCB0aHJlYWRzIGFuZCBsaW5lYXIgUENNIGZvcm1hdCByZWFsbHkgcmVzZXRzIHRvIDA/CisgICAgLy8gMikgSXMgZnJhbWUgY291bnQgcmVhbGx5IHZhbGlkIGlmIG5vdCBsaW5lYXIgcGNtPworICAgIC8vIDMpIEFyZSBhbGwgNjQgYml0cyBvZiBwb3NpdGlvbiByZXR1cm5lZCwgbm90IGp1c3QgbG93ZXN0IDMyIGJpdHM/CisgICAgaWYgKG1UeXBlID09IE9GRkxPQUQgfHwgbVR5cGUgPT0gRElSRUNUKSB7CisgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5zZXREaXNjb250aW51aXR5TW9kZShtVGltZXN0YW1wVmVyaWZpZXIuRElTQ09OVElOVUlUWV9NT0RFX1pFUk8pOworICAgIH0KKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBsYXN0RG93bnN0cmVhbVBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisKKyAgICAvLyBsb29wQ291bnQgaXMgdXNlZCBmb3Igc3RhdGlzdGljcyBhbmQgZGlhZ25vc3RpY3MuCisgICAgZm9yIChpbnQ2NF90IGxvb3BDb3VudCA9IDA7ICFleGl0UGVuZGluZygpOyArK2xvb3BDb3VudCkKICAgICB7CiAgICAgICAgIC8vIExvZyBtZXJnZSByZXF1ZXN0cyBhcmUgcGVyZm9ybWVkIGR1cmluZyBBdWRpb0ZsaW5nZXIgYmluZGVyIHRyYW5zYWN0aW9ucywgYnV0CiAgICAgICAgIC8vIHRoYXQgZG9lcyBub3QgY292ZXIgYXVkaW8gcGxheWJhY2suIEl0J3MgcmVxdWVzdGVkIGhlcmUgZm9yIHRoYXQgcmVhc29uLgpAQCAtMzE3MSw2ICszMjc2LDUxIEBACiAgICAgICAgIGNwdVN0YXRzLnNhbXBsZShteU5hbWUpOwogCiAgICAgICAgIFZlY3Rvcjwgc3A8RWZmZWN0Q2hhaW4+ID4gZWZmZWN0Q2hhaW5zOworICAgICAgICBhdWRpb19zZXNzaW9uX3QgYWN0aXZlSGFwdGljU2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9OT05FOworICAgICAgICBzdGQ6OnZlY3RvcjxzcDxUcmFjaz4+IGFjdGl2ZVRyYWNrczsKKworICAgICAgICAvLyBJZiB0aGUgZGV2aWNlIGlzIEFVRElPX0RFVklDRV9PVVRfQlVTLCBjaGVjayBmb3IgZG93bnN0cmVhbSBsYXRlbmN5LgorICAgICAgICAvLworICAgICAgICAvLyBOb3RlOiB3ZSBhY2Nlc3Mgb3V0RGV2aWNlKCkgb3V0c2lkZSBvZiBtTG9jay4KKyAgICAgICAgaWYgKGlzTXNkRGV2aWNlKCkgJiYgKG91dERldmljZSgpICYgQVVESU9fREVWSUNFX09VVF9CVVMpICE9IDApIHsKKyAgICAgICAgICAgIC8vIEhlcmUsIHdlIHRyeSBmb3IgdGhlIEFGIGxvY2ssIGJ1dCBkbyBub3QgYmxvY2sgb24gaXQgYXMgdGhlIGxhdGVuY3kKKyAgICAgICAgICAgIC8vIGlzIG1vcmUgaW5mb3JtYXRpb25hbC4KKyAgICAgICAgICAgIGlmIChtQXVkaW9GbGluZ2VyLT5tTG9jay50cnlMb2NrKCkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQYXRjaFBhbmVsOjpTb2Z0d2FyZVBhdGNoPiBzd1BhdGNoZXM7CisgICAgICAgICAgICAgICAgZG91YmxlIGxhdGVuY3lNczsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBkb3duc3RyZWFtUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgICAgICBpZiAobUF1ZGlvRmxpbmdlci0+bVBhdGNoUGFuZWwuZ2V0RG93bnN0cmVhbVNvZnR3YXJlUGF0Y2hlcyhpZCgpLCAmc3dQYXRjaGVzKSA9PSBPSworICAgICAgICAgICAgICAgICAgICAgICAgJiYgc3dQYXRjaGVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN3UGF0Y2hlc1swXS5nZXRMYXRlbmN5TXNfbCgmbGF0ZW5jeU1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRvd25zdHJlYW1QYXRjaEhhbmRsZSA9IHN3UGF0Y2hlc1swXS5nZXRQYXRjaEhhbmRsZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoZG93bnN0cmVhbVBhdGNoSGFuZGxlICE9IGxhc3REb3duc3RyZWFtUGF0Y2hIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgIGxhc3REb3duc3RyZWFtUGF0Y2hIYW5kbGUgPSBkb3duc3RyZWFtUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gdmVyaWZ5IGRvd25zdHJlYW0gbGF0ZW5jeSAod2UgYXNzdW1lIGEgbWF4IHJlYXNvbmFibGUKKyAgICAgICAgICAgICAgICAgICAgLy8gbGF0ZW5jeSBvZiA1IHNlY29uZHMpLgorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgbWluTGF0ZW5jeSA9IDAuLCBtYXhMYXRlbmN5ID0gNTAwMC47CisgICAgICAgICAgICAgICAgICAgIGlmIChsYXRlbmN5TXMgPj0gbWluTGF0ZW5jeSAmJiBsYXRlbmN5TXMgPD0gbWF4TGF0ZW5jeSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm5ldyBkb3duc3RyZWFtIGxhdGVuY3kgJWxmIG1zIiwgbGF0ZW5jeU1zKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJvdXQgb2YgcmFuZ2UgZG93bnN0cmVhbSBsYXRlbmN5ICVsZiBtcyIsIGxhdGVuY3lNcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobGF0ZW5jeU1zIDwgbWluTGF0ZW5jeSkgbGF0ZW5jeU1zID0gbWluTGF0ZW5jeTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxhdGVuY3lNcyA+IG1heExhdGVuY3kpIGxhdGVuY3lNcyA9IG1heExhdGVuY3k7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLmFkZChsYXRlbmN5TXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQXVkaW9GbGluZ2VyLT5tTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChsYXN0RG93bnN0cmVhbVBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgLy8gb3VyIGRldmljZSBpcyBubyBsb25nZXIgQVVESU9fREVWSUNFX09VVF9CVVMsIHJlc2V0IHBhdGNoIGhhbmRsZSBhbmQgc3RhdHMuCisgICAgICAgICAgICAgICAgbURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgbGFzdERvd25zdHJlYW1QYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKICAgICAgICAgeyAvLyBzY29wZSBmb3IgbUxvY2sKIApAQCAtMzE4NSwxNiArMzMzNSw1MSBAQAogICAgICAgICAgICAgICAgIGxvZ1N0cmluZyA9IE5VTEw7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIC8vIENvbGxlY3QgdGltZXN0YW1wIHN0YXRpc3RpY3MgZm9yIHRoZSBQbGF5YmFjayBUaHJlYWQgdHlwZXMgdGhhdCBzdXBwb3J0IGl0LgorICAgICAgICAgICAgaWYgKG1UeXBlID09IE1JWEVSCisgICAgICAgICAgICAgICAgICAgIHx8IG1UeXBlID09IERVUExJQ0FUSU5HCisgICAgICAgICAgICAgICAgICAgIHx8IG1UeXBlID09IERJUkVDVAorICAgICAgICAgICAgICAgICAgICB8fCBtVHlwZSA9PSBPRkZMT0FEKSB7IC8vIG5vIGluZGVudGF0aW9uCiAgICAgICAgICAgICAvLyBHYXRoZXIgdGhlIGZyYW1lc1JlbGVhc2VkIGNvdW50ZXJzIGZvciBhbGwgYWN0aXZlIHRyYWNrcywKICAgICAgICAgICAgIC8vIGFuZCBhc3NvY2lhdGUgd2l0aCB0aGUgc2luayBmcmFtZXMgd3JpdHRlbiBvdXQuICBXZSBuZWVkCiAgICAgICAgICAgICAvLyB0aGlzIHRvIGNvbnZlcnQgdGhlIHNpbmsgdGltZXN0YW1wIHRvIHRoZSB0cmFjayB0aW1lc3RhbXAuCiAgICAgICAgICAgICBib29sIGtlcm5lbExvY2F0aW9uVXBkYXRlID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAobU5vcm1hbFNpbmsgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBEdXBsaWNhdGluZ1RocmVhZCBtYXkgbm90IGhhdmUgYSBtTm9ybWFsU2luay4KKyAgICAgICAgICAgIEV4dGVuZGVkVGltZXN0YW1wIHRpbWVzdGFtcDsgLy8gdXNlIHByaXZhdGUgY29weSB0byBmZXRjaAorICAgICAgICAgICAgaWYgKG1TdGFuZGJ5KSB7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmRpc2NvbnRpbnVpdHkoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodGhyZWFkbG9vcF9nZXRIYWxUaW1lc3RhbXBfbCgmdGltZXN0YW1wKSA9PSBPSykgeworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5hZGQodGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdLAorICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUpOworCisgICAgICAgICAgICAgICAgaWYgKGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiVFNfQkVGT1JFOiAlZCAlbGxkICVsbGQiLCBpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdKTsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBjb3JyZWN0ZWRUaW1lc3RhbXAgPSBtVGltZXN0YW1wVmVyaWZpZXIuZ2V0TGFzdENvcnJlY3RlZFRpbWVzdGFtcCgpOworICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjb3JyZWN0ZWRUaW1lc3RhbXAubUZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IGNvcnJlY3RlZFRpbWVzdGFtcC5tVGltZU5zOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiVFNfQUZURVI6ICVkICVsbGQgJWxsZCIsIGlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0pOworCisgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IERvd25zdHJlYW0gbGF0ZW5jeSBvbmx5IGFkZGVkIGlmIHRpbWVzdGFtcCBjb3JyZWN0aW9uIGVuYWJsZWQuCisgICAgICAgICAgICAgICAgICAgIGlmIChtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMuZ2V0TigpID4gMCkgeyAvLyB3ZSBoYXZlIGxhdGVuY3kgaW5mby4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgbmV3UG9zaXRpb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gaW50NjRfdChtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMuZ2V0TWVhbigpICogbVNhbXBsZVJhdGUgKiAxZS0zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgcmV0cm9ncmFkZQorICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9IG1heCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UG9zaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gbVN1c3BlbmRlZEZyYW1lcykpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgLy8gV2UgYWx3YXlzIGZldGNoIHRoZSB0aW1lc3RhbXAgaGVyZSBiZWNhdXNlIG9mdGVuIHRoZSBkb3duc3RyZWFtCiAgICAgICAgICAgICAgICAgLy8gc2luayB3aWxsIGJsb2NrIHdoaWxlIHdyaXRpbmcuCi0gICAgICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgdGltZXN0YW1wOyAvLyB1c2UgcHJpdmF0ZSBjb3B5IHRvIGZldGNoCi0gICAgICAgICAgICAgICAgKHZvaWQpIG1Ob3JtYWxTaW5rLT5nZXRUaW1lc3RhbXAodGltZXN0YW1wKTsKIAogICAgICAgICAgICAgICAgIC8vIFdlIGtlZXAgdHJhY2sgb2YgdGhlIGxhc3QgdmFsaWQga2VybmVsIHBvc2l0aW9uIGluIGNhc2Ugd2UgYXJlIGluIHVuZGVycnVuCiAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBub3JtYWwgbWl4ZXIgcGVyaW9kIGlzIHRoZSBzYW1lIGFzIHRoZSBmYXN0IG1peGVyIHBlcmlvZCwgb3IgdGhlcmUKQEAgLTMyMjMsNyArMzQwOCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKyBtU3VzcGVuZGVkRnJhbWVzOyAvLyBhZGQgZnJhbWVzIGRpc2NhcmRlZCB3aGVuIHN1c3BlbmRlZAogICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9CiAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmVycm9yKCk7CiAgICAgICAgICAgICB9CisKICAgICAgICAgICAgIC8vIG1GcmFtZXNXcml0dGVuIGZvciBub24tb2ZmbG9hZGVkIHRyYWNrcyBhcmUgY29udGlndW91cwogICAgICAgICAgICAgLy8gZXZlbiBhZnRlciBzdGFuZGJ5KCkgaXMgY2FsbGVkLiBUaGlzIGlzIHVzZWZ1bCBmb3IgdGhlIHRyYWNrIGZyYW1lCiAgICAgICAgICAgICAvLyB0byBzaW5rIGZyYW1lIG1hcHBpbmcuCkBAIC0zMjM5LDExICszNDI3LDExIEBACiAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgdGltZSBiZWZvcmUgd2UgY2FsbGVkIHRoZSBIQUwgd3JpdGUgLSBpdCBpcyBhIGJpdCBtb3JlIGFjY3VyYXRlCiAgICAgICAgICAgICAgICAgICAgIC8vIHRvIHdoZW4gdGhlIHNlcnZlciBsYXN0IHJlYWQgZGF0YSB0aGFuIHRoZSBjdXJyZW50IHRpbWUgaGVyZS4KICAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZW4ndCB3cml0dGVuIGFueXRoaW5nLCBtTGFzdFdyaXRlVGltZSB3aWxsIGJlIC0xCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmVuJ3Qgd3JpdHRlbiBhbnl0aGluZywgbUxhc3RJb0JlZ2luTnMgd2lsbCBiZSAtMQogICAgICAgICAgICAgICAgICAgICAvLyBhbmQgd2UgdXNlIHN5c3RlbVRpbWUoKS4KICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl0gPSBtRnJhbWVzV3JpdHRlbjsKLSAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdID0gbUxhc3RXcml0ZVRpbWUgPT0gLTEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHN5c3RlbVRpbWUoKSA6IG1MYXN0V3JpdGVUaW1lOworICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl0gPSBtTGFzdElvQmVnaW5OcyA9PSAtMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc3lzdGVtVGltZSgpIDogbUxhc3RJb0JlZ2luTnM7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzcDxUcmFjaz4gJnQgOiBtQWN0aXZlVHJhY2tzKSB7CkBAIC0zMjUxLDEwICszNDM5LDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICB0LT51cGRhdGVUcmFja0ZyYW1lSW5mbygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVsZWFzZWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGF1ZGlvX2hhc19wcm9wb3J0aW9uYWxfZnJhbWVzKG1Gb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIGxhdGVuY3lNcyA9IG1UaW1lc3RhbXAuZ2V0T3V0cHV0U2VydmVyTGF0ZW5jeU1zKG1TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBpZiAobGF0ZW5jeU1zICE9IDAuKSB7IC8vIG5vdGUgMC4gbWVhbnMgdGltZXN0YW1wIGlzIGVtcHR5LgorICAgICAgICAgICAgICAgICAgICBtTGF0ZW5jeU1zLmFkZChsYXRlbmN5TXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSAvLyBpZiAobVR5cGUgLi4uICkgeyAvLyBubyBpbmRlbnRhdGlvbgogI2lmIDAKICAgICAgICAgICAgIC8vIGxvZ0Zvcm1hdCBleGFtcGxlCiAgICAgICAgICAgICBpZiAoeiAlIDEwMCA9PSAwKSB7CkBAIC0zMjk1LDcgKzM0OTMsNyBAQAogCiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKCFtQWN0aXZlVHJhY2tzLnNpemUoKSAmJiBzeXN0ZW1UaW1lKCkgPiBtU3RhbmRieVRpbWVOcykgfHwKKyAgICAgICAgICAgIGlmICgobUFjdGl2ZVRyYWNrcy5pc0VtcHR5KCkgJiYgc3lzdGVtVGltZSgpID4gbVN0YW5kYnlUaW1lTnMpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU3VzcGVuZGVkKCkpIHsKICAgICAgICAgICAgICAgICAvLyBwdXQgYXVkaW8gaGFyZHdhcmUgaW50byBzdGFuZGJ5IGFmdGVyIHNob3J0IGRlbGF5CiAgICAgICAgICAgICAgICAgaWYgKHNob3VsZFN0YW5kYnlfbCgpKSB7CkBAIC0zMzA3LDkgKzM1MDUsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIExPR19BVURJT19TVEFURSgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1TdGFuZGJ5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgc2VuZFN0YXRpc3RpY3MoZmFsc2UgLyogZm9yY2UgKi8pOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmICghbUFjdGl2ZVRyYWNrcy5zaXplKCkgJiYgbUNvbmZpZ0V2ZW50cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBpZiAobUFjdGl2ZVRyYWNrcy5pc0VtcHR5KCkgJiYgbUNvbmZpZ0V2ZW50cy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gd2UncmUgYWJvdXQgdG8gd2FpdCwgZmx1c2ggdGhlIGJpbmRlciBjb21tYW5kIGJ1ZmZlcgogICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CiAKQEAgLTMzNTIsNiArMzU1MSwyNSBAQAogICAgICAgICAgICAgLy8gZHVyaW5nIG1peGluZyBhbmQgZWZmZWN0IHByb2Nlc3MgYXMgdGhlIGF1ZGlvIGJ1ZmZlcnMgY291bGQgYmUgZGVsZXRlZAogICAgICAgICAgICAgLy8gb3IgbW9kaWZpZWQgaWYgYW4gZWZmZWN0IGlzIGNyZWF0ZWQgb3IgZGVsZXRlZAogICAgICAgICAgICAgbG9ja0VmZmVjdENoYWluc19sKGVmZmVjdENoYWlucyk7CisKKyAgICAgICAgICAgIC8vIERldGVybWluZSB3aGljaCBzZXNzaW9uIHRvIHBpY2sgdXAgaGFwdGljIGRhdGEuCisgICAgICAgICAgICAvLyBUaGlzIG11c3QgYmUgZG9uZSB1bmRlciB0aGUgc2FtZSBsb2NrIGFzIHByZXBhcmVUcmFja3NfbCgpLgorICAgICAgICAgICAgLy8gVE9ETzogV3JpdGUgaGFwdGljIGRhdGEgZGlyZWN0bHkgdG8gc2luayBidWZmZXIgd2hlbiBtaXhpbmcuCisgICAgICAgICAgICBpZiAobUhhcHRpY0NoYW5uZWxDb3VudCA+IDAgJiYgZWZmZWN0Q2hhaW5zLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHRyYWNrIDogbUFjdGl2ZVRyYWNrcykgeworICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2stPmdldEhhcHRpY1BsYXliYWNrRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVIYXB0aWNTZXNzaW9uSWQgPSB0cmFjay0+c2Vzc2lvbklkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQWNxdWlyZSBhIGxvY2FsIGNvcHkgb2YgYWN0aXZlIHRyYWNrcyB3aXRoIGxvY2sgKHJlbGVhc2Ugdy9vIGxvY2spLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIENvbnRyb2wgbWV0aG9kcyBvbiB0aGUgdHJhY2sgYWNxdWlyZSB0aGUgVGhyZWFkQmFzZSBsb2NrIChlLmcuIHN0YXJ0KCkKKyAgICAgICAgICAgIC8vIHN0b3AoKSwgcGF1c2UoKSwgZXRjLiksIGJ1dCB0aGUgdGhyZWFkTG9vcCBpcyBlbnRpdGxlZCB0byBjYWxsIGF1ZGlvCisgICAgICAgICAgICAvLyBkYXRhIC8gYnVmZmVyIG1ldGhvZHMgb24gdHJhY2tzIGZyb20gYWN0aXZlVHJhY2tzIHdpdGhvdXQgdGhlIFRocmVhZEJhc2UgbG9jay4KKyAgICAgICAgICAgIGFjdGl2ZVRyYWNrcy5pbnNlcnQoYWN0aXZlVHJhY2tzLmVuZCgpLCBtQWN0aXZlVHJhY2tzLmJlZ2luKCksIG1BY3RpdmVUcmFja3MuZW5kKCkpOwogICAgICAgICB9IC8vIG1Mb2NrIHNjb3BlIGVuZHMKIAogICAgICAgICBpZiAobUJ5dGVzUmVtYWluaW5nID09IDApIHsKQEAgLTMzNjYsNiArMzU4NCwxMyBAQAogICAgICAgICAgICAgICAgIHRocmVhZExvb3Bfc2xlZXBUaW1lKCk7CiAgICAgICAgICAgICAgICAgaWYgKG1TbGVlcFRpbWVVcyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50V3JpdGVMZW5ndGggPSBtU2lua0J1ZmZlclNpemU7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gVGFsbHkgdW5kZXJydW4gZnJhbWVzIGFzIHdlIGFyZSBpbnNlcnRpbmcgMHMgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiB0cmFjayA6IGFjdGl2ZVRyYWNrcykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5tRmlsbGluZ1VwU3RhdHVzID09IFRyYWNrOjpGU19BQ1RJVkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcyhtTm9ybWFsRnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBFaXRoZXIgdGhyZWFkTG9vcF9taXgoKSBvciB0aHJlYWRMb29wX3NsZWVwVGltZSgpIHNob3VsZCBoYXZlIHNldApAQCAtMzM4OSw4ICszNjE0LDI2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKmxpbWl0Ki8pOwogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIGlmICghaGFzRmFzdE1peGVyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gQmFsYW5jZSBtdXN0IHRha2UgZWZmZWN0IGFmdGVyIG1vbm8gY29udmVyc2lvbi4KKyAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG8gaXQgaGVyZSBpZiB0aGVyZSBpcyBubyBGYXN0TWl4ZXIuCisgICAgICAgICAgICAgICAgICAgIC8vIG1CYWxhbmNlIGRldGVjdHMgemVybyBiYWxhbmNlIHdpdGhpbiB0aGUgY2xhc3MgZm9yIHNwZWVkIChub3QgbmVlZGVkIGhlcmUpLgorICAgICAgICAgICAgICAgICAgICBtQmFsYW5jZS5zZXRCYWxhbmNlKG1NYXN0ZXJCYWxhbmNlLmxvYWQoKSk7CisgICAgICAgICAgICAgICAgICAgIG1CYWxhbmNlLnByb2Nlc3MoKGZsb2F0ICopbU1peGVyQnVmZmVyLCBtTm9ybWFsRnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChidWZmZXIsIGZvcm1hdCwgbU1peGVyQnVmZmVyLCBtTWl4ZXJCdWZmZXJGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQgKiAobUNoYW5uZWxDb3VudCArIG1IYXB0aWNDaGFubmVsQ291bnQpKTsKKworICAgICAgICAgICAgICAgIC8vIElmIHdlJ3JlIGdvaW5nIGRpcmVjdGx5IHRvIHRoZSBzaW5rIGFuZCB0aGVyZSBhcmUgaGFwdGljIGNoYW5uZWxzLAorICAgICAgICAgICAgICAgIC8vIHdlIHNob3VsZCBhZGp1c3QgY2hhbm5lbHMgYXMgdGhlIHNhbXBsZSBkYXRhIGlzIHBhcnRpYWxseSBpbnRlcmxlYXZlZAorICAgICAgICAgICAgICAgIC8vIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICBpZiAoIW1FZmZlY3RCdWZmZXJWYWxpZCAmJiBtSGFwdGljQ2hhbm5lbENvdW50ID4gMCkgeworICAgICAgICAgICAgICAgICAgICBhZGp1c3RfY2hhbm5lbHNfbm9uX2Rlc3RydWN0aXZlKGJ1ZmZlciwgbUNoYW5uZWxDb3VudCwgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQgKyBtSGFwdGljQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfZnJhbWUobUNoYW5uZWxDb3VudCwgZm9ybWF0KSAqIG1Ob3JtYWxGcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1CeXRlc1JlbWFpbmluZyA9IG1DdXJyZW50V3JpdGVMZW5ndGg7CkBAIC0zNDA4LDYgKzM2NTEsMTkgQEAKICAgICAgICAgICAgIGlmIChtU2xlZXBUaW1lVXMgPT0gMCAmJiBtVHlwZSAhPSBPRkZMT0FEKSB7CiAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RDaGFpbnMuc2l6ZSgpOyBpICsrKSB7CiAgICAgICAgICAgICAgICAgICAgIGVmZmVjdENoYWluc1tpXS0+cHJvY2Vzc19sKCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IFdyaXRlIGhhcHRpYyBkYXRhIGRpcmVjdGx5IHRvIHNpbmsgYnVmZmVyIHdoZW4gbWl4aW5nLgorICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlSGFwdGljU2Vzc2lvbklkICE9IEFVRElPX1NFU1NJT05fTk9ORQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGFjdGl2ZUhhcHRpY1Nlc3Npb25JZCA9PSBlZmZlY3RDaGFpbnNbaV0tPnNlc3Npb25JZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYXB0aWMgZGF0YSBpcyBhY3RpdmUgaW4gdGhpcyBjYXNlLCBjb3B5IGl0IGRpcmVjdGx5IGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIGJ1ZmZlciB0byBvdXQgYnVmZmVyLgorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGF1ZGlvQnVmZmVyU2l6ZSA9IG1Ob3JtYWxGcmFtZUNvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKG1DaGFubmVsQ291bnQsIEVGRkVDVF9CVUZGRVJfRk9STUFUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50OF90KillZmZlY3RDaGFpbnNbaV0tPm91dEJ1ZmZlcigpICsgYXVkaW9CdWZmZXJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfQlVGRkVSX0ZPUk1BVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKWVmZmVjdENoYWluc1tpXS0+aW5CdWZmZXIoKSArIGF1ZGlvQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZGRUNUX0JVRkZFUl9GT1JNQVQsIG1Ob3JtYWxGcmFtZUNvdW50ICogbUhhcHRpY0NoYW5uZWxDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTM0MzMsOCArMzY4OSwyNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKmxpbWl0Ki8pOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoIWhhc0Zhc3RNaXhlcigpKSB7CisgICAgICAgICAgICAgICAgLy8gQmFsYW5jZSBtdXN0IHRha2UgZWZmZWN0IGFmdGVyIG1vbm8gY29udmVyc2lvbi4KKyAgICAgICAgICAgICAgICAvLyBXZSBkbyBpdCBoZXJlIGlmIHRoZXJlIGlzIG5vIEZhc3RNaXhlci4KKyAgICAgICAgICAgICAgICAvLyBtQmFsYW5jZSBkZXRlY3RzIHplcm8gYmFsYW5jZSB3aXRoaW4gdGhlIGNsYXNzIGZvciBzcGVlZCAobm90IG5lZWRlZCBoZXJlKS4KKyAgICAgICAgICAgICAgICBtQmFsYW5jZS5zZXRCYWxhbmNlKG1NYXN0ZXJCYWxhbmNlLmxvYWQoKSk7CisgICAgICAgICAgICAgICAgbUJhbGFuY2UucHJvY2VzcygoZmxvYXQgKiltRWZmZWN0QnVmZmVyLCBtTm9ybWFsRnJhbWVDb3VudCk7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQobVNpbmtCdWZmZXIsIG1Gb3JtYXQsIG1FZmZlY3RCdWZmZXIsIG1FZmZlY3RCdWZmZXJGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50ICogKG1DaGFubmVsQ291bnQgKyBtSGFwdGljQ2hhbm5lbENvdW50KSk7CisgICAgICAgICAgICAvLyBUaGUgc2FtcGxlIGRhdGEgaXMgcGFydGlhbGx5IGludGVybGVhdmVkIHdoZW4gaGFwdGljIGNoYW5uZWxzIGV4aXN0LAorICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBhZGp1c3QgY2hhbm5lbHMgaGVyZS4KKyAgICAgICAgICAgIGlmIChtSGFwdGljQ2hhbm5lbENvdW50ID4gMCkgeworICAgICAgICAgICAgICAgIGFkanVzdF9jaGFubmVsc19ub25fZGVzdHJ1Y3RpdmUobVNpbmtCdWZmZXIsIG1DaGFubmVsQ291bnQsIG1TaW5rQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudCArIG1IYXB0aWNDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1Gb3JtYXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKG1DaGFubmVsQ291bnQsIG1Gb3JtYXQpICogbU5vcm1hbEZyYW1lQ291bnQpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gZW5hYmxlIGNoYW5nZXMgaW4gZWZmZWN0IGNoYWluCkBAIC0zNDQ0LDQzICszNzE2LDY4IEBACiAgICAgICAgICAgICAvLyBtU2xlZXBUaW1lVXMgPT0gMCBtZWFucyB3ZSBtdXN0IHdyaXRlIHRvIGF1ZGlvIGhhcmR3YXJlCiAgICAgICAgICAgICBpZiAobVNsZWVwVGltZVVzID09IDApIHsKICAgICAgICAgICAgICAgICBzc2l6ZV90IHJldCA9IDA7Ci0gICAgICAgICAgICAgICAgLy8gV2Ugc2F2ZSBsYXN0V3JpdGVGaW5pc2hlZCBoZXJlLCBhcyBwcmV2aW91c0xhc3RXcml0ZUZpbmlzaGVkLAotICAgICAgICAgICAgICAgIC8vIGZvciB0aHJvdHRsaW5nLiBPbiB0aHJlYWQgc3RhcnQsIHByZXZpb3VzTGFzdFdyaXRlRmluaXNoZWQgd2lsbCBiZQotICAgICAgICAgICAgICAgIC8vIHNldCB0byAtMSwgd2hpY2ggcHJvcGVybHkgcmVzdWx0cyBpbiBubyB0aHJvdHRsaW5nIGFmdGVyIHRoZSBmaXJzdCB3cml0ZS4KLSAgICAgICAgICAgICAgICBuc2Vjc190IHByZXZpb3VzTGFzdFdyaXRlRmluaXNoZWQgPSBsYXN0V3JpdGVGaW5pc2hlZDsKLSAgICAgICAgICAgICAgICBuc2Vjc190IGRlbHRhID0gMDsKKyAgICAgICAgICAgICAgICAvLyB3cml0ZVBlcmlvZE5zIGlzIHVwZGF0ZWQgPj0gMCB3aGVuIHJldCA+IDAuCisgICAgICAgICAgICAgICAgaW50NjRfdCB3cml0ZVBlcmlvZE5zID0gLTE7CiAgICAgICAgICAgICAgICAgaWYgKG1CeXRlc1JlbWFpbmluZykgewogICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSByZXdyaXRlIHRvIHJlZHVjZSBudW1iZXIgb2Ygc3lzdGVtIGNhbGxzCi0gICAgICAgICAgICAgICAgICAgIG1MYXN0V3JpdGVUaW1lID0gc3lzdGVtVGltZSgpOyAgLy8gYWxzbyB1c2VkIGZvciBkdW1wc3lzCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgbGFzdElvQmVnaW5OcyA9IHN5c3RlbVRpbWUoKTsKICAgICAgICAgICAgICAgICAgICAgcmV0ID0gdGhyZWFkTG9vcF93cml0ZSgpOwotICAgICAgICAgICAgICAgICAgICBsYXN0V3JpdGVGaW5pc2hlZCA9IHN5c3RlbVRpbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBsYXN0V3JpdGVGaW5pc2hlZCAtIG1MYXN0V3JpdGVUaW1lOworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGxhc3RJb0VuZE5zID0gc3lzdGVtVGltZSgpOwogICAgICAgICAgICAgICAgICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzUmVtYWluaW5nID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuICs9IHJldDsKICAgICAgICAgICAgICAgICAgICAgICAgIG1CeXRlc1JlbWFpbmluZyAtPSByZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzV3JpdHRlbiArPSByZXQgLyBtRnJhbWVTaXplOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBmcmFtZXMgPSByZXQgLyBtRnJhbWVTaXplOworICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1dyaXR0ZW4gKz0gZnJhbWVzOworCisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZVBlcmlvZE5zID0gbGFzdElvRW5kTnMgLSBtTGFzdElvRW5kTnM7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIGluZm9ybWF0aW9uIHJlbGF0aW5nIHRvIHdyaXRlIHRpbWUuCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9faGFzX3Byb3BvcnRpb25hbF9mcmFtZXMobUZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgaW4gYSBjb250aW51b3VzIG1peGluZyBjeWNsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfVFJBQ0tTX1JFQURZICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb29wQ291bnQgPT0gbGFzdExvb3BDb3VudFdyaXR0ZW4gKyAxKSB7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIGppdHRlck1zID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lc3RhbXBWZXJpZmllcjxpbnQ2NF90LCBpbnQ2NF90Pjo6Y29tcHV0ZUppdHRlck1zKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2ZyYW1lcywgd3JpdGVQZXJpb2ROc30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MCwgMH0gLyogbGFzdFRpbWVzdGFtcCAqLywgbVNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgcHJvY2Vzc01zID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsYXN0SW9CZWdpbk5zIC0gbUxhc3RJb0VuZE5zKSAqIDFlLTY7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlvSml0dGVyTXMuYWRkKGppdHRlck1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByb2Nlc3NUaW1lTXMuYWRkKHByb2Nlc3NNcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgYmxvY2tlZCBkZXRlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGRlbHRhV3JpdGVOcyA9IGxhc3RJb0VuZE5zIC0gbGFzdElvQmVnaW5OczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVR5cGUgPT0gTUlYRVIgJiYgZGVsdGFXcml0ZU5zID4gbWF4UGVyaW9kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1EZWxheWVkV3JpdGVzKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobGFzdElvRW5kTnMgLSBsYXN0V2FybmluZykgPiBrV2FybmluZ1Rocm90dGxlTnMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJ1bmRlcnJ1biIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIndyaXRlIGJsb2NrZWQgZm9yICVsbGQgbXNlY3MsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVkIGRlbGF5ZWQgd3JpdGVzLCB0aHJlYWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWRlbHRhV3JpdGVOcyAvIE5BTk9TX1BFUl9NSUxMSVNFQ09ORCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bURlbGF5ZWRXcml0ZXMsIG1JZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0V2FybmluZyA9IGxhc3RJb0VuZE5zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRpbWluZyBpbmZvLgorICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RJb0JlZ2luTnMgPSBsYXN0SW9CZWdpbk5zOworICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RJb0VuZE5zID0gbGFzdElvRW5kTnM7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0TG9vcENvdW50V3JpdHRlbiA9IGxvb3BDb3VudDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKG1NaXhlclN0YXR1cyA9PSBNSVhFUl9EUkFJTl9UUkFDSykgfHwKICAgICAgICAgICAgICAgICAgICAgICAgIChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfRFJBSU5fQUxMKSkgewogICAgICAgICAgICAgICAgICAgICB0aHJlYWRMb29wX2RyYWluKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGlmIChtVHlwZSA9PSBNSVhFUiAmJiAhbVN0YW5kYnkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gd3JpdGUgYmxvY2tlZCBkZXRlY3Rpb24KLSAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhID4gbWF4UGVyaW9kKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTnVtRGVsYXllZFdyaXRlcysrOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChsYXN0V3JpdGVGaW5pc2hlZCAtIGxhc3RXYXJuaW5nKSA+IGtXYXJuaW5nVGhyb3R0bGVOcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJ1bmRlcnJ1biIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJ3cml0ZSBibG9ja2VkIGZvciAlbGx1IG1zZWNzLCAlZCBkZWxheWVkIHdyaXRlcywgdGhyZWFkICVwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIG5zMm1zKGRlbHRhKSwgbU51bURlbGF5ZWRXcml0ZXMsIHRoaXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RXYXJuaW5nID0gbGFzdFdyaXRlRmluaXNoZWQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICBpZiAobVRocmVhZFRocm90dGxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbU1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19SRUFEWSAvLyB3ZSBhcmUgbWl4aW5nIChhY3RpdmUgdHJhY2tzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHJldCA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2Ugd3JvdGUgc29tZXRoaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgd3JpdGVQZXJpb2ROcyA+IDApIHsgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHdyaXRlIHBlcmlvZCBpbmZvCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMaW1pdCBNaXhlclRocmVhZCBkYXRhIHByb2Nlc3NpbmcgdG8gbm8gbW9yZSB0aGFuIHR3aWNlIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0ZWQgcHJvY2Vzc2luZyByYXRlLgogICAgICAgICAgICAgICAgICAgICAgICAgLy8KQEAgLTM0OTksMTIgKzM3OTYsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gMi4gdGhyZWFkTG9vcF9taXggKHNpZ25pZmljYW50IGZvciBoZWF2eSBtaXhpbmcsIGVzcGVjaWFsbHkKICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICBvbiBsb3cgdGllciBwcm9jZXNzb3JzKQogCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCdzIE9LIGlmIGRlbHRhTXMgKGFuZCBkZWx0YU5zKSBpcyBhbiBvdmVyZXN0aW1hdGUuCi0gICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IGRlbHRhTnM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWx0YU5zID0gbGFzdFdyaXRlRmluaXNoZWQgLSBwcmV2aW91c0xhc3RXcml0ZUZpbmlzaGVkOwotICAgICAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX3N1Yl9vdmVyZmxvdygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0V3JpdGVGaW5pc2hlZCxwcmV2aW91c0xhc3RXcml0ZUZpbmlzaGVkLCAmZGVsdGFOcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGRlbHRhTXMgPSBkZWx0YU5zIC8gMTAwMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0J3MgT0sgaWYgZGVsdGFNcyBpcyBhbiBvdmVyZXN0aW1hdGUuCisKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZGVsdGFNcyA9IHdyaXRlUGVyaW9kTnMgLyBOQU5PU19QRVJfTUlMTElTRUNPTkQ7CiAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdGhyb3R0bGVNcyA9IChpbnQzMl90KW1IYWxmQnVmZmVyTXMgLSBkZWx0YU1zOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChzaWduZWQpbUhhbGZCdWZmZXJNcyA+PSB0aHJvdHRsZU1zICYmIHRocm90dGxlTXMgPiAwKSB7CkBAIC0zNTE3LDcgKzM4MTEsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWRUaHJvdHRsZVRpbWVNcyArPSB0aHJvdHRsZU1zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRocm90dGxlIG11c3QgYmUgYXR0cmlidXRlZCB0byB0aGUgcHJldmlvdXMgbWl4ZXIgbG9vcCdzIHdyaXRlIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBhbGxvdyBiYWNrLXRvLWJhY2sgdGhyb3R0bGluZy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0V3JpdGVGaW5pc2hlZCArPSB0aHJvdHRsZU1zICogMTAwMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGFsc28gZW5zdXJlcyBwcm9wZXIgdGltaW5nIHN0YXRpc3RpY3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RJb0VuZE5zID0gc3lzdGVtVGltZSgpOyAgLy8gd2UgZmV0Y2ggdGhlIHdyaXRlIGVuZCB0aW1lIGFnYWluLgogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkaWZmID0gbVRocmVhZFRocm90dGxlVGltZU1zIC0gbVRocmVhZFRocm90dGxlRW5kTXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPiAwKSB7CkBAIC0zNjAwLDI0ICszODk1LDM2IEBACiAvLyByZW1vdmVUcmFja3NfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpyZW1vdmVUcmFja3NfbChjb25zdCBWZWN0b3I8IHNwPFRyYWNrPiA+JiB0cmFja3NUb1JlbW92ZSkKIHsKLSAgICBzaXplX3QgY291bnQgPSB0cmFja3NUb1JlbW92ZS5zaXplKCk7Ci0gICAgaWYgKGNvdW50ID4gMCkgewotICAgICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxUcmFjaz4mIHRyYWNrID0gdHJhY2tzVG9SZW1vdmUuaXRlbUF0KGkpOwotICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUodHJhY2spOwotICAgICAgICAgICAgQUxPR1YoInJlbW92ZVRyYWNrc19sIHJlbW92aW5nIHRyYWNrIG9uIHNlc3Npb24gJWQiLCB0cmFjay0+c2Vzc2lvbklkKCkpOwotICAgICAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbCh0cmFjay0+c2Vzc2lvbklkKCkpOwotICAgICAgICAgICAgaWYgKGNoYWluICE9IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigic3RvcHBpbmcgdHJhY2sgb24gY2hhaW4gJXAgZm9yIHNlc3Npb24gSWQ6ICVkIiwgY2hhaW4uZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2Vzc2lvbklkKCkpOwotICAgICAgICAgICAgICAgIGNoYWluLT5kZWNBY3RpdmVUcmFja0NudCgpOwotICAgICAgICAgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYgdHJhY2sgOiB0cmFja3NUb1JlbW92ZSkgeworICAgICAgICBtQWN0aXZlVHJhY2tzLnJlbW92ZSh0cmFjayk7CisgICAgICAgIEFMT0dWKCIlcyglZCk6IHJlbW92aW5nIHRyYWNrIG9uIHNlc3Npb24gJWQiLCBfX2Z1bmNfXywgdHJhY2stPmlkKCksIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IGdldEVmZmVjdENoYWluX2wodHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgaWYgKGNoYWluICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IHN0b3BwaW5nIHRyYWNrIG9uIGNoYWluICVwIGZvciBzZXNzaW9uIElkOiAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB0cmFjay0+aWQoKSwgY2hhaW4uZ2V0KCksIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgICAgICBjaGFpbi0+ZGVjQWN0aXZlVHJhY2tDbnQoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBJZiBhbiBleHRlcm5hbCBjbGllbnQgdHJhY2ssIGluZm9ybSBBUE0gd2UncmUgbm8gbG9uZ2VyIGFjdGl2ZSwgYW5kIHJlbW92ZSBpZiBuZWVkZWQuCisgICAgICAgIC8vIFdlIGRvIHRoaXMgdW5kZXIgbG9jayBzbyB0aGF0IHRoZSBzdGF0ZSBpcyBjb25zaXN0ZW50IGlmIHRoZSBUcmFjayBpcyBkZXN0cm95ZWQuCisgICAgICAgIGlmICh0cmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KHRyYWNrLT5wb3J0SWQoKSk7CiAgICAgICAgICAgICBpZiAodHJhY2stPmlzVGVybWluYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmVtb3ZlVHJhY2tfbCh0cmFjayk7CisgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQodHJhY2stPnBvcnRJZCgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBpZiAodHJhY2stPmlzVGVybWluYXRlZCgpKSB7CisgICAgICAgICAgICAvLyByZW1vdmUgZnJvbSBvdXIgdHJhY2tzIHZlY3RvcgorICAgICAgICAgICAgcmVtb3ZlVHJhY2tfbCh0cmFjayk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh0cmFjay0+Y2hhbm5lbE1hc2soKSAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkgIT0gQVVESU9fQ0hBTk5FTF9OT05FCisgICAgICAgICAgICAgICAgJiYgbUhhcHRpY0NoYW5uZWxDb3VudCA+IDApIHsKKyAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgLy8gVW5sb2NrIGR1ZSB0byBWaWJyYXRvclNlcnZpY2Ugd2lsbCBsb2NrIGZvciB0aGlzIGNhbGwgYW5kIHdpbGwKKyAgICAgICAgICAgIC8vIGNhbGwgVHJhY2tzLm11dGUvdW5tdXRlIHdoaWNoIGFsc28gcmVxdWlyZSB0aHJlYWQncyBsb2NrLgorICAgICAgICAgICAgQXVkaW9GbGluZ2VyOjpvbkV4dGVybmFsVmlicmF0aW9uU3RvcCh0cmFjay0+Z2V0RXh0ZXJuYWxWaWJyYXRpb24oKSk7CisgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgIH0KICAgICB9Ci0KIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Z2V0VGltZXN0YW1wX2woQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkKQEAgLTM2MzQsNiArMzk0MSwxNSBAQAogICAgICAgICB1aW50NjRfdCBwb3NpdGlvbjY0OwogICAgICAgICBpZiAobU91dHB1dC0+Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24oJnBvc2l0aW9uNjQsICZ0aW1lc3RhbXAubVRpbWUpID09IE9LKSB7CiAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uID0gKHVpbnQzMl90KXBvc2l0aW9uNjQ7CisgICAgICAgICAgICBpZiAobURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLmdldE4oKSA+IDApIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBwb3NpdGlvbk9mZnNldCA9CisgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkobURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLmdldE1lYW4oKSAqIG1TYW1wbGVSYXRlICogMWUtMyk7CisgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uT2Zmc2V0ID4gdGltZXN0YW1wLm1Qb3NpdGlvbikgeworICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uIC09IHBvc2l0aW9uT2Zmc2V0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogICAgIH0KQEAgLTM2NjYsNiArMzk4Miw3IEBACiAgICAgICAgIHR5cGUgfD0gcGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZTsKICAgICB9CiAKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNpbmtQb3J0SWQgPSBwYXRjaC0+c2lua3NbMF0uaWQ7CiAjaWZkZWYgQUREX0JBVFRFUllfREFUQQogICAgIC8vIHdoZW4gY2hhbmdpbmcgdGhlIGF1ZGlvIG91dHB1dCBkZXZpY2UsIGNhbGwgYWRkQmF0dGVyeURhdGEgdG8gbm90aWZ5CiAgICAgLy8gdGhlIGNoYW5nZQpAQCAtMzY5NSw3ICs0MDEyLDcgQEAKIAogICAgIC8vIG1QcmV2T3V0RGV2aWNlIGlzIHRoZSBsYXRlc3QgZGV2aWNlIHNldCBieSBjcmVhdGVBdWRpb1BhdGNoX2woKS4gSXQgaXMgbm90IHNldCB3aGVuCiAgICAgLy8gdGhlIHRocmVhZCBpcyBjcmVhdGVkIHNvIHRoYXQgdGhlIGZpcnN0IHBhdGNoIGNyZWF0aW9uIHRyaWdnZXJzIGFuIGlvQ29uZmlnQ2hhbmdlZCBjYWxsYmFjawotICAgIGJvb2wgY29uZmlnQ2hhbmdlZCA9IG1QcmV2T3V0RGV2aWNlICE9IHR5cGU7CisgICAgYm9vbCBjb25maWdDaGFuZ2VkID0gKG1QcmV2T3V0RGV2aWNlICE9IHR5cGUpIHx8IChtRGV2aWNlSWQgIT0gc2lua1BvcnRJZCk7CiAgICAgbU91dERldmljZSA9IHR5cGU7CiAgICAgbVBhdGNoID0gKnBhdGNoOwogCkBAIC0zNzI0LDYgKzQwNDEsNyBAQAogICAgIH0KICAgICBpZiAoY29uZmlnQ2hhbmdlZCkgewogICAgICAgICBtUHJldk91dERldmljZSA9IHR5cGU7CisgICAgICAgIG1EZXZpY2VJZCA9IHNpbmtQb3J0SWQ7CiAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTM3NzIsMTIgKzQwOTAsMTYgQEAKICAgICBkZXN0cm95VHJhY2tfbCh0cmFjayk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Z2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKIHsKLSAgICBUaHJlYWRCYXNlOjpnZXRBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKKyAgICBUaHJlYWRCYXNlOjp0b0F1ZGlvUG9ydENvbmZpZyhjb25maWcpOwogICAgIGNvbmZpZy0+cm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7CiAgICAgY29uZmlnLT5leHQubWl4Lmh3X21vZHVsZSA9IG1PdXRwdXQtPmF1ZGlvSHdEZXYtPmhhbmRsZSgpOwogICAgIGNvbmZpZy0+ZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOworICAgIGlmIChtT3V0cHV0ICYmIG1PdXRwdXQtPmZsYWdzICE9IEFVRElPX09VVFBVVF9GTEFHX05PTkUpIHsKKyAgICAgICAgY29uZmlnLT5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICAgICAgY29uZmlnLT5mbGFncy5vdXRwdXQgPSBtT3V0cHV0LT5mbGFnczsKKyAgICB9CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTM3OTMsNiArNDExNSw3IEBACiAgICAgICAgIC8vIG1QaXBlU2luayBiZWxvdwogICAgICAgICAvLyBtTm9ybWFsU2luayBiZWxvdwogeworICAgIHNldE1hc3RlckJhbGFuY2UoYXVkaW9GbGluZ2VyLT5nZXRNYXN0ZXJCYWxhbmNlX2woKSk7CiAgICAgQUxPR1YoIk1peGVyVGhyZWFkKCkgaWQ9JWQgZGV2aWNlPSUjeCB0eXBlPSVkIiwgaWQsIGRldmljZSwgdHlwZSk7CiAgICAgQUxPR1YoIm1TYW1wbGVSYXRlPSV1LCBtQ2hhbm5lbE1hc2s9JSN4LCBtQ2hhbm5lbENvdW50PSV1LCBtRm9ybWF0PSUjeCwgbUZyYW1lU2l6ZT0lenUsICIKICAgICAgICAgICAgICJtRnJhbWVDb3VudD0lenUsIG1Ob3JtYWxGcmFtZUNvdW50PSV6dSIsCkBAIC0zODA5LDcgKzQxMzIsOCBAQAogICAgIC8vIGNyZWF0ZSBhbiBOQkFJTyBzaW5rIGZvciB0aGUgSEFMIG91dHB1dCBzdHJlYW0sIGFuZCBuZWdvdGlhdGUKICAgICBtT3V0cHV0U2luayA9IG5ldyBBdWRpb1N0cmVhbU91dFNpbmsob3V0cHV0LT5zdHJlYW0pOwogICAgIHNpemVfdCBudW1Db3VudGVyT2ZmZXJzID0gMDsKLSAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzWzFdID0ge0Zvcm1hdF9mcm9tX1NSX0MobVNhbXBsZVJhdGUsIG1DaGFubmVsQ291bnQsIG1Gb3JtYXQpfTsKKyAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzWzFdID0ge0Zvcm1hdF9mcm9tX1NSX0MoCisgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCArIG1IYXB0aWNDaGFubmVsQ291bnQsIG1Gb3JtYXQpfTsKICNpZiAhTE9HX05ERUJVRwogICAgIHNzaXplX3QgaW5kZXggPQogI2Vsc2UKQEAgLTM4NTEsMTYgKzQxNzUsMTQgQEAKICAgICAgICAgICAgIC8vIGNoYW5nZSBvdXIgU2luayBmb3JtYXQgdG8gYWNjZXB0IG91ciBpbnRlcm1lZGlhdGUgcHJlY2lzaW9uCiAgICAgICAgICAgICBtRm9ybWF0ID0gZmFzdE1peGVyRm9ybWF0OwogICAgICAgICAgICAgZnJlZShtU2lua0J1ZmZlcik7Ci0gICAgICAgICAgICBtRnJhbWVTaXplID0gbUNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobUZvcm1hdCk7CisgICAgICAgICAgICBtRnJhbWVTaXplID0gYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKG1DaGFubmVsQ291bnQgKyBtSGFwdGljQ2hhbm5lbENvdW50LCBtRm9ybWF0KTsKICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBzaW5rQnVmZmVyU2l6ZSA9IG1Ob3JtYWxGcmFtZUNvdW50ICogbUZyYW1lU2l6ZTsKICAgICAgICAgICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtU2lua0J1ZmZlciwgMzIsIHNpbmtCdWZmZXJTaXplKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGNyZWF0ZSBhIE1vbm9QaXBlIHRvIGNvbm5lY3Qgb3VyIHN1Ym1peCB0byBGYXN0TWl4ZXIKICAgICAgICAgTkJBSU9fRm9ybWF0IGZvcm1hdCA9IG1PdXRwdXRTaW5rLT5mb3JtYXQoKTsKLSNpZmRlZiBURUVfU0lOSwotICAgICAgICBOQkFJT19Gb3JtYXQgb3JpZ2Zvcm1hdCA9IGZvcm1hdDsKLSNlbmRpZgorCiAgICAgICAgIC8vIGFkanVzdCBmb3JtYXQgdG8gbWF0Y2ggdGhhdCBvZiB0aGUgRmFzdCBNaXhlcgogICAgICAgICBBTE9HVigiZm9ybWF0IGNoYW5nZWQgZnJvbSAlI3ggdG8gJSN4IiwgZm9ybWF0Lm1Gb3JtYXQsIGZhc3RNaXhlckZvcm1hdCk7CiAgICAgICAgIGZvcm1hdC5tRm9ybWF0ID0gZmFzdE1peGVyRm9ybWF0OwpAQCAtMzg3Miw3ICs0MTk0LDcgQEAKICAgICAgICAgTW9ub1BpcGUgKm1vbm9QaXBlID0gbmV3IE1vbm9QaXBlKG1Ob3JtYWxGcmFtZUNvdW50ICogNCwgZm9ybWF0LCB0cnVlIC8qd3JpdGVDYW5CbG9jayovKTsKICAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyc1sxXSA9IHtmb3JtYXR9OwogICAgICAgICBzaXplX3QgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0jaWYgIUxPR19OREVCVUcgfHwgZGVmaW5lZChURUVfU0lOSykKKyNpZiAhTE9HX05ERUJVRwogICAgICAgICBzc2l6ZV90IGluZGV4ID0KICNlbHNlCiAgICAgICAgICh2b2lkKQpAQCAtMzg4MywyNSArNDIwNSw4IEBACiAgICAgICAgICAgICAgICAgKG1vbm9QaXBlLT5tYXhGcmFtZXMoKSAqIDcpIC8gOCA6IG1Ob3JtYWxGcmFtZUNvdW50ICogMik7CiAgICAgICAgIG1QaXBlU2luayA9IG1vbm9QaXBlOwogCi0jaWZkZWYgVEVFX1NJTksKLSAgICAgICAgaWYgKG1UZWVTaW5rT3V0cHV0RW5hYmxlZCkgewotICAgICAgICAgICAgLy8gY3JlYXRlIGEgUGlwZSB0byBhcmNoaXZlIGEgY29weSBvZiBGYXN0TWl4ZXIncyBvdXRwdXQgZm9yIGR1bXBzeXMKLSAgICAgICAgICAgIFBpcGUgKnRlZVNpbmsgPSBuZXcgUGlwZShtVGVlU2lua091dHB1dEZyYW1lcywgb3JpZ2Zvcm1hdCk7Ci0gICAgICAgICAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzMlsxXSA9IHtvcmlnZm9ybWF0fTsKLSAgICAgICAgICAgIG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgICAgICAgICAgaW5kZXggPSB0ZWVTaW5rLT5uZWdvdGlhdGUob2ZmZXJzMiwgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7Ci0gICAgICAgICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKLSAgICAgICAgICAgIG1UZWVTaW5rID0gdGVlU2luazsKLSAgICAgICAgICAgIFBpcGVSZWFkZXIgKnRlZVNvdXJjZSA9IG5ldyBQaXBlUmVhZGVyKCp0ZWVTaW5rKTsKLSAgICAgICAgICAgIG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgICAgICAgICAgaW5kZXggPSB0ZWVTb3VyY2UtPm5lZ290aWF0ZShvZmZlcnMyLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKGluZGV4ID09IDApOwotICAgICAgICAgICAgbVRlZVNvdXJjZSA9IHRlZVNvdXJjZTsKLSAgICAgICAgfQotI2VuZGlmCi0KICAgICAgICAgLy8gY3JlYXRlIGZhc3QgbWl4ZXIgYW5kIGNvbmZpZ3VyZSBpdCBpbml0aWFsbHkgd2l0aCBqdXN0IG9uZSBmYXN0IHRyYWNrIGZvciBvdXIgc3VibWl4Ci0gICAgICAgIG1GYXN0TWl4ZXIgPSBuZXcgRmFzdE1peGVyKCk7CisgICAgICAgIG1GYXN0TWl4ZXIgPSBuZXcgRmFzdE1peGVyKG1JZCk7CiAgICAgICAgIEZhc3RNaXhlclN0YXRlUXVldWUgKnNxID0gbUZhc3RNaXhlci0+c3EoKTsKICNpZmRlZiBTVEFURV9RVUVVRV9EVU1QCiAgICAgICAgIHNxLT5zZXRPYnNlcnZlckR1bXAoJm1TdGF0ZVF1ZXVlT2JzZXJ2ZXJEdW1wKTsKQEAgLTM5MTIsOCArNDIxNywxMSBAQAogICAgICAgICAvLyB3cmFwIHRoZSBzb3VyY2Ugc2lkZSBvZiB0aGUgTW9ub1BpcGUgdG8gbWFrZSBpdCBhbiBBdWRpb0J1ZmZlclByb3ZpZGVyCiAgICAgICAgIGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyID0gbmV3IFNvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIobmV3IE1vbm9QaXBlUmVhZGVyKG1vbm9QaXBlKSk7CiAgICAgICAgIGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyID0gTlVMTDsKLSAgICAgICAgZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2sgPSBtQ2hhbm5lbE1hc2s7IC8vIG1QaXBlU2luayBjaGFubmVsIG1hc2sgZm9yIGF1ZGlvIHRvIEZhc3RNaXhlcgorICAgICAgICBmYXN0VHJhY2stPm1DaGFubmVsTWFzayA9IG1DaGFubmVsTWFzayB8IG1IYXB0aWNDaGFubmVsTWFzazsgLy8gbVBpcGVTaW5rIGNoYW5uZWwgbWFzayBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF1ZGlvIHRvIEZhc3RNaXhlcgogICAgICAgICBmYXN0VHJhY2stPm1Gb3JtYXQgPSBtRm9ybWF0OyAvLyBtUGlwZVNpbmsgZm9ybWF0IGZvciBhdWRpbyB0byBGYXN0TWl4ZXIKKyAgICAgICAgZmFzdFRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkID0gbUhhcHRpY0NoYW5uZWxNYXNrICE9IEFVRElPX0NIQU5ORUxfTk9ORTsKKyAgICAgICAgZmFzdFRyYWNrLT5tSGFwdGljSW50ZW5zaXR5ID0gQXVkaW9NaXhlcjo6SEFQVElDX1NDQUxFX05PTkU7CiAgICAgICAgIGZhc3RUcmFjay0+bUdlbmVyYXRpb24rKzsKICAgICAgICAgc3RhdGUtPm1GYXN0VHJhY2tzR2VuKys7CiAgICAgICAgIHN0YXRlLT5tVHJhY2tNYXNrID0gMTsKQEAgLTM5MjEsMjQgKzQyMjksMzAgQEAKICAgICAgICAgc3RhdGUtPm1PdXRwdXRTaW5rID0gbU91dHB1dFNpbmsuZ2V0KCk7CiAgICAgICAgIHN0YXRlLT5tT3V0cHV0U2lua0dlbisrOwogICAgICAgICBzdGF0ZS0+bUZyYW1lQ291bnQgPSBtRnJhbWVDb3VudDsKKyAgICAgICAgLy8gc3BlY2lmeSBzaW5rIGNoYW5uZWwgbWFzayB3aGVuIGhhcHRpYyBjaGFubmVsIG1hc2sgcHJlc2VudCBhcyBpdCBjYW4gbm90CisgICAgICAgIC8vIGJlIGNhbGN1bGF0ZWQgZGlyZWN0bHkgZnJvbSBjaGFubmVsIGNvdW50CisgICAgICAgIHN0YXRlLT5tU2lua0NoYW5uZWxNYXNrID0gbUhhcHRpY0NoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfTk9ORQorICAgICAgICAgICAgICAgID8gQVVESU9fQ0hBTk5FTF9OT05FIDogbUNoYW5uZWxNYXNrIHwgbUhhcHRpY0NoYW5uZWxNYXNrOwogICAgICAgICBzdGF0ZS0+bUNvbW1hbmQgPSBGYXN0TWl4ZXJTdGF0ZTo6Q09MRF9JRExFOwogICAgICAgICAvLyBhbHJlYWR5IGRvbmUgaW4gY29uc3RydWN0b3IgaW5pdGlhbGl6YXRpb24gbGlzdAogICAgICAgICAvL21GYXN0TWl4ZXJGdXRleCA9IDA7CiAgICAgICAgIHN0YXRlLT5tQ29sZEZ1dGV4QWRkciA9ICZtRmFzdE1peGVyRnV0ZXg7CiAgICAgICAgIHN0YXRlLT5tQ29sZEdlbisrOwogICAgICAgICBzdGF0ZS0+bUR1bXBTdGF0ZSA9ICZtRmFzdE1peGVyRHVtcFN0YXRlOwotI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgIHN0YXRlLT5tVGVlU2luayA9IG1UZWVTaW5rLmdldCgpOwotI2VuZGlmCiAgICAgICAgIG1GYXN0TWl4ZXJOQkxvZ1dyaXRlciA9IGF1ZGlvRmxpbmdlci0+bmV3V3JpdGVyX2woa0Zhc3RNaXhlckxvZ1NpemUsICJGYXN0TWl4ZXIiKTsKICAgICAgICAgc3RhdGUtPm1OQkxvZ1dyaXRlciA9IG1GYXN0TWl4ZXJOQkxvZ1dyaXRlci5nZXQoKTsKICAgICAgICAgc3EtPmVuZCgpOwogICAgICAgICBzcS0+cHVzaChGYXN0TWl4ZXJTdGF0ZVF1ZXVlOjpCTE9DS19VTlRJTF9QVVNIRUQpOwogCisgICAgICAgIE5CTG9nOjp0aHJlYWRfaW5mb190IGluZm87CisgICAgICAgIGluZm8uaWQgPSBtSWQ7CisgICAgICAgIGluZm8udHlwZSA9IE5CTG9nOjpGQVNUTUlYRVI7CisgICAgICAgIG1GYXN0TWl4ZXJOQkxvZ1dyaXRlci0+bG9nPE5CTG9nOjpFVkVOVF9USFJFQURfSU5GTz4oaW5mbyk7CisKICAgICAgICAgLy8gc3RhcnQgdGhlIGZhc3QgbWl4ZXIKICAgICAgICAgbUZhc3RNaXhlci0+cnVuKCJGYXN0TWl4ZXIiLCBQUklPUklUWV9VUkdFTlRfQVVESU8pOwogICAgICAgICBwaWRfdCB0aWQgPSBtRmFzdE1peGVyLT5nZXRUaWQoKTsKLSAgICAgICAgc2VuZFByaW9Db25maWdFdmVudChnZXRwaWRfY2FjaGVkLCB0aWQsIGtQcmlvcml0eUZhc3RNaXhlciwgZmFsc2UgLypmb3JBcHAqLyk7CisgICAgICAgIHNlbmRQcmlvQ29uZmlnRXZlbnQoZ2V0cGlkKCksIHRpZCwga1ByaW9yaXR5RmFzdE1peGVyLCBmYWxzZSAvKmZvckFwcCovKTsKICAgICAgICAgc3RyZWFtKCktPnNldEhhbFRocmVhZFByaW9yaXR5KGtQcmlvcml0eUZhc3RNaXhlcik7CiAKICNpZmRlZiBBVURJT19XQVRDSERPRwpAQCAtMzk0Nyw5ICs0MjYxLDE0IEBACiAgICAgICAgIG1BdWRpb1dhdGNoZG9nLT5zZXREdW1wKCZtQXVkaW9XYXRjaGRvZ0R1bXApOwogICAgICAgICBtQXVkaW9XYXRjaGRvZy0+cnVuKCJBdWRpb1dhdGNoZG9nIiwgUFJJT1JJVFlfVVJHRU5UX0FVRElPKTsKICAgICAgICAgdGlkID0gbUF1ZGlvV2F0Y2hkb2ctPmdldFRpZCgpOwotICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50KGdldHBpZF9jYWNoZWQsIHRpZCwga1ByaW9yaXR5RmFzdE1peGVyLCBmYWxzZSAvKmZvckFwcCovKTsKKyAgICAgICAgc2VuZFByaW9Db25maWdFdmVudChnZXRwaWQoKSwgdGlkLCBrUHJpb3JpdHlGYXN0TWl4ZXIsIGZhbHNlIC8qZm9yQXBwKi8pOwogI2VuZGlmCi0KKyAgICB9IGVsc2UgeworI2lmZGVmIFRFRV9TSU5LCisgICAgICAgIC8vIE9ubHkgdXNlIHRoZSBNaXhlclRocmVhZCB0ZWUgaWYgdGhlcmUgaXMgbm8gRmFzdE1peGVyLgorICAgICAgICBtVGVlLnNldChtT3V0cHV0U2luay0+Zm9ybWF0KCksIE5CQUlPX1RlZTo6VEVFX0ZMQUdfT1VUUFVUX1RIUkVBRCk7CisgICAgICAgIG1UZWUuc2V0SWQoc3RkOjpzdHJpbmcoIl8iKSArIHN0ZDo6dG9fc3RyaW5nKG1JZCkgKyAiX00iKTsKKyNlbmRpZgogICAgIH0KIAogICAgIHN3aXRjaCAoa1VzZUZhc3RNaXhlcikgewpAQCAtNDAxMywxMiArNDMzMiw2IEBACiAgICAgcmV0dXJuIGxhdGVuY3k7CiB9CiAKLQotdm9pZCBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjp0aHJlYWRMb29wX3JlbW92ZVRyYWNrcyhjb25zdCBWZWN0b3I8IHNwPFRyYWNrPiA+JiB0cmFja3NUb1JlbW92ZSkKLXsKLSAgICBQbGF5YmFja1RocmVhZDo6dGhyZWFkTG9vcF9yZW1vdmVUcmFja3ModHJhY2tzVG9SZW1vdmUpOwotfQotCiBzc2l6ZV90IEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OnRocmVhZExvb3Bfd3JpdGUoKQogewogICAgIC8vIEZJWE1FIHdlIHNob3VsZCBvbmx5IGRvIG9uZSBwdXNoIHBlciBjeWNsZTsgY29uZmlybSB0aGlzIGlzIHRydWUKQEAgLTQyMTcsMTQgKzQ1MzAsMTQgQEAKIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Om1peGVyX3N0YXRlIEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OnByZXBhcmVUcmFja3NfbCgKICAgICAgICAgVmVjdG9yPCBzcDxUcmFjaz4gPiAqdHJhY2tzVG9SZW1vdmUpCiB7Ci0gICAgLy8gY2xlYW4gdXAgZGVsZXRlZCB0cmFjayBuYW1lcyBpbiBBdWRpb01peGVyIGJlZm9yZSBhbGxvY2F0aW5nIG5ldyB0cmFja3MKLSAgICAodm9pZCltVHJhY2tzLnByb2Nlc3NEZWxldGVkVHJhY2tOYW1lcyhbdGhpc10oaW50IG5hbWUpIHsKLSAgICAgICAgLy8gZm9yIGVhY2ggbmFtZSwgZGVzdHJveSBpdCBpbiB0aGUgQXVkaW9NaXhlcgotICAgICAgICBpZiAobUF1ZGlvTWl4ZXItPmV4aXN0cyhuYW1lKSkgewotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPmRlc3Ryb3kobmFtZSk7CisgICAgLy8gY2xlYW4gdXAgZGVsZXRlZCB0cmFjayBpZHMgaW4gQXVkaW9NaXhlciBiZWZvcmUgYWxsb2NhdGluZyBuZXcgdHJhY2tzCisgICAgKHZvaWQpbVRyYWNrcy5wcm9jZXNzRGVsZXRlZFRyYWNrSWRzKFt0aGlzXShpbnQgdHJhY2tJZCkgeworICAgICAgICAvLyBmb3IgZWFjaCB0cmFja0lkLCBkZXN0cm95IGl0IGluIHRoZSBBdWRpb01peGVyCisgICAgICAgIGlmIChtQXVkaW9NaXhlci0+ZXhpc3RzKHRyYWNrSWQpKSB7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+ZGVzdHJveSh0cmFja0lkKTsKICAgICAgICAgfQogICAgIH0pOwotICAgIG1UcmFja3MuY2xlYXJEZWxldGVkVHJhY2tOYW1lcygpOworICAgIG1UcmFja3MuY2xlYXJEZWxldGVkVHJhY2tJZHMoKTsKIAogICAgIG1peGVyX3N0YXRlIG1peGVyU3RhdHVzID0gTUlYRVJfSURMRTsKICAgICAvLyBmaW5kIG91dCB3aGljaCB0cmFja3MgbmVlZCB0byBiZSBwcm9jZXNzZWQKQEAgLTQyNjUsNiArNDU3OCwzOCBAQAogICAgIG1NaXhlckJ1ZmZlclZhbGlkID0gZmFsc2U7ICAvLyBtTWl4ZXJCdWZmZXIgaGFzIG5vIHZhbGlkIGRhdGEgdW50aWwgYXBwcm9wcmlhdGUgdHJhY2tzIGZvdW5kLgogICAgIG1FZmZlY3RCdWZmZXJWYWxpZCA9IGZhbHNlOyAvLyBtRWZmZWN0QnVmZmVyIGhhcyBubyB2YWxpZCBkYXRhIHVudGlsIHRyYWNrcyBmb3VuZC4KIAorICAgIC8vIERlZmVycmVkT3BlcmF0aW9ucyBoYW5kbGVzIHN0YXRpc3RpY3MgYWZ0ZXIgc2V0dGluZyBtaXhlclN0YXR1cy4KKyAgICBjbGFzcyBEZWZlcnJlZE9wZXJhdGlvbnMgeworICAgIHB1YmxpYzoKKyAgICAgICAgRGVmZXJyZWRPcGVyYXRpb25zKG1peGVyX3N0YXRlICptaXhlclN0YXR1cykKKyAgICAgICAgICAgIDogbU1peGVyU3RhdHVzKG1peGVyU3RhdHVzKSB7IH0KKworICAgICAgICAvLyB3aGVuIGxlYXZpbmcgc2NvcGUsIHRhbGx5IGZyYW1lcyBwcm9wZXJseS4KKyAgICAgICAgfkRlZmVycmVkT3BlcmF0aW9ucygpIHsKKyAgICAgICAgICAgIC8vIFRhbGx5IHVuZGVycnVuIGZyYW1lcyBvbmx5IGlmIHdlIGFyZSBhY3R1YWxseSBtaXhpbmcgKE1JWEVSX1RSQUNLU19SRUFEWSkKKyAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhhdCBpcyB3aGVuIHRoZSB1bmRlcnJ1biBvY2N1cnMuCisgICAgICAgICAgICAvLyBXZSBkbyBub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBGYXN0VHJhY2tzIGFuZCBOb3JtYWxUcmFja3MgaGVyZS4KKyAgICAgICAgICAgIGlmICgqbU1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19SRUFEWSkgeworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmdW5kZXJydW4gOiBtVW5kZXJydW5GcmFtZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgdW5kZXJydW4uZmlyc3QtPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPnRhbGx5VW5kZXJydW5GcmFtZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5kZXJydW4uc2Vjb25kKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB0YWxseVVuZGVycnVuRnJhbWVzKCkgaXMgY2FsbGVkIHRvIHVwZGF0ZSB0aGUgdHJhY2sgY291bnRlcnMKKyAgICAgICAgLy8gd2l0aCB0aGUgbnVtYmVyIG9mIHVuZGVycnVuIGZyYW1lcyBmb3IgYSBwYXJ0aWN1bGFyIG1peGVyIHBlcmlvZC4KKyAgICAgICAgLy8gV2UgZGVmZXIgdGFsbHlpbmcgdW50aWwgd2Uga25vdyB0aGUgZmluYWwgbWl4ZXIgc3RhdHVzLgorICAgICAgICB2b2lkIHRhbGx5VW5kZXJydW5GcmFtZXMoc3A8VHJhY2s+IHRyYWNrLCBzaXplX3QgdW5kZXJydW5GcmFtZXMpIHsKKyAgICAgICAgICAgIG1VbmRlcnJ1bkZyYW1lcy5lbXBsYWNlX2JhY2sodHJhY2ssIHVuZGVycnVuRnJhbWVzKTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgbWl4ZXJfc3RhdGUgKiBjb25zdCBtTWl4ZXJTdGF0dXM7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxzcDxUcmFjaz4sIHNpemVfdD4+IG1VbmRlcnJ1bkZyYW1lczsKKyAgICB9IGRlZmVycmVkT3BlcmF0aW9ucygmbWl4ZXJTdGF0dXMpOyAvLyBpbXBsaWNpdCBuZXN0ZWQgc2NvcGUgZm9yIHZhcmlhYmxlIGNhcHR1cmUKKworICAgIGJvb2wgbm9GYXN0SGFwdGljVHJhY2sgPSB0cnVlOwogICAgIGZvciAoc2l6ZV90IGk9MCA7IGk8Y291bnQgOyBpKyspIHsKICAgICAgICAgY29uc3Qgc3A8VHJhY2s+IHQgPSBtQWN0aXZlVHJhY2tzW2ldOwogCkBAIC00MjczLDYgKzQ2MTgsMTMgQEAKIAogICAgICAgICAvLyBwcm9jZXNzIGZhc3QgdHJhY2tzCiAgICAgICAgIGlmICh0cmFjay0+aXNGYXN0VHJhY2soKSkgeworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtRmFzdE1peGVyLmdldCgpID09IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICIlcyglZCk6IEZhc3RUcmFjayglZCkgcHJlc2VudCB3aXRob3V0IEZhc3RNaXhlciIsCisgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgaWQoKSwgdHJhY2stPmlkKCkpOworCisgICAgICAgICAgICBpZiAodHJhY2stPmdldEhhcHRpY1BsYXliYWNrRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgbm9GYXN0SGFwdGljVHJhY2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gSXQncyB0aGVvcmV0aWNhbGx5IHBvc3NpYmxlICh0aG91Z2ggdW5saWtlbHkpIGZvciBhIGZhc3QgdHJhY2sgdG8gYmUgY3JlYXRlZAogICAgICAgICAgICAgLy8gYW5kIHRoZW4gcmVtb3ZlZCB3aXRoaW4gdGhlIHNhbWUgbm9ybWFsIG1peCBjeWNsZS4gIFRoaXMgaXMgbm90IGEgcHJvYmxlbSwgYXMKQEAgLTQyOTksMTMgKzQ2NTEsMTQgQEAKICAgICAgICAgICAgIHRyYWNrLT5tT2JzZXJ2ZWRVbmRlcnJ1bnMgPSB1bmRlcnJ1bnM7CiAgICAgICAgICAgICAvLyBkb24ndCBjb3VudCB1bmRlcnJ1bnMgdGhhdCBvY2N1ciB3aGlsZSBzdG9wcGluZyBvciBwYXVzaW5nCiAgICAgICAgICAgICAvLyBvciBzdG9wcGVkIHdoaWNoIGNhbiBvY2N1ciB3aGVuIGZsdXNoKCkgaXMgY2FsbGVkIHdoaWxlIGFjdGl2ZQorICAgICAgICAgICAgc2l6ZV90IHVuZGVycnVuRnJhbWVzID0gMDsKICAgICAgICAgICAgIGlmICghKHRyYWNrLT5pc1N0b3BwaW5nKCkgfHwgdHJhY2stPmlzUGF1c2luZygpIHx8IHRyYWNrLT5pc1N0b3BwZWQoKSkgJiYKICAgICAgICAgICAgICAgICAgICAgcmVjZW50VW5kZXJydW5zID4gMCkgewogICAgICAgICAgICAgICAgIC8vIEZJWE1FIGZhc3QgbWl4ZXIgd2lsbCBwdWxsICYgbWl4IHBhcnRpYWwgYnVmZmVycywgYnV0IHdlIGNvdW50IGFzIGEgZnVsbCB1bmRlcnJ1bgotICAgICAgICAgICAgICAgIHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT50YWxseVVuZGVycnVuRnJhbWVzKHJlY2VudFVuZGVycnVucyAqIG1GcmFtZUNvdW50KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPnRhbGx5VW5kZXJydW5GcmFtZXMoMCk7CisgICAgICAgICAgICAgICAgdW5kZXJydW5GcmFtZXMgPSByZWNlbnRVbmRlcnJ1bnMgKiBtRnJhbWVDb3VudDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEltbWVkaWF0ZWx5IGFjY291bnQgZm9yIEZhc3RUcmFjayB1bmRlcnJ1bnMuCisgICAgICAgICAgICB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcyh1bmRlcnJ1bkZyYW1lcyk7CiAKICAgICAgICAgICAgIC8vIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgc3RhdGUgbWFjaGluZSBmb3Igbm9ybWFsIHRyYWNrcywKICAgICAgICAgICAgIC8vIHdpdGggYSBmZXcgbW9kaWZpY2F0aW9ucyBmb3IgZmFzdCB0cmFja3MuCkBAIC00MzUyLDcgKzQ3MDUsNyBAQAogICAgICAgICAgICAgICAgICAgICBpc0FjdGl2ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6U1RPUFBJTkdfMjoKICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpQQVVTRUQ6CiAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6U1RPUFBFRDoKQEAgLTQzOTcsNiArNDc1MCw4IEBACiAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyID0gdnA7CiAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUNoYW5uZWxNYXNrID0gdHJhY2stPm1DaGFubmVsTWFzazsKICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tRm9ybWF0ID0gdHJhY2stPm1Gb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IHRyYWNrLT5nZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoKTsKKyAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tSGFwdGljSW50ZW5zaXR5ID0gdHJhY2stPmdldEhhcHRpY0ludGVuc2l0eSgpOwogICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1HZW5lcmF0aW9uKys7CiAgICAgICAgICAgICAgICAgICAgIHN0YXRlLT5tVHJhY2tNYXNrIHw9IDEgPDwgajsKICAgICAgICAgICAgICAgICAgICAgZGlkTW9kaWZ5ID0gdHJ1ZTsKQEAgLTQ0MDcsOSArNDc2MiwxNCBAQAogICAgICAgICAgICAgICAgIC8vIGxhY2tzIGFueSBzeW5jaHJvbml6YXRpb24gb3IgYmFycmllciBzbyBWb2x1bWVQcm92aWRlciBtYXkgcmVhZCBhIHN0YWxlIHZhbHVlCiAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgdmggPSB0cmFjay0+Z2V0Vm9sdW1lSGFuZGxlcigpLT5nZXRWb2x1bWUoCiAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eS0+ZnJhbWVzUmVsZWFzZWQoKSkuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lID0gbWFzdGVyVm9sdW1lCisgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lOworICAgICAgICAgICAgICAgIGlmICh0cmFjay0+aXNQbGF5YmFja1Jlc3RyaWN0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICB2b2x1bWUgPSAwLmY7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdm9sdW1lID0gbWFzdGVyVm9sdW1lCiAgICAgICAgICAgICAgICAgICAgICAgICAqIG1TdHJlYW1UeXBlc1t0cmFjay0+c3RyZWFtVHlwZSgpXS52b2x1bWUKICAgICAgICAgICAgICAgICAgICAgICAgICogdmg7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHRyYWNrLT5tQ2FjaGVkVm9sdW1lID0gdm9sdW1lOwogICAgICAgICAgICAgICAgIGdhaW5fbWluaWZsb2F0X3BhY2tlZF90IHZsciA9IHByb3h5LT5nZXRWb2x1bWVMUigpOwogICAgICAgICAgICAgICAgIGZsb2F0IHZsZiA9IHZvbHVtZSAqIGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfbGVmdCh2bHIpKTsKQEAgLTQ0NDIsNiArNDgwMiwxMCBAQAogICAgICAgICAgICAgICAgIC8vIEF2b2lkcyBhIG1pc2xlYWRpbmcgZGlzcGxheSBpbiBkdW1wc3lzCiAgICAgICAgICAgICAgICAgdHJhY2stPm1PYnNlcnZlZFVuZGVycnVucy5tQml0RmllbGRzLm1Nb3N0UmVjZW50ID0gVU5ERVJSVU5fRlVMTDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmYXN0VHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQgIT0gdHJhY2stPmdldEhhcHRpY1BsYXliYWNrRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkID0gdHJhY2stPmdldEhhcHRpY1BsYXliYWNrRW5hYmxlZCgpOworICAgICAgICAgICAgICAgIGRpZE1vZGlmeSA9IHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCkBAIC00NDUxLDE5ICs0ODE1LDIxIEBACiAKICAgICAgICAgLy8gVGhlIGZpcnN0IHRpbWUgYSB0cmFjayBpcyBhZGRlZCB3ZSB3YWl0CiAgICAgICAgIC8vIGZvciBhbGwgaXRzIGJ1ZmZlcnMgdG8gYmUgZmlsbGVkIGJlZm9yZSBwcm9jZXNzaW5nIGl0Ci0gICAgICAgIGludCBuYW1lID0gdHJhY2stPm5hbWUoKTsKKyAgICAgICAgY29uc3QgaW50IHRyYWNrSWQgPSB0cmFjay0+aWQoKTsKIAogICAgICAgICAvLyBpZiBhbiBhY3RpdmUgdHJhY2sgZG9lc24ndCBleGlzdCBpbiB0aGUgQXVkaW9NaXhlciwgY3JlYXRlIGl0LgotICAgICAgICBpZiAoIW1BdWRpb01peGVyLT5leGlzdHMobmFtZSkpIHsKKyAgICAgICAgLy8gdXNlIHRoZSB0cmFja0lkIGFzIHRoZSBBdWRpb01peGVyIG5hbWUuCisgICAgICAgIGlmICghbUF1ZGlvTWl4ZXItPmV4aXN0cyh0cmFja0lkKSkgewogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvTWl4ZXItPmNyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1DaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1Gb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tU2Vzc2lvbklkKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiJXM6IGNhbm5vdCBjcmVhdGUgdHJhY2sgbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgJWQsIG1hc2sgJSN4LCBmb3JtYXQgJSN4LCBzZXNzaW9uSWQgJWQgaW4gQXVkaW9NaXhlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbmFtZSwgdHJhY2stPm1DaGFubmVsTWFzaywgdHJhY2stPm1Gb3JtYXQsIHRyYWNrLT5tU2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoKTogQXVkaW9NaXhlciBjYW5ub3QgY3JlYXRlIHRyYWNrKCVkKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgbWFzayAlI3gsIGZvcm1hdCAlI3gsIHNlc3Npb25JZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdHJhY2tJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tQ2hhbm5lbE1hc2ssIHRyYWNrLT5tRm9ybWF0LCB0cmFjay0+bVNlc3Npb25JZCk7CiAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CiAgICAgICAgICAgICAgICAgdHJhY2stPmludmFsaWRhdGUoKTsgLy8gY29uc2lkZXIgaXQgZGVhZC4KICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTQ0ODQsNyArNDg1MCw3IEBACiAgICAgICAgIC8vIFRPRE86IE9OTFkgVVNFRCBGT1IgTEVHQUNZIFJFU0FNUExFUlMsIHJlbW92ZSB3aGVuIHRoZXkgYXJlIHJlbW92ZWQuCiAgICAgICAgIC8vIGFkZCBmcmFtZXMgYWxyZWFkeSBjb25zdW1lZCBidXQgbm90IHlldCByZWxlYXNlZCBieSB0aGUgcmVzYW1wbGVyCiAgICAgICAgIC8vIGJlY2F1c2UgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVhZHkoKSB3aWxsIGluY2x1ZGUgdGhlc2UgZnJhbWVzCi0gICAgICAgIGRlc2lyZWRGcmFtZXMgKz0gbUF1ZGlvTWl4ZXItPmdldFVucmVsZWFzZWRGcmFtZXModHJhY2stPm5hbWUoKSk7CisgICAgICAgIGRlc2lyZWRGcmFtZXMgKz0gbUF1ZGlvTWl4ZXItPmdldFVucmVsZWFzZWRGcmFtZXModHJhY2tJZCk7CiAKICAgICAgICAgdWludDMyX3QgbWluRnJhbWVzID0gMTsKICAgICAgICAgaWYgKCh0cmFjay0+c2hhcmVkQnVmZmVyKCkgPT0gMCkgJiYgIXRyYWNrLT5pc1N0b3BwZWQoKSAmJiAhdHJhY2stPmlzUGF1c2luZygpICYmCkBAIC00NDk2LDEzICs0ODYyLDEzIEBACiAgICAgICAgIGlmIChBVFJBQ0VfRU5BQkxFRCgpKSB7CiAgICAgICAgICAgICAvLyBJIHdpc2ggd2UgaGFkIGZvcm1hdHRlZCB0cmFjZSBuYW1lcwogICAgICAgICAgICAgc3RkOjpzdHJpbmcgdHJhY2VOYW1lKCJuUmR5Iik7Ci0gICAgICAgICAgICB0cmFjZU5hbWUgKz0gc3RkOjp0b19zdHJpbmcodHJhY2stPm5hbWUoKSk7CisgICAgICAgICAgICB0cmFjZU5hbWUgKz0gc3RkOjp0b19zdHJpbmcodHJhY2tJZCk7CiAgICAgICAgICAgICBBVFJBQ0VfSU5UKHRyYWNlTmFtZS5jX3N0cigpLCBmcmFtZXNSZWFkeSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKChmcmFtZXNSZWFkeSA+PSBtaW5GcmFtZXMpICYmIHRyYWNrLT5pc1JlYWR5KCkgJiYKICAgICAgICAgICAgICAgICAhdHJhY2stPmlzUGF1c2VkKCkgJiYgIXRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkKICAgICAgICAgewotICAgICAgICAgICAgQUxPR1ZWKCJ0cmFjayAlZCBzPSUwOHggW09LXSBvbiB0aHJlYWQgJXAiLCBuYW1lLCBjYmxrLT5tU2VydmVyLCB0aGlzKTsKKyAgICAgICAgICAgIEFMT0dWVigidHJhY2soJWQpIHM9JTA4eCBbT0tdIG9uIHRocmVhZCAlcCIsIHRyYWNrSWQsIGNibGstPm1TZXJ2ZXIsIHRoaXMpOwogCiAgICAgICAgICAgICBtaXhlZFRyYWNrcysrOwogCkBAIC00NTE5LDkgKzQ4ODUsOSBAQAogICAgICAgICAgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrc1dpdGhFZmZlY3QrKzsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygicHJlcGFyZVRyYWNrc19sKCk6IHRyYWNrICVkIGF0dGFjaGVkIHRvIGVmZmVjdCBidXQgbm8gY2hhaW4gZm91bmQgb24gIgorICAgICAgICAgICAgICAgICAgICBBTE9HVygicHJlcGFyZVRyYWNrc19sKCk6IHRyYWNrKCVkKSBhdHRhY2hlZCB0byBlZmZlY3QgYnV0IG5vIGNoYWluIGZvdW5kIG9uICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2Vzc2lvbiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLCB0cmFjay0+c2Vzc2lvbklkKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtNDUzMiw5ICs0ODk4LDEyIEBACiAgICAgICAgICAgICAgICAgdHJhY2stPm1GaWxsaW5nVXBTdGF0dXMgPSBUcmFjazo6RlNfQUNUSVZFOwogICAgICAgICAgICAgICAgIGlmICh0cmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UkVTVU1JTkcpIHsKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6QUNUSVZFOwotICAgICAgICAgICAgICAgICAgICBwYXJhbSA9IEF1ZGlvTWl4ZXI6OlJBTVBfVk9MVU1FOworICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIG5ldyB0cmFjayBpcyBwYXVzZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgc3RhcnQsIGRvIG5vdCByYW1wIG9uIHJlc3VtZS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNibGstPm1TZXJ2ZXIgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0gPSBBdWRpb01peGVyOjpSQU1QX1ZPTFVNRTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlJFU0FNUExFLCBBdWRpb01peGVyOjpSRVNFVCwgTlVMTCk7CisgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcih0cmFja0lkLCBBdWRpb01peGVyOjpSRVNBTVBMRSwgQXVkaW9NaXhlcjo6UkVTRVQsIE5VTEwpOwogICAgICAgICAgICAgICAgIG1MZWZ0Vm9sRmxvYXQgPSAtMS4wOwogICAgICAgICAgICAgLy8gRklYTUUgc2hvdWxkIG5vdCBtYWtlIGEgZGVjaXNpb24gYmFzZWQgb24gbVNlcnZlcgogICAgICAgICAgICAgfSBlbHNlIGlmIChjYmxrLT5tU2VydmVyICE9IDApIHsKQEAgLTQ1NDksMTUgKzQ5MTgsMTkgQEAKICAgICAgICAgICAgIC8vIHJlYWQgb3JpZ2luYWwgdm9sdW1lcyB3aXRoIHZvbHVtZSBjb250cm9sCiAgICAgICAgICAgICBmbG9hdCB0eXBlVm9sdW1lID0gbVN0cmVhbVR5cGVzW3RyYWNrLT5zdHJlYW1UeXBlKCldLnZvbHVtZTsKICAgICAgICAgICAgIGZsb2F0IHYgPSBtYXN0ZXJWb2x1bWUgKiB0eXBlVm9sdW1lOworICAgICAgICAgICAgLy8gQWx3YXlzIGZldGNoIHZvbHVtZXNoYXBlciB2b2x1bWUgdG8gZW5zdXJlIHN0YXRlIGlzIHVwZGF0ZWQuCisgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1RyYWNrU2VydmVyUHJveHk+IHByb3h5ID0gdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHk7CisgICAgICAgICAgICBjb25zdCBmbG9hdCB2aCA9IHRyYWNrLT5nZXRWb2x1bWVIYW5kbGVyKCktPmdldFZvbHVtZSgKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlbGVhc2VkKCkpLmZpcnN0OwogCi0gICAgICAgICAgICBpZiAodHJhY2stPmlzUGF1c2luZygpIHx8IG1TdHJlYW1UeXBlc1t0cmFjay0+c3RyZWFtVHlwZSgpXS5tdXRlKSB7CisgICAgICAgICAgICBpZiAodHJhY2stPmlzUGF1c2luZygpIHx8IG1TdHJlYW1UeXBlc1t0cmFjay0+c3RyZWFtVHlwZSgpXS5tdXRlCisgICAgICAgICAgICAgICAgICAgIHx8IHRyYWNrLT5pc1BsYXliYWNrUmVzdHJpY3RlZCgpKSB7CiAgICAgICAgICAgICAgICAgdmwgPSB2ciA9IDA7CiAgICAgICAgICAgICAgICAgdmxmID0gdnJmID0gdmFmID0gMC47CiAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1BhdXNpbmcoKSkgewogICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2V0UGF1c2VkKCk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcDxBdWRpb1RyYWNrU2VydmVyUHJveHk+IHByb3h5ID0gdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHk7CiAgICAgICAgICAgICAgICAgZ2Fpbl9taW5pZmxvYXRfcGFja2VkX3QgdmxyID0gcHJveHktPmdldFZvbHVtZUxSKCk7CiAgICAgICAgICAgICAgICAgdmxmID0gZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19sZWZ0KHZscikpOwogICAgICAgICAgICAgICAgIHZyZiA9IGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfcmlnaHQodmxyKSk7CkBAIC00NTcwLDggKzQ5NDMsNiBAQAogICAgICAgICAgICAgICAgICAgICBBTE9HVigiVHJhY2sgcmlnaHQgdm9sdW1lIG91dCBvZiByYW5nZTogJS4zZyIsIHZyZik7CiAgICAgICAgICAgICAgICAgICAgIHZyZiA9IEdBSU5fRkxPQVRfVU5JVFk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IHZoID0gdHJhY2stPmdldFZvbHVtZUhhbmRsZXIoKS0+Z2V0Vm9sdW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlbGVhc2VkKCkpLmZpcnN0OwogICAgICAgICAgICAgICAgIC8vIG5vdyBhcHBseSB0aGUgbWFzdGVyIHZvbHVtZSBhbmQgc3RyZWFtIHR5cGUgdm9sdW1lIGFuZCBzaGFwZXIgdm9sdW1lCiAgICAgICAgICAgICAgICAgdmxmICo9IHYgKiB2aDsKICAgICAgICAgICAgICAgICB2cmYgKj0gdiAqIHZoOwpAQCAtNDYzMCw0MSArNTAwMSw0MiBAQAogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gWFhYOiB0aGVzZSB0aGluZ3MgRE9OJ1QgbmVlZCB0byBiZSBkb25lIGVhY2ggdGltZQotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKG5hbWUsIHRyYWNrKTsKLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5lbmFibGUobmFtZSk7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIodHJhY2tJZCwgdHJhY2spOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPmVuYWJsZSh0cmFja0lkKTsKIAotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBwYXJhbSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJnZsZik7Ci0gICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIHBhcmFtLCBBdWRpb01peGVyOjpWT0xVTUUxLCAmdnJmKTsKLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgcGFyYW0sIEF1ZGlvTWl4ZXI6OkFVWExFVkVMLCAmdmFmKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIodHJhY2tJZCwgcGFyYW0sIEF1ZGlvTWl4ZXI6OlZPTFVNRTAsICZ2bGYpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcih0cmFja0lkLCBwYXJhbSwgQXVkaW9NaXhlcjo6Vk9MVU1FMSwgJnZyZik7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKHRyYWNrSWQsIHBhcmFtLCBBdWRpb01peGVyOjpBVVhMRVZFTCwgJnZhZik7CiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpGT1JNQVQsICh2b2lkICopdHJhY2stPmZvcm1hdCgpKTsKICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkNIQU5ORUxfTUFTSywgKHZvaWQgKikodWludHB0cl90KXRyYWNrLT5jaGFubmVsTWFzaygpKTsKICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAotICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0NIQU5ORUxfTUFTSywgKHZvaWQgKikodWludHB0cl90KW1DaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfQ0hBTk5FTF9NQVNLLAorICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdCkobUNoYW5uZWxNYXNrIHwgbUhhcHRpY0NoYW5uZWxNYXNrKSk7CiAgICAgICAgICAgICAvLyBsaW1pdCB0cmFjayBzYW1wbGUgcmF0ZSB0byAyIHggb3V0cHV0IHNhbXBsZSByYXRlLCB3aGljaCBjaGFuZ2VzIGF0IHJlLWNvbmZpZ3VyYXRpb24KICAgICAgICAgICAgIHVpbnQzMl90IG1heFNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZSAqIEFVRElPX1JFU0FNUExFUl9ET1dOX1JBVElPX01BWDsKLSAgICAgICAgICAgIHVpbnQzMl90IHJlcVNhbXBsZVJhdGUgPSB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0U2FtcGxlUmF0ZSgpOworICAgICAgICAgICAgdWludDMyX3QgcmVxU2FtcGxlUmF0ZSA9IHByb3h5LT5nZXRTYW1wbGVSYXRlKCk7CiAgICAgICAgICAgICBpZiAocmVxU2FtcGxlUmF0ZSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgcmVxU2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlOwogICAgICAgICAgICAgfSBlbHNlIGlmIChyZXFTYW1wbGVSYXRlID4gbWF4U2FtcGxlUmF0ZSkgewogICAgICAgICAgICAgICAgIHJlcVNhbXBsZVJhdGUgPSBtYXhTYW1wbGVSYXRlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6UkVTQU1QTEUsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6U0FNUExFX1JBVEUsCiAgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KXJlcVNhbXBsZVJhdGUpOwogCi0gICAgICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSBwbGF5YmFja1JhdGUgPSB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0UGxheWJhY2tSYXRlKCk7CisgICAgICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSBwbGF5YmFja1JhdGUgPSBwcm94eS0+Z2V0UGxheWJhY2tSYXRlKCk7CiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUSU1FU1RSRVRDSCwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpQTEFZQkFDS19SQVRFLAogICAgICAgICAgICAgICAgICZwbGF5YmFja1JhdGUpOwpAQCAtNDY4NSwyOSArNTA1NywzNyBAQAogICAgICAgICAgICAgICAgICAgICAmJiAodHJhY2stPm1haW5CdWZmZXIoKSA9PSBtU2lua0J1ZmZlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHRyYWNrLT5tYWluQnVmZmVyKCkgPT0gbU1peGVyQnVmZmVyKSkgewogICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULCAodm9pZCAqKW1NaXhlckJ1ZmZlckZvcm1hdCk7CiAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwgKHZvaWQgKiltTWl4ZXJCdWZmZXIpOwogICAgICAgICAgICAgICAgIC8vIFRPRE86IG92ZXJyaWRlIHRyYWNrLT5tYWluQnVmZmVyKCk/CiAgICAgICAgICAgICAgICAgbU1peGVyQnVmZmVyVmFsaWQgPSB0cnVlOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1JWEVSX0ZPUk1BVCwgKHZvaWQgKilFRkZFQ1RfQlVGRkVSX0ZPUk1BVCk7CiAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwgKHZvaWQgKil0cmFjay0+bWFpbkJ1ZmZlcigpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkFVWF9CVUZGRVIsICh2b2lkICopdHJhY2stPmF1eEJ1ZmZlcigpKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgdHJhY2tJZCwKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpIQVBUSUNfRU5BQkxFRCwgKHZvaWQgKikodWludHB0cl90KXRyYWNrLT5nZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoKSk7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIHRyYWNrSWQsCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCisgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6SEFQVElDX0lOVEVOU0lUWSwgKHZvaWQgKikodWludHB0cl90KXRyYWNrLT5nZXRIYXB0aWNJbnRlbnNpdHkoKSk7CiAKICAgICAgICAgICAgIC8vIHJlc2V0IHJldHJ5IGNvdW50CiAgICAgICAgICAgICB0cmFjay0+bVJldHJ5Q291bnQgPSBrTWF4VHJhY2tSZXRyaWVzOwpAQCAtNDcyMCwxMyArNTEwMCwxMyBAQAogICAgICAgICAgICAgICAgIG1peGVyU3RhdHVzID0gTUlYRVJfVFJBQ0tTX1JFQURZOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2l6ZV90IHVuZGVycnVuRnJhbWVzID0gMDsKICAgICAgICAgICAgIGlmIChmcmFtZXNSZWFkeSA8IGRlc2lyZWRGcmFtZXMgJiYgIXRyYWNrLT5pc1N0b3BwZWQoKSAmJiAhdHJhY2stPmlzUGF1c2VkKCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigidHJhY2soJXApIHVuZGVycnVuLCAgZnJhbWVzUmVhZHkoJXp1KSA8IGZyYW1lc0Rlc2lyZWQoJXpkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICB0cmFjaywgZnJhbWVzUmVhZHksIGRlc2lyZWRGcmFtZXMpOwotICAgICAgICAgICAgICAgIHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT50YWxseVVuZGVycnVuRnJhbWVzKGRlc2lyZWRGcmFtZXMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcygwKTsKKyAgICAgICAgICAgICAgICBBTE9HVigidHJhY2soJWQpIHVuZGVycnVuLCAgZnJhbWVzUmVhZHkoJXp1KSA8IGZyYW1lc0Rlc2lyZWQoJXpkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLCBmcmFtZXNSZWFkeSwgZGVzaXJlZEZyYW1lcyk7CisgICAgICAgICAgICAgICAgdW5kZXJydW5GcmFtZXMgPSBkZXNpcmVkRnJhbWVzOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmZXJyZWRPcGVyYXRpb25zLnRhbGx5VW5kZXJydW5GcmFtZXModHJhY2ssIHVuZGVycnVuRnJhbWVzKTsKIAogICAgICAgICAgICAgLy8gY2xlYXIgZWZmZWN0IGNoYWluIGlucHV0IGJ1ZmZlciBpZiBhbiBhY3RpdmUgdHJhY2sgdW5kZXJydW5zIHRvIGF2b2lkIHNlbmRpbmcKICAgICAgICAgICAgIC8vIHByZXZpb3VzIGF1ZGlvIGJ1ZmZlciBhZ2FpbiB0byBlZmZlY3RzCkBAIC00NzM1LDcgKzUxMTUsNyBAQAogICAgICAgICAgICAgICAgIGNoYWluLT5jbGVhcklucHV0QnVmZmVyKCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIEFMT0dWVigidHJhY2sgJWQgcz0lMDh4IFtOT1QgUkVBRFldIG9uIHRocmVhZCAlcCIsIG5hbWUsIGNibGstPm1TZXJ2ZXIsIHRoaXMpOworICAgICAgICAgICAgQUxPR1ZWKCJ0cmFjayglZCkgcz0lMDh4IFtOT1QgUkVBRFldIG9uIHRocmVhZCAlcCIsIHRyYWNrSWQsIGNibGstPm1TZXJ2ZXIsIHRoaXMpOwogICAgICAgICAgICAgaWYgKCh0cmFjay0+c2hhcmVkQnVmZmVyKCkgIT0gMCkgfHwgdHJhY2stPmlzVGVybWluYXRlZCgpIHx8CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5pc1N0b3BwZWQoKSB8fCB0cmFjay0+aXNQYXVzZWQoKSkgewogICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgY29uc3VtZWQgYWxsIHRoZSBidWZmZXJzIG9mIHRoaXMgdHJhY2suCkBAIC00NzU0LDcgKzUxMzQsOCBAQAogICAgICAgICAgICAgICAgIC8vIE5vIGJ1ZmZlcnMgZm9yIHRoaXMgdHJhY2suIEdpdmUgaXQgYSBmZXcgY2hhbmNlcyB0bwogICAgICAgICAgICAgICAgIC8vIGZpbGwgYSBidWZmZXIsIHRoZW4gcmVtb3ZlIGl0IGZyb20gYWN0aXZlIGxpc3QuCiAgICAgICAgICAgICAgICAgaWYgKC0tKHRyYWNrLT5tUmV0cnlDb3VudCkgPD0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HSSgiQlVGRkVSIFRJTUVPVVQ6IHJlbW92ZSglZCkgZnJvbSBhY3RpdmUgbGlzdCBvbiB0aHJlYWQgJXAiLCBuYW1lLCB0aGlzKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koIkJVRkZFUiBUSU1FT1VUOiByZW1vdmUoJWQpIGZyb20gYWN0aXZlIGxpc3Qgb24gdGhyZWFkICVwIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CiAgICAgICAgICAgICAgICAgICAgIC8vIGluZGljYXRlIHRvIGNsaWVudCBwcm9jZXNzIHRoYXQgdGhlIHRyYWNrIHdhcyBkaXNhYmxlZCBiZWNhdXNlIG9mIHVuZGVycnVuOwogICAgICAgICAgICAgICAgICAgICAvLyBpdCB3aWxsIHRoZW4gYXV0b21hdGljYWxseSBjYWxsIHN0YXJ0KCkgd2hlbiBkYXRhIGlzIGF2YWlsYWJsZQpAQCAtNDc2NywxMyArNTE0OCwyNCBAQAogICAgICAgICAgICAgICAgICAgICBtaXhlclN0YXR1cyA9IE1JWEVSX1RSQUNLU19FTkFCTEVEOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5kaXNhYmxlKG5hbWUpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPmRpc2FibGUodHJhY2tJZCk7CiAgICAgICAgIH0KIAogICAgICAgICB9ICAgLy8gbG9jYWwgdmFyaWFibGUgc2NvcGUgdG8gYXZvaWQgZ290byB3YXJuaW5nCiAKICAgICB9CiAKKyAgICBpZiAobUhhcHRpY0NoYW5uZWxNYXNrICE9IEFVRElPX0NIQU5ORUxfTk9ORSAmJiBzcSAhPSBOVUxMKSB7CisgICAgICAgIC8vIFdoZW4gdGhlcmUgaXMgbm8gZmFzdCB0cmFjayBwbGF5aW5nIGhhcHRpYyBhbmQgRmFzdE1peGVyIGV4aXN0cywKKyAgICAgICAgLy8gZW5hYmxpbmcgdGhlIGZpcnN0IEZhc3RUcmFjaywgd2hpY2ggcHJvdmlkZXMgbWl4ZWQgZGF0YSBmcm9tIG5vcm1hbAorICAgICAgICAvLyB0cmFja3MsIHRvIHBsYXkgaGFwdGljIGRhdGEuCisgICAgICAgIEZhc3RUcmFjayAqZmFzdFRyYWNrID0gJnN0YXRlLT5tRmFzdFRyYWNrc1swXTsKKyAgICAgICAgaWYgKGZhc3RUcmFjay0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCAhPSBub0Zhc3RIYXB0aWNUcmFjaykgeworICAgICAgICAgICAgZmFzdFRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkID0gbm9GYXN0SGFwdGljVHJhY2s7CisgICAgICAgICAgICBkaWRNb2RpZnkgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCiAgICAgLy8gUHVzaCB0aGUgbmV3IEZhc3RNaXhlciBzdGF0ZSBpZiBuZWNlc3NhcnkKICAgICBib29sIHBhdXNlQXVkaW9XYXRjaGRvZyA9IGZhbHNlOwogICAgIGlmIChkaWRNb2RpZnkpIHsKQEAgLTQ4MjgsOSArNTIyMCw5IEBACiAgICAgLy8gb2YgcHJlcGFyZVRyYWNrc19sKCk7IHRoaXMgcmVsZWFzZXMgYW55IG91dHN0YW5kaW5nIGJ1ZmZlciBiYWNrIHRvIHRoZSB0cmFjay4KICAgICAvLyBTZWUgYWxzbyB0aGUgaW1wbGVtZW50YXRpb24gb2YgZGVzdHJveVRyYWNrX2woKS4KICAgICBmb3IgKGNvbnN0IGF1dG8gJnRyYWNrIDogKnRyYWNrc1RvUmVtb3ZlKSB7Ci0gICAgICAgIGNvbnN0IGludCBuYW1lID0gdHJhY2stPm5hbWUoKTsKLSAgICAgICAgaWYgKG1BdWRpb01peGVyLT5leGlzdHMobmFtZSkpIHsgLy8gTm9ybWFsIHRyYWNrcyBoZXJlLCBmYXN0IHRyYWNrcyBpbiBGYXN0TWl4ZXIuCi0gICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgbnVsbHB0ciAvKiBidWZmZXJQcm92aWRlciAqLyk7CisgICAgICAgIGNvbnN0IGludCB0cmFja0lkID0gdHJhY2stPmlkKCk7CisgICAgICAgIGlmIChtQXVkaW9NaXhlci0+ZXhpc3RzKHRyYWNrSWQpKSB7IC8vIE5vcm1hbCB0cmFja3MgaGVyZSwgZmFzdCB0cmFja3MgaW4gRmFzdE1peGVyLgorICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldEJ1ZmZlclByb3ZpZGVyKHRyYWNrSWQsIG51bGxwdHIgLyogYnVmZmVyUHJvdmlkZXIgKi8pOwogICAgICAgICB9CiAgICAgfQogCkBAIC00OTk5LDE3ICs1MzkxLDE3IEBACiAgICAgICAgICAgICBkZWxldGUgbUF1ZGlvTWl4ZXI7CiAgICAgICAgICAgICBtQXVkaW9NaXhlciA9IG5ldyBBdWRpb01peGVyKG1Ob3JtYWxGcmFtZUNvdW50LCBtU2FtcGxlUmF0ZSk7CiAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnRyYWNrIDogbVRyYWNrcykgewotICAgICAgICAgICAgICAgIGNvbnN0IGludCBuYW1lID0gdHJhY2stPm5hbWUoKTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgdHJhY2tJZCA9IHRyYWNrLT5pZCgpOwogICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb01peGVyLT5jcmVhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bUZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tU2Vzc2lvbklkKTsKICAgICAgICAgICAgICAgICBBTE9HV19JRihzdGF0dXMgIT0gTk9fRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiJXM6IGNhbm5vdCBjcmVhdGUgdHJhY2sgbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgJWQsIG1hc2sgJSN4LCBmb3JtYXQgJSN4LCBzZXNzaW9uSWQgJWQgaW4gQXVkaW9NaXhlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKTogQXVkaW9NaXhlciBjYW5ub3QgY3JlYXRlIHRyYWNrKCVkKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgbWFzayAlI3gsIGZvcm1hdCAlI3gsIHNlc3Npb25JZCAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHRyYWNrLT5tQ2hhbm5lbE1hc2ssIHRyYWNrLT5tRm9ybWF0LCB0cmFjay0+bVNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLCB0cmFjay0+bUNoYW5uZWxNYXNrLCB0cmFjay0+bUZvcm1hdCwgdHJhY2stPm1TZXNzaW9uSWQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBVURJT19PVVRQVVRfQ09ORklHX0NIQU5HRUQpOwogICAgICAgICB9CkBAIC01MDE5LDEzICs1NDExLDE1IEBACiB9CiAKIAotdm9pZCBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjpkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6ZHVtcEludGVybmFsc19sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKIHsKLSAgICBQbGF5YmFja1RocmVhZDo6ZHVtcEludGVybmFscyhmZCwgYXJncyk7CisgICAgUGxheWJhY2tUaHJlYWQ6OmR1bXBJbnRlcm5hbHNfbChmZCwgYXJncyk7CiAgICAgZHByaW50ZihmZCwgIiAgVGhyZWFkIHRocm90dGxlIHRpbWUgKG1zZWNzKTogJXVcbiIsIG1UaHJlYWRUaHJvdHRsZVRpbWVNcyk7CiAgICAgZHByaW50ZihmZCwgIiAgQXVkaW9NaXhlciB0cmFja3M6ICVzXG4iLCBtQXVkaW9NaXhlci0+dHJhY2tOYW1lcygpLmNfc3RyKCkpOwogICAgIGRwcmludGYoZmQsICIgIE1hc3RlciBtb25vOiAlc1xuIiwgbU1hc3Rlck1vbm8gPyAib24iIDogIm9mZiIpOwotCisgICAgZHByaW50ZihmZCwgIiAgTWFzdGVyIGJhbGFuY2U6ICVmICglcylcbiIsIG1NYXN0ZXJCYWxhbmNlLmxvYWQoKSwKKyAgICAgICAgICAgIChoYXNGYXN0TWl4ZXIoKSA/IHN0ZDo6dG9fc3RyaW5nKG1GYXN0TWl4ZXItPmdldE1hc3RlckJhbGFuY2UoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1CYWxhbmNlLnRvU3RyaW5nKCkpLmNfc3RyKCkpOwogICAgIGlmIChoYXNGYXN0TWl4ZXIoKSkgewogICAgICAgICBkcHJpbnRmKGZkLCAiICBGYXN0TWl4ZXIgdGhyZWFkICVwIHRpZD0lZCIsIG1GYXN0TWl4ZXIuZ2V0KCksIG1GYXN0TWl4ZXItPmdldFRpZCgpKTsKIApAQCAtNTAzMyw5ICs1NDI3LDkgQEAKICAgICAgICAgLy8gd2hpbGUgd2UgYXJlIGR1bXBpbmcgaXQuICBJdCBtYXkgYmUgaW5jb25zaXN0ZW50LCBidXQgaXQgd29uJ3QgbXV0YXRlIQogICAgICAgICAvLyBUaGlzIGlzIGEgbGFyZ2Ugb2JqZWN0IHNvIHdlIHBsYWNlIGl0IG9uIHRoZSBoZWFwLgogICAgICAgICAvLyBGSVhNRSAyNTk3Mjk1ODogTmVlZCBhbiBpbnRlbGxpZ2VudCBjb3B5IGNvbnN0cnVjdG9yIHRoYXQgZG9lcyBub3QgdG91Y2ggdW51c2VkIHBhZ2VzLgotICAgICAgICBjb25zdCBGYXN0TWl4ZXJEdW1wU3RhdGUgKmNvcHkgPSBuZXcgRmFzdE1peGVyRHVtcFN0YXRlKG1GYXN0TWl4ZXJEdW1wU3RhdGUpOworICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8RmFzdE1peGVyRHVtcFN0YXRlPiBjb3B5ID0KKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEZhc3RNaXhlckR1bXBTdGF0ZT4obUZhc3RNaXhlckR1bXBTdGF0ZSk7CiAgICAgICAgIGNvcHktPmR1bXAoZmQpOwotICAgICAgICBkZWxldGUgY29weTsKIAogI2lmZGVmIFNUQVRFX1FVRVVFX0RVTVAKICAgICAgICAgLy8gU2ltaWxhciBmb3Igc3RhdGUgcXVldWUKQEAgLTUwNTYsMTIgKzU0NTAsNiBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgIE5vIEZhc3RNaXhlclxuIik7CiAgICAgfQotCi0jaWZkZWYgVEVFX1NJTksKLSAgICAvLyBXcml0ZSB0aGUgdGVlIG91dHB1dCB0byBhIC53YXYgZmlsZQotICAgIGR1bXBUZWUoZmQsIG1UZWVTb3VyY2UsIG1JZCwgJ00nKTsKLSNlbmRpZgotCiB9CiAKIHVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OmlkbGVTbGVlcFRpbWVVcygpIGNvbnN0CkBAIC01MDg4LDUyICs1NDc2LDYxIEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpEaXJlY3RPdXRwdXRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLAotICAgICAgICBBdWRpb1N0cmVhbU91dCogb3V0cHV0LCBhdWRpb19pb19oYW5kbGVfdCBpZCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgYm9vbCBzeXN0ZW1SZWFkeSkKLSAgICA6ICAgUGxheWJhY2tUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkLCBkZXZpY2UsIERJUkVDVCwgc3lzdGVtUmVhZHkpCi17Ci19Ci0KLUF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpEaXJlY3RPdXRwdXRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLAotICAgICAgICBBdWRpb1N0cmVhbU91dCogb3V0cHV0LCBhdWRpb19pb19oYW5kbGVfdCBpZCwgdWludDMyX3QgZGV2aWNlLAorICAgICAgICBBdWRpb1N0cmVhbU91dCogb3V0cHV0LCBhdWRpb19pb19oYW5kbGVfdCBpZCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgVGhyZWFkQmFzZTo6dHlwZV90IHR5cGUsIGJvb2wgc3lzdGVtUmVhZHkpCiAgICAgOiAgIFBsYXliYWNrVGhyZWFkKGF1ZGlvRmxpbmdlciwgb3V0cHV0LCBpZCwgZGV2aWNlLCB0eXBlLCBzeXN0ZW1SZWFkeSkKLSAgICAgICAgLCBtVm9sdW1lU2hhcGVyQWN0aXZlKGZhbHNlKQogeworICAgIHNldE1hc3RlckJhbGFuY2UoYXVkaW9GbGluZ2VyLT5nZXRNYXN0ZXJCYWxhbmNlX2woKSk7CiB9CiAKIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjp+RGlyZWN0T3V0cHV0VGhyZWFkKCkKIHsKIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6ZHVtcEludGVybmFsc19sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3sKKyAgICBQbGF5YmFja1RocmVhZDo6ZHVtcEludGVybmFsc19sKGZkLCBhcmdzKTsKKyAgICBkcHJpbnRmKGZkLCAiICBNYXN0ZXIgYmFsYW5jZTogJWYgIExlZnQ6ICVmICBSaWdodDogJWZcbiIsCisgICAgICAgICAgICBtTWFzdGVyQmFsYW5jZS5sb2FkKCksIG1NYXN0ZXJCYWxhbmNlTGVmdCwgbU1hc3RlckJhbGFuY2VSaWdodCk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OnNldE1hc3RlckJhbGFuY2UoZmxvYXQgYmFsYW5jZSkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtTWFzdGVyQmFsYW5jZSAhPSBiYWxhbmNlKSB7CisgICAgICAgIG1NYXN0ZXJCYWxhbmNlLnN0b3JlKGJhbGFuY2UpOworICAgICAgICBtQmFsYW5jZS5jb21wdXRlU3RlcmVvQmFsYW5jZShiYWxhbmNlLCAmbU1hc3RlckJhbGFuY2VMZWZ0LCAmbU1hc3RlckJhbGFuY2VSaWdodCk7CisgICAgICAgIGJyb2FkY2FzdF9sKCk7CisgICAgfQorfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpwcm9jZXNzVm9sdW1lX2woVHJhY2sgKnRyYWNrLCBib29sIGxhc3RUcmFjaykKIHsKICAgICBmbG9hdCBsZWZ0LCByaWdodDsKIAotICAgIGlmIChtTWFzdGVyTXV0ZSB8fCBtU3RyZWFtVHlwZXNbdHJhY2stPnN0cmVhbVR5cGUoKV0ubXV0ZSkgeworICAgIC8vIEVuc3VyZSB2b2x1bWVzaGFwZXIgc3RhdGUgYWx3YXlzIGFkdmFuY2VzIGV2ZW4gd2hlbiBtdXRlZC4KKyAgICBjb25zdCBzcDxBdWRpb1RyYWNrU2VydmVyUHJveHk+IHByb3h5ID0gdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHk7CisgICAgY29uc3QgYXV0byBbc2hhcGVyVm9sdW1lLCBzaGFwZXJBY3RpdmVdID0gdHJhY2stPmdldFZvbHVtZUhhbmRsZXIoKS0+Z2V0Vm9sdW1lKAorICAgICAgICAgICAgcHJveHktPmZyYW1lc1JlbGVhc2VkKCkpOworICAgIG1Wb2x1bWVTaGFwZXJBY3RpdmUgPSBzaGFwZXJBY3RpdmU7CisKKyAgICBpZiAobU1hc3Rlck11dGUgfHwgbVN0cmVhbVR5cGVzW3RyYWNrLT5zdHJlYW1UeXBlKCldLm11dGUgfHwgdHJhY2stPmlzUGxheWJhY2tSZXN0cmljdGVkKCkpIHsKICAgICAgICAgbGVmdCA9IHJpZ2h0ID0gMDsKICAgICB9IGVsc2UgewogICAgICAgICBmbG9hdCB0eXBlVm9sdW1lID0gbVN0cmVhbVR5cGVzW3RyYWNrLT5zdHJlYW1UeXBlKCldLnZvbHVtZTsKLSAgICAgICAgZmxvYXQgdiA9IG1NYXN0ZXJWb2x1bWUgKiB0eXBlVm9sdW1lOwotICAgICAgICBzcDxBdWRpb1RyYWNrU2VydmVyUHJveHk+IHByb3h5ID0gdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHk7Ci0KLSAgICAgICAgLy8gR2V0IHZvbHVtZXNoYXBlciBzY2FsaW5nCi0gICAgICAgIHN0ZDo6cGFpcjxmbG9hdCAvKiB2b2x1bWUgKi8sIGJvb2wgLyogYWN0aXZlICovPgotICAgICAgICAgICAgdmggPSB0cmFjay0+Z2V0Vm9sdW1lSGFuZGxlcigpLT5nZXRWb2x1bWUoCi0gICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNSZWxlYXNlZCgpKTsKLSAgICAgICAgdiAqPSB2aC5maXJzdDsKLSAgICAgICAgbVZvbHVtZVNoYXBlckFjdGl2ZSA9IHZoLnNlY29uZDsKKyAgICAgICAgY29uc3QgZmxvYXQgdiA9IG1NYXN0ZXJWb2x1bWUgKiB0eXBlVm9sdW1lICogc2hhcGVyVm9sdW1lOwogCiAgICAgICAgIGdhaW5fbWluaWZsb2F0X3BhY2tlZF90IHZsciA9IHByb3h5LT5nZXRWb2x1bWVMUigpOwogICAgICAgICBsZWZ0ID0gZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19sZWZ0KHZscikpOwogICAgICAgICBpZiAobGVmdCA+IEdBSU5fRkxPQVRfVU5JVFkpIHsKICAgICAgICAgICAgIGxlZnQgPSBHQUlOX0ZMT0FUX1VOSVRZOwogICAgICAgICB9Ci0gICAgICAgIGxlZnQgKj0gdjsKKyAgICAgICAgbGVmdCAqPSB2ICogbU1hc3RlckJhbGFuY2VMZWZ0OyAvLyBEaXJlY3RPdXRwdXRUaHJlYWQgYmFsYW5jZSBhcHBsaWVkIGFzIHRyYWNrIHZvbHVtZQogICAgICAgICByaWdodCA9IGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfcmlnaHQodmxyKSk7CiAgICAgICAgIGlmIChyaWdodCA+IEdBSU5fRkxPQVRfVU5JVFkpIHsKICAgICAgICAgICAgIHJpZ2h0ID0gR0FJTl9GTE9BVF9VTklUWTsKICAgICAgICAgfQotICAgICAgICByaWdodCAqPSB2OworICAgICAgICByaWdodCAqPSB2ICogbU1hc3RlckJhbGFuY2VSaWdodDsKICAgICB9CiAKICAgICBpZiAobGFzdFRyYWNrKSB7CkBAIC01MTQyLDIwICs1NTM5LDIwIEBACiAgICAgICAgICAgICBtTGVmdFZvbEZsb2F0ID0gbGVmdDsKICAgICAgICAgICAgIG1SaWdodFZvbEZsb2F0ID0gcmlnaHQ7CiAKLSAgICAgICAgICAgIC8vIENvbnZlcnQgdm9sdW1lcyBmcm9tIGZsb2F0IHRvIDguMjQKLSAgICAgICAgICAgIHVpbnQzMl90IHZsID0gKHVpbnQzMl90KShsZWZ0ICogKDEgPDwgMjQpKTsKLSAgICAgICAgICAgIHVpbnQzMl90IHZyID0gKHVpbnQzMl90KShyaWdodCAqICgxIDw8IDI0KSk7Ci0KICAgICAgICAgICAgIC8vIERlbGVnYXRlIHZvbHVtZSBjb250cm9sIHRvIGVmZmVjdCBpbiB0cmFjayBlZmZlY3QgY2hhaW4gaWYgbmVlZGVkCiAgICAgICAgICAgICAvLyBvbmx5IG9uZSBlZmZlY3QgY2hhaW4gY2FuIGJlIHByZXNlbnQgb24gRGlyZWN0T3V0cHV0VGhyZWFkLCBzbyBpZgogICAgICAgICAgICAgLy8gdGhlcmUgaXMgb25lLCB0aGUgdHJhY2sgaXMgY29ubmVjdGVkIHRvIGl0CiAgICAgICAgICAgICBpZiAoIW1FZmZlY3RDaGFpbnMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbUVmZmVjdENoYWluc1swXS0+c2V0Vm9sdW1lX2woJnZsLCAmdnIpOwotICAgICAgICAgICAgICAgIGxlZnQgPSAoZmxvYXQpdmwgLyAoMSA8PCAyNCk7Ci0gICAgICAgICAgICAgICAgcmlnaHQgPSAoZmxvYXQpdnIgLyAoMSA8PCAyNCk7CisgICAgICAgICAgICAgICAgLy8gaWYgZWZmZWN0IGNoYWluIGV4aXN0cywgdm9sdW1lIGlzIGhhbmRsZWQgYnkgaXQuCisgICAgICAgICAgICAgICAgLy8gQ29udmVydCB2b2x1bWVzIGZyb20gZmxvYXQgdG8gOC4yNAorICAgICAgICAgICAgICAgIHVpbnQzMl90IHZsID0gKHVpbnQzMl90KShsZWZ0ICogKDEgPDwgMjQpKTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB2ciA9ICh1aW50MzJfdCkocmlnaHQgKiAoMSA8PCAyNCkpOworICAgICAgICAgICAgICAgIC8vIERpcmVjdC9PZmZsb2FkIGVmZmVjdCBjaGFpbnMgc2V0IG91dHB1dCB2b2x1bWUgaW4gc2V0Vm9sdW1lX2woKS4KKyAgICAgICAgICAgICAgICAodm9pZCltRWZmZWN0Q2hhaW5zWzBdLT5zZXRWb2x1bWVfbCgmdmwsICZ2cik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSB3ZSBkaXJlY3RseSBzZXQgdGhlIHZvbHVtZS4KKyAgICAgICAgICAgICAgICBzZXRWb2x1bWVGb3JPdXRwdXRfbChsZWZ0LCByaWdodCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBtT3V0cHV0LT5zdHJlYW0tPnNldFZvbHVtZShsZWZ0LCByaWdodCk7Ci0gICAgICAgICAgICBBTE9HRV9JRihyZXN1bHQgIT0gT0ssICJFcnJvciB3aGVuIHNldHRpbmcgb3V0cHV0IHN0cmVhbSB2b2x1bWU6ICVkIiwgcmVzdWx0KTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTUxNzUsNiArNTU3MiwxMSBAQAogICAgICAgICAgICAgICAgIG1GbHVzaFBlbmRpbmcgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CisgICAgfSBlbHNlIGlmIChwcmV2aW91c1RyYWNrID09IDApIHsKKyAgICAgICAgLy8gdGhlcmUgY291bGQgYmUgYW4gb2xkIHRyYWNrIGFkZGVkIGJhY2sgZHVyaW5nIHRyYWNrIHRyYW5zaXRpb24gZm9yIGRpcmVjdAorICAgICAgICAvLyBvdXRwdXQsIHNvIGFsd2F5cyBpc3N1ZXMgZmx1c2ggdG8gZmx1c2ggZGF0YSBvZiB0aGUgcHJldmlvdXMgdHJhY2sgaWYgaXQKKyAgICAgICAgLy8gd2FzIGFscmVhZHkgZGVzdHJveWVkIHdpdGggSEFMIHBhdXNlZCwgdGhlbiBmbHVzaCBjYW4gcmVzdW1lIHRoZSBwbGF5YmFjaworICAgICAgICBtRmx1c2hQZW5kaW5nID0gdHJ1ZTsKICAgICB9CiAgICAgUGxheWJhY2tUaHJlYWQ6Om9uQWRkTmV3VHJhY2tfbCgpOwogfQpAQCAtNTIxMyw3ICs1NjE1LDYgQEAKICAgICAgICAgICAgICAgICBkb0h3UGF1c2UgPSB0cnVlOwogICAgICAgICAgICAgICAgIG1Id1BhdXNlZCA9IHRydWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKICAgICAgICAgfSBlbHNlIGlmICh0cmFjay0+aXNGbHVzaFBlbmRpbmcoKSkgewogICAgICAgICAgICAgdHJhY2stPmZsdXNoQWNrKCk7CiAgICAgICAgICAgICBpZiAobGFzdCkgewpAQCAtNTI0OCw3ICs1NjQ5LDcgQEAKICAgICAgICAgaWYgKCh0cmFjay0+ZnJhbWVzUmVhZHkoKSA+PSBtaW5GcmFtZXMpICYmIHRyYWNrLT5pc1JlYWR5KCkgJiYgIXRyYWNrLT5pc1BhdXNlZCgpICYmCiAgICAgICAgICAgICAgICAgIXRyYWNrLT5pc1N0b3BwaW5nXzIoKSAmJiAhdHJhY2stPmlzU3RvcHBlZCgpKQogICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HVlYoInRyYWNrICVkIHM9JTA4eCBbT0tdIiwgdHJhY2stPm5hbWUoKSwgY2Jsay0+bVNlcnZlcik7CisgICAgICAgICAgICBBTE9HVlYoInRyYWNrKCVkKSBzPSUwOHggW09LXSIsIHRyYWNrLT5pZCgpLCBjYmxrLT5tU2VydmVyKTsKIAogICAgICAgICAgICAgaWYgKHRyYWNrLT5tRmlsbGluZ1VwU3RhdHVzID09IFRyYWNrOjpGU19GSUxMRUQpIHsKICAgICAgICAgICAgICAgICB0cmFjay0+bUZpbGxpbmdVcFN0YXR1cyA9IFRyYWNrOjpGU19BQ1RJVkU7CkBAIC01MzEwLDcgKzU3MTEsOCBAQAogCiAgICAgICAgICAgICAgICAgaW50NjRfdCBmcmFtZXNXcml0dGVuID0gbUJ5dGVzV3JpdHRlbiAvIG1GcmFtZVNpemU7CiAgICAgICAgICAgICAgICAgaWYgKG1TdGFuZGJ5IHx8ICFsYXN0IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlc2VudGF0aW9uQ29tcGxldGUoZnJhbWVzV3JpdHRlbiwgYXVkaW9IQUxGcmFtZXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlc2VudGF0aW9uQ29tcGxldGUoZnJhbWVzV3JpdHRlbiwgYXVkaW9IQUxGcmFtZXMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+aXNQYXVzZWQoKSkgewogICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2stPmlzU3RvcHBpbmdfMigpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpTVE9QUEVEOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC01MzI0LDcgKzU3MjYsNyBAQAogICAgICAgICAgICAgICAgIC8vIGZpbGwgYSBidWZmZXIsIHRoZW4gcmVtb3ZlIGl0IGZyb20gYWN0aXZlIGxpc3QuCiAgICAgICAgICAgICAgICAgLy8gT25seSBjb25zaWRlciBsYXN0IHRyYWNrIHN0YXJ0ZWQgZm9yIG1peGVyIHN0YXRlIGNvbnRyb2wKICAgICAgICAgICAgICAgICBpZiAoLS0odHJhY2stPm1SZXRyeUNvdW50KSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJCVUZGRVIgVElNRU9VVDogcmVtb3ZlKCVkKSBmcm9tIGFjdGl2ZSBsaXN0IiwgdHJhY2stPm5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJCVUZGRVIgVElNRU9VVDogcmVtb3ZlIHRyYWNrKCVkKSBmcm9tIGFjdGl2ZSBsaXN0IiwgdHJhY2stPmlkKCkpOwogICAgICAgICAgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKICAgICAgICAgICAgICAgICAgICAgLy8gaW5kaWNhdGUgdG8gY2xpZW50IHByb2Nlc3MgdGhhdCB0aGUgdHJhY2sgd2FzIGRpc2FibGVkIGJlY2F1c2Ugb2YgdW5kZXJydW47CiAgICAgICAgICAgICAgICAgICAgIC8vIGl0IHdpbGwgdGhlbiBhdXRvbWF0aWNhbGx5IGNhbGwgc3RhcnQoKSB3aGVuIGRhdGEgaXMgYXZhaWxhYmxlCkBAIC01NTYzLDYgKzU5NjUsNyBAQAogICAgIG1PdXRwdXQtPmZsdXNoKCk7CiAgICAgbUh3UGF1c2VkID0gZmFsc2U7CiAgICAgbUZsdXNoUGVuZGluZyA9IGZhbHNlOworICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7IC8vIERJUkVDVCBhbmQgT0ZGTE9BREVEIGZsdXNoIHJlc2V0cyBmcmFtZSBjb3VudC4KIH0KIAogaW50NjRfdCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6Y29tcHV0ZVdhaXRUaW1lTnNfbCgpIGNvbnN0IHsKQEAgLTU4MDYsNyArNjIwOSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0gIGVsc2UgaWYgKHRyYWNrLT5mcmFtZXNSZWFkeSgpICYmIHRyYWNrLT5pc1JlYWR5KCkgJiYKICAgICAgICAgICAgICAgICAhdHJhY2stPmlzUGF1c2VkKCkgJiYgIXRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSAmJiAhdHJhY2stPmlzU3RvcHBpbmdfMigpKSB7Ci0gICAgICAgICAgICBBTE9HVlYoIk9mZmxvYWRUaHJlYWQ6IHRyYWNrICVkIHM9JTA4eCBbT0tdIiwgdHJhY2stPm5hbWUoKSwgY2Jsay0+bVNlcnZlcik7CisgICAgICAgICAgICBBTE9HVlYoIk9mZmxvYWRUaHJlYWQ6IHRyYWNrKCVkKSBzPSUwOHggW09LXSIsIHRyYWNrLT5pZCgpLCBjYmxrLT5tU2VydmVyKTsKICAgICAgICAgICAgIGlmICh0cmFjay0+bUZpbGxpbmdVcFN0YXR1cyA9PSBUcmFjazo6RlNfRklMTEVEKSB7CiAgICAgICAgICAgICAgICAgdHJhY2stPm1GaWxsaW5nVXBTdGF0dXMgPSBUcmFjazo6RlNfQUNUSVZFOwogICAgICAgICAgICAgICAgIGlmIChsYXN0KSB7CkBAIC01ODUwLDcgKzYyNTMsNyBAQAogICAgICAgICAgICAgICAgIG1peGVyU3RhdHVzID0gTUlYRVJfVFJBQ0tTX1JFQURZOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1ZWKCJPZmZsb2FkVGhyZWFkOiB0cmFjayAlZCBzPSUwOHggW05PVCBSRUFEWV0iLCB0cmFjay0+bmFtZSgpLCBjYmxrLT5tU2VydmVyKTsKKyAgICAgICAgICAgIEFMT0dWVigiT2ZmbG9hZFRocmVhZDogdHJhY2soJWQpIHM9JTA4eCBbTk9UIFJFQURZXSIsIHRyYWNrLT5pZCgpLCBjYmxrLT5tU2VydmVyKTsKICAgICAgICAgICAgIGlmICh0cmFjay0+aXNTdG9wcGluZ18xKCkpIHsKICAgICAgICAgICAgICAgICBpZiAoLS0odHJhY2stPm1SZXRyeUNvdW50KSA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIEhhcmR3YXJlIGJ1ZmZlciBjYW4gaG9sZCBhIGxhcmdlIGFtb3VudCBvZiBhdWRpbyBzbyB3ZSBtdXN0CkBAIC01ODk3LDYgKzYzMDAsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnByZXNlbnRhdGlvbkNvbXBsZXRlKGZyYW1lc1dyaXR0ZW4sIGF1ZGlvSEFMRnJhbWVzKTsKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnJlc2V0KCk7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOworICAgICAgICAgICAgICAgICAgICAvLyBESVJFQ1QgYW5kIE9GRkxPQURFRCBzdG9wIHJlc2V0cyBmcmFtZSBjb3VudHMuCisgICAgICAgICAgICAgICAgICAgIGlmICghbVVzZUFzeW5jV3JpdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGRvbid0IGdldCBleHBsaWNpdCBkcmFpbiBub3RpZmljYXRpb24gd2UgbXVzdAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgZGlzY29udGludWl0eSByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhpcyBpcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByZXZpb3VzICghbGFzdCkgb3IgdGhlIHVwY29taW5nIChsYXN0KSB0cmFjaworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gYXZvaWQgc2tpcHBpbmcgdGhlIGRpc2NvbnRpbnVpdHkuCisgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eSgpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBObyBidWZmZXJzIGZvciB0aGlzIHRyYWNrLiBHaXZlIGl0IGEgZmV3IGNoYW5jZXMgdG8KQEAgLTU5MTgsOCArNjMyOSw4IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChydW5uaW5nKSB7IC8vIHN0aWxsIHJ1bm5pbmcsIGdpdmUgdXMgbW9yZSB0aW1lLgogICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1SZXRyeUNvdW50ID0ga01heFRyYWNrUmV0cmllc09mZmxvYWQ7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiT2ZmbG9hZFRocmVhZDogQlVGRkVSIFRJTUVPVVQ6IHJlbW92ZSglZCkgZnJvbSBhY3RpdmUgbGlzdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5uYW1lKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIk9mZmxvYWRUaHJlYWQ6IEJVRkZFUiBUSU1FT1VUOiByZW1vdmUgdHJhY2soJWQpIGZyb20gYWN0aXZlIGxpc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+aWQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlbGwgY2xpZW50IHByb2Nlc3MgdGhhdCB0aGUgdHJhY2sgd2FzIGRpc2FibGVkIGJlY2F1c2Ugb2YgdW5kZXJydW47CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCB3aWxsIHRoZW4gYXV0b21hdGljYWxseSBjYWxsIHN0YXJ0KCkgd2hlbiBkYXRhIGlzIGF2YWlsYWJsZQpAQCAtNjA2Miw3ICs2NDczLDIyIEBACiBzc2l6ZV90IEF1ZGlvRmxpbmdlcjo6RHVwbGljYXRpbmdUaHJlYWQ6OnRocmVhZExvb3Bfd3JpdGUoKQogewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0VHJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG91dHB1dFRyYWNrc1tpXS0+d3JpdGUobVNpbmtCdWZmZXIsIHdyaXRlRnJhbWVzKTsKKyAgICAgICAgY29uc3Qgc3NpemVfdCBhY3R1YWxXcml0dGVuID0gb3V0cHV0VHJhY2tzW2ldLT53cml0ZShtU2lua0J1ZmZlciwgd3JpdGVGcmFtZXMpOworCisgICAgICAgIC8vIENvbnNpZGVyIHRoZSBmaXJzdCBPdXRwdXRUcmFjayBmb3IgdGltZXN0YW1wIGFuZCBmcmFtZSBjb3VudGluZy4KKworICAgICAgICAvLyBUaGUgdGhyZWFkTG9vcCgpIGdlbmVyYWxseSBhc3N1bWVzIHdyaXRpbmcgYSBmdWxsIHNpbmsgYnVmZmVyIHNpemUgYXQgYSB0aW1lLgorICAgICAgICAvLyBIZXJlLCB3ZSBjb3JyZWN0IGZvciB3cml0ZUZyYW1lcyBvZiAwIChhIHN0b3ApIG9yIHVuZGVycnVucyBiZWNhdXNlCisgICAgICAgIC8vIHdlIGFsd2F5cyBjbGFpbSBzdWNjZXNzLgorICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICBjb25zdCBzc2l6ZV90IGNvcnJlY3Rpb24gPSBtU2lua0J1ZmZlclNpemUgLyBtRnJhbWVTaXplIC0gYWN0dWFsV3JpdHRlbjsKKyAgICAgICAgICAgIEFMT0dEX0lGKGNvcnJlY3Rpb24gIT0gMCAmJiB3cml0ZUZyYW1lcyAhPSAwLAorICAgICAgICAgICAgICAgICAgICAiJXM6IHdyaXRlRnJhbWVzOiV1ICBhY3R1YWxXcml0dGVuOiV6ZCAgY29ycmVjdGlvbjolemQgIG1GcmFtZXNXcml0dGVuOiVsbGQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgd3JpdGVGcmFtZXMsIGFjdHVhbFdyaXR0ZW4sIGNvcnJlY3Rpb24sIChsb25nIGxvbmcpbUZyYW1lc1dyaXR0ZW4pOworICAgICAgICAgICAgbUZyYW1lc1dyaXR0ZW4gLT0gY29ycmVjdGlvbjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IFJlcG9ydCBjb3JyZWN0aW9uIGZvciB0aGUgb3RoZXIgb3V0cHV0IHRyYWNrcyBhbmQgc2hvdyBpbiB0aGUgZHVtcC4KICAgICB9CiAgICAgbVN0YW5kYnkgPSBmYWxzZTsKICAgICByZXR1cm4gKHNzaXplX3QpbVNpbmtCdWZmZXJTaXplOwpAQCAtNjA3Niw5ICs2NTAyLDkgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpEdXBsaWNhdGluZ1RocmVhZDo6ZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6RHVwbGljYXRpbmdUaHJlYWQ6OmR1bXBJbnRlcm5hbHNfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7Ci0gICAgTWl4ZXJUaHJlYWQ6OmR1bXBJbnRlcm5hbHMoZmQsIGFyZ3MpOworICAgIE1peGVyVGhyZWFkOjpkdW1wSW50ZXJuYWxzX2woZmQsIGFyZ3MpOwogCiAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CiAgICAgY29uc3Qgc2l6ZV90IG51bVRyYWNrcyA9IG1PdXRwdXRUcmFja3Muc2l6ZSgpOwpAQCAtNjA4Nyw3ICs2NTEzLDcgQEAKICAgICAgICAgc3MgPDwgIjoiOwogICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnRyYWNrIDogbU91dHB1dFRyYWNrcykgewogICAgICAgICAgICAgY29uc3Qgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gdHJhY2stPnRocmVhZCgpLnByb21vdGUoKTsKLSAgICAgICAgICAgIHNzIDw8ICIgKCIgPDwgdHJhY2stPm5hbWUoKSA8PCAiIDogIjsKKyAgICAgICAgICAgIHNzIDw8ICIgKCIgPDwgdHJhY2stPmlkKCkgPDwgIiA6ICI7CiAgICAgICAgICAgICBpZiAodGhyZWFkLmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBzcyA8PCB0aHJlYWQuZ2V0KCkgPDwgIiwgIiA8PCB0aHJlYWQtPmlkKCk7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNjIyNyw5ICs2NjUzLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dERldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGluRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN5c3RlbVJlYWR5Ci0jaWZkZWYgVEVFX1NJTksKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBjb25zdCBzcDxOQkFJT19TaW5rPiYgdGVlU2luawotI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkgOgogICAgIFRocmVhZEJhc2UoYXVkaW9GbGluZ2VyLCBpZCwgb3V0RGV2aWNlLCBpbkRldmljZSwgUkVDT1JELCBzeXN0ZW1SZWFkeSksCiAgICAgbUlucHV0KGlucHV0KSwKQEAgLTYyMzcsOSArNjY2MCw2IEBACiAgICAgbVJzbXBJbkJ1ZmZlcihOVUxMKSwKICAgICAvLyBtUnNtcEluRnJhbWVzLCBtUnNtcEluRnJhbWVzUDIsIGFuZCBtUnNtcEluRnJhbWVzT0EgYXJlIHNldCBieSByZWFkSW5wdXRQYXJhbWV0ZXJzX2woKQogICAgIG1Sc21wSW5SZWFyKDApCi0jaWZkZWYgVEVFX1NJTksKLSAgICAsIG1UZWVTaW5rKHRlZVNpbmspCi0jZW5kaWYKICAgICAsIG1SZWFkT25seUhlYXAobmV3IE1lbW9yeURlYWxlcihrUmVjb3JkVGhyZWFkUmVhZE9ubHlIZWFwU2l6ZSwKICAgICAgICAgICAgICJSZWNvcmRUaHJlYWRSTyIsIE1lbW9yeUhlYXBCYXNlOjpSRUFEX09OTFkpKQogICAgIC8vIG1GYXN0Q2FwdHVyZSBiZWxvdwpAQCAtNjI1Niw4ICs2Njc2LDIwIEBACiAgICAgc25wcmludGYobVRocmVhZE5hbWUsIGtUaHJlYWROYW1lTGVuZ3RoLCAiQXVkaW9Jbl8lWCIsIGlkKTsKICAgICBtTkJMb2dXcml0ZXIgPSBhdWRpb0ZsaW5nZXItPm5ld1dyaXRlcl9sKGtMb2dTaXplLCBtVGhyZWFkTmFtZSk7CiAKKyAgICBpZiAobUlucHV0ICE9IG51bGxwdHIgJiYgbUlucHV0LT5hdWRpb0h3RGV2ICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUlzTXNkRGV2aWNlID0gc3RyY21wKAorICAgICAgICAgICAgICAgIG1JbnB1dC0+YXVkaW9Id0Rldi0+bW9kdWxlTmFtZSgpLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKSA9PSAwOworICAgIH0KKwogICAgIHJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpOwogCisgICAgLy8gVE9ETzogV2UgbWF5IGFsc28gbWF0Y2ggb24gYWRkcmVzcyBhcyB3ZWxsIGFzIGRldmljZSB0eXBlIGZvcgorICAgIC8vIEFVRElPX0RFVklDRV9JTl9CVVMsIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCwgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgKKyAgICBtVGltZXN0YW1wQ29ycmVjdGVkRGV2aWNlcyA9IChhdWRpb19kZXZpY2VzX3QpcHJvcGVydHlfZ2V0X2ludDY0KAorICAgICAgICAgICAgImF1ZGlvLnRpbWVzdGFtcC5jb3JyZWN0ZWRfaW5wdXRfZGV2aWNlcyIsCisgICAgICAgICAgICAoaW50NjRfdCkobUlzTXNkRGV2aWNlID8gQVVESU9fREVWSUNFX0lOX0JVUyAvLyB0dXJuIG9uIGJ5IGRlZmF1bHQgZm9yIE1TRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEFVRElPX0RFVklDRV9OT05FKSk7CisKICAgICAvLyBjcmVhdGUgYW4gTkJBSU8gc291cmNlIGZvciB0aGUgSEFMIGlucHV0IHN0cmVhbSwgYW5kIG5lZ290aWF0ZQogICAgIG1JbnB1dFNvdXJjZSA9IG5ldyBBdWRpb1N0cmVhbUluU291cmNlKGlucHV0LT5zdHJlYW0pOwogICAgIHNpemVfdCBudW1Db3VudGVyT2ZmZXJzID0gMDsKQEAgLTYzNTQsNyArNjc4Niw3IEBACiAgICAgICAgIC8vIHN0YXJ0IHRoZSBmYXN0IGNhcHR1cmUKICAgICAgICAgbUZhc3RDYXB0dXJlLT5ydW4oIkZhc3RDYXB0dXJlIiwgQU5EUk9JRF9QUklPUklUWV9VUkdFTlRfQVVESU8pOwogICAgICAgICBwaWRfdCB0aWQgPSBtRmFzdENhcHR1cmUtPmdldFRpZCgpOwotICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50KGdldHBpZF9jYWNoZWQsIHRpZCwga1ByaW9yaXR5RmFzdENhcHR1cmUsIGZhbHNlIC8qZm9yQXBwKi8pOworICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50KGdldHBpZCgpLCB0aWQsIGtQcmlvcml0eUZhc3RDYXB0dXJlLCBmYWxzZSAvKmZvckFwcCovKTsKICAgICAgICAgc3RyZWFtKCktPnNldEhhbFRocmVhZFByaW9yaXR5KGtQcmlvcml0eUZhc3RDYXB0dXJlKTsKICNpZmRlZiBBVURJT19XQVRDSERPRwogICAgICAgICAvLyBGSVhNRQpAQCAtNjM2Miw2ICs2Nzk0LDEwIEBACiAKICAgICAgICAgbUZhc3RUcmFja0F2YWlsID0gdHJ1ZTsKICAgICB9CisjaWZkZWYgVEVFX1NJTksKKyAgICBtVGVlLnNldChtSW5wdXRTb3VyY2UtPmZvcm1hdCgpLCBOQkFJT19UZWU6OlRFRV9GTEFHX0lOUFVUX1RIUkVBRCk7CisgICAgbVRlZS5zZXRJZChzdGQ6OnN0cmluZygiXyIpICsgc3RkOjp0b19zdHJpbmcobUlkKSArICJfQyIpOworI2VuZGlmCiBmYWlsZWQ6IDsKIAogICAgIC8vIEZJWE1FIG1Ob3JtYWxTb3VyY2UKQEAgLTY0MjIsOCArNjg1OCwxMCBAQAogICAgIC8vIHVzZWQgdG8gcmVxdWVzdCBhIGRlZmVycmVkIHNsZWVwLCB0byBiZSBleGVjdXRlZCBsYXRlciB3aGlsZSBtdXRleCBpcyB1bmxvY2tlZAogICAgIHVpbnQzMl90IHNsZWVwVXMgPSAwOwogCisgICAgaW50NjRfdCBsYXN0TG9vcENvdW50UmVhZCA9IC0yOyAgLy8gbmV2ZXIgbWF0Y2hlcyAicHJldmlvdXMiIGxvb3AsIHdoZW4gbG9vcENvdW50ID0gMC4KKwogICAgIC8vIGxvb3Agd2hpbGUgdGhlcmUgaXMgd29yayB0byBkbwotICAgIGZvciAoOzspIHsKKyAgICBmb3IgKGludDY0X3QgbG9vcENvdW50ID0gMDs7ICsrbG9vcENvdW50KSB7ICAvLyBsb29wQ291bnQgdXNlZCBmb3Igc3RhdGlzdGljcyB0cmFja2luZwogICAgICAgICBWZWN0b3I8IHNwPEVmZmVjdENoYWluPiA+IGVmZmVjdENoYWluczsKIAogICAgICAgICAvLyBhY3RpdmVUcmFja3MgYWNjdW11bGF0ZXMgYSBjb3B5IG9mIGEgc3Vic2V0IG9mIG1BY3RpdmVUcmFja3MKQEAgLTY0ODksNiArNjkyNyw3IEBACiAKICAgICAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6UEFVU0lORzoKICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUoYWN0aXZlVHJhY2spOworICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpQQVVTRUQ7CiAgICAgICAgICAgICAgICAgICAgIGRvQnJvYWRjYXN0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgc2l6ZS0tOwogICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTY1MTAsMTIgKzY5NDksMTIgQEAKICAgICAgICAgICAgICAgICAgICAgYWxsU3RvcHBlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKIAotICAgICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpJRExFOgotICAgICAgICAgICAgICAgICAgICBpKys7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotCisgICAgICAgICAgICAgICAgY2FzZSBUcmFja0Jhc2U6OklETEU6ICAgIC8vIGNhbm5vdCBiZSBvbiBBY3RpdmVUcmFja3MgaWYgaWRsZQorICAgICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpQQVVTRUQ6ICAvLyBjYW5ub3QgYmUgb24gQWN0aXZlVHJhY2tzIGlmIHBhdXNlZAorICAgICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpTVE9QUEVEOiAvLyBjYW5ub3QgYmUgb24gQWN0aXZlVHJhY2tzIGlmIGRlc3Ryb3llZC90ZXJtaW5hdGVkCiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5leHBlY3RlZCBhY3RpdmVUcmFja1N0YXRlICVkIiwgYWN0aXZlVHJhY2tTdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzOiBVbmV4cGVjdGVkIGFjdGl2ZSB0cmFjayBzdGF0ZTolZCwgaWQ6JWQsIHRyYWNrczolenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBhY3RpdmVUcmFja1N0YXRlLCBhY3RpdmVUcmFjay0+aWQoKSwgc2l6ZSk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2tzLmFkZChhY3RpdmVUcmFjayk7CkBAIC02NTQwLDcgKzY5NzksNyBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBzbGVlcCBpZiB0aGVyZSBhcmUgbm8gYWN0aXZlIHRyYWNrcyB0byBwcm9jZXNzCi0gICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2tzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2tzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgICAgIGlmIChzbGVlcFVzID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgc2xlZXBVcyA9IGtSZWNvcmRUaHJlYWRTbGVlcFVzOwogICAgICAgICAgICAgICAgIH0KQEAgLTY1OTEsNiArNzAzMCwxNCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBkaWRNb2RpZnkgPSB0cnVlOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogYWJwID0gKGZhc3RUcmFjayAhPSAwICYmIGZhc3RUcmFjay0+aXNQYXRjaFRyYWNrKCkpID8KKyAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxBdWRpb0J1ZmZlclByb3ZpZGVyKj4oZmFzdFRyYWNrLmdldCgpKSA6IG51bGxwdHI7CisgICAgICAgICAgICBpZiAoc3RhdGUtPm1GYXN0UGF0Y2hSZWNvcmRCdWZmZXJQcm92aWRlciAhPSBhYnApIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bUZhc3RQYXRjaFJlY29yZEJ1ZmZlclByb3ZpZGVyID0gYWJwOworICAgICAgICAgICAgICAgIHN0YXRlLT5tRmFzdFBhdGNoUmVjb3JkRm9ybWF0ID0gZmFzdFRyYWNrID09IDAgPworICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0lOVkFMSUQgOiBmYXN0VHJhY2stPmZvcm1hdCgpOworICAgICAgICAgICAgICAgIGRpZE1vZGlmeSA9IHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBzcS0+ZW5kKGRpZE1vZGlmeSk7CiAgICAgICAgICAgICBpZiAoZGlkTW9kaWZ5KSB7CiAgICAgICAgICAgICAgICAgc3EtPnB1c2goYmxvY2spOwpAQCAtNjYxMywxMSArNzA2MCwxMSBAQAogCiAgICAgICAgIGludDMyX3QgcmVhciA9IG1Sc21wSW5SZWFyICYgKG1Sc21wSW5GcmFtZXNQMiAtIDEpOwogICAgICAgICBzc2l6ZV90IGZyYW1lc1JlYWQ7CisgICAgICAgIGNvbnN0IGludDY0X3QgbGFzdElvQmVnaW5OcyA9IHN5c3RlbVRpbWUoKTsgLy8gc3RhcnQgSU8gdGltaW5nCiAKICAgICAgICAgLy8gSWYgYW4gTkJBSU8gc291cmNlIGlzIHByZXNlbnQsIHVzZSBpdCB0byByZWFkIHRoZSBub3JtYWwgY2FwdHVyZSdzIGRhdGEKICAgICAgICAgaWYgKG1QaXBlU291cmNlICE9IDApIHsKLSAgICAgICAgICAgIHNpemVfdCBmcmFtZXNUb1JlYWQgPSBtQnVmZmVyU2l6ZSAvIG1GcmFtZVNpemU7Ci0gICAgICAgICAgICBmcmFtZXNUb1JlYWQgPSBtaW4obVJzbXBJbkZyYW1lc09BIC0gcmVhciwgbVJzbXBJbkZyYW1lc1AyIC8gMik7CisgICAgICAgICAgICBzaXplX3QgZnJhbWVzVG9SZWFkID0gbWluKG1Sc21wSW5GcmFtZXNPQSAtIHJlYXIsIG1Sc21wSW5GcmFtZXNQMiAvIDIpOwogCiAgICAgICAgICAgICAvLyBUaGUgYXVkaW8gZmlmbyByZWFkKCkgcmV0dXJucyBPVkVSUlVOIG9uIG92ZXJmbG93LCBhbmQgYWR2YW5jZXMgdGhlIHJlYWQgcG9pbnRlcgogICAgICAgICAgICAgLy8gdG8gdGhlIGZ1bGwgYnVmZmVyIHBvaW50IChjbGVhcmluZyB0aGUgb3ZlcmZsb3cgY29uZGl0aW9uKS4gIFVwb24gT1ZFUlJVTiBlcnJvciwKQEAgLTY2NzEsMTYgKzcxMTgsMzQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIGNvbnN0IGludDY0X3QgbGFzdElvRW5kTnMgPSBzeXN0ZW1UaW1lKCk7IC8vIGVuZCBJTyB0aW1pbmcKKwogICAgICAgICAvLyBVcGRhdGUgc2VydmVyIHRpbWVzdGFtcCB3aXRoIHNlcnZlciBzdGF0cwogICAgICAgICAvLyBzeXN0ZW1UaW1lKCkgaXMgb3B0aW9uYWwgaWYgdGhlIGhhcmR3YXJlIHN1cHBvcnRzIHRpbWVzdGFtcHMuCiAgICAgICAgIG1UaW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdICs9IGZyYW1lc1JlYWQ7Ci0gICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdID0gbGFzdElvRW5kTnM7CiAKICAgICAgICAgLy8gVXBkYXRlIHNlcnZlciB0aW1lc3RhbXAgd2l0aCBrZXJuZWwgc3RhdHMKICAgICAgICAgaWYgKG1QaXBlU291cmNlLmdldCgpID09IG51bGxwdHIgLyogZG9uJ3Qgb2J0YWluIGZvciBGYXN0Q2FwdHVyZSwgY291bGQgYmxvY2sgKi8pIHsKICAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb24sIHRpbWU7Ci0gICAgICAgICAgICBpbnQgcmV0ID0gbUlucHV0LT5zdHJlYW0tPmdldENhcHR1cmVQb3NpdGlvbigmcG9zaXRpb24sICZ0aW1lKTsKLSAgICAgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGlmIChtU3RhbmRieSkgeworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1JbnB1dC0+c3RyZWFtLT5nZXRDYXB0dXJlUG9zaXRpb24oJnBvc2l0aW9uLCAmdGltZSkgPT0gTk9fRVJST1IKKyAgICAgICAgICAgICAgICAgICAgJiYgdGltZSA+IG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSkgeworCisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmFkZChwb3NpdGlvbiwgdGltZSwgbVNhbXBsZVJhdGUpOworCisgICAgICAgICAgICAgICAgLy8gQ29ycmVjdCB0aW1lc3RhbXBzCisgICAgICAgICAgICAgICAgaWYgKGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiVFNfQkVGT1JFOiAlZCAlbGxkICVsbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkKCksIChsb25nIGxvbmcpdGltZSwgKGxvbmcgbG9uZylwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gY29ycmVjdGVkVGltZXN0YW1wID0gbVRpbWVzdGFtcFZlcmlmaWVyLmdldExhc3RDb3JyZWN0ZWRUaW1lc3RhbXAoKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24gPSBjb3JyZWN0ZWRUaW1lc3RhbXAubUZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgdGltZSA9IGNvcnJlY3RlZFRpbWVzdGFtcC5tVGltZU5zOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiVFNfQUZURVI6ICVkICVsbGQgJWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQoKSwgKGxvbmcgbG9uZyl0aW1lLCAobG9uZyBsb25nKXBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9IHBvc2l0aW9uOwogICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9IHRpbWU7CiAgICAgICAgICAgICAgICAgLy8gTm90ZTogSW4gZ2VuZXJhbCByZWNvcmQgYnVmZmVycyBzaG91bGQgdGVuZCB0byBiZSBlbXB0eSBpbgpAQCAtNjY4OCw4ICs3MTUzLDE5IEBACiAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAvLyBBbHNvLCBpdCBpcyBub3QgYWR2YW50YWdlb3VzIHRvIGNhbGwgZ2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbiBkdXJpbmcgdGhlIHJlYWQKICAgICAgICAgICAgICAgICAvLyBhcyB0aGUgcmVhZCBvYnRhaW5zIGEgbG9jaywgcHJldmVudGluZyB0aGUgdGltZXN0YW1wIGNhbGwgZnJvbSBleGVjdXRpbmcuCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5lcnJvcigpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgLy8gRnJvbSB0aGUgdGltZXN0YW1wLCBpbnB1dCByZWFkIGxhdGVuY3kgaXMgbmVnYXRpdmUgb3V0cHV0IHdyaXRlIGxhdGVuY3kuCisgICAgICAgIGNvbnN0IGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MgPSBtSW5wdXQgIT0gTlVMTCA/IG1JbnB1dC0+ZmxhZ3MgOiBBVURJT19JTlBVVF9GTEFHX05PTkU7CisgICAgICAgIGNvbnN0IGRvdWJsZSBsYXRlbmN5TXMgPSBSZWNvcmRUcmFjazo6Y2hlY2tTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKG1Gb3JtYXQsIGZsYWdzKQorICAgICAgICAgICAgICAgID8gLSBtVGltZXN0YW1wLmdldE91dHB1dFNlcnZlckxhdGVuY3lNcyhtU2FtcGxlUmF0ZSkgOiAwLjsKKyAgICAgICAgaWYgKGxhdGVuY3lNcyAhPSAwLikgeyAvLyBub3RlIDAuIG1lYW5zIHRpbWVzdGFtcCBpcyBlbXB0eS4KKyAgICAgICAgICAgIG1MYXRlbmN5TXMuYWRkKGxhdGVuY3lNcyk7CisgICAgICAgIH0KKwogICAgICAgICAvLyBVc2UgdGhpcyB0byB0cmFjayB0aW1lc3RhbXAgaW5mb3JtYXRpb24KICAgICAgICAgLy8gQUxPR0QoIiVzIiwgbVRpbWVzdGFtcC50b1N0cmluZygpLmNfc3RyKCkpOwogCkBAIC02NzAzLDEwICs3MTc5LDExIEBACiAgICAgICAgICAgICBnb3RvIHVubG9jazsKICAgICAgICAgfQogICAgICAgICBBTE9HX0FTU0VSVChmcmFtZXNSZWFkID4gMCk7CisgICAgICAgIG1GcmFtZXNSZWFkICs9IGZyYW1lc1JlYWQ7CiAKLSAgICAgICAgaWYgKG1UZWVTaW5rICE9IDApIHsKLSAgICAgICAgICAgICh2b2lkKSBtVGVlU2luay0+d3JpdGUoKHVpbnQ4X3QqKW1Sc21wSW5CdWZmZXIgKyByZWFyICogbUZyYW1lU2l6ZSwgZnJhbWVzUmVhZCk7Ci0gICAgICAgIH0KKyNpZmRlZiBURUVfU0lOSworICAgICAgICAodm9pZCltVGVlLndyaXRlKCh1aW50OF90KiltUnNtcEluQnVmZmVyICsgcmVhciAqIG1GcmFtZVNpemUsIGZyYW1lc1JlYWQpOworI2VuZGlmCiAgICAgICAgIC8vIElmIGRlc3RpbmF0aW9uIGlzIG5vbi1jb250aWd1b3VzLCB3ZSBub3cgY29ycmVjdCBmb3IgcmVhZGluZyBwYXN0IGVuZCBvZiBidWZmZXIuCiAgICAgICAgIHsKICAgICAgICAgICAgIHNpemVfdCBwYXJ0MSA9IG1Sc21wSW5GcmFtZXNQMiAtIHJlYXI7CkBAIC02NzY0LDkgKzcyNDEsMzMgQEAKICAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPSBtaW4oZnJhbWVzT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb25GcmFtZXNQb3NzaWJsZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzSW4sIG1TYW1wbGVSYXRlLCBhY3RpdmVUcmFjay0+bVNhbXBsZVJhdGUpKTsKLSAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIGZyYW1lcyBmcm9tIHRoZSBSZWNvcmRUaHJlYWQgYnVmZmVyIHByb3ZpZGVyIHRvIHRoZSBSZWNvcmRUcmFjayBidWZmZXIKLSAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPSBhY3RpdmVUcmFjay0+bVJlY29yZEJ1ZmZlckNvbnZlcnRlci0+Y29udmVydCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tU2luay5yYXcsIGFjdGl2ZVRyYWNrLT5tUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXIsIGZyYW1lc091dCk7CisKKyAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPmlzRGlyZWN0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTm8gUmVjb3JkQnVmZmVyQ29udmVydGVyIHVzZWQgZm9yIGRpcmVjdCBzdHJlYW1zLiBQYXNzCisgICAgICAgICAgICAgICAgICAgIC8vIHN0cmFpZ2h0IGZyb20gUmVjb3JkVGhyZWFkIGJ1ZmZlciB0byBSZWNvcmRUcmFjayBidWZmZXIuCisgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciBidWZmZXI7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVzT3V0OworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhY3RpdmVUcmFjay0+bVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZidWZmZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LICYmIGJ1ZmZlci5mcmFtZUNvdW50ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWX0lGKGJ1ZmZlci5mcmFtZUNvdW50ICE9IGZyYW1lc091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCkgcmVhZCBsZXNzIHRoYW4gZXhwZWN0ZWQgKCV6dSB2cyAlenUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGJ1ZmZlci5mcmFtZUNvdW50LCBmcmFtZXNPdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gYnVmZmVyLmZyYW1lQ291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoYWN0aXZlVHJhY2stPm1TaW5rLnJhdywgYnVmZmVyLnJhdywgYnVmZmVyLmZyYW1lQ291bnQgKiBtRnJhbWVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzKCkgY2Fubm90IGZpbGwgcmVxdWVzdCwgc3RhdHVzOiAlZCwgZnJhbWVDb3VudDogJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RhdHVzLCBidWZmZXIuZnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzIGZyYW1lcyBmcm9tIHRoZSBSZWNvcmRUaHJlYWQgYnVmZmVyIHByb3ZpZGVyIHRvIHRoZSBSZWNvcmRUcmFjaworICAgICAgICAgICAgICAgICAgICAvLyBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gYWN0aXZlVHJhY2stPm1SZWNvcmRCdWZmZXJDb252ZXJ0ZXItPmNvbnZlcnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1TaW5rLnJhdywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCk7CisgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKGZyYW1lc091dCA+IDAgJiYgKG92ZXJydW4gPT0gT1ZFUlJVTl9VTktOT1dOKSkgewogICAgICAgICAgICAgICAgICAgICBvdmVycnVuID0gT1ZFUlJVTl9GQUxTRTsKQEAgLTY3ODUsNyArNzI4Niw3IEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgY291bGQgZG8gYSBwYXJ0aWFsIGRyb3Agb2YgZnJhbWVzT3V0CiAgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+bUZyYW1lc1RvRHJvcCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tRnJhbWVzVG9Ecm9wIC09IGZyYW1lc091dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tRnJhbWVzVG9Ecm9wIC09IChzc2l6ZV90KWZyYW1lc091dDsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+bUZyYW1lc1RvRHJvcCA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTY4MzksNiArNzM0MCwyMyBAQAogICAgICAgICAvLyBlbmFibGUgY2hhbmdlcyBpbiBlZmZlY3QgY2hhaW4KICAgICAgICAgdW5sb2NrRWZmZWN0Q2hhaW5zKGVmZmVjdENoYWlucyk7CiAgICAgICAgIC8vIGVmZmVjdENoYWlucyBkb2Vzbid0IG5lZWQgdG8gYmUgY2xlYXJlZCwgc2luY2UgaXQgaXMgY2xlYXJlZCBieSBkZXN0cnVjdG9yIGF0IHNjb3BlIGVuZAorICAgICAgICBpZiAoYXVkaW9faGFzX3Byb3BvcnRpb25hbF9mcmFtZXMobUZvcm1hdCkKKyAgICAgICAgICAgICYmIGxvb3BDb3VudCA9PSBsYXN0TG9vcENvdW50UmVhZCArIDEpIHsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgcmVhZFBlcmlvZE5zID0gbGFzdElvRW5kTnMgLSBtTGFzdElvRW5kTnM7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgaml0dGVyTXMgPQorICAgICAgICAgICAgICAgIFRpbWVzdGFtcFZlcmlmaWVyPGludDY0X3QsIGludDY0X3Q+Ojpjb21wdXRlSml0dGVyTXMoCisgICAgICAgICAgICAgICAgICAgIHtmcmFtZXNSZWFkLCByZWFkUGVyaW9kTnN9LAorICAgICAgICAgICAgICAgICAgICB7MCwgMH0gLyogbGFzdFRpbWVzdGFtcCAqLywgbVNhbXBsZVJhdGUpOworICAgICAgICAgICAgY29uc3QgZG91YmxlIHByb2Nlc3NNcyA9IChsYXN0SW9CZWdpbk5zIC0gbUxhc3RJb0VuZE5zKSAqIDFlLTY7CisKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgICAgICBtSW9KaXR0ZXJNcy5hZGQoaml0dGVyTXMpOworICAgICAgICAgICAgbVByb2Nlc3NUaW1lTXMuYWRkKHByb2Nlc3NNcyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gdXBkYXRlIHRpbWluZyBpbmZvLgorICAgICAgICBtTGFzdElvQmVnaW5OcyA9IGxhc3RJb0JlZ2luTnM7CisgICAgICAgIG1MYXN0SW9FbmROcyA9IGxhc3RJb0VuZE5zOworICAgICAgICBsYXN0TG9vcENvdW50UmVhZCA9IGxvb3BDb3VudDsKICAgICB9CiAKICAgICBzdGFuZGJ5SWZOb3RBbHJlYWR5SW5TdGFuZGJ5KCk7CkBAIC02OTE3LDYgKzc0MzUsNyBAQAogICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAogICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICBzaXplX3QgKnBOb3RpZmljYXRpb25GcmFtZUNvdW50LAorICAgICAgICBwaWRfdCBjcmVhdG9yUGlkLAogICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICBwaWRfdCB0aWQsCkBAIC02OTM3LDYgKzc0NTYsMTIgQEAKICAgICAgICAgZ290byBFeGl0OwogICAgIH0KIAorICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSAmJiAoKmZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19ESVJFQ1QpID09IDApIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZVJlY29yZFRyYWNrX2woKSBvbiBhbiBlbmNvZGVkIHN0cmVhbSByZXF1aXJlcyBBVURJT19JTlBVVF9GTEFHX0RJUkVDVCIpOworICAgICAgICBsU3RhdHVzID0gQkFEX1ZBTFVFOworICAgICAgICBnb3RvIEV4aXQ7CisgICAgfQorCiAgICAgaWYgKCpwU2FtcGxlUmF0ZSA9PSAwKSB7CiAgICAgICAgICpwU2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlOwogICAgIH0KQEAgLTY5NjEsOCArNzQ4NiwxMCBAQAogICAgICAgICAgICAgLy8gd2UgZm9ybWVybHkgY2hlY2tlZCBmb3IgYSBjYWxsYmFjayBoYW5kbGVyIChub24tMCB0aWQpLAogICAgICAgICAgICAgLy8gYnV0IHRoYXQgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGZvciBUUkFOU0ZFUl9PQlRBSU4gbW9kZQogICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIGZyYW1lIGNvdW50IGlzIG5vdCBzcGVjaWZpZWQsIG9yIGlzIGV4YWN0bHkgdGhlIHBpcGUgZGVwdGgKLSAgICAgICAgICAgICgoZnJhbWVDb3VudCA9PSAwKSB8fCAoZnJhbWVDb3VudCA9PSBtUGlwZUZyYW1lc1AyKSkgJiYKKyAgICAgICAgICAgIC8vIEZyYW1lIGNvdW50IGlzIG5vdCBzcGVjaWZpZWQgKDApLCBvciBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdGhlIHBpcGUgZGVwdGguCisgICAgICAgICAgICAvLyBJdCBpcyBPSyB0byBwcm92aWRlIGEgaGlnaGVyIGNhcGFjaXR5IHRoYW4gcmVxdWVzdGVkLgorICAgICAgICAgICAgLy8gV2Ugd2lsbCBmb3JjZSBpdCB0byBtUGlwZUZyYW1lc1AyIGJlbG93LgorICAgICAgICAgICAgKGZyYW1lQ291bnQgPD0gbVBpcGVGcmFtZXNQMikgJiYKICAgICAgICAgICAgIC8vIFBDTSBkYXRhCiAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgJiYKICAgICAgICAgICAgIC8vIGhhcmR3YXJlIGZvcm1hdApAQCAtNzA0Niw3ICs3NTczLDcgQEAKIAogICAgICAgICB0cmFjayA9IG5ldyBSZWNvcmRUcmFjayh0aGlzLCBjbGllbnQsIGF0dHIsIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIGJ1ZmZlciAqLywgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sIHNlc3Npb25JZCwgdWlkLAorICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogYnVmZmVyICovLCAoc2l6ZV90KTAgLyogYnVmZmVyU2l6ZSAqLywgc2Vzc2lvbklkLCBjcmVhdG9yUGlkLCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgKmZsYWdzLCBUcmFja0Jhc2U6OlRZUEVfREVGQVVMVCwgcG9ydElkKTsKIAogICAgICAgICBsU3RhdHVzID0gdHJhY2stPmluaXRDaGVjaygpOwpAQCAtNzEwMiw4ICs3NjI5LDE0IEBACiAgICAgewogICAgICAgICAvLyBUaGlzIHNlY3Rpb24gaXMgYSByZW5kZXp2b3VzIGJldHdlZW4gYmluZGVyIHRocmVhZCBleGVjdXRpbmcgc3RhcnQoKSBhbmQgUmVjb3JkVGhyZWFkCiAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgaWYgKHJlY29yZFRyYWNrLT5pc0ludmFsaWQoKSkgeworICAgICAgICAgICAgcmVjb3JkVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQogICAgICAgICBpZiAobUFjdGl2ZVRyYWNrcy5pbmRleE9mKHJlY29yZFRyYWNrKSA+PSAwKSB7CiAgICAgICAgICAgICBpZiAocmVjb3JkVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlBBVVNJTkcpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBoYXZlbid0IHN0b3BwZWQgeWV0IChtb3ZlZCB0byBQQVVTRUQgYW5kIG5vdCBpbiBtQWN0aXZlVHJhY2tzKQorICAgICAgICAgICAgICAgIC8vIHNvIG5vIG5lZWQgdG8gc3RhcnRJbnB1dCgpLgogICAgICAgICAgICAgICAgIEFMT0dWKCJhY3RpdmUgcmVjb3JkIHRyYWNrIFBBVVNJTkcgLT4gQUNUSVZFIik7CiAgICAgICAgICAgICAgICAgcmVjb3JkVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6QUNUSVZFOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTcxMjAsMTcgKzc2NTMsMzYgQEAKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgICAgIGlmIChyZWNvcmRUcmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgYm9vbCBzaWxlbmNlZDsKLSAgICAgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzdGFydElucHV0KHJlY29yZFRyYWNrLT5wb3J0SWQoKSwgJnNpbGVuY2VkKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzdGFydElucHV0KHJlY29yZFRyYWNrLT5wb3J0SWQoKSk7CiAgICAgICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgICAgICAgICAvLyBGSVhNRSBzaG91bGQgdmVyaWZ5IHRoYXQgcmVjb3JkVHJhY2sgaXMgc3RpbGwgaW4gbUFjdGl2ZVRyYWNrcworICAgICAgICAgICAgaWYgKHJlY29yZFRyYWNrLT5pc0ludmFsaWQoKSkgeworICAgICAgICAgICAgICAgIHJlY29yZFRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiByZWNvcmRUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6U1RBUlRJTkdfMSkgeworICAgICAgICAgICAgICAgICAgICByZWNvcmRUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpTVEFSVElOR18yOworICAgICAgICAgICAgICAgICAgICAvLyBTVEFSVElOR18yIGZvcmNlcyBkZXN0cm95IHRvIGNhbGwgc3RvcElucHV0LgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVjb3JkVHJhY2stPm1TdGF0ZSAhPSBUcmFja0Jhc2U6OlNUQVJUSU5HXzEpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoJWQpOiB1bnN5bmNocm9uaXplZCBtU3RhdGU6JWQgY2hhbmdlIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHJlY29yZFRyYWNrLT5pZCgpLCByZWNvcmRUcmFjay0+bVN0YXRlKTsKKyAgICAgICAgICAgICAgICAvLyBTb21lb25lIGVsc2UgaGFzIGNoYW5nZWQgc3RhdGUsIGxldCB0aGVtIHRha2Ugb3ZlciwKKyAgICAgICAgICAgICAgICAvLyBsZWF2ZSBtU3RhdGUgaW4gdGhlIG5ldyBzdGF0ZS4KKyAgICAgICAgICAgICAgICByZWNvcmRUcmFjay0+Y2xlYXJTeW5jU3RhcnRFdmVudCgpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHdlJ3JlIG9rLCBidXQgcGVyaGFwcyBzdGFydElucHV0IGhhcyBmYWlsZWQKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoJWQpOiBzdGFydElucHV0IGZhaWxlZCwgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHJlY29yZFRyYWNrLT5pZCgpLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBpbiBBY3RpdmVUcmFja3MgaWYgU1RBUlRJTkdfMSBhbmQgdmFsaWQsIHNvIHJlbW92ZSBmcm9tIEFjdGl2ZVRyYWNrcywKKyAgICAgICAgICAgICAgICAvLyBsZWF2ZSBpbiBTVEFSVElOR18xLCBzbyBkZXN0cm95KCkgd2lsbCBub3QgY2FsbCBzdG9wSW5wdXQuCiAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUocmVjb3JkVHJhY2spOwogICAgICAgICAgICAgICAgIHJlY29yZFRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlJlY29yZFRocmVhZDo6c3RhcnQgZXJyb3IgJWQiLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZWNvcmRUcmFjay0+c2V0U2lsZW5jZWQoc2lsZW5jZWQpOworICAgICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbCgKKyAgICAgICAgICAgICAgICBBVURJT19DTElFTlRfU1RBUlRFRCwgcmVjb3JkVHJhY2stPmNyZWF0b3JQaWQoKSwgcmVjb3JkVHJhY2stPnBvcnRJZCgpKTsKICAgICAgICAgfQogICAgICAgICAvLyBDYXRjaCB1cCB3aXRoIGN1cnJlbnQgYnVmZmVyIGluZGljZXMgaWYgdGhyZWFkIGlzIGFscmVhZHkgcnVubmluZy4KICAgICAgICAgLy8gVGhpcyBpcyB3aGF0IG1ha2VzIGEgbmV3IGNsaWVudCBkaXNjYXJkIGFsbCBidWZmZXJlZCBkYXRhLiAgSWYgdGhlIHRyYWNrJ3MgbVJzbXBJbkZyb250CkBAIC03MTM4LDI2ICs3NjkwLDE1IEBACiAgICAgICAgIC8vIHNlZSBwcmV2aW91c2x5IGJ1ZmZlcmVkIGRhdGEgYmVmb3JlIGl0IGNhbGxlZCBzdGFydCgpLCBidXQgd2l0aCBncmVhdGVyIHJpc2sgb2Ygb3ZlcnJ1bi4KIAogICAgICAgICByZWNvcmRUcmFjay0+bVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOwotICAgICAgICAvLyBjbGVhciBhbnkgY29udmVydGVyIHN0YXRlIGFzIG5ldyBkYXRhIHdpbGwgYmUgZGlzY29udGludW91cwotICAgICAgICByZWNvcmRUcmFjay0+bVJlY29yZEJ1ZmZlckNvbnZlcnRlci0+cmVzZXQoKTsKKyAgICAgICAgaWYgKCFyZWNvcmRUcmFjay0+aXNEaXJlY3QoKSkgeworICAgICAgICAgICAgLy8gY2xlYXIgYW55IGNvbnZlcnRlciBzdGF0ZSBhcyBuZXcgZGF0YSB3aWxsIGJlIGRpc2NvbnRpbnVvdXMKKyAgICAgICAgICAgIHJlY29yZFRyYWNrLT5tUmVjb3JkQnVmZmVyQ29udmVydGVyLT5yZXNldCgpOworICAgICAgICB9CiAgICAgICAgIHJlY29yZFRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlNUQVJUSU5HXzI7CiAgICAgICAgIC8vIHNpZ25hbCB0aHJlYWQgdG8gc3RhcnQKICAgICAgICAgbVdhaXRXb3JrQ1YuYnJvYWRjYXN0KCk7Ci0gICAgICAgIGlmIChtQWN0aXZlVHJhY2tzLmluZGV4T2YocmVjb3JkVHJhY2spIDwgMCkgewotICAgICAgICAgICAgQUxPR1YoIlJlY29yZCBmYWlsZWQgdG8gc3RhcnQiKTsKLSAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgIGdvdG8gc3RhcnRFcnJvcjsKLSAgICAgICAgfQogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KLQotc3RhcnRFcnJvcjoKLSAgICBpZiAocmVjb3JkVHJhY2stPmlzRXh0ZXJuYWxUcmFjaygpKSB7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQocmVjb3JkVHJhY2stPnBvcnRJZCgpKTsKLSAgICB9Ci0gICAgcmVjb3JkVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKLSAgICAvLyBGSVhNRSBJIHdvbmRlciB3aHkgd2UgZG8gbm90IHJlc2V0IHRoZSBzdGF0ZSBoZXJlPwotICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnN5bmNTdGFydEV2ZW50Q2FsbGJhY2soY29uc3Qgd3A8U3luY0V2ZW50PiYgZXZlbnQpCkBAIC03MTc2LDI0ICs3NzE3LDI4IEBACiBib29sIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpzdG9wKFJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2sqIHJlY29yZFRyYWNrKSB7CiAgICAgQUxPR1YoIlJlY29yZFRocmVhZDo6c3RvcCIpOwogICAgIEF1dG9NdXRleCBfbChtTG9jayk7CisgICAgLy8gaWYgd2UncmUgaW52YWxpZCwgd2UgY2FuJ3QgYmUgb24gdGhlIEFjdGl2ZVRyYWNrcy4KICAgICBpZiAobUFjdGl2ZVRyYWNrcy5pbmRleE9mKHJlY29yZFRyYWNrKSA8IDAgfHwgcmVjb3JkVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlBBVVNJTkcpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICAvLyBub3RlIHRoYXQgdGhyZWFkTG9vcCBtYXkgc3RpbGwgYmUgcHJvY2Vzc2luZyB0aGUgdHJhY2sgYXQgdGhpcyBwb2ludCBbd2l0aG91dCBsb2NrXQogICAgIHJlY29yZFRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OlBBVVNJTkc7Ci0gICAgLy8gc2lnbmFsIHRocmVhZCB0byBzdG9wCi0gICAgbVdhaXRXb3JrQ1YuYnJvYWRjYXN0KCk7Ci0gICAgLy8gZG8gbm90IHdhaXQgZm9yIG1TdGFydFN0b3BDb25kIGlmIGV4aXRpbmcKLSAgICBpZiAoZXhpdFBlbmRpbmcoKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIE5PVEU6IFdhaXRpbmcgaGVyZSBpcyBpbXBvcnRhbnQgdG8ga2VlcCBzdG9wIHN5bmNocm9ub3VzLgorICAgIC8vIFRoaXMgaXMgbmVlZGVkIGZvciBwcm9wZXIgcGF0Y2hSZWNvcmQgcGVlciByZWxlYXNlLgorICAgIHdoaWxlIChyZWNvcmRUcmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UEFVU0lORyAmJiAhcmVjb3JkVHJhY2stPmlzSW52YWxpZCgpKSB7CisgICAgICAgIG1XYWl0V29ya0NWLmJyb2FkY2FzdCgpOyAvLyBzaWduYWwgdGhyZWFkIHRvIHN0b3AKKyAgICAgICAgbVN0YXJ0U3RvcENvbmQud2FpdChtTG9jayk7CiAgICAgfQotICAgIC8vIEZJWE1FIGluY29ycmVjdCB1c2FnZSBvZiB3YWl0OiBubyBleHBsaWNpdCBwcmVkaWNhdGUgb3IgbG9vcAotICAgIG1TdGFydFN0b3BDb25kLndhaXQobUxvY2spOwotICAgIC8vIGlmIHdlIGhhdmUgYmVlbiByZXN0YXJ0ZWQsIHJlY29yZFRyYWNrIGlzIGluIG1BY3RpdmVUcmFja3MgaGVyZQotICAgIGlmIChleGl0UGVuZGluZygpIHx8IG1BY3RpdmVUcmFja3MuaW5kZXhPZihyZWNvcmRUcmFjaykgPCAwKSB7CisKKyAgICBpZiAocmVjb3JkVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlBBVVNFRCkgeyAvLyBzdWNjZXNzZnVsIHN0b3AKICAgICAgICAgQUxPR1YoIlJlY29yZCBzdG9wcGVkIE9LIik7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KKworICAgIC8vIGRvbid0IGhhbmRsZSBhbnl0aGluZyAtIHdlJ3ZlIGJlZW4gaW52YWxpZGF0ZWQgb3IgcmVzdGFydGVkIGFuZCBpbiBhIGRpZmZlcmVudCBzdGF0ZQorICAgIEFMT0dXX0lGKCIlcyglZCk6IHVuc3luY2hyb25pemVkIHN0b3AsIHN0YXRlOiAlZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgcmVjb3JkVHJhY2stPmlkKCksIHJlY29yZFRyYWNrLT5tU3RhdGUpOwogICAgIHJldHVybiBmYWxzZTsKIH0KIApAQCAtNzIzNiw2ICs3NzgxLDIxIEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oCisgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbikKK3sKKyAgICBBTE9HVigic2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbiglZCkiLCBkaXJlY3Rpb24pOworICAgIEF1dG9NdXRleCBfbChtTG9jayk7CisgICAgcmV0dXJuIG1JbnB1dC0+c3RyZWFtLT5zZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGRpcmVjdGlvbik7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkKK3sKKyAgICBBTE9HVigic2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKCVmKSIsIHpvb20pOworICAgIEF1dG9NdXRleCBfbChtTG9jayk7CisgICAgcmV0dXJuIG1JbnB1dC0+c3RyZWFtLT5zZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oem9vbSk7Cit9CisKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnVwZGF0ZU1ldGFkYXRhX2woKQogewogICAgIGlmIChtSW5wdXQgPT0gbnVsbHB0ciB8fCBtSW5wdXQtPnN0cmVhbSA9PSBudWxscHRyIHx8CkBAIC03Mjc4LDI0ICs3ODM4LDE0IEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmR1bXBJbnRlcm5hbHNfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7Ci0gICAgZHVtcEludGVybmFscyhmZCwgYXJncyk7Ci0gICAgZHVtcFRyYWNrcyhmZCwgYXJncyk7Ci0gICAgZHVtcEVmZmVjdENoYWlucyhmZCwgYXJncyk7Ci0gICAgZHByaW50ZihmZCwgIiAgTG9jYWwgbG9nOlxuIik7Ci0gICAgbUxvY2FsTG9nLmR1bXAoZmQsICIgICAiIC8qIHByZWZpeCAqLywgNDAgLyogbGluZXMgKi8pOwotfQotCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKLXsKLSAgICBkdW1wQmFzZShmZCwgYXJncyk7Ci0KICAgICBBdWRpb1N0cmVhbUluICppbnB1dCA9IG1JbnB1dDsKICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gaW5wdXQgIT0gTlVMTCA/IGlucHV0LT5mbGFncyA6IEFVRElPX0lOUFVUX0ZMQUdfTk9ORTsKICAgICBkcHJpbnRmKGZkLCAiICBBdWRpb1N0cmVhbUluOiAlcCBmbGFncyAlI3ggKCVzKVxuIiwKLSAgICAgICAgICAgIGlucHV0LCBmbGFncywgaW5wdXRGbGFnc1RvU3RyaW5nKGZsYWdzKS5jX3N0cigpKTsKLSAgICBpZiAobUFjdGl2ZVRyYWNrcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgaW5wdXQsIGZsYWdzLCB0b1N0cmluZyhmbGFncykuY19zdHIoKSk7CisgICAgZHByaW50ZihmZCwgIiAgRnJhbWVzIHJlYWQ6ICVsbGRcbiIsIChsb25nIGxvbmcpbUZyYW1lc1JlYWQpOworICAgIGlmIChtQWN0aXZlVHJhY2tzLmlzRW1wdHkoKSkgewogICAgICAgICBkcHJpbnRmKGZkLCAiICBObyBhY3RpdmUgcmVjb3JkIGNsaWVudHNcbiIpOwogICAgIH0KIApAQCAtNzMxMSwxMiArNzg2MSwxMiBAQAogICAgIC8vIHdoaWxlIHdlIGFyZSBkdW1waW5nIGl0LiAgSXQgbWF5IGJlIGluY29uc2lzdGVudCwgYnV0IGl0IHdvbid0IG11dGF0ZSEKICAgICAvLyBUaGlzIGlzIGEgbGFyZ2Ugb2JqZWN0IHNvIHdlIHBsYWNlIGl0IG9uIHRoZSBoZWFwLgogICAgIC8vIEZJWE1FIDI1OTcyOTU4OiBOZWVkIGFuIGludGVsbGlnZW50IGNvcHkgY29uc3RydWN0b3IgdGhhdCBkb2VzIG5vdCB0b3VjaCB1bnVzZWQgcGFnZXMuCi0gICAgY29uc3QgRmFzdENhcHR1cmVEdW1wU3RhdGUgKmNvcHkgPSBuZXcgRmFzdENhcHR1cmVEdW1wU3RhdGUobUZhc3RDYXB0dXJlRHVtcFN0YXRlKTsKKyAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8RmFzdENhcHR1cmVEdW1wU3RhdGU+IGNvcHkgPQorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxGYXN0Q2FwdHVyZUR1bXBTdGF0ZT4obUZhc3RDYXB0dXJlRHVtcFN0YXRlKTsKICAgICBjb3B5LT5kdW1wKGZkKTsKLSAgICBkZWxldGUgY29weTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6ZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpkdW1wVHJhY2tzX2woaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewogICAgIFN0cmluZzggcmVzdWx0OwogICAgIHNpemVfdCBudW10cmFja3MgPSBtVHJhY2tzLnNpemUoKTsKQEAgLTczMjcsNyArNzg3Nyw3IEBACiAgICAgaWYgKG51bXRyYWNrcykgewogICAgICAgICBkcHJpbnRmKGZkLCAiIG9mIHdoaWNoICV6dSBhcmUgYWN0aXZlXG4iLCBudW1hY3RpdmUpOwogICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7Ci0gICAgICAgIFJlY29yZFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CisgICAgICAgIG1UcmFja3NbMF0tPmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW10cmFja3MgOyArK2kpIHsKICAgICAgICAgICAgIHNwPFJlY29yZFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07CiAgICAgICAgICAgICBpZiAodHJhY2sgIT0gMCkgewpAQCAtNzM0Nyw3ICs3ODk3LDcgQEAKICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICBUaGUgZm9sbG93aW5nIHRyYWNrcyBhcmUgaW4gdGhlIGFjdGl2ZSBsaXN0IGJ1dCIKICAgICAgICAgICAgICAgICAiIG5vdCBpbiB0aGUgdHJhY2sgbGlzdFxuIik7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKLSAgICAgICAgUmVjb3JkVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKKyAgICAgICAgbUFjdGl2ZVRyYWNrc1swXS0+YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bWFjdGl2ZTsgKytpKSB7CiAgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldOwogICAgICAgICAgICAgaWYgKG1UcmFja3MuaW5kZXhPZih0cmFjaykgPCAwKSB7CkBAIC03Mzg2LDcgKzc5MzYsNyBAQAogICAgIFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkID0gKFJlY29yZFRocmVhZCAqKSB0aHJlYWRCYXNlLmdldCgpOwogICAgIGNvbnN0IGludDMyX3QgcmVhciA9IHJlY29yZFRocmVhZC0+bVJzbXBJblJlYXI7CiAgICAgY29uc3QgaW50MzJfdCBmcm9udCA9IG1Sc21wSW5Gcm9udDsKLSAgICBjb25zdCBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBmcm9udDsKKyAgICBjb25zdCBzc2l6ZV90IGZpbGxlZCA9IGF1ZGlvX3V0aWxzOjpzYWZlX3N1Yl9vdmVyZmxvdyhyZWFyLCBmcm9udCk7CiAKICAgICBzaXplX3QgZnJhbWVzSW47CiAgICAgYm9vbCBvdmVycnVuID0gZmFsc2U7CkBAIC03NDAwLDcgKzc5NTAsOCBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIGNsaWVudCBpcyBub3Qga2VlcGluZyB1cCB3aXRoIHNlcnZlciwgYnV0IGdpdmUgaXQgbGF0ZXN0IGRhdGEKICAgICAgICAgZnJhbWVzSW4gPSByZWNvcmRUaHJlYWQtPm1Sc21wSW5GcmFtZXM7Ci0gICAgICAgIG1Sc21wSW5Gcm9udCA9IC8qIGZyb250ID0gKi8gcmVhciAtIGZyYW1lc0luOworICAgICAgICBtUnNtcEluRnJvbnQgPSAvKiBmcm9udCA9ICovIGF1ZGlvX3V0aWxzOjpzYWZlX3N1Yl9vdmVyZmxvdygKKyAgICAgICAgICAgICAgICByZWFyLCBzdGF0aWNfY2FzdDxpbnQzMl90PihmcmFtZXNJbikpOwogICAgICAgICBvdmVycnVuID0gdHJ1ZTsKICAgICB9CiAgICAgaWYgKGZyYW1lc0F2YWlsYWJsZSAhPSBOVUxMKSB7CkBAIC03NDI0LDcgKzc5NzUsNyBAQAogICAgIFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkID0gKFJlY29yZFRocmVhZCAqKSB0aHJlYWRCYXNlLmdldCgpOwogICAgIGludDMyX3QgcmVhciA9IHJlY29yZFRocmVhZC0+bVJzbXBJblJlYXI7CiAgICAgaW50MzJfdCBmcm9udCA9IG1Sc21wSW5Gcm9udDsKLSAgICBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBmcm9udDsKKyAgICBzc2l6ZV90IGZpbGxlZCA9IGF1ZGlvX3V0aWxzOjpzYWZlX3N1Yl9vdmVyZmxvdyhyZWFyLCBmcm9udCk7CiAgICAgLy8gRklYTUUgc2hvdWxkIG5vdCBiZSBQMiAoZG9uJ3Qgd2FudCB0byBpbmNyZWFzZSBsYXRlbmN5KQogICAgIC8vIEZJWE1FIGlmIGNsaWVudCBub3Qga2VlcGluZyB1cCwgZGlzY2FyZAogICAgIExPR19BTFdBWVNfRkFUQUxfSUYoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gcmVjb3JkVGhyZWFkLT5tUnNtcEluRnJhbWVzKSk7CkBAIC03NDU3LDEzICs4MDA4LDEzIEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZXNhbXBsZXJCdWZmZXJQcm92aWRlcjo6cmVsZWFzZUJ1ZmZlcigKICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpCiB7Ci0gICAgc2l6ZV90IHN0ZXBDb3VudCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICBpbnQzMl90IHN0ZXBDb3VudCA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGJ1ZmZlci0+ZnJhbWVDb3VudCk7CiAgICAgaWYgKHN0ZXBDb3VudCA9PSAwKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgQUxPR19BU1NFUlQoc3RlcENvdW50IDw9IG1Sc21wSW5VbnJlbCk7CiAgICAgbVJzbXBJblVucmVsIC09IHN0ZXBDb3VudDsKLSAgICBtUnNtcEluRnJvbnQgKz0gc3RlcENvdW50OworICAgIG1Sc21wSW5Gcm9udCA9IGF1ZGlvX3V0aWxzOjpzYWZlX2FkZF9vdmVyZmxvdyhtUnNtcEluRnJvbnQsIHN0ZXBDb3VudCk7CiAgICAgYnVmZmVyLT5yYXcgPSBOVUxMOwogICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7CiB9CkBAIC03NjEzLDcgKzgxNjQsOCBAQAogICAgIHJldHVybiBTdHJpbmc4KCk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCkgewordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6aW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSB7CiAgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IGRlc2MgPSBuZXcgQXVkaW9Jb0Rlc2NyaXB0b3IoKTsKIAogICAgIGRlc2MtPm1Jb0hhbmRsZSA9IG1JZDsKQEAgLTc2MzAsNyArODE4MiwxMCBAQAogICAgICAgICBkZXNjLT5tRnJhbWVDb3VudEhBTCA9IG1GcmFtZUNvdW50OwogICAgICAgICBkZXNjLT5tTGF0ZW5jeSA9IDA7CiAgICAgICAgIGJyZWFrOwotCisgICAgY2FzZSBBVURJT19DTElFTlRfU1RBUlRFRDoKKyAgICAgICAgZGVzYy0+bVBhdGNoID0gbVBhdGNoOworICAgICAgICBkZXNjLT5tUG9ydElkID0gcG9ydElkOworICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX0lOUFVUX0NMT1NFRDoKICAgICBkZWZhdWx0OgogICAgICAgICBicmVhazsKQEAgLTc2NDIsMTAgKzgxOTcsMTUgQEAKIHsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBtSW5wdXQtPnN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKCZtU2FtcGxlUmF0ZSwgJm1DaGFubmVsTWFzaywgJm1IQUxGb3JtYXQpOwogICAgIExPR19BTFdBWVNfRkFUQUxfSUYocmVzdWx0ICE9IE9LLCAiRXJyb3IgcmV0cmlldmluZyBhdWRpbyBwcm9wZXJ0aWVzIGZyb20gSEFMOiAlZCIsIHJlc3VsdCk7Ci0gICAgbUNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKG1DaGFubmVsTWFzayk7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihtQ2hhbm5lbENvdW50ID4gRkNDXzgsICJIQUwgY2hhbm5lbCBjb3VudCAlZCA+ICVkIiwgbUNoYW5uZWxDb3VudCwgRkNDXzgpOwogICAgIG1Gb3JtYXQgPSBtSEFMRm9ybWF0OwotICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIWF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCksICJIQUwgZm9ybWF0ICUjeCBpcyBub3QgbGluZWFyIHBjbSIsIG1Gb3JtYXQpOworICAgIG1DaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhtQ2hhbm5lbE1hc2spOworICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUNoYW5uZWxDb3VudCA+IEZDQ184LCAiSEFMIGNoYW5uZWwgY291bnQgJWQgPiAlZCIsCisgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudCwgRkNDXzgpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIENhbiBoYXZlIG1vcmUgdGhhdCBGQ0NfOCBjaGFubmVscyBpbiBlbmNvZGVkIHN0cmVhbXMuCisgICAgICAgIEFMT0dJKCJIQUwgZm9ybWF0ICUjeCBpcyBub3QgbGluZWFyIHBjbSIsIG1Gb3JtYXQpOworICAgIH0KICAgICByZXN1bHQgPSBtSW5wdXQtPnN0cmVhbS0+Z2V0RnJhbWVTaXplKCZtRnJhbWVTaXplKTsKICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHJlc3VsdCAhPSBPSywgIkVycm9yIHJldHJpZXZpbmcgZnJhbWUgc2l6ZSBmcm9tIEhBTDogJWQiLCByZXN1bHQpOwogICAgIHJlc3VsdCA9IG1JbnB1dC0+c3RyZWFtLT5nZXRCdWZmZXJTaXplKCZtQnVmZmVyU2l6ZSk7CkBAIC03Njk1LDI3ICs4MjU1LDYgQEAKICAgICByZXR1cm4gMDsKIH0KIAotLy8gaGFzQXVkaW9TZXNzaW9uX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKLXVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpoYXNBdWRpb1Nlc3Npb25fbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKSBjb25zdAotewotICAgIHVpbnQzMl90IHJlc3VsdCA9IDA7Ci0gICAgaWYgKGdldEVmZmVjdENoYWluX2woc2Vzc2lvbklkKSAhPSAwKSB7Ci0gICAgICAgIHJlc3VsdCA9IEVGRkVDVF9TRVNTSU9OOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAoc2Vzc2lvbklkID09IG1UcmFja3NbaV0tPnNlc3Npb25JZCgpKSB7Ci0gICAgICAgICAgICByZXN1bHQgfD0gVFJBQ0tfU0VTU0lPTjsKLSAgICAgICAgICAgIGlmIChtVHJhY2tzW2ldLT5pc0Zhc3RUcmFjaygpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0IHw9IEZBU1RfU0VTU0lPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQogS2V5ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90LCBib29sPiBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6c2Vzc2lvbklkcygpIGNvbnN0CiB7CiAgICAgS2V5ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90LCBib29sPiBpZHM7CkBAIC03NzQ5LDExICs4Mjg4LDYgQEAKIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmFkZEVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbikKIHsKLSAgICAvLyBvbmx5IG9uZSBjaGFpbiBwZXIgaW5wdXQgdGhyZWFkCi0gICAgaWYgKG1FZmZlY3RDaGFpbnMuc2l6ZSgpICE9IDApIHsKLSAgICAgICAgQUxPR1coImFkZEVmZmVjdENoYWluX2woKSBhbHJlYWR5IG9uZSBjaGFpbiAlcCBvbiB0aHJlYWQgJXAiLCBjaGFpbi5nZXQoKSwgdGhpcyk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9CiAgICAgQUxPR1YoImFkZEVmZmVjdENoYWluX2woKSAlcCBvbiB0aHJlYWQgJXAiLCBjaGFpbi5nZXQoKSwgdGhpcyk7CiAgICAgY2hhaW4tPnNldFRocmVhZCh0aGlzKTsKICAgICBjaGFpbi0+c2V0SW5CdWZmZXIoTlVMTCk7CkBAIC03NzczLDEzICs4MzA3LDE0IEBACiBzaXplX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnJlbW92ZUVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbikKIHsKICAgICBBTE9HVigicmVtb3ZlRWZmZWN0Q2hhaW5fbCgpICVwIGZyb20gdGhyZWFkICVwIiwgY2hhaW4uZ2V0KCksIHRoaXMpOwotICAgIEFMT0dXX0lGKG1FZmZlY3RDaGFpbnMuc2l6ZSgpICE9IDEsCi0gICAgICAgICAgICAicmVtb3ZlRWZmZWN0Q2hhaW5fbCgpICVwIGludmFsaWQgY2hhaW4gc2l6ZSAlenUgb24gdGhyZWFkICVwIiwKLSAgICAgICAgICAgIGNoYWluLmdldCgpLCBtRWZmZWN0Q2hhaW5zLnNpemUoKSwgdGhpcyk7Ci0gICAgaWYgKG1FZmZlY3RDaGFpbnMuc2l6ZSgpID09IDEpIHsKLSAgICAgICAgbUVmZmVjdENoYWlucy5yZW1vdmVBdCgwKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoY2hhaW4gPT0gbUVmZmVjdENoYWluc1tpXSkgeworICAgICAgICAgICAgbUVmZmVjdENoYWlucy5yZW1vdmVBdChpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiAwOworICAgIHJldHVybiBtRWZmZWN0Q2hhaW5zLnNpemUoKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmNyZWF0ZUF1ZGlvUGF0Y2hfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLApAQCAtNzc4OSw2ICs4MzI0LDcgQEAKIAogICAgIC8vIHN0b3JlIG5ldyBkZXZpY2UgYW5kIHNlbmQgdG8gZWZmZWN0cwogICAgIG1JbkRldmljZSA9IHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UudHlwZTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkID0gcGF0Y2gtPnNvdXJjZXNbMF0uaWQ7CiAgICAgbVBhdGNoID0gKnBhdGNoOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgewogICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXREZXZpY2VfbChtSW5EZXZpY2UpOwpAQCAtNzgzMCw5ICs4MzY2LDEwIEBACiAgICAgICAgICpoYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICB9CiAKLSAgICBpZiAobUluRGV2aWNlICE9IG1QcmV2SW5EZXZpY2UpIHsKKyAgICBpZiAoKG1JbkRldmljZSAhPSBtUHJldkluRGV2aWNlKSB8fCAobURldmljZUlkICE9IGRldmljZUlkKSkgewogICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEFVRElPX0lOUFVUX0NPTkZJR19DSEFOR0VEKTsKICAgICAgICAgbVByZXZJbkRldmljZSA9IG1JbkRldmljZTsKKyAgICAgICAgbURldmljZUlkID0gZGV2aWNlSWQ7CiAgICAgfQogCiAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTc4NTUsMjQgKzgzOTIsMjggQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjphZGRQYXRjaFJlY29yZChjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmFkZFBhdGNoVHJhY2soY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBtVHJhY2tzLmFkZChyZWNvcmQpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpkZWxldGVQYXRjaFJlY29yZChjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmRlbGV0ZVBhdGNoVHJhY2soY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBkZXN0cm95VHJhY2tfbChyZWNvcmQpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKIHsKLSAgICBUaHJlYWRCYXNlOjpnZXRBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKKyAgICBUaHJlYWRCYXNlOjp0b0F1ZGlvUG9ydENvbmZpZyhjb25maWcpOwogICAgIGNvbmZpZy0+cm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TSU5LOwogICAgIGNvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGUgPSBtSW5wdXQtPmF1ZGlvSHdEZXYtPmhhbmRsZSgpOwogICAgIGNvbmZpZy0+ZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9IG1BdWRpb1NvdXJjZTsKKyAgICBpZiAobUlucHV0ICYmIG1JbnB1dC0+ZmxhZ3MgIT0gQVVESU9fSU5QVVRfRkxBR19OT05FKSB7CisgICAgICAgIGNvbmZpZy0+Y29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7CisgICAgICAgIGNvbmZpZy0+ZmxhZ3MuaW5wdXQgPSBtSW5wdXQtPmZsYWdzOworICAgIH0KIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNzkyNSw3ICs4NDY2LDcgQEAKICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dERldmljZSwgYXVkaW9fZGV2aWNlc190IGluRGV2aWNlLCBib29sIHN5c3RlbVJlYWR5KQogICAgIDogVGhyZWFkQmFzZShhdWRpb0ZsaW5nZXIsIGlkLCBvdXREZXZpY2UsIGluRGV2aWNlLCBNTUFQLCBzeXN0ZW1SZWFkeSksCiAgICAgICBtU2Vzc2lvbklkKEFVRElPX1NFU1NJT05fTk9ORSksCi0gICAgICBtRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksIG1Qb3J0SWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksCisgICAgICBtUG9ydElkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAogICAgICAgbUhhbFN0cmVhbShzdHJlYW0pLCBtSGFsRGV2aWNlKGh3RGV2LT5od0RldmljZSgpKSwgbUF1ZGlvSHdEZXYoaHdEZXYpLAogICAgICAgbUFjdGl2ZVRyYWNrcygmdGhpcy0+bUxvY2FsTG9nKSwKICAgICAgIG1IYWxWb2xGbG9hdCgtMS4wZiksIC8vIEluaXRpYWxpemUgdG8gaWxsZWdhbCB2YWx1ZSBzbyBpdCBhbHdheXMgZ2V0cyBzZXQgcHJvcGVybHkgbGF0ZXIuCkBAIC03OTU5LDcgKzg1MDAsNyBAQAogICAgIH0KICAgICAvLyBUaGlzIHdpbGwgZGVjcmVtZW50IHJlZmVyZW5jZXMgYW5kIG1heSBjYXVzZSB0aGUgZGVzdHJ1Y3Rpb24gb2YgdGhpcyB0aHJlYWQuCiAgICAgaWYgKGlzT3V0cHV0KCkpIHsKLSAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQobUlkLCBzdHJlYW1UeXBlKCksIG1TZXNzaW9uSWQpOworICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChtUG9ydElkKTsKICAgICB9IGVsc2UgewogICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KG1Qb3J0SWQpOwogICAgIH0KQEAgLTgwMzgsNiArODU3OSw3IEBACiAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0KICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKEFVRElPX09VVFBVVF9GTEFHX01NQVBfTk9JUlEgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOwogICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkID0gbURldmljZUlkOworICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gc2Vjb25kYXJ5T3V0cHV0czsKICAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckF0dHIoJm1BdHRyLCAmaW8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW0sCkBAIC04MDQ2LDcgKzg1ODgsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvcnRJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWNvbmRhcnlPdXRwdXRzKTsKKyAgICAgICAgQUxPR0RfSUYoIXNlY29uZGFyeU91dHB1dHMuZW1wdHkoKSwKKyAgICAgICAgICAgICAgICAgIk1tYXBUaHJlYWQ6OnN0YXJ0IGRvZXMgbm90IHN1cHBvcnQgc2Vjb25kYXJ5IG91dHB1dHMsIGlnbm9yaW5nIHRoZW0iKTsKICAgICB9IGVsc2UgewogICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZzsKICAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gbVNhbXBsZVJhdGU7CkBAIC04MDU0LDYgKzg1OTksNyBAQAogICAgICAgICBjb25maWcuZm9ybWF0ID0gbUZvcm1hdDsKICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCA9IG1EZXZpY2VJZDsKICAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OmdldElucHV0Rm9yQXR0cigmbUF0dHIsICZpbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUNPUkRfUklJRF9JTlZBTElELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LmNsaWVudFBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuY2xpZW50VWlkLApAQCAtODA3MSwyMSArODYxNywyMCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIGJvb2wgc2lsZW5jZWQgPSBmYWxzZTsKICAgICBpZiAoaXNPdXRwdXQoKSkgewotICAgICAgICByZXQgPSBBdWRpb1N5c3RlbTo6c3RhcnRPdXRwdXQobUlkLCBzdHJlYW1UeXBlKCksIG1TZXNzaW9uSWQpOworICAgICAgICByZXQgPSBBdWRpb1N5c3RlbTo6c3RhcnRPdXRwdXQocG9ydElkKTsKICAgICB9IGVsc2UgewotICAgICAgICByZXQgPSBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChwb3J0SWQsICZzaWxlbmNlZCk7CisgICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpzdGFydElucHV0KHBvcnRJZCk7CiAgICAgfQogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAvLyBhYm9ydCBpZiBzdGFydCBpcyByZWplY3RlZCBieSBhdWRpbyBwb2xpY3kgbWFuYWdlcgogICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR0UoIiVzOiBlcnJvciBzdGFydCByZWplY3RlZCBieSBBdWRpb1BvbGljeU1hbmFnZXIgPSAlZCIsIF9fRlVOQ1RJT05fXywgcmV0KTsKLSAgICAgICAgaWYgKG1BY3RpdmVUcmFja3Muc2l6ZSgpICE9IDApIHsKKyAgICAgICAgaWYgKCFtQWN0aXZlVHJhY2tzLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICBpZiAoaXNPdXRwdXQoKSkgewotICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG1JZCwgc3RyZWFtVHlwZSgpLCBtU2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChwb3J0SWQpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KHBvcnRJZCk7CiAgICAgICAgICAgICB9CkBAIC04MDk2LDIxICs4NjQxLDIyIEBACiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKKyAgICAvLyBHaXZlbiB0aGF0IE1tYXBUaHJlYWQ6Om1BdHRyIGlzIG11dGFibGUsIHNob3VsZCBhIE1tYXBUcmFjayBoYXZlIGF0dHJpYnV0ZXMgPworICAgIHNwPE1tYXBUcmFjaz4gdHJhY2sgPSBuZXcgTW1hcFRyYWNrKHRoaXMsIG1BdHRyLCBtU2FtcGxlUmF0ZSwgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLCBtU2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzT3V0cHV0KCksIGNsaWVudC5jbGllbnRVaWQsIGNsaWVudC5jbGllbnRQaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLCBwb3J0SWQpOworCiAgICAgaWYgKGlzT3V0cHV0KCkpIHsKICAgICAgICAgLy8gZm9yY2Ugdm9sdW1lIHVwZGF0ZSB3aGVuIGEgbmV3IHRyYWNrIGlzIGFkZGVkCiAgICAgICAgIG1IYWxWb2xGbG9hdCA9IC0xLjBmOwotICAgIH0gZWxzZSBpZiAoIXNpbGVuY2VkKSB7Ci0gICAgICAgIGZvciAoY29uc3Qgc3A8TW1hcFRyYWNrPiAmdHJhY2sgOiBtQWN0aXZlVHJhY2tzKSB7Ci0gICAgICAgICAgICBpZiAodHJhY2stPmlzU2lsZW5jZWRfbCgpICYmIHRyYWNrLT51aWQoKSAhPSBjbGllbnQuY2xpZW50VWlkKQotICAgICAgICAgICAgICAgIHRyYWNrLT5pbnZhbGlkYXRlKCk7CisgICAgfSBlbHNlIGlmICghdHJhY2stPmlzU2lsZW5jZWRfbCgpKSB7CisgICAgICAgIGZvciAoY29uc3Qgc3A8TW1hcFRyYWNrPiAmdCA6IG1BY3RpdmVUcmFja3MpIHsKKyAgICAgICAgICAgIGlmICh0LT5pc1NpbGVuY2VkX2woKSAmJiB0LT51aWQoKSAhPSBjbGllbnQuY2xpZW50VWlkKQorICAgICAgICAgICAgICAgIHQtPmludmFsaWRhdGUoKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIEdpdmVuIHRoYXQgTW1hcFRocmVhZDo6bUF0dHIgaXMgbXV0YWJsZSwgc2hvdWxkIGEgTW1hcFRyYWNrIGhhdmUgYXR0cmlidXRlcyA/Ci0gICAgc3A8TW1hcFRyYWNrPiB0cmFjayA9IG5ldyBNbWFwVHJhY2sodGhpcywgbUF0dHIsIG1TYW1wbGVSYXRlLCBtRm9ybWF0LCBtQ2hhbm5lbE1hc2ssIG1TZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LmNsaWVudFVpZCwgY2xpZW50LmNsaWVudFBpZCwgcG9ydElkKTsKIAotICAgIHRyYWNrLT5zZXRTaWxlbmNlZF9sKHNpbGVuY2VkKTsKICAgICBtQWN0aXZlVHJhY2tzLmFkZCh0cmFjayk7CiAgICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluID0gZ2V0RWZmZWN0Q2hhaW5fbChtU2Vzc2lvbklkKTsKICAgICBpZiAoY2hhaW4gIT0gMCkgewpAQCAtODE1Nyw4ICs4NzAzLDggQEAKIAogICAgIG1Mb2NrLnVubG9jaygpOwogICAgIGlmIChpc091dHB1dCgpKSB7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KG1JZCwgc3RyZWFtVHlwZSgpLCB0cmFjay0+c2Vzc2lvbklkKCkpOwotICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChtSWQsIHN0cmVhbVR5cGUoKSwgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQodHJhY2stPnBvcnRJZCgpKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQodHJhY2stPnBvcnRJZCgpKTsKICAgICB9IGVsc2UgewogICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcElucHV0KHRyYWNrLT5wb3J0SWQoKSk7CiAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQodHJhY2stPnBvcnRJZCgpKTsKQEAgLTgxODMsNyArODcyOSw3IEBACiAgICAgaWYgKG1IYWxTdHJlYW0gPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgaWYgKG1BY3RpdmVUcmFja3Muc2l6ZSgpICE9IDApIHsKKyAgICBpZiAoIW1BY3RpdmVUcmFja3MuaXNFbXB0eSgpKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgbUhhbFN0cmVhbS0+c3RhbmRieSgpOwpAQCAtODIxNCw5ICs4NzYwLDExIEBACiAKICAgICB3aGlsZSAoIWV4aXRQZW5kaW5nKCkpCiAgICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICAgICBWZWN0b3I8IHNwPEVmZmVjdENoYWluPiA+IGVmZmVjdENoYWluczsKIAorICAgICAgICB7IC8vIHVuZGVyIFRocmVhZCBsb2NrCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKICAgICAgICAgaWYgKG1TaWduYWxQZW5kaW5nKSB7CiAgICAgICAgICAgICAvLyBBIHNpZ25hbCB3YXMgcmFpc2VkIHdoaWxlIHdlIHdlcmUgdW5sb2NrZWQKICAgICAgICAgICAgIG1TaWduYWxQZW5kaW5nID0gZmFsc2U7CkBAIC04MjUxLDEwICs4Nzk5LDEzIEBACiAgICAgICAgIHVwZGF0ZU1ldGFkYXRhX2woKTsKIAogICAgICAgICBsb2NrRWZmZWN0Q2hhaW5zX2woZWZmZWN0Q2hhaW5zKTsKKyAgICAgICAgfSAvLyByZWxlYXNlIFRocmVhZCBsb2NrCisKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RDaGFpbnMuc2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgICAgICBlZmZlY3RDaGFpbnNbaV0tPnByb2Nlc3NfbCgpOworICAgICAgICAgICAgZWZmZWN0Q2hhaW5zW2ldLT5wcm9jZXNzX2woKTsgLy8gVGhyZWFkIGlzIG5vdCBsb2NrZWQsIGJ1dCBlZmZlY3QgY2hhaW4gaXMgbG9ja2VkCiAgICAgICAgIH0KLSAgICAgICAgLy8gZW5hYmxlIGNoYW5nZXMgaW4gZWZmZWN0IGNoYWluCisKKyAgICAgICAgLy8gZW5hYmxlIGNoYW5nZXMgaW4gZWZmZWN0IGNoYWluLCBpbmNsdWRpbmcgbW92aW5nIHRvIGFub3RoZXIgdGhyZWFkLgogICAgICAgICB1bmxvY2tFZmZlY3RDaGFpbnMoZWZmZWN0Q2hhaW5zKTsKICAgICAgICAgLy8gRWZmZWN0IGNoYWlucyB3aWxsIGJlIGFjdHVhbGx5IGRlbGV0ZWQgaGVyZSBpZiB0aGV5IHdlcmUgcmVtb3ZlZCBmcm9tCiAgICAgICAgIC8vIG1FZmZlY3RDaGFpbnMgbGlzdCBkdXJpbmcgbWl4aW5nIG9yIGVmZmVjdHMgcHJvY2Vzc2luZwpAQCAtODMxOSw3ICs4ODcwLDggQEAKICAgICByZXR1cm4gU3RyaW5nOCgpOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6aW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkKSB7Cit2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6aW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCBfX3VudXNlZCkgewogICAgIHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBkZXNjID0gbmV3IEF1ZGlvSW9EZXNjcmlwdG9yKCk7CiAKICAgICBkZXNjLT5tSW9IYW5kbGUgPSBtSWQ7CkBAIC04NDEwLDcgKzg5NjIsNyBAQAogICAgICAgICAqaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAgICAgfQogCi0gICAgaWYgKGlzT3V0cHV0KCkgJiYgbVByZXZPdXREZXZpY2UgIT0gbU91dERldmljZSkgeworICAgIGlmIChpc091dHB1dCgpICYmIChtUHJldk91dERldmljZSAhPSBtT3V0RGV2aWNlIHx8IG1EZXZpY2VJZCAhPSBkZXZpY2VJZCkpIHsKICAgICAgICAgbVByZXZPdXREZXZpY2UgPSB0eXBlOwogICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEFVRElPX09VVFBVVF9DT05GSUdfQ0hBTkdFRCk7CiAgICAgICAgIHNwPE1tYXBTdHJlYW1DYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwpAQCAtODQyMSw3ICs4OTczLDcgQEAKICAgICAgICAgfQogICAgICAgICBtRGV2aWNlSWQgPSBkZXZpY2VJZDsKICAgICB9Ci0gICAgaWYgKCFpc091dHB1dCgpICYmIG1QcmV2SW5EZXZpY2UgIT0gbUluRGV2aWNlKSB7CisgICAgaWYgKCFpc091dHB1dCgpICYmIChtUHJldkluRGV2aWNlICE9IG1JbkRldmljZSB8fCBtRGV2aWNlSWQgIT0gZGV2aWNlSWQpKSB7CiAgICAgICAgIG1QcmV2SW5EZXZpY2UgPSB0eXBlOwogICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEFVRElPX0lOUFVUX0NPTkZJR19DSEFOR0VEKTsKICAgICAgICAgc3A8TW1hcFN0cmVhbUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7CkBAIC04NDU0LDkgKzkwMDYsOSBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCiB7Ci0gICAgVGhyZWFkQmFzZTo6Z2V0QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CisgICAgVGhyZWFkQmFzZTo6dG9BdWRpb1BvcnRDb25maWcoY29uZmlnKTsKICAgICBpZiAoaXNPdXRwdXQoKSkgewogICAgICAgICBjb25maWctPnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFOwogICAgICAgICBjb25maWctPmV4dC5taXguaHdfbW9kdWxlID0gbUF1ZGlvSHdEZXYtPmhhbmRsZSgpOwpAQCAtODUxNSwyOCArOTA2Nyw2IEBACiAgICAgcmV0dXJuIG1FZmZlY3RDaGFpbnMuc2l6ZSgpOwogfQogCi0vLyBoYXNBdWRpb1Nlc3Npb25fbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAotdWludDMyX3QgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpoYXNBdWRpb1Nlc3Npb25fbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKSBjb25zdAotewotICAgIHVpbnQzMl90IHJlc3VsdCA9IDA7Ci0gICAgaWYgKGdldEVmZmVjdENoYWluX2woc2Vzc2lvbklkKSAhPSAwKSB7Ci0gICAgICAgIHJlc3VsdCA9IEVGRkVDVF9TRVNTSU9OOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUFjdGl2ZVRyYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICBzcDxNbWFwVHJhY2s+IHRyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXTsKLSAgICAgICAgaWYgKHNlc3Npb25JZCA9PSB0cmFjay0+c2Vzc2lvbklkKCkpIHsKLSAgICAgICAgICAgIHJlc3VsdCB8PSBUUkFDS19TRVNTSU9OOwotICAgICAgICAgICAgaWYgKHRyYWNrLT5pc0Zhc3RUcmFjaygpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0IHw9IEZBU1RfU0VTU0lPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQogdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6OnRocmVhZExvb3Bfc3RhbmRieSgpCiB7CiAgICAgbUhhbFN0cmVhbS0+c3RhbmRieSgpOwpAQCAtODYwNSwyOCArOTEzNSwxNyBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQordm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6OmR1bXBJbnRlcm5hbHNfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7Ci0gICAgZHVtcEludGVybmFscyhmZCwgYXJncyk7Ci0gICAgZHVtcFRyYWNrcyhmZCwgYXJncyk7Ci0gICAgZHVtcEVmZmVjdENoYWlucyhmZCwgYXJncyk7Ci0gICAgZHByaW50ZihmZCwgIiAgTG9jYWwgbG9nOlxuIik7Ci0gICAgbUxvY2FsTG9nLmR1bXAoZmQsICIgICAiIC8qIHByZWZpeCAqLywgNDAgLyogbGluZXMgKi8pOwotfQotCi12b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6ZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCi17Ci0gICAgZHVtcEJhc2UoZmQsIGFyZ3MpOwotCiAgICAgZHByaW50ZihmZCwgIiAgQXR0cmlidXRlczogY29udGVudCB0eXBlICVkIHVzYWdlICVkIHNvdXJjZSAlZFxuIiwKICAgICAgICAgICAgIG1BdHRyLmNvbnRlbnRfdHlwZSwgbUF0dHIudXNhZ2UsIG1BdHRyLnNvdXJjZSk7CiAgICAgZHByaW50ZihmZCwgIiAgU2Vzc2lvbjogJWQgcG9ydCBJZDogJWRcbiIsIG1TZXNzaW9uSWQsIG1Qb3J0SWQpOwotICAgIGlmIChtQWN0aXZlVHJhY2tzLnNpemUoKSA9PSAwKSB7CisgICAgaWYgKG1BY3RpdmVUcmFja3MuaXNFbXB0eSgpKSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgIE5vIGFjdGl2ZSBjbGllbnRzXG4iKTsKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpkdW1wVHJhY2tzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpkdW1wVHJhY2tzX2woaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewogICAgIFN0cmluZzggcmVzdWx0OwogICAgIHNpemVfdCBudW10cmFja3MgPSBtQWN0aXZlVHJhY2tzLnNpemUoKTsKQEAgLTg2MzQsNyArOTE1Myw3IEBACiAgICAgY29uc3QgY2hhciAqcHJlZml4ID0gIiAgICAiOwogICAgIGlmIChudW10cmFja3MpIHsKICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwotICAgICAgICBNbWFwVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKKyAgICAgICAgbUFjdGl2ZVRyYWNrc1swXS0+YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bXRyYWNrcyA7ICsraSkgewogICAgICAgICAgICAgc3A8TW1hcFRyYWNrPiB0cmFjayA9IG1BY3RpdmVUcmFja3NbaV07CiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7CkBAIC04ODQwLDkgKzkzNTksMTggQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwUGxheWJhY2tUaHJlYWQ6OmR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQordm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBQbGF5YmFja1RocmVhZDo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCiB7Ci0gICAgTW1hcFRocmVhZDo6ZHVtcEludGVybmFscyhmZCwgYXJncyk7CisgICAgTW1hcFRocmVhZDo6dG9BdWRpb1BvcnRDb25maWcoY29uZmlnKTsKKyAgICBpZiAobU91dHB1dCAmJiBtT3V0cHV0LT5mbGFncyAhPSBBVURJT19PVVRQVVRfRkxBR19OT05FKSB7CisgICAgICAgIGNvbmZpZy0+Y29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7CisgICAgICAgIGNvbmZpZy0+ZmxhZ3Mub3V0cHV0ID0gbU91dHB1dC0+ZmxhZ3M7CisgICAgfQorfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFBsYXliYWNrVGhyZWFkOjpkdW1wSW50ZXJuYWxzX2woaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQoreworICAgIE1tYXBUaHJlYWQ6OmR1bXBJbnRlcm5hbHNfbChmZCwgYXJncyk7CiAKICAgICBkcHJpbnRmKGZkLCAiICBTdHJlYW0gdHlwZTogJWQgU3RyZWFtIHZvbHVtZTogJWYgSEFMIHZvbHVtZTogJWYgU3RyZWFtIG11dGUgJWRcbiIsCiAgICAgICAgICAgICBtU3RyZWFtVHlwZSwgbVN0cmVhbVZvbHVtZSwgbUhhbFZvbEZsb2F0LCBtU3RyZWFtTXV0ZSk7CkBAIC04ODYyLDcgKzkzOTAsMTMgQEAKIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpNbWFwQ2FwdHVyZVRocmVhZDo6ZXhpdFN0YW5kYnkoKQogewotICAgIG1JbnB1dC0+c3RyZWFtLT5zZXRHYWluKDEuMGYpOworICAgIHsKKyAgICAgICAgLy8gbUlucHV0IG1pZ2h0IGhhdmUgYmVlbiBjbGVhcmVkIGJ5IGNsZWFySW5wdXQoKQorICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBpZiAobUlucHV0ICE9IG51bGxwdHIgJiYgbUlucHV0LT5zdHJlYW0gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUlucHV0LT5zdHJlYW0tPnNldEdhaW4oMS4wZik7CisgICAgICAgIH0KKyAgICB9CiAgICAgcmV0dXJuIE1tYXBUaHJlYWQ6OmV4aXRTdGFuZGJ5KCk7CiB9CiAKQEAgLTg5MzAsNCArOTQ2NCwxMyBAQAogICAgIH0KIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBDYXB0dXJlVGhyZWFkOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3sKKyAgICBNbWFwVGhyZWFkOjp0b0F1ZGlvUG9ydENvbmZpZyhjb25maWcpOworICAgIGlmIChtSW5wdXQgJiYgbUlucHV0LT5mbGFncyAhPSBBVURJT19JTlBVVF9GTEFHX05PTkUpIHsKKyAgICAgICAgY29uZmlnLT5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICAgICAgY29uZmlnLT5mbGFncy5pbnB1dCA9IG1JbnB1dC0+ZmxhZ3M7CisgICAgfQorfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaAppbmRleCAyOGQ0NDgyLi4zMzZjMmI0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKQEAgLTQzLDkgKzQzLDYgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcmVhZHlUb1J1bigpOwogCi0gICAgdm9pZCBkdW1wQmFzZShpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotICAgIHZvaWQgZHVtcEVmZmVjdENoYWlucyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotCiAgICAgdm9pZCBjbGVhclBvd2VyTWFuYWdlcigpOwogCiAgICAgLy8gYmFzZSBmb3IgcmVjb3JkIGFuZCBwbGF5YmFjawpAQCAtMTA2LDggKzEwMyw5IEBACiAKICAgICBjbGFzcyBJb0NvbmZpZ0V2ZW50RGF0YSA6IHB1YmxpYyBDb25maWdFdmVudERhdGEgewogICAgIHB1YmxpYzoKLSAgICAgICAgSW9Db25maWdFdmVudERhdGEoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQpIDoKLSAgICAgICAgICAgIG1FdmVudChldmVudCksIG1QaWQocGlkKSB7fQorICAgICAgICBJb0NvbmZpZ0V2ZW50RGF0YShhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpIDoKKyAgICAgICAgICAgIG1FdmVudChldmVudCksIG1QaWQocGlkKSwgbVBvcnRJZChwb3J0SWQpIHt9CiAKICAgICAgICAgdmlydHVhbCAgdm9pZCBkdW1wKGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUpIHsKICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZSwgIklPIGV2ZW50OiBldmVudCAlZFxuIiwgbUV2ZW50KTsKQEAgLTExNSwxMyArMTEzLDE0IEBACiAKICAgICAgICAgY29uc3QgYXVkaW9faW9fY29uZmlnX2V2ZW50IG1FdmVudDsKICAgICAgICAgY29uc3QgcGlkX3QgICAgICAgICAgICAgICAgIG1QaWQ7CisgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgICBtUG9ydElkOwogICAgIH07CiAKICAgICBjbGFzcyBJb0NvbmZpZ0V2ZW50IDogcHVibGljIENvbmZpZ0V2ZW50IHsKICAgICBwdWJsaWM6Ci0gICAgICAgIElvQ29uZmlnRXZlbnQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQpIDoKKyAgICAgICAgSW9Db25maWdFdmVudChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCwgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpIDoKICAgICAgICAgICAgIENvbmZpZ0V2ZW50KENGR19FVkVOVF9JTykgewotICAgICAgICAgICAgbURhdGEgPSBuZXcgSW9Db25maWdFdmVudERhdGEoZXZlbnQsIHBpZCk7CisgICAgICAgICAgICBtRGF0YSA9IG5ldyBJb0NvbmZpZ0V2ZW50RGF0YShldmVudCwgcGlkLCBwb3J0SWQpOwogICAgICAgICB9CiAgICAgICAgIHZpcnR1YWwgfklvQ29uZmlnRXZlbnQoKSB7fQogICAgIH07CkBAIC0yNjMsMTMgKzI2MiwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190JiBzdGF0dXMpID0gMDsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwogICAgIHZpcnR1YWwgICAgIFN0cmluZzggICAgIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cykgPSAwOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCA9IDApID0gMDsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgPSAwOwogICAgICAgICAgICAgICAgIC8vIHNlbmRDb25maWdFdmVudF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCiAgICAgICAgICAgICAgICAgLy8gQ2FuIHRlbXBvcmFyaWx5IHJlbGVhc2UgdGhlIGxvY2sgaWYgd2FpdGluZyBmb3IgYSByZXBseSBmcm9tCiAgICAgICAgICAgICAgICAgLy8gcHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCkuCiAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2VuZENvbmZpZ0V2ZW50X2woc3A8Q29uZmlnRXZlbnQ+JiBldmVudCk7Ci0gICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZElvQ29uZmlnRXZlbnQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQgPSAwKTsKLSAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkID0gMCk7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZElvQ29uZmlnRXZlbnQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZFByaW9Db25maWdFdmVudChwaWRfdCBwaWQsIHBpZF90IHRpZCwgaW50MzJfdCBwcmlvLCBib29sIGZvckFwcCk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZFByaW9Db25maWdFdmVudF9sKHBpZF90IHBpZCwgcGlkX3QgdGlkLCBpbnQzMl90IHByaW8sIGJvb2wgZm9yQXBwKTsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZW5kU2V0UGFyYW1ldGVyQ29uZmlnRXZlbnRfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXIpOwpAQCAtMjgxLDcgKzI4Myw3IEBACiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgY3JlYXRlQXVkaW9QYXRjaF9sKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpID0gMDsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICByZWxlYXNlQXVkaW9QYXRjaF9sKGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgPSAwOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgPSAwOworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSA9IDA7CiAKIAogICAgICAgICAgICAgICAgIC8vIHNlZSBub3RlIGF0IGRlY2xhcmF0aW9uIG9mIG1TdGFuZGJ5LCBtT3V0RGV2aWNlIGFuZCBtSW5EZXZpY2UKQEAgLTMxOCw2ICszMjAsNyBAQAogICAgICAgICAgICAgICAgIHNwPEVmZmVjdENoYWluPiBnZXRFZmZlY3RDaGFpbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKTsKICAgICAgICAgICAgICAgICAvLyBzYW1lIGFzIGdldEVmZmVjdENoYWluKCkgYnV0IG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZSBtdXRleCBsb2NrZWQKICAgICAgICAgICAgICAgICBzcDxFZmZlY3RDaGFpbj4gZ2V0RWZmZWN0Q2hhaW5fbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKSBjb25zdDsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IGdldEVmZmVjdElkc19sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpOwogICAgICAgICAgICAgICAgIC8vIGFkZCBhbiBlZmZlY3QgY2hhaW4gdG8gdGhlIGNoYWluIGxpc3QgKG1FZmZlY3RDaGFpbnMpCiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgYWRkRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxFZmZlY3RDaGFpbj4mIGNoYWluKSA9IDA7CiAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGFuIGVmZmVjdCBjaGFpbiBmcm9tIHRoZSBjaGFpbiBsaXN0IChtRWZmZWN0Q2hhaW5zKQpAQCAtMzM3LDcgKzM0MCw4IEBACiAgICAgICAgICAgICAgICAgc3A8QXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU+IGdldEVmZmVjdChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLCBpbnQgZWZmZWN0SWQpOwogICAgICAgICAgICAgICAgIHNwPEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlPiBnZXRFZmZlY3RfbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLCBpbnQgZWZmZWN0SWQpOwogICAgICAgICAgICAgICAgIC8vIGFkZCBhbmQgZWZmZWN0IG1vZHVsZS4gQWxzbyBjcmVhdGVzIHRoZSBlZmZlY3QgY2hhaW4gaXMgbm9uZSBleGlzdHMgZm9yCi0gICAgICAgICAgICAgICAgLy8gdGhlIGVmZmVjdHMgYXVkaW8gc2Vzc2lvbgorICAgICAgICAgICAgICAgIC8vIHRoZSBlZmZlY3RzIGF1ZGlvIHNlc3Npb24uIE9ubHkgY2FsbGVkIGluIGEgY29udGV4dCBvZiBtb3ZpbmcgYW4gZWZmZWN0CisgICAgICAgICAgICAgICAgLy8gZnJvbSBvbmUgdGhyZWFkIHRvIGFub3RoZXIKICAgICAgICAgICAgICAgICBzdGF0dXNfdCBhZGRFZmZlY3RfbChjb25zdCBzcDwgRWZmZWN0TW9kdWxlPiYgZWZmZWN0KTsKICAgICAgICAgICAgICAgICAvLyByZW1vdmUgYW5kIGVmZmVjdCBtb2R1bGUuIEFsc28gcmVtb3ZlcyB0aGUgZWZmZWN0IGNoYWluIGlzIHRoaXMgd2FzIHRoZSBsYXN0CiAgICAgICAgICAgICAgICAgLy8gZWZmZWN0CkBAIC0zNTYsNiArMzYwLDI3IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoYXNBdWRpb1Nlc3Npb25fbChzZXNzaW9uSWQpOwogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgICAgICAgICAgICAgIHVpbnQzMl90IGhhc0F1ZGlvU2Vzc2lvbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsIGNvbnN0IFQmIHRyYWNrcykgY29uc3QgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZXN1bHQgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0RWZmZWN0Q2hhaW5fbChzZXNzaW9uSWQpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEVGRkVDVF9TRVNTSU9OOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdHJhY2tzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxUcmFja0Jhc2U+JiB0cmFjayA9IHRyYWNrc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgPT0gdHJhY2stPnNlc3Npb25JZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICF0cmFjay0+aXNJbnZhbGlkKCkgICAgICAgLy8gbm90IHlldCByZW1vdmVkIGZyb20gdHJhY2tzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhdHJhY2stPmlzVGVybWluYXRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IHw9IFRSQUNLX1NFU1NJT047CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5pc0Zhc3RUcmFjaygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBGQVNUX1NFU1NJT047ICAvLyBjYXV0aW9uLCBvbmx5IHJlcHJlc2VudHMgZmlyc3QgdHJhY2suCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgLy8gdGhlIHZhbHVlIHJldHVybmVkIGJ5IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgbm90IGltcG9ydGFudCBhcyB0aGUKICAgICAgICAgICAgICAgICAvLyBzdHJhdGVneSBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIFBsYXliYWNrVGhyZWFkIHdoaWNoIGltcGxlbWVudHMgdGhpcyBtZXRob2QKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU2Vzc2lvbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgX191bnVzZWQpCkBAIC0zOTMsNiArNDE4LDE1IEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGJyb2FkY2FzdF9sKCk7CiAKKyAgICAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICBpc01zZERldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1Jc01zZERldmljZTsgfQorCisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisKKyAgICAgICAgICAgICAgICAvLyBkZWxpdmVyIHN0YXRzIHRvIG1lZGlhbWV0cmljcy4KKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHNlbmRTdGF0aXN0aWNzKGJvb2wgZm9yY2UpOworCiAgICAgbXV0YWJsZSAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgbUxvY2s7CiAKIHByb3RlY3RlZDoKQEAgLTQzNCw2ICs0NjgsMTcgQEAKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBzZXRNYXN0ZXJNb25vX2woYm9vbCBtb25vIF9fdW51c2VkKSB7IH0KICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICByZXF1aXJlTW9ub0JsZW5kKCkgeyByZXR1cm4gZmFsc2U7IH0KIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxlZCB3aXRoaW4gdGhlIHRocmVhZExvb3AgdG8gb2J0YWluIHRpbWVzdGFtcCBmcm9tIHRoZSBIQUwuCisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgdGhyZWFkbG9vcF9nZXRIYWxUaW1lc3RhbXBfbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkVGltZXN0YW1wICp0aW1lc3RhbXAgX191bnVzZWQpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHNfbChpbnQgZmQgX191bnVzZWQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB9CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZHVtcFRyYWNrc19sKGludCBmZCBfX3VudXNlZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkgeyB9CisKKwogICAgIGZyaWVuZCBjbGFzcyBBdWRpb0ZsaW5nZXI7ICAgICAgLy8gZm9yIG1FZmZlY3RDaGFpbnMKIAogICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVfdCAgICAgICAgICAgIG1UeXBlOwpAQCAtNDczLDYgKzUxOCwxMCBAQAogICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAgICAgICAgIG1QcmV2T3V0RGV2aWNlOyAgIC8vIHByZXZpb3VzIG91dHB1dCBkZXZpY2UKICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgICAgICAgICBtUHJldkluRGV2aWNlOyAgICAvLyBwcmV2aW91cyBpbnB1dCBkZXZpY2UKICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggICAgICBtUGF0Y2g7CisgICAgICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgICAgICogQGJyaWVmIG1EZXZpY2VJZCAgY3VycmVudCBkZXZpY2UgcG9ydCB1bmlxdWUgaWRlbnRpZmllcgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1EZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgICAgICAgICAgbUF1ZGlvU291cmNlOwogCiAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgbUlkOwpAQCAtNDkzLDEwICs1NDIsMzEgQEAKICAgICAgICAgICAgICAgICBzcDxOQkxvZzo6V3JpdGVyPiAgICAgICBtTkJMb2dXcml0ZXI7CiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVJlYWR5OwogICAgICAgICAgICAgICAgIEV4dGVuZGVkVGltZXN0YW1wICAgICAgIG1UaW1lc3RhbXA7CisgICAgICAgICAgICAgICAgVGltZXN0YW1wVmVyaWZpZXI8IC8vIEZvciB0aW1lc3RhbXAgc3RhdGlzdGljcy4KKyAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgLyogZnJhbWUgY291bnQgKi8sIGludDY0X3QgLyogdGltZSBucyAqLz4gbVRpbWVzdGFtcFZlcmlmaWVyOworICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAgICAgICAgIG1UaW1lc3RhbXBDb3JyZWN0ZWREZXZpY2VzID0gQVVESU9fREVWSUNFX05PTkU7CisKKyAgICAgICAgICAgICAgICAvLyBUaHJlYWRMb29wIHN0YXRpc3RpY3MgcGVyIGl0ZXJhdGlvbi4KKyAgICAgICAgICAgICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICBtTGFzdElvQmVnaW5OcyA9IC0xOworICAgICAgICAgICAgICAgIGludDY0X3QgICAgICAgICAgICAgICAgIG1MYXN0SW9FbmROcyA9IC0xOworCisgICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgcmVhZCB1bmRlciBUaHJlYWRCYXNlIGxvY2sgKGlmIG5vdCBvbiB0aGUgdGhyZWFkTG9vcCB0aHJlYWQpLgorICAgICAgICAgICAgICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbUlvSml0dGVyTXN7MC45OTUgLyogYWxwaGEgKi99OworICAgICAgICAgICAgICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbVByb2Nlc3NUaW1lTXN7MC45OTUgLyogYWxwaGEgKi99OworICAgICAgICAgICAgICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbUxhdGVuY3lNc3swLjk5NSAvKiBhbHBoYSAqL307CisKKyAgICAgICAgICAgICAgICAvLyBTYXZlIHRoZSBsYXN0IGNvdW50IHdoZW4gd2UgZGVsaXZlcmVkIHN0YXRpc3RpY3MgdG8gbWVkaWFtZXRyaWNzLgorICAgICAgICAgICAgICAgIGludDY0X3QgICAgICAgICAgICAgICAgIG1MYXN0UmVjb3JkZWRUaW1lc3RhbXBWZXJpZmllck4gPSAwOworICAgICAgICAgICAgICAgIGludDY0X3QgICAgICAgICAgICAgICAgIG1MYXN0UmVjb3JkZWRUaW1lTnMgPSAwOyAgLy8gQk9PVFRJTUUgdG8gaW5jbHVkZSBzdXNwZW5kLgorCisgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbUlzTXNkRGV2aWNlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgLy8gQSBjb25kaXRpb24gdGhhdCBtdXN0IGJlIGV2YWx1YXRlZCBieSB0aGUgdGhyZWFkIGxvb3AgaGFzIGNoYW5nZWQgYW5kCiAgICAgICAgICAgICAgICAgLy8gd2UgbXVzdCBub3Qgd2FpdCBmb3IgYXN5bmMgd3JpdGUgY2FsbGJhY2sgaW4gdGhlIHRocmVhZCBsb29wIGJlZm9yZSBldmFsdWF0aW5nIGl0CiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVNpZ25hbFBlbmRpbmc7CiAKKyNpZmRlZiBURUVfU0lOSworICAgICAgICAgICAgICAgIE5CQUlPX1RlZSAgICAgICAgICAgICAgIG1UZWU7CisjZW5kaWYKICAgICAgICAgICAgICAgICAvLyBBY3RpdmVUcmFja3MgaXMgYSBzb3J0ZWQgdmVjdG9yIG9mIHRyYWNrIHR5cGUgVCByZXByZXNlbnRpbmcgdGhlCiAgICAgICAgICAgICAgICAgLy8gYWN0aXZlIHRyYWNrcyBvZiB0aHJlYWRMb29wKCkgdG8gYmUgY29uc2lkZXJlZCBieSB0aGUgbG9ja2VkIHByZXBhcmUgcG9ydGlvbi4KICAgICAgICAgICAgICAgICAvLyBBY3RpdmVUcmFja3Mgc2hvdWxkIGJlIGFjY2Vzc2VkIHdpdGggdGhlIFRocmVhZEJhc2UgbG9jayBoZWxkLgpAQCAtNTQzLDYgKzYxMyw5IEBACiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBzaXplKCkgY29uc3QgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVUcmFja3Muc2l6ZSgpOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICBpc0VtcHR5KCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVUcmFja3MuaXNFbXB0eSgpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBpbmRleE9mKGNvbnN0IHNwPFQ+JiBpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVRyYWNrcy5pbmRleE9mKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC01OTMsNiArNjY2LDEwIEBACiAgICAgICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgICAgIFNpbXBsZUxvZyBtTG9jYWxMb2c7CisKK3ByaXZhdGU6CisgICAgICAgICAgICAgICAgdm9pZCBkdW1wQmFzZV9sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisgICAgICAgICAgICAgICAgdm9pZCBkdW1wRWZmZWN0Q2hhaW5zX2woaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIH07CiAKIGNsYXNzIFZvbHVtZUludGVyZmFjZSB7CkBAIC02NDUsOCArNzIyLDYgQEAKICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgdHlwZV90IHR5cGUsIGJvb2wgc3lzdGVtUmVhZHkpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgflBsYXliYWNrVGhyZWFkKCk7CiAKLSAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0KICAgICAvLyBUaHJlYWQgdmlydHVhbHMKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICB0aHJlYWRMb29wKCk7CiAKQEAgLTY5Niw2ICs3NzEsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlVHJhY2tzLnVwZGF0ZVBvd2VyU3RhdGUodGhpcywgdHJ1ZSAvKiBmb3JjZSAqLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcEludGVybmFsc19sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcFRyYWNrc19sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7CisKIHB1YmxpYzoKIAogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIGluaXRDaGVjaygpIGNvbnN0IHsgcmV0dXJuIChtT3V0cHV0ID09IE5VTEwpID8gTk9fSU5JVCA6IE5PX0VSUk9SOyB9CkBAIC03MDcsMTEgKzc4NSwxNCBAQAogCiAgICAgICAgICAgICAgICAgLy8gVm9sdW1lSW50ZXJmYWNlCiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgc2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZhbHVlKTsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpOwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHNldE1hc3Rlck11dGUoYm9vbCBtdXRlZCk7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgc2V0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBmbG9hdCB2YWx1ZSk7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgc2V0U3RyZWFtTXV0ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCBtdXRlZCk7CiAgICAgdmlydHVhbCAgICAgZmxvYXQgICAgICAgc3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdDsKIAorICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHNldFZvbHVtZUZvck91dHB1dF9sKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSBjb25zdDsKKwogICAgICAgICAgICAgICAgIHNwPFRyYWNrPiAgIGNyZWF0ZVRyYWNrX2woCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6Q2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCkBAIC03MjYsNiArODA3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBjcmVhdG9yUGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyAvKm5vbi1OVUxMKi8sCkBAIC03NDksNyArODMxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZtU3VzcGVuZGVkKSA+IDA7IH0KIAogICAgIHZpcnR1YWwgICAgIFN0cmluZzggICAgIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cyk7Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgaW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkID0gMCk7CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgaW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqaGFsRnJhbWVzLCB1aW50MzJfdCAqZHNwRnJhbWVzKTsKICAgICAgICAgICAgICAgICAvLyBDb25zaWRlciBhbHNvIHJlbW92aW5nIGFuZCBwYXNzaW5nIGFuIGV4cGxpY2l0IG1NYWluQnVmZmVyIGluaXRpYWxpemF0aW9uCiAgICAgICAgICAgICAgICAgLy8gcGFyYW1ldGVyIHRvIEFGOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OlRyYWNrKCkuCkBAIC03NjQsNyArODQ3LDkgQEAKIAogICAgICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxFZmZlY3RDaGFpbj4mIGNoYWluKTsKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHNpemVfdCByZW1vdmVFZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEVmZmVjdENoYWluPiYgY2hhaW4pOwotICAgICAgICAgICAgICAgIHZpcnR1YWwgdWludDMyX3QgaGFzQXVkaW9TZXNzaW9uX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgY29uc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBoYXNBdWRpb1Nlc3Npb25fbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRocmVhZEJhc2U6Omhhc0F1ZGlvU2Vzc2lvbl9sKHNlc3Npb25JZCwgbVRyYWNrcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclNlc3Npb25fbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKTsKIAogCkBAIC03ODIsNyArODY3LDcgQEAKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBhZGRQYXRjaFRyYWNrKGNvbnN0IHNwPFBhdGNoVHJhY2s+JiB0cmFjayk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZGVsZXRlUGF0Y2hUcmFjayhjb25zdCBzcDxQYXRjaFRyYWNrPiYgdHJhY2spOwogCi0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZ2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CiAKICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGFzeW5jaHJvbm91cyBzaWduYWwgd2FpdCB0aW1lLgogICAgIHZpcnR1YWwgICAgIGludDY0X3QgICAgIGNvbXB1dGVXYWl0VGltZU5zX2woKSBjb25zdCB7IHJldHVybiBJTlQ2NF9NQVg7IH0KQEAgLTc5OSw2ICs4ODQsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1UcmFja3Muc2l6ZSgpIDwgUGxheWJhY2tUaHJlYWQ6OmtNYXhUcmFja3M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgaXNUaW1lc3RhbXBDb3JyZWN0aW9uRW5hYmxlZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dERldmljZSAmIG1UaW1lc3RhbXBDb3JyZWN0ZWREZXZpY2VzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYXVkaW9faXNfb3V0cHV0X2RldmljZXMoZGV2aWNlKSAmJiBwb3Bjb3VudChkZXZpY2UpID4gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiBwcm90ZWN0ZWQ6CiAgICAgLy8gdXBkYXRlZCBieSByZWFkT3V0cHV0UGFyYW1ldGVyc19sKCkKICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50OyAgLy8gbm9ybWFsIG1peGVyIGFuZCBlZmZlY3RzCkBAIC04NzgsNiArOTY4LDExIEBACiAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNXcml0dGVuOwogICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1dyaXR0ZW47IC8vIG5vdCByZXNldCBvbiBzdGFuZGJ5CiAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICBtU3VzcGVuZGVkRnJhbWVzOyAvLyBub3QgcmVzZXQgb24gc3RhbmRieQorCisgICAgLy8gbUhhcHRpY0NoYW5uZWxNYXNrIGFuZCBtSGFwdGljQ2hhbm5lbENvdW50IHdpbGwgb25seSBiZSB2YWxpZCB3aGVuIHRoZSB0aHJlYWQgc3VwcG9ydAorICAgIC8vIGhhcHRpYyBwbGF5YmFjay4KKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCAgICAgICAgICAgIG1IYXB0aWNDaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgIG1IYXB0aWNDaGFubmVsQ291bnQgPSAwOwogcHJpdmF0ZToKICAgICAvLyBtTWFzdGVyTXV0ZSBpcyBpbiBib3RoIFBsYXliYWNrVGhyZWFkIGFuZCBpbiBBdWRpb0ZsaW5nZXIuICBXaGVuIGEKICAgICAvLyBQbGF5YmFja1RocmVhZCBuZWVkcyB0byBmaW5kIG91dCBpZiBtYXN0ZXItbXV0ZWQsIGl0IGNoZWNrcyBpdCdzIGxvY2FsCkBAIC05MzAsMTkgKzEwMjUsMTkgQEAKICAgICB2b2lkICAgICAgICB1cGRhdGVNZXRhZGF0YV9sKCkgZmluYWw7CiAgICAgdmlydHVhbCB2b2lkIHNlbmRNZXRhZGF0YVRvQmFja2VuZF9sKGNvbnN0IFN0cmVhbU91dEhhbEludGVyZmFjZTo6U291cmNlTWV0YWRhdGEmIG1ldGFkYXRhKTsKIAotICAgIHZpcnR1YWwgdm9pZCBkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0gICAgdm9pZCAgICAgICAgZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotCi0gICAgLy8gVGhlIFRyYWNrcyBjbGFzcyBtYW5hZ2VzIG5hbWVzIGZvciBhbGwgdHJhY2tzCi0gICAgLy8gYWRkZWQgYW5kIHJlbW92ZWQgZnJvbSB0aGUgVGhyZWFkLgorICAgIC8vIFRoZSBUcmFja3MgY2xhc3MgbWFuYWdlcyB0cmFja3MgYWRkZWQgYW5kIHJlbW92ZWQgZnJvbSB0aGUgVGhyZWFkLgogICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogICAgIGNsYXNzIFRyYWNrcyB7CiAgICAgcHVibGljOgotICAgICAgICBUcmFja3MoYm9vbCBzYXZlRGVsZXRlZFRyYWNrTmFtZXMpIDoKLSAgICAgICAgICAgIG1TYXZlRGVsZXRlZFRyYWNrTmFtZXMoc2F2ZURlbGV0ZWRUcmFja05hbWVzKSB7IH0KKyAgICAgICAgVHJhY2tzKGJvb2wgc2F2ZURlbGV0ZWRUcmFja0lkcykgOgorICAgICAgICAgICAgbVNhdmVEZWxldGVkVHJhY2tJZHMoc2F2ZURlbGV0ZWRUcmFja0lkcykgeyB9CiAKICAgICAgICAgLy8gU29ydGVkVmVjdG9yIG1ldGhvZHMKLSAgICAgICAgc3NpemVfdCAgICAgICAgIGFkZChjb25zdCBzcDxUPiAmdHJhY2spOworICAgICAgICBzc2l6ZV90ICAgICAgICAgYWRkKGNvbnN0IHNwPFQ+ICZ0cmFjaykgeworICAgICAgICAgICAgY29uc3Qgc3NpemVfdCBpbmRleCA9IG1UcmFja3MuYWRkKHRyYWNrKTsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaW5kZXggPCAwLCAiY2Fubm90IGFkZCB0cmFjayIpOworICAgICAgICAgICAgcmV0dXJuIGluZGV4OworICAgICAgICB9CiAgICAgICAgIHNzaXplX3QgICAgICAgICByZW1vdmUoY29uc3Qgc3A8VD4gJnRyYWNrKTsKICAgICAgICAgc2l6ZV90ICAgICAgICAgIHNpemUoKSBjb25zdCB7CiAgICAgICAgICAgICByZXR1cm4gbVRyYWNrcy5zaXplKCk7CkBAIC05NjMsMjggKzEwNTgsMTkgQEAKICAgICAgICAgICAgIHJldHVybiBtVHJhY2tzLmVuZCgpOwogICAgICAgICB9CiAKLSAgICAgICAgc2l6ZV90ICAgICAgICAgIHByb2Nlc3NEZWxldGVkVHJhY2tOYW1lcyhzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50KT4gZikgewotICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHNpemUgPSBtRGVsZXRlZFRyYWNrTmFtZXMuc2l6ZSgpOwotICAgICAgICAgICAgaWYgKHNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChjb25zdCBpbnQgbmFtZSA6IG1EZWxldGVkVHJhY2tOYW1lcykgewotICAgICAgICAgICAgICAgICAgICBmKG5hbWUpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgc2l6ZV90ICAgICAgICAgIHByb2Nlc3NEZWxldGVkVHJhY2tJZHMoc3RkOjpmdW5jdGlvbjx2b2lkKGludCk+IGYpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgaW50IHRyYWNrSWQgOiBtRGVsZXRlZFRyYWNrSWRzKSB7CisgICAgICAgICAgICAgICAgZih0cmFja0lkKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBzaXplOworICAgICAgICAgICAgcmV0dXJuIG1EZWxldGVkVHJhY2tJZHMuc2l6ZSgpOwogICAgICAgICB9CiAKLSAgICAgICAgdm9pZCAgICAgICAgICAgIGNsZWFyRGVsZXRlZFRyYWNrTmFtZXMoKSB7IG1EZWxldGVkVHJhY2tOYW1lcy5jbGVhcigpOyB9CisgICAgICAgIHZvaWQgICAgICAgICAgICBjbGVhckRlbGV0ZWRUcmFja0lkcygpIHsgbURlbGV0ZWRUcmFja0lkcy5jbGVhcigpOyB9CiAKICAgICBwcml2YXRlOgotICAgICAgICAvLyBUcmFjayBuYW1lcyBwZW5kaW5nIGRlbGV0aW9uIGZvciBNSVhFUiB0eXBlIHRocmVhZHMKLSAgICAgICAgY29uc3QgYm9vbCBtU2F2ZURlbGV0ZWRUcmFja05hbWVzOyAvLyB0cnVlIHRvIGVuYWJsZSB0cmFja2luZwotICAgICAgICBzdGQ6OnNldDxpbnQ+IG1EZWxldGVkVHJhY2tOYW1lczsKLQotICAgICAgICAvLyBGYXN0IGxvb2t1cCBvZiBwcmV2aW91c2x5IGRlbGV0ZWQgdHJhY2sgbmFtZXMgZm9yIHJldXNlLgotICAgICAgICAvLyBUaGlzIGlzIGFuIGFyYml0cmFyeSBkZWNpc2lvbiAoYWN0dWFsbHkgYW55IG5vbi1uZWdhdGl2ZQotICAgICAgICAvLyBpbnRlZ2VyIHRoYXQgaXNuJ3QgaW4gbVRyYWNrc1sqXS0+bmFtZXMoKSBjb3VsZCBiZSB1c2VkKSAtIHdlIGF0dGVtcHQKLSAgICAgICAgLy8gdG8gdXNlIHRoZSBzbWFsbGVzdCBwb3NzaWJsZSBhdmFpbGFibGUgbmFtZS4KLSAgICAgICAgc3RkOjpzZXQ8aW50PiBtVW51c2VkVHJhY2tOYW1lczsKKyAgICAgICAgLy8gVHJhY2tzIHBlbmRpbmcgZGVsZXRpb24gZm9yIE1JWEVSIHR5cGUgdGhyZWFkcworICAgICAgICBjb25zdCBib29sIG1TYXZlRGVsZXRlZFRyYWNrSWRzOyAvLyB0cnVlIHRvIGVuYWJsZSB0cmFja2luZworICAgICAgICBzdGQ6OnNldDxpbnQ+IG1EZWxldGVkVHJhY2tJZHM7CiAKICAgICAgICAgU29ydGVkVmVjdG9yPHNwPFQ+PiBtVHJhY2tzOyAvLyB3cmFwcGVkIFNvcnRlZFZlY3Rvci4KICAgICB9OwpAQCAtOTk1LDcgKzEwODEsOCBAQAogICAgIEF1ZGlvU3RyZWFtT3V0ICAgICAgICAgICAgICAgICAgKm1PdXRwdXQ7CiAKICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXN0ZXJWb2x1bWU7Ci0gICAgbnNlY3NfdCAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFdyaXRlVGltZTsKKyAgICBzdGQ6OmF0b21pYzxmbG9hdD4gICAgICAgICAgICAgIG1NYXN0ZXJCYWxhbmNle307CisgICAgYXVkaW9fdXRpbHM6OkJhbGFuY2UgICAgICAgICAgICBtQmFsYW5jZTsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1Xcml0ZXM7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtRGVsYXllZFdyaXRlczsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbldyaXRlOwpAQCAtMTA1NCwxNiArMTE0MSwxMyBAQAogICAgIHNwPE5CQUlPX1Npbms+ICAgICAgICAgIG1QaXBlU2luazsKICAgICAvLyBUaGUgY3VycmVudCBzaW5rIGZvciB0aGUgbm9ybWFsIG1peGVyIHRvIHdyaXRlIGl0J3MgKHN1YiltaXgsIG1PdXRwdXRTaW5rIG9yIG1QaXBlU2luawogICAgIHNwPE5CQUlPX1Npbms+ICAgICAgICAgIG1Ob3JtYWxTaW5rOwotI2lmZGVmIFRFRV9TSU5LCi0gICAgLy8gRm9yIGR1bXBzeXMKLSAgICBzcDxOQkFJT19TaW5rPiAgICAgICAgICBtVGVlU2luazsKLSAgICBzcDxOQkFJT19Tb3VyY2U+ICAgICAgICBtVGVlU291cmNlOwotI2VuZGlmCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVNjcmVlblN0YXRlOyAgIC8vIGNhY2hlZCBjb3B5IG9mIGdTY3JlZW5TdGF0ZQogICAgIC8vIFRPRE86IGFkZCBjb21tZW50IGFuZCBhZGp1c3Qgc2l6ZSBhcyBuZWVkZWQKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90ICAgICBrRmFzdE1peGVyTG9nU2l6ZSA9IDggKiAxMDI0OwogICAgIHNwPE5CTG9nOjpXcml0ZXI+ICAgICAgIG1GYXN0TWl4ZXJOQkxvZ1dyaXRlcjsKIAorICAgIC8vIERvd25zdHJlYW0gcGF0Y2ggbGF0ZW5jeSwgYXZhaWxhYmxlIGlmIG1Eb3duc3RyZWFtTGF0ZW5jeVN0YXRNcy5nZXROKCkgPiAwLgorICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbURvd25zdHJlYW1MYXRlbmN5U3RhdE1zezAuOTk5fTsKIAogcHVibGljOgogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGhhc0Zhc3RNaXhlcigpIGNvbnN0ID0gMDsKQEAgLTEwOTUsNyArMTE3OSw2IEBACiAKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBjaGVja0Zvck5ld1BhcmFtZXRlcl9sKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190JiBzdGF0dXMpOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGlzVHJhY2tBbGxvd2VkX2woCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LApAQCAtMTExNCwxMiArMTE5NywxMyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcEludGVybmFsc19sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7CisKICAgICAvLyB0aHJlYWRMb29wIHNuaXBwZXRzCiAgICAgdmlydHVhbCAgICAgc3NpemVfdCAgICAgdGhyZWFkTG9vcF93cml0ZSgpOwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRocmVhZExvb3Bfc3RhbmRieSgpOwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRocmVhZExvb3BfbWl4KCk7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgdGhyZWFkTG9vcF9zbGVlcFRpbWUoKTsKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0aHJlYWRMb29wX3JlbW92ZVRyYWNrcyhjb25zdCBWZWN0b3I8IHNwPFRyYWNrPiA+JiB0cmFja3NUb1JlbW92ZSk7CiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgY29ycmVjdExhdGVuY3lfbCh1aW50MzJfdCBsYXRlbmN5KSBjb25zdDsKIAogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIGNyZWF0ZUF1ZGlvUGF0Y2hfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLApAQCAtMTE1Miw2ICsxMjM2LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUZhc3RNaXhlckR1bXBTdGF0ZS5tVHJhY2tzW2Zhc3RJbmRleF0ubVVuZGVycnVuczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICB0aHJlYWRsb29wX2dldEhhbFRpbWVzdGFtcF9sKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgKnRpbWVzdGFtcCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobU5vcm1hbFNpbmsuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1Ob3JtYWxTaW5rLT5nZXRUaW1lc3RhbXAoKnRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgc2V0TWFzdGVyTW9ub19sKGJvb2wgbW9ubykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXN0ZXJNb25vLnN0b3JlKG1vbm8pOwpAQCAtMTE2MywyNyArMTI1NSw0MyBAQAogICAgICAgICAgICAgICAgIC8vIEJsZW5kaW5nIHdpdGggbGltaXRlciBpcyBub3QgaWRlbXBvdGVudCwKICAgICAgICAgICAgICAgICAvLyBhbmQgYmxlbmRpbmcgd2l0aG91dCBsaW1pdGVyIGlzIGlkZW1wb3RlbnQgYnV0IGluZWZmaWNpZW50IHRvIGRvIHR3aWNlLgogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgcmVxdWlyZU1vbm9CbGVuZCgpIHsgcmV0dXJuIG1NYXN0ZXJNb25vLmxvYWQoKSAmJiAhaGFzRmFzdE1peGVyKCk7IH0KKworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgc2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hc3RlckJhbGFuY2Uuc3RvcmUoYmFsYW5jZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0Zhc3RNaXhlcigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GYXN0TWl4ZXItPnNldE1hc3RlckJhbGFuY2UoYmFsYW5jZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogfTsKIAogY2xhc3MgRGlyZWN0T3V0cHV0VGhyZWFkIDogcHVibGljIFBsYXliYWNrVGhyZWFkIHsKIHB1YmxpYzoKIAogICAgIERpcmVjdE91dHB1dFRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBib29sIHN5c3RlbVJlYWR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGJvb2wgc3lzdGVtUmVhZHkpCisgICAgICAgIDogRGlyZWN0T3V0cHV0VGhyZWFkKGF1ZGlvRmxpbmdlciwgb3V0cHV0LCBpZCwgZGV2aWNlLCBESVJFQ1QsIHN5c3RlbVJlYWR5KSB7IH0KKwogICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5EaXJlY3RPdXRwdXRUaHJlYWQoKTsKIAorICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpOworCiAgICAgLy8gVGhyZWFkIHZpcnR1YWxzCiAKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBjaGVja0Zvck5ld1BhcmFtZXRlcl9sKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190JiBzdGF0dXMpOworCiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZmx1c2hId19sKCk7CiAKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpIG92ZXJyaWRlOworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgYWN0aXZlU2xlZXBUaW1lVXMoKSBjb25zdDsKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBpZGxlU2xlZXBUaW1lVXMoKSBjb25zdDsKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBzdXNwZW5kU2xlZXBUaW1lVXMoKSBjb25zdDsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBjYWNoZVBhcmFtZXRlcnNfbCgpOwogCisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcEludGVybmFsc19sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7CisKICAgICAvLyB0aHJlYWRMb29wIHNuaXBwZXRzCiAgICAgdmlydHVhbCAgICAgbWl4ZXJfc3RhdGUgcHJlcGFyZVRyYWNrc19sKFZlY3Rvcjwgc3A8VHJhY2s+ID4gKnRyYWNrc1RvUmVtb3ZlKTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0aHJlYWRMb29wX21peCgpOwpAQCAtMTE5MywxMCArMTMwMSwxMCBAQAogCiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgb25BZGROZXdUcmFja19sKCk7CiAKLSAgICBib29sIG1Wb2x1bWVTaGFwZXJBY3RpdmU7CisgICAgYm9vbCBtVm9sdW1lU2hhcGVyQWN0aXZlID0gZmFsc2U7CiAKICAgICBEaXJlY3RPdXRwdXRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLCBBdWRpb1N0cmVhbU91dCogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsIHVpbnQzMl90IGRldmljZSwgVGhyZWFkQmFzZTo6dHlwZV90IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgVGhyZWFkQmFzZTo6dHlwZV90IHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN5c3RlbVJlYWR5KTsKICAgICB2b2lkIHByb2Nlc3NWb2x1bWVfbChUcmFjayAqdHJhY2ssIGJvb2wgbGFzdFRyYWNrKTsKIApAQCAtMTIwNSwxMCArMTMxMywzMSBAQAogCiAgICAgd3A8VHJhY2s+ICAgICAgICAgICAgICAgbVByZXZpb3VzVHJhY2s7ICAgICAgICAgLy8gdXNlZCB0byBkZXRlY3QgdHJhY2sgc3dpdGNoCiAKKyAgICAvLyBUaGlzIG11c3QgYmUgaW5pdGlhbGl6ZWQgZm9yIGluaXRpYWwgY29uZGl0aW9uIG9mIG1NYXN0ZXJCYWxhbmNlID0gMCAoZGlzYWJsZWQpLgorICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1NYXN0ZXJCYWxhbmNlTGVmdCA9IDEuZjsKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtTWFzdGVyQmFsYW5jZVJpZ2h0ID0gMS5mOworCiBwdWJsaWM6CiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaGFzRmFzdE1peGVyKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KIAogICAgIHZpcnR1YWwgICAgIGludDY0X3QgICAgIGNvbXB1dGVXYWl0VGltZU5zX2woKSBjb25zdCBvdmVycmlkZTsKKworICAgIHN0YXR1c190ICAgIHRocmVhZGxvb3BfZ2V0SGFsVGltZXN0YW1wX2woRXh0ZW5kZWRUaW1lc3RhbXAgKnRpbWVzdGFtcCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICAvLyBGb3IgRElSRUNUIGFuZCBPRkZMT0FEIHRocmVhZHMsIHF1ZXJ5IHRoZSBvdXRwdXQgc2luayBkaXJlY3RseS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1PdXRwdXQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdXBvc2l0aW9uNjQ7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgdGltZXNwZWMgdGltZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtT3V0cHV0LT5nZXRQcmVzZW50YXRpb25Qb3NpdGlvbigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVwb3NpdGlvbjY0LCAmdGltZSkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAoaW50NjRfdCl1cG9zaXRpb242NDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gYXVkaW9fdXRpbHNfbnNfZnJvbV90aW1lc3BlYygmdGltZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICB9CiB9OwogCiBjbGFzcyBPZmZsb2FkVGhyZWFkIDogcHVibGljIERpcmVjdE91dHB1dFRocmVhZCB7CkBAIC0xMjgyLDggKzE0MTEsNiBAQAogICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5EdXBsaWNhdGluZ1RocmVhZCgpOwogCiAgICAgLy8gVGhyZWFkIHZpcnR1YWxzCi0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOwotCiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgYWRkT3V0cHV0VHJhY2soTWl4ZXJUaHJlYWQqIHRocmVhZCk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcmVtb3ZlT3V0cHV0VHJhY2soTWl4ZXJUaHJlYWQqIHRocmVhZCk7CiAgICAgICAgICAgICAgICAgdWludDMyX3QgICAgd2FpdFRpbWVNcygpIGNvbnN0IHsgcmV0dXJuIG1XYWl0VGltZU1zOyB9CkBAIC0xMjkyLDYgKzE0MTksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyZWFtT3V0SGFsSW50ZXJmYWNlOjpTb3VyY2VNZXRhZGF0YSYgbWV0YWRhdGEpIG92ZXJyaWRlOwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGFjdGl2ZVNsZWVwVGltZVVzKCkgY29uc3Q7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcEludGVybmFsc19sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7CiAKIHByaXZhdGU6CiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgb3V0cHV0c1JlYWR5KGNvbnN0IFNvcnRlZFZlY3Rvcjwgc3A8T3V0cHV0VHJhY2s+ID4gJm91dHB1dFRyYWNrcyk7CkBAIC0xMzE2LDYgKzE0NDQsMjIgQEAKICAgICBTb3J0ZWRWZWN0b3IgPCBzcDxPdXRwdXRUcmFjaz4gPiAgbU91dHB1dFRyYWNrczsKIHB1YmxpYzoKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBoYXNGYXN0TWl4ZXIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHRocmVhZGxvb3BfZ2V0SGFsVGltZXN0YW1wX2woCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbmRlZFRpbWVzdGFtcCAqdGltZXN0YW1wKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIGlmIChtT3V0cHV0VHJhY2tzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIC8vIGZvcndhcmQgdGhlIGZpcnN0IE91dHB1dFRyYWNrJ3Mga2VybmVsIGluZm9ybWF0aW9uIGZvciB0aW1lc3RhbXAuCisgICAgICAgICAgICBjb25zdCBFeHRlbmRlZFRpbWVzdGFtcCB0cmFja1RpbWVzdGFtcCA9CisgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRUcmFja3NbMF0tPmdldENsaWVudFByb3h5VGltZXN0YW1wKCk7CisgICAgICAgICAgICBpZiAodHJhY2tUaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA+IDApIHsKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tUaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXTsKKyAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja1RpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOyAgLy8gZGlzY2FyZCBzZXJ2ZXIgdGltZXN0YW1wIC0gdGhhdCdzIGlnbm9yZWQuCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KIH07CiAKIC8vIHJlY29yZCB0aHJlYWQKQEAgLTEzNzQsOSArMTUxOCw2IEBACiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgYm9vbCBzeXN0ZW1SZWFkeQotI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgICAgICAgICAgICAgICwgY29uc3Qgc3A8TkJBSU9fU2luaz4mIHRlZVNpbmsKLSNlbmRpZgogICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgdmlydHVhbCAgICAgflJlY29yZFRocmVhZCgpOwogCkBAIC0xMzg0LDkgKzE1MjUsNiBAQAogICAgIHZvaWQgICAgICAgIGRlc3Ryb3lUcmFja19sKGNvbnN0IHNwPFJlY29yZFRyYWNrPiYgdHJhY2spOwogICAgIHZvaWQgICAgICAgIHJlbW92ZVRyYWNrX2woY29uc3Qgc3A8UmVjb3JkVHJhY2s+JiB0cmFjayk7CiAKLSAgICB2b2lkICAgICAgICBkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0gICAgdm9pZCAgICAgICAgZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotCiAgICAgLy8gVGhyZWFkIHZpcnR1YWxzCiAgICAgdmlydHVhbCBib29sICAgICAgICB0aHJlYWRMb29wKCk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICBwcmVFeGl0KCk7CkBAIC0xNDA5LDYgKzE1NDcsNyBAQAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBGcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnBOb3RpZmljYXRpb25GcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICBwaWRfdCBjcmVhdG9yUGlkLAogICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQsCkBAIC0xNDIzLDcgKzE1NjIsNiBAQAogICAgICAgICAgICAgLy8gcmV0dXJuIHRydWUgaWYgdGhlIGNhbGxlciBzaG91bGQgdGhlbiBkbyBpdCdzIHBhcnQgb2YgdGhlIHN0b3BwaW5nIHByb2Nlc3MKICAgICAgICAgICAgIGJvb2wgICAgICAgIHN0b3AoUmVjb3JkVHJhY2sqIHJlY29yZFRyYWNrKTsKIAotICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogICAgICAgICAgICAgQXVkaW9TdHJlYW1JbiogY2xlYXJJbnB1dCgpOwogICAgICAgICAgICAgdmlydHVhbCBzcDxTdHJlYW1IYWxJbnRlcmZhY2U+IHN0cmVhbSgpIGNvbnN0OwogCkBAIC0xNDMyLDIwICsxNTcwLDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190JiBzdGF0dXMpOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgY2FjaGVQYXJhbWV0ZXJzX2woKSB7fQogICAgIHZpcnR1YWwgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCA9IDApOworICAgIHZpcnR1YWwgdm9pZCAgICAgICAgaW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgY3JlYXRlQXVkaW9QYXRjaF9sKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICByZWxlYXNlQXVkaW9QYXRjaF9sKGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CiAKLSAgICAgICAgICAgIHZvaWQgICAgICAgIGFkZFBhdGNoUmVjb3JkKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgIGRlbGV0ZVBhdGNoUmVjb3JkKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGFkZFBhdGNoVHJhY2soY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpOworICAgICAgICAgICAgdm9pZCAgICAgICAgZGVsZXRlUGF0Y2hUcmFjayhjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCk7CiAKICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpOwogICAgIHZpcnR1YWwgdWludDMyX3QgICAgZ2V0SW5wdXRGcmFtZXNMb3N0KCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbik7CiAgICAgdmlydHVhbCBzaXplX3QgcmVtb3ZlRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxFZmZlY3RDaGFpbj4mIGNoYWluKTsKLSAgICB2aXJ0dWFsIHVpbnQzMl90IGhhc0F1ZGlvU2Vzc2lvbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpIGNvbnN0OworICAgICAgICAgICAgdWludDMyX3QgaGFzQXVkaW9TZXNzaW9uX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUaHJlYWRCYXNlOjpoYXNBdWRpb1Nlc3Npb25fbChzZXNzaW9uSWQsIG1UcmFja3MpOworICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIHNldCBvZiB1bmlxdWUgc2Vzc2lvbiBJRHMgYWNyb3NzIGFsbCB0cmFja3MuCiAgICAgICAgICAgICAvLyBUaGUga2V5cyBhcmUgdGhlIHNlc3Npb24gSURzLCBhbmQgdGhlIGFzc29jaWF0ZWQgdmFsdWVzIGFyZSBtZWFuaW5nbGVzcy4KQEAgLTE0NTksNyArMTYwMCw3IEBACiAKICAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGZyYW1lQ291bnQoKSBjb25zdCB7IHJldHVybiBtRnJhbWVDb3VudDsgfQogICAgICAgICAgICAgYm9vbCAgICAgICAgaGFzRmFzdENhcHR1cmUoKSBjb25zdCB7IHJldHVybiBtRmFzdENhcHR1cmUgIT0gMDsgfQotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgZ2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgY2hlY2tFZmZlY3RDb21wYXRpYmlsaXR5X2woY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpOwpAQCAtMTQ3Nyw4ICsxNjE4LDIzIEBACiAKICAgICAgICAgICAgIHN0YXR1c190ICAgIGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKTsKIAorICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbik7CisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSk7CisKICAgICAgICAgICAgIHZvaWQgICAgICAgIHVwZGF0ZU1ldGFkYXRhX2woKSBvdmVycmlkZTsKIAorICAgICAgICAgICAgYm9vbCAgICAgICAgZmFzdFRyYWNrQXZhaWxhYmxlKCkgY29uc3QgeyByZXR1cm4gbUZhc3RUcmFja0F2YWlsOyB9CisKKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2tzIHBvcGNvdW50IGZvciBleGFjdGx5IG9uZSBkZXZpY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF1ZGlvX2lzX2lucHV0X2RldmljZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbkRldmljZSAmIG1UaW1lc3RhbXBDb3JyZWN0ZWREZXZpY2VzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworcHJvdGVjdGVkOgorICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcEludGVybmFsc19sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7CisgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wVHJhY2tzX2woaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBvdmVycmlkZTsKKwogcHJpdmF0ZToKICAgICAgICAgICAgIC8vIEVudGVyIHN0YW5kYnkgaWYgbm90IGFscmVhZHkgaW4gc3RhbmRieSwgYW5kIHNldCBtU3RhbmRieSBmbGFnCiAgICAgICAgICAgICB2b2lkICAgIHN0YW5kYnlJZk5vdEFscmVhZHlJblN0YW5kYnkoKTsKQEAgLTE1MDYsOCArMTY2Miw2IEBACiAgICAgICAgICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUnNtcEluUmVhcjsgICAgLy8gbGFzdCBmaWxsZWQgZnJhbWUgKyAxCiAKICAgICAgICAgICAgIC8vIEZvciBkdW1wc3lzCi0gICAgICAgICAgICBjb25zdCBzcDxOQkFJT19TaW5rPiAgICAgICAgICAgICAgICBtVGVlU2luazsKLQogICAgICAgICAgICAgY29uc3Qgc3A8TWVtb3J5RGVhbGVyPiAgICAgICAgICAgICAgbVJlYWRPbmx5SGVhcDsKIAogICAgICAgICAgICAgLy8gb25lLXRpbWUgaW5pdGlhbGl6YXRpb24sIG5vIGxvY2tzIHJlcXVpcmVkCkBAIC0xNTUwLDYgKzE3MDQsOCBAQAogICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZhc3RUcmFja0F2YWlsOyAgICAvLyB0cnVlIGlmIGZhc3QgdHJhY2sgYXZhaWxhYmxlCiAgICAgICAgICAgICAvLyBjb21tb24gc3RhdGUgdG8gYWxsIHJlY29yZCB0aHJlYWRzCiAgICAgICAgICAgICBzdGQ6OmF0b21pY19ib29sICAgICAgICAgICAgICAgICAgICBtQnROcmVjU3VzcGVuZGVkOworCisgICAgICAgICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzUmVhZCA9IDA7ICAgIC8vIGNvbnRpbnVvdXMgcnVubmluZyBjb3VudGVyLgogfTsKIAogY2xhc3MgTW1hcFRocmVhZCA6IHB1YmxpYyBUaHJlYWRCYXNlCkBAIC0xNTk2LDEzICsxNzUyLDE0IEBACiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgY2hlY2tGb3JOZXdQYXJhbWV0ZXJfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QmIHN0YXR1cyk7CiAgICAgdmlydHVhbCAgICAgU3RyaW5nOCAgICAgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKTsKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQgPSAwKTsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUpOwogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlYWRIYWxQYXJhbWV0ZXJzX2woKTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBjYWNoZVBhcmFtZXRlcnNfbCgpIHt9CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgY3JlYXRlQXVkaW9QYXRjaF9sKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHJlbGVhc2VBdWRpb1BhdGNoX2woY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKIAogICAgIHZpcnR1YWwgICAgIHNwPFN0cmVhbUhhbEludGVyZmFjZT4gc3RyZWFtKCkgY29uc3QgeyByZXR1cm4gbUhhbFN0cmVhbTsgfQogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIGFkZEVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbik7CkBAIC0xNjEwLDcgKzE3NjcsMTAgQEAKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBjaGVja0VmZmVjdENvbXBhdGliaWxpdHlfbChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCk7CiAKLSAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBoYXNBdWRpb1Nlc3Npb25fbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKSBjb25zdDsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCAgICBoYXNBdWRpb1Nlc3Npb25fbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IHVzaW5nIG1BY3RpdmVUcmFja3MgYXMgbm8gbVRyYWNrcyBoZXJlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGhyZWFkQmFzZTo6aGFzQXVkaW9TZXNzaW9uX2woc2Vzc2lvbklkLCBtQWN0aXZlVHJhY2tzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgc2V0U3luY0V2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KTsKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBpc1ZhbGlkU3luY0V2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KSBjb25zdDsKIApAQCAtMTYyNSwxNSArMTc4NSwxMiBAQAogICAgICAgICAgICAgICAgIC8vIFNldHMgdGhlIFVJRCByZWNvcmRzIHNpbGVuY2UKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQgX191bnVzZWQsIGJvb2wgc2lsZW5jZWQgX191bnVzZWQpIHt9CiAKLSAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKLQogIHByb3RlY3RlZDoKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wSW50ZXJuYWxzX2woaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBvdmVycmlkZTsKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wVHJhY2tzX2woaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBvdmVycmlkZTsKIAogICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAgICAgIG1BdHRyOwogICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCAgICAgICAgIG1TZXNzaW9uSWQ7Ci0gICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbURldmljZUlkOwogICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1Qb3J0SWQ7CiAKICAgICAgICAgICAgICAgICB3cDxNbWFwU3RyZWFtQ2FsbGJhY2s+ICBtQ2FsbGJhY2s7CkBAIC0xNjgwLDEzICsxODM3LDE0IEBACiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgY2hlY2tTaWxlbnRNb2RlX2woKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBwcm9jZXNzVm9sdW1lX2woKSBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKLQogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGlzT3V0cHV0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQogCiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgdXBkYXRlTWV0YWRhdGFfbCgpIG92ZXJyaWRlOwogCisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworCiBwcm90ZWN0ZWQ6CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcEludGVybmFsc19sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7CiAKICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICAgICAgICAgbVN0cmVhbVR5cGU7CiAgICAgICAgICAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgIG1NYXN0ZXJWb2x1bWU7CkBAIC0xNzE0LDYgKzE4NzIsOCBAQAogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgIHByb2Nlc3NWb2x1bWVfbCgpIG92ZXJyaWRlOwogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgIHNldFJlY29yZFNpbGVuY2VkKHVpZF90IHVpZCwgYm9vbCBzaWxlbmNlZCkgb3ZlcnJpZGU7CiAKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICAgICB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisKIHByb3RlY3RlZDoKIAogICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtSW4qICBtSW5wdXQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmgKaW5kZXggY2NmYjY5Zi4uOGY3MjBiNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaApAQCAtMjUsMTMgKzI1LDEzIEBACiBwdWJsaWM6CiAgICAgZW51bSB0cmFja19zdGF0ZSB7CiAgICAgICAgIElETEUsCi0gICAgICAgIEZMVVNIRUQsCisgICAgICAgIEZMVVNIRUQsICAgICAgICAvLyBmb3IgUGxheWJhY2tUcmFja3Mgb25seQogICAgICAgICBTVE9QUEVELAogICAgICAgICAvLyBuZXh0IDIgc3RhdGVzIGFyZSBjdXJyZW50bHkgdXNlZCBmb3IgZmFzdCB0cmFja3MKICAgICAgICAgLy8gYW5kIG9mZmxvYWRlZCB0cmFja3Mgb25seQogICAgICAgICBTVE9QUElOR18xLCAgICAgLy8gd2FpdGluZyBmb3IgZmlyc3QgdW5kZXJydW4KICAgICAgICAgU1RPUFBJTkdfMiwgICAgIC8vIHdhaXRpbmcgZm9yIHByZXNlbnRhdGlvbiBjb21wbGV0ZQotICAgICAgICBSRVNVTUlORywKKyAgICAgICAgUkVTVU1JTkcsICAgICAgIC8vIGZvciBQbGF5YmFja1RyYWNrcyBvbmx5CiAgICAgICAgIEFDVElWRSwKICAgICAgICAgUEFVU0lORywKICAgICAgICAgUEFVU0VELApAQCAtNTQsMTEgKzU0LDYgQEAKICAgICAgICAgVFlQRV9QQVRDSCwKICAgICB9OwogCi0gICAgZW51bSB7Ci0gICAgICAgIFRSQUNLX05BTUVfUEVORElORyA9IC0xLAotICAgICAgICBUUkFDS19OQU1FX0ZBSUxVUkUgPSAtMiwKLSAgICB9OwotCiAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja0Jhc2UoVGhyZWFkQmFzZSAqdGhyZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgbUF0dHIsCkBAIC02OSw2ICs2NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IGNyZWF0b3JQaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc091dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NfdHlwZSBhbGxvYyA9IEFMTE9DX0NCTEssCkBAIC04NCw2ICs4MCw4IEBACiAgICAgICAgICAgICBhdWRpb190cmFja19jYmxrX3QqIGNibGsoKSBjb25zdCB7IHJldHVybiBtQ2JsazsgfQogICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCgpIGNvbnN0IHsgcmV0dXJuIG1TZXNzaW9uSWQ7IH0KICAgICAgICAgICAgIHVpZF90ICAgICAgIHVpZCgpIGNvbnN0IHsgcmV0dXJuIG1VaWQ7IH0KKyAgICAgICAgICAgIHBpZF90ICAgICAgIGNyZWF0b3JQaWQoKSBjb25zdCB7IHJldHVybiBtQ3JlYXRvclBpZDsgfQorCiAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCgpIGNvbnN0IHsgcmV0dXJuIG1Qb3J0SWQ7IH0KICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldFN5bmNFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCk7CiAKQEAgLTkxLDYgKzg5LDcgQEAKICAgICAgICAgICAgIHZvaWQqICAgICAgIGJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1CdWZmZXI7IH0KICAgICAgICAgICAgIHNpemVfdCAgICAgIGJ1ZmZlclNpemUoKSBjb25zdCB7IHJldHVybiBtQnVmZmVyU2l6ZTsgfQogICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNGYXN0VHJhY2soKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBib29sICAgICAgICBpc0RpcmVjdCgpIGNvbnN0ID0gMDsKICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzT3V0cHV0VHJhY2soKSBjb25zdCB7IHJldHVybiAobVR5cGUgPT0gVFlQRV9PVVRQVVQpOyB9CiAgICAgICAgICAgICBib29sICAgICAgICBpc1BhdGNoVHJhY2soKSBjb25zdCB7IHJldHVybiAobVR5cGUgPT0gVFlQRV9QQVRDSCk7IH0KICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzRXh0ZXJuYWxUcmFjaygpIGNvbnN0IHsgcmV0dXJuICFpc091dHB1dFRyYWNrKCkgJiYgIWlzUGF0Y2hUcmFjaygpOyB9CkBAIC05OCw4ICs5NywxMTEgQEAKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGludmFsaWRhdGUoKSB7IG1Jc0ludmFsaWQgPSB0cnVlOyB9CiAgICAgICAgICAgICBib29sICAgICAgICBpc0ludmFsaWQoKSBjb25zdCB7IHJldHVybiBtSXNJbnZhbGlkOyB9CiAKKyAgICAgICAgICAgIHZvaWQgICAgICAgIHRlcm1pbmF0ZSgpIHsgbVRlcm1pbmF0ZWQgPSB0cnVlOyB9CisgICAgICAgICAgICBib29sICAgICAgICBpc1Rlcm1pbmF0ZWQoKSBjb25zdCB7IHJldHVybiBtVGVybWluYXRlZDsgfQorCiAgICAgYXVkaW9fYXR0cmlidXRlc190ICBhdHRyaWJ1dGVzKCkgY29uc3QgeyByZXR1cm4gbUF0dHI7IH0KIAorI2lmZGVmIFRFRV9TSU5LCisgICAgICAgICAgIHZvaWQgICAgICAgICBkdW1wVGVlKGludCBmZCwgY29uc3Qgc3RkOjpzdHJpbmcgJnJlYXNvbikgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGVlLmR1bXAoZmQsIHJlYXNvbik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgLyoqIHJldHVybnMgdGhlIGJ1ZmZlciBjb250ZW50cyBzaXplIGNvbnZlcnRlZCB0byB0aW1lIGluIG1pbGxpc2Vjb25kcworICAgICAgICAgICAgICogZm9yIFBDTSBQbGF5YmFjayBvciBSZWNvcmQgc3RyZWFtaW5nIHRyYWNrcy4gVGhlIHJldHVybiB2YWx1ZSBpcyB6ZXJvIGZvcgorICAgICAgICAgICAgICogUENNIHN0YXRpYyB0cmFja3MgYW5kIG5vdCBkZWZpbmVkIGZvciBub24tUENNIHRyYWNrcy4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBUaGlzIG1heSBiZSBjYWxsZWQgd2l0aG91dCB0aGUgdGhyZWFkIGxvY2suCisgICAgICAgICAgICAgKi8KKyAgICB2aXJ0dWFsIGRvdWJsZSAgICAgIGJ1ZmZlckxhdGVuY3lNcygpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVNlcnZlclByb3h5LT5mcmFtZXNSZWFkeVNhZmUoKSAqIDEwMDAgLyBzYW1wbGVSYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qKiByZXR1cm5zIHdoZXRoZXIgdGhlIHRyYWNrIHN1cHBvcnRzIHNlcnZlciBsYXRlbmN5IGNvbXB1dGF0aW9uLgorICAgICAgICAgICAgICogVGhpcyBpcyBzZXQgaW4gdGhlIGNvbnN0cnVjdG9yIGFuZCBjb25zdGFudCB0aHJvdWdob3V0IHRoZSB0cmFjayBsaWZldGltZS4KKyAgICAgICAgICAgICAqLworCisgICAgICAgICAgICBib29sICAgICAgICBpc1NlcnZlckxhdGVuY3lTdXBwb3J0ZWQoKSBjb25zdCB7IHJldHVybiBtU2VydmVyTGF0ZW5jeVN1cHBvcnRlZDsgfQorCisgICAgICAgICAgICAvKiogY29tcHV0ZXMgdGhlIHNlcnZlciBsYXRlbmN5IGZvciBQQ00gUGxheWJhY2sgb3IgUmVjb3JkIHRyYWNrCisgICAgICAgICAgICAgKiB0byB0aGUgZGV2aWNlIHNpbmsvc291cmNlLiAgVGhpcyBpcyB0aGUgdGltZSBmb3IgdGhlIG5leHQgZnJhbWUgaW4gdGhlIHRyYWNrIGJ1ZmZlcgorICAgICAgICAgICAgICogd3JpdHRlbiBvciByZWFkIGZyb20gdGhlIHNlcnZlciB0aHJlYWQgdG8gdGhlIGRldmljZSBzb3VyY2Ugb3Igc2luay4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBUaGlzIG1heSBiZSBjYWxsZWQgd2l0aG91dCB0aGUgdGhyZWFkIGxvY2ssIGJ1dCBsYXRlbmN5TXMgYW5kIGZyb21UcmFjaworICAgICAgICAgICAgICogbWF5IGJlIG5vdCBiZSBzeW5jaHJvbml6ZWQuIEZvciBleGFtcGxlIFBhdGNoUGFuZWwgbWF5IG5vdCBvYnRhaW4gdGhlCisgICAgICAgICAgICAgKiB0aHJlYWQgbG9jayBiZWZvcmUgY2FsbGluZy4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBccGFyYW0gbGF0ZW5jeU1zIG9uIHN1Y2Nlc3MgaXMgc2V0IHRvIHRoZSBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcyBvZiB0aGUKKyAgICAgICAgICAgICAqICAgICAgICBuZXh0IGZyYW1lIHdyaXR0ZW4vcmVhZCBieSB0aGUgc2VydmVyIHRocmVhZCB0by9mcm9tIHRoZSB0cmFjayBidWZmZXIKKyAgICAgICAgICAgICAqICAgICAgICBmcm9tIHRoZSBkZXZpY2Ugc291cmNlL3NpbmsuCisgICAgICAgICAgICAgKiBccGFyYW0gZnJvbVRyYWNrIG9uIHN1Y2Nlc3MgaXMgc2V0IHRvIHRydWUgaWYgbGF0ZW5jeSB3YXMgY29tcHV0ZWQgZGlyZWN0bHkKKyAgICAgICAgICAgICAqICAgICAgICBmcm9tIHRoZSB0cmFjayB0aW1lc3RhbXA7IG90aGVyd2lzZSBzZXQgdG8gZmFsc2UgaWYgbGF0ZW5jeSB3YXMKKyAgICAgICAgICAgICAqICAgICAgICBlc3RpbWF0ZWQgZnJvbSB0aGUgc2VydmVyIHRpbWVzdGFtcC4KKyAgICAgICAgICAgICAqICAgICAgICBmcm9tVHJhY2sgbWF5IGJlIG51bGxwdHIgb3Igb21pdHRlZCBpZiBub3QgcmVxdWlyZWQuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogXHJldHVybnMgT0sgb3IgSU5WQUxJRF9PUEVSQVRJT04gb24gZmFpbHVyZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0U2VydmVyTGF0ZW5jeU1zKGRvdWJsZSAqbGF0ZW5jeU1zLCBib29sICpmcm9tVHJhY2sgPSBudWxscHRyKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1NlcnZlckxhdGVuY3lTdXBwb3J0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm8gdGhyZWFkIGxvY2sgaXMgYWNxdWlyZWQsIHRoZXNlIGF0b21pY3MgYXJlIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN5bmNocm9uaXplZCB3aXRoIGVhY2ggb3RoZXIsIGNvbnNpZGVyZWQgYSBiZW5pZ24gcmFjZS4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBzZXJ2ZXJMYXRlbmN5TXMgPSBtU2VydmVyTGF0ZW5jeU1zLmxvYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmVyTGF0ZW5jeU1zID09IDAuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZyb21UcmFjayAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpmcm9tVHJhY2sgPSBtU2VydmVyTGF0ZW5jeUZyb21UcmFjay5sb2FkKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpsYXRlbmN5TXMgPSBzZXJ2ZXJMYXRlbmN5TXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiogY29tcHV0ZXMgdGhlIHRvdGFsIGNsaWVudCBsYXRlbmN5IGZvciBQQ00gUGxheWJhY2sgb3IgUmVjb3JkIHRyYWNrcworICAgICAgICAgICAgICogZm9yIHRoZSBuZXh0IGNsaWVudCBhcHAgYWNjZXNzIHRvIHRoZSBkZXZpY2Ugc2luay9zb3VyY2U7IGkuZS4gdGhlCisgICAgICAgICAgICAgKiBzZXJ2ZXIgbGF0ZW5jeSBwbHVzIHRoZSBidWZmZXIgbGF0ZW5jeS4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBUaGlzIG1heSBiZSBjYWxsZWQgd2l0aG91dCB0aGUgdGhyZWFkIGxvY2ssIGJ1dCBsYXRlbmN5TXMgYW5kIGZyb21UcmFjaworICAgICAgICAgICAgICogbWF5IGJlIG5vdCBiZSBzeW5jaHJvbml6ZWQuIEZvciBleGFtcGxlIFBhdGNoUGFuZWwgbWF5IG5vdCBvYnRhaW4gdGhlCisgICAgICAgICAgICAgKiB0aHJlYWQgbG9jayBiZWZvcmUgY2FsbGluZy4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBccGFyYW0gbGF0ZW5jeU1zIG9uIHN1Y2Nlc3MgaXMgc2V0IHRvIHRoZSBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcyBvZiB0aGUKKyAgICAgICAgICAgICAqICAgICAgICBuZXh0IGZyYW1lIHdyaXR0ZW4vcmVhZCBieSB0aGUgY2xpZW50IGFwcCB0by9mcm9tIHRoZSB0cmFjayBidWZmZXIKKyAgICAgICAgICAgICAqICAgICAgICBmcm9tIHRoZSBkZXZpY2Ugc2luay9zb3VyY2UuCisgICAgICAgICAgICAgKiBccGFyYW0gZnJvbVRyYWNrIG9uIHN1Y2Nlc3MgaXMgc2V0IHRvIHRydWUgaWYgbGF0ZW5jeSB3YXMgY29tcHV0ZWQgZGlyZWN0bHkKKyAgICAgICAgICAgICAqICAgICAgICBmcm9tIHRoZSB0cmFjayB0aW1lc3RhbXA7IG90aGVyd2lzZSBzZXQgdG8gZmFsc2UgaWYgbGF0ZW5jeSB3YXMKKyAgICAgICAgICAgICAqICAgICAgICBlc3RpbWF0ZWQgZnJvbSB0aGUgc2VydmVyIHRpbWVzdGFtcC4KKyAgICAgICAgICAgICAqICAgICAgICBmcm9tVHJhY2sgbWF5IGJlIG51bGxwdHIgb3Igb21pdHRlZCBpZiBub3QgcmVxdWlyZWQuCisgICAgICAgICAgICAgKgorICAgICAgICAgICAgICogXHJldHVybnMgT0sgb3IgSU5WQUxJRF9PUEVSQVRJT04gb24gZmFpbHVyZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0VHJhY2tMYXRlbmN5TXMoZG91YmxlICpsYXRlbmN5TXMsIGJvb2wgKmZyb21UcmFjayA9IG51bGxwdHIpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgc2VydmVyTGF0ZW5jeU1zOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldFNlcnZlckxhdGVuY3lNcygmc2VydmVyTGF0ZW5jeU1zLCBmcm9tVHJhY2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxhdGVuY3lNcyA9IHNlcnZlckxhdGVuY3lNcyArIGJ1ZmZlckxhdGVuY3lNcygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgIC8vIFRPRE86IENvbnNpZGVyIG1ha2luZyB0aGlzIGV4dGVybmFsLgorICAgICAgICAgICBzdHJ1Y3QgRnJhbWVUaW1lIHsKKyAgICAgICAgICAgICAgIGludDY0X3QgZnJhbWVzOworICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lTnM7CisgICAgICAgICAgIH07CisKKyAgICAgICAgICAgLy8gS2VybmVsRnJhbWVUaW1lIGlzIHVwZGF0ZWQgcGVyICJtaXgiIHBlcmlvZCBldmVuIGZvciBub24tcGNtIHRyYWNrcy4KKyAgICAgICAgICAgdm9pZCAgICAgICAgIGdldEtlcm5lbEZyYW1lVGltZShGcmFtZVRpbWUgKmZ0KSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAqZnQgPSBtS2VybmVsRnJhbWVUaW1lLmxvYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQoKSBjb25zdCB7IHJldHVybiBtRm9ybWF0OyB9CisgICAgICAgICAgIGludCBpZCgpIGNvbnN0IHsgcmV0dXJuIG1JZDsgfQorCiBwcm90ZWN0ZWQ6CiAgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFRyYWNrQmFzZSk7CiAKQEAgLTExMSw4ICsyMTMsNiBAQAogICAgIC8vIGJ1dCBwdXR0aW5nIGl0IGluIFRyYWNrQmFzZSBhdm9pZHMgdGhlIGNvbXBsZXhpdHkgb2YgdmlydHVhbCBpbmhlcml0YW5jZQogICAgIHZpcnR1YWwgc2l6ZV90ICBmcmFtZXNSZWFkeSgpIGNvbnN0IHsgcmV0dXJuIFNJWkVfTUFYOyB9CiAKLSAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQoKSBjb25zdCB7IHJldHVybiBtRm9ybWF0OyB9Ci0KICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQoKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbENvdW50OyB9CiAKICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaygpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsTWFzazsgfQpAQCAtMTM0LDE0ICsyMzQsNiBAQAogICAgICAgICByZXR1cm4gbVN0YXRlID09IFNUT1BQSU5HXzI7CiAgICAgfQogCi0gICAgYm9vbCBpc1Rlcm1pbmF0ZWQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtVGVybWluYXRlZDsKLSAgICB9Ci0KLSAgICB2b2lkIHRlcm1pbmF0ZSgpIHsKLSAgICAgICAgbVRlcm1pbmF0ZWQgPSB0cnVlOwotICAgIH0KLQogICAgIC8vIFVwcGVyIGNhc2UgY2hhcmFjdGVycyBhcmUgZmluYWwgc3RhdGVzLgogICAgIC8vIExvd2VyIGNhc2UgY2hhcmFjdGVycyBhcmUgdHJhbnNpdG9yeS4KICAgICBjb25zdCBjaGFyICpnZXRUcmFja1N0YXRlU3RyaW5nKCkgY29uc3QgewpAQCAtMjA4LDEzICszMDAsMjEgQEAKICAgICBjb25zdCBib29sICAgICAgICAgIG1Jc091dDsKICAgICBzcDxTZXJ2ZXJQcm94eT4gICAgIG1TZXJ2ZXJQcm94eTsKICAgICBjb25zdCBpbnQgICAgICAgICAgIG1JZDsKLSAgICBzcDxOQkFJT19TaW5rPiAgICAgIG1UZWVTaW5rOwotICAgIHNwPE5CQUlPX1NvdXJjZT4gICAgbVRlZVNvdXJjZTsKKyNpZmRlZiBURUVfU0lOSworICAgIE5CQUlPX1RlZSAgICAgICAgICAgbVRlZTsKKyNlbmRpZgogICAgIGJvb2wgICAgICAgICAgICAgICAgbVRlcm1pbmF0ZWQ7CiAgICAgdHJhY2tfdHlwZSAgICAgICAgICBtVHlwZTsgICAgICAvLyBtdXN0IGJlIG9uZSBvZiBUWVBFX0RFRkFVTFQsIFRZUEVfT1VUUFVULCBUWVBFX1BBVENIIC4uLgogICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgbVRocmVhZElvSGFuZGxlOyAvLyBJL08gaGFuZGxlIG9mIHRoZSB0aHJlYWQgdGhlIHRyYWNrIGlzIGF0dGFjaGVkIHRvCiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtUG9ydElkOyAvLyB1bmlxdWUgSUQgZm9yIHRoaXMgdHJhY2sgdXNlZCBieSBhdWRpbyBwb2xpY3kKICAgICBib29sICAgICAgICAgICAgICAgIG1Jc0ludmFsaWQ7IC8vIG5vbi1yZXNldHRhYmxlIGxhdGNoLCBzZXQgYnkgaW52YWxpZGF0ZSgpCisKKyAgICBib29sICAgICAgICAgICAgICAgIG1TZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkID0gZmFsc2U7CisgICAgc3RkOjphdG9taWM8Ym9vbD4gICBtU2VydmVyTGF0ZW5jeUZyb21UcmFja3t9OyAvLyBsYXRlbmN5IGZyb20gdHJhY2sgb3Igc2VydmVyIHRpbWVzdGFtcC4KKyAgICBzdGQ6OmF0b21pYzxkb3VibGU+IG1TZXJ2ZXJMYXRlbmN5TXN7fTsgICAgICAgIC8vIGxhc3QgbGF0ZW5jeSBwdXNoZWQgZnJvbSBzZXJ2ZXIgdGhyZWFkLgorICAgIHN0ZDo6YXRvbWljPEZyYW1lVGltZT4gbUtlcm5lbEZyYW1lVGltZXt9OyAgICAgLy8gbGFzdCBmcmFtZSB0aW1lIG9uIGtlcm5lbCBzaWRlLgorICAgIGNvbnN0IHBpZF90ICAgICAgICAgbUNyZWF0b3JQaWQ7ICAvLyBjYW4gYmUgZGlmZmVyZW50IGZyb20gbWNsaWVudC0+cGlkKCkgZm9yIGluc3RhbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gY3JlYXRlZCBieSBOdVBsYXllciBvbiBiZWhhbGYgb2YgYSBjbGllbnQKIH07CiAKIC8vIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgUGF0Y2hUcmFjayBhbmQgUGF0Y2hSZWNvcmQuCkBAIC0yMjksMyArMzI5LDI4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICpyZXF1ZXN0ZWQgPSBOVUxMKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKFByb3h5OjpCdWZmZXIqIGJ1ZmZlcikgPSAwOwogfTsKKworY2xhc3MgUGF0Y2hUcmFja0Jhc2UgOiBwdWJsaWMgUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyCit7CitwdWJsaWM6CisgICAgdXNpbmcgVGltZW91dCA9IHN0ZDo6b3B0aW9uYWw8c3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzPjsKKyAgICAgICAgICAgICAgICAgICAgICAgIFBhdGNoVHJhY2tCYXNlKHNwPENsaWVudFByb3h5PiBwcm94eSwgY29uc3QgVGhyZWFkQmFzZSYgdGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGltZW91dCYgdGltZW91dCk7CisgICAgICAgICAgICB2b2lkICAgICAgICBzZXRQZWVyVGltZW91dChzdGQ6OmNocm9ubzo6bmFub3NlY29uZHMgdGltZW91dCk7CisgICAgICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICAgICAgICAgIHZvaWQgICAgICAgIHNldFBlZXJQcm94eShjb25zdCBzcDxUPiAmcHJveHksIGJvb2wgaG9sZFJlZmVyZW5jZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QZWVyUmVmZXJlbmNlSG9sZCA9IGhvbGRSZWZlcmVuY2UgPyBwcm94eSA6IG51bGxwdHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBlZXJQcm94eSA9IHByb3h5LmdldCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgdm9pZCAgICAgICAgY2xlYXJQZWVyUHJveHkoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBlZXJSZWZlcmVuY2VIb2xkLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBlZXJQcm94eSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBjb25zdCBzcDxDbGllbnRQcm94eT4gICAgICAgbVByb3h5OworICAgIHNwPFJlZkJhc2U+ICAgICAgICAgICAgICAgICBtUGVlclJlZmVyZW5jZUhvbGQ7ICAgLy8ga2VlcHMgbVBlZXJQcm94eSBhbGl2ZSBkdXJpbmcgYWNjZXNzLgorICAgIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciogICBtUGVlclByb3h5ID0gbnVsbHB0cjsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgICAgICAgICAgICAgbVBlZXJUaW1lb3V0e307CisKK307CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCmluZGV4IGE3YzQyNTMuLjc4ZGI4MGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCkBAIC0yOCwxMSArMjgsMTEgQEAKICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaD4KIAogI2luY2x1ZGUgIkF1ZGlvRmxpbmdlci5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKIAogI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BpcGUuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9QaXBlUmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvUmVjb3JkQnVmZmVyQ29udmVydGVyLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvbWluaWZsb2F0Lmg+CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTU2LDYgKzU2LDggQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vICAgICAgVHJhY2tCYXNlCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6VHJhY2tCYXNlIgogCiBzdGF0aWMgdm9sYXRpbGUgaW50MzJfdCBuZXh0VHJhY2tJZCA9IDU1OwogCkBAIC03MSw2ICs3Myw3IEBACiAgICAgICAgICAgICB2b2lkICpidWZmZXIsCiAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICBwaWRfdCBjcmVhdG9yUGlkLAogICAgICAgICAgICAgdWlkX3QgY2xpZW50VWlkLAogICAgICAgICAgICAgYm9vbCBpc091dCwKICAgICAgICAgICAgIGFsbG9jX3R5cGUgYWxsb2MsCkBAIC05NywxNCArMTAwLDE2IEBACiAgICAgICAgIG1JZChhbmRyb2lkX2F0b21pY19pbmMoJm5leHRUcmFja0lkKSksCiAgICAgICAgIG1UZXJtaW5hdGVkKGZhbHNlKSwKICAgICAgICAgbVR5cGUodHlwZSksCi0gICAgICAgIG1UaHJlYWRJb0hhbmRsZSh0aHJlYWQtPmlkKCkpLAorICAgICAgICBtVGhyZWFkSW9IYW5kbGUodGhyZWFkID8gdGhyZWFkLT5pZCgpIDogQVVESU9fSU9fSEFORExFX05PTkUpLAogICAgICAgICBtUG9ydElkKHBvcnRJZCksCi0gICAgICAgIG1Jc0ludmFsaWQoZmFsc2UpCisgICAgICAgIG1Jc0ludmFsaWQoZmFsc2UpLAorICAgICAgICBtQ3JlYXRvclBpZChjcmVhdG9yUGlkKQogewogICAgIGNvbnN0IHVpZF90IGNhbGxpbmdVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgaWYgKCFpc1RydXN0ZWRDYWxsaW5nVWlkKGNhbGxpbmdVaWQpIHx8IGNsaWVudFVpZCA9PSBBVURJT19VSURfSU5WQUxJRCkgeworICAgIGlmICghaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoY2FsbGluZ1VpZCkgfHwgY2xpZW50VWlkID09IEFVRElPX1VJRF9JTlZBTElEKSB7CiAgICAgICAgIEFMT0dXX0lGKGNsaWVudFVpZCAhPSBBVURJT19VSURfSU5WQUxJRCAmJiBjbGllbnRVaWQgIT0gY2FsbGluZ1VpZCwKLSAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyAlZCIsIF9fRlVOQ1RJT05fXywgY2FsbGluZ1VpZCwgY2xpZW50VWlkKTsKKyAgICAgICAgICAgICAgICAiJXMoJWQpOiB1aWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzICVkIiwKKyAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgY2FsbGluZ1VpZCwgY2xpZW50VWlkKTsKICAgICAgICAgY2xpZW50VWlkID0gY2FsbGluZ1VpZDsKICAgICB9CiAgICAgLy8gY2xpZW50VWlkIGNvbnRhaW5zIHRoZSB1aWQgb2YgdGhlIGFwcCB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciB0aGlzIHRyYWNrLCBzbyB3ZSBjYW4gYmxhbWUKQEAgLTE0NCw3ICsxNDksNyBAQAogICAgICAgICBtQ2Jsa01lbW9yeSA9IGNsaWVudC0+aGVhcCgpLT5hbGxvY2F0ZShzaXplKTsKICAgICAgICAgaWYgKG1DYmxrTWVtb3J5ID09IDAgfHwKICAgICAgICAgICAgICAgICAobUNibGsgPSBzdGF0aWNfY2FzdDxhdWRpb190cmFja19jYmxrX3QgKj4obUNibGtNZW1vcnktPnBvaW50ZXIoKSkpID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJub3QgZW5vdWdoIG1lbW9yeSBmb3IgQXVkaW9UcmFjayBzaXplPSV6dSIsIHNpemUpOworICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogbm90IGVub3VnaCBtZW1vcnkgZm9yIEF1ZGlvVHJhY2sgc2l6ZT0lenUiLCBfX2Z1bmNfXywgbUlkLCBzaXplKTsKICAgICAgICAgICAgIGNsaWVudC0+aGVhcCgpLT5kdW1wKCJBdWRpb1RyYWNrIik7CiAgICAgICAgICAgICBtQ2Jsa01lbW9yeS5jbGVhcigpOwogICAgICAgICAgICAgcmV0dXJuOwpAQCAtMTUyLDcgKzE1Nyw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgbUNibGsgPSAoYXVkaW9fdHJhY2tfY2Jsa190ICopIG1hbGxvYyhzaXplKTsKICAgICAgICAgaWYgKG1DYmxrID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJub3QgZW5vdWdoIG1lbW9yeSBmb3IgQXVkaW9UcmFjayBzaXplPSV6dSIsIHNpemUpOworICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogbm90IGVub3VnaCBtZW1vcnkgZm9yIEF1ZGlvVHJhY2sgc2l6ZT0lenUiLCBfX2Z1bmNfXywgbUlkLCBzaXplKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgIH0KQEAgLTE2Niw3ICsxNzEsOCBAQAogICAgICAgICAgICAgaWYgKHJvSGVhcCA9PSAwIHx8CiAgICAgICAgICAgICAgICAgICAgIChtQnVmZmVyTWVtb3J5ID0gcm9IZWFwLT5hbGxvY2F0ZShidWZmZXJTaXplKSkgPT0gMCB8fAogICAgICAgICAgICAgICAgICAgICAobUJ1ZmZlciA9IG1CdWZmZXJNZW1vcnktPnBvaW50ZXIoKSkgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJub3QgZW5vdWdoIG1lbW9yeSBmb3IgcmVhZC1vbmx5IGJ1ZmZlciBzaXplPSV6dSIsIGJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IG5vdCBlbm91Z2ggbWVtb3J5IGZvciByZWFkLW9ubHkgYnVmZmVyIHNpemU9JXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIGJ1ZmZlclNpemUpOwogICAgICAgICAgICAgICAgIGlmIChyb0hlYXAgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICByb0hlYXAtPmR1bXAoImJ1ZmZlciIpOwogICAgICAgICAgICAgICAgIH0KQEAgLTIwNSwyNyArMjExLDEyIEBACiAgICAgICAgICAgICBtQnVmZmVyID0gYnVmZmVyOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJpbnZhbGlkIGFsbG9jYXRpb24gdHlwZTogJWQiLCAoaW50KWFsbG9jKTsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzKCVkKTogaW52YWxpZCBhbGxvY2F0aW9uIHR5cGU6ICVkIiwgX19mdW5jX18sIG1JZCwgKGludClhbGxvYyk7CiAgICAgICAgIH0KICAgICAgICAgbUJ1ZmZlclNpemUgPSBidWZmZXJTaXplOwogCiAjaWZkZWYgVEVFX1NJTksKLSAgICAgICAgaWYgKG1UZWVTaW5rVHJhY2tFbmFibGVkKSB7Ci0gICAgICAgICAgICBOQkFJT19Gb3JtYXQgcGlwZUZvcm1hdCA9IEZvcm1hdF9mcm9tX1NSX0MobVNhbXBsZVJhdGUsIG1DaGFubmVsQ291bnQsIG1Gb3JtYXQpOwotICAgICAgICAgICAgaWYgKEZvcm1hdF9pc1ZhbGlkKHBpcGVGb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAgUGlwZSAqcGlwZSA9IG5ldyBQaXBlKG1UZWVTaW5rVHJhY2tGcmFtZXMsIHBpcGVGb3JtYXQpOwotICAgICAgICAgICAgICAgIHNpemVfdCBudW1Db3VudGVyT2ZmZXJzID0gMDsKLSAgICAgICAgICAgICAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzWzFdID0ge3BpcGVGb3JtYXR9OwotICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBwaXBlLT5uZWdvdGlhdGUob2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKLSAgICAgICAgICAgICAgICBQaXBlUmVhZGVyICpwaXBlUmVhZGVyID0gbmV3IFBpcGVSZWFkZXIoKnBpcGUpOwotICAgICAgICAgICAgICAgIG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgICAgICAgICAgICAgIGluZGV4ID0gcGlwZVJlYWRlci0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7Ci0gICAgICAgICAgICAgICAgbVRlZVNpbmsgPSBwaXBlOwotICAgICAgICAgICAgICAgIG1UZWVTb3VyY2UgPSBwaXBlUmVhZGVyOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIG1UZWUuc2V0KHNhbXBsZVJhdGUsIG1DaGFubmVsQ291bnQsIGZvcm1hdCwgTkJBSU9fVGVlOjpURUVfRkxBR19UUkFDSyk7CiAjZW5kaWYKIAogICAgIH0KQEAgLTI0NCw5ICsyMzUsNiBAQAogCiBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OlRyYWNrQmFzZTo6flRyYWNrQmFzZSgpCiB7Ci0jaWZkZWYgVEVFX1NJTksKLSAgICBkdW1wVGVlKC0xLCBtVGVlU291cmNlLCBtSWQsICdUJyk7Ci0jZW5kaWYKICAgICAvLyBkZWxldGUgdGhlIHByb3h5IGJlZm9yZSBkZWxldGluZyB0aGUgc2hhcmVkIG1lbW9yeSBpdCByZWZlcnMgdG8sIHRvIGF2b2lkIGRhbmdsaW5nIHJlZmVyZW5jZQogICAgIG1TZXJ2ZXJQcm94eS5jbGVhcigpOwogICAgIGlmIChtQ2JsayAhPSBOVUxMKSB7CkBAIC0yNzQsOSArMjYyLDcgQEAKIHZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpUcmFja0Jhc2U6OnJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpCiB7CiAjaWZkZWYgVEVFX1NJTksKLSAgICBpZiAobVRlZVNpbmsgIT0gMCkgewotICAgICAgICAodm9pZCkgbVRlZVNpbmstPndyaXRlKGJ1ZmZlci0+cmF3LCBidWZmZXItPmZyYW1lQ291bnQpOwotICAgIH0KKyAgICBtVGVlLndyaXRlKGJ1ZmZlci0+cmF3LCBidWZmZXItPmZyYW1lQ291bnQpOwogI2VuZGlmCiAKICAgICBTZXJ2ZXJQcm94eTo6QnVmZmVyIGJ1ZjsKQEAgLTI5Myw5ICsyNzksMzIgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK0F1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6UGF0Y2hUcmFja0Jhc2U6OlBhdGNoVHJhY2tCYXNlKHNwPENsaWVudFByb3h5PiBwcm94eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmVhZEJhc2UmIHRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRpbWVvdXQmIHRpbWVvdXQpCisgICAgOiBtUHJveHkocHJveHkpCit7CisgICAgaWYgKHRpbWVvdXQpIHsKKyAgICAgICAgc2V0UGVlclRpbWVvdXQoKnRpbWVvdXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIERvdWJsZSBidWZmZXIgbWl4ZXIKKyAgICAgICAgdWludDY0X3QgbWl4QnVmZmVyTnMgPSAoKHVpbnQ2NF90KTIgKiB0aHJlYWQuZnJhbWVDb3VudCgpICogMTAwMDAwMDAwMCkgLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZC5zYW1wbGVSYXRlKCk7CisgICAgICAgIHNldFBlZXJUaW1lb3V0KHN0ZDo6Y2hyb25vOjpuYW5vc2Vjb25kc3ttaXhCdWZmZXJOc30pOworICAgIH0KK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OlBhdGNoVHJhY2tCYXNlOjpzZXRQZWVyVGltZW91dChzdGQ6OmNocm9ubzo6bmFub3NlY29uZHMgdGltZW91dCkgeworICAgIG1QZWVyVGltZW91dC50dl9zZWMgPSB0aW1lb3V0LmNvdW50KCkgLyBzdGQ6Om5hbm86OmRlbjsKKyAgICBtUGVlclRpbWVvdXQudHZfbnNlYyA9IHRpbWVvdXQuY291bnQoKSAlIHN0ZDo6bmFubzo6ZGVuOworfQorCisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vICAgICAgUGxheWJhY2sKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkFGOjpUcmFja0hhbmRsZSIKIAogQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6VHJhY2tIYW5kbGUoY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s+JiB0cmFjaykKICAgICA6IEJuQXVkaW9UcmFjaygpLApAQCAtMzQwLDYgKzM0OSwxMCBAQAogICAgIHJldHVybiBtVHJhY2stPnNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlycyk7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6VHJhY2tIYW5kbGU6OnNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpIHsKKyAgICByZXR1cm4gbVRyYWNrLT5zZWxlY3RQcmVzZW50YXRpb24ocHJlc2VudGF0aW9uSWQsIHByb2dyYW1JZCk7Cit9CisKIFZvbHVtZVNoYXBlcjo6U3RhdHVzIEF1ZGlvRmxpbmdlcjo6VHJhY2tIYW5kbGU6OmFwcGx5Vm9sdW1lU2hhcGVyKAogICAgICAgICBjb25zdCBzcDxWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAogICAgICAgICBjb25zdCBzcDxWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbj4mIG9wZXJhdGlvbikgewpAQCAtMzY4LDYgKzM4MSwxMTcgQEAKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICBBcHBPcCBmb3IgYXVkaW8gcGxheWJhY2sKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gc3RhdGljCitzcDxBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpPcFBsYXlBdWRpb01vbml0b3I+CitBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpPcFBsYXlBdWRpb01vbml0b3I6OmNyZWF0ZUlmTmVlZGVkKAorICAgICAgICAgICAgdWlkX3QgdWlkLCBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHIsIGludCBpZCwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKQoreworICAgIGlmIChpc1NlcnZpY2VVaWQodWlkKSkgeworICAgICAgICBWZWN0b3IgPFN0cmluZzE2PiBwYWNrYWdlczsKKyAgICAgICAgZ2V0UGFja2FnZXNGb3JVaWQodWlkLCBwYWNrYWdlcyk7CisgICAgICAgIGlmIChwYWNrYWdlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dEKCJPcFBsYXlBdWRpbzogbm90IG11dGluZyB0cmFjazolZCB1c2FnZTolZCBmb3Igc2VydmljZSBVSUQgJWQiLAorICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICBhdHRyLnVzYWdlLAorICAgICAgICAgICAgICAgICAgdWlkKTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgfQorICAgIC8vIHN0cmVhbSB0eXBlIGhhcyBiZWVuIGZpbHRlcmVkIGJ5IGF1ZGlvIHBvbGljeSB0byBpbmRpY2F0ZSB3aGV0aGVyIGl0IGNhbiBiZSBtdXRlZAorICAgIGlmIChzdHJlYW1UeXBlID09IEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKSB7CisgICAgICAgIEFMT0dEKCJPcFBsYXlBdWRpbzogbm90IG11dGluZyB0cmFjazolZCB1c2FnZTolZCBFTkZPUkNFRF9BVURJQkxFIiwgaWQsIGF0dHIudXNhZ2UpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKChhdHRyLmZsYWdzICYgQVVESU9fRkxBR19CWVBBU1NfSU5URVJSVVBUSU9OX1BPTElDWSkKKyAgICAgICAgICAgID09IEFVRElPX0ZMQUdfQllQQVNTX0lOVEVSUlVQVElPTl9QT0xJQ1kpIHsKKyAgICAgICAgQUxPR0QoIk9wUGxheUF1ZGlvOiBub3QgbXV0aW5nIHRyYWNrOiVkIGZsYWdzICUjeCBoYXZlIEZMQUdfQllQQVNTX0lOVEVSUlVQVElPTl9QT0xJQ1kiLAorICAgICAgICAgICAgaWQsIGF0dHIuZmxhZ3MpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBPcFBsYXlBdWRpb01vbml0b3IodWlkLCBhdHRyLnVzYWdlLCBpZCk7Cit9CisKK0F1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Ok9wUGxheUF1ZGlvTW9uaXRvcjo6T3BQbGF5QXVkaW9Nb25pdG9yKAorICAgICAgICB1aWRfdCB1aWQsIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsIGludCBpZCkKKyAgICAgICAgOiBtSGFzT3BQbGF5QXVkaW8odHJ1ZSksIG1VaWQodWlkKSwgbVVzYWdlKChpbnQzMl90KSB1c2FnZSksIG1JZChpZCkKK3sKK30KKworQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6T3BQbGF5QXVkaW9Nb25pdG9yOjp+T3BQbGF5QXVkaW9Nb25pdG9yKCkKK3sKKyAgICBpZiAobU9wQ2FsbGJhY2sgIT0gMCkgeworICAgICAgICBtQXBwT3BzTWFuYWdlci5zdG9wV2F0Y2hpbmdNb2RlKG1PcENhbGxiYWNrKTsKKyAgICB9CisgICAgbU9wQ2FsbGJhY2suY2xlYXIoKTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpPcFBsYXlBdWRpb01vbml0b3I6Om9uRmlyc3RSZWYoKQoreworICAgIGdldFBhY2thZ2VzRm9yVWlkKG1VaWQsIG1QYWNrYWdlcyk7CisgICAgY2hlY2tQbGF5QXVkaW9Gb3JVc2FnZSgpOworICAgIGlmICghbVBhY2thZ2VzLmlzRW1wdHkoKSkgeworICAgICAgICBtT3BDYWxsYmFjayA9IG5ldyBQbGF5QXVkaW9PcENhbGxiYWNrKHRoaXMpOworICAgICAgICBtQXBwT3BzTWFuYWdlci5zdGFydFdhdGNoaW5nTW9kZShBcHBPcHNNYW5hZ2VyOjpPUF9QTEFZX0FVRElPLCBtUGFja2FnZXNbMF0sIG1PcENhbGxiYWNrKTsKKyAgICB9Cit9CisKK2Jvb2wgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6T3BQbGF5QXVkaW9Nb25pdG9yOjpoYXNPcFBsYXlBdWRpbygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUhhc09wUGxheUF1ZGlvLmxvYWQoKTsKK30KKworLy8gTm90ZSB0aGlzIG1ldGhvZCBpcyBuZXZlciBjYWxsZWQgKGFuZCBuZXZlciB0byBiZSkgZm9yIGF1ZGlvIHNlcnZlciAvIHJvb3QgdHJhY2sKKy8vIC0gbm90IGNhbGxlZCBmcm9tIGNvbnN0cnVjdG9yIGR1ZSB0byBjaGVjayBvbiBVSUQsCisvLyAtIG5vdCBjYWxsZWQgZnJvbSBQbGF5QXVkaW9PcENhbGxiYWNrIGJlY2F1c2UgdGhlIGNhbGxiYWNrIGlzIG5vdCBpbnN0YWxsZWQgaW4gdGhpcyBjYXNlCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Ok9wUGxheUF1ZGlvTW9uaXRvcjo6Y2hlY2tQbGF5QXVkaW9Gb3JVc2FnZSgpCit7CisgICAgaWYgKG1QYWNrYWdlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgbUhhc09wUGxheUF1ZGlvLnN0b3JlKGZhbHNlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBib29sIGhhc0l0ID0gdHJ1ZTsKKyAgICAgICAgZm9yIChjb25zdCBTdHJpbmcxNiYgcGFja2FnZU5hbWUgOiBtUGFja2FnZXMpIHsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgbW9kZSA9IG1BcHBPcHNNYW5hZ2VyLmNoZWNrQXVkaW9PcE5vVGhyb3coQXBwT3BzTWFuYWdlcjo6T1BfUExBWV9BVURJTywKKyAgICAgICAgICAgICAgICAgICAgbVVzYWdlLCBtVWlkLCBwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBpZiAobW9kZSAhPSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0FMTE9XRUQpIHsKKyAgICAgICAgICAgICAgICBoYXNJdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dEKCJPcFBsYXlBdWRpbzogdHJhY2s6JWQgdXNhZ2U6JWQgJXNtdXRlZCIsIG1JZCwgbVVzYWdlLCBoYXNJdCA/ICJub3QgIiA6ICIiKTsKKyAgICAgICAgbUhhc09wUGxheUF1ZGlvLnN0b3JlKGhhc0l0KTsKKyAgICB9Cit9CisKK0F1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Ok9wUGxheUF1ZGlvTW9uaXRvcjo6UGxheUF1ZGlvT3BDYWxsYmFjazo6UGxheUF1ZGlvT3BDYWxsYmFjaygKKyAgICAgICAgY29uc3Qgd3A8T3BQbGF5QXVkaW9Nb25pdG9yPiYgbW9uaXRvcikgOiBtTW9uaXRvcihtb25pdG9yKQoreyB9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6T3BQbGF5QXVkaW9Nb25pdG9yOjpQbGF5QXVkaW9PcENhbGxiYWNrOjpvcENoYW5nZWQoaW50MzJfdCBvcCwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBwYWNrYWdlTmFtZSkgeworICAgIC8vIHdlIG9ubHkgaGF2ZSB1aWQsIHNvIHdlIG5lZWQgdG8gY2hlY2sgYWxsIHBhY2thZ2UgbmFtZXMgYW55d2F5CisgICAgVU5VU0VEKHBhY2thZ2VOYW1lKTsKKyAgICBpZiAob3AgIT0gQXBwT3BzTWFuYWdlcjo6T1BfUExBWV9BVURJTykgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNwPE9wUGxheUF1ZGlvTW9uaXRvcj4gbW9uaXRvciA9IG1Nb25pdG9yLnByb21vdGUoKTsKKyAgICBpZiAobW9uaXRvciAhPSBOVUxMKSB7CisgICAgICAgIG1vbml0b3ItPmNoZWNrUGxheUF1ZGlvRm9yVXNhZ2UoKTsKKyAgICB9Cit9CisKKy8vIHN0YXRpYwordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpPcFBsYXlBdWRpb01vbml0b3I6OmdldFBhY2thZ2VzRm9yVWlkKAorICAgIHVpZF90IHVpZCwgVmVjdG9yPFN0cmluZzE2PiYgcGFja2FnZXMpCit7CisgICAgUGVybWlzc2lvbkNvbnRyb2xsZXIgcGVybWlzc2lvbkNvbnRyb2xsZXI7CisgICAgcGVybWlzc2lvbkNvbnRyb2xsZXIuZ2V0UGFja2FnZXNGb3JVaWQodWlkLCBwYWNrYWdlcyk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkFGOjpUcmFjayIKIAogLy8gVHJhY2sgY29uc3RydWN0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGFuZCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6VHJhY2soCkBAIC0zODMsNiArNTA3LDcgQEAKICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAogICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICBwaWRfdCBjcmVhdG9yUGlkLAogICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICB0cmFja190eXBlIHR5cGUsCkBAIC0zOTAsMjAgKzUxNSwyMCBAQAogICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBjbGllbnQsIGF0dHIsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAoc2hhcmVkQnVmZmVyICE9IDApID8gc2hhcmVkQnVmZmVyLT5wb2ludGVyKCkgOiBidWZmZXIsCiAgICAgICAgICAgICAgICAgICAoc2hhcmVkQnVmZmVyICE9IDApID8gc2hhcmVkQnVmZmVyLT5zaXplKCkgOiBidWZmZXJTaXplLAotICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCB1aWQsIHRydWUgLyppc091dCovLAorICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCBjcmVhdG9yUGlkLCB1aWQsIHRydWUgLyppc091dCovLAogICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gVFlQRV9QQVRDSCkgPyAoIGJ1ZmZlciA9PSBOVUxMID8gQUxMT0NfTE9DQUwgOiBBTExPQ19OT05FKSA6IEFMTE9DX0NCTEssCiAgICAgICAgICAgICAgICAgICB0eXBlLCBwb3J0SWQpLAogICAgIG1GaWxsaW5nVXBTdGF0dXMoRlNfSU5WQUxJRCksCiAgICAgLy8gbVJldHJ5Q291bnQgaW5pdGlhbGl6ZWQgbGF0ZXIgd2hlbiBuZWVkZWQKICAgICBtU2hhcmVkQnVmZmVyKHNoYXJlZEJ1ZmZlciksCiAgICAgbVN0cmVhbVR5cGUoc3RyZWFtVHlwZSksCi0gICAgbU5hbWUoVFJBQ0tfTkFNRV9GQUlMVVJFKSwgIC8vIHNldCB0byBUUkFDS19OQU1FX1BFTkRJTkcgb24gY29uc3RydWN0b3Igc3VjY2Vzcy4KICAgICBtTWFpbkJ1ZmZlcih0aHJlYWQtPnNpbmtCdWZmZXIoKSksCiAgICAgbUF1eEJ1ZmZlcihOVUxMKSwKICAgICBtQXV4RWZmZWN0SWQoMCksIG1IYXNWb2x1bWVDb250cm9sbGVyKGZhbHNlKSwKICAgICBtUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMoMCksCiAgICAgbUZyYW1lTWFwKDE2IC8qIHNpbmstZnJhbWUtdG8tdHJhY2stZnJhbWUgbWFwIG1lbW9yeSAqLyksCiAgICAgbVZvbHVtZUhhbmRsZXIobmV3IG1lZGlhOjpWb2x1bWVIYW5kbGVyKHNhbXBsZVJhdGUpKSwKKyAgICBtT3BQbGF5QXVkaW9Nb25pdG9yKE9wUGxheUF1ZGlvTW9uaXRvcjo6Y3JlYXRlSWZOZWVkZWQodWlkLCBhdHRyLCBpZCgpLCBzdHJlYW1UeXBlKSksCiAgICAgLy8gbVNpbmtUaW1lc3RhbXAKICAgICBtRmFzdEluZGV4KC0xKSwKICAgICBtQ2FjaGVkVm9sdW1lKDEuMCksCkBAIC00MTcsOCArNTQyLDggQEAKICAgICAvLyBjbGllbnQgPT0gMCBpbXBsaWVzIHNoYXJlZEJ1ZmZlciA9PSAwCiAgICAgQUxPR19BU1NFUlQoIShjbGllbnQgPT0gMCAmJiBzaGFyZWRCdWZmZXIgIT0gMCkpOwogCi0gICAgQUxPR1ZfSUYoc2hhcmVkQnVmZmVyICE9IDAsICJzaGFyZWRCdWZmZXI6ICVwLCBzaXplOiAlenUiLCBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwKLSAgICAgICAgICAgIHNoYXJlZEJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBBTE9HVl9JRihzaGFyZWRCdWZmZXIgIT0gMCwgIiVzKCVkKTogc2hhcmVkQnVmZmVyOiAlcCwgc2l6ZTogJXp1IiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpLCBzaGFyZWRCdWZmZXItPnNpemUoKSk7CiAKICAgICBpZiAobUNibGsgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CkBAIC00MzQsNyArNTU5LDcgQEAKICAgICBtU2VydmVyUHJveHkgPSBtQXVkaW9UcmFja1NlcnZlclByb3h5OwogCiAgICAgaWYgKCF0aHJlYWQtPmlzVHJhY2tBbGxvd2VkX2woY2hhbm5lbE1hc2ssIGZvcm1hdCwgc2Vzc2lvbklkLCB1aWQpKSB7Ci0gICAgICAgIEFMT0dFKCJubyBtb3JlIHRyYWNrcyBhdmFpbGFibGUiKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogbm8gbW9yZSB0cmFja3MgYXZhaWxhYmxlIiwgX19mdW5jX18sIG1JZCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgLy8gb25seSBhbGxvY2F0ZSBhIGZhc3QgdHJhY2sgaW5kZXggaWYgd2Ugd2VyZSBhYmxlIHRvIGFsbG9jYXRlIGEgbm9ybWFsIHRyYWNrIG5hbWUKQEAgLTQ1MywxMiArNTc4LDI0IEBACiAgICAgICAgIG1GYXN0SW5kZXggPSBpOwogICAgICAgICB0aHJlYWQtPm1GYXN0VHJhY2tBdmFpbE1hc2sgJj0gfigxIDw8IGkpOwogICAgIH0KLSAgICBtTmFtZSA9IFRSQUNLX05BTUVfUEVORElORzsKKworICAgIG1TZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkID0gdGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6TUlYRVIKKyAgICAgICAgICAgIHx8IHRocmVhZC0+dHlwZSgpID09IFRocmVhZEJhc2U6OkRVUExJQ0FUSU5HOworI2lmZGVmIFRFRV9TSU5LCisgICAgbVRlZS5zZXRJZChzdGQ6OnN0cmluZygiXyIpICsgc3RkOjp0b19zdHJpbmcobVRocmVhZElvSGFuZGxlKQorICAgICAgICAgICAgKyAiXyIgKyBzdGQ6OnRvX3N0cmluZyhtSWQpICsgIl9UIik7CisjZW5kaWYKKworICAgIGlmIChjaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkgeworICAgICAgICBtQXVkaW9WaWJyYXRpb25Db250cm9sbGVyID0gbmV3IEF1ZGlvVmlicmF0aW9uQ29udHJvbGxlcih0aGlzKTsKKyAgICAgICAgbUV4dGVybmFsVmlicmF0aW9uID0gbmV3IG9zOjpFeHRlcm5hbFZpYnJhdGlvbigKKyAgICAgICAgICAgICAgICBtVWlkLCAiIiAvKiBwa2cgKi8sIG1BdHRyLCBtQXVkaW9WaWJyYXRpb25Db250cm9sbGVyKTsKKyAgICB9CiB9CiAKIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjp+VHJhY2soKQogewotICAgIEFMT0dWKCJQbGF5YmFja1RocmVhZDo6VHJhY2sgZGVzdHJ1Y3RvciIpOworICAgIEFMT0dWKCIlcyglZCkiLCBfX2Z1bmNfXywgbUlkKTsKIAogICAgIC8vIFRoZSBkZXN0cnVjdG9yIHdvdWxkIGNsZWFyIG1TaGFyZWRCdWZmZXIsCiAgICAgLy8gYnV0IGl0IHdpbGwgbm90IHB1c2ggdGhlIGRlY3JlbWVudGVkIHJlZmVyZW5jZSBjb3VudCwKQEAgLTQ3Miw3ICs2MDksNyBAQAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmluaXRDaGVjaygpIGNvbnN0CiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gVHJhY2tCYXNlOjppbml0Q2hlY2soKTsKLSAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIG1OYW1lID09IFRSQUNLX05BTUVfRkFJTFVSRSkgeworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgbUNibGsgPT0gbnVsbHB0cikgewogICAgICAgICBzdGF0dXMgPSBOT19NRU1PUlk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CkBAIC00OTgsMTggKzYzNSwyMSBAQAogICAgICAgICAgICAgd2FzQWN0aXZlID0gcGxheWJhY2tUaHJlYWQtPmRlc3Ryb3lUcmFja19sKHRoaXMpOwogICAgICAgICB9CiAgICAgICAgIGlmIChpc0V4dGVybmFsVHJhY2soKSAmJiAhd2FzQWN0aXZlKSB7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChtVGhyZWFkSW9IYW5kbGUsIG1TdHJlYW1UeXBlLCBtU2Vzc2lvbklkKTsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG1Qb3J0SWQpOwogICAgICAgICB9CiAgICAgfQorICAgIGZvckVhY2hUZWVQYXRjaFRyYWNrKFtdKGF1dG8gcGF0Y2hUcmFjaykgeyBwYXRjaFRyYWNrLT5kZXN0cm95KCk7IH0pOwogfQogCi0vKnN0YXRpYyovIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KQordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZCgiVCBOYW1lIEFjdGl2ZSBDbGllbnQgU2Vzc2lvbiBTICBGbGFncyAiCi0gICAgICAgICAgICAgICAgICAiICBGb3JtYXQgQ2huIG1hc2sgIFNSYXRlICIKLSAgICAgICAgICAgICAgICAgICJTVCAgTCBkQiAgUiBkQiAgVlMgZEIgIgotICAgICAgICAgICAgICAgICAgIiAgU2VydmVyIEZybUNudCAgRnJtUmR5IEYgVW5kZXJydW5zICBGbHVzaGVkICIKLSAgICAgICAgICAgICAgICAgICJNYWluIEJ1ZiAgQXV4IEJ1ZlxuIik7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiVHlwZSAgICAgSWQgQWN0aXZlIENsaWVudCBTZXNzaW9uIFBvcnQgSWQgUyAgRmxhZ3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgIiAgRm9ybWF0IENobiBtYXNrICBTUmF0ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiU1QgVXNnIENUICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgRyBkYiAgTCBkQiAgUiBkQiAgVlMgZEIgIgorICAgICAgICAgICAgICAgICAgICAgICAgIiAgU2VydmVyIEZybUNudCAgRnJtUmR5IEYgVW5kZXJydW5zICBGbHVzaGVkIgorICAgICAgICAgICAgICAgICAgICAgICAgIiVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaXNTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKCkgPyAiICAgTGF0ZW5jeSIgOiAiIik7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSkKQEAgLTUxOCw3ICs2NTgsNyBAQAogICAgIHN3aXRjaCAobVR5cGUpIHsKICAgICBjYXNlIFRZUEVfREVGQVVMVDoKICAgICBjYXNlIFRZUEVfT1VUUFVUOgotICAgICAgICBpZiAobVNoYXJlZEJ1ZmZlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChpc1N0YXRpYygpKSB7CiAgICAgICAgICAgICB0cmFja1R5cGUgPSAnUyc7IC8vIHN0YXRpYwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdHJhY2tUeXBlID0gJyAnOyAvLyBub3JtYWwKQEAgLTUzMiwxMyArNjcyLDkgQEAKICAgICB9CiAKICAgICBpZiAoaXNGYXN0VHJhY2soKSkgewotICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJGJWMgJTNkIiwgdHJhY2tUeXBlLCBtRmFzdEluZGV4KTsKLSAgICB9IGVsc2UgaWYgKG1OYW1lID09IFRSQUNLX05BTUVfUEVORElORykgewotICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlYyBwZW5kIiwgdHJhY2tUeXBlKTsKLSAgICB9IGVsc2UgaWYgKG1OYW1lID09IFRSQUNLX05BTUVfRkFJTFVSRSkgewotICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlYyBmYWlsIiwgdHJhY2tUeXBlKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiRiVkICVjICU2ZCIsIG1GYXN0SW5kZXgsIHRyYWNrVHlwZSwgbUlkKTsKICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlYyAlNGQiLCB0cmFja1R5cGUsIG1OYW1lKTsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICAgJWMgJTZkIiwgdHJhY2tUeXBlLCBtSWQpOwogICAgIH0KIAogICAgIGNoYXIgbm93SW5VbmRlcnJ1bjsKQEAgLTU5MywyMiArNzI5LDI3IEBACiAgICAgICAgICAgICA/ICdyJyAvKiBidWZmZXIgcmVkdWNlZCAqLzogYnVmZmVyU2l6ZUluRnJhbWVzID4gbUZyYW1lQ291bnQKICAgICAgICAgICAgICAgICAgICAgPyAnZScgLyogZXJyb3IgKi8gOiAnICcgLyogaWRlbnRpY2FsICovOwogCi0gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTdzICU2dSAlN3UgJTJzIDB4JTAzWCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiJTA4WCAlMDhYICU2dSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiJTJ1ICU1LjJnICU1LjJnICU1LjJnJWMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwOFggJTZ6dSVjICU2enUgJWMgJTl1JWMgJTd1ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMDh6WCAlMDh6WFxuIiwKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlN3MgJTZ1ICU3dSAlN3UgJTJzIDB4JTAzWCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiJTA4WCAlMDhYICU2dSAiCisgICAgICAgICAgICAgICAgICAgICAgICAiJTJ1ICUzeCAlMnggIgorICAgICAgICAgICAgICAgICAgICAgICAgIiU1LjJnICU1LjJnICU1LjJnICU1LjJnJWMgIgorICAgICAgICAgICAgICAgICAgICAgICAgIiUwOFggJTZ6dSVjICU2enUgJWMgJTl1JWMgJTd1IiwKICAgICAgICAgICAgIGFjdGl2ZSA/ICJ5ZXMiIDogIm5vIiwKLSAgICAgICAgICAgIChtQ2xpZW50ID09IDApID8gZ2V0cGlkX2NhY2hlZCA6IG1DbGllbnQtPnBpZCgpLAorICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWQoKSA6IG1DbGllbnQtPnBpZCgpLAogICAgICAgICAgICAgbVNlc3Npb25JZCwKKyAgICAgICAgICAgIG1Qb3J0SWQsCiAgICAgICAgICAgICBnZXRUcmFja1N0YXRlU3RyaW5nKCksCiAgICAgICAgICAgICBtQ2Jsay0+bUZsYWdzLAogCiAgICAgICAgICAgICBtRm9ybWF0LAogICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAotICAgICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+Z2V0U2FtcGxlUmF0ZSgpLAorICAgICAgICAgICAgc2FtcGxlUmF0ZSgpLAogCiAgICAgICAgICAgICBtU3RyZWFtVHlwZSwKKyAgICAgICAgICAgIG1BdHRyLnVzYWdlLAorICAgICAgICAgICAgbUF0dHIuY29udGVudF90eXBlLAorCisgICAgICAgICAgICAyMC4wICogbG9nMTAobUZpbmFsVm9sdW1lKSwKICAgICAgICAgICAgIDIwLjAgKiBsb2cxMChmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX2xlZnQodmxyKSkpLAogICAgICAgICAgICAgMjAuMCAqIGxvZzEwKGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfcmlnaHQodmxyKSkpLAogICAgICAgICAgICAgMjAuMCAqIGxvZzEwKHZzVm9sdW1lLmZpcnN0KSwgLy8gVm9sdW1lU2hhcGVyKHMpIHRvdGFsIHZvbHVtZQpAQCAtNjIxLDExICs3NjIsMjEgQEAKICAgICAgICAgICAgIGZpbGxpbmdTdGF0dXMsCiAgICAgICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRVbmRlcnJ1bkZyYW1lcygpLAogICAgICAgICAgICAgbm93SW5VbmRlcnJ1biwKLSAgICAgICAgICAgICh1bnNpZ25lZCltQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNGbHVzaGVkKCkgJSAxMDAwMDAwMCwKLQotICAgICAgICAgICAgKHNpemVfdCltTWFpbkJ1ZmZlciwgLy8gdXNlICV6WCBhcyAlcCBhcHBlbmRzIDB4Ci0gICAgICAgICAgICAoc2l6ZV90KW1BdXhCdWZmZXIgICAvLyB1c2UgJXpYIGFzICVwIGFwcGVuZHMgMHgKKyAgICAgICAgICAgICh1bnNpZ25lZCltQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNGbHVzaGVkKCkgJSAxMDAwMDAwMAogICAgICAgICAgICAgKTsKKworICAgIGlmIChpc1NlcnZlckxhdGVuY3lTdXBwb3J0ZWQoKSkgeworICAgICAgICBkb3VibGUgbGF0ZW5jeU1zOworICAgICAgICBib29sIGZyb21UcmFjazsKKyAgICAgICAgaWYgKGdldFRyYWNrTGF0ZW5jeU1zKCZsYXRlbmN5TXMsICZmcm9tVHJhY2spID09IE9LKSB7CisgICAgICAgICAgICAvLyBTaG93IGxhdGVuY3kgaW4gbXNlYywgZm9sbG93ZWQgYnkgJ3QnIGlmIGZyb20gdHJhY2sgdGltZXN0YW1wICh0aGUgbW9zdCBhY2N1cmF0ZSkKKyAgICAgICAgICAgIC8vIG9yICdrJyBpZiBlc3RpbWF0ZWQgZnJvbSBrZXJuZWwgYmVjYXVzZSB0cmFjayBmcmFtZXMgaGF2ZW4ndCBiZWVuIHByZXNlbnRlZCB5ZXQuCisgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgJTcuMmxmICVjIiwgbGF0ZW5jeU1zLCBmcm9tVHJhY2sgPyAndCcgOiAnaycpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTEwcyIsIG1DYmxrLT5tU2VydmVyICE9IDAgPyAidW5hdmFpbCIgOiAibmV3Iik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKIH0KIAogdWludDMyX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnNhbXBsZVJhdGUoKSBjb25zdCB7CkBAIC02MzMsOCArNzg0LDcgQEAKIH0KIAogLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpnZXROZXh0QnVmZmVyKAotICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQogewogICAgIFNlcnZlclByb3h5OjpCdWZmZXIgYnVmOwogICAgIHNpemVfdCBkZXNpcmVkRnJhbWVzID0gYnVmZmVyLT5mcmFtZUNvdW50OwpAQCAtNjQzLDE2ICs3OTMsNzIgQEAKICAgICBidWZmZXItPmZyYW1lQ291bnQgPSBidWYubUZyYW1lQ291bnQ7CiAgICAgYnVmZmVyLT5yYXcgPSBidWYubVJhdzsKICAgICBpZiAoYnVmLm1GcmFtZUNvdW50ID09IDAgJiYgIWlzU3RvcHBpbmcoKSAmJiAhaXNTdG9wcGVkKCkgJiYgIWlzUGF1c2VkKCkpIHsKLSAgICAgICAgQUxPR1YoInVuZGVycnVuLCAgZnJhbWVzUmVhZHkoJXp1KSA8IGZyYW1lc0Rlc2lyZWQoJXpkKSwgc3RhdGU6ICVkIiwKLSAgICAgICAgICAgICAgICBidWYubUZyYW1lQ291bnQsIGRlc2lyZWRGcmFtZXMsIG1TdGF0ZSk7CisgICAgICAgIEFMT0dWKCIlcyglZCk6IHVuZGVycnVuLCAgZnJhbWVzUmVhZHkoJXp1KSA8IGZyYW1lc0Rlc2lyZWQoJXpkKSwgc3RhdGU6ICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBidWYubUZyYW1lQ291bnQsIGRlc2lyZWRGcmFtZXMsIG1TdGF0ZSk7CiAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPnRhbGx5VW5kZXJydW5GcmFtZXMoZGVzaXJlZEZyYW1lcyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcygwKTsKICAgICB9Ci0KICAgICByZXR1cm4gc3RhdHVzOwogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpyZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQoreworICAgIGludGVyY2VwdEJ1ZmZlcigqYnVmZmVyKTsKKyAgICBUcmFja0Jhc2U6OnJlbGVhc2VCdWZmZXIoYnVmZmVyKTsKK30KKworLy8gVE9ETzogY29tcGVuc2F0ZSBmb3IgdGltZSBzaGlmdCBiZXR3ZWVuIEhXIG1vZHVsZXMuCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjppbnRlcmNlcHRCdWZmZXIoCisgICAgICAgIGNvbnN0IEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciYgc291cmNlQnVmZmVyKSB7CisgICAgYXV0byBzdGFydCA9IHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpOworICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0gc291cmNlQnVmZmVyLmZyYW1lQ291bnQ7CisgICAgaWYgKGZyYW1lQ291bnQgPT0gMCkgeworICAgICAgICByZXR1cm47ICAvLyBObyBhdWRpbyB0byBpbnRlcmNlcHQuCisgICAgICAgIC8vIEFkZGl0aW9uYWxseSBQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXI6Om9idGFpbkJ1ZmZlciAoY2FsbGVkIGJ5IFBhdGhUcmFjazo6Z2V0TmV4dEJ1ZmZlcikKKyAgICAgICAgLy8gZG9lcyBub3QgYWxsb3cgMCBmcmFtZSBzaXplIHJlcXVlc3QgY29udHJhcnkgdG8gZ2V0TmV4dEJ1ZmZlcgorICAgIH0KKyAgICBmb3IgKGF1dG8mIHRlZVBhdGNoIDogbVRlZVBhdGNoZXMpIHsKKyAgICAgICAgUmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZCogcGF0Y2hSZWNvcmQgPSB0ZWVQYXRjaC5wYXRjaFJlY29yZC5nZXQoKTsKKworICAgICAgICBzaXplX3QgZnJhbWVzV3JpdHRlbiA9IHdyaXRlRnJhbWVzKHBhdGNoUmVjb3JkLCBzb3VyY2VCdWZmZXIuaTgsIGZyYW1lQ291bnQpOworICAgICAgICAvLyBPbiBidWZmZXIgd3JhcCwgdGhlIGJ1ZmZlciBmcmFtZSBjb3VudCB3aWxsIGJlIGxlc3MgdGhhbiByZXF1ZXN0ZWQsCisgICAgICAgIC8vIHdoZW4gdGhpcyBoYXBwZW5zIGEgc2Vjb25kIGJ1ZmZlciBuZWVkcyB0byBiZSB1c2VkIHRvIHdyaXRlIHRoZSBsZWZ0b3ZlciBhdWRpbworICAgICAgICBzaXplX3QgZnJhbWVzTGVmdCA9IGZyYW1lQ291bnQgLSBmcmFtZXNXcml0dGVuOworICAgICAgICBpZiAoZnJhbWVzV3JpdHRlbiAhPSAwICYmIGZyYW1lc0xlZnQgIT0gMCkgeworICAgICAgICAgICAgZnJhbWVzV3JpdHRlbiArPQorICAgICAgICAgICAgICAgIHdyaXRlRnJhbWVzKHBhdGNoUmVjb3JkLCBzb3VyY2VCdWZmZXIuaTggKyBmcmFtZXNXcml0dGVuICogbUZyYW1lU2l6ZSwgZnJhbWVzTGVmdCk7CisgICAgICAgICAgICBmcmFtZXNMZWZ0ID0gZnJhbWVDb3VudCAtIGZyYW1lc1dyaXR0ZW47CisgICAgICAgIH0KKyAgICAgICAgQUxPR1dfSUYoZnJhbWVzTGVmdCAhPSAwLCAiJXMoJWQpIFBhdGNoUmVjb3JkICVkIGNhbiBub3QgcHJvdmlkZSBiaWcgZW5vdWdoICIKKyAgICAgICAgICAgICAgICAgImJ1ZmZlciAlenUvJXp1LCBkcm9wcGluZyAlenUgZnJhbWVzIiwgX19mdW5jX18sIG1JZCwgcGF0Y2hSZWNvcmQtPm1JZCwKKyAgICAgICAgICAgICAgICAgZnJhbWVzV3JpdHRlbiwgZnJhbWVDb3VudCwgZnJhbWVzTGVmdCk7CisgICAgfQorICAgIGF1dG8gc3BlbnQgPSBjZWlsPHN0ZDo6Y2hyb25vOjptaWNyb3NlY29uZHM+KHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpIC0gc3RhcnQpOworICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKKyAgICAvLyBBdmVyYWdlIGlzIH4yMHVzIHBlciB0cmFjaywgdGhpcyBzaG91bGQgdmlydHVhbGx5IG5ldmVyIGJlIGxvZ2dlZCAoTG9nZ2luZyB0YWtlcyA+MjAwdXMpCisgICAgQUxPR0RfSUYoc3BlbnQgPiAyMDB1cywgIiVzOiB0b29rICVsbGR1cyB0byBpbnRlcmNlcHQgJXp1IHRyYWNrcyIsIF9fZnVuY19fLAorICAgICAgICAgICAgIHNwZW50LmNvdW50KCksIG1UZWVQYXRjaGVzLnNpemUoKSk7Cit9CisKK3NpemVfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6d3JpdGVGcmFtZXMoQXVkaW9CdWZmZXJQcm92aWRlciogZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCkgeworICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciBwYXRjaEJ1ZmZlcjsKKyAgICBwYXRjaEJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKKyAgICBhdXRvIHN0YXR1cyA9IGRlc3QtPmdldE5leHRCdWZmZXIoJnBhdGNoQnVmZmVyKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgQUxPR1coIiVzIFBhdGhSZWNvcmQgZ2V0TmV4dEJ1ZmZlciBmYWlsZWQgd2l0aCBlcnJvciAlZDogJXMiLAorICAgICAgICAgICAgIF9fZnVuY19fLCBzdGF0dXMsIHN0cmVycm9yKC1zdGF0dXMpKTsKKyAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgQUxPR19BU1NFUlQocGF0Y2hCdWZmZXIuZnJhbWVDb3VudCA8PSBmcmFtZUNvdW50KTsKKyAgICBtZW1jcHkocGF0Y2hCdWZmZXIucmF3LCBzcmMsIHBhdGNoQnVmZmVyLmZyYW1lQ291bnQgKiBtRnJhbWVTaXplKTsKKyAgICBhdXRvIGZyYW1lc1dyaXR0ZW4gPSBwYXRjaEJ1ZmZlci5mcmFtZUNvdW50OworICAgIGRlc3QtPnJlbGVhc2VCdWZmZXIoJnBhdGNoQnVmZmVyKTsKKyAgICByZXR1cm4gZnJhbWVzV3JpdHRlbjsKK30KKwogLy8gcmVsZWFzZUJ1ZmZlcigpIGlzIG5vdCBvdmVycmlkZGVuCiAKIC8vIEV4dGVuZGVkQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKQEAgLTY4Miw2ICs4ODgsMTMgQEAKICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5zZXRUaW1lc3RhbXAodGltZXN0YW1wKTsKIAogICAgIC8vIFdlIGRvIG5vdCBzZXQgZHJhaW5lZCBoZXJlLCBhcyBGYXN0VHJhY2sgdGltZXN0YW1wIG1heSBub3QgZ28gdG8gdmVyeSBsYXN0IGZyYW1lLgorCisgICAgLy8gQ29tcHV0ZSBsYXRlbmN5LgorICAgIC8vIFRPRE86IENvbnNpZGVyIHdoZXRoZXIgdGhlIHNlcnZlciBsYXRlbmN5IG1heSBiZSBwYXNzZWQgaW4gYnkgRmFzdE1peGVyCisgICAgLy8gYXMgYSBjb25zdGFudCBmb3IgYWxsIGFjdGl2ZSBGYXN0VHJhY2tzLgorICAgIGNvbnN0IGRvdWJsZSBsYXRlbmN5TXMgPSB0aW1lc3RhbXAuZ2V0T3V0cHV0U2VydmVyTGF0ZW5jeU1zKHNhbXBsZVJhdGUoKSk7CisgICAgbVNlcnZlckxhdGVuY3lGcm9tVHJhY2suc3RvcmUodHJ1ZSk7CisgICAgbVNlcnZlckxhdGVuY3lNcy5zdG9yZShsYXRlbmN5TXMpOwogfQogCiAvLyBEb24ndCBjYWxsIGZvciBmYXN0IHRyYWNrczsgdGhlIGZyYW1lc1JlYWR5KCkgY291bGQgcmVzdWx0IGluIHByaW9yaXR5IGludmVyc2lvbgpAQCAtNzEwLDggKzkyMyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHRyaWdnZXJTZXNzaW9uIF9fdW51c2VkKQogewogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIEFMT0dWKCJzdGFydCglZCksIGNhbGxpbmcgcGlkICVkIHNlc3Npb24gJWQiLAotICAgICAgICAgICAgbU5hbWUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwgbVNlc3Npb25JZCk7CisgICAgQUxPR1YoIiVzKCVkKTogY2FsbGluZyBwaWQgJWQgc2Vzc2lvbiAlZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksIG1TZXNzaW9uSWQpOwogCiAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgaWYgKHRocmVhZCAhPSAwKSB7CkBAIC03MzcsMTQgKzk1MCwxNyBAQAogICAgICAgICAgICAgaWYgKG1SZXN1bWVUb1N0b3BwaW5nKSB7CiAgICAgICAgICAgICAgICAgLy8gaGFwcGVuZWQgd2UgbmVlZCB0byByZXN1bWUgdG8gU1RPUFBJTkdfMQogICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFRyYWNrQmFzZTo6U1RPUFBJTkdfMTsKLSAgICAgICAgICAgICAgICBBTE9HVigiUEFVU0VEID0+IFNUT1BQSU5HXzEgKCVkKSBvbiB0aHJlYWQgJXAiLCBtTmFtZSwgdGhpcyk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogUEFVU0VEID0+IFNUT1BQSU5HXzEgb24gdGhyZWFkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIChpbnQpbVRocmVhZElvSGFuZGxlKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgbVN0YXRlID0gVHJhY2tCYXNlOjpSRVNVTUlORzsKLSAgICAgICAgICAgICAgICBBTE9HVigiUEFVU0VEID0+IFJFU1VNSU5HICglZCkgb24gdGhyZWFkICVwIiwgbU5hbWUsIHRoaXMpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IFBBVVNFRCA9PiBSRVNVTUlORyBvbiB0aHJlYWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sICBtSWQsIChpbnQpbVRocmVhZElvSGFuZGxlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1TdGF0ZSA9IFRyYWNrQmFzZTo6QUNUSVZFOwotICAgICAgICAgICAgQUxPR1YoIj8gPT4gQUNUSVZFICglZCkgb24gdGhyZWFkICVwIiwgbU5hbWUsIHRoaXMpOworICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogPyA9PiBBQ1RJVkUgb24gdGhyZWFkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgKGludCltVGhyZWFkSW9IYW5kbGUpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gc3RhdGVzIHRvIHJlc2V0IHBvc2l0aW9uIGluZm8gZm9yIG5vbi1vZmZsb2FkZWQvZGlyZWN0IHRyYWNrcwpAQCAtNzkwLDEyICsxMDA2LDE1IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgIH0KKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIGZvckVhY2hUZWVQYXRjaFRyYWNrKFtdKGF1dG8gcGF0Y2hUcmFjaykgeyBwYXRjaFRyYWNrLT5zdGFydCgpOyB9KTsKKyAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6c3RvcCgpCiB7Ci0gICAgQUxPR1YoInN0b3AoJWQpLCBjYWxsaW5nIHBpZCAlZCIsIG1OYW1lLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOworICAgIEFMT0dWKCIlcyglZCk6IGNhbGxpbmcgcGlkICVkIiwgX19mdW5jX18sIG1JZCwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKICAgICBpZiAodGhyZWFkICE9IDApIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOwpAQCAtODE5LDE1ICsxMDM4LDE2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgcGxheWJhY2tUaHJlYWQtPmJyb2FkY2FzdF9sKCk7Ci0gICAgICAgICAgICBBTE9HVigibm90IHN0b3BwaW5nL3N0b3BwZWQgPT4gc3RvcHBpbmcvc3RvcHBlZCAoJWQpIG9uIHRocmVhZCAlcCIsIG1OYW1lLAotICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1RocmVhZCk7CisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBub3Qgc3RvcHBpbmcvc3RvcHBlZCA9PiBzdG9wcGluZy9zdG9wcGVkIG9uIHRocmVhZCAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIChpbnQpbVRocmVhZElvSGFuZGxlKTsKICAgICAgICAgfQogICAgIH0KKyAgICBmb3JFYWNoVGVlUGF0Y2hUcmFjayhbXShhdXRvIHBhdGNoVHJhY2spIHsgcGF0Y2hUcmFjay0+c3RvcCgpOyB9KTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6cGF1c2UoKQogewotICAgIEFMT0dWKCJwYXVzZSglZCksIGNhbGxpbmcgcGlkICVkIiwgbU5hbWUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CisgICAgQUxPR1YoIiVzKCVkKTogY2FsbGluZyBwaWQgJWQiLCBfX2Z1bmNfXywgbUlkLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOwogICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CkBAIC04NDIsMTEgKzEwNjIsMTIgQEAKIAogICAgICAgICAgICAgLy8gT2ZmbG9hZGVkIHRyYWNrIHdhcyBkcmFpbmluZywgd2UgbmVlZCB0byBjYXJyeSBvbiBkcmFpbmluZyB3aGVuIHJlc3VtZWQKICAgICAgICAgICAgIG1SZXN1bWVUb1N0b3BwaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaC4uLgorICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgICAgIGNhc2UgQUNUSVZFOgogICAgICAgICBjYXNlIFJFU1VNSU5HOgogICAgICAgICAgICAgbVN0YXRlID0gUEFVU0lORzsKLSAgICAgICAgICAgIEFMT0dWKCJBQ1RJVkUvUkVTVU1JTkcgPT4gUEFVU0lORyAoJWQpIG9uIHRocmVhZCAlcCIsIG1OYW1lLCB0aHJlYWQuZ2V0KCkpOworICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogQUNUSVZFL1JFU1VNSU5HID0+IFBBVVNJTkcgb24gdGhyZWFkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgKGludCltVGhyZWFkSW9IYW5kbGUpOwogICAgICAgICAgICAgcGxheWJhY2tUaHJlYWQtPmJyb2FkY2FzdF9sKCk7CiAgICAgICAgICAgICBicmVhazsKIApAQCAtODU0LDExICsxMDc1LDEzIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KKyAgICAvLyBQYXVzaW5nIHRoZSBUZWVQYXRjaCB0byBhdm9pZCBhIGdsaXRjaCBvbiB1bmRlcnJ1biwgYXQgdGhlIGNvc3Qgb2YgYnVmZmVyZWQgYXVkaW8gbG9zcy4KKyAgICBmb3JFYWNoVGVlUGF0Y2hUcmFjayhbXShhdXRvIHBhdGNoVHJhY2spIHsgcGF0Y2hUcmFjay0+cGF1c2UoKTsgfSk7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmZsdXNoKCkKIHsKLSAgICBBTE9HVigiZmx1c2goJWQpIiwgbU5hbWUpOworICAgIEFMT0dWKCIlcyglZCkiLCBfX2Z1bmNfXywgbUlkKTsKICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKICAgICBpZiAodGhyZWFkICE9IDApIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOwpAQCAtODgwLDExICsxMTAzLDEyIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBBTE9HVigiZmx1c2g6IG9mZmxvYWQgZmx1c2giKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IG9mZmxvYWQgZmx1c2giLCBfX2Z1bmNfXywgbUlkKTsKICAgICAgICAgICAgIHJlc2V0KCk7CiAKICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RPUFBJTkdfMSB8fCBtU3RhdGUgPT0gU1RPUFBJTkdfMikgewotICAgICAgICAgICAgICAgIEFMT0dWKCJmbHVzaGVkIGluIFNUT1BQSU5HXzEgb3IgMiBzdGF0ZSwgY2hhbmdlIHN0YXRlIHRvIEFDVElWRSIpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IGZsdXNoZWQgaW4gU1RPUFBJTkdfMSBvciAyIHN0YXRlLCBjaGFuZ2Ugc3RhdGUgdG8gQUNUSVZFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQpOwogICAgICAgICAgICAgICAgIG1TdGF0ZSA9IEFDVElWRTsKICAgICAgICAgICAgIH0KIApAQCAtOTE0LDYgKzExMzgsOCBAQAogICAgICAgICAvLyBiZWNhdXNlIHRoZSBoYXJkd2FyZSBidWZmZXIgY291bGQgaG9sZCBhIGxhcmdlIGFtb3VudCBvZiBhdWRpbwogICAgICAgICBwbGF5YmFja1RocmVhZC0+YnJvYWRjYXN0X2woKTsKICAgICB9CisgICAgLy8gRmx1c2ggdGhlIFRlZSB0byBhdm9pZCBvbiByZXN1bWUgcGxheWluZyBvbGQgZGF0YSBhbmQgZ2xpdGNoaW5nIG9uIHRoZSB0cmFuc2l0aW9uIHRvIG5ldyBkYXRhCisgICAgZm9yRWFjaFRlZVBhdGNoVHJhY2soW10oYXV0byBwYXRjaFRyYWNrKSB7IHBhdGNoVHJhY2stPmZsdXNoKCk7IH0pOwogfQogCiAvLyBtdXN0IGJlIGNhbGxlZCB3aXRoIHRocmVhZCBsb2NrIGhlbGQKQEAgLTk0OSw3ICsxMTc1LDcgQEAKIHsKICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKICAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgQUxPR0UoInRocmVhZCBpcyBkZWFkIik7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IHRocmVhZCBpcyBkZWFkIiwgX19mdW5jX18sIG1JZCk7CiAgICAgICAgIHJldHVybiBGQUlMRURfVFJBTlNBQ1RJT047CiAgICAgfSBlbHNlIGlmICgodGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6RElSRUNUKSB8fAogICAgICAgICAgICAgICAgICAgICAodGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6T0ZGTE9BRCkpIHsKQEAgLTk1OSw2ICsxMTg1LDE5IEBACiAgICAgfQogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6c2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwKKyAgICAgICAgaW50IHByb2dyYW1JZCkgeworICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgIGlmICh0aHJlYWQgPT0gMCkgeworICAgICAgICBBTE9HRSgidGhyZWFkIGlzIGRlYWQiKTsKKyAgICAgICAgcmV0dXJuIEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9IGVsc2UgaWYgKCh0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpESVJFQ1QpIHx8ICh0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpPRkZMT0FEKSkgeworICAgICAgICBEaXJlY3RPdXRwdXRUaHJlYWQgKmRpcmVjdE91dHB1dFRocmVhZCA9IHN0YXRpY19jYXN0PERpcmVjdE91dHB1dFRocmVhZCo+KHRocmVhZC5nZXQoKSk7CisgICAgICAgIHJldHVybiBkaXJlY3RPdXRwdXRUaHJlYWQtPnNlbGVjdFByZXNlbnRhdGlvbihwcmVzZW50YXRpb25JZCwgcHJvZ3JhbUlkKTsKKyAgICB9CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCiBWb2x1bWVTaGFwZXI6OlN0YXR1cyBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6YXBwbHlWb2x1bWVTaGFwZXIoCiAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCiAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKQpAQCAtOTY5LDggKzEyMDgsMTAgQEAKICAgICAgICAgY29uc3QgVm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uOjpPcHRpb25GbGFnIG9wdGlvbkZsYWcKICAgICAgICAgICAgID0gY29uZmlndXJhdGlvbi0+Z2V0T3B0aW9uRmxhZ3MoKTsKICAgICAgICAgaWYgKChvcHRpb25GbGFnICYgVm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uOjpPUFRJT05fRkxBR19DTE9DS19USU1FKSA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiJXMgdHJhY2tzIGRvIG5vdCBzdXBwb3J0IGZyYW1lIGNvdW50ZWQgVm9sdW1lU2hhcGVyLCIKLSAgICAgICAgICAgICAgICAgICAgIiB1c2luZyBjbG9jayB0aW1lIGluc3RlYWQiLCBpc09mZmxvYWRlZCgpID8gIk9mZmxvYWQiIDogIkRpcmVjdCIpOworICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogJXMgdHJhY2tzIGRvIG5vdCBzdXBwb3J0IGZyYW1lIGNvdW50ZWQgVm9sdW1lU2hhcGVyLCIKKyAgICAgICAgICAgICAgICAgICAgIiB1c2luZyBjbG9jayB0aW1lIGluc3RlYWQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLAorICAgICAgICAgICAgICAgICAgICBpc09mZmxvYWRlZCgpID8gIk9mZmxvYWQiIDogIkRpcmVjdCIpOwogICAgICAgICAgICAgbmV3Q29uZmlndXJhdGlvbiA9IG5ldyBWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24oKmNvbmZpZ3VyYXRpb24pOwogICAgICAgICAgICAgbmV3Q29uZmlndXJhdGlvbi0+c2V0T3B0aW9uRmxhZ3MoCiAgICAgICAgICAgICAgICAgVm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uOjpPcHRpb25GbGFnKG9wdGlvbkZsYWcKQEAgLTk4NSw3ICsxMjI2LDcgQEAKICAgICAgICAgLy8gU2lnbmFsIHRocmVhZCB0byBmZXRjaCBuZXcgdm9sdW1lLgogICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKICAgICAgICAgaWYgKHRocmVhZCAhPSAwKSB7Ci0gICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOwogICAgICAgICAgICAgdGhyZWFkLT5icm9hZGNhc3RfbCgpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTAxNyw2ICsxMjU4LDExIEBACiAgICAgfTsKIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6c2V0VGVlUGF0Y2hlcyhUZWVQYXRjaGVzIHRlZVBhdGNoZXMpIHsKKyAgICBmb3JFYWNoVGVlUGF0Y2hUcmFjayhbXShhdXRvIHBhdGNoVHJhY2spIHsgcGF0Y2hUcmFjay0+ZGVzdHJveSgpOyB9KTsKKyAgICBtVGVlUGF0Y2hlcyA9IHN0ZDo6bW92ZSh0ZWVQYXRjaGVzKTsKK30KKwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKQogewogICAgIGlmICghaXNPZmZsb2FkZWQoKSAmJiAhaXNEaXJlY3QoKSkgewpAQCAtMTAzNCw1NCArMTI4MCwyNSBAQAogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6YXR0YWNoQXV4RWZmZWN0KGludCBFZmZlY3RJZCkKIHsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBERUFEX09CSkVDVDsKICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKLSAgICBpZiAodGhyZWFkICE9IDApIHsKLSAgICAgICAgUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkID0gKFBsYXliYWNrVGhyZWFkICopdGhyZWFkLmdldCgpOwotICAgICAgICBzcDxBdWRpb0ZsaW5nZXI+IGFmID0gbUNsaWVudC0+YXVkaW9GbGluZ2VyKCk7CisgICAgaWYgKHRocmVhZCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CiAKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGFmLT5tTG9jayk7CisgICAgc3A8UGxheWJhY2tUaHJlYWQ+IGRzdFRocmVhZCA9IChQbGF5YmFja1RocmVhZCAqKXRocmVhZC5nZXQoKTsKKyAgICBzcDxQbGF5YmFja1RocmVhZD4gc3JjVGhyZWFkOyAvLyBzcmNUaHJlYWQgaXMgaW5pdGlhbGl6ZWQgYnkgY2FsbCB0byBtb3ZlQXV4RWZmZWN0VG9JbygpCisgICAgc3A8QXVkaW9GbGluZ2VyPiBhZiA9IG1DbGllbnQtPmF1ZGlvRmxpbmdlcigpOworICAgIHN0YXR1c190IHN0YXR1cyA9IGFmLT5tb3ZlQXV4RWZmZWN0VG9JbyhFZmZlY3RJZCwgZHN0VGhyZWFkLCAmc3JjVGhyZWFkKTsKIAotICAgICAgICBzcDxQbGF5YmFja1RocmVhZD4gc3JjVGhyZWFkID0gYWYtPmdldEVmZmVjdFRocmVhZF9sKEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwgRWZmZWN0SWQpOwotCi0gICAgICAgIGlmIChFZmZlY3RJZCAhPSAwICYmIHNyY1RocmVhZCAhPSAwICYmIHBsYXliYWNrVGhyZWFkICE9IHNyY1RocmVhZC5nZXQoKSkgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9kbChwbGF5YmFja1RocmVhZC0+bUxvY2spOwotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9zbChzcmNUaHJlYWQtPm1Mb2NrKTsKLSAgICAgICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IHNyY1RocmVhZC0+Z2V0RWZmZWN0Q2hhaW5fbChBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpOwotICAgICAgICAgICAgaWYgKGNoYWluID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0ID0gY2hhaW4tPmdldEVmZmVjdEZyb21JZF9sKEVmZmVjdElkKTsKLSAgICAgICAgICAgIGlmIChlZmZlY3QgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNyY1RocmVhZC0+cmVtb3ZlRWZmZWN0X2woZWZmZWN0KTsKLSAgICAgICAgICAgIHN0YXR1cyA9IHBsYXliYWNrVGhyZWFkLT5hZGRFZmZlY3RfbChlZmZlY3QpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHNyY1RocmVhZC0+YWRkRWZmZWN0X2woZWZmZWN0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyByZW1vdmVFZmZlY3RfbCgpIGhhcyBzdG9wcGVkIHRoZSBlZmZlY3QgaWYgaXQgd2FzIGFjdGl2ZSBzbyBpdCBtdXN0IGJlIHJlc3RhcnRlZAotICAgICAgICAgICAgaWYgKGVmZmVjdC0+c3RhdGUoKSA9PSBFZmZlY3RNb2R1bGU6OkFDVElWRSB8fAotICAgICAgICAgICAgICAgICAgICBlZmZlY3QtPnN0YXRlKCkgPT0gRWZmZWN0TW9kdWxlOjpTVE9QUElORykgewotICAgICAgICAgICAgICAgIGVmZmVjdC0+c3RhcnQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGRzdENoYWluID0gZWZmZWN0LT5jaGFpbigpLnByb21vdGUoKTsKLSAgICAgICAgICAgIGlmIChkc3RDaGFpbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgc3JjVGhyZWFkLT5hZGRFZmZlY3RfbChlZmZlY3QpOwotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjp1bnJlZ2lzdGVyRWZmZWN0KGVmZmVjdC0+aWQoKSk7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVnaXN0ZXJFZmZlY3QoJmVmZmVjdC0+ZGVzYygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1RocmVhZC0+aWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RDaGFpbi0+c3RyYXRlZ3koKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0LT5pZCgpKTsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzZXRFZmZlY3RFbmFibGVkKGVmZmVjdC0+aWQoKSwgZWZmZWN0LT5pc0VuYWJsZWQoKSk7CisgICAgaWYgKEVmZmVjdElkICE9IDAgJiYgc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIHN0YXR1cyA9IGRzdFRocmVhZC0+YXR0YWNoQXV4RWZmZWN0KHRoaXMsIEVmZmVjdElkKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgQXVkaW9TeXN0ZW06Om1vdmVFZmZlY3RzVG9JbyhzdGQ6OnZlY3RvcjxpbnQ+KEVmZmVjdElkKSwgZHN0VGhyZWFkLT5pZCgpKTsKICAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSBwbGF5YmFja1RocmVhZC0+YXR0YWNoQXV4RWZmZWN0KHRoaXMsIEVmZmVjdElkKTsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmIHNyY1RocmVhZCAhPSBudWxscHRyKSB7CisgICAgICAgIGFmLT5tb3ZlQXV4RWZmZWN0VG9JbyhFZmZlY3RJZCwgc3JjVGhyZWFkLCAmZHN0VGhyZWFkKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTExMDUsMTEgKzEzMjIsMTQgQEAKICAgICAvLyB0byBkZXRlY3Qgd2hlbiBhbGwgZnJhbWVzIGhhdmUgYmVlbiBwbGF5ZWQuIEluIHRoaXMgY2FzZSBmcmFtZXNXcml0dGVuIGlzbid0CiAgICAgLy8gdXNlZnVsIGJlY2F1c2UgaXQgZG9lc24ndCBhbHdheXMgcmVmbGVjdCB3aGV0aGVyIHRoZXJlIGlzIGRhdGEgaW4gdGhlIGgvdwogICAgIC8vIGJ1ZmZlcnMsIHBhcnRpY3VsYXJseSBpZiBhIHRyYWNrIGhhcyBiZWVuIHBhdXNlZCBhbmQgcmVzdW1lZCBkdXJpbmcgZHJhaW5pbmcKLSAgICBBTE9HVigicHJlc2VudGF0aW9uQ29tcGxldGUoKSBtUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMgJWxsZCBmcmFtZXNXcml0dGVuICVsbGQiLAorICAgIEFMT0dWKCIlcyglZCk6IHByZXNlbnRhdGlvbkNvbXBsZXRlKCkgbVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzICVsbGQgZnJhbWVzV3JpdHRlbiAlbGxkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsCiAgICAgICAgICAgICAobG9uZyBsb25nKW1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lcywgKGxvbmcgbG9uZylmcmFtZXNXcml0dGVuKTsKICAgICBpZiAobVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzID09IDApIHsKICAgICAgICAgbVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzID0gZnJhbWVzV3JpdHRlbiArIGF1ZGlvSGFsRnJhbWVzOwotICAgICAgICBBTE9HVigicHJlc2VudGF0aW9uQ29tcGxldGUoKSByZXNldDogbVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzICVsbGQgYXVkaW9IYWxGcmFtZXMgJXp1IiwKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogcHJlc2VudGF0aW9uQ29tcGxldGUoKSByZXNldDoiCisgICAgICAgICAgICAgICAgIiBtUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMgJWxsZCBhdWRpb0hhbEZyYW1lcyAlenUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsCiAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMsIGF1ZGlvSGFsRnJhbWVzKTsKICAgICB9CiAKQEAgLTExNzUsNyArMTM5NSw4IEBACiAgICAgaWYgKGlzVGVybWluYXRlZCgpIHx8IG1TdGF0ZSA9PSBQQVVTRUQgfHwKICAgICAgICAgICAgICgoZnJhbWVzUmVhZHkoKSA9PSAwKSAmJiAoKG1TaGFyZWRCdWZmZXIgIT0gMCkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1TdGF0ZSA9PSBTVE9QUEVEKSkpKSB7Ci0gICAgICAgIEFMT0dXKCJUcmFjazo6c2V0U3luY0V2ZW50KCkgaW4gaW52YWxpZCBzdGF0ZSAlZCBvbiBzZXNzaW9uICVkICVzIG1vZGUsIGZyYW1lc1JlYWR5ICV6dSIsCisgICAgICAgIEFMT0dXKCIlcyglZCk6IGluIGludmFsaWQgc3RhdGUgJWQgb24gc2Vzc2lvbiAlZCAlcyBtb2RlLCBmcmFtZXNSZWFkeSAlenUiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLAogICAgICAgICAgICAgICBtU3RhdGUsIG1TZXNzaW9uSWQsIChtU2hhcmVkQnVmZmVyICE9IDApID8gInN0YXRpYyIgOiAic3RyZWFtIiwgZnJhbWVzUmVhZHkoKSk7CiAgICAgICAgIGV2ZW50LT5jYW5jZWwoKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMTI0Niw3ICsxNDY3LDE3IEBACiAvL1RvIGJlIGNhbGxlZCB3aXRoIHRocmVhZCBsb2NrIGhlbGQKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnVwZGF0ZVRyYWNrRnJhbWVJbmZvKAogICAgICAgICBpbnQ2NF90IHRyYWNrRnJhbWVzUmVsZWFzZWQsIGludDY0X3Qgc2lua0ZyYW1lc1dyaXR0ZW4sCi0gICAgICAgIGNvbnN0IEV4dGVuZGVkVGltZXN0YW1wICZ0aW1lU3RhbXApIHsKKyAgICAgICAgdWludDMyX3QgaGFsU2FtcGxlUmF0ZSwgY29uc3QgRXh0ZW5kZWRUaW1lc3RhbXAgJnRpbWVTdGFtcCkgeworICAgLy8gTWFrZSB0aGUga2VybmVsIGZyYW1ldGltZSBhdmFpbGFibGUuCisgICAgY29uc3QgRnJhbWVUaW1lIGZ0eworICAgICAgICAgICAgdGltZVN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgIHRpbWVTdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdfTsKKyAgICAvLyBBTE9HRCgiRnJhbWVUaW1lOiAlbGxkICVsbGQiLCAobG9uZyBsb25nKWZ0LmZyYW1lcywgKGxvbmcgbG9uZylmdC50aW1lTnMpOworICAgIG1LZXJuZWxGcmFtZVRpbWUuc3RvcmUoZnQpOworICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgLy91cGRhdGUgZnJhbWUgbWFwCiAgICAgbUZyYW1lTWFwLnB1c2godHJhY2tGcmFtZXNSZWxlYXNlZCwgc2lua0ZyYW1lc1dyaXR0ZW4pOwogCkBAIC0xMjU1LDYgKzE0ODYsNyBAQAogICAgIC8vIE91ciB0aW1lc3RhbXBzIGFyZSBvbmx5IHVwZGF0ZWQgd2hlbiB0aGUgdHJhY2sgaXMgb24gdGhlIFRocmVhZCBhY3RpdmUgbGlzdC4KICAgICAvLyBXZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRyYWNrcyBhcmUgbm90IHJlbW92ZWQgYmVmb3JlIGZ1bGwgZHJhaW4uCiAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgbG9jYWwgPSB0aW1lU3RhbXA7CisgICAgYm9vbCBkcmFpbmVkID0gdHJ1ZTsgLy8gZGVmYXVsdCBhc3N1bWUgZHJhaW5lZCwgaWYgbm8gc2VydmVyIGluZm8gZm91bmQKICAgICBib29sIGNoZWNrZWQgPSBmYWxzZTsKICAgICBmb3IgKGludCBpID0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX01BWCAtIDE7CiAgICAgICAgICAgICBpID49IEV4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVI7IC0taSkgewpAQCAtMTI2MywyMSArMTQ5NSw2NCBAQAogICAgICAgICAgICAgbG9jYWwubVBvc2l0aW9uW2ldID0gbUZyYW1lTWFwLmZpbmRYKGxvY2FsLm1Qb3NpdGlvbltpXSk7CiAgICAgICAgICAgICAvLyBjaGVjayBkcmFpbiBzdGF0ZSBmcm9tIHRoZSBsYXRlc3Qgc3RhZ2UgaW4gdGhlIHBpcGVsaW5lLgogICAgICAgICAgICAgaWYgKCFjaGVja2VkICYmIGkgPD0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTCkgewotICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPnNldERyYWluZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbC5tUG9zaXRpb25baV0gPj0gbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVsZWFzZWQoKSk7CisgICAgICAgICAgICAgICAgZHJhaW5lZCA9IGxvY2FsLm1Qb3NpdGlvbltpXSA+PSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNSZWxlYXNlZCgpOwogICAgICAgICAgICAgICAgIGNoZWNrZWQgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIGlmICghY2hlY2tlZCkgeyAvLyBubyBzZXJ2ZXIgaW5mbywgYXNzdW1lIGRyYWluZWQuCi0gICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPnNldERyYWluZWQodHJ1ZSk7Ci0gICAgfQorCisgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+c2V0RHJhaW5lZChkcmFpbmVkKTsKICAgICAvLyBTZXQgY29ycmVjdGlvbiBmb3IgZmx1c2hlZCBmcmFtZXMgdGhhdCBhcmUgbm90IGFjY291bnRlZCBmb3IgaW4gcmVsZWFzZWQuCiAgICAgbG9jYWwubUZsdXNoZWQgPSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNGbHVzaGVkKCk7CiAgICAgbVNlcnZlclByb3h5LT5zZXRUaW1lc3RhbXAobG9jYWwpOworCisgICAgLy8gQ29tcHV0ZSBsYXRlbmN5IGluZm8uCisgICAgY29uc3QgYm9vbCB1c2VUcmFja1RpbWVzdGFtcCA9ICFkcmFpbmVkOworICAgIGNvbnN0IGRvdWJsZSBsYXRlbmN5TXMgPSB1c2VUcmFja1RpbWVzdGFtcAorICAgICAgICAgICAgPyBsb2NhbC5nZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXMoc2FtcGxlUmF0ZSgpKQorICAgICAgICAgICAgOiB0aW1lU3RhbXAuZ2V0T3V0cHV0U2VydmVyTGF0ZW5jeU1zKGhhbFNhbXBsZVJhdGUpOworCisgICAgbVNlcnZlckxhdGVuY3lGcm9tVHJhY2suc3RvcmUodXNlVHJhY2tUaW1lc3RhbXApOworICAgIG1TZXJ2ZXJMYXRlbmN5TXMuc3RvcmUobGF0ZW5jeU1zKTsKK30KKworYmluZGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OkF1ZGlvVmlicmF0aW9uQ29udHJvbGxlcjo6bXV0ZSgKKyAgICAgICAgLypvdXQqLyBib29sICpyZXQpIHsKKyAgICAqcmV0ID0gZmFsc2U7CisgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRyYWNrLT5tVGhyZWFkLnByb21vdGUoKTsKKyAgICBpZiAodGhyZWFkICE9IDApIHsKKyAgICAgICAgLy8gTG9jayBmb3IgdXBkYXRpbmcgbUhhcHRpY1BsYXliYWNrRW5hYmxlZC4KKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOworICAgICAgICBQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQgPSAoUGxheWJhY2tUaHJlYWQgKil0aHJlYWQuZ2V0KCk7CisgICAgICAgIGlmICgobVRyYWNrLT5jaGFubmVsTWFzaygpICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSAhPSBBVURJT19DSEFOTkVMX05PTkUKKyAgICAgICAgICAgICAgICAmJiBwbGF5YmFja1RocmVhZC0+bUhhcHRpY0NoYW5uZWxDb3VudCA+IDApIHsKKyAgICAgICAgICAgIG1UcmFjay0+c2V0SGFwdGljUGxheWJhY2tFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICpyZXQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworYmluZGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OkF1ZGlvVmlicmF0aW9uQ29udHJvbGxlcjo6dW5tdXRlKAorICAgICAgICAvKm91dCovIGJvb2wgKnJldCkgeworICAgICpyZXQgPSBmYWxzZTsKKyAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVHJhY2stPm1UaHJlYWQucHJvbW90ZSgpOworICAgIGlmICh0aHJlYWQgIT0gMCkgeworICAgICAgICAvLyBMb2NrIGZvciB1cGRhdGluZyBtSGFwdGljUGxheWJhY2tFbmFibGVkLgorICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CisgICAgICAgIFBsYXliYWNrVGhyZWFkICpwbGF5YmFja1RocmVhZCA9IChQbGF5YmFja1RocmVhZCAqKXRocmVhZC5nZXQoKTsKKyAgICAgICAgaWYgKChtVHJhY2stPmNoYW5uZWxNYXNrKCkgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpICE9IEFVRElPX0NIQU5ORUxfTk9ORQorICAgICAgICAgICAgICAgICYmIHBsYXliYWNrVGhyZWFkLT5tSGFwdGljQ2hhbm5lbENvdW50ID4gMCkgeworICAgICAgICAgICAgbVRyYWNrLT5zZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAqcmV0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkFGOjpPdXRwdXRUcmFjayIKIAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6T3V0cHV0VHJhY2s6Ok91dHB1dFRyYWNrKAogICAgICAgICAgICAgUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkLApAQCAtMTI5MSw3ICsxNTY2LDcgQEAKICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190e30gLyogY3VycmVudGx5IHVudXNlZCBmb3Igb3V0cHV0IHRyYWNrICovLAogICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICBudWxscHRyIC8qIGJ1ZmZlciAqLywgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sIG51bGxwdHIgLyogc2hhcmVkQnVmZmVyICovLAotICAgICAgICAgICAgICBBVURJT19TRVNTSU9OX05PTkUsIHVpZCwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgQVVESU9fU0VTU0lPTl9OT05FLCBnZXRwaWQoKSwgdWlkLCBBVURJT19PVVRQVVRfRkxBR19OT05FLAogICAgICAgICAgICAgICBUWVBFX09VVFBVVCksCiAgICAgbUFjdGl2ZShmYWxzZSksIG1Tb3VyY2VUaHJlYWQoc291cmNlVGhyZWFkKQogewpAQCAtMTI5OSw5ICsxNTc0LDkgQEAKICAgICBpZiAobUNibGsgIT0gTlVMTCkgewogICAgICAgICBtT3V0QnVmZmVyLmZyYW1lQ291bnQgPSAwOwogICAgICAgICBwbGF5YmFja1RocmVhZC0+bVRyYWNrcy5hZGQodGhpcyk7Ci0gICAgICAgIEFMT0dWKCJPdXRwdXRUcmFjayBjb25zdHJ1Y3RvciBtQ2JsayAlcCwgbUJ1ZmZlciAlcCwgIgorICAgICAgICBBTE9HVigiJXMoKTogbUNibGsgJXAsIG1CdWZmZXIgJXAsICIKICAgICAgICAgICAgICAgICAiZnJhbWVDb3VudCAlenUsIG1DaGFubmVsTWFzayAweCUwOHgiLAotICAgICAgICAgICAgICAgIG1DYmxrLCBtQnVmZmVyLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtQ2JsaywgbUJ1ZmZlciwKICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBtQ2hhbm5lbE1hc2spOwogICAgICAgICAvLyBzaW5jZSBjbGllbnQgYW5kIHNlcnZlciBhcmUgaW4gdGhlIHNhbWUgcHJvY2VzcywKICAgICAgICAgLy8gdGhlIGJ1ZmZlciBoYXMgdGhlIHNhbWUgdmlydHVhbCBhZGRyZXNzIG9uIGJvdGggc2lkZXMKQEAgLTEzMTEsNyArMTU4Niw4IEBACiAgICAgICAgIG1DbGllbnRQcm94eS0+c2V0U2VuZExldmVsKDAuMCk7CiAgICAgICAgIG1DbGllbnRQcm94eS0+c2V0U2FtcGxlUmF0ZShzYW1wbGVSYXRlKTsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygiRXJyb3IgY3JlYXRpbmcgb3V0cHV0IHRyYWNrIG9uIHRocmVhZCAlcCIsIHBsYXliYWNrVGhyZWFkKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogRXJyb3IgY3JlYXRpbmcgb3V0cHV0IHRyYWNrIG9uIHRocmVhZCAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgKGludCltVGhyZWFkSW9IYW5kbGUpOwogICAgIH0KIH0KIApAQCAtMTM0Miw3ICsxNjE4LDcgQEAKICAgICBtQWN0aXZlID0gZmFsc2U7CiB9CiAKLWJvb2wgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6T3V0cHV0VHJhY2s6OndyaXRlKHZvaWQqIGRhdGEsIHVpbnQzMl90IGZyYW1lcykKK3NzaXplX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6T3V0cHV0VHJhY2s6OndyaXRlKHZvaWQqIGRhdGEsIHVpbnQzMl90IGZyYW1lcykKIHsKICAgICBCdWZmZXIgKnBJbkJ1ZmZlcjsKICAgICBCdWZmZXIgaW5CdWZmZXI7CkBAIC0xMzczLDggKzE2NDksOSBAQAogICAgICAgICAgICAgbnNlY3NfdCBzdGFydFRpbWUgPSBzeXN0ZW1UaW1lKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvYnRhaW5CdWZmZXIoJm1PdXRCdWZmZXIsIHdhaXRUaW1lTGVmdE1zKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IE5PVF9FTk9VR0hfREFUQSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJPdXRwdXRUcmFjazo6d3JpdGUoKSAlcCB0aHJlYWQgJXAgbm8gbW9yZSBvdXRwdXQgYnVmZmVyczsgc3RhdHVzICVkIiwgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWQudW5zYWZlX2dldCgpLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IHRocmVhZCAlZCBubyBtb3JlIG91dHB1dCBidWZmZXJzOyBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpbVRocmVhZElvSGFuZGxlLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlckZ1bGwgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMTQxMCw4ICsxNjg3LDkgQEAKICAgICAgICAgICAgICAgICBpZiAocEluQnVmZmVyICE9ICZpbkJ1ZmZlcikgewogICAgICAgICAgICAgICAgICAgICBkZWxldGUgcEluQnVmZmVyOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HVigiT3V0cHV0VHJhY2s6OndyaXRlKCkgJXAgdGhyZWFkICVwIHJlbGVhc2VkIG92ZXJmbG93IGJ1ZmZlciAlenUiLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZC51bnNhZmVfZ2V0KCksIG1CdWZmZXJRdWV1ZS5zaXplKCkpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IHRocmVhZCAlZCByZWxlYXNlZCBvdmVyZmxvdyBidWZmZXIgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KW1UaHJlYWRJb0hhbmRsZSwgbUJ1ZmZlclF1ZXVlLnNpemUoKSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMTQyOSwxMSArMTcwNywxNCBAQAogICAgICAgICAgICAgICAgIHBJbkJ1ZmZlci0+cmF3ID0gcEluQnVmZmVyLT5tQnVmZmVyOwogICAgICAgICAgICAgICAgIG1lbWNweShwSW5CdWZmZXItPnJhdywgaW5CdWZmZXIucmF3LCBpbkJ1ZmZlci5mcmFtZUNvdW50ICogbUZyYW1lU2l6ZSk7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlclF1ZXVlLmFkZChwSW5CdWZmZXIpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJPdXRwdXRUcmFjazo6d3JpdGUoKSAlcCB0aHJlYWQgJXAgYWRkaW5nIG92ZXJmbG93IGJ1ZmZlciAlenUiLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZC51bnNhZmVfZ2V0KCksIG1CdWZmZXJRdWV1ZS5zaXplKCkpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IHRocmVhZCAlZCBhZGRpbmcgb3ZlcmZsb3cgYnVmZmVyICV6dSIsIF9fZnVuY19fLCBtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KW1UaHJlYWRJb0hhbmRsZSwgbUJ1ZmZlclF1ZXVlLnNpemUoKSk7CisgICAgICAgICAgICAgICAgLy8gYXVkaW8gZGF0YSBpcyBjb25zdW1lZCAoc3RvcmVkIGxvY2FsbHkpOyBzZXQgZnJhbWVDb3VudCB0byAwLgorICAgICAgICAgICAgICAgIGluQnVmZmVyLmZyYW1lQ291bnQgPSAwOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiT3V0cHV0VHJhY2s6OndyaXRlKCkgJXAgdGhyZWFkICVwIG5vIG1vcmUgb3ZlcmZsb3cgYnVmZmVycyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtVGhyZWFkLnVuc2FmZV9nZXQoKSwgdGhpcyk7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogdGhyZWFkICVkIG5vIG1vcmUgb3ZlcmZsb3cgYnVmZmVycyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCAoaW50KW1UaHJlYWRJb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogcmV0dXJuIGVycm9yIGZvciB0aGlzLgogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTQ0NCw3ICsxNzI1LDcgQEAKICAgICAgICAgc3RvcCgpOwogICAgIH0KIAotICAgIHJldHVybiBvdXRwdXRCdWZmZXJGdWxsOworICAgIHJldHVybiBmcmFtZXMgLSBpbkJ1ZmZlci5mcmFtZUNvdW50OyAgLy8gbnVtYmVyIG9mIGZyYW1lcyBjb25zdW1lZC4KIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpPdXRwdXRUcmFjazo6Y29weU1ldGFkYXRhVG8oTWV0YWRhdGFJbnNlcnRlciYgYmFja0luc2VydGVyKSBjb25zdApAQCAtMTQ5Niw2ICsxNzc3LDEwIEBACiAgICAgfQogfQogCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6UGF0Y2hUcmFjayIKKwogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6UGF0Y2hUcmFjayhQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKQEAgLTE1MDQsMzEgKzE3ODksMjkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGltZW91dCYgdGltZW91dCkKICAgICA6ICAgVHJhY2socGxheWJhY2tUaHJlYWQsIE5VTEwsIHN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdHt9IC8qIGN1cnJlbnRseSB1bnVzZWQgZm9yIHBhdGNoIHRyYWNrICovLAogICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZlclNpemUsIG51bGxwdHIgLyogc2hhcmVkQnVmZmVyICovLAotICAgICAgICAgICAgICBBVURJT19TRVNTSU9OX05PTkUsIGdldHVpZCgpLCBmbGFncywgVFlQRV9QQVRDSCksCi0gICAgICAgICAgICAgIG1Qcm94eShuZXcgQ2xpZW50UHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsIG1GcmFtZVNpemUsIHRydWUsIHRydWUpKQorICAgICAgICAgICAgICBBVURJT19TRVNTSU9OX05PTkUsIGdldHBpZCgpLCBBSURfQVVESU9TRVJWRVIsIGZsYWdzLCBUWVBFX1BBVENIKSwKKyAgICAgICAgUGF0Y2hUcmFja0Jhc2UobmV3IENsaWVudFByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LCBtRnJhbWVTaXplLCB0cnVlLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKnBsYXliYWNrVGhyZWFkLCB0aW1lb3V0KQogewotICAgIHVpbnQ2NF90IG1peEJ1ZmZlck5zID0gKCh1aW50NjRfdCkyICogcGxheWJhY2tUaHJlYWQtPmZyYW1lQ291bnQoKSAqIDEwMDAwMDAwMDApIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tUaHJlYWQtPnNhbXBsZVJhdGUoKTsKLSAgICBtUGVlclRpbWVvdXQudHZfc2VjID0gbWl4QnVmZmVyTnMgLyAxMDAwMDAwMDAwOwotICAgIG1QZWVyVGltZW91dC50dl9uc2VjID0gKGludCkgKG1peEJ1ZmZlck5zICUgMTAwMDAwMDAwMCk7Ci0KLSAgICBBTE9HVigiUGF0Y2hUcmFjayAlcCBzYW1wbGVSYXRlICVkIG1QZWVyVGltZW91dCAlZC4lMDNkIHNlYyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIHNhbXBsZVJhdGUsCisgICAgQUxPR1YoIiVzKCVkKTogc2FtcGxlUmF0ZSAlZCBtUGVlclRpbWVvdXQgJWQuJTAzZCBzZWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KW1QZWVyVGltZW91dC50dl9zZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpKG1QZWVyVGltZW91dC50dl9uc2VjIC8gMTAwMDAwMCkpOwogfQogCiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrOjp+UGF0Y2hUcmFjaygpCiB7CisgICAgQUxPR1YoIiVzKCVkKSIsIF9fZnVuY19fLCBtSWQpOwogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrOjpzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbikKIHsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBUcmFjazo6c3RhcnQoZXZlbnQsIHRyaWdnZXJTZXNzaW9uKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CkBAIC0xNTQyLDExICsxODI1LDExIEBACiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrOjpnZXROZXh0QnVmZmVyKAogICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKIHsKLSAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICJQYXRjaFRyYWNrOjpnZXROZXh0QnVmZmVyKCkgY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIpOworICAgIEFMT0dfQVNTRVJUKG1QZWVyUHJveHkgIT0gMCwgIiVzKCVkKTogY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIsIF9fZnVuY19fLCBtSWQpOwogICAgIFByb3h5OjpCdWZmZXIgYnVmOwogICAgIGJ1Zi5tRnJhbWVDb3VudCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUGVlclByb3h5LT5vYnRhaW5CdWZmZXIoJmJ1ZiwgJm1QZWVyVGltZW91dCk7Ci0gICAgQUxPR1ZfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCAiUGF0Y2hUcmFjaygpICVwIGdldE5leHRCdWZmZXIgc3RhdHVzICVkIiwgdGhpcywgc3RhdHVzKTsKKyAgICBBTE9HVl9JRihzdGF0dXMgIT0gTk9fRVJST1IsICIlcyglZCk6IGdldE5leHRCdWZmZXIgc3RhdHVzICVkIiwgX19mdW5jX18sIG1JZCwgc3RhdHVzKTsKICAgICBidWZmZXItPmZyYW1lQ291bnQgPSBidWYubUZyYW1lQ291bnQ7CiAgICAgaWYgKGJ1Zi5tRnJhbWVDb3VudCA9PSAwKSB7CiAgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKQEAgLTE1NTcsNyArMTg0MCw3IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKIHsKLSAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICJQYXRjaFRyYWNrOjpyZWxlYXNlQnVmZmVyKCkgY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIpOworICAgIEFMT0dfQVNTRVJUKG1QZWVyUHJveHkgIT0gMCwgIiVzKCVkKTogY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIsIF9fZnVuY19fLCBtSWQpOwogICAgIFByb3h5OjpCdWZmZXIgYnVmOwogICAgIGJ1Zi5tRnJhbWVDb3VudCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKICAgICBidWYubVJhdyA9IGJ1ZmZlci0+cmF3OwpAQCAtMTU5Miw3ICsxODc1LDcgQEAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6cmVzdGFydElmRGlzYWJsZWQoKQogewogICAgIGlmIChhbmRyb2lkX2F0b21pY19hbmQofkNCTEtfRElTQUJMRUQsICZtQ2Jsay0+bUZsYWdzKSAmIENCTEtfRElTQUJMRUQpIHsKLSAgICAgICAgQUxPR1coIlBhdGNoVHJhY2s6OnJlbGVhc2VCdWZmZXIoKSBkaXNhYmxlZCBkdWUgdG8gcHJldmlvdXMgdW5kZXJydW4sIHJlc3RhcnRpbmciKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogZGlzYWJsZWQgZHVlIHRvIHByZXZpb3VzIHVuZGVycnVuLCByZXN0YXJ0aW5nIiwgX19mdW5jX18sIG1JZCk7CiAgICAgICAgIHN0YXJ0KCk7CiAgICAgfQogfQpAQCAtMTYwMCw2ICsxODgzLDggQEAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vICAgICAgUmVjb3JkCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6UmVjb3JkSGFuZGxlIgogCiBBdWRpb0ZsaW5nZXI6OlJlY29yZEhhbmRsZTo6UmVjb3JkSGFuZGxlKAogICAgICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s+JiByZWNvcmRUcmFjaykKQEAgLTE2MTUsNyArMTkwMCw3IEBACiAKIGJpbmRlcjo6U3RhdHVzIEF1ZGlvRmxpbmdlcjo6UmVjb3JkSGFuZGxlOjpzdGFydChpbnQgLypBdWRpb1N5c3RlbTo6c3luY19ldmVudF90Ki8gZXZlbnQsCiAgICAgICAgIGludCAvKmF1ZGlvX3Nlc3Npb25fdCovIHRyaWdnZXJTZXNzaW9uKSB7Ci0gICAgQUxPR1YoIlJlY29yZEhhbmRsZTo6c3RhcnQoKSIpOworICAgIEFMT0dWKCIlcygpIiwgX19mdW5jX18pOwogICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QoCiAgICAgICAgIG1SZWNvcmRUcmFjay0+c3RhcnQoKEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QpZXZlbnQsIChhdWRpb19zZXNzaW9uX3QpIHRyaWdnZXJTZXNzaW9uKSk7CiB9CkBAIC0xNjI2LDE4ICsxOTExLDMyIEBACiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OnN0b3Bfbm9udmlydHVhbCgpIHsKLSAgICBBTE9HVigiUmVjb3JkSGFuZGxlOjpzdG9wKCkiKTsKKyAgICBBTE9HVigiJXMoKSIsIF9fZnVuY19fKTsKICAgICBtUmVjb3JkVHJhY2stPnN0b3AoKTsKIH0KIAogYmluZGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKAogICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcykgewotICAgIEFMT0dWKCJSZWNvcmRIYW5kbGU6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKCkiKTsKKyAgICBBTE9HVigiJXMoKSIsIF9fZnVuY19fKTsKICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKAogICAgICAgICAgICAgbVJlY29yZFRyYWNrLT5nZXRBY3RpdmVNaWNyb3Bob25lcyhhY3RpdmVNaWNyb3Bob25lcykpOwogfQogCitiaW5kZXI6OlN0YXR1cyBBdWRpb0ZsaW5nZXI6OlJlY29yZEhhbmRsZTo6c2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbigKKyAgICAgICAgaW50IC8qYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCovIGRpcmVjdGlvbikgeworICAgIEFMT0dWKCIlcygpIiwgX19mdW5jX18pOworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6ZnJvbVN0YXR1c1QobVJlY29yZFRyYWNrLT5zZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdD4oZGlyZWN0aW9uKSkpOworfQorCitiaW5kZXI6OlN0YXR1cyBBdWRpb0ZsaW5nZXI6OlJlY29yZEhhbmRsZTo6c2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pIHsKKyAgICBBTE9HVigiJXMoKSIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKG1SZWNvcmRUcmFjay0+c2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKHpvb20pKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQUY6OlJlY29yZFRyYWNrIgogCiAvLyBSZWNvcmRUcmFjayBjb25zdHJ1Y3RvciBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgYW5kIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6UmVjb3JkVHJhY2soCkBAIC0xNjUxLDEyICsxOTUwLDE0IEBACiAgICAgICAgICAgICB2b2lkICpidWZmZXIsCiAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICBwaWRfdCBjcmVhdG9yUGlkLAogICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgIHRyYWNrX3R5cGUgdHlwZSwKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBjbGllbnQsIGF0dHIsIHNhbXBsZVJhdGUsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBidWZmZXIsIGJ1ZmZlclNpemUsIHNlc3Npb25JZCwgdWlkLCBmYWxzZSAvKmlzT3V0Ki8sCisgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgYnVmZmVyLCBidWZmZXJTaXplLCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICBjcmVhdG9yUGlkLCB1aWQsIGZhbHNlIC8qaXNPdXQqLywKICAgICAgICAgICAgICAgICAgICh0eXBlID09IFRZUEVfREVGQVVMVCkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAoKGZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19GQVNUKSA/IEFMTE9DX1BJUEUgOiBBTExPQ19DQkxLKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYnVmZmVyID09IE5VTEwpID8gQUxMT0NfTE9DQUwgOiBBTExPQ19OT05FKSwKQEAgLTE2NzIsMTggKzE5NzMsMjAgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIG1SZWNvcmRCdWZmZXJDb252ZXJ0ZXIgPSBuZXcgUmVjb3JkQnVmZmVyQ29udmVydGVyKAotICAgICAgICAgICAgdGhyZWFkLT5tQ2hhbm5lbE1hc2ssIHRocmVhZC0+bUZvcm1hdCwgdGhyZWFkLT5tU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmb3JtYXQsIHNhbXBsZVJhdGUpOwotICAgIC8vIENoZWNrIGlmIHRoZSBSZWNvcmRCdWZmZXJDb252ZXJ0ZXIgY29uc3RydWN0aW9uIHdhcyBzdWNjZXNzZnVsLgotICAgIC8vIElmIG5vdCwgZG9uJ3QgY29udGludWUgd2l0aCBjb25zdHJ1Y3Rpb24uCi0gICAgLy8KLSAgICAvLyBOT1RFOiBJdCB3b3VsZCBiZSBleHRyZW1lbHkgcmFyZSB0aGF0IHRoZSByZWNvcmQgdHJhY2sgY2Fubm90IGJlIGNyZWF0ZWQKLSAgICAvLyBmb3IgdGhlIGN1cnJlbnQgZGV2aWNlLCBidXQgYSBwZW5kaW5nIG9yIGZ1dHVyZSBkZXZpY2UgY2hhbmdlIHdvdWxkIG1ha2UKLSAgICAvLyB0aGUgcmVjb3JkIHRyYWNrIGNvbmZpZ3VyYXRpb24gdmFsaWQuCi0gICAgaWYgKG1SZWNvcmRCdWZmZXJDb252ZXJ0ZXItPmluaXRDaGVjaygpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJSZWNvcmRUcmFjayB1bmFibGUgdG8gY3JlYXRlIHJlY29yZCBidWZmZXIgY29udmVydGVyIik7Ci0gICAgICAgIHJldHVybjsKKyAgICBpZiAoIWlzRGlyZWN0KCkpIHsKKyAgICAgICAgbVJlY29yZEJ1ZmZlckNvbnZlcnRlciA9IG5ldyBSZWNvcmRCdWZmZXJDb252ZXJ0ZXIoCisgICAgICAgICAgICAgICAgdGhyZWFkLT5tQ2hhbm5lbE1hc2ssIHRocmVhZC0+bUZvcm1hdCwgdGhyZWFkLT5tU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZm9ybWF0LCBzYW1wbGVSYXRlKTsKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIFJlY29yZEJ1ZmZlckNvbnZlcnRlciBjb25zdHJ1Y3Rpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgICAgIC8vIElmIG5vdCwgZG9uJ3QgY29udGludWUgd2l0aCBjb25zdHJ1Y3Rpb24uCisgICAgICAgIC8vCisgICAgICAgIC8vIE5PVEU6IEl0IHdvdWxkIGJlIGV4dHJlbWVseSByYXJlIHRoYXQgdGhlIHJlY29yZCB0cmFjayBjYW5ub3QgYmUgY3JlYXRlZAorICAgICAgICAvLyBmb3IgdGhlIGN1cnJlbnQgZGV2aWNlLCBidXQgYSBwZW5kaW5nIG9yIGZ1dHVyZSBkZXZpY2UgY2hhbmdlIHdvdWxkIG1ha2UKKyAgICAgICAgLy8gdGhlIHJlY29yZCB0cmFjayBjb25maWd1cmF0aW9uIHZhbGlkLgorICAgICAgICBpZiAobVJlY29yZEJ1ZmZlckNvbnZlcnRlci0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IFJlY29yZFRyYWNrIHVuYWJsZSB0byBjcmVhdGUgcmVjb3JkIGJ1ZmZlciBjb252ZXJ0ZXIiLCBfX2Z1bmNfXywgbUlkKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQogICAgIH0KIAogICAgIG1TZXJ2ZXJQcm94eSA9IG5ldyBBdWRpb1JlY29yZFNlcnZlclByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LApAQCAtMTY5NCwxMiArMTk5NywyMCBAQAogICAgIGlmIChmbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgewogICAgICAgICBBTE9HX0FTU0VSVCh0aHJlYWQtPm1GYXN0VHJhY2tBdmFpbCk7CiAgICAgICAgIHRocmVhZC0+bUZhc3RUcmFja0F2YWlsID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVE9ETzogb25seSBOb3JtYWwgUmVjb3JkIGhhcyB0aW1lc3RhbXBzIChGYXN0IFJlY29yZCBkb2VzIG5vdCkuCisgICAgICAgIG1TZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkID0gY2hlY2tTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKG1Gb3JtYXQsIGZsYWdzKTsKICAgICB9CisjaWZkZWYgVEVFX1NJTksKKyAgICBtVGVlLnNldElkKHN0ZDo6c3RyaW5nKCJfIikgKyBzdGQ6OnRvX3N0cmluZyhtVGhyZWFkSW9IYW5kbGUpCisgICAgICAgICAgICArICJfIiArIHN0ZDo6dG9fc3RyaW5nKG1JZCkKKyAgICAgICAgICAgICsgIl9SIik7CisjZW5kaWYKIH0KIAogQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjp+UmVjb3JkVHJhY2soKQogewotICAgIEFMT0dWKCIlcyIsIF9fZnVuY19fKTsKKyAgICBBTE9HVigiJXMoKSIsIF9fZnVuY19fKTsKICAgICBkZWxldGUgbVJlY29yZEJ1ZmZlckNvbnZlcnRlcjsKICAgICBkZWxldGUgbVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyOwogfQpAQCAtMTc1NiwxNyArMjA2NywzNCBAQAogICAgIC8vIHNlZSBjb21tZW50cyBhdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6ZGVzdHJveSgpCiAgICAgc3A8UmVjb3JkVHJhY2s+IGtlZXAodGhpcyk7CiAgICAgewotICAgICAgICBpZiAoaXNFeHRlcm5hbFRyYWNrKCkpIHsKLSAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gQUNUSVZFIHx8IG1TdGF0ZSA9PSBSRVNVTUlORykgewotICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQobVBvcnRJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUlucHV0KG1Qb3J0SWQpOwotICAgICAgICB9CisgICAgICAgIHRyYWNrX3N0YXRlIHByaW9yU3RhdGUgPSBtU3RhdGU7CiAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgICAgICBpZiAodGhyZWFkICE9IDApIHsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbCh0aHJlYWQtPm1Mb2NrKTsKICAgICAgICAgICAgIFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkID0gKFJlY29yZFRocmVhZCAqKSB0aHJlYWQuZ2V0KCk7Ci0gICAgICAgICAgICByZWNvcmRUaHJlYWQtPmRlc3Ryb3lUcmFja19sKHRoaXMpOworICAgICAgICAgICAgcHJpb3JTdGF0ZSA9IG1TdGF0ZTsKKyAgICAgICAgICAgIHJlY29yZFRocmVhZC0+ZGVzdHJveVRyYWNrX2wodGhpcyk7IC8vIG1vdmUgbVN0YXRlIHRvIFNUT1BQRUQsIHRlcm1pbmF0ZQorICAgICAgICB9CisgICAgICAgIC8vIEFQTSBwb3J0aWQvY2xpZW50IG1hbmFnZW1lbnQgZG9uZSBvdXRzaWRlIG9mIGxvY2suCisgICAgICAgIC8vIE5PVEU6IGlmIHRocmVhZCBkb2Vzbid0IGV4aXN0LCB0aGUgaW5wdXQgZGVzY3JpcHRvciBwcm9iYWJseSBkb2Vzbid0IGVpdGhlci4KKyAgICAgICAgaWYgKGlzRXh0ZXJuYWxUcmFjaygpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKHByaW9yU3RhdGUpIHsKKyAgICAgICAgICAgIGNhc2UgQUNUSVZFOiAgICAgLy8gaW52YWxpZGF0ZWQgd2hpbGUgc3RpbGwgYWN0aXZlCisgICAgICAgICAgICBjYXNlIFNUQVJUSU5HXzI6IC8vIGludmFsaWRhdGVkL3N0YXJ0LWFib3J0ZWQgYWZ0ZXIgc3RhcnRJbnB1dCBzdWNjZXNzZnVsbHkgY2FsbGVkCisgICAgICAgICAgICBjYXNlIFBBVVNJTkc6ICAgIC8vIGludmFsaWRhdGVkIHdoaWxlIGluIHRoZSBtaWRkbGUgb2Ygc3RvcCgpIHBhdXNpbmcgKHN0aWxsIGFjdGl2ZSkKKyAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcElucHV0KG1Qb3J0SWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNUQVJUSU5HXzE6IC8vIGludmFsaWRhdGVkL3N0YXJ0LWFib3J0ZWQgYW5kIHN0YXJ0SW5wdXQgbm90IHN1Y2Nlc3NmdWwKKyAgICAgICAgICAgIGNhc2UgUEFVU0VEOiAgICAgLy8gT0ssIG5vdCBhY3RpdmUKKyAgICAgICAgICAgIGNhc2UgSURMRTogICAgICAgLy8gT0ssIG5vdCBhY3RpdmUKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBTVE9QUEVEOiAgICAvLyB1bmV4cGVjdGVkIChkZXN0cm95ZWQpCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzKCVkKTogaW52YWxpZCBwcmlvciBzdGF0ZTogJWQiLCBfX2Z1bmNfXywgbUlkLCBwcmlvclN0YXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQobVBvcnRJZCk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0xNzgzLDMxICsyMTExLDUwIEBACiB9CiAKIAotLypzdGF0aWMqLyB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZCgiQWN0aXZlIENsaWVudCBTZXNzaW9uIFMgIEZsYWdzICAgRm9ybWF0IENobiBtYXNrICBTUmF0ZSAgIFNlcnZlciBGcm1DbnQgU2lsXG4iKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJBY3RpdmUgICAgIElkIENsaWVudCBTZXNzaW9uIFBvcnQgSWQgIFMgIEZsYWdzICAiCisgICAgICAgICAgICAgICAgICAgICAgICAiIEZvcm1hdCBDaG4gbWFzayAgU1JhdGUgU291cmNlICAiCisgICAgICAgICAgICAgICAgICAgICAgICAiIFNlcnZlciBGcm1DbnQgRnJtUmR5IFNpbCVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaXNTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKCkgPyAiICAgTGF0ZW5jeSIgOiAiIik7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjphcHBlbmREdW1wKFN0cmluZzgmIHJlc3VsdCwgYm9vbCBhY3RpdmUpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJWMlNXMgJTZ1ICU3dSAlMnMgMHglMDNYICIKLSAgICAgICAgICAgICIlMDhYICUwOFggJTZ1ICIKLSAgICAgICAgICAgICIlMDhYICU2enUgJTNjXG4iLAorICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiVjJTVzICU2ZCAlNnUgJTd1ICU3dSAgJTJzIDB4JTAzWCAiCisgICAgICAgICAgICAiJTA4WCAlMDhYICU2dSAlNlggIgorICAgICAgICAgICAgIiUwOFggJTZ6dSAlNnp1ICUzYyIsCiAgICAgICAgICAgICBpc0Zhc3RUcmFjaygpID8gJ0YnIDogJyAnLAogICAgICAgICAgICAgYWN0aXZlID8gInllcyIgOiAibm8iLAotICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWRfY2FjaGVkIDogbUNsaWVudC0+cGlkKCksCisgICAgICAgICAgICBtSWQsCisgICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZCgpIDogbUNsaWVudC0+cGlkKCksCiAgICAgICAgICAgICBtU2Vzc2lvbklkLAorICAgICAgICAgICAgbVBvcnRJZCwKICAgICAgICAgICAgIGdldFRyYWNrU3RhdGVTdHJpbmcoKSwKICAgICAgICAgICAgIG1DYmxrLT5tRmxhZ3MsCiAKICAgICAgICAgICAgIG1Gb3JtYXQsCiAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIG1BdHRyLnNvdXJjZSwKIAogICAgICAgICAgICAgbUNibGstPm1TZXJ2ZXIsCiAgICAgICAgICAgICBtRnJhbWVDb3VudCwKKyAgICAgICAgICAgIG1TZXJ2ZXJQcm94eS0+ZnJhbWVzUmVhZHlTYWZlKCksCiAgICAgICAgICAgICBpc1NpbGVuY2VkKCkgPyAncycgOiAnbicKICAgICAgICAgICAgICk7CisgICAgaWYgKGlzU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCgpKSB7CisgICAgICAgIGRvdWJsZSBsYXRlbmN5TXM7CisgICAgICAgIGJvb2wgZnJvbVRyYWNrOworICAgICAgICBpZiAoZ2V0VHJhY2tMYXRlbmN5TXMoJmxhdGVuY3lNcywgJmZyb21UcmFjaykgPT0gT0spIHsKKyAgICAgICAgICAgIC8vIFNob3cgbGF0ZW5jeSBpbiBtc2VjLCBmb2xsb3dlZCBieSAndCcgaWYgZnJvbSB0cmFjayB0aW1lc3RhbXAgKHRoZSBtb3N0IGFjY3VyYXRlKQorICAgICAgICAgICAgLy8gb3IgJ2snIGlmIGVzdGltYXRlZCBmcm9tIGtlcm5lbCAodXN1YWxseSBmb3IgZGVidWdnaW5nKS4KKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAlNy4ybGYgJWMiLCBsYXRlbmN5TXMsIGZyb21UcmFjayA/ICd0JyA6ICdrJyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlMTBzIiwgbUNibGstPm1TZXJ2ZXIgIT0gMCA/ICJ1bmF2YWlsIiA6ICJuZXciKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6aGFuZGxlU3luY1N0YXJ0RXZlbnQoY29uc3Qgc3A8U3luY0V2ZW50PiYgZXZlbnQpCkBAIC0xODM3LDYgKzIxODQsMTYgQEAKICAgICAgICAgaW50NjRfdCB0cmFja0ZyYW1lc1JlbGVhc2VkLCBpbnQ2NF90IHNvdXJjZUZyYW1lc1JlYWQsCiAgICAgICAgIHVpbnQzMl90IGhhbFNhbXBsZVJhdGUsIGNvbnN0IEV4dGVuZGVkVGltZXN0YW1wICZ0aW1lc3RhbXApCiB7CisgICAvLyBNYWtlIHRoZSBrZXJuZWwgZnJhbWV0aW1lIGF2YWlsYWJsZS4KKyAgICBjb25zdCBGcmFtZVRpbWUgZnR7CisgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdLAorICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF19OworICAgIC8vIEFMT0dEKCJGcmFtZVRpbWU6ICVsbGQgJWxsZCIsIChsb25nIGxvbmcpZnQuZnJhbWVzLCAobG9uZyBsb25nKWZ0LnRpbWVOcyk7CisgICAgbUtlcm5lbEZyYW1lVGltZS5zdG9yZShmdCk7CisgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBFeHRlbmRlZFRpbWVzdGFtcCBsb2NhbCA9IHRpbWVzdGFtcDsKIAogICAgIC8vIENvbnZlcnQgSEFMIGZyYW1lcyB0byBzZXJ2ZXItc2lkZSB0cmFjayBmcmFtZXMgYXQgdHJhY2sgc2FtcGxlIHJhdGUuCkBAIC0xODUwLDYgKzIyMDcsMTUgQEAKICAgICAgICAgfQogICAgIH0KICAgICBtU2VydmVyUHJveHktPnNldFRpbWVzdGFtcChsb2NhbCk7CisKKyAgICAvLyBDb21wdXRlIGxhdGVuY3kgaW5mby4KKyAgICBjb25zdCBib29sIHVzZVRyYWNrVGltZXN0YW1wID0gdHJ1ZTsgLy8gdXNlIHRyYWNrIHVubGVzcyBkZWJ1Z2dpbmcuCisgICAgY29uc3QgZG91YmxlIGxhdGVuY3lNcyA9IC0gKHVzZVRyYWNrVGltZXN0YW1wCisgICAgICAgICAgICA/IGxvY2FsLmdldE91dHB1dFNlcnZlckxhdGVuY3lNcyhzYW1wbGVSYXRlKCkpCisgICAgICAgICAgICA6IHRpbWVzdGFtcC5nZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXMoaGFsU2FtcGxlUmF0ZSkpOworCisgICAgbVNlcnZlckxhdGVuY3lGcm9tVHJhY2suc3RvcmUodXNlVHJhY2tUaW1lc3RhbXApOworICAgIG1TZXJ2ZXJMYXRlbmN5TXMuc3RvcmUobGF0ZW5jeU1zKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKQEAgLTE4NjQsNiArMjIzMCwzMSBAQAogICAgIH0KIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKAorICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgeworICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgIGlmICh0aHJlYWQgIT0gMCkgeworICAgICAgICBSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCA9IChSZWNvcmRUaHJlYWQgKil0aHJlYWQuZ2V0KCk7CisgICAgICAgIHJldHVybiByZWNvcmRUaHJlYWQtPnNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oZGlyZWN0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkgeworICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgIGlmICh0aHJlYWQgIT0gMCkgeworICAgICAgICBSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCA9IChSZWNvcmRUaHJlYWQgKil0aHJlYWQuZ2V0KCk7CisgICAgICAgIHJldHVybiByZWNvcmRUaHJlYWQtPnNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbih6b29tKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQUY6OlBhdGNoUmVjb3JkIgorCiBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ6OlBhdGNoUmVjb3JkKFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKQEAgLTE4NzEsMzggKzIyNjIsMzcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRpbWVvdXQmIHRpbWVvdXQpCiAgICAgOiAgIFJlY29yZFRyYWNrKHJlY29yZFRocmVhZCwgTlVMTCwKICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3R7fSAvKiBjdXJyZW50bHkgdW51c2VkIGZvciBwYXRjaCB0cmFjayAqLywKICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmVyU2l6ZSwgQVVESU9fU0VTU0lPTl9OT05FLCBnZXR1aWQoKSwgZmxhZ3MsIFRZUEVfUEFUQ0gpLAotICAgICAgICAgICAgICAgIG1Qcm94eShuZXcgQ2xpZW50UHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsIG1GcmFtZVNpemUsIGZhbHNlLCB0cnVlKSkKKyAgICAgICAgICAgICAgICBidWZmZXIsIGJ1ZmZlclNpemUsIEFVRElPX1NFU1NJT05fTk9ORSwgZ2V0cGlkKCksIEFJRF9BVURJT1NFUlZFUiwKKyAgICAgICAgICAgICAgICBmbGFncywgVFlQRV9QQVRDSCksCisgICAgICAgIFBhdGNoVHJhY2tCYXNlKG5ldyBDbGllbnRQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwgbUZyYW1lU2l6ZSwgZmFsc2UsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAqcmVjb3JkVGhyZWFkLCB0aW1lb3V0KQogewotICAgIHVpbnQ2NF90IG1peEJ1ZmZlck5zID0gKCh1aW50NjRfdCkyICogcmVjb3JkVGhyZWFkLT5mcmFtZUNvdW50KCkgKiAxMDAwMDAwMDAwKSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkVGhyZWFkLT5zYW1wbGVSYXRlKCk7Ci0gICAgbVBlZXJUaW1lb3V0LnR2X3NlYyA9IG1peEJ1ZmZlck5zIC8gMTAwMDAwMDAwMDsKLSAgICBtUGVlclRpbWVvdXQudHZfbnNlYyA9IChpbnQpIChtaXhCdWZmZXJOcyAlIDEwMDAwMDAwMDApOwotCi0gICAgQUxPR1YoIlBhdGNoUmVjb3JkICVwIHNhbXBsZVJhdGUgJWQgbVBlZXJUaW1lb3V0ICVkLiUwM2Qgc2VjIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgc2FtcGxlUmF0ZSwKKyAgICBBTE9HVigiJXMoJWQpOiBzYW1wbGVSYXRlICVkIG1QZWVyVGltZW91dCAlZC4lMDNkIHNlYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpbVBlZXJUaW1lb3V0LnR2X3NlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkobVBlZXJUaW1lb3V0LnR2X25zZWMgLyAxMDAwMDAwKSk7CiB9CiAKIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZDo6flBhdGNoUmVjb3JkKCkKIHsKKyAgICBBTE9HVigiJXMoJWQpIiwgX19mdW5jX18sIG1JZCk7CiB9CiAKIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ6OmdldE5leHRCdWZmZXIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQogewotICAgIEFMT0dfQVNTRVJUKG1QZWVyUHJveHkgIT0gMCwgIlBhdGNoUmVjb3JkOjpnZXROZXh0QnVmZmVyKCkgY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIpOworICAgIEFMT0dfQVNTRVJUKG1QZWVyUHJveHkgIT0gMCwgIiVzKCVkKTogY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIsIF9fZnVuY19fLCBtSWQpOwogICAgIFByb3h5OjpCdWZmZXIgYnVmOwogICAgIGJ1Zi5tRnJhbWVDb3VudCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUGVlclByb3h5LT5vYnRhaW5CdWZmZXIoJmJ1ZiwgJm1QZWVyVGltZW91dCk7CiAgICAgQUxPR1ZfSUYoc3RhdHVzICE9IE5PX0VSUk9SLAotICAgICAgICAgICAgICJQYXRjaFJlY29yZCgpICVwIG1QZWVyUHJveHktPm9idGFpbkJ1ZmZlciBzdGF0dXMgJWQiLCB0aGlzLCBzdGF0dXMpOworICAgICAgICAgICAgICIlcyglZCk6IG1QZWVyUHJveHktPm9idGFpbkJ1ZmZlciBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgbUlkLCBzdGF0dXMpOwogICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IGJ1Zi5tRnJhbWVDb3VudDsKICAgICBpZiAoYnVmLm1GcmFtZUNvdW50ID09IDApIHsKICAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOwpAQCAtMTkxMyw3ICsyMzAzLDcgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ6OnJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpCiB7Ci0gICAgQUxPR19BU1NFUlQobVBlZXJQcm94eSAhPSAwLCAiUGF0Y2hSZWNvcmQ6OnJlbGVhc2VCdWZmZXIoKSBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5Iik7CisgICAgQUxPR19BU1NFUlQobVBlZXJQcm94eSAhPSAwLCAiJXMoJWQpOiBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5IiwgX19mdW5jX18sIG1JZCk7CiAgICAgUHJveHk6OkJ1ZmZlciBidWY7CiAgICAgYnVmLm1GcmFtZUNvdW50ID0gYnVmZmVyLT5mcmFtZUNvdW50OwogICAgIGJ1Zi5tUmF3ID0gYnVmZmVyLT5yYXc7CkBAIC0xOTMyLDcgKzIzMjIsOSBAQAogICAgIG1Qcm94eS0+cmVsZWFzZUJ1ZmZlcihidWZmZXIpOwogfQogCi0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkFGOjpNbWFwVHJhY2siCiAKIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6TW1hcFRyYWNrOjpNbWFwVHJhY2soVGhyZWFkQmFzZSAqdGhyZWFkLAogICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHIsCkBAIC0xOTQwLDEzICsyMzMyLDE1IEBACiAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgIGJvb2wgaXNPdXQsCiAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgcGlkX3QgcGlkLAorICAgICAgICBwaWRfdCBjcmVhdG9yUGlkLAogICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKICAgICA6ICAgVHJhY2tCYXNlKHRocmVhZCwgTlVMTCwgYXR0ciwgc2FtcGxlUmF0ZSwgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIChzaXplX3QpMCAvKiBmcmFtZUNvdW50ICovLAogICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBidWZmZXIgKi8sIChzaXplX3QpMCAvKiBidWZmZXJTaXplICovLAotICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCB1aWQsIGZhbHNlIC8qIGlzT3V0ICovLAorICAgICAgICAgICAgICAgICAgc2Vzc2lvbklkLCBjcmVhdG9yUGlkLCB1aWQsIGlzT3V0LAogICAgICAgICAgICAgICAgICAgQUxMT0NfTk9ORSwKICAgICAgICAgICAgICAgICAgIFRZUEVfREVGQVVMVCwgcG9ydElkKSwKICAgICAgICAgbVBpZChwaWQpLCBtU2lsZW5jZWQoZmFsc2UpLCBtU2lsZW5jZWROb3RpZmllZChmYWxzZSkKQEAgLTE5NjMsNyArMjM1Nyw3IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6TW1hcFRyYWNrOjpzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50IF9fdW51c2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24gX191bnVzZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHRyaWdnZXJTZXNzaW9uIF9fdW51c2VkKQogewogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTE5OTQsMTkgKzIzODgsMjggQEAKIHsKIH0KIAotLypzdGF0aWMqLyB2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6TW1hcFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpNbWFwVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KQogewotICAgIHJlc3VsdC5hcHBlbmQoIkNsaWVudCBTZXNzaW9uICAgRm9ybWF0IENobiBtYXNrICBTUmF0ZVxuIik7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiQ2xpZW50IFNlc3Npb24gUG9ydCBJZCAgRm9ybWF0IENobiBtYXNrICBTUmF0ZSBGbGFncyAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzT3V0KCkgPyAiVXNnIENUIjogIlNvdXJjZSIpOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6TW1hcFRyYWNrOjphcHBlbmREdW1wKFN0cmluZzgmIHJlc3VsdCwgYm9vbCBhY3RpdmUgX191bnVzZWQpCiB7Ci0gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTZ1ICU3dSAlMDhYICUwOFggJTZ1XG4iLAorICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiU2dSAlN3UgJTd1ICUwOFggJTA4WCAlNnUgMHglMDNYICIsCiAgICAgICAgICAgICBtUGlkLAogICAgICAgICAgICAgbVNlc3Npb25JZCwKKyAgICAgICAgICAgIG1Qb3J0SWQsCiAgICAgICAgICAgICBtRm9ybWF0LAogICAgICAgICAgICAgbUNoYW5uZWxNYXNrLAotICAgICAgICAgICAgbVNhbXBsZVJhdGUpOworICAgICAgICAgICAgbVNhbXBsZVJhdGUsCisgICAgICAgICAgICBtQXR0ci5mbGFncyk7CisgICAgaWYgKGlzT3V0KCkpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTN4ICUyeCIsIG1BdHRyLnVzYWdlLCBtQXR0ci5jb250ZW50X3R5cGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiU2eCIsIG1BdHRyLnNvdXJjZSk7CisgICAgfQorICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UeXBlZExvZ2dlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1R5cGVkTG9nZ2VyLmgKaW5kZXggMzhjM2MwMi4uNmVmMTliZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1R5cGVkTG9nZ2VyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1R5cGVkTG9nZ2VyLmgKQEAgLTk3LDggKzk3LDQyIEBACiAjZGVmaW5lIExPR19BVURJT19TVEFURSgpIGRvIHsgTkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IGlmICh4ICE9IG51bGxwdHIpIFwKICAgICAgICAgeC0+bG9nRXZlbnRIaXN0VHMoTkJMb2c6OkVWRU5UX0FVRElPX1NUQVRFLCBoYXNoKF9fRklMRV9fLCBfX0xJTkVfXykpOyB9IHdoaWxlKDApCiAKKy8vIExvZyB0aGUgZGlmZmVyZW5jZSBiZXd0ZWVuIGZyYW1lcyBwcmVzZW50ZWQgYnkgSEFMIGFuZCBmcmFtZXMgd3JpdHRlbiB0byBIQUwgb3V0cHV0IHNpbmssCisvLyBkaXZpZGVkIGJ5IHRoZSBzYW1wbGUgcmF0ZS4gUGFyYW1ldGVyIG1zIGlzIG9mIHR5cGUgZG91YmxlLgorI2RlZmluZSBMT0dfTEFURU5DWShtcykgZG8geyBOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgaWYgKHggIT0gbnVsbHB0cikgXAorICAgICAgICB4LT5sb2c8TkJMb2c6OkVWRU5UX0xBVEVOQ1k+KG1zKTsgfSB3aGlsZSAoMCkKKworLy8gUmVjb3JkIHRocmVhZCBvdmVycnVuIGV2ZW50IG5hbm9zZWNvbmQgdGltZXN0YW1wLiBQYXJhbWV0ZXIgbnMgaXMgYW4gaW50NjRfdC4KKyNkZWZpbmUgTE9HX09WRVJSVU4obnMpIGRvIHsgTkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IGlmICh4ICE9IG51bGxwdHIpIFwKKyAgICAgICAgeC0+bG9nPE5CTG9nOjpFVkVOVF9PVkVSUlVOPihucyk7IH0gd2hpbGUgKDApCisKKy8vIFJlY29yZCB0aHJlYWQgaW5mby4gVGhpcyBjdXJyZW50bHkgaW5jbHVkZXMgdHlwZSwgZnJhbWVDb3VudCwgYW5kIHNhbXBsZVJhdGUuCisvLyBQYXJhbWV0ZXIgdHlwZSBpcyB0aHJlYWRfaW5mb190IGFzIGRlZmluZWQgaW4gTkJMb2cuaC4KKyNkZWZpbmUgTE9HX1RIUkVBRF9JTkZPKGluZm8pIGRvIHsgTkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IFwKKyAgICAgICAgaWYgKHggIT0gbnVsbHB0cikgeC0+bG9nPE5CTG9nOjpFVkVOVF9USFJFQURfSU5GTz4oaW5mbyk7IH0gd2hpbGUgKDApCisKKyNkZWZpbmUgTE9HX1RIUkVBRF9QQVJBTVMocGFyYW1zKSBkbyB7TkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IFwKKyAgICAgICAgaWYgKHggIT0gbnVsbHB0cikgeC0+bG9nPE5CTG9nOjpFVkVOVF9USFJFQURfUEFSQU1TPihwYXJhbXMpOyB9IHdoaWxlICgwKQorCisvLyBSZWNvcmQgdGhyZWFkIHVuZGVycnVuIGV2ZW50IG5hbm9zZWNvbmQgdGltZXN0YW1wLiBQYXJhbWV0ZXIgbnMgaXMgYW4gaW50NjRfdC4KKyNkZWZpbmUgTE9HX1VOREVSUlVOKG5zKSBkbyB7IE5CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBpZiAoeCAhPSBudWxscHRyKSBcCisgICAgICAgIHgtPmxvZzxOQkxvZzo6RVZFTlRfVU5ERVJSVU4+KG5zKTsgfSB3aGlsZSAoMCkKKworLy8gUmVjb3JkIHRocmVhZCB3YXJtdXAgdGltZSBpbiBtaWxsaXNlY29uZHMuIFBhcmFtZXRlciBtcyBpcyBvZiB0eXBlIGRvdWJsZS4KKyNkZWZpbmUgTE9HX1dBUk1VUF9USU1FKG1zKSBkbyB7IE5CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBpZiAoeCAhPSBudWxscHRyKSBcCisgICAgICAgIHgtPmxvZzxOQkxvZzo6RVZFTlRfV0FSTVVQX1RJTUU+KG1zKTsgfSB3aGlsZSAoMCkKKworLy8gUmVjb3JkIGEgdHlwZWQgZW50cnkgdGhhdCByZXByZXNlbnRzIGEgdGhyZWFkJ3Mgd29yayB0aW1lIGluIG5hbm9zZWNvbmRzLgorLy8gUGFyYW1ldGVyIG5zIHNob3VsZCBiZSBvZiB0eXBlIHVpbnQzMl90LgorI2RlZmluZSBMT0dfV09SS19USU1FKG5zKSBkbyB7IE5CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBpZiAoeCAhPSBudWxscHRyKSBcCisgICAgICAgIHgtPmxvZzxOQkxvZzo6RVZFTlRfV09SS19USU1FPihucyk7IH0gd2hpbGUgKDApCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIGV4dGVybiAiQyIgeworLy8gVE9ETyBjb25zaWRlciBhZGRpbmcgYSB0aHJlYWRfbG9jYWwgTkJMb2c6OldyaXRlciB0bER1bW15TkJMb2dXcml0ZXIgYW5kIHRoZW4KKy8vIGluaXRpYWxpemUgYmVsb3cgdGxOQkxvZ1dyaXRlciB0byAmdGxEdW1teU5CTG9nV3JpdGVyIHRvIHJlbW92ZSB0aGUgbmVlZCB0bworLy8gY2hlY2sgZm9yIG51bGxwdHIgZXZlcnkgdGltZS4gQWxzbyByZWR1Y2VzIHRoZSBuZWVkIHRvIGFkZCBhIG5ldyBsb2dnaW5nIG1hY3JvIGFib3ZlCisvLyBlYWNoIHRpbWUgd2Ugd2FudCB0byBsb2cgYSBuZXcgdHlwZS4KIGV4dGVybiB0aHJlYWRfbG9jYWwgTkJMb2c6OldyaXRlciAqdGxOQkxvZ1dyaXRlcjsKIH0KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MmI4OWYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNSBAQAorY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGliYXVkaW9wb2xpY3ltYW5hZ2VyX2ludGVyZmFjZV9oZWFkZXJzIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjljYWUxLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0gICAgc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwIFwKLSAgICBzZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAgXAotICAgIHNlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcCBcCi0gICAgc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyIFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvdXRpbGl0aWVzCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYmxvZyBcCi0gICAgbGliYmluZGVyIFwKLSAgICBsaWJhdWRpb2NsaWVudCBcCi0gICAgbGliaGFyZHdhcmVfbGVnYWN5IFwKLSAgICBsaWJzZXJ2aWNldXRpbGl0eSBcCi0gICAgbGliYXVkaW9wb2xpY3ltYW5hZ2VyIFwKLSAgICBsaWJtZWRpYV9oZWxwZXIgXAotICAgIGxpYm1lZGlhbWV0cmljcyBcCi0gICAgbGliZWZmZWN0c2NvbmZpZwotCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMKLQotTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKLQotTE9DQUxfTU9EVUxFOj0gbGliYXVkaW9wb2xpY3lzZXJ2aWNlCi0KLUxPQ0FMX0NGTEFHUyArPSAtZnZpc2liaWxpdHk9aGlkZGVuCi1MT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBtYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYmxvZyBcCi0gICAgbGlic291bmR0cmlnZ2VyCi0KLWlmZXEgKCQoVVNFX0NPTkZJR1VSQUJMRV9BVURJT19QT0xJQ1kpLCAxKQotCi1pZm5lcSAoJChVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GKSwgMSkKLSQoZXJyb3IgQ29uZmlndXJhYmxlIHBvbGljeSBkb2VzIG5vdCBzdXBwb3J0IGxlZ2FjeSBjb25mIGZpbGUpCi1lbmRpZiAjaWZuZXEgKCQoVVNFX1hNTF9BVURJT19QT0xJQ1lfQ09ORiksIDEpCi0KLUxPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gXAotICAgIHBhcmFtZXRlci1mcmFtZXdvcmsucG9saWN5IFwKLSAgICBhdWRpb19wb2xpY3lfY3JpdGVyaWEuY29uZiBcCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZQotTE9DQUxfQ19JTkNMVURFUyArPSBmcmFtZXdvcmtzL2F2L2luY2x1ZGUKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJhdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYWJsZQotCi1lbHNlCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliYXVkaW9wb2xpY3llbmdpbmVkZWZhdWx0Ci0KLWVuZGlmICMgaWZlcSAoJChVU0VfQ09ORklHVVJBQkxFX0FVRElPX1BPTElDWSksIDEpCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS91dGlsaXRpZXMKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgbGliYXVkaW9wb2xpY3ljb21wb25lbnRzCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGlibWVkaWFfaGVscGVyCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYm1lZGlhbWV0cmljcwotCi1pZmVxICgkKFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYpLCAxKQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJpY3V1YyBsaWJ4bWwyCi0KLUxPQ0FMX0NGTEFHUyArPSAtRFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYKLWVuZGlmICNpZmVxICgkKFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYpLCAxKQotCi1MT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgotCi1MT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQotCi1MT0NBTF9NT0RVTEU6PSBsaWJhdWRpb3BvbGljeW1hbmFnZXJkZWZhdWx0Ci0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotaWZuZXEgKCQoVVNFX0NVU1RPTV9BVURJT19QT0xJQ1kpLCAxKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotICAgIG1hbmFnZXIvQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJhdWRpb3BvbGljeW1hbmFnZXJkZWZhdWx0Ci0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAotICAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cwotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UKLQotTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKLQotTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKLQotTE9DQUxfTU9EVUxFOj0gbGliYXVkaW9wb2xpY3ltYW5hZ2VyCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotZW5kaWYKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgUmVjdXJzaXZlIGNhbGwgc3ViLWZvbGRlciBBbmRyb2lkLm1rCi0jCi1pbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaAppbmRleCA0ODEyYjFmLi4zMGYyOWQ2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKQEAgLTU4LDI3ICs1OCwxNSBAQAogICAgIHR5cGVkZWYgZW51bSB7CiAgICAgICAgIEFQSV9JTlBVVF9JTlZBTElEID0gLTEsCiAgICAgICAgIEFQSV9JTlBVVF9MRUdBQ1kgID0gMCwvLyBlLmcuIGF1ZGlvIHJlY29yZGluZyBmcm9tIGEgbWljcm9waG9uZQotICAgICAgICBBUElfSU5QVVRfTUlYX0NBUFRVUkUsLy8gdXNlZCBmb3IgInJlbW90ZSBzdWJtaXgiLCBjYXB0dXJlIG9mIHRoZSBtZWRpYSB0byBwbGF5IGl0IHJlbW90ZWx5CisgICAgICAgIEFQSV9JTlBVVF9NSVhfQ0FQVFVSRSwvLyB1c2VkIGZvciAicmVtb3RlIHN1Ym1peCIgbGVnYWN5IG1vZGUgKG5vIERBUCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXB0dXJlIG9mIHRoZSBtZWRpYSB0byBwbGF5IGl0IHJlbW90ZWx5CiAgICAgICAgIEFQSV9JTlBVVF9NSVhfRVhUX1BPTElDWV9SRVJPVVRFLC8vIHVzZWQgZm9yIHBsYXRmb3JtIGF1ZGlvIHJlcm91dGluZywgd2hlcmUgbWl4ZXMgYXJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhbmRsZWQgYnkgZXh0ZXJuYWwgYW5kIGR5bmFtaWNhbGx5IGluc3RhbGxlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwb2xpY2llcyB3aGljaCByZXJvdXRlIGF1ZGlvIG1peGVzCisgICAgICAgIEFQSV9JTlBVVF9NSVhfUFVCTElDX0NBUFRVUkVfUExBWUJBQ0ssICAvLyB1c2VkIGZvciBwbGF5YmFjayBjYXB0dXJlIHdpdGggYSBNZWRpYVByb2plY3Rpb24KICAgICAgICAgQVBJX0lOUFVUX1RFTEVQSE9OWV9SWCwgLy8gdXNlZCBmb3IgY2FwdHVyZSBmcm9tIHRlbGVwaG9ueSBSWCBwYXRoCiAgICAgfSBpbnB1dF90eXBlX3Q7CiAKLSAgICBlbnVtIHsKLSAgICAgICAgQVBJX0lOUFVUX0NPTkNVUlJFTkNZX05PTkUgPSAwLAotICAgICAgICBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FMTCA9ICgxIDw8IDApLCAgICAgIC8vIENvbmN1cnJlbmN5IHdpdGggYSBjYWxsCi0gICAgICAgIEFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQVBUVVJFID0gKDEgPDwgMSksICAgLy8gQ29uY3VycmVuY3kgd2l0aCBhbm90aGVyIGNhcHR1cmUKLSAgICAgICAgQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0hPVFdPUkQgPSAoMSA8PCAyKSwgICAvLyBDb25jdXJyZW5jeSB3aXRoIGEgaG90d29yZAotICAgICAgICBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfUFJFRU1QVCA9ICgxIDw8IDMpLCAgIC8vIHByZS1lbXB0ZWQgc29tZW9uZQotICAgICAgICAgICAgICAgIC8vIE5COiBwcmVlbXB0IGlzIG1hcmtlZCBvbiBhIHN1Y2Nlc3NmdWwgcmV0dXJuLCBvdGhlcnMgYXJlIG9uIGZhaWxpbmcgY2FsbHMKLSAgICAgICAgQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0xBU1QgPSAoMSA8PCA0KSwKLQotICAgICAgICBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQUxMID0gKEFQSV9JTlBVVF9DT05DVVJSRU5DWV9MQVNUIC0gMSksCi0gICAgfTsKLQotICAgIHR5cGVkZWYgdWludDMyX3QgY29uY3VycmVuY3lfdHlwZV9fbWFza190OwotCiBwdWJsaWM6CiAgICAgdmlydHVhbCB+QXVkaW9Qb2xpY3lJbnRlcmZhY2UoKSB7fQogICAgIC8vCkBAIC04OSwxNCArNzcsMTYgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpID0gMDsKICAgICAvLyByZXRyaWV2ZSBhIGRldmljZSBjb25uZWN0aW9uIHN0YXR1cwogICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykgPSAwOwogICAgIC8vIGluZGljYXRlIGEgY2hhbmdlIGluIGRldmljZSBjb25maWd1cmF0aW9uCiAgICAgdmlydHVhbCBzdGF0dXNfdCBoYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpID0gMDsKICAgICAvLyBpbmRpY2F0ZSBhIGNoYW5nZSBpbiBwaG9uZSBzdGF0ZS4gVmFsaWQgcGhvbmVzIHN0YXRlcyBhcmUgZGVmaW5lZCBieSBhdWRpb19tb2RlX3QKICAgICB2aXJ0dWFsIHZvaWQgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpID0gMDsKICAgICAvLyBmb3JjZSB1c2luZyBhIHNwZWNpZmljIGRldmljZSBjYXRlZ29yeSBmb3IgdGhlIHNwZWNpZmllZCB1c2FnZQpAQCAtMTIyLDIzICsxMTIsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gKnNlY29uZGFyeU91dHB1dHMpID0gMDsKICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIG91dHB1dCBzdGFydHMgYmVpbmcgdXNlZCBieSBjb3JyZXNwb25kaW5nIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBvdXRwdXQgc3RvcHMgYmVpbmcgdXNlZCBieSBjb3JyZXNwb25kaW5nIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKICAgICAvLyByZWxlYXNlcyB0aGUgb3V0cHV0LgotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAKICAgICAvLyByZXF1ZXN0IGFuIGlucHV0IGFwcHJvcHJpYXRlIGZvciByZWNvcmQgZnJvbSB0aGUgc3VwcGxpZWQgZGV2aWNlIHdpdGggc3VwcGxpZWQgcGFyYW1ldGVycy4KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNvbmZpZywKQEAgLTE0NywxNiArMTMzLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfdHlwZV90ICppbnB1dFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSA9IDA7CiAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBpbnB1dCBzdGFydHMgYmVpbmcgdXNlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNpbGVuY2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jdXJyZW5jeV90eXBlX19tYXNrX3QgKmNvbmN1cnJlbmN5KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBpbnB1dCBzdG9wcyBiZWluZyB1c2VkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKICAgICAvLyByZWxlYXNlcyB0aGUgaW5wdXQuCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogCiAgICAgLy8KICAgICAvLyB2b2x1bWUgY29udHJvbCBmdW5jdGlvbnMKQEAgLTE4MSw2ICsxNjIsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSA9IDA7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaW5Wb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgpID0gMDsKKwogICAgIC8vIHJldHVybiB0aGUgc3RyYXRlZ3kgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIHN0cmVhbSB0eXBlCiAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOwogCkBAIC0xOTYsNiArMTkwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlckVmZmVjdChpbnQgaWQpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IG1vdmVFZmZlY3RzVG9Jbyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBpZHMsIGF1ZGlvX2lvX2hhbmRsZV90IGlvKSA9IDA7CiAKICAgICB2aXJ0dWFsIGJvb2wgaXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLApAQCAtMjA1LDcgKzIwMCwxMCBAQAogICAgIC8vZHVtcCBzdGF0ZQogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQpID0gMDsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QWxsb3dlZENhcHR1cmVQb2xpY3kodWlkX3QgdWlkLCBhdWRpb19mbGFnc19tYXNrX3QgZmxhZ3MpID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBvZmZsb2FkSW5mbykgPSAwOworICAgIHZpcnR1YWwgYm9vbCBpc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcykgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKQEAgLTIzMywxMSArMjMxLDE1IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlclBvbGljeU1peGVzKGNvbnN0IFZlY3RvcjxBdWRpb01peD4mIG1peGVzKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyUG9saWN5TWl4ZXMoVmVjdG9yPEF1ZGlvTWl4PiBtaXhlcykgPSAwOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKQorICAgICAgICAgICAgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpID0gMDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck1vbm8oYm9vbCBtb25vKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNb25vKGJvb2wgKm1vbm8pID0gMDsKQEAgLTI1MSw3ICsyNTMsMjIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcG9ydGVkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkICAgICBzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpOworICAgIHZpcnR1YWwgYm9vbCAgICAgaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gKmZvcm1hdHMpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCAgICAgc2V0QXBwU3RhdGUodWlkX3QgdWlkLCBhcHBfc3RhdGVfdCBzdGF0ZSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciAmc3RyYXRlZ2llcykgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCAmcHJvZHVjdFN0cmF0ZWd5KSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1ZvbHVtZUdyb3VwcyhBdWRpb1ZvbHVtZUdyb3VwVmVjdG9yICZncm91cHMpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Vm9sdW1lR3JvdXBGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lX2dyb3VwX3QgJnZvbHVtZUdyb3VwKSA9IDA7CiB9OwogCiAKQEAgLTMyNCwxMSArMzQxLDYgQEAKICAgICAvLyBmdW5jdGlvbiBlbmFibGluZyB0byByZWNlaXZlIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9ucyBkaXJlY3RseSBmcm9tIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZSB0byBhdWRpbyBwb2xpY3kgbWFuYWdlci4KICAgICB2aXJ0dWFsIFN0cmluZzggZ2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5cykgPSAwOwogCi0gICAgLy8gcmVxdWVzdCB0aGUgcGxheWJhY2sgb2YgYSB0b25lIG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtOiB1c2VkIGZvciBpbnN0YW5jZSB0byByZXBsYWNlIG5vdGlmaWNhdGlvbiBzb3VuZHMgd2hlbiBwbGF5aW5nCi0gICAgLy8gb3ZlciBhIHRlbGVwaG9ueSBkZXZpY2UgZHVyaW5nIGEgcGhvbmUgY2FsbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wVG9uZSgpID0gMDsKLQogICAgIC8vIHNldCBkb3duIGxpbmsgYXVkaW8gdm9sdW1lLgogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcyA9IDApID0gMDsKIApAQCAtMzM3LDYgKzM0OSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNyY091dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkc3RPdXRwdXQpID0gMDsKIAorICAgIHZpcnR1YWwgdm9pZCBzZXRFZmZlY3RTdXNwZW5kZWQoaW50IGVmZmVjdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VzcGVuZGVkKSA9IDA7CisKICAgICAvKiBDcmVhdGUgYSBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLApAQCAtMzUzLDE1ICszNjksMjAgQEAKIAogICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCkgPSAwOwogCisgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsIGludCBmbGFncykgPSAwOworCiAgICAgdmlydHVhbCBhdWRpb191bmlxdWVfaWRfdCBuZXdBdWRpb1VuaXF1ZUlkKGF1ZGlvX3VuaXF1ZV9pZF91c2VfdCB1c2UpID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZCBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShTdHJpbmc4IHJlZ0lkLCBpbnQzMl90IHN0YXRlKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSAqY2xpZW50Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UgKmRldmljZUNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgPSAwOwogfTsKIAogZXh0ZXJuICJDIiBBdWRpb1BvbGljeUludGVyZmFjZSogY3JlYXRlQXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvVEVTVF9NQVBQSU5HIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvVEVTVF9NQVBQSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5NGZkODcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9URVNUX01BUFBJTkcKQEAgLTAsMCArMSwxMCBAQAoreworICAicHJlc3VibWl0IjogWworICAgIHsKKyAgICAgICAibmFtZSI6ICJhdWRpb3BvbGljeV90ZXN0cyIKKyAgICB9LAorICAgIHsKKyAgICAgICAibmFtZSI6ICJzeXN0ZW1hdWRpb190ZXN0cyIKKyAgICB9CisgIF0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTkyNWI5YQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNCBAQAorY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGliYXVkaW9wb2xpY3ljb21tb24iLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNjZThlMy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgUmVjdXJzaXZlIGNhbGwgc3ViLWZvbGRlciBBbmRyb2lkLm1rCi0jCi1pbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCi0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1JvdXRpbmdTdHJhdGVneS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvUm91dGluZ1N0cmF0ZWd5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzODk2N2UuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvUm91dGluZ1N0cmF0ZWd5LmgKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gVGltZSBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgbWVkaWEgc3RvcHBlZCBwbGF5aW5nIGR1cmluZyB3aGljaCB3ZSBjb25zaWRlciB0aGF0IHRoZQotLy8gc29uaWZpY2F0aW9uIHNob3VsZCBiZSBhcyB1bm9idHJ1c2l2ZSBhcyBkdXJpbmcgdGhlIHRpbWUgbWVkaWEgd2FzIHBsYXlpbmcuCi0jZGVmaW5lIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZIDUwMDAKLQotZW51bSByb3V0aW5nX3N0cmF0ZWd5IHsKLSAgICBTVFJBVEVHWV9NRURJQSwKLSAgICBTVFJBVEVHWV9QSE9ORSwKLSAgICBTVFJBVEVHWV9TT05JRklDQVRJT04sCi0gICAgU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwsCi0gICAgU1RSQVRFR1lfRFRNRiwKLSAgICBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFLAotICAgIFNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUiwKLSAgICBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZLAotICAgIFNUUkFURUdZX1JFUk9VVElORywKLSAgICBOVU1fU1RSQVRFR0lFUwotfTsKLQotfTsgLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaAppbmRleCBmYzAxMmEyLi4xZGJkMWViIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Wb2x1bWUuaApAQCAtMTYsMTAgKzE2LDI0IEBACiAKICNwcmFnbWEgb25jZQogCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Db21tb25UeXBlcy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPG1hdGguaD4KIAorbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFZvbHVtZVNvdXJjZSBpcyB0aGUgZGlzY3JpbWluZW50IGZvciB2b2x1bWUgbWFuYWdlbWVudCBvbiBhbiBvdXRwdXQuCisgKiBJdCB1c2VkIHRvIGJlIHRoZSBzdHJlYW0gdHlwZSBieSBsZWdhY3ksIGl0IG1heSBiZSBob3N0IHZvbHVtZSBncm91cCBvciBhIHZvbHVtZSBjdXJ2ZXMgaWYKKyAqIHdlIGFsbG93IHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBjdXJ2ZSBwZXIgdm9sdW1lIGdyb3VwIChtYW5kYXRvcnkgdG8gZ2V0IHJpZCBvZiBBdWRpb1NlcnZlcgorICogc3RyZWFtIGFsaWFzZXMuCisgKi8KK2VudW0gVm9sdW1lU291cmNlIDogc3RkOjp1bmRlcmx5aW5nX3R5cGU8dm9sdW1lX2dyb3VwX3Q+Ojp0eXBlOworc3RhdGljIGNvbnN0IFZvbHVtZVNvdXJjZSBWT0xVTUVfU09VUkNFX05PTkUgPSBzdGF0aWNfY2FzdDxWb2x1bWVTb3VyY2U+KFZPTFVNRV9HUk9VUF9OT05FKTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCiAvLyBBYnNvbHV0ZSBtaW4gdm9sdW1lIGluIGRCIChjYW4gYmUgcmVwcmVzZW50ZWQgaW4gc2luZ2xlIHByZWNpc2lvbiBub3JtYWwgZmxvYXQgdmFsdWUpCiAjZGVmaW5lIFZPTFVNRV9NSU5fREIgKC03NTgpCiAKQEAgLTEzNCw2ICsxNDgsNyBAQAogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRToKICAgICAgICAgICAgIHJldHVybiBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBOwogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjoKKyAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRToKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUOgogICAgICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUjoKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlk6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9wb2xpY3kuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL3BvbGljeS5oCmluZGV4IDliZDY4ZTEuLjYwNWZjMWMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL3BvbGljeS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL3BvbGljeS5oCkBAIC0xNyw5ICsxNywyMCBAQAogI3ByYWdtYSBvbmNlCiAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgU3RyZWFtVHlwZVZlY3RvciA9IHN0ZDo6dmVjdG9yPGF1ZGlvX3N0cmVhbV90eXBlX3Q+OworCitzdGF0aWMgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGRlZmF1bHRBdHRyID0gQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUjsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiBzdGF0aWMgY29uc3QgYXVkaW9fZm9ybWF0X3QgZ0R5bmFtaWNGb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKIAorc3RhdGljIGNvbnN0IHVpbnQzMl90IFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZID0gNTAwMDsKKwogLy8gRm9yIG1peGVkIG91dHB1dCBhbmQgaW5wdXRzLCB0aGUgcG9saWN5IHdpbGwgdXNlIG1heCBtaXhlciBzYW1wbGluZyByYXRlcy4KIC8vIERvIG5vdCBsaW1pdCBzYW1wbGluZyByYXRlIG90aGVyd2lzZQogI2RlZmluZSBTQU1QTEVfUkFURV9IWl9NQVggMTkyMDAwCkBAIC0zMiwxNCArNDMsNiBAQAogI2RlZmluZSBNQVhfTUlYRVJfQ0hBTk5FTF9DT1VOVCBGQ0NfOAogCiAvKioKLSAqIEEgZGV2aWNlIG1hc2sgZm9yIGFsbCBhdWRpbyBpbnB1dCBkZXZpY2VzIHRoYXQgYXJlIGNvbnNpZGVyZWQgInZpcnR1YWwiIHdoZW4gZXZhbHVhdGluZwotICogYWN0aXZlIGlucHV0cyBpbiBnZXRBY3RpdmVJbnB1dHMoKQotICovCi0jZGVmaW5lIEFQTV9BVURJT19JTl9ERVZJQ0VfVklSVFVBTF9BTEwgKEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYfFwKLSAgICAgICAgQVVESU9fREVWSUNFX0lOX0JVU3xBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIpCi0KLQotLyoqCiAgKiBBIGRldmljZSBtYXNrIGZvciBhbGwgYXVkaW8gaW5wdXQgYW5kIG91dHB1dCBkZXZpY2VzIHdoZXJlIG1hdGNoaW5nIGlucHV0cy9vdXRwdXRzIG9uIGRldmljZQogICogdHlwZSBhbG9uZSBpcyBub3QgZW5vdWdoOiB0aGUgYWRkcmVzcyBtdXN0IG1hdGNoIHRvbwogICovCkBAIC02OCwyMyArNzEsNiBAQAogfQogCiAvKioKLSAqIENoZWNrIGlmIHRoZSBpbnB1dCBkZXZpY2UgZ2l2ZW4gaXMgY29uc2lkZXJlZCBhcyBhIHZpcnR1YWwgZGV2aWNlLgotICoKLSAqIEBwYXJhbVtpbl0gZGV2aWNlIHRvIGNvbnNpZGVyCi0gKgotICogQHJldHVybiB0cnVlIGlmIHRoZSBkZXZpY2UgaXMgYSB2aXJ0dWFsIG9uZSwgZmFsc2Ugb3RoZXJ3aXNlLgotICovCi1zdGF0aWMgaW5saW5lIGJvb2wgaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkKLXsKLSAgICBpZiAoKGRldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApIHsKLSAgICAgICAgZGV2aWNlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOwotICAgICAgICBpZiAoKHBvcGNvdW50KGRldmljZSkgPT0gMSkgJiYgKChkZXZpY2UgJiB+QVBNX0FVRElPX0lOX0RFVklDRV9WSVJUVUFMX0FMTCkgPT0gMCkpCi0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0vKioKICAqIENoZWNrIHdoZXRoZXIgdGhlIGRldmljZSB0eXBlIGlzIG9uZQogICogd2hlcmUgYWRkcmVzc2VzIGFyZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gb25lIGNvbm5lY3RlZCBkZXZpY2UgYW5kIGFub3RoZXIKICAqCkBAIC0xMDEsNiArODcsMjEgQEAKIH0KIAogLyoqCisgKiBDaGVjayB3aGV0aGVyIGF1ZGlvIGRldmljZSBoYXMgZW5jb2RpbmcgY2FwYWJpbGl0eS4KKyAqCisgKiBAcGFyYW1baW5dIGRldmljZSB0byBjb25zaWRlcgorICoKKyAqIEByZXR1cm4gdHJ1ZSBpZiBkZXZpY2UgaGFzIGVuY29kaW5nIGNhcGFiaWxpdHksIGZhbHNlIG90aGVyd2lzZS4uCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBkZXZpY2VfaGFzX2VuY29kaW5nX2NhcGFiaWxpdHkoYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBpZiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKioKICAqIFJldHVybnMgdGhlIHByaW9yaXR5IG9mIGEgZ2l2ZW4gYXVkaW8gc291cmNlIGZvciBjYXB0dXJlLiBUaGUgcHJpb3JpdHkgaXMgdXNlZCB3aGVuIG1vcmUgdGhhbiBvbmUKICAqIGNhcHR1cmUgc2Vzc2lvbiBpcyBhY3RpdmUgb24gYSBnaXZlbiBpbnB1dCBzdHJlYW0gdG8gZGV0ZXJtaW5lIHdoaWNoIHNlc3Npb24gZHJpdmVzIHJvdXRpbmcgYW5kCiAgKiBlZmZlY3QgY29uZmlndXJhdGlvbi4KQEAgLTEwOCw3ICsxMDksMTAgQEAKICAqIEBwYXJhbVtpbl0gaW5wdXRTb3VyY2UgdG8gY29uc2lkZXIuIFZhbGlkIHNvdXJjZXMgYXJlOgogICogLSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTgogICogLSBBVURJT19TT1VSQ0VfQ0FNQ09SREVSCisgKiAtIEFVRElPX1NPVVJDRV9WT0lDRV9QRVJGT1JNQU5DRQorICogLSBBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQKICAqIC0gQVVESU9fU09VUkNFX01JQworICogLSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0UKICAqIC0gQVVESU9fU09VUkNFX0ZNX1RVTkVSCiAgKiAtIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTgogICogLSBBVURJT19TT1VSQ0VfSE9UV09SRApAQCAtMTIxLDEwICsxMjUsMTYgQEAKIHsKICAgICBzd2l0Y2ggKGlucHV0U291cmNlKSB7CiAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKLSAgICAgICAgcmV0dXJuIDY7CisgICAgICAgIHJldHVybiA5OwogICAgIGNhc2UgQVVESU9fU09VUkNFX0NBTUNPUkRFUjoKLSAgICAgICAgcmV0dXJuIDU7CisgICAgICAgIHJldHVybiA4OworICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1BFUkZPUk1BTkNFOgorICAgICAgICByZXR1cm4gNzsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9VTlBST0NFU1NFRDoKKyAgICAgICAgcmV0dXJuIDY7CiAgICAgY2FzZSBBVURJT19TT1VSQ0VfTUlDOgorICAgICAgICByZXR1cm4gNTsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRToKICAgICAgICAgcmV0dXJuIDQ7CiAgICAgY2FzZSBBVURJT19TT1VSQ0VfRk1fVFVORVI6CiAgICAgICAgIHJldHVybiAzOwpAQCAtMTUyLDMgKzE2MiwyNSBAQAogICAgIH0KICAgICByZXR1cm4gZm9ybWF0MSA9PSBmb3JtYXQyOwogfQorCisvKioKKyAqIEBicmllZiBoYXNTdHJlYW0gY2hlY2tzIGlmIGEgZ2l2ZW4gc3RyZWFtIHR5cGUgaXMgZm91bmQgaW4gdGhlIGxpc3Qgb2Ygc3RyZWFtcworICogQHBhcmFtIHN0cmVhbXMgY29sbGVjdGlvbiBvZiBzdHJlYW0gdHlwZXMgdG8gY29uc2lkZXIuCisgKiBAcGFyYW0gc3RyZWFtVHlwZSB0byBjb25zaWRlcgorICogQHJldHVybiB0cnVlIGlmIHZvaWNlIHN0cmVhbSBpcyBmb3VuZCBpbiB0aGUgZ2l2ZW4gc3RyZWFtcywgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBoYXNTdHJlYW0oY29uc3QgYW5kcm9pZDo6U3RyZWFtVHlwZVZlY3RvciAmc3RyZWFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKQoreworICAgIHJldHVybiBzdGQ6OmZpbmQoYmVnaW4oc3RyZWFtcyksIGVuZChzdHJlYW1zKSwgc3RyZWFtVHlwZSkgIT0gZW5kKHN0cmVhbXMpOworfQorCisvKioKKyAqIEBicmllZiBoYXNWb2ljZVN0cmVhbSBjaGVja3MgaWYgYSB2b2ljZSBzdHJlYW0gaXMgZm91bmQgaW4gdGhlIGxpc3Qgb2Ygc3RyZWFtcworICogQHBhcmFtIHN0cmVhbXMgY29sbGVjdGlvbiB0byBjb25zaWRlci4KKyAqIEByZXR1cm4gdHJ1ZSBpZiB2b2ljZSBzdHJlYW0gaXMgZm91bmQgaW4gdGhlIGdpdmVuIHN0cmVhbXMsIGZhbHNlIG90aGVyd2lzZQorICovCitzdGF0aWMgaW5saW5lIGJvb2wgaGFzVm9pY2VTdHJlYW0oY29uc3QgYW5kcm9pZDo6U3RyZWFtVHlwZVZlY3RvciAmc3RyZWFtcykKK3sKKyAgICByZXR1cm4gaGFzU3RyZWFtKHN0cmVhbXMsIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDJmM2NmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTIgQEAKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGliYXVkaW9wb2xpY3ljb21wb25lbnRzIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgInNyYy9BdWRpb0NvbGxlY3Rpb25zLmNwcCIsCisgICAgICAgICJzcmMvQXVkaW9HYWluLmNwcCIsCisgICAgICAgICJzcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwIiwKKyAgICAgICAgInNyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwIiwKKyAgICAgICAgInNyYy9BdWRpb1BhdGNoLmNwcCIsCisgICAgICAgICJzcmMvQXVkaW9Qb2xpY3lNaXguY3BwIiwKKyAgICAgICAgInNyYy9BdWRpb1BvcnQuY3BwIiwKKyAgICAgICAgInNyYy9BdWRpb1Byb2ZpbGUuY3BwIiwKKyAgICAgICAgInNyYy9BdWRpb1JvdXRlLmNwcCIsCisgICAgICAgICJzcmMvQ2xpZW50RGVzY3JpcHRvci5jcHAiLAorICAgICAgICAic3JjL0RldmljZURlc2NyaXB0b3IuY3BwIiwKKyAgICAgICAgInNyYy9FZmZlY3REZXNjcmlwdG9yLmNwcCIsCisgICAgICAgICJzcmMvSHdNb2R1bGUuY3BwIiwKKyAgICAgICAgInNyYy9JT1Byb2ZpbGUuY3BwIiwKKyAgICAgICAgInNyYy9TZXJpYWxpemVyLmNwcCIsCisgICAgICAgICJzcmMvU291bmRUcmlnZ2VyU2Vzc2lvbi5jcHAiLAorICAgICAgICAic3JjL1R5cGVDb252ZXJ0ZXIuY3BwIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnhtbDIiLAorICAgIF0sCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWyJsaWJtZWRpYSJdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3BvbGljeWNvbW1vbiIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeW1hbmFnZXJfaW50ZXJmYWNlX2hlYWRlcnMiLAorICAgIF0sCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWyJsaWJhdWRpb3BvbGljeWNvbW1vbiJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5IiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY5ZTY4Ny4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLSAgICBzcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAgXAotICAgIHNyYy9BdWRpb0dhaW4uY3BwIFwKLSAgICBzcmMvSHdNb2R1bGUuY3BwIFwKLSAgICBzcmMvSU9Qcm9maWxlLmNwcCBcCi0gICAgc3JjL0F1ZGlvUG9ydC5jcHAgXAotICAgIHNyYy9BdWRpb1Byb2ZpbGUuY3BwIFwKLSAgICBzcmMvQXVkaW9Sb3V0ZS5jcHAgXAotICAgIHNyYy9BdWRpb1BvbGljeU1peC5jcHAgXAotICAgIHNyYy9BdWRpb1BhdGNoLmNwcCBcCi0gICAgc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcCBcCi0gICAgc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAgXAotICAgIHNyYy9BdWRpb0NvbGxlY3Rpb25zLmNwcCBcCi0gICAgc3JjL0VmZmVjdERlc2NyaXB0b3IuY3BwIFwKLSAgICBzcmMvU291bmRUcmlnZ2VyU2Vzc2lvbi5jcHAgXAotICAgIHNyYy9TZXNzaW9uUm91dGUuY3BwIFwKLSAgICBzcmMvQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmNwcCBcCi0gICAgc3JjL1ZvbHVtZUN1cnZlLmNwcCBcCi0gICAgc3JjL1R5cGVDb252ZXJ0ZXIuY3BwIFwKLSAgICBzcmMvQXVkaW9TZXNzaW9uLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJjdXRpbHMgXAotICAgIGxpYm1lZGlhIFwKLSAgICBsaWJ1dGlscyBcCi0gICAgbGlibG9nIFwKLQotTE9DQUxfRVhQT1JUX1NIQVJFRF9MSUJSQVJZX0hFQURFUlMgOj0gbGlibWVkaWEKLQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5IFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L3V0aWxpdGllcyBcCi0gICAgc3lzdGVtL21lZGlhL2F1ZGlvX3V0aWxzL2luY2x1ZGUgXAotCi1pZmVxICgkKFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYpLCAxKQotCi1MT0NBTF9TUkNfRklMRVMgKz0gc3JjL1NlcmlhbGl6ZXIuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliaWN1dWMgbGlieG1sMgotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICBleHRlcm5hbC9saWJ4bWwyL2luY2x1ZGUgXAotICAgIGV4dGVybmFsL2ljdS9pY3U0Yy9zb3VyY2UvY29tbW9uCi0KLWVsc2UKLQotTE9DQUxfU1JDX0ZJTEVTICs9IFwKLSAgICBzcmMvQ29uZmlnUGFyc2luZ1V0aWxzLmNwcCBcCi0gICAgc3JjL1N0cmVhbURlc2NyaXB0b3IuY3BwIFwKLSAgICBzcmMvR2FpbnMuY3BwCi0KLWVuZGlmICNpZmVxICgkKFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYpLCAxKQotCi1MT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gXAotICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZQotCi1MT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQotCi1MT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgotCi1MT0NBTF9NT0RVTEUgOj0gbGliYXVkaW9wb2xpY3ljb21wb25lbnRzCi0KLWluY2x1ZGUgJChCVUlMRF9TVEFUSUNfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0NvbGxlY3Rpb25zLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Db2xsZWN0aW9ucy5oCmluZGV4IGY4NmU3NWEuLmE5NDhlYTkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0NvbGxlY3Rpb25zLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvQ29sbGVjdGlvbnMuaApAQCAtMzgsNyArMzgsNyBAQAogY2xhc3MgQXVkaW9Sb3V0ZVZlY3RvciA6IHB1YmxpYyBWZWN0b3I8c3A8QXVkaW9Sb3V0ZT4gPgogewogcHVibGljOgotICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0dhaW4uaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0dhaW4uaAppbmRleCA0YWM1MDhmLi40YWY5M2UxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9HYWluLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvR2Fpbi5oCkBAIC0xOCw3ICsxOCw5IEBACiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC01MywxNyArNTUsNDEgQEAKICAgICBpbnQgZ2V0TWF4UmFtcEluTXMoKSBjb25zdCB7IHJldHVybiBtR2Fpbi5tYXhfcmFtcF9tczsgfQogCiAgICAgLy8gVE9ETzogcmVtb3ZlIGR1bXAgZnJvbSBoZXJlIChzcGxpdCBzZXJpYWxpemF0aW9uKQotICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKIAogICAgIHZvaWQgZ2V0RGVmYXVsdENvbmZpZyhzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmNvbmZpZyk7CiAgICAgc3RhdHVzX3QgY2hlY2tDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpjb25maWcpOwogCisgICAgdm9pZCBzZXRVc2VGb3JWb2x1bWUoYm9vbCBjYW5Vc2VGb3JWb2x1bWUpIHsgbVVzZUZvclZvbHVtZSA9IGNhblVzZUZvclZvbHVtZTsgfQorICAgIGJvb2wgY2FuVXNlRm9yVm9sdW1lKCkgY29uc3QgeyByZXR1cm4gbVVzZUZvclZvbHVtZTsgfQorCiAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2dhaW4gJmdldEdhaW4oKSBjb25zdCB7IHJldHVybiBtR2FpbjsgfQogCiBwcml2YXRlOgogICAgIGludCAgICAgICAgICAgICAgIG1JbmRleDsKICAgICBzdHJ1Y3QgYXVkaW9fZ2FpbiBtR2FpbjsKICAgICBib29sICAgICAgICAgICAgICBtVXNlSW5DaGFubmVsTWFzazsKKyAgICBib29sICAgICAgICAgICAgICBtVXNlRm9yVm9sdW1lID0gZmFsc2U7Cit9OworCitjbGFzcyBBdWRpb0dhaW5zIDogcHVibGljIHN0ZDo6dmVjdG9yPHNwPEF1ZGlvR2Fpbj4gPgoreworcHVibGljOgorICAgIGJvb2wgY2FuVXNlRm9yVm9sdW1lKCkgY29uc3QKKyAgICB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmZ2FpbjogKnRoaXMpIHsKKyAgICAgICAgICAgIGlmIChnYWluLT5jYW5Vc2VGb3JWb2x1bWUoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQzMl90IGFkZChjb25zdCBzcDxBdWRpb0dhaW4+IGdhaW4pCisgICAgeworICAgICAgICBwdXNoX2JhY2soZ2Fpbik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUyOTYzMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZS5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkRldmljZURlc2NyaXB0b3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIEludGVyZmFjZSBmb3IgSS9PIGRlc2NyaXB0b3JzIHRvIGltcGxlbWVudCBzbyBpbmZvcm1hdGlvbiBhYm91dCB0aGVpciBjb250ZXh0CisgKiBjYW4gYmUgcXVlcmllZCBhbmQgdXBkYXRlZC4KKyAqLworY2xhc3MgQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5BdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZSgpIHt9OworCisgICAgdmlydHVhbCBhdWRpb19jb25maWdfYmFzZV90IGdldENvbmZpZygpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZ2V0UGF0Y2hIYW5kbGUoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UGF0Y2hIYW5kbGUoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSA9IDA7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgSW9EZXNjcmlwdG9yLCBjbGFzcyBGaWx0ZXI+CitzcDxEZXZpY2VEZXNjcmlwdG9yPiBmaW5kUHJlZmVycmVkRGV2aWNlKAorICAgICAgICBJb0Rlc2NyaXB0b3ImIGRlc2MsIEZpbHRlciBmaWx0ZXIsIGJvb2wmIGFjdGl2ZSwgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzKQoreworICAgIGF1dG8gYWN0aXZlQ2xpZW50cyA9IGRlc2MtPmNsaWVudHNMaXN0KHRydWUgLyphY3RpdmVPbmx5Ki8pOworICAgIGF1dG8gYWN0aXZlQ2xpZW50c1dpdGhSb3V0ZSA9CisgICAgICAgIGRlc2MtPmNsaWVudHNMaXN0KHRydWUgLyphY3RpdmVPbmx5Ki8sIGZpbHRlciwgdHJ1ZSAvKnByZWZlcnJlZERldmljZSovKTsKKyAgICBhY3RpdmUgPSBhY3RpdmVDbGllbnRzLnNpemUoKSA+IDA7CisgICAgaWYgKGFjdGl2ZSAmJiBhY3RpdmVDbGllbnRzLnNpemUoKSA9PSBhY3RpdmVDbGllbnRzV2l0aFJvdXRlLnNpemUoKSkgeworICAgICAgICByZXR1cm4gZGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoYWN0aXZlQ2xpZW50c1dpdGhSb3V0ZVswXS0+cHJlZmVycmVkRGV2aWNlSWQoKSk7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgSW9Db2xsZWN0aW9uLCBjbGFzcyBGaWx0ZXI+CitzcDxEZXZpY2VEZXNjcmlwdG9yPiBmaW5kUHJlZmVycmVkRGV2aWNlKAorICAgICAgICBJb0NvbGxlY3Rpb24mIGlvQ29sbGVjdGlvbiwgRmlsdGVyIGZpbHRlciwgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzKQoreworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlvQ29sbGVjdGlvbi5zaXplKCk7IGkrKykgeworICAgICAgICBhdXRvIGRlc2MgPSBpb0NvbGxlY3Rpb24udmFsdWVBdChpKTsKKyAgICAgICAgYm9vbCBhY3RpdmU7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGN1ckRldmljZSA9IGZpbmRQcmVmZXJyZWREZXZpY2UoZGVzYywgZmlsdGVyLCBhY3RpdmUsIGRldmljZXMpOworICAgICAgICBpZiAoYWN0aXZlICYmIGN1ckRldmljZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfSBlbHNlIGlmIChjdXJEZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZGV2aWNlID0gY3VyRGV2aWNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXZpY2U7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lucHV0RGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmgKaW5kZXggZGYxY2YyNi4uMzdmOWQxNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmgKQEAgLTE2LDM2ICsxNiw0NSBAQAogCiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUgIkF1ZGlvUG9ydC5oIgotI2luY2x1ZGUgIkF1ZGlvU2Vzc2lvbi5oIgotI2luY2x1ZGUgIkF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlci5oIgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSAiQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJBdWRpb1BvcnQuaCIKKyNpbmNsdWRlICJDbGllbnREZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiRGV2aWNlRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIkVmZmVjdERlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJJT1Byb2ZpbGUuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBJT1Byb2ZpbGU7CiBjbGFzcyBBdWRpb1BvbGljeU1peDsKK2NsYXNzIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlOwogCiAvLyBkZXNjcmlwdG9yIGZvciBhdWRpbyBpbnB1dHMuIFVzZWQgdG8gbWFpbnRhaW4gY3VycmVudCBjb25maWd1cmF0aW9uIG9mIGVhY2ggb3BlbmVkIGF1ZGlvIGlucHV0CiAvLyBhbmQga2VlcCB0cmFjayBvZiB0aGUgdXNhZ2Ugb2YgdGhpcyBpbnB1dC4KLWNsYXNzIEF1ZGlvSW5wdXREZXNjcmlwdG9yOiBwdWJsaWMgQXVkaW9Qb3J0Q29uZmlnLCBwdWJsaWMgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyCitjbGFzcyBBdWRpb0lucHV0RGVzY3JpcHRvcjogcHVibGljIEF1ZGlvUG9ydENvbmZpZywgcHVibGljIEF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlCisgICAgLCBwdWJsaWMgQ2xpZW50TWFwSGFuZGxlcjxSZWNvcmRDbGllbnREZXNjcmlwdG9yPgogewogcHVibGljOgogICAgIGV4cGxpY2l0IEF1ZGlvSW5wdXREZXNjcmlwdG9yKGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7CiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRJZCgpIGNvbnN0OwogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBnZXRNb2R1bGVIYW5kbGUoKSBjb25zdDsKLSAgICB1aW50MzJfdCBnZXRPcGVuUmVmQ291bnQoKSBjb25zdDsKIAotICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlVHlwZSgpIGNvbnN0IHsgcmV0dXJuIChtRGV2aWNlICE9IG51bGxwdHIpID8KKyAgICAgICAgICAgICAgICAgICAgbURldmljZS0+dHlwZSgpIDogQVVESU9fREVWSUNFX05PTkU7IH0KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2UoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlOyB9CisgICAgdm9pZCBzZXREZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSkgeyBtRGV2aWNlID0gZGV2aWNlOyB9CisgICAgRGV2aWNlVmVjdG9yIHN1cHBvcnRlZERldmljZXMoKSBjb25zdCAgeworICAgICAgICByZXR1cm4gbVByb2ZpbGUgIT0gbnVsbHB0ciA/IG1Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCkgOiAgRGV2aWNlVmVjdG9yKCk7IH0KIAotICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgICAgICAgIG1Jb0hhbmRsZTsgICAgICAgLy8gaW5wdXQgaGFuZGxlCi0gICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgICAgICAgbURldmljZTsgICAgICAgICAvLyBjdXJyZW50IGRldmljZSB0aGlzIGlucHV0IGlzIHJvdXRlZCB0bwotICAgIHdwPEF1ZGlvUG9saWN5TWl4PiAgICAgICAgICAgIG1Qb2xpY3lNaXg7ICAgICAgLy8gbm9uIE5VTEwgd2hlbiB1c2VkIGJ5IGEgZHluYW1pYyBwb2xpY3kKLSAgICBjb25zdCBzcDxJT1Byb2ZpbGU+ICAgICAgICAgICBtUHJvZmlsZTsgICAgICAgIC8vIEkvTyBwcm9maWxlIHRoaXMgb3V0cHV0IGRlcml2ZXMgZnJvbQorICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IG92ZXJyaWRlOworCisgICAgYXVkaW9faW9faGFuZGxlX3QgICBtSW9IYW5kbGUgPSBBVURJT19JT19IQU5ETEVfTk9ORTsgLy8gaW5wdXQgaGFuZGxlCisgICAgd3A8QXVkaW9Qb2xpY3lNaXg+ICBtUG9saWN5TWl4OyAgICAgICAgICAgICAgICAgICAvLyBub24gTlVMTCB3aGVuIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeQorICAgIGNvbnN0IHNwPElPUHJvZmlsZT4gbVByb2ZpbGU7ICAgICAgICAgICAgICAgICAgICAgLy8gSS9PIHByb2ZpbGUgdGhpcyBvdXRwdXQgZGVyaXZlcyBmcm9tCiAKICAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCiAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZyA9IE5VTEwpIGNvbnN0OwpAQCAtNTUsNDMgKzY0LDU2IEBACiAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX3Nlc3Npb25fdD4gZ2V0UHJlZW1wdGVkU2Vzc2lvbnMoKSBjb25zdDsKICAgICBib29sIGhhc1ByZWVtcHRlZFNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pIGNvbnN0OwogICAgIHZvaWQgY2xlYXJQcmVlbXB0ZWRTZXNzaW9ucygpOwotICAgIGJvb2wgaXNBY3RpdmUoKSBjb25zdDsKKyAgICBib29sIGlzQWN0aXZlKCkgY29uc3QgeyByZXR1cm4gbUdsb2JhbEFjdGl2ZUNvdW50ID4gMDsgfQogICAgIGJvb2wgaXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdDsKLSAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZShib29sIGFjdGl2ZU9ubHkgPSBmYWxzZSkgY29uc3Q7CisgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKCkgY29uc3Q7CiAgICAgYm9vbCBpc1NvdW5kVHJpZ2dlcigpIGNvbnN0OwotICAgIHN0YXR1c190IGFkZEF1ZGlvU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiYgYXVkaW9TZXNzaW9uKTsKLSAgICBzdGF0dXNfdCByZW1vdmVBdWRpb1Nlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgIHNwPEF1ZGlvU2Vzc2lvbj4gZ2V0QXVkaW9TZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSBjb25zdDsKLSAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIGdldEF1ZGlvU2Vzc2lvbnMoYm9vbCBhY3RpdmVPbmx5KSBjb25zdDsKLSAgICBzaXplX3QgZ2V0QXVkaW9TZXNzaW9uQ291bnQoYm9vbCBhY3RpdmVPbmx5KSBjb25zdDsKLSAgICBhdWRpb19zb3VyY2VfdCBnZXRIaWdoZXN0UHJpb3JpdHlTb3VyY2UoYm9vbCBhY3RpdmVPbmx5KSBjb25zdDsKLQotICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlcgotICAgIHZpcnR1YWwgYXVkaW9fY29uZmlnX2Jhc2VfdCBnZXRDb25maWcoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldFBhdGNoSGFuZGxlKCkgY29uc3Q7Ci0KLSAgICB2b2lkIHNldFBhdGNoSGFuZGxlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CisgICAgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4gZ2V0SGlnaGVzdFByaW9yaXR5Q2xpZW50KCkgY29uc3Q7CisgICAgYXVkaW9fYXR0cmlidXRlc190IGdldEhpZ2hlc3RQcmlvcml0eUF0dHJpYnV0ZXMoKSBjb25zdDsKKyAgICB2b2lkIHNldENsaWVudEFjdGl2ZShjb25zdCBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50LCBib29sIGFjdGl2ZSk7CisgICAgaW50MzJfdCBhY3RpdmVDb3VudCgpIHsgcmV0dXJuIG1HbG9iYWxBY3RpdmVDb3VudDsgfQorICAgIHZvaWQgdHJhY2tFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3QsIGJvb2wgZW5hYmxlZCk7CisgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gZ2V0RW5hYmxlZEVmZmVjdHMoKSBjb25zdDsKKyAgICBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiBnZXRBY3RpdmVFZmZlY3RzKCkgY29uc3Q7IC8vIGVuYWJsZWQgYW5kIG5vdCBzdXNwZW5kZWQKKyAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBBdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZQorICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgZ2V0Q29uZmlnKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZ2V0UGF0Y2hIYW5kbGUoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHNldFBhdGNoSGFuZGxlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgb3ZlcnJpZGU7CiAKICAgICBzdGF0dXNfdCBvcGVuKGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsCiAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCiAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0KTsKICAgICAvLyBDYWxsZWQgd2hlbiBhIHN0cmVhbSBpcyBhYm91dCB0byBiZSBzdGFydGVkLgotICAgIC8vIE5vdGU6IGNhbGxlZCBhZnRlciBBdWRpb1Nlc3Npb246OmNoYW5nZUFjdGl2ZUNvdW50KDEpCisgICAgLy8gTm90ZTogY2FsbGVkIGFmdGVyIHNldENsaWVudEFjdGl2ZShjbGllbnQsIHRydWUpCiAgICAgc3RhdHVzX3Qgc3RhcnQoKTsKICAgICAvLyBDYWxsZWQgYWZ0ZXIgYSBzdHJlYW0gaXMgc3RvcHBlZAotICAgIC8vIE5vdGU6IGNhbGxlZCBhZnRlciBBdWRpb1Nlc3Npb246OmNoYW5nZUFjdGl2ZUNvdW50KC0xKQorICAgIC8vIE5vdGU6IGNhbGxlZCBhZnRlciBzZXRDbGllbnRBY3RpdmUoY2xpZW50LCBmYWxzZSkKICAgICB2b2lkIHN0b3AoKTsKICAgICB2b2lkIGNsb3NlKCk7CiAKLXByaXZhdGU6Ci0gICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgICAgICAgICAgbVBhdGNoSGFuZGxlOwotICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgICAgICAgIG1JZDsKLSAgICAvLyBhdWRpbyBzZXNzaW9ucyBhdHRhY2hlZCB0byB0aGlzIGlucHV0Ci0gICAgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiAgICAgICAgbVNlc3Npb25zOworICAgIFJlY29yZENsaWVudFZlY3RvciBnZXRDbGllbnRzRm9yU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGNsaWVudHNMaXN0KGJvb2wgYWN0aXZlT25seSA9IGZhbHNlLAorICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSBBVURJT19TT1VSQ0VfREVGQVVMVCwgYm9vbCBwcmVmZXJyZWREZXZpY2VPbmx5ID0gZmFsc2UpIGNvbnN0OworCisgICAgdm9pZCBzZXRBcHBTdGF0ZSh1aWRfdCB1aWQsIGFwcF9zdGF0ZV90IHN0YXRlKTsKKworICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIENsaWVudE1hcEhhbmRsZXI8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4KKyAgICB2b2lkIGFkZENsaWVudChjb25zdCBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiAmY2xpZW50KSBvdmVycmlkZTsKKworICAgIC8vIEdvIG92ZXIgYWxsIGFjdGl2ZSBjbGllbnRzIGFuZCBzdXNwZW5kIG9yIHJlc3RvcmUgZWZmZWN0cyBhY2NvcmRpbmcgaGlnaGVzdCBwcmlvcml0eQorICAgIC8vIGFjdGl2ZSB1c2UgY2FzZQorICAgIHZvaWQgY2hlY2tTdXNwZW5kRWZmZWN0cygpOworCisgcHJpdmF0ZToKKworICAgIHZvaWQgdXBkYXRlQ2xpZW50UmVjb3JkaW5nQ29uZmlndXJhdGlvbihpbnQgZXZlbnQsIGNvbnN0IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+JiBjbGllbnQpOworCisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbVBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgbUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtRGV2aWNlID0gbnVsbHB0cjsgLyoqPCBjdXJyZW50IGRldmljZSB0aGlzIGlucHV0IGlzIHJvdXRlZCB0byAqLworCiAgICAgLy8gQmVjYXVzZSBhIHByZWVtcHRpYmxlIGNhcHR1cmUgc2Vzc2lvbiBjYW4gcHJlZW1wdCBhbm90aGVyIG9uZSwgd2UgZW5kIHVwIGluIGFuIGVuZGxlc3MgbG9vcAogICAgIC8vIHNpdHVhdGlvbiB3ZXJlIGVhY2ggc2Vzc2lvbiBpcyBhbGxvd2VkIHRvIHJlc3RhcnQgYWZ0ZXIgYmVpbmcgcHJlZW1wdGVkLAogICAgIC8vIHRodXMgcHJlZW1wdGluZyB0aGUgb3RoZXIgb25lIHdoaWNoIHJlc3RhcnRzIGFuZCBzbyBvbi4KQEAgLTk5LDcgKzEyMSw5IEBACiAgICAgLy8gYSBwYXJ0aWN1bGFyIGlucHV0IHN0YXJ0ZWQgYW5kIHByZXZlbnQgcHJlZW1wdGlvbiBvZiB0aGlzIGFjdGl2ZSBpbnB1dCBieSB0aGlzIHNlc3Npb24uCiAgICAgLy8gV2UgYWxzbyBpbmhlcml0IHNlc3Npb25zIGZyb20gdGhlIHByZWVtcHRlZCBpbnB1dCB0byBhdm9pZCBhIDMgd2F5IHByZWVtcHRpb24gbG9vcCBldGMuLi4KICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90PiBtUHJlZW1wdGVkU2Vzc2lvbnM7Ci0gICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKm1DbGllbnRJbnRlcmZhY2U7CisgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKiBjb25zdCBtQ2xpZW50SW50ZXJmYWNlOworICAgIGludDMyX3QgbUdsb2JhbEFjdGl2ZUNvdW50ID0gMDsgIC8vIG5vbi1jbGllbnQtc3BlY2lmaWMgYWN0aXZpdHkgcmVmIGNvdW50CisgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gbUVuYWJsZWRFZmZlY3RzOwogfTsKIAogY2xhc3MgQXVkaW9JbnB1dENvbGxlY3Rpb24gOgpAQCAtMTExLDE5ICsxMzUsMzEgQEAKICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gZ2V0SW5wdXRGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3Q7CiAKICAgICAvLyBjb3VudCBhY3RpdmUgY2FwdHVyZSBzZXNzaW9ucyB1c2luZyBvbmUgb2YgdGhlIHNwZWNpZmllZCBkZXZpY2VzLgotICAgIC8vIGlnbm9yZSBkZXZpY2VzIGlmIEFVRElPX0RFVklDRV9JTl9ERUZBVUxUIGlzIHBhc3NlZAotICAgIHVpbnQzMl90IGFjdGl2ZUlucHV0c0NvdW50T25EZXZpY2VzKGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gQVVESU9fREVWSUNFX0lOX0RFRkFVTFQpIGNvbnN0OworICAgIC8vIGlnbm9yZSBkZXZpY2VzIGlmIGVtcHR5IHZlY3RvciBpcyBwYXNzZWQKKyAgICB1aW50MzJfdCBhY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0OwogCiAgICAgLyoqCiAgICAgICogcmV0dXJuIGlvIGhhbmRsZSBvZiBhY3RpdmUgaW5wdXQgb3IgMCBpZiBubyBpbnB1dCBpcyBhY3RpdmUKICAgICAgKiBPbmx5IGNvbnNpZGVycyBpbnB1dHMgZnJvbSBwaHlzaWNhbCBkZXZpY2VzIChlLmcuIG1haW4gbWljLCBoZWFkc2V0IG1pYykgd2hlbgogICAgICAqIGlnbm9yZVZpcnR1YWxJbnB1dHMgaXMgdHJ1ZS4KICAgICAgKi8KLSAgICBWZWN0b3I8c3AgPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiA+IGdldEFjdGl2ZUlucHV0cyhib29sIGlnbm9yZVZpcnR1YWxJbnB1dHMgPSB0cnVlKTsKKyAgICBWZWN0b3I8c3AgPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiA+IGdldEFjdGl2ZUlucHV0cygpOwogCi0gICAgYXVkaW9fZGV2aWNlc190IGdldFN1cHBvcnRlZERldmljZXMoYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlKSBjb25zdDsKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gZ2V0SW5wdXRGb3JDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0OworICAgIHZvaWQgdHJhY2tFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3QsIGJvb2wgZW5hYmxlZCk7CisKKyAgICAvKioKKyAgICAqIEBicmllZiBjbGVhclNlc3Npb25Sb3V0ZXNGb3JEZXZpY2U6IHdoZW4gYSBkZXZpY2UgaXMgZGlzY29ubmVjdGVkLCBhbmQgaWYgdGhpcyBkZXZpY2UgaGFzCisgICAgKiBiZWVuIGNob3NlbiBhcyB0aGUgcHJlZmVycmVkIGRldmljZSBieSBhbnkgY2xpZW50LCB0aGUgcG9saWN5IG1hbmFnZXIgc2hhbGwKKyAgICAqIHByZXZlbnQgZnJvbSB1c2luZyB0aGlzIGRldmljZSBhbnkgbW9yZSBieSBjbGVhcmluZyBhbGwgdGhlIHNlc3Npb24gcm91dGVzIGludm9sdmluZyB0aGlzCisgICAgKiBkZXZpY2UuCisgICAgKiBJbiBvdGhlciB3b3JkcywgdGhlIHByZWZlcnJlZCBkZXZpY2UgcG9ydCBpZCBvZiB0aGVzZSBjbGllbnRzIHdpbGwgYmUgcmVzZXR0ZWQgdG8gTk9ORS4KKyAgICAqIEBwYXJhbSBkaXNjb25uZWN0ZWREZXZpY2UgZGV2aWNlIHRvIGJlIGRpc2Nvbm5lY3RlZAorICAgICovCisgICAgdm9pZCBjbGVhclNlc3Npb25Sb3V0ZXNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRpc2Nvbm5lY3RlZERldmljZSk7CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5oCmluZGV4IDI0N2YyMGYuLmNkNTQwODUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb091dHB1dERlc2NyaXB0b3IuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmgKQEAgLTE2LDU1ICsxNiwyMzQgQEAKIAogI3ByYWdtYSBvbmNlCiAKKyNkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAotI2luY2x1ZGUgIkF1ZGlvUG9ydC5oIgotI2luY2x1ZGUgPFJvdXRpbmdTdHJhdGVneS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSAiQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJBdWRpb1BvcnQuaCIKKyNpbmNsdWRlICJDbGllbnREZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiRGV2aWNlRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBJT1Byb2ZpbGU7CiBjbGFzcyBBdWRpb1BvbGljeU1peDsKIGNsYXNzIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlOwotY2xhc3MgRGV2aWNlRGVzY3JpcHRvcjsKKworY2xhc3MgQWN0aXZpdHlUcmFja2luZworeworcHVibGljOgorICAgIHZpcnR1YWwgfkFjdGl2aXR5VHJhY2tpbmcoKSA9IGRlZmF1bHQ7CisgICAgYm9vbCBpc0FjdGl2ZSh1aW50MzJfdCBpblBhc3RNcyA9IDAsIG5zZWNzX3Qgc3lzVGltZSA9IDApIGNvbnN0CisgICAgeworICAgICAgICBpZiAobUFjdGl2aXR5Q291bnQgPiAwKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5QYXN0TXMgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChzeXNUaW1lID09IDApIHsKKyAgICAgICAgICAgIHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5zMm1zKHN5c1RpbWUgLSBtU3RvcFRpbWUpIDwgaW5QYXN0TXMpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdm9pZCBjaGFuZ2VBY3Rpdml0eUNvdW50KGludCBkZWx0YSkKKyAgICB7CisgICAgICAgIGlmICgoZGVsdGEgKyAoaW50KW1BY3Rpdml0eUNvdW50KSA8IDApIHsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzOiBpbnZhbGlkIGRlbHRhICVkLCByZWZDb3VudCAlZCIsIF9fZnVuY19fLCBkZWx0YSwgbUFjdGl2aXR5Q291bnQpOworICAgICAgICB9CisgICAgICAgIG1BY3Rpdml0eUNvdW50ICs9IGRlbHRhOworICAgICAgICBpZiAoIW1BY3Rpdml0eUNvdW50KSB7CisgICAgICAgICAgICBzZXRTdG9wVGltZShzeXN0ZW1UaW1lKCkpOworICAgICAgICB9CisgICAgfQorICAgIHVpbnQzMl90IGdldEFjdGl2aXR5Q291bnQoKSBjb25zdCB7IHJldHVybiBtQWN0aXZpdHlDb3VudDsgfQorICAgIG5zZWNzX3QgZ2V0U3RvcFRpbWUoKSBjb25zdCB7IHJldHVybiBtU3RvcFRpbWU7IH0KKyAgICB2b2lkIHNldFN0b3BUaW1lKG5zZWNzX3Qgc3RvcFRpbWUpIHsgbVN0b3BUaW1lID0gc3RvcFRpbWU7IH0KKworICAgIHZpcnR1YWwgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKKyAgICB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIEFjdGl2aXR5Q291bnQ6ICVkLCBTdG9wVGltZTogJSIgUFJJZDY0ICIsICIsIHNwYWNlcywgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEFjdGl2aXR5Q291bnQoKSwgZ2V0U3RvcFRpbWUoKSk7CisgICAgfQorcHJpdmF0ZToKKyAgICB1aW50MzJfdCBtQWN0aXZpdHlDb3VudCA9IDA7CisgICAgbnNlY3NfdCBtU3RvcFRpbWUgPSAwOworfTsKKworLyoqCisgKiBAYnJpZWYgVm9sdW1lQWN0aXZpdHk6IGl0IHRyYWNrcyB0aGUgYWN0aXZpdHkgZm9yIHZvbHVtZSBwb2xpY3kgKHZvbHVtZSBpbmRleCwgbXV0ZSwKKyAqIG1lbW9yaXplIHByZXZpb3VzIHN0b3AsIGFuZCBzdG9yZSBtdXRlIGlmIGluY29tcGF0aWJsZSBkZXZpY2Ugd2l0aCBhbm90aGVyIHN0cmF0ZWd5LgorICovCitjbGFzcyBWb2x1bWVBY3Rpdml0eSA6IHB1YmxpYyBBY3Rpdml0eVRyYWNraW5nCit7CitwdWJsaWM6CisgICAgYm9vbCBpc011dGVkKCkgY29uc3QgeyByZXR1cm4gbU11dGVDb3VudCA+IDA7IH0KKyAgICBpbnQgZ2V0TXV0ZUNvdW50KCkgY29uc3QgeyByZXR1cm4gbU11dGVDb3VudDsgfQorICAgIGludCBpbmNNdXRlQ291bnQoKSB7IHJldHVybiArK21NdXRlQ291bnQ7IH0KKyAgICBpbnQgZGVjTXV0ZUNvdW50KCkgeyByZXR1cm4gbU11dGVDb3VudCA+IDAgPyAtLW1NdXRlQ291bnQgOiAtMTsgfQorCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3Qgb3ZlcnJpZGUKKyAgICB7CisgICAgICAgIEFjdGl2aXR5VHJhY2tpbmc6OmR1bXAoZHN0LCBzcGFjZXMpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiLCBWb2x1bWU6ICUuMDNmLCBNdXRlQ291bnQ6ICUwMmRcbiIsIG1DdXJWb2x1bWVEYiwgbU11dGVDb3VudCk7CisgICAgfQorICAgIHZvaWQgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZURiKSB7IG1DdXJWb2x1bWVEYiA9IHZvbHVtZURiOyB9CisgICAgZmxvYXQgZ2V0Vm9sdW1lKCkgY29uc3QgeyByZXR1cm4gbUN1clZvbHVtZURiOyB9CisKK3ByaXZhdGU6CisgICAgaW50IG1NdXRlQ291bnQgPSAwOyAvKio8IG11dGUgcmVxdWVzdCBjb3VudGVyICovCisgICAgZmxvYXQgbUN1clZvbHVtZURiID0gTkFOOyAvKio8IGN1cnJlbnQgdm9sdW1lIGluIGRCLiAqLworfTsKKy8qKgorICogTm90ZTogdm9sdW1lIGFjdGl2aXRpZXMgc2hhbGwgYmUgaW5kZXhlZCBieSBDdXJ2ZXNJZCBpZiB3ZSB3YW50IHRvIGFsbG93IG11bHRpcGxlCisgKiBjdXJ2ZXMgcGVyIHZvbHVtZSBzb3VyY2UsIGluZmVycmluZyBhIG11dGUgbWFuYWdlbWVudCBvciB2b2x1bWUgYmFsYW5jaW5nIGJldHdlZW4gSFcgYW5kIFNXIGlzCisgKiBkb25lCisgKi8KK3VzaW5nIFZvbHVtZUFjdGl2aXRpZXMgPSBzdGQ6Om1hcDxWb2x1bWVTb3VyY2UsIFZvbHVtZUFjdGl2aXR5PjsKKworLyoqCisgKiBAYnJpZWYgVGhlIEFjdGl2aXR5IGNsYXNzOiBpdCB0cmFja3MgdGhlIGFjdGl2aXR5IGZvciB2b2x1bWUgcG9saWN5ICh2b2x1bWUgaW5kZXgsIG11dGUsCisgKiBtZW1vcml6ZSBwcmV2aW91cyBzdG9wLCBhbmQgc3RvcmUgbXV0ZSBpZiBpbmNvbXBhdGlibGUgZGV2aWNlIHdpdGggYW5vdGhlciBzdHJhdGVneS4KKyAqIEhhdmluZyB0aGlzIGNsYXNzIHByZXZlbnRzIGZyb20gbG9vcGluZyBvbiBhbGwgYXR0cmlidXRlcyAobGVnYWN5IHN0cmVhbXMpIG9mIHRoZSBzdHJhdGVneQorICovCitjbGFzcyBSb3V0aW5nQWN0aXZpdHkgOiBwdWJsaWMgQWN0aXZpdHlUcmFja2luZworeworcHVibGljOgorICAgIHZvaWQgc2V0TXV0ZWRCeURldmljZSggYm9vbCBpc011dGVkKSB7IG1Jc011dGVkQnlEZXZpY2UgPSBpc011dGVkOyB9CisgICAgYm9vbCBpc011dGVkQnlEZXZpY2UoKSBjb25zdCB7IHJldHVybiBtSXNNdXRlZEJ5RGV2aWNlOyB9CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIEFjdGl2aXR5VHJhY2tpbmc6OmR1bXAoZHN0LCBzcGFjZXMpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG4iKTsKKyAgICB9Citwcml2YXRlOgorICAgIC8qKgorICAgICAqIHN0cmF0ZWdpZXMgbXV0ZWQgYmVjYXVzZSBvZiBpbmNvbXBhdGlibGUgZGV2aWNlIHNlbGVjdGlvbi4KKyAgICAgKiBTZWUgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKCkKKyAgICAgKi8KKyAgICBib29sIG1Jc011dGVkQnlEZXZpY2UgPSBmYWxzZTsKK307Cit1c2luZyBSb3V0aW5nQWN0aXZpdGllcyA9IHN0ZDo6bWFwPHByb2R1Y3Rfc3RyYXRlZ3lfdCwgUm91dGluZ0FjdGl2aXR5PjsKIAogLy8gZGVzY3JpcHRvciBmb3IgYXVkaW8gb3V0cHV0cy4gVXNlZCB0byBtYWludGFpbiBjdXJyZW50IGNvbmZpZ3VyYXRpb24gb2YgZWFjaCBvcGVuZWQgYXVkaW8gb3V0cHV0CiAvLyBhbmQga2VlcCB0cmFjayBvZiB0aGUgdXNhZ2Ugb2YgdGhpcyBvdXRwdXQgYnkgZWFjaCBhdWRpbyBzdHJlYW0gdHlwZS4KLWNsYXNzIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjogcHVibGljIEF1ZGlvUG9ydENvbmZpZworY2xhc3MgQXVkaW9PdXRwdXREZXNjcmlwdG9yOiBwdWJsaWMgQXVkaW9Qb3J0Q29uZmlnLCBwdWJsaWMgQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UKKyAgICAsIHB1YmxpYyBDbGllbnRNYXBIYW5kbGVyPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4KIHsKIHB1YmxpYzoKICAgICBBdWRpb091dHB1dERlc2NyaXB0b3IoY29uc3Qgc3A8QXVkaW9Qb3J0PiYgcG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7CiAgICAgdmlydHVhbCB+QXVkaW9PdXRwdXREZXNjcmlwdG9yKCkge30KIAotICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCBvdmVycmlkZTsKICAgICB2b2lkICAgICAgICBsb2coY29uc3QgY2hhciogaW5kZW50KTsKIAogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0SWQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UoKSBjb25zdDsKLSAgICB2aXJ0dWFsIGJvb2wgc2hhcmVzSHdNb2R1bGVXaXRoKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MpOwotICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IHN1cHBvcnRlZERldmljZXMoKTsKKyAgICB2aXJ0dWFsIERldmljZVZlY3RvciBkZXZpY2VzKCkgY29uc3QgeyByZXR1cm4gbURldmljZXM7IH0KKyAgICBib29sIHNoYXJlc0h3TW9kdWxlV2l0aChjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjKTsKKyAgICB2aXJ0dWFsIERldmljZVZlY3RvciBzdXBwb3J0ZWREZXZpY2VzKCkgY29uc3QgIHsgcmV0dXJuIG1EZXZpY2VzOyB9CiAgICAgdmlydHVhbCBib29sIGlzRHVwbGljYXRlZCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CiAgICAgdmlydHVhbCB1aW50MzJfdCBsYXRlbmN5KCkgeyByZXR1cm4gMDsgfQogICAgIHZpcnR1YWwgYm9vbCBpc0ZpeGVkVm9sdW1lKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwotICAgIHZpcnR1YWwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzdWJPdXRwdXQxKCkgeyByZXR1cm4gMDsgfQotICAgIHZpcnR1YWwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzdWJPdXRwdXQyKCkgeyByZXR1cm4gMDsgfQotICAgIHZpcnR1YWwgYm9vbCBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgdmlydHVhbCBib29sIHNldFZvbHVtZShmbG9hdCB2b2x1bWVEYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIGNvbnN0IFN0cmVhbVR5cGVWZWN0b3IgJnN0cmVhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpOwotICAgIHZpcnR1YWwgdm9pZCBjaGFuZ2VSZWZDb3VudChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGRlbHRhKTsKIAotICAgIGJvb2wgaXNBY3RpdmUodWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKLSAgICBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzeXNUaW1lID0gMCkgY29uc3Q7CisgICAgLyoqCisgICAgICogQGJyaWVmIHNldFN0b3BUaW1lIHNldCB0aGUgc3RvcCB0aW1lIGR1ZSB0byB0aGUgY2xpZW50IHN0b3BwYWdlIG9yIGEgcmUgcm91dGluZyBvZiB0aGlzCisgICAgICogY2xpZW50CisgICAgICogQHBhcmFtIGNsaWVudCB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHBhcmFtIHN5c1RpbWUgd2hlbiB0aGUgY2xpZW50IHN0b3BwZWQvd2FzIHJlcm91dGVkCisgICAgICovCisgICAgdm9pZCBzZXRTdG9wVGltZShjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIG5zZWNzX3Qgc3lzVGltZSk7CisKKyAgICAvKioKKyAgICAgKiBDaGFuZ2VzIHRoZSBjbGllbnQtPmFjdGl2ZSgpIHN0YXRlIGFuZCB0aGUgb3V0cHV0IGRlc2NyaXB0b3IncyBnbG9iYWwgYWN0aXZlIGNvdW50LAorICAgICAqIGFsb25nIHdpdGggdGhlIHN0cmVhbSBhY3RpdmUgY291bnQgYW5kIG1BY3RpdmVDbGllbnRzLgorICAgICAqIFRoZSBjbGllbnQgbXVzdCBiZSBwcmV2aW91c2x5IGFkZGVkIGJ5IHRoZSBiYXNlIGNsYXNzIGFkZENsaWVudCgpLgorICAgICAqIEluIGNhc2Ugb2YgZHVwbGljYXRpbmcgdGhyZWFkLCBjbGllbnQgc2hhbGwgYmUgYWRkZWQgb24gdGhlIGR1cGxpY2F0ZWQgdGhyZWFkLCBub3Qgb24gdGhlCisgICAgICogaW52b2x2ZWQgb3V0cHV0cyBidXQgc2V0Q2xpZW50QWN0aXZlIHdpbGwgYmUgY2FsbGVkIG9uIGFsbCBvdXRwdXQgdG8gdHJhY2sgc3RyYXRlZ3kgYW5kCisgICAgICogYWN0aXZlIGNsaWVudCBmb3IgYSBnaXZlbiBvdXRwdXQuCisgICAgICogQWN0aXZlIHJlZiBjb3VudCBvZiB0aGUgY2xpZW50IHdpbGwgYmUgaW5jcmVtZW50ZWQvZGVjcmVtZW50ZWQgdGhyb3VnaCBzZXRBY3RpdmUgQVBJCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIHNldENsaWVudEFjdGl2ZShjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIGJvb2wgYWN0aXZlKTsKKworICAgIGJvb2wgaXNBY3RpdmUodWludDMyX3QgaW5QYXN0TXMpIGNvbnN0OworICAgIGJvb2wgaXNBY3RpdmUoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSA9IFZPTFVNRV9TT1VSQ0VfTk9ORSwKKyAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zID0gMCwKKyAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSA9IDApIGNvbnN0OworICAgIGJvb2wgaXNBbnlBY3RpdmUoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZVRvSWdub3JlKSBjb25zdDsKKworICAgIHN0ZDo6dmVjdG9yPFZvbHVtZVNvdXJjZT4gZ2V0QWN0aXZlVm9sdW1lU291cmNlcygpIGNvbnN0IHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8Vm9sdW1lU291cmNlPiBhY3RpdmVMaXN0OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiBtVm9sdW1lQWN0aXZpdGllcykgeworICAgICAgICAgICAgaWYgKGl0ZXIuc2Vjb25kLmlzQWN0aXZlKCkpIHsKKyAgICAgICAgICAgICAgICBhY3RpdmVMaXN0LnB1c2hfYmFjayhpdGVyLmZpcnN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYWN0aXZlTGlzdDsKKyAgICB9CisgICAgdWludDMyX3QgZ2V0QWN0aXZpdHlDb3VudChWb2x1bWVTb3VyY2UgdnMpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbVZvbHVtZUFjdGl2aXRpZXMuZmluZCh2cykgIT0gc3RkOjplbmQobVZvbHVtZUFjdGl2aXRpZXMpPworICAgICAgICAgICAgICAgICAgICBtVm9sdW1lQWN0aXZpdGllcy5hdCh2cykuZ2V0QWN0aXZpdHlDb3VudCgpIDogMDsKKyAgICB9CisgICAgYm9vbCBpc011dGVkKFZvbHVtZVNvdXJjZSB2cykgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtVm9sdW1lQWN0aXZpdGllcy5maW5kKHZzKSAhPSBzdGQ6OmVuZChtVm9sdW1lQWN0aXZpdGllcyk/CisgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVBY3Rpdml0aWVzLmF0KHZzKS5pc011dGVkKCkgOiBmYWxzZTsKKyAgICB9CisgICAgaW50IGdldE11dGVDb3VudChWb2x1bWVTb3VyY2UgdnMpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbVZvbHVtZUFjdGl2aXRpZXMuZmluZCh2cykgIT0gc3RkOjplbmQobVZvbHVtZUFjdGl2aXRpZXMpPworICAgICAgICAgICAgICAgICAgICBtVm9sdW1lQWN0aXZpdGllcy5hdCh2cykuZ2V0TXV0ZUNvdW50KCkgOiAwOworICAgIH0KKyAgICBpbnQgaW5jTXV0ZUNvdW50KFZvbHVtZVNvdXJjZSB2cykKKyAgICB7CisgICAgICAgIHJldHVybiBtVm9sdW1lQWN0aXZpdGllc1t2c10uaW5jTXV0ZUNvdW50KCk7CisgICAgfQorICAgIGludCBkZWNNdXRlQ291bnQoVm9sdW1lU291cmNlIHZzKQorICAgIHsKKyAgICAgICAgcmV0dXJuIG1Wb2x1bWVBY3Rpdml0aWVzW3ZzXS5kZWNNdXRlQ291bnQoKTsKKyAgICB9CisgICAgdm9pZCBzZXRDdXJWb2x1bWUoVm9sdW1lU291cmNlIHZzLCBmbG9hdCB2b2x1bWVEYikKKyAgICB7CisgICAgICAgIC8vIEV2ZW4gaWYgbm90IGFjdGl2aXR5IGZvciB0aGlzIHNvdXJjZSByZWdpc3RlcmVkLCBuZWVkIHRvIGNyZWF0ZSBhbnl3YXkKKyAgICAgICAgbVZvbHVtZUFjdGl2aXRpZXNbdnNdLnNldFZvbHVtZSh2b2x1bWVEYik7CisgICAgfQorICAgIGZsb2F0IGdldEN1clZvbHVtZShWb2x1bWVTb3VyY2UgdnMpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbVZvbHVtZUFjdGl2aXRpZXMuZmluZCh2cykgIT0gc3RkOjplbmQobVZvbHVtZUFjdGl2aXRpZXMpID8KKyAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUFjdGl2aXRpZXMuYXQodnMpLmdldFZvbHVtZSgpIDogTkFOOworICAgIH0KKworICAgIGJvb2wgaXNTdHJhdGVneUFjdGl2ZShwcm9kdWN0X3N0cmF0ZWd5X3QgcHMsIHVpbnQzMl90IGluUGFzdE1zID0gMCwgbnNlY3NfdCBzeXNUaW1lID0gMCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtUm91dGluZ0FjdGl2aXRpZXMuZmluZChwcykgIT0gc3RkOjplbmQobVJvdXRpbmdBY3Rpdml0aWVzKT8KKyAgICAgICAgICAgICAgICAgICAgbVJvdXRpbmdBY3Rpdml0aWVzLmF0KHBzKS5pc0FjdGl2ZShpblBhc3RNcywgc3lzVGltZSkgOiBmYWxzZTsKKyAgICB9CisgICAgYm9vbCBpc1N0cmF0ZWd5TXV0ZWRCeURldmljZShwcm9kdWN0X3N0cmF0ZWd5X3QgcHMpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbVJvdXRpbmdBY3Rpdml0aWVzLmZpbmQocHMpICE9IHN0ZDo6ZW5kKG1Sb3V0aW5nQWN0aXZpdGllcyk/CisgICAgICAgICAgICAgICAgICAgIG1Sb3V0aW5nQWN0aXZpdGllcy5hdChwcykuaXNNdXRlZEJ5RGV2aWNlKCkgOiBmYWxzZTsKKyAgICB9CisgICAgdm9pZCBzZXRTdHJhdGVneU11dGVkQnlEZXZpY2UocHJvZHVjdF9zdHJhdGVneV90IHBzLCBib29sIGlzTXV0ZWQpCisgICAgeworICAgICAgICBtUm91dGluZ0FjdGl2aXRpZXNbcHNdLnNldE11dGVkQnlEZXZpY2UoaXNNdXRlZCk7CisgICAgfQogCiAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdDsKQEAgLTczLDIyICsyNTIsNTggQEAKIAogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBnZXRNb2R1bGVIYW5kbGUoKSBjb25zdDsKIAotICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldFBhdGNoSGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbVBhdGNoSGFuZGxlOyB9OwotICAgIHZvaWQgc2V0UGF0Y2hIYW5kbGUoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSB7IG1QYXRjaEhhbmRsZSA9IGhhbmRsZTsgfTsKKyAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBBdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZQorICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgZ2V0Q29uZmlnKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZ2V0UGF0Y2hIYW5kbGUoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHNldFBhdGNoSGFuZGxlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgb3ZlcnJpZGU7CiAKLSAgICBzcDxBdWRpb1BvcnQ+ICAgICAgIG1Qb3J0OwotICAgIGF1ZGlvX2RldmljZXNfdCBtRGV2aWNlOyAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGRldmljZSB0aGlzIG91dHB1dCBpcyByb3V0ZWQgdG8KLSAgICB1aW50MzJfdCBtUmVmQ291bnRbQVVESU9fU1RSRUFNX0NOVF07IC8vIG51bWJlciBvZiBzdHJlYW1zIG9mIGVhY2ggdHlwZSB1c2luZyB0aGlzIG91dHB1dAotICAgIG5zZWNzX3QgbVN0b3BUaW1lW0FVRElPX1NUUkVBTV9DTlRdOwotICAgIGZsb2F0IG1DdXJWb2x1bWVbQVVESU9fU1RSRUFNX0NOVF07ICAgLy8gY3VycmVudCBzdHJlYW0gdm9sdW1lIGluIGRCCi0gICAgaW50IG1NdXRlQ291bnRbQVVESU9fU1RSRUFNX0NOVF07ICAgICAvLyBtdXRlIHJlcXVlc3QgY291bnRlcgotICAgIGJvb2wgbVN0cmF0ZWd5TXV0ZWRCeURldmljZVtOVU1fU1RSQVRFR0lFU107IC8vIHN0cmF0ZWdpZXMgbXV0ZWQgYmVjYXVzZSBvZiBpbmNvbXBhdGlibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXZpY2Ugc2VsZWN0aW9uLiBTZWUgY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcygpCi0gICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKm1DbGllbnRJbnRlcmZhY2U7CisgICAgVHJhY2tDbGllbnRWZWN0b3IgY2xpZW50c0xpc3QoYm9vbCBhY3RpdmVPbmx5ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5ID0gUFJPRFVDVF9TVFJBVEVHWV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJlZmVycmVkRGV2aWNlT25seSA9IGZhbHNlKSBjb25zdDsKKworICAgIC8vIG92ZXJyaWRlIENsaWVudE1hcEhhbmRsZXIgdG8gYWJvcnQgd2hlbiByZW1vdmluZyBhIGNsaWVudCB3aGVuIGFjdGl2ZS4KKyAgICB2b2lkIHJlbW92ZUNsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgb3ZlcnJpZGUgeworICAgICAgICBhdXRvIGNsaWVudCA9IGdldENsaWVudChwb3J0SWQpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGNsaWVudC5nZXQoKSA9PSBudWxscHRyLAorICAgICAgICAgICAgICAgICIlcyglZCk6IG5vbmV4aXN0ZW50IGNsaWVudCBwb3J0SWQgJWQiLCBfX2Z1bmNfXywgbUlkLCBwb3J0SWQpOworICAgICAgICAvLyBpdCBpcyBwb3NzaWJsZSB0aGF0IHdoZW4gYSBjbGllbnQgaXMgcmVtb3ZlZCwgd2UgY291bGQgcmVtb3ZlIGl0cworICAgICAgICAvLyBhc3NvY2lhdGVkIGFjdGl2ZSBjb3VudCBieSBjYWxsaW5nIGNoYW5nZVN0cmVhbUFjdGl2ZUNvdW50KCksCisgICAgICAgIC8vIGJ1dCB0aGF0IHdvdWxkIGJlIGhpZGluZyBhIHByb2JsZW0sIHNvIHdlIGxvZyBmYXRhbCBpbnN0ZWFkLgorICAgICAgICBhdXRvIGNsaWVudEl0ZXIgPSBzdGQ6OmZpbmQoYmVnaW4obUFjdGl2ZUNsaWVudHMpLCBlbmQobUFjdGl2ZUNsaWVudHMpLCBjbGllbnQpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGNsaWVudEl0ZXIgIT0gbUFjdGl2ZUNsaWVudHMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCVkKSByZW1vdmluZyBjbGllbnQgcG9ydElkICVkIHdoaWNoIGlzIGFjdGl2ZSAoY291bnQgJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBwb3J0SWQsIGNsaWVudC0+Z2V0QWN0aXZpdHlDb3VudCgpKTsKKyAgICAgICAgQ2xpZW50TWFwSGFuZGxlcjxUcmFja0NsaWVudERlc2NyaXB0b3I+OjpyZW1vdmVDbGllbnQocG9ydElkKTsKKyAgICB9CisKKyAgICBjb25zdCBUcmFja0NsaWVudFZlY3RvciYgZ2V0QWN0aXZlQ2xpZW50cygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVDbGllbnRzOworICAgIH0KKworICAgIGJvb2wgdXNlSHdHYWluKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAhZGV2aWNlcygpLmlzRW1wdHkoKSA/IGRldmljZXMoKS5pdGVtQXQoMCktPmhhc0dhaW5Db250cm9sbGVyKCkgOiBmYWxzZTsKKyAgICB9CisKKyAgICBEZXZpY2VWZWN0b3IgbURldmljZXM7IC8qKjwgY3VycmVudCBkZXZpY2VzIHRoaXMgb3V0cHV0IGlzIHJvdXRlZCB0byAqLworICAgIHdwPEF1ZGlvUG9saWN5TWl4PiBtUG9saWN5TWl4OyAgLy8gbm9uIE5VTEwgd2hlbiB1c2VkIGJ5IGEgZHluYW1pYyBwb2xpY3kKIAogcHJvdGVjdGVkOgotICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1QYXRjaEhhbmRsZTsKLSAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1JZDsKKyAgICBjb25zdCBzcDxBdWRpb1BvcnQ+IG1Qb3J0OworICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICogY29uc3QgbUNsaWVudEludGVyZmFjZTsKKyAgICB1aW50MzJfdCBtR2xvYmFsQWN0aXZlQ291bnQgPSAwOyAgLy8gbm9uLWNsaWVudC1zcGVjaWZpYyBhY3RpdmUgY291bnQKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1JZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisKKyAgICAvLyBUaGUgQWN0aXZlQ2xpZW50cyBzaG93cyB0aGUgY2xpZW50cyB0aGF0IGNvbnRyaWJ1dGUgdG8gdGhlIEBWb2x1bWVTb3VyY2UgY291bnRzCisgICAgLy8gYW5kIG1heSBpbmNsdWRlIHVwc3RyZWFtIGNsaWVudHMgZnJvbSBhIGR1cGxpY2F0aW5nIHRocmVhZC4KKyAgICAvLyBDb21wYXJlIHdpdGggdGhlIENsaWVudE1hcCAobUNsaWVudHMpIHdoaWNoIGFyZSBleHRlcm5hbCBBdWRpb1RyYWNrIGNsaWVudHMgb2YgdGhlCisgICAgLy8gb3V0cHV0IGRlc2NyaXB0b3IgKGFuZCBkbyBub3QgY291bnQgaW50ZXJuYWwgUGF0Y2hUcmFja3MpLgorICAgIFRyYWNrQ2xpZW50VmVjdG9yIG1BY3RpdmVDbGllbnRzOworCisgICAgUm91dGluZ0FjdGl2aXRpZXMgbVJvdXRpbmdBY3Rpdml0aWVzOyAvKio8IHRyYWNrIHJvdXRpbmcgYWN0aXZpdHkgb24gdGhpcyBvdXB1dC4qLworCisgICAgVm9sdW1lQWN0aXZpdGllcyBtVm9sdW1lQWN0aXZpdGllczsgLyoqPCB0cmFjayB2b2x1bWUgYWN0aXZpdHkgb24gdGhpcyBvdXB1dC4qLwogfTsKIAogLy8gQXVkaW8gb3V0cHV0IGRyaXZlbiBieSBhIHNvZnR3YXJlIG1peGVyIGluIGF1ZGlvIGZsaW5nZXIuCkBAIC05OSwxOSArMzE0LDI2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7CiAgICAgdmlydHVhbCB+U3dBdWRpb091dHB1dERlc2NyaXB0b3IoKSB7fQogCi0gICAgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQpOwotCi0gICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIHNoYXJlc0h3TW9kdWxlV2l0aChjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjKTsKLSAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBzdXBwb3J0ZWREZXZpY2VzKCk7CisgICAgICAgICAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIERldmljZVZlY3RvciBkZXZpY2VzKCkgY29uc3Q7CisgICAgdm9pZCBzZXREZXZpY2VzKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgeyBtRGV2aWNlcyA9IGRldmljZXM7IH0KKyAgICBib29sIHNoYXJlc0h3TW9kdWxlV2l0aChjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MpOworICAgIHZpcnR1YWwgRGV2aWNlVmVjdG9yIHN1cHBvcnRlZERldmljZXMoKSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgZGV2aWNlU3VwcG9ydHNFbmNvZGVkRm9ybWF0cyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKICAgICB2aXJ0dWFsIHVpbnQzMl90IGxhdGVuY3koKTsKICAgICB2aXJ0dWFsIGJvb2wgaXNEdXBsaWNhdGVkKCkgY29uc3QgeyByZXR1cm4gKG1PdXRwdXQxICE9IE5VTEwgJiYgbU91dHB1dDIgIT0gTlVMTCk7IH0KICAgICB2aXJ0dWFsIGJvb2wgaXNGaXhlZFZvbHVtZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKLSAgICB2aXJ0dWFsIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3ViT3V0cHV0MSgpIHsgcmV0dXJuIG1PdXRwdXQxOyB9Ci0gICAgdmlydHVhbCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IHN1Yk91dHB1dDIoKSB7IHJldHVybiBtT3V0cHV0MjsgfQotICAgIHZpcnR1YWwgdm9pZCBjaGFuZ2VSZWZDb3VudChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGRlbHRhKTsKLSAgICB2aXJ0dWFsIGJvb2wgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzdWJPdXRwdXQxKCkgeyByZXR1cm4gbU91dHB1dDE7IH0KKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3ViT3V0cHV0MigpIHsgcmV0dXJuIG1PdXRwdXQyOyB9CisgICAgdm9pZCBzZXRDbGllbnRBY3RpdmUoY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50LCBib29sIGFjdGl2ZSkgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRBbGxDbGllbnRzSW5hY3RpdmUoKQorICAgIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBjbGllbnRzTGlzdCh0cnVlKSkgeworICAgICAgICAgICAgc2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgZmFsc2UpOworICAgICAgICB9CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lRGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLCBjb25zdCBTdHJlYW1UeXBlVmVjdG9yICZzdHJlYW1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKTsKQEAgLTEyMCw0OCArMzQyLDcyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZyA9IE5VTEwpIGNvbnN0OwogICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3Q7CiAKLSAgICAgICAgICAgIHN0YXR1c190IG9wZW4oY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0KTsKLSAgICAgICAgICAgIC8vIENhbGxlZCB3aGVuIGEgc3RyZWFtIGlzIGFib3V0IHRvIGJlIHN0YXJ0ZWQKLSAgICAgICAgICAgIC8vIE5vdGU6IGNhbGxlZCBiZWZvcmUgY2hhbmdlUmVmQ291bnQoMSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGFydCgpOwotICAgICAgICAgICAgLy8gQ2FsbGVkIGFmdGVyIGEgc3RyZWFtIGlzIHN0b3BwZWQuCi0gICAgICAgICAgICAvLyBOb3RlOiBjYWxsZWQgYWZ0ZXIgY2hhbmdlUmVmQ291bnQoLTEpOwotICAgICAgICAgICAgdm9pZCBzdG9wKCk7Ci0gICAgICAgICAgICB2b2lkIGNsb3NlKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBvcGVuRHVwbGljYXRpbmcoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW9IYW5kbGUpOworICAgICAgICBzdGF0dXNfdCBvcGVuKGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQpOworCisgICAgICAgIC8vIENhbGxlZCB3aGVuIGEgc3RyZWFtIGlzIGFib3V0IHRvIGJlIHN0YXJ0ZWQKKyAgICAgICAgLy8gTm90ZTogY2FsbGVkIGJlZm9yZSBzZXRDbGllbnRBY3RpdmUodHJ1ZSk7CisgICAgICAgIHN0YXR1c190IHN0YXJ0KCk7CisgICAgICAgIC8vIENhbGxlZCBhZnRlciBhIHN0cmVhbSBpcyBzdG9wcGVkLgorICAgICAgICAvLyBOb3RlOiBjYWxsZWQgYWZ0ZXIgc2V0Q2xpZW50QWN0aXZlKGZhbHNlKTsKKyAgICAgICAgdm9pZCBzdG9wKCk7CisgICAgICAgIHZvaWQgY2xvc2UoKTsKKyAgICAgICAgc3RhdHVzX3Qgb3BlbkR1cGxpY2F0aW5nKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgc3VwcG9ydHNEZXZpY2UKKyAgICAgKiBAcGFyYW0gZGV2aWNlIHRvIGJlIGNoZWNrZWQgYWdhaW5zdAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGV2aWNlIGlzIHN1cHBvcnRlZCBieSB0eXBlIChmb3Igbm9uIGJ1cyAvIHJlbW90ZSBzdWJtaXggZGV2aWNlcyksCisgICAgICogICAgICAgICB0cnVlIGlmIHRoZSBkZXZpY2UgaXMgc3VwcG9ydGVkIChib3RoIHR5cGUgYW5kIGFkZHJlc3MpIGZvciBidXMgLyByZW1vdGUgc3VibWl4CisgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBib29sIHN1cHBvcnRzRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQGJyaWVmIHN1cHBvcnRzQWxsRGV2aWNlcworICAgICAqIEBwYXJhbSBkZXZpY2VzIHRvIGJlIGNoZWNrZWQgYWdhaW5zdAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGV2aWNlIGlzIHdlYWtseSBzdXBwb3J0ZWQgYnkgdHlwZSAoZS5nLiBmb3Igbm9uIGJ1cyAvIHJzdWJtaXggZGV2aWNlcyksCisgICAgICogICAgICAgICB0cnVlIGlmIHRoZSBkZXZpY2UgaXMgc3VwcG9ydGVkIChib3RoIHR5cGUgYW5kIGFkZHJlc3MpIGZvciBidXMgLyByZW1vdGUgc3VibWl4CisgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBib29sIHN1cHBvcnRzQWxsRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQGJyaWVmIGZpbHRlclN1cHBvcnRlZERldmljZXMgdGFrZXMgYSB2ZWN0b3Igb2YgZGV2aWNlcyBhbmQgZmlsdGVycyB0aGVtIGFjY29yZGluZyB0byB0aGUKKyAgICAgKiBkZXZpY2Ugc3VwcG9ydGVkIGJ5IHRoaXMgb3V0cHV0ICh0aGUgcHJvZmlsZSBmcm9tIHdoaWNoIHRoaXMgb3V0cHV0IGRlcml2ZXMgZnJvbSkKKyAgICAgKiBAcGFyYW0gZGV2aWNlcyByZWZlcmVuY2UgZGV2aWNlIHZlY3RvciB0byBiZSBmaWx0ZXJlZAorICAgICAqIEByZXR1cm4gdmVjdG9yIG9mIGRldmljZXMgZmlsdGVyZWQgZnJvbSB0aGUgc3VwcG9ydGVkIGRldmljZXMgb2YgdGhpcyBvdXRwdXQgKHdlYWtseSBvciBub3QKKyAgICAgKiBkZXBlbmRpbmcgb24gdGhlIGRldmljZSB0eXBlKQorICAgICAqLworICAgIERldmljZVZlY3RvciBmaWx0ZXJTdXBwb3J0ZWREZXZpY2VzKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3Q7CiAKICAgICBjb25zdCBzcDxJT1Byb2ZpbGU+IG1Qcm9maWxlOyAgICAgICAgICAvLyBJL08gcHJvZmlsZSB0aGlzIG91dHB1dCBkZXJpdmVzIGZyb20KICAgICBhdWRpb19pb19oYW5kbGVfdCBtSW9IYW5kbGU7ICAgICAgICAgICAvLyBvdXRwdXQgaGFuZGxlCiAgICAgdWludDMyX3QgbUxhdGVuY3k7ICAgICAgICAgICAgICAgICAgLy8KICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBtRmxhZ3M7ICAgLy8KLSAgICB3cDxBdWRpb1BvbGljeU1peD4gbVBvbGljeU1peDsgICAgICAgICAgIC8vIG5vbiBOVUxMIHdoZW4gdXNlZCBieSBhIGR5bmFtaWMgcG9saWN5CiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG1PdXRwdXQxOyAgICAvLyB1c2VkIGJ5IGR1cGxpY2F0ZWQgb3V0cHV0czogZmlyc3Qgb3V0cHV0CiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG1PdXRwdXQyOyAgICAvLyB1c2VkIGJ5IGR1cGxpY2F0ZWQgb3V0cHV0czogc2Vjb25kIG91dHB1dAogICAgIHVpbnQzMl90IG1EaXJlY3RPcGVuQ291bnQ7IC8vIG51bWJlciBvZiBjbGllbnRzIHVzaW5nIHRoaXMgb3V0cHV0IChkaXJlY3Qgb3V0cHV0cyBvbmx5KQogICAgIGF1ZGlvX3Nlc3Npb25fdCBtRGlyZWN0Q2xpZW50U2Vzc2lvbjsgLy8gc2Vzc2lvbiBpZCBvZiB0aGUgZGlyZWN0IG91dHB1dCBjbGllbnQKLSAgICB1aW50MzJfdCBtR2xvYmFsUmVmQ291bnQ7ICAvLyBub24tc3RyZWFtLXNwZWNpZmljIHJlZiBjb3VudAogfTsKIAogLy8gQXVkaW8gb3V0cHV0IGRyaXZlbiBieSBhbiBpbnB1dCBkZXZpY2UgZGlyZWN0bHkuCiBjbGFzcyBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjogcHVibGljIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcgogewogcHVibGljOgotICAgIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yKGNvbnN0IHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4mIHNvdXJjZSwKKyAgICBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiYgc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOwogICAgIHZpcnR1YWwgfkh3QXVkaW9PdXRwdXREZXNjcmlwdG9yKCkge30KIAotICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKKyAgICAgICAgICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3Qgc3VwcG9ydGVkRGV2aWNlcygpOwotICAgIHZpcnR1YWwgYm9vbCBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgdmlydHVhbCBib29sIHNldFZvbHVtZShmbG9hdCB2b2x1bWVEYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIGNvbnN0IFN0cmVhbVR5cGVWZWN0b3IgJnN0cmVhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpOwpAQCAtMTcwLDcgKzQxNiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZyA9IE5VTEwpIGNvbnN0OwogICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3Q7CiAKLSAgICBjb25zdCBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IG1Tb3VyY2U7CisgICAgY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gbVNvdXJjZTsKIAogfTsKIApAQCAtMTc4LDI1ICs0MjQsNTIgQEAKICAgICAgICAgcHVibGljIERlZmF1bHRLZXllZFZlY3RvcjwgYXVkaW9faW9faGFuZGxlX3QsIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiA+CiB7CiBwdWJsaWM6Ci0gICAgYm9vbCBpc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKKyAgICBib29sIGlzQWN0aXZlKFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CiAKICAgICAvKioKLSAgICAgKiByZXR1cm4gd2hldGhlciBhIHN0cmVhbSBpcyBwbGF5aW5nIHJlbW90ZWx5LCBvdmVycmlkZSB0byBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2YKKyAgICAgKiByZXR1cm4gd2hldGhlciBhbnkgc291cmNlIGNvbnRyaWJ1dGluZyB0byBWb2x1bWVTb3VyY2UgaXMgcGxheWluZyByZW1vdGVseSwgb3ZlcnJpZGUKKyAgICAgKiB0byBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2YKICAgICAgKiBsb2NhbC9yZW1vdGUgcGxheWJhY2ssIHVzZWQgZm9yIGluc3RhbmNlIGJ5IG5vdGlmaWNhdGlvbiBtYW5hZ2VyIHRvIG5vdCBtYWtlCiAgICAgICogbWVkaWEgcGxheWVycyBsb3NlIGF1ZGlvIGZvY3VzIHdoZW4gbm90IHBsYXlpbmcgbG9jYWxseQogICAgICAqIEZvciB0aGUgYmFzZSBpbXBsZW1lbnRhdGlvbiwgInJlbW90ZWx5IiBtZWFucyBwbGF5aW5nIGR1cmluZyBzY3JlZW4gbWlycm9yaW5nIHdoaWNoCiAgICAgICogdXNlcyBhbiBvdXRwdXQgZm9yIHBsYXliYWNrIHdpdGggYSBub24tZW1wdHksIG5vbiAiMCIgYWRkcmVzcy4KICAgICAgKi8KLSAgICBib29sIGlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CisgICAgYm9vbCBpc0FjdGl2ZVJlbW90ZWx5KFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CiAKICAgICAvKioKLSAgICAgKiByZXR1cm4gd2hldGhlciBhIHN0cmVhbSBpcyBwbGF5aW5nLCBidXQgbm90IG9uIGEgInJlbW90ZSIgZGV2aWNlLgorICAgICAqIHJldHVybiB3aGV0aGVyIGFueSBzb3VyY2UgY29udHJpYnV0aW5nIHRvIFZvbHVtZVNvdXJjZSBpcyBwbGF5aW5nLCBidXQgbm90IG9uIGEgInJlbW90ZSIKKyAgICAgKiBkZXZpY2UuCiAgICAgICogT3ZlcnJpZGUgdG8gY2hhbmdlIHRoZSBkZWZpbml0aW9uIG9mIGEgbG9jYWwvcmVtb3RlIHBsYXliYWNrLgogICAgICAqIFVzZWQgZm9yIGluc3RhbmNlIGJ5IHBvbGljeSBtYW5hZ2VyIHRvIGFsdGVyIHRoZSBzcGVha2VyIHBsYXliYWNrICgic3BlYWtlciBzYWZlIiBiZWhhdmlvcikKICAgICAgKiB3aGVuIG1lZGlhIHBsYXlzIG9yIG5vdCBsb2NhbGx5LgogICAgICAqIEZvciB0aGUgYmFzZSBpbXBsZW1lbnRhdGlvbiwgInJlbW90ZWx5IiBtZWFucyBwbGF5aW5nIGR1cmluZyBzY3JlZW4gbWlycm9yaW5nLgogICAgICAqLwotICAgIGJvb2wgaXNTdHJlYW1BY3RpdmVMb2NhbGx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OworICAgIGJvb2wgaXNBY3RpdmVMb2NhbGx5KFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgaXNTdHJhdGVneUFjdGl2ZU9uU2FtZU1vZHVsZSBjaGVja3MgaWYgdGhlIGdpdmVuIHN0cmF0ZWd5IGlzIGFjdGl2ZSAob3Igd2FzIGFjdGl2ZQorICAgICAqIGluIHRoZSBwYXN0KSBvbiB0aGUgZ2l2ZW4gb3V0cHV0IGFuZCBhbGwgdGhlIG91dHB1dHMgYmVsb25naW5nIHRvIHRoZSBzYW1lIEhXIE1vZHVsZQorICAgICAqIHRoZSBzYW1lIG1vZHVsZSB0aGFuIHRoZSBnaXZlbiBvdXRwdXQKKyAgICAgKiBAcGFyYW0gb3V0cHV0RGVzYyB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHBhcmFtIHBzIHByb2R1Y3Qgc3RyYXRlZ3kgdG8gYmUgY2hlY2tlZCB1cG9uIGFjdGl2aXR5IHN0YXR1cworICAgICAqIEBwYXJhbSBpblBhc3RNcyBpZiAwLCBjaGVjayBjdXJyZW50bHksIG90aGVyd2lzZSwgY2hlY2sgaW4gdGhlIHBhc3QKKyAgICAgKiBAcGFyYW0gc3lzVGltZSBzaGFsbCBiZSBzZXQgaWYgcmVxdWVzdCBpcyBkb25lIGZvciB0aGUgcGFzdCBhY3Rpdml0eS4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW4gb3V0cHV0IGZvbGxvd2luZyB0aGUgc3RyYXRlZ3kgaXMgYWN0aXZlIG9uIHRoZSBzYW1lIG1vZHVsZSB0aGFuIGRlc2MsCisgICAgICogZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgYm9vbCBpc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlKHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9IDAsIG5zZWNzX3Qgc3lzVGltZSA9IDApIGNvbnN0OworCisgICAgLyoqCisgICAgICogQGJyaWVmIGNsZWFyU2Vzc2lvblJvdXRlc0ZvckRldmljZTogd2hlbiBhIGRldmljZSBpcyBkaXNjb25uZWN0ZWQsIGFuZCBpZiB0aGlzIGRldmljZSBoYXMKKyAgICAgKiBiZWVuIGNob3NlbiBhcyB0aGUgcHJlZmVycmVkIGRldmljZSBieSBhbnkgY2xpZW50LCB0aGUgcG9saWN5IG1hbmFnZXIgc2hhbGwKKyAgICAgKiBwcmV2ZW50IGZyb20gdXNpbmcgdGhpcyBkZXZpY2UgYW55IG1vcmUgYnkgY2xlYXJpbmcgYWxsIHRoZSBzZXNzaW9uIHJvdXRlcyBpbnZvbHZpbmcgdGhpcworICAgICAqIGRldmljZS4KKyAgICAgKiBJbiBvdGhlciB3b3JkcywgdGhlIHByZWZlcnJlZCBkZXZpY2UgcG9ydCBpZCBvZiB0aGVzZSBjbGllbnRzIHdpbGwgYmUgcmVzZXR0ZWQgdG8gTk9ORS4KKyAgICAgKiBAcGFyYW0gZGlzY29ubmVjdGVkRGV2aWNlIGRldmljZSB0byBiZSBkaXNjb25uZWN0ZWQKKyAgICAgKi8KKyAgICB2b2lkIGNsZWFyU2Vzc2lvblJvdXRlc0ZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGlzY29ubmVjdGVkRGV2aWNlKTsKIAogICAgIC8qKgogICAgICAqIHJldHVybnMgdGhlIEEyRFAgb3V0cHV0IGhhbmRsZSBpZiBpdCBpcyBvcGVuIG9yIDAgb3RoZXJ3aXNlCkBAIC0yMTgsMjcgKzQ5MSw1MyBAQAogICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBnZXRQcmltYXJ5T3V0cHV0KCkgY29uc3Q7CiAKICAgICAvKioKLSAgICAgKiByZXR1cm4gdHJ1ZSBpZiBhbnkgb3V0cHV0IGlzIHBsYXlpbmcgYW55dGhpbmcgYmVzaWRlcyB0aGUgc3RyZWFtIHRvIGlnbm9yZQorICAgICAqIEBicmllZiBpc0FueU91dHB1dEFjdGl2ZSBjaGVja3MgaWYgYW55IG91dHB1dCBpcyBhY3RpdmUgKGFrYSBwbGF5aW5nKSBleGNlcHQgdGhlIG9uZShzKSB0aGF0CisgICAgICogaG9sZCB0aGUgdm9sdW1lIHNvdXJjZSB0byBiZSBpZ25vcmVkCisgICAgICogQHBhcmFtIHZvbHVtZVNvdXJjZVRvSWdub3JlIHNvdXJjZSBub3QgdG8gYmUgY29uc2lkZXJlZCBpbiB0aGUgYWN0aXZpdHkgZGV0ZWN0aW9uCisgICAgICogQHJldHVybiB0cnVlIGlmIGFueSBvdXRwdXQgaXMgYWN0aXZlIGZvciBhbnkgdm9sdW1lIHNvdXJjZSBleGNlcHQgdGhlIG9uZSB0byBiZSBpZ25vcmVkCiAgICAgICovCi0gICAgYm9vbCBpc0FueU91dHB1dEFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVRvSWdub3JlKSBjb25zdDsKKyAgICBib29sIGlzQW55T3V0cHV0QWN0aXZlKFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2VUb0lnbm9yZSkgY29uc3QKKyAgICB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJm91dHB1dERlc2MgPSB2YWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzQW55QWN0aXZlKHZvbHVtZVNvdXJjZVRvSWdub3JlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAKICAgICBhdWRpb19kZXZpY2VzX3QgZ2V0U3VwcG9ydGVkRGV2aWNlcyhhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUpIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0OworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBnZXRPdXRwdXRGb3JDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CiB9OwogCiBjbGFzcyBId0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiA6CiAgICAgICAgIHB1YmxpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8IGF1ZGlvX2lvX2hhbmRsZV90LCBzcDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gPgogewogcHVibGljOgotICAgIGJvb2wgaXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CisgICAgYm9vbCBpc0FjdGl2ZShWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OwogCiAgICAgLyoqCi0gICAgICogcmV0dXJuIHRydWUgaWYgYW55IG91dHB1dCBpcyBwbGF5aW5nIGFueXRoaW5nIGJlc2lkZXMgdGhlIHN0cmVhbSB0byBpZ25vcmUKKyAgICAgKiBAYnJpZWYgaXNBbnlPdXRwdXRBY3RpdmUgY2hlY2tzIGlmIGFueSBvdXRwdXQgaXMgYWN0aXZlIChha2EgcGxheWluZykgZXhjZXB0IHRoZSBvbmUocykgdGhhdAorICAgICAqIGhvbGQgdGhlIHZvbHVtZSBzb3VyY2UgdG8gYmUgaWdub3JlZAorICAgICAqIEBwYXJhbSB2b2x1bWVTb3VyY2VUb0lnbm9yZSBzb3VyY2Ugbm90IHRvIGJlIGNvbnNpZGVyZWQgaW4gdGhlIGFjdGl2aXR5IGRldGVjdGlvbgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbnkgb3V0cHV0IGlzIGFjdGl2ZSBmb3IgYW55IHZvbHVtZSBzb3VyY2UgZXhjZXB0IHRoZSBvbmUgdG8gYmUgaWdub3JlZAogICAgICAqLwotICAgIGJvb2wgaXNBbnlPdXRwdXRBY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1Ub0lnbm9yZSkgY29uc3Q7CisgICAgYm9vbCBpc0FueU91dHB1dEFjdGl2ZShWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlVG9JZ25vcmUpIGNvbnN0CisgICAgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+ICZvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0FueUFjdGl2ZSh2b2x1bWVTb3VyY2VUb0lnbm9yZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0OwogfTsKIAogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9QYXRjaC5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUGF0Y2guaAppbmRleCBjMWMzZjNjLi4wODQzZmVhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9QYXRjaC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BhdGNoLmgKQEAgLTIyLDYgKzIyLDcgQEAKICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzAsNyArMzEsNyBAQAogcHVibGljOgogICAgIEF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwgdWlkX3QgdWlkKTsKIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CiAKICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtSGFuZGxlOwogICAgIHN0cnVjdCBhdWRpb19wYXRjaCBtUGF0Y2g7CkBAIC00Nyw3ICs0OCw3IEBACiAKICAgICBzdGF0dXNfdCBsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcykgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lDb25maWcuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeUNvbmZpZy5oCmluZGV4IDQzZjZlZDYuLjIyNjRkOGYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeUNvbmZpZy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeUNvbmZpZy5oCkBAIC0xNiw4ICsxNiwxMCBAQAogCiAjcHJhZ21hIG9uY2UKIAorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKwogI2luY2x1ZGUgPEF1ZGlvR2Fpbi5oPgotI2luY2x1ZGUgPFZvbHVtZUN1cnZlLmg+CiAjaW5jbHVkZSA8QXVkaW9Qb3J0Lmg+CiAjaW5jbHVkZSA8QXVkaW9QYXRjaC5oPgogI2luY2x1ZGUgPERldmljZURlc2NyaXB0b3IuaD4KQEAgLTI4LDcgKzMwLDYgQEAKICNpbmNsdWRlIDxBdWRpb1BvbGljeU1peC5oPgogI2luY2x1ZGUgPEVmZmVjdERlc2NyaXB0b3IuaD4KICNpbmNsdWRlIDxTb3VuZFRyaWdnZXJTZXNzaW9uLmg+Ci0jaW5jbHVkZSA8U2Vzc2lvblJvdXRlLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzgsMjEgKzM5LDIwIEBACiAgICAgQXVkaW9Qb2xpY3lDb25maWcoSHdNb2R1bGVDb2xsZWN0aW9uICZod01vZHVsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVPdXRwdXREZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciAmYXZhaWxhYmxlSW5wdXREZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+ICZkZWZhdWx0T3V0cHV0RGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uICp2b2x1bWVzID0gbnVsbHB0cikKKyAgICAgICAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGVmYXVsdE91dHB1dERldmljZSkKICAgICAgICAgOiBtSHdNb2R1bGVzKGh3TW9kdWxlcyksCiAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMoYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyksCiAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcyhhdmFpbGFibGVJbnB1dERldmljZXMpLAotICAgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlcyhkZWZhdWx0T3V0cHV0RGV2aWNlcyksCi0gICAgICAgICAgbVZvbHVtZUN1cnZlcyh2b2x1bWVzKSwKKyAgICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZShkZWZhdWx0T3V0cHV0RGV2aWNlKSwKICAgICAgICAgICBtSXNTcGVha2VyRHJjRW5hYmxlZChmYWxzZSkKICAgICB7fQogCi0gICAgdm9pZCBzZXRWb2x1bWVzKGNvbnN0IFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24gJnZvbHVtZXMpCi0gICAgewotICAgICAgICBpZiAobVZvbHVtZUN1cnZlcyAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAqbVZvbHVtZUN1cnZlcyA9IHZvbHVtZXM7Ci0gICAgICAgIH0KKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0U291cmNlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVNvdXJjZTsKKyAgICB9CisKKyAgICB2b2lkIHNldFNvdXJjZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZSkgeworICAgICAgICBtU291cmNlID0gZmlsZTsKICAgICB9CiAKICAgICB2b2lkIHNldEh3TW9kdWxlcyhjb25zdCBId01vZHVsZUNvbGxlY3Rpb24gJmh3TW9kdWxlcykKQEAgLTEwMCw1MSArMTAwLDgzIEBACiAKICAgICB2b2lkIHNldERlZmF1bHRPdXRwdXREZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRlZmF1bHREZXZpY2UpCiAgICAgewotICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZXMgPSBkZWZhdWx0RGV2aWNlOworICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZSA9IGRlZmF1bHREZXZpY2U7CiAgICAgfQogCi0gICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmdldERlZmF1bHRPdXRwdXREZXZpY2UoKSBjb25zdCB7IHJldHVybiBtRGVmYXVsdE91dHB1dERldmljZXM7IH0KKyAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZ2V0RGVmYXVsdE91dHB1dERldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1EZWZhdWx0T3V0cHV0RGV2aWNlOyB9CiAKICAgICB2b2lkIHNldERlZmF1bHQodm9pZCkKICAgICB7Ci0gICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlcyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUik7Ci0gICAgICAgIHNwPEh3TW9kdWxlPiBtb2R1bGU7CisgICAgICAgIG1Tb3VyY2UgPSAiQXVkaW9Qb2xpY3lDb25maWc6OnNldERlZmF1bHQiOworICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUik7CisgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlLT5hZGRBdWRpb1Byb2ZpbGUoQXVkaW9Qcm9maWxlOjpjcmVhdGVGdWxsRHluYW1pYygpKTsKICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGVmYXVsdElucHV0RGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IoQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKTsKLSAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuYWRkKG1EZWZhdWx0T3V0cHV0RGV2aWNlcyk7CisgICAgICAgIGRlZmF1bHRJbnB1dERldmljZS0+YWRkQXVkaW9Qcm9maWxlKEF1ZGlvUHJvZmlsZTo6Y3JlYXRlRnVsbER5bmFtaWMoKSk7CisgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gbWljUHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoCisgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIEFVRElPX0NIQU5ORUxfSU5fTU9OTywgODAwMCk7CisgICAgICAgIGRlZmF1bHRJbnB1dERldmljZS0+YWRkQXVkaW9Qcm9maWxlKG1pY1Byb2ZpbGUpOworICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5hZGQobURlZmF1bHRPdXRwdXREZXZpY2UpOwogICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmFkZChkZWZhdWx0SW5wdXREZXZpY2UpOwogCi0gICAgICAgIG1vZHVsZSA9IG5ldyBId01vZHVsZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSk7CisgICAgICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBuZXcgSHdNb2R1bGUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlksIDIgLypoYWxWZXJzaW9uTWFqb3IqLyk7CisgICAgICAgIG1Id01vZHVsZXMuYWRkKG1vZHVsZSk7CisgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlLT5hdHRhY2gobW9kdWxlKTsKKyAgICAgICAgZGVmYXVsdElucHV0RGV2aWNlLT5hdHRhY2gobW9kdWxlKTsKIAotICAgICAgICBzcDxPdXRwdXRQcm9maWxlPiBvdXRQcm9maWxlOwotICAgICAgICBvdXRQcm9maWxlID0gbmV3IE91dHB1dFByb2ZpbGUoU3RyaW5nOCgicHJpbWFyeSIpKTsKLSAgICAgICAgb3V0UHJvZmlsZS0+YXR0YWNoKG1vZHVsZSk7CisgICAgICAgIHNwPE91dHB1dFByb2ZpbGU+IG91dFByb2ZpbGUgPSBuZXcgT3V0cHV0UHJvZmlsZShTdHJpbmc4KCJwcmltYXJ5IikpOwogICAgICAgICBvdXRQcm9maWxlLT5hZGRBdWRpb1Byb2ZpbGUoCiAgICAgICAgICAgICAgICAgbmV3IEF1ZGlvUHJvZmlsZShBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLCA0NDEwMCkpOwotICAgICAgICBvdXRQcm9maWxlLT5hZGRTdXBwb3J0ZWREZXZpY2UobURlZmF1bHRPdXRwdXREZXZpY2VzKTsKKyAgICAgICAgb3V0UHJvZmlsZS0+YWRkU3VwcG9ydGVkRGV2aWNlKG1EZWZhdWx0T3V0cHV0RGV2aWNlKTsKICAgICAgICAgb3V0UHJvZmlsZS0+c2V0RmxhZ3MoQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSk7CiAgICAgICAgIG1vZHVsZS0+YWRkT3V0cHV0UHJvZmlsZShvdXRQcm9maWxlKTsKIAotICAgICAgICBzcDxJbnB1dFByb2ZpbGU+IGluUHJvZmlsZTsKLSAgICAgICAgaW5Qcm9maWxlID0gbmV3IElucHV0UHJvZmlsZShTdHJpbmc4KCJwcmltYXJ5IikpOwotICAgICAgICBpblByb2ZpbGUtPmF0dGFjaChtb2R1bGUpOwotICAgICAgICBpblByb2ZpbGUtPmFkZEF1ZGlvUHJvZmlsZSgKLSAgICAgICAgICAgICAgICBuZXcgQXVkaW9Qcm9maWxlKEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBBVURJT19DSEFOTkVMX0lOX01PTk8sIDgwMDApKTsKKyAgICAgICAgc3A8SW5wdXRQcm9maWxlPiBpblByb2ZpbGUgPSBuZXcgSW5wdXRQcm9maWxlKFN0cmluZzgoInByaW1hcnkiKSk7CisgICAgICAgIGluUHJvZmlsZS0+YWRkQXVkaW9Qcm9maWxlKG1pY1Byb2ZpbGUpOwogICAgICAgICBpblByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShkZWZhdWx0SW5wdXREZXZpY2UpOwogICAgICAgICBtb2R1bGUtPmFkZElucHV0UHJvZmlsZShpblByb2ZpbGUpOwogCi0gICAgICAgIG1Id01vZHVsZXMuYWRkKG1vZHVsZSk7CisgICAgICAgIHNldERlZmF1bHRTdXJyb3VuZEZvcm1hdHMoKTsKKyAgICB9CisKKyAgICAvLyBTdXJyb3VuZCBmb3JtYXRzLCB3aXRoIGFuIG9wdGlvbmFsIGxpc3Qgb2Ygc3ViZm9ybWF0cyB0aGF0IGFyZSBlcXVpdmFsZW50IGZyb20gdXNlcnMnIFBPVi4KKyAgICB1c2luZyBTdXJyb3VuZEZvcm1hdHMgPSBzdGQ6OnVub3JkZXJlZF9tYXA8YXVkaW9fZm9ybWF0X3QsIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4+OworCisgICAgY29uc3QgU3Vycm91bmRGb3JtYXRzICZnZXRTdXJyb3VuZEZvcm1hdHMoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1TdXJyb3VuZEZvcm1hdHM7CisgICAgfQorCisgICAgdm9pZCBzZXRTdXJyb3VuZEZvcm1hdHMoY29uc3QgU3Vycm91bmRGb3JtYXRzICZzdXJyb3VuZEZvcm1hdHMpCisgICAgeworICAgICAgICBtU3Vycm91bmRGb3JtYXRzID0gc3Vycm91bmRGb3JtYXRzOworICAgIH0KKworICAgIHZvaWQgc2V0RGVmYXVsdFN1cnJvdW5kRm9ybWF0cygpCisgICAgeworICAgICAgICBtU3Vycm91bmRGb3JtYXRzID0geworICAgICAgICAgICAge0FVRElPX0ZPUk1BVF9BQzMsIHt9fSwKKyAgICAgICAgICAgIHtBVURJT19GT1JNQVRfRV9BQzMsIHt9fSwKKyAgICAgICAgICAgIHtBVURJT19GT1JNQVRfRFRTLCB7fX0sCisgICAgICAgICAgICB7QVVESU9fRk9STUFUX0RUU19IRCwge319LAorICAgICAgICAgICAge0FVRElPX0ZPUk1BVF9BQUNfTEMsIHsKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0FBQ19IRV9WMSwgQVVESU9fRk9STUFUX0FBQ19IRV9WMiwgQVVESU9fRk9STUFUX0FBQ19FTEQsCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfWEhFfX0sCisgICAgICAgICAgICB7QVVESU9fRk9STUFUX0RPTEJZX1RSVUVIRCwge319LAorICAgICAgICAgICAge0FVRElPX0ZPUk1BVF9FX0FDM19KT0MsIHt9fSwKKyAgICAgICAgICAgIHtBVURJT19GT1JNQVRfQUM0LCB7fX19OwogICAgIH0KIAogcHJpdmF0ZToKKyAgICBzdGQ6OnN0cmluZyBtU291cmNlOwogICAgIEh3TW9kdWxlQ29sbGVjdGlvbiAmbUh3TW9kdWxlczsgLyoqPCBDb2xsZWN0aW9uIG9mIE1vZHVsZSwgd2l0aCBQcm9maWxlcywgaS5lLiBNaXggUG9ydHMuICovCiAgICAgRGV2aWNlVmVjdG9yICZtQXZhaWxhYmxlT3V0cHV0RGV2aWNlczsKICAgICBEZXZpY2VWZWN0b3IgJm1BdmFpbGFibGVJbnB1dERldmljZXM7Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJm1EZWZhdWx0T3V0cHV0RGV2aWNlczsKLSAgICBWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uICptVm9sdW1lQ3VydmVzOworICAgIHNwPERldmljZURlc2NyaXB0b3I+ICZtRGVmYXVsdE91dHB1dERldmljZTsKICAgICAvLyBUT0RPOiByZW1vdmUgd2hlbiBsZWdhY3kgY29uZiBmaWxlIGlzIHJlbW92ZWQuIHRydWUgb24gZGV2aWNlcyB0aGF0IHVzZSBEUkMgb24gdGhlCiAgICAgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIgcGF0aCB0byBib29zdCBzb2Z0IHNvdW5kcywgdXNlZCB0byBhZGp1c3Qgdm9sdW1lIGN1cnZlcyBhY2NvcmRpbmdseS4KICAgICAvLyBOb3RlOiByZW1vdmUgYWxzbyBzcGVha2VyX2RyY19lbmFibGVkIGZyb20gZ2xvYmFsIGNvbmZpZ3VyYXRpb24gb2YgWE1MIGNvbmZpZyBmaWxlLgogICAgIGJvb2wgbUlzU3BlYWtlckRyY0VuYWJsZWQ7CisgICAgU3Vycm91bmRGb3JtYXRzIG1TdXJyb3VuZEZvcm1hdHM7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lNaXguaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeU1peC5oCmluZGV4IDMzNDU1NzkuLjA5NGY1MDYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeU1peC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeU1peC5oCkBAIC0xNiw0NiArMTYsNDcgQEAKIAogI3ByYWdtYSBvbmNlCiAKKyNpbmNsdWRlICJEZXZpY2VEZXNjcmlwdG9yLmgiCiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKLW5hbWVzcGFjZSBhbmRyb2lkIHsKKyNpbmNsdWRlIDxEZXZpY2VEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8QXVkaW9PdXRwdXREZXNjcmlwdG9yLmg+CiAKLWNsYXNzIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOworbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvKioKICAqIGN1c3RvbSBtaXggZW50cnkgaW4gbVBvbGljeU1peGVzCiAgKi8KIGNsYXNzIEF1ZGlvUG9saWN5TWl4IDogcHVibGljIEF1ZGlvTWl4LCBwdWJsaWMgUmVmQmFzZSB7CiBwdWJsaWM6Ci0gICAgQXVkaW9Qb2xpY3lNaXgoY29uc3QgQXVkaW9NaXggJm1peCk7CisgICAgQXVkaW9Qb2xpY3lNaXgoY29uc3QgQXVkaW9NaXggJm1peCkgOiBBdWRpb01peChtaXgpIHt9CiAgICAgQXVkaW9Qb2xpY3lNaXgoY29uc3QgQXVkaW9Qb2xpY3lNaXgmKSA9IGRlbGV0ZTsKICAgICBBdWRpb1BvbGljeU1peCYgb3BlcmF0b3I9KGNvbnN0IEF1ZGlvUG9saWN5TWl4JikgPSBkZWxldGU7CiAKLSAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJmdldE91dHB1dCgpIGNvbnN0OworICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmZ2V0T3V0cHV0KCkgY29uc3QgeyByZXR1cm4gbU91dHB1dDsgfQorICAgIHZvaWQgc2V0T3V0cHV0KGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmb3V0cHV0KSB7IG1PdXRwdXQgPSBvdXRwdXQ7IH0KKyAgICB2b2lkIGNsZWFyT3V0cHV0KCkgeyBtT3V0cHV0LmNsZWFyKCk7IH0KIAotICAgIHZvaWQgc2V0T3V0cHV0KHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmb3V0cHV0KTsKLQotICAgIHZvaWQgY2xlYXJPdXRwdXQoKTsKLQotICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CiAKIHByaXZhdGU6CiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG1PdXRwdXQ7ICAvLyBDb3JyZXNwb25kaW5nIG91dHB1dCBzdHJlYW0KIH07CiAKIAotY2xhc3MgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uIDogcHVibGljIERlZmF1bHRLZXllZFZlY3RvcjxTdHJpbmc4LCBzcDxBdWRpb1BvbGljeU1peD4gPgorY2xhc3MgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uIDogcHVibGljIFZlY3RvcjxzcDxBdWRpb1BvbGljeU1peD4+CiB7CiBwdWJsaWM6Ci0gICAgc3RhdHVzX3QgZ2V0QXVkaW9Qb2xpY3lNaXgoY29uc3QgU3RyaW5nOCYgYWRkcmVzcywgc3A8QXVkaW9Qb2xpY3lNaXg+ICZwb2xpY3lNaXgpIGNvbnN0OworICAgIHN0YXR1c190IGdldEF1ZGlvUG9saWN5TWl4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywgc3A8QXVkaW9Qb2xpY3lNaXg+ICZwb2xpY3lNaXgpIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgcmVnaXN0ZXJNaXgoY29uc3QgU3RyaW5nOCYgYWRkcmVzcywgQXVkaW9NaXggbWl4LCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyk7CisgICAgc3RhdHVzX3QgcmVnaXN0ZXJNaXgoQXVkaW9NaXggbWl4LCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyk7CiAKLSAgICBzdGF0dXNfdCB1bnJlZ2lzdGVyTWl4KGNvbnN0IFN0cmluZzgmIGFkZHJlc3MpOworICAgIHN0YXR1c190IHVucmVnaXN0ZXJNaXgoY29uc3QgQXVkaW9NaXgmIG1peCk7CiAKICAgICB2b2lkIGNsb3NlT3V0cHV0KHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmZGVzYyk7CiAKQEAgLTYzLDIxICs2NCw1MiBAQAogICAgICAqIFRyeSB0byBmaW5kIGFuIG91dHB1dCBkZXNjcmlwdG9yIGZvciB0aGUgZ2l2ZW4gYXR0cmlidXRlcy4KICAgICAgKgogICAgICAqIEBwYXJhbVtpbl0gYXR0cmlidXRlcyB0byBjb25zaWRlciBmb3dyIHRoZSByZXNlYXJjaCBvZiBvdXRwdXQgZGVzY3JpcHRvci4KLSAgICAgKiBAcGFyYW1bb3V0XSBkZXNjIHRvIHJldHVybiBpZiBhbiBvdXRwdXQgY291bGQgYmUgZm91bmQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIGFuIG91dHB1dCB3YXMgZm91bmQgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGUgKGluIHRoaXMgY2FzZSwgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yIG91dHB1dCBwYXJhbSBpcyBpbml0aWFsaXplZCksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICAgICAqIEBwYXJhbVtvdXRdIGRlc2MgdG8gcmV0dXJuIGlmIGFuIHByaW1hcnkgb3V0cHV0IGNvdWxkIGJlIGZvdW5kLgorICAgICAqIEBwYXJhbVtvdXRdIHNlY29uZGFyeURlc2Mgb3RoZXIgZGVzYyB0aGF0IHRoZSBhdWRpbyBzaG91bGQgYmUgcm91dGVkIHRvLgorICAgICAqIEByZXR1cm4gT0sgaWYgdGhlIHJlcXVlc3QgaXMgdmFsaWQKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZSBpZiB0aGUgcmVxdWVzdCBpcyBub3Qgc3VwcG9ydGVkCiAgICAgICovCi0gICAgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0cihhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywgdWlkX3QgdWlkLAotICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+ICZkZXNjKTsKKyAgICBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcywgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJnByaW1hcnlEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+PiAqc2Vjb25kYXJ5RGVzY3MpOwogCi0gICAgYXVkaW9fZGV2aWNlc190IGdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxhYmxlRGV2aWNlVHlwZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiAqcG9saWN5TWl4KTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZURldmljZVR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiAqcG9saWN5TWl4KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiB0cnkgdG8gZmluZCBhIG1hdGNoaW5nIG1peCBmb3IgYSBnaXZlbiBvdXRwdXQgZGVzY3JpcHRvciBhbmQgcmV0dXJucyB0aGUgYXNzb2NpYXRlZAorICAgICAqIG91dHB1dCBkZXZpY2UuCisgICAgICogQHBhcmFtIG91dHB1dCB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHBhcmFtIGF2YWlsYWJsZU91dHB1dERldmljZXMgbGlzdCBvZiBvdXRwdXQgZGV2aWNlcyBjdXJyZW50bHkgcmVhY2hhYmxlCisgICAgICogQHJldHVybiBkZXZpY2Ugc2VsZWN0ZWQgZnJvbSB0aGUgbWl4IGF0dGFjaGVkIHRvIHRoZSBvdXRwdXQsIG51bGwgcG9pbnRlciBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2VBbmRNaXhGb3JPdXRwdXQoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+ICZvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7CiAKICAgICBzdGF0dXNfdCBnZXRJbnB1dE1peEZvckF0dHIoYXVkaW9fYXR0cmlidXRlc190IGF0dHIsIHNwPEF1ZGlvUG9saWN5TWl4PiAqcG9saWN5TWl4KTsKIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIHRoZSBtaXggcnVsZXMgaW4gb3JkZXIgdG8gbWFrZSBzdHJlYW1zIGFzc29jaWF0ZWQgd2l0aCB0aGUgZ2l2ZW4gdWlkCisgICAgICogYmUgcm91dGVkIHRvIHRoZSBnaXZlbiBhdWRpbyBkZXZpY2VzLgorICAgICAqIEBwYXJhbSB1aWQgdGhlIHVpZCBmb3Igd2hpY2ggdGhlIGRldmljZSBhZmZpbml0eSBpcyBzZXQKKyAgICAgKiBAcGFyYW0gZGV2aWNlcyB0aGUgdmVjdG9yIG9mIGRldmljZXMgdGhhdCB0aGlzIHVpZCBtYXkgYmUgcm91dGVkIHRvLiBBIHR5cGljYWwKKyAgICAgKiAgICB1c2UgaXMgdG8gcGFzcyB0aGUgZGV2aWNlcyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiB6b25lIGluIGEgbXVsdGktem9uZSBzZXR1cC4KKyAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIHRoZSB1cGRhdGUgd2FzIHN1Y2Nlc3NmdWwsIElOVkFMSURfT1BFUkFUSU9OIG90aGVyd2lzZS4KKyAgICAgKiAgICBBbiBleGFtcGxlIG9mIGZhaWx1cmUgaXMgd2hlbiB0aGVyZSBhcmUgYWxyZWFkeSBydWxlcyBpbiBwbGFjZSB0byByZXN0cmljdAorICAgICAqICAgIGEgbWl4IHRvIHRoZSBnaXZlbiB1aWQgKGkuZS4gd2hlbiBhIE1BVENIX1VJRCBydWxlIHdhcyBzZXQgZm9yIGl0KS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKTsKKyAgICBzdGF0dXNfdCByZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCk7CisgICAgc3RhdHVzX3QgZ2V0RGV2aWNlc0ZvclVpZCh1aWRfdCB1aWQsIFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykgY29uc3Q7CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBlbnVtIGNsYXNzIE1peE1hdGNoU3RhdHVzIHsgTUFUQ0gsIE5PX01BVENILCBJTlZBTElEX01JWCB9OworICAgIE1peE1hdGNoU3RhdHVzIG1peE1hdGNoKGNvbnN0IEF1ZGlvTWl4KiBtaXgsIHNpemVfdCBtaXhJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMsIHVpZF90IHVpZCk7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb3J0LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb3J0LmgKaW5kZXggMDlhODZkZC4uZDkwNmYxMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9ydC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvcnQuaApAQCAtMTgsNiArMTgsNyBAQAogCiAjaW5jbHVkZSAiQXVkaW9Db2xsZWN0aW9ucy5oIgogI2luY2x1ZGUgIkF1ZGlvUHJvZmlsZS5oIgorI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgogI2luY2x1ZGUgIkhhbmRsZUdlbmVyYXRvci5oIgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KQEAgLTI5LDkgKzMwLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgSHdNb2R1bGU7Ci1jbGFzcyBBdWRpb0dhaW47CiBjbGFzcyBBdWRpb1JvdXRlOwotdHlwZWRlZiBWZWN0b3I8c3A8QXVkaW9HYWluPiA+IEF1ZGlvR2FpbkNvbGxlY3Rpb247CiAKIGNsYXNzIEF1ZGlvUG9ydCA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UsIHByaXZhdGUgSGFuZGxlR2VuZXJhdG9yPGF1ZGlvX3BvcnRfaGFuZGxlX3Q+CiB7CkBAIC00OSw4ICs0OCw4IEBACiAKICAgICB2aXJ0dWFsIGNvbnN0IFN0cmluZzggZ2V0VGFnTmFtZSgpIGNvbnN0ID0gMDsKIAotICAgIHZvaWQgc2V0R2FpbnMoY29uc3QgQXVkaW9HYWluQ29sbGVjdGlvbiAmZ2FpbnMpIHsgbUdhaW5zID0gZ2FpbnM7IH0KLSAgICBjb25zdCBBdWRpb0dhaW5Db2xsZWN0aW9uICZnZXRHYWlucygpIGNvbnN0IHsgcmV0dXJuIG1HYWluczsgfQorICAgIHZvaWQgc2V0R2FpbnMoY29uc3QgQXVkaW9HYWlucyAmZ2FpbnMpIHsgbUdhaW5zID0gZ2FpbnM7IH0KKyAgICBjb25zdCBBdWRpb0dhaW5zICZnZXRHYWlucygpIGNvbnN0IHsgcmV0dXJuIG1HYWluczsgfQogCiAgICAgdmlydHVhbCB2b2lkIHNldEZsYWdzKHVpbnQzMl90IGZsYWdzKQogICAgIHsKQEAgLTY1LDYgKzY0LDcgQEAKICAgICB1aW50MzJfdCBnZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIG1GbGFnczsgfQogCiAgICAgdmlydHVhbCB2b2lkIGF0dGFjaChjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSk7CisgICAgdmlydHVhbCB2b2lkIGRldGFjaCgpOwogICAgIGJvb2wgaXNBdHRhY2hlZCgpIHsgcmV0dXJuIG1Nb2R1bGUgIT0gMDsgfQogCiAgICAgLy8gQXVkaW8gcG9ydCBJRHMgYXJlIGluIGEgZGlmZmVyZW50IG5hbWVzcGFjZSB0aGFuIEF1ZGlvRmxpbmdlciB1bmlxdWUgSURzCkBAIC0xMTIsMTAgKzExMiwxNCBAQAogICAgIHN0YXRpYyBib29sIGlzQmV0dGVyRm9ybWF0TWF0Y2goYXVkaW9fZm9ybWF0X3QgbmV3Rm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGN1cnJlbnRGb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgdGFyZ2V0Rm9ybWF0KTsKKyAgICBzdGF0aWMgdWludDMyX3QgZm9ybWF0RGlzdGFuY2UoYXVkaW9fZm9ybWF0X3QgZm9ybWF0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0Mik7CisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtGb3JtYXREaXN0YW5jZU1heCA9IDQ7CiAKICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgZ2V0TW9kdWxlSGFuZGxlKCkgY29uc3Q7CiAgICAgdWludDMyX3QgZ2V0TW9kdWxlVmVyc2lvbk1ham9yKCkgY29uc3Q7CiAgICAgY29uc3QgY2hhciAqZ2V0TW9kdWxlTmFtZSgpIGNvbnN0OworICAgIHNwPEh3TW9kdWxlPiBnZXRNb2R1bGUoKSBjb25zdCB7IHJldHVybiBtTW9kdWxlOyB9CiAKICAgICBib29sIHVzZUlucHV0Q2hhbm5lbE1hc2soKSBjb25zdAogICAgIHsKQEAgLTEzMiwxNiArMTM2LDE3IEBACiAgICAgdm9pZCBhZGRSb3V0ZShjb25zdCBzcDxBdWRpb1JvdXRlPiAmcm91dGUpIHsgbVJvdXRlcy5hZGQocm91dGUpOyB9CiAgICAgY29uc3QgQXVkaW9Sb3V0ZVZlY3RvciAmZ2V0Um91dGVzKCkgY29uc3QgeyByZXR1cm4gbVJvdXRlczsgfQogCi0gICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgYm9vbCB2ZXJib3NlID0gdHJ1ZSkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgYm9vbCB2ZXJib3NlID0gdHJ1ZSkgY29uc3Q7CisKICAgICB2b2lkIGxvZyhjb25zdCBjaGFyKiBpbmRlbnQpIGNvbnN0OwogCi0gICAgQXVkaW9HYWluQ29sbGVjdGlvbiBtR2FpbnM7IC8vIGdhaW4gY29udHJvbGxlcnMKLSAgICBzcDxId01vZHVsZT4gbU1vZHVsZTsgICAgICAgICAgICAgICAgIC8vIGF1ZGlvIEhXIG1vZHVsZSBleHBvc2luZyB0aGlzIEkvTyBzdHJlYW0KKyAgICBBdWRpb0dhaW5zIG1HYWluczsgLy8gZ2FpbiBjb250cm9sbGVycwogCiBwcml2YXRlOgogICAgIHZvaWQgcGlja0NoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICZjaGFubmVsTWFzaywgY29uc3QgQ2hhbm5lbHNWZWN0b3IgJmNoYW5uZWxNYXNrcykgY29uc3Q7CiAgICAgdm9pZCBwaWNrU2FtcGxpbmdSYXRlKHVpbnQzMl90ICZyYXRlLGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnNhbXBsaW5nUmF0ZXMpIGNvbnN0OwogCisgICAgc3A8SHdNb2R1bGU+IG1Nb2R1bGU7ICAgICAgICAgICAgICAgICAvLyBhdWRpbyBIVyBtb2R1bGUgZXhwb3NpbmcgdGhpcyBJL08gc3RyZWFtCiAgICAgU3RyaW5nOCAgbU5hbWU7CiAgICAgYXVkaW9fcG9ydF90eXBlX3QgbVR5cGU7CiAgICAgYXVkaW9fcG9ydF9yb2xlX3QgbVJvbGU7CkBAIC0xNTMsMjIgKzE1OCwyMiBAQAogY2xhc3MgQXVkaW9Qb3J0Q29uZmlnIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZQogewogcHVibGljOgotICAgIEF1ZGlvUG9ydENvbmZpZygpOwotICAgIHZpcnR1YWwgfkF1ZGlvUG9ydENvbmZpZygpIHt9Ci0KICAgICBzdGF0dXNfdCBhcHBseUF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmJhY2t1cENvbmZpZyA9IE5VTEwpOwogICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdCA9IDA7CiAgICAgdmlydHVhbCBzcDxBdWRpb1BvcnQ+IGdldEF1ZGlvUG9ydCgpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgaGFzU2FtZUh3TW9kdWxlQXMoY29uc3Qgc3A8QXVkaW9Qb3J0Q29uZmlnPiYgb3RoZXIpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIChvdGhlciAhPSAwKSAmJgorICAgICAgICByZXR1cm4gKG90aGVyICE9IDApICYmIChvdGhlci0+Z2V0QXVkaW9Qb3J0KCkgIT0gMCkgJiYgKGdldEF1ZGlvUG9ydCgpICE9IDApICYmCiAgICAgICAgICAgICAgICAgKG90aGVyLT5nZXRBdWRpb1BvcnQoKS0+Z2V0TW9kdWxlSGFuZGxlKCkgPT0gZ2V0QXVkaW9Qb3J0KCktPmdldE1vZHVsZUhhbmRsZSgpKTsKICAgICB9Ci0gICAgdWludDMyX3QgbVNhbXBsaW5nUmF0ZTsKLSAgICBhdWRpb19mb3JtYXRfdCBtRm9ybWF0OwotICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1DaGFubmVsTWFzazsKLSAgICBzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgbUdhaW47CisgICAgYm9vbCBoYXNHYWluQ29udHJvbGxlcihib29sIGNhblVzZUZvclZvbHVtZSA9IGZhbHNlKSBjb25zdDsKKworICAgIHVuc2lnbmVkIGludCBtU2FtcGxpbmdSYXRlID0gMHU7CisgICAgYXVkaW9fZm9ybWF0X3QgbUZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1DaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKKyAgICBzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgbUdhaW4gPSB7IC5pbmRleCA9IC0xIH07CisgICAgdW5pb24gYXVkaW9faW9fZmxhZ3MgbUZsYWdzID0geyBBVURJT19JTlBVVF9GTEFHX05PTkUgfTsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Byb2ZpbGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Byb2ZpbGUuaAppbmRleCA4NzQxYzY2Li5iNTg4ZDU3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qcm9maWxlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUHJvZmlsZS5oCkBAIC0xNiw5MSArMTYsODQgQEAKIAogI3ByYWdtYSBvbmNlCiAKLSNpbmNsdWRlICJwb2xpY3kuaCIKLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKwogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPGN1dGlscy9jb25maWdfdXRpbHMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCisjaW5jbHVkZSAicG9saWN5LmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogdHlwZWRlZiBTb3J0ZWRWZWN0b3I8dWludDMyX3Q+IFNhbXBsZVJhdGVWZWN0b3I7Ci10eXBlZGVmIFNvcnRlZFZlY3RvcjxhdWRpb19jaGFubmVsX21hc2tfdD4gQ2hhbm5lbHNWZWN0b3I7CiB0eXBlZGVmIFZlY3RvcjxhdWRpb19mb3JtYXRfdD4gRm9ybWF0VmVjdG9yOwogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IFNvcnRlZFZlY3RvcjxUPiAmbGVmdCwgY29uc3QgU29ydGVkVmVjdG9yPFQ+ICZyaWdodCk7Citib29sIG9wZXJhdG9yPT0gKGNvbnN0IFNvcnRlZFZlY3RvcjxUPiAmbGVmdCwgY29uc3QgU29ydGVkVmVjdG9yPFQ+ICZyaWdodCkKK3sKKyAgICBpZiAobGVmdC5zaXplKCkgIT0gcmlnaHQuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHJpZ2h0LnNpemUoKTsgaW5kZXgrKykgeworICAgICAgICBpZiAobGVmdFtpbmRleF0gIT0gcmlnaHRbaW5kZXhdKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYm9vbCBvcGVyYXRvciE9IChjb25zdCBTb3J0ZWRWZWN0b3I8VD4gJmxlZnQsIGNvbnN0IFNvcnRlZFZlY3RvcjxUPiAmcmlnaHQpCit7CisgICAgcmV0dXJuICEobGVmdCA9PSByaWdodCk7Cit9CisKK2NsYXNzIENoYW5uZWxzVmVjdG9yIDogcHVibGljIFNvcnRlZFZlY3RvcjxhdWRpb19jaGFubmVsX21hc2tfdD4KK3sKK3B1YmxpYzoKKyAgICBDaGFubmVsc1ZlY3RvcigpID0gZGVmYXVsdDsKKyAgICBDaGFubmVsc1ZlY3Rvcihjb25zdCBDaGFubmVsc1ZlY3RvciYpID0gZGVmYXVsdDsKKyAgICBDaGFubmVsc1ZlY3Rvcihjb25zdCBTb3J0ZWRWZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+JiBzdikgOgorICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2NoYW5uZWxfbWFza190Pihzdikge30KKyAgICBDaGFubmVsc1ZlY3RvciYgb3BlcmF0b3I9KGNvbnN0IENoYW5uZWxzVmVjdG9yJikgPSBkZWZhdWx0OworCisgICAgLy8gQXBwbGllcyBhdWRpb19jaGFubmVsX21hc2tfb3V0X3RvX2luIHRvIGFsbCBlbGVtZW50cyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorICAgIENoYW5uZWxzVmVjdG9yIGFzSW5NYXNrKCkgY29uc3Q7CisgICAgLy8gQXBwbGllcyBhdWRpb19jaGFubmVsX21hc2tfaW5fdG9fb3V0IHRvIGFsbCBlbGVtZW50cyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorICAgIENoYW5uZWxzVmVjdG9yIGFzT3V0TWFzaygpIGNvbnN0OworfTsKIAogY2xhc3MgQXVkaW9Qcm9maWxlIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZQogewogcHVibGljOgotICAgIEF1ZGlvUHJvZmlsZShhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrcywKLSAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlKSA6Ci0gICAgICAgIG1OYW1lKFN0cmluZzgoIiIpKSwKLSAgICAgICAgbUZvcm1hdChmb3JtYXQpCi0gICAgewotICAgICAgICBtQ2hhbm5lbE1hc2tzLmFkZChjaGFubmVsTWFza3MpOwotICAgICAgICBtU2FtcGxpbmdSYXRlcy5hZGQoc2FtcGxpbmdSYXRlKTsKLSAgICB9CisgICAgc3RhdGljIHNwPEF1ZGlvUHJvZmlsZT4gY3JlYXRlRnVsbER5bmFtaWMoKTsKIAorICAgIEF1ZGlvUHJvZmlsZShhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrcywgdWludDMyX3Qgc2FtcGxpbmdSYXRlKTsKICAgICBBdWRpb1Byb2ZpbGUoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICBjb25zdCBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbE1hc2tzLAotICAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGluZ1JhdGVDb2xsZWN0aW9uKSA6Ci0gICAgICAgIG1OYW1lKFN0cmluZzgoIiIpKSwKLSAgICAgICAgbUZvcm1hdChmb3JtYXQpLAotICAgICAgICBtQ2hhbm5lbE1hc2tzKGNoYW5uZWxNYXNrcyksCi0gICAgICAgIG1TYW1wbGluZ1JhdGVzKHNhbXBsaW5nUmF0ZUNvbGxlY3Rpb24pCi0gICAge30KKyAgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmc2FtcGxpbmdSYXRlQ29sbGVjdGlvbik7CiAKICAgICBhdWRpb19mb3JtYXRfdCBnZXRGb3JtYXQoKSBjb25zdCB7IHJldHVybiBtRm9ybWF0OyB9Ci0KLSAgICB2b2lkIHNldENoYW5uZWxzKGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsTWFza3MpCi0gICAgewotICAgICAgICBpZiAobUlzRHluYW1pY0NoYW5uZWxzKSB7Ci0gICAgICAgICAgICBtQ2hhbm5lbE1hc2tzID0gY2hhbm5lbE1hc2tzOwotICAgICAgICB9Ci0gICAgfQogICAgIGNvbnN0IENoYW5uZWxzVmVjdG9yICZnZXRDaGFubmVscygpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsTWFza3M7IH0KLQotICAgIHZvaWQgc2V0U2FtcGxlUmF0ZXMoY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmc2FtcGxlUmF0ZXMpCi0gICAgewotICAgICAgICBpZiAobUlzRHluYW1pY1JhdGUpIHsKLSAgICAgICAgICAgIG1TYW1wbGluZ1JhdGVzID0gc2FtcGxlUmF0ZXM7Ci0gICAgICAgIH0KLSAgICB9CiAgICAgY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmZ2V0U2FtcGxlUmF0ZXMoKSBjb25zdCB7IHJldHVybiBtU2FtcGxpbmdSYXRlczsgfQorICAgIHZvaWQgc2V0Q2hhbm5lbHMoY29uc3QgQ2hhbm5lbHNWZWN0b3IgJmNoYW5uZWxNYXNrcyk7CisgICAgdm9pZCBzZXRTYW1wbGVSYXRlcyhjb25zdCBTYW1wbGVSYXRlVmVjdG9yICZzYW1wbGVSYXRlcyk7CiAKKyAgICB2b2lkIGNsZWFyKCk7CiAgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gaGFzVmFsaWRGb3JtYXQoKSAmJiBoYXNWYWxpZFJhdGVzKCkgJiYgaGFzVmFsaWRDaGFubmVscygpOyB9Ci0KLSAgICB2b2lkIGNsZWFyKCkKLSAgICB7Ci0gICAgICAgIGlmIChtSXNEeW5hbWljQ2hhbm5lbHMpIHsKLSAgICAgICAgICAgIG1DaGFubmVsTWFza3MuY2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUlzRHluYW1pY1JhdGUpIHsKLSAgICAgICAgICAgIG1TYW1wbGluZ1JhdGVzLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmxpbmUgYm9vbCBzdXBwb3J0c0NoYW5uZWxzKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxzKSBjb25zdAorICAgIGJvb2wgc3VwcG9ydHNDaGFubmVscyhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVscykgY29uc3QKICAgICB7CiAgICAgICAgIHJldHVybiBtQ2hhbm5lbE1hc2tzLmluZGV4T2YoY2hhbm5lbHMpID49IDA7CiAgICAgfQotICAgIGlubGluZSBib29sIHN1cHBvcnRzUmF0ZSh1aW50MzJfdCByYXRlKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1TYW1wbGluZ1JhdGVzLmluZGV4T2YocmF0ZSkgPj0gMDsKLSAgICB9CisgICAgYm9vbCBzdXBwb3J0c1JhdGUodWludDMyX3QgcmF0ZSkgY29uc3QgeyByZXR1cm4gbVNhbXBsaW5nUmF0ZXMuaW5kZXhPZihyYXRlKSA+PSAwOyB9CiAKICAgICBzdGF0dXNfdCBjaGVja0V4YWN0KHVpbnQzMl90IHJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxzLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0OwotCiAgICAgc3RhdHVzX3QgY2hlY2tDb21wYXRpYmxlQ2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgJnVwZGF0ZWRDaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCBwb3J0VHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3JvbGVfdCBwb3J0Um9sZSkgY29uc3Q7Ci0KICAgICBzdGF0dXNfdCBjaGVja0NvbXBhdGlibGVTYW1wbGluZ1JhdGUodWludDMyX3Qgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmdXBkYXRlZFNhbXBsaW5nUmF0ZSkgY29uc3Q7CiAKQEAgLTExOSw3ICsxMTIsNyBAQAogCiAgICAgYm9vbCBpc0R5bmFtaWMoKSB7IHJldHVybiBtSXNEeW5hbWljRm9ybWF0IHx8IG1Jc0R5bmFtaWNDaGFubmVscyB8fCBtSXNEeW5hbWljUmF0ZTsgfQogCi0gICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3Q7CiAKIHByaXZhdGU6CiAgICAgU3RyaW5nOCAgbU5hbWU7CkBAIC0xMzYsMjEzICsxMjksNDggQEAKIGNsYXNzIEF1ZGlvUHJvZmlsZVZlY3RvciA6IHB1YmxpYyBWZWN0b3I8c3A8QXVkaW9Qcm9maWxlPiA+CiB7CiBwdWJsaWM6Ci0gICAgc3NpemVfdCBhZGQoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZSkKLSAgICB7Ci0gICAgICAgIHNzaXplX3QgaW5kZXggPSBWZWN0b3I6OmFkZChwcm9maWxlKTsKLSAgICAgICAgLy8gd2Ugc29ydCBmcm9tIHdvcnN0IHRvIGJlc3QsIHNvIHRoYXQgQVVESU9fRk9STUFUX0RFRkFVTFQgaXMgYWx3YXlzIHRoZSBmaXJzdCBlbnRyeS4KLSAgICAgICAgLy8gVE9ETzogY29tcGFyZUZvcm1hdHMgY291bGQgYmUgYSBsYW1iZGEgdG8gY29udmVydCBiZXR3ZWVuIHBvaW50ZXItdG8tZm9ybWF0IHRvIGZvcm1hdDoKLSAgICAgICAgLy8gW10oY29uc3QgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdDEsIGNvbnN0IGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQyKSB7Ci0gICAgICAgIC8vICAgICByZXR1cm4gY29tcGFyZUZvcm1hdHMoKmZvcm1hdDEsICpmb3JtYXQyKTsKLSAgICAgICAgLy8gfQotICAgICAgICBzb3J0KGNvbXBhcmVGb3JtYXRzKTsKLSAgICAgICAgcmV0dXJuIGluZGV4OwotICAgIH0KLQorICAgIHNzaXplX3QgYWRkKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGUpOwogICAgIC8vIFRoaXMgQVBJIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgdGhlIHBvbGljeSBtYW5hZ2VyIG9uY2UgcmV0cmlldmluZyBjYXBhYmlsaXRpZXMKICAgICAvLyBmb3IgYSBwcm9maWxlIHdpdGggZHluYW1pYyBmb3JtYXQsIHJhdGUgYW5kIGNoYW5uZWxzIGF0dHJpYnV0ZXMKLSAgICBzc2l6ZV90IGFkZFByb2ZpbGVGcm9tSGFsKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGVUb0FkZCkKLSAgICB7Ci0gICAgICAgIC8vIENoZWNrIHZhbGlkIHByb2ZpbGUgdG8gYWRkOgotICAgICAgICBpZiAoIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRGb3JtYXQoKSkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGlmICghcHJvZmlsZVRvQWRkLT5oYXNWYWxpZENoYW5uZWxzKCkgJiYgIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRSYXRlcygpKSB7Ci0gICAgICAgICAgICBGb3JtYXRWZWN0b3IgZm9ybWF0czsKLSAgICAgICAgICAgIGZvcm1hdHMuYWRkKHByb2ZpbGVUb0FkZC0+Z2V0Rm9ybWF0KCkpOwotICAgICAgICAgICAgc2V0Rm9ybWF0cyhGb3JtYXRWZWN0b3IoZm9ybWF0cykpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFwcm9maWxlVG9BZGQtPmhhc1ZhbGlkQ2hhbm5lbHMoKSAmJiBwcm9maWxlVG9BZGQtPmhhc1ZhbGlkUmF0ZXMoKSkgewotICAgICAgICAgICAgc2V0U2FtcGxlUmF0ZXNGb3IocHJvZmlsZVRvQWRkLT5nZXRTYW1wbGVSYXRlcygpLCBwcm9maWxlVG9BZGQtPmdldEZvcm1hdCgpKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwcm9maWxlVG9BZGQtPmhhc1ZhbGlkQ2hhbm5lbHMoKSAmJiAhcHJvZmlsZVRvQWRkLT5oYXNWYWxpZFJhdGVzKCkpIHsKLSAgICAgICAgICAgIHNldENoYW5uZWxzRm9yKHByb2ZpbGVUb0FkZC0+Z2V0Q2hhbm5lbHMoKSwgcHJvZmlsZVRvQWRkLT5nZXRGb3JtYXQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICAvLyBHbyB0aHJvdWdoIHRoZSBsaXN0IG9mIHByb2ZpbGUgdG8gYXZvaWQgZHVwbGljYXRlcwotICAgICAgICBmb3IgKHNpemVfdCBwcm9maWxlSW5kZXggPSAwOyBwcm9maWxlSW5kZXggPCBzaXplKCk7IHByb2ZpbGVJbmRleCsrKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICZwcm9maWxlID0gaXRlbUF0KHByb2ZpbGVJbmRleCk7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZS0+aXNWYWxpZCgpICYmIHByb2ZpbGUgPT0gcHJvZmlsZVRvQWRkKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm90aGluZyB0byBkbwotICAgICAgICAgICAgICAgIHJldHVybiBwcm9maWxlSW5kZXg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOyAvLyBzZXQgdGhlIGZvcm1hdCBhcyBkeW5hbWljIHRvIGFsbG93IHJlbW92YWwKLSAgICAgICAgcmV0dXJuIGFkZChwcm9maWxlVG9BZGQpOwotICAgIH0KLQotICAgIHNwPEF1ZGlvUHJvZmlsZT4gZ2V0Rmlyc3RWYWxpZFByb2ZpbGUoKSBjb25zdAotICAgIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+aXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1BdChpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBib29sIGhhc1ZhbGlkUHJvZmlsZSgpIGNvbnN0IHsgcmV0dXJuIGdldEZpcnN0VmFsaWRQcm9maWxlKCkgIT0gMDsgfQorICAgIHNzaXplX3QgYWRkUHJvZmlsZUZyb21IYWwoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZVRvQWRkKTsKIAogICAgIHN0YXR1c190IGNoZWNrRXhhY3RQcm9maWxlKHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdDsKLQogICAgIHN0YXR1c190IGNoZWNrQ29tcGF0aWJsZVByb2ZpbGUodWludDMyX3QgJnNhbXBsaW5nUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgJmNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgJmZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHBvcnRUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3QgcG9ydFJvbGUpIGNvbnN0OworICAgIHZvaWQgY2xlYXJQcm9maWxlcygpOworICAgIC8vIEFzc3VtaW5nIHRoYXQgdGhpcyBwcm9maWxlIHZlY3RvciBjb250YWlucyBpbnB1dCBwcm9maWxlcywKKyAgICAvLyBmaW5kIHRoZSBiZXN0IG1hdGNoaW5nIGNvbmZpZyBmcm9tICdvdXRwdXRQcm9maWxlcycsIGFjY29yZGluZyB0bworICAgIC8vIHRoZSBnaXZlbiBwcmVmZXJlbmNlcyBmb3IgYXVkaW8gZm9ybWF0cyBhbmQgY2hhbm5lbCBtYXNrcy4KKyAgICAvLyBOb3RlOiBzdGQ6OnZlY3RvcnMgYXJlIHVzZWQgYmVjYXVzZSBzcGVjaWFsaXplZCBjb250YWluZXJzIGZvciBmb3JtYXRzCisgICAgLy8gICAgICAgYW5kIGNoYW5uZWxzIGNhbiBiZSBzb3J0ZWQgYW5kIHVzZSB0aGVpciBvd24gb3JkZXJpbmcuCisgICAgc3RhdHVzX3QgZmluZEJlc3RNYXRjaGluZ091dHB1dENvbmZpZyhjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3ImIG91dHB1dFByb2ZpbGVzLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+JiBwcmVmZXJyZWRGb3JtYXRzLCAvLyBvcmRlcjogbW9zdCBwcmVmIC0+IGxlYXN0IHByZWYKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX2NoYW5uZWxfbWFza190PiYgcHJlZmVycmVkT3V0cHV0Q2hhbm5lbHMsCisgICAgICAgICAgICBib29sIHByZWZlckhpZ2hlclNhbXBsaW5nUmF0ZXMsCisgICAgICAgICAgICBhdWRpb19jb25maWdfYmFzZSAqYmVzdE91dHB1dENvbmZpZykgY29uc3Q7CiAKLSAgICBGb3JtYXRWZWN0b3IgZ2V0U3VwcG9ydGVkRm9ybWF0cygpIGNvbnN0Ci0gICAgewotICAgICAgICBGb3JtYXRWZWN0b3Igc3VwcG9ydGVkRm9ybWF0czsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+aGFzVmFsaWRGb3JtYXQoKSkgewotICAgICAgICAgICAgICAgIHN1cHBvcnRlZEZvcm1hdHMuYWRkKGl0ZW1BdChpKS0+Z2V0Rm9ybWF0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBwb3J0ZWRGb3JtYXRzOwotICAgIH0KKyAgICBzcDxBdWRpb1Byb2ZpbGU+IGdldEZpcnN0VmFsaWRQcm9maWxlKCkgY29uc3Q7CisgICAgc3A8QXVkaW9Qcm9maWxlPiBnZXRGaXJzdFZhbGlkUHJvZmlsZUZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0OworICAgIGJvb2wgaGFzVmFsaWRQcm9maWxlKCkgY29uc3QgeyByZXR1cm4gZ2V0Rmlyc3RWYWxpZFByb2ZpbGUoKSAhPSAwOyB9CiAKLSAgICBib29sIGhhc0R5bmFtaWNQcm9maWxlKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpdGVtQXQoaSktPmlzRHluYW1pYygpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2wgaGFzRHluYW1pY0Zvcm1hdCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gZ2V0UHJvZmlsZUZvcihnRHluYW1pY0Zvcm1hdCkgIT0gMDsKLSAgICB9Ci0KLSAgICBib29sIGhhc0R5bmFtaWNDaGFubmVsc0ZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0Ci0gICAgewotICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gaXRlbUF0KGkpOwotICAgICAgICAgICBpZiAocHJvZmlsZS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0ICYmIHByb2ZpbGUtPmlzRHluYW1pY0NoYW5uZWxzKCkpIHsKLSAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICB9Ci0gICAgICAgfQotICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sIGhhc0R5bmFtaWNSYXRlRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdChpKTsKLSAgICAgICAgICAgIGlmIChwcm9maWxlLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQgJiYgcHJvZmlsZS0+aXNEeW5hbWljUmF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KKyAgICBGb3JtYXRWZWN0b3IgZ2V0U3VwcG9ydGVkRm9ybWF0cygpIGNvbnN0OworICAgIGJvb2wgaGFzRHluYW1pY0NoYW5uZWxzRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3Q7CisgICAgYm9vbCBoYXNEeW5hbWljRm9ybWF0KCkgY29uc3QgeyByZXR1cm4gZ2V0UHJvZmlsZUZvcihnRHluYW1pY0Zvcm1hdCkgIT0gMDsgfQorICAgIGJvb2wgaGFzRHluYW1pY1Byb2ZpbGUoKSBjb25zdDsKKyAgICBib29sIGhhc0R5bmFtaWNSYXRlRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3Q7CiAKICAgICAvLyBPbmUgYXVkaW8gcHJvZmlsZSB3aWxsIGJlIGFkZGVkIGZvciBlYWNoIGZvcm1hdCBzdXBwb3J0ZWQgYnkgQXVkaW8gSEFMCi0gICAgdm9pZCBzZXRGb3JtYXRzKGNvbnN0IEZvcm1hdFZlY3RvciAmZm9ybWF0cykKLSAgICB7Ci0gICAgICAgIC8vIE9ubHkgYWxsb3cgdG8gY2hhbmdlIHRoZSBmb3JtYXQgb2YgZHluYW1pYyBwcm9maWxlCi0gICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gZHluYW1pY0Zvcm1hdFByb2ZpbGUgPSBnZXRQcm9maWxlRm9yKGdEeW5hbWljRm9ybWF0KTsKLSAgICAgICAgaWYgKGR5bmFtaWNGb3JtYXRQcm9maWxlID09IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoZm9ybWF0c1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY0Zvcm1hdFByb2ZpbGUtPmdldENoYW5uZWxzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNGb3JtYXRQcm9maWxlLT5nZXRTYW1wbGVSYXRlcygpKTsKLSAgICAgICAgICAgIHByb2ZpbGUtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7Ci0gICAgICAgICAgICBwcm9maWxlLT5zZXREeW5hbWljQ2hhbm5lbHMoZHluYW1pY0Zvcm1hdFByb2ZpbGUtPmlzRHluYW1pY0NoYW5uZWxzKCkpOwotICAgICAgICAgICAgcHJvZmlsZS0+c2V0RHluYW1pY1JhdGUoZHluYW1pY0Zvcm1hdFByb2ZpbGUtPmlzRHluYW1pY1JhdGUoKSk7Ci0gICAgICAgICAgICBhZGQocHJvZmlsZSk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgdm9pZCBzZXRGb3JtYXRzKGNvbnN0IEZvcm1hdFZlY3RvciAmZm9ybWF0cyk7CiAKLSAgICB2b2lkIGNsZWFyUHJvZmlsZXMoKQotICAgIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IHNpemUoKTsgaSAhPSAwOyApIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdCgtLWkpOwotICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmlzRHluYW1pY0Zvcm1hdCgpICYmIHByb2ZpbGUtPmhhc1ZhbGlkRm9ybWF0KCkpIHsKLSAgICAgICAgICAgICAgICByZW1vdmVBdChpKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb2ZpbGUtPmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdAotICAgIHsKLSAgICAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gUHJvZmlsZXM6XG4iLCBzcGFjZXMsICIiKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNQcm9maWxlICV6dToiLCBzcGFjZXMgKyA0LCAiIiwgaSk7Ci0gICAgICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgICAgICBpdGVtQXQoaSktPmR1bXAoZmQsIHNwYWNlcyArIDgpOwotICAgICAgICB9Ci0gICAgfQorICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0OwogCiBwcml2YXRlOgotICAgIHZvaWQgc2V0U2FtcGxlUmF0ZXNGb3IoY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmc2FtcGxlUmF0ZXMsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkKLSAgICB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdChpKTsKLSAgICAgICAgICAgIGlmIChwcm9maWxlLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQgJiYgcHJvZmlsZS0+aXNEeW5hbWljUmF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmhhc1ZhbGlkUmF0ZXMoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNyZWF0ZSBhIG5ldyBwcm9maWxlIHdpdGggc2FtZSBmb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlVG9BZGQgPSBuZXcgQXVkaW9Qcm9maWxlKGZvcm1hdCwgcHJvZmlsZS0+Z2V0Q2hhbm5lbHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGVzKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOyAvLyBuZWVkIHRvIHNldCB0byBhbGxvdyBjbGVhbmluZwotICAgICAgICAgICAgICAgICAgICBhZGQocHJvZmlsZVRvQWRkKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5zZXRTYW1wbGVSYXRlcyhzYW1wbGVSYXRlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc2V0Q2hhbm5lbHNGb3IoY29uc3QgQ2hhbm5lbHNWZWN0b3IgJmNoYW5uZWxNYXNrcywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQotICAgIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gaXRlbUF0KGkpOwotICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmdldEZvcm1hdCgpID09IGZvcm1hdCAmJiBwcm9maWxlLT5pc0R5bmFtaWNDaGFubmVscygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmhhc1ZhbGlkQ2hhbm5lbHMoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNyZWF0ZSBhIG5ldyBwcm9maWxlIHdpdGggc2FtZSBmb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlVG9BZGQgPSBuZXcgQXVkaW9Qcm9maWxlKGZvcm1hdCwgY2hhbm5lbE1hc2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsgLy8gbmVlZCB0byBzZXQgdG8gYWxsb3cgY2xlYW5pbmcKLSAgICAgICAgICAgICAgICAgICAgYWRkKHByb2ZpbGVUb0FkZCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+c2V0Q2hhbm5lbHMoY2hhbm5lbE1hc2tzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3A8QXVkaW9Qcm9maWxlPiBnZXRQcm9maWxlRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpdGVtQXQoaSktPmdldEZvcm1hdCgpID09IGZvcm1hdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBpdGVtQXQoaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQorICAgIHNwPEF1ZGlvUHJvZmlsZT4gZ2V0UHJvZmlsZUZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0OworICAgIHZvaWQgc2V0U2FtcGxlUmF0ZXNGb3IoY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmc2FtcGxlUmF0ZXMsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCk7CisgICAgdm9pZCBzZXRDaGFubmVsc0Zvcihjb25zdCBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbE1hc2tzLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQpOwogCiAgICAgc3RhdGljIGludCBjb21wYXJlRm9ybWF0cyhjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICpwcm9maWxlMSwgY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAqcHJvZmlsZTIpOwogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1JvdXRlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Sb3V0ZS5oCmluZGV4IDZiMjRmZGUuLjAzNTdmZjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1JvdXRlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUm91dGUuaApAQCAtNDYsNyArNDYsMjAgQEAKIAogICAgIGF1ZGlvX3JvdXRlX3R5cGVfdCBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gbVR5cGU7IH0KIAotICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0OworICAgIC8qKgorICAgICAqIEBicmllZiBzdXBwb3J0c1BhdGNoIGNoZWNrcyBpZiBhbiBhdWRpbyBwYXRjaCBpcyBzdXBwb3J0ZWQgYnkgYSBSb3V0ZSBkZWNsYXJlZCBpbgorICAgICAqIHRoZSBhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgZmlsZS4KKyAgICAgKiBJZiB0aGUgcGF0Y2ggaXMgc3VwcG9ydGVkIG5hdGl2ZWx5IGJ5IGFuIEF1ZGlvSEFMICh3aGljaCBzdXBwb3J0cyBvZiBjb3Vyc2UgUm91dGluZyBBUEkgMy4wKSwKKyAgICAgKiBhdWRpb3BvbGljeSB3aWxsIG5vdCByZXF1ZXN0IEF1ZGlvRmxpbmdlciB0byB1c2UgYSBzb2Z0d2FyZSBicmlkZ2UgdG8gcmVhbGl6ZSBhIHBhdGNoCisgICAgICogYmV0d2VlbiAyIHBvcnRzLgorICAgICAqIEBwYXJhbSBzcmNQb3J0IChha2EgdGhlIHNvdXJjZSkgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEBwYXJhbSBkc3RQb3J0IChha2EgdGhlIHNpbmspIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGF1ZGlvIHJvdXRlIHN1cHBvcnRzIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gdGhlIHNpbmsgYW5kIHRoZSBzb3VyY2UsCisgICAgICogZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgYm9vbCBzdXBwb3J0c1BhdGNoKGNvbnN0IHNwPEF1ZGlvUG9ydD4gJnNyY1BvcnQsIGNvbnN0IHNwPEF1ZGlvUG9ydD4gJmRzdFBvcnQpIGNvbnN0OworCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3Q7CiAKIHByaXZhdGU6CiAgICAgQXVkaW9Qb3J0VmVjdG9yIG1Tb3VyY2VzOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbi5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2Q4YmYzLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Nlc3Npb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgotI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaD4KLSNpbmNsdWRlICJBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZTsKLWNsYXNzIEF1ZGlvUG9saWN5TWl4OwotCi1jbGFzcyBBdWRpb1Nlc3Npb24gOiBwdWJsaWMgUmVmQmFzZSwgcHVibGljIEF1ZGlvU2Vzc2lvbkluZm9VcGRhdGVMaXN0ZW5lcgotewotcHVibGljOgotICAgIEF1ZGlvU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKLSAgICAgICAgICAgICAgICAgYm9vbCBpc1NvdW5kVHJpZ2dlciwKLSAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9Qb2xpY3lNaXg+ICZwb2xpY3lNaXgsCi0gICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOwotCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7Ci0KLSAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1SZWNvcmRDbGllbnRJbmZvLnNlc3Npb247IH0KLSAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSgpY29uc3QgeyByZXR1cm4gbVJlY29yZENsaWVudEluZm8uc291cmNlOyB9Ci0gICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUNvbmZpZy5mb3JtYXQ7IH0KLSAgICB1aW50MzJfdCBzYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbUNvbmZpZy5zYW1wbGVfcmF0ZTsgfQotICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKCkgY29uc3QgeyByZXR1cm4gbUNvbmZpZy5jaGFubmVsX21hc2s7IH0KLSAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKCkgY29uc3QgeyByZXR1cm4gbUZsYWdzOyB9Ci0gICAgdWlkX3QgdWlkKCkgY29uc3QgeyByZXR1cm4gbVJlY29yZENsaWVudEluZm8udWlkOyB9Ci0gICAgdm9pZCBzZXRVaWQodWlkX3QgdWlkKSB7IG1SZWNvcmRDbGllbnRJbmZvLnVpZCA9IHVpZDsgfQotICAgIGJvb2wgbWF0Y2hlcyhjb25zdCBzcDxBdWRpb1Nlc3Npb24+ICZvdGhlcikgY29uc3Q7Ci0gICAgYm9vbCBpc1NvdW5kVHJpZ2dlcigpIGNvbnN0IHsgcmV0dXJuIG1Jc1NvdW5kVHJpZ2dlcjsgfQotICAgIHZvaWQgc2V0U2lsZW5jZWQoYm9vbCBzaWxlbmNlZCkgeyBtU2lsZW5jZWQgPSBzaWxlbmNlZDsgfQotICAgIGJvb2wgaXNTaWxlbmNlZCgpIGNvbnN0IHsgcmV0dXJuIG1TaWxlbmNlZDsgfQotICAgIHVpbnQzMl90IG9wZW5Db3VudCgpIGNvbnN0IHsgcmV0dXJuIG1PcGVuQ291bnQ7IH0gOwotICAgIHVpbnQzMl90IGFjdGl2ZUNvdW50KCkgY29uc3QgeyByZXR1cm4gbUFjdGl2ZUNvdW50OyB9IDsKLQotICAgIHVpbnQzMl90IGNoYW5nZU9wZW5Db3VudChpbnQgZGVsdGEpOwotICAgIHVpbnQzMl90IGNoYW5nZUFjdGl2ZUNvdW50KGludCBkZWx0YSk7Ci0KLSAgICB2b2lkIHNldEluZm9Qcm92aWRlcihBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIgKnByb3ZpZGVyKTsKLSAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBBdWRpb1Nlc3Npb25JbmZvVXBkYXRlTGlzdGVuZXIKLSAgICB2aXJ0dWFsIHZvaWQgb25TZXNzaW9uSW5mb1VwZGF0ZSgpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIHJlY29yZF9jbGllbnRfaW5mb190IG1SZWNvcmRDbGllbnRJbmZvOwotICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSBtQ29uZmlnOwotICAgIGNvbnN0IGF1ZGlvX2lucHV0X2ZsYWdzX3QgbUZsYWdzOwotICAgIGJvb2wgIG1Jc1NvdW5kVHJpZ2dlcjsKLSAgICBib29sIG1TaWxlbmNlZDsKLSAgICB1aW50MzJfdCAgbU9wZW5Db3VudDsKLSAgICB1aW50MzJfdCAgbUFjdGl2ZUNvdW50OwotICAgIHdwPEF1ZGlvUG9saWN5TWl4PiBtUG9saWN5TWl4OyAvLyBub24gTlVMTCB3aGVuIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeQotICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlKiBtQ2xpZW50SW50ZXJmYWNlOwotICAgIGNvbnN0IEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlciogbUluZm9Qcm92aWRlcjsKLX07Ci0KLWNsYXNzIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gOgotICAgIHB1YmxpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90LCBzcDxBdWRpb1Nlc3Npb24+ID4sCi0gICAgcHVibGljIEF1ZGlvU2Vzc2lvbkluZm9VcGRhdGVMaXN0ZW5lcgotewotcHVibGljOgotICAgIHN0YXR1c190IGFkZFNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4mIGF1ZGlvU2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyICpwcm92aWRlcik7Ci0KLSAgICBzdGF0dXNfdCByZW1vdmVTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLQotICAgIHVpbnQzMl90IGdldE9wZW5Db3VudCgpIGNvbnN0OwotCi0gICAgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiBnZXRBY3RpdmVTZXNzaW9ucygpIGNvbnN0OwotICAgIHNpemVfdCBnZXRBY3RpdmVTZXNzaW9uQ291bnQoKSBjb25zdDsKLSAgICBib29sIGhhc0FjdGl2ZVNlc3Npb24oKSBjb25zdDsKLSAgICBib29sIGlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3Q7Ci0gICAgYXVkaW9fc291cmNlX3QgZ2V0SGlnaGVzdFByaW9yaXR5U291cmNlKGJvb2wgYWN0aXZlT25seSkgY29uc3Q7Ci0KLSAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBBdWRpb1Nlc3Npb25JbmZvVXBkYXRlTGlzdGVuZXIKLSAgICB2aXJ0dWFsIHZvaWQgb25TZXNzaW9uSW5mb1VwZGF0ZSgpIGNvbnN0OwotCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0OwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDAzN2ZjLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgaW5wdXQgZGVzY3JpcHRvcnMgdG8gaW1wbGVtZW50IHNvIGRlcGVuZGVudCBhdWRpbyBzZXNzaW9ucyBjYW4gcXVlcnkgaW5mb3JtYXRpb24KLSAqIGFib3V0IHRoZWlyIGNvbnRleHQKLSAqLwotY2xhc3MgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+QXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyKCkge307Ci0KLSAgICB2aXJ0dWFsIGF1ZGlvX2NvbmZpZ19iYXNlX3QgZ2V0Q29uZmlnKCkgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCBhdWRpb19wYXRjaF9oYW5kbGVfdCBnZXRQYXRjaEhhbmRsZSgpIGNvbnN0ID0gMDsKLQotfTsKLQotY2xhc3MgQXVkaW9TZXNzaW9uSW5mb1VwZGF0ZUxpc3RlbmVyCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+QXVkaW9TZXNzaW9uSW5mb1VwZGF0ZUxpc3RlbmVyKCkge307Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25TZXNzaW9uSW5mb1VwZGF0ZSgpIGNvbnN0ID0gMDs7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkOTBmNDIuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU291cmNlRGVzY3JpcHRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+Ci0jaW5jbHVkZSA8QXVkaW9QYXRjaC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOwotY2xhc3MgSHdBdWRpb091dHB1dERlc2NyaXB0b3I7Ci1jbGFzcyBEZXZpY2VEZXNjcmlwdG9yOwotCi1jbGFzcyBBdWRpb1NvdXJjZURlc2NyaXB0b3I6IHB1YmxpYyBSZWZCYXNlCi17Ci1wdWJsaWM6Ci0gICAgQXVkaW9Tb3VyY2VEZXNjcmlwdG9yKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSwgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpIDoKLSAgICAgICAgbURldmljZShkZXZpY2UpLCBtQXR0cmlidXRlcygqYXR0cmlidXRlcyksIG1VaWQodWlkKSB7fQotICAgIHZpcnR1YWwgfkF1ZGlvU291cmNlRGVzY3JpcHRvcigpIHt9Ci0KLSAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBnZXRIYW5kbGUoKSBjb25zdCB7IHJldHVybiBtUGF0Y2hEZXNjLT5tSGFuZGxlOyB9Ci0KLSAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCk7Ci0KLSAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtRGV2aWNlOwotICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBtQXR0cmlidXRlczsKLSAgICB1aWRfdCBtVWlkOwotICAgIHNwPEF1ZGlvUGF0Y2g+IG1QYXRjaERlc2M7Ci0gICAgd3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG1Td091dHB1dDsKLSAgICB3cDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbUh3T3V0cHV0OwotfTsKLQotY2xhc3MgQXVkaW9Tb3VyY2VDb2xsZWN0aW9uIDoKLSAgICAgICAgcHVibGljIERlZmF1bHRLZXllZFZlY3RvcjwgYXVkaW9fcGF0Y2hfaGFuZGxlX3QsIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gPgotewotcHVibGljOgotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9DbGllbnREZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQ2xpZW50RGVzY3JpcHRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMDVhNjMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQ2xpZW50RGVzY3JpcHRvci5oCkBAIC0wLDAgKzEsMzAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8YXVkaW9tYW5hZ2VyL0F1ZGlvTWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUHJvZHVjdFN0cmF0ZWd5Lmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHBvbGljeS5oPgorI2luY2x1ZGUgPFZvbHVtZS5oPgorI2luY2x1ZGUgIkF1ZGlvUGF0Y2guaCIKKyNpbmNsdWRlICJFZmZlY3REZXNjcmlwdG9yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRGV2aWNlRGVzY3JpcHRvcjsKK2NsYXNzIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOworY2xhc3MgU3dBdWRpb091dHB1dERlc2NyaXB0b3I7CisKK2NsYXNzIENsaWVudERlc2NyaXB0b3I6IHB1YmxpYyBSZWZCYXNlCit7CitwdWJsaWM6CisgICAgQ2xpZW50RGVzY3JpcHRvcihhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwgdWlkX3QgdWlkLCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwcmVmZXJyZWREZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNQcmVmZXJyZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UgPSBmYWxzZSkgOgorICAgICAgICBtUG9ydElkKHBvcnRJZCksIG1VaWQodWlkKSwgbVNlc3Npb25JZChzZXNzaW9uSWQpLCBtQXR0cmlidXRlcyhhdHRyaWJ1dGVzKSwKKyAgICAgICAgbUNvbmZpZyhjb25maWcpLCBtUHJlZmVycmVkRGV2aWNlSWQocHJlZmVycmVkRGV2aWNlSWQpLCBtQWN0aXZlKGZhbHNlKSwKKyAgICAgICAgbVByZWZlcnJlZERldmljZUZvckV4Y2x1c2l2ZVVzZShpc1ByZWZlcnJlZERldmljZUZvckV4Y2x1c2l2ZVVzZSl7fQorICAgIH5DbGllbnREZXNjcmlwdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OworICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgdG9TaG9ydFN0cmluZygpIGNvbnN0OworCisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQoKSBjb25zdCB7IHJldHVybiBtUG9ydElkOyB9CisgICAgdWlkX3QgdWlkKCkgY29uc3QgeyByZXR1cm4gbVVpZDsgfQorICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbVNlc3Npb25JZDsgfTsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIG1BdHRyaWJ1dGVzOyB9CisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcoKSBjb25zdCB7IHJldHVybiBtQ29uZmlnOyB9CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwcmVmZXJyZWREZXZpY2VJZCgpIGNvbnN0IHsgcmV0dXJuIG1QcmVmZXJyZWREZXZpY2VJZDsgfTsKKyAgICB2b2lkIHNldFByZWZlcnJlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcHJlZmVycmVkRGV2aWNlSWQpIHsKKyAgICAgICAgbVByZWZlcnJlZERldmljZUlkID0gcHJlZmVycmVkRGV2aWNlSWQ7CisgICAgfQorICAgIGJvb2wgaXNQcmVmZXJyZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UoKSBjb25zdCB7IHJldHVybiBtUHJlZmVycmVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlOyB9CisgICAgdmlydHVhbCB2b2lkIHNldEFjdGl2ZShib29sIGFjdGl2ZSkgeyBtQWN0aXZlID0gYWN0aXZlOyB9CisgICAgYm9vbCBhY3RpdmUoKSBjb25zdCB7IHJldHVybiBtQWN0aXZlOyB9CisgICAgYm9vbCBoYXNQcmVmZXJyZWREZXZpY2UoYm9vbCBhY3RpdmVPbmx5ID0gZmFsc2UpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1QcmVmZXJyZWREZXZpY2VJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FICYmICghYWN0aXZlT25seSB8fCBtQWN0aXZlKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBtUG9ydElkOyAgLy8gdW5pcXVlIElkIGZvciB0aGlzIGNsaWVudAorICAgIGNvbnN0IHVpZF90IG1VaWQ7ICAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IFVJRAorICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBtU2Vzc2lvbklkOyAgICAgICAvLyBhdWRpbyBzZXNzaW9uIElECisgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IG1BdHRyaWJ1dGVzOyAvLyB1c2FnZS4uLgorICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgbUNvbmZpZzsKKyAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1QcmVmZXJyZWREZXZpY2VJZDsgIC8vIHNlbGVjdGVkIGlucHV0IGRldmljZSBwb3J0IElECisgICAgICAgICAgYm9vbCBtQWN0aXZlOworICAgICAgICAgIGJvb2wgbVByZWZlcnJlZERldmljZUZvckV4Y2x1c2l2ZVVzZSA9IGZhbHNlOworfTsKKworY2xhc3MgVHJhY2tDbGllbnREZXNjcmlwdG9yOiBwdWJsaWMgQ2xpZW50RGVzY3JpcHRvcgoreworcHVibGljOgorICAgIFRyYWNrQ2xpZW50RGVzY3JpcHRvcihhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwgdWlkX3QgdWlkLCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcHJlZmVycmVkRGV2aWNlSWQsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksIFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzUHJlZmVycmVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx3cDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4+IHNlY29uZGFyeU91dHB1dHMpIDoKKyAgICAgICAgQ2xpZW50RGVzY3JpcHRvcihwb3J0SWQsIHVpZCwgc2Vzc2lvbklkLCBhdHRyaWJ1dGVzLCBjb25maWcsIHByZWZlcnJlZERldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJlZmVycmVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlKSwKKyAgICAgICAgbVN0cmVhbShzdHJlYW0pLCBtU3RyYXRlZ3koc3RyYXRlZ3kpLCBtVm9sdW1lU291cmNlKHZvbHVtZVNvdXJjZSksIG1GbGFncyhmbGFncyksCisgICAgICAgIG1TZWNvbmRhcnlPdXRwdXRzKHN0ZDo6bW92ZShzZWNvbmRhcnlPdXRwdXRzKSkge30KKyAgICB+VHJhY2tDbGllbnREZXNjcmlwdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdXNpbmcgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0IG92ZXJyaWRlOworICAgIHN0ZDo6c3RyaW5nIHRvU2hvcnRTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKworICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKCkgY29uc3QgeyByZXR1cm4gbUZsYWdzOyB9CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0oKSBjb25zdCB7IHJldHVybiBtU3RyZWFtOyB9CisgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KCkgY29uc3QgeyByZXR1cm4gbVN0cmF0ZWd5OyB9CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8d3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+PiYgZ2V0U2Vjb25kYXJ5T3V0cHV0cygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TZWNvbmRhcnlPdXRwdXRzOworICAgIH07CisgICAgVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIG1Wb2x1bWVTb3VyY2U7IH0KKworICAgIHZvaWQgc2V0QWN0aXZlKGJvb2wgYWN0aXZlKSBvdmVycmlkZQorICAgIHsKKyAgICAgICAgaW50IGRlbHRhID0gYWN0aXZlID8gMSA6IC0xOworICAgICAgICBjaGFuZ2VBY3Rpdml0eUNvdW50KGRlbHRhKTsKKyAgICB9CisgICAgdm9pZCBjaGFuZ2VBY3Rpdml0eUNvdW50KGludCBkZWx0YSkKKyAgICB7CisgICAgICAgIGlmIChkZWx0YSA+IDApIHsKKyAgICAgICAgICAgIG1BY3Rpdml0eUNvdW50ICs9IGRlbHRhOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRighbUFjdGl2aXR5Q291bnQsICIlcyglcykgaW52YWxpZCBkZWx0YSAlZCwgaW5hY3RpdmUgY2xpZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB0b1Nob3J0U3RyaW5nKCkuY19zdHIoKSwgZGVsdGEpOworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdGF0aWNfY2FzdDxpbnQ+KG1BY3Rpdml0eUNvdW50KSA8IC1kZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCVzKSBpbnZhbGlkIGRlbHRhICVkLCBhY3RpdmUgY2xpZW50IGNvdW50ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB0b1Nob3J0U3RyaW5nKCkuY19zdHIoKSwgZGVsdGEsIG1BY3Rpdml0eUNvdW50KTsKKyAgICAgICAgICAgIG1BY3Rpdml0eUNvdW50ICs9IGRlbHRhOworICAgICAgICB9CisgICAgICAgIENsaWVudERlc2NyaXB0b3I6OnNldEFjdGl2ZShtQWN0aXZpdHlDb3VudCA+IDApOworICAgIH0KKyAgICB1aW50MzJfdCBnZXRBY3Rpdml0eUNvdW50KCkgY29uc3QgeyByZXR1cm4gbUFjdGl2aXR5Q291bnQ7IH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07CisgICAgY29uc3QgcHJvZHVjdF9zdHJhdGVneV90IG1TdHJhdGVneTsKKyAgICBjb25zdCBWb2x1bWVTb3VyY2UgbVZvbHVtZVNvdXJjZTsKKyAgICBjb25zdCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBtRmxhZ3M7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8d3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+PiBtU2Vjb25kYXJ5T3V0cHV0czsKKworICAgIC8qKgorICAgICAqIHJlcXVpcmVkIGZvciBkdXBsaWNhdGluZyB0aHJlYWQsIHByZXZlbnQgZnJvbSByZW1vdmluZyBhY3RpdmUgY2xpZW50IGZyb20gYW4gb3V0cHV0CisgICAgICogaW52b2x2ZWQgaW4gYSBkdXBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBtQWN0aXZpdHlDb3VudCA9IDA7Cit9OworCitjbGFzcyBSZWNvcmRDbGllbnREZXNjcmlwdG9yOiBwdWJsaWMgQ2xpZW50RGVzY3JpcHRvcgoreworcHVibGljOgorICAgIFJlY29yZENsaWVudERlc2NyaXB0b3IoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsIGF1ZGlvX3VuaXF1ZV9pZF90IHJpaWQsIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcsIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcHJlZmVycmVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsIGJvb2wgaXNTb3VuZFRyaWdnZXIpIDoKKyAgICAgICAgQ2xpZW50RGVzY3JpcHRvcihwb3J0SWQsIHVpZCwgc2Vzc2lvbklkLCBhdHRyaWJ1dGVzLCBjb25maWcsIHByZWZlcnJlZERldmljZUlkKSwKKyAgICAgICAgbVJJSWQocmlpZCksIG1Tb3VyY2Uoc291cmNlKSwgbUZsYWdzKGZsYWdzKSwgbUlzU291bmRUcmlnZ2VyKGlzU291bmRUcmlnZ2VyKSwKKyAgICAgICAgbUFwcFN0YXRlKEFQUF9TVEFURV9JRExFKSB7fQorICAgIH5SZWNvcmRDbGllbnREZXNjcmlwdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdXNpbmcgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgYXVkaW9fdW5pcXVlX2lkX3QgcmlpZCgpIGNvbnN0IHsgcmV0dXJuIG1SSUlkOyB9CisgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKCkgY29uc3QgeyByZXR1cm4gbVNvdXJjZTsgfQorICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KKyAgICBib29sIGlzU291bmRUcmlnZ2VyKCkgY29uc3QgeyByZXR1cm4gbUlzU291bmRUcmlnZ2VyOyB9CisgICAgYm9vbCBpc0xvd0xldmVsKCkgY29uc3QgeyByZXR1cm4gbVJJSWQgPT0gUkVDT1JEX1JJSURfSU5WQUxJRDsgfQorICAgIHZvaWQgc2V0QXBwU3RhdGUoYXBwX3N0YXRlX3QgYXBwU3RhdGUpIHsgbUFwcFN0YXRlID0gYXBwU3RhdGU7IH0KKyAgICBhcHBfc3RhdGVfdCBhcHBTdGF0ZSgpIHsgcmV0dXJuIG1BcHBTdGF0ZTsgfQorICAgIGJvb2wgaXNTaWxlbmNlZCgpIGNvbnN0IHsgcmV0dXJuIG1BcHBTdGF0ZSA9PSBBUFBfU1RBVEVfSURMRTsgfQorICAgIHZvaWQgdHJhY2tFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3QsIGJvb2wgZW5hYmxlZCk7CisgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gZ2V0RW5hYmxlZEVmZmVjdHMoKSBjb25zdCB7IHJldHVybiBtRW5hYmxlZEVmZmVjdHM7IH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBhdWRpb191bmlxdWVfaWRfdCBtUklJZDsKKyAgICBjb25zdCBhdWRpb19zb3VyY2VfdCBtU291cmNlOworICAgIGNvbnN0IGF1ZGlvX2lucHV0X2ZsYWdzX3QgbUZsYWdzOworICAgIGNvbnN0IGJvb2wgbUlzU291bmRUcmlnZ2VyOworICAgICAgICAgIGFwcF9zdGF0ZV90IG1BcHBTdGF0ZTsKKyAgICBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiBtRW5hYmxlZEVmZmVjdHM7Cit9OworCitjbGFzcyBTb3VyY2VDbGllbnREZXNjcmlwdG9yOiBwdWJsaWMgVHJhY2tDbGllbnREZXNjcmlwdG9yCit7CitwdWJsaWM6CisgICAgU291cmNlQ2xpZW50RGVzY3JpcHRvcihhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwgdWlkX3QgdWlkLCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvUGF0Y2g+JiBwYXRjaERlc2MsIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBzcmNEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSk7CisgICAgflNvdXJjZUNsaWVudERlc2NyaXB0b3IoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MoKSBjb25zdCB7IHJldHVybiBtUGF0Y2hEZXNjOyB9CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc3JjRGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbVNyY0RldmljZTsgfTsKKyAgICB3cDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3dPdXRwdXQoKSBjb25zdCB7IHJldHVybiBtU3dPdXRwdXQ7IH0KKyAgICB2b2lkIHNldFN3T3V0cHV0KGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgc3dPdXRwdXQpOworICAgIHdwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBod091dHB1dCgpIGNvbnN0IHsgcmV0dXJuIG1Id091dHB1dDsgfQorICAgIHZvaWQgc2V0SHdPdXRwdXQoY29uc3Qgc3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+JiBod091dHB1dCk7CisKKyAgICB1c2luZyBDbGllbnREZXNjcmlwdG9yOjpkdW1wOworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Qgb3ZlcnJpZGU7CisKKyBwcml2YXRlOgorICAgIGNvbnN0IHNwPEF1ZGlvUGF0Y2g+IG1QYXRjaERlc2M7CisgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gbVNyY0RldmljZTsKKyAgICB3cDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbVN3T3V0cHV0OworICAgIHdwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtSHdPdXRwdXQ7Cit9OworCitjbGFzcyBTb3VyY2VDbGllbnRDb2xsZWN0aW9uIDoKKyAgICBwdWJsaWMgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19wb3J0X2hhbmRsZV90LCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiA+Cit7CitwdWJsaWM6CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7Cit9OworCit0eXBlZGVmIHN0ZDo6dmVjdG9yPCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+ID4gVHJhY2tDbGllbnRWZWN0b3I7Cit0eXBlZGVmIHN0ZDo6dmVjdG9yPCBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiA+IFJlY29yZENsaWVudFZlY3RvcjsKKworLy8gQSBNYXAgdGhhdCBhc3NvY2lhdGVzIGEgcG9ydElkIHdpdGggYSBjbGllbnQgKHR5cGUgVCkKKy8vIHdoaWNoIGlzIGVpdGhlciBUcmFja0NsaWVudERlc2NyaXB0b3Igb3IgUmVjb3JkQ2xpZW50RGVzY3JpcHRvci4KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIENsaWVudE1hcEhhbmRsZXIgeworcHVibGljOgorICAgIHZpcnR1YWwgfkNsaWVudE1hcEhhbmRsZXIoKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBUcmFjayBjbGllbnQgbWFuYWdlbWVudAorICAgIHZpcnR1YWwgdm9pZCBhZGRDbGllbnQoY29uc3Qgc3A8VD4gJmNsaWVudCkgeworICAgICAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IGNsaWVudC0+cG9ydElkKCk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIW1DbGllbnRzLmVtcGxhY2UocG9ydElkLCBjbGllbnQpLnNlY29uZCwKKyAgICAgICAgICAgICAgICAiJXMoJWQpOiBhdHRlbXB0aW5nIHRvIGFkZCBjbGllbnQgdGhhdCBhbHJlYWR5IGV4aXN0cyIsIF9fZnVuY19fLCBwb3J0SWQpOworICAgIH0KKyAgICBzcDxUPiBnZXRDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpIGNvbnN0IHsKKyAgICAgICAgYXV0byBpdCA9IG1DbGllbnRzLmZpbmQocG9ydElkKTsKKyAgICAgICAgaWYgKGl0ID09IG1DbGllbnRzLmVuZCgpKSByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgfQorICAgIHZpcnR1YWwgdm9pZCByZW1vdmVDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpIHsKKyAgICAgICAgYXV0byBpdCA9IG1DbGllbnRzLmZpbmQocG9ydElkKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihpdCA9PSBtQ2xpZW50cy5lbmQoKSwKKyAgICAgICAgICAgICAgICAiJXMoJWQpOiBjbGllbnQgZG9lcyBub3QgZXhpc3QiLCBfX2Z1bmNfXywgcG9ydElkKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihpdC0+c2Vjb25kLT5hY3RpdmUoKSwKKyAgICAgICAgICAgICAgICAiJXMoJWQpOiByZW1vdmluZyBjbGllbnQgc3RpbGwgYWN0aXZlISIsIF9fZnVuY19fLCBwb3J0SWQpOworICAgICAgICAodm9pZCltQ2xpZW50cy5lcmFzZShpdCk7CisgICAgfQorICAgIHNpemVfdCBnZXRDbGllbnRDb3VudCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DbGllbnRzLnNpemUoKTsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCB7CisgICAgICAgIHNpemVfdCBpbmRleCA9IDA7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50OiBnZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgICAgICBjbGllbnQtPmR1bXAoZHN0LCAyLCBpbmRleCsrKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGhlbHBlciB0eXBlcworICAgIHVzaW5nIENsaWVudE1hcCA9IHN0ZDo6bWFwPGF1ZGlvX3BvcnRfaGFuZGxlX3QsIHNwPFQ+PjsKKyAgICB1c2luZyBDbGllbnRNYXBJdGVyYXRvciA9IHR5cGVuYW1lIENsaWVudE1hcDo6Y29uc3RfaXRlcmF0b3I7ICAvLyBDbGllbnRNYXAgaXMgY29uc3QgcXVhbGlmaWVkCisgICAgY2xhc3MgQ2xpZW50SXRlcmFibGUgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgQ2xpZW50SXRlcmFibGUoY29uc3QgQ2xpZW50TWFwSGFuZGxlcjxUPiAmcmVmKSA6IG1DbGllbnRNYXBIYW5kbGVyKHJlZikgeyB9CisKKyAgICAgICAgY2xhc3MgaXRlcmF0b3IgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICAvLyB0cmFpdHMKKyAgICAgICAgICAgIHVzaW5nIGl0ZXJhdG9yX2NhdGVnb3J5ID0gc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZzsKKyAgICAgICAgICAgIHVzaW5nIHZhbHVlX3R5cGUgPSBzcDxUPjsKKyAgICAgICAgICAgIHVzaW5nIGRpZmZlcmVuY2VfdHlwZSA9IHB0cmRpZmZfdDsKKyAgICAgICAgICAgIHVzaW5nIHBvaW50ZXIgPSBjb25zdCBzcDxUPio7ICAgIC8vIE5vdGU6IGNvbnN0CisgICAgICAgICAgICB1c2luZyByZWZlcmVuY2UgPSBjb25zdCBzcDxUPiY7ICAvLyBOb3RlOiBjb25zdAorCisgICAgICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbgorICAgICAgICAgICAgZXhwbGljaXQgaXRlcmF0b3IoY29uc3QgQ2xpZW50TWFwSXRlcmF0b3IgJml0KSA6IG1JdChpdCkgeyB9CisgICAgICAgICAgICBpdGVyYXRvciYgb3BlcmF0b3IrKygpICAgIC8qIHByZWZpeCAqLyAgICAgeyArK21JdDsgcmV0dXJuICp0aGlzOyB9CisgICAgICAgICAgICByZWZlcmVuY2Ugb3BlcmF0b3IqICgpIGNvbnN0ICAgICAgICAgICAgICAgeyByZXR1cm4gbUl0LT5zZWNvbmQ7IH0KKyAgICAgICAgICAgIHJlZmVyZW5jZSBvcGVyYXRvci0+KCkgY29uc3QgICAgICAgICAgICAgICB7IHJldHVybiBtSXQtPnNlY29uZDsgfSAvLyBhcyBpZiBzcDw+CisgICAgICAgICAgICBkaWZmZXJlbmNlX3R5cGUgb3BlcmF0b3ItKGNvbnN0IGl0ZXJhdG9yJiByaHMpIHtyZXR1cm4gbUl0IC0gcmhzLm1JdDsgfQorICAgICAgICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yJiByaHMpIGNvbnN0IHsgcmV0dXJuIG1JdCA9PSByaHMubUl0OyB9CisgICAgICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3ImIHJocykgY29uc3QgeyByZXR1cm4gbUl0ICE9IHJocy5tSXQ7IH0KKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIENsaWVudE1hcEl0ZXJhdG9yIG1JdDsKKyAgICAgICAgfTsKKworICAgICAgICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9ye21DbGllbnRNYXBIYW5kbGVyLm1DbGllbnRzLmJlZ2luKCl9OyB9CisgICAgICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9ye21DbGllbnRNYXBIYW5kbGVyLm1DbGllbnRzLmVuZCgpfTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgQ2xpZW50TWFwSGFuZGxlcjxUPiYgbUNsaWVudE1hcEhhbmRsZXI7IC8vIGl0ZXJhdGluZyBkb2VzIG5vdCBtb2RpZnkgbWFwLgorICAgIH07CisKKyAgICAvLyByZXR1cm4gYW4gaXRlcmFibGUgb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgaW4gYSByYW5nZS1iYXNlZC1mb3IgdG8gZW51bWVyYXRlIGNsaWVudHMuCisgICAgLy8gdGhpcyBpdGVyYWJsZSBkb2VzIG5vdCBhbGxvdyBtb2RpZmljYXRpb24sIGl0IHNob3VsZCBiZSB1c2VkIGFzIGEgdGVtcG9yYXJ5LgorICAgIENsaWVudEl0ZXJhYmxlIGdldENsaWVudEl0ZXJhYmxlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gQ2xpZW50SXRlcmFibGV7KnRoaXN9OworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLyBDbGllbnRNYXAgbWFwcyBhIHBvcnRJZCB0byBhIGNsaWVudCBkZXNjcmlwdG9yIChib3RoIHVuaXF1ZWx5IGlkZW50aWZ5IGVhY2ggb3RoZXIpLgorICAgIENsaWVudE1hcCBtQ2xpZW50czsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Db25maWdQYXJzaW5nVXRpbHMuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Db25maWdQYXJzaW5nVXRpbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTAwNzg1NC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQ29uZmlnUGFyc2luZ1V0aWxzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJBdWRpb1BvbGljeUNvbmZpZy5oIgotI2luY2x1ZGUgIkRldmljZURlc2NyaXB0b3IuaCIKLSNpbmNsdWRlICJId01vZHVsZS5oIgotI2luY2x1ZGUgImF1ZGlvX3BvbGljeV9jb25mLmgiCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRGVmaW5pdGlvbnMgZm9yIGF1ZGlvX3BvbGljeS5jb25mIGZpbGUgcGFyc2luZwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBDb25maWdQYXJzaW5nVXRpbHMKLXsKLXB1YmxpYzoKLSAgICBzdGF0aWMgc3RhdHVzX3QgbG9hZENvbmZpZyhjb25zdCBjaGFyICpwYXRoLCBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKTsKLQotcHJpdmF0ZToKLSAgICBzdGF0aWMgdm9pZCBsb2FkQXVkaW9Qb3J0R2Fpbihjbm9kZSAqcm9vdCwgQXVkaW9Qb3J0ICZhdWRpb1BvcnQsIGludCBpbmRleCk7Ci0gICAgc3RhdGljIHZvaWQgbG9hZEF1ZGlvUG9ydEdhaW5zKGNub2RlICpyb290LCBBdWRpb1BvcnQgJmF1ZGlvUG9ydCk7Ci0gICAgc3RhdGljIHZvaWQgbG9hZERldmljZURlc2NyaXB0b3JHYWlucyhjbm9kZSAqcm9vdCwgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZURlc2MpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBsb2FkSHdNb2R1bGVEZXZpY2UoY25vZGUgKnJvb3QsIERldmljZVZlY3RvciAmZGV2aWNlcyk7Ci0gICAgc3RhdGljIHN0YXR1c190IGxvYWRId01vZHVsZVByb2ZpbGUoY25vZGUgKnJvb3QsIHNwPEh3TW9kdWxlPiAmbW9kdWxlLCBhdWRpb19wb3J0X3JvbGVfdCByb2xlKTsKLSAgICBzdGF0aWMgdm9pZCBsb2FkRGV2aWNlc0Zyb21UYWcoY29uc3QgY2hhciAqdGFnLCBEZXZpY2VWZWN0b3IgJmRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZWNsYXJlZERldmljZXMpOwotICAgIHN0YXRpYyB2b2lkIGxvYWRId01vZHVsZXMoY25vZGUgKnJvb3QsIEh3TW9kdWxlQ29sbGVjdGlvbiAmaHdNb2R1bGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDb25maWcgJmNvbmZpZyk7Ci0gICAgc3RhdGljIHZvaWQgbG9hZEdsb2JhbENvbmZpZyhjbm9kZSAqcm9vdCwgQXVkaW9Qb2xpY3lDb25maWcgJmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEh3TW9kdWxlPiAmcHJpbWFyeU1vZHVsZSk7Ci0gICAgc3RhdGljIHZvaWQgbG9hZE1vZHVsZUdsb2JhbENvbmZpZyhjbm9kZSAqcm9vdCwgY29uc3Qgc3A8SHdNb2R1bGU+ICZtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKTsKLSAgICBzdGF0aWMgc3RhdHVzX3QgbG9hZEh3TW9kdWxlKGNub2RlICpyb290LCBzcDxId01vZHVsZT4gJm1vZHVsZSwgQXVkaW9Qb2xpY3lDb25maWcgJmNvbmZpZyk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRGV2aWNlRGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0RldmljZURlc2NyaXB0b3IuaAppbmRleCA5MmE0YzNlLi4zM2U1MDZmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRGV2aWNlRGVzY3JpcHRvci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmgKQEAgLTMxLDE1ICszMSwzMSBAQAogcHVibGljOgogICAgICAvLyBOb3RlIHRoYXQgZW1wdHkgbmFtZSByZWZlcnMgYnkgY29udmVudGlvbiB0byBhIGdlbmVyaWMgZGV2aWNlLgogICAgIGV4cGxpY2l0IERldmljZURlc2NyaXB0b3IoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IFN0cmluZzggJnRhZ05hbWUgPSBTdHJpbmc4KCIiKSk7CisgICAgRGV2aWNlRGVzY3JpcHRvcihhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3QgRm9ybWF0VmVjdG9yICZlbmNvZGVkRm9ybWF0cywKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJnRhZ05hbWUgPSBTdHJpbmc4KCIiKSk7CiAKICAgICB2aXJ0dWFsIH5EZXZpY2VEZXNjcmlwdG9yKCkge30KIAogICAgIHZpcnR1YWwgY29uc3QgU3RyaW5nOCBnZXRUYWdOYW1lKCkgY29uc3QgeyByZXR1cm4gbVRhZ05hbWU7IH0KIAogICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gbURldmljZVR5cGU7IH0KKyAgICBTdHJpbmc4IGFkZHJlc3MoKSBjb25zdCB7IHJldHVybiBtQWRkcmVzczsgfQorICAgIHZvaWQgc2V0QWRkcmVzcyhjb25zdCBTdHJpbmc4ICZhZGRyZXNzKSB7IG1BZGRyZXNzID0gYWRkcmVzczsgfQorCisgICAgY29uc3QgRm9ybWF0VmVjdG9yJiBlbmNvZGVkRm9ybWF0cygpIGNvbnN0IHsgcmV0dXJuIG1FbmNvZGVkRm9ybWF0czsgfQorCisgICAgYXVkaW9fZm9ybWF0X3QgZ2V0RW5jb2RlZEZvcm1hdCgpIHsgcmV0dXJuIG1DdXJyZW50RW5jb2RlZEZvcm1hdDsgfQorCisgICAgdm9pZCBzZXRFbmNvZGVkRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgeworICAgICAgICBtQ3VycmVudEVuY29kZWRGb3JtYXQgPSBmb3JtYXQ7CisgICAgfQogCiAgICAgYm9vbCBlcXVhbHMoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIG90aGVyKSBjb25zdDsKIAorICAgIGJvb2wgaGFzQ3VycmVudEVuY29kZWRGb3JtYXQoKSBjb25zdDsKKworICAgIGJvb2wgc3VwcG9ydHNGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KTsKKwogICAgIC8vIEF1ZGlvUG9ydENvbmZpZwogICAgIHZpcnR1YWwgc3A8QXVkaW9Qb3J0PiBnZXRBdWRpb1BvcnQoKSBjb25zdCB7IHJldHVybiAoQXVkaW9Qb3J0KikgdGhpczsgfQogICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKQEAgLTQ3LDQ0ICs2MywxNDggQEAKIAogICAgIC8vIEF1ZGlvUG9ydAogICAgIHZpcnR1YWwgdm9pZCBhdHRhY2goY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpOworICAgIHZpcnR1YWwgdm9pZCBkZXRhY2goKTsKKwogICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3Q7CiAgICAgdmlydHVhbCB2b2lkIGltcG9ydEF1ZGlvUG9ydChjb25zdCBzcDxBdWRpb1BvcnQ+JiBwb3J0LCBib29sIGZvcmNlID0gZmFsc2UpOwogCiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRJZCgpIGNvbnN0OwotICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCwgYm9vbCB2ZXJib3NlID0gdHJ1ZSkgY29uc3Q7CiAgICAgdm9pZCBsb2coKSBjb25zdDsKLQotICAgIFN0cmluZzggbUFkZHJlc3M7CisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKIAogcHJpdmF0ZToKKyAgICBTdHJpbmc4IG1BZGRyZXNzeyIifTsKICAgICBTdHJpbmc4IG1UYWdOYW1lOyAvLyBVbmlxdWUgaHVtYW4gcmVhZGFibGUgaWRlbnRpZmllciBmb3IgYSBkZXZpY2UgcG9ydCBmb3VuZCBpbiBjb25mIGZpbGUuCiAgICAgYXVkaW9fZGV2aWNlc190ICAgICBtRGV2aWNlVHlwZTsKLSAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1JZDsKLQotZnJpZW5kIGNsYXNzIERldmljZVZlY3RvcjsKKyAgICBGb3JtYXRWZWN0b3IgICAgICAgIG1FbmNvZGVkRm9ybWF0czsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1JZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgYXVkaW9fZm9ybWF0X3QgICAgICBtQ3VycmVudEVuY29kZWRGb3JtYXQ7CiB9OwogCiBjbGFzcyBEZXZpY2VWZWN0b3IgOiBwdWJsaWMgU29ydGVkVmVjdG9yPHNwPERldmljZURlc2NyaXB0b3I+ID4KIHsKIHB1YmxpYzoKICAgICBEZXZpY2VWZWN0b3IoKSA6IFNvcnRlZFZlY3RvcigpLCBtRGV2aWNlVHlwZXMoQVVESU9fREVWSUNFX05PTkUpIHt9CisgICAgZXhwbGljaXQgRGV2aWNlVmVjdG9yKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKSA6IERldmljZVZlY3RvcigpCisgICAgeworICAgICAgICBhZGQoaXRlbSk7CisgICAgfQogCiAgICAgc3NpemVfdCBhZGQoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pOwogICAgIHZvaWQgYWRkKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcyk7CiAgICAgc3NpemVfdCByZW1vdmUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pOworICAgIHZvaWQgcmVtb3ZlKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcyk7CiAgICAgc3NpemVfdCBpbmRleE9mKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKSBjb25zdDsKIAogICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlcygpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VUeXBlczsgfQogCi0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBTdHJpbmc4JiBhZGRyZXNzKSBjb25zdDsKLSAgICBEZXZpY2VWZWN0b3IgZ2V0RGV2aWNlc0Zyb21UeXBlKGF1ZGlvX2RldmljZXNfdCB0eXBlcykgY29uc3Q7CisgICAgLy8gSWYgJ2FkZHJlc3MnIGlzIGVtcHR5IGFuZCAnY29kZWMnIGlzIEFVRElPX0ZPUk1BVF9ERUZBVUxULCBhIGRldmljZSB3aXRoIGEgbm9uLWVtcHR5CisgICAgLy8gYWRkcmVzcyBtYXkgYmUgcmV0dXJuZWQgaWYgdGhlcmUgaXMgbm8gZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCAndHlwZScgYW5kIGVtcHR5IGFkZHJlc3MuCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBTdHJpbmc4ICZhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBjb2RlYykgY29uc3Q7CisgICAgRGV2aWNlVmVjdG9yIGdldERldmljZXNGcm9tVHlwZU1hc2soYXVkaW9fZGV2aWNlc190IHR5cGVzKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXREZXZpY2VGcm9tSWQKKyAgICAgKiBAcGFyYW0gaWQgb2YgdGhlIERldmljZURlc2NyaXB0b3IgdG8gc2VhY2ggKGFrYSBQb3J0IGhhbmRsZSkuCisgICAgICogQHJldHVybiBEZXZpY2VEZXNjcmlwdG9yIGFzc29jaWF0ZWQgdG8gcG9ydCBpZCBpZiBmb3VuZCwgbnVsbHB0ciBvdGhlcndpc2UuIElmIHRoZSBpZCBpcworICAgICAqIGVxdWFsIHRvIEFVRElPX1BPUlRfSEFORExFX05PTkUsIGl0IGFsc28gcmV0dXJucyBhIG51bGxwdHIuCisgICAgICovCiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlRnJvbUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgaWQpIGNvbnN0OwogICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZUZyb21UYWdOYW1lKGNvbnN0IFN0cmluZzggJnRhZ05hbWUpIGNvbnN0OwotICAgIERldmljZVZlY3RvciBnZXREZXZpY2VzRnJvbVR5cGVBZGRyKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBTdHJpbmc4JiBhZGRyZXNzKSBjb25zdDsKKyAgICBEZXZpY2VWZWN0b3IgZ2V0RGV2aWNlc0Zyb21Id01vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlSGFuZGxlKSBjb25zdDsKKyAgICBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlVHlwZXNGcm9tSHdNb2R1bGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZUhhbmRsZSkgY29uc3Q7CiAKLSAgICBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlc0Zyb21Id01vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlSGFuZGxlKSBjb25zdDsKKyAgICBib29sIGNvbnRhaW5zKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKSBjb25zdCB7IHJldHVybiBpbmRleE9mKGl0ZW0pID49IDA7IH0KIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBTdHJpbmc4ICZ0YWcsIGludCBzcGFjZXMgPSAwLCBib29sIHZlcmJvc2UgPSB0cnVlKSBjb25zdDsKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgY29udGFpbnNBdExlYXN0T25lCisgICAgICogQHBhcmFtIGRldmljZXMgdmVjdG9yIG9mIGRldmljZXMgdG8gY2hlY2sgYWdhaW5zdC4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIERldmljZVZlY3RvciBjb250YWlucyBhdCBsaXN0IG9uZSBvZiB0aGUgZGV2aWNlcyBmcm9tIHRoZSBnaXZlbiB2ZWN0b3IuCisgICAgICovCisgICAgYm9vbCBjb250YWluc0F0TGVhc3RPbmUoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBjb250YWluc0FsbERldmljZXMKKyAgICAgKiBAcGFyYW0gZGV2aWNlcyB2ZWN0b3Igb2YgZGV2aWNlcyB0byBjaGVjayBhZ2FpbnN0LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgRGV2aWNlVmVjdG9yIGNvbnRhaW5zIGFsbCB0aGUgZGV2aWNlcyBmcm9tIHRoZSBnaXZlbiB2ZWN0b3IKKyAgICAgKi8KKyAgICBib29sIGNvbnRhaW5zQWxsRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQGJyaWVmIGZpbHRlciB0aGUgZGV2aWNlcyBzdXBwb3J0ZWQgYnkgdGhpcyBjb2xsZWN0aW9uIGFnYWluc3QgYW5vdGhlciBjb2xsZWN0aW9uCisgICAgICogQHBhcmFtIGRldmljZXMgdG8gZmlsdGVyIGFnYWluc3QKKyAgICAgKiBAcmV0dXJuIGEgZmlsdGVyZWQgRGV2aWNlVmVjdG9yCisgICAgICovCisgICAgRGV2aWNlVmVjdG9yIGZpbHRlcihjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQGJyaWVmIGZpbHRlciB0aGUgZGV2aWNlcyBzdXBwb3J0ZWQgYnkgdGhpcyBjb2xsZWN0aW9uIGJlZm9yZSBzZW5kaW5nCisgICAgICogdGhlbiB0byB0aGUgRW5naW5lIHZpYSBBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciBpbnRlcmZhY2UKKyAgICAgKiBAcmV0dXJuIGEgZmlsdGVyZWQgRGV2aWNlVmVjdG9yCisgICAgICovCisgICAgRGV2aWNlVmVjdG9yIGZpbHRlckZvckVuZ2luZSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQGJyaWVmIG1lcmdlIHR3byB2ZWN0b3JzLiBBcyBTb3J0ZWRWZWN0b3IgSW1wbGVtZW50YXRpb24gaXMgYnVnZ3kgKGl0IGRvZXMgbm90IGNoZWNrIHRoZSBzaXplCisgICAgICogb2YgdGhlIGRlc3RpbmF0aW9uIHZlY3Rvciwgb25seSBvZiB0aGUgc291cmNlLCBpdCBwcm92aWRlcyBhIHNhZmUgaW1wbGVtZW50YXRpb24KKyAgICAgKiBAcGFyYW0gZGV2aWNlcyBzb3VyY2UgZGV2aWNlIHZlY3RvciB0byBtZXJnZSB3aXRoCisgICAgICogQHJldHVybiBzaXplIG9mIHRoZSBtZXJnZWQgdmVjdG9yLgorICAgICAqLworICAgIHNzaXplX3QgbWVyZ2UoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKQorICAgIHsKKyAgICAgICAgaWYgKGlzRW1wdHkoKSkgeworICAgICAgICAgICAgYWRkKGRldmljZXMpOworICAgICAgICAgICAgcmV0dXJuIHNpemUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gU29ydGVkVmVjdG9yOjptZXJnZShkZXZpY2VzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgb3BlcmF0b3IgPT0gRGV2aWNlVmVjdG9yIGFyZSBlcXVhbHMgaWYgYWxsIHRoZSBEZXZpY2VEZXNjcmlwdG9yIGNhbiBiZSBmb3VuZCAoYWthCisgICAgICogRGV2aWNlRGVzY3JpcHRvciB3aXRoIHNhbWUgdHlwZSBhbmQgYWRkcmVzcykgYW5kIHRoZSB2ZWN0b3IgaGFzIHNhbWUgc2l6ZS4KKyAgICAgKiBAcGFyYW0gcmlnaHQgRGV2aWNlVmVjdG9yIHRvIGNvbXBhcmUgdG8uCisgICAgICogQHJldHVybiB0cnVlIGlmIHJpZ2h0IGNvbnRhaW5zIHRoZSBzYW1lIGRldmljZSBhbmQgaGFzIHRoZSBzYW1lIHNpemUuCisgICAgICovCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IERldmljZVZlY3RvciAmcmlnaHQpIGNvbnN0CisgICAgeworICAgICAgICBpZiAoc2l6ZSgpICE9IHJpZ2h0LnNpemUoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmZGV2aWNlIDogKnRoaXMpIHsKKyAgICAgICAgICAgIGlmIChyaWdodC5pbmRleE9mKGRldmljZSkgPCAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBEZXZpY2VWZWN0b3IgJnJpZ2h0KSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuICFvcGVyYXRvcj09KHJpZ2h0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0Rmlyc3RWYWxpZEFkZHJlc3MKKyAgICAgKiBAcmV0dXJuIHRoZSBmaXJzdCB2YWxpZCBhZGRyZXNzIG9mIGEgbGlzdCBvZiBkZXZpY2UsICIiIGlmIG5vIGRldmljZSB3aXRoIHZhbGlkIGFkZHJlc3MKKyAgICAgKiBmb3VuZC4KKyAgICAgKiBUaGlzIGhlbHBlciBmdW5jdGlvbiBoZWxwcyBtYWludGFpbmluZyBjb21wYXRpYmlsaXR5IHdpdGggbGVnYWN5IHdoZXJlIHdlIHVzZWQgdG8gaGF2ZSBhCisgICAgICogZGV2aWNlcyBtYXNrIGFuZCBhbiBhZGRyZXNzLgorICAgICAqLworICAgIFN0cmluZzggZ2V0Rmlyc3RWYWxpZEFkZHJlc3MoKSBjb25zdAorICAgIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZkZXZpY2UgOiAqdGhpcykgeworICAgICAgICAgICAgaWYgKGRldmljZS0+YWRkcmVzcygpICE9ICIiKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZS0+YWRkcmVzcygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBTdHJpbmc4KCIiKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpIGNvbnN0OworCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgY29uc3QgU3RyaW5nOCAmdGFnLCBpbnQgc3BhY2VzID0gMCwgYm9vbCB2ZXJib3NlID0gdHJ1ZSkgY29uc3Q7CiAKIHByaXZhdGU6CiAgICAgdm9pZCByZWZyZXNoVHlwZXMoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9FZmZlY3REZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRWZmZWN0RGVzY3JpcHRvci5oCmluZGV4IDA0ODMxYzYuLmM0ZWFiMzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9FZmZlY3REZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0VmZmVjdERlc2NyaXB0b3IuaApAQCAtMTYsMjUgKzE2LDM5IEBACiAKICNwcmFnbWEgb25jZQogCi0jaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+CisjaW5jbHVkZSA8cG9saWN5Lmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi0KIGNsYXNzIEVmZmVjdERlc2NyaXB0b3IgOiBwdWJsaWMgUmVmQmFzZQogewogcHVibGljOgotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKyAgICBFZmZlY3REZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsIGJvb2wgaXNNdXNpY0VmZmVjdCwKKyAgICAgICAgICAgICAgICAgICAgIGludCBpZCwgYXVkaW9faW9faGFuZGxlX3QgaW8sIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA6CisgICAgICAgIG1JZChpZCksIG1JbyhpbyksIG1TZXNzaW9uKHNlc3Npb24pLCBtRW5hYmxlZChmYWxzZSksIG1TdXNwZW5kZWQoZmFsc2UpLAorICAgICAgICBtSXNNdXNpY0VmZmVjdChpc011c2ljRWZmZWN0KQorICAgIHsKKyAgICAgICAgbWVtY3B5ICgmbURlc2MsIGRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgfQogCi0gICAgaW50IG1JbzsgICAgICAgICAgICAgICAgLy8gaW8gdGhlIGVmZmVjdCBpcyBhdHRhY2hlZCB0bwotICAgIHJvdXRpbmdfc3RyYXRlZ3kgbVN0cmF0ZWd5OyAvLyByb3V0aW5nIHN0cmF0ZWd5IHRoZSBlZmZlY3QgaXMgYXNzb2NpYXRlZCB0bwotICAgIGludCBtU2Vzc2lvbjsgICAgICAgICAgICAgICAvLyBhdWRpbyBzZXNzaW9uIHRoZSBlZmZlY3QgaXMgb24KLSAgICBlZmZlY3RfZGVzY3JpcHRvcl90IG1EZXNjOyAgLy8gZWZmZWN0IGRlc2NyaXB0b3IKLSAgICBib29sIG1FbmFibGVkOyAgICAgICAgICAgICAgLy8gZW5hYmxlZCBzdGF0ZTogQ1BVIGxvYWQgYmVpbmcgdXNlZCBvciBub3QKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzID0gMCkgY29uc3Q7CisKKyAgICBpbnQgbUlkOyAgICAgICAgICAgICAgICAgICAvLyBlZmZlY3QgdW5pcXVlIElECisgICAgYXVkaW9faW9faGFuZGxlX3QgbUlvOyAgICAgLy8gaW8gdGhlIGVmZmVjdCBpcyBhdHRhY2hlZCB0bworICAgIGF1ZGlvX3Nlc3Npb25fdCBtU2Vzc2lvbjsgIC8vIGF1ZGlvIHNlc3Npb24gdGhlIGVmZmVjdCBpcyBvbgorICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgbURlc2M7IC8vIGVmZmVjdCBkZXNjcmlwdG9yCisgICAgYm9vbCBtRW5hYmxlZDsgICAgICAgICAgICAgLy8gZW5hYmxlZCBzdGF0ZTogQ1BVIGxvYWQgYmVpbmcgdXNlZCBvciBub3QKKyAgICBib29sIG1TdXNwZW5kZWQ7ICAgICAgICAgICAvLyBlbmFibGVkIGJ1dCBzdXNwZW5kZWQgYnkgY29uY3VyZW50IGNhcHR1cmUgcG9saWN5CisKKyAgICBib29sIGlzTXVzaWNFZmZlY3QoKSBjb25zdCB7IHJldHVybiBtSXNNdXNpY0VmZmVjdDsgfQorCitwcml2YXRlOgorICAgIGJvb2wgbUlzTXVzaWNFZmZlY3Q7CiB9OwogCiBjbGFzcyBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiA6IHB1YmxpYyBLZXllZFZlY3RvcjxpbnQsIHNwPEVmZmVjdERlc2NyaXB0b3I+ID4KQEAgLTQzLDE0ICs1NywyMiBAQAogICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uKCk7CiAKICAgICBzdGF0dXNfdCByZWdpc3RlckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLCBhdWRpb19pb19oYW5kbGVfdCBpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwgaW50IHNlc3Npb24sIGludCBpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sIGludCBpZCwgYm9vbCBpc011c2ljRWZmZWN0KTsKICAgICBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCk7CisgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZ2V0RWZmZWN0KGludCBpZCkgY29uc3Q7CisgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gZ2V0RWZmZWN0c0ZvcklvKGF1ZGlvX2lvX2hhbmRsZV90IGlvKSBjb25zdDsKICAgICBzdGF0dXNfdCBzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKTsKKyAgICBib29sICAgICBpc0VmZmVjdEVuYWJsZWQoaW50IGlkKSBjb25zdDsKICAgICB1aW50MzJfdCBnZXRNYXhFZmZlY3RzQ3B1TG9hZCgpIGNvbnN0OwogICAgIHVpbnQzMl90IGdldE1heEVmZmVjdHNNZW1vcnkoKSBjb25zdDsKLSAgICBib29sIGlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCk7CisgICAgYm9vbCBpc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworICAgIHZvaWQgbW92ZUVmZmVjdHMoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzcmNPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkc3RPdXRwdXQpOworICAgIHZvaWQgbW92ZUVmZmVjdHMoY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgaWRzLCBhdWRpb19pb19oYW5kbGVfdCBkc3RPdXRwdXQpOworCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcyA9IDAsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIHN0YXR1c190IHNldEVmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0RGVzY3JpcHRvcj4gJmVmZmVjdERlc2MsIGJvb2wgZW5hYmxlZCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvR2FpbnMuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9HYWlucy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjIyOWE0Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9HYWlucy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8U3RyZWFtRGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+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+YXBwZW5kRm9ybWF0KCIlKnMtIGRlZmF1bHRfdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5kZWZhdWx0X3ZhbHVlKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBzdGVwX3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4uc3RlcF92YWx1ZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gbWluX3JhbXBfbXM6ICVkIG1zXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5taW5fcmFtcF9tcyk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gbWF4X3JhbXBfbXM6ICVkIG1zXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5tYXhfcmFtcF9tcyk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcAppbmRleCAyN2JjNGM2Li5hMDk2ZThmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwCkBAIC0xNywyMyArMTcsMjEgQEAKICNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb0lucHV0RGVzY3JpcHRvciIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAorI2luY2x1ZGUgPGF1ZGlvbWFuYWdlci9BdWRpb01hbmFnZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgorI2luY2x1ZGUgPHBvbGljeS5oPgogI2luY2x1ZGUgPEF1ZGlvUG9saWN5SW50ZXJmYWNlLmg+CiAjaW5jbHVkZSAiQXVkaW9JbnB1dERlc2NyaXB0b3IuaCIKLSNpbmNsdWRlICJJT1Byb2ZpbGUuaCIKICNpbmNsdWRlICJBdWRpb0dhaW4uaCIKICNpbmNsdWRlICJBdWRpb1BvbGljeU1peC5oIgogI2luY2x1ZGUgIkh3TW9kdWxlLmgiCi0jaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KLSNpbmNsdWRlIDxwb2xpY3kuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBBdWRpb0lucHV0RGVzY3JpcHRvcjo6QXVkaW9JbnB1dERlc2NyaXB0b3IoY29uc3Qgc3A8SU9Qcm9maWxlPiYgcHJvZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQotICAgIDogbUlvSGFuZGxlKDApLAotICAgICAgbURldmljZShBVURJT19ERVZJQ0VfTk9ORSksIG1Qb2xpY3lNaXgoTlVMTCksCi0gICAgICBtUHJvZmlsZShwcm9maWxlKSwgbVBhdGNoSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSwgbUlkKDApLAotICAgICAgbUNsaWVudEludGVyZmFjZShjbGllbnRJbnRlcmZhY2UpCisgICAgOiBtUHJvZmlsZShwcm9maWxlKQorICAgICwgIG1DbGllbnRJbnRlcmZhY2UoY2xpZW50SW50ZXJmYWNlKQogewogICAgIGlmIChwcm9maWxlICE9IE5VTEwpIHsKICAgICAgICAgcHJvZmlsZS0+cGlja0F1ZGlvUHJvZmlsZShtU2FtcGxpbmdSYXRlLCBtQ2hhbm5lbE1hc2ssIG1Gb3JtYXQpOwpAQCAtNTEsMTkgKzQ5LDE0IEBACiAgICAgcmV0dXJuIG1Qcm9maWxlLT5nZXRNb2R1bGVIYW5kbGUoKTsKIH0KIAotdWludDMyX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldE9wZW5SZWZDb3VudCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy5nZXRPcGVuQ291bnQoKTsKLX0KLQogYXVkaW9fcG9ydF9oYW5kbGVfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0SWQoKSBjb25zdAogewogICAgIHJldHVybiBtSWQ7CiB9CiAKLWF1ZGlvX3NvdXJjZV90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjppbnB1dFNvdXJjZShib29sIGFjdGl2ZU9ubHkpIGNvbnN0CithdWRpb19zb3VyY2VfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6c291cmNlKCkgY29uc3QKIHsKLSAgICByZXR1cm4gZ2V0SGlnaGVzdFByaW9yaXR5U291cmNlKGFjdGl2ZU9ubHkpOworICAgIHJldHVybiBnZXRIaWdoZXN0UHJpb3JpdHlBdHRyaWJ1dGVzKCkuc291cmNlOwogfQogCiB2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKQEAgLTg0LDcgKzc3LDcgQEAKICAgICBkc3RDb25maWctPnR5cGUgPSBBVURJT19QT1JUX1RZUEVfTUlYOwogICAgIGRzdENvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGUgPSBnZXRNb2R1bGVIYW5kbGUoKTsKICAgICBkc3RDb25maWctPmV4dC5taXguaGFuZGxlID0gbUlvSGFuZGxlOwotICAgIGRzdENvbmZpZy0+ZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9IGlucHV0U291cmNlKCk7CisgICAgZHN0Q29uZmlnLT5leHQubWl4LnVzZWNhc2Uuc291cmNlID0gc291cmNlKCk7CiB9CiAKIHZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdApAQCAtMTE5LDU3ICsxMTIsNjIgQEAKICAgICBtUHJlZW1wdGVkU2Vzc2lvbnMuY2xlYXIoKTsKIH0KIAotYm9vbCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6aXNBY3RpdmUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy5oYXNBY3RpdmVTZXNzaW9uKCk7Ci19Ci0KIGJvb2wgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3QKIHsKLSAgICByZXR1cm4gbVNlc3Npb25zLmlzU291cmNlQWN0aXZlKHNvdXJjZSk7CisgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBnZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgIGlmIChjbGllbnQtPmFjdGl2ZSgpICYmCisgICAgICAgICAgICAoKGNsaWVudC0+c291cmNlKCkgPT0gc291cmNlKSB8fAorICAgICAgICAgICAgICAgICgoc291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTikgJiYKKyAgICAgICAgICAgICAgICAgICAgKGNsaWVudC0+c291cmNlKCkgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpICYmCisgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+aXNTb3VuZFRyaWdnZXIoKSkpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLWF1ZGlvX3NvdXJjZV90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRIaWdoZXN0UHJpb3JpdHlTb3VyY2UoYm9vbCBhY3RpdmVPbmx5KSBjb25zdAorYXVkaW9fYXR0cmlidXRlc190IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRIaWdoZXN0UHJpb3JpdHlBdHRyaWJ1dGVzKCkgY29uc3QKIHsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHsgLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9ERUZBVUxUIH07CisgICAgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4gdG9wQ2xpZW50ID0gZ2V0SGlnaGVzdFByaW9yaXR5Q2xpZW50KCk7CisgICAgcmV0dXJuIHRvcENsaWVudCA/IHRvcENsaWVudC0+YXR0cmlidXRlcygpIDogYXR0cmlidXRlczsKK30KIAotICAgIHJldHVybiBtU2Vzc2lvbnMuZ2V0SGlnaGVzdFByaW9yaXR5U291cmNlKGFjdGl2ZU9ubHkpOworc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4gQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldEhpZ2hlc3RQcmlvcml0eUNsaWVudCgpIGNvbnN0Cit7CisgICAgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4gdG9wQ2xpZW50OworCisgICAgZm9yIChib29sIGFjdGl2ZU9ubHkgOiB7IHRydWUsIGZhbHNlIH0pIHsKKyAgICAgICAgaW50MzJfdCB0b3BQcmlvcml0eSA9IC0xOworICAgICAgICBhcHBfc3RhdGVfdCB0b3BTdGF0ZSA9IEFQUF9TVEFURV9JRExFOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmNsaWVudCA6IGdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgICAgIGlmIChhY3RpdmVPbmx5ICYmICFjbGllbnQtPmFjdGl2ZSgpKSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXBwX3N0YXRlX3QgY3VyU3RhdGUgPSBjbGllbnQtPmFwcFN0YXRlKCk7CisgICAgICAgICAgICBpZiAoY3VyU3RhdGUgPj0gdG9wU3RhdGUpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGN1clByaW9yaXR5ID0gc291cmNlX3ByaW9yaXR5KGNsaWVudC0+c291cmNlKCkpOworICAgICAgICAgICAgICAgIGlmIChjdXJQcmlvcml0eSA+PSB0b3BQcmlvcml0eSkgeworICAgICAgICAgICAgICAgICAgICB0b3BDbGllbnQgPSBjbGllbnQ7CisgICAgICAgICAgICAgICAgICAgIHRvcFByaW9yaXR5ID0gY3VyUHJpb3JpdHk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRvcFN0YXRlID0gY3VyU3RhdGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRvcENsaWVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdG9wQ2xpZW50OwogfQogCiBib29sIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjppc1NvdW5kVHJpZ2dlcigpIGNvbnN0IHsKLSAgICAvLyBzb3VuZCB0cmlnZ2VyIGFuZCBub24gc291bmQgdHJpZ2dlciBzZXNzaW9ucyBhcmUgbm90IG1peGVkCi0gICAgLy8gb24gYSBnaXZlbiBpbnB1dAotICAgIHJldHVybiBtU2Vzc2lvbnMudmFsdWVBdCgwKS0+aXNTb3VuZFRyaWdnZXIoKTsKLX0KLQotc3A8QXVkaW9TZXNzaW9uPiBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0QXVkaW9TZXNzaW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy52YWx1ZUZvcihzZXNzaW9uKTsKLX0KLQotQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0QXVkaW9TZXNzaW9ucyhib29sIGFjdGl2ZU9ubHkpIGNvbnN0Ci17Ci0gICAgaWYgKGFjdGl2ZU9ubHkpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9ucy5nZXRBY3RpdmVTZXNzaW9ucygpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbnM7CisgICAgLy8gc291bmQgdHJpZ2dlciBhbmQgbm9uIHNvdW5kIHRyaWdnZXIgY2xpZW50cyBhcmUgbm90IG1peGVkIG9uIGEgZ2l2ZW4gaW5wdXQKKyAgICAvLyBzbyBjaGVjayBvbmx5IGZpcnN0IGNsaWVudAorICAgIGlmIChnZXRDbGllbnRDb3VudCgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLX0KLQotc2l6ZV90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRBdWRpb1Nlc3Npb25Db3VudChib29sIGFjdGl2ZU9ubHkpIGNvbnN0Ci17Ci0gICAgaWYgKGFjdGl2ZU9ubHkpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9ucy5nZXRBY3RpdmVTZXNzaW9uQ291bnQoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbVNlc3Npb25zLnNpemUoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjphZGRBdWRpb1Nlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiYgYXVkaW9TZXNzaW9uKSB7Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy5hZGRTZXNzaW9uKHNlc3Npb24sIGF1ZGlvU2Vzc2lvbiwgLypBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIqL3RoaXMpOwotfQotCi1zdGF0dXNfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6cmVtb3ZlQXVkaW9TZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSB7Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy5yZW1vdmVTZXNzaW9uKHNlc3Npb24pOworICAgIHJldHVybiBnZXRDbGllbnRJdGVyYWJsZSgpLmJlZ2luKCktPmlzU291bmRUcmlnZ2VyKCk7CiB9CiAKIGF1ZGlvX3BhdGNoX2hhbmRsZV90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRQYXRjaEhhbmRsZSgpIGNvbnN0CkBAIC0xODAsNyArMTc4LDEzIEBACiB2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpzZXRQYXRjaEhhbmRsZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCiB7CiAgICAgbVBhdGNoSGFuZGxlID0gaGFuZGxlOwotICAgIG1TZXNzaW9ucy5vblNlc3Npb25JbmZvVXBkYXRlKCk7CisgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBnZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgIGlmIChjbGllbnQtPmFjdGl2ZSgpKSB7CisgICAgICAgICAgICB1cGRhdGVDbGllbnRSZWNvcmRpbmdDb25maWd1cmF0aW9uKAorICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmlzTG93TGV2ZWwoKSA/IFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQgOiBSRUNPUkRfQ09ORklHX0VWRU5UX1VQREFURSwKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50KTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogYXVkaW9fY29uZmlnX2Jhc2VfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0Q29uZmlnKCkgY29uc3QKQEAgLTE5MSw4ICsxOTUsNyBAQAogfQogCiBzdGF0dXNfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6b3Blbihjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCkKQEAgLTIwOSwyNCArMjEyLDI2IEBACiAKICAgICBtRGV2aWNlID0gZGV2aWNlOwogCi0gICAgQUxPR1YoIm9wZW5pbmcgaW5wdXQgZm9yIGRldmljZSAlMDh4IGFkZHJlc3MgJXMgcHJvZmlsZSAlcCBuYW1lICVzIiwKLSAgICAgICAgICBtRGV2aWNlLCBhZGRyZXNzLnN0cmluZygpLCBtUHJvZmlsZS5nZXQoKSwgbVByb2ZpbGUtPmdldE5hbWUoKS5zdHJpbmcoKSk7CisgICAgQUxPR1YoIm9wZW5pbmcgaW5wdXQgZm9yIGRldmljZSAlcyBwcm9maWxlICVwIG5hbWUgJXMiLAorICAgICAgICAgIG1EZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgbVByb2ZpbGUuZ2V0KCksIG1Qcm9maWxlLT5nZXROYW1lKCkuc3RyaW5nKCkpOworCisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgPSBtRGV2aWNlLT50eXBlKCk7CiAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQ2xpZW50SW50ZXJmYWNlLT5vcGVuSW5wdXQobVByb2ZpbGUtPmdldE1vZHVsZUhhbmRsZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURldmljZS0+YWRkcmVzcygpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzKTsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1EZXZpY2UgIT0gZGV2aWNlLAorICAgIExPR19BTFdBWVNfRkFUQUxfSUYobURldmljZS0+dHlwZSgpICE9IGRldmljZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgb3BlbklucHV0IHJldHVybmVkIGRldmljZSAlMDh4IHdoZW4gZ2l2ZW4gZGV2aWNlICUwOHgiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtRGV2aWNlLCBkZXZpY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtRGV2aWNlLT50eXBlKCksIGRldmljZVR5cGUpOwogCiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCppbnB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgb3BlbklucHV0IHJldHVybmVkIGlucHV0IGhhbmRsZSAlZCBmb3IgZGV2aWNlICUwOHgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgKmlucHV0LCBkZXZpY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBvcGVuSW5wdXQgcmV0dXJuZWQgaW5wdXQgaGFuZGxlICVkIGZvciBkZXZpY2UgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgKmlucHV0LCBtRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICBtU2FtcGxpbmdSYXRlID0gbENvbmZpZy5zYW1wbGVfcmF0ZTsKICAgICAgICAgbUNoYW5uZWxNYXNrID0gbENvbmZpZy5jaGFubmVsX21hc2s7CiAgICAgICAgIG1Gb3JtYXQgPSBsQ29uZmlnLmZvcm1hdDsKQEAgLTI0MCw3ICsyNDUsNyBAQAogCiBzdGF0dXNfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6c3RhcnQoKQogewotICAgIGlmIChnZXRBdWRpb1Nlc3Npb25Db3VudCh0cnVlLyphY3RpdmVPbmx5Ki8pID09IDEpIHsKKyAgICBpZiAoIWlzQWN0aXZlKCkpIHsKICAgICAgICAgaWYgKCFtUHJvZmlsZS0+Y2FuU3RhcnROZXdJbygpKSB7CiAgICAgICAgICAgICBBTE9HSSgiJXMgbVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50ICVkIiwgX19mdW5jX18sIG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCk7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0yNjMsNDIgKzI2OCwyNDcgQEAKIHZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmNsb3NlKCkKIHsKICAgICBpZiAobUlvSGFuZGxlICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIC8vIGNsZWFuIHVwIGFjdGl2ZSBjbGllbnRzIGlmIGFueSAoY2FuIGhhcHBlbiBpZiBjbG9zZSgpIGlzIGNhbGxlZCB0byBmb3JjZQorICAgICAgICAvLyBjbGllbnRzIHRvIHJlY29ubmVjdAorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmNsaWVudCA6IGdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgICAgIGlmIChjbGllbnQtPmFjdGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzIGNsaWVudCB3aXRoIHBvcnQgSUQgJWQgc3RpbGwgYWN0aXZlIG9uIGlucHV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNsaWVudC0+cG9ydElkKCksIG1JZCk7CisgICAgICAgICAgICAgICAgc2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgZmFsc2UpOworICAgICAgICAgICAgICAgIHN0b3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQobUlvSGFuZGxlKTsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtUHJvZmlsZS0+Y3VyT3BlbkNvdW50IDwgMSwgIiVzIHByb2ZpbGUgb3BlbiBjb3VudCAldSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvZmlsZS0+Y3VyT3BlbkNvdW50KTsKLSAgICAgICAgLy8gZG8gbm90IGNhbGwgc3RvcCgpIGhlcmUgYXMgc3RvcCgpIGlzIHN1cHBvc2VkIHRvIGJlIGNhbGxlZCBhZnRlcgotICAgICAgICAvLyBBdWRpb1Nlc3Npb246OmNoYW5nZUFjdGl2ZUNvdW50KC0xKSBhbmQgd2UgZG9uJ3Qga25vdyBob3cgbWFueSBzZXNzaW9ucwotICAgICAgICAvLyBhcmUgc3RpbGwgYWN0aXZlIGF0IHRoaXMgdGltZQotICAgICAgICBpZiAoaXNBY3RpdmUoKSkgewotICAgICAgICAgICAgbVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50LS07Ci0gICAgICAgIH0KKwogICAgICAgICBtUHJvZmlsZS0+Y3VyT3BlbkNvdW50LS07CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVByb2ZpbGUtPmN1ck9wZW5Db3VudCA8ICBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQsCisgICAgICAgICAgICAgICAgIiVzKCVkKTogbVByb2ZpbGUtPmN1ck9wZW5Db3VudCAlZCA8IG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCAlZC4iLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIG1Qcm9maWxlLT5jdXJPcGVuQ291bnQsIG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCk7CiAgICAgICAgIG1Jb0hhbmRsZSA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIH0KIH0KIAotc3RhdHVzX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6YWRkQ2xpZW50KGNvbnN0IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+ICZjbGllbnQpIHsKKyAgICBDbGllbnRNYXBIYW5kbGVyPFJlY29yZENsaWVudERlc2NyaXB0b3I+OjphZGRDbGllbnQoY2xpZW50KTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVuYWJsZWRFZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtRW5hYmxlZEVmZmVjdHMudmFsdWVBdChpKS0+bVNlc3Npb24gPT0gY2xpZW50LT5zZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGNsaWVudC0+dHJhY2tFZmZlY3RFbmFibGVkKG1FbmFibGVkRWZmZWN0cy52YWx1ZUF0KGkpLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6c2V0Q2xpZW50QWN0aXZlKGNvbnN0IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIGJvb2wgYWN0aXZlKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZ2V0Q2xpZW50KGNsaWVudC0+cG9ydElkKCkpID09IG51bGxwdHIsCisgICAgICAgICIlcyglZCkgZG9lcyBub3QgZXhpc3Qgb24gaW5wdXQgZGVzY3JpcHRvciIsIF9fZnVuY19fLCBjbGllbnQtPnBvcnRJZCgpKTsKKyAgICBpZiAoYWN0aXZlID09IGNsaWVudC0+YWN0aXZlKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBJRDogJWRcbiIsIGdldElkKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9ybWF0OiAlZFxuIiwgbUZvcm1hdCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIERldmljZXMgJTA4eFxuIiwgbURldmljZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIC8vIEhhbmRsZSBub24tY2xpZW50LXNwZWNpZmljIGFjdGl2aXR5IHJlZiBjb3VudAorICAgIGludDMyX3Qgb2xkR2xvYmFsQWN0aXZlQ291bnQgPSBtR2xvYmFsQWN0aXZlQ291bnQ7CisgICAgaWYgKCFhY3RpdmUgJiYgbUdsb2JhbEFjdGl2ZUNvdW50IDwgMSkgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyglZCkgaW52YWxpZCBkZWFjdGl2YXRpb24gd2l0aCBnbG9iYWxBY3RpdmVDb3VudCAlZCIsCisgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2xpZW50LT5wb3J0SWQoKSwgbUdsb2JhbEFjdGl2ZUNvdW50KTsKKyAgICAgICAgLy8gbUdsb2JhbEFjdGl2ZUNvdW50ID0gMTsKKyAgICB9CisgICAgY29uc3QgaW50IGRlbHRhID0gYWN0aXZlID8gMSA6IC0xOworICAgIG1HbG9iYWxBY3RpdmVDb3VudCArPSBkZWx0YTsKIAotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSBtUG9saWN5TWl4LnByb21vdGUoKTsKKyAgICBpZiAoKG9sZEdsb2JhbEFjdGl2ZUNvdW50ID09IDApICYmIChtR2xvYmFsQWN0aXZlQ291bnQgPiAwKSkgeworICAgICAgICBpZiAoKHBvbGljeU1peCAhPSBOVUxMKSAmJiAoKHBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUocG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JWF9TVEFURV9NSVhJTkcpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICgob2xkR2xvYmFsQWN0aXZlQ291bnQgPiAwKSAmJiAobUdsb2JhbEFjdGl2ZUNvdW50ID09IDApKSB7CisgICAgICAgIGlmICgocG9saWN5TWl4ICE9IE5VTEwpICYmICgocG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKQorICAgICAgICB7CisgICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlYX1NUQVRFX0lETEUpOworICAgICAgICB9CisgICAgfQogCi0gICAgbVNlc3Npb25zLmR1bXAoZmQsIDEpOworICAgIGNsaWVudC0+c2V0QWN0aXZlKGFjdGl2ZSk7CiAKLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgY2hlY2tTdXNwZW5kRWZmZWN0cygpOworCisgICAgaW50IGV2ZW50ID0gYWN0aXZlID8gUkVDT1JEX0NPTkZJR19FVkVOVF9TVEFSVCA6IFJFQ09SRF9DT05GSUdfRVZFTlRfU1RPUDsKKyAgICB1cGRhdGVDbGllbnRSZWNvcmRpbmdDb25maWd1cmF0aW9uKGV2ZW50LCBjbGllbnQpOworfQorCit2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjp1cGRhdGVDbGllbnRSZWNvcmRpbmdDb25maWd1cmF0aW9uKAorICAgIGludCBldmVudCwgY29uc3Qgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCkKK3sKKyAgICBBTE9HVigiJXMgcmlpZCAlZCB1aWQgJWQgcG9ydCAlZCBzZXNzaW9uICVkIGV2ZW50ICVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBjbGllbnQtPnJpaWQoKSwgY2xpZW50LT51aWQoKSwgY2xpZW50LT5wb3J0SWQoKSwgY2xpZW50LT5zZXNzaW9uKCksIGV2ZW50KTsKKyAgICAvLyBkbyBub3Qgc2VuZCBjYWxsYmFjayBpZiBzdGFydGluZyBhbmQgbm8gZGV2aWNlIGlzIHNlbGVjdGVkIHlldCB0byBhdm9pZAorICAgIC8vIGRvdWJsZSBjYWxsYmFja3MgZnJvbSBzdGFydElucHV0KCkgYmVmb3JlIGFuZCBhZnRlciB0aGUgZGV2aWNlIGlzIHNlbGVjdGVkCisgICAgLy8gInN0YXJ0IiBhbmQgInN0b3AiIGV2ZW50cyBmb3IgImhpZ2ggbGV2ZWwiIGNsaWVudHMgKEF1ZGlvUmVjb3JkKSBhcmUgc2VudCBieSB0aGUgY2xpZW50IHNpZGUKKyAgICBpZiAoKGV2ZW50ID09IFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQgJiYgbVBhdGNoSGFuZGxlID09IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKQorICAgICAgICAgICAgfHwgKCFjbGllbnQtPmlzTG93TGV2ZWwoKQorICAgICAgICAgICAgICAgICAgICAmJiAoZXZlbnQgPT0gUkVDT1JEX0NPTkZJR19FVkVOVF9TVEFSVCB8fCBldmVudCA9PSBSRUNPUkRfQ09ORklHX0VWRU5UX1NUT1ApKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCBzZXNzaW9uQ29uZmlnID0gY2xpZW50LT5jb25maWcoKTsKKyAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCByZWNvcmRDbGllbnRJbmZve2NsaWVudC0+cmlpZCgpLCBjbGllbnQtPnVpZCgpLCBjbGllbnQtPnNlc3Npb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+c291cmNlKCksIGNsaWVudC0+cG9ydElkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmlzU2lsZW5jZWQoKX07CisgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcgPSBnZXRDb25maWcoKTsKKworICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHM7CisgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gZWZmZWN0c0xpc3QgPSBjbGllbnQtPmdldEVuYWJsZWRFZmZlY3RzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RzTGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICBjbGllbnRFZmZlY3RzLnB1c2hfYmFjayhlZmZlY3RzTGlzdC52YWx1ZUF0KGkpLT5tRGVzYyk7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0czsKKyAgICBlZmZlY3RzTGlzdCA9IGdldEVuYWJsZWRFZmZlY3RzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RzTGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICBlZmZlY3RzLnB1c2hfYmFjayhlZmZlY3RzTGlzdC52YWx1ZUF0KGkpLT5tRGVzYyk7CisgICAgfQorCisgICAgbUNsaWVudEludGVyZmFjZS0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCAmcmVjb3JkQ2xpZW50SW5mbywgJnNlc3Npb25Db25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEVmZmVjdHMsICZjb25maWcsIGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXRjaEhhbmRsZSwgc291cmNlKCkpOworfQorCitSZWNvcmRDbGllbnRWZWN0b3IgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldENsaWVudHNGb3JTZXNzaW9uKAorICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIFJlY29yZENsaWVudFZlY3RvciBjbGllbnRzOworICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICBpZiAoY2xpZW50LT5zZXNzaW9uKCkgPT0gc2Vzc2lvbikgeworICAgICAgICAgICAgY2xpZW50cy5wdXNoX2JhY2soY2xpZW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY2xpZW50czsKK30KKworUmVjb3JkQ2xpZW50VmVjdG9yIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpjbGllbnRzTGlzdChib29sIGFjdGl2ZU9ubHksIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcmVmZXJyZWREZXZpY2VPbmx5KSBjb25zdAoreworICAgIFJlY29yZENsaWVudFZlY3RvciBjbGllbnRzOworICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICBpZiAoKCFhY3RpdmVPbmx5IHx8IGNsaWVudC0+YWN0aXZlKCkpCisgICAgICAgICAgICAmJiAoc291cmNlID09IEFVRElPX1NPVVJDRV9ERUZBVUxUIHx8IHNvdXJjZSA9PSBjbGllbnQtPnNvdXJjZSgpKQorICAgICAgICAgICAgJiYgKCFwcmVmZXJyZWREZXZpY2VPbmx5IHx8IGNsaWVudC0+aGFzUHJlZmVycmVkRGV2aWNlKCkpKSB7CisgICAgICAgICAgICBjbGllbnRzLnB1c2hfYmFjayhjbGllbnQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjbGllbnRzOworfQorCit2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjp0cmFja0VmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0RGVzY3JpcHRvcj4gJmVmZmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuYWJsZWQpCit7CisgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgbUVuYWJsZWRFZmZlY3RzLnJlcGxhY2VWYWx1ZUZvcihlZmZlY3QtPm1JZCwgZWZmZWN0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtRW5hYmxlZEVmZmVjdHMucmVtb3ZlSXRlbShlZmZlY3QtPm1JZCk7CisgICAgICAgIC8vIGFsd2F5cyBleGl0IGZyb20gc3VzcGVuZCB3aGVuIGRpc2FibGluZyBhbiBlZmZlY3QgYXMgb25seSBlbmFibGVkIGVmZmVjdHMKKyAgICAgICAgLy8gYXJlIG1hbmFnZWQgYnkgY2hlY2tTdXNwZW5kRWZmZWN0cygpCisgICAgICAgIGlmIChlZmZlY3QtPm1TdXNwZW5kZWQpIHsKKyAgICAgICAgICAgIGVmZmVjdC0+bVN1c3BlbmRlZCA9IGZhbHNlOworICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+c2V0RWZmZWN0U3VzcGVuZGVkKGVmZmVjdC0+bUlkLCBlZmZlY3QtPm1TZXNzaW9uLCBlZmZlY3QtPm1TdXNwZW5kZWQpOworICAgICAgICB9CisgICAgfQorCisgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGNsaWVudHMgPSBnZXRDbGllbnRzRm9yU2Vzc2lvbigoYXVkaW9fc2Vzc2lvbl90KWVmZmVjdC0+bVNlc3Npb24pOworICAgIFJlY29yZENsaWVudFZlY3RvciB1cGRhdGVkQ2xpZW50czsKKworICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogY2xpZW50cykgeworICAgICAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBjbGllbnRFZmZlY3QgPSBjbGllbnQtPmdldEVuYWJsZWRFZmZlY3RzKCkuZ2V0RWZmZWN0KGVmZmVjdC0+bUlkKTsKKyAgICAgICAgYm9vbCBjaGFuZ2VkID0gKGVuYWJsZWQgJiYgY2xpZW50RWZmZWN0ID09IG51bGxwdHIpCisgICAgICAgICAgICAgICAgfHwgKCFlbmFibGVkICYmIGNsaWVudEVmZmVjdCAhPSBudWxscHRyKTsKKyAgICAgICAgY2xpZW50LT50cmFja0VmZmVjdEVuYWJsZWQoZWZmZWN0LCBlbmFibGVkKTsKKyAgICAgICAgaWYgKGNoYW5nZWQgJiYgY2xpZW50LT5hY3RpdmUoKSkgeworICAgICAgICAgICAgdXBkYXRlZENsaWVudHMucHVzaF9iYWNrKGNsaWVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjaGVja1N1c3BlbmRFZmZlY3RzKCk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IHVwZGF0ZWRDbGllbnRzKSB7CisgICAgICAgIHVwZGF0ZUNsaWVudFJlY29yZGluZ0NvbmZpZ3VyYXRpb24oUkVDT1JEX0NPTkZJR19FVkVOVF9VUERBVEUsIGNsaWVudCk7CisgICAgfQorfQorCitFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0RW5hYmxlZEVmZmVjdHMoKSBjb25zdAoreworICAgIC8vIHJlcG9ydCBlZmZlY3RzIGZvciBoaWdoZXN0IHByaW9yaXR5IGFjdGl2ZSBzb3VyY2UgYXMgYXBwbGllZCB0byBhbGwgY2xpZW50cworICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIGVuYWJsZWRFZmZlY3RzOworICAgIHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+IHRvcENsaWVudCA9IGdldEhpZ2hlc3RQcmlvcml0eUNsaWVudCgpOworICAgIGlmICh0b3BDbGllbnQgIT0gbnVsbHB0cikgeworICAgICAgICBlbmFibGVkRWZmZWN0cyA9IHRvcENsaWVudC0+Z2V0RW5hYmxlZEVmZmVjdHMoKTsKKyAgICB9CisgICAgcmV0dXJuIGVuYWJsZWRFZmZlY3RzOworfQorCit2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpzZXRBcHBTdGF0ZSh1aWRfdCB1aWQsIGFwcF9zdGF0ZV90IHN0YXRlKQoreworICAgIFJlY29yZENsaWVudFZlY3RvciBjbGllbnRzID0gY2xpZW50c0xpc3QoZmFsc2UgLyphY3RpdmVPbmx5Ki8pOworICAgIFJlY29yZENsaWVudFZlY3RvciB1cGRhdGVkQ2xpZW50czsKKworICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogY2xpZW50cykgeworICAgICAgICBpZiAodWlkID09IGNsaWVudC0+dWlkKCkpIHsKKyAgICAgICAgICAgIGJvb2wgd2FzU2lsZW5jZWQgPSBjbGllbnQtPmlzU2lsZW5jZWQoKTsKKyAgICAgICAgICAgIGNsaWVudC0+c2V0QXBwU3RhdGUoc3RhdGUpOworICAgICAgICAgICAgaWYgKGNsaWVudC0+YWN0aXZlKCkgJiYgd2FzU2lsZW5jZWQgIT0gY2xpZW50LT5pc1NpbGVuY2VkKCkpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVkQ2xpZW50cy5wdXNoX2JhY2soY2xpZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGNoZWNrU3VzcGVuZEVmZmVjdHMoKTsKKworICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogdXBkYXRlZENsaWVudHMpIHsKKyAgICAgICAgdXBkYXRlQ2xpZW50UmVjb3JkaW5nQ29uZmlndXJhdGlvbihSRUNPUkRfQ09ORklHX0VWRU5UX1VQREFURSwgY2xpZW50KTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmNoZWNrU3VzcGVuZEVmZmVjdHMoKQoreworICAgIHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+IHRvcENsaWVudCA9IGdldEhpZ2hlc3RQcmlvcml0eUNsaWVudCgpOworICAgIGlmICh0b3BDbGllbnQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRW5hYmxlZEVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0ID0gbUVuYWJsZWRFZmZlY3RzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChlZmZlY3QtPm1TZXNzaW9uID09IHRvcENsaWVudC0+c2Vzc2lvbigpKSB7CisgICAgICAgICAgICBpZiAoZWZmZWN0LT5tU3VzcGVuZGVkKSB7CisgICAgICAgICAgICAgICAgZWZmZWN0LT5tU3VzcGVuZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+c2V0RWZmZWN0U3VzcGVuZGVkKGVmZmVjdC0+bUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3QtPm1TZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3QtPm1TdXNwZW5kZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFlZmZlY3QtPm1TdXNwZW5kZWQpIHsKKyAgICAgICAgICAgIGVmZmVjdC0+bVN1c3BlbmRlZCA9IHRydWU7CisgICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5zZXRFZmZlY3RTdXNwZW5kZWQoZWZmZWN0LT5tSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0LT5tU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3QtPm1TdXNwZW5kZWQpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIElEOiAlZFxuIiwgZ2V0SWQoKSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBTYW1wbGluZyByYXRlOiAlZFxuIiwgbVNhbXBsaW5nUmF0ZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBGb3JtYXQ6ICVkXG4iLCBtRm9ybWF0KTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIENoYW5uZWxzOiAlMDh4XG4iLCBtQ2hhbm5lbE1hc2spOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRGV2aWNlcyAlc1xuIiwgbURldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICBtRW5hYmxlZEVmZmVjdHMuZHVtcChkc3QsIDEgLypzcGFjZXMqLywgZmFsc2UgLyp2ZXJib3NlKi8pOworICAgIGRzdC0+YXBwZW5kKCIgQXVkaW9SZWNvcmQgQ2xpZW50czpcbiIpOworICAgIENsaWVudE1hcEhhbmRsZXI8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj46OmR1bXAoZHN0KTsKKyAgICBkc3QtPmFwcGVuZCgiXG4iKTsKIH0KIAogYm9vbCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6aXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdApAQCAtMzE0LDY2ICs1MjQsODMgQEAKIAogc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjpnZXRJbnB1dEZyb21JZChhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdAogewotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBOVUxMOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaW5wdXREZXNjID0gdmFsdWVBdChpKTsKLSAgICAgICAgaWYgKGlucHV0RGVzYy0+Z2V0SWQoKSA9PSBpZCkgewotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2NyaXB0b3IgPSB2YWx1ZUF0KGkpOworICAgICAgICBpZiAoaW5wdXREZXNjcmlwdG9yLT5nZXRJZCgpID09IGlkKSB7CisgICAgICAgICAgICByZXR1cm4gaW5wdXREZXNjcmlwdG9yOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBpbnB1dERlc2M7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKLXVpbnQzMl90IEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjphY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlcykgY29uc3QKK3VpbnQzMl90IEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjphY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0CiB7CiAgICAgdWludDMyX3QgY291bnQgPSAwOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKICAgICAgICAgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ICBpbnB1dERlc2NyaXB0b3IgPSB2YWx1ZUF0KGkpOwogICAgICAgICBpZiAoaW5wdXREZXNjcmlwdG9yLT5pc0FjdGl2ZSgpICYmCi0gICAgICAgICAgICAgICAgKChkZXZpY2VzID09IEFVRElPX0RFVklDRV9JTl9ERUZBVUxUKSB8fAotICAgICAgICAgICAgICAgICAoKGlucHV0RGVzY3JpcHRvci0+bURldmljZSAmIGRldmljZXMgJiB+QVVESU9fREVWSUNFX0JJVF9JTikgIT0gMCkpKSB7CisgICAgICAgICAgICAgICAgKGRldmljZXMuaXNFbXB0eSgpIHx8IGRldmljZXMuY29udGFpbnMoaW5wdXREZXNjcmlwdG9yLT5nZXREZXZpY2UoKSkpKSB7CiAgICAgICAgICAgICBjb3VudCsrOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBjb3VudDsKIH0KIAotVmVjdG9yPHNwIDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gPiBBdWRpb0lucHV0Q29sbGVjdGlvbjo6Z2V0QWN0aXZlSW5wdXRzKGJvb2wgaWdub3JlVmlydHVhbElucHV0cykKK1ZlY3RvcjxzcCA8QXVkaW9JbnB1dERlc2NyaXB0b3I+ID4gQXVkaW9JbnB1dENvbGxlY3Rpb246OmdldEFjdGl2ZUlucHV0cygpCiB7CiAgICAgVmVjdG9yPHNwIDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gPiBhY3RpdmVJbnB1dHM7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiAgaW5wdXREZXNjcmlwdG9yID0gdmFsdWVBdChpKTsKLSAgICAgICAgaWYgKChpbnB1dERlc2NyaXB0b3ItPmlzQWN0aXZlKCkpCi0gICAgICAgICAgICAgICAgJiYgKCFpZ25vcmVWaXJ0dWFsSW5wdXRzIHx8Ci0gICAgICAgICAgICAgICAgICAgICFpc192aXJ0dWFsX2lucHV0X2RldmljZShpbnB1dERlc2NyaXB0b3ItPm1EZXZpY2UpKSkgeworICAgICAgICBpZiAoaW5wdXREZXNjcmlwdG9yLT5pc0FjdGl2ZSgpKSB7CiAgICAgICAgICAgICBhY3RpdmVJbnB1dHMuYWRkKGlucHV0RGVzY3JpcHRvcik7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGFjdGl2ZUlucHV0czsKIH0KIAotYXVkaW9fZGV2aWNlc190IEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjpnZXRTdXBwb3J0ZWREZXZpY2VzKGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSkgY29uc3QKK3NwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBBdWRpb0lucHV0Q29sbGVjdGlvbjo6Z2V0SW5wdXRGb3JDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IHZhbHVlRm9yKGhhbmRsZSk7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSBpbnB1dERlc2MtPm1Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzVHlwZSgpOwotICAgIHJldHVybiBkZXZpY2VzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgIGlmIChpbnB1dERlc2MtPmdldENsaWVudChwb3J0SWQpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dERlc2M7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7CiB9CiAKLXN0YXR1c190IEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKK3ZvaWQgQXVkaW9JbnB1dENvbGxlY3Rpb246OnRyYWNrRWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3REZXNjcmlwdG9yPiAmZWZmZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuYWJsZWQpCiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbklucHV0cyBkdW1wOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBJbnB1dCAlZCBkdW1wOlxuIiwga2V5QXQoaSkpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZmQpOworICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gdmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGlucHV0RGVzYy0+bUlvSGFuZGxlID09IGVmZmVjdC0+bUlvKSB7CisgICAgICAgICAgICByZXR1cm4gaW5wdXREZXNjLT50cmFja0VmZmVjdEVuYWJsZWQoZWZmZWN0LCBlbmFibGVkKTsKKyAgICAgICAgfQogICAgIH0KK30KIAotICAgIHJldHVybiBOT19FUlJPUjsKK3ZvaWQgQXVkaW9JbnB1dENvbGxlY3Rpb246OmNsZWFyU2Vzc2lvblJvdXRlc0ZvckRldmljZSgKKyAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGlzY29ubmVjdGVkRGV2aWNlKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogaW5wdXREZXNjLT5nZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgICAgICBpZiAoY2xpZW50LT5wcmVmZXJyZWREZXZpY2VJZCgpID09IGRpc2Nvbm5lY3RlZERldmljZS0+Z2V0SWQoKSkgeworICAgICAgICAgICAgICAgIGNsaWVudC0+c2V0UHJlZmVycmVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9JbnB1dENvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kKCJcbklucHV0cyBkdW1wOlxuIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiLSBJbnB1dCAlZCBkdW1wOlxuIiwga2V5QXQoaSkpOworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCk7CisgICAgfQogfQogCiB9OyAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcAppbmRleCBkMTViYTRiLi44YTYwY2YyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlICJBdWRpb0dhaW4uaCIKICNpbmNsdWRlICJWb2x1bWUuaCIKICNpbmNsdWRlICJId01vZHVsZS5oIgorI2luY2x1ZGUgIlR5cGVDb252ZXJ0ZXIuaCIKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CiAKQEAgLTM1LDE5ICszNiw4IEBACiAKIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yKGNvbnN0IHNwPEF1ZGlvUG9ydD4mIHBvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQotICAgIDogbVBvcnQocG9ydCksIG1EZXZpY2UoQVVESU9fREVWSUNFX05PTkUpLAotICAgICAgbUNsaWVudEludGVyZmFjZShjbGllbnRJbnRlcmZhY2UpLCBtUGF0Y2hIYW5kbGUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUpLCBtSWQoMCkKKyAgICA6IG1Qb3J0KHBvcnQpLCBtQ2xpZW50SW50ZXJmYWNlKGNsaWVudEludGVyZmFjZSkKIHsKLSAgICAvLyBjbGVhciB1c2FnZSBjb3VudCBmb3IgYWxsIHN0cmVhbSB0eXBlcwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7Ci0gICAgICAgIG1SZWZDb3VudFtpXSA9IDA7Ci0gICAgICAgIG1DdXJWb2x1bWVbaV0gPSAtMS4wOwotICAgICAgICBtTXV0ZUNvdW50W2ldID0gMDsKLSAgICAgICAgbVN0b3BUaW1lW2ldID0gMDsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fU1RSQVRFR0lFUzsgaSsrKSB7Ci0gICAgICAgIG1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0gPSBmYWxzZTsKLSAgICB9CiAgICAgaWYgKG1Qb3J0LmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgbVBvcnQtPnBpY2tBdWRpb1Byb2ZpbGUobVNhbXBsaW5nUmF0ZSwgbUNoYW5uZWxNYXNrLCBtRm9ybWF0KTsKICAgICAgICAgaWYgKG1Qb3J0LT5tR2FpbnMuc2l6ZSgpID4gMCkgewpAQCAtNTYsNDggKzQ2LDg4IEBACiAgICAgfQogfQogCithdWRpb19jb25maWdfYmFzZV90IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Z2V0Q29uZmlnKCkgY29uc3QKK3sKKyAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZyA9IHsgLnNhbXBsZV9yYXRlID0gbVNhbXBsaW5nUmF0ZSwgLmNoYW5uZWxfbWFzayA9IG1DaGFubmVsTWFzaywKKyAgICAgICAgICAgIC5mb3JtYXQgPSBtRm9ybWF0IH07CisgICAgcmV0dXJuIGNvbmZpZzsKK30KKwogYXVkaW9fbW9kdWxlX2hhbmRsZV90IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Z2V0TW9kdWxlSGFuZGxlKCkgY29uc3QKIHsKICAgICByZXR1cm4gbVBvcnQuZ2V0KCkgIT0gbnVsbHB0ciA/IG1Qb3J0LT5nZXRNb2R1bGVIYW5kbGUoKSA6IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORTsKIH0KIAorYXVkaW9fcGF0Y2hfaGFuZGxlX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpnZXRQYXRjaEhhbmRsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1QYXRjaEhhbmRsZTsKK30KKwordm9pZCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFBhdGNoSGFuZGxlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBtUGF0Y2hIYW5kbGUgPSBoYW5kbGU7Cit9CisKIGF1ZGlvX3BvcnRfaGFuZGxlX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpnZXRJZCgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1JZDsKIH0KIAotYXVkaW9fZGV2aWNlc190IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZGV2aWNlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbURldmljZTsKLX0KLQotYXVkaW9fZGV2aWNlc190IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c3VwcG9ydGVkRGV2aWNlcygpCi17Ci0gICAgcmV0dXJuIG1EZXZpY2U7Ci19Ci0KIGJvb2wgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzaGFyZXNId01vZHVsZVdpdGgoCiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MpCiB7Ci0gICAgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7Ci0gICAgICAgIHJldHVybiBzaGFyZXNId01vZHVsZVdpdGgob3V0cHV0RGVzYy0+c3ViT3V0cHV0MSgpKSB8fAotICAgICAgICAgICAgICAgICAgICBzaGFyZXNId01vZHVsZVdpdGgob3V0cHV0RGVzYy0+c3ViT3V0cHV0MigpKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gaGFzU2FtZUh3TW9kdWxlQXMob3V0cHV0RGVzYyk7Ci0gICAgfQorICAgIHJldHVybiBoYXNTYW1lSHdNb2R1bGVBcyhvdXRwdXREZXNjKTsKIH0KIAotdm9pZCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmNoYW5nZVJlZkNvdW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YSkKK3ZvaWQgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRTdG9wVGltZShjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIG5zZWNzX3Qgc3lzVGltZSkKIHsKLSAgICBpZiAoKGRlbHRhICsgKGludCltUmVmQ291bnRbc3RyZWFtXSkgPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJjaGFuZ2VSZWZDb3VudCgpIGludmFsaWQgZGVsdGEgJWQgZm9yIHN0cmVhbSAlZCwgcmVmQ291bnQgJWQiLAotICAgICAgICAgICAgICBkZWx0YSwgc3RyZWFtLCBtUmVmQ291bnRbc3RyZWFtXSk7Ci0gICAgICAgIG1SZWZDb3VudFtzdHJlYW1dID0gMDsKKyAgICBtVm9sdW1lQWN0aXZpdGllc1tjbGllbnQtPnZvbHVtZVNvdXJjZSgpXS5zZXRTdG9wVGltZShzeXNUaW1lKTsKKyAgICBtUm91dGluZ0FjdGl2aXRpZXNbY2xpZW50LT5zdHJhdGVneSgpXS5zZXRTdG9wVGltZShzeXNUaW1lKTsKK30KKwordm9pZCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldENsaWVudEFjdGl2ZShjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIGJvb2wgYWN0aXZlKQoreworICAgIGF1dG8gY2xpZW50SXRlciA9IHN0ZDo6ZmluZChiZWdpbihtQWN0aXZlQ2xpZW50cyksIGVuZChtQWN0aXZlQ2xpZW50cyksIGNsaWVudCk7CisgICAgaWYgKGFjdGl2ZSA9PSAoY2xpZW50SXRlciAhPSBlbmQobUFjdGl2ZUNsaWVudHMpKSkgeworICAgICAgICBBTE9HVygiJXMoJXMpOiBpZ25vcmVkIGFjdGl2ZTogJWQsIGN1cnJlbnQgc3RyZWFtIGNvdW50ICVkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgIGNsaWVudC0+dG9TaG9ydFN0cmluZygpLmNfc3RyKCksIGFjdGl2ZSwKKyAgICAgICAgICAgICAgbVJvdXRpbmdBY3Rpdml0aWVzLmF0KGNsaWVudC0+c3RyYXRlZ3koKSkuZ2V0QWN0aXZpdHlDb3VudCgpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBtUmVmQ291bnRbc3RyZWFtXSArPSBkZWx0YTsKLSAgICBBTE9HVigiY2hhbmdlUmVmQ291bnQoKSBzdHJlYW0gJWQsIGNvdW50ICVkIiwgc3RyZWFtLCBtUmVmQ291bnRbc3RyZWFtXSk7CisgICAgaWYgKGFjdGl2ZSkgeworICAgICAgICBtQWN0aXZlQ2xpZW50cy5wdXNoX2JhY2soY2xpZW50KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQWN0aXZlQ2xpZW50cy5lcmFzZShjbGllbnRJdGVyKTsKKyAgICB9CisgICAgY29uc3QgaW50IGRlbHRhID0gYWN0aXZlID8gMSA6IC0xOworICAgIC8vIElmIHBzIGlzIHVua25vd24sIGl0IGlzIHRpbWUgdG8gdHJhY2sgaXQhCisgICAgbVJvdXRpbmdBY3Rpdml0aWVzW2NsaWVudC0+c3RyYXRlZ3koKV0uY2hhbmdlQWN0aXZpdHlDb3VudChkZWx0YSk7CisgICAgbVZvbHVtZUFjdGl2aXRpZXNbY2xpZW50LT52b2x1bWVTb3VyY2UoKV0uY2hhbmdlQWN0aXZpdHlDb3VudChkZWx0YSk7CisKKyAgICAvLyBIYW5kbGUgbm9uLWNsaWVudC1zcGVjaWZpYyBhY3Rpdml0eSByZWYgY291bnQKKyAgICBpbnQzMl90IG9sZEdsb2JhbEFjdGl2ZUNvdW50ID0gbUdsb2JhbEFjdGl2ZUNvdW50OworICAgIGlmICghYWN0aXZlICYmIG1HbG9iYWxBY3RpdmVDb3VudCA8IDEpIHsKKyAgICAgICAgQUxPR1coIiVzKCVzKTogaW52YWxpZCBkZWFjdGl2YXRpb24gd2l0aCBnbG9iYWxSZWZDb3VudCAlZCIsCisgICAgICAgICAgICAgIF9fZnVuY19fLCBjbGllbnQtPnRvU2hvcnRTdHJpbmcoKS5jX3N0cigpLCBtR2xvYmFsQWN0aXZlQ291bnQpOworICAgICAgICBtR2xvYmFsQWN0aXZlQ291bnQgPSAxOworICAgIH0KKyAgICBtR2xvYmFsQWN0aXZlQ291bnQgKz0gZGVsdGE7CisKKyAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4ID0gbVBvbGljeU1peC5wcm9tb3RlKCk7CisgICAgaWYgKChwb2xpY3lNaXggIT0gTlVMTCkgJiYgKChwb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpIHsKKyAgICAgICAgaWYgKChvbGRHbG9iYWxBY3RpdmVDb3VudCA9PSAwKSB8fCAobUdsb2JhbEFjdGl2ZUNvdW50ID09IDApKSB7CisgICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgICAgIG1HbG9iYWxBY3RpdmVDb3VudCA+IDAgPyBNSVhfU1RBVEVfTUlYSU5HIDogTUlYX1NUQVRFX0lETEUpOworICAgICAgICB9CisgICAgfQorICAgIGNsaWVudC0+c2V0QWN0aXZlKGFjdGl2ZSk7Cit9CisKK2Jvb2wgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjppc0FjdGl2ZShWb2x1bWVTb3VyY2UgdnMsIHVpbnQzMl90IGluUGFzdE1zLCBuc2Vjc190IHN5c1RpbWUpIGNvbnN0Cit7CisgICAgcmV0dXJuICh2cyA9PSBWT0xVTUVfU09VUkNFX05PTkUpID8KKyAgICAgICAgICAgICAgICBpc0FjdGl2ZShpblBhc3RNcykgOiAobVZvbHVtZUFjdGl2aXRpZXMuZmluZCh2cykgIT0gc3RkOjplbmQobVZvbHVtZUFjdGl2aXRpZXMpPworICAgICAgICAgICAgICAgIG1Wb2x1bWVBY3Rpdml0aWVzLmF0KHZzKS5pc0FjdGl2ZShpblBhc3RNcywgc3lzVGltZSkgOiBmYWxzZSk7CiB9CiAKIGJvb2wgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjppc0FjdGl2ZSh1aW50MzJfdCBpblBhc3RNcykgY29uc3QKQEAgLTEwNiw1NCArMTM2LDMyIEBACiAgICAgaWYgKGluUGFzdE1zICE9IDApIHsKICAgICAgICAgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKICAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KUFVRElPX1NUUkVBTV9DTlQ7IGkrKykgewotICAgICAgICBpZiAoaSA9PSBBVURJT19TVFJFQU1fUEFUQ0gpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc1N0cmVhbUFjdGl2ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClpLCBpblBhc3RNcywgc3lzVGltZSkpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiBtVm9sdW1lQWN0aXZpdGllcykgeworICAgICAgICBpZiAoaXRlci5zZWNvbmQuaXNBY3RpdmUoaW5QYXN0TXMsIHN5c1RpbWUpKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2wgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjppc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHN5c1RpbWUpIGNvbnN0Ci17Ci0gICAgaWYgKG1SZWZDb3VudFtzdHJlYW1dICE9IDApIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGlmIChpblBhc3RNcyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKHN5c1RpbWUgPT0gMCkgewotICAgICAgICBzeXNUaW1lID0gc3lzdGVtVGltZSgpOwotICAgIH0KLSAgICBpZiAobnMybXMoc3lzVGltZSAtIG1TdG9wVGltZVtzdHJlYW1dKSA8IGluUGFzdE1zKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLQogYm9vbCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzRml4ZWRWb2x1bWUoYXVkaW9fZGV2aWNlc190IGRldmljZSBfX3VudXNlZCkKIHsKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2wgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSBfX3VudXNlZCwKK2Jvb2wgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lRGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmVhbVR5cGVWZWN0b3IgJi8qc3RyZWFtcyovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgLypkZXZpY2UqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKIHsKICAgICAvLyBXZSBhY3R1YWxseSBjaGFuZ2UgdGhlIHZvbHVtZSBpZjoKICAgICAvLyAtIHRoZSBmbG9hdCB2YWx1ZSByZXR1cm5lZCBieSBjb21wdXRlVm9sdW1lKCkgY2hhbmdlZAogICAgIC8vIC0gdGhlIGZvcmNlIGZsYWcgaXMgc2V0Ci0gICAgaWYgKHZvbHVtZSAhPSBtQ3VyVm9sdW1lW3N0cmVhbV0gfHwgZm9yY2UpIHsKLSAgICAgICAgQUxPR1YoInNldFZvbHVtZSgpIGZvciBzdHJlYW0gJWQsIHZvbHVtZSAlZiwgZGVsYXkgJWQiLCBzdHJlYW0sIHZvbHVtZSwgZGVsYXlNcyk7Ci0gICAgICAgIG1DdXJWb2x1bWVbc3RyZWFtXSA9IHZvbHVtZTsKKyAgICBpZiAodm9sdW1lRGIgIT0gZ2V0Q3VyVm9sdW1lKHZvbHVtZVNvdXJjZSkgfHwgZm9yY2UpIHsKKyAgICAgICAgQUxPR1YoIiVzIGZvciB2b2x1bWVTcmMgJWQsIHZvbHVtZSAlZiwgZGVsYXkgJWQiLCBfX2Z1bmNfXywgdm9sdW1lU291cmNlLCB2b2x1bWVEYiwgZGVsYXlNcyk7CisgICAgICAgIHNldEN1clZvbHVtZSh2b2x1bWVTb3VyY2UsIHZvbHVtZURiKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKQEAgLTE4NSwzMiArMTkzLDU1IEBACiAgICAgcG9ydC0+ZXh0Lm1peC5od19tb2R1bGUgPSBnZXRNb2R1bGVIYW5kbGUoKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKK1RyYWNrQ2xpZW50VmVjdG9yIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Y2xpZW50c0xpc3QoYm9vbCBhY3RpdmVPbmx5LCBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJlZmVycmVkRGV2aWNlT25seSkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBJRDogJWRcbiIsIG1JZCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTYW1wbGluZyByYXRlOiAlZFxuIiwgbVNhbXBsaW5nUmF0ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGb3JtYXQ6ICUwOHhcbiIsIG1Gb3JtYXQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgQ2hhbm5lbHM6ICUwOHhcbiIsIG1DaGFubmVsTWFzayk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBEZXZpY2VzICUwOHhcbiIsIGRldmljZSgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFN0cmVhbSB2b2x1bWUgcmVmQ291bnQgbXV0ZUNvdW50XG4iKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KUFVRElPX1NUUkVBTV9DTlQ7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgJTAyZCAgICAgJS4wM2YgICAgICUwMmQgICAgICAgJTAyZFxuIiwKLSAgICAgICAgICAgICAgICAgaSwgbUN1clZvbHVtZVtpXSwgbVJlZkNvdW50W2ldLCBtTXV0ZUNvdW50W2ldKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIFRyYWNrQ2xpZW50VmVjdG9yIGNsaWVudHM7CisgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBnZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgIGlmICgoIWFjdGl2ZU9ubHkgfHwgY2xpZW50LT5hY3RpdmUoKSkKKyAgICAgICAgICAgICYmIChzdHJhdGVneSA9PSBQUk9EVUNUX1NUUkFURUdZX05PTkUgfHwgc3RyYXRlZ3kgPT0gY2xpZW50LT5zdHJhdGVneSgpKQorICAgICAgICAgICAgJiYgKCFwcmVmZXJyZWREZXZpY2VPbmx5IHx8CisgICAgICAgICAgICAgICAgKGNsaWVudC0+aGFzUHJlZmVycmVkRGV2aWNlKCkgJiYgIWNsaWVudC0+aXNQcmVmZXJyZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UoKSkpKSB7CisgICAgICAgICAgICBjbGllbnRzLnB1c2hfYmFjayhjbGllbnQpOworICAgICAgICB9CiAgICAgfQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIHJldHVybiBjbGllbnRzOworfQogCi0gICAgcmV0dXJuIE5PX0VSUk9SOworYm9vbCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzQW55QWN0aXZlKFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2VUb0lnbm9yZSkgY29uc3QKK3sKKyAgICByZXR1cm4gc3RkOjpmaW5kX2lmKGJlZ2luKG1BY3RpdmVDbGllbnRzKSwgZW5kKG1BY3RpdmVDbGllbnRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsmdm9sdW1lU291cmNlVG9JZ25vcmVdKGNvbnN0IGF1dG8gJmNsaWVudCkgeworICAgICAgICByZXR1cm4gY2xpZW50LT52b2x1bWVTb3VyY2UoKSAhPSB2b2x1bWVTb3VyY2VUb0lnbm9yZTsgfSkgIT0gZW5kKG1BY3RpdmVDbGllbnRzKTsKK30KKwordm9pZCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgSUQ6ICVkXG4iLCBtSWQpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRm9ybWF0OiAlMDh4XG4iLCBtRm9ybWF0KTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIENoYW5uZWxzOiAlMDh4XG4iLCBtQ2hhbm5lbE1hc2spOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRGV2aWNlczogJXNcbiIsIGRldmljZXMoKS50b1N0cmluZygpLmNfc3RyKCkpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgR2xvYmFsIGFjdGl2ZSBjb3VudDogJXVcbiIsIG1HbG9iYWxBY3RpdmVDb3VudCk7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogbVJvdXRpbmdBY3Rpdml0aWVzKSB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgUHJvZHVjdCBTdHJhdGVneSBpZDogJWQiLCBpdGVyLmZpcnN0KTsKKyAgICAgICAgaXRlci5zZWNvbmQuZHVtcChkc3QsIDQpOworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiBtVm9sdW1lQWN0aXZpdGllcykgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFZvbHVtZSBBY3Rpdml0aWVzIGlkOiAlZCIsIGl0ZXIuZmlyc3QpOworICAgICAgICBpdGVyLnNlY29uZC5kdW1wKGRzdCwgNCk7CisgICAgfQorICAgIGRzdC0+YXBwZW5kKCIgQXVkaW9UcmFjayBDbGllbnRzOlxuIik7CisgICAgQ2xpZW50TWFwSGFuZGxlcjxUcmFja0NsaWVudERlc2NyaXB0b3I+OjpkdW1wKGRzdCk7CisgICAgZHN0LT5hcHBlbmQoIlxuIik7CisgICAgaWYgKCFtQWN0aXZlQ2xpZW50cy5lbXB0eSgpKSB7CisgICAgICAgIGRzdC0+YXBwZW5kKCIgQXVkaW9UcmFjayBhY3RpdmUgKHN0cmVhbSkgY2xpZW50czpcbiIpOworICAgICAgICBzaXplX3QgaW5kZXggPSAwOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IG1BY3RpdmVDbGllbnRzKSB7CisgICAgICAgICAgICBjbGllbnQtPmR1bXAoZHN0LCAyLCBpbmRleCsrKTsKKyAgICAgICAgfQorICAgICAgICBkc3QtPmFwcGVuZCgiIFxuIik7CisgICAgfQogfQogCiB2b2lkIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6bG9nKGNvbnN0IGNoYXIqIGluZGVudCkKQEAgLTIyNCw0MyArMjU1LDM0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSkKICAgICA6IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihwcm9maWxlLCBjbGllbnRJbnRlcmZhY2UpLAogICAgIG1Qcm9maWxlKHByb2ZpbGUpLCBtSW9IYW5kbGUoQVVESU9fSU9fSEFORExFX05PTkUpLCBtTGF0ZW5jeSgwKSwKLSAgICBtRmxhZ3MoKGF1ZGlvX291dHB1dF9mbGFnc190KTApLCBtUG9saWN5TWl4KE5VTEwpLAorICAgIG1GbGFncygoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpMCksCiAgICAgbU91dHB1dDEoMCksIG1PdXRwdXQyKDApLCBtRGlyZWN0T3BlbkNvdW50KDApLAotICAgIG1EaXJlY3RDbGllbnRTZXNzaW9uKEFVRElPX1NFU1NJT05fTk9ORSksIG1HbG9iYWxSZWZDb3VudCgwKQorICAgIG1EaXJlY3RDbGllbnRTZXNzaW9uKEFVRElPX1NFU1NJT05fTk9ORSkKIHsKICAgICBpZiAocHJvZmlsZSAhPSBOVUxMKSB7CiAgICAgICAgIG1GbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdClwcm9maWxlLT5nZXRGbGFncygpOwogICAgIH0KIH0KIAotc3RhdHVzX3QgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQordm9pZCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgTGF0ZW5jeTogJWRcbiIsIG1MYXRlbmN5KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZsYWdzICUwOHhcbiIsIG1GbGFncyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotCi0gICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKGZkKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIExhdGVuY3k6ICVkXG4iLCBtTGF0ZW5jeSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBGbGFncyAlMDh4XG4iLCBtRmxhZ3MpOworICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChkc3QpOwogfQogCi1hdWRpb19kZXZpY2VzX3QgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmRldmljZSgpIGNvbnN0CitEZXZpY2VWZWN0b3IgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmRldmljZXMoKSBjb25zdAogewogICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICByZXR1cm4gKGF1ZGlvX2RldmljZXNfdCkobU91dHB1dDEtPm1EZXZpY2UgfCBtT3V0cHV0Mi0+bURldmljZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2U7CisgICAgICAgIERldmljZVZlY3RvciBkZXZpY2VzID0gbU91dHB1dDEtPmRldmljZXMoKTsKKyAgICAgICAgZGV2aWNlcy5tZXJnZShtT3V0cHV0Mi0+ZGV2aWNlcygpKTsKKyAgICAgICAgcmV0dXJuIGRldmljZXM7CiAgICAgfQorICAgIHJldHVybiBtRGV2aWNlczsKIH0KIAogYm9vbCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2hhcmVzSHdNb2R1bGVXaXRoKAotICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjKQorICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MpCiB7CiAgICAgaWYgKGlzRHVwbGljYXRlZCgpKSB7CiAgICAgICAgIHJldHVybiBtT3V0cHV0MS0+c2hhcmVzSHdNb2R1bGVXaXRoKG91dHB1dERlc2MpIHx8IG1PdXRwdXQyLT5zaGFyZXNId01vZHVsZVdpdGgob3V0cHV0RGVzYyk7CkBAIC0yNzIsMTIgKzI5NCwzOSBAQAogICAgIH0KIH0KIAotYXVkaW9fZGV2aWNlc190IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzdXBwb3J0ZWREZXZpY2VzKCkKK0RldmljZVZlY3RvciBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c3VwcG9ydGVkRGV2aWNlcygpIGNvbnN0CiB7CiAgICAgaWYgKGlzRHVwbGljYXRlZCgpKSB7Ci0gICAgICAgIHJldHVybiAoYXVkaW9fZGV2aWNlc190KShtT3V0cHV0MS0+c3VwcG9ydGVkRGV2aWNlcygpIHwgbU91dHB1dDItPnN1cHBvcnRlZERldmljZXMoKSk7CisgICAgICAgIERldmljZVZlY3RvciBzdXBwb3J0ZWREZXZpY2VzID0gbU91dHB1dDEtPnN1cHBvcnRlZERldmljZXMoKTsKKyAgICAgICAgc3VwcG9ydGVkRGV2aWNlcy5tZXJnZShtT3V0cHV0Mi0+c3VwcG9ydGVkRGV2aWNlcygpKTsKKyAgICAgICAgcmV0dXJuIHN1cHBvcnRlZERldmljZXM7CisgICAgfQorICAgIHJldHVybiBtUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpOworfQorCitib29sIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzdXBwb3J0c0RldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlKSBjb25zdAoreworICAgIHJldHVybiBzdXBwb3J0ZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKTsKK30KKworYm9vbCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c3VwcG9ydHNBbGxEZXZpY2VzKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3QKK3sKKyAgICByZXR1cm4gc3VwcG9ydGVkRGV2aWNlcygpLmNvbnRhaW5zQWxsRGV2aWNlcyhkZXZpY2VzKTsKK30KKworRGV2aWNlVmVjdG9yIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpmaWx0ZXJTdXBwb3J0ZWREZXZpY2VzKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3QKK3sKKyAgICBEZXZpY2VWZWN0b3IgZmlsdGVyZWREZXZpY2VzID0gc3VwcG9ydGVkRGV2aWNlcygpOworICAgIHJldHVybiBmaWx0ZXJlZERldmljZXMuZmlsdGVyKGRldmljZXMpOworfQorCitib29sIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkZXZpY2VTdXBwb3J0c0VuY29kZWRGb3JtYXRzKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgaWYgKGlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgIHJldHVybiAobU91dHB1dDEtPmRldmljZVN1cHBvcnRzRW5jb2RlZEZvcm1hdHMoZGV2aWNlKQorICAgICAgICAgICAgICAgICAgICB8fCBtT3V0cHV0Mi0+ZGV2aWNlU3VwcG9ydHNFbmNvZGVkRm9ybWF0cyhkZXZpY2UpKTsKICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbVByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXNUeXBlKCk7CisgICAgICAgcmV0dXJuIG1Qcm9maWxlLT5kZXZpY2VTdXBwb3J0c0VuY29kZWRGb3JtYXRzKGRldmljZSk7CiAgICAgfQogfQogCkBAIC0yOTAsNDIgKzMzOSwxNiBAQAogICAgIH0KIH0KIAotdm9pZCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Y2hhbmdlUmVmQ291bnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbHRhKQordm9pZCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Q2xpZW50QWN0aXZlKGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwgYm9vbCBhY3RpdmUpCiB7CiAgICAgLy8gZm9yd2FyZCB1c2FnZSBjb3VudCBjaGFuZ2UgdG8gYXR0YWNoZWQgb3V0cHV0cwogICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICBtT3V0cHV0MS0+Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCBkZWx0YSk7Ci0gICAgICAgIG1PdXRwdXQyLT5jaGFuZ2VSZWZDb3VudChzdHJlYW0sIGRlbHRhKTsKKyAgICAgICAgbU91dHB1dDEtPnNldENsaWVudEFjdGl2ZShjbGllbnQsIGFjdGl2ZSk7CisgICAgICAgIG1PdXRwdXQyLT5zZXRDbGllbnRBY3RpdmUoY2xpZW50LCBhY3RpdmUpOwogICAgIH0KLSAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgZGVsdGEpOwotCi0gICAgLy8gaGFuZGxlIHN0cmVhbS1pbmRlcGVuZGVudCByZWYgY291bnQKLSAgICB1aW50MzJfdCBvbGRHbG9iYWxSZWZDb3VudCA9IG1HbG9iYWxSZWZDb3VudDsKLSAgICBpZiAoKGRlbHRhICsgKGludCltR2xvYmFsUmVmQ291bnQpIDwgMCkgewotICAgICAgICBBTE9HVygiY2hhbmdlUmVmQ291bnQoKSBpbnZhbGlkIGRlbHRhICVkIGdsb2JhbFJlZkNvdW50ICVkIiwgZGVsdGEsIG1HbG9iYWxSZWZDb3VudCk7Ci0gICAgICAgIG1HbG9iYWxSZWZDb3VudCA9IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUdsb2JhbFJlZkNvdW50ICs9IGRlbHRhOwotICAgIH0KLSAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4ID0gbVBvbGljeU1peC5wcm9tb3RlKCk7Ci0gICAgaWYgKChvbGRHbG9iYWxSZWZDb3VudCA9PSAwKSAmJiAobUdsb2JhbFJlZkNvdW50ID4gMCkpIHsKLSAgICAgICAgaWYgKChwb2xpY3lNaXggIT0gTlVMTCkgJiYgKChwb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKHBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIE1JWF9TVEFURV9NSVhJTkcpOwotICAgICAgICB9Ci0KLSAgICB9IGVsc2UgaWYgKChvbGRHbG9iYWxSZWZDb3VudCA+IDApICYmIChtR2xvYmFsUmVmQ291bnQgPT0gMCkpIHsKLSAgICAgICAgaWYgKChwb2xpY3lNaXggIT0gTlVMTCkgJiYgKChwb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKHBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIE1JWF9TVEFURV9JRExFKTsKLSAgICAgICAgfQotICAgIH0KKyAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldENsaWVudEFjdGl2ZShjbGllbnQsIGFjdGl2ZSk7CiB9CiAKLQogYm9vbCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6aXNGaXhlZFZvbHVtZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQogewogICAgIC8vIHVuaXQgZ2FpbiBpZiByZXJvdXRpbmcgdG8gZXh0ZXJuYWwgcG9saWN5CkBAIC0zNjYsMzQgKzM4OSw3MiBAQAogICAgICAgICAgICAgbUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCA/IEFVRElPX0xBVEVOQ1lfTE9XIDogQVVESU9fTEFURU5DWV9OT1JNQUw7CiB9CiAKLWJvb2wgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZShmbG9hdCB2b2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCitib29sIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lRGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU291cmNlIHZzLCBjb25zdCBTdHJlYW1UeXBlVmVjdG9yICZzdHJlYW1UeXBlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKIHsKLSAgICBib29sIGNoYW5nZWQgPSBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZSh2b2x1bWUsIHN0cmVhbSwgZGV2aWNlLCBkZWxheU1zLCBmb3JjZSk7Ci0KLSAgICBpZiAoY2hhbmdlZCkgewotICAgICAgICAvLyBGb3JjZSBWT0lDRV9DQUxMIHRvIHRyYWNrIEJMVUVUT09USF9TQ08gc3RyZWFtIHZvbHVtZSB3aGVuIGJsdWV0b290aCBhdWRpbyBpcwotICAgICAgICAvLyBlbmFibGVkCi0gICAgICAgIGZsb2F0IHZvbHVtZSA9IFZvbHVtZTo6RGJUb0FtcGwobUN1clZvbHVtZVtzdHJlYW1dKTsKLSAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTykgewotICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+c2V0U3RyZWFtVm9sdW1lKAotICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgdm9sdW1lLCBtSW9IYW5kbGUsIGRlbGF5TXMpOwotICAgICAgICB9Ci0gICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbVZvbHVtZShzdHJlYW0sIHZvbHVtZSwgbUlvSGFuZGxlLCBkZWxheU1zKTsKKyAgICBTdHJlYW1UeXBlVmVjdG9yIHN0cmVhbXMgPSBzdHJlYW1UeXBlczsKKyAgICBpZiAoIUF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKHZvbHVtZURiLCB2cywgc3RyZWFtVHlwZXMsIGRldmljZSwgZGVsYXlNcywgZm9yY2UpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgcmV0dXJuIGNoYW5nZWQ7CisgICAgaWYgKHN0cmVhbXMuZW1wdHkoKSkgeworICAgICAgICBzdHJlYW1zLnB1c2hfYmFjayhBVURJT19TVFJFQU1fTVVTSUMpOworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZVBvcnQgOiBkZXZpY2VzKCkpIHsKKyAgICAgICAgLy8gQVBNIGxvb3BzIG9uIGFsbCBncm91cCwgc28gZmlsdGVyIG9uIGFjdGl2ZSBncm91cCB0byBzZXQgdGhlIHBvcnQgZ2FpbiwKKyAgICAgICAgLy8gbGV0IHRoZSBvdGhlciBncm91cHMgc2V0IHRoZSBzdHJlYW0gdm9sdW1lIGFzIHBlciBsZWdhY3kKKyAgICAgICAgLy8gVE9ETzogUGFzcyBpbiB0aGUgZGV2aWNlIGFkZHJlc3MgYW5kIGNoZWNrIGFnYWluc3QgaXQuCisgICAgICAgIGlmIChkZXZpY2UgPT0gZGV2aWNlUG9ydC0+dHlwZSgpICYmCisgICAgICAgICAgICAgICAgZGV2aWNlUG9ydC0+aGFzR2FpbkNvbnRyb2xsZXIodHJ1ZSkgJiYgaXNBY3RpdmUodnMpKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IGRldmljZSAlcyBoYXMgZ2FpbiBjb250cm9sbGVyIiwgX19mdW5jX18sIGRldmljZVBvcnQtPnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAvLyBAdG9kbzogaGVyZSB3ZSBtaWdodCBiZSBpbiB0cm91YmxlIGlmIHRoZSBTd091dHB1dCBoYXMgc2V2ZXJhbCBhY3RpdmUgY2xpZW50cyB3aXRoCisgICAgICAgICAgICAvLyBkaWZmZXJlbnQgVm9sdW1lIFNvdXJjZSAob3IgaWYgd2UgYWxsb3cgc2V2ZXJhbCBjdXJ2ZXMgd2l0aGluIHNhbWUgdm9sdW1lIGdyb3VwKQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEB0b2RvOiBkZWZhdWx0IHN0cmVhbSB2b2x1bWUgdG8gbWF4ICgwKSB3aGVuIHVzaW5nIEhXIFBvcnQgZ2Fpbj8KKyAgICAgICAgICAgIGZsb2F0IHZvbHVtZUFtcGwgPSBWb2x1bWU6OkRiVG9BbXBsKDApOworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZzdHJlYW0gOiBzdHJlYW1zKSB7CisgICAgICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+c2V0U3RyZWFtVm9sdW1lKHN0cmVhbSwgdm9sdW1lQW1wbCwgbUlvSGFuZGxlLCBkZWxheU1zKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQXVkaW9HYWlucyBnYWlucyA9IGRldmljZVBvcnQtPmdldEdhaW5zKCk7CisgICAgICAgICAgICBpbnQgZ2Fpbk1pblZhbHVlSW5NYiA9IGdhaW5zWzBdLT5nZXRNaW5WYWx1ZUluTWIoKTsKKyAgICAgICAgICAgIGludCBnYWluTWF4VmFsdWVJbk1iID0gZ2FpbnNbMF0tPmdldE1heFZhbHVlSW5NYigpOworICAgICAgICAgICAgaW50IGdhaW5TdGVwVmFsdWVJbk1iID0gZ2FpbnNbMF0tPmdldFN0ZXBWYWx1ZUluTWIoKTsKKyAgICAgICAgICAgIGludCBnYWluVmFsdWVNYiA9ICgodm9sdW1lRGIgKiAxMDApLyBnYWluU3RlcFZhbHVlSW5NYikgKiBnYWluU3RlcFZhbHVlSW5NYjsKKyAgICAgICAgICAgIGdhaW5WYWx1ZU1iID0gc3RkOjptYXgoZ2Fpbk1pblZhbHVlSW5NYiwgc3RkOjptaW4oZ2FpblZhbHVlTWIsIGdhaW5NYXhWYWx1ZUluTWIpKTsKKworICAgICAgICAgICAgYXVkaW9fcG9ydF9jb25maWcgY29uZmlnID0ge307CisgICAgICAgICAgICBkZXZpY2VQb3J0LT50b0F1ZGlvUG9ydENvbmZpZygmY29uZmlnKTsKKyAgICAgICAgICAgIGNvbmZpZy5jb25maWdfbWFzayA9IEFVRElPX1BPUlRfQ09ORklHX0dBSU47CisgICAgICAgICAgICBjb25maWcuZ2Fpbi52YWx1ZXNbMF0gPSBnYWluVmFsdWVNYjsKKyAgICAgICAgICAgIHJldHVybiBtQ2xpZW50SW50ZXJmYWNlLT5zZXRBdWRpb1BvcnRDb25maWcoJmNvbmZpZywgMCkgPT0gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gRm9yY2UgVk9JQ0VfQ0FMTCB0byB0cmFjayBCTFVFVE9PVEhfU0NPIHN0cmVhbSB2b2x1bWUgd2hlbiBibHVldG9vdGggYXVkaW8gaXMgZW5hYmxlZAorICAgIGZsb2F0IHZvbHVtZUFtcGwgPSBWb2x1bWU6OkRiVG9BbXBsKGdldEN1clZvbHVtZSh2cykpOworICAgIGlmIChoYXNTdHJlYW0oc3RyZWFtcywgQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08pKSB7CisgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbVZvbHVtZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgdm9sdW1lQW1wbCwgbUlvSGFuZGxlLCBkZWxheU1zKTsKKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvICZzdHJlYW0gOiBzdHJlYW1zKSB7CisgICAgICAgIEFMT0dWKCIlcyBvdXRwdXQgJWQgZm9yIHZvbHVtZVNvdXJjZSAlZCwgdm9sdW1lICVmLCBkZWxheSAlZCBzdHJlYW09JXMiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgbUlvSGFuZGxlLCB2cywgdm9sdW1lRGIsIGRlbGF5TXMsIHRvU3RyaW5nKHN0cmVhbSkuY19zdHIoKSk7CisgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbVZvbHVtZShzdHJlYW0sIHZvbHVtZUFtcGwsIG1Jb0hhbmRsZSwgZGVsYXlNcyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOwogfQogCiBzdGF0dXNfdCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6b3Blbihjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCkKIHsKKyAgICBtRGV2aWNlcyA9IGRldmljZXM7CisgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcyA9IGRldmljZXMuZ2V0Rmlyc3RWYWxpZEFkZHJlc3MoKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZGV2aWNlcy50eXBlcygpOworCiAgICAgYXVkaW9fY29uZmlnX3QgbENvbmZpZzsKICAgICBpZiAoY29uZmlnID09IG51bGxwdHIpIHsKICAgICAgICAgbENvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKQEAgLTQwNCw3ICs0NjUsNiBAQAogICAgICAgICBsQ29uZmlnID0gKmNvbmZpZzsKICAgICB9CiAKLSAgICBtRGV2aWNlID0gZGV2aWNlOwogICAgIC8vIGlmIHRoZSBzZWxlY3RlZCBwcm9maWxlIGlzIG9mZmxvYWRlZCBhbmQgbm8gb2ZmbG9hZCBpbmZvIHdhcyBzcGVjaWZpZWQsCiAgICAgLy8gY3JlYXRlIGEgZGVmYXVsdCBvbmUKICAgICBpZiAoKG1Qcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgJiYKQEAgLTQyMiwxOSArNDgyLDE5IEBACiAKICAgICBtRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKG1GbGFncyB8IGZsYWdzKTsKIAotICAgIEFMT0dWKCJvcGVuaW5nIG91dHB1dCBmb3IgZGV2aWNlICUwOHggYWRkcmVzcyAlcyBwcm9maWxlICVwIG5hbWUgJXMiLAotICAgICAgICAgIG1EZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCksIG1Qcm9maWxlLmdldCgpLCBtUHJvZmlsZS0+Z2V0TmFtZSgpLnN0cmluZygpKTsKKyAgICBBTE9HVigib3BlbmluZyBvdXRwdXQgZm9yIGRldmljZSAlcyBwcm9maWxlICVwIG5hbWUgJXMiLAorICAgICAgICAgIG1EZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSwgbVByb2ZpbGUuZ2V0KCksIG1Qcm9maWxlLT5nZXROYW1lKCkuc3RyaW5nKCkpOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUNsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChtUHJvZmlsZS0+Z2V0TW9kdWxlSGFuZGxlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUxhdGVuY3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmxhZ3MpOwotICAgIExPR19BTFdBWVNfRkFUQUxfSUYobURldmljZSAhPSBkZXZpY2UsCisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtRGV2aWNlcy50eXBlcygpICE9IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICIlcyBvcGVuT3V0cHV0IHJldHVybmVkIGRldmljZSAlMDh4IHdoZW4gZ2l2ZW4gZGV2aWNlICUwOHgiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtRGV2aWNlLCBkZXZpY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtRGV2aWNlcy50eXBlcygpLCBkZXZpY2UpOwogCiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCpvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUsCkBAIC00OTMsNiArNTUzLDE3IEBACiB2b2lkIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjbG9zZSgpCiB7CiAgICAgaWYgKG1Jb0hhbmRsZSAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAvLyBjbGVhbiB1cCBhY3RpdmUgY2xpZW50cyBpZiBhbnkgKGNhbiBoYXBwZW4gaWYgY2xvc2UoKSBpcyBjYWxsZWQgdG8gZm9yY2UKKyAgICAgICAgLy8gY2xpZW50cyB0byByZWNvbm5lY3QKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBnZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgICAgICBpZiAoY2xpZW50LT5hY3RpdmUoKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBjbGllbnQgd2l0aCBwb3J0IElEICVkIHN0aWxsIGFjdGl2ZSBvbiBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjbGllbnQtPnBvcnRJZCgpLCBtSWQpOworICAgICAgICAgICAgICAgIHNldENsaWVudEFjdGl2ZShjbGllbnQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBzdG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKICAgICAgICAgcGFyYW0uYWRkKFN0cmluZzgoImNsb3NpbmciKSwgU3RyaW5nOCgidHJ1ZSIpKTsKICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtSW9IYW5kbGUsIHBhcmFtLnRvU3RyaW5nKCkpOwpAQCAtNTAxLDExICs1NzIsNiBAQAogCiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVByb2ZpbGUtPmN1ck9wZW5Db3VudCA8IDEsICIlcyBwcm9maWxlIG9wZW4gY291bnQgJXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb2ZpbGUtPmN1ck9wZW5Db3VudCk7Ci0gICAgICAgIC8vIGRvIG5vdCBjYWxsIHN0b3AoKSBoZXJlIGFzIHN0b3AoKSBpcyBzdXBwb3NlZCB0byBiZSBjYWxsZWQgYWZ0ZXIgY2hhbmdlUmVmQ291bnQoLTEpCi0gICAgICAgIC8vIGFuZCB3ZSBkb24ndCBrbm93IGhvdyBtYW55IHN0cmVhbXMgYXJlIHN0aWxsIGFjdGl2ZSBhdCB0aGlzIHRpbWUKLSAgICAgICAgaWYgKGlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgIG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudC0tOwotICAgICAgICB9CiAgICAgICAgIG1Qcm9maWxlLT5jdXJPcGVuQ291bnQtLTsKICAgICAgICAgbUlvSGFuZGxlID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgfQpAQCAtNTM2LDU1ICs2MDIsNDIgQEAKIH0KIAogLy8gSHdBdWRpb091dHB1dERlc2NyaXB0b3IgaW1wbGVtZW50YXRpb24KLUh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+JiBzb3VyY2UsCitId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6SHdBdWRpb091dHB1dERlc2NyaXB0b3IoY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQotICAgIDogQXVkaW9PdXRwdXREZXNjcmlwdG9yKHNvdXJjZS0+bURldmljZSwgY2xpZW50SW50ZXJmYWNlKSwKKyAgICA6IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihzb3VyY2UtPnNyY0RldmljZSgpLCBjbGllbnRJbnRlcmZhY2UpLAogICAgICAgbVNvdXJjZShzb3VyY2UpCiB7CiB9CiAKLXN0YXR1c190IEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKK3ZvaWQgSHdBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKGZkKTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlNvdXJjZTpcbiIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICBtU291cmNlLT5kdW1wKGZkKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotYXVkaW9fZGV2aWNlc190IEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzdXBwb3J0ZWREZXZpY2VzKCkKLXsKLSAgICByZXR1cm4gbURldmljZTsKKyAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoZHN0KTsKKyAgICBkc3QtPmFwcGVuZCgiU291cmNlOlxuIik7CisgICAgbVNvdXJjZS0+ZHVtcChkc3QsIDAsIDApOwogfQogCiB2b2lkIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydENvbmZpZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZykgY29uc3QKIHsKLSAgICBtU291cmNlLT5tRGV2aWNlLT50b0F1ZGlvUG9ydENvbmZpZyhkc3RDb25maWcsIHNyY0NvbmZpZyk7CisgICAgbVNvdXJjZS0+c3JjRGV2aWNlKCktPnRvQXVkaW9Qb3J0Q29uZmlnKGRzdENvbmZpZywgc3JjQ29uZmlnKTsKIH0KIAogdm9pZCBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0CiB7Ci0gICAgbVNvdXJjZS0+bURldmljZS0+dG9BdWRpb1BvcnQocG9ydCk7CisgICAgbVNvdXJjZS0+c3JjRGV2aWNlKCktPnRvQXVkaW9Qb3J0KHBvcnQpOwogfQogCiAKLWJvb2wgSHdBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZShmbG9hdCB2b2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCitib29sIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUoZmxvYXQgdm9sdW1lRGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwgY29uc3QgU3RyZWFtVHlwZVZlY3RvciAmc3RyZWFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKIHsKLSAgICBib29sIGNoYW5nZWQgPSBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZSh2b2x1bWUsIHN0cmVhbSwgZGV2aWNlLCBkZWxheU1zLCBmb3JjZSk7CisgICAgYm9vbCBjaGFuZ2VkID0KKyAgICAgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRWb2x1bWUodm9sdW1lRGIsIHZvbHVtZVNvdXJjZSwgc3RyZWFtcywgZGV2aWNlLCBkZWxheU1zLCBmb3JjZSk7CiAKICAgICBpZiAoY2hhbmdlZCkgewogICAgICAgLy8gVE9ETzogdXNlIGdhaW4gY29udHJvbGxlciBvbiBzb3VyY2UgZGV2aWNlIGlmIGFueSB0byBhZGp1c3Qgdm9sdW1lCkBAIC01OTMsMzkgKzY0NiwzOCBAQAogfQogCiAvLyBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiBpbXBsZW1lbnRhdGlvbgotYm9vbCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAorYm9vbCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6aXNBY3RpdmUoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0CiB7CiAgICAgbnNlY3NfdCBzeXNUaW1lID0gc3lzdGVtVGltZSgpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGhpcy0+c2l6ZSgpOyBpKyspIHsKICAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSB0aGlzLT52YWx1ZUF0KGkpOwotICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNTdHJlYW1BY3RpdmUoc3RyZWFtLCBpblBhc3RNcywgc3lzVGltZSkpIHsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzQWN0aXZlKHZvbHVtZVNvdXJjZSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2wgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmlzU3RyZWFtQWN0aXZlTG9jYWxseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Citib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc0FjdGl2ZUxvY2FsbHkoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0CiB7CiAgICAgbnNlY3NfdCBzeXNUaW1lID0gc3lzdGVtVGltZSgpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGhpcy0+c2l6ZSgpOyBpKyspIHsKICAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSB0aGlzLT52YWx1ZUF0KGkpOwotICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNTdHJlYW1BY3RpdmUoc3RyZWFtLCBpblBhc3RNcywgc3lzVGltZSkKLSAgICAgICAgICAgICAgICAmJiAoKG91dHB1dERlc2MtPmRldmljZSgpICYgQVBNX0FVRElPX09VVF9ERVZJQ0VfUkVNT1RFX0FMTCkgPT0gMCkpIHsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzQWN0aXZlKHZvbHVtZVNvdXJjZSwgaW5QYXN0TXMsIHN5c1RpbWUpCisgICAgICAgICAgICAgICAgJiYgKChvdXRwdXREZXNjLT5kZXZpY2VzKCkudHlwZXMoKSAmIEFQTV9BVURJT19PVVRfREVWSUNFX1JFTU9URV9BTEwpID09IDApKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2wgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKK2Jvb2wgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmlzQWN0aXZlUmVtb3RlbHkoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0CiB7CiAgICAgbnNlY3NfdCBzeXNUaW1lID0gc3lzdGVtVGltZSgpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKICAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSB2YWx1ZUF0KGkpOwotICAgICAgICBpZiAoKChvdXRwdXREZXNjLT5kZXZpY2UoKSAmIEFQTV9BVURJT19PVVRfREVWSUNFX1JFTU9URV9BTEwpICE9IDApICYmCi0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+aXNTdHJlYW1BY3RpdmUoc3RyZWFtLCBpblBhc3RNcywgc3lzVGltZSkpIHsKKyAgICAgICAgaWYgKCgob3V0cHV0RGVzYy0+ZGV2aWNlcygpLnR5cGVzKCkgJiBBUE1fQVVESU9fT1VUX0RFVklDRV9SRU1PVEVfQUxMKSAhPSAwKSAmJgorICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmlzQWN0aXZlKHZvbHVtZVNvdXJjZSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CiAgICAgICAgICAgICAvLyBkbyBub3QgY29uc2lkZXIgcmUgcm91dGluZyAod2hlbiB0aGUgb3V0cHV0IGlzIGdvaW5nIHRvIGEgZHluYW1pYyBwb2xpY3kpCiAgICAgICAgICAgICAvLyBhcyAicmVtb3RlIHBsYXliYWNrIgogICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPm1Qb2xpY3lNaXggPT0gTlVMTCkgewpAQCAtNjM2LDExICs2ODgsMjggQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK2Jvb2wgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmlzU3RyYXRlZ3lBY3RpdmVPblNhbWVNb2R1bGUocHJvZHVjdF9zdHJhdGVneV90IHBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zLCBuc2Vjc190IHN5c1RpbWUpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3RoZXJEZXNjID0gdmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGRlc2MtPnNoYXJlc0h3TW9kdWxlV2l0aChvdGhlckRlc2MpICYmCisgICAgICAgICAgICAgICAgb3RoZXJEZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKHBzLCBpblBhc3RNcywgc3lzVGltZSkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwogYXVkaW9faW9faGFuZGxlX3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmdldEEyZHBPdXRwdXQoKSBjb25zdAogewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSB2YWx1ZUF0KGkpOwotICAgICAgICBpZiAoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpICYmIG91dHB1dERlc2MtPmRldmljZSgpICYgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCkgeworICAgICAgICBpZiAoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpICYmCisgICAgICAgICAgICAgb3V0cHV0RGVzYy0+ZGV2aWNlcygpLnR5cGVzKCkgICYgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCAmJgorICAgICAgICAgICAgIG91dHB1dERlc2MtPmRldmljZVN1cHBvcnRzRW5jb2RlZEZvcm1hdHMoCisgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQKSkgewogICAgICAgICAgICAgcmV0dXJuIHRoaXMtPmtleUF0KGkpOwogICAgICAgICB9CiAgICAgfQpAQCAtNjUyLDEyICs3MjEsMTEgQEAKICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gcHJpbWFyeU91dHB1dCA9IGdldFByaW1hcnlPdXRwdXQoKTsKIAogICAgIGlmICgocHJpbWFyeU91dHB1dCAhPSBOVUxMKSAmJiAocHJpbWFyeU91dHB1dC0+bVByb2ZpbGUgIT0gTlVMTCkKLSAgICAgICAgJiYgKHByaW1hcnlPdXRwdXQtPm1Qcm9maWxlLT5tTW9kdWxlICE9IE5VTEwpKSB7Ci0gICAgICAgIHNwPEh3TW9kdWxlPiBwcmltYXJ5SHdNb2R1bGUgPSBwcmltYXJ5T3V0cHV0LT5tUHJvZmlsZS0+bU1vZHVsZTsKLSAgICAgICAgVmVjdG9yIDxzcDxJT1Byb2ZpbGU+PiBwcmltYXJ5SHdNb2R1bGVPdXRwdXRQcm9maWxlcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlId01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwcmltYXJ5SHdNb2R1bGVPdXRwdXRQcm9maWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKHByaW1hcnlId01vZHVsZU91dHB1dFByb2ZpbGVzW2ldLT5zdXBwb3J0RGV2aWNlKEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApKSB7CisgICAgICAgICYmIChwcmltYXJ5T3V0cHV0LT5tUHJvZmlsZS0+Z2V0TW9kdWxlKCkgIT0gTlVMTCkpIHsKKyAgICAgICAgc3A8SHdNb2R1bGU+IHByaW1hcnlId01vZHVsZSA9IHByaW1hcnlPdXRwdXQtPm1Qcm9maWxlLT5nZXRNb2R1bGUoKTsKKworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJm91dHB1dFByb2ZpbGUgOiBwcmltYXJ5SHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkpIHsKKyAgICAgICAgICAgIGlmIChvdXRwdXRQcm9maWxlLT5zdXBwb3J0c0RldmljZVR5cGVzKEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTY4Myw5OSArNzUxLDY4IEBACiAKIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6Z2V0T3V0cHV0RnJvbUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgaWQpIGNvbnN0CiB7Ci0gICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBOVUxMOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgb3V0cHV0RGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKICAgICAgICAgaWYgKG91dHB1dERlc2MtPmdldElkKCkgPT0gaWQpIHsKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIG91dHB1dERlc2M7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIG91dHB1dERlc2M7CisgICAgcmV0dXJuIE5VTEw7CiB9CiAKLWJvb2wgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmlzQW55T3V0cHV0QWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVG9JZ25vcmUpIGNvbnN0CitzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmdldE91dHB1dEZvckNsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICBmb3IgKHNpemVfdCBzID0gMCA7IHMgPCBBVURJT19TVFJFQU1fQ05UIDsgcysrKSB7Ci0gICAgICAgIGlmIChzID09IChzaXplX3QpIHN0cmVhbVRvSWdub3JlKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmdldENsaWVudChwb3J0SWQpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBvdXRwdXREZXNjOwogICAgICAgICB9Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKLSAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc10gIT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6Y2xlYXJTZXNzaW9uUm91dGVzRm9yRGV2aWNlKAorICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGlzY29ubmVjdGVkRGV2aWNlKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBvdXRwdXREZXNjLT5nZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgICAgICBpZiAoY2xpZW50LT5wcmVmZXJyZWREZXZpY2VJZCgpID09IGRpc2Nvbm5lY3RlZERldmljZS0+Z2V0SWQoKSkgeworICAgICAgICAgICAgICAgIGNsaWVudC0+c2V0UHJlZmVycmVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwogfQogCi1hdWRpb19kZXZpY2VzX3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmdldFN1cHBvcnRlZERldmljZXMoYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlKSBjb25zdAordm9pZCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7Ci0gICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSB2YWx1ZUZvcihoYW5kbGUpOwotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gb3V0cHV0RGVzYy0+bVByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXNUeXBlKCk7Ci0gICAgcmV0dXJuIGRldmljZXM7Ci19Ci0KLQotc3RhdHVzX3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5PdXRwdXRzIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZHN0LT5hcHBlbmQoIlxuT3V0cHV0cyBkdW1wOlxuIik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIE91dHB1dCAlZCBkdW1wOlxuIiwga2V5QXQoaSkpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZmQpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiLSBPdXRwdXQgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QpOwogICAgIH0KLQotICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogLy8gSHdBdWRpb091dHB1dENvbGxlY3Rpb24gaW1wbGVtZW50YXRpb24KLWJvb2wgSHdBdWRpb091dHB1dENvbGxlY3Rpb246OmlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKK2Jvb2wgSHdBdWRpb091dHB1dENvbGxlY3Rpb246OmlzQWN0aXZlKFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAogewogICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRoaXMtPnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdGhpcy0+dmFsdWVBdChpKTsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKHN0cmVhbSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0FjdGl2ZSh2b2x1bWVTb3VyY2UsIGluUGFzdE1zLCBzeXNUaW1lKSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIEh3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc0FueU91dHB1dEFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVRvSWdub3JlKSBjb25zdAordm9pZCBId0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7Ci0gICAgZm9yIChzaXplX3QgcyA9IDAgOyBzIDwgQVVESU9fU1RSRUFNX0NOVCA7IHMrKykgewotICAgICAgICBpZiAocyA9PSAoc2l6ZV90KSBzdHJlYW1Ub0lnbm9yZSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgY29uc3Qgc3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSB2YWx1ZUF0KGkpOwotICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzXSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0dXNfdCBId0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpIGNvbnN0Ci17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbk91dHB1dHMgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBkc3QtPmFwcGVuZCgiXG5PdXRwdXRzIGR1bXA6XG4iKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gT3V0cHV0ICVkIGR1bXA6XG4iLCBrZXlBdChpKSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCItIE91dHB1dCAlZCBkdW1wOlxuIiwga2V5QXQoaSkpOworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCk7CiAgICAgfQotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiB9OyAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BhdGNoLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUGF0Y2guY3BwCmluZGV4IGE5ZmU0OGQuLjNhNGRiOTAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUGF0Y2guY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUGF0Y2guY3BwCkBAIC0zNCw1MyArMzQsMjcgQEAKIHsKIH0KIAotc3RhdHVzX3QgQXVkaW9QYXRjaDo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3N0YXRpYyB2b2lkIGR1bXBQYXRjaEVuZHBvaW50cygKKyAgICAgICAgU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBjb25zdCBjaGFyICpwcmVmaXgsIGludCBjb3VudCwgY29uc3QgYXVkaW9fcG9ydF9jb25maWcgKmNmZ3MpCiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNBdWRpbyBwYXRjaCAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGhhbmRsZTogJTJkXG4iLCBzcGFjZXMsICIiLCBtSGFuZGxlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBhdWRpbyBmbGluZ2VyIGhhbmRsZTogJTJkXG4iLCBzcGFjZXMsICIiLCBtQWZQYXRjaEhhbmRsZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gb3duZXIgdWlkOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1VaWQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtICVkIHNvdXJjZXM6XG4iLCBzcGFjZXMsICIiLCBtUGF0Y2gubnVtX3NvdXJjZXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QYXRjaC5udW1fc291cmNlczsgaSsrKSB7Ci0gICAgICAgIGlmIChtUGF0Y2guc291cmNlc1tpXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRldmljZTsKLSAgICAgICAgICAgIGRldmljZVRvU3RyaW5nKG1QYXRjaC5zb3VyY2VzW2ldLmV4dC5kZXZpY2UudHlwZSwgZGV2aWNlKTsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gRGV2aWNlIElEICVkICVzXG4iLCBzcGFjZXMgKyAyLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zb3VyY2VzW2ldLmlkLAotICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLmNfc3RyKCkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICBjb25zdCBhdWRpb19wb3J0X2NvbmZpZyAmY2ZnID0gY2Znc1tpXTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyAgWyVzICVkXSAiLCBzcGFjZXMsICIiLCBwcmVmaXgsIGkgKyAxKTsKKyAgICAgICAgaWYgKGNmZy50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJEZXZpY2UgSUQgJWQgJXMiLCBjZmcuaWQsIHRvU3RyaW5nKGNmZy5leHQuZGV2aWNlLnR5cGUpLmNfc3RyKCkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBNaXggSUQgJWQgSS9PIGhhbmRsZSAlZFxuIiwgc3BhY2VzICsgMiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc291cmNlc1tpXS5pZCwgbVBhdGNoLnNvdXJjZXNbaV0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIk1peCBJRCAlZCBJL08gaGFuZGxlICVkIiwgY2ZnLmlkLCBjZmcuZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmQoIlxuIik7CiAgICAgfQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gJWQgc2lua3M6XG4iLCBzcGFjZXMsICIiLCBtUGF0Y2gubnVtX3NpbmtzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGF0Y2gubnVtX3NpbmtzOyBpKyspIHsKLSAgICAgICAgaWYgKG1QYXRjaC5zaW5rc1tpXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRldmljZTsKLSAgICAgICAgICAgIGRldmljZVRvU3RyaW5nKG1QYXRjaC5zaW5rc1tpXS5leHQuZGV2aWNlLnR5cGUsIGRldmljZSk7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIERldmljZSBJRCAlZCAlc1xuIiwgc3BhY2VzICsgMiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc2lua3NbaV0uaWQsCi0gICAgICAgICAgICAgICAgICAgICBkZXZpY2UuY19zdHIoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIE1peCBJRCAlZCBJL08gaGFuZGxlICVkXG4iLCBzcGFjZXMgKyAyLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zaW5rc1tpXS5pZCwgbVBhdGNoLnNpbmtzW2ldLmV4dC5taXguaGFuZGxlKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQorfQogCi0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwordm9pZCBBdWRpb1BhdGNoOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNQYXRjaCAlZDogb3duZXIgdWlkICU0ZCwgaGFuZGxlICUyZCwgYWYgaGFuZGxlICUyZFxuIiwKKyAgICAgICAgICAgIHNwYWNlcywgIiIsIGluZGV4ICsgMSwgbVVpZCwgbUhhbmRsZSwgbUFmUGF0Y2hIYW5kbGUpOworICAgIGR1bXBQYXRjaEVuZHBvaW50cyhkc3QsIHNwYWNlcywgInNyYyAiLCBtUGF0Y2gubnVtX3NvdXJjZXMsIG1QYXRjaC5zb3VyY2VzKTsKKyAgICBkdW1wUGF0Y2hFbmRwb2ludHMoZHN0LCBzcGFjZXMsICJzaW5rIiwgbVBhdGNoLm51bV9zaW5rcywgbVBhdGNoLnNpbmtzKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9QYXRjaENvbGxlY3Rpb246OmFkZEF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLApAQCAtMTYxLDE2ICsxMzUsMTIgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUGF0Y2hDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKK3ZvaWQgQXVkaW9QYXRjaENvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuQXVkaW8gUGF0Y2hlczpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBkc3QtPmFwcGVuZCgiXG5BdWRpbyBQYXRjaGVzOlxuIik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkLCAyLCBpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QsIDIsIGkpOwogICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9saWN5TWl4LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9saWN5TWl4LmNwcAppbmRleCAzMjdkYzRkLi5kY2E4NGMwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvbGljeU1peC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb2xpY3lNaXguY3BwCkBAIC0yNyw5NSArMjcsNjcgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1BdWRpb1BvbGljeU1peDo6QXVkaW9Qb2xpY3lNaXgoY29uc3QgQXVkaW9NaXggJm1peCkgOiBBdWRpb01peChtaXgpCit2b2lkIEF1ZGlvUG9saWN5TWl4OjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAogewotfQotCi12b2lkIEF1ZGlvUG9saWN5TWl4OjpzZXRPdXRwdXQoc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+ICZvdXRwdXQpCi17Ci0gICAgbU91dHB1dCA9IG91dHB1dDsKLX0KLQotY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+ICZBdWRpb1BvbGljeU1peDo6Z2V0T3V0cHV0KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbU91dHB1dDsKLX0KLQotdm9pZCBBdWRpb1BvbGljeU1peDo6Y2xlYXJPdXRwdXQoKQotewotICAgIG1PdXRwdXQuY2xlYXIoKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNaXg6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNBdWRpbyBQb2xpY3kgTWl4ICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNBdWRpbyBQb2xpY3kgTWl4ICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXggKyAxKTsKICAgICBzdGQ6OnN0cmluZyBtaXhUeXBlTGl0ZXJhbDsKICAgICBpZiAoIU1peFR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKG1NaXhUeXBlLCBtaXhUeXBlTGl0ZXJhbCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gY29udmVydCBtaXggdHlwZSAlZCIsIF9fRlVOQ1RJT05fXywgbU1peFR5cGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CiAgICAgfQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbWl4IHR5cGU6ICVzXG4iLCBzcGFjZXMsICIiLCBtaXhUeXBlTGl0ZXJhbC5jX3N0cigpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gbWl4IHR5cGU6ICVzXG4iLCBzcGFjZXMsICIiLCBtaXhUeXBlTGl0ZXJhbC5jX3N0cigpKTsKKwogICAgIHN0ZDo6c3RyaW5nIHJvdXRlRmxhZ0xpdGVyYWw7CiAgICAgUm91dGVGbGFnVHlwZUNvbnZlcnRlcjo6bWFza1RvU3RyaW5nKG1Sb3V0ZUZsYWdzLCByb3V0ZUZsYWdMaXRlcmFsKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIFJvdXRlIEZsYWdzOiAlc1xuIiwgc3BhY2VzLCAiIiwgcm91dGVGbGFnTGl0ZXJhbC5jX3N0cigpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc3RkOjpzdHJpbmcgZGV2aWNlTGl0ZXJhbDsKLSAgICBkZXZpY2VUb1N0cmluZyhtRGV2aWNlVHlwZSwgZGV2aWNlTGl0ZXJhbCk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBkZXZpY2UgdHlwZTogJXNcbiIsIHNwYWNlcywgIiIsIGRldmljZUxpdGVyYWwuY19zdHIoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZGV2aWNlIGFkZHJlc3M6ICVzXG4iLCBzcGFjZXMsICIiLCBtRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFJvdXRlIEZsYWdzOiAlc1xuIiwgc3BhY2VzLCAiIiwgcm91dGVGbGFnTGl0ZXJhbC5jX3N0cigpKTsKKworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIGRldmljZSB0eXBlOiAlc1xuIiwgc3BhY2VzLCAiIiwgdG9TdHJpbmcobURldmljZVR5cGUpLmNfc3RyKCkpOworCisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gZGV2aWNlIGFkZHJlc3M6ICVzXG4iLCBzcGFjZXMsICIiLCBtRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSk7CiAKICAgICBpbnQgaW5kZXhDcml0ZXJpb24gPSAwOwogICAgIGZvciAoY29uc3QgYXV0byAmY3JpdGVyaW9uIDogbUNyaXRlcmlhKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gQ3JpdGVyaW9uICVkOlxuIiwgc3BhY2VzICsgMiwgIiIsIGluZGV4Q3JpdGVyaW9uKyspOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHVzYWdlTGl0ZXJhbDsKLSAgICAgICAgaWYgKCFVc2FnZVR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKGNyaXRlcmlvbi5tVmFsdWUubVVzYWdlLCB1c2FnZUxpdGVyYWwpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBjb252ZXJ0IHVzYWdlICVkIiwgX19GVU5DVElPTl9fLCBjcml0ZXJpb24ubVZhbHVlLm1Vc2FnZSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBDcml0ZXJpb24gJWQ6ICIsIHNwYWNlcyArIDIsICIiLCBpbmRleENyaXRlcmlvbisrKTsKKworICAgICAgICBzdGQ6OnN0cmluZyBydWxlVHlwZSwgcnVsZVZhbHVlOworICAgICAgICBib29sIHVua25vd25SdWxlID0gIVJ1bGVUeXBlQ29udmVydGVyOjp0b1N0cmluZyhjcml0ZXJpb24ubVJ1bGUsIHJ1bGVUeXBlKTsKKyAgICAgICAgc3dpdGNoIChjcml0ZXJpb24ubVJ1bGUgJiB+UlVMRV9FWENMVVNJT05fTUFTSykgeyAvLyBubyBuZWVkIHRvIG1hdGNoIFJVTEVfRVhDTFVERV8uLi4KKyAgICAgICAgY2FzZSBSVUxFX01BVENIX0FUVFJJQlVURV9VU0FHRToKKyAgICAgICAgICAgIFVzYWdlVHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcoY3JpdGVyaW9uLm1WYWx1ZS5tVXNhZ2UsIHJ1bGVWYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSVUxFX01BVENIX0FUVFJJQlVURV9DQVBUVVJFX1BSRVNFVDoKKyAgICAgICAgICAgIFNvdXJjZVR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKGNyaXRlcmlvbi5tVmFsdWUubVNvdXJjZSwgcnVsZVZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJVTEVfTUFUQ0hfVUlEOgorICAgICAgICAgICAgcnVsZVZhbHVlID0gc3RkOjp0b19zdHJpbmcoY3JpdGVyaW9uLm1WYWx1ZS5tVWlkKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgdW5rbm93blJ1bGUgPSB0cnVlOwogICAgICAgICB9Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gVXNhZ2U6JXNcbiIsIHNwYWNlcyArIDQsICIiLCB1c2FnZUxpdGVyYWwuY19zdHIoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgaWYgKG1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUykgewotICAgICAgICAgICAgc3RkOjpzdHJpbmcgc291cmNlTGl0ZXJhbDsKLSAgICAgICAgICAgIGlmICghU291cmNlVHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcoY3JpdGVyaW9uLm1WYWx1ZS5tU291cmNlLCBzb3VyY2VMaXRlcmFsKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGNvbnZlcnQgc291cmNlICVkIiwgX19GVU5DVElPTl9fLCBjcml0ZXJpb24ubVZhbHVlLm1Tb3VyY2UpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIFNvdXJjZTolc1xuIiwgc3BhY2VzICsgNCwgIiIsIHNvdXJjZUxpdGVyYWwuY19zdHIoKSk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisKKyAgICAgICAgaWYgKCF1bmtub3duUnVsZSkgeworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiVzICVzXG4iLCBydWxlVHlwZS5jX3N0cigpLCBydWxlVmFsdWUuY19zdHIoKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiVW5rbm93biBydWxlIHR5cGUgdmFsdWUgMHgleFxuIiwgY3JpdGVyaW9uLm1SdWxlKTsKICAgICAgICAgfQotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIFVpZDolZFxuIiwgc3BhY2VzICsgNCwgIiIsIGNyaXRlcmlvbi5tVmFsdWUubVVpZCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgc3RkOjpzdHJpbmcgcnVsZUxpdGVyYWw7Ci0gICAgICAgIGlmICghUnVsZVR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKGNyaXRlcmlvbi5tUnVsZSwgcnVsZUxpdGVyYWwpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBjb252ZXJ0IHNvdXJjZSAlZCIsIF9fRlVOQ1RJT05fXyxjcml0ZXJpb24ubVJ1bGUpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIFJ1bGU6JXNcbiIsIHNwYWNlcyArIDQsICIiLCBydWxlTGl0ZXJhbC5jX3N0cigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIH0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6cmVnaXN0ZXJNaXgoY29uc3QgU3RyaW5nOCYgYWRkcmVzcywgQXVkaW9NaXggbWl4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYykKK3N0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6cmVnaXN0ZXJNaXgoQXVkaW9NaXggbWl4LCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYykKIHsKLSAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShhZGRyZXNzKTsKLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICBBTE9HRSgicmVnaXN0ZXJQb2xpY3lNaXhlcygpOiBtaXggZm9yIGFkZHJlc3MgJXMgYWxyZWFkeSByZWdpc3RlcmVkIiwgYWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBzcDxBdWRpb1BvbGljeU1peD4mIHJlZ2lzdGVyZWRNaXggPSBpdGVtQXQoaSk7CisgICAgICAgIGlmIChtaXgubURldmljZVR5cGUgPT0gcmVnaXN0ZXJlZE1peC0+bURldmljZVR5cGUKKyAgICAgICAgICAgICAgICAmJiBtaXgubURldmljZUFkZHJlc3MuY29tcGFyZShyZWdpc3RlcmVkTWl4LT5tRGV2aWNlQWRkcmVzcykgPT0gMCkgeworICAgICAgICAgICAgQUxPR0UoInJlZ2lzdGVyTWl4KCk6IG1peCBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIGRldj0weCV4IGFkZHI9JXMiLAorICAgICAgICAgICAgICAgICAgICBtaXgubURldmljZVR5cGUsIG1peC5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CiAgICAgfQogICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSBuZXcgQXVkaW9Qb2xpY3lNaXgobWl4KTsKLSAgICBhZGQoYWRkcmVzcywgcG9saWN5TWl4KTsKKyAgICBhZGQocG9saWN5TWl4KTsKKyAgICBBTE9HRCgicmVnaXN0ZXJNaXgoKTogYWRkaW5nIG1peCBmb3IgZGV2PTB4JXggYWRkcj0lcyIsCisgICAgICAgICAgICBwb2xpY3lNaXgtPm1EZXZpY2VUeXBlLCBwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLnN0cmluZygpKTsKIAogICAgIGlmIChkZXNjICE9IDApIHsKICAgICAgICAgZGVzYy0+bVBvbGljeU1peCA9IHBvbGljeU1peDsKQEAgLTEyNCwxNzEgKzk2LDI2OCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjp1bnJlZ2lzdGVyTWl4KGNvbnN0IFN0cmluZzgmIGFkZHJlc3MpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OnVucmVnaXN0ZXJNaXgoY29uc3QgQXVkaW9NaXgmIG1peCkKIHsKLSAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShhZGRyZXNzKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dFKCJ1bnJlZ2lzdGVyUG9saWN5TWl4ZXMoKTogbWl4IGZvciBhZGRyZXNzICVzIG5vdCByZWdpc3RlcmVkIiwgYWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBzcDxBdWRpb1BvbGljeU1peD4mIHJlZ2lzdGVyZWRNaXggPSBpdGVtQXQoaSk7CisgICAgICAgIGlmIChtaXgubURldmljZVR5cGUgPT0gcmVnaXN0ZXJlZE1peC0+bURldmljZVR5cGUKKyAgICAgICAgICAgICAgICAmJiBtaXgubURldmljZUFkZHJlc3MuY29tcGFyZShyZWdpc3RlcmVkTWl4LT5tRGV2aWNlQWRkcmVzcykgPT0gMCkgeworICAgICAgICAgICAgQUxPR0QoInVucmVnaXN0ZXJNaXgoKTogcmVtb3ZpbmcgbWl4IGZvciBkZXY9MHgleCBhZGRyPSVzIiwKKyAgICAgICAgICAgICAgICAgICAgbWl4Lm1EZXZpY2VUeXBlLCBtaXgubURldmljZUFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgcmVtb3ZlQXQoaSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KICAgICB9CiAKLSAgICByZW1vdmVJdGVtc0F0KGluZGV4KTsKLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgQUxPR0UoInVucmVnaXN0ZXJNaXgoKTogbWl4IG5vdCByZWdpc3RlcmVkIGZvciBkZXY9MHgleCBhZGRyPSVzIiwKKyAgICAgICAgICAgIG1peC5tRGV2aWNlVHlwZSwgbWl4Lm1EZXZpY2VBZGRyZXNzLnN0cmluZygpKTsKKyAgICByZXR1cm4gQkFEX1ZBTFVFOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmdldEF1ZGlvUG9saWN5TWl4KGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiAmcG9saWN5TWl4KSBjb25zdAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpnZXRBdWRpb1BvbGljeU1peChhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSwKKyAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywgc3A8QXVkaW9Qb2xpY3lNaXg+ICZwb2xpY3lNaXgpIGNvbnN0CiB7Ci0gICAgc3NpemVfdCBpbmRleCA9IGluZGV4T2ZLZXkoYWRkcmVzcyk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HRSgidW5yZWdpc3RlclBvbGljeU1peGVzKCk6IG1peCBmb3IgYWRkcmVzcyAlcyBub3QgcmVnaXN0ZXJlZCIsIGFkZHJlc3Muc3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgQUxPR1YoImdldEF1ZGlvUG9saWN5TWl4KCkgZm9yIGRldj0weCV4IGFkZHI9JXMiLCBkZXZpY2VUeXBlLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICBmb3IgKHNzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaXRlbUF0KGkpLT5tRGV2aWNlVHlwZSA9PSBkZXZpY2VUeXBlCisgICAgICAgICAgICAgICAgJiYgaXRlbUF0KGkpLT5tRGV2aWNlQWRkcmVzcy5jb21wYXJlKGFkZHJlc3MpID09IDApIHsKKyAgICAgICAgICAgIHBvbGljeU1peCA9IGl0ZW1BdChpKTsKKyAgICAgICAgICAgIEFMT0dWKCJnZXRBdWRpb1BvbGljeU1peDogZm91bmQgbWl4ICV6dSBtYXRjaCAoZGV2VHlwZT0weCV4IGFkZHI9JXMpIiwKKyAgICAgICAgICAgICAgICAgICAgaSwgZGV2aWNlVHlwZSwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KICAgICB9Ci0gICAgcG9saWN5TWl4ID0gdmFsdWVBdChpbmRleCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworCisgICAgQUxPR0UoImdldEF1ZGlvUG9saWN5TWl4KCk6IG1peCBub3QgcmVnaXN0ZXJlZCBmb3IgZGV2PTB4JXggYWRkcj0lcyIsCisgICAgICAgICAgICBkZXZpY2VUeXBlLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICByZXR1cm4gQkFEX1ZBTFVFOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Y2xvc2VPdXRwdXQoc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+ICZkZXNjKQogewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IHBvbGljeU1peCA9IHZhbHVlQXQoaSk7CisgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSBpdGVtQXQoaSk7CiAgICAgICAgIGlmIChwb2xpY3lNaXgtPmdldE91dHB1dCgpID09IGRlc2MpIHsKICAgICAgICAgICAgIHBvbGljeU1peC0+Y2xlYXJPdXRwdXQoKTsKICAgICAgICAgfQogICAgIH0KIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpnZXRPdXRwdXRGb3JBdHRyKGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLCB1aWRfdCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+ICZkZXNjKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpnZXRPdXRwdXRGb3JBdHRyKAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMsIHVpZF90IHVpZCwKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmcHJpbWFyeURlc2MsCisgICAgICAgIHN0ZDo6dmVjdG9yPHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4gKnNlY29uZGFyeURlc2NzKQogewogICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JBdHRyKCkgcXVlcnlpbmcgJXp1IG1peGVzOiIsIHNpemUoKSk7Ci0gICAgZGVzYyA9IDA7CisgICAgcHJpbWFyeURlc2MgPSAwOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IG1peCA9IHZhbHVlQXQoaSk7CisgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSBpdGVtQXQoaSk7CisgICAgICAgIGNvbnN0IGJvb2wgcHJpbWFyeU91dHB1dE1peCA9ICFpc19taXhfbG9vcGJhY2tfcmVuZGVyKHBvbGljeU1peC0+bVJvdXRlRmxhZ3MpOworICAgICAgICBpZiAoIXByaW1hcnlPdXRwdXRNaXggJiYgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfTU1BUF9OT0lSUSkpIHsKKyAgICAgICAgICAgIC8vIEFBdWRpbyBkb2VzIG5vdCBzdXBwb3J0IE1NQVBfTk9fSVJRIGxvb3BiYWNrIHJlbmRlciwgYW5kIHRoZXJlIGlzIG5vIHdheSB3aXRoCisgICAgICAgICAgICAvLyB0aGUgY3VycmVudCBNbWFwU3RyZWFtSW50ZXJmYWNlOjpzdGFydCB0byByZWplY3QgYSBzcGVjaWZpYyBjbGllbnQgYWRkZWQgdG8gYSBzaGFyZWQKKyAgICAgICAgICAgIC8vIG1tYXAgc3RyZWFtLgorICAgICAgICAgICAgLy8gQXMgYSByZXN1bHQgYWxsIE1NQVBfTk9JUlEgcmVxdWVzdHMgaGF2ZSB0byBiZSByZWplY3RlZCB3aGVuIGFuIGxvb3BiYWNrIHJlbmRlcgorICAgICAgICAgICAgLy8gcG9saWN5IGlzIHByZXNlbnQuIFRoYXQgZW5zdXJlcyBubyBzaGFyZWQgbW1hcCBzdHJlYW0gaXMgdXNlZCB3aGVuIGFuIGxvb3BiYWNrCisgICAgICAgICAgICAvLyByZW5kZXIgcG9saWN5IGlzIHJlZ2lzdGVyZWQuCisgICAgICAgICAgICBBTE9HRCgiJXM6IFJlamVjdGluZyBNTUFQX05PSVJRIHJlcXVlc3QgZHVlIHRvIExPT1BCQUNLfFJFTkRFUiBtaXggcHJlc2VudC4iLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KIAotICAgICAgICBpZiAobWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIGlmIGFkZGluZyBtb3JlIHBsYXllciBydWxlcyAoY3VycmVudGx5IG9ubHkgMiksIG1ha2UgcnVsZSBoYW5kbGluZyAiZ2VuZXJpYyIKLSAgICAgICAgICAgIC8vICAgICAgYXMgdGhlcmUgaXMgbm8gZGlmZmVyZW5jZSBpbiB0aGUgdHJlYXRtZW50IG9mIHVzYWdlLSBvciB1aWQtYmFzZWQgcnVsZXMKLSAgICAgICAgICAgIGJvb2wgaGFzVXNhZ2VNYXRjaFJ1bGVzID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sIGhhc1VzYWdlRXhjbHVkZVJ1bGVzID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sIHVzYWdlTWF0Y2hGb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbCB1c2FnZUV4Y2x1c2lvbkZvdW5kID0gZmFsc2U7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBwb2xpY3lEZXNjID0gcG9saWN5TWl4LT5nZXRPdXRwdXQoKTsKKyAgICAgICAgaWYgKCFwb2xpY3lEZXNjKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IFNraXBpbmcgJXp1OiBNaXggaGFzIG5vIG91dHB1dCIsIF9fZnVuY19fLCBpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CiAKLSAgICAgICAgICAgIGJvb2wgaGFzVWlkTWF0Y2hSdWxlcyA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbCBoYXNVaWRFeGNsdWRlUnVsZXMgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2wgdWlkTWF0Y2hGb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbCB1aWRFeGNsdXNpb25Gb3VuZCA9IGZhbHNlOworICAgICAgICBpZiAocHJpbWFyeU91dHB1dE1peCAmJiBwcmltYXJ5RGVzYyAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IFNraXBpbmcgJXp1OiBQcmltYXJ5IG91dHB1dCBhbHJlYWR5IGZvdW5kIiwgX19mdW5jX18sIGkpOworICAgICAgICAgICAgY29udGludWU7IC8vIFByaW1hcnkgb3V0cHV0IGFscmVhZHkgZm91bmQKKyAgICAgICAgfQogCi0gICAgICAgICAgICBib29sIGhhc0FkZHJNYXRjaCA9IGZhbHNlOworICAgICAgICBzd2l0Y2ggKG1peE1hdGNoKHBvbGljeU1peC5nZXQoKSwgaSwgYXR0cmlidXRlcywgdWlkKSkgeworICAgICAgICAgICAgY2FzZSBNaXhNYXRjaFN0YXR1czo6SU5WQUxJRF9NSVg6CisgICAgICAgICAgICAgICAgLy8gVGhlIG1peCBoYXMgY29udHJhZGljdG9yeSBydWxlcywgaWdub3JlIGl0CisgICAgICAgICAgICAgICAgLy8gVE9ETzogcmVqZWN0IGludmFsaWQgbWl4IGF0IHJlZ2lzdHJhdGlvbgorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgY2FzZSBNaXhNYXRjaFN0YXR1czo6Tk9fTUFUQ0g6CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBNaXggJXp1OiBkb2VzIG5vdCBtYXRjaCIsIF9fZnVuY19fLCBpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcCB0aGUgbWl4CisgICAgICAgICAgICBjYXNlIE1peE1hdGNoU3RhdHVzOjpNQVRDSDo7CisgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIGFsbCBtaXggY3JpdGVyaWEgdG8gbGlzdCB3aGF0IHJ1bGVzIHRoaXMgbWl4IGNvbnRhaW5zCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1peC0+bUNyaXRlcmlhLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiBnZXRPdXRwdXRGb3JBdHRyOiBtaXggJXp1OiBpbnNwZWN0aW5nIG1peCBjcml0ZXJpYSAlenUgb2YgJXp1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGksIGosIG1peC0+bUNyaXRlcmlhLnNpemUoKSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhbiBhZGRyZXNzIG1hdGNoLCBwcmlvcml0aXplIHRoYXQgbWF0Y2gKLSAgICAgICAgICAgICAgICBpZiAoc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MsICJhZGRyPSIsIHN0cmxlbigiYWRkcj0iKSkgPT0gMCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MgKyBzdHJsZW4oImFkZHI9IiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peC0+bURldmljZUFkZHJlc3Muc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0FUVFJJQlVURVNfVEFHU19NQVhfU0laRSAtIHN0cmxlbigiYWRkcj0iKSAtIDEpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaGFzQWRkck1hdGNoID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3dpdGNoIChtaXgtPm1Dcml0ZXJpYVtqXS5tUnVsZSkgewotICAgICAgICAgICAgICAgIGNhc2UgUlVMRV9NQVRDSF9BVFRSSUJVVEVfVVNBR0U6Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdG1peCBoYXMgUlVMRV9NQVRDSF9BVFRSSUJVVEVfVVNBR0UgZm9yIHVzYWdlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVXNhZ2UpOwotICAgICAgICAgICAgICAgICAgICBoYXNVc2FnZU1hdGNoUnVsZXMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAobWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1Vc2FnZSA9PSBhdHRyaWJ1dGVzLnVzYWdlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCBvbmUgbWF0Y2ggYWdhaW5zdCBhbGwgYWxsb3dlZCB1c2FnZXMKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlTWF0Y2hGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBSVUxFX0VYQ0xVREVfQVRUUklCVVRFX1VTQUdFOgotICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRtaXggaGFzIFJVTEVfRVhDTFVERV9BVFRSSUJVVEVfVVNBR0UgZm9yIHVzYWdlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgaGFzVXNhZ2VFeGNsdWRlUnVsZXMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAobWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1Vc2FnZSA9PSBhdHRyaWJ1dGVzLnVzYWdlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCB0aGlzIHVzYWdlIGlzIHRvIGJlIGV4Y2x1ZGVkCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2FnZUV4Y2x1c2lvbkZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFJVTEVfTUFUQ0hfVUlEOgotICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRtaXggaGFzIFJVTEVfTUFUQ0hfVUlEIGZvciB1aWQgJWQiLCBtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVpZCk7Ci0gICAgICAgICAgICAgICAgICAgIGhhc1VpZE1hdGNoUnVsZXMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAobWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1VaWQgPT0gdWlkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCBvbmUgVUlEIG1hdGNoIGFnYWluc3QgYWxsIGFsbG93ZWQgVUlEcwotICAgICAgICAgICAgICAgICAgICAgICAgdWlkTWF0Y2hGb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBSVUxFX0VYQ0xVREVfVUlEOgotICAgICAgICAgICAgICAgICAgICBBTE9HVigiXHRtaXggaGFzIFJVTEVfRVhDTFVERV9VSUQgZm9yIHVpZCAlZCIsIG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVWlkKTsKLSAgICAgICAgICAgICAgICAgICAgaGFzVWlkRXhjbHVkZVJ1bGVzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVWlkID09IHVpZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgdGhpcyBVSUQgaXMgdG8gYmUgZXhjbHVkZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpZEV4Y2x1c2lvbkZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBjb25zaXN0ZW5jeSBjaGVja3M6IGZvciBlYWNoICJkaW1lbnNpb24iIG9mIHJ1bGVzICh1c2FnZSwgdWlkLi4uKSwgd2UgY2FuCi0gICAgICAgICAgICAgICAgLy8gb25seSBoYXZlIE1BVENIIHJ1bGVzLCBvciBFWENMVURFIHJ1bGVzIGluIGVhY2ggZGltZW5zaW9uLCBub3QgYSBjb21iaW5hdGlvbgotICAgICAgICAgICAgICAgIGlmIChoYXNVc2FnZU1hdGNoUnVsZXMgJiYgaGFzVXNhZ2VFeGNsdWRlUnVsZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImdldE91dHB1dEZvckF0dHI6IGludmFsaWQgY29tYmluYXRpb24gb2YgUlVMRV9NQVRDSF9BVFRSSUJVVEVfVVNBR0UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBhbmQgUlVMRV9FWENMVURFX0FUVFJJQlVURV9VU0FHRSBpbiBtaXggJXp1IiwgaSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChoYXNVaWRNYXRjaFJ1bGVzICYmIGhhc1VpZEV4Y2x1ZGVSdWxlcykgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0cjogaW52YWxpZCBjb21iaW5hdGlvbiBvZiBSVUxFX01BVENIX1VJRCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGFuZCBSVUxFX0VYQ0xVREVfVUlEIGluIG1peCAlenUiLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoKGhhc1VzYWdlRXhjbHVkZVJ1bGVzICYmIHVzYWdlRXhjbHVzaW9uRm91bmQpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCAoaGFzVWlkRXhjbHVkZVJ1bGVzICYmIHVpZEV4Y2x1c2lvbkZvdW5kKSkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gc3RvcCBpdGVyYXRpbmcgb24gY3JpdGVyaWEgYmVjYXVzZSBhbiBleGNsdXNpb24gd2FzIGZvdW5kICh3aWxsIGZhaWwpCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ly9pdGVyYXRlIG9uIG1peCBjcml0ZXJpYQotCi0gICAgICAgICAgICAvLyBkZXRlcm1pbmUgaWYgZXhpdGluZyBvbiBzdWNjZXNzIChvciBpbXBsaWNpdCBmYWlsdXJlIGFzIGRlc2MgaXMgMCkKLSAgICAgICAgICAgIGlmIChoYXNBZGRyTWF0Y2ggfHwKLSAgICAgICAgICAgICAgICAgICAgISgoaGFzVXNhZ2VFeGNsdWRlUnVsZXMgJiYgdXNhZ2VFeGNsdXNpb25Gb3VuZCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAoaGFzVXNhZ2VNYXRjaFJ1bGVzICYmICF1c2FnZU1hdGNoRm91bmQpICB8fAotICAgICAgICAgICAgICAgICAgICAgIChoYXNVaWRFeGNsdWRlUnVsZXMgJiYgdWlkRXhjbHVzaW9uRm91bmQpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgKGhhc1VpZE1hdGNoUnVsZXMgJiYgIXVpZE1hdGNoRm91bmQpKSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJcdGdldE91dHB1dEZvckF0dHIgd2lsbCB1c2UgbWl4ICV6dSIsIGkpOwotICAgICAgICAgICAgICAgIGRlc2MgPSBtaXgtPmdldE91dHB1dCgpOworICAgICAgICBwb2xpY3lEZXNjLT5tUG9saWN5TWl4ID0gcG9saWN5TWl4OworICAgICAgICBpZiAocHJpbWFyeU91dHB1dE1peCkgeworICAgICAgICAgICAgcHJpbWFyeURlc2MgPSBwb2xpY3lEZXNjOworICAgICAgICAgICAgQUxPR1YoIiVzOiBNaXggJXp1OiBzZXQgcHJpbWFyeSBkZXNjIiwgX19mdW5jX18sIGkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHBvbGljeURlc2MtPm1Jb0hhbmRsZSA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlczogTWl4ICV6dSBpZ25vcmVkIGFzIHNlY29uZGFyeU91dHB1dCBiZWNhdXNlIG5vdCBvcGVuZWQgeWV0IiwgX19mdW5jX18sIGkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXM6IEFkZCBhIHNlY29uZGFyeSBkZXNjICV6dSIsIF9fZnVuY19fLCBpKTsKKyAgICAgICAgICAgICAgICBzZWNvbmRhcnlEZXNjcy0+cHVzaF9iYWNrKHBvbGljeURlc2MpOwogICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KIAotICAgICAgICB9IGVsc2UgaWYgKG1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cmlidXRlcy51c2FnZSA9PSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRSAmJgotICAgICAgICAgICAgICAgICAgICBzdHJuY21wKGF0dHJpYnV0ZXMudGFncywgImFkZHI9Iiwgc3RybGVuKCJhZGRyPSIpKSA9PSAwICYmCitBdWRpb1BvbGljeU1peENvbGxlY3Rpb246Ok1peE1hdGNoU3RhdHVzIEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6bWl4TWF0Y2goCisgICAgICAgIGNvbnN0IEF1ZGlvTWl4KiBtaXgsIHNpemVfdCBtaXhJbmRleCwgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzLCB1aWRfdCB1aWQpIHsKKworICAgIGlmIChtaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKKyAgICAgICAgLy8gTG9vcGJhY2sgcmVuZGVyIG1peGVzIGFyZSBjcmVhdGVkIGZyb20gYSBwdWJsaWMgQVBJIGFuZCB0aHVzIHJlc3RyaWN0ZWQKKyAgICAgICAgLy8gdG8gbm9uIHNlbnNpYmxlIGF1ZGlvIHRoYXQgaGF2ZSBub3Qgb3B0ZWQgb3V0LgorICAgICAgICBpZiAoaXNfbWl4X2xvb3BiYWNrX3JlbmRlcihtaXgtPm1Sb3V0ZUZsYWdzKSkgeworICAgICAgICAgICAgYXV0byBoYXNGbGFnID0gW10oYXV0byBmbGFncywgYXV0byBmbGFnKSB7IHJldHVybiAoZmxhZ3MgJiBmbGFnKSA9PSBmbGFnOyB9OworICAgICAgICAgICAgaWYgKGhhc0ZsYWcoYXR0cmlidXRlcy5mbGFncywgQVVESU9fRkxBR19OT19TWVNURU1fQ0FQVFVSRSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTWl4TWF0Y2hTdGF0dXM6Ok5PX01BVENIOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFtaXgtPm1BbGxvd1ByaXZpbGVnZWRQbGF5YmFja0NhcHR1cmUgJiYKKyAgICAgICAgICAgICAgICBoYXNGbGFnKGF0dHJpYnV0ZXMuZmxhZ3MsIEFVRElPX0ZMQUdfTk9fTUVESUFfUFJPSkVDVElPTikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTWl4TWF0Y2hTdGF0dXM6Ok5PX01BVENIOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCEoYXR0cmlidXRlcy51c2FnZSA9PSBBVURJT19VU0FHRV9VTktOT1dOIHx8CisgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnVzYWdlID09IEFVRElPX1VTQUdFX01FRElBIHx8CisgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzLnVzYWdlID09IEFVRElPX1VTQUdFX0dBTUUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1peE1hdGNoU3RhdHVzOjpOT19NQVRDSDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPIGlmIGFkZGluZyBtb3JlIHBsYXllciBydWxlcyAoY3VycmVudGx5IG9ubHkgMiksIG1ha2UgcnVsZSBoYW5kbGluZyAiZ2VuZXJpYyIKKyAgICAgICAgLy8gICAgICBhcyB0aGVyZSBpcyBubyBkaWZmZXJlbmNlIGluIHRoZSB0cmVhdG1lbnQgb2YgdXNhZ2UtIG9yIHVpZC1iYXNlZCBydWxlcworICAgICAgICBib29sIGhhc1VzYWdlTWF0Y2hSdWxlcyA9IGZhbHNlOworICAgICAgICBib29sIGhhc1VzYWdlRXhjbHVkZVJ1bGVzID0gZmFsc2U7CisgICAgICAgIGJvb2wgdXNhZ2VNYXRjaEZvdW5kID0gZmFsc2U7CisgICAgICAgIGJvb2wgdXNhZ2VFeGNsdXNpb25Gb3VuZCA9IGZhbHNlOworCisgICAgICAgIGJvb2wgaGFzVWlkTWF0Y2hSdWxlcyA9IGZhbHNlOworICAgICAgICBib29sIGhhc1VpZEV4Y2x1ZGVSdWxlcyA9IGZhbHNlOworICAgICAgICBib29sIHVpZE1hdGNoRm91bmQgPSBmYWxzZTsKKyAgICAgICAgYm9vbCB1aWRFeGNsdXNpb25Gb3VuZCA9IGZhbHNlOworCisgICAgICAgIGJvb2wgaGFzQWRkck1hdGNoID0gZmFsc2U7CisKKyAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIGFsbCBtaXggY3JpdGVyaWEgdG8gbGlzdCB3aGF0IHJ1bGVzIHRoaXMgbWl4IGNvbnRhaW5zCisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbWl4LT5tQ3JpdGVyaWEuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgIEFMT0dWKCIgZ2V0T3V0cHV0Rm9yQXR0cjogbWl4ICV6dTogaW5zcGVjdGluZyBtaXggY3JpdGVyaWEgJXp1IG9mICV6dSIsCisgICAgICAgICAgICAgICAgICAgIG1peEluZGV4LCBqLCBtaXgtPm1Dcml0ZXJpYS5zaXplKCkpOworCisgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhbiBhZGRyZXNzIG1hdGNoLCBwcmlvcml0aXplIHRoYXQgbWF0Y2gKKyAgICAgICAgICAgIGlmIChzdHJuY21wKGF0dHJpYnV0ZXMudGFncywgImFkZHI9Iiwgc3RybGVuKCJhZGRyPSIpKSA9PSAwICYmCiAgICAgICAgICAgICAgICAgICAgIHN0cm5jbXAoYXR0cmlidXRlcy50YWdzICsgc3RybGVuKCJhZGRyPSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peC0+bURldmljZUFkZHJlc3Muc3RyaW5nKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gc3RybGVuKCJhZGRyPSIpIC0gMSkgPT0gMCkgewotICAgICAgICAgICAgICAgIGRlc2MgPSBtaXgtPmdldE91dHB1dCgpOworICAgICAgICAgICAgICAgIGhhc0FkZHJNYXRjaCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN3aXRjaCAobWl4LT5tQ3JpdGVyaWFbal0ubVJ1bGUpIHsKKyAgICAgICAgICAgIGNhc2UgUlVMRV9NQVRDSF9BVFRSSUJVVEVfVVNBR0U6CisgICAgICAgICAgICAgICAgQUxPR1YoIlx0bWl4IGhhcyBSVUxFX01BVENIX0FUVFJJQlVURV9VU0FHRSBmb3IgdXNhZ2UgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVzYWdlKTsKKyAgICAgICAgICAgICAgICBoYXNVc2FnZU1hdGNoUnVsZXMgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVzYWdlID09IGF0dHJpYnV0ZXMudXNhZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgb25lIG1hdGNoIGFnYWluc3QgYWxsIGFsbG93ZWQgdXNhZ2VzCisgICAgICAgICAgICAgICAgICAgIHVzYWdlTWF0Y2hGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSVUxFX0VYQ0xVREVfQVRUUklCVVRFX1VTQUdFOgorICAgICAgICAgICAgICAgIEFMT0dWKCJcdG1peCBoYXMgUlVMRV9FWENMVURFX0FUVFJJQlVURV9VU0FHRSBmb3IgdXNhZ2UgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgbWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1Vc2FnZSk7CisgICAgICAgICAgICAgICAgaGFzVXNhZ2VFeGNsdWRlUnVsZXMgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVzYWdlID09IGF0dHJpYnV0ZXMudXNhZ2UpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgdGhpcyB1c2FnZSBpcyB0byBiZSBleGNsdWRlZAorICAgICAgICAgICAgICAgICAgICB1c2FnZUV4Y2x1c2lvbkZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJVTEVfTUFUQ0hfVUlEOgorICAgICAgICAgICAgICAgIEFMT0dWKCJcdG1peCBoYXMgUlVMRV9NQVRDSF9VSUQgZm9yIHVpZCAlZCIsIG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVWlkKTsKKyAgICAgICAgICAgICAgICBoYXNVaWRNYXRjaFJ1bGVzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBpZiAobWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1VaWQgPT0gdWlkKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIG9uZSBVSUQgbWF0Y2ggYWdhaW5zdCBhbGwgYWxsb3dlZCBVSURzCisgICAgICAgICAgICAgICAgICAgIHVpZE1hdGNoRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUlVMRV9FWENMVURFX1VJRDoKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRtaXggaGFzIFJVTEVfRVhDTFVERV9VSUQgZm9yIHVpZCAlZCIsIG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVWlkKTsKKyAgICAgICAgICAgICAgICBoYXNVaWRFeGNsdWRlUnVsZXMgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVpZCA9PSB1aWQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgdGhpcyBVSUQgaXMgdG8gYmUgZXhjbHVkZWQKKyAgICAgICAgICAgICAgICAgICAgdWlkRXhjbHVzaW9uRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNvbnNpc3RlbmN5IGNoZWNrczogZm9yIGVhY2ggImRpbWVuc2lvbiIgb2YgcnVsZXMgKHVzYWdlLCB1aWQuLi4pLCB3ZSBjYW4KKyAgICAgICAgICAgIC8vIG9ubHkgaGF2ZSBNQVRDSCBydWxlcywgb3IgRVhDTFVERSBydWxlcyBpbiBlYWNoIGRpbWVuc2lvbiwgbm90IGEgY29tYmluYXRpb24KKyAgICAgICAgICAgIGlmIChoYXNVc2FnZU1hdGNoUnVsZXMgJiYgaGFzVXNhZ2VFeGNsdWRlUnVsZXMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0cjogaW52YWxpZCBjb21iaW5hdGlvbiBvZiBSVUxFX01BVENIX0FUVFJJQlVURV9VU0FHRSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYW5kIFJVTEVfRVhDTFVERV9BVFRSSUJVVEVfVVNBR0UgaW4gbWl4ICV6dSIsIG1peEluZGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTWl4TWF0Y2hTdGF0dXM6OklOVkFMSURfTUlYOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGhhc1VpZE1hdGNoUnVsZXMgJiYgaGFzVWlkRXhjbHVkZVJ1bGVzKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImdldE91dHB1dEZvckF0dHI6IGludmFsaWQgY29tYmluYXRpb24gb2YgUlVMRV9NQVRDSF9VSUQiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGFuZCBSVUxFX0VYQ0xVREVfVUlEIGluIG1peCAlenUiLCBtaXhJbmRleCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE1peE1hdGNoU3RhdHVzOjpJTlZBTElEX01JWDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChoYXNVc2FnZUV4Y2x1ZGVSdWxlcyAmJiB1c2FnZUV4Y2x1c2lvbkZvdW5kKQorICAgICAgICAgICAgICAgICAgICB8fCAoaGFzVWlkRXhjbHVkZVJ1bGVzICYmIHVpZEV4Y2x1c2lvbkZvdW5kKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBzdG9wIGl0ZXJhdGluZyBvbiBjcml0ZXJpYSBiZWNhdXNlIGFuIGV4Y2x1c2lvbiB3YXMgZm91bmQgKHdpbGwgZmFpbCkKKyAgICAgICAgICAgIH0KKworICAgICAgICB9Ly9pdGVyYXRlIG9uIG1peCBjcml0ZXJpYQorCisgICAgICAgIC8vIGRldGVybWluZSBpZiBleGl0aW5nIG9uIHN1Y2Nlc3MgKG9yIGltcGxpY2l0IGZhaWx1cmUgYXMgZGVzYyBpcyAwKQorICAgICAgICBpZiAoaGFzQWRkck1hdGNoIHx8CisgICAgICAgICAgICAgICAgISgoaGFzVXNhZ2VFeGNsdWRlUnVsZXMgJiYgdXNhZ2VFeGNsdXNpb25Gb3VuZCkgfHwKKyAgICAgICAgICAgICAgICAgIChoYXNVc2FnZU1hdGNoUnVsZXMgJiYgIXVzYWdlTWF0Y2hGb3VuZCkgIHx8CisgICAgICAgICAgICAgICAgICAoaGFzVWlkRXhjbHVkZVJ1bGVzICYmIHVpZEV4Y2x1c2lvbkZvdW5kKSB8fAorICAgICAgICAgICAgICAgICAgKGhhc1VpZE1hdGNoUnVsZXMgJiYgIXVpZE1hdGNoRm91bmQpKSkgeworICAgICAgICAgICAgQUxPR1YoIlx0Z2V0T3V0cHV0Rm9yQXR0ciB3aWxsIHVzZSBtaXggJXp1IiwgbWl4SW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIE1peE1hdGNoU3RhdHVzOjpNQVRDSDsKICAgICAgICAgfQotICAgICAgICBpZiAoZGVzYyAhPSAwKSB7Ci0gICAgICAgICAgICBkZXNjLT5tUG9saWN5TWl4ID0gbWl4OwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworCisgICAgfSBlbHNlIGlmIChtaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUykgeworICAgICAgICBpZiAoYXR0cmlidXRlcy51c2FnZSA9PSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRSAmJgorICAgICAgICAgICAgICAgIHN0cm5jbXAoYXR0cmlidXRlcy50YWdzLCAiYWRkcj0iLCBzdHJsZW4oImFkZHI9IikpID09IDAgJiYKKyAgICAgICAgICAgICAgICBzdHJuY21wKGF0dHJpYnV0ZXMudGFncyArIHN0cmxlbigiYWRkcj0iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1peC0+bURldmljZUFkZHJlc3Muc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSBzdHJsZW4oImFkZHI9IikgLSAxKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gTWl4TWF0Y2hTdGF0dXM6Ok1BVENIOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgcmV0dXJuIE1peE1hdGNoU3RhdHVzOjpOT19NQVRDSDsKIH0KIAotYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Z2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoCi0gICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxEZXZpY2VzLAotICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gKnBvbGljeU1peCkKK3NwPERldmljZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Z2V0RGV2aWNlQW5kTWl4Rm9yT3V0cHV0KAorICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJm91dHB1dCwKKyAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVPdXRwdXREZXZpY2VzKQogewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgQXVkaW9Qb2xpY3lNaXggKm1peCA9IHZhbHVlQXQoaSkuZ2V0KCk7CisgICAgICAgIGlmIChpdGVtQXQoaSktPmdldE91dHB1dCgpID09IG91dHB1dCkgeworICAgICAgICAgICAgLy8gVGhpcyBEZXNjIGlzIGludm9sdmVkIGluIGEgTWl4LCB3aGljaCBoYXMgdGhlIGhpZ2hlc3QgcHJpbworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgPSBpdGVtQXQoaSktPm1EZXZpY2VUeXBlOworICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gaXRlbUF0KGkpLT5tRGV2aWNlQWRkcmVzczsKKyAgICAgICAgICAgIEFMT0dWKCIlczogZGV2aWNlICgweCV4LCBhZGRyPSVzKSBmb3JjZWQgYnkgbWl4IiwKKyAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlVHlwZSwgYWRkcmVzcy5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZShkZXZpY2VUeXBlLCBhZGRyZXNzLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CiAKK3NwPERldmljZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Z2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoCisgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmF2YWlsRGV2aWNlcywKKyAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+ICpwb2xpY3lNaXgpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBBdWRpb1BvbGljeU1peCAqbWl4ID0gaXRlbUF0KGkpLmdldCgpOwogICAgICAgICBpZiAobWl4LT5tTWl4VHlwZSAhPSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CkBAIC0yOTcsMTcgKzM2NiwyMiBAQAogICAgICAgICAgICAgICAgICAgICBtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVNvdXJjZSA9PSBpbnB1dFNvdXJjZSkgfHwKICAgICAgICAgICAgICAgIChSVUxFX0VYQ0xVREVfQVRUUklCVVRFX0NBUFRVUkVfUFJFU0VUID09IG1peC0+bUNyaXRlcmlhW2pdLm1SdWxlICYmCiAgICAgICAgICAgICAgICAgICAgIG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tU291cmNlICE9IGlucHV0U291cmNlKSkgewotICAgICAgICAgICAgICAgIGlmIChhdmFpbERldmljZXMgJiBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCkgewotICAgICAgICAgICAgICAgICAgICBpZiAocG9saWN5TWl4ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAvLyBhc3N1bWluZyBQb2xpY3lNaXggb25seSBmb3IgcmVtb3RlIHN1Ym1peCBmb3IgaW5wdXQKKyAgICAgICAgICAgICAgICAvLyBzbyBtaXgtPm1EZXZpY2VUeXBlIGNhbiBvbmx5IGJlIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWAorICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgICAgICAgICBhdXRvIG1peERldmljZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbERldmljZXMuZ2V0RGV2aWNlKGRldmljZSwgbWl4LT5tRGV2aWNlQWRkcmVzcywgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICAgICAgICAgIGlmIChtaXhEZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBpZiAocG9saWN5TWl4ICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICpwb2xpY3lNaXggPSBtaXg7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWl4RGV2aWNlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7CisgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Z2V0SW5wdXRNaXhGb3JBdHRyKApAQCAtMzE5LDE5ICszOTMsMjggQEAKICAgICBTdHJpbmc4IGFkZHJlc3MoYXR0ci50YWdzICsgc3RybGVuKCJhZGRyPSIpKTsKIAogI2lmZGVmIExPR19OREVCVUcKLSAgICBBTE9HVigiZ2V0SW5wdXRNaXhGb3JBdHRyIGxvb2tpbmcgZm9yIGFkZHJlc3MgJXNcbiAgbWl4ZXMgYXZhaWxhYmxlOiIsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgIEFMT0dWKCJnZXRJbnB1dE1peEZvckF0dHIgbG9va2luZyBmb3IgYWRkcmVzcyAlcyBmb3Igc291cmNlICVkXG4gIG1peGVzIGF2YWlsYWJsZToiLAorICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSwgYXR0ci5zb3VyY2UpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBtaXggPSB2YWx1ZUF0KGkpOwotICAgICAgICAgICAgQUxPR1YoIlx0bWl4ICV6dSBhZGRyZXNzPSVzIiwgaSwgbWl4LT5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgIGNvbnN0IHNwPEF1ZGlvUG9saWN5TWl4PiBhdWRpb1BvbGljeU1peCA9IGl0ZW1BdChpKTsKKyAgICAgICAgQUxPR1YoIlx0bWl4ICV6dSBhZGRyZXNzPSVzIiwgaSwgYXVkaW9Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLnN0cmluZygpKTsKICAgICB9CiAjZW5kaWYKIAotICAgIHNzaXplX3QgaW5kZXggPSBpbmRleE9mS2V5KGFkZHJlc3MpOwotICAgIGlmIChpbmRleCA8IDApIHsKKyAgICBzaXplX3QgaW5kZXg7CisgICAgZm9yIChpbmRleCA9IDA7IGluZGV4IDwgc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgICAgIGNvbnN0IHNwPEF1ZGlvUG9saWN5TWl4PiYgcmVnaXN0ZXJlZE1peCA9IGl0ZW1BdChpbmRleCk7CisgICAgICAgIGlmIChyZWdpc3RlcmVkTWl4LT5tRGV2aWNlQWRkcmVzcy5jb21wYXJlKGFkZHJlc3MpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dEKCJnZXRJbnB1dE1peEZvckF0dHIgZm91bmQgYWRkcj0lcyBkZXY9MHgleCIsCisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyZWRNaXgtPm1EZXZpY2VBZGRyZXNzLnN0cmluZygpLCByZWdpc3RlcmVkTWl4LT5tRGV2aWNlVHlwZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaW5kZXggPT0gc2l6ZSgpKSB7CiAgICAgICAgIEFMT0dXKCJnZXRJbnB1dE1peEZvckF0dHIoKSBubyBwb2xpY3kgZm9yIGFkZHJlc3MgJXMiLCBhZGRyZXNzLnN0cmluZygpKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgc3A8QXVkaW9Qb2xpY3lNaXg+IGF1ZGlvUG9saWN5TWl4ID0gdmFsdWVBdChpbmRleCk7CisgICAgY29uc3Qgc3A8QXVkaW9Qb2xpY3lNaXg+IGF1ZGlvUG9saWN5TWl4ID0gaXRlbUF0KGluZGV4KTsKIAogICAgIGlmIChhdWRpb1BvbGljeU1peC0+bU1peFR5cGUgIT0gTUlYX1RZUEVfUExBWUVSUykgewogICAgICAgICBBTE9HVygiZ2V0SW5wdXRNaXhGb3JBdHRyKCkgYmFkIHBvbGljeSBtaXggdHlwZSBmb3IgYWRkcmVzcyAlcyIsIGFkZHJlc3Muc3RyaW5nKCkpOwpAQCAtMzQzLDE0ICs0MjYsMTE0IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAotewotICAgIHN0ZDo6c3RyaW5nIGxvZygiXG5BdWRpbyBQb2xpY3kgTWl4OlxuIik7Ci0gICAgd3JpdGUoZmQsIGxvZy5jX3N0cigpLCBsb2cuc2l6ZSgpKTsKK3N0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6c2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsCisgICAgICAgIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykgeworICAgIC8vIHZlcmlmeSBmZWFzaWJpbGl0eTogZm9yIGVhY2ggcGxheWVyIG1peDogaWYgaXQgYWxyZWFkeSBjb250YWlucyBhCisgICAgLy8gICAgIm1hdGNoIHVpZCIgcnVsZSBmb3IgdGhpcyB1aWQsIHJldHVybiBhbiBlcnJvcgorICAgIC8vICAgIChhZGRpbmcgYSB1aWQtZGV2aWNlIGFmZmluaXR5IHdvdWxkIHJlc3VsdCBpbiBjb250cmFkaWN0b3J5IHJ1bGVzKQogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCwgMiwgaSk7CisgICAgICAgIGNvbnN0IEF1ZGlvUG9saWN5TWl4KiBtaXggPSBpdGVtQXQoaSkuZ2V0KCk7CisgICAgICAgIGlmICghbWl4LT5pc0RldmljZUFmZmluaXR5Q29tcGF0aWJsZSgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWl4LT5oYXNVaWRSdWxlKHRydWUgLyptYXRjaCovLCB1aWQpKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyByZW1vdmUgZXhpc3RpbmcgcnVsZXMgZm9yIHRoaXMgdWlkCisgICAgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWQpOworCisgICAgLy8gZm9yIGVhY2ggcGxheWVyIG1peDoKKyAgICAvLyAgIElGICAgIGRldmljZSBpcyBub3QgYSB0YXJnZXQgZm9yIHRoZSBtaXgsCisgICAgLy8gICAgIEFORCBpdCBkb2Vzbid0IGhhdmUgYSAibWF0Y2ggdWlkIiBydWxlCisgICAgLy8gICBUSEVOIGFkZCBhIHJ1bGUgdG8gZXhjbHVkZSB0aGUgdWlkCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBBdWRpb1BvbGljeU1peCAqbWl4ID0gaXRlbUF0KGkpLmdldCgpOworICAgICAgICBpZiAoIW1peC0+aXNEZXZpY2VBZmZpbml0eUNvbXBhdGlibGUoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2hlY2sgaWYgdGhpcyBtaXggZ29lcyB0byBhIGRldmljZSBpbiB0aGUgbGlzdCBvZiBkZXZpY2VzCisgICAgICAgIGJvb2wgZGV2aWNlTWF0Y2ggPSBmYWxzZTsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBkZXZpY2VzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICBpZiAoZGV2aWNlc1tqXS5tVHlwZSA9PSBtaXgtPm1EZXZpY2VUeXBlCisgICAgICAgICAgICAgICAgICAgICYmIGRldmljZXNbal0ubUFkZHJlc3MgPT0gbWl4LT5tRGV2aWNlQWRkcmVzcykgeworICAgICAgICAgICAgICAgIGRldmljZU1hdGNoID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWRldmljZU1hdGNoICYmICFtaXgtPmhhc01hdGNoVWlkUnVsZSgpKSB7CisgICAgICAgICAgICAvLyB0aGlzIG1peCBkb2Vzbid0IGdvIHRvIG9uZSBvZiB0aGUgbGlzdGVkIGRldmljZXMgZm9yIHRoZSBnaXZlbiB1aWQsCisgICAgICAgICAgICAvLyBhbmQgaXQncyBub3QgYWxyZWFkeSByZXN0cmljdGluZyB0aGUgbWl4IG9uIGEgdWlkLAorICAgICAgICAgICAgLy8gbW9kaWZ5IGl0cyBydWxlcyB0byBleGNsdWRlIHRoZSB1aWQKKyAgICAgICAgICAgIGlmICghbWl4LT5oYXNVaWRSdWxlKGZhbHNlIC8qbWF0Y2gqLywgdWlkKSkgeworICAgICAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gZG8gaXQgYWdhaW4gaWYgdWlkIGlzIGFscmVhZHkgZXhjbHVkZWQKKyAgICAgICAgICAgICAgICBtaXgtPnNldEV4Y2x1ZGVVaWQodWlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpyZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCkgeworICAgIC8vIGZvciBlYWNoIHBsYXllciBtaXg6IHJlbW92ZSBleGlzdGluZyBydWxlcyB0aGF0IG1hdGNoIG9yIGV4Y2x1ZGUgdGhpcyB1aWQKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGJvb2wgZm91bmRVaWRSdWxlID0gZmFsc2U7CisgICAgICAgIGNvbnN0IEF1ZGlvUG9saWN5TWl4ICptaXggPSBpdGVtQXQoaSkuZ2V0KCk7CisgICAgICAgIGlmICghbWl4LT5pc0RldmljZUFmZmluaXR5Q29tcGF0aWJsZSgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+IGNyaXRlcmlhVG9SZW1vdmU7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbWl4LT5tQ3JpdGVyaWEuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHJ1bGUgPSBtaXgtPm1Dcml0ZXJpYVtqXS5tUnVsZTsKKyAgICAgICAgICAgIC8vIGlzIHRoaXMgcnVsZSBleGNsdWRpbmcgdGhlIHVpZD8gKG5vdCBjb25zaWRlcmluZyB1aWQgbWF0Y2ggcnVsZXMKKyAgICAgICAgICAgIC8vIGFzIHRob3NlIGFyZSBub3QgdXNlZCBmb3IgdWlkLWRldmljZSBhZmZpbml0eSkKKyAgICAgICAgICAgIGlmIChydWxlID09IFJVTEVfRVhDTFVERV9VSUQKKyAgICAgICAgICAgICAgICAgICAgJiYgdWlkID09IG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVWlkKSB7CisgICAgICAgICAgICAgICAgZm91bmRVaWRSdWxlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjcml0ZXJpYVRvUmVtb3ZlLmluc2VydChjcml0ZXJpYVRvUmVtb3ZlLmJlZ2luKCksIGopOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChmb3VuZFVpZFJ1bGUpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgY3JpdGVyaWFUb1JlbW92ZS5zaXplKCk7IGorKykgeworICAgICAgICAgICAgICAgIG1peC0+bUNyaXRlcmlhLnJlbW92ZUF0KGNyaXRlcmlhVG9SZW1vdmVbal0pOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpnZXREZXZpY2VzRm9yVWlkKHVpZF90IHVpZCwKKyAgICAgICAgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKSBjb25zdCB7CisgICAgLy8gZm9yIGVhY2ggcGxheWVyIG1peDogZmluZCBydWxlcyB0aGF0IGRvbid0IGV4Y2x1ZGUgdGhpcyB1aWQsIGFuZCBhZGQgdGhlIGRldmljZSB0byB0aGUgbGlzdAorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgYm9vbCBydWxlQWxsb3dzVWlkID0gdHJ1ZTsKKyAgICAgICAgY29uc3QgQXVkaW9Qb2xpY3lNaXggKm1peCA9IGl0ZW1BdChpKS5nZXQoKTsKKyAgICAgICAgaWYgKG1peC0+bU1peFR5cGUgIT0gTUlYX1RZUEVfUExBWUVSUykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtaXgtPm1Dcml0ZXJpYS5zaXplKCk7IGorKykgeworICAgICAgICAgICAgY29uc3QgdWludDMyX3QgcnVsZSA9IG1peC0+bUNyaXRlcmlhW2pdLm1SdWxlOworICAgICAgICAgICAgaWYgKHJ1bGUgPT0gUlVMRV9FWENMVURFX1VJRAorICAgICAgICAgICAgICAgICAgICAmJiB1aWQgPT0gbWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1VaWQpIHsKKyAgICAgICAgICAgICAgICBydWxlQWxsb3dzVWlkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJ1bGVBbGxvd3NVaWQpIHsKKyAgICAgICAgICAgIGRldmljZXMuYWRkKEF1ZGlvRGV2aWNlVHlwZUFkZHIobWl4LT5tRGV2aWNlVHlwZSwgbWl4LT5tRGV2aWNlQWRkcmVzcykpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kKCJcbkF1ZGlvIFBvbGljeSBNaXg6XG4iKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGl0ZW1BdChpKS0+ZHVtcChkc3QsIDIsIGkpOworICAgIH0KK30KKwogfTsgLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb3J0LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9ydC5jcHAKaW5kZXggZDg1NTYyZS4uYzExNDkwYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb3J0LmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvcnQuY3BwCkBAIC0zMSw5ICszMSwxNSBAQAogLy8gLS0tIEF1ZGlvUG9ydCBjbGFzcyBpbXBsZW1lbnRhdGlvbgogdm9pZCBBdWRpb1BvcnQ6OmF0dGFjaChjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSkKIHsKKyAgICBBTE9HVigiJXM6IGF0dGFjaGluZyBtb2R1bGUgJXMgdG8gcG9ydCAlcyIsIF9fRlVOQ1RJT05fXywgZ2V0TW9kdWxlTmFtZSgpLCBtTmFtZS5zdHJpbmcoKSk7CiAgICAgbU1vZHVsZSA9IG1vZHVsZTsKIH0KIAordm9pZCBBdWRpb1BvcnQ6OmRldGFjaCgpCit7CisgICAgbU1vZHVsZSA9IG51bGxwdHI7Cit9CisKIC8vIE5vdGUgdGhhdCBpcyBhIGRpZmZlcmVudCBuYW1lc3BhY2UgdGhhbiBBdWRpb0ZsaW5nZXIgdW5pcXVlIElEcwogYXVkaW9fcG9ydF9oYW5kbGVfdCBBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpCiB7CkBAIC0yNzYsMzAgKzI4MiwyNSBAQAogICAgIHJldHVybiBpbmRleDEgLSBpbmRleDI7CiB9CiAKK3VpbnQzMl90IEF1ZGlvUG9ydDo6Zm9ybWF0RGlzdGFuY2UoYXVkaW9fZm9ybWF0X3QgZm9ybWF0MSwgYXVkaW9fZm9ybWF0X3QgZm9ybWF0MikKK3sKKyAgICBpZiAoZm9ybWF0MSA9PSBmb3JtYXQyKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoZm9ybWF0MSA9PSBBVURJT19GT1JNQVRfSU5WQUxJRCB8fCBmb3JtYXQyID09IEFVRElPX0ZPUk1BVF9JTlZBTElEKSB7CisgICAgICAgIHJldHVybiBrRm9ybWF0RGlzdGFuY2VNYXg7CisgICAgfQorICAgIGludCBkaWZmQnl0ZXMgPSAoaW50KWF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0MSkgLQorICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQyKTsKKworICAgIHJldHVybiBhYnMoZGlmZkJ5dGVzKTsKK30KKwogYm9vbCBBdWRpb1BvcnQ6OmlzQmV0dGVyRm9ybWF0TWF0Y2goYXVkaW9fZm9ybWF0X3QgbmV3Rm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgY3VycmVudEZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IHRhcmdldEZvcm1hdCkKIHsKLSAgICBpZiAobmV3Rm9ybWF0ID09IGN1cnJlbnRGb3JtYXQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoY3VycmVudEZvcm1hdCA9PSBBVURJT19GT1JNQVRfSU5WQUxJRCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKG5ld0Zvcm1hdCA9PSB0YXJnZXRGb3JtYXQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGludCBjdXJyZW50RGlmZkJ5dGVzID0gKGludClhdWRpb19ieXRlc19wZXJfc2FtcGxlKHRhcmdldEZvcm1hdCkgLQotICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShjdXJyZW50Rm9ybWF0KTsKLSAgICBpbnQgbmV3RGlmZkJ5dGVzID0gKGludClhdWRpb19ieXRlc19wZXJfc2FtcGxlKHRhcmdldEZvcm1hdCkgLQotICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShuZXdGb3JtYXQpOwotCi0gICAgaWYgKGFicyhuZXdEaWZmQnl0ZXMpIDwgYWJzKGN1cnJlbnREaWZmQnl0ZXMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSBpZiAoYWJzKG5ld0RpZmZCeXRlcykgPT0gYWJzKGN1cnJlbnREaWZmQnl0ZXMpKSB7Ci0gICAgICAgIHJldHVybiAobmV3RGlmZkJ5dGVzID49IDApOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGZvcm1hdERpc3RhbmNlKG5ld0Zvcm1hdCwgdGFyZ2V0Rm9ybWF0KSA8IGZvcm1hdERpc3RhbmNlKGN1cnJlbnRGb3JtYXQsIHRhcmdldEZvcm1hdCk7CiB9CiAKIHZvaWQgQXVkaW9Qb3J0OjpwaWNrQXVkaW9Qcm9maWxlKHVpbnQzMl90ICZzYW1wbGluZ1JhdGUsCkBAIC0zNTQsMjYgKzM1NSwxOCBAQAogICAgIHJldHVybiBtR2FpbnNbaW5kZXhdLT5jaGVja0NvbmZpZyhnYWluQ29uZmlnKTsKIH0KIAotdm9pZCBBdWRpb1BvcnQ6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBib29sIHZlcmJvc2UpIGNvbnN0Cit2b2lkIEF1ZGlvUG9ydDo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGJvb2wgdmVyYm9zZSkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQogICAgIGlmICghbU5hbWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gbmFtZTogJXNcbiIsIHNwYWNlcywgIiIsIG1OYW1lLnN0cmluZygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gbmFtZTogJXNcbiIsIHNwYWNlcywgIiIsIG1OYW1lLnN0cmluZygpKTsKICAgICB9CiAgICAgaWYgKHZlcmJvc2UpIHsKLSAgICAgICAgbVByb2ZpbGVzLmR1bXAoZmQsIHNwYWNlcyk7CisgICAgICAgIG1Qcm9maWxlcy5kdW1wKGRzdCwgc3BhY2VzKTsKIAogICAgICAgICBpZiAobUdhaW5zLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGdhaW5zOlxuIiwgc3BhY2VzLCAiIik7Ci0gICAgICAgICAgICByZXN1bHQgPSBidWZmZXI7Ci0gICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIGdhaW5zOlxuIiwgc3BhY2VzLCAiIik7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1HYWlucy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIG1HYWluc1tpXS0+ZHVtcChmZCwgc3BhY2VzICsgMiwgaSk7CisgICAgICAgICAgICAgICAgbUdhaW5zW2ldLT5kdW1wKGRzdCwgc3BhY2VzICsgMiwgaSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0zODYsMjIgKzM3OSwxMiBAQAogCiAvLyAtLS0gQXVkaW9Qb3J0Q29uZmlnIGNsYXNzIGltcGxlbWVudGF0aW9uCiAKLUF1ZGlvUG9ydENvbmZpZzo6QXVkaW9Qb3J0Q29uZmlnKCkKLXsKLSAgICBtU2FtcGxpbmdSYXRlID0gMDsKLSAgICBtQ2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7Ci0gICAgbUZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOwotICAgIG1lbXNldCgmbUdhaW4sIDAsIHNpemVvZihzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcpKTsKLSAgICBtR2Fpbi5pbmRleCA9IC0xOwotfQotCiBzdGF0dXNfdCBBdWRpb1BvcnRDb25maWc6OmFwcGx5QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmJhY2t1cENvbmZpZykKIHsKLSAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgbG9jYWxCYWNrdXBDb25maWc7CisgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIGxvY2FsQmFja3VwQ29uZmlnID0geyAuY29uZmlnX21hc2sgPSBjb25maWctPmNvbmZpZ19tYXNrIH07CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAKLSAgICBsb2NhbEJhY2t1cENvbmZpZy5jb25maWdfbWFzayA9IGNvbmZpZy0+Y29uZmlnX21hc2s7CiAgICAgdG9BdWRpb1BvcnRDb25maWcoJmxvY2FsQmFja3VwQ29uZmlnKTsKIAogICAgIHNwPEF1ZGlvUG9ydD4gYXVkaW9wb3J0ID0gZ2V0QXVkaW9Qb3J0KCk7CkBAIC00MjUsNiArNDA4LDkgQEAKICAgICBpZiAoY29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0dBSU4pIHsKICAgICAgICAgbUdhaW4gPSBjb25maWctPmdhaW47CiAgICAgfQorICAgIGlmIChjb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRkxBR1MpIHsKKyAgICAgICAgbUZsYWdzID0gY29uZmlnLT5mbGFnczsKKyAgICB9CiAKIGV4aXQ6CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewpAQCAtNDM2LDMzICs0MjIsMzggQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCituYW1lc3BhY2UgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordm9pZCB1cGRhdGVGaWVsZCgKKyAgICAgICAgY29uc3QgVCYgcG9ydENvbmZpZ0ZpZWxkLCBUIGF1ZGlvX3BvcnRfY29uZmlnOjoqcG9ydF9jb25maWdfZmllbGQsCisgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLCBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZywKKyAgICAgICAgdW5zaWduZWQgaW50IGNvbmZpZ01hc2ssIFQgZGVmYXVsdFZhbHVlKQoreworICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgY29uZmlnTWFzaykgeworICAgICAgICBpZiAoKHNyY0NvbmZpZyAhPSBudWxscHRyKSAmJiAoc3JjQ29uZmlnLT5jb25maWdfbWFzayAmIGNvbmZpZ01hc2spKSB7CisgICAgICAgICAgICBkc3RDb25maWctPipwb3J0X2NvbmZpZ19maWVsZCA9IHNyY0NvbmZpZy0+KnBvcnRfY29uZmlnX2ZpZWxkOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZHN0Q29uZmlnLT4qcG9ydF9jb25maWdfZmllbGQgPSBwb3J0Q29uZmlnRmllbGQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBkc3RDb25maWctPipwb3J0X2NvbmZpZ19maWVsZCA9IGRlZmF1bHRWYWx1ZTsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlCisKIHZvaWQgQXVkaW9Qb3J0Q29uZmlnOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZykgY29uc3QKIHsKLSAgICBpZiAoZHN0Q29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFKSB7Ci0gICAgICAgIGRzdENvbmZpZy0+c2FtcGxlX3JhdGUgPSBtU2FtcGxpbmdSYXRlOwotICAgICAgICBpZiAoKHNyY0NvbmZpZyAhPSBOVUxMKSAmJiAoc3JjQ29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFKSkgewotICAgICAgICAgICAgZHN0Q29uZmlnLT5zYW1wbGVfcmF0ZSA9IHNyY0NvbmZpZy0+c2FtcGxlX3JhdGU7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBkc3RDb25maWctPnNhbXBsZV9yYXRlID0gMDsKLSAgICB9Ci0gICAgaWYgKGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0spIHsKLSAgICAgICAgZHN0Q29uZmlnLT5jaGFubmVsX21hc2sgPSBtQ2hhbm5lbE1hc2s7Ci0gICAgICAgIGlmICgoc3JjQ29uZmlnICE9IE5VTEwpICYmIChzcmNDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLKSkgewotICAgICAgICAgICAgZHN0Q29uZmlnLT5jaGFubmVsX21hc2sgPSBzcmNDb25maWctPmNoYW5uZWxfbWFzazsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRzdENvbmZpZy0+Y2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOwotICAgIH0KLSAgICBpZiAoZHN0Q29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVCkgewotICAgICAgICBkc3RDb25maWctPmZvcm1hdCA9IG1Gb3JtYXQ7Ci0gICAgICAgIGlmICgoc3JjQ29uZmlnICE9IE5VTEwpICYmIChzcmNDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUKSkgewotICAgICAgICAgICAgZHN0Q29uZmlnLT5mb3JtYXQgPSBzcmNDb25maWctPmZvcm1hdDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRzdENvbmZpZy0+Zm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7Ci0gICAgfQorICAgIHVwZGF0ZUZpZWxkKG1TYW1wbGluZ1JhdGUsICZhdWRpb19wb3J0X2NvbmZpZzo6c2FtcGxlX3JhdGUsCisgICAgICAgICAgICBkc3RDb25maWcsIHNyY0NvbmZpZywgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUsIDB1KTsKKyAgICB1cGRhdGVGaWVsZChtQ2hhbm5lbE1hc2ssICZhdWRpb19wb3J0X2NvbmZpZzo6Y2hhbm5lbF9tYXNrLAorICAgICAgICAgICAgZHN0Q29uZmlnLCBzcmNDb25maWcsIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSywKKyAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdClBVURJT19DSEFOTkVMX05PTkUpOworICAgIHVwZGF0ZUZpZWxkKG1Gb3JtYXQsICZhdWRpb19wb3J0X2NvbmZpZzo6Zm9ybWF0LAorICAgICAgICAgICAgZHN0Q29uZmlnLCBzcmNDb25maWcsIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVCwgQVVESU9fRk9STUFUX0lOVkFMSUQpOworCiAgICAgc3A8QXVkaW9Qb3J0PiBhdWRpb3BvcnQgPSBnZXRBdWRpb1BvcnQoKTsKICAgICBpZiAoKGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19HQUlOKSAmJiBhdWRpb3BvcnQgIT0gTlVMTCkgewogICAgICAgICBkc3RDb25maWctPmdhaW4gPSBtR2FpbjsKQEAgLTQ3OCw2ICs0NjksMTkgQEAKICAgICB9IGVsc2UgewogICAgICAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrICY9IH5BVURJT19QT1JUX0NPTkZJR19HQUlOOwogICAgIH0KKworICAgIHVwZGF0ZUZpZWxkKG1GbGFncywgJmF1ZGlvX3BvcnRfY29uZmlnOjpmbGFncywKKyAgICAgICAgICAgIGRzdENvbmZpZywgc3JjQ29uZmlnLCBBVURJT19QT1JUX0NPTkZJR19GTEFHUywgeyBBVURJT19JTlBVVF9GTEFHX05PTkUgfSk7Cit9CisKK2Jvb2wgQXVkaW9Qb3J0Q29uZmlnOjpoYXNHYWluQ29udHJvbGxlcihib29sIGNhblVzZUZvclZvbHVtZSkgY29uc3QKK3sKKyAgICBzcDxBdWRpb1BvcnQ+IGF1ZGlvcG9ydCA9IGdldEF1ZGlvUG9ydCgpOworICAgIGlmIChhdWRpb3BvcnQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBjYW5Vc2VGb3JWb2x1bWUgPyBhdWRpb3BvcnQtPmdldEdhaW5zKCkuY2FuVXNlRm9yVm9sdW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYXVkaW9wb3J0LT5nZXRHYWlucygpLnNpemUoKSA+IDA7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUHJvZmlsZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Byb2ZpbGUuY3BwCmluZGV4IGZkNmZjMWMuLjY5ZDZiMGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUHJvZmlsZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qcm9maWxlLmNwcApAQCAtMTQsMjAgKzE0LDExMiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgorCiAjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9Qcm9maWxlIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCi0jaW5jbHVkZSAiQXVkaW9Qcm9maWxlLmgiCi0jaW5jbHVkZSAiQXVkaW9Qb3J0LmgiCi0jaW5jbHVkZSAiSHdNb2R1bGUuaCIKLSNpbmNsdWRlICJBdWRpb0dhaW4uaCIKLSNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KLSNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KLSNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKKyNpbmNsdWRlICJBdWRpb0dhaW4uaCIKKyNpbmNsdWRlICJBdWRpb1BvcnQuaCIKKyNpbmNsdWRlICJBdWRpb1Byb2ZpbGUuaCIKKyNpbmNsdWRlICJId01vZHVsZS5oIgorI2luY2x1ZGUgIlR5cGVDb252ZXJ0ZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitDaGFubmVsc1ZlY3RvciBDaGFubmVsc1ZlY3Rvcjo6YXNJbk1hc2soKSBjb25zdAoreworICAgIENoYW5uZWxzVmVjdG9yIGluTWFza1ZlY3RvcjsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGNoYW5uZWwgOiAqdGhpcykgeworICAgICAgICBpZiAoYXVkaW9fY2hhbm5lbF9tYXNrX291dF90b19pbihjaGFubmVsKSAhPSBBVURJT19DSEFOTkVMX0lOVkFMSUQpIHsKKyAgICAgICAgICAgIGluTWFza1ZlY3Rvci5hZGQoYXVkaW9fY2hhbm5lbF9tYXNrX291dF90b19pbihjaGFubmVsKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGluTWFza1ZlY3RvcjsKK30KKworQ2hhbm5lbHNWZWN0b3IgQ2hhbm5lbHNWZWN0b3I6OmFzT3V0TWFzaygpIGNvbnN0Cit7CisgICAgQ2hhbm5lbHNWZWN0b3Igb3V0TWFza1ZlY3RvcjsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGNoYW5uZWwgOiAqdGhpcykgeworICAgICAgICBpZiAoYXVkaW9fY2hhbm5lbF9tYXNrX2luX3RvX291dChjaGFubmVsKSAhPSBBVURJT19DSEFOTkVMX0lOVkFMSUQpIHsKKyAgICAgICAgICAgIG91dE1hc2tWZWN0b3IuYWRkKGF1ZGlvX2NoYW5uZWxfbWFza19pbl90b19vdXQoY2hhbm5lbCkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBvdXRNYXNrVmVjdG9yOworfQorCitib29sIG9wZXJhdG9yID09IChjb25zdCBBdWRpb1Byb2ZpbGUgJmxlZnQsIGNvbnN0IEF1ZGlvUHJvZmlsZSAmY29tcGFyZVRvKQoreworICAgIHJldHVybiAobGVmdC5nZXRGb3JtYXQoKSA9PSBjb21wYXJlVG8uZ2V0Rm9ybWF0KCkpICYmCisgICAgICAgICAgICAobGVmdC5nZXRDaGFubmVscygpID09IGNvbXBhcmVUby5nZXRDaGFubmVscygpKSAmJgorICAgICAgICAgICAgKGxlZnQuZ2V0U2FtcGxlUmF0ZXMoKSA9PSBjb21wYXJlVG8uZ2V0U2FtcGxlUmF0ZXMoKSk7Cit9CisKK3N0YXRpYyBBdWRpb1Byb2ZpbGUqIGNyZWF0ZUZ1bGxEeW5hbWljSW1wbCgpCit7CisgICAgQXVkaW9Qcm9maWxlKiBkeW5hbWljUHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoZ0R5bmFtaWNGb3JtYXQsCisgICAgICAgICAgICBDaGFubmVsc1ZlY3RvcigpLCBTYW1wbGVSYXRlVmVjdG9yKCkpOworICAgIGR5bmFtaWNQcm9maWxlLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOworICAgIGR5bmFtaWNQcm9maWxlLT5zZXREeW5hbWljQ2hhbm5lbHModHJ1ZSk7CisgICAgZHluYW1pY1Byb2ZpbGUtPnNldER5bmFtaWNSYXRlKHRydWUpOworICAgIHJldHVybiBkeW5hbWljUHJvZmlsZTsKK30KKworLy8gc3RhdGljCitzcDxBdWRpb1Byb2ZpbGU+IEF1ZGlvUHJvZmlsZTo6Y3JlYXRlRnVsbER5bmFtaWMoKQoreworICAgIHN0YXRpYyBzcDxBdWRpb1Byb2ZpbGU+IGR5bmFtaWNQcm9maWxlID0gY3JlYXRlRnVsbER5bmFtaWNJbXBsKCk7CisgICAgcmV0dXJuIGR5bmFtaWNQcm9maWxlOworfQorCitBdWRpb1Byb2ZpbGU6OkF1ZGlvUHJvZmlsZShhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFza3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUpIDoKKyAgICAgICAgbU5hbWUoU3RyaW5nOCgiIikpLAorICAgICAgICBtRm9ybWF0KGZvcm1hdCkKK3sKKyAgICBtQ2hhbm5lbE1hc2tzLmFkZChjaGFubmVsTWFza3MpOworICAgIG1TYW1wbGluZ1JhdGVzLmFkZChzYW1wbGluZ1JhdGUpOworfQorCitBdWRpb1Byb2ZpbGU6OkF1ZGlvUHJvZmlsZShhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbE1hc2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmc2FtcGxpbmdSYXRlQ29sbGVjdGlvbikgOgorICAgICAgICBtTmFtZShTdHJpbmc4KCIiKSksCisgICAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKKyAgICAgICAgbUNoYW5uZWxNYXNrcyhjaGFubmVsTWFza3MpLAorICAgICAgICBtU2FtcGxpbmdSYXRlcyhzYW1wbGluZ1JhdGVDb2xsZWN0aW9uKSB7fQorCit2b2lkIEF1ZGlvUHJvZmlsZTo6c2V0Q2hhbm5lbHMoY29uc3QgQ2hhbm5lbHNWZWN0b3IgJmNoYW5uZWxNYXNrcykKK3sKKyAgICBpZiAobUlzRHluYW1pY0NoYW5uZWxzKSB7CisgICAgICAgIG1DaGFubmVsTWFza3MgPSBjaGFubmVsTWFza3M7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUHJvZmlsZTo6c2V0U2FtcGxlUmF0ZXMoY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmc2FtcGxlUmF0ZXMpCit7CisgICAgaWYgKG1Jc0R5bmFtaWNSYXRlKSB7CisgICAgICAgIG1TYW1wbGluZ1JhdGVzID0gc2FtcGxlUmF0ZXM7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUHJvZmlsZTo6Y2xlYXIoKQoreworICAgIGlmIChtSXNEeW5hbWljQ2hhbm5lbHMpIHsKKyAgICAgICAgbUNoYW5uZWxNYXNrcy5jbGVhcigpOworICAgIH0KKyAgICBpZiAobUlzRHluYW1pY1JhdGUpIHsKKyAgICAgICAgbVNhbXBsaW5nUmF0ZXMuY2xlYXIoKTsKKyAgICB9Cit9CisKIHN0YXR1c190IEF1ZGlvUHJvZmlsZTo6Y2hlY2tFeGFjdCh1aW50MzJfdCBzYW1wbGluZ1JhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKIHsKQEAgLTM5LDI3ICsxMzEsNiBAQAogICAgIHJldHVybiBCQURfVkFMVUU7CiB9CiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgU29ydGVkVmVjdG9yPFQ+ICZsZWZ0LCBjb25zdCBTb3J0ZWRWZWN0b3I8VD4gJnJpZ2h0KQotewotICAgIGlmIChsZWZ0LnNpemUoKSAhPSByaWdodC5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBmb3Ioc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCByaWdodC5zaXplKCk7IGluZGV4KyspIHsKLSAgICAgICAgaWYgKGxlZnRbaW5kZXhdICE9IHJpZ2h0W2luZGV4XSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIG9wZXJhdG9yID09IChjb25zdCBBdWRpb1Byb2ZpbGUgJmxlZnQsIGNvbnN0IEF1ZGlvUHJvZmlsZSAmY29tcGFyZVRvKQotewotICAgIHJldHVybiAobGVmdC5nZXRGb3JtYXQoKSA9PSBjb21wYXJlVG8uZ2V0Rm9ybWF0KCkpICYmCi0gICAgICAgICAgICAobGVmdC5nZXRDaGFubmVscygpID09IGNvbXBhcmVUby5nZXRDaGFubmVscygpKSAmJgotICAgICAgICAgICAgKGxlZnQuZ2V0U2FtcGxlUmF0ZXMoKSA9PSBjb21wYXJlVG8uZ2V0U2FtcGxlUmF0ZXMoKSk7Ci19Ci0KIHN0YXR1c190IEF1ZGlvUHJvZmlsZTo6Y2hlY2tDb21wYXRpYmxlU2FtcGxpbmdSYXRlKHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZ1cGRhdGVkU2FtcGxpbmdSYXRlKSBjb25zdAogewpAQCAtMTA3LDYgKzE3OCw3IEBACiAgICAgY29uc3QgYm9vbCBpc1JlY29yZFRocmVhZCA9IHBvcnRUeXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVggJiYgcG9ydFJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTks7CiAgICAgY29uc3QgYm9vbCBpc0luZGV4ID0gYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9yZXByZXNlbnRhdGlvbihjaGFubmVsTWFzaykKICAgICAgICAgICAgID09IEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fSU5ERVg7CisgICAgY29uc3QgdWludDMyX3QgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY2hhbm5lbE1hc2spOwogICAgIGludCBiZXN0TWF0Y2ggPSAwOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNoYW5uZWxNYXNrcy5zaXplKCk7IGkgKyspIHsKICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3Qgc3VwcG9ydGVkID0gbUNoYW5uZWxNYXNrc1tpXTsKQEAgLTEzMCwxMSArMjAyLDE1IEBACiAgICAgICAgICAgICAvLyBPUgogICAgICAgICAgICAgLy8gbWF0Y2ggc2NvcmUgKz0gMTAwIGlmIHRoZSBjaGFubmVsIG1hc2sgcmVwcmVzZW50YXRpb25zIG1hdGNoCiAgICAgICAgICAgICAvLyBtYXRjaCBzY29yZSArPSBudW1iZXIgb2YgY2hhbm5lbHMgbWF0Y2hlZC4KKyAgICAgICAgICAgIC8vIG1hdGNoIHNjb3JlICs9IDEwMCBpZiB0aGUgY2hhbm5lbCBtYXNrIHJlcHJlc2VudGF0aW9ucyBETyBOT1QgbWF0Y2gKKyAgICAgICAgICAgIC8vICAgYnV0IHRoZSBwcm9maWxlIGhhcyBwb3NpdGlvbmFsIGNoYW5uZWwgbWFzayBhbmQgbGVzcyB0aGFuIDIgY2hhbm5lbHMuCisgICAgICAgICAgICAvLyAgIFRoaXMgaXMgZm9yIGF1ZGlvIEhBTCBjb252ZW50aW9uIHRvIG5vdCBsaXN0IGluZGV4IG1hc2tzIGZvciBsZXNzIHRoYW4gMiBjaGFubmVscwogICAgICAgICAgICAgLy8KICAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBtYXRjaGVkIGNoYW5uZWxzLCB0aGUgbWFzayBtYXkgc3RpbGwgYmUgYWNjZXB0ZWQKICAgICAgICAgICAgIC8vIGJ1dCB0aGUgcGxheWJhY2sgb3IgcmVjb3JkIHdpbGwgYmUgc2lsZW50LgogICAgICAgICAgICAgY29uc3QgYm9vbCBpc1N1cHBvcnRlZEluZGV4ID0gKGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfcmVwcmVzZW50YXRpb24oc3VwcG9ydGVkKQogICAgICAgICAgICAgICAgICAgICA9PSBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX0lOREVYKTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHN1cHBvcnRlZENoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKHN1cHBvcnRlZCk7CiAgICAgICAgICAgICBpbnQgbWF0Y2g7CiAgICAgICAgICAgICBpZiAoaXNJbmRleCAmJiBpc1N1cHBvcnRlZEluZGV4KSB7CiAgICAgICAgICAgICAgICAgLy8gaW5kZXggZXF1aXZhbGVuY2UKQEAgLTE0MiwxMyArMjE4LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMoY2hhbm5lbE1hc2spCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMoc3VwcG9ydGVkKSk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKGlzSW5kZXggJiYgIWlzU3VwcG9ydGVkSW5kZXgpIHsKLSAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBlcXVpdmFsZW50Qml0cyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhzdXBwb3J0ZWQpKSAtIDEgOworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGVxdWl2YWxlbnRCaXRzID0gKDEgPDwgc3VwcG9ydGVkQ2hhbm5lbENvdW50KSAtIDEgOwogICAgICAgICAgICAgICAgIG1hdGNoID0gX19idWlsdGluX3BvcGNvdW50KAogICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKGNoYW5uZWxNYXNrKSAmIGVxdWl2YWxlbnRCaXRzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydGVkQ2hhbm5lbENvdW50IDw9IEZDQ18yKSB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoICs9IDEwMDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0luZGV4ICYmIGlzU3VwcG9ydGVkSW5kZXgpIHsKLSAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBlcXVpdmFsZW50Qml0cyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjaGFubmVsTWFzaykpIC0gMTsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBlcXVpdmFsZW50Qml0cyA9ICgxIDw8IGNoYW5uZWxDb3VudCkgLSAxOwogICAgICAgICAgICAgICAgIG1hdGNoID0gX19idWlsdGluX3BvcGNvdW50KAogICAgICAgICAgICAgICAgICAgICAgICAgZXF1aXZhbGVudEJpdHMgJiBhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMoc3VwcG9ydGVkKSk7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtMTgyLDQ3ICsyNTksNzkgQEAKICAgICByZXR1cm4gYmVzdE1hdGNoID4gMCA/IE5PX0VSUk9SIDogQkFEX1ZBTFVFOwogfQogCi12b2lkIEF1ZGlvUHJvZmlsZTo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0Cit2b2lkIEF1ZGlvUHJvZmlsZTo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlcyVzJXNcbiIsIG1Jc0R5bmFtaWNGb3JtYXQgPyAiW2R5bmFtaWMgZm9ybWF0XSIgOiAiIiwKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJXMlcyVzXG4iLCBtSXNEeW5hbWljRm9ybWF0ID8gIltkeW5hbWljIGZvcm1hdF0iIDogIiIsCiAgICAgICAgICAgICAgbUlzRHluYW1pY0NoYW5uZWxzID8gIltkeW5hbWljIGNoYW5uZWxzXSIgOiAiIiwKICAgICAgICAgICAgICBtSXNEeW5hbWljUmF0ZSA/ICJbZHluYW1pYyByYXRlc10iIDogIiIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBpZiAobU5hbWUubGVuZ3RoKCkgIT0gMCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG5hbWU6ICVzXG4iLCBzcGFjZXMsICIiLCBtTmFtZS5zdHJpbmcoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gbmFtZTogJXNcbiIsIHNwYWNlcywgIiIsIG1OYW1lLnN0cmluZygpKTsKICAgICB9CiAgICAgc3RkOjpzdHJpbmcgZm9ybWF0TGl0ZXJhbDsKICAgICBpZiAoRm9ybWF0Q29udmVydGVyOjp0b1N0cmluZyhtRm9ybWF0LCBmb3JtYXRMaXRlcmFsKSkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGZvcm1hdDogJXNcbiIsIHNwYWNlcywgIiIsIGZvcm1hdExpdGVyYWwuY19zdHIoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gZm9ybWF0OiAlc1xuIiwgc3BhY2VzLCAiIiwgZm9ybWF0TGl0ZXJhbC5jX3N0cigpKTsKICAgICB9CiAgICAgaWYgKCFtU2FtcGxpbmdSYXRlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBzYW1wbGluZyByYXRlczoiLCBzcGFjZXMsICIiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBzYW1wbGluZyByYXRlczoiLCBzcGFjZXMsICIiKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJWQiLCBtU2FtcGxpbmdSYXRlc1tpXSk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGkgPT0gKG1TYW1wbGluZ1JhdGVzLnNpemUoKSAtIDEpID8gIiIgOiAiLCAiKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlZCIsIG1TYW1wbGluZ1JhdGVzW2ldKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kKGkgPT0gKG1TYW1wbGluZ1JhdGVzLnNpemUoKSAtIDEpID8gIiIgOiAiLCAiKTsKICAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOworICAgICAgICBkc3QtPmFwcGVuZCgiXG4iKTsKICAgICB9CiAKICAgICBpZiAoIW1DaGFubmVsTWFza3MuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gY2hhbm5lbCBtYXNrczoiLCBzcGFjZXMsICIiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBjaGFubmVsIG1hc2tzOiIsIHNwYWNlcywgIiIpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIjB4JTA0eCIsIG1DaGFubmVsTWFza3NbaV0pOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChpID09IChtQ2hhbm5lbE1hc2tzLnNpemUoKSAtIDEpID8gIiIgOiAiLCAiKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIweCUwNHgiLCBtQ2hhbm5lbE1hc2tzW2ldKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kKGkgPT0gKG1DaGFubmVsTWFza3Muc2l6ZSgpIC0gMSkgPyAiIiA6ICIsICIpOwogICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgICAgIGRzdC0+YXBwZW5kKCJcbiIpOwogICAgIH0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKK30KKworc3NpemVfdCBBdWRpb1Byb2ZpbGVWZWN0b3I6OmFkZChjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICZwcm9maWxlKQoreworICAgIHNzaXplX3QgaW5kZXggPSBWZWN0b3I6OmFkZChwcm9maWxlKTsKKyAgICAvLyB3ZSBzb3J0IGZyb20gd29yc3QgdG8gYmVzdCwgc28gdGhhdCBBVURJT19GT1JNQVRfREVGQVVMVCBpcyBhbHdheXMgdGhlIGZpcnN0IGVudHJ5LgorICAgIC8vIFRPRE86IGNvbXBhcmVGb3JtYXRzIGNvdWxkIGJlIGEgbGFtYmRhIHRvIGNvbnZlcnQgYmV0d2VlbiBwb2ludGVyLXRvLWZvcm1hdCB0byBmb3JtYXQ6CisgICAgLy8gW10oY29uc3QgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdDEsIGNvbnN0IGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQyKSB7CisgICAgLy8gICAgIHJldHVybiBjb21wYXJlRm9ybWF0cygqZm9ybWF0MSwgKmZvcm1hdDIpOworICAgIC8vIH0KKyAgICBzb3J0KGNvbXBhcmVGb3JtYXRzKTsKKyAgICByZXR1cm4gaW5kZXg7Cit9CisKK3NzaXplX3QgQXVkaW9Qcm9maWxlVmVjdG9yOjphZGRQcm9maWxlRnJvbUhhbChjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICZwcm9maWxlVG9BZGQpCit7CisgICAgLy8gQ2hlY2sgdmFsaWQgcHJvZmlsZSB0byBhZGQ6CisgICAgaWYgKCFwcm9maWxlVG9BZGQtPmhhc1ZhbGlkRm9ybWF0KCkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRDaGFubmVscygpICYmICFwcm9maWxlVG9BZGQtPmhhc1ZhbGlkUmF0ZXMoKSkgeworICAgICAgICBGb3JtYXRWZWN0b3IgZm9ybWF0czsKKyAgICAgICAgZm9ybWF0cy5hZGQocHJvZmlsZVRvQWRkLT5nZXRGb3JtYXQoKSk7CisgICAgICAgIHNldEZvcm1hdHMoRm9ybWF0VmVjdG9yKGZvcm1hdHMpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICghcHJvZmlsZVRvQWRkLT5oYXNWYWxpZENoYW5uZWxzKCkgJiYgcHJvZmlsZVRvQWRkLT5oYXNWYWxpZFJhdGVzKCkpIHsKKyAgICAgICAgc2V0U2FtcGxlUmF0ZXNGb3IocHJvZmlsZVRvQWRkLT5nZXRTYW1wbGVSYXRlcygpLCBwcm9maWxlVG9BZGQtPmdldEZvcm1hdCgpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChwcm9maWxlVG9BZGQtPmhhc1ZhbGlkQ2hhbm5lbHMoKSAmJiAhcHJvZmlsZVRvQWRkLT5oYXNWYWxpZFJhdGVzKCkpIHsKKyAgICAgICAgc2V0Q2hhbm5lbHNGb3IocHJvZmlsZVRvQWRkLT5nZXRDaGFubmVscygpLCBwcm9maWxlVG9BZGQtPmdldEZvcm1hdCgpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIC8vIEdvIHRocm91Z2ggdGhlIGxpc3Qgb2YgcHJvZmlsZSB0byBhdm9pZCBkdXBsaWNhdGVzCisgICAgZm9yIChzaXplX3QgcHJvZmlsZUluZGV4ID0gMDsgcHJvZmlsZUluZGV4IDwgc2l6ZSgpOyBwcm9maWxlSW5kZXgrKykgeworICAgICAgICBjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICZwcm9maWxlID0gaXRlbUF0KHByb2ZpbGVJbmRleCk7CisgICAgICAgIGlmIChwcm9maWxlLT5pc1ZhbGlkKCkgJiYgcHJvZmlsZSA9PSBwcm9maWxlVG9BZGQpIHsKKyAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8KKyAgICAgICAgICAgIHJldHVybiBwcm9maWxlSW5kZXg7CisgICAgICAgIH0KKyAgICB9CisgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOyAvLyBzZXQgdGhlIGZvcm1hdCBhcyBkeW5hbWljIHRvIGFsbG93IHJlbW92YWwKKyAgICByZXR1cm4gYWRkKHByb2ZpbGVUb0FkZCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvUHJvZmlsZVZlY3Rvcjo6Y2hlY2tFeGFjdFByb2ZpbGUodWludDMyX3Qgc2FtcGxpbmdSYXRlLApAQCAtMjgxLDYgKzM5MCwyMjggQEAKICAgICByZXR1cm4gQkFEX1ZBTFVFOwogfQogCit2b2lkIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6Y2xlYXJQcm9maWxlcygpCit7CisgICAgZm9yIChzaXplX3QgaSA9IHNpemUoKTsgaSAhPSAwOyApIHsKKyAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gaXRlbUF0KC0taSk7CisgICAgICAgIGlmIChwcm9maWxlLT5pc0R5bmFtaWNGb3JtYXQoKSAmJiBwcm9maWxlLT5oYXNWYWxpZEZvcm1hdCgpKSB7CisgICAgICAgICAgICByZW1vdmVBdChpKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHByb2ZpbGUtPmNsZWFyKCk7CisgICAgfQorfQorCisvLyBSZXR1cm5zIGFuIGludGVyc2VjdGlvbiBiZXR3ZWVuIHR3byBwb3NzaWJseSB1bnNvcnRlZCB2ZWN0b3JzIGFuZCB0aGUgY29udGVudHMgb2YgJ29yZGVyJy4KKy8vIFRoZSByZXN1bHQgaXMgb3JkZXJlZCBhY2NvcmRpbmcgdG8gJ29yZGVyJy4KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIE9yZGVyPgorc3RkOjp2ZWN0b3I8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4gaW50ZXJzZWN0RmlsdGVyQW5kT3JkZXIoCisgICAgICAgIGNvbnN0IFQmIGlucHV0MSwgY29uc3QgVCYgaW5wdXQyLCBjb25zdCBPcmRlciYgb3JkZXIpCit7CisgICAgc3RkOjpzZXQ8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4gc2V0MXtpbnB1dDEuYmVnaW4oKSwgaW5wdXQxLmVuZCgpfTsKKyAgICBzdGQ6OnNldDx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlPiBzZXQye2lucHV0Mi5iZWdpbigpLCBpbnB1dDIuZW5kKCl9OworICAgIHN0ZDo6c2V0PHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGU+IGNvbW1vbjsKKyAgICBzdGQ6OnNldF9pbnRlcnNlY3Rpb24oc2V0MS5iZWdpbigpLCBzZXQxLmVuZCgpLCBzZXQyLmJlZ2luKCksIHNldDIuZW5kKCksCisgICAgICAgICAgICBzdGQ6Omluc2VydGVyKGNvbW1vbiwgY29tbW9uLmJlZ2luKCkpKTsKKyAgICBzdGQ6OnZlY3Rvcjx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlPiByZXN1bHQ7CisgICAgZm9yIChjb25zdCBhdXRvJiBlIDogb3JkZXIpIHsKKyAgICAgICAgaWYgKGNvbW1vbi5maW5kKGUpICE9IGNvbW1vbi5lbmQoKSkgcmVzdWx0LnB1c2hfYmFjayhlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gSW50ZXJzZWN0IHR3byBwb3NzaWJseSB1bnNvcnRlZCB2ZWN0b3JzLCByZXR1cm4gY29tbW9uIGVsZW1lbnRzIGFjY29yZGluZyB0byAnY29tcCcgb3JkZXJpbmcuCisvLyAnY29tcCcgaXMgYSBjb21wYXJhdG9yIGZ1bmN0aW9uLgordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQ29tcGFyZT4KK3N0ZDo6dmVjdG9yPHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGU+IGludGVyc2VjdEFuZE9yZGVyKAorICAgICAgICBjb25zdCBUJiBpbnB1dDEsIGNvbnN0IFQmIGlucHV0MiwgQ29tcGFyZSBjb21wKQoreworICAgIHN0ZDo6c2V0PHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGUsIENvbXBhcmU+IHNldDF7aW5wdXQxLmJlZ2luKCksIGlucHV0MS5lbmQoKSwgY29tcH07CisgICAgc3RkOjpzZXQ8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZSwgQ29tcGFyZT4gc2V0MntpbnB1dDIuYmVnaW4oKSwgaW5wdXQyLmVuZCgpLCBjb21wfTsKKyAgICBzdGQ6OnZlY3Rvcjx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlPiByZXN1bHQ7CisgICAgc3RkOjpzZXRfaW50ZXJzZWN0aW9uKHNldDEuYmVnaW4oKSwgc2V0MS5lbmQoKSwgc2V0Mi5iZWdpbigpLCBzZXQyLmVuZCgpLAorICAgICAgICAgICAgc3RkOjpiYWNrX2luc2VydGVyKHJlc3VsdCksIGNvbXApOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXR1c190IEF1ZGlvUHJvZmlsZVZlY3Rvcjo6ZmluZEJlc3RNYXRjaGluZ091dHB1dENvbmZpZyhjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3ImIG91dHB1dFByb2ZpbGVzLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+JiBwcmVmZXJyZWRGb3JtYXRzLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+JiBwcmVmZXJyZWRPdXRwdXRDaGFubmVscywKKyAgICAgICAgICAgIGJvb2wgcHJlZmVySGlnaGVyU2FtcGxpbmdSYXRlcywKKyAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlICpiZXN0T3V0cHV0Q29uZmlnKSBjb25zdAoreworICAgIGF1dG8gZm9ybWF0cyA9IGludGVyc2VjdEZpbHRlckFuZE9yZGVyKGdldFN1cHBvcnRlZEZvcm1hdHMoKSwKKyAgICAgICAgICAgIG91dHB1dFByb2ZpbGVzLmdldFN1cHBvcnRlZEZvcm1hdHMoKSwgcHJlZmVycmVkRm9ybWF0cyk7CisgICAgLy8gUGljayB0aGUgYmVzdCBjb21wYXRpYmxlIHByb2ZpbGUuCisgICAgZm9yIChjb25zdCBhdXRvJiBmIDogZm9ybWF0cykgeworICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IGlucHV0UHJvZmlsZSA9IGdldEZpcnN0VmFsaWRQcm9maWxlRm9yKGYpOworICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IG91dHB1dFByb2ZpbGUgPSBvdXRwdXRQcm9maWxlcy5nZXRGaXJzdFZhbGlkUHJvZmlsZUZvcihmKTsKKyAgICAgICAgaWYgKGlucHV0UHJvZmlsZSA9PSBudWxscHRyIHx8IG91dHB1dFByb2ZpbGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgYXV0byBjaGFubmVscyA9IGludGVyc2VjdEZpbHRlckFuZE9yZGVyKGlucHV0UHJvZmlsZS0+Z2V0Q2hhbm5lbHMoKS5hc091dE1hc2soKSwKKyAgICAgICAgICAgICAgICBvdXRwdXRQcm9maWxlLT5nZXRDaGFubmVscygpLCBwcmVmZXJyZWRPdXRwdXRDaGFubmVscyk7CisgICAgICAgIGlmIChjaGFubmVscy5lbXB0eSgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBhdXRvIHNhbXBsZVJhdGVzID0gcHJlZmVySGlnaGVyU2FtcGxpbmdSYXRlcyA/CisgICAgICAgICAgICAgICAgaW50ZXJzZWN0QW5kT3JkZXIoaW5wdXRQcm9maWxlLT5nZXRTYW1wbGVSYXRlcygpLCBvdXRwdXRQcm9maWxlLT5nZXRTYW1wbGVSYXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpncmVhdGVyPHR5cGVuYW1lIFNhbXBsZVJhdGVWZWN0b3I6OnZhbHVlX3R5cGU+KCkpIDoKKyAgICAgICAgICAgICAgICBpbnRlcnNlY3RBbmRPcmRlcihpbnB1dFByb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCksIG91dHB1dFByb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omxlc3M8dHlwZW5hbWUgU2FtcGxlUmF0ZVZlY3Rvcjo6dmFsdWVfdHlwZT4oKSk7CisgICAgICAgIGlmIChzYW1wbGVSYXRlcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBBTE9HRCgiJXMoKSBmb3VuZCBjaGFubmVsIG1hc2sgJSN4IGFuZCBzYW1wbGUgcmF0ZSAlZCBmb3IgZm9ybWF0ICUjeC4iLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCAqY2hhbm5lbHMuYmVnaW4oKSwgKnNhbXBsZVJhdGVzLmJlZ2luKCksIGYpOworICAgICAgICBiZXN0T3V0cHV0Q29uZmlnLT5mb3JtYXQgPSBmOworICAgICAgICBiZXN0T3V0cHV0Q29uZmlnLT5zYW1wbGVfcmF0ZSA9ICpzYW1wbGVSYXRlcy5iZWdpbigpOworICAgICAgICBiZXN0T3V0cHV0Q29uZmlnLT5jaGFubmVsX21hc2sgPSAqY2hhbm5lbHMuYmVnaW4oKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCitzcDxBdWRpb1Byb2ZpbGU+IEF1ZGlvUHJvZmlsZVZlY3Rvcjo6Z2V0Rmlyc3RWYWxpZFByb2ZpbGUoKSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGl0ZW1BdChpKS0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gaXRlbUF0KGkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzcDxBdWRpb1Byb2ZpbGU+IEF1ZGlvUHJvZmlsZVZlY3Rvcjo6Z2V0Rmlyc3RWYWxpZFByb2ZpbGVGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGl0ZW1BdChpKS0+aXNWYWxpZCgpICYmIGl0ZW1BdChpKS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0KSB7CisgICAgICAgICAgICByZXR1cm4gaXRlbUF0KGkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitGb3JtYXRWZWN0b3IgQXVkaW9Qcm9maWxlVmVjdG9yOjpnZXRTdXBwb3J0ZWRGb3JtYXRzKCkgY29uc3QKK3sKKyAgICBGb3JtYXRWZWN0b3Igc3VwcG9ydGVkRm9ybWF0czsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPmhhc1ZhbGlkRm9ybWF0KCkpIHsKKyAgICAgICAgICAgIHN1cHBvcnRlZEZvcm1hdHMuYWRkKGl0ZW1BdChpKS0+Z2V0Rm9ybWF0KCkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdXBwb3J0ZWRGb3JtYXRzOworfQorCitib29sIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6aGFzRHluYW1pY0NoYW5uZWxzRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdChpKTsKKyAgICAgICAgaWYgKHByb2ZpbGUtPmdldEZvcm1hdCgpID09IGZvcm1hdCAmJiBwcm9maWxlLT5pc0R5bmFtaWNDaGFubmVscygpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQXVkaW9Qcm9maWxlVmVjdG9yOjpoYXNEeW5hbWljUHJvZmlsZSgpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaXRlbUF0KGkpLT5pc0R5bmFtaWMoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6aGFzRHluYW1pY1JhdGVGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gaXRlbUF0KGkpOworICAgICAgICBpZiAocHJvZmlsZS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0ICYmIHByb2ZpbGUtPmlzRHluYW1pY1JhdGUoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6c2V0Rm9ybWF0cyhjb25zdCBGb3JtYXRWZWN0b3IgJmZvcm1hdHMpCit7CisgICAgLy8gT25seSBhbGxvdyB0byBjaGFuZ2UgdGhlIGZvcm1hdCBvZiBkeW5hbWljIHByb2ZpbGUKKyAgICBzcDxBdWRpb1Byb2ZpbGU+IGR5bmFtaWNGb3JtYXRQcm9maWxlID0gZ2V0UHJvZmlsZUZvcihnRHluYW1pY0Zvcm1hdCk7CisgICAgaWYgKGR5bmFtaWNGb3JtYXRQcm9maWxlID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZShmb3JtYXRzW2ldLAorICAgICAgICAgICAgICAgIGR5bmFtaWNGb3JtYXRQcm9maWxlLT5nZXRDaGFubmVscygpLAorICAgICAgICAgICAgICAgIGR5bmFtaWNGb3JtYXRQcm9maWxlLT5nZXRTYW1wbGVSYXRlcygpKTsKKyAgICAgICAgcHJvZmlsZS0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsKKyAgICAgICAgcHJvZmlsZS0+c2V0RHluYW1pY0NoYW5uZWxzKGR5bmFtaWNGb3JtYXRQcm9maWxlLT5pc0R5bmFtaWNDaGFubmVscygpKTsKKyAgICAgICAgcHJvZmlsZS0+c2V0RHluYW1pY1JhdGUoZHluYW1pY0Zvcm1hdFByb2ZpbGUtPmlzRHluYW1pY1JhdGUoKSk7CisgICAgICAgIGFkZChwcm9maWxlKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qcm9maWxlVmVjdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBQcm9maWxlczpcbiIsIHNwYWNlcywgIiIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc1Byb2ZpbGUgJXp1OiIsIHNwYWNlcyArIDQsICIiLCBpKTsKKyAgICAgICAgaXRlbUF0KGkpLT5kdW1wKGRzdCwgc3BhY2VzICsgOCk7CisgICAgfQorfQorCitzcDxBdWRpb1Byb2ZpbGU+IEF1ZGlvUHJvZmlsZVZlY3Rvcjo6Z2V0UHJvZmlsZUZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0Cit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpZiAoaXRlbUF0KGkpLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQpIHsKKyAgICAgICAgICAgIHJldHVybiBpdGVtQXQoaSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgQXVkaW9Qcm9maWxlVmVjdG9yOjpzZXRTYW1wbGVSYXRlc0ZvcigKKyAgICAgICAgY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmc2FtcGxlUmF0ZXMsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdChpKTsKKyAgICAgICAgaWYgKHByb2ZpbGUtPmdldEZvcm1hdCgpID09IGZvcm1hdCAmJiBwcm9maWxlLT5pc0R5bmFtaWNSYXRlKCkpIHsKKyAgICAgICAgICAgIGlmIChwcm9maWxlLT5oYXNWYWxpZFJhdGVzKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNyZWF0ZSBhIG5ldyBwcm9maWxlIHdpdGggc2FtZSBmb3JtYXQKKyAgICAgICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGVUb0FkZCA9IG5ldyBBdWRpb1Byb2ZpbGUoZm9ybWF0LCBwcm9maWxlLT5nZXRDaGFubmVscygpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZXMpOworICAgICAgICAgICAgICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsgLy8gbmVlZCB0byBzZXQgdG8gYWxsb3cgY2xlYW5pbmcKKyAgICAgICAgICAgICAgICBhZGQocHJvZmlsZVRvQWRkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJvZmlsZS0+c2V0U2FtcGxlUmF0ZXMoc2FtcGxlUmF0ZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6c2V0Q2hhbm5lbHNGb3IoY29uc3QgQ2hhbm5lbHNWZWN0b3IgJmNoYW5uZWxNYXNrcywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gaXRlbUF0KGkpOworICAgICAgICBpZiAocHJvZmlsZS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0ICYmIHByb2ZpbGUtPmlzRHluYW1pY0NoYW5uZWxzKCkpIHsKKyAgICAgICAgICAgIGlmIChwcm9maWxlLT5oYXNWYWxpZENoYW5uZWxzKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNyZWF0ZSBhIG5ldyBwcm9maWxlIHdpdGggc2FtZSBmb3JtYXQKKyAgICAgICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGVUb0FkZCA9IG5ldyBBdWRpb1Byb2ZpbGUoZm9ybWF0LCBjaGFubmVsTWFza3MsCisgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5nZXRTYW1wbGVSYXRlcygpKTsKKyAgICAgICAgICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7IC8vIG5lZWQgdG8gc2V0IHRvIGFsbG93IGNsZWFuaW5nCisgICAgICAgICAgICAgICAgYWRkKHByb2ZpbGVUb0FkZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHByb2ZpbGUtPnNldENoYW5uZWxzKGNoYW5uZWxNYXNrcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIHN0YXRpYwogaW50IEF1ZGlvUHJvZmlsZVZlY3Rvcjo6Y29tcGFyZUZvcm1hdHMoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAqcHJvZmlsZTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICpwcm9maWxlMikKIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUm91dGUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Sb3V0ZS5jcHAKaW5kZXggNzlhZDFmNy4uNzlmMDkxOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Sb3V0ZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Sb3V0ZS5jcHAKQEAgLTI0LDI5ICsyNCwzMiBAQAogbmFtZXNwYWNlIGFuZHJvaWQKIHsKIAotdm9pZCBBdWRpb1JvdXRlOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3QKK3ZvaWQgQXVkaW9Sb3V0ZTo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIFR5cGU6ICVzXG4iLCBzcGFjZXMsICIiLCBtVHlwZSA9PSBBVURJT19ST1VURV9NVVggPyAiTXV4IiA6ICJNaXgiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIFNpbms6ICVzXG4iLCBzcGFjZXMsICIiLCBtU2luay0+Z2V0VGFnTmFtZSgpLnN0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBUeXBlOiAlc1xuIiwgc3BhY2VzLCAiIiwgbVR5cGUgPT0gQVVESU9fUk9VVEVfTVVYID8gIk11eCIgOiAiTWl4Iik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gU2luazogJXNcbiIsIHNwYWNlcywgIiIsIG1TaW5rLT5nZXRUYWdOYW1lKCkuc3RyaW5nKCkpOwogICAgIGlmIChtU291cmNlcy5zaXplKCkgIT0gMCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIFNvdXJjZXM6IFxuIiwgc3BhY2VzLCAiIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gU291cmNlczogXG4iLCBzcGFjZXMsICIiKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU291cmNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzJXMgXG4iLCBzcGFjZXMgKyA0LCAiIiwgbVNvdXJjZXNbaV0tPmdldFRhZ05hbWUoKS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzJXMgXG4iLCBzcGFjZXMgKyA0LCAiIiwgbVNvdXJjZXNbaV0tPmdldFRhZ05hbWUoKS5zdHJpbmcoKSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKKyAgICBkc3QtPmFwcGVuZCgiXG4iKTsKK30KIAotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworYm9vbCBBdWRpb1JvdXRlOjpzdXBwb3J0c1BhdGNoKGNvbnN0IHNwPEF1ZGlvUG9ydD4gJnNyY1BvcnQsIGNvbnN0IHNwPEF1ZGlvUG9ydD4gJmRzdFBvcnQpIGNvbnN0Cit7CisgICAgaWYgKG1TaW5rID09IDAgfHwgZHN0UG9ydCA9PSAwIHx8IGRzdFBvcnQgIT0gbVNpbmspIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBBTE9HVigiJXM6IHNpbmtzICVzIG1hdGNoaW5nIiwgX19GVU5DVElPTl9fLCBtU2luay0+Z2V0VGFnTmFtZSgpLnN0cmluZygpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnNvdXJjZVBvcnQgOiBtU291cmNlcykgeworICAgICAgICBpZiAoc291cmNlUG9ydCA9PSBzcmNQb3J0KSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IHNvdXJjZXMgJXMgbWF0Y2hpbmciLCBfX0ZVTkNUSU9OX18sIHNvdXJjZVBvcnQtPmdldFRhZ05hbWUoKS5zdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU2Vzc2lvbi5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Nlc3Npb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTRjM2YyLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU2Vzc2lvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1Nlc3Npb24iCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxBdWRpb1BvbGljeUludGVyZmFjZS5oPgotI2luY2x1ZGUgInBvbGljeS5oIgotI2luY2x1ZGUgIkF1ZGlvUG9saWN5TWl4LmgiCi0jaW5jbHVkZSAiQXVkaW9TZXNzaW9uLmgiCi0jaW5jbHVkZSAiQXVkaW9HYWluLmgiCi0jaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgotCi0jaW5jbHVkZSA8bG9nL2xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1BdWRpb1Nlc3Npb246OkF1ZGlvU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTb3VuZFRyaWdnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1BvbGljeU1peD4gJnBvbGljeU1peCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpIDoKLSAgICBtUmVjb3JkQ2xpZW50SW5mbyh7IC51aWQgPSB1aWQsIC5zZXNzaW9uID0gc2Vzc2lvbiwgLnNvdXJjZSA9IGlucHV0U291cmNlfSksCi0gICAgbUNvbmZpZyh7IC5mb3JtYXQgPSBmb3JtYXQsIC5zYW1wbGVfcmF0ZSA9IHNhbXBsZVJhdGUsIC5jaGFubmVsX21hc2sgPSBjaGFubmVsTWFza30pLAotICAgIG1GbGFncyhmbGFncyksIG1Jc1NvdW5kVHJpZ2dlcihpc1NvdW5kVHJpZ2dlciksCi0gICAgbU9wZW5Db3VudCgxKSwgbUFjdGl2ZUNvdW50KDApLCBtUG9saWN5TWl4KHBvbGljeU1peCksIG1DbGllbnRJbnRlcmZhY2UoY2xpZW50SW50ZXJmYWNlKSwKLSAgICBtSW5mb1Byb3ZpZGVyKE5VTEwpCi17Ci19Ci0KLXVpbnQzMl90IEF1ZGlvU2Vzc2lvbjo6Y2hhbmdlT3BlbkNvdW50KGludCBkZWx0YSkKLXsKLSAgICBpZiAoKGRlbHRhICsgKGludCltT3BlbkNvdW50KSA8IDApIHsKLSAgICAgICAgQUxPR1coIiVzIGludmFsaWQgZGVsdGEgJWQsIG9wZW4gY291bnQgJWQiLAotICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRlbHRhLCBtT3BlbkNvdW50KTsKLSAgICAgICAgbU9wZW5Db3VudCA9ICh1aW50MzJfdCkoLWRlbHRhKTsKLSAgICB9Ci0gICAgbU9wZW5Db3VudCArPSBkZWx0YTsKLSAgICBBTE9HVigiJXMgb3BlbiBjb3VudCAlZCIsIF9fRlVOQ1RJT05fXywgbU9wZW5Db3VudCk7Ci0gICAgcmV0dXJuIG1PcGVuQ291bnQ7Ci19Ci0KLXVpbnQzMl90IEF1ZGlvU2Vzc2lvbjo6Y2hhbmdlQWN0aXZlQ291bnQoaW50IGRlbHRhKQotewotICAgIGNvbnN0IHVpbnQzMl90IG9sZEFjdGl2ZUNvdW50ID0gbUFjdGl2ZUNvdW50OwotICAgIGlmICgoZGVsdGEgKyAoaW50KW1BY3RpdmVDb3VudCkgPCAwKSB7Ci0gICAgICAgIEFMT0dXKCIlcyBpbnZhbGlkIGRlbHRhICVkLCBhY3RpdmUgY291bnQgJWQiLAotICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRlbHRhLCBtQWN0aXZlQ291bnQpOwotICAgICAgICBtQWN0aXZlQ291bnQgPSAodWludDMyX3QpKC1kZWx0YSk7Ci0gICAgfQotICAgIG1BY3RpdmVDb3VudCArPSBkZWx0YTsKLSAgICBBTE9HVigiJXMgYWN0aXZlIGNvdW50ICVkIiwgX19GVU5DVElPTl9fLCBtQWN0aXZlQ291bnQpOwotICAgIGludCBldmVudCA9IFJFQ09SRF9DT05GSUdfRVZFTlRfTk9ORTsKLQotICAgIGlmICgob2xkQWN0aXZlQ291bnQgPT0gMCkgJiYgKG1BY3RpdmVDb3VudCA+IDApKSB7Ci0gICAgICAgIGV2ZW50ID0gUkVDT1JEX0NPTkZJR19FVkVOVF9TVEFSVDsKLSAgICB9IGVsc2UgaWYgKChvbGRBY3RpdmVDb3VudCA+IDApICYmIChtQWN0aXZlQ291bnQgPT0gMCkpIHsKLSAgICAgICAgZXZlbnQgPSBSRUNPUkRfQ09ORklHX0VWRU5UX1NUT1A7Ci0gICAgfQotCi0gICAgaWYgKGV2ZW50ICE9IFJFQ09SRF9DT05GSUdfRVZFTlRfTk9ORSkgewotICAgICAgICAvLyBEeW5hbWljIHBvbGljeSBjYWxsYmFjazoKLSAgICAgICAgLy8gaWYgaW5wdXQgbWFwcyB0byBhIGR5bmFtaWMgcG9saWN5IHdpdGggYW4gYWN0aXZpdHkgbGlzdGVuZXIsIG5vdGlmeSBvZiBzdGF0ZSBjaGFuZ2UKLSAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IHBvbGljeU1peCA9IG1Qb2xpY3lNaXgucHJvbW90ZSgpOwotICAgICAgICBpZiAoKHBvbGljeU1peCAhPSBOVUxMKSAmJiAoKHBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUocG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgKGV2ZW50ID09IFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQpID8gTUlYX1NUQVRFX01JWElORyA6IE1JWF9TVEFURV9JRExFKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlY29yZGluZyBjb25maWd1cmF0aW9uIGNhbGxiYWNrOgotICAgICAgICBjb25zdCBBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIqIHByb3ZpZGVyID0gbUluZm9Qcm92aWRlcjsKLSAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCBkZXZpY2VDb25maWcgPSAocHJvdmlkZXIgIT0gTlVMTCkgPyBwcm92aWRlci0+Z2V0Q29uZmlnKCkgOgotICAgICAgICAgICAgICAgIEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSOwotICAgICAgICBjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSA9IChwcm92aWRlciAhPSBOVUxMKSA/IHByb3ZpZGVyLT5nZXRQYXRjaEhhbmRsZSgpIDoKLSAgICAgICAgICAgICAgICBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgaWYgKHBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsICZtUmVjb3JkQ2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgJm1Db25maWcsICZkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBtQWN0aXZlQ291bnQ7Ci19Ci0KLWJvb2wgQXVkaW9TZXNzaW9uOjptYXRjaGVzKGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4gJm90aGVyKSBjb25zdAotewotICAgIGlmIChvdGhlci0+c2Vzc2lvbigpID09IG1SZWNvcmRDbGllbnRJbmZvLnNlc3Npb24gJiYKLSAgICAgICAgb3RoZXItPmlucHV0U291cmNlKCkgPT0gbVJlY29yZENsaWVudEluZm8uc291cmNlICYmCi0gICAgICAgIG90aGVyLT5mb3JtYXQoKSA9PSBtQ29uZmlnLmZvcm1hdCAmJgotICAgICAgICBvdGhlci0+c2FtcGxlUmF0ZSgpID09IG1Db25maWcuc2FtcGxlX3JhdGUgJiYKLSAgICAgICAgb3RoZXItPmNoYW5uZWxNYXNrKCkgPT0gbUNvbmZpZy5jaGFubmVsX21hc2sgJiYKLSAgICAgICAgb3RoZXItPmZsYWdzKCkgPT0gbUZsYWdzICYmCi0gICAgICAgIG90aGVyLT51aWQoKSA9PSBtUmVjb3JkQ2xpZW50SW5mby51aWQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBBdWRpb1Nlc3Npb246OnNldEluZm9Qcm92aWRlcihBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIgKnByb3ZpZGVyKQotewotICAgIG1JbmZvUHJvdmlkZXIgPSBwcm92aWRlcjsKLX0KLQotdm9pZCBBdWRpb1Nlc3Npb246Om9uU2Vzc2lvbkluZm9VcGRhdGUoKSBjb25zdAotewotICAgIGlmIChtQWN0aXZlQ291bnQgPiAwKSB7Ci0gICAgICAgIC8vIHJlc2VuZCB0aGUgY2FsbGJhY2sgYWZ0ZXIgcmVxdWVyeWluZyB0aGUgaW5mb3JtYXRpb25zIGZyb20gdGhlIGluZm8gcHJvdmlkZXIKLSAgICAgICAgY29uc3QgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyKiBwcm92aWRlciA9IG1JbmZvUHJvdmlkZXI7Ci0gICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgZGV2aWNlQ29uZmlnID0gKHByb3ZpZGVyICE9IE5VTEwpID8gcHJvdmlkZXItPmdldENvbmZpZygpIDoKLSAgICAgICAgICAgICAgICBBVURJT19DT05GSUdfQkFTRV9JTklUSUFMSVpFUjsKLSAgICAgICAgY29uc3QgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUgPSAocHJvdmlkZXIgIT0gTlVMTCkgPyBwcm92aWRlci0+Z2V0UGF0Y2hIYW5kbGUoKSA6Ci0gICAgICAgICAgICAgICAgQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgICAgIGlmIChwYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQsCi0gICAgICAgICAgICAgICAgICAgICZtUmVjb3JkQ2xpZW50SW5mbywgJm1Db25maWcsICZkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdHVzX3QgQXVkaW9TZXNzaW9uOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzQXVkaW8gc2Vzc2lvbiAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHNlc3Npb246ICUyZFxuIiwgc3BhY2VzLCAiIiwgbVJlY29yZENsaWVudEluZm8uc2Vzc2lvbik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gb3duZXIgdWlkOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1SZWNvcmRDbGllbnRJbmZvLnVpZCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gaW5wdXQgc291cmNlOiAlZFxuIiwgc3BhY2VzLCAiIiwgbVJlY29yZENsaWVudEluZm8uc291cmNlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBmb3JtYXQ6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1Db25maWcuZm9ybWF0KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBzYW1wbGU6ICVkXG4iLCBzcGFjZXMsICIiLCBtQ29uZmlnLnNhbXBsZV9yYXRlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBjaGFubmVsIG1hc2s6ICUwOHhcbiIsCi0gICAgICAgICAgICAgc3BhY2VzLCAiIiwgbUNvbmZpZy5jaGFubmVsX21hc2spOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGlzIHNvdW5kdHJpZ2dlcjogJXNcbiIsCi0gICAgICAgICAgICAgc3BhY2VzLCAiIiwgbUlzU291bmRUcmlnZ2VyID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gb3BlbiBjb3VudDogJWRcbiIsIHNwYWNlcywgIiIsIG1PcGVuQ291bnQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGFjdGl2ZSBjb3VudDogJWRcbiIsIHNwYWNlcywgIiIsIG1BY3RpdmVDb3VudCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjphZGRTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1Nlc3Npb24+JiBhdWRpb1Nlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlciAqcHJvdmlkZXIpCi17Ci0gICAgc3NpemVfdCBpbmRleCA9IGluZGV4T2ZLZXkoc2Vzc2lvbik7Ci0KLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICBBTE9HVygiYWRkU2Vzc2lvbigpIHNlc3Npb24gJWQgYWxyZWFkeSBpbiIsIHNlc3Npb24pOwotICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7Ci0gICAgfQotICAgIGF1ZGlvU2Vzc2lvbi0+c2V0SW5mb1Byb3ZpZGVyKHByb3ZpZGVyKTsKLSAgICBhZGQoc2Vzc2lvbiwgYXVkaW9TZXNzaW9uKTsKLSAgICBBTE9HVigiYWRkU2Vzc2lvbigpIHNlc3Npb24gJWQgIGNsaWVudCAlZCBzb3VyY2UgJWQiLAotICAgICAgICAgICAgc2Vzc2lvbiwgYXVkaW9TZXNzaW9uLT51aWQoKSwgYXVkaW9TZXNzaW9uLT5pbnB1dFNvdXJjZSgpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb246OnJlbW92ZVNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCi17Ci0gICAgc3NpemVfdCBpbmRleCA9IGluZGV4T2ZLZXkoc2Vzc2lvbik7Ci0KLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJyZW1vdmVTZXNzaW9uKCkgc2Vzc2lvbiAlZCBub3QgaW4iLCBzZXNzaW9uKTsKLSAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOwotICAgIH0KLSAgICBBTE9HVigicmVtb3ZlU2Vzc2lvbigpIHNlc3Npb24gJWQiLCBzZXNzaW9uKTsKLSAgICB2YWx1ZUF0KGluZGV4KS0+c2V0SW5mb1Byb3ZpZGVyKE5VTEwpOwotICAgIHJlbW92ZUl0ZW1zQXQoaW5kZXgpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdWludDMyX3QgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6Z2V0T3BlbkNvdW50KCkgY29uc3QKLXsKLSAgICB1aW50MzJfdCBvcGVuQ291bnQgPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgb3BlbkNvdW50ICs9IHZhbHVlQXQoaSktPm9wZW5Db3VudCgpOwotICAgIH0KLSAgICByZXR1cm4gb3BlbkNvdW50OwotfQotCi1BdWRpb1Nlc3Npb25Db2xsZWN0aW9uIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb246OmdldEFjdGl2ZVNlc3Npb25zKCkgY29uc3QKLXsKLSAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIGFjdGl2ZVNlc3Npb25zOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKHZhbHVlQXQoaSktPmFjdGl2ZUNvdW50KCkgIT0gMCkgewotICAgICAgICAgICAgYWN0aXZlU2Vzc2lvbnMuYWRkKHZhbHVlQXQoaSktPnNlc3Npb24oKSwgdmFsdWVBdChpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGFjdGl2ZVNlc3Npb25zOwotfQotCi1zaXplX3QgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6Z2V0QWN0aXZlU2Vzc2lvbkNvdW50KCkgY29uc3QKLXsKLSAgICBzaXplX3QgYWN0aXZlQ291bnQgPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKHZhbHVlQXQoaSktPmFjdGl2ZUNvdW50KCkgIT0gMCkgewotICAgICAgICAgICAgYWN0aXZlQ291bnQrKzsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYWN0aXZlQ291bnQ7Ci19Ci0KLWJvb2wgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6aGFzQWN0aXZlU2Vzc2lvbigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEFjdGl2ZVNlc3Npb25Db3VudCgpICE9IDA7Ci19Ci0KLWJvb2wgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6aXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdAotewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiAgYXVkaW9TZXNzaW9uID0gdmFsdWVBdChpKTsKLSAgICAgICAgLy8gQVVESU9fU09VUkNFX0hPVFdPUkQgaXMgZXF1aXZhbGVudCB0byBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04gb25seSBpZiBpdAotICAgICAgICAvLyBjb3JyZXNwb25kcyB0byBhbiBhY3RpdmUgY2FwdHVyZSB0cmlnZ2VyZWQgYnkgYSBoYXJkd2FyZSBob3R3b3JkIHJlY29nbml0aW9uCi0gICAgICAgIGlmIChhdWRpb1Nlc3Npb24tPmFjdGl2ZUNvdW50KCkgPiAwICYmCi0gICAgICAgICAgICAgICAgKChhdWRpb1Nlc3Npb24tPmlucHV0U291cmNlKCkgPT0gc291cmNlKSB8fAotICAgICAgICAgICAgICAgICgoc291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTikgJiYKLSAgICAgICAgICAgICAgICAgKGF1ZGlvU2Vzc2lvbi0+aW5wdXRTb3VyY2UoKSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgJiYKLSAgICAgICAgICAgICAgICAgYXVkaW9TZXNzaW9uLT5pc1NvdW5kVHJpZ2dlcigpKSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYXVkaW9fc291cmNlX3QgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6Z2V0SGlnaGVzdFByaW9yaXR5U291cmNlKGJvb2wgYWN0aXZlT25seSkgY29uc3QKLXsKLSAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSBBVURJT19TT1VSQ0VfREVGQVVMVDsKLSAgICBpbnQzMl90IHByaW9yaXR5ID0gLTE7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4gIGF1ZGlvU2Vzc2lvbiA9IHZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChhY3RpdmVPbmx5ICYmIGF1ZGlvU2Vzc2lvbi0+YWN0aXZlQ291bnQoKSA9PSAwKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQzMl90IGN1clByaW9yaXR5ID0gc291cmNlX3ByaW9yaXR5KGF1ZGlvU2Vzc2lvbi0+aW5wdXRTb3VyY2UoKSk7Ci0gICAgICAgIGlmIChjdXJQcmlvcml0eSA+IHByaW9yaXR5KSB7Ci0gICAgICAgICAgICBwcmlvcml0eSA9IGN1clByaW9yaXR5OwotICAgICAgICAgICAgc291cmNlID0gYXVkaW9TZXNzaW9uLT5pbnB1dFNvdXJjZSgpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzb3VyY2U7Ci19Ci0KLXZvaWQgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6b25TZXNzaW9uSW5mb1VwZGF0ZSgpIGNvbnN0Ci17Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICB2YWx1ZUF0KGkpLT5vblNlc3Npb25JbmZvVXBkYXRlKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNBdWRpbyBTZXNzaW9uczpcbiIsIHNwYWNlcywgIiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZmQsIHNwYWNlcyArIDIsIGkpOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU291cmNlRGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1NvdXJjZURlc2NyaXB0b3IuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTMzZTU3Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU291cmNlRGVzY3JpcHRvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvU291cmNlRGVzY3JpcHRvciIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oPgotI2luY2x1ZGUgPEh3TW9kdWxlLmg+Ci0jaW5jbHVkZSA8QXVkaW9HYWluLmg+Ci0jaW5jbHVkZSA8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8RGV2aWNlRGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPElPUHJvZmlsZS5oPgotI2luY2x1ZGUgPEF1ZGlvT3V0cHV0RGVzY3JpcHRvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXR1c190IEF1ZGlvU291cmNlRGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCi17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJtU3RyZWFtOiAlZFxuIiwgYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZSgmbUF0dHJpYnV0ZXMpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAibURldmljZTpcbiIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICBtRGV2aWNlLT5kdW1wKGZkLCAyICwgMCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0KLXN0YXR1c190IEF1ZGlvU291cmNlQ29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpIGNvbnN0Ci17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbkF1ZGlvIHNvdXJjZXMgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gU291cmNlICVkIGR1bXA6XG4iLCBrZXlBdChpKSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi19OyAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9DbGllbnREZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0NsaWVudERlc2NyaXB0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMDdhYjEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9DbGllbnREZXNjcmlwdG9yLmNwcApAQCAtMCwwICsxLDEyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNX0NsaWVudERlc2NyaXB0b3IiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxUeXBlQ29udmVydGVyLmg+CisjaW5jbHVkZSAiQXVkaW9HYWluLmgiCisjaW5jbHVkZSAiQXVkaW9PdXRwdXREZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiQXVkaW9QYXRjaC5oIgorI2luY2x1ZGUgIkNsaWVudERlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJEZXZpY2VEZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiSHdNb2R1bGUuaCIKKyNpbmNsdWRlICJJT1Byb2ZpbGUuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGQ6OnN0cmluZyBDbGllbnREZXNjcmlwdG9yOjp0b1Nob3J0U3RyaW5nKCkgY29uc3QKK3sKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKworICAgIHNzIDw8ICJQb3J0SWQ6ICIgPDwgbVBvcnRJZCA8PCAiIFNlc3Npb25JZDogIiA8PCBtU2Vzc2lvbklkIDw8ICIgVWlkOiAiIDw8IG1VaWQ7CisgICAgcmV0dXJuIHNzLnN0cigpOworfQorCit2b2lkIENsaWVudERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0NsaWVudCAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFBvcnQgSWQ6ICVkIFNlc3Npb24gSWQ6ICVkIFVJRDogJWRcbiIsIHNwYWNlcywgIiIsCisgICAgICAgICAgICAgbVBvcnRJZCwgbVNlc3Npb25JZCwgbVVpZCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gRm9ybWF0OiAlMDh4IFNhbXBsaW5nIHJhdGU6ICVkIENoYW5uZWxzOiAlMDh4XG4iLCBzcGFjZXMsICIiLAorICAgICAgICAgICAgIG1Db25maWcuZm9ybWF0LCBtQ29uZmlnLnNhbXBsZV9yYXRlLCBtQ29uZmlnLmNoYW5uZWxfbWFzayk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gQXR0cmlidXRlczogJXNcbiIsIHNwYWNlcywgIiIsIHRvU3RyaW5nKG1BdHRyaWJ1dGVzKS5jX3N0cigpKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBQcmVmZXJyZWQgRGV2aWNlIElkOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtUHJlZmVycmVkRGV2aWNlSWQpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFN0YXRlOiAlc1xuIiwgc3BhY2VzLCAiIiwgbUFjdGl2ZSA/ICJBY3RpdmUiIDogIkluYWN0aXZlIik7Cit9CisKK3ZvaWQgVHJhY2tDbGllbnREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAoreworICAgIENsaWVudERlc2NyaXB0b3I6OmR1bXAoZHN0LCBzcGFjZXMsIGluZGV4KTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBTdHJlYW06ICVkIGZsYWdzOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtU3RyZWFtLCBtRmxhZ3MpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFJlZmNvdW50OiAlZFxuIiwgc3BhY2VzLCAiIiwgbUFjdGl2aXR5Q291bnQpOworfQorCitzdGQ6OnN0cmluZyBUcmFja0NsaWVudERlc2NyaXB0b3I6OnRvU2hvcnRTdHJpbmcoKSBjb25zdAoreworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworCisgICAgc3MgPDwgQ2xpZW50RGVzY3JpcHRvcjo6dG9TaG9ydFN0cmluZygpIDw8ICIgU3RyZWFtOiAiIDw8IG1TdHJlYW07CisgICAgcmV0dXJuIHNzLnN0cigpOworfQorCit2b2lkIFJlY29yZENsaWVudERlc2NyaXB0b3I6OnRyYWNrRWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3REZXNjcmlwdG9yPiAmZWZmZWN0LCBib29sIGVuYWJsZWQpCit7CisgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgbUVuYWJsZWRFZmZlY3RzLnJlcGxhY2VWYWx1ZUZvcihlZmZlY3QtPm1JZCwgZWZmZWN0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtRW5hYmxlZEVmZmVjdHMucmVtb3ZlSXRlbShlZmZlY3QtPm1JZCk7CisgICAgfQorfQorCit2b2lkIFJlY29yZENsaWVudERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Cit7CisgICAgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcChkc3QsIHNwYWNlcywgaW5kZXgpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFNvdXJjZTogJWQgZmxhZ3M6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1Tb3VyY2UsIG1GbGFncyk7CisgICAgbUVuYWJsZWRFZmZlY3RzLmR1bXAoZHN0LCBzcGFjZXMgKyAyIC8qc3BhY2VzKi8sIGZhbHNlIC8qdmVyYm9zZSovKTsKK30KKworU291cmNlQ2xpZW50RGVzY3JpcHRvcjo6U291cmNlQ2xpZW50RGVzY3JpcHRvcihhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwgdWlkX3QgdWlkLAorICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsIGNvbnN0IHNwPEF1ZGlvUGF0Y2g+JiBwYXRjaERlc2MsCisgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgc3JjRGV2aWNlLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwgVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSkgOgorICAgIFRyYWNrQ2xpZW50RGVzY3JpcHRvcjo6VHJhY2tDbGllbnREZXNjcmlwdG9yKHBvcnRJZCwgdWlkLCBBVURJT19TRVNTSU9OX05PTkUsIGF0dHJpYnV0ZXMsCisgICAgICAgIEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSLCBBVURJT19QT1JUX0hBTkRMRV9OT05FLAorICAgICAgICBzdHJlYW0sIHN0cmF0ZWd5LCB2b2x1bWVTb3VyY2UsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsIGZhbHNlLAorICAgICAgICB7fSAvKiBTb3VyY2VzIGRvIG5vdCBzdXBwb3J0IHNlY29uZGFyeSBvdXRwdXRzKi8pLAorICAgICAgICBtUGF0Y2hEZXNjKHBhdGNoRGVzYyksIG1TcmNEZXZpY2Uoc3JjRGV2aWNlKQoreworfQorCit2b2lkIFNvdXJjZUNsaWVudERlc2NyaXB0b3I6OnNldFN3T3V0cHV0KGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgc3dPdXRwdXQpCit7CisgICAgbVN3T3V0cHV0ID0gc3dPdXRwdXQ7Cit9CisKK3ZvaWQgU291cmNlQ2xpZW50RGVzY3JpcHRvcjo6c2V0SHdPdXRwdXQoY29uc3Qgc3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+JiBod091dHB1dCkKK3sKKyAgICBtSHdPdXRwdXQgPSBod091dHB1dDsKK30KKwordm9pZCBTb3VyY2VDbGllbnREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAoreworICAgIFRyYWNrQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcChkc3QsIHNwYWNlcywgaW5kZXgpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIERldmljZTpcbiIsIHNwYWNlcywgIiIpOworICAgIG1TcmNEZXZpY2UtPmR1bXAoZHN0LCAyLCAwKTsKK30KKwordm9pZCBTb3VyY2VDbGllbnRDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZCgiXG5BdWRpbyBzb3VyY2VzOlxuIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCwgMiwgaSk7CisgICAgfQorfQorCit9OyAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Db25maWdQYXJzaW5nVXRpbHMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQ29uZmlnUGFyc2luZ1V0aWxzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWUxMDVmNS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Db25maWdQYXJzaW5nVXRpbHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFQTTo6Q29uZmlnUGFyc2luZ1V0aWxzIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSAiQ29uZmlnUGFyc2luZ1V0aWxzLmgiCi0jaW5jbHVkZSAiQXVkaW9HYWluLmgiCi0jaW5jbHVkZSAiSU9Qcm9maWxlLmgiCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL21pc2MuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0gYXVkaW9fcG9saWN5LmNvbmYgZmlsZSBwYXJzaW5nCi0KLS8vc3RhdGljCi12b2lkIENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZEF1ZGlvUG9ydEdhaW4oY25vZGUgKnJvb3QsIEF1ZGlvUG9ydCAmYXVkaW9Qb3J0LCBpbnQgaW5kZXgpCi17Ci0gICAgY25vZGUgKm5vZGUgPSByb290LT5maXJzdF9jaGlsZDsKLQotICAgIHNwPEF1ZGlvR2Fpbj4gZ2FpbiA9IG5ldyBBdWRpb0dhaW4oaW5kZXgsIGF1ZGlvUG9ydC51c2VJbnB1dENoYW5uZWxNYXNrKCkpOwotCi0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01PREUpID09IDApIHsKLSAgICAgICAgICAgIGdhaW4tPnNldE1vZGUoR2Fpbk1vZGVDb252ZXJ0ZXI6Om1hc2tGcm9tU3RyaW5nKG5vZGUtPnZhbHVlKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fQ0hBTk5FTFMpID09IDApIHsKLSAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1hc2s7Ci0gICAgICAgICAgICBpZiAoYXVkaW9Qb3J0LnVzZUlucHV0Q2hhbm5lbE1hc2soKSkgewotICAgICAgICAgICAgICAgIGlmIChJbnB1dENoYW5uZWxDb252ZXJ0ZXI6OmZyb21TdHJpbmcobm9kZS0+dmFsdWUsIG1hc2spKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdhaW4tPnNldENoYW5uZWxNYXNrKG1hc2spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKE91dHB1dENoYW5uZWxDb252ZXJ0ZXI6OmZyb21TdHJpbmcobm9kZS0+dmFsdWUsIG1hc2spKSB7Ci0gICAgICAgICAgICAgICAgICAgIGdhaW4tPnNldENoYW5uZWxNYXNrKG1hc2spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NSU5fVkFMVUUpID09IDApIHsKLSAgICAgICAgICAgIGdhaW4tPnNldE1pblZhbHVlSW5NYihhdG9pKG5vZGUtPnZhbHVlKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fTUFYX1ZBTFVFKSA9PSAwKSB7Ci0gICAgICAgICAgICBnYWluLT5zZXRNYXhWYWx1ZUluTWIoYXRvaShub2RlLT52YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX0RFRkFVTFRfVkFMVUUpID09IDApIHsKLSAgICAgICAgICAgIGdhaW4tPnNldERlZmF1bHRWYWx1ZUluTWIoYXRvaShub2RlLT52YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX1NURVBfVkFMVUUpID09IDApIHsKLSAgICAgICAgICAgIGdhaW4tPnNldFN0ZXBWYWx1ZUluTWIoYXRvaShub2RlLT52YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01JTl9SQU1QX01TKSA9PSAwKSB7Ci0gICAgICAgICAgICBnYWluLT5zZXRNaW5SYW1wSW5NcyhhdG9pKG5vZGUtPnZhbHVlKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fTUFYX1JBTVBfTVMpID09IDApIHsKLSAgICAgICAgICAgIGdhaW4tPnNldE1heFJhbXBJbk1zKGF0b2kobm9kZS0+dmFsdWUpKTsKLSAgICAgICAgfQotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0KLSAgICBBTE9HVigibG9hZEdhaW4oKSBhZGRpbmcgbmV3IGdhaW4gbW9kZSAlMDh4IGNoYW5uZWwgbWFzayAlMDh4IG1pbiBtQiAlZCBtYXggbUIgJWQiLAotICAgICAgICAgIGdhaW4tPmdldE1vZGUoKSwgZ2Fpbi0+Z2V0Q2hhbm5lbE1hc2soKSwgZ2Fpbi0+Z2V0TWluVmFsdWVJbk1iKCksCi0gICAgICAgICAgZ2Fpbi0+Z2V0TWF4VmFsdWVJbk1iKCkpOwotCi0gICAgaWYgKGdhaW4tPmdldE1vZGUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYXVkaW9Qb3J0Lm1HYWlucy5hZGQoZ2Fpbik7Ci19Ci0KLXZvaWQgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkQXVkaW9Qb3J0R2FpbnMoY25vZGUgKnJvb3QsIEF1ZGlvUG9ydCAmYXVkaW9Qb3J0KQotewotICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0gICAgaW50IGluZGV4ID0gMDsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBBTE9HVigibG9hZEdhaW5zKCkgbG9hZGluZyBnYWluICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgIGxvYWRBdWRpb1BvcnRHYWluKG5vZGUsIGF1ZGlvUG9ydCwgaW5kZXgrKyk7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLX0KLQotLy9zdGF0aWMKLXZvaWQgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkRGV2aWNlRGVzY3JpcHRvckdhaW5zKGNub2RlICpyb290LCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlRGVzYykKLXsKLSAgICBsb2FkQXVkaW9Qb3J0R2FpbnMocm9vdCwgKmRldmljZURlc2MpOwotICAgIGlmIChkZXZpY2VEZXNjLT5tR2FpbnMuc2l6ZSgpID4gMCkgewotICAgICAgICBkZXZpY2VEZXNjLT5tR2FpbnNbMF0tPmdldERlZmF1bHRDb25maWcoJmRldmljZURlc2MtPm1HYWluKTsKLSAgICB9Ci19Ci0KLS8vc3RhdGljCi1zdGF0dXNfdCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRId01vZHVsZURldmljZShjbm9kZSAqcm9vdCwgRGV2aWNlVmVjdG9yICZkZXZpY2VzKQotewotICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0KLSAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IEFVRElPX0RFVklDRV9OT05FOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgQVBNX0RFVklDRV9UWVBFKSA9PSAwKSB7Ci0gICAgICAgICAgICBkZXZpY2VGcm9tU3RyaW5nKG5vZGUtPnZhbHVlLCB0eXBlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLSAgICBpZiAodHlwZSA9PSBBVURJT19ERVZJQ0VfTk9ORSB8fAotICAgICAgICAgICAgKCFhdWRpb19pc19pbnB1dF9kZXZpY2UodHlwZSkgJiYgIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UodHlwZSkpKSB7Ci0gICAgICAgIEFMT0dXKCJsb2FkRGV2aWNlKCkgYmFkIHR5cGUgJTA4eCIsIHR5cGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IodHlwZSwgU3RyaW5nOChyb290LT5uYW1lKSk7Ci0KLSAgICBub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBBUE1fREVWSUNFX0FERFJFU1MpID09IDApIHsKLSAgICAgICAgICAgIGRldmljZURlc2MtPm1BZGRyZXNzID0gU3RyaW5nOCgoY2hhciAqKW5vZGUtPnZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgQ0hBTk5FTFNfVEFHKSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKHR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlRGVzYy0+YWRkQXVkaW9Qcm9maWxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEF1ZGlvUHJvZmlsZShnRHluYW1pY0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRDaGFubmVsTWFza3NGcm9tU3RyaW5nKG5vZGUtPnZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlUmF0ZVZlY3RvcigpKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRldmljZURlc2MtPmFkZEF1ZGlvUHJvZmlsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdWRpb1Byb2ZpbGUoZ0R5bmFtaWNGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dENoYW5uZWxNYXNrc0Zyb21TdHJpbmcobm9kZS0+dmFsdWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVSYXRlVmVjdG9yKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTlNfVEFHKSA9PSAwKSB7Ci0gICAgICAgICAgICBsb2FkRGV2aWNlRGVzY3JpcHRvckdhaW5zKG5vZGUsIGRldmljZURlc2MpOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLQotICAgIEFMT0dWKCJsb2FkRGV2aWNlKCkgYWRkaW5nIGRldmljZSB0YWcgKGxpdGVyYWwgdHlwZSkgJXMgdHlwZSAlMDh4IGFkZHJlc3MgJXMiLAotICAgICAgICAgIGRldmljZURlc2MtPmdldFRhZ05hbWUoKS5zdHJpbmcoKSwgdHlwZSwgZGV2aWNlRGVzYy0+bUFkZHJlc3Muc3RyaW5nKCkpOwotCi0gICAgZGV2aWNlcy5hZGQoZGV2aWNlRGVzYyk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vL3N0YXRpYwotc3RhdHVzX3QgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkSHdNb2R1bGVQcm9maWxlKGNub2RlICpyb290LCBzcDxId01vZHVsZT4gJm1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3JvbGVfdCByb2xlKQotewotICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0KLSAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBuZXcgSU9Qcm9maWxlKFN0cmluZzgocm9vdC0+bmFtZSksIHJvbGUpOwotCi0gICAgQXVkaW9Qcm9maWxlVmVjdG9yIGF1ZGlvUHJvZmlsZXM7Ci0gICAgU2FtcGxlUmF0ZVZlY3RvciBzYW1wbGVSYXRlczsKLSAgICBDaGFubmVsc1ZlY3RvciBjaGFubmVsczsKLSAgICBGb3JtYXRWZWN0b3IgZm9ybWF0czsKLQotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgRk9STUFUU19UQUcpID09IDAgJiYKLSAgICAgICAgICAgICAgICBzdHJjbXAobm9kZS0+dmFsdWUsIERZTkFNSUNfVkFMVUVfVEFHKSAhPSAwKSB7Ci0gICAgICAgICAgICBmb3JtYXRzID0gZm9ybWF0c0Zyb21TdHJpbmcobm9kZS0+dmFsdWUpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBTQU1QTElOR19SQVRFU19UQUcpID09IDAgJiYKLSAgICAgICAgICAgICAgICAgIHN0cmNtcChub2RlLT52YWx1ZSwgRFlOQU1JQ19WQUxVRV9UQUcpICE9IDApIHsKLSAgICAgICAgICAgIGNvbGxlY3Rpb25Gcm9tU3RyaW5nPFNhbXBsZVJhdGVUcmFpdHM+KG5vZGUtPnZhbHVlLCBzYW1wbGVSYXRlcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIENIQU5ORUxTX1RBRykgPT0gMCAmJgotICAgICAgICAgICAgICAgICAgIHN0cmNtcChub2RlLT52YWx1ZSwgRFlOQU1JQ19WQUxVRV9UQUcpICE9IDApIHsKLSAgICAgICAgICAgIGlmIChyb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LKSB7Ci0gICAgICAgICAgICAgICAgY2hhbm5lbHMgPSBpbnB1dENoYW5uZWxNYXNrc0Zyb21TdHJpbmcobm9kZS0+dmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBjaGFubmVscyA9IG91dHB1dENoYW5uZWxNYXNrc0Zyb21TdHJpbmcobm9kZS0+dmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBERVZJQ0VTX1RBRykgPT0gMCkgewotICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGRldmljZXM7Ci0gICAgICAgICAgICBsb2FkRGV2aWNlc0Zyb21UYWcobm9kZS0+dmFsdWUsIGRldmljZXMsIG1vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCkpOwotICAgICAgICAgICAgcHJvZmlsZS0+c2V0U3VwcG9ydGVkRGV2aWNlcyhkZXZpY2VzKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgRkxBR1NfVEFHKSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSykgewotICAgICAgICAgICAgICAgIHByb2ZpbGUtPnNldEZsYWdzKElucHV0RmxhZ0NvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcobm9kZS0+dmFsdWUpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcHJvZmlsZS0+c2V0RmxhZ3MoT3V0cHV0RmxhZ0NvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcobm9kZS0+dmFsdWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTlNfVEFHKSA9PSAwKSB7Ci0gICAgICAgICAgICBsb2FkQXVkaW9Qb3J0R2FpbnMobm9kZSwgKnByb2ZpbGUpOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLSAgICBpZiAoZm9ybWF0cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlVG9BZGQgPSBuZXcgQXVkaW9Qcm9maWxlKGdEeW5hbWljRm9ybWF0LCBjaGFubmVscywgc2FtcGxlUmF0ZXMpOwotICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7Ci0gICAgICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY0NoYW5uZWxzKGNoYW5uZWxzLmlzRW1wdHkoKSk7Ci0gICAgICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY1JhdGUoc2FtcGxlUmF0ZXMuaXNFbXB0eSgpKTsKLSAgICAgICAgYXVkaW9Qcm9maWxlcy5hZGQocHJvZmlsZVRvQWRkKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIC8vIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbiwgZm9yIGVhY2ggZm9ybWF0LCBjcmVhdGVzIGEgcHJvZmlsZSB3aXRoIHRoZSBzYW1lCi0gICAgICAgICAgICAvLyBjb2xsZWN0aW9uIG9mIHJhdGUgYW5kIGNoYW5uZWxzLgotICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlVG9BZGQgPSBuZXcgQXVkaW9Qcm9maWxlKGZvcm1hdHNbaV0sIGNoYW5uZWxzLCBzYW1wbGVSYXRlcyk7Ci0gICAgICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNGb3JtYXQoZm9ybWF0c1tpXSA9PSBnRHluYW1pY0Zvcm1hdCk7Ci0gICAgICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNDaGFubmVscyhjaGFubmVscy5pc0VtcHR5KCkpOwotICAgICAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljUmF0ZShzYW1wbGVSYXRlcy5pc0VtcHR5KCkpOwotICAgICAgICAgICAgYXVkaW9Qcm9maWxlcy5hZGQocHJvZmlsZVRvQWRkKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwcm9maWxlLT5zZXRBdWRpb1Byb2ZpbGVzKGF1ZGlvUHJvZmlsZXMpOwotICAgIEFMT0dXX0lGKCFwcm9maWxlLT5oYXNTdXBwb3J0ZWREZXZpY2VzKCksICJsb2FkJXMoKSBpbnZhbGlkIHN1cHBvcnRlZCBkZXZpY2VzIiwKLSAgICAgICAgICAgICByb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LID8gIklucHV0IiA6ICJPdXRwdXQiKTsKLSAgICBpZiAocHJvZmlsZS0+aGFzU3VwcG9ydGVkRGV2aWNlcygpKSB7Ci0gICAgICAgIEFMT0dWKCJsb2FkJXMoKSBhZGRpbmcgU3VwcG9ydGVkIERldmljZXMgJTA0eCwgbUZsYWdzICUwNHgiLAotICAgICAgICAgICAgICByb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LID8gIklucHV0IiA6ICJPdXRwdXQiLAotICAgICAgICAgICAgICBwcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzVHlwZSgpLCBwcm9maWxlLT5nZXRGbGFncygpKTsKLSAgICAgICAgcmV0dXJuIG1vZHVsZS0+YWRkUHJvZmlsZShwcm9maWxlKTsKLSAgICB9Ci0gICAgcmV0dXJuIEJBRF9WQUxVRTsKLX0KLQotLy9zdGF0aWMKLXN0YXR1c190IENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZEh3TW9kdWxlKGNub2RlICpyb290LCBzcDxId01vZHVsZT4gJm1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpCi17Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBERVZJQ0VTX1RBRyk7Ci0gICAgaWYgKG5vZGUgIT0gTlVMTCkgewotICAgICAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7Ci0gICAgICAgIERldmljZVZlY3RvciBkZXZpY2VzOwotICAgICAgICB3aGlsZSAobm9kZSkgewotICAgICAgICAgICAgQUxPR1YoImxvYWRId01vZHVsZSgpIGxvYWRpbmcgZGV2aWNlICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCB0bXBTdGF0dXMgPSBsb2FkSHdNb2R1bGVEZXZpY2Uobm9kZSwgZGV2aWNlcyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5BTUVfTk9UX0ZPVU5EIHx8IHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRtcFN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgICAgICB9Ci0gICAgICAgIG1vZHVsZS0+c2V0RGVjbGFyZWREZXZpY2VzKGRldmljZXMpOwotICAgIH0KLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgT1VUUFVUU19UQUcpOwotICAgIGlmIChub2RlICE9IE5VTEwpIHsKLSAgICAgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgICAgICB3aGlsZSAobm9kZSkgewotICAgICAgICAgICAgQUxPR1YoImxvYWRId01vZHVsZSgpIGxvYWRpbmcgb3V0cHV0ICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCB0bXBTdGF0dXMgPSBsb2FkSHdNb2R1bGVQcm9maWxlKG5vZGUsIG1vZHVsZSwgQVVESU9fUE9SVF9ST0xFX1NPVVJDRSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5BTUVfTk9UX0ZPVU5EIHx8IHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRtcFN0YXR1czsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgICAgICB9Ci0gICAgfQotICAgIG5vZGUgPSBjb25maWdfZmluZChyb290LCBJTlBVVFNfVEFHKTsKLSAgICBpZiAobm9kZSAhPSBOVUxMKSB7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKLSAgICAgICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkSHdNb2R1bGUoKSBsb2FkaW5nIGlucHV0ICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCB0bXBTdGF0dXMgPSBsb2FkSHdNb2R1bGVQcm9maWxlKG5vZGUsIG1vZHVsZSwgQVVESU9fUE9SVF9ST0xFX1NJTkspOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOQU1FX05PVF9GT1VORCB8fCBzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSB0bXBTdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICAgICAgfQotICAgIH0KLSAgICBsb2FkTW9kdWxlR2xvYmFsQ29uZmlnKHJvb3QsIG1vZHVsZSwgY29uZmlnKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi0vL3N0YXRpYwotdm9pZCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRId01vZHVsZXMoY25vZGUgKnJvb3QsIEh3TW9kdWxlQ29sbGVjdGlvbiAmaHdNb2R1bGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDb25maWcgJmNvbmZpZykKLXsKLSAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIEFVRElPX0hXX01PRFVMRV9UQUcpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBBTE9HVigibG9hZEh3TW9kdWxlcygpIGxvYWRpbmcgbW9kdWxlICVzIiwgbm9kZS0+bmFtZSk7Ci0gICAgICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBuZXcgSHdNb2R1bGUobm9kZS0+bmFtZSk7Ci0gICAgICAgIGlmIChsb2FkSHdNb2R1bGUobm9kZSwgbW9kdWxlLCBjb25maWcpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBod01vZHVsZXMuYWRkKG1vZHVsZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotfQotCi0vL3N0YXRpYwotdm9pZCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWREZXZpY2VzRnJvbVRhZyhjb25zdCBjaGFyICp0YWcsIERldmljZVZlY3RvciAmZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZWNsYXJlZERldmljZXMpCi17Ci0gICAgY2hhciAqdGFnTGl0ZXJhbCA9IHN0cm5kdXAodGFnLCBzdHJsZW4odGFnKSk7Ci0gICAgY2hhciAqZGV2VGFnID0gc3RydG9rKHRhZ0xpdGVyYWwsIEF1ZGlvUGFyYW1ldGVyOjp2YWx1ZUxpc3RTZXBhcmF0b3IpOwotICAgIHdoaWxlIChkZXZUYWcgIT0gTlVMTCkgewotICAgICAgICBpZiAoc3RybGVuKGRldlRhZykgIT0gMCkgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGU7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlRnJvbVN0cmluZyhkZXZUYWcsIHR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgaW5CaXQgPSB0eXBlICYgQVVESU9fREVWSUNFX0JJVF9JTjsKLSAgICAgICAgICAgICAgICB0eXBlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOwotICAgICAgICAgICAgICAgIHdoaWxlICh0eXBlKSB7Ci0gICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgc2luZ2xlVHlwZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbkJpdCB8ICgxIDw8ICgzMSAtIF9fYnVpbHRpbl9jbHoodHlwZSkpKTsKLSAgICAgICAgICAgICAgICAgICAgdHlwZSAmPSB+c2luZ2xlVHlwZTsKLSAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2ID0gbmV3IERldmljZURlc2NyaXB0b3Ioc2luZ2xlVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIGRldmljZXMuYWRkKGRldik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkRGV2aWNlcy5nZXREZXZpY2VGcm9tVGFnTmFtZShTdHJpbmc4KGRldlRhZykpOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2VEZXNjICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlcy5hZGQoZGV2aWNlRGVzYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGRldlRhZyA9IHN0cnRvayhOVUxMLCBBdWRpb1BhcmFtZXRlcjo6dmFsdWVMaXN0U2VwYXJhdG9yKTsKLSAgICB9Ci0gICAgZnJlZSh0YWdMaXRlcmFsKTsKLX0KLQotLy9zdGF0aWMKLXZvaWQgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkTW9kdWxlR2xvYmFsQ29uZmlnKGNub2RlICpyb290LCBjb25zdCBzcDxId01vZHVsZT4gJm1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpCi17Ci0gICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBHTE9CQUxfQ09ORklHX1RBRyk7Ci0KLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRGV2aWNlVmVjdG9yIGRlY2xhcmVkRGV2aWNlczsKLSAgICBpZiAobW9kdWxlICE9IE5VTEwpIHsKLSAgICAgICAgZGVjbGFyZWREZXZpY2VzID0gbW9kdWxlLT5nZXREZWNsYXJlZERldmljZXMoKTsKLSAgICB9Ci0KLSAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgaWYgKHN0cmNtcChBVFRBQ0hFRF9PVVRQVVRfREVWSUNFU19UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKLSAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVPdXRwdXREZXZpY2VzOwotICAgICAgICAgICAgbG9hZERldmljZXNGcm9tVGFnKG5vZGUtPnZhbHVlLCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBkZWNsYXJlZERldmljZXMpOwotICAgICAgICAgICAgQUxPR1YoImxvYWRHbG9iYWxDb25maWcoKSBBdHRhY2hlZCBPdXRwdXQgRGV2aWNlcyAlMDh4IiwKLSAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSk7Ci0gICAgICAgICAgICBjb25maWcuYWRkQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyhhdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoREVGQVVMVF9PVVRQVVRfREVWSUNFX1RBRywgbm9kZS0+bmFtZSkgPT0gMCkgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOwotICAgICAgICAgICAgZGV2aWNlRnJvbVN0cmluZyhub2RlLT52YWx1ZSwgZGV2aWNlKTsKLSAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZWZhdWx0T3V0cHV0RGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBjb25maWcuc2V0RGVmYXVsdE91dHB1dERldmljZShkZWZhdWx0T3V0cHV0RGV2aWNlKTsKLSAgICAgICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIG1EZWZhdWx0T3V0cHV0RGV2aWNlICUwOHgiLCBkZWZhdWx0T3V0cHV0RGV2aWNlLT50eXBlKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVygibG9hZEdsb2JhbENvbmZpZygpIGRlZmF1bHQgZGV2aWNlIG5vdCBzcGVjaWZpZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoQVRUQUNIRURfSU5QVVRfREVWSUNFU19UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKLSAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVJbnB1dERldmljZXM7Ci0gICAgICAgICAgICBsb2FkRGV2aWNlc0Zyb21UYWcobm9kZS0+dmFsdWUsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgZGVjbGFyZWREZXZpY2VzKTsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgQXZhaWxhYmxlIElucHV0RGV2aWNlcyAlMDh4IiwgYXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkpOwotICAgICAgICAgICAgY29uZmlnLmFkZEF2YWlsYWJsZUlucHV0RGV2aWNlcyhhdmFpbGFibGVJbnB1dERldmljZXMpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChBVURJT19IQUxfVkVSU0lPTl9UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKLSAgICAgICAgICAgIHVpbnQzMl90IG1ham9yLCBtaW5vcjsKLSAgICAgICAgICAgIHNzY2FuZigoY2hhciAqKW5vZGUtPnZhbHVlLCAiJXUuJXUiLCAmbWFqb3IsICZtaW5vcik7Ci0gICAgICAgICAgICBtb2R1bGUtPnNldEhhbFZlcnNpb24obWFqb3IsIG1pbm9yKTsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgbUhhbFZlcnNpb24gPSBtYWpvciAldSBtaW5vciAldSIsIG1ham9yLCBtaW5vcik7Ci0gICAgICAgIH0KLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotfQotCi0vL3N0YXRpYwotdm9pZCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRHbG9iYWxDb25maWcoY25vZGUgKnJvb3QsIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxId01vZHVsZT4mIHByaW1hcnlNb2R1bGUpCi17Ci0gICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBHTE9CQUxfQ09ORklHX1RBRyk7Ci0KLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChzdHJjbXAoU1BFQUtFUl9EUkNfRU5BQkxFRF9UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKLSAgICAgICAgICAgIGJvb2wgc3BlYWtlckRyY0VuYWJsZWQ7Ci0gICAgICAgICAgICBpZiAodXRpbGl0aWVzOjpjb252ZXJ0VG88c3RkOjpzdHJpbmcsIGJvb2w+KG5vZGUtPnZhbHVlLCBzcGVha2VyRHJjRW5hYmxlZCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIG1TcGVha2VyRHJjRW5hYmxlZCA9ICVkIiwgc3BlYWtlckRyY0VuYWJsZWQpOwotICAgICAgICAgICAgICAgIGNvbmZpZy5zZXRTcGVha2VyRHJjRW5hYmxlZChzcGVha2VyRHJjRW5hYmxlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotICAgIGxvYWRNb2R1bGVHbG9iYWxDb25maWcocm9vdCwgcHJpbWFyeU1vZHVsZSwgY29uZmlnKTsKLX0KLQotLy9zdGF0aWMKLXN0YXR1c190IENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZENvbmZpZyhjb25zdCBjaGFyICpwYXRoLCBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKQotewotICAgIGNub2RlICpyb290OwotICAgIGNoYXIgKmRhdGE7Ci0KLSAgICBkYXRhID0gKGNoYXIgKilsb2FkX2ZpbGUocGF0aCwgTlVMTCk7Ci0gICAgaWYgKGRhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcm9vdCA9IGNvbmZpZ19ub2RlKCIiLCAiIik7Ci0gICAgY29uZmlnX2xvYWQocm9vdCwgZGF0YSk7Ci0KLSAgICBId01vZHVsZUNvbGxlY3Rpb24gaHdNb2R1bGVzOwotICAgIGxvYWRId01vZHVsZXMocm9vdCwgaHdNb2R1bGVzLCBjb25maWcpOwotCi0gICAgLy8gbGVnYWN5IGF1ZGlvX3BvbGljeS5jb25mIGZpbGVzIGhhdmUgb25lIGdsb2JhbF9jb25maWd1cmF0aW9uIHNlY3Rpb24sIGF0dGFjaGVkIHRvIHByaW1hcnkuCi0gICAgbG9hZEdsb2JhbENvbmZpZyhyb290LCBjb25maWcsIGh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSkpOwotCi0gICAgY29uZmlnLnNldEh3TW9kdWxlcyhod01vZHVsZXMpOwotCi0gICAgY29uZmlnX2ZyZWUocm9vdCk7Ci0gICAgZnJlZShyb290KTsKLSAgICBmcmVlKGRhdGEpOwotCi0gICAgQUxPR0koImxvYWRBdWRpb1BvbGljeUNvbmZpZygpIGxvYWRlZCAlc1xuIiwgcGF0aCk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0RldmljZURlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAKaW5kZXggMTljMjA2Mi4uZWNkNWIzNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvRGV2aWNlRGVzY3JpcHRvci5jcHAKQEAgLTE4LDYgKzE4LDggQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3N0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlIDxzZXQ+CiAjaW5jbHVkZSAiRGV2aWNlRGVzY3JpcHRvci5oIgogI2luY2x1ZGUgIlR5cGVDb252ZXJ0ZXIuaCIKICNpbmNsdWRlICJBdWRpb0dhaW4uaCIKQEAgLTI2LDE0ICsyOCwzMCBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBEZXZpY2VEZXNjcmlwdG9yOjpEZXZpY2VEZXNjcmlwdG9yKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBTdHJpbmc4ICZ0YWdOYW1lKSA6CisgICAgICAgIERldmljZURlc2NyaXB0b3IodHlwZSwgRm9ybWF0VmVjdG9ye30sIHRhZ05hbWUpCit7Cit9CisKK0RldmljZURlc2NyaXB0b3I6OkRldmljZURlc2NyaXB0b3IoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IEZvcm1hdFZlY3RvciAmZW5jb2RlZEZvcm1hdHMsCisgICAgICAgIGNvbnN0IFN0cmluZzggJnRhZ05hbWUpIDoKICAgICBBdWRpb1BvcnQoU3RyaW5nOCgiIiksIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UsCiAgICAgICAgICAgICAgIGF1ZGlvX2lzX291dHB1dF9kZXZpY2UodHlwZSkgPyBBVURJT19QT1JUX1JPTEVfU0lOSyA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX1JPTEVfU09VUkNFKSwKLSAgICBtQWRkcmVzcygiIiksIG1UYWdOYW1lKHRhZ05hbWUpLCBtRGV2aWNlVHlwZSh0eXBlKSwgbUlkKDApCisgICAgbVRhZ05hbWUodGFnTmFtZSksIG1EZXZpY2VUeXBlKHR5cGUpLCBtRW5jb2RlZEZvcm1hdHMoZW5jb2RlZEZvcm1hdHMpCiB7Ci0gICAgaWYgKHR5cGUgPT0gQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVggfHwgdHlwZSA9PSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVggKSB7CisgICAgbUN1cnJlbnRFbmNvZGVkRm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQ7CisgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKHR5cGUpKSB7CiAgICAgICAgIG1BZGRyZXNzID0gU3RyaW5nOCgiMCIpOwogICAgIH0KKyAgICAvKiBJZiBmcmFtZXdvcmsgcnVucyBhZ2FpbnN0IGEgcHJlIDUuMCBBdWRpbyBIQUwsIGVuY29kZWQgZm9ybWF0cyBhcmUgYWJzZW50IGZyb20gdGhlIGNvbmZpZy4KKyAgICAgKiBGSVhNRTogQVBNIHNob3VsZCBrbm93IHRoZSB2ZXJzaW9uIG9mIHRoZSBIQUwgYW5kIGRvbid0IGFkZCB0aGUgZm9ybWF0cyBmb3IgVjUuMC4KKyAgICAgKiBGb3Igbm93LCB0aGUgd29ya2Fyb3VuZCB0byByZW1vdmUgQUMzIGFuZCBJRUM2MTkzNyBzdXBwb3J0IG9uIEhETUkgaXMgdG8gZGVjbGFyZQorICAgICAqIHNvbWV0aGluZyBsaWtlICdlbmNvZGVkRm9ybWF0cz0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiJyBvbiB0aGUgSERNSSBkZXZpY2VQb3J0LgorICAgICAqLworICAgIGlmICh0eXBlID09IEFVRElPX0RFVklDRV9PVVRfSERNSSAmJiBtRW5jb2RlZEZvcm1hdHMuaXNFbXB0eSgpKSB7CisgICAgICAgIG1FbmNvZGVkRm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0FDMyk7CisgICAgICAgIG1FbmNvZGVkRm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0lFQzYxOTM3KTsKKyAgICB9CiB9CiAKIGF1ZGlvX3BvcnRfaGFuZGxlX3QgRGV2aWNlRGVzY3JpcHRvcjo6Z2V0SWQoKSBjb25zdApAQCAtNDcsMTUgKzY1LDU3IEBACiAgICAgbUlkID0gZ2V0TmV4dFVuaXF1ZUlkKCk7CiB9CiAKK3ZvaWQgRGV2aWNlRGVzY3JpcHRvcjo6ZGV0YWNoKCkgeworICAgIG1JZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgQXVkaW9Qb3J0OjpkZXRhY2goKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgY2hlY2tFcXVhbChjb25zdCBUJiBmMSwgY29uc3QgVCYgZjIpCit7CisgICAgc3RkOjpzZXQ8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4gczEoZjEuYmVnaW4oKSwgZjEuZW5kKCkpOworICAgIHN0ZDo6c2V0PHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGU+IHMyKGYyLmJlZ2luKCksIGYyLmVuZCgpKTsKKyAgICByZXR1cm4gczEgPT0gczI7Cit9CisKIGJvb2wgRGV2aWNlRGVzY3JpcHRvcjo6ZXF1YWxzKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBvdGhlcikgY29uc3QKIHsKICAgICAvLyBEZXZpY2VzIGFyZSBjb25zaWRlcmVkIGVxdWFsIGlmIHRoZXk6CiAgICAgLy8gLSBhcmUgb2YgdGhlIHNhbWUgdHlwZSAoYSBkZXZpY2UgdHlwZSBjYW5ub3QgYmUgQVVESU9fREVWSUNFX05PTkUpCiAgICAgLy8gLSBoYXZlIHRoZSBzYW1lIGFkZHJlc3MKKyAgICAvLyAtIGhhdmUgdGhlIHNhbWUgZW5jb2RpbmdGb3JtYXRzIChpZiBkZXZpY2Ugc3VwcG9ydHMgZW5jb2RpbmcpCiAgICAgaWYgKG90aGVyID09IDApIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gKG1EZXZpY2VUeXBlID09IG90aGVyLT5tRGV2aWNlVHlwZSkgJiYgKG1BZGRyZXNzID09IG90aGVyLT5tQWRkcmVzcyk7CisKKyAgICByZXR1cm4gKG1EZXZpY2VUeXBlID09IG90aGVyLT5tRGV2aWNlVHlwZSkgJiYgKG1BZGRyZXNzID09IG90aGVyLT5tQWRkcmVzcykgJiYKKyAgICAgICAgICAgY2hlY2tFcXVhbChtRW5jb2RlZEZvcm1hdHMsIG90aGVyLT5tRW5jb2RlZEZvcm1hdHMpOworfQorCitib29sIERldmljZURlc2NyaXB0b3I6Omhhc0N1cnJlbnRFbmNvZGVkRm9ybWF0KCkgY29uc3QKK3sKKyAgICBpZiAoIWRldmljZV9oYXNfZW5jb2RpbmdfY2FwYWJpbGl0eSh0eXBlKCkpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAobUVuY29kZWRGb3JtYXRzLmlzRW1wdHkoKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gKG1DdXJyZW50RW5jb2RlZEZvcm1hdCAhPSBBVURJT19GT1JNQVRfREVGQVVMVCk7Cit9CisKK2Jvb2wgRGV2aWNlRGVzY3JpcHRvcjo6c3VwcG9ydHNGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQoreworICAgIGlmIChtRW5jb2RlZEZvcm1hdHMuaXNFbXB0eSgpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byYgZGV2Rm9ybWF0IDogbUVuY29kZWRGb3JtYXRzKSB7CisgICAgICAgIGlmIChkZXZGb3JtYXQgPT0gZm9ybWF0KSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgRGV2aWNlVmVjdG9yOjpyZWZyZXNoVHlwZXMoKQpAQCAtNzAsNyArMTMwLDcgQEAKIHNzaXplX3QgRGV2aWNlVmVjdG9yOjppbmRleE9mKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKSBjb25zdAogewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKGl0ZW0tPmVxdWFscyhpdGVtQXQoaSkpKSB7CisgICAgICAgIGlmIChpdGVtQXQoaSktPmVxdWFscyhpdGVtKSkgeyAvLyBpdGVtIG1heSBiZSBudWxsIHNwPD4sIGkuZS4gQVVESU9fREVWSUNFX05PTkUKICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTIxLDcwICsxODEsODQgQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1hdWRpb19kZXZpY2VzX3QgRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VzRnJvbUh3TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGVIYW5kbGUpIGNvbnN0Cit2b2lkIERldmljZVZlY3Rvcjo6cmVtb3ZlKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykKIHsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IEFVRElPX0RFVklDRV9OT05FOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKGl0ZW1BdChpKS0+Z2V0TW9kdWxlSGFuZGxlKCkgPT0gbW9kdWxlSGFuZGxlKSB7Ci0gICAgICAgICAgICBkZXZpY2VzIHw9IGl0ZW1BdChpKS0+dHlwZSgpOworICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogZGV2aWNlcykgeworICAgICAgICByZW1vdmUoZGV2aWNlKTsKKyAgICB9Cit9CisKK0RldmljZVZlY3RvciBEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tSHdNb2R1bGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZUhhbmRsZSkgY29uc3QKK3sKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6ICp0aGlzKSB7CisgICAgICAgIGlmIChkZXZpY2UtPmdldE1vZHVsZUhhbmRsZSgpID09IG1vZHVsZUhhbmRsZSkgeworICAgICAgICAgICAgZGV2aWNlcy5hZGQoZGV2aWNlKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZGV2aWNlczsKIH0KIAotc3A8RGV2aWNlRGVzY3JpcHRvcj4gRGV2aWNlVmVjdG9yOjpnZXREZXZpY2UoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MpIGNvbnN0CithdWRpb19kZXZpY2VzX3QgRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VUeXBlc0Zyb21Id01vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlSGFuZGxlKSBjb25zdAoreworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlcyA9IEFVRElPX0RFVklDRV9OT05FOworICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogKnRoaXMpIHsKKyAgICAgICAgaWYgKGRldmljZS0+Z2V0TW9kdWxlSGFuZGxlKCkgPT0gbW9kdWxlSGFuZGxlKSB7CisgICAgICAgICAgICBkZXZpY2VUeXBlcyB8PSBkZXZpY2UtPnR5cGUoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGV2aWNlVHlwZXM7Cit9CisKK3NwPERldmljZURlc2NyaXB0b3I+IERldmljZVZlY3Rvcjo6Z2V0RGV2aWNlKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdAogewogICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIGlmIChpdGVtQXQoaSktPnR5cGUoKSA9PSB0eXBlKSB7Ci0gICAgICAgICAgICBpZiAoYWRkcmVzcyA9PSAiIiB8fCBpdGVtQXQoaSktPm1BZGRyZXNzID09IGFkZHJlc3MpIHsKKyAgICAgICAgICAgIC8vIElmIGZvcm1hdCBpcyBzcGVjaWZpZWQsIG1hdGNoIGl0IGFuZCBpZ25vcmUgYWRkcmVzcworICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGlmIGFkZHJlc3MgaXMgc3BlY2lmaWVkIG1hdGNoIGl0CisgICAgICAgICAgICAvLyBPdGhlcndpc2UgYWx3YXlzIG1hdGNoCisgICAgICAgICAgICBpZiAoKChhZGRyZXNzID09ICIiIHx8IGl0ZW1BdChpKS0+YWRkcmVzcygpID09IGFkZHJlc3MpICYmCisgICAgICAgICAgICAgICAgIGZvcm1hdCA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgfHwKKyAgICAgICAgICAgICAgICAoaXRlbUF0KGkpLT5zdXBwb3J0c0Zvcm1hdChmb3JtYXQpICYmIGZvcm1hdCAhPSBBVURJT19GT1JNQVRfREVGQVVMVCkpIHsKICAgICAgICAgICAgICAgICBkZXZpY2UgPSBpdGVtQXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+bUFkZHJlc3MgPT0gYWRkcmVzcykgeworICAgICAgICAgICAgICAgIGlmIChpdGVtQXQoaSktPmFkZHJlc3MoKSA9PSBhZGRyZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICBBTE9HVigiRGV2aWNlVmVjdG9yOjpnZXREZXZpY2UoKSBmb3IgdHlwZSAlMDh4IGFkZHJlc3MgJXMgZm91bmQgJXAiLAotICAgICAgICAgIHR5cGUsIGFkZHJlc3Muc3RyaW5nKCksIGRldmljZS5nZXQoKSk7CisgICAgQUxPR1YoIkRldmljZVZlY3Rvcjo6JXMoKSBmb3IgdHlwZSAlMDh4IGFkZHJlc3MgXCIlc1wiIGZvdW5kICVwIGZvcm1hdCAlMDh4IiwKKyAgICAgICAgICAgIF9fZnVuY19fLCB0eXBlLCBhZGRyZXNzLnN0cmluZygpLCBkZXZpY2UuZ2V0KCksIGZvcm1hdCk7CiAgICAgcmV0dXJuIGRldmljZTsKIH0KIAogc3A8RGV2aWNlRGVzY3JpcHRvcj4gRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3QKIHsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6ICp0aGlzKSB7Ci0gICAgICAgIGlmIChkZXZpY2UtPmdldElkKCkgPT0gaWQpIHsKLSAgICAgICAgICAgIHJldHVybiBkZXZpY2U7CisgICAgaWYgKGlkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiAqdGhpcykgeworICAgICAgICAgICAgaWYgKGRldmljZS0+Z2V0SWQoKSA9PSBpZCkgeworICAgICAgICAgICAgICAgIHJldHVybiBkZXZpY2U7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLURldmljZVZlY3RvciBEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tVHlwZShhdWRpb19kZXZpY2VzX3QgdHlwZSkgY29uc3QKK0RldmljZVZlY3RvciBEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tVHlwZU1hc2soYXVkaW9fZGV2aWNlc190IHR5cGUpIGNvbnN0CiB7CiAgICAgRGV2aWNlVmVjdG9yIGRldmljZXM7CiAgICAgYm9vbCBpc091dHB1dCA9IGF1ZGlvX2lzX291dHB1dF9kZXZpY2VzKHR5cGUpOwogICAgIHR5cGUgJj0gfkFVRElPX0RFVklDRV9CSVRfSU47CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IChpIDwgc2l6ZSgpKSAmJiAodHlwZSAhPSBBVURJT19ERVZJQ0VfTk9ORSk7IGkrKykgewotICAgICAgICBib29sIGN1cklzT3V0cHV0ID0gYXVkaW9faXNfb3V0cHV0X2RldmljZXMoaXRlbUF0KGkpLT5tRGV2aWNlVHlwZSk7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJUeXBlID0gaXRlbUF0KGkpLT5tRGV2aWNlVHlwZSAmIH5BVURJT19ERVZJQ0VfQklUX0lOOworICAgICAgICBib29sIGN1cklzT3V0cHV0ID0gYXVkaW9faXNfb3V0cHV0X2RldmljZXMoaXRlbUF0KGkpLT50eXBlKCkpOworICAgICAgICBhdWRpb19kZXZpY2VzX3QgY3VyVHlwZSA9IGl0ZW1BdChpKS0+dHlwZSgpICYgfkFVRElPX0RFVklDRV9CSVRfSU47CiAgICAgICAgIGlmICgoaXNPdXRwdXQgPT0gY3VySXNPdXRwdXQpICYmICgodHlwZSAmIGN1clR5cGUpICE9IDApKSB7CiAgICAgICAgICAgICBkZXZpY2VzLmFkZChpdGVtQXQoaSkpOwogICAgICAgICAgICAgdHlwZSAmPSB+Y3VyVHlwZTsKLSAgICAgICAgICAgIEFMT0dWKCJEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tVHlwZSgpIGZvciB0eXBlICV4IGZvdW5kICVwIiwKLSAgICAgICAgICAgICAgICAgIGl0ZW1BdChpKS0+dHlwZSgpLCBpdGVtQXQoaSkuZ2V0KCkpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBkZXZpY2VzOwotfQotCi1EZXZpY2VWZWN0b3IgRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VzRnJvbVR5cGVBZGRyKAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3QgU3RyaW5nOCYgYWRkcmVzcykgY29uc3QKLXsKLSAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6ICp0aGlzKSB7Ci0gICAgICAgIGlmIChkZXZpY2UtPnR5cGUoKSA9PSB0eXBlICYmIGRldmljZS0+bUFkZHJlc3MgPT0gYWRkcmVzcykgewotICAgICAgICAgICAgZGV2aWNlcy5hZGQoZGV2aWNlKTsKKyAgICAgICAgICAgIEFMT0dWKCJEZXZpY2VWZWN0b3I6OiVzKCkgZm9yIHR5cGUgJTA4eCBmb3VuZCAlcCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBpdGVtQXQoaSktPnR5cGUoKSwgaXRlbUF0KGkpLmdldCgpKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZGV2aWNlczsKQEAgLTIwMCwyMCArMjc0LDE1IEBACiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLXN0YXR1c190IERldmljZVZlY3Rvcjo6ZHVtcChpbnQgZmQsIGNvbnN0IFN0cmluZzggJnRhZywgaW50IHNwYWNlcywgYm9vbCB2ZXJib3NlKSBjb25zdAordm9pZCBEZXZpY2VWZWN0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBjb25zdCBTdHJpbmc4ICZ0YWcsIGludCBzcGFjZXMsIGJvb2wgdmVyYm9zZSkgY29uc3QKIHsKICAgICBpZiAoaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gJXMgZGV2aWNlczpcbiIsIHNwYWNlcywgIiIsIHRhZy5zdHJpbmcoKSk7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtICVzIGRldmljZXM6XG4iLCBzcGFjZXMsICIiLCB0YWcuc3RyaW5nKCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaXRlbUF0KGkpLT5kdW1wKGZkLCBzcGFjZXMgKyAyLCBpLCB2ZXJib3NlKTsKKyAgICAgICAgaXRlbUF0KGkpLT5kdW1wKGRzdCwgc3BhY2VzICsgMiwgaSwgdmVyYm9zZSk7CiAgICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogdm9pZCBEZXZpY2VEZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKQEAgLTI0NiwxOSArMzE1LDE4IEBACiAgICAgLy8gd2l0aG91dCB0aGUgdGVzdD8KICAgICAvLyBUaGlzIGhhcyBiZWVuIGRlbW9uc3RyYXRlZCB0byBOT1QgYmUgdHJ1ZSAoYXQgc3RhcnQgdXApCiAgICAgLy8gQUxPR19BU1NFUlQobU1vZHVsZSAhPSBOVUxMKTsKLSAgICBkc3RDb25maWctPmV4dC5kZXZpY2UuaHdfbW9kdWxlID0KLSAgICAgICAgICAgIG1Nb2R1bGUgIT0gMCA/IG1Nb2R1bGUtPmdldEhhbmRsZSgpIDogQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FOworICAgIGRzdENvbmZpZy0+ZXh0LmRldmljZS5od19tb2R1bGUgPSBnZXRNb2R1bGVIYW5kbGUoKTsKICAgICAodm9pZClhdWRpb191dGlsc19zdHJsY3B5X3plcm9maWxsKGRzdENvbmZpZy0+ZXh0LmRldmljZS5hZGRyZXNzLCBtQWRkcmVzcy5zdHJpbmcoKSk7CiB9CiAKIHZvaWQgRGV2aWNlRGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0CiB7Ci0gICAgQUxPR1YoIkRldmljZURlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KCkgaGFuZGxlICVkIHR5cGUgJXgiLCBtSWQsIG1EZXZpY2VUeXBlKTsKKyAgICBBTE9HVigiRGV2aWNlRGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoKSBoYW5kbGUgJWQgdHlwZSAlMDh4IiwgbUlkLCBtRGV2aWNlVHlwZSk7CiAgICAgQXVkaW9Qb3J0Ojp0b0F1ZGlvUG9ydChwb3J0KTsKICAgICBwb3J0LT5pZCA9IG1JZDsKICAgICB0b0F1ZGlvUG9ydENvbmZpZygmcG9ydC0+YWN0aXZlX2NvbmZpZyk7CiAgICAgcG9ydC0+ZXh0LmRldmljZS50eXBlID0gbURldmljZVR5cGU7Ci0gICAgcG9ydC0+ZXh0LmRldmljZS5od19tb2R1bGUgPSBtTW9kdWxlLT5nZXRIYW5kbGUoKTsKKyAgICBwb3J0LT5leHQuZGV2aWNlLmh3X21vZHVsZSA9IGdldE1vZHVsZUhhbmRsZSgpOwogICAgICh2b2lkKWF1ZGlvX3V0aWxzX3N0cmxjcHlfemVyb2ZpbGwocG9ydC0+ZXh0LmRldmljZS5hZGRyZXNzLCBtQWRkcmVzcy5zdHJpbmcoKSk7CiB9CiAKQEAgLTI3MCw0MiArMzM4LDgzIEBACiAgICAgcG9ydC0+cGlja0F1ZGlvUHJvZmlsZShtU2FtcGxpbmdSYXRlLCBtQ2hhbm5lbE1hc2ssIG1Gb3JtYXQpOwogfQogCi1zdGF0dXNfdCBEZXZpY2VEZXNjcmlwdG9yOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4LCBib29sIHZlcmJvc2UpIGNvbnN0Cit2b2lkIERldmljZURlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgsIGJvb2wgdmVyYm9zZSkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0RldmljZSAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzRGV2aWNlICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXggKyAxKTsKICAgICBpZiAobUlkICE9IDApIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBpZDogJTJkXG4iLCBzcGFjZXMsICIiLCBtSWQpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIGlkOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1JZCk7CiAgICAgfQogICAgIGlmICghbVRhZ05hbWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gdGFnIG5hbWU6ICVzXG4iLCBzcGFjZXMsICIiLCBtVGFnTmFtZS5zdHJpbmcoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gdGFnIG5hbWU6ICVzXG4iLCBzcGFjZXMsICIiLCBtVGFnTmFtZS5zdHJpbmcoKSk7CiAgICAgfQotICAgIHN0ZDo6c3RyaW5nIGRldmljZUxpdGVyYWw7Ci0gICAgaWYgKGRldmljZVRvU3RyaW5nKG1EZXZpY2VUeXBlLCBkZXZpY2VMaXRlcmFsKSkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHR5cGU6ICUtNDhzXG4iLCBzcGFjZXMsICIiLCBkZXZpY2VMaXRlcmFsLmNfc3RyKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQotICAgIGlmIChtQWRkcmVzcy5zaXplKCkgIT0gMCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGFkZHJlc3M6ICUtMzJzXG4iLCBzcGFjZXMsICIiLCBtQWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB9Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgQXVkaW9Qb3J0OjpkdW1wKGZkLCBzcGFjZXMsIHZlcmJvc2UpOwogCi0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIHR5cGU6ICUtNDhzXG4iLCBzcGFjZXMsICIiLCA6OmFuZHJvaWQ6OnRvU3RyaW5nKG1EZXZpY2VUeXBlKS5jX3N0cigpKTsKKworICAgIGlmIChtQWRkcmVzcy5zaXplKCkgIT0gMCkgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBhZGRyZXNzOiAlLTMyc1xuIiwgc3BhY2VzLCAiIiwgbUFkZHJlc3Muc3RyaW5nKCkpOworICAgIH0KKyAgICBBdWRpb1BvcnQ6OmR1bXAoZHN0LCBzcGFjZXMsIHZlcmJvc2UpOworfQorCitzdGQ6OnN0cmluZyBEZXZpY2VEZXNjcmlwdG9yOjp0b1N0cmluZygpIGNvbnN0Cit7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3N0cmVhbTsKKyAgICBzc3RyZWFtIDw8ICJ0eXBlOjB4IiA8PCBzdGQ6OmhleCA8PCB0eXBlKCkgPDwgIixAOiIgPDwgbUFkZHJlc3M7CisgICAgcmV0dXJuIHNzdHJlYW0uc3RyKCk7Cit9CisKK3N0ZDo6c3RyaW5nIERldmljZVZlY3Rvcjo6dG9TdHJpbmcoKSBjb25zdAoreworICAgIGlmIChpc0VtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIHsiQVVESU9fREVWSUNFX05PTkUifTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0ID0geyJ7In07CisgICAgZm9yIChjb25zdCBhdXRvICZkZXZpY2UgOiAqdGhpcykgeworICAgICAgICBpZiAoZGV2aWNlICE9ICpiZWdpbigpKSB7CisgICAgICAgICAgIHJlc3VsdCArPSAiOyI7CisgICAgICAgIH0KKyAgICAgICAgcmVzdWx0ICs9IGRldmljZS0+dG9TdHJpbmcoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdCArICJ9IjsKK30KKworRGV2aWNlVmVjdG9yIERldmljZVZlY3Rvcjo6ZmlsdGVyKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3QKK3sKKyAgICBEZXZpY2VWZWN0b3IgZmlsdGVyZWREZXZpY2VzOworICAgIGZvciAoY29uc3QgYXV0byAmZGV2aWNlIDogKnRoaXMpIHsKKyAgICAgICAgaWYgKGRldmljZXMuY29udGFpbnMoZGV2aWNlKSkgeworICAgICAgICAgICAgZmlsdGVyZWREZXZpY2VzLmFkZChkZXZpY2UpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmaWx0ZXJlZERldmljZXM7Cit9CisKK2Jvb2wgRGV2aWNlVmVjdG9yOjpjb250YWluc0F0TGVhc3RPbmUoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdAoreworICAgIHJldHVybiAhZmlsdGVyKGRldmljZXMpLmlzRW1wdHkoKTsKK30KKworYm9vbCBEZXZpY2VWZWN0b3I6OmNvbnRhaW5zQWxsRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0Cit7CisgICAgcmV0dXJuIGZpbHRlcihkZXZpY2VzKS5zaXplKCkgPT0gZGV2aWNlcy5zaXplKCk7Cit9CisKK0RldmljZVZlY3RvciBEZXZpY2VWZWN0b3I6OmZpbHRlckZvckVuZ2luZSgpIGNvbnN0Cit7CisgICAgRGV2aWNlVmVjdG9yIGZpbHRlcmVkRGV2aWNlczsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmRldmljZSA6ICp0aGlzKSB7CisgICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShkZXZpY2UtPnR5cGUoKSkgJiYgZGV2aWNlLT5hZGRyZXNzKCkgIT0gIjAiKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBmaWx0ZXJlZERldmljZXMuYWRkKGRldmljZSk7CisgICAgfQorICAgIHJldHVybiBmaWx0ZXJlZERldmljZXM7CiB9CiAKIHZvaWQgRGV2aWNlRGVzY3JpcHRvcjo6bG9nKCkgY29uc3QKIHsKLSAgICBzdGQ6OnN0cmluZyBkZXZpY2U7Ci0gICAgZGV2aWNlVG9TdHJpbmcobURldmljZVR5cGUsIGRldmljZSk7Ci0gICAgQUxPR0koIkRldmljZSBpZDolZCB0eXBlOjB4JVg6JXMsIGFkZHI6JXMiLCBtSWQsICBtRGV2aWNlVHlwZSwgZGV2aWNlLmNfc3RyKCksCisgICAgQUxPR0koIkRldmljZSBpZDolZCB0eXBlOjB4JTA4WDolcywgYWRkcjolcyIsIG1JZCwgIG1EZXZpY2VUeXBlLAorICAgICAgICAgIDo6YW5kcm9pZDo6dG9TdHJpbmcobURldmljZVR5cGUpLmNfc3RyKCksCiAgICAgICAgICAgbUFkZHJlc3Muc3RyaW5nKCkpOwogCiAgICAgQXVkaW9Qb3J0Ojpsb2coIiAgIik7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9FZmZlY3REZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0VmZmVjdERlc2NyaXB0b3IuY3BwCmluZGV4IDdiMjM0MWUuLjQxNTk2MmEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0VmZmVjdERlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0VmZmVjdERlc2NyaXB0b3IuY3BwCkBAIC0yMiwyNSArMjIsMTUgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKK3ZvaWQgRWZmZWN0RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgSS9POiAlZFxuIiwgbUlvKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFN0cmF0ZWd5OiAlZFxuIiwgbVN0cmF0ZWd5KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFNlc3Npb246ICVkXG4iLCBtU2Vzc2lvbik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBOYW1lOiAlc1xuIiwgIG1EZXNjLm5hbWUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgJXNcbiIsICBtRW5hYmxlZCA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzSUQ6ICVkXG4iLCBzcGFjZXMsICIiLCBtSWQpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNJL086ICVkXG4iLCBzcGFjZXMsICIiLCBtSW8pOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNNdXNpYyBFZmZlY3Q6ICVzXG4iLCBzcGFjZXMsICIiLCBpc011c2ljRWZmZWN0KCk/ICJ5ZXMiIDogIm5vIik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc1Nlc3Npb246ICVkXG4iLCBzcGFjZXMsICIiLCBtU2Vzc2lvbik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc05hbWU6ICVzXG4iLCBzcGFjZXMsICIiLCAgbURlc2MubmFtZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyVzXG4iLCBzcGFjZXMsICIiLCAgbUVuYWJsZWQgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzJXNcbiIsIHNwYWNlcywgIiIsICBtU3VzcGVuZGVkID8gIlN1c3BlbmRlZCIgOiAiQWN0aXZlIik7CiB9CiAKIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjpFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbigpIDoKQEAgLTUzLDEwICs0MywxNCBAQAogCiBzdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6cmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkLCBib29sIGlzTXVzaWNFZmZlY3QpCiB7CisgICAgaWYgKGdldEVmZmVjdChpZCkgIT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiJXMgZWZmZWN0ICVzIGFscmVhZHkgcmVnaXN0ZXJlZCIsIF9fRlVOQ1RJT05fXywgZGVzYy0+bmFtZSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKICAgICBpZiAobVRvdGFsRWZmZWN0c01lbW9yeSArIGRlc2MtPm1lbW9yeVVzYWdlID4gZ2V0TWF4RWZmZWN0c01lbW9yeSgpKSB7CiAgICAgICAgIEFMT0dXKCJyZWdpc3RlckVmZmVjdCgpIG1lbW9yeSBsaW1pdCBleGNlZWRlZCBmb3IgRnggJXMsIE1lbW9yeSAlZCBLQiIsCiAgICAgICAgICAgICAgICAgZGVzYy0+bmFtZSwgZGVzYy0+bWVtb3J5VXNhZ2UpOwpAQCAtNjYsMzQgKzYwLDM0IEBACiAgICAgaWYgKG1Ub3RhbEVmZmVjdHNNZW1vcnkgPiBtVG90YWxFZmZlY3RzTWVtb3J5TWF4VXNlZCkgewogICAgICAgICBtVG90YWxFZmZlY3RzTWVtb3J5TWF4VXNlZCA9IG1Ub3RhbEVmZmVjdHNNZW1vcnk7CiAgICAgfQotICAgIEFMT0dWKCJyZWdpc3RlckVmZmVjdCgpIGVmZmVjdCAlcywgaW8gJWQsIHN0cmF0ZWd5ICVkIHNlc3Npb24gJWQgaWQgJWQiLAotICAgICAgICAgICAgZGVzYy0+bmFtZSwgaW8sIHN0cmF0ZWd5LCBzZXNzaW9uLCBpZCk7CisgICAgQUxPR1YoInJlZ2lzdGVyRWZmZWN0KCkgZWZmZWN0ICVzLCBpbyAlZCwgc2Vzc2lvbiAlZCBpZCAlZCIsCisgICAgICAgICAgICBkZXNjLT5uYW1lLCBpbywgc2Vzc2lvbiwgaWQpOwogICAgIEFMT0dWKCJyZWdpc3RlckVmZmVjdCgpIG1lbW9yeSAlZCwgdG90YWwgbWVtb3J5ICVkIiwgZGVzYy0+bWVtb3J5VXNhZ2UsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOwogCi0gICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0RGVzYyA9IG5ldyBFZmZlY3REZXNjcmlwdG9yKCk7Ci0gICAgbWVtY3B5ICgmZWZmZWN0RGVzYy0+bURlc2MsIGRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7Ci0gICAgZWZmZWN0RGVzYy0+bUlvID0gaW87Ci0gICAgZWZmZWN0RGVzYy0+bVN0cmF0ZWd5ID0gc3RhdGljX2Nhc3Q8cm91dGluZ19zdHJhdGVneT4oc3RyYXRlZ3kpOwotICAgIGVmZmVjdERlc2MtPm1TZXNzaW9uID0gc2Vzc2lvbjsKLSAgICBlZmZlY3REZXNjLT5tRW5hYmxlZCA9IGZhbHNlOwotCisgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0RGVzYyA9CisgICAgICAgIG5ldyBFZmZlY3REZXNjcmlwdG9yKGRlc2MsIGlzTXVzaWNFZmZlY3QsIGlkLCBpbywgKGF1ZGlvX3Nlc3Npb25fdClzZXNzaW9uKTsKICAgICBhZGQoaWQsIGVmZmVjdERlc2MpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6dW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCitzcDxFZmZlY3REZXNjcmlwdG9yPiBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6Z2V0RWZmZWN0KGludCBpZCkgY29uc3QKIHsKICAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShpZCk7CiAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygidW5yZWdpc3RlckVmZmVjdCgpIHVua25vd24gZWZmZWN0IElEICVkIiwgaWQpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIHZhbHVlQXQoaW5kZXgpOworfQorCitzdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6dW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCit7CisgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0RGVzYyA9IGdldEVmZmVjdChpZCk7CisgICAgaWYgKGVmZmVjdERlc2MgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiJXMgdW5rbm93biBlZmZlY3QgSUQgJWQiLCBfX0ZVTkNUSU9OX18sIGlkKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdERlc2MgPSB2YWx1ZUF0KGluZGV4KTsKLQotICAgIHNldEVmZmVjdEVuYWJsZWQoZWZmZWN0RGVzYywgZmFsc2UpOwotCiAgICAgaWYgKG1Ub3RhbEVmZmVjdHNNZW1vcnkgPCBlZmZlY3REZXNjLT5tRGVzYy5tZW1vcnlVc2FnZSkgewogICAgICAgICBBTE9HVygidW5yZWdpc3RlckVmZmVjdCgpIG1lbW9yeSAlZCB0b28gYmlnIGZvciB0b3RhbCAlZCIsCiAgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bURlc2MubWVtb3J5VXNhZ2UsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOwpAQCAtMTE5LDYgKzExMywxNCBAQAogICAgIHJldHVybiBzZXRFZmZlY3RFbmFibGVkKHZhbHVlQXQoaW5kZXgpLCBlbmFibGVkKTsKIH0KIAorYm9vbCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6aXNFZmZlY3RFbmFibGVkKGludCBpZCkgY29uc3QKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShpZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB2YWx1ZUF0KGluZGV4KS0+bUVuYWJsZWQ7Cit9CiAKIHN0YXR1c190IEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjpzZXRFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3REZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVkKQpAQCAtMTUwLDExICsxNTIsMTEgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLWJvb2wgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb246OmlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkKK2Jvb2wgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb246OmlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkgY29uc3QKIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdERlc2MgPSB2YWx1ZUF0KGkpOwotICAgICAgICBpZiAoZWZmZWN0RGVzYy0+bUVuYWJsZWQgJiYgKGVmZmVjdERlc2MtPm1TdHJhdGVneSA9PSBTVFJBVEVHWV9NRURJQSkgJiYKKyAgICAgICAgaWYgKGVmZmVjdERlc2MtPm1FbmFibGVkICYmIChlZmZlY3REZXNjLT5pc011c2ljRWZmZWN0KCkpICYmCiAgICAgICAgICAgICAgICAgKChlZmZlY3REZXNjLT5tRGVzYy5mbGFncyAmIEVGRkVDVF9GTEFHX09GRkxPQURfU1VQUE9SVEVEKSA9PSAwKSkgewogICAgICAgICAgICAgQUxPR1YoImlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkgbm9uIG9mZmxvYWRhYmxlIGVmZmVjdCAlcyBlbmFibGVkIG9uIHNlc3Npb24gJWQiLAogICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bURlc2MubmFtZSwgZWZmZWN0RGVzYy0+bVNlc3Npb24pOwpAQCAtMTc0LDI0ICsxNzYsNTkgQEAKICAgICByZXR1cm4gTUFYX0VGRkVDVFNfTUVNT1JZOwogfQogCi1zdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpCit2b2lkIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjptb3ZlRWZmZWN0cyhhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNyY091dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdE91dHB1dCkKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKLSAgICAgICAgICAgICJcblRvdGFsIEVmZmVjdHMgQ1BVOiAlZiBNSVBTLCBUb3RhbCBFZmZlY3RzIG1lbW9yeTogJWQgS0IsIE1heCBtZW1vcnkgdXNlZDogJWQgS0JcbiIsCi0gICAgICAgICAgICAgKGZsb2F0KW1Ub3RhbEVmZmVjdHNDcHVMb2FkLzEwLCBtVG90YWxFZmZlY3RzTWVtb3J5LCBtVG90YWxFZmZlY3RzTWVtb3J5TWF4VXNlZCk7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUmVnaXN0ZXJlZCBlZmZlY3RzOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIEFMT0dWKCIlcyBzZXNzaW9uICVkIHNyY091dHB1dCAlZCBkc3RPdXRwdXQgJWQiLCBfX2Z1bmNfXywgc2Vzc2lvbiwgc3JjT3V0cHV0LCBkc3RPdXRwdXQpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBFZmZlY3QgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkKTsKKyAgICAgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0ID0gdmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGVmZmVjdC0+bVNlc3Npb24gPT0gc2Vzc2lvbiAmJiBlZmZlY3QtPm1JbyA9PSBzcmNPdXRwdXQpIHsKKyAgICAgICAgICAgIGVmZmVjdC0+bUlvID0gZHN0T3V0cHV0OworICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6bW92ZUVmZmVjdHMoY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgaWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0KQoreworICAgIEFMT0dWKCIlcyBudW0gZWZmZWN0cyAlenUsIGZpcnN0IElEICVkLCBkc3RPdXRwdXQgJWQiLAorICAgICAgICBfX2Z1bmNfXywgaWRzLnNpemUoKSwgaWRzLnNpemUoKSA/IGlkc1swXSA6IDAsIGRzdE91dHB1dCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3QgPSB2YWx1ZUF0KGkpOworICAgICAgICBpZiAoc3RkOjpmaW5kKGJlZ2luKGlkcyksIGVuZChpZHMpLCBlZmZlY3QtPm1JZCkgIT0gZW5kKGlkcykpIHsKKyAgICAgICAgICAgIGVmZmVjdC0+bUlvID0gZHN0T3V0cHV0OworICAgICAgICB9CisgICAgfQorfQorCitFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6Z2V0RWZmZWN0c0ZvcklvKGF1ZGlvX2lvX2hhbmRsZV90IGlvKSBjb25zdAoreworICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIGVmZmVjdHM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpZiAodmFsdWVBdChpKS0+bUlvID09IGlvKSB7CisgICAgICAgICAgICBlZmZlY3RzLmFkZChrZXlBdChpKSwgdmFsdWVBdChpKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVmZmVjdHM7Cit9CisKK3ZvaWQgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBib29sIHZlcmJvc2UpIGNvbnN0Cit7CisgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoCisgICAgICAgICAgICAiXG4lKnNUb3RhbCBFZmZlY3RzIENQVTogJWYgTUlQUywgIgorICAgICAgICAgICAgIlRvdGFsIEVmZmVjdHMgbWVtb3J5OiAlZCBLQiwgTWF4IG1lbW9yeSB1c2VkOiAlZCBLQlxuIiwKKyAgICAgICAgICAgIHNwYWNlcywgIiIsCisgICAgICAgICAgICAoZmxvYXQpIG1Ub3RhbEVmZmVjdHNDcHVMb2FkIC8gMTAsCisgICAgICAgICAgICBtVG90YWxFZmZlY3RzTWVtb3J5LAorICAgICAgICAgICAgbVRvdGFsRWZmZWN0c01lbW9yeU1heFVzZWQpOworICAgIH0KKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzRWZmZWN0czpcbiIsIHNwYWNlcywgIiIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gRWZmZWN0ICVkOlxuIiwgc3BhY2VzLCAiIiwga2V5QXQoaSkpOworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCwgc3BhY2VzICsgMik7CisgICAgfQogfQogCiB9OyAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9HYWlucy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9HYWlucy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MDdhMTcuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvR2FpbnMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFQTTo6R2FpbnMiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLS8vI2RlZmluZSBWRVJZX1ZFUkJPU0VfTE9HR0lORwotI2lmZGVmIFZFUllfVkVSQk9TRV9MT0dHSU5HCi0jZGVmaW5lIEFMT0dWViBBTE9HVgotI2Vsc2UKLSNkZWZpbmUgQUxPR1ZWKGEuLi4pIGRvIHsgfSB3aGlsZSgwKQotI2VuZGlmCi0KLSNpbmNsdWRlICJHYWlucy5oIgotI2luY2x1ZGUgPFZvbHVtZS5oPgotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gRW5naW5lZGVmYXVsdAotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHsxLCAtNDkuNWZ9LCB7MzMsIC0zMy41Zn0sIHs2NiwgLTE3LjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezEsIC01OC4wZn0sIHsyMCwgLTQwLjBmfSwgezYwLCAtMTcuMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTU4LjBmfSwgezIwLCAtNDAuMGZ9LCB7NjAsIC0yMS4wZn0sIHsxMDAsIC0xMC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHsxLCAtNTYuMGZ9LCB7MjAsIC0zNC4wZn0sIHs2MCwgLTExLjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVEcmNbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHsxLCAtNTUuMGZ9LCB7MjAsIC00My4wZn0sIHs4NiwgLTEyLjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTI5LjdmfSwgezMzLCAtMjAuMWZ9LCB7NjYsIC0xMC4yZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyY1tWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezEsIC0zNS43Zn0sIHszMywgLTI2LjFmfSwgezY2LCAtMTMuMmZ9LCB7MTAwLCAwLjBmfQotfTsKLQotLy8gQVVESU9fU1RSRUFNX1NZU1RFTSwgQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUgYW5kIEFVRElPX1NUUkVBTV9EVE1GIHZvbHVtZSB0cmFja3MKLS8vIEFVRElPX1NUUkVBTV9SSU5HIG9uIHBob25lcyBhbmQgQVVESU9fU1RSRUFNX01VU0lDIG9uIHRhYmxldHMuCi0vLyBBVURJT19TVFJFQU1fRFRNRiB0cmFja3MgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwgd2hpbGUgaW4gY2FsbCAoU2VlIEF1ZGlvU2VydmljZS5qYXZhKS4KLS8vIFRoZSByYW5nZSBpcyBjb25zdHJhaW5lZCBiZXR3ZWVuIC0yNGRCIGFuZCAtNmRCIG92ZXIgc3BlYWtlciBhbmQgLTMwZEIgYW5kIC0xOGRCIG92ZXIgaGVhZHNldC4KLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHsxLCAtMjQuMGZ9LCB7MzMsIC0xOC4wZn0sIHs2NiwgLTEyLjBmfSwgezEwMCwgLTYuMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZURyY1tWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezEsIC0zNC4wZn0sIHszMywgLTI0LjBmfSwgezY2LCAtMTUuMGZ9LCB7MTAwLCAtNi4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTMwLjBmfSwgezMzLCAtMjYuMGZ9LCB7NjYsIC0yMi4wZn0sIHsxMDAsIC0xOC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHswLCAtNDIuMGZ9LCB7MzMsIC0yOC4wZn0sIHs2NiwgLTE0LjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHswLCAtMjQuMGZ9LCB7MzMsIC0xNi4wZn0sIHs2NiwgLTguMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNMaW5lYXJWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezAsIC05Ni4wZn0sIHszMywgLTY4LjBmfSwgezY2LCAtMzQuMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNTaWxlbnRWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezAsIC05Ni4wZn0sIHsxLCAtOTYuMGZ9LCB7MiwgLTk2LjBmfSwgezEwMCwgLTk2LjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezAsIDAuMGZ9LCB7MSwgMC4wZn0sIHsyLCAwLjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTEyOC4wZn0sIHsyMCwgLTgwLjBmfSwgezYwLCAtNDAuMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqR2FpbnM6OnNWb2x1bWVQcm9maWxlc1tBVURJT19TVFJFQU1fQ05UXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbREVWSUNFX0NBVEVHT1JZX0NOVF0gPSB7Ci0gICAgeyAvLyBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTAotICAgICAgICBHYWluczo6c0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c1NwZWFrZXJWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c1NwZWFrZXJWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9TWVNURU0KLSAgICAgICAgR2FpbnM6OnNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgICAgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9SSU5HCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmUsICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fTVVTSUMKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgICAgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fQUxBUk0KLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0RlZmF1bHRWb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04KLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0RlZmF1bHRWb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlICAgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFCi0gICAgICAgIEdhaW5zOjpzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgICAgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7ICAvLyBBVURJT19TVFJFQU1fRFRNRgotICAgICAgICBHYWluczo6c0hlYWRzZXRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlICAgICAgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fVFRTCi0gICAgICAvLyAiVHJhbnNtaXR0ZWQgVGhyb3VnaCBTcGVha2VyIjogYWx3YXlzIHNpbGVudCBleGNlcHQgb24gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNTaWxlbnRWb2x1bWVDdXJ2ZSwgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNTaWxlbnRWb2x1bWVDdXJ2ZSwgICAgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzU2lsZW50Vm9sdW1lQ3VydmUsICAgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWQotICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9SRVJPVVRJTkcKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9QQVRDSAotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKLSAgICB9LAotfTsKLQotLy9zdGF0aWMKLWZsb2F0IEdhaW5zOjp2b2xJbmRleFRvRGIoY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqY3VydmUsIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4LCBpbnQgaW5kZXhJblVpKQotewotICAgIC8vIHRoZSB2b2x1bWUgaW5kZXggaW4gdGhlIFVJIGlzIHJlbGF0aXZlIHRvIHRoZSBtaW4gYW5kIG1heCB2b2x1bWUgaW5kaWNlcyBmb3IgdGhpcyBzdHJlYW0gdHlwZQotICAgIGludCBuYlN0ZXBzID0gMSArIGN1cnZlW1ZvbHVtZTo6Vk9MTUFYXS5tSW5kZXggLSBjdXJ2ZVtWb2x1bWU6OlZPTE1JTl0ubUluZGV4OwotICAgIGludCB2b2xJZHggPSAobmJTdGVwcyAqIChpbmRleEluVWkgLSBpbmRleE1pbikpIC8gKGluZGV4TWF4IC0gaW5kZXhNaW4pOwotCi0gICAgLy8gZmluZCB3aGF0IHBhcnQgb2YgdGhlIGN1cnZlIHRoaXMgaW5kZXggdm9sdW1lIGJlbG9uZ3MgdG8sIG9yIGlmIGl0J3Mgb3V0IG9mIGJvdW5kcwotICAgIGludCBzZWdtZW50ID0gMDsKLSAgICBpZiAodm9sSWR4IDwgY3VydmVbVm9sdW1lOjpWT0xNSU5dLm1JbmRleCkgeyAgICAgICAgIC8vIG91dCBvZiBib3VuZHMKLSAgICAgICAgcmV0dXJuIFZPTFVNRV9NSU5fREI7Ci0gICAgfSBlbHNlIGlmICh2b2xJZHggPCBjdXJ2ZVtWb2x1bWU6OlZPTEtORUUxXS5tSW5kZXgpIHsKLSAgICAgICAgc2VnbWVudCA9IDA7Ci0gICAgfSBlbHNlIGlmICh2b2xJZHggPCBjdXJ2ZVtWb2x1bWU6OlZPTEtORUUyXS5tSW5kZXgpIHsKLSAgICAgICAgc2VnbWVudCA9IDE7Ci0gICAgfSBlbHNlIGlmICh2b2xJZHggPD0gY3VydmVbVm9sdW1lOjpWT0xNQVhdLm1JbmRleCkgewotICAgICAgICBzZWdtZW50ID0gMjsKLSAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dCBvZiBib3VuZHMKLSAgICAgICAgcmV0dXJuIDAuMGY7Ci0gICAgfQotCi0gICAgLy8gbGluZWFyIGludGVycG9sYXRpb24gaW4gdGhlIGF0dGVudWF0aW9uIHRhYmxlIGluIGRCCi0gICAgZmxvYXQgZGVjaWJlbHMgPSBjdXJ2ZVtzZWdtZW50XS5tREJBdHRlbnVhdGlvbiArCi0gICAgICAgICAgICAoKGZsb2F0KSh2b2xJZHggLSBjdXJ2ZVtzZWdtZW50XS5tSW5kZXgpKSAqCi0gICAgICAgICAgICAgICAgKCAoY3VydmVbc2VnbWVudCsxXS5tREJBdHRlbnVhdGlvbiAtCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50XS5tREJBdHRlbnVhdGlvbikgLwotICAgICAgICAgICAgICAgICAgICAoKGZsb2F0KShjdXJ2ZVtzZWdtZW50KzFdLm1JbmRleCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VydmVbc2VnbWVudF0ubUluZGV4KSkgKTsKLQotICAgIEFMT0dWVigiVk9MVU1FIHZvbCBpbmRleD1bJWQgJWQgJWRdLCBkQj1bJS4xZiAlLjFmICUuMWZdIiwKLSAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1JbmRleCwgdm9sSWR4LAotICAgICAgICAgICAgY3VydmVbc2VnbWVudCsxXS5tSW5kZXgsCi0gICAgICAgICAgICBjdXJ2ZVtzZWdtZW50XS5tREJBdHRlbnVhdGlvbiwKLSAgICAgICAgICAgIGRlY2liZWxzLAotICAgICAgICAgICAgY3VydmVbc2VnbWVudCsxXS5tREJBdHRlbnVhdGlvbik7Ci0KLSAgICByZXR1cm4gZGVjaWJlbHM7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0h3TW9kdWxlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0h3TW9kdWxlLmNwcAppbmRleCBhZWY3ZGJlLi45NmE4MzM3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Id01vZHVsZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSHdNb2R1bGUuY3BwCkBAIC01MSw3ICs1MSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUpKTsKIAogICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihkZXZpY2UpOwotICAgIGRldkRlc2MtPm1BZGRyZXNzID0gYWRkcmVzczsKKyAgICBkZXZEZXNjLT5zZXRBZGRyZXNzKGFkZHJlc3MpOworICAgIGFkZER5bmFtaWNEZXZpY2UoZGV2RGVzYyk7CisgICAgLy8gUmVjaXByb2NhbGx5IGF0dGFjaCB0aGUgZGV2aWNlIHRvIHRoZSBtb2R1bGUKKyAgICBkZXZEZXNjLT5hdHRhY2godGhpcyk7CiAgICAgcHJvZmlsZS0+YWRkU3VwcG9ydGVkRGV2aWNlKGRldkRlc2MpOwogCiAgICAgcmV0dXJuIGFkZE91dHB1dFByb2ZpbGUocHJvZmlsZSk7CkBAIC05Nyw2ICsxMDAsOSBAQAogewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFByb2ZpbGVzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGlmIChtT3V0cHV0UHJvZmlsZXNbaV0tPmdldE5hbWUoKSA9PSBuYW1lKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmRldmljZSA6IG1PdXRwdXRQcm9maWxlc1tpXS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpKSB7CisgICAgICAgICAgICAgICAgcmVtb3ZlRHluYW1pY0RldmljZShkZXZpY2UpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgbU91dHB1dFByb2ZpbGVzLnJlbW92ZUF0KGkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTExMyw3ICsxMTksMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlKSk7CiAKICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gbmV3IERldmljZURlc2NyaXB0b3IoZGV2aWNlKTsKLSAgICBkZXZEZXNjLT5tQWRkcmVzcyA9IGFkZHJlc3M7CisgICAgZGV2RGVzYy0+c2V0QWRkcmVzcyhhZGRyZXNzKTsKKyAgICBhZGREeW5hbWljRGV2aWNlKGRldkRlc2MpOworICAgIC8vIFJlY2lwcm9jYWxseSBhdHRhY2ggdGhlIGRldmljZSB0byB0aGUgbW9kdWxlCisgICAgZGV2RGVzYy0+YXR0YWNoKHRoaXMpOwogICAgIHByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShkZXZEZXNjKTsKIAogICAgIEFMT0dWKCJhZGRJbnB1dFByb2ZpbGUoKSBuYW1lICVzIHJhdGUgJWQgbWFzayAweCUwOHgiLApAQCAtMTI2LDYgKzEzNSw5IEBACiB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRQcm9maWxlcy5zaXplKCk7IGkrKykgewogICAgICAgICBpZiAobUlucHV0UHJvZmlsZXNbaV0tPmdldE5hbWUoKSA9PSBuYW1lKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmRldmljZSA6IG1JbnB1dFByb2ZpbGVzW2ldLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCkpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVEeW5hbWljRGV2aWNlKGRldmljZSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtSW5wdXRQcm9maWxlcy5yZW1vdmVBdChpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yMTgsMzcgKzIzMCwzNyBAQAogICAgIG1IYW5kbGUgPSBoYW5kbGU7CiB9CiAKLXZvaWQgSHdNb2R1bGU6OmR1bXAoaW50IGZkKQotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OworYm9vbCBId01vZHVsZTo6c3VwcG9ydHNQYXRjaChjb25zdCBzcDxBdWRpb1BvcnQ+ICZzcmNQb3J0LCBjb25zdCBzcDxBdWRpb1BvcnQ+ICZkc3RQb3J0KSBjb25zdCB7CisgICAgZm9yIChjb25zdCBhdXRvICZyb3V0ZSA6IG1Sb3V0ZXMpIHsKKyAgICAgICAgaWYgKHJvdXRlLT5zdXBwb3J0c1BhdGNoKHNyY1BvcnQsIGRzdFBvcnQpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CiAKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgIC0gbmFtZTogJXNcbiIsIGdldE5hbWUoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgLSBoYW5kbGU6ICVkXG4iLCBtSGFuZGxlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAtIHZlcnNpb246ICV1LiV1XG4iLCBnZXRIYWxWZXJzaW9uTWFqb3IoKSwgZ2V0SGFsVmVyc2lvbk1pbm9yKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKK3ZvaWQgSHdNb2R1bGU6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgIC0gbmFtZTogJXNcbiIsIGdldE5hbWUoKSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAgLSBoYW5kbGU6ICVkXG4iLCBtSGFuZGxlKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICAtIHZlcnNpb246ICV1LiV1XG4iLCBnZXRIYWxWZXJzaW9uTWFqb3IoKSwgZ2V0SGFsVmVyc2lvbk1pbm9yKCkpOwogICAgIGlmIChtT3V0cHV0UHJvZmlsZXMuc2l6ZSgpKSB7Ci0gICAgICAgIHdyaXRlKGZkLCAiICAtIG91dHB1dHM6XG4iLCBzdHJsZW4oIiAgLSBvdXRwdXRzOlxuIikpOworICAgICAgICBkc3QtPmFwcGVuZCgiICAtIG91dHB1dHM6XG4iKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICBvdXRwdXQgJXp1OlxuIiwgaSk7Ci0gICAgICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgICAgICBtT3V0cHV0UHJvZmlsZXNbaV0tPmR1bXAoZmQpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAgICBvdXRwdXQgJXp1OlxuIiwgaSk7CisgICAgICAgICAgICBtT3V0cHV0UHJvZmlsZXNbaV0tPmR1bXAoZHN0KTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAobUlucHV0UHJvZmlsZXMuc2l6ZSgpKSB7Ci0gICAgICAgIHdyaXRlKGZkLCAiICAtIGlucHV0czpcbiIsIHN0cmxlbigiICAtIGlucHV0czpcbiIpKTsKKyAgICAgICAgZHN0LT5hcHBlbmQoIiAgLSBpbnB1dHM6XG4iKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRQcm9maWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgIGlucHV0ICV6dTpcbiIsIGkpOwotICAgICAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICAgICAgbUlucHV0UHJvZmlsZXNbaV0tPmR1bXAoZmQpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAgICBpbnB1dCAlenU6XG4iLCBpKTsKKyAgICAgICAgICAgIG1JbnB1dFByb2ZpbGVzW2ldLT5kdW1wKGRzdCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbURlY2xhcmVkRGV2aWNlcy5kdW1wKGZkLCBTdHJpbmc4KCJEZWNsYXJlZCIpLCAgMiwgdHJ1ZSk7Ci0gICAgbVJvdXRlcy5kdW1wKGZkLCAyKTsKKyAgICBtRGVjbGFyZWREZXZpY2VzLmR1bXAoZHN0LCBTdHJpbmc4KCJEZWNsYXJlZCIpLCAyLCB0cnVlKTsKKyAgICBtRHluYW1pY0RldmljZXMuZHVtcChkc3QsIFN0cmluZzgoIkR5bmFtaWMiKSwgIDIsIHRydWUpOworICAgIG1Sb3V0ZXMuZHVtcChkc3QsIDIpOwogfQogCiBzcCA8SHdNb2R1bGU+IEh3TW9kdWxlQ29sbGVjdGlvbjo6Z2V0TW9kdWxlRnJvbU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3QKQEAgLTI2MSw2NCArMjczLDE2NyBAQAogICAgIHJldHVybiBudWxscHRyOwogfQogCi1zcCA8SHdNb2R1bGU+IEh3TW9kdWxlQ29sbGVjdGlvbjo6Z2V0TW9kdWxlRm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0CitzcCA8SHdNb2R1bGU+IEh3TW9kdWxlQ29sbGVjdGlvbjo6Z2V0TW9kdWxlRm9yRGV2aWNlVHlwZXMoYXVkaW9fZGV2aWNlc190IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgY29uc3QKIHsKICAgICBmb3IgKGNvbnN0IGF1dG8mIG1vZHVsZSA6ICp0aGlzKSB7Ci0gICAgICAgIGNvbnN0IGF1dG8mIHByb2ZpbGVzID0gYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpID8KKyAgICAgICAgY29uc3QgYXV0byYgcHJvZmlsZXMgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlKHR5cGUpID8KICAgICAgICAgICAgICAgICBtb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkgOiBtb2R1bGUtPmdldElucHV0UHJvZmlsZXMoKTsKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwcm9maWxlIDogcHJvZmlsZXMpIHsKLSAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0RGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlOworICAgICAgICAgICAgaWYgKHByb2ZpbGUtPnN1cHBvcnRzRGV2aWNlVHlwZXModHlwZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZW5jb2RlZEZvcm1hdCAhPSBBVURJT19GT1JNQVRfREVGQVVMVCkgeworICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgZGVjbGFyZWREZXZpY2VzID0gbW9kdWxlLT5nZXREZWNsYXJlZERldmljZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgc3AgPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2MgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2xhcmVkRGV2aWNlcy5nZXREZXZpY2UodHlwZSwgU3RyaW5nOCgpLCBlbmNvZGVkRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRldmljZURlc2MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2R1bGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gbnVsbHB0cjsKIH0KIAotc3A8RGV2aWNlRGVzY3JpcHRvcj4gSHdNb2R1bGVDb2xsZWN0aW9uOjpnZXREZXZpY2VEZXNjcmlwdG9yKGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtYXRjaEFkcmVzcykgY29uc3QKK3NwPEh3TW9kdWxlPiBId01vZHVsZUNvbGxlY3Rpb246OmdldE1vZHVsZUZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSBjb25zdAogewotICAgIFN0cmluZzggYWRkcmVzcyA9IChkZXZpY2VfYWRkcmVzcyA9PSBudWxscHRyKSA/IFN0cmluZzgoIiIpIDogU3RyaW5nOChkZXZpY2VfYWRkcmVzcyk7CisgICAgcmV0dXJuIGdldE1vZHVsZUZvckRldmljZVR5cGVzKGRldmljZS0+dHlwZSgpLCBlbmNvZGVkRm9ybWF0KTsKK30KKworRGV2aWNlVmVjdG9yIEh3TW9kdWxlQ29sbGVjdGlvbjo6Z2V0QXZhaWxhYmxlRGV2aWNlc0Zyb21Nb2R1bGVOYW1lKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZURldmljZXMpIGNvbnN0Cit7CisgICAgc3A8SHdNb2R1bGU+IG1vZHVsZSA9IGdldE1vZHVsZUZyb21OYW1lKG5hbWUpOworICAgIGlmIChtb2R1bGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKCk7CisgICAgfQorICAgIHJldHVybiBhdmFpbGFibGVEZXZpY2VzLmdldERldmljZXNGcm9tSHdNb2R1bGUobW9kdWxlLT5nZXRIYW5kbGUoKSk7Cit9CisKK3NwPERldmljZURlc2NyaXB0b3I+IEh3TW9kdWxlQ29sbGVjdGlvbjo6Z2V0RGV2aWNlRGVzY3JpcHRvcihjb25zdCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG93VG9DcmVhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBtYXRjaEFkZHJlc3MpIGNvbnN0Cit7CisgICAgU3RyaW5nOCBkZXZBZGRyZXNzID0gKGFkZHJlc3MgPT0gbnVsbHB0ciB8fCAhbWF0Y2hBZGRyZXNzKSA/IFN0cmluZzgoIiIpIDogU3RyaW5nOChhZGRyZXNzKTsKICAgICAvLyBoYW5kbGUgbGVnYWN5IHJlbW90ZSBzdWJtaXggY2FzZSB3aGVyZSB0aGUgYWRkcmVzcyB3YXMgbm90IGFsd2F5cyBzcGVjaWZpZWQKLSAgICBpZiAoZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpICYmIChhZGRyZXNzLmxlbmd0aCgpID09IDApKSB7Ci0gICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KCIwIik7CisgICAgaWYgKGRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlVHlwZSkgJiYgKGRldkFkZHJlc3MubGVuZ3RoKCkgPT0gMCkpIHsKKyAgICAgICAgZGV2QWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKICAgICB9CiAKICAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogKnRoaXMpIHsKLSAgICAgICAgRGV2aWNlVmVjdG9yIGRlY2xhcmVkRGV2aWNlcyA9IGh3TW9kdWxlLT5nZXREZWNsYXJlZERldmljZXMoKTsKLSAgICAgICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3QgPSBkZWNsYXJlZERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlQWRkcihkZXZpY2UsIGFkZHJlc3MpOwotICAgICAgICBpZiAoIWRldmljZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZGV2aWNlTGlzdC5pdGVtQXQoMCk7CisgICAgICAgIERldmljZVZlY3RvciBtb2R1bGVEZXZpY2VzID0gaHdNb2R1bGUtPmdldEFsbERldmljZXMoKTsKKyAgICAgICAgYXV0byBtb2R1bGVEZXZpY2UgPSBtb2R1bGVEZXZpY2VzLmdldERldmljZShkZXZpY2VUeXBlLCBkZXZBZGRyZXNzLCBlbmNvZGVkRm9ybWF0KTsKKyAgICAgICAgaWYgKG1vZHVsZURldmljZSkgeworICAgICAgICAgICAgaWYgKGVuY29kZWRGb3JtYXQgIT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKKyAgICAgICAgICAgICAgICBtb2R1bGVEZXZpY2UtPnNldEVuY29kZWRGb3JtYXQoZW5jb2RlZEZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtb2R1bGVEZXZpY2UtPnNldEFkZHJlc3MoZGV2QWRkcmVzcyk7CisgICAgICAgICAgICBpZiAoYWxsb3dUb0NyZWF0ZSkgeworICAgICAgICAgICAgICAgIG1vZHVsZURldmljZS0+YXR0YWNoKGh3TW9kdWxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtb2R1bGVEZXZpY2U7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFtYXRjaEFkcmVzcykgewotICAgICAgICAgICAgZGV2aWNlTGlzdCA9IGRlY2xhcmVkRGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKLSAgICAgICAgICAgIGlmICghZGV2aWNlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlTGlzdC5pdGVtQXQoMCk7CisgICAgfQorICAgIGlmICghYWxsb3dUb0NyZWF0ZSkgeworICAgICAgICBBTE9HVigiJXM6IGNvdWxkIG5vdCBmaW5kIEhXIG1vZHVsZSBmb3IgZGV2aWNlICVzICUwNHggYWRkcmVzcyAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgbmFtZSwgZGV2aWNlVHlwZSwgYWRkcmVzcyk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gY3JlYXRlRGV2aWNlKGRldmljZVR5cGUsIGFkZHJlc3MsIG5hbWUsIGVuY29kZWRGb3JtYXQpOworfQorCitzcDxEZXZpY2VEZXNjcmlwdG9yPiBId01vZHVsZUNvbGxlY3Rpb246OmNyZWF0ZURldmljZShjb25zdCBhdWRpb19kZXZpY2VzX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgY29uc3QKK3sKKyAgICBzcDxId01vZHVsZT4gaHdNb2R1bGUgPSBnZXRNb2R1bGVGb3JEZXZpY2VUeXBlcyh0eXBlLCBlbmNvZGVkRm9ybWF0KTsKKyAgICBpZiAoaHdNb2R1bGUgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IGNvdWxkIG5vdCBmaW5kIEhXIG1vZHVsZSBmb3IgZGV2aWNlICUwNHggYWRkcmVzcyAlcyIsIF9fRlVOQ1RJT05fXywgdHlwZSwKKyAgICAgICAgICAgICAgYWRkcmVzcyk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcih0eXBlLCBTdHJpbmc4KG5hbWUpKTsKKyAgICBkZXZpY2UtPnNldE5hbWUoU3RyaW5nOChuYW1lKSk7CisgICAgZGV2aWNlLT5zZXRBZGRyZXNzKFN0cmluZzgoYWRkcmVzcykpOworICAgIGRldmljZS0+c2V0RW5jb2RlZEZvcm1hdChlbmNvZGVkRm9ybWF0KTsKKworICAvLyBBZGQgdGhlIGRldmljZSB0byB0aGUgbGlzdCBvZiBkeW5hbWljIGRldmljZXMKKyAgICBod01vZHVsZS0+YWRkRHluYW1pY0RldmljZShkZXZpY2UpOworICAgIC8vIFJlY2lwcm9jYWxseSBhdHRhY2ggdGhlIGRldmljZSB0byB0aGUgbW9kdWxlCisgICAgZGV2aWNlLT5hdHRhY2goaHdNb2R1bGUpOworICAgIEFMT0dEKCIlczogYWRkaW5nIGR5bmFtaWMgZGV2aWNlICVzIHRvIG1vZHVsZSAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgaHdNb2R1bGUtPmdldE5hbWUoKSk7CisKKyAgICBjb25zdCBhdXRvICZwcm9maWxlcyA9IChhdWRpb19pc19vdXRwdXRfZGV2aWNlKHR5cGUpID8gaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3TW9kdWxlLT5nZXRJbnB1dFByb2ZpbGVzKCkpOworICAgIGZvciAoY29uc3QgYXV0byAmcHJvZmlsZSA6IHByb2ZpbGVzKSB7CisgICAgICAgIC8vIEFkZCB0aGUgZGV2aWNlIGFzIHN1cHBvcnRlZCB0byBhbGwgcHJvZmlsZSBzdXBwb3J0aW5nICJ3ZWFrbHkiIG9yIG5vdCB0aGUgZGV2aWNlCisgICAgICAgIC8vIGFjY29yZGluZyB0byBpdHMgdHlwZQorICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydHNEZXZpY2UoZGV2aWNlLCBmYWxzZSAvKm1hdGNoQWRyZXNzKi8pKSB7CisKKyAgICAgICAgICAgIC8vIEB0b2RvIHF1aWQgb2YgYXVkaW8gcHJvZmlsZT8gaW1wb3J0IHRoZSBwcm9maWxlIGZyb20gZGV2aWNlIG9mIHRoZSBzYW1lIHR5cGU/CisgICAgICAgICAgICBjb25zdCBhdXRvICZpc29UeXBlRGV2aWNlRm9yUHJvZmlsZSA9CisgICAgICAgICAgICAgICAgcHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpLmdldERldmljZSh0eXBlLCBTdHJpbmc4KCksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgICAgIGRldmljZS0+aW1wb3J0QXVkaW9Qb3J0KGlzb1R5cGVEZXZpY2VGb3JQcm9maWxlLCB0cnVlIC8qIGZvcmNlICovKTsKKworICAgICAgICAgICAgQUxPR1YoIiVzOiBhZGRpbmcgZGV2aWNlICVzIHRvIHByb2ZpbGUgJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgcHJvZmlsZS0+Z2V0VGFnTmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgcHJvZmlsZS0+YWRkU3VwcG9ydGVkRGV2aWNlKGRldmljZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRldmljZTsKK30KKwordm9pZCBId01vZHVsZUNvbGxlY3Rpb246OmNsZWFuVXBGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSkKK3sKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogKnRoaXMpIHsKKyAgICAgICAgRGV2aWNlVmVjdG9yIG1vZHVsZURldmljZXMgPSBod01vZHVsZS0+Z2V0QWxsRGV2aWNlcygpOworICAgICAgICBpZiAoIW1vZHVsZURldmljZXMuY29udGFpbnMoZGV2aWNlKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyByZW1vdmFsIG9mIHJlbW90ZSBzdWJtaXggZGV2aWNlcyBhc3NvY2lhdGVkIHdpdGggYSBkeW5hbWljIHBvbGljeSBpcworICAgICAgICAvLyBoYW5kbGVkIGJ5IHJlbW92ZU91dHB1dFByb2ZpbGUoKSBhbmQgcmVtb3ZlSW5wdXRQcm9maWxlKCkKKyAgICAgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGRldmljZS0+dHlwZSgpKSAmJiBkZXZpY2UtPmFkZHJlc3MoKSAhPSAiMCIpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgZGV2aWNlLT5kZXRhY2goKTsKKyAgICAgICAgLy8gT25seSByZW1vdmUgZnJvbSBkeW5hbWljIGxpc3QsIG5vdCBmcm9tIGRlY2xhcmVkIGxpc3QhISEKKyAgICAgICAgaWYgKCFod01vZHVsZS0+Z2V0RHluYW1pY0RldmljZXMoKS5jb250YWlucyhkZXZpY2UpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaHdNb2R1bGUtPnJlbW92ZUR5bmFtaWNEZXZpY2UoZGV2aWNlKTsKKyAgICAgICAgQUxPR1YoIiVzOiByZW1vdmVkIGR5bmFtaWMgZGV2aWNlICVzIGZyb20gbW9kdWxlICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgaHdNb2R1bGUtPmdldE5hbWUoKSk7CisKKyAgICAgICAgY29uc3QgSU9Qcm9maWxlQ29sbGVjdGlvbiAmcHJvZmlsZXMgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZS0+dHlwZSgpKSA/CisgICAgICAgICAgICAgICAgICAgIGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpIDogaHdNb2R1bGUtPmdldElucHV0UHJvZmlsZXMoKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwcm9maWxlIDogcHJvZmlsZXMpIHsKKyAgICAgICAgICAgIC8vIEZvciBjbGVhbnVwLCBzdHJvbmcgbWF0Y2ggaXMgcmVxdWlyZWQKKyAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0c0RldmljZShkZXZpY2UsIHRydWUgLyptYXRjaEFkcmVzcyovKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlczogcmVtb3ZpbmcgZGV2aWNlICVzIGZyb20gcHJvZmlsZSAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgcHJvZmlsZS0+Z2V0VGFnTmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHByb2ZpbGUtPnJlbW92ZVN1cHBvcnRlZERldmljZShkZXZpY2UpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotCi0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKGRldmljZSk7Ci0gICAgZGV2RGVzYy0+c2V0TmFtZShTdHJpbmc4KGRldmljZV9uYW1lKSk7Ci0gICAgZGV2RGVzYy0+bUFkZHJlc3MgPSBhZGRyZXNzOwotICAgIHJldHVybiBkZXZEZXNjOwogfQogCi1zdGF0dXNfdCBId01vZHVsZUNvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAordm9pZCBId01vZHVsZUNvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5IVyBNb2R1bGVzIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CisgICAgZHN0LT5hcHBlbmQoIlxuSFcgTW9kdWxlcyBkdW1wOlxuIik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIEhXIE1vZHVsZSAlenU6XG4iLCBpICsgMSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgaXRlbUF0KGkpLT5kdW1wKGZkKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIi0gSFcgTW9kdWxlICV6dTpcbiIsIGkgKyAxKTsKKyAgICAgICAgaXRlbUF0KGkpLT5kdW1wKGRzdCk7CiAgICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9JT1Byb2ZpbGUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSU9Qcm9maWxlLmNwcAppbmRleCBmYmMyMzg0Li5mZTJlYWVlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9JT1Byb2ZpbGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0lPUHJvZmlsZS5jcHAKQEAgLTE3LDYgKzE3LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiQVBNOjpJT1Byb2ZpbGUiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8tYmFzZS5oPgogI2luY2x1ZGUgIklPUHJvZmlsZS5oIgogI2luY2x1ZGUgIkh3TW9kdWxlLmgiCiAjaW5jbHVkZSAiQXVkaW9HYWluLmgiCkBAIC0yNCwxMSArMjUsNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLS8vIGNoZWNrcyBpZiB0aGUgSU8gcHJvZmlsZSBpcyBjb21wYXRpYmxlIHdpdGggc3BlY2lmaWVkIHBhcmFtZXRlcnMuCi0vLyBTYW1wbGluZyByYXRlLCBmb3JtYXQgYW5kIGNoYW5uZWwgbWFzayBtdXN0IGJlIHNwZWNpZmllZCBpbiBvcmRlciB0bwotLy8gZ2V0IGEgdmFsaWQgYSBtYXRjaAotYm9vbCBJT1Byb2ZpbGU6OmlzQ29tcGF0aWJsZVByb2ZpbGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCitib29sIElPUHJvZmlsZTo6aXNDb21wYXRpYmxlUHJvZmlsZShjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqdXBkYXRlZFNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKQEAgLTQ1LDE0ICs0Miw4IEBACiAgICAgICAgICAgICBnZXRUeXBlKCkgPT0gQVVESU9fUE9SVF9UWVBFX01JWCAmJiBnZXRSb2xlKCkgPT0gQVVESU9fUE9SVF9ST0xFX1NJTks7CiAgICAgQUxPR19BU1NFUlQoaXNQbGF5YmFja1RocmVhZCAhPSBpc1JlY29yZFRocmVhZCk7CiAKLQotICAgIGlmIChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgLy8ganVzdCBjaGVjayB0eXBlcyBpZiBtdWx0aXBsZSBkZXZpY2VzIGFyZSBzZWxlY3RlZAotICAgICAgICBpZiAocG9wY291bnQoZGV2aWNlICYgfkFVRElPX0RFVklDRV9CSVRfSU4pID4gMSkgewotICAgICAgICAgICAgaWYgKChtU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlKSAhPSBkZXZpY2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobVN1cHBvcnRlZERldmljZXMuZ2V0RGV2aWNlKGRldmljZSwgYWRkcmVzcykgPT0gMCkgeworICAgIGlmICghZGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgaWYgKCFtU3VwcG9ydGVkRGV2aWNlcy5jb250YWluc0FsbERldmljZXMoZGV2aWNlcykpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KQEAgLTY2LDE5ICs1NywyMyBAQAogICAgIGF1ZGlvX2Zvcm1hdF90IG15VXBkYXRlZEZvcm1hdCA9IGZvcm1hdDsKICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBteVVwZGF0ZWRDaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrOwogICAgIHVpbnQzMl90IG15VXBkYXRlZFNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZTsKKyAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgY29uZmlnID0geworICAgICAgICAuY29uZmlnX21hc2sgPSBBVURJT19QT1JUX0NPTkZJR19BTEwgJiB+QVVESU9fUE9SVF9DT05GSUdfR0FJTiwKKyAgICAgICAgLnNhbXBsZV9yYXRlID0gc2FtcGxpbmdSYXRlLAorICAgICAgICAuY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2ssCisgICAgICAgIC5mb3JtYXQgPSBmb3JtYXQsCisgICAgfTsKICAgICBpZiAoaXNSZWNvcmRUaHJlYWQpCiAgICAgewotICAgICAgICBpZiAoY2hlY2tDb21wYXRpYmxlQXVkaW9Qcm9maWxlKAorICAgICAgICBpZiAoKGZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19NTUFQX05PSVJRKSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoY2hlY2tFeGFjdEF1ZGlvUHJvZmlsZSgmY29uZmlnKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChjaGVja0NvbXBhdGlibGVBdWRpb1Byb2ZpbGUoCiAgICAgICAgICAgICAgICAgbXlVcGRhdGVkU2FtcGxpbmdSYXRlLCBteVVwZGF0ZWRDaGFubmVsTWFzaywgbXlVcGRhdGVkRm9ybWF0KSAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIGNvbmZpZyA9IHsKLSAgICAgICAgICAgIC5jb25maWdfbWFzayA9IEFVRElPX1BPUlRfQ09ORklHX0FMTCAmIH5BVURJT19QT1JUX0NPTkZJR19HQUlOLAotICAgICAgICAgICAgLnNhbXBsZV9yYXRlID0gc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgLmZvcm1hdCA9IGZvcm1hdCwKLSAgICAgICAgfTsKICAgICAgICAgaWYgKGNoZWNrRXhhY3RBdWRpb1Byb2ZpbGUoJmNvbmZpZykgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQpAQCAtMTA4LDE2ICsxMDMsMTEgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotdm9pZCBJT1Byb2ZpbGU6OmR1bXAoaW50IGZkKQordm9pZCBJT1Byb2ZpbGU6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OworICAgIEF1ZGlvUG9ydDo6ZHVtcChkc3QsIDQpOwogCi0gICAgQXVkaW9Qb3J0OjpkdW1wKGZkLCA0KTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAtIGZsYWdzOiAweCUwNHgiLCBnZXRGbGFncygpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAgICAtIGZsYWdzOiAweCUwNHgiLCBnZXRGbGFncygpKTsKICAgICBzdGQ6OnN0cmluZyBmbGFnc0xpdGVyYWw7CiAgICAgaWYgKGdldFJvbGUoKSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSykgewogICAgICAgICBJbnB1dEZsYWdDb252ZXJ0ZXI6Om1hc2tUb1N0cmluZyhnZXRGbGFncygpLCBmbGFnc0xpdGVyYWwpOwpAQCAtMTI1LDIxICsxMTUsMTQgQEAKICAgICAgICAgT3V0cHV0RmxhZ0NvbnZlcnRlcjo6bWFza1RvU3RyaW5nKGdldEZsYWdzKCksIGZsYWdzTGl0ZXJhbCk7CiAgICAgfQogICAgIGlmICghZmxhZ3NMaXRlcmFsLmVtcHR5KCkpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICglcykiLCBmbGFnc0xpdGVyYWwuY19zdHIoKSk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgKCVzKSIsIGZsYWdzTGl0ZXJhbC5jX3N0cigpKTsKICAgICB9Ci0gICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICBtU3VwcG9ydGVkRGV2aWNlcy5kdW1wKGZkLCBTdHJpbmc4KCJTdXBwb3J0ZWQiKSwgNCwgZmFsc2UpOwotCi0gICAgcmVzdWx0LmNsZWFyKCk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG4gICAgLSBtYXhPcGVuQ291bnQ6ICV1IC0gY3VyT3BlbkNvdW50OiAldVxuIiwKKyAgICBkc3QtPmFwcGVuZCgiXG4iKTsKKyAgICBtU3VwcG9ydGVkRGV2aWNlcy5kdW1wKGRzdCwgU3RyaW5nOCgiU3VwcG9ydGVkIiksIDQsIGZhbHNlKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG4gICAgLSBtYXhPcGVuQ291bnQ6ICV1IC0gY3VyT3BlbkNvdW50OiAldVxuIiwKICAgICAgICAgICAgICBtYXhPcGVuQ291bnQsIGN1ck9wZW5Db3VudCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAtIG1heEFjdGl2ZUNvdW50OiAldSAtIGN1ckFjdGl2ZUNvdW50OiAldVxuIiwKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICAgIC0gbWF4QWN0aXZlQ291bnQ6ICV1IC0gY3VyQWN0aXZlQ291bnQ6ICV1XG4iLAogICAgICAgICAgICAgIG1heEFjdGl2ZUNvdW50LCBjdXJBY3RpdmVDb3VudCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiB9CiAKIHZvaWQgSU9Qcm9maWxlOjpsb2coKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2VyaWFsaXplci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TZXJpYWxpemVyLmNwcAppbmRleCBhMjUzMTEzLi41ZjgyMGMyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TZXJpYWxpemVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TZXJpYWxpemVyLmNwcApAQCAtMTcsMjQxICsxNyw0MzIgQEAKICNkZWZpbmUgTE9HX1RBRyAiQVBNOjpTZXJpYWxpemVyIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCi0jaW5jbHVkZSAiU2VyaWFsaXplci5oIgotI2luY2x1ZGUgPG1lZGlhL2NvbnZlcnQuaD4KLSNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KICNpbmNsdWRlIDxsaWJ4bWwvcGFyc2VyLmg+CiAjaW5jbHVkZSA8bGlieG1sL3hpbmNsdWRlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8aXN0cmVhbT4KLQotdXNpbmcgc3RkOjpzdHJpbmc7CisjaW5jbHVkZSA8bWVkaWEvY29udmVydC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSAiU2VyaWFsaXplci5oIgorI2luY2x1ZGUgIlR5cGVDb252ZXJ0ZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJpbmcgZ2V0WG1sQXR0cmlidXRlKGNvbnN0IHhtbE5vZGUgKmN1ciwgY29uc3QgY2hhciAqYXR0cmlidXRlKQorbmFtZXNwYWNlIHsKKworLy8gVE9ETyhtbmFnYW5vdik6IENvbnNpZGVyIGZpbmRpbmcgYW4gYWx0ZXJuYXRpdmUgZm9yIHVzaW5nIEhJREwgY29kZS4KK3VzaW5nIGhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyBoYXJkd2FyZTo6U3RhdHVzOwordXNpbmcgdXRpbGl0aWVzOjpjb252ZXJ0VG87CisKK3RlbXBsYXRlPHR5cGVuYW1lIEUsIHR5cGVuYW1lIEM+CitzdHJ1Y3QgQW5kcm9pZENvbGxlY3Rpb25UcmFpdHMgeworICAgIHR5cGVkZWYgc3A8RT4gRWxlbWVudDsKKyAgICB0eXBlZGVmIEMgQ29sbGVjdGlvbjsKKyAgICB0eXBlZGVmIHZvaWQqIFB0clNlcmlhbGl6aW5nQ3R4OworCisgICAgc3RhdGljIHN0YXR1c190IGFkZEVsZW1lbnRUb0NvbGxlY3Rpb24oY29uc3QgRWxlbWVudCAmZWxlbWVudCwgQ29sbGVjdGlvbiAqY29sbGVjdGlvbikgeworICAgICAgICByZXR1cm4gY29sbGVjdGlvbi0+YWRkKGVsZW1lbnQpID49IDAgPyBOT19FUlJPUiA6IEJBRF9WQUxVRTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorc3RydWN0IFN0ZENvbGxlY3Rpb25UcmFpdHMgeworICAgIHR5cGVkZWYgQyBDb2xsZWN0aW9uOworICAgIHR5cGVkZWYgdHlwZW5hbWUgQzo6dmFsdWVfdHlwZSBFbGVtZW50OworICAgIHR5cGVkZWYgdm9pZCogUHRyU2VyaWFsaXppbmdDdHg7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgYWRkRWxlbWVudFRvQ29sbGVjdGlvbihjb25zdCBFbGVtZW50ICZlbGVtZW50LCBDb2xsZWN0aW9uICpjb2xsZWN0aW9uKSB7CisgICAgICAgIGF1dG8gcGFpciA9IGNvbGxlY3Rpb24tPmluc2VydChlbGVtZW50KTsKKyAgICAgICAgcmV0dXJuIHBhaXIuc2Vjb25kID8gTk9fRVJST1IgOiBCQURfVkFMVUU7CisgICAgfQorfTsKKworc3RydWN0IEF1ZGlvR2FpblRyYWl0cyA6IHB1YmxpYyBBbmRyb2lkQ29sbGVjdGlvblRyYWl0czxBdWRpb0dhaW4sIEF1ZGlvR2FpbnM+CiB7Ci0gICAgeG1sQ2hhciAqeG1sVmFsdWUgPSB4bWxHZXRQcm9wKGN1ciwgKGNvbnN0IHhtbENoYXIqKWF0dHJpYnV0ZSk7Ci0gICAgaWYgKHhtbFZhbHVlID09IE5VTEwpIHsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJnYWluIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAiZ2FpbnMiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMKKyAgICB7CisgICAgICAgIC8qKiBnYWluIG1vZGVzIHN1cHBvcnRlZCwgZS5nLiBBVURJT19HQUlOX01PREVfQ0hBTk5FTFMuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbW9kZSA9ICJtb2RlIjsKKyAgICAgICAgLyoqIGNvbnRyb2xsZWQgY2hhbm5lbHMsIG5lZWRlZCBpZiBtb2RlIEFVRElPX0dBSU5fTU9ERV9DSEFOTkVMUy4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjaGFubmVsTWFzayA9ICJjaGFubmVsX21hc2siOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm1pblZhbHVlTUIgPSAibWluVmFsdWVNQiI7IC8qKjwgbWluIHZhbHVlIGluIG1pbGxpYmVsLiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm1heFZhbHVlTUIgPSAibWF4VmFsdWVNQiI7IC8qKjwgbWF4IHZhbHVlIGluIG1pbGxpYmVsLiAqLworICAgICAgICAvKiogZGVmYXVsdCB2YWx1ZSBpbiBtaWxsaWJlbC4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpkZWZhdWx0VmFsdWVNQiA9ICJkZWZhdWx0VmFsdWVNQiI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqc3RlcFZhbHVlTUIgPSAic3RlcFZhbHVlTUIiOyAvKio8IHN0ZXAgdmFsdWUgaW4gbWlsbGliZWwuICovCisgICAgICAgIC8qKiBuZWVkZWQgaWYgbW9kZSBBVURJT19HQUlOX01PREVfUkFNUC4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICptaW5SYW1wTXMgPSAibWluUmFtcE1zIjsKKyAgICAgICAgLyoqIG5lZWRlZCBpZiBtb2RlIEFVRElPX0dBSU5fTU9ERV9SQU1QLiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm1heFJhbXBNcyA9ICJtYXhSYW1wTXMiOworICAgICAgICAvKiogbmVlZGVkIHRvIGFsbG93IHVzZSBzZXRQb3J0R2FpbiBpbnN0ZWFkIG9mIHNldFN0cmVhbVZvbHVtZS4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp1c2VGb3JWb2x1bWUgPSAidXNlRm9yVm9sdW1lIjsKKworICAgIH07CisKKyAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKKyAgICAvLyBObyBjaGlsZHJlbgorfTsKKworLy8gQSBwcm9maWxlIHNlY3Rpb24gY29udGFpbnMgYSBuYW1lLCAgb25lIGF1ZGlvIGZvcm1hdCBhbmQgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGVzCisvLyBhbmQgY2hhbm5lbCBtYXNrcyBmb3IgdGhpcyBmb3JtYXQKK3N0cnVjdCBBdWRpb1Byb2ZpbGVUcmFpdHMgOiBwdWJsaWMgQW5kcm9pZENvbGxlY3Rpb25UcmFpdHM8QXVkaW9Qcm9maWxlLCBBdWRpb1Byb2ZpbGVWZWN0b3I+Cit7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAicHJvZmlsZSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gInByb2ZpbGVzIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzCisgICAgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnNhbXBsaW5nUmF0ZXMgPSAic2FtcGxpbmdSYXRlcyI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqZm9ybWF0ID0gImZvcm1hdCI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY2hhbm5lbE1hc2tzID0gImNoYW5uZWxNYXNrcyI7CisgICAgfTsKKworICAgIHN0YXRpYyBSZXR1cm48RWxlbWVudD4gZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLCBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOworfTsKKworc3RydWN0IE1peFBvcnRUcmFpdHMgOiBwdWJsaWMgQW5kcm9pZENvbGxlY3Rpb25UcmFpdHM8SU9Qcm9maWxlLCBJT1Byb2ZpbGVDb2xsZWN0aW9uPgoreworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gIm1peFBvcnQiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJtaXhQb3J0cyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcworICAgIHsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpuYW1lID0gIm5hbWUiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnJvbGUgPSAicm9sZSI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqcm9sZVNvdXJjZSA9ICJzb3VyY2UiOyAvKio8IDxhdHRyaWJ1dGUgcm9sZSBzb3VyY2UgdmFsdWU+LiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmZsYWdzID0gImZsYWdzIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICptYXhPcGVuQ291bnQgPSAibWF4T3BlbkNvdW50IjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICptYXhBY3RpdmVDb3VudCA9ICJtYXhBY3RpdmVDb3VudCI7CisgICAgfTsKKworICAgIHN0YXRpYyBSZXR1cm48RWxlbWVudD4gZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLCBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOworICAgIC8vIENoaWxkcmVuOiBHYWluVHJhaXRzCit9OworCitzdHJ1Y3QgRGV2aWNlUG9ydFRyYWl0cyA6IHB1YmxpYyBBbmRyb2lkQ29sbGVjdGlvblRyYWl0czxEZXZpY2VEZXNjcmlwdG9yLCBEZXZpY2VWZWN0b3I+Cit7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAiZGV2aWNlUG9ydCI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gImRldmljZVBvcnRzIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzCisgICAgeworICAgICAgICAvKiogIDxkZXZpY2UgdGFnIG5hbWU+OiBhbnkgc3RyaW5nIHdpdGhvdXQgc3BhY2UuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnTmFtZSA9ICJ0YWdOYW1lIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0eXBlID0gInR5cGUiOyAvKio8IDxkZXZpY2UgdHlwZT4uICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqcm9sZSA9ICJyb2xlIjsgLyoqPCA8ZGV2aWNlIHJvbGU6IHNpbmsgb3Igc291cmNlPi4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpyb2xlU291cmNlID0gInNvdXJjZSI7IC8qKjwgPGF0dHJpYnV0ZSByb2xlIHNvdXJjZSB2YWx1ZT4uICovCisgICAgICAgIC8qKiBvcHRpb25hbDogZGV2aWNlIGFkZHJlc3MsIGNoYXIgc3RyaW5nIGxlc3MgdGhhbiA2NC4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICphZGRyZXNzID0gImFkZHJlc3MiOworICAgICAgICAvKiogb3B0aW9uYWw6IHRoZSBsaXN0IG9mIGVuY29kZWQgYXVkaW8gZm9ybWF0cyB0aGF0IGFyZSBrbm93biB0byBiZSBzdXBwb3J0ZWQuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqZW5jb2RlZEZvcm1hdHMgPSAiZW5jb2RlZEZvcm1hdHMiOworICAgIH07CisKKyAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKKyAgICAvLyBDaGlsZHJlbjogR2FpblRyYWl0cyAob3B0aW9uYWwpCit9OworCitzdHJ1Y3QgUm91dGVUcmFpdHMgOiBwdWJsaWMgQW5kcm9pZENvbGxlY3Rpb25UcmFpdHM8QXVkaW9Sb3V0ZSwgQXVkaW9Sb3V0ZVZlY3Rvcj4KK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJyb3V0ZSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gInJvdXRlcyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcworICAgIHsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0eXBlID0gInR5cGUiOyAvKio8IDxyb3V0ZSB0eXBlPjogbWl4IG9yIG11eC4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0eXBlTWl4ID0gIm1peCI7IC8qKjwgdHlwZSBhdHRyaWJ1dGUgbWl4IHZhbHVlLiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnNpbmsgPSAic2luayI7IC8qKjwgPHNpbms6IGludm9sdmVkIGluIHRoaXMgcm91dGU+LiAqLworICAgICAgICAvKiogc291cmNlczogYWxsIHNvdXJjZSB0aGF0IGNhbiBiZSBpbnZvbHZlZCBpbiB0aGlzIHJvdXRlLiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnNvdXJjZXMgPSAic291cmNlcyI7CisgICAgfTsKKworICAgIHR5cGVkZWYgSHdNb2R1bGUgKlB0clNlcmlhbGl6aW5nQ3R4OworCisgICAgc3RhdGljIFJldHVybjxFbGVtZW50PiBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7Cit9OworCitzdHJ1Y3QgTW9kdWxlVHJhaXRzIDogcHVibGljIEFuZHJvaWRDb2xsZWN0aW9uVHJhaXRzPEh3TW9kdWxlLCBId01vZHVsZUNvbGxlY3Rpb24+Cit7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAibW9kdWxlIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAibW9kdWxlcyI7CisKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNoaWxkQXR0YWNoZWREZXZpY2VzVGFnID0gImF0dGFjaGVkRGV2aWNlcyI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjaGlsZEF0dGFjaGVkRGV2aWNlVGFnID0gIml0ZW0iOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY2hpbGREZWZhdWx0T3V0cHV0RGV2aWNlVGFnID0gImRlZmF1bHRPdXRwdXREZXZpY2UiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMKKyAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbmFtZSA9ICJuYW1lIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp2ZXJzaW9uID0gImhhbFZlcnNpb24iOworICAgIH07CisKKyAgICB0eXBlZGVmIEF1ZGlvUG9saWN5Q29uZmlnICpQdHJTZXJpYWxpemluZ0N0eDsKKworICAgIHN0YXRpYyBSZXR1cm48RWxlbWVudD4gZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLCBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOworICAgIC8vIENoaWxkcmVuOiBtaXhQb3J0VHJhaXRzLCBkZXZpY2VQb3J0VHJhaXRzLCBhbmQgcm91dGVUcmFpdHMKKyAgICAvLyBOZWVkIHRvIGNhbGwgZGVzZXJpYWxpemUgb24gZWFjaCBjaGlsZAorfTsKKworc3RydWN0IEdsb2JhbENvbmZpZ1RyYWl0cworeworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gImdsb2JhbENvbmZpZ3VyYXRpb24iOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMKKyAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqc3BlYWtlckRyY0VuYWJsZWQgPSAic3BlYWtlcl9kcmNfZW5hYmxlZCI7CisgICAgfTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpyb290LCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKTsKK307CisKK3N0cnVjdCBTdXJyb3VuZFNvdW5kVHJhaXRzCit7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAic3Vycm91bmRTb3VuZCI7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqcm9vdCwgQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZyk7CisgICAgLy8gQ2hpbGRyZW46IFN1cnJvdW5kU291bmRGb3JtYXRUcmFpdHMKK307CisKK3N0cnVjdCBTdXJyb3VuZFNvdW5kRm9ybWF0VHJhaXRzIDogcHVibGljIFN0ZENvbGxlY3Rpb25UcmFpdHM8QXVkaW9Qb2xpY3lDb25maWc6OlN1cnJvdW5kRm9ybWF0cz4KK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJmb3JtYXQiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJmb3JtYXRzIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzCisgICAgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm5hbWUgPSAibmFtZSI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqc3ViZm9ybWF0cyA9ICJzdWJmb3JtYXRzIjsKKyAgICB9OworCisgICAgc3RhdGljIFJldHVybjxFbGVtZW50PiBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7Cit9OworCitjbGFzcyBQb2xpY3lTZXJpYWxpemVyCit7CitwdWJsaWM6CisgICAgUG9saWN5U2VyaWFsaXplcigpIDogbVZlcnNpb257c3RkOjp0b19zdHJpbmcoZ01ham9yKSArICIuIiArIHN0ZDo6dG9fc3RyaW5nKGdNaW5vcil9CisgICAgeworICAgICAgICBBTE9HVigiJXM6IFZlcnNpb249JXMgUm9vdD0lcyIsIF9fZnVuY19fLCBtVmVyc2lvbi5jX3N0cigpLCByb290TmFtZSk7CisgICAgfQorICAgIHN0YXR1c190IGRlc2VyaWFsaXplKGNvbnN0IGNoYXIgKmNvbmZpZ0ZpbGUsIEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpOworCitwcml2YXRlOgorICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqcm9vdE5hbWUgPSAiYXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnZlcnNpb25BdHRyaWJ1dGUgPSAidmVyc2lvbiI7CisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBnTWFqb3IgPSAxOyAvKio8IHRoZSBtYWpvciBudW1iZXIgb2YgdGhlIHBvbGljeSB4bWwgZm9ybWF0IHZlcnNpb24uICovCisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBnTWlub3IgPSAwOyAvKio8IHRoZSBtaW5vciBudW1iZXIgb2YgdGhlIHBvbGljeSB4bWwgZm9ybWF0IHZlcnNpb24uICovCisKKyAgICB0eXBlZGVmIEF1ZGlvUG9saWN5Q29uZmlnIEVsZW1lbnQ7CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBtVmVyc2lvbjsKKworICAgIC8vIENoaWxkcmVuOiBNb2R1bGVzVHJhaXRzLCBWb2x1bWVUcmFpdHMsIFN1cnJvdW5kU291bmRUcmFpdHMgKG9wdGlvbmFsKQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+Citjb25zdGV4cHIgdm9pZCAoKnhtbERlbGV0ZXIpKFQqIHQpOwordGVtcGxhdGUgPD4KK2NvbnN0ZXhwciBhdXRvIHhtbERlbGV0ZXI8eG1sRG9jPiA9IHhtbEZyZWVEb2M7CisvLyBodHRwOi8vYi8xMTEwNjcyNzcgLSBBZGQgYmFjayBjb25zdGV4cHIgd2hlbiB3ZSBzd2l0Y2ggdG8gQysrMTcuCit0ZW1wbGF0ZSA8PgorYXV0byB4bWxEZWxldGVyPHhtbENoYXI+ID0gW10oeG1sQ2hhciAqcykgeyB4bWxGcmVlKHMpOyB9OworCisvKiogQHJldHVybiBhIHVuaXF1ZV9wdHIgd2l0aCB0aGUgY29ycmVjdCBkZWxldGVyIGZvciB0aGUgbGlieG1sMiBvYmplY3QuICovCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NvbnN0ZXhwciBhdXRvIG1ha2VfeG1sVW5pcXVlKFQgKnQpIHsKKyAgICAvLyBXcmFwIGRlbGV0ZXIgaW4gbGFtYmRhIHRvIGVuYWJsZSBlbXB0eSBiYXNlIG9wdGltaXphdGlvbgorICAgIGF1dG8gZGVsZXRlciA9IFtdKFQgKnQpIHsgeG1sRGVsZXRlcjxUPih0KTsgfTsKKyAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPFQsIGRlY2x0eXBlKGRlbGV0ZXIpPnt0LCBkZWxldGVyfTsKK30KKworc3RkOjpzdHJpbmcgZ2V0WG1sQXR0cmlidXRlKGNvbnN0IHhtbE5vZGUgKmN1ciwgY29uc3QgY2hhciAqYXR0cmlidXRlKQoreworICAgIGF1dG8geG1sVmFsdWUgPSBtYWtlX3htbFVuaXF1ZSh4bWxHZXRQcm9wKGN1ciwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4oYXR0cmlidXRlKSkpOworICAgIGlmICh4bWxWYWx1ZSA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybiAiIjsKICAgICB9Ci0gICAgc3RyaW5nIHZhbHVlKChjb25zdCBjaGFyKil4bWxWYWx1ZSk7Ci0gICAgeG1sRnJlZSh4bWxWYWx1ZSk7CisgICAgc3RkOjpzdHJpbmcgdmFsdWUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oeG1sVmFsdWUuZ2V0KCkpKTsKICAgICByZXR1cm4gdmFsdWU7CiB9CiAKLXVzaW5nIHV0aWxpdGllczo6Y29udmVydFRvOwotCi1jb25zdCBjaGFyICpjb25zdCBQb2xpY3lTZXJpYWxpemVyOjpyb290TmFtZSA9ICJhdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24iOwotY29uc3QgY2hhciAqY29uc3QgUG9saWN5U2VyaWFsaXplcjo6dmVyc2lvbkF0dHJpYnV0ZSA9ICJ2ZXJzaW9uIjsKLWNvbnN0IHVpbnQzMl90IFBvbGljeVNlcmlhbGl6ZXI6OmdNYWpvciA9IDE7Ci1jb25zdCB1aW50MzJfdCBQb2xpY3lTZXJpYWxpemVyOjpnTWlub3IgPSAwOwotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGdSZWZlcmVuY2VFbGVtZW50TmFtZSA9ICJyZWZlcmVuY2UiOwotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGdSZWZlcmVuY2VBdHRyaWJ1dGVOYW1lID0gIm5hbWUiOwotCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhaXQ+Ci1zdGF0aWMgdm9pZCBnZXRSZWZlcmVuY2UoY29uc3QgX3htbE5vZGUgKnJvb3QsIGNvbnN0IF94bWxOb2RlIComcmVmTm9kZSwgY29uc3Qgc3RyaW5nICZyZWZOYW1lKQorY29uc3QgeG1sTm9kZSogZ2V0UmVmZXJlbmNlKGNvbnN0IHhtbE5vZGUgKmN1ciwgY29uc3Qgc3RkOjpzdHJpbmcgJnJlZk5hbWUpCiB7Ci0gICAgY29uc3QgX3htbE5vZGUgKmNvbCA9IHJvb3Q7Ci0gICAgd2hpbGUgKGNvbCAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICgheG1sU3RyY21wKGNvbC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilUcmFpdDo6Y29sbGVjdGlvblRhZykpIHsKLSAgICAgICAgICAgIGNvbnN0IHhtbE5vZGUgKmN1ciA9IGNvbC0+Y2hpbGRyZW47Ci0gICAgICAgICAgICB3aGlsZSAoY3VyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAoKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKWdSZWZlcmVuY2VFbGVtZW50TmFtZSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgZ1JlZmVyZW5jZUF0dHJpYnV0ZU5hbWUpOworICAgIGZvciAoOyBjdXIgIT0gTlVMTDsgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgICAgIGlmICgheG1sU3RyY21wKGN1ci0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4oVHJhaXQ6OmNvbGxlY3Rpb25UYWcpKSkgeworICAgICAgICAgICAgZm9yIChjb25zdCB4bWxOb2RlICpjaGlsZCA9IGN1ci0+Y2hpbGRyZW47IGNoaWxkICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKyAgICAgICAgICAgICAgICBpZiAoKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4oVHJhaXQ6OnJlZmVyZW5jZVRhZykpKSkgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBuYW1lID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBUcmFpdDo6QXR0cmlidXRlczo6cmVmZXJlbmNlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChyZWZOYW1lID09IG5hbWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlZk5vZGUgPSBjdXI7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQ7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY3VyID0gY3VyLT5uZXh0OwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGNvbCA9IGNvbC0+bmV4dDsKICAgICB9Ci0gICAgcmV0dXJuOworICAgIHJldHVybiBOVUxMOwogfQogCiB0ZW1wbGF0ZSA8Y2xhc3MgVHJhaXQ+Ci1zdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemVDb2xsZWN0aW9uKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKmN1ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgVHJhaXQ6OkNvbGxlY3Rpb24gJmNvbGxlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIFRyYWl0OjpQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpCitzdGF0dXNfdCBkZXNlcmlhbGl6ZUNvbGxlY3Rpb24oY29uc3QgeG1sTm9kZSAqY3VyLAorICAgICAgICB0eXBlbmFtZSBUcmFpdDo6Q29sbGVjdGlvbiAqY29sbGVjdGlvbiwKKyAgICAgICAgdHlwZW5hbWUgVHJhaXQ6OlB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCkKIHsKLSAgICBjb25zdCB4bWxOb2RlICpyb290ID0gY3VyLT54bWxDaGlsZHJlbk5vZGU7Ci0gICAgd2hpbGUgKHJvb3QgIT0gTlVMTCkgewotICAgICAgICBpZiAoeG1sU3RyY21wKHJvb3QtPm5hbWUsIChjb25zdCB4bWxDaGFyICopVHJhaXQ6OmNvbGxlY3Rpb25UYWcpICYmCi0gICAgICAgICAgICAgICAgeG1sU3RyY21wKHJvb3QtPm5hbWUsIChjb25zdCB4bWxDaGFyICopVHJhaXQ6OnRhZykpIHsKLSAgICAgICAgICAgIHJvb3QgPSByb290LT5uZXh0OwotICAgICAgICAgICAgY29udGludWU7CisgICAgZm9yIChjdXIgPSBjdXItPnhtbENoaWxkcmVuTm9kZTsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgICAgICBjb25zdCB4bWxOb2RlICpjaGlsZCA9IE5VTEw7CisgICAgICAgIGlmICgheG1sU3RyY21wKGN1ci0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4oVHJhaXQ6OmNvbGxlY3Rpb25UYWcpKSkgeworICAgICAgICAgICAgY2hpbGQgPSBjdXItPnhtbENoaWxkcmVuTm9kZTsKKyAgICAgICAgfSBlbHNlIGlmICgheG1sU3RyY21wKGN1ci0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4oVHJhaXQ6OnRhZykpKSB7CisgICAgICAgICAgICBjaGlsZCA9IGN1cjsKICAgICAgICAgfQotICAgICAgICBjb25zdCB4bWxOb2RlICpjaGlsZCA9IHJvb3Q7Ci0gICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVRyYWl0Ojpjb2xsZWN0aW9uVGFnKSkgewotICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC0+eG1sQ2hpbGRyZW5Ob2RlOwotICAgICAgICB9Ci0gICAgICAgIHdoaWxlIChjaGlsZCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilUcmFpdDo6dGFnKSkgewotICAgICAgICAgICAgICAgIHR5cGVuYW1lIFRyYWl0OjpQdHJFbGVtZW50IGVsZW1lbnQ7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gVHJhaXQ6OmRlc2VyaWFsaXplKGRvYywgY2hpbGQsIGVsZW1lbnQsIHNlcmlhbGl6aW5nQ29udGV4dCk7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoY29sbGVjdGlvbi5hZGQoZWxlbWVudCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogY291bGQgbm90IGFkZCBlbGVtZW50IHRvICVzIGNvbGxlY3Rpb24iLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWl0Ojpjb2xsZWN0aW9uVGFnKTsKKyAgICAgICAgZm9yICg7IGNoaWxkICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKyAgICAgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihUcmFpdDo6dGFnKSkpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGVsZW1lbnQgPSBUcmFpdDo6ZGVzZXJpYWxpemUoY2hpbGQsIHNlcmlhbGl6aW5nQ29udGV4dCk7CisgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IFRyYWl0OjphZGRFbGVtZW50VG9Db2xsZWN0aW9uKGVsZW1lbnQsIGNvbGxlY3Rpb24pOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGNvdWxkIG5vdCBhZGQgZWxlbWVudCB0byAlcyBjb2xsZWN0aW9uIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhaXQ6OmNvbGxlY3Rpb25UYWcpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dDsKICAgICAgICAgfQotICAgICAgICBpZiAoIXhtbFN0cmNtcChyb290LT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVRyYWl0Ojp0YWcpKSB7CisgICAgICAgIGlmICgheG1sU3RyY21wKGN1ci0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4oVHJhaXQ6OnRhZykpKSB7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KLSAgICAgICAgcm9vdCA9IHJvb3QtPm5leHQ7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotY29uc3QgY2hhciAqY29uc3QgQXVkaW9HYWluVHJhaXRzOjp0YWcgPSAiZ2FpbiI7Ci1jb25zdCBjaGFyICpjb25zdCBBdWRpb0dhaW5UcmFpdHM6OmNvbGxlY3Rpb25UYWcgPSAiZ2FpbnMiOwotCi1jb25zdCBjaGFyIEF1ZGlvR2FpblRyYWl0czo6QXR0cmlidXRlczo6bW9kZVtdID0gIm1vZGUiOwotY29uc3QgY2hhciBBdWRpb0dhaW5UcmFpdHM6OkF0dHJpYnV0ZXM6OmNoYW5uZWxNYXNrW10gPSAiY2hhbm5lbF9tYXNrIjsKLWNvbnN0IGNoYXIgQXVkaW9HYWluVHJhaXRzOjpBdHRyaWJ1dGVzOjptaW5WYWx1ZU1CW10gPSAibWluVmFsdWVNQiI7Ci1jb25zdCBjaGFyIEF1ZGlvR2FpblRyYWl0czo6QXR0cmlidXRlczo6bWF4VmFsdWVNQltdID0gIm1heFZhbHVlTUIiOwotY29uc3QgY2hhciBBdWRpb0dhaW5UcmFpdHM6OkF0dHJpYnV0ZXM6OmRlZmF1bHRWYWx1ZU1CW10gPSAiZGVmYXVsdFZhbHVlTUIiOwotY29uc3QgY2hhciBBdWRpb0dhaW5UcmFpdHM6OkF0dHJpYnV0ZXM6OnN0ZXBWYWx1ZU1CW10gPSAic3RlcFZhbHVlTUIiOwotY29uc3QgY2hhciBBdWRpb0dhaW5UcmFpdHM6OkF0dHJpYnV0ZXM6Om1pblJhbXBNc1tdID0gIm1pblJhbXBNcyI7Ci1jb25zdCBjaGFyIEF1ZGlvR2FpblRyYWl0czo6QXR0cmlidXRlczo6bWF4UmFtcE1zW10gPSAibWF4UmFtcE1zIjsKLQotc3RhdHVzX3QgQXVkaW9HYWluVHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICovKmRvYyovLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmZ2FpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKK1JldHVybjxBdWRpb0dhaW5UcmFpdHM6OkVsZW1lbnQ+IEF1ZGlvR2FpblRyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLAorICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQogewogICAgIHN0YXRpYyB1aW50MzJfdCBpbmRleCA9IDA7Ci0gICAgZ2FpbiA9IG5ldyBFbGVtZW50KGluZGV4KyssIHRydWUpOworICAgIEVsZW1lbnQgZ2FpbiA9IG5ldyBBdWRpb0dhaW4oaW5kZXgrKywgdHJ1ZSk7CiAKLSAgICBzdHJpbmcgbW9kZSA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjptb2RlKTsKKyAgICBzdGQ6OnN0cmluZyBtb2RlID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6bW9kZSk7CiAgICAgaWYgKCFtb2RlLmVtcHR5KCkpIHsKICAgICAgICAgZ2Fpbi0+c2V0TW9kZShHYWluTW9kZUNvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcobW9kZSkpOwogICAgIH0KIAotICAgIHN0cmluZyBjaGFubmVsc0xpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6Y2hhbm5lbE1hc2spOworICAgIHN0ZDo6c3RyaW5nIGNoYW5uZWxzTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OmNoYW5uZWxNYXNrKTsKICAgICBpZiAoIWNoYW5uZWxzTGl0ZXJhbC5lbXB0eSgpKSB7CiAgICAgICAgIGdhaW4tPnNldENoYW5uZWxNYXNrKGNoYW5uZWxNYXNrRnJvbVN0cmluZyhjaGFubmVsc0xpdGVyYWwpKTsKICAgICB9CiAKLSAgICBzdHJpbmcgbWluVmFsdWVNQkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6bWluVmFsdWVNQik7CisgICAgc3RkOjpzdHJpbmcgbWluVmFsdWVNQkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjptaW5WYWx1ZU1CKTsKICAgICBpbnQzMl90IG1pblZhbHVlTUI7CiAgICAgaWYgKCFtaW5WYWx1ZU1CTGl0ZXJhbC5lbXB0eSgpICYmIGNvbnZlcnRUbyhtaW5WYWx1ZU1CTGl0ZXJhbCwgbWluVmFsdWVNQikpIHsKICAgICAgICAgZ2Fpbi0+c2V0TWluVmFsdWVJbk1iKG1pblZhbHVlTUIpOwogICAgIH0KIAotICAgIHN0cmluZyBtYXhWYWx1ZU1CTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjptYXhWYWx1ZU1CKTsKKyAgICBzdGQ6OnN0cmluZyBtYXhWYWx1ZU1CTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6Om1heFZhbHVlTUIpOwogICAgIGludDMyX3QgbWF4VmFsdWVNQjsKICAgICBpZiAoIW1heFZhbHVlTUJMaXRlcmFsLmVtcHR5KCkgJiYgY29udmVydFRvKG1heFZhbHVlTUJMaXRlcmFsLCBtYXhWYWx1ZU1CKSkgewogICAgICAgICBnYWluLT5zZXRNYXhWYWx1ZUluTWIobWF4VmFsdWVNQik7CiAgICAgfQogCi0gICAgc3RyaW5nIGRlZmF1bHRWYWx1ZU1CTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpkZWZhdWx0VmFsdWVNQik7CisgICAgc3RkOjpzdHJpbmcgZGVmYXVsdFZhbHVlTUJMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6ZGVmYXVsdFZhbHVlTUIpOwogICAgIGludDMyX3QgZGVmYXVsdFZhbHVlTUI7CiAgICAgaWYgKCFkZWZhdWx0VmFsdWVNQkxpdGVyYWwuZW1wdHkoKSAmJiBjb252ZXJ0VG8oZGVmYXVsdFZhbHVlTUJMaXRlcmFsLCBkZWZhdWx0VmFsdWVNQikpIHsKICAgICAgICAgZ2Fpbi0+c2V0RGVmYXVsdFZhbHVlSW5NYihkZWZhdWx0VmFsdWVNQik7CiAgICAgfQogCi0gICAgc3RyaW5nIHN0ZXBWYWx1ZU1CTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpzdGVwVmFsdWVNQik7CisgICAgc3RkOjpzdHJpbmcgc3RlcFZhbHVlTUJMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6c3RlcFZhbHVlTUIpOwogICAgIHVpbnQzMl90IHN0ZXBWYWx1ZU1COwogICAgIGlmICghc3RlcFZhbHVlTUJMaXRlcmFsLmVtcHR5KCkgJiYgY29udmVydFRvKHN0ZXBWYWx1ZU1CTGl0ZXJhbCwgc3RlcFZhbHVlTUIpKSB7CiAgICAgICAgIGdhaW4tPnNldFN0ZXBWYWx1ZUluTWIoc3RlcFZhbHVlTUIpOwogICAgIH0KIAotICAgIHN0cmluZyBtaW5SYW1wTXNMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6Om1pblJhbXBNcyk7CisgICAgc3RkOjpzdHJpbmcgbWluUmFtcE1zTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6Om1pblJhbXBNcyk7CiAgICAgdWludDMyX3QgbWluUmFtcE1zOwogICAgIGlmICghbWluUmFtcE1zTGl0ZXJhbC5lbXB0eSgpICYmIGNvbnZlcnRUbyhtaW5SYW1wTXNMaXRlcmFsLCBtaW5SYW1wTXMpKSB7CiAgICAgICAgIGdhaW4tPnNldE1pblJhbXBJbk1zKG1pblJhbXBNcyk7CiAgICAgfQogCi0gICAgc3RyaW5nIG1heFJhbXBNc0xpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6bWF4UmFtcE1zKTsKKyAgICBzdGQ6OnN0cmluZyBtYXhSYW1wTXNMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6bWF4UmFtcE1zKTsKICAgICB1aW50MzJfdCBtYXhSYW1wTXM7CiAgICAgaWYgKCFtYXhSYW1wTXNMaXRlcmFsLmVtcHR5KCkgJiYgY29udmVydFRvKG1heFJhbXBNc0xpdGVyYWwsIG1heFJhbXBNcykpIHsKICAgICAgICAgZ2Fpbi0+c2V0TWF4UmFtcEluTXMobWF4UmFtcE1zKTsKICAgICB9Ci0gICAgQUxPR1YoIiVzOiBhZGRpbmcgbmV3IGdhaW4gbW9kZSAlMDh4IGNoYW5uZWwgbWFzayAlMDh4IG1pbiBtQiAlZCBtYXggbUIgJWQiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgZ2Fpbi0+Z2V0TW9kZSgpLCBnYWluLT5nZXRDaGFubmVsTWFzaygpLCBnYWluLT5nZXRNaW5WYWx1ZUluTWIoKSwKLSAgICAgICAgICBnYWluLT5nZXRNYXhWYWx1ZUluTWIoKSk7Ci0KLSAgICBpZiAoZ2Fpbi0+Z2V0TW9kZSgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBzdGQ6OnN0cmluZyB1c2VGb3JWb2x1bWVMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6dXNlRm9yVm9sdW1lKTsKKyAgICBib29sIHVzZUZvclZvbHVtZSA9IGZhbHNlOworICAgIGlmICghdXNlRm9yVm9sdW1lTGl0ZXJhbC5lbXB0eSgpICYmIGNvbnZlcnRUbyh1c2VGb3JWb2x1bWVMaXRlcmFsLCB1c2VGb3JWb2x1bWUpKSB7CisgICAgICAgIGdhaW4tPnNldFVzZUZvclZvbHVtZSh1c2VGb3JWb2x1bWUpOwogICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgQUxPR1YoIiVzOiBhZGRpbmcgbmV3IGdhaW4gbW9kZSAlMDh4IGNoYW5uZWwgbWFzayAlMDh4IG1pbiBtQiAlZCBtYXggbUIgJWQgVXNlRm9yVm9sdW1lOiAlZCIsCisgICAgICAgICAgX19mdW5jX18sIGdhaW4tPmdldE1vZGUoKSwgZ2Fpbi0+Z2V0Q2hhbm5lbE1hc2soKSwgZ2Fpbi0+Z2V0TWluVmFsdWVJbk1iKCksCisgICAgICAgICAgZ2Fpbi0+Z2V0TWF4VmFsdWVJbk1iKCksIHVzZUZvclZvbHVtZSk7CisKKyAgICBpZiAoZ2Fpbi0+Z2V0TW9kZSgpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIGdhaW47CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICB9CiB9CiAKLWNvbnN0IGNoYXIgKmNvbnN0IEF1ZGlvUHJvZmlsZVRyYWl0czo6Y29sbGVjdGlvblRhZyA9ICJwcm9maWxlcyI7Ci1jb25zdCBjaGFyICpjb25zdCBBdWRpb1Byb2ZpbGVUcmFpdHM6OnRhZyA9ICJwcm9maWxlIjsKLQotY29uc3QgY2hhciBBdWRpb1Byb2ZpbGVUcmFpdHM6OkF0dHJpYnV0ZXM6Om5hbWVbXSA9ICJuYW1lIjsKLWNvbnN0IGNoYXIgQXVkaW9Qcm9maWxlVHJhaXRzOjpBdHRyaWJ1dGVzOjpzYW1wbGluZ1JhdGVzW10gPSAic2FtcGxpbmdSYXRlcyI7Ci1jb25zdCBjaGFyIEF1ZGlvUHJvZmlsZVRyYWl0czo6QXR0cmlidXRlczo6Zm9ybWF0W10gPSAiZm9ybWF0IjsKLWNvbnN0IGNoYXIgQXVkaW9Qcm9maWxlVHJhaXRzOjpBdHRyaWJ1dGVzOjpjaGFubmVsTWFza3NbXSA9ICJjaGFubmVsTWFza3MiOwotCi1zdGF0dXNfdCBBdWRpb1Byb2ZpbGVUcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKi8qZG9jKi8sIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZwcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQorUmV0dXJuPEF1ZGlvUHJvZmlsZVRyYWl0czo6RWxlbWVudD4gQXVkaW9Qcm9maWxlVHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsCisgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCiB7Ci0gICAgc3RyaW5nIHNhbXBsaW5nUmF0ZXMgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6c2FtcGxpbmdSYXRlcyk7Ci0gICAgc3RyaW5nIGZvcm1hdCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpmb3JtYXQpOwotICAgIHN0cmluZyBjaGFubmVscyA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpjaGFubmVsTWFza3MpOworICAgIHN0ZDo6c3RyaW5nIHNhbXBsaW5nUmF0ZXMgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpzYW1wbGluZ1JhdGVzKTsKKyAgICBzdGQ6OnN0cmluZyBmb3JtYXQgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpmb3JtYXQpOworICAgIHN0ZDo6c3RyaW5nIGNoYW5uZWxzID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6Y2hhbm5lbE1hc2tzKTsKIAotICAgIHByb2ZpbGUgPSBuZXcgRWxlbWVudChmb3JtYXRGcm9tU3RyaW5nKGZvcm1hdCwgZ0R5bmFtaWNGb3JtYXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3NGcm9tU3RyaW5nKGNoYW5uZWxzLCAiLCIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzRnJvbVN0cmluZyhzYW1wbGluZ1JhdGVzLCAiLCIpKTsKKyAgICBFbGVtZW50IHByb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKGZvcm1hdEZyb21TdHJpbmcoZm9ybWF0LCBnRHluYW1pY0Zvcm1hdCksCisgICAgICAgICAgICBjaGFubmVsTWFza3NGcm9tU3RyaW5nKGNoYW5uZWxzLCAiLCIpLAorICAgICAgICAgICAgc2FtcGxpbmdSYXRlc0Zyb21TdHJpbmcoc2FtcGxpbmdSYXRlcywgIiwiKSk7CiAKICAgICBwcm9maWxlLT5zZXREeW5hbWljRm9ybWF0KHByb2ZpbGUtPmdldEZvcm1hdCgpID09IGdEeW5hbWljRm9ybWF0KTsKICAgICBwcm9maWxlLT5zZXREeW5hbWljQ2hhbm5lbHMocHJvZmlsZS0+Z2V0Q2hhbm5lbHMoKS5pc0VtcHR5KCkpOwogICAgIHByb2ZpbGUtPnNldER5bmFtaWNSYXRlKHByb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCkuaXNFbXB0eSgpKTsKIAotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICByZXR1cm4gcHJvZmlsZTsKIH0KIAotCi1jb25zdCBjaGFyICpjb25zdCBNaXhQb3J0VHJhaXRzOjpjb2xsZWN0aW9uVGFnID0gIm1peFBvcnRzIjsKLWNvbnN0IGNoYXIgKmNvbnN0IE1peFBvcnRUcmFpdHM6OnRhZyA9ICJtaXhQb3J0IjsKLQotY29uc3QgY2hhciBNaXhQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjpuYW1lW10gPSAibmFtZSI7Ci1jb25zdCBjaGFyIE1peFBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6OnJvbGVbXSA9ICJyb2xlIjsKLWNvbnN0IGNoYXIgTWl4UG9ydFRyYWl0czo6QXR0cmlidXRlczo6ZmxhZ3NbXSA9ICJmbGFncyI7Ci1jb25zdCBjaGFyIE1peFBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6Om1heE9wZW5Db3VudFtdID0gIm1heE9wZW5Db3VudCI7Ci1jb25zdCBjaGFyIE1peFBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6Om1heEFjdGl2ZUNvdW50W10gPSAibWF4QWN0aXZlQ291bnQiOwotCi1zdGF0dXNfdCBNaXhQb3J0VHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpjaGlsZCwgUHRyRWxlbWVudCAmbWl4UG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCitSZXR1cm48TWl4UG9ydFRyYWl0czo6RWxlbWVudD4gTWl4UG9ydFRyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY2hpbGQsCisgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCiB7Ci0gICAgc3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om5hbWUpOwogICAgIGlmIChuYW1lLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6bmFtZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6bmFtZSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQotICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgQXR0cmlidXRlczo6bmFtZSwgbmFtZS5jX3N0cigpKTsKLSAgICBzdHJpbmcgcm9sZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6cm9sZSk7CisgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIEF0dHJpYnV0ZXM6Om5hbWUsIG5hbWUuY19zdHIoKSk7CisgICAgc3RkOjpzdHJpbmcgcm9sZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6cm9sZSk7CiAgICAgaWYgKHJvbGUuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpyb2xlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpyb2xlKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9Ci0gICAgQUxPR1YoIiVzOiBSb2xlPSVzIiwgX19GVU5DVElPTl9fLCByb2xlLmNfc3RyKCkpOwotICAgIGF1ZGlvX3BvcnRfcm9sZV90IHBvcnRSb2xlID0gcm9sZSA9PSAic291cmNlIiA/IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UgOiBBVURJT19QT1JUX1JPTEVfU0lOSzsKKyAgICBBTE9HVigiJXM6IFJvbGU9JXMiLCBfX2Z1bmNfXywgcm9sZS5jX3N0cigpKTsKKyAgICBhdWRpb19wb3J0X3JvbGVfdCBwb3J0Um9sZSA9IChyb2xlID09IEF0dHJpYnV0ZXM6OnJvbGVTb3VyY2UpID8KKyAgICAgICAgICAgIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UgOiBBVURJT19QT1JUX1JPTEVfU0lOSzsKIAotICAgIG1peFBvcnQgPSBuZXcgRWxlbWVudChTdHJpbmc4KG5hbWUuY19zdHIoKSksIHBvcnRSb2xlKTsKKyAgICBFbGVtZW50IG1peFBvcnQgPSBuZXcgSU9Qcm9maWxlKFN0cmluZzgobmFtZS5jX3N0cigpKSwgcG9ydFJvbGUpOwogCiAgICAgQXVkaW9Qcm9maWxlVHJhaXRzOjpDb2xsZWN0aW9uIHByb2ZpbGVzOwotICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb1Byb2ZpbGVUcmFpdHM+KGRvYywgY2hpbGQsIHByb2ZpbGVzLCBOVUxMKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248QXVkaW9Qcm9maWxlVHJhaXRzPihjaGlsZCwgJnByb2ZpbGVzLCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKHN0YXR1cyk7CisgICAgfQogICAgIGlmIChwcm9maWxlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgc3AgPEF1ZGlvUHJvZmlsZT4gZHluYW1pY1Byb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKGdEeW5hbWljRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbHNWZWN0b3IoKSwgU2FtcGxlUmF0ZVZlY3RvcigpKTsKLSAgICAgICAgZHluYW1pY1Byb2ZpbGUtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7Ci0gICAgICAgIGR5bmFtaWNQcm9maWxlLT5zZXREeW5hbWljQ2hhbm5lbHModHJ1ZSk7Ci0gICAgICAgIGR5bmFtaWNQcm9maWxlLT5zZXREeW5hbWljUmF0ZSh0cnVlKTsKLSAgICAgICAgcHJvZmlsZXMuYWRkKGR5bmFtaWNQcm9maWxlKTsKKyAgICAgICAgcHJvZmlsZXMuYWRkKEF1ZGlvUHJvZmlsZTo6Y3JlYXRlRnVsbER5bmFtaWMoKSk7CiAgICAgfQogICAgIG1peFBvcnQtPnNldEF1ZGlvUHJvZmlsZXMocHJvZmlsZXMpOwogCi0gICAgc3RyaW5nIGZsYWdzID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjpmbGFncyk7CisgICAgc3RkOjpzdHJpbmcgZmxhZ3MgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6OmZsYWdzKTsKICAgICBpZiAoIWZsYWdzLmVtcHR5KCkpIHsKICAgICAgICAgLy8gU291cmNlIHJvbGUKICAgICAgICAgaWYgKHBvcnRSb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpIHsKQEAgLTI2MSw1MiArNDUyLDQ2IEBACiAgICAgICAgICAgICBtaXhQb3J0LT5zZXRGbGFncyhJbnB1dEZsYWdDb252ZXJ0ZXI6Om1hc2tGcm9tU3RyaW5nKGZsYWdzKSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgc3RyaW5nIG1heE9wZW5Db3VudCA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6bWF4T3BlbkNvdW50KTsKKyAgICBzdGQ6OnN0cmluZyBtYXhPcGVuQ291bnQgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om1heE9wZW5Db3VudCk7CiAgICAgaWYgKCFtYXhPcGVuQ291bnQuZW1wdHkoKSkgewogICAgICAgICBjb252ZXJ0VG8obWF4T3BlbkNvdW50LCBtaXhQb3J0LT5tYXhPcGVuQ291bnQpOwogICAgIH0KLSAgICBzdHJpbmcgbWF4QWN0aXZlQ291bnQgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om1heEFjdGl2ZUNvdW50KTsKKyAgICBzdGQ6OnN0cmluZyBtYXhBY3RpdmVDb3VudCA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6bWF4QWN0aXZlQ291bnQpOwogICAgIGlmICghbWF4QWN0aXZlQ291bnQuZW1wdHkoKSkgewogICAgICAgICBjb252ZXJ0VG8obWF4QWN0aXZlQ291bnQsIG1peFBvcnQtPm1heEFjdGl2ZUNvdW50KTsKICAgICB9CiAgICAgLy8gRGVzZXJpYWxpemUgY2hpbGRyZW4KICAgICBBdWRpb0dhaW5UcmFpdHM6OkNvbGxlY3Rpb24gZ2FpbnM7Ci0gICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPEF1ZGlvR2FpblRyYWl0cz4oZG9jLCBjaGlsZCwgZ2FpbnMsIE5VTEwpOworICAgIHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb0dhaW5UcmFpdHM+KGNoaWxkLCAmZ2FpbnMsIE5VTEwpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CiAgICAgbWl4UG9ydC0+c2V0R2FpbnMoZ2FpbnMpOwogCi0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIHJldHVybiBtaXhQb3J0OwogfQogCi1jb25zdCBjaGFyICpjb25zdCBEZXZpY2VQb3J0VHJhaXRzOjp0YWcgPSAiZGV2aWNlUG9ydCI7Ci1jb25zdCBjaGFyICpjb25zdCBEZXZpY2VQb3J0VHJhaXRzOjpjb2xsZWN0aW9uVGFnID0gImRldmljZVBvcnRzIjsKLQotY29uc3QgY2hhciBEZXZpY2VQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjp0YWdOYW1lW10gPSAidGFnTmFtZSI7Ci1jb25zdCBjaGFyIERldmljZVBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6OnR5cGVbXSA9ICJ0eXBlIjsKLWNvbnN0IGNoYXIgRGV2aWNlUG9ydFRyYWl0czo6QXR0cmlidXRlczo6cm9sZVtdID0gInJvbGUiOwotY29uc3QgY2hhciBEZXZpY2VQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjphZGRyZXNzW10gPSAiYWRkcmVzcyI7Ci1jb25zdCBjaGFyIERldmljZVBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6OnJvbGVTb3VyY2VbXSA9ICJzb3VyY2UiOwotCi1zdGF0dXNfdCBEZXZpY2VQb3J0VHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZkZXZpY2VEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKK1JldHVybjxEZXZpY2VQb3J0VHJhaXRzOjpFbGVtZW50PiBEZXZpY2VQb3J0VHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsCisgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCiB7Ci0gICAgc3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6dGFnTmFtZSk7CisgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnRhZ05hbWUpOwogICAgIGlmIChuYW1lLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6dGFnTmFtZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6dGFnTmFtZSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQotICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgQXR0cmlidXRlczo6dGFnTmFtZSwgbmFtZS5jX3N0cigpKTsKLSAgICBzdHJpbmcgdHlwZU5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6dHlwZSk7CisgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIEF0dHJpYnV0ZXM6OnRhZ05hbWUsIG5hbWUuY19zdHIoKSk7CisgICAgc3RkOjpzdHJpbmcgdHlwZU5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjp0eXBlKTsKICAgICBpZiAodHlwZU5hbWUuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IG5vIHR5cGUgZm9yICVzIiwgX19GVU5DVElPTl9fLCBuYW1lLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiJXM6IG5vIHR5cGUgZm9yICVzIiwgX19mdW5jX18sIG5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQotICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgQXR0cmlidXRlczo6dHlwZSwgdHlwZU5hbWUuY19zdHIoKSk7Ci0gICAgc3RyaW5nIHJvbGUgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6cm9sZSk7CisgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIEF0dHJpYnV0ZXM6OnR5cGUsIHR5cGVOYW1lLmNfc3RyKCkpOworICAgIHN0ZDo6c3RyaW5nIHJvbGUgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpyb2xlKTsKICAgICBpZiAocm9sZS5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OnJvbGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19mdW5jX18sIEF0dHJpYnV0ZXM6OnJvbGUpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KLSAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19GVU5DVElPTl9fLCB0YWcsIEF0dHJpYnV0ZXM6OnJvbGUsIHJvbGUuY19zdHIoKSk7CisgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIEF0dHJpYnV0ZXM6OnJvbGUsIHJvbGUuY19zdHIoKSk7CiAgICAgYXVkaW9fcG9ydF9yb2xlX3QgcG9ydFJvbGUgPSAocm9sZSA9PSBBdHRyaWJ1dGVzOjpyb2xlU291cmNlKSA/CiAgICAgICAgICAgICAgICAgQVVESU9fUE9SVF9ST0xFX1NPVVJDRSA6IEFVRElPX1BPUlRfUk9MRV9TSU5LOwogCkBAIC0zMTQsMzM4ICs0OTksMzAxIEBACiAgICAgaWYgKCFkZXZpY2VGcm9tU3RyaW5nKHR5cGVOYW1lLCB0eXBlKSB8fAogICAgICAgICAgICAgKCFhdWRpb19pc19pbnB1dF9kZXZpY2UodHlwZSkgJiYgcG9ydFJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkgfHwKICAgICAgICAgICAgICghYXVkaW9faXNfb3V0cHV0X2RldmljZXModHlwZSkgJiYgcG9ydFJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTkspKSB7Ci0gICAgICAgIEFMT0dXKCIlczogYmFkIHR5cGUgJTA4eCIsIF9fRlVOQ1RJT05fXywgdHlwZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dXKCIlczogYmFkIHR5cGUgJTA4eCIsIF9fZnVuY19fLCB0eXBlKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9Ci0gICAgZGV2aWNlRGVzYyA9IG5ldyBFbGVtZW50KHR5cGUsIFN0cmluZzgobmFtZS5jX3N0cigpKSk7CisgICAgc3RkOjpzdHJpbmcgZW5jb2RlZEZvcm1hdHNMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6ZW5jb2RlZEZvcm1hdHMpOworICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX2Z1bmNfXywgdGFnLCBBdHRyaWJ1dGVzOjplbmNvZGVkRm9ybWF0cywgZW5jb2RlZEZvcm1hdHNMaXRlcmFsLmNfc3RyKCkpOworICAgIEZvcm1hdFZlY3RvciBlbmNvZGVkRm9ybWF0czsKKyAgICBpZiAoIWVuY29kZWRGb3JtYXRzTGl0ZXJhbC5lbXB0eSgpKSB7CisgICAgICAgIGVuY29kZWRGb3JtYXRzID0gZm9ybWF0c0Zyb21TdHJpbmcoZW5jb2RlZEZvcm1hdHNMaXRlcmFsLCAiICIpOworICAgIH0KKyAgICBFbGVtZW50IGRldmljZURlc2MgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcih0eXBlLCBlbmNvZGVkRm9ybWF0cywgU3RyaW5nOChuYW1lLmNfc3RyKCkpKTsKIAotICAgIHN0cmluZyBhZGRyZXNzID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OmFkZHJlc3MpOworICAgIHN0ZDo6c3RyaW5nIGFkZHJlc3MgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjphZGRyZXNzKTsKICAgICBpZiAoIWFkZHJlc3MuZW1wdHkoKSkgewotICAgICAgICBBTE9HVigiJXM6IGFkZHJlc3M9JXMgZm9yICVzIiwgX19GVU5DVElPTl9fLCBhZGRyZXNzLmNfc3RyKCksIG5hbWUuY19zdHIoKSk7Ci0gICAgICAgIGRldmljZURlc2MtPm1BZGRyZXNzID0gU3RyaW5nOChhZGRyZXNzLmNfc3RyKCkpOworICAgICAgICBBTE9HVigiJXM6IGFkZHJlc3M9JXMgZm9yICVzIiwgX19mdW5jX18sIGFkZHJlc3MuY19zdHIoKSwgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgZGV2aWNlRGVzYy0+c2V0QWRkcmVzcyhTdHJpbmc4KGFkZHJlc3MuY19zdHIoKSkpOwogICAgIH0KIAogICAgIEF1ZGlvUHJvZmlsZVRyYWl0czo6Q29sbGVjdGlvbiBwcm9maWxlczsKLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248QXVkaW9Qcm9maWxlVHJhaXRzPihkb2MsIHJvb3QsIHByb2ZpbGVzLCBOVUxMKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248QXVkaW9Qcm9maWxlVHJhaXRzPihjdXIsICZwcm9maWxlcywgTlVMTCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChzdGF0dXMpOworICAgIH0KICAgICBpZiAocHJvZmlsZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHNwIDxBdWRpb1Byb2ZpbGU+IGR5bmFtaWNQcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZShnRHluYW1pY0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWxzVmVjdG9yKCksIFNhbXBsZVJhdGVWZWN0b3IoKSk7Ci0gICAgICAgIGR5bmFtaWNQcm9maWxlLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOwotICAgICAgICBkeW5hbWljUHJvZmlsZS0+c2V0RHluYW1pY0NoYW5uZWxzKHRydWUpOwotICAgICAgICBkeW5hbWljUHJvZmlsZS0+c2V0RHluYW1pY1JhdGUodHJ1ZSk7Ci0gICAgICAgIHByb2ZpbGVzLmFkZChkeW5hbWljUHJvZmlsZSk7CisgICAgICAgIHByb2ZpbGVzLmFkZChBdWRpb1Byb2ZpbGU6OmNyZWF0ZUZ1bGxEeW5hbWljKCkpOwogICAgIH0KICAgICBkZXZpY2VEZXNjLT5zZXRBdWRpb1Byb2ZpbGVzKHByb2ZpbGVzKTsKIAogICAgIC8vIERlc2VyaWFsaXplIEF1ZGlvR2FpbiBjaGlsZHJlbgotICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb0dhaW5UcmFpdHM+KGRvYywgcm9vdCwgZGV2aWNlRGVzYy0+bUdhaW5zLCBOVUxMKTsKLSAgICBBTE9HVigiJXM6IGFkZGluZyBkZXZpY2UgdGFnICVzIHR5cGUgJTA4eCBhZGRyZXNzICVzIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgIGRldmljZURlc2MtPmdldE5hbWUoKS5zdHJpbmcoKSwgdHlwZSwgZGV2aWNlRGVzYy0+bUFkZHJlc3Muc3RyaW5nKCkpOwotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248QXVkaW9HYWluVHJhaXRzPihjdXIsICZkZXZpY2VEZXNjLT5tR2FpbnMsIE5VTEwpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CisgICAgQUxPR1YoIiVzOiBhZGRpbmcgZGV2aWNlIHRhZyAlcyB0eXBlICUwOHggYWRkcmVzcyAlcyIsIF9fZnVuY19fLAorICAgICAgICAgIGRldmljZURlc2MtPmdldE5hbWUoKS5zdHJpbmcoKSwgdHlwZSwgZGV2aWNlRGVzYy0+YWRkcmVzcygpLnN0cmluZygpKTsKKyAgICByZXR1cm4gZGV2aWNlRGVzYzsKIH0KIAotY29uc3QgY2hhciAqY29uc3QgUm91dGVUcmFpdHM6OnRhZyA9ICJyb3V0ZSI7Ci1jb25zdCBjaGFyICpjb25zdCBSb3V0ZVRyYWl0czo6Y29sbGVjdGlvblRhZyA9ICJyb3V0ZXMiOwotCi1jb25zdCBjaGFyIFJvdXRlVHJhaXRzOjpBdHRyaWJ1dGVzOjp0eXBlW10gPSAidHlwZSI7Ci1jb25zdCBjaGFyIFJvdXRlVHJhaXRzOjpBdHRyaWJ1dGVzOjp0eXBlTWl4W10gPSAibWl4IjsKLWNvbnN0IGNoYXIgUm91dGVUcmFpdHM6OkF0dHJpYnV0ZXM6OnNpbmtbXSA9ICJzaW5rIjsKLWNvbnN0IGNoYXIgUm91dGVUcmFpdHM6OkF0dHJpYnV0ZXM6OnNvdXJjZXNbXSA9ICJzb3VyY2VzIjsKLQotCi1zdGF0dXNfdCBSb3V0ZVRyYWl0czo6ZGVzZXJpYWxpemUoX3htbERvYyAqLypkb2MqLywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggY3R4KQorUmV0dXJuPFJvdXRlVHJhaXRzOjpFbGVtZW50PiBSb3V0ZVRyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLCBQdHJTZXJpYWxpemluZ0N0eCBjdHgpCiB7Ci0gICAgc3RyaW5nIHR5cGUgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6dHlwZSk7CisgICAgc3RkOjpzdHJpbmcgdHlwZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnR5cGUpOwogICAgIGlmICh0eXBlLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6dHlwZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6dHlwZSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQogICAgIGF1ZGlvX3JvdXRlX3R5cGVfdCByb3V0ZVR5cGUgPSAodHlwZSA9PSBBdHRyaWJ1dGVzOjp0eXBlTWl4KSA/CiAgICAgICAgICAgICAgICAgQVVESU9fUk9VVEVfTUlYIDogQVVESU9fUk9VVEVfTVVYOwogCi0gICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fRlVOQ1RJT05fXywgdGFnLCBBdHRyaWJ1dGVzOjp0eXBlLCB0eXBlLmNfc3RyKCkpOwotICAgIGVsZW1lbnQgPSBuZXcgRWxlbWVudChyb3V0ZVR5cGUpOworICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX2Z1bmNfXywgdGFnLCBBdHRyaWJ1dGVzOjp0eXBlLCB0eXBlLmNfc3RyKCkpOworICAgIEVsZW1lbnQgcm91dGUgPSBuZXcgQXVkaW9Sb3V0ZShyb3V0ZVR5cGUpOwogCi0gICAgc3RyaW5nIHNpbmtBdHRyID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnNpbmspOworICAgIHN0ZDo6c3RyaW5nIHNpbmtBdHRyID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6c2luayk7CiAgICAgaWYgKHNpbmtBdHRyLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6c2luayk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6c2luayk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQogICAgIC8vIENvbnZlcnQgU2luayBuYW1lIHRvIHBvcnQgcG9pbnRlcgogICAgIHNwPEF1ZGlvUG9ydD4gc2luayA9IGN0eC0+ZmluZFBvcnRCeVRhZ05hbWUoU3RyaW5nOChzaW5rQXR0ci5jX3N0cigpKSk7CiAgICAgaWYgKHNpbmsgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXM6IG5vIHNpbmsgZm91bmQgd2l0aCBuYW1lPSVzIiwgX19GVU5DVElPTl9fLCBzaW5rQXR0ci5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBubyBzaW5rIGZvdW5kIHdpdGggbmFtZT0lcyIsIF9fZnVuY19fLCBzaW5rQXR0ci5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9Ci0gICAgZWxlbWVudC0+c2V0U2luayhzaW5rKTsKKyAgICByb3V0ZS0+c2V0U2luayhzaW5rKTsKIAotICAgIHN0cmluZyBzb3VyY2VzQXR0ciA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpzb3VyY2VzKTsKKyAgICBzdGQ6OnN0cmluZyBzb3VyY2VzQXR0ciA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnNvdXJjZXMpOwogICAgIGlmIChzb3VyY2VzQXR0ci5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OnNvdXJjZXMpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19mdW5jX18sIEF0dHJpYnV0ZXM6OnNvdXJjZXMpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KICAgICAvLyBUb2tlbml6ZSBhbmQgQ29udmVydCBTb3VyY2VzIG5hbWUgdG8gcG9ydCBwb2ludGVyCiAgICAgQXVkaW9Qb3J0VmVjdG9yIHNvdXJjZXM7Ci0gICAgY2hhciAqc291cmNlc0xpdGVyYWwgPSBzdHJuZHVwKHNvdXJjZXNBdHRyLmNfc3RyKCksIHN0cmxlbihzb3VyY2VzQXR0ci5jX3N0cigpKSk7Ci0gICAgY2hhciAqZGV2VGFnID0gc3RydG9rKHNvdXJjZXNMaXRlcmFsLCAiLCIpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjaGFyW10+IHNvdXJjZXNMaXRlcmFse3N0cm5kdXAoCisgICAgICAgICAgICAgICAgc291cmNlc0F0dHIuY19zdHIoKSwgc3RybGVuKHNvdXJjZXNBdHRyLmNfc3RyKCkpKX07CisgICAgY2hhciAqZGV2VGFnID0gc3RydG9rKHNvdXJjZXNMaXRlcmFsLmdldCgpLCAiLCIpOwogICAgIHdoaWxlIChkZXZUYWcgIT0gTlVMTCkgewogICAgICAgICBpZiAoc3RybGVuKGRldlRhZykgIT0gMCkgewogICAgICAgICAgICAgc3A8QXVkaW9Qb3J0PiBzb3VyY2UgPSBjdHgtPmZpbmRQb3J0QnlUYWdOYW1lKFN0cmluZzgoZGV2VGFnKSk7CiAgICAgICAgICAgICBpZiAoc291cmNlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IG5vIHNvdXJjZSBmb3VuZCB3aXRoIG5hbWU9JXMiLCBfX0ZVTkNUSU9OX18sIGRldlRhZyk7Ci0gICAgICAgICAgICAgICAgZnJlZShzb3VyY2VzTGl0ZXJhbCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IG5vIHNvdXJjZSBmb3VuZCB3aXRoIG5hbWU9JXMiLCBfX2Z1bmNfXywgZGV2VGFnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc291cmNlcy5hZGQoc291cmNlKTsKICAgICAgICAgfQogICAgICAgICBkZXZUYWcgPSBzdHJ0b2soTlVMTCwgIiwiKTsKICAgICB9Ci0gICAgZnJlZShzb3VyY2VzTGl0ZXJhbCk7CiAKLSAgICBzaW5rLT5hZGRSb3V0ZShlbGVtZW50KTsKKyAgICBzaW5rLT5hZGRSb3V0ZShyb3V0ZSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzb3VyY2VzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPEF1ZGlvUG9ydD4gc291cmNlID0gc291cmNlcy5pdGVtQXQoaSk7Ci0gICAgICAgIHNvdXJjZS0+YWRkUm91dGUoZWxlbWVudCk7CisgICAgICAgIHNvdXJjZS0+YWRkUm91dGUocm91dGUpOwogICAgIH0KLSAgICBlbGVtZW50LT5zZXRTb3VyY2VzKHNvdXJjZXMpOwotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICByb3V0ZS0+c2V0U291cmNlcyhzb3VyY2VzKTsKKyAgICByZXR1cm4gcm91dGU7CiB9CiAKLWNvbnN0IGNoYXIgKmNvbnN0IE1vZHVsZVRyYWl0czo6Y2hpbGRBdHRhY2hlZERldmljZXNUYWcgPSAiYXR0YWNoZWREZXZpY2VzIjsKLWNvbnN0IGNoYXIgKmNvbnN0IE1vZHVsZVRyYWl0czo6Y2hpbGRBdHRhY2hlZERldmljZVRhZyA9ICJpdGVtIjsKLWNvbnN0IGNoYXIgKmNvbnN0IE1vZHVsZVRyYWl0czo6Y2hpbGREZWZhdWx0T3V0cHV0RGV2aWNlVGFnID0gImRlZmF1bHRPdXRwdXREZXZpY2UiOwotCi1jb25zdCBjaGFyICpjb25zdCBNb2R1bGVUcmFpdHM6OnRhZyA9ICJtb2R1bGUiOwotY29uc3QgY2hhciAqY29uc3QgTW9kdWxlVHJhaXRzOjpjb2xsZWN0aW9uVGFnID0gIm1vZHVsZXMiOwotCi1jb25zdCBjaGFyIE1vZHVsZVRyYWl0czo6QXR0cmlidXRlczo6bmFtZVtdID0gIm5hbWUiOwotY29uc3QgY2hhciBNb2R1bGVUcmFpdHM6OkF0dHJpYnV0ZXM6OnZlcnNpb25bXSA9ICJoYWxWZXJzaW9uIjsKLQotc3RhdHVzX3QgTW9kdWxlVHJhaXRzOjpkZXNlcmlhbGl6ZSh4bWxEb2NQdHIgZG9jLCBjb25zdCB4bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IGN0eCkKK1JldHVybjxNb2R1bGVUcmFpdHM6OkVsZW1lbnQ+IE1vZHVsZVRyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLCBQdHJTZXJpYWxpemluZ0N0eCBjdHgpCiB7Ci0gICAgc3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6bmFtZSk7CisgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6Om5hbWUpOwogICAgIGlmIChuYW1lLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6bmFtZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6bmFtZSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQogICAgIHVpbnQzMl90IHZlcnNpb25NYWpvciA9IDAsIHZlcnNpb25NaW5vciA9IDA7Ci0gICAgc3RyaW5nIHZlcnNpb25MaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnZlcnNpb24pOworICAgIHN0ZDo6c3RyaW5nIHZlcnNpb25MaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6dmVyc2lvbik7CiAgICAgaWYgKCF2ZXJzaW9uTGl0ZXJhbC5lbXB0eSgpKSB7CiAgICAgICAgIHNzY2FuZih2ZXJzaW9uTGl0ZXJhbC5jX3N0cigpLCAiJXUuJXUiLCAmdmVyc2lvbk1ham9yLCAmdmVyc2lvbk1pbm9yKTsKLSAgICAgICAgQUxPR1YoIiVzOiBtSGFsVmVyc2lvbiA9IG1ham9yICV1IG1pbm9yICV1IiwgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgQUxPR1YoIiVzOiBtSGFsVmVyc2lvbiA9IG1ham9yICV1IG1pbm9yICV1IiwgIF9fZnVuY19fLAogICAgICAgICAgICAgICB2ZXJzaW9uTWFqb3IsIHZlcnNpb25NYWpvcik7CiAgICAgfQogCi0gICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fRlVOQ1RJT05fXywgdGFnLCBBdHRyaWJ1dGVzOjpuYW1lLCBuYW1lLmNfc3RyKCkpOworICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX2Z1bmNfXywgdGFnLCBBdHRyaWJ1dGVzOjpuYW1lLCBuYW1lLmNfc3RyKCkpOwogCi0gICAgbW9kdWxlID0gbmV3IEVsZW1lbnQobmFtZS5jX3N0cigpLCB2ZXJzaW9uTWFqb3IsIHZlcnNpb25NaW5vcik7CisgICAgRWxlbWVudCBtb2R1bGUgPSBuZXcgSHdNb2R1bGUobmFtZS5jX3N0cigpLCB2ZXJzaW9uTWFqb3IsIHZlcnNpb25NaW5vcik7CiAKICAgICAvLyBEZXNlcmlhbGl6ZSBjaGlsZHJlbnM6IEF1ZGlvIE1peCBQb3J0LCBBdWRpbyBEZXZpY2UgUG9ydHMgKFNvdXJjZS9TaW5rKSwgQXVkaW8gUm91dGVzCiAgICAgTWl4UG9ydFRyYWl0czo6Q29sbGVjdGlvbiBtaXhQb3J0czsKLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248TWl4UG9ydFRyYWl0cz4oZG9jLCByb290LCBtaXhQb3J0cywgTlVMTCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPE1peFBvcnRUcmFpdHM+KGN1ciwgJm1peFBvcnRzLCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKHN0YXR1cyk7CisgICAgfQogICAgIG1vZHVsZS0+c2V0UHJvZmlsZXMobWl4UG9ydHMpOwogCiAgICAgRGV2aWNlUG9ydFRyYWl0czo6Q29sbGVjdGlvbiBkZXZpY2VQb3J0czsKLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248RGV2aWNlUG9ydFRyYWl0cz4oZG9jLCByb290LCBkZXZpY2VQb3J0cywgTlVMTCk7CisgICAgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPERldmljZVBvcnRUcmFpdHM+KGN1ciwgJmRldmljZVBvcnRzLCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKHN0YXR1cyk7CisgICAgfQogICAgIG1vZHVsZS0+c2V0RGVjbGFyZWREZXZpY2VzKGRldmljZVBvcnRzKTsKIAogICAgIFJvdXRlVHJhaXRzOjpDb2xsZWN0aW9uIHJvdXRlczsKLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248Um91dGVUcmFpdHM+KGRvYywgcm9vdCwgcm91dGVzLCBtb2R1bGUuZ2V0KCkpOworICAgIHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxSb3V0ZVRyYWl0cz4oY3VyLCAmcm91dGVzLCBtb2R1bGUuZ2V0KCkpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CiAgICAgbW9kdWxlLT5zZXRSb3V0ZXMocm91dGVzKTsKIAotICAgIGNvbnN0IHhtbE5vZGUgKmNoaWxkcmVuID0gcm9vdC0+eG1sQ2hpbGRyZW5Ob2RlOwotICAgIHdoaWxlIChjaGlsZHJlbiAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkcmVuLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKWNoaWxkQXR0YWNoZWREZXZpY2VzVGFnKSkgewotICAgICAgICAgICAgQUxPR1YoIiVzOiAlcyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgdGFnLCBjaGlsZEF0dGFjaGVkRGV2aWNlc1RhZyk7Ci0gICAgICAgICAgICBjb25zdCB4bWxOb2RlICpjaGlsZCA9IGNoaWxkcmVuLT54bWxDaGlsZHJlbk5vZGU7Ci0gICAgICAgICAgICB3aGlsZSAoY2hpbGQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKWNoaWxkQXR0YWNoZWREZXZpY2VUYWcpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHhtbENoYXIgKmF0dGFjaGVkRGV2aWNlID0geG1sTm9kZUxpc3RHZXRTdHJpbmcoZG9jLCBjaGlsZC0+eG1sQ2hpbGRyZW5Ob2RlLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF0dGFjaGVkRGV2aWNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgY2hpbGRBdHRhY2hlZERldmljZVRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyKilhdHRhY2hlZERldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGUtPmdldERlY2xhcmVkRGV2aWNlcygpLmdldERldmljZUZyb21UYWdOYW1lKFN0cmluZzgoKGNvbnN0IGNoYXIqKWF0dGFjaGVkRGV2aWNlKSk7CisgICAgZm9yIChjb25zdCB4bWxOb2RlICpjaGlsZHJlbiA9IGN1ci0+eG1sQ2hpbGRyZW5Ob2RlOyBjaGlsZHJlbiAhPSBOVUxMOworICAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbi0+bmV4dCkgeworICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZHJlbi0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4oY2hpbGRBdHRhY2hlZERldmljZXNUYWcpKSkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiAlcyAlcyBmb3VuZCIsIF9fZnVuY19fLCB0YWcsIGNoaWxkQXR0YWNoZWREZXZpY2VzVGFnKTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgeG1sTm9kZSAqY2hpbGQgPSBjaGlsZHJlbi0+eG1sQ2hpbGRyZW5Ob2RlOyBjaGlsZCAhPSBOVUxMOworICAgICAgICAgICAgICAgICBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisgICAgICAgICAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KGNoaWxkQXR0YWNoZWREZXZpY2VUYWcpKSkgeworICAgICAgICAgICAgICAgICAgICBhdXRvIGF0dGFjaGVkRGV2aWNlID0gbWFrZV94bWxVbmlxdWUoeG1sTm9kZUxpc3RHZXRTdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC0+ZG9jLCBjaGlsZC0+eG1sQ2hpbGRyZW5Ob2RlLCAxKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhdHRhY2hlZERldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIHRhZywgY2hpbGRBdHRhY2hlZERldmljZVRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oYXR0YWNoZWREZXZpY2UuZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IG1vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZUZyb21UYWdOYW1lKFN0cmluZzgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaGVkRGV2aWNlLmdldCgpKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5hZGRBdmFpbGFibGVEZXZpY2UoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbEZyZWUoYXR0YWNoZWREZXZpY2UpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQtPm5leHQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGRyZW4tPm5hbWUsIChjb25zdCB4bWxDaGFyICopY2hpbGREZWZhdWx0T3V0cHV0RGV2aWNlVGFnKSkgewotICAgICAgICAgICAgeG1sQ2hhciAqZGVmYXVsdE91dHB1dERldmljZSA9IHhtbE5vZGVMaXN0R2V0U3RyaW5nKGRvYywgY2hpbGRyZW4tPnhtbENoaWxkcmVuTm9kZSwgMSk7OwotICAgICAgICAgICAgaWYgKGRlZmF1bHRPdXRwdXREZXZpY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgY2hpbGREZWZhdWx0T3V0cHV0RGV2aWNlVGFnLAotICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyKilkZWZhdWx0T3V0cHV0RGV2aWNlKTsKLSAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLT5nZXREZWNsYXJlZERldmljZXMoKS5nZXREZXZpY2VGcm9tVGFnTmFtZShTdHJpbmc4KChjb25zdCBjaGFyKilkZWZhdWx0T3V0cHV0RGV2aWNlKSk7CisgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkcmVuLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4oY2hpbGREZWZhdWx0T3V0cHV0RGV2aWNlVGFnKSkpIHsKKyAgICAgICAgICAgIGF1dG8gZGVmYXVsdE91dHB1dERldmljZSA9IG1ha2VfeG1sVW5pcXVlKHhtbE5vZGVMaXN0R2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLT5kb2MsIGNoaWxkcmVuLT54bWxDaGlsZHJlbk5vZGUsIDEpKTsKKyAgICAgICAgICAgIGlmIChkZWZhdWx0T3V0cHV0RGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIHRhZywgY2hpbGREZWZhdWx0T3V0cHV0RGV2aWNlVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZGVmYXVsdE91dHB1dERldmljZS5nZXQoKSkpOworICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IG1vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCkuZ2V0RGV2aWNlRnJvbVRhZ05hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGRlZmF1bHRPdXRwdXREZXZpY2UuZ2V0KCkpKSk7CiAgICAgICAgICAgICAgICAgaWYgKGRldmljZSAhPSAwICYmIGN0eC0+Z2V0RGVmYXVsdE91dHB1dERldmljZSgpID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgY3R4LT5zZXREZWZhdWx0T3V0cHV0RGV2aWNlKGRldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogZGVmYXVsdCBpcyAlMDh4IiwgX19GVU5DVElPTl9fLCBjdHgtPmdldERlZmF1bHRPdXRwdXREZXZpY2UoKS0+dHlwZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBkZWZhdWx0IGlzICUwOHgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjdHgtPmdldERlZmF1bHRPdXRwdXREZXZpY2UoKS0+dHlwZSgpKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgeG1sRnJlZShkZWZhdWx0T3V0cHV0RGV2aWNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuLT5uZXh0OwogICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgcmV0dXJuIG1vZHVsZTsKIH0KIAotY29uc3QgY2hhciAqY29uc3QgR2xvYmFsQ29uZmlnVHJhaXRzOjp0YWcgPSAiZ2xvYmFsQ29uZmlndXJhdGlvbiI7Ci0KLWNvbnN0IGNoYXIgR2xvYmFsQ29uZmlnVHJhaXRzOjpBdHRyaWJ1dGVzOjpzcGVha2VyRHJjRW5hYmxlZFtdID0gInNwZWFrZXJfZHJjX2VuYWJsZWQiOwotCi0KLXN0YXR1c190IEdsb2JhbENvbmZpZ1RyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLCBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKQorc3RhdHVzX3QgR2xvYmFsQ29uZmlnVHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpyb290LCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKQogewotICAgIGNvbnN0IHhtbE5vZGUgKnJvb3QgPSBjdXItPnhtbENoaWxkcmVuTm9kZTsKLSAgICB3aGlsZSAocm9vdCAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICgheG1sU3RyY21wKHJvb3QtPm5hbWUsIChjb25zdCB4bWxDaGFyICopdGFnKSkgewotICAgICAgICAgICAgc3RyaW5nIHNwZWFrZXJEcmNFbmFibGVkID0KLSAgICAgICAgICAgICAgICAgICAgZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnNwZWFrZXJEcmNFbmFibGVkKTsKKyAgICBmb3IgKGNvbnN0IHhtbE5vZGUgKmN1ciA9IHJvb3QtPnhtbENoaWxkcmVuTm9kZTsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgICAgICBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KHRhZykpKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBzcGVha2VyRHJjRW5hYmxlZCA9CisgICAgICAgICAgICAgICAgICAgIGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnNwZWFrZXJEcmNFbmFibGVkKTsKICAgICAgICAgICAgIGJvb2wgaXNTcGVha2VyRHJjRW5hYmxlZDsKICAgICAgICAgICAgIGlmICghc3BlYWtlckRyY0VuYWJsZWQuZW1wdHkoKSAmJgotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VG88c3RyaW5nLCBib29sPihzcGVha2VyRHJjRW5hYmxlZCwgaXNTcGVha2VyRHJjRW5hYmxlZCkpIHsKLSAgICAgICAgICAgICAgICBjb25maWcuc2V0U3BlYWtlckRyY0VuYWJsZWQoaXNTcGVha2VyRHJjRW5hYmxlZCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUbzxzdGQ6OnN0cmluZywgYm9vbD4oc3BlYWtlckRyY0VuYWJsZWQsIGlzU3BlYWtlckRyY0VuYWJsZWQpKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLT5zZXRTcGVha2VyRHJjRW5hYmxlZChpc1NwZWFrZXJEcmNFbmFibGVkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQotICAgICAgICByb290ID0gcm9vdC0+bmV4dDsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi0KLWNvbnN0IGNoYXIgKmNvbnN0IFZvbHVtZVRyYWl0czo6dGFnID0gInZvbHVtZSI7Ci1jb25zdCBjaGFyICpjb25zdCBWb2x1bWVUcmFpdHM6OmNvbGxlY3Rpb25UYWcgPSAidm9sdW1lcyI7Ci1jb25zdCBjaGFyICpjb25zdCBWb2x1bWVUcmFpdHM6OnZvbHVtZVBvaW50VGFnID0gInBvaW50IjsKLQotY29uc3QgY2hhciBWb2x1bWVUcmFpdHM6OkF0dHJpYnV0ZXM6OnN0cmVhbVtdID0gInN0cmVhbSI7Ci1jb25zdCBjaGFyIFZvbHVtZVRyYWl0czo6QXR0cmlidXRlczo6ZGV2aWNlQ2F0ZWdvcnlbXSA9ICJkZXZpY2VDYXRlZ29yeSI7Ci1jb25zdCBjaGFyIFZvbHVtZVRyYWl0czo6QXR0cmlidXRlczo6cmVmZXJlbmNlW10gPSAicmVmIjsKLQotc3RhdHVzX3QgVm9sdW1lVHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQorc3RhdHVzX3QgU3Vycm91bmRTb3VuZFRyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqcm9vdCwgQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZykKIHsKLSAgICBzdHJpbmcgc3RyZWFtVHlwZUxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6c3RyZWFtKTsKLSAgICBpZiAoc3RyZWFtVHlwZUxpdGVyYWwuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpzdHJlYW0pOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGU7Ci0gICAgaWYgKCFTdHJlYW1UeXBlQ29udmVydGVyOjpmcm9tU3RyaW5nKHN0cmVhbVR5cGVMaXRlcmFsLCBzdHJlYW1UeXBlKSkgewotICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgJXMiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OnN0cmVhbSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHN0cmluZyBkZXZpY2VDYXRlZ29yeUxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6ZGV2aWNlQ2F0ZWdvcnkpOwotICAgIGlmIChkZXZpY2VDYXRlZ29yeUxpdGVyYWwuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpkZXZpY2VDYXRlZ29yeSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeTsKLSAgICBpZiAoIURldmljZUNhdGVnb3J5Q29udmVydGVyOjpmcm9tU3RyaW5nKGRldmljZUNhdGVnb3J5TGl0ZXJhbCwgZGV2aWNlQ2F0ZWdvcnkpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogSW52YWxpZCAlcz0lcyIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6ZGV2aWNlQ2F0ZWdvcnksCi0gICAgICAgICAgICAgIGRldmljZUNhdGVnb3J5TGl0ZXJhbC5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9CisgICAgY29uZmlnLT5zZXREZWZhdWx0U3Vycm91bmRGb3JtYXRzKCk7CiAKLSAgICBzdHJpbmcgcmVmZXJlbmNlTmFtZSA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpyZWZlcmVuY2UpOwotICAgIGNvbnN0IF94bWxOb2RlICpyZWYgPSBOVUxMOwotICAgIGlmICghcmVmZXJlbmNlTmFtZS5lbXB0eSgpKSB7Ci0gICAgICAgIGdldFJlZmVyZW5jZTxWb2x1bWVUcmFpdHM+KHJvb3QtPnBhcmVudCwgcmVmLCByZWZlcmVuY2VOYW1lKTsKLSAgICAgICAgaWYgKHJlZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IE5vIHJlZmVyZW5jZSBQdHIgZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCByZWZlcmVuY2VOYW1lLmNfc3RyKCkpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGVsZW1lbnQgPSBuZXcgRWxlbWVudChkZXZpY2VDYXRlZ29yeSwgc3RyZWFtVHlwZSk7Ci0KLSAgICBjb25zdCB4bWxOb2RlICpjaGlsZCA9IHJlZmVyZW5jZU5hbWUuZW1wdHkoKSA/IHJvb3QtPnhtbENoaWxkcmVuTm9kZSA6IHJlZi0+eG1sQ2hpbGRyZW5Ob2RlOwotICAgIHdoaWxlIChjaGlsZCAhPSBOVUxMKSB7Ci0gICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKXZvbHVtZVBvaW50VGFnKSkgewotICAgICAgICAgICAgeG1sQ2hhciAqcG9pbnREZWZpbml0aW9uID0geG1sTm9kZUxpc3RHZXRTdHJpbmcoZG9jLCBjaGlsZC0+eG1sQ2hpbGRyZW5Ob2RlLCAxKTs7Ci0gICAgICAgICAgICBpZiAocG9pbnREZWZpbml0aW9uID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIGZvciAoY29uc3QgeG1sTm9kZSAqY3VyID0gcm9vdC0+eG1sQ2hpbGRyZW5Ob2RlOyBjdXIgIT0gTlVMTDsgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgICAgIGlmICgheG1sU3RyY21wKGN1ci0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4odGFnKSkpIHsKKyAgICAgICAgICAgIEF1ZGlvUG9saWN5Q29uZmlnOjpTdXJyb3VuZEZvcm1hdHMgZm9ybWF0czsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxTdXJyb3VuZFNvdW5kRm9ybWF0VHJhaXRzPigKKyAgICAgICAgICAgICAgICAgICAgY3VyLCAmZm9ybWF0cywgbnVsbHB0cik7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLT5zZXRTdXJyb3VuZEZvcm1hdHMoZm9ybWF0cyk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigiJXM6ICVzPSVzIiwgX19GVU5DVElPTl9fLCB0YWcsIChjb25zdCBjaGFyKilwb2ludERlZmluaXRpb24pOwotICAgICAgICAgICAgVmVjdG9yPGludDMyX3Q+IHBvaW50OwotICAgICAgICAgICAgY29sbGVjdGlvbkZyb21TdHJpbmc8RGVmYXVsdFRyYWl0czxpbnQzMl90PiA+KChjb25zdCBjaGFyKilwb2ludERlZmluaXRpb24sIHBvaW50LCAiLCIpOwotICAgICAgICAgICAgaWYgKHBvaW50LnNpemUoKSAhPSAyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkICVzOiAlcyIsIF9fRlVOQ1RJT05fXywgdm9sdW1lUG9pbnRUYWcsCi0gICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIqKXBvaW50RGVmaW5pdGlvbik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsZW1lbnQtPmFkZChDdXJ2ZVBvaW50KHBvaW50WzBdLCBwb2ludFsxXSkpOwotICAgICAgICAgICAgeG1sRnJlZShwb2ludERlZmluaXRpb24pOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9Ci0gICAgICAgIGNoaWxkID0gY2hpbGQtPm5leHQ7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotUG9saWN5U2VyaWFsaXplcjo6UG9saWN5U2VyaWFsaXplcigpIDogbVJvb3RFbGVtZW50TmFtZShyb290TmFtZSkKK1JldHVybjxTdXJyb3VuZFNvdW5kRm9ybWF0VHJhaXRzOjpFbGVtZW50PiBTdXJyb3VuZFNvdW5kRm9ybWF0VHJhaXRzOjpkZXNlcmlhbGl6ZSgKKyAgICAgICAgY29uc3QgeG1sTm9kZSAqY3VyLCBQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQogewotICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvc3M7Ci0gICAgb3NzIDw8IGdNYWpvciA8PCAiLiIgPDwgZ01pbm9yOwotICAgIG1WZXJzaW9uID0gb3NzLnN0cigpOwotICAgIEFMT0dWKCIlczogVmVyc2lvbj0lcyBSb290PSVzIiwgX19GVU5DVElPTl9fLCBtVmVyc2lvbi5jX3N0cigpLCBtUm9vdEVsZW1lbnROYW1lLmNfc3RyKCkpOworICAgIHN0ZDo6c3RyaW5nIGZvcm1hdExpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICBpZiAoZm9ybWF0TGl0ZXJhbC5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQgZm9yIGEgc3Vycm91bmQgZm9ybWF0IiwgX19mdW5jX18sIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOworICAgIH0KKyAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBmb3JtYXRGcm9tU3RyaW5nKGZvcm1hdExpdGVyYWwpOworICAgIGlmIChmb3JtYXQgPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbnJlY29nbml6ZWQgZm9ybWF0ICVzIiwgX19mdW5jX18sIGZvcm1hdExpdGVyYWwuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CisgICAgfQorICAgIEVsZW1lbnQgcGFpciA9IHN0ZDo6bWFrZV9wYWlyKGZvcm1hdCwgQ29sbGVjdGlvbjo6bWFwcGVkX3R5cGV7fSk7CisKKyAgICBzdGQ6OnN0cmluZyBzdWJmb3JtYXRzTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnN1YmZvcm1hdHMpOworICAgIGlmIChzdWJmb3JtYXRzTGl0ZXJhbC5lbXB0eSgpKSByZXR1cm4gcGFpcjsKKyAgICBGb3JtYXRWZWN0b3Igc3ViZm9ybWF0cyA9IGZvcm1hdHNGcm9tU3RyaW5nKHN1YmZvcm1hdHNMaXRlcmFsLCAiICIpOworICAgIGZvciAoY29uc3QgYXV0byYgc3ViZm9ybWF0IDogc3ViZm9ybWF0cykgeworICAgICAgICBhdXRvIHJlc3VsdCA9IHBhaXIuc2Vjb25kLmluc2VydChzdWJmb3JtYXQpOworICAgICAgICBpZiAoIXJlc3VsdC5zZWNvbmQpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogY291bGQgbm90IGFkZCBzdWJmb3JtYXQgJXggdG8gY29sbGVjdGlvbiIsIF9fZnVuY19fLCBzdWJmb3JtYXQpOworICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcGFpcjsKIH0KIAotc3RhdHVzX3QgUG9saWN5U2VyaWFsaXplcjo6ZGVzZXJpYWxpemUoY29uc3QgY2hhciAqY29uZmlnRmlsZSwgQXVkaW9Qb2xpY3lDb25maWcgJmNvbmZpZykKK3N0YXR1c190IFBvbGljeVNlcmlhbGl6ZXI6OmRlc2VyaWFsaXplKGNvbnN0IGNoYXIgKmNvbmZpZ0ZpbGUsIEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpCiB7Ci0gICAgeG1sRG9jUHRyIGRvYzsKLSAgICBkb2MgPSB4bWxQYXJzZUZpbGUoY29uZmlnRmlsZSk7Ci0gICAgaWYgKGRvYyA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IHBhcnNlICVzIGRvY3VtZW50LiIsIF9fRlVOQ1RJT05fXywgY29uZmlnRmlsZSk7CisgICAgYXV0byBkb2MgPSBtYWtlX3htbFVuaXF1ZSh4bWxQYXJzZUZpbGUoY29uZmlnRmlsZSkpOworICAgIGlmIChkb2MgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBwYXJzZSAlcyBkb2N1bWVudC4iLCBfX2Z1bmNfXywgY29uZmlnRmlsZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHhtbE5vZGVQdHIgY3VyID0geG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jKTsKLSAgICBpZiAoY3VyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgcGFyc2UgJXMgZG9jdW1lbnQ6IGVtcHR5LiIsIF9fRlVOQ1RJT05fXywgY29uZmlnRmlsZSk7Ci0gICAgICAgIHhtbEZyZWVEb2MoZG9jKTsKKyAgICB4bWxOb2RlUHRyIHJvb3QgPSB4bWxEb2NHZXRSb290RWxlbWVudChkb2MuZ2V0KCkpOworICAgIGlmIChyb290ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgcGFyc2UgJXMgZG9jdW1lbnQ6IGVtcHR5LiIsIF9fZnVuY19fLCBjb25maWdGaWxlKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgaWYgKHhtbFhJbmNsdWRlUHJvY2Vzcyhkb2MpIDwgMCkgewotICAgICAgICAgQUxPR0UoIiVzOiBsaWJ4bWwgZmFpbGVkIHRvIHJlc29sdmUgWEluY2x1ZGVzIG9uICVzIGRvY3VtZW50LiIsIF9fRlVOQ1RJT05fXywgY29uZmlnRmlsZSk7CisgICAgaWYgKHhtbFhJbmNsdWRlUHJvY2Vzcyhkb2MuZ2V0KCkpIDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IGxpYnhtbCBmYWlsZWQgdG8gcmVzb2x2ZSBYSW5jbHVkZXMgb24gJXMgZG9jdW1lbnQuIiwgX19mdW5jX18sIGNvbmZpZ0ZpbGUpOwogICAgIH0KIAotICAgIGlmICh4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSBtUm9vdEVsZW1lbnROYW1lLmNfc3RyKCkpKSAgewotICAgICAgICBBTE9HRSgiJXM6IE5vICVzIHJvb3QgZWxlbWVudCBmb3VuZCBpbiB4bWwgZGF0YSAlcy4iLCBfX0ZVTkNUSU9OX18sIG1Sb290RWxlbWVudE5hbWUuY19zdHIoKSwKLSAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKiljdXItPm5hbWUpOwotICAgICAgICB4bWxGcmVlRG9jKGRvYyk7CisgICAgaWYgKHhtbFN0cmNtcChyb290LT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihyb290TmFtZSkpKSAgeworICAgICAgICBBTE9HRSgiJXM6IE5vICVzIHJvb3QgZWxlbWVudCBmb3VuZCBpbiB4bWwgZGF0YSAlcy4iLCBfX2Z1bmNfXywgcm9vdE5hbWUsCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocm9vdC0+bmFtZSkpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHN0cmluZyB2ZXJzaW9uID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgdmVyc2lvbkF0dHJpYnV0ZSk7CisgICAgc3RkOjpzdHJpbmcgdmVyc2lvbiA9IGdldFhtbEF0dHJpYnV0ZShyb290LCB2ZXJzaW9uQXR0cmlidXRlKTsKICAgICBpZiAodmVyc2lvbi5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gdmVyc2lvbiBmb3VuZCBpbiByb290IG5vZGUgJXMiLCBfX0ZVTkNUSU9OX18sIG1Sb290RWxlbWVudE5hbWUuY19zdHIoKSk7CisgICAgICAgIEFMT0dFKCIlczogTm8gdmVyc2lvbiBmb3VuZCBpbiByb290IG5vZGUgJXMiLCBfX2Z1bmNfXywgcm9vdE5hbWUpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBpZiAodmVyc2lvbiAhPSBtVmVyc2lvbikgewotICAgICAgICBBTE9HRSgiJXM6IFZlcnNpb24gZG9lcyBub3QgbWF0Y2g7IGV4cGVjdCAlcyBnb3QgJXMiLCBfX0ZVTkNUSU9OX18sIG1WZXJzaW9uLmNfc3RyKCksCisgICAgICAgIEFMT0dFKCIlczogVmVyc2lvbiBkb2VzIG5vdCBtYXRjaDsgZXhwZWN0ICVzIGdvdCAlcyIsIF9fZnVuY19fLCBtVmVyc2lvbi5jX3N0cigpLAogICAgICAgICAgICAgICB2ZXJzaW9uLmNfc3RyKCkpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICAvLyBMZXRzIGRlc2VyaWFsaXplIGNoaWxkcmVuCiAgICAgLy8gTW9kdWxlcwogICAgIE1vZHVsZVRyYWl0czo6Q29sbGVjdGlvbiBtb2R1bGVzOwotICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxNb2R1bGVUcmFpdHM+KGRvYywgY3VyLCBtb2R1bGVzLCAmY29uZmlnKTsKLSAgICBjb25maWcuc2V0SHdNb2R1bGVzKG1vZHVsZXMpOwotCi0gICAgLy8gZGVzZXJpYWxpemUgdm9sdW1lIHNlY3Rpb24KLSAgICBWb2x1bWVUcmFpdHM6OkNvbGxlY3Rpb24gdm9sdW1lczsKLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248Vm9sdW1lVHJhaXRzPihkb2MsIGN1ciwgdm9sdW1lcywgJmNvbmZpZyk7Ci0gICAgY29uZmlnLnNldFZvbHVtZXModm9sdW1lcyk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPE1vZHVsZVRyYWl0cz4ocm9vdCwgJm1vZHVsZXMsIGNvbmZpZyk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBjb25maWctPnNldEh3TW9kdWxlcyhtb2R1bGVzKTsKIAogICAgIC8vIEdsb2JhbCBDb25maWd1cmF0aW9uCi0gICAgR2xvYmFsQ29uZmlnVHJhaXRzOjpkZXNlcmlhbGl6ZShjdXIsIGNvbmZpZyk7CisgICAgR2xvYmFsQ29uZmlnVHJhaXRzOjpkZXNlcmlhbGl6ZShyb290LCBjb25maWcpOwogCi0gICAgeG1sRnJlZURvYyhkb2MpOworICAgIC8vIFN1cnJvdW5kIGNvbmZpZ3VyYXRpb24KKyAgICBTdXJyb3VuZFNvdW5kVHJhaXRzOjpkZXNlcmlhbGl6ZShyb290LCBjb25maWcpOworCiAgICAgcmV0dXJuIGFuZHJvaWQ6Ok9LOwogfQogCit9ICAvLyBuYW1lc3BhY2UKKworc3RhdHVzX3QgZGVzZXJpYWxpemVBdWRpb1BvbGljeUZpbGUoY29uc3QgY2hhciAqZmlsZU5hbWUsIEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpCit7CisgICAgUG9saWN5U2VyaWFsaXplciBzZXJpYWxpemVyOworICAgIHJldHVybiBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGZpbGVOYW1lLCBjb25maWcpOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TZXNzaW9uUm91dGUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2Vzc2lvblJvdXRlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIwNjUyNi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TZXNzaW9uUm91dGUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFQTV9TZXNzaW9uUm91dGUiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlICJTZXNzaW9uUm91dGUuaCIKLSNpbmNsdWRlICJId01vZHVsZS5oIgotI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgotI2luY2x1ZGUgIkRldmljZURlc2NyaXB0b3IuaCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0gU2Vzc2lvblJvdXRlIGNsYXNzIGltcGxlbWVudGF0aW9uCi12b2lkIFNlc3Npb25Sb3V0ZTo6bG9nKGNvbnN0IGNoYXIqIHByZWZpeCkKLXsKLSAgICBBTE9HSSgiJXNbU2Vzc2lvblJvdXRlIHN0cm06MHglWCwgc3JjOiVkLCBzZXNzOjB4JVgsIGRldjoweCVYIHJlZnM6JWQgYWN0OiVkIiwKLSAgICAgICAgICBwcmVmaXgsIG1TdHJlYW1UeXBlLCBtU291cmNlLCBtU2Vzc2lvbiwKLSAgICAgICAgICBtRGV2aWNlRGVzY3JpcHRvciAhPSAwID8gbURldmljZURlc2NyaXB0b3ItPnR5cGUoKSA6IEFVRElPX0RFVklDRV9OT05FLAotICAgICAgICAgIG1SZWZDb3VudCwgbUFjdGl2aXR5Q291bnQpOwotfQotCi0vLyAtLS0gU2Vzc2lvblJvdXRlTWFwIGNsYXNzIGltcGxlbWVudGF0aW9uCi1ib29sIFNlc3Npb25Sb3V0ZU1hcDo6aGFzUm91dGUoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCi17Ci0gICAgcmV0dXJuIGluZGV4T2ZLZXkoc2Vzc2lvbikgPj0gMCAmJiB2YWx1ZUZvcihzZXNzaW9uKS0+bURldmljZURlc2NyaXB0b3IgIT0gMDsKLX0KLQotYm9vbCBTZXNzaW9uUm91dGVNYXA6OmdldEFuZENsZWFyUm91dGVDaGFuZ2VkKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQotewotICAgIGlmIChpbmRleE9mS2V5KHNlc3Npb24pID49IDApIHsKLSAgICAgICAgaWYgKHZhbHVlRm9yKHNlc3Npb24pLT5tQ2hhbmdlZCkgewotICAgICAgICAgICAgdmFsdWVGb3Ioc2Vzc2lvbiktPm1DaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgU2Vzc2lvblJvdXRlTWFwOjpyZW1vdmVSb3V0ZShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKLXsKLSAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gaW5kZXhPZktleShzZXNzaW9uKSA+PSAwID8gdmFsdWVGb3Ioc2Vzc2lvbikgOiAwOwotICAgIGlmIChyb3V0ZSAhPSAwKSB7Ci0gICAgICAgIEFMT0dfQVNTRVJUKHJvdXRlLT5tUmVmQ291bnQgPiAwKTsKLSAgICAgICAgLS1yb3V0ZS0+bVJlZkNvdW50OwotICAgICAgICBpZiAocm91dGUtPm1SZWZDb3VudCA8PSAwKSB7Ci0gICAgICAgICAgICByZW1vdmVJdGVtKHNlc3Npb24pOwotICAgICAgICB9Ci0gICAgfQotfQotCi1pbnQgU2Vzc2lvblJvdXRlTWFwOjppbmNSb3V0ZUFjdGl2aXR5KGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQotewotICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBpbmRleE9mS2V5KHNlc3Npb24pID49IDAgPyB2YWx1ZUZvcihzZXNzaW9uKSA6IDA7Ci0gICAgcmV0dXJuIHJvdXRlICE9IDAgPyArKyhyb3V0ZS0+bUFjdGl2aXR5Q291bnQpIDogLTE7Ci19Ci0KLWludCBTZXNzaW9uUm91dGVNYXA6OmRlY1JvdXRlQWN0aXZpdHkoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCi17Ci0gICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IGluZGV4T2ZLZXkoc2Vzc2lvbikgPj0gMCA/IHZhbHVlRm9yKHNlc3Npb24pIDogMDsKLSAgICBpZiAocm91dGUgIT0gMCAmJiByb3V0ZS0+bUFjdGl2aXR5Q291bnQgPiAwKSB7Ci0gICAgICAgIHJldHVybiAtLShyb3V0ZS0+bUFjdGl2aXR5Q291bnQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci19Ci0KLXZvaWQgU2Vzc2lvblJvdXRlTWFwOjpsb2coY29uc3QgY2hhciogY2FwdGlvbikKLXsKLSAgICBBTE9HSSgiJXMgLS0tLSIsIGNhcHRpb24pOwotICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBzaXplKCk7IGluZGV4KyspIHsKLSAgICAgICAgdmFsdWVBdChpbmRleCktPmxvZygiICAiKTsKLSAgICB9Ci19Ci0KLXZvaWQgU2Vzc2lvblJvdXRlTWFwOjphZGRSb3V0ZShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkKLXsKLSAgICBpZiAobU1hcFR5cGUgPT0gTUFQVFlQRV9JTlBVVCAmJiBzdHJlYW1UeXBlICE9IFNlc3Npb25Sb3V0ZTo6U1RSRUFNX1RZUEVfTkEpIHsKLSAgICAgICAgQUxPR0UoIkFkZGluZyBPdXRwdXQgUm91dGUgdG8gSW5wdXRSb3V0ZU1hcCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChtTWFwVHlwZSA9PSBNQVBUWVBFX09VVFBVVCAmJiBzb3VyY2UgIT0gU2Vzc2lvblJvdXRlOjpTT1VSQ0VfVFlQRV9OQSkgewotICAgICAgICBBTE9HRSgiQWRkaW5nIElucHV0IFJvdXRlIHRvIE91dHB1dFJvdXRlTWFwIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gaW5kZXhPZktleShzZXNzaW9uKSA+PSAwID8gdmFsdWVGb3Ioc2Vzc2lvbikgOiAwOwotCi0gICAgaWYgKHJvdXRlICE9IDApIHsKLSAgICAgICAgaWYgKGRlc2NyaXB0b3IgIT0gMCB8fCByb3V0ZS0+bURldmljZURlc2NyaXB0b3IgIT0gMCkgewotICAgICAgICAgICAgcm91dGUtPm1DaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByb3V0ZS0+bVJlZkNvdW50Kys7Ci0gICAgICAgIHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcm91dGUgPSBuZXcgU2Vzc2lvblJvdXRlKHNlc3Npb24sIHN0cmVhbVR5cGUsIHNvdXJjZSwgZGVzY3JpcHRvciwgdWlkKTsKLSAgICAgICAgcm91dGUtPm1SZWZDb3VudCsrOwotICAgICAgICBpZiAoZGVzY3JpcHRvciAhPSAwKSB7Ci0gICAgICAgICAgICByb3V0ZS0+bUNoYW5nZWQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGFkZChzZXNzaW9uLCByb3V0ZSk7Ci0gICAgfQotfQotCi1hdWRpb19kZXZpY2VzX3QgU2Vzc2lvblJvdXRlTWFwOjpnZXRBY3RpdmVEZXZpY2VGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgYXZhaWxhYmxlRGV2aWNlcykKLXsKLSAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgc2l6ZSgpOyBpbmRleCsrKSB7Ci0gICAgICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSB2YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgaWYgKHN0cmVhbVR5cGUgPT0gcm91dGUtPm1TdHJlYW1UeXBlICYmIHJvdXRlLT5pc0FjdGl2ZU9yQ2hhbmdlZCgpCi0gICAgICAgICAgICAgICAgJiYgcm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yICE9IDApIHsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSByb3V0ZS0+bURldmljZURlc2NyaXB0b3ItPnR5cGUoKTsKLSAgICAgICAgICAgIGlmICghYXZhaWxhYmxlRGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBBVURJT19ERVZJQ0VfTk9ORTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU3RyZWFtRGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TdHJlYW1EZXNjcmlwdG9yLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU2NDlmYi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9TdHJlYW1EZXNjcmlwdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJBUE06OlZvbHVtZXMiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLS8vI2RlZmluZSBWRVJZX1ZFUkJPU0VfTE9HR0lORwotI2lmZGVmIFZFUllfVkVSQk9TRV9MT0dHSU5HCi0jZGVmaW5lIEFMT0dWViBBTE9HVgotI2Vsc2UKLSNkZWZpbmUgQUxPR1ZWKGEuLi4pIGRvIHsgfSB3aGlsZSgwKQotI2VuZGlmCi0KLSNpbmNsdWRlICJTdHJlYW1EZXNjcmlwdG9yLmgiCi0jaW5jbHVkZSAiR2FpbnMuaCIKLSNpbmNsdWRlICJwb2xpY3kuaCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tIFN0cmVhbURlc2NyaXB0b3IgY2xhc3MgaW1wbGVtZW50YXRpb24KLQotU3RyZWFtRGVzY3JpcHRvcjo6U3RyZWFtRGVzY3JpcHRvcigpCi0gICAgOiAgIG1JbmRleE1pbigwKSwgbUluZGV4TWF4KDEpLCBtQ2FuQmVNdXRlZCh0cnVlKQotewotICAgIC8vIEluaXRpYWxpemUgdGhlIGN1cnJlbnQgc3RyZWFtJ3MgaW5kZXggdG8gbUluZGV4TWF4IHNvIHZvbHVtZSBpc24ndCAwIGluCi0gICAgLy8gY2FzZXMgd2hlcmUgdGhlIEphdmEgbGF5ZXIgZG9lc24ndCBjYWxsIGludG8gdGhlIGF1ZGlvIHBvbGljeSBzZXJ2aWNlIHRvCi0gICAgLy8gc2V0IHRoZSBkZWZhdWx0IHZvbHVtZS4KLSAgICBtSW5kZXhDdXIuYWRkKEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FLCBtSW5kZXhNYXgpOwotfQotCi1pbnQgU3RyZWFtRGVzY3JpcHRvcjo6Z2V0Vm9sdW1lSW5kZXgoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKLXsKLSAgICBkZXZpY2UgPSBWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShkZXZpY2UpOwotICAgIC8vIHRoZXJlIGlzIGFsd2F5cyBhIHZhbGlkIGVudHJ5IGZvciBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRQotICAgIGlmIChtSW5kZXhDdXIuaW5kZXhPZktleShkZXZpY2UpIDwgMCkgewotICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRTsKLSAgICB9Ci0gICAgcmV0dXJuIG1JbmRleEN1ci52YWx1ZUZvcihkZXZpY2UpOwotfQotCi12b2lkIFN0cmVhbURlc2NyaXB0b3I6OmNsZWFyQ3VycmVudFZvbHVtZUluZGV4KCkKLXsKLSAgICBtSW5kZXhDdXIuY2xlYXIoKTsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yOjphZGRDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fZGV2aWNlc190IGRldmljZSwgaW50IGluZGV4KQotewotICAgIG1JbmRleEN1ci5hZGQoZGV2aWNlLCBpbmRleCk7Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvcjo6c2V0Vm9sdW1lSW5kZXhNaW4oaW50IHZvbEluZGV4TWluKQotewotICAgIG1JbmRleE1pbiA9IHZvbEluZGV4TWluOwotfQotCi12b2lkIFN0cmVhbURlc2NyaXB0b3I6OnNldFZvbHVtZUluZGV4TWF4KGludCB2b2xJbmRleE1heCkKLXsKLSAgICBtSW5kZXhNYXggPSB2b2xJbmRleE1heDsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yOjpzZXRWb2x1bWVDdXJ2ZVBvaW50KGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpwb2ludCkKLXsKLSAgICBtVm9sdW1lQ3VydmVbZGV2aWNlQ2F0ZWdvcnldID0gcG9pbnQ7Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpIGNvbnN0Ci17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlcyAgICAgICAgICUwMmQgICAgICAgICAlMDJkICAgICAgICAgIiwKLSAgICAgICAgICAgICBtQ2FuQmVNdXRlZCA/ICJ0cnVlICIgOiAiZmFsc2UiLCBtSW5kZXhNaW4sIG1JbmRleE1heCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUluZGV4Q3VyLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUwNHggOiAlMDJkLCAiLAotICAgICAgICAgICAgICAgICBtSW5kZXhDdXIua2V5QXQoaSksCi0gICAgICAgICAgICAgICAgIG1JbmRleEN1ci52YWx1ZUF0KGkpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIH0KLSAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwotCi0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci19Ci0KLVN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uOjpTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbigpCi17Ci0gICAgZm9yIChzaXplX3Qgc3RyZWFtID0gMCA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9DTlQ7IHN0cmVhbSsrKSB7Ci0gICAgICAgIGFkZChzdGF0aWNfY2FzdDxhdWRpb19zdHJlYW1fdHlwZV90PihzdHJlYW0pLCBTdHJlYW1EZXNjcmlwdG9yKCkpOwotICAgIH0KLX0KLQotYm9vbCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6Y2FuQmVNdXRlZChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLXsKLSAgICByZXR1cm4gdmFsdWVBdChzdHJlYW0pLmNhbkJlTXV0ZWQoKTsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6Y2xlYXJDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi17Ci0gICAgZWRpdFZhbHVlQXQoc3RyZWFtKS5jbGVhckN1cnJlbnRWb2x1bWVJbmRleCgpOwotfQotCi12b2lkIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uOjphZGRDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgaW50IGluZGV4KQotewotICAgIGVkaXRWYWx1ZUF0KHN0cmVhbSkuYWRkQ3VycmVudFZvbHVtZUluZGV4KGRldmljZSwgaW5kZXgpOwotfQotCi12b2lkIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uOjpzZXRWb2x1bWVDdXJ2ZVBvaW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKnBvaW50KQotewotICAgIGVkaXRWYWx1ZUF0KHN0cmVhbSkuc2V0Vm9sdW1lQ3VydmVQb2ludChkZXZpY2VDYXRlZ29yeSwgcG9pbnQpOwotfQotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6Z2V0Vm9sdW1lQ3VydmVQb2ludChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSkgY29uc3QKLXsKLSAgICByZXR1cm4gdmFsdWVBdChzdHJlYW0pLmdldFZvbHVtZUN1cnZlUG9pbnQoZGV2aWNlQ2F0ZWdvcnkpOwotfQotCi12b2lkIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uOjpzZXRWb2x1bWVJbmRleE1pbihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSxpbnQgdm9sSW5kZXhNaW4pCi17Ci0gICAgcmV0dXJuIGVkaXRWYWx1ZUF0KHN0cmVhbSkuc2V0Vm9sdW1lSW5kZXhNaW4odm9sSW5kZXhNaW4pOwotfQotCi12b2lkIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uOjpzZXRWb2x1bWVJbmRleE1heChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSxpbnQgdm9sSW5kZXhNYXgpCi17Ci0gICAgcmV0dXJuIGVkaXRWYWx1ZUF0KHN0cmVhbSkuc2V0Vm9sdW1lSW5kZXhNYXgodm9sSW5kZXhNYXgpOwotfQotCi1mbG9hdCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6dm9sSW5kZXhUb0RiKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBkZXZpY2VfY2F0ZWdvcnkgY2F0ZWdvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleEluVWkpIGNvbnN0Ci17Ci0gICAgY29uc3QgU3RyZWFtRGVzY3JpcHRvciAmc3RyZWFtRGVzYyA9IHZhbHVlQXQoc3RyZWFtKTsKLSAgICByZXR1cm4gR2FpbnM6OnZvbEluZGV4VG9EYihzdHJlYW1EZXNjLmdldFZvbHVtZUN1cnZlUG9pbnQoY2F0ZWdvcnkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbURlc2MuZ2V0Vm9sdW1lSW5kZXhNaW4oKSwgc3RyZWFtRGVzYy5nZXRWb2x1bWVJbmRleE1heCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4SW5VaSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uOjppbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgpCi17Ci0gICAgQUxPR1YoImluaXRTdHJlYW1Wb2x1bWUoKSBzdHJlYW0gJWQsIG1pbiAlZCwgbWF4ICVkIiwgc3RyZWFtICwgaW5kZXhNaW4sIGluZGV4TWF4KTsKLSAgICBpZiAoaW5kZXhNaW4gPCAwIHx8IGluZGV4TWluID49IGluZGV4TWF4KSB7Ci0gICAgICAgIEFMT0dXKCJpbml0U3RyZWFtVm9sdW1lKCkgaW52YWxpZCBpbmRleCBsaW1pdHMgZm9yIHN0cmVhbSAlZCwgbWluICVkLCBtYXggJWQiLAotICAgICAgICAgICAgICBzdHJlYW0gLCBpbmRleE1pbiwgaW5kZXhNYXgpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBzZXRWb2x1bWVJbmRleE1pbihzdHJlYW0sIGluZGV4TWluKTsKLSAgICBzZXRWb2x1bWVJbmRleE1heChzdHJlYW0sIGluZGV4TWF4KTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OmluaXRpYWxpemVWb2x1bWVDdXJ2ZXMoYm9vbCBpc1NwZWFrZXJEcmNFbmFibGVkKQotewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgREVWSUNFX0NBVEVHT1JZX0NOVDsgaisrKSB7Ci0gICAgICAgICAgICBzZXRWb2x1bWVDdXJ2ZVBvaW50KHN0YXRpY19jYXN0PGF1ZGlvX3N0cmVhbV90eXBlX3Q+KGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxkZXZpY2VfY2F0ZWdvcnk+KGopLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYWluczo6c1ZvbHVtZVByb2ZpbGVzW2ldW2pdKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIENoZWNrIGF2YWlsYWJpbGl0eSBvZiBEUkMgb24gc3BlYWtlciBwYXRoOiBpZiBhdmFpbGFibGUsIG92ZXJyaWRlIHNvbWUgb2YgdGhlIHNwZWFrZXIgY3VydmVzCi0gICAgaWYgKGlzU3BlYWtlckRyY0VuYWJsZWQpIHsKLSAgICAgICAgc2V0Vm9sdW1lQ3VydmVQb2ludChBVURJT19TVFJFQU1fU1lTVEVNLCBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZURyYyk7Ci0gICAgICAgIHNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX1JJTkcsIERFVklDRV9DQVRFR09SWV9TUEVBS0VSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdhaW5zOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjKTsKLSAgICAgICAgc2V0Vm9sdW1lQ3VydmVQb2ludChBVURJT19TVFJFQU1fQUxBUk0sIERFVklDRV9DQVRFR09SWV9TUEVBS0VSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdhaW5zOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlRHJjKTsKLSAgICAgICAgc2V0Vm9sdW1lQ3VydmVQb2ludChBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OLCBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyYyk7Ci0gICAgICAgIHNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX01VU0lDLCBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYWluczo6c1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlRHJjKTsKLSAgICAgICAgc2V0Vm9sdW1lQ3VydmVQb2ludChBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSwgREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FpbnM6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZURyYyk7Ci0gICAgfQotfQotCi12b2lkIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uOjpzd2l0Y2hWb2x1bWVDdXJ2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtRHN0KQotewotICAgIGZvciAoaW50IGogPSAwOyBqIDwgREVWSUNFX0NBVEVHT1JZX0NOVDsgaisrKSB7Ci0gICAgICAgIHNldFZvbHVtZUN1cnZlUG9pbnQoc3RyZWFtRHN0LCBzdGF0aWNfY2FzdDxkZXZpY2VfY2F0ZWdvcnk+KGopLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdhaW5zOjpzVm9sdW1lUHJvZmlsZXNbc3RyZWFtU3JjXVtqXSk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpIGNvbnN0Ci17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcblN0cmVhbXMgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCi0gICAgICAgICAgICAgIiBTdHJlYW0gIENhbiBiZSBtdXRlZCAgSW5kZXggTWluICBJbmRleCBNYXggIEluZGV4IEN1ciBbZGV2aWNlIDogaW5kZXhdLi4uXG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgJTAyenUgICAgICAiLCBpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLmR1bXAoZmQpOwotICAgIH0KLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvVHlwZUNvbnZlcnRlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9UeXBlQ29udmVydGVyLmNwcAppbmRleCA2ZjQ4ZWFlLi4yYjU0NTVlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9UeXBlQ29udmVydGVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9UeXBlQ29udmVydGVyLmNwcApAQCAtNDUsMTMgKzQ1LDEzIEBACiBjb25zdCBSb3V0ZUZsYWdUeXBlQ29udmVydGVyOjpUYWJsZSBSb3V0ZUZsYWdUeXBlQ29udmVydGVyOjptVGFibGVbXSA9IHsKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLX0FORF9SRU5ERVIpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShNSVhfUk9VVEVfRkxBR19BTEwpLAogICAgIFRFUk1JTkFUT1IKIH07CiAKIHRlbXBsYXRlIDw+CiBjb25zdCBSdWxlVHlwZUNvbnZlcnRlcjo6VGFibGUgUnVsZVR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdID0gewotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShSVUxFX0VYQ0xVU0lPTl9NQVNLKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oUlVMRV9NQVRDSF9BVFRSSUJVVEVfVVNBR0UpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShSVUxFX01BVENIX0FUVFJJQlVURV9DQVBUVVJFX1BSRVNFVCksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKFJVTEVfTUFUQ0hfVUlEKSwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1ZvbHVtZUN1cnZlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1ZvbHVtZUN1cnZlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMzZjFiYy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Wb2x1bWVDdXJ2ZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQVBNOjpWb2x1bWVDdXJ2ZSIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgIlZvbHVtZUN1cnZlLmgiCi0jaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWZsb2F0IFZvbHVtZUN1cnZlOjp2b2xJbmRleFRvRGIoaW50IGluZGV4SW5VaSwgaW50IHZvbEluZGV4TWluLCBpbnQgdm9sSW5kZXhNYXgpIGNvbnN0Ci17Ci0gICAgQUxPR19BU1NFUlQoIW1DdXJ2ZVBvaW50cy5pc0VtcHR5KCksICJJbnZhbGlkIHZvbHVtZSBjdXJ2ZSIpOwotCi0gICAgc2l6ZV90IG5iQ3VydmVQb2ludHMgPSBtQ3VydmVQb2ludHMuc2l6ZSgpOwotICAgIC8vIHRoZSB2b2x1bWUgaW5kZXggaW4gdGhlIFVJIGlzIHJlbGF0aXZlIHRvIHRoZSBtaW4gYW5kIG1heCB2b2x1bWUgaW5kaWNlcyBmb3IgdGhpcyBzdHJlYW0KLSAgICBpbnQgbmJTdGVwcyA9IDEgKyBtQ3VydmVQb2ludHNbbmJDdXJ2ZVBvaW50cyAtIDFdLm1JbmRleCAtIG1DdXJ2ZVBvaW50c1swXS5tSW5kZXg7Ci0gICAgaWYgKGluZGV4SW5VaSA8IHZvbEluZGV4TWluKSB7Ci0gICAgICAgIEFMT0dWKCJWT0xVTUUgcmVtYXBwaW5nIGluZGV4IGZyb20gJWQgdG8gbWluIGluZGV4ICVkIiwgaW5kZXhJblVpLCB2b2xJbmRleE1pbik7Ci0gICAgICAgIGluZGV4SW5VaSA9IHZvbEluZGV4TWluOwotICAgIH0gZWxzZSBpZiAoaW5kZXhJblVpID4gdm9sSW5kZXhNYXgpIHsKLSAgICAgICAgQUxPR1YoIlZPTFVNRSByZW1hcHBpbmcgaW5kZXggZnJvbSAlZCB0byBtYXggaW5kZXggJWQiLCBpbmRleEluVWksIHZvbEluZGV4TWF4KTsKLSAgICAgICAgaW5kZXhJblVpID0gdm9sSW5kZXhNYXg7Ci0gICAgfQotICAgIGludCB2b2xJZHggPSAobmJTdGVwcyAqIChpbmRleEluVWkgLSB2b2xJbmRleE1pbikpIC8gKHZvbEluZGV4TWF4IC0gdm9sSW5kZXhNaW4pOwotCi0gICAgLy8gV2hlcmUgd291bGQgdGhpcyB2b2x1bWUgaW5kZXggYmVlbiBpbnNlcnRlZCBpbiB0aGUgY3VydmUgcG9pbnQKLSAgICBzaXplX3QgaW5kZXhJblVpUG9zaXRpb24gPSBtQ3VydmVQb2ludHMub3JkZXJPZihDdXJ2ZVBvaW50KHZvbElkeCwgMCkpOwotICAgIGlmIChpbmRleEluVWlQb3NpdGlvbiA+PSBuYkN1cnZlUG9pbnRzKSB7Ci0gICAgICAgIC8vdXNlIGxhc3QgcG9pbnQgb2YgdGFibGUKLSAgICAgICAgcmV0dXJuIG1DdXJ2ZVBvaW50c1tuYkN1cnZlUG9pbnRzIC0gMV0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZjsKLSAgICB9Ci0gICAgaWYgKGluZGV4SW5VaVBvc2l0aW9uID09IDApIHsKLSAgICAgICAgaWYgKGluZGV4SW5VaVBvc2l0aW9uICE9IG1DdXJ2ZVBvaW50c1swXS5tSW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBWT0xVTUVfTUlOX0RCOyAvLyBvdXQgb2YgYm91bmRzCi0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1DdXJ2ZVBvaW50c1swXS5tQXR0ZW51YXRpb25Jbk1iIC8gMTAwLjBmOwotICAgIH0KLSAgICAvLyBsaW5lYXIgaW50ZXJwb2xhdGlvbiBpbiB0aGUgYXR0ZW51YXRpb24gdGFibGUgaW4gZEIKLSAgICBmbG9hdCBkZWNpYmVscyA9IChtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb24gLSAxXS5tQXR0ZW51YXRpb25Jbk1iIC8gMTAwLjBmKSArCi0gICAgICAgICAgICAoKGZsb2F0KSh2b2xJZHggLSBtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb24gLSAxXS5tSW5kZXgpKSAqCi0gICAgICAgICAgICAgICAgKCAoKG1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbl0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZikgLQotICAgICAgICAgICAgICAgICAgICAgICAgKG1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbiAtIDFdLm1BdHRlbnVhdGlvbkluTWIgLyAxMDAuMGYpKSAvCi0gICAgICAgICAgICAgICAgICAgICgoZmxvYXQpKG1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbl0ubUluZGV4IC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb24gLSAxXS5tSW5kZXgpKSApOwotCi0gICAgQUxPR1YoIlZPTFVNRSBtRGV2aWNlQ2F0ZWdvcnkgJWQsIG1TdHJlYW1UeXBlICVkIHZvbCBpbmRleD1bJWQgJWQgJWRdLCBkQj1bJS4xZiAlLjFmICUuMWZdIiwKLSAgICAgICAgICAgIG1EZXZpY2VDYXRlZ29yeSwgbVN0cmVhbVR5cGUsCi0gICAgICAgICAgICBtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb24gLSAxXS5tSW5kZXgsIHZvbElkeCwKLSAgICAgICAgICAgIG1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbl0ubUluZGV4LAotICAgICAgICAgICAgKChmbG9hdCltQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb24gLSAxXS5tQXR0ZW51YXRpb25Jbk1iIC8gMTAwLjBmKSwgZGVjaWJlbHMsCi0gICAgICAgICAgICAoKGZsb2F0KW1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbl0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZikpOwotCi0gICAgcmV0dXJuIGRlY2liZWxzOwotfQotCi12b2lkIFZvbHVtZUN1cnZlOjpkdW1wKGludCBmZCkgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgeyIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DdXJ2ZVBvaW50cy5zaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIoJTNkLCAlNWQpIiwKLSAgICAgICAgICAgICAgICAgbUN1cnZlUG9pbnRzW2ldLm1JbmRleCwgbUN1cnZlUG9pbnRzW2ldLm1BdHRlbnVhdGlvbkluTWIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoaSA9PSAobUN1cnZlUG9pbnRzLnNpemUoKSAtIDEpID8gIiB9XG4iIDogIiwgIik7Ci0gICAgfQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotfQotCi12b2lkIFZvbHVtZUN1cnZlc0ZvclN0cmVhbTo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMgPSAwLCBib29sIGN1cnZlUG9pbnRzKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgaWYgKCFjdXJ2ZVBvaW50cykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlcyAgICAgICAgICUwMmQgICAgICAgICAlMDJkICAgICAgICAgIiwKLSAgICAgICAgICAgICAgICAgbUNhbkJlTXV0ZWQgPyAidHJ1ZSAiIDogImZhbHNlIiwgbUluZGV4TWluLCBtSW5kZXhNYXgpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUluZGV4Q3VyLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlMDR4IDogJTAyZCwgIiwgbUluZGV4Q3VyLmtleUF0KGkpLCBtSW5kZXhDdXIudmFsdWVBdChpKSk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKLSAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIGRldmljZUNhdExpdGVyYWw7Ci0gICAgICAgIERldmljZUNhdGVnb3J5Q29udmVydGVyOjp0b1N0cmluZyhrZXlBdChpKSwgZGV2aWNlQ2F0TGl0ZXJhbCk7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcyAlcyA6IiwKLSAgICAgICAgICAgICAgICAgc3BhY2VzLCAiIiwgZGV2aWNlQ2F0TGl0ZXJhbC5jX3N0cigpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkKTsKLSAgICB9Ci0gICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLX0KLQotc3RhdHVzX3QgVm9sdW1lQ3VydmVzQ29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpIGNvbnN0Ci17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcblN0cmVhbXMgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCi0gICAgICAgICAgICAgIiBTdHJlYW0gIENhbiBiZSBtdXRlZCAgSW5kZXggTWluICBJbmRleCBNYXggIEluZGV4IEN1ciBbZGV2aWNlIDogaW5kZXhdLi4uXG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgJTAyenUgICAgICAiLCBpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLmR1bXAoZmQpOwotICAgIH0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcblZvbHVtZSBDdXJ2ZXMgZm9yIFVzZSBDYXNlcyAoYWthIFN0cmVhbSB0eXBlcykgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHN0cmVhbVR5cGVMaXRlcmFsOwotICAgICAgICBTdHJlYW1UeXBlQ29udmVydGVyOjp0b1N0cmluZyhrZXlBdChpKSwgc3RyZWFtVHlwZUxpdGVyYWwpOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsCi0gICAgICAgICAgICAgICAgICIgJXMgKCUwMnp1KTogQ3VydmUgcG9pbnRzIGZvciBkZXZpY2UgY2F0ZWdvcnkgKGluZGV4LCBhdHRlbnVhdGlvbiBpbiBtaWxsaWJlbClcbiIsCi0gICAgICAgICAgICAgICAgIHN0cmVhbVR5cGVMaXRlcmFsLmNfc3RyKCksIGkpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIHZhbHVlQXQoaSkuZHVtcChmZCwgMiwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYTJkcF9pbl9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYTJkcF9pbl9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdiZDRmOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hMmRwX2luX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApAQCAtMCwwICsxLDIyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBCbHVldG9vdGggSW5wdXQgQXVkaW8gSEFMIEF1ZGlvIFBvbGljeSBDb25maWd1cmF0aW9uIGZpbGUgLS0+Cis8bW9kdWxlIG5hbWU9ImEyZHAiIGhhbFZlcnNpb249IjIuMCI+CisgICAgPG1peFBvcnRzPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJhMmRwIGlucHV0IiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX01PTk8sQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8iLz4KKyAgICAgICAgPC9taXhQb3J0PgorICAgIDwvbWl4UG9ydHM+CisgICAgPGRldmljZVBvcnRzPgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBBMkRQIEluIiB0eXBlPSJBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFAiIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PLEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICA8L2RldmljZVBvcnRzPgorICAgIDxyb3V0ZXM+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9ImEyZHAgaW5wdXQiCisgICAgICAgICAgICAgICBzb3VyY2VzPSJCVCBBMkRQIEluIi8+CisgICAgPC9yb3V0ZXM+Cis8L21vZHVsZT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCmluZGV4IGE3NWYxY2IuLmIyODM4MWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApAQCAtMSw1ICsxLDUgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KLTwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKIAogICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTczLDggKzE3Myw4IEBACiAKICAgICAgICAgPC9tb2R1bGU+CiAKLSAgICAgICAgPCEtLSBBMmRwIEF1ZGlvIEhBTCAtLT4KLSAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0iYTJkcF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLz4KKyAgICAgICAgPCEtLSBBMmRwIElucHV0IEF1ZGlvIEhBTCAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0iYTJkcF9pbl9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLz4KIAogICAgICAgICA8IS0tIFVzYiBBdWRpbyBIQUwgLS0+CiAgICAgICAgIDx4aTppbmNsdWRlIGhyZWY9InVzYl9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLz4KQEAgLTE4MiwxNyArMTgyLDMwIEBACiAgICAgICAgIDwhLS0gUmVtb3RlIFN1Ym1peCBBdWRpbyBIQUwgLS0+CiAgICAgICAgIDx4aTppbmNsdWRlIGhyZWY9InJfc3VibWl4X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCIvPgogCi0gICAgICAgIDwhLS0gSGVhcmluZyBhaWQgQXVkaW8gSEFMIC0tPgotICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJoZWFyaW5nX2FpZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLz4KKyAgICAgICAgPCEtLSBCbHVldG9vdGggQXVkaW8gSEFMIC0tPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJibHVldG9vdGhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIi8+CisKKyAgICAgICAgPCEtLSBNU0QgQXVkaW8gSEFMIChvcHRpb25hbCkgLS0+CisgICAgICAgIDx4aTppbmNsdWRlIGhyZWY9Im1zZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLz4KIAogICAgIDwvbW9kdWxlcz4KICAgICA8IS0tIEVuZCBvZiBNb2R1bGVzIHNlY3Rpb24gLS0+CiAKLSAgICA8IS0tIFZvbHVtZSBzZWN0aW9uIC0tPgorICAgIDwhLS0gVm9sdW1lIHNlY3Rpb246CisgICAgICAgIElNUE9SVEFOVCBOT1RFOiBWb2x1bWUgdGFibGVzIGhhdmUgYmVlbiBtb3ZlZCB0byBlbmdpbmUgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIEtlZXAgaXQgaGVyZSBmb3IgbGVnYWN5LgorICAgICAgICAgICAgICAgICAgICAgICAgRW5naW5lIHdpbGwgZmFsbGJhY2sgb24gdGhlc2UgZmlsZXMgaWYgbm9uZSBhcmUgcHJvdmlkZWQgYnkgZW5naW5lLgorICAgICAtLT4KIAogICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV92b2x1bWVzLnhtbCIvPgogICAgIDx4aTppbmNsdWRlIGhyZWY9ImRlZmF1bHRfdm9sdW1lX3RhYmxlcy54bWwiLz4KIAogICAgIDwhLS0gRW5kIG9mIFZvbHVtZSBzZWN0aW9uIC0tPgogCisgICAgPCEtLSBTdXJyb3VuZCBTb3VuZCBjb25maWd1cmF0aW9uIC0tPgorCisgICAgPHhpOmluY2x1ZGUgaHJlZj0ic3Vycm91bmRfc291bmRfY29uZmlndXJhdGlvbl81XzAueG1sIi8+CisKKyAgICA8IS0tIEVuZCBvZiBTdXJyb3VuZCBTb3VuZCBjb25maWd1cmF0aW9uIC0tPgorCiA8L2F1ZGlvUG9saWN5Q29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9ibHVldG9vdGhfbGVnYWN5X2hhbC54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fYmx1ZXRvb3RoX2xlZ2FjeV9oYWwueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0Y2MxZDMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fYmx1ZXRvb3RoX2xlZ2FjeV9oYWwueG1sCkBAIC0wLDAgKzEsMjExIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxhdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24gdmVyc2lvbj0iMS4wIiB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI+CisgICAgPCEtLSB2ZXJzaW9uIHNlY3Rpb24gY29udGFpbnMgYSDigJx2ZXJzaW9u4oCdIHRhZyBpbiB0aGUgZm9ybSDigJxtYWpvci5taW5vcuKAnSBlLmcgdmVyc2lvbj3igJ0xLjDigJ0gLS0+CisKKyAgICA8IS0tIEdsb2JhbCBjb25maWd1cmF0aW9uIERlY2FsYXJhdGlvbiAtLT4KKyAgICA8Z2xvYmFsQ29uZmlndXJhdGlvbiBzcGVha2VyX2RyY19lbmFibGVkPSJ0cnVlIi8+CisKKworICAgIDwhLS0gTW9kdWxlcyBzZWN0aW9uOgorICAgICAgICBUaGVyZSBpcyBvbmUgc2VjdGlvbiBwZXIgYXVkaW8gSFcgbW9kdWxlIHByZXNlbnQgb24gdGhlIHBsYXRmb3JtLgorICAgICAgICBFYWNoIG1vZHVsZSBzZWN0aW9uIHdpbGwgY29udGFpbnMgdHdvIG1hbmRhdG9yeSB0YWdzIGZvciBhdWRpbyBIQUwg4oCcaGFsVmVyc2lvbuKAnSBhbmQg4oCcbmFtZeKAnS4KKyAgICAgICAgVGhlIG1vZHVsZSBuYW1lcyBhcmUgdGhlIHNhbWUgYXMgaW4gY3VycmVudCAuY29uZiBmaWxlOgorICAgICAgICAgICAgICAgIOKAnHByaW1hcnnigJ0sIOKAnEEyRFDigJ0sIOKAnHJlbW90ZV9zdWJtaXjigJ0sIOKAnFVTQuKAnQorICAgICAgICBFYWNoIG1vZHVsZSB3aWxsIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBzZWN0aW9uczoKKyAgICAgICAg4oCcZGV2aWNlUG9ydHPigJ06IGEgbGlzdCBvZiBkZXZpY2UgZGVzY3JpcHRvcnMgZm9yIGFsbCBpbnB1dCBhbmQgb3V0cHV0IGRldmljZXMgYWNjZXNzaWJsZSB2aWEgdGhpcworICAgICAgICBtb2R1bGUuCisgICAgICAgIFRoaXMgY29udGFpbnMgYm90aCBwZXJtYW5lbnRseSBhdHRhY2hlZCBkZXZpY2VzIGFuZCByZW1vdmFibGUgZGV2aWNlcy4KKyAgICAgICAg4oCcbWl4UG9ydHPigJ06IGxpc3RpbmcgYWxsIG91dHB1dCBhbmQgaW5wdXQgc3RyZWFtcyBleHBvc2VkIGJ5IHRoZSBhdWRpbyBIQUwKKyAgICAgICAg4oCccm91dGVz4oCdOiBsaXN0IG9mIHBvc3NpYmxlIGNvbm5lY3Rpb25zIGJldHdlZW4gaW5wdXQgYW5kIG91dHB1dCBkZXZpY2VzIG9yIGJldHdlZW4gc3RyZWFtIGFuZAorICAgICAgICBkZXZpY2VzLgorICAgICAgICAgICAgInJvdXRlIjogaXMgZGVmaW5lZCBieSBhbiBhdHRyaWJ1dGU6CisgICAgICAgICAgICAgICAgLSJ0eXBlIjogPG11eHxtaXg+IG1lYW5zIGFsbCBzb3VyY2VzIGFyZSBtdXR1YWwgZXhjbHVzaXZlIChtdXgpIG9yIGNhbiBiZSBtaXhlZCAobWl4KQorICAgICAgICAgICAgICAgIC0ic2luayI6IHRoZSBzaW5rIGludm9sdmVkIGluIHRoaXMgcm91dGUKKyAgICAgICAgICAgICAgICAtInNvdXJjZXMiOiBhbGwgdGhlIHNvdXJjZXMgdGhhbiBjYW4gYmUgY29ubmVjdGVkIHRvIHRoZSBzaW5rIHZpYSB2aXMgcm91dGUKKyAgICAgICAg4oCcYXR0YWNoZWREZXZpY2Vz4oCdOiBwZXJtYW5lbnRseSBhdHRhY2hlZCBkZXZpY2VzLgorICAgICAgICBUaGUgYXR0YWNoZWREZXZpY2VzIHNlY3Rpb24gaXMgYSBsaXN0IG9mIGRldmljZXMgbmFtZXMuIFRoZSBuYW1lcyBjb3JyZXNwb25kIHRvIGRldmljZSBuYW1lcworICAgICAgICBkZWZpbmVkIGluIDxkZXZpY2VQb3J0cz4gc2VjdGlvbi4KKyAgICAgICAg4oCcZGVmYXVsdE91dHB1dERldmljZeKAnTogZGV2aWNlIHRvIGJlIHVzZWQgYnkgZGVmYXVsdCB3aGVuIG5vIHBvbGljeSBydWxlIGFwcGxpZXMKKyAgICAtLT4KKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPCEtLSBQcmltYXJ5IEF1ZGlvIEhBTCAtLT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJwcmltYXJ5IiBoYWxWZXJzaW9uPSIzLjAiPgorICAgICAgICAgICAgPGF0dGFjaGVkRGV2aWNlcz4KKyAgICAgICAgICAgICAgICA8aXRlbT5TcGVha2VyPC9pdGVtPgorICAgICAgICAgICAgICAgIDxpdGVtPkJ1aWx0LUluIE1pYzwvaXRlbT4KKyAgICAgICAgICAgICAgICA8aXRlbT5CdWlsdC1JbiBCYWNrIE1pYzwvaXRlbT4KKyAgICAgICAgICAgIDwvYXR0YWNoZWREZXZpY2VzPgorICAgICAgICAgICAgPGRlZmF1bHRPdXRwdXREZXZpY2U+U3BlYWtlcjwvZGVmYXVsdE91dHB1dERldmljZT4KKyAgICAgICAgICAgIDxtaXhQb3J0cz4KKyAgICAgICAgICAgICAgICA8bWl4UG9ydCBuYW1lPSJwcmltYXJ5IG91dHB1dCIgcm9sZT0ic291cmNlIiBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICAgICAgIDxtaXhQb3J0IG5hbWU9ImRlZXBfYnVmZmVyIiByb2xlPSJzb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVIiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICAgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgICAgICAgICA8bWl4UG9ydCBuYW1lPSJjb21wcmVzc2VkX29mZmxvYWQiIHJvbGU9InNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUfEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUR8QVVESU9fT1VUUFVUX0ZMQUdfTk9OX0JMT0NLSU5HIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9NUDMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAsMTEwMjUsMTIwMDAsMTYwMDAsMjIwNTAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLEFVRElPX0NIQU5ORUxfT1VUX01PTk8iLz4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9BQUMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAsMTEwMjUsMTIwMDAsMTYwMDAsMjIwNTAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLEFVRElPX0NIQU5ORUxfT1VUX01PTk8iLz4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9BQUNfTEMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAsMTEwMjUsMTIwMDAsMTYwMDAsMjIwNTAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLEFVRElPX0NIQU5ORUxfT1VUX01PTk8iLz4KKyAgICAgICAgICAgICAgICA8L21peFBvcnQ+CisgICAgICAgICAgICAgICAgPG1peFBvcnQgbmFtZT0idm9pY2VfdHgiIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCwxNjAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICAgICAgIDxtaXhQb3J0IG5hbWU9InByaW1hcnkgaW5wdXQiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAsMTEwMjUsMTIwMDAsMTYwMDAsMjIwNTAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PLEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPLEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSyIvPgorICAgICAgICAgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgICAgICAgICA8bWl4UG9ydCBuYW1lPSJ2b2ljZV9yeCIgcm9sZT0ic2luayI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCwxNjAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX01PTk8iLz4KKyAgICAgICAgICAgICAgICA8L21peFBvcnQ+CisgICAgICAgICAgICA8L21peFBvcnRzPgorICAgICAgICAgICAgPGRldmljZVBvcnRzPgorICAgICAgICAgICAgICAgIDwhLS0gT3V0cHV0IGRldmljZXMgZGVjbGFyYXRpb24sIGkuZS4gU2luayBERVZJQ0UgUE9SVCAtLT4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJFYXJwaWVjZSIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRSIgcm9sZT0ic2luayI+CisgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fTU9OTyIvPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJTcGVha2VyIiByb2xlPSJzaW5rIiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIiIGFkZHJlc3M9IiI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgICAgICAgICAgICAgIDxnYWlucz4KKyAgICAgICAgICAgICAgICAgICAgICAgIDxnYWluIG5hbWU9ImdhaW5fMSIgbW9kZT0iQVVESU9fR0FJTl9NT0RFX0pPSU5UIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluVmFsdWVNQj0iLTg0MDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhWYWx1ZU1CPSI0MDAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlTUI9IjAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGVwVmFsdWVNQj0iMTAwIi8+CisgICAgICAgICAgICAgICAgICAgIDwvZ2FpbnM+CisgICAgICAgICAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IldpcmVkIEhlYWRzZXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVCIgcm9sZT0ic2luayI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgICAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IldpcmVkIEhlYWRwaG9uZXMiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FIiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQlQgU0NPIiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ08iIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAsMTYwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyIvPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBTQ08gSGVhZHNldCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAsMTYwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyIvPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBTQ08gQ2FyIEtpdCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVCIgcm9sZT0ic2luayI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCwxNjAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PIi8+CisgICAgICAgICAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IlRlbGVwaG9ueSBUeCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAsMTYwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyIvPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKworICAgICAgICAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJ1aWx0LUluIE1pYyIgdHlwZT0iQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDIiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAsMTEwMjUsMTIwMDAsMTYwMDAsMjIwNTAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PLEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPLEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSyIvPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCdWlsdC1JbiBCYWNrIE1pYyIgdHlwZT0iQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDIiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAsMTEwMjUsMTIwMDAsMTYwMDAsMjIwNTAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9NT05PLEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPLEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSyIvPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJXaXJlZCBIZWFkc2V0IE1pYyIgdHlwZT0iQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQiIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCwxMTAyNSwxMjAwMCwxNjAwMCwyMjA1MCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX01PTk8sQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8sQVVESU9fQ0hBTk5FTF9JTl9GUk9OVF9CQUNLIi8+CisgICAgICAgICAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIFNDTyBIZWFkc2V0IE1pYyIgdHlwZT0iQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCIgcm9sZT0ic291cmNlIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI4MDAwLDE2MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fTU9OTyIvPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJUZWxlcGhvbnkgUngiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgiIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iODAwMCwxNjAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX01PTk8iLz4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICA8L2RldmljZVBvcnRzPgorICAgICAgICAgICAgPCEtLSByb3V0ZSBkZWNsYXJhdGlvbiwgaS5lLiBsaXN0IGFsbCBhdmFpbGFibGUgc291cmNlcyBmb3IgYSBnaXZlbiBzaW5rIC0tPgorICAgICAgICAgICAgPHJvdXRlcz4KKyAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJFYXJwaWVjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0icHJpbWFyeSBvdXRwdXQsZGVlcF9idWZmZXIsQlQgU0NPIEhlYWRzZXQgTWljIi8+CisgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iU3BlYWtlciIKKyAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0icHJpbWFyeSBvdXRwdXQsZGVlcF9idWZmZXIsY29tcHJlc3NlZF9vZmZsb2FkLEJUIFNDTyBIZWFkc2V0IE1pYyxUZWxlcGhvbnkgUngiLz4KKyAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJXaXJlZCBIZWFkc2V0IgorICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPSJwcmltYXJ5IG91dHB1dCxkZWVwX2J1ZmZlcixjb21wcmVzc2VkX29mZmxvYWQsQlQgU0NPIEhlYWRzZXQgTWljLFRlbGVwaG9ueSBSeCIvPgorICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IldpcmVkIEhlYWRwaG9uZXMiCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9InByaW1hcnkgb3V0cHV0LGRlZXBfYnVmZmVyLGNvbXByZXNzZWRfb2ZmbG9hZCxCVCBTQ08gSGVhZHNldCBNaWMsVGVsZXBob255IFJ4Ii8+CisgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0icHJpbWFyeSBpbnB1dCIKKyAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0iQnVpbHQtSW4gTWljLEJ1aWx0LUluIEJhY2sgTWljLFdpcmVkIEhlYWRzZXQgTWljLEJUIFNDTyBIZWFkc2V0IE1pYyIvPgorICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IlRlbGVwaG9ueSBUeCIKKyAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0iQnVpbHQtSW4gTWljLEJ1aWx0LUluIEJhY2sgTWljLFdpcmVkIEhlYWRzZXQgTWljLEJUIFNDTyBIZWFkc2V0IE1pYywgdm9pY2VfdHgiLz4KKyAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJ2b2ljZV9yeCIKKyAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0iVGVsZXBob255IFJ4Ii8+CisgICAgICAgICAgICA8L3JvdXRlcz4KKworICAgICAgICA8L21vZHVsZT4KKworICAgICAgICA8IS0tIEEyZHAgQXVkaW8gSEFMIC0tPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJhMmRwX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCIvPgorCisgICAgICAgIDwhLS0gVXNiIEF1ZGlvIEhBTCAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0idXNiX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCIvPgorCisgICAgICAgIDwhLS0gUmVtb3RlIFN1Ym1peCBBdWRpbyBIQUwgLS0+CisgICAgICAgIDx4aTppbmNsdWRlIGhyZWY9InJfc3VibWl4X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCIvPgorCisgICAgICAgIDwhLS0gSGVhcmluZyBhaWQgQXVkaW8gSEFMIC0tPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJoZWFyaW5nX2FpZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLz4KKworICAgICAgICA8IS0tIE1TRCBBdWRpbyBIQUwgKG9wdGlvbmFsKSAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0ibXNkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCIvPgorCisgICAgPC9tb2R1bGVzPgorICAgIDwhLS0gRW5kIG9mIE1vZHVsZXMgc2VjdGlvbiAtLT4KKworICAgIDwhLS0gVm9sdW1lIHNlY3Rpb246CisgICAgICAgIElNUE9SVEFOVCBOT1RFOiBWb2x1bWUgdGFibGVzIGhhdmUgYmVlbiBtb3ZlZCB0byBlbmdpbmUgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIEtlZXAgaXQgaGVyZSBmb3IgbGVnYWN5LgorICAgICAgICAgICAgICAgICAgICAgICAgRW5naW5lIHdpbGwgZmFsbGJhY2sgb24gdGhlc2UgZmlsZXMgaWYgbm9uZSBhcmUgcHJvdmlkZWQgYnkgZW5naW5lLgorICAgICAtLT4KKworICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV92b2x1bWVzLnhtbCIvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9ImRlZmF1bHRfdm9sdW1lX3RhYmxlcy54bWwiLz4KKworICAgIDwhLS0gRW5kIG9mIFZvbHVtZSBzZWN0aW9uIC0tPgorCisgICAgPCEtLSBTdXJyb3VuZCBTb3VuZCBjb25maWd1cmF0aW9uIC0tPgorCisgICAgPHhpOmluY2x1ZGUgaHJlZj0ic3Vycm91bmRfc291bmRfY29uZmlndXJhdGlvbl81XzAueG1sIi8+CisKKyAgICA8IS0tIEVuZCBvZiBTdXJyb3VuZCBTb3VuZCBjb25maWd1cmF0aW9uIC0tPgorCis8L2F1ZGlvUG9saWN5Q29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9nZW5lcmljLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9nZW5lcmljLnhtbAppbmRleCA1ODc2OGMzLi45YWQ2MDlkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fZ2VuZXJpYy54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX2dlbmVyaWMueG1sCkBAIC0zMCwxMSArMzAsMjEgQEAKICAgICA8L21vZHVsZXM+CiAgICAgPCEtLSBFbmQgb2YgTW9kdWxlcyBzZWN0aW9uIC0tPgogCi0gICAgPCEtLSBWb2x1bWUgc2VjdGlvbiAtLT4KKyAgICA8IS0tIFZvbHVtZSBzZWN0aW9uOgorICAgICAgICBJTVBPUlRBTlQgTk9URTogVm9sdW1lIHRhYmxlcyBoYXZlIGJlZW4gbW92ZWQgdG8gZW5naW5lIGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICBLZWVwIGl0IGhlcmUgZm9yIGxlZ2FjeS4KKyAgICAgICAgICAgICAgICAgICAgICAgIEVuZ2luZSB3aWxsIGZhbGxiYWNrIG9uIHRoZXNlIGZpbGVzIGlmIG5vbmUgYXJlIHByb3ZpZGVkIGJ5IGVuZ2luZS4KKyAgICAgLS0+CiAKICAgICA8eGk6aW5jbHVkZSBocmVmPSJhdWRpb19wb2xpY3lfdm9sdW1lcy54bWwiLz4KICAgICA8eGk6aW5jbHVkZSBocmVmPSJkZWZhdWx0X3ZvbHVtZV90YWJsZXMueG1sIi8+CiAKICAgICA8IS0tIEVuZCBvZiBWb2x1bWUgc2VjdGlvbiAtLT4KIAorICAgIDwhLS0gU3Vycm91bmQgU291bmQgY29uZmlndXJhdGlvbiAtLT4KKworICAgIDx4aTppbmNsdWRlIGhyZWY9InN1cnJvdW5kX3NvdW5kX2NvbmZpZ3VyYXRpb25fNV8wLnhtbCIvPgorCisgICAgPCEtLSBFbmQgb2YgU3Vycm91bmQgU291bmQgY29uZmlndXJhdGlvbiAtLT4KKwogPC9hdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fZ2VuZXJpY190di54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fZ2VuZXJpY190di54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYxY2EzMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9nZW5lcmljX3R2LnhtbApAQCAtMCwwICsxLDQ5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxhdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24gdmVyc2lvbj0iMS4wIiB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI+CisgICAgPCEtLSB2ZXJzaW9uIHNlY3Rpb24gY29udGFpbnMgYSDigJx2ZXJzaW9u4oCdIHRhZyBpbiB0aGUgZm9ybSDigJxtYWpvci5taW5vcuKAnSBlLmcgdmVyc2lvbj3igJ0xLjDigJ0gLS0+CisKKyAgICA8IS0tIEdsb2JhbCBjb25maWd1cmF0aW9uIERlY2FsYXJhdGlvbiAtLT4KKyAgICA8Z2xvYmFsQ29uZmlndXJhdGlvbiBzcGVha2VyX2RyY19lbmFibGVkPSJmYWxzZSIvPgorCisgICAgPG1vZHVsZXM+CisgICAgICAgIDwhLS0gUHJpbWFyeSBBdWRpbyBIQUwgLS0+CisgICAgICAgIDx4aTppbmNsdWRlIGhyZWY9InByaW1hcnlfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fdHYueG1sIi8+CisKKyAgICAgICAgPCEtLSBVc2IgQXVkaW8gSEFMIC0tPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJ1c2JfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIi8+CisKKyAgICAgICAgPCEtLSBSZW1vdGUgU3VibWl4IEF1ZGlvIEhBTCAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0icl9zdWJtaXhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIi8+CisKKyAgICA8L21vZHVsZXM+CisgICAgPCEtLSBFbmQgb2YgTW9kdWxlcyBzZWN0aW9uIC0tPgorCisgICAgPCEtLSBWb2x1bWUgc2VjdGlvbiAtLT4KKworICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV92b2x1bWVzLnhtbCIvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9ImRlZmF1bHRfdm9sdW1lX3RhYmxlcy54bWwiLz4KKworICAgIDwhLS0gRW5kIG9mIFZvbHVtZSBzZWN0aW9uIC0tPgorCisgICAgPCEtLSBTdXJyb3VuZCBTb3VuZCBjb25maWd1cmF0aW9uIC0tPgorCisgICAgPHhpOmluY2x1ZGUgaHJlZj0ic3Vycm91bmRfc291bmRfY29uZmlndXJhdGlvbl81XzAueG1sIi8+CisKKyAgICA8IS0tIEVuZCBvZiBTdXJyb3VuZCBTb3VuZCBjb25maWd1cmF0aW9uIC0tPgorCis8L2F1ZGlvUG9saWN5Q29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9zdHViLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9zdHViLnhtbAppbmRleCAyNmMzODFmLi44MzUwZWI4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fc3R1Yi54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX3N0dWIueG1sCkBAIC0xNSw2ICsxNSw5IEBACiAtLT4KIAogPGF1ZGlvUG9saWN5Q29uZmlndXJhdGlvbiB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KKyAgICA8IS0tIEdsb2JhbCBjb25maWd1cmF0aW9uIERlY2FsYXJhdGlvbiAtLT4KKyAgICA8Z2xvYmFsQ29uZmlndXJhdGlvbiBzcGVha2VyX2RyY19lbmFibGVkPSJmYWxzZSIvPgorCiAgICAgPG1vZHVsZXM+CiAgICAgICAgIDwhLS0gU3R1YiBBdWRpbyBIQUwgLS0+CiAgICAgICAgIDx4aTppbmNsdWRlIGhyZWY9InN0dWJfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIi8+CkBAIC0yNiw1ICsyOSw2IEBACiAKICAgICA8eGk6aW5jbHVkZSBocmVmPSJhdWRpb19wb2xpY3lfdm9sdW1lcy54bWwiLz4KICAgICA8eGk6aW5jbHVkZSBocmVmPSJkZWZhdWx0X3ZvbHVtZV90YWJsZXMueG1sIi8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ic3Vycm91bmRfc291bmRfY29uZmlndXJhdGlvbl81XzAueG1sIi8+CiAKIDwvYXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2JsdWV0b290aF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYmx1ZXRvb3RoX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTc4ZWIwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2JsdWV0b290aF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKQEAgLTAsMCArMSw0NCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQmx1ZXRvb3RoIEF1ZGlvIEhBTCBBdWRpbyBQb2xpY3kgQ29uZmlndXJhdGlvbiBmaWxlIC0tPgorPG1vZHVsZSBuYW1lPSJibHVldG9vdGgiIGhhbFZlcnNpb249IjIuMCI+CisgICAgPG1peFBvcnRzPgorICAgICAgICA8IS0tIEEyRFAgQXVkaW8gUG9ydHMgLS0+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9ImEyZHAgb3V0cHV0IiByb2xlPSJzb3VyY2UiLz4KKyAgICAgICAgPCEtLSBIZWFyaW5nIEFJRHMgQXVkaW8gUG9ydHMgLS0+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9ImhlYXJpbmcgYWlkIG91dHB1dCIgcm9sZT0ic291cmNlIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjI0MDAwLDE2MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgPC9taXhQb3J0PgorICAgIDwvbWl4UG9ydHM+CisgICAgPGRldmljZVBvcnRzPgorICAgICAgICA8IS0tIEEyRFAgQXVkaW8gUG9ydHMgLS0+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIEEyRFAgT3V0IiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQIiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ0MTAwLDQ4MDAwLDg4MjAwLDk2MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBBMkRQIEhlYWRwaG9uZXMiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUyIgcm9sZT0ic2luayI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0NDEwMCw0ODAwMCw4ODIwMCw5NjAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iQlQgQTJEUCBTcGVha2VyIiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVIiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDQxMDAsNDgwMDAsODgyMDAsOTYwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgIDwhLS0gSGVhcmluZyBBSURzIEF1ZGlvIFBvcnRzIC0tPgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBIZWFyaW5nIEFpZCBPdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQiIHJvbGU9InNpbmsiLz4KKyAgICA8L2RldmljZVBvcnRzPgorICAgIDxyb3V0ZXM+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IkJUIEEyRFAgT3V0IgorICAgICAgICAgICAgICAgc291cmNlcz0iYTJkcCBvdXRwdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQlQgQTJEUCBIZWFkcGhvbmVzIgorICAgICAgICAgICAgICAgc291cmNlcz0iYTJkcCBvdXRwdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQlQgQTJEUCBTcGVha2VyIgorICAgICAgICAgICAgICAgc291cmNlcz0iYTJkcCBvdXRwdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iQlQgSGVhcmluZyBBaWQgT3V0IgorICAgICAgICAgICAgICAgc291cmNlcz0iaGVhcmluZyBhaWQgb3V0cHV0Ii8+CisgICAgPC9yb3V0ZXM+Cis8L21vZHVsZT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9oZWFyaW5nX2FpZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvaGVhcmluZ19haWRfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCmluZGV4IDNjNDhlODguLmU2ZTZiZGIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9oZWFyaW5nX2FpZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2hlYXJpbmdfYWlkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApAQCAtMiw3ICsyLDcgQEAKIDwhLS0gSGVhcmluZyBhaWQgQXVkaW8gSEFMIEF1ZGlvIFBvbGljeSBDb25maWd1cmF0aW9uIGZpbGUgLS0+CiA8bW9kdWxlIG5hbWU9ImhlYXJpbmdfYWlkIiBoYWxWZXJzaW9uPSIyLjAiPgogICAgIDxtaXhQb3J0cz4KLSAgICAgICAgPG1peFBvcnQgbmFtZT0iaGVhcmluZyBhaWQgb3V0cHV0IiByb2xlPSJzb3VyY2UiIGZsYWdzPSJBVURJT19PVVRQVVRfRkxBR19QUklNQVJZIj4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0iaGVhcmluZyBhaWQgb3V0cHV0IiByb2xlPSJzb3VyY2UiPgogICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgogICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iMjQwMDAsMTYwMDAiCiAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL21zZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvbXNkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjE3YmM2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL21zZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKQEAgLTAsMCArMSw3OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE3LTIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSBNdWx0aSBTdHJlYW0gRGVjb2RlciBBdWRpbyBQb2xpY3kgQ29uZmlndXJhdGlvbiBmaWxlIC0tPgorPG1vZHVsZSBuYW1lPSJtc2QiIGhhbFZlcnNpb249IjIuMCI+CisgICAgPGF0dGFjaGVkRGV2aWNlcz4KKyAgICAgICAgPGl0ZW0+TVMxMiBJbnB1dDwvaXRlbT4KKyAgICAgICAgPGl0ZW0+TVMxMiBPdXRwdXQ8L2l0ZW0+CisgICAgPC9hdHRhY2hlZERldmljZXM+CisgICAgPG1peFBvcnRzPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJtczEyIGlucHV0IiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0ibXMxMiBjb21wcmVzc2VkIGlucHV0IiByb2xlPSJzb3VyY2UiCisgICAgICAgICAgICAgICAgZmxhZ3M9IkFVRElPX09VVFBVVF9GTEFHX0RJUkVDVHxBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEfEFVRElPX09VVFBVVF9GTEFHX05PTl9CTE9DS0lORyI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0FDMyIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyxBVURJT19DSEFOTkVMX09VVF81UE9JTlQxIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0VfQUMzIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSIvPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9FX0FDM19KT0MiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyxBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSxBVURJT19DSEFOTkVMX09VVF83UE9JTlQxIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0FDNCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyxBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEiLz4KKyAgICAgICAgPC9taXhQb3J0PgorICAgICAgICA8IS0tIFRoZSBIVyBBViBTeW5jIGZsYWcgaXMgbm90IHJlcXVpcmVkLCBidXQgaXMgcmVjb21tZW5kZWQgLS0+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9Im1zMTIgb3V0cHV0IiByb2xlPSJzaW5rIiBmbGFncz0iQVVESU9fSU5QVVRfRkxBR19IV19BVl9TWU5DIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0FDMyIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fNVBPSU5UMSIvPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9FX0FDMyIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fNVBPSU5UMSIvPgorICAgICAgICA8L21peFBvcnQ+CisgICA8L21peFBvcnRzPgorICAgPGRldmljZVBvcnRzPgorICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9Ik1TMTIgSW5wdXQiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQlVTIiAgcm9sZT0ic2luayI+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfQUMzIgorICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyxBVURJT19DSEFOTkVMX09VVF81UE9JTlQxIi8+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfRV9BQzMiCisgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSIvPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9FX0FDM19KT0MiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyxBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSxBVURJT19DSEFOTkVMX09VVF83UE9JTlQxIi8+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfQUM0IgorICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyxBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEiLz4KKyAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iTVMxMiBPdXRwdXQiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CVVMiICByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICA8L2RldmljZVBvcnRzPgorICAgIDxyb3V0ZXM+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9Ik1TMTIgSW5wdXQiIHNvdXJjZXM9Im1zMTIgaW5wdXQsbXMxMiBjb21wcmVzc2VkIGlucHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9Im1zMTIgb3V0cHV0IiBzb3VyY2VzPSJNUzEyIE91dHB1dCIvPgorICAgIDwvcm91dGVzPgorPC9tb2R1bGU+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvcHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvcHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKaW5kZXggNWI3YWU3Zi4uZWVkYzk2YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3ByaW1hcnlfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9wcmltYXJ5X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApAQCAtMSw1ICsxLDUgQEAKIDw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIERlZmF1bHQgUHJpbWFyeSBBdWRpbyBIQUwgTW9kdWxlIEF1ZGlvIFBvbGljeSBDb25maWd1cmF0aW9uIGluY2x1ZGUgZmxpZSAtLT4KKzwhLS0gRGVmYXVsdCBQcmltYXJ5IEF1ZGlvIEhBTCBNb2R1bGUgQXVkaW8gUG9saWN5IENvbmZpZ3VyYXRpb24gaW5jbHVkZSBmaWxlIC0tPgogPG1vZHVsZSBuYW1lPSJwcmltYXJ5IiBoYWxWZXJzaW9uPSIyLjAiPgogICAgIDxhdHRhY2hlZERldmljZXM+CiAgICAgICAgIDxpdGVtPlNwZWFrZXI8L2l0ZW0+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvcHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl90di54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvcHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl90di54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI2MDE1YQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9wcmltYXJ5X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX3R2LnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBEZWZhdWx0IFByaW1hcnkgQXVkaW8gSEFMIE1vZHVsZSBBdWRpbyBQb2xpY3kgQ29uZmlndXJhdGlvbiBpbmNsdWRlIGZpbGUgZm9yIFRWIC0tPgorPG1vZHVsZSBuYW1lPSJwcmltYXJ5IiBoYWxWZXJzaW9uPSIyLjAiPgorICAgIDxhdHRhY2hlZERldmljZXM+CisgICAgICAgIDxpdGVtPlNwZWFrZXI8L2l0ZW0+CisgICAgPC9hdHRhY2hlZERldmljZXM+CisgICAgPGRlZmF1bHRPdXRwdXREZXZpY2U+U3BlYWtlcjwvZGVmYXVsdE91dHB1dERldmljZT4KKyAgICA8bWl4UG9ydHM+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9InByaW1hcnkgb3V0cHV0IiByb2xlPSJzb3VyY2UiIGZsYWdzPSJBVURJT19PVVRQVVRfRkxBR19QUklNQVJZIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICA8L21peFBvcnQ+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9ImRpcmVjdCIgcm9sZT0ic291cmNlIiBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIiAvPgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJ0dW5uZWwiIHJvbGU9InNvdXJjZSIKKyAgICAgICAgICAgICAgICAgZmxhZ3M9IkFVRElPX09VVFBVVF9GTEFHX0RJUkVDVHxBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DIiAvPgorICAgPC9taXhQb3J0cz4KKyAgIDxkZXZpY2VQb3J0cz4KKyAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iU3BlYWtlciIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9TUEVBS0VSIiByb2xlPSJzaW5rIiAvPgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJPdXQgQXV4IERpZ2l0YWwiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUwiIHJvbGU9InNpbmsiCisgICAgICAgICAgICAgICAgICAgIGVuY29kZWRGb3JtYXRzPSJBVURJT19GT1JNQVRfQUMzIEFVRElPX0ZPUk1BVF9JRUM2MTkzNyIgLz4KKyAgICA8L2RldmljZVBvcnRzPgorICAgIDxyb3V0ZXM+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IlNwZWFrZXIiIHNvdXJjZXM9InByaW1hcnkgb3V0cHV0Ii8+CisgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9Ik91dCBBdXggRGlnaXRhbCIgc291cmNlcz0icHJpbWFyeSBvdXRwdXQsZGlyZWN0LHR1bm5lbCIvPgorICAgIDwvcm91dGVzPgorPC9tb2R1bGU+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvc3Vycm91bmRfc291bmRfY29uZmlndXJhdGlvbl81XzAueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3N1cnJvdW5kX3NvdW5kX2NvbmZpZ3VyYXRpb25fNV8wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTBhMTgxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3N1cnJvdW5kX3NvdW5kX2NvbmZpZ3VyYXRpb25fNV8wLnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8c3Vycm91bmRTb3VuZD4KKyAgPCEtLSBFYWNoIG9mIHRoZSBsaXN0ZWQgZm9ybWF0cyBnZXRzIGFuIGVudHJ5IGluIFN1cnJvdW5kIFNldHRpbmdzIGRpYWxvZyBvbiBUViBkZXZpY2VzLgorICAgICAgIFRoZXJlIG11c3QgYmUgYSBjb3JyZXNwb25kaW5nIEphdmEgRU5DT0RJTkdfLi4uIGNvbnRhbnQgZGVmaW5lZCBpbiBBdWRpb0Zvcm1hdC5qYXZhLAorICAgICAgIGFuZCBhIGRpc3BsYXkgbmFtZSBkZWZpbmVkIGluIEF1ZGlvRm9ybWF0LnRvRGlzcGxheU5hbWUuIEZvciB0aGUgZm9ybWF0cyB0aGF0IGRvbid0CisgICAgICAgbmVlZCBhIGRlZGljYXRlZCBTdXJyb25kIFNldHRpbmdzIGRpYWxvZyBlbnRyeSwgYSBzdWJmb3JtYXRzIGxpc3QgaGFzIHRvIGJlIHVzZWQuIC0tPgorICA8Zm9ybWF0cz4KKyAgICA8Zm9ybWF0IG5hbWU9IkFVRElPX0ZPUk1BVF9BQzMiIC8+CisgICAgPGZvcm1hdCBuYW1lPSJBVURJT19GT1JNQVRfRV9BQzMiIC8+CisgICAgPGZvcm1hdCBuYW1lPSJBVURJT19GT1JNQVRfRV9BQzNfSk9DIiAvPgorICAgIDxmb3JtYXQgbmFtZT0iQVVESU9fRk9STUFUX0RPTEJZX1RSVUVIRCIgLz4KKyAgICA8Zm9ybWF0IG5hbWU9IkFVRElPX0ZPUk1BVF9EVFMiIC8+CisgICAgPGZvcm1hdCBuYW1lPSJBVURJT19GT1JNQVRfRFRTX0hEIiAvPgorICAgIDxmb3JtYXQgbmFtZT0iQVVESU9fRk9STUFUX0FBQ19MQyIgc3ViZm9ybWF0cz0iQVVESU9fRk9STUFUX0FBQ19IRV9WMSBBVURJT19GT1JNQVRfQUFDX0hFX1YyIEFVRElPX0ZPUk1BVF9BQUNfRUxEIEFVRElPX0ZPUk1BVF9BQUNfWEhFIiAvPgorICAgIDxmb3JtYXQgbmFtZT0iQVVESU9fRk9STUFUX0FDNCIgLz4KKyAgPC9mb3JtYXRzPgorPC9zdXJyb3VuZFNvdW5kPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwNzc1YWQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0NyBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJhdWRpb3BvbGljeWVuZ2luZV9jb21tb25faGVhZGVycyIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCit9CisKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGliYXVkaW9wb2xpY3llbmdpbmVfY29tbW9uIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJzcmMvRW5naW5lQmFzZS5jcHAiLAorICAgICAgICAic3JjL1Byb2R1Y3RTdHJhdGVneS5jcHAiLAorICAgICAgICAic3JjL1ZvbHVtZUN1cnZlLmNwcCIsCisgICAgICAgICJzcmMvVm9sdW1lR3JvdXAuY3BwIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAorICAgICAgICAibGliYXVkaW9wb2xpY3ljb21tb24iLAorICAgICAgICAibGliYXVkaW9wb2xpY3llbmdpbmVfY29tbW9uX2hlYWRlcnMiLAorICAgICAgICAibGliYXVkaW9wb2xpY3llbmdpbmVfaW50ZXJmYWNlX2hlYWRlcnMiLAorICAgIF0sCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibGliYXVkaW9wb2xpY3llbmdpbmVfY29tbW9uX2hlYWRlcnMiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cyIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeWVuZ2luZV9jb25maWciLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvRW5naW5lQmFzZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL0VuZ2luZUJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWRjNzhmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL0VuZ2luZUJhc2UuaApAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8RW5naW5lQ29uZmlnLmg+CisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8UHJvZHVjdFN0cmF0ZWd5Lmg+CisjaW5jbHVkZSA8Vm9sdW1lR3JvdXAuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeSB7CisKK2NsYXNzIEVuZ2luZUJhc2UgOiBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlCit7CitwdWJsaWM6CisgICAgLy8vCisgICAgLy8vIGZyb20gQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlCisgICAgLy8vCisgICAgYW5kcm9pZDo6c3RhdHVzX3QgaW5pdENoZWNrKCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHNldE9ic2VydmVyKEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICpvYnNlcnZlcikgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBtb2RlKSBvdmVycmlkZTsKKworICAgIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbVBob25lU3RhdGU7IH0KKworICAgIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpIG92ZXJyaWRlCisgICAgeworICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpIGNvbnN0IG92ZXJyaWRlCisgICAgeworICAgICAgICByZXR1cm4gbUZvcmNlVXNlW3VzYWdlXTsKKyAgICB9CisgICAgYW5kcm9pZDo6c3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IC8qZGV2RGVzYyovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgLypzdGF0ZSovKSBvdmVycmlkZQorICAgIHsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgZ2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcygKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IGdldFN0cmVhbVR5cGVGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgZ2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0IG92ZXJyaWRlOworCisgICAgU3RyZWFtVHlwZVZlY3RvciBnZXRTdHJlYW1UeXBlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3QgcHMpIGNvbnN0IG92ZXJyaWRlOworCisgICAgQXR0cmlidXRlc1ZlY3RvciBnZXRBbGxBdHRyaWJ1dGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBTdHJhdGVneVZlY3RvciBnZXRPcmRlcmVkUHJvZHVjdFN0cmF0ZWdpZXMoKSBjb25zdCBvdmVycmlkZTsKKworICAgIHN0YXR1c190IGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKSBjb25zdCBvdmVycmlkZTsKKworICAgIFZvbHVtZUN1cnZlcyAqZ2V0Vm9sdW1lQ3VydmVzRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0IG92ZXJyaWRlOworCisgICAgVm9sdW1lQ3VydmVzICpnZXRWb2x1bWVDdXJ2ZXNGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdCBvdmVycmlkZTsKKworICAgIElWb2x1bWVDdXJ2ZXMgKmdldFZvbHVtZUN1cnZlc0ZvclZvbHVtZUdyb3VwKHZvbHVtZV9ncm91cF90IGdyb3VwKSBjb25zdCBvdmVycmlkZQorICAgIHsKKyAgICAgICByZXR1cm4gbVZvbHVtZUdyb3Vwcy5maW5kKGdyb3VwKSAhPSBlbmQobVZvbHVtZUdyb3VwcykgPworICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cHMuYXQoZ3JvdXApLT5nZXRWb2x1bWVDdXJ2ZXMoKSA6IG51bGxwdHI7CisgICAgfQorCisgICAgVm9sdW1lR3JvdXBWZWN0b3IgZ2V0Vm9sdW1lR3JvdXBzKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2b2x1bWVfZ3JvdXBfdCBnZXRWb2x1bWVHcm91cEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZvbHVtZV9ncm91cF90IGdldFZvbHVtZUdyb3VwRm9yU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCBsaXN0QXVkaW9Wb2x1bWVHcm91cHMoQXVkaW9Wb2x1bWVHcm91cFZlY3RvciAmZ3JvdXBzKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IG92ZXJyaWRlOworCisKKyAgICBlbmdpbmVDb25maWc6OlBhcnNpbmdSZXN1bHQgbG9hZEF1ZGlvUG9saWN5RW5naW5lQ29uZmlnKCk7CisKKyAgICBjb25zdCBQcm9kdWN0U3RyYXRlZ3lNYXAgJmdldFByb2R1Y3RTdHJhdGVnaWVzKCkgY29uc3QgeyByZXR1cm4gbVByb2R1Y3RTdHJhdGVnaWVzOyB9CisKKyAgICBQcm9kdWN0U3RyYXRlZ3lNYXAgJmdldFByb2R1Y3RTdHJhdGVnaWVzKCkgeyByZXR1cm4gbVByb2R1Y3RTdHJhdGVnaWVzOyB9CisKKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgZ2V0UHJvZHVjdFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdDsKKworICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXRQcm9kdWN0U3RyYXRlZ3lCeU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIGNvbnN0OworCisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKmdldEFwbU9ic2VydmVyKCkgY29uc3QgeyByZXR1cm4gbUFwbU9ic2VydmVyOyB9CisKKyAgICBpbmxpbmUgYm9vbCBpc0luQ2FsbCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gaXNfc3RhdGVfaW5fY2FsbChnZXRQaG9uZVN0YXRlKCkpOworICAgIH0KKworICAgIFZvbHVtZVNvdXJjZSB0b1ZvbHVtZVNvdXJjZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxWb2x1bWVTb3VyY2U+KGdldFZvbHVtZUdyb3VwRm9yU3RyZWFtVHlwZShzdHJlYW0pKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzd2l0Y2hWb2x1bWVDdXJ2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVNyYywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1Ec3QpOworCisgICAgc3RhdHVzX3QgcmVzdG9yZU9yaWdpblZvbHVtZUN1cnZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKKworIHByaXZhdGU6CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm1BcG1PYnNlcnZlciA9IG51bGxwdHI7CisKKyAgICBQcm9kdWN0U3RyYXRlZ3lNYXAgbVByb2R1Y3RTdHJhdGVnaWVzOworICAgIFZvbHVtZUdyb3VwTWFwIG1Wb2x1bWVHcm91cHM7CisgICAgYXVkaW9fbW9kZV90IG1QaG9uZVN0YXRlID0gQVVESU9fTU9ERV9OT1JNQUw7ICAvKio8IGN1cnJlbnQgcGhvbmUgc3RhdGUuICovCisKKyAgICAvKiogY3VycmVudCBmb3JjZWQgdXNlIGNvbmZpZ3VyYXRpb24uICovCisgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlRdID0ge307Cit9OworCit9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9Qcm9kdWN0U3RyYXRlZ3kuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9Qcm9kdWN0U3RyYXRlZ3kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTJhMTk4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL1Byb2R1Y3RTdHJhdGVneS5oCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJWb2x1bWVHcm91cC5oIgorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPEhhbmRsZUdlbmVyYXRvci5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIEBicmllZiBUaGUgUHJvZHVjdFN0cmF0ZWd5IGNsYXNzIGRlc2NyaWJlcyBmb3IgZWFjaCBwcm9kdWN0X3N0cmF0ZWd5X3QgaWRlbnRpZmllciB0aGUKKyAqIGFzc29jaWF0ZWQgYXVkaW8gYXR0cmlidXRlcywgdGhlIGRldmljZSB0eXBlcyB0byB1c2UsIHRoZSBkZXZpY2UgYWRkcmVzcyB0byB1c2UuCisgKiBUaGUgaWRlbnRpZmllciBpcyB2b2x1bnRhcmlseSBub3Qgc3Ryb25nbHkgdHlwZWQgaW4gb3JkZXIgdG8gYmUgZXh0ZW5zaWJsZSBieSBPRU0uCisgKi8KK2NsYXNzIFByb2R1Y3RTdHJhdGVneSA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UsIHByaXZhdGUgSGFuZGxlR2VuZXJhdG9yPHVpbnQzMl90PgoreworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgQXVkaW9BdHRyaWJ1dGVzIHsKKyAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7CisgICAgICAgIHZvbHVtZV9ncm91cF90IG1Wb2x1bWVHcm91cCA9IFZPTFVNRV9HUk9VUF9OT05FOworICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgbUF0dHJpYnV0ZXMgPSBBVURJT19BVFRSSUJVVEVTX0lOSVRJQUxJWkVSOworICAgIH07CisKKyAgICB1c2luZyBBdWRpb0F0dHJpYnV0ZXNWZWN0b3IgPSBzdGQ6OnZlY3RvcjxBdWRpb0F0dHJpYnV0ZXM+OworCitwdWJsaWM6CisgICAgUHJvZHVjdFN0cmF0ZWd5KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKTsKKworICAgIHZvaWQgYWRkQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmF1ZGlvQXR0cmlidXRlcyk7CisKKyAgICBzdGQ6OnZlY3RvcjxhbmRyb2lkOjpBdWRpb0F0dHJpYnV0ZXM+IGxpc3RBdWRpb0F0dHJpYnV0ZXMoKSBjb25zdDsKKworICAgIHN0ZDo6c3RyaW5nIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQorICAgIEF0dHJpYnV0ZXNWZWN0b3IgZ2V0QXVkaW9BdHRyaWJ1dGVzKCkgY29uc3Q7CisgICAgcHJvZHVjdF9zdHJhdGVneV90IGdldElkKCkgY29uc3QgeyByZXR1cm4gbUlkOyB9CisgICAgU3RyZWFtVHlwZVZlY3RvciBnZXRTdXBwb3J0ZWRTdHJlYW1zKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgbWF0Y2hlcyBjaGVja3MgaWYgdGhlIGdpdmVuIGF1ZGlvIGF0dHJpYnV0ZXMgc2hhbGwgZm9sbG93IHRoZSBzdHJhdGVneS4KKyAgICAgKiAgICAgICAgT3JkZXIgb2YgdGhlIGF0dHJpYnV0ZXMgd2l0aGluIGEgc3RyYXRlZ3kgbWF0dGVycy4KKyAgICAgKiAgICAgICAgSWYgb25seSB0aGUgdXNhZ2UgaXMgYXZhaWxhYmxlLCB0aGUgY2hlY2sgaXMgcGVyZm9ybWVkIG9uIHRoZSB1c2FnZXMgb2YgdGhlIGdpdmVuCisgICAgICogICAgICAgIGF0dHJpYnV0ZXMsIG90aGVyd2lzZSBhbGwgZmllbGRzIG11c3QgbWF0Y2guCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgdG8gY29uc2lkZXIKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYXR0cmlidXRlcyBtYXRjaGVzIHdpdGggdGhlIHN0cmF0ZWd5LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbCBtYXRjaGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzKSBjb25zdDsKKworICAgIGJvb2wgc3VwcG9ydFN0cmVhbVR5cGUoY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmc3RyZWFtVHlwZSkgY29uc3Q7CisKKyAgICB2b2lkIHNldERldmljZUFkZHJlc3MoY29uc3Qgc3RkOjpzdHJpbmcgJmFkZHJlc3MpCisgICAgeworICAgICAgICBtRGV2aWNlQWRkcmVzcyA9IGFkZHJlc3M7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgZ2V0RGV2aWNlQWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VBZGRyZXNzOyB9CisKKyAgICB2b2lkIHNldERldmljZVR5cGVzKGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKQorICAgIHsKKyAgICAgICAgbUFwcGxpY2FibGVEZXZpY2VzID0gZGV2aWNlczsKKyAgICB9CisKKyAgICBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlVHlwZXMoKSBjb25zdCB7IHJldHVybiBtQXBwbGljYWJsZURldmljZXM7IH0KKworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBnZXRBdHRyaWJ1dGVzRm9yU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3Q7CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRTdHJlYW1UeXBlRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0OworCisgICAgdm9sdW1lX2dyb3VwX3QgZ2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3Q7CisKKyAgICB2b2x1bWVfZ3JvdXBfdCBnZXRWb2x1bWVHcm91cEZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0OworCisgICAgdm9sdW1lX2dyb3VwX3QgZ2V0RGVmYXVsdFZvbHVtZUdyb3VwKCkgY29uc3Q7CisKKyAgICBib29sIGlzRGVmYXVsdCgpIGNvbnN0OworCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcyA9IDApIGNvbnN0OworCitwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nIG1OYW1lOworCisgICAgQXVkaW9BdHRyaWJ1dGVzVmVjdG9yIG1BdHRyaWJ1dGVzVmVjdG9yOworCisgICAgcHJvZHVjdF9zdHJhdGVneV90IG1JZDsKKworICAgIHN0ZDo6c3RyaW5nIG1EZXZpY2VBZGRyZXNzOyAvKio8IERldmljZSBhZGRyZXNzIGFwcGxpY2FibGUgZm9yIHRoaXMgc3RyYXRlZ3ksIG1heWJlIGVtcHR5ICovCisKKyAgICAvKioKKyAgICAgKiBBcHBsaWNhYmxlIGRldmljZShzKSB0eXBlIG1hc2sgZm9yIHRoaXMgc3RyYXRlZ3kuCisgICAgICovCisgICAgYXVkaW9fZGV2aWNlc190IG1BcHBsaWNhYmxlRGV2aWNlcyA9IEFVRElPX0RFVklDRV9OT05FOworfTsKKworY2xhc3MgUHJvZHVjdFN0cmF0ZWd5TWFwIDogcHVibGljIHN0ZDo6bWFwPHByb2R1Y3Rfc3RyYXRlZ3lfdCwgc3A8UHJvZHVjdFN0cmF0ZWd5PiA+Cit7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQGJyaWVmIGluaXRpYWxpemU6IHNldCBkZWZhdWx0IHByb2R1Y3Qgc3RyYXRlZ3kgaW4gY2FjaGUuCisgICAgICovCisgICAgdm9pZCBpbml0aWFsaXplKCk7CisgICAgLyoqCisgICAgICogQGJyaWVmIGdldFByb2R1Y3RTdHJhdGVneUZvckF0dHJpYnV0ZS4gVGhlIG9yZGVyIG9mIHRoZSB2ZWN0b3IgaXMgZGltZW5zaW9ubmluZy4KKyAgICAgKiBAcGFyYW0gYXR0cgorICAgICAqIEByZXR1cm4gYXBwbGljYWJsZSBwcm9kdWN0IHN0cmF0ZWd5IGZvciB0aGUgZ2l2ZW4gYXR0cmlidXRlLCBkZWZhdWx0IGlmIG5vbmUgYXBwbGljYWJsZS4KKyAgICAgKi8KKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgZ2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0OworCisgICAgcHJvZHVjdF9zdHJhdGVneV90IGdldFByb2R1Y3RTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3Q7CisKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgZ2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0OworCisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRTdHJlYW1UeXBlRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldEF0dHJpYnV0ZXNGb3JQcm9kdWN0U3RyYXRlZ3kgY2FuIGJlIGNhbGxlZCBmcm9tCisgICAgICogICAgICAgIEF1ZGlvTWFuYWdlcjogaW4gdGhpcyBjYXNlLCB0aGUgcHJvZHVjdCBzdHJhdGVneSBJUyB0aGUgZm9ybWVyIHJvdXRpbmcgc3RyYXRlZ3kKKyAgICAgKiAgICAgICAgQ2FyQXVkaW9NYW5hZ2VyOiBpbiB0aGlzIGNhc2UsIHRoZSBwcm9kdWN0IHN0cmF0ZWd5IElTIHRoZSBjYXIgdXNhZ2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBbZ2V0QXVkaW9BdHRyaWJ1dGVzRm9yQ2FyVXNhZ2VdCisgICAgICogICAgICAgIE9lbUV4dGVuc2lvbjogaW4gdGhpcyBjYXNlLCB0aGUgcHJvZHVjdCBzdHJhdGVneSBJUyB0aGUgT2VtIHVzYWdlCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyYXRlZ3kKKyAgICAgKiBAcmV0dXJuIGF1ZGlvIGF0dHJpYnV0ZXMgKG9yIGF0IGxlYXN0IG9uZSBvZiB0aGUgYXR0cmlidXRlcykgZm9sbG93aW5nIHRoZSBnaXZlbiBzdHJhdGVneS4KKyAgICAgKi8KKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgZ2V0QXR0cmlidXRlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpIGNvbnN0OworCisgICAgYXVkaW9fZGV2aWNlc190IGdldERldmljZVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSkgY29uc3Q7CisKKyAgICBzdGQ6OnN0cmluZyBnZXREZXZpY2VBZGRyZXNzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSkgY29uc3Q7CisKKyAgICB2b2x1bWVfZ3JvdXBfdCBnZXRWb2x1bWVHcm91cEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdDsKKworICAgIHZvbHVtZV9ncm91cF90IGdldFZvbHVtZUdyb3VwRm9yU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3Q7CisKKyAgICB2b2x1bWVfZ3JvdXBfdCBnZXREZWZhdWx0Vm9sdW1lR3JvdXAoKSBjb25zdDsKKworICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXREZWZhdWx0KCkgY29uc3Q7CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzID0gMCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgcHJvZHVjdF9zdHJhdGVneV90IG1EZWZhdWx0U3RyYXRlZ3kgPSBQUk9EVUNUX1NUUkFURUdZX05PTkU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvVm9sdW1lQ3VydmUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9Wb2x1bWVDdXJ2ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0MzE0ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvVm9sdW1lQ3VydmUuaApAQCAtMCwwICsxLDE5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSAiSVZvbHVtZUN1cnZlcy5oIgorI2luY2x1ZGUgPHBvbGljeS5oPgorI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxIYW5kbGVHZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDdXJ2ZVBvaW50Cit7CisgICAgQ3VydmVQb2ludCgpIHt9CisgICAgQ3VydmVQb2ludChpbnQgaW5kZXgsIGludCBhdHRlbnVhdGlvbkluTWIpIDoKKyAgICAgICAgbUluZGV4KGluZGV4KSwgbUF0dGVudWF0aW9uSW5NYihhdHRlbnVhdGlvbkluTWIpIHt9CisgICAgdWludDMyX3QgbUluZGV4OworICAgIGludCBtQXR0ZW51YXRpb25Jbk1iOworfTsKKworaW5saW5lIGJvb2wgb3BlcmF0b3I8IChjb25zdCBDdXJ2ZVBvaW50ICZsaHMsIGNvbnN0IEN1cnZlUG9pbnQgJnJocykKK3sKKyAgICByZXR1cm4gbGhzLm1JbmRleCA8IHJocy5tSW5kZXg7Cit9CisKKy8vIEEgdm9sdW1lIGN1cnZlIGZvciBhIGdpdmVuIHVzZSBjYXNlIGFuZCBkZXZpY2UgY2F0ZWdvcnkKKy8vIEl0IGNvbnRhaW5zIG9mIGxpc3Qgb2YgcG9pbnRzIG9mIHRoaXMgY3VydmUgZXhwcmVzc2luZyB0aGUgYXR0ZW51YXRpb24gaW4gTWlsbGliZWxzIGZvcgorLy8gYSBnaXZlbiB2b2x1bWUgaW5kZXggZnJvbSAwIHRvIDEwMAorY2xhc3MgVm9sdW1lQ3VydmUgOiBwdWJsaWMgUmVmQmFzZQoreworcHVibGljOgorICAgIFZvbHVtZUN1cnZlKGRldmljZV9jYXRlZ29yeSBkZXZpY2UpIDogbURldmljZUNhdGVnb3J5KGRldmljZSkge30KKworICAgIHZvaWQgYWRkKGNvbnN0IEN1cnZlUG9pbnQgJnBvaW50KSB7IG1DdXJ2ZVBvaW50cy5hZGQocG9pbnQpOyB9CisKKyAgICBmbG9hdCB2b2xJbmRleFRvRGIoaW50IGluZGV4SW5VaSwgaW50IHZvbEluZGV4TWluLCBpbnQgdm9sSW5kZXhNYXgpIGNvbnN0OworCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcyA9IDAsIGJvb2wgY3VydmVQb2ludHMgPSBmYWxzZSkgY29uc3Q7CisKKyAgICBkZXZpY2VfY2F0ZWdvcnkgZ2V0RGV2aWNlQ2F0ZWdvcnkoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlQ2F0ZWdvcnk7IH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBkZXZpY2VfY2F0ZWdvcnkgbURldmljZUNhdGVnb3J5OworICAgIFNvcnRlZFZlY3RvcjxDdXJ2ZVBvaW50PiBtQ3VydmVQb2ludHM7Cit9OworCisvLyBWb2x1bWUgQ3VydmVzIGZvciBhIGdpdmVuIHVzZSBjYXNlIGluZGV4ZWQgYnkgZGV2aWNlIGNhdGVnb3J5CitjbGFzcyBWb2x1bWVDdXJ2ZXMgOiBwdWJsaWMgS2V5ZWRWZWN0b3I8ZGV2aWNlX2NhdGVnb3J5LCBzcDxWb2x1bWVDdXJ2ZT4gPiwKKyAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJVm9sdW1lQ3VydmVzCit7CitwdWJsaWM6CisgICAgVm9sdW1lQ3VydmVzKGludCBpbmRleE1pbiA9IDAsIGludCBpbmRleE1heCA9IDEwMCkgOgorICAgICAgICBtSW5kZXhNaW4oaW5kZXhNaW4pLCBtSW5kZXhNYXgoaW5kZXhNYXgpCisgICAgeworICAgICAgICBhZGRDdXJyZW50Vm9sdW1lSW5kZXgoQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUsIDApOworICAgIH0KKyAgICBzdGF0dXNfdCBpbml0Vm9sdW1lKGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KSBvdmVycmlkZQorICAgIHsKKyAgICAgICAgbUluZGV4TWluID0gaW5kZXhNaW47CisgICAgICAgIG1JbmRleE1heCA9IGluZGV4TWF4OworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgc3A8Vm9sdW1lQ3VydmU+IGdldEN1cnZlc0ZvcihkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKGluZGV4T2ZLZXkoZGV2aWNlKSA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZUZvcihkZXZpY2UpOworICAgIH0KKworICAgIHZpcnR1YWwgaW50IGdldFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0CisgICAgeworICAgICAgICBkZXZpY2UgPSBWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShkZXZpY2UpOworICAgICAgICAvLyB0aGVyZSBpcyBhbHdheXMgYSB2YWxpZCBlbnRyeSBmb3IgQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUKKyAgICAgICAgaWYgKG1JbmRleEN1ci5maW5kKGRldmljZSkgPT0gZW5kKG1JbmRleEN1cikpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtSW5kZXhDdXIuYXQoZGV2aWNlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgY2FuQmVNdXRlZCgpIGNvbnN0IHsgcmV0dXJuIG1DYW5CZU11dGVkOyB9CisgICAgdmlydHVhbCB2b2lkIGNsZWFyQ3VycmVudFZvbHVtZUluZGV4KCkgeyBtSW5kZXhDdXIuY2xlYXIoKTsgfQorICAgIHZvaWQgYWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBpbmRleCkgb3ZlcnJpZGUKKyAgICB7CisgICAgICAgIG1JbmRleEN1cltkZXZpY2VdID0gaW5kZXg7CisgICAgfQorCisgICAgaW50IGdldFZvbHVtZUluZGV4TWluKCkgY29uc3QgeyByZXR1cm4gbUluZGV4TWluOyB9CisKKyAgICBpbnQgZ2V0Vm9sdW1lSW5kZXhNYXgoKSBjb25zdCB7IHJldHVybiBtSW5kZXhNYXg7IH0KKworICAgIGJvb2wgaGFzVm9sdW1lSW5kZXhGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKKyAgICB7CisgICAgICAgIGRldmljZSA9IFZvbHVtZTo6Z2V0RGV2aWNlRm9yVm9sdW1lKGRldmljZSk7CisgICAgICAgIHJldHVybiBtSW5kZXhDdXIuZmluZChkZXZpY2UpICE9IGVuZChtSW5kZXhDdXIpOworICAgIH0KKworICAgIHN0YXR1c190IHN3aXRjaEN1cnZlc0Zyb20oY29uc3QgVm9sdW1lQ3VydmVzICZyZWZlcmVuY2VDdXJ2ZXMpCisgICAgeworICAgICAgICBpZiAoc2l6ZSgpICE9IHJlZmVyZW5jZUN1cnZlcy5zaXplKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyEgZGV2aWNlIGNhdGVnb3J5IG5vdCBhbGlnbmVkLCBjYW5ub3Qgc3dpdGNoIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVFlQRTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgc2l6ZSgpOyBpbmRleCsrKSB7CisgICAgICAgICAgICBkZXZpY2VfY2F0ZWdvcnkgY2F0ID0ga2V5QXQoaW5kZXgpOworICAgICAgICAgICAgc2V0Vm9sdW1lQ3VydmUoY2F0LCByZWZlcmVuY2VDdXJ2ZXMuZ2V0T3JpZ2luVm9sdW1lQ3VydmUoY2F0KSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICBzdGF0dXNfdCByZXN0b3JlT3JpZ2luVm9sdW1lQ3VydmUoKQorICAgIHsKKyAgICAgICAgcmV0dXJuIHN3aXRjaEN1cnZlc0Zyb20oKnRoaXMpOworICAgIH0KKworICAgIGNvbnN0IHNwPFZvbHVtZUN1cnZlPiBnZXRPcmlnaW5Wb2x1bWVDdXJ2ZShkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnkpIGNvbnN0CisgICAgeworICAgICAgICBBTE9HX0FTU0VSVChtT3JpZ2luVm9sdW1lQ3VydmVzLmluZGV4T2ZLZXkoZGV2aWNlQ2F0ZWdvcnkpID49IDAsICJJbnZhbGlkIGRldmljZSBjYXRlZ29yeSIpOworICAgICAgICByZXR1cm4gbU9yaWdpblZvbHVtZUN1cnZlcy52YWx1ZUZvcihkZXZpY2VDYXRlZ29yeSk7CisgICAgfQorICAgIHZvaWQgc2V0Vm9sdW1lQ3VydmUoZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LCBjb25zdCBzcDxWb2x1bWVDdXJ2ZT4gJnZvbHVtZUN1cnZlKQorICAgIHsKKyAgICAgICAgQUxPR19BU1NFUlQoaW5kZXhPZktleShkZXZpY2VDYXRlZ29yeSkgPj0gMCwgIkludmFsaWQgZGV2aWNlIGNhdGVnb3J5IGZvciBWb2x1bWUgQ3VydmUiKTsKKyAgICAgICAgcmVwbGFjZVZhbHVlRm9yKGRldmljZUNhdGVnb3J5LCB2b2x1bWVDdXJ2ZSk7CisgICAgfQorCisgICAgc3NpemVfdCBhZGQoY29uc3Qgc3A8Vm9sdW1lQ3VydmU+ICZ2b2x1bWVDdXJ2ZSkKKyAgICB7CisgICAgICAgIGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSA9IHZvbHVtZUN1cnZlLT5nZXREZXZpY2VDYXRlZ29yeSgpOworICAgICAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShkZXZpY2VDYXRlZ29yeSk7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIC8vIEtlZXAgdHJhY2sgb2Ygb3JpZ2luYWwgVm9sdW1lIEN1cnZlcyBwZXIgZGV2aWNlIGNhdGVnb3J5IGluIG9yZGVyIHRvIHN3aXRjaCBjdXJ2ZXMuCisgICAgICAgICAgICBtT3JpZ2luVm9sdW1lQ3VydmVzLmFkZChkZXZpY2VDYXRlZ29yeSwgdm9sdW1lQ3VydmUpOworICAgICAgICAgICAgcmV0dXJuIEtleWVkVmVjdG9yOjphZGQoZGV2aWNlQ2F0ZWdvcnksIHZvbHVtZUN1cnZlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgfQorCisgICAgdmlydHVhbCBmbG9hdCB2b2xJbmRleFRvRGIoZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdCwgaW50IGluZGV4SW5VaSkgY29uc3QKKyAgICB7CisgICAgICAgIHNwPFZvbHVtZUN1cnZlPiB2YyA9IGdldEN1cnZlc0ZvcihkZXZpY2VDYXQpOworICAgICAgICBpZiAodmMgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIHZjLT52b2xJbmRleFRvRGIoaW5kZXhJblVpLCBtSW5kZXhNaW4sIG1JbmRleE1heCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBkZXZpY2UgY2F0ZWdvcnkgJWQgZm9yIFZvbHVtZSBDdXJ2ZSIsIGRldmljZUNhdCk7CisgICAgICAgICAgICByZXR1cm4gMC4wZjsKKyAgICAgICAgfQorICAgIH0KKyAgICB2b2lkIGFkZEF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKQorICAgIHsKKyAgICAgICAgbUF0dHJpYnV0ZXMucHVzaF9iYWNrKGF0dHIpOworICAgIH0KKyAgICBBdHRyaWJ1dGVzVmVjdG9yIGdldEF0dHJpYnV0ZXMoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtQXR0cmlidXRlczsgfQorICAgIHZvaWQgYWRkU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKKyAgICB7CisgICAgICAgIG1TdHJlYW1zLnB1c2hfYmFjayhzdHJlYW0pOworICAgIH0KKyAgICBTdHJlYW1UeXBlVmVjdG9yIGdldFN0cmVhbVR5cGVzKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbVN0cmVhbXM7IH0KKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMgPSAwLCBib29sIGN1cnZlUG9pbnRzID0gZmFsc2UpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIEtleWVkVmVjdG9yPGRldmljZV9jYXRlZ29yeSwgc3A8Vm9sdW1lQ3VydmU+ID4gbU9yaWdpblZvbHVtZUN1cnZlczsKKyAgICBzdGQ6Om1hcDxhdWRpb19kZXZpY2VzX3QsIGludD4gbUluZGV4Q3VyOyAvKio8IGN1cnJlbnQgdm9sdW1lIGluZGV4IHBlciBkZXZpY2UuICovCisgICAgaW50IG1JbmRleE1pbjsgLyoqPCBtaW4gdm9sdW1lIGluZGV4LiAqLworICAgIGludCBtSW5kZXhNYXg7IC8qKjwgbWF4IHZvbHVtZSBpbmRleC4gKi8KKyAgICBjb25zdCBib29sIG1DYW5CZU11dGVkID0gdHJ1ZTsgLyoqPCB0cnVlIGlzIHRoZSBzdHJlYW0gY2FuIGJlIG11dGVkLiAqLworCisgICAgQXR0cmlidXRlc1ZlY3RvciBtQXR0cmlidXRlczsKKyAgICBTdHJlYW1UeXBlVmVjdG9yIG1TdHJlYW1zOyAvKio8IEtlZXAgaXQgZm9yIGxlZ2FjeS4gKi8KK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9Wb2x1bWVHcm91cC5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL1ZvbHVtZUdyb3VwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM0YjQwNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9Wb2x1bWVHcm91cC5oCkBAIC0wLDAgKzEsNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZS5oPgorI2luY2x1ZGUgPFZvbHVtZUN1cnZlLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPEhhbmRsZUdlbmVyYXRvci5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFZvbHVtZUdyb3VwIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSwgcHJpdmF0ZSBIYW5kbGVHZW5lcmF0b3I8dWludDMyX3Q+Cit7CitwdWJsaWM6CisgICAgVm9sdW1lR3JvdXAoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KTsKKyAgICBzdGQ6OnN0cmluZyBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KKyAgICB2b2x1bWVfZ3JvdXBfdCBnZXRJZCgpIGNvbnN0IHsgcmV0dXJuIG1JZDsgfQorCisgICAgdm9pZCBhZGQoY29uc3Qgc3A8Vm9sdW1lQ3VydmU+ICZjdXJ2ZSk7CisKKyAgICBWb2x1bWVDdXJ2ZXMgKmdldFZvbHVtZUN1cnZlcygpIHsgcmV0dXJuICZtR3JvdXBWb2x1bWVDdXJ2ZXM7IH0KKworICAgIHZvaWQgYWRkU3VwcG9ydGVkQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpOworICAgIEF0dHJpYnV0ZXNWZWN0b3IgZ2V0U3VwcG9ydGVkQXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIG1Hcm91cFZvbHVtZUN1cnZlcy5nZXRBdHRyaWJ1dGVzKCk7IH0KKworICAgIHZvaWQgYWRkU3VwcG9ydGVkU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKKyAgICBTdHJlYW1UeXBlVmVjdG9yIGdldFN0cmVhbVR5cGVzKCkgY29uc3QgeyByZXR1cm4gbUdyb3VwVm9sdW1lQ3VydmVzLmdldFN0cmVhbVR5cGVzKCk7IH0KKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMgPSAwKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBtTmFtZTsKKyAgICBjb25zdCB2b2x1bWVfZ3JvdXBfdCBtSWQ7CisgICAgVm9sdW1lQ3VydmVzIG1Hcm91cFZvbHVtZUN1cnZlczsKK307CisKK2NsYXNzIFZvbHVtZUdyb3VwTWFwIDogcHVibGljIHN0ZDo6bWFwPHZvbHVtZV9ncm91cF90LCBzcDxWb2x1bWVHcm91cD4gPgoreworcHVibGljOgorICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMgPSAwKSBjb25zdDsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0VuZ2luZUJhc2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvRW5naW5lQmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdhN2U2NQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0VuZ2luZUJhc2UuY3BwCkBAIC0wLDAgKzEsMjgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvUG9saWN5RW5naW5lL0Jhc2UiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlICJFbmdpbmVCYXNlLmgiCisjaW5jbHVkZSAiRW5naW5lRGVmYXVsdENvbmZpZy5oIgorI2luY2x1ZGUgPFR5cGVDb252ZXJ0ZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeSB7CisKK3ZvaWQgRW5naW5lQmFzZTo6c2V0T2JzZXJ2ZXIoQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm9ic2VydmVyKQoreworICAgIEFMT0dfQVNTRVJUKG9ic2VydmVyICE9IE5VTEwsICJJbnZhbGlkIEF1ZGlvIFBvbGljeSBNYW5hZ2VyIG9ic2VydmVyIik7CisgICAgbUFwbU9ic2VydmVyID0gb2JzZXJ2ZXI7Cit9CisKK3N0YXR1c190IEVuZ2luZUJhc2U6OmluaXRDaGVjaygpCit7CisgICAgcmV0dXJuIChtQXBtT2JzZXJ2ZXIgIT0gbnVsbHB0cik/IE5PX0VSUk9SIDogTk9fSU5JVDsKK30KKworc3RhdHVzX3QgRW5naW5lQmFzZTo6c2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpCit7CisgICAgQUxPR1YoInNldFBob25lU3RhdGUoKSBzdGF0ZSAlZCIsIHN0YXRlKTsKKworICAgIGlmIChzdGF0ZSA8IDAgfHwgc3RhdGUgPj0gQVVESU9fTU9ERV9DTlQpIHsKKyAgICAgICAgQUxPR1coInNldFBob25lU3RhdGUoKSBpbnZhbGlkIHN0YXRlICVkIiwgc3RhdGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChzdGF0ZSA9PSBtUGhvbmVTdGF0ZSApIHsKKyAgICAgICAgQUxPR1coInNldFBob25lU3RhdGUoKSBzZXR0aW5nIHNhbWUgc3RhdGUgJWQiLCBzdGF0ZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gc3RvcmUgcHJldmlvdXMgcGhvbmUgc3RhdGUgZm9yIG1hbmFnZW1lbnQgb2Ygc29uaWZpY2F0aW9uIHN0cmF0ZWd5IGJlbG93CisgICAgaW50IG9sZFN0YXRlID0gbVBob25lU3RhdGU7CisgICAgbVBob25lU3RhdGUgPSBzdGF0ZTsKKworICAgIGlmICghaXNfc3RhdGVfaW5fY2FsbChvbGRTdGF0ZSkgJiYgaXNfc3RhdGVfaW5fY2FsbChzdGF0ZSkpIHsKKyAgICAgICAgQUxPR1YoIiAgRW50ZXJpbmcgY2FsbCBpbiBzZXRQaG9uZVN0YXRlKCkiKTsKKyAgICAgICAgc3dpdGNoVm9sdW1lQ3VydmUoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsIEFVRElPX1NUUkVBTV9EVE1GKTsKKyAgICB9IGVsc2UgaWYgKGlzX3N0YXRlX2luX2NhbGwob2xkU3RhdGUpICYmICFpc19zdGF0ZV9pbl9jYWxsKHN0YXRlKSkgeworICAgICAgICBBTE9HVigiICBFeGl0aW5nIGNhbGwgaW4gc2V0UGhvbmVTdGF0ZSgpIik7CisgICAgICAgIHJlc3RvcmVPcmlnaW5Wb2x1bWVDdXJ2ZShBVURJT19TVFJFQU1fRFRNRik7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworcHJvZHVjdF9zdHJhdGVneV90IEVuZ2luZUJhc2U6OmdldFByb2R1Y3RTdHJhdGVneUZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdAoreworICAgIHJldHVybiBtUHJvZHVjdFN0cmF0ZWdpZXMuZ2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhhdHRyKTsKK30KKworYXVkaW9fc3RyZWFtX3R5cGVfdCBFbmdpbmVCYXNlOjpnZXRTdHJlYW1UeXBlRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1Qcm9kdWN0U3RyYXRlZ2llcy5nZXRTdHJlYW1UeXBlRm9yQXR0cmlidXRlcyhhdHRyKTsKK30KKworYXVkaW9fYXR0cmlidXRlc190IEVuZ2luZUJhc2U6OmdldEF0dHJpYnV0ZXNGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAoreworICAgIHJldHVybiBtUHJvZHVjdFN0cmF0ZWdpZXMuZ2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoc3RyZWFtKTsKK30KKworcHJvZHVjdF9zdHJhdGVneV90IEVuZ2luZUJhc2U6OmdldFByb2R1Y3RTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKK3sKKyAgICByZXR1cm4gbVByb2R1Y3RTdHJhdGVnaWVzLmdldFByb2R1Y3RTdHJhdGVneUZvclN0cmVhbShzdHJlYW0pOworfQorCitwcm9kdWN0X3N0cmF0ZWd5X3QgRW5naW5lQmFzZTo6Z2V0UHJvZHVjdFN0cmF0ZWd5QnlOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSBjb25zdAoreworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6IG1Qcm9kdWN0U3RyYXRlZ2llcykgeworICAgICAgICBpZiAoaXRlci5zZWNvbmQtPmdldE5hbWUoKSA9PSBuYW1lKSB7CisgICAgICAgICAgICByZXR1cm4gaXRlci5zZWNvbmQtPmdldElkKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFBST0RVQ1RfU1RSQVRFR1lfTk9ORTsKK30KKworZW5naW5lQ29uZmlnOjpQYXJzaW5nUmVzdWx0IEVuZ2luZUJhc2U6OmxvYWRBdWRpb1BvbGljeUVuZ2luZUNvbmZpZygpCit7CisgICAgYXV0byBsb2FkUHJvZHVjdFN0cmF0ZWdpZXMgPQorICAgICAgICAgICAgW10oYXV0byYgc3RyYXRlZ3lDb25maWdzLCBhdXRvJiBwcm9kdWN0U3RyYXRlZ2llcywgYXV0byYgdm9sdW1lR3JvdXBzKSB7CisgICAgICAgIGZvciAoYXV0byYgc3RyYXRlZ3lDb25maWcgOiBzdHJhdGVneUNvbmZpZ3MpIHsKKyAgICAgICAgICAgIHNwPFByb2R1Y3RTdHJhdGVneT4gc3RyYXRlZ3kgPSBuZXcgUHJvZHVjdFN0cmF0ZWd5KHN0cmF0ZWd5Q29uZmlnLm5hbWUpOworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZncm91cCA6IHN0cmF0ZWd5Q29uZmlnLmF0dHJpYnV0ZXNHcm91cHMpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvICZpdGVyID0gc3RkOjpmaW5kX2lmKGJlZ2luKHZvbHVtZUdyb3VwcyksIGVuZCh2b2x1bWVHcm91cHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJmdyb3VwXShjb25zdCBhdXRvICZ2b2x1bWVHcm91cCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdyb3VwLnZvbHVtZUdyb3VwID09IHZvbHVtZUdyb3VwLnNlY29uZC0+Z2V0TmFtZSgpOyB9KTsKKyAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChpdGVyICE9IGVuZCh2b2x1bWVHcm91cHMpLCAiSW52YWxpZCBWb2x1bWUgR3JvdXAgTmFtZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAudm9sdW1lR3JvdXAuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgaWYgKGdyb3VwLnN0cmVhbSAhPSBBVURJT19TVFJFQU1fREVGQVVMVCkgeworICAgICAgICAgICAgICAgICAgICBpdGVyLT5zZWNvbmQtPmFkZFN1cHBvcnRlZFN0cmVhbShncm91cC5zdHJlYW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmF0dHIgOiBncm91cC5hdHRyaWJ1dGVzVmVjdCkgeworICAgICAgICAgICAgICAgICAgICBzdHJhdGVneS0+YWRkQXR0cmlidXRlcyh7Z3JvdXAuc3RyZWFtLCBpdGVyLT5zZWNvbmQtPmdldElkKCksIGF0dHJ9KTsKKyAgICAgICAgICAgICAgICAgICAgaXRlci0+c2Vjb25kLT5hZGRTdXBwb3J0ZWRBdHRyaWJ1dGVzKGF0dHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneUlkID0gc3RyYXRlZ3ktPmdldElkKCk7CisgICAgICAgICAgICBwcm9kdWN0U3RyYXRlZ2llc1tzdHJhdGVneUlkXSA9IHN0cmF0ZWd5OworICAgICAgICB9CisgICAgfTsKKyAgICBhdXRvIGxvYWRWb2x1bWVHcm91cHMgPSBbXShhdXRvICZ2b2x1bWVDb25maWdzLCBhdXRvICZ2b2x1bWVHcm91cHMpIHsKKyAgICAgICAgZm9yIChhdXRvICZ2b2x1bWVDb25maWcgOiB2b2x1bWVDb25maWdzKSB7CisgICAgICAgICAgICBzcDxWb2x1bWVHcm91cD4gdm9sdW1lR3JvdXAgPSBuZXcgVm9sdW1lR3JvdXAodm9sdW1lQ29uZmlnLm5hbWUsIHZvbHVtZUNvbmZpZy5pbmRleE1pbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVDb25maWcuaW5kZXhNYXgpOworICAgICAgICAgICAgdm9sdW1lR3JvdXBzW3ZvbHVtZUdyb3VwLT5nZXRJZCgpXSA9IHZvbHVtZUdyb3VwOworCisgICAgICAgICAgICBmb3IgKGF1dG8gJmNvbmZpZ0N1cnZlIDogdm9sdW1lQ29uZmlnLnZvbHVtZUN1cnZlcykgeworICAgICAgICAgICAgICAgIGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXQgPSBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUjsKKyAgICAgICAgICAgICAgICBpZiAoIURldmljZUNhdGVnb3J5Q29udmVydGVyOjpmcm9tU3RyaW5nKGNvbmZpZ0N1cnZlLmRldmljZUNhdGVnb3J5LCBkZXZpY2VDYXQpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCAlcyIsIF9fRlVOQ1RJT05fXywgY29uZmlnQ3VydmUuZGV2aWNlQ2F0ZWdvcnkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzcDxWb2x1bWVDdXJ2ZT4gY3VydmUgPSBuZXcgVm9sdW1lQ3VydmUoZGV2aWNlQ2F0KTsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8gJnBvaW50IDogY29uZmlnQ3VydmUuY3VydmVQb2ludHMpIHsKKyAgICAgICAgICAgICAgICAgICAgY3VydmUtPmFkZCh7cG9pbnQuaW5kZXgsIHBvaW50LmF0dGVudWF0aW9uSW5NYn0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2b2x1bWVHcm91cC0+YWRkKGN1cnZlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisgICAgYXV0byByZXN1bHQgPSBlbmdpbmVDb25maWc6OnBhcnNlKCk7CisgICAgaWYgKHJlc3VsdC5wYXJzZWRDb25maWcgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiJXM6IE5vIGNvbmZpZ3VyYXRpb24gZm91bmQsIHVzaW5nIGRlZmF1bHQgbWF0Y2hpbmcgcGhvbmUgZXhwZXJpZW5jZS4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBlbmdpbmVDb25maWc6OkNvbmZpZyBjb25maWcgPSBnRGVmYXVsdEVuZ2luZUNvbmZpZzsKKyAgICAgICAgYW5kcm9pZDo6c3RhdHVzX3QgcmV0ID0gZW5naW5lQ29uZmlnOjpwYXJzZUxlZ2FjeVZvbHVtZXMoY29uZmlnLnZvbHVtZUdyb3Vwcyk7CisgICAgICAgIHJlc3VsdCA9IHtzdGQ6Om1ha2VfdW5pcXVlPGVuZ2luZUNvbmZpZzo6Q29uZmlnPihjb25maWcpLAorICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXQgPT0gTk9fRVJST1IgPyAwIDogMSl9OworICAgIH0KKyAgICBBTE9HRV9JRihyZXN1bHQubmJTa2lwcGVkRWxlbWVudCAhPSAwLCAic2tpcHBlZCAlenUgZWxlbWVudHMiLCByZXN1bHQubmJTa2lwcGVkRWxlbWVudCk7CisgICAgbG9hZFZvbHVtZUdyb3VwcyhyZXN1bHQucGFyc2VkQ29uZmlnLT52b2x1bWVHcm91cHMsIG1Wb2x1bWVHcm91cHMpOworICAgIGxvYWRQcm9kdWN0U3RyYXRlZ2llcyhyZXN1bHQucGFyc2VkQ29uZmlnLT5wcm9kdWN0U3RyYXRlZ2llcywgbVByb2R1Y3RTdHJhdGVnaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBzKTsKKyAgICBtUHJvZHVjdFN0cmF0ZWdpZXMuaW5pdGlhbGl6ZSgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK1N0cmF0ZWd5VmVjdG9yIEVuZ2luZUJhc2U6OmdldE9yZGVyZWRQcm9kdWN0U3RyYXRlZ2llcygpIGNvbnN0Cit7CisgICAgYXV0byBmaW5kQnlGbGFnID0gW10oY29uc3QgYXV0byAmcHJvZHVjdFN0cmF0ZWdpZXMsIGF1dG8gZmxhZykgeworICAgICAgICByZXR1cm4gc3RkOjpmaW5kX2lmKGJlZ2luKHByb2R1Y3RTdHJhdGVnaWVzKSwgZW5kKHByb2R1Y3RTdHJhdGVnaWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJl0oY29uc3QgYXV0byAmc3RyYXRlZ3kpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmYXR0cmlidXRlcyA6IHN0cmF0ZWd5LnNlY29uZC0+Z2V0QXVkaW9BdHRyaWJ1dGVzKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoKGF0dHJpYnV0ZXMuZmxhZ3MgJiBmbGFnKSA9PSBmbGFnKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSk7CisgICAgfTsKKyAgICBhdXRvIHN0cmF0ZWdpZXMgPSBtUHJvZHVjdFN0cmF0ZWdpZXM7CisgICAgYXV0byBlbmZvcmNlZEF1ZGlibGVTdHJhdGVneUl0ZXIgPSBmaW5kQnlGbGFnKHN0cmF0ZWdpZXMsIEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCk7CisKKyAgICBpZiAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQgJiYKKyAgICAgICAgICAgIGVuZm9yY2VkQXVkaWJsZVN0cmF0ZWd5SXRlciAhPSBzdHJhdGVnaWVzLmVuZCgpKSB7CisgICAgICAgIGF1dG8gZW5mb3JjZWRBdWRpYmxlU3RyYXRlZ3kgPSAqZW5mb3JjZWRBdWRpYmxlU3RyYXRlZ3lJdGVyOworICAgICAgICBzdHJhdGVnaWVzLmVyYXNlKGVuZm9yY2VkQXVkaWJsZVN0cmF0ZWd5SXRlcik7CisgICAgICAgIHN0cmF0ZWdpZXMuaW5zZXJ0KGJlZ2luKHN0cmF0ZWdpZXMpLCBlbmZvcmNlZEF1ZGlibGVTdHJhdGVneSk7CisgICAgfQorICAgIFN0cmF0ZWd5VmVjdG9yIG9yZGVyZWRTdHJhdGVnaWVzOworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6IHN0cmF0ZWdpZXMpIHsKKyAgICAgICAgb3JkZXJlZFN0cmF0ZWdpZXMucHVzaF9iYWNrKGl0ZXIuc2Vjb25kLT5nZXRJZCgpKTsKKyAgICB9CisgICAgcmV0dXJuIG9yZGVyZWRTdHJhdGVnaWVzOworfQorCitTdHJlYW1UeXBlVmVjdG9yIEVuZ2luZUJhc2U6OmdldFN0cmVhbVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcykgY29uc3QKK3sKKyAgICAvLyBAVE9ETyBkZWZhdWx0IG11c2ljIHN0cmVhbSB0byBjb250cm9sIHZvbHVtZSBpZiBubyBncm91cD8KKyAgICByZXR1cm4gKG1Qcm9kdWN0U3RyYXRlZ2llcy5maW5kKHBzKSAhPSBlbmQobVByb2R1Y3RTdHJhdGVnaWVzKSkgPworICAgICAgICAgICAgICAgIG1Qcm9kdWN0U3RyYXRlZ2llcy5hdChwcyktPmdldFN1cHBvcnRlZFN0cmVhbXMoKSA6CisgICAgICAgICAgICAgICAgU3RyZWFtVHlwZVZlY3RvcihBVURJT19TVFJFQU1fTVVTSUMpOworfQorCitBdHRyaWJ1dGVzVmVjdG9yIEVuZ2luZUJhc2U6OmdldEFsbEF0dHJpYnV0ZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHBzKSBjb25zdAoreworICAgIHJldHVybiAobVByb2R1Y3RTdHJhdGVnaWVzLmZpbmQocHMpICE9IGVuZChtUHJvZHVjdFN0cmF0ZWdpZXMpKSA/CisgICAgICAgICAgICAgICAgbVByb2R1Y3RTdHJhdGVnaWVzLmF0KHBzKS0+Z2V0QXVkaW9BdHRyaWJ1dGVzKCkgOiBBdHRyaWJ1dGVzVmVjdG9yKCk7Cit9CisKK3N0YXR1c190IEVuZ2luZUJhc2U6Omxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKSBjb25zdAoreworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6IG1Qcm9kdWN0U3RyYXRlZ2llcykgeworICAgICAgICBjb25zdCBhdXRvICZwcm9kdWN0U3RyYXRlZ3kgPSBpdGVyLnNlY29uZDsKKyAgICAgICAgc3RyYXRlZ2llcy5wdXNoX2JhY2soCisgICAgICAgIHtwcm9kdWN0U3RyYXRlZ3ktPmdldE5hbWUoKSwgcHJvZHVjdFN0cmF0ZWd5LT5saXN0QXVkaW9BdHRyaWJ1dGVzKCksCisgICAgICAgICBwcm9kdWN0U3RyYXRlZ3ktPmdldElkKCl9KTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitWb2x1bWVDdXJ2ZXMgKkVuZ2luZUJhc2U6OmdldFZvbHVtZUN1cnZlc0ZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdAoreworICAgIHZvbHVtZV9ncm91cF90IHZvbEdyID0gbVByb2R1Y3RTdHJhdGVnaWVzLmdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcyhhdHRyKTsKKyAgICBjb25zdCBhdXRvICZpdGVyID0gbVZvbHVtZUdyb3Vwcy5maW5kKHZvbEdyKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGl0ZXIgPT0gc3RkOjplbmQobVZvbHVtZUdyb3VwcyksICJObyB2b2x1bWUgZ3JvdXBzIGZvciAlcyIsIHRvU3RyaW5nKGF0dHIpLmNfc3RyKCkpOworICAgIHJldHVybiBtVm9sdW1lR3JvdXBzLmF0KHZvbEdyKS0+Z2V0Vm9sdW1lQ3VydmVzKCk7Cit9CisKK1ZvbHVtZUN1cnZlcyAqRW5naW5lQmFzZTo6Z2V0Vm9sdW1lQ3VydmVzRm9yU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKK3sKKyAgICB2b2x1bWVfZ3JvdXBfdCB2b2xHciA9IG1Qcm9kdWN0U3RyYXRlZ2llcy5nZXRWb2x1bWVHcm91cEZvclN0cmVhbVR5cGUoc3RyZWFtKTsKKyAgICBpZiAodm9sR3IgPT0gVk9MVU1FX0dST1VQX05PTkUpIHsKKyAgICAgICAgdm9sR3IgPSBtUHJvZHVjdFN0cmF0ZWdpZXMuZ2V0RGVmYXVsdFZvbHVtZUdyb3VwKCk7CisgICAgfQorICAgIGNvbnN0IGF1dG8gJml0ZXIgPSBtVm9sdW1lR3JvdXBzLmZpbmQodm9sR3IpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaXRlciA9PSBzdGQ6OmVuZChtVm9sdW1lR3JvdXBzKSwgIk5vIHZvbHVtZSBncm91cHMgZm9yICVzIiwKKyAgICAgICAgICAgICAgICB0b1N0cmluZyhzdHJlYW0pLmNfc3RyKCkpOworICAgIHJldHVybiBtVm9sdW1lR3JvdXBzLmF0KHZvbEdyKS0+Z2V0Vm9sdW1lQ3VydmVzKCk7Cit9CisKK3N0YXR1c190IEVuZ2luZUJhc2U6OnN3aXRjaFZvbHVtZUN1cnZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtU3JjLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbURzdCkKK3sKKyAgICBhdXRvIHNyY0N1cnZlcyA9IGdldFZvbHVtZUN1cnZlc0ZvclN0cmVhbVR5cGUoc3RyZWFtU3JjKTsKKyAgICBhdXRvIGRzdEN1cnZlcyA9IGdldFZvbHVtZUN1cnZlc0ZvclN0cmVhbVR5cGUoc3RyZWFtRHN0KTsKKworICAgIGlmIChzcmNDdXJ2ZXMgPT0gbnVsbHB0ciB8fCBkc3RDdXJ2ZXMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gZHN0Q3VydmVzLT5zd2l0Y2hDdXJ2ZXNGcm9tKCpzcmNDdXJ2ZXMpOworfQorCitzdGF0dXNfdCBFbmdpbmVCYXNlOjpyZXN0b3JlT3JpZ2luVm9sdW1lQ3VydmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCit7CisgICAgVm9sdW1lQ3VydmVzICpjdXJ2ZXMgPSBnZXRWb2x1bWVDdXJ2ZXNGb3JTdHJlYW1UeXBlKHN0cmVhbSk7CisgICAgcmV0dXJuIGN1cnZlcyAhPSBudWxscHRyID8gY3VydmVzLT5zd2l0Y2hDdXJ2ZXNGcm9tKCpjdXJ2ZXMpIDogQkFEX1ZBTFVFOworfQorCitWb2x1bWVHcm91cFZlY3RvciBFbmdpbmVCYXNlOjpnZXRWb2x1bWVHcm91cHMoKSBjb25zdAoreworICAgIFZvbHVtZUdyb3VwVmVjdG9yIGdyb3VwOworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6IG1Wb2x1bWVHcm91cHMpIHsKKyAgICAgICAgZ3JvdXAucHVzaF9iYWNrKGl0ZXIuZmlyc3QpOworICAgIH0KKyAgICByZXR1cm4gZ3JvdXA7Cit9CisKK3ZvbHVtZV9ncm91cF90IEVuZ2luZUJhc2U6OmdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1Qcm9kdWN0U3RyYXRlZ2llcy5nZXRWb2x1bWVHcm91cEZvckF0dHJpYnV0ZXMoYXR0cik7Cit9CisKK3ZvbHVtZV9ncm91cF90IEVuZ2luZUJhc2U6OmdldFZvbHVtZUdyb3VwRm9yU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKK3sKKyAgICByZXR1cm4gbVByb2R1Y3RTdHJhdGVnaWVzLmdldFZvbHVtZUdyb3VwRm9yU3RyZWFtVHlwZShzdHJlYW0pOworfQorCitzdGF0dXNfdCBFbmdpbmVCYXNlOjpsaXN0QXVkaW9Wb2x1bWVHcm91cHMoQXVkaW9Wb2x1bWVHcm91cFZlY3RvciAmZ3JvdXBzKSBjb25zdAoreworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6IG1Wb2x1bWVHcm91cHMpIHsKKyAgICAgICAgZ3JvdXBzLnB1c2hfYmFjayh7aXRlci5zZWNvbmQtPmdldE5hbWUoKSwgaXRlci5zZWNvbmQtPmdldElkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXIuc2Vjb25kLT5nZXRTdXBwb3J0ZWRBdHRyaWJ1dGVzKCksIGl0ZXIuc2Vjb25kLT5nZXRTdHJlYW1UeXBlcygpfSk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBFbmdpbmVCYXNlOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBtUHJvZHVjdFN0cmF0ZWdpZXMuZHVtcChkc3QsIDIpOworICAgIG1Wb2x1bWVHcm91cHMuZHVtcChkc3QsIDIpOworfQorCit9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0VuZ2luZURlZmF1bHRDb25maWcuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0VuZ2luZURlZmF1bHRDb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWRlMGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvRW5naW5lRGVmYXVsdENvbmZpZy5oCkBAIC0wLDAgKzEsMTQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworLyoqCisgKiBAYnJpZWYgQXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyBoYXJkIGNvZGVkIGFycmF5IG9mIHN0cmF0ZWdpZXMgdG8gZmlsbCBuZXcgZW5naW5lIEFQSSBjb250cmFjdC4KKyAqLworY29uc3QgZW5naW5lQ29uZmlnOjpQcm9kdWN0U3RyYXRlZ2llcyBnT3JkZXJlZFN0cmF0ZWdpZXMgPSB7CisgICAgeyJTVFJBVEVHWV9QSE9ORSIsCisgICAgIHsKKyAgICAgICAgIHsicGhvbmUiLCBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgIkFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIiwKKyAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OLCBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwKKyAgICAgICAgICAgICIifX0sCisgICAgICAgICB9LAorICAgICAgICAgeyJzY28iLCBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTywgIkFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPIiwKKyAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLCBBVURJT19TT1VSQ0VfREVGQVVMVCwgQVVESU9fRkxBR19TQ08sCisgICAgICAgICAgICAiIn19LAorICAgICAgICAgfQorICAgICB9LAorICAgIH0sCisgICAgeyJTVFJBVEVHWV9TT05JRklDQVRJT04iLAorICAgICB7CisgICAgICAgICB7InJpbmciLCBBVURJT19TVFJFQU1fUklORywgIkFVRElPX1NUUkVBTV9SSU5HIiwKKyAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FLAorICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifX0KKyAgICAgICAgIH0sCisgICAgICAgICB7ImFsYXJtIiwgQVVESU9fU1RSRUFNX0FMQVJNLCAiQVVESU9fU1RSRUFNX0FMQVJNIiwKKyAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9BTEFSTSwgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifX0sCisgICAgICAgICB9CisgICAgIH0sCisgICAgfSwKKyAgICB7IlNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUiLAorICAgICB7CisgICAgICAgICB7IiIsIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFLCAiQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUiLAorICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sIEFVRElPX1NPVVJDRV9ERUZBVUxULAorICAgICAgICAgICAgQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VELCAiIn19CisgICAgICAgICB9CisgICAgIH0sCisgICAgfSwKKyAgICB7IlNUUkFURUdZX0FDQ0VTU0lCSUxJVFkiLAorICAgICB7CisgICAgICAgICB7IiIsIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZLCAiQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkiLAorICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWSwKKyAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn19CisgICAgICAgICB9CisgICAgIH0sCisgICAgfSwKKyAgICB7IlNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMIiwKKyAgICAgeworICAgICAgICAgeyIiLCBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OLCAiQVVESU9fU1RSRUFNX05PVElGSUNBVElPTiIsCisgICAgICAgICAgeworICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX05PVElGSUNBVElPTiwgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNULAorICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5ULAorICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVELAorICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQsCisgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9CisgICAgICAgICAgfQorICAgICAgICAgfQorICAgICB9LAorICAgIH0sCisgICAgeyJTVFJBVEVHWV9NRURJQSIsCisgICAgIHsKKyAgICAgICAgIHsibXVzaWMiLCBBVURJT19TVFJFQU1fTVVTSUMsICJBVURJT19TVFJFQU1fTVVTSUMiLAorICAgICAgICAgIHsKKyAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9NRURJQSwgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9HQU1FLCBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX0FTU0lTVEFOVCwgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UsCisgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0KKyAgICAgICAgICB9LAorICAgICAgICAgfSwKKyAgICAgICAgIHsic3lzdGVtIiwgQVVESU9fU1RSRUFNX1NZU1RFTSwgIkFVRElPX1NUUkVBTV9TWVNURU0iLAorICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OLAorICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifX0KKyAgICAgICAgIH0KKyAgICAgfSwKKyAgICB9LAorICAgIHsiU1RSQVRFR1lfRFRNRiIsCisgICAgIHsKKyAgICAgICAgIHsiIiwgQVVESU9fU1RSRUFNX0RUTUYsICJBVURJT19TVFJFQU1fRFRNRiIsCisgICAgICAgICAgeworICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORywKKyAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0KKyAgICAgICAgICB9CisgICAgICAgICB9CisgICAgIH0sCisgICAgfSwKKyAgICB7IlNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUiIsCisgICAgIHsKKyAgICAgICAgIHsiIiwgQVVESU9fU1RSRUFNX1RUUywgIkFVRElPX1NUUkVBTV9UVFMiLAorICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sIEFVRElPX1NPVVJDRV9ERUZBVUxULAorICAgICAgICAgICAgQVVESU9fRkxBR19CRUFDT04sICIifX0KKyAgICAgICAgIH0KKyAgICAgfSwKKyAgICB9LAorICAgIHsiU1RSQVRFR1lfUkVST1VUSU5HIiwKKyAgICAgeworICAgICAgICAgeyIiLCBBVURJT19TVFJFQU1fUkVST1VUSU5HLCAiQVVESU9fU1RSRUFNX1JFUk9VVElORyIsCisgICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifX0KKyAgICAgICAgIH0KKyAgICAgfSwKKyAgICB9LAorICAgIHsiU1RSQVRFR1lfUEFUQ0giLAorICAgICB7CisgICAgICAgICB7IiIsIEFVRElPX1NUUkVBTV9QQVRDSCwgIkFVRElPX1NUUkVBTV9QQVRDSCIsCisgICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifX0KKyAgICAgICAgIH0KKyAgICAgfSwKKyAgICB9Cit9OworCitjb25zdCBlbmdpbmVDb25maWc6OkNvbmZpZyBnRGVmYXVsdEVuZ2luZUNvbmZpZyA9IHsKKyAgICAxLjAsCisgICAgZ09yZGVyZWRTdHJhdGVnaWVzLAorICAgIHt9LAorICAgIHt9LAorICAgIHt9Cit9OworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvUHJvZHVjdFN0cmF0ZWd5LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL1Byb2R1Y3RTdHJhdGVneS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc0ZjE5MAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL1Byb2R1Y3RTdHJhdGVneS5jcHAKQEAgLTAsMCArMSwzMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9Qb2xpY3lFbmdpbmUvUHJvZHVjdFN0cmF0ZWd5IgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiUHJvZHVjdFN0cmF0ZWd5LmgiCisKKyNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworUHJvZHVjdFN0cmF0ZWd5OjpQcm9kdWN0U3RyYXRlZ3koY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIDoKKyAgICBtTmFtZShuYW1lKSwKKyAgICBtSWQoc3RhdGljX2Nhc3Q8cHJvZHVjdF9zdHJhdGVneV90PihIYW5kbGVHZW5lcmF0b3I8dWludDMyX3Q+OjpnZXROZXh0SGFuZGxlKCkpKQoreworfQorCit2b2lkIFByb2R1Y3RTdHJhdGVneTo6YWRkQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmF1ZGlvQXR0cmlidXRlcykKK3sKKyAgICBtQXR0cmlidXRlc1ZlY3Rvci5wdXNoX2JhY2soYXVkaW9BdHRyaWJ1dGVzKTsKK30KKworc3RkOjp2ZWN0b3I8YW5kcm9pZDo6QXVkaW9BdHRyaWJ1dGVzPiBQcm9kdWN0U3RyYXRlZ3k6Omxpc3RBdWRpb0F0dHJpYnV0ZXMoKSBjb25zdAoreworICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OkF1ZGlvQXR0cmlidXRlcz4gYW5kcm9pZEFhOworICAgIGZvciAoY29uc3QgYXV0byAmYXR0ciA6IG1BdHRyaWJ1dGVzVmVjdG9yKSB7CisgICAgICAgIGFuZHJvaWRBYS5wdXNoX2JhY2soe2F0dHIubVZvbHVtZUdyb3VwLCBhdHRyLm1TdHJlYW0sIGF0dHIubUF0dHJpYnV0ZXN9KTsKKyAgICB9CisgICAgcmV0dXJuIGFuZHJvaWRBYTsKK30KKworQXR0cmlidXRlc1ZlY3RvciBQcm9kdWN0U3RyYXRlZ3k6OmdldEF1ZGlvQXR0cmlidXRlcygpIGNvbnN0Cit7CisgICAgQXR0cmlidXRlc1ZlY3RvciBhdHRyVmVjdG9yOworICAgIGZvciAoY29uc3QgYXV0byAmYXR0ckdyb3VwIDogbUF0dHJpYnV0ZXNWZWN0b3IpIHsKKyAgICAgICAgYXR0clZlY3Rvci5wdXNoX2JhY2soYXR0ckdyb3VwLm1BdHRyaWJ1dGVzKTsKKyAgICB9CisgICAgaWYgKG5vdCBhdHRyVmVjdG9yLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIGF0dHJWZWN0b3I7CisgICAgfQorICAgIHJldHVybiB7IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVIgfTsKK30KKworYm9vbCBQcm9kdWN0U3RyYXRlZ3k6Om1hdGNoZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHIpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN0ZDo6ZmluZF9pZihiZWdpbihtQXR0cmlidXRlc1ZlY3RvciksIGVuZChtQXR0cmlidXRlc1ZlY3RvciksCisgICAgICAgICAgICAgICAgICAgICAgICBbJmF0dHJdKGNvbnN0IGF1dG8gJnN1cHBvcnRlZEF0dHIpIHsKKyAgICAgICAgcmV0dXJuIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5OjphdHRyaWJ1dGVzTWF0Y2hlcyhzdXBwb3J0ZWRBdHRyLm1BdHRyaWJ1dGVzLCBhdHRyKTsKKyAgICB9KSAhPSBlbmQobUF0dHJpYnV0ZXNWZWN0b3IpOworfQorCithdWRpb19zdHJlYW1fdHlwZV90IFByb2R1Y3RTdHJhdGVneTo6Z2V0U3RyZWFtVHlwZUZvckF0dHJpYnV0ZXMoCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3QKK3sKKyAgICBjb25zdCBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmRfaWYoYmVnaW4obUF0dHJpYnV0ZXNWZWN0b3IpLCBlbmQobUF0dHJpYnV0ZXNWZWN0b3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJmF0dHJdKGNvbnN0IGF1dG8gJnN1cHBvcnRlZEF0dHIpIHsKKyAgICAgICAgcmV0dXJuIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5OjphdHRyaWJ1dGVzTWF0Y2hlcyhzdXBwb3J0ZWRBdHRyLm1BdHRyaWJ1dGVzLCBhdHRyKTsgfSk7CisgICAgcmV0dXJuIGl0ZXIgIT0gZW5kKG1BdHRyaWJ1dGVzVmVjdG9yKSA/IGl0ZXItPm1TdHJlYW0gOiBBVURJT19TVFJFQU1fREVGQVVMVDsKK30KKworYXVkaW9fYXR0cmlidXRlc190IFByb2R1Y3RTdHJhdGVneTo6Z2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKSBjb25zdAoreworICAgIGNvbnN0IGF1dG8gaXRlciA9IHN0ZDo6ZmluZF9pZihiZWdpbihtQXR0cmlidXRlc1ZlY3RvciksIGVuZChtQXR0cmlidXRlc1ZlY3RvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmc3RyZWFtVHlwZV0oY29uc3QgYXV0byAmc3VwcG9ydGVkQXR0cikgeworICAgICAgICByZXR1cm4gc3VwcG9ydGVkQXR0ci5tU3RyZWFtID09IHN0cmVhbVR5cGU7IH0pOworICAgIHJldHVybiBpdGVyICE9IGVuZChtQXR0cmlidXRlc1ZlY3RvcikgPyBpdGVyLT5tQXR0cmlidXRlcyA6IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVI7Cit9CisKK2Jvb2wgUHJvZHVjdFN0cmF0ZWd5Ojppc0RlZmF1bHQoKSBjb25zdAoreworICAgIHJldHVybiBzdGQ6OmZpbmRfaWYoYmVnaW4obUF0dHJpYnV0ZXNWZWN0b3IpLCBlbmQobUF0dHJpYnV0ZXNWZWN0b3IpLCBbXShjb25zdCBhdXRvICZhdHRyKSB7CisgICAgICAgIHJldHVybiBhdHRyLm1BdHRyaWJ1dGVzID09IGRlZmF1bHRBdHRyOyB9KSAhPSBlbmQobUF0dHJpYnV0ZXNWZWN0b3IpOworfQorCitTdHJlYW1UeXBlVmVjdG9yIFByb2R1Y3RTdHJhdGVneTo6Z2V0U3VwcG9ydGVkU3RyZWFtcygpIGNvbnN0Cit7CisgICAgU3RyZWFtVHlwZVZlY3RvciBzdHJlYW1zOworICAgIGZvciAoY29uc3QgYXV0byAmc3VwcG9ydGVkQXR0ciA6IG1BdHRyaWJ1dGVzVmVjdG9yKSB7CisgICAgICAgIGlmIChzdGQ6OmZpbmQoYmVnaW4oc3RyZWFtcyksIGVuZChzdHJlYW1zKSwgc3VwcG9ydGVkQXR0ci5tU3RyZWFtKSA9PSBlbmQoc3RyZWFtcykgJiYKKyAgICAgICAgICAgICAgICBzdXBwb3J0ZWRBdHRyLm1TdHJlYW0gIT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpIHsKKyAgICAgICAgICAgIHN0cmVhbXMucHVzaF9iYWNrKHN1cHBvcnRlZEF0dHIubVN0cmVhbSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0cmVhbXM7Cit9CisKK2Jvb2wgUHJvZHVjdFN0cmF0ZWd5OjpzdXBwb3J0U3RyZWFtVHlwZShjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZzdHJlYW1UeXBlKSBjb25zdAoreworICAgIHJldHVybiBzdGQ6OmZpbmRfaWYoYmVnaW4obUF0dHJpYnV0ZXNWZWN0b3IpLCBlbmQobUF0dHJpYnV0ZXNWZWN0b3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgWyZzdHJlYW1UeXBlXShjb25zdCBhdXRvICZzdXBwb3J0ZWRBdHRyKSB7CisgICAgICAgIHJldHVybiBzdXBwb3J0ZWRBdHRyLm1TdHJlYW0gPT0gc3RyZWFtVHlwZTsgfSkgIT0gZW5kKG1BdHRyaWJ1dGVzVmVjdG9yKTsKK30KKwordm9sdW1lX2dyb3VwX3QgUHJvZHVjdFN0cmF0ZWd5OjpnZXRWb2x1bWVHcm91cEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdAoreworICAgIGZvciAoY29uc3QgYXV0byAmc3VwcG9ydGVkQXR0ciA6IG1BdHRyaWJ1dGVzVmVjdG9yKSB7CisgICAgICAgIGlmIChBdWRpb1Byb2R1Y3RTdHJhdGVneTo6YXR0cmlidXRlc01hdGNoZXMoc3VwcG9ydGVkQXR0ci5tQXR0cmlidXRlcywgYXR0cikpIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBwb3J0ZWRBdHRyLm1Wb2x1bWVHcm91cDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVk9MVU1FX0dST1VQX05PTkU7Cit9CisKK3ZvbHVtZV9ncm91cF90IFByb2R1Y3RTdHJhdGVneTo6Z2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAoreworICAgIGZvciAoY29uc3QgYXV0byAmc3VwcG9ydGVkQXR0ciA6IG1BdHRyaWJ1dGVzVmVjdG9yKSB7CisgICAgICAgIGlmIChzdXBwb3J0ZWRBdHRyLm1TdHJlYW0gPT0gc3RyZWFtKSB7CisgICAgICAgICAgICByZXR1cm4gc3VwcG9ydGVkQXR0ci5tVm9sdW1lR3JvdXA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFZPTFVNRV9HUk9VUF9OT05FOworfQorCit2b2x1bWVfZ3JvdXBfdCBQcm9kdWN0U3RyYXRlZ3k6OmdldERlZmF1bHRWb2x1bWVHcm91cCgpIGNvbnN0Cit7CisgICAgY29uc3QgYXV0byAmaXRlciA9IHN0ZDo6ZmluZF9pZihiZWdpbihtQXR0cmlidXRlc1ZlY3RvciksIGVuZChtQXR0cmlidXRlc1ZlY3RvciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBhdXRvICZhdHRyKSB7cmV0dXJuIGF0dHIubUF0dHJpYnV0ZXMgPT0gZGVmYXVsdEF0dHI7fSk7CisgICAgcmV0dXJuIGl0ZXIgIT0gZW5kKG1BdHRyaWJ1dGVzVmVjdG9yKSA/IGl0ZXItPm1Wb2x1bWVHcm91cCA6IFZPTFVNRV9HUk9VUF9OT05FOworfQorCit2b2lkIFByb2R1Y3RTdHJhdGVneTo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuJSpzLSVzIChpZDogJWQpXG4iLCBzcGFjZXMsICIiLCBtTmFtZS5jX3N0cigpLCBtSWQpOworICAgIHN0ZDo6c3RyaW5nIGRldmljZUxpdGVyYWw7CisgICAgaWYgKCFPdXRwdXREZXZpY2VDb252ZXJ0ZXI6OnRvU3RyaW5nKG1BcHBsaWNhYmxlRGV2aWNlcywgZGV2aWNlTGl0ZXJhbCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gY29udmVydCBkZXZpY2UgJWQiLCBfX0ZVTkNUSU9OX18sIG1BcHBsaWNhYmxlRGV2aWNlcyk7CisgICAgfQorICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNTZWxlY3RlZCBEZXZpY2U6IHt0eXBlOiVzLCBAOiVzfVxuIiwgc3BhY2VzICsgMiwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUxpdGVyYWwuY19zdHIoKSwgbURldmljZUFkZHJlc3MuY19zdHIoKSk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmF0dHIgOiBtQXR0cmlidXRlc1ZlY3RvcikgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzR3JvdXA6ICVkIHN0cmVhbTogJXNcbiIsIHNwYWNlcyArIDMsICIiLCBhdHRyLm1Wb2x1bWVHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6dG9TdHJpbmcoYXR0ci5tU3RyZWFtKS5jX3N0cigpKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyBBdHRyaWJ1dGVzOiAiLCBzcGFjZXMgKyAzLCAiIik7CisgICAgICAgIHN0ZDo6c3RyaW5nIGF0dFN0ciA9CisgICAgICAgICAgICAgICAgYXR0ci5tQXR0cmlidXRlcyA9PSBkZWZhdWx0QXR0ciA/ICJ7IEFueSB9IiA6IGFuZHJvaWQ6OnRvU3RyaW5nKGF0dHIubUF0dHJpYnV0ZXMpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJXNcbiIsIGF0dFN0ci5jX3N0cigpKTsKKyAgICB9Cit9CisKK3Byb2R1Y3Rfc3RyYXRlZ3lfdCBQcm9kdWN0U3RyYXRlZ3lNYXA6OmdldFByb2R1Y3RTdHJhdGVneUZvckF0dHJpYnV0ZXMoCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3QKK3sKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiAqdGhpcykgeworICAgICAgICBpZiAoaXRlci5zZWNvbmQtPm1hdGNoZXMoYXR0cikpIHsKKyAgICAgICAgICAgIHJldHVybiBpdGVyLnNlY29uZC0+Z2V0SWQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiJXM6IE5vIG1hdGNoaW5nIHByb2R1Y3Qgc3RyYXRlZ3kgZm9yIGF0dHJpYnV0ZXMgJXMsIHJldHVybiBkZWZhdWx0IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgIHRvU3RyaW5nKGF0dHIpLmNfc3RyKCkpOworICAgIHJldHVybiBnZXREZWZhdWx0KCk7Cit9CisKK2F1ZGlvX2F0dHJpYnV0ZXNfdCBQcm9kdWN0U3RyYXRlZ3lNYXA6OmdldEF0dHJpYnV0ZXNGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAoreworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6ICp0aGlzKSB7CisgICAgICAgIGNvbnN0IGF1dG8gc3RyYXRlZ3kgPSBpdGVyLnNlY29uZDsKKyAgICAgICAgaWYgKHN0cmF0ZWd5LT5zdXBwb3J0U3RyZWFtVHlwZShzdHJlYW0pKSB7CisgICAgICAgICAgICByZXR1cm4gc3RyYXRlZ3ktPmdldEF0dHJpYnV0ZXNGb3JTdHJlYW1UeXBlKHN0cmVhbSk7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoIiVzOiBObyBwcm9kdWN0IHN0cmF0ZWd5IGZvciBzdHJlYW0gJXMsIHVzaW5nIGRlZmF1bHQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgdG9TdHJpbmcoc3RyZWFtKS5jX3N0cigpKTsKKyAgICByZXR1cm4ge307Cit9CisKK2F1ZGlvX3N0cmVhbV90eXBlX3QgUHJvZHVjdFN0cmF0ZWd5TWFwOjpnZXRTdHJlYW1UeXBlRm9yQXR0cmlidXRlcygKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdAoreworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6ICp0aGlzKSB7CisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gaXRlci5zZWNvbmQtPmdldFN0cmVhbVR5cGVGb3JBdHRyaWJ1dGVzKGF0dHIpOworICAgICAgICBpZiAoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9ERUZBVUxUKSB7CisgICAgICAgICAgICByZXR1cm4gc3RyZWFtOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCIlczogTm8gcHJvZHVjdCBzdHJhdGVneSBmb3IgYXR0cmlidXRlcyAlcywgdXNpbmcgZGVmYXVsdCAoYWthIE1VU0lDKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICB0b1N0cmluZyhhdHRyKS5jX3N0cigpKTsKKyAgICByZXR1cm4gIEFVRElPX1NUUkVBTV9NVVNJQzsKK30KKworcHJvZHVjdF9zdHJhdGVneV90IFByb2R1Y3RTdHJhdGVneU1hcDo6Z2V0RGVmYXVsdCgpIGNvbnN0Cit7CisgICAgaWYgKG1EZWZhdWx0U3RyYXRlZ3kgIT0gUFJPRFVDVF9TVFJBVEVHWV9OT05FKSB7CisgICAgICAgIHJldHVybiBtRGVmYXVsdFN0cmF0ZWd5OworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiAqdGhpcykgeworICAgICAgICBpZiAoaXRlci5zZWNvbmQtPmlzRGVmYXVsdCgpKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IHVzaW5nIGRlZmF1bHQgJXMiLCBfX0ZVTkNUSU9OX18sIGl0ZXIuc2Vjb25kLT5nZXROYW1lKCkuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gaXRlci5zZWNvbmQtPmdldElkKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR0UoIiVzOiBObyBkZWZhdWx0IHByb2R1Y3Qgc3RyYXRlZ3kgZGVmaW5lZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIFBST0RVQ1RfU1RSQVRFR1lfTk9ORTsKK30KKworYXVkaW9fYXR0cmlidXRlc190IFByb2R1Y3RTdHJhdGVneU1hcDo6Z2V0QXR0cmlidXRlc0ZvclByb2R1Y3RTdHJhdGVneSgKKyAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KSBjb25zdAoreworICAgIGlmIChmaW5kKHN0cmF0ZWd5KSA9PSBlbmQoKSkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCAlZCBzdHJhdGVneSByZXF1ZXN0ZWQiLCBzdHJhdGVneSk7CisgICAgICAgIHJldHVybiBBVURJT19BVFRSSUJVVEVTX0lOSVRJQUxJWkVSOworICAgIH0KKyAgICByZXR1cm4gYXQoc3RyYXRlZ3kpLT5nZXRBdWRpb0F0dHJpYnV0ZXMoKVswXTsKK30KKworcHJvZHVjdF9zdHJhdGVneV90IFByb2R1Y3RTdHJhdGVneU1hcDo6Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAoreworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6ICp0aGlzKSB7CisgICAgICAgIGlmIChpdGVyLnNlY29uZC0+c3VwcG9ydFN0cmVhbVR5cGUoc3RyZWFtKSkgeworICAgICAgICAgICAgcmV0dXJuIGl0ZXIuc2Vjb25kLT5nZXRJZCgpOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCIlczogTm8gcHJvZHVjdCBzdHJhdGVneSBmb3Igc3RyZWFtICVkLCB1c2luZyBkZWZhdWx0IiwgX19GVU5DVElPTl9fLCBzdHJlYW0pOworICAgIHJldHVybiBnZXREZWZhdWx0KCk7Cit9CisKKworYXVkaW9fZGV2aWNlc190IFByb2R1Y3RTdHJhdGVneU1hcDo6Z2V0RGV2aWNlVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3koCisgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSkgY29uc3QKK3sKKyAgICBpZiAoZmluZChzdHJhdGVneSkgPT0gZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgJWQgc3RyYXRlZ3kgcmVxdWVzdGVkLCByZXR1cm5pbmcgZGV2aWNlIGZvciBkZWZhdWx0IHN0cmF0ZWd5Iiwgc3RyYXRlZ3kpOworICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgZGVmYXVsdFN0cmF0ZWd5ID0gZ2V0RGVmYXVsdCgpOworICAgICAgICBpZiAoZGVmYXVsdFN0cmF0ZWd5ID09IFBST0RVQ1RfU1RSQVRFR1lfTk9ORSkgeworICAgICAgICAgICAgcmV0dXJuIEFVRElPX0RFVklDRV9OT05FOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhdChnZXREZWZhdWx0KCkpLT5nZXREZXZpY2VUeXBlcygpOworICAgIH0KKyAgICByZXR1cm4gYXQoc3RyYXRlZ3kpLT5nZXREZXZpY2VUeXBlcygpOworfQorCitzdGQ6OnN0cmluZyBQcm9kdWN0U3RyYXRlZ3lNYXA6OmdldERldmljZUFkZHJlc3NGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHBzSWQpIGNvbnN0Cit7CisgICAgaWYgKGZpbmQocHNJZCkgPT0gZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgJWQgc3RyYXRlZ3kgcmVxdWVzdGVkLCByZXR1cm5pbmcgZGV2aWNlIGZvciBkZWZhdWx0IHN0cmF0ZWd5IiwgcHNJZCk7CisgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBkZWZhdWx0U3RyYXRlZ3kgPSBnZXREZWZhdWx0KCk7CisgICAgICAgIGlmIChkZWZhdWx0U3RyYXRlZ3kgPT0gUFJPRFVDVF9TVFJBVEVHWV9OT05FKSB7CisgICAgICAgICAgICByZXR1cm4ge307CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGF0KGdldERlZmF1bHQoKSktPmdldERldmljZUFkZHJlc3MoKTsKKyAgICB9CisgICAgcmV0dXJuIGF0KHBzSWQpLT5nZXREZXZpY2VBZGRyZXNzKCk7Cit9CisKK3ZvbHVtZV9ncm91cF90IFByb2R1Y3RTdHJhdGVneU1hcDo6Z2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3QKK3sKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiAqdGhpcykgeworICAgICAgICB2b2x1bWVfZ3JvdXBfdCBncm91cCA9IGl0ZXIuc2Vjb25kLT5nZXRWb2x1bWVHcm91cEZvckF0dHJpYnV0ZXMoYXR0cik7CisgICAgICAgIGlmIChncm91cCAhPSBWT0xVTUVfR1JPVVBfTk9ORSkgeworICAgICAgICAgICAgcmV0dXJuIGdyb3VwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBnZXREZWZhdWx0Vm9sdW1lR3JvdXAoKTsKK30KKwordm9sdW1lX2dyb3VwX3QgUHJvZHVjdFN0cmF0ZWd5TWFwOjpnZXRWb2x1bWVHcm91cEZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0Cit7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogKnRoaXMpIHsKKyAgICAgICAgdm9sdW1lX2dyb3VwX3QgZ3JvdXAgPSBpdGVyLnNlY29uZC0+Z2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKHN0cmVhbSk7CisgICAgICAgIGlmIChncm91cCAhPSBWT0xVTUVfR1JPVVBfTk9ORSkgeworICAgICAgICAgICAgcmV0dXJuIGdyb3VwOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dXKCIlczogbm8gdm9sdW1lIGdyb3VwIGZvciAlcywgdXNpbmcgZGVmYXVsdCIsIF9fZnVuY19fLCB0b1N0cmluZyhzdHJlYW0pLmNfc3RyKCkpOworICAgIHJldHVybiBnZXREZWZhdWx0Vm9sdW1lR3JvdXAoKTsKK30KKwordm9sdW1lX2dyb3VwX3QgUHJvZHVjdFN0cmF0ZWd5TWFwOjpnZXREZWZhdWx0Vm9sdW1lR3JvdXAoKSBjb25zdAoreworICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBkZWZhdWx0U3RyYXRlZ3kgPSBnZXREZWZhdWx0KCk7CisgICAgaWYgKGRlZmF1bHRTdHJhdGVneSA9PSBQUk9EVUNUX1NUUkFURUdZX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIFZPTFVNRV9HUk9VUF9OT05FOworICAgIH0KKyAgICByZXR1cm4gYXQoZGVmYXVsdFN0cmF0ZWd5KS0+Z2V0RGVmYXVsdFZvbHVtZUdyb3VwKCk7Cit9CisKK3ZvaWQgUHJvZHVjdFN0cmF0ZWd5TWFwOjppbml0aWFsaXplKCkKK3sKKyAgICBtRGVmYXVsdFN0cmF0ZWd5ID0gZ2V0RGVmYXVsdCgpOworICAgIEFMT0dfQVNTRVJUKG1EZWZhdWx0U3RyYXRlZ3kgIT0gUFJPRFVDVF9TVFJBVEVHWV9OT05FLCAiTm8gZGVmYXVsdCBwcm9kdWN0IHN0cmF0ZWd5IGZvdW5kIik7Cit9CisKK3ZvaWQgUHJvZHVjdFN0cmF0ZWd5TWFwOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzUHJvZHVjdCBTdHJhdGVnaWVzIGR1bXA6Iiwgc3BhY2VzLCAiIik7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogKnRoaXMpIHsKKyAgICAgICAgaXRlci5zZWNvbmQtPmR1bXAoZHN0LCBzcGFjZXMgKyAyKTsKKyAgICB9Cit9CisKK30KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvVm9sdW1lQ3VydmUuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvVm9sdW1lQ3VydmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzNTI1NzgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9Wb2x1bWVDdXJ2ZS5jcHAKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6Vm9sdW1lQ3VydmUiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlICJWb2x1bWVDdXJ2ZS5oIgorI2luY2x1ZGUgIlR5cGVDb252ZXJ0ZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZmxvYXQgVm9sdW1lQ3VydmU6OnZvbEluZGV4VG9EYihpbnQgaW5kZXhJblVpLCBpbnQgdm9sSW5kZXhNaW4sIGludCB2b2xJbmRleE1heCkgY29uc3QKK3sKKyAgICBBTE9HX0FTU0VSVCghbUN1cnZlUG9pbnRzLmlzRW1wdHkoKSwgIkludmFsaWQgdm9sdW1lIGN1cnZlIik7CisgICAgaWYgKHZvbEluZGV4TWluIDwgMCB8fCB2b2xJbmRleE1heCA8IDApIHsKKyAgICAgICAgLy8gSW4gb3JkZXIgdG8gbGV0IEF1ZGlvU2VydmljZSBpbml0aWFsaXplIHRoZSBtaW4gYW5kIG1heCwgY29udmVudGlvbiBpcyB0byB1c2UgLTEKKyAgICAgICAgcmV0dXJuIE5BTjsKKyAgICB9CisgICAgaWYgKGluZGV4SW5VaSA8IHZvbEluZGV4TWluKSB7CisgICAgICAgIC8vIGFuIGluZGV4IG9mIDAgbWVhbnMgbXV0ZSByZXF1ZXN0IHdoZW4gdm9sSW5kZXhNaW4gPiAwCisgICAgICAgIGlmIChpbmRleEluVWkgPT0gMCkgeworICAgICAgICAgICAgQUxPR1YoIlZPTFVNRSBmb3JjaW5nIG11dGUgZm9yIGluZGV4IDAgd2l0aCBtaW4gaW5kZXggJWQiLCB2b2xJbmRleE1pbik7CisgICAgICAgICAgICByZXR1cm4gVk9MVU1FX01JTl9EQjsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiVk9MVU1FIHJlbWFwcGluZyBpbmRleCBmcm9tICVkIHRvIG1pbiBpbmRleCAlZCIsIGluZGV4SW5VaSwgdm9sSW5kZXhNaW4pOworICAgICAgICBpbmRleEluVWkgPSB2b2xJbmRleE1pbjsKKyAgICB9IGVsc2UgaWYgKGluZGV4SW5VaSA+IHZvbEluZGV4TWF4KSB7CisgICAgICAgIEFMT0dWKCJWT0xVTUUgcmVtYXBwaW5nIGluZGV4IGZyb20gJWQgdG8gbWF4IGluZGV4ICVkIiwgaW5kZXhJblVpLCB2b2xJbmRleE1heCk7CisgICAgICAgIGluZGV4SW5VaSA9IHZvbEluZGV4TWF4OworICAgIH0KKworICAgIHNpemVfdCBuYkN1cnZlUG9pbnRzID0gbUN1cnZlUG9pbnRzLnNpemUoKTsKKyAgICAvLyB0aGUgdm9sdW1lIGluZGV4IGluIHRoZSBVSSBpcyByZWxhdGl2ZSB0byB0aGUgbWluIGFuZCBtYXggdm9sdW1lIGluZGljZXMgZm9yIHRoaXMgc3RyZWFtCisgICAgaW50IG5iU3RlcHMgPSAxICsgbUN1cnZlUG9pbnRzW25iQ3VydmVQb2ludHMgLSAxXS5tSW5kZXggLSBtQ3VydmVQb2ludHNbMF0ubUluZGV4OworICAgIGludCB2b2xJZHggPSAobmJTdGVwcyAqIChpbmRleEluVWkgLSB2b2xJbmRleE1pbikpIC8gKHZvbEluZGV4TWF4IC0gdm9sSW5kZXhNaW4pOworCisgICAgLy8gV2hlcmUgd291bGQgdGhpcyB2b2x1bWUgaW5kZXggYmVlbiBpbnNlcnRlZCBpbiB0aGUgY3VydmUgcG9pbnQKKyAgICBzaXplX3QgaW5kZXhJblVpUG9zaXRpb24gPSBtQ3VydmVQb2ludHMub3JkZXJPZihDdXJ2ZVBvaW50KHZvbElkeCwgMCkpOworICAgIGlmIChpbmRleEluVWlQb3NpdGlvbiA+PSBuYkN1cnZlUG9pbnRzKSB7CisgICAgICAgIC8vdXNlIGxhc3QgcG9pbnQgb2YgdGFibGUKKyAgICAgICAgcmV0dXJuIG1DdXJ2ZVBvaW50c1tuYkN1cnZlUG9pbnRzIC0gMV0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZjsKKyAgICB9CisgICAgaWYgKGluZGV4SW5VaVBvc2l0aW9uID09IDApIHsKKyAgICAgICAgaWYgKGluZGV4SW5VaVBvc2l0aW9uICE9IG1DdXJ2ZVBvaW50c1swXS5tSW5kZXgpIHsKKyAgICAgICAgICAgIHJldHVybiBWT0xVTUVfTUlOX0RCOyAvLyBvdXQgb2YgYm91bmRzCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1DdXJ2ZVBvaW50c1swXS5tQXR0ZW51YXRpb25Jbk1iIC8gMTAwLjBmOworICAgIH0KKyAgICAvLyBsaW5lYXIgaW50ZXJwb2xhdGlvbiBpbiB0aGUgYXR0ZW51YXRpb24gdGFibGUgaW4gZEIKKyAgICBmbG9hdCBkZWNpYmVscyA9IChtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb24gLSAxXS5tQXR0ZW51YXRpb25Jbk1iIC8gMTAwLjBmKSArCisgICAgICAgICAgICAoKGZsb2F0KSh2b2xJZHggLSBtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb24gLSAxXS5tSW5kZXgpKSAqCisgICAgICAgICAgICAgICAgKCAoKG1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbl0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZikgLQorICAgICAgICAgICAgICAgICAgICAgICAgKG1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbiAtIDFdLm1BdHRlbnVhdGlvbkluTWIgLyAxMDAuMGYpKSAvCisgICAgICAgICAgICAgICAgICAgICgoZmxvYXQpKG1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbl0ubUluZGV4IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb24gLSAxXS5tSW5kZXgpKSApOworCisgICAgQUxPR1YoIlZPTFVNRSB2b2wgaW5kZXg9WyVkICVkICVkXSwgZEI9WyUuMWYgJS4xZiAlLjFmXSIsCisgICAgICAgICAgICBtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb24gLSAxXS5tSW5kZXgsIHZvbElkeCwKKyAgICAgICAgICAgIG1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbl0ubUluZGV4LAorICAgICAgICAgICAgKChmbG9hdCltQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb24gLSAxXS5tQXR0ZW51YXRpb25Jbk1iIC8gMTAwLjBmKSwgZGVjaWJlbHMsCisgICAgICAgICAgICAoKGZsb2F0KW1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbl0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZikpOworCisgICAgcmV0dXJuIGRlY2liZWxzOworfQorCit2b2lkIFZvbHVtZUN1cnZlOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgYm9vbCBjdXJ2ZVBvaW50cykgY29uc3QKK3sKKyAgICBpZiAoIWN1cnZlUG9pbnRzKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZHN0LT5hcHBlbmQoIiB7Iik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ3VydmVQb2ludHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyglM2QsICU1ZCkiLCBzcGFjZXMsICIiLCBtQ3VydmVQb2ludHNbaV0ubUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VydmVQb2ludHNbaV0ubUF0dGVudWF0aW9uSW5NYik7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KGkgPT0gKG1DdXJ2ZVBvaW50cy5zaXplKCkgLSAxKSA/ICIgfVxuIiA6ICIsICIpOworICAgIH0KK30KKwordm9pZCBWb2x1bWVDdXJ2ZXM6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBib29sIGN1cnZlUG9pbnRzKSBjb25zdAoreworICAgIGlmICghY3VydmVQb2ludHMpIHsKKy8vICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzJTAyZCAgICAgICVzICAgICAgICAgJTAzZCAgICAgICAgJTAzZCAgICAgICAgIiwgc3BhY2VzLCAiIiwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtLCBtQ2FuQmVNdXRlZCA/ICJ0cnVlICIgOiAiZmFsc2UiLCBtSW5kZXhNaW4sIG1JbmRleE1heCk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMgQ2FuIGJlIG11dGVkICBJbmRleCBNaW4gIEluZGV4IE1heCAgSW5kZXggQ3VyIFtkZXZpY2UgOiBpbmRleF0uLi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlcyArIDEsICIiKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyAlcyAgICAgICAgICUwMmQgICAgICAgICAlMDJkICAgICAgICAgIiwgc3BhY2VzICsgMSwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYW5CZU11dGVkID8gInRydWUgIiA6ICJmYWxzZSIsIG1JbmRleE1pbiwgbUluZGV4TWF4KTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwYWlyIDogbUluZGV4Q3VyKSB7CisgICAgICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJTA0eCA6ICUwMmQsICIsIHBhaXIuZmlyc3QsIHBhaXIuc2Vjb25kKTsKKyAgICAgICAgfQorICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBzdHJlYW1OYW1lczsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnN0cmVhbSA6IG1TdHJlYW1zKSB7CisgICAgICAgIHN0cmVhbU5hbWVzICs9IGFuZHJvaWQ6OnRvU3RyaW5nKHN0cmVhbSkgKyAiKCIrc3RkOjp0b19zdHJpbmcoc3RyZWFtKSsiKSAiOworICAgIH0KKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzVm9sdW1lIEN1cnZlcyBTdHJlYW1zL0F0dHJpYnV0ZXMsIEN1cnZlIHBvaW50cyBTdHJlYW1zIGZvciBkZXZpY2UiCisgICAgICAgICAgICAgICAgICAgICAgIiBjYXRlZ29yeSAoaW5kZXgsIGF0dGVudWF0aW9uIGluIG1pbGxpYmVsKVxuIiwgc3BhY2VzLCAiIik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyBTdHJlYW1zOiAlcyBcbiIsIHNwYWNlcywgIiIsIHN0cmVhbU5hbWVzLmNfc3RyKCkpOworICAgIGlmICghbUF0dHJpYnV0ZXMuZW1wdHkoKSkgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyBBdHRyaWJ1dGVzOiIsIHNwYWNlcywgIiIpOworICAgIGZvciAoY29uc3QgYXV0byAmYXR0cmlidXRlcyA6IG1BdHRyaWJ1dGVzKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGF0dFN0ciA9IGF0dHJpYnV0ZXMgPT0gZGVmYXVsdEF0dHIgPyAieyBBbnkgfSIgOiBhbmRyb2lkOjp0b1N0cmluZyhhdHRyaWJ1dGVzKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyAlc1xuIiwgYXR0cmlidXRlcyA9PSBtQXR0cmlidXRlcy5mcm9udCgpID8gMCA6IHNwYWNlcyArIDEzLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0U3RyLmNfc3RyKCkpOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGRldmljZUNhdExpdGVyYWw7CisgICAgICAgIERldmljZUNhdGVnb3J5Q29udmVydGVyOjp0b1N0cmluZyhrZXlBdChpKSwgZGV2aWNlQ2F0TGl0ZXJhbCk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMgJXMgOiIsIHNwYWNlcywgIiIsIGRldmljZUNhdExpdGVyYWwuY19zdHIoKSk7CisgICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZHN0LCAxLCB0cnVlKTsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL1ZvbHVtZUdyb3VwLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL1ZvbHVtZUdyb3VwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTg5ODA3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvVm9sdW1lR3JvdXAuY3BwCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9Qb2xpY3lFbmdpbmUvVm9sdW1lR3JvdXAiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlICJWb2x1bWVHcm91cC5oIgorI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLworLy8gVm9sdW1lR3JvdXAgaW1wbGVtZW50YXRpb24KKy8vCitWb2x1bWVHcm91cDo6Vm9sdW1lR3JvdXAoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KSA6CisgICAgbU5hbWUobmFtZSksIG1JZChzdGF0aWNfY2FzdDx2b2x1bWVfZ3JvdXBfdD4oSGFuZGxlR2VuZXJhdG9yPHVpbnQzMl90Pjo6Z2V0TmV4dEhhbmRsZSgpKSksCisgICAgbUdyb3VwVm9sdW1lQ3VydmVzKFZvbHVtZUN1cnZlcyhpbmRleE1pbiwgaW5kZXhNYXgpKQoreworfQorCit2b2lkIFZvbHVtZUdyb3VwOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG4lKnMtJXMgKGlkOiAlZClcbiIsIHNwYWNlcywgIiIsIG1OYW1lLmNfc3RyKCksIG1JZCk7CisgICAgbUdyb3VwVm9sdW1lQ3VydmVzLmR1bXAoZHN0LCBzcGFjZXMgKyAyLCB0cnVlKTsKKyAgICBtR3JvdXBWb2x1bWVDdXJ2ZXMuZHVtcChkc3QsIHNwYWNlcyArIDIsIGZhbHNlKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG4iKTsKK30KKwordm9pZCBWb2x1bWVHcm91cDo6YWRkKGNvbnN0IHNwPFZvbHVtZUN1cnZlPiAmY3VydmUpCit7CisgICAgbUdyb3VwVm9sdW1lQ3VydmVzLmFkZChjdXJ2ZSk7Cit9CisKK3ZvaWQgVm9sdW1lR3JvdXA6OmFkZFN1cHBvcnRlZEF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKQoreworICAgIG1Hcm91cFZvbHVtZUN1cnZlcy5hZGRBdHRyaWJ1dGVzKGF0dHIpOworfQorCit2b2lkIFZvbHVtZUdyb3VwOjphZGRTdXBwb3J0ZWRTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCit7CisgICAgbUdyb3VwVm9sdW1lQ3VydmVzLmFkZFN0cmVhbVR5cGUoc3RyZWFtKTsKK30KKworLy8KKy8vIFZvbHVtZUdyb3VwTWFwIGltcGxlbWVudGF0aW9uCisvLwordm9pZCBWb2x1bWVHcm91cE1hcDo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuJSpzVm9sdW1lIEdyb3VwcyBkdW1wOiIsIHNwYWNlcywgIiIpOworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6ICp0aGlzKSB7CisgICAgICAgIGl0ZXIuc2Vjb25kLT5kdW1wKGRzdCwgc3BhY2VzICsgMik7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZTcyZjJhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzEgQEAKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGliYXVkaW9wb2xpY3llbmdpbmVfY29uZmlnIiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImV4dGVybmFsL2xpYnhtbDIvaW5jbHVkZSIsCisgICAgICAgICJleHRlcm5hbC9pY3UvaWN1NGMvc291cmNlL2NvbW1vbiIsCisgICAgXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJzcmMvRW5naW5lQ29uZmlnLmNwcCIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKKyAgICAgICAgImxpYmFuZHJvaWRpY3UiLAorICAgICAgICAibGlieG1sMiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMiLAorICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvX3N5c3RlbV9oZWFkZXJzIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5Y29tbW9uIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9pbmNsdWRlL0VuZ2luZUNvbmZpZy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9pbmNsdWRlL0VuZ2luZUNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNWVkNWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL2luY2x1ZGUvRW5naW5lQ29uZmlnLmgKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworc3RydWN0IF94bWxOb2RlOworc3RydWN0IF94bWxEb2M7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBlbmdpbmVDb25maWcgeworCisvKiogRGVmYXVsdCBwYXRoIG9mIGF1ZGlvIHBvbGljeSB1c2FnZXMgY29uZmlndXJhdGlvbiBmaWxlLiAqLworY29uc3RleHByIGNoYXIgREVGQVVMVF9QQVRIW10gPSAiL3ZlbmRvci9ldGMvYXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uLnhtbCI7CisKKy8qKiBEaXJlY3RvcmllcyB3aGVyZSB0aGUgZWZmZWN0IGxpYnJhcmllcyB3aWxsIGJlIHNlYXJjaCBmb3IuICovCitjb25zdGV4cHIgY29uc3QgY2hhciogUE9MSUNZX1VTQUdFX0xJQlJBUllfUEFUSFtdID0geyIvb2RtL2V0Yy8iLCAiL3ZlbmRvci9ldGMvIiwgIi9zeXN0ZW0vZXRjLyJ9OworCit1c2luZyBBdHRyaWJ1dGVzVmVjdG9yID0gc3RkOjp2ZWN0b3I8YXVkaW9fYXR0cmlidXRlc190PjsKK3VzaW5nIFN0cmVhbVZlY3RvciA9IHN0ZDo6dmVjdG9yPGF1ZGlvX3N0cmVhbV90eXBlX3Q+OworCitzdHJ1Y3QgQXR0cmlidXRlc0dyb3VwIHsKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtOworICAgIHN0ZDo6c3RyaW5nIHZvbHVtZUdyb3VwOworICAgIEF0dHJpYnV0ZXNWZWN0b3IgYXR0cmlidXRlc1ZlY3Q7Cit9OworCit1c2luZyBBdHRyaWJ1dGVzR3JvdXBzID0gc3RkOjp2ZWN0b3I8QXR0cmlidXRlc0dyb3VwPjsKKworc3RydWN0IEN1cnZlUG9pbnQgeworICAgIGludCBpbmRleDsKKyAgICBpbnQgYXR0ZW51YXRpb25Jbk1iOworfTsKK3VzaW5nIEN1cnZlUG9pbnRzID0gc3RkOjp2ZWN0b3I8Q3VydmVQb2ludD47CisKK3N0cnVjdCBWb2x1bWVDdXJ2ZSB7CisgICAgc3RkOjpzdHJpbmcgZGV2aWNlQ2F0ZWdvcnk7CisgICAgQ3VydmVQb2ludHMgY3VydmVQb2ludHM7Cit9OwordXNpbmcgVm9sdW1lQ3VydmVzID0gc3RkOjp2ZWN0b3I8Vm9sdW1lQ3VydmU+OworCitzdHJ1Y3QgVm9sdW1lR3JvdXAgeworICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgaW50IGluZGV4TWluOworICAgIGludCBpbmRleE1heDsKKyAgICBWb2x1bWVDdXJ2ZXMgdm9sdW1lQ3VydmVzOworfTsKK3VzaW5nIFZvbHVtZUdyb3VwcyA9IHN0ZDo6dmVjdG9yPFZvbHVtZUdyb3VwPjsKKworc3RydWN0IFByb2R1Y3RTdHJhdGVneSB7CisgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICBBdHRyaWJ1dGVzR3JvdXBzIGF0dHJpYnV0ZXNHcm91cHM7Cit9OworCit1c2luZyBQcm9kdWN0U3RyYXRlZ2llcyA9IHN0ZDo6dmVjdG9yPFByb2R1Y3RTdHJhdGVneT47CisKK3VzaW5nIFZhbHVlUGFpciA9IHN0ZDo6cGFpcjx1aW50MzJfdCwgc3RkOjpzdHJpbmc+OwordXNpbmcgVmFsdWVQYWlycyA9IHN0ZDo6dmVjdG9yPFZhbHVlUGFpcj47CisKK3N0cnVjdCBDcml0ZXJpb25UeXBlCit7CisgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICBib29sIGlzSW5jbHVzaXZlOworICAgIFZhbHVlUGFpcnMgdmFsdWVQYWlyczsKK307CisKK3VzaW5nIENyaXRlcmlvblR5cGVzID0gc3RkOjp2ZWN0b3I8Q3JpdGVyaW9uVHlwZT47CisKK3N0cnVjdCBDcml0ZXJpb24KK3sKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIHN0ZDo6c3RyaW5nIHR5cGVOYW1lOworICAgIHN0ZDo6c3RyaW5nIGRlZmF1bHRMaXRlcmFsVmFsdWU7Cit9OworCit1c2luZyBDcml0ZXJpYSA9IHN0ZDo6dmVjdG9yPENyaXRlcmlvbj47CisKK3N0cnVjdCBDb25maWcgeworICAgIGZsb2F0IHZlcnNpb247CisgICAgUHJvZHVjdFN0cmF0ZWdpZXMgcHJvZHVjdFN0cmF0ZWdpZXM7CisgICAgQ3JpdGVyaWEgY3JpdGVyaWE7CisgICAgQ3JpdGVyaW9uVHlwZXMgY3JpdGVyaW9uVHlwZXM7CisgICAgVm9sdW1lR3JvdXBzIHZvbHVtZUdyb3VwczsKK307CisKKy8qKiBSZXN1bHQgb2YgYHBhcnNlKGNvbnN0IGNoYXIqKWAgKi8KK3N0cnVjdCBQYXJzaW5nUmVzdWx0IHsKKyAgICAvKiogUGFyc2VkIGNvbmZpZywgbnVsbHB0ciBpZiB0aGUgeG1sIGxpYiBjb3VsZCBub3QgbG9hZCB0aGUgZmlsZSAqLworICAgIHN0ZDo6dW5pcXVlX3B0cjxDb25maWc+IHBhcnNlZENvbmZpZzsKKyAgICBzaXplX3QgbmJTa2lwcGVkRWxlbWVudDsgLy88IE51bWJlciBvZiBza2lwcGVkIGludmFsaWQgcHJvZHVjdCBzdHJhdGVnaWVzCit9OworCisvKiogUGFyc2VzIHRoZSBwcm92aWRlZCBhdWRpbyBwb2xpY3kgdXNhZ2UgY29uZmlndXJhdGlvbi4KKyAqIEByZXR1cm4gYXVkaW8gcG9saWN5IHVzYWdlIEBzZWUgQ29uZmlnCisgKi8KK1BhcnNpbmdSZXN1bHQgcGFyc2UoY29uc3QgY2hhciogcGF0aCA9IERFRkFVTFRfUEFUSCk7CithbmRyb2lkOjpzdGF0dXNfdCBwYXJzZUxlZ2FjeVZvbHVtZXMoVm9sdW1lR3JvdXBzICZ2b2x1bWVHcm91cHMpOworCit9IC8vIG5hbWVzcGFjZSBlbmdpbmVDb25maWcKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvc3JjL0VuZ2luZUNvbmZpZy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3NyYy9FbmdpbmVDb25maWcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZDc3MzkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3NyYy9FbmdpbmVDb25maWcuY3BwCkBAIC0wLDAgKzEsNjk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvUG9saWN5RW5naW5lL0NvbmZpZyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIkVuZ2luZUNvbmZpZy5oIgorI2luY2x1ZGUgPHBvbGljeS5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgorI2luY2x1ZGUgPG1lZGlhL2NvbnZlcnQuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxsaWJ4bWwvcGFyc2VyLmg+CisjaW5jbHVkZSA8bGlieG1sL3hpbmNsdWRlLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxpc3RyZWFtPgorCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyB1dGlsaXRpZXM6OmNvbnZlcnRUbzsKKworbmFtZXNwYWNlIGVuZ2luZUNvbmZpZyB7CisKK3N0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqZ1ZlcnNpb25BdHRyaWJ1dGUgPSAidmVyc2lvbiI7CitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZ1JlZmVyZW5jZUVsZW1lbnROYW1lID0gInJlZmVyZW5jZSI7CitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZ1JlZmVyZW5jZUF0dHJpYnV0ZU5hbWUgPSAibmFtZSI7CisKK3RlbXBsYXRlPHR5cGVuYW1lIEUsIHR5cGVuYW1lIEM+CitzdHJ1Y3QgQmFzZVNlcmlhbGl6ZXJUcmFpdHMgeworICAgIHR5cGVkZWYgRSBFbGVtZW50OworICAgIHR5cGVkZWYgQyBDb2xsZWN0aW9uOworICAgIHR5cGVkZWYgdm9pZCogUHRyU2VyaWFsaXppbmdDdHg7Cit9OworCitzdHJ1Y3QgQXR0cmlidXRlc0dyb3VwVHJhaXRzIDogcHVibGljIEJhc2VTZXJpYWxpemVyVHJhaXRzPEF0dHJpYnV0ZXNHcm91cCwgQXR0cmlidXRlc0dyb3Vwcz4geworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gIkF0dHJpYnV0ZXNHcm91cCI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gIkF0dHJpYnV0ZXNHcm91cHMiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm5hbWUgPSAibmFtZSI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqc3RyZWFtVHlwZSA9ICJzdHJlYW1UeXBlIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp2b2x1bWVHcm91cCA9ICJ2b2x1bWVHcm91cCI7CisgICAgfTsKKyAgICBzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgQ29sbGVjdGlvbiAmcHMpOworfTsKKworc3RydWN0IFByb2R1Y3RTdHJhdGVneVRyYWl0cyA6IHB1YmxpYyBCYXNlU2VyaWFsaXplclRyYWl0czxQcm9kdWN0U3RyYXRlZ3ksIFByb2R1Y3RTdHJhdGVnaWVzPiB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAiUHJvZHVjdFN0cmF0ZWd5IjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAiUHJvZHVjdFN0cmF0ZWdpZXMiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm5hbWUgPSAibmFtZSI7CisgICAgfTsKKyAgICBzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgQ29sbGVjdGlvbiAmcHMpOworfTsKK3N0cnVjdCBWYWx1ZVRyYWl0cyA6IHB1YmxpYyBCYXNlU2VyaWFsaXplclRyYWl0czxWYWx1ZVBhaXIsIFZhbHVlUGFpcnM+IHsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJ2YWx1ZSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gInZhbHVlcyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcyB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbGl0ZXJhbCA9ICJsaXRlcmFsIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpudW1lcmljYWwgPSAibnVtZXJpY2FsIjsKKyAgICB9OworCisgICAgc3RhdGljIGFuZHJvaWQ6OnN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gJmNvbGxlY3Rpb24pOworfTsKK3N0cnVjdCBDcml0ZXJpb25UeXBlVHJhaXRzIDogcHVibGljIEJhc2VTZXJpYWxpemVyVHJhaXRzPENyaXRlcmlvblR5cGUsIENyaXRlcmlvblR5cGVzPiB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAiY3JpdGVyaW9uX3R5cGUiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJjcml0ZXJpb25fdHlwZXMiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm5hbWUgPSAibmFtZSI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdHlwZSA9ICJ0eXBlIjsKKyAgICB9OworCisgICAgc3RhdGljIGFuZHJvaWQ6OnN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gJmNvbGxlY3Rpb24pOworfTsKK3N0cnVjdCBDcml0ZXJpb25UcmFpdHMgOiBwdWJsaWMgQmFzZVNlcmlhbGl6ZXJUcmFpdHM8Q3JpdGVyaW9uLCBDcml0ZXJpYT4geworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gImNyaXRlcmlvbiI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gImNyaXRlcmlhIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzIHsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpuYW1lID0gIm5hbWUiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnR5cGUgPSAidHlwZSI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqZGVmYXVsdFZhbCA9ICJkZWZhdWx0IjsKKyAgICB9OworCisgICAgc3RhdGljIGFuZHJvaWQ6OnN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gJmNvbGxlY3Rpb24pOworfTsKK3N0cnVjdCBWb2x1bWVUcmFpdHMgOiBwdWJsaWMgQmFzZVNlcmlhbGl6ZXJUcmFpdHM8Vm9sdW1lQ3VydmUsIFZvbHVtZUN1cnZlcz4geworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gInZvbHVtZSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gInZvbHVtZXMiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdm9sdW1lUG9pbnRUYWcgPSAicG9pbnQiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmRldmljZUNhdGVnb3J5ID0gImRldmljZUNhdGVnb3J5IjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzdHJlYW0gPSAic3RyZWFtIjsgLy8gRm9yIGxlZ2FjeSB2b2x1bWUgY3VydmVzCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqcmVmZXJlbmNlID0gInJlZiI7IC8qKjwgRm9yIHZvbHVtZSBjdXJ2ZXMgZmFjdG9yaXphdGlvbi4gKi8KKyAgICB9OworCisgICAgc3RhdGljIGFuZHJvaWQ6OnN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gJmNvbGxlY3Rpb24pOworfTsKK3N0cnVjdCBWb2x1bWVHcm91cFRyYWl0cyA6IHB1YmxpYyBCYXNlU2VyaWFsaXplclRyYWl0czxWb2x1bWVHcm91cCwgVm9sdW1lR3JvdXBzPiB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAidm9sdW1lR3JvdXAiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJ2b2x1bWVHcm91cHMiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm5hbWUgPSAibmFtZSI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqc3RyZWFtID0gInN0cmVhbSI7IC8vIEZvciBsZWdhY3kgdm9sdW1lIGN1cnZlcworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmluZGV4TWluID0gImluZGV4TWluIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICppbmRleE1heCA9ICJpbmRleE1heCI7CisgICAgfTsKKworICAgIHN0YXRpYyBhbmRyb2lkOjpzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uICZjb2xsZWN0aW9uKTsKK307CisKK3VzaW5nIHhtbENoYXJVbmlxdWUgPSBzdGQ6OnVuaXF1ZV9wdHI8eG1sQ2hhciwgZGVjbHR5cGUoeG1sRnJlZSk+OworCitzdGQ6OnN0cmluZyBnZXRYbWxBdHRyaWJ1dGUoY29uc3QgeG1sTm9kZSAqY3VyLCBjb25zdCBjaGFyICphdHRyaWJ1dGUpCit7CisgICAgeG1sQ2hhclVuaXF1ZSBjaGFyUHRyKHhtbEdldFByb3AoY3VyLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIgKj4oYXR0cmlidXRlKSksIHhtbEZyZWUpOworICAgIGlmIChjaGFyUHRyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuICIiOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyB2YWx1ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihjaGFyUHRyLmdldCgpKSk7CisgICAgcmV0dXJuIHZhbHVlOworfQorCitzdGF0aWMgdm9pZCBnZXRSZWZlcmVuY2UoY29uc3QgX3htbE5vZGUgKnJvb3QsIGNvbnN0IF94bWxOb2RlIComcmVmTm9kZSwgY29uc3Qgc3RkOjpzdHJpbmcgJnJlZk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZykKK3sKKyAgICBmb3IgKHJvb3QgPSByb290LT54bWxDaGlsZHJlbk5vZGU7IHJvb3QgIT0gTlVMTDsgcm9vdCA9IHJvb3QtPm5leHQpIHsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAocm9vdC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKiljb2xsZWN0aW9uVGFnKSkgeworICAgICAgICAgICAgZm9yICh4bWxOb2RlICpjdXIgPSByb290LT54bWxDaGlsZHJlbk5vZGU7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICAgICAgICAgICAgICBpZiAoKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKWdSZWZlcmVuY2VFbGVtZW50TmFtZSkpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBnUmVmZXJlbmNlQXR0cmlidXRlTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWZOYW1lID09IG5hbWUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlZk5vZGUgPSBjdXI7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhaXQ+CitzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemVDb2xsZWN0aW9uKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgVHJhaXQ6OkNvbGxlY3Rpb24gJmNvbGxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAmbmJTa2lwcGVkRWxlbWVudCkKK3sKKyAgICBmb3IgKGN1ciA9IGN1ci0+eG1sQ2hpbGRyZW5Ob2RlOyBjdXIgIT0gTlVMTDsgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgICAgIGlmICh4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVRyYWl0Ojpjb2xsZWN0aW9uVGFnKSAmJgorICAgICAgICAgICAgeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilUcmFpdDo6dGFnKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgeG1sTm9kZSAqY2hpbGQgPSBjdXI7CisgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVRyYWl0Ojpjb2xsZWN0aW9uVGFnKSkgeworICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC0+eG1sQ2hpbGRyZW5Ob2RlOworICAgICAgICB9CisgICAgICAgIGZvciAoOyBjaGlsZCAhPSBOVUxMOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisgICAgICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilUcmFpdDo6dGFnKSkgeworICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IFRyYWl0OjpkZXNlcmlhbGl6ZShkb2MsIGNoaWxkLCBjb2xsZWN0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIG5iU2tpcHBlZEVsZW1lbnQgKz0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVRyYWl0Ojp0YWcpKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmF0dHJpYnV0ZXNBdHRyaWJ1dGVSZWYgPSAiYXR0cmlidXRlc1JlZiI7IC8qKjwgZm9yIGZhY3Rvcml6YXRpb24uICovCisKK3N0YXRpYyBzdGF0dXNfdCBwYXJzZUF0dHJpYnV0ZXMoY29uc3QgX3htbE5vZGUgKmN1ciwgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyaWJ1dGVzKQoreworICAgIGZvciAoOyBjdXIgIT0gTlVMTDsgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgICAgIGlmICgheG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikoIkNvbnRlbnRUeXBlIikpKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBjb250ZW50VHlwZVhtbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsICJ2YWx1ZSIpOworICAgICAgICAgICAgYXVkaW9fY29udGVudF90eXBlX3QgY29udGVudFR5cGU7CisgICAgICAgICAgICBpZiAobm90IEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI6OmZyb21TdHJpbmcoY29udGVudFR5cGVYbWwuY19zdHIoKSwgY29udGVudFR5cGUpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgY29udGVudCB0eXBlICVzIiwgY29udGVudFR5cGVYbWwuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF0dHJpYnV0ZXMuY29udGVudF90eXBlID0gY29udGVudFR5cGU7CisgICAgICAgICAgICBBTE9HVigiJXMgY29udGVudCB0eXBlICVzIiwgIF9fRlVOQ1RJT05fXywgY29udGVudFR5cGVYbWwuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiVXNhZ2UiKSkpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHVzYWdlWG1sID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgInZhbHVlIik7CisgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlOworICAgICAgICAgICAgaWYgKG5vdCBVc2FnZVR5cGVDb252ZXJ0ZXI6OmZyb21TdHJpbmcodXNhZ2VYbWwuY19zdHIoKSwgdXNhZ2UpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgdXNhZ2UgJXMiLCB1c2FnZVhtbC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXR0cmlidXRlcy51c2FnZSA9IHVzYWdlOworICAgICAgICAgICAgQUxPR1YoIiVzIHVzYWdlICVzIiwgIF9fRlVOQ1RJT05fXywgdXNhZ2VYbWwuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiRmxhZ3MiKSkpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGZsYWdzID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgInZhbHVlIik7CisKKyAgICAgICAgICAgIEFMT0dWKCIlcyBmbGFncyAlcyIsICBfX0ZVTkNUSU9OX18sIGZsYWdzLmNfc3RyKCkpOworICAgICAgICAgICAgYXR0cmlidXRlcy5mbGFncyA9IEF1ZGlvRmxhZ0NvbnZlcnRlcjo6bWFza0Zyb21TdHJpbmcoZmxhZ3MsICIgIik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiQnVuZGxlIikpKSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBidW5kbGVLZXkgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCAia2V5Iik7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBidW5kbGVWYWx1ZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsICJ2YWx1ZSIpOworCisgICAgICAgICAgICBBTE9HVigiJXMgQnVuZGxlICVzICVzIiwgIF9fRlVOQ1RJT05fXywgYnVuZGxlS2V5LmNfc3RyKCksIGJ1bmRsZVZhbHVlLmNfc3RyKCkpOworCisgICAgICAgICAgICBzdGQ6OnN0cmluZyB0YWdzKGJ1bmRsZUtleSArICI9IiArIGJ1bmRsZVZhbHVlKTsKKyAgICAgICAgICAgIHN0ZDo6c3RybmNweShhdHRyaWJ1dGVzLnRhZ3MsIHRhZ3MuY19zdHIoKSwgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemVBdHRyaWJ1dGVzKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyaWJ1dGVzKSB7CisgICAgLy8gUmV0cmlldmUgY29udGVudCB0eXBlLCB1c2FnZSwgZmxhZ3MsIGFuZCBidW5kbGUgZnJvbSB4bWwKKyAgICBmb3IgKDsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgICAgICBpZiAobm90IHhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopKCJBdHRyaWJ1dGVzIikpKSB7CisgICAgICAgICAgICBjb25zdCB4bWxOb2RlICphdHRyTm9kZSA9IGN1cjsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGF0dHJSZWYgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBhdHRyaWJ1dGVzQXR0cmlidXRlUmVmKTsKKyAgICAgICAgICAgIGlmICghYXR0clJlZi5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgZ2V0UmVmZXJlbmNlKHhtbERvY0dldFJvb3RFbGVtZW50KGRvYyksIGF0dHJOb2RlLCBhdHRyUmVmLCBhdHRyaWJ1dGVzQXR0cmlidXRlUmVmKTsKKyAgICAgICAgICAgICAgICBpZiAoYXR0ck5vZGUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IE5vIHJlZmVyZW5jZSBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGF0dHJSZWYuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBkZXNlcmlhbGl6ZUF0dHJpYnV0ZXMoZG9jLCBhdHRyTm9kZS0+eG1sQ2hpbGRyZW5Ob2RlLCBhdHRyaWJ1dGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBwYXJzZUF0dHJpYnV0ZXMoYXR0ck5vZGUtPnhtbENoaWxkcmVuTm9kZSwgYXR0cmlidXRlcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vdCB4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiQ29udGVudFR5cGUiKSkgfHwKKyAgICAgICAgICAgICAgICBub3QgeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikoIlVzYWdlIikpIHx8CisgICAgICAgICAgICAgICAgbm90IHhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopKCJGbGFncyIpKSB8fAorICAgICAgICAgICAgICAgIG5vdCB4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiQnVuZGxlIikpKSB7CisgICAgICAgICAgICByZXR1cm4gcGFyc2VBdHRyaWJ1dGVzKGN1ciwgYXR0cmlidXRlcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplQXR0cmlidXRlc0NvbGxlY3Rpb24oX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlc1ZlY3RvciAmY29sbGVjdGlvbikKK3sKKyAgICBzdGF0dXNfdCByZXQgPSBCQURfVkFMVUU7CisgICAgLy8gRWl0aGVyIHdlIGRvIHByb3ZpZGUgb25seSBvbmUgYXR0cmlidXRlcyBvciBhIGNvbGxlY3Rpb24gb2Ygc3VwcG9ydGVkIGF0dHJpYnV0ZXMKKyAgICBmb3IgKGN1ciA9IGN1ci0+eG1sQ2hpbGRyZW5Ob2RlOyBjdXIgIT0gTlVMTDsgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgICAgIGlmIChub3QgeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikoIkF0dHJpYnV0ZXMiKSkgfHwKKyAgICAgICAgICAgICAgICBub3QgeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikoIkNvbnRlbnRUeXBlIikpIHx8CisgICAgICAgICAgICAgICAgbm90IHhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopKCJVc2FnZSIpKSB8fAorICAgICAgICAgICAgICAgIG5vdCB4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiRmxhZ3MiKSkgfHwKKyAgICAgICAgICAgICAgICBub3QgeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikoIkJ1bmRsZSIpKSkgeworICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSBBVURJT19BVFRSSUJVVEVTX0lOSVRJQUxJWkVSOworICAgICAgICAgICAgcmV0ID0gZGVzZXJpYWxpemVBdHRyaWJ1dGVzKGRvYywgY3VyLCBhdHRyaWJ1dGVzKTsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLnB1c2hfYmFjayhhdHRyaWJ1dGVzKTsKKyAgICAgICAgICAgICAgICAvLyBXZSBhcmUgZG9uZSBpZiB0aGUgIkF0dHJpYnV0ZXMiIGJhbGlzZSBpcyBvbWl0dGVkLCBvbmx5IG9uZSBBdHRyaWJ1dGVzIGlzIGFsbG93ZWQKKyAgICAgICAgICAgICAgICBpZiAoeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikoIkF0dHJpYnV0ZXMiKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgQXR0cmlidXRlc0dyb3VwVHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpjaGlsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiAmYXR0cmlidXRlc0dyb3VwKQoreworICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgIGlmIChuYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR1YoIkF0dHJpYnV0ZXNHcm91cFRyYWl0cyBObyBhdHRyaWJ1dGUgJXMgZm91bmQiLCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICB9CisgICAgQUxPR1YoIiVzOiAlcyA9ICVzIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpuYW1lLCBuYW1lLmNfc3RyKCkpOworCisgICAgc3RkOjpzdHJpbmcgdm9sdW1lR3JvdXAgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6OnZvbHVtZUdyb3VwKTsKKyAgICBpZiAodm9sdW1lR3JvdXAuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIGF0dHJpYnV0ZSAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6dm9sdW1lR3JvdXApOworICAgIH0KKyAgICBBTE9HVigiJXM6ICVzID0gJXMiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OnZvbHVtZUdyb3VwLCB2b2x1bWVHcm91cC5jX3N0cigpKTsKKworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOworICAgIHN0ZDo6c3RyaW5nIHN0cmVhbVR5cGVYbWwgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6OnN0cmVhbVR5cGUpOworICAgIGlmIChzdHJlYW1UeXBlWG1sLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBObyBhdHRyaWJ1dGUgJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OnN0cmVhbVR5cGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCIlczogJXMgPSAlcyIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6c3RyZWFtVHlwZSwgc3RyZWFtVHlwZVhtbC5jX3N0cigpKTsKKyAgICAgICAgaWYgKG5vdCBTdHJlYW1UeXBlQ29udmVydGVyOjpmcm9tU3RyaW5nKHN0cmVhbVR5cGVYbWwuY19zdHIoKSwgc3RyZWFtVHlwZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHN0cmVhbSB0eXBlICVzIiwgc3RyZWFtVHlwZVhtbC5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgQXR0cmlidXRlc1ZlY3RvciBhdHRyaWJ1dGVzVmVjdDsKKyAgICBkZXNlcmlhbGl6ZUF0dHJpYnV0ZXNDb2xsZWN0aW9uKGRvYywgY2hpbGQsIGF0dHJpYnV0ZXNWZWN0KTsKKworICAgIGF0dHJpYnV0ZXNHcm91cC5wdXNoX2JhY2soe25hbWUsIHN0cmVhbVR5cGUsIHZvbHVtZUdyb3VwLCBhdHRyaWJ1dGVzVmVjdH0pOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgVmFsdWVUcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKi8qZG9jKi8sIGNvbnN0IF94bWxOb2RlICpjaGlsZCwgQ29sbGVjdGlvbiAmdmFsdWVzKQoreworICAgIHN0ZDo6c3RyaW5nIGxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6OmxpdGVyYWwpOworICAgIGlmIChsaXRlcmFsLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBhdHRyaWJ1dGUgJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OmxpdGVyYWwpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICB1aW50MzJfdCBudW1lcmljYWwgPSAwOworICAgIHN0ZDo6c3RyaW5nIG51bWVyaWNhbFRhZyA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6bnVtZXJpY2FsKTsKKyAgICBpZiAobnVtZXJpY2FsVGFnLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBhdHRyaWJ1dGUgJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OmxpdGVyYWwpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoIWNvbnZlcnRUbyhudW1lcmljYWxUYWcsIG51bWVyaWNhbCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiA6IEludmFsaWQgdmFsdWUoJXMpIiwgX19GVU5DVElPTl9fLCBudW1lcmljYWxUYWcuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHZhbHVlcy5wdXNoX2JhY2soe251bWVyaWNhbCwgbGl0ZXJhbH0pOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQ3JpdGVyaW9uVHlwZVRyYWl0czo6ZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqY2hpbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uICZjcml0ZXJpb25UeXBlcykKK3sKKyAgICBzdGQ6OnN0cmluZyBuYW1lID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICBpZiAobmFtZS5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gYXR0cmlidXRlICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoIiVzOiAlcyAlcyA9ICVzIiwgX19GVU5DVElPTl9fLCB0YWcsIEF0dHJpYnV0ZXM6Om5hbWUsIG5hbWUuY19zdHIoKSk7CisKKyAgICBzdGQ6OnN0cmluZyB0eXBlID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjp0eXBlKTsKKyAgICBpZiAodHlwZS5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gYXR0cmlidXRlICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjp0eXBlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoIiVzOiAlcyAlcyA9ICVzIiwgX19GVU5DVElPTl9fLCB0YWcsIEF0dHJpYnV0ZXM6OnR5cGUsIHR5cGUuY19zdHIoKSk7CisgICAgYm9vbCBpc0luY2x1c2l2ZSh0eXBlID09ICJpbmNsdXNpdmUiKTsKKworICAgIFZhbHVlUGFpcnMgcGFpcnM7CisgICAgc2l6ZV90IG5iU2tpcHBlZEVsZW1lbnRzID0gMDsKKyAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248VmFsdWVUcmFpdHM+KGRvYywgY2hpbGQsIHBhaXJzLCBuYlNraXBwZWRFbGVtZW50cyk7CisgICAgY3JpdGVyaW9uVHlwZXMucHVzaF9iYWNrKHtuYW1lLCBpc0luY2x1c2l2ZSwgcGFpcnN9KTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IENyaXRlcmlvblRyYWl0czo6ZGVzZXJpYWxpemUoX3htbERvYyAqLypkb2MqLywgY29uc3QgX3htbE5vZGUgKmNoaWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uICZjcml0ZXJpYSkKK3sKKyAgICBzdGQ6OnN0cmluZyBuYW1lID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICBpZiAobmFtZS5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gYXR0cmlidXRlICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoIiVzOiAlcyA9ICVzIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpuYW1lLCBuYW1lLmNfc3RyKCkpOworCisgICAgc3RkOjpzdHJpbmcgZGVmYXVsdFZhbHVlID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjpkZWZhdWx0VmFsKTsKKyAgICBpZiAoZGVmYXVsdFZhbHVlLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gTm90IG1hbmRhdG9yeSB0byBwcm92aWRlIGEgZGVmYXVsdCB2YWx1ZSBmb3IgYSBjcml0ZXJpb24sIGV2ZW4gaXQgaXMgcmVjb21tYW5kZWQuLi4KKyAgICAgICAgQUxPR1YoIiVzOiBObyBhdHRyaWJ1dGUgJXMgZm91bmQgKGJ1dCByZWNvbW1hbmRlZCkiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OmRlZmF1bHRWYWwpOworICAgIH0KKyAgICBBTE9HVigiJXM6ICVzID0gJXMiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OmRlZmF1bHRWYWwsIGRlZmF1bHRWYWx1ZS5jX3N0cigpKTsKKworICAgIHN0ZDo6c3RyaW5nIHR5cGVOYW1lID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjp0eXBlKTsKKyAgICBpZiAodHlwZU5hbWUuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIGF0dHJpYnV0ZSAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6bmFtZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCIlczogJXMgPSAlcyIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6dHlwZSwgdHlwZU5hbWUuY19zdHIoKSk7CisKKyAgICBjcml0ZXJpYS5wdXNoX2JhY2soe25hbWUsIHR5cGVOYW1lLCBkZWZhdWx0VmFsdWV9KTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IFByb2R1Y3RTdHJhdGVneVRyYWl0czo6ZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqY2hpbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gJnN0cmF0ZWdpZXMpCit7CisgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6bmFtZSk7CisgICAgaWYgKG5hbWUuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiUHJvZHVjdFN0cmF0ZWd5VHJhaXRzIE5vIGF0dHJpYnV0ZSAlcyBmb3VuZCIsIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigiJXM6ICVzID0gJXMiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6Om5hbWUsIG5hbWUuY19zdHIoKSk7CisKKyAgICBzaXplX3Qgc2tpcHBlZCA9IDA7CisgICAgQXR0cmlidXRlc0dyb3VwcyBhdHRyR3JvdXBzOworICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdHRyaWJ1dGVzR3JvdXBUcmFpdHM+KGRvYywgY2hpbGQsIGF0dHJHcm91cHMsIHNraXBwZWQpOworCisgICAgc3RyYXRlZ2llcy5wdXNoX2JhY2soe25hbWUsIGF0dHJHcm91cHN9KTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IFZvbHVtZVRyYWl0czo6ZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgQ29sbGVjdGlvbiAmdm9sdW1lcykKK3sKKyAgICBzdGQ6OnN0cmluZyBkZXZpY2VDYXRlZ29yeSA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpkZXZpY2VDYXRlZ29yeSk7CisgICAgaWYgKGRldmljZUNhdGVnb3J5LmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR1coIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6ZGV2aWNlQ2F0ZWdvcnkpOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyByZWZlcmVuY2VOYW1lID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnJlZmVyZW5jZSk7CisgICAgY29uc3QgX3htbE5vZGUgKnJlZiA9IE5VTEw7CisgICAgaWYgKCFyZWZlcmVuY2VOYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgZ2V0UmVmZXJlbmNlKHhtbERvY0dldFJvb3RFbGVtZW50KGRvYyksIHJlZiwgcmVmZXJlbmNlTmFtZSwgY29sbGVjdGlvblRhZyk7CisgICAgICAgIGlmIChyZWYgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBObyByZWZlcmVuY2UgUHRyIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgcmVmZXJlbmNlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gUmV0cmlldmUgY3VydmUgcG9pbnQgZnJvbSByZWZlcmVuY2UgZWxlbWVudCBpZiBmb3VuZCBvciBkaXJlY3RseSBmcm9tIGN1cnJlbnQgY3VydmUKKyAgICBDdXJ2ZVBvaW50cyBjdXJ2ZVBvaW50czsKKyAgICBmb3IgKGNvbnN0IHhtbE5vZGUgKmNoaWxkID0gcmVmZXJlbmNlTmFtZS5lbXB0eSgpID8KKyAgICAgICAgIHJvb3QtPnhtbENoaWxkcmVuTm9kZSA6IHJlZi0+eG1sQ2hpbGRyZW5Ob2RlOyBjaGlsZCAhPSBOVUxMOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKXZvbHVtZVBvaW50VGFnKSkgeworICAgICAgICAgICAgeG1sQ2hhclVuaXF1ZSBwb2ludFhtbCh4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGNoaWxkLT54bWxDaGlsZHJlbk5vZGUsIDEpLCB4bWxGcmVlKTsKKyAgICAgICAgICAgIGlmIChwb2ludFhtbCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCIlczogJXM9JXMiLCBfX2Z1bmNfXywgdGFnLCByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihwb2ludFhtbC5nZXQoKSkpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiBwb2ludDsKKyAgICAgICAgICAgIGNvbGxlY3Rpb25Gcm9tU3RyaW5nPERlZmF1bHRUcmFpdHM8aW50Pj4oCisgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihwb2ludFhtbC5nZXQoKSksIHBvaW50LCAiLCIpOworICAgICAgICAgICAgaWYgKHBvaW50LnNpemUoKSAhPSAyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkICVzOiAlcyIsIF9fZnVuY19fLCB2b2x1bWVQb2ludFRhZywKKyAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihwb2ludFhtbC5nZXQoKSkpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXJ2ZVBvaW50cy5wdXNoX2JhY2soe3BvaW50WzBdLCBwb2ludFsxXX0pOworICAgICAgICB9CisgICAgfQorICAgIHZvbHVtZXMucHVzaF9iYWNrKHsgZGV2aWNlQ2F0ZWdvcnksIGN1cnZlUG9pbnRzIH0pOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgVm9sdW1lR3JvdXBUcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIENvbGxlY3Rpb24gJnZvbHVtZXMpCit7CisgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICBpbnQgaW5kZXhNaW4gPSAwOworICAgIGludCBpbmRleE1heCA9IDA7CisgICAgU3RyZWFtVmVjdG9yIHN0cmVhbXMgPSB7fTsKKyAgICBBdHRyaWJ1dGVzVmVjdG9yIGF0dHJpYnV0ZXNWZWN0ID0ge307CisKKyAgICBmb3IgKGNvbnN0IHhtbE5vZGUgKmNoaWxkID0gcm9vdC0+eG1sQ2hpbGRyZW5Ob2RlOyBjaGlsZCAhPSBOVUxMOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisgICAgICAgIGlmIChub3QgeG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKUF0dHJpYnV0ZXM6Om5hbWUpKSB7CisgICAgICAgICAgICB4bWxDaGFyVW5pcXVlIG5hbWVYbWwoeG1sTm9kZUxpc3RHZXRTdHJpbmcoZG9jLCBjaGlsZC0+eG1sQ2hpbGRyZW5Ob2RlLCAxKSwgeG1sRnJlZSk7CisgICAgICAgICAgICBpZiAobmFtZVhtbCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5hbWUgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihuYW1lWG1sLmdldCgpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobm90IHhtbFN0cmNtcChjaGlsZC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilBdHRyaWJ1dGVzOjppbmRleE1pbikpIHsKKyAgICAgICAgICAgIHhtbENoYXJVbmlxdWUgaW5kZXhNaW5YbWwoeG1sTm9kZUxpc3RHZXRTdHJpbmcoZG9jLCBjaGlsZC0+eG1sQ2hpbGRyZW5Ob2RlLCAxKSwgeG1sRnJlZSk7CisgICAgICAgICAgICBpZiAoaW5kZXhNaW5YbWwgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBpbmRleE1pbkxpdGVyYWwocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oaW5kZXhNaW5YbWwuZ2V0KCkpKTsKKyAgICAgICAgICAgIGlmICghY29udmVydFRvKGluZGV4TWluTGl0ZXJhbCwgaW5kZXhNaW4pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobm90IHhtbFN0cmNtcChjaGlsZC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilBdHRyaWJ1dGVzOjppbmRleE1heCkpIHsKKyAgICAgICAgICAgIHhtbENoYXJVbmlxdWUgaW5kZXhNYXhYbWwoeG1sTm9kZUxpc3RHZXRTdHJpbmcoZG9jLCBjaGlsZC0+eG1sQ2hpbGRyZW5Ob2RlLCAxKSwgeG1sRnJlZSk7CisgICAgICAgICAgICBpZiAoaW5kZXhNYXhYbWwgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBpbmRleE1heExpdGVyYWwocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oaW5kZXhNYXhYbWwuZ2V0KCkpKTsKKyAgICAgICAgICAgIGlmICghY29udmVydFRvKGluZGV4TWF4TGl0ZXJhbCwgaW5kZXhNYXgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBkZXNlcmlhbGl6ZUF0dHJpYnV0ZXNDb2xsZWN0aW9uKGRvYywgcm9vdCwgYXR0cmlidXRlc1ZlY3QpOworCisgICAgc3RkOjpzdHJpbmcgc3RyZWFtTmFtZXM7CisgICAgZm9yIChjb25zdCBhdXRvICZzdHJlYW0gOiBzdHJlYW1zKSB7CisgICAgICAgIHN0cmVhbU5hbWVzICs9IGFuZHJvaWQ6OnRvU3RyaW5nKHN0cmVhbSkgKyAiICI7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIGF0dHJtTmFtZXM7CisgICAgZm9yIChjb25zdCBhdXRvICZhdHRyIDogYXR0cmlidXRlc1ZlY3QpIHsKKyAgICAgICAgYXR0cm1OYW1lcyArPSBhbmRyb2lkOjp0b1N0cmluZyhhdHRyKSArICJcbiI7CisgICAgfQorICAgIEFMT0dWKCIlczogZ3JvdXA9JXMgaW5kZXhNaW49JWQsIGluZGV4TWF4PSVkIHN0cmVhbXM9JXMgYXR0cmlidXRlcz0lcyIsCisgICAgICAgICAgX19mdW5jX18sIG5hbWUuY19zdHIoKSwgaW5kZXhNaW4sIGluZGV4TWF4LCBzdHJlYW1OYW1lcy5jX3N0cigpLCBhdHRybU5hbWVzLmNfc3RyKCApKTsKKworICAgIFZvbHVtZUN1cnZlcyBncm91cFZvbHVtZUN1cnZlczsKKyAgICBzaXplX3Qgc2tpcHBlZCA9IDA7CisgICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPFZvbHVtZVRyYWl0cz4oZG9jLCByb290LCBncm91cFZvbHVtZUN1cnZlcywgc2tpcHBlZCk7CisgICAgdm9sdW1lcy5wdXNoX2JhY2soeyBuYW1lLCBpbmRleE1pbiwgaW5kZXhNYXgsIGdyb3VwVm9sdW1lQ3VydmVzIH0pOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpsZWdhY3lWb2x1bWVjb2xsZWN0aW9uVGFnID0gInZvbHVtZXMiOworc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpsZWdhY3lWb2x1bWVUYWcgPSAidm9sdW1lIjsKKworc3RhdHVzX3QgZGVzZXJpYWxpemVMZWdhY3lWb2x1bWUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFZvbHVtZUN1cnZlcz4gJmxlZ2FjeVZvbHVtZXMpCit7CisgICAgc3RkOjpzdHJpbmcgc3RyZWFtVHlwZUxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCAic3RyZWFtIik7CisgICAgaWYgKHN0cmVhbVR5cGVMaXRlcmFsLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBhdHRyaWJ1dGUgc3RyZWFtIGZvdW5kIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBkZXZpY2VDYXRlZ29yeUxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCAiZGV2aWNlQ2F0ZWdvcnkiKTsKKyAgICBpZiAoZGV2aWNlQ2F0ZWdvcnlMaXRlcmFsLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBhdHRyaWJ1dGUgZGV2aWNlQ2F0ZWdvcnkgZm91bmQiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHJlZmVyZW5jZU5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCAicmVmIik7CisgICAgY29uc3QgeG1sTm9kZSAqcmVmID0gTlVMTDsKKyAgICBpZiAoIXJlZmVyZW5jZU5hbWUuZW1wdHkoKSkgeworICAgICAgICBnZXRSZWZlcmVuY2UoeG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jKSwgcmVmLCByZWZlcmVuY2VOYW1lLCBsZWdhY3lWb2x1bWVjb2xsZWN0aW9uVGFnKTsKKyAgICAgICAgaWYgKHJlZiA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IE5vIHJlZmVyZW5jZSBQdHIgZm91bmQgZm9yICVzIiwgX19mdW5jX18sIHJlZmVyZW5jZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCIlczogcmVmZXJlbmNlIGZvdW5kIGZvciAlcyIsIF9fZnVuY19fLCByZWZlcmVuY2VOYW1lLmNfc3RyKCkpOworICAgIH0KKyAgICBDdXJ2ZVBvaW50cyBjdXJ2ZVBvaW50czsKKyAgICBmb3IgKGNvbnN0IHhtbE5vZGUgKmNoaWxkID0gcmVmZXJlbmNlTmFtZS5lbXB0eSgpID8KKyAgICAgICAgIGN1ci0+eG1sQ2hpbGRyZW5Ob2RlIDogcmVmLT54bWxDaGlsZHJlbk5vZGU7IGNoaWxkICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopVm9sdW1lVHJhaXRzOjp2b2x1bWVQb2ludFRhZykpIHsKKyAgICAgICAgICAgIHhtbENoYXJVbmlxdWUgcG9pbnRYbWwoeG1sTm9kZUxpc3RHZXRTdHJpbmcoZG9jLCBjaGlsZC0+eG1sQ2hpbGRyZW5Ob2RlLCAxKSwgeG1sRnJlZSk7CisgICAgICAgICAgICBpZiAocG9pbnRYbWwgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiJXM6ICVzPSVzIiwgX19mdW5jX18sIGxlZ2FjeVZvbHVtZVRhZywKKyAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHBvaW50WG1sLmdldCgpKSk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHBvaW50OworICAgICAgICAgICAgY29sbGVjdGlvbkZyb21TdHJpbmc8RGVmYXVsdFRyYWl0czxpbnQ+PigKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHBvaW50WG1sLmdldCgpKSwgcG9pbnQsICIsIik7CisgICAgICAgICAgICBpZiAocG9pbnQuc2l6ZSgpICE9IDIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgJXM6ICVzIiwgX19mdW5jX18sIFZvbHVtZVRyYWl0czo6dm9sdW1lUG9pbnRUYWcsCisgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocG9pbnRYbWwuZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY3VydmVQb2ludHMucHVzaF9iYWNrKHtwb2ludFswXSwgcG9pbnRbMV19KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBsZWdhY3lWb2x1bWVzW3N0cmVhbVR5cGVMaXRlcmFsXS5wdXNoX2JhY2soeyBkZXZpY2VDYXRlZ29yeUxpdGVyYWwsIGN1cnZlUG9pbnRzIH0pOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplTGVnYWN5Vm9sdW1lQ29sbGVjdGlvbihfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpjdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZUdyb3VwcyAmdm9sdW1lR3JvdXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgJm5iU2tpcHBlZEVsZW1lbnQpCit7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFZvbHVtZUN1cnZlcz4gbGVnYWN5Vm9sdW1lTWFwOworICAgIGZvciAoY3VyID0gY3VyLT54bWxDaGlsZHJlbk5vZGU7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICAgICAgaWYgKHhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopbGVnYWN5Vm9sdW1lY29sbGVjdGlvblRhZykpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IHhtbE5vZGUgKmNoaWxkID0gY3VyLT54bWxDaGlsZHJlbk5vZGU7CisgICAgICAgIGZvciAoOyBjaGlsZCAhPSBOVUxMOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisgICAgICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilsZWdhY3lWb2x1bWVUYWcpKSB7CisKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNlcmlhbGl6ZUxlZ2FjeVZvbHVtZShkb2MsIGNoaWxkLCBsZWdhY3lWb2x1bWVNYXApOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgbmJTa2lwcGVkRWxlbWVudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8gJnZvbHVtZU1hcEl0ZXIgOiBsZWdhY3lWb2x1bWVNYXApIHsKKyAgICAgICAgLy8gSW4gb3JkZXIgdG8gbGV0IEF1ZGlvU2VydmljZSBzZXR0aW5nIHRoZSBtaW4gYW5kIG1heCAoY29tcGF0aWJpbGl0eSksIHNldCBNaW4gYW5kIE1heAorICAgICAgICAvLyB0byAtMSBleGNlcHQgZm9yIHByaXZhdGUgc3RyZWFtcworICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGU7CisgICAgICAgIGlmICghU3RyZWFtVHlwZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyh2b2x1bWVNYXBJdGVyLmZpcnN0LCBzdHJlYW1UeXBlKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHN0cmVhbSAlcyIsIF9fZnVuY19fLCB2b2x1bWVNYXBJdGVyLmZpcnN0LmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBpbnQgaW5kZXhNaW4gPSBzdHJlYW1UeXBlID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UID8gMCA6IC0xOworICAgICAgICBpbnQgaW5kZXhNYXggPSBzdHJlYW1UeXBlID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UID8gMTAwIDogLTE7CisgICAgICAgIHZvbHVtZUdyb3Vwcy5wdXNoX2JhY2soeyB2b2x1bWVNYXBJdGVyLmZpcnN0LCBpbmRleE1pbiwgaW5kZXhNYXgsIHZvbHVtZU1hcEl0ZXIuc2Vjb25kIH0pOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK1BhcnNpbmdSZXN1bHQgcGFyc2UoY29uc3QgY2hhciogcGF0aCkgeworICAgIHhtbERvY1B0ciBkb2M7CisgICAgZG9jID0geG1sUGFyc2VGaWxlKHBhdGgpOworICAgIGlmIChkb2MgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBwYXJzZSBkb2N1bWVudCAlcyIsIF9fRlVOQ1RJT05fXywgcGF0aCk7CisgICAgICAgIHJldHVybiB7bnVsbHB0ciwgMH07CisgICAgfQorICAgIHhtbE5vZGVQdHIgY3VyID0geG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jKTsKKyAgICBpZiAoY3VyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgcGFyc2U6IGVtcHR5IGRvY3VtZW50ICVzIiwgX19GVU5DVElPTl9fLCBwYXRoKTsKKyAgICAgICAgeG1sRnJlZURvYyhkb2MpOworICAgICAgICByZXR1cm4ge251bGxwdHIsIDB9OworICAgIH0KKyAgICBpZiAoeG1sWEluY2x1ZGVQcm9jZXNzKGRvYykgPCAwKSB7CisgICAgICAgIEFMT0dFKCIlczogbGlieG1sIGZhaWxlZCB0byByZXNvbHZlIFhJbmNsdWRlcyBvbiBkb2N1bWVudCAlcyIsIF9fRlVOQ1RJT05fXywgcGF0aCk7CisgICAgICAgIHJldHVybiB7bnVsbHB0ciwgMH07CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHZlcnNpb24gPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBnVmVyc2lvbkF0dHJpYnV0ZSk7CisgICAgaWYgKHZlcnNpb24uZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIHZlcnNpb24gZm91bmQiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiB7bnVsbHB0ciwgMH07CisgICAgfQorICAgIHNpemVfdCBuYlNraXBwZWRFbGVtZW50cyA9IDA7CisgICAgYXV0byBjb25maWcgPSBzdGQ6Om1ha2VfdW5pcXVlPENvbmZpZz4oKTsKKyAgICBjb25maWctPnZlcnNpb24gPSBzdGQ6OnN0b2YodmVyc2lvbik7CisgICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPFByb2R1Y3RTdHJhdGVneVRyYWl0cz4oCisgICAgICAgICAgICAgICAgZG9jLCBjdXIsIGNvbmZpZy0+cHJvZHVjdFN0cmF0ZWdpZXMsIG5iU2tpcHBlZEVsZW1lbnRzKTsKKyAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248Q3JpdGVyaW9uVHJhaXRzPigKKyAgICAgICAgICAgICAgICBkb2MsIGN1ciwgY29uZmlnLT5jcml0ZXJpYSwgbmJTa2lwcGVkRWxlbWVudHMpOworICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxDcml0ZXJpb25UeXBlVHJhaXRzPigKKyAgICAgICAgICAgICAgICBkb2MsIGN1ciwgY29uZmlnLT5jcml0ZXJpb25UeXBlcywgbmJTa2lwcGVkRWxlbWVudHMpOworICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxWb2x1bWVHcm91cFRyYWl0cz4oCisgICAgICAgICAgICAgICAgZG9jLCBjdXIsIGNvbmZpZy0+dm9sdW1lR3JvdXBzLCBuYlNraXBwZWRFbGVtZW50cyk7CisKKyAgICByZXR1cm4ge3N0ZDo6bW92ZShjb25maWcpLCBuYlNraXBwZWRFbGVtZW50c307Cit9CisKK2FuZHJvaWQ6OnN0YXR1c190IHBhcnNlTGVnYWN5Vm9sdW1lRmlsZShjb25zdCBjaGFyKiBwYXRoLCBWb2x1bWVHcm91cHMgJnZvbHVtZUdyb3VwcykgeworICAgIHhtbERvY1B0ciBkb2M7CisgICAgZG9jID0geG1sUGFyc2VGaWxlKHBhdGgpOworICAgIGlmIChkb2MgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBwYXJzZSBkb2N1bWVudCAlcyIsIF9fRlVOQ1RJT05fXywgcGF0aCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHhtbE5vZGVQdHIgY3VyID0geG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jKTsKKyAgICBpZiAoY3VyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgcGFyc2U6IGVtcHR5IGRvY3VtZW50ICVzIiwgX19GVU5DVElPTl9fLCBwYXRoKTsKKyAgICAgICAgeG1sRnJlZURvYyhkb2MpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoeG1sWEluY2x1ZGVQcm9jZXNzKGRvYykgPCAwKSB7CisgICAgICAgIEFMT0dFKCIlczogbGlieG1sIGZhaWxlZCB0byByZXNvbHZlIFhJbmNsdWRlcyBvbiBkb2N1bWVudCAlcyIsIF9fRlVOQ1RJT05fXywgcGF0aCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHNpemVfdCBuYlNraXBwZWRFbGVtZW50cyA9IDA7CisgICAgcmV0dXJuIGRlc2VyaWFsaXplTGVnYWN5Vm9sdW1lQ29sbGVjdGlvbihkb2MsIGN1ciwgdm9sdW1lR3JvdXBzLCBuYlNraXBwZWRFbGVtZW50cyk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICprQ29uZmlnTG9jYXRpb25MaXN0W10gPSB7Ii9vZG0vZXRjIiwgIi92ZW5kb3IvZXRjIiwgIi9zeXN0ZW0vZXRjIn07CitzdGF0aWMgY29uc3QgaW50IGtDb25maWdMb2NhdGlvbkxpc3RTaXplID0KKyAgICAgICAgKHNpemVvZihrQ29uZmlnTG9jYXRpb25MaXN0KSAvIHNpemVvZihrQ29uZmlnTG9jYXRpb25MaXN0WzBdKSk7CitzdGF0aWMgY29uc3QgaW50IGdBcG1YbWxDb25maWdGaWxlUGF0aE1heExlbmd0aCA9IDEyODsKKworc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICphcG1YbWxDb25maWdGaWxlTmFtZSA9ICJhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiOworc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICphcG1BMmRwT2ZmbG9hZERpc2FibGVkWG1sQ29uZmlnRmlsZU5hbWUgPQorICAgICAgICAiYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fYTJkcF9vZmZsb2FkX2Rpc2FibGVkLnhtbCI7CisKK2FuZHJvaWQ6OnN0YXR1c190IHBhcnNlTGVnYWN5Vm9sdW1lcyhWb2x1bWVHcm91cHMgJnZvbHVtZUdyb3VwcykgeworICAgIGNoYXIgYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlW2dBcG1YbWxDb25maWdGaWxlUGF0aE1heExlbmd0aF07CisgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhciAqPiBmaWxlTmFtZXM7CisgICAgc3RhdHVzX3QgcmV0OworCisgICAgaWYgKHByb3BlcnR5X2dldF9ib29sKCJyby5ibHVldG9vdGguYTJkcF9vZmZsb2FkLnN1cHBvcnRlZCIsIGZhbHNlKSAmJgorICAgICAgICAgICAgcHJvcGVydHlfZ2V0X2Jvb2woInBlcnNpc3QuYmx1ZXRvb3RoLmEyZHBfb2ZmbG9hZC5kaXNhYmxlZCIsIGZhbHNlKSkgeworICAgICAgICAvLyBBMkRQIG9mZmxvYWQgc3VwcG9ydGVkIGJ1dCBkaXNhYmxlZDogdHJ5IHRvIHVzZSBzcGVjaWFsIFhNTCBmaWxlCisgICAgICAgIGZpbGVOYW1lcy5wdXNoX2JhY2soYXBtQTJkcE9mZmxvYWREaXNhYmxlZFhtbENvbmZpZ0ZpbGVOYW1lKTsKKyAgICB9CisgICAgZmlsZU5hbWVzLnB1c2hfYmFjayhhcG1YbWxDb25maWdGaWxlTmFtZSk7CisKKyAgICBmb3IgKGNvbnN0IGNoYXIqIGZpbGVOYW1lIDogZmlsZU5hbWVzKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0NvbmZpZ0xvY2F0aW9uTGlzdFNpemU7IGkrKykgeworICAgICAgICAgICAgc25wcmludGYoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlLCBzaXplb2YoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICIlcy8lcyIsIGtDb25maWdMb2NhdGlvbkxpc3RbaV0sIGZpbGVOYW1lKTsKKyAgICAgICAgICAgIHJldCA9IHBhcnNlTGVnYWN5Vm9sdW1lRmlsZShhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUsIHZvbHVtZUdyb3Vwcyk7CisgICAgICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCit9IC8vIG5hbWVzcGFjZSBlbmdpbmVDb25maWcKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZWE0MmI2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTkgQEAKKy8vIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGliYXVkaW9wb2xpY3llbmdpbmVfaW50ZXJmYWNlX2hlYWRlcnMiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmgKaW5kZXggMDQ1OTRmNS4uYjdmZDAzMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZS5oCkBAIC0xNyw3ICsxNywxMCBAQAogI3ByYWdtYSBvbmNlCiAKICNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlci5oPgotI2luY2x1ZGUgPFJvdXRpbmdTdHJhdGVneS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUHJvZHVjdFN0cmF0ZWd5Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Wb2x1bWVHcm91cC5oPgorI2luY2x1ZGUgPElWb2x1bWVDdXJ2ZXMuaD4KKyNpbmNsdWRlIDxwb2xpY3kuaD4KICNpbmNsdWRlIDxWb2x1bWUuaD4KICNpbmNsdWRlIDxId01vZHVsZS5oPgogI2luY2x1ZGUgPERldmljZURlc2NyaXB0b3IuaD4KQEAgLTI4LDYgKzMxLDEwIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgRGV2aWNlU3RyYXRlZ3lNYXAgPSBzdGQ6Om1hcDxwcm9kdWN0X3N0cmF0ZWd5X3QsIERldmljZVZlY3Rvcj47Cit1c2luZyBTdHJhdGVneVZlY3RvciA9IHN0ZDo6dmVjdG9yPHByb2R1Y3Rfc3RyYXRlZ3lfdD47Cit1c2luZyBWb2x1bWVHcm91cFZlY3RvciA9IHN0ZDo6dmVjdG9yPHZvbHVtZV9ncm91cF90PjsKKwogLyoqCiAgKiBUaGlzIGludGVyZmFjZSBpcyBkZWRpY2F0ZWQgdG8gdGhlIHBvbGljeSBtYW5hZ2VyIHRoYXQgYSBQb2xpY3kgRW5naW5lIHNoYWxsIGltcGxlbWVudC4KICAqLwpAQCAtNTAsNDIgKzU3LDYgQEAKICAgICB2aXJ0dWFsIHZvaWQgc2V0T2JzZXJ2ZXIoQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm9ic2VydmVyKSA9IDA7CiAKICAgICAvKioKLSAgICAgKiBHZXQgdGhlIGlucHV0IGRldmljZSBzZWxlY3RlZCBmb3IgYSBnaXZlbiBpbnB1dCBzb3VyY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIGlucHV0U291cmNlIHRvIGdldCB0aGUgc2VsZWN0ZWQgaW5wdXQgZGV2aWNlIGFzc29jaWF0ZWQgdG8KLSAgICAgKgotICAgICAqIEByZXR1cm4gc2VsZWN0ZWQgaW5wdXQgZGV2aWNlIGZvciB0aGUgZ2l2ZW4gaW5wdXQgc291cmNlLCBtYXkgYmUgbm9uZSBpZiBlcnJvci4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSkgY29uc3QgPSAwOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBvdXRwdXQgZGV2aWNlIGFzc29jaWF0ZWQgdG8gYSBnaXZlbiBzdHJhdGVneS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gc3RyZWFtIHR5cGUgZm9yIHdoaWNoIHRoZSBzZWxlY3RlZCBvdXB1dCBkZXZpY2UgaXMgcmVxdWVzdGVkLgotICAgICAqCi0gICAgICogQHJldHVybiBzZWxlY3RlZCBvdXB1dCBkZXZpY2UgZm9yIHRoZSBnaXZlbiBzdHJhdGVneSwgbWF5IGJlIG5vbmUgaWYgZXJyb3IuCi0gICAgICovCi0gICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdGF0ZWd5KSBjb25zdCA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHN0cmF0ZWd5IHNlbGVjdGVkIGZvciBhIGdpdmVuIHN0cmVhbSB0eXBlLgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSBzdHJlYW06IGZvciB3aGljaCB0aGUgc2VsZWN0ZWQgc3RyYXRlZ3kgZm9sbG93ZWQgYnkgaXMgcmVxdWVzdGVkLgotICAgICAqCi0gICAgICogQHJldHVybiBzdHJhdGVneSB0byBiZSBmb2xsb3dlZC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgc3RyYXRlZ3kgc2VsZWN0ZWQgZm9yIGEgZ2l2ZW4gdXNhZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHVzYWdlIHRvIGdldCB0aGUgc2VsZWN0ZWQgc3RyYXRlZ3kgZm9sbG93ZWQgYnkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHN0cmF0ZWd5IHRvIGJlIGZvbGxvd2VkLgotICAgICAqLwotICAgIHZpcnR1YWwgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneUZvclVzYWdlKGF1ZGlvX3VzYWdlX3QgdXNhZ2UpID0gMDsKLQotICAgIC8qKgogICAgICAqIFNldCB0aGUgVGVsZXBob255IE1vZGUuCiAgICAgICoKICAgICAgKiBAcGFyYW1baW5dIG1vZGU6IEFuZHJvaWQgUGhvbmUgc3RhdGUgKG5vcm1hbCwgcmluZ3RvbmUsIGNzdiwgaW4gY29tbXVuaWNhdGlvbikKQEAgLTEzMyw2ICsxMDQsMTk2IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpID0gMDsKIAorICAgIC8qKgorICAgICAqIEdldCB0aGUgc3RyYXRlZ3kgc2VsZWN0ZWQgZm9yIGEgZ2l2ZW4gYXVkaW8gYXR0cmlidXRlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gYXVkaW8gYXR0cmlidXRlcyB0byBnZXQgdGhlIHNlbGVjdGVkIEBwcm9kdWN0X3N0cmF0ZWd5X3QgZm9sbG93ZWQgYnkuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIEBwcm9kdWN0X3N0cmF0ZWd5X3QgdG8gYmUgZm9sbG93ZWQuCisgICAgICovCisgICAgdmlydHVhbCBwcm9kdWN0X3N0cmF0ZWd5X3QgZ2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcygKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzIHJldHJpZXZlcyB0aGUgZGV2aWNlcyB0byBiZSB1c2VkIGZvciBnaXZlbgorICAgICAqIGF1ZGlvIGF0dHJpYnV0ZXMuCisgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgb2YgdGhlIG91dHB1dCByZXF1ZXN0aW5nIERldmljZShzKSBzZWxlY3Rpb24KKyAgICAgKiBAcGFyYW0gcHJlZmVyZWREZXZpY2UgdmFsaWQgcmVmZXJlbmNlIGlmIGEgcHJlZmVyZWQgZGV2aWNlIGlzIHJlcXVlc3RlZCwgbnVsbHB0ciBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIGZyb21DYWNoZSBpZiB0cnVlLCB0aGUgZGV2aWNlIGlzIHJldHVybmVkIGZyb20gaW50ZXJuYWwgY2FjaGUsCisgICAgICogICAgICAgICAgICAgICAgICBvdGhlcndpc2UgaXQgaXMgZGV0ZXJtaW5lZCBieSBjdXJyZW50IHN0YXRlIChkZXZpY2UgY29ubmVjdGVkLHBob25lIHN0YXRlLAorICAgICAqICAgICAgICAgICAgICAgICAgZm9yY2UgdXNlLCBhMmRwIG91dHB1dC4uLikKKyAgICAgKiBAcmV0dXJuIHZlY3RvciBvZiBzZWxlY3RlZCBkZXZpY2UgZGVzY3JpcHRvcnMuCisgICAgICogICAgICAgICBBcHByb3ByaWF0ZSBkZXZpY2UgZm9yIHN0cmVhbXMgaGFuZGxlZCBieSB0aGUgc3BlY2lmaWVkIGF1ZGlvIGF0dHJpYnV0ZXMgYWNjb3JkaW5nCisgICAgICogICAgICAgICB0byBjdXJyZW50IHBob25lIHN0YXRlLCBmb3JjZWQgc3RhdGVzLCBjb25uZWN0ZWQgZGV2aWNlcy4uLgorICAgICAqICAgICAgICAgaWYgZnJvbUNhY2hlIGlzIHRydWUsIHRoZSBkZXZpY2UgaXMgcmV0dXJuZWQgZnJvbSBpbnRlcm5hbCBjYWNoZSwKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZSBpdCBpcyBkZXRlcm1pbmVkIGJ5IGN1cnJlbnQgc3RhdGUgKGRldmljZSBjb25uZWN0ZWQscGhvbmUgc3RhdGUsIGZvcmNlIHVzZSwKKyAgICAgKiAgICAgICAgIGEyZHAgb3V0cHV0Li4uKQorICAgICAqIFRoaXMgYWxsb3dzIHRvOgorICAgICAqICAgICAgMSBzcGVlZCB1cCBwcm9jZXNzIHdoZW4gdGhlIHN0YXRlIGlzIHN0YWJsZSAod2hlbiBzdGFydGluZyBvciBzdG9wcGluZyBhbiBvdXRwdXQpCisgICAgICogICAgICAyIGFjY2VzcyB0byBlaXRoZXIgY3VycmVudCBkZXZpY2Ugc2VsZWN0aW9uIChmcm9tQ2FjaGUgPT0gdHJ1ZSkgb3IKKyAgICAgKiAgICAgICJmdXR1cmUiIGRldmljZSBzZWxlY3Rpb24gKGZyb21DYWNoZSA9PSBmYWxzZSkgd2hlbiBjYWxsZWQgZnJvbSBhIGNvbnRleHQKKyAgICAgKiAgICAgIHdoZXJlIGNvbmRpdGlvbnMgYXJlIGNoYW5naW5nIChzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSwgc2V0UGhvbmVTdGF0ZSgpLi4uKSBBTkQKKyAgICAgKiAgICAgIGJlZm9yZSBtYW5hZ2VyIHVwZGF0ZXMgaXRzIG91dHB1dHMuCisgICAgICovCisgICAgdmlydHVhbCBEZXZpY2VWZWN0b3IgZ2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoCisgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMsCisgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmcHJlZmVyZWREZXZpY2UgPSBudWxscHRyLAorICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUgPSBmYWxzZSkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldE91dHB1dERldmljZXNGb3JTdHJlYW0gTGVnYWN5IGZ1bmN0aW9uIHJldHJpZXZpbmcgZGV2aWNlcyBmcm9tIGEgc3RyZWFtIHR5cGUuCisgICAgICogQHBhcmFtIHN0cmVhbSB0eXBlIG9mIHRoZSBvdXRwdXQgcmVxdWVzdGluZyBEZXZpY2Uocykgc2VsZWN0aW9uCisgICAgICogQHBhcmFtIGZyb21DYWNoZSBpZiB0cnVlLCB0aGUgZGV2aWNlIGlzIHJldHVybmVkIGZyb20gaW50ZXJuYWwgY2FjaGUsCisgICAgICogICAgICAgICAgICAgICAgICBvdGhlcndpc2UgaXQgaXMgZGV0ZXJtaW5lZCBieSBjdXJyZW50IHN0YXRlIChkZXZpY2UgY29ubmVjdGVkLHBob25lIHN0YXRlLAorICAgICAqICAgICAgICAgICAgICAgICAgZm9yY2UgdXNlLCBhMmRwIG91dHB1dC4uLikKKyAgICAgKiBAcmV0dXJuIGFwcHJvcHJpYXRlIGRldmljZSBmb3Igc3RyZWFtcyBoYW5kbGVkIGJ5IHRoZSBzcGVjaWZpZWQgYXVkaW8gYXR0cmlidXRlcyBhY2NvcmRpbmcKKyAgICAgKiAgICAgICAgIHRvIGN1cnJlbnQgcGhvbmUgc3RhdGUsIGZvcmNlZCBzdGF0ZXMsIGNvbm5lY3RlZCBkZXZpY2VzLi4uCisgICAgICogICAgICAgICBpZiBmcm9tQ2FjaGUgaXMgdHJ1ZSwgdGhlIGRldmljZSBpcyByZXR1cm5lZCBmcm9tIGludGVybmFsIGNhY2hlLAorICAgICAqICAgICAgICAgb3RoZXJ3aXNlIGl0IGlzIGRldGVybWluZWQgYnkgY3VycmVudCBzdGF0ZSAoZGV2aWNlIGNvbm5lY3RlZCxwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLAorICAgICAqICAgICAgICAgYTJkcCBvdXRwdXQuLi4pCisgICAgICogVGhpcyBhbGxvd3MgdG86CisgICAgICogICAgICAxIHNwZWVkIHVwIHByb2Nlc3Mgd2hlbiB0aGUgc3RhdGUgaXMgc3RhYmxlICh3aGVuIHN0YXJ0aW5nIG9yIHN0b3BwaW5nIGFuIG91dHB1dCkKKyAgICAgKiAgICAgIDIgYWNjZXNzIHRvIGVpdGhlciBjdXJyZW50IGRldmljZSBzZWxlY3Rpb24gKGZyb21DYWNoZSA9PSB0cnVlKSBvcgorICAgICAqICAgICAgImZ1dHVyZSIgZGV2aWNlIHNlbGVjdGlvbiAoZnJvbUNhY2hlID09IGZhbHNlKSB3aGVuIGNhbGxlZCBmcm9tIGEgY29udGV4dAorICAgICAqICAgICAgd2hlcmUgY29uZGl0aW9ucyBhcmUgY2hhbmdpbmcgKHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpLCBzZXRQaG9uZVN0YXRlKCkuLi4pIEFORAorICAgICAqICAgICAgYmVmb3JlIG1hbmFnZXIgdXBkYXRlcyBpdHMgb3V0cHV0cy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIERldmljZVZlY3RvciBnZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUgPSBmYWxzZSkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBpbnB1dCBkZXZpY2Ugc2VsZWN0ZWQgZm9yIGdpdmVuIGF1ZGlvIGF0dHJpYnV0ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGF0dHIgYXVkaW8gYXR0cmlidXRlcyB0byBjb25zaWRlcgorICAgICAqIEBwYXJhbVtvdXRdIG1peCB0byBiZSB1c2VkIGlmIGEgbWl4IGhhcyBiZWVuIGluc3RhbGxlZCBmb3IgdGhlIGdpdmVuIGF1ZGlvIGF0dHJpYnV0ZXMuCisgICAgICogQHJldHVybiBzZWxlY3RlZCBpbnB1dCBkZXZpY2UgZm9yIHRoZSBhdWRpbyBhdHRyaWJ1dGVzLCBtYXkgYmUgbnVsbCBpZiBlcnJvci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHNwPERldmljZURlc2NyaXB0b3I+IGdldElucHV0RGV2aWNlRm9yQXR0cmlidXRlcygKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgc3A8QXVkaW9Qb2xpY3lNaXg+ICptaXggPSBudWxscHRyKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIGxlZ2FjeSBzdHJlYW0gdHlwZSBmb3IgYSBnaXZlbiBhdWRpbyBhdHRyaWJ1dGVzLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBhdWRpbyBhdHRyaWJ1dGVzIHRvIGdldCB0aGUgYXNzb2NpYXRlZCBhdWRpb19zdHJlYW1fdHlwZV90LgorICAgICAqCisgICAgICogQHJldHVybiBhdWRpb19zdHJlYW1fdHlwZV90IGFzc29jaWF0ZWQgdG8gdGhlIGF0dHJpYnV0ZXMuCisgICAgICovCisgICAgdmlydHVhbCBhdWRpb19zdHJlYW1fdHlwZV90IGdldFN0cmVhbVR5cGVGb3JBdHRyaWJ1dGVzKAorICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0QXR0cmlidXRlc0ZvclN0cmVhbSBnZXQgdGhlIGF1ZGlvIGF0dHJpYnV0ZXMgZnJvbSBsZWdhY3kgc3RyZWFtIHR5cGUKKyAgICAgKiBBdHRyaWJ1dGVzIHJldHVybmVkIG1pZ2h0IG9ubHkgYmUgdXNlZCB0byBjaGVjayB1cG9uIHJvdXRpbmcgZGVjaXNpb24sIG5vdCB2b2x1bWUgZGVjaXNpb25zLgorICAgICAqIEBwYXJhbSBzdHJlYW0gdG8gY29uc2lkZXIKKyAgICAgKiBAcmV0dXJuIGF1ZGlvIGF0dHJpYnV0ZXMgbWF0Y2hpbmcgdGhlIGxlZ2FjeSBzdHJlYW0gdHlwZQorICAgICAqLworICAgIHZpcnR1YWwgYXVkaW9fYXR0cmlidXRlc190IGdldEF0dHJpYnV0ZXNGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0U3RyZWFtVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kgcmV0cmlldmVzIHRoZSBsaXN0IG9mIGxlZ2FjeSBzdHJlYW0gdHlwZSBmb2xsb3dpbmcKKyAgICAgKiB0aGUgZ2l2ZW4gcHJvZHVjdCBzdHJhdGVneQorICAgICAqIEBwYXJhbSBwcyBwcm9kdWN0IHN0cmF0ZWd5IHRvIGNvbnNpZGVyCisgICAgICogQHJldHVybiBhc3NvY2lhdGVkIGxlZ2FjeSBTdHJlYW0gVHlwZXMgdmVjdG9yIG9mIHRoZSBnaXZlbiBwcm9kdWN0IHN0cmF0ZWd5CisgICAgICovCisgICAgdmlydHVhbCBTdHJlYW1UeXBlVmVjdG9yIGdldFN0cmVhbVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcykgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldEFsbEF0dHJpYnV0ZXNGb3JQcm9kdWN0U3RyYXRlZ3kgcmV0cmlldmVzIGFsbCB0aGUgYXR0cmlidXRlcyBmb2xsb3dpbmcgdGhlIGdpdmVuCisgICAgICogcHJvZHVjdCBzdHJhdGVneS4gQW55IGF0dHJpYnV0ZXMgdGhhdCAibWF0Y2hlcyIgd2l0aCB0aGlzIG9uZSB3aWxsIGZvbGxvdyB0aGUgcHJvZHVjdAorICAgICAqIHN0cmF0ZWd5LgorICAgICAqICJtYXRjaGluZyIgbWVhbnMgdGhlIHVzYWdlIHNoYWxsIG1hdGNoIGlmIHJlZmVyZW5jZSBhdHRyaWJ1dGVzIGhhcyBhIGRlZmluZWQgdXNhZ2UsIEFORAorICAgICAqIGNvbnRlbnQgdHlwZSBzaGFsbCBtYXRjaCBpZiByZWZlcmVuY2UgYXR0cmlidXRlcyBoYXMgYSBkZWZpbmVkIGNvbnRlbnQgdHlwZSBBTkQKKyAgICAgKiBmbGFncyBzaGFsbCBtYXRjaCBpZiByZWZlcmVuY2UgYXR0cmlidXRlcyBoYXMgZGVmaW5lZCBmbGFncyBBTkQKKyAgICAgKiB0YWdzIHNoYWxsIG1hdGNoIGlmIHJlZmVyZW5jZSBhdHRyaWJ1dGVzIGhhcyBkZWZpbmVkIHRhZ3MuCisgICAgICogQHBhcmFtIHBzIHByb2R1Y3Qgc3RyYXRlZ3kgdG8gY29uc2lkZXIKKyAgICAgKiBAcmV0dXJuIHZlY3RvciBvZiBwcm9kdWN0IHN0cmF0ZWd5IGlkcywgZW1wdHkgaWYgdW5rbm93biBzdHJhdGVneS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIEF0dHJpYnV0ZXNWZWN0b3IgZ2V0QWxsQXR0cmlidXRlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3QgcHMpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRPcmRlcmVkQXVkaW9Qcm9kdWN0U3RyYXRlZ2llcworICAgICAqIEByZXR1cm4gcHJpb3JpdHkgb3JkZXJlZCBwcm9kdWN0IHN0cmF0ZWdpZXMgdG8gaGVscCB0aGUgQXVkaW9Qb2xpY3lNYW5hZ2VyIGV2YWx1YXRpbmcgdGhlCisgICAgICogZGV2aWNlIHNlbGVjdGlvbiBwZXIgb3V0cHV0IGFjY29yZGluZyB0byB0aGUgcHJpb3JpdGl6ZWQgc3RyYXRlZ2llcy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIFN0cmF0ZWd5VmVjdG9yIGdldE9yZGVyZWRQcm9kdWN0U3RyYXRlZ2llcygpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiB1cGRhdGVEZXZpY2VTZWxlY3Rpb25DYWNoZS4gRGV2aWNlIHNlbGVjdGlvbiBmb3IgQXVkaW9BdHRyaWJ1dGUgLyBTdHJlYW1zIGlzIGNhY2hlZAorICAgICAqIGluIHRoZSBlbmdpbmUgaW4gb3JkZXIgdG8gc3BlZWQgdXAgcHJvY2VzcyB3aGVuIHRoZSBhdWRpbyBzeXN0ZW0gaXMgc3RhYmxlLgorICAgICAqIFdoZW4gYSBkZXZpY2UgaXMgY29ubmVjdGVkLCB0aGUgYW5kcm9pZCBtb2RlIGlzIGNoYW5nZWQsIGVuZ2luZSBpcyBub3RpZmllZCBhbmQgY2FuIHVwZGF0ZQorICAgICAqIHRoZSBjYWNoZS4KKyAgICAgKiBXaGVuIHN0YXJ0aW5nIC8gc3RvcHBpbmcgYW4gb3V0cHV0IHdpdGggYSBzdHJlYW0gdGhhdCBjYW4gYWZmZWN0IG5vdGlmaWNhdGlvbiwgdGhlIGVuZ2luZQorICAgICAqIG5lZWRzIHRvIHVwZGF0ZSB0aGUgY2FjaGUgdXBvbiB0aGlzIGZ1bmN0aW9uIGNhbGwuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZURldmljZVNlbGVjdGlvbkNhY2hlKCkgPSAwOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzLiBJbnRyb3NwZWN0aW9uIEFQSSB0byByZXRyaWV2ZSBhIGNvbGxlY3Rpb24gb2YKKyAgICAgKiBBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciB0aGF0IGFsbG93cyB0byBidWlsZCBBdWRpb0F0dHJpYnV0ZXMgYWNjb3JkaW5nIHRvIGEKKyAgICAgKiBwcm9kdWN0X3N0cmF0ZWd5IHdoaWNoIGlzIGp1c3QgYW4gaW5kZXguIEl0IGhhcyBhbHNvIGEgaHVtYW4gcmVhZGFibGUgbmFtZSB0byBoZWxwIHRoZQorICAgICAqIENhci9PZW0vQXVkaW9NYW5hZ2VyIGlkZW50aXlpbmcgdGhlIHVzZSBjYXNlLgorICAgICAqIEBwYXJhbSBzdHJhdGVnaWVzIGNvbGxlY3Rpb24uCisgICAgICogQHJldHVybiBPSyBpZiB0aGUgbGlzdCBoYXMgYmVlbiByZXRyaWV2ZWQsIGVycm9yIGNvZGUgb3RoZXJ3aXNlCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciAmc3RyYXRlZ2llcykgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldFZvbHVtZUN1cnZlc0ZvckF0dHJpYnV0ZXMgcmV0cmlldmVzIHRoZSBWb2x1bWUgQ3VydmVzIGludGVyZmFjZSBmb3IgdGhlCisgICAgICogICAgICAgIHJlcXVlc3RlZCBBdWRpbyBBdHRyaWJ1dGVzLgorICAgICAqIEBwYXJhbSBhdHRyIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcmV0dXJuIElWb2x1bWVDdXJ2ZXMgaW50ZXJmYWNlIHBvaW50ZXIgaWYgZm91bmQsIG51bGxwdHIgb3RoZXJ3aXNlCisgICAgICovCisgICAgdmlydHVhbCBJVm9sdW1lQ3VydmVzICpnZXRWb2x1bWVDdXJ2ZXNGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldFZvbHVtZUN1cnZlc0ZvclN0cmVhbVR5cGUgcmV0cmlldmVzIHRoZSBWb2x1bWUgQ3VydmVzIGludGVyZmFjZSBmb3IgdGhlIHN0cmVhbQorICAgICAqIEBwYXJhbSBzdHJlYW0gdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEByZXR1cm4gSVZvbHVtZUN1cnZlcyBpbnRlcmZhY2UgcG9pbnRlciBpZiBmb3VuZCwgbnVsbHB0ciBvdGhlcndpc2UKKyAgICAgKi8KKyAgICB2aXJ0dWFsIElWb2x1bWVDdXJ2ZXMgKmdldFZvbHVtZUN1cnZlc0ZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRWb2x1bWVDdXJ2ZXNGb3JWb2x1bWVHcm91cCByZXRyaWV2ZXMgdGhlIFZvbHVtZSBDdXJ2ZXMgaW50ZXJmYWNlIGZvciB2b2x1bWUgZ3JvdXAKKyAgICAgKiBAcGFyYW0gZ3JvdXAgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEByZXR1cm4gSVZvbHVtZUN1cnZlcyBpbnRlcmZhY2UgcG9pbnRlciBpZiBmb3VuZCwgbnVsbHB0ciBvdGhlcndpc2UKKyAgICAgKi8KKyAgICB2aXJ0dWFsIElWb2x1bWVDdXJ2ZXMgKmdldFZvbHVtZUN1cnZlc0ZvclZvbHVtZUdyb3VwKHZvbHVtZV9ncm91cF90IGdyb3VwKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0Vm9sdW1lR3JvdXBzIHJldHJpZXZlcyB0aGUgY29sbGVjdGlvbiBvZiB2b2x1bWUgZ3JvdXBzLgorICAgICAqIEByZXR1cm4gdmVjdG9yIG9mIHZvbHVtZSBncm91cHMKKyAgICAgKi8KKyAgICB2aXJ0dWFsIFZvbHVtZUdyb3VwVmVjdG9yIGdldFZvbHVtZUdyb3VwcygpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRWb2x1bWVHcm91cEZvckF0dHJpYnV0ZXMgZ2V0cyB0aGUgYXBwcm9wcmlhdGUgdm9sdW1lIGdyb3VwIHRvIGJlIHVzZWQgZm9yIGEgZ2l2ZW4KKyAgICAgKiBBdWRpbyBBdHRyaWJ1dGVzLgorICAgICAqIEBwYXJhbSBhdHRyIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcmV0dXJuIHZvbHVtZSBncm91cCBhc3NvY2lhdGVkIHRvIHRoZSBnaXZlbiBhdWRpbyBhdHRyaWJ1dGVzLCBkZWZhdWx0IGdyb3VwIGlmIG5vbmUKKyAgICAgKiBhcHBsaWNhYmxlLCBWT0xVTUVfR1JPVVBfTk9ORSBpZiBubyBkZWZhdWx0IGdyb3VwIGRlZmluZWQuCisgICAgICovCisgICAgdmlydHVhbCB2b2x1bWVfZ3JvdXBfdCBnZXRWb2x1bWVHcm91cEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlIGdldHMgdGhlIGFwcHJvcHJpYXRlIHZvbHVtZSBncm91cCB0byBiZSB1c2VkIGZvciBhIGdpdmVuCisgICAgICogbGVnYWN5IHN0cmVhbSB0eXBlCisgICAgICogQHBhcmFtIHN0cmVhbSB0eXBlIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcmV0dXJuIHZvbHVtZSBncm91cCBhc3NvY2lhdGVkIHRvIHRoZSBnaXZlbiBzdHJlYW0gdHlwZSwgZGVmYXVsdCBncm91cCBpZiBub25lIGFwcGxpY2FibGUsCisgICAgICogVk9MVU1FX0dST1VQX05PTkUgaWYgbm8gZGVmYXVsdCBncm91cCBkZWZpbmVkLgorICAgICAqLworICAgIHZpcnR1YWwgdm9sdW1lX2dyb3VwX3QgZ2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgbGlzdEF1ZGlvVm9sdW1lR3JvdXBzIGludHJvc3BlY3Rpb24gQVBJIHRvIGdldCB0aGUgQXVkaW8gVm9sdW1lIEdyb3VwcywgYWthCisgICAgICogZm9ybWVyIHN0cmVhbSBhbGlhc2VzIGluIEF1ZGlvIFNlcnZpY2UsIGRlZmluaW5nIHZvbHVtZSBjdXJ2ZXMgYXR0YWNoZWQgdG8gb25lIG9yIG1vcmUKKyAgICAgKiBBdWRpbyBBdHRyaWJ1dGVzLgorICAgICAqIEBwYXJhbSBncm91cHMKKyAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIHRoZSB2b2x1bWUgZ3JvdXBzIHdlcmUgcmV0cmlldmVkIHN1Y2Nlc3NmdWxseSwgZXJyb3IgY29kZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1ZvbHVtZUdyb3VwcyhBdWRpb1ZvbHVtZUdyb3VwVmVjdG9yICZncm91cHMpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3QgPSAwOworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlKCkge30KIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyLmgKaW5kZXggYjc5MDJjZi4uZWJkODJhNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIuaApAQCAtMTYsNyArMTYsNiBAQAogCiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUgPElWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uLmg+CiAjaW5jbHVkZSA8QXVkaW9HYWluLmg+CiAjaW5jbHVkZSA8QXVkaW9Qb3J0Lmg+CiAjaW5jbHVkZSA8QXVkaW9QYXRjaC5oPgpAQCAtNDcsMTEgKzQ2LDkgQEAKIAogICAgIHZpcnR1YWwgY29uc3QgQXVkaW9JbnB1dENvbGxlY3Rpb24gJmdldElucHV0cygpIGNvbnN0ID0gMDsKIAotICAgIHZpcnR1YWwgY29uc3QgRGV2aWNlVmVjdG9yICZnZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgY29uc3QgRGV2aWNlVmVjdG9yIGdldEF2YWlsYWJsZU91dHB1dERldmljZXMoKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIGNvbnN0IERldmljZVZlY3RvciAmZ2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKCkgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCBJVm9sdW1lQ3VydmVzQ29sbGVjdGlvbiAmZ2V0Vm9sdW1lQ3VydmVzKCkgPSAwOworICAgIHZpcnR1YWwgY29uc3QgRGV2aWNlVmVjdG9yIGdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpIGNvbnN0ID0gMDsKIAogICAgIHZpcnR1YWwgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmdldERlZmF1bHRPdXRwdXREZXZpY2UoKSBjb25zdCA9IDA7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI3ZGM4OAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDQgQEAKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5ZW5naW5lY29uZmlndXJhYmxlX2ludGVyZmFjZV9oZWFkZXJzIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImludGVyZmFjZSJdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5ZW5naW5lY29uZmlndXJhYmxlIiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJzcmMvRW5naW5lLmNwcCIsCisgICAgICAgICJzcmMvRW5naW5lSW5zdGFuY2UuY3BwIiwKKyAgICAgICAgInNyYy9TdHJlYW0uY3BwIiwKKyAgICAgICAgInNyYy9JbnB1dFNvdXJjZS5jcHAiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgIF0sCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5Y29tbW9uIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5ZW5naW5lX2ludGVyZmFjZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5ZW5naW5lY29uZmlndXJhYmxlX2ludGVyZmFjZV9oZWFkZXJzIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMiLAorICAgICAgICAibGliYXVkaW9wb2xpY3llbmdpbmVfY29tbW9uIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5ZW5naW5lX2NvbmZpZyIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYWJsZV9wZnd3cmFwcGVyIiwKKworICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5IiwKKyAgICAgICAgImxpYnBhcmFtZXRlciIsCisgICAgICAgICJsaWJ4bWwyIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzIxMDVlOS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLWlmZXEgKCQoVVNFX0NPTkZJR1VSQUJMRV9BVURJT19QT0xJQ1kpLCAxKQotCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLSMgQ29tcG9uZW50IGJ1aWxkCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSAgICBzcmMvRW5naW5lLmNwcCBcCi0gICAgc3JjL0VuZ2luZUluc3RhbmNlLmNwcCBcCi0gICAgc3JjL1N0cmVhbS5jcHAgXAotICAgIHNyYy9TdHJhdGVneS5jcHAgXAotICAgIHNyYy9Vc2FnZS5jcHAgXAotICAgIHNyYy9JbnB1dFNvdXJjZS5jcHAgXAotCi1hdWRpb19wb2xpY3lfZW5naW5lX2luY2x1ZGVzX2NvbW1vbiA6PSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UKLQotTE9DQUxfQ0ZMQUdTICs9IFwKLSAgICAtV2FsbCBcCi0gICAgLVdlcnJvciBcCi0gICAgLVdleHRyYSBcCi0KLUxPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSBcCi0gICAgJChhdWRpb19wb2xpY3lfZW5naW5lX2luY2x1ZGVzX2NvbW1vbikKLQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChhdWRpb19wb2xpY3lfZW5naW5lX2luY2x1ZGVzX2NvbW1vbikgXAotICAgICQoVEFSR0VUX09VVF9IRUFERVJTKS9odyBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGZyYW1ld29ya3MtYXYpIFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlCi0KLUxPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCi0KLUxPQ0FMX01PRFVMRSA6PSBsaWJhdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYWJsZQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgbGliYXVkaW9wb2xpY3lwZnd3cmFwcGVyIFwKLSAgICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGlibG9nIFwKLSAgICBsaWJjdXRpbHMgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJsb2cgXAotICAgIGxpYmF1ZGlvdXRpbHMgXAotICAgIGxpYnBhcmFtZXRlciBcCi0gICAgbGlibWVkaWFfaGVscGVyIFwKLSAgICBsaWJ4bWwyCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgUmVjdXJzaXZlIGNhbGwgc3ViLWZvbGRlciBBbmRyb2lkLm1rCi0jCi1pbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCi0KLWVuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZjFhOTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvQW5kcm9pZC5tawpAQCAtMCwwICsxLDE1MSBAQAorTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitpZmRlZiBCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OCisKK1RPT0xTIDo9IGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzCitQUk9WSVNJT05fQ1JJVEVSSU9OX1RZUEVTIDo9ICQoVE9PTFMpL3Byb3Zpc2lvbl9jcml0ZXJpb25fdHlwZXNfZnJvbV9hbmRyb2lkX2hlYWRlcnMubWsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENPTkZJR1VSQVRJT04gVE9QIEZJTEUKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLCBwaG9uZV9jb25maWd1cmFibGUpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGF1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfU1JDX0ZJTEVTIDo9IHBob25lLyQoTE9DQUxfTU9EVUxFKQorCitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwgIFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX3N0cmVhbV92b2x1bWVzLnhtbCBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9kZWZhdWx0X3N0cmVhbV92b2x1bWVzLnhtbCBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpYS54bWwgXAorICAgIGF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzLnhtbAorCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGF1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfU1JDX0ZJTEVTIDo9IHBob25lLyQoTE9DQUxfTU9EVUxFKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX3N0cmVhbV92b2x1bWVzLnhtbAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfU1JDX0ZJTEVTIDo9IHBob25lLyQoTE9DQUxfTU9EVUxFKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX2RlZmF1bHRfc3RyZWFtX3ZvbHVtZXMueG1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9TUkNfRklMRVMgOj0gcGhvbmUvJChMT0NBTF9NT0RVTEUpCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKK2VuZGlmICMgaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwgcGhvbmVfY29uZmlndXJhYmxlKQorCisKK2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksJChmaWx0ZXIgJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSxhdXRvbW90aXZlX2NvbmZpZ3VyYWJsZSBjYXJlbXVfY29uZmlndXJhYmxlKSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIEFVVE9NT1RJVkUgQ09ORklHVVJBVElPTiBUT1AgRklMRQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9TUkNfRklMRVMgOj0gYXV0b21vdGl2ZS8kKExPQ0FMX01PRFVMRSkKKworTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sIFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhLnhtbCBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sIFwKKyAgICBhdWRpb19wb2xpY3lfZW5naW5lX3ZvbHVtZXMueG1sCisKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworZW5kaWYgI2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksJChmaWx0ZXIgJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSxhdXRvbW90aXZlX2NvbmZpZ3VyYWJsZSBjYXJlbXVfY29uZmlndXJhYmxlKSkKKworaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwgYXV0b21vdGl2ZV9jb25maWd1cmFibGUpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDT05GSUdVUkFUSU9OIEZJTEVTCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9TUkNfRklMRVMgOj0gYXV0b21vdGl2ZS8kKExPQ0FMX01PRFVMRSkKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gYXVkaW9fcG9saWN5X2VuZ2luZV92b2x1bWVzLnhtbAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfU1JDX0ZJTEVTIDo9IGF1dG9tb3RpdmUvJChMT0NBTF9NT0RVTEUpCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKK2VuZGlmICNpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLCBhdXRvbW90aXZlX2NvbmZpZ3VyYWJsZSkKKworaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwgY2FyZW11X2NvbmZpZ3VyYWJsZSkKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENPTkZJR1VSQVRJT04gRklMRVMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX1NSQ19GSUxFUyA6PSBjYXJlbXUvJChMT0NBTF9NT0RVTEUpCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IGF1ZGlvX3BvbGljeV9lbmdpbmVfdm9sdW1lcy54bWwKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX1NSQ19GSUxFUyA6PSBjYXJlbXUvJChMT0NBTF9NT0RVTEUpCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCisKK2VuZGlmICNpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLCBjYXJlbXVfY29uZmlndXJhYmxlKQorCitpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLCQoZmlsdGVyICQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTikscGhvbmVfY29uZmlndXJhYmxlIGF1dG9tb3RpdmVfY29uZmlndXJhYmxlIGNhcmVtdV9jb25maWd1cmFibGUpKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhLnhtbAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfU1JDX0ZJTEVTIDo9IGNvbW1vbi8kKExPQ0FMX01PRFVMRSkKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS9wcmltYXJ5X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAorQU5EUk9JRF9BVURJT19CQVNFX0hFQURFUl9GSUxFIDo9IHN5c3RlbS9tZWRpYS9hdWRpby9pbmNsdWRlL3N5c3RlbS9hdWRpby1iYXNlLmgKK0FVRElPX1BPTElDWV9DT05GSUdVUkFUSU9OX0ZJTEUgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUl9FVEMpL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAorQ1JJVEVSSU9OX1RZUEVTX0ZJTEUgOj0gJChMT0NBTF9QQVRIKS9jb21tb24vJChMT0NBTF9NT0RVTEUpLmluCisKK2luY2x1ZGUgJChQUk9WSVNJT05fQ1JJVEVSSU9OX1RZUEVTKQorCitlbmRpZiAjaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwkKGZpbHRlciAkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLHBob25lX2NvbmZpZ3VyYWJsZSBhdXRvbW90aXZlX2NvbmZpZ3VyYWJsZSBjYXJlbXVfY29uZmlndXJhYmxlKSkKKworZW5kaWYgI2lmZGVmIEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9hdXRvbW90aXZlL2F1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvYXV0b21vdGl2ZS9hdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YTE0MGEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvYXV0b21vdGl2ZS9hdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sCkBAIC0wLDAgKzEsMjUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgICAgIC0tPgorCis8Y29uZmlndXJhdGlvbiB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KKworICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbCIvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzLnhtbCIvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaWEueG1sIi8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0iYXVkaW9fcG9saWN5X2VuZ2luZV92b2x1bWVzLnhtbCIvPgorCis8L2NvbmZpZ3VyYXRpb24+CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9hdXRvbW90aXZlL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9hdXRvbW90aXZlL2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWU4M2EyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2F1dG9tb3RpdmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCkBAIC0wLDAgKzEsMTg1IEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/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+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPCEtLSBSb3V0aW5nIFN0cmF0ZWd5IHJlcm91dGluZyBtYXkgYmUgcmVtb3ZlZCBhcyBmb2xsb3dpbmcgbWVkaWE/Pz8gLS0+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJyZXJvdXRpbmciPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9SRVJPVVRJTkciIHZvbHVtZUdyb3VwPSJyZXJvdXRpbmciPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+PC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDwhLS0gUGF0Y2ggc3RyZWFtIG5lZWRzIGZ1bGwgc2NhbGUgdm9sdW1lLCBkZWZpbmUgaXQgb3RoZXJ3aXNlIHN3aXRjaCB0byBkZWZhdWx0Li4uIC0tPgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0icGF0Y2giPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9QQVRDSCIgdm9sdW1lR3JvdXA9InBhdGNoIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPjwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKzwvUHJvZHVjdFN0cmF0ZWdpZXM+CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9hdXRvbW90aXZlL2F1ZGlvX3BvbGljeV9lbmdpbmVfdm9sdW1lcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvYXV0b21vdGl2ZS9hdWRpb19wb2xpY3lfZW5naW5lX3ZvbHVtZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNzJkYzUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvYXV0b21vdGl2ZS9hdWRpb19wb2xpY3lfZW5naW5lX3ZvbHVtZXMueG1sCkBAIC0wLDAgKzEsMjEzIEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/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+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPnJlcm91dGluZzwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MTwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIj4KKyAgICAgICAgICAgIDxwb2ludD4wLDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+cGF0Y2g8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjE8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MCwwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKzwvdm9sdW1lR3JvdXBzPgorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvY2FyZW11L2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9jYXJlbXUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkY2JkODMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvY2FyZW11L2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbApAQCAtMCwwICsxLDE4NCBAQAorPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Cit5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCitZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPFByb2R1Y3RTdHJhdGVnaWVzPgorICAgIDwhLS0gT0VNIFVzYWdlcyAtLT4KKyAgICA8IS0tIHByb2R1Y3Rfc3RyYXRlZ3kgd2lsbCBiZSBkZWZpbmVkIGFjY29yZGluZyB0aGlzIG9yZGVyCisgICAgcHJvZHVjdF9zdHJhdGVneSBpcyBvZW1fdHJhZmZpY19hbm91bmNlbWVudCBpZiBhbGwgdGhlIGNvbmRpdGlvbnMgYXJlIHNhdGlzZmllZCBmb3IKKyAgICBBdWRpb0F0dHJpYnV0ZXMgYWEKKworICAgIGludCB0eXBlID0gMDsKKyAgICBpZiAoYnVuZGxlICE9IG51bGwpIHsKKyAgICB0eXBlID0gYnVuZGxlLmdldEludChLRVlfT0VNX1RZUEUsIDApOworICAgIH0KKyAgICBpZigKKyAgICAoIGFhLm1Db250ZW50VHlwZSA9PSBBdWRpb0F0dHJpYnV0ZXMuQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCApICYmCisgICAgKCBhYS5tVXNhZ2UgPT0gQXVkaW9BdHRyaWJ1dGVzLkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSApICYmCisgICAgKCB0eXBlID09IDEgKSApCisgICAgLS0+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+IDxGbGFncyB2YWx1ZT0iQVVESU9fRkxBR19CRUFDT04iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDwhLS0gUm91dGluZyBTdHJhdGVneSByZXJvdXRpbmcgbWF5IGJlIHJlbW92ZWQgYXMgZm9sbG93aW5nIG1lZGlhPz8/IC0tPgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0icmVyb3V0aW5nIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fUkVST1VUSU5HIiB2b2x1bWVHcm91cD0icmVyb3V0aW5nIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPjwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8IS0tIFBhdGNoIHN0cmVhbSBuZWVkcyBmdWxsIHNjYWxlIHZvbHVtZSwgZGVmaW5lIGl0IG90aGVyd2lzZSBzd2l0Y2ggdG8gZGVmYXVsdC4uLiAtLT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9InBhdGNoIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fUEFUQ0giIHZvbHVtZUdyb3VwPSJwYXRjaCI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz48L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorPC9Qcm9kdWN0U3RyYXRlZ2llcz4KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2NhcmVtdS9hdWRpb19wb2xpY3lfZW5naW5lX3ZvbHVtZXMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2NhcmVtdS9hdWRpb19wb2xpY3lfZW5naW5lX3ZvbHVtZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNzJkYzUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvY2FyZW11L2F1ZGlvX3BvbGljeV9lbmdpbmVfdm9sdW1lcy54bWwKQEAgLTAsMCArMSwyMTMgQEAKKzw/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+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+cmVyb3V0aW5nPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD4xPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiPgorICAgICAgICAgICAgPHBvaW50PjAsMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5wYXRjaDwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MTwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIj4KKyAgICAgICAgICAgIDxwb2ludD4wLDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgPC92b2x1bWVHcm91cD4KKworPC92b2x1bWVHcm91cHM+CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9jb21tb24vYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpYS54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvY29tbW9uL2F1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaWEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjODJiMmUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvY29tbW9uL2F1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaWEueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y3JpdGVyaWE+CisgICAgPGNyaXRlcmlvbiBuYW1lPSJBdmFpbGFibGVJbnB1dERldmljZXMiIHR5cGU9IklucHV0RGV2aWNlc01hc2tUeXBlIiBkZWZhdWx0PSJub25lIi8+CisgICAgPGNyaXRlcmlvbiBuYW1lPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiB0eXBlPSJPdXRwdXREZXZpY2VzTWFza1R5cGUiIGRlZmF1bHQ9Im5vbmUiLz4KKyAgICA8Y3JpdGVyaW9uIG5hbWU9IkF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMiIHR5cGU9Ik91dHB1dERldmljZXNBZGRyZXNzZXNUeXBlIiBkZWZhdWx0PSJub25lIi8+CisgICAgPGNyaXRlcmlvbiBuYW1lPSJBdmFpbGFibGVJbnB1dERldmljZXNBZGRyZXNzZXMiIHR5cGU9IklucHV0RGV2aWNlc0FkZHJlc3Nlc1R5cGUiIGRlZmF1bHQ9Im5vbmUiLz4KKyAgICA8Y3JpdGVyaW9uIG5hbWU9IlRlbGVwaG9ueU1vZGUiIHR5cGU9IkFuZHJvaWRNb2RlVHlwZSIgZGVmYXVsdD0iTm9ybWFsIi8+CisgICAgPGNyaXRlcmlvbiBuYW1lPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIHR5cGU9IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvblR5cGUiIGRlZmF1bHQ9IkZvcmNlTm9uZSIvPgorICAgIDxjcml0ZXJpb24gbmFtZT0iRm9yY2VVc2VGb3JNZWRpYSIgdHlwZT0iRm9yY2VVc2VGb3JNZWRpYVR5cGUiIGRlZmF1bHQ9IkZvcmNlTm9uZSIvPgorICAgIDxjcml0ZXJpb24gbmFtZT0iRm9yY2VVc2VGb3JSZWNvcmQiIHR5cGU9IkZvcmNlVXNlRm9yUmVjb3JkVHlwZSIgZGVmYXVsdD0iRm9yY2VOb25lIi8+CisgICAgPGNyaXRlcmlvbiBuYW1lPSJGb3JjZVVzZUZvckRvY2siIHR5cGU9IkZvcmNlVXNlRm9yRG9ja1R5cGUiIGRlZmF1bHQ9IkZvcmNlTm9uZSIvPgorICAgIDxjcml0ZXJpb24gbmFtZT0iRm9yY2VVc2VGb3JTeXN0ZW0iIHR5cGU9IkZvcmNlVXNlRm9yU3lzdGVtVHlwZSIgZGVmYXVsdD0iRm9yY2VOb25lIi8+CisgICAgPGNyaXRlcmlvbiBuYW1lPSJGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyIgdHlwZT0iRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW9UeXBlIiBkZWZhdWx0PSJGb3JjZU5vbmUiLz4KKyAgICA8Y3JpdGVyaW9uIG5hbWU9IkZvcmNlVXNlRm9yRW5jb2RlZFN1cnJvdW5kIiB0eXBlPSJGb3JjZVVzZUZvckVuY29kZWRTdXJyb3VuZFR5cGUiIGRlZmF1bHQ9IkZvcmNlTm9uZSIvPgorICAgIDxjcml0ZXJpb24gbmFtZT0iRm9yY2VVc2VGb3JWaWJyYXRlUmluZ2luZyIgdHlwZT0iRm9yY2VVc2VGb3JWaWJyYXRlUmluZ2luZ1R5cGUiIGRlZmF1bHQ9IkZvcmNlTm9uZSIvPgorPC9jcml0ZXJpYT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9jb21tb24vYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sLmluIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2NvbW1vbi9hdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlcy54bWwuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUxNzM2OQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9jb21tb24vYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sLmluCkBAIC0wLDAgKzEsOTYgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y3JpdGVyaW9uX3R5cGVzPgorICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSJPdXRwdXREZXZpY2VzTWFza1R5cGUiIHR5cGU9ImluY2x1c2l2ZSIvPgorICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSJJbnB1dERldmljZXNNYXNrVHlwZSIgdHlwZT0iaW5jbHVzaXZlIi8+CisgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9Ik91dHB1dERldmljZXNBZGRyZXNzZXNUeXBlIiB0eXBlPSJpbmNsdXNpdmUiPgorICAgICAgICA8dmFsdWVzPgorICAgICAgICAgICAgPCEtLSBsZWdhY3kgcmVtb3RlIHN1Ym1peCAtLT4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSIwIiBudW1lcmljYWw9IjEiLz4KKyAgICAgICAgPC92YWx1ZXM+CisgICAgPC9jcml0ZXJpb25fdHlwZT4KKyAgICA8Y3JpdGVyaW9uX3R5cGUgbmFtZT0iSW5wdXREZXZpY2VzQWRkcmVzc2VzVHlwZSIgdHlwZT0iaW5jbHVzaXZlIi8+CisgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9IkFuZHJvaWRNb2RlVHlwZSIgdHlwZT0iZXhjbHVzaXZlIi8+CisgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9IkJvb2xlYW5UeXBlIiB0eXBlPSJleGNsdXNpdmUiPgorICAgICAgICA8dmFsdWVzPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZhbHNlIiBudW1lcmljYWw9IjAiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJUcnVlIiBudW1lcmljYWw9IjEiLz4KKyAgICAgICAgPC92YWx1ZXM+CisgICAgPC9jcml0ZXJpb25fdHlwZT4KKyAgICA8Y3JpdGVyaW9uX3R5cGUgbmFtZT0iRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uVHlwZSIgdHlwZT0iZXhjbHVzaXZlIj4KKyAgICAgICAgPHZhbHVlcz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZU5vbmUiIG51bWVyaWNhbD0iMCIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlU3BlYWtlciIgbnVtZXJpY2FsPSIxIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VCdFNjbyIgbnVtZXJpY2FsPSIzIi8+CisgICAgICAgIDwvdmFsdWVzPgorICAgIDwvY3JpdGVyaW9uX3R5cGU+CisgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9IkZvcmNlVXNlRm9yTWVkaWFUeXBlIiB0eXBlPSJleGNsdXNpdmUiPgorICAgICAgICA8dmFsdWVzPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlTm9uZSIgbnVtZXJpY2FsPSIwIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VTcGVha2VyIiBudW1lcmljYWw9IjEiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZUhlYWRwaG9uZXMiIG51bWVyaWNhbD0iMiIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlQnRBMmRwIiBudW1lcmljYWw9IjQiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZVdpcmVkQWNjZXNzb3J5IiBudW1lcmljYWw9IjUiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZUFuYWxvZ0RvY2siIG51bWVyaWNhbD0iOCIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlRGlnaXRhbERvY2siIG51bWVyaWNhbD0iOSIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlTm9CdEEyZHAiIG51bWVyaWNhbD0iMTAiLz4KKyAgICAgICAgPC92YWx1ZXM+CisgICAgPC9jcml0ZXJpb25fdHlwZT4KKyAgICA8Y3JpdGVyaW9uX3R5cGUgbmFtZT0iRm9yY2VVc2VGb3JSZWNvcmRUeXBlIiB0eXBlPSJleGNsdXNpdmUiPgorICAgICAgICA8dmFsdWVzPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlTm9uZSIgbnVtZXJpY2FsPSIwIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VCdFNjbyIgbnVtZXJpY2FsPSIzIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VXaXJlZEFjY2Vzc29yeSIgbnVtZXJpY2FsPSI1Ii8+CisgICAgICAgIDwvdmFsdWVzPgorICAgIDwvY3JpdGVyaW9uX3R5cGU+CisgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9IkZvcmNlVXNlRm9yRG9ja1R5cGUiIHR5cGU9ImV4Y2x1c2l2ZSI+CisgICAgICAgIDx2YWx1ZXM+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VOb25lIiBudW1lcmljYWw9IjAiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZVdpcmVkQWNjZXNzb3J5IiBudW1lcmljYWw9IjUiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZUJ0Q2FyRG9jayIgbnVtZXJpY2FsPSI2Ii8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VCdERlc2tEb2NrIiBudW1lcmljYWw9IjciLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZUFuYWxvZ0RvY2siIG51bWVyaWNhbD0iOCIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlRGlnaXRhbERvY2siIG51bWVyaWNhbD0iOSIvPgorICAgICAgICA8L3ZhbHVlcz4KKyAgICA8L2NyaXRlcmlvbl90eXBlPgorICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSJGb3JjZVVzZUZvclN5c3RlbVR5cGUiIHR5cGU9ImV4Y2x1c2l2ZSIgPgorICAgICAgICA8dmFsdWVzPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlTm9uZSIgbnVtZXJpY2FsPSIwIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VTeXN0ZW1FbmZvcmNlZCIgbnVtZXJpY2FsPSIxMSIvPgorICAgICAgICA8L3ZhbHVlcz4KKyAgICA8L2NyaXRlcmlvbl90eXBlPgorICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSJGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpb1R5cGUiIHR5cGU9ImV4Y2x1c2l2ZSI+CisgICAgICAgIDx2YWx1ZXM+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VOb25lIiBudW1lcmljYWw9IjAiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZUhkbWlTeXN0ZW1FbmZvcmNlZCIgbnVtZXJpY2FsPSIxMiIvPgorICAgICAgICA8L3ZhbHVlcz4KKyAgICA8L2NyaXRlcmlvbl90eXBlPgorICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSJGb3JjZVVzZUZvckVuY29kZWRTdXJyb3VuZFR5cGUiIHR5cGU9ImV4Y2x1c2l2ZSI+CisgICAgICAgIDx2YWx1ZXM+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VOb25lIiBudW1lcmljYWw9IjAiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZUVuY29kZWRTdXJyb3VuZE5ldmVyIiBudW1lcmljYWw9IjEzIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VFbmNvZGVkU3Vycm91bmRBbHdheXMiIG51bWVyaWNhbD0iMTQiLz4KKyAgICAgICAgPC92YWx1ZXM+CisgICAgPC9jcml0ZXJpb25fdHlwZT4KKyAgICA8Y3JpdGVyaW9uX3R5cGUgbmFtZT0iRm9yY2VVc2VGb3JWaWJyYXRlUmluZ2luZ1R5cGUiIHR5cGU9ImV4Y2x1c2l2ZSI+CisgICAgICAgIDx2YWx1ZXM+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VOb25lIiBudW1lcmljYWw9IjAiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZUJ0U2NvIiBudW1lcmljYWw9IjMiLz4KKyAgICAgICAgPC92YWx1ZXM+CisgICAgPC9jcml0ZXJpb25fdHlwZT4KKzwvY3JpdGVyaW9uX3R5cGVzPgorCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZhZjliOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgICAgIC0tPgorCis8Y29uZmlndXJhdGlvbiB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KKworICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbCIvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzLnhtbCIvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaWEueG1sIi8+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+QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UoKSB7fQogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDAyZmQ1Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgUmVjdXJzaXZlIGNhbGwgc3ViLWZvbGRlciBBbmRyb2lkLm1rCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1pbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQW5kcm9pZC5tawppbmRleCBiYWFlZmQyLi4xOWY5M2IzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0FuZHJvaWQubWsKQEAgLTcsMjcgKzcsNDQgQEAKICMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCi1pZmVxICgxLCAwKQotCiBMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCiAKK2lmZGVmIEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04KKworaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwkKGZpbHRlciAkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLHBob25lX2NvbmZpZ3VyYWJsZSBhdXRvbW90aXZlX2NvbmZpZ3VyYWJsZSBjYXJlbXVfY29uZmlndXJhYmxlIG5vLW91dHB1dF9jb25maWd1cmFibGUgbm8taW5wdXRfY29uZmlndXJhYmxlKSkKKwogUEZXX0NPUkUgOj0gZXh0ZXJuYWwvcGFyYW1ldGVyLWZyYW1ld29yawotQlVJTERfUEZXX1NFVFRJTkdTIDo9ICQoUEZXX0NPUkUpL3N1cHBvcnQvYW5kcm9pZC9idWlsZF9wZndfc2V0dGluZ3MubWsKKyNAVE9ETzogdXBzdHJlYW0gbmV3IGRvbWFpbiBnZW5lcmF0b3IKKyNCVUlMRF9QRldfU0VUVElOR1MgOj0gJChQRldfQ09SRSkvc3VwcG9ydC9hbmRyb2lkL2J1aWxkX3Bmd19zZXR0aW5ncy5tawogUEZXX0RFRkFVTFRfU0NIRU1BU19ESVIgOj0gJChQRldfQ09SRSkvdXBzdHJlYW0vc2NoZW1hcwogUEZXX1NDSEVNQVNfRElSIDo9ICQoUEZXX0RFRkFVTFRfU0NIRU1BU19ESVIpCiAKK1RPT0xTIDo9IGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzCitCVUlMRF9QRldfU0VUVElOR1MgOj0gJChUT09MUykvYnVpbGRfYXVkaW9fcGZ3X3NldHRpbmdzLm1rCisKK1BST1ZJU0lPTl9TVFJBVEVHSUVTX1NUUlVDVFVSRSA6PSAkKFRPT0xTKS9wcm92aXNpb25fc3RyYXRlZ2llc19zdHJ1Y3R1cmUubWsKKworZW5kaWYKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIENPTkZJR1VSQVRJT04gRklMRVMKICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMjIyMjIyMjIFBvbGljeSBQRlcgdG9wIGxldmVsIGZpbGUgIyMjIyMjIyMjCiAKK2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksJChmaWx0ZXIgJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSxwaG9uZV9jb25maWd1cmFibGUgYXV0b21vdGl2ZV9jb25maWd1cmFibGUgY2FyZW11X2NvbmZpZ3VyYWJsZSkpCisKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogTE9DQUxfTU9EVUxFIDo9IFBhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0VUQykvcGFyYW1ldGVyLWZyYW1ld29yaworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrCiBMT0NBTF9TUkNfRklMRVMgOj0gJChMT0NBTF9NT0RVTEUpLmluCitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IFwKKyAgICBQb2xpY3lTdWJzeXN0ZW0ueG1sIFwKKyAgICBQb2xpY3lDbGFzcy54bWwKIAorIyBleHRlcm5hbC9wYXJhbWV0ZXItZnJhbWV3b3JrIHByZXZlbnRzIGZyb20gdXNpbmcgZGVidWcgaW50ZXJmYWNlCiBBVURJT19QQVRURVJOID0gQFRVTklOR19BTExPV0VEQAogaWZlcSAoJChUQVJHRVRfQlVJTERfVkFSSUFOVCksdXNlcikKIEFVRElPX1ZBTFVFID0gZmFsc2UKQEAgLTM1LDEyOCArNTIsMTM2IEBACiBBVURJT19WQUxVRSA9IHRydWUKIGVuZGlmCiAKLUxPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgOj0gJChoaWRlKSBzZWQgLWkgLWUgJ3N8JChBVURJT19QQVRURVJOKXwkKEFVRElPX1ZBTFVFKXxnJyAkKExPQ0FMX01PRFVMRV9QQVRIKS8kKExPQ0FMX01PRFVMRSkKK0xPQ0FMX1BPU1RfSU5TVEFMTF9DTUQgOj0gJChoaWRlKSBzZWQgLWkgLWUgJ3N8JChBVURJT19QQVRURVJOKXwkKEFVRElPX1ZBTFVFKXxnJyAkKFRBUkdFVF9PVVRfVkVORE9SX0VUQykvJChMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCkvJChMT0NBTF9NT0RVTEUpCiAKIGluY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKIAotCi0jIyMjIyMjIyMjIFBvbGljeSBQRlcgU3RydWN0dXJlcyAjIyMjIyMjIyMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEUgOj0gUG9saWN5Q2xhc3MueG1sCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0VUQykvcGFyYW1ldGVyLWZyYW1ld29yay9TdHJ1Y3R1cmUvUG9saWN5Ci1MT0NBTF9TUkNfRklMRVMgOj0gU3RydWN0dXJlLyQoTE9DQUxfTU9EVUxFKQotaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorIyMjIyMjIyMjIyBQb2xpY3kgUEZXIENvbW1vbiBTdHJ1Y3R1cmVzICMjIyMjIyMjIwogCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIExPQ0FMX01PRFVMRSA6PSBQb2xpY3lTdWJzeXN0ZW0ueG1sCiBMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCiBMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IFwKICAgICBQb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sIFwKLSAgICBQb2xpY3lTdWJzeXN0ZW0tVm9sdW1lLnhtbCBcCi0gICAgbGlicG9saWN5LXN1YnN5c3RlbSBcCisgICAgUHJvZHVjdFN0cmF0ZWdpZXMueG1sCiAKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9FVEMpL3BhcmFtZXRlci1mcmFtZXdvcmsvU3RydWN0dXJlL1BvbGljeQotTE9DQUxfU1JDX0ZJTEVTIDo9IFN0cnVjdHVyZS8kKExPQ0FMX01PRFVMRSkKK0xPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsvU3RydWN0dXJlL1BvbGljeQorTE9DQUxfU1JDX0ZJTEVTIDo9IGNvbW1vbi9TdHJ1Y3R1cmUvJChMT0NBTF9NT0RVTEUpCiBpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCiAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogTE9DQUxfTU9EVUxFIDo9IFBvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwKIExPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCiBMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfRVRDKS9wYXJhbWV0ZXItZnJhbWV3b3JrL1N0cnVjdHVyZS9Qb2xpY3kKLUxPQ0FMX1NSQ19GSUxFUyA6PSBTdHJ1Y3R1cmUvJChMT0NBTF9NT0RVTEUpCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsvU3RydWN0dXJlL1BvbGljeQorTE9DQUxfU1JDX0ZJTEVTIDo9IGNvbW1vbi9TdHJ1Y3R1cmUvJChMT0NBTF9NT0RVTEUpCiBpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCiAKLSMjIyMjIyMjIyBQb2xpY3kgUEZXIFNldHRpbmdzICMjIyMjIyMjIwogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEUgOj0gcGFyYW1ldGVyLWZyYW1ld29yay5wb2xpY3kKLUxPQ0FMX01PRFVMRV9TVEVNIDo9IFBvbGljeUNvbmZpZ3VyYWJsZURvbWFpbnMueG1sCitMT0NBTF9NT0RVTEUgOj0gUG9saWN5Q2xhc3MueG1sCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAogTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gcGFyYW1ldGVyLWZyYW1ld29yay9TZXR0aW5ncy9Qb2xpY3kKLUxPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9IFwKLSAgICAgICAgUG9saWN5Q2xhc3MueG1sIFwKLSAgICAgICAgUG9saWN5U3Vic3lzdGVtLnhtbCBcCi0gICAgICAgIFBhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sCi0KLWlmZXEgKCQocGZ3X3JlYnVpbGRfc2V0dGluZ3MpLHRydWUpCi1QRldfVE9QTEVWRUxfRklMRSA6PSAkKFRBUkdFVF9PVVRfRVRDKS9wYXJhbWV0ZXItZnJhbWV3b3JrL1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sCi1QRldfQ1JJVEVSSUFfRklMRSA6PSAkKExPQ0FMX1BBVEgpL3BvbGljeV9jcml0ZXJpYS50eHQKLVBGV19FRERfRklMRVMgOj0gXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfbWVkaWEucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3Bob25lLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9zb25pZmljYXRpb24ucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9kdG1mLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9lbmZvcmNlZF9hdWRpYmxlLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2FjY2Vzc2liaWxpdHkucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3Jlcm91dGluZy5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl9zdHJlYW0ucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9zdHJhdGVneV9mb3JfdXNhZ2UucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX2lucHV0X3NvdXJjZS5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL3ZvbHVtZXMucGZ3Ci0KLWluY2x1ZGUgJChCVUlMRF9QRldfU0VUVElOR1MpCi1lbHNlCi0jIFVzZSB0aGUgZXhpc3RpbmcgZmlsZQotTE9DQUxfU1JDX0ZJTEVTIDo9IFNldHRpbmdzLyQoTE9DQUxfTU9EVUxFX1NURU0pCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsvU3RydWN0dXJlL1BvbGljeQorTE9DQUxfU1JDX0ZJTEVTIDo9IGNvbW1vbi9TdHJ1Y3R1cmUvJChMT0NBTF9NT0RVTEUpCiBpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCi1lbmRpZiAjIHBmd19yZWJ1aWxkX3NldHRpbmdzCisKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gUHJvZHVjdFN0cmF0ZWdpZXMueG1sCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsvU3RydWN0dXJlL1BvbGljeQorCitBVURJT19QT0xJQ1lfRU5HSU5FX0NPTkZJR1VSQVRJT05fRklMRSA6PSBcCisgICAgJChUQVJHRVRfT1VUX1ZFTkRPUl9FVEMpL2F1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwKK1NUUkFURUdJRVNfU1RSVUNUVVJFX0ZJTEUgOj0gJChMT0NBTF9QQVRIKS9jb21tb24vU3RydWN0dXJlLyQoTE9DQUxfTU9EVUxFKS5pbgorCitpbmNsdWRlICQoUFJPVklTSU9OX1NUUkFURUdJRVNfU1RSVUNUVVJFKQorCitlbmRpZiAjaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwkKGZpbHRlciAkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLHBob25lX2NvbmZpZ3VyYWJsZSBhdXRvbW90aXZlX2NvbmZpZ3VyYWJsZSBjYXJlbXVfY29uZmlndXJhYmxlKSkKKworIyMjIyMjIyMjIyBQb2xpY3kgUEZXIEV4YW1wbGUgU3RydWN0dXJlcyAjIyMjIyMjIyMKK2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksJChmaWx0ZXIgJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSxuby1vdXRwdXRfY29uZmlndXJhYmxlIG5vLWlucHV0X2NvbmZpZ3VyYWJsZSkpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IFBvbGljeVN1YnN5c3RlbS54bWwKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbAorCitMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrL1N0cnVjdHVyZS9Qb2xpY3kKK0xPQ0FMX1NSQ19GSUxFUyA6PSBjb21tb24vU3RydWN0dXJlLyQoTE9DQUxfTU9EVUxFKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBQYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LW5vLXN0cmF0ZWd5LnhtbAorTE9DQUxfTU9EVUxFX1NURU0gOj0gUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsKK0xPQ0FMX1NSQ19GSUxFUyA6PSAkKExPQ0FMX01PRFVMRSkuaW4KK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gXAorICAgIFBvbGljeVN1YnN5c3RlbS54bWwgXAorICAgIFBvbGljeUNsYXNzLnhtbAorQVVESU9fVkFMVUUgPSBmYWxzZQorTE9DQUxfUE9TVF9JTlNUQUxMX0NNRCA6PSAkKGhpZGUpIHNlZCAtaSAtZSAnc3wkKEFVRElPX1BBVFRFUk4pfCQoQVVESU9fVkFMVUUpfGcnICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS8kKExPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIKS8kKExPQ0FMX01PRFVMRSkKKworaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCitlbmRpZiAjIGlmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksJChmaWx0ZXIgJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSxuby1vdXRwdXRfY29uZmlndXJhYmxlIG5vLWlucHV0X2NvbmZpZ3VyYWJsZSkpCiAKICMjIyMjIyMjIyBQb2xpY3kgUEZXIFNldHRpbmdzIC0gTm8gT3V0cHV0ICMjIyMjIyMjIworaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSxuby1vdXRwdXRfY29uZmlndXJhYmxlKQorCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrLnBvbGljeS5uby1vdXRwdXQKK0xPQ0FMX01PRFVMRSA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrLnBvbGljeQogTE9DQUxfTU9EVUxFX1NURU0gOj0gUG9saWN5Q29uZmlndXJhYmxlRG9tYWlucy1Ob091dHB1dERldmljZS54bWwKIExPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQogTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gcGFyYW1ldGVyLWZyYW1ld29yay9TZXR0aW5ncy9Qb2xpY3kKLUxPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9IFwKLSAgICAgICAgUG9saWN5Q2xhc3MueG1sIFwKLSAgICAgICAgUG9saWN5U3Vic3lzdGVtLnhtbCBcCi0gICAgICAgIFBhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sCiAKLVBGV19UT1BMRVZFTF9GSUxFIDo9ICQoVEFSR0VUX09VVF9FVEMpL3BhcmFtZXRlci1mcmFtZXdvcmsvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKLVBGV19DUklURVJJQV9GSUxFIDo9ICQoTE9DQUxfUEFUSCkvcG9saWN5X2NyaXRlcmlhLnR4dAorUEZXX1RPUExFVkVMX0ZJTEUgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUl9FVEMpL3BhcmFtZXRlci1mcmFtZXdvcmsvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKK1BGV19DUklURVJJT05fVFlQRVNfRklMRSA6PSAkKFRBUkdFVF9PVVRfVkVORE9SX0VUQykvYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sCitQRldfQ1JJVEVSSUFfRklMRSA6PSAkKFRBUkdFVF9PVVRfVkVORE9SX0VUQykvYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpYS54bWwKIFBGV19FRERfRklMRVMgOj0gXAogICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzTm9PdXRwdXQvZGV2aWNlX2Zvcl9zdHJhdGVnaWVzLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3N0cmVhbS5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl91c2FnZS5wZncgXAogICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3JfaW5wdXRfc291cmNlLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3Mvdm9sdW1lcy5wZncKLQorICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL3ZvbHVtZXMucGZ3ICAgICAgICAKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gbGlicG9saWN5LXN1YnN5c3RlbQogaW5jbHVkZSAkKEJVSUxEX1BGV19TRVRUSU5HUykKIAorZW5kaWYgIyBpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLG5vLW91dHB1dF9jb25maWd1cmFibGUpCiAjIyMjIyMjIyMgUG9saWN5IFBGVyBTZXR0aW5ncyAtIE5vIElucHV0ICMjIyMjIyMjIworaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSxuby1pbnB1dF9jb25maWd1cmFibGUpCisKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsucG9saWN5Lm5vLWlucHV0CitMT0NBTF9NT0RVTEUgOj0gcGFyYW1ldGVyLWZyYW1ld29yay5wb2xpY3kKIExPQ0FMX01PRFVMRV9TVEVNIDo9IFBvbGljeUNvbmZpZ3VyYWJsZURvbWFpbnMtTm9JbnB1dERldmljZS54bWwKIExPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQogTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gcGFyYW1ldGVyLWZyYW1ld29yay9TZXR0aW5ncy9Qb2xpY3kKLUxPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9IFwKLSAgICAgICAgUG9saWN5Q2xhc3MueG1sIFwKLSAgICAgICAgUG9saWN5U3Vic3lzdGVtLnhtbCBcCi0gICAgICAgIFBhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sCiAKLVBGV19UT1BMRVZFTF9GSUxFIDo9ICQoVEFSR0VUX09VVF9FVEMpL3BhcmFtZXRlci1mcmFtZXdvcmsvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKLVBGV19DUklURVJJQV9GSUxFIDo9ICQoTE9DQUxfUEFUSCkvcG9saWN5X2NyaXRlcmlhLnR4dAorUEZXX1RPUExFVkVMX0ZJTEUgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUl9FVEMpL3BhcmFtZXRlci1mcmFtZXdvcmsvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKK1BGV19DUklURVJJT05fVFlQRVNfRklMRSA6PSAkKFRBUkdFVF9PVVRfVkVORE9SX0VUQykvYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sCitQRldfQ1JJVEVSSUFfRklMRSA6PSAkKFRBUkdFVF9PVVRfVkVORE9SX0VUQykvYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpYS54bWwKIFBGV19FRERfRklMRVMgOj0gXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfbWVkaWEucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3Bob25lLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9zb25pZmljYXRpb24ucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9kdG1mLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9lbmZvcmNlZF9hdWRpYmxlLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2FjY2Vzc2liaWxpdHkucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3Jlcm91dGluZy5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl9zdHJlYW0ucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9zdHJhdGVneV9mb3JfdXNhZ2UucGZ3IFwKICAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5nc05vSW5wdXQvZGV2aWNlX2Zvcl9pbnB1dF9zb3VyY2UucGZ3IFwKICAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy92b2x1bWVzLnBmdwotCitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IGxpYnBvbGljeS1zdWJzeXN0ZW0KIGluY2x1ZGUgJChCVUlMRF9QRldfU0VUVElOR1MpCiAKLWVuZGlmICMgaWZlcSAoMSwgMCkKK2VuZGlmICNpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLG5vLWlucHV0X2NvbmZpZ3VyYWJsZSkKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIFJlY3Vyc2l2ZSBjYWxsIHN1Yi1mb2xkZXIgQW5kcm9pZC5taworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQorCitlbmRpZiAjaWZkZWYgQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTgorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXIvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0Nhci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMDRlYzIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXIvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQ3IEBACisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMKKyMgQE5PVEU6CisjIEF1ZGlvIFBvbGljeSBFbmdpbmUgY29uZmlndXJhYmxlIGV4YW1wbGUgZm9yIGdlbmVyaWMgZGV2aWNlIGJ1aWxkCisjCisjIEFueSB2ZW5kb3Igc2hhbGwgaGF2ZSBpdHMgb3duIGNvbmZpZ3VyYXRpb24gd2l0aGluIHRoZSBjb3JyZXNwb25kaW5nIGRldmljZSBmb2xkZXIKKyMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCitpZmVxICgkKEJVSUxEX0FVRElPX1BPTElDWV9FWEFNUExFX0NPTkZJR1VSQVRJT04pLCBhdXRvbW90aXZlX2NvbmZpZ3VyYWJsZSkKK0xPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKKworUEZXX0NPUkUgOj0gZXh0ZXJuYWwvcGFyYW1ldGVyLWZyYW1ld29yaworUEZXX0RFRkFVTFRfU0NIRU1BU19ESVIgOj0gJChQRldfQ09SRSkvdXBzdHJlYW0vc2NoZW1hcworUEZXX1NDSEVNQVNfRElSIDo9ICQoUEZXX0RFRkFVTFRfU0NIRU1BU19ESVIpCisKK1RPT0xTIDo9IGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzCitCVUlMRF9QRldfU0VUVElOR1MgOj0gJChUT09MUykvYnVpbGRfYXVkaW9fcGZ3X3NldHRpbmdzLm1rCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENPTkZJR1VSQVRJT04gRklMRVMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIyMjIyMjIyMjIFBvbGljeSBQRlcgU3RydWN0dXJlcyAjIyMjIyMjIyMKKyMjIyMjIyMjIyBQb2xpY3kgUEZXIFNldHRpbmdzICMjIyMjIyMjIworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gcGFyYW1ldGVyLWZyYW1ld29yay5wb2xpY3kKK0xPQ0FMX01PRFVMRV9TVEVNIDo9IFBvbGljeUNvbmZpZ3VyYWJsZURvbWFpbnMueG1sCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsvU2V0dGluZ3MvUG9saWN5CitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IGxpYnBvbGljeS1zdWJzeXN0ZW0KKworUEZXX0VERF9GSUxFUyA6PSBcCisgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ2llcy5wZncgXAorICAgICQoTE9DQUxfUEFUSCkvLi4vU2V0dGluZ3MvZGV2aWNlX2Zvcl9pbnB1dF9zb3VyY2UucGZ3IFwKKyAgICAkKExPQ0FMX1BBVEgpLy4uL1NldHRpbmdzL3ZvbHVtZXMucGZ3CisKK1BGV19DUklURVJJT05fVFlQRVNfRklMRSA6PSAkKFRBUkdFVF9PVVRfVkVORE9SX0VUQykvYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sCitQRldfQ1JJVEVSSUFfRklMRSA6PSAkKFRBUkdFVF9PVVRfVkVORE9SX0VUQykvYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpYS54bWwKK1BGV19UT1BMRVZFTF9GSUxFIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS9wYXJhbWV0ZXItZnJhbWV3b3JrL1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sCitQRldfU0NIRU1BU19ESVIgOj0gJChQRldfREVGQVVMVF9TQ0hFTUFTX0RJUikKKworaW5jbHVkZSAkKEJVSUxEX1BGV19TRVRUSU5HUykKKworZW5kaWYgI2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksIGF1dG9tb3RpdmVfY29uZmlndXJhYmxlKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQ2FyL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVnaWVzLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0Nhci9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ2llcy5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdhZDU5MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0Nhci9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ2llcy5wZncKQEAgLTAsMCArMSw3NjAgQEAKK3N1cERvbWFpbjogRGV2aWNlRm9yUHJvZHVjdFN0cmF0ZWdpZXMKKwlzdXBEb21haW46IE9lbVRyYWZmaWNBbm91bmNlbWVudAorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9vZW1fdHJhZmZpY19hbm91bmNlbWVudC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3RyYWZmaWNfYW5vdW5jZW1lbnQvZGV2aWNlX2FkZHJlc3MgPSBCVVMwOF9PRU0xCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzA4X09FTTEKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV90cmFmZmljX2Fub3VuY2VtZW50L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3RyYWZmaWNfYW5vdW5jZW1lbnQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCisKKwlzdXBEb21haW46IE9lbVN0cmF0ZWd5MQorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9vZW1fc3RyYXRlZ3lfMS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3N0cmF0ZWd5XzEvZGV2aWNlX2FkZHJlc3MgPSBCVVMwOF9PRU0xCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzA4X09FTTEKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV9zdHJhdGVneV8xL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3N0cmF0ZWd5XzEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCisKKworCisJc3VwRG9tYWluOiBPZW1TdHJhdGVneTIKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3N0cmF0ZWd5XzIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV9zdHJhdGVneV8yL2RldmljZV9hZGRyZXNzID0gQlVTMDhfT0VNMQorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwOF9PRU0xCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9vZW1fc3RyYXRlZ3lfMi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV9zdHJhdGVneV8yL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisKKworCXN1cERvbWFpbjogUmFkaW8KKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcmFkaW8vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3JhZGlvL2RldmljZV9hZGRyZXNzID0gQlVTMDlfT0VNMgorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwOV9PRU0yCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yYWRpby9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3JhZGlvL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJYnVzID0gMAorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcmFkaW8vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAwCisKKwlzdXBEb21haW46IEV4dEF1ZGlvU291cmNlCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2V4dF9hdWRpb19zb3VyY2Uvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2V4dF9hdWRpb19zb3VyY2UvZGV2aWNlX2FkZHJlc3MgPSBCVVMwOV9PRU0yCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzA5X09FTTIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2V4dF9hdWRpb19zb3VyY2Uvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9leHRfYXVkaW9fc291cmNlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisKKworCXN1cERvbWFpbjogVm9pY2VDb21tYW5kCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NvbW1hbmQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NvbW1hbmQvZGV2aWNlX2FkZHJlc3MgPSBCVVMwMl9WT0lDRV9DT01NQU5ECisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAyX1ZPSUNFX0NPTU1BTkQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NvbW1hbmQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IFNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy92b2ljZV9jb21tYW5kL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJYnVzID0gMAorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdm9pY2VfY29tbWFuZC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDAKKworCisJc3VwRG9tYWluOiBTYWZldHlBbGVydAorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zYWZldHlfYWxlcnQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NhZmV0eV9hbGVydC9kZXZpY2VfYWRkcmVzcyA9IEJVUzAwX01FRElBCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAwX01FRElBCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zYWZldHlfYWxlcnQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IFNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zYWZldHlfYWxlcnQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCQkJCQlidXMgPSAwCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zYWZldHlfYWxlcnQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAwCisKKworCXN1cERvbWFpbjogTXVzaWMKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbXVzaWMvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL211c2ljL2RldmljZV9hZGRyZXNzID0gQlVTMDBfTUVESUEKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDBfTUVESUEKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL211c2ljL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbXVzaWMvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCQkJCQlidXMgPSAwCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tdXNpYy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDAKKworCisKKwlzdXBEb21haW46IE5hdkd1aWRhbmNlCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25hdl9ndWlkYW5jZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbmF2X2d1aWRhbmNlL2RldmljZV9hZGRyZXNzID0gQlVTMDFfTkFWX0dVSURBTkNFCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAxX05BVl9HVUlEQU5DRQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbmF2X2d1aWRhbmNlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbmF2X2d1aWRhbmNlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJYnVzID0gMAorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbmF2X2d1aWRhbmNlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMAorCisKKwlzdXBEb21haW46IFZvaWNlQ2FsbAorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy92b2ljZV9jYWxsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy92b2ljZV9jYWxsL2RldmljZV9hZGRyZXNzID0gQlVTMDRfQ0FMTAorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwNF9DQUxMCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy92b2ljZV9jYWxsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdm9pY2VfY2FsbC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisJCQkJCWJ1cyA9IDAKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NhbGwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAwCisKKworCXN1cERvbWFpbjogQWxhcm0KKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWxhcm0vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FsYXJtL2RldmljZV9hZGRyZXNzID0gQlVTMDVfQUxBUk0KKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDVfQUxBUk0KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FsYXJtL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWxhcm0vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCQkJCQlidXMgPSAwCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hbGFybS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDAKKworCisJc3VwRG9tYWluOiBSaW5nCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Jpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3JpbmcvZGV2aWNlX2FkZHJlc3MgPSBCVVMwM19DQUxMX1JJTkcKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDNfQ0FMTF9SSU5HCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yaW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcmluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisJCQkJCWJ1cyA9IDAKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Jpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAwCisKKworCXN1cERvbWFpbjogTm90aWZpY2F0aW9uCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25vdGlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbm90aWZpY2F0aW9uL2RldmljZV9hZGRyZXNzID0gQlVTMDZfTk9USUZJQ0FUSU9OCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzA2X05PVElGSUNBVElPTgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbm90aWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbm90aWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJYnVzID0gMAorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbm90aWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMAorCisKKwlzdXBEb21haW46IFN5c3RlbQorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zeXN0ZW0vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3N5c3RlbS9kZXZpY2VfYWRkcmVzcyA9IEJVUzA3X1NZU1RFTV9TT1VORAorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwN19TWVNURU1fU09VTkQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3N5c3RlbS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3N5c3RlbS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisJCQkJCWJ1cyA9IDAKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3N5c3RlbS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDAKKworCXN1cERvbWFpbjogVHRzCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3R0cy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdHRzL2RldmljZV9hZGRyZXNzID0gQlVTMDBfTUVESUEKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDBfTUVESUEKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3R0cy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3R0cy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0NhckVtdS9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQ2FyRW11L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVlYjdkMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0NhckVtdS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDYgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBATk9URToKKyMgQXVkaW8gUG9saWN5IEVuZ2luZSBjb25maWd1cmFibGUgZXhhbXBsZSBmb3IgZ2VuZXJpYyBkZXZpY2UgYnVpbGQKKyMKKyMgQW55IHZlbmRvciBzaGFsbCBoYXZlIGl0cyBvd24gY29uZmlndXJhdGlvbiB3aXRoaW4gdGhlIGNvcnJlc3BvbmRpbmcgZGV2aWNlIGZvbGRlcgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksIGNhcmVtdV9jb25maWd1cmFibGUpCitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKK1BGV19DT1JFIDo9IGV4dGVybmFsL3BhcmFtZXRlci1mcmFtZXdvcmsKK1BGV19ERUZBVUxUX1NDSEVNQVNfRElSIDo9ICQoUEZXX0NPUkUpL3Vwc3RyZWFtL3NjaGVtYXMKK1BGV19TQ0hFTUFTX0RJUiA6PSAkKFBGV19ERUZBVUxUX1NDSEVNQVNfRElSKQorCitUT09MUyA6PSBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scworQlVJTERfUEZXX1NFVFRJTkdTIDo9ICQoVE9PTFMpL2J1aWxkX2F1ZGlvX3Bmd19zZXR0aW5ncy5taworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDT05GSUdVUkFUSU9OIEZJTEVTCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyMjIyMjIyMjIyBQb2xpY3kgUEZXIFN0cnVjdHVyZXMgIyMjIyMjIyMjCisjIyMjIyMjIyMgUG9saWN5IFBGVyBTZXR0aW5ncyAjIyMjIyMjIyMKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsucG9saWN5CitMT0NBTF9NT0RVTEVfU1RFTSA6PSBQb2xpY3lDb25maWd1cmFibGVEb21haW5zLnhtbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrL1NldHRpbmdzL1BvbGljeQorTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBsaWJwb2xpY3ktc3Vic3lzdGVtCisKK1BGV19FRERfRklMRVMgOj0gXAorICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWdpZXMucGZ3IFwKKyAgICAkKExPQ0FMX1BBVEgpLy4uL1NldHRpbmdzL2RldmljZV9mb3JfaW5wdXRfc291cmNlLnBmdyBcCisgICAgJChMT0NBTF9QQVRIKS8uLi9TZXR0aW5ncy92b2x1bWVzLnBmdworUEZXX0NSSVRFUklPTl9UWVBFU19GSUxFIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS9hdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlcy54bWwKK1BGV19DUklURVJJQV9GSUxFIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS9hdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhLnhtbAorUEZXX1RPUExFVkVMX0ZJTEUgOj0gJChUQVJHRVRfT1VUX1ZFTkRPUl9FVEMpL3BhcmFtZXRlci1mcmFtZXdvcmsvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKK1BGV19TQ0hFTUFTX0RJUiA6PSAkKFBGV19ERUZBVUxUX1NDSEVNQVNfRElSKQorCitpbmNsdWRlICQoQlVJTERfUEZXX1NFVFRJTkdTKQorCitlbmRpZiAjaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwgY2FyZW11X2NvbmZpZ3VyYWJsZSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0NhckVtdS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ2llcy5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXJFbXUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWdpZXMucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhMzQ2NGYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXJFbXUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWdpZXMucGZ3CkBAIC0wLDAgKzEsNjkwIEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVnaWVzCisJc3VwRG9tYWluOiBPZW1UcmFmZmljQW5vdW5jZW1lbnQKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3RyYWZmaWNfYW5vdW5jZW1lbnQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV90cmFmZmljX2Fub3VuY2VtZW50L2RldmljZV9hZGRyZXNzID0gQlVTMDBfTUVESUEKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDBfTUVESUEKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV90cmFmZmljX2Fub3VuY2VtZW50L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3RyYWZmaWNfYW5vdW5jZW1lbnQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCisKKwlzdXBEb21haW46IE9lbVN0cmF0ZWd5MQorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9vZW1fc3RyYXRlZ3lfMS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3N0cmF0ZWd5XzEvZGV2aWNlX2FkZHJlc3MgPSBCVVMwMl9PRU0xCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAyX09FTTEKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV9zdHJhdGVneV8xL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3N0cmF0ZWd5XzEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCisKKworCisJc3VwRG9tYWluOiBPZW1TdHJhdGVneTIKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3N0cmF0ZWd5XzIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV9zdHJhdGVneV8yL2RldmljZV9hZGRyZXNzID0gQlVTMDFfTkFWX0dVSURBTkNFCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAxX05BVl9HVUlEQU5DRQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3N0cmF0ZWd5XzIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9vZW1fc3RyYXRlZ3lfMi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDAKKworCisKKwlzdXBEb21haW46IFJhZGlvCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3JhZGlvL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yYWRpby9kZXZpY2VfYWRkcmVzcyA9IEJVUzAwX01FRElBCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAwX01FRElBCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yYWRpby9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3JhZGlvL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisJc3VwRG9tYWluOiBFeHRBdWRpb1NvdXJjZQorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9leHRfYXVkaW9fc291cmNlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9leHRfYXVkaW9fc291cmNlL2RldmljZV9hZGRyZXNzID0gQlVTMDBfTUVESUEKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDBfTUVESUEKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2V4dF9hdWRpb19zb3VyY2Uvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9leHRfYXVkaW9fc291cmNlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisKKworCXN1cERvbWFpbjogVm9pY2VDb21tYW5kCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NvbW1hbmQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NvbW1hbmQvZGV2aWNlX2FkZHJlc3MgPSBCVVMwNF9WT0lDRQorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwNF9WT0lDRQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdm9pY2VfY29tbWFuZC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NvbW1hbmQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCisKKworCXN1cERvbWFpbjogU2FmZXR5QWxlcnQKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc2FmZXR5X2FsZXJ0L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zYWZldHlfYWxlcnQvZGV2aWNlX2FkZHJlc3MgPSBCVVMwMF9NRURJQQorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwMF9NRURJQQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc2FmZXR5X2FsZXJ0L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc2FmZXR5X2FsZXJ0L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisKKwlzdXBEb21haW46IE11c2ljCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL211c2ljL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tdXNpYy9kZXZpY2VfYWRkcmVzcyA9IEJVUzAwX01FRElBCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAwX01FRElBCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tdXNpYy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL211c2ljL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisKKworCXN1cERvbWFpbjogTmF2R3VpZGFuY2UKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbmF2X2d1aWRhbmNlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9uYXZfZ3VpZGFuY2UvZGV2aWNlX2FkZHJlc3MgPSBCVVMwMV9OQVZfR1VJREFOQ0UKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDFfTkFWX0dVSURBTkNFCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9uYXZfZ3VpZGFuY2Uvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9uYXZfZ3VpZGFuY2Uvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCisKKworCXN1cERvbWFpbjogVm9pY2VDYWxsCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NhbGwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NhbGwvZGV2aWNlX2FkZHJlc3MgPSBCVVMwNF9WT0lDRQorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwNF9WT0lDRQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdm9pY2VfY2FsbC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NhbGwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCisKKworCXN1cERvbWFpbjogQWxhcm0KKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWxhcm0vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FsYXJtL2RldmljZV9hZGRyZXNzID0gQlVTMDBfTUVESUEKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDBfTUVESUEKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FsYXJtL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWxhcm0vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCisKKworCXN1cERvbWFpbjogUmluZworCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yaW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yaW5nL2RldmljZV9hZGRyZXNzID0gQlVTMDRfVk9JQ0UKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDRfVk9JQ0UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Jpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yaW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisKKwlzdXBEb21haW46IE5vdGlmaWNhdGlvbgorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9ub3RpZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25vdGlmaWNhdGlvbi9kZXZpY2VfYWRkcmVzcyA9IEJVUzAwX01FRElBCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAwX01FRElBCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9ub3RpZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9ub3RpZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCisKKworCXN1cERvbWFpbjogU3lzdGVtCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3N5c3RlbS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc3lzdGVtL2RldmljZV9hZGRyZXNzID0gQlVTMDNfU1lTVEVNX1NPVU5ECisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAzX1NZU1RFTV9TT1VORAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc3lzdGVtL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc3lzdGVtL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisJc3VwRG9tYWluOiBUdHMKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdHRzL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy90dHMvZGV2aWNlX2FkZHJlc3MgPSBCVVMwMF9NRURJQQorIAorCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDBfTUVESUEKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3R0cy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3R0cy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sLmluIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwuaW4KaW5kZXggZjU2MTVjZC4uMWJlNjdkZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwuaW4KKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwuaW4KQEAgLTEsNiArMSw3IEBACiA8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgogPFBhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb24geG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICBTeXN0ZW1DbGFzc05hbWU9IlBvbGljeSIgU2VydmVyUG9ydD0iNTAxOSIgVHVuaW5nQWxsb3dlZD0iQFRVTklOR19BTExPV0VEQCI+CisgICAgU3lzdGVtQ2xhc3NOYW1lPSJQb2xpY3kiIFNlcnZlclBvcnQ9InVuaXg6Ly8vZGV2L3NvY2tldC9hdWRpb3NlcnZlci9wb2xpY3lfZGVidWciCisgICAgVHVuaW5nQWxsb3dlZD0iQFRVTklOR19BTExPV0VEQCI+CiAKICAgICA8U3Vic3lzdGVtUGx1Z2lucz4KICAgICAgICAgPExvY2F0aW9uIEZvbGRlcj0iIj4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiMjA3ODEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNTQgQEAKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIworIyBATk9URToKKyMgQXVkaW8gUG9saWN5IEVuZ2luZSBjb25maWd1cmFibGUgZXhhbXBsZSBmb3IgZ2VuZXJpYyBkZXZpY2UgYnVpbGQKKyMKKyMgQW55IHZlbmRvciBzaGFsbCBoYXZlIGl0cyBvd24gY29uZmlndXJhdGlvbiB3aXRoaW4gdGhlIGNvcnJlc3BvbmRpbmcgZGV2aWNlIGZvbGRlcgorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksIHBob25lX2NvbmZpZ3VyYWJsZSkKKworTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQorCitQRldfQ09SRSA6PSBleHRlcm5hbC9wYXJhbWV0ZXItZnJhbWV3b3JrCitQRldfREVGQVVMVF9TQ0hFTUFTX0RJUiA6PSAkKFBGV19DT1JFKS91cHN0cmVhbS9zY2hlbWFzCitQRldfU0NIRU1BU19ESVIgOj0gJChQRldfREVGQVVMVF9TQ0hFTUFTX0RJUikKKworVE9PTFMgOj0gZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMKK0JVSUxEX1BGV19TRVRUSU5HUyA6PSAkKFRPT0xTKS9idWlsZF9hdWRpb19wZndfc2V0dGluZ3MubWsKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIENPTkZJR1VSQVRJT04gRklMRVMKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyMjIyMjIyMjIyBQb2xpY3kgUEZXIFN0cnVjdHVyZXMgIyMjIyMjIyMjCisjIyMjIyMjIyMgUG9saWN5IFBGVyBTZXR0aW5ncyAjIyMjIyMjIyMKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorTE9DQUxfTU9EVUxFIDo9IHBhcmFtZXRlci1mcmFtZXdvcmsucG9saWN5CitMT0NBTF9NT0RVTEVfU1RFTSA6PSBQb2xpY3lDb25maWd1cmFibGVEb21haW5zLnhtbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrL1NldHRpbmdzL1BvbGljeQorTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBsaWJwb2xpY3ktc3Vic3lzdGVtCisKK1BGV19FRERfRklMRVMgOj0gXAorICAgICAgICAkKExPQ0FMX1BBVEgpLy4uL1NldHRpbmdzL2RldmljZV9mb3JfaW5wdXRfc291cmNlLnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvLi4vU2V0dGluZ3Mvdm9sdW1lcy5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9tZWRpYS5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9hY2Nlc3NpYmlsaXR5LnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X2R0bWYucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfZW5mb3JjZWRfYXVkaWJsZS5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9waG9uZS5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9zb25pZmljYXRpb24ucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwucGZ3IFwKKyAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyLnBmdyBcCisgICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3Jlcm91dGluZy5wZncgXAorICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9wYXRjaC5wZncKK1BGV19DUklURVJJT05fVFlQRVNfRklMRSA6PSAkKFRBUkdFVF9PVVRfVkVORE9SX0VUQykvYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sCitQRldfQ1JJVEVSSUFfRklMRSA6PSAkKFRBUkdFVF9PVVRfVkVORE9SX0VUQykvYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpYS54bWwKK1BGV19UT1BMRVZFTF9GSUxFIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRVRDKS9wYXJhbWV0ZXItZnJhbWV3b3JrL1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sCitQRldfU0NIRU1BU19ESVIgOj0gJChQRldfREVGQVVMVF9TQ0hFTUFTX0RJUikKKworaW5jbHVkZSAkKEJVSUxEX1BGV19TRVRUSU5HUykKKworZW5kaWYgI2lmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksIHBob25lX2NvbmZpZ3VyYWJsZSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9hY2Nlc3NpYmlsaXR5LnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9hY2Nlc3NpYmlsaXR5LnBmdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2U5M2RlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X2FjY2Vzc2liaWxpdHkucGZ3CkBAIC0wLDAgKzEsNTk2IEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVneQorCisJc3VwRG9tYWluOiBBY2Nlc3NpYmlsaXR5CisJCSMKKwkJIyBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZIGZvbGxvd3MgU1RSQVRFR1lfUEhPTkUgaWYgaW4gY2FsbCB3aWRlbHkgc3BlYWtpbmcKKwkJIyBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZIGZvbGxvd3MgU1RSQVRFR1lfTUVESUEgb3RoZXJ3aXNlCisJCSMKKwkJIyBPdGhlciBjYXNlIGFyZSBoYW5kbGVkIHByb2dyYW1tYXRpY2FsbHkgaGFzIGludm9sdmluZyBhY3Rpdml0eSBvZiBzdHJlYW1zLgorCQkjCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBDYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWlwID0gMAorCQkJCQlidXMgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKworCQlkb21haW46IERldmljZQorCQkJY29uZjogUmVtb3RlU3VibWl4CisJCQkJIworCQkJCSMgQWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFJlbW90ZVN1Ym1peAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgMAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAxCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHAKKwkJCQkjCisJCQkJIyBBY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmUKKwkJCQkjCisJCQkJIyBBY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCSMKKwkJCQkjIEFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEZvcmNlU3BlYWtlcldoZW5Ob3RJbkNhbGwKKwkJCQkjCisJCQkJIyBBY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXMgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoU2NvQ2Fya2l0CisJCQkJIworCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29DYXJraXQKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDEKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aFNjb0hlYWRzZXQKKwkJCQkjCisJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0hlYWRzZXQKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMQorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aFNjbworCQkJCSMKKwkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAxCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRwaG9uZQorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJIworCQkJCQkjIGFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMQorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IExpbmUKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCSMgYnV0IExpbmUgaGFzIGEgbG93ZXIgcHJpb3JpdHkgdGhhbiBXaXJlZEhlYWRzZXQgaW4gdGhpcyBjYXNlLgorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBXaXJlZEhlYWRzZXQKKwkJCQkJIworCQkJCQkjIGFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAxCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkc2V0CisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkjCisJCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IFVzYkRldmljZQorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJIworCQkJCQkjIGFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkjIE1lZGlhIHN0cmF0ZWd5IGludmVydHMgdGhlIHByaW9yaXR5IG9mIFVTQiBkZXZpY2UgdnMgYWNjZXNzb3J5CisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiQWNjZXNzb3J5CisJCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDEKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogVXNiQWNjZXNzb3J5CisJCQkJIworCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBVU0IgYWNjZXNzb3J5IG5vdCByZWFjaGFibGUgaW4gY2FsbAorCQkJCSMKKwkJCQkjIGFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgTWVkaWEgc3RyYXRlZ3kgaW52ZXJ0cyB0aGUgcHJpb3JpdHkgb2YgVVNCIGRldmljZSB2cyBhY2Nlc3NvcnkKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDEKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogRGd0bERvY2tIZWFkc2V0CisJCQkJIworCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBEZ3RsRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsCisJCQkJIworCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEF1eERpZ2l0YWwKKwkJCQkjCisJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IEhkbWkgbm90IHJlYWNoYWJsZSBpbiBjYWxsCisJCQkJIworCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMQorCisJCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKKwkJCQkjCisJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IEFubGdEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwKKwkJCQkjCisJCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIE1lZGlhIHN0cmF0ZWd5IGludmVydHMgdGhlIHByaW9yaXR5IG9mIFVTQiBkZXZpY2UgdnMgYWNjZXNzb3J5CisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAorCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBFYXJwaWVjZQorCQkJCSMKKwkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRWFycGllY2UKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X2R0bWYucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X2R0bWYucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NDI2YzYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfZHRtZi5wZncKQEAgLTAsMCArMSw2MjUgQEAKK3N1cERvbWFpbjogRGV2aWNlRm9yUHJvZHVjdFN0cmF0ZWdpZXMKKwlzdXBEb21haW46IER0bWYKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWZtID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJYnVzID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvZGV2aWNlX2FkZHJlc3MgPQorCisJCWRvbWFpbjogRGV2aWNlMgorCQkJY29uZjogUmVtb3RlU3VibWl4CisJCQkJIworCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFJlbW90ZVN1Ym1peAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgMAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAxCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwCisJCQkJIworCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKwkJCQkjCisJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQkjCisJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogRm9yY2VTcGVha2VyV2hlbk5vdEluQ2FsbAorCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKKwkJCQlGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyBJc05vdCBGb3JjZUhkbWlTeXN0ZW1FbmZvcmNlZAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMQorCisJCQljb25mOiBCbHVldG9vdGhTY29IZWFkc2V0CisJCQkJIworCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29IZWFkc2V0CisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoU2NvCisJCQkJIworCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY28KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAxCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRwaG9uZQorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJIworCQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBMaW5lCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCQkjIGJ1dCBMaW5lIGhhcyBhIGxvd2VyIHByaW9yaXR5IHRoYW4gV2lyZWRIZWFkc2V0IGluIHRoaXMgY2FzZS4KKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgV2lyZWRIZWFkc2V0CisJCQkJCSMKKwkJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMQorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRzZXQKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCSMKKwkJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFVzYkRldmljZQorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJIworCQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkjIE1lZGlhIHN0cmF0ZWd5IGludmVydHMgdGhlIHByaW9yaXR5IG9mIFVTQiBkZXZpY2UgdnMgYWNjZXNzb3J5CisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiQWNjZXNzb3J5CisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAxCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogVXNiQWNjZXNzb3J5CisJCQkJIworCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBVU0IgYWNjZXNzb3J5IG5vdCByZWFjaGFibGUgaW4gY2FsbAorCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgTWVkaWEgc3RyYXRlZ3kgaW52ZXJ0cyB0aGUgcHJpb3JpdHkgb2YgVVNCIGRldmljZSB2cyBhY2Nlc3NvcnkKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IERndGxEb2NrSGVhZHNldAorCQkJCSMKKwkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgRGd0bERvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbAorCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogSGRtaQorCQkJCSMKKwkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgSGRtaSBub3QgcmVhY2hhYmxlIGluIGNhbGwKKwkJCQkjCisJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAxCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKKwkJCQkjCisJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IEFubGdEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwKKwkJCQkjCisJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIE1lZGlhIHN0cmF0ZWd5IGludmVydHMgdGhlIHByaW9yaXR5IG9mIFVTQiBkZXZpY2UgdnMgYWNjZXNzb3J5CisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogRWFycGllY2UKKwkJCQkjCisJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEVhcnBpZWNlCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBTcGVha2VyCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgorCQkJCQkjCisJCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIElzTm90IEZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJZG9tYWluOiBBcmMKKwkJCSMKKwkJCSMgRFRNRiBzdHJhdGVneSBmb2xsb3dzIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkjIHRoZXNlIGZvbGxvd2luZyBkb21haW5zIGNvbnNpc3RzIGluIGRldmljZShzKSB0aGF0IGNhbiBjby1leGlzdCB3aXRoIG90aGVycworCQkJIyBlLmcuIEFSQywgU1BESUYsIEFVWF9MSU5FCisJCQkjCisJCQljb25mOiBTZWxlY3RlZAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWlBcmMKKworCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMgPSAxCisKKwkJCWNvbmY6IE5vdFNlbGVjdGVkCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyA9IDAKKworCQlkb21haW46IFNwZGlmCisJCQkjCisJCQkjIERUTUYgc3RyYXRlZ3kgZm9sbG93cyBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJIyB0aGVzZSBmb2xsb3dpbmcgZG9tYWlucyBjb25zaXN0cyBpbiBkZXZpY2UocykgdGhhdCBjYW4gY28tZXhpc3Qgd2l0aCBvdGhlcnMKKwkJCSMgZS5nLiBBUkMsIFNQRElGLCBBVVhfTElORQorCQkJIworCQkJY29uZjogU2VsZWN0ZWQKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGRpZgorCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiA9IDEKKworCQkJY29uZjogTm90U2VsZWN0ZWQKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmID0gMAorCisJCWRvbWFpbjogQXV4TGluZQorCQkJIworCQkJIyBEVE1GIHN0cmF0ZWd5IGZvbGxvd3MgbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCisJCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKKwkJCSMKKwkJCWNvbmY6IFNlbGVjdGVkCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQXV4TGluZQorCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSA9IDEKKworCQkJY29uZjogTm90U2VsZWN0ZWQKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lID0gMApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X2VuZm9yY2VkX2F1ZGlibGUucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X2VuZm9yY2VkX2F1ZGlibGUucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYWE5YWMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfZW5mb3JjZWRfYXVkaWJsZS5wZncKQEAgLTAsMCArMSwzNjEgQEAKK3N1cERvbWFpbjogRGV2aWNlRm9yUHJvZHVjdFN0cmF0ZWd5CisKKwlzdXBEb21haW46IEVuZm9yY2VkQXVkaWJsZQorCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBDYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQkjIG5vIGVuZm9yY2VkX2F1ZGlibGUgb24gcmVtb3RlIHN1Ym1peCAoZS5nLiBXRkQpCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCWJ1cyA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKworCQlkb21haW46IFNwZWFrZXIKKwkJCWNvbmY6IFNlbGVjdGVkCisJCQkJIworCQkJCSMgc3RyYXRlZ3kgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSB1c2VzIHNhbWUgcm91dGluZyBwb2xpY3kgYXMgU1RSQVRFR1lfU09OSUZJQ0FUSU9OCisJCQkJIyBleGNlcHQ6CisJCQkJIyAgICAtIHdoZW4gaW4gY2FsbCB3aGVyZSBpdCBkb2Vzbid0IGRlZmF1bHQgdG8gU1RSQVRFR1lfUEhPTkUgYmVoYXZpb3IKKwkJCQkjICAgIC0gaW4gY291bnRyaWVzIHdoZXJlIG5vdCBlbmZvcmNlZCBpbiB3aGljaCBjYXNlIGl0IGZvbGxvd3MgU1RSQVRFR1lfTUVESUEKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJQU5ZCisJCQkJCUZvcmNlVXNlRm9yU3lzdGVtIElzIEZvcmNlU3lzdGVtRW5mb3JjZWQKKwkJCQkJQUxMCisJCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzIEZvcmNlU3BlYWtlcgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBSZW1vdGVTdWJtaXgKKwkJCQkJCUFOWQorCQkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgQmx1ZXRvb3RoQTJkcAorCQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKwkJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCisJCQkJCSMKKwkJCQkJIyBTcGVha2VyIGlzIGFsc28gdGhlIGZhbGxiYWNrIGRldmljZSBpZiBhbnkgb2YgdGhlIGRldmljZSBmcm9tIERldmljZTIgZG9tYWluCisJCQkJCSMgaXMgc2VsZWN0ZWQuCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFJlbW90ZVN1Ym1peAorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBMaW5lCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFdpcmVkSGVhZHNldAorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiRGV2aWNlCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIERndGxEb2NrSGVhZHNldAorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBIZG1pCisJCQkJCQlBTlkKKwkJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIEFubGdEb2NrSGVhZHNldAorCQkJCQkJCUZvcmNlVXNlRm9yRG9jayBJc05vdCBGb3JjZUFuYWxvZ0RvY2sKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCisJCQljb25mOiBOb3RTZWxlY3RlZAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCisJCWRvbWFpbjogRGV2aWNlMgorCQkJY29uZjogUmVtb3RlU3VibWl4CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBSZW1vdGVTdWJtaXgKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIDAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMQorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHAKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHAKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAxCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRwaG9uZQorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogTGluZQorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMQorCisJCQljb25mOiBXaXJlZEhlYWRzZXQKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBVc2JBY2Nlc3NvcnkKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDEKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBVc2JEZXZpY2UKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDEKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBIZG1pCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDEKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEFubGdEb2NrSGVhZHNldAorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJRm9yY2VVc2VGb3JEb2NrIElzIEZvcmNlQW5hbG9nRG9jaworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQW5sZ0RvY2tIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBOb0RldmljZQorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X21lZGlhLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9tZWRpYS5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZkMzU1YwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9tZWRpYS5wZncKQEAgLTAsMCArMSwzNDAgQEAKK3N1cERvbWFpbjogRGV2aWNlRm9yUHJvZHVjdFN0cmF0ZWd5CisJc3VwRG9tYWluOiBNZWRpYQorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWZtID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCWJ1cyA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvZGV2aWNlX2FkZHJlc3MgPQorCisJCWRvbWFpbjogRGV2aWNlMgorCQkJY29uZjogUmVtb3RlU3VibWl4CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBSZW1vdGVTdWJtaXgKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIDAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMQorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlQnRTY28KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMQorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlQnRTY28KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VCdFNjbworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBGb3JjZVNwZWFrZXIKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzIEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCSMKKwkJCQkjIElmIGhkbWkgc3lzdGVtIGF1ZGlvIG1vZGUgaXMgb24sIHJlbW92ZSBzcGVha2VyIG91dCBvZiBvdXRwdXQgbGlzdC4KKwkJCQkjCisJCQkJRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8gSXNOb3QgRm9yY2VIZG1pU3lzdGVtRW5mb3JjZWQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRwaG9uZQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBMaW5lCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDEKKworCQkJY29uZjogV2lyZWRIZWFkc2V0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBVc2JBY2Nlc3NvcnkKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAxCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFVzYkRldmljZQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDEKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogRGd0bERvY2tIZWFkc2V0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBBdXhEaWdpdGFsCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAxCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKKwkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCSMKKwkJCQkjIElmIGhkbWkgc3lzdGVtIGF1ZGlvIG1vZGUgaXMgb24sIHJlbW92ZSBzcGVha2VyIG91dCBvZiBvdXRwdXQgbGlzdC4KKwkJCQkjCisJCQkJRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8gSXNOb3QgRm9yY2VIZG1pU3lzdGVtRW5mb3JjZWQKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQlkb21haW46IEFyYworCQkJIworCQkJIyB0aGVzZSBmb2xsb3dpbmcgZG9tYWlucyBjb25zaXN0cyBpbiBkZXZpY2UocykgdGhhdCBjYW4gY28tZXhpc3Qgd2l0aCBvdGhlcnMKKwkJCSMgZS5nLiBBUkMsIFNQRElGLCBBVVhfTElORQorCQkJIworCQkJY29uZjogU2VsZWN0ZWQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWlBcmMKKworCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjID0gMQorCisJCQljb25mOiBOb3RTZWxlY3RlZAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjID0gMAorCisJCWRvbWFpbjogU3BkaWYKKwkJCSMKKwkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCisJCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKKwkJCSMKKwkJCWNvbmY6IFNlbGVjdGVkCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGRpZgorCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYgPSAxCisKKwkJCWNvbmY6IE5vdFNlbGVjdGVkCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYgPSAwCisKKwkJZG9tYWluOiBBdXhMaW5lCisJCQljb25mOiBTZWxlY3RlZAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQXV4TGluZQorCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUgPSAxCisKKwkJCWNvbmY6IE5vdFNlbGVjdGVkCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUgPSAwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfcGF0Y2gucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3BhdGNoLnBmdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmNjMDkwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3BhdGNoLnBmdwpAQCAtMCwwICsxLDM2IEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVneQorCXN1cERvbWFpbjogUGF0Y2gKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGF0Y2gvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCWJ1cyA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGF0Y2gvZGV2aWNlX2FkZHJlc3MgPQorCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9waG9uZS5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfcGhvbmUucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2OTNkNGUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfcGhvbmUucGZ3CkBAIC0wLDAgKzEsNDgzIEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVneQorCXN1cERvbWFpbjogUGhvbmUKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQkjIG5vIHNvbmlmaWNhdGlvbiBvbiByZW1vdGUgc3VibWl4IChlLmcuIFdGRCkKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJYnVzID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Bob25lL2RldmljZV9hZGRyZXNzID0KKworCQlkb21haW46IERldmljZQorCQkJY29uZjogU2NvQ2Fya2l0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29DYXJraXQKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMQorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aFNjb0hlYWRzZXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0hlYWRzZXQKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aFNjbworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwCisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZU5vbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlTm9uZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMQorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHNldAorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0CisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IExpbmUKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDEKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogVXNiRGV2aWNlCisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKKwkJCQlBTlkKKwkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKwkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlTm9uZQorCQkJCQlBTEwKKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKKwkJCQkJCSMKKwkJCQkJCSMgSW4gY2FzZSBvZiBGb3JjZSBTcGVha2VyLCBwcmlvcml0eSBiZXR3ZWVuIGRldmljZSBhbmQgYWNjZXNzb3J5IGFyZQorCQkJCQkJIyBpbnZlcnRlZCBjb21wYXJlZCB0byBGb3JjZSBOb25lIG9yIEJ0IFNjbworCQkJCQkJIworCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFVzYkFjY2Vzc29yeQorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5CisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IERndGxEb2NrSGVhZHNldAorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0CisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEhkbWkKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMQorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0CisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogRWFycGllY2UKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEVhcnBpZWNlCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDEKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFNwZWFrZXIKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIG9uIGRlZmF1bHQgb3V0cHV0IGRldmljZSB3aGljaCBjYW4gYmUgc3BlYWtlciBmb3IgZXhhbXBsZQorCQkJCSMKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDEKKworCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfcmVyb3V0aW5nLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9yZXJvdXRpbmcucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZjg4MTQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfcmVyb3V0aW5nLnBmdwpAQCAtMCwwICsxLDM2IEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVneQorCXN1cERvbWFpbjogUmVyb3V0aW5nCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJYnVzID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yZXJvdXRpbmcvZGV2aWNlX2FkZHJlc3MgPQorCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9zb25pZmljYXRpb24ucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3NvbmlmaWNhdGlvbi5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzRlZGVlYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9zb25pZmljYXRpb24ucGZ3CkBAIC0wLDAgKzEsNDkwIEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVneQorCXN1cERvbWFpbjogU29uaWZpY2F0aW9uCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBwaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsIGJ1dCBIRE1JIGlzIG5vdCByZWFjaGFibGUKKwkJCQkJIworCQkJCQloZG1pID0gMAorCQkJCQlidXMgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9kZXZpY2VfYWRkcmVzcyA9CisKKwkJZG9tYWluOiBTcGVha2VyCisKKwkJCWNvbmY6IFNlbGVjdGVkCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBFTkZPUkNFRF9BVURJQkxFIGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJCSMKKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgTGluZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKworCQkJY29uZjogTm90U2VsZWN0ZWQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCisJCWRvbWFpbjogRGV2aWNlMgorCisJCQljb25mOiBCbHVldG9vdGhBMmRwCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogU2NvQ2Fya2l0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgcGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvQ2Fya2l0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMQorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFNjb0hlYWRzZXQKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBwaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29IZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFNjbworCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRwaG9uZQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMQorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IExpbmUKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJIyBidXQgTGluZSBoYXMgYSBsb3dlciBwcmlvcml0eSB0aGFuIFdpcmVkSGVhZHNldCBpbiB0aGlzIGNhc2UuCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFdpcmVkSGVhZHNldAorCQkJCQkjCisJCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDEKKworCQkJY29uZjogV2lyZWRIZWFkc2V0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCQkjCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFVzYkRldmljZQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvbiBGb2xsb3dzIFBob25lIFN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJCSMKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAxCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogVXNiQWNjZXNzb3J5CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBGb2xsb3dzIFBob25lIFN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBVU0IgQWNjZXNzb3J5IG5vdCByZWFjaGFibGUgaW4gY2FsbC4KKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IERndGxEb2NrSGVhZHNldAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgRGd0bERvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbC4KKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEFubGdEb2NrSGVhZHNldAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQW5sZ0RvY2tIZWFkc2V0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgQW5sZ0RvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbC4KKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJRm9yY2VVc2VGb3JEb2NrIElzIEZvcmNlQW5hbG9nRG9jaworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBFYXJwaWVjZQorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBGb2xsb3dzIFBob25lIFN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRWFycGllY2UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogTm9uZQorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhM2RkNWYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwucGZ3CkBAIC0wLDAgKzEsNTM2IEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVneQorCXN1cERvbWFpbjogU29uaWZpY2F0aW9uUmVzcGVjdGZ1bAorCQkjCisJCSMgU29uaWZpY2lhdGlvbiBSZXNwZWN0ZnVsIGZvbGxvd3M6CisJCSMJLSBJZiBpbiBjYWxsOiBTdHJhdGVneSBzb25pZmljYXRpb24gKHRoYXQgZm9sbG93cyBwaG9uZSBzdHJhdGVneSBpbiBjYWxsIGFsc28uLi4pCisJCSMJLSBJZiBub3QgaW4gY2FsbCBBTkQgYSBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlIHJlbW90ZWx5OiBTdHJhdGVneSBzb25pZmljYXRpb24gKHRoYXQKKwkJIyAgICAgZm9sbG93cyBlbmZvcmNlZCBhdWRpYmxlLCB3aGljaCBmb2xsb3dzIG1lZGlhKQorCQkjCS0gaWYgbm90IGluIGNhbGwgYW5kIG5vIG11c2ljIHN0cmVhbSBhY3RpdmUgcmVtb3RlbHkgYW5kIG11c2ljIHN0cmVhbSBhY3RpdmUpOiBzdHJhdGVneQorCQkjICAgICBtZWRpYQorCQkjICAgLSBPdGhlcndpc2UgZm9sbG93cyBzb25pZmljYXRpb24gYnkgcmVwbGFjaW5nIHNwZWFrZXIgd2l0aCBzcGVha2VyIHNhZmUgaWYgc3BlYWtlciBpcworCQkjCSAgc2VsZWN0ZWQuCisJCSMKKwkJIyBDYXNlIG9mIHN0cmVhbSBhY3RpdmUgaGFuZGxlZCBwcm9ncmFtbWF0aWNhbGx5CisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvZGV2aWNlX2FkZHJlc3MgPQorCisJCWRvbWFpbjogU3BlYWtlcnMKKworCQkJY29uZjogU3BlYWtlclNhZmUKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXJTYWZlCisJCQkJIworCQkJCSMgRm9sbG93cyBzb25pZmljYXRpb24gc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgYW5kIHJlcGxhY2Ugc3BlYWtlciBieSBzcGVha2VyIHNhZmUKKwkJCQkjIGlmIGFuZCBvbmx5IGlmIHNwZWFrZXIgb25seSBzZWxlY3RlZAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXJfc2FmZSA9IDEKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgRm9sbG93cyBzb25pZmljYXRpb24gc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQlBTEwKKwkJCQkJCSMKKwkJCQkJCSMgRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBjYWxsCisJCQkJCQkjCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIExpbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlzcGVha2VyID0gMQorCisJCQljb25mOiBOb25lCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJZG9tYWluOiBEZXZpY2UyCisJCQljb25mOiBCbHVldG9vdGhBMmRwCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoU2NvQ2Fya2l0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0NhcmtpdAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBCbHVldG9vdGhTY29IZWFkc2V0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoU2NvCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjbworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRwaG9uZQorCQkJCUFOWQorCQkJCQlBTEwKKwkJCQkJCSMKKwkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkJCSMKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJCQkjCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBMaW5lCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCQkjIGJ1dCBMaW5lIGhhcyBhIGxvd2VyIHByaW9yaXR5IHRoYW4gV2lyZWRIZWFkc2V0IGluIHRoaXMgY2FzZS4KKwkJCQkJIworCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBXaXJlZEhlYWRzZXQKKwkJCQkJIworCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAxCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkc2V0CisJCQkJQU5ZCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCQkJIworCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQlBTEwKKwkJCQkJCSMKKwkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKKwkJCQkJCSMKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBVc2JEZXZpY2UKKwkJCQlBTlkKKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCQkjCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCQkJIworCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBVc2JBY2Nlc3NvcnkKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IFVzYkFjY2Vzc29yeSBub3QgcmVhY2hhYmxlIGluIGNhbGwuCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAxCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IERndGxEb2NrSGVhZHNldAorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgRGd0bERvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbC4KKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQXV4RGlnaXRhbAorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgSERNSSBub3QgcmVhY2hhYmxlIGluIGNhbGwuCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMQorCisJCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IEFubGdEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwuCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBFYXJwaWVjZQorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEVhcnBpZWNlCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMQorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZjNzY3MAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIucGZ3CkBAIC0wLDAgKzEsNDMgQEAKK3N1cERvbWFpbjogRGV2aWNlRm9yUHJvZHVjdFN0cmF0ZWd5CisJc3VwRG9tYWluOiBUcmFuc21pdHRlZFRocm91Z2hTcGVha2VyCisJCWRvbWFpbjogVW5yZWFjaGVhYmxlRGV2aWNlcworCQkJY29uZjogQ2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlidXMgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9kZXZpY2VfYWRkcmVzcyA9CisKKwkJZG9tYWluOiBTcGVha2VyCisJCQljb25mOiBTZWxlY3RlZAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKworCQkJY29uZjogTm90U2VsZWN0ZWQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9Qb2xpY3lDb25maWd1cmFibGVEb21haW5zLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL1BvbGljeUNvbmZpZ3VyYWJsZURvbWFpbnMueG1sCmluZGV4IGI0M2Y4M2IuLjA3MTA0NDEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL1BvbGljeUNvbmZpZ3VyYWJsZURvbWFpbnMueG1sCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL1BvbGljeUNvbmZpZ3VyYWJsZURvbWFpbnMueG1sCkBAIC04NDcyLDcgKzg0NzIsNyBAQAogICAgIDxDb25maWd1cmF0aW9ucz4KICAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlNvbmlmaWNhdGlvbiI+CiAgICAgICAgIDxDb21wb3VuZFJ1bGUgVHlwZT0iQWxsIj4KLSAgICAgICAgICA8U2VsZWN0aW9uQ3JpdGVyaW9uUnVsZSBTZWxlY3Rpb25Dcml0ZXJpb249IlRlbGVwaG9ueU1vZGUiIE1hdGNoZXNXaGVuPSJJcyIgVmFsdWU9IlJpbmdUb25lIi8+CisgICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJSaW5ndG9uZSIvPgogICAgICAgICA8L0NvbXBvdW5kUnVsZT4KICAgICAgIDwvQ29uZmlndXJhdGlvbj4KICAgICAgIDxDb25maWd1cmF0aW9uIE5hbWU9IlBob25lIj4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfYWNjZXNzaWJpbGl0eS5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2FjY2Vzc2liaWxpdHkucGZ3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjExOTgwLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfYWNjZXNzaWJpbGl0eS5wZncKKysrIC9kZXYvbnVsbApAQCAtMSw1OTMgKzAsMCBAQAotc3VwRG9tYWluOiBEZXZpY2VGb3JTdHJhdGVneQotCi0Jc3VwRG9tYWluOiBBY2Nlc3NpYmlsaXR5Ci0JCSMKLQkJIyBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZIGZvbGxvd3MgU1RSQVRFR1lfUEhPTkUgaWYgaW4gY2FsbCB3aWRlbHkgc3BlYWtpbmcKLQkJIyBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZIGZvbGxvd3MgU1RSQVRFR1lfTUVESUEgb3RoZXJ3aXNlCi0JCSMKLQkJIyBPdGhlciBjYXNlIGFyZSBoYW5kbGVkIHByb2dyYW1tYXRpY2FsbHkgaGFzIGludm9sdmluZyBhY3Rpdml0eSBvZiBzdHJlYW1zLgotCQkjCi0JCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCi0JCQljb25mOiBDYWxpYnJhdGlvbgotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJaGRtaV9hcmMgPSAwCi0JCQkJCXNwZGlmID0gMAotCQkJCQlhdXhfbGluZSA9IDAKLQkJCQkJZm0gPSAwCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlpcCA9IDAKLQkJCQkJYnVzID0gMAotCQkJCQlzdHViID0gMAotCi0JCWRvbWFpbjogRGV2aWNlCi0JCQljb25mOiBSZW1vdGVTdWJtaXgKLQkJCQkjCi0JCQkJIyBBY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgUmVtb3RlU3VibWl4Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAxCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHAKLQkJCQkjCi0JCQkJIyBBY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lCi0JCQkJIwotCQkJCSMgQWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCi0JCQkJIwotCQkJCSMgQWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIwotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEZvcmNlU3BlYWtlcldoZW5Ob3RJbkNhbGwKLQkJCQkjCi0JCQkJIyBBY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXMgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDEKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aFNjb0NhcmtpdAotCQkJCSMKLQkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJIwotCQkJCUFOWQotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvQ2Fya2l0Ci0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMQotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoU2NvSGVhZHNldAotCQkJCSMKLQkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJIwotCQkJCUFOWQotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvSGVhZHNldAotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMQotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aFNjbwotCQkJCSMKLQkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJIwotCQkJCUFOWQotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMQotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKLQkJCQlBTlkKLQkJCQkJIwotCQkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCSMKLQkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogTGluZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJIyBidXQgTGluZSBoYXMgYSBsb3dlciBwcmlvcml0eSB0aGFuIFdpcmVkSGVhZHNldCBpbiB0aGlzIGNhc2UuCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFdpcmVkSGVhZHNldAotCQkJCQkjCi0JCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAxCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogV2lyZWRIZWFkc2V0Ci0JCQkJQU5ZCi0JCQkJCSMKLQkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJQU5ZCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCQkjCi0JCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAxCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBVc2JEZXZpY2UKLQkJCQlBTlkKLQkJCQkJIwotCQkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCSMKLQkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkJIyBNZWRpYSBzdHJhdGVneSBpbnZlcnRzIHRoZSBwcmlvcml0eSBvZiBVU0IgZGV2aWNlIHZzIGFjY2Vzc29yeQotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFVzYkFjY2Vzc29yeQotCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMQotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBVc2JBY2Nlc3NvcnkKLQkJCQkjCi0JCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IFVTQiBhY2Nlc3Nvcnkgbm90IHJlYWNoYWJsZSBpbiBjYWxsCi0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIyBNZWRpYSBzdHJhdGVneSBpbnZlcnRzIHRoZSBwcmlvcml0eSBvZiBVU0IgZGV2aWNlIHZzIGFjY2Vzc29yeQotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JBY2Nlc3NvcnkKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDEKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogRGd0bERvY2tIZWFkc2V0Ci0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjIGJ1dCBEZ3RsRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsCi0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBBdXhEaWdpdGFsCi0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjIGJ1dCBIZG1pIG5vdCByZWFjaGFibGUgaW4gY2FsbAotCQkJCSMKLQkJCQkjIGFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAxCi0KLQkJCWNvbmY6IEFubGdEb2NrSGVhZHNldAotCQkJCSMKLQkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIyBidXQgQW5sZ0RvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbAotCQkJCSMKLQkJCQkjIGFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMgTWVkaWEgc3RyYXRlZ3kgaW52ZXJ0cyB0aGUgcHJpb3JpdHkgb2YgVVNCIGRldmljZSB2cyBhY2Nlc3NvcnkKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJRm9yY2VVc2VGb3JEb2NrIElzIEZvcmNlQW5hbG9nRG9jawotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBFYXJwaWVjZQotCQkJCSMKLQkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJIwotCQkJCUFOWQotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRWFycGllY2UKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMQotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMQotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogRGVmYXVsdAotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9kdG1mLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfZHRtZi5wZncKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4M2M3NDEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9kdG1mLnBmdworKysgL2Rldi9udWxsCkBAIC0xLDYyMyArMCwwIEBACi1zdXBEb21haW46IERldmljZUZvclN0cmF0ZWd5Ci0KLQlzdXBEb21haW46IER0bWYKLQotCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcwotCQkJY29uZjogQ2FsaWJyYXRpb24KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWZtID0gMAotCQkJCQlzcGVha2VyX3NhZmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlpcCA9IDAKLQkJCQkJYnVzID0gMAotCQkJCQlzdHViID0gMAotCi0JCWRvbWFpbjogRGV2aWNlMgotCQkJY29uZjogUmVtb3RlU3VibWl4Ci0JCQkJIwotCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFJlbW90ZVN1Ym1peAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMQotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcAotCQkJCSMKLQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lcwotCQkJCSMKLQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcwotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQkJCQkjCi0JCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IEZvcmNlU3BlYWtlcldoZW5Ob3RJbkNhbGwKLQkJCQkjCi0JCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXMgRm9yY2VTcGVha2VyCi0JCQkJRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8gSXNOb3QgRm9yY2VIZG1pU3lzdGVtRW5mb3JjZWQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAxCi0KLQkJCWNvbmY6IEJsdWV0b290aFNjb0hlYWRzZXQKLQkJCQkjCi0JCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCSMKLQkJCQlBTlkKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0hlYWRzZXQKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbwotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoU2NvCi0JCQkJIwotCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY28KLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbwotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMQotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKLQkJCQlBTlkKLQkJCQkJIwotCQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCSMKLQkJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IExpbmUKLQkJCQlBTlkKLQkJCQkJIwotCQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJCSMgYnV0IExpbmUgaGFzIGEgbG93ZXIgcHJpb3JpdHkgdGhhbiBXaXJlZEhlYWRzZXQgaW4gdGhpcyBjYXNlLgotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJQU5ZCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBXaXJlZEhlYWRzZXQKLQkJCQkJIwotCQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMQotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBXaXJlZEhlYWRzZXQKLQkJCQlBTlkKLQkJCQkJIwotCQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCSMKLQkJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBVc2JEZXZpY2UKLQkJCQlBTlkKLQkJCQkJIwotCQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCSMKLQkJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkJIyBNZWRpYSBzdHJhdGVneSBpbnZlcnRzIHRoZSBwcmlvcml0eSBvZiBVU0IgZGV2aWNlIHZzIGFjY2Vzc29yeQotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFVzYkFjY2Vzc29yeQotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDEKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBVc2JBY2Nlc3NvcnkKLQkJCQkjCi0JCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IFVTQiBhY2Nlc3Nvcnkgbm90IHJlYWNoYWJsZSBpbiBjYWxsCi0JCQkJIwotCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIyBNZWRpYSBzdHJhdGVneSBpbnZlcnRzIHRoZSBwcmlvcml0eSBvZiBVU0IgZGV2aWNlIHZzIGFjY2Vzc29yeQotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JBY2Nlc3NvcnkKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IERndGxEb2NrSGVhZHNldAotCQkJCSMKLQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIyBidXQgRGd0bERvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbAotCQkJCSMKLQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IEhkbWkKLQkJCQkjCi0JCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IEhkbWkgbm90IHJlYWNoYWJsZSBpbiBjYWxsCi0JCQkJIwotCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDEKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IEFubGdEb2NrSGVhZHNldAotCQkJCSMKLQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIyBidXQgQW5sZ0RvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbAotCQkJCSMKLQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMgTWVkaWEgc3RyYXRlZ3kgaW52ZXJ0cyB0aGUgcHJpb3JpdHkgb2YgVVNCIGRldmljZSB2cyBhY2Nlc3NvcnkKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogRWFycGllY2UKLQkJCQkjCi0JCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCSMKLQkJCQlBTlkKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEVhcnBpZWNlCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDEKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogU3BlYWtlcgotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKLQkJCQkJIwotCQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyBJc05vdCBGb3JjZUhkbWlTeXN0ZW1FbmZvcmNlZAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDEKLQotCQkJY29uZjogRGVmYXVsdAotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJZG9tYWluOiBBcmMKLQkJCSMKLQkJCSMgRFRNRiBzdHJhdGVneSBmb2xsb3dzIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkjIHRoZXNlIGZvbGxvd2luZyBkb21haW5zIGNvbnNpc3RzIGluIGRldmljZShzKSB0aGF0IGNhbiBjby1leGlzdCB3aXRoIG90aGVycwotCQkJIyBlLmcuIEFSQywgU1BESUYsIEFVWF9MSU5FCi0JCQkjCi0JCQljb25mOiBTZWxlY3RlZAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWlBcmMKLQotCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjID0gMQotCi0JCQljb25mOiBOb3RTZWxlY3RlZAotCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjID0gMAotCi0JCWRvbWFpbjogU3BkaWYKLQkJCSMKLQkJCSMgRFRNRiBzdHJhdGVneSBmb2xsb3dzIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkjIHRoZXNlIGZvbGxvd2luZyBkb21haW5zIGNvbnNpc3RzIGluIGRldmljZShzKSB0aGF0IGNhbiBjby1leGlzdCB3aXRoIG90aGVycwotCQkJIyBlLmcuIEFSQywgU1BESUYsIEFVWF9MSU5FCi0JCQkjCi0JCQljb25mOiBTZWxlY3RlZAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZGlmCi0KLQkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiA9IDEKLQotCQkJY29uZjogTm90U2VsZWN0ZWQKLQkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiA9IDAKLQotCQlkb21haW46IEF1eExpbmUKLQkJCSMKLQkJCSMgRFRNRiBzdHJhdGVneSBmb2xsb3dzIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkjIHRoZXNlIGZvbGxvd2luZyBkb21haW5zIGNvbnNpc3RzIGluIGRldmljZShzKSB0aGF0IGNhbiBjby1leGlzdCB3aXRoIG90aGVycwotCQkJIyBlLmcuIEFSQywgU1BESUYsIEFVWF9MSU5FCi0JCQkjCi0JCQljb25mOiBTZWxlY3RlZAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEF1eExpbmUKLQotCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lID0gMQotCi0JCQljb25mOiBOb3RTZWxlY3RlZAotCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lID0gMApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9lbmZvcmNlZF9hdWRpYmxlLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfZW5mb3JjZWRfYXVkaWJsZS5wZncKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1MDQ2MzEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9lbmZvcmNlZF9hdWRpYmxlLnBmdworKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi1zdXBEb21haW46IERldmljZUZvclN0cmF0ZWd5Ci0KLQlzdXBEb21haW46IEVuZm9yY2VkQXVkaWJsZQotCi0JCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCi0JCQljb25mOiBDYWxpYnJhdGlvbgotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJIyBubyBlbmZvcmNlZF9hdWRpYmxlIG9uIHJlbW90ZSBzdWJtaXggKGUuZy4gV0ZEKQotCQkJCQloZG1pX2FyYyA9IDAKLQkJCQkJc3BkaWYgPSAwCi0JCQkJCWF1eF9saW5lID0gMAotCQkJCQlzcGVha2VyX3NhZmUgPSAwCi0JCQkJCWlwID0gMAotCQkJCQlidXMgPSAwCi0JCQkJCWZtID0gMAotCQkJCQlzdHViID0gMAotCi0JCWRvbWFpbjogU3BlYWtlcgotCQkJY29uZjogU2VsZWN0ZWQKLQkJCQkjCi0JCQkJIyBzdHJhdGVneSBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFIHVzZXMgc2FtZSByb3V0aW5nIHBvbGljeSBhcyBTVFJBVEVHWV9TT05JRklDQVRJT04KLQkJCQkjIGV4Y2VwdDoKLQkJCQkjICAgIC0gd2hlbiBpbiBjYWxsIHdoZXJlIGl0IGRvZXNuJ3QgZGVmYXVsdCB0byBTVFJBVEVHWV9QSE9ORSBiZWhhdmlvcgotCQkJCSMgICAgLSBpbiBjb3VudHJpZXMgd2hlcmUgbm90IGVuZm9yY2VkIGluIHdoaWNoIGNhc2UgaXQgZm9sbG93cyBTVFJBVEVHWV9NRURJQQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQkJCQlBTlkKLQkJCQkJRm9yY2VVc2VGb3JTeXN0ZW0gSXMgRm9yY2VTeXN0ZW1FbmZvcmNlZAotCQkJCQlBTEwKLQkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXMgRm9yY2VTcGVha2VyCi0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFJlbW90ZVN1Ym1peAotCQkJCQkJQU5ZCi0JCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0JCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBCbHVldG9vdGhBMmRwCi0JCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcwotCQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQkJCQkJIwotCQkJCQkjIFNwZWFrZXIgaXMgYWxzbyB0aGUgZmFsbGJhY2sgZGV2aWNlIGlmIGFueSBvZiB0aGUgZGV2aWNlIGZyb20gRGV2aWNlMiBkb21haW4KLQkJCQkJIyBpcyBzZWxlY3RlZC4KLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgUmVtb3RlU3VibWl4Ci0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFdpcmVkSGVhZHBob25lCi0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIExpbmUKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgV2lyZWRIZWFkc2V0Ci0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFVzYkFjY2Vzc29yeQotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JEZXZpY2UKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgRGd0bERvY2tIZWFkc2V0Ci0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIEhkbWkKLQkJCQkJCUFOWQotCQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJCQkJRm9yY2VVc2VGb3JEb2NrIElzTm90IEZvcmNlQW5hbG9nRG9jawotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMQotCi0JCQljb25mOiBOb3RTZWxlY3RlZAotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDAKLQotCQlkb21haW46IERldmljZTIKLQkJCWNvbmY6IFJlbW90ZVN1Ym1peAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgUmVtb3RlU3VibWl4Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAxCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcwotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHBob25lCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogTGluZQotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDEKLQotCQkJY29uZjogV2lyZWRIZWFkc2V0Ci0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDEKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFVzYkFjY2Vzc29yeQotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JBY2Nlc3NvcnkKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDEKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBVc2JEZXZpY2UKLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAxCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogRGd0bERvY2tIZWFkc2V0Ci0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEhkbWkKLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDEKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEFubGdEb2NrSGVhZHNldAotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJRm9yY2VVc2VGb3JEb2NrIElzIEZvcmNlQW5hbG9nRG9jawotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQW5sZ0RvY2tIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogTm9EZXZpY2UKLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X21lZGlhLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfbWVkaWEucGZ3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGI2YWUwLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfbWVkaWEucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsMzM4ICswLDAgQEAKLWRvbWFpbkdyb3VwOiBEZXZpY2VGb3JTdHJhdGVneQotCi0JZG9tYWluR3JvdXA6IE1lZGlhCi0KLQkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKLQkJCWNvbmY6IENhbGlicmF0aW9uCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZm0gPSAwCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJaXAgPSAwCi0JCQkJCWJ1cyA9IDAKLQkJCQkJc3R1YiA9IDAKLQotCQlkb21haW46IERldmljZTIKLQkJCWNvbmY6IFJlbW90ZVN1Ym1peAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgUmVtb3RlU3VibWl4Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAxCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHAKLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VCdFNjbwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMQotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlQnRTY28KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlQnRTY28KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEZvcmNlU3BlYWtlcgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXMgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCi0JCQkJIwotCQkJCSMgSWYgaGRtaSBzeXN0ZW0gYXVkaW8gbW9kZSBpcyBvbiwgcmVtb3ZlIHNwZWFrZXIgb3V0IG9mIG91dHB1dCBsaXN0LgotCQkJCSMKLQkJCQlGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyBJc05vdCBGb3JjZUhkbWlTeXN0ZW1FbmZvcmNlZAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDEKLQkJCQkJaGRtaSA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBXaXJlZEhlYWRwaG9uZQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogTGluZQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlsaW5lID0gMQotCi0JCQljb25mOiBXaXJlZEhlYWRzZXQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBVc2JBY2Nlc3NvcnkKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBVc2JEZXZpY2UKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMQotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBBdXhEaWdpdGFsCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMQotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEFubGdEb2NrSGVhZHNldAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJRm9yY2VVc2VGb3JEb2NrIElzIEZvcmNlQW5hbG9nRG9jawotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCi0JCQkJIwotCQkJCSMgSWYgaGRtaSBzeXN0ZW0gYXVkaW8gbW9kZSBpcyBvbiwgcmVtb3ZlIHNwZWFrZXIgb3V0IG9mIG91dHB1dCBsaXN0LgotCQkJCSMKLQkJCQlGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyBJc05vdCBGb3JjZUhkbWlTeXN0ZW1FbmZvcmNlZAotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZUJ0U2NvCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMQotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IERlZmF1bHQKLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJZG9tYWluOiBBcmMKLQkJCSMKLQkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCi0JCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKLQkJCSMKLQkJCWNvbmY6IFNlbGVjdGVkCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pQXJjCi0KLQkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMgPSAxCi0KLQkJCWNvbmY6IE5vdFNlbGVjdGVkCi0JCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjID0gMAotCi0JCWRvbWFpbjogU3BkaWYKLQkJCSMKLQkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCi0JCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKLQkJCSMKLQkJCWNvbmY6IFNlbGVjdGVkCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGRpZgotCi0JCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmID0gMQotCi0JCQljb25mOiBOb3RTZWxlY3RlZAotCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiA9IDAKLQotCQlkb21haW46IEF1eExpbmUKLQkJCWNvbmY6IFNlbGVjdGVkCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBdXhMaW5lCi0KLQkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUgPSAxCi0KLQkJCWNvbmY6IE5vdFNlbGVjdGVkCi0JCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lID0gMApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9waG9uZS5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3Bob25lLnBmdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM3MWFkOS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3Bob25lLnBmdworKysgL2Rldi9udWxsCkBAIC0xLDQ4MyArMCwwIEBACi1zdXBEb21haW46IERldmljZUZvclN0cmF0ZWd5Ci0KLQlzdXBEb21haW46IFBob25lCi0KLQkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKLQkJCWNvbmY6IENhbGlicmF0aW9uCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJIyBubyBzb25pZmljYXRpb24gb24gcmVtb3RlIHN1Ym1peCAoZS5nLiBXRkQpCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWhkbWlfYXJjID0gMAotCQkJCQlhdXhfbGluZSA9IDAKLQkJCQkJc3BkaWYgPSAwCi0JCQkJCWZtID0gMAotCQkJCQlzcGVha2VyX3NhZmUgPSAwCi0JCQkJCWlwID0gMAotCQkJCQlidXMgPSAwCi0JCQkJCXN0dWIgPSAwCi0KLQkJZG9tYWluOiBEZXZpY2UKLQkJCWNvbmY6IFNjb0NhcmtpdAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvQ2Fya2l0Ci0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoU2NvSGVhZHNldAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvSGVhZHNldAotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aFNjbwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAxCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcAotCQkJCSMKLQkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCi0JCQkJIyBvciBGT1JDRV9OT05FCi0JCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VOb25lCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0JCQkJIwotCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KLQkJCQkjIG9yIEZPUkNFX05PTkUKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VOb25lCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCi0JCQkJIwotCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KLQkJCQkjIG9yIEZPUkNFX05PTkUKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHBob25lCi0JCQkJIwotCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KLQkJCQkjIG9yIEZPUkNFX05PTkUKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogV2lyZWRIZWFkc2V0Ci0JCQkJIwotCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KLQkJCQkjIG9yIEZPUkNFX05PTkUKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDEKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IExpbmUKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAxCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IFVzYkRldmljZQotCQkJCSMKLQkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCi0JCQkJIyBvciBGT1JDRV9OT05FCi0JCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCi0JCQkJQU5ZCi0JCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCi0JCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZU5vbmUKLQkJCQkJQUxMCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCi0JCQkJCQkjCi0JCQkJCQkjIEluIGNhc2Ugb2YgRm9yY2UgU3BlYWtlciwgcHJpb3JpdHkgYmV0d2VlbiBkZXZpY2UgYW5kIGFjY2Vzc29yeSBhcmUKLQkJCQkJCSMgaW52ZXJ0ZWQgY29tcGFyZWQgdG8gRm9yY2UgTm9uZSBvciBCdCBTY28KLQkJCQkJCSMKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiQWNjZXNzb3J5Ci0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAxCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogVXNiQWNjZXNzb3J5Ci0JCQkJIwotCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KLQkJCQkjIG9yIEZPUkNFX05PTkUKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JBY2Nlc3NvcnkKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMQotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IERndGxEb2NrSGVhZHNldAotCQkJCSMKLQkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCi0JCQkJIyBvciBGT1JDRV9OT05FCi0JCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0Ci0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBIZG1pCi0JCQkJIwotCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KLQkJCQkjIG9yIEZPUkNFX05PTkUKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAxCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogRWFycGllY2UKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEVhcnBpZWNlCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAxCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBTcGVha2VyCi0JCQkJIwotCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KLQkJCQkjIG9yIEZPUkNFX05PTkUKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMQotCi0JCQljb25mOiBEZWZhdWx0Ci0JCQkJIwotCQkJCSMgRmFsbGJhY2sgb24gZGVmYXVsdCBvdXRwdXQgZGV2aWNlIHdoaWNoIGNhbiBiZSBzcGVha2VyIGZvciBleGFtcGxlCi0JCQkJIwotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDEKLQotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3Jlcm91dGluZy5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3Jlcm91dGluZy5wZncKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ZTYyZjcuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9yZXJvdXRpbmcucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLWRvbWFpbkdyb3VwOiBEZXZpY2VGb3JTdHJhdGVneQotCi0JZG9tYWluR3JvdXA6IFJlcm91dGluZwotCQkjCi0JCSMgRmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneQotCQkjCi0JCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCi0JCQljb25mOiBDYWxpYnJhdGlvbgotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQloZG1pX2FyYyA9IDAKLQkJCQkJc3BkaWYgPSAwCi0JCQkJCWF1eF9saW5lID0gMAotCQkJCQlmbSA9IDAKLQkJCQkJc3BlYWtlcl9zYWZlID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlpcCA9IDAKLQkJCQkJYnVzID0gMAotCQkJCQlzdHViID0gMAotCi0JCWRvbWFpbjogRGV2aWNlMgotCQkJY29uZjogUmVtb3RlU3VibWl4Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBSZW1vdGVTdWJtaXgKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMQotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHAKLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHAKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmUKLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEZvcmNlU3BlYWtlcgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXMgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCXNwZWFrZXIgPSAxCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBXaXJlZEhlYWRwaG9uZQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMQotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IExpbmUKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMQotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHNldAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAxCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBVc2JBY2Nlc3NvcnkKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDEKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogVXNiRGV2aWNlCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAxCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IERndGxEb2NrSGVhZHNldAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBBdXhEaWdpdGFsCi0JCQkJIwotCQkJCSMgUmVyb3V0aW5nIGlzIHNpbWlsYXIgdG8gbWVkaWEgYW5kIHNvbmlmaWNhdGlvbiAoZXhlcHQgaGVyZTogc29uaWZpY2F0aW9uIGlzIG5vdCBhbGxvd2VkIG9uIEhETUkpCi0JCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDEKLQotCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKLQkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCXNwZWFrZXIgPSAxCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBEZWZhdWx0Ci0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9zb25pZmljYXRpb24ucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9zb25pZmljYXRpb24ucGZ3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDc0MGQxLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfc29uaWZpY2F0aW9uLnBmdworKysgL2Rldi9udWxsCkBAIC0xLDQ5MCArMCwwIEBACi1zdXBEb21haW46IERldmljZUZvclN0cmF0ZWd5Ci0KLQlzdXBEb21haW46IFNvbmlmaWNhdGlvbgotCi0JCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCi0JCQljb25mOiBDYWxpYnJhdGlvbgotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQkjIG5vIHNvbmlmaWNhdGlvbiBvbiByZW1vdGUgc3VibWl4IChlLmcuIFdGRCkKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJaGRtaV9hcmMgPSAwCi0JCQkJCXNwZGlmID0gMAotCQkJCQlmbSA9IDAKLQkJCQkJc3BlYWtlcl9zYWZlID0gMAotCQkJCQlhdXhfbGluZSA9IDAKLQkJCQkJIwotCQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgYnV0IEhETUkgaXMgbm90IHJlYWNoYWJsZQotCQkJCQkjCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWlwID0gMAotCQkJCQlidXMgPSAwCi0JCQkJCXN0dWIgPSAwCi0KLQkJZG9tYWluOiBTcGVha2VyCi0KLQkJCWNvbmY6IFNlbGVjdGVkCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCi0JCQkJQU5ZCi0JCQkJCSMKLQkJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBFTkZPUkNFRF9BVURJQkxFIGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJQUxMCi0JCQkJCQkjCi0JCQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkJCSMKLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgTGluZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAxCi0KLQkJCWNvbmY6IE5vdFNlbGVjdGVkCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJZG9tYWluOiBEZXZpY2UyCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHAKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHAKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lcwotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAxCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBTY29DYXJraXQKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBwaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIwotCQkJCUFOWQotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29DYXJraXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMQotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFNjb0hlYWRzZXQKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBwaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIwotCQkJCUFOWQotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29IZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMQotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBTY28KLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBwaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIwotCQkJCUFOWQotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY28KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMQotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHBob25lCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJIwotCQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMQotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IExpbmUKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKLQkJCQlBTlkKLQkJCQkJIwotCQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkJIyBidXQgTGluZSBoYXMgYSBsb3dlciBwcmlvcml0eSB0aGFuIFdpcmVkSGVhZHNldCBpbiB0aGlzIGNhc2UuCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFdpcmVkSGVhZHNldAotCQkJCQkjCi0JCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAxCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHNldAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0Ci0JCQkJQU5ZCi0JCQkJCSMKLQkJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCQlBTEwKLQkJCQkJCSMKLQkJCQkJCSMgU29uaWZpY2F0aW9uIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCQkJIwotCQkJCQkJQU5ZCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogVXNiRGV2aWNlCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKLQkJCQlBTlkKLQkJCQkJIwotCQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFVzYkFjY2Vzc29yeQotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCQlBTEwKLQkJCQkJCSMKLQkJCQkJCSMgU29uaWZpY2F0aW9uIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCQkJIwotCQkJCQkJQU5ZCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAxCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogVXNiQWNjZXNzb3J5Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JBY2Nlc3NvcnkKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBGb2xsb3dzIFBob25lIFN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjIGJ1dCBVU0IgQWNjZXNzb3J5IG5vdCByZWFjaGFibGUgaW4gY2FsbC4KLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDEKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IERndGxEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwuCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBGb2xsb3dzIFBob25lIFN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjIGJ1dCBBbmxnRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsLgotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBFYXJwaWVjZQotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBGb2xsb3dzIFBob25lIFN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRWFycGllY2UKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDEKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IE5vbmUKLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsLnBmdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2VlN2NkMS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsLnBmdworKysgL2Rldi9udWxsCkBAIC0xLDUzNiArMCwwIEBACi1kb21haW5Hcm91cDogRGV2aWNlRm9yU3RyYXRlZ3kKLQotCWRvbWFpbkdyb3VwOiBTb25pZmljYXRpb25SZXNwZWN0ZnVsCi0JCSMKLQkJIyBTb25pZmljaWF0aW9uIFJlc3BlY3RmdWwgZm9sbG93czoKLQkJIwktIElmIGluIGNhbGw6IFN0cmF0ZWd5IHNvbmlmaWNhdGlvbiAodGhhdCBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGluIGNhbGwgYWxzby4uLikKLQkJIwktIElmIG5vdCBpbiBjYWxsIEFORCBhIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUgcmVtb3RlbHk6IFN0cmF0ZWd5IHNvbmlmaWNhdGlvbiAodGhhdAotCQkjICAgICBmb2xsb3dzIGVuZm9yY2VkIGF1ZGlibGUsIHdoaWNoIGZvbGxvd3MgbWVkaWEpCi0JCSMJLSBpZiBub3QgaW4gY2FsbCBhbmQgbm8gbXVzaWMgc3RyZWFtIGFjdGl2ZSByZW1vdGVseSBhbmQgbXVzaWMgc3RyZWFtIGFjdGl2ZSk6IHN0cmF0ZWd5Ci0JCSMgICAgIG1lZGlhCi0JCSMgICAtIE90aGVyd2lzZSBmb2xsb3dzIHNvbmlmaWNhdGlvbiBieSByZXBsYWNpbmcgc3BlYWtlciB3aXRoIHNwZWFrZXIgc2FmZSBpZiBzcGVha2VyIGlzCi0JCSMJICBzZWxlY3RlZC4KLQkJIwotCQkjIENhc2Ugb2Ygc3RyZWFtIGFjdGl2ZSBoYW5kbGVkIHByb2dyYW1tYXRpY2FsbHkKLQotCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcwotCQkJY29uZjogQ2FsaWJyYXRpb24KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQloZG1pX2FyYyA9IDAKLQkJCQkJYXV4X2xpbmUgPSAwCi0JCQkJCXNwZGlmID0gMAotCQkJCQlmbSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlpcCA9IDAKLQkJCQkJYnVzID0gMAotCQkJCQlzdHViID0gMAotCi0JCWRvbWFpbjogU3BlYWtlcnMKLQotCQkJY29uZjogU3BlYWtlclNhZmUKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXJTYWZlCi0JCQkJIwotCQkJCSMgRm9sbG93cyBzb25pZmljYXRpb24gc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgYW5kIHJlcGxhY2Ugc3BlYWtlciBieSBzcGVha2VyIHNhZmUKLQkJCQkjIGlmIGFuZCBvbmx5IGlmIHNwZWFrZXIgb25seSBzZWxlY3RlZAotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyX3NhZmUgPSAxCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IFNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQkJCQlBTlkKLQkJCQkJIwotCQkJCQkjIEZvbGxvd3Mgc29uaWZpY2F0aW9uIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJQUxMCi0JCQkJCQkjCi0JCQkJCQkjIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgY2FsbAotCQkJCQkJIwotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgotCQkJCQkJQU5ZCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBMaW5lCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyX3NhZmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAxCi0KLQkJCWNvbmY6IE5vbmUKLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyX3NhZmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJZG9tYWluOiBEZXZpY2UyCi0JCQljb25mOiBCbHVldG9vdGhBMmRwCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHAKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoU2NvQ2Fya2l0Ci0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0NhcmtpdAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoU2NvSGVhZHNldAotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJIwotCQkJCUFOWQotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29IZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMQotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhTY28KLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCSMKLQkJCQlBTlkKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDEKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBXaXJlZEhlYWRwaG9uZQotCQkJCUFOWQotCQkJCQlBTEwKLQkJCQkJCSMKLQkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJCSMKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJQUxMCi0JCQkJCQkjCi0JCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJCQkjCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogTGluZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJIyBidXQgTGluZSBoYXMgYSBsb3dlciBwcmlvcml0eSB0aGFuIFdpcmVkSGVhZHNldCBpbiB0aGlzIGNhc2UuCi0JCQkJCSMKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgV2lyZWRIZWFkc2V0Ci0JCQkJCSMKLQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKLQkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDEKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBXaXJlZEhlYWRzZXQKLQkJCQlBTlkKLQkJCQkJQUxMCi0JCQkJCQkjCi0JCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJCQkjCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCUFMTAotCQkJCQkJIwotCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQotCQkJCQkJIwotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAxCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBVc2JEZXZpY2UKLQkJCQlBTlkKLQkJCQkJQUxMCi0JCQkJCQkjCi0JCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJCQkjCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCUFMTAotCQkJCQkJIwotCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQotCQkJCQkJIwotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDEKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogVXNiQWNjZXNzb3J5Ci0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjIGJ1dCBVc2JBY2Nlc3Nvcnkgbm90IHJlYWNoYWJsZSBpbiBjYWxsLgotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDEKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogRGd0bERvY2tIZWFkc2V0Ci0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjIGJ1dCBEZ3RsRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsLgotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQXV4RGlnaXRhbAotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIyBidXQgSERNSSBub3QgcmVhY2hhYmxlIGluIGNhbGwuCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDEKLQotCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjIGJ1dCBBbmxnRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsLgotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEVhcnBpZWNlCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRWFycGllY2UKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMQotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyLnBmdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY5YzIxMS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci5wZncKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi1zdXBEb21haW46IERldmljZUZvclN0cmF0ZWd5Ci0KLQlzdXBEb21haW46IFRyYW5zbWl0dGVkVGhyb3VnaFNwZWFrZXIKLQkJZG9tYWluOiBVbnJlYWNoZWFibGVEZXZpY2VzCi0JCQljb25mOiBDYWxpYnJhdGlvbgotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQloZG1pX2FyYyA9IDAKLQkJCQkJc3BkaWYgPSAwCi0JCQkJCWF1eF9saW5lID0gMAotCQkJCQlmbSA9IDAKLQkJCQkJc3BlYWtlcl9zYWZlID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDEKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWlwID0gMAotCQkJCQlidXMgPSAwCi0JCQkJCXN0dWIgPSAwCi0KLQkJZG9tYWluOiBTcGVha2VyCi0JCQljb25mOiBTZWxlY3RlZAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAxCi0KLQkJCWNvbmY6IE5vdFNlbGVjdGVkCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAwCi0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl9zdHJlYW0ucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3N0cmVhbS5wZncKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5NDBiOWQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3N0cmVhbS5wZncKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi1kb21haW46IFN0cmF0ZWd5Rm9yU3RyZWFtCi0KLQljb25mOiBDYWxpYnJhdGlvbgotCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL3ZvaWNlX2NhbGwvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IHBob25lCi0JCSMKLQkJIyBOT1RFOiBTWVNURU0gc3RyZWFtIHVzZXMgTUVESUEgc3RyYXRlZ3kgYmVjYXVzZSBtdXRpbmcgbXVzaWMgYW5kIHN3aXRjaGluZyBvdXRwdXRzCi0JCSMgd2hpbGUga2V5IGNsaWNrcyBhcmUgcGxheWVkIHByb2R1Y2VzIGEgcG9vciByZXN1bHQKLQkJIwotCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL3N5c3RlbS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gbWVkaWEKLQkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yaW5nL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBzb25pZmljYXRpb24KLQkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9tdXNpYy9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gbWVkaWEKLQkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hbGFybS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gc29uaWZpY2F0aW9uCi0JCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbm90aWZpY2F0aW9uL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBzb25pZmljYXRpb25fcmVzcGVjdGZ1bAotCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL2JsdWV0b290aF9zY28vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IHBob25lCi0JCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvZW5mb3JjZWRfYXVkaWJsZS9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gZW5mb3JjZWRfYXVkaWJsZQotCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL2R0bWYvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IGR0bWYKLQkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy90dHMvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IHRyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlcgotCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IGFjY2Vzc2liaWxpdHkKLQkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9yZXJvdXRpbmcvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IHJlcm91dGluZwotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9zdHJhdGVneV9mb3JfdXNhZ2UucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3VzYWdlLnBmdwppbmRleCBiMzExNWU3Li5mYmVhOWUyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9zdHJhdGVneV9mb3JfdXNhZ2UucGZ3CisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl91c2FnZS5wZncKQEAgLTI0LDcgKzI0LDcgQEAKIAkJCSMgSW4gY2FzZSBvZiBSaW5nIG9yIEFsYXJtIHN0cmVhbSB0eXBlIGFjdGl2ZSwgc3dpdGNoaW5nIHRvIHNvbmlmaWNhdGlvbgogCQkJIyBAdG9kbzogaGFuZGxlIHRoaXMgZHluYW1pYyBjYXNlLiBBcyBhIFdBLCB1c2luZyBSaW5ndG9uZSBtb2RlLi4uCiAJCQkjCi0JCQlUZWxlcGhvbnlNb2RlIElzIFJpbmdUb25lCisJCQlUZWxlcGhvbnlNb2RlIElzIFJpbmd0b25lCiAKIAkJCS9Qb2xpY3kvcG9saWN5L3VzYWdlcy9hc3Npc3RhbmNlX2FjY2Vzc2liaWxpdHkvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IHNvbmlmaWNhdGlvbgogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5nc05vT3V0cHV0L2RldmljZV9mb3Jfc3RyYXRlZ2llcy5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5nc05vT3V0cHV0L2RldmljZV9mb3Jfc3RyYXRlZ2llcy5wZncKaW5kZXggOTE3ZDRhNy4uZjkyMzYxMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3NOb091dHB1dC9kZXZpY2VfZm9yX3N0cmF0ZWdpZXMucGZ3CisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzTm9PdXRwdXQvZGV2aWNlX2Zvcl9zdHJhdGVnaWVzLnBmdwpAQCAtOSw3ICs5LDcgQEAKIAkJCQlibHVldG9vdGhfc2NvID0gMAogCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQlibHVldG9vdGhfYTJkcCA9IDA+CisJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKIAkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAogCQkJCWhkbWkgPSAwCkBAIC0zNyw3ICszNyw3IEBACiAJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJYmx1ZXRvb3RoX2EyZHAgPSAwPgorCQkJCWJsdWV0b290aF9hMmRwID0gMAogCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKIAkJCQloZG1pID0gMApAQCAtNjUsNyArNjUsNyBAQAogCQkJCWJsdWV0b290aF9zY28gPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAogCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCWJsdWV0b290aF9hMmRwID0gMD4KKwkJCQlibHVldG9vdGhfYTJkcCA9IDAKIAkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAogCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCiAJCQkJaGRtaSA9IDAKQEAgLTkzLDcgKzkzLDcgQEAKIAkJCQlibHVldG9vdGhfc2NvID0gMAogCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQlibHVldG9vdGhfYTJkcCA9IDA+CisJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKIAkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAogCQkJCWhkbWkgPSAwCkBAIC0xMjEsNyArMTIxLDcgQEAKIAkJCQlibHVldG9vdGhfc2NvID0gMAogCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQlibHVldG9vdGhfYTJkcCA9IDA+CisJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKIAkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAogCQkJCWhkbWkgPSAwCkBAIC0xNDksNyArMTQ5LDcgQEAKIAkJCQlibHVldG9vdGhfc2NvID0gMAogCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQlibHVldG9vdGhfYTJkcCA9IDA+CisJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKIAkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAogCQkJCWhkbWkgPSAwCkBAIC0xNzcsNyArMTc3LDcgQEAKIAkJCQlibHVldG9vdGhfc2NvID0gMAogCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQlibHVldG9vdGhfYTJkcCA9IDA+CisJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKIAkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAogCQkJCWhkbWkgPSAwCkBAIC0yMDUsNyArMjA1LDcgQEAKIAkJCQlibHVldG9vdGhfc2NvID0gMAogCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQlibHVldG9vdGhfYTJkcCA9IDA+CisJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKIAkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAogCQkJCWhkbWkgPSAwCkBAIC0yMzMsNyArMjMzLDcgQEAKIAkJCQlibHVldG9vdGhfc2NvID0gMAogCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQlibHVldG9vdGhfYTJkcCA9IDA+CisJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKIAkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAogCQkJCWhkbWkgPSAwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjFlNDRhLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Q29tcG9uZW50VHlwZVNldCB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKLSAgICAgICAgICAgICAgeHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249IlNjaGVtYXMvQ29tcG9uZW50VHlwZVNldC54c2QiPgotICAgIDwhLS0gT3V0cHV0IGRldmljZXMgZGVmaW5pdGlvbiBhcyBhIGJpdGZpZWxkIGZvciB0aGUgc3VwcG9ydGVkIGRldmljZXMgcGVyIG91dHB1dAotICAgIHByb2ZpbGUuIEl0IG11c3QgbWF0Y2ggd2l0aCB0aGUgb3V0cHV0IGRldmljZSBlbnVtIHBhcmFtZXRlci4KLSAgICAtLT4KLSAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIEdMT0JBTCBDT01QT05FTlRTIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+Ci0KLSAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIEdMT0JBTCBDT01QT05FTlRTIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCi0gICAgPENvbXBvbmVudFR5cGUgTmFtZT0iT3V0cHV0RGV2aWNlc01hc2siIERlc2NyaXB0aW9uPSIzMnRoIGJpdCBpcyBub3QgYWxsb3dlZCBhcyBkZWRpY2F0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGlucHV0IGRldmljZXMgZGV0ZWN0aW9uIj4KLSAgICAgICAgPEJpdFBhcmFtZXRlckJsb2NrIE5hbWU9Im1hc2siIFNpemU9IjMyIj4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiIFNpemU9IjEiIFBvcz0iMCIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIiBTaXplPSIxIiBQb3M9IjEiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCIgU2l6ZT0iMSIgUG9zPSIyIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSIgU2l6ZT0iMSIgUG9zPSIzIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iIFNpemU9IjEiIFBvcz0iNCIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiIFNpemU9IjEiIFBvcz0iNSIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCIgU2l6ZT0iMSIgUG9zPSI2Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIiBTaXplPSIxIiBQb3M9IjciLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyIgU2l6ZT0iMSIgUG9zPSI4Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiIFNpemU9IjEiIFBvcz0iOSIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIiBTaXplPSIxIiBQb3M9IjEwIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0IiBTaXplPSIxIiBQb3M9IjExIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0IiBTaXplPSIxIiBQb3M9IjEyIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiIFNpemU9IjEiIFBvcz0iMTMiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSIgU2l6ZT0iMSIgUG9zPSIxNCIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4IiBTaXplPSIxIiBQb3M9IjE1Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCIgU2l6ZT0iMSIgUG9zPSIxNiIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIiBTaXplPSIxIiBQb3M9IjE3Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWlfYXJjIiBTaXplPSIxIiBQb3M9IjE4Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZGlmIiBTaXplPSIxIiBQb3M9IjE5Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtIiBTaXplPSIxIiBQb3M9IjIwIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImF1eF9saW5lIiBTaXplPSIxIiBQb3M9IjIxIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXJfc2FmZSIgU2l6ZT0iMSIgUG9zPSIyMiIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJpcCIgU2l6ZT0iMSIgUG9zPSIyMyIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidXMiIFNpemU9IjEiIFBvcz0iMjQiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3R1YiIgU2l6ZT0iMSIgUG9zPSIzMCIvPgotICAgICAgICA8L0JpdFBhcmFtZXRlckJsb2NrPgotICAgIDwvQ29tcG9uZW50VHlwZT4KLQotICAgIDwhLS0gSW5wdXQgZGV2aWNlcyBkZWZpbml0aW9uIGFzIGEgYml0ZmllbGQgZm9yIHRoZSBzdXBwb3J0ZWQgZGV2aWNlcyBwZXIgSW5wdXQKLSAgICBwcm9maWxlLiBJdCBtdXN0IG1hdGNoIHdpdGggdGhlIElucHV0IGRldmljZSBlbnVtIHBhcmFtZXRlci4KLSAgICAtLT4KLSAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJJbnB1dERldmljZXNNYXNrIj4KLSAgICAgICAgPEJpdFBhcmFtZXRlckJsb2NrIE5hbWU9Im1hc2siIFNpemU9IjMyIj4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iY29tbXVuaWNhdGlvbiIgU2l6ZT0iMSIgUG9zPSIwIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFtYmllbnQiIFNpemU9IjEiIFBvcz0iMSIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyIgU2l6ZT0iMSIgUG9zPSIyIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCIgU2l6ZT0iMSIgUG9zPSIzIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiIFNpemU9IjEiIFBvcz0iNCIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIiBTaXplPSIxIiBQb3M9IjUiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3J4IiBTaXplPSIxIiBQb3M9IjYiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmFja19taWMiIFNpemU9IjEiIFBvcz0iNyIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4IiBTaXplPSIxIiBQb3M9IjgiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiIFNpemU9IjEiIFBvcz0iOSIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCIgU2l6ZT0iMSIgUG9zPSIxMCIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5IiBTaXplPSIxIiBQb3M9IjExIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiIFNpemU9IjEiIFBvcz0iMTIiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm1fdHVuZXIiIFNpemU9IjEiIFBvcz0iMTMiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idHZfdHVuZXIiIFNpemU9IjEiIFBvcz0iMTQiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSIgU2l6ZT0iMSIgUG9zPSIxNSIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGRpZiIgU2l6ZT0iMSIgUG9zPSIxNiIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCIgU2l6ZT0iMSIgUG9zPSIxNyIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsb29wYmFjayIgU2l6ZT0iMSIgUG9zPSIxOCIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJpcCIgU2l6ZT0iMSIgUG9zPSIxOSIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidXMiIFNpemU9IjEiIFBvcz0iMjAiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3R1YiIgU2l6ZT0iMSIgUG9zPSIzMCIvPgotICAgICAgICA8L0JpdFBhcmFtZXRlckJsb2NrPgotICAgIDwvQ29tcG9uZW50VHlwZT4KLQotICAgIDxDb21wb25lbnRUeXBlIE5hbWU9Ik91dHB1dEZsYWdzIgotICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJ0aGUgYXVkaW8gb3V0cHV0IGZsYWdzIHNlcnZlIHR3byBwdXJwb3NlczoKLSAgICAgICAgICAgICAgICAgICAgLSB3aGVuIGFuIEF1ZGlvVHJhY2sgaXMgY3JlYXRlZCB0aGV5IGluZGljYXRlIGEgd2lzaCB0byBiZSBjb25uZWN0ZWQgdG8gYW4KLSAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgc3RyZWFtIHdpdGggYXR0cmlidXRlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgZmxhZ3MuCi0gICAgICAgICAgICAgICAgICAgIC0gd2hlbiBwcmVzZW50IGluIGFuIG91dHB1dCBwcm9maWxlIGRlc2NyaXB0b3IgbGlzdGVkIGZvciBhIHBhcnRpY3VsYXIgYXVkaW8KLSAgICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZSBtb2R1bGUsIHRoZXkgaW5kaWNhdGUgdGhhdCBhbiBvdXRwdXQgc3RyZWFtIGNhbiBiZSBvcGVuZWQgdGhhdAotICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzIHRoZSBhdHRyaWJ1dGVzIGluZGljYXRlZCBieSB0aGUgZmxhZ3MuCi0gICAgICAgICAgICAgICAgICAgIFRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB3aWxsIHRyeSB0byBtYXRjaCB0aGUgZmxhZ3MgaW4gdGhlIHJlcXVlc3QKLSAgICAgICAgICAgICAgICAgICAgKHdoZW4gZ2V0T3VwdXQoKSBpcyBjYWxsZWQpIHRvIGFuIGF2YWlsYWJsZSBvdXRwdXQgc3RyZWFtLiI+Ci0gICAgICAgIDxCaXRQYXJhbWV0ZXJCbG9jayBOYW1lPSJtYXNrIiBTaXplPSIzMiI+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRpcmVjdCIgU2l6ZT0iMSIgUG9zPSIwIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InByaW1hcnkiIFNpemU9IjEiIFBvcz0iMSIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmYXN0IiBTaXplPSIxIiBQb3M9IjIiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGVlcF9idWZmZXIiIFNpemU9IjEiIFBvcz0iMyIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJjb21wcmVzc19vZmZsb2FkIiBTaXplPSIxIiBQb3M9IjQiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibm9uX2Jsb2NraW5nIiBTaXplPSIxIiBQb3M9IjUiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaHdfYXZfc3luYyIgU2l6ZT0iMSIgUG9zPSI2Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InR0cyIgU2l6ZT0iMSIgUG9zPSI3Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJhdyIgU2l6ZT0iMSIgUG9zPSI4Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InN5bmMiIFNpemU9IjEiIFBvcz0iOSIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJpZWM5NThfbm9uYXVkaW8iIFNpemU9IjEiIFBvcz0iMTAiLz4KLSAgICAgICAgPC9CaXRQYXJhbWV0ZXJCbG9jaz4KLSAgICA8L0NvbXBvbmVudFR5cGU+Ci0KLSAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJJbnB1dEZsYWdzIgotICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJUaGUgYXVkaW8gaW5wdXQgZmxhZ3MgYXJlIGFuYWxvZ291cyB0byBhdWRpbyBvdXRwdXQgZmxhZ3MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnRseSB0aGV5IGFyZSB1c2VkIG9ubHkgd2hlbiBhbiBBdWRpb1JlY29yZCBpcyBjcmVhdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBpbmRpY2F0ZSBhIHByZWZlcmVuY2UgdG8gYmUgY29ubmVjdGVkIHRvIGFuIGlucHV0IHN0cmVhbSB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGZsYWdzLiI+Ci0gICAgICAgIDxCaXRQYXJhbWV0ZXJCbG9jayBOYW1lPSJtYXNrIiBTaXplPSIzMiI+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZhc3QiIFNpemU9IjEiIFBvcz0iMCIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJod19ob3R3b3JkIiBTaXplPSIxIiBQb3M9IjIiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmF3IiBTaXplPSIxIiBQb3M9IjMiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3luYyIgU2l6ZT0iMSIgUG9zPSI0Ii8+Ci0gICAgICAgIDwvQml0UGFyYW1ldGVyQmxvY2s+Ci0gICAgPC9Db21wb25lbnRUeXBlPgotCi0gICAgPENvbXBvbmVudFR5cGUgTmFtZT0iSW5wdXRTb3VyY2VzTWFzayIgRGVzY3JpcHRpb249IlRoZSBhdWRpbyBpbnB1dCBzb3VyY2UgaXMgYWxzbyBrbm93bgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyB0aGUgdXNlIGNhc2UuIj4KLSAgICAgICAgPEJpdFBhcmFtZXRlckJsb2NrIE5hbWU9Im1hc2siIFNpemU9IjMyIj4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGVmYXVsdCIgU2l6ZT0iMSIgUG9zPSIwIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9Im1pYyIgU2l6ZT0iMSIgUG9zPSIxIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InZvaWNlX3VwbGluayIgU2l6ZT0iMSIgUG9zPSIyIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InZvaWNlX2Rvd25saW5rIiBTaXplPSIxIiBQb3M9IjMiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idm9pY2VfY2FsbCIgU2l6ZT0iMSIgUG9zPSI0Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImNhbWNvcmRlciIgU2l6ZT0iMSIgUG9zPSI1Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InZvaWNlX3JlY29nbml0aW9uIiBTaXplPSIxIiBQb3M9IjYiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idm9pY2VfY29tbXVuaWNhdGlvbiIgU2l6ZT0iMSIgUG9zPSI3Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiIFNpemU9IjEiIFBvcz0iOCIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1bnByb2Nlc3NlZCIgU2l6ZT0iMSIgUG9zPSI5Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtX3R1bmVyIiBTaXplPSIxIiBQb3M9IjEwIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhvdHdvcmQiIFNpemU9IjEiIFBvcz0iMTEiLz4KLSAgICAgICAgPC9CaXRQYXJhbWV0ZXJCbG9jaz4KLSAgICA8L0NvbXBvbmVudFR5cGU+Ci0KLSAgICA8IS0tIFJvdXRpbmcgU3RyYXRlZ3kgZGVmaW5pdGlvbiBhcyBhbiBlbnVtZXJhdGlvbi4gTnVtZXJpY2FsIHZhbHVlIG11c3QgbWF0Y2ggdGhlIHZhbHVlCi0gICAgICAgICBvZiB0aGUgcm91dGluZyBzdHJhdGVneSBpbiBwb2xpY3kgaGVhZGVyIGZpbGUuIC0tPgotICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IlN0cmF0ZWd5Ij4KLSAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiIFNpemU9IjMyIj4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0ibWVkaWEiIE51bWVyaWNhbD0iMCIvPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJwaG9uZSIgTnVtZXJpY2FsPSIxIi8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9InNvbmlmaWNhdGlvbiIgTnVtZXJpY2FsPSIyIi8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9InNvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsIiBOdW1lcmljYWw9IjMiLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0iZHRtZiIgTnVtZXJpY2FsPSI0Ii8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9ImVuZm9yY2VkX2F1ZGlibGUiIE51bWVyaWNhbD0iNSIvPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJ0cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIiIE51bWVyaWNhbD0iNiIvPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJhY2Nlc3NpYmlsaXR5IiBOdW1lcmljYWw9IjciLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0icmVyb3V0aW5nIiBOdW1lcmljYWw9IjgiLz4KLSAgICAgICAgPC9FbnVtUGFyYW1ldGVyPgotICAgIDwvQ29tcG9uZW50VHlwZT4KLQotICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJBVEVHWSBDT01NT04gVFlQRVMgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLQotICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IlN0cmF0ZWd5Q29uZmlnIiBNYXBwaW5nPSJTdHJhdGVneTonJTEnIj4KLSAgICAgICAgPENvbXBvbmVudCBOYW1lPSJzZWxlY3RlZF9vdXRwdXRfZGV2aWNlcyIgVHlwZT0iT3V0cHV0RGV2aWNlc01hc2siLz4KLSAgICA8L0NvbXBvbmVudFR5cGU+Ci0KLSAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSQVRFR1kgQ09NTU9OIFRZUEVTIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCi0gICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFNUUkVBTSBDT01NT04gVFlQRVMgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLQotICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IlZvbHVtZVByb2ZpbGVUeXBlIj4KLSAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0idm9sdW1lX3Byb2ZpbGUiIFNpemU9IjMyIj4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0idm9pY2VfY2FsbCIgTnVtZXJpY2FsPSIwIi8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9InN5c3RlbSIgTnVtZXJpY2FsPSIxIi8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9InJpbmciIE51bWVyaWNhbD0iMiIvPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJtdXNpYyIgTnVtZXJpY2FsPSIzIi8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9ImFsYXJtIiBOdW1lcmljYWw9IjQiLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0ibm90aWZpY2F0aW9uIiBOdW1lcmljYWw9IjUiLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0iYmx1ZXRvb3RoX3NjbyIgTnVtZXJpY2FsPSI2Ii8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9ImVuZm9yY2VkX2F1ZGlibGUiIE51bWVyaWNhbD0iNyIvPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJkdG1mIiBOdW1lcmljYWw9IjgiLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0idHRzIiBOdW1lcmljYWw9IjkiLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0iYWNjZXNzaWJpbGl0eSIgTnVtZXJpY2FsPSIxMCIvPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJyZXJvdXRpbmciIE51bWVyaWNhbD0iMTEiLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0icGF0Y2giIE51bWVyaWNhbD0iMTIiLz4KLSAgICAgICAgPC9FbnVtUGFyYW1ldGVyPgotICAgIDwvQ29tcG9uZW50VHlwZT4KLQotICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IlN0cmVhbSI+Ci0gICAgICAgIDxDb21wb25lbnQgTmFtZT0iYXBwbGljYWJsZV9zdHJhdGVneSIgVHlwZT0iU3RyYXRlZ3kiLz4KLSAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhcHBsaWNhYmxlX3ZvbHVtZV9wcm9maWxlIiBUeXBlPSJWb2x1bWVQcm9maWxlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iVm9sdW1lIHByb2ZpbGUgZm9sbG93ZWQgYnkgYSBnaXZlbiBzdHJlYW0gdHlwZS4iLz4KLSAgICA8L0NvbXBvbmVudFR5cGU+Ci0KLSAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSRUFNIENPTU1PTiBUWVBFUyBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLQotICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBVU0FHRSBDT01NT04gVFlQRVMgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLQotICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IlVzYWdlIj4KLSAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhcHBsaWNhYmxlX3N0cmF0ZWd5IiBUeXBlPSJTdHJhdGVneSIgTWFwcGluZz0iVXNhZ2U6JyUxJyIvPgotICAgIDwvQ29tcG9uZW50VHlwZT4KLQotICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBVU0FHRSBDT01NT04gVFlQRVMgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+Ci0KLSAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgSU5QVVQgU09VUkNFIENPTU1PTiBUWVBFUyBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCi0gICAgPENvbXBvbmVudFR5cGUgTmFtZT0iSW5wdXRTb3VyY2UiPgotICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFwcGxpY2FibGVfaW5wdXRfZGV2aWNlIiBUeXBlPSJJbnB1dERldmljZXNNYXNrIgotICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IklucHV0U291cmNlOiclMSciIERlc2NyaXB0aW9uPSJTZWxlY3RlZCBJbnB1dCBkZXZpY2UiLz4KLSAgICA8L0NvbXBvbmVudFR5cGU+Ci0KLSAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgSU5QVVQgU09VUkNFIENPTU1PTiBUWVBFUyBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLQotPC9Db21wb25lbnRUeXBlU2V0PgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ5YzM1Ni4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPFN1YnN5c3RlbSB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKLSAgICAgICAgICAgeHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249IlNjaGVtYXMvU3Vic3lzdGVtLnhzZCIKLSAgICAgICAgICAgTmFtZT0icG9saWN5IiBUeXBlPSJQb2xpY3kiPgotCi0gICAgPENvbXBvbmVudExpYnJhcnk+Ci0gICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBHTE9CQUwgQ09NUE9ORU5UUyBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotICAgICAgICA8IS0tIENvbW1vbiBUeXBlcyBkZWZpbnRpb24gLS0+Ci0gICAgICAgIDx4aTppbmNsdWRlIGhyZWY9IlBvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwiLz4KLQotICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgR0xPQkFMIENPTVBPTkVOVFMgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+Ci0KLSAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFNUUkFURUdZIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+Ci0KLSAgICAgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iU3RyYXRlZ2llcyIgRGVzY3JpcHRpb249IklkZW50aWZpZXIgbXVzdCBtYXRjaCB0aGUgZW51bSB2YWx1ZSB0byBtYWtlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsaW5rIGJldHdlZW4gdGhlIFBvbGljeU1hbmFnZXIgYW5kIFBGVyI+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im1lZGlhIiBUeXBlPSJTdHJhdGVneUNvbmZpZyIgTWFwcGluZz0iQW1lbmQxOk1lZGlhLElkZW50aWZpZXI6MCIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJwaG9uZSIgVHlwZT0iU3RyYXRlZ3lDb25maWciIE1hcHBpbmc9IkFtZW5kMTpQaG9uZSxJZGVudGlmaWVyOjEiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ic29uaWZpY2F0aW9uIiBUeXBlPSJTdHJhdGVneUNvbmZpZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6U29uaWZpY2F0aW9uLElkZW50aWZpZXI6MiIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJzb25pZmljYXRpb25fcmVzcGVjdGZ1bCIgVHlwZT0iU3RyYXRlZ3lDb25maWciCi0gICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpTb25pZmljYXRpb25SZXNwZWN0ZnVsLElkZW50aWZpZXI6MyIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJkdG1mIiBUeXBlPSJTdHJhdGVneUNvbmZpZyIgTWFwcGluZz0iQW1lbmQxOkR0bWYsSWRlbnRpZmllcjo0Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImVuZm9yY2VkX2F1ZGlibGUiIFR5cGU9IlN0cmF0ZWd5Q29uZmlnIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6RW5mb3JjZWRBdWRpYmxlLElkZW50aWZpZXI6NSIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ0cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIiIFR5cGU9IlN0cmF0ZWd5Q29uZmlnIgotICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6VHJhbnNtaXR0ZWRUaHJvdWdoU3BlYWtlcixJZGVudGlmaWVyOjYiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYWNjZXNzaWJpbGl0eSIgVHlwZT0iU3RyYXRlZ3lDb25maWciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpBY2Nlc3NpYmlsaXR5LElkZW50aWZpZXI6NyIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJyZXJvdXRpbmciIFR5cGU9IlN0cmF0ZWd5Q29uZmlnIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpSZXJvdXRpbmcsSWRlbnRpZmllcjo4Ii8+Ci0gICAgICAgIDwvQ29tcG9uZW50VHlwZT4KLQotICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSQVRFR1kgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+Ci0KLSAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFNUUkVBTSBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCi0gICAgICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IlN0cmVhbXMiIERlc2NyaXB0aW9uPSJhc3NvY2lhdGVkIHRvIGF1ZGlvX3N0cmVhbV90eXBlX3QgZGVmaW5pdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllciBtYXBwaW5nIG11c3QgbWF0Y2ggdGhlIHZhbHVlIG9mIHRoZSBlbnVtIj4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfY2FsbCIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJTdHJlYW06Vm9pY2VDYWxsLElkZW50aWZpZXI6MCIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJzeXN0ZW0iIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iU3RyZWFtOlN5c3RlbSxJZGVudGlmaWVyOjEiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icmluZyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJTdHJlYW06UmluZyxJZGVudGlmaWVyOjIiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibXVzaWMiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iU3RyZWFtOk11c2ljLElkZW50aWZpZXI6MyIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhbGFybSIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJTdHJlYW06QWxhcm0sSWRlbnRpZmllcjo0Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbiIgVHlwZT0iU3RyZWFtIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IlN0cmVhbTpOb3RpZmljYXRpb24sSWRlbnRpZmllcjo1Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImJsdWV0b290aF9zY28iIFR5cGU9IlN0cmVhbSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iU3RyZWFtOkJsdWV0b290aFNjbyxJZGVudGlmaWVyOjYiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZW5mb3JjZWRfYXVkaWJsZSIgVHlwZT0iU3RyZWFtIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJTdHJlYW06RW5mb3JjZUF1ZGlibGUsSWRlbnRpZmllcjo3IgotICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iU291bmRzIHRoYXQgY2Fubm90IGJlIG11dGVkIGJ5IHVzZXIgYW5kIG11c3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHJvdXRlZCB0byBzcGVha2VyIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImR0bWYiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iU3RyZWFtOkR0bWYsSWRlbnRpZmllcjo4Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InR0cyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJTdHJlYW06VHRzLElkZW50aWZpZXI6OSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IlRyYW5zbWl0dGVkIFRocm91Z2ggU3BlYWtlci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYXlzIG92ZXIgc3BlYWtlciBvbmx5LCBzaWxlbnQgb24gb3RoZXIgZGV2aWNlcyIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhY2Nlc3NpYmlsaXR5IiBUeXBlPSJTdHJlYW0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IlN0cmVhbTpBY2Nlc3NpYmlsaXR5LElkZW50aWZpZXI6MTAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJGb3IgYWNjZXNzaWJpbGl0eSB0YWxrIGJhY2sgcHJvbXB0cyIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJyZXJvdXRpbmciIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iU3RyZWFtOlJlcm91dGluZyxJZGVudGlmaWVyOjExIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iRm9yIGR5bmFtaWMgcG9saWN5IG91dHB1dCBtaXhlcyIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJwYXRjaCIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJTdHJlYW06UGF0Y2gsSWRlbnRpZmllcjoxMiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IkZvciBpbnRlcm5hbCBhdWRpbyBmbGluZ2VyIHRyYWNrcy4gRml4ZWQgdm9sdW1lIi8+Ci0gICAgICAgIDwvQ29tcG9uZW50VHlwZT4KLQotICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSRUFNIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCi0gICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBVU0FHRSBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCi0gICAgICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IlVzYWdlcyIgRGVzY3JpcHRpb249ImFzc29jaWF0ZWQgdG8gYXVkaW9fdXNhZ2VfdCBkZWZpbml0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyIG1hcHBpbmcgbXVzdCBtYXRjaCB0aGUgdmFsdWUgb2YgdGhlIGVudW0iPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ1bmtub3duIiBUeXBlPSJVc2FnZSIgTWFwcGluZz0iQW1lbmQxOlVua25vd24sSWRlbnRpZmllcjowIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im1lZGlhIiBUeXBlPSJVc2FnZSIgTWFwcGluZz0iQW1lbmQxOk1lZGlhLElkZW50aWZpZXI6MSIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9jb21tdW5pY2F0aW9uIiBUeXBlPSJVc2FnZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlZvaWNlQ29tbXVuaWNhdGlvbixJZGVudGlmaWVyOjIiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfY29tbXVuaWNhdGlvbl9zaWduYWxsaW5nIiBUeXBlPSJVc2FnZSIKLSAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlZvaWNlQ29tbXVuaWNhdGlvblNpZ25hbGxpbmcsSWRlbnRpZmllcjozIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFsYXJtIiBUeXBlPSJVc2FnZSIgTWFwcGluZz0iQW1lbmQxOkFsYXJtLElkZW50aWZpZXI6NCIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJub3RpZmljYXRpb24iIFR5cGU9IlVzYWdlIiBNYXBwaW5nPSJBbWVuZDE6Tm90aWZpY2F0aW9uLElkZW50aWZpZXI6NSIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJub3RpZmljYXRpb25fdGVsZXBob255X3Jpbmd0b25lIiBUeXBlPSJVc2FnZSIKLSAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOk5vdGlmaWNhdGlvblRlbGVwaG9ueVJpbmd0b25lLElkZW50aWZpZXI6NiIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJub3RpZmljYXRpb25fY29tbXVuaWNhdGlvbl9yZXF1ZXN0IiBUeXBlPSJVc2FnZSIKLSAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOk5vdGlmaWNhdGlvbkNvbW11bmljYXRpb25SZXF1ZXN0LElkZW50aWZpZXI6NyIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJub3RpZmljYXRpb25fY29tbXVuaWNhdGlvbl9pbnN0YW50IiBUeXBlPSJVc2FnZSIKLSAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOk5vdGlmaWNhdGlvbkNvbW11bmljYXRpb25JbnN0YW50LElkZW50aWZpZXI6OCIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJub3RpZmljYXRpb25fY29tbXVuaWNhdGlvbl9kZWxheWVkIiBUeXBlPSJVc2FnZSIKLSAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOk5vdGlmaWNhdGlvbkNvbW11bmljYXRpb25EZWxhdGVkLElkZW50aWZpZXI6OSIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJub3RpZmljYXRpb25fZXZlbnQiIFR5cGU9IlVzYWdlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpOb3RpZmljYXRpb25FdmVudCxJZGVudGlmaWVyOjEwIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFzc2lzdGFuY2VfYWNjZXNzaWJpbGl0eSIgVHlwZT0iVXNhZ2UiCi0gICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpBc3Npc3RhbmNlQWNjZXNzaWJpbGl0eSxJZGVudGlmaWVyOjExIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFzc2lzdGFuY2VfbmF2aWdhdGlvbl9ndWlkYW5jZSIgVHlwZT0iVXNhZ2UiCi0gICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpBc3Npc3RhbmNlTmF2aWdhdGlvbkd1aWRhbmNlLElkZW50aWZpZXI6MTIiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYXNzaXN0YW5jZV9zb25pZmljYXRpb24iIFR5cGU9IlVzYWdlIgotICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6QXNzaXN0YW5jZVNvbmlmaWNhdGlvbixJZGVudGlmaWVyOjEzIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImdhbWUiIFR5cGU9IlVzYWdlIiBNYXBwaW5nPSJBbWVuZDE6Qmx1ZXRvb3RoU2NvLElkZW50aWZpZXI6MTQiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idmlydHVhbF9zb3VyY2UiIFR5cGU9IlVzYWdlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlZpcnR1YWxTb3VyY2UsSWRlbnRpZmllcjoxNSIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhc3Npc3RhbnQiIFR5cGU9IlVzYWdlIiBNYXBwaW5nPSJBbWVuZDE6QXNzaXN0YW50LElkZW50aWZpZXI6MTYiLz4KLSAgICAgICAgPC9Db21wb25lbnRUeXBlPgotCi0gICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBVU0FHRSBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLQotICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgSU5QVVQgU09VUkNFIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+Ci0KLSAgICAgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iSW5wdXRTb3VyY2VzIiBEZXNjcmlwdGlvbj0iYXNzb2NpYXRlZCB0byBhdWRpb19zb3VyY2VfdCBkZWZpbml0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyIG1hcHBpbmcgbXVzdCBtYXRjaCB0aGUgdmFsdWUgb2YgdGhlIGVudW0iPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJkZWZhdWx0IiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iQW1lbmQxOkRlZmF1bHQsSWRlbnRpZmllcjowIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im1pYyIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9IkFtZW5kMTpNaWMsSWRlbnRpZmllcjoxIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX3VwbGluayIgVHlwZT0iSW5wdXRTb3VyY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlZvaWNlVXBsaW5rLElkZW50aWZpZXI6MiIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9kb3dubGluayIgVHlwZT0iSW5wdXRTb3VyY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Vm9pY2VEb3dubGluayxJZGVudGlmaWVyOjMiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfY2FsbCIgVHlwZT0iSW5wdXRTb3VyY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpWb2ljZUNhbGwsSWRlbnRpZmllcjo0Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImNhbWNvcmRlciIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9IkFtZW5kMTpDYW1jb3JkZXIsSWRlbnRpZmllcjo1Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX3JlY29nbml0aW9uIiBUeXBlPSJJbnB1dFNvdXJjZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpWb2ljZVJlY29nbml0aW9uLElkZW50aWZpZXI6NiIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9jb21tdW5pY2F0aW9uIiBUeXBlPSJJbnB1dFNvdXJjZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlZvaWNlQ29tbXVuaWNhdGlvbixJZGVudGlmaWVyOjciLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icmVtb3RlX3N1Ym1peCIgVHlwZT0iSW5wdXRTb3VyY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpSZW1vdGVTdWJtaXgsSWRlbnRpZmllcjo4Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InVucHJvY2Vzc2VkIiBUeXBlPSJJbnB1dFNvdXJjZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlVucHJvY2Vzc2VkLElkZW50aWZpZXI6OSIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJmbV90dW5lciIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9IkFtZW5kMTpGbVR1bmVyLElkZW50aWZpZXI6MTk5OCIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJob3R3b3JkIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iQW1lbmQxOkhvdHdvcmQsSWRlbnRpZmllcjoxOTk5Ii8+Ci0gICAgICAgIDwvQ29tcG9uZW50VHlwZT4KLQotICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgSU5QVVQgU09VUkNFIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCi0gICAgPC9Db21wb25lbnRMaWJyYXJ5PgotCi0gICAgPEluc3RhbmNlRGVmaW5pdGlvbj4KLSAgICAgICAgPENvbXBvbmVudCBOYW1lPSJzdHJlYW1zIiBUeXBlPSJTdHJlYW1zIi8+Ci0gICAgICAgIDxDb21wb25lbnQgTmFtZT0ic3RyYXRlZ2llcyIgVHlwZT0iU3RyYXRlZ2llcyIvPgotICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImlucHV0X3NvdXJjZXMiIFR5cGU9IklucHV0U291cmNlcyIvPgotICAgICAgICA8Q29tcG9uZW50IE5hbWU9InVzYWdlcyIgVHlwZT0iVXNhZ2VzIi8+Ci0gICAgPC9JbnN0YW5jZURlZmluaXRpb24+Ci08L1N1YnN5c3RlbT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1N0cnVjdHVyZS9Qb2xpY3lDbGFzcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9jb21tb24vU3RydWN0dXJlL1BvbGljeUNsYXNzLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU3RydWN0dXJlL1BvbGljeUNsYXNzLnhtbApyZW5hbWUgdG8gc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvY29tbW9uL1N0cnVjdHVyZS9Qb2xpY3lDbGFzcy54bWwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL2NvbW1vbi9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL2NvbW1vbi9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMTdjMDIxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvY29tbW9uL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sCkBAIC0wLDAgKzEsMTg2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPENvbXBvbmVudFR5cGVTZXQgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgICAgICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiCisgICAgICAgICAgICAgIHhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uPSJTY2hlbWFzL0NvbXBvbmVudFR5cGVTZXQueHNkIj4KKyAgICA8IS0tIE91dHB1dCBkZXZpY2VzIGRlZmluaXRpb24gYXMgYSBiaXRmaWVsZCBmb3IgdGhlIHN1cHBvcnRlZCBkZXZpY2VzIHBlciBvdXRwdXQKKyAgICBwcm9maWxlLiBJdCBtdXN0IG1hdGNoIHdpdGggdGhlIG91dHB1dCBkZXZpY2UgZW51bSBwYXJhbWV0ZXIuCisgICAgLS0+CisgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBHTE9CQUwgQ09NUE9ORU5UUyBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBHTE9CQUwgQ09NUE9ORU5UUyBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgIDxDb21wb25lbnRUeXBlIE5hbWU9Ik91dHB1dERldmljZXNNYXNrIiBEZXNjcmlwdGlvbj0iMzJ0aCBiaXQgaXMgbm90IGFsbG93ZWQgYXMgZGVkaWNhdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpbnB1dCBkZXZpY2VzIGRldGVjdGlvbiI+CisgICAgICAgIDxCaXRQYXJhbWV0ZXJCbG9jayBOYW1lPSJtYXNrIiBTaXplPSIzMiI+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVhcnBpZWNlIiBTaXplPSIxIiBQb3M9IjAiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BlYWtlciIgU2l6ZT0iMSIgUG9zPSIxIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiIFNpemU9IjEiIFBvcz0iMiIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkcGhvbmUiIFNpemU9IjEiIFBvcz0iMyIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvIiBTaXplPSIxIiBQb3M9IjQiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19oZWFkc2V0IiBTaXplPSIxIiBQb3M9IjUiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX3Njb19jYXJraXQiIFNpemU9IjEiIFBvcz0iNiIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCIgU2l6ZT0iMSIgUG9zPSI3Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiIFNpemU9IjEiIFBvcz0iOCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIiBTaXplPSIxIiBQb3M9IjkiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSIgU2l6ZT0iMSIgUG9zPSIxMCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCIgU2l6ZT0iMSIgUG9zPSIxMSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCIgU2l6ZT0iMSIgUG9zPSIxMiIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5IiBTaXplPSIxIiBQb3M9IjEzIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiIFNpemU9IjEiIFBvcz0iMTQiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCIgU2l6ZT0iMSIgUG9zPSIxNSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ0ZWxlcGhvbnlfdHgiIFNpemU9IjEiIFBvcz0iMTYiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSIgU2l6ZT0iMSIgUG9zPSIxNyIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pX2FyYyIgU2l6ZT0iMSIgUG9zPSIxOCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGRpZiIgU2l6ZT0iMSIgUG9zPSIxOSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmbSIgU2l6ZT0iMSIgUG9zPSIyMCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhdXhfbGluZSIgU2l6ZT0iMSIgUG9zPSIyMSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyX3NhZmUiIFNpemU9IjEiIFBvcz0iMjIiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaXAiIFNpemU9IjEiIFBvcz0iMjMiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVzIiBTaXplPSIxIiBQb3M9IjI0Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InByb3h5IiBTaXplPSIxIiBQb3M9IjI1Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9oZWFkc2V0IiBTaXplPSIxIiBQb3M9IjI2Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhlYXJpbmdfYWlkIiBTaXplPSIxIiBQb3M9IjI3Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVjaG9fY2FuY2VsbGVyIiBTaXplPSIxIiBQb3M9IjI4Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InN0dWIiIFNpemU9IjEiIFBvcz0iMzAiLz4KKyAgICAgICAgPC9CaXRQYXJhbWV0ZXJCbG9jaz4KKyAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICA8IS0tIElucHV0IGRldmljZXMgZGVmaW5pdGlvbiBhcyBhIGJpdGZpZWxkIGZvciB0aGUgc3VwcG9ydGVkIGRldmljZXMgcGVyIElucHV0CisgICAgcHJvZmlsZS4gSXQgbXVzdCBtYXRjaCB3aXRoIHRoZSBJbnB1dCBkZXZpY2UgZW51bSBwYXJhbWV0ZXIuCisgICAgLS0+CisgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iSW5wdXREZXZpY2VzTWFzayI+CisgICAgICAgIDxCaXRQYXJhbWV0ZXJCbG9jayBOYW1lPSJtYXNrIiBTaXplPSIzMiI+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImNvbW11bmljYXRpb24iIFNpemU9IjEiIFBvcz0iMCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbWJpZW50IiBTaXplPSIxIiBQb3M9IjEiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVpbHRpbl9taWMiIFNpemU9IjEiIFBvcz0iMiIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiIFNpemU9IjEiIFBvcz0iMyIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ3aXJlZF9oZWFkc2V0IiBTaXplPSIxIiBQb3M9IjQiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSIgU2l6ZT0iMSIgUG9zPSI1Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV9yeCIgU2l6ZT0iMSIgUG9zPSI2Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJhY2tfbWljIiBTaXplPSIxIiBQb3M9IjciLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmVtb3RlX3N1Ym1peCIgU2l6ZT0iMSIgUG9zPSI4Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0IiBTaXplPSIxIiBQb3M9IjkiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiIFNpemU9IjEiIFBvcz0iMTAiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2FjY2Vzc29yeSIgU2l6ZT0iMSIgUG9zPSIxMSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIiBTaXplPSIxIiBQb3M9IjEyIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtX3R1bmVyIiBTaXplPSIxIiBQb3M9IjEzIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InR2X3R1bmVyIiBTaXplPSIxIiBQb3M9IjE0Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiIFNpemU9IjEiIFBvcz0iMTUiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3BkaWYiIFNpemU9IjEiIFBvcz0iMTYiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHAiIFNpemU9IjEiIFBvcz0iMTciLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibG9vcGJhY2siIFNpemU9IjEiIFBvcz0iMTgiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaXAiIFNpemU9IjEiIFBvcz0iMTkiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYnVzIiBTaXplPSIxIiBQb3M9IjIwIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InByb3h5IiBTaXplPSIxIiBQb3M9IjIxIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9oZWFkc2V0IiBTaXplPSIxIiBQb3M9IjIyIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9ibGUiIFNpemU9IjEiIFBvcz0iMjMiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaV9hcmMiIFNpemU9IjEiIFBvcz0iMjQiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWNob19yZWZlcmVuY2UiIFNpemU9IjEiIFBvcz0iMjUiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3R1YiIgU2l6ZT0iMSIgUG9zPSIzMCIvPgorICAgICAgICA8L0JpdFBhcmFtZXRlckJsb2NrPgorICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgIDxDb21wb25lbnRUeXBlIE5hbWU9Ik91dHB1dEZsYWdzIgorICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJ0aGUgYXVkaW8gb3V0cHV0IGZsYWdzIHNlcnZlIHR3byBwdXJwb3NlczoKKyAgICAgICAgICAgICAgICAgICAgLSB3aGVuIGFuIEF1ZGlvVHJhY2sgaXMgY3JlYXRlZCB0aGV5IGluZGljYXRlIGEgd2lzaCB0byBiZSBjb25uZWN0ZWQgdG8gYW4KKyAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgc3RyZWFtIHdpdGggYXR0cmlidXRlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgZmxhZ3MuCisgICAgICAgICAgICAgICAgICAgIC0gd2hlbiBwcmVzZW50IGluIGFuIG91dHB1dCBwcm9maWxlIGRlc2NyaXB0b3IgbGlzdGVkIGZvciBhIHBhcnRpY3VsYXIgYXVkaW8KKyAgICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZSBtb2R1bGUsIHRoZXkgaW5kaWNhdGUgdGhhdCBhbiBvdXRwdXQgc3RyZWFtIGNhbiBiZSBvcGVuZWQgdGhhdAorICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzIHRoZSBhdHRyaWJ1dGVzIGluZGljYXRlZCBieSB0aGUgZmxhZ3MuCisgICAgICAgICAgICAgICAgICAgIFRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB3aWxsIHRyeSB0byBtYXRjaCB0aGUgZmxhZ3MgaW4gdGhlIHJlcXVlc3QKKyAgICAgICAgICAgICAgICAgICAgKHdoZW4gZ2V0T3VwdXQoKSBpcyBjYWxsZWQpIHRvIGFuIGF2YWlsYWJsZSBvdXRwdXQgc3RyZWFtLiI+CisgICAgICAgIDxCaXRQYXJhbWV0ZXJCbG9jayBOYW1lPSJtYXNrIiBTaXplPSIzMiI+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRpcmVjdCIgU2l6ZT0iMSIgUG9zPSIwIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InByaW1hcnkiIFNpemU9IjEiIFBvcz0iMSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmYXN0IiBTaXplPSIxIiBQb3M9IjIiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGVlcF9idWZmZXIiIFNpemU9IjEiIFBvcz0iMyIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJjb21wcmVzc19vZmZsb2FkIiBTaXplPSIxIiBQb3M9IjQiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibm9uX2Jsb2NraW5nIiBTaXplPSIxIiBQb3M9IjUiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaHdfYXZfc3luYyIgU2l6ZT0iMSIgUG9zPSI2Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InR0cyIgU2l6ZT0iMSIgUG9zPSI3Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJhdyIgU2l6ZT0iMSIgUG9zPSI4Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InN5bmMiIFNpemU9IjEiIFBvcz0iOSIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJpZWM5NThfbm9uYXVkaW8iIFNpemU9IjEiIFBvcz0iMTAiLz4KKyAgICAgICAgPC9CaXRQYXJhbWV0ZXJCbG9jaz4KKyAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJJbnB1dEZsYWdzIgorICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJUaGUgYXVkaW8gaW5wdXQgZmxhZ3MgYXJlIGFuYWxvZ291cyB0byBhdWRpbyBvdXRwdXQgZmxhZ3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnRseSB0aGV5IGFyZSB1c2VkIG9ubHkgd2hlbiBhbiBBdWRpb1JlY29yZCBpcyBjcmVhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBpbmRpY2F0ZSBhIHByZWZlcmVuY2UgdG8gYmUgY29ubmVjdGVkIHRvIGFuIGlucHV0IHN0cmVhbSB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGZsYWdzLiI+CisgICAgICAgIDxCaXRQYXJhbWV0ZXJCbG9jayBOYW1lPSJtYXNrIiBTaXplPSIzMiI+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZhc3QiIFNpemU9IjEiIFBvcz0iMCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJod19ob3R3b3JkIiBTaXplPSIxIiBQb3M9IjIiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmF3IiBTaXplPSIxIiBQb3M9IjMiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3luYyIgU2l6ZT0iMSIgUG9zPSI0Ii8+CisgICAgICAgIDwvQml0UGFyYW1ldGVyQmxvY2s+CisgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iSW5wdXRTb3VyY2VzTWFzayIgRGVzY3JpcHRpb249IlRoZSBhdWRpbyBpbnB1dCBzb3VyY2UgaXMgYWxzbyBrbm93bgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyB0aGUgdXNlIGNhc2UuIj4KKyAgICAgICAgPEJpdFBhcmFtZXRlckJsb2NrIE5hbWU9Im1hc2siIFNpemU9IjMyIj4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGVmYXVsdCIgU2l6ZT0iMSIgUG9zPSIwIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9Im1pYyIgU2l6ZT0iMSIgUG9zPSIxIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InZvaWNlX3VwbGluayIgU2l6ZT0iMSIgUG9zPSIyIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InZvaWNlX2Rvd25saW5rIiBTaXplPSIxIiBQb3M9IjMiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idm9pY2VfY2FsbCIgU2l6ZT0iMSIgUG9zPSI0Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImNhbWNvcmRlciIgU2l6ZT0iMSIgUG9zPSI1Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InZvaWNlX3JlY29nbml0aW9uIiBTaXplPSIxIiBQb3M9IjYiLz4KKyAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idm9pY2VfY29tbXVuaWNhdGlvbiIgU2l6ZT0iMSIgUG9zPSI3Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiIFNpemU9IjEiIFBvcz0iOCIvPgorICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1bnByb2Nlc3NlZCIgU2l6ZT0iMSIgUG9zPSI5Ii8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InZvaWNlX3BlcmZvcm1hbmNlIiBTaXplPSIxIiBQb3M9IjEwIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImVjaG9fcmVmZXJlbmNlIiBTaXplPSIxIiBQb3M9IjExIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtX3R1bmVyIiBTaXplPSIxIiBQb3M9IjEyIi8+CisgICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhvdHdvcmQiIFNpemU9IjEiIFBvcz0iMTMiLz4KKyAgICAgICAgPC9CaXRQYXJhbWV0ZXJCbG9jaz4KKyAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSRUFNIENPTU1PTiBUWVBFUyBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iVm9sdW1lUHJvZmlsZVR5cGUiPgorICAgICAgICA8RW51bVBhcmFtZXRlciBOYW1lPSJ2b2x1bWVfcHJvZmlsZSIgU2l6ZT0iMzIiPgorICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJ2b2ljZV9jYWxsIiBOdW1lcmljYWw9IjAiLz4KKyAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0ic3lzdGVtIiBOdW1lcmljYWw9IjEiLz4KKyAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0icmluZyIgTnVtZXJpY2FsPSIyIi8+CisgICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9Im11c2ljIiBOdW1lcmljYWw9IjMiLz4KKyAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0iYWxhcm0iIE51bWVyaWNhbD0iNCIvPgorICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJub3RpZmljYXRpb24iIE51bWVyaWNhbD0iNSIvPgorICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJibHVldG9vdGhfc2NvIiBOdW1lcmljYWw9IjYiLz4KKyAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0iZW5mb3JjZWRfYXVkaWJsZSIgTnVtZXJpY2FsPSI3Ii8+CisgICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9ImR0bWYiIE51bWVyaWNhbD0iOCIvPgorICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJ0dHMiIE51bWVyaWNhbD0iOSIvPgorICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJhY2Nlc3NpYmlsaXR5IiBOdW1lcmljYWw9IjEwIi8+CisgICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9InJlcm91dGluZyIgTnVtZXJpY2FsPSIxMSIvPgorICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJwYXRjaCIgTnVtZXJpY2FsPSIxMiIvPgorICAgICAgICA8L0VudW1QYXJhbWV0ZXI+CisgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iU3RyZWFtIiAgTWFwcGluZz0iU3RyZWFtIj4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhcHBsaWNhYmxlX3ZvbHVtZV9wcm9maWxlIiBUeXBlPSJWb2x1bWVQcm9maWxlVHlwZSIKKyAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iVm9sdW1lIHByb2ZpbGUgZm9sbG93ZWQgYnkgYSBnaXZlbiBzdHJlYW0gdHlwZS4iLz4KKyAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSRUFNIENPTU1PTiBUWVBFUyBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBJTlBVVCBTT1VSQ0UgQ09NTU9OIFRZUEVTIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJJbnB1dFNvdXJjZSI+CisgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UiIFR5cGU9IklucHV0RGV2aWNlc01hc2siCisgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iSW5wdXRTb3VyY2UiIERlc2NyaXB0aW9uPSJTZWxlY3RlZCBJbnB1dCBkZXZpY2UiLz4KKyAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgSU5QVVQgU09VUkNFIENPTU1PTiBUWVBFUyBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBQUk9EVUNUIFNUUkFURUdZIENPTU1PTiBUWVBFUyBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iUHJvZHVjdFN0cmF0ZWd5IiBNYXBwaW5nPSJQcm9kdWN0U3RyYXRlZ3kiPgorICAgICAgICA8Q29tcG9uZW50IE5hbWU9InNlbGVjdGVkX291dHB1dF9kZXZpY2VzIiBUeXBlPSJPdXRwdXREZXZpY2VzTWFzayIvPgorICAgICAgICA8U3RyaW5nUGFyYW1ldGVyIE5hbWU9ImRldmljZV9hZGRyZXNzIiBNYXhMZW5ndGg9IjI1NiIKKyAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iaWYgYW55LCBkZXZpY2UgYWRkcmVzcyBhc3NvY2lhdGVkIi8+CisgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFBST0RVQ1QgU1RSQVRFR1kgQ09NTU9OIFRZUEVTIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCis8L0NvbXBvbmVudFR5cGVTZXQ+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9jb21tb24vU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS1uby1zdHJhdGVneS54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9jb21tb24vU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS1uby1zdHJhdGVneS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRlNzUzNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL2NvbW1vbi9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLW5vLXN0cmF0ZWd5LnhtbApAQCAtMCwwICsxLDcyIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPFN1YnN5c3RlbSB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKKyAgICAgICAgICAgeHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249IlNjaGVtYXMvU3Vic3lzdGVtLnhzZCIKKyAgICAgICAgICAgTmFtZT0icG9saWN5IiBUeXBlPSJQb2xpY3kiPgorCisgICAgPENvbXBvbmVudExpYnJhcnk+CisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBHTE9CQUwgQ09NUE9ORU5UUyBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorICAgICAgICA8IS0tIENvbW1vbiBUeXBlcyBkZWZpbnRpb24gLS0+CisgICAgICAgIDx4aTppbmNsdWRlIGhyZWY9IlBvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwiLz4KKworICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgR0xPQkFMIENPTVBPTkVOVFMgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFNUUkVBTSBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IlN0cmVhbXMiIERlc2NyaXB0aW9uPSJhc3NvY2lhdGVkIHRvIGF1ZGlvX3N0cmVhbV90eXBlX3QgZGVmaW5pdGlvbiI+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2NhbGwiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJzeXN0ZW0iIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fU1lTVEVNIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InJpbmciIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fUklORyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJtdXNpYyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9NVVNJQyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhbGFybSIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9BTEFSTSIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJub3RpZmljYXRpb24iIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImJsdWV0b290aF9zY28iIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJlbmZvcmNlZF9hdWRpYmxlIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUiCisgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJTb3VuZHMgdGhhdCBjYW5ub3QgYmUgbXV0ZWQgYnkgdXNlciBhbmQgbXVzdCBiZSByb3V0ZWQgdG8gc3BlYWtlciIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJkdG1mIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX0RUTUYiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idHRzIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX1RUUyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IlRyYW5zbWl0dGVkIFRocm91Z2ggU3BlYWtlci4gUGxheXMgb3ZlciBzcGVha2VyIG9ubHksIHNpbGVudCBvbiBvdGhlciBkZXZpY2VzIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFjY2Vzc2liaWxpdHkiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IkZvciBhY2Nlc3NpYmlsaXR5IHRhbGsgYmFjayBwcm9tcHRzIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InJlcm91dGluZyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9SRVJPVVRJTkciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJGb3IgZHluYW1pYyBwb2xpY3kgb3V0cHV0IG1peGVzIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InBhdGNoIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX1BBVENIIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iRm9yIGludGVybmFsIGF1ZGlvIGZsaW5nZXIgdHJhY2tzLiBGaXhlZCB2b2x1bWUiLz4KKyAgICAgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJFQU0gRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIElOUFVUIFNPVVJDRSBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IklucHV0U291cmNlcyIgRGVzY3JpcHRpb249ImFzc29jaWF0ZWQgdG8gYXVkaW9fc291cmNlX3QgZGVmaW5pdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllciBtYXBwaW5nIG11c3QgbWF0Y2ggdGhlIHZhbHVlIG9mIHRoZSBlbnVtIj4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZGVmYXVsdCIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX0RFRkFVTFQiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibWljIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfTUlDIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX3VwbGluayIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2Rvd25saW5rIiBUeXBlPSJJbnB1dFNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2NhbGwiIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9WT0lDRV9DQUxMIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImNhbWNvcmRlciIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX0NBTUNPUkRFUiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9yZWNvZ25pdGlvbiIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9jb21tdW5pY2F0aW9uIiBUeXBlPSJJbnB1dFNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJyZW1vdGVfc3VibWl4IiBUeXBlPSJJbnB1dFNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ1bnByb2Nlc3NlZCIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1VOUFJPQ0VTU0VEIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImZtX3R1bmVyIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfRk1fVFVORVIiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iaG90d29yZCIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX0hPVFdPUkQiLz4KKyAgICAgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBJTlBVVCBTT1VSQ0UgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICA8L0NvbXBvbmVudExpYnJhcnk+CisKKyAgICA8SW5zdGFuY2VEZWZpbml0aW9uPgorICAgICAgICA8Q29tcG9uZW50IE5hbWU9InN0cmVhbXMiIFR5cGU9IlN0cmVhbXMiLz4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJpbnB1dF9zb3VyY2VzIiBUeXBlPSJJbnB1dFNvdXJjZXMiLz4KKyAgICA8L0luc3RhbmNlRGVmaW5pdGlvbj4KKzwvU3Vic3lzdGVtPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvY29tbW9uL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0ueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvY29tbW9uL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1NWNlMmMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9jb21tb24vU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS54bWwKQEAgLTAsMCArMSw4OCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxTdWJzeXN0ZW0geG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiCisgICAgICAgICAgIHhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uPSJTY2hlbWFzL1N1YnN5c3RlbS54c2QiCisgICAgICAgICAgIE5hbWU9InBvbGljeSIgVHlwZT0iUG9saWN5Ij4KKworICAgIDxDb21wb25lbnRMaWJyYXJ5PgorICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgR0xPQkFMIENPTVBPTkVOVFMgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKyAgICAgICAgPCEtLSBDb21tb24gVHlwZXMgZGVmaW50aW9uIC0tPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJQb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sIi8+CisgICAgICAgIDx4aTppbmNsdWRlIGhyZWY9IlByb2R1Y3RTdHJhdGVnaWVzLnhtbCIvPgorCisKKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIEdMT0JBTCBDT01QT05FTlRTIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJFQU0gQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgICAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJTdHJlYW1zIiBEZXNjcmlwdGlvbj0iYXNzb2NpYXRlZCB0byBhdWRpb19zdHJlYW1fdHlwZV90IGRlZmluaXRpb24iPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9jYWxsIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ic3lzdGVtIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX1NZU1RFTSIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJyaW5nIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX1JJTkciLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibXVzaWMiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fTVVTSUMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYWxhcm0iIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fQUxBUk0iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibm90aWZpY2F0aW9uIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX05PVElGSUNBVElPTiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJibHVldG9vdGhfc2NvIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZW5mb3JjZWRfYXVkaWJsZSIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFIgorICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iU291bmRzIHRoYXQgY2Fubm90IGJlIG11dGVkIGJ5IHVzZXIgYW5kIG11c3QgYmUgcm91dGVkIHRvIHNwZWFrZXIiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZHRtZiIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9EVE1GIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InR0cyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9UVFMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJUcmFuc21pdHRlZCBUaHJvdWdoIFNwZWFrZXIuIFBsYXlzIG92ZXIgc3BlYWtlciBvbmx5LCBzaWxlbnQgb24gb3RoZXIgZGV2aWNlcyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhY2Nlc3NpYmlsaXR5IiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJGb3IgYWNjZXNzaWJpbGl0eSB0YWxrIGJhY2sgcHJvbXB0cyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJyZXJvdXRpbmciIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fUkVST1VUSU5HIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iRm9yIGR5bmFtaWMgcG9saWN5IG91dHB1dCBtaXhlcyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJwYXRjaCIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9QQVRDSCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IkZvciBpbnRlcm5hbCBhdWRpbyBmbGluZ2VyIHRyYWNrcy4gRml4ZWQgdm9sdW1lIi8+CisgICAgICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSRUFNIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBJTlBVVCBTT1VSQ0UgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgICAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJJbnB1dFNvdXJjZXMiIERlc2NyaXB0aW9uPSJhc3NvY2lhdGVkIHRvIGF1ZGlvX3NvdXJjZV90IGRlZmluaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXIgbWFwcGluZyBtdXN0IG1hdGNoIHRoZSB2YWx1ZSBvZiB0aGUgZW51bSI+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImRlZmF1bHQiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9ERUZBVUxUIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im1pYyIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX01JQyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV91cGxpbmsiIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9kb3dubGluayIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9jYWxsIiBUeXBlPSJJbnB1dFNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJjYW1jb3JkZXIiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9DQU1DT1JERVIiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfcmVjb2duaXRpb24iIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfY29tbXVuaWNhdGlvbiIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icmVtb3RlX3N1Ym1peCIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVgiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idW5wcm9jZXNzZWQiIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9VTlBST0NFU1NFRCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJmbV90dW5lciIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX0ZNX1RVTkVSIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImhvdHdvcmQiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9IT1RXT1JEIi8+CisgICAgICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgSU5QVVQgU09VUkNFIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorICAgIDwvQ29tcG9uZW50TGlicmFyeT4KKworICAgIDxJbnN0YW5jZURlZmluaXRpb24+CisgICAgICAgIDxDb21wb25lbnQgTmFtZT0ic3RyZWFtcyIgVHlwZT0iU3RyZWFtcyIvPgorICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImlucHV0X3NvdXJjZXMiIFR5cGU9IklucHV0U291cmNlcyIvPgorICAgICAgICA8Q29tcG9uZW50IE5hbWU9InByb2R1Y3Rfc3RyYXRlZ2llcyIgVHlwZT0iUHJvZHVjdFN0cmF0ZWdpZXMiLz4KKyAgICA8L0luc3RhbmNlRGVmaW5pdGlvbj4KKzwvU3Vic3lzdGVtPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvY29tbW9uL1N0cnVjdHVyZS9Qcm9kdWN0U3RyYXRlZ2llcy54bWwuaW4gYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9jb21tb24vU3RydWN0dXJlL1Byb2R1Y3RTdHJhdGVnaWVzLnhtbC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzYwYjI1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvY29tbW9uL1N0cnVjdHVyZS9Qcm9kdWN0U3RyYXRlZ2llcy54bWwuaW4KQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxDb21wb25lbnRUeXBlU2V0IHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICAgICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgorICAgICAgICAgICAgICB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iU2NoZW1hcy9Db21wb25lbnRUeXBlU2V0LnhzZCI+CisKKyAgPCEtLSBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlIHRoZSBzdHJhdGVneSBzdHJ1Y3R1cmUgcGx1Z2luIGZpbGUgZnJvbSBFbmdpbmUgQ29uZmlndXJhdGlvbiBYTUwgZmlsZQorICAgICAgICBDb21wb25lbnQgTmFtZT0ieHh4IiBUeXBlPSJQcm9kdWN0U3RyYXRlZ3kiLy0tPgorICA8Q29tcG9uZW50VHlwZSBOYW1lPSJQcm9kdWN0U3RyYXRlZ2llcyIgRGVzY3JpcHRpb249IiI+CisgIDwvQ29tcG9uZW50VHlwZT4KKworPC9Db21wb25lbnRUeXBlU2V0PgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvcG9saWN5X2NyaXRlcmlhLnR4dCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL3BvbGljeV9jcml0ZXJpYS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MGNiZTEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvcG9saWN5X2NyaXRlcmlhLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLUV4Y2x1c2l2ZUNyaXRlcmlvbiBUZWxlcGhvbnlNb2RlICAgICAgICAgICAgICAgIDogICBOb3JtYWwgICAgICAgICAgUmluZ1RvbmUgICAgICAgICAgICAgICAgSW5DYWxsICAgICAgICAgICAgICBJbkNvbW11bmljYXRpb24KLUluY2x1c2l2ZUNyaXRlcmlvbiBBdmFpbGFibGVJbnB1dERldmljZXMgICAgICAgIDogICBDb21tdW5pY2F0aW9uIEFtYmllbnQgQnVpbHRpbk1pYyBCbHVldG9vdGhTY29IZWFkc2V0IFdpcmVkSGVhZHNldCBIZG1pIFRlbGVwaG9ueVJ4IEJhY2tNaWMgUmVtb3RlU3VibWl4IEFubGdEb2NrSGVhZHNldCBEZ3RsRG9ja0hlYWRzZXQgVXNiQWNjZXNzb3J5IFVzYkRldmljZSBGbVR1bmVyIFR2VHVuZXIgTGluZSBTcGRpZiBCbHVldG9vdGhBMmRwIExvb3BiYWNrIElwIEJ1cyBTdHViCi1JbmNsdXNpdmVDcml0ZXJpb24gQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyAgICAgICA6ICAgRWFycGllY2UgU3BlYWtlciBXaXJlZFNwZWFrZXIgV2lyZWRIZWFkc2V0IFdpcmVkSGVhZHBob25lIEJsdWV0b290aFNjbyBCbHVldG9vdGhTY29IZWFkc2V0IEJsdWV0b290aFNjb0NhcmtpdCBCbHVldG9vdGhBMmRwIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzIEJsdWV0b290aEEyZHBTcGVha2VyIEhkbWkgQW5sZ0RvY2tIZWFkc2V0IERndGxEb2NrSGVhZHNldCBVc2JBY2Nlc3NvcnkgVXNiRGV2aWNlIFJlbW90ZVN1Ym1peCBUZWxlcGhvbnlUeCBMaW5lIEhkbWlBcmMgU3BkaWYgRm0gQXV4TGluZSBTcGVha2VyU2FmZSBJcCBCdXMgU3R1YgotRXhjbHVzaXZlQ3JpdGVyaW9uIEZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiAgICAgOiAgIEZvcmNlTm9uZSAgICAgICBGb3JjZVNwZWFrZXIgICAgICAgICAgICBGb3JjZUJ0U2NvCi1FeGNsdXNpdmVDcml0ZXJpb24gRm9yY2VVc2VGb3JNZWRpYSAgICAgICAgICAgICA6ICAgRm9yY2VOb25lICAgICAgIEZvcmNlU3BlYWtlcgkJCUZvcmNlSGVhZHBob25lcyAgICAgICAgIEZvcmNlQnRBMmRwICAgICAgICAgRm9yY2VXaXJlZEFjY2Vzc29yeSBGb3JjZUFuYWxvZ0RvY2sgRm9yY2VEaWdpdGFsRG9jayAgICBGb3JjZU5vQnRBMmRwICAgICAgIEZvcmNlU3lzdGVtRW5mb3JjZWQKLUV4Y2x1c2l2ZUNyaXRlcmlvbiBGb3JjZVVzZUZvclJlY29yZCAgICAgICAgICAgIDogICBGb3JjZU5vbmUgICAgICAgRm9yY2VCdFNjbyAgICAgICAgICAgICAgRm9yY2VXaXJlZEFjY2Vzc29yeQotRXhjbHVzaXZlQ3JpdGVyaW9uIEZvcmNlVXNlRm9yRG9jayAgICAgICAgICAgICAgOiAgIEZvcmNlTm9uZSAgICAgICBGb3JjZVdpcmVkQWNjZXNzb3J5ICAgICBGb3JjZUJ0Q2FyRG9jayAgICAgIEZvcmNlQnREZXNrRG9jayAgICAgRm9yY2VBbmFsb2dEb2NrIEZvcmNlRGlnaXRhbERvY2sKLUV4Y2x1c2l2ZUNyaXRlcmlvbiBGb3JjZVVzZUZvclN5c3RlbSAgICAgICAgICAgIDogICBGb3JjZU5vbmUgICAgICAgRm9yY2VTeXN0ZW1FbmZvcmNlZAotRXhjbHVzaXZlQ3JpdGVyaW9uIEZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvICAgOiAgIEZvcmNlTm9uZSAgICAgICBGb3JjZUhkbWlTeXN0ZW1FbmZvcmNlZAotRXhjbHVzaXZlQ3JpdGVyaW9uIEZvcmNlVXNlRm9yRW5jb2RlZFN1cnJvdW5kICAgOiAgIEZvcmNlTm9uZSAgICAgICBGb3JjZUVuY29kZWRTdXJyb3VuZE5ldmVyICAgRm9yY2VFbmNvZGVkU3Vycm91bmRBbHdheXMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY4NWM2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzYgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGlicG9saWN5LXN1YnN5c3RlbSIsCisgICAgc3JjczogWworICAgICAgICAiUG9saWN5U3Vic3lzdGVtQnVpbGRlci5jcHAiLAorICAgICAgICAiUG9saWN5U3Vic3lzdGVtLmNwcCIsCisgICAgICAgICJJbnB1dFNvdXJjZS5jcHAiLAorICAgICAgICAiU3RyZWFtLmNwcCIsCisgICAgICAgICJQcm9kdWN0U3RyYXRlZ3kuY3BwIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1mdmlzaWJpbGl0eS1pbmxpbmVzLWhpZGRlbiIsCisgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAorICAgICAgICAibGliYXVkaW9wb2xpY3ljb21tb24iLAorICAgICAgICAibGliYXVkaW9jbGllbnRfaGVhZGVycyIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeWVuZ2luZV9pbnRlcmZhY2VfaGVhZGVycyIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYWJsZV9pbnRlcmZhY2VfaGVhZGVycyIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYXVkaW9wb2xpY3ljb21wb25lbnRzIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5ZW5naW5lX2NvbW1vbiIsCisgICAgICAgICJsaWJwZndfdXRpbGl0eSIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW9wb2xpY3llbmdpbmVjb25maWd1cmFibGUiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJwYXJhbWV0ZXIiCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NTljZjEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWlmbmVxICgkKFVTRV9DVVNUT01fUEFSQU1FVEVSX0ZSQU1FV09SSyksIHRydWUpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSAgICBQb2xpY3lTdWJzeXN0ZW1CdWlsZGVyLmNwcCBcCi0gICAgUG9saWN5U3Vic3lzdGVtLmNwcCBcCi0gICAgU3RyYXRlZ3kuY3BwIFwKLSAgICBJbnB1dFNvdXJjZS5jcHAgXAotICAgIFN0cmVhbS5jcHAgXAotICAgIFVzYWdlLmNwcAotCi1MT0NBTF9DRkxBR1MgKz0gXAotICAgIC1XYWxsIFwKLSAgICAtV2Vycm9yIFwKLSAgICAtV2V4dHJhIFwKLSAgICAtZnZpc2liaWxpdHktaW5saW5lcy1oaWRkZW4gXAotICAgIC1mdmlzaWJpbGl0eT1oaWRkZW4KLQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliYXVkaW9wb2xpY3llbmdpbmVjb25maWd1cmFibGUgIFwKLSAgICBsaWJwYXJhbWV0ZXIgXAotICAgIGxpYmxvZyBcCi0KLUxPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCi0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGlicGZ3X3V0aWxpdHkKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLUxPQ0FMX01PRFVMRSA6PSBsaWJwb2xpY3ktc3Vic3lzdGVtCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotZW5kaWYgIyBpZm5lcSAoJChVU0VfQ1VTVE9NX1BBUkFNRVRFUl9GUkFNRVdPUkspLCB0cnVlKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0lucHV0U291cmNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9JbnB1dFNvdXJjZS5jcHAKaW5kZXggZWFjNGVmZS4uZjkxZjhkNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0lucHV0U291cmNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vSW5wdXRTb3VyY2UuY3BwCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSAiSW5wdXRTb3VyY2UuaCIKICNpbmNsdWRlICJQb2xpY3lNYXBwaW5nS2V5cy5oIgogI2luY2x1ZGUgIlBvbGljeVN1YnN5c3RlbS5oIgorI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KIAogdXNpbmcgc3RkOjpzdHJpbmc7CiAKQEAgLTMzLDkgKzM0LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQtPmdldEJlbG9uZ2luZ1N1YnN5c3RlbSgpKSksCiAgICAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlKG1Qb2xpY3lTdWJzeXN0ZW0tPmdldFBvbGljeVBsdWdpbkludGVyZmFjZSgpKQogewotICAgIG1JZCA9IHN0YXRpY19jYXN0PGF1ZGlvX3NvdXJjZV90Pihjb250ZXh0LmdldEl0ZW1Bc0ludGVnZXIoTWFwcGluZ0tleUlkZW50aWZpZXIpKTsKKyAgICBzdGQ6OnN0cmluZyBuYW1lKGNvbnRleHQuZ2V0SXRlbShNYXBwaW5nS2V5TmFtZSkpOworCisgICAgaWYobm90IGFuZHJvaWQ6OlNvdXJjZVR5cGVDb252ZXJ0ZXI6OmZyb21TdHJpbmcobmFtZSwgbUlkKSkgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJJbnZhbGlkIElucHV0IFNvdXJjZSBuYW1lOiAlcywgaW52YWxpZCBYTUwgc3RydWN0dXJlIGZpbGUiLCBuYW1lLmNfc3RyKCkpOworICAgIH0KICAgICAvLyBEZWNsYXJlcyB0aGUgc3RyYXRlZ3kgdG8gYXVkaW8gcG9saWN5IGVuZ2luZQotICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPmFkZElucHV0U291cmNlKGdldEZvcm1hdHRlZE1hcHBpbmdWYWx1ZSgpLCBtSWQpOworICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPmFkZElucHV0U291cmNlKG5hbWUsIG1JZCk7CiB9CiAKIGJvb2wgSW5wdXRTb3VyY2U6OnNlbmRUb0hXKHN0cmluZyAmIC8qZXJyb3IqLykKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qb2xpY3lTdWJzeXN0ZW0uY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1BvbGljeVN1YnN5c3RlbS5jcHAKaW5kZXggOThkMTBhOS4uOGJkN2Y2NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1BvbGljeVN1YnN5c3RlbS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1BvbGljeVN1YnN5c3RlbS5jcHAKQEAgLTE3LDEwICsxNyw5IEBACiAjaW5jbHVkZSAiUG9saWN5U3Vic3lzdGVtLmgiCiAjaW5jbHVkZSAiU3Vic3lzdGVtT2JqZWN0RmFjdG9yeS5oIgogI2luY2x1ZGUgIlBvbGljeU1hcHBpbmdLZXlzLmgiCi0jaW5jbHVkZSAiU3RyYXRlZ3kuaCIKICNpbmNsdWRlICJTdHJlYW0uaCIKICNpbmNsdWRlICJJbnB1dFNvdXJjZS5oIgotI2luY2x1ZGUgIlVzYWdlLmgiCisjaW5jbHVkZSAiUHJvZHVjdFN0cmF0ZWd5LmgiCiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxBdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC0zNiw5ICszNSw4IEBACiAKIAogY29uc3QgY2hhciAqY29uc3QgUG9saWN5U3Vic3lzdGVtOjptU3RyZWFtQ29tcG9uZW50TmFtZSA9ICJTdHJlYW0iOwotY29uc3QgY2hhciAqY29uc3QgUG9saWN5U3Vic3lzdGVtOjptU3RyYXRlZ3lDb21wb25lbnROYW1lID0gIlN0cmF0ZWd5IjsKIGNvbnN0IGNoYXIgKmNvbnN0IFBvbGljeVN1YnN5c3RlbTo6bUlucHV0U291cmNlQ29tcG9uZW50TmFtZSA9ICJJbnB1dFNvdXJjZSI7Ci1jb25zdCBjaGFyICpjb25zdCBQb2xpY3lTdWJzeXN0ZW06Om1Vc2FnZUNvbXBvbmVudE5hbWUgPSAiVXNhZ2UiOworY29uc3QgY2hhciAqY29uc3QgUG9saWN5U3Vic3lzdGVtOjptUHJvZHVjdFN0cmF0ZWd5Q29tcG9uZW50TmFtZSA9ICJQcm9kdWN0U3RyYXRlZ3kiOwogCiBQb2xpY3lTdWJzeXN0ZW06OlBvbGljeVN1YnN5c3RlbShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgY29yZTo6bG9nOjpMb2dnZXIgJmxvZ2dlcikKICAgICA6IENTdWJzeXN0ZW0obmFtZSwgbG9nZ2VyKSwKQEAgLTY1LDIyICs2MywxNiBAQAogICAgIGFkZFN1YnN5c3RlbU9iamVjdEZhY3RvcnkoCiAgICAgICAgIG5ldyBUU3Vic3lzdGVtT2JqZWN0RmFjdG9yeTxTdHJlYW0+KAogICAgICAgICAgICAgbVN0cmVhbUNvbXBvbmVudE5hbWUsCi0gICAgICAgICAgICAoMSA8PCBNYXBwaW5nS2V5SWRlbnRpZmllcikpCi0gICAgICAgICk7Ci0gICAgYWRkU3Vic3lzdGVtT2JqZWN0RmFjdG9yeSgKLSAgICAgICAgbmV3IFRTdWJzeXN0ZW1PYmplY3RGYWN0b3J5PFN0cmF0ZWd5PigKLSAgICAgICAgICAgIG1TdHJhdGVneUNvbXBvbmVudE5hbWUsCi0gICAgICAgICAgICAoMSA8PCBNYXBwaW5nS2V5QW1lbmQxKSB8ICgxIDw8IE1hcHBpbmdLZXlJZGVudGlmaWVyKSkKLSAgICAgICAgKTsKLSAgICBhZGRTdWJzeXN0ZW1PYmplY3RGYWN0b3J5KAotICAgICAgICBuZXcgVFN1YnN5c3RlbU9iamVjdEZhY3Rvcnk8VXNhZ2U+KAotICAgICAgICAgICAgbVVzYWdlQ29tcG9uZW50TmFtZSwKLSAgICAgICAgICAgICgxIDw8IE1hcHBpbmdLZXlBbWVuZDEpIHwgKDEgPDwgTWFwcGluZ0tleUlkZW50aWZpZXIpKQorICAgICAgICAgICAgKDEgPDwgTWFwcGluZ0tleU5hbWUpKQogICAgICAgICApOwogICAgIGFkZFN1YnN5c3RlbU9iamVjdEZhY3RvcnkoCiAgICAgICAgIG5ldyBUU3Vic3lzdGVtT2JqZWN0RmFjdG9yeTxJbnB1dFNvdXJjZT4oCiAgICAgICAgICAgICBtSW5wdXRTb3VyY2VDb21wb25lbnROYW1lLAotICAgICAgICAgICAgKDEgPDwgTWFwcGluZ0tleUFtZW5kMSkgfCAoMSA8PCBNYXBwaW5nS2V5SWRlbnRpZmllcikpCisgICAgICAgICAgICAoMSA8PCBNYXBwaW5nS2V5TmFtZSkpCisgICAgICAgICk7CisgICAgYWRkU3Vic3lzdGVtT2JqZWN0RmFjdG9yeSgKKyAgICAgICAgbmV3IFRTdWJzeXN0ZW1PYmplY3RGYWN0b3J5PFByb2R1Y3RTdHJhdGVneT4oCisgICAgICAgICAgICBtUHJvZHVjdFN0cmF0ZWd5Q29tcG9uZW50TmFtZSwgKDEgPDwgTWFwcGluZ0tleU5hbWUpKQogICAgICAgICApOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUG9saWN5U3Vic3lzdGVtLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUG9saWN5U3Vic3lzdGVtLmgKaW5kZXggODIyZWViOS4uOWJmMWMyMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1BvbGljeVN1YnN5c3RlbS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qb2xpY3lTdWJzeXN0ZW0uaApAQCAtNTMsNyArNTMsNiBAQAogICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtS2V5QW1lbmQzOyAvKio8IGFtZW5kMyBrZXkgbWFwcGluZyBzdHJpbmcuICovCiAKICAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbVN0cmVhbUNvbXBvbmVudE5hbWU7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1TdHJhdGVneUNvbXBvbmVudE5hbWU7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1JbnB1dFNvdXJjZUNvbXBvbmVudE5hbWU7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1Vc2FnZUNvbXBvbmVudE5hbWU7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1Qcm9kdWN0U3RyYXRlZ3lDb21wb25lbnROYW1lOwogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qcm9kdWN0U3RyYXRlZ3kuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1Byb2R1Y3RTdHJhdGVneS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJkOTQ1NgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qcm9kdWN0U3RyYXRlZ3kuY3BwCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiUHJvZHVjdFN0cmF0ZWd5LmgiCisjaW5jbHVkZSAiUG9saWN5TWFwcGluZ0tleXMuaCIKKyNpbmNsdWRlICJQb2xpY3lTdWJzeXN0ZW0uaCIKKwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBhbmRyb2lkOjpwcm9kdWN0X3N0cmF0ZWd5X3Q7CisKK1Byb2R1Y3RTdHJhdGVneTo6UHJvZHVjdFN0cmF0ZWd5KGNvbnN0IHN0cmluZyAmbWFwcGluZ1ZhbHVlLAorICAgICAgICAgICAgICAgICAgIENJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQgKmluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDTWFwcGluZ0NvbnRleHQgJmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgY29yZTo6bG9nOjpMb2dnZXImIGxvZ2dlcikKKyAgICA6IENGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QoaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZ0tleUFtZW5kMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1hcHBpbmdLZXlBbWVuZEVuZCAtIE1hcHBpbmdLZXlBbWVuZDEgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCkKK3sKKyAgICBzdGQ6OnN0cmluZyBuYW1lKGNvbnRleHQuZ2V0SXRlbShNYXBwaW5nS2V5TmFtZSkpOworCisgICAgQUxPR19BU1NFUlQoaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50ICE9IG51bGxwdHIsICJJbnZhbGlkIENvbmZpZ3VyYWJsZSBFbGVtZW50Iik7CisgICAgbVBvbGljeVN1YnN5c3RlbSA9IHN0YXRpY19jYXN0PGNvbnN0IFBvbGljeVN1YnN5c3RlbSAqPigKKyAgICAgICAgICAgICAgICBpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQtPmdldEJlbG9uZ2luZ1N1YnN5c3RlbSgpKTsKKyAgICBBTE9HX0FTU0VSVChtUG9saWN5U3Vic3lzdGVtICE9IG51bGxwdHIsICJJbnZhbGlkIFBvbGljeSBTdWJzeXN0ZW0iKTsKKworICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UgPSBtUG9saWN5U3Vic3lzdGVtLT5nZXRQb2xpY3lQbHVnaW5JbnRlcmZhY2UoKTsKKyAgICBBTE9HX0FTU0VSVChtUG9saWN5UGx1Z2luSW50ZXJmYWNlICE9IG51bGxwdHIsICJJbnZhbGlkIFBvbGljeSBQbHVnaW4gSW50ZXJmYWNlIik7CisKKyAgICBtSWQgPSBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5nZXRQcm9kdWN0U3RyYXRlZ3lCeU5hbWUobmFtZSk7CisKKyAgICBBTE9HX0FTU0VSVChtSWQgIT0gUFJPRFVDVF9TVFJBVEVHWV9JTlZBTElELCAiUHJvZHVjdCBTdHJhdGVneSAlcyBub3QgZm91bmQiLCBuYW1lLmNfc3RyKCkpOworCisgICAgQUxPR0UoIlByb2R1Y3QgU3RyYXRlZ3kgJXMgYWRkZWQiLCBuYW1lLmNfc3RyKCkpOworfQorCitib29sIFByb2R1Y3RTdHJhdGVneTo6c2VuZFRvSFcoc3RyaW5nICYgLyplcnJvciovKQoreworICAgIERldmljZSBkZXZpY2VQYXJhbXM7CisgICAgYmxhY2tib2FyZFJlYWQoJmRldmljZVBhcmFtcywgc2l6ZW9mKGRldmljZVBhcmFtcykpOworCisgICAgbVBvbGljeVBsdWdpbkludGVyZmFjZS0+c2V0RGV2aWNlVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kobUlkLCBkZXZpY2VQYXJhbXMuYXBwbGljYWJsZURldmljZSk7CisgICAgbVBvbGljeVBsdWdpbkludGVyZmFjZS0+c2V0RGV2aWNlQWRkcmVzc0ZvclByb2R1Y3RTdHJhdGVneShtSWQsIGRldmljZVBhcmFtcy5kZXZpY2VBZGRyZXNzKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qcm9kdWN0U3RyYXRlZ3kuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qcm9kdWN0U3RyYXRlZ3kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDRmMDgyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1Byb2R1Y3RTdHJhdGVneS5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkZvcm1hdHRlZFN1YnN5c3RlbU9iamVjdC5oIgorI2luY2x1ZGUgIkluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudC5oIgorI2luY2x1ZGUgIk1hcHBpbmdDb250ZXh0LmgiCisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxwb2xpY3kuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK2NsYXNzIFBvbGljeVN1YnN5c3RlbTsKKworY2xhc3MgUHJvZHVjdFN0cmF0ZWd5IDogcHVibGljIENGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QKK3sKK3ByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IG1NYXhTdHJpbmdTaXplID0gMjU3OyAvKio8IG1heCBzdHJpbmcgc2l6ZSAocGx1cyB6ZXJvIHRlcm1pbmFsKS4gKi8KKworICAgIHN0cnVjdCBEZXZpY2UKKyAgICB7CisgICAgICAgIHVpbnQzMl90IGFwcGxpY2FibGVEZXZpY2U7IC8qKjwgYXBwbGljYWJsZSBkZXZpY2UgZm9yIHRoaXMgc3RyYXRlZ3kuICovCisgICAgICAgIGNoYXIgZGV2aWNlQWRkcmVzc1ttTWF4U3RyaW5nU2l6ZV07IC8qKjwgZGV2aWNlIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3RyYXRlZ3kuICovCisgICAgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworcHVibGljOgorICAgIFByb2R1Y3RTdHJhdGVneShjb25zdCBzdGQ6OnN0cmluZyAmbWFwcGluZ1ZhbHVlLAorICAgICAgICAgICAgIENJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQgKmluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKKyAgICAgICAgICAgICBjb25zdCBDTWFwcGluZ0NvbnRleHQgJmNvbnRleHQsCisgICAgICAgICAgICAgY29yZTo6bG9nOjpMb2dnZXImIGxvZ2dlcik7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIGJvb2wgc2VuZFRvSFcoc3RkOjpzdHJpbmcgJmVycm9yKTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBQb2xpY3lTdWJzeXN0ZW0gKm1Qb2xpY3lTdWJzeXN0ZW07IC8qKjwgUm91dGUgc3Vic3l0ZW0gcGx1Z2luLiAqLworCisgICAgYW5kcm9pZDo6cHJvZHVjdF9zdHJhdGVneV90IG1JZDsKKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSB0byBjb21tdW5pY2F0ZSB3aXRoIEF1ZGlvIFBvbGljeSBFbmdpbmUuCisgICAgICovCisgICAgYW5kcm9pZDo6QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UgKm1Qb2xpY3lQbHVnaW5JbnRlcmZhY2U7Cit9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmF0ZWd5LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJhdGVneS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NmMzYTguLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmF0ZWd5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiU3RyYXRlZ3kuaCIKLSNpbmNsdWRlICJQb2xpY3lNYXBwaW5nS2V5cy5oIgotI2luY2x1ZGUgIlBvbGljeVN1YnN5c3RlbS5oIgotCi11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIGFuZHJvaWQ6OnJvdXRpbmdfc3RyYXRlZ3k7Ci0KLVN0cmF0ZWd5OjpTdHJhdGVneShjb25zdCBzdHJpbmcgJm1hcHBpbmdWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICBDSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50ICppbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQ01hcHBpbmdDb250ZXh0ICZjb250ZXh0LAotICAgICAgICAgICAgICAgICAgIGNvcmU6OmxvZzo6TG9nZ2VyJiBsb2dnZXIpCi0gICAgOiBDRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0KGluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmdLZXlBbWVuZDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNYXBwaW5nS2V5QW1lbmRFbmQgLSBNYXBwaW5nS2V5QW1lbmQxICsgMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQpLAotICAgICAgbVBvbGljeVN1YnN5c3RlbShzdGF0aWNfY2FzdDxjb25zdCBQb2xpY3lTdWJzeXN0ZW0gKj4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQtPmdldEJlbG9uZ2luZ1N1YnN5c3RlbSgpKSksCi0gICAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlKG1Qb2xpY3lTdWJzeXN0ZW0tPmdldFBvbGljeVBsdWdpbkludGVyZmFjZSgpKQotewotICAgIG1JZCA9IHN0YXRpY19jYXN0PHJvdXRpbmdfc3RyYXRlZ3k+KGNvbnRleHQuZ2V0SXRlbUFzSW50ZWdlcihNYXBwaW5nS2V5SWRlbnRpZmllcikpOwotCi0gICAgLy8gRGVjbGFyZXMgdGhlIHN0cmF0ZWd5IHRvIGF1ZGlvIHBvbGljeSBlbmdpbmUKLSAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5hZGRTdHJhdGVneShnZXRGb3JtYXR0ZWRNYXBwaW5nVmFsdWUoKSwgbUlkKTsKLX0KLQotYm9vbCBTdHJhdGVneTo6c2VuZFRvSFcoc3RyaW5nICYgLyplcnJvciovKQotewotICAgIHVpbnQzMl90IGFwcGxpY2FibGVPdXRwdXREZXZpY2U7Ci0gICAgYmxhY2tib2FyZFJlYWQoJmFwcGxpY2FibGVPdXRwdXREZXZpY2UsIHNpemVvZihhcHBsaWNhYmxlT3V0cHV0RGV2aWNlKSk7Ci0gICAgcmV0dXJuIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPnNldERldmljZUZvclN0cmF0ZWd5KG1JZCwgYXBwbGljYWJsZU91dHB1dERldmljZSk7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyYXRlZ3kuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJhdGVneS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDJiODJjLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJhdGVneS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0LmgiCi0jaW5jbHVkZSAiSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LmgiCi0jaW5jbHVkZSAiTWFwcGluZ0NvbnRleHQuaCIKLSNpbmNsdWRlIDxBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oPgotI2luY2x1ZGUgPHN0cmluZz4KLQotY2xhc3MgUG9saWN5U3Vic3lzdGVtOwotCi1jbGFzcyBTdHJhdGVneSA6IHB1YmxpYyBDRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0Ci17Ci1wdWJsaWM6Ci0gICAgU3RyYXRlZ3koY29uc3Qgc3RkOjpzdHJpbmcgJm1hcHBpbmdWYWx1ZSwKLSAgICAgICAgICAgICBDSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50ICppbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCi0gICAgICAgICAgICAgY29uc3QgQ01hcHBpbmdDb250ZXh0ICZjb250ZXh0LAotICAgICAgICAgICAgIGNvcmU6OmxvZzo6TG9nZ2VyJiBsb2dnZXIpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBib29sIHNlbmRUb0hXKHN0ZDo6c3RyaW5nICZlcnJvcik7Ci0KLXByaXZhdGU6Ci0gICAgY29uc3QgUG9saWN5U3Vic3lzdGVtICptUG9saWN5U3Vic3lzdGVtOyAvKio8IFJvdXRlIHN1YnN5dGVtIHBsdWdpbi4gKi8KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSB0byBjb21tdW5pY2F0ZSB3aXRoIEF1ZGlvIFBvbGljeSBFbmdpbmUuCi0gICAgICovCi0gICAgYW5kcm9pZDo6QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UgKm1Qb2xpY3lQbHVnaW5JbnRlcmZhY2U7Ci0KLSAgICBhbmRyb2lkOjpyb3V0aW5nX3N0cmF0ZWd5IG1JZDsgLyoqPCBzdHJhdGVneSBpZGVudGlmaWVyIHRvIGxpbmsgd2l0aCBhdWRpby5oLiovCi19OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmVhbS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyZWFtLmNwcAppbmRleCBjNjQyYTIzLi41MjMwZTBlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyZWFtLmNwcApAQCAtMTcsOSArMTcsOSBAQAogI2luY2x1ZGUgIlN0cmVhbS5oIgogI2luY2x1ZGUgIlBvbGljeU1hcHBpbmdLZXlzLmgiCiAjaW5jbHVkZSAiUG9saWN5U3Vic3lzdGVtLmgiCisjaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgogCiB1c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIGFuZHJvaWQ6OnJvdXRpbmdfc3RyYXRlZ3k7CiAKIFN0cmVhbTo6U3RyZWFtKGNvbnN0IHN0cmluZyAmLyptYXBwaW5nVmFsdWUqLywKICAgICAgICAgICAgICAgIENJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQgKmluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKQEAgLTI5LDEwICsyOSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LT5nZXRCZWxvbmdpbmdTdWJzeXN0ZW0oKSkpLAogICAgICAgbVBvbGljeVBsdWdpbkludGVyZmFjZShtUG9saWN5U3Vic3lzdGVtLT5nZXRQb2xpY3lQbHVnaW5JbnRlcmZhY2UoKSkKIHsKLSAgICBtSWQgPSBzdGF0aWNfY2FzdDxhdWRpb19zdHJlYW1fdHlwZV90Pihjb250ZXh0LmdldEl0ZW1Bc0ludGVnZXIoTWFwcGluZ0tleUlkZW50aWZpZXIpKTsKKyAgICBzdGQ6OnN0cmluZyBuYW1lKGNvbnRleHQuZ2V0SXRlbShNYXBwaW5nS2V5TmFtZSkpOworCisgICAgaWYgKG5vdCBhbmRyb2lkOjpTdHJlYW1UeXBlQ29udmVydGVyOjpmcm9tU3RyaW5nKG5hbWUsIG1JZCkpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiSW52YWxpZCBTdHJlYW0gdHlwZSBuYW1lOiAlcywgaW52YWxpZCBYTUwgc3RydWN0dXJlIGZpbGUiLCBuYW1lLmNfc3RyKCkpOworICAgIH0KIAogICAgIC8vIERlY2xhcmVzIHRoZSBzdHJhdGVneSB0byBhdWRpbyBwb2xpY3kgZW5naW5lCi0gICAgbVBvbGljeVBsdWdpbkludGVyZmFjZS0+YWRkU3RyZWFtKGdldEZvcm1hdHRlZE1hcHBpbmdWYWx1ZSgpLCBtSWQpOworICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPmFkZFN0cmVhbShuYW1lLCBtSWQpOwogfQogCiBib29sIFN0cmVhbTo6c2VuZFRvSFcoc3RyaW5nICYgLyplcnJvciovKQpAQCAtNDAsMTEgKzQ0LDggQEAKICAgICBBcHBsaWNhYmxlIHBhcmFtczsKICAgICBibGFja2JvYXJkUmVhZCgmcGFyYW1zLCBzaXplb2YocGFyYW1zKSk7CiAKLSAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5zZXRTdHJhdGVneUZvclN0cmVhbShtSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8cm91dGluZ19zdHJhdGVneT4ocGFyYW1zLnN0cmF0ZWd5KSk7Ci0KLSAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5zZXRWb2x1bWVQcm9maWxlRm9yU3RyZWFtKG1JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX3N0cmVhbV90eXBlX3Q+KHBhcmFtcy52b2x1bWVQcm9maWxlKSk7CisgICAgbVBvbGljeVBsdWdpbkludGVyZmFjZS0+c2V0Vm9sdW1lUHJvZmlsZUZvclN0cmVhbSgKKyAgICAgICAgICAgICAgICBtSWQsIHN0YXRpY19jYXN0PGF1ZGlvX3N0cmVhbV90eXBlX3Q+KHBhcmFtcy52b2x1bWVQcm9maWxlKSk7CiAKICAgICByZXR1cm4gdHJ1ZTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmVhbS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmVhbS5oCmluZGV4IDRhODc1ZGIuLmUwY2UyZmEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyZWFtLmgKQEAgLTI5LDcgKzI5LDYgQEAKIHByaXZhdGU6CiAgICAgc3RydWN0IEFwcGxpY2FibGUKICAgICB7Ci0gICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5OyAvKio8IGFwcGxpY2FibGUgc3RyYXRlZ3kgZm9yIHRoaXMgc3RyZWFtLiAqLwogICAgICAgICB1aW50MzJfdCB2b2x1bWVQcm9maWxlOyAvKio8IGFwcGxpY2FibGUgc3RyYXRlZ3kgZm9yIHRoaXMgc3RyZWFtLiAqLwogICAgIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Vc2FnZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vVXNhZ2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODE5OWY4Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Vc2FnZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIlVzYWdlLmgiCi0jaW5jbHVkZSAiUG9saWN5TWFwcGluZ0tleXMuaCIKLSNpbmNsdWRlICJQb2xpY3lTdWJzeXN0ZW0uaCIKLQotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBhbmRyb2lkOjpyb3V0aW5nX3N0cmF0ZWd5OwotCi1Vc2FnZTo6VXNhZ2UoY29uc3Qgc3RyaW5nICZtYXBwaW5nVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgQ0luc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCAqaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAotICAgICAgICAgICAgICAgICAgIGNvbnN0IENNYXBwaW5nQ29udGV4dCAmY29udGV4dCwgY29yZTo6bG9nOjpMb2dnZXIgJmxvZ2dlcikKLSAgICA6IENGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QoaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZ0tleUFtZW5kMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1hcHBpbmdLZXlBbWVuZEVuZCAtIE1hcHBpbmdLZXlBbWVuZDEgKyAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCksCi0gICAgICBtUG9saWN5U3Vic3lzdGVtKHN0YXRpY19jYXN0PGNvbnN0IFBvbGljeVN1YnN5c3RlbSAqPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudC0+Z2V0QmVsb25naW5nU3Vic3lzdGVtKCkpKSwKLSAgICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UobVBvbGljeVN1YnN5c3RlbS0+Z2V0UG9saWN5UGx1Z2luSW50ZXJmYWNlKCkpCi17Ci0gICAgbUlkID0gc3RhdGljX2Nhc3Q8YXVkaW9fdXNhZ2VfdD4oY29udGV4dC5nZXRJdGVtQXNJbnRlZ2VyKE1hcHBpbmdLZXlJZGVudGlmaWVyKSk7Ci0KLSAgICAvLyBEZWNsYXJlcyB0aGUgc3RyYXRlZ3kgdG8gYXVkaW8gcG9saWN5IGVuZ2luZQotICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPmFkZFVzYWdlKGdldEZvcm1hdHRlZE1hcHBpbmdWYWx1ZSgpLCBtSWQpOwotfQotCi1ib29sIFVzYWdlOjpzZW5kVG9IVyhzdHJpbmcgJiAvKmVycm9yKi8pCi17Ci0gICAgdWludDMyX3QgYXBwbGljYWJsZVN0cmF0ZWd5OwotICAgIGJsYWNrYm9hcmRSZWFkKCZhcHBsaWNhYmxlU3RyYXRlZ3ksIHNpemVvZihhcHBsaWNhYmxlU3RyYXRlZ3kpKTsKLSAgICByZXR1cm4gbVBvbGljeVBsdWdpbkludGVyZmFjZS0+c2V0U3RyYXRlZ3lGb3JVc2FnZShtSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8cm91dGluZ19zdHJhdGVneT4oYXBwbGljYWJsZVN0cmF0ZWd5KSk7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vVXNhZ2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Vc2FnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjAyMDRmLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Vc2FnZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0LmgiCi0jaW5jbHVkZSAiSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LmgiCi0jaW5jbHVkZSAiTWFwcGluZ0NvbnRleHQuaCIKLSNpbmNsdWRlIDxBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oPgotI2luY2x1ZGUgPHN0cmluZz4KLQotY2xhc3MgUG9saWN5U3Vic3lzdGVtOwotCi1jbGFzcyBVc2FnZSA6IHB1YmxpYyBDRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0Ci17Ci1wdWJsaWM6Ci0gICAgVXNhZ2UoY29uc3Qgc3RkOjpzdHJpbmcgJm1hcHBpbmdWYWx1ZSwKLSAgICAgICAgICBDSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50ICppbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCi0gICAgICAgICAgY29uc3QgQ01hcHBpbmdDb250ZXh0ICZjb250ZXh0LAotICAgICAgICAgIGNvcmU6OmxvZzo6TG9nZ2VyJiBsb2dnZXIpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBib29sIHNlbmRUb0hXKHN0ZDo6c3RyaW5nICZlcnJvcik7Ci0KLXByaXZhdGU6Ci0gICAgY29uc3QgUG9saWN5U3Vic3lzdGVtICptUG9saWN5U3Vic3lzdGVtOyAvKio8IFJvdXRlIHN1YnN5dGVtIHBsdWdpbi4gKi8KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSB0byBjb21tdW5pY2F0ZSB3aXRoIEF1ZGlvIFBvbGljeSBFbmdpbmUuCi0gICAgICovCi0gICAgYW5kcm9pZDo6QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UgKm1Qb2xpY3lQbHVnaW5JbnRlcmZhY2U7Ci0KLSAgICBhdWRpb191c2FnZV90IG1JZDsgLyoqPCB1c2FnZSBpZGVudGlmaWVyIHRvIGxpbmsgd2l0aCBhdWRpby5oLiAqLwotfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zZXBvbGljeS9hdWRpb3NlcnZlci50ZSBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zZXBvbGljeS9hdWRpb3NlcnZlci50ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDQxZDQyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NlcG9saWN5L2F1ZGlvc2VydmVyLnRlCkBAIC0wLDAgKzEsNCBAQAordXNlcmRlYnVnX29yX2VuZyhgCisgIGFsbG93IGF1ZGlvc2VydmVyIGF1ZGlvc2VydmVyX3NvY2tldDpkaXIgcndfZGlyX3Blcm1zOworICBhbGxvdyBhdWRpb3NlcnZlciBhdWRpb3NlcnZlcl9zb2NrZXQ6c29ja19maWxlIGNyZWF0ZV9maWxlX3Blcm1zOworJykKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zZXBvbGljeS9maWxlLnRlIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NlcG9saWN5L2ZpbGUudGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RiMTkzNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zZXBvbGljeS9maWxlLnRlCkBAIC0wLDAgKzEsMiBAQAorIyBQb2xpY3kgRW5naW5lIHJlbW90ZSBjb25uZWN0aW9uIGZvciBydW50aW1lIGRlYnVnIG9mIHBhcmFtZXRlciBmcmFtZXdvcmsKK3R5cGUgYXVkaW9zZXJ2ZXJfc29ja2V0LCBmaWxlX3R5cGUsIGNvcmVkb21haW5fc29ja2V0OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NlcG9saWN5L2ZpbGVfY29udGV4dHMgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc2Vwb2xpY3kvZmlsZV9jb250ZXh0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTBmY2NlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NlcG9saWN5L2ZpbGVfY29udGV4dHMKQEAgLTAsMCArMSBAQAorL2Rldi9zb2NrZXQvYXVkaW9zZXJ2ZXIoLy4qKT8gICAgdTpvYmplY3RfcjphdWRpb3NlcnZlcl9zb2NrZXQ6czAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvQ29sbGVjdGlvbi5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9Db2xsZWN0aW9uLmgKaW5kZXggYjcyZGVkOC4uMDJiNDFjYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9Db2xsZWN0aW9uLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9Db2xsZWN0aW9uLmgKQEAgLTE4LDggKzE4LDYgQEAKIAogI2luY2x1ZGUgIkVsZW1lbnQuaCIKICNpbmNsdWRlICJTdHJlYW0uaCIKLSNpbmNsdWRlICJTdHJhdGVneS5oIgotI2luY2x1ZGUgIlVzYWdlLmgiCiAjaW5jbHVkZSAiSW5wdXRTb3VyY2UuaCIKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KQEAgLTI4LDEwICsyNiw4IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3RyaW5nPgogCi1uYW1lc3BhY2UgYW5kcm9pZAotewotbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoteworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeSB7CiAKIC8qKgogICogQ29sbGVjdGlvbiBvZiBwb2xpY3kgZWxlbWVudCBhcyBhIG1hcCBpbmRleGVkIHdpdGggYSB0aGVpciBVSUQgdHlwZS4KQEAgLTE0OSwxNSArMTQ1LDkgQEAKIHRlbXBsYXRlIDw+CiBzdHJ1Y3QgQ29sbGVjdGlvbjxzdGQ6OnN0cmluZz46OmNvbGxlY3Rpb25TdXBwb3J0ZWQge307CiB0ZW1wbGF0ZSA8Pgotc3RydWN0IENvbGxlY3Rpb248YXVkaW9fdXNhZ2VfdD46OmNvbGxlY3Rpb25TdXBwb3J0ZWQge307Ci10ZW1wbGF0ZSA8Pgogc3RydWN0IENvbGxlY3Rpb248YXVkaW9fc291cmNlX3Q+Ojpjb2xsZWN0aW9uU3VwcG9ydGVkIHt9OwotdGVtcGxhdGUgPD4KLXN0cnVjdCBDb2xsZWN0aW9uPHJvdXRpbmdfc3RyYXRlZ3k+Ojpjb2xsZWN0aW9uU3VwcG9ydGVkIHt9OwogCi10eXBlZGVmIENvbGxlY3Rpb248cm91dGluZ19zdHJhdGVneT4gU3RyYXRlZ3lDb2xsZWN0aW9uOwogdHlwZWRlZiBDb2xsZWN0aW9uPGF1ZGlvX3N0cmVhbV90eXBlX3Q+IFN0cmVhbUNvbGxlY3Rpb247Ci10eXBlZGVmIENvbGxlY3Rpb248YXVkaW9fdXNhZ2VfdD4gVXNhZ2VDb2xsZWN0aW9uOwogdHlwZWRlZiBDb2xsZWN0aW9uPGF1ZGlvX3NvdXJjZV90PiBJbnB1dFNvdXJjZUNvbGxlY3Rpb247CiAKIH0gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbGVtZW50LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VsZW1lbnQuaAppbmRleCA1MmU3N2U1Li45Nzk1MGQ4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VsZW1lbnQuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VsZW1lbnQuaApAQCAtMjIsMTAgKzIyLDggQEAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotbmFtZXNwYWNlIGFuZHJvaWQKLXsKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kgewogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5PgogY2xhc3MgRWxlbWVudApAQCAtNjQsNyArNjIsNyBAQAogCiAgICAgLyoqCiAgICAgICogQSBQb2xpY3kgZWxlbWVudCBtYXkgaW1wbGVtZW50IGdldHRlci9zZXR0ZXIgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gcHJvcGVydHkuCi0gICAgICogUHJvcGVydHkgbWF5IGJlIHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90CisgICAgICogUHJvcGVydHkgbWF5IGJlIGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90CiAgICAgICogb3IgYSBzdHJpbmcuCiAgICAgICoKICAgICAgKiBAdHBhcmFtIFByb3BlcnR5IGZvciB3aGljaCB0aGlzIHBvbGljeSBlbGVtZW50IGhhcyBzZXR0ZXIgLyBnZXR0ZXIuCkBAIC03NSw3ICs3Myw3IEBACiAKICAgICAvKioKICAgICAgKiBBIFBvbGljeSBlbGVtZW50IG1heSBpbXBsZW1lbnQgZ2V0dGVyL3NldHRlciBmdW5jdGlvbiBmb3IgYSBnaXZlbiBwcm9wZXJ0eS4KLSAgICAgKiBQcm9wZXJ0eSBtYXkgYmUgcm91dGluZ19zdHJhdGVneSwgYXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9fdXNhZ2VfdCwgYXVkaW9fc291cmNlX3QKKyAgICAgKiBQcm9wZXJ0eSBtYXkgYmUgYXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9fdXNhZ2VfdCwgYXVkaW9fc291cmNlX3QKICAgICAgKiBvciBhIHN0cmluZy4KICAgICAgKgogICAgICAqIEB0cGFyYW0gUHJvcGVydHkgZm9yIHdoaWNoIHRoaXMgcG9saWN5IGVsZW1lbnQgaGFzIHNldHRlciAvIGdldHRlci4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmNwcAppbmRleCAwZDE4ZmZhLi5jYjQ1ZmNmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuY3BwCkBAIC0yNSw5MiArMjUsNjMgQEAKICNlbmRpZgogCiAjaW5jbHVkZSAiRW5naW5lLmgiCi0jaW5jbHVkZSAiU3RyYXRlZ3kuaCIKICNpbmNsdWRlICJTdHJlYW0uaCIKICNpbmNsdWRlICJJbnB1dFNvdXJjZS5oIgotI2luY2x1ZGUgIlVzYWdlLmgiCisKKyNpbmNsdWRlIDxFbmdpbmVDb25maWcuaD4KICNpbmNsdWRlIDxwb2xpY3kuaD4KKyNpbmNsdWRlIDxBdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZS5oPgogI2luY2x1ZGUgPFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmg+CiAKIHVzaW5nIHN0ZDo6c3RyaW5nOwogdXNpbmcgc3RkOjptYXA7CiAKLW5hbWVzcGFjZSBhbmRyb2lkCi17Ci1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17Ci10ZW1wbGF0ZSA8PgotU3RyYXRlZ3lDb2xsZWN0aW9uICZFbmdpbmU6OmdldENvbGxlY3Rpb248cm91dGluZ19zdHJhdGVneT4oKQotewotICAgIHJldHVybiBtU3RyYXRlZ3lDb2xsZWN0aW9uOwotfQorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeSB7CisKIHRlbXBsYXRlIDw+CiBTdHJlYW1Db2xsZWN0aW9uICZFbmdpbmU6OmdldENvbGxlY3Rpb248YXVkaW9fc3RyZWFtX3R5cGVfdD4oKQogewogICAgIHJldHVybiBtU3RyZWFtQ29sbGVjdGlvbjsKIH0KIHRlbXBsYXRlIDw+Ci1Vc2FnZUNvbGxlY3Rpb24gJkVuZ2luZTo6Z2V0Q29sbGVjdGlvbjxhdWRpb191c2FnZV90PigpCi17Ci0gICAgcmV0dXJuIG1Vc2FnZUNvbGxlY3Rpb247Ci19Ci10ZW1wbGF0ZSA8PgogSW5wdXRTb3VyY2VDb2xsZWN0aW9uICZFbmdpbmU6OmdldENvbGxlY3Rpb248YXVkaW9fc291cmNlX3Q+KCkKIHsKICAgICByZXR1cm4gbUlucHV0U291cmNlQ29sbGVjdGlvbjsKIH0KIAogdGVtcGxhdGUgPD4KLWNvbnN0IFN0cmF0ZWd5Q29sbGVjdGlvbiAmRW5naW5lOjpnZXRDb2xsZWN0aW9uPHJvdXRpbmdfc3RyYXRlZ3k+KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbVN0cmF0ZWd5Q29sbGVjdGlvbjsKLX0KLXRlbXBsYXRlIDw+CiBjb25zdCBTdHJlYW1Db2xsZWN0aW9uICZFbmdpbmU6OmdldENvbGxlY3Rpb248YXVkaW9fc3RyZWFtX3R5cGVfdD4oKSBjb25zdAogewogICAgIHJldHVybiBtU3RyZWFtQ29sbGVjdGlvbjsKIH0KIHRlbXBsYXRlIDw+Ci1jb25zdCBVc2FnZUNvbGxlY3Rpb24gJkVuZ2luZTo6Z2V0Q29sbGVjdGlvbjxhdWRpb191c2FnZV90PigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1Vc2FnZUNvbGxlY3Rpb247Ci19Ci10ZW1wbGF0ZSA8PgogY29uc3QgSW5wdXRTb3VyY2VDb2xsZWN0aW9uICZFbmdpbmU6OmdldENvbGxlY3Rpb248YXVkaW9fc291cmNlX3Q+KCkgY29uc3QKIHsKICAgICByZXR1cm4gbUlucHV0U291cmNlQ29sbGVjdGlvbjsKIH0KIAotRW5naW5lOjpFbmdpbmUoKQotICAgIDogbU1hbmFnZXJJbnRlcmZhY2UodGhpcyksCi0gICAgICBtUGx1Z2luSW50ZXJmYWNlKHRoaXMpLAotICAgICAgbVBvbGljeVBhcmFtZXRlck1ncihuZXcgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIoKSksCi0gICAgICBtQXBtT2JzZXJ2ZXIoTlVMTCkKK0VuZ2luZTo6RW5naW5lKCkgOiBtUG9saWN5UGFyYW1ldGVyTWdyKG5ldyBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcigpKQogeworICAgIHN0YXR1c190IGxvYWRSZXN1bHQgPSBsb2FkQXVkaW9Qb2xpY3lFbmdpbmVDb25maWcoKTsKKyAgICBpZiAobG9hZFJlc3VsdCA8IDApIHsKKyAgICAgICAgQUxPR0UoIlBvbGljeSBFbmdpbmUgY29uZmlndXJhdGlvbiBpcyBpbnZhbGlkLiIpOworICAgIH0KIH0KIAogRW5naW5lOjp+RW5naW5lKCkKIHsKLSAgICBtU3RyYXRlZ3lDb2xsZWN0aW9uLmNsZWFyKCk7CiAgICAgbVN0cmVhbUNvbGxlY3Rpb24uY2xlYXIoKTsKICAgICBtSW5wdXRTb3VyY2VDb2xsZWN0aW9uLmNsZWFyKCk7Ci0gICAgbVVzYWdlQ29sbGVjdGlvbi5jbGVhcigpOwotfQotCi0KLXZvaWQgRW5naW5lOjpzZXRPYnNlcnZlcihBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqb2JzZXJ2ZXIpCi17Ci0gICAgQUxPR19BU1NFUlQob2JzZXJ2ZXIgIT0gTlVMTCwgIkludmFsaWQgQXVkaW8gUG9saWN5IE1hbmFnZXIgb2JzZXJ2ZXIiKTsKLSAgICBtQXBtT2JzZXJ2ZXIgPSBvYnNlcnZlcjsKIH0KIAogc3RhdHVzX3QgRW5naW5lOjppbml0Q2hlY2soKQogewotICAgIGlmIChtUG9saWN5UGFyYW1ldGVyTWdyID09IE5VTEwgfHwgbVBvbGljeVBhcmFtZXRlck1nci0+c3RhcnQoKSAhPSBOT19FUlJPUikgeworICAgIGlmIChtUG9saWN5UGFyYW1ldGVyTWdyID09IG51bGxwdHIgfHwgbVBvbGljeVBhcmFtZXRlck1nci0+c3RhcnQoKSAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HRSgiJXM6IGNvdWxkIG5vdCBzdGFydCBQb2xpY3kgUEZXIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHJldHVybiAobUFwbU9ic2VydmVyICE9IE5VTEwpPyBOT19FUlJPUiA6IE5PX0lOSVQ7CisgICAgcmV0dXJuIEVuZ2luZUJhc2U6OmluaXRDaGVjaygpOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5PgpAQCAtMTM4LDU1ICsxMDksMTYgQEAKICAgICByZXR1cm4gZWxlbWVudC0+dGVtcGxhdGUgZ2V0PFByb3BlcnR5PigpOwogfQogCi1yb3V0aW5nX3N0cmF0ZWd5IEVuZ2luZTo6TWFuYWdlckludGVyZmFjZUltcGw6OmdldFN0cmF0ZWd5Rm9yVXNhZ2UoYXVkaW9fdXNhZ2VfdCB1c2FnZSkKK2Jvb2wgRW5naW5lOjpzZXRWb2x1bWVQcm9maWxlRm9yU3RyZWFtKGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnByb2ZpbGUpCiB7Ci0gICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldFByb3BlcnR5Rm9yS2V5PHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3VzYWdlX3Q+KHVzYWdlKTsKLX0KLQotYXVkaW9fZGV2aWNlc190IEVuZ2luZTo6TWFuYWdlckludGVyZmFjZUltcGw6OmdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpIGNvbnN0Ci17Ci0gICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gJm91dHB1dHMgPSBtUG9saWN5RW5naW5lLT5tQXBtT2JzZXJ2ZXItPmdldE91dHB1dHMoKTsKLQotICAgIC8qKiBUaGlzIGlzIHRoZSBvbmx5IGNhc2UgaGFuZGxlZCBwcm9ncmFtbWF0aWNhbGx5IGJlY2F1c2UgdGhlIFBGVyBpcyB1bmFibGUgdG8ga25vdyB0aGUKLSAgICAgKiBhY3Rpdml0eSBvZiBzdHJlYW1zLgotICAgICAqCi0gICAgICogLVdoaWxlIG1lZGlhIGlzIHBsYXlpbmcgb24gYSByZW1vdGUgZGV2aWNlLCB1c2UgdGhlIHRoZSBzb25pZmljYXRpb24gYmVoYXZpb3IuCi0gICAgICogTm90ZSB0aGF0IHdlIHRlc3QgdGhpcyB1c2VjYXNlIGJlZm9yZSB0ZXN0aW5nIGlmIG1lZGlhIGlzIHBsYXlpbmcgYmVjYXVzZQotICAgICAqIHRoZSBpc1N0cmVhbUFjdGl2ZSgpIG1ldGhvZCBvbmx5IGluZm9ybXMgYWJvdXQgdGhlIGFjdGl2aXR5IG9mIGEgc3RyZWFtLCBub3QKLSAgICAgKiBpZiBpdCdzIGZvciBsb2NhbCBwbGF5YmFjay4gTm90ZSBhbHNvIHRoYXQgd2UgdXNlIHRoZSBzYW1lIGRlbGF5IGJldHdlZW4gYm90aCB0ZXN0cwotICAgICAqCi0gICAgICogLVdoZW4gbWVkaWEgaXMgbm90IHBsYXlpbmcgYW55bW9yZSwgZmFsbCBiYWNrIG9uIHRoZSBzb25pZmljYXRpb24gYmVoYXZpb3IKLSAgICAgKi8KLSAgICBpZiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwgJiYKLSAgICAgICAgICAgICFpc19zdGF0ZV9pbl9jYWxsKGdldFBob25lU3RhdGUoKSkgJiYKLSAgICAgICAgICAgICFvdXRwdXRzLmlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoQVVESU9fU1RSRUFNX01VU0lDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkpICYmCi0gICAgICAgICAgICBvdXRwdXRzLmlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9NVVNJQywgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkpKSB7Ci0gICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRQcm9wZXJ0eUZvcktleTxhdWRpb19kZXZpY2VzX3QsIHJvdXRpbmdfc3RyYXRlZ3k+KFNUUkFURUdZX01FRElBKTsKLSAgICB9Ci0gICAgaWYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkgJiYKLSAgICAgICAgKG91dHB1dHMuaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX1JJTkcpIHx8IG91dHB1dHMuaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX0FMQVJNKSkpIHsKLSAgICAgICAgICAgIC8vIGRvIG5vdCByb3V0ZSBhY2Nlc3NpYmlsaXR5IHByb21wdHMgdG8gYSBkaWdpdGFsIG91dHB1dCBjdXJyZW50bHkgY29uZmlndXJlZCB3aXRoIGEKLSAgICAgICAgICAgIC8vIGNvbXByZXNzZWQgZm9ybWF0IGFzIHRoZXkgd291bGQgbGlrZWx5IG5vdCBiZSBtaXhlZCBhbmQgZHJvcHBlZC4KLSAgICAgICAgICAgIC8vIERldmljZSBGb3IgU29uaWZpY2F0aW9uIGNvbmYgZmlsZSBoYXMgSERNSSwgU1BESUYgYW5kIEhETUkgQVJDIHVucmVhY2hlYWJsZS4KLSAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldFByb3BlcnR5Rm9yS2V5PGF1ZGlvX2RldmljZXNfdCwgcm91dGluZ19zdHJhdGVneT4oCi0gICAgICAgICAgICAgICAgICAgIFNUUkFURUdZX1NPTklGSUNBVElPTik7Ci0gICAgfQotICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRQcm9wZXJ0eUZvcktleTxhdWRpb19kZXZpY2VzX3QsIHJvdXRpbmdfc3RyYXRlZ3k+KHN0cmF0ZWd5KTsKLX0KLQotYm9vbCBFbmdpbmU6OlBsdWdpbkludGVyZmFjZUltcGw6OnNldFZvbHVtZVByb2ZpbGVGb3JTdHJlYW0oY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmcHJvZmlsZSkKLXsKLSAgICBpZiAobVBvbGljeUVuZ2luZS0+c2V0UHJvcGVydHlGb3JLZXk8YXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9fc3RyZWFtX3R5cGVfdD4oc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlKSkgewotICAgICAgICBtUG9saWN5RW5naW5lLT5tQXBtT2JzZXJ2ZXItPmdldFZvbHVtZUN1cnZlcygpLnN3aXRjaFZvbHVtZUN1cnZlKHByb2ZpbGUsIHN0cmVhbSk7CisgICAgaWYgKHNldFByb3BlcnR5Rm9yS2V5PGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3N0cmVhbV90eXBlX3Q+KHN0cmVhbSwgcHJvZmlsZSkpIHsKKyAgICAgICAgc3dpdGNoVm9sdW1lQ3VydmUocHJvZmlsZSwgc3RyZWFtKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKIH0KIAotCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvcGVydHksIHR5cGVuYW1lIEtleT4KIGJvb2wgRW5naW5lOjpzZXRQcm9wZXJ0eUZvcktleShjb25zdCBQcm9wZXJ0eSAmcHJvcGVydHksIGNvbnN0IEtleSAma2V5KQogewpAQCAtMjAwLDcgKzEzMiwxMSBAQAogCiBzdGF0dXNfdCBFbmdpbmU6OnNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IG1vZGUpCiB7Ci0gICAgcmV0dXJuIG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPnNldFBob25lU3RhdGUobW9kZSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBvbGljeVBhcmFtZXRlck1nci0+c2V0UGhvbmVTdGF0ZShtb2RlKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBFbmdpbmVCYXNlOjpzZXRQaG9uZVN0YXRlKG1vZGUpOwogfQogCiBhdWRpb19tb2RlX3QgRW5naW5lOjpnZXRQaG9uZVN0YXRlKCkgY29uc3QKQEAgLTIxMSw3ICsxNDcsMTEgQEAKIHN0YXR1c190IEVuZ2luZTo6c2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykKIHsKLSAgICByZXR1cm4gbVBvbGljeVBhcmFtZXRlck1nci0+c2V0Rm9yY2VVc2UodXNhZ2UsIGNvbmZpZyk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBvbGljeVBhcmFtZXRlck1nci0+c2V0Rm9yY2VVc2UodXNhZ2UsIGNvbmZpZyk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gRW5naW5lQmFzZTo6c2V0Rm9yY2VVc2UodXNhZ2UsIGNvbmZpZyk7CiB9CiAKIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgRW5naW5lOjpnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpIGNvbnN0CkBAIC0yMjAsMjggKzE2MCwyMTYgQEAKIH0KIAogc3RhdHVzX3QgRW5naW5lOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCAvKnN0YXRlKi8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpCiB7CisgICAgbVBvbGljeVBhcmFtZXRlck1nci0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldkRlc2MsIHN0YXRlKTsKKwogICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldkRlc2MtPnR5cGUoKSkpIHsKICAgICAgICAgcmV0dXJuIG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPnNldEF2YWlsYWJsZU91dHB1dERldmljZXMoCi0gICAgICAgICAgICAgICAgICAgIG1BcG1PYnNlcnZlci0+Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpLnR5cGVzKCkpOworICAgICAgICAgICAgICAgICAgICBnZXRBcG1PYnNlcnZlcigpLT5nZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCkudHlwZXMoKSk7CiAgICAgfSBlbHNlIGlmIChhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2RGVzYy0+dHlwZSgpKSkgewogICAgICAgICByZXR1cm4gbVBvbGljeVBhcmFtZXRlck1nci0+c2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKAotICAgICAgICAgICAgICAgICAgICBtQXBtT2JzZXJ2ZXItPmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpLnR5cGVzKCkpOworICAgICAgICAgICAgICAgICAgICBnZXRBcG1PYnNlcnZlcigpLT5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKS50eXBlcygpKTsKICAgICB9CiAgICAgcmV0dXJuIEJBRF9UWVBFOwogfQogCitzdGF0dXNfdCBFbmdpbmU6OmxvYWRBdWRpb1BvbGljeUVuZ2luZUNvbmZpZygpCit7CisgICAgYXV0byByZXN1bHQgPSBFbmdpbmVCYXNlOjpsb2FkQXVkaW9Qb2xpY3lFbmdpbmVDb25maWcoKTsKKworICAgIC8vIEN1c3RvbSBYTUwgUGFyc2luZworICAgIGF1dG8gbG9hZENyaXRlcmlhPSBbdGhpc10oY29uc3QgYXV0byYgY29uZmlnQ3JpdGVyaWEsIGNvbnN0IGF1dG8mIGNvbmZpZ0NyaXRlcmlvblR5cGVzKSB7CisgICAgICAgIGZvciAoYXV0byYgY3JpdGVyaW9uIDogY29uZmlnQ3JpdGVyaWEpIHsKKyAgICAgICAgICAgIGVuZ2luZUNvbmZpZzo6Q3JpdGVyaW9uVHlwZSBjcml0ZXJpb25UeXBlOworICAgICAgICAgICAgZm9yIChhdXRvICZjb25maWdDcml0ZXJpb25UeXBlIDogY29uZmlnQ3JpdGVyaW9uVHlwZXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoY29uZmlnQ3JpdGVyaW9uVHlwZS5uYW1lID09IGNyaXRlcmlvbi50eXBlTmFtZSkgeworICAgICAgICAgICAgICAgICAgICBjcml0ZXJpb25UeXBlID0gY29uZmlnQ3JpdGVyaW9uVHlwZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR19BU1NFUlQobm90IGNyaXRlcmlvblR5cGUubmFtZS5lbXB0eSgpLCAiSW52YWxpZCBjcml0ZXJpb24gdHlwZSBmb3IgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgY3JpdGVyaW9uLm5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBtUG9saWN5UGFyYW1ldGVyTWdyLT5hZGRDcml0ZXJpb24oY3JpdGVyaW9uLm5hbWUsIGNyaXRlcmlvblR5cGUuaXNJbmNsdXNpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JpdGVyaW9uVHlwZS52YWx1ZVBhaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlvbi5kZWZhdWx0TGl0ZXJhbFZhbHVlKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICBsb2FkQ3JpdGVyaWEocmVzdWx0LnBhcnNlZENvbmZpZy0+Y3JpdGVyaWEsIHJlc3VsdC5wYXJzZWRDb25maWctPmNyaXRlcmlvblR5cGVzKTsKKyAgICByZXR1cm4gcmVzdWx0Lm5iU2tpcHBlZEVsZW1lbnQgPT0gMD8gTk9fRVJST1IgOiBCQURfVkFMVUU7Cit9CisKK0RldmljZVZlY3RvciBFbmdpbmU6OmdldERldmljZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHBzKSBjb25zdAoreworICAgIGNvbnN0IGF1dG8gcHJvZHVjdFN0cmF0ZWdpZXMgPSBnZXRQcm9kdWN0U3RyYXRlZ2llcygpOworICAgIGlmIChwcm9kdWN0U3RyYXRlZ2llcy5maW5kKHBzKSA9PSBwcm9kdWN0U3RyYXRlZ2llcy5lbmQoKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyeWluZyB0byBnZXQgZGV2aWNlIG9uIGludmFsaWQgc3RyYXRlZ3kgJWQiLCBfX0ZVTkNUSU9OX18sIHBzKTsKKyAgICAgICAgcmV0dXJuIHt9OworICAgIH0KKyAgICBjb25zdCBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyA9IGdldEFwbU9ic2VydmVyKCktPmdldEF2YWlsYWJsZU91dHB1dERldmljZXMoKTsKKyAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cyA9IGdldEFwbU9ic2VydmVyKCktPmdldE91dHB1dHMoKTsKKyAgICB1aW50MzJfdCBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKTsKKworICAgIC8qKiBUaGlzIGlzIHRoZSBvbmx5IGNhc2UgaGFuZGxlZCBwcm9ncmFtbWF0aWNhbGx5IGJlY2F1c2UgdGhlIFBGVyBpcyB1bmFibGUgdG8ga25vdyB0aGUKKyAgICAgKiBhY3Rpdml0eSBvZiBzdHJlYW1zLgorICAgICAqCisgICAgICogLVdoaWxlIG1lZGlhIGlzIHBsYXlpbmcgb24gYSByZW1vdGUgZGV2aWNlLCB1c2UgdGhlIHRoZSBzb25pZmljYXRpb24gYmVoYXZpb3IuCisgICAgICogTm90ZSB0aGF0IHdlIHRlc3QgdGhpcyB1c2VjYXNlIGJlZm9yZSB0ZXN0aW5nIGlmIG1lZGlhIGlzIHBsYXlpbmcgYmVjYXVzZQorICAgICAqIHRoZSBpc1N0cmVhbUFjdGl2ZSgpIG1ldGhvZCBvbmx5IGluZm9ybXMgYWJvdXQgdGhlIGFjdGl2aXR5IG9mIGEgc3RyZWFtLCBub3QKKyAgICAgKiBpZiBpdCdzIGZvciBsb2NhbCBwbGF5YmFjay4gTm90ZSBhbHNvIHRoYXQgd2UgdXNlIHRoZSBzYW1lIGRlbGF5IGJldHdlZW4gYm90aCB0ZXN0cworICAgICAqCisgICAgICogLVdoZW4gbWVkaWEgaXMgbm90IHBsYXlpbmcgYW55bW9yZSwgZmFsbCBiYWNrIG9uIHRoZSBzb25pZmljYXRpb24gYmVoYXZpb3IKKyAgICAgKi8KKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IEFVRElPX0RFVklDRV9OT05FOworICAgIGlmIChwcyA9PSBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JTdHJlYW0oQVVESU9fU1RSRUFNX05PVElGSUNBVElPTikgJiYKKyAgICAgICAgICAgICFpc19zdGF0ZV9pbl9jYWxsKGdldFBob25lU3RhdGUoKSkgJiYKKyAgICAgICAgICAgICFvdXRwdXRzLmlzQWN0aXZlUmVtb3RlbHkodG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX01VU0lDKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkpICYmCisgICAgICAgICAgICBvdXRwdXRzLmlzQWN0aXZlKHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9NVVNJQyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKSkgeworICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3lGb3JNZWRpYSA9CisgICAgICAgICAgICAgICAgZ2V0UHJvZHVjdFN0cmF0ZWd5Rm9yU3RyZWFtKEFVRElPX1NUUkVBTV9NVVNJQyk7CisgICAgICAgIGRldmljZXMgPSBwcm9kdWN0U3RyYXRlZ2llcy5nZXREZXZpY2VUeXBlc0ZvclByb2R1Y3RTdHJhdGVneShzdHJhdGVneUZvck1lZGlhKTsKKyAgICB9IGVsc2UgaWYgKHBzID09IGdldFByb2R1Y3RTdHJhdGVneUZvclN0cmVhbShBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSkgJiYKKyAgICAgICAgKG91dHB1dHMuaXNBY3RpdmUodG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1JJTkcpKSB8fAorICAgICAgICAgb3V0cHV0cy5pc0FjdGl2ZSh0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fQUxBUk0pKSkpIHsKKyAgICAgICAgICAgIC8vIGRvIG5vdCByb3V0ZSBhY2Nlc3NpYmlsaXR5IHByb21wdHMgdG8gYSBkaWdpdGFsIG91dHB1dCBjdXJyZW50bHkgY29uZmlndXJlZCB3aXRoIGEKKyAgICAgICAgICAgIC8vIGNvbXByZXNzZWQgZm9ybWF0IGFzIHRoZXkgd291bGQgbGlrZWx5IG5vdCBiZSBtaXhlZCBhbmQgZHJvcHBlZC4KKyAgICAgICAgICAgIC8vIERldmljZSBGb3IgU29uaWZpY2F0aW9uIGNvbmYgZmlsZSBoYXMgSERNSSwgU1BESUYgYW5kIEhETUkgQVJDIHVucmVhY2hlYWJsZS4KKyAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5Tm90aWZpY2F0aW9uID0gZ2V0UHJvZHVjdFN0cmF0ZWd5Rm9yU3RyZWFtKEFVRElPX1NUUkVBTV9SSU5HKTsKKyAgICAgICAgZGV2aWNlcyA9IHByb2R1Y3RTdHJhdGVnaWVzLmdldERldmljZVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHN0cmF0ZWd5Tm90aWZpY2F0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXZpY2VzID0gcHJvZHVjdFN0cmF0ZWdpZXMuZ2V0RGV2aWNlVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHMpOworICAgIH0KKyAgICBpZiAoZGV2aWNlcyA9PSBBVURJT19ERVZJQ0VfTk9ORSB8fAorICAgICAgICAgICAgKGRldmljZXMgJiBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSkgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgZGV2aWNlcyA9IGdldEFwbU9ic2VydmVyKCktPmdldERlZmF1bHRPdXRwdXREZXZpY2UoKS0+dHlwZSgpOworICAgICAgICBBTE9HRV9JRihkZXZpY2VzID09IEFVRElPX0RFVklDRV9OT05FLCAiJXM6IG5vIHZhbGlkIGRlZmF1bHQgZGV2aWNlIGRlZmluZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKGdldEFwbU9ic2VydmVyKCktPmdldERlZmF1bHRPdXRwdXREZXZpY2UoKSk7CisgICAgfQorICAgIGlmICgvKmRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlcykqLyBkZXZpY2VzID09IEFVRElPX0RFVklDRV9PVVRfQlVTKSB7CisgICAgICAgIC8vIFdlIGRvIGV4cGVjdCBvbmx5IG9uZSBkZXZpY2UgZm9yIHRoZXNlIHR5cGVzIG9mIGRldmljZXMKKyAgICAgICAgLy8gQ3JpdGVyaW9uIGRldmljZSBhZGRyZXNzIGdhcmFudGVlIHRoaXMgb25lIGlzIGF2YWlsYWJsZQorICAgICAgICAvLyBJZiB0aGlzIGNyaXRlcmlvbiBpcyBub3Qgd2lzaGVkLCBuZWVkIHRvIGVuc3VyZSB0aGlzIGRldmljZSBpcyBhdmFpbGFibGUKKyAgICAgICAgY29uc3QgU3RyaW5nOCBhZGRyZXNzKHByb2R1Y3RTdHJhdGVnaWVzLmdldERldmljZUFkZHJlc3NGb3JQcm9kdWN0U3RyYXRlZ3kocHMpLmNfc3RyKCkpOworICAgICAgICBBTE9HVigiJXM6ZGV2aWNlIDB4JXggJXMgJWQiLCBfX0ZVTkNUSU9OX18sIGRldmljZXMsIGFkZHJlc3MuY19zdHIoKSwgcHMpOworICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlKGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCkpOworICAgIH0KKyAgICBBTE9HVigiJXM6ZGV2aWNlIDB4JXggJWQiLCBfX0ZVTkNUSU9OX18sIGRldmljZXMsIHBzKTsKKyAgICByZXR1cm4gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKGRldmljZXMpOworfQorCitEZXZpY2VWZWN0b3IgRW5naW5lOjpnZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmcHJlZmVycmVkRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUpIGNvbnN0Cit7CisgICAgLy8gRmlyc3QgY2hlY2sgZm9yIGV4cGxpY3Qgcm91dGluZyBkZXZpY2UKKyAgICBpZiAocHJlZmVycmVkRGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1YoIiVzIGV4cGxpY2l0IFJvdXRpbmcgb24gZGV2aWNlICVzIiwgX19mdW5jX18sIHByZWZlcnJlZERldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIERldmljZVZlY3RvcihwcmVmZXJyZWREZXZpY2UpOworICAgIH0KKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kgPSBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOworICAgIGNvbnN0IERldmljZVZlY3RvciBhdmFpbGFibGVPdXRwdXREZXZpY2VzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpOworICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0T3V0cHV0cygpOworICAgIC8vCisgICAgLy8gQFRPRE86IHdoYXQgaXMgdGhlIHByaW9yaXR5IG9mIGV4cGxpY2l0IHJvdXRpbmc/IFNoYWxsIGl0IGJlIGNvbnNpZGVyZWQgZmlyc3QgYXMgaXQgdXNlZCB0bworICAgIC8vIGJlIGJ5IEFQTT8KKyAgICAvLworICAgIC8vIEhvbm9yIGV4cGxpY2l0IHJvdXRpbmcgcmVxdWVzdHMgb25seSBpZiBhbGwgYWN0aXZlIGNsaWVudHMgaGF2ZSBhIHByZWZlcnJlZCByb3V0ZSBpbiB3aGljaAorICAgIC8vIGNhc2UgdGhlIGxhc3QgYWN0aXZlIGNsaWVudCByb3V0ZSBpcyB1c2VkCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gZmluZFByZWZlcnJlZERldmljZShvdXRwdXRzLCBzdHJhdGVneSwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7CisgICAgaWYgKGRldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBEZXZpY2VWZWN0b3IoZGV2aWNlKTsKKyAgICB9CisKKyAgICByZXR1cm4gZnJvbUNhY2hlPyBtRGV2aWNlc0ZvclN0cmF0ZWdpZXMuYXQoc3RyYXRlZ3kpIDogZ2V0RGV2aWNlc0ZvclByb2R1Y3RTdHJhdGVneShzdHJhdGVneSk7Cit9CisKK0RldmljZVZlY3RvciBFbmdpbmU6OmdldE91dHB1dERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wgZnJvbUNhY2hlKSBjb25zdAoreworICAgIGF1dG8gYXR0cmlidXRlcyA9IEVuZ2luZUJhc2U6OmdldEF0dHJpYnV0ZXNGb3JTdHJlYW1UeXBlKHN0cmVhbSk7CisgICAgcmV0dXJuIGdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIG51bGxwdHIsIGZyb21DYWNoZSk7Cit9CisKK3NwPERldmljZURlc2NyaXB0b3I+IEVuZ2luZTo6Z2V0SW5wdXREZXZpY2VGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiAqbWl4KSBjb25zdAoreworICAgIGNvbnN0IGF1dG8gJnBvbGljeU1peGVzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uKCk7CisgICAgY29uc3QgYXV0byBhdmFpbGFibGVJbnB1dERldmljZXMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKTsKKyAgICBjb25zdCBhdXRvICZpbnB1dHMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRJbnB1dHMoKTsKKyAgICBzdGQ6OnN0cmluZyBhZGRyZXNzOworICAgIC8vCisgICAgLy8gRXhwbGljaXQgUm91dGluZyA/Pz8gd2hhdCBpcyB0aGUgcHJpb3JpdHkgb2YgZXhwbGljaXQgcm91dGluZz8gU2hhbGwgaXQgYmUgY29uc2lkZXJlZAorICAgIC8vIGZpcnN0IGFzIGl0IHVzZWQgdG8gYmUgYnkgQVBNPworICAgIC8vCisgICAgLy8gSG9ub3IgZXhwbGljaXQgcm91dGluZyByZXF1ZXN0cyBvbmx5IGlmIGFsbCBhY3RpdmUgY2xpZW50cyBoYXZlIGEgcHJlZmVycmVkIHJvdXRlIGluIHdoaWNoCisgICAgLy8gY2FzZSB0aGUgbGFzdCBhY3RpdmUgY2xpZW50IHJvdXRlIGlzIHVzZWQKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPQorICAgICAgICAgICAgZmluZFByZWZlcnJlZERldmljZShpbnB1dHMsIGF0dHIuc291cmNlLCBhdmFpbGFibGVJbnB1dERldmljZXMpOworICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZGV2aWNlOworICAgIH0KKworICAgIGRldmljZSA9IHBvbGljeU1peGVzLmdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGF0dHIuc291cmNlLCBhdmFpbGFibGVJbnB1dERldmljZXMsIG1peCk7CisgICAgaWYgKGRldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBkZXZpY2U7CisgICAgfQorCisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgPSBnZXRQcm9wZXJ0eUZvcktleTxhdWRpb19kZXZpY2VzX3QsIGF1ZGlvX3NvdXJjZV90PihhdHRyLnNvdXJjZSk7CisKKyAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UoZGV2aWNlVHlwZSkpIHsKKyAgICAgICAgYWRkcmVzcyA9ICIwIjsKKyAgICAgICAgc3RkOjpzaXplX3QgcG9zOworICAgICAgICBzdGQ6OnN0cmluZyB0YWdzIHsgYXR0ci50YWdzIH07CisgICAgICAgIGlmICgocG9zID0gdGFncy5maW5kKCJhZGRyPSIpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgYWRkcmVzcyA9IHRhZ3Muc3Vic3RyKHBvcyArIHN0ZDo6c3RybGVuKCJhZGRyPSIpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZShkZXZpY2VUeXBlLCBTdHJpbmc4KGFkZHJlc3MuY19zdHIoKSksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKK30KKwordm9pZCBFbmdpbmU6OnVwZGF0ZURldmljZVNlbGVjdGlvbkNhY2hlKCkKK3sKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiBnZXRQcm9kdWN0U3RyYXRlZ2llcygpKSB7CisgICAgICAgIGNvbnN0IGF1dG8gJnN0cmF0ZWd5ID0gaXRlci5zZWNvbmQ7CisgICAgICAgIG1EZXZpY2VzRm9yU3RyYXRlZ2llc1tzdHJhdGVneS0+Z2V0SWQoKV0gPSBnZXREZXZpY2VzRm9yUHJvZHVjdFN0cmF0ZWd5KHN0cmF0ZWd5LT5nZXRJZCgpKTsKKyAgICB9Cit9CisKK3ZvaWQgRW5naW5lOjpzZXREZXZpY2VBZGRyZXNzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzKQoreworICAgIGlmIChnZXRQcm9kdWN0U3RyYXRlZ2llcygpLmZpbmQoc3RyYXRlZ3kpID09IGdldFByb2R1Y3RTdHJhdGVnaWVzKCkuZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcnlpbmcgdG8gc2V0IGFkZHJlc3MgJXMgb24gaW52YWxpZCBzdHJhdGVneSAlZCIsIF9fRlVOQ1RJT05fXywgYWRkcmVzcy5jX3N0cigpLAorICAgICAgICAgICAgICBzdHJhdGVneSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZ2V0UHJvZHVjdFN0cmF0ZWdpZXMoKS5hdChzdHJhdGVneSktPnNldERldmljZUFkZHJlc3MoYWRkcmVzcyk7Cit9CisKK2Jvb2wgRW5naW5lOjpzZXREZXZpY2VUeXBlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKQoreworICAgIGlmIChnZXRQcm9kdWN0U3RyYXRlZ2llcygpLmZpbmQoc3RyYXRlZ3kpID09IGdldFByb2R1Y3RTdHJhdGVnaWVzKCkuZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBzZXQgZGV2aWNlICVkIG9uIGludmFsaWQgc3RyYXRlZ3kgJWQiLCBfX0ZVTkNUSU9OX18sIGRldmljZXMsIHN0cmF0ZWd5KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBnZXRQcm9kdWN0U3RyYXRlZ2llcygpLmF0KHN0cmF0ZWd5KS0+c2V0RGV2aWNlVHlwZXMoZGV2aWNlcyk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKIHRlbXBsYXRlIDw+CiBBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UgKkVuZ2luZTo6cXVlcnlJbnRlcmZhY2UoKQogewotICAgIHJldHVybiAmbU1hbmFnZXJJbnRlcmZhY2U7CisgICAgcmV0dXJuIHRoaXM7CiB9CiAKIHRlbXBsYXRlIDw+CiBBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZSAqRW5naW5lOjpxdWVyeUludGVyZmFjZSgpCiB7Ci0gICAgcmV0dXJuICZtUGx1Z2luSW50ZXJmYWNlOworICAgIHJldHVybiB0aGlzOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5oCmluZGV4IDMyOGQyM2QuLjQ2NjJlN2UgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuaApAQCAtMTYsMjIgKzE2LDIwIEBACiAKICNwcmFnbWEgb25jZQogCi0KKyNpbmNsdWRlICJFbmdpbmVCYXNlLmgiCiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaD4KICNpbmNsdWRlICJDb2xsZWN0aW9uLmgiCiAKLW5hbWVzcGFjZSBhbmRyb2lkCi17CituYW1lc3BhY2UgYW5kcm9pZCB7CiBjbGFzcyBBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlcjsKIAotbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoteworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeSB7CiAKIGNsYXNzIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOwogY2xhc3MgVm9sdW1lUHJvZmlsZTsKIAotY2xhc3MgRW5naW5lCitjbGFzcyBFbmdpbmUgOiBwdWJsaWMgRW5naW5lQmFzZSwgQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UKIHsKIHB1YmxpYzoKICAgICBFbmdpbmUoKTsKQEAgLTQwLDEzMiArMzgsNjkgQEAKICAgICB0ZW1wbGF0ZSA8Y2xhc3MgUmVxdWVzdGVkSW50ZXJmYWNlPgogICAgIFJlcXVlc3RlZEludGVyZmFjZSAqcXVlcnlJbnRlcmZhY2UoKTsKIAotcHJpdmF0ZToKLSAgICAvLy8gSW50ZXJmYWNlIG1lbWJlcnMKLSAgICBjbGFzcyBNYW5hZ2VySW50ZXJmYWNlSW1wbCA6IHB1YmxpYyBBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UKKyAgICAvLy8KKyAgICAvLy8gZnJvbSBFbmdpbmVCYXNlCisgICAgLy8vCisgICAgYW5kcm9pZDo6c3RhdHVzX3QgaW5pdENoZWNrKCkgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBtb2RlKSBvdmVycmlkZTsKKworICAgIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKSBvdmVycmlkZTsKKworICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKSBjb25zdCBvdmVycmlkZTsKKworICAgIGFuZHJvaWQ6OnN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpIG92ZXJyaWRlOworCisgICAgRGV2aWNlVmVjdG9yIGdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJnByZWZlcmVkRGV2aWNlID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUgPSBmYWxzZSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBEZXZpY2VWZWN0b3IgZ2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSA9IGZhbHNlKSBjb25zdCBvdmVycmlkZTsKKworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldElucHV0RGV2aWNlRm9yQXR0cmlidXRlcygKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgc3A8QXVkaW9Qb2xpY3lNaXg+ICptaXggPSBudWxscHRyKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZvaWQgdXBkYXRlRGV2aWNlU2VsZWN0aW9uQ2FjaGUoKSBvdmVycmlkZTsKKworICAgIC8vLworICAgIC8vLyBmcm9tIEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlCisgICAgLy8vCisgICAgc3RhdHVzX3QgYWRkU3RyZWFtKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgb3ZlcnJpZGUKICAgICB7Ci0gICAgcHVibGljOgotICAgICAgICBNYW5hZ2VySW50ZXJmYWNlSW1wbChFbmdpbmUgKnBvbGljeUVuZ2luZSkKLSAgICAgICAgICAgIDogbVBvbGljeUVuZ2luZShwb2xpY3lFbmdpbmUpIHt9Ci0KLSAgICAgICAgdmlydHVhbCBhbmRyb2lkOjpzdGF0dXNfdCBpbml0Q2hlY2soKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+aW5pdENoZWNrKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCB2b2lkIHNldE9ic2VydmVyKEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICpvYnNlcnZlcikKLSAgICAgICAgewotICAgICAgICAgICAgbVBvbGljeUVuZ2luZS0+c2V0T2JzZXJ2ZXIob2JzZXJ2ZXIpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0UHJvcGVydHlGb3JLZXk8YXVkaW9fZGV2aWNlc190LCBhdWRpb19zb3VyY2VfdD4oaW5wdXRTb3VyY2UpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RhdGVneSkgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldFByb3BlcnR5Rm9yS2V5PHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3N0cmVhbV90eXBlX3Q+KHN0cmVhbSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCByb3V0aW5nX3N0cmF0ZWd5IGdldFN0cmF0ZWd5Rm9yVXNhZ2UoYXVkaW9fdXNhZ2VfdCB1c2FnZSk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3QgbW9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPnNldFBob25lU3RhdGUobW9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBhdWRpb19tb2RlX3QgZ2V0UGhvbmVTdGF0ZSgpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRQaG9uZVN0YXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5zZXRGb3JjZVVzZSh1c2FnZSwgY29uZmlnKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0Rm9yY2VVc2UodXNhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgYW5kcm9pZDo6c3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZEZXNjLCBzdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIEVuZ2luZSAqbVBvbGljeUVuZ2luZTsKLSAgICB9IG1NYW5hZ2VySW50ZXJmYWNlOwotCi0gICAgY2xhc3MgUGx1Z2luSW50ZXJmYWNlSW1wbCA6IHB1YmxpYyBBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZQorICAgICAgICByZXR1cm4gYWRkPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KG5hbWUsIHN0cmVhbSk7CisgICAgfQorICAgIHN0YXR1c190IGFkZElucHV0U291cmNlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBhdWRpb19zb3VyY2VfdCBzb3VyY2UpIG92ZXJyaWRlCiAgICAgewotICAgIHB1YmxpYzoKLSAgICAgICAgUGx1Z2luSW50ZXJmYWNlSW1wbChFbmdpbmUgKnBvbGljeUVuZ2luZSkKLSAgICAgICAgICAgIDogbVBvbGljeUVuZ2luZShwb2xpY3lFbmdpbmUpIHt9CisgICAgICAgIHJldHVybiBhZGQ8YXVkaW9fc291cmNlX3Q+KG5hbWUsIHNvdXJjZSk7CisgICAgfQorICAgIGJvb2wgc2V0Vm9sdW1lUHJvZmlsZUZvclN0cmVhbShjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnZvbHVtZVByb2ZpbGUpIG92ZXJyaWRlOwogCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU3RyYXRlZ3koY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5hZGQ8cm91dGluZ19zdHJhdGVneT4obmFtZSwgc3RyYXRlZ3kpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU3RyZWFtKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmFkZDxhdWRpb19zdHJlYW1fdHlwZV90PihuYW1lLCBzdHJlYW0pOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkVXNhZ2UoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGF1ZGlvX3VzYWdlX3QgdXNhZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5hZGQ8YXVkaW9fdXNhZ2VfdD4obmFtZSwgdXNhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkSW5wdXRTb3VyY2UoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmFkZDxhdWRpb19zb3VyY2VfdD4obmFtZSwgc291cmNlKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGJvb2wgc2V0RGV2aWNlRm9yU3RyYXRlZ3koY29uc3Qgcm91dGluZ19zdHJhdGVneSAmc3RyYXRlZ3ksIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+c2V0UHJvcGVydHlGb3JLZXk8YXVkaW9fZGV2aWNlc190LCByb3V0aW5nX3N0cmF0ZWd5PihkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyYXRlZ3kpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgYm9vbCBzZXRTdHJhdGVneUZvclN0cmVhbShjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+c2V0UHJvcGVydHlGb3JLZXk8cm91dGluZ19zdHJhdGVneSwgYXVkaW9fc3RyZWFtX3R5cGVfdD4oc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGJvb2wgc2V0Vm9sdW1lUHJvZmlsZUZvclN0cmVhbShjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnZvbHVtZVByb2ZpbGUpOworICAgIGJvb2wgc2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoY29uc3QgYXVkaW9fc291cmNlX3QgJmlucHV0U291cmNlLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBvdmVycmlkZQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNldFByb3BlcnR5Rm9yS2V5PGF1ZGlvX2RldmljZXNfdCwgYXVkaW9fc291cmNlX3Q+KGRldmljZSwgaW5wdXRTb3VyY2UpOworICAgIH0KKyAgICB2b2lkIHNldERldmljZUFkZHJlc3NGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzKSBvdmVycmlkZTsKIAotICAgICAgICB2aXJ0dWFsIGJvb2wgc2V0U3RyYXRlZ3lGb3JVc2FnZShjb25zdCBhdWRpb191c2FnZV90ICZ1c2FnZSwgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPnNldFByb3BlcnR5Rm9yS2V5PHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3VzYWdlX3Q+KHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGJvb2wgc2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoY29uc3QgYXVkaW9fc291cmNlX3QgJmlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPnNldFByb3BlcnR5Rm9yS2V5PGF1ZGlvX2RldmljZXNfdCwgYXVkaW9fc291cmNlX3Q+KGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFNvdXJjZSk7Ci0gICAgICAgIH0KKyAgICBib29sIHNldERldmljZVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMpIG92ZXJyaWRlOwogCi0gICAgcHJpdmF0ZToKLSAgICAgICAgRW5naW5lICptUG9saWN5RW5naW5lOwotICAgIH0gbVBsdWdpbkludGVyZmFjZTsKKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgZ2V0UHJvZHVjdFN0cmF0ZWd5QnlOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSBvdmVycmlkZQorICAgIHsKKyAgICAgICAgcmV0dXJuIEVuZ2luZUJhc2U6OmdldFByb2R1Y3RTdHJhdGVneUJ5TmFtZShuYW1lKTsKKyAgICB9CiAKIHByaXZhdGU6CiAgICAgLyogQ29weSBmYWNpbGl0aWVzIGFyZSBwdXQgcHJpdmF0ZSB0byBkaXNhYmxlIGNvcHkuICovCiAgICAgRW5naW5lKGNvbnN0IEVuZ2luZSAmb2JqZWN0KTsKICAgICBFbmdpbmUgJm9wZXJhdG9yPShjb25zdCBFbmdpbmUgJm9iamVjdCk7CiAKLSAgICB2b2lkIHNldE9ic2VydmVyKEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICpvYnNlcnZlcik7Ci0KLSAgICBib29sIHNldFZvbHVtZVByb2ZpbGVGb3JTdHJlYW0oY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnRzICZwb2ludHMpOwotCi0gICAgc3RhdHVzX3QgaW5pdENoZWNrKCk7Ci0gICAgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3QgbW9kZSk7Ci0gICAgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKSBjb25zdDsKLSAgICBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKTsKLSAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkgY29uc3Q7Ci0gICAgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSk7Ci0gICAgU3RyYXRlZ3lDb2xsZWN0aW9uIG1TdHJhdGVneUNvbGxlY3Rpb247IC8qKjwgU3RyYXRlZ2llcyBpbmRleGVkIGJ5IHRoZWlyIGVudW0gaWQuICovCiAgICAgU3RyZWFtQ29sbGVjdGlvbiBtU3RyZWFtQ29sbGVjdGlvbjsgLyoqPCBTdHJlYW1zIGluZGV4ZWQgYnkgdGhlaXIgZW51bSBpZC4gICovCi0gICAgVXNhZ2VDb2xsZWN0aW9uIG1Vc2FnZUNvbGxlY3Rpb247IC8qKjwgVXNhZ2VzIGluZGV4ZWQgYnkgdGhlaXIgZW51bSBpZC4gKi8KICAgICBJbnB1dFNvdXJjZUNvbGxlY3Rpb24gbUlucHV0U291cmNlQ29sbGVjdGlvbjsgLyoqPCBJbnB1dCBzb3VyY2VzIGluZGV4ZWQgYnkgdGhlaXIgZW51bSBpZC4gKi8KIAogICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBLZXk+CkBAIC0xODYsMTIgKzEyMSwxNiBAQAogICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9wZXJ0eSwgdHlwZW5hbWUgS2V5PgogICAgIGJvb2wgc2V0UHJvcGVydHlGb3JLZXkoY29uc3QgUHJvcGVydHkgJnByb3BlcnR5LCBjb25zdCBLZXkgJmtleSk7CiAKKyAgICBzdGF0dXNfdCBsb2FkQXVkaW9Qb2xpY3lFbmdpbmVDb25maWcoKTsKKworICAgIERldmljZVZlY3RvciBnZXREZXZpY2VzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSkgY29uc3Q7CisKICAgICAvKioKICAgICAgKiBQb2xpY3kgUGFyYW1ldGVyIE1hbmFnZXIgaGlkZGVuIHRocm91Z2ggYSB3cmFwcGVyLgogICAgICAqLwogICAgIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyICptUG9saWN5UGFyYW1ldGVyTWdyOwogCi0gICAgQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm1BcG1PYnNlcnZlcjsKKyAgICBEZXZpY2VTdHJhdGVneU1hcCBtRGV2aWNlc0ZvclN0cmF0ZWdpZXM7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lSW5zdGFuY2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmVJbnN0YW5jZS5jcHAKaW5kZXggOWFhODliMi4uMjQ0MjU5MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmVJbnN0YW5jZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmVJbnN0YW5jZS5jcHAKQEAgLTIxLDEwICsyMSw4IEBACiAKIHVzaW5nIHN0ZDo6c3RyaW5nOwogCi1uYW1lc3BhY2UgYW5kcm9pZAotewotbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoteworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeSB7CiAKIEVuZ2luZUluc3RhbmNlOjpFbmdpbmVJbnN0YW5jZSgpCiB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvSW5wdXRTb3VyY2UuY3BwCmluZGV4IGFlMzlmZWYuLmQyNTJkM2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvSW5wdXRTb3VyY2UuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvSW5wdXRTb3VyY2UuY3BwCkBAIC0yMCwxMyArMjAsMTMgQEAKIAogdXNpbmcgc3RkOjpzdHJpbmc7CiAKLW5hbWVzcGFjZSBhbmRyb2lkCi17Ci1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5IHsKKwogc3RhdHVzX3QgRWxlbWVudDxhdWRpb19zb3VyY2VfdD46OnNldElkZW50aWZpZXIoYXVkaW9fc291cmNlX3QgaWRlbnRpZmllcikKIHsKLSAgICBpZiAoaWRlbnRpZmllciA+IEFVRElPX1NPVVJDRV9NQVggJiYgaWRlbnRpZmllciAhPSBBVURJT19TT1VSQ0VfSE9UV09SRCkgeworICAgIGlmIChpZGVudGlmaWVyID4gQVVESU9fU09VUkNFX01BWCAmJiBpZGVudGlmaWVyICE9IEFVRElPX1NPVVJDRV9IT1RXT1JECisgICAgICAgICYmIGlkZW50aWZpZXIgIT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSICYmIGlkZW50aWZpZXIgIT0gQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIG1JZGVudGlmaWVyID0gaWRlbnRpZmllcjsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvSW5wdXRTb3VyY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvSW5wdXRTb3VyY2UuaAppbmRleCA2YzQ5OGRjLi5lMTg2NWNjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9JbnB1dFNvdXJjZS5oCkBAIC0xOCwxMCArMTgsOCBAQAogCiAjaW5jbHVkZSAiRWxlbWVudC5oIgogCi1uYW1lc3BhY2UgYW5kcm9pZAotewotbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoteworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeSB7CiAKIC8qKgogICogU3BlY2lhbGl6YXRpb24gb2YgcG9saWN5IGJhc2UgY2xhc3MgZWxlbWVudCBmb3IgYXVkaW9fc291cmNlX3QKQEAgLTYxLDcgKzU5LDcgQEAKIAogICAgIC8qKgogICAgICAqIEEgUG9saWN5IGVsZW1lbnQgbWF5IGltcGxlbWVudCBnZXR0ZXIvc2V0dGVyIGZ1bmN0aW9uIGZvciBhIGdpdmVuIHByb3BlcnR5LgotICAgICAqIFByb3BlcnR5IG1heSBiZSByb3V0aW5nX3N0cmF0ZWd5LCBhdWRpb19zdHJlYW1fdHlwZV90LCBhdWRpb191c2FnZV90LCBhdWRpb19zb3VyY2VfdAorICAgICAqIFByb3BlcnR5IG1heSBiZSBhdWRpb19zdHJlYW1fdHlwZV90LCBhdWRpb191c2FnZV90LCBhdWRpb19zb3VyY2VfdAogICAgICAqIG9yIGEgc3RyaW5nLgogICAgICAqLwogICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9wZXJ0eT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyYXRlZ3kuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJhdGVneS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1Mzk5MTQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJhdGVneS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvUG9saWN5RW5naW5lL1N0cmF0ZWd5IgotCi0jaW5jbHVkZSAiU3RyYXRlZ3kuaCIKLQotdXNpbmcgc3RkOjpzdHJpbmc7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkCi17Ci1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17Ci0KLXN0YXR1c190IEVsZW1lbnQ8cm91dGluZ19zdHJhdGVneT46OnNldElkZW50aWZpZXIocm91dGluZ19zdHJhdGVneSBpZGVudGlmaWVyKQotewotICAgIGlmIChpZGVudGlmaWVyID49IE5VTV9TVFJBVEVHSUVTKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIG1JZGVudGlmaWVyID0gaWRlbnRpZmllcjsKLSAgICBBTE9HRCgiJXM6IFN0cmF0ZWd5ICVzIGlkZW50aWZpZXIgMHglWCIsIF9fRlVOQ1RJT05fXywgZ2V0TmFtZSgpLmNfc3RyKCksIGlkZW50aWZpZXIpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLyoqCi0gKiBTZXQgdGhlIGRldmljZSBhc3NvY2lhdGVkIHRvIHRoaXMgc3RyYXRlZ3kuCi0gKiBJdCBjaGVja3MgaWYgdGhlIG91dHB1dCBkZXZpY2UgaXMgdmFsaWQuCi0gKgotICogQHBhcmFtW2luXSBkZXZpY2VzIHNlbGVjdGVkIGZvciB0aGUgZ2l2ZW4gc3RyYXRlZ3kuCi0gKgotICogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgZGV2aWNlIGlzIGVpdGhlciB2YWxpZCBvciBub25lLCBlcnJvciBjb2RlIG90aGVyd2lzZS4KLSAqLwotdGVtcGxhdGUgPD4KLXN0YXR1c190IEVsZW1lbnQ8cm91dGluZ19zdHJhdGVneT46OnNldDxhdWRpb19kZXZpY2VzX3Q+KGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKQotewotICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZXMoZGV2aWNlcykgfHwgZGV2aWNlcyA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICBBTE9HRSgiJXM6IHRyeWluZyB0byBzZXQgYW4gaW52YWxpZCBkZXZpY2UgMHglWCBmb3Igc3RyYXRlZ3kgJXMiLAotICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZXMsIGdldE5hbWUoKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgQUxPR0QoIiVzOiAweCVYIGZvciBzdHJhdGVneSAlcyIsIF9fRlVOQ1RJT05fXywgZGV2aWNlcywgZ2V0TmFtZSgpLmNfc3RyKCkpOwotICAgIG1BcHBsaWNhYmxlRGV2aWNlcyA9IGRldmljZXM7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi10ZW1wbGF0ZSA8PgotYXVkaW9fZGV2aWNlc190IEVsZW1lbnQ8cm91dGluZ19zdHJhdGVneT46OmdldDxhdWRpb19kZXZpY2VzX3Q+KCkgY29uc3QKLXsKLSAgICBBTE9HVigiJXM6IDB4JVggZm9yIHN0cmF0ZWd5ICVzIiwgX19GVU5DVElPTl9fLCBtQXBwbGljYWJsZURldmljZXMsIGdldE5hbWUoKS5jX3N0cigpKTsKLSAgICByZXR1cm4gbUFwcGxpY2FibGVEZXZpY2VzOwotfQotCi19IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJhdGVneS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJhdGVneS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTU3ZDU1Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyYXRlZ3kuaAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIkVsZW1lbnQuaCIKLSNpbmNsdWRlIDxSb3V0aW5nU3RyYXRlZ3kuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQKLXsKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKLQotLyoqCi0gKiBAdHBhcmFtIGF1ZGlvX2RldmljZXNfdDogQXBwbGljYWJsZSBvdXRwdXQgZGV2aWNlKHMpIGZvciB0aGlzIHN0cmF0ZWd5LgotICovCi10ZW1wbGF0ZSA8PgotY2xhc3MgRWxlbWVudDxyb3V0aW5nX3N0cmF0ZWd5PgotewotcHVibGljOgotICAgIEVsZW1lbnQoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpCi0gICAgICAgIDogbU5hbWUobmFtZSksCi0gICAgICAgICAgbUFwcGxpY2FibGVEZXZpY2VzKEFVRElPX0RFVklDRV9OT05FKQotICAgIHt9Ci0gICAgfkVsZW1lbnQoKSB7fQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZGVudGlmaWVyIG9mIHRoaXMgcG9saWN5IGVsZW1lbnQKLSAgICAgKgotICAgICAqIEByZXR1cm5zIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgdGhpcyBwb2xpY3kgZWxlbWVudAotICAgICAqLwotICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KLQotICAgIC8qKgotICAgICogU2V0IHRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBwb2xpY3kgZWxlbWVudC4KLSAgICAqCi0gICAgKiBAdHBhcmFtIEtleSB0eXBlIG9mIHRoZSB1bmlxdWUgaWRlbnRpZmllci4KLSAgICAqIEBwYXJhbVtpbl0gaWRlbnRpZmllciB0byBiZSBzZXQuCi0gICAgKgotICAgICogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgaWRlbnRpZmllciBpcyB2YWxpZCBhbmQgc2V0IGNvcnJlY3RseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCi0gICAgKi8KLSAgICBzdGF0dXNfdCBzZXRJZGVudGlmaWVyKHJvdXRpbmdfc3RyYXRlZ3kgaWRlbnRpZmllcik7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGlzIHBvbGljeSBlbGVtZW50LgotICAgICAqLwotICAgIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0SWRlbnRpZmllcigpIGNvbnN0IHsgcmV0dXJuIG1JZGVudGlmaWVyOyB9Ci0KLSAgICAvKioKLSAgICAgKiBBIFBvbGljeSBlbGVtZW50IG1heSBpbXBsZW1lbnQgZ2V0dGVyL3NldHRlciBmdW5jdGlvbiBmb3IgYSBnaXZlbiBwcm9wZXJ0eS4KLSAgICAgKiBQcm9wZXJ0eSBtYXkgYmUgcm91dGluZ19zdHJhdGVneSwgYXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9fdXNhZ2VfdCwgYXVkaW9fc291cmNlX3QKLSAgICAgKiBvciBhIHN0cmluZy4KLSAgICAgKi8KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvcGVydHk+Ci0gICAgUHJvcGVydHkgZ2V0KCkgY29uc3Q7Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvcGVydHk+Ci0gICAgc3RhdHVzX3Qgc2V0KFByb3BlcnR5IHByb3BlcnR5KTsKLQotcHJpdmF0ZToKLSAgICAvKiBDb3B5IGZhY2lsaXRpZXMgYXJlIHB1dCBwcml2YXRlIHRvIGRpc2FibGUgY29weS4gKi8KLSAgICBFbGVtZW50KGNvbnN0IEVsZW1lbnQgJm9iamVjdCk7Ci0gICAgRWxlbWVudCAmb3BlcmF0b3I9KGNvbnN0IEVsZW1lbnQgJm9iamVjdCk7Ci0KLSAgICBzdGQ6OnN0cmluZyBtTmFtZTsgLyoqPCBVbmlxdWUgbGl0ZXJhbCBJZGVudGlmaWVyIG9mIGEgcG9saWN5IGJhc2UgZWxlbWVudCovCi0gICAgcm91dGluZ19zdHJhdGVneSBtSWRlbnRpZmllcjsgLyoqPCBVbmlxdWUgbnVtZXJpY2FsIElkZW50aWZpZXIgb2YgYSBwb2xpY3kgYmFzZSBlbGVtZW50Ki8KLQotICAgIGF1ZGlvX2RldmljZXNfdCBtQXBwbGljYWJsZURldmljZXM7IC8qKjwgQXBwbGljYWJsZSBvdXRwdXQgZGV2aWNlKHMpIGZvciB0aGlzIHN0cmF0ZWd5LiAqLwotfTsKLQotdHlwZWRlZiBFbGVtZW50PHJvdXRpbmdfc3RyYXRlZ3k+IFN0cmF0ZWd5OwotCi19IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmVhbS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmVhbS5jcHAKaW5kZXggMGVkMzY0Zi4uMjk3ZWIwMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyZWFtLmNwcApAQCAtMjEsMTAgKzIxLDggQEAKIAogdXNpbmcgc3RkOjpzdHJpbmc7CiAKLW5hbWVzcGFjZSBhbmRyb2lkCi17Ci1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5IHsKIAogc3RhdHVzX3QgRWxlbWVudDxhdWRpb19zdHJlYW1fdHlwZV90Pjo6c2V0SWRlbnRpZmllcihhdWRpb19zdHJlYW1fdHlwZV90IGlkZW50aWZpZXIpCiB7CkBAIC0zNiwzMiArMzQsNiBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotLyoqCi0qIFNldCB0aGUgc3RyYXRlZ3kgdG8gZm9sbG93IGZvciB0aGlzIHN0cmVhbS4KLSogSXQgY2hlY2tzIGlmIHRoZSBzdHJhdGVneSBpcyB2YWxpZC4KLSoKLSogQHBhcmFtW2luXSBzdHJhdGVneSB0byBiZSBmb2xsb3dlZC4KLSoKLSogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgc3RyYXRlZ3kgaXMgc2V0IGNvcnJlY3RseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCi0qLwotdGVtcGxhdGUgPD4KLXN0YXR1c190IEVsZW1lbnQ8YXVkaW9fc3RyZWFtX3R5cGVfdD46OnNldDxyb3V0aW5nX3N0cmF0ZWd5Pihyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KQotewotICAgIGlmIChzdHJhdGVneSA+PSBOVU1fU1RSQVRFR0lFUykgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBtQXBwbGljYWJsZVN0cmF0ZWd5ID0gc3RyYXRlZ3k7Ci0gICAgQUxPR0QoIiVzOiAweCVYIGZvciBTdHJlYW0gJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmF0ZWd5LCBnZXROYW1lKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi10ZW1wbGF0ZSA8Pgotcm91dGluZ19zdHJhdGVneSBFbGVtZW50PGF1ZGlvX3N0cmVhbV90eXBlX3Q+OjpnZXQ8cm91dGluZ19zdHJhdGVneT4oKSBjb25zdAotewotICAgIEFMT0dWKCIlczogMHglWCBmb3IgU3RyZWFtICVzIiwgX19GVU5DVElPTl9fLCBtQXBwbGljYWJsZVN0cmF0ZWd5LCBnZXROYW1lKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuIG1BcHBsaWNhYmxlU3RyYXRlZ3k7Ci19Ci0KIHRlbXBsYXRlIDw+CiBzdGF0dXNfdCBFbGVtZW50PGF1ZGlvX3N0cmVhbV90eXBlX3Q+OjpzZXQ8YXVkaW9fc3RyZWFtX3R5cGVfdD4oYXVkaW9fc3RyZWFtX3R5cGVfdCB2b2x1bWVQcm9maWxlKQogewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJlYW0uaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyZWFtLmgKaW5kZXggNjkwMjAwMy4uYTRmZGQzOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmVhbS5oCkBAIC0xOCwyMyArMTgsMjAgQEAKIAogI2luY2x1ZGUgIkVsZW1lbnQuaCIKICNpbmNsdWRlICJFbmdpbmVEZWZpbml0aW9uLmgiCi0jaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+CiAjaW5jbHVkZSA8bWFwPgogCi1uYW1lc3BhY2UgYW5kcm9pZAotewotbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoteworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeSB7CisKIC8qKgotICogQHRwYXJhbSByb3V0aW5nX3N0cmF0ZWd5OiBBcHBsaWNhYmxlIHN0cmF0ZWd5IGZvciB0aGlzIHN0cmVhbS4KKyAqIEB0cGFyYW0gcHJvZHVjdF9zdHJhdGVneV90OiBBcHBsaWNhYmxlIHN0cmF0ZWd5IGZvciB0aGlzIHN0cmVhbS4KICAqLwogdGVtcGxhdGUgPD4KIGNsYXNzIEVsZW1lbnQ8YXVkaW9fc3RyZWFtX3R5cGVfdD4KIHsKIHB1YmxpYzoKICAgICBFbGVtZW50KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKQotICAgICAgICA6IG1OYW1lKG5hbWUpLAotICAgICAgICAgIG1BcHBsaWNhYmxlU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEpCisgICAgICAgIDogbU5hbWUobmFtZSkKICAgICB7fQogICAgIH5FbGVtZW50KCkge30KIApAQCAtNjIsNyArNTksNyBAQAogCiAgICAgLyoqCiAgICAgICogQSBQb2xpY3kgZWxlbWVudCBtYXkgaW1wbGVtZW50IGdldHRlci9zZXR0ZXIgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gcHJvcGVydHkuCi0gICAgICogUHJvcGVydHkgbWF5IGJlIHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90CisgICAgICogUHJvcGVydHkgbWF5IGJlICBhdWRpb19zdHJlYW1fdHlwZV90LCBhdWRpb191c2FnZV90LCBhdWRpb19zb3VyY2VfdAogICAgICAqIG9yIGEgc3RyaW5nLgogICAgICAqLwogICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9wZXJ0eT4KQEAgLTc5LDggKzc2LDYgQEAKICAgICBzdGQ6OnN0cmluZyBtTmFtZTsgLyoqPCBVbmlxdWUgbGl0ZXJhbCBJZGVudGlmaWVyIG9mIGEgcG9saWN5IGJhc2UgZWxlbWVudCovCiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtSWRlbnRpZmllcjsgLyoqPCBVbmlxdWUgbnVtZXJpY2FsIElkZW50aWZpZXIgb2YgYSBwb2xpY3kgYmFzZSBlbGVtZW50Ki8KIAotICAgIHJvdXRpbmdfc3RyYXRlZ3kgbUFwcGxpY2FibGVTdHJhdGVneTsgLyoqPCBBcHBsaWNhYmxlIHN0cmF0ZWd5IGZvciB0aGlzIHN0cmVhbS4gKi8KLQogICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbVZvbHVtZVByb2ZpbGU7IC8qKjwgVm9sdW1lIFByb2ZpbGUgZm9sbG93ZWQgYnkgdGhpcyBzdHJlYW0uICovCiB9OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1VzYWdlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvVXNhZ2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDIwODI4Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvVXNhZ2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1BvbGljeUVuZ2luZS9Vc2FnZSIKLQotI2luY2x1ZGUgIlVzYWdlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkCi17Ci1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17Ci0KLXN0YXR1c190IEVsZW1lbnQ8YXVkaW9fdXNhZ2VfdD46OnNldElkZW50aWZpZXIoYXVkaW9fdXNhZ2VfdCBpZGVudGlmaWVyKQotewotICAgIGlmIChpZGVudGlmaWVyID4gQVVESU9fVVNBR0VfTUFYKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIG1JZGVudGlmaWVyID0gaWRlbnRpZmllcjsKLSAgICBBTE9HRCgiJXM6IFVzYWdlICVzIGhhcyBpZGVudGlmaWVyIDB4JVgiLCBfX0ZVTkNUSU9OX18sIGdldE5hbWUoKS5jX3N0cigpLCBpZGVudGlmaWVyKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXRlbXBsYXRlIDw+Ci1zdGF0dXNfdCBFbGVtZW50PGF1ZGlvX3VzYWdlX3Q+OjpzZXQ8cm91dGluZ19zdHJhdGVneT4ocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkKLXsKLSAgICBpZiAoc3RyYXRlZ3kgPj0gTlVNX1NUUkFURUdJRVMpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgQUxPR0QoIiVzOiAlZCBmb3IgVXNhZ2UgJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmF0ZWd5LCBnZXROYW1lKCkuY19zdHIoKSk7Ci0gICAgbUFwcGxpY2FibGVTdHJhdGVneSA9IHN0cmF0ZWd5OwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdGVtcGxhdGUgPD4KLXJvdXRpbmdfc3RyYXRlZ3kgRWxlbWVudDxhdWRpb191c2FnZV90Pjo6Z2V0PHJvdXRpbmdfc3RyYXRlZ3k+KCkgY29uc3QKLXsKLSAgICBBTE9HRCgiJXM6ICVkIGZvciBVc2FnZSAlcyIsIF9fRlVOQ1RJT05fXywgbUFwcGxpY2FibGVTdHJhdGVneSwgZ2V0TmFtZSgpLmNfc3RyKCkpOwotICAgIHJldHVybiBtQXBwbGljYWJsZVN0cmF0ZWd5OwotfQotCi19IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1VzYWdlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1VzYWdlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2OWUwZTAuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9Vc2FnZS5oCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiRWxlbWVudC5oIgotI2luY2x1ZGUgPFJvdXRpbmdTdHJhdGVneS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZAotewotbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQotewotCi0vKioKLSAqIEB0cGFyYW0gcm91dGluZ19zdHJhdGVneTogQXBwbGljYWJsZSBzdHJhdGVneSBmb3IgdGhpcyB1c2FnZS4KLSAqLwotdGVtcGxhdGUgPD4KLWNsYXNzIEVsZW1lbnQ8YXVkaW9fdXNhZ2VfdD4KLXsKLXB1YmxpYzoKLSAgICBFbGVtZW50KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKQotICAgICAgICA6IG1OYW1lKG5hbWUpLAotICAgICAgICAgIG1BcHBsaWNhYmxlU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEpCi0gICAge30KLSAgICB+RWxlbWVudCgpIHt9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGlkZW50aWZpZXIgb2YgdGhpcyBwb2xpY3kgZWxlbWVudAotICAgICAqCi0gICAgICogQHJldHVybnMgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgbmFtZSBvZiB0aGlzIHBvbGljeSBlbGVtZW50Ci0gICAgICovCi0gICAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldE5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQotCi0gICAgLyoqCi0gICAgKiBTZXQgdGhlIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIHBvbGljeSBlbGVtZW50LgotICAgICoKLSAgICAqIEB0cGFyYW0gS2V5IHR5cGUgb2YgdGhlIHVuaXF1ZSBpZGVudGlmaWVyLgotICAgICogQHBhcmFtW2luXSBpZGVudGlmaWVyIHRvIGJlIHNldC4KLSAgICAqCi0gICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIHRoZSBpZGVudGlmaWVyIGlzIHZhbGlkIGFuZCBzZXQgY29ycmVjdGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZS4KLSAgICAqLwotICAgIHN0YXR1c190IHNldElkZW50aWZpZXIoYXVkaW9fdXNhZ2VfdCBpZGVudGlmaWVyKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHRoaXMgcG9saWN5IGVsZW1lbnQuCi0gICAgICovCi0gICAgYXVkaW9fdXNhZ2VfdCBnZXRJZGVudGlmaWVyKCkgY29uc3QgeyByZXR1cm4gbUlkZW50aWZpZXI7IH0KLQotICAgIC8qKgotICAgICAqIEEgUG9saWN5IGVsZW1lbnQgbWF5IGltcGxlbWVudCBnZXR0ZXIvc2V0dGVyIGZ1bmN0aW9uIGZvciBhIGdpdmVuIHByb3BlcnR5LgotICAgICAqIFByb3BlcnR5IG1heSBiZSByb3V0aW5nX3N0cmF0ZWd5LCBhdWRpb19zdHJlYW1fdHlwZV90LCBhdWRpb191c2FnZV90LCBhdWRpb19zb3VyY2VfdAotICAgICAqIG9yIGEgc3RyaW5nLgotICAgICAqLwotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9wZXJ0eT4KLSAgICBQcm9wZXJ0eSBnZXQoKSBjb25zdDsKLQotICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9wZXJ0eT4KLSAgICBzdGF0dXNfdCBzZXQoUHJvcGVydHkgcHJvcGVydHkpOwotCi1wcml2YXRlOgotICAgIC8qIENvcHkgZmFjaWxpdGllcyBhcmUgcHV0IHByaXZhdGUgdG8gZGlzYWJsZSBjb3B5LiAqLwotICAgIEVsZW1lbnQoY29uc3QgRWxlbWVudCAmb2JqZWN0KTsKLSAgICBFbGVtZW50ICZvcGVyYXRvcj0oY29uc3QgRWxlbWVudCAmb2JqZWN0KTsKLQotICAgIHN0ZDo6c3RyaW5nIG1OYW1lOyAvKio8IFVuaXF1ZSBsaXRlcmFsIElkZW50aWZpZXIgb2YgYSBwb2xpY3kgYmFzZSBlbGVtZW50Ki8KLSAgICBhdWRpb191c2FnZV90IG1JZGVudGlmaWVyOyAvKio8IFVuaXF1ZSBudW1lcmljYWwgSWRlbnRpZmllciBvZiBhIHBvbGljeSBiYXNlIGVsZW1lbnQqLwotICAgIHJvdXRpbmdfc3RyYXRlZ3kgbUFwcGxpY2FibGVTdHJhdGVneTsgLyoqPCBBcHBsaWNhYmxlIHN0cmF0ZWd5IGZvciB0aGlzIHVzYWdlLiAqLwotfTsKLQotdHlwZWRlZiBFbGVtZW50PGF1ZGlvX3VzYWdlX3Q+IFVzYWdlOwotCi19IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjMTY5NzIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDYwIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3B5dGhvbl9kZWZhdWx0cyB7CisgICAgbmFtZTogInRvb2xzX2RlZmF1bHQiLAorICAgIHZlcnNpb246IHsKKyAgICAgICAgcHkyOiB7CisgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgICAgICB9LAorICAgICAgICBweTM6IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCit9CisKK3B5dGhvbl9iaW5hcnlfaG9zdCB7CisgICAgbmFtZTogImJ1aWxkUG9saWN5Q3JpdGVyaW9uVHlwZXMucHkiLAorICAgIG1haW46ICJidWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJidWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5IiwKKyAgICBdLAorICAgIGRlZmF1bHRzOiBbInRvb2xzX2RlZmF1bHQiXSwKK30KKworcHl0aG9uX2JpbmFyeV9ob3N0IHsKKyAgICBuYW1lOiAiZG9tYWluR2VuZXJhdG9yUG9saWN5LnB5IiwKKyAgICBtYWluOiAiZG9tYWluR2VuZXJhdG9yUG9saWN5LnB5IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJkb21haW5HZW5lcmF0b3JQb2xpY3kucHkiLAorICAgIF0sCisgICAgZGVmYXVsdHM6IFsidG9vbHNfZGVmYXVsdCJdLAorICAgIGxpYnM6IFsKKyAgICAgICAgIkVkZFBhcnNlci5weSIsCisgICAgICAgICJob3N0Q29uZmlnLnB5IiwKKyAgICAgICAgIlBGV1NjcmlwdEdlbmVyYXRvci5weSIsCisgICAgXSwKKyAgICByZXF1aXJlZDogWworICAgICAgICAiZG9tYWluR2VuZXJhdG9yQ29ubmVjdG9yIiwKKyAgICBdLAorfQorCitweXRob25fYmluYXJ5X2hvc3QgeworICAgIG5hbWU6ICJidWlsZFN0cmF0ZWdpZXNTdHJ1Y3R1cmVGaWxlLnB5IiwKKyAgICBtYWluOiAiYnVpbGRTdHJhdGVnaWVzU3RydWN0dXJlRmlsZS5weSIsCisgICAgc3JjczogWworICAgICAgICAiYnVpbGRTdHJhdGVnaWVzU3RydWN0dXJlRmlsZS5weSIsCisgICAgXSwKKyAgICBkZWZhdWx0czogWyJ0b29sc19kZWZhdWx0Il0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvYnVpbGRQb2xpY3lDcml0ZXJpb25UeXBlcy5weSBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmE2M2M4NTgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvYnVpbGRQb2xpY3lDcml0ZXJpb25UeXBlcy5weQpAQCAtMCwwICsxLDI1MSBAQAorIyEvdXNyL2Jpbi9weXRob24KKworIworIyBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCByZQoraW1wb3J0IHN5cworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgb3MKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHhtbC5ldHJlZS5FbGVtZW50VHJlZSBhcyBFVAoraW1wb3J0IHhtbC5ldHJlZS5FbGVtZW50SW5jbHVkZSBhcyBFSQoraW1wb3J0IHhtbC5kb20ubWluaWRvbSBhcyBNSU5JRE9NCitmcm9tIGNvbGxlY3Rpb25zIGltcG9ydCBPcmRlcmVkRGljdAorCisjCisjIEhlbHBlciBzY3JpcHQgdGhhdCBoZWxwcyB0byBmZWVkIGF0IGJ1aWxkIHRpbWUgdGhlIFhNTCBjcml0ZXJpb24gdHlwZXMgZmlsZSB1c2VkIGJ5CisjIHRoZSBlbmdpbmVjb25maWd1cmFibGUgdG8gc3RhcnQgdGhlIHBhcmFtZXRlci1mcmFtZXdvcmsuCisjIEl0IHByZXZlbnRzIHRvIGZpbGwgdGhlbSBtYW51YWxseSBhbmQgYXZvaWQgZGl2ZXJnZW5jZXMgd2l0aCBhbmRyb2lkLgorIworIyBUaGUgRGV2aWNlIFR5cGVzIGNyaXRlcmlvbiB0eXBlcyBhcmUgZmVkIGZyb20gYXVkaW8tYmFzZS5oIGZpbGUgd2l0aCB0aGUgb3B0aW9uCisjICAgICAgICAgICAtLWFuZHJvaWRhdWRpb2Jhc2VoZWFkZXIgPHBhdGgvdG8vYW5kcm9pZC9hdWRpby9iYXNlL2ZpbGUvYXVkaW8tYmFzZS5oPgorIworIyBUaGUgRGV2aWNlIEFkZHJlc3NlcyBjcml0ZXJpb24gdHlwZXMgYXJlIGZlZCBmcm9tIHRoZSBhdWRpbyBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlCisjIGluIG9yZGVyIHRvIGRpc2NvdmVyIGFsbCB0aGUgZGV2aWNlcyBmb3Igd2hpY2ggdGhlIGFkZHJlc3MgbWF0dGVyLgorIyAgICAgICAgICAgLS1hdWRpb3BvbGljeWNvbmZpZ3VyYXRpb25maWxlIDxwYXRoL3RvL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbD4KKyMKKyMgVGhlIHJlZmVyZW5jZSBmaWxlIG9mIGNyaXRlcmlvbiB0eXBlcyBtdXN0IGFsc28gYmUgc2V0IGFzIGFuIGlucHV0IG9mIHRoZSBzY3JpcHQ6CisjICAgICAgICAgICAtLWNyaXRlcmlvbnR5cGVzIDxwYXRoL3RvL2NyaXRlcmlvbi9maWxlL2F1ZGlvX2NyaXRlcmlvbl90eXBlcy54bWwuaW4+CisjCisjIEF0IGxhc3QsIHRoZSBvdXRwdXQgb2YgdGhlIHNjcmlwdCBzaGFsbCBiZSBzZXQgYWxzbzoKKyMgICAgICAgICAgIC0tb3V0cHV0ZmlsZSA8cGF0aC90by9vdXQvdmVuZG9yL2V0Yy9hdWRpb19jcml0ZXJpb25fdHlwZXMueG1sPgorIworCitkZWYgcGFyc2VBcmdzKCk6CisgICAgYXJncGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249IlBhcmFtZXRlci1GcmFtZXdvcmsgWE1MIFwKKyAgICAgICAgYXVkaW8gY3JpdGVyaW9uIHR5cGUgZmlsZSBnZW5lcmF0b3IuXG5cCisgICAgICAgIEV4aXQgd2l0aCB0aGUgbnVtYmVyIG9mIChyZWNvdmVyYWJsZSBvciBub3QpIGVycm9yIHRoYXQgb2NjdXJlZC4iKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tYW5kcm9pZGF1ZGlvYmFzZWhlYWRlcicsCisgICAgICAgICAgICBoZWxwPSJBbmRyb2lkIEF1ZGlvIEJhc2UgQyBoZWFkZXIgZmlsZSwgTWFuZGF0b3J5LiIsCisgICAgICAgICAgICBtZXRhdmFyPSJBTkRST0lEX0FVRElPX0JBU0VfSEVBREVSIiwKKyAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3InKSwKKyAgICAgICAgICAgIHJlcXVpcmVkPVRydWUpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS1hdWRpb3BvbGljeWNvbmZpZ3VyYXRpb25maWxlJywKKyAgICAgICAgICAgIGhlbHA9IkFuZHJvaWQgQXVkaW8gUG9saWN5IENvbmZpZ3VyYXRpb24gZmlsZSwgTWFuZGF0b3J5LiIsCisgICAgICAgICAgICBtZXRhdmFyPSIoQVVESU9fUE9MSUNZX0NPTkZJR1VSQVRJT05fRklMRSkiLAorICAgICAgICAgICAgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgncicpLAorICAgICAgICAgICAgcmVxdWlyZWQ9VHJ1ZSkKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWNyaXRlcmlvbnR5cGVzJywKKyAgICAgICAgICAgIGhlbHA9IkNyaXRlcmlvbiB0eXBlcyBYTUwgYmFzZSBmaWxlLCBpbiBcCisgICAgICAgICAgICAnPGNyaXRlcmlvbl90eXBlcz4gXAorICAgICAgICAgICAgICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSIiIHR5cGU9PGluY2x1c2l2ZXxleGNsdXNpdmU+IHZhbHVlcz08dmFsdWUxLHZhbHVlMiwuLi4+Lz4nIFwKKyAgICAgICAgZm9ybWF0LiBNYW5kYXRvcnkuIiwKKyAgICAgICAgICAgIG1ldGF2YXI9IkNSSVRFUklPTl9UWVBFX0ZJTEUiLAorICAgICAgICAgICAgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgncicpLAorICAgICAgICAgICAgcmVxdWlyZWQ9VHJ1ZSkKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLW91dHB1dGZpbGUnLAorICAgICAgICAgICAgaGVscD0iQ3JpdGVyaW9uIHR5cGVzIG91dHB1dGZpbGUgZmlsZS4gTWFuZGF0b3J5LiIsCisgICAgICAgICAgICBtZXRhdmFyPSJDUklURVJJT05fVFlQRV9PVVRQVVRfRklMRSIsCisgICAgICAgICAgICB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCd3JyksCisgICAgICAgICAgICByZXF1aXJlZD1UcnVlKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tdmVyYm9zZScsCisgICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnKQorCisgICAgcmV0dXJuIGFyZ3BhcnNlci5wYXJzZV9hcmdzKCkKKworCitkZWYgZ2VuZXJhdGVYbWxDcml0ZXJpb25UeXBlc0ZpbGUoY3JpdGVyaW9uVHlwZXMsIGFkZHJlc3NDcml0ZXJpYSwgY3JpdGVyaW9uVHlwZXNGaWxlLCBvdXRwdXRGaWxlKToKKworICAgIGxvZ2dpbmcuaW5mbygiSW1wb3J0aW5nIGNyaXRlcmlvblR5cGVzRmlsZSB7fSIuZm9ybWF0KGNyaXRlcmlvblR5cGVzRmlsZSkpCisgICAgY3JpdGVyaW9uX3R5cGVzX2luX3RyZWUgPSBFVC5wYXJzZShjcml0ZXJpb25UeXBlc0ZpbGUpCisKKyAgICBjcml0ZXJpb25fdHlwZXNfcm9vdCA9IGNyaXRlcmlvbl90eXBlc19pbl90cmVlLmdldHJvb3QoKQorCisgICAgZm9yIGNyaXRlcmlvbl9uYW1lLCB2YWx1ZXNfZGljdCBpbiBjcml0ZXJpb25UeXBlcy5pdGVtcygpOgorICAgICAgICBmb3IgY3JpdGVyaW9uX3R5cGUgaW4gY3JpdGVyaW9uX3R5cGVzX3Jvb3QuZmluZGFsbCgnY3JpdGVyaW9uX3R5cGUnKToKKyAgICAgICAgICAgIGlmIGNyaXRlcmlvbl90eXBlLmdldCgnbmFtZScpID09IGNyaXRlcmlvbl9uYW1lOgorICAgICAgICAgICAgICAgIHZhbHVlc19ub2RlID0gRVQuU3ViRWxlbWVudChjcml0ZXJpb25fdHlwZSwgInZhbHVlcyIpCisgICAgICAgICAgICAgICAgb3JkZXJlZF92YWx1ZXMgPSBPcmRlcmVkRGljdChzb3J0ZWQodmFsdWVzX2RpY3QuaXRlbXMoKSwga2V5PWxhbWJkYSB4OiB4WzFdKSkKKyAgICAgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBvcmRlcmVkX3ZhbHVlcy5pdGVtcygpOgorICAgICAgICAgICAgICAgICAgICB2YWx1ZV9ub2RlID0gRVQuU3ViRWxlbWVudCh2YWx1ZXNfbm9kZSwgInZhbHVlIikKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVfbm9kZS5zZXQoJ251bWVyaWNhbCcsIHN0cih2YWx1ZSkpCisgICAgICAgICAgICAgICAgICAgIHZhbHVlX25vZGUuc2V0KCdsaXRlcmFsJywga2V5KQorCisgICAgaWYgYWRkcmVzc0NyaXRlcmlhOgorICAgICAgICBmb3IgY3JpdGVyaW9uX25hbWUsIHZhbHVlc19saXN0IGluIGFkZHJlc3NDcml0ZXJpYS5pdGVtcygpOgorICAgICAgICAgICAgZm9yIGNyaXRlcmlvbl90eXBlIGluIGNyaXRlcmlvbl90eXBlc19yb290LmZpbmRhbGwoJ2NyaXRlcmlvbl90eXBlJyk6CisgICAgICAgICAgICAgICAgaWYgY3JpdGVyaW9uX3R5cGUuZ2V0KCduYW1lJykgPT0gY3JpdGVyaW9uX25hbWU6CisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gMAorICAgICAgICAgICAgICAgICAgICBleGlzdGluZ192YWx1ZXNfbm9kZSA9IGNyaXRlcmlvbl90eXBlLmZpbmQoInZhbHVlcyIpCisgICAgICAgICAgICAgICAgICAgIGlmIGV4aXN0aW5nX3ZhbHVlc19ub2RlIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGV4aXN0aW5nX3ZhbHVlIGluIGV4aXN0aW5nX3ZhbHVlc19ub2RlLmZpbmRhbGwoJ3ZhbHVlJyk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgZXhpc3RpbmdfdmFsdWUuZ2V0KCdudW1lcmljYWwnKSA9PSBzdHIoMSA8PCBpbmRleCk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc19ub2RlID0gZXhpc3RpbmdfdmFsdWVzX25vZGUKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlc19ub2RlID0gRVQuU3ViRWxlbWVudChjcml0ZXJpb25fdHlwZSwgInZhbHVlcyIpCisKKyAgICAgICAgICAgICAgICAgICAgZm9yIHZhbHVlIGluIHZhbHVlc19saXN0OgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfbm9kZSA9IEVULlN1YkVsZW1lbnQodmFsdWVzX25vZGUsICJ2YWx1ZSIsIGxpdGVyYWw9dmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9ub2RlLnNldCgnbnVtZXJpY2FsJywgc3RyKDEgPDwgaW5kZXgpKQorICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMQorCisgICAgeG1sc3RyID0gRVQudG9zdHJpbmcoY3JpdGVyaW9uX3R5cGVzX3Jvb3QsIGVuY29kaW5nPSd1dGY4JywgbWV0aG9kPSd4bWwnKQorICAgIHJlcGFyc2VkID0gTUlOSURPTS5wYXJzZVN0cmluZyh4bWxzdHIpCisgICAgcHJldHR5WG1sU3RyID0gcmVwYXJzZWQudG9wcmV0dHl4bWwobmV3bD0nXHJcbicpCisgICAgcHJldHR5WG1sU3RyID0gb3MubGluZXNlcC5qb2luKFtzIGZvciBzIGluIHByZXR0eVhtbFN0ci5zcGxpdGxpbmVzKCkgaWYgcy5zdHJpcCgpXSkKKyAgICBvdXRwdXRGaWxlLndyaXRlKHByZXR0eVhtbFN0ci5lbmNvZGUoJ3V0Zi04JykpCisKK2RlZiBjYXBpdGFsaXplTGluZShsaW5lKToKKyAgICByZXR1cm4gJyAnLmpvaW4oKHcuY2FwaXRhbGl6ZSgpIGZvciB3IGluIGxpbmUuc3BsaXQoJyAnKSkpCisKKworIworIyBQYXJzZSB0aGUgYXVkaW8gcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgb3V0cHV0IGEgZGljdGlvbmFyeSBvZiBkZXZpY2UgY3JpdGVyaWEgYWRkcmVzc2VzCisjCitkZWYgcGFyc2VBbmRyb2lkQXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uRmlsZShhdWRpb3BvbGljeWNvbmZpZ3VyYXRpb25maWxlKToKKworICAgIGxvZ2dpbmcuaW5mbygiQ2hlY2tpbmcgQXVkaW8gUG9saWN5IENvbmZpZ3VyYXRpb24gZmlsZSB7fSIuZm9ybWF0KGF1ZGlvcG9saWN5Y29uZmlndXJhdGlvbmZpbGUpKQorICAgICMKKyAgICAjIGV4dHJhY3QgYWxsIGRldmljZXMgYWRkcmVzc2VzIGZyb20gYXVkaW8gcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZQorICAgICMKKyAgICBhZGRyZXNzX2NyaXRlcmlhX21hcHBpbmdfdGFibGUgPSB7CisgICAgICAgICdzaW5rJyA6ICJPdXRwdXREZXZpY2VzQWRkcmVzc2VzVHlwZSIsCisgICAgICAgICdzb3VyY2UnIDogIklucHV0RGV2aWNlc0FkZHJlc3Nlc1R5cGUiIH0KKworICAgIGFkZHJlc3NfY3JpdGVyaWEgPSB7CisgICAgICAgICdPdXRwdXREZXZpY2VzQWRkcmVzc2VzVHlwZScgOiBbXSwKKyAgICAgICAgJ0lucHV0RGV2aWNlc0FkZHJlc3Nlc1R5cGUnIDogW10gfQorCisgICAgb2xkV29ya2luZ0RpciA9IG9zLmdldGN3ZCgpCisgICAgcHJpbnQgIkN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgJXMiICUgb2xkV29ya2luZ0RpcgorCisgICAgbmV3RGlyID0gb3MucGF0aC5qb2luKG9sZFdvcmtpbmdEaXIgLCBhdWRpb3BvbGljeWNvbmZpZ3VyYXRpb25maWxlLm5hbWUpCisKKyAgICBwb2xpY3lfaW5fdHJlZSA9IEVULnBhcnNlKGF1ZGlvcG9saWN5Y29uZmlndXJhdGlvbmZpbGUpCisgICAgb3MuY2hkaXIob3MucGF0aC5kaXJuYW1lKG9zLnBhdGgubm9ybXBhdGgobmV3RGlyKSkpCisKKyAgICBwcmludCAibmV3IHdvcmtpbmcgZGlyZWN0b3J5ICVzIiAlIG9zLmdldGN3ZCgpCisKKyAgICBwb2xpY3lfcm9vdCA9IHBvbGljeV9pbl90cmVlLmdldHJvb3QoKQorICAgIEVJLmluY2x1ZGUocG9saWN5X3Jvb3QpCisKKyAgICBvcy5jaGRpcihvbGRXb3JraW5nRGlyKQorCisgICAgZm9yIGRldmljZSBpbiBwb2xpY3lfcm9vdC5pdGVyKCdkZXZpY2VQb3J0Jyk6CisgICAgICAgIGZvciBrZXkgaW4gYWRkcmVzc19jcml0ZXJpYV9tYXBwaW5nX3RhYmxlLmtleXMoKToKKyAgICAgICAgICAgIGlmIGRldmljZS5nZXQoJ3JvbGUnKSA9PSBrZXkgYW5kIGRldmljZS5nZXQoJ2FkZHJlc3MnKSA6CisgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJ7fTogPHt9PiIuZm9ybWF0KGtleSwgZGV2aWNlLmdldCgnYWRkcmVzcycpKSkKKyAgICAgICAgICAgICAgICBhZGRyZXNzX2NyaXRlcmlhW2FkZHJlc3NfY3JpdGVyaWFfbWFwcGluZ190YWJsZVtrZXldXS5hcHBlbmQoZGV2aWNlLmdldCgnYWRkcmVzcycpKQorCisgICAgZm9yIGNyaXRlcmlhIGluIGFkZHJlc3NfY3JpdGVyaWE6CisgICAgICAgIHZhbHVlcyA9ICcsJy5qb2luKGFkZHJlc3NfY3JpdGVyaWFbY3JpdGVyaWFdKQorICAgICAgICBsb2dnaW5nLmluZm8oInt9OiA8e30+Ii5mb3JtYXQoY3JpdGVyaWEsIHZhbHVlcykpCisKKyAgICByZXR1cm4gYWRkcmVzc19jcml0ZXJpYQorCisjCisjIFBhcnNlIHRoZSBhdWRpby1iYXNlLmggZmlsZSBhbmQgb3V0cHV0IGEgZGljdGlvbmFyeSBvZiBhbmRyb2lkIGRlcGVuZGVudCBjcml0ZXJpb24gdHlwZXM6CisjICAgLUFuZHJvaWQgTW9kZQorIyAgIC1PdXRwdXQgZGV2aWNlcyB0eXBlCisjICAgLUlucHV0IGRldmljZXMgdHlwZQorIworZGVmIHBhcnNlQW5kcm9pZEF1ZGlvRmlsZShhbmRyb2lkYXVkaW9iYXNlaGVhZGVyRmlsZSk6CisgICAgIworICAgICMgQWRhcHRhdGlvbiB0YWJsZSBiZXR3ZWVuIEFuZHJvaWQgRW51bWVyYXRpb24gcHJlZml4IGFuZCBBdWRpbyBQRlcgQ3JpdGVyaW9uIHR5cGUgbmFtZXMKKyAgICAjCisgICAgY3JpdGVyaW9uX21hcHBpbmdfdGFibGUgPSB7CisgICAgICAgICdBVURJT19NT0RFJyA6ICJBbmRyb2lkTW9kZVR5cGUiLAorICAgICAgICAnQVVESU9fREVWSUNFX09VVCcgOiAiT3V0cHV0RGV2aWNlc01hc2tUeXBlIiwKKyAgICAgICAgJ0FVRElPX0RFVklDRV9JTicgOiAiSW5wdXREZXZpY2VzTWFza1R5cGUifQorCisgICAgYWxsX2NyaXRlcmlhID0geworICAgICAgICAnQW5kcm9pZE1vZGVUeXBlJyA6IHt9LAorICAgICAgICAnT3V0cHV0RGV2aWNlc01hc2tUeXBlJyA6IHt9LAorICAgICAgICAnSW5wdXREZXZpY2VzTWFza1R5cGUnIDoge30gfQorCisgICAgIworICAgICMgX0NOVCwgX01BWCwgX0FMTCBhbmQgX05PTkUgYXJlIHByb2hpYml0ZWQgdmFsdWVzIGFzIHRoZXIgYXJlIGp1c3QgaGVscGVycyBmb3IgZW51bSB1c2Vycy4KKyAgICAjCisgICAgaWdub3JlZF92YWx1ZXMgPSBbICdDTlQnLCAnTUFYJywgJ0FMTCcsICdOT05FJyBdCisKKyAgICBjcml0ZXJpYV9wYXR0ZXJuID0gcmUuY29tcGlsZSgKKyAgICAgICAgciJccyooP1A8dHlwZT4oPzoiKyd8Jy5qb2luKGNyaXRlcmlvbl9tYXBwaW5nX3RhYmxlLmtleXMoKSkgKyAiKSlcXyIgXAorICAgICAgICByIig/UDxsaXRlcmFsPig/ISIgKyAnfCcuam9pbihpZ25vcmVkX3ZhbHVlcykgKyAiKVx3Kilccyo9XHMqIiBcCisgICAgICAgIHIiKD9QPHZhbHVlcz4oPzowW3hYXSk/WzAtOWEtZkEtRl0rKSIpCisKKyAgICBsb2dnaW5nLmluZm8oIkNoZWNraW5nIEFuZHJvaWQgSGVhZGVyIGZpbGUge30iLmZvcm1hdChhbmRyb2lkYXVkaW9iYXNlaGVhZGVyRmlsZSkpCisKKyAgICBmb3IgbGluZV9udW1iZXIsIGxpbmUgaW4gZW51bWVyYXRlKGFuZHJvaWRhdWRpb2Jhc2VoZWFkZXJGaWxlKToKKyAgICAgICAgbWF0Y2ggPSBjcml0ZXJpYV9wYXR0ZXJuLm1hdGNoKGxpbmUpCisgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgbG9nZ2luZy5kZWJ1ZygiVGhlIGZvbGxvd2luZyBsaW5lIGlzIFZBTElEOiB7fTp7fVxue30iLmZvcm1hdCgKKyAgICAgICAgICAgICAgICBhbmRyb2lkYXVkaW9iYXNlaGVhZGVyRmlsZS5uYW1lLCBsaW5lX251bWJlciwgbGluZSkpCisKKyAgICAgICAgICAgIGNyaXRlcmlvbl9uYW1lID0gY3JpdGVyaW9uX21hcHBpbmdfdGFibGVbbWF0Y2guZ3JvdXBkaWN0KClbJ3R5cGUnXV0KKyAgICAgICAgICAgIGxpdGVyYWwgPSAnJy5qb2luKCh3LmNhcGl0YWxpemUoKSBmb3IgdyBpbiBtYXRjaC5ncm91cGRpY3QoKVsnbGl0ZXJhbCddLnNwbGl0KCdfJykpKQorICAgICAgICAgICAgbnVtZXJpY2FsX3ZhbHVlID0gbWF0Y2guZ3JvdXBkaWN0KClbJ3ZhbHVlcyddCisKKyAgICAgICAgICAgICMgZm9yIEFVRElPX0RFVklDRV9JTjogbmVlZCB0byByZW1vdmUgc2lnbiBiaXQKKyAgICAgICAgICAgIGlmIGNyaXRlcmlvbl9uYW1lID09ICJJbnB1dERldmljZXNNYXNrVHlwZSI6CisgICAgICAgICAgICAgICAgbnVtZXJpY2FsX3ZhbHVlID0gc3RyKGludChudW1lcmljYWxfdmFsdWUsIDApICYgfjIxNDc0ODM2NDgpCisKKyAgICAgICAgICAgICMgUmVtb3ZlIGR1cGxpY2F0ZWQgbnVtZXJpY2FsIHZhbHVlcworICAgICAgICAgICAgaWYgaW50KG51bWVyaWNhbF92YWx1ZSwgMCkgaW4gYWxsX2NyaXRlcmlhW2NyaXRlcmlvbl9uYW1lXS52YWx1ZXMoKToKKyAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oImNyaXRlcmlvbiB7fSBkdXBsaWNhdGVkIHZhbHVlczoiLmZvcm1hdChjcml0ZXJpb25fbmFtZSkpCisgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJ7fTp7fSIuZm9ybWF0KG51bWVyaWNhbF92YWx1ZSwgbGl0ZXJhbCkpCisgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJLRUVQSU5HIExBVEVTVCIpCisgICAgICAgICAgICAgICAgZm9yIGtleSBpbiBhbGxfY3JpdGVyaWFbY3JpdGVyaW9uX25hbWVdLmtleXMoKToKKyAgICAgICAgICAgICAgICAgICAgaWYgYWxsX2NyaXRlcmlhW2NyaXRlcmlvbl9uYW1lXVtrZXldID09IGludChudW1lcmljYWxfdmFsdWUsIDApOgorICAgICAgICAgICAgICAgICAgICAgICAgZGVsIGFsbF9jcml0ZXJpYVtjcml0ZXJpb25fbmFtZV1ba2V5XQorCisgICAgICAgICAgICBhbGxfY3JpdGVyaWFbY3JpdGVyaW9uX25hbWVdW2xpdGVyYWxdID0gaW50KG51bWVyaWNhbF92YWx1ZSwgMCkKKworICAgICAgICAgICAgbG9nZ2luZy5kZWJ1ZygidHlwZTp7fSwiLmZvcm1hdChjcml0ZXJpb25fbmFtZSkpCisgICAgICAgICAgICBsb2dnaW5nLmRlYnVnKCJpdGVyYWw6e30sIi5mb3JtYXQobGl0ZXJhbCkpCisgICAgICAgICAgICBsb2dnaW5nLmRlYnVnKCJ2YWx1ZXM6e30uIi5mb3JtYXQobnVtZXJpY2FsX3ZhbHVlKSkKKworICAgIHJldHVybiBhbGxfY3JpdGVyaWEKKworCitkZWYgbWFpbigpOgorICAgIGxvZ2dpbmcucm9vdC5zZXRMZXZlbChsb2dnaW5nLklORk8pCisgICAgYXJncyA9IHBhcnNlQXJncygpCisKKyAgICBhbGxfY3JpdGVyaWEgPSBwYXJzZUFuZHJvaWRBdWRpb0ZpbGUoYXJncy5hbmRyb2lkYXVkaW9iYXNlaGVhZGVyKQorCisgICAgYWRkcmVzc19jcml0ZXJpYSA9IHBhcnNlQW5kcm9pZEF1ZGlvUG9saWN5Q29uZmlndXJhdGlvbkZpbGUoYXJncy5hdWRpb3BvbGljeWNvbmZpZ3VyYXRpb25maWxlKQorCisgICAgY3JpdGVyaW9uX3R5cGVzID0gYXJncy5jcml0ZXJpb250eXBlcworCisgICAgZ2VuZXJhdGVYbWxDcml0ZXJpb25UeXBlc0ZpbGUoYWxsX2NyaXRlcmlhLCBhZGRyZXNzX2NyaXRlcmlhLCBjcml0ZXJpb25fdHlwZXMsIGFyZ3Mub3V0cHV0ZmlsZSkKKworIyBJZiB0aGlzIGZpbGUgaXMgZGlyZWN0bHkgZXhlY3V0ZWQKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgc3lzLmV4aXQobWFpbigpKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkU3RyYXRlZ2llc1N0cnVjdHVyZUZpbGUucHkgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvYnVpbGRTdHJhdGVnaWVzU3RydWN0dXJlRmlsZS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5hZjQwNjAyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkU3RyYXRlZ2llc1N0cnVjdHVyZUZpbGUucHkKQEAgLTAsMCArMSwxMzkgQEAKKyMhL3Vzci9iaW4vcHl0aG9uCisKKyMKKyMgQ29weXJpZ2h0IDIwMTksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IG9zCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCB4bWwuZXRyZWUuRWxlbWVudFRyZWUgYXMgRVQKK2ltcG9ydCB4bWwuZXRyZWUuRWxlbWVudEluY2x1ZGUgYXMgRUkKK2ltcG9ydCB4bWwuZG9tLm1pbmlkb20gYXMgTUlOSURPTQorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKKworIworIyBIZWxwZXIgc2NyaXB0IHRoYXQgaGVscHMgdG8gZmVlZCBhdCBidWlsZCB0aW1lIHRoZSBYTUwgUHJvZHVjdCBTdHJhdGVnaWVzIFN0cnVjdHVyZSBmaWxlIGZpbGUgdXNlZAorIyBieSB0aGUgZW5naW5lY29uZmlndXJhYmxlIHRvIHN0YXJ0IHRoZSBwYXJhbWV0ZXItZnJhbWV3b3JrLgorIyBJdCBwcmV2ZW50cyB0byBmaWxsIHRoZW0gbWFudWFsbHkgYW5kIGF2b2lkIGRpdmVyZ2VuY2VzIHdpdGggYW5kcm9pZC4KKyMKKyMgVGhlIFByb2R1Y3QgU3RyYXRlZ2llcyBTdHJ1Y3R1cmUgZmlsZSBpcyBmZWQgZnJvbSB0aGUgYXVkaW8gcG9saWN5IGVuZ2luZSBjb25maWd1cmF0aW9uIGZpbGUKKyMgaW4gb3JkZXIgdG8gZGlzY292ZXIgYWxsIHRoZSBzdHJhdGVnaWVzIGF2YWlsYWJsZSBmb3IgdGhlIGN1cnJlbnQgcGxhdGZvcm0uCisjICAgICAgICAgICAtLWF1ZGlvcG9saWN5ZW5naW5lY29uZmlndXJhdGlvbmZpbGUgPHBhdGgvdG8vYXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uLnhtbD4KKyMKKyMgVGhlIHJlZmVyZW5jZSBmaWxlIG9mIFByb2R1Y3RTdHJhdGVnaWVzIHN0cnVjdHVyZSBtdXN0IGFsc28gYmUgc2V0IGFzIGFuIGlucHV0IG9mIHRoZSBzY3JpcHQ6CisjICAgICAgICAgICAtLXByb2R1Y3RzdHJhdGVnaWVzc3RydWN0dXJlZmlsZSA8cGF0aC90by9zdHJ1Y3R1cmUvZmlsZS9Qcm9kdWN0U3RyYXRlZ2llcy54bWwuaW4+CisjCisjIEF0IGxhc3QsIHRoZSBvdXRwdXQgb2YgdGhlIHNjcmlwdCBzaGFsbCBiZSBzZXQgYWxzbzoKKyMgICAgICAgICAgIC0tb3V0cHV0ZmlsZSA8cGF0aC90by9vdXQvPHN5c3RlbXx2ZW5kb3J8b2RtPi9ldGMvUHJvZHVjdFN0cmF0ZWdpZXMueG1sPgorIworCitkZWYgcGFyc2VBcmdzKCk6CisgICAgYXJncGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249IlBhcmFtZXRlci1GcmFtZXdvcmsgWE1MIFwKKyAgICAgICAgcHJvZHVjdCBzdHJhdGVnaWVzIHN0cnVjdHVyZSBmaWxlIGdlbmVyYXRvci5cblwKKyAgICAgICAgRXhpdCB3aXRoIHRoZSBudW1iZXIgb2YgKHJlY292ZXJhYmxlIG9yIG5vdCkgZXJyb3IgdGhhdCBvY2N1cmVkLiIpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS1hdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYXRpb25maWxlJywKKyAgICAgICAgICAgIGhlbHA9IkFuZHJvaWQgQXVkaW8gUG9saWN5IEVuZ2luZSBDb25maWd1cmF0aW9uIGZpbGUsIE1hbmRhdG9yeS4iLAorICAgICAgICAgICAgbWV0YXZhcj0iKEFVRElPX1BPTElDWV9FTkdJTkVfQ09ORklHVVJBVElPTl9GSUxFKSIsCisgICAgICAgICAgICB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCdyJyksCisgICAgICAgICAgICByZXF1aXJlZD1UcnVlKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tcHJvZHVjdHN0cmF0ZWdpZXNzdHJ1Y3R1cmVmaWxlJywKKyAgICAgICAgICAgIGhlbHA9IlByb2R1Y3QgU3RyYXRlZ2llcyBTdHJ1Y3R1cmUgWE1MIGJhc2UgZmlsZSwgTWFuZGF0b3J5LiIsCisgICAgICAgICAgICBtZXRhdmFyPSJTVFJBVEVHSUVTX1NUUlVDVFVSRV9GSUxFIiwKKyAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3InKSwKKyAgICAgICAgICAgIHJlcXVpcmVkPVRydWUpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS1vdXRwdXRmaWxlJywKKyAgICAgICAgICAgIGhlbHA9IlByb2R1Y3QgU3RyYXRlZ2llcyBTdHJ1Y3R1cmUgb3V0cHV0IGZpbGUsIE1hbmRhdG9yeS4iLAorICAgICAgICAgICAgbWV0YXZhcj0iU1RSQVRFR0lFU19TVFJVQ1RVUkVfT1VUUFVUX0ZJTEUiLAorICAgICAgICAgICAgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgndycpLAorICAgICAgICAgICAgcmVxdWlyZWQ9VHJ1ZSkKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXZlcmJvc2UnLAorICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJykKKworICAgIHJldHVybiBhcmdwYXJzZXIucGFyc2VfYXJncygpCisKKworZGVmIGdlbmVyYXRlWG1sU3RydWN0dXJlRmlsZShzdHJhdGVnaWVzLCBzdHJhdGVneVN0cnVjdHVyZUluRmlsZSwgb3V0cHV0RmlsZSk6CisKKyAgICBsb2dnaW5nLmluZm8oIkltcG9ydGluZyBzdHJhdGVneVN0cnVjdHVyZUluRmlsZSB7fSIuZm9ybWF0KHN0cmF0ZWd5U3RydWN0dXJlSW5GaWxlKSkKKyAgICBzdHJhdGVnaWVzX2luX3RyZWUgPSBFVC5wYXJzZShzdHJhdGVneVN0cnVjdHVyZUluRmlsZSkKKworICAgIHN0cmF0ZWdpZXNfcm9vdCA9IHN0cmF0ZWdpZXNfaW5fdHJlZS5nZXRyb290KCkKKyAgICBzdHJhdGVneV9jb21wb25lbnRzID0gc3RyYXRlZ2llc19yb290LmZpbmQoJ0NvbXBvbmVudFR5cGUnKQorCisgICAgZm9yIHN0cmF0ZWd5X25hbWUgaW4gc3RyYXRlZ2llczoKKyAgICAgICAgY29udGV4dF9tYXBwaW5nID0gIiIuam9pbihtYXAoc3RyLCBbIk5hbWU6Iiwgc3RyYXRlZ3lfbmFtZV0pKQorICAgICAgICBzdHJhdGVneV9wZndfbmFtZSA9IHN0cmF0ZWd5X25hbWUucmVwbGFjZSgnU1RSQVRFR1lfJywgJycpLmxvd2VyKCkKKyAgICAgICAgc3RyYXRlZ3lfY29tcG9uZW50X25vZGUgPSBFVC5TdWJFbGVtZW50KHN0cmF0ZWd5X2NvbXBvbmVudHMsICJDb21wb25lbnQiLCBOYW1lPXN0cmF0ZWd5X3Bmd19uYW1lLCBUeXBlPSJQcm9kdWN0U3RyYXRlZ3kiLCBNYXBwaW5nPWNvbnRleHRfbWFwcGluZykKKworICAgIHhtbHN0ciA9IEVULnRvc3RyaW5nKHN0cmF0ZWdpZXNfcm9vdCwgZW5jb2Rpbmc9J3V0ZjgnLCBtZXRob2Q9J3htbCcpCisgICAgcmVwYXJzZWQgPSBNSU5JRE9NLnBhcnNlU3RyaW5nKHhtbHN0cikKKyAgICBwcmV0dHlYbWxTdHIgPSByZXBhcnNlZC50b3ByZXR0eXhtbChuZXdsPSdcclxuJykKKyAgICBwcmV0dHlYbWxTdHIgPSBvcy5saW5lc2VwLmpvaW4oW3MgZm9yIHMgaW4gcHJldHR5WG1sU3RyLnNwbGl0bGluZXMoKSBpZiBzLnN0cmlwKCldKQorICAgIG91dHB1dEZpbGUud3JpdGUocHJldHR5WG1sU3RyLmVuY29kZSgndXRmLTgnKSkKKworZGVmIGNhcGl0YWxpemVMaW5lKGxpbmUpOgorICAgIHJldHVybiAnICcuam9pbigody5jYXBpdGFsaXplKCkgZm9yIHcgaW4gbGluZS5zcGxpdCgnICcpKSkKKworCisjCisjIFBhcnNlIHRoZSBhdWRpbyBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlIGFuZCBvdXRwdXQgYSBkaWN0aW9uYXJ5IG9mIGRldmljZSBjcml0ZXJpYSBhZGRyZXNzZXMKKyMKK2RlZiBwYXJzZUFuZHJvaWRBdWRpb1BvbGljeUVuZ2luZUNvbmZpZ3VyYXRpb25GaWxlKGF1ZGlvcG9saWN5ZW5naW5lY29uZmlndXJhdGlvbmZpbGUpOgorCisgICAgbG9nZ2luZy5pbmZvKCJDaGVja2luZyBBdWRpbyBQb2xpY3kgRW5naW5lIENvbmZpZ3VyYXRpb24gZmlsZSB7fSIuZm9ybWF0KGF1ZGlvcG9saWN5ZW5naW5lY29uZmlndXJhdGlvbmZpbGUpKQorICAgICMKKyAgICAjIGV4dHJhY3QgYWxsIHByb2R1Y3Qgc3RyYXRlZ2llcyBuYW1lIGZyb20gYXVkaW8gcG9saWN5IGVuZ2luZSBjb25maWd1cmF0aW9uIGZpbGUKKyAgICAjCisgICAgc3RyYXRlZ3lfbmFtZXMgPSBbXQorCisgICAgb2xkV29ya2luZ0RpciA9IG9zLmdldGN3ZCgpCisgICAgcHJpbnQgIkN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgJXMiICUgb2xkV29ya2luZ0RpcgorCisgICAgbmV3RGlyID0gb3MucGF0aC5qb2luKG9sZFdvcmtpbmdEaXIgLCBhdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYXRpb25maWxlLm5hbWUpCisKKyAgICBwb2xpY3lfZW5naW5lX2luX3RyZWUgPSBFVC5wYXJzZShhdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYXRpb25maWxlKQorICAgIG9zLmNoZGlyKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLm5vcm1wYXRoKG5ld0RpcikpKQorCisgICAgcHJpbnQgIm5ldyB3b3JraW5nIGRpcmVjdG9yeSAlcyIgJSBvcy5nZXRjd2QoKQorCisgICAgcG9saWN5X2VuZ2luZV9yb290ID0gcG9saWN5X2VuZ2luZV9pbl90cmVlLmdldHJvb3QoKQorICAgIEVJLmluY2x1ZGUocG9saWN5X2VuZ2luZV9yb290KQorCisgICAgb3MuY2hkaXIob2xkV29ya2luZ0RpcikKKworICAgIGZvciBzdHJhdGVneSBpbiBwb2xpY3lfZW5naW5lX3Jvb3QuaXRlcignUHJvZHVjdFN0cmF0ZWd5Jyk6CisgICAgICAgIHN0cmF0ZWd5X25hbWVzLmFwcGVuZChzdHJhdGVneS5nZXQoJ25hbWUnKSkKKworICAgIHJldHVybiBzdHJhdGVneV9uYW1lcworCisKK2RlZiBtYWluKCk6CisgICAgbG9nZ2luZy5yb290LnNldExldmVsKGxvZ2dpbmcuSU5GTykKKyAgICBhcmdzID0gcGFyc2VBcmdzKCkKKworICAgIHN0cmF0ZWdpZXMgPSBwYXJzZUFuZHJvaWRBdWRpb1BvbGljeUVuZ2luZUNvbmZpZ3VyYXRpb25GaWxlKGFyZ3MuYXVkaW9wb2xpY3llbmdpbmVjb25maWd1cmF0aW9uZmlsZSkKKworICAgIHByb2R1Y3Rfc3RyYXRlZ2llc19zdHJ1Y3R1cmUgPSBhcmdzLnByb2R1Y3RzdHJhdGVnaWVzc3RydWN0dXJlZmlsZQorCisgICAgZ2VuZXJhdGVYbWxTdHJ1Y3R1cmVGaWxlKHN0cmF0ZWdpZXMsIHByb2R1Y3Rfc3RyYXRlZ2llc19zdHJ1Y3R1cmUsIGFyZ3Mub3V0cHV0ZmlsZSkKKworIyBJZiB0aGlzIGZpbGUgaXMgZGlyZWN0bHkgZXhlY3V0ZWQKK2lmIF9fbmFtZV9fID09ICJfX21haW5fXyI6CisgICAgc3lzLmV4aXQobWFpbigpKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkX2F1ZGlvX3Bmd19zZXR0aW5ncy5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZF9hdWRpb19wZndfc2V0dGluZ3MubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWM2MGVmNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZF9hdWRpb19wZndfc2V0dGluZ3MubWsKQEAgLTAsMCArMSwzOCBAQAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTICs9IFwKKyAgICAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9kb21haW5HZW5lcmF0b3JQb2xpY3kucHkgXAorICAgICQoUEZXX1RPUExFVkVMX0ZJTEUpICQoUEZXX0NSSVRFUklBX0ZJTEUpICQoUEZXX0NSSVRFUklPTl9UWVBFU19GSUxFKQorCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCisKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogTVlfQ1JJVEVSSU9OX1RZUEVTX0ZJTEUgOj0gJChQRldfQ1JJVEVSSU9OX1RZUEVTX0ZJTEUpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IE1ZX1RPT0wgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvZG9tYWluR2VuZXJhdG9yUG9saWN5LnB5CiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IE1ZX1RPUExFVkVMX0ZJTEUgOj0gJChQRldfVE9QTEVWRUxfRklMRSkKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogTVlfQ1JJVEVSSUFfRklMRSA6PSAkKFBGV19DUklURVJJQV9GSUxFKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBNWV9UVU5JTkdfRklMRSA6PSAkKFBGV19UVU5JTkdfRklMRSkKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogTVlfRUREX0ZJTEVTIDo9ICQoUEZXX0VERF9GSUxFUykKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogTVlfRE9NQUlOX0ZJTEVTIDo9ICQoUEZXX0RPTUFJTl9GSUxFUykKKyQoTE9DQUxfQlVJTFRfTU9EVUxFKTogTVlfU0NIRU1BU19ESVIgOj0gJChQRldfU0NIRU1BU19ESVIpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IE1ZX0NSSVRFUklPTl9UWVBFU19GSUxFIDo9ICQoUEZXX0NSSVRFUklPTl9UWVBFU19GSUxFKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKExPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTKQorCisJIiQoTVlfVE9PTCkiIC0tdmFsaWRhdGUgXAorCQktLXRvcGxldmVsLWNvbmZpZyAiJChNWV9UT1BMRVZFTF9GSUxFKSIgXAorCQktLWNyaXRlcmlhICIkKE1ZX0NSSVRFUklBX0ZJTEUpIiBcCisJCS0tY3JpdGVyaW9udHlwZXMgIiQoTVlfQ1JJVEVSSU9OX1RZUEVTX0ZJTEUpIiBcCisJCS0taW5pdGlhbC1zZXR0aW5ncyAkKE1ZX1RVTklOR19GSUxFKSBcCisJCS0tYWRkLWVkZHMgJChNWV9FRERfRklMRVMpIFwKKwkJLS1hZGQtZG9tYWlucyAkKE1ZX0RPTUFJTl9GSUxFUykgXAorCQktLXNjaGVtYXMtZGlyICQoTVlfU0NIRU1BU19ESVIpID4gIiRAIgorCisKKyMgQ2xlYXIgdmFyaWFibGVzIGZvciBmdXJ0aGVyIHVzZQorUEZXX1RPUExFVkVMX0ZJTEUgOj0KK1BGV19TVFJVQ1RVUkVfRklMRVMgOj0KK1BGV19DUklURVJJQV9GSUxFIDo9CitQRldfQ1JJVEVSSU9OX1RZUEVTX0ZJTEUgOj0KK1BGV19UVU5JTkdfRklMRSA6PQorUEZXX0VERF9GSUxFUyA6PQorUEZXX0RPTUFJTl9GSUxFUyA6PQorUEZXX1NDSEVNQVNfRElSIDo9ICQoUEZXX0RFRkFVTFRfU0NIRU1BU19ESVIpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvZG9tYWluR2VuZXJhdG9yUG9saWN5LnB5IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2RvbWFpbkdlbmVyYXRvclBvbGljeS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi40ZGVjOWEyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2RvbWFpbkdlbmVyYXRvclBvbGljeS5weQpAQCAtMCwwICsxLDI2OCBAQAorIyEvdXNyL2Jpbi9weXRob24KKworIworIyBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgRWRkUGFyc2VyCitmcm9tIFBGV1NjcmlwdEdlbmVyYXRvciBpbXBvcnQgUGZ3U2NyaXB0VHJhbnNsYXRvcgoraW1wb3J0IGhvc3RDb25maWcKKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IG9zCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCB4bWwuZXRyZWUuRWxlbWVudFRyZWUgYXMgRVQKKworIworIyBJbiBvcmRlciB0byBidWlsZCB0aGUgWE1MIFNldHRpbmdzIGZpbGUgYXQgYnVpbGQgdGltZSwgYW4gaW5zdGFuY2Ugb2YgdGhlIHBhcmFtZXRlci1mcmFtZXdvcmsKKyMgc2hhbGwgYmUgc3RhcnRlZCBhbmQgZmVkIHdpdGggYWxsIHRoZSBjcml0ZXJpb24gdHlwZXMvY3JpdGVyaWEgdGhhdCB3aWxsIGJlIHVzZWQgYnkKKyMgdGhlIGVuZ2luZWNvbmZpZ3VyYWJsZS4KKyMgVGhpcyBzY3JpcHRzIGFsbG93cyBnZW5lcmF0ZXMgdGhlIHNldHRpbmdzIGZyb20gdGhlIHNhbWUgYXVkaW9fY3JpdGVyaW9uX3R5cGVzLnhtbCAvCisjIGF1ZGlvX2NyaXRlcmlhLnhtbCBmaWxlcyB1c2VkIGF0IHJ1biB0aW1lIGJ5IHRoZSBlbmdpbmVjb25maWd1cmFibGUKKyMKKworZGVmIHBhcnNlQXJncygpOgorICAgIGFyZ3BhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGRlc2NyaXB0aW9uPSJQYXJhbWV0ZXItRnJhbWV3b3JrIFhNTCBcCisgICAgICAgIFNldHRpbmdzIGZpbGUgZ2VuZXJhdG9yLlxuXAorICAgICAgICBFeGl0IHdpdGggdGhlIG51bWJlciBvZiAocmVjb3ZlcmFibGUgb3Igbm90KSBlcnJvciB0aGF0IG9jY3VyZWQuIikKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXRvcGxldmVsLWNvbmZpZycsCisgICAgICAgICAgICBoZWxwPSJUb3AtbGV2ZWwgcGFyYW1ldGVyLWZyYW1ld29yayBjb25maWd1cmF0aW9uIGZpbGUuIE1hbmRhdG9yeS4iLAorICAgICAgICAgICAgbWV0YXZhcj0iVE9QTEVWRUxfQ09ORklHX0ZJTEUiLAorICAgICAgICAgICAgcmVxdWlyZWQ9VHJ1ZSkKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWNyaXRlcmlhJywKKyAgICAgICAgICAgIGhlbHA9IkNyaXRlcmlhIGZpbGUsIGluIFhNTCBmb3JtYXQ6IFwKKyAgICAgICAgICAgICAgICAgIGluICc8Y3JpdGVyaWE+IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPGNyaXRlcmlvbiBuYW1lPSIiIHR5cGU9IiIvPiBcCisgICAgICAgICAgICAgICAgICAgICAgPC9jcml0ZXJpYT4nIFwKKyAgICAgICAgZm9ybWF0LiBNYW5kYXRvcnkuIiwKKyAgICAgICAgICAgIG1ldGF2YXI9IkNSSVRFUklBX0ZJTEUiLAorICAgICAgICAgICAgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgncicpLAorICAgICAgICAgICAgcmVxdWlyZWQ9VHJ1ZSkKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWNyaXRlcmlvbnR5cGVzJywKKyAgICAgICAgICAgIGhlbHA9IkNyaXRlcmlvbiB0eXBlcyBYTUwgZmlsZSwgaW4gXAorICAgICAgICAgICAgJzxjcml0ZXJpb25fdHlwZXM+IFwKKyAgICAgICAgICAgICAgICA8Y3JpdGVyaW9uX3R5cGUgbmFtZT0iIiB0eXBlPTxpbmNsdXNpdmV8ZXhjbHVzaXZlPiB2YWx1ZXM9PHZhbHVlMSx2YWx1ZTIsLi4uPi8+IFwKKyAgICAgICAgICAgICA8L2NyaXRlcmlvbl90eXBlcz4nIFwKKyAgICAgICAgZm9ybWF0LiBNYW5kYXRvcnkuIiwKKyAgICAgICAgICAgIG1ldGF2YXI9IkNSSVRFUklPTl9UWVBFX0ZJTEUiLAorICAgICAgICAgICAgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgncicpLAorICAgICAgICAgICAgcmVxdWlyZWQ9RmFsc2UpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS1pbml0aWFsLXNldHRpbmdzJywKKyAgICAgICAgICAgIGhlbHA9IkluaXRpYWwgWE1MIHNldHRpbmdzIGZpbGUgKGNvbnRhaW5pbmcgYSBcCisgICAgICAgIDxDb25maWd1cmFibGVEb21haW5zPiAgdGFnIiwKKyAgICAgICAgICAgIG5hcmdzPSc/JywKKyAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgIG1ldGF2YXI9IlhNTF9TRVRUSU5HU19GSUxFIikKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWFkZC1kb21haW5zJywKKyAgICAgICAgICAgIGhlbHA9Ikxpc3Qgb2Ygc2luZ2xlIGRvbWFpbiBmaWxlcyAoZWFjaCBjb250YWluaW5nIGEgc2luZ2xlIFwKKyAgICAgICAgPENvbmZpZ3VyYWJsZURvbWFpbj4gdGFnIiwKKyAgICAgICAgICAgIG1ldGF2YXI9IlhNTF9ET01BSU5fRklMRSIsCisgICAgICAgICAgICBuYXJncz0nKicsCisgICAgICAgICAgICBkZXN0PSd4bWxfZG9tYWluX2ZpbGVzJywKKyAgICAgICAgICAgIGRlZmF1bHQ9W10pCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS1hZGQtZWRkcycsCisgICAgICAgICAgICBoZWxwPSJMaXN0IG9mIGZpbGVzIGluIEVERCBzeW50YXggKGFrYSBcIi5wZndcIiBmaWxlcykiLAorICAgICAgICAgICAgbWV0YXZhcj0iRUREX0ZJTEUiLAorICAgICAgICAgICAgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgncicpLAorICAgICAgICAgICAgbmFyZ3M9JyonLAorICAgICAgICAgICAgZGVmYXVsdD1bXSwKKyAgICAgICAgICAgIGRlc3Q9J2VkZF9maWxlcycpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS1zY2hlbWFzLWRpcicsCisgICAgICAgICAgICBoZWxwPSJEaXJlY3Rvcnkgb2YgcGFyYW1ldGVyLWZyYW1ld29yayBYTUwgU2NoZW1hcyBmb3IgZ2VuZXJhdGlvbiBcCisgICAgICAgIHZhbGlkYXRpb24iLAorICAgICAgICAgICAgZGVmYXVsdD1Ob25lKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tdGFyZ2V0LXNjaGVtYXMtZGlyJywKKyAgICAgICAgICAgIGhlbHA9Iklnbm9yZWQuIEtlcHQgZm9yIHJldHJvLWNvbXBhdGliaWxpdHkiKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tdmFsaWRhdGUnLAorICAgICAgICAgICAgaGVscD0iVmFsaWRhdGUgdGhlIHNldHRpbmdzIGFnYWluc3QgWE1MIHNjaGVtYXMiLAorICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJykKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXZlcmJvc2UnLAorICAgICAgICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJykKKworICAgIHJldHVybiBhcmdwYXJzZXIucGFyc2VfYXJncygpCisKKyMKKyMgUGFyc2VzIGF1ZGlvX2NyaXRlcmlvbl90eXBlcy54bWwgLyBhdWRpb19jcml0ZXJpYS54bWwgZmlsZXMgdXNlZCBhdCBydW4gdGltZSBieSB0aGUKKyMgZW5naW5lY29uZmlndXJhYmxlIGFuZCBvdXRwdXRzIGEgZGljdGlvbm5hcnkgb2YgY3JpdGVyaWEuCisjIEZvciBlYWNoIGNyaXRlcmlhLCB0aGUgbmFtZSwgdHlwZSAoYWthIGluY2x1c2l2ZSAoYml0ZmllbGQpIG9yIGV4Y2x1c2l2ZSAoZW51bSksIHRoZSB2YWx1ZXMKKyMgYXJlIHByb3ZpZGVkLgorIworZGVmIHBhcnNlQ3JpdGVyaWFBbmRDcml0ZXJpb25UeXBlcyhjcml0ZXJpYUZpbGUsIGNyaXRlcmlvblR5cGVzRmlsZSk6CisgICAgIyBQYXJzZSBjcml0ZXJpYSBhbmQgY3JpdGVyaW9uIHR5cGVzIFhNTCBmaWxlcworICAgICMKKyAgICBjcml0ZXJpYV90cmVlID0gRVQucGFyc2UoY3JpdGVyaWFGaWxlKQorICAgIGxvZ2dpbmcuaW5mbygiSW1wb3J0aW5nIGNyaXRlcmlhRmlsZSB7fSIuZm9ybWF0KGNyaXRlcmlhRmlsZSkpCisgICAgY3JpdGVyaW9uX3R5cGVzX3RyZWUgPSBFVC5wYXJzZShjcml0ZXJpb25UeXBlc0ZpbGUpCisgICAgbG9nZ2luZy5pbmZvKCJJbXBvcnRpbmcgY3JpdGVyaW9uVHlwZXNGaWxlIHt9Ii5mb3JtYXQoY3JpdGVyaW9uVHlwZXNGaWxlKSkKKworICAgIGNyaXRlcmlhX3Jvb3QgPSBjcml0ZXJpYV90cmVlLmdldHJvb3QoKQorICAgIGNyaXRlcmlvbl90eXBlc19yb290ID0gY3JpdGVyaW9uX3R5cGVzX3RyZWUuZ2V0cm9vdCgpCisKKyAgICBhbGxfY3JpdGVyaWEgPSBbXQorICAgIGZvciBjcml0ZXJpb24gaW4gY3JpdGVyaWFfcm9vdC5maW5kYWxsKCdjcml0ZXJpb24nKToKKyAgICAgICAgY3JpdGVyaW9uX25hbWUgPSBjcml0ZXJpb24uZ2V0KCduYW1lJykKKyAgICAgICAgdHlwZV9uYW1lID0gY3JpdGVyaW9uLmdldCgndHlwZScpCisgICAgICAgIGxvZ2dpbmcuaW5mbygiSW1wb3J0aW5nIGNyaXRlcmlvbl9uYW1lIHt9Ii5mb3JtYXQoY3JpdGVyaW9uX25hbWUpKQorICAgICAgICBsb2dnaW5nLmluZm8oIkltcG9ydGluZyB0eXBlX25hbWUge30iLmZvcm1hdCh0eXBlX25hbWUpKQorCisgICAgICAgIGZvciBjcml0ZXJpb25fdHlwZXMgaW4gY3JpdGVyaW9uX3R5cGVzX3RyZWUuZmluZGFsbCgnY3JpdGVyaW9uX3R5cGUnKToKKyAgICAgICAgICAgIGNyaXRlcmlvbl90eXBlX25hbWUgPSBjcml0ZXJpb25fdHlwZXMuZ2V0KCduYW1lJykKKyAgICAgICAgICAgIGlmIGNyaXRlcmlvbl90eXBlX25hbWUgPT0gdHlwZV9uYW1lOgorICAgICAgICAgICAgICAgIGNyaXRlcmlvbl9pbmNsdXNpdmVuZXNzID0gY3JpdGVyaW9uX3R5cGVzLmdldCgndHlwZScpCisKKyAgICAgICAgICAgICAgICBjcml0ZXJpb25fdmFsdWVzID0gW10KKworICAgICAgICAgICAgICAgIHZhbHVlc19ub2RlID0gY3JpdGVyaW9uX3R5cGVzLmZpbmQoJ3ZhbHVlcycpCisgICAgICAgICAgICAgICAgaWYgdmFsdWVzX25vZGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGZvciB2YWx1ZSBpbiB2YWx1ZXNfbm9kZS5maW5kYWxsKCd2YWx1ZScpOgorICAgICAgICAgICAgICAgICAgICAgICAgY3JpdGVyaW9uX3ZhbHVlcy5hcHBlbmQodmFsdWUuZ2V0KCdsaXRlcmFsJykpCisKKyAgICAgICAgICAgICAgICBpZiBsZW4oY3JpdGVyaW9uX3ZhbHVlcykgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgY3JpdGVyaW9uX3ZhbHVlcy5hcHBlbmQoJycpCisKKyAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oIkltcG9ydGluZyBjcml0ZXJpb25fdHlwZV9uYW1lIHt9Ii5mb3JtYXQoY3JpdGVyaW9uX3R5cGVfbmFtZSkpCisgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJJbXBvcnRpbmcgY3JpdGVyaW9uX2luY2x1c2l2ZW5lc3Mge30iLmZvcm1hdChjcml0ZXJpb25faW5jbHVzaXZlbmVzcykpCisgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJJbXBvcnRpbmcgY3JpdGVyaW9uX3ZhbHVlcyB7fSIuZm9ybWF0KGNyaXRlcmlvbl92YWx1ZXMpKQorCisgICAgICAgICAgICAgICAgYWxsX2NyaXRlcmlhLmFwcGVuZCh7CisgICAgICAgICAgICAgICAgICAgICJuYW1lIiA6IGNyaXRlcmlvbl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAiaW5jbHVzaXZlIiA6IGNyaXRlcmlvbl9pbmNsdXNpdmVuZXNzLAorICAgICAgICAgICAgICAgICAgICAidmFsdWVzIiA6IGNyaXRlcmlvbl92YWx1ZXN9KQorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICByZXR1cm4gYWxsX2NyaXRlcmlhCisKKyMKKyMgUGFyc2VzIHRoZSBFZGQgZmlsZXMgKGFrYSAucGZ3IGV4dGVuc2lvbiBmaWxlKSwgd2hpY2ggaXMgYSBzaW1wbGlmaWVkIGxhbmd1YWdlIHRvIHdyaXRlIHRoZQorIyBwYXJhbWV0ZXIgZnJhbWV3b3JrIHNldHRpbmdzLgorIworZGVmIHBhcnNlRWRkKEVEREZpbGVzKToKKyAgICBwYXJzZWRfZWRkcyA9IFtdCisKKyAgICBmb3IgZWRkX2ZpbGUgaW4gRURERmlsZXM6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJvb3QgPSBFZGRQYXJzZXIuUGFyc2VyKCkucGFyc2UoZWRkX2ZpbGUpCisgICAgICAgIGV4Y2VwdCBFZGRQYXJzZXIuTXlTeW50YXhFcnJvciBhcyBleDoKKyAgICAgICAgICAgIGxvZ2dpbmcuY3JpdGljYWwoc3RyKGV4KSkKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiRVhJVCBPTiBGQUlMVVJFIikKKyAgICAgICAgICAgIGV4aXQoMikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICByb290LnByb3BhZ2F0ZSgpCisgICAgICAgIGV4Y2VwdCBFZGRQYXJzZXIuTXlQcm9wYWdhdGlvbkVycm9yLCBleCA6CisgICAgICAgICAgICBsb2dnaW5nLmNyaXRpY2FsKHN0cihleCkpCisgICAgICAgICAgICBsb2dnaW5nLmluZm8oIkVYSVQgT04gRkFJTFVSRSIpCisgICAgICAgICAgICBleGl0KDEpCisKKyAgICAgICAgcGFyc2VkX2VkZHMuYXBwZW5kKChlZGRfZmlsZS5uYW1lLCByb290KSkKKyAgICByZXR1cm4gcGFyc2VkX2VkZHMKKworIworIyBHZW5lcmF0ZXMgYWxsIHRoZSByZXF1aXJlZCBjb21tYW5kcyB0byBiZSBzZW50IHRvIHRoZSBpbnN0YW5jZSBvZiBwYXJhbWV0ZXItZnJhbWV3b3JrIGxhdW5jaGVkCisjIGF0IHJ1bnRpbWUgdG8gZ2VuZXJhdGUgdGhlIFhNTCBTZXR0aW5ncyBmaWxlLgorIyBJdCB0YWtlcyBhcyBpbnB1dCB0aGUgY29sbGVjdGlvbiBvZiBjcml0ZXJpYSwgdGhlIGRvbWFpbnMgYW5kIHRoZSBzaW1wbGlmaWVkIHNldHRpbmdzIHJlYWQgZnJvbQorIyBwZncuCisjCitkZWYgZ2VuZXJhdGVEb21haW5Db21tYW5kcyhsb2dnaW5nLCBhbGxfY3JpdGVyaWEsIGluaXRpYWxfc2V0dGluZ3MsIHhtbF9kb21haW5fZmlsZXMsIHBhcnNlZF9lZGRzKToKKyAgICAgICAgIyBjcmVhdGUgYW5kIGluamVjdCBhbGwgdGhlIGNyaXRlcmlhCisgICAgICAgIGxvZ2dpbmcuaW5mbygiQ3JlYXRpbmcgYWxsIGNyaXRlcmlhIikKKyAgICAgICAgZm9yIGNyaXRlcmlvbiBpbiBhbGxfY3JpdGVyaWE6CisgICAgICAgICAgICB5aWVsZCBbImNyZWF0ZVNlbGVjdGlvbkNyaXRlcmlvbiIsIGNyaXRlcmlvblsnaW5jbHVzaXZlJ10sCisgICAgICAgICAgICAgICAgICAgY3JpdGVyaW9uWyduYW1lJ11dICsgY3JpdGVyaW9uWyd2YWx1ZXMnXQorCisgICAgICAgIHlpZWxkIFsic3RhcnQiXQorCisgICAgICAgICMgSW1wb3J0IGluaXRpYWwgc2V0dGluZ3MgZmlsZQorICAgICAgICBpZiBpbml0aWFsX3NldHRpbmdzOgorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJJbXBvcnRpbmcgaW5pdGlhbCBzZXR0aW5ncyBmaWxlIHt9Ii5mb3JtYXQoaW5pdGlhbF9zZXR0aW5ncykpCisgICAgICAgICAgICB5aWVsZCBbImltcG9ydERvbWFpbnNXaXRoU2V0dGluZ3NYTUwiLCBpbml0aWFsX3NldHRpbmdzXQorCisgICAgICAgICMgSW1wb3J0IGVhY2ggc3RhbmRhbG9uZSBkb21haW4gZmlsZXMKKyAgICAgICAgZm9yIGRvbWFpbl9maWxlIGluIHhtbF9kb21haW5fZmlsZXM6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oIkltcG9ydGluZyBzaW5nbGUgZG9tYWluIGZpbGUge30iLmZvcm1hdChkb21haW5fZmlsZSkpCisgICAgICAgICAgICB5aWVsZCBbImltcG9ydERvbWFpbldpdGhTZXR0aW5nc1hNTCIsIGRvbWFpbl9maWxlXQorCisgICAgICAgICMgR2VuZXJhdGUgdGhlIHNjcmlwdCBmb3IgZWFjaCBFREQgZmlsZQorICAgICAgICBmb3IgZmlsZW5hbWUsIHBhcnNlZF9lZGQgaW4gcGFyc2VkX2VkZHM6CisgICAgICAgICAgICBsb2dnaW5nLmluZm8oIlRyYW5zbGF0aW5nIGFuZCBpbmplY3RpbmcgRUREIGZpbGUge30iLmZvcm1hdChmaWxlbmFtZSkpCisgICAgICAgICAgICB0cmFuc2xhdG9yID0gUGZ3U2NyaXB0VHJhbnNsYXRvcigpCisgICAgICAgICAgICBwYXJzZWRfZWRkLnRyYW5zbGF0ZSh0cmFuc2xhdG9yKQorICAgICAgICAgICAgZm9yIGNvbW1hbmQgaW4gdHJhbnNsYXRvci5nZXRTY3JpcHQoKToKKyAgICAgICAgICAgICAgICB5aWVsZCBjb21tYW5kCisKKyMKKyMgRW50cnkgcG9pbnQgb2YgdGhlIGRvbWFpbiBnZW5lcmF0b3IuCisjICAgICAgIC1QYXJzZXMgQ3JpdGVyaW9uIHR5cGVzIGFuZCBjcml0ZXJpYSBmaWxlcworIyAgICAgICAtUGFyc2VzIHNldHRpbmdzIHdyaXR0ZW4gaW4gc2ltcGxpZmllZCBwZncgbGFuZ3VhZ2UuCisjICAgICAgIC1MYXVuY2hlcyBhIHBhcmFtZXRlci1mcmFtZXdvcmsKKyMgICAgICAgLVRyYW5zbGF0ZXMgdGhlIHNldHRpbmdzIGludG8gY29tbWFuZCB0aGF0IGNhbiBiZSBpbnRlcnByZXRlZCBieSBwYXJhbWV0ZXItZnJhbWV3b3JrLgorIyAgICAgICAtVXNlIHRoZSBleHBvcnRzIGNvbW1hbmQgYW5kIG91dHB1dCB0aGVtIGluIFhNTCBTZXR0aW5ncyBmaWxlLgorIworZGVmIG1haW4oKToKKyAgICBsb2dnaW5nLnJvb3Quc2V0TGV2ZWwobG9nZ2luZy5JTkZPKQorICAgIGFyZ3MgPSBwYXJzZUFyZ3MoKQorCisgICAgYWxsX2NyaXRlcmlhID0gcGFyc2VDcml0ZXJpYUFuZENyaXRlcmlvblR5cGVzKGFyZ3MuY3JpdGVyaWEsIGFyZ3MuY3JpdGVyaW9udHlwZXMpCisKKyAgICAjCisgICAgIyBFREQgZmlsZXMgKGFrYSAiLnBmdyIgZmlsZXMpCisgICAgIworICAgIHBhcnNlZF9lZGRzID0gcGFyc2VFZGQoYXJncy5lZGRfZmlsZXMpCisKKyAgICAjIFdlIG5lZWQgdG8gbW9kaWZ5IHRoZSB0b3BsZXZlbCBjb25maWd1cmF0aW9uIGZpbGUgdG8gYWNjb3VudCBmb3IgZGlmZmVyZW5jZXMKKyAgICAjIGJldHdlZW4gZGV2ZWxvcG1lbnQgc2V0dXAgYW5kIHRhcmdldCAoaW5zdGFsbGF0aW9uKSBzZXR1cCwgaW4gcGFydGljdWxhciwgdGhlCisgICAgIyBUdW5pbmdNd2l0aCBvZGUgbXVzdCBiZSBlbmZvcmNlZCwgcmVnYXJkbGVzcyBvZiB3aGF0IHdpbGwgYmUgYWxsb3dlZCBvbiB0aGUgdGFyZ2V0CisgICAgZmFrZV90b3BsZXZlbF9jb25maWcgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUobW9kZT0ndycsIGRlbGV0ZT1GYWxzZSwgc3VmZml4PSIueG1sIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXg9IlRNUGRvbWFpbkdlbmVyYXRvclBGQ29uZmlnXyIpCisKKyAgICBpbnN0YWxsX3BhdGggPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5yZWFscGF0aChhcmdzLnRvcGxldmVsX2NvbmZpZykpCisgICAgaG9zdENvbmZpZy5jb25maWd1cmUoCisgICAgICAgICAgICBpbmZpbGU9YXJncy50b3BsZXZlbF9jb25maWcsCisgICAgICAgICAgICBvdXRmaWxlPWZha2VfdG9wbGV2ZWxfY29uZmlnLAorICAgICAgICAgICAgc3RydWN0UGF0aD1pbnN0YWxsX3BhdGgpCisgICAgZmFrZV90b3BsZXZlbF9jb25maWcuY2xvc2UoKQorCisgICAgIyBDcmVhdGUgdGhlIGNvbm5lY3Rvci4gUGlwZSBpdHMgaW5wdXQgdG8gdXMgaW4gb3JkZXIgdG8gd3JpdGUgY29tbWFuZHM7CisgICAgIyBjb25uZWN0IGl0cyBvdXRwdXQgdG8gc3Rkb3V0IGluIG9yZGVyIHRvIGhhdmUgaXQgZHVtcCB0aGUgZG9tYWlucworICAgICMgdGhlcmU7IGNvbm5lY3QgaXRzIGVycm9yIG91dHB1dCB0byBzdGRlcnIuCisgICAgY29ubmVjdG9yID0gc3VicHJvY2Vzcy5Qb3BlbihbImRvbWFpbkdlbmVyYXRvckNvbm5lY3RvciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFrZV90b3BsZXZlbF9jb25maWcubmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAndmVyYm9zZScgaWYgYXJncy52ZXJib3NlIGVsc2UgJ25vLXZlcmJvc2UnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2YWxpZGF0ZScgaWYgYXJncy52YWxpZGF0ZSBlbHNlICduby12YWxpZGF0ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5zY2hlbWFzX2Rpcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGRvdXQ9c3lzLnN0ZG91dCwgc3RkaW49c3VicHJvY2Vzcy5QSVBFLCBzdGRlcnI9c3lzLnN0ZGVycikKKworICAgIGluaXRpYWxfc2V0dGluZ3MgPSBOb25lCisgICAgaWYgYXJncy5pbml0aWFsX3NldHRpbmdzOgorICAgICAgICBpbml0aWFsX3NldHRpbmdzID0gb3MucGF0aC5yZWFscGF0aChhcmdzLmluaXRpYWxfc2V0dGluZ3MpCisKKyAgICBmb3IgY29tbWFuZCBpbiBnZW5lcmF0ZURvbWFpbkNvbW1hbmRzKGxvZ2dpbmcsIGFsbF9jcml0ZXJpYSwgaW5pdGlhbF9zZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MueG1sX2RvbWFpbl9maWxlcywgcGFyc2VkX2VkZHMpOgorICAgICAgICBjb25uZWN0b3Iuc3RkaW4ud3JpdGUoJ1wwJy5qb2luKGNvbW1hbmQpKQorICAgICAgICBjb25uZWN0b3Iuc3RkaW4ud3JpdGUoIlxuIikKKworICAgICMgQ2xvc2luZyB0aGUgY29ubmVjdG9yJ3MgaW5wdXQgdHJpZ2dlcnMgdGhlIGRvbWFpbiBnZW5lcmF0aW9uCisgICAgY29ubmVjdG9yLnN0ZGluLmNsb3NlKCkKKyAgICBjb25uZWN0b3Iud2FpdCgpCisgICAgb3MucmVtb3ZlKGZha2VfdG9wbGV2ZWxfY29uZmlnLm5hbWUpCisgICAgcmV0dXJuIGNvbm5lY3Rvci5yZXR1cm5jb2RlCisKKyMgSWYgdGhpcyBmaWxlIGlzIGRpcmVjdGx5IGV4ZWN1dGVkCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHN5cy5leGl0KG1haW4oKSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9wcm92aXNpb25fY3JpdGVyaW9uX3R5cGVzX2Zyb21fYW5kcm9pZF9oZWFkZXJzLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL3Byb3Zpc2lvbl9jcml0ZXJpb25fdHlwZXNfZnJvbV9hbmRyb2lkX2hlYWRlcnMubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGFiNWEwZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9wcm92aXNpb25fY3JpdGVyaW9uX3R5cGVzX2Zyb21fYW5kcm9pZF9oZWFkZXJzLm1rCkBAIC0wLDAgKzEsMjUgQEAKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUyArPSBcCisgICAgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYnVpbGRQb2xpY3lDcml0ZXJpb25UeXBlcy5weSBcCisgICAgJChDUklURVJJT05fVFlQRVNfRklMRSkgJChBVURJT19QT0xJQ1lfQ09ORklHVVJBVElPTl9GSUxFKSBcCisgICAgJChBTkRST0lEX0FVRElPX0JBU0VfSEVBREVSX0ZJTEUpCisKK2luY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKKworJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBNWV9DUklURVJJT05fVFlQRVNfRklMRSA6PSAkKENSSVRFUklPTl9UWVBFU19GSUxFKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBNWV9BTkRST0lEX0FVRElPX0JBU0VfSEVBREVSX0ZJTEUgOj0gJChBTkRST0lEX0FVRElPX0JBU0VfSEVBREVSX0ZJTEUpCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IE1ZX0FVRElPX1BPTElDWV9DT05GSUdVUkFUSU9OX0ZJTEUgOj0gJChBVURJT19QT0xJQ1lfQ09ORklHVVJBVElPTl9GSUxFKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBNWV9DUklURVJJT05fVE9PTCA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9idWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5CiskKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMpCisKKwkiJChNWV9DUklURVJJT05fVE9PTCkiIFwKKwkJLS1hbmRyb2lkYXVkaW9iYXNlaGVhZGVyICIkKE1ZX0FORFJPSURfQVVESU9fQkFTRV9IRUFERVJfRklMRSkiIFwKKwkJLS1hdWRpb3BvbGljeWNvbmZpZ3VyYXRpb25maWxlICIkKE1ZX0FVRElPX1BPTElDWV9DT05GSUdVUkFUSU9OX0ZJTEUpIiBcCisJCS0tY3JpdGVyaW9udHlwZXMgIiQoTVlfQ1JJVEVSSU9OX1RZUEVTX0ZJTEUpIiBcCisJCS0tb3V0cHV0ZmlsZSAiJChAKSIKKworIyBDbGVhciB2YXJpYWJsZXMgZm9yIGZ1cnRoZXIgdXNlCitDUklURVJJT05fVFlQRVNfRklMRSA6PQorQU5EUk9JRF9BVURJT19CQVNFX0hFQURFUl9GSUxFIDo9CitBVURJT19QT0xJQ1lfQ09ORklHVVJBVElPTl9GSUxFIDo9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvcHJvdmlzaW9uX3N0cmF0ZWdpZXNfc3RydWN0dXJlLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL3Byb3Zpc2lvbl9zdHJhdGVnaWVzX3N0cnVjdHVyZS5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmIxYTE5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL3Byb3Zpc2lvbl9zdHJhdGVnaWVzX3N0cnVjdHVyZS5tawpAQCAtMCwwICsxLDIxIEBACitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgKz0gXAorICAgICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2J1aWxkU3RyYXRlZ2llc1N0cnVjdHVyZUZpbGUucHkgXAorICAgICQoU1RSQVRFR0lFU19TVFJVQ1RVUkVfRklMRSkgJChBVURJT19QT0xJQ1lfRU5HSU5FX0NPTkZJR1VSQVRJT05fRklMRSkKKworaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5taworCiskKExPQ0FMX0JVSUxUX01PRFVMRSk6IE1ZX1NUUkFURUdJRVNfU1RSVUNUVVJFX0ZJTEUgOj0gJChTVFJBVEVHSUVTX1NUUlVDVFVSRV9GSUxFKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBNWV9BVURJT19QT0xJQ1lfRU5HSU5FX0NPTkZJR1VSQVRJT05fRklMRSA6PSAkKEFVRElPX1BPTElDWV9FTkdJTkVfQ09ORklHVVJBVElPTl9GSUxFKQorJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBNWV9QUk9WSVNJT05fVE9PTCA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9idWlsZFN0cmF0ZWdpZXNTdHJ1Y3R1cmVGaWxlLnB5CiskKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMpCisKKwkiJChNWV9QUk9WSVNJT05fVE9PTCkiIFwKKwkJLS1hdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYXRpb25maWxlICIkKE1ZX0FVRElPX1BPTElDWV9FTkdJTkVfQ09ORklHVVJBVElPTl9GSUxFKSIgXAorCQktLXByb2R1Y3RzdHJhdGVnaWVzc3RydWN0dXJlZmlsZSAiJChNWV9TVFJBVEVHSUVTX1NUUlVDVFVSRV9GSUxFKSIgXAorCQktLW91dHB1dGZpbGUgIiQoQCkiCisKKyMgQ2xlYXIgdmFyaWFibGVzIGZvciBmdXJ0aGVyIHVzZQorU1RSQVRFR0lFU19TVFJVQ1RVUkVfRklMRSA6PQorQVVESU9fUE9MSUNZX0VOR0lORV9DT05GSUdVUkFUSU9OX0ZJTEUgOj0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmNTk0ODcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjEgQEAKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJhdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYWJsZV9wZnd3cmFwcGVyIiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBzcmNzOiBbIlBhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmNwcCJdLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAorICAgICAgICAibGliYXVkaW9wb2xpY3ljb21tb24iLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsibGliYXVkaW9wb2xpY3ljb21wb25lbnRzIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAorICAgICAgICAibGlicGFyYW1ldGVyIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZTBmNDIuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgV1JBUFBFUiBMSUJSQVJZCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoTE9DQUxfUEFUSCkvaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L3V0aWxpdGllcy9jb252ZXJ0IFwKLQotTE9DQUxfU1JDX0ZJTEVTOj0gUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYnBhcmFtZXRlciBcCi0gICAgbGlibWVkaWFfaGVscGVyCi0KLUxPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCi0KLUxPQ0FMX01PRFVMRTo9IGxpYmF1ZGlvcG9saWN5cGZ3d3JhcHBlcgotTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ESVJTIDo9ICQoTE9DQUxfUEFUSCkvaW5jbHVkZQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IgLVdleHRyYQotCi1pbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDT05GSUdVUkFUSU9OIEZJTEUKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIHNwZWNpZmljIG1hbmFnZW1lbnQgb2YgYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IGF1ZGlvX3BvbGljeV9jcml0ZXJpYS5jb25mCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0VUQykKLUxPQ0FMX1NSQ19GSUxFUyA6PSBjb25maWcvJChMT0NBTF9NT0RVTEUpCi1pbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5jcHAKaW5kZXggOWIwNDQyZS4uNGI1NzQ0NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmNwcApAQCAtMTgsNyArMTgsNiBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCiAjaW5jbHVkZSAiUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuaCIKLSNpbmNsdWRlICJhdWRpb19wb2xpY3lfY3JpdGVyaWFfY29uZi5oIgogI2luY2x1ZGUgPFBhcmFtZXRlck1nclBsYXRmb3JtQ29ubmVjdG9yLmg+CiAjaW5jbHVkZSA8U2VsZWN0aW9uQ3JpdGVyaW9uVHlwZUludGVyZmFjZS5oPgogI2luY2x1ZGUgPFNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZS5oPgpAQCAtNTYsMTUgKzU1LDM3IEBACiAgICAgfQogfTsKIAotbmFtZXNwYWNlIGFuZHJvaWQKLXsKK25hbWVzcGFjZSBhbmRyb2lkIHsKIAogdXNpbmcgdXRpbGl0aWVzOjpjb252ZXJ0VG87CiAKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kgeworCiBjb25zdCBjaGFyICpjb25zdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6bVBvbGljeVBmd0RlZmF1bHRDb25mRmlsZU5hbWUgPQogICAgICIvZXRjL3BhcmFtZXRlci1mcmFtZXdvcmsvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwiOworY29uc3QgY2hhciAqY29uc3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6Om1Qb2xpY3lQZndWZW5kb3JDb25mRmlsZU5hbWUgPQorICAgICIvdmVuZG9yL2V0Yy9wYXJhbWV0ZXItZnJhbWV3b3JrL1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sIjsKKworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGdJbnB1dERldmljZUNyaXRlcmlvbk5hbWUgPSAiQXZhaWxhYmxlSW5wdXREZXZpY2VzIjsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBnT3V0cHV0RGV2aWNlQ3JpdGVyaW9uTmFtZSA9ICJBdmFpbGFibGVPdXRwdXREZXZpY2VzIjsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBnUGhvbmVTdGF0ZUNyaXRlcmlvbk5hbWUgPSAiVGVsZXBob255TW9kZSI7CitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZ091dHB1dERldmljZUFkZHJlc3NDcml0ZXJpb25OYW1lID0gIkF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMiOworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGdJbnB1dERldmljZUFkZHJlc3NDcml0ZXJpb25OYW1lID0gIkF2YWlsYWJsZUlucHV0RGV2aWNlc0FkZHJlc3NlcyI7CisKKy8qKgorICogT3JkZXIgTVVTVCBiZSBhbGlnbiB3aXRoIGRlZmludGlpb24gb2YgYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHdpdGhpbiBhdWRpb19wb2xpY3kuaAorICovCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZ0ZvcmNlVXNlQ3JpdGVyaW9uVGFnW0FVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UXSA9Cit7CisgICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0gPSAgICAgICAgIkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiIsCisgICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdID0gICAgICAgICAgICAgICAgIkZvcmNlVXNlRm9yTWVkaWEiLAorICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRF0gPSAgICAgICAgICAgICAgICJGb3JjZVVzZUZvclJlY29yZCIsCisgICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfRE9DS10gPSAgICAgICAgICAgICAgICAgIkZvcmNlVXNlRm9yRG9jayIsCisgICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNXSA9ICAgICAgICAgICAgICAgIkZvcmNlVXNlRm9yU3lzdGVtIiwKKyAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9IRE1JX1NZU1RFTV9BVURJT10gPSAgICAiRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8iLAorICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkRdID0gICAgICJGb3JjZVVzZUZvckVuY29kZWRTdXJyb3VuZCIsCisgICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfVklCUkFURV9SSU5HSU5HXSA9ICAgICAgIkZvcmNlVXNlRm9yVmlicmF0ZVJpbmdpbmciCit9OwogCiB0ZW1wbGF0ZSA8Pgogc3RydWN0IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpwYXJhbWV0ZXJNYW5hZ2VyRWxlbWVudFN1cHBvcnRlZDxJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlPiB7fTsKQEAgLTc1LDE4ICs5Niw0MyBAQAogICAgIDogbVBmd0Nvbm5lY3RvckxvZ2dlcihuZXcgUGFyYW1ldGVyTWdyUGxhdGZvcm1Db25uZWN0b3JMb2dnZXIpCiB7CiAgICAgLy8gQ29ubmVjdG9yCi0gICAgbVBmd0Nvbm5lY3RvciA9IG5ldyBDUGFyYW1ldGVyTWdyUGxhdGZvcm1Db25uZWN0b3IobVBvbGljeVBmd0RlZmF1bHRDb25mRmlsZU5hbWUpOworICAgIGlmIChhY2Nlc3MobVBvbGljeVBmd1ZlbmRvckNvbmZGaWxlTmFtZSwgUl9PSykgPT0gMCkgeworICAgICAgICBtUGZ3Q29ubmVjdG9yID0gbmV3IENQYXJhbWV0ZXJNZ3JQbGF0Zm9ybUNvbm5lY3RvcihtUG9saWN5UGZ3VmVuZG9yQ29uZkZpbGVOYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtUGZ3Q29ubmVjdG9yID0gbmV3IENQYXJhbWV0ZXJNZ3JQbGF0Zm9ybUNvbm5lY3RvcihtUG9saWN5UGZ3RGVmYXVsdENvbmZGaWxlTmFtZSk7CisgICAgfQogCiAgICAgLy8gTG9nZ2VyCiAgICAgbVBmd0Nvbm5lY3Rvci0+c2V0TG9nZ2VyKG1QZndDb25uZWN0b3JMb2dnZXIpOworfQogCi0gICAgLy8gTG9hZCBjcml0ZXJpYSBmaWxlCi0gICAgaWYgKChsb2FkQXVkaW9Qb2xpY3lDcml0ZXJpYUNvbmZpZyhnQXVkaW9Qb2xpY3lDcml0ZXJpYVZlbmRvckNvbmZGaWxlUGF0aCkgIT0gTk9fRVJST1IpICYmCi0gICAgICAgIChsb2FkQXVkaW9Qb2xpY3lDcml0ZXJpYUNvbmZpZyhnQXVkaW9Qb2xpY3lDcml0ZXJpYUNvbmZGaWxlUGF0aCkgIT0gTk9fRVJST1IpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTmVpdGhlciB2ZW5kb3IgY29uZiBmaWxlICglcykgbm9yIHN5c3RlbSBjb25mIGZpbGUgKCVzKSBjb3VsZCBiZSBmb3VuZCIsCi0gICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZ0F1ZGlvUG9saWN5Q3JpdGVyaWFWZW5kb3JDb25mRmlsZVBhdGgsCi0gICAgICAgICAgICAgIGdBdWRpb1BvbGljeUNyaXRlcmlhQ29uZkZpbGVQYXRoKTsKK3N0YXR1c190IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjphZGRDcml0ZXJpb24oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGJvb2wgaXNJbmNsdXNpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlUGFpcnMgcGFpcnMsIGNvbnN0IHN0ZDo6c3RyaW5nICZkZWZhdWx0VmFsdWUpCit7CisgICAgQUxPR19BU1NFUlQobm90IGlzU3RhcnRlZCgpLCAiQ2Fubm90IGFkZCBhIGNyaXRlcmlvbiBpZiBQRlcgaXMgYWxyZWFkeSBzdGFydGVkIik7CisgICAgYXV0byBjcml0ZXJpb25UeXBlID0gbVBmd0Nvbm5lY3Rvci0+Y3JlYXRlU2VsZWN0aW9uQ3JpdGVyaW9uVHlwZShpc0luY2x1c2l2ZSk7CisKKyAgICBmb3IgKGF1dG8gcGFpciA6IHBhaXJzKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGVycm9yOworICAgICAgICBBTE9HVigiJXM6IEFkZGluZyBwYWlyICVkLCVzIGZvciBjcml0ZXJpb25UeXBlICVzIiwgX19GVU5DVElPTl9fLCBwYWlyLmZpcnN0LAorICAgICAgICAgICAgICBwYWlyLnNlY29uZC5jX3N0cigpLCBuYW1lLmNfc3RyKCkpOworICAgICAgICBjcml0ZXJpb25UeXBlLT5hZGRWYWx1ZVBhaXIocGFpci5maXJzdCwgcGFpci5zZWNvbmQsIGVycm9yKTsKICAgICB9CisgICAgQUxPR19BU1NFUlQobVBvbGljeUNyaXRlcmlhLmZpbmQobmFtZSkgPT0gbVBvbGljeUNyaXRlcmlhLmVuZCgpLAorICAgICAgICAgICAgICAgICIlczogQ3JpdGVyaW9uICVzIGFscmVhZHkgYWRkZWQiLCBfX0ZVTkNUSU9OX18sIG5hbWUuY19zdHIoKSk7CisKKyAgICBhdXRvIGNyaXRlcmlvbiA9IG1QZndDb25uZWN0b3ItPmNyZWF0ZVNlbGVjdGlvbkNyaXRlcmlvbihuYW1lLCBjcml0ZXJpb25UeXBlKTsKKyAgICBtUG9saWN5Q3JpdGVyaWFbbmFtZV0gPSBjcml0ZXJpb247CisKKyAgICBpZiAobm90IGRlZmF1bHRWYWx1ZS5lbXB0eSgpKSB7CisgICAgICAgIGludCBudW1lcmljYWxWYWx1ZSA9IDA7CisgICAgICAgIGlmIChub3QgY3JpdGVyaW9uVHlwZS0+Z2V0TnVtZXJpY2FsVmFsdWUoZGVmYXVsdFZhbHVlLmNfc3RyKCksIG51bWVyaWNhbFZhbHVlKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOyB0cnlpbmcgdG8gYXBwbHkgaW52YWxpZCBkZWZhdWx0IGxpdGVyYWwgdmFsdWUgKCVzKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICBjcml0ZXJpb24tPnNldENyaXRlcmlvblN0YXRlKG51bWVyaWNhbFZhbHVlKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6flBhcmFtZXRlck1hbmFnZXJXcmFwcGVyKCkKQEAgLTExMiwxMTIgKzE1OCw2IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi0KLXZvaWQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmFkZENyaXRlcmlvblR5cGUoY29uc3Qgc3RyaW5nICZ0eXBlTmFtZSwgYm9vbCBpc0luY2x1c2l2ZSkKLXsKLSAgICBBTE9HX0FTU0VSVChtUG9saWN5Q3JpdGVyaW9uVHlwZXMuZmluZCh0eXBlTmFtZSkgPT0gbVBvbGljeUNyaXRlcmlvblR5cGVzLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICJDcml0ZXJpb25UeXBlICVzIGFscmVhZHkgYWRkZWQiLCB0eXBlTmFtZS5jX3N0cigpKTsKLSAgICBBTE9HRCgiJXM6IEFkZGluZyBuZXcgY3JpdGVyaW9uVHlwZSAlcyIsIF9fRlVOQ1RJT05fXywgdHlwZU5hbWUuY19zdHIoKSk7Ci0KLSAgICBtUG9saWN5Q3JpdGVyaW9uVHlwZXNbdHlwZU5hbWVdID0gbVBmd0Nvbm5lY3Rvci0+Y3JlYXRlU2VsZWN0aW9uQ3JpdGVyaW9uVHlwZShpc0luY2x1c2l2ZSk7Ci19Ci0KLXZvaWQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmFkZENyaXRlcmlvblR5cGVWYWx1ZVBhaXIoCi0gICAgY29uc3Qgc3RyaW5nICZ0eXBlTmFtZSwKLSAgICB1aW50MzJfdCBudW1lcmljVmFsdWUsCi0gICAgY29uc3Qgc3RyaW5nICZsaXRlcmFsVmFsdWUpCi17Ci0gICAgQUxPR19BU1NFUlQobVBvbGljeUNyaXRlcmlvblR5cGVzLmZpbmQodHlwZU5hbWUpICE9IG1Qb2xpY3lDcml0ZXJpb25UeXBlcy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAiQ3JpdGVyaW9uVHlwZSAlcyBub3QgZm91bmQiLCB0eXBlTmFtZS5jX3N0cigpKTsKLSAgICBBTE9HVigiJXM6IEFkZGluZyBuZXcgdmFsdWUgcGFpciAoJWQsJXMpIGZvciBjcml0ZXJpb25UeXBlICVzIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgIG51bWVyaWNWYWx1ZSwgbGl0ZXJhbFZhbHVlLmNfc3RyKCksIHR5cGVOYW1lLmNfc3RyKCkpOwotICAgIElTZWxlY3Rpb25Dcml0ZXJpb25UeXBlSW50ZXJmYWNlICpjcml0ZXJpb25UeXBlID0gbVBvbGljeUNyaXRlcmlvblR5cGVzW3R5cGVOYW1lXTsKLSAgICBzdGQ6OnN0cmluZyBlcnJvcjsKLSAgICBjcml0ZXJpb25UeXBlLT5hZGRWYWx1ZVBhaXIobnVtZXJpY1ZhbHVlLCBsaXRlcmFsVmFsdWUsIGVycm9yKTsKLX0KLQotdm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6bG9hZENyaXRlcmlvblR5cGUoY25vZGUgKnJvb3QsIGJvb2wgaXNJbmNsdXNpdmUpCi17Ci0gICAgQUxPR19BU1NFUlQocm9vdCAhPSBOVUxMLCAiZXJyb3IgaW4gcGFyc2luZyBmaWxlIik7Ci0gICAgY25vZGUgKm5vZGU7Ci0gICAgZm9yIChub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7IG5vZGUgIT0gTlVMTDsgbm9kZSA9IG5vZGUtPm5leHQpIHsKLQotICAgICAgICBBTE9HX0FTU0VSVChub2RlICE9IE5VTEwsICJlcnJvciBpbiBwYXJzaW5nIGZpbGUiKTsKLSAgICAgICAgY29uc3QgY2hhciAqdHlwZU5hbWUgPSBub2RlLT5uYW1lOwotICAgICAgICBjaGFyICp2YWx1ZU5hbWVzID0gc3RybmR1cChub2RlLT52YWx1ZSwgc3RybGVuKG5vZGUtPnZhbHVlKSk7Ci0KLSAgICAgICAgYWRkQ3JpdGVyaW9uVHlwZSh0eXBlTmFtZSwgaXNJbmNsdXNpdmUpOwotCi0gICAgICAgIHVpbnQzMl90IGluZGV4ID0gMDsKLSAgICAgICAgY2hhciAqY3R4OwotICAgICAgICBjaGFyICp2YWx1ZU5hbWUgPSBzdHJ0b2tfcih2YWx1ZU5hbWVzLCAiLCIsICZjdHgpOwotICAgICAgICB3aGlsZSAodmFsdWVOYW1lICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGlmIChzdHJsZW4odmFsdWVOYW1lKSAhPSAwKSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBDb25mIGZpbGUgbWF5IHVzZSBvciBub3QgcGFpciwgaWYgbm8gcGFpciwgdXNlIGluY3JlbWVudGFsIGluZGV4LCBlbHNlCi0gICAgICAgICAgICAgICAgLy8gdXNlIHByb3ZpZGVkIGluZGV4LgotICAgICAgICAgICAgICAgIGlmIChzdHJjaHIodmFsdWVOYW1lLCAnOicpICE9IE5VTEwpIHsKLQotICAgICAgICAgICAgICAgICAgICBjaGFyICpmaXJzdCA9IHN0cnRvayh2YWx1ZU5hbWUsICI6Iik7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgKnNlY29uZCA9IHN0cnRvayhOVUxMLCAiOiIpOwotICAgICAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVCgoZmlyc3QgIT0gTlVMTCkgJiYgKHN0cmxlbihmaXJzdCkgIT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlY29uZCAhPSBOVUxMKSAmJiAoc3RybGVuKHNlY29uZCkgIT0gMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnZhbGlkIHZhbHVlIHBhaXIiKTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnZlcnRUbzxzdHJpbmcsIHVpbnQzMl90PihmaXJzdCwgaW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgaW5kZXgoJXMpIGZvdW5kIiwgX19GVU5DVElPTl9fLCBmaXJzdCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYWRkQ3JpdGVyaW9uVHlwZVZhbHVlUGFpcih0eXBlTmFtZSwgaW5kZXgsIHNlY29uZCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLQotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwZndJbmRleCA9IGlzSW5jbHVzaXZlID8gMSA8PCBpbmRleCA6IGluZGV4OwotICAgICAgICAgICAgICAgICAgICBhZGRDcml0ZXJpb25UeXBlVmFsdWVQYWlyKHR5cGVOYW1lLCBwZndJbmRleCwgdmFsdWVOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YWx1ZU5hbWUgPSBzdHJ0b2tfcihOVUxMLCAiLCIsICZjdHgpOwotICAgICAgICB9Ci0gICAgICAgIGZyZWUodmFsdWVOYW1lcyk7Ci0gICAgfQotfQotCi12b2lkIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpsb2FkSW5jbHVzaXZlQ3JpdGVyaW9uVHlwZShjbm9kZSAqcm9vdCkKLXsKLSAgICBBTE9HX0FTU0VSVChyb290ICE9IE5VTEwsICJlcnJvciBpbiBwYXJzaW5nIGZpbGUiKTsKLSAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIGdJbmNsdXNpdmVDcml0ZXJpb25UeXBlVGFnLmNfc3RyKCkpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsb2FkQ3JpdGVyaW9uVHlwZShub2RlLCB0cnVlKTsKLX0KLQotdm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6bG9hZEV4Y2x1c2l2ZUNyaXRlcmlvblR5cGUoY25vZGUgKnJvb3QpCi17Ci0gICAgQUxPR19BU1NFUlQocm9vdCAhPSBOVUxMLCAiZXJyb3IgaW4gcGFyc2luZyBmaWxlIik7Ci0gICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBnRXhjbHVzaXZlQ3JpdGVyaW9uVHlwZVRhZy5jX3N0cigpKTsKLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbG9hZENyaXRlcmlvblR5cGUobm9kZSwgZmFsc2UpOwotfQotCi12b2lkIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpwYXJzZUNoaWxkcmVuKGNub2RlICpyb290LCBzdHJpbmcgJmRlZmF1bHRWYWx1ZSwgc3RyaW5nICZ0eXBlKQotewotICAgIEFMT0dfQVNTRVJUKHJvb3QgIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZSIpOwotICAgIGNub2RlICpub2RlOwotICAgIGZvciAobm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOyBub2RlICE9IE5VTEw7IG5vZGUgPSBub2RlLT5uZXh0KSB7Ci0gICAgICAgIEFMT0dfQVNTRVJUKG5vZGUgIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZSIpOwotCi0gICAgICAgIGlmIChzdHJpbmcobm9kZS0+bmFtZSkgPT0gZ0RlZmF1bHRUYWcpIHsKLSAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IG5vZGUtPnZhbHVlOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmluZyhub2RlLT5uYW1lKSA9PSBnVHlwZVRhZykgewotICAgICAgICAgICAgdHlwZSA9IG5vZGUtPnZhbHVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgIEFMT0dFKCIlczogVW5yZWNvZ25pemVkICVzICVzIG5vZGUiLCBfX0ZVTkNUSU9OX18sIG5vZGUtPm5hbWUsIG5vZGUtPnZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiBUICpQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6Z2V0RWxlbWVudChjb25zdCBzdHJpbmcgJm5hbWUsIHN0ZDo6bWFwPHN0cmluZywgVCAqPiAmZWxlbWVudHNNYXApCiB7CkBAIC0yMzYsOTcgKzE3Niw2IEBACiAgICAgcmV0dXJuIGl0ICE9IGVsZW1lbnRzTWFwLmVuZCgpID8gaXQtPnNlY29uZCA6IE5VTEw7CiB9CiAKLXZvaWQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmxvYWRDcml0ZXJpYShjbm9kZSAqcm9vdCkKLXsKLSAgICBBTE9HX0FTU0VSVChyb290ICE9IE5VTEwsICJlcnJvciBpbiBwYXJzaW5nIGZpbGUiKTsKLSAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIGdDcml0ZXJpb25UYWcuY19zdHIoKSk7Ci0KLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCIlczogbm8gaW5jbHVzaXZlIGNyaXRlcmlhIGZvdW5kIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmb3IgKG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsgbm9kZSAhPSBOVUxMOyBub2RlID0gbm9kZS0+bmV4dCkgewotICAgICAgICBsb2FkQ3JpdGVyaW9uKG5vZGUpOwotICAgIH0KLX0KLQotdm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6YWRkQ3JpdGVyaW9uKGNvbnN0IHN0cmluZyAmbmFtZSwgY29uc3Qgc3RyaW5nICZ0eXBlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyAmZGVmYXVsdExpdGVyYWxWYWx1ZSkKLXsKLSAgICBBTE9HX0FTU0VSVChtUG9saWN5Q3JpdGVyaWEuZmluZChuYW1lKSA9PSBtUG9saWN5Q3JpdGVyaWEuZW5kKCksCi0gICAgICAgICAgICAgICAgIlJvdXRlIENyaXRlcmlvbiAlcyBhbHJlYWR5IGFkZGVkIiwgbmFtZS5jX3N0cigpKTsKLQotICAgIElTZWxlY3Rpb25Dcml0ZXJpb25UeXBlSW50ZXJmYWNlICpjcml0ZXJpb25UeXBlID0KLSAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvblR5cGVJbnRlcmZhY2U+KHR5cGVOYW1lLCBtUG9saWN5Q3JpdGVyaW9uVHlwZXMpOwotCi0gICAgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqY3JpdGVyaW9uID0KLSAgICAgICAgICAgIG1QZndDb25uZWN0b3ItPmNyZWF0ZVNlbGVjdGlvbkNyaXRlcmlvbihuYW1lLCBjcml0ZXJpb25UeXBlKTsKLQotICAgIG1Qb2xpY3lDcml0ZXJpYVtuYW1lXSA9IGNyaXRlcmlvbjsKLSAgICBpbnQgbnVtZXJpY2FsVmFsdWUgPSAwOwotICAgIGlmICghY3JpdGVyaW9uVHlwZS0+Z2V0TnVtZXJpY2FsVmFsdWUoZGVmYXVsdExpdGVyYWxWYWx1ZS5jX3N0cigpLCAgbnVtZXJpY2FsVmFsdWUpKSB7Ci0gICAgICAgIEFMT0dFKCIlczsgdHJ5aW5nIHRvIGFwcGx5IGludmFsaWQgZGVmYXVsdCBsaXRlcmFsIHZhbHVlICglcykiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgIGRlZmF1bHRMaXRlcmFsVmFsdWUuY19zdHIoKSk7Ci0gICAgfQotICAgIGNyaXRlcmlvbi0+c2V0Q3JpdGVyaW9uU3RhdGUobnVtZXJpY2FsVmFsdWUpOwotfQotCi12b2lkIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpsb2FkQ3JpdGVyaW9uKGNub2RlICpyb290KQotewotICAgIEFMT0dfQVNTRVJUKHJvb3QgIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZSIpOwotICAgIGNvbnN0IGNoYXIgKmNyaXRlcmlvbk5hbWUgPSByb290LT5uYW1lOwotCi0gICAgQUxPR19BU1NFUlQobVBvbGljeUNyaXRlcmlhLmZpbmQoY3JpdGVyaW9uTmFtZSkgPT0gbVBvbGljeUNyaXRlcmlhLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICJDcml0ZXJpb24gJXMgYWxyZWFkeSBhZGRlZCIsIGNyaXRlcmlvbk5hbWUpOwotCi0gICAgc3RyaW5nIHBhcmFtS2V5TmFtZSA9ICIiOwotICAgIHN0cmluZyBwYXRoID0gIiI7Ci0gICAgc3RyaW5nIHR5cGVOYW1lID0gIiI7Ci0gICAgc3RyaW5nIGRlZmF1bHRWYWx1ZSA9ICIiOwotCi0gICAgcGFyc2VDaGlsZHJlbihyb290LCBkZWZhdWx0VmFsdWUsIHR5cGVOYW1lKTsKLQotICAgIGFkZENyaXRlcmlvbihjcml0ZXJpb25OYW1lLCB0eXBlTmFtZSwgZGVmYXVsdFZhbHVlKTsKLX0KLQotdm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6bG9hZENvbmZpZyhjbm9kZSAqcm9vdCkKLXsKLSAgICBBTE9HX0FTU0VSVChyb290ICE9IE5VTEwsICJlcnJvciBpbiBwYXJzaW5nIGZpbGUiKTsKLSAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIGdQb2xpY3lDb25mVGFnLmNfc3RyKCkpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coIiVzOiBDb3VsZCBub3QgZmluZCBub2RlIGZvciBwZnciLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEFMT0dEKCIlczogTG9hZGluZyBjb25mIGZvciBwZnciLCBfX0ZVTkNUSU9OX18pOwotICAgIGxvYWRJbmNsdXNpdmVDcml0ZXJpb25UeXBlKG5vZGUpOwotICAgIGxvYWRFeGNsdXNpdmVDcml0ZXJpb25UeXBlKG5vZGUpOwotICAgIGxvYWRDcml0ZXJpYShub2RlKTsKLX0KLQotCi1zdGF0dXNfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6bG9hZEF1ZGlvUG9saWN5Q3JpdGVyaWFDb25maWcoY29uc3QgY2hhciAqcGF0aCkKLXsKLSAgICBBTE9HX0FTU0VSVChwYXRoICE9IE5VTEwsICJlcnJvciBpbiBwYXJzaW5nIGZpbGU6IGVtcHR5IHBhdGgiKTsKLSAgICBjbm9kZSAqcm9vdDsKLSAgICBjaGFyICpkYXRhOwotICAgIEFMT0dEKCIlcyIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgZGF0YSA9IChjaGFyICopbG9hZF9maWxlKHBhdGgsIE5VTEwpOwotICAgIGlmIChkYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJvb3QgPSBjb25maWdfbm9kZSgiIiwgIiIpOwotICAgIEFMT0dfQVNTRVJUKHJvb3QgIT0gTlVMTCwgIlVuYWJsZSB0byBhbGxvY2F0ZSBhIGNvbmZpZ3VyYXRpb24gbm9kZSIpOwotICAgIGNvbmZpZ19sb2FkKHJvb3QsIGRhdGEpOwotCi0gICAgbG9hZENvbmZpZyhyb290KTsKLQotICAgIGNvbmZpZ19mcmVlKHJvb3QpOwotICAgIGZyZWUocm9vdCk7Ci0gICAgZnJlZShkYXRhKTsKLSAgICBBTE9HRCgiJXM6IGxvYWRlZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCiBib29sIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjppc1N0YXJ0ZWQoKQogewogICAgIHJldHVybiBtUGZ3Q29ubmVjdG9yICYmIG1QZndDb25uZWN0b3ItPmlzU3RhcnRlZCgpOwpAQCAtMzM1LDkgKzE4NCw5IEBACiBzdGF0dXNfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6c2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3QgbW9kZSkKIHsKICAgICBJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlICpjcml0ZXJpb24gPQotICAgICAgICAgICAgZ2V0RWxlbWVudDxJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlPihnUGhvbmVTdGF0ZUNyaXRlcmlvblRhZywgbVBvbGljeUNyaXRlcmlhKTsKKyAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4oZ1Bob25lU3RhdGVDcml0ZXJpb25OYW1lLCBtUG9saWN5Q3JpdGVyaWEpOwogICAgIGlmIChjcml0ZXJpb24gPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGdQaG9uZVN0YXRlQ3JpdGVyaW9uVGFnLmNfc3RyKCkpOworICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGdQaG9uZVN0YXRlQ3JpdGVyaW9uTmFtZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIGlmICghaXNWYWx1ZVZhbGlkRm9yQ3JpdGVyaW9uKGNyaXRlcmlvbiwgc3RhdGljX2Nhc3Q8aW50Pihtb2RlKSkpIHsKQEAgLTM1MSw5ICsyMDAsOSBAQAogYXVkaW9fbW9kZV90IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpnZXRQaG9uZVN0YXRlKCkgY29uc3QKIHsKICAgICBjb25zdCBJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlICpjcml0ZXJpb24gPQotICAgICAgICAgICAgZ2V0RWxlbWVudDxJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlPihnUGhvbmVTdGF0ZUNyaXRlcmlvblRhZywgbVBvbGljeUNyaXRlcmlhKTsKKyAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4oZ1Bob25lU3RhdGVDcml0ZXJpb25OYW1lLCBtUG9saWN5Q3JpdGVyaWEpOwogICAgIGlmIChjcml0ZXJpb24gPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGdQaG9uZVN0YXRlQ3JpdGVyaW9uVGFnLmNfc3RyKCkpOworICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGdQaG9uZVN0YXRlQ3JpdGVyaW9uTmFtZSk7CiAgICAgICAgIHJldHVybiBBVURJT19NT0RFX05PUk1BTDsKICAgICB9CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGF1ZGlvX21vZGVfdD4oY3JpdGVyaW9uLT5nZXRDcml0ZXJpb25TdGF0ZSgpKTsKQEAgLTM3MCw3ICsyMTksNyBAQAogICAgIElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKmNyaXRlcmlvbiA9CiAgICAgICAgICAgICBnZXRFbGVtZW50PElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2U+KGdGb3JjZVVzZUNyaXRlcmlvblRhZ1t1c2FnZV0sIG1Qb2xpY3lDcml0ZXJpYSk7CiAgICAgaWYgKGNyaXRlcmlvbiA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCIlczogbm8gY3JpdGVyaW9uIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgZ0ZvcmNlVXNlQ3JpdGVyaW9uVGFnW3VzYWdlXS5jX3N0cigpKTsKKyAgICAgICAgQUxPR0UoIiVzOiBubyBjcml0ZXJpb24gZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCBnRm9yY2VVc2VDcml0ZXJpb25UYWdbdXNhZ2VdKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgaWYgKCFpc1ZhbHVlVmFsaWRGb3JDcml0ZXJpb24oY3JpdGVyaW9uLCBzdGF0aWNfY2FzdDxpbnQ+KGNvbmZpZykpKSB7CkBAIC0zOTAsNyArMjM5LDcgQEAKICAgICBjb25zdCBJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlICpjcml0ZXJpb24gPQogICAgICAgICAgICAgZ2V0RWxlbWVudDxJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlPihnRm9yY2VVc2VDcml0ZXJpb25UYWdbdXNhZ2VdLCBtUG9saWN5Q3JpdGVyaWEpOwogICAgIGlmIChjcml0ZXJpb24gPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGdGb3JjZVVzZUNyaXRlcmlvblRhZ1t1c2FnZV0uY19zdHIoKSk7CisgICAgICAgIEFMT0dFKCIlczogbm8gY3JpdGVyaW9uIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgZ0ZvcmNlVXNlQ3JpdGVyaW9uVGFnW3VzYWdlXSk7CiAgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3Q+KGNyaXRlcmlvbi0+Z2V0Q3JpdGVyaW9uU3RhdGUoKSk7CkBAIC00MDQsMTIgKzI1Myw0NSBAQAogICAgIHJldHVybiBpbnRlcmZhY2UtPmdldExpdGVyYWxWYWx1ZSh2YWx1ZVRvQ2hlY2ssIGxpdGVyYWxWYWx1ZSk7CiB9CiAKK3N0YXR1c190IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKQoreworICAgIHN0ZDo6c3RyaW5nIGNyaXRlcmlvbk5hbWUgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldkRlc2MtPnR5cGUoKSkgPworICAgICAgICAgICAgICAgIGdPdXRwdXREZXZpY2VBZGRyZXNzQ3JpdGVyaW9uTmFtZSA6IGdJbnB1dERldmljZUFkZHJlc3NDcml0ZXJpb25OYW1lOworCisgICAgQUxPR1YoIiVzOiBkZXZpY2Ugd2l0aCBhZGRyZXNzICVzICVzIiwgX19GVU5DVElPTl9fLCBkZXZEZXNjLT5hZGRyZXNzKCkuc3RyaW5nKCksCisgICAgICAgICAgc3RhdGUgIT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEU/ICJkaXNjb25uZWN0ZWQiIDogImNvbm5lY3RlZCIpOworICAgIElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKmNyaXRlcmlvbiA9CisgICAgICAgICAgICBnZXRFbGVtZW50PElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2U+KGNyaXRlcmlvbk5hbWUsIG1Qb2xpY3lDcml0ZXJpYSk7CisKKyAgICBpZiAoY3JpdGVyaW9uID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBubyBjcml0ZXJpb24gZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCBjcml0ZXJpb25OYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorCisgICAgYXV0byBjcml0ZXJpb25UeXBlID0gY3JpdGVyaW9uLT5nZXRDcml0ZXJpb25UeXBlKCk7CisgICAgaW50IGRldmljZUFkZHJlc3NJZDsKKyAgICBpZiAobm90IGNyaXRlcmlvblR5cGUtPmdldE51bWVyaWNhbFZhbHVlKGRldkRlc2MtPmFkZHJlc3MoKS5zdHJpbmcoKSwgZGV2aWNlQWRkcmVzc0lkKSkgeworICAgICAgICBBTE9HVygiJXM6IHVua25vd24gZGV2aWNlIGFkZHJlc3MgcmVwb3J0ZWQgKCVzKSIsIF9fRlVOQ1RJT05fXywgZGV2RGVzYy0+YWRkcmVzcygpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gQkFEX1RZUEU7CisgICAgfQorICAgIGludCBjdXJyZW50VmFsdWVNYXNrID0gY3JpdGVyaW9uLT5nZXRDcml0ZXJpb25TdGF0ZSgpOworICAgIGlmIChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSkgeworICAgICAgICBjdXJyZW50VmFsdWVNYXNrIHw9IGRldmljZUFkZHJlc3NJZDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGN1cnJlbnRWYWx1ZU1hc2sgJj0gfmRldmljZUFkZHJlc3NJZDsKKyAgICB9CisgICAgY3JpdGVyaW9uLT5zZXRDcml0ZXJpb25TdGF0ZShjdXJyZW50VmFsdWVNYXNrKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKIHN0YXR1c190IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpzZXRBdmFpbGFibGVJbnB1dERldmljZXMoYXVkaW9fZGV2aWNlc190IGlucHV0RGV2aWNlcykKIHsKICAgICBJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlICpjcml0ZXJpb24gPQotICAgICAgICAgICAgZ2V0RWxlbWVudDxJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlPihnSW5wdXREZXZpY2VDcml0ZXJpb25UYWcsIG1Qb2xpY3lDcml0ZXJpYSk7CisgICAgICAgICAgICBnZXRFbGVtZW50PElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2U+KGdJbnB1dERldmljZUNyaXRlcmlvbk5hbWUsIG1Qb2xpY3lDcml0ZXJpYSk7CiAgICAgaWYgKGNyaXRlcmlvbiA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCIlczogbm8gY3JpdGVyaW9uIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgZ0lucHV0RGV2aWNlQ3JpdGVyaW9uVGFnLmNfc3RyKCkpOworICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGdJbnB1dERldmljZUNyaXRlcmlvbk5hbWUpOwogICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiAgICAgfQogICAgIGNyaXRlcmlvbi0+c2V0Q3JpdGVyaW9uU3RhdGUoaW5wdXREZXZpY2VzICYgfkFVRElPX0RFVklDRV9CSVRfSU4pOwpAQCAtNDIwLDkgKzMwMiw5IEBACiBzdGF0dXNfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6c2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcyhhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlcykKIHsKICAgICBJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlICpjcml0ZXJpb24gPQotICAgICAgICAgICAgZ2V0RWxlbWVudDxJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlPihnT3V0cHV0RGV2aWNlQ3JpdGVyaW9uVGFnLCBtUG9saWN5Q3JpdGVyaWEpOworICAgICAgICAgICAgZ2V0RWxlbWVudDxJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlPihnT3V0cHV0RGV2aWNlQ3JpdGVyaW9uTmFtZSwgbVBvbGljeUNyaXRlcmlhKTsKICAgICBpZiAoY3JpdGVyaW9uID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBubyBjcml0ZXJpb24gZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCBnT3V0cHV0RGV2aWNlQ3JpdGVyaW9uVGFnLmNfc3RyKCkpOworICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGdPdXRwdXREZXZpY2VDcml0ZXJpb25OYW1lKTsKICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwogICAgIH0KICAgICBjcml0ZXJpb24tPnNldENyaXRlcmlvblN0YXRlKG91dHB1dERldmljZXMpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvYXVkaW9fcG9saWN5X2NyaXRlcmlhX2NvbmYuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2F1ZGlvX3BvbGljeV9jcml0ZXJpYV9jb25mLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0ZmQxNzYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvYXVkaW9fcG9saWN5X2NyaXRlcmlhX2NvbmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyAgICAgIERlZmluaXRpb25zIGZvciBhdWRpbyBwb2xpY3kgY3JpdGVyaWEgY29uZmlndXJhdGlvbiBmaWxlIChhdWRpb19wb2xpY3lfY3JpdGVyaWEuY29uZikgICAvLwotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KLS8vICAgICAgQFRPRE86IHNjcmlwdGVkIGZyb20gYXVkaW8uaCAmIGF1ZGlvX3BvbGljeSxoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZ0F1ZGlvUG9saWN5Q3JpdGVyaWFDb25mRmlsZVBhdGggPQotICAgICIvc3lzdGVtL2V0Yy9hdWRpb19wb2xpY3lfY3JpdGVyaWEuY29uZiI7Ci1zdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZ0F1ZGlvUG9saWN5Q3JpdGVyaWFWZW5kb3JDb25mRmlsZVBhdGggPQotICAgICIvdmVuZG9yL2V0Yy9hdWRpb19wb2xpY3lfY3JpdGVyaWEuY29uZiI7Ci0KLS8qKgotICogUEZXIGluc3RhbmNlcyB0YWdzCi0gKi8KLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmZ1BvbGljeUNvbmZUYWcgPSAiUG9saWN5IjsKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmZ0RlZmF1bHRUYWcgPSAiRGVmYXVsdCI7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJmdUeXBlVGFnID0gIlR5cGUiOwotCi0vKioKLSAqIFBGVyBlbGVtZW50cyB0YWdzCi0gKi8KLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmZ0luY2x1c2l2ZUNyaXRlcmlvblR5cGVUYWcgPSAiSW5jbHVzaXZlQ3JpdGVyaW9uVHlwZSI7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJmdFeGNsdXNpdmVDcml0ZXJpb25UeXBlVGFnID0gIkV4Y2x1c2l2ZUNyaXRlcmlvblR5cGUiOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnQ3JpdGVyaW9uVGFnID0gIkNyaXRlcmlvbiI7Ci0KLS8qKgotICogUEZXIGtub3duIGNyaXRlcmlvbiB0YWdzCi0gKi8KLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmZ0lucHV0RGV2aWNlQ3JpdGVyaW9uVGFnID0gIkF2YWlsYWJsZUlucHV0RGV2aWNlcyI7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJmdPdXRwdXREZXZpY2VDcml0ZXJpb25UYWcgPSAiQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyI7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJmdQaG9uZVN0YXRlQ3JpdGVyaW9uVGFnID0gIlRlbGVwaG9ueU1vZGUiOwotCi0vKioKLSAqIE9yZGVyIE1VU1QgYmUgYWxpZ24gd2l0aCBkZWZpbnRpaW9uIG9mIGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB3aXRoaW4gYXVkaW9fcG9saWN5LmgKLSAqLwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGdGb3JjZVVzZUNyaXRlcmlvblRhZ1tBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVF0gPQotewotICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dID0gICAgICAgICJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iLAotICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBXSA9ICAgICAgICAgICAgICAgICJGb3JjZVVzZUZvck1lZGlhIiwKLSAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkRdID0gICAgICAgICAgICAgICAiRm9yY2VVc2VGb3JSZWNvcmQiLAotICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0tdID0gICAgICAgICAgICAgICAgICJGb3JjZVVzZUZvckRvY2siLAotICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gPSAgICAgICAgICAgICAgICJGb3JjZVVzZUZvclN5c3RlbSIsCi0gICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfSERNSV9TWVNURU1fQVVESU9dID0gICAgIkZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIiwKLSAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5EXSA9ICAgICAiRm9yY2VVc2VGb3JFbmNvZGVkU3Vycm91bmQiLAotICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1ZJQlJBVEVfUklOR0lOR10gPSAgICAgICJGb3JjZVVzZUZvclZpYnJhdGVSaW5naW5nIgotfTsKLQotCi0KLQotCi0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2NvbmZpZy9hdWRpb19wb2xpY3lfY3JpdGVyaWEuY29uZiBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2NvbmZpZy9hdWRpb19wb2xpY3lfY3JpdGVyaWEuY29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQzZDVhNi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9jb25maWcvYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jCi0jIEBOT1RFOgotIyBBdWRpbyBQb2xpY3kgQ3JpdGVyaWEgZmlsZSBleGFtcGxlIGZvciBnZW5lcmljIGRldmljZSBidWlsZAotIwotIyBBbnkgdmVuZG9yIHNoYWxsIGhhdmUgaXRzIG93biBjb25maWd1cmF0aW9uIHdpdGhpbiB0aGUgY29ycmVzcG9uZGluZyBkZXZpY2UgZm9sZGVyCi0jCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENyaXRlcmlvbiB0eXBlIEV4YW1wbGU6Ci0jIEZvciBlYWNoIGNyaXRlcmlvbiwgYSBjb3VwbGUgb2YgbnVtZXJpY2FsLCBsaXRlcmFsIHZhbHVlcyBtdXN0IGJlIHByb3ZpZGVkIHRvIHRoZSBQRlcuCi0jIFRoZSBudW1lcmljYWwgcGFydCBpcyBub3QgbWFuZGF0b3J5LiBJZiBub3QgZmlsbGVkIGJ5IHRoZSB1c2VyLCBhIGRlZmF1bHQgbnVtZXJpY2FsIHZhbHVlIHdpbGwgYmUKLSMgYXV0b21hdGljYWxseSBwcm92aWRlZCBieSBhdWRpbyBIQUwgdXNpbmcgdGhlIGZvbGxvd2luZyBsb2dpYzoKLSMgICAtIEV4Y2x1c2l2ZSBjcml0ZXJpb246Ci0jICAgICAgICAgICogMCAtPiBmaXJzdCBsaXRlcmFsIHZhbHVlLAotIyAgICAgICAgICAqIDEgLT4gc2Vjb25kIGxpdGVyYWwgdmFsdWUsCi0jICAgICAgICAgICAgICAgLi4uCi0jICAgICAgICAgICogTiAtPiAoTisxKXRoIGxpdGVyYWwgdmFsdWUuCi0jICAgLSBJbmNsdXNpdmUgY3JpdGVyaW9uOgotIyAgICAgICAgICAqIDEgPDwgMCAtPiBmaXJzdCBsaXRlcmFsIHZhbHVlLAotIyAgICAgICAgICAqIDEgPDwgMSAtPiBzZWNvbmQgbGl0ZXJhbCB2YWx1ZSwKLSMgICAgICAgICAgICAgICAuLi4KLSMgICAgICAgICAgKiAxIDw8IE4gLT4gKE4rMSl0aCBsaXRlcmFsIHZhbHVlLAotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFBvbGljeSB7Ci0jICAgIEluY2x1c2l2ZUNyaXRlcmlvblR5cGV8RXhjbHVzaXZlQ3JpdGVyaW9uVHlwZSB7Ci0jICAgICAgICA8Q3JpdGVyaW9uIE5hbWU+ICBbbnVtZXJpY2FsIHZhbHVlIDE6XTxsaXRlcmFsIHZhbHVlIDE+LFtudW1lcmljYWwgdmFsdWUgMjpdPGxpdGVyYWwgdmFsdWUgMj4sPGxpdGVyYWwgdmFsdWUgMz4sLi4uCi0jICAgIH0KLSMgfQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ3JpdGVyaW9uOgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFBvbGljeSB7Ci0jICAgIENyaXRlcmlvbiB7Ci0jICAgICAgICA8Q3JpdGVyaW9uIE5hbWU+IHsKLSMgICAgICAgICAgICBUeXBlICAgICAgICAgICAgPENyaXRlcmlvbiB0eXBlIG5hbWU+Ci0jICAgICAgICAgICAgRGVmYXVsdCAgICAgICAgIDxkZWZhdWx0IHZhbHVlIG9mIHRoZSBjcml0ZXJpb24+Ci0jICAgICAgICB9Ci0jICAgIH0KLSMgfQotCi1Qb2xpY3kgewotICAgIEluY2x1c2l2ZUNyaXRlcmlvblR5cGUgewotICAgICAgICAjCi0gICAgICAgICMgRE8gTk9UIENIQU5HRSBPUkRFUi4gVGhpcyBkZWZpbml0aW9uIG11c3QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mCi0gICAgICAgICMgQVVESU9fREVWSUNFX09VVF8qIHdpdGhpbiA8c3lzdGVtL2F1ZGlvLmg+IGZpbGUgb2YgYW5kcm9pZC4KLSAgICAgICAgIwotICAgICAgICBPdXRwdXREZXZpY2VzTWFza1R5cGUgICBFYXJwaWVjZSxTcGVha2VyLFdpcmVkSGVhZHNldCxXaXJlZEhlYWRwaG9uZSxCbHVldG9vdGhTY28sQmx1ZXRvb3RoU2NvSGVhZHNldCxCbHVldG9vdGhTY29DYXJraXQsQmx1ZXRvb3RoQTJkcCxCbHVldG9vdGhBMmRwSGVhZHBob25lcyxCbHVldG9vdGhBMmRwU3BlYWtlcixIZG1pLEFubGdEb2NrSGVhZHNldCxEZ3RsRG9ja0hlYWRzZXQsVXNiQWNjZXNzb3J5LFVzYkRldmljZSxSZW1vdGVTdWJtaXgsVGVsZXBob255VHgsTGluZSxIZG1pQXJjLFNwZGlmLEZtLEF1eExpbmUsU3BlYWtlclNhZmUKLSAgICAgICAgIwotICAgICAgICAjIERPIE5PVCBDSEFOR0UgT1JERVIuIFRoaXMgZGVmaW5pdGlvbiBtdXN0IGJlIGFsaWduZWQgd2l0aCB0aGUgZGVmaW5pdGlvbiBvZgotICAgICAgICAjIEFVRElPX0RFVklDRV9JTl8qIHdpdGhpbiA8c3lzdGVtL2F1ZGlvLmg+IGZpbGUgb2YgYW5kcm9pZC4KLSAgICAgICAgIyBOb3RlIGFsc28gdGhhdCBkaXJlY3Rpb24gYml0IHdpbGwgYmUgZGVjaW1hdGVkIGJ5IEF1ZGlvSEFMIGluIG9yZGVyIHRvIGFsbG93IHVzaW5nIGEgbWFzawotICAgICAgICAjIHdpdGggdGhlIGNhcmRpbmFsaXR5IG9mIDEgYmV0d2VlbiBhIGJpdCBhbmQgYW4gaW5wdXQgZGV2aWNlLgotICAgICAgICAjCi0gICAgICAgIElucHV0RGV2aWNlc01hc2tUeXBlICAgIENvbW11bmljYXRpb24sQW1iaWVudCxCdWlsdGluTWljLEJsdWV0b290aFNjb0hlYWRzZXQsV2lyZWRIZWFkc2V0LEhkbWksVGVsZXBob255UngsQmFja01pYyxSZW1vdGVTdWJtaXgsQW5sZ0RvY2tIZWFkc2V0LERndGxEb2NrSGVhZHNldCxVc2JBY2Nlc3NvcnksVXNiRGV2aWNlLEZtVHVuZXIsVHZUdW5lLExpbmUsU3BkaWYsQmx1ZXRvb3RoQTJkcCxMb29wYmFjawotICAgIH0KLSAgICBFeGNsdXNpdmVDcml0ZXJpb25UeXBlIHsKLSAgICAgICAgIwotICAgICAgICAjIFRoZSB2YWx1ZXMgb2YgdGhlIG1vZGUgTVVTVCBiZSBhbGlnbmVkIHdpdGggdGhlIGRlZmluaXRpb24gb2YgdGhlIGF1ZGlvX21vZGVfdAotICAgICAgICAjIGZyb20gc3lzdGVtL2F1ZGlvLmgKLSAgICAgICAgIwotICAgICAgICBBbmRyb2lkTW9kZVR5cGUgICAgIDA6Tm9ybWFsLDE6UmluZ1RvbmUsMjpJbkNhbGwsMzpJbkNvbW11bmljYXRpb24KLSAgICAgICAgIwotICAgICAgICAjIFRoZSB2YWx1ZXMgb2YgdGhlIG1vZGUgTVVTVCBiZSBhbGlnbmVkIHdpdGggdGhlIGRlZmluaXRpb24gb2YgdGhlCi0gICAgICAgICMgYXVkaW9fcG9saWN5X2ZvcmNlZF9jb25maWdfdCBmcm9tIHN5c3RlbS9hdWRpby5oCi0gICAgICAgICMKLSAgICAgICAgRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uVHlwZSAgICAwOkZvcmNlTm9uZSwxOkZvcmNlU3BlYWtlciwzOkZvcmNlQnRTY28KLSAgICAgICAgIwotICAgICAgICAjIFRoZSB2YWx1ZXMgb2YgdGhlIG1vZGUgTVVTVCBiZSBhbGlnbmVkIHdpdGggdGhlIGRlZmluaXRpb24gb2YgdGhlCi0gICAgICAgICMgYXVkaW9fcG9saWN5X2ZvcmNlZF9jb25maWdfdCBmcm9tIHN5c3RlbS9hdWRpby5oCi0gICAgICAgICMKLSAgICAgICAgRm9yY2VVc2VGb3JNZWRpYVR5cGUgICAgICAgICAgICAwOkZvcmNlTm9uZSwxOkZvcmNlU3BlYWtlciwyOkZvcmNlSGVhZHBob25lcyw0OkZvcmNlQnRBMmRwLDU6Rm9yY2VXaXJlZEFjY2Vzc29yeSw4OkZvcmNlQW5hbG9nRG9jayw5OkZvcmNlRGlnaXRhbERvY2ssMTA6Rm9yY2VOb0J0QTJkcAotICAgICAgICAjCi0gICAgICAgICMgVGhlIHZhbHVlcyBvZiB0aGUgbW9kZSBNVVNUIGJlIGFsaWduZWQgd2l0aCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKLSAgICAgICAgIyBhdWRpb19wb2xpY3lfZm9yY2VkX2NvbmZpZ190IGZyb20gc3lzdGVtL2F1ZGlvLmgKLSAgICAgICAgIwotICAgICAgICBGb3JjZVVzZUZvclJlY29yZFR5cGUgICAgICAgICAgIDA6Rm9yY2VOb25lLDM6Rm9yY2VCdFNjbyw1OkZvcmNlV2lyZWRBY2Nlc3NvcnkKLSAgICAgICAgIwotICAgICAgICAjIFRoZSB2YWx1ZXMgb2YgdGhlIG1vZGUgTVVTVCBiZSBhbGlnbmVkIHdpdGggdGhlIGRlZmluaXRpb24gb2YgdGhlCi0gICAgICAgICMgYXVkaW9fcG9saWN5X2ZvcmNlZF9jb25maWdfdCBmcm9tIHN5c3RlbS9hdWRpby5oCi0gICAgICAgICMKLSAgICAgICAgRm9yY2VVc2VGb3JEb2NrVHlwZSAgICAgICAgICAgICAwOkZvcmNlTm9uZSw1OkZvcmNlV2lyZWRBY2Nlc3NvcnksNjpGb3JjZUJ0Q2FyRG9jayw3OkZvcmNlQnREZXNrRG9jayw4OkZvcmNlQW5hbG9nRG9jayw5OkZvcmNlRGlnaXRhbERvY2sKLSAgICAgICAgIwotICAgICAgICAjIFRoZSB2YWx1ZXMgb2YgdGhlIG1vZGUgTVVTVCBiZSBhbGlnbmVkIHdpdGggdGhlIGRlZmluaXRpb24gb2YgdGhlCi0gICAgICAgICMgYXVkaW9fcG9saWN5X2ZvcmNlZF9jb25maWdfdCBmcm9tIHN5c3RlbS9hdWRpby5oCi0gICAgICAgICMKLSAgICAgICAgRm9yY2VVc2VGb3JTeXN0ZW1UeXBlICAgICAgICAgICAwOkZvcmNlTm9uZSwxMTpGb3JjZVN5c3RlbUVuZm9yY2VkCi0gICAgICAgICMKLSAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZQotICAgICAgICAjIGF1ZGlvX3BvbGljeV9mb3JjZWRfY29uZmlnX3QgZnJvbSBzeXN0ZW0vYXVkaW8uaAotICAgICAgICAjCi0gICAgICAgIEZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvVHlwZSAgMDpGb3JjZU5vbmUsMTI6Rm9yY2VIZG1pU3lzdGVtRW5mb3JjZWQKLSAgICAgICAgIwotICAgICAgICAjIFRoZSB2YWx1ZXMgb2YgdGhlIG1vZGUgTVVTVCBiZSBhbGlnbmVkIHdpdGggdGhlIGRlZmluaXRpb24gb2YgdGhlCi0gICAgICAgICMgYXVkaW9fcG9saWN5X2ZvcmNlZF9jb25maWdfdCBmcm9tIHN5c3RlbS9hdWRpb19wb2xpY3kuaAotICAgICAgICAjCi0gICAgICAgIEZvcmNlVXNlRm9yRW5jb2RlZFN1cnJvdW5kVHlwZSAgMDpGb3JjZU5vbmUsMTM6Rm9yY2VFbmNvZGVkU3Vycm91bmROZXZlciwxNDpGb3JjZUVuY29kZWRTdXJyb3VuZEFsd2F5cwotICAgIH0KLQotICAgIENyaXRlcmlvbiB7Ci0gICAgICAgIEF2YWlsYWJsZUlucHV0RGV2aWNlcyB7Ci0gICAgICAgICAgICBUeXBlICAgICAgICAgICAgSW5wdXREZXZpY2VzTWFza1R5cGUKLSAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBub25lCi0gICAgICAgIH0KLSAgICAgICAgQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyB7Ci0gICAgICAgICAgICBUeXBlICAgICAgICAgICAgT3V0cHV0RGV2aWNlc01hc2tUeXBlCi0gICAgICAgICAgICBEZWZhdWx0ICAgICAgICAgbm9uZQotICAgICAgICB9Ci0gICAgICAgIFRlbGVwaG9ueU1vZGUgewotICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIEFuZHJvaWRNb2RlVHlwZQotICAgICAgICAgICAgRGVmYXVsdCAgICAgICAgIE5vcm1hbAotICAgICAgICB9Ci0gICAgICAgIEZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiB7Ci0gICAgICAgICAgICBUeXBlICAgICAgICAgICAgRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uVHlwZQotICAgICAgICAgICAgRGVmYXVsdCAgICAgICAgIEZvcmNlTm9uZQotICAgICAgICB9Ci0gICAgICAgIEZvcmNlVXNlRm9yTWVkaWEgewotICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIEZvcmNlVXNlRm9yTWVkaWFUeXBlCi0gICAgICAgICAgICBEZWZhdWx0ICAgICAgICAgRm9yY2VOb25lCi0gICAgICAgIH0KLSAgICAgICAgRm9yY2VVc2VGb3JSZWNvcmQgewotICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIEZvcmNlVXNlRm9yUmVjb3JkVHlwZQotICAgICAgICAgICAgRGVmYXVsdCAgICAgICAgIEZvcmNlTm9uZQotICAgICAgICB9Ci0gICAgICAgIEZvcmNlVXNlRm9yRG9jayB7Ci0gICAgICAgICAgICBUeXBlICAgICAgICAgICAgRm9yY2VVc2VGb3JEb2NrVHlwZQotICAgICAgICAgICAgRGVmYXVsdCAgICAgICAgIEZvcmNlTm9uZQotICAgICAgICB9Ci0gICAgICAgIEZvcmNlVXNlRm9yU3lzdGVtIHsKLSAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBGb3JjZVVzZUZvclN5c3RlbVR5cGUKLSAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBGb3JjZU5vbmUKLSAgICAgICAgfQotICAgICAgICBGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyB7Ci0gICAgICAgICAgICBUeXBlICAgICAgICAgICAgRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW9UeXBlCi0gICAgICAgICAgICBEZWZhdWx0ICAgICAgICAgRm9yY2VOb25lCi0gICAgICAgIH0KLSAgICAgICAgRm9yY2VVc2VGb3JFbmNvZGVkU3Vycm91bmQgewotICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIEZvcmNlVXNlRm9yRW5jb2RlZFN1cnJvdW5kVHlwZQotICAgICAgICAgICAgRGVmYXVsdCAgICAgICAgIEZvcmNlTm9uZQotICAgICAgICB9Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9pbmNsdWRlL1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9pbmNsdWRlL1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmgKaW5kZXggNGMxYWNmZS4uNWJmYWQyOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvaW5jbHVkZS9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2luY2x1ZGUvUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuaApAQCAtMTYsMTAgKzE2LDE1IEBACiAKICNwcmFnbWEgb25jZQogCisjaW5jbHVkZSA8QXVkaW9HYWluLmg+CisjaW5jbHVkZSA8QXVkaW9Qb3J0Lmg+CisjaW5jbHVkZSA8SHdNb2R1bGUuaD4KKyNpbmNsdWRlIDxEZXZpY2VEZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1JXTG9jay5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDxsaXN0PgogI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDxzdHJpbmc+CkBAIC0yNywyNyArMzIsMjAgQEAKIAogY2xhc3MgQ1BhcmFtZXRlck1nclBsYXRmb3JtQ29ubmVjdG9yOwogY2xhc3MgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZTsKLWNsYXNzIElTZWxlY3Rpb25Dcml0ZXJpb25UeXBlSW50ZXJmYWNlOwogc3RydWN0IGNub2RlOwogCiBjbGFzcyBQYXJhbWV0ZXJNZ3JQbGF0Zm9ybUNvbm5lY3RvckxvZ2dlcjsKIAotbmFtZXNwYWNlIGFuZHJvaWQKLXsKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kgeworCit1c2luZyBWYWx1ZVBhaXIgPSBzdGQ6OnBhaXI8dWludDMyX3QsIHN0ZDo6c3RyaW5nPjsKK3VzaW5nIFZhbHVlUGFpcnMgPSBzdGQ6OnZlY3RvcjxWYWx1ZVBhaXI+OwogCiBjbGFzcyBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcgogewogcHJpdmF0ZToKLSAgICB0eXBlZGVmIHN0ZDo6cGFpcjxpbnQsIGNvbnN0IGNoYXIgKj4gQ3JpdGVyaW9uVHlwZVZhbHVlUGFpcjsKLQotICAgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKj4gQ3JpdGVyaW9uQ29sbGVjdGlvbjsKLSAgICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBJU2VsZWN0aW9uQ3JpdGVyaW9uVHlwZUludGVyZmFjZSAqPiBDcml0ZXJpb25UeXBlQ29sbGVjdGlvbjsKLSAgICB0eXBlZGVmIENyaXRlcmlvbkNvbGxlY3Rpb246Oml0ZXJhdG9yIENyaXRlcmlvbk1hcEl0ZXJhdG9yOwotICAgIHR5cGVkZWYgQ3JpdGVyaW9uQ29sbGVjdGlvbjo6Y29uc3RfaXRlcmF0b3IgQ3JpdGVyaW9uTWFwQ29uc3RJdGVyYXRvcjsKLSAgICB0eXBlZGVmIENyaXRlcmlvblR5cGVDb2xsZWN0aW9uOjppdGVyYXRvciBDcml0ZXJpb25UeXBlTWFwSXRlcmF0b3I7Ci0gICAgdHlwZWRlZiBDcml0ZXJpb25UeXBlQ29sbGVjdGlvbjo6Y29uc3RfaXRlcmF0b3IgQ3JpdGVyaWFUeXBlTWFwQ29uc3RJdGVyYXRvcjsKKyAgICB1c2luZyBDcml0ZXJpYSA9IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlICo+OwogCiBwdWJsaWM6CiAgICAgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIoKTsKQEAgLTEyMCw2ICsxMTgsMjAgQEAKICAgICAgKi8KICAgICBzdGF0dXNfdCBzZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2VzKTsKIAorICAgIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGFkZENyaXRlcmlvbiB0byB0aGUgcG9saWN5IHBmdworICAgICAqIEBwYXJhbSBuYW1lIG9mIHRoZSBjcml0ZXJpb24KKyAgICAgKiBAcGFyYW0gaXNJbmNsdXNpdmUgaWYgdHJ1ZSwgaW5jbHVzaXZlLCBpZiBmYWxzZSBleGNsdXNpdmUgY3JpdGVyaW9uIHR5cGUKKyAgICAgKiBAcGFyYW0gcGFpcnMgb2YgbnVtZXJpY2FsL2xpdGVyYWwgdmFsdWVzIG9mIHRoZSBjcml0ZXJpb24KKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIHByb3ZpZGVkIGFzIGxpdGVyYWwuCisgICAgICogQHJldHVybgorICAgICAqLworICAgIHN0YXR1c190IGFkZENyaXRlcmlvbihjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgYm9vbCBpc0luY2x1c2l2ZSwgVmFsdWVQYWlycyBwYWlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmRlZmF1bHRWYWx1ZSk7CisKIHByaXZhdGU6CiAgICAgLyoqCiAgICAgICogQXBwbHkgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIHBsYXRmb3JtIG9uIHRoZSBwb2xpY3kgcGFyYW1ldGVyIG1hbmFnZXIuCkBAIC0xMzMsOTYgKzE0NSw3IEBACiAgICAgICovCiAgICAgdm9pZCBhcHBseVBsYXRmb3JtQ29uZmlndXJhdGlvbigpOwogCi0gICAgLyoqCi0gICAgICogTG9hZCB0aGUgY3JpdGVyaW9uIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gcGF0aCBDcml0ZXJpb24gY29uZiBmaWxlIHBhdGguCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlzIHBhcnNpbmcgc3VjY2Vzc2Z1bCwgZXJyb3IgY29kZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgc3RhdHVzX3QgbG9hZEF1ZGlvUG9saWN5Q3JpdGVyaWFDb25maWcoY29uc3QgY2hhciAqcGF0aCk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBjcml0ZXJpb24gdHlwZSB0byBBdWRpb1BvbGljeVBmdy4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gdHlwZU5hbWUgb2YgdGhlIFBGVyBjcml0ZXJpb24gdHlwZS4KLSAgICAgKiBAcGFyYW1baW5dIGlzSW5jbHVzaXZlIGF0dHJpYnV0ZSBvZiB0aGUgY3JpdGVyaW9uIHR5cGUuCi0gICAgICovCi0gICAgdm9pZCBhZGRDcml0ZXJpb25UeXBlKGNvbnN0IHN0ZDo6c3RyaW5nICZ0eXBlTmFtZSwgYm9vbCBpc0luY2x1c2l2ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBjcml0ZXJpb24gdHlwZSB2YWx1ZSBwYWlyIHRvIEF1ZGlvUG9saWN5UGZ3LgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSB0eXBlTmFtZSBjcml0ZXJpb24gdHlwZSBuYW1lIHRvIHdoaWNoIHRoaXMgdmFsdWUgcGFpciBpcyBhZGRlZCB0by4KLSAgICAgKiBAcGFyYW1baW5dIG51bWVyaWMgcGFydCBvZiB0aGUgdmFsdWUgcGFpci4KLSAgICAgKiBAcGFyYW1baW5dIGxpdGVyYWwgcGFydCBvZiB0aGUgdmFsdWUgcGFpci4KLSAgICAgKi8KLSAgICB2b2lkIGFkZENyaXRlcmlvblR5cGVWYWx1ZVBhaXIoY29uc3Qgc3RkOjpzdHJpbmcgJnR5cGVOYW1lLCB1aW50MzJfdCBudW1lcmljLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbGl0ZXJhbCk7Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBjcml0ZXJpb24gdG8gQXVkaW9Qb2xpY3lQZncuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIG5hbWUgb2YgdGhlIFBGVyBjcml0ZXJpb24uCi0gICAgICogQHBhcmFtW2luXSB0eXBlTmFtZSBjcml0ZXJpb24gdHlwZSBuYW1lIHRvIHdoaWNoIHRoaXMgY3JpdGVyaW9uIGlzIGFzc29jaWF0ZWQgdG8uCi0gICAgICogQHBhcmFtW2luXSBkZWZhdWx0TGl0ZXJhbFZhbHVlIG9mIHRoZSBQRlcgY3JpdGVyaW9uLgotICAgICAqLwotICAgIHZvaWQgYWRkQ3JpdGVyaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZ0eXBlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZGVmYXVsdExpdGVyYWxWYWx1ZSk7Ci0gICAgLyoqCi0gICAgICogUGFyc2UgYW5kIGxvYWQgdGhlIGluY2x1c2l2ZSBjcml0ZXJpb24gdHlwZSBmcm9tIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gcm9vdCBub2RlIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCi0gICAgICovCi0gICAgdm9pZCBsb2FkSW5jbHVzaXZlQ3JpdGVyaW9uVHlwZShjbm9kZSAqcm9vdCk7Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSBhbmQgbG9hZCB0aGUgZXhjbHVzaXZlIGNyaXRlcmlvbiB0eXBlIGZyb20gY29uZmlndXJhdGlvbiBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSByb290IG5vZGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICAgKi8KLSAgICB2b2lkIGxvYWRFeGNsdXNpdmVDcml0ZXJpb25UeXBlKGNub2RlICpyb290KTsKLQotICAgIC8qKgotICAgICAqIFBhcnNlIGFuZCBsb2FkIHRoZSBjcml0ZXJpYSBmcm9tIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gcm9vdCBub2RlIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCi0gICAgICovCi0gICAgdm9pZCBsb2FkQ3JpdGVyaWEoY25vZGUgKnJvb3QpOwotCi0gICAgLyoqCi0gICAgICogUGFyc2UgYW5kIGxvYWQgYSBjcml0ZXJpb24gZnJvbSBjb25maWd1cmF0aW9uIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHJvb3Qgbm9kZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgotICAgICAqLwotICAgIHZvaWQgbG9hZENyaXRlcmlvbihjbm9kZSAqcm9vdCk7Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSBhbmQgbG9hZCB0aGUgY3JpdGVyaW9uIHR5cGVzIGZyb20gY29uZmlndXJhdGlvbiBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSByb290IG5vZGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQotICAgICAqIEBwYXJhbVtpbl0gaXNJbmNsdXNpdmUgdHJ1ZSBpZiBpbmNsdXNpdmUsIGZhbHNlIGlzIGV4Y2x1c2l2ZS4KLSAgICAgKi8KLSAgICB2b2lkIGxvYWRDcml0ZXJpb25UeXBlKGNub2RlICpyb290LCBib29sIGlzSW5jbHVzaXZlKTsKLQotICAgIC8qKgotICAgICAqIExvYWQgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gcm9vdCBub2RlIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCi0gICAgICovCi0gICAgdm9pZCBsb2FkQ29uZmlnKGNub2RlICpyb290KTsKLQotICAgIC8qKgotICAgICAqIFBhcnNlIGFuZCBsb2FkIHRoZSBjaGlkcmVuIG5vZGUgZnJvbSBhIGdpdmVuIHJvb3Qgbm9kZS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gcm9vdCBub2RlIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUKLSAgICAgKiBAcGFyYW1bb3V0XSBkZWZhdWx0VmFsdWUgb2YgdGhlIHBhcmFtZXRlciBtYW5hZ2VyIGVsZW1lbnQgdG8gcmV0cmlldmUuCi0gICAgICogQHBhcmFtW291dF0gdHlwZSBvZiB0aGUgcGFyYW1ldGVyIG1hbmFnZXIgZWxlbWVudCB0byByZXRyaWV2ZS4KLSAgICAqLwotICAgIHZvaWQgcGFyc2VDaGlsZHJlbihjbm9kZSAqcm9vdCwgc3RkOjpzdHJpbmcgJmRlZmF1bHRWYWx1ZSwgc3RkOjpzdHJpbmcgJnR5cGUpOwotCi0gICAgLyoqCisgICAgIC8qKgogICAgICAqIFJldHJpZXZlIGFuIGVsZW1lbnQgZnJvbSBhIG1hcCBieSBpdHMgbmFtZS4KICAgICAgKgogICAgICAqIEB0cGFyYW0gVCB0eXBlIG9mIGVsZW1lbnQgdG8gc2VhcmNoLgpAQCAtMjY2LDggKzE4OSw3IEBACiAKICAgICBib29sIGlzVmFsdWVWYWxpZEZvckNyaXRlcmlvbihJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlICpjcml0ZXJpb24sIGludCB2YWx1ZVRvQ2hlY2spOwogCi0gICAgQ3JpdGVyaW9uVHlwZUNvbGxlY3Rpb24gbVBvbGljeUNyaXRlcmlvblR5cGVzOyAvKio8IFBvbGljeSBDcml0ZXJpb24gVHlwZSBtYXAuICovCi0gICAgQ3JpdGVyaW9uQ29sbGVjdGlvbiBtUG9saWN5Q3JpdGVyaWE7IC8qKjwgUG9saWN5IENyaXRlcmlvbiBNYXAuICovCisgICAgQ3JpdGVyaWEgbVBvbGljeUNyaXRlcmlhOyAvKio8IFBvbGljeSBDcml0ZXJpb24gTWFwLiAqLwogCiAgICAgQ1BhcmFtZXRlck1nclBsYXRmb3JtQ29ubmVjdG9yICptUGZ3Q29ubmVjdG9yOyAvKio8IFBvbGljeSBQYXJhbWV0ZXIgTWFuYWdlciBjb25uZWN0b3IuICovCiAgICAgUGFyYW1ldGVyTWdyUGxhdGZvcm1Db25uZWN0b3JMb2dnZXIgKm1QZndDb25uZWN0b3JMb2dnZXI7IC8qKjwgUG9saWN5IFBGVyBsb2dnZXIuICovCkBAIC0yODQsNiArMjA2LDcgQEAKICAgICBzdHJ1Y3QgcGFyYW1ldGVyTWFuYWdlckVsZW1lbnRTdXBwb3J0ZWQ7CiAKICAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbVBvbGljeVBmd0RlZmF1bHRDb25mRmlsZU5hbWU7IC8qKjwgRGVmYXVsdCBQb2xpY3kgUEZXIHRvcCBmaWxlIG5hbWUuKi8KKyAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbVBvbGljeVBmd1ZlbmRvckNvbmZGaWxlTmFtZTsgLyoqPCBWZW5kb3IgUG9saWN5IFBGVyB0b3AgZmlsZSBuYW1lLiovCiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjQyYzZhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzIgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliYXVkaW9wb2xpY3llbmdpbmVkZWZhdWx0IiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJzcmMvRW5naW5lLmNwcCIsCisgICAgICAgICJzcmMvRW5naW5lSW5zdGFuY2UuY3BwIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeWNvbW1vbiIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeWVuZ2luZV9pbnRlcmZhY2VfaGVhZGVycyIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYXVkaW9wb2xpY3ljb21wb25lbnRzIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5ZW5naW5lX2NvbW1vbiIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeWVuZ2luZV9jb25maWciLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5IiwKKyAgICAgICAgImxpYnhtbDIiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiYmUzMDYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi0jIENvbXBvbmVudCBidWlsZAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgc3JjL0VuZ2luZS5jcHAgXAotICAgIHNyYy9FbmdpbmVJbnN0YW5jZS5jcHAgXAotCi1hdWRpb19wb2xpY3lfZW5naW5lX2luY2x1ZGVzX2NvbW1vbiA6PSBcCi0gICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UKLQotTE9DQUxfQ0ZMQUdTICs9IFwKLSAgICAtV2FsbCBcCi0gICAgLVdlcnJvciBcCi0gICAgLVdleHRyYSBcCi0KLUxPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSBcCi0gICAgJChhdWRpb19wb2xpY3lfZW5naW5lX2luY2x1ZGVzX2NvbW1vbikKLQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChhdWRpb19wb2xpY3lfZW5naW5lX2luY2x1ZGVzX2NvbW1vbikgXAotICAgICQoVEFSR0VUX09VVF9IRUFERVJTKS9odyBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGZyYW1ld29ya3MtYXYpIFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYmlvbmljKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZQotCi1MT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQotCi1MT0NBTF9NT0RVTEUgOj0gbGliYXVkaW9wb2xpY3llbmdpbmVkZWZhdWx0Ci1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMgXAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IFwKLSAgICBsaWJsb2cgXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYm1lZGlhX2hlbHBlcgotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJhZGFjOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvQW5kcm9pZC5tawpAQCAtMCwwICsxLDQ4IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBDT05GSUdVUkFUSU9OIFRPUCBGSUxFCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaWZlcSAoJChCVUlMRF9BVURJT19QT0xJQ1lfRVhBTVBMRV9DT05GSUdVUkFUSU9OKSwgcGhvbmVfZGVmYXVsdCkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gYXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uLnhtbAorCitMT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAorTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQworTE9DQUxfVkVORE9SX01PRFVMRSA6PSB0cnVlCitMT0NBTF9TUkNfRklMRVMgOj0gcGhvbmUvJChMT0NBTF9NT0RVTEUpCisKK0xPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gXAorICAgIGF1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbCBcCisgICAgYXVkaW9fcG9saWN5X2VuZ2luZV9zdHJlYW1fdm9sdW1lcy54bWwgXAorICAgIGF1ZGlvX3BvbGljeV9lbmdpbmVfZGVmYXVsdF9zdHJlYW1fdm9sdW1lcy54bWwKKworaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBhdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX1NSQ19GSUxFUyA6PSBwaG9uZS8kKExPQ0FMX01PRFVMRSkKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gYXVkaW9fcG9saWN5X2VuZ2luZV9zdHJlYW1fdm9sdW1lcy54bWwKK0xPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCitMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX1NSQ19GSUxFUyA6PSBwaG9uZS8kKExPQ0FMX01PRFVMRSkKK2luY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCitMT0NBTF9NT0RVTEUgOj0gYXVkaW9fcG9saWN5X2VuZ2luZV9kZWZhdWx0X3N0cmVhbV92b2x1bWVzLnhtbAorTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX1ZFTkRPUl9NT0RVTEUgOj0gdHJ1ZQorTE9DQUxfU1JDX0ZJTEVTIDo9IHBob25lLyQoTE9DQUxfTU9EVUxFKQoraW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQorCitlbmRpZiAjIGlmZXEgKCQoQlVJTERfQVVESU9fUE9MSUNZX0VYQU1QTEVfQ09ORklHVVJBVElPTiksIHBob25lX2RlZmF1bHQpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNhMzNiNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAgICAtLT4KKworPGNvbmZpZ3VyYXRpb24gdmVyc2lvbj0iMS4wIiB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI+CisKKyAgICA8eGk6aW5jbHVkZSBocmVmPSJhdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwiLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJhdWRpb19wb2xpY3lfZW5naW5lX3N0cmVhbV92b2x1bWVzLnhtbCIvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV9lbmdpbmVfZGVmYXVsdF9zdHJlYW1fdm9sdW1lcy54bWwiLz4KKworPC9jb25maWd1cmF0aW9uPgorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfZGVmYXVsdF9zdHJlYW1fdm9sdW1lcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfZGVmYXVsdF9zdHJlYW1fdm9sdW1lcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFlNmRkNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9kZWZhdWx0X3N0cmVhbV92b2x1bWVzLnhtbApAQCAtMCwwICsxLDEzNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0gRGVmYXVsdCBWb2x1bWUgVGFibGVzIGluY2x1ZGVkIGJ5IEF1ZGlvIFBvbGljeSBDb25maWd1cmF0aW9uIGZpbGUgLS0+Cis8IS0tIEZ1bGwgRGVmYXVsdCBWb2x1bWUgdGFibGUgZm9yIGFsbCBkZXZpY2UgY2F0ZWdvcnkgLS0+Cis8dm9sdW1lcz4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIEZ1bGwgU2NhbGUgcmVmZXJlbmNlIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjAsMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJTSUxFTlRfVk9MVU1FX0NVUlZFIj4KKyAgICAgICAgPHBvaW50PjAsLTk2MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLC05NjAwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfU1lTVEVNX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IFN5c3RlbSByZWZlcmVuY2UgVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MSwtMjQwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4zMywtMTgwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42NiwtMTIwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsLTYwMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IE1lZGlhIHJlZmVyZW5jZSBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4xLC01ODAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0hFQURTRVRfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tRGVmYXVsdCBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4xLC00OTUwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjMzLC0zMzUwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjY2LC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgaXMgU3BlYWtlciBNZWRpYSBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4xLC01ODAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJfU1lTVEVNX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IGlzIFNwZWFrZXIgU3lzdGVtIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjEsLTQ2ODA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NDIsLTIwNzA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+ODUsLTU0MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FQVJQSUVDRV9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS1EZWZhdWx0IFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjEsLTQ5NTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MzMsLTMzNTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjYsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IGlzIEV4dCBNZWRpYSBTeXN0ZW0gVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MSwtNTgwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4yMCwtNDAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42MCwtMjEwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsLTEwMDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBIZWFyaW5nIEFpZCBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4xLC0xMjcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4yMCwtODAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42MCwtNDAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorICAgIDwhLS0gTm9uLW11dGFibGUgZGVmYXVsdCB2b2x1bWUgY3VydmVzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICA8IS0tICAgICAqIGZpcnN0IHBvaW50IGlzIGFsd2F5cyBmb3IgaW5kZXggMCAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgPCEtLSAgICAgKiBhdHRlbnVhdGlvbiBpcyBzbWFsbCBlbm91Z2ggdGhhdCBzdHJlYW0gY2FuIHN0aWxsIGJlIGhlYXJkIC0tPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9OT05fTVVUQUJMRV9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBub24tbXV0YWJsZSByZWZlcmVuY2UgVm9sdW1lIEN1cnZlIC0tPgorICAgIDwhLS0gICAgICAgIGJhc2VkIG9uIERFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIC0tPgorICAgICAgICA8cG9pbnQ+MCwtNTgwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4yMCwtNDAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42MCwtMTcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX05PTl9NVVRBQkxFX0hFQURTRVRfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tRGVmYXVsdCBub24tbXV0YWJsZSBWb2x1bWUgQ3VydmUgZm9yIGhlYWRzZXQgLS0+CisgICAgPCEtLSAgICBiYXNlZCBvbiBERUZBVUxUX0RFVklDRV9DQVRFR09SWV9IRUFEU0VUX1ZPTFVNRV9DVVJWRSAtLT4KKyAgICAgICAgPHBvaW50PjAsLTQ5NTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MzMsLTMzNTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjYsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9OT05fTVVUQUJMRV9TUEVBS0VSX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IG5vbi1tdXRhYmxlIFNwZWFrZXIgVm9sdW1lIEN1cnZlIC0tPgorICAgIDwhLS0gICAgYmFzZWQgb24gREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl9WT0xVTUVfQ1VSVkUgLS0+CisgICAgICAgIDxwb2ludD4wLC01ODAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfTk9OX01VVEFCTEVfRUFSUElFQ0VfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tRGVmYXVsdCBub24tbXV0YWJsZSBWb2x1bWUgQ3VydmUgLS0+CisgICAgPCEtLSAgICBiYXNlZCBvbiBERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FQVJQSUVDRV9WT0xVTUVfQ1VSVkUgLS0+CisgICAgICAgIDxwb2ludD4wLC00OTUwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjMzLC0zMzUwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjY2LC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfTk9OX01VVEFCTEVfRVhUX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IG5vbi1tdXRhYmxlIEV4dCBNZWRpYSBTeXN0ZW0gVm9sdW1lIEN1cnZlIC0tPgorICAgIDwhLS0gICAgIGJhc2VkIG9uIERFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUgLS0+CisgICAgICAgIDxwb2ludD4wLC01ODAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC0yMTAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwtMTAwMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX05PTl9NVVRBQkxFX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IG5vbi1tdXRhYmxlIEhlYXJpbmcgQWlkIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICA8IS0tICAgICBiYXNlZCBvbiBERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSAtLT4KKyAgICAgICAgPHBvaW50PjAsLTEyNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC04MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKzwvdm9sdW1lcz4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM5ODc0MwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCkBAIC0wLDAgKzEsMTEwIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAgICAtLT4KKworPFByb2R1Y3RTdHJhdGVnaWVzPgorCisgICAgPCEtLSAiaGlkZGVuIHN0cmF0ZWdpZXMiIGxpa2UgVFRTLCBlbmZvcmNlZCBhdWRpYmxlOgorICAgICAgICAgICAgU2hhbGwgd2UgZXhwb3NlIHRoZW0gaGVyZSBvciBrZWVwIGl0IGhhcmQgY29kZWQgLS0+CisKKyAgICA8IS0tIFVzZWQgdG8gaWRlbnRpZnkgdGhlIHZvbHVtZSBvZiBhdWRpbyBzdHJlYW1zIGZvciBlbmZvcmNlZCBzeXN0ZW0gc291bmRzIGluIGNlcnRhaW4KKyAgICAgICAgIGNvdW50cmllcyAoZS5nLiBjYW1lcmEgaW4gSmFwYW4pCisgICAgICAgICBUaGlzIHN0cmF0ZWd5IHdpbGwgb25seSBoYXZlIGhpZ2hlciBwcmlvcml0eSB0aGFuIHBob25lIGlmIGZvcmNlIGZvciBzeXN0ZW0gaXMgc2V0IHRvCisgICAgICAgICBlbmZvcmNlZC4gLS0+CisKKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX1BIT05FIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCIgdm9sdW1lR3JvdXA9InZvaWNlX2NhbGwiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTiIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPIiB2b2x1bWVHcm91cD0iYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPEZsYWdzIHZhbHVlPSJBVURJT19GTEFHX1NDTyIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9TT05JRklDQVRJT04iPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9SSU5HIiB2b2x1bWVHcm91cD0icmluZyI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0FMQVJNIiB2b2x1bWVHcm91cD0iYWxhcm0iPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQUxBUk0iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUiIHZvbHVtZUdyb3VwPSJlbmZvcmNlZF9hdWRpYmxlIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8RmxhZ3MgdmFsdWU9IkFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9BQ0NFU1NJQklMSVRZIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSIgdm9sdW1lR3JvdXA9ImFjY2Vzc2liaWxpdHkiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OIiB2b2x1bWVHcm91cD0ibm90aWZpY2F0aW9uIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTiIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfTUVESUEiPgorICAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fTVVTSUMiIHZvbHVtZUdyb3VwPSJtdXNpYyI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9NRURJQSIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9HQU1FIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOVCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+PC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fU1lTVEVNIiB2b2x1bWVHcm91cD0ic3lzdGVtIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX0RUTUYiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9EVE1GIiB2b2x1bWVHcm91cD0iZHRtZiI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkciLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDwhLS0gVXNlZCB0byBpZGVudGlmeSB0aGUgdm9sdW1lIG9mIGF1ZGlvIHN0cmVhbXMgZXhjbHVzaXZlbHkgdHJhbnNtaXR0ZWQgdGhyb3VnaCB0aGUgIHNwZWFrZXIKKyAgICAgICAgIChUVFMpIG9mIHRoZSBkZXZpY2UgLS0+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVIiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9UVFMiIHZvbHVtZUdyb3VwPSJ0dHMiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxGbGFncyB2YWx1ZT0iQVVESU9fRkxBR19CRUFDT04iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDwhLS0gUm91dGluZyBTdHJhdGVneSByZXJvdXRpbmcgbWF5IGJlIHJlbW92ZWQgYXMgZm9sbG93aW5nIG1lZGlhPz8/IC0tPgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfUkVST1VUSU5HIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fUkVST1VUSU5HIiB2b2x1bWVHcm91cD0icmVyb3V0aW5nIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPjwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8IS0tIERlZmF1bHQgcHJvZHVjdCBzdHJhdGVneSBoYXMgZW1wdHkgYXR0cmlidXRlcyAtLT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX1BBVENIIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fUEFUQ0giIHZvbHVtZUdyb3VwPSJwYXRjaCI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz48L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisKKzwvUHJvZHVjdFN0cmF0ZWdpZXM+CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9zdHJlYW1fdm9sdW1lcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfc3RyZWFtX3ZvbHVtZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwN2ExODQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfc3RyZWFtX3ZvbHVtZXMueG1sCkBAIC0wLDAgKzEsMjMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPCEtLSBWb2x1bWUgc2VjdGlvbiBkZWZpbmVzIGEgdm9sdW1lIGN1cnZlIGZvciBhIGdpdmVuIHVzZSBjYXNlIGFuZCBkZXZpY2UgY2F0ZWdvcnkuCitJdCBjb250YWlucyBhIGxpc3Qgb2YgcG9pbnRzIG9mIHRoaXMgY3VydmUgZXhwcmVzc2luZyB0aGUgYXR0ZW51YXRpb24gaW4gTWlsbGliZWxzIGZvciBhIGdpdmVuCit2b2x1bWUgaW5kZXggZnJvbSAwIHRvIDEwMC4KKzx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk94oCd4oCdPgorPHBvaW50PjAsLTk2MDA8L3BvaW50PgorPHBvaW50PjEwMCwwPC9wb2ludD4KKzwvdm9sdW1lPgorLS0+CisKKzx2b2x1bWVHcm91cHM+CisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT52b2ljZV9jYWxsPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MTwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD43PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTI0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0xNjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiPgorICAgICAgICAgICAgPHBvaW50PjAsLTI3MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0xODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtOTAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPnN5c3RlbTwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NzwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIj4KKyAgICAgICAgICAgIDxwb2ludD4xLC0zMDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjYwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTIyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwtMTgwMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MSwtNTEwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NTcsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjcxLC0yNTAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD44NSwtMjMwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLC0yMTAwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDwhLS12b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIiByZWY9IkRFRkFVTFRfU1lTVEVNX1ZPTFVNRV9DVVJWRSIvLS0+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJERUZBVUxUX1NZU1RFTV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FWFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPnJpbmc8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4Pjc8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9IRUFEU0VUX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9TUEVBS0VSX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0VfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5tdXNpYzwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MjU8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIgcmVmPSJERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9TUEVBS0VSX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiICByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+YWxhcm08L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4xPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4Pjc8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX0hFQURTRVRfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIiByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfU1BFQUtFUl9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfRUFSUElFQ0VfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9FWFRfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPm5vdGlmaWNhdGlvbjwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NzwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0hFQURTRVRfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJfU1lTVEVNX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0VfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfSEVBRFNFVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5ibHVldG9vdGhfc2NvPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD4xNTwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC0yNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMTYwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+ZW5mb3JjZWRfYXVkaWJsZTwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NzwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIj4KKyAgICAgICAgICAgIDxwb2ludD4xLC0zMDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjYwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTIyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwtMTgwMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MSwtMzQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NzEsLTI0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwtMjAwMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8IS0tdm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX1NZU1RFTV9WT0xVTUVfQ1VSVkUiLy0tPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iREVGQVVMVF9TWVNURU1fVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5kdG1mPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD4xNTwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIj4KKyAgICAgICAgICAgIDxwb2ludD4xLC0zMDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjYwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTIyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwtMTgwMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MSwtNDAwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NzEsLTI0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwtMTQwMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8IS0tdm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX1NZU1RFTV9WT0xVTUVfQ1VSVkUiLy0tPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iREVGQVVMVF9TWVNURU1fVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT50dHM8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjE1PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iU0lMRU5UX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iU0lMRU5UX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IlNJTEVOVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IlNJTEVOVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5hY2Nlc3NpYmlsaXR5PC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MTwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD4xNTwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIiByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIiByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfU1BFQUtFUl9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+cmVyb3V0aW5nPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD4xPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+cGF0Y2g8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjE8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorPC92b2x1bWVHcm91cHM+CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuY3BwCmluZGV4IDNlMTNlNTAuLjA0MTcwYWMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmNwcApAQCAtMjUsOSArMjUsMTEgQEAKICNlbmRpZgogCiAjaW5jbHVkZSAiRW5naW5lLmgiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgogI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyLmg+CiAjaW5jbHVkZSA8QXVkaW9Qb3J0Lmg+CiAjaW5jbHVkZSA8SU9Qcm9maWxlLmg+CisjaW5jbHVkZSA8QXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxwb2xpY3kuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC0zNyw2MCArMzksMzMgQEAKIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKIHsKIAorc3RydWN0IGxlZ2FjeV9zdHJhdGVneV9tYXAgeyBjb25zdCBjaGFyICpuYW1lOyBsZWdhY3lfc3RyYXRlZ3kgaWQ7IH07CitzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8bGVnYWN5X3N0cmF0ZWd5X21hcD4gZ0xlZ2FjeVN0cmF0ZWd5ID0geworICAgIHsgIlNUUkFURUdZX05PTkUiLCBTVFJBVEVHWV9OT05FIH0sCisgICAgeyAiU1RSQVRFR1lfTUVESUEiLCBTVFJBVEVHWV9NRURJQSB9LAorICAgIHsgIlNUUkFURUdZX1BIT05FIiwgU1RSQVRFR1lfUEhPTkUgfSwKKyAgICB7ICJTVFJBVEVHWV9TT05JRklDQVRJT04iLCBTVFJBVEVHWV9TT05JRklDQVRJT04gfSwKKyAgICB7ICJTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCIsIFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMIH0sCisgICAgeyAiU1RSQVRFR1lfRFRNRiIsIFNUUkFURUdZX0RUTUYgfSwKKyAgICB7ICJTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFIiwgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSB9LAorICAgIHsgIlNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUiIsIFNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUiB9LAorICAgIHsgIlNUUkFURUdZX0FDQ0VTU0lCSUxJVFkiLCBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZIH0sCisgICAgeyAiU1RSQVRFR1lfUkVST1VUSU5HIiwgU1RSQVRFR1lfUkVST1VUSU5HIH0sCisgICAgeyAiU1RSQVRFR1lfUEFUQ0giLCBTVFJBVEVHWV9SRVJPVVRJTkcgfSwgLy8gYm9pbGVyIHRvIG1hbmFnZSBzdHJlYW0gcGF0Y2ggdm9sdW1lCit9OworCiBFbmdpbmU6OkVuZ2luZSgpCi0gICAgOiBtTWFuYWdlckludGVyZmFjZSh0aGlzKSwKLSAgICAgIG1QaG9uZVN0YXRlKEFVRElPX01PREVfTk9STUFMKSwKLSAgICAgIG1BcG1PYnNlcnZlcihOVUxMKQogewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlQ7IGkrKykgewotICAgICAgICBtRm9yY2VVc2VbaV0gPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORTsKKyAgICBhdXRvIHJlc3VsdCA9IEVuZ2luZUJhc2U6OmxvYWRBdWRpb1BvbGljeUVuZ2luZUNvbmZpZygpOworICAgIEFMT0dFX0lGKHJlc3VsdC5uYlNraXBwZWRFbGVtZW50ICE9IDAsCisgICAgICAgICAgICAgIlBvbGljeSBFbmdpbmUgY29uZmlndXJhdGlvbiBpcyBwYXJ0aWFsbHkgaW52YWxpZCwgc2tpcHBlZCAlenUgZWxlbWVudHMiLAorICAgICAgICAgICAgIHJlc3VsdC5uYlNraXBwZWRFbGVtZW50KTsKKworICAgIGZvciAoY29uc3QgYXV0byAmc3RyYXRlZ3kgOiBnTGVnYWN5U3RyYXRlZ3kpIHsKKyAgICAgICAgbUxlZ2FjeVN0cmF0ZWd5TWFwW2dldFByb2R1Y3RTdHJhdGVneUJ5TmFtZShzdHJhdGVneS5uYW1lKV0gPSBzdHJhdGVneS5pZDsKICAgICB9CiB9CiAKLUVuZ2luZTo6fkVuZ2luZSgpCi17Ci19Ci0KLXZvaWQgRW5naW5lOjpzZXRPYnNlcnZlcihBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqb2JzZXJ2ZXIpCi17Ci0gICAgQUxPR19BU1NFUlQob2JzZXJ2ZXIgIT0gTlVMTCwgIkludmFsaWQgQXVkaW8gUG9saWN5IE1hbmFnZXIgb2JzZXJ2ZXIiKTsKLSAgICBtQXBtT2JzZXJ2ZXIgPSBvYnNlcnZlcjsKLX0KLQotc3RhdHVzX3QgRW5naW5lOjppbml0Q2hlY2soKQotewotICAgIHJldHVybiAobUFwbU9ic2VydmVyICE9IE5VTEwpID8gIE5PX0VSUk9SIDogTk9fSU5JVDsKLX0KLQotc3RhdHVzX3QgRW5naW5lOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKLXsKLSAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIHN0YXRlICVkIiwgc3RhdGUpOwotCi0gICAgaWYgKHN0YXRlIDwgMCB8fCBzdGF0ZSA+PSBBVURJT19NT0RFX0NOVCkgewotICAgICAgICBBTE9HVygic2V0UGhvbmVTdGF0ZSgpIGludmFsaWQgc3RhdGUgJWQiLCBzdGF0ZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgaWYgKHN0YXRlID09IG1QaG9uZVN0YXRlICkgewotICAgICAgICBBTE9HVygic2V0UGhvbmVTdGF0ZSgpIHNldHRpbmcgc2FtZSBzdGF0ZSAlZCIsIHN0YXRlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICAvLyBzdG9yZSBwcmV2aW91cyBwaG9uZSBzdGF0ZSBmb3IgbWFuYWdlbWVudCBvZiBzb25pZmljYXRpb24gc3RyYXRlZ3kgYmVsb3cKLSAgICBpbnQgb2xkU3RhdGUgPSBtUGhvbmVTdGF0ZTsKLSAgICBtUGhvbmVTdGF0ZSA9IHN0YXRlOwotCi0gICAgaWYgKCFpc19zdGF0ZV9pbl9jYWxsKG9sZFN0YXRlKSAmJiBpc19zdGF0ZV9pbl9jYWxsKHN0YXRlKSkgewotICAgICAgICBBTE9HVigiICBFbnRlcmluZyBjYWxsIGluIHNldFBob25lU3RhdGUoKSIpOwotICAgICAgICBtQXBtT2JzZXJ2ZXItPmdldFZvbHVtZUN1cnZlcygpLnN3aXRjaFZvbHVtZUN1cnZlKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9EVE1GKTsKLSAgICB9IGVsc2UgaWYgKGlzX3N0YXRlX2luX2NhbGwob2xkU3RhdGUpICYmICFpc19zdGF0ZV9pbl9jYWxsKHN0YXRlKSkgewotICAgICAgICBBTE9HVigiICBFeGl0aW5nIGNhbGwgaW4gc2V0UGhvbmVTdGF0ZSgpIik7Ci0gICAgICAgIG1BcG1PYnNlcnZlci0+Z2V0Vm9sdW1lQ3VydmVzKCkucmVzdG9yZU9yaWdpblZvbHVtZUN1cnZlKEFVRElPX1NUUkVBTV9EVE1GKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCiBzdGF0dXNfdCBFbmdpbmU6OnNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpCiB7CiAgICAgc3dpdGNoKHVzYWdlKSB7CkBAIC0xMDAsNyArNzUsNiBAQAogICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9DT01NVU5JQ0FUSU9OIiwgY29uZmlnKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLSAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBOgogICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9IRUFEUEhPTkVTICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfQTJEUCAmJgpAQCAtMTExLDcgKzg1LDYgQEAKICAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfTUVESUEiLCBjb25maWcpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEOgogICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08gJiYgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9XSVJFRF9BQ0NFU1NPUlkgJiYKQEAgLTExOSw3ICs5Miw2IEBACiAgICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX1JFQ09SRCIsIGNvbmZpZyk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9ET0NLOgogICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfQ0FSX0RPQ0sgJiYKQEAgLTEyOSwyMSArMTAxLDE4IEBACiAgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0RJR0lUQUxfRE9DSykgewogICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9ET0NLIiwgY29uZmlnKTsKICAgICAgICAgfQotICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNOgogICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FICYmCiAgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkgewogICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9TWVNURU0iLCBjb25maWcpOwogICAgICAgICB9Ci0gICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9IRE1JX1NZU1RFTV9BVURJTzoKICAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSAmJgogICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9IRE1JX1NZU1RFTV9BVURJT19FTkZPUkNFRCkgewogICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEhETUlfU1lTVEVNX0FVRElPIiwgY29uZmlnKTsKICAgICAgICAgfQotICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORDoKICAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSAmJgpAQCAtMTUzLDEwOCArMTIyLDI1IEBACiAgICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRU5DT0RFRF9TVVJST1VORCIsIGNvbmZpZyk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9WSUJSQVRFX1JJTkdJTkc6CiAgICAgICAgIGlmIChjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTyAmJiBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpIHsKICAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfVklCUkFURV9SSU5HSU5HIiwgY29uZmlnKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLSAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCB1c2FnZSAlZCIsIHVzYWdlKTsKICAgICAgICAgYnJlYWs7IC8vIFRPRE8gcmV0dXJuIEJBRF9WQUxVRT8KICAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIHJldHVybiBFbmdpbmVCYXNlOjpzZXRGb3JjZVVzZSh1c2FnZSwgY29uZmlnKTsKIH0KIAotcm91dGluZ19zdHJhdGVneSBFbmdpbmU6OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIC8vIHN0cmVhbSB0byBzdHJhdGVneSBtYXBwaW5nCi0gICAgc3dpdGNoIChzdHJlYW0pIHsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMOgotICAgIGNhc2UgQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ086Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9QSE9ORTsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9SSU5HOgotICAgIGNhc2UgQVVESU9fU1RSRUFNX0FMQVJNOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfU09OSUZJQ0FUSU9OOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX05PVElGSUNBVElPTjoKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX0RUTUY6Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9EVE1GOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dFKCJ1bmtub3duIHN0cmVhbSB0eXBlICVkIiwgc3RyZWFtKTsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9TWVNURU06Ci0gICAgICAgIC8vIE5PVEU6IFNZU1RFTSBzdHJlYW0gdXNlcyBNRURJQSBzdHJhdGVneSBiZWNhdXNlIG11dGluZyBtdXNpYyBhbmQgc3dpdGNoaW5nIG91dHB1dHMKLSAgICAgICAgLy8gd2hpbGUga2V5IGNsaWNrcyBhcmUgcGxheWVkIHByb2R1Y2VzIGEgcG9vciByZXN1bHQKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9NVVNJQzoKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX01FRElBOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEU6Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX1RUUzoKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUjsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfQUNDRVNTSUJJTElUWTsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9SRVJPVVRJTkc6Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9SRVJPVVRJTkc7Ci0gICAgfQotfQotCi1yb3V0aW5nX3N0cmF0ZWd5IEVuZ2luZTo6Z2V0U3RyYXRlZ3lGb3JVc2FnZShhdWRpb191c2FnZV90IHVzYWdlKQotewotICAgIC8vIHVzYWdlIHRvIHN0cmF0ZWd5IG1hcHBpbmcKLSAgICBzd2l0Y2ggKHVzYWdlKSB7Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk6Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9NRURJQToKLSAgICBjYXNlIEFVRElPX1VTQUdFX0dBTUU6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTlQ6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0U6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTjoKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX01FRElBOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfUEhPTkU7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORzoKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX0RUTUY7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX0FMQVJNOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORToKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX1NPTklGSUNBVElPTjsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQ6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUw7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX1VOS05PV046Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX01FRElBOwotICAgIH0KLX0KLQotYXVkaW9fZGV2aWNlc190IEVuZ2luZTo6Z2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkgY29uc3QKLXsKLSAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyA9IG1BcG1PYnNlcnZlci0+Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpOwotICAgIERldmljZVZlY3RvciBhdmFpbGFibGVJbnB1dERldmljZXMgPSBtQXBtT2JzZXJ2ZXItPmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpOwotCi0gICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gJm91dHB1dHMgPSBtQXBtT2JzZXJ2ZXItPmdldE91dHB1dHMoKTsKLQotICAgIHJldHVybiBnZXREZXZpY2VGb3JTdHJhdGVneUludChzdHJhdGVneSwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzLCAodWludDMyX3QpQVVESU9fREVWSUNFX05PTkUpOwotfQotCi0KLWF1ZGlvX2RldmljZXNfdCBFbmdpbmU6OmdldERldmljZUZvclN0cmF0ZWd5SW50KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCi0gICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVPdXRwdXREZXZpY2VzLAotICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlSW5wdXREZXZpY2VzLAotICAgICAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cywKLSAgICAgICAgdWludDMyX3Qgb3V0cHV0RGV2aWNlVHlwZXNUb0lnbm9yZSkgY29uc3QKK2F1ZGlvX2RldmljZXNfdCBFbmdpbmU6OmdldERldmljZUZvclN0cmF0ZWd5SW50KGxlZ2FjeV9zdHJhdGVneSBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZUlucHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb3V0cHV0RGV2aWNlVHlwZXNUb0lnbm9yZSkgY29uc3QKIHsKICAgICB1aW50MzJfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKICAgICB1aW50MzJfdCBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSA9CkBAIC0yNjcsMTYgKzE1MywxNyBAQAogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUw6Ci0gICAgICAgIGlmIChpc0luQ2FsbCgpIHx8IG91dHB1dHMuaXNTdHJlYW1BY3RpdmVMb2NhbGx5KEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSkgeworICAgICAgICBpZiAoaXNJbkNhbGwoKSB8fCBvdXRwdXRzLmlzQWN0aXZlTG9jYWxseSh0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkpKSB7CiAgICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneUludCgKICAgICAgICAgICAgICAgICAgICAgU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBhdmFpbGFibGVJbnB1dERldmljZXMsIG91dHB1dHMsCiAgICAgICAgICAgICAgICAgICAgIG91dHB1dERldmljZVR5cGVzVG9JZ25vcmUpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYm9vbCBtZWRpYV9hY3RpdmVfbG9jYWxseSA9Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dHMuaXNTdHJlYW1BY3RpdmVMb2NhbGx5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9NVVNJQywgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkpCi0gICAgICAgICAgICAgICAgICAgIHx8IG91dHB1dHMuaXNTdHJlYW1BY3RpdmVMb2NhbGx5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZLCBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuaXNBY3RpdmVMb2NhbGx5KHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9NVVNJQyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKQorICAgICAgICAgICAgICAgICAgICB8fCBvdXRwdXRzLmlzQWN0aXZlTG9jYWxseSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKTsKICAgICAgICAgICAgIC8vIHJvdXRpbmcgaXMgc2FtZSBhcyBtZWRpYSB3aXRob3V0IHRoZSAicmVtb3RlIiBkZXZpY2UKICAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5SW50KFNUUkFURUdZX01FRElBLAogICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLApAQCAtMzAyLDcgKzE4OSw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICAvLyB3aGVuIGluIGNhbGwsIERUTUYgYW5kIFBIT05FIHN0cmF0ZWdpZXMgZm9sbG93IHRoZSBzYW1lIHJ1bGVzCi0gICAgICAgIC8vIEZBTEwgVEhST1VHSAorICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKIAogICAgIGNhc2UgU1RSQVRFR1lfUEhPTkU6CiAgICAgICAgIC8vIEZvcmNlIHVzZSBvZiBvbmx5IGRldmljZXMgb24gcHJpbWFyeSBvdXRwdXQgaWY6CkBAIC0zMTMsMTQgKzIwMCwxNCBAQAogICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR4RGV2aWNlID0gZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04pOwogICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBwcmltYXJ5T3V0cHV0ID0gb3V0cHV0cy5nZXRQcmltYXJ5T3V0cHV0KCk7CiAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxQcmltYXJ5SW5wdXREZXZpY2VzID0KLSAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tSHdNb2R1bGUocHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCkpOworICAgICAgICAgICAgICAgICBhdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlVHlwZXNGcm9tSHdNb2R1bGUocHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCkpOwogCiAgICAgICAgICAgICAvLyBUT0RPOiBnZXRQcmltYXJ5T3V0cHV0IHJldHVybiBvbmx5IGRldmljZXMgZnJvbSBmaXJzdCBtb2R1bGUgaW4KICAgICAgICAgICAgIC8vIGF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCwgaGVhcmluZyBhaWQgaXMgbm90IHRoZXJlLCBidXQgaXQncwogICAgICAgICAgICAgLy8gYSBwcmltYXJ5IGRldmljZQogICAgICAgICAgICAgLy8gRklYTUU6IHRoaXMgaXMgbm90IHRoZSByaWdodCB3YXkgb2Ygc29sdmluZyB0aGlzIHByb2JsZW0KICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbFByaW1hcnlPdXRwdXREZXZpY2VzID0KLSAgICAgICAgICAgICAgICAocHJpbWFyeU91dHB1dC0+c3VwcG9ydGVkRGV2aWNlcygpIHwgQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRCkgJgorICAgICAgICAgICAgICAgIChwcmltYXJ5T3V0cHV0LT5zdXBwb3J0ZWREZXZpY2VzKCkudHlwZXMoKSB8IEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQpICYKICAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCk7CiAKICAgICAgICAgICAgIGlmICgoKGF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYKQEAgLTMzMiw3ICsyMTksNyBAQAogICAgICAgICB9CiAgICAgICAgIC8vIGZvciBwaG9uZSBzdHJhdGVneSwgd2UgZmlyc3QgY29uc2lkZXIgdGhlIGZvcmNlZCB1c2UgYW5kIHRoZW4gdGhlIGF2YWlsYWJsZSBkZXZpY2VzIGJ5CiAgICAgICAgIC8vIG9yZGVyIG9mIHByaW9yaXR5Ci0gICAgICAgIHN3aXRjaCAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0pIHsKKyAgICAgICAgc3dpdGNoIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT04pKSB7CiAgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTzoKICAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSB8fCBzdHJhdGVneSAhPSBTVFJBVEVHWV9EVE1GKSB7CiAgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUOwpAQCAtMzQzLDE0ICsyMzAsMTQgQEAKICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPOwogICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CiAgICAgICAgICAgICAvLyBpZiBTQ08gZGV2aWNlIGlzIHJlcXVlc3RlZCBidXQgbm8gU0NPIGRldmljZSBpcyBhdmFpbGFibGUsIGZhbGwgYmFjayB0byBkZWZhdWx0IGNhc2UKLSAgICAgICAgICAgIC8vIEZBTEwgVEhST1VHSAorICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAKICAgICAgICAgZGVmYXVsdDogICAgLy8gRk9SQ0VfTk9ORQogICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEOwogICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CiAgICAgICAgICAgICAvLyB3aGVuIG5vdCBpbiBhIHBob25lIGNhbGwsIHBob25lIHN0cmF0ZWd5IHNob3VsZCByb3V0ZSBTVFJFQU1fVk9JQ0VfQ0FMTCB0byBBMkRQCiAgICAgICAgICAgICBpZiAoIWlzSW5DYWxsKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBXSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUEpICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgogICAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5pc0EyZHBTdXBwb3J0ZWQoKSkgewogICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUDsKICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKQEAgLTM4NCw3ICsyNzEsNyBAQAogICAgICAgICAgICAgLy8gd2hlbiBub3QgaW4gYSBwaG9uZSBjYWxsLCBwaG9uZSBzdHJhdGVneSBzaG91bGQgcm91dGUgU1RSRUFNX1ZPSUNFX0NBTEwgdG8KICAgICAgICAgICAgIC8vIEEyRFAgc3BlYWtlciB3aGVuIGZvcmNpbmcgdG8gc3BlYWtlciBvdXRwdXQKICAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSAmJgotICAgICAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgorICAgICAgICAgICAgICAgICAgICAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQSkgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApICYmCiAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmlzQTJkcFN1cHBvcnRlZCgpKSB7CiAgICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVI7CiAgICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CkBAIC00MDgsMTUgKzI5NSwxNSBAQAogCiAgICAgY2FzZSBTVFJBVEVHWV9TT05JRklDQVRJT046CiAKLSAgICAgICAgLy8gSWYgaW5jYWxsLCBqdXN0IHNlbGVjdCB0aGUgU1RSQVRFR1lfUEhPTkUgZGV2aWNlOiBUaGUgcmVzdCBvZiB0aGUgYmVoYXZpb3IgaXMgaGFuZGxlZCBieQotICAgICAgICAvLyBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKS4KLSAgICAgICAgaWYgKGlzSW5DYWxsKCkgfHwgb3V0cHV0cy5pc1N0cmVhbUFjdGl2ZUxvY2FsbHkoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpKSB7CisgICAgICAgIC8vIElmIGluY2FsbCwganVzdCBzZWxlY3QgdGhlIFNUUkFURUdZX1BIT05FIGRldmljZQorICAgICAgICBpZiAoaXNJbkNhbGwoKSB8fAorICAgICAgICAgICAgICAgIG91dHB1dHMuaXNBY3RpdmVMb2NhbGx5KHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSkpIHsKICAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5SW50KAogICAgICAgICAgICAgICAgICAgICBTVFJBVEVHWV9QSE9ORSwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzLAogICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXZpY2VUeXBlc1RvSWdub3JlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIC8vIEZBTEwgVEhST1VHSAorICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKIAogICAgIGNhc2UgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRToKICAgICAgICAgLy8gc3RyYXRlZ3kgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSB1c2VzIHNhbWUgcm91dGluZyBwb2xpY3kgYXMgU1RSQVRFR1lfU09OSUZJQ0FUSU9OCkBAIC00MjUsNyArMzEyLDcgQEAKICAgICAgICAgLy8gICAtIGluIGNvdW50cmllcyB3aGVyZSBub3QgZW5mb3JjZWQgaW4gd2hpY2ggY2FzZSBpdCBmb2xsb3dzIFNUUkFURUdZX01FRElBCiAKICAgICAgICAgaWYgKChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHx8Ci0gICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkpIHsKKyAgICAgICAgICAgICAgICAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpKSB7CiAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKICAgICAgICAgfQogCkBAIC00NDEsOSArMzI4LDkgQEAKICAgICAgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ087CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBVc2UgT05MWSBCbHVldG9vdGggU0NPIG91dHB1dCB3aGVuIHJpbmdpbmcgaW4gdmlicmF0aW9uIG1vZGUKLSAgICAgICAgICAgIGlmICghKChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU1dID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpCisgICAgICAgICAgICBpZiAoISgoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpCiAgICAgICAgICAgICAgICAgICAgICYmIChzdHJhdGVneSA9PSBTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKSkpIHsKLSAgICAgICAgICAgICAgICBpZiAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfVklCUkFURV9SSU5HSU5HXQorICAgICAgICAgICAgICAgIGlmIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1ZJQlJBVEVfUklOR0lORykKICAgICAgICAgICAgICAgICAgICAgICAgID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGRldmljZTIgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSA9IGRldmljZTI7CkBAIC00NTIsNyArMzM5LDcgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBVc2UgYm90aCBCbHVldG9vdGggU0NPIGFuZCBwaG9uZSBkZWZhdWx0IG91dHB1dCB3aGVuIHJpbmdpbmcgaW4gbm9ybWFsIG1vZGUKLSAgICAgICAgICAgIGlmIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSB7CisgICAgICAgICAgICBpZiAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSB7CiAgICAgICAgICAgICAgICAgaWYgKChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpKSB7CkBAIC00NjYsNyArMzUzLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAvLyBUaGUgc2Vjb25kIGRldmljZSB1c2VkIGZvciBzb25pZmljYXRpb24gaXMgdGhlIHNhbWUgYXMgdGhlIGRldmljZSB1c2VkIGJ5IG1lZGlhIHN0cmF0ZWd5Ci0gICAgICAgIC8vIEZBTEwgVEhST1VHSAorICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKIAogICAgIGNhc2UgU1RSQVRFR1lfQUNDRVNTSUJJTElUWToKICAgICAgICAgaWYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkpIHsKQEAgLTQ3NCw3ICszNjEsNyBAQAogICAgICAgICAgICAgLy8gY29tcHJlc3NlZCBmb3JtYXQgYXMgdGhleSB3b3VsZCBsaWtlbHkgbm90IGJlIG1peGVkIGFuZCBkcm9wcGVkLgogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvdXRwdXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gb3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gZGVzYy0+ZGV2aWNlKCkgJgorICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gZGVzYy0+ZGV2aWNlcygpLnR5cGVzKCkgJgogICAgICAgICAgICAgICAgICAgICAoQVVESU9fREVWSUNFX09VVF9IRE1JIHwgQVVESU9fREVWSUNFX09VVF9TUERJRiB8IEFVRElPX0RFVklDRV9PVVRfSERNSV9BUkMpOwogICAgICAgICAgICAgICAgIGlmIChkZXNjLT5pc0FjdGl2ZSgpICYmICFhdWRpb19pc19saW5lYXJfcGNtKGRlc2MtPm1Gb3JtYXQpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VzICE9IEFVRElPX0RFVklDRV9OT05FKSB7CkBAIC00ODIsOSArMzY5LDkgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzID0KLSAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUpOwotICAgICAgICAgICAgaWYgKG91dHB1dHMuaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX1JJTkcpIHx8Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dHMuaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX0FMQVJNKSkgeworICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZU1hc2soYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUpOworICAgICAgICAgICAgaWYgKG91dHB1dHMuaXNBY3RpdmUodG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1JJTkcpKSB8fAorICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmlzQWN0aXZlKHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9BTEFSTSkpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGdldERldmljZUZvclN0cmF0ZWd5SW50KAogICAgICAgICAgICAgICAgICAgICBTVFJBVEVHWV9TT05JRklDQVRJT04sIGF2YWlsYWJsZU91dHB1dERldmljZXMsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgb3V0cHV0cywKICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGV2aWNlVHlwZXNUb0lnbm9yZSk7CkBAIC00OTYsNyArMzgzLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAvLyBGb3Igb3RoZXIgY2FzZXMsIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkgYmVoYXZlcyBsaWtlIFNUUkFURUdZX01FRElBCi0gICAgICAgIC8vIEZBTEwgVEhST1VHSAorICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKIAogICAgIC8vIEZJWE1FOiBTVFJBVEVHWV9SRVJPVVRJTkcgZm9sbG93IFNUUkFURUdZX01FRElBIGZvciBub3cKICAgICBjYXNlIFNUUkFURUdZX1JFUk9VVElORzoKQEAgLTUwNSw3ICszOTIsNyBAQAogICAgICAgICBpZiAoc3RyYXRlZ3kgIT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB7CiAgICAgICAgICAgICAvLyBubyBzb25pZmljYXRpb24gb24gcmVtb3RlIHN1Ym1peCAoZS5nLiBXRkQpCiAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2UoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIjAiKSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIjAiKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpICE9IDApIHsKICAgICAgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpICYgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC01MTUsMTEgKzQwMiwxMyBAQAogICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXZpY2VUeXBlc1RvSWdub3JlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgIC8vIEZJWE1FOiBGaW5kIGEgYmV0dGVyIHNvbHV0aW9uIHRvIHByZXZlbnQgcm91dGluZyB0byBCVCBoZWFyaW5nIGFpZChiLzEyMjkzMTI2MSkuCisgICAgICAgIGlmICgoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgJiYKKyAgICAgICAgICAgICAgICAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQSkgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApKSB7CiAgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEOwogICAgICAgICB9CiAgICAgICAgIGlmICgoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgJiYKLSAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgorICAgICAgICAgICAgICAgIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBKSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9fQlRfQTJEUCkgJiYKICAgICAgICAgICAgICAgICAgb3V0cHV0cy5pc0EyZHBTdXBwb3J0ZWQoKSkgewogICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUDsKICAgICAgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CkBAIC01MzAsNyArNDE5LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpICYmCi0gICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdID09IEFVRElPX1BPTElDWV9GT1JDRV9TUEVBS0VSKSkgeworICAgICAgICAgICAgKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUEpID09IEFVRElPX1BPTElDWV9GT1JDRV9TUEVBS0VSKSkgewogICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOwogICAgICAgICB9CiAgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7CkBAIC01NTksNyArNDQ4LDcgQEAKICAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSAmJgotICAgICAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9ET0NLXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQU5BTE9HX0RPQ0spKSB7CisgICAgICAgICAgICAgICAgKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRE9DSykgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0FOQUxPR19ET0NLKSkgewogICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9BTkxHX0RPQ0tfSEVBRFNFVDsKICAgICAgICAgfQogICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewpAQCAtNTgwLDcgKzQ2OSw3IEBACiAKICAgICAgICAgLy8gSWYgaGRtaSBzeXN0ZW0gYXVkaW8gbW9kZSBpcyBvbiwgcmVtb3ZlIHNwZWFrZXIgb3V0IG9mIG91dHB1dCBsaXN0LgogICAgICAgICBpZiAoKHN0cmF0ZWd5ID09IFNUUkFURUdZX01FRElBKSAmJgotICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0hETUlfU1lTVEVNX0FVRElPXSA9PQorICAgICAgICAgICAgKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfSERNSV9TWVNURU1fQVVESU8pID09CiAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0ZPUkNFX0hETUlfU1lTVEVNX0FVRElPX0VORk9SQ0VEKSkgewogICAgICAgICAgICAgZGV2aWNlICY9IH5BVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CiAgICAgICAgIH0KQEAgLTYwMiw3ICs0OTEsNyBAQAogCiAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewogICAgICAgICBBTE9HVigiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBubyBkZXZpY2UgZm91bmQgZm9yIHN0cmF0ZWd5ICVkIiwgc3RyYXRlZ3kpOwotICAgICAgICBkZXZpY2UgPSBtQXBtT2JzZXJ2ZXItPmdldERlZmF1bHRPdXRwdXREZXZpY2UoKS0+dHlwZSgpOworICAgICAgICBkZXZpY2UgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCktPnR5cGUoKTsKICAgICAgICAgQUxPR0VfSUYoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FLAogICAgICAgICAgICAgICAgICAiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBubyBkZWZhdWx0IGRldmljZSBkZWZpbmVkIik7CiAgICAgfQpAQCAtNjEzLDExICs1MDIsMTMgQEAKIAogYXVkaW9fZGV2aWNlc190IEVuZ2luZTo6Z2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UpIGNvbnN0CiB7Ci0gICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVPdXRwdXREZXZpY2VzID0gbUFwbU9ic2VydmVyLT5nZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCk7Ci0gICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVJbnB1dERldmljZXMgPSBtQXBtT2JzZXJ2ZXItPmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpOwotICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzID0gbUFwbU9ic2VydmVyLT5nZXRPdXRwdXRzKCk7CisgICAgY29uc3QgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZU91dHB1dERldmljZXMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCk7CisgICAgY29uc3QgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZUlucHV0RGV2aWNlcyA9IGdldEFwbU9ic2VydmVyKCktPmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpOworICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0T3V0cHV0cygpOwogICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbGFibGVEZXZpY2VUeXBlcyA9IGF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYgfkFVRElPX0RFVklDRV9CSVRfSU47Ci0KKyAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IHByaW1hcnlPdXRwdXQgPSBvdXRwdXRzLmdldFByaW1hcnlPdXRwdXQoKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxhYmxlUHJpbWFyeURldmljZVR5cGVzID0gYXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZVR5cGVzRnJvbUh3TW9kdWxlKAorICAgICAgICBwcmltYXJ5T3V0cHV0LT5nZXRNb2R1bGVIYW5kbGUoKSkgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKICAgICB1aW50MzJfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKIAogICAgIC8vIHdoZW4gYSBjYWxsIGlzIGFjdGl2ZSwgZm9yY2UgZGV2aWNlIHNlbGVjdGlvbiB0byBtYXRjaCBzb3VyY2UgVk9JQ0VfQ09NTVVOSUNBVElPTgpAQCAtNjMwLDYgKzUyMSw3IEBACiAgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1VOUFJPQ0VTU0VEOgogICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9IT1RXT1JEOgogICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9DQU1DT1JERVI6CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1BFUkZPUk1BTkNFOgogICAgICAgICAgICAgaW5wdXRTb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgpAQCAtNjM4LDE4ICs1MzAsMTEgQEAKICAgICB9CiAKICAgICBzd2l0Y2ggKGlucHV0U291cmNlKSB7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LOgotICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEwpIHsKLSAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTDsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCiAgICAgY2FzZSBBVURJT19TT1VSQ0VfREVGQVVMVDoKICAgICBjYXNlIEFVRElPX1NPVVJDRV9NSUM6CiAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSB7CiAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUDsKLSAgICB9IGVsc2UgaWYgKChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkRdID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pICYmCisgICAgfSBlbHNlIGlmICgoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkQpID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pICYmCiAgICAgICAgIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQpKSB7CiAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQ7CiAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSB7CkBAIC02NjgsMjAgKzU1MywxNyBAQAogICAgICAgICAvLyB0byB2b2ljZSBjYWxsIHBhdGguCiAgICAgICAgIGlmICgoZ2V0UGhvbmVTdGF0ZSgpID09IEFVRElPX01PREVfSU5fQ0FMTCkgJiYKICAgICAgICAgICAgICAgICAoYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpICYgQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgpID09IDApIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gcHJpbWFyeU91dHB1dCA9IG91dHB1dHMuZ2V0UHJpbWFyeU91dHB1dCgpOwotICAgICAgICAgICAgYXZhaWxhYmxlRGV2aWNlVHlwZXMgPQotICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21Id01vZHVsZShwcmltYXJ5T3V0cHV0LT5nZXRNb2R1bGVIYW5kbGUoKSkKLSAgICAgICAgICAgICAgICAgICAgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKKyAgICAgICAgICAgIGF2YWlsYWJsZURldmljZVR5cGVzID0gYXZhaWxhYmxlUHJpbWFyeURldmljZVR5cGVzOwogICAgICAgICB9CiAKLSAgICAgICAgc3dpdGNoIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSkgeworICAgICAgICBzd2l0Y2ggKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTikpIHsKICAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPOgogICAgICAgICAgICAgLy8gaWYgU0NPIGRldmljZSBpcyByZXF1ZXN0ZWQgYnV0IG5vIFNDTyBkZXZpY2UgaXMgYXZhaWxhYmxlLCBmYWxsIGJhY2sgdG8gZGVmYXVsdCBjYXNlCiAgICAgICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUKSB7CiAgICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVDsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEZBTEwgVEhST1VHSAorICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAKICAgICAgICAgZGVmYXVsdDogICAgLy8gRk9SQ0VfTk9ORQogICAgICAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQpIHsKQEAgLTcwOCw3ICs1OTAsMTAgQEAKICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTjoKICAgICBjYXNlIEFVRElPX1NPVVJDRV9VTlBST0NFU1NFRDoKICAgICBjYXNlIEFVRElPX1NPVVJDRV9IT1RXT1JEOgotICAgICAgICBpZiAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPICYmCisgICAgICAgIGlmIChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgeworICAgICAgICAgICAgYXZhaWxhYmxlRGV2aWNlVHlwZXMgPSBhdmFpbGFibGVQcmltYXJ5RGV2aWNlVHlwZXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPICYmCiAgICAgICAgICAgICAgICAgYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUKSB7CiAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUOwogICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQpIHsKQEAgLTcyNiwyNCArNjExLDQ0IEBACiAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQkFDS19NSUM7CiAgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpIHsKICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQzsKKyAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFKSB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIHNwZWNpZmljYWxseSBmb3IgYSBkZXZpY2Ugd2l0aG91dCBidWlsdC1pbiBtaWMKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LOgogICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NBTEw6CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LOgogICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTCkgewogICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEw7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfUEVSRk9STUFOQ0U6CisgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VUKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVDsKKyAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9VU0JfSEVBRFNFVCkgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1VTQl9IRUFEU0VUOworICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UpIHsKKyAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFOworICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKSB7CisgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWDoKICAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpIHsKICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwotICAgICBjYXNlIEFVRElPX1NPVVJDRV9GTV9UVU5FUjoKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9GTV9UVU5FUjoKICAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSKSB7CiAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fRk1fVFVORVI7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0U6CisgICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9FQ0hPX1JFRkVSRU5DRSkgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0VDSE9fUkVGRVJFTkNFOworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIEFMT0dXKCJnZXREZXZpY2VGb3JJbnB1dFNvdXJjZSgpIGludmFsaWQgaW5wdXQgc291cmNlICVkIiwgaW5wdXRTb3VyY2UpOwogICAgICAgICBicmVhazsKQEAgLTc2MCwxMCArNjY1LDEwNyBAQAogICAgIHJldHVybiBkZXZpY2U7CiB9CiAKK3ZvaWQgRW5naW5lOjp1cGRhdGVEZXZpY2VTZWxlY3Rpb25DYWNoZSgpCit7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogZ2V0UHJvZHVjdFN0cmF0ZWdpZXMoKSkgeworICAgICAgICBjb25zdCBhdXRvICZzdHJhdGVneSA9IGl0ZXIuc2Vjb25kOworICAgICAgICBhdXRvIGRldmljZXMgPSBnZXREZXZpY2VzRm9yUHJvZHVjdFN0cmF0ZWd5KHN0cmF0ZWd5LT5nZXRJZCgpKTsKKyAgICAgICAgbURldmljZXNGb3JTdHJhdGVnaWVzW3N0cmF0ZWd5LT5nZXRJZCgpXSA9IGRldmljZXM7CisgICAgICAgIHN0cmF0ZWd5LT5zZXREZXZpY2VUeXBlcyhkZXZpY2VzLnR5cGVzKCkpOworICAgICAgICBzdHJhdGVneS0+c2V0RGV2aWNlQWRkcmVzcyhkZXZpY2VzLmdldEZpcnN0VmFsaWRBZGRyZXNzKCkuY19zdHIoKSk7CisgICAgfQorfQorCitEZXZpY2VWZWN0b3IgRW5naW5lOjpnZXREZXZpY2VzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSkgY29uc3QKK3sKKyAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyA9IGdldEFwbU9ic2VydmVyKCktPmdldEF2YWlsYWJsZU91dHB1dERldmljZXMoKTsKKyAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlSW5wdXREZXZpY2VzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKCk7CisgICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gJm91dHB1dHMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRPdXRwdXRzKCk7CisKKyAgICBhdXRvIGxlZ2FjeVN0cmF0ZWd5ID0gbUxlZ2FjeVN0cmF0ZWd5TWFwLmZpbmQoc3RyYXRlZ3kpICE9IGVuZChtTGVnYWN5U3RyYXRlZ3lNYXApID8KKyAgICAgICAgICAgICAgICBtTGVnYWN5U3RyYXRlZ3lNYXAuYXQoc3RyYXRlZ3kpIDogU1RSQVRFR1lfTk9ORTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IGdldERldmljZUZvclN0cmF0ZWd5SW50KGxlZ2FjeVN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClBVURJT19ERVZJQ0VfTk9ORSk7CisgICAgcmV0dXJuIGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlTWFzayhkZXZpY2VzKTsKK30KKworRGV2aWNlVmVjdG9yIEVuZ2luZTo6Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJnByZWZlcnJlZERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlKSBjb25zdAoreworICAgIC8vIEZpcnN0IGNoZWNrIGZvciBleHBsaWN0IHJvdXRpbmcgZGV2aWNlCisgICAgaWYgKHByZWZlcnJlZERldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIEFMT0dWKCIlcyBleHBsaWNpdCBSb3V0aW5nIG9uIGRldmljZSAlcyIsIF9fZnVuY19fLCBwcmVmZXJyZWREZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBEZXZpY2VWZWN0b3IocHJlZmVycmVkRGV2aWNlKTsKKyAgICB9CisgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5ID0gZ2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKKyAgICBjb25zdCBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyA9IGdldEFwbU9ic2VydmVyKCktPmdldEF2YWlsYWJsZU91dHB1dERldmljZXMoKTsKKyAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cyA9IGdldEFwbU9ic2VydmVyKCktPmdldE91dHB1dHMoKTsKKyAgICAvLworICAgIC8vIEBUT0RPOiB3aGF0IGlzIHRoZSBwcmlvcml0eSBvZiBleHBsaWNpdCByb3V0aW5nPyBTaGFsbCBpdCBiZSBjb25zaWRlcmVkIGZpcnN0IGFzIGl0IHVzZWQgdG8KKyAgICAvLyBiZSBieSBBUE0/CisgICAgLy8KKyAgICAvLyBIb25vciBleHBsaWNpdCByb3V0aW5nIHJlcXVlc3RzIG9ubHkgaWYgYWxsIGFjdGl2ZSBjbGllbnRzIGhhdmUgYSBwcmVmZXJyZWQgcm91dGUgaW4gd2hpY2gKKyAgICAvLyBjYXNlIHRoZSBsYXN0IGFjdGl2ZSBjbGllbnQgcm91dGUgaXMgdXNlZAorICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IGZpbmRQcmVmZXJyZWREZXZpY2Uob3V0cHV0cywgc3RyYXRlZ3ksIGF2YWlsYWJsZU91dHB1dERldmljZXMpOworICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKGRldmljZSk7CisgICAgfQorCisgICAgcmV0dXJuIGZyb21DYWNoZT8gbURldmljZXNGb3JTdHJhdGVnaWVzLmF0KHN0cmF0ZWd5KSA6IGdldERldmljZXNGb3JQcm9kdWN0U3RyYXRlZ3koc3RyYXRlZ3kpOworfQorCitEZXZpY2VWZWN0b3IgRW5naW5lOjpnZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBib29sIGZyb21DYWNoZSkgY29uc3QKK3sKKyAgICBhdXRvIGF0dHJpYnV0ZXMgPSBnZXRBdHRyaWJ1dGVzRm9yU3RyZWFtVHlwZShzdHJlYW0pOworICAgIHJldHVybiBnZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBudWxscHRyLCBmcm9tQ2FjaGUpOworfQorCitzcDxEZXZpY2VEZXNjcmlwdG9yPiBFbmdpbmU6OmdldElucHV0RGV2aWNlRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gKm1peCkgY29uc3QKK3sKKyAgICBjb25zdCBhdXRvICZwb2xpY3lNaXhlcyA9IGdldEFwbU9ic2VydmVyKCktPmdldEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbigpOworICAgIGNvbnN0IGF1dG8gYXZhaWxhYmxlSW5wdXREZXZpY2VzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKCk7CisgICAgY29uc3QgYXV0byAmaW5wdXRzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0SW5wdXRzKCk7CisgICAgc3RkOjpzdHJpbmcgYWRkcmVzczsKKworICAgIC8vCisgICAgLy8gRXhwbGljaXQgUm91dGluZyA/Pz8gd2hhdCBpcyB0aGUgcHJpb3JpdHkgb2YgZXhwbGljaXQgcm91dGluZz8gU2hhbGwgaXQgYmUgY29uc2lkZXJlZAorICAgIC8vIGZpcnN0IGFzIGl0IHVzZWQgdG8gYmUgYnkgQVBNPworICAgIC8vCisgICAgLy8gSG9ub3IgZXhwbGljaXQgcm91dGluZyByZXF1ZXN0cyBvbmx5IGlmIGFsbCBhY3RpdmUgY2xpZW50cyBoYXZlIGEgcHJlZmVycmVkIHJvdXRlIGluIHdoaWNoCisgICAgLy8gY2FzZSB0aGUgbGFzdCBhY3RpdmUgY2xpZW50IHJvdXRlIGlzIHVzZWQKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPQorICAgICAgICAgICAgZmluZFByZWZlcnJlZERldmljZShpbnB1dHMsIGF0dHIuc291cmNlLCBhdmFpbGFibGVJbnB1dERldmljZXMpOworICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZGV2aWNlOworICAgIH0KKworICAgIGRldmljZSA9IHBvbGljeU1peGVzLmdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGF0dHIuc291cmNlLCBhdmFpbGFibGVJbnB1dERldmljZXMsIG1peCk7CisgICAgaWYgKGRldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBkZXZpY2U7CisgICAgfQorICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlID0gZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXR0ci5zb3VyY2UpOworCisgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGRldmljZVR5cGUpKSB7CisgICAgICAgIGFkZHJlc3MgPSAiMCI7CisgICAgICAgIHN0ZDo6c2l6ZV90IHBvczsKKyAgICAgICAgc3RkOjpzdHJpbmcgdGFncyB7IGF0dHIudGFncyB9OworICAgICAgICBpZiAoKHBvcyA9IHRhZ3MuZmluZCgiYWRkcj0iKSkgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIGFkZHJlc3MgPSB0YWdzLnN1YnN0cihwb3MgKyBzdGQ6OnN0cmxlbigiYWRkcj0iKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2UoZGV2aWNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGFkZHJlc3MuY19zdHIoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOworfQorCiB0ZW1wbGF0ZSA8PgogQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlICpFbmdpbmU6OnF1ZXJ5SW50ZXJmYWNlKCkKIHsKLSAgICByZXR1cm4gJm1NYW5hZ2VySW50ZXJmYWNlOworICAgIHJldHVybiB0aGlzOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmgKaW5kZXggMDYxODZjMS4uZDVkZmFjYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmgKQEAgLTE2LDcgKzE2LDcgQEAKIAogI3ByYWdtYSBvbmNlCiAKLQorI2luY2x1ZGUgIkVuZ2luZUJhc2UuaCIKICNpbmNsdWRlICJBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaCIKICNpbmNsdWRlIDxBdWRpb0dhaW4uaD4KICNpbmNsdWRlIDxwb2xpY3kuaD4KQEAgLTI5LDExNCArMjksNjcgQEAKIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKIHsKIAotY2xhc3MgRW5naW5lCitlbnVtIGxlZ2FjeV9zdHJhdGVneSB7CisgICAgU1RSQVRFR1lfTk9ORSA9IC0xLAorICAgIFNUUkFURUdZX01FRElBLAorICAgIFNUUkFURUdZX1BIT05FLAorICAgIFNUUkFURUdZX1NPTklGSUNBVElPTiwKKyAgICBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCwKKyAgICBTVFJBVEVHWV9EVE1GLAorICAgIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUsCisgICAgU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSLAorICAgIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFksCisgICAgU1RSQVRFR1lfUkVST1VUSU5HLAorfTsKKworY2xhc3MgRW5naW5lIDogcHVibGljIEVuZ2luZUJhc2UKIHsKIHB1YmxpYzoKICAgICBFbmdpbmUoKTsKLSAgICB2aXJ0dWFsIH5FbmdpbmUoKTsKKyAgICB2aXJ0dWFsIH5FbmdpbmUoKSA9IGRlZmF1bHQ7CiAKICAgICB0ZW1wbGF0ZSA8Y2xhc3MgUmVxdWVzdGVkSW50ZXJmYWNlPgogICAgIFJlcXVlc3RlZEludGVyZmFjZSAqcXVlcnlJbnRlcmZhY2UoKTsKIAogcHJpdmF0ZToKLSAgICAvLy8gSW50ZXJmYWNlIG1lbWJlcnMKLSAgICBjbGFzcyBNYW5hZ2VySW50ZXJmYWNlSW1wbCA6IHB1YmxpYyBBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UKLSAgICB7Ci0gICAgcHVibGljOgotICAgICAgICBleHBsaWNpdCBNYW5hZ2VySW50ZXJmYWNlSW1wbChFbmdpbmUgKnBvbGljeUVuZ2luZSkKLSAgICAgICAgICAgIDogbVBvbGljeUVuZ2luZShwb2xpY3lFbmdpbmUpIHt9CisgICAgLy8vCisgICAgLy8vIGZyb20gRW5naW5lQmFzZSwgc28gZnJvbSBBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UKKyAgICAvLy8KKyAgICBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpIG92ZXJyaWRlOwogCi0gICAgICAgIHZpcnR1YWwgdm9pZCBzZXRPYnNlcnZlcihBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqb2JzZXJ2ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1Qb2xpY3lFbmdpbmUtPnNldE9ic2VydmVyKG9ic2VydmVyKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5pbml0Q2hlY2soKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSkgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldERldmljZUZvcklucHV0U291cmNlKGlucHV0U291cmNlKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3kpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCByb3V0aW5nX3N0cmF0ZWd5IGdldFN0cmF0ZWd5Rm9yVXNhZ2UoYXVkaW9fdXNhZ2VfdCB1c2FnZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldFN0cmF0ZWd5Rm9yVXNhZ2UodXNhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3QgbW9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPnNldFBob25lU3RhdGUobW9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBhdWRpb19tb2RlX3QgZ2V0UGhvbmVTdGF0ZSgpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRQaG9uZVN0YXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5zZXRGb3JjZVVzZSh1c2FnZSwgY29uZmlnKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0Rm9yY2VVc2UodXNhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IC8qZGV2RGVzYyovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgLypzdGF0ZSovKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICBwcml2YXRlOgotICAgICAgICBFbmdpbmUgKm1Qb2xpY3lFbmdpbmU7Ci0gICAgfSBtTWFuYWdlckludGVyZmFjZTsKKyAgICBEZXZpY2VWZWN0b3IgZ2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmcHJlZmVyZWREZXZpY2UgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSA9IGZhbHNlKSBjb25zdCBvdmVycmlkZTsKKworICAgIERldmljZVZlY3RvciBnZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlID0gZmFsc2UpIGNvbnN0IG92ZXJyaWRlOworCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0SW5wdXREZXZpY2VGb3JBdHRyaWJ1dGVzKAorICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBzcDxBdWRpb1BvbGljeU1peD4gKm1peCA9IG51bGxwdHIpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdm9pZCB1cGRhdGVEZXZpY2VTZWxlY3Rpb25DYWNoZSgpIG92ZXJyaWRlOwogCiBwcml2YXRlOgogICAgIC8qIENvcHkgZmFjaWxpdGllcyBhcmUgcHV0IHByaXZhdGUgdG8gZGlzYWJsZSBjb3B5LiAqLwogICAgIEVuZ2luZShjb25zdCBFbmdpbmUgJm9iamVjdCk7CiAgICAgRW5naW5lICZvcGVyYXRvcj0oY29uc3QgRW5naW5lICZvYmplY3QpOwogCi0gICAgdm9pZCBzZXRPYnNlcnZlcihBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqb2JzZXJ2ZXIpOwotCi0gICAgc3RhdHVzX3QgaW5pdENoZWNrKCk7Ci0KLSAgICBpbmxpbmUgYm9vbCBpc0luQ2FsbCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gaXNfc3RhdGVfaW5fY2FsbChtUGhvbmVTdGF0ZSk7Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3QgbW9kZSk7Ci0gICAgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1QaG9uZVN0YXRlOwotICAgIH0KLSAgICBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKTsKLSAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBtRm9yY2VVc2VbdXNhZ2VdOwotICAgIH0KICAgICBzdGF0dXNfdCBzZXREZWZhdWx0RGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwogCi0gICAgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0gICAgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneUZvclVzYWdlKGF1ZGlvX3VzYWdlX3QgdXNhZ2UpOwotICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KSBjb25zdDsKLSAgICBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9yU3RyYXRlZ3lJbnQocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKLSAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVPdXRwdXREZXZpY2VzLAotICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZUlucHV0RGV2aWNlcywKLSAgICAgICAgICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzLAotICAgICAgICAgICAgdWludDMyX3Qgb3V0cHV0RGV2aWNlVHlwZXNUb0lnbm9yZSkgY29uc3Q7CisgICAgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvclN0cmF0ZWd5SW50KGxlZ2FjeV9zdHJhdGVneSBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZU91dHB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVJbnB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBvdXRwdXREZXZpY2VUeXBlc1RvSWdub3JlKSBjb25zdDsKKworICAgIERldmljZVZlY3RvciBnZXREZXZpY2VzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSkgY29uc3Q7CisKICAgICBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UpIGNvbnN0OwotICAgIGF1ZGlvX21vZGVfdCBtUGhvbmVTdGF0ZTsgIC8qKjwgY3VycmVudCBwaG9uZSBzdGF0ZS4gKi8KIAotICAgIC8qKiBjdXJyZW50IGZvcmNlZCB1c2UgY29uZmlndXJhdGlvbi4gKi8KLSAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVF07CisgICAgRGV2aWNlU3RyYXRlZ3lNYXAgbURldmljZXNGb3JTdHJhdGVnaWVzOwogCi0gICAgQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm1BcG1PYnNlcnZlcjsKKyAgICBzdGQ6Om1hcDxwcm9kdWN0X3N0cmF0ZWd5X3QsIGxlZ2FjeV9zdHJhdGVneT4gbUxlZ2FjeVN0cmF0ZWd5TWFwOwogfTsKIH0gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlci9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlci9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2Y2EyZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyL0FuZHJvaWQubWsKQEAgLTAsMCArMSwzMiBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2lmbmVxICgkKFVTRV9DVVNUT01fQVVESU9fUE9MSUNZKSwgMSkKKworaW5jbHVkZSAkKENMRUFSX1ZBUlMpCisKK0xPQ0FMX1NSQ19GSUxFUzo9IFwKKyAgICBBdWRpb1BvbGljeUZhY3RvcnkuY3BwCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmF1ZGlvcG9saWN5bWFuYWdlcmRlZmF1bHQKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCisgICAgbGliYXVkaW9wb2xpY3ljb21wb25lbnRzCisKK0xPQ0FMX0NfSU5DTFVERVMgKz0gXAorICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKKworTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCisgICAgbGliYXVkaW9wb2xpY3ljb21tb24gXAorICAgIGxpYmF1ZGlvcG9saWN5ZW5naW5lX2ludGVyZmFjZV9oZWFkZXJzIFwKKyAgICBsaWJhdWRpb3BvbGljeW1hbmFnZXJfaW50ZXJmYWNlX2hlYWRlcnMKKworTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKKworTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKKworTE9DQUxfTU9EVUxFOj0gbGliYXVkaW9wb2xpY3ltYW5hZ2VyCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKworZW5kaWYgI2lmbmVxICgkKFVTRV9DVVNUT01fQVVESU9fUE9MSUNZKSwgMSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXIvQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXIvQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcAppbmRleCAzZWZhMWIwLi43YWZmNmE5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyL0F1ZGlvUG9saWN5RmFjdG9yeS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlci9BdWRpb1BvbGljeUZhY3RvcnkuY3BwCkBAIC0xNCw3ICsxNCw3IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSAibWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmgiCisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0FuZHJvaWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg0ZmM5ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0FuZHJvaWQubWsKQEAgLTAsMCArMSw1NiBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBBdWRpb1BvbGljeU1hbmFnZXIuY3BwCisKK0xPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSAkKExPQ0FMX1BBVEgpCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmN1dGlscyBcCisgICAgbGlidXRpbHMgXAorICAgIGxpYmxvZyBcCisgICAgbGliYXVkaW9wb2xpY3kgXAorICAgIGxpYnNvdW5kdHJpZ2dlcgorCitpZmVxICgkKFVTRV9DT05GSUdVUkFCTEVfQVVESU9fUE9MSUNZKSwgMSkKKworaWZuZXEgKCQoVVNFX1hNTF9BVURJT19QT0xJQ1lfQ09ORiksIDEpCiskKGVycm9yIENvbmZpZ3VyYWJsZSBwb2xpY3kgZG9lcyBub3Qgc3VwcG9ydCBsZWdhY3kgY29uZiBmaWxlKQorZW5kaWYgI2lmbmVxICgkKFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYpLCAxKQorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmF1ZGlvcG9saWN5ZW5naW5lY29uZmlndXJhYmxlCisKK2Vsc2UKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJhdWRpb3BvbGljeWVuZ2luZWRlZmF1bHQKKworZW5kaWYgIyBpZmVxICgkKFVTRV9DT05GSUdVUkFCTEVfQVVESU9fUE9MSUNZKSwgMSkKKworTE9DQUxfQ19JTkNMVURFUyArPSBcCisgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKQorCitMT0NBTF9IRUFERVJfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3BvbGljeWNvbW1vbiBcCisgICAgbGliYXVkaW9wb2xpY3llbmdpbmVfaW50ZXJmYWNlX2hlYWRlcnMgXAorICAgIGxpYmF1ZGlvcG9saWN5bWFuYWdlcl9pbnRlcmZhY2VfaGVhZGVycworCitMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJtZWRpYV9oZWxwZXIKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGlibWVkaWFtZXRyaWNzCisKK0xPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGliYmluZGVyIGxpYmhpZGxiYXNlIGxpYnhtbDIKKworaWZlcSAoJChVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GKSwgMSkKK0xPQ0FMX0NGTEFHUyArPSAtRFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYKK2VuZGlmICNpZmVxICgkKFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYpLCAxKQorCitMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgorCitMT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQorCitMT0NBTF9NT0RVTEU6PSBsaWJhdWRpb3BvbGljeW1hbmFnZXJkZWZhdWx0CisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCmluZGV4IDI3MzZmZDQuLjNjYTc1OTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcApAQCAtMTUsNyArMTUsMTIgQEAKICAqLwogCiAjZGVmaW5lIExPR19UQUcgIkFQTV9BdWRpb1BvbGljeU1hbmFnZXIiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKy8vIE5lZWQgdG8ga2VlcCB0aGUgbG9nIHN0YXRlbWVudHMgZXZlbiBpbiBwcm9kdWN0aW9uIGJ1aWxkcworLy8gdG8gZW5hYmxlIFZFUkJPU0UgbG9nZ2luZyBkeW5hbWljYWxseS4KKy8vIFlvdSBjYW4gZW5hYmxlIFZFUkJPU0UgbG9nZ2luZyBhcyBmb2xsb3dzOgorLy8gYWRiIHNoZWxsIHNldHByb3AgbG9nLnRhZy5BUE1fQXVkaW9Qb2xpY3lNYW5hZ2VyIFYKKyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKIC8vI2RlZmluZSBWRVJZX1ZFUkJPU0VfTE9HR0lORwogI2lmZGVmIFZFUllfVkVSQk9TRV9MT0dHSU5HCkBAIC0yOCwyNCArMzMsMjUgQEAKICNkZWZpbmUgQVVESU9fUE9MSUNZX1hNTF9DT05GSUdfRklMRV9OQU1FICJhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiCiAjZGVmaW5lIEFVRElPX1BPTElDWV9BMkRQX09GRkxPQURfRElTQUJMRURfWE1MX0NPTkZJR19GSUxFX05BTUUgXAogICAgICAgICAiYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fYTJkcF9vZmZsb2FkX2Rpc2FibGVkLnhtbCIKKyNkZWZpbmUgQVVESU9fUE9MSUNZX0JMVUVUT09USF9MRUdBQ1lfSEFMX1hNTF9DT05GSUdfRklMRV9OQU1FIFwKKyAgICAgICAgImF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX2JsdWV0b290aF9sZWdhY3lfaGFsLnhtbCIKIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPG1hdGguaD4KLQorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxBdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAjaW5jbHVkZSA8c291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPGF1ZGlvX3BvbGljeV9jb25mLmg+CiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lNYW5hZ2VyLmgiCi0jaWZuZGVmIFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYKLSNpbmNsdWRlIDxDb25maWdQYXJzaW5nVXRpbHMuaD4KLSNpbmNsdWRlIDxTdHJlYW1EZXNjcmlwdG9yLmg+Ci0jZW5kaWYKICNpbmNsdWRlIDxTZXJpYWxpemVyLmg+CiAjaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgogI2luY2x1ZGUgPHBvbGljeS5oPgpAQCAtNjAsMjUgKzY2LDE1IEBACiAvLyBtZWRpYSAvIG5vdGlmaWNhdGlvbiAvIHN5c3RlbSB2b2x1bWUuCiBjb25zdGV4cHIgZmxvYXQgSU5fQ0FMTF9FQVJQSUVDRV9IRUFEUk9PTV9EQiA9IDMuZjsKIAotI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKLS8vIEFycmF5IG9mIGFsbCBzdXJyb3VuZCBmb3JtYXRzLgotc3RhdGljIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IFNVUlJPVU5EX0ZPUk1BVFNbXSA9IHsKLSAgICBBVURJT19GT1JNQVRfQUMzLAotICAgIEFVRElPX0ZPUk1BVF9FX0FDMywKLSAgICBBVURJT19GT1JNQVRfRFRTLAotICAgIEFVRElPX0ZPUk1BVF9EVFNfSEQsCi0gICAgQVVESU9fRk9STUFUX0FBQ19MQywKLSAgICBBVURJT19GT1JNQVRfRE9MQllfVFJVRUhELAotICAgIEFVRElPX0ZPUk1BVF9FX0FDM19KT0MsCi19OwotLy8gQXJyYXkgb2YgYWxsIEFBQyBmb3JtYXRzLiBXaGVuIEFBQyBpcyBlbmFibGVkIGJ5IHVzZXJzLCBhbGwgQUFDIGZvcm1hdHMgc2hvdWxkIGJlIGVuYWJsZWQuCi1zdGF0aWMgY29uc3QgYXVkaW9fZm9ybWF0X3QgQUFDX0ZPUk1BVFNbXSA9IHsKLSAgICBBVURJT19GT1JNQVRfQUFDX0xDLAotICAgIEFVRElPX0ZPUk1BVF9BQUNfSEVfVjEsCi0gICAgQVVESU9fRk9STUFUX0FBQ19IRV9WMiwKLSAgICBBVURJT19GT1JNQVRfQUFDX0VMRCwKLSAgICBBVURJT19GT1JNQVRfQUFDX1hIRSwKLX07CisvLyBDb21wcmVzc2VkIGZvcm1hdHMgZm9yIE1TRCBtb2R1bGUsIG9yZGVyZWQgZnJvbSBtb3N0IHByZWZlcnJlZCB0byBsZWFzdCBwcmVmZXJyZWQuCitzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+IGNvbXByZXNzZWRGb3JtYXRzT3JkZXIgPSB7eworICAgICAgICBBVURJT19GT1JNQVRfTUFUXzJfMSwgQVVESU9fRk9STUFUX01BVF8yXzAsIEFVRElPX0ZPUk1BVF9FX0FDMywKKyAgICAgICAgQVVESU9fRk9STUFUX0FDMywgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgfX07CisvLyBDaGFubmVsIG1hc2tzIGZvciBNU0QgbW9kdWxlLCAzRCA+IDJEID4gMUQgb3JkZXJpbmcgKG1vc3QgcHJlZmVycmVkIHRvIGxlYXN0IHByZWZlcnJlZCkuCitzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+IHN1cnJvdW5kQ2hhbm5lbE1hc2tzT3JkZXIgPSB7eworICAgICAgICBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxUE9JTlQyLCBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQwUE9JTlQyLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxUE9JTlQyLCBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQwUE9JTlQyLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8gfX07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEF1ZGlvUG9saWN5SW50ZXJmYWNlIGltcGxlbWVudGF0aW9uCkBAIC04Nyw0MyArODMsNDkgQEAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KQogewotICAgIHN0YXR1c190IHN0YXR1cyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChkZXZpY2UsIHN0YXRlLCBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUpOworICAgIHN0YXR1c190IHN0YXR1cyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChkZXZpY2UsIHN0YXRlLCBkZXZpY2VfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX25hbWUsIGVuY29kZWRGb3JtYXQpOwogICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJmRldmljZV9hZGRyZXNzKQordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpCiB7Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0oZGV2aWNlX2FkZHJlc3MpOworICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtKGRldmljZS0+YWRkcmVzcygpKTsKICAgICBjb25zdCBTdHJpbmc4IGtleShzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSA/CiAgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbUNvbm5lY3QgOiBBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtRGlzY29ubmVjdCk7Ci0gICAgcGFyYW0uYWRkSW50KGtleSwgZGV2aWNlKTsKKyAgICBwYXJhbS5hZGRJbnQoa2V5LCBkZXZpY2UtPnR5cGUoKSk7CiAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoQVVESU9fSU9fSEFORExFX05PTkUsIHBhcmFtLnRvU3RyaW5nKCkpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KQogewotICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoKSBkZXZpY2U6IDB4JVgsIHN0YXRlICVkLCBhZGRyZXNzICVzIG5hbWUgJXMiLAotICAgICAgICAgICAgZGV2aWNlLCBzdGF0ZSwgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lKTsKKyAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KCkgZGV2aWNlOiAweCVYLCBzdGF0ZSAlZCwgYWRkcmVzcyAlcyBuYW1lICVzIGZvcm1hdCAweCVYIiwKKyAgICAgICAgICAgIGRldmljZVR5cGUsIHN0YXRlLCBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUsIGVuY29kZWRGb3JtYXQpOwogCiAgICAgLy8gY29ubmVjdC9kaXNjb25uZWN0IG9ubHkgMSBkZXZpY2UgYXQgYSB0aW1lCi0gICAgaWYgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkgJiYgIWF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2UpKSByZXR1cm4gQkFEX1ZBTFVFOworICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2VUeXBlKSAmJiAhYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZVR5cGUpKSByZXR1cm4gQkFEX1ZBTFVFOwogCi0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9Ci0gICAgICAgICAgICBtSHdNb2R1bGVzLmdldERldmljZURlc2NyaXB0b3IoZGV2aWNlLCBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUpOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9CisgICAgICAgICAgICBtSHdNb2R1bGVzLmdldERldmljZURlc2NyaXB0b3IoZGV2aWNlVHlwZSwgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lLCBlbmNvZGVkRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKTsKKyAgICBpZiAoZGV2aWNlID09IDApIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KIAogICAgIC8vIGhhbmRsZSBvdXRwdXQgZGV2aWNlcwotICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICBpZiAoYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2VUeXBlKSkgewogICAgICAgICBTb3J0ZWRWZWN0b3IgPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzOwogCi0gICAgICAgIHNzaXplX3QgaW5kZXggPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5pbmRleE9mKGRldkRlc2MpOworICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuaW5kZXhPZihkZXZpY2UpOwogCiAgICAgICAgIC8vIHNhdmUgYSBjb3B5IG9mIHRoZSBvcGVuZWQgb3V0cHV0IGRlc2NyaXB0b3JzIGJlZm9yZSBhbnkgb3V0cHV0IGlzIG9wZW5lZCBvciBjbG9zZWQKICAgICAgICAgLy8gYnkgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkuIFRoaXMgd2lsbCBiZSBuZWVkZWQgYnkgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkKQEAgLTEzMywxMTUgKzEzNSwxMzYgQEAKICAgICAgICAgLy8gaGFuZGxlIG91dHB1dCBkZXZpY2UgY29ubmVjdGlvbgogICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFOiB7CiAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkZXZpY2UgYWxyZWFkeSBjb25uZWN0ZWQ6ICV4IiwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBkZXZpY2UgYWxyZWFkeSBjb25uZWN0ZWQ6ICVzIiwgX19mdW5jX18sIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgY29ubmVjdGluZyBkZXZpY2UgJXgiLCBkZXZpY2UpOworICAgICAgICAgICAgQUxPR1YoIiVzKCkgY29ubmVjdGluZyBkZXZpY2UgJXMgZm9ybWF0ICV4IiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpLCBlbmNvZGVkRm9ybWF0KTsKIAogICAgICAgICAgICAgLy8gcmVnaXN0ZXIgbmV3IGRldmljZSBhcyBhdmFpbGFibGUKLSAgICAgICAgICAgIGluZGV4ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuYWRkKGRldkRlc2MpOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBzcDxId01vZHVsZT4gbW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGb3JEZXZpY2UoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBpZiAobW9kdWxlID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0QoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGNvdWxkIG5vdCBmaW5kIEhXIG1vZHVsZSBmb3IgZGV2aWNlICUwOHgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5yZW1vdmUoZGV2RGVzYyk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXNbaW5kZXhdLT5hdHRhY2gobW9kdWxlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobUF2YWlsYWJsZU91dHB1dERldmljZXMuYWRkKGRldmljZSkgPCAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gQmVmb3JlIGNoZWNraW5nIG91dHB1dHMsIGJyb2FkY2FzdCBjb25uZWN0IGV2ZW50IHRvIGFsbG93IEhBTCB0byByZXRyaWV2ZSBkeW5hbWljCiAgICAgICAgICAgICAvLyBwYXJhbWV0ZXJzIG9uIG5ld2x5IGNvbm5lY3RlZCBkZXZpY2VzIChpbnN0ZWFkIG9mIG9wZW5pbmcgdGhlIG91dHB1dHMuLi4pCi0gICAgICAgICAgICBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSwgZGV2RGVzYy0+bUFkZHJlc3MpOworICAgICAgICAgICAgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUpOwogCi0gICAgICAgICAgICBpZiAoY2hlY2tPdXRwdXRzRm9yRGV2aWNlKGRldkRlc2MsIHN0YXRlLCBvdXRwdXRzLCBkZXZEZXNjLT5tQWRkcmVzcykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5yZW1vdmUoZGV2RGVzYyk7CisgICAgICAgICAgICBpZiAoY2hlY2tPdXRwdXRzRm9yRGV2aWNlKGRldmljZSwgc3RhdGUsIG91dHB1dHMpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMucmVtb3ZlKGRldmljZSk7CiAKLSAgICAgICAgICAgICAgICBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5tQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgbUh3TW9kdWxlcy5jbGVhblVwRm9yRGV2aWNlKGRldmljZSk7CisKKyAgICAgICAgICAgICAgICBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKTsKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBQcm9wYWdhdGUgZGV2aWNlIGF2YWlsYWJpbGl0eSB0byBFbmdpbmUKLSAgICAgICAgICAgIG1FbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZEZXNjLCBzdGF0ZSk7CiAKICAgICAgICAgICAgIC8vIG91dHB1dHMgc2hvdWxkIG5ldmVyIGJlIGVtcHR5IGhlcmUKICAgICAgICAgICAgIEFMT0dfQVNTRVJUKG91dHB1dHMuc2l6ZSgpICE9IDAsICJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKToiCiAgICAgICAgICAgICAgICAgICAgICJjaGVja091dHB1dHNGb3JEZXZpY2UoKSByZXR1cm5lZCBubyBvdXRwdXRzIGJ1dCBzdGF0dXMgT0siKTsKLSAgICAgICAgICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBjaGVja091dHB1dHNGb3JEZXZpY2UoKSByZXR1cm5lZCAlenUgb3V0cHV0cyIsCi0gICAgICAgICAgICAgICAgICBvdXRwdXRzLnNpemUoKSk7CisgICAgICAgICAgICBBTE9HVigiJXMoKSBjaGVja091dHB1dHNGb3JEZXZpY2UoKSByZXR1cm5lZCAlenUgb3V0cHV0cyIsIF9fZnVuY19fLCBvdXRwdXRzLnNpemUoKSk7CiAKICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIC8vIGhhbmRsZSBvdXRwdXQgZGV2aWNlIGRpc2Nvbm5lY3Rpb24KICAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOiB7CiAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZSBub3QgY29ubmVjdGVkOiAleCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgZGV2aWNlIG5vdCBjb25uZWN0ZWQ6ICVzIiwgX19mdW5jX18sIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkaXNjb25uZWN0aW5nIG91dHB1dCBkZXZpY2UgJXgiLCBkZXZpY2UpOworICAgICAgICAgICAgQUxPR1YoIiVzKCkgZGlzY29ubmVjdGluZyBvdXRwdXQgZGV2aWNlICVzIiwgX19mdW5jX18sIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKIAogICAgICAgICAgICAgLy8gU2VuZCBEaXNjb25uZWN0IHRvIEhBTHMKLSAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlLCBkZXZEZXNjLT5tQWRkcmVzcyk7CisgICAgICAgICAgICBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSk7CiAKICAgICAgICAgICAgIC8vIHJlbW92ZSBkZXZpY2UgZnJvbSBhdmFpbGFibGUgb3V0cHV0IGRldmljZXMKLSAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShkZXZEZXNjKTsKKyAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShkZXZpY2UpOwogCi0gICAgICAgICAgICBjaGVja091dHB1dHNGb3JEZXZpY2UoZGV2RGVzYywgc3RhdGUsIG91dHB1dHMsIGRldkRlc2MtPm1BZGRyZXNzKTsKKyAgICAgICAgICAgIG1PdXRwdXRzLmNsZWFyU2Vzc2lvblJvdXRlc0ZvckRldmljZShkZXZpY2UpOwogCi0gICAgICAgICAgICAvLyBQcm9wYWdhdGUgZGV2aWNlIGF2YWlsYWJpbGl0eSB0byBFbmdpbmUKLSAgICAgICAgICAgIG1FbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZEZXNjLCBzdGF0ZSk7CisgICAgICAgICAgICBjaGVja091dHB1dHNGb3JEZXZpY2UoZGV2aWNlLCBzdGF0ZSwgb3V0cHV0cyk7CisKKyAgICAgICAgICAgIC8vIFJlc2V0IGFjdGl2ZSBkZXZpY2UgY29kZWMKKyAgICAgICAgICAgIGRldmljZS0+c2V0RW5jb2RlZEZvcm1hdChBVURJT19GT1JNQVRfREVGQVVMVCk7CisKICAgICAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBpbnZhbGlkIHN0YXRlOiAleCIsIHN0YXRlKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpIGludmFsaWQgc3RhdGU6ICV4IiwgX19mdW5jX18sIHN0YXRlKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBjaGVja0EyZHBTdXNwZW5kIG11c3QgcnVuIGJlZm9yZSBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMgc28gdGhhdCBBMkRQCi0gICAgICAgIC8vIG91dHB1dCBpcyBzdXNwZW5kZWQgYmVmb3JlIGFueSB0cmFja3MgYXJlIG1vdmVkIHRvIGl0Ci0gICAgICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKLSAgICAgICAgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7Ci0gICAgICAgIC8vIG91dHB1dHMgbXVzdCBiZSBjbG9zZWQgYWZ0ZXIgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkgaXMgZXhlY3V0ZWQKLSAgICAgICAgaWYgKCFvdXRwdXRzLmlzRW1wdHkoKSkgeworICAgICAgICAvLyBQcm9wYWdhdGUgZGV2aWNlIGF2YWlsYWJpbGl0eSB0byBFbmdpbmUKKyAgICAgICAgc2V0RW5naW5lRGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUpOworCisgICAgICAgIC8vIE5vIG5lZWQgdG8gZXZhbHVhdGUgcGxheWJhY2sgcm91dGluZyB3aGVuIGNvbm5lY3RpbmcgYSByZW1vdGUgc3VibWl4CisgICAgICAgIC8vIG91dHB1dCBkZXZpY2UgdXNlZCBieSBhIGR5bmFtaWMgcG9saWN5IG9mIHR5cGUgcmVjb3JkZXIgYXMgbm8KKyAgICAgICAgLy8gcGxheWJhY2sgdXNlIGNhc2UgaXMgYWZmZWN0ZWQuCisgICAgICAgIGJvb2wgZG9DaGVja0ZvckRldmljZUFuZE91dHB1dENoYW5nZXMgPSB0cnVlOworICAgICAgICBpZiAoZGV2aWNlLT50eXBlKCkgPT0gQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYCisgICAgICAgICAgICAgICAgJiYgc3RybmNtcChkZXZpY2VfYWRkcmVzcywgIjAiLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSAhPSAwKSB7CiAgICAgICAgICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA6IG91dHB1dHMpIHsKICAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgICAgICAgICAgICAgLy8gY2xvc2UgdW51c2VkIG91dHB1dHMgYWZ0ZXIgZGV2aWNlIGRpc2Nvbm5lY3Rpb24gb3IgZGlyZWN0IG91dHB1dHMgdGhhdCBoYXZlIGJlZW4KLSAgICAgICAgICAgICAgICAvLyBvcGVuZWQgYnkgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgdG8gcXVlcnkgZHluYW1pYyBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgaWYgKChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKCgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjLT5tRGlyZWN0T3BlbkNvdW50ID09IDApKSkgewotICAgICAgICAgICAgICAgICAgICBjbG9zZU91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSBkZXNjLT5tUG9saWN5TWl4LnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAocG9saWN5TWl4ICE9IG51bGxwdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBzdHJuY21wKGRldmljZV9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLnN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGRvQ2hlY2tGb3JEZXZpY2VBbmRPdXRwdXRDaGFuZ2VzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGNoZWNrIGFnYWluIGFmdGVyIGNsb3NpbmcgQTJEUCBvdXRwdXQgdG8gcmVzZXQgbUEyZHBTdXNwZW5kZWQgaWYgbmVlZGVkCi0gICAgICAgICAgICBjaGVja0EyZHBTdXNwZW5kKCk7CiAgICAgICAgIH0KIAotICAgICAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOwotICAgICAgICBpZiAobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpID09IEFVRElPX01PREVfSU5fQ0FMTCAmJiBoYXNQcmltYXJ5T3V0cHV0KCkpIHsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICAgICAgdXBkYXRlQ2FsbFJvdXRpbmcobmV3RGV2aWNlKTsKKyAgICAgICAgYXV0byBjaGVja0Nsb3NlT3V0cHV0cyA9IFsmXSgpIHsKKyAgICAgICAgICAgIC8vIG91dHB1dHMgbXVzdCBiZSBjbG9zZWQgYWZ0ZXIgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkgaXMgZXhlY3V0ZWQKKyAgICAgICAgICAgIGlmICghb3V0cHV0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA6IG91dHB1dHMpIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAvLyBjbG9zZSB1bnVzZWQgb3V0cHV0cyBhZnRlciBkZXZpY2UgZGlzY29ubmVjdGlvbiBvciBkaXJlY3Qgb3V0cHV0cyB0aGF0IGhhdmUKKyAgICAgICAgICAgICAgICAgICAgLy8gYmVlbiBvcGVuZWQgYnkgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgdG8gcXVlcnkgZHluYW1pYyBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgIGlmICgoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICE9IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjLT5tRGlyZWN0T3BlbkNvdW50ID09IDApKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBjaGVjayBBMkRQIGFnYWluIGFmdGVyIGNsb3NpbmcgQTJEUCBvdXRwdXQgdG8gcmVzZXQgbUEyZHBTdXNwZW5kZWQgaWYgbmVlZGVkCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH07CisKKyAgICAgICAgaWYgKGRvQ2hlY2tGb3JEZXZpY2VBbmRPdXRwdXRDaGFuZ2VzKSB7CisgICAgICAgICAgICBjaGVja0ZvckRldmljZUFuZE91dHB1dENoYW5nZXMoY2hlY2tDbG9zZU91dHB1dHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hlY2tDbG9zZU91dHB1dHMoKTsKICAgICAgICAgfQorCisgICAgICAgIGlmIChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgPT0gQVVESU9fTU9ERV9JTl9DQUxMICYmIGhhc1ByaW1hcnlPdXRwdXQoKSkgeworICAgICAgICAgICAgRGV2aWNlVmVjdG9yIG5ld0RldmljZXMgPSBnZXROZXdPdXRwdXREZXZpY2VzKG1QcmltYXJ5T3V0cHV0LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgIHVwZGF0ZUNhbGxSb3V0aW5nKG5ld0RldmljZXMpOworICAgICAgICB9CisgICAgICAgIGNvbnN0IERldmljZVZlY3RvciBtc2RPdXREZXZpY2VzID0gZ2V0TXNkQXVkaW9PdXREZXZpY2VzKCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKICAgICAgICAgICAgIGlmICgobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpICE9IEFVRElPX01PREVfSU5fQ0FMTCkgfHwgKGRlc2MgIT0gbVByaW1hcnlPdXRwdXQpKSB7Ci0gICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShkZXNjLCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgICAgIERldmljZVZlY3RvciBuZXdEZXZpY2VzID0gZ2V0TmV3T3V0cHV0RGV2aWNlcyhkZXNjLCB0cnVlIC8qZnJvbUNhY2hlKi8pOwogICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBmb3JjZSBkZXZpY2UgY2hhbmdlIG9uIGR1cGxpY2F0ZWQgb3V0cHV0IGJlY2F1c2UgaWYgZGV2aWNlIGlzIDAsIGl0IHdpbGwKICAgICAgICAgICAgICAgICAvLyBhbHNvIGZvcmNlIGEgZGV2aWNlIDAgZm9yIHRoZSB0d28gb3V0cHV0cyBpdCBpcyBkdXBsaWNhdGVkIHRvIHdoaWNoIG1heSBvdmVycmlkZQogICAgICAgICAgICAgICAgIC8vIGEgdmFsaWQgZGV2aWNlIHNlbGVjdGlvbiBvbiB0aG9zZSBvdXRwdXRzLgotICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSAhZGVzYy0+aXNEdXBsaWNhdGVkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICghZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpCisgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSA9IChtc2RPdXREZXZpY2VzLmlzRW1wdHkoKSB8fCBtc2RPdXREZXZpY2VzICE9IGRlc2MtPmRldmljZXMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICFkZXNjLT5pc0R1cGxpY2F0ZWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCFkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZVR5cGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBmb3JjZSB3aGVuIGRpc2Nvbm5lY3RpbmcgKGEgbm9uLWR1cGxpY2F0ZWQgZGV2aWNlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkpOwotICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZShkZXNjLCBuZXdEZXZpY2UsIGZvcmNlLCAwKTsKKyAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKGRlc2MsIG5ld0RldmljZXMsIGZvcmNlLCAwKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlmIChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKSB7Ci0gICAgICAgICAgICBjbGVhblVwRm9yRGV2aWNlKGRldkRlc2MpOworICAgICAgICAgICAgY2xlYW5VcEZvckRldmljZShkZXZpY2UpOwogICAgICAgICB9CiAKICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwpAQCAtMjQ5LDEwMSArMjcyLDEwNSBAQAogICAgIH0gIC8vIGVuZCBpZiBpcyBvdXRwdXQgZGV2aWNlCiAKICAgICAvLyBoYW5kbGUgaW5wdXQgZGV2aWNlcwotICAgIGlmIChhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgewotICAgICAgICBTb3J0ZWRWZWN0b3IgPGF1ZGlvX2lvX2hhbmRsZV90PiBpbnB1dHM7Ci0KLSAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuaW5kZXhPZihkZXZEZXNjKTsKKyAgICBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZVR5cGUpKSB7CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmluZGV4T2YoZGV2aWNlKTsKICAgICAgICAgc3dpdGNoIChzdGF0ZSkKICAgICAgICAgewogICAgICAgICAvLyBoYW5kbGUgaW5wdXQgZGV2aWNlIGNvbm5lY3Rpb24KICAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRTogewogICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGV2aWNlIGFscmVhZHkgY29ubmVjdGVkOiAlZCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgZGV2aWNlIGFscmVhZHkgY29ubmVjdGVkOiAlcyIsIF9fZnVuY19fLCBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8SHdNb2R1bGU+IG1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRm9yRGV2aWNlKGRldmljZSk7Ci0gICAgICAgICAgICBpZiAobW9kdWxlID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCk6IGNvdWxkIG5vdCBmaW5kIEhXIG1vZHVsZSBmb3IgZGV2aWNlICUwOHgiLAotICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworCisgICAgICAgICAgICBpZiAobUF2YWlsYWJsZUlucHV0RGV2aWNlcy5hZGQoZGV2aWNlKSA8IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBCZWZvcmUgY2hlY2tpbmcgaW50cHV0cywgYnJvYWRjYXN0IGNvbm5lY3QgZXZlbnQgdG8gYWxsb3cgSEFMIHRvIHJldHJpZXZlIGR5bmFtaWMKICAgICAgICAgICAgIC8vIHBhcmFtZXRlcnMgb24gbmV3bHkgY29ubmVjdGVkIGRldmljZXMgKGluc3RlYWQgb2Ygb3BlbmluZyB0aGUgaW5wdXRzLi4uKQotICAgICAgICAgICAgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsIGRldkRlc2MtPm1BZGRyZXNzKTsKKyAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlKTsKIAotICAgICAgICAgICAgaWYgKGNoZWNrSW5wdXRzRm9yRGV2aWNlKGRldkRlc2MsIHN0YXRlLCBpbnB1dHMsIGRldkRlc2MtPm1BZGRyZXNzKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPm1BZGRyZXNzKTsKKyAgICAgICAgICAgIGlmIChjaGVja0lucHV0c0ZvckRldmljZShkZXZpY2UsIHN0YXRlKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMucmVtb3ZlKGRldmljZSk7CisKKyAgICAgICAgICAgICAgICBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKTsKKworICAgICAgICAgICAgICAgIG1Id01vZHVsZXMuY2xlYW5VcEZvckRldmljZShkZXZpY2UpOworCiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpbmRleCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuYWRkKGRldkRlc2MpOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2luZGV4XS0+YXR0YWNoKG1vZHVsZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSBkZXZpY2UgYXZhaWxhYmlsaXR5IHRvIEVuZ2luZQotICAgICAgICAgICAgbUVuZ2luZS0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldkRlc2MsIHN0YXRlKTsKICAgICAgICAgfSBicmVhazsKIAogICAgICAgICAvLyBoYW5kbGUgaW5wdXQgZGV2aWNlIGRpc2Nvbm5lY3Rpb24KICAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOiB7CiAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRldmljZSBub3QgY29ubmVjdGVkOiAlZCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgZGV2aWNlIG5vdCBjb25uZWN0ZWQ6ICVzIiwgX19mdW5jX18sIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIEFMT0dWKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkaXNjb25uZWN0aW5nIGlucHV0IGRldmljZSAleCIsIGRldmljZSk7CisgICAgICAgICAgICBBTE9HVigiJXMoKSBkaXNjb25uZWN0aW5nIGlucHV0IGRldmljZSAlcyIsIF9fZnVuY19fLCBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAKICAgICAgICAgICAgIC8vIFNldCBEaXNjb25uZWN0IHRvIEhBTHMKLSAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlLCBkZXZEZXNjLT5tQWRkcmVzcyk7CisgICAgICAgICAgICBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSk7CiAKLSAgICAgICAgICAgIGNoZWNrSW5wdXRzRm9yRGV2aWNlKGRldkRlc2MsIHN0YXRlLCBpbnB1dHMsIGRldkRlc2MtPm1BZGRyZXNzKTsKLSAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMucmVtb3ZlKGRldkRlc2MpOworICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5yZW1vdmUoZGV2aWNlKTsKIAotICAgICAgICAgICAgLy8gUHJvcGFnYXRlIGRldmljZSBhdmFpbGFiaWxpdHkgdG8gRW5naW5lCi0gICAgICAgICAgICBtRW5naW5lLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2RGVzYywgc3RhdGUpOworICAgICAgICAgICAgY2hlY2tJbnB1dHNGb3JEZXZpY2UoZGV2aWNlLCBzdGF0ZSk7CiAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBpbnZhbGlkIHN0YXRlOiAleCIsIHN0YXRlKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpIGludmFsaWQgc3RhdGU6ICV4IiwgX19mdW5jX18sIHN0YXRlKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KIAotICAgICAgICBjbG9zZUFsbElucHV0cygpOworICAgICAgICAvLyBQcm9wYWdhdGUgZGV2aWNlIGF2YWlsYWJpbGl0eSB0byBFbmdpbmUKKyAgICAgICAgc2V0RW5naW5lRGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUpOworCisgICAgICAgIGNoZWNrQ2xvc2VJbnB1dHMoKTsKICAgICAgICAgLy8gQXMgdGhlIGlucHV0IGRldmljZSBsaXN0IGNhbiBpbXBhY3QgdGhlIG91dHB1dCBkZXZpY2Ugc2VsZWN0aW9uLCB1cGRhdGUKICAgICAgICAgLy8gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBjYWNoZQogICAgICAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOwogCiAgICAgICAgIGlmIChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgPT0gQVVESU9fTU9ERV9JTl9DQUxMICYmIGhhc1ByaW1hcnlPdXRwdXQoKSkgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhuZXdEZXZpY2UpOworICAgICAgICAgICAgRGV2aWNlVmVjdG9yIG5ld0RldmljZXMgPSBnZXROZXdPdXRwdXREZXZpY2VzKG1QcmltYXJ5T3V0cHV0LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgIHVwZGF0ZUNhbGxSb3V0aW5nKG5ld0RldmljZXMpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpIHsKLSAgICAgICAgICAgIGNsZWFuVXBGb3JEZXZpY2UoZGV2RGVzYyk7CisgICAgICAgICAgICBjbGVhblVwRm9yRGV2aWNlKGRldmljZSk7CiAgICAgICAgIH0KIAogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9IC8vIGVuZCBpZiBpcyBpbnB1dCBkZXZpY2UKIAotICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBpbnZhbGlkIGRldmljZTogJXgiLCBkZXZpY2UpOworICAgIEFMT0dXKCIlcygpIGludmFsaWQgZGV2aWNlOiAlcyIsIF9fZnVuY19fLCBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgcmV0dXJuIEJBRF9WQUxVRTsKIH0KIAordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldEVuZ2luZURldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSkgeworCisgICAgLy8gdGhlIEVuZ2luZSBkb2VzIG5vdCBoYXZlIHRvIGtub3cgYWJvdXQgcmVtb3RlIHN1Ym1peCBkZXZpY2VzIHVzZWQgYnkgZHluYW1pYyBhdWRpbyBwb2xpY2llcworICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShkZXZpY2UtPnR5cGUoKSkgJiYgZGV2aWNlLT5hZGRyZXNzKCkgIT0gIjAiKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUVuZ2luZS0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUpOworfQorCisKIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKQogewogICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPQotICAgICAgICAgICAgbUh3TW9kdWxlcy5nZXREZXZpY2VEZXNjcmlwdG9yKGRldmljZSwgZGV2aWNlX2FkZHJlc3MsICIiLAorICAgICAgICAgICAgbUh3TW9kdWxlcy5nZXREZXZpY2VEZXNjcmlwdG9yKGRldmljZSwgZGV2aWNlX2FkZHJlc3MsICIiLCBBVURJT19GT1JNQVRfREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBhbGxvd1RvQ3JlYXRlICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJsZW4oZGV2aWNlX2FkZHJlc3MpICE9IDApLyptYXRjaEFkZHJlc3MqLyk7CiAKICAgICBpZiAoZGV2RGVzYyA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSB1bmRlY2xhcmVkIGRldmljZSwgdHlwZSAlMDh4LCBhZGRyZXNzOiAlcyIsCisgICAgICAgIEFMT0dWKCJnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSB1bmRlY2xhcmVkIGRldmljZSwgdHlwZSAlMDh4LCBhZGRyZXNzOiAlcyIsCiAgICAgICAgICAgICAgIGRldmljZSwgZGV2aWNlX2FkZHJlc3MpOwogICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTsKICAgICB9CkBAIC0zNTUsNTUgKzM4Miw2NCBAQAogICAgIH0gZWxzZSBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpIHsKICAgICAgICAgZGV2aWNlVmVjdG9yID0gJm1BdmFpbGFibGVJbnB1dERldmljZXM7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1coImdldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGludmFsaWQgZGV2aWNlIHR5cGUgJTA4eCIsIGRldmljZSk7CisgICAgICAgIEFMT0dXKCIlcygpIGludmFsaWQgZGV2aWNlIHR5cGUgJTA4eCIsIF9fZnVuY19fLCBkZXZpY2UpOwogICAgICAgICByZXR1cm4gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTsKICAgICB9CiAKLSAgICByZXR1cm4gKGRldmljZVZlY3Rvci0+Z2V0RGV2aWNlKGRldmljZSwgU3RyaW5nOChkZXZpY2VfYWRkcmVzcykpICE9IDApID8KKyAgICByZXR1cm4gKGRldmljZVZlY3Rvci0+Z2V0RGV2aWNlKAorICAgICAgICAgICAgICAgIGRldmljZSwgU3RyaW5nOChkZXZpY2VfYWRkcmVzcyksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKSAhPSAwKSA/CiAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSA6IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6aGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KQogewogICAgIHN0YXR1c190IHN0YXR1czsKICAgICBTdHJpbmc4IHJlcGx5OwogICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOwogICAgIGludCBpc1JlY29uZmlnQTJkcFN1cHBvcnRlZCA9IDA7CiAKLSAgICBBTE9HVigiaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKCgpIGRldmljZTogMHglWCwgYWRkcmVzcyAlcyBuYW1lICVzIiwKLSAgICAgICAgICBkZXZpY2UsIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSk7CisgICAgQUxPR1YoImhhbmRsZURldmljZUNvbmZpZ0NoYW5nZSgoKSBkZXZpY2U6IDB4JVgsIGFkZHJlc3MgJXMgbmFtZSAlcyBlbmNvZGVkRm9ybWF0OiAweCVYIiwKKyAgICAgICAgICBkZXZpY2UsIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSwgZW5jb2RlZEZvcm1hdCk7CiAKICAgICAvLyBjb25uZWN0L2Rpc2Nvbm5lY3Qgb25seSAxIGRldmljZSBhdCBhIHRpbWUKICAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSAmJiAhYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpIHJldHVybiBCQURfVkFMVUU7CiAKICAgICAvLyBDaGVjayBpZiB0aGUgZGV2aWNlIGlzIGN1cnJlbnRseSBjb25uZWN0ZWQKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0KLSAgICAgICAgICAgIG1Id01vZHVsZXMuZ2V0RGV2aWNlRGVzY3JpcHRvcihkZXZpY2UsIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSk7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmluZGV4T2YoZGV2RGVzYyk7Ci0gICAgaWYgKGluZGV4IDwgMCkgeworICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlTWFzayhkZXZpY2UpOworICAgIGlmIChkZXZpY2VMaXN0LmVtcHR5KCkpIHsKICAgICAgICAgLy8gTm90aGluZyB0byBkbzogZGV2aWNlIGlzIG5vdCBjb25uZWN0ZWQKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gZGV2aWNlTGlzdC5pdGVtQXQoMCk7CiAKICAgICAvLyBGb3Igb2ZmbG9hZGVkIEEyRFAsIEh3IG1vZHVsZXMgbWF5IGhhdmUgdGhlIGNhcGFiaWxpdHkgdG8KLSAgICAvLyBjb25maWd1cmUgY29kZWNzLiBDaGVjayBpZiBhbnkgb2YgdGhlIGxvYWRlZCBodyBtb2R1bGVzCi0gICAgLy8gc3VwcG9ydHMgdGhpcy4KLSAgICAvLyBJZiBzdXBwb3J0ZWQsIHNlbmQgYSBzZXQgcGFyYW1ldGVyIHRvIGNvbmZpZ3VyZSBBMkRQIGNvZGVjcwotICAgIC8vIGFuZCByZXR1cm4uIE5vIG5lZWQgdG8gdG9nZ2xlIGRldmljZSBzdGF0ZS4KKyAgICAvLyBjb25maWd1cmUgY29kZWNzLgorICAgIC8vIEhhbmRsZSB0d28gc3BlY2lmaWMgY2FzZXMgYnkgc2VuZGluZyBhIHNldCBwYXJhbWV0ZXIgdG8KKyAgICAvLyBjb25maWd1cmUgQTJEUCBjb2RlY3MuIE5vIG5lZWQgdG8gdG9nZ2xlIGRldmljZSBzdGF0ZS4KKyAgICAvLyBDYXNlIDE6IEEyRFAgYWN0aXZlIGRldmljZSBzd2l0Y2hlcyBmcm9tIHByaW1hcnkgdG8gcHJpbWFyeQorICAgIC8vIG1vZHVsZQorICAgIC8vIENhc2UgMjogQTJEUCBkZXZpY2UgY29uZmlnIGNoYW5nZXMgb24gcHJpbWFyeSBtb2R1bGUuCiAgICAgaWYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApIHsKLSAgICAgICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycygKLSAgICAgICAgICAgICAgICAgICAgQVVESU9fSU9fSEFORExFX05PTkUsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJlY29uZmlnQTJkcFN1cHBvcnRlZCkpOwotICAgICAgICBBdWRpb1BhcmFtZXRlciByZXBsaWVkUGFyYW1ldGVycyhyZXBseSk7Ci0gICAgICAgIHJlcGxpZWRQYXJhbWV0ZXJzLmdldEludCgKLSAgICAgICAgICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSZWNvbmZpZ0EyZHBTdXBwb3J0ZWQpLCBpc1JlY29uZmlnQTJkcFN1cHBvcnRlZCk7Ci0gICAgICAgIGlmIChpc1JlY29uZmlnQTJkcFN1cHBvcnRlZCkgewotICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBrZXkoQXVkaW9QYXJhbWV0ZXI6OmtleVJlY29uZmlnQTJkcCk7Ci0gICAgICAgICAgICBwYXJhbS5hZGQoa2V5LCBTdHJpbmc4KCJ0cnVlIikpOwotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoQVVESU9fSU9fSEFORExFX05PTkUsIHBhcmFtLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICBzcDxId01vZHVsZT4gbW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGb3JEZXZpY2VUeXBlcyhkZXZpY2UsIGVuY29kZWRGb3JtYXQpOworICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgcHJpbWFyeUhhbmRsZSA9IG1QcmltYXJ5T3V0cHV0LT5nZXRNb2R1bGVIYW5kbGUoKTsKKyAgICAgICAgaWYgKGF2YWlsYWJsZVByaW1hcnlPdXRwdXREZXZpY2VzKCkuY29udGFpbnMoZGV2RGVzYykgJiYKKyAgICAgICAgICAgKG1vZHVsZSAhPSAwICYmIG1vZHVsZS0+Z2V0SGFuZGxlKCkgPT0gcHJpbWFyeUhhbmRsZSkpIHsKKyAgICAgICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoCisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JT19IQU5ETEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJlY29uZmlnQTJkcFN1cHBvcnRlZCkpOworICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcmVwbGllZFBhcmFtZXRlcnMocmVwbHkpOworICAgICAgICAgICAgcmVwbGllZFBhcmFtZXRlcnMuZ2V0SW50KAorICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSZWNvbmZpZ0EyZHBTdXBwb3J0ZWQpLCBpc1JlY29uZmlnQTJkcFN1cHBvcnRlZCk7CisgICAgICAgICAgICBpZiAoaXNSZWNvbmZpZ0EyZHBTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4IGtleShBdWRpb1BhcmFtZXRlcjo6a2V5UmVjb25maWdBMmRwKTsKKyAgICAgICAgICAgICAgICBwYXJhbS5hZGQoa2V5LCBTdHJpbmc4KCJ0cnVlIikpOworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKEFVRElPX0lPX0hBTkRMRV9OT05FLCBwYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBkZXZEZXNjLT5zZXRFbmNvZGVkRm9ybWF0KGVuY29kZWRGb3JtYXQpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtNDExLDcgKzQ0Nyw4IEBACiAgICAgLy8gVGhpcyB3aWxsIGZvcmNlIHJlYWRpbmcgYWdhaW4gdGhlIGRldmljZSBjb25maWd1cmF0aW9uCiAgICAgc3RhdHVzID0gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5nZXRFbmNvZGVkRm9ybWF0KCkpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR1coImhhbmRsZURldmljZUNvbmZpZ0NoYW5nZSgpIGVycm9yIGRpc2FibGluZyBjb25uZWN0aW9uIHN0YXRlOiAlZCIsCiAgICAgICAgICAgICAgIHN0YXR1cyk7CkBAIC00MjAsNyArNDU3LDcgQEAKIAogICAgIHN0YXR1cyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUsIGVuY29kZWRGb3JtYXQpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR1coImhhbmRsZURldmljZUNvbmZpZ0NoYW5nZSgpIGVycm9yIGVuYWJsaW5nIGNvbm5lY3Rpb24gc3RhdGU6ICVkIiwKICAgICAgICAgICAgICAgc3RhdHVzKTsKQEAgLTQzMCwxNiArNDY3LDQwIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi11aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnVwZGF0ZUNhbGxSb3V0aW5nKGF1ZGlvX2RldmljZXNfdCByeERldmljZSwgdWludDMyX3QgZGVsYXlNcykKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cykKK3sKKyAgICBBTE9HVigiZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgpIik7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGF1ZGlvX2Zvcm1hdF90PiBmb3JtYXRTZXQ7CisgICAgc3A8SHdNb2R1bGU+IHByaW1hcnlNb2R1bGUgPQorICAgICAgICAgICAgbUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSk7CisgICAgRGV2aWNlVmVjdG9yIGRlY2xhcmVkRGV2aWNlcyA9IHByaW1hcnlNb2R1bGUtPmdldERlY2xhcmVkRGV2aWNlcygpLmdldERldmljZXNGcm9tVHlwZU1hc2soCisgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6IGRlY2xhcmVkRGV2aWNlcykgeworICAgICAgICBmb3JtYXRTZXQuaW5zZXJ0KGRldmljZS0+ZW5jb2RlZEZvcm1hdHMoKS5iZWdpbigpLCBkZXZpY2UtPmVuY29kZWRGb3JtYXRzKCkuZW5kKCkpOworICAgIH0KKyAgICBmb3JtYXRzLT5hc3NpZ24oZm9ybWF0U2V0LmJlZ2luKCksIGZvcm1hdFNldC5lbmQoKSk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1cGRhdGVDYWxsUm91dGluZyhjb25zdCBEZXZpY2VWZWN0b3IgJnJ4RGV2aWNlcywgdWludDMyX3QgZGVsYXlNcykKIHsKICAgICBib29sIGNyZWF0ZVR4UGF0Y2ggPSBmYWxzZTsKKyAgICBib29sIGNyZWF0ZVJ4UGF0Y2ggPSBmYWxzZTsKICAgICB1aW50MzJfdCBtdXRlV2FpdE1zID0gMDsKIAotICAgIGlmKCFoYXNQcmltYXJ5T3V0cHV0KCkgfHwgbVByaW1hcnlPdXRwdXQtPmRldmljZSgpID09IEFVRElPX0RFVklDRV9PVVRfU1RVQikgeworICAgIGlmKCFoYXNQcmltYXJ5T3V0cHV0KCkgfHwgbVByaW1hcnlPdXRwdXQtPmRldmljZXMoKS50eXBlcygpID09IEFVRElPX0RFVklDRV9PVVRfU1RVQikgewogICAgICAgICByZXR1cm4gbXV0ZVdhaXRNczsKICAgICB9Ci0gICAgYXVkaW9fZGV2aWNlc190IHR4RGV2aWNlID0gZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04pOwotICAgIEFMT0dWKCJ1cGRhdGVDYWxsUm91dGluZyBkZXZpY2UgcnhEZXZpY2UgJTA4eCB0eERldmljZSAlMDh4IiwgcnhEZXZpY2UsIHR4RGV2aWNlKTsKKyAgICBBTE9HX0FTU0VSVCghcnhEZXZpY2VzLmlzRW1wdHkoKSwgInVwZGF0ZUNhbGxSb3V0aW5nKCkgbm8gc2VsZWN0ZWQgb3V0cHV0IGRldmljZSIpOworCisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSB7IC5zb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiB9OworICAgIGF1dG8gdHhTb3VyY2VEZXZpY2UgPSBtRW5naW5lLT5nZXRJbnB1dERldmljZUZvckF0dHJpYnV0ZXMoYXR0cik7CisgICAgQUxPR19BU1NFUlQodHhTb3VyY2VEZXZpY2UgIT0gMCwgInVwZGF0ZUNhbGxSb3V0aW5nKCkgaW5wdXQgc2VsZWN0ZWQgZGV2aWNlIG5vdCBhdmFpbGFibGUiKTsKKworICAgIEFMT0dWKCJ1cGRhdGVDYWxsUm91dGluZyBkZXZpY2UgcnhEZXZpY2UgJXMgdHhEZXZpY2UgJXMiLAorICAgICAgICAgIHJ4RGV2aWNlcy5pdGVtQXQoMCktPnRvU3RyaW5nKCkuY19zdHIoKSwgdHhTb3VyY2VEZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAKICAgICAvLyByZWxlYXNlIGV4aXN0aW5nIFJYIHBhdGNoIGlmIGFueQogICAgIGlmIChtQ2FsbFJ4UGF0Y2ggIT0gMCkgewpAQCAtNDUyLDU3ICs1MTMsOTIgQEAKICAgICAgICAgbUNhbGxUeFBhdGNoLmNsZWFyKCk7CiAgICAgfQogCi0gICAgLy8gSWYgdGhlIFJYIGRldmljZSBpcyBvbiB0aGUgcHJpbWFyeSBIVyBtb2R1bGUsIHRoZW4gdXNlIGxlZ2FjeSByb3V0aW5nIG1ldGhvZCBmb3Igdm9pY2UgY2FsbHMKLSAgICAvLyB2aWEgc2V0T3V0cHV0RGV2aWNlKCkgb24gcHJpbWFyeSBvdXRwdXQuCi0gICAgLy8gT3RoZXJ3aXNlLCBjcmVhdGUgdHdvIGF1ZGlvIHBhdGNoZXMgZm9yIFRYIGFuZCBSWCBwYXRoLgotICAgIGlmIChhdmFpbGFibGVQcmltYXJ5T3V0cHV0RGV2aWNlcygpICYgcnhEZXZpY2UpIHsKLSAgICAgICAgbXV0ZVdhaXRNcyA9IHNldE91dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgcnhEZXZpY2UsIHRydWUsIGRlbGF5TXMpOworICAgIGF1dG8gdGVsZXBob255UnhNb2R1bGUgPQorICAgICAgICBtSHdNb2R1bGVzLmdldE1vZHVsZUZvckRldmljZVR5cGVzKEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgsIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICBhdXRvIHRlbGVwaG9ueVR4TW9kdWxlID0KKyAgICAgICAgbUh3TW9kdWxlcy5nZXRNb2R1bGVGb3JEZXZpY2VUeXBlcyhBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCwgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgIC8vIHJldHJpZXZlIFJ4IFNvdXJjZSBhbmQgVHggU2luayBkZXZpY2UgZGVzY3JpcHRvcnMKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiByeFNvdXJjZURldmljZSA9CisgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlKEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IHR4U2lua0RldmljZSA9CisgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZShBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKworICAgIC8vIFJYIGFuZCBUWCBUZWxlcGhvbnkgZGV2aWNlIGFyZSBkZWNsYXJlZCBieSBQcmltYXJ5IEF1ZGlvIEhBTAorICAgIGlmIChpc1ByaW1hcnlNb2R1bGUodGVsZXBob255UnhNb2R1bGUpICYmIGlzUHJpbWFyeU1vZHVsZSh0ZWxlcGhvbnlUeE1vZHVsZSkgJiYKKyAgICAgICAgICAgICh0ZWxlcGhvbnlSeE1vZHVsZS0+Z2V0SGFsVmVyc2lvbk1ham9yKCkgPj0gMykpIHsKKyAgICAgICAgaWYgKHJ4U291cmNlRGV2aWNlID09IDAgfHwgdHhTaW5rRGV2aWNlID09IDApIHsKKyAgICAgICAgICAgIC8vIFJYIC8gVFggVGVsZXBob255IGRldmljZShzKSBpcyhhcmUpIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlCisgICAgICAgICAgICBBTE9HRSgidXBkYXRlQ2FsbFJvdXRpbmcoKSBubyB0ZWxlcGhvbnkgVHggYW5kL29yIFJYIGRldmljZSIpOworICAgICAgICAgICAgcmV0dXJuIG11dGVXYWl0TXM7CisgICAgICAgIH0KKyAgICAgICAgLy8gZG8gbm90IGNyZWF0ZSBhIHBhdGNoIChha2EgU3cgQnJpZGdpbmcpIGlmIFByaW1hcnkgSFcgbW9kdWxlIGhhcyBkZWNsYXJlZCBzdXBwb3J0aW5nIGEKKyAgICAgICAgLy8gcm91dGUgYmV0d2VlbiB0ZWxlcGhvbnkgUlggdG8gU2luayBkZXZpY2UgYW5kIFNvdXJjZSBkZXZpY2UgdG8gdGVsZXBob255IFRYCisgICAgICAgIGNvbnN0IGF1dG8gJnByaW1hcnlNb2R1bGUgPSB0ZWxlcGhvbnlSeE1vZHVsZTsKKyAgICAgICAgY3JlYXRlUnhQYXRjaCA9ICFwcmltYXJ5TW9kdWxlLT5zdXBwb3J0c1BhdGNoKHJ4U291cmNlRGV2aWNlLCByeERldmljZXMuaXRlbUF0KDApKTsKKyAgICAgICAgY3JlYXRlVHhQYXRjaCA9ICFwcmltYXJ5TW9kdWxlLT5zdXBwb3J0c1BhdGNoKHR4U291cmNlRGV2aWNlLCB0eFNpbmtEZXZpY2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIElmIHRoZSBSWCBkZXZpY2UgaXMgb24gdGhlIHByaW1hcnkgSFcgbW9kdWxlLCB0aGVuIHVzZSBsZWdhY3kgcm91dGluZyBtZXRob2QgZm9yCisgICAgICAgIC8vIHZvaWNlIGNhbGxzIHZpYSBzZXRPdXRwdXREZXZpY2UoKSBvbiBwcmltYXJ5IG91dHB1dC4KKyAgICAgICAgLy8gT3RoZXJ3aXNlLCBjcmVhdGUgdHdvIGF1ZGlvIHBhdGNoZXMgZm9yIFRYIGFuZCBSWCBwYXRoLgorICAgICAgICBjcmVhdGVSeFBhdGNoID0gIShhdmFpbGFibGVQcmltYXJ5T3V0cHV0RGV2aWNlcygpLmNvbnRhaW5zKHJ4RGV2aWNlcy5pdGVtQXQoMCkpKSAmJgorICAgICAgICAgICAgICAgIChyeFNvdXJjZURldmljZSAhPSAwKTsKICAgICAgICAgLy8gSWYgdGhlIFRYIGRldmljZSBpcyBhbHNvIG9uIHRoZSBwcmltYXJ5IEhXIG1vZHVsZSwgc2V0T3V0cHV0RGV2aWNlKCkgd2lsbCB0YWtlIGNhcmUKICAgICAgICAgLy8gb2YgaXQgZHVlIHRvIGxlZ2FjeSBpbXBsZW1lbnRhdGlvbi4gSWYgbm90LCBjcmVhdGUgYSBwYXRjaC4KLSAgICAgICAgaWYgKChhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCkgJiB0eERldmljZSAmIH5BVURJT19ERVZJQ0VfQklUX0lOKQotICAgICAgICAgICAgICAgID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICBjcmVhdGVUeFBhdGNoID0gdHJ1ZTsKLSAgICAgICAgfQorICAgICAgICBjcmVhdGVUeFBhdGNoID0gIShhdmFpbGFibGVQcmltYXJ5TW9kdWxlSW5wdXREZXZpY2VzKCkuY29udGFpbnModHhTb3VyY2VEZXZpY2UpKSAmJgorICAgICAgICAgICAgICAgICh0eFNpbmtEZXZpY2UgIT0gMCk7CisgICAgfQorICAgIC8vIFVzZSBsZWdhY3kgcm91dGluZyBtZXRob2QgZm9yIHZvaWNlIGNhbGxzIHZpYSBzZXRPdXRwdXREZXZpY2UoKSBvbiBwcmltYXJ5IG91dHB1dC4KKyAgICAvLyBPdGhlcndpc2UsIGNyZWF0ZSB0d28gYXVkaW8gcGF0Y2hlcyBmb3IgVFggYW5kIFJYIHBhdGguCisgICAgaWYgKCFjcmVhdGVSeFBhdGNoKSB7CisgICAgICAgIG11dGVXYWl0TXMgPSBzZXRPdXRwdXREZXZpY2VzKG1QcmltYXJ5T3V0cHV0LCByeERldmljZXMsIHRydWUsIGRlbGF5TXMpOwogICAgIH0gZWxzZSB7IC8vIGNyZWF0ZSBSWCBwYXRoIGF1ZGlvIHBhdGNoCi0gICAgICAgIG1DYWxsUnhQYXRjaCA9IGNyZWF0ZVRlbGVwaG9ueVBhdGNoKHRydWUgLyppc1J4Ki8sIHJ4RGV2aWNlLCBkZWxheU1zKTsKLSAgICAgICAgY3JlYXRlVHhQYXRjaCA9IHRydWU7CisgICAgICAgIG1DYWxsUnhQYXRjaCA9IGNyZWF0ZVRlbGVwaG9ueVBhdGNoKHRydWUgLyppc1J4Ki8sIHJ4RGV2aWNlcy5pdGVtQXQoMCksIGRlbGF5TXMpOworCisgICAgICAgIC8vIElmIHRoZSBUWCBkZXZpY2UgaXMgb24gdGhlIHByaW1hcnkgSFcgbW9kdWxlIGJ1dCBSWCBkZXZpY2UgaXMKKyAgICAgICAgLy8gb24gb3RoZXIgSFcgbW9kdWxlLCBTaW5rTWV0YURhdGEgb2YgdGVsZXBob255IGlucHV0IHNob3VsZCBoYW5kbGUgaXQKKyAgICAgICAgLy8gYXNzdW1pbmcgdGhlIGRldmljZSB1c2VzIGF1ZGlvIEhBTCBWNS4wIGFuZCBhYm92ZQogICAgIH0KICAgICBpZiAoY3JlYXRlVHhQYXRjaCkgeyAvLyBjcmVhdGUgVFggcGF0aCBhdWRpbyBwYXRjaAotICAgICAgICBtQ2FsbFR4UGF0Y2ggPSBjcmVhdGVUZWxlcGhvbnlQYXRjaChmYWxzZSAvKmlzUngqLywgdHhEZXZpY2UsIGRlbGF5TXMpOworICAgICAgICBtQ2FsbFR4UGF0Y2ggPSBjcmVhdGVUZWxlcGhvbnlQYXRjaChmYWxzZSAvKmlzUngqLywgdHhTb3VyY2VEZXZpY2UsIGRlbGF5TXMpOwogICAgIH0KIAogICAgIHJldHVybiBtdXRlV2FpdE1zOwogfQogCiBzcDxBdWRpb1BhdGNoPiBBdWRpb1BvbGljeU1hbmFnZXI6OmNyZWF0ZVRlbGVwaG9ueVBhdGNoKAotICAgICAgICBib29sIGlzUngsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIHVpbnQzMl90IGRlbGF5TXMpIHsKLSAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2g7Ci0gICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOwotICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7CisgICAgICAgIGJvb2wgaXNSeCwgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSwgdWludDMyX3QgZGVsYXlNcykgeworICAgIFBhdGNoQnVpbGRlciBwYXRjaEJ1aWxkZXI7CiAKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiB0eFNvdXJjZURldmljZURlc2M7CisgICAgaWYgKGRldmljZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KICAgICBpZiAoaXNSeCkgewotICAgICAgICBmaWxsQXVkaW9Qb3J0Q29uZmlnRm9yRGV2aWNlKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLCBkZXZpY2UsICZwYXRjaC5zaW5rc1swXSk7Ci0gICAgICAgIGZpbGxBdWRpb1BvcnRDb25maWdGb3JEZXZpY2UoCi0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcywgQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCwgJnBhdGNoLnNvdXJjZXNbMF0pOworICAgICAgICBwYXRjaEJ1aWxkZXIuYWRkU2luayhkZXZpY2UpLgorICAgICAgICAgICAgICAgIGFkZFNvdXJjZShtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZSgKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCwgU3RyaW5nOCgpLCBBVURJT19GT1JNQVRfREVGQVVMVCkpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHR4U291cmNlRGV2aWNlRGVzYyA9IGZpbGxBdWRpb1BvcnRDb25maWdGb3JEZXZpY2UoCi0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcywgZGV2aWNlLCAmcGF0Y2guc291cmNlc1swXSk7Ci0gICAgICAgIGZpbGxBdWRpb1BvcnRDb25maWdGb3JEZXZpY2UoCi0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMsIEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYLCAmcGF0Y2guc2lua3NbMF0pOworICAgICAgICBwYXRjaEJ1aWxkZXIuYWRkU291cmNlKGRldmljZSkuCisgICAgICAgICAgICAgICAgYWRkU2luayhtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2UoCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYLCBTdHJpbmc4KCksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKSk7CiAgICAgfQogCi0gICAgYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZSA9IGlzUnggPyBkZXZpY2UgOiBBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWDsKLSAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKG91dHB1dERldmljZSwgbU91dHB1dHMpOwotICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzLCBBVURJT19PVVRQVVRfRkxBR19OT05FLCBBVURJT19GT1JNQVRfSU5WQUxJRCk7CisgICAgLy8gQFRPRE86IHN0aWxsIGlnbm9yaW5nIHRoZSBhZGRyZXNzLCBvciBub3QgZGVhbGluZyBwbGF0Zm9ybSB3aXRoIG11dGxpcGxlIHRlbGVwaG9ueWRldmljZXMKKyAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBvdXRwdXREZXZpY2UgPSBpc1J4ID8KKyAgICAgICAgICAgICAgICBkZXZpY2UgOiBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2UoCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYLCBTdHJpbmc4KCksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPQorICAgICAgICAgICAgZ2V0T3V0cHV0c0ZvckRldmljZXMoRGV2aWNlVmVjdG9yKG91dHB1dERldmljZSksIG1PdXRwdXRzKTsKKyAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cyk7CiAgICAgLy8gcmVxdWVzdCB0byByZXVzZSBleGlzdGluZyBvdXRwdXQgc3RyZWFtIGlmIG9uZSBpcyBhbHJlYWR5IG9wZW5lZCB0byByZWFjaCB0aGUgdGFyZ2V0IGRldmljZQogICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLSAgICAgICAgQUxPR19BU1NFUlQoIW91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpLAotICAgICAgICAgICAgICAgICIlcygpICUjeCBkZXZpY2Ugb3V0cHV0ICVkIGlzIGR1cGxpY2F0ZWQiLCBfX2Z1bmNfXywgb3V0cHV0RGV2aWNlLCBvdXRwdXQpOwotICAgICAgICBvdXRwdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1sxXSk7Ci0gICAgICAgIHBhdGNoLnNvdXJjZXNbMV0uZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IEFVRElPX1NUUkVBTV9QQVRDSDsKLSAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAyOworICAgICAgICBBTE9HX0FTU0VSVCghb3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCksICIlcygpICVzIGRldmljZSBvdXRwdXQgJWQgaXMgZHVwbGljYXRlZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgb3V0cHV0KTsKKyAgICAgICAgcGF0Y2hCdWlsZGVyLmFkZFNvdXJjZShvdXRwdXREZXNjLCB7IC5zdHJlYW0gPSBBVURJT19TVFJFQU1fUEFUQ0ggfSk7CiAgICAgfQogCiAgICAgaWYgKCFpc1J4KSB7CkBAIC01MTEsMzkgKzYwNyw1MCBAQAogICAgICAgICAvLyBjYWxsIFRYIGRldmljZSBidXQgdGhpcyBpbmZvcm1hdGlvbiBpcyBub3QgaW4gdGhlIGF1ZGlvIHBhdGNoIGFuZCBsb2dpYyBoZXJlIG11c3QgYmUKICAgICAgICAgLy8gc3ltbWV0cmljIHRvIHRoZSBvbmUgaW4gc3RhcnRJbnB1dCgpCiAgICAgICAgIGZvciAoY29uc3QgYXV0byYgYWN0aXZlRGVzYyA6IG1JbnB1dHMuZ2V0QWN0aXZlSW5wdXRzKCkpIHsKLSAgICAgICAgICAgIGlmIChhY3RpdmVEZXNjLT5oYXNTYW1lSHdNb2R1bGVBcyh0eFNvdXJjZURldmljZURlc2MpKSB7Ci0gICAgICAgICAgICAgICAgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiBhY3RpdmVTZXNzaW9ucyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVEZXNjLT5nZXRBdWRpb1Nlc3Npb25zKHRydWUgLyphY3RpdmVPbmx5Ki8pOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgYWN0aXZlU2Vzc2lvbnMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGFjdGl2ZVNlc3Npb24gPSBhY3RpdmVTZXNzaW9ucy5rZXlBdChqKTsKLSAgICAgICAgICAgICAgICAgICAgc3RvcElucHV0KGFjdGl2ZURlc2MtPm1Jb0hhbmRsZSwgYWN0aXZlU2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgIHJlbGVhc2VJbnB1dChhY3RpdmVEZXNjLT5tSW9IYW5kbGUsIGFjdGl2ZVNlc3Npb24pOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhY3RpdmVEZXNjLT5oYXNTYW1lSHdNb2R1bGVBcyhkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgY2xvc2VBY3RpdmVDbGllbnRzKGFjdGl2ZURlc2MpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCiAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgJmFmUGF0Y2hIYW5kbGUsIGRlbGF5TXMpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKAorICAgICAgICAgICAgcGF0Y2hCdWlsZGVyLnBhdGNoKCksICZhZlBhdGNoSGFuZGxlLCBkZWxheU1zKTsKICAgICBBTE9HV19JRihzdGF0dXMgIT0gTk9fRVJST1IsCiAgICAgICAgICAgICAiJXMoKSBlcnJvciAlZCBjcmVhdGluZyAlcyBhdWRpbyBwYXRjaCIsIF9fZnVuY19fLCBzdGF0dXMsIGlzUnggPyAiUlgiIDogIlRYIik7CiAgICAgc3A8QXVkaW9QYXRjaD4gYXVkaW9QYXRjaDsKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIGF1ZGlvUGF0Y2ggPSBuZXcgQXVkaW9QYXRjaCgmcGF0Y2gsIG1VaWRDYWNoZWQpOworICAgICAgICBhdWRpb1BhdGNoID0gbmV3IEF1ZGlvUGF0Y2gocGF0Y2hCdWlsZGVyLnBhdGNoKCksIG1VaWRDYWNoZWQpOwogICAgICAgICBhdWRpb1BhdGNoLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7CiAgICAgICAgIGF1ZGlvUGF0Y2gtPm1VaWQgPSBtVWlkQ2FjaGVkOwogICAgIH0KICAgICByZXR1cm4gYXVkaW9QYXRjaDsKIH0KIAotc3A8RGV2aWNlRGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpmaWxsQXVkaW9Qb3J0Q29uZmlnRm9yRGV2aWNlKAotICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKLSAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdCA9IGRldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7CitzcDxEZXZpY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmZpbmREZXZpY2UoCisgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcywgYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QgeworICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0ID0gZGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKGRldmljZSk7CiAgICAgQUxPR19BU1NFUlQoIWRldmljZUxpc3QuaXNFbXB0eSgpLAogICAgICAgICAgICAgIiVzKCkgc2VsZWN0ZWQgZGV2aWNlIHR5cGUgJSN4IGlzIG5vdCBpbiBkZXZpY2VzIGxpc3QiLCBfX2Z1bmNfXywgZGV2aWNlKTsKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0gZGV2aWNlTGlzdC5pdGVtQXQoMCk7Ci0gICAgZGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoY29uZmlnKTsKLSAgICByZXR1cm4gZGV2aWNlRGVzYzsKKyAgICByZXR1cm4gZGV2aWNlTGlzdC5pdGVtQXQoMCk7Cit9CisKK2F1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1vZHVsZURldmljZVR5cGVzKAorICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsIGNvbnN0IGNoYXIgKm1vZHVsZUlkKSBjb25zdCB7CisgICAgc3A8SHdNb2R1bGU+IG1vZCA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRnJvbU5hbWUobW9kdWxlSWQpOworICAgIHJldHVybiBtb2QgIT0gMCA/IGRldmljZXMuZ2V0RGV2aWNlVHlwZXNGcm9tSHdNb2R1bGUobW9kLT5nZXRIYW5kbGUoKSkgOiBBVURJT19ERVZJQ0VfTk9ORTsKK30KKworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzRGV2aWNlT2ZNb2R1bGUoCisgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLCBjb25zdCBjaGFyICptb2R1bGVJZCkgY29uc3QgeworICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKG1vZHVsZUlkKTsKKyAgICBpZiAobW9kdWxlICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tSHdNb2R1bGUobW9kdWxlLT5nZXRIYW5kbGUoKSkKKyAgICAgICAgICAgICAgICAuaW5kZXhPZihkZXZEZXNjKSAhPSBOQU1FX05PVF9GT1VORAorICAgICAgICAgICAgICAgIHx8IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21Id01vZHVsZShtb2R1bGUtPmdldEhhbmRsZSgpKQorICAgICAgICAgICAgICAgIC5pbmRleE9mKGRldkRlc2MpICE9IE5BTUVfTk9UX0ZPVU5EOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKQEAgLTU1NywxNCArNjY0LDggQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICAvLy8gT3BlbnM6IGNhbiB0aGVzZSBsaW5lIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSBzd2l0Y2ggb2Ygdm9sdW1lIGN1cnZlcz8/PwotICAgIC8vIGlmIGxlYXZpbmcgY2FsbCBzdGF0ZSwgaGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBhY3RpdmUgc3RyZWFtcwotICAgIC8vIHBlcnRhaW5pbmcgdG8gc29uaWZpY2F0aW9uIHN0cmF0ZWd5IHNlZSBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKQogICAgIGlmIChpc1N0YXRlSW5DYWxsKG9sZFN0YXRlKSkgewogICAgICAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIGluIGNhbGwgc3RhdGUgbWFuYWdlbWVudDogbmV3IHN0YXRlIGlzICVkIiwgc3RhdGUpOwotICAgICAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IHN0cmVhbSsrKSB7Ci0gICAgICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAgIH0KLQogICAgICAgICAvLyBmb3JjZSByZWV2YWx1YXRpbmcgYWNjZXNzaWJpbGl0eSByb3V0aW5nIHdoZW4gY2FsbCBzdG9wcwogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+aW52YWxpZGF0ZVN0cmVhbShBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSk7CiAgICAgfQpAQCAtNTc3LDQ4ICs2NzgsNDcgQEAKICAgICAgICAgICAgICAgICAgIHx8IChpc19zdGF0ZV9pbl9jYWxsKHN0YXRlKSAmJiAoc3RhdGUgIT0gb2xkU3RhdGUpKSk7CiAKICAgICAvLyBjaGVjayBmb3IgZGV2aWNlIGFuZCBvdXRwdXQgY2hhbmdlcyB0cmlnZ2VyZWQgYnkgbmV3IHBob25lIHN0YXRlCi0gICAgY2hlY2tBMmRwU3VzcGVuZCgpOwotICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOwotICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CisgICAgY2hlY2tGb3JEZXZpY2VBbmRPdXRwdXRDaGFuZ2VzKCk7CiAKICAgICBpbnQgZGVsYXlNcyA9IDA7CiAgICAgaWYgKGlzU3RhdGVJbkNhbGwoc3RhdGUpKSB7CiAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgYXV0byBtdXNpY1N0cmF0ZWd5ID0gc3RyZWFtVG9TdHJhdGVneShBVURJT19TVFJFQU1fTVVTSUMpOworICAgICAgICBhdXRvIHNvbmlmaWNhdGlvblN0cmF0ZWd5ID0gc3RyZWFtVG9TdHJhdGVneShBVURJT19TVFJFQU1fQUxBUk0pOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CiAgICAgICAgICAgICAvLyBtdXRlIG1lZGlhIGFuZCBzb25pZmljYXRpb24gc3RyYXRlZ2llcyBhbmQgZGVsYXkgZGV2aWNlIHN3aXRjaCBieSB0aGUgbGFyZ2VzdAogICAgICAgICAgICAgLy8gbGF0ZW5jeSBvZiBhbnkgb3V0cHV0IHdoZXJlIGVpdGhlciBzdHJhdGVneSBpcyBhY3RpdmUuCiAgICAgICAgICAgICAvLyBUaGlzIGF2b2lkIHNlbmRpbmcgdGhlIHJpbmcgdG9uZSBvciBtdXNpYyB0YWlsIGludG8gdGhlIGVhcnBpZWNlIG9yIGhlYWRzZXQuCi0gICAgICAgICAgICBpZiAoKGlzU3RyYXRlZ3lBY3RpdmUoZGVzYywgU1RSQVRFR1lfTUVESUEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzVGltZSkgfHwKLSAgICAgICAgICAgICAgICAgaXNTdHJhdGVneUFjdGl2ZShkZXNjLCBTVFJBVEVHWV9TT05JRklDQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzVGltZSkpICYmCisgICAgICAgICAgICBpZiAoKGRlc2MtPmlzU3RyYXRlZ3lBY3RpdmUobXVzaWNTdHJhdGVneSwgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVksIHN5c1RpbWUpIHx8CisgICAgICAgICAgICAgICAgIGRlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoc29uaWZpY2F0aW9uU3RyYXRlZ3ksIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c1RpbWUpKSAmJgogICAgICAgICAgICAgICAgICAgICAoZGVsYXlNcyA8IChpbnQpZGVzYy0+bGF0ZW5jeSgpKjIpKSB7CiAgICAgICAgICAgICAgICAgZGVsYXlNcyA9IGRlc2MtPmxhdGVuY3koKSoyOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX01FRElBLCB0cnVlLCBkZXNjKTsKLSAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9NRURJQSwgZmFsc2UsIGRlc2MsIE1VVEVfVElNRV9NUywKLSAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgdHJ1ZSAvKmZyb21DYWNoZSovKSk7Ci0gICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCB0cnVlLCBkZXNjKTsKLSAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9TT05JRklDQVRJT04sIGZhbHNlLCBkZXNjLCBNVVRFX1RJTUVfTVMsCi0gICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCB0cnVlIC8qZnJvbUNhY2hlKi8pKTsKKyAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShtdXNpY1N0cmF0ZWd5LCB0cnVlLCBkZXNjKTsKKyAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShtdXNpY1N0cmF0ZWd5LCBmYWxzZSwgZGVzYywgTVVURV9USU1FX01TLAorICAgICAgICAgICAgICAgIG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfTUVESUEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIHRydWUgLypmcm9tQ2FjaGUqLykudHlwZXMoKSk7CisgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoc29uaWZpY2F0aW9uU3RyYXRlZ3ksIHRydWUsIGRlc2MpOworICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKHNvbmlmaWNhdGlvblN0cmF0ZWd5LCBmYWxzZSwgZGVzYywgTVVURV9USU1FX01TLAorICAgICAgICAgICAgICAgIG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfQUxBUk0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIHRydWUgLypmcm9tQ2FjaGUqLykudHlwZXMoKSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoaGFzUHJpbWFyeU91dHB1dCgpKSB7Ci0gICAgICAgIC8vIE5vdGUgdGhhdCBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgZ2V0TmV3T3V0cHV0RGV2aWNlKCkgaXMgY2FsbGVkIG9uIHRoZSBwcmltYXJ5IG91dHB1dCwKKyAgICAgICAgLy8gTm90ZSB0aGF0IGRlc3BpdGUgdGhlIGZhY3QgdGhhdCBnZXROZXdPdXRwdXREZXZpY2VzKCkgaXMgY2FsbGVkIG9uIHRoZSBwcmltYXJ5IG91dHB1dCwKICAgICAgICAgLy8gdGhlIGRldmljZSByZXR1cm5lZCBpcyBub3QgbmVjZXNzYXJpbHkgcmVhY2hhYmxlIHZpYSB0aGlzIG91dHB1dAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgcnhEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICBEZXZpY2VWZWN0b3IgcnhEZXZpY2VzID0gZ2V0TmV3T3V0cHV0RGV2aWNlcyhtUHJpbWFyeU91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CiAgICAgICAgIC8vIGZvcmNlIHJvdXRpbmcgY29tbWFuZCB0byBhdWRpbyBoYXJkd2FyZSB3aGVuIGVuZGluZyBjYWxsCiAgICAgICAgIC8vIGV2ZW4gaWYgbm8gZGV2aWNlIGNoYW5nZSBpcyBuZWVkZWQKLSAgICAgICAgaWYgKGlzU3RhdGVJbkNhbGwob2xkU3RhdGUpICYmIHJ4RGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICByeERldmljZSA9IG1QcmltYXJ5T3V0cHV0LT5kZXZpY2UoKTsKKyAgICAgICAgaWYgKGlzU3RhdGVJbkNhbGwob2xkU3RhdGUpICYmIHJ4RGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJ4RGV2aWNlcyA9IG1QcmltYXJ5T3V0cHV0LT5kZXZpY2VzKCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoc3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7Ci0gICAgICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhyeERldmljZSwgZGVsYXlNcyk7CisgICAgICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhyeERldmljZXMsIGRlbGF5TXMpOwogICAgICAgICB9IGVsc2UgaWYgKG9sZFN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgewogICAgICAgICAgICAgaWYgKG1DYWxsUnhQYXRjaCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKG1DYWxsUnhQYXRjaC0+bUFmUGF0Y2hIYW5kbGUsIDApOwpAQCAtNjI4LDQwICs3MjgsMzAgQEAKICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gobUNhbGxUeFBhdGNoLT5tQWZQYXRjaEhhbmRsZSwgMCk7CiAgICAgICAgICAgICAgICAgbUNhbGxUeFBhdGNoLmNsZWFyKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIHJ4RGV2aWNlLCBmb3JjZSwgMCk7CisgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKG1QcmltYXJ5T3V0cHV0LCByeERldmljZXMsIGZvcmNlLCAwKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldE91dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgcnhEZXZpY2UsIGZvcmNlLCAwKTsKKyAgICAgICAgICAgIHNldE91dHB1dERldmljZXMobVByaW1hcnlPdXRwdXQsIHJ4RGV2aWNlcywgZm9yY2UsIDApOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gcmVldmFsdWF0ZSByb3V0aW5nIG9uIGFsbCBvdXRwdXRzIGluIGNhc2UgdHJhY2tzIGhhdmUgYmVlbiBzdGFydGVkIGR1cmluZyB0aGUgY2FsbAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKGRlc2MsIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIERldmljZVZlY3RvciBuZXdEZXZpY2VzID0gZ2V0TmV3T3V0cHV0RGV2aWNlcyhkZXNjLCB0cnVlIC8qZnJvbUNhY2hlKi8pOwogICAgICAgICBpZiAoc3RhdGUgIT0gQVVESU9fTU9ERV9JTl9DQUxMIHx8IGRlc2MgIT0gbVByaW1hcnlPdXRwdXQpIHsKLSAgICAgICAgICAgIHNldE91dHB1dERldmljZShkZXNjLCBuZXdEZXZpY2UsIChuZXdEZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpLCAwIC8qZGVsYXlNcyovKTsKKyAgICAgICAgICAgIHNldE91dHB1dERldmljZXMoZGVzYywgbmV3RGV2aWNlcywgIW5ld0RldmljZXMuaXNFbXB0eSgpLCAwIC8qZGVsYXlNcyovKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIGlmIGVudGVyaW5nIGluIGNhbGwgc3RhdGUsIGhhbmRsZSBzcGVjaWFsIGNhc2Ugb2YgYWN0aXZlIHN0cmVhbXMKLSAgICAvLyBwZXJ0YWluaW5nIHRvIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBzZWUgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkKICAgICBpZiAoaXNTdGF0ZUluQ2FsbChzdGF0ZSkpIHsKICAgICAgICAgQUxPR1YoInNldFBob25lU3RhdGUoKSBpbiBjYWxsIHN0YXRlIG1hbmFnZW1lbnQ6IG5ldyBzdGF0ZSBpcyAlZCIsIHN0YXRlKTsKLSAgICAgICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBzdHJlYW0rKykgewotICAgICAgICAgICAgaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwgdHJ1ZSwgdHJ1ZSk7Ci0gICAgICAgIH0KLQogICAgICAgICAvLyBmb3JjZSByZWV2YWx1YXRpbmcgYWNjZXNzaWJpbGl0eSByb3V0aW5nIHdoZW4gY2FsbCBzdGFydHMKICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkpOwogICAgIH0KIAogICAgIC8vIEZsYWcgdGhhdCByaW5ndG9uZSB2b2x1bWUgbXVzdCBiZSBsaW1pdGVkIHRvIG11c2ljIHZvbHVtZSB1bnRpbCB3ZSBleGl0IE1PREVfUklOR1RPTkUKLSAgICBpZiAoc3RhdGUgPT0gQVVESU9fTU9ERV9SSU5HVE9ORSAmJgotICAgICAgICBpc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fTVVTSUMsIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZKSkgewotICAgICAgICBtTGltaXRSaW5ndG9uZVZvbHVtZSA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUgPSBmYWxzZTsKLSAgICB9CisgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUgPSAoc3RhdGUgPT0gQVVESU9fTU9ERV9SSU5HVE9ORSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9NVVNJQywgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVkpKTsKIH0KIAogYXVkaW9fbW9kZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0UGhvbmVTdGF0ZSgpIHsKQEAgLTY2OSw3ICs3NTksNyBAQAogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykKIHsKICAgICBBTE9HVigic2V0Rm9yY2VVc2UoKSB1c2FnZSAlZCwgY29uZmlnICVkLCBtUGhvbmVTdGF0ZSAlZCIsIHVzYWdlLCBjb25maWcsIG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSk7CiAgICAgaWYgKGNvbmZpZyA9PSBtRW5naW5lLT5nZXRGb3JjZVVzZSh1c2FnZSkpIHsKQEAgLTY4NSw5ICs3NzUsMTMgQEAKICAgICAgICAgICAgICh1c2FnZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSk7CiAKICAgICAvLyBjaGVjayBmb3IgZGV2aWNlIGFuZCBvdXRwdXQgY2hhbmdlcyB0cmlnZ2VyZWQgYnkgbmV3IGZvcmNlIHVzYWdlCi0gICAgY2hlY2tBMmRwU3VzcGVuZCgpOwotICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOwotICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CisgICAgY2hlY2tGb3JEZXZpY2VBbmRPdXRwdXRDaGFuZ2VzKCk7CisKKyAgICAvLyBmb3JjZSBjbGllbnQgcmVjb25uZWN0aW9uIHRvIHJlZXZhbHVhdGUgZmxhZyBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQKKyAgICBpZiAodXNhZ2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pIHsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oQVVESU9fU1RSRUFNX1NZU1RFTSk7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKTsKKyAgICB9CiAKICAgICAvL0ZJWE1FOiB3b3JrYXJvdW5kIGZvciB0cnVuY2F0ZWQgdG91Y2ggc291bmRzCiAgICAgLy8gdG8gYmUgcmVtb3ZlZCB3aGVuIHRoZSBwcm9ibGVtIGlzIGhhbmRsZWQgYnkgc3lzdGVtIFVJCkBAIC02OTcsMjYgKzc5MSwyNyBAQAogICAgICAgICBkZWxheU1zID0gVE9VQ0hfU09VTkRfRklYRURfREVMQVlfTVM7CiAgICAgfQogICAgIGlmIChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgPT0gQVVESU9fTU9ERV9JTl9DQUxMICYmIGhhc1ByaW1hcnlPdXRwdXQoKSkgewotICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCB0cnVlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICB3YWl0TXMgPSB1cGRhdGVDYWxsUm91dGluZyhuZXdEZXZpY2UsIGRlbGF5TXMpOworICAgICAgICBEZXZpY2VWZWN0b3IgbmV3RGV2aWNlcyA9IGdldE5ld091dHB1dERldmljZXMobVByaW1hcnlPdXRwdXQsIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIHdhaXRNcyA9IHVwZGF0ZUNhbGxSb3V0aW5nKG5ld0RldmljZXMsIGRlbGF5TXMpOwogICAgIH0KICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShvdXRwdXREZXNjLCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICBEZXZpY2VWZWN0b3IgbmV3RGV2aWNlcyA9IGdldE5ld091dHB1dERldmljZXMob3V0cHV0RGVzYywgdHJ1ZSAvKmZyb21DYWNoZSovKTsKICAgICAgICAgaWYgKChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgIT0gQVVESU9fTU9ERV9JTl9DQUxMKSB8fCAob3V0cHV0RGVzYyAhPSBtUHJpbWFyeU91dHB1dCkpIHsKLSAgICAgICAgICAgIHdhaXRNcyA9IHNldE91dHB1dERldmljZShvdXRwdXREZXNjLCBuZXdEZXZpY2UsIChuZXdEZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMpOworICAgICAgICAgICAgLy8gQXMgZG9uZSBpbiBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUsIHdlIGNvdWxkIGFsc28gZml4IGRlZmF1bHQgZGV2aWNlIGlzc3VlIGJ5CisgICAgICAgICAgICAvLyBwcmV2ZW50aW5nIHRoZSBmb3JjZSByZS1yb3V0aW5nIGluIGNhc2Ugb2YgZGVmYXVsdCBkZXYgdGhhdCBkaXN0aW5ndWlzaGVzIG9uIGFkZHJlc3MuCisgICAgICAgICAgICAvLyBMZXQncyBnaXZlIGJhY2sgdG8gZW5naW5lIGZ1bGwgZGV2aWNlIGNob2ljZSBkZWNpc2lvbiBob3dldmVyLgorICAgICAgICAgICAgd2FpdE1zID0gc2V0T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLCBuZXdEZXZpY2VzLCAhbmV3RGV2aWNlcy5pc0VtcHR5KCksIGRlbGF5TXMpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChmb3JjZVZvbHVtZVJlZXZhbCAmJiAobmV3RGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSkgewotICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKG91dHB1dERlc2MsIG5ld0RldmljZSwgd2FpdE1zLCB0cnVlKTsKKyAgICAgICAgaWYgKGZvcmNlVm9sdW1lUmVldmFsICYmICFuZXdEZXZpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKG91dHB1dERlc2MsIG5ld0RldmljZXMudHlwZXMoKSwgd2FpdE1zLCB0cnVlKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIGZvciAoY29uc3QgYXV0byYgYWN0aXZlRGVzYyA6IG1JbnB1dHMuZ2V0QWN0aXZlSW5wdXRzKCkpIHsKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld0lucHV0RGV2aWNlKGFjdGl2ZURlc2MpOworICAgICAgICBhdXRvIG5ld0RldmljZSA9IGdldE5ld0lucHV0RGV2aWNlKGFjdGl2ZURlc2MpOwogICAgICAgICAvLyBGb3JjZSBuZXcgaW5wdXQgc2VsZWN0aW9uIGlmIHRoZSBuZXcgZGV2aWNlIGNhbiBub3QgYmUgcmVhY2hlZCB2aWEgY3VycmVudCBpbnB1dAotICAgICAgICBpZiAoYWN0aXZlRGVzYy0+bVByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKS50eXBlcygpICYKLSAgICAgICAgICAgICAgICAobmV3RGV2aWNlICYgfkFVRElPX0RFVklDRV9CSVRfSU4pKSB7CisgICAgICAgIGlmIChhY3RpdmVEZXNjLT5tUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpLmNvbnRhaW5zKG5ld0RldmljZSkpIHsKICAgICAgICAgICAgIHNldElucHV0RGV2aWNlKGFjdGl2ZURlc2MtPm1Jb0hhbmRsZSwgbmV3RGV2aWNlKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGNsb3NlSW5wdXQoYWN0aXZlRGVzYy0+bUlvSGFuZGxlKTsKQEAgLTcyOSwyOCArODI0LDMxIEBACiAgICAgQUxPR1YoInNldFN5c3RlbVByb3BlcnR5KCkgcHJvcGVydHkgJXMsIHZhbHVlICVzIiwgcHJvcGVydHksIHZhbHVlKTsKIH0KIAotLy8gRmluZCBhIGRpcmVjdCBvdXRwdXQgcHJvZmlsZSBjb21wYXRpYmxlIHdpdGggdGhlIHBhcmFtZXRlcnMgcGFzc2VkLCBldmVuIGlmIHRoZSBpbnB1dCBmbGFncyBkbwotLy8gbm90IGV4cGxpY2l0bHkgcmVxdWVzdCBhIGRpcmVjdCBvdXRwdXQKLXNwPElPUHJvZmlsZT4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRQcm9maWxlRm9yRGlyZWN0T3V0cHV0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCisvLyBGaW5kIGFuIG91dHB1dCBwcm9maWxlIGNvbXBhdGlibGUgd2l0aCB0aGUgcGFyYW1ldGVycyBwYXNzZWQuIFdoZW4gImRpcmVjdE9ubHkiIGlzIHNldCwgcmVzdHJpY3QKKy8vIHNlYXJjaCB0byBwcm9maWxlcyBmb3IgZGlyZWN0IG91dHB1dHMuCitzcDxJT1Byb2ZpbGU+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0UHJvZmlsZUZvck91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRpcmVjdE9ubHkpCiB7Ci0gICAgLy8gb25seSByZXRhaW4gZmxhZ3MgdGhhdCB3aWxsIGRyaXZlIHRoZSBkaXJlY3Qgb3V0cHV0IHByb2ZpbGUgc2VsZWN0aW9uCi0gICAgLy8gaWYgZXhwbGljaXRseSByZXF1ZXN0ZWQKLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga1JlbGV2YW50RmxhZ3MgPQotICAgICAgICAgICAgKEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMgfCBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEIHwKLSAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19WT0lQX1JYKTsKLSAgICBmbGFncyA9Ci0gICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoKGZsYWdzICYga1JlbGV2YW50RmxhZ3MpIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICBpZiAoZGlyZWN0T25seSkgeworICAgICAgICAvLyBvbmx5IHJldGFpbiBmbGFncyB0aGF0IHdpbGwgZHJpdmUgdGhlIGRpcmVjdCBvdXRwdXQgcHJvZmlsZSBzZWxlY3Rpb24KKyAgICAgICAgLy8gaWYgZXhwbGljaXRseSByZXF1ZXN0ZWQKKyAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtSZWxldmFudEZsYWdzID0KKyAgICAgICAgICAgICAgICAoQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyB8IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQgfAorICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19WT0lQX1JYKTsKKyAgICAgICAgZmxhZ3MgPQorICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KSgoZmxhZ3MgJiBrUmVsZXZhbnRGbGFncykgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgIH0KIAogICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZTsKIAogICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBtSHdNb2R1bGVzKSB7CiAgICAgICAgIGZvciAoY29uc3QgYXV0byYgY3VyUHJvZmlsZSA6IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpKSB7Ci0gICAgICAgICAgICBpZiAoIWN1clByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2aWNlLCBTdHJpbmc4KCIiKSwKKyAgICAgICAgICAgIGlmICghY3VyUHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsIE5VTEwgLyp1cGRhdGVkU2FtcGxpbmdSYXRlKi8sCiAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgTlVMTCAvKnVwZGF0ZWRGb3JtYXQqLywKICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIE5VTEwgLyp1cGRhdGVkQ2hhbm5lbE1hc2sqLywKQEAgLTc1OCwxMCArODU2LDE2IEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyByZWplY3QgcHJvZmlsZXMgbm90IGNvcnJlc3BvbmRpbmcgdG8gYSBkZXZpY2UgY3VycmVudGx5IGF2YWlsYWJsZQotICAgICAgICAgICAgaWYgKChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpICYgY3VyUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlc1R5cGUoKSkgPT0gMCkgeworICAgICAgICAgICAgaWYgKCFtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5jb250YWluc0F0TGVhc3RPbmUoY3VyUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gaWYgc2V2ZXJhbCBwcm9maWxlcyBhcmUgY29tcGF0aWJsZSwgZ2l2ZSBwcmlvcml0eSB0byBvbmUgd2l0aCBvZmZsb2FkIGNhcGFiaWxpdHkKKyAgICAgICAgICAgIC8vIHJlamVjdCBwcm9maWxlcyBpZiBjb25uZWN0ZWQgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgY29kZWMKKyAgICAgICAgICAgIGlmICghY3VyUHJvZmlsZS0+ZGV2aWNlU3VwcG9ydHNFbmNvZGVkRm9ybWF0cyhkZXZpY2VzLnR5cGVzKCkpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWRpcmVjdE9ubHkpIHJldHVybiBjdXJQcm9maWxlOworICAgICAgICAgICAgLy8gd2hlbiBzZWFyY2hpbmcgZm9yIGRpcmVjdCBvdXRwdXRzLCBpZiBzZXZlcmFsIHByb2ZpbGVzIGFyZSBjb21wYXRpYmxlLCBnaXZlIHByaW9yaXR5CisgICAgICAgICAgICAvLyB0byBvbmUgd2l0aCBvZmZsb2FkIGNhcGFiaWxpdHkKICAgICAgICAgICAgIGlmIChwcm9maWxlICE9IDAgJiYgKChjdXJQcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgPT0gMCkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KQEAgLTc3Niw4ICs4ODAsNyBAQAogCiBhdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKIHsKLSAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koc3RyZWFtKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgIERldmljZVZlY3RvciBkZXZpY2VzID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbShzdHJlYW0sIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwogCiAgICAgLy8gTm90ZSB0aGF0IHJlbGF0ZWQgbWV0aG9kIGdldE91dHB1dEZvckF0dHIoKSB1c2VzIGdldE91dHB1dEZvckRldmljZSgpIG5vdCBzZWxlY3RPdXRwdXQoKS4KICAgICAvLyBXZSB1c2Ugc2VsZWN0T3V0cHV0KCkgaGVyZSBzaW5jZSB3ZSBkb24ndCBoYXZlIHRoZSBkZXNpcmVkIEF1ZGlvVHJhY2sgc2FtcGxlIHJhdGUsCkBAIC03ODUsMTMgKzg4OCwxNjMgQEAKICAgICAvLyBnZXRPdXRwdXQoKSBzb2xlbHkgb24gYXVkaW9fc3RyZWFtX3R5cGUgc3VjaCBhcyBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0RnJhbWVDb3VudCgpCiAgICAgLy8gYW5kIEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRTYW1wbGluZ1JhdGUoKS4KIAotICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2UoZGV2aWNlLCBtT3V0cHV0cyk7Ci0gICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsIEFVRElPX0ZPUk1BVF9JTlZBTElEKTsKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlcyhkZXZpY2VzLCBtT3V0cHV0cyk7CisgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMpOwogCi0gICAgQUxPR1YoImdldE91dHB1dCgpIHN0cmVhbSAlZCBzZWxlY3RlZCBkZXZpY2UgJTA4eCwgb3V0cHV0ICVkIiwgc3RyZWFtLCBkZXZpY2UsIG91dHB1dCk7CisgICAgQUxPR1YoImdldE91dHB1dCgpIHN0cmVhbSAlZCBzZWxlY3RlZCBkZXZpY2VzICVzLCBvdXRwdXQgJWQiLCBzdHJlYW0sCisgICAgICAgICAgZGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCksIG91dHB1dCk7CiAgICAgcmV0dXJuIG91dHB1dDsKIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRBdWRpb0F0dHJpYnV0ZXMoYXVkaW9fYXR0cmlidXRlc190ICpkc3RBdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICpzcmNBdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzcmNTdHJlYW0pCit7CisgICAgaWYgKHNyY0F0dHIgIT0gTlVMTCkgeworICAgICAgICBpZiAoIWlzVmFsaWRBdHRyaWJ1dGVzKHNyY0F0dHIpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgaW52YWxpZCBhdHRyaWJ1dGVzOiB1c2FnZT0lZCBjb250ZW50PSVkIGZsYWdzPTB4JXggdGFncz1bJXNdIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgIHNyY0F0dHItPnVzYWdlLCBzcmNBdHRyLT5jb250ZW50X3R5cGUsIHNyY0F0dHItPmZsYWdzLAorICAgICAgICAgICAgICAgICAgICBzcmNBdHRyLT50YWdzKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgKmRzdEF0dHIgPSAqc3JjQXR0cjsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoc3JjU3RyZWFtIDwgQVVESU9fU1RSRUFNX01JTiB8fCBzcmNTdHJlYW0gPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogIGludmFsaWQgc3RyZWFtIHR5cGUiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgICpkc3RBdHRyID0gbUVuZ2luZS0+Z2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoc3JjU3RyZWFtKTsKKyAgICB9CisKKyAgICAvLyBPbmx5IGhvbm9yIGF1ZGliaWxpdHkgZW5mb3JjZWQgd2hlbiByZXF1aXJlZC4gVGhlIGNsaWVudCB3aWxsIGJlCisgICAgLy8gZm9yY2VkIHRvIHJlY29ubmVjdCBpZiB0aGUgZm9yY2VkIHVzYWdlIGNoYW5nZXMuCisgICAgaWYgKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKSB7CisgICAgICAgIGRzdEF0dHItPmZsYWdzICY9IH5BVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQ7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dEZvckF0dHJJbnQoCisgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAqcmVzdWx0QXR0ciwKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAorICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgYm9vbCAqaXNSZXF1ZXN0ZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UsCisgICAgICAgIHN0ZDo6dmVjdG9yPHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4gKnNlY29uZGFyeURlc2NzKQoreworICAgIERldmljZVZlY3RvciBvdXRwdXREZXZpY2VzOworICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgcmVxdWVzdGVkUG9ydElkID0gKnNlbGVjdGVkRGV2aWNlSWQ7CisgICAgRGV2aWNlVmVjdG9yIG1zZERldmljZXMgPSBnZXRNc2RBdWRpb091dERldmljZXMoKTsKKyAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiByZXF1ZXN0ZWREZXZpY2UgPQorICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQocmVxdWVzdGVkUG9ydElkKTsKKworICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1ZGlvQXR0cmlidXRlcyhyZXN1bHRBdHRyLCBhdHRyLCAqc3RyZWFtKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGlmIChhdXRvIGl0ID0gbUFsbG93ZWRDYXB0dXJlUG9saWNpZXMuZmluZCh1aWQpOyBpdCAhPSBlbmQobUFsbG93ZWRDYXB0dXJlUG9saWNpZXMpKSB7CisgICAgICAgIHJlc3VsdEF0dHItPmZsYWdzIHw9IGl0LT5zZWNvbmQ7CisgICAgfQorICAgICpzdHJlYW0gPSBtRW5naW5lLT5nZXRTdHJlYW1UeXBlRm9yQXR0cmlidXRlcygqcmVzdWx0QXR0cik7CisKKyAgICBBTE9HVigiJXMoKSBhdHRyaWJ1dGVzPSVzIHN0cmVhbT0lcyBzZXNzaW9uICVkIHNlbGVjdGVkRGV2aWNlSWQgJWQiLCBfX2Z1bmNfXywKKyAgICAgICAgICB0b1N0cmluZygqcmVzdWx0QXR0cikuY19zdHIoKSwgdG9TdHJpbmcoKnN0cmVhbSkuY19zdHIoKSwgc2Vzc2lvbiwgcmVxdWVzdGVkUG9ydElkKTsKKworICAgIC8vIFRoZSBwcmltYXJ5IG91dHB1dCBpcyB0aGUgZXhwbGljaXQgcm91dGluZyAoZWcuIHNldFByZWZlcnJlZERldmljZSkgaWYgc3BlY2lmaWVkLAorICAgIC8vICAgICAgIG90aGVyd2lzZSwgZmFsbGJhY2sgdG8gdGhlIGR5bmFtaWMgcG9saWNpZXMsIGlmIG5vbmUgbWF0Y2gsIHF1ZXJ5IHRoZSBlbmdpbmUuCisgICAgLy8gU2Vjb25kYXJ5IG91dHB1dHMgYXJlIGFsd2F5cyBmb3VuZCBieSBkeW5hbWljIHBvbGljaWVzIGFzIHRoZSBlbmdpbmUgZG8gbm90IHN1cHBvcnQgdGhlbQorICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBwb2xpY3lEZXNjOworICAgIHN0YXR1cyA9IG1Qb2xpY3lNaXhlcy5nZXRPdXRwdXRGb3JBdHRyKCpyZXN1bHRBdHRyLCB1aWQsICpmbGFncywgcG9saWN5RGVzYywgc2Vjb25kYXJ5RGVzY3MpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICAvLyBFeHBsaWNpdCByb3V0aW5nIGlzIGhpZ2hlciBwcmlvcml0eSB0aGVuIGFueSBkeW5hbWljIHBvbGljeSBwcmltYXJ5IG91dHB1dAorICAgIGJvb2wgdXNlUHJpbWFyeU91dHB1dEZyb21Qb2xpY3lNaXhlcyA9IHJlcXVlc3RlZERldmljZSA9PSBudWxscHRyICYmIHBvbGljeURlc2MgIT0gbnVsbHB0cjsKKworICAgIC8vIEZJWE1FOiBpbiBjYXNlIG9mIFJFTkRFUiBwb2xpY3ksIHRoZSBvdXRwdXQgY2FwYWJpbGl0aWVzIHNob3VsZCBiZSBjaGVja2VkCisgICAgaWYgKCh1c2VQcmltYXJ5T3V0cHV0RnJvbVBvbGljeU1peGVzIHx8ICFzZWNvbmRhcnlEZXNjcy0+ZW1wdHkoKSkKKyAgICAgICAgJiYgIWF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpKSB7CisgICAgICAgIEFMT0dEKCIlczogcmVqZWN0aW5nIHJlcXVlc3QgYXMgZHluYW1pYyBhdWRpbyBwb2xpY3kgb25seSBzdXBwb3J0IHBjbSIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKHVzZVByaW1hcnlPdXRwdXRGcm9tUG9saWN5TWl4ZXMpIHsKKyAgICAgICAgKm91dHB1dCA9IHBvbGljeURlc2MtPm1Jb0hhbmRsZTsKKyAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IG1peCA9IHBvbGljeURlc2MtPm1Qb2xpY3lNaXgucHJvbW90ZSgpOworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjID0KKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2UobWl4LT5tRGV2aWNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4LT5tRGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IGRldmljZURlc2MgIT0gMCA/IGRldmljZURlc2MtPmdldElkKCkgOiBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yQXR0cigpIHJldHVybnMgb3V0cHV0ICVkIiwgKm91dHB1dCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgLy8gVmlydHVhbCBzb3VyY2VzIG11c3QgYWx3YXlzIGJlIGR5bmFtaWNhbHkgb3IgZXhwbGljaXRseSByb3V0ZWQKKyAgICBpZiAocmVzdWx0QXR0ci0+dXNhZ2UgPT0gQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0UpIHsKKyAgICAgICAgQUxPR1coImdldE91dHB1dEZvckF0dHIoKSBubyBwb2xpY3kgbWl4IGZvdW5kIGZvciB1c2FnZSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICAvLyBleHBsaWNpdCByb3V0aW5nIG1hbmFnZWQgYnkgZ2V0RGV2aWNlRm9yU3RyYXRlZ3kgaW4gQVBNIGlzIG5vdyBoYW5kbGVkIGJ5IGVuZ2luZQorICAgIC8vIGluIG9yZGVyIHRvIGxldCB0aGUgY2hvaWNlIG9mIHRoZSBvcmRlciB0byBmdXR1cmUgdmVuZG9yIGVuZ2luZQorICAgIG91dHB1dERldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcygqcmVzdWx0QXR0ciwgcmVxdWVzdGVkRGV2aWNlLCBmYWxzZSk7CisKKyAgICBpZiAoKHJlc3VsdEF0dHItPmZsYWdzICYgQVVESU9fRkxBR19IV19BVl9TWU5DKSAhPSAwKSB7CisgICAgICAgICpmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoKmZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyk7CisgICAgfQorCisgICAgLy8gU2V0IGluY2FsbCBtdXNpYyBvbmx5IGlmIGRldmljZSB3YXMgZXhwbGljaXRseSBzZXQsIGFuZCBmYWxsYmFjayB0byB0aGUgZGV2aWNlIHdoaWNoIGlzCisgICAgLy8gY2hvc2VuIGJ5IHRoZSBlbmdpbmUgaWYgbm90LgorICAgIC8vIEZJWE1FOiBwcm92aWRlIGEgbW9yZSBnZW5lcmljIGFwcHJvYWNoIHdoaWNoIGlzIG5vdCBkZXZpY2Ugc3BlY2lmaWMgYW5kIG1vdmUgdGhpcyBiYWNrCisgICAgLy8gdG8gZ2V0T3V0cHV0Rm9yRGV2aWNlLgorICAgIC8vIFRPRE86IFJlbW92ZSBjaGVjayBvZiBBVURJT19TVFJFQU1fTVVTSUMgb25jZSBtaWdyYXRpb24gaXMgY29tcGxldGVkIG9uIHRoZSBhcHAgc2lkZS4KKyAgICBpZiAob3V0cHV0RGV2aWNlcy50eXBlcygpID09IEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYICYmCisgICAgICAgICgqc3RyZWFtID09IEFVRElPX1NUUkVBTV9NVVNJQyAgfHwgcmVzdWx0QXR0ci0+dXNhZ2UgPT0gQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTikgJiYKKyAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShjb25maWctPmZvcm1hdCkgJiYKKyAgICAgICAgaXNJbkNhbGwoKSkgeworICAgICAgICBpZiAocmVxdWVzdGVkUG9ydElkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICpmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdClBVURJT19PVVRQVVRfRkxBR19JTkNBTExfTVVTSUM7CisgICAgICAgICAgICAqaXNSZXF1ZXN0ZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoIiVzKCkgZGV2aWNlICVzLCBzYW1wbGluZyByYXRlICVkLCBmb3JtYXQgJSN4LCBjaGFubmVsIG1hc2sgJSN4LCBmbGFncyAlI3ggc3RyZWFtICVzIiwKKyAgICAgICAgICBfX2Z1bmNfXywgb3V0cHV0RGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCksIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LAorICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLCAqZmxhZ3MsIHRvU3RyaW5nKCpzdHJlYW0pLmNfc3RyKCkpOworCisgICAgKm91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIGlmICghbXNkRGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgKm91dHB1dCA9IGdldE91dHB1dEZvckRldmljZXMobXNkRGV2aWNlcywgc2Vzc2lvbiwgKnN0cmVhbSwgY29uZmlnLCBmbGFncyk7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IG91dHB1dERldmljZXMuaXNFbXB0eSgpID8gbnVsbHB0ciA6IG91dHB1dERldmljZXMuaXRlbUF0KDApOworICAgICAgICBpZiAoKm91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSAmJiBzZXRNc2RQYXRjaChkZXZpY2UpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HVigiJXMoKSBVc2luZyBNU0QgZGV2aWNlcyAlcyBpbnN0ZWFkIG9mIGRldmljZXMgJXMiLAorICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1zZERldmljZXMudG9TdHJpbmcoKS5jX3N0cigpLCBvdXRwdXREZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICBvdXRwdXREZXZpY2VzID0gbXNkRGV2aWNlczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKm91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAqb3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRGV2aWNlcyhvdXRwdXREZXZpY2VzLCBzZXNzaW9uLCAqc3RyZWFtLCBjb25maWcsCisgICAgICAgICAgICAgICAgZmxhZ3MsIHJlc3VsdEF0dHItPmZsYWdzICYgQVVESU9fRkxBR19NVVRFX0hBUFRJQyk7CisgICAgfQorICAgIGlmICgqb3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IGdldEZpcnN0RGV2aWNlSWQob3V0cHV0RGV2aWNlcyk7CisKKyAgICBBTE9HVigiJXMgcmV0dXJucyBvdXRwdXQgJWQgc2VsZWN0ZWREZXZpY2VJZCAlZCIsIF9fZnVuY19fLCAqb3V0cHV0LCAqc2VsZWN0ZWREZXZpY2VJZCk7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKQEAgLTgwMCwxMTEgKzEwNTMsNzMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+ICpzZWNvbmRhcnlPdXRwdXRzKQogewotICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzOwotICAgIGlmIChhdHRyICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKCFpc1ZhbGlkQXR0cmlidXRlcyhhdHRyKSkgewotICAgICAgICAgICAgQUxPR0UoImdldE91dHB1dEZvckF0dHIoKSBpbnZhbGlkIGF0dHJpYnV0ZXM6IHVzYWdlPSVkIGNvbnRlbnQ9JWQgZmxhZ3M9MHgleCB0YWdzPVslc10iLAotICAgICAgICAgICAgICAgICAgYXR0ci0+dXNhZ2UsIGF0dHItPmNvbnRlbnRfdHlwZSwgYXR0ci0+ZmxhZ3MsCi0gICAgICAgICAgICAgICAgICBhdHRyLT50YWdzKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgYXR0cmlidXRlcyA9ICphdHRyOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICgqc3RyZWFtIDwgQVVESU9fU1RSRUFNX01JTiB8fCAqc3RyZWFtID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0cigpOiAgaW52YWxpZCBzdHJlYW0gdHlwZSIpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBzdHJlYW1fdHlwZV90b19hdWRpb19hdHRyaWJ1dGVzKCpzdHJlYW0sICZhdHRyaWJ1dGVzKTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBjaGVjayBmb3IgZXhpc3RpbmcgY2xpZW50IGZvciB0aGlzIHBvcnQgSUQKLSAgICBpZiAoKnBvcnRJZCA9PSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICpwb3J0SWQgPSBBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpOwotICAgIH0KLQotICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjOwotICAgIGlmIChtUG9saWN5TWl4ZXMuZ2V0T3V0cHV0Rm9yQXR0cihhdHRyaWJ1dGVzLCB1aWQsIGRlc2MpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dfQVNTRVJUKGRlc2MgIT0gMCwgIkludmFsaWQgZGVzYyByZXR1cm5lZCBieSBnZXRPdXRwdXRGb3JBdHRyIik7Ci0gICAgICAgIGlmICghYXVkaW9faGFzX3Byb3BvcnRpb25hbF9mcmFtZXMoY29uZmlnLT5mb3JtYXQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgICpzdHJlYW0gPSBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoJmF0dHJpYnV0ZXMpOwotICAgICAgICAqb3V0cHV0ID0gZGVzYy0+bUlvSGFuZGxlOwotICAgICAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yQXR0cigpIHJldHVybnMgb3V0cHV0ICVkIiwgKm91dHB1dCk7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0gICAgaWYgKGF0dHJpYnV0ZXMudXNhZ2UgPT0gQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0UpIHsKLSAgICAgICAgQUxPR1coImdldE91dHB1dEZvckF0dHIoKSBubyBwb2xpY3kgbWl4IGZvdW5kIGZvciB1c2FnZSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRSIpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JBdHRyKCkgdXNhZ2U9JWQsIGNvbnRlbnQ9JWQsIHRhZz0lcyBmbGFncz0lMDh4IgotICAgICAgICAgICAgIiBzZXNzaW9uICVkIHNlbGVjdGVkRGV2aWNlSWQgJWQiLAotICAgICAgICAgICAgYXR0cmlidXRlcy51c2FnZSwgYXR0cmlidXRlcy5jb250ZW50X3R5cGUsIGF0dHJpYnV0ZXMudGFncywgYXR0cmlidXRlcy5mbGFncywKLSAgICAgICAgICAgIHNlc3Npb24sICpzZWxlY3RlZERldmljZUlkKTsKLQotICAgICpzdHJlYW0gPSBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoJmF0dHJpYnV0ZXMpOwotCi0gICAgLy8gRXhwbGljaXQgcm91dGluZz8KLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjOwotICAgIGlmICgqc2VsZWN0ZWREZXZpY2VJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIGRldmljZURlc2MgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoKnNlbGVjdGVkRGV2aWNlSWQpOwotICAgIH0KLSAgICBtT3V0cHV0Um91dGVzLmFkZFJvdXRlKHNlc3Npb24sICpzdHJlYW0sIFNlc3Npb25Sb3V0ZTo6U09VUkNFX1RZUEVfTkEsIGRldmljZURlc2MsIHVpZCk7Ci0KLSAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gKHJvdXRpbmdfc3RyYXRlZ3kpIGdldFN0cmF0ZWd5Rm9yQXR0cigmYXR0cmlidXRlcyk7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLQotICAgIGlmICgoYXR0cmlidXRlcy5mbGFncyAmIEFVRElPX0ZMQUdfSFdfQVZfU1lOQykgIT0gMCkgewotICAgICAgICAqZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKCpmbGFncyB8IEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpOwotICAgIH0KLQotICAgIC8vIFNldCBpbmNhbGwgbXVzaWMgb25seSBpZiBkZXZpY2Ugd2FzIGV4cGxpY2l0bHkgc2V0LCBhbmQgZmFsbGJhY2sgdG8gdGhlIGRldmljZSB3aGljaCBpcwotICAgIC8vIGNob3NlbiBieSB0aGUgZW5naW5lIGlmIG5vdC4KLSAgICAvLyBGSVhNRTogcHJvdmlkZSBhIG1vcmUgZ2VuZXJpYyBhcHByb2FjaCB3aGljaCBpcyBub3QgZGV2aWNlIHNwZWNpZmljIGFuZCBtb3ZlIHRoaXMgYmFjawotICAgIC8vIHRvIGdldE91dHB1dEZvckRldmljZS4KLSAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYICYmCi0gICAgICAgICpzdHJlYW0gPT0gQVVESU9fU1RSRUFNX01VU0lDICYmCi0gICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpICYmCi0gICAgICAgIGlzSW5DYWxsKCkpIHsKLSAgICAgICAgaWYgKCpzZWxlY3RlZERldmljZUlkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICpmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdClBVURJT19PVVRQVVRfRkxBR19JTkNBTExfTVVTSUM7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBtRW5naW5lLT5nZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yQXR0cigpIGRldmljZSAweCV4LCBzYW1wbGluZyByYXRlICVkLCBmb3JtYXQgJSN4LCBjaGFubmVsIG1hc2sgJSN4LCAiCi0gICAgICAgICAgImZsYWdzICUjeCIsCi0gICAgICAgICAgZGV2aWNlLCBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssICpmbGFncyk7Ci0KLSAgICAqb3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRGV2aWNlKGRldmljZSwgc2Vzc2lvbiwgKnN0cmVhbSwgY29uZmlnLCBmbGFncyk7Ci0gICAgaWYgKCpvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgbU91dHB1dFJvdXRlcy5yZW1vdmVSb3V0ZShzZXNzaW9uKTsKKyAgICAvLyBUaGUgc3VwcGxpZWQgcG9ydElkIG11c3QgYmUgQVVESU9fUE9SVF9IQU5ETEVfTk9ORQorICAgIGlmICgqcG9ydElkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KKyAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IHJlcXVlc3RlZFBvcnRJZCA9ICpzZWxlY3RlZERldmljZUlkOworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCByZXN1bHRBdHRyOworICAgIGJvb2wgaXNSZXF1ZXN0ZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UgPSBmYWxzZTsKKyAgICBzdGQ6OnZlY3RvcjxzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4+IHNlY29uZGFyeU91dHB1dERlc2NzOworICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IHJlcXVlc3RlZERldmljZSA9CisgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQocmVxdWVzdGVkUG9ydElkKTsKIAotICAgIERldmljZVZlY3RvciBvdXRwdXREZXZpY2VzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7Ci0gICAgKnNlbGVjdGVkRGV2aWNlSWQgPSBvdXRwdXREZXZpY2VzLnNpemUoKSA+IDAgPyBvdXRwdXREZXZpY2VzLml0ZW1BdCgwKS0+Z2V0SWQoKQotICAgICAgICAgICAgOiBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIC8vIFByZXZlbnQgZnJvbSBzdG9yaW5nIGludmFsaWQgcmVxdWVzdGVkIGRldmljZSBpZCBpbiBjbGllbnRzCisgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBzYW5pdGl6ZWRSZXF1ZXN0ZWRQb3J0SWQgPQorICAgICAgcmVxdWVzdGVkRGV2aWNlICE9IG51bGxwdHIgPyByZXF1ZXN0ZWRQb3J0SWQgOiBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICpzZWxlY3RlZERldmljZUlkID0gc2FuaXRpemVkUmVxdWVzdGVkUG9ydElkOwogCi0gICAgQUxPR1YoIiAgZ2V0T3V0cHV0Rm9yQXR0cigpIHJldHVybnMgb3V0cHV0ICVkIHNlbGVjdGVkRGV2aWNlSWQgJWQiLCAqb3V0cHV0LCAqc2VsZWN0ZWREZXZpY2VJZCk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0T3V0cHV0Rm9yQXR0ckludCgmcmVzdWx0QXR0ciwgb3V0cHV0LCBzZXNzaW9uLCBhdHRyLCBzdHJlYW0sIHVpZCwKKyAgICAgICAgICAgIGNvbmZpZywgZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsICZpc1JlcXVlc3RlZERldmljZUZvckV4Y2x1c2l2ZVVzZSwKKyAgICAgICAgICAgICZzZWNvbmRhcnlPdXRwdXREZXNjcyk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBzdGQ6OnZlY3Rvcjx3cDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4+IHdlYWtTZWNvbmRhcnlPdXRwdXREZXNjczsKKyAgICBmb3IgKGF1dG8mIHNlY29uZGFyeURlc2MgOiBzZWNvbmRhcnlPdXRwdXREZXNjcykgeworICAgICAgICBzZWNvbmRhcnlPdXRwdXRzLT5wdXNoX2JhY2soc2Vjb25kYXJ5RGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgd2Vha1NlY29uZGFyeU91dHB1dERlc2NzLnB1c2hfYmFjayhzZWNvbmRhcnlEZXNjKTsKKyAgICB9CisKKyAgICBhdWRpb19jb25maWdfYmFzZV90IGNsaWVudENvbmZpZyA9IHsuc2FtcGxlX3JhdGUgPSBjb25maWctPnNhbXBsZV9yYXRlLAorICAgICAgICAuZm9ybWF0ID0gY29uZmlnLT5mb3JtYXQsCisgICAgICAgIC5jaGFubmVsX21hc2sgPSBjb25maWctPmNoYW5uZWxfbWFzayB9OworICAgICpwb3J0SWQgPSBBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpOworCisgICAgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiBjbGllbnREZXNjID0KKyAgICAgICAgbmV3IFRyYWNrQ2xpZW50RGVzY3JpcHRvcigqcG9ydElkLCB1aWQsIHNlc3Npb24sIHJlc3VsdEF0dHIsIGNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW5pdGl6ZWRSZXF1ZXN0ZWRQb3J0SWQsICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVuZ2luZS0+Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhyZXN1bHRBdHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1ZvbHVtZVNvdXJjZShyZXN1bHRBdHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqZmxhZ3MsIGlzUmVxdWVzdGVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZSh3ZWFrU2Vjb25kYXJ5T3V0cHV0RGVzY3MpKTsKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKCpvdXRwdXQpOworICAgIG91dHB1dERlc2MtPmFkZENsaWVudChjbGllbnREZXNjKTsKKworICAgIEFMT0dWKCIlcygpIHJldHVybnMgb3V0cHV0ICVkIHJlcXVlc3RlZFBvcnRJZCAlZCBzZWxlY3RlZERldmljZUlkICVkIGZvciBwb3J0IElEICVkIiwgX19mdW5jX18sCisgICAgICAgICAgKm91dHB1dCwgcmVxdWVzdGVkUG9ydElkLCAqc2VsZWN0ZWREZXZpY2VJZCwgKnBvcnRJZCk7CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0Rm9yRGV2aWNlKAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRGb3JEZXZpY2VzKAorICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMsCiAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzKQorICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAqZmxhZ3MsCisgICAgICAgIGJvb2wgZm9yY2VNdXRpbmdIYXB0aWMpCiB7CiAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogCisgICAgLy8gRGlzY2FyZCBoYXB0aWMgY2hhbm5lbCBtYXNrIHdoZW4gZm9yY2luZyBtdXRpbmcgaGFwdGljIGNoYW5uZWxzLgorICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gZm9yY2VNdXRpbmdIYXB0aWMKKyAgICAgICAgICAgID8gKGNvbmZpZy0+Y2hhbm5lbF9tYXNrICYgfkFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkgOiBjb25maWctPmNoYW5uZWxfbWFzazsKKwogICAgIC8vIG9wZW4gYSBkaXJlY3Qgb3V0cHV0IGlmIHJlcXVpcmVkIGJ5IHNwZWNpZmllZCBwYXJhbWV0ZXJzCiAgICAgLy9mb3JjZSBkaXJlY3QgZmxhZyBpZiBvZmZsb2FkIGZsYWcgaXMgc2V0OiBvZmZsb2FkaW5nIGltcGxpZXMgYSBkaXJlY3Qgb3V0cHV0IHN0cmVhbQogICAgIC8vIGFuZCBhbGwgY29tbW9uIGJlaGF2aW9ycyBhcmUgZHJpdmVuIGJ5IGNoZWNraW5nIG9ubHkgdGhlIGRpcmVjdCBmbGFnCkBAIC05MjcsNyArMTE0Miw4IEBACiAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVFRTKSB7CiAgICAgICAgICpmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX1RUUzsKICAgICB9IGVsc2UgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCAmJgotICAgICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShjb25maWctPmZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpICYmCisgICAgICAgICAgICAgICAoKmZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfSU5DQUxMX01VU0lDKSA9PSAwKSB7CiAgICAgICAgICpmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoQVVESU9fT1VUUFVUX0ZMQUdfVk9JUF9SWCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOwogICAgICAgICBBTE9HVigiU2V0IFZvSVAgYW5kIERpcmVjdCBvdXRwdXQgZmxhZ3MgZm9yIFBDTSBmb3JtYXQiKTsKQEAgLTk0MCw3ICsxMTU2LDcgQEAKICAgICAvLyBhbmQgbm90IGV4cGxpY2l0bHkgcmVxdWVzdGVkCiAgICAgaWYgKCgoKmZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSA9PSAwKSAmJgogICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShjb25maWctPmZvcm1hdCkgJiYgY29uZmlnLT5zYW1wbGVfcmF0ZSA8PSBTQU1QTEVfUkFURV9IWl9NQVggJiYKLSAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjb25maWctPmNoYW5uZWxfbWFzaykgPD0gMikgeworICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKSA8PSAyKSB7CiAgICAgICAgIGdvdG8gbm9uX2RpcmVjdF9vdXRwdXQ7CiAgICAgfQogCkBAIC05NTMsMTEgKzExNjksMTIgQEAKIAogICAgIGlmICgoKCpmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpID09IDApIHx8CiAgICAgICAgICAgICAhKG1FZmZlY3RzLmlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkgfHwgbU1hc3Rlck1vbm8pKSB7Ci0gICAgICAgIHByb2ZpbGUgPSBnZXRQcm9maWxlRm9yRGlyZWN0T3V0cHV0KGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkqZmxhZ3MpOworICAgICAgICBwcm9maWxlID0gZ2V0UHJvZmlsZUZvck91dHB1dChkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkqZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogZGlyZWN0T25seSAqLyk7CiAgICAgfQogCiAgICAgaWYgKHByb2ZpbGUgIT0gMCkgewpAQCAtOTY5LDEwICsxMTg2LDEwIEBACiAgICAgICAgICAgICAgICAgLy8gYW5kIGNvbmZpZ3VyZWQgd2l0aCBzYW1lIHBhcmFtZXRlcnMKICAgICAgICAgICAgICAgICBpZiAoKGNvbmZpZy0+c2FtcGxlX3JhdGUgPT0gZGVzYy0+bVNhbXBsaW5nUmF0ZSkgJiYKICAgICAgICAgICAgICAgICAgICAgKGNvbmZpZy0+Zm9ybWF0ID09IGRlc2MtPm1Gb3JtYXQpICYmCi0gICAgICAgICAgICAgICAgICAgIChjb25maWctPmNoYW5uZWxfbWFzayA9PSBkZXNjLT5tQ2hhbm5lbE1hc2spICYmCisgICAgICAgICAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSBkZXNjLT5tQ2hhbm5lbE1hc2spICYmCiAgICAgICAgICAgICAgICAgICAgIChzZXNzaW9uID09IGRlc2MtPm1EaXJlY3RDbGllbnRTZXNzaW9uKSkgewogICAgICAgICAgICAgICAgICAgICBkZXNjLT5tRGlyZWN0T3BlbkNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dJKCJnZXRPdXRwdXRGb3JEZXZpY2UoKSByZXVzaW5nIGRpcmVjdCBvdXRwdXQgJWQgZm9yIHNlc3Npb24gJWQiLAorICAgICAgICAgICAgICAgICAgICBBTE9HSSgiJXMgcmV1c2luZyBkaXJlY3Qgb3V0cHV0ICVkIGZvciBzZXNzaW9uICVkIiwgX19mdW5jX18sIAogICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dHMua2V5QXQoaSksIHNlc3Npb24pOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbU91dHB1dHMua2V5QXQoaSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtOTg2LDIxICsxMjAzLDM2IEBACiAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0KICAgICAgICAgICAgICAgICBuZXcgU3dBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSwgbXBDbGllbnRJbnRlcmZhY2UpOwogCi0gICAgICAgIERldmljZVZlY3RvciBvdXRwdXREZXZpY2VzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7Ci0gICAgICAgIFN0cmluZzggYWRkcmVzcyA9IG91dHB1dERldmljZXMuc2l6ZSgpID4gMCA/IG91dHB1dERldmljZXMuaXRlbUF0KDApLT5tQWRkcmVzcwotICAgICAgICAgICAgICAgIDogU3RyaW5nOCgiIik7CisgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IGdldEZpcnN0RGV2aWNlQWRkcmVzcyhkZXZpY2VzKTsKIAotICAgICAgICBzdGF0dXMgPSBvdXRwdXREZXNjLT5vcGVuKGNvbmZpZywgZGV2aWNlLCBhZGRyZXNzLCBzdHJlYW0sICpmbGFncywgJm91dHB1dCk7CisgICAgICAgIC8vIE1TRCBwYXRjaCBtYXkgYmUgdXNpbmcgdGhlIG9ubHkgb3V0cHV0IHN0cmVhbSB0aGF0IGNhbiBzZXJ2aWNlIHRoaXMgcmVxdWVzdC4gUmVsZWFzZQorICAgICAgICAvLyBNU0QgcGF0Y2ggdG8gcHJpb3JpdGl6ZSB0aGlzIHJlcXVlc3Qgb3ZlciBhbnkgYWN0aXZlIG91dHB1dCBvbiBNU0QuCisgICAgICAgIEF1ZGlvUGF0Y2hDb2xsZWN0aW9uIG1zZFBhdGNoZXMgPSBnZXRNc2RQYXRjaGVzKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbXNkUGF0Y2hlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgY29uc3QgYXV0byYgcGF0Y2ggPSBtc2RQYXRjaGVzW2ldOworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBwYXRjaC0+bVBhdGNoLm51bV9zaW5rczsgKytqKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rID0gJnBhdGNoLT5tUGF0Y2guc2lua3Nbal07CisgICAgICAgICAgICAgICAgaWYgKHNpbmstPnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgKHNpbmstPmV4dC5kZXZpY2UudHlwZSAmIGRldmljZXMudHlwZXMoKSkgIT0gQVVESU9fREVWSUNFX05PTkUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChhZGRyZXNzLmlzRW1wdHkoKSB8fCBzdHJuY21wKHNpbmstPmV4dC5kZXZpY2UuYWRkcmVzcywgYWRkcmVzcy5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTikgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2gtPm1IYW5kbGUsIG1VaWRDYWNoZWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXMgPSBvdXRwdXREZXNjLT5vcGVuKGNvbmZpZywgZGV2aWNlcywgc3RyZWFtLCAqZmxhZ3MsICZvdXRwdXQpOwogCiAgICAgICAgIC8vIG9ubHkgYWNjZXB0IGFuIG91dHB1dCB3aXRoIHRoZSByZXF1ZXN0ZWQgcGFyYW1ldGVycwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8CiAgICAgICAgICAgICAoY29uZmlnLT5zYW1wbGVfcmF0ZSAhPSAwICYmIGNvbmZpZy0+c2FtcGxlX3JhdGUgIT0gb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSkgfHwKICAgICAgICAgICAgIChjb25maWctPmZvcm1hdCAhPSBBVURJT19GT1JNQVRfREVGQVVMVCAmJiBjb25maWctPmZvcm1hdCAhPSBvdXRwdXREZXNjLT5tRm9ybWF0KSB8fAotICAgICAgICAgICAgKGNvbmZpZy0+Y2hhbm5lbF9tYXNrICE9IDAgJiYgY29uZmlnLT5jaGFubmVsX21hc2sgIT0gb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrKSkgewotICAgICAgICAgICAgQUxPR1YoImdldE91dHB1dEZvckRldmljZSgpIGZhaWxlZCBvcGVuaW5nIGRpcmVjdCBvdXRwdXQ6IG91dHB1dCAlZCBzYW1wbGUgcmF0ZSAlZCAlZCwiCi0gICAgICAgICAgICAgICAgICAgICJmb3JtYXQgJWQgJWQsIGNoYW5uZWwgbWFzayAlMDR4ICUwNHgiLCBvdXRwdXQsIGNvbmZpZy0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgICAoY2hhbm5lbE1hc2sgIT0gMCAmJiBjaGFubmVsTWFzayAhPSBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2spKSB7CisgICAgICAgICAgICBBTE9HVigiJXMgZmFpbGVkIG9wZW5pbmcgZGlyZWN0IG91dHB1dDogb3V0cHV0ICVkIHNhbXBsZSByYXRlICVkICVkLCIgCisgICAgICAgICAgICAgICAgICAgICJmb3JtYXQgJWQgJWQsIGNoYW5uZWwgbWFzayAlMDR4ICUwNHgiLCBfX2Z1bmNfXywgb3V0cHV0LCBjb25maWctPnNhbXBsZV9yYXRlLAogICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlLCBjb25maWctPmZvcm1hdCwgb3V0cHV0RGVzYy0+bUZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5jaGFubmVsX21hc2ssIG91dHB1dERlc2MtPm1DaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2spOwogICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmNsb3NlKCk7CiAgICAgICAgICAgICB9CkBAIC0xMDExLDE0ICsxMjQzLDEyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgICAgIH0KLSAgICAgICAgb3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPSAwOwotICAgICAgICBvdXRwdXREZXNjLT5tU3RvcFRpbWVbc3RyZWFtXSA9IDA7CiAgICAgICAgIG91dHB1dERlc2MtPm1EaXJlY3RPcGVuQ291bnQgPSAxOwogICAgICAgICBvdXRwdXREZXNjLT5tRGlyZWN0Q2xpZW50U2Vzc2lvbiA9IHNlc3Npb247CiAKICAgICAgICAgYWRkT3V0cHV0KG91dHB1dCwgb3V0cHV0RGVzYyk7CiAgICAgICAgIG1QcmV2aW91c091dHB1dHMgPSBtT3V0cHV0czsKLSAgICAgICAgQUxPR1YoImdldE91dHB1dEZvckRldmljZSgpIHJldHVybnMgbmV3IGRpcmVjdCBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgICAgICBBTE9HVigiJXMgcmV0dXJucyBuZXcgZGlyZWN0IG91dHB1dCAlZCIsIF9fZnVuY19fLCBvdXRwdXQpOwogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CiAgICAgICAgIHJldHVybiBvdXRwdXQ7CiAgICAgfQpAQCAtMTAzOSwxNTkgKzEyNjksMzI3IEBACiAgICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpKSB7CiAgICAgICAgIC8vIGdldCB3aGljaCBvdXRwdXQgaXMgc3VpdGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgc3RyZWFtLiBUaGUgYWN0dWFsCiAgICAgICAgIC8vIHJvdXRpbmcgY2hhbmdlIHdpbGwgaGFwcGVuIHdoZW4gc3RhcnRPdXRwdXQoKSB3aWxsIGJlIGNhbGxlZAotICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKGRldmljZSwgbU91dHB1dHMpOworICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlcyhkZXZpY2VzLCBtT3V0cHV0cyk7CiAKICAgICAgICAgLy8gYXQgdGhpcyBzdGFnZSB3ZSBzaG91bGQgaWdub3JlIHRoZSBESVJFQ1QgZmxhZyBhcyBubyBkaXJlY3Qgb3V0cHV0IGNvdWxkIGJlIGZvdW5kIGVhcmxpZXIKICAgICAgICAgKmZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSgqZmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKLSAgICAgICAgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsICpmbGFncywgY29uZmlnLT5mb3JtYXQpOworICAgICAgICBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywgKmZsYWdzLCBjb25maWctPmZvcm1hdCwgY2hhbm5lbE1hc2ssIGNvbmZpZy0+c2FtcGxlX3JhdGUpOwogICAgIH0KLSAgICBBTE9HV19JRigob3V0cHV0ID09IDApLCAiZ2V0T3V0cHV0Rm9yRGV2aWNlKCkgY291bGQgbm90IGZpbmQgb3V0cHV0IGZvciBzdHJlYW0gJWQsICIKKyAgICBBTE9HV19JRigob3V0cHV0ID09IDApLCAiZ2V0T3V0cHV0Rm9yRGV2aWNlcygpIGNvdWxkIG5vdCBmaW5kIG91dHB1dCBmb3Igc3RyZWFtICVkLCAiCiAgICAgICAgICAgICAic2FtcGxpbmcgcmF0ZSAlZCwgZm9ybWF0ICUjeCwgY2hhbm5lbHMgJSN4LCBmbGFncyAlI3giLAotICAgICAgICAgICAgc3RyZWFtLCBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssICpmbGFncyk7CisgICAgICAgICAgICBzdHJlYW0sIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjaGFubmVsTWFzaywgKmZsYWdzKTsKIAogICAgIHJldHVybiBvdXRwdXQ7CiB9CiAKLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2VsZWN0T3V0cHV0KGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQotewotICAgIC8vIHNlbGVjdCBvbmUgb3V0cHV0IGFtb25nIHNldmVyYWwgdGhhdCBwcm92aWRlIGEgcGF0aCB0byBhIHBhcnRpY3VsYXIgZGV2aWNlIG9yIHNldCBvZgotICAgIC8vIGRldmljZXMgKHRoZSBsaXN0IHdhcyBwcmV2aW91c2x5IGJ1aWxkIGJ5IGdldE91dHB1dHNGb3JEZXZpY2UoKSkuCi0gICAgLy8gVGhlIHByaW9yaXR5IGlzIGFzIGZvbGxvd3M6Ci0gICAgLy8gMTogdGhlIG91dHB1dCB3aXRoIHRoZSBoaWdoZXN0IG51bWJlciBvZiByZXF1ZXN0ZWQgcG9saWN5IGZsYWdzCi0gICAgLy8gMjogdGhlIG91dHB1dCB3aXRoIHRoZSBiaXQgZGVwdGggdGhlIGNsb3Nlc3QgdG8gdGhlIHJlcXVlc3RlZCBvbmUKLSAgICAvLyAzOiB0aGUgcHJpbWFyeSBvdXRwdXQKLSAgICAvLyA0OiB0aGUgZmlyc3Qgb3V0cHV0IGluIHRoZSBsaXN0CitzcDxEZXZpY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1zZEF1ZGlvSW5EZXZpY2UoKSBjb25zdCB7CisgICAgYXV0byBtc2RJbkRldmljZXMgPSBtSHdNb2R1bGVzLmdldEF2YWlsYWJsZURldmljZXNGcm9tTW9kdWxlTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcyk7CisgICAgcmV0dXJuIG1zZEluRGV2aWNlcy5pc0VtcHR5KCk/IG51bGxwdHIgOiBtc2RJbkRldmljZXMuaXRlbUF0KDApOworfQogCi0gICAgaWYgKG91dHB1dHMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgIH0KLSAgICBpZiAob3V0cHV0cy5zaXplKCkgPT0gMSkgewotICAgICAgICByZXR1cm4gb3V0cHV0c1swXTsKLSAgICB9CitEZXZpY2VWZWN0b3IgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRNc2RBdWRpb091dERldmljZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Id01vZHVsZXMuZ2V0QXZhaWxhYmxlRGV2aWNlc0Zyb21Nb2R1bGVOYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKK30KIAotICAgIGludCBtYXhDb21tb25GbGFncyA9IDA7Ci0gICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0Rm9yRmxhZ3MgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRGb3JQcmltYXJ5ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0Rm9yRm9ybWF0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgYXVkaW9fZm9ybWF0X3QgYmVzdEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOwotICAgIGF1ZGlvX2Zvcm1hdF90IGJlc3RGb3JtYXRGb3JGbGFncyA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOwotCi0gICAgZm9yIChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgOiBvdXRwdXRzKSB7Ci0gICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLSAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICAgICAgLy8gaWYgYSB2YWxpZCBmb3JtYXQgaXMgc3BlY2lmaWVkLCBza2lwIG91dHB1dCBpZiBub3QgY29tcGF0aWJsZQotICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfSU5WQUxJRCkgewotICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBvdXRwdXREZXNjLT5tRm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKK2NvbnN0IEF1ZGlvUGF0Y2hDb2xsZWN0aW9uIEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TXNkUGF0Y2hlcygpIGNvbnN0IHsKKyAgICBBdWRpb1BhdGNoQ29sbGVjdGlvbiBtc2RQYXRjaGVzOworICAgIHNwPEh3TW9kdWxlPiBtc2RNb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpOworICAgIGlmIChtc2RNb2R1bGUgIT0gMCkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb1BhdGNoZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGkpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBwYXRjaC0+bVBhdGNoLm51bV9zb3VyY2VzOyArK2opIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSA9ICZwYXRjaC0+bVBhdGNoLnNvdXJjZXNbal07CisgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS0+dHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFICYmCisgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UtPmV4dC5kZXZpY2UuaHdfbW9kdWxlID09IG1zZE1vZHVsZS0+Z2V0SGFuZGxlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNkUGF0Y2hlcy5hZGRBdWRpb1BhdGNoKHBhdGNoLT5tSGFuZGxlLCBwYXRjaCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChBdWRpb1BvcnQ6OmlzQmV0dGVyRm9ybWF0TWF0Y2goCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRm9ybWF0LCBiZXN0Rm9ybWF0LCBmb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dEZvckZvcm1hdCA9IG91dHB1dDsKLSAgICAgICAgICAgICAgICAgICAgYmVzdEZvcm1hdCA9IG91dHB1dERlc2MtPm1Gb3JtYXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgY29tbW9uRmxhZ3MgPSBwb3Bjb3VudChvdXRwdXREZXNjLT5tUHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIGZsYWdzKTsKLSAgICAgICAgICAgIGlmIChjb21tb25GbGFncyA+PSBtYXhDb21tb25GbGFncykgewotICAgICAgICAgICAgICAgIGlmIChjb21tb25GbGFncyA9PSBtYXhDb21tb25GbGFncykgewotICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9JTlZBTElECi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgQXVkaW9Qb3J0Ojppc0JldHRlckZvcm1hdE1hdGNoKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZvcm1hdCwgYmVzdEZvcm1hdEZvckZsYWdzLCBmb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRGb3JGbGFncyA9IG91dHB1dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RGb3JtYXRGb3JGbGFncyA9IG91dHB1dERlc2MtPm1Gb3JtYXQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBvdXRwdXRGb3JGbGFncyA9IG91dHB1dDsKLSAgICAgICAgICAgICAgICAgICAgbWF4Q29tbW9uRmxhZ3MgPSBjb21tb25GbGFnczsKLSAgICAgICAgICAgICAgICAgICAgYmVzdEZvcm1hdEZvckZsYWdzID0gb3V0cHV0RGVzYy0+bUZvcm1hdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR1YoInNlbGVjdE91dHB1dCgpIGNvbW1vbkZsYWdzIGZvciBvdXRwdXQgJWQsICUwNHgiLCBvdXRwdXQsIGNvbW1vbkZsYWdzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkpIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRGb3JQcmltYXJ5ID0gb3V0cHV0OwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotCi0gICAgaWYgKG91dHB1dEZvckZsYWdzICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIHJldHVybiBvdXRwdXRGb3JGbGFnczsKLSAgICB9Ci0gICAgaWYgKG91dHB1dEZvckZvcm1hdCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICByZXR1cm4gb3V0cHV0Rm9yRm9ybWF0OwotICAgIH0KLSAgICBpZiAob3V0cHV0Rm9yUHJpbWFyeSAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICByZXR1cm4gb3V0cHV0Rm9yUHJpbWFyeTsKLSAgICB9Ci0KLSAgICByZXR1cm4gb3V0cHV0c1swXTsKKyAgICByZXR1cm4gbXNkUGF0Y2hlczsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRCZXN0TXNkQXVkaW9Qcm9maWxlRm9yKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZvdXRwdXREZXZpY2UsCisgICAgICAgIGJvb2wgaHdBdlN5bmMsIGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VDb25maWcsIGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rQ29uZmlnKSBjb25zdAogewotICAgIEFMT0dWKCJzdGFydE91dHB1dCgpIG91dHB1dCAlZCwgc3RyZWFtICVkLCBzZXNzaW9uICVkIiwKLSAgICAgICAgICBvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkob3V0cHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJzdGFydE91dHB1dCgpIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBzcDxId01vZHVsZT4gbXNkTW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKTsKKyAgICBpZiAobXNkTW9kdWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgdW5hYmxlIHRvIGdldCBNU0QgbW9kdWxlIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgc3A8SHdNb2R1bGU+IGRldmljZU1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRm9yRGV2aWNlKG91dHB1dERldmljZSwgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgIGlmIChkZXZpY2VNb2R1bGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMoKSB1bmFibGUgdG8gZ2V0IG1vZHVsZSBmb3IgJXMiLCBfX2Z1bmNfXywgb3V0cHV0RGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgY29uc3QgSW5wdXRQcm9maWxlQ29sbGVjdGlvbiAmaW5wdXRQcm9maWxlcyA9IG1zZE1vZHVsZS0+Z2V0SW5wdXRQcm9maWxlcygpOworICAgIGlmIChpbnB1dFByb2ZpbGVzLmlzRW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXMoKSBubyBpbnB1dCBwcm9maWxlcyBmb3IgTVNEIG1vZHVsZSIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGNvbnN0IE91dHB1dFByb2ZpbGVDb2xsZWN0aW9uICZvdXRwdXRQcm9maWxlcyA9IGRldmljZU1vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKTsKKyAgICBpZiAob3V0cHV0UHJvZmlsZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCIlcygpIG5vIG91dHB1dCBwcm9maWxlcyBmb3IgZGV2aWNlICVzIiwgX19mdW5jX18sIG91dHB1dERldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIEF1ZGlvUHJvZmlsZVZlY3RvciBtc2RQcm9maWxlczsKKyAgICAvLyBFYWNoIElPUHJvZmlsZSByZXByZXNlbnRzIGEgTWl4UG9ydCBmcm9tIGF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAorICAgIGZvciAoY29uc3QgYXV0byAmaW5Qcm9maWxlIDogaW5wdXRQcm9maWxlcykgeworICAgICAgICBpZiAoaHdBdlN5bmMgPT0gKChpblByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkMpICE9IDApKSB7CisgICAgICAgICAgICBtc2RQcm9maWxlcy5hcHBlbmRWZWN0b3IoaW5Qcm9maWxlLT5nZXRBdWRpb1Byb2ZpbGVzKCkpOworICAgICAgICB9CisgICAgfQorICAgIEF1ZGlvUHJvZmlsZVZlY3RvciBkZXZpY2VQcm9maWxlczsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJm91dFByb2ZpbGUgOiBvdXRwdXRQcm9maWxlcykgeworICAgICAgICBpZiAoaHdBdlN5bmMgPT0gKChvdXRQcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQykgIT0gMCkpIHsKKyAgICAgICAgICAgIGRldmljZVByb2ZpbGVzLmFwcGVuZFZlY3RvcihvdXRQcm9maWxlLT5nZXRBdWRpb1Byb2ZpbGVzKCkpOworICAgICAgICB9CisgICAgfQorICAgIHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSBiZXN0U2lua0NvbmZpZzsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBtc2RQcm9maWxlcy5maW5kQmVzdE1hdGNoaW5nT3V0cHV0Q29uZmlnKGRldmljZVByb2ZpbGVzLAorICAgICAgICAgICAgY29tcHJlc3NlZEZvcm1hdHNPcmRlciwgc3Vycm91bmRDaGFubmVsTWFza3NPcmRlciwgdHJ1ZSAvKnByZWZlckhpZ2hlclNhbXBsaW5nUmF0ZXMqLywKKyAgICAgICAgICAgICZiZXN0U2lua0NvbmZpZyk7CisgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRCgiJXMoKSBubyBtYXRjaGluZyBwcm9maWxlcyBmb3VuZCBmb3IgZGV2aWNlOiAlcywgaHdBdlN5bmM6ICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgb3V0cHV0RGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIGh3QXZTeW5jKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgc2lua0NvbmZpZy0+c2FtcGxlX3JhdGUgPSBiZXN0U2lua0NvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICBzaW5rQ29uZmlnLT5jaGFubmVsX21hc2sgPSBiZXN0U2lua0NvbmZpZy5jaGFubmVsX21hc2s7CisgICAgc2lua0NvbmZpZy0+Zm9ybWF0ID0gYmVzdFNpbmtDb25maWcuZm9ybWF0OworICAgIC8vIEZvciBlbmNvZGVkIHN0cmVhbXMgZm9yY2UgZGlyZWN0IGZsYWcgdG8gcHJldmVudCBkb3duc3RyZWFtIG1peGluZy4KKyAgICBzaW5rQ29uZmlnLT5mbGFncy5vdXRwdXQgPSBzdGF0aWNfY2FzdDxhdWRpb19vdXRwdXRfZmxhZ3NfdD4oCisgICAgICAgICAgICBzaW5rQ29uZmlnLT5mbGFncy5vdXRwdXQgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgIHNvdXJjZUNvbmZpZy0+c2FtcGxlX3JhdGUgPSBiZXN0U2lua0NvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICAvLyBTcGVjaWZ5IGV4YWN0IGNoYW5uZWwgbWFzayB0byBwcmV2ZW50IGd1ZXNzaW5nIGJ5IGJpdCBjb3VudCBpbiBQYXRjaFBhbmVsLgorICAgIHNvdXJjZUNvbmZpZy0+Y2hhbm5lbF9tYXNrID0gYXVkaW9fY2hhbm5lbF9tYXNrX291dF90b19pbihiZXN0U2lua0NvbmZpZy5jaGFubmVsX21hc2spOworICAgIHNvdXJjZUNvbmZpZy0+Zm9ybWF0ID0gYmVzdFNpbmtDb25maWcuZm9ybWF0OworICAgIC8vIENvcHkgaW5wdXQgc3RyZWFtIGRpcmVjdGx5IHdpdGhvdXQgYW55IHByb2Nlc3NpbmcgKGUuZy4gcmVzYW1wbGluZykuCisgICAgc291cmNlQ29uZmlnLT5mbGFncy5pbnB1dCA9IHN0YXRpY19jYXN0PGF1ZGlvX2lucHV0X2ZsYWdzX3Q+KAorICAgICAgICAgICAgc291cmNlQ29uZmlnLT5mbGFncy5pbnB1dCB8IEFVRElPX0lOUFVUX0ZMQUdfRElSRUNUKTsKKyAgICBpZiAoaHdBdlN5bmMpIHsKKyAgICAgICAgc2lua0NvbmZpZy0+ZmxhZ3Mub3V0cHV0ID0gc3RhdGljX2Nhc3Q8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+KAorICAgICAgICAgICAgICAgIHNpbmtDb25maWctPmZsYWdzLm91dHB1dCB8IEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpOworICAgICAgICBzb3VyY2VDb25maWctPmZsYWdzLmlucHV0ID0gc3RhdGljX2Nhc3Q8YXVkaW9faW5wdXRfZmxhZ3NfdD4oCisgICAgICAgICAgICAgICAgc291cmNlQ29uZmlnLT5mbGFncy5pbnB1dCB8IEFVRElPX0lOUFVUX0ZMQUdfSFdfQVZfU1lOQyk7CisgICAgfQorICAgIGNvbnN0IHVuc2lnbmVkIGludCBjb25maWdfbWFzayA9IEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFIHwKKyAgICAgICAgICAgIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSyB8IEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVCB8IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgIHNpbmtDb25maWctPmNvbmZpZ19tYXNrIHw9IGNvbmZpZ19tYXNrOworICAgIHNvdXJjZUNvbmZpZy0+Y29uZmlnX21hc2sgfD0gY29uZmlnX21hc2s7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitQYXRjaEJ1aWxkZXIgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpidWlsZE1zZFBhdGNoKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZvdXRwdXREZXZpY2UpIGNvbnN0Cit7CisgICAgUGF0Y2hCdWlsZGVyIHBhdGNoQnVpbGRlcjsKKyAgICBwYXRjaEJ1aWxkZXIuYWRkU291cmNlKGdldE1zZEF1ZGlvSW5EZXZpY2UoKSkuYWRkU2luayhvdXRwdXREZXZpY2UpOworICAgIGF1ZGlvX3BvcnRfY29uZmlnIHNvdXJjZUNvbmZpZyA9IHBhdGNoQnVpbGRlci5wYXRjaCgpLT5zb3VyY2VzWzBdOworICAgIGF1ZGlvX3BvcnRfY29uZmlnIHNpbmtDb25maWcgPSBwYXRjaEJ1aWxkZXIucGF0Y2goKS0+c2lua3NbMF07CisgICAgLy8gVE9ETzogRmlndXJlIG91dCB3aGV0aGVyIE1TRCBtb2R1bGUgaGFzIEhXX0FWX1NZTkMgZmxhZyBzZXQgaW4gdGhlIEFQIGNvbmZpZyBmaWxlLgorICAgIC8vIEZvciBub3csIHdlIGp1c3QgZm9yY2VmdWxseSB0cnkgd2l0aCBId0F2U3luYyBmaXJzdC4KKyAgICBzdGF0dXNfdCByZXMgPSBnZXRCZXN0TXNkQXVkaW9Qcm9maWxlRm9yKG91dHB1dERldmljZSwgdHJ1ZSAvKmh3QXZTeW5jKi8sCisgICAgICAgICAgICAmc291cmNlQ29uZmlnLCAmc2lua0NvbmZpZykgPT0gTk9fRVJST1IgPyBOT19FUlJPUiA6CisgICAgICAgICAgICBnZXRCZXN0TXNkQXVkaW9Qcm9maWxlRm9yKAorICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXZpY2UsIGZhbHNlIC8qaHdBdlN5bmMqLywgJnNvdXJjZUNvbmZpZywgJnNpbmtDb25maWcpOworICAgIGlmIChyZXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgLy8gRm91bmQgYSBtYXRjaGluZyBwcm9maWxlIGZvciBlbmNvZGVkIGF1ZGlvLiBSZS1jcmVhdGUgUGF0Y2hCdWlsZGVyIHdpdGggdGhpcyBjb25maWcuCisgICAgICAgIHJldHVybiAoUGF0Y2hCdWlsZGVyKCkpLmFkZFNvdXJjZShzb3VyY2VDb25maWcpLmFkZFNpbmsoc2lua0NvbmZpZyk7CisgICAgfQorICAgIEFMT0dWKCIlcygpIG5vIG1hdGNoaW5nIHByb2ZpbGUgZm91bmQuIEZhbGwgdGhyb3VnaCB0byBkZWZhdWx0IFBDTSBwYXRjaCIKKyAgICAgICAgICAgICIgc3VwcG9ydGluZyBQQ00gZm9ybWF0IGNvbnZlcnNpb24uIiwgX19mdW5jX18pOworICAgIHJldHVybiBwYXRjaEJ1aWxkZXI7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0TXNkUGF0Y2goY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJm91dHB1dERldmljZSkgeworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IG91dHB1dERldmljZTsKKyAgICBpZiAoZGV2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gVXNlIG1lZGlhIHN0cmF0ZWd5IGZvciB1bnNwZWNpZmllZCBvdXRwdXQgZGV2aWNlLiBUaGlzIHNob3VsZCBvbmx5CisgICAgICAgIC8vIG9jY3VyIG9uIGNoZWNrRm9yRGV2aWNlQW5kT3V0cHV0Q2hhbmdlcygpLiBEZXZpY2UgY29ubmVjdGlvbiBldmVudHMgbWF5CisgICAgICAgIC8vIHRoZXJlZm9yZSBpbnZhbGlkYXRlIGV4cGxpY2l0IHJvdXRpbmcgcmVxdWVzdHMuCisgICAgICAgIERldmljZVZlY3RvciBkZXZpY2VzID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoCisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfTUVESUEpLCBudWxscHRyLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihkZXZpY2VzLmlzRW1wdHkoKSwgIm5vIG91dHB1ZGV2aWNlIHRvIHNldCBNc2QgUGF0Y2giKTsKKyAgICAgICAgZGV2aWNlID0gZGV2aWNlcy5pdGVtQXQoMCk7CisgICAgfQorICAgIEFMT0dWKCIlcygpIGZvciBkZXZpY2UgJXMiLCBfX2Z1bmNfXywgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgIFBhdGNoQnVpbGRlciBwYXRjaEJ1aWxkZXIgPSBidWlsZE1zZFBhdGNoKGRldmljZSk7CisgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoKiBwYXRjaCA9IHBhdGNoQnVpbGRlci5wYXRjaCgpOworICAgIGNvbnN0IEF1ZGlvUGF0Y2hDb2xsZWN0aW9uIG1zZFBhdGNoZXMgPSBnZXRNc2RQYXRjaGVzKCk7CisgICAgaWYgKCFtc2RQYXRjaGVzLmlzRW1wdHkoKSkgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1zZFBhdGNoZXMuc2l6ZSgpID4gMSwKKyAgICAgICAgICAgICAgICAiVGhlIGN1cnJlbnQgTVNEIHByb3RvdHlwZSBvbmx5IHN1cHBvcnRzIG9uZSBvdXRwdXQgcGF0Y2giKTsKKyAgICAgICAgc3A8QXVkaW9QYXRjaD4gY3VycmVudFBhdGNoID0gbXNkUGF0Y2hlcy52YWx1ZUF0KDApOworICAgICAgICBpZiAoYXVkaW9fcGF0Y2hlc19hcmVfZXF1YWwoJmN1cnJlbnRQYXRjaC0+bVBhdGNoLCBwYXRjaCkpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICByZWxlYXNlQXVkaW9QYXRjaChjdXJyZW50UGF0Y2gtPm1IYW5kbGUsIG1VaWRDYWNoZWQpOworICAgIH0KKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnN0YWxsUGF0Y2goX19mdW5jX18sIC0xIC8qaW5kZXgqLywgbnVsbHB0ciAvKnBhdGNoSGFuZGxlKi8sCisgICAgICAgICAgICBwYXRjaCwgMCAvKmRlbGF5TXMqLywgbVVpZENhY2hlZCwgbnVsbHB0ciAvKnBhdGNoRGVzY1B0ciovKTsKKyAgICBBTE9HRV9JRihzdGF0dXMgIT0gTk9fRVJST1IsICIlcygpIGVycm9yICVkIGNyZWF0aW5nIE1TRCBhdWRpbyBwYXRjaCIsIF9fZnVuY19fLCBzdGF0dXMpOworICAgIEFMT0dJX0lGKHN0YXR1cyA9PSBOT19FUlJPUiwgIiVzKCkgUGF0Y2ggY3JlYXRlZCBmcm9tIE1TRF9JTiB0byAiCisgICAgICAgICAgICJkZXZpY2U6JXMgKGZvcm1hdDolI3ggY2hhbm5lbHM6JSN4IHNhbXBsZXJhdGU6JWQpIiwgX19mdW5jX18sCisgICAgICAgICAgICAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIHBhdGNoLT5zb3VyY2VzWzBdLmZvcm1hdCwKKyAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5jaGFubmVsX21hc2ssIHBhdGNoLT5zb3VyY2VzWzBdLnNhbXBsZV9yYXRlKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNlbGVjdE91dHB1dChjb25zdCBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUpCit7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRighKGZvcm1hdCA9PSBBVURJT19GT1JNQVRfSU5WQUxJRCB8fCBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpLAorICAgICAgICAiJXMgY2FsbGVkIHdpdGggZm9ybWF0ICUjeCIsIF9fZnVuY19fLCBmb3JtYXQpOworCisgICAgLy8gRmxhZ3MgZGlzcXVhbGlmeWluZyBhbiBvdXRwdXQ6IHRoZSBtYXRjaCBtdXN0IGhhcHBlbiBiZWZvcmUgY2FsbGluZyBzZWxlY3RPdXRwdXQoKQorICAgIHN0YXRpYyBjb25zdCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBrRXhjbHVkZWRGbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkKKyAgICAgICAgKEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMgfCBBVURJT19PVVRQVVRfRkxBR19NTUFQX05PSVJRIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKworICAgIC8vIEZsYWdzIGV4cHJlc3NpbmcgYSBmdW5jdGlvbmFsIHJlcXVlc3Q6IG11c3QgYmUgaG9ub3JlZCBpbiBwcmlvcml0eSBvdmVyCisgICAgLy8gb3RoZXIgY3JpdGVyaWEKKyAgICBzdGF0aWMgY29uc3QgYXVkaW9fb3V0cHV0X2ZsYWdzX3Qga0Z1bmN0aW9uYWxGbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkKKyAgICAgICAgKEFVRElPX09VVFBVVF9GTEFHX1ZPSVBfUlggfCBBVURJT19PVVRQVVRfRkxBR19JTkNBTExfTVVTSUMgfAorICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfVFRTIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUX1BDTSk7CisgICAgLy8gRmxhZ3MgZXhwcmVzc2luZyBhIHBlcmZvcm1hbmNlIHJlcXVlc3Q6IGhhdmUgbG93ZXIgcHJpb3JpdHkgdGhhbiBzZXJ2aW5nCisgICAgLy8gcmVxdWVzdGVkIHNhbXBsaW5nIHJhdGUgb3IgY2hhbm5lbCBtYXNrCisgICAgc3RhdGljIGNvbnN0IGF1ZGlvX291dHB1dF9mbGFnc190IGtQZXJmb3JtYW5jZUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KQorICAgICAgICAoQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCB8IEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSIHwKKyAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX1JBVyB8IEFVRElPX09VVFBVVF9GTEFHX1NZTkMpOworCisgICAgY29uc3QgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZnVuY3Rpb25hbEZsYWdzID0KKyAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyAmIGtGdW5jdGlvbmFsRmxhZ3MpOworICAgIGNvbnN0IGF1ZGlvX291dHB1dF9mbGFnc190IHBlcmZvcm1hbmNlRmxhZ3MgPQorICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzICYga1BlcmZvcm1hbmNlRmxhZ3MpOworCisgICAgYXVkaW9faW9faGFuZGxlX3QgYmVzdE91dHB1dCA9IChvdXRwdXRzLnNpemUoKSA9PSAwKSA/IEFVRElPX0lPX0hBTkRMRV9OT05FIDogb3V0cHV0c1swXTsKKworICAgIC8vIHNlbGVjdCBvbmUgb3V0cHV0IGFtb25nIHNldmVyYWwgdGhhdCBwcm92aWRlIGEgcGF0aCB0byBhIHBhcnRpY3VsYXIgZGV2aWNlIG9yIHNldCBvZgorICAgIC8vIGRldmljZXMgKHRoZSBsaXN0IHdhcyBwcmV2aW91c2x5IGJ1aWxkIGJ5IGdldE91dHB1dHNGb3JEZXZpY2VzKCkpLgorICAgIC8vIFRoZSBwcmlvcml0eSBpcyBhcyBmb2xsb3dzOgorICAgIC8vIDE6IHRoZSBvdXRwdXQgc3VwcG9ydGluZyBoYXB0aWMgcGxheWJhY2sgd2hlbiByZXF1ZXN0aW5nIGhhcHRpYyBwbGF5YmFjaworICAgIC8vIDI6IHRoZSBvdXRwdXQgd2l0aCB0aGUgaGlnaGVzdCBudW1iZXIgb2YgcmVxdWVzdGVkIGZ1bmN0aW9uYWwgZmxhZ3MKKyAgICAvLyAzOiB0aGUgb3V0cHV0IHN1cHBvcnRpbmcgdGhlIGV4YWN0IGNoYW5uZWwgbWFzaworICAgIC8vIDQ6IHRoZSBvdXRwdXQgd2l0aCBhIGhpZ2hlciBjaGFubmVsIGNvdW50IHRoYW4gcmVxdWVzdGVkCisgICAgLy8gNTogdGhlIG91dHB1dCB3aXRoIGEgaGlnaGVyIHNhbXBsaW5nIHJhdGUgdGhhbiByZXF1ZXN0ZWQKKyAgICAvLyA2OiB0aGUgb3V0cHV0IHdpdGggdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIHJlcXVlc3RlZCBwZXJmb3JtYW5jZSBmbGFncworICAgIC8vIDc6IHRoZSBvdXRwdXQgd2l0aCB0aGUgYml0IGRlcHRoIHRoZSBjbG9zZXN0IHRvIHRoZSByZXF1ZXN0ZWQgb25lCisgICAgLy8gODogdGhlIHByaW1hcnkgb3V0cHV0CisgICAgLy8gOTogdGhlIGZpcnN0IG91dHB1dCBpbiB0aGUgbGlzdAorCisgICAgLy8gbWF0Y2hpbmcgY3JpdGVyaWEgdmFsdWVzIGluIHByaW9yaXR5IG9yZGVyIGZvciBiZXN0IG1hdGNoaW5nIG91dHB1dCBzbyBmYXIKKyAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gYmVzdE1hdGNoQ3JpdGVyaWEoOCwgMCk7CisKKyAgICBjb25zdCB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOworICAgIGNvbnN0IHVpbnQzMl90IGhhcHRpY0NoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzaygKKyAgICAgICAgY2hhbm5lbE1hc2sgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpOworCisgICAgZm9yIChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgOiBvdXRwdXRzKSB7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKKyAgICAgICAgLy8gbWF0Y2hpbmcgY3JpdGVyaWEgdmFsdWVzIGluIHByaW9yaXR5IG9yZGVyIGZvciBjdXJyZW50IG91dHB1dAorICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gY3VycmVudE1hdGNoQ3JpdGVyaWEoOCwgMCk7CisKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGtFeGNsdWRlZEZsYWdzICYgb3V0cHV0RGVzYy0+bUZsYWdzKSAhPSAwKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIGhhcHRpYyBjaGFubmVsIGlzIHNwZWNpZmllZCwgdXNlIHRoZSBoYXB0aWMgb3V0cHV0IGlmIHByZXNlbnQuCisgICAgICAgIC8vIFdoZW4gdXNpbmcgaGFwdGljIG91dHB1dCwgc2FtZSBhdWRpbyBmb3JtYXQgYW5kIHNhbXBsZSByYXRlIGFyZSByZXF1aXJlZC4KKyAgICAgICAgY29uc3QgdWludDMyX3Qgb3V0cHV0SGFwdGljQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKAorICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKTsKKyAgICAgICAgaWYgKChoYXB0aWNDaGFubmVsQ291bnQgPT0gMCkgIT0gKG91dHB1dEhhcHRpY0NoYW5uZWxDb3VudCA9PSAwKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG91dHB1dEhhcHRpY0NoYW5uZWxDb3VudCA+PSBoYXB0aWNDaGFubmVsQ291bnQKKyAgICAgICAgICAgICYmIGZvcm1hdCA9PSBvdXRwdXREZXNjLT5tRm9ybWF0CisgICAgICAgICAgICAmJiBzYW1wbGluZ1JhdGUgPT0gb3V0cHV0RGVzYy0+bVNhbXBsaW5nUmF0ZSkgeworICAgICAgICAgICAgICAgIGN1cnJlbnRNYXRjaENyaXRlcmlhWzBdID0gb3V0cHV0SGFwdGljQ2hhbm5lbENvdW50OworICAgICAgICB9CisKKyAgICAgICAgLy8gZnVuY3Rpb25hbCBmbGFncyBtYXRjaAorICAgICAgICBjdXJyZW50TWF0Y2hDcml0ZXJpYVsxXSA9IHBvcGNvdW50KG91dHB1dERlc2MtPm1GbGFncyAmIGZ1bmN0aW9uYWxGbGFncyk7CisKKyAgICAgICAgLy8gY2hhbm5lbCBtYXNrIGFuZCBjaGFubmVsIGNvdW50IG1hdGNoCisgICAgICAgIHVpbnQzMl90IG91dHB1dENoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2spOworICAgICAgICBpZiAoY2hhbm5lbE1hc2sgIT0gQVVESU9fQ0hBTk5FTF9OT05FICYmIGNoYW5uZWxDb3VudCA+IDIgJiYKKyAgICAgICAgICAgIGNoYW5uZWxDb3VudCA8PSBvdXRwdXRDaGFubmVsQ291bnQpIHsKKyAgICAgICAgICAgIGlmICgoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9yZXByZXNlbnRhdGlvbihjaGFubmVsTWFzaykgPT0KKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9yZXByZXNlbnRhdGlvbihvdXRwdXREZXNjLT5tQ2hhbm5lbE1hc2spKSAmJgorICAgICAgICAgICAgICAgICAgICAoKGNoYW5uZWxNYXNrICYgb3V0cHV0RGVzYy0+bUNoYW5uZWxNYXNrKSA9PSBjaGFubmVsTWFzaykpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50TWF0Y2hDcml0ZXJpYVsyXSA9IG91dHB1dENoYW5uZWxDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1cnJlbnRNYXRjaENyaXRlcmlhWzNdID0gb3V0cHV0Q2hhbm5lbENvdW50OworICAgICAgICB9CisKKyAgICAgICAgLy8gc2FtcGxpbmcgcmF0ZSBtYXRjaAorICAgICAgICBpZiAoc2FtcGxpbmdSYXRlID4gU0FNUExFX1JBVEVfSFpfREVGQVVMVCAmJgorICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSA8PSBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlKSB7CisgICAgICAgICAgICBjdXJyZW50TWF0Y2hDcml0ZXJpYVs0XSA9IG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGU7CisgICAgICAgIH0KKworICAgICAgICAvLyBwZXJmb3JtYW5jZSBmbGFncyBtYXRjaAorICAgICAgICBjdXJyZW50TWF0Y2hDcml0ZXJpYVs1XSA9IHBvcGNvdW50KG91dHB1dERlc2MtPm1GbGFncyAmIHBlcmZvcm1hbmNlRmxhZ3MpOworCisgICAgICAgIC8vIGZvcm1hdCBtYXRjaAorICAgICAgICBpZiAoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9JTlZBTElEKSB7CisgICAgICAgICAgICBjdXJyZW50TWF0Y2hDcml0ZXJpYVs2XSA9CisgICAgICAgICAgICAgICAgQXVkaW9Qb3J0OjprRm9ybWF0RGlzdGFuY2VNYXggLQorICAgICAgICAgICAgICAgIEF1ZGlvUG9ydDo6Zm9ybWF0RGlzdGFuY2UoZm9ybWF0LCBvdXRwdXREZXNjLT5tRm9ybWF0KTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHByaW1hcnkgb3V0cHV0IG1hdGNoCisgICAgICAgIGN1cnJlbnRNYXRjaENyaXRlcmlhWzddID0gb3V0cHV0RGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWTsKKworICAgICAgICAvLyBjb21wYXJlIG1hdGNoIGNyaXRlcmlhIGJ5IHByaW9yaXR5IHRoZW4gdmFsdWUKKyAgICAgICAgaWYgKHN0ZDo6bGV4aWNvZ3JhcGhpY2FsX2NvbXBhcmUoYmVzdE1hdGNoQ3JpdGVyaWEuYmVnaW4oKSwgYmVzdE1hdGNoQ3JpdGVyaWEuZW5kKCksCisgICAgICAgICAgICAgICAgY3VycmVudE1hdGNoQ3JpdGVyaWEuYmVnaW4oKSwgY3VycmVudE1hdGNoQ3JpdGVyaWEuZW5kKCkpKSB7CisgICAgICAgICAgICBiZXN0TWF0Y2hDcml0ZXJpYSA9IGN1cnJlbnRNYXRjaENyaXRlcmlhOworICAgICAgICAgICAgYmVzdE91dHB1dCA9IG91dHB1dDsKKworICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gcmVzdWx0OworICAgICAgICAgICAgc3RkOjpjb3B5KGJlc3RNYXRjaENyaXRlcmlhLmJlZ2luKCksIGJlc3RNYXRjaENyaXRlcmlhLmVuZCgpLAorICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbV9pdGVyYXRvcjxpbnQ+KHJlc3VsdCwgIiAiKSk7CisgICAgICAgICAgICBBTE9HVigiJXMgbmV3IGJlc3RPdXRwdXQgJWQgY3JpdGVyaWEgJXMiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBiZXN0T3V0cHV0LCByZXN1bHQuc3RyKCkuY19zdHIoKSk7CisgICAgICAgIH0KICAgICB9CiAKLSAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaW5kZXgpOworICAgIHJldHVybiBiZXN0T3V0cHV0OworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQoreworICAgIEFMT0dWKCIlcyBwb3J0SWQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CisKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLmdldE91dHB1dEZvckNsaWVudChwb3J0SWQpOworICAgIGlmIChvdXRwdXREZXNjID09IDApIHsKKyAgICAgICAgQUxPR1coInN0YXJ0T3V0cHV0KCkgbm8gb3V0cHV0IGZvciBjbGllbnQgJWQiLCBwb3J0SWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+IGNsaWVudCA9IG91dHB1dERlc2MtPmdldENsaWVudChwb3J0SWQpOworCisgICAgQUxPR1YoInN0YXJ0T3V0cHV0KCkgb3V0cHV0ICVkLCBzdHJlYW0gJWQsIHNlc3Npb24gJWQiLAorICAgICAgICAgIG91dHB1dERlc2MtPm1Jb0hhbmRsZSwgY2xpZW50LT5zdHJlYW0oKSwgY2xpZW50LT5zZXNzaW9uKCkpOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3V0cHV0RGVzYy0+c3RhcnQoKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCi0gICAgLy8gUm91dGluZz8KLSAgICBtT3V0cHV0Um91dGVzLmluY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7Ci0KLSAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlOwotICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSBvdXRwdXREZXNjLT5tUG9saWN5TWl4LnByb21vdGUoKTsKLSAgICBjb25zdCBjaGFyICphZGRyZXNzID0gTlVMTDsKLSAgICBpZiAocG9saWN5TWl4ICE9IE5VTEwpIHsKLSAgICAgICAgYWRkcmVzcyA9IHBvbGljeU1peC0+bURldmljZUFkZHJlc3Muc3RyaW5nKCk7Ci0gICAgICAgIGlmICgocG9saWN5TWl4LT5tUm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX1JFTkRFUikgPT0gTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSB7Ci0gICAgICAgICAgICBuZXdEZXZpY2UgPSBwb2xpY3lNaXgtPm1EZXZpY2VUeXBlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmV3RGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYOwotICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtT3V0cHV0Um91dGVzLmdldEFuZENsZWFyUm91dGVDaGFuZ2VkKHNlc3Npb24pKSB7Ci0gICAgICAgIG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShvdXRwdXREZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgaWYgKG5ld0RldmljZSAhPSBvdXRwdXREZXNjLT5kZXZpY2UoKSkgewotICAgICAgICAgICAgY2hlY2tTdHJhdGVneVJvdXRlKGdldFN0cmF0ZWd5KHN0cmVhbSksIG91dHB1dCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBuZXdEZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBkZWxheU1zID0gMDsKLQotICAgIHN0YXR1cyA9IHN0YXJ0U291cmNlKG91dHB1dERlc2MsIHN0cmVhbSwgbmV3RGV2aWNlLCBhZGRyZXNzLCAmZGVsYXlNcyk7CisgICAgdWludDMyX3QgZGVsYXlNczsKKyAgICBzdGF0dXMgPSBzdGFydFNvdXJjZShvdXRwdXREZXNjLCBjbGllbnQsICZkZWxheU1zKTsKIAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgbU91dHB1dFJvdXRlcy5kZWNSb3V0ZUFjdGl2aXR5KHNlc3Npb24pOwogICAgICAgICBvdXRwdXREZXNjLT5zdG9wKCk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQotICAgIC8vIEF1dG9tYXRpY2FsbHkgZW5hYmxlIHRoZSByZW1vdGUgc3VibWl4IGlucHV0IHdoZW4gb3V0cHV0IGlzIHN0YXJ0ZWQgb24gYSByZSByb3V0aW5nIG1peAotICAgIC8vIG9mIHR5cGUgTUlYX1RZUEVfUkVDT1JERVJTCi0gICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKG5ld0RldmljZSkgJiYgcG9saWN5TWl4ICE9IE5VTEwgJiYKLSAgICAgICAgICAgIHBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7Ci0gICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsCi0gICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAicmVtb3RlLXN1Ym1peCIpOwotICAgIH0KLQogICAgIGlmIChkZWxheU1zICE9IDApIHsKICAgICAgICAgdXNsZWVwKGRlbGF5TXMgKiAxMDAwKTsKICAgICB9CkBAIC0xMTk5LDE5ICsxNTk3LDIyIEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydFNvdXJjZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpkZWxheU1zKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydFNvdXJjZShjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmRlbGF5TXMpCiB7CiAgICAgLy8gY2Fubm90IHN0YXJ0IHBsYXliYWNrIG9mIFNUUkVBTV9UVFMgaWYgYW55IG90aGVyIG91dHB1dCBpcyBiZWluZyB1c2VkCiAgICAgdWludDMyX3QgYmVhY29uTXV0ZUxhdGVuY3kgPSAwOwogCiAgICAgKmRlbGF5TXMgPSAwOworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gY2xpZW50LT5zdHJlYW0oKTsKKyAgICBhdXRvIGNsaWVudFZvbFNyYyA9IGNsaWVudC0+dm9sdW1lU291cmNlKCk7CisgICAgYXV0byBjbGllbnRTdHJhdGVneSA9IGNsaWVudC0+c3RyYXRlZ3koKTsKKyAgICBhdXRvIGNsaWVudEF0dHIgPSBjbGllbnQtPmF0dHJpYnV0ZXMoKTsKICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9UVFMpIHsKICAgICAgICAgQUxPR1YoIlx0IGZvdW5kIEJFQUNPTiBzdHJlYW0iKTsKLSAgICAgICAgaWYgKCFtVHRzT3V0cHV0QXZhaWxhYmxlICYmIG1PdXRwdXRzLmlzQW55T3V0cHV0QWN0aXZlKEFVRElPX1NUUkVBTV9UVFMgLypzdHJlYW1Ub0lnbm9yZSovKSkgeworICAgICAgICBpZiAoIW1UdHNPdXRwdXRBdmFpbGFibGUgJiYgbU91dHB1dHMuaXNBbnlPdXRwdXRBY3RpdmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fVFRTKSAvKnNvdXJjZVRvSWdub3JlKi8pKSB7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBiZWFjb25NdXRlTGF0ZW5jeSA9IGhhbmRsZUV2ZW50Rm9yQmVhY29uKFNUQVJUSU5HX0JFQUNPTik7CkBAIC0xMjI2LDYgKzE2MjcsMjMgQEAKICAgICBib29sIGZvcmNlID0gIW91dHB1dERlc2MtPmlzQWN0aXZlKCkgJiYKICAgICAgICAgICAgIChvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpID09IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKTsKIAorICAgIERldmljZVZlY3RvciBkZXZpY2VzOworICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSBvdXRwdXREZXNjLT5tUG9saWN5TWl4LnByb21vdGUoKTsKKyAgICBjb25zdCBjaGFyICphZGRyZXNzID0gTlVMTDsKKyAgICBpZiAocG9saWN5TWl4ICE9IE5VTEwpIHsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZVR5cGU7CisgICAgICAgIGFkZHJlc3MgPSBwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLnN0cmluZygpOworICAgICAgICBpZiAoKHBvbGljeU1peC0+bVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spID09IE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSykgeworICAgICAgICAgICAgbmV3RGV2aWNlVHlwZSA9IEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG5ld0RldmljZVR5cGUgPSBwb2xpY3lNaXgtPm1EZXZpY2VUeXBlOworICAgICAgICB9CisgICAgICAgIHNwIGRldmljZSA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZShuZXdEZXZpY2VUeXBlLCBTdHJpbmc4KGFkZHJlc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgIEFMT0dfQVNTRVJUKGRldmljZSwgIiVzOiBubyBkZXZpY2UgZm91bmQgdD0ldSwgYT0lcyIsIF9fZnVuY19fLCBuZXdEZXZpY2VUeXBlLCBhZGRyZXNzKTsKKyAgICAgICAgZGV2aWNlcy5hZGQoZGV2aWNlKTsKKyAgICB9CisKICAgICAvLyByZXF1aXJlc011dGVDaGVjayBpcyBmYWxzZSB3aGVuIHdlIGNhbiBieXBhc3MgbXV0ZSBzdHJhdGVneS4KICAgICAvLyBJdCBjb3ZlcnMgYSBjb21tb24gY2FzZSB3aGVuIHRoZXJlIGlzIG5vIG1hdGVyaWFsbHkgYWN0aXZlIGF1ZGlvCiAgICAgLy8gYW5kIG11dGluZyB3b3VsZCByZXN1bHQgaW4gdW5uZWNlc3NhcnkgZGVsYXkgYW5kIGRyb3BwZWQgYXVkaW8uCkBAIC0xMjM1LDMxICsxNjUzLDQ0IEBACiAgICAgLy8gaW5jcmVtZW50IHVzYWdlIGNvdW50IGZvciB0aGlzIHN0cmVhbSBvbiB0aGUgcmVxdWVzdGVkIG91dHB1dDoKICAgICAvLyBOT1RFIHRoYXQgdGhlIHVzYWdlIGNvdW50IGlzIHRoZSBzYW1lIGZvciBkdXBsaWNhdGVkIG91dHB1dCBhbmQgaGFyZHdhcmUgb3V0cHV0IHdoaWNoIGlzCiAgICAgLy8gbmVjZXNzYXJ5IGZvciBhIGNvcnJlY3QgY29udHJvbCBvZiBoYXJkd2FyZSBvdXRwdXQgcm91dGluZyBieSBzdGFydE91dHB1dCgpIGFuZCBzdG9wT3V0cHV0KCkKLSAgICBvdXRwdXREZXNjLT5jaGFuZ2VSZWZDb3VudChzdHJlYW0sIDEpOworICAgIG91dHB1dERlc2MtPnNldENsaWVudEFjdGl2ZShjbGllbnQsIHRydWUpOwogCi0gICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fTVVTSUMpIHsKKyAgICBpZiAoY2xpZW50LT5oYXNQcmVmZXJyZWREZXZpY2UodHJ1ZSkpIHsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmNsaWVudHNMaXN0KHRydWUgLyphY3RpdmVPbmx5Ki8pLnNpemUoKSA9PSAxICYmCisgICAgICAgICAgICAgICAgY2xpZW50LT5pc1ByZWZlcnJlZERldmljZUZvckV4Y2x1c2l2ZVVzZSgpKSB7CisgICAgICAgICAgICAvLyBQcmVmZXJyZWQgZGV2aWNlIG1heSBiZSBleGNsdXNpdmUsIHVzZSBvbmx5IGlmIG5vIG90aGVyIGFjdGl2ZSBjbGllbnRzIG9uIHRoaXMgb3V0cHV0CisgICAgICAgICAgICBkZXZpY2VzID0gRGV2aWNlVmVjdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKGNsaWVudC0+cHJlZmVycmVkRGV2aWNlSWQoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGV2aWNlcyA9IGdldE5ld091dHB1dERldmljZXMob3V0cHV0RGVzYywgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZXMgIT0gb3V0cHV0RGVzYy0+ZGV2aWNlcygpKSB7CisgICAgICAgICAgICBjaGVja1N0cmF0ZWd5Um91dGUoY2xpZW50U3RyYXRlZ3ksIG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZm9sbG93c1NhbWVSb3V0aW5nKGNsaWVudEF0dHIsIGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfTUVESUEpKSkgewogICAgICAgICBzZWxlY3RPdXRwdXRGb3JNdXNpY0VmZmVjdHMoKTsKICAgICB9CiAKLSAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPT0gMSB8fCBkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICBpZiAob3V0cHV0RGVzYy0+Z2V0QWN0aXZpdHlDb3VudChjbGllbnRWb2xTcmMpID09IDEgfHwgIWRldmljZXMuaXNFbXB0eSgpKSB7CiAgICAgICAgIC8vIHN0YXJ0aW5nIGFuIG91dHB1dCBiZWluZyByZXJvdXRlZD8KLSAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgZGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICBpZiAoZGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGRldmljZXMgPSBnZXROZXdPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwogICAgICAgICB9Ci0KLSAgICAgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7Ci0gICAgICAgIGJvb2wgc2hvdWxkV2FpdCA9IChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiZWFjb25NdXRlTGF0ZW5jeSA+IDApOworICAgICAgICBib29sIHNob3VsZFdhaXQgPQorICAgICAgICAgICAgKGZvbGxvd3NTYW1lUm91dGluZyhjbGllbnRBdHRyLCBhdHRyaWJ1dGVzX2luaXRpYWxpemVyKEFVRElPX1VTQUdFX0FMQVJNKSkgfHwKKyAgICAgICAgICAgICBmb2xsb3dzU2FtZVJvdXRpbmcoY2xpZW50QXR0ciwgYXR0cmlidXRlc19pbml0aWFsaXplcihBVURJT19VU0FHRV9OT1RJRklDQVRJT04pKSB8fAorICAgICAgICAgICAgIChiZWFjb25NdXRlTGF0ZW5jeSA+IDApKTsKICAgICAgICAgdWludDMyX3Qgd2FpdE1zID0gYmVhY29uTXV0ZUxhdGVuY3k7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CiAgICAgICAgICAgICBpZiAoZGVzYyAhPSBvdXRwdXREZXNjKSB7CiAgICAgICAgICAgICAgICAgLy8gQW4gb3V0cHV0IGhhcyBhIHNoYXJlZCBkZXZpY2UgaWYKICAgICAgICAgICAgICAgICAvLyAtIG1hbmFnZWQgYnkgdGhlIHNhbWUgaHcgbW9kdWxlCiAgICAgICAgICAgICAgICAgLy8gLSBzdXBwb3J0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGRldmljZQogICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgc2hhcmVkRGV2aWNlID0gb3V0cHV0RGVzYy0+c2hhcmVzSHdNb2R1bGVXaXRoKGRlc2MpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpICYgZGV2aWNlKSAhPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICghZGVzYy0+ZmlsdGVyU3VwcG9ydGVkRGV2aWNlcyhkZXZpY2VzKS5pc0VtcHR5KCkpOwogCiAgICAgICAgICAgICAgICAgLy8gZm9yY2UgYSBkZXZpY2UgY2hhbmdlIGlmIGFueSBvdGhlciBvdXRwdXQgaXM6CiAgICAgICAgICAgICAgICAgLy8gLSBtYW5hZ2VkIGJ5IHRoZSBzYW1lIGh3IG1vZHVsZQpAQCAtMTI2OSw3ICsxNzAwLDcgQEAKICAgICAgICAgICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHRoZSBhdWRpbyBIQUwgbXVzdCByZWNlaXZlIHRoZSBuZXcgZGV2aWNlIHNlbGVjdGlvbiBzbyB0aGF0IGl0IGNhbgogICAgICAgICAgICAgICAgIC8vIGNoYW5nZSB0aGUgZGV2aWNlIGN1cnJlbnRseSBzZWxlY3RlZCBieSB0aGUgb3RoZXIgb3V0cHV0LgogICAgICAgICAgICAgICAgIGlmIChzaGFyZWREZXZpY2UgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPmRldmljZSgpICE9IGRldmljZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+ZGV2aWNlcygpICE9IGRldmljZXMgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPmdldFBhdGNoSGFuZGxlKCkgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKICAgICAgICAgICAgICAgICAgICAgZm9yY2UgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KQEAgLTEyOTIsMjUgKzE3MjMsMjEgQEAKICAgICAgICAgfQogCiAgICAgICAgIGNvbnN0IHVpbnQzMl90IG11dGVXYWl0TXMgPQotICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXREZXNjLCBkZXZpY2UsIGZvcmNlLCAwLCBOVUxMLCBhZGRyZXNzLCByZXF1aXJlc011dGVDaGVjayk7Ci0KLSAgICAgICAgLy8gaGFuZGxlIHNwZWNpYWwgY2FzZSBmb3Igc29uaWZpY2F0aW9uIHdoaWxlIGluIGNhbGwKLSAgICAgICAgaWYgKGlzSW5DYWxsKCkpIHsKLSAgICAgICAgICAgIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbihzdHJlYW0sIHRydWUsIGZhbHNlKTsKLSAgICAgICAgfQorICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZXMob3V0cHV0RGVzYywgZGV2aWNlcywgZm9yY2UsIDAsIE5VTEwsIHJlcXVpcmVzTXV0ZUNoZWNrKTsKIAogICAgICAgICAvLyBhcHBseSB2b2x1bWUgcnVsZXMgZm9yIGN1cnJlbnQgc3RyZWFtIGFuZCBkZXZpY2UgaWYgbmVjZXNzYXJ5Ci0gICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUN1cnZlcy0+Z2V0Vm9sdW1lSW5kZXgoc3RyZWFtLCBvdXRwdXREZXNjLT5kZXZpY2UoKSksCisgICAgICAgIGF1dG8gJmN1cnZlcyA9IGdldFZvbHVtZUN1cnZlcyhjbGllbnQtPmF0dHJpYnV0ZXMoKSk7CisgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKGN1cnZlcywgY2xpZW50LT52b2x1bWVTb3VyY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY3VydmVzLmdldFZvbHVtZUluZGV4KG91dHB1dERlc2MtPmRldmljZXMoKS50eXBlcygpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+ZGV2aWNlKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5kZXZpY2VzKCkudHlwZXMoKSk7CiAKICAgICAgICAgLy8gdXBkYXRlIHRoZSBvdXRwdXRzIGlmIHN0YXJ0aW5nIGFuIG91dHB1dCB3aXRoIGEgc3RyZWFtIHRoYXQgY2FuIGFmZmVjdCBub3RpZmljYXRpb24KICAgICAgICAgLy8gcm91dGluZwogICAgICAgICBoYW5kbGVOb3RpZmljYXRpb25Sb3V0aW5nRm9yU3RyZWFtKHN0cmVhbSk7CiAKICAgICAgICAgLy8gZm9yY2UgcmVldmFsdWF0aW5nIGFjY2Vzc2liaWxpdHkgcm91dGluZyB3aGVuIHJpbmd0b25lIG9yIGFsYXJtIHN0YXJ0cwotICAgICAgICBpZiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB7CisgICAgICAgIGlmIChmb2xsb3dzU2FtZVJvdXRpbmcoY2xpZW50QXR0ciwgYXR0cmlidXRlc19pbml0aWFsaXplcihBVURJT19VU0FHRV9BTEFSTSkpKSB7CiAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+aW52YWxpZGF0ZVN0cmVhbShBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSk7CiAgICAgICAgIH0KIApAQCAtMTMyOSw1MiArMTc1NiwzOCBAQAogCiAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSAmJgogICAgICAgICAgICAgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpIHsKLSAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX1NPTklGSUNBVElPTiwgdHJ1ZSwgb3V0cHV0RGVzYyk7CisgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShzdHJlYW1Ub1N0cmF0ZWd5KEFVRElPX1NUUkVBTV9BTEFSTSksIHRydWUsIG91dHB1dERlc2MpOworICAgIH0KKworICAgIC8vIEF1dG9tYXRpY2FsbHkgZW5hYmxlIHRoZSByZW1vdGUgc3VibWl4IGlucHV0IHdoZW4gb3V0cHV0IGlzIHN0YXJ0ZWQgb24gYSByZSByb3V0aW5nIG1peAorICAgIC8vIG9mIHR5cGUgTUlYX1RZUEVfUkVDT1JERVJTCisgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGRldmljZXMudHlwZXMoKSkgJiYgcG9saWN5TWl4ICE9IE5VTEwgJiYKKyAgICAgICAgcG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKKyAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbW90ZS1zdWJtaXgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOwogICAgIH0KIAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgQUxPR1YoInN0b3BPdXRwdXQoKSBvdXRwdXQgJWQsIHN0cmVhbSAlZCwgc2Vzc2lvbiAlZCIsIG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dHMuaW5kZXhPZktleShvdXRwdXQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInN0b3BPdXRwdXQoKSB1bmtub3duIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgQUxPR1YoIiVzIHBvcnRJZCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKKworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMuZ2V0T3V0cHV0Rm9yQ2xpZW50KHBvcnRJZCk7CisgICAgaWYgKG91dHB1dERlc2MgPT0gMCkgeworICAgICAgICBBTE9HVygic3RvcE91dHB1dCgpIG5vIG91dHB1dCBmb3IgY2xpZW50ICVkIiwgcG9ydElkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CisgICAgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiBjbGllbnQgPSBvdXRwdXREZXNjLT5nZXRDbGllbnQocG9ydElkKTsKIAotICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpbmRleCk7CisgICAgQUxPR1YoInN0b3BPdXRwdXQoKSBvdXRwdXQgJWQsIHN0cmVhbSAlZCwgc2Vzc2lvbiAlZCIsCisgICAgICAgICAgb3V0cHV0RGVzYy0+bUlvSGFuZGxlLCBjbGllbnQtPnN0cmVhbSgpLCBjbGllbnQtPnNlc3Npb24oKSk7CiAKLSAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPT0gMSkgewotICAgICAgICAvLyBBdXRvbWF0aWNhbGx5IGRpc2FibGUgdGhlIHJlbW90ZSBzdWJtaXggaW5wdXQgd2hlbiBvdXRwdXQgaXMgc3RvcHBlZCBvbiBhCi0gICAgICAgIC8vIHJlIHJvdXRpbmcgbWl4IG9mIHR5cGUgTUlYX1RZUEVfUkVDT1JERVJTCi0gICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSBvdXRwdXREZXNjLT5tUG9saWN5TWl4LnByb21vdGUoKTsKLSAgICAgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKG91dHB1dERlc2MtPm1EZXZpY2UpICYmCi0gICAgICAgICAgICAgICAgcG9saWN5TWl4ICE9IE5VTEwgJiYKLSAgICAgICAgICAgICAgICBwb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUykgewotICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLAotICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICBwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAicmVtb3RlLXN1Ym1peCIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUm91dGluZz8KLSAgICBib29sIGZvcmNlRGV2aWNlVXBkYXRlID0gZmFsc2U7Ci0gICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID4gMCkgewotICAgICAgICBpbnQgYWN0aXZpdHlDb3VudCA9IG1PdXRwdXRSb3V0ZXMuZGVjUm91dGVBY3Rpdml0eShzZXNzaW9uKTsKLSAgICAgICAgZm9yY2VEZXZpY2VVcGRhdGUgPSAobU91dHB1dFJvdXRlcy5oYXNSb3V0ZShzZXNzaW9uKSAmJiAoYWN0aXZpdHlDb3VudCA9PSAwKSk7Ci0KLSAgICAgICAgaWYgKGZvcmNlRGV2aWNlVXBkYXRlKSB7Ci0gICAgICAgICAgICBjaGVja1N0cmF0ZWd5Um91dGUoZ2V0U3RyYXRlZ3koc3RyZWFtKSwgQVVESU9fSU9fSEFORExFX05PTkUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RvcFNvdXJjZShvdXRwdXREZXNjLCBzdHJlYW0sIGZvcmNlRGV2aWNlVXBkYXRlKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdG9wU291cmNlKG91dHB1dERlc2MsIGNsaWVudCk7CiAKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICkgewogICAgICAgICBvdXRwdXREZXNjLT5zdG9wKCk7CkBAIC0xMzgyLDUyICsxNzk1LDY2IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdG9wU291cmNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlRGV2aWNlVXBkYXRlKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdG9wU291cmNlKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQpCiB7CiAgICAgLy8gYWx3YXlzIGhhbmRsZSBzdHJlYW0gc3RvcCwgY2hlY2sgd2hpY2ggc3RyZWFtIHR5cGUgaXMgc3RvcHBpbmcKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IGNsaWVudC0+c3RyZWFtKCk7CisgICAgYXV0byBjbGllbnRWb2xTcmMgPSBjbGllbnQtPnZvbHVtZVNvdXJjZSgpOworCiAgICAgaGFuZGxlRXZlbnRGb3JCZWFjb24oc3RyZWFtID09IEFVRElPX1NUUkVBTV9UVFMgPyBTVE9QUElOR19CRUFDT04gOiBTVE9QUElOR19PVVRQVVQpOwogCi0gICAgLy8gaGFuZGxlIHNwZWNpYWwgY2FzZSBmb3Igc29uaWZpY2F0aW9uIHdoaWxlIGluIGNhbGwKLSAgICBpZiAoaXNJbkNhbGwoKSkgewotICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oc3RyZWFtLCBmYWxzZSwgZmFsc2UpOwotICAgIH0KKyAgICBpZiAob3V0cHV0RGVzYy0+Z2V0QWN0aXZpdHlDb3VudChjbGllbnRWb2xTcmMpID4gMCkgeworICAgICAgICBpZiAob3V0cHV0RGVzYy0+Z2V0QWN0aXZpdHlDb3VudChjbGllbnRWb2xTcmMpID09IDEpIHsKKyAgICAgICAgICAgIC8vIEF1dG9tYXRpY2FsbHkgZGlzYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBpbnB1dCB3aGVuIG91dHB1dCBpcyBzdG9wcGVkIG9uIGEKKyAgICAgICAgICAgIC8vIHJlIHJvdXRpbmcgbWl4IG9mIHR5cGUgTUlYX1RZUEVfUkVDT1JERVJTCisgICAgICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4ID0gb3V0cHV0RGVzYy0+bVBvbGljeU1peC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2Uob3V0cHV0RGVzYy0+ZGV2aWNlcygpLnR5cGVzKCkpICYmCisgICAgICAgICAgICAgICAgcG9saWN5TWl4ICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICBwb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUykgeworICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbW90ZS1zdWJtaXgiLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBmb3JjZURldmljZVVwZGF0ZSA9IGZhbHNlOworICAgICAgICBpZiAoY2xpZW50LT5oYXNQcmVmZXJyZWREZXZpY2UodHJ1ZSkpIHsKKyAgICAgICAgICAgIGNoZWNrU3RyYXRlZ3lSb3V0ZShjbGllbnQtPnN0cmF0ZWd5KCksIEFVRElPX0lPX0hBTkRMRV9OT05FKTsKKyAgICAgICAgICAgIGZvcmNlRGV2aWNlVXBkYXRlID0gdHJ1ZTsKKyAgICAgICAgfQogCi0gICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID4gMCkgewogICAgICAgICAvLyBkZWNyZW1lbnQgdXNhZ2UgY291bnQgb2YgdGhpcyBzdHJlYW0gb24gdGhlIG91dHB1dAotICAgICAgICBvdXRwdXREZXNjLT5jaGFuZ2VSZWZDb3VudChzdHJlYW0sIC0xKTsKKyAgICAgICAgb3V0cHV0RGVzYy0+c2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgZmFsc2UpOwogCiAgICAgICAgIC8vIHN0b3JlIHRpbWUgYXQgd2hpY2ggdGhlIHN0cmVhbSB3YXMgc3RvcHBlZCAtIHNlZSBpc1N0cmVhbUFjdGl2ZSgpCi0gICAgICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA9PSAwIHx8IGZvcmNlRGV2aWNlVXBkYXRlKSB7Ci0gICAgICAgICAgICBvdXRwdXREZXNjLT5tU3RvcFRpbWVbc3RyZWFtXSA9IHN5c3RlbVRpbWUoKTsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5nZXRBY3Rpdml0eUNvdW50KGNsaWVudFZvbFNyYykgPT0gMCB8fCBmb3JjZURldmljZVVwZGF0ZSkgeworICAgICAgICAgICAgb3V0cHV0RGVzYy0+c2V0U3RvcFRpbWUoY2xpZW50LCBzeXN0ZW1UaW1lKCkpOworICAgICAgICAgICAgRGV2aWNlVmVjdG9yIG5ld0RldmljZXMgPSBnZXROZXdPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwogICAgICAgICAgICAgLy8gZGVsYXkgdGhlIGRldmljZSBzd2l0Y2ggYnkgdHdpY2UgdGhlIGxhdGVuY3kgYmVjYXVzZSBzdG9wT3V0cHV0KCkgaXMgZXhlY3V0ZWQgd2hlbgogICAgICAgICAgICAgLy8gdGhlIHRyYWNrIHN0b3AoKSBjb21tYW5kIGlzIHJlY2VpdmVkIGFuZCBhdCB0aGF0IHRpbWUgdGhlIGF1ZGlvIHRyYWNrIGJ1ZmZlciBjYW4KICAgICAgICAgICAgIC8vIHN0aWxsIGNvbnRhaW4gZGF0YSB0aGF0IG5lZWRzIHRvIGJlIGRyYWluZWQuIFRoZSBsYXRlbmN5IG9ubHkgY292ZXJzIHRoZSBhdWRpbyBIQUwKICAgICAgICAgICAgIC8vIGFuZCBrZXJuZWwgYnVmZmVycy4gQWxzbyB0aGUgbGF0ZW5jeSBkb2VzIG5vdCBhbHdheXMgaW5jbHVkZSBhZGRpdGlvbmFsIGRlbGF5IGluIHRoZQogICAgICAgICAgICAgLy8gYXVkaW8gcGF0aCAoYXVkaW8gRFNQLCBDT0RFQyAuLi4pCi0gICAgICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgbmV3RGV2aWNlLCBmYWxzZSwgb3V0cHV0RGVzYy0+bGF0ZW5jeSgpKjIpOworICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLCBuZXdEZXZpY2VzLCBmYWxzZSwgb3V0cHV0RGVzYy0+bGF0ZW5jeSgpKjIpOwogCiAgICAgICAgICAgICAvLyBmb3JjZSByZXN0b3JpbmcgdGhlIGRldmljZSBzZWxlY3Rpb24gb24gb3RoZXIgYWN0aXZlIG91dHB1dHMgaWYgaXQgZGlmZmVycyBmcm9tIHRoZQogICAgICAgICAgICAgLy8gb25lIGJlaW5nIHNlbGVjdGVkIGZvciB0aGlzIG91dHB1dAogICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcyA9IG91dHB1dERlc2MtPmxhdGVuY3koKSoyOwogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwogICAgICAgICAgICAgICAgIGlmIChkZXNjICE9IG91dHB1dERlc2MgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPmlzQWN0aXZlKCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPnNoYXJlc0h3TW9kdWxlV2l0aChkZXNjKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKG5ld0RldmljZSAhPSBkZXNjLT5kZXZpY2UoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZTIgPSBnZXROZXdPdXRwdXREZXZpY2UoZGVzYywgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSBkZXNjLT5kZXZpY2UoKSAhPSBuZXdEZXZpY2UyOworICAgICAgICAgICAgICAgICAgICAgICAgKG5ld0RldmljZXMgIT0gZGVzYy0+ZGV2aWNlcygpKSkgeworICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgbmV3RGV2aWNlczIgPSBnZXROZXdPdXRwdXREZXZpY2VzKGRlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gZGVzYy0+ZGV2aWNlcygpICE9IG5ld0RldmljZXMyOwogCi0gICAgICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZShkZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGV2aWNlMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcyk7CisgICAgICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZXMoZGVzYywgbmV3RGV2aWNlczIsIGZvcmNlLCBkZWxheU1zKTsKKwogICAgICAgICAgICAgICAgICAgICAvLyByZS1hcHBseSBkZXZpY2Ugc3BlY2lmaWMgdm9sdW1lIGlmIG5vdCBkb25lIGJ5IHNldE91dHB1dERldmljZSgpCiAgICAgICAgICAgICAgICAgICAgIGlmICghZm9yY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhkZXNjLCBuZXdEZXZpY2UyLCBkZWxheU1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhkZXNjLCBuZXdEZXZpY2VzMi50eXBlcygpLCBkZWxheU1zKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTE0MzcsMTAgKzE4NjQsMTAgQEAKIAogICAgICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFICYmCiAgICAgICAgICAgICAgICAgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpIHsKLSAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9TT05JRklDQVRJT04sIGZhbHNlLCBvdXRwdXREZXNjKTsKKyAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShzdHJlYW1Ub1N0cmF0ZWd5KEFVRElPX1NUUkVBTV9BTEFSTSksIGZhbHNlLCBvdXRwdXREZXNjKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX01VU0lDKSB7CisgICAgICAgIGlmIChmb2xsb3dzU2FtZVJvdXRpbmcoY2xpZW50LT5hdHRyaWJ1dGVzKCksIGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfTUVESUEpKSkgewogICAgICAgICAgICAgc2VsZWN0T3V0cHV0Rm9yTXVzaWNFZmZlY3RzKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtMTQ1MCwzNyArMTg3Nyw0NCBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gX191bnVzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiBfX3VudXNlZCkKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIEFMT0dWKCJyZWxlYXNlT3V0cHV0KCkgJWQiLCBvdXRwdXQpOwotICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0cy5pbmRleE9mS2V5KG91dHB1dCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygicmVsZWFzZU91dHB1dCgpIHJlbGVhc2luZyB1bmtub3duIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgQUxPR1YoIiVzIHBvcnRJZCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKKworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMuZ2V0T3V0cHV0Rm9yQ2xpZW50KHBvcnRJZCk7CisgICAgaWYgKG91dHB1dERlc2MgPT0gMCkgeworICAgICAgICAvLyBJZiBhbiBvdXRwdXQgZGVzY3JpcHRvciBpcyBjbG9zZWQgZHVlIHRvIGEgZGV2aWNlIHJvdXRpbmcgY2hhbmdlLAorICAgICAgICAvLyB0aGVuIHRoZXJlIGFyZSByYWNlIGNvbmRpdGlvbnMgd2l0aCByZWxlYXNlT3V0cHV0IGZyb20gdHJhY2tzCisgICAgICAgIC8vIHRoYXQgbWF5IGJlIGRlc3Ryb3llZCAod2l0aCBubyBQbGF5YmFja1RocmVhZCkgb3IgYSBQbGF5YmFja1RocmVhZAorICAgICAgICAvLyBkZXN0cm95ZWQgc2hvcnRseSB0aGVyZWFmdGVyLgorICAgICAgICAvLworICAgICAgICAvLyBIZXJlIHdlIGp1c3QgbG9nIGEgd2FybmluZywgaW5zdGVhZCBvZiBhIGZhdGFsIGVycm9yLgorICAgICAgICBBTE9HVygicmVsZWFzZU91dHB1dCgpIG5vIG91dHB1dCBmb3IgY2xpZW50ICVkIiwgcG9ydElkKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIC8vIFJvdXRpbmcKLSAgICBtT3V0cHV0Um91dGVzLnJlbW92ZVJvdXRlKHNlc3Npb24pOworICAgIEFMT0dWKCJyZWxlYXNlT3V0cHV0KCkgJWQiLCBvdXRwdXREZXNjLT5tSW9IYW5kbGUpOwogCi0gICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKLSAgICBpZiAoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB7Ci0gICAgICAgIGlmIChkZXNjLT5tRGlyZWN0T3BlbkNvdW50IDw9IDApIHsKKyAgICBpZiAob3V0cHV0RGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5tRGlyZWN0T3BlbkNvdW50IDw9IDApIHsKICAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlT3V0cHV0KCkgaW52YWxpZCBvcGVuIGNvdW50ICVkIGZvciBvdXRwdXQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tRGlyZWN0T3BlbkNvdW50LCBvdXRwdXQpOworICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURpcmVjdE9wZW5Db3VudCwgb3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBpZiAoLS1kZXNjLT5tRGlyZWN0T3BlbkNvdW50ID09IDApIHsKLSAgICAgICAgICAgIGNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgICAgIGlmICgtLW91dHB1dERlc2MtPm1EaXJlY3RPcGVuQ291bnQgPT0gMCkgeworICAgICAgICAgICAgY2xvc2VPdXRwdXQob3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKICAgICAgICAgfQogICAgIH0KKyAgICAvLyBzdG9wT3V0cHV0KCkgbmVlZHMgdG8gYmUgc3VjY2Vzc2Z1bGx5IGNhbGxlZCBiZWZvcmUgcmVsZWFzZU91dHB1dCgpCisgICAgLy8gb3RoZXJ3aXNlIHRoZXJlIG1heSBiZSBpbmFjY3VyYXRlIHN0cmVhbSByZWZlcmVuY2UgY291bnRzLgorICAgIC8vIFRoaXMgaXMgY2hlY2tlZCBpbiBvdXRwdXREZXNjLT5yZW1vdmVDbGllbnQgYmVsb3cuCisgICAgb3V0cHV0RGVzYy0+cmVtb3ZlQ2xpZW50KHBvcnRJZCk7CiB9CiAKLQogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgcmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY29uZmlnLApAQCAtMTQ4OSwyOCArMTkyMywzMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfdHlwZV90ICppbnB1dFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpCiB7Ci0gICAgQUxPR1YoImdldElucHV0Rm9yQXR0cigpIHNvdXJjZSAlZCwgc2FtcGxpbmcgcmF0ZSAlZCwgZm9ybWF0ICUjeCwgY2hhbm5lbCBtYXNrICUjeCwiCi0gICAgICAgICAgICAic2Vzc2lvbiAlZCwgZmxhZ3MgJSN4IiwKLSAgICAgICAgICBhdHRyLT5zb3VyY2UsIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywgc2Vzc2lvbiwgZmxhZ3MpOworICAgIEFMT0dWKCIlcygpIHNvdXJjZSAlZCwgc2FtcGxpbmcgcmF0ZSAlZCwgZm9ybWF0ICUjeCwgY2hhbm5lbCBtYXNrICUjeCwgc2Vzc2lvbiAlZCwgIgorICAgICAgICAgICJmbGFncyAlI3ggYXR0cmlidXRlcz0lcyIsIF9fZnVuY19fLCBhdHRyLT5zb3VyY2UsIGNvbmZpZy0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLCBzZXNzaW9uLCBmbGFncywgdG9TdHJpbmcoKmF0dHIpLmNfc3RyKCkpOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgLy8gaGFuZGxlIGxlZ2FjeSByZW1vdGUgc3VibWl4IGNhc2Ugd2hlcmUgdGhlIGFkZHJlc3Mgd2FzIG5vdCBhbHdheXMgc3BlY2lmaWVkCi0gICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOCgiIik7CiAgICAgYXVkaW9fc291cmNlX3QgaGFsSW5wdXRTb3VyY2U7Ci0gICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UgPSBhdHRyLT5zb3VyY2U7CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSAqYXR0cjsKICAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4OwotICAgIERldmljZVZlY3RvciBpbnB1dERldmljZXM7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlOworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2M7CisgICAgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4gY2xpZW50RGVzYzsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHJlcXVlc3RlZERldmljZUlkID0gKnNlbGVjdGVkRGV2aWNlSWQ7CisgICAgYm9vbCBpc1NvdW5kVHJpZ2dlcjsKIAotICAgIGlmIChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfREVGQVVMVCkgewotICAgICAgICBpbnB1dFNvdXJjZSA9IEFVRElPX1NPVVJDRV9NSUM7CisgICAgLy8gVGhlIHN1cHBsaWVkIHBvcnRJZCBtdXN0IGJlIEFVRElPX1BPUlRfSEFORExFX05PTkUKKyAgICBpZiAoKnBvcnRJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAoYXR0ci0+c291cmNlID09IEFVRElPX1NPVVJDRV9ERUZBVUxUKSB7CisgICAgICAgIGF0dHJpYnV0ZXMuc291cmNlID0gQVVESU9fU09VUkNFX01JQzsKICAgICB9CiAKICAgICAvLyBFeHBsaWNpdCByb3V0aW5nPwotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2M7Ci0gICAgaWYgKCpzZWxlY3RlZERldmljZUlkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKLSAgICAgICAgZGV2aWNlRGVzYyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKCpzZWxlY3RlZERldmljZUlkKTsKLSAgICB9Ci0gICAgbUlucHV0Um91dGVzLmFkZFJvdXRlKHNlc3Npb24sIFNlc3Npb25Sb3V0ZTo6U1RSRUFNX1RZUEVfTkEsIGlucHV0U291cmNlLCBkZXZpY2VEZXNjLCB1aWQpOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGV4cGxpY2l0Um91dGluZ0RldmljZSA9IAorICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoKnNlbGVjdGVkRGV2aWNlSWQpOwogCiAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBtbWFwIGNhcHR1cmU6IGlmIGFuIGlucHV0IElPIGhhbmRsZSBpcyBzcGVjaWZpZWQsIHdlIHJldXNlIHRoaXMgaW5wdXQgaWYKICAgICAvLyBwb3NzaWJsZQpAQCAtMTUyMyw4ICsxOTYxLDggQEAKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgIHNwPEF1ZGlvU2Vzc2lvbj4gYXVkaW9TZXNzaW9uID0gaW5wdXREZXNjLT5nZXRBdWRpb1Nlc3Npb24oc2Vzc2lvbik7Ci0gICAgICAgIGlmIChhdWRpb1Nlc3Npb24gPT0gMCkgeworICAgICAgICBSZWNvcmRDbGllbnRWZWN0b3IgY2xpZW50cyA9IGlucHV0RGVzYy0+Z2V0Q2xpZW50c0ZvclNlc3Npb24oc2Vzc2lvbik7CisgICAgICAgIGlmIChjbGllbnRzLnNpemUoKSA9PSAwKSB7CiAgICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JBdHRyKCkgdW5rbm93biBzZXNzaW9uICVkIG9uIGlucHV0ICVkIiwgc2Vzc2lvbiwgKmlucHV0KTsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CkBAIC0xNTMzLDc1ICsxOTcxLDgwIEBACiAgICAgICAgIC8vIFRoZSBzZWNvbmQgY2FsbCBpcyBmb3IgdGhlIGZpcnN0IGFjdGl2ZSBjbGllbnQgYW5kIHNldHMgdGhlIFVJRC4gQW55IGZ1cnRoZXIgY2FsbAogICAgICAgICAvLyBjb3JyZXNwb25kcyB0byBhIG5ldyBjbGllbnQgYW5kIGlzIG9ubHkgcGVybWl0dGVkIGZyb20gdGhlIHNhbWUgVUlELgogICAgICAgICAvLyBJZiB0aGUgZmlyc3QgVUlEIGlzIHNpbGVuY2VkLCBhbGxvdyBhIG5ldyBVSUQgY29ubmVjdGlvbiBhbmQgcmVwbGFjZSB3aXRoIG5ldyBVSUQKLSAgICAgICAgaWYgKGF1ZGlvU2Vzc2lvbi0+b3BlbkNvdW50KCkgPT0gMSkgewotICAgICAgICAgICAgYXVkaW9TZXNzaW9uLT5zZXRVaWQodWlkKTsKLSAgICAgICAgfSBlbHNlIGlmIChhdWRpb1Nlc3Npb24tPnVpZCgpICE9IHVpZCkgewotICAgICAgICAgICAgaWYgKCFhdWRpb1Nlc3Npb24tPmlzU2lsZW5jZWQoKSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJnZXRJbnB1dEZvckF0dHIoKSBiYWQgdWlkICVkIGZvciBzZXNzaW9uICVkIHVpZCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgdWlkLCBzZXNzaW9uLCBhdWRpb1Nlc3Npb24tPnVpZCgpKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBpZiAoY2xpZW50cy5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IGNsaWVudHMpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgY2xpZW50IG1hcCBpcyBvcmRlcmVkIGJ5IGtleSB2YWx1ZXMgKHBvcnRJZCkgYW5kIHBvcnRJZHMgYXJlIGFsbG9jYXRlZAorICAgICAgICAgICAgICAgIC8vIGluY3JlbWVudGFseS4gU28gdGhlIGZpcnN0IGNsaWVudCBpbiB0aGlzIGxpc3QgaXMgdGhlIG9uZSBvcGVuZWQgYnkgYXVkaW8gZmxpbmdlcgorICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIG1tYXAgc3RyZWFtIGlzIGNyZWF0ZWQgYW5kIHNob3VsZCBiZSBpZ25vcmVkIGFzIGl0IGRvZXMgbm90IGNvcnJlc3BvbmQKKyAgICAgICAgICAgICAgICAvLyB0byBhbiBhY3R1YWwgY2xpZW50CisgICAgICAgICAgICAgICAgaWYgKGNsaWVudCA9PSAqY2xpZW50cy5jYmVnaW4oKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHVpZCAhPSBjbGllbnQtPnVpZCgpICYmICFjbGllbnQtPmlzU2lsZW5jZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JBdHRyKCkgYmFkIHVpZCAlZCBmb3IgY2xpZW50ICVkIHVpZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCwgY2xpZW50LT5wb3J0SWQoKSwgY2xpZW50LT51aWQoKSk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1ZGlvU2Vzc2lvbi0+c2V0VWlkKHVpZCk7Ci0gICAgICAgICAgICBhdWRpb1Nlc3Npb24tPnNldFNpbGVuY2VkKGZhbHNlKTsKICAgICAgICAgfQotICAgICAgICBhdWRpb1Nlc3Npb24tPmNoYW5nZU9wZW5Db3VudCgxKTsKICAgICAgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9MRUdBQ1k7Ci0gICAgICAgIGlmICgqcG9ydElkID09IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICpwb3J0SWQgPSBBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpOwotICAgICAgICB9Ci0gICAgICAgIGlucHV0RGV2aWNlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGlucHV0RGVzYy0+bURldmljZSk7Ci0gICAgICAgICpzZWxlY3RlZERldmljZUlkID0gaW5wdXREZXZpY2VzLnNpemUoKSA+IDAgPyBpbnB1dERldmljZXMuaXRlbUF0KDApLT5nZXRJZCgpCi0gICAgICAgICAgICAgICAgOiBBVURJT19QT1JUX0hBTkRMRV9OT05FOwotICAgICAgICBBTE9HSSgiJXMgcmV1c2luZyBNTUFQIGlucHV0ICVkIGZvciBzZXNzaW9uICVkIiwgX19GVU5DVElPTl9fLCAqaW5wdXQsIHNlc3Npb24pOworICAgICAgICBkZXZpY2UgPSBpbnB1dERlc2MtPmdldERldmljZSgpOwogCi0gICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgQUxPR0koIiVzIHJldXNpbmcgTU1BUCBpbnB1dCAlZCBmb3Igc2Vzc2lvbiAlZCIsIF9fRlVOQ1RJT05fXywgKmlucHV0LCBzZXNzaW9uKTsKKyAgICAgICAgZ290byBleGl0OwogICAgIH0KIAogICAgICppbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfSU5WQUxJRDsKIAotICAgIGhhbElucHV0U291cmNlID0gaW5wdXRTb3VyY2U7CisgICAgaGFsSW5wdXRTb3VyY2UgPSBhdHRyaWJ1dGVzLnNvdXJjZTsKIAotICAgIC8vIFRPRE86IGNoZWNrIGZvciBleGlzdGluZyBjbGllbnQgZm9yIHRoaXMgcG9ydCBJRAotICAgIGlmICgqcG9ydElkID09IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKLSAgICAgICAgKnBvcnRJZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7Ci0gICAgfQotCi0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZTsKLQotICAgIGlmIChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWCAmJgotICAgICAgICAgICAgc3RybmNtcChhdHRyLT50YWdzLCAiYWRkcj0iLCBzdHJsZW4oImFkZHI9IikpID09IDApIHsKLSAgICAgICAgc3RhdHVzID0gbVBvbGljeU1peGVzLmdldElucHV0TWl4Rm9yQXR0cigqYXR0ciwgJnBvbGljeU1peCk7CisgICAgaWYgKGF0dHJpYnV0ZXMuc291cmNlID09IEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYICYmCisgICAgICAgICAgICBzdHJuY21wKGF0dHJpYnV0ZXMudGFncywgImFkZHI9Iiwgc3RybGVuKCJhZGRyPSIpKSA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IG1Qb2xpY3lNaXhlcy5nZXRJbnB1dE1peEZvckF0dHIoYXR0cmlidXRlcywgJnBvbGljeU1peCk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcyBjb3VsZCBub3QgZmluZCBpbnB1dCBtaXggZm9yIGF0dHIgJXMiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdG9TdHJpbmcoYXR0cmlidXRlcykuY19zdHIoKSk7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9Ci0gICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTUlYX0VYVF9QT0xJQ1lfUkVST1VURTsKLSAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVg7Ci0gICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KGF0dHItPnRhZ3MgKyBzdHJsZW4oImFkZHI9IikpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGlucHV0U291cmNlLCAmcG9saWN5TWl4KTsKLSAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIGNvdWxkIG5vdCBmaW5kIGRldmljZSBmb3Igc291cmNlICVkIiwgaW5wdXRTb3VyY2UpOworICAgICAgICBkZXZpY2UgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZShBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChhdHRyLT50YWdzICsgc3RybGVuKCJhZGRyPSIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICBpZiAoZGV2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcyBjb3VsZCBub3QgZmluZCBpbiBSZW1vdGUgU3VibWl4IGRldmljZSBmb3Igc291cmNlICVkLCB0YWdzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGF0dHJpYnV0ZXMuc291cmNlLCBhdHRyaWJ1dGVzLnRhZ3MpOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQotICAgICAgICBpZiAocG9saWN5TWl4ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGFkZHJlc3MgPSBwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzOwotICAgICAgICAgICAgaWYgKHBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgYW4gZXh0ZXJuYWwgcG9saWN5LCBidXQgdGhpcyBpbnB1dCBpcyBhdHRhY2hlZCB0byBhIG1peCBvZiByZWNvcmRlcnMsCi0gICAgICAgICAgICAgICAgLy8gbWVhbmluZyBpdCByZWNlaXZlcyBhdWRpbyBpbmplY3RlZCBpbnRvIHRoZSBmcmFtZXdvcmssIHNvIHRoZSByZWNvcmRlciBkb2Vzbid0Ci0gICAgICAgICAgICAgICAgLy8ga25vdyBhYm91dCBpdCBhbmQgaXMgdGhlcmVmb3JlIGNvbnNpZGVyZWQgImxlZ2FjeSIKLSAgICAgICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX0xFR0FDWTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVjb3JkaW5nIGEgbWl4IG9mIHBsYXllcnMgZGVmaW5lZCBieSBhbiBleHRlcm5hbCBwb2xpY3ksIHdlJ3JlIHJlcm91dGluZyBmb3IKLSAgICAgICAgICAgICAgICAvLyBhbiBleHRlcm5hbCBwb2xpY3kKLSAgICAgICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX01JWF9FWFRfUE9MSUNZX1JFUk9VVEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UoZGV2aWNlKSkgewotICAgICAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKKworICAgICAgICBpZiAoaXNfbWl4X2xvb3BiYWNrX3JlbmRlcihwb2xpY3lNaXgtPm1Sb3V0ZUZsYWdzKSkgeworICAgICAgICAgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9NSVhfUFVCTElDX0NBUFRVUkVfUExBWUJBQ0s7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX01JWF9FWFRfUE9MSUNZX1JFUk9VVEU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoZXhwbGljaXRSb3V0aW5nRGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGRldmljZSA9IGV4cGxpY2l0Um91dGluZ0RldmljZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFByZXZlbnQgZnJvbSBzdG9yaW5nIGludmFsaWQgcmVxdWVzdGVkIGRldmljZSBpZCBpbiBjbGllbnRzCisgICAgICAgICAgICByZXF1ZXN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgICAgICBkZXZpY2UgPSBtRW5naW5lLT5nZXRJbnB1dERldmljZUZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgJnBvbGljeU1peCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JBdHRyKCkgY291bGQgbm90IGZpbmQgZGV2aWNlIGZvciBzb3VyY2UgJWQiLCBhdHRyaWJ1dGVzLnNvdXJjZSk7CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGlmIChwb2xpY3lNaXgpIHsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKHBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTLCAiSW52YWxpZCBNaXggVHlwZSIpOworICAgICAgICAgICAgLy8gdGhlcmUgaXMgYW4gZXh0ZXJuYWwgcG9saWN5LCBidXQgdGhpcyBpbnB1dCBpcyBhdHRhY2hlZCB0byBhIG1peCBvZiByZWNvcmRlcnMsCisgICAgICAgICAgICAvLyBtZWFuaW5nIGl0IHJlY2VpdmVzIGF1ZGlvIGluamVjdGVkIGludG8gdGhlIGZyYW1ld29yaywgc28gdGhlIHJlY29yZGVyIGRvZXNuJ3QKKyAgICAgICAgICAgIC8vIGtub3cgYWJvdXQgaXQgYW5kIGlzIHRoZXJlZm9yZSBjb25zaWRlcmVkICJsZWdhY3kiCisgICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX0xFR0FDWTsKKyAgICAgICAgfSBlbHNlIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShkZXZpY2UtPnR5cGUoKSkpIHsKICAgICAgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTUlYX0NBUFRVUkU7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgpIHsKKyAgICAgICAgfSBlbHNlIGlmIChkZXZpY2UtPnR5cGUoKSA9PSBBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYKSB7CiAgICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX1RFTEVQSE9OWV9SWDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTEVHQUNZOwpAQCAtMTYwOSw0MyArMjA1Miw0OSBAQAogCiAgICAgfQogCi0gICAgKmlucHV0ID0gZ2V0SW5wdXRGb3JEZXZpY2UoZGV2aWNlLCBhZGRyZXNzLCBzZXNzaW9uLCB1aWQsIGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZywgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5TWl4KTsKKyAgICAqaW5wdXQgPSBnZXRJbnB1dEZvckRldmljZShkZXZpY2UsIHNlc3Npb24sIGF0dHJpYnV0ZXMsIGNvbmZpZywgZmxhZ3MsIHBvbGljeU1peCk7CiAgICAgaWYgKCppbnB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKLSAgICBpbnB1dERldmljZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOwotICAgICpzZWxlY3RlZERldmljZUlkID0gaW5wdXREZXZpY2VzLnNpemUoKSA+IDAgPyBpbnB1dERldmljZXMuaXRlbUF0KDApLT5nZXRJZCgpCi0gICAgICAgICAgICA6IEFVRElPX1BPUlRfSEFORExFX05PTkU7CitleGl0OgogCi0gICAgQUxPR1YoImdldElucHV0Rm9yQXR0cigpIHJldHVybnMgaW5wdXQgJWQgdHlwZSAlZCBzZWxlY3RlZERldmljZUlkICVkIiwKLSAgICAgICAgICAgICppbnB1dCwgKmlucHV0VHlwZSwgKnNlbGVjdGVkRGV2aWNlSWQpOworICAgICpzZWxlY3RlZERldmljZUlkID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5jb250YWlucyhkZXZpY2UpID8KKyAgICAgICAgICAgICAgICBkZXZpY2UtPmdldElkKCkgOiBBVURJT19QT1JUX0hBTkRMRV9OT05FOworCisgICAgaXNTb3VuZFRyaWdnZXIgPSBhdHRyaWJ1dGVzLnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCAmJgorICAgICAgICBtU291bmRUcmlnZ2VyU2Vzc2lvbnMuaW5kZXhPZktleShzZXNzaW9uKSA+PSAwOworICAgICpwb3J0SWQgPSBBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpOworCisgICAgY2xpZW50RGVzYyA9IG5ldyBSZWNvcmRDbGllbnREZXNjcmlwdG9yKCpwb3J0SWQsIHJpaWQsIHVpZCwgc2Vzc2lvbiwgYXR0cmlidXRlcywgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkRGV2aWNlSWQsIGF0dHJpYnV0ZXMuc291cmNlLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTb3VuZFRyaWdnZXIpOworICAgIGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVGb3IoKmlucHV0KTsKKyAgICBpbnB1dERlc2MtPmFkZENsaWVudChjbGllbnREZXNjKTsKKworICAgIEFMT0dWKCJnZXRJbnB1dEZvckF0dHIoKSByZXR1cm5zIGlucHV0ICVkIHR5cGUgJWQgc2VsZWN0ZWREZXZpY2VJZCAlZCBmb3IgcG9ydCBJRCAlZCIsCisgICAgICAgICAgICAqaW5wdXQsICppbnB1dFR5cGUsICpzZWxlY3RlZERldmljZUlkLCAqcG9ydElkKTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKIAogZXJyb3I6Ci0gICAgbUlucHV0Um91dGVzLnJlbW92ZVJvdXRlKHNlc3Npb24pOwogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIAotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRJbnB1dEZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MsCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldElucHV0Rm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9Qb2xpY3lNaXg+ICZwb2xpY3lNaXgpCiB7CiAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICBhdWRpb19zb3VyY2VfdCBoYWxJbnB1dFNvdXJjZSA9IGlucHV0U291cmNlOworICAgIGF1ZGlvX3NvdXJjZV90IGhhbElucHV0U291cmNlID0gYXR0cmlidXRlcy5zb3VyY2U7CiAgICAgYm9vbCBpc1NvdW5kVHJpZ2dlciA9IGZhbHNlOwogCi0gICAgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7CisgICAgaWYgKGF0dHJpYnV0ZXMuc291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7CiAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtU291bmRUcmlnZ2VyU2Vzc2lvbnMuaW5kZXhPZktleShzZXNzaW9uKTsKICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgICAgIGlucHV0ID0gbVNvdW5kVHJpZ2dlclNlc3Npb25zLnZhbHVlRm9yKHNlc3Npb24pOwpAQCAtMTY1NSw3ICsyMTA0LDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGhhbElucHV0U291cmNlID0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OOwogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiAmJgorICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlcy5zb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04gJiYKICAgICAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpKSB7CiAgICAgICAgIGZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fSU5QVVRfRkxBR19WT0lQX1RYKTsKICAgICB9CkBAIC0xNjcwLDggKzIxMTksNyBAQAogICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgcHJvZmlsZUZsYWdzID0gZmxhZ3M7CiAgICAgZm9yICg7OykgewogICAgICAgICBwcm9maWxlRm9ybWF0ID0gY29uZmlnLT5mb3JtYXQ7IC8vIHJlc2V0IGVhY2ggdGltZSB0aHJvdWdoIGxvb3AsIGluIGNhc2UgaXQgaXMgdXBkYXRlZAotICAgICAgICBwcm9maWxlID0gZ2V0SW5wdXRQcm9maWxlKGRldmljZSwgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlU2FtcGxpbmdSYXRlLCBwcm9maWxlRm9ybWF0LCBwcm9maWxlQ2hhbm5lbE1hc2ssCisgICAgICAgIHByb2ZpbGUgPSBnZXRJbnB1dFByb2ZpbGUoZGV2aWNlLCBwcm9maWxlU2FtcGxpbmdSYXRlLCBwcm9maWxlRm9ybWF0LCBwcm9maWxlQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZUZsYWdzKTsKICAgICAgICAgaWYgKHByb2ZpbGUgIT0gMCkgewogICAgICAgICAgICAgYnJlYWs7IC8vIHN1Y2Nlc3MKQEAgLTE2ODAsOSArMjEyOCw5IEBACiAgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZUZsYWdzICE9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSkgewogICAgICAgICAgICAgcHJvZmlsZUZsYWdzID0gQVVESU9fSU5QVVRfRkxBR19OT05FOyAvLyByZXRyeQogICAgICAgICB9IGVsc2UgeyAvLyBmYWlsCi0gICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JEZXZpY2UoKSBjb3VsZCBub3QgZmluZCBwcm9maWxlIGZvciBkZXZpY2UgMHglWCwgIgotICAgICAgICAgICAgICAgICAgInNhbXBsaW5nIHJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWwgbWFzayAweCVYLCBmbGFncyAlI3giLAotICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywgZmxhZ3MpOworICAgICAgICAgICAgQUxPR1coIiVzIGNvdWxkIG5vdCBmaW5kIHByb2ZpbGUgZm9yIGRldmljZSAlcywgc2FtcGxpbmcgcmF0ZSAldSwgZm9ybWF0ICUjeCwgIgorICAgICAgICAgICAgICAgICAgImNoYW5uZWwgbWFzayAweCVYLCBmbGFncyAlI3giLCBfX2Z1bmNfXywgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIAorICAgICAgICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLCBmbGFncyk7CiAgICAgICAgICAgICByZXR1cm4gaW5wdXQ7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNjk3LDg2ICsyMTQ1LDQyIEBACiAgICAgICAgIHJldHVybiBpbnB1dDsKICAgICB9CiAKLSAgICBzcDxBdWRpb1Nlc3Npb24+IGF1ZGlvU2Vzc2lvbiA9IG5ldyBBdWRpb1Nlc3Npb24oc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NvdW5kVHJpZ2dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5TWl4LCBtcENsaWVudEludGVyZmFjZSk7Ci0KLS8vIEZJWE1FOiBkaXNhYmxlIGNvbmN1cnJlbnQgY2FwdHVyZSB1bnRpbCBVSSBpcyByZWFkeQotI2lmIDAKLSAgICAvLyByZXVzZSBhbiBvcGVuIGlucHV0IGlmIHBvc3NpYmxlCi0gICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IHJldXNlZElucHV0RGVzYzsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgIC8vIHJldXNlIGlucHV0IGlmOgotICAgICAgICAvLyAtIGl0IHNoYXJlcyB0aGUgc2FtZSBwcm9maWxlCi0gICAgICAgIC8vICAgICAgQU5ECi0gICAgICAgIC8vIC0gaXQgaXMgbm90IGEgcmVyb3V0ZSBzdWJtaXggaW5wdXQKLSAgICAgICAgLy8gICAgICBBTkQKLSAgICAgICAgLy8gLSBpdCBpczogbm90IHVzZWQgZm9yIHNvdW5kIHRyaWdnZXIKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgT1IKLSAgICAgICAgLy8gICAgICAgICAgdXNlZCBmb3Igc291bmQgdHJpZ2dlciBhbmQgYWxsIGNsaWVudHMgdXNlIHRoZSBzYW1lIHNlc3Npb24gSUQKLSAgICAgICAgLy8KLSAgICAgICAgaWYgKChwcm9maWxlID09IGRlc2MtPm1Qcm9maWxlKSAmJgotICAgICAgICAgICAgKGlzU291bmRUcmlnZ2VyID09IGRlc2MtPmlzU291bmRUcmlnZ2VyKCkpICYmCi0gICAgICAgICAgICAhaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoZGV2aWNlKSkgewotCi0gICAgICAgICAgICBzcDxBdWRpb1Nlc3Npb24+IGFzID0gZGVzYy0+Z2V0QXVkaW9TZXNzaW9uKHNlc3Npb24pOwotICAgICAgICAgICAgaWYgKGFzICE9IDApIHsKLSAgICAgICAgICAgICAgICAvLyBkbyBub3QgYWxsb3cgdW5tYXRjaGluZyBwcm9wZXJ0aWVzIG9uIHNhbWUgc2Vzc2lvbgotICAgICAgICAgICAgICAgIGlmIChhcy0+bWF0Y2hlcyhhdWRpb1Nlc3Npb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzLT5jaGFuZ2VPcGVuQ291bnQoMSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yRGV2aWNlKCkgcmVjb3JkIHdpdGggZGlmZmVyZW50IGF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgZXhpc3RzIGZvciBzZXNzaW9uICVkIiwgc2Vzc2lvbik7CisgICAgaWYgKCFwcm9maWxlLT5jYW5PcGVuTmV3SW8oKSkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyApIHsKKyAgICAgICAgICAgIHNwIDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1JbnB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmIChkZXNjLT5tUHJvZmlsZSAhPSBwcm9maWxlKSB7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gaWYgc291bmQgdHJpZ2dlciwgcmV1c2UgaW5wdXQgaWYgdXNlZCBieSBvdGhlciBzb3VuZCB0cmlnZ2VyIG9uIHNhbWUgc2Vzc2lvbgorICAgICAgICAgICAgLy8gZWxzZQorICAgICAgICAgICAgLy8gICAgcmV1c2UgaW5wdXQgaWYgYWN0aXZlIGNsaWVudCBhcHAgaXMgbm90IGluIElETEUgc3RhdGUKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBSZWNvcmRDbGllbnRWZWN0b3IgY2xpZW50cyA9IGRlc2MtPmNsaWVudHNMaXN0KCk7CisgICAgICAgICAgICBib29sIGRvQ2xvc2UgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogY2xpZW50cykgeworICAgICAgICAgICAgICAgIGlmIChpc1NvdW5kVHJpZ2dlciAhPSBjbGllbnQtPmlzU291bmRUcmlnZ2VyKCkpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChpc1NvdW5kVHJpZ2dlcikgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmIChjbGllbnQtPmlzU291bmRUcmlnZ2VyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gY2xpZW50LT5zZXNzaW9uKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXNjLT5tSW9IYW5kbGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjbGllbnQtPmFjdGl2ZSgpICYmIGNsaWVudC0+YXBwU3RhdGUoKSAhPSBBUFBfU1RBVEVfSURMRSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzYy0+bUlvSGFuZGxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkb0Nsb3NlID0gdHJ1ZTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUmV1c2UgdGhlIGFscmVhZHkgb3BlbmVkIGlucHV0IHN0cmVhbSBvbiB0aGlzIHByb2ZpbGUgaWY6Ci0gICAgICAgICAgICAvLyAtIHRoZSBuZXcgY2FwdHVyZSBzb3VyY2UgaXMgYmFja2dyb3VuZCBPUgotICAgICAgICAgICAgLy8gLSB0aGUgcGF0aCByZXF1ZXN0ZWQgY29uZmlndXJhdGlvbnMgbWF0Y2ggT1IKLSAgICAgICAgICAgIC8vIC0gdGhlIG5ldyBzb3VyY2UgcHJpb3JpdHkgaXMgbGVzcyB0aGFuIHRoZSBoaWdoZXN0IHNvdXJjZSBwcmlvcml0eSBvbiB0aGlzIGlucHV0Ci0gICAgICAgICAgICAvLyBJZiB0aGUgaW5wdXQgc3RyZWFtIGNhbm5vdCBiZSByZXVzZWQsIGNsb3NlIGl0IGJlZm9yZSBvcGVuaW5nIGEgbmV3IHN0cmVhbQotICAgICAgICAgICAgLy8gb24gdGhlIHNhbWUgcHJvZmlsZSBmb3IgdGhlIG5ldyBjbGllbnQgc28gdGhhdCB0aGUgcmVxdWVzdGVkIHBhdGggY29uZmlndXJhdGlvbgotICAgICAgICAgICAgLy8gY2FuIGJlIHNlbGVjdGVkLgotICAgICAgICAgICAgaWYgKCFpc0NvbmN1cnJlbnRTb3VyY2UoaW5wdXRTb3VyY2UpICYmCi0gICAgICAgICAgICAgICAgICAgICgoZGVzYy0+bVNhbXBsaW5nUmF0ZSAhPSBzYW1wbGluZ1JhdGUgfHwKLSAgICAgICAgICAgICAgICAgICAgZGVzYy0+bUNoYW5uZWxNYXNrICE9IGNvbmZpZy0+Y2hhbm5lbF9tYXNrIHx8Ci0gICAgICAgICAgICAgICAgICAgICFhdWRpb19mb3JtYXRzX21hdGNoKGRlc2MtPm1Gb3JtYXQsIGNvbmZpZy0+Zm9ybWF0KSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHNvdXJjZV9wcmlvcml0eShkZXNjLT5nZXRIaWdoZXN0UHJpb3JpdHlTb3VyY2UoZmFsc2UgLyphY3RpdmVPbmx5Ki8pKSA8Ci0gICAgICAgICAgICAgICAgICAgICBzb3VyY2VfcHJpb3JpdHkoaW5wdXRTb3VyY2UpKSkpIHsKLSAgICAgICAgICAgICAgICByZXVzZWRJbnB1dERlc2MgPSBkZXNjOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKGRvQ2xvc2UpIHsKKyAgICAgICAgICAgICAgICBjbG9zZUlucHV0KGRlc2MtPm1Jb0hhbmRsZSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRlc2MtPmFkZEF1ZGlvU2Vzc2lvbihzZXNzaW9uLCBhdWRpb1Nlc3Npb24pOwotICAgICAgICAgICAgICAgIEFMT0dWKCIlczogcmV1c2luZyBpbnB1dCAlZCIsIF9fRlVOQ1RJT05fXywgbUlucHV0cy5rZXlBdChpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1JbnB1dHMua2V5QXQoaSk7CisgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKHJldXNlZElucHV0RGVzYyAhPSAwKSB7Ci0gICAgICAgIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gc2Vzc2lvbnMgPSByZXVzZWRJbnB1dERlc2MtPmdldEF1ZGlvU2Vzc2lvbnMoZmFsc2UgLyphY3RpdmVPbmx5Ki8pOwotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHNlc3Npb25zLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgY3VycmVudFNlc3Npb24gPSBzZXNzaW9ucy5rZXlBdChqKTsKLSAgICAgICAgICAgIHN0b3BJbnB1dChyZXVzZWRJbnB1dERlc2MtPm1Jb0hhbmRsZSwgY3VycmVudFNlc3Npb24pOwotICAgICAgICAgICAgcmVsZWFzZUlucHV0KHJldXNlZElucHV0RGVzYy0+bUlvSGFuZGxlLCBjdXJyZW50U2Vzc2lvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLQotICAgIGlmICghcHJvZmlsZS0+Y2FuT3Blbk5ld0lvKCkpIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgIH0KLQogICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBuZXcgQXVkaW9JbnB1dERlc2NyaXB0b3IocHJvZmlsZSwgbXBDbGllbnRJbnRlcmZhY2UpOwogCiAgICAgYXVkaW9fY29uZmlnX3QgbENvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKQEAgLTE3ODQsMTQgKzIxODgsNyBAQAogICAgIGxDb25maWcuY2hhbm5lbF9tYXNrID0gcHJvZmlsZUNoYW5uZWxNYXNrOwogICAgIGxDb25maWcuZm9ybWF0ID0gcHJvZmlsZUZvcm1hdDsKIAotICAgIGlmIChhZGRyZXNzID09ICIiKSB7Ci0gICAgICAgIERldmljZVZlY3RvciBpbnB1dERldmljZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOwotICAgICAgICAvLyB0aGUgaW5wdXRzIHZlY3RvciBtdXN0IGJlIG9mIHNpemUgPj0gMSwgYnV0IHdlIGRvbid0IHdhbnQgdG8gY3Jhc2ggaGVyZQotICAgICAgICBhZGRyZXNzID0gaW5wdXREZXZpY2VzLnNpemUoKSA+IDAgPyBpbnB1dERldmljZXMuaXRlbUF0KDApLT5tQWRkcmVzcyA6IFN0cmluZzgoIiIpOwotICAgIH0KLQotICAgIHN0YXR1c190IHN0YXR1cyA9IGlucHV0RGVzYy0+b3BlbigmbENvbmZpZywgZGV2aWNlLCBhZGRyZXNzLAotICAgICAgICAgICAgaGFsSW5wdXRTb3VyY2UsIHByb2ZpbGVGbGFncywgJmlucHV0KTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnB1dERlc2MtPm9wZW4oJmxDb25maWcsIGRldmljZSwgaGFsSW5wdXRTb3VyY2UsIHByb2ZpbGVGbGFncywgJmlucHV0KTsKIAogICAgIC8vIG9ubHkgYWNjZXB0IGlucHV0IHdpdGggdGhlIGV4YWN0IHJlcXVlc3RlZCBzZXQgb2YgcGFyYW1ldGVycwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwgaW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUgfHwKQEAgLTE4MDgsNyArMjIwNSw2IEBACiAgICAgfQogCiAgICAgaW5wdXREZXNjLT5tUG9saWN5TWl4ID0gcG9saWN5TWl4OwotICAgIGlucHV0RGVzYy0+YWRkQXVkaW9TZXNzaW9uKHNlc3Npb24sIGF1ZGlvU2Vzc2lvbik7CiAKICAgICBhZGRJbnB1dChpbnB1dCwgaW5wdXREZXNjKTsKICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CkBAIC0xODE2LDQzMCArMjIxMiwyMzEgQEAKICAgICByZXR1cm4gaW5wdXQ7CiB9CiAKLS8vc3RhdGljCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNDb25jdXJyZW50U291cmNlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICByZXR1cm4gKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgfHwKLSAgICAgICAgICAgIChzb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OKSB8fAotICAgICAgICAgICAgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfRk1fVFVORVIpOwotfQorICAgIEFMT0dWKCIlcyBwb3J0SWQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CiAKLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc0NvbmN1cmVudENhcHR1cmVBbGxvd2VkKGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiYgaW5wdXREZXNjLAotICAgICAgICBjb25zdCBzcDxBdWRpb1Nlc3Npb24+JiBhdWRpb1Nlc3Npb24pCi17Ci0gICAgLy8gRG8gbm90IGFsbG93IGNhcHR1cmUgaWYgYW4gYWN0aXZlIHZvaWNlIGNhbGwgaXMgdXNpbmcgYSBzb2Z0d2FyZSBwYXRjaCBhbmQKLSAgICAvLyB0aGUgY2FsbCBUWCBzb3VyY2UgZGV2aWNlIGlzIG9uIHRoZSBzYW1lIEhXIG1vZHVsZS4KLSAgICAvLyBGSVhNRTogd291bGQgYmUgYmV0dGVyIHRvIHJlZmluZSB0byBvbmx5IGlucHV0cyB3aG9zZSBwcm9maWxlIGNvbm5lY3RzIHRvIHRoZQotICAgIC8vIGNhbGwgVFggZGV2aWNlIGJ1dCB0aGlzIGluZm9ybWF0aW9uIGlzIG5vdCBpbiB0aGUgYXVkaW8gcGF0Y2gKLSAgICBpZiAobUNhbGxUeFBhdGNoICE9IDAgJiYKLSAgICAgICAgaW5wdXREZXNjLT5nZXRNb2R1bGVIYW5kbGUoKSA9PSBtQ2FsbFR4UGF0Y2gtPm1QYXRjaC5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBzdGFydGluZyBjb25jdXJyZW50IGNhcHR1cmUgaXMgZW5hYmxlZCBpZjoKLSAgICAvLyAxKSBjYXB0dXJpbmcgZm9yIHJlLXJvdXRpbmcKLSAgICAvLyAyKSBjYXB0dXJpbmcgZm9yIEhPVFdPUkQgc291cmNlCi0gICAgLy8gMykgY2FwdHVyaW5nIGZvciBGTSBUVU5FUiBzb3VyY2UKLSAgICAvLyAzKSBBbGwgb3RoZXIgYWN0aXZlIGNhcHR1cmVzIGFyZSBlaXRoZXIgZm9yIHJlLXJvdXRpbmcgb3IgSE9UV09SRAotCi0gICAgaWYgKGlzX3ZpcnR1YWxfaW5wdXRfZGV2aWNlKGlucHV0RGVzYy0+bURldmljZSkgfHwKLSAgICAgICAgICAgIGlzQ29uY3VycmVudFNvdXJjZShhdWRpb1Nlc3Npb24tPmlucHV0U291cmNlKCkpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGZvciAoY29uc3QgYXV0byYgYWN0aXZlSW5wdXQgOiBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpKSB7Ci0gICAgICAgIGlmICghaXNDb25jdXJyZW50U291cmNlKGFjdGl2ZUlucHV0LT5pbnB1dFNvdXJjZSh0cnVlKSkgJiYKLSAgICAgICAgICAgICAgICAhaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoYWN0aXZlSW5wdXQtPm1EZXZpY2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gRklYTUU6IHJlbW92ZSB3aGVuIGNvbmN1cnJlbnQgY2FwdHVyZSBpcyByZWFkeS4gVGhpcyBpcyBhIGhhY2sgdG8gd29yayBhcm91bmQgYnVnIGIvNjMwODM1MzcuCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6c291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZSgpIHsKLSAgICBpZiAoIW1IYXNDb21wdXRlZFNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmUpIHsKLSAgICAgICAgYm9vbCBzb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlID0gZmFsc2U7Ci0gICAgICAgIHVuc2lnbmVkIGludCBudW1Nb2R1bGVzID0gMDsKLSAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IqIG5Nb2R1bGVzID0gTlVMTDsKLQotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBTb3VuZFRyaWdnZXI6Omxpc3RNb2R1bGVzKG5Nb2R1bGVzLCAmbnVtTW9kdWxlcyk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgbnVtTW9kdWxlcyAhPSAwKSB7Ci0gICAgICAgICAgICBuTW9kdWxlcyA9IChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciopIGNhbGxvYygKLSAgICAgICAgICAgICAgICAgICAgbnVtTW9kdWxlcywgc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yKSk7Ci0gICAgICAgICAgICBpZiAobk1vZHVsZXMgPT0gTlVMTCkgewotICAgICAgICAgICAgICAvLyBXZSBmYWlsZWQgdG8gbWFsbG9jIHRoZSBidWZmZXIsIHNvIGp1c3Qgc2F5IG5vIGZvciBub3csIGFuZCBob3BlIHRoYXQgd2UgaGF2ZSBtb3JlCi0gICAgICAgICAgICAgIC8vIHJhbSB0aGUgbmV4dCB0aW1lIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgotICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciBmb3IgbW9kdWxlIGRlc2NyaXB0b3JzIik7Ci0gICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RhdHVzID0gU291bmRUcmlnZ2VyOjpsaXN0TW9kdWxlcyhuTW9kdWxlcywgJm51bU1vZHVsZXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmUgPSB0cnVlOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtTW9kdWxlczsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmUgJj0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuTW9kdWxlc1tpXS5wcm9wZXJ0aWVzLmNvbmN1cnJlbnRfY2FwdHVyZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmVlKG5Nb2R1bGVzKTsKLSAgICAgICAgfQotICAgICAgICBtU291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZSA9IHNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmU7Ci0gICAgICAgIG1IYXNDb21wdXRlZFNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmUgPSB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gbVNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmU7Ci19Ci0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2lsZW5jZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY3VycmVuY3lfdHlwZV9fbWFza190ICpjb25jdXJyZW5jeSkKLXsKLQotICAgIEFMT0dWKCJBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0SW5wdXQoaW5wdXQ6JWQsIHNlc3Npb246JWQsIHNpbGVuY2VkOiVkLCBjb25jdXJyZW5jeTolZCkiLAotICAgICAgICAgICAgaW5wdXQsIHNlc3Npb24sIHNpbGVuY2VkLCAqY29uY3VycmVuY3kpOwotCi0gICAgKmNvbmN1cnJlbmN5ID0gQVBJX0lOUFVUX0NPTkNVUlJFTkNZX05PTkU7Ci0KLSAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJzdGFydElucHV0KCkgdW5rbm93biBpbnB1dCAlZCIsIGlucHV0KTsKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy5nZXRJbnB1dEZvckNsaWVudChwb3J0SWQpOworICAgIGlmIChpbnB1dERlc2MgPT0gMCkgeworICAgICAgICBBTE9HVygiJXMgbm8gaW5wdXQgZm9yIGNsaWVudCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbmRleCk7Ci0KLSAgICBzcDxBdWRpb1Nlc3Npb24+IGF1ZGlvU2Vzc2lvbiA9IGlucHV0RGVzYy0+Z2V0QXVkaW9TZXNzaW9uKHNlc3Npb24pOwotICAgIGlmIChhdWRpb1Nlc3Npb24gPT0gMCkgewotICAgICAgICBBTE9HVygic3RhcnRJbnB1dCgpIHVua25vd24gc2Vzc2lvbiAlZCBvbiBpbnB1dCAlZCIsIHNlc3Npb24sIGlucHV0KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLS8vIEZJWE1FOiBkaXNhYmxlIGNvbmN1cnJlbnQgY2FwdHVyZSB1bnRpbCBVSSBpcyByZWFkeQotI2lmIDAKLSAgICBpZiAoIWlzQ29uY3VyZW50Q2FwdHVyZUFsbG93ZWQoaW5wdXREZXNjLCBhdWRpb1Nlc3Npb24pKSB7Ci0gICAgICAgIEFMT0dXKCJzdGFydElucHV0KCVkKSBmYWlsZWQ6IG90aGVyIGlucHV0IGFscmVhZHkgc3RhcnRlZCIsIGlucHV0KTsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IGlucHV0RGVzYy0+bUlvSGFuZGxlOworICAgIHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+IGNsaWVudCA9IGlucHV0RGVzYy0+Z2V0Q2xpZW50KHBvcnRJZCk7CisgICAgaWYgKGNsaWVudC0+YWN0aXZlKCkpIHsKKyAgICAgICAgQUxPR1coIiVzIGlucHV0ICVkIGNsaWVudCAlZCBhbHJlYWR5IHN0YXJ0ZWQiLCBfX0ZVTkNUSU9OX18sIGlucHV0LCBjbGllbnQtPnBvcnRJZCgpKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIGlmIChpc0luQ2FsbCgpKSB7Ci0gICAgICAgICpjb25jdXJyZW5jeSB8PSBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FMTDsKKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IGNsaWVudC0+c2Vzc2lvbigpOworCisgICAgQUxPR1YoIiVzIGlucHV0OiVkLCBzZXNzaW9uOiVkKSIsIF9fRlVOQ1RJT05fXywgaW5wdXQsIHNlc3Npb24pOworCisgICAgVmVjdG9yPHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPj4gYWN0aXZlSW5wdXRzID0gbUlucHV0cy5nZXRBY3RpdmVJbnB1dHMoKTsKKworICAgIHN0YXR1c190IHN0YXR1cyA9IGlucHV0RGVzYy0+c3RhcnQoKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQotICAgIGlmIChtSW5wdXRzLmFjdGl2ZUlucHV0c0NvdW50T25EZXZpY2VzKCkgIT0gMCkgewotICAgICAgICAqY29uY3VycmVuY3kgfD0gQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBUFRVUkU7Ci0gICAgfQotI2Vsc2UKLSAgICBpZiAoIWlzX3ZpcnR1YWxfaW5wdXRfZGV2aWNlKGlucHV0RGVzYy0+bURldmljZSkpIHsKLSAgICAgICAgaWYgKG1DYWxsVHhQYXRjaCAhPSAwICYmCi0gICAgICAgICAgICBpbnB1dERlc2MtPmdldE1vZHVsZUhhbmRsZSgpID09IG1DYWxsVHhQYXRjaC0+bVBhdGNoLnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGUpIHsKLSAgICAgICAgICAgIEFMT0dXKCJzdGFydElucHV0KCVkKSBmYWlsZWQ6IGNhbGwgaW4gcHJvZ3Jlc3MiLCBpbnB1dCk7Ci0gICAgICAgICAgICAqY29uY3VycmVuY3kgfD0gQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBTEw7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KIAotICAgICAgICBWZWN0b3I8c3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+PiBhY3RpdmVJbnB1dHMgPSBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpOwotCi0gICAgICAgIC8vIElmIGEgVUlEIGlzIGlkbGUgYW5kIHJlY29yZHMgc2lsZW5jZSBhbmQgYW5vdGhlciBub3Qgc2lsZW5jZWQgcmVjb3JkaW5nIHN0YXJ0cwotICAgICAgICAvLyBmcm9tIGFub3RoZXIgVUlEIChpZGxlIG9yIGFjdGl2ZSkgd2Ugc3RvcCB0aGUgY3VycmVudCBpZGxlIFVJRCByZWNvcmRpbmcgaW4KLSAgICAgICAgLy8gZmF2b3Igb2YgdGhlIG5ldyBvbmUgLSAiVGhlcmUgY2FuIGJlIG9ubHkgb25lIiBUTQotICAgICAgICBpZiAoIXNpbGVuY2VkKSB7Ci0gICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGFjdGl2ZURlc2MgOiBhY3RpdmVJbnB1dHMpIHsKLSAgICAgICAgICAgICAgICBpZiAoKGF1ZGlvU2Vzc2lvbi0+ZmxhZ3MoKSAmIEFVRElPX0lOUFVUX0ZMQUdfTU1BUF9OT0lSUSkgIT0gMCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRGVzYy0+Z2V0SWQoKSA9PSBpbnB1dERlc2MtPmdldElkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gYWN0aXZlU2Vzc2lvbnMgPSBhY3RpdmVEZXNjLT5nZXRBdWRpb1Nlc3Npb25zKAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKmFjdGl2ZU9ubHkqLyk7Ci0gICAgICAgICAgICAgICAgc3A8QXVkaW9TZXNzaW9uPiBhY3RpdmVTZXNzaW9uID0gYWN0aXZlU2Vzc2lvbnMudmFsdWVBdCgwKTsKLSAgICAgICAgICAgICAgICBpZiAoYWN0aXZlU2Vzc2lvbi0+aXNTaWxlbmNlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGFjdGl2ZUlucHV0ID0gYWN0aXZlRGVzYy0+bUlvSGFuZGxlOwotICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgYWN0aXZlU2Vzc2lvbklkID0gYWN0aXZlU2Vzc2lvbi0+c2Vzc2lvbigpOwotICAgICAgICAgICAgICAgICAgICBzdG9wSW5wdXQoYWN0aXZlSW5wdXQsIGFjdGl2ZVNlc3Npb25JZCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlbGVhc2VJbnB1dChhY3RpdmVJbnB1dCwgYWN0aXZlU2Vzc2lvbklkKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoInN0YXJ0SW5wdXQoJWQpIHN0b3BwaW5nIHNpbGVuY2VkIGlucHV0ICVkIiwgaW5wdXQsIGFjdGl2ZUlucHV0KTsKLSAgICAgICAgICAgICAgICAgICAgYWN0aXZlSW5wdXRzID0gbUlucHV0cy5nZXRBY3RpdmVJbnB1dHMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGFjdGl2ZURlc2MgOiBhY3RpdmVJbnB1dHMpIHsKLSAgICAgICAgICAgIGlmICgoYXVkaW9TZXNzaW9uLT5mbGFncygpICYgQVVESU9fSU5QVVRfRkxBR19NTUFQX05PSVJRKSAhPSAwICYmCi0gICAgICAgICAgICAgICAgICAgIGFjdGl2ZURlc2MtPmdldElkKCkgPT0gaW5wdXREZXNjLT5nZXRJZCgpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGFjdGl2ZVNvdXJjZSA9IGFjdGl2ZURlc2MtPmlucHV0U291cmNlKHRydWUpOwotICAgICAgICAgICAgaWYgKGF1ZGlvU2Vzc2lvbi0+aW5wdXRTb3VyY2UoKSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgewotICAgICAgICAgICAgICAgIGlmIChhY3RpdmVTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZURlc2MtPmhhc1ByZWVtcHRlZFNlc3Npb24oc2Vzc2lvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJzdGFydElucHV0KCVkKSBmYWlsZWQgZm9yIEhPVFdPUkQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm90aGVyIGlucHV0ICVkIGFscmVhZHkgc3RhcnRlZCBmb3IgSE9UV09SRCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgYWN0aXZlRGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpjb25jdXJyZW5jeSB8PSBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfSE9UV09SRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzdGFydElucHV0KCVkKSBmYWlsZWQgZm9yIEhPVFdPUkQ6IG90aGVyIGlucHV0ICVkIGFscmVhZHkgc3RhcnRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBhY3RpdmVEZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAqY29uY3VycmVuY3kgfD0gQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBUFRVUkU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChhY3RpdmVTb3VyY2UgIT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coInN0YXJ0SW5wdXQoJWQpIGZhaWxlZDogb3RoZXIgaW5wdXQgJWQgYWxyZWFkeSBzdGFydGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsIGFjdGl2ZURlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgICpjb25jdXJyZW5jeSB8PSBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FQVFVSRTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdlIG9ubHkgbmVlZCB0byBjaGVjayBpZiB0aGUgc291bmQgdHJpZ2dlciBzZXNzaW9uIHN1cHBvcnRzIGNvbmN1cnJlbnQgY2FwdHVyZSBpZiB0aGUKLSAgICAgICAgLy8gaW5wdXQgaXMgYWxzbyBhIHNvdW5kIHRyaWdnZXIgaW5wdXQuIE90aGVyd2lzZSwgd2Ugc2hvdWxkIHByZWVtcHQgYW55IGhvdHdvcmQgc3RyZWFtCi0gICAgICAgIC8vIHRoYXQncyBydW5uaW5nLgotICAgICAgICBjb25zdCBib29sIGFsbG93Q29uY3VycmVudFdpdGhTb3VuZFRyaWdnZXIgPQotICAgICAgICAgICAgaW5wdXREZXNjLT5pc1NvdW5kVHJpZ2dlcigpID8gc291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZSgpIDogZmFsc2U7Ci0KLSAgICAgICAgLy8gaWYgY2FwdHVyZSBpcyBhbGxvd2VkLCBwcmVlbXB0IGN1cnJlbnRseSBhY3RpdmUgSE9UV09SRCBjYXB0dXJlcwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGFjdGl2ZURlc2MgOiBhY3RpdmVJbnB1dHMpIHsKLSAgICAgICAgICAgIGlmIChhbGxvd0NvbmN1cnJlbnRXaXRoU291bmRUcmlnZ2VyICYmIGFjdGl2ZURlc2MtPmlzU291bmRUcmlnZ2VyKCkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgYWN0aXZlU291cmNlID0gYWN0aXZlRGVzYy0+aW5wdXRTb3VyY2UodHJ1ZSk7Ci0gICAgICAgICAgICBpZiAoYWN0aXZlU291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7Ci0gICAgICAgICAgICAgICAgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiBhY3RpdmVTZXNzaW9ucyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVEZXNjLT5nZXRBdWRpb1Nlc3Npb25zKHRydWUgLyphY3RpdmVPbmx5Ki8pOwotICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBhY3RpdmVTZXNzaW9uID0gYWN0aXZlU2Vzc2lvbnMua2V5QXQoMCk7Ci0gICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgYWN0aXZlSGFuZGxlID0gYWN0aXZlRGVzYy0+bUlvSGFuZGxlOwotICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19zZXNzaW9uX3Q+IHNlc3Npb25zID0gYWN0aXZlRGVzYy0+Z2V0UHJlZW1wdGVkU2Vzc2lvbnMoKTsKLSAgICAgICAgICAgICAgICAqY29uY3VycmVuY3kgfD0gQVBJX0lOUFVUX0NPTkNVUlJFTkNZX1BSRUVNUFQ7Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbnMuYWRkKGFjdGl2ZVNlc3Npb24pOwotICAgICAgICAgICAgICAgIGlucHV0RGVzYy0+c2V0UHJlZW1wdGVkU2Vzc2lvbnMoc2Vzc2lvbnMpOwotICAgICAgICAgICAgICAgIHN0b3BJbnB1dChhY3RpdmVIYW5kbGUsIGFjdGl2ZVNlc3Npb24pOwotICAgICAgICAgICAgICAgIHJlbGVhc2VJbnB1dChhY3RpdmVIYW5kbGUsIGFjdGl2ZVNlc3Npb24pOwotICAgICAgICAgICAgICAgIEFMT0dWKCJzdGFydElucHV0KCVkKSBmb3IgSE9UV09SRCBwcmVlbXB0aW5nIEhPVFdPUkQgaW5wdXQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBhY3RpdmVEZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvLyBNYWtlIHN1cmUgd2Ugc3RhcnQgd2l0aCB0aGUgY29ycmVjdCBzaWxlbmNlIHN0YXRlCi0gICAgYXVkaW9TZXNzaW9uLT5zZXRTaWxlbmNlZChzaWxlbmNlZCk7Ci0KLSAgICAvLyBpbmNyZW1lbnQgYWN0aXZpdHkgY291bnQgYmVmb3JlIGNhbGxpbmcgZ2V0TmV3SW5wdXREZXZpY2UoKSBiZWxvdyBhcyBvbmx5IGFjdGl2ZSBzZXNzaW9ucworICAvLyBpbmNyZW1lbnQgYWN0aXZpdHkgY291bnQgYmVmb3JlIGNhbGxpbmcgZ2V0TmV3SW5wdXREZXZpY2UoKSBiZWxvdyBhcyBvbmx5IGFjdGl2ZSBzZXNzaW9ucwogICAgIC8vIGFyZSBjb25zaWRlcmVkIGZvciBkZXZpY2Ugc2VsZWN0aW9uCi0gICAgYXVkaW9TZXNzaW9uLT5jaGFuZ2VBY3RpdmVDb3VudCgxKTsKKyAgICBpbnB1dERlc2MtPnNldENsaWVudEFjdGl2ZShjbGllbnQsIHRydWUpOwogCi0gICAgLy8gUm91dGluZz8KLSAgICBtSW5wdXRSb3V0ZXMuaW5jUm91dGVBY3Rpdml0eShzZXNzaW9uKTsKKyAgICAvLyBpbmRpY2F0ZSBhY3RpdmUgY2FwdHVyZSB0byBzb3VuZCB0cmlnZ2VyIHNlcnZpY2UgaWYgc3RhcnRpbmcgY2FwdHVyZSBmcm9tIGEgbWljIG9uCisgICAgLy8gcHJpbWFyeSBIVyBtb2R1bGUKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPSBnZXROZXdJbnB1dERldmljZShpbnB1dERlc2MpOworICAgIHNldElucHV0RGV2aWNlKGlucHV0LCBkZXZpY2UsIHRydWUgLyogZm9yY2UgKi8pOwogCi0gICAgaWYgKGF1ZGlvU2Vzc2lvbi0+YWN0aXZlQ291bnQoKSA9PSAxIHx8IG1JbnB1dFJvdXRlcy5nZXRBbmRDbGVhclJvdXRlQ2hhbmdlZChzZXNzaW9uKSkgewotICAgICAgICAvLyBpbmRpY2F0ZSBhY3RpdmUgY2FwdHVyZSB0byBzb3VuZCB0cmlnZ2VyIHNlcnZpY2UgaWYgc3RhcnRpbmcgY2FwdHVyZSBmcm9tIGEgbWljIG9uCi0gICAgICAgIC8vIHByaW1hcnkgSFcgbW9kdWxlCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBnZXROZXdJbnB1dERldmljZShpbnB1dERlc2MpOwotICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dCwgZGV2aWNlLCB0cnVlIC8qIGZvcmNlICovKTsKLQotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnB1dERlc2MtPnN0YXJ0KCk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIG1JbnB1dFJvdXRlcy5kZWNSb3V0ZUFjdGl2aXR5KHNlc3Npb24pOwotICAgICAgICAgICAgYXVkaW9TZXNzaW9uLT5jaGFuZ2VBY3RpdmVDb3VudCgtMSk7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIGlmIChpbnB1dERlc2MtPmFjdGl2ZUNvdW50KCkgID09IDEpIHsKKyAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IHBvbGljeU1peCA9IGlucHV0RGVzYy0+bVBvbGljeU1peC5wcm9tb3RlKCk7CisgICAgICAgIC8vIGlmIGlucHV0IG1hcHMgdG8gYSBkeW5hbWljIHBvbGljeSB3aXRoIGFuIGFjdGl2aXR5IGxpc3RlbmVyLCBub3RpZnkgb2Ygc3RhdGUgY2hhbmdlCisgICAgICAgIGlmICgocG9saWN5TWl4ICE9IE5VTEwpCisgICAgICAgICAgICAgICAgJiYgKChwb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpIHsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfTUlYSU5HKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChpbnB1dERlc2MtPmdldEF1ZGlvU2Vzc2lvbkNvdW50KHRydWUvKmFjdGl2ZU9ubHkqLykgPT0gMSkgewotICAgICAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IHBvbGljeU1peCA9IGlucHV0RGVzYy0+bVBvbGljeU1peC5wcm9tb3RlKCk7Ci0gICAgICAgICAgICAvLyBpZiBpbnB1dCBtYXBzIHRvIGEgZHluYW1pYyBwb2xpY3kgd2l0aCBhbiBhY3Rpdml0eSBsaXN0ZW5lciwgbm90aWZ5IG9mIHN0YXRlIGNoYW5nZQotICAgICAgICAgICAgaWYgKChwb2xpY3lNaXggIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgJiYgKChwb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpIHsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUocG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgIE1JWF9TVEFURV9NSVhJTkcpOwotICAgICAgICAgICAgfQorICAgICAgICBEZXZpY2VWZWN0b3IgcHJpbWFyeUlucHV0RGV2aWNlcyA9IGF2YWlsYWJsZVByaW1hcnlNb2R1bGVJbnB1dERldmljZXMoKTsKKyAgICAgICAgaWYgKHByaW1hcnlJbnB1dERldmljZXMuY29udGFpbnMoZGV2aWNlKSAmJgorICAgICAgICAgICAgICAgIG1JbnB1dHMuYWN0aXZlSW5wdXRzQ291bnRPbkRldmljZXMocHJpbWFyeUlucHV0RGV2aWNlcykgPT0gMSkgeworICAgICAgICAgICAgU291bmRUcmlnZ2VyOjpzZXRDYXB0dXJlU3RhdGUodHJ1ZSk7CisgICAgICAgIH0KIAotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByaW1hcnlJbnB1dERldmljZXMgPSBhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCk7Ci0gICAgICAgICAgICBpZiAoKChkZXZpY2UgJiBwcmltYXJ5SW5wdXREZXZpY2VzICYgfkFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApICYmCi0gICAgICAgICAgICAgICAgICAgIG1JbnB1dHMuYWN0aXZlSW5wdXRzQ291bnRPbkRldmljZXMocHJpbWFyeUlucHV0RGV2aWNlcykgPT0gMSkgewotICAgICAgICAgICAgICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKHRydWUpOworICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGVuYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBvdXRwdXQgd2hlbiBpbnB1dCBpcyBzdGFydGVkIGlmIG5vdAorICAgICAgICAvLyB1c2VkIGJ5IGEgcG9saWN5IG1peCBvZiB0eXBlIE1JWF9UWVBFX1JFQ09SREVSUworICAgICAgICAvLyBGb3IgcmVtb3RlIHN1Ym1peCAoYSB2aXJ0dWFsIGRldmljZSksIHdlIG9wZW4gb25seSBvbmUgaW5wdXQgcGVyIGNhcHR1cmUgcmVxdWVzdC4KKyAgICAgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGlucHV0RGVzYy0+Z2V0RGV2aWNlVHlwZSgpKSkgeworICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOCgiIik7CisgICAgICAgICAgICBpZiAocG9saWN5TWl4ID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBhZGRyZXNzID0gU3RyaW5nOCgiMCIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChwb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKKyAgICAgICAgICAgICAgICBhZGRyZXNzID0gcG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzczsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYXV0b21hdGljYWxseSBlbmFibGUgdGhlIHJlbW90ZSBzdWJtaXggb3V0cHV0IHdoZW4gaW5wdXQgaXMgc3RhcnRlZCBpZiBub3QKLSAgICAgICAgICAgIC8vIHVzZWQgYnkgYSBwb2xpY3kgbWl4IG9mIHR5cGUgTUlYX1RZUEVfUkVDT1JERVJTCi0gICAgICAgICAgICAvLyBGb3IgcmVtb3RlIHN1Ym1peCAoYSB2aXJ0dWFsIGRldmljZSksIHdlIG9wZW4gb25seSBvbmUgaW5wdXQgcGVyIGNhcHR1cmUgcmVxdWVzdC4KLSAgICAgICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShpbnB1dERlc2MtPm1EZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOCgiIik7Ci0gICAgICAgICAgICAgICAgaWYgKHBvbGljeU1peCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KCIwIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IHBvbGljeU1peC0+bURldmljZUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzICE9ICIiKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywgInJlbW90ZS1zdWJtaXgiKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWRkcmVzcyAhPSAiIikgeworICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsICJyZW1vdGUtc3VibWl4IiwgQVVESU9fRk9STUFUX0RFRkFVTFQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgQUxPR1YoIkF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRJbnB1dCgpIGlucHV0IHNvdXJjZSA9ICVkIiwgYXVkaW9TZXNzaW9uLT5pbnB1dFNvdXJjZSgpKTsKKyAgICBBTE9HVigiJXMgaW5wdXQgJWQgc291cmNlID0gJWQgZXhpdCIsIF9fRlVOQ1RJT05fXywgaW5wdXQsIGNsaWVudC0+c291cmNlKCkpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdG9wSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgQUxPR1YoInN0b3BJbnB1dCgpIGlucHV0ICVkIiwgaW5wdXQpOwotICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInN0b3BJbnB1dCgpIHVua25vd24gaW5wdXQgJWQiLCBpbnB1dCk7CisgICAgQUxPR1YoIiVzIHBvcnRJZCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKKworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLmdldElucHV0Rm9yQ2xpZW50KHBvcnRJZCk7CisgICAgaWYgKGlucHV0RGVzYyA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlcyBubyBpbnB1dCBmb3IgY2xpZW50ICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGluZGV4KTsKLQotICAgIHNwPEF1ZGlvU2Vzc2lvbj4gYXVkaW9TZXNzaW9uID0gaW5wdXREZXNjLT5nZXRBdWRpb1Nlc3Npb24oc2Vzc2lvbik7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygic3RvcElucHV0KCkgdW5rbm93biBzZXNzaW9uICVkIG9uIGlucHV0ICVkIiwgc2Vzc2lvbiwgaW5wdXQpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIGlmIChhdWRpb1Nlc3Npb24tPmFjdGl2ZUNvdW50KCkgPT0gMCkgewotICAgICAgICBBTE9HVygic3RvcElucHV0KCkgaW5wdXQgJWQgYWxyZWFkeSBzdG9wcGVkIiwgaW5wdXQpOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gaW5wdXREZXNjLT5tSW9IYW5kbGU7CisgICAgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4gY2xpZW50ID0gaW5wdXREZXNjLT5nZXRDbGllbnQocG9ydElkKTsKKyAgICBpZiAoIWNsaWVudC0+YWN0aXZlKCkpIHsKKyAgICAgICAgQUxPR1coIiVzIGlucHV0ICVkIGNsaWVudCAlZCBhbHJlYWR5IHN0b3BwZWQiLCBfX0ZVTkNUSU9OX18sIGlucHV0LCBjbGllbnQtPnBvcnRJZCgpKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIGF1ZGlvU2Vzc2lvbi0+Y2hhbmdlQWN0aXZlQ291bnQoLTEpOworICAgIGlucHV0RGVzYy0+c2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgZmFsc2UpOwogCi0gICAgLy8gUm91dGluZz8KLSAgICBtSW5wdXRSb3V0ZXMuZGVjUm91dGVBY3Rpdml0eShzZXNzaW9uKTsKLQotICAgIGlmIChhdWRpb1Nlc3Npb24tPmFjdGl2ZUNvdW50KCkgPT0gMCkgewotICAgICAgICBpbnB1dERlc2MtPnN0b3AoKTsKLSAgICAgICAgaWYgKGlucHV0RGVzYy0+aXNBY3RpdmUoKSkgewotICAgICAgICAgICAgc2V0SW5wdXREZXZpY2UoaW5wdXQsIGdldE5ld0lucHV0RGV2aWNlKGlucHV0RGVzYyksIGZhbHNlIC8qIGZvcmNlICovKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSBpbnB1dERlc2MtPm1Qb2xpY3lNaXgucHJvbW90ZSgpOwotICAgICAgICAgICAgLy8gaWYgaW5wdXQgbWFwcyB0byBhIGR5bmFtaWMgcG9saWN5IHdpdGggYW4gYWN0aXZpdHkgbGlzdGVuZXIsIG5vdGlmeSBvZiBzdGF0ZSBjaGFuZ2UKLSAgICAgICAgICAgIGlmICgocG9saWN5TWl4ICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICYmICgocG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKHBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfSURMRSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgZGlzYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBvdXRwdXQgd2hlbiBpbnB1dCBpcyBzdG9wcGVkIGlmIG5vdAotICAgICAgICAgICAgLy8gdXNlZCBieSBhIHBvbGljeSBtaXggb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKLSAgICAgICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShpbnB1dERlc2MtPm1EZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOCgiIik7Ci0gICAgICAgICAgICAgICAgaWYgKHBvbGljeU1peCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KCIwIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IHBvbGljeU1peC0+bURldmljZUFkZHJlc3M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhZGRyZXNzICE9ICIiKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywgInJlbW90ZS1zdWJtaXgiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBpbnB1dERlc2MtPm1EZXZpY2U7Ci0gICAgICAgICAgICByZXNldElucHV0RGV2aWNlKGlucHV0KTsKLQotICAgICAgICAgICAgLy8gaW5kaWNhdGUgaW5hY3RpdmUgY2FwdHVyZSB0byBzb3VuZCB0cmlnZ2VyIHNlcnZpY2UgaWYgc3RvcHBpbmcgY2FwdHVyZSBmcm9tIGEgbWljIG9uCi0gICAgICAgICAgICAvLyBwcmltYXJ5IEhXIG1vZHVsZQotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByaW1hcnlJbnB1dERldmljZXMgPSBhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCk7Ci0gICAgICAgICAgICBpZiAoKChkZXZpY2UgJiBwcmltYXJ5SW5wdXREZXZpY2VzICYgfkFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApICYmCi0gICAgICAgICAgICAgICAgICAgIG1JbnB1dHMuYWN0aXZlSW5wdXRzQ291bnRPbkRldmljZXMocHJpbWFyeUlucHV0RGV2aWNlcykgPT0gMCkgewotICAgICAgICAgICAgICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0RGVzYy0+Y2xlYXJQcmVlbXB0ZWRTZXNzaW9ucygpOworICAgIGlucHV0RGVzYy0+c3RvcCgpOworICAgIGlmIChpbnB1dERlc2MtPmlzQWN0aXZlKCkpIHsKKyAgICAgICAgc2V0SW5wdXREZXZpY2UoaW5wdXQsIGdldE5ld0lucHV0RGV2aWNlKGlucHV0RGVzYyksIGZhbHNlIC8qIGZvcmNlICovKTsKKyAgICB9IGVsc2UgeworICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4ID0gaW5wdXREZXNjLT5tUG9saWN5TWl4LnByb21vdGUoKTsKKyAgICAgICAgLy8gaWYgaW5wdXQgbWFwcyB0byBhIGR5bmFtaWMgcG9saWN5IHdpdGggYW4gYWN0aXZpdHkgbGlzdGVuZXIsIG5vdGlmeSBvZiBzdGF0ZSBjaGFuZ2UKKyAgICAgICAgaWYgKChwb2xpY3lNaXggIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAmJiAoKHBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkgeworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKHBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgIE1JWF9TVEFURV9JRExFKTsKICAgICAgICAgfQorCisgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkgZGlzYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBvdXRwdXQgd2hlbiBpbnB1dCBpcyBzdG9wcGVkIGlmIG5vdAorICAgICAgICAvLyB1c2VkIGJ5IGEgcG9saWN5IG1peCBvZiB0eXBlIE1JWF9UWVBFX1JFQ09SREVSUworICAgICAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UoaW5wdXREZXNjLT5nZXREZXZpY2VUeXBlKCkpKSB7CisgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KCIiKTsKKyAgICAgICAgICAgIGlmIChwb2xpY3lNaXggPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KCIwIik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykgeworICAgICAgICAgICAgICAgIGFkZHJlc3MgPSBwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFkZHJlc3MgIT0gIiIpIHsKKyAgICAgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCAicmVtb3RlLXN1Ym1peCIsIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXNldElucHV0RGV2aWNlKGlucHV0KTsKKworICAgICAgICAvLyBpbmRpY2F0ZSBpbmFjdGl2ZSBjYXB0dXJlIHRvIHNvdW5kIHRyaWdnZXIgc2VydmljZSBpZiBzdG9wcGluZyBjYXB0dXJlIGZyb20gYSBtaWMgb24KKyAgICAgICAgLy8gcHJpbWFyeSBIVyBtb2R1bGUKKyAgICAgICAgRGV2aWNlVmVjdG9yIHByaW1hcnlJbnB1dERldmljZXMgPSBhdmFpbGFibGVQcmltYXJ5TW9kdWxlSW5wdXREZXZpY2VzKCk7CisgICAgICAgIGlmIChwcmltYXJ5SW5wdXREZXZpY2VzLmNvbnRhaW5zKGlucHV0RGVzYy0+Z2V0RGV2aWNlKCkpICYmCisgICAgICAgICAgICAgICAgbUlucHV0cy5hY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcyhwcmltYXJ5SW5wdXREZXZpY2VzKSA9PSAwKSB7CisgICAgICAgICAgICBTb3VuZFRyaWdnZXI6OnNldENhcHR1cmVTdGF0ZShmYWxzZSk7CisgICAgICAgIH0KKyAgICAgICAgaW5wdXREZXNjLT5jbGVhclByZWVtcHRlZFNlc3Npb25zKCk7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVsZWFzZUlucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIEFMT0dWKCJyZWxlYXNlSW5wdXQoKSAlZCIsIGlucHV0KTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJyZWxlYXNlSW5wdXQoKSByZWxlYXNpbmcgdW5rbm93biBpbnB1dCAlZCIsIGlucHV0KTsKKyAgICBBTE9HVigiJXMgcG9ydElkICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOworCisgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMuZ2V0SW5wdXRGb3JDbGllbnQocG9ydElkKTsKKyAgICBpZiAoaW5wdXREZXNjID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzIG5vIGlucHV0IGZvciBjbGllbnQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CisgICAgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4gY2xpZW50ID0gaW5wdXREZXNjLT5nZXRDbGllbnQocG9ydElkKTsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IGlucHV0RGVzYy0+bUlvSGFuZGxlOwogCi0gICAgLy8gUm91dGluZwotICAgIG1JbnB1dFJvdXRlcy5yZW1vdmVSb3V0ZShzZXNzaW9uKTsKKyAgICBBTE9HVigiJXMgJWQiLCBfX0ZVTkNUSU9OX18sIGlucHV0KTsKIAotICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5kZXgpOwotICAgIEFMT0dfQVNTRVJUKGlucHV0RGVzYyAhPSAwKTsKKyAgICBpbnB1dERlc2MtPnJlbW92ZUNsaWVudChwb3J0SWQpOwogCi0gICAgc3A8QXVkaW9TZXNzaW9uPiBhdWRpb1Nlc3Npb24gPSBpbnB1dERlc2MtPmdldEF1ZGlvU2Vzc2lvbihzZXNzaW9uKTsKLSAgICBpZiAoYXVkaW9TZXNzaW9uID09IDApIHsKLSAgICAgICAgQUxPR1coInJlbGVhc2VJbnB1dCgpIHVua25vd24gc2Vzc2lvbiAlZCBvbiBpbnB1dCAlZCIsIHNlc3Npb24sIGlucHV0KTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChhdWRpb1Nlc3Npb24tPm9wZW5Db3VudCgpID09IDApIHsKLSAgICAgICAgQUxPR1coInJlbGVhc2VJbnB1dCgpIGludmFsaWQgb3BlbiBjb3VudCAlZCBvbiBzZXNzaW9uICVkIiwKLSAgICAgICAgICAgICAgYXVkaW9TZXNzaW9uLT5vcGVuQ291bnQoKSwgc2Vzc2lvbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoYXVkaW9TZXNzaW9uLT5jaGFuZ2VPcGVuQ291bnQoLTEpID09IDApIHsKLSAgICAgICAgaW5wdXREZXNjLT5yZW1vdmVBdWRpb1Nlc3Npb24oc2Vzc2lvbik7Ci0gICAgfQotCi0gICAgaWYgKGlucHV0RGVzYy0+Z2V0T3BlblJlZkNvdW50KCkgPiAwKSB7Ci0gICAgICAgIEFMT0dWKCJyZWxlYXNlSW5wdXQoKSBleGl0ID4gMCIpOworICAgIGlmIChpbnB1dERlc2MtPmdldENsaWVudENvdW50KCkgPiAwKSB7CisgICAgICAgIEFMT0dWKCIlcyglZCkgJXp1IGNsaWVudHMgcmVtYWluaW5nIiwgX19mdW5jX18sIHBvcnRJZCwgaW5wdXREZXNjLT5nZXRDbGllbnRDb3VudCgpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAogICAgIGNsb3NlSW5wdXQoaW5wdXQpOwogICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKLSAgICBBTE9HVigicmVsZWFzZUlucHV0KCkgZXhpdCIpOworICAgIEFMT0dWKCIlcyBleGl0IiwgX19GVU5DVElPTl9fKTsKIH0KIAotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsb3NlQWxsSW5wdXRzKCkgewotICAgIGJvb2wgcGF0Y2hSZW1vdmVkID0gZmFsc2U7Cit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xvc2VBY3RpdmVDbGllbnRzKGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiYgaW5wdXQpCit7CisgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGNsaWVudHMgPSBpbnB1dC0+Y2xpZW50c0xpc3QodHJ1ZSk7CiAKLSAgICBmb3IgKHNpemVfdCBpbnB1dF9pbmRleCA9IDA7IGlucHV0X2luZGV4IDwgbUlucHV0cy5zaXplKCk7IGlucHV0X2luZGV4KyspIHsKLSAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbnB1dF9pbmRleCk7Ci0gICAgICAgIHNzaXplX3QgcGF0Y2hfaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaW5wdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKLSAgICAgICAgaWYgKHBhdGNoX2luZGV4ID49IDApIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChwYXRjaF9pbmRleCk7Ci0gICAgICAgICAgICAodm9pZCkgLypzdGF0dXNfdCBzdGF0dXMqLyBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSwgMCk7Ci0gICAgICAgICAgICBtQXVkaW9QYXRjaGVzLnJlbW92ZUl0ZW1zQXQocGF0Y2hfaW5kZXgpOwotICAgICAgICAgICAgcGF0Y2hSZW1vdmVkID0gdHJ1ZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IGNsaWVudHMpIHsKKyAgICAgICAgY2xvc2VDbGllbnQoY2xpZW50LT5wb3J0SWQoKSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xvc2VDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCit7CisgICAgc3RvcElucHV0KHBvcnRJZCk7CisgICAgcmVsZWFzZUlucHV0KHBvcnRJZCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0Nsb3NlSW5wdXRzKCkgeworICAgIC8vIEFmdGVyIGNvbm5lY3Rpbmcgb3IgZGlzY29ubmVjdGluZyBhbiBpbnB1dCBkZXZpY2UsIGNsb3NlIGlucHV0IGlmOgorICAgIC8vIC0gaXQgaGFzIG5vIGNsaWVudCAod2FzIGp1c3Qgb3BlbmVkIHRvIGNoZWNrIHByb2ZpbGUpICBPUgorICAgIC8vIC0gbm9uZSBvZiBpdHMgc3VwcG9ydGVkIGRldmljZXMgYXJlIGNvbm5lY3RlZCBhbnltb3JlIE9SCisgICAgLy8gLSBvbmUgb2YgaXRzIGNsaWVudHMgY2Fubm90IGJlIHJvdXRlZCB0byBvbmUgb2YgaXRzIHN1cHBvcnRlZAorICAgIC8vIGRldmljZXMgYW55bW9yZS4gT3RoZXJ3aXNlIHVwZGF0ZSBkZXZpY2Ugc2VsZWN0aW9uCisgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IGlucHV0c1RvQ2xvc2U7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dCA9IG1JbnB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGlucHV0LT5jbGllbnRzTGlzdCgpLnNpemUoKSA9PSAwCisgICAgICAgICAgICAgICAgfHwgIW1BdmFpbGFibGVJbnB1dERldmljZXMuY29udGFpbnNBdExlYXN0T25lKGlucHV0LT5zdXBwb3J0ZWREZXZpY2VzKCkpKSB7CisgICAgICAgICAgICBpbnB1dHNUb0Nsb3NlLnB1c2hfYmFjayhtSW5wdXRzLmtleUF0KGkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJvb2wgY2xvc2UgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogaW5wdXQtPmNsaWVudHNMaXN0KCkpIHsKKyAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPQorICAgICAgICAgICAgICAgICAgICBtRW5naW5lLT5nZXRJbnB1dERldmljZUZvckF0dHJpYnV0ZXMoY2xpZW50LT5hdHRyaWJ1dGVzKCkpOworICAgICAgICAgICAgICAgIGlmICghaW5wdXQtPnN1cHBvcnRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIGNsb3NlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNsb3NlKSB7CisgICAgICAgICAgICAgICAgaW5wdXRzVG9DbG9zZS5wdXNoX2JhY2sobUlucHV0cy5rZXlBdChpKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHNldElucHV0RGV2aWNlKGlucHV0LT5tSW9IYW5kbGUsIGdldE5ld0lucHV0RGV2aWNlKGlucHV0KSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaW5wdXREZXNjLT5jbG9zZSgpOwogICAgIH0KLSAgICBtSW5wdXRSb3V0ZXMuY2xlYXIoKTsKLSAgICBtSW5wdXRzLmNsZWFyKCk7Ci0gICAgU291bmRUcmlnZ2VyOjpzZXRDYXB0dXJlU3RhdGUoZmFsc2UpOwotICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CiAKLSAgICBpZiAocGF0Y2hSZW1vdmVkKSB7Ci0gICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CisgICAgZm9yIChjb25zdCBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUgOiBpbnB1dHNUb0Nsb3NlKSB7CisgICAgICAgIEFMT0dWKCIlcyBjbG9zaW5nIGlucHV0ICVkIiwgX19mdW5jX18sIGhhbmRsZSk7CisgICAgICAgIGNsb3NlSW5wdXQoaGFuZGxlKTsKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCkKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCkKIHsKICAgICBBTE9HVigiaW5pdFN0cmVhbVZvbHVtZSgpIHN0cmVhbSAlZCwgbWluICVkLCBtYXggJWQiLCBzdHJlYW0gLCBpbmRleE1pbiwgaW5kZXhNYXgpOwotICAgIG1Wb2x1bWVDdXJ2ZXMtPmluaXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCBpbmRleE1pbiwgaW5kZXhNYXgpOworICAgIGlmIChpbmRleE1pbiA8IDAgfHwgaW5kZXhNYXggPCAwKSB7CisgICAgICAgIEFMT0dFKCIlcyBmb3Igc3RyZWFtICVkOiBpbnZhbGlkIG1pbiAlZCBvciBtYXggJWQiLCBfX2Z1bmNfXywgc3RyZWFtICwgaW5kZXhNaW4sIGluZGV4TWF4KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBnZXRWb2x1bWVDdXJ2ZXMoc3RyZWFtKS5pbml0Vm9sdW1lKGluZGV4TWluLCBpbmRleE1heCk7CiAKICAgICAvLyBpbml0aWFsaXplIG90aGVyIHByaXZhdGUgc3RyZWFtIHZvbHVtZXMgd2hpY2ggZm9sbG93IHRoaXMgb25lCiAgICAgZm9yIChpbnQgY3VyU3RyZWFtID0gMDsgY3VyU3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBjdXJTdHJlYW0rKykgewogICAgICAgICBpZiAoIXN0cmVhbXNNYXRjaEZvcnZvbHVtZShzdHJlYW0sIChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSkpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIG1Wb2x1bWVDdXJ2ZXMtPmluaXRTdHJlYW1Wb2x1bWUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtLCBpbmRleE1pbiwgaW5kZXhNYXgpOworICAgICAgICBnZXRWb2x1bWVDdXJ2ZXMoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKS5pbml0Vm9sdW1lKGluZGV4TWluLCBpbmRleE1heCk7CiAgICAgfQogfQogCkBAIC0yMjQ3LDEyICsyNDQ0LDE2NiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCiB7CisgICAgYXV0byBhdHRyaWJ1dGVzID0gbUVuZ2luZS0+Z2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoc3RyZWFtKTsKKyAgICBBTE9HVigiJXM6IHN0cmVhbSAlcyBhdHRyaWJ1dGVzPSVzIiwgX19mdW5jX18sCisgICAgICAgICAgdG9TdHJpbmcoc3RyZWFtKS5jX3N0cigpLCB0b1N0cmluZyhhdHRyaWJ1dGVzKS5jX3N0cigpKTsKKyAgICByZXR1cm4gc2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIGluZGV4LCBkZXZpY2UpOworfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIC8vIGlmIGRldmljZSBpcyBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSwgcmV0dXJuIHZvbHVtZSBmb3IgZGV2aWNlIHNlbGVjdGVkIGZvciB0aGlzCisgICAgLy8gc3RyZWFtIGJ5IHRoZSBlbmdpbmUuCisgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSkgeworICAgICAgICBkZXZpY2UgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtKHN0cmVhbSwgdHJ1ZSAvKmZyb21DYWNoZSovKS50eXBlcygpOworICAgIH0KKyAgICByZXR1cm4gZ2V0Vm9sdW1lSW5kZXgoZ2V0Vm9sdW1lQ3VydmVzKHN0cmVhbSksICppbmRleCwgZGV2aWNlKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICAvLyBHZXQgVm9sdW1lIGdyb3VwIG1hdGNoaW5nIHRoZSBBdWRpbyBBdHRyaWJ1dGVzCisgICAgYXV0byBncm91cCA9IG1FbmdpbmUtPmdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKKyAgICBpZiAoZ3JvdXAgPT0gVk9MVU1FX0dST1VQX05PTkUpIHsKKyAgICAgICAgQUxPR0QoIiVzOiBubyBncm91cCBtYXRjaGluZyB3aXRoICVzIiwgX19GVU5DVElPTl9fLCB0b1N0cmluZyhhdHRyaWJ1dGVzKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoIiVzOiBncm91cCAlZCBtYXRjaGluZyB3aXRoICVzIiwgX19GVU5DVElPTl9fLCBncm91cCwgdG9TdHJpbmcoYXR0cmlidXRlcykuY19zdHIoKSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgSVZvbHVtZUN1cnZlcyAmY3VydmVzID0gZ2V0Vm9sdW1lQ3VydmVzKGF0dHJpYnV0ZXMpOworICAgIFZvbHVtZVNvdXJjZSB2cyA9IHRvVm9sdW1lU291cmNlKGdyb3VwKTsKKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kgPSBtRW5naW5lLT5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOworCisgICAgc3RhdHVzID0gc2V0Vm9sdW1lQ3VydmVJbmRleChpbmRleCwgZGV2aWNlLCBjdXJ2ZXMpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIiVzIGZhaWxlZCB0byBzZXQgY3VydmUgaW5kZXggZm9yIGdyb3VwICVkIGRldmljZSAweCVYIiwgX19mdW5jX18sIGdyb3VwLCBkZXZpY2UpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIGF1ZGlvX2RldmljZXNfdCBjdXJTcmNEZXZpY2U7CisgICAgYXV0byBjdXJDdXJ2QXR0cnMgPSBjdXJ2ZXMuZ2V0QXR0cmlidXRlcygpOworICAgIGlmICghY3VyQ3VydkF0dHJzLmVtcHR5KCkgJiYgY3VyQ3VydkF0dHJzLmZyb250KCkgIT0gZGVmYXVsdEF0dHIpIHsKKyAgICAgICAgYXV0byBhdHRyID0gY3VyQ3VydkF0dHJzLmZyb250KCk7CisgICAgICAgIGN1clNyY0RldmljZSA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHIsIG51bGxwdHIsIGZhbHNlKS50eXBlcygpOworICAgIH0gZWxzZSBpZiAoIWN1cnZlcy5nZXRTdHJlYW1UeXBlcygpLmVtcHR5KCkpIHsKKyAgICAgICAgYXV0byBzdHJlYW0gPSBjdXJ2ZXMuZ2V0U3RyZWFtVHlwZXMoKS5mcm9udCgpOworICAgICAgICBjdXJTcmNEZXZpY2UgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtKHN0cmVhbSwgZmFsc2UpLnR5cGVzKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHNyYyAlZDogbm8gdmFsaWQgYXR0cmlidXRlcyBub3Igc3RyZWFtIixfX2Z1bmNfXywgdnMpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBjdXJTcmNEZXZpY2UgPSBWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShjdXJTcmNEZXZpY2UpOworCisgICAgLy8gdXBkYXRlIHZvbHVtZSBvbiBhbGwgb3V0cHV0cyBhbmQgc3RyZWFtcyBtYXRjaGluZyB0aGUgZm9sbG93aW5nOgorICAgIC8vIC0gVGhlIHJlcXVlc3RlZCBzdHJlYW0gKG9yIGEgc3RyZWFtIG1hdGNoaW5nIGZvciB2b2x1bWUgY29udHJvbCkgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQKKyAgICAvLyAtIFRoZSBkZXZpY2UgKG9yIGRldmljZXMpIHNlbGVjdGVkIGJ5IHRoZSBlbmdpbmUgZm9yIHRoaXMgc3RyZWFtIGluY2x1ZGVzCisgICAgLy8gdGhlIHJlcXVlc3RlZCBkZXZpY2UKKyAgICAvLyAtIEZvciBub24gZGVmYXVsdCByZXF1ZXN0ZWQgZGV2aWNlLCBjdXJyZW50bHkgc2VsZWN0ZWQgZGV2aWNlIG9uIHRoZSBvdXRwdXQgaXMgZWl0aGVyIHRoZQorICAgIC8vIHJlcXVlc3RlZCBkZXZpY2Ugb3Igb25lIG9mIHRoZSBkZXZpY2VzIHNlbGVjdGVkIGJ5IHRoZSBlbmdpbmUgZm9yIHRoaXMgc3RyZWFtCisgICAgLy8gLSBGb3IgZGVmYXVsdCByZXF1ZXN0ZWQgZGV2aWNlIChBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSksIGFwcGx5IHZvbHVtZSBvbmx5IGlmCisgICAgLy8gbm8gc3BlY2lmaWMgZGV2aWNlIHZvbHVtZSB2YWx1ZSBleGlzdHMgZm9yIGN1cnJlbnRseSBzZWxlY3RlZCBkZXZpY2UuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJEZXZpY2UgPSBkZXNjLT5kZXZpY2VzKCkudHlwZXMoKTsKKworICAgICAgICBpZiAoY3VyRGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpIHsKKyAgICAgICAgICAgIGN1ckRldmljZSB8PSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgICAgICBjdXJEZXZpY2UgJj0gfkFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW50ZXIgLyBpbnRyYSB2b2x1bWUgZ3JvdXAgcHJpb3JpdHkgbWFuYWdlbWVudDogTG9vcCBvbiBzdHJhdGVnaWVzIGFycmFuZ2VkIGJ5IHByaW9yaXR5CisgICAgICAgIC8vIElmIGEgaGlnaGVyIHByaW9yaXR5IHN0cmF0ZWd5IGlzIGFjdGl2ZSwgYW5kIHRoZSBvdXRwdXQgaXMgcm91dGVkIHRvIGEgZGV2aWNlIHdpdGggYQorICAgICAgICAvLyBIVyBHYWluIG1hbmFnZW1lbnQsIGRvIG5vdCBjaGFuZ2UgdGhlIHZvbHVtZQorICAgICAgICBib29sIGFwcGx5Vm9sdW1lID0gZmFsc2U7CisgICAgICAgIGlmIChkZXNjLT51c2VId0dhaW4oKSkgeworICAgICAgICAgICAgaWYgKCEoZGVzYy0+aXNBY3RpdmUodG9Wb2x1bWVTb3VyY2UoZ3JvdXApKSB8fCBpc0luQ2FsbCgpKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZwcm9kdWN0U3RyYXRlZ3kgOiBtRW5naW5lLT5nZXRPcmRlcmVkUHJvZHVjdFN0cmF0ZWdpZXMoKSkgeworICAgICAgICAgICAgICAgIGF1dG8gYWN0aXZlQ2xpZW50cyA9IGRlc2MtPmNsaWVudHNMaXN0KHRydWUgLyphY3RpdmVPbmx5Ki8sIHByb2R1Y3RTdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKnByZWZlcnJlZERldmljZSovKTsKKyAgICAgICAgICAgICAgICBpZiAoYWN0aXZlQ2xpZW50cy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBib29sIGlzUHJlZW1wdGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYm9vbCBpc0hpZ2hlclByaW9yaXR5ID0gcHJvZHVjdFN0cmF0ZWd5IDwgc3RyYXRlZ3k7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBhY3RpdmVDbGllbnRzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpc0hpZ2hlclByaW9yaXR5ICYmIChjbGllbnQtPnZvbHVtZVNvdXJjZSgpICE9IHZzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBTdHJhdGVneT0lZCAoXG5yZXF1ZXN0ZXI6XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGdyb3VwICVkLCB2b2x1bWVHcm91cD0lZCBhdHRyaWJ1dGVzPSVzKVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBoaWdoZXIgcHJpb3JpdHkgc291cmNlIGFjdGl2ZTpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgdm9sdW1lR3JvdXA9JWQgYXR0cmlidXRlcz0lcykgXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG9uIG91dHB1dCAlenUsIGJhaWxpbmcgb3V0IiwgX19mdW5jX18sIHByb2R1Y3RTdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwLCBncm91cCwgdG9TdHJpbmcoYXR0cmlidXRlcykuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+dm9sdW1lU291cmNlKCksIHRvU3RyaW5nKGNsaWVudC0+YXR0cmlidXRlcygpKS5jX3N0cigpLCBpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5Vm9sdW1lID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBpc1ByZWVtcHRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBIb3dldmVyLCBjb250aW51ZSBmb3IgbG9vcCB0byBlbnN1cmUgbm8gaGlnaGVyIHByaW8gY2xpZW50cyBydW5uaW5nIG9uIG91dHB1dAorICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50LT52b2x1bWVTb3VyY2UoKSA9PSB2cykgeworICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlWb2x1bWUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpc1ByZWVtcHRlZCB8fCBhcHBseVZvbHVtZSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWFwcGx5Vm9sdW1lKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7IC8vIG5leHQgb3V0cHV0CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXNfdCB2b2xTdGF0dXMgPSBjaGVja0FuZFNldFZvbHVtZShjdXJ2ZXMsIHZzLCBpbmRleCwgZGVzYywgY3VyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZzID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9TWVNURU0pPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUT1VDSF9TT1VORF9GSVhFRF9ERUxBWV9NUyA6IDApKTsKKyAgICAgICAgICAgIGlmICh2b2xTdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSB2b2xTdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShkZXNjLT5pc0FjdGl2ZSh2cykgfHwgaXNJbkNhbGwoKSkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICgoZGV2aWNlICE9IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FKSAmJiAoKGN1ckRldmljZSAmIGRldmljZSkgPT0gMCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2UgIT0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUpIHsKKyAgICAgICAgICAgIGN1clNyY0RldmljZSB8PSBkZXZpY2U7CisgICAgICAgICAgICBhcHBseVZvbHVtZSA9IChWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShjdXJEZXZpY2UpICYgY3VyU3JjRGV2aWNlKSAhPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXBwbHlWb2x1bWUgPSAhY3VydmVzLmhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGN1clNyY0RldmljZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFwcGx5Vm9sdW1lKSB7CisgICAgICAgICAgICAvL0ZJWE1FOiB3b3JrYXJvdW5kIGZvciB0cnVuY2F0ZWQgdG91Y2ggc291bmRzCisgICAgICAgICAgICAvLyBkZWxheWVkIHZvbHVtZSBjaGFuZ2UgZm9yIHN5c3RlbSBzdHJlYW0gdG8gYmUgcmVtb3ZlZCB3aGVuIHRoZSBwcm9ibGVtIGlzCisgICAgICAgICAgICAvLyBoYW5kbGVkIGJ5IHN5c3RlbSBVSQorICAgICAgICAgICAgc3RhdHVzX3Qgdm9sU3RhdHVzID0gY2hlY2tBbmRTZXRWb2x1bWUoCisgICAgICAgICAgICAgICAgICAgICAgICBjdXJ2ZXMsIHZzLCBpbmRleCwgZGVzYywgY3VyRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgKCh2cyA9PSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fU1lTVEVNKSk/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRPVUNIX1NPVU5EX0ZJWEVEX0RFTEFZX01TIDogMCkpOworICAgICAgICAgICAgaWYgKHZvbFN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHZvbFN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZChncm91cCwgMCAvKmZsYWdzKi8pOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0Vm9sdW1lQ3VydmVJbmRleChpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVm9sdW1lQ3VydmVzICZ2b2x1bWVDdXJ2ZXMpCit7CiAgICAgLy8gVk9JQ0VfQ0FMTCBzdHJlYW0gaGFzIG1pblZvbHVtZUluZGV4ID4gMCAgYnV0IGNhbiBiZSBtdXRlZCBkaXJlY3RseSBieSBhbgogICAgIC8vIGFwcCB0aGF0IGhhcyBNT0RJRllfUEhPTkVfU1RBVEUgcGVybWlzc2lvbi4KLSAgICBpZiAoKChpbmRleCA8IG1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4TWluKHN0cmVhbSkpICYmCi0gICAgICAgICAgICAhKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCAmJiBpbmRleCA9PSAwKSkgfHwKLSAgICAgICAgICAgIChpbmRleCA+IG1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4TWF4KHN0cmVhbSkpKSB7CisgICAgYm9vbCBoYXNWb2ljZSA9IGhhc1ZvaWNlU3RyZWFtKHZvbHVtZUN1cnZlcy5nZXRTdHJlYW1UeXBlcygpKTsKKyAgICBpZiAoKChpbmRleCA8IHZvbHVtZUN1cnZlcy5nZXRWb2x1bWVJbmRleE1pbigpKSAmJiAhKGhhc1ZvaWNlICYmIGluZGV4ID09IDApKSB8fAorICAgICAgICAgICAgKGluZGV4ID4gdm9sdW1lQ3VydmVzLmdldFZvbHVtZUluZGV4TWF4KCkpKSB7CisgICAgICAgIEFMT0dEKCIlczogd3JvbmcgaW5kZXggJWQgbWluPSVkIG1heD0lZCIsIF9fRlVOQ1RJT05fXywgaW5kZXgsCisgICAgICAgICAgICAgIHZvbHVtZUN1cnZlcy5nZXRWb2x1bWVJbmRleE1pbigpLCB2b2x1bWVDdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXhNYXgoKSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpKSB7CkBAIC0yMjYwLDkwICsyNjExLDQ5IEBACiAgICAgfQogCiAgICAgLy8gRm9yY2UgbWF4IHZvbHVtZSBpZiBzdHJlYW0gY2Fubm90IGJlIG11dGVkCi0gICAgaWYgKCFtVm9sdW1lQ3VydmVzLT5jYW5CZU11dGVkKHN0cmVhbSkpIGluZGV4ID0gbVZvbHVtZUN1cnZlcy0+Z2V0Vm9sdW1lSW5kZXhNYXgoc3RyZWFtKTsKKyAgICBpZiAoIXZvbHVtZUN1cnZlcy5jYW5CZU11dGVkKCkpIGluZGV4ID0gdm9sdW1lQ3VydmVzLmdldFZvbHVtZUluZGV4TWF4KCk7CiAKLSAgICBBTE9HVigic2V0U3RyZWFtVm9sdW1lSW5kZXgoKSBzdHJlYW0gJWQsIGRldmljZSAlMDh4LCBpbmRleCAlZCIsCi0gICAgICAgICAgc3RyZWFtLCBkZXZpY2UsIGluZGV4KTsKLQotICAgIC8vIHVwZGF0ZSBvdGhlciBwcml2YXRlIHN0cmVhbSB2b2x1bWVzIHdoaWNoIGZvbGxvdyB0aGlzIG9uZQotICAgIGZvciAoaW50IGN1clN0cmVhbSA9IDA7IGN1clN0cmVhbSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgY3VyU3RyZWFtKyspIHsKLSAgICAgICAgaWYgKCFzdHJlYW1zTWF0Y2hGb3J2b2x1bWUoc3RyZWFtLCAoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBtVm9sdW1lQ3VydmVzLT5hZGRDdXJyZW50Vm9sdW1lSW5kZXgoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtLCBkZXZpY2UsIGluZGV4KTsKLSAgICB9Ci0KLSAgICAvLyB1cGRhdGUgdm9sdW1lIG9uIGFsbCBvdXRwdXRzIGFuZCBzdHJlYW1zIG1hdGNoaW5nIHRoZSBmb2xsb3dpbmc6Ci0gICAgLy8gLSBUaGUgcmVxdWVzdGVkIHN0cmVhbSAob3IgYSBzdHJlYW0gbWF0Y2hpbmcgZm9yIHZvbHVtZSBjb250cm9sKSBpcyBhY3RpdmUgb24gdGhlIG91dHB1dAotICAgIC8vIC0gVGhlIGRldmljZSAob3IgZGV2aWNlcykgc2VsZWN0ZWQgYnkgdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBzdHJlYW0gaW5jbHVkZXMKLSAgICAvLyB0aGUgcmVxdWVzdGVkIGRldmljZQotICAgIC8vIC0gRm9yIG5vbiBkZWZhdWx0IHJlcXVlc3RlZCBkZXZpY2UsIGN1cnJlbnRseSBzZWxlY3RlZCBkZXZpY2Ugb24gdGhlIG91dHB1dCBpcyBlaXRoZXIgdGhlCi0gICAgLy8gcmVxdWVzdGVkIGRldmljZSBvciBvbmUgb2YgdGhlIGRldmljZXMgc2VsZWN0ZWQgYnkgdGhlIHN0cmF0ZWd5Ci0gICAgLy8gLSBGb3IgZGVmYXVsdCByZXF1ZXN0ZWQgZGV2aWNlIChBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSksIGFwcGx5IHZvbHVtZSBvbmx5IGlmCi0gICAgLy8gbm8gc3BlY2lmaWMgZGV2aWNlIHZvbHVtZSB2YWx1ZSBleGlzdHMgZm9yIGN1cnJlbnRseSBzZWxlY3RlZCBkZXZpY2UuCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJEZXZpY2UgPSBWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShkZXNjLT5kZXZpY2UoKSk7Ci0gICAgICAgIGZvciAoaW50IGN1clN0cmVhbSA9IDA7IGN1clN0cmVhbSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgY3VyU3RyZWFtKyspIHsKLSAgICAgICAgICAgIGlmICghc3RyZWFtc01hdGNoRm9ydm9sdW1lKHN0cmVhbSwgKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCEoZGVzYy0+aXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKSB8fAotICAgICAgICAgICAgICAgICAgICAoaXNJbkNhbGwoKSAmJiAoY3VyU3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSkpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IGN1clN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKTsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJTdHJlYW1EZXZpY2UgPSBWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShnZXREZXZpY2VGb3JTdHJhdGVneSgKLSAgICAgICAgICAgICAgICAgICAgY3VyU3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pKTsKLSAgICAgICAgICAgIGlmICgoZGV2aWNlICE9IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FKSAmJgotICAgICAgICAgICAgICAgICAgICAoKGN1clN0cmVhbURldmljZSAmIGRldmljZSkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJvb2wgYXBwbHlWb2x1bWU7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlICE9IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FKSB7Ci0gICAgICAgICAgICAgICAgY3VyU3RyZWFtRGV2aWNlIHw9IGRldmljZTsKLSAgICAgICAgICAgICAgICBhcHBseVZvbHVtZSA9IChjdXJEZXZpY2UgJiBjdXJTdHJlYW1EZXZpY2UpICE9IDA7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFwcGx5Vm9sdW1lID0gIW1Wb2x1bWVDdXJ2ZXMtPmhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCBjdXJTdHJlYW1EZXZpY2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoYXBwbHlWb2x1bWUpIHsKLSAgICAgICAgICAgICAgICAvL0ZJWE1FOiB3b3JrYXJvdW5kIGZvciB0cnVuY2F0ZWQgdG91Y2ggc291bmRzCi0gICAgICAgICAgICAgICAgLy8gZGVsYXllZCB2b2x1bWUgY2hhbmdlIGZvciBzeXN0ZW0gc3RyZWFtIHRvIGJlIHJlbW92ZWQgd2hlbiB0aGUgcHJvYmxlbSBpcwotICAgICAgICAgICAgICAgIC8vIGhhbmRsZWQgYnkgc3lzdGVtIFVJCi0gICAgICAgICAgICAgICAgc3RhdHVzX3Qgdm9sU3RhdHVzID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSwgaW5kZXgsIGRlc2MsIGN1ckRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9TWVNURU0pID8gVE9VQ0hfU09VTkRfRklYRURfREVMQVlfTVMgOiAwKTsKLSAgICAgICAgICAgICAgICBpZiAodm9sU3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHZvbFN0YXR1czsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKKyAgICBBTE9HVigiJXMgZGV2aWNlICUwOHgsIGluZGV4ICVkIiwgX19GVU5DVElPTl9fICwgZGV2aWNlLCBpbmRleCk7CisgICAgdm9sdW1lQ3VydmVzLmFkZEN1cnJlbnRWb2x1bWVJbmRleChkZXZpY2UsIGluZGV4KTsKKyAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQogewotICAgIGlmIChpbmRleCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgLy8gaWYgZGV2aWNlIGlzIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FLCByZXR1cm4gdm9sdW1lIGZvciBkZXZpY2Ugc2VsZWN0ZWQgZm9yIHRoaXMKKyAgICAvLyBzdHJlYW0gYnkgdGhlIGVuZ2luZS4KKyAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FKSB7CisgICAgICAgIGRldmljZSA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHIsIG51bGxwdHIsIHRydWUgLypmcm9tQ2FjaGUqLykudHlwZXMoKTsKICAgICB9CisgICAgcmV0dXJuIGdldFZvbHVtZUluZGV4KGdldFZvbHVtZUN1cnZlcyhhdHRyKSwgaW5kZXgsIGRldmljZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0Vm9sdW1lSW5kZXgoY29uc3QgSVZvbHVtZUN1cnZlcyAmY3VydmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAorewogICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIC8vIGlmIGRldmljZSBpcyBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSwgcmV0dXJuIHZvbHVtZSBmb3IgZGV2aWNlIGNvcnJlc3BvbmRpbmcgdG8KLSAgICAvLyB0aGUgc3RyYXRlZ3kgdGhlIHN0cmVhbSBiZWxvbmdzIHRvLgotICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koZ2V0U3RyYXRlZ3koc3RyZWFtKSwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKLSAgICB9CiAgICAgZGV2aWNlID0gVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlKTsKKyAgICBpbmRleCA9IGN1cnZlcy5nZXRWb2x1bWVJbmRleChkZXZpY2UpOworICAgIEFMT0dWKCIlczogZGV2aWNlICUwOHggaW5kZXggJWQiLCBfX0ZVTkNUSU9OX18sIGRldmljZSwgaW5kZXgpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KIAotICAgICppbmRleCA9ICBtVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleChzdHJlYW0sIGRldmljZSk7Ci0gICAgQUxPR1YoImdldFN0cmVhbVZvbHVtZUluZGV4KCkgc3RyZWFtICVkIGRldmljZSAlMDh4IGluZGV4ICVkIiwgc3RyZWFtLCBkZXZpY2UsICppbmRleCk7CitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4KQoreworICAgIGluZGV4ID0gZ2V0Vm9sdW1lQ3VydmVzKGF0dHIpLmdldFZvbHVtZUluZGV4TWluKCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4KQoreworICAgIGluZGV4ID0gZ2V0Vm9sdW1lQ3VydmVzKGF0dHIpLmdldFZvbHVtZUluZGV4TWF4KCk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCkBAIC0yMzU4LDkgKzI2NjgsOSBAQAogICAgIC8vIDM6IFRoZSBwcmltYXJ5IG91dHB1dAogICAgIC8vIDQ6IHRoZSBmaXJzdCBvdXRwdXQgaW4gdGhlIGxpc3QKIAotICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShBVURJT19TVFJFQU1fTVVTSUMpOwotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShkZXZpY2UsIG1PdXRwdXRzKTsKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlcyA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKAorICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfTUVESUEpLCBudWxscHRyLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlcyhkZXZpY2VzLCBtT3V0cHV0cyk7CiAKICAgICBpZiAob3V0cHV0cy5zaXplKCkgPT0gMCkgewogICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CkBAIC0yMzc2LDcgKzI2ODYsNyBAQAogCiAgICAgICAgIGZvciAoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0IDogb3V0cHV0cykgewogICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwotICAgICAgICAgICAgaWYgKGFjdGl2ZU9ubHkgJiYgIWRlc2MtPmlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9NVVNJQykpIHsKKyAgICAgICAgICAgIGlmIChhY3RpdmVPbmx5ICYmICFkZXNjLT5pc0FjdGl2ZSh0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fTVVTSUMpKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1YoInNlbGVjdE91dHB1dEZvck11c2ljRWZmZWN0cyBhY3RpdmVPbmx5ICVkIG91dHB1dCAlZCBmbGFncyAweCUwOHgiLApAQCAtMjQwNCw2ICsyNzE0LDcgQEAKICAgICB9CiAKICAgICBpZiAob3V0cHV0ICE9IG1NdXNpY0VmZmVjdE91dHB1dCkgeworICAgICAgICBtRWZmZWN0cy5tb3ZlRWZmZWN0cyhBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsIG1NdXNpY0VmZmVjdE91dHB1dCwgb3V0cHV0KTsKICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm1vdmVFZmZlY3RzKEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwgbU11c2ljRWZmZWN0T3V0cHV0LCBvdXRwdXQpOwogICAgICAgICBtTXVzaWNFZmZlY3RPdXRwdXQgPSBvdXRwdXQ7CiAgICAgfQpAQCAtMjQzMSwyNCArMjc0Miw2MiBAQAogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBtRWZmZWN0cy5yZWdpc3RlckVmZmVjdChkZXNjLCBpbywgc3RyYXRlZ3ksIHNlc3Npb24sIGlkKTsKKyAgICByZXR1cm4gbUVmZmVjdHMucmVnaXN0ZXJFZmZlY3QoZGVzYywgaW8sIHNlc3Npb24sIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyYXRlZ3kgPT0gc3RyZWFtVG9TdHJhdGVneShBVURJT19TVFJFQU1fTVVTSUMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmF0ZWd5ID09IFBST0RVQ1RfU1RSQVRFR1lfTk9ORSkpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKQoreworICAgIGlmIChtRWZmZWN0cy5nZXRFZmZlY3QoaWQpID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBpZiAobUVmZmVjdHMuaXNFZmZlY3RFbmFibGVkKGlkKSkgeworICAgICAgICBBTE9HVygiJXMgZWZmZWN0ICVkIGVuYWJsZWQiLCBfX0ZVTkNUSU9OX18sIGlkKTsKKyAgICAgICAgc2V0RWZmZWN0RW5hYmxlZChpZCwgZmFsc2UpOworICAgIH0KKyAgICByZXR1cm4gbUVmZmVjdHMudW5yZWdpc3RlckVmZmVjdChpZCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbGVhblVwRWZmZWN0c0ZvcklvKGF1ZGlvX2lvX2hhbmRsZV90IGlvKQoreworICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIGVmZmVjdHMgPSBtRWZmZWN0cy5nZXRFZmZlY3RzRm9ySW8oaW8pOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0cy5zaXplKCk7IGkrKykgeworICAgICAgICBBTE9HVygiJXMgcmVtb3Zpbmcgc3RhbGUgZWZmZWN0ICVzLCBpZCAlZCBvbiBjbG9zZWQgSU8gJWQiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgZWZmZWN0cy52YWx1ZUF0KGkpLT5tRGVzYy5uYW1lLCBlZmZlY3RzLmtleUF0KGkpLCBpbyk7CisgICAgICAgIHVucmVnaXN0ZXJFZmZlY3QoZWZmZWN0cy5rZXlBdChpKSk7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpCit7CisgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0ID0gbUVmZmVjdHMuZ2V0RWZmZWN0KGlkKTsKKyAgICBpZiAoZWZmZWN0ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1cyA9IG1FZmZlY3RzLnNldEVmZmVjdEVuYWJsZWQoaWQsIGVuYWJsZWQpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgbUlucHV0cy50cmFja0VmZmVjdEVuYWJsZWQoZWZmZWN0LCBlbmFibGVkKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6Om1vdmVFZmZlY3RzVG9Jbyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBpZHMsIGF1ZGlvX2lvX2hhbmRsZV90IGlvKQoreworICAgbUVmZmVjdHMubW92ZUVmZmVjdHMoaWRzLCBpbyk7CisgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIGJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0CiB7Ci0gICAgYm9vbCBhY3RpdmUgPSBmYWxzZTsKLSAgICBmb3IgKGludCBjdXJTdHJlYW0gPSAwOyBjdXJTdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQgJiYgIWFjdGl2ZTsgY3VyU3RyZWFtKyspIHsKLSAgICAgICAgaWYgKCFzdHJlYW1zTWF0Y2hGb3J2b2x1bWUoc3RyZWFtLCAoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBhY3RpdmUgPSBtT3V0cHV0cy5pc1N0cmVhbUFjdGl2ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0sIGluUGFzdE1zKTsKLSAgICB9Ci0gICAgcmV0dXJuIGFjdGl2ZTsKKyAgICByZXR1cm4gbU91dHB1dHMuaXNBY3RpdmUodG9Wb2x1bWVTb3VyY2Uoc3RyZWFtKSwgaW5QYXN0TXMpOwogfQogCiBib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0CiB7Ci0gICAgcmV0dXJuIG1PdXRwdXRzLmlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoc3RyZWFtLCBpblBhc3RNcyk7CisgICAgcmV0dXJuIG1PdXRwdXRzLmlzQWN0aXZlUmVtb3RlbHkodG9Wb2x1bWVTb3VyY2Uoc3RyZWFtKSwgaW5QYXN0TXMpOwogfQogCiBib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdApAQCAtMjQ5MywzMyArMjg0Miw0OCBAQAogICAgIHNwPEh3TW9kdWxlPiByU3VibWl4TW9kdWxlOwogICAgIC8vIGV4YW1pbmUgZWFjaCBtaXgncyByb3V0ZSB0eXBlCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtaXhlcy5zaXplKCk7IGkrKykgewotICAgICAgICAvLyB3ZSBvbmx5IHN1cHBvcnQgTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLIG9yIE1JWF9ST1VURV9GTEFHX1JFTkRFUiwgbm90IHRoZSBjb21iaW5hdGlvbgotICAgICAgICBpZiAoKG1peGVzW2ldLm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfQUxMKSA9PSBNSVhfUk9VVEVfRkxBR19BTEwpIHsKKyAgICAgICAgQXVkaW9NaXggbWl4ID0gbWl4ZXNbaV07CisgICAgICAgIC8vIE9ubHkgY2FwdHVyZSBvZiBwbGF5YmFjayBpcyBhbGxvd2VkIGluIExPT1BfQkFDSyAmIFJFTkRFUiBtb2RlCisgICAgICAgIGlmIChpc19taXhfbG9vcGJhY2tfcmVuZGVyKG1peC5tUm91dGVGbGFncykgJiYgbWl4Lm1NaXhUeXBlICE9IE1JWF9UWVBFX1BMQVlFUlMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBQb2xpY3kgTWl4ICV6dSBvZiAlenU6ICIKKyAgICAgICAgICAgICAgICAgICJPbmx5IGNhcHR1cmUgb2YgcGxheWJhY2sgaXMgYWxsb3dlZCBpbiBMT09QX0JBQ0sgJiBSRU5ERVIgbW9kZSIsCisgICAgICAgICAgICAgICAgICAgaSwgbWl4ZXMuc2l6ZSgpKTsKICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKChtaXhlc1tpXS5tUm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSykgPT0gTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLKSB7Ci0gICAgICAgICAgICBBTE9HVigicmVnaXN0ZXJQb2xpY3lNaXhlcygpIG1peCAlenUgb2YgJXp1IGlzIExPT1BfQkFDSyIsIGksIG1peGVzLnNpemUoKSk7CisgICAgICAgIC8vIExPT1BfQkFDSyBhbmQgTE9PUF9CQUNLIHwgUkVOREVSIGhhdmUgdGhlIHNhbWUgcmVtb3RlIHN1Ym1peCBiYWNrZW5kIGFuZCBhcmUgaGFuZGxlZAorICAgICAgICAvLyBpbiB0aGUgc2FtZSB3YXkuCisgICAgICAgIGlmICgobWl4Lm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLKSA9PSBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spIHsKKyAgICAgICAgICAgIEFMT0dWKCJyZWdpc3RlclBvbGljeU1peGVzKCkgbWl4ICV6dSBvZiAlenUgaXMgTE9PUF9CQUNLICVkIiwgaSwgbWl4ZXMuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgbWl4Lm1Sb3V0ZUZsYWdzKTsKICAgICAgICAgICAgIGlmIChyU3VibWl4TW9kdWxlID09IDApIHsKICAgICAgICAgICAgICAgICByU3VibWl4TW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZSgKICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9SRU1PVEVfU1VCTUlYKTsKICAgICAgICAgICAgICAgICBpZiAoclN1Ym1peE1vZHVsZSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCIgVW5hYmxlIHRvIGZpbmQgYXVkaW8gbW9kdWxlIGZvciBzdWJtaXgsIGFib3J0aW5nIG1peCAlenUgcmVnaXN0cmF0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBmaW5kIGF1ZGlvIG1vZHVsZSBmb3Igc3VibWl4LCBhYm9ydGluZyBtaXggJXp1IHJlZ2lzdHJhdGlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSk7CiAgICAgICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IG1peGVzW2ldLm1EZXZpY2VBZGRyZXNzOworICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gbWl4Lm1EZXZpY2VBZGRyZXNzOworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGVUb01ha2VBdmFpbGFibGU7CisgICAgICAgICAgICBpZiAobWl4Lm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKKyAgICAgICAgICAgICAgICBtaXgubURldmljZVR5cGUgPSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVg7CisgICAgICAgICAgICAgICAgZGV2aWNlVHlwZVRvTWFrZUF2YWlsYWJsZSA9IEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtaXgubURldmljZVR5cGUgPSBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgICAgICAgICBkZXZpY2VUeXBlVG9NYWtlQXZhaWxhYmxlID0gQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAobVBvbGljeU1peGVzLnJlZ2lzdGVyTWl4KGFkZHJlc3MsIG1peGVzW2ldLCAwIC8qb3V0cHV0IGRlc2MqLykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiIEVycm9yIHJlZ2lzdGVyaW5nIG1peCAlenUgZm9yIGFkZHJlc3MgJXMiLCBpLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgIGlmIChtUG9saWN5TWl4ZXMucmVnaXN0ZXJNaXgobWl4LCAwIC8qb3V0cHV0IGRlc2MqLykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRXJyb3IgcmVnaXN0ZXJpbmcgbWl4ICV6dSBmb3IgYWRkcmVzcyAlcyIsIGksIGFkZHJlc3Muc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgYXVkaW9fY29uZmlnX3Qgb3V0cHV0Q29uZmlnID0gbWl4ZXNbaV0ubUZvcm1hdDsKLSAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGlucHV0Q29uZmlnID0gbWl4ZXNbaV0ubUZvcm1hdDsKKyAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IG91dHB1dENvbmZpZyA9IG1peC5tRm9ybWF0OworICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgaW5wdXRDb25maWcgPSBtaXgubUZvcm1hdDsKICAgICAgICAgICAgIC8vIE5PVEU6IGF1ZGlvIGZsaW5nZXIgbWl4ZXIgZG9lcyBub3Qgc3VwcG9ydCBtb25vIG91dHB1dDogY29uZmlndXJlIHJlbW90ZSBzdWJtaXggSEFMIGluCiAgICAgICAgICAgICAvLyBzdGVyZW8gYW5kIGxldCBhdWRpbyBmbGluZ2VyIGRvIHRoZSBjaGFubmVsIGNvbnZlcnNpb24gaWYgbmVlZGVkLgogICAgICAgICAgICAgb3V0cHV0Q29uZmlnLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKQEAgLTI1MjksMzEgKzI4OTMsMzUgQEAKICAgICAgICAgICAgIHJTdWJtaXhNb2R1bGUtPmFkZElucHV0UHJvZmlsZShhZGRyZXNzLCAmaW5wdXRDb25maWcsCiAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLCBhZGRyZXNzKTsKIAotICAgICAgICAgICAgaWYgKG1peGVzW2ldLm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKLSAgICAgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCksICJyZW1vdGUtc3VibWl4Iik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCksICJyZW1vdGUtc3VibWl4Iik7CisgICAgICAgICAgICBpZiAoKHJlcyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChkZXZpY2VUeXBlVG9NYWtlQXZhaWxhYmxlLAorICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSwgInJlbW90ZS1zdWJtaXgiLCBBVURJT19GT1JNQVRfREVGQVVMVCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgcmVtb3RlIHN1Ym1peCBkZXZpY2UgYXZhaWxhYmxlLCB0eXBlICV1LCBhZGRyZXNzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1peC5tRGV2aWNlVHlwZSwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoKG1peGVzW2ldLm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSA9PSBNSVhfUk9VVEVfRkxBR19SRU5ERVIpIHsKLSAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IG1peGVzW2ldLm1EZXZpY2VBZGRyZXNzOwotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IG1peGVzW2ldLm1EZXZpY2VUeXBlOworICAgICAgICB9IGVsc2UgaWYgKChtaXgubVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19SRU5ERVIpID09IE1JWF9ST1VURV9GTEFHX1JFTkRFUikgeworICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gbWl4Lm1EZXZpY2VBZGRyZXNzOworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBtaXgubURldmljZVR5cGU7CiAgICAgICAgICAgICBBTE9HVigiIHJlZ2lzdGVyUG9saWN5TWl4ZXMoKSBtaXggJXp1IG9mICV6dSBpcyBSRU5ERVIsIGRldj0weCVYIGFkZHI9JXMiLAotICAgICAgICAgICAgICAgICAgICBpLCBtaXhlcy5zaXplKCksIGRldmljZSwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGksIG1peGVzLnNpemUoKSwgdHlwZSwgYWRkcmVzcy5zdHJpbmcoKSk7CisKKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IG1Id01vZHVsZXMuZ2V0RGV2aWNlRGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICAgICAgbWl4Lm1EZXZpY2VUeXBlLCBtaXgubURldmljZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICAgICAgaWYgKGRldmljZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGJvb2wgZm91bmRPdXRwdXQgPSBmYWxzZTsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwIDsgaiA8IG1PdXRwdXRzLnNpemUoKSA7IGorKykgewogICAgICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChqKTsKLSAgICAgICAgICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaCA9IG1BdWRpb1BhdGNoZXMudmFsdWVGb3IoZGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKChwYXRjaCAhPSAwKSAmJiAocGF0Y2gtPm1QYXRjaC5udW1fc2lua3MgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwYXRjaC0+bVBhdGNoLnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChwYXRjaC0+bVBhdGNoLnNpbmtzWzBdLmV4dC5kZXZpY2UudHlwZSA9PSBkZXZpY2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAoc3RybmNtcChwYXRjaC0+bVBhdGNoLnNpbmtzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcywgYWRkcmVzcy5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTikgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1Qb2xpY3lNaXhlcy5yZWdpc3Rlck1peChhZGRyZXNzLCBtaXhlc1tpXSwgZGVzYykgIT0gTk9fRVJST1IpIHsKKworICAgICAgICAgICAgICAgIGlmIChkZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobVBvbGljeU1peGVzLnJlZ2lzdGVyTWl4KG1peCwgZGVzYykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgcmVnaXN0ZXIgbWl4IFJFTkRFUiwgIGRldj0weCVYIGFkZHI9JXMiLCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kT3V0cHV0ID0gdHJ1ZTsKQEAgLTI1NjQsMTIgKzI5MzIsMTIgQEAKIAogICAgICAgICAgICAgaWYgKHJlcyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIEFMT0dFKCIgRXJyb3IgcmVnaXN0ZXJpbmcgbWl4ICV6dSBmb3IgZGV2aWNlIDB4JVggYWRkciAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpLCBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaSwgdHlwZSwgYWRkcmVzcy5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKCFmb3VuZE91dHB1dCkgewogICAgICAgICAgICAgICAgIEFMT0dFKCIgT3V0cHV0IG5vdCBmb3VuZCBmb3IgbWl4ICV6dSBmb3IgZGV2aWNlIDB4JVggYWRkciAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBpLCBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgaSwgdHlwZSwgYWRkcmVzcy5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0yNjAxLDI4ICsyOTY5LDI4IEBACiAKICAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IG1peC5tRGV2aWNlQWRkcmVzczsKIAotICAgICAgICAgICAgaWYgKG1Qb2xpY3lNaXhlcy51bnJlZ2lzdGVyTWl4KGFkZHJlc3MpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBpZiAobVBvbGljeU1peGVzLnVucmVnaXN0ZXJNaXgobWl4KSAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLCBhZGRyZXNzLnN0cmluZygpKSA9PQotICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSkgIHsKLSAgICAgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSwgInJlbW90ZS1zdWJtaXgiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLCBhZGRyZXNzLnN0cmluZygpKSA9PQotICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSkgIHsKLSAgICAgICAgICAgICAgICBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLAotICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCksICJyZW1vdGUtc3VibWl4Iik7CisgICAgICAgICAgICBmb3IgKGF1dG8gZGV2aWNlIDoge0FVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLCBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVh9KSB7CisgICAgICAgICAgICAgICAgaWYgKGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCkpID09CisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSkgIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KGRldmljZSwgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCksICJyZW1vdGUtc3VibWl4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkVycm9yIG1ha2luZyBSZW1vdGVTdWJtaXggZGV2aWNlIHVuYXZhaWxhYmxlIGZvciBtaXggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGggdHlwZSAlZCwgYWRkcmVzcyAlcyIsIGRldmljZSwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByU3VibWl4TW9kdWxlLT5yZW1vdmVPdXRwdXRQcm9maWxlKGFkZHJlc3MpOwogICAgICAgICAgICAgclN1Ym1peE1vZHVsZS0+cmVtb3ZlSW5wdXRQcm9maWxlKGFkZHJlc3MpOwogCi0gICAgICAgIH0gaWYgKChtaXgubVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19SRU5ERVIpID09IE1JWF9ST1VURV9GTEFHX1JFTkRFUikgewotICAgICAgICAgICAgaWYgKG1Qb2xpY3lNaXhlcy51bnJlZ2lzdGVyTWl4KG1peC5tRGV2aWNlQWRkcmVzcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgfSBlbHNlIGlmICgobWl4Lm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSA9PSBNSVhfUk9VVEVfRkxBR19SRU5ERVIpIHsKKyAgICAgICAgICAgIGlmIChtUG9saWN5TWl4ZXMudW5yZWdpc3Rlck1peChtaXgpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CkBAIC0yNjMxLDU3ICsyOTk5LDExNyBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpkdW1wTWFudWFsU3Vycm91bmRGb3JtYXRzKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBzaXplX3QgaSA9IDA7CisgICAgY29uc3RleHByIHNpemVfdCBhdWRpb0Zvcm1hdFByZWZpeExlbiA9IHNpemVvZigiQVVESU9fRk9STUFUXyIpOworICAgIGZvciAoY29uc3QgYXV0byYgZm10IDogbU1hbnVhbFN1cnJvdW5kRm9ybWF0cykgeworICAgICAgICBpZiAoaSsrICE9IDApIGRzdC0+YXBwZW5kKCIsICIpOworICAgICAgICBzdGQ6OnN0cmluZyBzZm10OworICAgICAgICBGb3JtYXRDb252ZXJ0ZXI6OnRvU3RyaW5nKGZtdCwgc2ZtdCk7CisgICAgICAgIGRzdC0+YXBwZW5kKHNmbXQuc2l6ZSgpID49IGF1ZGlvRm9ybWF0UHJlZml4TGVuID8KKyAgICAgICAgICAgICAgICBzZm10LmNfc3RyKCkgKyBhdWRpb0Zvcm1hdFByZWZpeExlbiAtIDEgOiBzZm10LmNfc3RyKCkpOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwKKyAgICAgICAgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKSB7CisgICAgQUxPR1YoIiVzKCkgdWlkPSVkIG51bSBkZXZpY2VzICV6dSIsIF9fRlVOQ1RJT05fXywgdWlkLCBkZXZpY2VzLnNpemUoKSk7CisgICAgLy8gdWlkL2RldmljZSBhZmZpbml0eSBpcyBvbmx5IGZvciBvdXRwdXQgZGV2aWNlcworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlc1tpXS5tVHlwZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJzZXRVaWREZXZpY2VBZmZpbml0aWVzKCkgZGV2aWNlPSUwOHggaXMgTk9UIGFuIG91dHB1dCBkZXZpY2UiLAorICAgICAgICAgICAgICAgICAgICBkZXZpY2VzW2ldLm1UeXBlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RhdHVzX3QgcmVzID0gIG1Qb2xpY3lNaXhlcy5zZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZCwgZGV2aWNlcyk7CisgICAgaWYgKHJlcyA9PSBOT19FUlJPUikgeworICAgICAgICAvLyByZWV2YWx1YXRlIG91dHB1dHMgZm9yIGFsbCBnaXZlbiBkZXZpY2VzCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG1Id01vZHVsZXMuZ2V0RGV2aWNlRGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VzW2ldLm1UeXBlLCBkZXZpY2VzW2ldLm1BZGRyZXNzLCBTdHJpbmc4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzOworICAgICAgICAgICAgaWYgKGNoZWNrT3V0cHV0c0ZvckRldmljZShkZXZEZXNjLCBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0cykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgic2V0VWlkRGV2aWNlQWZmaW5pdGllcygpIGVycm9yIGluIGNoZWNrT3V0cHV0c0ZvckRldmljZSBmb3IgZGV2aWNlPSUwOHgiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGFkZHI9JXMiLCBkZXZpY2VzW2ldLm1UeXBlLCBkZXZpY2VzW2ldLm1BZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCkgeworICAgIEFMT0dWKCIlcygpIHVpZD0lZCIsIF9fRlVOQ1RJT05fXywgdWlkKTsKKyAgICBzdGF0dXNfdCByZXMgPSBtUG9saWN5TWl4ZXMucmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWQpOworICAgIGlmIChyZXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgQ291bGQgbm90IHJlbW92ZSBhbGwgZGV2aWNlIGFmZmluaXRpZXMgZm8gdWlkID0gJWQiLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCB1aWQpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbkF1ZGlvUG9saWN5TWFuYWdlciBEdW1wOiAlcFxuIiwgdGhpcyk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBQcmltYXJ5IE91dHB1dDogJWRcbiIsCisgICAgICAgICAgICAgaGFzUHJpbWFyeU91dHB1dCgpID8gbVByaW1hcnlPdXRwdXQtPm1Jb0hhbmRsZSA6IEFVRElPX0lPX0hBTkRMRV9OT05FKTsKKyAgICBzdGQ6OnN0cmluZyBzdGF0ZUxpdGVyYWw7CisgICAgQXVkaW9Nb2RlQ29udmVydGVyOjp0b1N0cmluZyhtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCksIHN0YXRlTGl0ZXJhbCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBQaG9uZSBzdGF0ZTogJXNcbiIsIHN0YXRlTGl0ZXJhbC5jX3N0cigpKTsKKyAgICBjb25zdCBjaGFyKiBmb3JjZVVzZXNbQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlRdID0geworICAgICAgICAiY29tbXVuaWNhdGlvbnMiLCAibWVkaWEiLCAicmVjb3JkIiwgImRvY2siLCAic3lzdGVtIiwKKyAgICAgICAgIkhETUkgc3lzdGVtIGF1ZGlvIiwgImVuY29kZWQgc3Vycm91bmQgb3V0cHV0IiwgInZpYnJhdGUgcmluZ2luZyIgfTsKKyAgICBmb3IgKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCBpID0gQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OOworICAgICAgICAgaSA8IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UOyBpID0gKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCkoKGludClpICsgMSkpIHsKKyAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBmb3JjZVVzZVZhbHVlID0gbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoaSk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRm9yY2UgdXNlIGZvciAlczogJWQiLCBmb3JjZVVzZXNbaV0sIGZvcmNlVXNlVmFsdWUpOworICAgICAgICBpZiAoaSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQgJiYKKyAgICAgICAgICAgICAgICBmb3JjZVVzZVZhbHVlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX01BTlVBTCkgeworICAgICAgICAgICAgZHN0LT5hcHBlbmQoIiAoTUFOVUFMOiAiKTsKKyAgICAgICAgICAgIGR1bXBNYW51YWxTdXJyb3VuZEZvcm1hdHMoZHN0KTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kKCIpIik7CisgICAgICAgIH0KKyAgICAgICAgZHN0LT5hcHBlbmQoIlxuIik7CisgICAgfQorICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgVFRTIG91dHB1dCAlc2F2YWlsYWJsZVxuIiwgbVR0c091dHB1dEF2YWlsYWJsZSA/ICIiIDogIm5vdCAiKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIE1hc3RlciBtb25vOiAlc1xuIiwgbU1hc3Rlck1vbm8gPyAib24iIDogIm9mZiIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgQ29uZmlnIHNvdXJjZTogJXNcbiIsIG1Db25maWcuZ2V0U291cmNlKCkuY19zdHIoKSk7IC8vIGdldENvbmZpZyBub3QgY29uc3QKKyAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5kdW1wKGRzdCwgU3RyaW5nOCgiQXZhaWxhYmxlIG91dHB1dCIpKTsKKyAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmR1bXAoZHN0LCBTdHJpbmc4KCJBdmFpbGFibGUgaW5wdXQiKSk7CisgICAgbUh3TW9kdWxlc0FsbC5kdW1wKGRzdCk7CisgICAgbU91dHB1dHMuZHVtcChkc3QpOworICAgIG1JbnB1dHMuZHVtcChkc3QpOworICAgIG1FZmZlY3RzLmR1bXAoZHN0KTsKKyAgICBtQXVkaW9QYXRjaGVzLmR1bXAoZHN0KTsKKyAgICBtUG9saWN5TWl4ZXMuZHVtcChkc3QpOworICAgIG1BdWRpb1NvdXJjZXMuZHVtcChkc3QpOworCisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBBbGxvd2VkQ2FwdHVyZVBvbGljaWVzOlxuIik7CisgICAgZm9yIChhdXRvJiBwb2xpY3kgOiBtQWxsb3dlZENhcHR1cmVQb2xpY2llcykgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICAgLSB1aWQ9JWQgZmxhZ19tYXNrPSUjeFxuIiwgcG9saWN5LmZpcnN0LCBwb2xpY3kuc2Vjb25kKTsKKyAgICB9CisKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG5Qb2xpY3kgRW5naW5lIGR1bXA6XG4iKTsKKyAgICBtRW5naW5lLT5kdW1wKGRzdCk7Cit9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6ZHVtcChpbnQgZmQpCiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07CiAgICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbkF1ZGlvUG9saWN5TWFuYWdlciBEdW1wOiAlcFxuIiwgdGhpcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFByaW1hcnkgT3V0cHV0OiAlZFxuIiwKLSAgICAgICAgICAgICBoYXNQcmltYXJ5T3V0cHV0KCkgPyBtUHJpbWFyeU91dHB1dC0+bUlvSGFuZGxlIDogQVVESU9fSU9fSEFORExFX05PTkUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzdGQ6OnN0cmluZyBzdGF0ZUxpdGVyYWw7Ci0gICAgQXVkaW9Nb2RlQ29udmVydGVyOjp0b1N0cmluZyhtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCksIHN0YXRlTGl0ZXJhbCk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFBob25lIHN0YXRlOiAlc1xuIiwgc3RhdGVMaXRlcmFsLmNfc3RyKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBjb21tdW5pY2F0aW9ucyAlZFxuIiwKLSAgICAgICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT04pKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgbWVkaWEgJWRcbiIsIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUEpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgcmVjb3JkICVkXG4iLCBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBkb2NrICVkXG4iLCBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0spKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3Igc3lzdGVtICVkXG4iLCBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBoZG1pIHN5c3RlbSBhdWRpbyAlZFxuIiwKLSAgICAgICAgICAgIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfSERNSV9TWVNURU1fQVVESU8pKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgZW5jb2RlZCBzdXJyb3VuZCBvdXRwdXQgJWRcbiIsCi0gICAgICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFRUUyBvdXRwdXQgJXNcbiIsIG1UdHNPdXRwdXRBdmFpbGFibGUgPyAiYXZhaWxhYmxlIiA6ICJub3QgYXZhaWxhYmxlIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBNYXN0ZXIgbW9ubzogJXNcbiIsIG1NYXN0ZXJNb25vID8gIm9uIiA6ICJvZmYiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KKyAgICBkdW1wKCZyZXN1bHQpOwogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KIAotICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmR1bXAoZmQsIFN0cmluZzgoIkF2YWlsYWJsZSBvdXRwdXQiKSk7Ci0gICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5kdW1wKGZkLCBTdHJpbmc4KCJBdmFpbGFibGUgaW5wdXQiKSk7Ci0gICAgbUh3TW9kdWxlc0FsbC5kdW1wKGZkKTsKLSAgICBtT3V0cHV0cy5kdW1wKGZkKTsKLSAgICBtSW5wdXRzLmR1bXAoZmQpOwotICAgIG1Wb2x1bWVDdXJ2ZXMtPmR1bXAoZmQpOwotICAgIG1FZmZlY3RzLmR1bXAoZmQpOwotICAgIG1BdWRpb1BhdGNoZXMuZHVtcChmZCk7Ci0gICAgbVBvbGljeU1peGVzLmR1bXAoZmQpOwotCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldEFsbG93ZWRDYXB0dXJlUG9saWN5KHVpZF90IHVpZCwgYXVkaW9fZmxhZ3NfbWFza190IGNhcHR1cmVQb2xpY3kpCit7CisgICAgbUFsbG93ZWRDYXB0dXJlUG9saWNpZXNbdWlkXSA9IGNhcHR1cmVQb2xpY3k7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCkBAIC0yNzAyLDEyICszMTMwLDkgQEAKICAgICB9CiAKICAgICAvLyBDaGVjayBpZiBvZmZsb2FkIGhhcyBiZWVuIGRpc2FibGVkCi0gICAgY2hhciBwcm9wVmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBpZiAocHJvcGVydHlfZ2V0KCJhdWRpby5vZmZsb2FkLmRpc2FibGUiLCBwcm9wVmFsdWUsICIwIikpIHsKLSAgICAgICAgaWYgKGF0b2kocHJvcFZhbHVlKSAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HVigib2ZmbG9hZCBkaXNhYmxlZCBieSBhdWRpby5vZmZsb2FkLmRpc2FibGU9JXMiLCBwcm9wVmFsdWUgKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQorICAgIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgiYXVkaW8ub2ZmbG9hZC5kaXNhYmxlIiwgZmFsc2UgLyogZGVmYXVsdF92YWx1ZSAqLykpIHsKKyAgICAgICAgQUxPR1YoIm9mZmxvYWQgZGlzYWJsZWQgYnkgYXVkaW8ub2ZmbG9hZC5kaXNhYmxlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICAvLyBDaGVjayBpZiBzdHJlYW0gdHlwZSBpcyBtdXNpYywgdGhlbiBvbmx5IGFsbG93IG9mZmxvYWQgYXMgb2Ygbm93LgpAQCAtMjcyNiw5ICszMTUxLDEyIEBACiAgICAgfQogCiAgICAgLy9JZiBkdXJhdGlvbiBpcyBsZXNzIHRoYW4gbWluaW11bSB2YWx1ZSBkZWZpbmVkIGluIHByb3BlcnR5LCByZXR1cm4gZmFsc2UKLSAgICBpZiAocHJvcGVydHlfZ2V0KCJhdWRpby5vZmZsb2FkLm1pbi5kdXJhdGlvbi5zZWNzIiwgcHJvcFZhbHVlLCBOVUxMKSkgewotICAgICAgICBpZiAob2ZmbG9hZEluZm8uZHVyYXRpb25fdXMgPCAoYXRvaShwcm9wVmFsdWUpICogMTAwMDAwMCApKSB7Ci0gICAgICAgICAgICBBTE9HVigiT2ZmbG9hZCBkZW5pZWQgYnkgZHVyYXRpb24gPCBhdWRpby5vZmZsb2FkLm1pbi5kdXJhdGlvbi5zZWNzKD0lcykiLCBwcm9wVmFsdWUpOworICAgIGNvbnN0IGludCBtaW5fZHVyYXRpb25fc2VjcyA9IHByb3BlcnR5X2dldF9pbnQzMigKKyAgICAgICAgICAgICJhdWRpby5vZmZsb2FkLm1pbi5kdXJhdGlvbi5zZWNzIiwgLTEgLyogZGVmYXVsdF92YWx1ZSAqLyk7CisgICAgaWYgKG1pbl9kdXJhdGlvbl9zZWNzID49IDApIHsKKyAgICAgICAgaWYgKG9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzIDwgbWluX2R1cmF0aW9uX3NlY3MgKiAxMDAwMDAwTEwpIHsKKyAgICAgICAgICAgIEFMT0dWKCJPZmZsb2FkIGRlbmllZCBieSBkdXJhdGlvbiA8IGF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MoPSVkKSIsCisgICAgICAgICAgICAgICAgICAgIG1pbl9kdXJhdGlvbl9zZWNzKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAob2ZmbG9hZEluZm8uZHVyYXRpb25fdXMgPCBPRkZMT0FEX0RFRkFVTFRfTUlOX0RVUkFUSU9OX1NFQ1MgKiAxMDAwMDAwKSB7CkBAIC0yNzQ4LDE1ICszMTc2LDM0IEBACiAKICAgICAvLyBTZWUgaWYgdGhlcmUgaXMgYSBwcm9maWxlIHRvIHN1cHBvcnQgdGhpcy4KICAgICAvLyBBVURJT19ERVZJQ0VfTk9ORQotICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoQVVESU9fREVWSUNFX05PTkUgLyppZ25vcmUgZGV2aWNlICovLAorICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGdldFByb2ZpbGVGb3JPdXRwdXQoRGV2aWNlVmVjdG9yKCkgLyppZ25vcmUgZGV2aWNlICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZsb2FkSW5mby5zYW1wbGVfcmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8uZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZsb2FkSW5mby5jaGFubmVsX21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGRpcmVjdE9ubHkgKi8pOwogICAgIEFMT0dWKCJpc09mZmxvYWRTdXBwb3J0ZWQoKSBwcm9maWxlICVzZm91bmQiLCBwcm9maWxlICE9IDAgPyAiIiA6ICJOT1QgIik7CiAgICAgcmV0dXJuIChwcm9maWxlICE9IDApOwogfQogCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCYgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcykgeworICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG91dHB1dF9mbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CisgICAgYXVkaW9fZmxhZ3NfdG9fYXVkaW9fb3V0cHV0X2ZsYWdzKGF0dHJpYnV0ZXMuZmxhZ3MsICZvdXRwdXRfZmxhZ3MpOworICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGdldFByb2ZpbGVGb3JPdXRwdXQoRGV2aWNlVmVjdG9yKCkgLyppZ25vcmUgZGV2aWNlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBkaXJlY3RPbmx5ICovKTsKKyAgICBBTE9HVigiJXMoKSBwcm9maWxlICVzZm91bmQgd2l0aCBuYW1lOiAlcywgIgorICAgICAgICAic2FtcGxlIHJhdGU6ICV1LCBmb3JtYXQ6IDB4JXgsIGNoYW5uZWxfbWFzazogMHgleCwgb3V0cHV0IGZsYWdzOiAweCV4IiwKKyAgICAgICAgX19GVU5DVElPTl9fLCBwcm9maWxlICE9IDAgPyAiIiA6ICJOT1QgIiwKKyAgICAgICAgKHByb2ZpbGUgIT0gMCA/IHByb2ZpbGUtPmdldFRhZ05hbWUoKS5zdHJpbmcoKSA6ICJudWxsIiksCisgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSwgY29uZmlnLmZvcm1hdCwgY29uZmlnLmNoYW5uZWxfbWFzaywgb3V0cHV0X2ZsYWdzKTsKKyAgICByZXR1cm4gKHByb2ZpbGUgIT0gMCk7Cit9CisKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6bGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCkBAIC0yODY1LDggKzMzMTIsNyBAQAogICAgIH0KICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIG51bSBzb3VyY2VzICVkIG51bSBzaW5rcyAlZCIsIHBhdGNoLT5udW1fc291cmNlcywgcGF0Y2gtPm51bV9zaW5rcyk7CiAKLSAgICBpZiAocGF0Y2gtPm51bV9zb3VyY2VzID09IDAgfHwgcGF0Y2gtPm51bV9zb3VyY2VzID4gQVVESU9fUEFUQ0hfUE9SVFNfTUFYIHx8Ci0gICAgICAgICAgICBwYXRjaC0+bnVtX3NpbmtzID09IDAgfHwgcGF0Y2gtPm51bV9zaW5rcyA+IEFVRElPX1BBVENIX1BPUlRTX01BWCkgeworICAgIGlmICghYXVkaW9fcGF0Y2hfaXNfdmFsaWQocGF0Y2gpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIC8vIG9ubHkgb25lIHNvdXJjZSBwZXIgYXVkaW8gcGF0Y2ggc3VwcG9ydGVkIGZvciBub3cKQEAgLTI5MzgsOCArMzM4NCw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5tUHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZEZXNjLT50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPm1BZGRyZXNzLAorICAgICAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5tUHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShEZXZpY2VWZWN0b3IoZGV2RGVzYyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLnNhbXBsZV9yYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgLy8gdXBkYXRlZFNhbXBsaW5nUmF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5mb3JtYXQsCkBAIC0yOTYwLDcgKzM0MDUsNyBAQAogICAgICAgICAvLyBUT0RPOiByZWNvbmZpZ3VyZSBvdXRwdXQgZm9ybWF0IGFuZCBjaGFubmVscyBoZXJlCiAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc2V0dGluZyBkZXZpY2UgJTA4eCBvbiBvdXRwdXQgJWQiLAogICAgICAgICAgICAgICBkZXZpY2VzLnR5cGVzKCksIG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXREZXNjLCBkZXZpY2VzLnR5cGVzKCksIHRydWUsIDAsIGhhbmRsZSk7CisgICAgICAgIHNldE91dHB1dERldmljZXMob3V0cHV0RGVzYywgZGV2aWNlcywgdHJ1ZSwgMCwgaGFuZGxlKTsKICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKmhhbmRsZSk7CiAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgICAgICBpZiAocGF0Y2hEZXNjICE9IDAgJiYgcGF0Y2hEZXNjICE9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCkpIHsKQEAgLTI5ODksMTQgKzM0MzQsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0KKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9CiAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKLSAgICAgICAgICAgIGlmIChkZXZEZXNjID09IDApIHsKKyAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gMCkgewogICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmICghaW5wdXREZXNjLT5tUHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZEZXNjLT50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+bUFkZHJlc3MsCisgICAgICAgICAgICBpZiAoIWlucHV0RGVzYy0+bVByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoRGV2aWNlVmVjdG9yKGRldmljZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLnNhbXBsZV9yYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIC8qdXBkYXRlZFNhbXBsZVJhdGUqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5mb3JtYXQsCkBAIC0zMDEwLDkgKzM0NTQsOSBAQAogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFRPRE86IHJlY29uZmlndXJlIG91dHB1dCBmb3JtYXQgYW5kIGNoYW5uZWxzIGhlcmUKLSAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc2V0dGluZyBkZXZpY2UgJTA4eCBvbiBvdXRwdXQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT50eXBlKCksIGlucHV0RGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgIHNldElucHV0RGV2aWNlKGlucHV0RGVzYy0+bUlvSGFuZGxlLCBkZXZEZXNjLT50eXBlKCksIHRydWUsIGhhbmRsZSk7CisgICAgICAgICAgICBBTE9HVigiJXMoKSBzZXR0aW5nIGRldmljZSAlcyBvbiBvdXRwdXQgJWQiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpLCBpbnB1dERlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dERlc2MtPm1Jb0hhbmRsZSwgZGV2aWNlLCB0cnVlLCBoYW5kbGUpOwogICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKmhhbmRsZSk7CiAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICAgICAgICAgIGlmIChwYXRjaERlc2MgIT0gMCAmJiBwYXRjaERlc2MgIT0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KSkgewpAQCAtMzAzMiwxNiArMzQ3NiwxNiBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNyY0RldmljZURlc2MgPQorICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc3JjRGV2aWNlID0KICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQocGF0Y2gtPnNvdXJjZXNbMF0uaWQpOwotICAgICAgICAgICAgaWYgKHNyY0RldmljZURlc2MgPT0gMCkgeworICAgICAgICAgICAgaWYgKHNyY0RldmljZSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy91cGRhdGUgc291cmNlIGFuZCBzaW5rIHdpdGggb3VyIG93biBkYXRhIGFzIHRoZSBkYXRhIHBhc3NlZCBpbiB0aGUgcGF0Y2ggbWF5CiAgICAgICAgICAgICAvLyBiZSBpbmNvbXBsZXRlLgogICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIG5ld1BhdGNoID0gKnBhdGNoOwotICAgICAgICAgICAgc3JjRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJm5ld1BhdGNoLnNvdXJjZXNbMF0sICZwYXRjaC0+c291cmNlc1swXSk7CisgICAgICAgICAgICBzcmNEZXZpY2UtPnRvQXVkaW9Qb3J0Q29uZmlnKCZuZXdQYXRjaC5zb3VyY2VzWzBdLCAmcGF0Y2gtPnNvdXJjZXNbMF0pOwogCiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhdGNoLT5udW1fc2lua3M7IGkrKykgewogICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbaV0udHlwZSAhPSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CkBAIC0zMDQ5LDI5ICszNDkzLDI5IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzaW5rRGV2aWNlRGVzYyA9CisgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc2lua0RldmljZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQocGF0Y2gtPnNpbmtzW2ldLmlkKTsKLSAgICAgICAgICAgICAgICBpZiAoc2lua0RldmljZURlc2MgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChzaW5rRGV2aWNlID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2lua0RldmljZURlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZuZXdQYXRjaC5zaW5rc1tpXSwgJnBhdGNoLT5zaW5rc1tpXSk7CisgICAgICAgICAgICAgICAgc2lua0RldmljZS0+dG9BdWRpb1BvcnRDb25maWcoJm5ld1BhdGNoLnNpbmtzW2ldLCAmcGF0Y2gtPnNpbmtzW2ldKTsKIAogICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBhIHNvZnR3YXJlIGJyaWRnZSBpbiBQYXRjaFBhbmVsIGlmOgogICAgICAgICAgICAgICAgIC8vIC0gc291cmNlIGFuZCBzaW5rIGRldmljZXMgYXJlIG9uIGRpZmZlcmVudCBIVyBtb2R1bGVzIE9SCiAgICAgICAgICAgICAgICAgLy8gLSBhdWRpbyBIQUwgdmVyc2lvbiBpcyA8IDMuMAotICAgICAgICAgICAgICAgIGlmICghc3JjRGV2aWNlRGVzYy0+aGFzU2FtZUh3TW9kdWxlQXMoc2lua0RldmljZURlc2MpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAoc3JjRGV2aWNlRGVzYy0+bU1vZHVsZS0+Z2V0SGFsVmVyc2lvbk1ham9yKCkgPCAzKSkgeworICAgICAgICAgICAgICAgIC8vIC0gYXVkaW8gSEFMIHZlcnNpb24gaXMgPj0gMy4wIGJ1dCBubyByb3V0ZSBoYXMgYmVlbiBkZWNsYXJlZCBiZXR3ZWVuIGRldmljZXMKKyAgICAgICAgICAgICAgICBpZiAoIXNyY0RldmljZS0+aGFzU2FtZUh3TW9kdWxlQXMoc2lua0RldmljZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIChzcmNEZXZpY2UtPmdldE1vZHVsZVZlcnNpb25NYWpvcigpIDwgMykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICFzcmNEZXZpY2UtPmdldE1vZHVsZSgpLT5zdXBwb3J0c1BhdGNoKHNyY0RldmljZSwgc2lua0RldmljZSkpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBvbmx5IG9uZSBzaW5rIGRldmljZSBmb3Igbm93IHRvIHNpbXBsaWZ5IG91dHB1dCBzZWxlY3Rpb24gbG9naWMKICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5udW1fc2lua3MgPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0c0ZvckRldmljZShzaW5rRGV2aWNlRGVzYy0+dHlwZSgpLCBtT3V0cHV0cyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0T3V0cHV0c0ZvckRldmljZXMoRGV2aWNlVmVjdG9yKHNpbmtEZXZpY2UpLCBtT3V0cHV0cyk7CiAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBzaW5rIGRldmljZSBpcyByZWFjaGFibGUgdmlhIGFuIG9wZW5lZCBvdXRwdXQgc3RyZWFtLCByZXF1ZXN0IHRvIGdvIHZpYQogICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIG91dHB1dCBzdHJlYW0gYnkgYWRkaW5nIGEgc2Vjb25kIHNvdXJjZSB0byB0aGUgcGF0Y2ggZGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0lOVkFMSUQpOworICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cyk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKQEAgLTMwODUsMjggKzM1MjksOCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gVE9ETzogY2hlY2sgZnJvbSByb3V0aW5nIGNhcGFiaWxpdGllcyBpbiBjb25maWcgZmlsZSBhbmQgb3RoZXIgY29uZmxpY3RpbmcgcGF0Y2hlcwogCi0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIGFmUGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgmbmV3UGF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZQYXRjaEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBwYXRjaCBwYW5lbCByZXR1cm5lZCAlZCBwYXRjaEhhbmRsZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGFmUGF0Y2hIYW5kbGUpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbmV3IEF1ZGlvUGF0Y2goJm5ld1BhdGNoLCB1aWQpOwotICAgICAgICAgICAgICAgICAgICBhZGRBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSwgcGF0Y2hEZXNjKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaCA9IG5ld1BhdGNoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgICAgICAqaGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOwotICAgICAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnN0YWxsUGF0Y2goX19mdW5jX18sIGluZGV4LCBoYW5kbGUsICZuZXdQYXRjaCwgMCwgdWlkLCAmcGF0Y2hEZXNjKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIHBhdGNoIHBhbmVsIGNvdWxkIG5vdCBjb25uZWN0IGRldmljZSBwYXRjaCwgZXJyb3IgJWQiLAogICAgICAgICAgICAgICAgIHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMzE0NiwxMSArMzU3MCwxMSBAQAogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogCi0gICAgICAgIHNldE91dHB1dERldmljZShvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIHRydWUgLypmcm9tQ2FjaGUqLyksCi0gICAgICAgICAgICAgICAgICAgICAgIHRydWUsCi0gICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICAgICAgICBzZXRPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TmV3T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLCB0cnVlIC8qZnJvbUNhY2hlKi8pLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICB9IGVsc2UgaWYgKHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewogICAgICAgICBpZiAocGF0Y2gtPnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgewogICAgICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMuZ2V0SW5wdXRGcm9tSWQocGF0Y2gtPnNpbmtzWzBdLmlkKTsKQEAgLTMyMzksMTAgKzM2NjMsMTAgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgYmFja3VwQ29uZmlnOworICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBiYWNrdXBDb25maWcgPSB7fTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvcnRDb25maWctPmFwcGx5QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZywgJmJhY2t1cENvbmZpZyk7CiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgbmV3Q29uZmlnOworICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgbmV3Q29uZmlnID0ge307CiAgICAgICAgIGF1ZGlvUG9ydENvbmZpZy0+dG9BdWRpb1BvcnRDb25maWcoJm5ld0NvbmZpZywgY29uZmlnKTsKICAgICAgICAgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPnNldEF1ZGlvUG9ydENvbmZpZygmbmV3Q29uZmlnLCAwKTsKICAgICB9CkBAIC0zMjcwLDMxICszNjk0LDMxIEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tTdHJhdGVneVJvdXRlKHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91cHR1dFRvU2tpcCkKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja1N0cmF0ZWd5Um91dGUocHJvZHVjdF9zdHJhdGVneV90IHBzLCBhdWRpb19pb19oYW5kbGVfdCBvdXB0dXRUb1NraXApCiB7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKGRldmljZSwgbU91dHB1dHMpOworICAgIC8vIFRha2UgdGhlIGZpcnN0IGF0dHJpYnV0ZXMgZm9sbG93aW5nIHRoZSBwcm9kdWN0IHN0cmF0ZWd5IGFzIGl0IGlzIHVzZWQgdG8gcmV0cmlldmUgdGhlIHJvdXRlZAorICAgIC8vIGRldmljZS4gQWxsIGF0dHJpYnV0ZXMgd2loaW4gYSBzdHJhdGVneSBmb2xsb3dzIHRoZSBzYW1lICJyb3V0aW5nIHN0cmF0ZWd5IgorICAgIGF1dG8gYXR0cmlidXRlcyA9IG1FbmdpbmUtPmdldEFsbEF0dHJpYnV0ZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHMpLmZyb250KCk7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBudWxscHRyLCBmYWxzZSk7CisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZXMoZGV2aWNlcywgbU91dHB1dHMpOwogICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbU91dHB1dHMuc2l6ZSgpOyBqKyspIHsKICAgICAgICAgaWYgKG1PdXRwdXRzLmtleUF0KGopID09IG91cHR1dFRvU2tpcCkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGopOwotICAgICAgICBpZiAoIWlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgKHJvdXRpbmdfc3RyYXRlZ3kpc3RyYXRlZ3kpKSB7CisgICAgICAgIGlmICghb3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZShwcykpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIC8vIElmIHRoZSBkZWZhdWx0IGRldmljZSBmb3IgdGhpcyBzdHJhdGVneSBpcyBvbiBhbm90aGVyIG91dHB1dCBtaXgsCiAgICAgICAgIC8vIGludmFsaWRhdGUgYWxsIHRyYWNrcyBpbiB0aGlzIHN0cmF0ZWd5IHRvIGZvcmNlIHJlIGNvbm5lY3Rpb24uCiAgICAgICAgIC8vIE90aGVyd2lzZSBzZWxlY3QgbmV3IGRldmljZSBvbiB0aGUgb3V0cHV0IG1peC4KICAgICAgICAgaWYgKG91dHB1dHMuaW5kZXhPZihtT3V0cHV0cy5rZXlBdChqKSkgPCAwKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IHN0cmVhbSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSkgPT0gc3RyYXRlZ3kpIHsKLSAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGF1dG8gc3RyZWFtIDogbUVuZ2luZS0+Z2V0U3RyZWFtVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHMpKSB7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oc3RyZWFtKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgbmV3RGV2aWNlLCBmYWxzZSk7CisgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYywgZ2V0TmV3T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKSwgZmFsc2UpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMzMwMiwxMyArMzcyNiwxOCBAQAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsZWFyU2Vzc2lvblJvdXRlcyh1aWRfdCB1aWQpCiB7CiAgICAgLy8gcmVtb3ZlIG91dHB1dCByb3V0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdWlkCi0gICAgU29ydGVkVmVjdG9yPHJvdXRpbmdfc3RyYXRlZ3k+IGFmZmVjdGVkU3RyYXRlZ2llczsKLSAgICBmb3IgKHNzaXplX3QgaSA9IChzc2l6ZV90KW1PdXRwdXRSb3V0ZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pICB7Ci0gICAgICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBtT3V0cHV0Um91dGVzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChyb3V0ZS0+bVVpZCA9PSB1aWQpIHsKLSAgICAgICAgICAgIG1PdXRwdXRSb3V0ZXMucmVtb3ZlSXRlbXNBdChpKTsKLSAgICAgICAgICAgIGlmIChyb3V0ZS0+bURldmljZURlc2NyaXB0b3IgIT0gMCkgewotICAgICAgICAgICAgICAgIGFmZmVjdGVkU3RyYXRlZ2llcy5hZGQoZ2V0U3RyYXRlZ3kocm91dGUtPm1TdHJlYW1UeXBlKSk7CisgICAgc3RkOjp2ZWN0b3I8cHJvZHVjdF9zdHJhdGVneV90PiBhZmZlY3RlZFN0cmF0ZWdpZXM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IG91dHB1dERlc2MtPmdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgICAgIGlmIChjbGllbnQtPmhhc1ByZWZlcnJlZERldmljZSgpICYmIGNsaWVudC0+dWlkKCkgPT0gdWlkKSB7CisgICAgICAgICAgICAgICAgY2xpZW50LT5zZXRQcmVmZXJyZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKKyAgICAgICAgICAgICAgICBhdXRvIGNsaWVudFN0cmF0ZWd5ID0gY2xpZW50LT5zdHJhdGVneSgpOworICAgICAgICAgICAgICAgIGlmIChzdGQ6OmZpbmQoYmVnaW4oYWZmZWN0ZWRTdHJhdGVnaWVzKSwgZW5kKGFmZmVjdGVkU3RyYXRlZ2llcyksIGNsaWVudFN0cmF0ZWd5KSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgZW5kKGFmZmVjdGVkU3RyYXRlZ2llcykpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFmZmVjdGVkU3RyYXRlZ2llcy5wdXNoX2JhY2soY2xpZW50LT5zdHJhdGVneSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTMzMTksMTIgKzM3NDgsMTIgQEAKIAogICAgIC8vIHJlbW92ZSBpbnB1dCByb3V0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdWlkCiAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX3NvdXJjZV90PiBhZmZlY3RlZFNvdXJjZXM7Ci0gICAgZm9yIChzc2l6ZV90IGkgPSAoc3NpemVfdCltSW5wdXRSb3V0ZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pICB7Ci0gICAgICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBtSW5wdXRSb3V0ZXMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKHJvdXRlLT5tVWlkID09IHVpZCkgewotICAgICAgICAgICAgbUlucHV0Um91dGVzLnJlbW92ZUl0ZW1zQXQoaSk7Ci0gICAgICAgICAgICBpZiAocm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yICE9IDApIHsKLSAgICAgICAgICAgICAgICBhZmZlY3RlZFNvdXJjZXMuYWRkKHJvdXRlLT5tU291cmNlKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBpbnB1dERlc2MtPmdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgICAgIGlmIChjbGllbnQtPmhhc1ByZWZlcnJlZERldmljZSgpICYmIGNsaWVudC0+dWlkKCkgPT0gdWlkKSB7CisgICAgICAgICAgICAgICAgY2xpZW50LT5zZXRQcmVmZXJyZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKKyAgICAgICAgICAgICAgICBhZmZlY3RlZFNvdXJjZXMuYWRkKGNsaWVudC0+c291cmNlKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMzMzMiw3ICszNzYxLDcgQEAKICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IGlucHV0c1RvQ2xvc2U7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChhZmZlY3RlZFNvdXJjZXMuaW5kZXhPZihpbnB1dERlc2MtPmlucHV0U291cmNlKCkpID49IDApIHsKKyAgICAgICAgaWYgKGFmZmVjdGVkU291cmNlcy5pbmRleE9mKGlucHV0RGVzYy0+c291cmNlKCkpID49IDApIHsKICAgICAgICAgICAgIGlucHV0c1RvQ2xvc2UuYWRkKGlucHV0RGVzYy0+bUlvSGFuZGxlKTsKICAgICAgICAgfQogICAgIH0KQEAgLTMzNDQsOCArMzc3Myw4IEBACiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xlYXJBdWRpb1NvdXJjZXModWlkX3QgdWlkKQogewogICAgIGZvciAoc3NpemVfdCBpID0gKHNzaXplX3QpbUF1ZGlvU291cmNlcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgIHsKLSAgICAgICAgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAoc291cmNlRGVzYy0+bVVpZCA9PSB1aWQpIHsKKyAgICAgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gc291cmNlRGVzYyA9IG1BdWRpb1NvdXJjZXMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKHNvdXJjZURlc2MtPnVpZCgpID09IHVpZCkgewogICAgICAgICAgICAgc3RvcEF1ZGlvU291cmNlKG1BdWRpb1NvdXJjZXMua2V5QXQoaSkpOwogICAgICAgICB9CiAgICAgfQpAQCAtMzM1Nyw4NyArMzc4NiwxMTAgQEAKIHsKICAgICAqc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpbXBDbGllbnRJbnRlcmZhY2UtPm5ld0F1ZGlvVW5pcXVlSWQoQVVESU9fVU5JUVVFX0lEX1VTRV9TRVNTSU9OKTsKICAgICAqaW9IYW5kbGUgPSAoYXVkaW9faW9faGFuZGxlX3QpbXBDbGllbnRJbnRlcmZhY2UtPm5ld0F1ZGlvVW5pcXVlSWQoQVVESU9fVU5JUVVFX0lEX1VTRV9JTlBVVCk7Ci0gICAgKmRldmljZSA9IGdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKEFVRElPX1NPVVJDRV9IT1RXT1JEKTsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciA9IHsgLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9IT1RXT1JEIH07CisgICAgKmRldmljZSA9IG1FbmdpbmUtPmdldElucHV0RGV2aWNlRm9yQXR0cmlidXRlcyhhdHRyKS0+dHlwZSgpOwogCiAgICAgcmV0dXJuIG1Tb3VuZFRyaWdnZXJTZXNzaW9ucy5hY3F1aXJlU2Vzc2lvbigqc2Vzc2lvbiwgKmlvSGFuZGxlKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkKIHsKLSAgICBBTE9HVigiJXMgc291cmNlICVwIGF0dHJpYnV0ZXMgJXAgaGFuZGxlICVwIiwgX19GVU5DVElPTl9fLCBzb3VyY2UsIGF0dHJpYnV0ZXMsIGhhbmRsZSk7Ci0gICAgaWYgKHNvdXJjZSA9PSBOVUxMIHx8IGF0dHJpYnV0ZXMgPT0gTlVMTCB8fCBoYW5kbGUgPT0gTlVMTCkgeworICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgKnBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisKKyAgICBpZiAoc291cmNlID09IE5VTEwgfHwgYXR0cmlidXRlcyA9PSBOVUxMIHx8IHBvcnRJZCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCIlcyBpbnZhbGlkIGFyZ3VtZW50OiBzb3VyY2UgJXAgYXR0cmlidXRlcyAlcCBoYW5kbGUgJXAiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNvdXJjZSwgYXR0cmlidXRlcywgcG9ydElkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICAqaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0KICAgICBpZiAoc291cmNlLT5yb2xlICE9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UgfHwKICAgICAgICAgICAgIHNvdXJjZS0+dHlwZSAhPSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7Ci0gICAgICAgIEFMT0dWKCIlcyBJTlZBTElEX09QRVJBVElPTiBzb3VyY2UtPnJvbGUgJWQgc291cmNlLT50eXBlICVkIiwgX19GVU5DVElPTl9fLCBzb3VyY2UtPnJvbGUsIHNvdXJjZS0+dHlwZSk7CisgICAgICAgIEFMT0dXKCIlcyBJTlZBTElEX09QRVJBVElPTiBzb3VyY2UtPnJvbGUgJWQgc291cmNlLT50eXBlICVkIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzb3VyY2UtPnJvbGUsIHNvdXJjZS0+dHlwZSk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzcmNEZXZpY2VEZXNjID0KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzcmNEZXZpY2UgPQogICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2Uoc291cmNlLT5leHQuZGV2aWNlLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChzb3VyY2UtPmV4dC5kZXZpY2UuYWRkcmVzcykpOwotICAgIGlmIChzcmNEZXZpY2VEZXNjID09IDApIHsKLSAgICAgICAgQUxPR1YoIiVzIHNvdXJjZS0+ZXh0LmRldmljZS50eXBlICUwOHggbm90IGZvdW5kIiwgX19GVU5DVElPTl9fLCBzb3VyY2UtPmV4dC5kZXZpY2UudHlwZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KHNvdXJjZS0+ZXh0LmRldmljZS5hZGRyZXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICBpZiAoc3JjRGV2aWNlID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzIHNvdXJjZS0+ZXh0LmRldmljZS50eXBlICUwOHggbm90IGZvdW5kIiwgX19GVU5DVElPTl9fLCBzb3VyY2UtPmV4dC5kZXZpY2UudHlwZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gc291cmNlRGVzYyA9Ci0gICAgICAgICAgICBuZXcgQXVkaW9Tb3VyY2VEZXNjcmlwdG9yKHNyY0RldmljZURlc2MsIGF0dHJpYnV0ZXMsIHVpZCk7CiAKLSAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggZHVtbXlQYXRjaDsKKyAgICAqcG9ydElkID0gQXVkaW9Qb3J0OjpnZXROZXh0VW5pcXVlSWQoKTsKKworICAgIHN0cnVjdCBhdWRpb19wYXRjaCBkdW1teVBhdGNoID0ge307CiAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbmV3IEF1ZGlvUGF0Y2goJmR1bW15UGF0Y2gsIHVpZCk7Ci0gICAgc291cmNlRGVzYy0+bVBhdGNoRGVzYyA9IHBhdGNoRGVzYzsKKworICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IHNvdXJjZURlc2MgPQorICAgICAgICBuZXcgU291cmNlQ2xpZW50RGVzY3JpcHRvcigqcG9ydElkLCB1aWQsICphdHRyaWJ1dGVzLCBwYXRjaERlc2MsIHNyY0RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVuZ2luZS0+Z2V0U3RyZWFtVHlwZUZvckF0dHJpYnV0ZXMoKmF0dHJpYnV0ZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRW5naW5lLT5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKCphdHRyaWJ1dGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Wb2x1bWVTb3VyY2UoKmF0dHJpYnV0ZXMpKTsKIAogICAgIHN0YXR1c190IHN0YXR1cyA9IGNvbm5lY3RBdWRpb1NvdXJjZShzb3VyY2VEZXNjKTsKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIG1BdWRpb1NvdXJjZXMuYWRkKHNvdXJjZURlc2MtPmdldEhhbmRsZSgpLCBzb3VyY2VEZXNjKTsKLSAgICAgICAgKmhhbmRsZSA9IHNvdXJjZURlc2MtPmdldEhhbmRsZSgpOworICAgICAgICBtQXVkaW9Tb3VyY2VzLmFkZCgqcG9ydElkLCBzb3VyY2VEZXNjKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjb25uZWN0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiYgc291cmNlRGVzYykKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y29ubmVjdEF1ZGlvU291cmNlKGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKQogewotICAgIEFMT0dWKCIlcyBoYW5kbGUgJWQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZURlc2MtPmdldEhhbmRsZSgpKTsKKyAgICBBTE9HVigiJXMgaGFuZGxlICVkIiwgX19GVU5DVElPTl9fLCBzb3VyY2VEZXNjLT5wb3J0SWQoKSk7CiAKICAgICAvLyBtYWtlIHN1cmUgd2Ugb25seSBoYXZlIG9uZSBwYXRjaCBwZXIgc291cmNlLgogICAgIGRpc2Nvbm5lY3RBdWRpb1NvdXJjZShzb3VyY2VEZXNjKTsKIAotICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSAocm91dGluZ19zdHJhdGVneSkgZ2V0U3RyYXRlZ3lGb3JBdHRyKCZzb3VyY2VEZXNjLT5tQXR0cmlidXRlcyk7Ci0gICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBzdHJlYW1UeXBlZnJvbUF0dHJpYnV0ZXNJbnQoJnNvdXJjZURlc2MtPm1BdHRyaWJ1dGVzKTsKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzcmNEZXZpY2VEZXNjID0gc291cmNlRGVzYy0+bURldmljZTsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHNvdXJjZURlc2MtPmF0dHJpYnV0ZXMoKTsKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IHNvdXJjZURlc2MtPnN0cmVhbSgpOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNyY0RldmljZSA9IHNvdXJjZURlc2MtPnNyY0RldmljZSgpOwogCi0gICAgYXVkaW9fZGV2aWNlc190IHNpbmtEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgdHJ1ZSk7Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc2lua0RldmljZURlc2MgPQotICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlKHNpbmtEZXZpY2UsIFN0cmluZzgoIiIpKTsKKyAgICBEZXZpY2VWZWN0b3Igc2lua0RldmljZXMgPQorICAgICAgICAgICAgbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgbnVsbHB0ciwgdHJ1ZSk7CisgICAgQUxPR19BU1NFUlQoIXNpbmtEZXZpY2VzLmlzRW1wdHkoKSwgImNvbm5lY3RBdWRpb1NvdXJjZSgpOiBubyBkZXZpY2UgZm91bmQgZm9yIGF0dHJpYnV0ZXMiKTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzaW5rRGV2aWNlID0gc2lua0RldmljZXMuaXRlbUF0KDApOworICAgIEFMT0dfQVNTRVJUKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmNvbnRhaW5zKHNpbmtEZXZpY2UpLCAiJXM6IERldmljZSAlcyBub3QgYXZhaWxhYmxlIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHNpbmtEZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAKICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCA9ICZzb3VyY2VEZXNjLT5tUGF0Y2hEZXNjLT5tUGF0Y2g7CiAKLSAgICBpZiAoc3JjRGV2aWNlRGVzYy0+Z2V0QXVkaW9Qb3J0KCktPm1Nb2R1bGUtPmdldEhhbmRsZSgpID09Ci0gICAgICAgICAgICBzaW5rRGV2aWNlRGVzYy0+Z2V0QXVkaW9Qb3J0KCktPm1Nb2R1bGUtPmdldEhhbmRsZSgpICYmCi0gICAgICAgICAgICBzcmNEZXZpY2VEZXNjLT5nZXRBdWRpb1BvcnQoKS0+bU1vZHVsZS0+Z2V0SGFsVmVyc2lvbk1ham9yKCkgPj0gMyAmJgotICAgICAgICAgICAgc3JjRGV2aWNlRGVzYy0+Z2V0QXVkaW9Qb3J0KCktPm1HYWlucy5zaXplKCkgPiAwKSB7Ci0gICAgICAgIEFMT0dWKCIlcyBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wIiwgX19GVU5DVElPTl9fKTsKKyAgICBpZiAoc3JjRGV2aWNlLT5oYXNTYW1lSHdNb2R1bGVBcyhzaW5rRGV2aWNlKSAmJgorICAgICAgICAgICAgc3JjRGV2aWNlLT5nZXRNb2R1bGVWZXJzaW9uTWFqb3IoKSA+PSAzICYmCisgICAgICAgICAgICBzaW5rRGV2aWNlLT5nZXRNb2R1bGUoKS0+c3VwcG9ydHNQYXRjaChzcmNEZXZpY2UsIHNpbmtEZXZpY2UpICYmCisgICAgICAgICAgICBzcmNEZXZpY2UtPmdldEF1ZGlvUG9ydCgpLT5tR2FpbnMuc2l6ZSgpID4gMCkgeworICAgICAgICBBTE9HVigiJXMgRGV2aWNlIHRvIERldmljZSByb3V0ZSBzdXBwb3J0ZWQgYnkgPj0zLjAgSEFMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgLy8gVE9ETzogbWF5IGV4cGxpY2l0bHkgc3BlY2lmeSB3aGV0aGVyIHdlIHNob3VsZCB1c2UgSFcgb3IgU1cgcGF0Y2gKICAgICAgICAgLy8gICBjcmVhdGUgcGF0Y2ggYmV0d2VlbiBzcmMgZGV2aWNlIGFuZCBvdXRwdXQgZGV2aWNlCiAgICAgICAgIC8vICAgY3JlYXRlIEh3b3V0cHV0IGFuZCBhZGQgdG8gbUh3T3V0cHV0cwogICAgIH0gZWxzZSB7Ci0gICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2Uoc2lua0RldmljZSwgbU91dHB1dHMpOwotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPQotICAgICAgICAgICAgICAgIHNlbGVjdE91dHB1dChvdXRwdXRzLCBBVURJT19PVVRQVVRfRkxBR19OT05FLCBBVURJT19GT1JNQVRfSU5WQUxJRCk7CisgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCByZXN1bHRBdHRyOworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgYXVkaW9fY29uZmlnX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBzb3VyY2VEZXNjLT5jb25maWcoKS5zYW1wbGVfcmF0ZTsKKyAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IHNvdXJjZURlc2MtPmNvbmZpZygpLmNoYW5uZWxfbWFzazsKKyAgICAgICAgY29uZmlnLmZvcm1hdCA9IHNvdXJjZURlc2MtPmNvbmZpZygpLmZvcm1hdDsKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOworICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICAgICBib29sIGlzUmVxdWVzdGVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlID0gZmFsc2U7CisgICAgICAgIHN0ZDo6dmVjdG9yPHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4gc2Vjb25kYXJ5T3V0cHV0czsKKyAgICAgICAgZ2V0T3V0cHV0Rm9yQXR0ckludCgmcmVzdWx0QXR0ciwgJm91dHB1dCwgQVVESU9fU0VTU0lPTl9OT05FLAorICAgICAgICAgICAgICAgICZhdHRyaWJ1dGVzLCAmc3RyZWFtLCBzb3VyY2VEZXNjLT51aWQoKSwgJmNvbmZpZywgJmZsYWdzLAorICAgICAgICAgICAgICAgICZzZWxlY3RlZERldmljZUlkLCAmaXNSZXF1ZXN0ZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UsCisgICAgICAgICAgICAgICAgJnNlY29uZGFyeU91dHB1dHMpOwogICAgICAgICBpZiAob3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMgbm8gb3V0cHV0IGZvciBkZXZpY2UgJTA4eCIsIF9fRlVOQ1RJT05fXywgc2lua0RldmljZSk7CisgICAgICAgICAgICBBTE9HVigiJXMgbm8gb3V0cHV0IGZvciBkZXZpY2UgJTA4eCIsIF9fRlVOQ1RJT05fXywgc2lua0RldmljZXMudHlwZXMoKSk7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwogICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyBvdXRwdXQgZm9yIGRldmljZSAlMDh4IGlzIGR1cGxpY2F0ZWQiLCBfX0ZVTkNUSU9OX18sIHNpbmtEZXZpY2UpOworICAgICAgICAgICAgQUxPR1YoIiVzIG91dHB1dCBmb3IgZGV2aWNlICUwOHggaXMgZHVwbGljYXRlZCIsIF9fRlVOQ1RJT05fXywgc2lua0RldmljZXMudHlwZXMoKSk7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgIH0KICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3V0cHV0RGVzYy0+c3RhcnQoKTsKQEAgLTM0NTAsNTEgKzM5MDIsNTggQEAKICAgICAgICAgLy8gYmUgY29ubmVjdGVkIGFzIHdlbGwgYXMgdGhlIHN0cmVhbSB0eXBlIGZvciB2b2x1bWUgY29udHJvbAogICAgICAgICAvLyAtIHRoZSBzaW5rIGlzIGRlZmluZWQgYnkgd2hhdGV2ZXIgb3V0cHV0IGRldmljZSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQgZm9yIHRoZSBvdXRwdXQKICAgICAgICAgLy8gdGhvdWdoIHdoaWNoIHRoaXMgcGF0Y2ggaXMgcm91dGVkLgotICAgICAgICBwYXRjaC0+bnVtX3NpbmtzID0gMDsKLSAgICAgICAgcGF0Y2gtPm51bV9zb3VyY2VzID0gMjsKLSAgICAgICAgc3JjRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLT5zb3VyY2VzWzBdLCBOVUxMKTsKLSAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLT5zb3VyY2VzWzFdLCBOVUxMKTsKLSAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMV0uZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IHN0cmVhbTsKLSAgICAgICAgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2gsCisgICAgICAgIFBhdGNoQnVpbGRlciBwYXRjaEJ1aWxkZXI7CisgICAgICAgIHBhdGNoQnVpbGRlci5hZGRTb3VyY2Uoc3JjRGV2aWNlKS5hZGRTb3VyY2Uob3V0cHV0RGVzYywgeyAuc3RyZWFtID0gc3RyZWFtIH0pOworICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaEJ1aWxkZXIucGF0Y2goKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmUGF0Y2hIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwogICAgICAgICBBTE9HVigiJXMgcGF0Y2ggcGFuZWwgcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYWZQYXRjaEhhbmRsZSk7CisgICAgICAgIHNvdXJjZURlc2MtPnBhdGNoRGVzYygpLT5tUGF0Y2ggPSAqcGF0Y2hCdWlsZGVyLnBhdGNoKCk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIEFMT0dXKCIlcyBwYXRjaCBwYW5lbCBjb3VsZCBub3QgY29ubmVjdCBkZXZpY2UgcGF0Y2gsIGVycm9yICVkIiwKICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgfQorCisgICAgICAgIGlmIChvdXRwdXREZXNjLT5nZXRDbGllbnQoc291cmNlRGVzYy0+cG9ydElkKCkpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcyBzb3VyY2UgcG9ydElkIGhhcyBhbHJlYWR5IGJlZW4gYXR0YWNoZWQgdG8gb3V0cHV0RGVzYyIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXREZXNjLT5hZGRDbGllbnQoc291cmNlRGVzYyk7CisKICAgICAgICAgdWludDMyX3QgZGVsYXlNcyA9IDA7Ci0gICAgICAgIHN0YXR1cyA9IHN0YXJ0U291cmNlKG91dHB1dERlc2MsIHN0cmVhbSwgc2lua0RldmljZSwgTlVMTCwgJmRlbGF5TXMpOworICAgICAgICBzdGF0dXMgPSBzdGFydFNvdXJjZShvdXRwdXREZXNjLCBzb3VyY2VEZXNjLCAmZGVsYXlNcyk7CiAKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHNvdXJjZURlc2MtPm1QYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChzb3VyY2VEZXNjLT5wYXRjaERlc2MoKS0+bUFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICAgICAgb3V0cHV0RGVzYy0+cmVtb3ZlQ2xpZW50KHNvdXJjZURlc2MtPnBvcnRJZCgpKTsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPnN0b3AoKTsKICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgIH0KLSAgICAgICAgc291cmNlRGVzYy0+bVN3T3V0cHV0ID0gb3V0cHV0RGVzYzsKKyAgICAgICAgc291cmNlRGVzYy0+c2V0U3dPdXRwdXQob3V0cHV0RGVzYyk7CiAgICAgICAgIGlmIChkZWxheU1zICE9IDApIHsKICAgICAgICAgICAgIHVzbGVlcChkZWxheU1zICogMTAwMCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzb3VyY2VEZXNjLT5tUGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7Ci0gICAgYWRkQXVkaW9QYXRjaChzb3VyY2VEZXNjLT5tUGF0Y2hEZXNjLT5tSGFuZGxlLCBzb3VyY2VEZXNjLT5tUGF0Y2hEZXNjKTsKKyAgICBzb3VyY2VEZXNjLT5wYXRjaERlc2MoKS0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOworICAgIGFkZEF1ZGlvUGF0Y2goc291cmNlRGVzYy0+cGF0Y2hEZXNjKCktPm1IYW5kbGUsIHNvdXJjZURlc2MtPnBhdGNoRGVzYygpKTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlIF9fdW51c2VkKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUZvcihoYW5kbGUpOwotICAgIEFMT0dWKCIlcyBoYW5kbGUgJWQiLCBfX0ZVTkNUSU9OX18sIGhhbmRsZSk7CisgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gc291cmNlRGVzYyA9IG1BdWRpb1NvdXJjZXMudmFsdWVGb3IocG9ydElkKTsKKyAgICBBTE9HVigiJXMgcG9ydCBJRCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKICAgICBpZiAoc291cmNlRGVzYyA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlcyB1bmtub3duIHNvdXJjZSBmb3IgaGFuZGxlICVkIiwgX19GVU5DVElPTl9fLCBoYW5kbGUpOworICAgICAgICBBTE9HVygiJXMgdW5rbm93biBzb3VyY2UgZm9yIHBvcnQgSUQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIHN0YXR1c190IHN0YXR1cyA9IGRpc2Nvbm5lY3RBdWRpb1NvdXJjZShzb3VyY2VEZXNjKTsKIAotICAgIG1BdWRpb1NvdXJjZXMucmVtb3ZlSXRlbShoYW5kbGUpOworICAgIG1BdWRpb1NvdXJjZXMucmVtb3ZlSXRlbShwb3J0SWQpOwogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTM1MzksNTEgKzM5OTgsNyBAQAogZmxvYXQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdHJlYW1Wb2x1bWVEQigKICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleCwgYXVkaW9fZGV2aWNlc190IGRldmljZSkKIHsKLSAgICByZXR1cm4gY29tcHV0ZVZvbHVtZShzdHJlYW0sIGluZGV4LCBkZXZpY2UpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN1cHBvcnRlZEZvcm1hdHMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9ybWF0VmVjdG9yJiBmb3JtYXRzKSB7Ci0gICAgaWYgKGlvSGFuZGxlID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIFN0cmluZzggcmVwbHk7Ci0gICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycygKLSAgICAgICAgICAgIGlvSGFuZGxlLCBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRGb3JtYXRzKSk7Ci0gICAgQUxPR1YoIiVzOiBzdXBwb3J0ZWQgZm9ybWF0cyAlcyIsIF9fRlVOQ1RJT05fXywgcmVwbHkuc3RyaW5nKCkpOwotICAgIEF1ZGlvUGFyYW1ldGVyIHJlcGxpZWRQYXJhbWV0ZXJzKHJlcGx5KTsKLSAgICBpZiAocmVwbGllZFBhcmFtZXRlcnMuZ2V0KAotICAgICAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkRm9ybWF0cyksIHJlcGx5KSAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byByZXRyaWV2ZSBmb3JtYXQsIGJhaWxpbmcgb3V0IiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgZm9yIChhdXRvIGZvcm1hdCA6IGZvcm1hdHNGcm9tU3RyaW5nKHJlcGx5LnN0cmluZygpKSkgewotICAgICAgICAvLyBPbmx5IEFVRElPX0ZPUk1BVF9BQUNfTEMgd2lsbCBiZSB1c2VkIGluIFNldHRpbmdzIFVJIGZvciBhbGwgQUFDIGZvcm1hdHMuCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShBQUNfRk9STUFUUyk7IGkrKykgewotICAgICAgICAgICAgaWYgKGZvcm1hdCA9PSBBQUNfRk9STUFUU1tpXSkgewotICAgICAgICAgICAgICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9BQUNfTEM7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbCBleGlzdCA9IGZhbHNlOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gZm9ybWF0c1tpXSkgewotICAgICAgICAgICAgICAgIGV4aXN0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBib29sIGlzU3Vycm91bmRGb3JtYXQgPSBmYWxzZTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKFNVUlJPVU5EX0ZPUk1BVFMpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChTVVJST1VORF9GT1JNQVRTW2ldID09IGZvcm1hdCkgewotICAgICAgICAgICAgICAgIGlzU3Vycm91bmRGb3JtYXQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICghZXhpc3QgJiYgaXNTdXJyb3VuZEZvcm1hdCkgewotICAgICAgICAgICAgZm9ybWF0cy5hZGQoZm9ybWF0KTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgcmV0dXJuIGNvbXB1dGVWb2x1bWUoZ2V0Vm9sdW1lQ3VydmVzKHN0cmVhbSksIHRvVm9sdW1lU291cmNlKHN0cmVhbSksIGluZGV4LCBkZXZpY2UpOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN1cnJvdW5kRm9ybWF0cyh1bnNpZ25lZCBpbnQgKm51bVN1cnJvdW5kRm9ybWF0cywKQEAgLTM1OTUsMjYxICs0MDEwLDE5MyBAQAogICAgICAgICAgICAgKHN1cnJvdW5kRm9ybWF0cyA9PSBOVUxMIHx8IHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQgPT0gTlVMTCkpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIEFMT0dWKCJnZXRTdXJyb3VuZEZvcm1hdHMoKSBudW1TdXJyb3VuZEZvcm1hdHMgJWQgc3Vycm91bmRGb3JtYXRzICVwIHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQgJXAiLAotICAgICAgICAgICAgKm51bVN1cnJvdW5kRm9ybWF0cywgc3Vycm91bmRGb3JtYXRzLCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkKTsKLQotICAgIC8vIE9ubHkgcmV0dXJuIHZhbHVlIGlmIHRoZXJlIGlzIEhETUkgb3V0cHV0LgotICAgIGlmICgobUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSAmIEFVRElPX0RFVklDRV9PVVRfSERNSSkgPT0gMCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQorICAgIEFMT0dWKCIlcygpIG51bVN1cnJvdW5kRm9ybWF0cyAlZCBzdXJyb3VuZEZvcm1hdHMgJXAgc3Vycm91bmRGb3JtYXRzRW5hYmxlZCAlcCByZXBvcnRlZCAlZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgKm51bVN1cnJvdW5kRm9ybWF0cywgc3Vycm91bmRGb3JtYXRzLCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkLCByZXBvcnRlZCk7CiAKICAgICBzaXplX3QgZm9ybWF0c1dyaXR0ZW4gPSAwOwogICAgIHNpemVfdCBmb3JtYXRzTWF4ID0gKm51bVN1cnJvdW5kRm9ybWF0czsKLSAgICAqbnVtU3Vycm91bmRGb3JtYXRzID0gMDsKLSAgICBGb3JtYXRWZWN0b3IgZm9ybWF0czsKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IGZvcm1hdHM7IC8vIFVzZXMgcHJpbWFyeSBzdXJyb3VuZCBmb3JtYXRzIG9ubHkKICAgICBpZiAocmVwb3J0ZWQpIHsKLSAgICAgICAgLy8gT25seSBnZXQgc3Vycm91bmQgZm9ybWF0cyB3aGljaCBhcmUgcmVwb3J0ZWQgYnkgZGV2aWNlLgotICAgICAgICAvLyBGaXJzdCBsaXN0IGFscmVhZHkgb3BlbiBvdXRwdXRzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9IRE1JOwotICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHM7Ci0gICAgICAgIGJvb2wgcmVwb3J0ZWRGb3JtYXRGb3VuZCA9IGZhbHNlOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgKGRlc2MtPnN1cHBvcnRlZERldmljZXMoKSAmIGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRzLmFkZChtT3V0cHV0cy5rZXlBdChpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gT3BlbiBhbiBvdXRwdXQgdG8gcXVlcnkgZHluYW1pYyBwYXJhbWV0ZXJzLgotICAgICAgICBEZXZpY2VWZWN0b3IgaGRtaU91dHB1dERldmljZXMgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoCi0gICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9IRE1JKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZG1pT3V0cHV0RGV2aWNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gaGRtaU91dHB1dERldmljZXNbaV0tPm1BZGRyZXNzOwotICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6IG1Id01vZHVsZXMpIHsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpW2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydERldmljZShBVURJT19ERVZJQ0VfT1VUX0hETUkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+c3VwcG9ydERldmljZUFkZHJlc3MoYWRkcmVzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBqOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG91dHB1dHMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0cy5pdGVtQXQoaikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgZGVzYy0+bVByb2ZpbGUgPT0gcHJvZmlsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiAhPSBvdXRwdXRzLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGdldFN1cHBvcnRlZEZvcm1hdHMob3V0cHV0cy5pdGVtQXQoaiksIGZvcm1hdHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVkRm9ybWF0Rm91bmQgfD0gKHN0YXR1cyA9PSBOT19FUlJPUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJvZmlsZS0+Y2FuT3Blbk5ld0lvKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiTWF4IE91dHB1dCBudW1iZXIgJXUgYWxyZWFkeSBvcGVuZWQgZm9yIHRoaXMgcHJvZmlsZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bWF4T3BlbkNvdW50LCBwcm9maWxlLT5nZXRUYWdOYW1lKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJvcGVuaW5nIG91dHB1dCBmb3IgZGV2aWNlICUwOHggd2l0aCBwYXJhbXMgJXMgcHJvZmlsZSAlcCBuYW1lICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwgYWRkcmVzcy5zdHJpbmcoKSwgcHJvZmlsZS5nZXQoKSwgcHJvZmlsZS0+Z2V0TmFtZSgpLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MgPSBuZXcgU3dBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSwgbXBDbGllbnRJbnRlcmZhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNjLT5vcGVuKG51bGxwdHIsIGRldmljZSwgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX0RFRkFVTFQsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gZ2V0U3VwcG9ydGVkRm9ybWF0cyhvdXRwdXQsIGZvcm1hdHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVkRm9ybWF0Rm91bmQgfD0gKHN0YXR1cyA9PSBOT19FUlJPUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+Y2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgLy8gUmV0dXJuIGZvcm1hdHMgZnJvbSBhbGwgZGV2aWNlIHByb2ZpbGVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVzb2x2ZWQgYnkKKyAgICAgICAgLy8gY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkuCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF2YWlsYWJsZU91dHB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldOworICAgICAgICAgICAgRm9ybWF0VmVjdG9yIHN1cHBvcnRlZEZvcm1hdHMgPQorICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmdldEF1ZGlvUG9ydCgpLT5nZXRBdWRpb1Byb2ZpbGVzKCkuZ2V0U3VwcG9ydGVkRm9ybWF0cygpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzdXBwb3J0ZWRGb3JtYXRzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Db25maWcuZ2V0U3Vycm91bmRGb3JtYXRzKCkuY291bnQoc3VwcG9ydGVkRm9ybWF0c1tqXSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXRzLmluc2VydChzdXBwb3J0ZWRGb3JtYXRzW2pdKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHBhaXIgOiBtQ29uZmlnLmdldFN1cnJvdW5kRm9ybWF0cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFpci5zZWNvbmQuY291bnQoc3VwcG9ydGVkRm9ybWF0c1tqXSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMuaW5zZXJ0KHBhaXIuZmlyc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFyZXBvcnRlZEZvcm1hdEZvdW5kKSB7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShTVVJST1VORF9GT1JNQVRTKTsgaSsrKSB7Ci0gICAgICAgICAgICBmb3JtYXRzLmFkZChTVVJST1VORF9GT1JNQVRTW2ldKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogbUNvbmZpZy5nZXRTdXJyb3VuZEZvcm1hdHMoKSkgeworICAgICAgICAgICAgZm9ybWF0cy5pbnNlcnQocGFpci5maXJzdCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmb3JtYXRzLnNpemUoKTsgaSsrKSB7CisgICAgKm51bVN1cnJvdW5kRm9ybWF0cyA9IGZvcm1hdHMuc2l6ZSgpOworICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZm9yY2VVc2UgPSBtRW5naW5lLT5nZXRGb3JjZVVzZSgKKyAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORCk7CisgICAgZm9yIChjb25zdCBhdXRvJiBmb3JtYXQ6IGZvcm1hdHMpIHsKICAgICAgICAgaWYgKGZvcm1hdHNXcml0dGVuIDwgZm9ybWF0c01heCkgewotICAgICAgICAgICAgc3Vycm91bmRGb3JtYXRzW2Zvcm1hdHNXcml0dGVuXSA9IGZvcm1hdHNbaV07Ci0gICAgICAgICAgICBib29sIGZvcm1hdEVuYWJsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChmb3JtYXRzW2ldID09IEFVRElPX0ZPUk1BVF9BQUNfTEMpIHsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IEFSUkFZX1NJWkUoQUFDX0ZPUk1BVFMpOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0RW5hYmxlZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5maW5kKEFBQ19GT1JNQVRTW2ldKSAhPSBtU3Vycm91bmRGb3JtYXRzLmVuZCgpOworICAgICAgICAgICAgc3Vycm91bmRGb3JtYXRzW2Zvcm1hdHNXcml0dGVuXSA9IGZvcm1hdDsKKyAgICAgICAgICAgIGJvb2wgZm9ybWF0RW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICBzd2l0Y2ggKGZvcmNlVXNlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9NQU5VQUw6CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdEVuYWJsZWQgPSBtTWFudWFsU3Vycm91bmRGb3JtYXRzLmNvdW50KGZvcm1hdCkgIT0gMDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3JtYXRFbmFibGVkID0gbVN1cnJvdW5kRm9ybWF0cy5maW5kKGZvcm1hdHNbaV0pICE9IG1TdXJyb3VuZEZvcm1hdHMuZW5kKCk7CisgICAgICAgICAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9ORVZFUjoKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0RW5hYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiAvLyBBVVRPIG9yIEFMV0FZUyA9PiB0cnVlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3Vycm91bmRGb3JtYXRzRW5hYmxlZFtmb3JtYXRzV3JpdHRlbisrXSA9IGZvcm1hdEVuYWJsZWQ7CiAgICAgICAgIH0KLSAgICAgICAgKCpudW1TdXJyb3VuZEZvcm1hdHMpKys7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCkKIHsKLSAgICAvLyBDaGVjayBpZiBhdWRpbyBmb3JtYXQgaXMgYSBzdXJyb3VuZCBmb3JtYXRzLgotICAgIGJvb2wgaXNTdXJyb3VuZEZvcm1hdCA9IGZhbHNlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShTVVJST1VORF9GT1JNQVRTKTsgaSsrKSB7Ci0gICAgICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBTVVJST1VORF9GT1JNQVRTW2ldKSB7Ci0gICAgICAgICAgICBpc1N1cnJvdW5kRm9ybWF0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICghaXNTdXJyb3VuZEZvcm1hdCkgeworICAgIEFMT0dWKCIlcygpIGZvcm1hdCAweCVYIGVuYWJsZWQgJWQiLCBfX2Z1bmNfXywgYXVkaW9Gb3JtYXQsIGVuYWJsZWQpOworICAgIGNvbnN0IGF1dG8mIGZvcm1hdEl0ZXIgPSBtQ29uZmlnLmdldFN1cnJvdW5kRm9ybWF0cygpLmZpbmQoYXVkaW9Gb3JtYXQpOworICAgIGlmIChmb3JtYXRJdGVyID09IG1Db25maWcuZ2V0U3Vycm91bmRGb3JtYXRzKCkuZW5kKCkpIHsKKyAgICAgICAgQUxPR1coIiVzKCkgZm9ybWF0IDB4JVggaXMgbm90IGEga25vd24gc3Vycm91bmQgZm9ybWF0IiwgX19mdW5jX18sIGF1ZGlvRm9ybWF0KTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICAvLyBTaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiBNQU5VQUwuCi0gICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBmb3JjZVVzZSA9IG1FbmdpbmUtPmdldEZvcmNlVXNlKAotICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORCk7Ci0gICAgaWYgKGZvcmNlVXNlICE9IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX01BTlVBTCkgeworICAgIGlmIChtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQpICE9CisgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9NQU5VQUwpIHsKKyAgICAgICAgQUxPR1coIiVzKCkgbm90IGluIG1hbnVhbCBtb2RlIGZvciBzdXJyb3VuZCBzb3VuZCBmb3JtYXQgc2VsZWN0aW9uIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgaWYgKChtU3Vycm91bmRGb3JtYXRzLmZpbmQoYXVkaW9Gb3JtYXQpICE9IG1TdXJyb3VuZEZvcm1hdHMuZW5kKCkgJiYgZW5hYmxlZCkKLSAgICAgICAgICAgIHx8IChtU3Vycm91bmRGb3JtYXRzLmZpbmQoYXVkaW9Gb3JtYXQpID09IG1TdXJyb3VuZEZvcm1hdHMuZW5kKCkgJiYgIWVuYWJsZWQpKSB7CisgICAgaWYgKChtTWFudWFsU3Vycm91bmRGb3JtYXRzLmNvdW50KGF1ZGlvRm9ybWF0KSAhPSAwKSA9PSBlbmFibGVkKSB7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKLSAgICAvLyBUaGUgb3BlcmF0aW9uIGlzIHZhbGlkIG9ubHkgd2hlbiB0aGVyZSBpcyBIRE1JIG91dHB1dCBhdmFpbGFibGUuCi0gICAgaWYgKChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpICYgQVVESU9fREVWSUNFX09VVF9IRE1JKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IHN1cnJvdW5kRm9ybWF0c0JhY2t1cChtTWFudWFsU3Vycm91bmRGb3JtYXRzKTsKICAgICBpZiAoZW5hYmxlZCkgewotICAgICAgICBpZiAoYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX0FBQ19MQykgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKEFBQ19GT1JNQVRTKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5pbnNlcnQoQUFDX0ZPUk1BVFNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5pbnNlcnQoYXVkaW9Gb3JtYXQpOworICAgICAgICBtTWFudWFsU3Vycm91bmRGb3JtYXRzLmluc2VydChhdWRpb0Zvcm1hdCk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgc3ViRm9ybWF0IDogZm9ybWF0SXRlci0+c2Vjb25kKSB7CisgICAgICAgICAgICBtTWFudWFsU3Vycm91bmRGb3JtYXRzLmluc2VydChzdWJGb3JtYXQpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGF1ZGlvRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9BQUNfTEMpIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShBQUNfRk9STUFUUyk7IGkrKykgewotICAgICAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuZXJhc2UoQUFDX0ZPUk1BVFNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5lcmFzZShhdWRpb0Zvcm1hdCk7CisgICAgICAgIG1NYW51YWxTdXJyb3VuZEZvcm1hdHMuZXJhc2UoYXVkaW9Gb3JtYXQpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHN1YkZvcm1hdCA6IGZvcm1hdEl0ZXItPnNlY29uZCkgeworICAgICAgICAgICAgbU1hbnVhbFN1cnJvdW5kRm9ybWF0cy5lcmFzZShzdWJGb3JtYXQpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2M7CiAgICAgYm9vbCBwcm9maWxlVXBkYXRlZCA9IGZhbHNlOwotICAgIERldmljZVZlY3RvciBoZG1pT3V0cHV0RGV2aWNlcyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZSgKKyAgICBEZXZpY2VWZWN0b3IgaGRtaU91dHB1dERldmljZXMgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKAogICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9IRE1JKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhkbWlPdXRwdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIC8vIFNpbXVsYXRlIHJlY29ubmVjdGlvbiB0byB1cGRhdGUgZW5hYmxlZCBzdXJyb3VuZCBzb3VuZCBmb3JtYXRzLgotICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBoZG1pT3V0cHV0RGV2aWNlc1tpXS0+bUFkZHJlc3M7CisgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IGhkbWlPdXRwdXREZXZpY2VzW2ldLT5hZGRyZXNzKCk7CiAgICAgICAgIFN0cmluZzggbmFtZSA9IGhkbWlPdXRwdXREZXZpY2VzW2ldLT5nZXROYW1lKCk7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX0hETUksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgc3RhdHVzID0gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9PVVRfSERNSSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKICAgICAgICAgcHJvZmlsZVVwZGF0ZWQgfD0gKHN0YXR1cyA9PSBOT19FUlJPUik7CiAgICAgfQotICAgIERldmljZVZlY3RvciBoZG1pSW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoCisgICAgLy8gRklYTUU6IFdoeSBkb2luZyB0aGlzIGZvciBpbnB1dCBIRE1JIGRldmljZXMgaWYgd2UgZG9uJ3QgYXVnbWVudCB0aGVpciByZXBvcnRlZCBmb3JtYXRzPworICAgIERldmljZVZlY3RvciBoZG1pSW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVNYXNrKAogICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9IRE1JKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhkbWlJbnB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgLy8gU2ltdWxhdGUgcmVjb25uZWN0aW9uIHRvIHVwZGF0ZSBlbmFibGVkIHN1cnJvdW5kIHNvdW5kIGZvcm1hdHMuCi0gICAgICAgIFN0cmluZzggYWRkcmVzcyA9IGhkbWlJbnB1dERldmljZXNbaV0tPm1BZGRyZXNzOworICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBoZG1pSW5wdXREZXZpY2VzW2ldLT5hZGRyZXNzKCk7CiAgICAgICAgIFN0cmluZzggbmFtZSA9IGhkbWlJbnB1dERldmljZXNbaV0tPmdldE5hbWUoKTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9IRE1JLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIHN0YXR1cyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfSU5fSERNSSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKICAgICAgICAgcHJvZmlsZVVwZGF0ZWQgfD0gKHN0YXR1cyA9PSBOT19FUlJPUik7CiAgICAgfQogCi0gICAgLy8gVW5kbyB0aGUgc3Vycm91bmQgZm9ybWF0cyBjaGFuZ2UgZHVlIHRvIG5vIGF1ZGlvIHByb2ZpbGVzIHVwZGF0ZWQuCiAgICAgaWYgKCFwcm9maWxlVXBkYXRlZCkgewotICAgICAgICBpZiAoZW5hYmxlZCkgewotICAgICAgICAgICAgaWYgKGF1ZGlvRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9BQUNfTEMpIHsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoQUFDX0ZPUk1BVFMpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5lcmFzZShBQUNfRk9STUFUU1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmVyYXNlKGF1ZGlvRm9ybWF0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfQUFDX0xDKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKEFBQ19GT1JNQVRTKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuaW5zZXJ0KEFBQ19GT1JNQVRTW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuaW5zZXJ0KGF1ZGlvRm9ybWF0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBBTE9HVygiJXMoKSBubyBhdWRpbyBwcm9maWxlcyB1cGRhdGVkLCB1bmRvaW5nIHN1cnJvdW5kIGZvcm1hdHMgY2hhbmdlIiwgX19mdW5jX18pOworICAgICAgICBtTWFudWFsU3Vycm91bmRGb3JtYXRzID0gc3RkOjptb3ZlKHN1cnJvdW5kRm9ybWF0c0JhY2t1cCk7CiAgICAgfQogCiAgICAgcmV0dXJuIHByb2ZpbGVVcGRhdGVkID8gTk9fRVJST1IgOiBJTlZBTElEX09QRVJBVElPTjsKIH0KIAotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFJlY29yZFNpbGVuY2VkKHVpZF90IHVpZCwgYm9vbCBzaWxlbmNlZCkKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRBcHBTdGF0ZSh1aWRfdCB1aWQsIGFwcF9zdGF0ZV90IHN0YXRlKQogewotICAgIEFMT0dWKCJBdWRpb1BvbGljeU1hbmFnZXI6c2V0UmVjb3JkU2lsZW5jZWQodWlkOiVkLCBzaWxlbmNlZDolZCkiLCB1aWQsIHNpbGVuY2VkKTsKLQotICAgIFZlY3RvcjxzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gPiBhY3RpdmVJbnB1dHMgPSBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0aXZlSW5wdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBhY3RpdmVEZXNjID0gYWN0aXZlSW5wdXRzW2ldOwotICAgICAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIGFjdGl2ZVNlc3Npb25zID0gYWN0aXZlRGVzYy0+Z2V0QXVkaW9TZXNzaW9ucyh0cnVlKTsKLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBhY3RpdmVTZXNzaW9ucy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgc3A8QXVkaW9TZXNzaW9uPiBhY3RpdmVTZXNzaW9uID0gYWN0aXZlU2Vzc2lvbnMudmFsdWVBdChqKTsKLSAgICAgICAgICAgIGlmIChhY3RpdmVTZXNzaW9uLT51aWQoKSA9PSB1aWQpIHsKLSAgICAgICAgICAgICAgICBhY3RpdmVTZXNzaW9uLT5zZXRTaWxlbmNlZChzaWxlbmNlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICBBTE9HVigiJXModWlkOiVkLCBzdGF0ZTolZCkiLCBfX2Z1bmNfXywgdWlkLCBzdGF0ZSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1JbnB1dHMudmFsdWVBdChpKS0+c2V0QXBwU3RhdGUodWlkLCBzdGF0ZSk7CiAgICAgfQogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmRpc2Nvbm5lY3RBdWRpb1NvdXJjZShjb25zdCBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKQorYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKQogewotICAgIEFMT0dWKCIlcyBoYW5kbGUgJWQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZURlc2MtPmdldEhhbmRsZSgpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlcykgeworICAgICAgICBjb25zdCBPdXRwdXRQcm9maWxlQ29sbGVjdGlvbiAmb3V0cHV0UHJvZmlsZXMgPSBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZvdXRQcm9maWxlIDogb3V0cHV0UHJvZmlsZXMpIHsKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0IGF1ZGlvUG9ydDsKKyAgICAgICAgICAgIG91dFByb2ZpbGUtPnRvQXVkaW9Qb3J0KCZhdWRpb1BvcnQpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdWRpb1BvcnQubnVtX2NoYW5uZWxfbWFza3M7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChhdWRpb1BvcnQuY2hhbm5lbF9tYXNrc1tpXSAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQogCi0gICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUZvcihzb3VyY2VEZXNjLT5tUGF0Y2hEZXNjLT5tSGFuZGxlKTsKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6ZGlzY29ubmVjdEF1ZGlvU291cmNlKGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKQoreworICAgIEFMT0dWKCIlcyBwb3J0IElkICVkIiwgX19GVU5DVElPTl9fLCBzb3VyY2VEZXNjLT5wb3J0SWQoKSk7CisKKyAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlRm9yKHNvdXJjZURlc2MtPnBhdGNoRGVzYygpLT5tSGFuZGxlKTsKICAgICBpZiAocGF0Y2hEZXNjID09IDApIHsKICAgICAgICAgQUxPR1coIiVzIHNvdXJjZSBoYXMgbm8gcGF0Y2ggd2l0aCBoYW5kbGUgJWQiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgIHNvdXJjZURlc2MtPm1QYXRjaERlc2MtPm1IYW5kbGUpOworICAgICAgICAgICAgICBzb3VyY2VEZXNjLT5wYXRjaERlc2MoKS0+bUhhbmRsZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHJlbW92ZUF1ZGlvUGF0Y2goc291cmNlRGVzYy0+bVBhdGNoRGVzYy0+bUhhbmRsZSk7CisgICAgcmVtb3ZlQXVkaW9QYXRjaChzb3VyY2VEZXNjLT5wYXRjaERlc2MoKS0+bUhhbmRsZSk7CiAKLSAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludCgmc291cmNlRGVzYy0+bUF0dHJpYnV0ZXMpOwotICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzd091dHB1dERlc2MgPSBzb3VyY2VEZXNjLT5tU3dPdXRwdXQucHJvbW90ZSgpOworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzd091dHB1dERlc2MgPSBzb3VyY2VEZXNjLT5zd091dHB1dCgpLnByb21vdGUoKTsKICAgICBpZiAoc3dPdXRwdXREZXNjICE9IDApIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RvcFNvdXJjZShzd091dHB1dERlc2MsIHN0cmVhbSwgZmFsc2UpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdG9wU291cmNlKHN3T3V0cHV0RGVzYywgc291cmNlRGVzYyk7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHN3T3V0cHV0RGVzYy0+c3RvcCgpOwogICAgICAgICB9CisgICAgICAgIHN3T3V0cHV0RGVzYy0+cmVtb3ZlQ2xpZW50KHNvdXJjZURlc2MtPnBvcnRJZCgpKTsKICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIDApOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHNwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBod091dHB1dERlc2MgPSBzb3VyY2VEZXNjLT5tSHdPdXRwdXQucHJvbW90ZSgpOworICAgICAgICBzcDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gaHdPdXRwdXREZXNjID0gc291cmNlRGVzYy0+aHdPdXRwdXQoKS5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChod091dHB1dERlc2MgIT0gMCkgewogICAgICAgICAgIC8vICAgcmVsZWFzZSBwYXRjaCBiZXR3ZWVuIHNyYyBkZXZpY2UgYW5kIG91dHB1dCBkZXZpY2UKICAgICAgICAgICAvLyAgIGNsb3NlIEh3b3V0cHV0IGFuZCByZW1vdmUgZnJvbSBtSHdPdXRwdXRzCkBAIC0zODYwLDE2ICs0MjA3LDE1IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U291cmNlRm9yU3RyYXRlZ3lPbk91dHB1dCgKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LCByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KQorc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTb3VyY2VGb3JBdHRyaWJ1dGVzT25PdXRwdXQoCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKQogewotICAgIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gc291cmNlOworICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IHNvdXJjZTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb1NvdXJjZXMuc2l6ZSgpOyBpKyspICB7Ci0gICAgICAgIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gc291cmNlRGVzYyA9IG1BdWRpb1NvdXJjZXMudmFsdWVBdChpKTsKLSAgICAgICAgcm91dGluZ19zdHJhdGVneSBzb3VyY2VTdHJhdGVneSA9Ci0gICAgICAgICAgICAgICAgKHJvdXRpbmdfc3RyYXRlZ3kpIGdldFN0cmF0ZWd5Rm9yQXR0cigmc291cmNlRGVzYy0+bUF0dHJpYnV0ZXMpOwotICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHNvdXJjZURlc2MtPm1Td091dHB1dC5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChzb3VyY2VTdHJhdGVneSA9PSBzdHJhdGVneSAmJiBvdXRwdXREZXNjICE9IDAgJiYgb3V0cHV0RGVzYy0+bUlvSGFuZGxlID09IG91dHB1dCkgeworICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOworICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHNvdXJjZURlc2MtPnN3T3V0cHV0KCkucHJvbW90ZSgpOworICAgICAgICBpZiAoZm9sbG93c1NhbWVSb3V0aW5nKGF0dHIsIHNvdXJjZURlc2MtPmF0dHJpYnV0ZXMoKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjICE9IDAgJiYgb3V0cHV0RGVzYy0+bUlvSGFuZGxlID09IG91dHB1dCkgewogICAgICAgICAgICAgc291cmNlID0gc291cmNlRGVzYzsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0zODg1LDcgKzQyMzEsNiBAQAogICAgIHJldHVybiBtQXVkaW9Qb3J0R2VuZXJhdGlvbisrOwogfQogCi0jaWZkZWYgVVNFX1hNTF9BVURJT19QT0xJQ1lfQ09ORgogLy8gVHJlYmxpemVkIGF1ZGlvIHBvbGljeSB4bWwgY29uZmlnIHdpbGwgYmUgbG9jYXRlZCBpbiAvb2RtL2V0YyBvciAvdmVuZG9yL2V0Yy4KIHN0YXRpYyBjb25zdCBjaGFyICprQ29uZmlnTG9jYXRpb25MaXN0W10gPQogICAgICAgICB7Ii9vZG0vZXRjIiwgIi92ZW5kb3IvZXRjIiwgIi9zeXN0ZW0vZXRjIn07CkBAIC0zODk3LDUyICs0MjQyLDUwIEBACiAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IGZpbGVOYW1lczsKICAgICBzdGF0dXNfdCByZXQ7CiAKLSAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInJvLmJsdWV0b290aC5hMmRwX29mZmxvYWQuc3VwcG9ydGVkIiwgZmFsc2UpICYmCi0gICAgICAgIHByb3BlcnR5X2dldF9ib29sKCJwZXJzaXN0LmJsdWV0b290aC5hMmRwX29mZmxvYWQuZGlzYWJsZWQiLCBmYWxzZSkpIHsKLSAgICAgICAgLy8gQTJEUCBvZmZsb2FkIHN1cHBvcnRlZCBidXQgZGlzYWJsZWQ6IHRyeSB0byB1c2Ugc3BlY2lhbCBYTUwgZmlsZQotICAgICAgICBmaWxlTmFtZXMucHVzaF9iYWNrKEFVRElPX1BPTElDWV9BMkRQX09GRkxPQURfRElTQUJMRURfWE1MX0NPTkZJR19GSUxFX05BTUUpOworICAgIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgicm8uYmx1ZXRvb3RoLmEyZHBfb2ZmbG9hZC5zdXBwb3J0ZWQiLCBmYWxzZSkpIHsKKyAgICAgICAgaWYgKHByb3BlcnR5X2dldF9ib29sKCJwZXJzaXN0LmJsdWV0b290aC5ibHVldG9vdGhfYXVkaW9faGFsLmRpc2FibGVkIiwgZmFsc2UpICYmCisgICAgICAgICAgICBwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5ibHVldG9vdGguYTJkcF9vZmZsb2FkLmRpc2FibGVkIiwgZmFsc2UpKSB7CisgICAgICAgICAgICAvLyBCb3RoIEJsdWV0b290aEF1ZGlvQDIuMCBhbmQgQmx1ZXRvb3RoQTJkcEAxLjAgKE9mZmxhb2QpIGFyZSBkaXNhYmxlZCwgYW5kIHVzZXMKKyAgICAgICAgICAgIC8vIHRoZSBsZWdhY3kgaGFyZHdhcmUgbW9kdWxlIGZvciBBMkRQIGFuZCBoZWFyaW5nIGFpZC4KKyAgICAgICAgICAgIGZpbGVOYW1lcy5wdXNoX2JhY2soQVVESU9fUE9MSUNZX0JMVUVUT09USF9MRUdBQ1lfSEFMX1hNTF9DT05GSUdfRklMRV9OQU1FKTsKKyAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5ibHVldG9vdGguYTJkcF9vZmZsb2FkLmRpc2FibGVkIiwgZmFsc2UpKSB7CisgICAgICAgICAgICAvLyBBMkRQIG9mZmxvYWQgc3VwcG9ydGVkIGJ1dCBkaXNhYmxlZDogdHJ5IHRvIHVzZSBzcGVjaWFsIFhNTCBmaWxlCisgICAgICAgICAgICBmaWxlTmFtZXMucHVzaF9iYWNrKEFVRElPX1BPTElDWV9BMkRQX09GRkxPQURfRElTQUJMRURfWE1MX0NPTkZJR19GSUxFX05BTUUpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5ibHVldG9vdGguYmx1ZXRvb3RoX2F1ZGlvX2hhbC5kaXNhYmxlZCIsIGZhbHNlKSkgeworICAgICAgICBmaWxlTmFtZXMucHVzaF9iYWNrKEFVRElPX1BPTElDWV9CTFVFVE9PVEhfTEVHQUNZX0hBTF9YTUxfQ09ORklHX0ZJTEVfTkFNRSk7CiAgICAgfQogICAgIGZpbGVOYW1lcy5wdXNoX2JhY2soQVVESU9fUE9MSUNZX1hNTF9DT05GSUdfRklMRV9OQU1FKTsKIAogICAgIGZvciAoY29uc3QgY2hhciogZmlsZU5hbWUgOiBmaWxlTmFtZXMpIHsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQ29uZmlnTG9jYXRpb25MaXN0U2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBQb2xpY3lTZXJpYWxpemVyIHNlcmlhbGl6ZXI7CiAgICAgICAgICAgICBzbnByaW50ZihhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUsIHNpemVvZihhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUpLAogICAgICAgICAgICAgICAgICAgICAgIiVzLyVzIiwga0NvbmZpZ0xvY2F0aW9uTGlzdFtpXSwgZmlsZU5hbWUpOwotICAgICAgICAgICAgcmV0ID0gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUsIGNvbmZpZyk7CisgICAgICAgICAgICByZXQgPSBkZXNlcmlhbGl6ZUF1ZGlvUG9saWN5RmlsZShhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUsICZjb25maWcpOwogICAgICAgICAgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGNvbmZpZy5zZXRTb3VyY2UoYXVkaW9Qb2xpY3lYbWxDb25maWdGaWxlKTsKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiByZXQ7CiB9Ci0jZW5kaWYKIAogQXVkaW9Qb2xpY3lNYW5hZ2VyOjpBdWRpb1BvbGljeU1hbmFnZXIoQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgLypmb3JUZXN0aW5nKi8pCiAgICAgOgotICAgIG1VaWRDYWNoZWQoZ2V0dWlkKCkpLAorICAgIG1VaWRDYWNoZWQoQUlEX0FVRElPU0VSVkVSKSwgLy8gbm8gbmVlZCB0byBjYWxsIGdldHVpZCgpLCB0aGVyZSdzIG9ubHkgb25lIG9mIHVzIHJ1bm5pbmcuCiAgICAgbXBDbGllbnRJbnRlcmZhY2UoY2xpZW50SW50ZXJmYWNlKSwKICAgICBtTGltaXRSaW5ndG9uZVZvbHVtZShmYWxzZSksIG1MYXN0Vm9pY2VWb2x1bWUoLTEuMGYpLAogICAgIG1BMmRwU3VzcGVuZGVkKGZhbHNlKSwKLSNpZmRlZiBVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GCi0gICAgbVZvbHVtZUN1cnZlcyhuZXcgVm9sdW1lQ3VydmVzQ29sbGVjdGlvbigpKSwKLSAgICBtQ29uZmlnKG1Id01vZHVsZXNBbGwsIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLAotICAgICAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UsIHN0YXRpY19jYXN0PFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24qPihtVm9sdW1lQ3VydmVzLmdldCgpKSksCi0jZWxzZQotICAgIG1Wb2x1bWVDdXJ2ZXMobmV3IFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uKCkpLAotICAgIG1Db25maWcobUh3TW9kdWxlc0FsbCwgbUF2YWlsYWJsZU91dHB1dERldmljZXMsIG1BdmFpbGFibGVJbnB1dERldmljZXMsCi0gICAgICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZSksCi0jZW5kaWYKKyAgICBtQ29uZmlnKG1Id01vZHVsZXNBbGwsIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLCBtRGVmYXVsdE91dHB1dERldmljZSksCiAgICAgbUF1ZGlvUG9ydEdlbmVyYXRpb24oMSksCiAgICAgbUJlYWNvbk11dGVSZWZDb3VudCgwKSwKICAgICBtQmVhY29uUGxheWluZ1JlZkNvdW50KDApLAogICAgIG1CZWFjb25NdXRlZChmYWxzZSksCiAgICAgbVR0c091dHB1dEF2YWlsYWJsZShmYWxzZSksCiAgICAgbU1hc3Rlck1vbm8oZmFsc2UpLAotICAgIG1NdXNpY0VmZmVjdE91dHB1dChBVURJT19JT19IQU5ETEVfTk9ORSksCi0gICAgbUhhc0NvbXB1dGVkU291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZShmYWxzZSkKKyAgICBtTXVzaWNFZmZlY3RPdXRwdXQoQVVESU9fSU9fSEFORExFX05PTkUpCiB7CiB9CiAKQEAgLTM5NTMsMjEgKzQyOTYsMjIgQEAKICAgICBpbml0aWFsaXplKCk7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsb2FkQ29uZmlnKCkgewotI2lmZGVmIFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYKLSAgICBpZiAoZGVzZXJpYWxpemVBdWRpb1BvbGljeVhtbENvbmZpZyhnZXRDb25maWcoKSkgIT0gTk9fRVJST1IpIHsKLSNlbHNlCi0gICAgaWYgKChDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRDb25maWcoQVVESU9fUE9MSUNZX1ZFTkRPUl9DT05GSUdfRklMRSwgZ2V0Q29uZmlnKCkpICE9IE5PX0VSUk9SKQotICAgICAgICAgICAmJiAoQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkQ29uZmlnKEFVRElPX1BPTElDWV9DT05GSUdfRklMRSwgZ2V0Q29uZmlnKCkpICE9IE5PX0VSUk9SKSkgeworLy8gIFRoaXMgY2hlY2sgaXMgdG8gY2F0Y2ggYW55IGxlZ2FjeSBwbGF0Zm9ybSB1cGRhdGluZyB0byBRIHdpdGhvdXQgaGF2aW5nCisvLyAgc3dpdGNoZWQgdG8gWE1MIHNpbmNlIGl0cyBkZXByZWNhdGlvbiBvbiBPLgorLy8gVE9ETzogYWZ0ZXIgUSByZWxlYXNlLCByZW1vdmUgdGhpcyBjaGVjayBhbmQgZmxhZyBhcyBYTUwgaXMgbm93IHRoZSBvbmx5CisvLyAgICAgICAgb3B0aW9uIGFuZCBhbGwgbGVnYWN5IHBsYXRmb3JtIHNob3VsZCBoYXZlIHRyYW5zaXRpb25lZCB0byBYTUwuCisjaWZuZGVmIFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYKKyNlcnJvciBBdWRpbyBwb2xpY3kgbm8gbG9uZ2VyIHN1cHBvcnRzIGxlZ2FjeSAuY29uZiBjb25maWd1cmF0aW9uIGZvcm1hdAogI2VuZGlmCisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsb2FkQ29uZmlnKCkgeworICAgIGlmIChkZXNlcmlhbGl6ZUF1ZGlvUG9saWN5WG1sQ29uZmlnKGdldENvbmZpZygpKSAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HRSgiY291bGQgbm90IGxvYWQgYXVkaW8gcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZSwgc2V0dGluZyBkZWZhdWx0cyIpOwogICAgICAgICBnZXRDb25maWcoKS5zZXREZWZhdWx0KCk7CiAgICAgfQogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmluaXRpYWxpemUoKSB7Ci0gICAgbVZvbHVtZUN1cnZlcy0+aW5pdGlhbGl6ZVZvbHVtZUN1cnZlcyhnZXRDb25maWcoKS5pc1NwZWFrZXJEcmNFbmFibGVkKCkpOwotCiAgICAgLy8gT25jZSBwb2xpY3kgY29uZmlnIGhhcyBiZWVuIHBhcnNlZCwgcmV0cmlldmUgYW4gaW5zdGFuY2Ugb2YgdGhlIGVuZ2luZSBhbmQgaW5pdGlhbGl6ZSBpdC4KICAgICBhdWRpb19wb2xpY3k6OkVuZ2luZUluc3RhbmNlICplbmdpbmVJbnN0YW5jZSA9IGF1ZGlvX3BvbGljeTo6RW5naW5lSW5zdGFuY2U6OmdldEluc3RhbmNlKCk7CiAgICAgaWYgKCFlbmdpbmVJbnN0YW5jZSkgewpAQCAtMzk4OSw4ICs0MzMzLDYgQEAKIAogICAgIC8vIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzIGFuZCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzIG5vdyBjb250YWluIGFsbCBhdHRhY2hlZCBkZXZpY2VzCiAgICAgLy8gb3BlbiBhbGwgb3V0cHV0IHN0cmVhbXMgbmVlZGVkIHRvIGFjY2VzcyBhdHRhY2hlZCBkZXZpY2VzCi0gICAgYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZVR5cGVzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgaW5wdXREZXZpY2VUeXBlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSAmIH5BVURJT19ERVZJQ0VfQklUX0lOOwogICAgIGZvciAoY29uc3QgYXV0byYgaHdNb2R1bGUgOiBtSHdNb2R1bGVzQWxsKSB7CiAgICAgICAgIGh3TW9kdWxlLT5zZXRIYW5kbGUobXBDbGllbnRJbnRlcmZhY2UtPmxvYWRId01vZHVsZShod01vZHVsZS0+Z2V0TmFtZSgpKSk7CiAgICAgICAgIGlmIChod01vZHVsZS0+Z2V0SGFuZGxlKCkgPT0gQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FKSB7CkBAIC00MDE5LDUxICs0MzYxLDQ5IEBACiAgICAgICAgICAgICBpZiAoKG91dFByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICE9IDApIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcm9maWxlVHlwZSA9IG91dFByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXNUeXBlKCk7Ci0gICAgICAgICAgICBpZiAoKHByb2ZpbGVUeXBlICYgbURlZmF1bHRPdXRwdXREZXZpY2UtPnR5cGUoKSkgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBwcm9maWxlVHlwZSA9IG1EZWZhdWx0T3V0cHV0RGV2aWNlLT50eXBlKCk7CisgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJnN1cHBvcnRlZERldmljZXMgPSBvdXRQcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCk7CisgICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxQcm9maWxlRGV2aWNlcyA9IHN1cHBvcnRlZERldmljZXMuZmlsdGVyKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHN1cHBvcnRlZERldmljZSA9IDA7CisgICAgICAgICAgICBpZiAoc3VwcG9ydGVkRGV2aWNlcy5jb250YWlucyhtRGVmYXVsdE91dHB1dERldmljZSkpIHsKKyAgICAgICAgICAgICAgICBzdXBwb3J0ZWREZXZpY2UgPSBtRGVmYXVsdE91dHB1dERldmljZTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gY2hvc2UgZmlyc3QgZGV2aWNlIHByZXNlbnQgaW4gcHJvZmlsZSdzIFN1cHBvcnRlZERldmljZXMgYWxzbyBwYXJ0IG9mCi0gICAgICAgICAgICAgICAgLy8gb3V0cHV0RGV2aWNlVHlwZXMKLSAgICAgICAgICAgICAgICBwcm9maWxlVHlwZSA9IG91dFByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZUZvclR5cGUob3V0cHV0RGV2aWNlVHlwZXMpOworICAgICAgICAgICAgICAgIC8vIGNob29zZSBmaXJzdCBkZXZpY2UgcHJlc2VudCBpbiBwcm9maWxlJ3MgU3VwcG9ydGVkRGV2aWNlcyBhbHNvIHBhcnQgb2YKKyAgICAgICAgICAgICAgICAvLyBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy4KKyAgICAgICAgICAgICAgICBpZiAoYXZhaWxQcm9maWxlRGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN1cHBvcnRlZERldmljZSA9IGF2YWlsUHJvZmlsZURldmljZXMuaXRlbUF0KDApOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKChwcm9maWxlVHlwZSAmIG91dHB1dERldmljZVR5cGVzKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoIW1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmNvbnRhaW5zKHN1cHBvcnRlZERldmljZSkpIHsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbmV3IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKG91dFByb2ZpbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZSk7Ci0gICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJnN1cHBvcnRlZERldmljZXMgPSBvdXRQcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCk7Ci0gICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXNGb3JUeXBlID0gc3VwcG9ydGVkRGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUocHJvZmlsZVR5cGUpOwotICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gZGV2aWNlc0ZvclR5cGUuc2l6ZSgpID4gMCA/IGRldmljZXNGb3JUeXBlLml0ZW1BdCgwKS0+bUFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmc4KCIiKTsKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3V0cHV0RGVzYy0+b3BlbihudWxscHRyLCBwcm9maWxlVHlwZSwgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fREVGQVVMVCwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm91dHB1dCk7Ci0KKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG91dHB1dERlc2MtPm9wZW4obnVsbHB0ciwgRGV2aWNlVmVjdG9yKHN1cHBvcnRlZERldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmb3V0cHV0KTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiQ2Fubm90IG9wZW4gb3V0cHV0IHN0cmVhbSBmb3IgZGV2aWNlICUwOHggb24gaHcgbW9kdWxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgIGh3TW9kdWxlLT5nZXROYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGRldiA6IHN1cHBvcnRlZERldmljZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmluZGV4T2YoZGV2KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZSBhIHZhbGlkIElEIHRvIGFuIGF0dGFjaGVkIGRldmljZSBvbmNlIGNvbmZpcm1lZCBpdCBpcyByZWFjaGFibGUKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgIW1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2luZGV4XS0+aXNBdHRhY2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPmF0dGFjaChod01vZHVsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1QcmltYXJ5T3V0cHV0ID09IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dFByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmltYXJ5T3V0cHV0ID0gb3V0cHV0RGVzYzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWRkT3V0cHV0KG91dHB1dCwgb3V0cHV0RGVzYyk7Ci0gICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiQ2Fubm90IG9wZW4gb3V0cHV0IHN0cmVhbSBmb3IgZGV2aWNlcyAlcyBvbiBodyBtb2R1bGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZERldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpLCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmZGV2aWNlIDogYXZhaWxQcm9maWxlRGV2aWNlcykgeworICAgICAgICAgICAgICAgIC8vIGdpdmUgYSB2YWxpZCBJRCB0byBhbiBhdHRhY2hlZCBkZXZpY2Ugb25jZSBjb25maXJtZWQgaXQgaXMgcmVhY2hhYmxlCisgICAgICAgICAgICAgICAgaWYgKCFkZXZpY2UtPmlzQXR0YWNoZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmF0dGFjaChod01vZHVsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1QcmltYXJ5T3V0cHV0ID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgb3V0UHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkpIHsKKyAgICAgICAgICAgICAgICBtUHJpbWFyeU91dHB1dCA9IG91dHB1dERlc2M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRPdXRwdXQob3V0cHV0LCBvdXRwdXREZXNjKTsKKyAgICAgICAgICAgIHNldE91dHB1dERldmljZXMob3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yKHN1cHBvcnRlZERldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwogICAgICAgICB9CiAgICAgICAgIC8vIG9wZW4gaW5wdXQgc3RyZWFtcyBuZWVkZWQgdG8gYWNjZXNzIGF0dGFjaGVkIGRldmljZXMgdG8gdmFsaWRhdGUKICAgICAgICAgLy8gbUF2YWlsYWJsZUlucHV0RGV2aWNlcyBsaXN0CkBAIC00MDc4LDg1ICs0NDE4LDY4IEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBjaG9zZSBmaXJzdCBkZXZpY2UgcHJlc2VudCBpbiBwcm9maWxlJ3MgU3VwcG9ydGVkRGV2aWNlcyBhbHNvIHBhcnQgb2YKLSAgICAgICAgICAgIC8vIGlucHV0RGV2aWNlVHlwZXMKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcm9maWxlVHlwZSA9IGluUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlRm9yVHlwZShpbnB1dERldmljZVR5cGVzKTsKLQotICAgICAgICAgICAgaWYgKChwcm9maWxlVHlwZSAmIGlucHV0RGV2aWNlVHlwZXMpID09IDApIHsKKyAgICAgICAgICAgIC8vIGF2YWlsYWJsZSBpbnB1dCBkZXZpY2VzCisgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJnN1cHBvcnRlZERldmljZXMgPSBpblByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKTsKKyAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbFByb2ZpbGVEZXZpY2VzID0gc3VwcG9ydGVkRGV2aWNlcy5maWx0ZXIobUF2YWlsYWJsZUlucHV0RGV2aWNlcyk7CisgICAgICAgICAgICBpZiAoYXZhaWxQcm9maWxlRGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IElucHV0IGRldmljZSBsaXN0IGlzIGVtcHR5ISIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0KICAgICAgICAgICAgICAgICAgICAgbmV3IEF1ZGlvSW5wdXREZXNjcmlwdG9yKGluUHJvZmlsZSwgbXBDbGllbnRJbnRlcmZhY2UpOwogCi0gICAgICAgICAgICBEZXZpY2VWZWN0b3IgaW5wdXREZXZpY2VzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUocHJvZmlsZVR5cGUpOwotICAgICAgICAgICAgLy8gICB0aGUgaW5wdXRzIHZlY3RvciBtdXN0IGJlIG9mIHNpemUgPj0gMSwgYnV0IHdlIGRvbid0IHdhbnQgdG8gY3Jhc2ggaGVyZQotICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gaW5wdXREZXZpY2VzLnNpemUoKSA+IDAgPyBpbnB1dERldmljZXMuaXRlbUF0KDApLT5tQWRkcmVzcwotICAgICAgICAgICAgICAgICAgICA6IFN0cmluZzgoIiIpOwotICAgICAgICAgICAgQUxPR1YoIiAgZm9yIGlucHV0IGRldmljZSAweCV4IHVzaW5nIGFkZHJlc3MgJXMiLCBwcm9maWxlVHlwZSwgYWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgICAgICBBTE9HRV9JRihpbnB1dERldmljZXMuc2l6ZSgpID09IDAsICJJbnB1dCBkZXZpY2UgbGlzdCBpcyBlbXB0eSEiKTsKLQogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGlucHV0RGVzYy0+b3BlbihudWxscHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxQcm9maWxlRGV2aWNlcy5pdGVtQXQoMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX01JQywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0KTsKLQotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgZGV2IDogaW5Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuaW5kZXhPZihkZXYpOwotICAgICAgICAgICAgICAgICAgICAvLyBnaXZlIGEgdmFsaWQgSUQgdG8gYW4gYXR0YWNoZWQgZGV2aWNlIG9uY2UgY29uZmlybWVkIGl0IGlzIHJlYWNoYWJsZQotICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG1BdmFpbGFibGVJbnB1dERldmljZXNbaW5kZXhdOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXZEZXNjLT5pc0F0dGFjaGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5hdHRhY2goaHdNb2R1bGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPmltcG9ydEF1ZGlvUG9ydChpblByb2ZpbGUsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlucHV0RGVzYy0+Y2xvc2UoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coIkNhbm5vdCBvcGVuIGlucHV0IHN0cmVhbSBmb3IgZGV2aWNlICUwOHggb24gaHcgbW9kdWxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlVHlwZSwKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiQ2Fubm90IG9wZW4gaW5wdXQgc3RyZWFtIGZvciBkZXZpY2UgJXMgb24gaHcgbW9kdWxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBhdmFpbFByb2ZpbGVEZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICBod01vZHVsZS0+Z2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmZGV2aWNlIDogYXZhaWxQcm9maWxlRGV2aWNlcykgeworICAgICAgICAgICAgICAgIC8vIGdpdmUgYSB2YWxpZCBJRCB0byBhbiBhdHRhY2hlZCBkZXZpY2Ugb25jZSBjb25maXJtZWQgaXQgaXMgcmVhY2hhYmxlCisgICAgICAgICAgICAgICAgaWYgKCFkZXZpY2UtPmlzQXR0YWNoZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmF0dGFjaChod01vZHVsZSk7CisgICAgICAgICAgICAgICAgICAgIGRldmljZS0+aW1wb3J0QXVkaW9Qb3J0KGluUHJvZmlsZSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5wdXREZXNjLT5jbG9zZSgpOwogICAgICAgICB9CiAgICAgfQogICAgIC8vIG1ha2Ugc3VyZSBhbGwgYXR0YWNoZWQgZGV2aWNlcyBoYXZlIGJlZW4gYWxsb2NhdGVkIGEgdW5pcXVlIElECi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIDwgbUF2YWlsYWJsZU91dHB1dERldmljZXMuc2l6ZSgpOykgewotICAgICAgICBpZiAoIW1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldLT5pc0F0dGFjaGVkKCkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJPdXRwdXQgZGV2aWNlICUwOHggdW5yZWFjaGFibGUiLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXS0+dHlwZSgpKTsKLSAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKKyAgICBhdXRvIGNoZWNrQW5kU2V0QXZhaWxhYmxlID0gW3RoaXNdKGF1dG8mIGRldmljZXMpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZXZpY2VzLnNpemUoKTspIHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gJmRldmljZSA9IGRldmljZXNbaV07CisgICAgICAgICAgICBpZiAoIWRldmljZS0+aXNBdHRhY2hlZCgpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImRldmljZSAlcyBpcyB1bnJlYWNoYWJsZSIsIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBkZXZpY2VzLnJlbW92ZShkZXZpY2UpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gRGV2aWNlIGlzIG5vdyB2YWxpZGF0ZWQgYW5kIGNhbiBiZSBhcHBlbmRlZCB0byB0aGUgYXZhaWxhYmxlIGRldmljZXMgb2YgdGhlIGVuZ2luZQorICAgICAgICAgICAgc2V0RW5naW5lRGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpOworICAgICAgICAgICAgaSsrOwogICAgICAgICB9Ci0gICAgICAgIC8vIFRoZSBkZXZpY2UgaXMgbm93IHZhbGlkYXRlZCBhbmQgY2FuIGJlIGFwcGVuZGVkIHRvIHRoZSBhdmFpbGFibGUgZGV2aWNlcyBvZiB0aGUgZW5naW5lCi0gICAgICAgIG1FbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKTsKLSAgICAgICAgaSsrOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSAgPCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnNpemUoKTspIHsKLSAgICAgICAgaWYgKCFtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5pc0F0dGFjaGVkKCkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJJbnB1dCBkZXZpY2UgJTA4eCB1bnJlYWNoYWJsZSIsIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPnR5cGUoKSk7Ci0gICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnJlbW92ZShtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRoZSBkZXZpY2UgaXMgbm93IHZhbGlkYXRlZCBhbmQgY2FuIGJlIGFwcGVuZGVkIHRvIHRoZSBhdmFpbGFibGUgZGV2aWNlcyBvZiB0aGUgZW5naW5lCi0gICAgICAgIG1FbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpOwotICAgICAgICBpKys7Ci0gICAgfQorICAgIH07CisgICAgY2hlY2tBbmRTZXRBdmFpbGFibGUobUF2YWlsYWJsZU91dHB1dERldmljZXMpOworICAgIGNoZWNrQW5kU2V0QXZhaWxhYmxlKG1BdmFpbGFibGVJbnB1dERldmljZXMpOworCiAgICAgLy8gbWFrZSBzdXJlIGRlZmF1bHQgZGV2aWNlIGlzIHJlYWNoYWJsZQotICAgIGlmIChtRGVmYXVsdE91dHB1dERldmljZSA9PSAwIHx8IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmluZGV4T2YobURlZmF1bHRPdXRwdXREZXZpY2UpIDwgMCkgewotICAgICAgICBBTE9HRSgiRGVmYXVsdCBkZXZpY2UgJTA4eCBpcyB1bnJlYWNoYWJsZSIsIG1EZWZhdWx0T3V0cHV0RGV2aWNlLT50eXBlKCkpOworICAgIGlmIChtRGVmYXVsdE91dHB1dERldmljZSA9PSAwIHx8ICFtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5jb250YWlucyhtRGVmYXVsdE91dHB1dERldmljZSkpIHsKKyAgICAgICAgQUxPR0VfSUYobURlZmF1bHRPdXRwdXREZXZpY2UgIT0gMCwgIkRlZmF1bHQgZGV2aWNlICVzIGlzIHVucmVhY2hhYmxlIiwKKyAgICAgICAgICAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgfQogICAgIC8vIElmIG1pY3JvcGhvbmVzIGFkZHJlc3MgaXMgZW1wdHksIHNldCBpdCBhY2NvcmRpbmcgdG8gZGV2aWNlIHR5cGUKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSAgPCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5tQWRkcmVzcy5pc0VtcHR5KCkpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdmFpbGFibGVJbnB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPmFkZHJlc3MoKS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIGlmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT50eXBlKCkgPT0gQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKSB7Ci0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+bUFkZHJlc3MgPSBTdHJpbmc4KEFVRElPX0JPVFRPTV9NSUNST1BIT05FX0FERFJFU1MpOworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPnNldEFkZHJlc3MoU3RyaW5nOChBVURJT19CT1RUT01fTUlDUk9QSE9ORV9BRERSRVNTKSk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPnR5cGUoKSA9PSBBVURJT19ERVZJQ0VfSU5fQkFDS19NSUMpIHsKLSAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5tQWRkcmVzcyA9IFN0cmluZzgoQVVESU9fQkFDS19NSUNST1BIT05FX0FERFJFU1MpOworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPnNldEFkZHJlc3MoU3RyaW5nOChBVURJT19CQUNLX01JQ1JPUEhPTkVfQUREUkVTUykpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNDE2Niw2ICs0NDg5LDkgQEAKICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICB9CiAKKyAgICAvLyBTaWxlbmNlIEFMT0dWIHN0YXRlbWVudHMKKyAgICBwcm9wZXJ0eV9zZXQoImxvZy50YWcuIiBMT0dfVEFHLCAiRCIpOworCiAgICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtNDE4NCw3ICs0NTEwLDcgQEAKICAgIG1JbnB1dHMuY2xlYXIoKTsKICAgIG1Id01vZHVsZXMuY2xlYXIoKTsKICAgIG1Id01vZHVsZXNBbGwuY2xlYXIoKTsKLSAgIG1TdXJyb3VuZEZvcm1hdHMuY2xlYXIoKTsKKyAgIG1NYW51YWxTdXJyb3VuZEZvcm1hdHMuY2xlYXIoKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbml0Q2hlY2soKQpAQCAtNDIxNyw0NCArNDU0MywyOCBAQAogICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpmaW5kSW9IYW5kbGVzQnlBZGRyZXNzKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgZGVzYyAvKmluKi8sCi0gICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgLyppbiovLAotICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzIC8qaW4qLywKLSAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cyAvKm91dCovKSB7Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9Ci0gICAgICAgIGRlc2MtPm1Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VCeUFkZHJlc3MoZGV2aWNlLCBhZGRyZXNzKTsKLSAgICBpZiAoZGV2RGVzYyAhPSAwKSB7Ci0gICAgICAgIEFMT0dWKCJmaW5kSW9IYW5kbGVzQnlBZGRyZXNzKCk6IGFkZGluZyBvcGVuZWQgb3V0cHV0ICVkIG9uIHNhbWUgYWRkcmVzcyAlcyIsCi0gICAgICAgICAgICAgIGRlc2MtPm1Jb0hhbmRsZSwgYWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgIG91dHB1dHMuYWRkKGRlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrT3V0cHV0c0ZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2RGVzYywKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tPdXRwdXRzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMpCiB7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGRldkRlc2MtPnR5cGUoKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSA9IGRldmljZS0+dHlwZSgpOworICAgIGNvbnN0IFN0cmluZzggJmFkZHJlc3MgPSBkZXZpY2UtPmFkZHJlc3MoKTsKICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYzsKIAotICAgIGlmIChhdWRpb19kZXZpY2VfaXNfZGlnaXRhbChkZXZpY2UpKSB7CisgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZVR5cGUpKSB7CiAgICAgICAgIC8vIGVyYXNlIGFsbCBjdXJyZW50IHNhbXBsZSByYXRlcywgZm9ybWF0cyBhbmQgY2hhbm5lbCBtYXNrcwotICAgICAgICBkZXZEZXNjLT5jbGVhckF1ZGlvUHJvZmlsZXMoKTsKKyAgICAgICAgZGV2aWNlLT5jbGVhckF1ZGlvUHJvZmlsZXMoKTsKICAgICB9CiAKICAgICBpZiAoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpIHsKICAgICAgICAgLy8gZmlyc3QgbGlzdCBhbHJlYWR5IG9wZW4gb3V0cHV0cyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIChkZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkgJiBkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBhZGRpbmcgb3BlbmVkIG91dHB1dCAlZCIsIG1PdXRwdXRzLmtleUF0KGkpKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQobU91dHB1dHMua2V5QXQoaSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCIgIGNoZWNraW5nIGFkZHJlc3MgbWF0Y2ggZHVlIHRvIGRldmljZSAweCV4IiwgZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgZmluZElvSGFuZGxlc0J5QWRkcmVzcyhkZXNjLCBkZXZpY2UsIGFkZHJlc3MsIG91dHB1dHMpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgZGVzYy0+c3VwcG9ydHNEZXZpY2UoZGV2aWNlKQorICAgICAgICAgICAgICAgICAgICAmJiBkZXNjLT5kZXZpY2VTdXBwb3J0c0VuY29kZWRGb3JtYXRzKGRldmljZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBhZGRpbmcgb3BlbmVkIG91dHB1dCAlZCBvbiBkZXZpY2UgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzLmtleUF0KGkpLCBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQobU91dHB1dHMua2V5QXQoaSkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8vIHRoZW4gbG9vayBmb3Igb3V0cHV0IHByb2ZpbGVzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQpAQCAtNDI2MiwxMyArNDU3MiwxMCBAQAogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlcykgewogICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKS5zaXplKCk7IGorKykgewogICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpW2pdOwotICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0RGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5zdXBwb3J0RGV2aWNlQWRkcmVzcyhhZGRyZXNzKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZXMuYWRkKHByb2ZpbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBhZGRpbmcgcHJvZmlsZSAlenUgZnJvbSBtb2R1bGUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqLCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0c0RldmljZShkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLmFkZChwcm9maWxlKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBhZGRpbmcgcHJvZmlsZSAlenUgZnJvbSBtb2R1bGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBqLCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTQyNzYsNyArNDU4Myw3IEBACiAgICAgICAgIEFMT0dWKCIgIGZvdW5kICV6dSBwcm9maWxlcywgJXp1IG91dHB1dHMiLCBwcm9maWxlcy5zaXplKCksIG91dHB1dHMuc2l6ZSgpKTsKIAogICAgICAgICBpZiAocHJvZmlsZXMuaXNFbXB0eSgpICYmIG91dHB1dHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IE5vIG91dHB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAlMDR4IiwgZGV2aWNlKTsKKyAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogTm8gb3V0cHV0IGF2YWlsYWJsZSBmb3IgZGV2aWNlICUwNHgiLCBkZXZpY2VUeXBlKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KIApAQCAtNDI5Miw4ICs0NTk5LDggQEAKICAgICAgICAgICAgICAgICBpZiAoIWRlc2MtPmlzRHVwbGljYXRlZCgpICYmIGRlc2MtPm1Qcm9maWxlID09IHByb2ZpbGUpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hpbmcgcHJvZmlsZTogc2F2ZSB0aGUgc2FtcGxlIHJhdGVzLCBmb3JtYXQgYW5kIGNoYW5uZWwgbWFza3Mgc3VwcG9ydGVkCiAgICAgICAgICAgICAgICAgICAgIC8vIGJ5IHRoZSBwcm9maWxlIGluIG91ciBkZXZpY2UgZGVzY3JpcHRvcgotICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+aW1wb3J0QXVkaW9Qb3J0KHByb2ZpbGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS0+aW1wb3J0QXVkaW9Qb3J0KHByb2ZpbGUpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KQEAgLTQzMDksMTYgKzQ2MTYsMTYgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgQUxPR1YoIm9wZW5pbmcgb3V0cHV0IGZvciBkZXZpY2UgJTA4eCB3aXRoIHBhcmFtcyAlcyBwcm9maWxlICVwIG5hbWUgJXMiLAotICAgICAgICAgICAgICAgICAgZGV2aWNlLCBhZGRyZXNzLnN0cmluZygpLCBwcm9maWxlLmdldCgpLCBwcm9maWxlLT5nZXROYW1lKCkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgZGV2aWNlVHlwZSwgYWRkcmVzcy5zdHJpbmcoKSwgcHJvZmlsZS5nZXQoKSwgcHJvZmlsZS0+Z2V0TmFtZSgpLnN0cmluZygpKTsKICAgICAgICAgICAgIGRlc2MgPSBuZXcgU3dBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSwgbXBDbGllbnRJbnRlcmZhY2UpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNjLT5vcGVuKG51bGxwdHIsIGRldmljZSwgYWRkcmVzcywKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2MtPm9wZW4obnVsbHB0ciwgRGV2aWNlVmVjdG9yKGRldmljZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9ERUZBVUxULCBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmb3V0cHV0KTsKIAogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIC8vIEhlcmUgaXMgd2hlcmUgdGhlIG91dF9zZXRfcGFyYW1ldGVycygpIGZvciBjYXJkICYgZGV2aWNlIGdldHMgY2FsbGVkCiAgICAgICAgICAgICAgICAgaWYgKCFhZGRyZXNzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBjaGFyICpwYXJhbSA9IGF1ZGlvX2RldmljZV9hZGRyZXNzX3RvX3BhcmFtZXRlcihkZXZpY2UsIGFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICBjaGFyICpwYXJhbSA9IGF1ZGlvX2RldmljZV9hZGRyZXNzX3RvX3BhcmFtZXRlcihkZXZpY2VUeXBlLCBhZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMob3V0cHV0LCBTdHJpbmc4KHBhcmFtKSk7CiAgICAgICAgICAgICAgICAgICAgIGZyZWUocGFyYW0pOwogICAgICAgICAgICAgICAgIH0KQEAgLTQzMzcsNyArNDY0NCw4IEBACiAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uY2hhbm5lbF9tYXNrID0gY29uZmlnLmNoYW5uZWxfbWFzazsKICAgICAgICAgICAgICAgICAgICAgY29uZmlnLm9mZmxvYWRfaW5mby5mb3JtYXQgPSBjb25maWcuZm9ybWF0OwogCi0gICAgICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2MtPm9wZW4oJmNvbmZpZywgZGV2aWNlLCBhZGRyZXNzLCBBVURJT19TVFJFQU1fREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzYy0+b3BlbigmY29uZmlnLCBEZXZpY2VWZWN0b3IoZGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fREVGQVVMVCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmb3V0cHV0KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CkBAIC00MzQ2LDE0ICs0NjU0LDE2IEBACiAKICAgICAgICAgICAgICAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgICAgICAgICAgICAgIGFkZE91dHB1dChvdXRwdXQsIGRlc2MpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpICYmIGFkZHJlc3MgIT0gIjAiKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZVR5cGUpICYmIGFkZHJlc3MgIT0gIjAiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4OwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Qb2xpY3lNaXhlcy5nZXRBdWRpb1BvbGljeU1peChhZGRyZXNzLCBwb2xpY3lNaXgpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIGNhbm5vdCBmaW5kIHBvbGljeSBmb3IgYWRkcmVzcyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVBvbGljeU1peGVzLmdldEF1ZGlvUG9saWN5TWl4KGRldmljZVR5cGUsIGFkZHJlc3MsIHBvbGljeU1peCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3lNaXgtPnNldE91dHB1dChkZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tUG9saWN5TWl4ID0gcG9saWN5TWl4OworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgY2Fubm90IGZpbmQgcG9saWN5IGZvciBhZGRyZXNzICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeU1peC0+c2V0T3V0cHV0KGRlc2MpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bVBvbGljeU1peCA9IHBvbGljeU1peDsKIAogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSA9PSAwKSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzUHJpbWFyeU91dHB1dCgpKSB7CkBAIC00Mzg1LDI4ICs0Njk1LDI4IEBACiAgICAgICAgICAgICAgICAgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAob3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIGNvdWxkIG5vdCBvcGVuIG91dHB1dCBmb3IgZGV2aWNlICV4IiwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgY291bGQgbm90IG9wZW4gb3V0cHV0IGZvciBkZXZpY2UgJXgiLCBkZXZpY2VUeXBlKTsKICAgICAgICAgICAgICAgICBwcm9maWxlcy5yZW1vdmVBdChwcm9maWxlX2luZGV4KTsKICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4LS07CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKG91dHB1dCk7CiAgICAgICAgICAgICAgICAgLy8gTG9hZCBkaWdpdGFsIGZvcm1hdCBpbmZvIG9ubHkgZm9yIGRpZ2l0YWwgZGV2aWNlcwotICAgICAgICAgICAgICAgIGlmIChhdWRpb19kZXZpY2VfaXNfZGlnaXRhbChkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPmltcG9ydEF1ZGlvUG9ydChwcm9maWxlKTsKKyAgICAgICAgICAgICAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT5pbXBvcnRBdWRpb1BvcnQocHJvZmlsZSk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKGRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IHNldE91dHB1dERldmljZShkZXY9MHgleCwgYWRkcj0lcykiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwgYWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZShkZXNjLCBkZXZpY2UsIHRydWUvKmZvcmNlKi8sIDAvKmRlbGF5Ki8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTC8qcGF0Y2ggaGFuZGxlKi8sIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogc2V0T3V0cHV0RGV2aWNlcyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKGRlc2MsIERldmljZVZlY3RvcihkZXZpY2UpLCB0cnVlLypmb3JjZSovLCAwLypkZWxheSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwvKnBhdGNoIGhhbmRsZSovKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBhZGRpbmcgb3V0cHV0ICVkIiwgb3V0cHV0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlmIChwcm9maWxlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogTm8gb3V0cHV0IGF2YWlsYWJsZSBmb3IgZGV2aWNlICUwNHgiLCBkZXZpY2UpOworICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBObyBvdXRwdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgJTA0eCIsIGRldmljZVR5cGUpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7IC8vIERpc2Nvbm5lY3QKQEAgLTQ0MTUsMTAgKzQ3MjUsMTAgQEAKICAgICAgICAgICAgIGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwogICAgICAgICAgICAgaWYgKCFkZXNjLT5pc0R1cGxpY2F0ZWQoKSkgewogICAgICAgICAgICAgICAgIC8vIGV4YWN0IG1hdGNoIG9uIGRldmljZQotICAgICAgICAgICAgICAgIGlmIChkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkgPT0gZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICBmaW5kSW9IYW5kbGVzQnlBZGRyZXNzKGRlc2MsIGRldmljZSwgYWRkcmVzcywgb3V0cHV0cyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghKGRlc2MtPnN1cHBvcnRlZERldmljZXMoKSAmIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlVHlwZSkgJiYgZGVzYy0+c3VwcG9ydHNEZXZpY2UoZGV2aWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGVzYy0+ZGV2aWNlU3VwcG9ydHNFbmNvZGVkRm9ybWF0cyhkZXZpY2VUeXBlKSkgeworICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmFkZChtT3V0cHV0cy5rZXlBdChpKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbUF2YWlsYWJsZU91dHB1dERldmljZXMuY29udGFpbnNBdExlYXN0T25lKGRlc2MtPnN1cHBvcnRlZERldmljZXMoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBkaXNjb25uZWN0aW5nIGFkZGluZyBvdXRwdXQgJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzLmtleUF0KGkpKTsKICAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQobU91dHB1dHMua2V5QXQoaSkpOwpAQCAtNDQyOSw3ICs0NzM5LDcgQEAKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6IG1Id01vZHVsZXMpIHsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkuc2l6ZSgpOyBqKyspIHsKICAgICAgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKVtqXTsKLSAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydERldmljZShkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPnN1cHBvcnRzRGV2aWNlKGRldmljZSkpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiAiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNsZWFyaW5nIGRpcmVjdCBvdXRwdXQgcHJvZmlsZSAlenUgb24gbW9kdWxlICVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqLCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKQEAgLTQ0NDEsMzAgKzQ3NTEsMTggQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tJbnB1dHNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldkRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgaW5wdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0lucHV0c0ZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpCiB7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGRldkRlc2MtPnR5cGUoKTsKICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gZGVzYzsKIAotICAgIGlmIChhdWRpb19kZXZpY2VfaXNfZGlnaXRhbChkZXZpY2UpKSB7CisgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZS0+dHlwZSgpKSkgewogICAgICAgICAvLyBlcmFzZSBhbGwgY3VycmVudCBzYW1wbGUgcmF0ZXMsIGZvcm1hdHMgYW5kIGNoYW5uZWwgbWFza3MKLSAgICAgICAgZGV2RGVzYy0+Y2xlYXJBdWRpb1Byb2ZpbGVzKCk7CisgICAgICAgIGRldmljZS0+Y2xlYXJBdWRpb1Byb2ZpbGVzKCk7CiAgICAgfQogCiAgICAgaWYgKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKSB7Ci0gICAgICAgIC8vIGZpcnN0IGxpc3QgYWxyZWFkeSBvcGVuIGlucHV0cyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKLSAgICAgICAgZm9yIChzaXplX3QgaW5wdXRfaW5kZXggPSAwOyBpbnB1dF9pbmRleCA8IG1JbnB1dHMuc2l6ZSgpOyBpbnB1dF9pbmRleCsrKSB7Ci0gICAgICAgICAgICBkZXNjID0gbUlucHV0cy52YWx1ZUF0KGlucHV0X2luZGV4KTsKLSAgICAgICAgICAgIGlmIChkZXNjLT5tUHJvZmlsZS0+c3VwcG9ydERldmljZShkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBvcGVuZWQgaW5wdXQgJWQiLCBtSW5wdXRzLmtleUF0KGlucHV0X2luZGV4KSk7Ci0gICAgICAgICAgICAgICBpbnB1dHMuYWRkKG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRoZW4gbG9vayBmb3IgaW5wdXQgcHJvZmlsZXMgdGhhdCBjYW4gYmUgcm91dGVkIHRvIHRoaXMgZGV2aWNlCisgICAgICAgIC8vIGxvb2sgZm9yIGlucHV0IHByb2ZpbGVzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQogICAgICAgICBTb3J0ZWRWZWN0b3I8IHNwPElPUHJvZmlsZT4gPiBwcm9maWxlczsKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6IG1Id01vZHVsZXMpIHsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IHByb2ZpbGVfaW5kZXggPSAwOwpAQCAtNDQ3MiwxOSArNDc3MCwxNyBAQAogICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4KyspIHsKICAgICAgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBod01vZHVsZS0+Z2V0SW5wdXRQcm9maWxlcygpW3Byb2ZpbGVfaW5kZXhdOwogCi0gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPnN1cHBvcnREZXZpY2UoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIWRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPnN1cHBvcnREZXZpY2VBZGRyZXNzKGFkZHJlc3MpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlcy5hZGQocHJvZmlsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIHByb2ZpbGUgJXp1IGZyb20gbW9kdWxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCwgaHdNb2R1bGUtPmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydHNEZXZpY2UoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgICAgICBwcm9maWxlcy5hZGQocHJvZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBhZGRpbmcgcHJvZmlsZSAlenUgZnJvbSBtb2R1bGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4LCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpZiAocHJvZmlsZXMuaXNFbXB0eSgpICYmIGlucHV0cy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBObyBpbnB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAweCVYIiwgZGV2aWNlKTsKKyAgICAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR1coIiVzOiBObyBpbnB1dCBwcm9maWxlIGF2YWlsYWJsZSBmb3IgZGV2aWNlICVzIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogCkBAIC00NDk5LDggKzQ3OTUsOCBAQAogICAgICAgICAgICAgZm9yIChpbnB1dF9pbmRleCA9IDA7IGlucHV0X2luZGV4IDwgbUlucHV0cy5zaXplKCk7IGlucHV0X2luZGV4KyspIHsKICAgICAgICAgICAgICAgICBkZXNjID0gbUlucHV0cy52YWx1ZUF0KGlucHV0X2luZGV4KTsKICAgICAgICAgICAgICAgICBpZiAoZGVzYy0+bVByb2ZpbGUgPT0gcHJvZmlsZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+aW1wb3J0QXVkaW9Qb3J0KHByb2ZpbGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlLT50eXBlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmltcG9ydEF1ZGlvUG9ydChwcm9maWxlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC00NTE5LDE0ICs0ODE1LDE0IEBACiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzYy0+b3BlbihudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9NSUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0KTsKIAogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MgPSBkZXZpY2UtPmFkZHJlc3MoKTsKICAgICAgICAgICAgICAgICBpZiAoIWFkZHJlc3MuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXIgKnBhcmFtID0gYXVkaW9fZGV2aWNlX2FkZHJlc3NfdG9fcGFyYW1ldGVyKGRldmljZSwgYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKnBhcmFtID0gYXVkaW9fZGV2aWNlX2FkZHJlc3NfdG9fcGFyYW1ldGVyKGRldmljZS0+dHlwZSgpLCBhZGRyZXNzKTsKICAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoaW5wdXQsIFN0cmluZzgocGFyYW0pKTsKICAgICAgICAgICAgICAgICAgICAgZnJlZShwYXJhbSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNDUzNyw0NiArNDgzMywzNyBAQAogICAgICAgICAgICAgICAgICAgICBpbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIGlmIChpbnB1dCAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGlucHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgICAgICAgICAgICAgIGFkZElucHV0KGlucHV0LCBkZXNjKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IC8vIGVuZGlmIGlucHV0ICE9IDAKIAogICAgICAgICAgICAgaWYgKGlucHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNoZWNrSW5wdXRzRm9yRGV2aWNlKCkgY291bGQgbm90IG9wZW4gaW5wdXQgZm9yIGRldmljZSAweCVYIiwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMgY291bGQgbm90IG9wZW4gaW5wdXQgZm9yIGRldmljZSAlcyIsIF9fZnVuY19fLCAgCisgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICBwcm9maWxlcy5yZW1vdmVBdChwcm9maWxlX2luZGV4KTsKICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4LS07CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlucHV0cy5hZGQoaW5wdXQpOwotICAgICAgICAgICAgICAgIGlmIChhdWRpb19kZXZpY2VfaXNfZGlnaXRhbChkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPmltcG9ydEF1ZGlvUG9ydChwcm9maWxlKTsKKyAgICAgICAgICAgICAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlLT50eXBlKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGRldmljZS0+aW1wb3J0QXVkaW9Qb3J0KHByb2ZpbGUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIGlucHV0ICVkIiwgaW5wdXQpOwogICAgICAgICAgICAgfQogICAgICAgICB9IC8vIGVuZCBzY2FuIHByb2ZpbGVzCiAKICAgICAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgQUxPR1coImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IE5vIGlucHV0IGF2YWlsYWJsZSBmb3IgZGV2aWNlIDB4JVgiLCBkZXZpY2UpOworICAgICAgICAgICAgQUxPR1coIiVzOiBObyBpbnB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAlcyIsIF9fZnVuY19fLCAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIERpc2Nvbm5lY3QKLSAgICAgICAgLy8gY2hlY2sgaWYgb25lIG9wZW5lZCBpbnB1dCBpcyBub3QgbmVlZGVkIGFueSBtb3JlIGFmdGVyIGRpc2Nvbm5lY3Rpbmcgb25lIGRldmljZQotICAgICAgICBmb3IgKHNpemVfdCBpbnB1dF9pbmRleCA9IDA7IGlucHV0X2luZGV4IDwgbUlucHV0cy5zaXplKCk7IGlucHV0X2luZGV4KyspIHsKLSAgICAgICAgICAgIGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5wdXRfaW5kZXgpOwotICAgICAgICAgICAgaWYgKCEoZGVzYy0+bVByb2ZpbGUtPnN1cHBvcnREZXZpY2UobUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpKSkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogZGlzY29ubmVjdGluZyBhZGRpbmcgaW5wdXQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKLSAgICAgICAgICAgICAgICBpbnB1dHMuYWRkKG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQogICAgICAgICAvLyBDbGVhciBhbnkgcHJvZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaXNjb25uZWN0ZWQgZGV2aWNlLgogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlcykgewogICAgICAgICAgICAgZm9yIChzaXplX3QgcHJvZmlsZV9pbmRleCA9IDA7CiAgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXggPCBod01vZHVsZS0+Z2V0SW5wdXRQcm9maWxlcygpLnNpemUoKTsKICAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCsrKSB7CiAgICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gaHdNb2R1bGUtPmdldElucHV0UHJvZmlsZXMoKVtwcm9maWxlX2luZGV4XTsKLSAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydERldmljZShkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPnN1cHBvcnRzRGV2aWNlKGRldmljZSkpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGNsZWFyaW5nIGRpcmVjdCBpbnB1dCBwcm9maWxlICV6dSBvbiBtb2R1bGUgJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgsIGh3TW9kdWxlLT5nZXROYW1lKCkpOwogICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5jbGVhckF1ZGlvUHJvZmlsZXMoKTsKQEAgLTQ1OTMsMzggKzQ4ODAsMzIgQEAKIHsKICAgICBBTE9HVigiY2xvc2VPdXRwdXQoJWQpIiwgb3V0cHV0KTsKIAotICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLSAgICBpZiAob3V0cHV0RGVzYyA9PSBOVUxMKSB7CisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGNsb3NpbmdPdXRwdXQgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworICAgIGlmIChjbG9zaW5nT3V0cHV0ID09IE5VTEwpIHsKICAgICAgICAgQUxPR1coImNsb3NlT3V0cHV0KCkgdW5rbm93biBvdXRwdXQgJWQiLCBvdXRwdXQpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIG1Qb2xpY3lNaXhlcy5jbG9zZU91dHB1dChvdXRwdXREZXNjKTsKKyAgICBjb25zdCBib29sIGNsb3NpbmdPdXRwdXRXYXNBY3RpdmUgPSBjbG9zaW5nT3V0cHV0LT5pc0FjdGl2ZSgpOworICAgIG1Qb2xpY3lNaXhlcy5jbG9zZU91dHB1dChjbG9zaW5nT3V0cHV0KTsKIAogICAgIC8vIGxvb2sgZm9yIGR1cGxpY2F0ZWQgb3V0cHV0cyBjb25uZWN0ZWQgdG8gdGhlIG91dHB1dCBiZWluZyByZW1vdmVkLgogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGR1cE91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAoZHVwT3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYKLSAgICAgICAgICAgICAgICAoZHVwT3V0cHV0RGVzYy0+bU91dHB1dDEgPT0gb3V0cHV0RGVzYyB8fAotICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1PdXRwdXQyID09IG91dHB1dERlc2MpKSB7Ci0gICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYzI7Ci0gICAgICAgICAgICBpZiAoZHVwT3V0cHV0RGVzYy0+bU91dHB1dDEgPT0gb3V0cHV0RGVzYykgewotICAgICAgICAgICAgICAgIG91dHB1dERlc2MyID0gZHVwT3V0cHV0RGVzYy0+bU91dHB1dDI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG91dHB1dERlc2MyID0gZHVwT3V0cHV0RGVzYy0+bU91dHB1dDE7Ci0gICAgICAgICAgICB9CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkdXBPdXRwdXQgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoZHVwT3V0cHV0LT5pc0R1cGxpY2F0ZWQoKSAmJgorICAgICAgICAgICAgICAgIChkdXBPdXRwdXQtPm1PdXRwdXQxID09IGNsb3NpbmdPdXRwdXQgfHwgZHVwT3V0cHV0LT5tT3V0cHV0MiA9PSBjbG9zaW5nT3V0cHV0KSkgeworICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHJlbWFpbmluZ091dHB1dCA9CisgICAgICAgICAgICAgICAgZHVwT3V0cHV0LT5tT3V0cHV0MSA9PSBjbG9zaW5nT3V0cHV0ID8gZHVwT3V0cHV0LT5tT3V0cHV0MiA6IGR1cE91dHB1dC0+bU91dHB1dDE7CiAgICAgICAgICAgICAvLyBBcyBhbGwgYWN0aXZlIHRyYWNrcyBvbiBkdXBsaWNhdGVkIG91dHB1dCB3aWxsIGJlIGRlbGV0ZWQsCiAgICAgICAgICAgICAvLyBhbmQgYXMgdGhleSB3ZXJlIGFsc28gcmVmZXJlbmNlZCBvbiB0aGUgb3RoZXIgb3V0cHV0LCB0aGUgcmVmZXJlbmNlCiAgICAgICAgICAgICAvLyBjb3VudCBmb3IgdGhlaXIgc3RyZWFtIHR5cGUgbXVzdCBiZSBhZGp1c3RlZCBhY2NvcmRpbmdseSBvbgogICAgICAgICAgICAgLy8gdGhlIG90aGVyIG91dHB1dC4KLSAgICAgICAgICAgIGJvb2wgd2FzQWN0aXZlID0gb3V0cHV0RGVzYzItPmlzQWN0aXZlKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IEFVRElPX1NUUkVBTV9DTlQ7IGorKykgewotICAgICAgICAgICAgICAgIGludCByZWZDb3VudCA9IGR1cE91dHB1dERlc2MtPm1SZWZDb3VudFtqXTsKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjMi0+Y2hhbmdlUmVmQ291bnQoKGF1ZGlvX3N0cmVhbV90eXBlX3QpaiwtcmVmQ291bnQpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgYm9vbCB3YXNBY3RpdmUgPSByZW1haW5pbmdPdXRwdXQtPmlzQWN0aXZlKCk7CisgICAgICAgICAgICAvLyBOb3RlOiBuby1vcCBvbiB0aGUgY2xvc2luZyBvdXRwdXQgd2hlcmUgYWxsIGNsaWVudHMgaGFzIGFscmVhZHkgYmVlbiBzZXQgaW5hY3RpdmUKKyAgICAgICAgICAgIGR1cE91dHB1dC0+c2V0QWxsQ2xpZW50c0luYWN0aXZlKCk7CiAgICAgICAgICAgICAvLyBzdG9wKCkgd2lsbCBiZSBhIG5vIG9wIGlmIHRoZSBvdXRwdXQgaXMgc3RpbGwgYWN0aXZlIGJ1dCBpcyBuZWVkZWQgaW4gY2FzZSBhbGwKICAgICAgICAgICAgIC8vIGFjdGl2ZSBzdHJlYW1zIHJlZmNvdW50cyB3aGVyZSBjbGVhcmVkIGFib3ZlCiAgICAgICAgICAgICBpZiAod2FzQWN0aXZlKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYzItPnN0b3AoKTsKKyAgICAgICAgICAgICAgICByZW1haW5pbmdPdXRwdXQtPnN0b3AoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGR1cGxpY2F0ZWRPdXRwdXQgPSBtT3V0cHV0cy5rZXlBdChpKTsKICAgICAgICAgICAgIEFMT0dWKCJjbG9zZU91dHB1dCgpIGNsb3NpbmcgYWxzbyBkdXBsaWNhdGVkIG91dHB1dCAlZCIsIGR1cGxpY2F0ZWRPdXRwdXQpOwpAQCAtNDYzNiw3ICs0OTE3LDcgQEAKIAogICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CiAKLSAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoY2xvc2luZ091dHB1dC0+Z2V0UGF0Y2hIYW5kbGUoKSk7CiAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKICAgICAgICAgKHZvaWQpIC8qc3RhdHVzX3Qgc3RhdHVzKi8gbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIDApOwpAQCAtNDY0NCwxMCArNDkyNSwzMSBAQAogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgIH0KIAotICAgIG91dHB1dERlc2MtPmNsb3NlKCk7CisgICAgaWYgKGNsb3NpbmdPdXRwdXRXYXNBY3RpdmUpIHsKKyAgICAgICAgY2xvc2luZ091dHB1dC0+c3RvcCgpOworICAgIH0KKyAgICBjbG9zaW5nT3V0cHV0LT5jbG9zZSgpOwogCiAgICAgcmVtb3ZlT3V0cHV0KG91dHB1dCk7CiAgICAgbVByZXZpb3VzT3V0cHV0cyA9IG1PdXRwdXRzOworCisgICAgLy8gTVNEIHBhdGNoZXMgbWF5IGhhdmUgYmVlbiByZWxlYXNlZCB0byBzdXBwb3J0IGEgbm9uLU1TRCBkaXJlY3Qgb3V0cHV0LiBSZXNldCBNU0QgcGF0Y2ggaWYKKyAgICAvLyBubyBkaXJlY3Qgb3V0cHV0cyBhcmUgb3Blbi4KKyAgICBpZiAoIWdldE1zZEF1ZGlvT3V0RGV2aWNlcygpLmlzRW1wdHkoKSkgeworICAgICAgICBib29sIGRpcmVjdE91dHB1dE9wZW4gPSBmYWxzZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKG1PdXRwdXRzW2ldLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpIHsKKyAgICAgICAgICAgICAgICBkaXJlY3RPdXRwdXRPcGVuID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWRpcmVjdE91dHB1dE9wZW4pIHsKKyAgICAgICAgICAgIEFMT0dWKCJubyBkaXJlY3Qgb3V0cHV0cyBvcGVuLCByZXNldCBNU0QgcGF0Y2giKTsKKyAgICAgICAgICAgIHNldE1zZFBhdGNoKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjbGVhblVwRWZmZWN0c0ZvcklvKG91dHB1dCk7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KQpAQCAtNDY2Miw2ICs0OTY0LDcgQEAKIAogICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CiAKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPSBpbnB1dERlc2MtPmdldERldmljZSgpOwogICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaW5wdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOwpAQCAtNDY3Miw1MSArNDk3NSw2OSBAQAogCiAgICAgaW5wdXREZXNjLT5jbG9zZSgpOwogICAgIG1JbnB1dHMucmVtb3ZlSXRlbShpbnB1dCk7CisKKyAgICBEZXZpY2VWZWN0b3IgcHJpbWFyeUlucHV0RGV2aWNlcyA9IGF2YWlsYWJsZVByaW1hcnlNb2R1bGVJbnB1dERldmljZXMoKTsKKyAgICBpZiAocHJpbWFyeUlucHV0RGV2aWNlcy5jb250YWlucyhkZXZpY2UpICYmCisgICAgICAgICAgICBtSW5wdXRzLmFjdGl2ZUlucHV0c0NvdW50T25EZXZpY2VzKHByaW1hcnlJbnB1dERldmljZXMpID09IDApIHsKKyAgICAgICAgU291bmRUcmlnZ2VyOjpzZXRDYXB0dXJlU3RhdGUoZmFsc2UpOworICAgIH0KKworICAgIGNsZWFuVXBFZmZlY3RzRm9ySW8oaW5wdXQpOwogfQogCi1Tb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0c0ZvckRldmljZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uJiBvcGVuT3V0cHV0cykKK1NvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRzRm9yRGV2aWNlcygKKyAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcywKKyAgICAgICAgICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uJiBvcGVuT3V0cHV0cykKIHsKICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHM7CiAKLSAgICBBTE9HVlYoImdldE91dHB1dHNGb3JEZXZpY2UoKSBkZXZpY2UgJTA0eCIsIGRldmljZSk7CisgICAgQUxPR1ZWKCIlcygpIGRldmljZXMgJXMiLCBfX2Z1bmNfXywgZGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3Blbk91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgQUxPR1ZWKCJvdXRwdXQgJXp1IGlzRHVwbGljYXRlZD0lZCBkZXZpY2U9JTA0eCIsCisgICAgICAgIEFMT0dWVigib3V0cHV0ICV6dSBpc0R1cGxpY2F0ZWQ9JWQgZGV2aWNlPSVzIiwKICAgICAgICAgICAgICAgICBpLCBvcGVuT3V0cHV0cy52YWx1ZUF0KGkpLT5pc0R1cGxpY2F0ZWQoKSwKLSAgICAgICAgICAgICAgICBvcGVuT3V0cHV0cy52YWx1ZUF0KGkpLT5zdXBwb3J0ZWREZXZpY2VzKCkpOwotICAgICAgICBpZiAoKGRldmljZSAmIG9wZW5PdXRwdXRzLnZhbHVlQXQoaSktPnN1cHBvcnRlZERldmljZXMoKSkgPT0gZGV2aWNlKSB7Ci0gICAgICAgICAgICBBTE9HVlYoImdldE91dHB1dHNGb3JEZXZpY2UoKSBmb3VuZCBvdXRwdXQgJWQiLCBvcGVuT3V0cHV0cy5rZXlBdChpKSk7CisgICAgICAgICAgICAgICAgb3Blbk91dHB1dHMudmFsdWVBdChpKS0+c3VwcG9ydGVkRGV2aWNlcygpLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIGlmIChvcGVuT3V0cHV0cy52YWx1ZUF0KGkpLT5zdXBwb3J0c0FsbERldmljZXMoZGV2aWNlcykKKyAgICAgICAgICAgICAgICAmJiBvcGVuT3V0cHV0cy52YWx1ZUF0KGkpLT5kZXZpY2VTdXBwb3J0c0VuY29kZWRGb3JtYXRzKGRldmljZXMudHlwZXMoKSkpIHsKKyAgICAgICAgICAgIEFMT0dWVigiJXMoKSBmb3VuZCBvdXRwdXQgJWQiLCBfX2Z1bmNfXywgb3Blbk91dHB1dHMua2V5QXQoaSkpOwogICAgICAgICAgICAgb3V0cHV0cy5hZGQob3Blbk91dHB1dHMua2V5QXQoaSkpOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBvdXRwdXRzOwogfQogCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6dmVjdG9yc0VxdWFsKFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMikKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0ZvckRldmljZUFuZE91dHB1dENoYW5nZXMoc3RkOjpmdW5jdGlvbjxib29sKCk+IG9uT3V0cHV0c0NoZWNrZWQpCiB7Ci0gICAgaWYgKG91dHB1dHMxLnNpemUoKSAhPSBvdXRwdXRzMi5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8vIGNoZWNrQTJkcFN1c3BlbmQgbXVzdCBydW4gYmVmb3JlIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcyBzbyB0aGF0IEEyRFAKKyAgICAvLyBvdXRwdXQgaXMgc3VzcGVuZGVkIGJlZm9yZSBhbnkgdHJhY2tzIGFyZSBtb3ZlZCB0byBpdAorICAgIGNoZWNrQTJkcFN1c3BlbmQoKTsKKyAgICBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKKyAgICBjaGVja1NlY29uZGFyeU91dHB1dHMoKTsKKyAgICBpZiAob25PdXRwdXRzQ2hlY2tlZCAhPSBudWxscHRyICYmIG9uT3V0cHV0c0NoZWNrZWQoKSkgY2hlY2tBMmRwU3VzcGVuZCgpOworICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CisgICAgaWYgKG1Id01vZHVsZXMuZ2V0TW9kdWxlRnJvbU5hbWUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCkgIT0gMCkgeworICAgICAgICBzZXRNc2RQYXRjaCgpOwogICAgIH0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dHMxLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChvdXRwdXRzMVtpXSAhPSBvdXRwdXRzMltpXSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tPdXRwdXRGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KQorYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmZvbGxvd3NTYW1lUm91dGluZyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmxBdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJnJBdHRyKSBjb25zdAogewotICAgIGF1ZGlvX2RldmljZXNfdCBvbGREZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gc3JjT3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2Uob2xkRGV2aWNlLCBtUHJldmlvdXNPdXRwdXRzKTsKLSAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IGRzdE91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKG5ld0RldmljZSwgbU91dHB1dHMpOworICAgIHJldHVybiBtRW5naW5lLT5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKGxBdHRyKSA9PQorICAgICAgICAgICAgbUVuZ2luZS0+Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhyQXR0cik7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja091dHB1dEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKQoreworICAgIGF1dG8gcHNJZCA9IG1FbmdpbmUtPmdldFByb2R1Y3RTdHJhdGVneUZvckF0dHJpYnV0ZXMoYXR0cik7CisKKyAgICBEZXZpY2VWZWN0b3Igb2xkRGV2aWNlcyA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHIsIDAsIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgRGV2aWNlVmVjdG9yIG5ld0RldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyLCAwLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IHNyY091dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlcyhvbGREZXZpY2VzLCBtUHJldmlvdXNPdXRwdXRzKTsKKyAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IGRzdE91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlcyhuZXdEZXZpY2VzLCBtT3V0cHV0cyk7CiAKICAgICAvLyBhbHNvIHRha2UgaW50byBhY2NvdW50IGV4dGVybmFsIHBvbGljeS1yZWxhdGVkIGNoYW5nZXM6IGFkZCBhbGwgb3V0cHV0cyB3aGljaCBhcmUKICAgICAvLyBhc3NvY2lhdGVkIHdpdGggcG9saWNpZXMgaW4gdGhlICJiZWZvcmUiIGFuZCAiYWZ0ZXIiIG91dHB1dCB2ZWN0b3JzCi0gICAgQUxPR1ZWKCJjaGVja091dHB1dEZvclN0cmF0ZWd5KCk6IHBvbGljeSByZWxhdGVkIG91dHB1dHMiKTsKKyAgICBBTE9HVlYoIiVzKCk6IHBvbGljeSByZWxhdGVkIG91dHB1dHMiLCBfX2Z1bmNfXyk7CiAgICAgZm9yIChzaXplX3QgaSA9IDAgOyBpIDwgbVByZXZpb3VzT3V0cHV0cy5zaXplKCkgOyBpKyspIHsKICAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtUHJldmlvdXNPdXRwdXRzLnZhbHVlQXQoaSk7CiAgICAgICAgIGlmIChkZXNjICE9IDAgJiYgZGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKSB7CkBAIC00NzMyLDcgKzUwNTMsNyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKCF2ZWN0b3JzRXF1YWwoc3JjT3V0cHV0cyxkc3RPdXRwdXRzKSkgeworICAgIGlmIChzcmNPdXRwdXRzICE9IGRzdE91dHB1dHMpIHsKICAgICAgICAgLy8gZ2V0IG1heGltdW0gbGF0ZW5jeSBvZiBhbGwgc291cmNlIG91dHB1dHMgdG8gZGV0ZXJtaW5lIHRoZSBtaW5pbXVtIG11dGUgdGltZSBndWFyYW50ZWVpbmcKICAgICAgICAgLy8gYXVkaW8gZnJvbSBpbnZhbGlkYXRlZCB0cmFja3Mgd2lsbCBiZSByZW5kZXJlZCB3aGVuIHVubXV0aW5nCiAgICAgICAgIHVpbnQzMl90IG1heExhdGVuY3kgPSAwOwpAQCAtNDc0Miw0OCArNTA2Myw2NCBAQAogICAgICAgICAgICAgICAgIG1heExhdGVuY3kgPSBkZXNjLT5sYXRlbmN5KCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koKSBzdHJhdGVneSAlZCwgbW92aW5nIGZyb20gb3V0cHV0ICVkIHRvIG91dHB1dCAlZCIsCi0gICAgICAgICAgICAgIHN0cmF0ZWd5LCBzcmNPdXRwdXRzWzBdLCBkc3RPdXRwdXRzWzBdKTsKKyAgICAgICAgQUxPR1ZfSUYoIShzcmNPdXRwdXRzLmlzRW1wdHkoKSB8fCBkc3RPdXRwdXRzLmlzRW1wdHkoKSksCisgICAgICAgICAgICAgICIlczogc3RyYXRlZ3kgJWQsIG1vdmluZyBmcm9tIG91dHB1dCAlcyB0byBvdXRwdXQgJXMiLCBfX2Z1bmNfXywgcHNJZCwKKyAgICAgICAgICAgICAgc3RkOjp0b19zdHJpbmcoc3JjT3V0cHV0c1swXSkuY19zdHIoKSwKKyAgICAgICAgICAgICAgc3RkOjp0b19zdHJpbmcoZHN0T3V0cHV0c1swXSkuY19zdHIoKSk7CiAgICAgICAgIC8vIG11dGUgc3RyYXRlZ3kgd2hpbGUgbW92aW5nIHRyYWNrcyBmcm9tIG9uZSBvdXRwdXQgdG8gYW5vdGhlcgogICAgICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IHNyY091dCA6IHNyY091dHB1dHMpIHsKICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbVByZXZpb3VzT3V0cHV0cy52YWx1ZUZvcihzcmNPdXQpOwotICAgICAgICAgICAgaWYgKGRlc2MgIT0gMCAmJiBpc1N0cmF0ZWd5QWN0aXZlKGRlc2MsIHN0cmF0ZWd5KSkgewotICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShzdHJhdGVneSwgdHJ1ZSwgZGVzYyk7Ci0gICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKHN0cmF0ZWd5LCBmYWxzZSwgZGVzYywgbWF4TGF0ZW5jeSAqIExBVEVOQ1lfTVVURV9GQUNUT1IsIG5ld0RldmljZSk7CisgICAgICAgICAgICBpZiAoZGVzYyAhPSAwICYmIGRlc2MtPmlzU3RyYXRlZ3lBY3RpdmUocHNJZCkpIHsKKyAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUocHNJZCwgdHJ1ZSwgZGVzYyk7CisgICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKHBzSWQsIGZhbHNlLCBkZXNjLCBtYXhMYXRlbmN5ICogTEFURU5DWV9NVVRFX0ZBQ1RPUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGV2aWNlcy50eXBlcygpKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gc291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgZ2V0U291cmNlRm9yU3RyYXRlZ3lPbk91dHB1dChzcmNPdXQsIHN0cmF0ZWd5KTsKKyAgICAgICAgICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IHNvdXJjZSA9IGdldFNvdXJjZUZvckF0dHJpYnV0ZXNPbk91dHB1dChzcmNPdXQsIGF0dHIpOwogICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSAwKXsKICAgICAgICAgICAgICAgICBjb25uZWN0QXVkaW9Tb3VyY2Uoc291cmNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIC8vIE1vdmUgZWZmZWN0cyBhc3NvY2lhdGVkIHRvIHRoaXMgc3RyYXRlZ3kgZnJvbSBwcmV2aW91cyBvdXRwdXQgdG8gbmV3IG91dHB1dAotICAgICAgICBpZiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfTUVESUEpIHsKKyAgICAgICAgLy8gTW92ZSBlZmZlY3RzIGFzc29jaWF0ZWQgdG8gdGhpcyBzdHJlYW0gZnJvbSBwcmV2aW91cyBvdXRwdXQgdG8gbmV3IG91dHB1dAorICAgICAgICBpZiAoZm9sbG93c1NhbWVSb3V0aW5nKGF0dHIsIGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfTUVESUEpKSkgewogICAgICAgICAgICAgc2VsZWN0T3V0cHV0Rm9yTXVzaWNFZmZlY3RzKCk7CiAgICAgICAgIH0KLSAgICAgICAgLy8gTW92ZSB0cmFja3MgYXNzb2NpYXRlZCB0byB0aGlzIHN0cmF0ZWd5IGZyb20gcHJldmlvdXMgb3V0cHV0IHRvIG5ldyBvdXRwdXQKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IGkrKykgewotICAgICAgICAgICAgaWYgKGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KWkpID09IHN0cmF0ZWd5KSB7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSk7Ci0gICAgICAgICAgICB9CisgICAgICAgIC8vIE1vdmUgdHJhY2tzIGFzc29jaWF0ZWQgdG8gdGhpcyBzdHJlYW0gKGFuZCBsaW5rZWQpIGZyb20gcHJldmlvdXMgb3V0cHV0IHRvIG5ldyBvdXRwdXQKKyAgICAgICAgZm9yIChhdXRvIHN0cmVhbSA6ICBtRW5naW5lLT5nZXRTdHJlYW1UeXBlc0ZvclByb2R1Y3RTdHJhdGVneShwc0lkKSkgeworICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oc3RyZWFtKTsKICAgICAgICAgfQogICAgIH0KIH0KIAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpCiB7Ci0gICAgaWYgKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKQotICAgICAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpOwotICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUpOwotICAgIGlmIChtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkKLSAgICAgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKTsKLSAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTik7Ci0gICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCk7Ci0gICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9BQ0NFU1NJQklMSVRZKTsKLSAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX01FRElBKTsKLSAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX0RUTUYpOwotICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfUkVST1VUSU5HKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnN0cmF0ZWd5IDogbUVuZ2luZS0+Z2V0T3JkZXJlZFByb2R1Y3RTdHJhdGVnaWVzKCkpIHsKKyAgICAgICAgYXV0byBhdHRyaWJ1dGVzID0gbUVuZ2luZS0+Z2V0QWxsQXR0cmlidXRlc0ZvclByb2R1Y3RTdHJhdGVneShzdHJhdGVneSkuZnJvbnQoKTsKKyAgICAgICAgY2hlY2tPdXRwdXRGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrU2Vjb25kYXJ5T3V0cHV0cygpIHsKKyAgICBzdGQ6OnNldDxhdWRpb19zdHJlYW1fdHlwZV90PiBzdHJlYW1zVG9JbnZhbGlkYXRlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjcmlwdG9yID0gbU91dHB1dHNbaV07CisgICAgICAgIGZvciAoY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50IDogb3V0cHV0RGVzY3JpcHRvci0+Z2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2M7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4+IHNlY29uZGFyeURlc2NzOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVBvbGljeU1peGVzLmdldE91dHB1dEZvckF0dHIoY2xpZW50LT5hdHRyaWJ1dGVzKCksIGNsaWVudC0+dWlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmZsYWdzKCksIGRlc2MsICZzZWNvbmRhcnlEZXNjcyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE9LIHx8CisgICAgICAgICAgICAgICAgIXN0ZDo6ZXF1YWwoY2xpZW50LT5nZXRTZWNvbmRhcnlPdXRwdXRzKCkuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmdldFNlY29uZGFyeU91dHB1dHMoKS5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlEZXNjcy5iZWdpbigpLCBzZWNvbmRhcnlEZXNjcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBzdHJlYW1zVG9JbnZhbGlkYXRlLmluc2VydChjbGllbnQtPnN0cmVhbSgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtIDogc3RyZWFtc1RvSW52YWxpZGF0ZSkgeworICAgICAgICBBTE9HRCgiJXMgSW52YWxpZGF0ZSBzdHJlYW0gJWQgZHVlIHRvIHNlY29uZGFyeSBvdXRwdXQgY2hhbmdlIiwgX19mdW5jX18sIHN0cmVhbSk7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKHN0cmVhbSk7CisgICAgfQogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tBMmRwU3VzcGVuZCgpCkBAIC00ODM2LDEwOCArNTE3Myw4NyBAQAogICAgIH0KIH0KIAotYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TmV3T3V0cHV0RGV2aWNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUpCitEZXZpY2VWZWN0b3IgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXROZXdPdXRwdXREZXZpY2VzKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUpCiB7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworICAgIERldmljZVZlY3RvciBkZXZpY2VzOwogCiAgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOwogICAgICAgICBpZiAocGF0Y2hEZXNjLT5tVWlkICE9IG1VaWRDYWNoZWQpIHsKLSAgICAgICAgICAgIEFMT0dWKCJnZXROZXdPdXRwdXREZXZpY2UoKSBkZXZpY2UgJTA4eCBmb3JjZWQgYnkgcGF0Y2ggJWQiLAotICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+ZGV2aWNlKCksIG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOwotICAgICAgICAgICAgcmV0dXJuIG91dHB1dERlc2MtPmRldmljZSgpOworICAgICAgICAgICAgQUxPR1YoIiVzIGRldmljZSAlcyBmb3JjZWQgYnkgcGF0Y2ggJWQiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmRldmljZXMoKS50b1N0cmluZygpLmNfc3RyKCksIG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOworICAgICAgICAgICAgcmV0dXJuICBvdXRwdXREZXNjLT5kZXZpY2VzKCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBDaGVjayBpZiBhbiBleHBsaWNpdCByb3V0aW5nIHJlcXVlc3QgZXhpc3RzIGZvciBhbiBhY3RpdmUgc3RyZWFtIG9uIHRoaXMgb3V0cHV0IGFuZAotICAgIC8vIHVzZSBpdCBpbiBwcmlvcml0eSBiZWZvcmUgYW55IG90aGVyIHJ1bGUKLSAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IHN0cmVhbSsrKSB7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5pc1N0cmVhbUFjdGl2ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0pKSB7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZm9yY2VkRGV2aWNlID0KLSAgICAgICAgICAgICAgICAgICAgbU91dHB1dFJvdXRlcy5nZXRBY3RpdmVEZXZpY2VGb3JTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7CisgICAgLy8gSG9ub3IgZXhwbGljaXQgcm91dGluZyByZXF1ZXN0cyBvbmx5IGlmIG5vIGNsaWVudCB1c2luZyBkZWZhdWx0IHJvdXRpbmcgaXMgYWN0aXZlIG9uIHRoaXMKKyAgICAvLyBpbnB1dDogYSBzcGVjaWZpYyBhcHAgY2FuIG5vdCBmb3JjZSByb3V0aW5nIGZvciBvdGhlciBhcHBzIGJ5IHNldHRpbmcgYSBwcmVmZXJyZWQgZGV2aWNlLgorICAgIGJvb2wgYWN0aXZlOyAvLyB1bnVzZWQKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPQorICAgICAgICBmaW5kUHJlZmVycmVkRGV2aWNlKG91dHB1dERlc2MsIFBST0RVQ1RfU1RSQVRFR1lfTk9ORSwgYWN0aXZlLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7CisgICAgaWYgKGRldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBEZXZpY2VWZWN0b3IoZGV2aWNlKTsKKyAgICB9CiAKLSAgICAgICAgICAgIGlmIChmb3JjZWREZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZm9yY2VkRGV2aWNlOwotICAgICAgICAgICAgfQorICAgIC8vIExlZ2FjeSBFbmdpbmUgY2Fubm90IHRha2UgY2FyZSBvZiBidXMgZGV2aWNlcyBhbmQgbWl4LCBzbyB3ZSBuZWVkIHRvIGhhbmRsZSB0aGUgY29uZmxpY3QKKyAgICAvLyBvZiBzZXRGb3JjZVVzZSAvIERlZmF1bHQgQnVzIGRldmljZSBoZXJlCisgICAgZGV2aWNlID0gbVBvbGljeU1peGVzLmdldERldmljZUFuZE1peEZvck91dHB1dChvdXRwdXREZXNjLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7CisgICAgaWYgKGRldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBEZXZpY2VWZWN0b3IoZGV2aWNlKTsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnByb2R1Y3RTdHJhdGVneSA6IG1FbmdpbmUtPmdldE9yZGVyZWRQcm9kdWN0U3RyYXRlZ2llcygpKSB7CisgICAgICAgIFN0cmVhbVR5cGVWZWN0b3Igc3RyZWFtcyA9IG1FbmdpbmUtPmdldFN0cmVhbVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3RTdHJhdGVneSk7CisgICAgICAgIGF1dG8gYXR0ciA9IG1FbmdpbmUtPmdldEFsbEF0dHJpYnV0ZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdFN0cmF0ZWd5KS5mcm9udCgpOworCisgICAgICAgIGlmICgoaGFzVm9pY2VTdHJlYW0oc3RyZWFtcykgJiYKKyAgICAgICAgICAgICAoaXNJbkNhbGwoKSB8fCBtT3V0cHV0cy5pc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlKHByb2R1Y3RTdHJhdGVneSwgb3V0cHV0RGVzYykpKSB8fAorICAgICAgICAgICAgICgoaGFzU3RyZWFtKHN0cmVhbXMsIEFVRElPX1NUUkVBTV9BTEFSTSkgfHwgaGFzU3RyZWFtKHN0cmVhbXMsIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKSkgJiYKKyAgICAgICAgICAgICAgICBtT3V0cHV0cy5pc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlKHByb2R1Y3RTdHJhdGVneSwgb3V0cHV0RGVzYykpIHx8CisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZShwcm9kdWN0U3RyYXRlZ3kpKSB7CisgICAgICAgICAgICAvLyBSZXRyaWV2YWwgb2YgZGV2aWNlcyBmb3Igdm9pY2UgREwgaXMgZG9uZSBvbiBwcmltYXJ5IG91dHB1dCBwcm9maWxlLCBjYW5ub3QKKyAgICAgICAgICAgIC8vIGNoZWNrIHRoZSByb3V0ZSAod291bGQgZm9yY2UgbW9kaWZ5aW5nIGNvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhpcyBwcm9maWxlKQorICAgICAgICAgICAgZGV2aWNlcyA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHIsIG51bGxwdHIsIGZyb21DYWNoZSk7CisgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KLQotICAgIC8vIGNoZWNrIHRoZSBmb2xsb3dpbmcgYnkgb3JkZXIgb2YgcHJpb3JpdHkgdG8gcmVxdWVzdCBhIHJvdXRpbmcgY2hhbmdlIGlmIG5lY2Vzc2FyeToKLSAgICAvLyAxOiB0aGUgc3RyYXRlZ3kgZW5mb3JjZWQgYXVkaWJsZSBpcyBhY3RpdmUgYW5kIGVuZm9yY2VkIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBlbmZvcmNlZCBhdWRpYmxlCi0gICAgLy8gMjogd2UgYXJlIGluIGNhbGwgb3IgdGhlIHN0cmF0ZWd5IHBob25lIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgcGhvbmUKLSAgICAvLyAzOiB0aGUgc3RyYXRlZ3kgc29uaWZpY2F0aW9uIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgc29uaWZpY2F0aW9uCi0gICAgLy8gNDogdGhlIHN0cmF0ZWd5IGZvciBlbmZvcmNlZCBhdWRpYmxlIGlzIGFjdGl2ZSBidXQgbm90IGVuZm9yY2VkIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgdGhlIGRldmljZSBmb3Igc3RyYXRlZ3kgZW5mb3JjZWQgYXVkaWJsZQotICAgIC8vIDU6IHRoZSBzdHJhdGVneSBhY2Nlc3NpYmlsaXR5IGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgYWNjZXNzaWJpbGl0eQotICAgIC8vIDY6IHRoZSBzdHJhdGVneSAicmVzcGVjdGZ1bCIgc29uaWZpY2F0aW9uIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgInJlc3BlY3RmdWwiIHNvbmlmaWNhdGlvbgotICAgIC8vIDc6IHRoZSBzdHJhdGVneSBtZWRpYSBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKLSAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IG1lZGlhCi0gICAgLy8gODogdGhlIHN0cmF0ZWd5IERUTUYgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBEVE1GCi0gICAgLy8gOTogdGhlIHN0cmF0ZWd5IGZvciBiZWFjb24sIGEuay5hLiAidHJhbnNtaXR0ZWQgdGhyb3VnaCBzcGVha2VyIiBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKLSAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IHQtdC1zCi0KLSAgICAvLyBGSVhNRTogZXh0ZW5kIHVzZSBvZiBpc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlKCkgdG8gYWxsIHN0cmF0ZWdpZXMKLSAgICAvLyB3aXRoIGEgcmVmaW5lZCBydWxlIGNvbnNpZGVyaW5nIG11dHVhbGx5IGV4Y2x1c2l2ZSBkZXZpY2VzICh1c2luZyBzYW1lIGJhY2tlbmQpCi0gICAgLy8gYXMgb3Bwb3NlZCB0byBhbGwgc3RyZWFtcyBvbiB0aGUgc2FtZSBhdWRpbyBIQUwgbW9kdWxlLgotICAgIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpICYmCi0gICAgICAgIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUsIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChpc0luQ2FsbCgpIHx8Ci0gICAgICAgICAgICAgICBpc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlKG91dHB1dERlc2MsIFNUUkFURUdZX1BIT05FKSkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9QSE9ORSwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT04sIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUsIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX0FDQ0VTU0lCSUxJVFksIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKSkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfTUVESUEpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX01FRElBLCBmcm9tQ2FjaGUpOwotICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9EVE1GKSkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9EVE1GLCBmcm9tQ2FjaGUpOwotICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVIpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUiwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfUkVST1VUSU5HKSkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9SRVJPVVRJTkcsIGZyb21DYWNoZSk7Ci0gICAgfQotCi0gICAgQUxPR1YoImdldE5ld091dHB1dERldmljZSgpIHNlbGVjdGVkIGRldmljZSAleCIsIGRldmljZSk7Ci0gICAgcmV0dXJuIGRldmljZTsKKyAgICBBTE9HVigiJXMgc2VsZWN0ZWQgZGV2aWNlcyAlcyIsIF9fZnVuY19fLCBkZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgcmV0dXJuIGRldmljZXM7CiB9CiAKLWF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE5ld0lucHV0RGV2aWNlKGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiYgaW5wdXREZXNjKQorc3A8RGV2aWNlRGVzY3JpcHRvcj4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXROZXdJbnB1dERldmljZSgKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+JiBpbnB1dERlc2MpCiB7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKIAogICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaW5wdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOwogICAgICAgICBpZiAocGF0Y2hEZXNjLT5tVWlkICE9IG1VaWRDYWNoZWQpIHsKLSAgICAgICAgICAgIEFMT0dWKCJnZXROZXdJbnB1dERldmljZSgpIGRldmljZSAlMDh4IGZvcmNlZCBieSBwYXRjaCAlZCIsCi0gICAgICAgICAgICAgICAgICBpbnB1dERlc2MtPm1EZXZpY2UsIGlucHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gaW5wdXREZXNjLT5tRGV2aWNlOworICAgICAgICAgICAgQUxPR1YoImdldE5ld0lucHV0RGV2aWNlKCkgZGV2aWNlICVzIGZvcmNlZCBieSBwYXRjaCAlZCIsCisgICAgICAgICAgICAgICAgICBpbnB1dERlc2MtPmdldERldmljZSgpLT50b1N0cmluZygpLmNfc3RyKCksIGlucHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7CisgICAgICAgICAgICByZXR1cm4gaW5wdXREZXNjLT5nZXREZXZpY2UoKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIElmIHdlIGFyZSBub3QgaW4gY2FsbCBhbmQgbm8gY2xpZW50IGlzIGFjdGl2ZSBvbiB0aGlzIGlucHV0LCB0aGlzIG1ldGhvZHMgcmV0dXJucwotICAgIC8vIEFVRElPX0RFVklDRV9OT05FLCBjYXVzaW5nIHRoZSBwYXRjaCBvbiB0aGUgaW5wdXQgc3RyZWFtIHRvIGJlIHJlbGVhc2VkLgotICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IGlucHV0RGVzYy0+Z2V0SGlnaGVzdFByaW9yaXR5U291cmNlKHRydWUgLyphY3RpdmVPbmx5Ki8pOwotICAgIGlmIChzb3VyY2UgPT0gQVVESU9fU09VUkNFX0RFRkFVTFQgJiYgaXNJbkNhbGwoKSkgewotICAgICAgICBzb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTjsKKyAgICAvLyBIb25vciBleHBsaWNpdCByb3V0aW5nIHJlcXVlc3RzIG9ubHkgaWYgbm8gY2xpZW50IHVzaW5nIGRlZmF1bHQgcm91dGluZyBpcyBhY3RpdmUgb24gdGhpcworICAgIC8vIGlucHV0OiBhIHNwZWNpZmljIGFwcCBjYW4gbm90IGZvcmNlIHJvdXRpbmcgZm9yIG90aGVyIGFwcHMgYnkgc2V0dGluZyBhIHByZWZlcnJlZCBkZXZpY2UuCisgICAgYm9vbCBhY3RpdmU7CisgICAgZGV2aWNlID0gZmluZFByZWZlcnJlZERldmljZShpbnB1dERlc2MsIEFVRElPX1NPVVJDRV9ERUZBVUxULCBhY3RpdmUsIG1BdmFpbGFibGVJbnB1dERldmljZXMpOworICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZGV2aWNlOwogICAgIH0KLSAgICBpZiAoc291cmNlICE9IEFVRElPX1NPVVJDRV9ERUZBVUxUKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKHNvdXJjZSk7CisKKyAgICAvLyBJZiB3ZSBhcmUgbm90IGluIGNhbGwgYW5kIG5vIGNsaWVudCBpcyBhY3RpdmUgb24gdGhpcyBpbnB1dCwgdGhpcyBtZXRob2RzIHJldHVybnMKKyAgICAvLyBhIG51bGwgc3A8PiwgY2F1c2luZyB0aGUgcGF0Y2ggb24gdGhlIGlucHV0IHN0cmVhbSB0byBiZSByZWxlYXNlZC4KKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IGlucHV0RGVzYy0+Z2V0SGlnaGVzdFByaW9yaXR5QXR0cmlidXRlcygpOworICAgIGlmIChhdHRyaWJ1dGVzLnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfREVGQVVMVCAmJiBpc0luQ2FsbCgpKSB7CisgICAgICAgIGF0dHJpYnV0ZXMuc291cmNlID0gQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT047CisgICAgfQorICAgIGlmIChhdHRyaWJ1dGVzLnNvdXJjZSAhPSBBVURJT19TT1VSQ0VfREVGQVVMVCkgeworICAgICAgICBkZXZpY2UgPSBtRW5naW5lLT5nZXRJbnB1dERldmljZUZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7CiAgICAgfQogCiAgICAgcmV0dXJuIGRldmljZTsKQEAgLTQ5NDgsNjUgKzUyNjQsNTAgQEAKICAgICByZXR1cm4gKHN0cmVhbTEgPT0gc3RyZWFtMik7CiB9CiAKLXVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIHsKLSAgICByZXR1cm4gKHVpbnQzMl90KWdldFN0cmF0ZWd5KHN0cmVhbSk7Ci19Ci0KIGF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIHsKICAgICAvLyBCeSBjaGVja2luZyB0aGUgcmFuZ2Ugb2Ygc3RyZWFtIGJlZm9yZSBjYWxsaW5nIGdldFN0cmF0ZWd5LCB3ZSBhdm9pZAotICAgIC8vIGdldFN0cmF0ZWd5J3MgYmVoYXZpb3IgZm9yIGludmFsaWQgc3RyZWFtcy4gIGdldFN0cmF0ZWd5IHdvdWxkIGRvIGEgQUxPR0UKLSAgICAvLyBhbmQgdGhlbiByZXR1cm4gU1RSQVRFR1lfTUVESUEsIGJ1dCB3ZSB3YW50IHRvIHJldHVybiB0aGUgZW1wdHkgc2V0LgotICAgIGlmIChzdHJlYW0gPCAoYXVkaW9fc3RyZWFtX3R5cGVfdCkgMCB8fCBzdHJlYW0gPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQpIHsKKyAgICAvLyBnZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtJ3MgYmVoYXZpb3IgZm9yIGludmFsaWQgc3RyZWFtcy4KKyAgICAvLyBlbmdpbmUncyBnZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtIHdvdWxkIGZhbGxiYWNrIG9uIGl0cyBkZWZhdWx0IGJlaGF2aW9yIChtb3N0IHByb2JhYmx5CisgICAgLy8gZGV2aWNlIGZvciBtdXNpYyBzdHJlYW0pLCBidXQgd2Ugd2FudCB0byByZXR1cm4gdGhlIGVtcHR5IHNldC4KKyAgICBpZiAoc3RyZWFtIDwgQVVESU9fU1RSRUFNX01JTiB8fCBzdHJlYW0gPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQpIHsKICAgICAgICAgcmV0dXJuIEFVRElPX0RFVklDRV9OT05FOwogICAgIH0KLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IEFVRElPX0RFVklDRV9OT05FOwotICAgIGZvciAoaW50IGN1clN0cmVhbSA9IDA7IGN1clN0cmVhbSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgY3VyU3RyZWFtKyspIHsKLSAgICAgICAgaWYgKCFzdHJlYW1zTWF0Y2hGb3J2b2x1bWUoc3RyZWFtLCAoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pKSB7CisgICAgRGV2aWNlVmVjdG9yIGFjdGl2ZURldmljZXM7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZXM7CisgICAgZm9yIChhdWRpb19zdHJlYW1fdHlwZV90IGN1clN0cmVhbSA9IEFVRElPX1NUUkVBTV9NSU47IGN1clN0cmVhbSA8IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UOworICAgICAgICAgY3VyU3RyZWFtID0gKGF1ZGlvX3N0cmVhbV90eXBlX3QpIChjdXJTdHJlYW0gKyAxKSkgeworICAgICAgICBpZiAoIXN0cmVhbXNNYXRjaEZvcnZvbHVtZShzdHJlYW0sIGN1clN0cmVhbSkpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgY3VyU3RyYXRlZ3kgPSBnZXRTdHJhdGVneSgoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pOwotICAgICAgICBhdWRpb19kZXZpY2VzX3QgY3VyRGV2aWNlcyA9Ci0gICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKHJvdXRpbmdfc3RyYXRlZ3kpY3VyU3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA6IGdldE91dHB1dHNGb3JEZXZpY2UoY3VyRGV2aWNlcywgbU91dHB1dHMpKSB7CisgICAgICAgIERldmljZVZlY3RvciBjdXJEZXZpY2VzID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbShjdXJTdHJlYW0sIGZhbHNlLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIGRldmljZXMubWVyZ2UoY3VyRGV2aWNlcyk7CisgICAgICAgIGZvciAoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0IDogZ2V0T3V0cHV0c0ZvckRldmljZXMoY3VyRGV2aWNlcywgbU91dHB1dHMpKSB7CiAgICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwotICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSkpIHsKLSAgICAgICAgICAgICAgICBjdXJEZXZpY2VzIHw9IG91dHB1dERlc2MtPmRldmljZSgpOworICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzQWN0aXZlKHRvVm9sdW1lU291cmNlKGN1clN0cmVhbSkpKSB7CisgICAgICAgICAgICAgICAgYWN0aXZlRGV2aWNlcy5tZXJnZShvdXRwdXREZXNjLT5kZXZpY2VzKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGRldmljZXMgfD0gY3VyRGV2aWNlczsKICAgICB9CiAKKyAgICAvLyBGYXZvciBkZXZpY2VzIHNlbGVjdGVkIG9uIGFjdGl2ZSBzdHJlYW1zIGlmIGFueSB0byByZXBvcnQgY29ycmVjdCBkZXZpY2UgaW4gY2FzZSBvZgorICAgIC8vIGV4cGxpY2l0IGRldmljZSBzZWxlY3Rpb24KKyAgICBpZiAoIWFjdGl2ZURldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIGRldmljZXMgPSBhY3RpdmVEZXZpY2VzOworICAgIH0KICAgICAvKkZpbHRlciBTUEVBS0VSX1NBRkUgb3V0IG9mIHJlc3VsdHMsIGFzIEF1ZGlvU2VydmljZSBkb2Vzbid0IGtub3cgYWJvdXQgaXQKICAgICAgIGFuZCBkb2Vzbid0IHJlYWxseSBuZWVkIHRvLiovCi0gICAgaWYgKGRldmljZXMgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSkgewotICAgICAgICBkZXZpY2VzIHw9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKLSAgICAgICAgZGV2aWNlcyAmPSB+QVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkU7CisgICAgRGV2aWNlVmVjdG9yIHNwZWFrZXJTYWZlRGV2aWNlcyA9IGRldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlTWFzayhBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSk7CisgICAgaWYgKCFzcGVha2VyU2FmZURldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIGRldmljZXMubWVyZ2UobUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlTWFzayhBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpKTsKKyAgICAgICAgZGV2aWNlcy5yZW1vdmUoc3BlYWtlclNhZmVEZXZpY2VzKTsKICAgICB9Ci0gICAgcmV0dXJuIGRldmljZXM7Ci19Ci0KLXJvdXRpbmdfc3RyYXRlZ3kgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdHJhdGVneShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKLXsKLSAgICBBTE9HX0FTU0VSVChzdHJlYW0gIT0gQVVESU9fU1RSRUFNX1BBVENILCJnZXRTdHJhdGVneSgpIGNhbGxlZCBmb3IgQVVESU9fU1RSRUFNX1BBVENIIik7Ci0gICAgcmV0dXJuIG1FbmdpbmUtPmdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbSk7Ci19Ci0KLXVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyYXRlZ3lGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cikgewotICAgIC8vIGZsYWdzIHRvIHN0cmF0ZWd5IG1hcHBpbmcKLSAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19CRUFDT04pID09IEFVRElPX0ZMQUdfQkVBQ09OKSB7Ci0gICAgICAgIHJldHVybiAodWludDMyX3QpIFNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUjsKLSAgICB9Ci0gICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgPT0gQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSB7Ci0gICAgICAgIHJldHVybiAodWludDMyX3QpIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEU7Ci0gICAgfQotICAgIC8vIHVzYWdlIHRvIHN0cmF0ZWd5IG1hcHBpbmcKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KG1FbmdpbmUtPmdldFN0cmF0ZWd5Rm9yVXNhZ2UoYXR0ci0+dXNhZ2UpKTsKKyAgICByZXR1cm4gZGV2aWNlcy50eXBlcygpOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aGFuZGxlTm90aWZpY2F0aW9uUm91dGluZ0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgewogICAgIHN3aXRjaChzdHJlYW0pIHsKICAgICBjYXNlIEFVRElPX1NUUkVBTV9NVVNJQzoKLSAgICAgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCk7CisgICAgICAgIGNoZWNrT3V0cHV0Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzX2luaXRpYWxpemVyKEFVRElPX1VTQUdFX05PVElGSUNBVElPTikpOwogICAgICAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgpAQCAtNTA1NywxMSArNTM1OCwxMCBAQAogICAgICAgICAvLyBtdXRlL3VubXV0ZSBBVURJT19TVFJFQU1fVFRTIG9uIGFsbCBvdXRwdXRzCiAgICAgICAgIEFMT0dWKCJcdCBtdXRpbmcgJWQiLCBtdXRlKTsKICAgICAgICAgdWludDMyX3QgbWF4TGF0ZW5jeSA9IDA7CisgICAgICAgIGF1dG8gdHRzVm9sdW1lU291cmNlID0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1RUUyk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgICAgIHNldFN0cmVhbU11dGUoQVVESU9fU1RSRUFNX1RUUywgbXV0ZS8qb24qLywKLSAgICAgICAgICAgICAgICAgICAgZGVzYywKLSAgICAgICAgICAgICAgICAgICAgMCAvKmRlbGF5Ki8sIEFVRElPX0RFVklDRV9OT05FKTsKKyAgICAgICAgICAgIHNldFZvbHVtZVNvdXJjZU11dGUodHRzVm9sdW1lU291cmNlLCBtdXRlLypvbiovLCBkZXNjLCAwIC8qZGVsYXkqLywgQVVESU9fREVWSUNFX05PTkUpOwogICAgICAgICAgICAgY29uc3QgdWludDMyX3QgbGF0ZW5jeSA9IGRlc2MtPmxhdGVuY3koKSAqIDI7CiAgICAgICAgICAgICBpZiAobGF0ZW5jeSA+IG1heExhdGVuY3kpIHsKICAgICAgICAgICAgICAgICBtYXhMYXRlbmN5ID0gbGF0ZW5jeTsKQEAgLTUwNzMsNDAgKzUzNzMsMTQgQEAKICAgICByZXR1cm4gMDsKIH0KIAotYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlKQotewotICAgIC8vIENoZWNrIGlmIGFuIGV4cGxpY2l0IHJvdXRpbmcgcmVxdWVzdCBleGlzdHMgZm9yIGEgc3RyZWFtIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGUKLSAgICAvLyBzcGVjaWZpZWQgc3RyYXRlZ3kgYW5kIHVzZSBpdCBpbiBwcmlvcml0eSBvdmVyIGRlZmF1bHQgcm91dGluZyBydWxlcy4KLSAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IHN0cmVhbSsrKSB7Ci0gICAgICAgIGlmIChnZXRTdHJhdGVneSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0pID09IHN0cmF0ZWd5KSB7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZm9yY2VkRGV2aWNlID0KLSAgICAgICAgICAgICAgICAgICAgbU91dHB1dFJvdXRlcy5nZXRBY3RpdmVEZXZpY2VGb3JTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7Ci0gICAgICAgICAgICBpZiAoZm9yY2VkRGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZvcmNlZERldmljZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChmcm9tQ2FjaGUpIHsKLSAgICAgICAgQUxPR1ZWKCJnZXREZXZpY2VGb3JTdHJhdGVneSgpIGZyb20gY2FjaGUgc3RyYXRlZ3kgJWQsIGRldmljZSAleCIsCi0gICAgICAgICAgICAgIHN0cmF0ZWd5LCBtRGV2aWNlRm9yU3RyYXRlZ3lbc3RyYXRlZ3ldKTsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2VGb3JTdHJhdGVneVtzdHJhdGVneV07Ci0gICAgfQotICAgIHJldHVybiBtRW5naW5lLT5nZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSk7Ci19Ci0KIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpCiB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fU1RSQVRFR0lFUzsgaSsrKSB7Ci0gICAgICAgIG1EZXZpY2VGb3JTdHJhdGVneVtpXSA9IGdldERldmljZUZvclN0cmF0ZWd5KChyb3V0aW5nX3N0cmF0ZWd5KWksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgIH0KKyAgICBtRW5naW5lLT51cGRhdGVEZXZpY2VTZWxlY3Rpb25DYWNoZSgpOwogICAgIG1QcmV2aW91c091dHB1dHMgPSBtT3V0cHV0czsKIH0KIAogdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByZXZEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZwcmV2RGV2aWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zKQogewogICAgIC8vIG11dGUvdW5tdXRlIHN0cmF0ZWdpZXMgdXNpbmcgYW4gaW5jb21wYXRpYmxlIGRldmljZSBjb21iaW5hdGlvbgpAQCAtNTExNywzNCArNTM5MSwzNiBAQAogICAgIH0KIAogICAgIHVpbnQzMl90IG11dGVXYWl0TXMgPSAwOwotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBvdXRwdXREZXNjLT5kZXZpY2UoKTsKLSAgICBib29sIHNob3VsZE11dGUgPSBvdXRwdXREZXNjLT5pc0FjdGl2ZSgpICYmIChwb3Bjb3VudChkZXZpY2UpID49IDIpOworICAgIERldmljZVZlY3RvciBkZXZpY2VzID0gb3V0cHV0RGVzYy0+ZGV2aWNlcygpOworICAgIGJvb2wgc2hvdWxkTXV0ZSA9IG91dHB1dERlc2MtPmlzQWN0aXZlKCkgJiYgKGRldmljZXMuc2l6ZSgpID49IDIpOwogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOVU1fU1RSQVRFR0lFUzsgaSsrKSB7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneSgocm91dGluZ19zdHJhdGVneSlpLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgY3VyRGV2aWNlID0gY3VyRGV2aWNlICYgb3V0cHV0RGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpOwotICAgICAgICBib29sIG11dGUgPSBzaG91bGRNdXRlICYmIChjdXJEZXZpY2UgJiBkZXZpY2UpICYmIChjdXJEZXZpY2UgIT0gZGV2aWNlKTsKKyAgICBhdXRvIHByb2R1Y3RTdHJhdGVnaWVzID0gbUVuZ2luZS0+Z2V0T3JkZXJlZFByb2R1Y3RTdHJhdGVnaWVzKCk7CisgICAgZm9yIChjb25zdCBhdXRvICZwcm9kdWN0U3RyYXRlZ3kgOiBwcm9kdWN0U3RyYXRlZ2llcykgeworICAgICAgICBhdXRvIGF0dHJpYnV0ZXMgPSBtRW5naW5lLT5nZXRBbGxBdHRyaWJ1dGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3RTdHJhdGVneSkuZnJvbnQoKTsKKyAgICAgICAgRGV2aWNlVmVjdG9yIGN1ckRldmljZXMgPQorICAgICAgICAgICAgICAgIG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIG51bGxwdHIsIGZhbHNlLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIGN1ckRldmljZXMgPSBjdXJEZXZpY2VzLmZpbHRlcihvdXRwdXREZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkpOworICAgICAgICBib29sIG11dGUgPSBzaG91bGRNdXRlICYmIGN1ckRldmljZXMuY29udGFpbnNBdExlYXN0T25lKGRldmljZXMpICYmIGN1ckRldmljZXMgIT0gZGV2aWNlczsKICAgICAgICAgYm9vbCBkb011dGUgPSBmYWxzZTsKIAotICAgICAgICBpZiAobXV0ZSAmJiAhb3V0cHV0RGVzYy0+bVN0cmF0ZWd5TXV0ZWRCeURldmljZVtpXSkgeworICAgICAgICBpZiAobXV0ZSAmJiAhb3V0cHV0RGVzYy0+aXNTdHJhdGVneU11dGVkQnlEZXZpY2UocHJvZHVjdFN0cmF0ZWd5KSkgewogICAgICAgICAgICAgZG9NdXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0gPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKCFtdXRlICYmIG91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0peworICAgICAgICAgICAgb3V0cHV0RGVzYy0+c2V0U3RyYXRlZ3lNdXRlZEJ5RGV2aWNlKHByb2R1Y3RTdHJhdGVneSwgdHJ1ZSk7CisgICAgICAgIH0gZWxzZSBpZiAoIW11dGUgJiYgb3V0cHV0RGVzYy0+aXNTdHJhdGVneU11dGVkQnlEZXZpY2UocHJvZHVjdFN0cmF0ZWd5KSkgewogICAgICAgICAgICAgZG9NdXRlID0gdHJ1ZTsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0gPSBmYWxzZTsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPnNldFN0cmF0ZWd5TXV0ZWRCeURldmljZShwcm9kdWN0U3RyYXRlZ3ksIGZhbHNlKTsKICAgICAgICAgfQogICAgICAgICBpZiAoZG9NdXRlKSB7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1PdXRwdXRzLnNpemUoKTsgaisrKSB7CiAgICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChqKTsKICAgICAgICAgICAgICAgICAvLyBza2lwIG91dHB1dCBpZiBpdCBkb2VzIG5vdCBzaGFyZSBhbnkgZGV2aWNlIHdpdGggY3VycmVudCBvdXRwdXQKLSAgICAgICAgICAgICAgICBpZiAoKGRlc2MtPnN1cHBvcnRlZERldmljZXMoKSAmIG91dHB1dERlc2MtPnN1cHBvcnRlZERldmljZXMoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgID09IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgICAgICAgICAgICAgaWYgKCFkZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkuY29udGFpbnNBdExlYXN0T25lKG91dHB1dERlc2MtPnN1cHBvcnRlZERldmljZXMoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dWVigiY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcygpICVzIHN0cmF0ZWd5ICV6dSAoY3VyRGV2aWNlICUwNHgpIiwKLSAgICAgICAgICAgICAgICAgICAgICBtdXRlID8gIm11dGluZyIgOiAidW5tdXRpbmciLCBpLCBjdXJEZXZpY2UpOwotICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZSgocm91dGluZ19zdHJhdGVneSlpLCBtdXRlLCBkZXNjLCBtdXRlID8gMCA6IGRlbGF5TXMpOwotICAgICAgICAgICAgICAgIGlmIChpc1N0cmF0ZWd5QWN0aXZlKGRlc2MsIChyb3V0aW5nX3N0cmF0ZWd5KWkpKSB7CisgICAgICAgICAgICAgICAgQUxPR1ZWKCIlcygpICVzIChjdXJEZXZpY2UgJXMpIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgICAgbXV0ZSA/ICJtdXRpbmciIDogInVubXV0aW5nIiwgY3VyRGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShwcm9kdWN0U3RyYXRlZ3ksIG11dGUsIGRlc2MsIG11dGUgPyAwIDogZGVsYXlNcyk7CisgICAgICAgICAgICAgICAgaWYgKGRlc2MtPmlzU3RyYXRlZ3lBY3RpdmUocHJvZHVjdFN0cmF0ZWd5KSkgewogICAgICAgICAgICAgICAgICAgICBpZiAobXV0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUU6IHNob3VsZCBub3QgbmVlZCB0byBkb3VibGUgbGF0ZW5jeSBpZiB2b2x1bWUgY291bGQgYmUgYXBwbGllZAogICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW1tZWRpYXRlbHkgYnkgdGhlIGF1ZGlvZmxpbmdlciBtaXhlci4gV2UgbXVzdCBhY2NvdW50IGZvciB0aGUgZGVsYXkKQEAgLTUxNjIsMjIgKzU0MzgsMTkgQEAKIAogICAgIC8vIHRlbXBvcmFyeSBtdXRlIG91dHB1dCBpZiBkZXZpY2Ugc2VsZWN0aW9uIGNoYW5nZXMgdG8gYXZvaWQgdm9sdW1lIGJ1cnN0cyBkdWUgdG8KICAgICAvLyBkaWZmZXJlbnQgcGVyIGRldmljZSB2b2x1bWVzCi0gICAgaWYgKG91dHB1dERlc2MtPmlzQWN0aXZlKCkgJiYgKGRldmljZSAhPSBwcmV2RGV2aWNlKSkgeworICAgIGlmIChvdXRwdXREZXNjLT5pc0FjdGl2ZSgpICYmIChkZXZpY2VzICE9IHByZXZEZXZpY2VzKSkgewogICAgICAgICB1aW50MzJfdCB0ZW1wTXV0ZVdhaXRNcyA9IG91dHB1dERlc2MtPmxhdGVuY3koKSAqIDI7CiAgICAgICAgIC8vIHRlbXBvcmFyeSBtdXRlIGR1cmF0aW9uIGlzIGNvbnNlcnZhdGl2ZWx5IHNldCB0byA0IHRpbWVzIHRoZSByZXBvcnRlZCBsYXRlbmN5CiAgICAgICAgIHVpbnQzMl90IHRlbXBNdXRlRHVyYXRpb25NcyA9IG91dHB1dERlc2MtPmxhdGVuY3koKSAqIDQ7CiAgICAgICAgIGlmIChtdXRlV2FpdE1zIDwgdGVtcE11dGVXYWl0TXMpIHsKICAgICAgICAgICAgIG11dGVXYWl0TXMgPSB0ZW1wTXV0ZVdhaXRNczsKICAgICAgICAgfQotCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTlVNX1NUUkFURUdJRVM7IGkrKykgewotICAgICAgICAgICAgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgKHJvdXRpbmdfc3RyYXRlZ3kpaSkpIHsKLSAgICAgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB3ZSBkbyBub3Qgc3RhcnQgdGhlIHRlbXBvcmFyeSBtdXRlIHBlcmlvZCB0b28gZWFybHkgaW4gY2FzZSBvZgotICAgICAgICAgICAgICAgIC8vIGRlbGF5ZWQgZGV2aWNlIGNoYW5nZQotICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZSgocm91dGluZ19zdHJhdGVneSlpLCB0cnVlLCBvdXRwdXREZXNjLCBkZWxheU1zKTsKLSAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoKHJvdXRpbmdfc3RyYXRlZ3kpaSwgZmFsc2UsIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMgKyB0ZW1wTXV0ZUR1cmF0aW9uTXMsIGRldmljZSk7Ci0gICAgICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmYWN0aXZlVnMgOiBvdXRwdXREZXNjLT5nZXRBY3RpdmVWb2x1bWVTb3VyY2VzKCkpIHsKKyAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHdlIGRvIG5vdCBzdGFydCB0aGUgdGVtcG9yYXJ5IG11dGUgcGVyaW9kIHRvbyBlYXJseSBpbiBjYXNlIG9mCisgICAgICAgICAgICAvLyBkZWxheWVkIGRldmljZSBjaGFuZ2UKKyAgICAgICAgICAgIHNldFZvbHVtZVNvdXJjZU11dGUoYWN0aXZlVnMsIHRydWUsIG91dHB1dERlc2MsIGRlbGF5TXMpOworICAgICAgICAgICAgc2V0Vm9sdW1lU291cmNlTXV0ZShhY3RpdmVWcywgZmFsc2UsIG91dHB1dERlc2MsIGRlbGF5TXMgKyB0ZW1wTXV0ZUR1cmF0aW9uTXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZXMudHlwZXMoKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTUxOTAsNDYgKzU0NjMsNDYgQEAKICAgICByZXR1cm4gMDsKIH0KIAotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRPdXRwdXREZXZpY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXF1aXJlc011dGVDaGVjaykKK3VpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0T3V0cHV0RGV2aWNlcyhjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVxdWlyZXNNdXRlQ2hlY2spCiB7Ci0gICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIGRldmljZSAlMDR4IGRlbGF5TXMgJWQiLCBkZXZpY2UsIGRlbGF5TXMpOwotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOworICAgIEFMT0dWKCIlcyBkZXZpY2UgJXMgZGVsYXlNcyAlZCIsIF9fZnVuY19fLCBkZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSwgZGVsYXlNcyk7CiAgICAgdWludDMyX3QgbXV0ZVdhaXRNczsKIAogICAgIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICBtdXRlV2FpdE1zID0gc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MtPnN1Yk91dHB1dDEoKSwgZGV2aWNlLCBmb3JjZSwgZGVsYXlNcywKLSAgICAgICAgICAgICAgICBudWxscHRyIC8qIHBhdGNoSGFuZGxlICovLCBudWxscHRyIC8qIGFkZHJlc3MgKi8sIHJlcXVpcmVzTXV0ZUNoZWNrKTsKLSAgICAgICAgbXV0ZVdhaXRNcyArPSBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYy0+c3ViT3V0cHV0MigpLCBkZXZpY2UsIGZvcmNlLCBkZWxheU1zLAotICAgICAgICAgICAgICAgIG51bGxwdHIgLyogcGF0Y2hIYW5kbGUgKi8sIG51bGxwdHIgLyogYWRkcmVzcyAqLywgcmVxdWlyZXNNdXRlQ2hlY2spOworICAgICAgICBtdXRlV2FpdE1zID0gc2V0T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLT5zdWJPdXRwdXQxKCksIGRldmljZXMsIGZvcmNlLCBkZWxheU1zLAorICAgICAgICAgICAgICAgIG51bGxwdHIgLyogcGF0Y2hIYW5kbGUgKi8sIHJlcXVpcmVzTXV0ZUNoZWNrKTsKKyAgICAgICAgbXV0ZVdhaXRNcyArPSBzZXRPdXRwdXREZXZpY2VzKG91dHB1dERlc2MtPnN1Yk91dHB1dDIoKSwgZGV2aWNlcywgZm9yY2UsIGRlbGF5TXMsCisgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBwYXRjaEhhbmRsZSAqLywgcmVxdWlyZXNNdXRlQ2hlY2spOwogICAgICAgICByZXR1cm4gbXV0ZVdhaXRNczsKICAgICB9Ci0gICAgLy8gbm8gbmVlZCB0byBwcm9jZWVkIGlmIG5ldyBkZXZpY2UgaXMgbm90IEFVRElPX0RFVklDRV9OT05FIGFuZCBub3Qgc3VwcG9ydGVkIGJ5IGN1cnJlbnQKLSAgICAvLyBvdXRwdXQgcHJvZmlsZQotICAgIGlmICgoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSAmJgotICAgICAgICAgICAgKChkZXZpY2UgJiBvdXRwdXREZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkpID09IEFVRElPX0RFVklDRV9OT05FKSkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9CiAKICAgICAvLyBmaWx0ZXIgZGV2aWNlcyBhY2NvcmRpbmcgdG8gb3V0cHV0IHNlbGVjdGVkCi0gICAgZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdCkoZGV2aWNlICYgb3V0cHV0RGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpKTsKKyAgICBEZXZpY2VWZWN0b3IgZmlsdGVyZWREZXZpY2VzID0gb3V0cHV0RGVzYy0+ZmlsdGVyU3VwcG9ydGVkRGV2aWNlcyhkZXZpY2VzKTsKKyAgICBEZXZpY2VWZWN0b3IgcHJldkRldmljZXMgPSBvdXRwdXREZXNjLT5kZXZpY2VzKCk7CiAKLSAgICBhdWRpb19kZXZpY2VzX3QgcHJldkRldmljZSA9IG91dHB1dERlc2MtPm1EZXZpY2U7CisgICAgLy8gbm8gbmVlZCB0byBwcm9jZWVkIGlmIG5ldyBkZXZpY2UgaXMgbm90IEFVRElPX0RFVklDRV9OT05FIGFuZCBub3Qgc3VwcG9ydGVkIGJ5IGN1cnJlbnQKKyAgICAvLyBvdXRwdXQgcHJvZmlsZSBvciBpZiBuZXcgZGV2aWNlIGlzIG5vdCBzdXBwb3J0ZWQgQU5EIHByZXZpb3VzIGRldmljZShzKSBpcyhhcmUpIHN0aWxsCisgICAgLy8gYXZhaWxhYmxlIChvdGhlcndpc2UgcmVzZXQgZGV2aWNlIG11c3QgYmUgZG9uZSBvbiB0aGUgb3V0cHV0KQorICAgIGlmICghZGV2aWNlcy5pc0VtcHR5KCkgJiYgZmlsdGVyZWREZXZpY2VzLmlzRW1wdHkoKSAmJgorICAgICAgICAgICAgIW1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmZpbHRlcihwcmV2RGV2aWNlcykuZW1wdHkoKSkgeworICAgICAgICBBTE9HVigiJXM6IHVuc3VwcG9ydGVkIGRldmljZSAlcyBmb3Igb3V0cHV0IiwgX19mdW5jX18sIGRldmljZXMudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQogCi0gICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIHByZXZEZXZpY2UgMHglMDR4IiwgcHJldkRldmljZSk7CisgICAgQUxPR1YoInNldE91dHB1dERldmljZXMoKSBwcmV2RGV2aWNlICVzIiwgcHJldkRldmljZXMudG9TdHJpbmcoKS5jX3N0cigpKTsKIAotICAgIGlmIChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgb3V0cHV0RGVzYy0+bURldmljZSA9IGRldmljZTsKKyAgICBpZiAoIWZpbHRlcmVkRGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgb3V0cHV0RGVzYy0+c2V0RGV2aWNlcyhmaWx0ZXJlZERldmljZXMpOwogICAgIH0KIAogICAgIC8vIGlmIHRoZSBvdXRwdXRzIGFyZSBub3QgbWF0ZXJpYWxseSBhY3RpdmUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gbXV0ZS4KICAgICBpZiAocmVxdWlyZXNNdXRlQ2hlY2spIHsKLSAgICAgICAgbXV0ZVdhaXRNcyA9IGNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMob3V0cHV0RGVzYywgcHJldkRldmljZSwgZGVsYXlNcyk7CisgICAgICAgIG11dGVXYWl0TXMgPSBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKG91dHB1dERlc2MsIHByZXZEZXZpY2VzLCBkZWxheU1zKTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVigiJXM6IHN1cHByZXNzaW5nIGNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMiLCBfX2Z1bmNfXyk7CiAgICAgICAgIG11dGVXYWl0TXMgPSAwOwpAQCAtNTI0MCw4OSArNTUxMywzMiBAQAogICAgIC8vICAgICAgT1IgdGhlIHJlcXVlc3RlZCBkZXZpY2UgaXMgdGhlIHNhbWUgYXMgY3VycmVudCBkZXZpY2UKICAgICAvLyAgQU5EIGZvcmNlIGlzIG5vdCBzcGVjaWZpZWQKICAgICAvLyAgQU5EIHRoZSBvdXRwdXQgaXMgY29ubmVjdGVkIGJ5IGEgdmFsaWQgYXVkaW8gcGF0Y2guCi0gICAgLy8gRG9pbmcgdGhpcyBjaGVjayBoZXJlIGFsbG93cyB0aGUgY2FsbGVyIHRvIGNhbGwgc2V0T3V0cHV0RGV2aWNlKCkgd2l0aG91dCBjb25kaXRpb25zCi0gICAgaWYgKChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUgfHwgZGV2aWNlID09IHByZXZEZXZpY2UpICYmCi0gICAgICAgICFmb3JjZSAmJgotICAgICAgICBvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpICE9IDApIHsKLSAgICAgICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIHNldHRpbmcgc2FtZSBkZXZpY2UgMHglMDR4IG9yIG51bGwgZGV2aWNlIiwgZGV2aWNlKTsKKyAgICAvLyBEb2luZyB0aGlzIGNoZWNrIGhlcmUgYWxsb3dzIHRoZSBjYWxsZXIgdG8gY2FsbCBzZXRPdXRwdXREZXZpY2VzKCkgd2l0aG91dCBjb25kaXRpb25zCisgICAgaWYgKChmaWx0ZXJlZERldmljZXMuaXNFbXB0eSgpIHx8IGZpbHRlcmVkRGV2aWNlcyA9PSBwcmV2RGV2aWNlcykgJiYKKyAgICAgICAgICAgICFmb3JjZSAmJiBvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpICE9IDApIHsKKyAgICAgICAgQUxPR1YoIiVzIHNldHRpbmcgc2FtZSBkZXZpY2UgJXMgb3IgbnVsbCBkZXZpY2UsIGZvcmNlPSVkLCBwYXRjaCBoYW5kbGU9JWQiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgZmlsdGVyZWREZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSwgZm9yY2UsIG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOwogICAgICAgICByZXR1cm4gbXV0ZVdhaXRNczsKICAgICB9CiAKLSAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgY2hhbmdpbmcgZGV2aWNlIik7CisgICAgQUxPR1YoIiVzIGNoYW5naW5nIGRldmljZSB0byAlcyIsIF9fZnVuY19fLCBmaWx0ZXJlZERldmljZXMudG9TdHJpbmcoKS5jX3N0cigpKTsKIAogICAgIC8vIGRvIHRoZSByb3V0aW5nCi0gICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgIGlmIChmaWx0ZXJlZERldmljZXMuaXNFbXB0eSgpKSB7CiAgICAgICAgIHJlc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIGRlbGF5TXMsIE5VTEwpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0OwotICAgICAgICBpZiAoKGFkZHJlc3MgPT0gTlVMTCkgfHwgKHN0cmxlbihhZGRyZXNzKSA9PSAwKSkgewotICAgICAgICAgICAgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGV2aWNlTGlzdCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZUFkZHIoZGV2aWNlLCBTdHJpbmc4KGFkZHJlc3MpKTsKKyAgICAgICAgUGF0Y2hCdWlsZGVyIHBhdGNoQnVpbGRlcjsKKyAgICAgICAgcGF0Y2hCdWlsZGVyLmFkZFNvdXJjZShvdXRwdXREZXNjKTsKKyAgICAgICAgQUxPR19BU1NFUlQoZmlsdGVyZWREZXZpY2VzLnNpemUoKSA8PSBBVURJT19QQVRDSF9QT1JUU19NQVgsICJUb28gbWFueSBzaW5rIHBvcnRzIik7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmZmlsdGVyZWREZXZpY2UgOiBmaWx0ZXJlZERldmljZXMpIHsKKyAgICAgICAgICAgIHBhdGNoQnVpbGRlci5hZGRTaW5rKGZpbHRlcmVkRGV2aWNlKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmICghZGV2aWNlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKLSAgICAgICAgICAgIG91dHB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zb3VyY2VzWzBdKTsKLSAgICAgICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKLSAgICAgICAgICAgIHBhdGNoLm51bV9zaW5rcyA9IDA7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRldmljZUxpc3Quc2l6ZSgpICYmIGkgPCBBVURJT19QQVRDSF9QT1JUU19NQVg7IGkrKykgewotICAgICAgICAgICAgICAgIGRldmljZUxpc3QuaXRlbUF0KGkpLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc2lua3NbaV0pOwotICAgICAgICAgICAgICAgIHBhdGNoLm51bV9zaW5rcysrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3NpemVfdCBpbmRleDsKLSAgICAgICAgICAgIGlmIChwYXRjaEhhbmRsZSAmJiAqcGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqcGF0Y2hIYW5kbGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPCBBdWRpb1BhdGNoPiBwYXRjaERlc2M7Ci0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBhZlBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgICAgICAgICAgYWZQYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZQYXRjaEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zKTsKLSAgICAgICAgICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBjcmVhdGVBdWRpb1BhdGNoIHJldHVybmVkICVkIHBhdGNoSGFuZGxlICVkIgotICAgICAgICAgICAgICAgICAgICAibnVtX3NvdXJjZXMgJWQgbnVtX3NpbmtzICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYWZQYXRjaEhhbmRsZSwgcGF0Y2gubnVtX3NvdXJjZXMsIHBhdGNoLm51bV9zaW5rcyk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBuZXcgQXVkaW9QYXRjaCgmcGF0Y2gsIG1VaWRDYWNoZWQpOwotICAgICAgICAgICAgICAgICAgICBhZGRBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSwgcGF0Y2hEZXNjKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaCA9IHBhdGNoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgICAgICBpZiAocGF0Y2hIYW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgKnBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5zZXRQYXRjaEhhbmRsZShwYXRjaERlc2MtPm1IYW5kbGUpOwotICAgICAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIGluZm9ybSBhbGwgaW5wdXQgYXMgd2VsbAotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiAgaW5wdXREZXNjcmlwdG9yID0gbUlucHV0cy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgaWYgKCFpc192aXJ0dWFsX2lucHV0X2RldmljZShpbnB1dERlc2NyaXB0b3ItPm1EZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgaW5wdXRDbWQgPSBBdWRpb1BhcmFtZXRlcigpOwotICAgICAgICAgICAgICAgIEFMT0dWKCIlczogaW5mb3JtIGlucHV0ICVkIG9mIGRldmljZTolZCIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgICAgICAgIGlucHV0RGVzY3JpcHRvci0+bUlvSGFuZGxlLCBkZXZpY2UpOwotICAgICAgICAgICAgICAgIGlucHV0Q21kLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSxkZXZpY2UpOwotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKGlucHV0RGVzY3JpcHRvci0+bUlvSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Q21kLnRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgaW5zdGFsbFBhdGNoKF9fZnVuY19fLCBwYXRjaEhhbmRsZSwgb3V0cHV0RGVzYy5nZXQoKSwgcGF0Y2hCdWlsZGVyLnBhdGNoKCksIGRlbGF5TXMpOwogICAgIH0KIAogICAgIC8vIHVwZGF0ZSBzdHJlYW0gdm9sdW1lcyBhY2NvcmRpbmcgdG8gbmV3IGRldmljZQotICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhvdXRwdXREZXNjLCBkZXZpY2UsIGRlbGF5TXMpOworICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhvdXRwdXREZXNjLCBmaWx0ZXJlZERldmljZXMudHlwZXMoKSwgZGVsYXlNcyk7CiAKICAgICByZXR1cm4gbXV0ZVdhaXRNczsKIH0KQEAgLTUzNTEsNjMgKzU1NjcsMzAgQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRJbnB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlKQogewogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogCiAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVGb3IoaW5wdXQpOwotICAgIGlmICgoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSAmJiAoKGRldmljZSAhPSBpbnB1dERlc2MtPm1EZXZpY2UpIHx8IGZvcmNlKSkgewotICAgICAgICBpbnB1dERlc2MtPm1EZXZpY2UgPSBkZXZpY2U7CisgICAgaWYgKChkZXZpY2UgIT0gbnVsbHB0cikgJiYgKChkZXZpY2UgIT0gaW5wdXREZXNjLT5nZXREZXZpY2UoKSkgfHwgZm9yY2UpKSB7CisgICAgICAgIGlucHV0RGVzYy0+c2V0RGV2aWNlKGRldmljZSk7CiAKLSAgICAgICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOwotICAgICAgICBpZiAoIWRldmljZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2g7Ci0gICAgICAgICAgICBpbnB1dERlc2MtPnRvQXVkaW9Qb3J0Q29uZmlnKCZwYXRjaC5zaW5rc1swXSk7CisgICAgICAgIGlmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmNvbnRhaW5zKGRldmljZSkpIHsKKyAgICAgICAgICAgIFBhdGNoQnVpbGRlciBwYXRjaEJ1aWxkZXI7CisgICAgICAgICAgICBwYXRjaEJ1aWxkZXIuYWRkU2luayhpbnB1dERlc2MsCiAgICAgICAgICAgICAvLyBBVURJT19TT1VSQ0VfSE9UV09SRCBpcyBmb3IgaW50ZXJuYWwgdXNlIG9ubHk6CiAgICAgICAgICAgICAvLyBoYW5kbGVkIGFzIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiBieSB0aGUgYXVkaW8gSEFMCi0gICAgICAgICAgICBpZiAocGF0Y2guc2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCAmJgotICAgICAgICAgICAgICAgICAgICAhaW5wdXREZXNjLT5pc1NvdW5kVHJpZ2dlcigpKSB7Ci0gICAgICAgICAgICAgICAgcGF0Y2guc2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7CisgICAgICAgICAgICAgICAgICAgIFtpbnB1dERlc2NdKGNvbnN0IFBhdGNoQnVpbGRlcjo6bWl4X3VzZWNhc2VfdCYgdXNlY2FzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXV0byByZXN1bHQgPSB1c2VjYXNlOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQgJiYgIWlucHV0RGVzYy0+aXNTb3VuZFRyaWdnZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5zb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OyB9KS4KICAgICAgICAgICAgIC8vb25seSBvbmUgaW5wdXQgZGV2aWNlIGZvciBub3cKLSAgICAgICAgICAgIGRldmljZUxpc3QuaXRlbUF0KDApLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1swXSk7Ci0gICAgICAgICAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7Ci0gICAgICAgICAgICBzc2l6ZV90IGluZGV4OwotICAgICAgICAgICAgaWYgKHBhdGNoSGFuZGxlICYmICpwYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpwYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KGlucHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDwgQXVkaW9QYXRjaD4gcGF0Y2hEZXNjOwotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIGFmUGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWZQYXRjaEhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotICAgICAgICAgICAgQUxPR1YoInNldElucHV0RGV2aWNlKCkgY3JlYXRlQXVkaW9QYXRjaCByZXR1cm5lZCAlZCBwYXRjaEhhbmRsZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYWZQYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBuZXcgQXVkaW9QYXRjaCgmcGF0Y2gsIG1VaWRDYWNoZWQpOwotICAgICAgICAgICAgICAgICAgICBhZGRBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSwgcGF0Y2hEZXNjKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaCA9IHBhdGNoOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgICAgICBpZiAocGF0Y2hIYW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgKnBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tSGFuZGxlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnB1dERlc2MtPnNldFBhdGNoSGFuZGxlKHBhdGNoRGVzYy0+bUhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhZGRTb3VyY2UoZGV2aWNlKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGluc3RhbGxQYXRjaChfX2Z1bmNfXywgcGF0Y2hIYW5kbGUsIGlucHV0RGVzYy5nZXQoKSwgcGF0Y2hCdWlsZGVyLnBhdGNoKCksIDApOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CkBAIC01NDM2LDggKzU2MTksNyBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXNwPElPUHJvZmlsZT4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRJbnB1dFByb2ZpbGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKK3NwPElPUHJvZmlsZT4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRJbnB1dFByb2ZpbGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QmIHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QmIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QmIGNoYW5uZWxNYXNrLApAQCAtNTQ1Nyw3ICs1NjM5LDcgQEAKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwcm9maWxlIDogaHdNb2R1bGUtPmdldElucHV0UHJvZmlsZXMoKSkgewogICAgICAgICAgICAgLy8gcHJvZmlsZS0+bG9nKCk7CiAgICAgICAgICAgICAvL3VwZGF0ZWRGb3JtYXQgPSBmb3JtYXQ7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZpY2UsIGFkZHJlc3MsIHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgIGlmIChwcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKERldmljZVZlY3RvcihkZXZpY2UpLCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxpbmdSYXRlICAvKnVwZGF0ZWRTYW1wbGluZ1JhdGUqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb3JtYXQsICAgICAgIC8qdXBkYXRlZEZvcm1hdCovCkBAIC01NDY4LDcgKzU2NTAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKmV4YWN0TWF0Y2hSZXF1aXJlZEZvcklucHV0RmxhZ3MqLykpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gcHJvZmlsZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmaXJzdEluZXhhY3QgPT0gbnVsbHB0ciAmJiBwcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldmljZSwgYWRkcmVzcywKKyAgICAgICAgICAgIGlmIChmaXJzdEluZXhhY3QgPT0gbnVsbHB0ciAmJiBwcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKERldmljZVZlY3RvcihkZXZpY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVwZGF0ZWRTYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCkBAIC01NDkyLDgzICs1Njc0LDYwIEBACiAgICAgcmV0dXJuIE5VTEw7CiB9CiAKLQotYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gKnBvbGljeU1peCkKLXsKLSAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxhYmxlRGV2aWNlVHlwZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKLSAgICBhdWRpb19kZXZpY2VzX3Qgc2VsZWN0ZWREZXZpY2VGcm9tTWl4ID0KLSAgICAgICAgICAgbVBvbGljeU1peGVzLmdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGlucHV0U291cmNlLCBhdmFpbGFibGVEZXZpY2VUeXBlcywgcG9saWN5TWl4KTsKLQotICAgIGlmIChzZWxlY3RlZERldmljZUZyb21NaXggIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgcmV0dXJuIHNlbGVjdGVkRGV2aWNlRnJvbU1peDsKLSAgICB9Ci0gICAgcmV0dXJuIGdldERldmljZUZvcklucHV0U291cmNlKGlucHV0U291cmNlKTsKLX0KLQotYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UpCi17Ci0gICAgLy8gUm91dGluZwotICAgIC8vIFNjYW4gdGhlIHdob2xlIFJvdXRlTWFwIHRvIHNlZSBpZiB3ZSBoYXZlIGFuIGV4cGxpY2l0IHJvdXRlOgotICAgIC8vIGlmIHRoZSBpbnB1dCBzb3VyY2UgaW4gdGhlIFJvdXRlTWFwIGlzIHRoZSBzYW1lIGFzIHRoZSBhcmd1bWVudCBhYm92ZSwKLSAgICAvLyBhbmQgYWN0aXZpdHkgY291bnQgaXMgbm9uLXplcm8gYW5kIHRoZSBkZXZpY2UgaW4gdGhlIHJvdXRlIGRlc2NyaXB0b3IgaXMgYXZhaWxhYmxlCi0gICAgLy8gdGhlbiBzZWxlY3QgdGhpcyBkZXZpY2UuCi0gICAgZm9yIChzaXplX3Qgcm91dGVJbmRleCA9IDA7IHJvdXRlSW5kZXggPCBtSW5wdXRSb3V0ZXMuc2l6ZSgpOyByb3V0ZUluZGV4KyspIHsKLSAgICAgICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBtSW5wdXRSb3V0ZXMudmFsdWVBdChyb3V0ZUluZGV4KTsKLSAgICAgICAgIGlmICgoaW5wdXRTb3VyY2UgPT0gcm91dGUtPm1Tb3VyY2UpICYmIHJvdXRlLT5pc0FjdGl2ZU9yQ2hhbmdlZCgpICYmCi0gICAgICAgICAgICAgICAgIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmluZGV4T2Yocm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yKSA+PSAwKSkgewotICAgICAgICAgICAgIHJldHVybiByb3V0ZS0+bURldmljZURlc2NyaXB0b3ItPnR5cGUoKTsKLSAgICAgICAgIH0KLSAgICAgfQotCi0gICAgIHJldHVybiBtRW5naW5lLT5nZXREZXZpY2VGb3JJbnB1dFNvdXJjZShpbnB1dFNvdXJjZSk7Ci19Ci0KLWZsb2F0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y29tcHV0ZVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKK2Zsb2F0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y29tcHV0ZVZvbHVtZShJVm9sdW1lQ3VydmVzICZjdXJ2ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKIHsKLSAgICBmbG9hdCB2b2x1bWVEQiA9IG1Wb2x1bWVDdXJ2ZXMtPnZvbEluZGV4VG9EYihzdHJlYW0sIFZvbHVtZTo6Z2V0RGV2aWNlQ2F0ZWdvcnkoZGV2aWNlKSwgaW5kZXgpOworICAgIGZsb2F0IHZvbHVtZURiID0gY3VydmVzLnZvbEluZGV4VG9EYihWb2x1bWU6OmdldERldmljZUNhdGVnb3J5KGRldmljZSksIGluZGV4KTsKIAogICAgIC8vIGhhbmRsZSB0aGUgY2FzZSBvZiBhY2Nlc3NpYmlsaXR5IGFjdGl2ZSB3aGlsZSBhIHJpbmd0b25lIGlzIHBsYXlpbmc6IGlmIHRoZSByaW5ndG9uZSBpcyBtdWNoCiAgICAgLy8gbG91ZGVyIHRoYW4gdGhlIGFjY2Vzc2liaWxpdHkgcHJvbXB0LCB0aGUgcHJvbXB0IGNhbm5vdCBiZSBoZWFyZCwgdGh1cyBtYXNraW5nIHRoZSB0b3VjaAogICAgIC8vIGV4cGxvcmF0aW9uIG9mIHRoZSBkaWFsZXIgVUkuIEluIHRoaXMgc2l0dWF0aW9uLCBicmluZyB0aGUgYWNjZXNzaWJpbGl0eSB2b2x1bWUgY2xvc2VyIHRvCiAgICAgLy8gdGhlIHJpbmd0b25lIHZvbHVtZQotICAgIGlmICgoc3RyZWFtID09IEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZKQotICAgICAgICAgICAgJiYgKEFVRElPX01PREVfUklOR1RPTkUgPT0gbUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpKQotICAgICAgICAgICAgJiYgaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX1JJTkcsIDApKSB7Ci0gICAgICAgIGNvbnN0IGZsb2F0IHJpbmdWb2x1bWVEQiA9IGNvbXB1dGVWb2x1bWUoQVVESU9fU1RSRUFNX1JJTkcsIGluZGV4LCBkZXZpY2UpOwotICAgICAgICByZXR1cm4gcmluZ1ZvbHVtZURCIC0gNCA+IHZvbHVtZURCID8gcmluZ1ZvbHVtZURCIC0gNCA6IHZvbHVtZURCOworICAgIGNvbnN0IGF1dG8gY2FsbFZvbHVtZVNyYyA9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKTsKKyAgICBjb25zdCBhdXRvIHJpbmdWb2x1bWVTcmMgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fUklORyk7CisgICAgY29uc3QgYXV0byBtdXNpY1ZvbHVtZVNyYyA9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9NVVNJQyk7CisgICAgY29uc3QgYXV0byBhbGFybVZvbHVtZVNyYyA9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9BTEFSTSk7CisKKyAgICBpZiAodm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZKQorICAgICAgICAgICAgJiYgKEFVRElPX01PREVfUklOR1RPTkUgPT0gbUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpKSAmJgorICAgICAgICAgICAgbU91dHB1dHMuaXNBY3RpdmUocmluZ1ZvbHVtZVNyYywgMCkpIHsKKyAgICAgICAgYXV0byAmcmluZ0N1cnZlcyA9IGdldFZvbHVtZUN1cnZlcyhBVURJT19TVFJFQU1fUklORyk7CisgICAgICAgIGNvbnN0IGZsb2F0IHJpbmdWb2x1bWVEYiA9IGNvbXB1dGVWb2x1bWUocmluZ0N1cnZlcywgcmluZ1ZvbHVtZVNyYywgaW5kZXgsIGRldmljZSk7CisgICAgICAgIHJldHVybiByaW5nVm9sdW1lRGIgLSA0ID4gdm9sdW1lRGIgPyByaW5nVm9sdW1lRGIgLSA0IDogdm9sdW1lRGI7CiAgICAgfQogCi0gICAgLy8gaW4tY2FsbDogYWx3YXlzIGNhcCBlYXJwaWVjZSB2b2x1bWUgYnkgdm9pY2Ugdm9sdW1lICsgc29tZSBsb3cgaGVhZHJvb20KLSAgICBpZiAoKHN0cmVhbSAhPSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0UpICYmCi0gICAgICAgICAgICAoaXNJbkNhbGwoKSB8fCBtT3V0cHV0cy5pc1N0cmVhbUFjdGl2ZUxvY2FsbHkoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpKSkgewotICAgICAgICBzd2l0Y2ggKHN0cmVhbSkgewotICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9TWVNURU06Ci0gICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX1JJTkc6Ci0gICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX01VU0lDOgotICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9BTEFSTToKLSAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOgotICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFOgotICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9EVE1GOgotICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZOiB7Ci0gICAgICAgICAgICBpbnQgdm9pY2VWb2x1bWVJbmRleCA9Ci0gICAgICAgICAgICAgICAgbVZvbHVtZUN1cnZlcy0+Z2V0Vm9sdW1lSW5kZXgoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsIEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0UpOwotICAgICAgICAgICAgY29uc3QgZmxvYXQgbWF4Vm9pY2VWb2xEYiA9Ci0gICAgICAgICAgICAgICAgY29tcHV0ZVZvbHVtZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgdm9pY2VWb2x1bWVJbmRleCwgQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRSkKKyAgICAvLyBpbi1jYWxsOiBhbHdheXMgY2FwIHZvbHVtZSBieSB2b2ljZSB2b2x1bWUgKyBzb21lIGxvdyBoZWFkcm9vbQorICAgIGlmICgodm9sdW1lU291cmNlICE9IGNhbGxWb2x1bWVTcmMgJiYgKGlzSW5DYWxsKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0cy5pc0FjdGl2ZUxvY2FsbHkoY2FsbFZvbHVtZVNyYykpKSAmJgorICAgICAgICAgICAgKHZvbHVtZVNvdXJjZSA9PSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fU1lTVEVNKSB8fAorICAgICAgICAgICAgIHZvbHVtZVNvdXJjZSA9PSByaW5nVm9sdW1lU3JjIHx8IHZvbHVtZVNvdXJjZSA9PSBtdXNpY1ZvbHVtZVNyYyB8fAorICAgICAgICAgICAgIHZvbHVtZVNvdXJjZSA9PSBhbGFybVZvbHVtZVNyYyB8fAorICAgICAgICAgICAgIHZvbHVtZVNvdXJjZSA9PSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OKSB8fAorICAgICAgICAgICAgIHZvbHVtZVNvdXJjZSA9PSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSkgfHwKKyAgICAgICAgICAgICB2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX0RUTUYpIHx8CisgICAgICAgICAgICAgdm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZKSkpIHsKKyAgICAgICAgYXV0byAmdm9pY2VDdXJ2ZXMgPSBnZXRWb2x1bWVDdXJ2ZXMoY2FsbFZvbHVtZVNyYyk7CisgICAgICAgIGludCB2b2ljZVZvbHVtZUluZGV4ID0gdm9pY2VDdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKTsKKyAgICAgICAgY29uc3QgZmxvYXQgbWF4Vm9pY2VWb2xEYiA9CisgICAgICAgICAgICAgICAgY29tcHV0ZVZvbHVtZSh2b2ljZUN1cnZlcywgY2FsbFZvbHVtZVNyYywgdm9pY2VWb2x1bWVJbmRleCwgZGV2aWNlKQogICAgICAgICAgICAgICAgICsgSU5fQ0FMTF9FQVJQSUVDRV9IRUFEUk9PTV9EQjsKLSAgICAgICAgICAgIGlmICh2b2x1bWVEQiA+IG1heFZvaWNlVm9sRGIpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiY29tcHV0ZVZvbHVtZSgpIHN0cmVhbSAlZCBhdCB2b2w9JWYgb3ZlcnJpZGVuIGJ5IHN0cmVhbSAlZCBhdCB2b2w9JWYiLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCB2b2x1bWVEQiwgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsIG1heFZvaWNlVm9sRGIpOwotICAgICAgICAgICAgICAgIHZvbHVtZURCID0gbWF4Vm9pY2VWb2xEYjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgLy8gRklYTUU6IFdvcmthcm91bmQgZm9yIGNhbGwgc2NyZWVuaW5nIGFwcGxpY2F0aW9ucyB1bnRpbCBhIHByb3BlciBhdWRpbyBtb2RlIGlzIGRlZmluZWQKKyAgICAgICAgLy8gdG8gc3VwcG9ydCB0aGlzIHNjZW5hcmlvIDogRXhlbXB0IHRoZSBSSU5HIHN0cmVhbSBmcm9tIHRoZSBhdWRpbyBjYXAgaWYgdGhlIGF1ZGlvIHdhcworICAgICAgICAvLyBwcm9ncmFtbWF0aWNhbGx5IG11dGVkLgorICAgICAgICAvLyBWT0lDRV9DQUxMIHN0cmVhbSBoYXMgbWluVm9sdW1lSW5kZXggPiAwIDogVXNlcnMgY2Fubm90IHNldCB0aGUgdm9sdW1lIG9mIHZvaWNlIGNhbGxzIHRvCisgICAgICAgIC8vIDAuIFdlIGRvbid0IHdhbnQgdG8gY2FwIHZvbHVtZSB3aGVuIHRoZSBzeXN0ZW0gaGFzIHByb2dyYW1tYXRpY2FsbHkgbXV0ZWQgdGhlIHZvaWNlIGNhbGwKKyAgICAgICAgLy8gc3RyZWFtLiBTZWUgc2V0Vm9sdW1lQ3VydmVJbmRleCgpIGZvciBtb3JlIGluZm9ybWF0aW9uLgorICAgICAgICBib29sIGV4ZW1wdEZyb21DYXBwaW5nID0gKHZvbHVtZVNvdXJjZSA9PSByaW5nVm9sdW1lU3JjKSAmJiAodm9pY2VWb2x1bWVJbmRleCA9PSAwKTsKKyAgICAgICAgQUxPR1ZfSUYoZXhlbXB0RnJvbUNhcHBpbmcsICIlcyB2b2x1bWUgc291cmNlICVkIGF0IHZvbD0lZiBub3QgY2FwcGVkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgIHZvbHVtZVNvdXJjZSwgdm9sdW1lRGIpOworICAgICAgICBpZiAoKHZvbHVtZURiID4gbWF4Vm9pY2VWb2xEYikgJiYgIWV4ZW1wdEZyb21DYXBwaW5nKSB7CisgICAgICAgICAgICBBTE9HVigiJXMgdm9sdW1lIHNvdXJjZSAlZCBhdCB2b2w9JWYgb3ZlcnJpZGVuIGJ5IHZvbHVtZSBncm91cCAlZCBhdCB2b2w9JWYiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgIHZvbHVtZVNvdXJjZSwgdm9sdW1lRGIsIGNhbGxWb2x1bWVTcmMsIG1heFZvaWNlVm9sRGIpOworICAgICAgICAgICAgdm9sdW1lRGIgPSBtYXhWb2ljZVZvbERiOwogICAgICAgICB9CiAgICAgfQotCiAgICAgLy8gaWYgYSBoZWFkc2V0IGlzIGNvbm5lY3RlZCwgYXBwbHkgdGhlIGZvbGxvd2luZyBydWxlcyB0byByaW5nIHRvbmVzIGFuZCBub3RpZmljYXRpb25zCiAgICAgLy8gdG8gYXZvaWQgc291bmQgbGV2ZWwgYnVyc3RzIGluIHVzZXIncyBlYXJzOgogICAgIC8vIC0gYWx3YXlzIGF0dGVudWF0ZSBub3RpZmljYXRpb25zIHZvbHVtZSBieSA2ZEIKQEAgLTU1NzYsMTEwICs1NzM1LDEzNyBAQAogICAgIC8vIHNwZWFrZXIgaXMgcGFydCBvZiB0aGUgc2VsZWN0IGRldmljZXMKICAgICAvLyAtIGlmIG11c2ljIGlzIHBsYXlpbmcsIGFsd2F5cyBsaW1pdCB0aGUgdm9sdW1lIHRvIGN1cnJlbnQgbXVzaWMgdm9sdW1lLAogICAgIC8vIHdpdGggYSBtaW5pbXVtIHRocmVzaG9sZCBhdCAtMzZkQiBzbyB0aGF0IG5vdGlmaWNhdGlvbiBpcyBhbHdheXMgcGVyY2VpdmVkLgotICAgIGNvbnN0IHJvdXRpbmdfc3RyYXRlZ3kgc3RyZWFtX3N0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koc3RyZWFtKTsKLSAgICBpZiAoKGRldmljZSAmIChBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQIHwKLSAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUyB8Ci0gICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQgfAotICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkUgfAotICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9VU0JfSEVBRFNFVCB8Ci0gICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEKSkgJiYKLSAgICAgICAgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKQotICAgICAgICAgICAgICAgIHx8IChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpCi0gICAgICAgICAgICAgICAgfHwgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fU1lTVEVNKQotICAgICAgICAgICAgICAgIHx8ICgoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpICYmCi0gICAgICAgICAgICAgICAgICAgIChtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpKSkgJiYKLSAgICAgICAgICAgIG1Wb2x1bWVDdXJ2ZXMtPmNhbkJlTXV0ZWQoc3RyZWFtKSkgeworICAgIGlmICgoZGV2aWNlICYgKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAgfCBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMgfAorICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVCB8IEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FIHwKKyAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1VTQl9IRUFEU0VUIHwgQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRCkpICYmCisgICAgICAgICAgICAoKHZvbHVtZVNvdXJjZSA9PSBhbGFybVZvbHVtZVNyYyB8fAorICAgICAgICAgICAgICB2b2x1bWVTb3VyY2UgPT0gcmluZ1ZvbHVtZVNyYykgfHwKKyAgICAgICAgICAgICAodm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04pKSB8fAorICAgICAgICAgICAgICh2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1NZU1RFTSkpIHx8CisgICAgICAgICAgICAgKCh2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUpKSAmJgorICAgICAgICAgICAgICAobUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09IEFVRElPX1BPTElDWV9GT1JDRV9OT05FKSkpICYmCisgICAgICAgICAgICBjdXJ2ZXMuY2FuQmVNdXRlZCgpKSB7CisKICAgICAgICAgLy8gd2hlbiB0aGUgcGhvbmUgaXMgcmluZ2luZyB3ZSBtdXN0IGNvbnNpZGVyIHRoYXQgbXVzaWMgY291bGQgaGF2ZSBiZWVuIHBhdXNlZCBqdXN0IGJlZm9yZQogICAgICAgICAvLyBieSB0aGUgbXVzaWMgYXBwbGljYXRpb24gYW5kIGJlaGF2ZSBhcyBpZiBtdXNpYyB3YXMgYWN0aXZlIGlmIHRoZSBsYXN0IG11c2ljIHRyYWNrIHdhcwogICAgICAgICAvLyBqdXN0IHN0b3BwZWQKICAgICAgICAgaWYgKGlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9NVVNJQywgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVkpIHx8CiAgICAgICAgICAgICAgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUpIHsKLSAgICAgICAgICAgIHZvbHVtZURCICs9IFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9GQUNUT1JfREI7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbXVzaWNEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgICAgIGZsb2F0IG11c2ljVm9sREIgPSBjb21wdXRlVm9sdW1lKEFVRElPX1NUUkVBTV9NVVNJQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4KEFVRElPX1NUUkVBTV9NVVNJQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c2ljRGV2aWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c2ljRGV2aWNlKTsKLSAgICAgICAgICAgIGZsb2F0IG1pblZvbERCID0gKG11c2ljVm9sREIgPiBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfTUlOX0RCKSA/Ci0gICAgICAgICAgICAgICAgICAgIG11c2ljVm9sREIgOiBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfTUlOX0RCOwotICAgICAgICAgICAgaWYgKHZvbHVtZURCID4gbWluVm9sREIpIHsKLSAgICAgICAgICAgICAgICB2b2x1bWVEQiA9IG1pblZvbERCOwotICAgICAgICAgICAgICAgIEFMT0dWKCJjb21wdXRlVm9sdW1lIGxpbWl0aW5nIHZvbHVtZSB0byAlZiBtdXNpY1ZvbCAlZiIsIG1pblZvbERCLCBtdXNpY1ZvbERCKTsKKyAgICAgICAgICAgIHZvbHVtZURiICs9IFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9GQUNUT1JfREI7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbXVzaWNEZXZpY2UgPQorICAgICAgICAgICAgICAgICAgICBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzX2luaXRpYWxpemVyKEFVRElPX1VTQUdFX01FRElBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgdHJ1ZSAvKmZyb21DYWNoZSovKS50eXBlcygpOworICAgICAgICAgICAgYXV0byAmbXVzaWNDdXJ2ZXMgPSBnZXRWb2x1bWVDdXJ2ZXMoQVVESU9fU1RSRUFNX01VU0lDKTsKKyAgICAgICAgICAgIGZsb2F0IG11c2ljVm9sRGIgPSBjb21wdXRlVm9sdW1lKG11c2ljQ3VydmVzLCBtdXNpY1ZvbHVtZVNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c2ljQ3VydmVzLmdldFZvbHVtZUluZGV4KG11c2ljRGV2aWNlKSwgbXVzaWNEZXZpY2UpOworICAgICAgICAgICAgZmxvYXQgbWluVm9sRGIgPSAobXVzaWNWb2xEYiA+IFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9NSU5fREIpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIG11c2ljVm9sRGIgOiBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfTUlOX0RCOworICAgICAgICAgICAgaWYgKHZvbHVtZURiID4gbWluVm9sRGIpIHsKKyAgICAgICAgICAgICAgICB2b2x1bWVEYiA9IG1pblZvbERiOworICAgICAgICAgICAgICAgIEFMT0dWKCJjb21wdXRlVm9sdW1lIGxpbWl0aW5nIHZvbHVtZSB0byAlZiBtdXNpY1ZvbCAlZiIsIG1pblZvbERiLCBtdXNpY1ZvbERiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChkZXZpY2UgJiAoQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCB8Ci0gICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTKSkgewogICAgICAgICAgICAgICAgIC8vIG9uIEEyRFAsIGFsc28gZW5zdXJlIG5vdGlmaWNhdGlvbiB2b2x1bWUgaXMgbm90IHRvbyBsb3cgY29tcGFyZWQgdG8gbWVkaWEgd2hlbgogICAgICAgICAgICAgICAgIC8vIGludGVuZGVkIHRvIGJlIHBsYXllZAotICAgICAgICAgICAgICAgIGlmICgodm9sdW1lREIgPiAtOTYuMGYpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAobXVzaWNWb2xEQiAtIFNPTklGSUNBVElPTl9BMkRQX01BWF9NRURJQV9ESUZGX0RCID4gdm9sdW1lREIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjb21wdXRlVm9sdW1lIGluY3JlYXNpbmcgdm9sdW1lIGZvciBzdHJlYW09JWQgZGV2aWNlPTB4JVggZnJvbSAlZiB0byAlZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lREIsIG11c2ljVm9sREIgLSBTT05JRklDQVRJT05fQTJEUF9NQVhfTUVESUFfRElGRl9EQik7Ci0gICAgICAgICAgICAgICAgICAgIHZvbHVtZURCID0gbXVzaWNWb2xEQiAtIFNPTklGSUNBVElPTl9BMkRQX01BWF9NRURJQV9ESUZGX0RCOworICAgICAgICAgICAgICAgIGlmICgodm9sdW1lRGIgPiAtOTYuMGYpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAobXVzaWNWb2xEYiAtIFNPTklGSUNBVElPTl9BMkRQX01BWF9NRURJQV9ESUZGX0RCID4gdm9sdW1lRGIpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBpbmNyZWFzaW5nIHZvbHVtZSBmb3Igdm9sdW1lIHNvdXJjZT0lZCBkZXZpY2U9MHglWCBmcm9tICVmIHRvICVmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHZvbHVtZVNvdXJjZSwgZGV2aWNlLCB2b2x1bWVEYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzaWNWb2xEYiAtIFNPTklGSUNBVElPTl9BMkRQX01BWF9NRURJQV9ESUZGX0RCKTsKKyAgICAgICAgICAgICAgICAgICAgdm9sdW1lRGIgPSBtdXNpY1ZvbERiIC0gU09OSUZJQ0FUSU9OX0EyRFBfTUFYX01FRElBX0RJRkZfREI7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKChWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShkZXZpY2UpICE9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikgfHwKLSAgICAgICAgICAgICAgICBzdHJlYW1fc3RyYXRlZ3kgIT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB7Ci0gICAgICAgICAgICB2b2x1bWVEQiArPSBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfRkFDVE9SX0RCOworICAgICAgICAgICAgICAgICAgICghKHZvbHVtZVNvdXJjZSA9PSBhbGFybVZvbHVtZVNyYyB8fCB2b2x1bWVTb3VyY2UgPT0gcmluZ1ZvbHVtZVNyYykpKSB7CisgICAgICAgICAgICB2b2x1bWVEYiArPSBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfRkFDVE9SX0RCOwogICAgICAgICB9CiAgICAgfQogCi0gICAgcmV0dXJuIHZvbHVtZURCOworICAgIHJldHVybiB2b2x1bWVEYjsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0FuZFNldFZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKQoraW50IEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVzY2FsZVZvbHVtZUluZGV4KGludCBzcmNJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVTb3VyY2UgZnJvbVZvbHVtZVNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVTb3VyY2UgdG9Wb2x1bWVTb3VyY2UpCiB7Ci0gICAgLy8gZG8gbm90IGNoYW5nZSBhY3R1YWwgc3RyZWFtIHZvbHVtZSBpZiB0aGUgc3RyZWFtIGlzIG11dGVkCi0gICAgaWYgKG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSAhPSAwKSB7Ci0gICAgICAgIEFMT0dWVigiY2hlY2tBbmRTZXRWb2x1bWUoKSBzdHJlYW0gJWQgbXV0ZWQgY291bnQgJWQiLAotICAgICAgICAgICAgICBzdHJlYW0sIG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSk7CisgICAgaWYgKGZyb21Wb2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UpIHsKKyAgICAgICAgcmV0dXJuIHNyY0luZGV4OworICAgIH0KKyAgICBhdXRvICZzcmNDdXJ2ZXMgPSBnZXRWb2x1bWVDdXJ2ZXMoZnJvbVZvbHVtZVNvdXJjZSk7CisgICAgYXV0byAmZHN0Q3VydmVzID0gZ2V0Vm9sdW1lQ3VydmVzKHRvVm9sdW1lU291cmNlKTsKKyAgICBmbG9hdCBtaW5TcmMgPSAoZmxvYXQpc3JjQ3VydmVzLmdldFZvbHVtZUluZGV4TWluKCk7CisgICAgZmxvYXQgbWF4U3JjID0gKGZsb2F0KXNyY0N1cnZlcy5nZXRWb2x1bWVJbmRleE1heCgpOworICAgIGZsb2F0IG1pbkRzdCA9IChmbG9hdClkc3RDdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXhNaW4oKTsKKyAgICBmbG9hdCBtYXhEc3QgPSAoZmxvYXQpZHN0Q3VydmVzLmdldFZvbHVtZUluZGV4TWF4KCk7CisKKyAgICAvLyBwcmVzZXJ2ZSBtdXRlIHJlcXVlc3Qgb3IgY29ycmVjdCByYW5nZQorICAgIGlmIChzcmNJbmRleCA8IG1pblNyYykgeworICAgICAgICBpZiAoc3JjSW5kZXggPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgc3JjSW5kZXggPSBtaW5TcmM7CisgICAgfSBlbHNlIGlmIChzcmNJbmRleCA+IG1heFNyYykgeworICAgICAgICBzcmNJbmRleCA9IG1heFNyYzsKKyAgICB9CisgICAgcmV0dXJuIChpbnQpKG1pbkRzdCArICgoc3JjSW5kZXggLSBtaW5TcmMpICogKG1heERzdCAtIG1pbkRzdCkpIC8gKG1heFNyYyAtIG1pblNyYykpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrQW5kU2V0Vm9sdW1lKElWb2x1bWVDdXJ2ZXMgJmN1cnZlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKK3sKKyAgICAvLyBkbyBub3QgY2hhbmdlIGFjdHVhbCBhdHRyaWJ1dGVzIHZvbHVtZSBpZiB0aGUgYXR0cmlidXRlcyBpcyBtdXRlZAorICAgIGlmIChvdXRwdXREZXNjLT5pc011dGVkKHZvbHVtZVNvdXJjZSkpIHsKKyAgICAgICAgQUxPR1ZWKCIlczogdm9sdW1lIHNvdXJjZSAlZCBtdXRlZCBjb3VudCAlZCBhY3RpdmU9JWQiLCBfX2Z1bmNfXywgdm9sdW1lU291cmNlLAorICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+Z2V0TXV0ZUNvdW50KHZvbHVtZVNvdXJjZSksIG91dHB1dERlc2MtPmlzQWN0aXZlKHZvbHVtZVNvdXJjZSkpOwogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQorICAgIFZvbHVtZVNvdXJjZSBjYWxsVm9sU3JjID0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpOworICAgIFZvbHVtZVNvdXJjZSBidFNjb1ZvbFNyYyA9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPKTsKKyAgICBib29sIGlzVm9pY2VWb2xTcmMgPSBjYWxsVm9sU3JjID09IHZvbHVtZVNvdXJjZTsKKyAgICBib29sIGlzQnRTY29Wb2xTcmMgPSBidFNjb1ZvbFNyYyA9PSB2b2x1bWVTb3VyY2U7CisKICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGZvcmNlVXNlRm9yQ29tbSA9CiAgICAgICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT04pOwogICAgIC8vIGRvIG5vdCBjaGFuZ2UgaW4gY2FsbCB2b2x1bWUgaWYgYmx1ZXRvb3RoIGlzIGNvbm5lY3RlZCBhbmQgdmljZSB2ZXJzYQotICAgIGlmICgoc3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMICYmIGZvcmNlVXNlRm9yQ29tbSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSB8fAotICAgICAgICAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPICYmIGZvcmNlVXNlRm9yQ29tbSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSkgewotICAgICAgICBBTE9HVigiY2hlY2tBbmRTZXRWb2x1bWUoKSBjYW5ub3Qgc2V0IHN0cmVhbSAlZCB2b2x1bWUgd2l0aCBmb3JjZSB1c2UgPSAlZCBmb3IgY29tbSIsCi0gICAgICAgICAgICAgc3RyZWFtLCBmb3JjZVVzZUZvckNvbW0pOworICAgIC8vIGlmIHNjbyBhbmQgY2FsbCBmb2xsb3cgc2FtZSBjdXJ2ZXMsIGJ5cGFzcyBmb3JjZVVzZUZvckNvbW0KKyAgICBpZiAoKGNhbGxWb2xTcmMgIT0gYnRTY29Wb2xTcmMpICYmCisgICAgICAgICAgICAoKGlzVm9pY2VWb2xTcmMgJiYgZm9yY2VVc2VGb3JDb21tID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pIHx8CisgICAgICAgICAgICAgKGlzQnRTY29Wb2xTcmMgJiYgZm9yY2VVc2VGb3JDb21tICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pKSkgeworICAgICAgICBBTE9HVigiJXMgY2Fubm90IHNldCB2b2x1bWUgZ3JvdXAgJWQgdm9sdW1lIHdpdGggZm9yY2UgdXNlID0gJWQgZm9yIGNvbW0iLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICB2b2x1bWVTb3VyY2UsIGZvcmNlVXNlRm9yQ29tbSk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0KICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgIGRldmljZSA9IG91dHB1dERlc2MtPmRldmljZSgpOworICAgICAgICBkZXZpY2UgPSBvdXRwdXREZXNjLT5kZXZpY2VzKCkudHlwZXMoKTsKICAgICB9CiAKLSAgICBmbG9hdCB2b2x1bWVEYiA9IGNvbXB1dGVWb2x1bWUoc3RyZWFtLCBpbmRleCwgZGV2aWNlKTsKKyAgICBmbG9hdCB2b2x1bWVEYiA9IGNvbXB1dGVWb2x1bWUoY3VydmVzLCB2b2x1bWVTb3VyY2UsIGluZGV4LCBkZXZpY2UpOwogICAgIGlmIChvdXRwdXREZXNjLT5pc0ZpeGVkVm9sdW1lKGRldmljZSkgfHwKICAgICAgICAgICAgIC8vIEZvcmNlIFZvSVAgdm9sdW1lIHRvIG1heCBmb3IgYmx1ZXRvb3RoIFNDTwotICAgICAgICAgICAgKChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwgfHwgc3RyZWFtID09IEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPKSAmJgotICAgICAgICAgICAgIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9TQ08pICE9IDApKSB7CisgICAgICAgICAgICAoKGlzVm9pY2VWb2xTcmMgfHwgaXNCdFNjb1ZvbFNyYykgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX1NDTykgIT0gMCkpIHsKICAgICAgICAgdm9sdW1lRGIgPSAwLjBmOwogICAgIH0KKyAgICBvdXRwdXREZXNjLT5zZXRWb2x1bWUodm9sdW1lRGIsIHZvbHVtZVNvdXJjZSwgY3VydmVzLmdldFN0cmVhbVR5cGVzKCksIGRldmljZSwgZGVsYXlNcywgZm9yY2UpOwogCi0gICAgb3V0cHV0RGVzYy0+c2V0Vm9sdW1lKHZvbHVtZURiLCBzdHJlYW0sIGRldmljZSwgZGVsYXlNcywgZm9yY2UpOwotCi0gICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCB8fAotICAgICAgICBzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08pIHsKKyAgICBpZiAoaXNWb2ljZVZvbFNyYyB8fCBpc0J0U2NvVm9sU3JjKSB7CiAgICAgICAgIGZsb2F0IHZvaWNlVm9sdW1lOwogICAgICAgICAvLyBGb3JjZSB2b2ljZSB2b2x1bWUgdG8gbWF4IGZvciBibHVldG9vdGggU0NPIGFzIHZvbHVtZSBpcyBtYW5hZ2VkIGJ5IHRoZSBoZWFkc2V0Ci0gICAgICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpIHsKLSAgICAgICAgICAgIHZvaWNlVm9sdW1lID0gKGZsb2F0KWluZGV4LyhmbG9hdCltVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleE1heChzdHJlYW0pOworICAgICAgICBpZiAoaXNWb2ljZVZvbFNyYykgeworICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAoZmxvYXQpaW5kZXgvKGZsb2F0KWN1cnZlcy5nZXRWb2x1bWVJbmRleE1heCgpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdm9pY2VWb2x1bWUgPSAxLjA7CiAgICAgICAgIH0KLQogICAgICAgICBpZiAodm9pY2VWb2x1bWUgIT0gbUxhc3RWb2ljZVZvbHVtZSkgewogICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFZvaWNlVm9sdW1lKHZvaWNlVm9sdW1lLCBkZWxheU1zKTsKICAgICAgICAgICAgIG1MYXN0Vm9pY2VWb2x1bWUgPSB2b2ljZVZvbHVtZTsKICAgICAgICAgfQogICAgIH0KLQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtNTY4OSw2MyArNTg3NSw2NCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKIHsKICAgICBBTE9HVlYoImFwcGx5U3RyZWFtVm9sdW1lcygpIGZvciBkZXZpY2UgJTA4eCIsIGRldmljZSk7Ci0KLSAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IHN0cmVhbSsrKSB7Ci0gICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUN1cnZlcy0+Z2V0Vm9sdW1lSW5kZXgoKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCBkZXZpY2UpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnZvbHVtZUdyb3VwIDogbUVuZ2luZS0+Z2V0Vm9sdW1lR3JvdXBzKCkpIHsKKyAgICAgICAgYXV0byAmY3VydmVzID0gZ2V0Vm9sdW1lQ3VydmVzKHRvVm9sdW1lU291cmNlKHZvbHVtZUdyb3VwKSk7CisgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKGN1cnZlcywgdG9Wb2x1bWVTb3VyY2Uodm9sdW1lR3JvdXApLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKSwgb3V0cHV0RGVzYywgZGV2aWNlLCBkZWxheU1zLCBmb3JjZSk7CiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0U3RyYXRlZ3lNdXRlKHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0U3RyYXRlZ3lNdXRlKHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgc3RkOjp2ZWN0b3I8Vm9sdW1lU291cmNlPiBzb3VyY2VzVG9NdXRlOworICAgIGZvciAoYXV0byBhdHRyaWJ1dGVzOiBtRW5naW5lLT5nZXRBbGxBdHRyaWJ1dGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHN0cmF0ZWd5KSkgeworICAgICAgICBBTE9HVlYoIiVzKCkgYXR0cmlidXRlcyAlcywgbXV0ZSAlZCwgb3V0cHV0IElEICVkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICB0b1N0cmluZyhhdHRyaWJ1dGVzKS5jX3N0cigpLCBvbiwgb3V0cHV0RGVzYy0+Z2V0SWQoKSk7CisgICAgICAgIFZvbHVtZVNvdXJjZSBzb3VyY2UgPSB0b1ZvbHVtZVNvdXJjZShhdHRyaWJ1dGVzKTsKKyAgICAgICAgaWYgKHN0ZDo6ZmluZChiZWdpbihzb3VyY2VzVG9NdXRlKSwgZW5kKHNvdXJjZXNUb011dGUpLCBzb3VyY2UpID09IGVuZChzb3VyY2VzVG9NdXRlKSkgeworICAgICAgICAgICAgc291cmNlc1RvTXV0ZS5wdXNoX2JhY2soc291cmNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGF1dG8gc291cmNlIDogc291cmNlc1RvTXV0ZSkgeworICAgICAgICBzZXRWb2x1bWVTb3VyY2VNdXRlKHNvdXJjZSwgb24sIG91dHB1dERlc2MsIGRlbGF5TXMsIGRldmljZSk7CisgICAgfQorCit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRWb2x1bWVTb3VyY2VNdXRlKFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKIHsKLSAgICBBTE9HVlYoInNldFN0cmF0ZWd5TXV0ZSgpIHN0cmF0ZWd5ICVkLCBtdXRlICVkLCBvdXRwdXQgSUQgJWQiLAotICAgICAgICAgICBzdHJhdGVneSwgb24sIG91dHB1dERlc2MtPmdldElkKCkpOwotICAgIGZvciAoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgc3RyZWFtKyspIHsKLSAgICAgICAgaWYgKGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSkgPT0gc3RyYXRlZ3kpIHsKLSAgICAgICAgICAgIHNldFN0cmVhbU11dGUoKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCBvbiwgb3V0cHV0RGVzYywgZGVsYXlNcywgZGV2aWNlKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFN0cmVhbU11dGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCi17CiAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICBkZXZpY2UgPSBvdXRwdXREZXNjLT5kZXZpY2UoKTsKKyAgICAgICAgZGV2aWNlID0gb3V0cHV0RGVzYy0+ZGV2aWNlcygpLnR5cGVzKCk7CiAgICAgfQotCi0gICAgQUxPR1ZWKCJzZXRTdHJlYW1NdXRlKCkgc3RyZWFtICVkLCBtdXRlICVkLCBtTXV0ZUNvdW50ICVkIGRldmljZSAlMDR4IiwKLSAgICAgICAgICBzdHJlYW0sIG9uLCBvdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0sIGRldmljZSk7Ci0KKyAgICBhdXRvICZjdXJ2ZXMgPSBnZXRWb2x1bWVDdXJ2ZXModm9sdW1lU291cmNlKTsKICAgICBpZiAob24pIHsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSA9PSAwKSB7Ci0gICAgICAgICAgICBpZiAobVZvbHVtZUN1cnZlcy0+Y2FuQmVNdXRlZChzdHJlYW0pICYmCi0gICAgICAgICAgICAgICAgICAgICgoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKSB8fAotICAgICAgICAgICAgICAgICAgICAgKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSkpKSB7Ci0gICAgICAgICAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoc3RyZWFtLCAwLCBvdXRwdXREZXNjLCBkZXZpY2UsIGRlbGF5TXMpOworICAgICAgICBpZiAoIW91dHB1dERlc2MtPmlzTXV0ZWQodm9sdW1lU291cmNlKSkgeworICAgICAgICAgICAgaWYgKGN1cnZlcy5jYW5CZU11dGVkKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKHZvbHVtZVNvdXJjZSAhPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgIChtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0KKyAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSkpKSB7CisgICAgICAgICAgICAgICAgY2hlY2tBbmRTZXRWb2x1bWUoY3VydmVzLCB2b2x1bWVTb3VyY2UsIDAsIG91dHB1dERlc2MsIGRldmljZSwgZGVsYXlNcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgLy8gaW5jcmVtZW50IG1NdXRlQ291bnQgYWZ0ZXIgY2FsbGluZyBjaGVja0FuZFNldFZvbHVtZSgpIHNvIHRoYXQgdm9sdW1lIGNoYW5nZSBpcyBub3QgaWdub3JlZAotICAgICAgICBvdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0rKzsKKyAgICAgICAgLy8gaW5jcmVtZW50IG1NdXRlQ291bnQgYWZ0ZXIgY2FsbGluZyBjaGVja0FuZFNldFZvbHVtZSgpIHNvIHRoYXQgdm9sdW1lIGNoYW5nZSBpcyBub3QKKyAgICAgICAgLy8gaWdub3JlZAorICAgICAgICBvdXRwdXREZXNjLT5pbmNNdXRlQ291bnQodm9sdW1lU291cmNlKTsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAob3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dID09IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJzZXRTdHJlYW1NdXRlKCkgdW5tdXRpbmcgbm9uIG11dGVkIHN0cmVhbSEiKTsKKyAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5pc011dGVkKHZvbHVtZVNvdXJjZSkpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcyB1bm11dGluZyBub24gbXV0ZWQgYXR0cmlidXRlcyEiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KLSAgICAgICAgaWYgKC0tb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dID09IDApIHsKLSAgICAgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4KHN0cmVhbSwgZGV2aWNlKSwKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmRlY011dGVDb3VudCh2b2x1bWVTb3VyY2UpID09IDApIHsKKyAgICAgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKGN1cnZlcywgdm9sdW1lU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VydmVzLmdldFZvbHVtZUluZGV4KGRldmljZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcyk7CkBAIC01NzUzLDEwNiArNTk0MCw5IEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdGFydGluZywgYm9vbCBzdGF0ZUNoYW5nZSkKLXsKLSAgICBpZighaGFzUHJpbWFyeU91dHB1dCgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBpZiB0aGUgc3RyZWFtIHBlcnRhaW5zIHRvIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBhbmQgd2UgYXJlIGluIGNhbGwgd2UgbXVzdAotICAgIC8vIG11dGUgdGhlIHN0cmVhbSBpZiBpdCBpcyBsb3cgdmlzaWJpbGl0eS4gSWYgaXQgaXMgaGlnaCB2aXNpYmlsaXR5LCB3ZSBtdXN0IHBsYXkgYSB0b25lCi0gICAgLy8gaW4gdGhlIGRldmljZSB1c2VkIGZvciBwaG9uZSBzdHJhdGVneSBhbmQgcGxheSB0aGUgdG9uZSBpZiB0aGUgc2VsZWN0ZWQgZGV2aWNlIGRvZXMgbm90Ci0gICAgLy8gaW50ZXJmZXJlIHdpdGggdGhlIGRldmljZSB1c2VkIGZvciBwaG9uZSBzdHJhdGVneQotICAgIC8vIGlmIHN0YXRlQ2hhbmdlIGlzIHRydWUsIHdlIGFyZSBjYWxsZWQgZnJvbSBzZXRQaG9uZVN0YXRlKCkgYW5kIHdlIG11c3QgbXV0ZSBvciB1bm11dGUgYXMKLSAgICAvLyBtYW55IHRpbWVzIGFzIHRoZXJlIGFyZSBhY3RpdmUgdHJhY2tzIG9uIHRoZSBvdXRwdXQKLSAgICBjb25zdCByb3V0aW5nX3N0cmF0ZWd5IHN0cmVhbV9zdHJhdGVneSA9IGdldFN0cmF0ZWd5KHN0cmVhbSk7Ci0gICAgaWYgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB8fAotICAgICAgICAgICAgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpKSkgewotICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1QcmltYXJ5T3V0cHV0OwotICAgICAgICBBTE9HVigiaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkgc3RyZWFtICVkIHN0YXJ0aW5nICVkIGRldmljZSAleCBzdGF0ZUNoYW5nZSAlZCIsCi0gICAgICAgICAgICAgICAgc3RyZWFtLCBzdGFydGluZywgb3V0cHV0RGVzYy0+bURldmljZSwgc3RhdGVDaGFuZ2UpOwotICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0pIHsKLSAgICAgICAgICAgIGludCBtdXRlQ291bnQgPSAxOwotICAgICAgICAgICAgaWYgKHN0YXRlQ2hhbmdlKSB7Ci0gICAgICAgICAgICAgICAgbXV0ZUNvdW50ID0gb3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYXVkaW9faXNfbG93X3Zpc2liaWxpdHkoc3RyZWFtKSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBsb3cgdmlzaWJpbGl0eSwgbXV0ZUNvdW50ICVkIiwgbXV0ZUNvdW50KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG11dGVDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldFN0cmVhbU11dGUoc3RyZWFtLCBzdGFydGluZywgbVByaW1hcnlPdXRwdXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpIGhpZ2ggdmlzaWJpbGl0eSIpOwotICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5kZXZpY2UoKSAmCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9QSE9ORSwgdHJ1ZSAvKmZyb21DYWNoZSovKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkgaGlnaCB2aXNpYmlsaXR5IG11dGVkLCBtdXRlQ291bnQgJWQiLCBtdXRlQ291bnQpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG11dGVDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZXRTdHJlYW1NdXRlKHN0cmVhbSwgc3RhcnRpbmcsIG1QcmltYXJ5T3V0cHV0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc3RhcnRpbmcpIHsKLSAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnN0YXJ0VG9uZShBVURJT19QT0xJQ1lfVE9ORV9JTl9DQUxMX05PVElGSUNBVElPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnN0b3BUb25lKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi1hdWRpb19zdHJlYW1fdHlwZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RyZWFtVHlwZWZyb21BdHRyaWJ1dGVzSW50KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cikKLXsKLSAgICAvLyBmbGFncyB0byBzdHJlYW0gdHlwZSBtYXBwaW5nCi0gICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgPT0gQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRTsKLSAgICB9Ci0gICAgaWYgKChhdHRyLT5mbGFncyAmIEFVRElPX0ZMQUdfU0NPKSA9PSBBVURJT19GTEFHX1NDTykgewotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ087Ci0gICAgfQotICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX0JFQUNPTikgPT0gQVVESU9fRkxBR19CRUFDT04pIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9UVFM7Ci0gICAgfQotCi0gICAgLy8gdXNhZ2UgdG8gc3RyZWFtIHR5cGUgbWFwcGluZwotICAgIHN3aXRjaCAoYXR0ci0+dXNhZ2UpIHsKLSAgICBjYXNlIEFVRElPX1VTQUdFX01FRElBOgotICAgIGNhc2UgQVVESU9fVVNBR0VfR0FNRToKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOVDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRToKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9NVVNJQzsKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWToKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZOwotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT046Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fU1lTVEVNOwotICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fRFRNRjsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfQUxBUk06Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQUxBUk07Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1JJTkc7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTjoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1Q6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVDoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT047Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX1VOS05PV046Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9NVVNJQzsKLSAgICB9Ci19Ci0KIGJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1ZhbGlkQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKnBhYSkKIHsKLSAgICAvLyBoYXMgZmxhZ3MgdGhhdCBtYXAgdG8gYSBzdHJhdGVneT8KKyAgICAvLyBoYXMgZmxhZ3MgdGhhdCBtYXAgdG8gYSBzdHJlYW0gdHlwZT8KICAgICBpZiAoKHBhYS0+ZmxhZ3MgJiAoQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEIHwgQVVESU9fRkxBR19TQ08gfCBBVURJT19GTEFHX0JFQUNPTikpICE9IDApIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQpAQCAtNTg4MywzNyArNTk3Myw2IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc1N0cmF0ZWd5QWN0aXZlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LCB1aW50MzJfdCBpblBhc3RNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSkgY29uc3QKLXsKLSAgICBpZiAoKHN5c1RpbWUgPT0gMCkgJiYgKGluUGFzdE1zICE9IDApKSB7Ci0gICAgICAgIHN5c1RpbWUgPSBzeXN0ZW1UaW1lKCk7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IGkrKykgewotICAgICAgICBpZiAoKChnZXRTdHJhdGVneSgoYXVkaW9fc3RyZWFtX3R5cGVfdClpKSA9PSBzdHJhdGVneSkgfHwKLSAgICAgICAgICAgICAgICAoTlVNX1NUUkFURUdJRVMgPT0gc3RyYXRlZ3kpKSAmJgotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKChhdWRpb19zdHJlYW1fdHlwZV90KWksIGluUGFzdE1zLCBzeXNUaW1lKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTdHJhdGVneUFjdGl2ZU9uU2FtZU1vZHVsZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwgdWludDMyX3QgaW5QYXN0TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHN5c1RpbWUpIGNvbnN0Ci17Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChvdXRwdXREZXNjLT5zaGFyZXNId01vZHVsZVdpdGgoZGVzYykKLSAgICAgICAgICAgICYmIGlzU3RyYXRlZ3lBY3RpdmUoZGVzYywgc3RyYXRlZ3ksIGluUGFzdE1zLCBzeXNUaW1lKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCiBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKQogewogICAgIHJldHVybiBtRW5naW5lLT5nZXRGb3JjZVVzZSh1c2FnZSk7CkBAIC01OTMyLDEwICs1OTkxLDEwIEBACiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xlYW5VcEZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2aWNlRGVzYykKIHsKICAgICBmb3IgKHNzaXplX3QgaSA9IChzc2l6ZV90KW1BdWRpb1NvdXJjZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pICB7Ci0gICAgICAgIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gc291cmNlRGVzYyA9IG1BdWRpb1NvdXJjZXMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKHNvdXJjZURlc2MtPm1EZXZpY2UtPmVxdWFscyhkZXZpY2VEZXNjKSkgewotICAgICAgICAgICAgQUxPR1YoIiVzIHJlbGVhc2luZyBhdWRpbyBzb3VyY2UgJWQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZURlc2MtPmdldEhhbmRsZSgpKTsKLSAgICAgICAgICAgIHN0b3BBdWRpb1NvdXJjZShzb3VyY2VEZXNjLT5nZXRIYW5kbGUoKSk7CisgICAgICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IHNvdXJjZURlc2MgPSBtQXVkaW9Tb3VyY2VzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChzb3VyY2VEZXNjLT5zcmNEZXZpY2UoKS0+ZXF1YWxzKGRldmljZURlc2MpKSB7CisgICAgICAgICAgICBBTE9HVigiJXMgcmVsZWFzaW5nIGF1ZGlvIHNvdXJjZSAlZCIsIF9fRlVOQ1RJT05fXywgc291cmNlRGVzYy0+cG9ydElkKCkpOworICAgICAgICAgICAgc3RvcEF1ZGlvU291cmNlKHNvdXJjZURlc2MtPnBvcnRJZCgpKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtNTk2MSwxMjggKzYwMjAsNjcgQEAKICAgICAgICAgICAgIHJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSwgcGF0Y2hEZXNjLT5tVWlkKTsKICAgICAgICAgfQogICAgIH0KKworICAgIG1JbnB1dHMuY2xlYXJTZXNzaW9uUm91dGVzRm9yRGV2aWNlKGRldmljZURlc2MpOworCisgICAgbUh3TW9kdWxlcy5jbGVhblVwRm9yRGV2aWNlKGRldmljZURlc2MpOwogfQogCi0vLyBNb2RpZnkgdGhlIGxpc3Qgb2Ygc3Vycm91bmQgc291bmQgZm9ybWF0cyBzdXBwb3J0ZWQuCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZmlsdGVyU3Vycm91bmRGb3JtYXRzKEZvcm1hdFZlY3RvciAqZm9ybWF0c1B0cikgewotICAgIEZvcm1hdFZlY3RvciAmZm9ybWF0cyA9ICpmb3JtYXRzUHRyOwotICAgIC8vIFRPRE8gU2V0IHRoaXMgYmFzZWQgb24gQ29uZmlnIHByb3BlcnRpZXMuCi0gICAgY29uc3QgYm9vbCBhbHdheXNGb3JjZUFDMyA9IHRydWU7Cit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6bW9kaWZ5U3Vycm91bmRGb3JtYXRzKAorICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2RGVzYywgRm9ybWF0VmVjdG9yICpmb3JtYXRzUHRyKSB7CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PGF1ZGlvX2Zvcm1hdF90PiBlbmZvcmNlZFN1cnJvdW5kKAorICAgICAgICAgICAgZGV2RGVzYy0+ZW5jb2RlZEZvcm1hdHMoKS5iZWdpbigpLCBkZXZEZXNjLT5lbmNvZGVkRm9ybWF0cygpLmVuZCgpKTsKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IGFsbFN1cnJvdW5kOyAgLy8gQSBmbGF0IHNldCBvZiBhbGwga25vd24gc3Vycm91bmQgZm9ybWF0cworICAgIGZvciAoY29uc3QgYXV0byYgcGFpciA6IG1Db25maWcuZ2V0U3Vycm91bmRGb3JtYXRzKCkpIHsKKyAgICAgICAgYWxsU3Vycm91bmQuaW5zZXJ0KHBhaXIuZmlyc3QpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHN1YmZvcm1hdCA6IHBhaXIuc2Vjb25kKSBhbGxTdXJyb3VuZC5pbnNlcnQoc3ViZm9ybWF0KTsKKyAgICB9CiAKICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGZvcmNlVXNlID0gbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoCiAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQpOwogICAgIEFMT0dEKCIlczogZm9yY2VkIHVzZSA9ICVkIiwgX19GVU5DVElPTl9fLCBmb3JjZVVzZSk7CisgICAgLy8gVGhpcyBpcyB0aGUgcmVzdWx0aW5nIHNldCBvZiBmb3JtYXRzIGRlcGVuZGluZyBvbiB0aGUgc3Vycm91bmQgbW9kZToKKyAgICAvLyAgICdhbGwgc3Vycm91bmQnID0gYWxsU3Vycm91bmQKKyAgICAvLyAgICdlbmZvcmNlZCBzdXJyb3VuZCcgPSBlbmZvcmNlZFN1cnJvdW5kIFttYXkgaW5jbHVkZSBJRUM2OTEzNyB3aGljaCBpc24ndCByYXcgc3Vycm91bmQgZm10XQorICAgIC8vICAgJ25vbi1zdXJyb3VuZCcgPSBub3QgaW4gJ2FsbCBzdXJyb3VuZCcgYW5kIG5vdCBpbiAnZW5mb3JjZWQgc3Vycm91bmQnCisgICAgLy8gICAnbWFudWFsIHN1cnJvdW5kJyA9IG1NYW51YWxTdXJyb3VuZEZvcm1hdHMKKyAgICAvLyBBVVRPOiAgIGZvcm1hdHMgdiAnZW5mb3JjZWQgc3Vycm91bmQnCisgICAgLy8gQUxXQVlTOiBmb3JtYXRzIHYgJ2FsbCBzdXJyb3VuZCcgdiAnZW5mb3JjZWQgc3Vycm91bmQnCisgICAgLy8gTkVWRVI6ICBmb3JtYXRzIF4gJ25vbi1zdXJyb3VuZCcKKyAgICAvLyBNQU5VQUw6IGZvcm1hdHMgXiAoJ25vbi1zdXJyb3VuZCcgdiAnbWFudWFsIHN1cnJvdW5kJyB2IChJRUM2OTEzNyBeICdlbmZvcmNlZCBzdXJyb3VuZCcpKQogCi0gICAgLy8gSWYgTUFOVUFMLCBrZWVwIHRoZSBzdXBwb3J0ZWQgc3Vycm91bmQgc291bmQgZm9ybWF0cyBhcyBjdXJyZW50IGVuYWJsZWQgb25lcy4KKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IGZvcm1hdFNldDsKKyAgICBpZiAoZm9yY2VVc2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTUFOVUFMCisgICAgICAgICAgICB8fCBmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9ORVZFUikgeworICAgICAgICAvLyBmb3JtYXRTZXQgaXMgKGZvcm1hdHMgXiAnbm9uLXN1cnJvdW5kJykKKyAgICAgICAgZm9yIChhdXRvIGZvcm1hdEl0ZXIgPSBmb3JtYXRzUHRyLT5iZWdpbigpOyBmb3JtYXRJdGVyICE9IGZvcm1hdHNQdHItPmVuZCgpOyArK2Zvcm1hdEl0ZXIpIHsKKyAgICAgICAgICAgIGlmIChhbGxTdXJyb3VuZC5jb3VudCgqZm9ybWF0SXRlcikgPT0gMCAmJiBlbmZvcmNlZFN1cnJvdW5kLmNvdW50KCpmb3JtYXRJdGVyKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgZm9ybWF0U2V0Lmluc2VydCgqZm9ybWF0SXRlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3JtYXRTZXQuaW5zZXJ0KGZvcm1hdHNQdHItPmJlZ2luKCksIGZvcm1hdHNQdHItPmVuZCgpKTsKKyAgICB9CisgICAgZm9ybWF0c1B0ci0+Y2xlYXIoKTsgIC8vIFJlLWZpbGxlZCBmcm9tIHRoZSBmb3JtYXRTZXQgYXQgdGhlIGVuZC4KKwogICAgIGlmIChmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9NQU5VQUwpIHsKLSAgICAgICAgZm9ybWF0cy5jbGVhcigpOwotICAgICAgICBmb3IgKGF1dG8gaXQgPSBtU3Vycm91bmRGb3JtYXRzLmJlZ2luKCk7IGl0ICE9IG1TdXJyb3VuZEZvcm1hdHMuZW5kKCk7IGl0KyspIHsKLSAgICAgICAgICAgIGZvcm1hdHMuYWRkKCppdCk7CisgICAgICAgIGZvcm1hdFNldC5pbnNlcnQobU1hbnVhbFN1cnJvdW5kRm9ybWF0cy5iZWdpbigpLCBtTWFudWFsU3Vycm91bmRGb3JtYXRzLmVuZCgpKTsKKyAgICAgICAgLy8gRW5hYmxlIElFQzYxOTM3IHdoZW4gaW4gTUFOVUFMIG1vZGUgaWYgaXQncyBlbmZvcmNlZCBmb3IgdGhpcyBkZXZpY2UuCisgICAgICAgIGlmIChlbmZvcmNlZFN1cnJvdW5kLmNvdW50KEFVRElPX0ZPUk1BVF9JRUM2MTkzNykgIT0gMCkgeworICAgICAgICAgICAgZm9ybWF0U2V0Lmluc2VydChBVURJT19GT1JNQVRfSUVDNjE5MzcpOwogICAgICAgICB9Ci0gICAgICAgIC8vIEFsd2F5cyBlbmFibGUgSUVDNjE5Mzcgd2hlbiBpbiBNQU5VQUwgbW9kZS4KLSAgICAgICAgZm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0lFQzYxOTM3KTsKLSAgICB9IGVsc2UgeyAvLyBORVZFUiwgQVVUTyBvciBBTFdBWVMKLSAgICAgICAgLy8gQW5hbHl6ZSBvcmlnaW5hbCBzdXBwb3J0IGZvciB2YXJpb3VzIGZvcm1hdHMuCi0gICAgICAgIGJvb2wgc3VwcG9ydHNBQzMgPSBmYWxzZTsKLSAgICAgICAgYm9vbCBzdXBwb3J0c090aGVyU3Vycm91bmQgPSBmYWxzZTsKLSAgICAgICAgYm9vbCBzdXBwb3J0c0lFQzYxOTM3ID0gZmFsc2U7Ci0gICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuY2xlYXIoKTsKLSAgICAgICAgZm9yIChzc2l6ZV90IGZvcm1hdEluZGV4ID0gMDsgZm9ybWF0SW5kZXggPCAoc3NpemVfdClmb3JtYXRzLnNpemUoKTsgZm9ybWF0SW5kZXgrKykgewotICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gZm9ybWF0c1tmb3JtYXRJbmRleF07Ci0gICAgICAgICAgICBzd2l0Y2ggKGZvcm1hdCkgewotICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0FDMzoKLSAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHNBQzMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9FX0FDMzoKLSAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9EVFM6Ci0gICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRFRTX0hEOgotICAgICAgICAgICAgICAgICAgICAvLyBJZiBBTFdBWVMsIHJlbW92ZSBhbGwgb3RoZXIgc3Vycm91bmQgZm9ybWF0cyBoZXJlCi0gICAgICAgICAgICAgICAgICAgIC8vIHNpbmNlIHdlIHdpbGwgYWRkIHRoZW0gbGF0ZXIuCi0gICAgICAgICAgICAgICAgICAgIGlmIChmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9BTFdBWVMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMucmVtb3ZlQXQoZm9ybWF0SW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0SW5kZXgtLTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzdXBwb3J0c090aGVyU3Vycm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9JRUM2MTkzNzoKLSAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHNJRUM2MTkzNyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZm9yY2VVc2UgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTkVWRVIpIHsgLy8gQVVUTyBvciBBTFdBWVMKKyAgICAgICAgaWYgKGZvcmNlVXNlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX0FMV0FZUykgeworICAgICAgICAgICAgZm9ybWF0U2V0Lmluc2VydChhbGxTdXJyb3VuZC5iZWdpbigpLCBhbGxTdXJyb3VuZC5lbmQoKSk7CiAgICAgICAgIH0KLQotICAgICAgICAvLyBNb2RpZnkgZm9ybWF0cyBiYXNlZCBvbiBzdXJyb3VuZCBwcmVmZXJlbmNlcy4KLSAgICAgICAgLy8gSWYgTkVWRVIsIHJlbW92ZSBzdXBwb3J0IGZvciBzdXJyb3VuZCBmb3JtYXRzLgotICAgICAgICBpZiAoZm9yY2VVc2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTkVWRVIpIHsKLSAgICAgICAgICAgIGlmIChzdXBwb3J0c0FDMyB8fCBzdXBwb3J0c090aGVyU3Vycm91bmQgfHwgc3VwcG9ydHNJRUM2MTkzNykgewotICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBzdXJyb3VuZCBzb3VuZCByZWxhdGVkIGZvcm1hdHMuCi0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgZm9ybWF0SW5kZXggPSAwOyBmb3JtYXRJbmRleCA8IGZvcm1hdHMuc2l6ZSgpOyApIHsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gZm9ybWF0c1tmb3JtYXRJbmRleF07Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaChmb3JtYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0FDMzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0VfQUMzOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRFRTOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRFRTX0hEOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfSUVDNjE5Mzc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0cy5yZW1vdmVBdChmb3JtYXRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdEluZGV4Kys7IC8vIGtlZXAgaXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdXBwb3J0c0FDMyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHN1cHBvcnRzT3RoZXJTdXJyb3VuZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHN1cHBvcnRzSUVDNjE5MzcgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsgLy8gQVVUTyBvciBBTFdBWVMKLSAgICAgICAgICAgIC8vIE1vc3QgVFZzIHN1cHBvcnQgQUMzIGV2ZW4gaWYgdGhleSBkbyBub3QgcmVwb3J0IGl0IGluIHRoZSBFRElELgotICAgICAgICAgICAgaWYgKChhbHdheXNGb3JjZUFDMyB8fCAoZm9yY2VVc2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfQUxXQVlTKSkKLSAgICAgICAgICAgICAgICAgICAgJiYgIXN1cHBvcnRzQUMzKSB7Ci0gICAgICAgICAgICAgICAgZm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0FDMyk7Ci0gICAgICAgICAgICAgICAgc3VwcG9ydHNBQzMgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJZiBBTFdBWVMsIGFkZCBzdXBwb3J0IGZvciByYXcgc3Vycm91bmQgZm9ybWF0cyBpZiBhbGwgYXJlIG1pc3NpbmcuCi0gICAgICAgICAgICAvLyBUaGlzIGFzc3VtZXMgdGhhdCBpZiBhbnkgb2YgdGhlc2UgZm9ybWF0cyBhcmUgcmVwb3J0ZWQgYnkgdGhlIEhBTAotICAgICAgICAgICAgLy8gdGhlbiB0aGUgcmVwb3J0IGlzIHZhbGlkIGFuZCBzaG91bGQgbm90IGJlIG1vZGlmaWVkLgotICAgICAgICAgICAgaWYgKGZvcmNlVXNlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX0FMV0FZUykgewotICAgICAgICAgICAgICAgIGZvcm1hdHMuYWRkKEFVRElPX0ZPUk1BVF9FX0FDMyk7Ci0gICAgICAgICAgICAgICAgZm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0RUUyk7Ci0gICAgICAgICAgICAgICAgZm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0RUU19IRCk7Ci0gICAgICAgICAgICAgICAgc3VwcG9ydHNPdGhlclN1cnJvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQWRkIHN1cHBvcnQgZm9yIElFQzYxOTM3IGlmIGFueSByYXcgc3Vycm91bmQgc3VwcG9ydGVkLgotICAgICAgICAgICAgLy8gVGhlIEhBTCBjb3VsZCBkbyB0aGlzIGJ1dCBhZGQgaXQgaGVyZSwganVzdCBpbiBjYXNlLgotICAgICAgICAgICAgaWYgKChzdXBwb3J0c0FDMyB8fCBzdXBwb3J0c090aGVyU3Vycm91bmQpICYmICFzdXBwb3J0c0lFQzYxOTM3KSB7Ci0gICAgICAgICAgICAgICAgZm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0lFQzYxOTM3KTsKLSAgICAgICAgICAgICAgICBzdXBwb3J0c0lFQzYxOTM3ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQWRkIHJlcG9ydGVkIHN1cnJvdW5kIHNvdW5kIGZvcm1hdHMgdG8gZW5hYmxlZCBzdXJyb3VuZCBmb3JtYXRzLgotICAgICAgICAgICAgZm9yIChzaXplX3QgZm9ybWF0SW5kZXggPSAwOyBmb3JtYXRJbmRleCA8IGZvcm1hdHMuc2l6ZSgpOyBmb3JtYXRJbmRleCsrKSB7Ci0gICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gZm9ybWF0c1tmb3JtYXRJbmRleF07Ci0gICAgICAgICAgICAgICAgc3dpdGNoKGZvcm1hdCkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9BQzM6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0VfQUMzOgotICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9EVFM6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0RUU19IRDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfQUFDX0xDOgotICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9ET0xCWV9UUlVFSEQ6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0VfQUMzX0pPQzoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuaW5zZXJ0KGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgZm9ybWF0U2V0Lmluc2VydChlbmZvcmNlZFN1cnJvdW5kLmJlZ2luKCksIGVuZm9yY2VkU3Vycm91bmQuZW5kKCkpOworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZvcm1hdCA6IGZvcm1hdFNldCkgeworICAgICAgICBmb3JtYXRzUHRyLT5wdXNoKGZvcm1hdCk7CiAgICAgfQogfQogCi0vLyBNb2RpZnkgdGhlIGxpc3Qgb2YgY2hhbm5lbCBtYXNrcyBzdXBwb3J0ZWQuCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZmlsdGVyU3Vycm91bmRDaGFubmVsTWFza3MoQ2hhbm5lbHNWZWN0b3IgKmNoYW5uZWxNYXNrc1B0cikgewordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6Om1vZGlmeVN1cnJvdW5kQ2hhbm5lbE1hc2tzKENoYW5uZWxzVmVjdG9yICpjaGFubmVsTWFza3NQdHIpIHsKICAgICBDaGFubmVsc1ZlY3RvciAmY2hhbm5lbE1hc2tzID0gKmNoYW5uZWxNYXNrc1B0cjsKICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGZvcmNlVXNlID0gbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoCiAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQpOwpAQCAtNjExMiwxNiArNjExMCwxNyBAQAogICAgICAgICAvLyBJZiBub3QgdGhlbiBhZGQgNS4xIHN1cHBvcnQuCiAgICAgICAgIGlmICghc3VwcG9ydHM1ZG90MSkgewogICAgICAgICAgICAgY2hhbm5lbE1hc2tzLmFkZChBVURJT19DSEFOTkVMX09VVF81UE9JTlQxKTsKLSAgICAgICAgICAgIEFMT0dJKCIlczogZm9yY2UgQUxXQVlTLCBzbyBhZGRpbmcgY2hhbm5lbE1hc2sgZm9yIDUuMSBzdXJyb3VuZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBBTE9HSSgiJXM6IGZvcmNlIE1BTlVBTCBvciBBTFdBWVMsIHNvIGFkZGluZyBjaGFubmVsTWFzayBmb3IgNS4xIHN1cnJvdW5kIiwgX19mdW5jX18pOwogICAgICAgICB9CiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6dXBkYXRlQXVkaW9Qcm9maWxlcyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnVwZGF0ZUF1ZGlvUHJvZmlsZXMoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldkRlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUHJvZmlsZVZlY3RvciAmcHJvZmlsZXMpCiB7CiAgICAgU3RyaW5nOCByZXBseTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZGV2RGVzYy0+dHlwZSgpOwogCiAgICAgLy8gRm9ybWF0IE1VU1QgYmUgY2hlY2tlZCBmaXJzdCB0byB1cGRhdGUgdGhlIGxpc3Qgb2YgQXVkaW9Qcm9maWxlCiAgICAgaWYgKHByb2ZpbGVzLmhhc0R5bmFtaWNGb3JtYXQoKSkgewpAQCAtNjEzNSw4ICs2MTM0LDkgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBGb3JtYXRWZWN0b3IgZm9ybWF0cyA9IGZvcm1hdHNGcm9tU3RyaW5nKHJlcGx5LnN0cmluZygpKTsKLSAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0hETUkpIHsKLSAgICAgICAgICAgIGZpbHRlclN1cnJvdW5kRm9ybWF0cygmZm9ybWF0cyk7CisgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9IRE1JCisgICAgICAgICAgICAgICAgfHwgaXNEZXZpY2VPZk1vZHVsZShkZXZEZXNjLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKSkgeworICAgICAgICAgICAgbW9kaWZ5U3Vycm91bmRGb3JtYXRzKGRldkRlc2MsICZmb3JtYXRzKTsKICAgICAgICAgfQogICAgICAgICBwcm9maWxlcy5zZXRGb3JtYXRzKGZvcm1hdHMpOwogICAgIH0KQEAgLTYxNjgsOCArNjE2OCw5IEBACiAgICAgICAgICAgICBpZiAocmVwbGllZFBhcmFtZXRlcnMuZ2V0KAogICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRDaGFubmVscyksIHJlcGx5KSA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcyA9IGNoYW5uZWxNYXNrc0Zyb21TdHJpbmcocmVwbHkuc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9IRE1JKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbHRlclN1cnJvdW5kQ2hhbm5lbE1hc2tzKCZjaGFubmVsTWFza3MpOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9IRE1JCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBpc0RldmljZU9mTW9kdWxlKGRldkRlc2MsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpKSB7CisgICAgICAgICAgICAgICAgICAgIG1vZGlmeVN1cnJvdW5kQ2hhbm5lbE1hc2tzKCZjaGFubmVsTWFza3MpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjE3Nyw0ICs2MTc4LDU4IEBACiAgICAgfQogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6Omluc3RhbGxQYXRjaChjb25zdCBjaGFyICpjYWxsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZSAqaW9EZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQoreworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoCisgICAgICAgICAgICBwYXRjaEhhbmRsZSAmJiAqcGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUgPworICAgICAgICAgICAgKnBhdGNoSGFuZGxlIDogaW9EZXNjcmlwdG9yLT5nZXRQYXRjaEhhbmRsZSgpKTsKKyAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2M7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5zdGFsbFBhdGNoKAorICAgICAgICAgICAgY2FsbGVyLCBpbmRleCwgcGF0Y2hIYW5kbGUsIHBhdGNoLCBkZWxheU1zLCBtVWlkQ2FjaGVkLCAmcGF0Y2hEZXNjKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIGlvRGVzY3JpcHRvci0+c2V0UGF0Y2hIYW5kbGUocGF0Y2hEZXNjLT5tSGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbnN0YWxsUGF0Y2goY29uc3QgY2hhciAqY2FsbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+ICpwYXRjaERlc2NQdHIpCit7CisgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjOworICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaCwgJmFmUGF0Y2hIYW5kbGUsIGRlbGF5TXMpOworICAgIEFMT0dWKCIlcygpIEFGOjpjcmVhdGVBdWRpb1BhdGNoIHJldHVybmVkICVkIHBhdGNoSGFuZGxlICVkIG51bV9zb3VyY2VzICVkIG51bV9zaW5rcyAlZCIsCisgICAgICAgICAgICBjYWxsZXIsIHN0YXR1cywgYWZQYXRjaEhhbmRsZSwgcGF0Y2gtPm51bV9zb3VyY2VzLCBwYXRjaC0+bnVtX3NpbmtzKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgIHBhdGNoRGVzYyA9IG5ldyBBdWRpb1BhdGNoKHBhdGNoLCB1aWQpOworICAgICAgICAgICAgYWRkQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUsIHBhdGNoRGVzYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaCA9ICpwYXRjaDsKKyAgICAgICAgfQorICAgICAgICBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKKyAgICAgICAgaWYgKHBhdGNoSGFuZGxlKSB7CisgICAgICAgICAgICAqcGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7CisgICAgICAgIH0KKyAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICB9CisgICAgaWYgKHBhdGNoRGVzY1B0cikgKnBhdGNoRGVzY1B0ciA9IHBhdGNoRGVzYzsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oCmluZGV4IDQ1ZGNhMmUuLjYxMmJkOGYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oCkBAIC0xNyw2ICsxNyw3IEBACiAjcHJhZ21hIG9uY2UKIAogI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgogCkBAIC0zMCw2ICszMSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgorI2luY2x1ZGUgPG1lZGlhL1BhdGNoQnVpbGRlci5oPgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5SW50ZXJmYWNlLmgiCiAKICNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaD4KQEAgLTM4LDYgKzQwLDcgQEAKICNpbmNsdWRlIDxBdWRpb1BvbGljeUNvbmZpZy5oPgogI2luY2x1ZGUgPEF1ZGlvUG9ydC5oPgogI2luY2x1ZGUgPEF1ZGlvUGF0Y2guaD4KKyNpbmNsdWRlIDxBdWRpb1Byb2ZpbGUuaD4KICNpbmNsdWRlIDxEZXZpY2VEZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8SU9Qcm9maWxlLmg+CiAjaW5jbHVkZSA8SHdNb2R1bGUuaD4KQEAgLTQ2LDggKzQ5LDcgQEAKICNpbmNsdWRlIDxBdWRpb1BvbGljeU1peC5oPgogI2luY2x1ZGUgPEVmZmVjdERlc2NyaXB0b3IuaD4KICNpbmNsdWRlIDxTb3VuZFRyaWdnZXJTZXNzaW9uLmg+Ci0jaW5jbHVkZSA8U2Vzc2lvblJvdXRlLmg+Ci0jaW5jbHVkZSA8Vm9sdW1lQ3VydmUuaD4KKyNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtOTUsMTIgKzk3LDE0IEBACiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KTsKICAgICAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KTsKICAgICAgICAgdmlydHVhbCB2b2lkIHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKTsKICAgICAgICAgdmlydHVhbCB2b2lkIHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKTsKQEAgLTEwOSwyNiArMTEzLDIyIEBACiAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRTeXN0ZW1Qcm9wZXJ0eShjb25zdCBjaGFyKiBwcm9wZXJ0eSwgY29uc3QgY2hhciogdmFsdWUpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOwogICAgICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgICAgIHN0YXR1c190IGdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gKnNlY29uZGFyeU91dHB1dHMpIG92ZXJyaWRlOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgcmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY29uZmlnLApAQCAtMTM4LDIwICsxMzgsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKTsKIAogICAgICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIGlucHV0IHN0YXJ0cyBiZWluZyB1c2VkLgotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2lsZW5jZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jdXJyZW5jeV90eXBlX19tYXNrX3QgKmNvbmN1cnJlbmN5KTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAogICAgICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIGlucHV0IHN0b3BzIGJlaW5nIHVzZWQuCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgICAgICB2aXJ0dWFsIHZvaWQgY2xvc2VBbGxJbnB1dHMoKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBjaGVja0Nsb3NlSW5wdXRzKCk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgaW5pdFN0cmVhbVZvbHVtZTogZXZlbiBpZiB0aGUgZW5naW5lIHZvbHVtZSBmaWxlcyBwcm92aWRlcyBtaW4gYW5kIG1heCwga2VlcCB0aGlzCisgICAgICAgICAqIGFwaSBmb3IgY29tcGF0aWJpbGl0eSByZWFzb24uCisgICAgICAgICAqIEF1ZGlvU2VydmVyIHdpbGwgZ2V0IHRoZSBtaW4gYW5kIG1heCBhbmQgbWF5IG92ZXJ3cml0ZSB0aGVtIGlmOgorICAgICAgICAgKiAgICAgIC11c2luZyBwcm9wZXJ0eSAoaGlnaGVzdCBwcmlvcml0eSkKKyAgICAgICAgICogICAgICAtbm90IGRlZmluZWQgKC0xIGJ5IGNvbnZlbnRpb24pLCBjYXNlIHdoZW4gc3RpbGwgdXNpbmcgYXBtIHZvbHVtZSB0YWJsZXMgWE1MIGZpbGVzCisgICAgICAgICAqIEBwYXJhbSBzdHJlYW0gdG8gYmUgY29uc2lkZXJlZAorICAgICAgICAgKiBAcGFyYW0gaW5kZXhNaW4gdG8gc2V0CisgICAgICAgICAqIEBwYXJhbSBpbmRleE1heCB0byBzZXQKKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdm9pZCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwpAQCAtMTU5LDEwICsxNjIsMzMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwogCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBpbnQgJmluZGV4KTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGludCAmaW5kZXgpOworCisgICAgICAgIHN0YXR1c190IHNldFZvbHVtZUN1cnZlSW5kZXgoaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVZvbHVtZUN1cnZlcyAmdm9sdW1lQ3VydmVzKTsKKworICAgICAgICBzdGF0dXNfdCBnZXRWb2x1bWVJbmRleChjb25zdCBJVm9sdW1lQ3VydmVzICZjdXJ2ZXMsIGludCAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0OworCiAgICAgICAgIC8vIHJldHVybiB0aGUgc3RyYXRlZ3kgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIHN0cmVhbSB0eXBlCi0gICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgICAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGF1ZGlvIGF0dHJpYnV0ZXMKLSAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKTsKKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHN0cmVhbVRvU3RyYXRlZ3koc3RyZWFtKTsKKyAgICAgICAgfQorICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyZWFtVG9TdHJhdGVneShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgYXV0byBhdHRyaWJ1dGVzID0gbUVuZ2luZS0+Z2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoc3RyZWFtKTsKKyAgICAgICAgICAgIHJldHVybiBtRW5naW5lLT5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOworICAgICAgICB9CiAKICAgICAgICAgLy8gcmV0dXJuIHRoZSBlbmFibGVkIG91dHB1dCBkZXZpY2VzIGZvciB0aGUgZ2l2ZW4gc3RyZWFtIHR5cGUKICAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CkBAIC0xNzMsMTQgKzE5OSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3RyYXRlZ3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1FZmZlY3RzLnVucmVnaXN0ZXJFZmZlY3QoaWQpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1FZmZlY3RzLnNldEVmZmVjdEVuYWJsZWQoaWQsIGVuYWJsZWQpOwotICAgICAgICB9CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlckVmZmVjdChpbnQgaWQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpOworICAgICAgICBzdGF0dXNfdCBtb3ZlRWZmZWN0c1RvSW8oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgaWRzLCBhdWRpb19pb19oYW5kbGVfdCBpbykgb3ZlcnJpZGU7CiAKICAgICAgICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OwogICAgICAgICAvLyByZXR1cm4gd2hldGhlciBhIHN0cmVhbSBpcyBwbGF5aW5nIHJlbW90ZWx5LCBvdmVycmlkZSB0byBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2YKQEAgLTE5MywxMCArMjE0LDE4IEBACiAKICAgICAgICAgdmlydHVhbCBib29sIGlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3Q7CiAKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisgICAgICAgIC8vIGhlbHBlcnMgZm9yIGR1bXAoaW50IGZkKQorICAgICAgICB2b2lkIGR1bXBNYW51YWxTdXJyb3VuZEZvcm1hdHMoU3RyaW5nOCAqZHN0KSBjb25zdDsKKyAgICAgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CiAKKyAgICAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpIG92ZXJyaWRlOworCisgICAgICAgIHN0YXR1c190IHNldEFsbG93ZWRDYXB0dXJlUG9saWN5KHVpZF90IHVpZCwgYXVkaW9fZmxhZ3NfbWFza190IGNhcHR1cmVQb2xpY3kpIG92ZXJyaWRlOwogICAgICAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBvZmZsb2FkSW5mbyk7CiAKKyAgICAgICAgdmlydHVhbCBib29sIGlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcyk7CisKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50ICpudW1fcG9ydHMsCkBAIC0yMjYsMTIgKzI1NSwxNSBAQAogCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVnaXN0ZXJQb2xpY3lNaXhlcyhjb25zdCBWZWN0b3I8QXVkaW9NaXg+JiBtaXhlcyk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlclBvbGljeU1peGVzKFZlY3RvcjxBdWRpb01peD4gbWl4ZXMpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLAorICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcyk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpOwogCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNb25vKGJvb2wgbW9ubyk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTW9ubyhib29sICptb25vKTsKQEAgLTI0NCwxMCArMjc2LDM2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVwb3J0ZWQpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwgYm9vbCBlbmFibGVkKTsKIAotICAgICAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBzdHJlYW0gdHlwZQotICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IGdldFN0cmF0ZWd5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gKmZvcm1hdHMpOwogCi0gICAgICAgIHZpcnR1YWwgdm9pZCBzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0QXBwU3RhdGUodWlkX3QgdWlkLCBhcHBfc3RhdGVfdCBzdGF0ZSk7CisKKyAgICAgICAgdmlydHVhbCBib29sIGlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbUVuZ2luZS0+bGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoc3RyYXRlZ2llcyk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCAmcHJvZHVjdFN0cmF0ZWd5KQorICAgICAgICB7CisgICAgICAgICAgICBwcm9kdWN0U3RyYXRlZ3kgPSBtRW5naW5lLT5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKGFhLmdldEF0dHJpYnV0ZXMoKSk7CisgICAgICAgICAgICByZXR1cm4gcHJvZHVjdFN0cmF0ZWd5ICE9IFBST0RVQ1RfU1RSQVRFR1lfTk9ORSA/IE5PX0VSUk9SIDogQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Wb2x1bWVHcm91cHMoQXVkaW9Wb2x1bWVHcm91cFZlY3RvciAmZ3JvdXBzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbUVuZ2luZS0+bGlzdEF1ZGlvVm9sdW1lR3JvdXBzKGdyb3Vwcyk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVfZ3JvdXBfdCAmdm9sdW1lR3JvdXApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZvbHVtZUdyb3VwID0gbUVuZ2luZS0+Z2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGFhLmdldEF0dHJpYnV0ZXMoKSk7CisgICAgICAgICAgICByZXR1cm4gdm9sdW1lR3JvdXAgIT0gVk9MVU1FX0dST1VQX05PTkUgPyBOT19FUlJPUiA6IEJBRF9WQUxVRTsKKyAgICAgICAgfQogCiBwcm90ZWN0ZWQ6CiAgICAgICAgIC8vIEEgY29uc3RydWN0b3IgdGhhdCBhbGxvd3MgbW9yZSBmaW5lLWdyYWluZWQgY29udHJvbCBvdmVyIGluaXRpYWxpemF0aW9uIHByb2Nlc3MsCkBAIC0yODYsNzUgKzM0NCw5MyBAQAogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gbUlucHV0czsKICAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGNvbnN0IERldmljZVZlY3RvciAmZ2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpIGNvbnN0CisgICAgICAgIHZpcnR1YWwgY29uc3QgRGV2aWNlVmVjdG9yIGdldEF2YWlsYWJsZU91dHB1dERldmljZXMoKSBjb25zdAogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gbUF2YWlsYWJsZU91dHB1dERldmljZXM7CiAgICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBjb25zdCBEZXZpY2VWZWN0b3IgJmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpIGNvbnN0CisgICAgICAgIHZpcnR1YWwgY29uc3QgRGV2aWNlVmVjdG9yIGdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpIGNvbnN0CiAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGxlZ2FjeSBhbmQgbm9uLWxlZ2FjeSByZW1vdGUtc3VibWl4IGFyZSBtYW5hZ2VkIGJ5IHRoZSBlbmdpbmUsIGRvIG5vdCBmaWx0ZXIKICAgICAgICAgICAgIHJldHVybiBtQXZhaWxhYmxlSW5wdXREZXZpY2VzOwogICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgSVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24gJmdldFZvbHVtZUN1cnZlcygpIHsgcmV0dXJuICptVm9sdW1lQ3VydmVzOyB9CiAgICAgICAgIHZpcnR1YWwgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmdldERlZmF1bHRPdXRwdXREZXZpY2UoKSBjb25zdAogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gbURlZmF1bHRPdXRwdXREZXZpY2U7CiAgICAgICAgIH0KIAorICAgICAgICBzdGQ6OnZlY3Rvcjx2b2x1bWVfZ3JvdXBfdD4gZ2V0Vm9sdW1lR3JvdXBzKCkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIG1FbmdpbmUtPmdldFZvbHVtZUdyb3VwcygpOworICAgICAgICB9CisKKyAgICAgICAgVm9sdW1lU291cmNlIHRvVm9sdW1lU291cmNlKHZvbHVtZV9ncm91cF90IHZvbHVtZUdyb3VwKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Vm9sdW1lU291cmNlPih2b2x1bWVHcm91cCk7CisgICAgICAgIH0KKyAgICAgICAgVm9sdW1lU291cmNlIHRvVm9sdW1lU291cmNlKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcykgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIHRvVm9sdW1lU291cmNlKG1FbmdpbmUtPmdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzKSk7CisgICAgICAgIH0KKyAgICAgICAgVm9sdW1lU291cmNlIHRvVm9sdW1lU291cmNlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdG9Wb2x1bWVTb3VyY2UobUVuZ2luZS0+Z2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKHN0cmVhbSkpOworICAgICAgICB9CisgICAgICAgIElWb2x1bWVDdXJ2ZXMgJmdldFZvbHVtZUN1cnZlcyhWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlKQorICAgICAgICB7CisgICAgICAgICAgYXV0byAqY3VydmVzID0gbUVuZ2luZS0+Z2V0Vm9sdW1lQ3VydmVzRm9yVm9sdW1lR3JvdXAoCisgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHZvbHVtZV9ncm91cF90Pih2b2x1bWVTb3VyY2UpKTsKKyAgICAgICAgICBBTE9HX0FTU0VSVChjdXJ2ZXMgIT0gbnVsbHB0ciwgIk5vIGN1cnZlcyBmb3Igdm9sdW1lIHNvdXJjZSAlZCIsIHZvbHVtZVNvdXJjZSk7CisgICAgICAgICAgcmV0dXJuICpjdXJ2ZXM7CisgICAgICAgIH0KKyAgICAgICAgSVZvbHVtZUN1cnZlcyAmZ2V0Vm9sdW1lQ3VydmVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikKKyAgICAgICAgeworICAgICAgICAgICAgYXV0byAqY3VydmVzID0gbUVuZ2luZS0+Z2V0Vm9sdW1lQ3VydmVzRm9yQXR0cmlidXRlcyhhdHRyKTsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKGN1cnZlcyAhPSBudWxscHRyLCAiTm8gY3VydmVzIGZvciBhdHRyaWJ1dGVzICVzIiwgdG9TdHJpbmcoYXR0cikuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gKmN1cnZlczsKKyAgICAgICAgfQorICAgICAgICBJVm9sdW1lQ3VydmVzICZnZXRWb2x1bWVDdXJ2ZXMoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGF1dG8gKmN1cnZlcyA9IG1FbmdpbmUtPmdldFZvbHVtZUN1cnZlc0ZvclN0cmVhbVR5cGUoc3RyZWFtKTsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKGN1cnZlcyAhPSBudWxscHRyLCAiTm8gY3VydmVzIGZvciBzdHJlYW0gJXMiLCB0b1N0cmluZyhzdHJlYW0pLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuICpjdXJ2ZXM7CisgICAgICAgIH0KKwogICAgICAgICB2b2lkIGFkZE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYyk7CiAgICAgICAgIHZvaWQgcmVtb3ZlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CiAgICAgICAgIHZvaWQgYWRkSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsIGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiYgaW5wdXREZXNjKTsKIAotICAgICAgICAvLyByZXR1cm4gYXBwcm9wcmlhdGUgZGV2aWNlIGZvciBzdHJlYW1zIGhhbmRsZWQgYnkgdGhlIHNwZWNpZmllZCBzdHJhdGVneSBhY2NvcmRpbmcgdG8gY3VycmVudAotICAgICAgICAvLyBwaG9uZSBzdGF0ZSwgY29ubmVjdGVkIGRldmljZXMuLi4KLSAgICAgICAgLy8gaWYgZnJvbUNhY2hlIGlzIHRydWUsIHRoZSBkZXZpY2UgaXMgcmV0dXJuZWQgZnJvbSBtRGV2aWNlRm9yU3RyYXRlZ3lbXSwKLSAgICAgICAgLy8gb3RoZXJ3aXNlIGl0IGlzIGRldGVybWluZSBieSBjdXJyZW50IHN0YXRlCi0gICAgICAgIC8vIChkZXZpY2UgY29ubmVjdGVkLHBob25lIHN0YXRlLCBmb3JjZSB1c2UsIGEyZHAgb3V0cHV0Li4uKQotICAgICAgICAvLyBUaGlzIGFsbG93cyB0bzoKLSAgICAgICAgLy8gIDEgc3BlZWQgdXAgcHJvY2VzcyB3aGVuIHRoZSBzdGF0ZSBpcyBzdGFibGUgKHdoZW4gc3RhcnRpbmcgb3Igc3RvcHBpbmcgYW4gb3V0cHV0KQotICAgICAgICAvLyAgMiBhY2Nlc3MgdG8gZWl0aGVyIGN1cnJlbnQgZGV2aWNlIHNlbGVjdGlvbiAoZnJvbUNhY2hlID09IHRydWUpIG9yCi0gICAgICAgIC8vICJmdXR1cmUiIGRldmljZSBzZWxlY3Rpb24gKGZyb21DYWNoZSA9PSBmYWxzZSkgd2hlbiBjYWxsZWQgZnJvbSBhIGNvbnRleHQKLSAgICAgICAgLy8gIHdoZXJlIGNvbmRpdGlvbnMgYXJlIGNoYW5naW5nIChzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSwgc2V0UGhvbmVTdGF0ZSgpLi4uKSBBTkQKLSAgICAgICAgLy8gIGJlZm9yZSB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpIGlzIGNhbGxlZC4KLSAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUpOwotCi0gICAgICAgIGJvb2wgaXNTdHJhdGVneUFjdGl2ZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLCByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMgPSAwLCBuc2Vjc190IHN5c1RpbWUgPSAwKSBjb25zdDsKLQotICAgICAgICBib29sIGlzU3RyYXRlZ3lBY3RpdmVPblNhbWVNb2R1bGUoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwgdWludDMyX3QgaW5QYXN0TXMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHN5c1RpbWUgPSAwKSBjb25zdDsKLQogICAgICAgICAvLyBjaGFuZ2UgdGhlIHJvdXRlIG9mIHRoZSBzcGVjaWZpZWQgb3V0cHV0LiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbXMgd2UgaGF2ZSBzbGVwdCB0bwogICAgICAgICAvLyBhbGxvdyBuZXcgcm91dGluZyB0byB0YWtlIGVmZmVjdCBpbiBjZXJ0YWluIGNhc2VzLgotICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IHNldE91dHB1dERldmljZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcyA9IG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVxdWlyZXNNdXRlQ2hlY2sgPSB0cnVlKTsKKyAgICAgICAgdWludDMyX3Qgc2V0T3V0cHV0RGV2aWNlcyhjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUgPSBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVxdWlyZXNNdXRlQ2hlY2sgPSB0cnVlKTsKICAgICAgICAgc3RhdHVzX3QgcmVzZXRPdXRwdXREZXZpY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUgPSBOVUxMKTsKICAgICAgICAgc3RhdHVzX3Qgc2V0SW5wdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlID0gTlVMTCk7CiAgICAgICAgIHN0YXR1c190IHJlc2V0SW5wdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlID0gTlVMTCk7CiAKLSAgICAgICAgLy8gc2VsZWN0IGlucHV0IGRldmljZSBjb3JyZXNwb25kaW5nIHRvIHJlcXVlc3RlZCBhdWRpbyBzb3VyY2UKLSAgICAgICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UpOwotCiAgICAgICAgIC8vIGNvbXB1dGUgdGhlIGFjdHVhbCB2b2x1bWUgZm9yIGEgZ2l2ZW4gc3RyZWFtIGFjY29yZGluZyB0byB0aGUgcmVxdWVzdGVkIGluZGV4IGFuZCBhIHBhcnRpY3VsYXIKICAgICAgICAgLy8gZGV2aWNlCi0gICAgICAgIHZpcnR1YWwgZmxvYXQgY29tcHV0ZVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgdmlydHVhbCBmbG9hdCBjb21wdXRlVm9sdW1lKElWb2x1bWVDdXJ2ZXMgJmN1cnZlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKIAorICAgICAgICAvLyByZXNjYWxlIHZvbHVtZSBpbmRleCBmcm9tIHNyY1N0cmVhbSB3aXRoaW4gcmFuZ2Ugb2YgZHN0U3RyZWFtCisgICAgICAgIGludCByZXNjYWxlVm9sdW1lSW5kZXgoaW50IHNyY0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZVNvdXJjZSBmcm9tVm9sdW1lU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZVNvdXJjZSB0b1ZvbHVtZVNvdXJjZSk7CiAgICAgICAgIC8vIGNoZWNrIHRoYXQgdm9sdW1lIGNoYW5nZSBpcyBwZXJtaXR0ZWQsIGNvbXB1dGUgYW5kIHNlbmQgbmV3IHZvbHVtZSB0byBhdWRpbyBoYXJkd2FyZQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNoZWNrQW5kU2V0Vm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXgsCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2hlY2tBbmRTZXRWb2x1bWUoSVZvbHVtZUN1cnZlcyAmY3VydmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIGludCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLCBib29sIGZvcmNlID0gZmFsc2UpOwpAQCAtMzYzLDIzICs0MzksMzUgQEAKICAgICAgICAgdm9pZCBhcHBseVN0cmVhbVZvbHVtZXMoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgaW50IGRlbGF5TXMgPSAwLCBib29sIGZvcmNlID0gZmFsc2UpOwogCi0gICAgICAgIC8vIE11dGUgb3IgdW5tdXRlIGFsbCBzdHJlYW1zIGhhbmRsZWQgYnkgdGhlIHNwZWNpZmllZCBzdHJhdGVneSBvbiB0aGUgc3BlY2lmaWVkIG91dHB1dAotICAgICAgICB2b2lkIHNldFN0cmF0ZWd5TXV0ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAorICAgICAgICAvKioKKyAgICAgICAgICogQGJyaWVmIHNldFN0cmF0ZWd5TXV0ZSBNdXRlIG9yIHVubXV0ZSBhbGwgYWN0aXZlIGNsaWVudHMgb24gdGhlIGNvbnNpZGVyZWQgb3V0cHV0CisgICAgICAgICAqIGZvbGxvd2luZyB0aGUgZ2l2ZW4gc3RyYXRlZ3kuCisgICAgICAgICAqIEBwYXJhbSBzdHJhdGVneSB0byBiZSBjb25zaWRlcmVkCisgICAgICAgICAqIEBwYXJhbSBvbiB0cnVlIGZvciBtdXRlLCBmYWxzZSBmb3IgdW5tdXRlCisgICAgICAgICAqIEBwYXJhbSBvdXRwdXREZXNjIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgICAgICogQHBhcmFtIGRlbGF5TXMKKyAgICAgICAgICogQHBhcmFtIGRldmljZQorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBzZXRTdHJhdGVneU11dGUocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSAoYXVkaW9fZGV2aWNlc190KTApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX05PTkUpOwogCi0gICAgICAgIC8vIE11dGUgb3IgdW5tdXRlIHRoZSBzdHJlYW0gb24gdGhlIHNwZWNpZmllZCBvdXRwdXQKLSAgICAgICAgdm9pZCBzZXRTdHJlYW1NdXRlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdCkwKTsKLQotICAgICAgICAvLyBoYW5kbGUgc3BlY2lhbCBjYXNlcyBmb3Igc29uaWZpY2F0aW9uIHN0cmF0ZWd5IHdoaWxlIGluIGNhbGw6IG11dGUgc3RyZWFtcyBvciByZXBsYWNlIGJ5Ci0gICAgICAgIC8vIGEgc3BlY2lhbCB0b25lIGluIHRoZSBkZXZpY2UgdXNlZCBmb3IgY29tbXVuaWNhdGlvbgotICAgICAgICB2b2lkIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCBzdGFydGluZywgYm9vbCBzdGF0ZUNoYW5nZSk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgc2V0Vm9sdW1lU291cmNlTXV0ZSBNdXRlIG9yIHVubXV0ZSB0aGUgdm9sdW1lIHNvdXJjZSBvbiB0aGUgc3BlY2lmaWVkIG91dHB1dAorICAgICAgICAgKiBAcGFyYW0gdm9sdW1lU291cmNlIHRvIGJlIG11dGVkL3VubXV0ZSAobWF5IGhvc3QgbGVnYWN5IHN0cmVhbXMgb3IgYnkgZXh0ZW5zaW9uIHNldCBvZgorICAgICAgICAgKiBhdWRpbyBhdHRyaWJ1dGVzKQorICAgICAgICAgKiBAcGFyYW0gb24gdHJ1ZSB0byBtdXRlLCBmYWxzZSB0byB1bXV0ZQorICAgICAgICAgKiBAcGFyYW0gb3V0cHV0RGVzYyBvbiB3aGljaCB0aGUgY2xpZW50IGZvbGxvd2luZyB0aGUgdm9sdW1lIGdyb3VwIHNoYWxsIGJlIG11dGVkL3VtdXRlZAorICAgICAgICAgKiBAcGFyYW0gZGVsYXlNcworICAgICAgICAgKiBAcGFyYW0gZGV2aWNlCisgICAgICAgICAqLworICAgICAgICB2b2lkIHNldFZvbHVtZVNvdXJjZU11dGUoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FKTsKIAogICAgICAgICBhdWRpb19tb2RlX3QgZ2V0UGhvbmVTdGF0ZSgpOwogCkBAIC0zOTQsMTUgKzQ4MiwxMiBAQAogICAgICAgICAvLyB3aGVuIGEgZGV2aWNlIGlzIGRpc2Nvbm5lY3RlZCwgY2hlY2tzIGlmIGFuIG91dHB1dCBpcyBub3QgdXNlZCBhbnkgbW9yZSBhbmQKICAgICAgICAgLy8gcmV0dXJucyBpdHMgaGFuZGxlIGlmIGFueS4KICAgICAgICAgLy8gdHJhbnNmZXJzIHRoZSBhdWRpbyB0cmFja3MgYW5kIGVmZmVjdHMgZnJvbSBvbmUgb3V0cHV0IHRocmVhZCB0byBhbm90aGVyIGFjY29yZGluZ2x5LgotICAgICAgICBzdGF0dXNfdCBjaGVja091dHB1dHNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldkRlc2MsCisgICAgICAgIHN0YXR1c190IGNoZWNrT3V0cHV0c0ZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cyk7CiAKLSAgICAgICAgc3RhdHVzX3QgY2hlY2tJbnB1dHNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldkRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgaW5wdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzKTsKKyAgICAgICAgc3RhdHVzX3QgY2hlY2tJbnB1dHNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKTsKIAogICAgICAgICAvLyBjbG9zZSBhbiBvdXRwdXQgYW5kIGl0cyBjb21wYW5pb24gZHVwbGljYXRpbmcgb3V0cHV0LgogICAgICAgICB2b2lkIGNsb3NlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CkBAIC00MTAsMTUgKzQ5NSwzNSBAQAogICAgICAgICAvLyBjbG9zZSBhbiBpbnB1dC4KICAgICAgICAgdm9pZCBjbG9zZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0KTsKIAotICAgICAgICAvLyBjaGVja3MgYW5kIGlmIG5lY2Vzc2FyeSBjaGFuZ2VzIG91dHB1dHMgdXNlZCBmb3IgYWxsIHN0cmF0ZWdpZXMuCi0gICAgICAgIC8vIG11c3QgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBjb25kaXRpb24gdGhhdCBhZmZlY3RzIHRoZSBvdXRwdXQgY2hvaWNlIGZvciBhIGdpdmVuIHN0cmF0ZWd5Ci0gICAgICAgIC8vIGNoYW5nZXM6IGNvbm5lY3RlZCBkZXZpY2UsIHBob25lIHN0YXRlLCBmb3JjZSB1c2UuLi4KLSAgICAgICAgLy8gTXVzdCBiZSBjYWxsZWQgYmVmb3JlIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCkKLSAgICAgICAgdm9pZCBjaGVja091dHB1dEZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpOworICAgICAgICAvLyBydW5zIGFsbCB0aGUgY2hlY2tzIHJlcXVpcmVkIGZvciBhY2NvbW9kYXRpbmcgY2hhbmdlcyBpbiBkZXZpY2VzIGFuZCBvdXRwdXRzCisgICAgICAgIC8vIGlmICdvbk91dHB1dHNDaGVja2VkJyBjYWxsYmFjayBpcyBwcm92aWRlZCwgaXQgaXMgZXhlY3V0ZWQgYWZ0ZXIgdGhlIG91dHB1dHMKKyAgICAgICAgLy8gY2hlY2sgdmlhICdjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMnLiBJZiB0aGUgY2FsbGJhY2sgcmV0dXJucyAndHJ1ZScsCisgICAgICAgIC8vIEEyRFAgc3VzcGVuZCBzdGF0dXMgaXMgcmVjaGVja2VkLgorICAgICAgICB2b2lkIGNoZWNrRm9yRGV2aWNlQW5kT3V0cHV0Q2hhbmdlcyhzdGQ6OmZ1bmN0aW9uPGJvb2woKT4gb25PdXRwdXRzQ2hlY2tlZCA9IG51bGxwdHIpOwogCi0gICAgICAgIC8vIFNhbWUgYXMgY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpIGJ1dCBmb3IgYSBhbGwgc3RyYXRlZ2llcyBpbiBvcmRlciBvZiBwcmlvcml0eQorICAgICAgICAvKioKKyAgICAgICAgICogQGJyaWVmIGNoZWNrT3V0cHV0Rm9yQXR0cmlidXRlcyBjaGVja3MgYW5kIGlmIG5lY2Vzc2FyeSBjaGFuZ2VzIG91dHB1dHMgdXNlZCBmb3IgdGhlCisgICAgICAgICAqIGdpdmVuIGF1ZGlvIGF0dHJpYnV0ZXMuCisgICAgICAgICAqIG11c3QgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBjb25kaXRpb24gdGhhdCBhZmZlY3RzIHRoZSBvdXRwdXQgY2hvaWNlIGZvciBhIGdpdmVuCisgICAgICAgICAqIGF0dHJpYnV0ZXMgY2hhbmdlczogY29ubmVjdGVkIGRldmljZSwgcGhvbmUgc3RhdGUsIGZvcmNlIHVzZS4uLgorICAgICAgICAgKiBNdXN0IGJlIGNhbGxlZCBiZWZvcmUgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKQorICAgICAgICAgKiBAcGFyYW0gYXR0ciB0byBiZSBjb25zaWRlcmVkCisgICAgICAgICAqLworICAgICAgICB2b2lkIGNoZWNrT3V0cHV0Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpOworCisgICAgICAgIGJvb2wgZm9sbG93c1NhbWVSb3V0aW5nKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmbEF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmckF0dHIpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzIFNhbWUgYXMgQHNlZSBjaGVja091dHB1dEZvckF0dHJpYnV0ZXMoKQorICAgICAgICAgKiAgICAgIGJ1dCBmb3IgYSBhbGwgcHJvZHVjdCBzdHJhdGVnaWVzIGluIG9yZGVyIG9mIHByaW9yaXR5CisgICAgICAgICAqLwogICAgICAgICB2b2lkIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOwogCisgICAgICAgIC8vIFNhbWUgYXMgY2hlY2tPdXRwdXRGb3JTdHJhdGVneSBidXQgZm9yIHNlY29uZGFyeSBvdXRwdXRzLiBNYWtlIHN1cmUgaWYgYSBzZWNvbmRhcnkKKyAgICAgICAgLy8gb3V0cHV0IGNvbmRpdGlvbiBjaGFuZ2VzLCB0aGUgdHJhY2sgaXMgcHJvcGVybHkgcmVyb3V0ZWQKKyAgICAgICAgdm9pZCBjaGVja1NlY29uZGFyeU91dHB1dHMoKTsKKwogICAgICAgICAvLyBtYW5hZ2VzIEEyRFAgb3V0cHV0IHN1c3BlbmQvcmVzdG9yZSBhY2NvcmRpbmcgdG8gcGhvbmUgc3RhdGUgYW5kIEJUIFNDTyB1c2FnZQogICAgICAgICB2b2lkIGNoZWNrQTJkcFN1c3BlbmQoKTsKIApAQCAtNDI2LDE4ICs1MzEsMjEgQEAKICAgICAgICAgLy8gbXVzdCBiZSBjYWxsZWQgZXZlcnkgdGltZSBhIGNvbmRpdGlvbiB0aGF0IGFmZmVjdHMgdGhlIGRldmljZSBjaG9pY2UgZm9yIGEgZ2l2ZW4gb3V0cHV0IGlzCiAgICAgICAgIC8vIGNoYW5nZWQ6IGNvbm5lY3RlZCBkZXZpY2UsIHBob25lIHN0YXRlLCBmb3JjZSB1c2UsIG91dHB1dCBzdGFydCwgb3V0cHV0IHN0b3AuLgogICAgICAgICAvLyBzZWUgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBmb3IgdGhlIHVzZSBvZiBmcm9tQ2FjaGUgcGFyYW1ldGVyCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBnZXROZXdPdXRwdXREZXZpY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSk7CisgICAgICAgIERldmljZVZlY3RvciBnZXROZXdPdXRwdXREZXZpY2VzKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUpOwogCi0gICAgICAgIC8vIHVwZGF0ZXMgY2FjaGUgb2YgZGV2aWNlIHVzZWQgYnkgYWxsIHN0cmF0ZWdpZXMgKG1EZXZpY2VGb3JTdHJhdGVneVtdKQotICAgICAgICAvLyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgY29uZGl0aW9uIHRoYXQgYWZmZWN0cyB0aGUgZGV2aWNlIGNob2ljZSBmb3IgYSBnaXZlbiBzdHJhdGVneSBpcwotICAgICAgICAvLyBjaGFuZ2VkOiBjb25uZWN0ZWQgZGV2aWNlLCBwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLi4uCi0gICAgICAgIC8vIGNhY2hlZCB2YWx1ZXMgYXJlIHVzZWQgYnkgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBpZiBwYXJhbWV0ZXIgZnJvbUNhY2hlIGlzIHRydWUuCi0gICAgICAgICAvLyBNdXN0IGJlIGNhbGxlZCBhZnRlciBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKQorICAgICAgICAvKioKKyAgICAgICAgICogQGJyaWVmIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzOiB1cGRhdGVzIGNhY2hlIG9mIGRldmljZXMgb2YgdGhlIGVuZ2luZQorICAgICAgICAgKiBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgY29uZGl0aW9uIHRoYXQgYWZmZWN0cyB0aGUgZGV2aWNlIGNob2ljZSBpcyBjaGFuZ2VkOgorICAgICAgICAgKiBjb25uZWN0ZWQgZGV2aWNlLCBwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLi4uCisgICAgICAgICAqIGNhY2hlZCB2YWx1ZXMgYXJlIHVzZWQgYnkgZ2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbSgpL2dldERldmljZXNGb3JBdHRyaWJ1dGVzIGlmCisgICAgICAgICAqIHBhcmFtZXRlciBmcm9tQ2FjaGUgaXMgdHJ1ZS4KKyAgICAgICAgICogTXVzdCBiZSBjYWxsZWQgYWZ0ZXIgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkKKyAgICAgICAgICovCiAgICAgICAgIHZvaWQgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKIAogICAgICAgICAvLyBzZWxlY3RzIHRoZSBtb3N0IGFwcHJvcHJpYXRlIGRldmljZSBvbiBpbnB1dCBmb3IgY3VycmVudCBzdGF0ZQotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZ2V0TmV3SW5wdXREZXZpY2UoY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+JiBpbnB1dERlc2MpOworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXROZXdJbnB1dERldmljZShjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4mIGlucHV0RGVzYyk7CiAKICAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRNYXhFZmZlY3RzQ3B1TG9hZCgpCiAgICAgICAgIHsKQEAgLTQ0OSwzNCArNTU3LDUwIEBACiAgICAgICAgICAgICByZXR1cm4gbUVmZmVjdHMuZ2V0TWF4RWZmZWN0c01lbW9yeSgpOwogICAgICAgICB9CiAKLSAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBnZXRPdXRwdXRzRm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiYgb3Blbk91dHB1dHMpOwotICAgICAgICBib29sIHZlY3RvcnNFcXVhbChTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzMik7CisgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gZ2V0T3V0cHV0c0ZvckRldmljZXMoCisgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLCBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiYgb3Blbk91dHB1dHMpOwogCi0gICAgICAgIC8vIG11dGUvdW5tdXRlIHN0cmF0ZWdpZXMgdXNpbmcgYW4gaW5jb21wYXRpYmxlIGRldmljZSBjb21iaW5hdGlvbgotICAgICAgICAvLyBpZiBtdXRpbmcsIHdhaXQgZm9yIHRoZSBhdWRpbyBpbiBwY20gYnVmZmVyIHRvIGJlIGRyYWluZWQgYmVmb3JlIHByb2NlZWRpbmcKLSAgICAgICAgLy8gaWYgdW5tdXRpbmcsIHVubXV0ZSBvbmx5IGFmdGVyIHRoZSBzcGVjaWZpZWQgZGVsYXkKLSAgICAgICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIG1zIHdhaXRlZAotICAgICAgICB2aXJ0dWFsIHVpbnQzMl90ICBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcmV2RGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zKTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBicmllZiBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzIG11dGUvdW5tdXRlIHN0cmF0ZWdpZXMKKyAgICAgICAgICogICAgICB1c2luZyBhbiBpbmNvbXBhdGlibGUgZGV2aWNlIGNvbWJpbmF0aW9uLgorICAgICAgICAgKiAgICAgIGlmIG11dGluZywgd2FpdCBmb3IgdGhlIGF1ZGlvIGluIHBjbSBidWZmZXIgdG8gYmUgZHJhaW5lZCBiZWZvcmUgcHJvY2VlZGluZworICAgICAgICAgKiAgICAgIGlmIHVubXV0aW5nLCB1bm11dGUgb25seSBhZnRlciB0aGUgc3BlY2lmaWVkIGRlbGF5CisgICAgICAgICAqIEBwYXJhbSBvdXRwdXREZXNjCisgICAgICAgICAqIEBwYXJhbSBwcmV2RGV2aWNlCisgICAgICAgICAqIEBwYXJhbSBkZWxheU1zCisgICAgICAgICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBtcyB3YWl0ZWQKKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcyhjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZwcmV2RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMpOwogCiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNlbGVjdE91dHB1dChjb25zdCBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IDApOwogICAgICAgICAvLyBzYW1wbGluZ1JhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2sgYXJlIGluL291dCBhbmQgc28gbWF5IGJlIG1vZGlmaWVkCi0gICAgICAgIHNwPElPUHJvZmlsZT4gZ2V0SW5wdXRQcm9maWxlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgIHNwPElPUHJvZmlsZT4gZ2V0SW5wdXRQcm9maWxlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICYgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCYgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCYgY2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpOwotICAgICAgICBzcDxJT1Byb2ZpbGU+IGdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBicmllZiBnZXRQcm9maWxlRm9yT3V0cHV0CisgICAgICAgICAqIEBwYXJhbSBkZXZpY2VzIHZlY3RvciBvZiBkZXNjcmlwdG9ycywgbWF5IGJlIGVtcHR5IGlmIGlnbm9yaW5nIHRoZSBkZXZpY2UgaXMgcmVxdWlyZWQKKyAgICAgICAgICogQHBhcmFtIHNhbXBsaW5nUmF0ZQorICAgICAgICAgKiBAcGFyYW0gZm9ybWF0CisgICAgICAgICAqIEBwYXJhbSBjaGFubmVsTWFzaworICAgICAgICAgKiBAcGFyYW0gZmxhZ3MKKyAgICAgICAgICogQHBhcmFtIGRpcmVjdE9ubHkKKyAgICAgICAgICogQHJldHVybiBJT1Byb2ZpbGUgdG8gYmUgdXNlZCBpZiBmb3VuZCwgbnVsbHB0ciBvdGhlcndpc2UKKyAgICAgICAgICovCisgICAgICAgIHNwPElPUHJvZmlsZT4gZ2V0UHJvZmlsZUZvck91dHB1dChjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkaXJlY3RPbmx5KTsKIAogICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzZWxlY3RPdXRwdXRGb3JNdXNpY0VmZmVjdHMoKTsKIApAQCAtNDg5LDYyICs2MTMsODcgQEAKICAgICAgICAgICAgIHJldHVybiBtQXVkaW9QYXRjaGVzLnJlbW92ZUF1ZGlvUGF0Y2goaGFuZGxlKTsKICAgICAgICAgfQogCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbGFibGVQcmltYXJ5T3V0cHV0RGV2aWNlcygpIGNvbnN0CisgICAgICAgIGJvb2wgaXNQcmltYXJ5TW9kdWxlKGNvbnN0IHNwPEh3TW9kdWxlPiAmbW9kdWxlKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICBpZiAobW9kdWxlID09IDAgfHwgIWhhc1ByaW1hcnlPdXRwdXQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtb2R1bGUtPmdldEhhbmRsZSgpID09IG1QcmltYXJ5T3V0cHV0LT5nZXRNb2R1bGVIYW5kbGUoKTsKKyAgICAgICAgfQorICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlUHJpbWFyeU91dHB1dERldmljZXMoKSBjb25zdAogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIWhhc1ByaW1hcnlPdXRwdXQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbVByaW1hcnlPdXRwdXQtPnN1cHBvcnRlZERldmljZXMoKSAmIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCk7CisgICAgICAgICAgICByZXR1cm4gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZmlsdGVyKG1QcmltYXJ5T3V0cHV0LT5zdXBwb3J0ZWREZXZpY2VzKCkpOwogICAgICAgICB9Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCkgY29uc3QKKyAgICAgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZVByaW1hcnlNb2R1bGVJbnB1dERldmljZXMoKSBjb25zdAogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoIWhhc1ByaW1hcnlPdXRwdXQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbUh3TW9kdWxlKG1QcmltYXJ5T3V0cHV0LT5nZXRNb2R1bGVIYW5kbGUoKSk7CisgICAgICAgICAgICByZXR1cm4gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbUh3TW9kdWxlKAorICAgICAgICAgICAgICAgICAgICBtUHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCkpOworICAgICAgICB9CisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgZ2V0Rmlyc3REZXZpY2VJZCBvZiB0aGUgRGV2aWNlIFZlY3RvcgorICAgICAgICAgKiBAcmV0dXJuIGlmIHRoZSBjb2xsZWN0aW9uIGlzIG5vdCBlbXB0eSwgaXQgcmV0dXJucyB0aGUgZmlyc3QgZGV2aWNlIElkLAorICAgICAgICAgKiAgICAgICAgIG90aGVyd2lzZSBBVURJT19QT1JUX0hBTkRMRV9OT05FCisgICAgICAgICAqLworICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldEZpcnN0RGV2aWNlSWQoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKGRldmljZXMuc2l6ZSgpID4gMCkgPyBkZXZpY2VzLml0ZW1BdCgwKS0+Z2V0SWQoKSA6IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgIH0KKyAgICAgICAgU3RyaW5nOCBnZXRGaXJzdERldmljZUFkZHJlc3MoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKGRldmljZXMuc2l6ZSgpID4gMCkgPyBkZXZpY2VzLml0ZW1BdCgwKS0+YWRkcmVzcygpIDogU3RyaW5nOCgiIik7CiAgICAgICAgIH0KIAotICAgICAgICB1aW50MzJfdCB1cGRhdGVDYWxsUm91dGluZyhhdWRpb19kZXZpY2VzX3QgcnhEZXZpY2UsIHVpbnQzMl90IGRlbGF5TXMgPSAwKTsKLSAgICAgICAgc3A8QXVkaW9QYXRjaD4gY3JlYXRlVGVsZXBob255UGF0Y2goYm9vbCBpc1J4LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCB1aW50MzJfdCBkZWxheU1zKTsKLSAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZmlsbEF1ZGlvUG9ydENvbmZpZ0ZvckRldmljZSgKLSAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworICAgICAgICB1aW50MzJfdCB1cGRhdGVDYWxsUm91dGluZyhjb25zdCBEZXZpY2VWZWN0b3IgJnJ4RGV2aWNlcywgdWludDMyX3QgZGVsYXlNcyA9IDApOworICAgICAgICBzcDxBdWRpb1BhdGNoPiBjcmVhdGVUZWxlcGhvbnlQYXRjaChib29sIGlzUngsIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMpOworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBmaW5kRGV2aWNlKAorICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcywgYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3Q7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBnZXRNb2R1bGVEZXZpY2VUeXBlcygKKyAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsIGNvbnN0IGNoYXIgKm1vZHVsZUlkKSBjb25zdDsKKyAgICAgICAgYm9vbCBpc0RldmljZU9mTW9kdWxlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLCBjb25zdCBjaGFyICptb2R1bGVJZCkgY29uc3Q7CiAKLSAgICAgICAgLy8gaWYgYXJndW1lbnQgImRldmljZSIgaXMgZGlmZmVyZW50IGZyb20gQVVESU9fREVWSUNFX05PTkUsICBzdGFydFNvdXJjZSgpIHdpbGwgZm9yY2UKLSAgICAgICAgLy8gdGhlIHJlLWV2YWx1YXRpb24gb2YgdGhlIG91dHB1dCBkZXZpY2UuCi0gICAgICAgIHN0YXR1c190IHN0YXJ0U291cmNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICBzdGF0dXNfdCBzdGFydFNvdXJjZShjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmRlbGF5TXMpOwotICAgICAgICBzdGF0dXNfdCBzdG9wU291cmNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZURldmljZVVwZGF0ZSk7CisgICAgICAgIHN0YXR1c190IHN0b3BTb3VyY2UoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCk7CiAKICAgICAgICAgdm9pZCBjbGVhckF1ZGlvUGF0Y2hlcyh1aWRfdCB1aWQpOwogICAgICAgICB2b2lkIGNsZWFyU2Vzc2lvblJvdXRlcyh1aWRfdCB1aWQpOwotICAgICAgICB2b2lkIGNoZWNrU3RyYXRlZ3lSb3V0ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LCBhdWRpb19pb19oYW5kbGVfdCBvdXB0dXRUb1NraXApOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgY2hlY2tTdHJhdGVneVJvdXRlOiB3aGVuIGFuIG91dHB1dCBpcyBiZWVpbmcgcmVyb3V0ZWQsIHJlY29uc2lkZXIgZWFjaCBvdXRwdXQKKyAgICAgICAgICogdGhhdCBtYXkgaG9zdCBhIHN0cmF0ZWd5IHBsYXlpbmcgb24gdGhlIGNvbnNpZGVyZWQgb3V0cHV0LgorICAgICAgICAgKiBAcGFyYW0gcHMgcHJvZHVjdCBzdHJhdGVneSB0aGF0IGluaXRpYXRlZCB0aGUgcmVyb3V0aW5nCisgICAgICAgICAqIEBwYXJhbSBvdXB0dXRUb1NraXAgb3V0cHV0IHRoYXQgaW5pdGlhdGVkIHRoZSByZXJvdXRpbmcKKyAgICAgICAgICovCisgICAgICAgIHZvaWQgY2hlY2tTdHJhdGVneVJvdXRlKHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcywgYXVkaW9faW9faGFuZGxlX3Qgb3VwdHV0VG9Ta2lwKTsKIAogICAgICAgICBzdGF0dXNfdCBoYXNQcmltYXJ5T3V0cHV0KCkgY29uc3QgeyByZXR1cm4gbVByaW1hcnlPdXRwdXQgIT0gMDsgfQogCi0gICAgICAgIHN0YXR1c190IGNvbm5lY3RBdWRpb1NvdXJjZShjb25zdCBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKTsKLSAgICAgICAgc3RhdHVzX3QgZGlzY29ubmVjdEF1ZGlvU291cmNlKGNvbnN0IHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpOworICAgICAgICBzdGF0dXNfdCBjb25uZWN0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpOworICAgICAgICBzdGF0dXNfdCBkaXNjb25uZWN0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpOwogCi0gICAgICAgIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gZ2V0U291cmNlRm9yU3RyYXRlZ3lPbk91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KTsKKyAgICAgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gZ2V0U291cmNlRm9yQXR0cmlidXRlc09uT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cik7CiAKICAgICAgICAgdm9pZCBjbGVhblVwRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZpY2VEZXNjKTsKIAogICAgICAgICB2b2lkIGNsZWFyQXVkaW9Tb3VyY2VzKHVpZF90IHVpZCk7CiAKLSAgICAgICAgc3RhdGljIGJvb2wgaXNDb25jdXJyZW50U291cmNlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7Ci0KLSAgICAgICAgYm9vbCBpc0NvbmN1cmVudENhcHR1cmVBbGxvd2VkKGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiYgaW5wdXREZXNjLAotICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4mIGF1ZGlvU2Vzc2lvbik7Ci0KICAgICAgICAgc3RhdGljIGJvb2wgc3RyZWFtc01hdGNoRm9ydm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtMik7CiAKLSAgICAgICAgdWlkX3QgbVVpZENhY2hlZDsKKyAgICAgICAgdm9pZCBjbG9zZUFjdGl2ZUNsaWVudHMoY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+JiBpbnB1dCk7CisgICAgICAgIHZvaWQgY2xvc2VDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworCisgICAgICAgIGNvbnN0IHVpZF90IG1VaWRDYWNoZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFJRF9BVURJT1NFUlZFUgogICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqbXBDbGllbnRJbnRlcmZhY2U7ICAvLyBhdWRpbyBwb2xpY3kgY2xpZW50IGludGVyZmFjZQogICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbVByaW1hcnlPdXRwdXQ7ICAgICAvLyBwcmltYXJ5IG91dHB1dCBkZXNjcmlwdG9yCiAgICAgICAgIC8vIGxpc3Qgb2YgZGVzY3JpcHRvcnMgZm9yIG91dHB1dHMgY3VycmVudGx5IG9wZW5lZApAQCAtNTU4LDIwICs3MDcsMTcgQEAKICAgICAgICAgRGV2aWNlVmVjdG9yICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlczsgLy8gYWxsIGF2YWlsYWJsZSBvdXRwdXQgZGV2aWNlcwogICAgICAgICBEZXZpY2VWZWN0b3IgIG1BdmFpbGFibGVJbnB1dERldmljZXM7ICAvLyBhbGwgYXZhaWxhYmxlIGlucHV0IGRldmljZXMKIAotICAgICAgICBTZXNzaW9uUm91dGVNYXAgbU91dHB1dFJvdXRlcyA9IFNlc3Npb25Sb3V0ZU1hcChTZXNzaW9uUm91dGVNYXA6Ok1BUFRZUEVfT1VUUFVUKTsKLSAgICAgICAgU2Vzc2lvblJvdXRlTWFwIG1JbnB1dFJvdXRlcyA9IFNlc3Npb25Sb3V0ZU1hcChTZXNzaW9uUm91dGVNYXA6Ok1BUFRZUEVfSU5QVVQpOwotCiAgICAgICAgIGJvb2wgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWU7ICAgICAgICAvLyBsaW1pdCByaW5ndG9uZSB2b2x1bWUgdG8gbXVzaWMgdm9sdW1lIGlmIGhlYWRzZXQgY29ubmVjdGVkCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBtRGV2aWNlRm9yU3RyYXRlZ3lbTlVNX1NUUkFURUdJRVNdOworCiAgICAgICAgIGZsb2F0ICAgbUxhc3RWb2ljZVZvbHVtZTsgICAgICAgICAgICAvLyBsYXN0IHZvaWNlIHZvbHVtZSB2YWx1ZSBzZW50IHRvIGF1ZGlvIEhBTAogICAgICAgICBib29sICAgIG1BMmRwU3VzcGVuZGVkOyAgLy8gdHJ1ZSBpZiBBMkRQIG91dHB1dCBpcyBzdXNwZW5kZWQKIAotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24+IG1Wb2x1bWVDdXJ2ZXM7IC8vIFZvbHVtZSBDdXJ2ZXMgcGVyIHVzZSBjYXNlIGFuZCBkZXZpY2UgY2F0ZWdvcnkKICAgICAgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gbUVmZmVjdHM7ICAvLyBsaXN0IG9mIHJlZ2lzdGVyZWQgYXVkaW8gZWZmZWN0cwogICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtRGVmYXVsdE91dHB1dERldmljZTsgLy8gb3V0cHV0IGRldmljZSBzZWxlY3RlZCBieSBkZWZhdWx0IGF0IGJvb3QgdGltZQogICAgICAgICBId01vZHVsZUNvbGxlY3Rpb24gbUh3TW9kdWxlczsgLy8gY29udGFpbnMgb25seSBtb2R1bGVzIHRoYXQgaGF2ZSBiZWVuIGxvYWRlZCBzdWNjZXNzZnVsbHkKICAgICAgICAgSHdNb2R1bGVDb2xsZWN0aW9uIG1Id01vZHVsZXNBbGw7IC8vIG5vcm1hbGx5IG5vdCBuZWVkZWQsIHVzZWQgZHVyaW5nIGNvbnN0cnVjdGlvbiBhbmQgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkdW1wcworCiAgICAgICAgIEF1ZGlvUG9saWN5Q29uZmlnIG1Db25maWc7CiAKICAgICAgICAgc3RkOjphdG9taWM8dWludDMyX3Q+IG1BdWRpb1BvcnRHZW5lcmF0aW9uOwpAQCAtNTg0LDcgKzczMCw3IEBACiAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IG1DYWxsUnhQYXRjaDsKIAogICAgICAgICBId0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiBtSHdPdXRwdXRzOwotICAgICAgICBBdWRpb1NvdXJjZUNvbGxlY3Rpb24gbUF1ZGlvU291cmNlczsKKyAgICAgICAgU291cmNlQ2xpZW50Q29sbGVjdGlvbiBtQXVkaW9Tb3VyY2VzOwogCiAgICAgICAgIC8vIGZvciBzdXBwb3J0aW5nICJiZWFjb24iIHN0cmVhbXMsIGkuZS4gc3RyZWFtcyB0aGF0IG9ubHkgcGxheSBvbiBzcGVha2VyLCBhbmQgbmV2ZXIKICAgICAgICAgLy8gd2hlbiBzb21ldGhpbmcgb3RoZXIgdGhhbiBTVFJFQU1fVFRTIChhLmsuYS4gIlRyYW5zbWl0dGVkIFRocm91Z2ggU3BlYWtlciIpIGlzIHBsYXlpbmcKQEAgLTYwOCwxNyArNzU0LDI5IEBACiAgICAgICAgIC8vIEF1ZGlvIFBvbGljeSBFbmdpbmUgSW50ZXJmYWNlLgogICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UgKm1FbmdpbmU7CiAKLSAgICAgICAgLy8gU3Vycm91bmQgZm9ybWF0cyB0aGF0IGFyZSBlbmFibGVkLgotICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IG1TdXJyb3VuZEZvcm1hdHM7CisgICAgICAgIC8vIFN1cnJvdW5kIGZvcm1hdHMgdGhhdCBhcmUgZW5hYmxlZCBtYW51YWxseS4gVGFrZW4gaW50byBhY2NvdW50IHdoZW4KKyAgICAgICAgLy8gImVuY29kZWQgc3Vycm91bmQiIGlzIGZvcmNlZCBpbnRvICJtYW51YWwiIG1vZGUuCisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4gbU1hbnVhbFN1cnJvdW5kRm9ybWF0czsKKworICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIGF1ZGlvX2ZsYWdzX21hc2tfdD4gbUFsbG93ZWRDYXB0dXJlUG9saWNpZXM7CiBwcml2YXRlOgogICAgICAgICAvLyBBZGQgb3IgcmVtb3ZlIEFDMyBEVFMgZW5jb2RpbmdzIGJhc2VkIG9uIHVzZXIgcHJlZmVyZW5jZXMuCi0gICAgICAgIHZvaWQgZmlsdGVyU3Vycm91bmRGb3JtYXRzKEZvcm1hdFZlY3RvciAqZm9ybWF0c1B0cik7Ci0gICAgICAgIHZvaWQgZmlsdGVyU3Vycm91bmRDaGFubmVsTWFza3MoQ2hhbm5lbHNWZWN0b3IgKmNoYW5uZWxNYXNrc1B0cik7CisgICAgICAgIHZvaWQgbW9kaWZ5U3Vycm91bmRGb3JtYXRzKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLCBGb3JtYXRWZWN0b3IgKmZvcm1hdHNQdHIpOworICAgICAgICB2b2lkIG1vZGlmeVN1cnJvdW5kQ2hhbm5lbE1hc2tzKENoYW5uZWxzVmVjdG9yICpjaGFubmVsTWFza3NQdHIpOwogCi0gICAgICAgIHN0YXR1c190IGdldFN1cHBvcnRlZEZvcm1hdHMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIEZvcm1hdFZlY3RvciYgZm9ybWF0cyk7CisgICAgICAgIC8vIFN1cHBvcnQgZm9yIE11bHRpLVN0cmVhbSBEZWNvZGVyIChNU0QpIG1vZHVsZQorICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXRNc2RBdWRpb0luRGV2aWNlKCkgY29uc3Q7CisgICAgICAgIERldmljZVZlY3RvciBnZXRNc2RBdWRpb091dERldmljZXMoKSBjb25zdDsKKyAgICAgICAgY29uc3QgQXVkaW9QYXRjaENvbGxlY3Rpb24gZ2V0TXNkUGF0Y2hlcygpIGNvbnN0OworICAgICAgICBzdGF0dXNfdCBnZXRCZXN0TXNkQXVkaW9Qcm9maWxlRm9yKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZvdXRwdXREZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBod0F2U3luYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rQ29uZmlnKSBjb25zdDsKKyAgICAgICAgUGF0Y2hCdWlsZGVyIGJ1aWxkTXNkUGF0Y2goY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJm91dHB1dERldmljZSkgY29uc3Q7CisgICAgICAgIHN0YXR1c190IHNldE1zZFBhdGNoKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZvdXRwdXREZXZpY2UgPSBudWxscHRyKTsKIAogICAgICAgICAvLyBJZiBhbnksIHJlc29sdmUgYW55ICJkeW5hbWljIiBmaWVsZHMgb2YgYW4gQXVkaW8gUHJvZmlsZXMgY29sbGVjdGlvbgotICAgICAgICB2b2lkIHVwZGF0ZUF1ZGlvUHJvZmlsZXMoYXVkaW9fZGV2aWNlc190IGRldmljZSwgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCisgICAgICAgIHZvaWQgdXBkYXRlQXVkaW9Qcm9maWxlcyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2RGVzYywgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCiAgICAgICAgICAgICAgICAgQXVkaW9Qcm9maWxlVmVjdG9yICZwcm9maWxlcyk7CiAKICAgICAgICAgLy8gTm90aWZ5IHRoZSBwb2xpY3kgY2xpZW50IG9mIGFueSBjaGFuZ2Ugb2YgZGV2aWNlIHN0YXRlIHdpdGggQVVESU9fSU9fSEFORExFX05PTkUsCkBAIC02MjYsNDIgKzc4NCw1OCBAQAogICAgICAgICAvLyBJdCBjYW4gZ2l2ZSBhIGNoYW5jZSB0byBIQUwgaW1wbGVtZW50ZXIgdG8gcmV0cmlldmUgZHluYW1pYyBjYXBhYmlsaXRpZXMgYXNzb2NpYXRlZAogICAgICAgICAvLyB0byB0aGlzIGRldmljZSBmb3IgZXhhbXBsZS4KICAgICAgICAgLy8gVE9ETyBhdm9pZCBvcGVuaW5nIHN0cmVhbSB0byByZXRyaWV2ZSBjYXBhYmlsaXRpZXMgb2YgYSBwcm9maWxlLgotICAgICAgICB2b2lkIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJmRldmljZV9hZGRyZXNzKTsKKyAgICAgICAgdm9pZCBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKTsKIAogICAgICAgICAvLyB1cGRhdGVzIGRldmljZSBjYWNoaW5nIGFuZCBvdXRwdXQgZm9yIHN0cmVhbXMgdGhhdCBjYW4gaW5mbHVlbmNlIHRoZQogICAgICAgICAvLyAgICByb3V0aW5nIG9mIG5vdGlmaWNhdGlvbnMKICAgICAgICAgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25Sb3V0aW5nRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICAgICAgLy8gZmluZCB0aGUgb3V0cHV0cyBvbiBhIGdpdmVuIG91dHB1dCBkZXNjcmlwdG9yIHRoYXQgaGF2ZSB0aGUgZ2l2ZW4gYWRkcmVzcy4KLSAgICAgICAgLy8gdG8gYmUgY2FsbGVkIG9uIGFuIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciB3aG9zZSBzdXBwb3J0ZWQgZGV2aWNlcyAoYXMgZGVmaW5lZAotICAgICAgICAvLyAgIGluIG1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcykgbWF0Y2hlcyB0aGUgZGV2aWNlIHdob3NlIGFkZHJlc3MgaXMgdG8gYmUgbWF0Y2hlZC4KLSAgICAgICAgLy8gc2VlIGRldmljZURpc3Rpbmd1aXNoZXNPbkFkZHJlc3MoYXVkaW9fZGV2aWNlc190KSBmb3Igd2hldGhlciB0aGUgZGV2aWNlIHR5cGUgaXMgb25lCi0gICAgICAgIC8vICAgd2hlcmUgYWRkcmVzc2VzIGFyZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gb25lIGNvbm5lY3RlZCBkZXZpY2UgYW5kIGFub3RoZXIuCi0gICAgICAgIHZvaWQgZmluZElvSGFuZGxlc0J5QWRkcmVzcyhjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIGRlc2MgLyppbiovLAotICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgLyppbiovLAotICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MgLyppbiovLAotICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMgLypvdXQqLyk7CiAgICAgICAgIHVpbnQzMl90IGN1ckF1ZGlvUG9ydEdlbmVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtQXVkaW9Qb3J0R2VuZXJhdGlvbjsgfQorICAgICAgICAvLyBpbnRlcm5hbCBtZXRob2QsIGdldCBhdWRpb19hdHRyaWJ1dGVzX3QgZnJvbSBlaXRoZXIgYSBzb3VyY2UgYXVkaW9fYXR0cmlidXRlc190CisgICAgICAgIC8vIG9yIGF1ZGlvX3N0cmVhbV90eXBlX3QsIHJlc3BlY3RpdmVseS4KKyAgICAgICAgc3RhdHVzX3QgZ2V0QXVkaW9BdHRyaWJ1dGVzKGF1ZGlvX2F0dHJpYnV0ZXNfdCAqZHN0QXR0ciwKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKnNyY0F0dHIsCisgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzcmNTdHJlYW0pOworICAgICAgICAvLyBpbnRlcm5hbCBtZXRob2QsIGNhbGxlZCBieSBnZXRPdXRwdXRGb3JBdHRyKCkgYW5kIGNvbm5lY3RBdWRpb1NvdXJjZS4KKyAgICAgICAgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0ckludChhdWRpb19hdHRyaWJ1dGVzX3QgKnJlc3VsdEF0dHIsCisgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAorICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKKyAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgICAgIGJvb2wgKmlzUmVxdWVzdGVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlLAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4gKnNlY29uZGFyeURlc2NzKTsKICAgICAgICAgLy8gaW50ZXJuYWwgbWV0aG9kIHRvIHJldHVybiB0aGUgb3V0cHV0IGhhbmRsZSBmb3IgdGhlIGdpdmVuIGRldmljZSBhbmQgZm9ybWF0Ci0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckRldmljZSgKLSAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JEZXZpY2VzKAorICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcywKICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncyk7Ci0gICAgICAgIC8vIGludGVybmFsIG1ldGhvZCB0byByZXR1cm4gdGhlIGlucHV0IGhhbmRsZSBmb3IgdGhlIGdpdmVuIGRldmljZSBhbmQgZm9ybWF0Ci0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldElucHV0Rm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzLAorICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKKyAgICAgICAgICAgICAgICBib29sIGZvcmNlTXV0aW5nSGFwdGljID0gZmFsc2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgZ2V0SW5wdXRGb3JEZXZpY2Ugc2VsZWN0cyBhbiBpbnB1dCBoYW5kbGUgZm9yIGEgZ2l2ZW4gaW5wdXQgZGV2aWNlIGFuZAorICAgICAgICAgKiByZXF1ZXN0ZXIgY29udGV4dAorICAgICAgICAgKiBAcGFyYW0gZGV2aWNlIHRvIGJlIHVzZWQgYnkgcmVxdWVzdGVyLCBzZWxlY3RlZCBieSBwb2xpY3kgbWl4IHJ1bGVzIG9yIGVuZ2luZQorICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvbiByZXF1ZXN0ZXIgc2Vzc2lvbiBpZAorICAgICAgICAgKiBAcGFyYW0gdWlkIHJlcXVlc3RlciB1aWQKKyAgICAgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgcmVxdWVzdGVyIGF1ZGlvIGF0dHJpYnV0ZXMgKGUuZy4gaW5wdXQgc291cmNlIGFuZCB0YWdzIG1hdHRlcikKKyAgICAgICAgICogQHBhcmFtIGNvbmZpZyByZXF1ZXN0ZXIgYXVkaW8gY29uZmlndXJhdGlvbiAoZS5nLiBzYW1wbGUgcmF0ZSwgZm9ybWF0LCBjaGFubmVsIG1hc2spLgorICAgICAgICAgKiBAcGFyYW0gZmxhZ3MgcmVxdWVzdGVyIGlucHV0IGZsYWdzCisgICAgICAgICAqIEBwYXJhbSBwb2xpY3lNaXggbWF5IGJlIG51bGwsIHBvbGljeSBydWxlcyB0byBiZSBmb2xsb3dlZCBieSB0aGUgcmVxdWVzdGVyCisgICAgICAgICAqIEByZXR1cm4gaW5wdXQgaW8gaGFuZGxlIGFrYSB1bmlxdWUgaW5wdXQgaWRlbnRpZmllciBzZWxlY3RlZCBmb3IgdGhpcyBkZXZpY2UuCisgICAgICAgICAqLworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRJbnB1dEZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAogICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKLSAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9Qb2xpY3lNaXg+ICZwb2xpY3lNaXgpOwogCi0gICAgICAgIC8vIGludGVybmFsIGZ1bmN0aW9uIHRvIGRlcml2ZSBhIHN0cmVhbSB0eXBlIHZhbHVlIGZyb20gYXVkaW8gYXR0cmlidXRlcwotICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpOwogICAgICAgICAvLyBldmVudCBpcyBvbmUgb2YgU1RBUlRJTkdfT1VUUFVULCBTVEFSVElOR19CRUFDT04sIFNUT1BQSU5HX09VVFBVVCwgU1RPUFBJTkdfQkVBQ09OCiAgICAgICAgIC8vIHJldHVybnMgMCBpZiBubyBtdXRlL3VubXV0ZSBldmVudCBoYXBwZW5lZCwgdGhlIGxhcmdlc3QgbGF0ZW5jeSBvZiB0aGUgZGV2aWNlIHdoZXJlCiAgICAgICAgIC8vICAgdGhlIG11dGUvdW5tdXRlIGhhcHBlbmVkCkBAIC02NjksMjUgKzg0MywzNSBAQAogICAgICAgICB1aW50MzJfdCBzZXRCZWFjb25NdXRlKGJvb2wgbXV0ZSk7CiAgICAgICAgIGJvb2wgICAgIGlzVmFsaWRBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqcGFhKTsKIAotICAgICAgICAvLyBzZWxlY3QgaW5wdXQgZGV2aWNlIGNvcnJlc3BvbmRpbmcgdG8gcmVxdWVzdGVkIGF1ZGlvIHNvdXJjZSBhbmQgcmV0dXJuIGFzc29jaWF0ZWQgcG9saWN5Ci0gICAgICAgIC8vIG1peCBpZiBhbnkuIENhbGxzIGdldERldmljZUZvcklucHV0U291cmNlKCkuCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiAqcG9saWN5TWl4ID0gTlVMTCk7Ci0KICAgICAgICAgLy8gQ2FsbGVkIGJ5IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpLgotICAgICAgICBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpOworICAgICAgICBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCk7CisKKyAgICAgICAgdm9pZCBzZXRFbmdpbmVEZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpOworCiAgICAgICAgIHZvaWQgdXBkYXRlTW9ubyhhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpIHsKICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtOwogICAgICAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleU1vbm9PdXRwdXQpLCAoaW50KW1NYXN0ZXJNb25vKTsKICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG91dHB1dCwgcGFyYW0udG9TdHJpbmcoKSk7CiAgICAgICAgIH0KKyAgICAgICAgc3RhdHVzX3QgaW5zdGFsbFBhdGNoKGNvbnN0IGNoYXIgKmNhbGxlciwKKyAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UgKmlvRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgIGludCBkZWxheU1zKTsKKyAgICAgICAgc3RhdHVzX3QgaW5zdGFsbFBhdGNoKGNvbnN0IGNoYXIgKmNhbGxlciwKKyAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4LAorICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAorICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICBzcDxBdWRpb1BhdGNoPiAqcGF0Y2hEZXNjUHRyKTsKIAotICAgICAgICBib29sIHNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmUoKTsKLSAgICAgICAgYm9vbCBtU291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZTsKLSAgICAgICAgYm9vbCBtSGFzQ29tcHV0ZWRTb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlOworICAgICAgICB2b2lkIGNsZWFuVXBFZmZlY3RzRm9ySW8oYXVkaW9faW9faGFuZGxlX3QgaW8pOwogfTsKIAogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGY0YzU2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsNDkgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU1JDX0ZJTEVTOj0gXAorICAgIEF1ZGlvUG9saWN5U2VydmljZS5jcHAgXAorICAgIEF1ZGlvUG9saWN5RWZmZWN0cy5jcHAgXAorICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAgXAorICAgIEF1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKKworTE9DQUxfQ19JTkNMVURFUyA6PSBcCisgICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIgXAorICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKKworTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCisgICAgbGliYXVkaW9wb2xpY3ljb21tb24gXAorICAgIGxpYmF1ZGlvcG9saWN5ZW5naW5lX2ludGVyZmFjZV9oZWFkZXJzIFwKKyAgICBsaWJhdWRpb3BvbGljeW1hbmFnZXJfaW50ZXJmYWNlX2hlYWRlcnMKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgICAgbGliY3V0aWxzIFwKKyAgICBsaWJ1dGlscyBcCisgICAgbGlibG9nIFwKKyAgICBsaWJiaW5kZXIgXAorICAgIGxpYmF1ZGlvY2xpZW50IFwKKyAgICBsaWJhdWRpb3V0aWxzIFwKKyAgICBsaWJoYXJkd2FyZV9sZWdhY3kgXAorICAgIGxpYmF1ZGlvcG9saWN5bWFuYWdlciBcCisgICAgbGlibWVkaWFfaGVscGVyIFwKKyAgICBsaWJtZWRpYW1ldHJpY3MgXAorICAgIGxpYm1lZGlhdXRpbHMgXAorICAgIGxpYmVmZmVjdHNjb25maWcgXAorICAgIGxpYnNlbnNvcnByaXZhY3kKKworTE9DQUxfRVhQT1JUX1NIQVJFRF9MSUJSQVJZX0hFQURFUlMgOj0gXAorICAgIGxpYnNlbnNvcnByaXZhY3kKKworTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCisgICAgbGliYXVkaW9wb2xpY3ljb21wb25lbnRzCisKK0xPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCisKK0xPQ0FMX01PRFVMRTo9IGxpYmF1ZGlvcG9saWN5c2VydmljZQorCitMT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbgorTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKKworaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKaW5kZXggYjA2NGY4Yy4uZDUxY2M2ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcApAQCAtMTU1LDE3ICsxNTUsNiBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OnN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsCi0gICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5zdGFydFRvbmUodG9uZSwgc3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6c3RvcFRvbmUoKQotewotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5zdG9wVG9uZSgpOwotfQotCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheV9tcykKIHsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5U2VydmljZS0+c2V0Vm9pY2VWb2x1bWUodm9sdW1lLCBkZWxheV9tcyk7CkBAIC0xODMsNiArMTcyLDEzIEBACiAgICAgcmV0dXJuIGFmLT5tb3ZlRWZmZWN0cyhzZXNzaW9uLCBzcmNfb3V0cHV0LCBkc3Rfb3V0cHV0KTsKIH0KIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpzZXRFZmZlY3RTdXNwZW5kZWQoaW50IGVmZmVjdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1c3BlbmRlZCkKK3sKKyAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5zZXRFZmZlY3RTdXNwZW5kZWQoZWZmZWN0SWQsIHNlc3Npb25JZCwgc3VzcGVuZGVkKTsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6Y3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQpAQCAtMjIwLDEyICsyMTYsMjMgQEAKIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoCi0gICAgICAgIGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKQogewogICAgIG1BdWRpb1BvbGljeVNlcnZpY2UtPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgY2xpZW50SW5mbywKLSAgICAgICAgICAgIGNsaWVudENvbmZpZywgZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICBjbGllbnRDb25maWcsIGNsaWVudEVmZmVjdHMsIGRldmljZUNvbmZpZywgZWZmZWN0cywgcGF0Y2hIYW5kbGUsIHNvdXJjZSk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6b25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpCit7CisgICAgbUF1ZGlvUG9saWN5U2VydmljZS0+b25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZChncm91cCwgZmxhZ3MpOwogfQogCiBhdWRpb191bmlxdWVfaWRfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpuZXdBdWRpb1VuaXF1ZUlkKGF1ZGlvX3VuaXF1ZV9pZF91c2VfdCB1c2UpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKaW5kZXggYzdkZmUwZi4uNDk0NzcxNCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KICNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzQ29uZmlnLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvYXVkaW9fZWZmZWN0c19jb25mLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CkBAIC0zMSw3ICszMiw2IEBACiAjaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5RWZmZWN0cy5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zMTcsNiArMzE3LDIwMSBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6YWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKQoreworICAgIGlmICh1dWlkID09IE5VTEwgfHwgdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KCk6IE51bGwgdXVpZCBvciB0eXBlIHV1aWQgcG9pbnRlciIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIEhPVFdPUkQsIEZNX1RVTkVSIGFuZCBFQ0hPX1JFRkVSRU5DRSBhcmUgc3BlY2lhbCBjYXNlIHNvdXJjZXMgPiBNQVguCisgICAgaWYgKHNvdXJjZSA8IEFVRElPX1NPVVJDRV9ERUZBVUxUIHx8CisgICAgICAgICAgICAoc291cmNlID4gQVVESU9fU09VUkNFX01BWCAmJgorICAgICAgICAgICAgIHNvdXJjZSAhPSBBVURJT19TT1VSQ0VfSE9UV09SRCAmJgorICAgICAgICAgICAgIHNvdXJjZSAhPSBBVURJT19TT1VSQ0VfRk1fVFVORVIgJiYKKyAgICAgICAgICAgICBzb3VyY2UgIT0gQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFKSkgeworICAgICAgICBBTE9HRSgiYWRkU291cmNlRGVmYXVsdEVmZmVjdCgpOiBVbnN1cHBvcnRlZCBzb3VyY2UgdHlwZSAlZCIsIHNvdXJjZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gQ2hlY2sgdGhhdCB8dXVpZHwgb3IgfHR5cGV8IGNvcnJlc3BvbmRzIHRvIGFuIGVmZmVjdCBvbiB0aGUgc3lzdGVtLgorICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzY3JpcHRvciA9IHt9OworICAgIHN0YXR1c190IHJlcyA9IEF1ZGlvRWZmZWN0OjpnZXRFZmZlY3REZXNjcmlwdG9yKAorICAgICAgICAgICAgdXVpZCwgdHlwZSwgRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQywgJmRlc2NyaXB0b3IpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImFkZFNvdXJjZURlZmF1bHRFZmZlY3QoKTogRmFpbGVkIHRvIGZpbmQgZWZmZWN0IGRlc2NyaXB0b3IgbWF0Y2hpbmcgdXVpZC90eXBlLiIpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8vIE9ubHkgcHJlLXByb2Nlc3NpbmcgZWZmZWN0cyBjYW4gYmUgYWRkZWQgZHluYW1pY2FsbHkgYXMgc291cmNlIGRlZmF1bHRzLgorICAgIGlmICgoZGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgIT0gRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQykgeworICAgICAgICBBTE9HRSgiYWRkU291cmNlRGVmYXVsdEVmZmVjdCgpOiBEZXNpcmVkIGVmZmVjdCBjYW5ub3QgYmUgYXR0YWNoZWQgIgorICAgICAgICAgICAgICAiYXMgYSBzb3VyY2UgZGVmYXVsdCBlZmZlY3QuIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIC8vIEZpbmQgdGhlIEVmZmVjdERlc2NWZWN0b3IgZm9yIHRoZSBnaXZlbiBzb3VyY2UgdHlwZSwgb3IgY3JlYXRlIGEgbmV3IG9uZSBpZiBuZWNlc3NhcnkuCisgICAgc3NpemVfdCBpbmRleCA9IG1JbnB1dFNvdXJjZXMuaW5kZXhPZktleShzb3VyY2UpOworICAgIEVmZmVjdERlc2NWZWN0b3IgKmRlc2MgPSBOVUxMOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgLy8gTm8gZWZmZWN0cyBmb3IgdGhpcyBzb3VyY2UgdHlwZSB5ZXQuCisgICAgICAgIGRlc2MgPSBuZXcgRWZmZWN0RGVzY1ZlY3RvcigpOworICAgICAgICBtSW5wdXRTb3VyY2VzLmFkZChzb3VyY2UsIGRlc2MpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRlc2MgPSBtSW5wdXRTb3VyY2VzLnZhbHVlQXQoaW5kZXgpOworICAgIH0KKworICAgIC8vIENyZWF0ZSBhIG5ldyBlZmZlY3QgYW5kIGFkZCBpdCB0byB0aGUgdmVjdG9yLgorICAgIHJlcyA9IEF1ZGlvRWZmZWN0OjpuZXdFZmZlY3RVbmlxdWVJZChpZCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiYWRkU291cmNlRGVmYXVsdEVmZmVjdCgpOiBmYWlsZWQgdG8gZ2V0IG5ldyB1bmlxdWUgaWQuIik7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIEVmZmVjdERlc2MgKmVmZmVjdCA9IG5ldyBFZmZlY3REZXNjKAorICAgICAgICAgICAgZGVzY3JpcHRvci5uYW1lLCAqdHlwZSwgb3BQYWNrYWdlTmFtZSwgKnV1aWQsIHByaW9yaXR5LCAqaWQpOworICAgIGRlc2MtPm1FZmZlY3RzLmFkZChlZmZlY3QpOworICAgIC8vIFRPRE8oYi83MTgxMzY5Nyk6IFN1cHBvcnQgc2V0dGluZyBwYXJhbXMgYXMgd2VsbC4KKworICAgIC8vIFRPRE8oYi83MTgxNDMwMCk6IFJldHJvYWN0aXZlbHkgYXR0YWNoIHRvIGFueSBleGlzdGluZyBzb3VyY2VzIG9mIHRoZSBnaXZlbiB0eXBlLgorICAgIC8vIFRoaXMgcmVxdWlyZXMgdHJhY2tpbmcgdGhlIHNvdXJjZSB0eXBlIG9mIGVhY2ggc2Vzc2lvbiBpZCBpbiBhZGRpdGlvbiB0byB3aGF0IGlzCisgICAgLy8gYWxyZWFkeSBiZWluZyB0cmFja2VkLgorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeUVmZmVjdHM6OmFkZFN0cmVhbURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpCit7CisgICAgaWYgKHV1aWQgPT0gTlVMTCB8fCB0eXBlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoImFkZFN0cmVhbURlZmF1bHRFZmZlY3QoKTogTnVsbCB1dWlkIG9yIHR5cGUgdXVpZCBwb2ludGVyIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gQXVkaW9TeXN0ZW06OmF0dHJpYnV0ZXNUb1N0cmVhbVR5cGUoYXR0cmlidXRlc19pbml0aWFsaXplcih1c2FnZSkpOworCisgICAgaWYgKHN0cmVhbSA8IEFVRElPX1NUUkVBTV9NSU4gfHwgc3RyZWFtID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7CisgICAgICAgIEFMT0dFKCJhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KCk6IFVuc3VwcG9ydGVkIHN0cmVhbSB0eXBlICVkIiwgc3RyZWFtKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBDaGVjayB0aGF0IHx1dWlkfCBvciB8dHlwZXwgY29ycmVzcG9uZHMgdG8gYW4gZWZmZWN0IG9uIHRoZSBzeXN0ZW0uCisgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjcmlwdG9yID0ge307CisgICAgc3RhdHVzX3QgcmVzID0gQXVkaW9FZmZlY3Q6OmdldEVmZmVjdERlc2NyaXB0b3IoCisgICAgICAgICAgICB1dWlkLCB0eXBlLCBFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCwgJmRlc2NyaXB0b3IpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImFkZFN0cmVhbURlZmF1bHRFZmZlY3QoKTogRmFpbGVkIHRvIGZpbmQgZWZmZWN0IGRlc2NyaXB0b3IgbWF0Y2hpbmcgdXVpZC90eXBlLiIpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8vIE9ubHkgaW5zZXJ0IGVmZmVjdHMgY2FuIGJlIGFkZGVkIGR5bmFtaWNhbGx5IGFzIHN0cmVhbSBkZWZhdWx0cy4KKyAgICBpZiAoKGRlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spICE9IEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUKSB7CisgICAgICAgIEFMT0dFKCJhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KCk6IERlc2lyZWQgZWZmZWN0IGNhbm5vdCBiZSBhdHRhY2hlZCAiCisgICAgICAgICAgICAgICJhcyBhIHN0cmVhbSBkZWZhdWx0IGVmZmVjdC4iKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgLy8gRmluZCB0aGUgRWZmZWN0RGVzY1ZlY3RvciBmb3IgdGhlIGdpdmVuIHN0cmVhbSB0eXBlLCBvciBjcmVhdGUgYSBuZXcgb25lIGlmIG5lY2Vzc2FyeS4KKyAgICBzc2l6ZV90IGluZGV4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShzdHJlYW0pOworICAgIEVmZmVjdERlc2NWZWN0b3IgKmRlc2MgPSBOVUxMOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgLy8gTm8gZWZmZWN0cyBmb3IgdGhpcyBzdHJlYW0gdHlwZSB5ZXQuCisgICAgICAgIGRlc2MgPSBuZXcgRWZmZWN0RGVzY1ZlY3RvcigpOworICAgICAgICBtT3V0cHV0U3RyZWFtcy5hZGQoc3RyZWFtLCBkZXNjKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXNjID0gbU91dHB1dFN0cmVhbXMudmFsdWVBdChpbmRleCk7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGEgbmV3IGVmZmVjdCBhbmQgYWRkIGl0IHRvIHRoZSB2ZWN0b3IuCisgICAgcmVzID0gQXVkaW9FZmZlY3Q6Om5ld0VmZmVjdFVuaXF1ZUlkKGlkKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KCk6IGZhaWxlZCB0byBnZXQgbmV3IHVuaXF1ZSBpZC4iKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgRWZmZWN0RGVzYyAqZWZmZWN0ID0gbmV3IEVmZmVjdERlc2MoCisgICAgICAgICAgICBkZXNjcmlwdG9yLm5hbWUsICp0eXBlLCBvcFBhY2thZ2VOYW1lLCAqdXVpZCwgcHJpb3JpdHksICppZCk7CisgICAgZGVzYy0+bUVmZmVjdHMuYWRkKGVmZmVjdCk7CisgICAgLy8gVE9ETyhiLzcxODEzNjk3KTogU3VwcG9ydCBzZXR0aW5nIHBhcmFtcyBhcyB3ZWxsLgorCisgICAgLy8gVE9ETyhiLzcxODE0MzAwKTogUmV0cm9hY3RpdmVseSBhdHRhY2ggdG8gYW55IGV4aXN0aW5nIHN0cmVhbXMgb2YgdGhlIGdpdmVuIHR5cGUuCisgICAgLy8gVGhpcyByZXF1aXJlcyB0cmFja2luZyB0aGUgc3RyZWFtIHR5cGUgb2YgZWFjaCBzZXNzaW9uIGlkIGluIGFkZGl0aW9uIHRvIHdoYXQgaXMKKyAgICAvLyBhbHJlYWR5IGJlaW5nIHRyYWNrZWQuCisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6cmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkKK3sKKyAgICBpZiAoaWQgPT0gQVVESU9fVU5JUVVFX0lEX0FMTE9DQVRFKSB7CisgICAgICAgIC8vIEFMTE9DQVRFIGlzIG5vdCBhIHVuaXF1ZSBpZGVudGlmaWVyLCBidXQgcmF0aGVyIGEgcmVzZXJ2ZWQgdmFsdWUgaW5kaWNhdGluZworICAgICAgICAvLyBhIHJlYWwgaWQgaGFzIG5vdCBiZWVuIGFzc2lnbmVkLiBGb3IgZGVmYXVsdCBlZmZlY3RzLCB0aGlzIHZhbHVlIGlzIG9ubHkgdXNlZAorICAgICAgICAvLyBieSBzeXN0ZW0tb3duZWQgZGVmYXVsdHMgZnJvbSB0aGUgbG9hZGVkIGNvbmZpZywgd2hpY2ggY2Fubm90IGJlIHJlbW92ZWQuCisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIC8vIENoZWNrIGVhY2ggc291cmNlIHR5cGUuCisgICAgc2l6ZV90IG51bVNvdXJjZXMgPSBtSW5wdXRTb3VyY2VzLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVNvdXJjZXM7ICsraSkgeworICAgICAgICAvLyBDaGVjayBlYWNoIGVmZmVjdCBmb3IgZWFjaCBzb3VyY2UuCisgICAgICAgIEVmZmVjdERlc2NWZWN0b3IqIGRlc2NWZWN0b3IgPSBtSW5wdXRTb3VyY2VzW2ldOworICAgICAgICBmb3IgKGF1dG8gZGVzYyA9IGRlc2NWZWN0b3ItPm1FZmZlY3RzLmJlZ2luKCk7IGRlc2MgIT0gZGVzY1ZlY3Rvci0+bUVmZmVjdHMuZW5kKCk7ICsrZGVzYykgeworICAgICAgICAgICAgaWYgKCgqZGVzYyktPm1JZCA9PSBpZCkgeworICAgICAgICAgICAgICAgIC8vIEZvdW5kIGl0IQorICAgICAgICAgICAgICAgIC8vIFRPRE8oYi83MTgxNDMwMCk6IFJlbW92ZSBmcm9tIGFueSBzb3VyY2VzIHRoZSBlZmZlY3Qgd2FzIGF0dGFjaGVkIHRvLgorICAgICAgICAgICAgICAgIGRlc2NWZWN0b3ItPm1FZmZlY3RzLmVyYXNlKGRlc2MpOworICAgICAgICAgICAgICAgIC8vIEhhbmRsZXMgYXJlIHVuaXF1ZTsgdGhlcmUgY2FuIG9ubHkgYmUgb25lIG1hdGNoLCBzbyByZXR1cm4gZWFybHkuCisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gRWZmZWN0IHdhc24ndCBmb3VuZCwgc28gaXQncyBiZWVuIHRyaXZpYWxseSByZW1vdmVkIHN1Y2Nlc3NmdWxseS4KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5RWZmZWN0czo6cmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkKK3sKKyAgICBpZiAoaWQgPT0gQVVESU9fVU5JUVVFX0lEX0FMTE9DQVRFKSB7CisgICAgICAgIC8vIEFMTE9DQVRFIGlzIG5vdCBhIHVuaXF1ZSBpZGVudGlmaWVyLCBidXQgcmF0aGVyIGEgcmVzZXJ2ZWQgdmFsdWUgaW5kaWNhdGluZworICAgICAgICAvLyBhIHJlYWwgaWQgaGFzIG5vdCBiZWVuIGFzc2lnbmVkLiBGb3IgZGVmYXVsdCBlZmZlY3RzLCB0aGlzIHZhbHVlIGlzIG9ubHkgdXNlZAorICAgICAgICAvLyBieSBzeXN0ZW0tb3duZWQgZGVmYXVsdHMgZnJvbSB0aGUgbG9hZGVkIGNvbmZpZywgd2hpY2ggY2Fubm90IGJlIHJlbW92ZWQuCisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIC8vIENoZWNrIGVhY2ggc3RyZWFtIHR5cGUuCisgICAgc2l6ZV90IG51bVN0cmVhbXMgPSBtT3V0cHV0U3RyZWFtcy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TdHJlYW1zOyArK2kpIHsKKyAgICAgICAgLy8gQ2hlY2sgZWFjaCBlZmZlY3QgZm9yIGVhY2ggc3RyZWFtLgorICAgICAgICBFZmZlY3REZXNjVmVjdG9yKiBkZXNjVmVjdG9yID0gbU91dHB1dFN0cmVhbXNbaV07CisgICAgICAgIGZvciAoYXV0byBkZXNjID0gZGVzY1ZlY3Rvci0+bUVmZmVjdHMuYmVnaW4oKTsgZGVzYyAhPSBkZXNjVmVjdG9yLT5tRWZmZWN0cy5lbmQoKTsgKytkZXNjKSB7CisgICAgICAgICAgICBpZiAoKCpkZXNjKS0+bUlkID09IGlkKSB7CisgICAgICAgICAgICAgICAgLy8gRm91bmQgaXQhCisgICAgICAgICAgICAgICAgLy8gVE9ETyhiLzcxODE0MzAwKTogUmVtb3ZlIGZyb20gYW55IHN0cmVhbXMgdGhlIGVmZmVjdCB3YXMgYXR0YWNoZWQgdG8uCisgICAgICAgICAgICAgICAgZGVzY1ZlY3Rvci0+bUVmZmVjdHMuZXJhc2UoZGVzYyk7CisgICAgICAgICAgICAgICAgLy8gSGFuZGxlcyBhcmUgdW5pcXVlOyB0aGVyZSBjYW4gb25seSBiZSBvbmUgbWF0Y2gsIHNvIHJldHVybiBlYXJseS4KKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBFZmZlY3Qgd2Fzbid0IGZvdW5kLCBzbyBpdCdzIGJlZW4gdHJpdmlhbGx5IHJlbW92ZWQgc3VjY2Vzc2Z1bGx5LgorICAgIHJldHVybiBOT19FUlJPUjsKK30KIAogdm9pZCBBdWRpb1BvbGljeUVmZmVjdHM6OkVmZmVjdFZlY3Rvcjo6c2V0UHJvY2Vzc29yRW5hYmxlZChib29sIGVuYWJsZWQpCiB7CkBAIC0zMzgsNyArNTMzLDggQEAKICAgICBDQU1DT1JERVJfU1JDX1RBRywKICAgICBWT0lDRV9SRUNfU1JDX1RBRywKICAgICBWT0lDRV9DT01NX1NSQ19UQUcsCi0gICAgVU5QUk9DRVNTRURfU1JDX1RBRworICAgIFVOUFJPQ0VTU0VEX1NSQ19UQUcsCisgICAgVk9JQ0VfUEVSRk9STUFOQ0VfU1JDX1RBRwogfTsKIAogLy8gcmV0dXJucyB0aGUgYXVkaW9fc291cmNlX3QgZW51bSBjb3JyZXNwb25kaW5nIHRvIHRoZSBpbnB1dCBzb3VyY2UgbmFtZSBvcgpAQCAtNDYwLDEyICs2NTYsMTMgQEAKICAgICAgICAgbGVuID0gc3Rybmxlbihub2RlLT52YWx1ZSwgRUZGRUNUX1NUUklOR19MRU5fTUFYKTsKICAgICAgICAgaWYgKCpjdXJTaXplICsgbGVuICsgMSA+ICp0b3RTaXplKSB7CiAgICAgICAgICAgICAqdG90U2l6ZSA9ICpjdXJTaXplICsgbGVuICsgMTsKLSAgICAgICAgICAgICpwYXJhbSA9IChjaGFyICopcmVhbGxvYygqcGFyYW0sICp0b3RTaXplKTsKLSAgICAgICAgICAgIGlmICgqcGFyYW0gPT0gTlVMTCkgeworICAgICAgICAgICAgY2hhciAqbmV3UGFyYW0gPSAoY2hhciAqKXJlYWxsb2MoKnBhcmFtLCAqdG90U2l6ZSk7CisgICAgICAgICAgICBpZiAobmV3UGFyYW0gPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGxlbiA9IDA7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzIHJlYWxsb2MgZXJyb3IgZm9yIHN0cmluZyBsZW4gJXp1IiwgX19mdW5jX18sICp0b3RTaXplKTsKICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAqcGFyYW0gPSBuZXdQYXJhbTsKICAgICAgICAgfQogICAgICAgICBzdHJuY3B5KCpwYXJhbSArICpjdXJTaXplLCBub2RlLT52YWx1ZSwgbGVuKTsKICAgICAgICAgKmN1clNpemUgKz0gbGVuOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmgKaW5kZXggNjIzMTgwZS4uZGNmMDkzYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5oCkBAIC02NCw3ICs2NCw2IEBACiAgICAgc3RhdHVzX3QgcmVsZWFzZUlucHV0RWZmZWN0cyhhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24pOwogCi0KICAgICAvLyBSZXR1cm4gYSBsaXN0IG9mIGVmZmVjdCBkZXNjcmlwdG9ycyBmb3IgZGVmYXVsdCBvdXRwdXQgZWZmZWN0cwogICAgIC8vIGFzc29jaWF0ZWQgd2l0aCBhdWRpb1Nlc3Npb24KICAgICBzdGF0dXNfdCBxdWVyeURlZmF1bHRPdXRwdXRTZXNzaW9uRWZmZWN0cyhhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uLApAQCAtODIsMTggKzgxLDYwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uKTsKIAorICAgIC8vIEFkZCB0aGUgZWZmZWN0IHRvIHRoZSBsaXN0IG9mIGRlZmF1bHQgZWZmZWN0cyBmb3Igc291cmNlcyBvZiB0eXBlIHxzb3VyY2V8LgorICAgIHN0YXR1c190IGFkZFNvdXJjZURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpOworCisgICAgLy8gQWRkIHRoZSBlZmZlY3QgdG8gdGhlIGxpc3Qgb2YgZGVmYXVsdCBlZmZlY3RzIGZvciBzdHJlYW1zIG9mIGEgZ2l2ZW4gdXNhZ2UuCisgICAgc3RhdHVzX3QgYWRkU3RyZWFtRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpOworCisgICAgLy8gUmVtb3ZlIHRoZSBkZWZhdWx0IHNvdXJjZSBlZmZlY3QgZnJvbSB3aGVyZXZlciBpdCdzIGF0dGFjaGVkLgorICAgIHN0YXR1c190IHJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpOworCisgICAgLy8gUmVtb3ZlIHRoZSBkZWZhdWx0IHN0cmVhbSBlZmZlY3QgZnJvbSB3aGVyZXZlciBpdCdzIGF0dGFjaGVkLgorICAgIHN0YXR1c190IHJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpOworCiBwcml2YXRlOgogCiAgICAgLy8gY2xhc3MgdG8gc3RvcmUgdGhlIGRlc2NyaXB0aW9uIG9mIGFuIGVmZmVjdHMgYW5kIGl0cyBwYXJhbWV0ZXJzCiAgICAgLy8gYXMgZGVmaW5lZCBpbiBhdWRpb19lZmZlY3RzLmNvbmYKICAgICBjbGFzcyBFZmZlY3REZXNjIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIEVmZmVjdERlc2MoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgZWZmZWN0X3V1aWRfdCYgdXVpZCkgOgorICAgICAgICBFZmZlY3REZXNjKGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCYgdHlwZVV1aWQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCYgdXVpZCwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCBpZCkgOgogICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUoc3RyZHVwKG5hbWUpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VdWlkKHV1aWQpIHsgfQorICAgICAgICAgICAgICAgICAgICAgICAgbVR5cGVVdWlkKHR5cGVVdWlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1PcFBhY2thZ2VOYW1lKG9wUGFja2FnZU5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgbVV1aWQodXVpZCksCisgICAgICAgICAgICAgICAgICAgICAgICBtUHJpb3JpdHkocHJpb3JpdHkpLAorICAgICAgICAgICAgICAgICAgICAgICAgbUlkKGlkKSB7IH0KKyAgICAgICAgRWZmZWN0RGVzYyhjb25zdCBjaGFyICpuYW1lLCBjb25zdCBlZmZlY3RfdXVpZF90JiB1dWlkKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3REZXNjKG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpFRkZFQ1RfVVVJRF9OVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNigiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1VOSVFVRV9JRF9BTExPQ0FURSkgeyB9CiAgICAgICAgIEVmZmVjdERlc2MoY29uc3QgRWZmZWN0RGVzYyYgb3JpZykgOgogICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUoc3RyZHVwKG9yaWcubU5hbWUpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1VdWlkKG9yaWcubVV1aWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1UeXBlVXVpZChvcmlnLm1UeXBlVXVpZCksCisgICAgICAgICAgICAgICAgICAgICAgICBtT3BQYWNrYWdlTmFtZShvcmlnLm1PcFBhY2thZ2VOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1VdWlkKG9yaWcubVV1aWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgbVByaW9yaXR5KG9yaWcubVByaW9yaXR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JZChvcmlnLm1JZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZXAgY29weSBtUGFyYW1zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgayA9IDA7IGsgPCBvcmlnLm1QYXJhbXMuc2l6ZSgpOyBrKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X3BhcmFtX3QgKm9yaWdQYXJhbSA9IG9yaWcubVBhcmFtc1trXTsKQEAgLTExNiw3ICsxNTcsMTEgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBjaGFyICptTmFtZTsKKyAgICAgICAgZWZmZWN0X3V1aWRfdCBtVHlwZVV1aWQ7CisgICAgICAgIFN0cmluZzE2IG1PcFBhY2thZ2VOYW1lOwogICAgICAgICBlZmZlY3RfdXVpZF90IG1VdWlkOworICAgICAgICBpbnQzMl90IG1Qcmlvcml0eTsKKyAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgbUlkOwogICAgICAgICBWZWN0b3IgPGVmZmVjdF9wYXJhbV90ICo+IG1QYXJhbXM7CiAgICAgfTsKIApAQCAtMTgwLDYgKzIyNSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICp0b3RTaXplKTsKIAogICAgIC8vIHByb3RlY3RzIGFjY2VzcyB0byBtSW5wdXRTb3VyY2VzLCBtSW5wdXRTZXNzaW9ucywgbU91dHB1dFN0cmVhbXMsIG1PdXRwdXRTZXNzaW9ucworICAgIC8vIG5ldmVyIGhvbGQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjptTG9jayB3aGVuIGNhbGxpbmcgQXVkaW9Qb2xpY3lFZmZlY3RzIG1ldGhvZHMgYXMKKyAgICAvLyB0aG9zZSBjYW4gY2FsbCBiYWNrIGludG8gQXVkaW9Qb2xpY3lTZXJ2aWNlIG1ldGhvZHMgYW5kIHRyeSB0byBhY3F1aXJlIHRoZSBtdXRleAogICAgIE11dGV4IG1Mb2NrOwogICAgIC8vIEF1dG9tYXRpYyBpbnB1dCBlZmZlY3RzIGFyZSBjb25maWd1cmVkIHBlciBhdWRpb19zb3VyY2VfdAogICAgIEtleWVkVmVjdG9yPCBhdWRpb19zb3VyY2VfdCwgRWZmZWN0RGVzY1ZlY3RvciogPiBtSW5wdXRTb3VyY2VzOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwCmluZGV4IDczMzdmMDQuLmIwYTg1NDEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKQEAgLTE3LDEyICsxNywxMSBAQAogI2RlZmluZSBMT0dfVEFHICJBdWRpb1BvbGljeUludGVmYWNlSW1wbCIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgotCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lTZXJ2aWNlLmgiCi0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgogI2luY2x1ZGUgIlR5cGVDb252ZXJ0ZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTMyLDcgKzMxLDggQEAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpAQCAtNDksNyArNDksNyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lLCBlbmNvZGVkRm9ybWF0KTsKIH0KIAogYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKApAQCAtNjYsNyArNjYsOCBAQAogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC03OSw3ICs4MCw3IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5oYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoZGV2aWNlLCBkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9uYW1lLCBlbmNvZGVkRm9ybWF0KTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKQEAgLTE2NSw3ICsxNjYsNyBAQAogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRPdXRwdXQoc3RyZWFtKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0T3V0cHV0Rm9yQXR0cihhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCkBAIC0xNzQsNyArMTc1LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gKnNlY29uZGFyeU91dHB1dHMpCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTE4MywxNiArMTg1LDIzIEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAogICAgIGNvbnN0IHVpZF90IGNhbGxpbmdVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgaWYgKCFpc1RydXN0ZWRDYWxsaW5nVWlkKGNhbGxpbmdVaWQpIHx8IHVpZCA9PSAodWlkX3QpLTEpIHsKKyAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKGNhbGxpbmdVaWQpIHx8IHVpZCA9PSAodWlkX3QpLTEpIHsKICAgICAgICAgQUxPR1dfSUYodWlkICE9ICh1aWRfdCktMSAmJiB1aWQgIT0gY2FsbGluZ1VpZCwKICAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyAlZCIsIF9fRlVOQ1RJT05fXywgY2FsbGluZ1VpZCwgdWlkKTsKICAgICAgICAgdWlkID0gY2FsbGluZ1VpZDsKICAgICB9CisgICAgaWYgKCFtUGFja2FnZU1hbmFnZXIuYWxsb3dQbGF5YmFja0NhcHR1cmUodWlkKSkgeworICAgICAgICBhdHRyLT5mbGFncyB8PSBBVURJT19GTEFHX05PX01FRElBX1BST0pFQ1RJT047CisgICAgfQorICAgIGlmICghYnlwYXNzSW50ZXJydXB0aW9uUG9saWN5QWxsb3dlZChwaWQsIHVpZCkpIHsKKyAgICAgICAgYXR0ci0+ZmxhZ3MgJj0gfihBVURJT19GTEFHX0JZUEFTU19JTlRFUlJVUFRJT05fUE9MSUNZfEFVRElPX0ZMQUdfQllQQVNTX01VVEUpOworICAgIH0KICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBvcmlnaW5hbEZsYWdzID0gZmxhZ3M7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRPdXRwdXRGb3JBdHRyKGF0dHIsIG91dHB1dCwgc2Vzc2lvbiwgc3RyZWFtLCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwgcG9ydElkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlPdXRwdXRzKTsKIAogICAgIC8vIEZJWE1FOiBJbnRyb2R1Y2UgYSB3YXkgdG8gY2hlY2sgZm9yIHRoZSB0aGUgdGVsZXBob255IGRldmljZSBiZWZvcmUgb3BlbmluZyB0aGUgb3V0cHV0CiAgICAgaWYgKChyZXN1bHQgPT0gTk9fRVJST1IpICYmCkBAIC0yMDAsMTA1ICsyMDksMTM0IEBACiAgICAgICAgICFtb2RpZnlQaG9uZVN0YXRlQWxsb3dlZChwaWQsIHVpZCkpIHsKICAgICAgICAgLy8gSWYgdGhlIGFwcCB0cmllcyB0byBwbGF5IG11c2ljIHRocm91Z2ggdGhlIHRlbGVwaG9ueSBkZXZpY2UgYW5kIGRvZXNuJ3QgaGF2ZSBwZXJtaXNzaW9uCiAgICAgICAgIC8vIHRoZSBmYWxsYmFjayB0byB0aGUgZGVmYXVsdCBvdXRwdXQgZGV2aWNlLgotICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlT3V0cHV0KCpvdXRwdXQsICpzdHJlYW0sIHNlc3Npb24pOworICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlT3V0cHV0KCpwb3J0SWQpOwogICAgICAgICBmbGFncyA9IG9yaWdpbmFsRmxhZ3M7CiAgICAgICAgICpzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKICAgICAgICAgKnBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7Ci0gICAgICAgIHJlc3VsdCA9IG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE91dHB1dEZvckF0dHIoYXR0ciwgb3V0cHV0LCBzZXNzaW9uLCBzdHJlYW0sIHVpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQpOworICAgICAgICBzZWNvbmRhcnlPdXRwdXRzLT5jbGVhcigpOworICAgICAgICByZXN1bHQgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRPdXRwdXRGb3JBdHRyKGF0dHIsIG91dHB1dCwgc2Vzc2lvbiwgc3RyZWFtLCB1aWQsIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlPdXRwdXRzKTsKKyAgICB9CisKKyAgICBpZiAocmVzdWx0ID09IE5PX0VSUk9SKSB7CisgICAgICAgIHNwIDxBdWRpb1BsYXliYWNrQ2xpZW50PiBjbGllbnQgPQorICAgICAgICAgICAgbmV3IEF1ZGlvUGxheWJhY2tDbGllbnQoKmF0dHIsICpvdXRwdXQsIHVpZCwgcGlkLCBzZXNzaW9uLCAqc2VsZWN0ZWREZXZpY2VJZCwgKnN0cmVhbSk7CisgICAgICAgIG1BdWRpb1BsYXliYWNrQ2xpZW50cy5hZGQoKnBvcnRJZCwgY2xpZW50KTsKICAgICB9CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRQbGF5YmFja0NsaWVudEFuZEVmZmVjdHMoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvUGxheWJhY2tDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz4mIGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbnRleHQpCiB7Ci0gICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgY29uc3Qgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BsYXliYWNrQ2xpZW50cy5pbmRleE9mS2V5KHBvcnRJZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HRSgiJXMgQXVkaW9UcmFjayBjbGllbnQgbm90IGZvdW5kIGZvciBwb3J0SWQgJWQiLCBjb250ZXh0LCBwb3J0SWQpOworICAgICAgICByZXR1cm47CiAgICAgfQorICAgIGNsaWVudCA9IG1BdWRpb1BsYXliYWNrQ2xpZW50cy52YWx1ZUF0KGluZGV4KTsKKyAgICBlZmZlY3RzID0gbUF1ZGlvUG9saWN5RWZmZWN0czsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKK3sKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBBTE9HVigic3RhcnRPdXRwdXQoKSIpOworICAgIHNwPEF1ZGlvUGxheWJhY2tDbGllbnQ+IGNsaWVudDsKICAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgYXVkaW9Qb2xpY3lFZmZlY3RzID0gbUF1ZGlvUG9saWN5RWZmZWN0czsKLSAgICB9CisKKyAgICBnZXRQbGF5YmFja0NsaWVudEFuZEVmZmVjdHMocG9ydElkLCBjbGllbnQsIGF1ZGlvUG9saWN5RWZmZWN0cywgX19mdW5jX18pOworCiAgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyAhPSAwKSB7CiAgICAgICAgIC8vIGNyZWF0ZSBhdWRpbyBwcm9jZXNzb3JzIGFjY29yZGluZyB0byBzdHJlYW0KLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5hZGRPdXRwdXRTZXNzaW9uRWZmZWN0cyhvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+YWRkT3V0cHV0U2Vzc2lvbkVmZmVjdHMoCisgICAgICAgICAgICBjbGllbnQtPmlvLCBjbGllbnQtPnN0cmVhbSwgY2xpZW50LT5zZXNzaW9uKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKLSAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gYWRkIGVmZmVjdHMgb24gc2Vzc2lvbiAlZCIsIHNlc3Npb24pOworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBhZGQgZWZmZWN0cyBvbiBzZXNzaW9uICVkIiwgY2xpZW50LT5zZXNzaW9uKTsKICAgICAgICAgfQogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0YXJ0T3V0cHV0KG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdGFydE91dHB1dChwb3J0SWQpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgY2xpZW50LT5hY3RpdmUgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9DTlQpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgQUxPR1YoInN0b3BPdXRwdXQoKSIpOwotICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5zdG9wT3V0cHV0Q29tbWFuZChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnN0b3BPdXRwdXRDb21tYW5kKHBvcnRJZCk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb1N0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCitzdGF0dXNfdCAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb1N0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgQUxPR1YoImRvU3RvcE91dHB1dCBmcm9tIHRpZCAlZCIsIGdldHRpZCgpKTsKKyAgICBBTE9HVigiZG9TdG9wT3V0cHV0Iik7CisgICAgc3A8QXVkaW9QbGF5YmFja0NsaWVudD4gY2xpZW50OwogICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOwotICAgIH0KKworICAgIGdldFBsYXliYWNrQ2xpZW50QW5kRWZmZWN0cyhwb3J0SWQsIGNsaWVudCwgYXVkaW9Qb2xpY3lFZmZlY3RzLCBfX2Z1bmNfXyk7CisKICAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzICE9IDApIHsKICAgICAgICAgLy8gcmVsZWFzZSBhdWRpbyBwcm9jZXNzb3JzIGZyb20gdGhlIHN0cmVhbQotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPnJlbGVhc2VPdXRwdXRTZXNzaW9uRWZmZWN0cyhvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVsZWFzZU91dHB1dFNlc3Npb25FZmZlY3RzKAorICAgICAgICAgICAgY2xpZW50LT5pbywgY2xpZW50LT5zdHJlYW0sIGNsaWVudC0+c2Vzc2lvbik7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7Ci0gICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIHJlbGVhc2UgZWZmZWN0cyBvbiBzZXNzaW9uICVkIiwgc2Vzc2lvbik7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIHJlbGVhc2UgZWZmZWN0cyBvbiBzZXNzaW9uICVkIiwgY2xpZW50LT5zZXNzaW9uKTsKICAgICAgICAgfQogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BPdXRwdXQocG9ydElkKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIGNsaWVudC0+YWN0aXZlID0gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgQUxPR1YoInJlbGVhc2VPdXRwdXQoKSIpOwotICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5yZWxlYXNlT3V0cHV0Q29tbWFuZChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnJlbGVhc2VPdXRwdXRDb21tYW5kKHBvcnRJZCk7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb1JlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9SZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIEFMT0dWKCJkb1JlbGVhc2VPdXRwdXQgZnJvbSB0aWQgJWQiLCBnZXR0aWQoKSk7CisgICAgc3A8QXVkaW9QbGF5YmFja0NsaWVudD4gY2xpZW50OworICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz4gYXVkaW9Qb2xpY3lFZmZlY3RzOworCisgICAgZ2V0UGxheWJhY2tDbGllbnRBbmRFZmZlY3RzKHBvcnRJZCwgY2xpZW50LCBhdWRpb1BvbGljeUVmZmVjdHMsIF9fZnVuY19fKTsKKworICAgIGlmIChhdWRpb1BvbGljeUVmZmVjdHMgIT0gMCAmJiBjbGllbnQtPmFjdGl2ZSkgeworICAgICAgICAvLyBjbGVhbiB1cCBlZmZlY3RzIGlmIG91dHB1dCB3YXMgbm90IHN0b3BwZWQgYmVmb3JlIGJlaW5nIHJlbGVhc2VkCisgICAgICAgIGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVsZWFzZU91dHB1dFNlc3Npb25FZmZlY3RzKAorICAgICAgICAgICAgY2xpZW50LT5pbywgY2xpZW50LT5zdHJlYW0sIGNsaWVudC0+c2Vzc2lvbik7CisgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbUF1ZGlvUGxheWJhY2tDbGllbnRzLnJlbW92ZUl0ZW0ocG9ydElkKTsKKwogICAgIC8vIGNhbGxlZCBmcm9tIGludGVybmFsIHRocmVhZDogbm8gbmVlZCB0byBjbGVhciBjYWxsZXIgaWRlbnRpdHkKLSAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlT3V0cHV0KG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlT3V0cHV0KHBvcnRJZCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKQEAgLTMxMywxNCArMzUxLDE3IEBACiAgICAgfQogCiAgICAgLy8gYWxyZWFkeSBjaGVja2VkIGJ5IGNsaWVudCwgYnV0IGRvdWJsZS1jaGVjayBpbiBjYXNlIHRoZSBjbGllbnQgd3JhcHBlciBpcyBieXBhc3NlZAotICAgIGlmIChhdHRyLT5zb3VyY2UgPCBBVURJT19TT1VSQ0VfREVGQVVMVCAmJiBhdHRyLT5zb3VyY2UgPj0gQVVESU9fU09VUkNFX0NOVCAmJgotICAgICAgICAgICAgYXR0ci0+c291cmNlICE9IEFVRElPX1NPVVJDRV9IT1RXT1JEICYmIGF0dHItPnNvdXJjZSAhPSBBVURJT19TT1VSQ0VfRk1fVFVORVIpIHsKKyAgICBpZiAoKGF0dHItPnNvdXJjZSA8IEFVRElPX1NPVVJDRV9ERUZBVUxUKQorICAgICAgICAgICAgfHwgKGF0dHItPnNvdXJjZSA+PSBBVURJT19TT1VSQ0VfQ05UCisgICAgICAgICAgICAgICAgJiYgYXR0ci0+c291cmNlICE9IEFVRElPX1NPVVJDRV9IT1RXT1JECisgICAgICAgICAgICAgICAgJiYgYXR0ci0+c291cmNlICE9IEFVRElPX1NPVVJDRV9GTV9UVU5FUgorICAgICAgICAgICAgICAgICYmIGF0dHItPnNvdXJjZSAhPSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0UpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgYm9vbCB1cGRhdGVQaWQgPSAocGlkID09IC0xKTsKICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmICghaXNUcnVzdGVkQ2FsbGluZ1VpZChjYWxsaW5nVWlkKSkgeworICAgIGlmICghaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoY2FsbGluZ1VpZCkpIHsKICAgICAgICAgQUxPR1dfSUYodWlkICE9ICh1aWRfdCktMSAmJiB1aWQgIT0gY2FsbGluZ1VpZCwKICAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyAlZCIsIF9fRlVOQ1RJT05fXywgY2FsbGluZ1VpZCwgdWlkKTsKICAgICAgICAgdWlkID0gY2FsbGluZ1VpZDsKQEAgLTM0MiwxNCArMzgzLDE3IEBACiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKKyAgICBib29sIGNhbkNhcHR1cmVPdXRwdXQgPSBjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKHBpZCwgdWlkKTsKICAgICBpZiAoKGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LIHx8CiAgICAgICAgIGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTksgfHwKLSAgICAgICAgYXR0ci0+c291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMKSAmJgotICAgICAgICAhY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZChwaWQsIHVpZCkpIHsKKyAgICAgICAgYXR0ci0+c291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMIHx8CisgICAgICAgIGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0UpICYmCisgICAgICAgICFjYW5DYXB0dXJlT3V0cHV0KSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKLSAgICBpZiAoKGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgJiYgIWNhcHR1cmVIb3R3b3JkQWxsb3dlZChwaWQsIHVpZCkpIHsKKyAgICBib29sIGNhbkNhcHR1cmVIb3R3b3JkID0gY2FwdHVyZUhvdHdvcmRBbGxvd2VkKG9wUGFja2FnZU5hbWUsIHBpZCwgdWlkKTsKKyAgICBpZiAoKGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgJiYgIWNhbkNhcHR1cmVIb3R3b3JkKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC0zNjIsNyArNDA2LDcgQEAKICAgICAgICAgewogICAgICAgICAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICAgICAgICAgIC8vIHRoZSBhdWRpb19pbl9hY291c3RpY3NfdCBwYXJhbWV0ZXIgaXMgaWdub3JlZCBieSBnZXRfaW5wdXQoKQotICAgICAgICAgICAgc3RhdHVzID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0SW5wdXRGb3JBdHRyKGF0dHIsIGlucHV0LCBzZXNzaW9uLCB1aWQsCisgICAgICAgICAgICBzdGF0dXMgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRJbnB1dEZvckF0dHIoYXR0ciwgaW5wdXQsIHJpaWQsIHNlc3Npb24sIHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBzZWxlY3RlZERldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0VHlwZSwgcG9ydElkKTsKQEAgLTM3MiwxMiArNDE2LDE1IEBACiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIC8vIGVuZm9yY2UgcGVybWlzc2lvbiAoaWYgYW55KSByZXF1aXJlZCBmb3IgZWFjaCB0eXBlIG9mIGlucHV0CiAgICAgICAgICAgICBzd2l0Y2ggKGlucHV0VHlwZSkgeworICAgICAgICAgICAgY2FzZSBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX01JWF9QVUJMSUNfQ0FQVFVSRV9QTEFZQkFDSzoKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHVzZSBjYXNlIGhhcyBiZWVuIHZhbGlkYXRlZCBpbiBhdWRpbyBzZXJ2aWNlIHdpdGggYSBNZWRpYVByb2plY3Rpb24gdG9rZW4sCisgICAgICAgICAgICAgICAgLy8gYW5kIGRvZXNuJ3QgcmVseSBvbiByZWd1bGFyIHBlcm1pc3Npb25zCiAgICAgICAgICAgICBjYXNlIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfTEVHQUNZOgogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX1RFTEVQSE9OWV9SWDoKICAgICAgICAgICAgICAgICAvLyBGSVhNRTogdXNlIHRoZSBzYW1lIHBlcm1pc3Npb24gYXMgZm9yIHJlbW90ZSBzdWJtaXggZm9yIG5vdy4KICAgICAgICAgICAgIGNhc2UgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9NSVhfQ0FQVFVSRToKLSAgICAgICAgICAgICAgICBpZiAoIWNhcHR1cmVBdWRpb091dHB1dEFsbG93ZWQocGlkLCB1aWQpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFjYW5DYXB0dXJlT3V0cHV0KSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRJbnB1dEZvckF0dHIoKSBwZXJtaXNzaW9uIGRlbmllZDogY2FwdHVyZSBub3QgYWxsb3dlZCIpOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgICAgICAgICB9CkBAIC0zOTgsMTcgKzQ0NSwxNCBAQAogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFBFUk1JU1NJT05fREVOSUVEKSB7CiAgICAgICAgICAgICAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlSW5wdXQoKmlucHV0LCBzZXNzaW9uKTsKKyAgICAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlSW5wdXQoKnBvcnRJZCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICB9CiAKLSAgICAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGNsaWVudCA9Ci0gICAgICAgICAgICAgICAgbmV3IEF1ZGlvUmVjb3JkQ2xpZW50KCphdHRyLCAqaW5wdXQsIHVpZCwgcGlkLCBvcFBhY2thZ2VOYW1lLCBzZXNzaW9uKTsKLSAgICAgICAgY2xpZW50LT5hY3RpdmUgPSBmYWxzZTsKLSAgICAgICAgY2xpZW50LT5pc0NvbmN1cnJlbnQgPSBmYWxzZTsKLSAgICAgICAgY2xpZW50LT5pc1ZpcnR1YWxEZXZpY2UgPSBmYWxzZTsgLy9UT0RPIDogdXBkYXRlIGZyb20gQVBNLT5nZXRJbnB1dEZvckF0dHIoKQotICAgICAgICBjbGllbnQtPmRldmljZUlkID0gKnNlbGVjdGVkRGV2aWNlSWQ7CisgICAgICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBjbGllbnQgPSBuZXcgQXVkaW9SZWNvcmRDbGllbnQoKmF0dHIsICppbnB1dCwgdWlkLCBwaWQsIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnNlbGVjdGVkRGV2aWNlSWQsIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FuQ2FwdHVyZU91dHB1dCwgY2FuQ2FwdHVyZUhvdHdvcmQpOwogICAgICAgICBtQXVkaW9SZWNvcmRDbGllbnRzLmFkZCgqcG9ydElkLCBjbGllbnQpOwogICAgIH0KIApAQCAtNDIyLDQ4ICs0NjYsMTcgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLS8vIHRoaXMgaXMgcmVwbGljYXRlZCBmcm9tIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwCi0vLyBYWFggLS0gZmlndXJlIG91dCBob3cgdG8gcHV0IGl0IGludG8gYSBjb21tb24sIHNoYXJlZCBsb2NhdGlvbgotCi1zdGF0aWMgc3RkOjpzdHJpbmcgYXVkaW9Tb3VyY2VTdHJpbmcoYXVkaW9fc291cmNlX3QgdmFsdWUpIHsKLSAgICBzdGQ6OnN0cmluZyBzb3VyY2U7Ci0gICAgaWYgKFNvdXJjZVR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKHZhbHVlLCBzb3VyY2UpKSB7Ci0gICAgICAgIHJldHVybiBzb3VyY2U7Ci0gICAgfQotICAgIGNoYXIgcmF3YnVmZmVyWzE2XTsgIC8vIHJvb20gZm9yICIlZCIKLSAgICBzbnByaW50ZihyYXdidWZmZXIsIHNpemVvZihyYXdidWZmZXIpLCAiJWQiLCB2YWx1ZSk7Ci0gICAgcmV0dXJuIHJhd2J1ZmZlcjsKLX0KLQotc3RhdGljIHN0ZDo6c3RyaW5nIGF1ZGlvQ29uY3VycmVuY3lTdHJpbmcoCi0gICAgICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpjb25jdXJyZW5jeV90eXBlX19tYXNrX3QgY29uY3VycmVuY3kpCi17Ci0gICAgY2hhciBidWZmZXJbNjRdOyAvLyBvdmVyc2l6ZWQKLSAgICBpZiAoY29uY3VycmVuY3kgJiBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX0FMTCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiJXMlcyVzJXMiLAotICAgICAgICAgICAgKGNvbmN1cnJlbmN5ICYgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQUxMKT8gIixjYWxsIjoiIiwKLSAgICAgICAgICAgIChjb25jdXJyZW5jeSAmIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FQVFVSRSk/ICIsY2FwdHVyZSI6IiIsCi0gICAgICAgICAgICAoY29uY3VycmVuY3kgJiBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX0hPVFdPUkQpPyAiLGhvdHdvcmQiOiIiLAotICAgICAgICAgICAgKGNvbmN1cnJlbmN5ICYgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9QUkVFTVBUKT8gIixwcmVlbXB0IjoiIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIixub25lIik7Ci0gICAgfQotCi0gICAgcmV0dXJuICZidWZmZXJbMV07Ci19Ci0KIHN0ZDo6c3RyaW5nIEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0RGV2aWNlVHlwZVN0ckZvclBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgewotICAgIHN0ZDo6c3RyaW5nIHR5cGVTdHI7CiAgICAgc3RydWN0IGF1ZGlvX3BvcnQgcG9ydCA9IHt9OwogICAgIHBvcnQuaWQgPSBwb3J0SWQ7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0QXVkaW9Qb3J0KCZwb3J0KTsKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIHBvcnQudHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7Ci0gICAgICAgIGRldmljZVRvU3RyaW5nKHBvcnQuZXh0LmRldmljZS50eXBlLCB0eXBlU3RyKTsKKyAgICAgICAgcmV0dXJuIHRvU3RyaW5nKHBvcnQuZXh0LmRldmljZS50eXBlKTsKICAgICB9Ci0gICAgcmV0dXJuIHR5cGVTdHI7CisgICAgcmV0dXJuIHt9OwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsIGJvb2wgKnNpbGVuY2VkKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC00ODYsMjcgKzQ5OSwyNSBAQAogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQogCi0gICAgLy8gSWYgVUlEIGluYWN0aXZlIGl0IHJlY29yZHMgc2lsZW5jZSB1bnRpbCBiZWNvbWluZyBhY3RpdmUKLSAgICAqc2lsZW5jZWQgPSAhbVVpZFBvbGljeS0+aXNVaWRBY3RpdmUoY2xpZW50LT51aWQpICYmICFjbGllbnQtPmlzVmlydHVhbERldmljZTsKLQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OmNvbmN1cnJlbmN5X3R5cGVfX21hc2tfdCBjb25jdXJyZW5jeSA9Ci0gICAgICAgICAgICBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX05PTkU7CisKKyAgICBjbGllbnQtPmFjdGl2ZSA9IHRydWU7CisgICAgY2xpZW50LT5zdGFydFRpbWVOcyA9IHN5c3RlbVRpbWUoKTsKKyAgICB1cGRhdGVVaWRTdGF0ZXNfbCgpOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgIHsKICAgICAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICAgICAgc3RhdHVzID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRJbnB1dCgKLSAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5pbnB1dCwgY2xpZW50LT5zZXNzaW9uLCAqc2lsZW5jZWQsICZjb25jdXJyZW5jeSk7CisgICAgICAgIHN0YXR1cyA9IG1BdWRpb1BvbGljeU1hbmFnZXItPnN0YXJ0SW5wdXQocG9ydElkKTsKIAogICAgIH0KIAogICAgIC8vIGluY2x1ZGluZyBzdWNjZXNzZXMgZ2V0cyB2ZXJ5IHZlcmJvc2UKKyAgICAvLyBidXQgb25jZSB3ZSBjdXQgb3ZlciB0byB3ZXN0d29ybGQsIGxvZyB0aGVtIGFsbC4KICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAKICAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1BvbGljeVtdID0gImF1ZGlvcG9saWN5IjsKIAotICAgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUG9saWN5UmVhc29uW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5yZWFzb24iOwogICAgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUG9saWN5U3RhdHVzW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5zdGF0dXMiOwogICAgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUG9saWN5UnFzdFNyY1tdID0gImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kucnFzdC5zcmMiOwogICAgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUG9saWN5UnFzdFBrZ1tdID0gImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kucnFzdC5wa2ciOwpAQCAtNTIwLDQyICs1MzEsNDMgQEAKICAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1BvbGljeUFjdGl2ZURldmljZVtdID0KICAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5hY3RpdmUuZGV2aWNlIjsKIAotICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtKGtBdWRpb1BvbGljeSk7CisgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKGtBdWRpb1BvbGljeSk7CiAgICAgICAgIGlmIChpdGVtICE9IE5VTEwpIHsKIAotICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lSZWFzb24sIGF1ZGlvQ29uY3VycmVuY3lTdHJpbmcoY29uY3VycmVuY3kpLmNfc3RyKCkpOwogICAgICAgICAgICAgaXRlbS0+c2V0SW50MzIoa0F1ZGlvUG9saWN5U3RhdHVzLCBzdGF0dXMpOwogCiAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeVJxc3RTcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvU291cmNlU3RyaW5nKGNsaWVudC0+YXR0cmlidXRlcy5zb3VyY2UpLmNfc3RyKCkpOwotICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lScXN0UGtnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhTdHJpbmc4KGNsaWVudC0+b3BQYWNrYWdlTmFtZSkuc3RyaW5nKCkpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1N0cmluZyhjbGllbnQtPmF0dHJpYnV0ZXMuc291cmNlKS5jX3N0cigpKTsKICAgICAgICAgICAgIGl0ZW0tPnNldEludDMyKGtBdWRpb1BvbGljeVJxc3RTZXNzaW9uLCBjbGllbnQtPnNlc3Npb24pOwotCisgICAgICAgICAgICBpZiAoY2xpZW50LT5vcFBhY2thZ2VOYW1lLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lScXN0UGtnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoU3RyaW5nOChjbGllbnQtPm9wUGFja2FnZU5hbWUpLnN0cmluZygpKS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lScXN0UGtnLCBzdGQ6OnRvX3N0cmluZyhjbGllbnQtPnVpZCkuY19zdHIoKSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKAogICAgICAgICAgICAgICAgICAgICBrQXVkaW9Qb2xpY3lScXN0RGV2aWNlLCBnZXREZXZpY2VUeXBlU3RyRm9yUG9ydElkKGNsaWVudC0+ZGV2aWNlSWQpLmNfc3RyKCkpOwogCi0gICAgICAgICAgICAvLyBmaWd1cmUgb3V0IHdobyBpcyBhY3RpdmUKLSAgICAgICAgICAgIC8vIE5COiBtaWdodCB0aGUgb3RoZXIgcGFydHkgaGF2ZSBnaXZlbiB1cCB0aGUgbWljcm9waG9uZSBzaW5jZSB0aGVuPyBob3cgc3VyZS4KLSAgICAgICAgICAgIC8vIHBlcmhhcHMgY291bGQgaGF2ZSBnaXZlbiB1cCBvbiBpdC4KLSAgICAgICAgICAgIC8vIHdlIGhvbGQgbUxvY2ssIHNvIHBlcmhhcHMgd2UncmUgc2FmZSBmb3IgdGhpcyBsb29waW5nCi0gICAgICAgICAgICBpZiAoY29uY3VycmVuY3kgIT0gQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgaW50IGNvdW50ID0gbUF1ZGlvUmVjb3JkQ2xpZW50cy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGk8Y291bnQgOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvcnRJZCA9PSBtQXVkaW9SZWNvcmRDbGllbnRzLmtleUF0KGkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gb3RoZXIgPSBtQXVkaW9SZWNvcmRDbGllbnRzLnZhbHVlQXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvdGhlci0+YWN0aXZlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBrZWVwcyB0aGUgbGFzdCBvZiB0aGUgY2xpZW50cyBtYXJrZWQgYWN0aXZlCi0gICAgICAgICAgICAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeUFjdGl2ZVNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Tb3VyY2VTdHJpbmcob3RoZXItPmF0dHJpYnV0ZXMuc291cmNlKS5jX3N0cigpKTsKKyAgICAgICAgICAgIGludCBjb3VudCA9IG1BdWRpb1JlY29yZENsaWVudHMuc2l6ZSgpOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudCA7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChwb3J0SWQgPT0gbUF1ZGlvUmVjb3JkQ2xpZW50cy5rZXlBdChpKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IG90aGVyID0gbUF1ZGlvUmVjb3JkQ2xpZW50cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgICAgIGlmIChvdGhlci0+YWN0aXZlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGtlZXBzIHRoZSBsYXN0IG9mIHRoZSBjbGllbnRzIG1hcmtlZCBhY3RpdmUKKyAgICAgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lBY3RpdmVTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9TdHJpbmcob3RoZXItPmF0dHJpYnV0ZXMuc291cmNlKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgaXRlbS0+c2V0SW50MzIoa0F1ZGlvUG9saWN5QWN0aXZlU2Vzc2lvbiwgb3RoZXItPnNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICBpZiAob3RoZXItPm9wUGFja2FnZU5hbWUuc2l6ZSgpICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5QWN0aXZlUGtnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKFN0cmluZzgob3RoZXItPm9wUGFja2FnZU5hbWUpLnN0cmluZygpKS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldEludDMyKGtBdWRpb1BvbGljeUFjdGl2ZVNlc3Npb24sIG90aGVyLT5zZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5QWN0aXZlRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VUeXBlU3RyRm9yUG9ydElkKG90aGVyLT5kZXZpY2VJZCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKFN0cmluZzgob3RoZXItPm9wUGFja2FnZU5hbWUpLnN0cmluZygpKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5UnFzdFBrZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp0b19zdHJpbmcob3RoZXItPnVpZCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lBY3RpdmVEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlVHlwZVN0ckZvclBvcnRJZChvdGhlci0+ZGV2aWNlSWQpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGl0ZW0tPnNlbGZyZWNvcmQoKTsKQEAgLTU2NCwyMCArNTc2LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoY29uY3VycmVuY3kgJiB+QXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9BTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YXJ0SW5wdXQoKTogaW52YWxpZCBjb25jdXJyZW5jeSB0eXBlICVkIiwgKGludCljb25jdXJyZW5jeSk7Ci0KLSAgICAgICAgLy8gZW5mb3JjZSBwZXJtaXNzaW9uIChpZiBhbnkpIHJlcXVpcmVkIGZvciBlYWNoIHR5cGUgb2YgY29uY3VycmVuY3kKLSAgICAgICAgaWYgKGNvbmN1cnJlbmN5ICYgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQUxMKSB7Ci0gICAgICAgICAgICAvL1RPRE86IGNoZWNrIGluY2FsbCBjYXB0dXJlIHBlcm1pc3Npb24KLSAgICAgICAgfQotICAgICAgICBpZiAoY29uY3VycmVuY3kgJiBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBUFRVUkUpIHsKLSAgICAgICAgICAgIC8vVE9ETzogY2hlY2sgY29uY3VycmVudCBjYXB0dXJlIHBlcm1pc3Npb24KLSAgICAgICAgfQotCi0gICAgICAgIGNsaWVudC0+YWN0aXZlID0gdHJ1ZTsKLSAgICB9IGVsc2UgeworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgY2xpZW50LT5hY3RpdmUgPSBmYWxzZTsKKyAgICAgICAgY2xpZW50LT5zdGFydFRpbWVOcyA9IDA7CisgICAgICAgIHVwZGF0ZVVpZFN0YXRlc19sKCk7CiAgICAgICAgIGZpbmlzaFJlY29yZGluZyhjbGllbnQtPm9wUGFja2FnZU5hbWUsIGNsaWVudC0+dWlkKTsKICAgICB9CiAKQEAgLTU4OSw2ICs1OTEsNyBAQAogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQorCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAogICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9SZWNvcmRDbGllbnRzLmluZGV4T2ZLZXkocG9ydElkKTsKQEAgLTU5OCwxMSArNjAxLDE0IEBACiAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGNsaWVudCA9IG1BdWRpb1JlY29yZENsaWVudHMudmFsdWVBdChpbmRleCk7CiAKICAgICBjbGllbnQtPmFjdGl2ZSA9IGZhbHNlOworICAgIGNsaWVudC0+c3RhcnRUaW1lTnMgPSAwOworCisgICAgdXBkYXRlVWlkU3RhdGVzX2woKTsKIAogICAgIC8vIGZpbmlzaCB0aGUgcmVjb3JkaW5nIGFwcCBvcAogICAgIGZpbmlzaFJlY29yZGluZyhjbGllbnQtPm9wUGFja2FnZU5hbWUsIGNsaWVudC0+dWlkKTsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdG9wSW5wdXQoY2xpZW50LT5pbnB1dCwgY2xpZW50LT5zZXNzaW9uKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RvcElucHV0KHBvcnRJZCk7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCkBAIC02MjAsNiArNjI2LDE0IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgY2xpZW50ID0gbUF1ZGlvUmVjb3JkQ2xpZW50cy52YWx1ZUF0KGluZGV4KTsKKworICAgICAgICBpZiAoY2xpZW50LT5hY3RpdmUpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcyByZWxlYXNpbmcgYWN0aXZlIGNsaWVudCBwb3J0SWQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CisgICAgICAgICAgICBjbGllbnQtPmFjdGl2ZSA9IGZhbHNlOworICAgICAgICAgICAgY2xpZW50LT5zdGFydFRpbWVOcyA9IDA7CisgICAgICAgICAgICB1cGRhdGVVaWRTdGF0ZXNfbCgpOworICAgICAgICB9CisKICAgICAgICAgbUF1ZGlvUmVjb3JkQ2xpZW50cy5yZW1vdmVJdGVtKHBvcnRJZCk7CiAgICAgfQogICAgIGlmIChjbGllbnQgPT0gMCkgewpAQCAtNjI3LDE1ICs2NDEsMTUgQEAKICAgICB9CiAgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyAhPSAwKSB7CiAgICAgICAgIC8vIHJlbGVhc2UgYXVkaW8gcHJvY2Vzc29ycyBmcm9tIHRoZSBpbnB1dAotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPnJlbGVhc2VJbnB1dEVmZmVjdHMoY2xpZW50LT5pbnB1dCwgY2xpZW50LT5zZXNzaW9uKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5yZWxlYXNlSW5wdXRFZmZlY3RzKGNsaWVudC0+aW8sIGNsaWVudC0+c2Vzc2lvbik7CiAgICAgICAgIGlmKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byByZWxlYXNlIGVmZmVjdHMgb24gaW5wdXQgJWQiLCBjbGllbnQtPmlucHV0KTsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gcmVsZWFzZSBlZmZlY3RzIG9uIGlucHV0ICVkIiwgY2xpZW50LT5pbyk7CiAgICAgICAgIH0KICAgICB9CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlSW5wdXQoY2xpZW50LT5pbnB1dCwgY2xpZW50LT5zZXNzaW9uKTsKKyAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZUlucHV0KHBvcnRJZCk7CiAgICAgfQogfQogCkBAIC02OTUsMTQgKzcwOSw2MiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpZiAoIXNldHRpbmdzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgaW5kZXgsIGRldmljZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgaW5kZXgsIGRldmljZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0TWluVm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRNaW5Wb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgaW5kZXgpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4KQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0TWF4Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIGluZGV4KTsKK30KKwogdWludDMyX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKIHsKICAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgewotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIFBST0RVQ1RfU1RSQVRFR1lfTk9ORTsKICAgICB9CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIFBST0RVQ1RfU1RSQVRFR1lfTk9ORTsKICAgICB9CisgICAgLy8gRE8gTk9UIExPQ0ssIG1heSBiZSBjYWxsZWQgZnJvbSBBdWRpb0ZsaW5nZXIgd2l0aCBsb2NrIGhlbGQsIHJlYWNoaW5nIGRlYWRsb2NrCiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oc3RyZWFtKTsKIH0KQEAgLTc0Miw3ICs4MDQsNyBAQAogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtRWZmZWN0c0xvY2spOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVnaXN0ZXJFZmZlY3QoZGVzYywgaW8sIHN0cmF0ZWd5LCBzZXNzaW9uLCBpZCk7CiB9CkBAIC03NTIsNyArODE0LDcgQEAKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUVmZmVjdHNMb2NrKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnVucmVnaXN0ZXJFZmZlY3QoaWQpOwogfQpAQCAtNzYyLDExICs4MjQsMjEgQEAKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUVmZmVjdHNMb2NrKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldEVmZmVjdEVuYWJsZWQoaWQsIGVuYWJsZWQpOwogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6Om1vdmVFZmZlY3RzVG9Jbyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBpZHMsIGF1ZGlvX2lvX2hhbmRsZV90IGlvKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+bW92ZUVmZmVjdHNUb0lvKGlkcywgaW8pOworfQorCiBib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAogewogICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7CkBAIC04MDMsMjcgKzg3NSwxMTQgQEAKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNTb3VyY2VBY3RpdmUoc291cmNlKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmNvdW50KQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRBdWRpb1BvbGljeUVmZmVjdHMoc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPiYgYXVkaW9Qb2xpY3lFZmZlY3RzKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKLSAgICAgICAgKmNvdW50ID0gMDsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOwogICAgIH0KICAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzID09IDApIHsKLSAgICAgICAgKmNvdW50ID0gMDsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpCit7CisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRBdWRpb1BvbGljeUVmZmVjdHMoYXVkaW9Qb2xpY3lFZmZlY3RzKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICpjb3VudCA9IDA7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQogICAgIHJldHVybiBhdWRpb1BvbGljeUVmZmVjdHMtPnF1ZXJ5RGVmYXVsdElucHV0RWZmZWN0cygKICAgICAgICAgICAgIChhdWRpb19zZXNzaW9uX3QpYXVkaW9TZXNzaW9uLCBkZXNjcmlwdG9ycywgY291bnQpOwogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmFkZFNvdXJjZURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCkKK3sKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1ZGlvUG9saWN5RWZmZWN0cyhhdWRpb1BvbGljeUVmZmVjdHMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgaWYgKCFtb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgcmV0dXJuIGF1ZGlvUG9saWN5RWZmZWN0cy0+YWRkU291cmNlRGVmYXVsdEVmZmVjdCgKKyAgICAgICAgICAgIHR5cGUsIG9wUGFja2FnZU5hbWUsIHV1aWQsIHByaW9yaXR5LCBzb3VyY2UsIGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjphZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKQoreworICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9Qb2xpY3lFZmZlY3RzKGF1ZGlvUG9saWN5RWZmZWN0cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBpZiAoIW1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICByZXR1cm4gYXVkaW9Qb2xpY3lFZmZlY3RzLT5hZGRTdHJlYW1EZWZhdWx0RWZmZWN0KAorICAgICAgICAgICAgdHlwZSwgb3BQYWNrYWdlTmFtZSwgdXVpZCwgcHJpb3JpdHksIHVzYWdlLCBpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkKK3sKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1ZGlvUG9saWN5RWZmZWN0cyhhdWRpb1BvbGljeUVmZmVjdHMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgaWYgKCFtb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgcmV0dXJuIGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkKK3sKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1ZGlvUG9saWN5RWZmZWN0cyhhdWRpb1BvbGljeUVmZmVjdHMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgaWYgKCFtb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZCgpKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgcmV0dXJuIGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0QWxsb3dlZENhcHR1cmVQb2xpY3kodWlkX3QgdWlkLCBhdWRpb19mbGFnc19tYXNrX3QgY2FwdHVyZVBvbGljeSkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HVigiJXMoKSBtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICB1aW50X3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICBpZiAodWlkICE9IGNhbGxpbmdVaWQpIHsKKyAgICAgICAgQUxPR0QoIiVzKCkgdWlkIGludmFsaWQgJWQgIT0gJWQiLCBfX2Z1bmNfXywgdWlkLCBjYWxsaW5nVWlkKTsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0QWxsb3dlZENhcHR1cmVQb2xpY3kodWlkLCBjYXB0dXJlUG9saWN5KTsKK30KKwogYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgaW5mbykKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CkBAIC04MzEsMTIgKzk5MCwyMSBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sZShtRWZmZWN0c0xvY2spOyAvLyBpc09mZmxvYWRTdXBwb3J0ZWQgcXVlcmllcyBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uLW9mZmxvYWRhYmxlIGVmZmVjdHMKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc09mZmxvYWRTdXBwb3J0ZWQoaW5mbyk7CiB9CiAKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzKSB7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HVigibUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uZmlnLCBhdHRyaWJ1dGVzKTsKK30KKworCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6Omxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLApAQCAtOTQwLDkgKzExMDgsMjIgQEAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVnaXN0ZXJQb2xpY3lNaXhlcyhjb25zdCBWZWN0b3I8QXVkaW9NaXg+JiBtaXhlcywgYm9vbCByZWdpc3RyYXRpb24pCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZighbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpKSB7CisKKyAgICAvLyBsb29wYmFja3xyZW5kZXIgb25seSBuZWVkIGEgTWVkaWFQcm9qZWN0aW9uIChjaGVja2VkIGluIGNhbGxlciBBdWRpb1NlcnZpY2UuamF2YSkKKyAgICBib29sIG5lZWRNb2RpZnlBdWRpb1JvdXRpbmcgPSBzdGQ6OmFueV9vZihtaXhlcy5iZWdpbigpLCBtaXhlcy5lbmQoKSwgW10oYXV0byYgbWl4KSB7CisgICAgICAgICAgICByZXR1cm4gIWlzX21peF9sb29wYmFja19yZW5kZXIobWl4Lm1Sb3V0ZUZsYWdzKTsgfSk7CisgICAgaWYgKG5lZWRNb2RpZnlBdWRpb1JvdXRpbmcgJiYgIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQorCisgICAgYm9vbCBuZWVkQ2FwdHVyZU1lZGlhT3V0cHV0ID0gc3RkOjphbnlfb2YobWl4ZXMuYmVnaW4oKSwgbWl4ZXMuZW5kKCksIFtdKGF1dG8mIG1peCkgeworICAgICAgICAgICAgcmV0dXJuIG1peC5tQWxsb3dQcml2aWxlZ2VkUGxheWJhY2tDYXB0dXJlOyB9KTsKKyAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgIGNvbnN0IHBpZF90IGNhbGxpbmdQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgaWYgKG5lZWRDYXB0dXJlTWVkaWFPdXRwdXQgJiYgIWNhcHR1cmVNZWRpYU91dHB1dEFsbG93ZWQoY2FsbGluZ1BpZCwgY2FsbGluZ1VpZCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKwogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQpAQCAtOTU0LDI3ICsxMTM1LDUzIEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCi17CitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLAorICAgICAgICBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmKCFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdGFydEF1ZGlvU291cmNlKHNvdXJjZSwgYXR0cmlidXRlcywgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldFVpZERldmljZUFmZmluaXRpZXModWlkLCBkZXZpY2VzKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICAvLyBzdGFydEF1ZGlvU291cmNlIHNob3VsZCBiZSBjcmVhdGVkIGFzIHRoZSBjYWxsaW5nIHVpZAorICAgIGNvbnN0IHVpZF90IGNhbGxpbmdVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRBdWRpb1NvdXJjZShzb3VyY2UsIGF0dHJpYnV0ZXMsIHBvcnRJZCwgY2FsbGluZ1VpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RvcEF1ZGlvU291cmNlKGhhbmRsZSk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BBdWRpb1NvdXJjZShwb3J0SWQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldE1hc3Rlck1vbm8oYm9vbCBtb25vKQpAQCAtMTAyNiw2ICsxMjMzLDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJyb3VuZEZvcm1hdHNFbmFibGVkLCByZXBvcnRlZCk7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gKmZvcm1hdHMpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKGZvcm1hdHMpOworfQorCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwgYm9vbCBlbmFibGVkKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKQEAgLTEwMzYsNCArMTI1NCw2NiBAQAogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9Gb3JtYXQsIGVuYWJsZWQpOwogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtVWlkUG9saWN5LT5zZXRBc3Npc3RhbnRVaWQodWlkKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0QTExeVNlcnZpY2VzVWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtVWlkUG9saWN5LT5zZXRBMTF5VWlkcyh1aWRzKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dXKCIlcywgbUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6Omxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKHN0cmF0ZWdpZXMpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoCisgICAgICAgIGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsIHByb2R1Y3Rfc3RyYXRlZ3lfdCAmcHJvZHVjdFN0cmF0ZWd5KQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoYWEsIHByb2R1Y3RTdHJhdGVneSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6bGlzdEF1ZGlvVm9sdW1lR3JvdXBzKEF1ZGlvVm9sdW1lR3JvdXBWZWN0b3IgJmdyb3VwcykKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5saXN0QXVkaW9Wb2x1bWVHcm91cHMoZ3JvdXBzKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRWb2x1bWVHcm91cEZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZV9ncm91cF90ICZ2b2x1bWVHcm91cCkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRWb2x1bWVHcm91cEZyb21BdWRpb0F0dHJpYnV0ZXMoYWEsIHZvbHVtZUdyb3VwKTsKK30KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAppbmRleCBmM2NkZGMzLi5lM2M3MmFlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCkBAIC0yMiwxMSArMjIsMTEgQEAKICNkZWZpbmUgX19TVERJTlRfTElNSVRTCiAjZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKICNpbmNsdWRlIDxzdGRpbnQuaD4KLQogI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbXVsdGl1c2VyLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvQWN0aXZpdHlNYW5hZ2VyLmg+CkBAIC0zNSwyMyArMzUsMjEgQEAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlICJBdWRpb1BvbGljeVNlcnZpY2UuaCIKLSNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCiAjaW5jbHVkZSA8aGFyZHdhcmVfbGVnYWN5L3Bvd2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgorI2luY2x1ZGUgPHNlbnNvcnByaXZhY3kvU2Vuc29yUHJpdmFjeU1hbmFnZXIuaD4KIAogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KIAotI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXRpYyBjb25zdCBjaGFyIGtEZWFkbG9ja2VkU3RyaW5nW10gPSAiQXVkaW9Qb2xpY3lTZXJ2aWNlIG1heSBiZSBkZWFkbG9ja2VkXG4iOwogc3RhdGljIGNvbnN0IGNoYXIga0NtZERlYWRsb2NrZWRTdHJpbmdbXSA9ICJBdWRpb1BvbGljeVNlcnZpY2UgY29tbWFuZCB0aHJlYWQgbWF5IGJlIGRlYWRsb2NrZWRcbiI7CiAKLXN0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrUmV0cmllcyA9IDUwOwotc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tTbGVlcFVzID0gMjAwMDA7CitzdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1RpbWVvdXROcyA9IDEgKiBOQU5PU19QRVJfU0VDT05EOwogCiBzdGF0aWMgY29uc3QgbnNlY3NfdCBrQXVkaW9Db21tYW5kVGltZW91dE5zID0gc2Vjb25kcygzKTsgLy8gMyBzZWNvbmRzCiAKQEAgLTcwLDggKzY4LDYgQEAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKLSAgICAgICAgLy8gc3RhcnQgdG9uZSBwbGF5YmFjayB0aHJlYWQKLSAgICAgICAgbVRvbmVQbGF5YmFja1RocmVhZCA9IG5ldyBBdWRpb0NvbW1hbmRUaHJlYWQoU3RyaW5nOCgiQXBtVG9uZSIpLCB0aGlzKTsKICAgICAgICAgLy8gc3RhcnQgYXVkaW8gY29tbWFuZHMgdGhyZWFkCiAgICAgICAgIG1BdWRpb0NvbW1hbmRUaHJlYWQgPSBuZXcgQXVkaW9Db21tYW5kVGhyZWFkKFN0cmluZzgoIkFwbUF1ZGlvIiksIHRoaXMpOwogICAgICAgICAvLyBzdGFydCBvdXRwdXQgYWN0aXZpdHkgY29tbWFuZCB0aHJlYWQKQEAgLTg5LDExICs4NSwxMyBAQAogCiAgICAgbVVpZFBvbGljeSA9IG5ldyBVaWRQb2xpY3kodGhpcyk7CiAgICAgbVVpZFBvbGljeS0+cmVnaXN0ZXJTZWxmKCk7CisKKyAgICBtU2Vuc29yUHJpdmFjeVBvbGljeSA9IG5ldyBTZW5zb3JQcml2YWN5UG9saWN5KHRoaXMpOworICAgIG1TZW5zb3JQcml2YWN5UG9saWN5LT5yZWdpc3RlclNlbGYoKTsKIH0KIAogQXVkaW9Qb2xpY3lTZXJ2aWNlOjp+QXVkaW9Qb2xpY3lTZXJ2aWNlKCkKIHsKLSAgICBtVG9uZVBsYXliYWNrVGhyZWFkLT5leGl0KCk7CiAgICAgbUF1ZGlvQ29tbWFuZFRocmVhZC0+ZXhpdCgpOwogICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5leGl0KCk7CiAKQEAgLTEwNSw2ICsxMDMsOSBAQAogCiAgICAgbVVpZFBvbGljeS0+dW5yZWdpc3RlclNlbGYoKTsKICAgICBtVWlkUG9saWN5LmNsZWFyKCk7CisKKyAgICBtU2Vuc29yUHJpdmFjeVBvbGljeS0+dW5yZWdpc3RlclNlbGYoKTsKKyAgICBtU2Vuc29yUHJpdmFjeVBvbGljeS5jbGVhcigpOwogfQogCiAvLyBBIG5vdGlmaWNhdGlvbiBjbGllbnQgaXMgYWx3YXlzIHJlZ2lzdGVyZWQgYnkgQXVkaW9TeXN0ZW0gd2hlbiB0aGUgY2xpZW50IHByb2Nlc3MKQEAgLTExOCwxMyArMTE5LDE3IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Ob3RpZmljYXRpb25DbGllbnRzTG9jayk7CiAKICAgICB1aWRfdCB1aWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmluZGV4T2ZLZXkodWlkKSA8IDApIHsKKyAgICBwaWRfdCBwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgaW50NjRfdCB0b2tlbiA9ICgoaW50NjRfdCl1aWQ8PDMyKSB8IHBpZDsKKworICAgIGlmIChtTm90aWZpY2F0aW9uQ2xpZW50cy5pbmRleE9mS2V5KHRva2VuKSA8IDApIHsKICAgICAgICAgc3A8Tm90aWZpY2F0aW9uQ2xpZW50PiBub3RpZmljYXRpb25DbGllbnQgPSBuZXcgTm90aWZpY2F0aW9uQ2xpZW50KHRoaXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWQpOwotICAgICAgICBBTE9HVigicmVnaXN0ZXJDbGllbnQoKSBjbGllbnQgJXAsIHVpZCAlZCIsIGNsaWVudC5nZXQoKSwgdWlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZCk7CisgICAgICAgIEFMT0dWKCJyZWdpc3RlckNsaWVudCgpIGNsaWVudCAlcCwgdWlkICVkIHBpZCAlZCIsIGNsaWVudC5nZXQoKSwgdWlkLCBwaWQpOwogCi0gICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLmFkZCh1aWQsIG5vdGlmaWNhdGlvbkNsaWVudCk7CisgICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLmFkZCh0b2tlbiwgbm90aWZpY2F0aW9uQ2xpZW50KTsKIAogICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBJSW50ZXJmYWNlOjphc0JpbmRlcihjbGllbnQpOwogICAgICAgICBiaW5kZXItPmxpbmtUb0RlYXRoKG5vdGlmaWNhdGlvbkNsaWVudCk7CkBAIC0xMzYsMjIgKzE0MSw0NyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTm90aWZpY2F0aW9uQ2xpZW50c0xvY2spOwogCiAgICAgdWlkX3QgdWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmIChtTm90aWZpY2F0aW9uQ2xpZW50cy5pbmRleE9mS2V5KHVpZCkgPCAwKSB7CisgICAgcGlkX3QgcGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIGludDY0X3QgdG9rZW4gPSAoKGludDY0X3QpdWlkPDwzMikgfCBwaWQ7CisKKyAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMuaW5kZXhPZktleSh0b2tlbikgPCAwKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVGb3IodWlkKS0+c2V0QXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZChlbmFibGVkKTsKKyAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUZvcih0b2tlbiktPnNldEF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoZW5hYmxlZCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZChib29sIGVuYWJsZWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Ob3RpZmljYXRpb25DbGllbnRzTG9jayk7CisKKyAgICB1aWRfdCB1aWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgcGlkX3QgcGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIGludDY0X3QgdG9rZW4gPSAoKGludDY0X3QpdWlkPDwzMikgfCBwaWQ7CisKKyAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMuaW5kZXhPZktleSh0b2tlbikgPCAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVGb3IodG9rZW4pLT5zZXRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZChlbmFibGVkKTsKIH0KIAogLy8gcmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KCkgaXMgY2FsbGVkIHdoZW4gdGhlIGNsaWVudCBwcm9jZXNzIGRpZXMuCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6cmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KHVpZF90IHVpZCkKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZW1vdmVOb3RpZmljYXRpb25DbGllbnQodWlkX3QgdWlkLCBwaWRfdCBwaWQpCiB7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobU5vdGlmaWNhdGlvbkNsaWVudHNMb2NrKTsKLSAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMucmVtb3ZlSXRlbSh1aWQpOworICAgICAgICBpbnQ2NF90IHRva2VuID0gKChpbnQ2NF90KXVpZDw8MzIpIHwgcGlkOworICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5yZW1vdmVJdGVtKHRva2VuKTsKICAgICB9CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlcikgeworICAgICAgICBib29sIGhhc1NhbWVVaWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTm90aWZpY2F0aW9uQ2xpZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlQXQoaSktPnVpZCgpID09IHVpZCkgeworICAgICAgICAgICAgICAgIGhhc1NhbWVVaWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyICYmICFoYXNTYW1lVWlkKSB7CiAgICAgICAgICAgICAvLyBjYWxsZWQgZnJvbSBiaW5kZXIgZGVhdGggbm90aWZpY2F0aW9uOiBubyBuZWVkIHRvIGNsZWFyIGNhbGxlciBpZGVudGl0eQogICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZVJlc291cmNlc0ZvclVpZCh1aWQpOwogICAgICAgICB9CkBAIC0xODQsNiArMjE0LDE5IEBACiAgICAgfQogfQogCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwgaW50IGZsYWdzKQoreworICAgIG1PdXRwdXRDb21tYW5kVGhyZWFkLT5jaGFuZ2VBdWRpb1ZvbHVtZUdyb3VwQ29tbWFuZChncm91cCwgZmxhZ3MpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9PbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLCBpbnQgZmxhZ3MpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Ob3RpZmljYXRpb25DbGllbnRzTG9jayk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTm90aWZpY2F0aW9uQ2xpZW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUF0KGkpLT5vbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKGdyb3VwLCBmbGFncyk7CisgICAgfQorfQorCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoY29uc3QgU3RyaW5nOCYgcmVnSWQsIGludDMyX3Qgc3RhdGUpCiB7CiAgICAgQUxPR1YoIkF1ZGlvUG9saWN5U2VydmljZTo6b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoJXMsICVkKSIsCkBAIC0xOTksMjIgKzI0MiwzNCBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCi0gICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCi0gICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpCiB7CiAgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGVDb21tYW5kKGV2ZW50LCBjbGllbnRJbmZvLAotICAgICAgICAgICAgY2xpZW50Q29uZmlnLCBkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIGNsaWVudENvbmZpZywgY2xpZW50RWZmZWN0cywgZGV2aWNlQ29uZmlnLCBlZmZlY3RzLCBwYXRjaEhhbmRsZSwgc291cmNlKTsKIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvT25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKLSAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb09uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Ob3RpZmljYXRpb25DbGllbnRzTG9jayk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTm90aWZpY2F0aW9uQ2xpZW50cy5zaXplKCk7IGkrKykgewogICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUF0KGkpLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsIGNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgY2xpZW50Q29uZmlnLCBkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBjbGllbnRDb25maWcsIGNsaWVudEVmZmVjdHMsIGRldmljZUNvbmZpZywgZWZmZWN0cywgcGF0Y2hIYW5kbGUsIHNvdXJjZSk7CiAgICAgfQogfQogCkBAIC0yMzksOSArMjk0LDEwIEBACiAKIEF1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpOb3RpZmljYXRpb25DbGllbnQoY29uc3Qgc3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiYgc2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4mIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKQotICAgIDogbVNlcnZpY2Uoc2VydmljZSksIG1VaWQodWlkKSwgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudChjbGllbnQpLAotICAgICAgbUF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkKQorICAgIDogbVNlcnZpY2Uoc2VydmljZSksIG1VaWQodWlkKSwgbVBpZChwaWQpLCBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50KGNsaWVudCksCisgICAgICBtQXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZChmYWxzZSksIG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZChmYWxzZSkKIHsKIH0KIApAQCAtMjU0LDcgKzMxMCw3IEBACiAgICAgc3A8Tm90aWZpY2F0aW9uQ2xpZW50PiBrZWVwKHRoaXMpOwogICAgIHNwPEF1ZGlvUG9saWN5U2VydmljZT4gc2VydmljZSA9IG1TZXJ2aWNlLnByb21vdGUoKTsKICAgICBpZiAoc2VydmljZSAhPSAwKSB7Ci0gICAgICAgIHNlcnZpY2UtPnJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudChtVWlkKTsKKyAgICAgICAgc2VydmljZS0+cmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KG1VaWQsIG1QaWQpOwogICAgIH0KIH0KIApAQCAtMjcyLDIyICszMjgsMzYgQEAKICAgICB9CiB9CiAKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6Om9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCAhPSAwICYmIG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZCkgeworICAgICAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LT5vbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKGdyb3VwLCBmbGFncyk7CisgICAgfQorfQorCisKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6Om9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKAogICAgICAgICBjb25zdCBTdHJpbmc4JiByZWdJZCwgaW50MzJfdCBzdGF0ZSkKIHsKLSAgICBpZiAobUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCAhPSAwICYmIG11bHRpdXNlcl9nZXRfYXBwX2lkKG1VaWQpIDwgQUlEX0FQUF9TVEFSVCkgeworICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDAgJiYgaXNTZXJ2aWNlVWlkKG1VaWQpKSB7CiAgICAgICAgIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKHJlZ0lkLCBzdGF0ZSk7CiAgICAgfQogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoCi0gICAgICAgIGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpCiB7Ci0gICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCAmJiBtdWx0aXVzZXJfZ2V0X2FwcF9pZChtVWlkKSA8IEFJRF9BUFBfU1RBUlQpIHsKKyAgICBpZiAobUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCAhPSAwICYmIGlzU2VydmljZVVpZChtVWlkKSkgewogICAgICAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsIGNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgY2xpZW50Q29uZmlnLCBkZXZpY2VDb25maWcsIHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBjbGllbnRDb25maWcsIGNsaWVudEVmZmVjdHMsIGRldmljZUNvbmZpZywgZWZmZWN0cywgcGF0Y2hIYW5kbGUsIHNvdXJjZSk7CiAgICAgfQogfQogCkBAIC0yOTYsMjMgKzM2NiwyMCBAQAogICAgIG1BdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkID0gZW5hYmxlZDsKIH0KIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6c2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIG1BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZCA9IGVuYWJsZWQ7Cit9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pIHsKICAgICBBTE9HVygiYmluZGVyRGllZCgpICVwLCBjYWxsaW5nIHBpZCAlZCIsIHdoby51bnNhZmVfZ2V0KCksCiAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOwogfQogCi1zdGF0aWMgYm9vbCB0cnlMb2NrKE11dGV4JiBtdXRleCkKK3N0YXRpYyBib29sIGR1bXBUcnlMb2NrKE11dGV4JiBtdXRleCkKIHsKLSAgICBib29sIGxvY2tlZCA9IGZhbHNlOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0R1bXBMb2NrUmV0cmllczsgKytpKSB7Ci0gICAgICAgIGlmIChtdXRleC50cnlMb2NrKCkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIGxvY2tlZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB1c2xlZXAoa0R1bXBMb2NrU2xlZXBVcyk7Ci0gICAgfQotICAgIHJldHVybiBsb2NrZWQ7CisgICAgc3RhdHVzX3QgZXJyID0gbXV0ZXgudGltZWRMb2NrKGtEdW1wTG9ja1RpbWVvdXROcyk7CisgICAgcmV0dXJuIGVyciA9PSBOT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkdW1wSW50ZXJuYWxzKGludCBmZCkKQEAgLTMyNSwyNCArMzkyLDIyNyBAQAogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJDb21tYW5kIFRocmVhZDogJXBcbiIsIG1BdWRpb0NvbW1hbmRUaHJlYWQuZ2V0KCkpOwogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJUb25lcyBUaHJlYWQ6ICVwXG4iLCBtVG9uZVBsYXliYWNrVGhyZWFkLmdldCgpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAKICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6dXBkYXRlVWlkU3RhdGVzKCkKIHsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyKSB7Ci0gICAgICAgICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0UmVjb3JkU2lsZW5jZWQodWlkLCBzaWxlbmNlZCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICB1cGRhdGVVaWRTdGF0ZXNfbCgpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6dXBkYXRlVWlkU3RhdGVzX2woKQoreworLy8gICAgR28gb3ZlciBhbGwgYWN0aXZlIGNsaWVudHMgYW5kIGFsbG93IGNhcHR1cmUgKGRvZXMgbm90IGZvcmNlIHNpbGVuY2UpIGluIHRoZQorLy8gICAgZm9sbG93aW5nIGNhc2VzOgorLy8gICAgQW5vdGhlciBjbGllbnQgaW4gdGhlIHNhbWUgVUlEIGhhcyBhbHJlYWR5IGJlZW4gYWxsb3dlZCB0byBjYXB0dXJlCisvLyAgICBPUiBUaGUgY2xpZW50IGlzIHRoZSBhc3Npc3RhbnQKKy8vICAgICAgICBBTkQgYW4gYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIGlzIG9uIFRPUAorLy8gICAgICAgICAgICAgICBBTkQgdGhlIHNvdXJjZSBpcyBWT0lDRV9SRUNPR05JVElPTiBvciBIT1RXT1JECisvLyAgICAgICAgT1IgdXNlcyBWT0lDRV9SRUNPR05JVElPTiBBTkQgaXMgb24gVE9QCisvLyAgICAgICAgICAgICAgIE9SIHVzZXMgSE9UV09SRAorLy8gICAgICAgICAgICBBTkQgdGhlcmUgaXMgbm8gYWN0aXZlIHByaXZhY3kgc2Vuc2l0aXZlIGNhcHR1cmUgb3IgY2FsbAorLy8gICAgICAgICAgICAgICAgT1IgY2xpZW50IGhhcyBDQVBUVVJFX0FVRElPX09VVFBVVCBwcml2aWxlZ2VkIHBlcm1pc3Npb24KKy8vICAgIE9SIFRoZSBjbGllbnQgaXMgYW4gYWNjZXNzaWJpbGl0eSBzZXJ2aWNlCisvLyAgICAgICAgQU5EIGlzIG9uIFRPUAorLy8gICAgICAgIEFORCB0aGUgc291cmNlIGlzIFZPSUNFX1JFQ09HTklUSU9OIG9yIEhPVFdPUkQKKy8vICAgIE9SIHRoZSBjbGllbnQgc291cmNlIGlzIHZpcnR1YWwgKHJlbW90ZSBzdWJtaXgsIGNhbGwgYXVkaW8gVFggb3IgUlguLi4pCisvLyAgICBPUiBBbnkgY2xpZW50CisvLyAgICAgICAgQU5EIFRoZSBhc3Npc3RhbnQgaXMgbm90IG9uIFRPUAorLy8gICAgICAgIEFORCBpcyBvbiBUT1Agb3IgbGF0ZXN0IHN0YXJ0ZWQKKy8vICAgICAgICBBTkQgdGhlcmUgaXMgbm8gYWN0aXZlIHByaXZhY3kgc2Vuc2l0aXZlIGNhcHR1cmUgb3IgY2FsbAorLy8gICAgICAgICAgICAgICAgT1IgY2xpZW50IGhhcyBDQVBUVVJFX0FVRElPX09VVFBVVCBwcml2aWxlZ2VkIHBlcm1pc3Npb24KKworICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiB0b3BBY3RpdmU7CisgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGxhdGVzdEFjdGl2ZTsKKyAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gbGF0ZXN0U2Vuc2l0aXZlQWN0aXZlOworCisgICAgbnNlY3NfdCB0b3BTdGFydE5zID0gMDsKKyAgICBuc2Vjc190IGxhdGVzdFN0YXJ0TnMgPSAwOworICAgIG5zZWNzX3QgbGF0ZXN0U2Vuc2l0aXZlU3RhcnROcyA9IDA7CisgICAgYm9vbCBpc0ExMXlPblRvcCA9IG1VaWRQb2xpY3ktPmlzQTExeU9uVG9wKCk7CisgICAgYm9vbCBpc0Fzc2lzdGFudE9uVG9wID0gZmFsc2U7CisgICAgYm9vbCBpc1NlbnNpdGl2ZUFjdGl2ZSA9IGZhbHNlOworICAgIGJvb2wgaXNJbkNhbGwgPSBtUGhvbmVTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEw7CisKKyAgICAvLyBpZiBTZW5zb3IgUHJpdmFjeSBpcyBlbmFibGVkIHRoZW4gYWxsIHJlY29yZGluZ3Mgc2hvdWxkIGJlIHNpbGVuY2VkLgorICAgIGlmIChtU2Vuc29yUHJpdmFjeVBvbGljeS0+aXNTZW5zb3JQcml2YWN5RW5hYmxlZCgpKSB7CisgICAgICAgIHNpbGVuY2VBbGxSZWNvcmRpbmdzX2woKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPTA7IGkgPCBtQXVkaW9SZWNvcmRDbGllbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBjdXJyZW50ID0gbUF1ZGlvUmVjb3JkQ2xpZW50c1tpXTsKKyAgICAgICAgaWYgKCFjdXJyZW50LT5hY3RpdmUpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CisKKyAgICAgICAgYXBwX3N0YXRlX3QgYXBwU3RhdGUgPSBhcG1TdGF0RnJvbUFtU3RhdGUobVVpZFBvbGljeS0+Z2V0VWlkU3RhdGUoY3VycmVudC0+dWlkKSk7CisgICAgICAgIC8vIGNsaWVudHMgd2hpY2ggYXBwIGlzIGluIElETEUgc3RhdGUgYXJlIG5vdCBlbGlnaWJsZSBmb3IgdG9wIGFjdGl2ZSBvcgorICAgICAgICAvLyBsYXRlc3QgYWN0aXZlCisgICAgICAgIGlmIChhcHBTdGF0ZSA9PSBBUFBfU1RBVEVfSURMRSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoYXBwU3RhdGUgPT0gQVBQX1NUQVRFX1RPUCkgeworICAgICAgICAgICAgaWYgKGN1cnJlbnQtPnN0YXJ0VGltZU5zID4gdG9wU3RhcnROcykgeworICAgICAgICAgICAgICAgIHRvcEFjdGl2ZSA9IGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgdG9wU3RhcnROcyA9IGN1cnJlbnQtPnN0YXJ0VGltZU5zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1VaWRQb2xpY3ktPmlzQXNzaXN0YW50VWlkKGN1cnJlbnQtPnVpZCkpIHsKKyAgICAgICAgICAgICAgICBpc0Fzc2lzdGFudE9uVG9wID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY3VycmVudC0+c3RhcnRUaW1lTnMgPiBsYXRlc3RTdGFydE5zKSB7CisgICAgICAgICAgICBsYXRlc3RBY3RpdmUgPSBjdXJyZW50OworICAgICAgICAgICAgbGF0ZXN0U3RhcnROcyA9IGN1cnJlbnQtPnN0YXJ0VGltZU5zOworICAgICAgICB9CisgICAgICAgIGlmIChpc1ByaXZhY3lTZW5zaXRpdmVTb3VyY2UoY3VycmVudC0+YXR0cmlidXRlcy5zb3VyY2UpKSB7CisgICAgICAgICAgICBpZiAoY3VycmVudC0+c3RhcnRUaW1lTnMgPiBsYXRlc3RTZW5zaXRpdmVTdGFydE5zKSB7CisgICAgICAgICAgICAgICAgbGF0ZXN0U2Vuc2l0aXZlQWN0aXZlID0gY3VycmVudDsKKyAgICAgICAgICAgICAgICBsYXRlc3RTZW5zaXRpdmVTdGFydE5zID0gY3VycmVudC0+c3RhcnRUaW1lTnM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpc1NlbnNpdGl2ZUFjdGl2ZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBpZiBubyBhY3RpdmUgY2xpZW50IHdpdGggVUkgb24gVG9wLCBjb25zaWRlciBsYXRlc3QgYWN0aXZlIGFzIHRvcAorICAgIGlmICh0b3BBY3RpdmUgPT0gbnVsbHB0cikgeworICAgICAgICB0b3BBY3RpdmUgPSBsYXRlc3RBY3RpdmU7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8dWlkX3Q+IGVuYWJsZWRVaWRzOworCisgICAgZm9yIChzaXplX3QgaSA9MDsgaSA8IG1BdWRpb1JlY29yZENsaWVudHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGN1cnJlbnQgPSBtQXVkaW9SZWNvcmRDbGllbnRzW2ldOworICAgICAgICBpZiAoIWN1cnJlbnQtPmFjdGl2ZSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBrZWVwIGNhcHR1cmUgYWxsb3dlZCBpZiBhbm90aGVyIGNsaWVudCB3aXRoIHRoZSBzYW1lIFVJRCBoYXMgYWxyZWFkeQorICAgICAgICAvLyBiZWVuIGFsbG93ZWQgdG8gY2FwdHVyZQorICAgICAgICBpZiAoc3RkOjpmaW5kKGVuYWJsZWRVaWRzLmJlZ2luKCksIGVuYWJsZWRVaWRzLmVuZCgpLCBjdXJyZW50LT51aWQpCisgICAgICAgICAgICAgICAgIT0gZW5hYmxlZFVpZHMuZW5kKCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlID0gY3VycmVudC0+YXR0cmlidXRlcy5zb3VyY2U7CisgICAgICAgIGJvb2wgaXNUb3BPckxhdGVzdEFjdGl2ZSA9IHRvcEFjdGl2ZSA9PSBudWxscHRyID8gZmFsc2UgOiBjdXJyZW50LT51aWQgPT0gdG9wQWN0aXZlLT51aWQ7CisgICAgICAgIGJvb2wgaXNMYXRlc3RTZW5zaXRpdmUgPSBsYXRlc3RTZW5zaXRpdmVBY3RpdmUgPT0gbnVsbHB0ciA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSA6IGN1cnJlbnQtPnVpZCA9PSBsYXRlc3RTZW5zaXRpdmVBY3RpdmUtPnVpZDsKKworICAgICAgICAvLyBCeSBkZWZhdWx0IGFsbG93IGNhcHR1cmUgaWY6CisgICAgICAgIC8vICAgICBUaGUgYXNzaXN0YW50IGlzIG5vdCBvbiBUT1AKKyAgICAgICAgLy8gICAgIEFORCBpcyBvbiBUT1Agb3IgbGF0ZXN0IHN0YXJ0ZWQKKyAgICAgICAgLy8gICAgIEFORCB0aGVyZSBpcyBubyBhY3RpdmUgcHJpdmFjeSBzZW5zaXRpdmUgY2FwdHVyZSBvciBjYWxsCisgICAgICAgIC8vICAgICAgICAgICAgIE9SIGNsaWVudCBoYXMgQ0FQVFVSRV9BVURJT19PVVRQVVQgcHJpdmlsZWdlZCBwZXJtaXNzaW9uCisgICAgICAgIGJvb2wgYWxsb3dDYXB0dXJlID0gIWlzQXNzaXN0YW50T25Ub3AKKyAgICAgICAgICAgICAgICAmJiAoKGlzVG9wT3JMYXRlc3RBY3RpdmUgJiYgIWlzTGF0ZXN0U2Vuc2l0aXZlKSB8fCBpc0xhdGVzdFNlbnNpdGl2ZSkKKyAgICAgICAgICAgICAgICAmJiAhKGlzU2Vuc2l0aXZlQWN0aXZlICYmICEoaXNMYXRlc3RTZW5zaXRpdmUgfHwgY3VycmVudC0+Y2FuQ2FwdHVyZU91dHB1dCkpCisgICAgICAgICAgICAgICAgJiYgIShpc0luQ2FsbCAmJiAhY3VycmVudC0+Y2FuQ2FwdHVyZU91dHB1dCk7CisKKyAgICAgICAgaWYgKGlzVmlydHVhbFNvdXJjZShzb3VyY2UpKSB7CisgICAgICAgICAgICAvLyBBbGxvdyBjYXB0dXJlIGZvciB2aXJ0dWFsIChyZW1vdGUgc3VibWl4LCBjYWxsIGF1ZGlvIFRYIG9yIFJYLi4uKSBzb3VyY2VzCisgICAgICAgICAgICBhbGxvd0NhcHR1cmUgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKG1VaWRQb2xpY3ktPmlzQXNzaXN0YW50VWlkKGN1cnJlbnQtPnVpZCkpIHsKKyAgICAgICAgICAgIC8vIEZvciBhc3Npc3RhbnQgYWxsb3cgY2FwdHVyZSBpZjoKKyAgICAgICAgICAgIC8vICAgICBBbiBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UgaXMgb24gVE9QCisgICAgICAgICAgICAvLyAgICAgICAgICAgIEFORCB0aGUgc291cmNlIGlzIFZPSUNFX1JFQ09HTklUSU9OIG9yIEhPVFdPUkQKKyAgICAgICAgICAgIC8vICAgICBPUiBpcyBvbiBUT1AgQU5EIHVzZXMgVk9JQ0VfUkVDT0dOSVRJT04KKyAgICAgICAgICAgIC8vICAgICAgICAgICAgT1IgdXNlcyBIT1RXT1JECisgICAgICAgICAgICAvLyAgICAgICAgIEFORCB0aGVyZSBpcyBubyBhY3RpdmUgcHJpdmFjeSBzZW5zaXRpdmUgY2FwdHVyZSBvciBjYWxsCisgICAgICAgICAgICAvLyAgICAgICAgICAgICBPUiBjbGllbnQgaGFzIENBUFRVUkVfQVVESU9fT1VUUFVUIHByaXZpbGVnZWQgcGVybWlzc2lvbgorICAgICAgICAgICAgaWYgKGlzQTExeU9uVG9wKSB7CisgICAgICAgICAgICAgICAgaWYgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCB8fCBzb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbG93Q2FwdHVyZSA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoKChpc0Fzc2lzdGFudE9uVG9wICYmIHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04pIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoIShpc1NlbnNpdGl2ZUFjdGl2ZSB8fCBpc0luQ2FsbCkgfHwgY3VycmVudC0+Y2FuQ2FwdHVyZU91dHB1dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsb3dDYXB0dXJlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobVVpZFBvbGljeS0+aXNBMTF5VWlkKGN1cnJlbnQtPnVpZCkpIHsKKyAgICAgICAgICAgIC8vIEZvciBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UgYWxsb3cgY2FwdHVyZSBpZjoKKyAgICAgICAgICAgIC8vICAgICBJcyBvbiBUT1AKKyAgICAgICAgICAgIC8vICAgICBBTkQgdGhlIHNvdXJjZSBpcyBWT0lDRV9SRUNPR05JVElPTiBvciBIT1RXT1JECisgICAgICAgICAgICBpZiAoaXNBMTF5T25Ub3AgJiYKKyAgICAgICAgICAgICAgICAgICAgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04gfHwgc291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSkgeworICAgICAgICAgICAgICAgIGFsbG93Q2FwdHVyZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2V0QXBwU3RhdGVfbChjdXJyZW50LT51aWQsCisgICAgICAgICAgICAgICAgICAgICAgYWxsb3dDYXB0dXJlID8gYXBtU3RhdEZyb21BbVN0YXRlKG1VaWRQb2xpY3ktPmdldFVpZFN0YXRlKGN1cnJlbnQtPnVpZCkpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBQX1NUQVRFX0lETEUpOworICAgICAgICBpZiAoYWxsb3dDYXB0dXJlKSB7CisgICAgICAgICAgICBlbmFibGVkVWlkcy5wdXNoX2JhY2soY3VycmVudC0+dWlkKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnNpbGVuY2VBbGxSZWNvcmRpbmdzX2woKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9SZWNvcmRDbGllbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBjdXJyZW50ID0gbUF1ZGlvUmVjb3JkQ2xpZW50c1tpXTsKKyAgICAgICAgaWYgKCFpc1ZpcnR1YWxTb3VyY2UoY3VycmVudC0+YXR0cmlidXRlcy5zb3VyY2UpKSB7CisgICAgICAgICAgICBzZXRBcHBTdGF0ZV9sKGN1cnJlbnQtPnVpZCwgQVBQX1NUQVRFX0lETEUpOworICAgICAgICB9CisgICAgfQorfQorCisvKiBzdGF0aWMgKi8KK2FwcF9zdGF0ZV90IEF1ZGlvUG9saWN5U2VydmljZTo6YXBtU3RhdEZyb21BbVN0YXRlKGludCBhbVN0YXRlKSB7CisKKyAgICBpZiAoYW1TdGF0ZSA9PSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTikgeworICAgICAgICByZXR1cm4gQVBQX1NUQVRFX0lETEU7CisgICAgfSBlbHNlIGlmIChhbVN0YXRlIDw9IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9UT1ApIHsKKyAgICAgIC8vIGluY2x1ZGUgcGVyc2lzdGVudCBzZXJ2aWNlcworICAgICAgcmV0dXJuIEFQUF9TVEFURV9UT1A7CisgICAgfQorICAgIHJldHVybiBBUFBfU1RBVEVfRk9SRUdST1VORDsKK30KKworLyogc3RhdGljICovCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNQcml2YWN5U2Vuc2l0aXZlU291cmNlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKK3sKKyAgICBzd2l0Y2ggKHNvdXJjZSkgeworICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9DQU1DT1JERVI6CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT046CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIHN0YXRpYyAqLworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzVmlydHVhbFNvdXJjZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpCit7CisgICAgc3dpdGNoIChzb3VyY2UpIHsKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LOgorICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSzoKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTDoKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWDoKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfRk1fVFVORVI6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRBcHBTdGF0ZV9sKHVpZF90IHVpZCwgYXBwX3N0YXRlX3Qgc3RhdGUpCit7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyKSB7CisgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldEFwcFN0YXRlKHVpZCwgc3RhdGUpOwogICAgIH0KICAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhZikgeworICAgICAgICBib29sIHNpbGVuY2VkID0gc3RhdGUgPT0gQVBQX1NUQVRFX0lETEU7CiAgICAgICAgIGFmLT5zZXRSZWNvcmRTaWxlbmNlZCh1aWQsIHNpbGVuY2VkKTsKICAgICB9CiB9CkBAIC0zNTIsNyArNjIyLDcgQEAKICAgICBpZiAoIWR1bXBBbGxvd2VkKCkpIHsKICAgICAgICAgZHVtcFBlcm1pc3Npb25EZW5pYWwoZmQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGJvb2wgbG9ja2VkID0gdHJ5TG9jayhtTG9jayk7CisgICAgICAgIGJvb2wgbG9ja2VkID0gZHVtcFRyeUxvY2sobUxvY2spOwogICAgICAgICBpZiAoIWxvY2tlZCkgewogICAgICAgICAgICAgU3RyaW5nOCByZXN1bHQoa0RlYWRsb2NrZWRTdHJpbmcpOwogICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CkBAIC0zNjIsMTQgKzYzMiwxMyBAQAogICAgICAgICBpZiAobUF1ZGlvQ29tbWFuZFRocmVhZCAhPSAwKSB7CiAgICAgICAgICAgICBtQXVkaW9Db21tYW5kVGhyZWFkLT5kdW1wKGZkKTsKICAgICAgICAgfQotICAgICAgICBpZiAobVRvbmVQbGF5YmFja1RocmVhZCAhPSAwKSB7Ci0gICAgICAgICAgICBtVG9uZVBsYXliYWNrVGhyZWFkLT5kdW1wKGZkKTsKLSAgICAgICAgfQogCiAgICAgICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyKSB7CiAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5kdW1wKGZkKTsKICAgICAgICAgfQogCisgICAgICAgIG1QYWNrYWdlTWFuYWdlci5kdW1wKGZkKTsKKwogICAgICAgICBpZiAobG9ja2VkKSBtTG9jay51bmxvY2soKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtNTA1LDcgKzc3NCw4IEBACiAgICAgQWN0aXZpdHlNYW5hZ2VyIGFtOwogICAgIGFtLnJlZ2lzdGVyVWlkT2JzZXJ2ZXIodGhpcywgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfR09ORQogICAgICAgICAgICAgfCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9JRExFCi0gICAgICAgICAgICB8IEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX0FDVElWRSwKKyAgICAgICAgICAgIHwgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfQUNUSVZFCisgICAgICAgICAgICB8IEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX1BST0NTVEFURSwKICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOLAogICAgICAgICAgICAgU3RyaW5nMTYoImF1ZGlvc2VydmVyIikpOwogICAgIHN0YXR1c190IHJlcyA9IGFtLmxpbmtUb0RlYXRoKHRoaXMpOwpAQCAtNTE0LDYgKzc4NCw3IEBACiAgICAgICAgIG1PYnNlcnZlclJlZ2lzdGVyZWQgPSB0cnVlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dFKCJVaWRQb2xpY3k6OnJlZ2lzdGVyU2VsZiBsaW5rVG9EZWF0aCBmYWlsZWQ6ICVkIiwgcmVzKTsKKwogICAgICAgICBhbS51bnJlZ2lzdGVyVWlkT2JzZXJ2ZXIodGhpcyk7CiAgICAgfQogfQpAQCAtNTMyLDggKzgwMyw3IEBACiAgICAgbU9ic2VydmVyUmVnaXN0ZXJlZCA9IGZhbHNlOwogfQogCi1ib29sIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojppc1VpZEFjdGl2ZSh1aWRfdCB1aWQpIHsKLSAgICBpZiAoaXNTZXJ2aWNlVWlkKHVpZCkpIHJldHVybiB0cnVlOwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6Y2hlY2tSZWdpc3RlcmVkKCkgewogICAgIGJvb2wgbmVlZFRvUmVyZWdpc3RlciA9IGZhbHNlOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTU0MywxMDMgKzgxMywyMTIgQEAKICAgICAgICAgLy8gTG9va3MgbGlrZSBBY3Rpdml0eU1hbmFnZXIgaGFzIGRpZWQgcHJldmlvdXNseSwgYXR0ZW1wdCB0byByZS1yZWdpc3Rlci4KICAgICAgICAgcmVnaXN0ZXJTZWxmKCk7CiAgICAgfQorfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojppc1VpZEFjdGl2ZSh1aWRfdCB1aWQpIHsKKyAgICBpZiAoaXNTZXJ2aWNlVWlkKHVpZCkpIHJldHVybiB0cnVlOworICAgIGNoZWNrUmVnaXN0ZXJlZCgpOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAgICAgYXV0byBvdmVycmlkZUl0ZXIgPSBtT3ZlcnJpZGVVaWRzLmZpbmQodWlkKTsKICAgICAgICAgaWYgKG92ZXJyaWRlSXRlciAhPSBtT3ZlcnJpZGVVaWRzLmVuZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGVJdGVyLT5zZWNvbmQ7CisgICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGVJdGVyLT5zZWNvbmQuZmlyc3Q7CiAgICAgICAgIH0KICAgICAgICAgLy8gSW4gYW4gYWJzZW5zZSBvZiB0aGUgQWN0aXZpdHlNYW5hZ2VyLCBhc3N1bWUgZXZlcnl0aGluZyB0byBiZSBhY3RpdmUuCiAgICAgICAgIGlmICghbU9ic2VydmVyUmVnaXN0ZXJlZCkgcmV0dXJuIHRydWU7CiAgICAgICAgIGF1dG8gY2FjaGVJdGVyID0gbUNhY2hlZFVpZHMuZmluZCh1aWQpOwogICAgICAgICBpZiAoY2FjaGVJdGVyICE9IG1DYWNoZWRVaWRzLmVuZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gY2FjaGVJdGVyLT5zZWNvbmQ7CisgICAgICAgICAgICByZXR1cm4gY2FjaGVJdGVyLT5zZWNvbmQuZmlyc3Q7CiAgICAgICAgIH0KICAgICB9CiAgICAgQWN0aXZpdHlNYW5hZ2VyIGFtOwogICAgIGJvb2wgYWN0aXZlID0gYW0uaXNVaWRBY3RpdmUodWlkLCBTdHJpbmcxNigiYXVkaW9zZXJ2ZXIiKSk7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBtQ2FjaGVkVWlkcy5pbnNlcnQoc3RkOjpwYWlyPHVpZF90LCBib29sPih1aWQsIGFjdGl2ZSkpOworICAgICAgICBtQ2FjaGVkVWlkcy5pbnNlcnQoc3RkOjpwYWlyPHVpZF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwYWlyPGJvb2wsIGludD4+KHVpZCwgc3RkOjpwYWlyPGJvb2wsIGludD4oYWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04pKSk7CiAgICAgfQogICAgIHJldHVybiBhY3RpdmU7CiB9CiAKK2ludCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6Z2V0VWlkU3RhdGUodWlkX3QgdWlkKSB7CisgICAgaWYgKGlzU2VydmljZVVpZCh1aWQpKSB7CisgICAgICAgIHJldHVybiBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVE9QOworICAgIH0KKyAgICBjaGVja1JlZ2lzdGVyZWQoKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGF1dG8gb3ZlcnJpZGVJdGVyID0gbU92ZXJyaWRlVWlkcy5maW5kKHVpZCk7CisgICAgICAgIGlmIChvdmVycmlkZUl0ZXIgIT0gbU92ZXJyaWRlVWlkcy5lbmQoKSkgeworICAgICAgICAgICAgaWYgKG92ZXJyaWRlSXRlci0+c2Vjb25kLmZpcnN0KSB7CisgICAgICAgICAgICAgICAgaWYgKG92ZXJyaWRlSXRlci0+c2Vjb25kLnNlY29uZCAhPSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3ZlcnJpZGVJdGVyLT5zZWNvbmQuc2Vjb25kOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gY2FjaGVJdGVyID0gbUNhY2hlZFVpZHMuZmluZCh1aWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoY2FjaGVJdGVyICE9IG1DYWNoZWRVaWRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVJdGVyLT5zZWNvbmQuc2Vjb25kOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOOworICAgICAgICB9CisgICAgICAgIC8vIEluIGFuIGFic2Vuc2Ugb2YgdGhlIEFjdGl2aXR5TWFuYWdlciwgYXNzdW1lIGV2ZXJ5dGhpbmcgdG8gYmUgYWN0aXZlLgorICAgICAgICBpZiAoIW1PYnNlcnZlclJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgIHJldHVybiBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVE9QOworICAgICAgICB9CisgICAgICAgIGF1dG8gY2FjaGVJdGVyID0gbUNhY2hlZFVpZHMuZmluZCh1aWQpOworICAgICAgICBpZiAoY2FjaGVJdGVyICE9IG1DYWNoZWRVaWRzLmVuZCgpKSB7CisgICAgICAgICAgICBpZiAoY2FjaGVJdGVyLT5zZWNvbmQuZmlyc3QpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVJdGVyLT5zZWNvbmQuc2Vjb25kOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV047CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQWN0aXZpdHlNYW5hZ2VyIGFtOworICAgIGJvb2wgYWN0aXZlID0gYW0uaXNVaWRBY3RpdmUodWlkLCBTdHJpbmcxNigiYXVkaW9zZXJ2ZXIiKSk7CisgICAgaW50IHN0YXRlID0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV047CisgICAgaWYgKGFjdGl2ZSkgeworICAgICAgICBzdGF0ZSA9IGFtLmdldFVpZFByb2Nlc3NTdGF0ZSh1aWQsIFN0cmluZzE2KCJhdWRpb3NlcnZlciIpKTsKKyAgICB9CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBtQ2FjaGVkVWlkcy5pbnNlcnQoc3RkOjpwYWlyPHVpZF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwYWlyPGJvb2wsIGludD4+KHVpZCwgc3RkOjpwYWlyPGJvb2wsIGludD4oYWN0aXZlLCBzdGF0ZSkpKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdGU7Cit9CisKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6Om9uVWlkQWN0aXZlKHVpZF90IHVpZCkgewotICAgIHVwZGF0ZVVpZENhY2hlKHVpZCwgdHJ1ZSwgdHJ1ZSk7CisgICAgdXBkYXRlVWlkKCZtQ2FjaGVkVWlkcywgdWlkLCB0cnVlLCBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTiwgdHJ1ZSk7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6Om9uVWlkR29uZSh1aWRfdCB1aWQsIF9fdW51c2VkIGJvb2wgZGlzYWJsZWQpIHsKLSAgICB1cGRhdGVVaWRDYWNoZSh1aWQsIGZhbHNlLCBmYWxzZSk7CisgICAgdXBkYXRlVWlkKCZtQ2FjaGVkVWlkcywgdWlkLCBmYWxzZSwgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04sIGZhbHNlKTsKIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6b25VaWRJZGxlKHVpZF90IHVpZCwgX191bnVzZWQgYm9vbCBkaXNhYmxlZCkgewotICAgIHVwZGF0ZVVpZENhY2hlKHVpZCwgZmFsc2UsIHRydWUpOworICAgIHVwZGF0ZVVpZCgmbUNhY2hlZFVpZHMsIHVpZCwgZmFsc2UsIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOLCB0cnVlKTsKIH0KIAotYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6aXNTZXJ2aWNlVWlkKHVpZF90IHVpZCkgY29uc3QgewotICAgIHJldHVybiBtdWx0aXVzZXJfZ2V0X2FwcF9pZCh1aWQpIDwgQUlEX0FQUF9TVEFSVDsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6bm90aWZ5U2VydmljZSh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlKSB7Ci0gICAgc3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBzZXJ2aWNlID0gbVNlcnZpY2UucHJvbW90ZSgpOwotICAgIGlmIChzZXJ2aWNlICE9IG51bGxwdHIpIHsKLSAgICAgICAgc2VydmljZS0+c2V0UmVjb3JkU2lsZW5jZWQodWlkLCAhYWN0aXZlKTsKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6Om9uVWlkU3RhdGVDaGFuZ2VkKHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJvY1N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwcm9jU3RhdGVTZXEgX191bnVzZWQpIHsKKyAgICBpZiAocHJvY1N0YXRlICE9IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOKSB7CisgICAgICAgIHVwZGF0ZVVpZCgmbUNhY2hlZFVpZHMsIHVpZCwgdHJ1ZSwgcHJvY1N0YXRlLCB0cnVlKTsKICAgICB9CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OnVwZGF0ZU92ZXJyaWRlVWlkKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGJvb2wgaW5zZXJ0KSB7Ci0gICAgaWYgKGlzU2VydmljZVVpZCh1aWQpKSByZXR1cm47Ci0gICAgYm9vbCB3YXNPdmVycmlkZGVuID0gZmFsc2UsIHdhc0FjdGl2ZSA9IGZhbHNlOwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgdXBkYXRlVWlkTG9ja2VkKCZtT3ZlcnJpZGVVaWRzLCB1aWQsIGFjdGl2ZSwgaW5zZXJ0LCAmd2FzT3ZlcnJpZGRlbiwgJndhc0FjdGl2ZSk7Ci0gICAgfQotICAgIGlmICghd2FzT3ZlcnJpZGRlbiAmJiBpbnNlcnQpIHsKLSAgICAgICAgbm90aWZ5U2VydmljZSh1aWQsIGFjdGl2ZSk7ICAvLyBTdGFydGVkIHRvIG92ZXJyaWRlLgotICAgIH0gZWxzZSBpZiAod2FzT3ZlcnJpZGRlbiAmJiAhaW5zZXJ0KSB7Ci0gICAgICAgIG5vdGlmeVNlcnZpY2UodWlkLCBpc1VpZEFjdGl2ZSh1aWQpKTsgIC8vIE92ZXJyaWRlIGNlYXNlZCwgbm90aWZ5IHdpdGggZ3JvdW5kIHRydXRoLgotICAgIH0gZWxzZSBpZiAod2FzQWN0aXZlICE9IGFjdGl2ZSkgewotICAgICAgICBub3RpZnlTZXJ2aWNlKHVpZCwgYWN0aXZlKTsgIC8vIE92ZXJyaWRlIHVwZGF0ZWQuCisgICAgdXBkYXRlVWlkKCZtT3ZlcnJpZGVVaWRzLCB1aWQsIGFjdGl2ZSwgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04sIGluc2VydCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6Om5vdGlmeVNlcnZpY2UoKSB7CisgICAgc3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBzZXJ2aWNlID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgIGlmIChzZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgc2VydmljZS0+dXBkYXRlVWlkU3RhdGVzKCk7CiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojp1cGRhdGVVaWRDYWNoZSh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBib29sIGluc2VydCkgewotICAgIGlmIChpc1NlcnZpY2VVaWQodWlkKSkgcmV0dXJuOwotICAgIGJvb2wgd2FzQWN0aXZlID0gZmFsc2U7Cit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojp1cGRhdGVVaWQoc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxib29sLCBpbnQ+PiAqdWlkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5zZXJ0KSB7CisgICAgaWYgKGlzU2VydmljZVVpZCh1aWQpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYm9vbCB3YXNBY3RpdmUgPSBpc1VpZEFjdGl2ZSh1aWQpOworICAgIGludCBwcmV2aW91c1N0YXRlID0gZ2V0VWlkU3RhdGUodWlkKTsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIHVwZGF0ZVVpZExvY2tlZCgmbUNhY2hlZFVpZHMsIHVpZCwgYWN0aXZlLCBpbnNlcnQsIG51bGxwdHIsICZ3YXNBY3RpdmUpOwotICAgICAgICAvLyBEbyBub3Qgbm90aWZ5IHNlcnZpY2UgaWYgY3VycmVudGx5IG92ZXJyaWRkZW4uCi0gICAgICAgIGlmIChtT3ZlcnJpZGVVaWRzLmZpbmQodWlkKSAhPSBtT3ZlcnJpZGVVaWRzLmVuZCgpKSByZXR1cm47CisgICAgICAgIHVwZGF0ZVVpZExvY2tlZCh1aWRzLCB1aWQsIGFjdGl2ZSwgc3RhdGUsIGluc2VydCk7CiAgICAgfQotICAgIGJvb2wgbm93QWN0aXZlID0gYWN0aXZlICYmIGluc2VydDsKLSAgICBpZiAod2FzQWN0aXZlICE9IG5vd0FjdGl2ZSkgbm90aWZ5U2VydmljZSh1aWQsIG5vd0FjdGl2ZSk7CisgICAgaWYgKHdhc0FjdGl2ZSAhPSBpc1VpZEFjdGl2ZSh1aWQpIHx8IHN0YXRlICE9IHByZXZpb3VzU3RhdGUpIHsKKyAgICAgICAgbm90aWZ5U2VydmljZSgpOworICAgIH0KIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6dXBkYXRlVWlkTG9ja2VkKHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgYm9vbD4gKnVpZHMsCi0gICAgICAgIHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGJvb2wgaW5zZXJ0LCBib29sICp3YXNUaGVyZSwgYm9vbCAqd2FzQWN0aXZlKSB7Cit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojp1cGRhdGVVaWRMb2NrZWQoc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxib29sLCBpbnQ+PiAqdWlkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhY3RpdmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW5zZXJ0KSB7CiAgICAgYXV0byBpdCA9IHVpZHMtPmZpbmQodWlkKTsKICAgICBpZiAoaXQgIT0gdWlkcy0+ZW5kKCkpIHsKLSAgICAgICAgaWYgKHdhc1RoZXJlICE9IG51bGxwdHIpICp3YXNUaGVyZSA9IHRydWU7Ci0gICAgICAgIGlmICh3YXNBY3RpdmUgIT0gbnVsbHB0cikgKndhc0FjdGl2ZSA9IGl0LT5zZWNvbmQ7CiAgICAgICAgIGlmIChpbnNlcnQpIHsKLSAgICAgICAgICAgIGl0LT5zZWNvbmQgPSBhY3RpdmU7CisgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04pIHsKKyAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLmZpcnN0ID0gYWN0aXZlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGl0LT5zZWNvbmQuZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLnNlY29uZCA9IHN0YXRlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLnNlY29uZCA9IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOOworICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgdWlkcy0+ZXJhc2UoaXQpOwogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChpbnNlcnQpIHsKLSAgICAgICAgdWlkcy0+aW5zZXJ0KHN0ZDo6cGFpcjx1aWRfdCwgYm9vbD4odWlkLCBhY3RpdmUpKTsKKyAgICB9IGVsc2UgaWYgKGluc2VydCAmJiAoc3RhdGUgPT0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04pKSB7CisgICAgICAgIHVpZHMtPmluc2VydChzdGQ6OnBhaXI8dWlkX3QsIHN0ZDo6cGFpcjxib29sLCBpbnQ+Pih1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxib29sLCBpbnQ+KGFjdGl2ZSwgc3RhdGUpKSk7CiAgICAgfQogfQogCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojppc0ExMXlPblRvcCgpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnVpZCA6IG1DYWNoZWRVaWRzKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpZF90Pjo6aXRlcmF0b3IgaXQgPSBmaW5kKG1BMTF5VWlkcy5iZWdpbigpLCBtQTExeVVpZHMuZW5kKCksIHVpZC5maXJzdCk7CisgICAgICAgIGlmIChpdCA9PSBtQTExeVVpZHMuZW5kKCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICh1aWQuc2Vjb25kLnNlY29uZCA+PSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVE9QCisgICAgICAgICAgICAgICAgJiYgdWlkLnNlY29uZC5zZWNvbmQgPD0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX0JPVU5EX0ZPUkVHUk9VTkRfU0VSVklDRSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojppc0ExMXlVaWQodWlkX3QgdWlkKQoreworICAgIHN0ZDo6dmVjdG9yPHVpZF90Pjo6aXRlcmF0b3IgaXQgPSBmaW5kKG1BMTF5VWlkcy5iZWdpbigpLCBtQTExeVVpZHMuZW5kKCksIHVpZCk7CisgICAgcmV0dXJuIGl0ICE9IG1BMTF5VWlkcy5lbmQoKTsKK30KKworLy8gLS0tLS0tLS0tLS0gIEF1ZGlvUG9saWN5U2VydmljZTo6U2Vuc29yUHJpdmFjeVNlcnZpY2UgaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLQordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6OnJlZ2lzdGVyU2VsZigpIHsKKyAgICBTZW5zb3JQcml2YWN5TWFuYWdlciBzcG07CisgICAgbVNlbnNvclByaXZhY3lFbmFibGVkID0gc3BtLmlzU2Vuc29yUHJpdmFjeUVuYWJsZWQoKTsKKyAgICBzcG0uYWRkU2Vuc29yUHJpdmFjeUxpc3RlbmVyKHRoaXMpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6dW5yZWdpc3RlclNlbGYoKSB7CisgICAgU2Vuc29yUHJpdmFjeU1hbmFnZXIgc3BtOworICAgIHNwbS5yZW1vdmVTZW5zb3JQcml2YWN5TGlzdGVuZXIodGhpcyk7Cit9CisKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5Ojppc1NlbnNvclByaXZhY3lFbmFibGVkKCkgeworICAgIHJldHVybiBtU2Vuc29yUHJpdmFjeUVuYWJsZWQ7Cit9CisKK2JpbmRlcjo6U3RhdHVzIEF1ZGlvUG9saWN5U2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6b25TZW5zb3JQcml2YWN5Q2hhbmdlZChib29sIGVuYWJsZWQpIHsKKyAgICBtU2Vuc29yUHJpdmFjeUVuYWJsZWQgPSBlbmFibGVkOworICAgIHNwPEF1ZGlvUG9saWN5U2VydmljZT4gc2VydmljZSA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoc2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHNlcnZpY2UtPnVwZGF0ZVVpZFN0YXRlcygpOworICAgIH0KKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKIC8vIC0tLS0tLS0tLS0tICBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZCBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tCiAKIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpBdWRpb0NvbW1hbmRUaHJlYWQoU3RyaW5nOCBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3cDxBdWRpb1BvbGljeVNlcnZpY2U+JiBzZXJ2aWNlKQogICAgIDogVGhyZWFkKGZhbHNlKSwgbU5hbWUobmFtZSksIG1TZXJ2aWNlKHNlcnZpY2UpCiB7Ci0gICAgbXBUb25lR2VuZXJhdG9yID0gTlVMTDsKIH0KIAogCkBAIC02NDksNyArMTAyOCw2IEBACiAgICAgICAgIHJlbGVhc2Vfd2FrZV9sb2NrKG1OYW1lLnN0cmluZygpKTsKICAgICB9CiAgICAgbUF1ZGlvQ29tbWFuZHMuY2xlYXIoKTsKLSAgICBkZWxldGUgbXBUb25lR2VuZXJhdG9yOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpvbkZpcnN0UmVmKCkKQEAgLTY3NCw2OCArMTA1Miw1NCBAQAogICAgICAgICAgICAgICAgIG1MYXN0Q29tbWFuZCA9IGNvbW1hbmQ7CiAKICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbW1hbmQtPm1Db21tYW5kKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVEFSVF9UT05FOiB7Ci0gICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgICAgICAgICBUb25lRGF0YSAqZGF0YSA9IChUb25lRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc3RhcnQgdG9uZSAlZCBvbiBzdHJlYW0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1UeXBlLCBkYXRhLT5tU3RyZWFtKTsKLSAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1wVG9uZUdlbmVyYXRvcjsKLSAgICAgICAgICAgICAgICAgICAgbXBUb25lR2VuZXJhdG9yID0gbmV3IFRvbmVHZW5lcmF0b3IoZGF0YS0+bVN0cmVhbSwgMS4wKTsKLSAgICAgICAgICAgICAgICAgICAgbXBUb25lR2VuZXJhdG9yLT5zdGFydFRvbmUoZGF0YS0+bVR5cGUpOwotICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIH1icmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNUT1BfVE9ORTogewotICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc3RvcCB0b25lIik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtcFRvbmVHZW5lcmF0b3IgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbXBUb25lR2VuZXJhdG9yLT5zdG9wVG9uZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1wVG9uZUdlbmVyYXRvcjsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1wVG9uZUdlbmVyYXRvciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBTRVRfVk9MVU1FOiB7CiAgICAgICAgICAgICAgICAgICAgIFZvbHVtZURhdGEgKmRhdGEgPSAoVm9sdW1lRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc2V0IHZvbHVtZSBzdHJlYW0gJWQsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWUgJWYsIG91dHB1dCAlZCIsIGRhdGEtPm1TdHJlYW0sIGRhdGEtPm1Wb2x1bWUsIGRhdGEtPm1JTyk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gQXVkaW9TeXN0ZW06OnNldFN0cmVhbVZvbHVtZShkYXRhLT5tU3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tVm9sdW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFNFVF9QQVJBTUVURVJTOiB7CiAgICAgICAgICAgICAgICAgICAgIFBhcmFtZXRlcnNEYXRhICpkYXRhID0gKFBhcmFtZXRlcnNEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOwogICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgcGFyYW1ldGVycyBzdHJpbmcgJXMsIGlvICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tS2V5VmFsdWVQYWlycy5zdHJpbmcoKSwgZGF0YS0+bUlPKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBBdWRpb1N5c3RlbTo6c2V0UGFyYW1ldGVycyhkYXRhLT5tSU8sIGRhdGEtPm1LZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBTRVRfVk9JQ0VfVk9MVU1FOiB7CiAgICAgICAgICAgICAgICAgICAgIFZvaWNlVm9sdW1lRGF0YSAqZGF0YSA9IChWb2ljZVZvbHVtZURhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHNldCB2b2ljZSB2b2x1bWUgdm9sdW1lICVmIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tVm9sdW1lKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBBdWRpb1N5c3RlbTo6c2V0Vm9pY2VWb2x1bWUoZGF0YS0+bVZvbHVtZSk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU1RPUF9PVVRQVVQ6IHsKICAgICAgICAgICAgICAgICAgICAgU3RvcE91dHB1dERhdGEgKmRhdGEgPSAoU3RvcE91dHB1dERhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHN0b3Agb3V0cHV0ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzdG9wIG91dHB1dCBwb3J0SWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1Qb3J0SWQpOwogICAgICAgICAgICAgICAgICAgICBzdmMgPSBtU2VydmljZS5wcm9tb3RlKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzdmMgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9TdG9wT3V0cHV0KGRhdGEtPm1JTywgZGF0YS0+bVN0cmVhbSwgZGF0YS0+bVNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICBzdmMtPmRvU3RvcE91dHB1dChkYXRhLT5tUG9ydElkKTsKICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBSRUxFQVNFX09VVFBVVDogewogICAgICAgICAgICAgICAgICAgICBSZWxlYXNlT3V0cHV0RGF0YSAqZGF0YSA9IChSZWxlYXNlT3V0cHV0RGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3NpbmcgcmVsZWFzZSBvdXRwdXQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1JTyk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHJlbGVhc2Ugb3V0cHV0IHBvcnRJZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVBvcnRJZCk7CiAgICAgICAgICAgICAgICAgICAgIHN2YyA9IG1TZXJ2aWNlLnByb21vdGUoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHN2YyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb1JlbGVhc2VPdXRwdXQoZGF0YS0+bUlPLCBkYXRhLT5tU3RyZWFtLCBkYXRhLT5tU2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9SZWxlYXNlT3V0cHV0KGRhdGEtPm1Qb3J0SWQpOwogICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICBjYXNlIENSRUFURV9BVURJT19QQVRDSDogewpAQCAtNzQ1LDcgKzExMDksOSBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoYWYgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gYWYtPmNyZWF0ZUF1ZGlvUGF0Y2goJmRhdGEtPm1QYXRjaCwgJmRhdGEtPm1IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBSRUxFQVNFX0FVRElPX1BBVENIOiB7CkBAIC03NTUsNyArMTEyMSw5IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChhZiA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBhZi0+cmVsZWFzZUF1ZGlvUGF0Y2goZGF0YS0+bUhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFVQREFURV9BVURJT1BPUlRfTElTVDogewpAQCAtNzc4LDYgKzExNDYsMTggQEAKICAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb09uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDSEFOR0VEX0FVRElPVk9MVU1FR1JPVVA6IHsKKyAgICAgICAgICAgICAgICAgICAgQXVkaW9Wb2x1bWVHcm91cERhdGEgKmRhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEF1ZGlvVm9sdW1lR3JvdXBEYXRhICo+KGNvbW1hbmQtPm1QYXJhbS5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHVwZGF0ZSBhdWRpbyB2b2x1bWUgZ3JvdXAiKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3ZjID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICBzdmMtPmRvT25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZChkYXRhLT5tR3JvdXAsIGRhdGEtPm1GbGFncyk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU0VUX0FVRElPUE9SVF9DT05GSUc6IHsKICAgICAgICAgICAgICAgICAgICAgU2V0QXVkaW9Qb3J0Q29uZmlnRGF0YSAqZGF0YSA9IChTZXRBdWRpb1BvcnRDb25maWdEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOwogICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgcG9ydCBjb25maWciKTsKQEAgLTc4NSw3ICsxMTY1LDkgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGFmID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IGFmLT5zZXRBdWRpb1BvcnRDb25maWcoJmRhdGEtPm1Db25maWcpOworICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBEWU5fUE9MSUNZX01JWF9TVEFURV9VUERBVEU6IHsKQEAgLTgxMSwxMCArMTE5MywyMiBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgICAgICBzdmMtPmRvT25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGRhdGEtPm1FdmVudCwgJmRhdGEtPm1DbGllbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLT5tQ2xpZW50Q29uZmlnLCAmZGF0YS0+bURldmljZUNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tUGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhLT5tQ2xpZW50Q29uZmlnLCBkYXRhLT5tQ2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YS0+bURldmljZUNvbmZpZywgZGF0YS0+bUVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVBhdGNoSGFuZGxlLCBkYXRhLT5tU291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgU0VUX0VGRkVDVF9TVVNQRU5ERUQ6IHsKKyAgICAgICAgICAgICAgICAgICAgU2V0RWZmZWN0U3VzcGVuZGVkRGF0YSAqZGF0YSA9IChTZXRFZmZlY3RTdXNwZW5kZWREYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgZWZmZWN0IHN1c3BlbmRlZCIpOworICAgICAgICAgICAgICAgICAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhZi0+c2V0RWZmZWN0U3VzcGVuZGVkKGRhdGEtPm1FZmZlY3RJZCwgZGF0YS0+bVNlc3Npb25JZCwgZGF0YS0+bVN1c3BlbmRlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKKwogICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSB1bmtub3duIGNvbW1hbmQgJWQiLCBjb21tYW5kLT5tQ29tbWFuZCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtODcyLDcgKzEyNjYsNyBAQAogICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKIAotICAgIGJvb2wgbG9ja2VkID0gdHJ5TG9jayhtTG9jayk7CisgICAgYm9vbCBsb2NrZWQgPSBkdW1wVHJ5TG9jayhtTG9jayk7CiAgICAgaWYgKCFsb2NrZWQpIHsKICAgICAgICAgU3RyaW5nOCByZXN1bHQyKGtDbWREZWFkbG9ja2VkU3RyaW5nKTsKICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdDIuc3RyaW5nKCksIHJlc3VsdDIuc2l6ZSgpKTsKQEAgLTkwMCwyNyArMTI5NCw2IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzdGFydFRvbmVDb21tYW5kKFRvbmVHZW5lcmF0b3I6OnRvbmVfdHlwZSB0eXBlLAotICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLXsKLSAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7Ci0gICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTVEFSVF9UT05FOwotICAgIHNwPFRvbmVEYXRhPiBkYXRhID0gbmV3IFRvbmVEYXRhKCk7Ci0gICAgZGF0YS0+bVR5cGUgPSB0eXBlOwotICAgIGRhdGEtPm1TdHJlYW0gPSBzdHJlYW07Ci0gICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKLSAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHRvbmUgc3RhcnQgdHlwZSAlZCwgc3RyZWFtICVkIiwgdHlwZSwgc3RyZWFtKTsKLSAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKLX0KLQotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c3RvcFRvbmVDb21tYW5kKCkKLXsKLSAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7Ci0gICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTVE9QX1RPTkU7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyB0b25lIHN0b3AiKTsKLSAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKLX0KLQogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnZvbHVtZUNvbW1hbmQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCkBAIC05NjcsMzMgKzEzNDAsNDIgQEAKICAgICByZXR1cm4gc2VuZENvbW1hbmQoY29tbWFuZCwgZGVsYXlNcyk7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnN0b3BPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzZXRFZmZlY3RTdXNwZW5kZWRDb21tYW5kKGludCBlZmZlY3RJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdXNwZW5kZWQpCit7CisgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOworICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU0VUX0VGRkVDVF9TVVNQRU5ERUQ7CisgICAgc3A8U2V0RWZmZWN0U3VzcGVuZGVkRGF0YT4gZGF0YSA9IG5ldyBTZXRFZmZlY3RTdXNwZW5kZWREYXRhKCk7CisgICAgZGF0YS0+bUVmZmVjdElkID0gZWZmZWN0SWQ7CisgICAgZGF0YS0+bVNlc3Npb25JZCA9IHNlc3Npb25JZDsKKyAgICBkYXRhLT5tU3VzcGVuZGVkID0gc3VzcGVuZGVkOworICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBzZXQgc3VzcGVuZGVkIGVmZmVjdElkICVkIHNlc3Npb25JZCAlZCBzdXNwZW5kZWQgJWQiLAorICAgICAgICBlZmZlY3RJZCwgc2Vzc2lvbklkLCBzdXNwZW5kZWQpOworICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOworfQorCisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnN0b3BPdXRwdXRDb21tYW5kKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKICAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFNUT1BfT1VUUFVUOwogICAgIHNwPFN0b3BPdXRwdXREYXRhPiBkYXRhID0gbmV3IFN0b3BPdXRwdXREYXRhKCk7Ci0gICAgZGF0YS0+bUlPID0gb3V0cHV0OwotICAgIGRhdGEtPm1TdHJlYW0gPSBzdHJlYW07Ci0gICAgZGF0YS0+bVNlc3Npb24gPSBzZXNzaW9uOworICAgIGRhdGEtPm1Qb3J0SWQgPSBwb3J0SWQ7CiAgICAgY29tbWFuZC0+bVBhcmFtID0gZGF0YTsKLSAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHN0b3Agb3V0cHV0ICVkIiwgb3V0cHV0KTsKKyAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgYWRkaW5nIHN0b3Agb3V0cHV0IHBvcnRJZCAlZCIsIHBvcnRJZCk7CiAgICAgc2VuZENvbW1hbmQoY29tbWFuZCk7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnJlbGVhc2VPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpyZWxlYXNlT3V0cHV0Q29tbWFuZChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CiAgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBSRUxFQVNFX09VVFBVVDsKICAgICBzcDxSZWxlYXNlT3V0cHV0RGF0YT4gZGF0YSA9IG5ldyBSZWxlYXNlT3V0cHV0RGF0YSgpOwotICAgIGRhdGEtPm1JTyA9IG91dHB1dDsKLSAgICBkYXRhLT5tU3RyZWFtID0gc3RyZWFtOwotICAgIGRhdGEtPm1TZXNzaW9uID0gc2Vzc2lvbjsKKyAgICBkYXRhLT5tUG9ydElkID0gcG9ydElkOwogICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyByZWxlYXNlIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyByZWxlYXNlIG91dHB1dCBwb3J0SWQgJWQiLCBwb3J0SWQpOwogICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOwogfQogCkBAIC0xMDQ4LDYgKzE0MzAsMTkgQEAKICAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKIH0KIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6Y2hhbmdlQXVkaW9Wb2x1bWVHcm91cENvbW1hbmQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpCit7CisgICAgc3A8QXVkaW9Db21tYW5kPmNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CisgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBDSEFOR0VEX0FVRElPVk9MVU1FR1JPVVA7CisgICAgQXVkaW9Wb2x1bWVHcm91cERhdGEgKmRhdGE9IG5ldyBBdWRpb1ZvbHVtZUdyb3VwRGF0YSgpOworICAgIGRhdGEtPm1Hcm91cCA9IGdyb3VwOworICAgIGRhdGEtPm1GbGFncyA9IGZsYWdzOworICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBhdWRpbyB2b2x1bWUgZ3JvdXAgY2hhbmdlZCIpOworICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOworfQorCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c2V0QXVkaW9Qb3J0Q29uZmlnQ29tbWFuZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsIGludCBkZWxheU1zKQogewpAQCAtMTA3Niw5ICsxNDcxLDE0IEBACiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGVDb21tYW5kKAotICAgICAgICBpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpCiB7CiAgICAgc3A8QXVkaW9Db21tYW5kPmNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CiAgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBSRUNPUkRJTkdfQ09ORklHVVJBVElPTl9VUERBVEU7CkBAIC0xMDg2LDggKzE0ODYsMTEgQEAKICAgICBkYXRhLT5tRXZlbnQgPSBldmVudDsKICAgICBkYXRhLT5tQ2xpZW50SW5mbyA9ICpjbGllbnRJbmZvOwogICAgIGRhdGEtPm1DbGllbnRDb25maWcgPSAqY2xpZW50Q29uZmlnOworICAgIGRhdGEtPm1DbGllbnRFZmZlY3RzID0gY2xpZW50RWZmZWN0czsKICAgICBkYXRhLT5tRGV2aWNlQ29uZmlnID0gKmRldmljZUNvbmZpZzsKKyAgICBkYXRhLT5tRWZmZWN0cyA9IGVmZmVjdHM7CiAgICAgZGF0YS0+bVBhdGNoSGFuZGxlID0gcGF0Y2hIYW5kbGU7CisgICAgZGF0YS0+bVNvdXJjZSA9IHNvdXJjZTsKICAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOwogICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgcmVjb3JkaW5nIGNvbmZpZ3VyYXRpb24gdXBkYXRlIGV2ZW50ICVkLCBzb3VyY2UgJWQgdWlkICV1IiwKICAgICAgICAgICAgIGV2ZW50LCBjbGllbnRJbmZvLT5zb3VyY2UsIGNsaWVudEluZm8tPnVpZCk7CkBAIC0xMjEyLDYgKzE2MTUsNyBAQAogICAgICAgICAgICAgICAgIHBhdGNoID0gKChDcmVhdGVBdWRpb1BhdGNoRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKSktPm1QYXRjaDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaGFuZGxlID0gKChSZWxlYXNlQXVkaW9QYXRjaERhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCkpLT5tSGFuZGxlOworICAgICAgICAgICAgICAgIG1lbXNldCgmcGF0Y2gsIDAsIHNpemVvZihwYXRjaCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlMjsKICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDI7CkBAIC0xMjU2LDggKzE2NjAsNiBAQAogCiAgICAgICAgIH0gYnJlYWs7CiAKLSAgICAgICAgY2FzZSBTVEFSVF9UT05FOgotICAgICAgICBjYXNlIFNUT1BfVE9ORToKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMzMwLDMyICsxNzMyLDE5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsIGRlbGF5TXMpOwogfQogCi1pbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIGlmICh0b25lICE9IEFVRElPX1BPTElDWV9UT05FX0lOX0NBTExfTk9USUZJQ0FUSU9OKSB7Ci0gICAgICAgIEFMT0dFKCJzdGFydFRvbmU6IGlsbGVnYWwgdG9uZSByZXF1ZXN0ZWQgKCVkKSIsIHRvbmUpOwotICAgIH0KLSAgICBpZiAoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSB7Ci0gICAgICAgIEFMT0dFKCJzdGFydFRvbmU6IGlsbGVnYWwgc3RyZWFtICglZCkgcmVxdWVzdGVkIGZvciB0b25lICVkIiwgc3RyZWFtLAotICAgICAgICAgICAgdG9uZSk7Ci0gICAgfQotICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPnN0YXJ0VG9uZUNvbW1hbmQoVG9uZUdlbmVyYXRvcjo6VE9ORV9TVVBfQ0FMTF9XQUlUSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wVG9uZSgpCi17Ci0gICAgbVRvbmVQbGF5YmFja1RocmVhZC0+c3RvcFRvbmVDb21tYW5kKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KIGludCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMpCiB7CiAgICAgcmV0dXJuIChpbnQpbUF1ZGlvQ29tbWFuZFRocmVhZC0+dm9pY2VWb2x1bWVDb21tYW5kKHZvbHVtZSwgZGVsYXlNcyk7CiB9CiAKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRFZmZlY3RTdXNwZW5kZWQoaW50IGVmZmVjdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1c3BlbmRlZCkKK3sKKyAgICBtQXVkaW9Db21tYW5kVGhyZWFkLT5zZXRFZmZlY3RTdXNwZW5kZWRDb21tYW5kKGVmZmVjdElkLCBzZXNzaW9uSWQsIHN1c3BlbmRlZCk7Cit9CisKKwogZXh0ZXJuICJDIiB7CiBhdWRpb19tb2R1bGVfaGFuZGxlX3QgYXBzX2xvYWRfaHdfbW9kdWxlKHZvaWQgKnNlcnZpY2UgX191bnVzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKTsKQEAgLTE0MDYsOSArMTc5NSw2IEBACiBpbnQgYXBzX3NldF9zdHJlYW1fdm9sdW1lKHZvaWQgKnNlcnZpY2UsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheV9tcyk7Ci1pbnQgYXBzX3N0YXJ0X3RvbmUodm9pZCAqc2VydmljZSwgYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotaW50IGFwc19zdG9wX3RvbmUodm9pZCAqc2VydmljZSk7CiBpbnQgYXBzX3NldF92b2ljZV92b2x1bWUodm9pZCAqc2VydmljZSwgZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlfbXMpOwogfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKaW5kZXggNDA3ZDdhNS4uOGRiNjNhNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oCkBAIC0zMSwxNSArMzEsMTUgQEAKICNpbmNsdWRlIDxtZWRpYS9Ub25lR2VuZXJhdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5RWZmZWN0cy5oIgotI2luY2x1ZGUgIm1hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oIgorI2luY2x1ZGUgPEF1ZGlvUG9saWN5SW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9CblNlbnNvclByaXZhY3lMaXN0ZW5lci5oPgogCiAjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi11c2luZyBuYW1lc3BhY2Ugc3RkOwotCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGNsYXNzIEF1ZGlvUG9saWN5U2VydmljZSA6CkBAIC02MiwzOCArNjIsMzYgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCk7CiAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZyk7CiAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSk7CiAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRyKGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gKnNlY29uZGFyeU91dHB1dHMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgcmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLApAQCAtMTAyLDggKzEwMCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnNpbGVuY2VkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCkBAIC0xMTYsNiArMTEzLDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWluVm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCk7CisKICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKIApAQCAtMTI3LDYgKzEzNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlckVmZmVjdChpbnQgaWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCk7CisgICAgc3RhdHVzX3QgbW92ZUVmZmVjdHNUb0lvKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIGlkcywgYXVkaW9faW9faGFuZGxlX3QgaW8pIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKICAgICB2aXJ0dWFsIGJvb2wgaXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKICAgICB2aXJ0dWFsIGJvb2wgaXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdDsKQEAgLTEzNCw2ICsxNDMsMjEgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU3RyZWFtRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCk7CisKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBvblRyYW5zYWN0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwmIGRhdGEsCkBAIC0xNTksMTAgKzE4MywxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BUb25lKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zID0gMCk7CisgICAgc3RhdHVzX3Qgc2V0QWxsb3dlZENhcHR1cmVQb2xpY3kodWludF90IHVpZCwgYXVkaW9fZmxhZ3NfbWFza190IGNhcHR1cmVQb2xpY3kpIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgYm9vbCBpc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgJmNvbmZpZyk7CisgICAgdmlydHVhbCBib29sIGlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCkBAIC0xODIsNiArMjA3LDggQEAKIAogICAgIHZpcnR1YWwgdm9pZCBzZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGJvb2wgZW5hYmxlZCk7CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgYWNxdWlyZVNvdW5kVHJpZ2dlclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90ICpzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZSk7CkBAIC0xOTIsMTAgKzIxOSwxNCBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlclBvbGljeU1peGVzKGNvbnN0IFZlY3RvcjxBdWRpb01peD4mIG1peGVzLCBib29sIHJlZ2lzdHJhdGlvbik7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLCBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCk7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck1vbm8oYm9vbCBtb25vKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck1vbm8oYm9vbCAqbW9ubyk7CkBAIC0yMDcsMTQgKzIzOCwyNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpzdXJyb3VuZEZvcm1hdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqc3Vycm91bmRGb3JtYXRzRW5hYmxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcG9ydGVkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwgYm9vbCBlbmFibGVkKTsKIAotICAgICAgICAgICAgc3RhdHVzX3QgZG9TdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgICAgICAgICB2b2lkIGRvUmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QTExeVNlcnZpY2VzVWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpOworCisgICAgdmlydHVhbCBib29sICAgICBpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90ICZwcm9kdWN0U3RyYXRlZ3kpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Wb2x1bWVHcm91cHMoQXVkaW9Wb2x1bWVHcm91cFZlY3RvciAmZ3JvdXBzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Vm9sdW1lR3JvdXBGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lX2dyb3VwX3QgJnZvbHVtZUdyb3VwKTsKKworICAgICAgICAgICAgc3RhdHVzX3QgZG9TdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKyAgICAgICAgICAgIHZvaWQgZG9SZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAogICAgICAgICAgICAgc3RhdHVzX3QgY2xpZW50Q3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLApAQCAtMjI0LDcgKzI2Nyw3IEBACiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNsaWVudFNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKTsKIAotICAgICAgICAgICAgdm9pZCByZW1vdmVOb3RpZmljYXRpb25DbGllbnQodWlkX3QgdWlkKTsKKyAgICAgICAgICAgIHZvaWQgcmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KHVpZF90IHVpZCwgcGlkX3QgcGlkKTsKICAgICAgICAgICAgIHZvaWQgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CiAgICAgICAgICAgICB2b2lkIGRvT25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CiAgICAgICAgICAgICB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKQEAgLTIzMiwxMiArMjc1LDI4IEBACiAKICAgICAgICAgICAgIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoY29uc3QgU3RyaW5nOCYgcmVnSWQsIGludDMyX3Qgc3RhdGUpOwogICAgICAgICAgICAgdm9pZCBkb09uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKLSAgICAgICAgICAgIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICB2b2lkIGRvT25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpOworICAgICAgICAgICAgdm9pZCBkb09uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CisKKyAgICAgICAgICAgIHZvaWQgb25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwgaW50IGZsYWdzKTsKKyAgICAgICAgICAgIHZvaWQgZG9PbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLCBpbnQgZmxhZ3MpOworICAgICAgICAgICAgdm9pZCBzZXRFZmZlY3RTdXNwZW5kZWQoaW50IGVmZmVjdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VzcGVuZGVkKTsKIAogcHJpdmF0ZToKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5U2VydmljZSgpIEFORFJPSURfQVBJOwpAQCAtMjQ5LDcgKzMwOCw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBzaGVsbENvbW1hbmQoaW50IGluLCBpbnQgb3V0LCBpbnQgZXJyLCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAogICAgIC8vIFNldHMgd2hldGhlciB0aGUgZ2l2ZW4gVUlEIHJlY29yZHMgb25seSBzaWxlbmNlCi0gICAgdmlydHVhbCB2b2lkIHNldFJlY29yZFNpbGVuY2VkKHVpZF90IHVpZCwgYm9vbCBzaWxlbmNlZCk7CisgICAgdmlydHVhbCB2b2lkIHNldEFwcFN0YXRlX2wodWlkX3QgdWlkLCBhcHBfc3RhdGVfdCBzdGF0ZSk7CiAKICAgICAvLyBPdmVycmlkZXMgdGhlIFVJRCBzdGF0ZSBhcyBpZiBpdCBpcyBpZGxlCiAgICAgc3RhdHVzX3QgaGFuZGxlU2V0VWlkU3RhdGUoVmVjdG9yPFN0cmluZzE2PiYgYXJncywgaW50IGVycik7CkBAIC0yNjUsNiArMzI0LDE4IEBACiAKICAgICBzdGQ6OnN0cmluZyBnZXREZXZpY2VUeXBlU3RyRm9yUG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAorICAgIHN0YXR1c190IGdldEF1ZGlvUG9saWN5RWZmZWN0cyhzcDxBdWRpb1BvbGljeUVmZmVjdHM+JiBhdWRpb1BvbGljeUVmZmVjdHMpOworCisgICAgYXBwX3N0YXRlX3QgYXBtU3RhdEZyb21BbVN0YXRlKGludCBhbVN0YXRlKTsKKworICAgIHZvaWQgdXBkYXRlVWlkU3RhdGVzKCk7CisgICAgdm9pZCB1cGRhdGVVaWRTdGF0ZXNfbCgpOworCisgICAgdm9pZCBzaWxlbmNlQWxsUmVjb3JkaW5nc19sKCk7CisKKyAgICBzdGF0aWMgYm9vbCBpc1ByaXZhY3lTZW5zaXRpdmVTb3VyY2UoYXVkaW9fc291cmNlX3Qgc291cmNlKTsKKyAgICBzdGF0aWMgYm9vbCBpc1ZpcnR1YWxTb3VyY2UoYXVkaW9fc291cmNlX3Qgc291cmNlKTsKKwogICAgIC8vIElmIHJlY29yZGluZyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUgVUlEIGlzIGFsbG93ZWQgdG8gZG8gdGhhdC4gSWYgdGhlIFVJRCBpcyBpZGxlCiAgICAgLy8gdGhlbiBpdCBjYW5ub3QgcmVjb3JkIGFuZCBnZXRzIGJ1ZmZlcnMgd2l0aCB6ZXJvcyAtIHNpbGVuY2UuIEFzIHNvb24gYXMgdGhlIFVJRAogICAgIC8vIHRyYW5zaXRpb25zIHRvIGFuIGFjdGl2ZSBzdGF0ZSB3ZSB3aWxsIHN0YXJ0IHJlcG9ydGluZyBidWZmZXJzIHdpdGggZGF0YS4gVGhpcyBhcHByb2FjaApAQCAtMjc0LDcgKzM0NSw3IEBACiAgICAgY2xhc3MgVWlkUG9saWN5IDogcHVibGljIEJuVWlkT2JzZXJ2ZXIsIHB1YmxpYyB2aXJ0dWFsIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKICAgICBwdWJsaWM6CiAgICAgICAgIGV4cGxpY2l0IFVpZFBvbGljeSh3cDxBdWRpb1BvbGljeVNlcnZpY2U+IHNlcnZpY2UpCi0gICAgICAgICAgICAgICAgOiBtU2VydmljZShzZXJ2aWNlKSwgbU9ic2VydmVyUmVnaXN0ZXJlZChmYWxzZSkge30KKyAgICAgICAgICAgICAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpLCBtT2JzZXJ2ZXJSZWdpc3RlcmVkKGZhbHNlKSwgbUFzc2lzdGFudFVpZCgwKSB7fQogCiAgICAgICAgIHZvaWQgcmVnaXN0ZXJTZWxmKCk7CiAgICAgICAgIHZvaWQgdW5yZWdpc3RlclNlbGYoKTsKQEAgLTI4MywzNCArMzU0LDYzIEBACiAgICAgICAgIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmd2hvKSBvdmVycmlkZTsKIAogICAgICAgICBib29sIGlzVWlkQWN0aXZlKHVpZF90IHVpZCk7CisgICAgICAgIGludCBnZXRVaWRTdGF0ZSh1aWRfdCB1aWQpOworICAgICAgICB2b2lkIHNldEFzc2lzdGFudFVpZCh1aWRfdCB1aWQpIHsgbUFzc2lzdGFudFVpZCA9IHVpZDsgfQorICAgICAgICBib29sIGlzQXNzaXN0YW50VWlkKHVpZF90IHVpZCkgeyByZXR1cm4gdWlkID09IG1Bc3Npc3RhbnRVaWQ7IH0KKyAgICAgICAgdm9pZCBzZXRBMTF5VWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpIHsgbUExMXlVaWRzLmNsZWFyKCk7IG1BMTF5VWlkcyA9IHVpZHM7IH0KKyAgICAgICAgYm9vbCBpc0ExMXlVaWQodWlkX3QgdWlkKTsKKyAgICAgICAgYm9vbCBpc0ExMXlPblRvcCgpOwogCiAgICAgICAgIC8vIEJuVWlkT2JzZXJ2ZXIgaW1wbGVtZW50YXRpb24KICAgICAgICAgdm9pZCBvblVpZEFjdGl2ZSh1aWRfdCB1aWQpIG92ZXJyaWRlOwogICAgICAgICB2b2lkIG9uVWlkR29uZSh1aWRfdCB1aWQsIGJvb2wgZGlzYWJsZWQpIG92ZXJyaWRlOwogICAgICAgICB2b2lkIG9uVWlkSWRsZSh1aWRfdCB1aWQsIGJvb2wgZGlzYWJsZWQpIG92ZXJyaWRlOworICAgICAgICB2b2lkIG9uVWlkU3RhdGVDaGFuZ2VkKHVpZF90IHVpZCwgaW50MzJfdCBwcm9jU3RhdGUsIGludDY0X3QgcHJvY1N0YXRlU2VxKTsKIAogICAgICAgICB2b2lkIGFkZE92ZXJyaWRlVWlkKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUpIHsgdXBkYXRlT3ZlcnJpZGVVaWQodWlkLCBhY3RpdmUsIHRydWUpOyB9CiAgICAgICAgIHZvaWQgcmVtb3ZlT3ZlcnJpZGVVaWQodWlkX3QgdWlkKSB7IHVwZGF0ZU92ZXJyaWRlVWlkKHVpZCwgZmFsc2UsIGZhbHNlKTsgfQogCi0gICAgcHJpdmF0ZToKLSAgICAgICAgYm9vbCBpc1NlcnZpY2VVaWQodWlkX3QgdWlkKSBjb25zdDsKLSAgICAgICAgdm9pZCBub3RpZnlTZXJ2aWNlKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUpOworICAgICAgICB2b2lkIHVwZGF0ZVVpZChzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIHN0ZDo6cGFpcjxib29sLCBpbnQ+PiAqdWlkcywKKyAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLCBib29sIGFjdGl2ZSwgaW50IHN0YXRlLCBib29sIGluc2VydCk7CisKKyAgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBub3RpZnlTZXJ2aWNlKCk7CiAgICAgICAgIHZvaWQgdXBkYXRlT3ZlcnJpZGVVaWQodWlkX3QgdWlkLCBib29sIGFjdGl2ZSwgYm9vbCBpbnNlcnQpOwotICAgICAgICB2b2lkIHVwZGF0ZVVpZENhY2hlKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGJvb2wgaW5zZXJ0KTsKLSAgICAgICAgdm9pZCB1cGRhdGVVaWRMb2NrZWQoc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBib29sPiAqdWlkcywKLSAgICAgICAgICAgICAgICB1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBib29sIGluc2VydCwgYm9vbCAqd2FzVGhlcmUsIGJvb2wgKndhc0FjdGl2ZSk7CisgICAgICAgIHZvaWQgdXBkYXRlVWlkTG9ja2VkKHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgc3RkOjpwYWlyPGJvb2wsIGludD4+ICp1aWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBpbnQgc3RhdGUsIGJvb2wgaW5zZXJ0KTsKKyAgICAgICAgdm9pZCBjaGVja1JlZ2lzdGVyZWQoKTsKIAogICAgICAgICB3cDxBdWRpb1BvbGljeVNlcnZpY2U+IG1TZXJ2aWNlOwogICAgICAgICBNdXRleCBtTG9jazsKICAgICAgICAgYm9vbCBtT2JzZXJ2ZXJSZWdpc3RlcmVkOwotICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIGJvb2w+IG1PdmVycmlkZVVpZHM7Ci0gICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgYm9vbD4gbUNhY2hlZFVpZHM7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgc3RkOjpwYWlyPGJvb2wsIGludD4+IG1PdmVycmlkZVVpZHM7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgc3RkOjpwYWlyPGJvb2wsIGludD4+IG1DYWNoZWRVaWRzOworICAgICAgICB1aWRfdCBtQXNzaXN0YW50VWlkOworICAgICAgICBzdGQ6OnZlY3Rvcjx1aWRfdD4gbUExMXlVaWRzOwogICAgIH07CiAKLSAgICAvLyBUaHJlYWQgdXNlZCBmb3IgdG9uZSBwbGF5YmFjayBhbmQgdG8gc2VuZCBhdWRpbyBjb25maWcgY29tbWFuZHMgdG8gYXVkaW8gZmxpbmdlcgotICAgIC8vIEZvciB0b25lIHBsYXliYWNrLCB1c2luZyBhIHNlcGFyYXRlIHRocmVhZCBpcyBuZWNlc3NhcnkgdG8gYXZvaWQgZGVhZGxvY2sgd2l0aCBtTG9jayBiZWNhdXNlCi0gICAgLy8gc3RhcnRUb25lKCkgYW5kIHN0b3BUb25lKCkgYXJlIG5vcm1hbGx5IGNhbGxlZCB3aXRoIG1Mb2NrIGxvY2tlZCBhbmQgcmVxdWVzdGluZyBhIHRvbmUgc3RhcnQKLSAgICAvLyBvciBzdG9wIHdpbGwgY2F1c2UgY2FsbHMgdG8gQXVkaW9Qb2xpY3lTZXJ2aWNlIGFuZCBhbiBhdHRlbXB0IHRvIGxvY2sgbUxvY2suCisgICAgLy8gSWYgc2Vuc29yIHByaXZhY3kgaXMgZW5hYmxlZCB0aGVuIGFsbCBhcHBzLCBpbmNsdWRpbmcgdGhvc2UgdGhhdCBhcmUgYWN0aXZlLCBzaG91bGQgYmUKKyAgICAvLyBwcmV2ZW50ZWQgZnJvbSByZWNvcmRpbmcuIFRoaXMgaXMgaGFuZGxlZCBzaW1pbGFyIHRvIGlkbGUgVUlEcywgYW55IGFwcCB0aGF0IGF0dGVtcHRzCisgICAgLy8gdG8gcmVjb3JkIHdoaWxlIHNlbnNvciBwcml2YWN5IGlzIGVuYWJsZWQgd2lsbCByZWNlaXZlIGJ1ZmZlcnMgd2l0aCB6ZXJvcy4gQXMgc29vbiBhcworICAgIC8vIHNlbnNvciBwcml2YWN5IGlzIGRpc2FibGVkIGFjdGl2ZSBhcHBzIHdpbGwgcmVjZWl2ZSB0aGUgZXhwZWN0ZWQgZGF0YSB3aGVuIHJlY29yZGluZy4KKyAgICBjbGFzcyBTZW5zb3JQcml2YWN5UG9saWN5IDogcHVibGljIGhhcmR3YXJlOjpCblNlbnNvclByaXZhY3lMaXN0ZW5lciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIGV4cGxpY2l0IFNlbnNvclByaXZhY3lQb2xpY3kod3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBzZXJ2aWNlKQorICAgICAgICAgICAgICAgICAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpIHt9CisKKyAgICAgICAgICAgIHZvaWQgcmVnaXN0ZXJTZWxmKCk7CisgICAgICAgICAgICB2b2lkIHVucmVnaXN0ZXJTZWxmKCk7CisKKyAgICAgICAgICAgIGJvb2wgaXNTZW5zb3JQcml2YWN5RW5hYmxlZCgpOworCisgICAgICAgICAgICBiaW5kZXI6OlN0YXR1cyBvblNlbnNvclByaXZhY3lDaGFuZ2VkKGJvb2wgZW5hYmxlZCk7CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHdwPEF1ZGlvUG9saWN5U2VydmljZT4gbVNlcnZpY2U7CisgICAgICAgICAgICBzdGQ6OmF0b21pY19ib29sIG1TZW5zb3JQcml2YWN5RW5hYmxlZDsKKyAgICB9OworCisgICAgLy8gVGhyZWFkIHVzZWQgdG8gc2VuZCBhdWRpbyBjb25maWcgY29tbWFuZHMgdG8gYXVkaW8gZmxpbmdlcgogICAgIC8vIEZvciBhdWRpbyBjb25maWcgY29tbWFuZHMsIGl0IGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGF1ZGlvIGZsaW5nZXIgcmVxdWlyZXMgdGhhdCB0aGUgY2FsbGluZwogICAgIC8vIHByb2Nlc3MgKHVzZXIpIGhhcyBwZXJtaXNzaW9uIHRvIG1vZGlmeSBhdWRpbyBzZXR0aW5ncy4KICAgICBjbGFzcyBBdWRpb0NvbW1hbmRUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKQEAgLTMxOSw4ICs0MTksNiBAQAogCiAgICAgICAgIC8vIGNvbW1hbmRzIGZvciB0b25lIEF1ZGlvQ29tbWFuZAogICAgICAgICBlbnVtIHsKLSAgICAgICAgICAgIFNUQVJUX1RPTkUsCi0gICAgICAgICAgICBTVE9QX1RPTkUsCiAgICAgICAgICAgICBTRVRfVk9MVU1FLAogICAgICAgICAgICAgU0VUX1BBUkFNRVRFUlMsCiAgICAgICAgICAgICBTRVRfVk9JQ0VfVk9MVU1FLApAQCAtMzMwLDkgKzQyOCwxMSBAQAogICAgICAgICAgICAgUkVMRUFTRV9BVURJT19QQVRDSCwKICAgICAgICAgICAgIFVQREFURV9BVURJT1BPUlRfTElTVCwKICAgICAgICAgICAgIFVQREFURV9BVURJT1BBVENIX0xJU1QsCisgICAgICAgICAgICBDSEFOR0VEX0FVRElPVk9MVU1FR1JPVVAsCiAgICAgICAgICAgICBTRVRfQVVESU9QT1JUX0NPTkZJRywKICAgICAgICAgICAgIERZTl9QT0xJQ1lfTUlYX1NUQVRFX1VQREFURSwKLSAgICAgICAgICAgIFJFQ09SRElOR19DT05GSUdVUkFUSU9OX1VQREFURQorICAgICAgICAgICAgUkVDT1JESU5HX0NPTkZJR1VSQVRJT05fVVBEQVRFLAorICAgICAgICAgICAgU0VUX0VGRkVDVF9TVVNQRU5ERUQsCiAgICAgICAgIH07CiAKICAgICAgICAgQXVkaW9Db21tYW5kVGhyZWFkIChTdHJpbmc4IG5hbWUsIGNvbnN0IHdwPEF1ZGlvUG9saWN5U2VydmljZT4mIHNlcnZpY2UpOwpAQCAtMzQ1LDIwICs0NDUsMTMgQEAKICAgICAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpOwogCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGV4aXQoKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc3RhcnRUb25lQ29tbWFuZChUb25lR2VuZXJhdG9yOjp0b25lX3R5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0b3BUb25lQ29tbWFuZCgpOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICB2b2x1bWVDb21tYW5kKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBmbG9hdCB2b2x1bWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgaW50IGRlbGF5TXMgPSAwKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgcGFyYW1ldGVyc0NvbW1hbmQoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleVZhbHVlUGFpcnMsIGludCBkZWxheU1zID0gMCk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHZvaWNlVm9sdW1lQ29tbWFuZChmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zID0gMCk7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0b3BPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcmVsZWFzZU91dHB1dENvbW1hbmQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wT3V0cHV0Q29tbWFuZChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlbGVhc2VPdXRwdXRDb21tYW5kKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2VuZENvbW1hbmQoc3A8QXVkaW9Db21tYW5kPiYgY29tbWFuZCwgaW50IGRlbGF5TXMgPSAwKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgaW5zZXJ0Q29tbWFuZF9sKHNwPEF1ZGlvQ29tbWFuZD4mIGNvbW1hbmQsIGludCBkZWxheU1zID0gMCk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIGNyZWF0ZUF1ZGlvUGF0Y2hDb21tYW5kKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCkBAIC0zNjgsMTUgKzQ2MSwyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOwogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICB1cGRhdGVBdWRpb1BvcnRMaXN0Q29tbWFuZCgpOwogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICB1cGRhdGVBdWRpb1BhdGNoTGlzdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgY2hhbmdlQXVkaW9Wb2x1bWVHcm91cENvbW1hbmQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsIGludCBmbGFncyk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldEF1ZGlvUG9ydENvbmZpZ0NvbW1hbmQoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOwotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGVDb21tYW5kKGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlQ29tbWFuZChjb25zdCBTdHJpbmc4JiByZWdJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZUNvbW1hbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHNldEVmZmVjdFN1c3BlbmRlZENvbW1hbmQoaW50IGVmZmVjdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdXNwZW5kZWQpOwogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBpbnNlcnRDb21tYW5kX2woQXVkaW9Db21tYW5kICpjb21tYW5kLCBpbnQgZGVsYXlNcyA9IDApOwogICAgIHByaXZhdGU6CiAgICAgICAgIGNsYXNzIEF1ZGlvQ29tbWFuZERhdGE7CkBAIC0zOTAsNyArNDkxLDcgQEAKIAogICAgICAgICAgICAgdm9pZCBkdW1wKGNoYXIqIGJ1ZmZlciwgc2l6ZV90IHNpemUpOwogCi0gICAgICAgICAgICBpbnQgbUNvbW1hbmQ7ICAgLy8gU1RBUlRfVE9ORSwgU1RPUF9UT05FIC4uLgorICAgICAgICAgICAgaW50IG1Db21tYW5kOyAgIC8vIFNFVF9WT0xVTUUsIFNFVF9QQVJBTUVURVJTLi4uCiAgICAgICAgICAgICBuc2Vjc190IG1UaW1lOyAgLy8gdGltZSBzdGFtcAogICAgICAgICAgICAgTXV0ZXggbUxvY2s7ICAgIC8vIG11dGV4IGFzc29jaWF0ZWQgdG8gbUNvbmQKICAgICAgICAgICAgIENvbmRpdGlvbiBtQ29uZDsgLy8gY29uZGl0aW9uIGZvciBzdGF0dXMgcmV0dXJuCkBAIC00MDYsMTIgKzUwNyw2IEBACiAgICAgICAgICAgICBBdWRpb0NvbW1hbmREYXRhKCkge30KICAgICAgICAgfTsKIAotICAgICAgICBjbGFzcyBUb25lRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKLSAgICAgICAgcHVibGljOgotICAgICAgICAgICAgVG9uZUdlbmVyYXRvcjo6dG9uZV90eXBlIG1UeXBlOyAvLyB0b25lIHR5cGUgKFNUQVJUX1RPTkUgb25seSkKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbTsgICAgLy8gc3RyZWFtIHR5cGUgKFNUQVJUX1RPTkUgb25seSkKLSAgICAgICAgfTsKLQogICAgICAgICBjbGFzcyBWb2x1bWVEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgewogICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07CkBAIC00MzIsMTYgKzUyNywxMiBAQAogCiAgICAgICAgIGNsYXNzIFN0b3BPdXRwdXREYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgewogICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBtSU87Ci0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgbVNlc3Npb247CisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1Qb3J0SWQ7CiAgICAgICAgIH07CiAKICAgICAgICAgY2xhc3MgUmVsZWFzZU91dHB1dERhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CiAgICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1JTzsKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbTsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBtU2Vzc2lvbjsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbVBvcnRJZDsKICAgICAgICAgfTsKIAogICAgICAgICBjbGFzcyBDcmVhdGVBdWRpb1BhdGNoRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKQEAgLTQ1NSw2ICs1NDYsMTIgQEAKICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1IYW5kbGU7CiAgICAgICAgIH07CiAKKyAgICAgICAgY2xhc3MgQXVkaW9Wb2x1bWVHcm91cERhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIHZvbHVtZV9ncm91cF90IG1Hcm91cDsKKyAgICAgICAgICAgIGludCBtRmxhZ3M7CisgICAgICAgIH07CisKICAgICAgICAgY2xhc3MgU2V0QXVkaW9Qb3J0Q29uZmlnRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIG1Db25maWc7CkBAIC00NzEsMTQgKzU2OCwyMyBAQAogICAgICAgICAgICAgaW50IG1FdmVudDsKICAgICAgICAgICAgIHJlY29yZF9jbGllbnRfaW5mb190IG1DbGllbnRJbmZvOwogICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlIG1DbGllbnRDb25maWc7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBtQ2xpZW50RWZmZWN0czsKICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSBtRGV2aWNlQ29uZmlnOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gbUVmZmVjdHM7CiAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtUGF0Y2hIYW5kbGU7CisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBtU291cmNlOworICAgICAgICB9OworCisgICAgICAgIGNsYXNzIFNldEVmZmVjdFN1c3BlbmRlZERhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIGludCBtRWZmZWN0SWQ7CisgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgbVNlc3Npb25JZDsKKyAgICAgICAgICAgIGJvb2wgbVN1c3BlbmRlZDsKICAgICAgICAgfTsKIAogICAgICAgICBNdXRleCAgIG1Mb2NrOwogICAgICAgICBDb25kaXRpb24gbVdhaXRXb3JrQ1Y7CiAgICAgICAgIFZlY3RvciA8IHNwPEF1ZGlvQ29tbWFuZD4gPiBtQXVkaW9Db21tYW5kczsgLy8gbGlzdCBvZiBwZW5kaW5nIGNvbW1hbmRzCi0gICAgICAgIFRvbmVHZW5lcmF0b3IgKm1wVG9uZUdlbmVyYXRvcjsgICAgIC8vIHRoZSB0b25lIGdlbmVyYXRvcgogICAgICAgICBzcDxBdWRpb0NvbW1hbmQ+IG1MYXN0Q29tbWFuZDsgICAgICAvLyBsYXN0IHByb2Nlc3NlZCBjb21tYW5kICh1c2VkIGJ5IGR1bXApCiAgICAgICAgIFN0cmluZzggbU5hbWU7ICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmluZyB1c2VkIGJ5IHdha2UgbG9jayBmbyBkZWxheWVkIGNvbW1hbmRzCiAgICAgICAgIHdwPEF1ZGlvUG9saWN5U2VydmljZT4gbVNlcnZpY2U7CkBAIC01NTMsMTEgKzY1OSw2IEBACiAgICAgICAgIC8vIGZ1bmN0aW9uIGVuYWJsaW5nIHRvIHJlY2VpdmUgcHJvcHJpZXRhcnkgaW5mb3JtYXRpb25zIGRpcmVjdGx5IGZyb20gYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIHRvIGF1ZGlvIHBvbGljeSBtYW5hZ2VyLgogICAgICAgICB2aXJ0dWFsIFN0cmluZzggZ2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5cyk7CiAKLSAgICAgICAgLy8gcmVxdWVzdCB0aGUgcGxheWJhY2sgb2YgYSB0b25lIG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtOiB1c2VkIGZvciBpbnN0YW5jZSB0byByZXBsYWNlIG5vdGlmaWNhdGlvbiBzb3VuZHMgd2hlbiBwbGF5aW5nCi0gICAgICAgIC8vIG92ZXIgYSB0ZWxlcGhvbnkgZGV2aWNlIGR1cmluZyBhIHBob25lIGNhbGwuCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BUb25lKCk7Ci0KICAgICAgICAgLy8gc2V0IGRvd24gbGluayBhdWRpbyB2b2x1bWUuCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcyA9IDApOwogCkBAIC01NjYsNiArNjY3LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNyY091dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0KTsKIAorICAgICAgICAgICAgICAgIHZvaWQgc2V0RWZmZWN0U3VzcGVuZGVkKGludCBlZmZlY3RJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VzcGVuZGVkKSBvdmVycmlkZTsKKwogICAgICAgICAvKiBDcmVhdGUgYSBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzICovCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCkBAIC01ODIsOSArNjg3LDE1IEBACiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShTdHJpbmc4IHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKICAgICAgICAgdmlydHVhbCB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsIGludCBmbGFncyk7CiAKICAgICAgICAgdmlydHVhbCBhdWRpb191bmlxdWVfaWRfdCBuZXdBdWRpb1VuaXF1ZUlkKGF1ZGlvX3VuaXF1ZV9pZF91c2VfdCB1c2UpOwogCkBAIC01OTcsMTggKzcwOCwyOSBAQAogICAgIHB1YmxpYzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3RpZmljYXRpb25DbGllbnQoY29uc3Qgc3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiYgc2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+JiBjbGllbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLCBwaWRfdCBwaWQpOwogICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5Ob3RpZmljYXRpb25DbGllbnQoKTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShjb25zdCBTdHJpbmc4JiByZWdJZCwgaW50MzJfdCBzdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGNvbnN0IFN0cmluZzgmIHJlZ0lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwgaW50IGZsYWdzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIHNldEF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIHNldEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkKGJvb2wgZW5hYmxlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtVWlkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50CiAgICAgICAgICAgICAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKTsKQEAgLTYxOSwzNiArNzQxLDczIEBACiAKICAgICAgICAgY29uc3Qgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiAgICAgICAgbVNlcnZpY2U7CiAgICAgICAgIGNvbnN0IHVpZF90ICAgICAgICAgICAgICAgICAgICAgICAgIG1VaWQ7CisgICAgICAgIGNvbnN0IHBpZF90ICAgICAgICAgICAgICAgICAgICAgICAgIG1QaWQ7CiAgICAgICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ+IG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ7CiAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkOworICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQ7CisgICAgfTsKKworICAgIGNsYXNzIEF1ZGlvQ2xpZW50IDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSB7CisgICAgcHVibGljOgorICAgICAgICAgICAgICAgIEF1ZGlvQ2xpZW50KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGlvLCB1aWRfdCB1aWQsIHBpZF90IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpLCBpbyhpbyksIHVpZCh1aWQpLCBwaWQocGlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbihzZXNzaW9uKSwgZGV2aWNlSWQoZGV2aWNlSWQpLCBhY3RpdmUoZmFsc2UpIHt9CisgICAgICAgICAgICAgICAgfkF1ZGlvQ2xpZW50KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXM7IC8vIHNvdXJjZSwgZmxhZ3MgLi4uCisgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGlvOyAgICAgICAgICAvLyBhdWRpbyBIQUwgc3RyZWFtIElPIGhhbmRsZQorICAgICAgICBjb25zdCB1aWRfdCB1aWQ7ICAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IFVJRAorICAgICAgICBjb25zdCBwaWRfdCBwaWQ7ICAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IFBJRAorICAgICAgICBjb25zdCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbjsgICAgICAgLy8gYXVkaW8gc2Vzc2lvbiBJRAorICAgICAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkOyAgLy8gc2VsZWN0ZWQgaW5wdXQgZGV2aWNlIHBvcnQgSUQKKyAgICAgICAgICAgICAgYm9vbCBhY3RpdmU7ICAgICAgICAgICAgICAgICAgIC8vIFBsYXliYWNrL0NhcHR1cmUgaXMgYWN0aXZlIG9yIGluYWN0aXZlCiAgICAgfTsKIAogICAgIC8vIC0tLSBBdWRpb1JlY29yZENsaWVudCAtLS0KICAgICAvLyBJbmZvcm1hdGlvbiBhYm91dCBlYWNoIHJlZ2lzdGVyZWQgQXVkaW9SZWNvcmQgY2xpZW50CiAgICAgLy8gKGJldHdlZW4gY2FsbHMgdG8gZ2V0SW5wdXRGb3JBdHRyKCkgYW5kIHJlbGVhc2VJbnB1dCgpKQotICAgIGNsYXNzIEF1ZGlvUmVjb3JkQ2xpZW50IDogcHVibGljIFJlZkJhc2UgeworICAgIGNsYXNzIEF1ZGlvUmVjb3JkQ2xpZW50IDogcHVibGljIEF1ZGlvQ2xpZW50IHsKICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgQXVkaW9SZWNvcmRDbGllbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsIHVpZF90IHVpZCwgcGlkX3QgcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBjb25zdCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dChpbnB1dCksIHVpZCh1aWQpLCBwaWQocGlkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKSwgc2Vzc2lvbihzZXNzaW9uKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlKGZhbHNlKSwgaXNDb25jdXJyZW50KGZhbHNlKSwgaXNWaXJ0dWFsRGV2aWNlKGZhbHNlKSB7fQotICAgICAgICB2aXJ0dWFsIH5BdWRpb1JlY29yZENsaWVudCgpIHt9CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGlvLCB1aWRfdCB1aWQsIHBpZF90IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNhbkNhcHR1cmVPdXRwdXQsIGJvb2wgY2FuQ2FwdHVyZUhvdHdvcmQpIDoKKyAgICAgICAgICAgICAgICAgICAgQXVkaW9DbGllbnQoYXR0cmlidXRlcywgaW8sIHVpZCwgcGlkLCBzZXNzaW9uLCBkZXZpY2VJZCksCisgICAgICAgICAgICAgICAgICAgIG9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSksIHN0YXJ0VGltZU5zKDApLAorICAgICAgICAgICAgICAgICAgICBjYW5DYXB0dXJlT3V0cHV0KGNhbkNhcHR1cmVPdXRwdXQpLCBjYW5DYXB0dXJlSG90d29yZChjYW5DYXB0dXJlSG90d29yZCkge30KKyAgICAgICAgICAgICAgICB+QXVkaW9SZWNvcmRDbGllbnQoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CiAKLSAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXM7IC8vIHNvdXJjZSwgZmxhZ3MgLi4uCi0gICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0OyAgICAgICAvLyBhdWRpbyBIQUwgaW5wdXQgSU8gaGFuZGxlCi0gICAgICAgIGNvbnN0IHVpZF90IHVpZDsgICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnQgVUlECi0gICAgICAgIGNvbnN0IHBpZF90IHBpZDsgICAgICAgICAgICAgICAgICAgICAvLyBjbGllbnQgUElECiAgICAgICAgIGNvbnN0IFN0cmluZzE2IG9wUGFja2FnZU5hbWU7ICAgICAgICAvLyBjbGllbnQgcGFja2FnZSBuYW1lCi0gICAgICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uOyAgICAgICAvLyBhdWRpbyBzZXNzaW9uIElECi0gICAgICAgIGJvb2wgYWN0aXZlOyAgICAgICAgICAgICAgICAgICAvLyBDYXB0dXJlIGlzIGFjdGl2ZSBvciBpbmFjdGl2ZQotICAgICAgICBib29sIGlzQ29uY3VycmVudDsgICAgICAgICAgICAgLy8gaXMgYWxsb3dlZCB0byBjb25jdXJyZW50IGNhcHR1cmUKLSAgICAgICAgYm9vbCBpc1ZpcnR1YWxEZXZpY2U7ICAgICAgICAgIC8vIHVzZXMgdmlydHVhbCBkZXZpY2U6IHVwZGF0ZWQgYnkgQVBNOjpnZXRJbnB1dEZvckF0dHIoKQotICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkOyAgLy8gc2VsZWN0ZWQgaW5wdXQgZGV2aWNlIHBvcnQgSUQKKyAgICAgICAgbnNlY3NfdCBzdGFydFRpbWVOczsKKyAgICAgICAgY29uc3QgYm9vbCBjYW5DYXB0dXJlT3V0cHV0OworICAgICAgICBjb25zdCBib29sIGNhbkNhcHR1cmVIb3R3b3JkOwogICAgIH07CiAKKyAgICAvLyAtLS0gQXVkaW9QbGF5YmFja0NsaWVudCAtLS0KKyAgICAvLyBJbmZvcm1hdGlvbiBhYm91dCBlYWNoIHJlZ2lzdGVyZWQgQXVkaW9UcmFjayBjbGllbnQKKyAgICAvLyAoYmV0d2VlbiBjYWxscyB0byBnZXRPdXRwdXRGb3JBdHRyKCkgYW5kIHJlbGVhc2VPdXRwdXQoKSkKKyAgICBjbGFzcyBBdWRpb1BsYXliYWNrQ2xpZW50IDogcHVibGljIEF1ZGlvQ2xpZW50IHsKKyAgICBwdWJsaWM6CisgICAgICAgICAgICAgICAgQXVkaW9QbGF5YmFja0NsaWVudChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbywgdWlkX3QgdWlkLCBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIDoKKyAgICAgICAgICAgICAgICAgICAgQXVkaW9DbGllbnQoYXR0cmlidXRlcywgaW8sIHVpZCwgcGlkLCBzZXNzaW9uLCBkZXZpY2VJZCksIHN0cmVhbShzdHJlYW0pIHt9CisgICAgICAgICAgICAgICAgfkF1ZGlvUGxheWJhY2tDbGllbnQoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICAgICAgY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW07CisgICAgfTsKKworICAgIHZvaWQgZ2V0UGxheWJhY2tDbGllbnRBbmRFZmZlY3RzKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvUGxheWJhY2tDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPiYgZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb250ZXh0KTsKKworCiAgICAgLy8gQSBjbGFzcyBhdXRvbWF0aWNhbGx5IGNsZWFyaW5nIGFuZCByZXN0b3JpbmcgYmluZGVyIGNhbGxlciBpZGVudGl0eSBpbnNpZGUKICAgICAvLyBhIGNvZGUgYmxvY2sgKHNjb3BlZCB2YXJpYWJsZSkKICAgICAvLyBEZWNsYXJlIG9uZSBzeXN0ZW1hdGljYWxseSBiZWZvcmUgY2FsbGluZyBBdWRpb1BvbGljeU1hbmFnZXIgbWV0aG9kcyBzbyB0aGF0IHRoZXkgYXJlCkBAIC02NzEsMjYgKzgzMCwzMSBAQAogCiAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsgICAgLy8gcHJldmVudHMgY29uY3VycmVudCBhY2Nlc3MgdG8gQXVkaW9Qb2xpY3kgbWFuYWdlciBmdW5jdGlvbnMgY2hhbmdpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXZpY2UgY29ubmVjdGlvbiBzdGF0ZSAgb3Igcm91dGluZwotICAgIG11dGFibGUgTXV0ZXggbUVmZmVjdHNMb2NrOyAvLyBzZXJpYWxpemUgYWNjZXNzIHRvIEVmZmVjdCBzdGF0ZSB3aXRoaW4gQVBNLgogICAgIC8vIE5vdGU6IGxvY2sgYWNxdWlzaXRpb24gb3JkZXIgaXMgYWx3YXlzIG1Mb2NrID4gbUVmZmVjdHNMb2NrOgogICAgIC8vIG1Mb2NrIHByb3RlY3RzIEF1ZGlvUG9saWN5TWFuYWdlciBtZXRob2RzIHRoYXQgY2FuIGNhbGwgaW50byBhdWRpbyBmbGluZ2VyCiAgICAgLy8gYW5kIHBvc3NpYmx5IGJhY2sgaW4gdG8gYXVkaW8gcG9saWN5IHNlcnZpY2UgYW5kIGFjcXVpcmUgbUVmZmVjdHNMb2NrLgogICAgIHNwPEF1ZGlvQ29tbWFuZFRocmVhZD4gbUF1ZGlvQ29tbWFuZFRocmVhZDsgICAgIC8vIGF1ZGlvIGNvbW1hbmRzIHRocmVhZAotICAgIHNwPEF1ZGlvQ29tbWFuZFRocmVhZD4gbVRvbmVQbGF5YmFja1RocmVhZDsgICAgIC8vIHRvbmUgcGxheWJhY2sgdGhyZWFkCiAgICAgc3A8QXVkaW9Db21tYW5kVGhyZWFkPiBtT3V0cHV0Q29tbWFuZFRocmVhZDsgICAgLy8gcHJvY2VzcyBzdG9wIGFuZCByZWxlYXNlIG91dHB1dAogICAgIHN0cnVjdCBhdWRpb19wb2xpY3lfZGV2aWNlICptcEF1ZGlvUG9saWN5RGV2OwogICAgIHN0cnVjdCBhdWRpb19wb2xpY3kgKm1wQXVkaW9Qb2xpY3k7CiAgICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2UgKm1BdWRpb1BvbGljeU1hbmFnZXI7CiAgICAgQXVkaW9Qb2xpY3lDbGllbnQgKm1BdWRpb1BvbGljeUNsaWVudDsKIAotICAgIERlZmF1bHRLZXllZFZlY3RvcjwgdWlkX3QsIHNwPE5vdGlmaWNhdGlvbkNsaWVudD4gPiAgICBtTm90aWZpY2F0aW9uQ2xpZW50czsKKyAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IGludDY0X3QsIHNwPE5vdGlmaWNhdGlvbkNsaWVudD4gPiAgICBtTm90aWZpY2F0aW9uQ2xpZW50czsKICAgICBNdXRleCBtTm90aWZpY2F0aW9uQ2xpZW50c0xvY2s7ICAvLyBwcm90ZWN0cyBtTm90aWZpY2F0aW9uQ2xpZW50cwogICAgIC8vIE1hbmFnZSBhbGwgZWZmZWN0cyBjb25maWd1cmVkIGluIGF1ZGlvX2VmZmVjdHMuY29uZgorICAgIC8vIG5ldmVyIGhvbGQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjptTG9jayB3aGVuIGNhbGxpbmcgQXVkaW9Qb2xpY3lFZmZlY3RzIG1ldGhvZHMgYXMKKyAgICAvLyB0aG9zZSBjYW4gY2FsbCBiYWNrIGludG8gQXVkaW9Qb2xpY3lTZXJ2aWNlIG1ldGhvZHMgYW5kIHRyeSB0byBhY3F1aXJlIHRoZSBtdXRleAogICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz4gbUF1ZGlvUG9saWN5RWZmZWN0czsKICAgICBhdWRpb19tb2RlX3QgbVBob25lU3RhdGU7CiAKICAgICBzcDxVaWRQb2xpY3k+IG1VaWRQb2xpY3k7CisgICAgc3A8U2Vuc29yUHJpdmFjeVBvbGljeT4gbVNlbnNvclByaXZhY3lQb2xpY3k7CisKICAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IGF1ZGlvX3BvcnRfaGFuZGxlX3QsIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiA+ICAgbUF1ZGlvUmVjb3JkQ2xpZW50czsKKyAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IGF1ZGlvX3BvcnRfaGFuZGxlX3QsIHNwPEF1ZGlvUGxheWJhY2tDbGllbnQ+ID4gICBtQXVkaW9QbGF5YmFja0NsaWVudHM7CisKKyAgICBNZWRpYVBhY2thZ2VNYW5hZ2VyIG1QYWNrYWdlTWFuYWdlcjsgLy8gVG8gY2hlY2sgYWxsb3dQbGF5YmFja0NhcHR1cmUKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BbmRyb2lkLm1rCmluZGV4IGE0M2RhZWEuLmFiOWY3OGIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQW5kcm9pZC5tawpAQCAtNCw5ICs0LDcgQEAKIAogTE9DQUxfQ19JTkNMVURFUyA6PSBcCiAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kgXAotICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlIFwKLSAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlIFwKLSAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS91dGlsaXRpZXMKKyAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCiAKIExPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAogICBsaWJhdWRpb3BvbGljeW1hbmFnZXJkZWZhdWx0IFwKQEAgLTE4LDYgKzE2LDExIEBACiBMT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKICAgbGliYXVkaW9wb2xpY3ljb21wb25lbnRzIFwKIAorTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCisgICAgbGliYXVkaW9wb2xpY3ljb21tb24gXAorICAgIGxpYmF1ZGlvcG9saWN5ZW5naW5lX2ludGVyZmFjZV9oZWFkZXJzIFwKKyAgICBsaWJhdWRpb3BvbGljeW1hbmFnZXJfaW50ZXJmYWNlX2hlYWRlcnMKKwogTE9DQUxfU1JDX0ZJTEVTIDo9IFwKICAgYXVkaW9wb2xpY3ltYW5hZ2VyX3Rlc3RzLmNwcCBcCiAKQEAgLTI5LDQgKzMyLDM0IEBACiAKIExPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCiAKK0xPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUgOj0gZGV2aWNlLXRlc3RzCisKK2luY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKKworIyBzeXN0ZW0vYXVkaW8uaCB1dGlsaXRpZXMgdGVzdAorCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKKworTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCisgIGxpYmJhc2UgXAorICBsaWJsb2cgXAorICBsaWJtZWRpYV9oZWxwZXIgXAorICBsaWJ1dGlscworCitMT0NBTF9IRUFERVJfTElCUkFSSUVTIDo9IFwKKyAgbGlibWVkaWFfaGVhZGVycworCitMT0NBTF9TUkNfRklMRVMgOj0gXAorICBzeXN0ZW1hdWRpb190ZXN0cy5jcHAgXAorCitMT0NBTF9NT0RVTEUgOj0gc3lzdGVtYXVkaW9fdGVzdHMKKworTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKKworTE9DQUxfQ0ZMQUdTIDo9IC1XZXJyb3IgLVdhbGwKKworTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKKworTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBkZXZpY2UtdGVzdHMKKwogaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RDbGllbnQuaAppbmRleCBlYjgyMjJjLi5lNGM2NGU1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RDbGllbnQuaApAQCAtNjAsOSArNjAsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgLypkZWxheU1zKi8pIG92ZXJyaWRlIHsgfQogICAgIFN0cmluZzggZ2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCAvKmlvSGFuZGxlKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIC8qa2V5cyovKSBvdmVycmlkZSB7IHJldHVybiBTdHJpbmc4KCk7IH0KLSAgICBzdGF0dXNfdCBzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCAvKnRvbmUqLywKLSAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAvKnN0cmVhbSovKSBvdmVycmlkZSB7IHJldHVybiBOT19JTklUOyB9Ci0gICAgc3RhdHVzX3Qgc3RvcFRvbmUoKSBvdmVycmlkZSB7IHJldHVybiBOT19JTklUOyB9CiAgICAgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgLyp2b2x1bWUqLywgaW50IC8qZGVsYXlNcyovKSBvdmVycmlkZSB7IHJldHVybiBOT19JTklUOyB9CiAgICAgc3RhdHVzX3QgbW92ZUVmZmVjdHMoYXVkaW9fc2Vzc2lvbl90IC8qc2Vzc2lvbiovLAogICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IC8qc3JjT3V0cHV0Ki8sCkBAIC03NiwxMyArNzMsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qZGVsYXlNcyovKSBvdmVycmlkZSB7IHJldHVybiBOT19JTklUOyB9CiAgICAgdm9pZCBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKSBvdmVycmlkZSB7IH0KICAgICB2b2lkIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKSBvdmVycmlkZSB7IH0KKyAgICB2b2lkIG9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgLypncm91cCovLCBpbnQgLypmbGFncyovKSBvdmVycmlkZSB7IH0KICAgICBhdWRpb191bmlxdWVfaWRfdCBuZXdBdWRpb1VuaXF1ZUlkKGF1ZGlvX3VuaXF1ZV9pZF91c2VfdCAvKnVzZSovKSBvdmVycmlkZSB7IHJldHVybiAwOyB9CiAgICAgdm9pZCBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShTdHJpbmc4IC8qcmVnSWQqLywgaW50MzJfdCAvKnN0YXRlKi8pIG92ZXJyaWRlIHsgfQotICAgIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCAvKmV2ZW50Ki8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QqIC8qY2xpZW50SW5mbyovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSogLypjbGllbnRDb25maWcqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UqIC8qZGV2aWNlQ29uZmlnKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgLypwYXRjaEhhbmRsZSovKSBvdmVycmlkZSB7IH0KKyAgICB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8gX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlIF9fdW51c2VkKSBvdmVycmlkZSB7IH0KKyAgICB2b2lkIHNldEVmZmVjdFN1c3BlbmRlZChpbnQgZWZmZWN0SWQgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1c3BlbmRlZCBfX3VudXNlZCkge30KIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvcG9saWN5bWFuYWdlcl90ZXN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwCmluZGV4IGE5NTkzYjguLmRlNTY3MGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvcG9saWN5bWFuYWdlcl90ZXN0cy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9wb2xpY3ltYW5hZ2VyX3Rlc3RzLmNwcApAQCAtMTYsOSArMTYsMTUgQEAKIAogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAKKyNkZWZpbmUgTE9HX1RBRyAiQVBNX1Rlc3QiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPG1lZGlhL1BhdGNoQnVpbGRlci5oPgorCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmgiCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lUZXN0TWFuYWdlci5oIgogCkBAIC0xMDYsMTAgKzExMiwzOSBAQAogICAgIHN0ZDo6c2V0PGF1ZGlvX3BhdGNoX2hhbmRsZV90PiBtQWN0aXZlUGF0Y2hlczsKIH07CiAKK2NsYXNzIFBhdGNoQ291bnRDaGVjayB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBQYXRjaENvdW50Q2hlY2soQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudCAqY2xpZW50KQorICAgICAgICAgICAgOiBtQ2xpZW50e2NsaWVudH0sCisgICAgICAgICAgICAgIG1Jbml0aWFsQ291bnR7bUNsaWVudC0+Z2V0QWN0aXZlUGF0Y2hlc0NvdW50KCl9IHt9CisgICAgaW50IGRlbHRhRnJvbVNuYXBzaG90KCkgY29uc3QgeworICAgICAgICBzaXplX3QgY3VycmVudENvdW50ID0gbUNsaWVudC0+Z2V0QWN0aXZlUGF0Y2hlc0NvdW50KCk7CisgICAgICAgIGlmIChtSW5pdGlhbENvdW50IDw9IGN1cnJlbnRDb3VudCkgeworICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRDb3VudCAtIG1Jbml0aWFsQ291bnQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gLShzdGF0aWNfY2FzdDxpbnQ+KG1Jbml0aWFsQ291bnQgLSBjdXJyZW50Q291bnQpKTsKKyAgICAgICAgfQorICAgIH0KKyAgcHJpdmF0ZToKKyAgICBjb25zdCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50ICptQ2xpZW50OworICAgIGNvbnN0IHNpemVfdCBtSW5pdGlhbENvdW50OworfTsKKwogY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKICAgcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpOwotICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpOworICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZTsKKyAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIFNldFVwQ29uZmlnKEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpIHsgKHZvaWQpY29uZmlnOyB9CisKKyAgICB2b2lkIGR1bXBUb0xvZygpOworICAgIHZvaWQgZ2V0T3V0cHV0Rm9yQXR0cigKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICBpbnQgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICBpbnQgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCA9IG51bGxwdHIpOworICAgIFBhdGNoQ291bnRDaGVjayBzbmFwc2hvdFBhdGNoQ291bnQoKSB7IHJldHVybiBQYXRjaENvdW50Q2hlY2sobUNsaWVudC5nZXQoKSk7IH0KIAogICAgIHN0ZDo6dW5pcXVlX3B0cjxBdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50PiBtQ2xpZW50OwogICAgIHN0ZDo6dW5pcXVlX3B0cjxBdWRpb1BvbGljeVRlc3RNYW5hZ2VyPiBtTWFuYWdlcjsKQEAgLTExOSw2ICsxNTQsNyBAQAogICAgIG1DbGllbnQucmVzZXQobmV3IEF1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnQpOwogICAgIG1NYW5hZ2VyLnJlc2V0KG5ldyBBdWRpb1BvbGljeVRlc3RNYW5hZ2VyKG1DbGllbnQuZ2V0KCkpKTsKICAgICBtTWFuYWdlci0+Z2V0Q29uZmlnKCkuc2V0RGVmYXVsdCgpOworICAgIFNldFVwQ29uZmlnKCZtTWFuYWdlci0+Z2V0Q29uZmlnKCkpOyAgLy8gU3ViY2xhc3NlcyBtYXkgd2FudCB0byBjdXN0b21pemUgdGhlIGNvbmZpZy4KICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5pbml0aWFsaXplKCkpOwogICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPmluaXRDaGVjaygpKTsKIH0KQEAgLTEyOCwxNCArMTY0LDczIEBACiAgICAgbUNsaWVudC5yZXNldCgpOwogfQogCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlclRlc3Q6OmR1bXBUb0xvZygpIHsKKyAgICBpbnQgcGlwZWZkWzJdOworICAgIEFTU0VSVF9ORSgtMSwgcGlwZShwaXBlZmQpKTsKKyAgICBwaWRfdCBjcGlkID0gZm9yaygpOworICAgIEFTU0VSVF9ORSgtMSwgY3BpZCk7CisgICAgaWYgKGNwaWQgPT0gMCkgeworICAgICAgICAvLyBDaGlsZCBwcm9jZXNzIHJlYWRzIGZyb20gdGhlIHBpcGUgYW5kIGxvZ3MuCisgICAgICAgIGNsb3NlKHBpcGVmZFsxXSk7CisgICAgICAgIHN0ZDo6c3RyaW5nIGxpbmU7CisgICAgICAgIGNoYXIgYnVmOworICAgICAgICB3aGlsZSAocmVhZChwaXBlZmRbMF0sICZidWYsIHNpemVvZihidWYpKSA+IDApIHsKKyAgICAgICAgICAgIGlmIChidWYgIT0gJ1xuJykgeworICAgICAgICAgICAgICAgIGxpbmUgKz0gYnVmOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiJXMiLCBsaW5lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGxpbmUgPSAiIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIWxpbmUuZW1wdHkoKSkgQUxPR0koIiVzIiwgbGluZS5jX3N0cigpKTsKKyAgICAgICAgY2xvc2UocGlwZWZkWzBdKTsKKyAgICAgICAgX2V4aXQoRVhJVF9TVUNDRVNTKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBQYXJlbnQgZG9lcyB0aGUgZHVtcCBhbmQgY2hlY2tzIHRoZSBzdGF0dXMgY29kZS4KKyAgICAgICAgY2xvc2UocGlwZWZkWzBdKTsKKyAgICAgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtTWFuYWdlci0+ZHVtcChwaXBlZmRbMV0pKTsKKyAgICAgICAgY2xvc2UocGlwZWZkWzFdKTsKKyAgICAgICAgd2FpdChOVUxMKTsgIC8vIFdhaXQgZm9yIHRoZSBjaGlsZCB0byBleGl0LgorICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0OjpnZXRPdXRwdXRGb3JBdHRyKAorICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAorICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgIGludCBjaGFubmVsTWFzaywKKyAgICAgICAgaW50IHNhbXBsZVJhdGUsCisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpIHsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciA9IHt9OworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBBVURJT19TVFJFQU1fREVGQVVMVDsKKyAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gc2FtcGxlUmF0ZTsKKyAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2s7CisgICAgY29uZmlnLmZvcm1hdCA9IGZvcm1hdDsKKyAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBsb2NhbFBvcnRJZDsKKyAgICBpZiAoIXBvcnRJZCkgcG9ydElkID0gJmxvY2FsUG9ydElkOworICAgICpwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIEFTU0VSVF9FUShPSywgbU1hbmFnZXItPmdldE91dHB1dEZvckF0dHIoCisgICAgICAgICAgICAgICAgICAgICZhdHRyLCAmb3V0cHV0LCBBVURJT19TRVNTSU9OX05PTkUsICZzdHJlYW0sIDAgLyp1aWQqLywgJmNvbmZpZywgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQsIHt9KSk7CisgICAgQVNTRVJUX05FKEFVRElPX1BPUlRfSEFORExFX05PTkUsICpwb3J0SWQpOworfQorCisKIFRFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0LCBJbml0U3VjY2VzcykgewogICAgIC8vIFNldFVwIG11c3QgZmluaXNoIHdpdGggbm8gYXNzZXJ0aW9ucy4KIH0KIAorVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3QsIER1bXApIHsKKyAgICBkdW1wVG9Mb2coKTsKK30KKwogVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3QsIENyZWF0ZUF1ZGlvUGF0Y2hGYWlsdXJlKSB7CiAgICAgYXVkaW9fcGF0Y2ggcGF0Y2h7fTsKICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICBjb25zdCBzaXplX3QgcGF0Y2hDb3VudEJlZm9yZSA9IG1DbGllbnQtPmdldEFjdGl2ZVBhdGNoZXNDb3VudCgpOworICAgIGNvbnN0IFBhdGNoQ291bnRDaGVjayBwYXRjaENvdW50ID0gc25hcHNob3RQYXRjaENvdW50KCk7CiAgICAgQVNTRVJUX0VRKEJBRF9WQUxVRSwgbU1hbmFnZXItPmNyZWF0ZUF1ZGlvUGF0Y2gobnVsbHB0ciwgJmhhbmRsZSwgMCkpOwogICAgIEFTU0VSVF9FUShCQURfVkFMVUUsIG1NYW5hZ2VyLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgbnVsbHB0ciwgMCkpOwogICAgIEFTU0VSVF9FUShCQURfVkFMVUUsIG1NYW5hZ2VyLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgJmhhbmRsZSwgMCkpOwpAQCAtMTYyLDM1ICsyNTcsMTgwIEBACiAgICAgQVNTRVJUX0VRKElOVkFMSURfT1BFUkFUSU9OLCBtTWFuYWdlci0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZoYW5kbGUsIDApKTsKICAgICAvLyBWZXJpZnkgdGhhdCB0aGUgaGFuZGxlIGlzIGxlZnQgdW5jaGFuZ2VkLgogICAgIEFTU0VSVF9FUShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSwgaGFuZGxlKTsKLSAgICBBU1NFUlRfRVEocGF0Y2hDb3VudEJlZm9yZSwgbUNsaWVudC0+Z2V0QWN0aXZlUGF0Y2hlc0NvdW50KCkpOworICAgIEFTU0VSVF9FUSgwLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOwogfQogCiBURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdCwgQ3JlYXRlQXVkaW9QYXRjaEZyb21NaXgpIHsKLSAgICBhdWRpb19wYXRjaCBwYXRjaHt9OwogICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgIHVpZF90IHVpZCA9IDQyOwotICAgIGNvbnN0IHNpemVfdCBwYXRjaENvdW50QmVmb3JlID0gbUNsaWVudC0+Z2V0QWN0aXZlUGF0Y2hlc0NvdW50KCk7Ci0gICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOwotICAgIHsKLSAgICAgICAgYXV0byYgc3JjID0gcGF0Y2guc291cmNlc1swXTsKLSAgICAgICAgc3JjLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFOwotICAgICAgICBzcmMudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9NSVg7Ci0gICAgICAgIHNyYy5pZCA9IG1NYW5hZ2VyLT5nZXRDb25maWcoKS5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKVswXS0+Z2V0SWQoKTsKLSAgICAgICAgLy8gTm90ZTogdGhlc2UgYXJlIHRoZSBwYXJhbWV0ZXJzIG9mIHRoZSBvdXRwdXQgZGV2aWNlLgotICAgICAgICBzcmMuc2FtcGxlX3JhdGUgPSA0NDEwMDsKLSAgICAgICAgc3JjLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwotICAgICAgICBzcmMuY2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgIH0KLSAgICBwYXRjaC5udW1fc2lua3MgPSAxOwotICAgIHsKLSAgICAgICAgYXV0byYgc2luayA9IHBhdGNoLnNpbmtzWzBdOwotICAgICAgICBzaW5rLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU0lOSzsKLSAgICAgICAgc2luay50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRTsKLSAgICAgICAgc2luay5pZCA9IG1NYW5hZ2VyLT5nZXRDb25maWcoKS5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCktPmdldElkKCk7Ci0gICAgfQotICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmaGFuZGxlLCB1aWQpKTsKKyAgICBjb25zdCBQYXRjaENvdW50Q2hlY2sgcGF0Y2hDb3VudCA9IHNuYXBzaG90UGF0Y2hDb3VudCgpOworICAgIEFTU0VSVF9GQUxTRShtTWFuYWdlci0+Z2V0Q29uZmlnKCkuZ2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKCkuaXNFbXB0eSgpKTsKKyAgICBQYXRjaEJ1aWxkZXIgcGF0Y2hCdWlsZGVyOworICAgIHBhdGNoQnVpbGRlci5hZGRTb3VyY2UobU1hbmFnZXItPmdldENvbmZpZygpLmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpWzBdKS4KKyAgICAgICAgICAgIGFkZFNpbmsobU1hbmFnZXItPmdldENvbmZpZygpLmdldERlZmF1bHRPdXRwdXREZXZpY2UoKSk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtTWFuYWdlci0+Y3JlYXRlQXVkaW9QYXRjaChwYXRjaEJ1aWxkZXIucGF0Y2goKSwgJmhhbmRsZSwgdWlkKSk7CiAgICAgQVNTRVJUX05FKEFVRElPX1BBVENIX0hBTkRMRV9OT05FLCBoYW5kbGUpOwotICAgIEFTU0VSVF9FUShwYXRjaENvdW50QmVmb3JlICsgMSwgbUNsaWVudC0+Z2V0QWN0aXZlUGF0Y2hlc0NvdW50KCkpOworICAgIEFTU0VSVF9FUSgxLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOwogfQogCiAvLyBUT0RPOiBBZGQgcGF0Y2ggY3JlYXRpb24gdGVzdHMgdGhhdCBpbnZvbHZlIGFscmVhZHkgZXhpc3RpbmcgcGF0Y2gKKworY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCA6IHB1YmxpYyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0IHsKKyAgcHJvdGVjdGVkOgorICAgIHZvaWQgU2V0VXBDb25maWcoQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZykgb3ZlcnJpZGU7CisgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlOworCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gbU1zZE91dHB1dERldmljZTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtTXNkSW5wdXREZXZpY2U7Cit9OworCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2Q6OlNldFVwQ29uZmlnKEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpIHsKKyAgICAvLyBUT0RPOiBDb25zaWRlciB1c2luZyBTZXJpYWxpemVyIHRvIGxvYWQgcGFydCBvZiB0aGUgY29uZmlnIGZyb20gYSBzdHJpbmcuCisgICAgbU1zZE91dHB1dERldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKEFVRElPX0RFVklDRV9PVVRfQlVTKTsKKyAgICBzcDxBdWRpb1Byb2ZpbGU+IHBjbU91dHB1dFByb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKAorICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywgNDgwMDApOworICAgIHNwPEF1ZGlvUHJvZmlsZT4gYWMzT3V0cHV0UHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoCisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUMzLCBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLCA0ODAwMCk7CisgICAgbU1zZE91dHB1dERldmljZS0+YWRkQXVkaW9Qcm9maWxlKHBjbU91dHB1dFByb2ZpbGUpOworICAgIG1Nc2RPdXRwdXREZXZpY2UtPmFkZEF1ZGlvUHJvZmlsZShhYzNPdXRwdXRQcm9maWxlKTsKKyAgICBtTXNkSW5wdXREZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihBVURJT19ERVZJQ0VfSU5fQlVTKTsKKyAgICAvLyBNYXRjaCBvdXRwdXQgcHJvZmlsZSBmcm9tIEF1ZGlvUG9saWN5Q29uZmlnOjpzZXREZWZhdWx0LgorICAgIHNwPEF1ZGlvUHJvZmlsZT4gcGNtSW5wdXRQcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZSgKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBBVURJT19DSEFOTkVMX0lOX1NURVJFTywgNDQxMDApOworICAgIG1Nc2RJbnB1dERldmljZS0+YWRkQXVkaW9Qcm9maWxlKHBjbUlucHV0UHJvZmlsZSk7CisgICAgY29uZmlnLT5hZGRBdmFpbGFibGVEZXZpY2UobU1zZE91dHB1dERldmljZSk7CisgICAgY29uZmlnLT5hZGRBdmFpbGFibGVEZXZpY2UobU1zZElucHV0RGV2aWNlKTsKKworICAgIHNwPEh3TW9kdWxlPiBtc2RNb2R1bGUgPSBuZXcgSHdNb2R1bGUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCwgMiAvKmhhbFZlcnNpb25NYWpvciovKTsKKyAgICBId01vZHVsZUNvbGxlY3Rpb24gbW9kdWxlcyA9IGNvbmZpZy0+Z2V0SHdNb2R1bGVzKCk7CisgICAgbW9kdWxlcy5hZGQobXNkTW9kdWxlKTsKKyAgICBjb25maWctPnNldEh3TW9kdWxlcyhtb2R1bGVzKTsKKyAgICBtTXNkT3V0cHV0RGV2aWNlLT5hdHRhY2gobXNkTW9kdWxlKTsKKyAgICBtTXNkSW5wdXREZXZpY2UtPmF0dGFjaChtc2RNb2R1bGUpOworCisgICAgc3A8T3V0cHV0UHJvZmlsZT4gbXNkT3V0cHV0UHJvZmlsZSA9IG5ldyBPdXRwdXRQcm9maWxlKFN0cmluZzgoIm1zZCBpbnB1dCIpKTsKKyAgICBtc2RPdXRwdXRQcm9maWxlLT5hZGRBdWRpb1Byb2ZpbGUocGNtT3V0cHV0UHJvZmlsZSk7CisgICAgbXNkT3V0cHV0UHJvZmlsZS0+YWRkU3VwcG9ydGVkRGV2aWNlKG1Nc2RPdXRwdXREZXZpY2UpOworICAgIG1zZE1vZHVsZS0+YWRkT3V0cHV0UHJvZmlsZShtc2RPdXRwdXRQcm9maWxlKTsKKyAgICBzcDxPdXRwdXRQcm9maWxlPiBtc2RDb21wcmVzc2VkT3V0cHV0UHJvZmlsZSA9CisgICAgICAgICAgICBuZXcgT3V0cHV0UHJvZmlsZShTdHJpbmc4KCJtc2QgY29tcHJlc3NlZCBpbnB1dCIpKTsKKyAgICBtc2RDb21wcmVzc2VkT3V0cHV0UHJvZmlsZS0+YWRkQXVkaW9Qcm9maWxlKGFjM091dHB1dFByb2ZpbGUpOworICAgIG1zZENvbXByZXNzZWRPdXRwdXRQcm9maWxlLT5zZXRGbGFncygKKyAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCB8IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQgfAorICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9OX0JMT0NLSU5HKTsKKyAgICBtc2RDb21wcmVzc2VkT3V0cHV0UHJvZmlsZS0+YWRkU3VwcG9ydGVkRGV2aWNlKG1Nc2RPdXRwdXREZXZpY2UpOworICAgIG1zZE1vZHVsZS0+YWRkT3V0cHV0UHJvZmlsZShtc2RDb21wcmVzc2VkT3V0cHV0UHJvZmlsZSk7CisKKyAgICBzcDxJbnB1dFByb2ZpbGU+IG1zZElucHV0UHJvZmlsZSA9IG5ldyBJbnB1dFByb2ZpbGUoU3RyaW5nOCgibXNkIG91dHB1dCIpKTsKKyAgICBtc2RJbnB1dFByb2ZpbGUtPmFkZEF1ZGlvUHJvZmlsZShwY21JbnB1dFByb2ZpbGUpOworICAgIG1zZElucHV0UHJvZmlsZS0+YWRkU3VwcG9ydGVkRGV2aWNlKG1Nc2RJbnB1dERldmljZSk7CisgICAgbXNkTW9kdWxlLT5hZGRJbnB1dFByb2ZpbGUobXNkSW5wdXRQcm9maWxlKTsKKworICAgIC8vIEFkZCBhIHByb2ZpbGUgd2l0aCBhbm90aGVyIGVuY29kaW5nIHRvIHRoZSBkZWZhdWx0IGRldmljZSB0byB0ZXN0IHJvdXRpbmcKKyAgICAvLyBvZiBzdHJlYW1zIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgTVNELgorICAgIHNwPEF1ZGlvUHJvZmlsZT4gZHRzT3V0cHV0UHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoCisgICAgICAgICAgICBBVURJT19GT1JNQVRfRFRTLCBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLCA0ODAwMCk7CisgICAgY29uZmlnLT5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCktPmFkZEF1ZGlvUHJvZmlsZShkdHNPdXRwdXRQcm9maWxlKTsKKyAgICBzcDxPdXRwdXRQcm9maWxlPiBwcmltYXJ5RW5jb2RlZE91dHB1dFByb2ZpbGUgPSBuZXcgT3V0cHV0UHJvZmlsZShTdHJpbmc4KCJlbmNvZGVkIikpOworICAgIHByaW1hcnlFbmNvZGVkT3V0cHV0UHJvZmlsZS0+YWRkQXVkaW9Qcm9maWxlKGR0c091dHB1dFByb2ZpbGUpOworICAgIHByaW1hcnlFbmNvZGVkT3V0cHV0UHJvZmlsZS0+c2V0RmxhZ3MoQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICBwcmltYXJ5RW5jb2RlZE91dHB1dFByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShjb25maWctPmdldERlZmF1bHRPdXRwdXREZXZpY2UoKSk7CisgICAgY29uZmlnLT5nZXRId01vZHVsZXMoKS5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSktPgorICAgICAgICAgICAgYWRkT3V0cHV0UHJvZmlsZShwcmltYXJ5RW5jb2RlZE91dHB1dFByb2ZpbGUpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2Q6OlRlYXJEb3duKCkgeworICAgIG1Nc2RPdXRwdXREZXZpY2UuY2xlYXIoKTsKKyAgICBtTXNkSW5wdXREZXZpY2UuY2xlYXIoKTsKKyAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0OjpUZWFyRG93bigpOworfQorCitURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgSW5pdFN1Y2Nlc3MpIHsKKyAgICBBU1NFUlRfVFJVRShtTXNkT3V0cHV0RGV2aWNlKTsKKyAgICBBU1NFUlRfVFJVRShtTXNkSW5wdXREZXZpY2UpOworfQorCitURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgRHVtcCkgeworICAgIGR1bXBUb0xvZygpOworfQorCitURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgUGF0Y2hDcmVhdGlvbk9uU2V0Rm9yY2VVc2UpIHsKKyAgICBjb25zdCBQYXRjaENvdW50Q2hlY2sgcGF0Y2hDb3VudCA9IHNuYXBzaG90UGF0Y2hDb3VudCgpOworICAgIG1NYW5hZ2VyLT5zZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQsCisgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9BTFdBWVMpOworICAgIEFTU0VSVF9FUSgxLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworfQorCitURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgR2V0T3V0cHV0Rm9yQXR0ckVuY29kZWRSb3V0ZXNUb01zZCkgeworICAgIGNvbnN0IFBhdGNoQ291bnRDaGVjayBwYXRjaENvdW50ID0gc25hcHNob3RQYXRjaENvdW50KCk7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkOworICAgIGdldE91dHB1dEZvckF0dHIoJnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICBBVURJT19GT1JNQVRfQUMzLCBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLCA0ODAwMCwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICBBU1NFUlRfRVEoc2VsZWN0ZWREZXZpY2VJZCwgbU1zZE91dHB1dERldmljZS0+Z2V0SWQoKSk7CisgICAgQVNTRVJUX0VRKDEsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7Cit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBHZXRPdXRwdXRGb3JBdHRyUGNtUm91dGVzVG9Nc2QpIHsKKyAgICBjb25zdCBQYXRjaENvdW50Q2hlY2sgcGF0Y2hDb3VudCA9IHNuYXBzaG90UGF0Y2hDb3VudCgpOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZDsKKyAgICBnZXRPdXRwdXRGb3JBdHRyKCZzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywgNDgwMDApOworICAgIEFTU0VSVF9FUShzZWxlY3RlZERldmljZUlkLCBtTXNkT3V0cHV0RGV2aWNlLT5nZXRJZCgpKTsKKyAgICBBU1NFUlRfRVEoMSwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIEdldE91dHB1dEZvckF0dHJFbmNvZGVkUGx1c1BjbVJvdXRlc1RvTXNkKSB7CisgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQ7CisgICAgZ2V0T3V0cHV0Rm9yQXR0cigmc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQzMsIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsIDQ4MDAwLCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgIEFTU0VSVF9FUShzZWxlY3RlZERldmljZUlkLCBtTXNkT3V0cHV0RGV2aWNlLT5nZXRJZCgpKTsKKyAgICBBU1NFUlRfRVEoMSwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKKyAgICBnZXRPdXRwdXRGb3JBdHRyKCZzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywgNDgwMDApOworICAgIEFTU0VSVF9FUShzZWxlY3RlZERldmljZUlkLCBtTXNkT3V0cHV0RGV2aWNlLT5nZXRJZCgpKTsKKyAgICBBU1NFUlRfRVEoMSwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIEdldE91dHB1dEZvckF0dHJVbnN1cHBvcnRlZEZvcm1hdEJ5cGFzc2VzTXNkKSB7CisgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQ7CisgICAgZ2V0T3V0cHV0Rm9yQXR0cigmc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9EVFMsIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsIDQ4MDAwLCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgIEFTU0VSVF9ORShzZWxlY3RlZERldmljZUlkLCBtTXNkT3V0cHV0RGV2aWNlLT5nZXRJZCgpKTsKKyAgICBBU1NFUlRfRVEoMCwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIEdldE91dHB1dEZvckF0dHJGb3JtYXRTd2l0Y2hpbmcpIHsKKyAgICAvLyBTd2l0Y2ggYmV0d2VlbiBmb3JtYXRzIHRoYXQgYXJlIHN1cHBvcnRlZCBhbmQgbm90IHN1cHBvcnRlZCBieSBNU0QuCisgICAgeworICAgICAgICBjb25zdCBQYXRjaENvdW50Q2hlY2sgcGF0Y2hDb3VudCA9IHNuYXBzaG90UGF0Y2hDb3VudCgpOworICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZDsKKyAgICAgICAgZ2V0T3V0cHV0Rm9yQXR0cigmc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfQUMzLCBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLCA0ODAwMCwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNULAorICAgICAgICAgICAgICAgICZwb3J0SWQpOworICAgICAgICBBU1NFUlRfRVEoc2VsZWN0ZWREZXZpY2VJZCwgbU1zZE91dHB1dERldmljZS0+Z2V0SWQoKSk7CisgICAgICAgIEFTU0VSVF9FUSgxLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworICAgICAgICBtTWFuYWdlci0+cmVsZWFzZU91dHB1dChwb3J0SWQpOworICAgICAgICBBU1NFUlRfRVEoMSwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKKyAgICB9CisgICAgeworICAgICAgICBjb25zdCBQYXRjaENvdW50Q2hlY2sgcGF0Y2hDb3VudCA9IHNuYXBzaG90UGF0Y2hDb3VudCgpOworICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZDsKKyAgICAgICAgZ2V0T3V0cHV0Rm9yQXR0cigmc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfRFRTLCBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLCA0ODAwMCwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNULAorICAgICAgICAgICAgICAgICZwb3J0SWQpOworICAgICAgICBBU1NFUlRfTkUoc2VsZWN0ZWREZXZpY2VJZCwgbU1zZE91dHB1dERldmljZS0+Z2V0SWQoKSk7CisgICAgICAgIEFTU0VSVF9FUSgtMSwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKKyAgICAgICAgbU1hbmFnZXItPnJlbGVhc2VPdXRwdXQocG9ydElkKTsKKyAgICAgICAgQVNTRVJUX0VRKDAsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CisgICAgfQorICAgIHsKKyAgICAgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkOworICAgICAgICBnZXRPdXRwdXRGb3JBdHRyKCZzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQzMsIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsIDQ4MDAwLCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgICAgICBBU1NFUlRfRVEoc2VsZWN0ZWREZXZpY2VJZCwgbU1zZE91dHB1dERldmljZS0+Z2V0SWQoKSk7CisgICAgICAgIEFTU0VSVF9FUSgwLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3N5c3RlbWF1ZGlvX3Rlc3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3N5c3RlbWF1ZGlvX3Rlc3RzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmFhZTUyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvc3lzdGVtYXVkaW9fdGVzdHMuY3BwCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNkZWZpbmUgTE9HX1RBRyAiU3lzQXVkaW9fVGVzdCIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvUGF0Y2hCdWlsZGVyLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitURVNUKFN5c3RlbUF1ZGlvVGVzdCwgUGF0Y2hJbnZhbGlkKSB7CisgICAgYXVkaW9fcGF0Y2ggcGF0Y2h7fTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcGF0Y2hfaXNfdmFsaWQoJnBhdGNoKSk7CisgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSBBVURJT19QQVRDSF9QT1JUU19NQVggKyAxOworICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BhdGNoX2lzX3ZhbGlkKCZwYXRjaCkpOworICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMTsKKyAgICBwYXRjaC5udW1fc2lua3MgPSBBVURJT19QQVRDSF9QT1JUU19NQVggKyAxOworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wYXRjaF9pc192YWxpZCgmcGF0Y2gpKTsKKyAgICBwYXRjaC5udW1fc291cmNlcyA9IDA7CisgICAgcGF0Y2gubnVtX3NpbmtzID0gMTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcGF0Y2hfaXNfdmFsaWQoJnBhdGNoKSk7Cit9CisKK1RFU1QoU3lzdGVtQXVkaW9UZXN0LCBQYXRjaFZhbGlkKSB7CisgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWcgc3JjID0geworICAgICAgICAuaWQgPSAxLCAucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UsIC50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSB9OworICAgIC8vIEl0J3MgT0sgbm90IHRvIGhhdmUgc2lua3MuCisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcGF0Y2hfaXNfdmFsaWQoKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5wYXRjaCgpKSk7CisgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWcgc2luayA9IHsKKyAgICAgICAgLmlkID0gMiwgLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU0lOSywgLnR5cGUgPSBBVURJT19QT1JUX1RZUEVfREVWSUNFIH07CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcGF0Y2hfaXNfdmFsaWQoKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLnBhdGNoKCkpKTsKKyAgICBBU1NFUlRfVFJVRShhdWRpb19wYXRjaF9pc192YWxpZCgKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLnBhdGNoKCkpKTsKKyAgICBBU1NFUlRfVFJVRShhdWRpb19wYXRjaF9pc192YWxpZCgKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLmFkZFNpbmsoc2luaykucGF0Y2goKSkpOworICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BhdGNoX2lzX3ZhbGlkKAorICAgICAgICAgICAgICAgICAgICAoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLmFkZFNvdXJjZShzcmMpLgorICAgICAgICAgICAgICAgICAgICBhZGRTaW5rKHNpbmspLmFkZFNpbmsoc2luaykucGF0Y2goKSkpOworfQorCitURVNUKFN5c3RlbUF1ZGlvVGVzdCwgUGF0Y2hId0F2U3luYykgeworICAgIGF1ZGlvX3BvcnRfY29uZmlnIGRldmljZV9zcmNfY2ZnID0geworICAgICAgICAuaWQgPSAxLCAucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UsIC50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSB9OworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wb3J0X2NvbmZpZ19oYXNfaHdfYXZfc3luYygmZGV2aWNlX3NyY19jZmcpKTsKKyAgICBkZXZpY2Vfc3JjX2NmZy5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJmRldmljZV9zcmNfY2ZnKSk7CisgICAgZGV2aWNlX3NyY19jZmcuZmxhZ3MuaW5wdXQgPSBBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkM7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJmRldmljZV9zcmNfY2ZnKSk7CisKKyAgICBhdWRpb19wb3J0X2NvbmZpZyBkZXZpY2Vfc2lua19jZmcgPSB7CisgICAgICAgIC5pZCA9IDEsIC5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NJTkssIC50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSB9OworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wb3J0X2NvbmZpZ19oYXNfaHdfYXZfc3luYygmZGV2aWNlX3NpbmtfY2ZnKSk7CisgICAgZGV2aWNlX3NpbmtfY2ZnLmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wb3J0X2NvbmZpZ19oYXNfaHdfYXZfc3luYygmZGV2aWNlX3NpbmtfY2ZnKSk7CisgICAgZGV2aWNlX3NpbmtfY2ZnLmZsYWdzLm91dHB1dCA9IEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkM7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJmRldmljZV9zaW5rX2NmZykpOworCisgICAgYXVkaW9fcG9ydF9jb25maWcgbWl4X3NpbmtfY2ZnID0geworICAgICAgICAuaWQgPSAxLCAucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TSU5LLCAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9NSVggfTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJm1peF9zaW5rX2NmZykpOworICAgIG1peF9zaW5rX2NmZy5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJm1peF9zaW5rX2NmZykpOworICAgIG1peF9zaW5rX2NmZy5mbGFncy5pbnB1dCA9IEFVRElPX0lOUFVUX0ZMQUdfSFdfQVZfU1lOQzsKKyAgICBBU1NFUlRfVFJVRShhdWRpb19wb3J0X2NvbmZpZ19oYXNfaHdfYXZfc3luYygmbWl4X3NpbmtfY2ZnKSk7CisKKyAgICBhdWRpb19wb3J0X2NvbmZpZyBtaXhfc3JjX2NmZyA9IHsKKyAgICAgICAgLmlkID0gMSwgLnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU09VUkNFLCAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9NSVggfTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJm1peF9zcmNfY2ZnKSk7CisgICAgbWl4X3NyY19jZmcuY29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfRkxBR1M7CisgICAgQVNTRVJUX0ZBTFNFKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19od19hdl9zeW5jKCZtaXhfc3JjX2NmZykpOworICAgIG1peF9zcmNfY2ZnLmZsYWdzLm91dHB1dCA9IEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkM7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9fcG9ydF9jb25maWdfaGFzX2h3X2F2X3N5bmMoJm1peF9zcmNfY2ZnKSk7Cit9CisKK1RFU1QoU3lzdGVtQXVkaW9UZXN0LCBQYXRjaEVxdWFsKSB7CisgICAgY29uc3QgYXVkaW9fcGF0Y2ggcGF0Y2gxe30sIHBhdGNoMnt9OworICAgIC8vIEludmFsaWQgcGF0Y2hlcyBhcmUgbm90IGVxdWFsLgorICAgIEFTU0VSVF9GQUxTRShhdWRpb19wYXRjaGVzX2FyZV9lcXVhbCgmcGF0Y2gxLCAmcGF0Y2gyKSk7CisgICAgY29uc3QgYXVkaW9fcG9ydF9jb25maWcgc3JjID0geworICAgICAgICAuaWQgPSAxLCAucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UsIC50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSB9OworICAgIGNvbnN0IGF1ZGlvX3BvcnRfY29uZmlnIHNpbmsgPSB7CisgICAgICAgIC5pZCA9IDIsIC5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NJTkssIC50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSB9OworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wYXRjaGVzX2FyZV9lcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5wYXRjaCgpLAorICAgICAgICAgICAgICAgICAgICAoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLmFkZFNpbmsoc2luaykucGF0Y2goKSkpOworICAgIEFTU0VSVF9UUlVFKGF1ZGlvX3BhdGNoZXNfYXJlX2VxdWFsKAorICAgICAgICAgICAgICAgICAgICAoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLmFkZFNpbmsoc2luaykucGF0Y2goKSwKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLnBhdGNoKCkpKTsKKyAgICBBU1NFUlRfRkFMU0UoYXVkaW9fcGF0Y2hlc19hcmVfZXF1YWwoCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rKS5wYXRjaCgpLAorICAgICAgICAgICAgICAgICAgICAoUGF0Y2hCdWlsZGVye30pLmFkZFNvdXJjZShzcmMpLmFkZFNvdXJjZShzcmMpLmFkZFNpbmsoc2luaykucGF0Y2goKSkpOworICAgIGF1ZGlvX3BvcnRfY29uZmlnIHNpbmtfaHdfYXZfc3luYyA9IHNpbms7CisgICAgc2lua19od19hdl9zeW5jLmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgIHNpbmtfaHdfYXZfc3luYy5mbGFncy5vdXRwdXQgPSBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DOworICAgIEFTU0VSVF9GQUxTRShhdWRpb19wYXRjaGVzX2FyZV9lcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmspLnBhdGNoKCksCisgICAgICAgICAgICAgICAgICAgIChQYXRjaEJ1aWxkZXJ7fSkuYWRkU291cmNlKHNyYykuYWRkU2luayhzaW5rX2h3X2F2X3N5bmMpLnBhdGNoKCkpKTsKKyAgICBBU1NFUlRfVFJVRShhdWRpb19wYXRjaGVzX2FyZV9lcXVhbCgKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmtfaHdfYXZfc3luYykucGF0Y2goKSwKKyAgICAgICAgICAgICAgICAgICAgKFBhdGNoQnVpbGRlcnt9KS5hZGRTb3VyY2Uoc3JjKS5hZGRTaW5rKHNpbmtfaHdfYXZfc3luYykucGF0Y2goKSkpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL09XTkVSUyBiL3NlcnZpY2VzL2NhbWVyYS9PV05FUlMKaW5kZXggMThhY2ZlZS4uZjQ4YTk1YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL09XTkVSUworKysgYi9zZXJ2aWNlcy9jYW1lcmEvT1dORVJTCkBAIC0xLDYgKzEgQEAKLWN5Y2hlbkBnb29nbGUuY29tCi1lcGVldkBnb29nbGUuY29tCi1ldGFsdmFsYUBnb29nbGUuY29tCi1zaHV6aGVud2FuZ0Bnb29nbGUuY29tCi15aW5jaGlheWVoQGdvb2dsZS5jb20KLXpoaWp1bmhlQGdvb2dsZS5jb20KK2luY2x1ZGUgcGxhdGZvcm0vZnJhbWV3b3Jrcy9hdjovY2FtZXJhL09XTkVSUwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VjMGU0YwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxNzMgQEAKKy8vIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vCisvLyBsaWJjYW1lcmFzZXJ2aWNlCisvLworCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNhbWVyYXNlcnZpY2UiLAorCisgICAgLy8gQ2FtZXJhIHNlcnZpY2Ugc291cmNlCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDYW1lcmFTZXJ2aWNlLmNwcCIsCisgICAgICAgICJDYW1lcmFGbGFzaGxpZ2h0LmNwcCIsCisgICAgICAgICJjb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwIiwKKyAgICAgICAgImNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmNwcCIsCisgICAgICAgICJjb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcCIsCisgICAgICAgICJjb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmNwcCIsCisgICAgICAgICJhcGkxL0NhbWVyYUNsaWVudC5jcHAiLAorICAgICAgICAiYXBpMS9DYW1lcmEyQ2xpZW50LmNwcCIsCisgICAgICAgICJhcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAiLAorICAgICAgICAiYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmNwcCIsCisgICAgICAgICJhcGkxL2NsaWVudDIvU3RyZWFtaW5nUHJvY2Vzc29yLmNwcCIsCisgICAgICAgICJhcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAiLAorICAgICAgICAiYXBpMS9jbGllbnQyL0NhbGxiYWNrUHJvY2Vzc29yLmNwcCIsCisgICAgICAgICJhcGkxL2NsaWVudDIvSnBlZ0NvbXByZXNzb3IuY3BwIiwKKyAgICAgICAgImFwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcCIsCisgICAgICAgICJhcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmNwcCIsCisgICAgICAgICJhcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAiLAorICAgICAgICAiYXBpMi9Db21wb3NpdGVTdHJlYW0uY3BwIiwKKyAgICAgICAgImFwaTIvRGVwdGhDb21wb3NpdGVTdHJlYW0uY3BwIiwKKyAgICAgICAgImFwaTIvSGVpY0VuY29kZXJJbmZvTWFuYWdlci5jcHAiLAorICAgICAgICAiYXBpMi9IZWljQ29tcG9zaXRlU3RyZWFtLmNwcCIsCisgICAgICAgICJkZXZpY2UxL0NhbWVyYUhhcmR3YXJlSW50ZXJmYWNlLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwIiwKKyAgICAgICAgImRldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAiLAorICAgICAgICAiZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAiLAorICAgICAgICAiZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAiLAorICAgICAgICAiZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcCIsCisgICAgICAgICJkZXZpY2UzL1N0YXR1c1RyYWNrZXIuY3BwIiwKKyAgICAgICAgImRldmljZTMvQ2FtZXJhM0J1ZmZlck1hbmFnZXIuY3BwIiwKKyAgICAgICAgImRldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuY3BwIiwKKyAgICAgICAgImd1aS9SaW5nQnVmZmVyQ29uc3VtZXIuY3BwIiwKKyAgICAgICAgInV0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmNwcCIsCisgICAgICAgICJoaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuY3BwIiwKKyAgICAgICAgImhpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5jcHAiLAorICAgICAgICAiaGlkbC9Db252ZXJ0LmNwcCIsCisgICAgICAgICJoaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmNwcCIsCisgICAgICAgICJoaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmNwcCIsCisgICAgICAgICJ1dGlscy9DYW1lcmFUcmFjZXMuY3BwIiwKKyAgICAgICAgInV0aWxzL0F1dG9Db25kaXRpb25Mb2NrLmNwcCIsCisgICAgICAgICJ1dGlscy9FeGlmVXRpbHMuY3BwIiwKKyAgICAgICAgInV0aWxzL1RhZ01vbml0b3IuY3BwIiwKKyAgICAgICAgInV0aWxzL0xhdGVuY3lIaXN0b2dyYW0uY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmRsIiwKKyAgICAgICAgImxpYmV4aWYiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzY2FsbHN0YWNrIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKKyAgICAgICAgImxpYmNhbWVyYV9tZXRhZGF0YSIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmhhcmR3YXJlIiwKKyAgICAgICAgImxpYmh3YmluZGVyIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGlianBlZyIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAorICAgICAgICAibGlibWVtdW5yZWFjaGFibGUiLAorICAgICAgICAibGlic2Vuc29ycHJpdmFjeSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnl1diIsCisgICAgICAgICJhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5jb21tb25AMi4wIiwKKyAgICAgICAgImFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLmRldmljZUAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuY29tbW9uQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjQiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi41IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMiIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4zIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjQiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNSIsCisgICAgXSwKKworICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJsaWJzZW5zb3Jwcml2YWN5IiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSIsCisgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9uZGsiLAorICAgICAgICAiZXh0ZXJuYWwvZHluYW1pY19kZXB0aC9pbmNsdWRlcyIsCisgICAgICAgICJleHRlcm5hbC9keW5hbWljX2RlcHRoL2ludGVybmFsIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLWlnbm9yZWQtcXVhbGlmaWVycyIsCisgICAgXSwKKworfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmRlcHRocGhvdG8iLAorCisgICAgc3JjczogWworICAgICAgICAidXRpbHMvRXhpZlV0aWxzLmNwcCIsCisgICAgICAgICJjb21tb24vRGVwdGhQaG90b1Byb2Nlc3Nvci5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliaW1hZ2VfaW8iLAorICAgICAgICAibGliZHluYW1pY19kZXB0aCIsCisgICAgICAgICJsaWJ4bWwyIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlsc2NhbGxzdGFjayIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlianBlZyIsCisgICAgICAgICJsaWJtZW11bnJlYWNoYWJsZSIsCisgICAgICAgICJsaWJleGlmIiwKKyAgICAgICAgImxpYmNhbWVyYV9jbGllbnQiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImV4dGVybmFsL2R5bmFtaWNfZGVwdGgvaW5jbHVkZXMiLAorICAgICAgICAiZXh0ZXJuYWwvZHluYW1pY19kZXB0aC9pbnRlcm5hbCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVduby1pZ25vcmVkLXF1YWxpZmllcnMiLAorICAgIF0sCisKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCmluZGV4IDk2MjYxYWIuLjRjZmVjZmQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tawpAQCAtMTQsOTEgKzE0LDkgQEAKIAogTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiAKLSMKLSMgbGliY2FtZXJhc2VydmljZQotIwotCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAotIyBDYW1lcmEgc2VydmljZSBzb3VyY2UKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICBcCi0gICAgQ2FtZXJhU2VydmljZS5jcHAgXAotICAgIENhbWVyYUZsYXNobGlnaHQuY3BwIFwKLSAgICBjb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwIFwKLSAgICBjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5jcHAgXAotICAgIGNvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwIFwKLSAgICBjb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmNwcCBcCi0gICAgYXBpMS9DYW1lcmFDbGllbnQuY3BwIFwKLSAgICBhcGkxL0NhbWVyYTJDbGllbnQuY3BwIFwKLSAgICBhcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAgXAotICAgIGFwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAgXAotICAgIGFwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuY3BwIFwKLSAgICBhcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAgXAotICAgIGFwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAgXAotICAgIGFwaTEvY2xpZW50Mi9KcGVnQ29tcHJlc3Nvci5jcHAgXAotICAgIGFwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcCBcCi0gICAgYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5jcHAgXAotICAgIGFwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcCBcCi0gICAgZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM0RldmljZS5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcCBcCi0gICAgZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcCBcCi0gICAgZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwIFwKLSAgICBkZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwIFwKLSAgICBkZXZpY2UzL1N0YXR1c1RyYWNrZXIuY3BwIFwKLSAgICBkZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmNwcCBcCi0gICAgZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwIFwKLSAgICBkZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuY3BwIFwKLSAgICBndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcCBcCi0gICAgdXRpbHMvQ2FtZXJhVHJhY2VzLmNwcCBcCi0gICAgdXRpbHMvQXV0b0NvbmRpdGlvbkxvY2suY3BwIFwKLSAgICB1dGlscy9UYWdNb25pdG9yLmNwcCBcCi0gICAgdXRpbHMvTGF0ZW5jeUhpc3RvZ3JhbS5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUzo9IFwKLSAgICBsaWJ1aSBcCi0gICAgbGlibG9nIFwKLSAgICBsaWJ1dGlsc2NhbGxzdGFjayBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYmJpbmRlciBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJtZWRpYSBcCi0gICAgbGlibWVkaWF1dGlscyBcCi0gICAgbGliY2FtZXJhX2NsaWVudCBcCi0gICAgbGliY2FtZXJhX21ldGFkYXRhIFwKLSAgICBsaWJmbXEgXAotICAgIGxpYmd1aSBcCi0gICAgbGliaGFyZHdhcmUgXAotICAgIGxpYmhpZGxiYXNlIFwKLSAgICBsaWJoaWRsdHJhbnNwb3J0IFwKLSAgICBsaWJqcGVnIFwKLSAgICBsaWJtZW11bnJlYWNoYWJsZSBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuY29tbW9uQDEuMCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40IFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMS4wIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4yIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4zIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy40Ci0KLUxPQ0FMX0VYUE9SVF9TSEFSRURfTElCUkFSWV9IRUFERVJTIDo9IGxpYmJpbmRlciBsaWJjYW1lcmFfY2xpZW50IGxpYmZtcQotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICBzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4Ci0KLUxPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZQotCi1MT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdleHRyYSAtV2Vycm9yCi0KLUxPQ0FMX01PRFVMRTo9IGxpYmNhbWVyYXNlcnZpY2UKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi0jIEJ1aWxkIHRlc3RzIHRvbworIyBCdWlsZCB0ZXN0cwogCiBpbmNsdWRlICQoTE9DQUxfUEFUSCkvdGVzdHMvQW5kcm9pZC5tawogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFGbGFzaGxpZ2h0LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUZsYXNobGlnaHQuY3BwCmluZGV4IDQ3MWM3N2QuLmU2MjljZGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUZsYXNobGlnaHQuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYUZsYXNobGlnaHQuY3BwCkBAIC0xMjUsNyArMTI1LDcgQEAKICAgICBzdGF0dXNfdCByZXM7CiAKICAgICBzdGQ6OnZlY3RvcjxTdHJpbmc4PiBjYW1lcmFJZHM7Ci0gICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGlkcyA9IG1Qcm92aWRlck1hbmFnZXItPmdldEFQSTFDb21wYXRpYmxlQ2FtZXJhRGV2aWNlSWRzKCk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGlkcyA9IG1Qcm92aWRlck1hbmFnZXItPmdldENhbWVyYURldmljZUlkcygpOwogICAgIGludCBudW1iZXJPZkNhbWVyYXMgPSBzdGF0aWNfY2FzdDxpbnQ+KGlkcy5zaXplKCkpOwogICAgIGNhbWVyYUlkcy5yZXNpemUobnVtYmVyT2ZDYW1lcmFzKTsKICAgICAvLyBObyBtb2R1bGUsIG11c3QgYmUgcHJvdmlkZXIKQEAgLTIxNyw3ICsyMTcsNyBAQAogCiAgICAgICAgIGlmIChtT3BlbmVkQ2FtZXJhSWRzLnNpemUoKSA9PSAwKSB7CiAgICAgICAgICAgICAvLyBub3RpZnkgdG9yY2ggdW5hdmFpbGFibGUgZm9yIGFsbCBjYW1lcmFzIHdpdGggYSBmbGFzaAotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGlkcyA9IG1Qcm92aWRlck1hbmFnZXItPmdldEFQSTFDb21wYXRpYmxlQ2FtZXJhRGV2aWNlSWRzKCk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaWRzID0gbVByb3ZpZGVyTWFuYWdlci0+Z2V0Q2FtZXJhRGV2aWNlSWRzKCk7CiAgICAgICAgICAgICBpbnQgbnVtQ2FtZXJhcyA9IHN0YXRpY19jYXN0PGludD4oaWRzLnNpemUoKSk7CiAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUNhbWVyYXM7IGkrKykgewogICAgICAgICAgICAgICAgIFN0cmluZzggaWQ4KGlkc1tpXS5jX3N0cigpKTsKQEAgLTI2Myw3ICsyNjMsNyBAQAogCiAgICAgaWYgKGlzQmFja3dhcmRDb21wYXRpYmxlTW9kZShjYW1lcmFJZCkpIHsKICAgICAgICAgLy8gbm90aWZ5IHRvcmNoIGF2YWlsYWJsZSBmb3IgYWxsIGNhbWVyYXMgd2l0aCBhIGZsYXNoCi0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpZHMgPSBtUHJvdmlkZXJNYW5hZ2VyLT5nZXRBUEkxQ29tcGF0aWJsZUNhbWVyYURldmljZUlkcygpOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gaWRzID0gbVByb3ZpZGVyTWFuYWdlci0+Z2V0Q2FtZXJhRGV2aWNlSWRzKCk7CiAgICAgICAgIGludCBudW1DYW1lcmFzID0gc3RhdGljX2Nhc3Q8aW50PihpZHMuc2l6ZSgpKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1DYW1lcmFzOyBpKyspIHsKICAgICAgICAgICAgIFN0cmluZzggaWQ4KGlkc1tpXS5jX3N0cigpKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKaW5kZXggMmJmNDJiNi4uYTg3ZWJkZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5jcHAKQEAgLTQ3LDExICs0NywxNSBAQAogI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgImhpZGwvSGlkbENhbWVyYVNlcnZpY2UuaCIKKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxtZW11bnJlYWNoYWJsZS9tZW11bnJlYWNoYWJsZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvQmF0dGVyeU5vdGlmaWVyLmg+CisjaW5jbHVkZSA8c2Vuc29ycHJpdmFjeS9TZW5zb3JQcml2YWN5TWFuYWdlci5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CkBAIC02OSw2ICs3Myw3IEBACiAjaW5jbHVkZSAiYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaCIKICNpbmNsdWRlICJ1dGlscy9DYW1lcmFUcmFjZXMuaCIKICNpbmNsdWRlICJ1dGlscy9UYWdNb25pdG9yLmgiCisjaW5jbHVkZSAidXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaCIKIAogbmFtZXNwYWNlIHsKICAgICBjb25zdCBjaGFyKiBrUGVybWlzc2lvblNlcnZpY2VOYW1lID0gInBlcm1pc3Npb24iOwpAQCAtNzcsNiArODIsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiB1c2luZyBiaW5kZXI6OlN0YXR1czsKK3VzaW5nIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpIaWRsQ2FtZXJhU2VydmljZTsKIHVzaW5nIGhhcmR3YXJlOjpJQ2FtZXJhOwogdXNpbmcgaGFyZHdhcmU6OklDYW1lcmFDbGllbnQ7CiB1c2luZyBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eTsKQEAgLTExMSw2ICsxMTcsMTQgQEAKIAogc3RhdGljIGNvbnN0IFN0cmluZzE2IHNNYW5hZ2VDYW1lcmFQZXJtaXNzaW9uKCJhbmRyb2lkLnBlcm1pc3Npb24uTUFOQUdFX0NBTUVSQSIpOwogCisvLyBNYXRjaGVzIHdpdGggUEVSQ0VQVElCTEVfQVBQX0FESiBpbiBQcm9jZXNzTGlzdC5qYXZhCitzdGF0aWMgY29uc3RleHByIGludDMyX3Qga1ZlbmRvckNsaWVudFNjb3JlID0gMjAwOworLy8gTWF0Y2hlcyB3aXRoIFBST0NFU1NfU1RBVEVfUEVSU0lTVEVOVF9VSSBpbiBBY3Rpdml0eU1hbmFnZXIuamF2YQorc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtWZW5kb3JDbGllbnRTdGF0ZSA9IDE7CisKK011dGV4IENhbWVyYVNlcnZpY2U6OnNQcm94eU11dGV4Oworc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk+IENhbWVyYVNlcnZpY2U6OnNDYW1lcmFTZXJ2aWNlUHJveHk7CisKIENhbWVyYVNlcnZpY2U6OkNhbWVyYVNlcnZpY2UoKSA6CiAgICAgICAgIG1FdmVudExvZyhERUZBVUxUX0VWRU5UX0xPR19MRU5HVEgpLAogICAgICAgICBtTnVtYmVyT2ZDYW1lcmFzKDApLApAQCAtMTQxLDYgKzE1NSwxMyBAQAogCiAgICAgbVVpZFBvbGljeSA9IG5ldyBVaWRQb2xpY3kodGhpcyk7CiAgICAgbVVpZFBvbGljeS0+cmVnaXN0ZXJTZWxmKCk7CisgICAgbVNlbnNvclByaXZhY3lQb2xpY3kgPSBuZXcgU2Vuc29yUHJpdmFjeVBvbGljeSh0aGlzKTsKKyAgICBtU2Vuc29yUHJpdmFjeVBvbGljeS0+cmVnaXN0ZXJTZWxmKCk7CisgICAgc3A8SGlkbENhbWVyYVNlcnZpY2U+IGhjcyA9IEhpZGxDYW1lcmFTZXJ2aWNlOjpnZXRJbnN0YW5jZSh0aGlzKTsKKyAgICBpZiAoaGNzLT5yZWdpc3RlckFzU2VydmljZSgpICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlZ2lzdGVyIGRlZmF1bHQgYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2Uuc2VydmljZUAxLjAiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgIH0KIH0KIAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6ZW51bWVyYXRlUHJvdmlkZXJzKCkgewpAQCAtMTgxLDI1ICsyMDIsMjkgQEAKIAogICAgIGZvciAoYXV0byYgY2FtZXJhSWQgOiBkZXZpY2VJZHMpIHsKICAgICAgICAgU3RyaW5nOCBpZDggPSBTdHJpbmc4KGNhbWVyYUlkLmNfc3RyKCkpOwotICAgICAgICBvbkRldmljZVN0YXR1c0NoYW5nZWQoaWQ4LCBDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQpOworICAgICAgICBpZiAoZ2V0Q2FtZXJhU3RhdGUoaWQ4KSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBvbkRldmljZVN0YXR1c0NoYW5nZWQoaWQ4LCBDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQpOworICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQogCiBzcDxJQ2FtZXJhU2VydmljZVByb3h5PiBDYW1lcmFTZXJ2aWNlOjpnZXRDYW1lcmFTZXJ2aWNlUHJveHkoKSB7Ci0gICAgc3A8SUNhbWVyYVNlcnZpY2VQcm94eT4gcHJveHlCaW5kZXIgPSBudWxscHRyOwogI2lmbmRlZiBfX0JSSUxMT19fCi0gICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwotICAgIC8vIFVzZSBjaGVja1NlcnZpY2UgYmVjYXVzZSBjYW1lcmFzZXJ2ZXIgbm9ybWFsbHkgc3RhcnRzIGJlZm9yZSB0aGUKLSAgICAvLyBzeXN0ZW0gc2VydmVyIGFuZCB0aGUgcHJveHkgc2VydmljZS4gU28gdGhlIGxvbmcgdGltZW91dCB0aGF0IGdldFNlcnZpY2UKLSAgICAvLyBoYXMgYmVmb3JlIGdpdmluZyB1cCBpcyBpbmFwcHJvcHJpYXRlLgotICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IHNtLT5jaGVja1NlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmNhbWVyYS5wcm94eSIpKTsKLSAgICBpZiAoYmluZGVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgcHJveHlCaW5kZXIgPSBpbnRlcmZhY2VfY2FzdDxJQ2FtZXJhU2VydmljZVByb3h5PihiaW5kZXIpOworICAgIE11dGV4OjpBdXRvbG9jayBhbChzUHJveHlNdXRleCk7CisgICAgaWYgKHNDYW1lcmFTZXJ2aWNlUHJveHkgPT0gbnVsbHB0cikgeworICAgICAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisgICAgICAgIC8vIFVzZSBjaGVja1NlcnZpY2UgYmVjYXVzZSBjYW1lcmFzZXJ2ZXIgbm9ybWFsbHkgc3RhcnRzIGJlZm9yZSB0aGUKKyAgICAgICAgLy8gc3lzdGVtIHNlcnZlciBhbmQgdGhlIHByb3h5IHNlcnZpY2UuIFNvIHRoZSBsb25nIHRpbWVvdXQgdGhhdCBnZXRTZXJ2aWNlCisgICAgICAgIC8vIGhhcyBiZWZvcmUgZ2l2aW5nIHVwIGlzIGluYXBwcm9wcmlhdGUuCisgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IHNtLT5jaGVja1NlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLmNhbWVyYS5wcm94eSIpKTsKKyAgICAgICAgaWYgKGJpbmRlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzQ2FtZXJhU2VydmljZVByb3h5ID0gaW50ZXJmYWNlX2Nhc3Q8SUNhbWVyYVNlcnZpY2VQcm94eT4oYmluZGVyKTsKKyAgICAgICAgfQogICAgIH0KICNlbmRpZgotICAgIHJldHVybiBwcm94eUJpbmRlcjsKKyAgICByZXR1cm4gc0NhbWVyYVNlcnZpY2VQcm94eTsKIH0KIAogdm9pZCBDYW1lcmFTZXJ2aWNlOjpwaW5nQ2FtZXJhU2VydmljZVByb3h5KCkgewpAQCAtMjA4LDkgKzIzMywxOCBAQAogICAgIHByb3h5QmluZGVyLT5waW5nRm9yVXNlclVwZGF0ZSgpOwogfQogCit2b2lkIENhbWVyYVNlcnZpY2U6OmJyb2FkY2FzdFRvcmNoTW9kZVN0YXR1cyhjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwgVG9yY2hNb2RlU3RhdHVzIHN0YXR1cykgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TdGF0dXNMaXN0ZW5lckxvY2spOworCisgICAgZm9yIChhdXRvJiBpIDogbUxpc3RlbmVyTGlzdCkgeworICAgICAgICBpLnNlY29uZC0+Z2V0TGlzdGVuZXIoKS0+b25Ub3JjaFN0YXR1c0NoYW5nZWQobWFwVG9JbnRlcmZhY2Uoc3RhdHVzKSwgU3RyaW5nMTZ7Y2FtZXJhSWR9KTsKKyAgICB9Cit9CisKIENhbWVyYVNlcnZpY2U6On5DYW1lcmFTZXJ2aWNlKCkgewogICAgIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNsZWFyR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcigpOwogICAgIG1VaWRQb2xpY3ktPnVucmVnaXN0ZXJTZWxmKCk7CisgICAgbVNlbnNvclByaXZhY3lQb2xpY3ktPnVucmVnaXN0ZXJTZWxmKCk7CiB9CiAKIHZvaWQgQ2FtZXJhU2VydmljZTo6b25OZXdQcm92aWRlclJlZ2lzdGVyZWQoKSB7CkBAIC0yNDYsNiArMjgwLDggQEAKICAgICBpZiAobUZsYXNobGlnaHQtPmhhc0ZsYXNoVW5pdChpZCkpIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1Ub3JjaFN0YXR1c011dGV4KTsKICAgICAgICAgbVRvcmNoU3RhdHVzTWFwLmFkZChpZCwgVG9yY2hNb2RlU3RhdHVzOjpBVkFJTEFCTEVfT0ZGKTsKKworICAgICAgICBicm9hZGNhc3RUb3JjaE1vZGVTdGF0dXMoaWQsIFRvcmNoTW9kZVN0YXR1czo6QVZBSUxBQkxFX09GRik7CiAgICAgfQogCiAgICAgdXBkYXRlQ2FtZXJhTnVtQW5kSWRzKCk7CkBAIC0zMjUsNyArMzYxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQsCiAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXN7fSk7CiAgICAgICAgICAgICAvLyBFbnN1cmUgbm90IGluIGJpbmRlciBSUEMgc28gY2xpZW50IGRpc2Nvbm5lY3QgUElEIGNoZWNrcyB3b3JrIGNvcnJlY3RseQotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihnZXRDYWxsaW5nUGlkKCkgIT0gZ2V0cGlkKCksCisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkgIT0gZ2V0cGlkKCksCiAgICAgICAgICAgICAgICAgICAgICJvbkRldmljZVN0YXR1c0NoYW5nZWQgbXVzdCBiZSBjYWxsZWQgZnJvbSB0aGUgY2FtZXJhIHNlcnZpY2UgcHJvY2VzcyEiKTsKICAgICAgICAgICAgIGNsaWVudFRvRGlzY29ubmVjdC0+ZGlzY29ubmVjdCgpOwogICAgICAgICB9CkBAIC0zOTgsMTIgKzQzNCw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TdGF0dXNMaXN0ZW5lckxvY2spOwotICAgICAgICBmb3IgKGF1dG8mIGkgOiBtTGlzdGVuZXJMaXN0KSB7Ci0gICAgICAgICAgICBpLT5vblRvcmNoU3RhdHVzQ2hhbmdlZChtYXBUb0ludGVyZmFjZShuZXdTdGF0dXMpLCBTdHJpbmcxNntjYW1lcmFJZH0pOwotICAgICAgICB9Ci0gICAgfQorICAgIGJyb2FkY2FzdFRvcmNoTW9kZVN0YXR1cyhjYW1lcmFJZCwgbmV3U3RhdHVzKTsKIH0KIAogU3RhdHVzIENhbWVyYVNlcnZpY2U6OmdldE51bWJlck9mQ2FtZXJhcyhpbnQzMl90IHR5cGUsIGludDMyX3QqIG51bUNhbWVyYXMpIHsKQEAgLTQ5MSwxNyArNTIyLDM3IEBACiAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgfQogCisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nVWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiB0YWdzUmVtb3ZlZDsKKyAgICAvLyBJZiBpdCdzIG5vdCBjYWxsaW5nIGZyb20gY2FtZXJhc2VydmVyLCBjaGVjayB0aGUgcGVybWlzc2lvbi4KKyAgICBpZiAoKGNhbGxpbmdQaWQgIT0gZ2V0cGlkKCkpICYmCisgICAgICAgICAgICAhY2hlY2tQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FNRVJBIiksIGNhbGxpbmdQaWQsIGNhbGxpbmdVaWQpKSB7CisgICAgICAgIHJlcyA9IGNhbWVyYUluZm8tPnJlbW92ZVBlcm1pc3Npb25FbnRyaWVzKAorICAgICAgICAgICAgICAgIG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmdldFByb3ZpZGVyVGFnSWRMb2NrZWQoU3RyaW5nOChjYW1lcmFJZCkuc3RyaW5nKCkpLAorICAgICAgICAgICAgICAgICZ0YWdzUmVtb3ZlZCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIGNhbWVyYUluZm8tPmNsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgIkZhaWxlZCB0byByZW1vdmUgY2FtZXJhIgorICAgICAgICAgICAgICAgICAgICAiIGNoYXJhY3RlcmlzdGljcyBuZWVkaW5nIGNhbWVyYSBwZXJtaXNzaW9uIGZvciBkZXZpY2UgJXM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGNhbWVyYUlkKS5zdHJpbmcoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXRhZ3NSZW1vdmVkLmVtcHR5KCkpIHsKKyAgICAgICAgcmVzID0gY2FtZXJhSW5mby0+dXBkYXRlKEFORFJPSURfUkVRVUVTVF9DSEFSQUNURVJJU1RJQ19LRVlTX05FRURJTkdfUEVSTUlTU0lPTiwKKyAgICAgICAgICAgICAgICB0YWdzUmVtb3ZlZC5kYXRhKCksIHRhZ3NSZW1vdmVkLnNpemUoKSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIGNhbWVyYUluZm8tPmNsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgIkZhaWxlZCB0byBpbnNlcnQgY2FtZXJhICIKKyAgICAgICAgICAgICAgICAgICAgImtleXMgbmVlZGluZyBwZXJtaXNzaW9uIGZvciBkZXZpY2UgJXM6ICVzICglZCkiLCBTdHJpbmc4KGNhbWVyYUlkKS5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIH0KKyAgICB9CisKICAgICByZXR1cm4gcmV0OwogfQogCi1pbnQgQ2FtZXJhU2VydmljZTo6Z2V0Q2FsbGluZ1BpZCgpIHsKLSAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotfQotCi1pbnQgQ2FtZXJhU2VydmljZTo6Z2V0Q2FsbGluZ1VpZCgpIHsKLSAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotfQotCiBTdHJpbmc4IENhbWVyYVNlcnZpY2U6OmdldEZvcm1hdHRlZEN1cnJlbnRUaW1lKCkgewogICAgIHRpbWVfdCBub3cgPSB0aW1lKG51bGxwdHIpOwogICAgIGNoYXIgZm9ybWF0dGVkVGltZVs2NF07CkBAIC01ODIsNyArNjMzLDcgQEAKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjptYWtlQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICBjb25zdCBzcDxJSW50ZXJmYWNlPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzE2JiBwYWNrYWdlTmFtZSwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGludCBmYWNpbmcsIGludCBjbGllbnRQaWQsIHVpZF90IGNsaWVudFVpZCwgaW50IHNlcnZpY2VQaWQsCi0gICAgICAgIGJvb2wgbGVnYWN5TW9kZSwgaW50IGhhbFZlcnNpb24sIGludCBkZXZpY2VWZXJzaW9uLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwKKyAgICAgICAgaW50IGhhbFZlcnNpb24sIGludCBkZXZpY2VWZXJzaW9uLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwKICAgICAgICAgLypvdXQqL3NwPEJhc2ljQ2xpZW50PiogY2xpZW50KSB7CiAKICAgICBpZiAoaGFsVmVyc2lvbiA8IDAgfHwgaGFsVmVyc2lvbiA9PSBkZXZpY2VWZXJzaW9uKSB7CkBAIC01OTQsNyArNjQ1LDcgQEAKICAgICAgICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PiB0bXAgPSBzdGF0aWNfY2FzdDxJQ2FtZXJhQ2xpZW50Kj4oY2FtZXJhQ2IuZ2V0KCkpOwogICAgICAgICAgICAgICAgICpjbGllbnQgPSBuZXcgQ2FtZXJhQ2xpZW50KGNhbWVyYVNlcnZpY2UsIHRtcCwgcGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBhcGkxQ2FtZXJhSWQsIGZhY2luZywgY2xpZW50UGlkLCBjbGllbnRVaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRwaWQoKSwgbGVnYWN5TW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRwaWQoKSk7CiAgICAgICAgICAgICB9IGVsc2UgeyAvLyBDYW1lcmEyIEFQSSByb3V0ZQogICAgICAgICAgICAgICAgIEFMT0dXKCJDYW1lcmEgdXNpbmcgb2xkIEhBTCB2ZXJzaW9uOiAlZCIsIGRldmljZVZlcnNpb24pOwogICAgICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0RFUFJFQ0FURURfSEFMLApAQCAtNjA3LDEyICs2NTgsMTMgQEAKICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgogICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzM6CiAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNDoKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM181OgogICAgICAgICAgICAgaWYgKGVmZmVjdGl2ZUFwaUxldmVsID09IEFQSV8xKSB7IC8vIENhbWVyYTEgQVBJIHJvdXRlCiAgICAgICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD4gdG1wID0gc3RhdGljX2Nhc3Q8SUNhbWVyYUNsaWVudCo+KGNhbWVyYUNiLmdldCgpKTsKICAgICAgICAgICAgICAgICAqY2xpZW50ID0gbmV3IENhbWVyYTJDbGllbnQoY2FtZXJhU2VydmljZSwgdG1wLCBwYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBmYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZVBpZCwgbGVnYWN5TW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlUGlkKTsKICAgICAgICAgICAgIH0gZWxzZSB7IC8vIENhbWVyYTIgQVBJIHJvdXRlCiAgICAgICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IHRtcCA9CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcyo+KGNhbWVyYUNiLmdldCgpKTsKQEAgLTYzNiw3ICs2ODgsNyBAQAogICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD4gdG1wID0gc3RhdGljX2Nhc3Q8SUNhbWVyYUNsaWVudCo+KGNhbWVyYUNiLmdldCgpKTsKICAgICAgICAgICAgICpjbGllbnQgPSBuZXcgQ2FtZXJhQ2xpZW50KGNhbWVyYVNlcnZpY2UsIHRtcCwgcGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgIGFwaTFDYW1lcmFJZCwgZmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZVBpZCwgbGVnYWN5TW9kZSk7CisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VQaWQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gT3RoZXIgY29tYmluYXRpb25zIChlLmcuIEhBTDMueCBvcGVuIGFzIEhBTDIueCkgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0LgogICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgY2FtZXJhIEhBTCB2ZXJzaW9uICV4OiBIQUwgJXggZGV2aWNlIGNhbiBvbmx5IGJlIgpAQCAtNzI1LDcgKzc3Nyw3IEBACiB9CiAKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjppbml0aWFsaXplU2hpbU1ldGFkYXRhKGludCBjYW1lcmFJZCkgewotICAgIGludCB1aWQgPSBnZXRDYWxsaW5nVWlkKCk7CisgICAgaW50IHVpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CiAKICAgICBTdHJpbmcxNiBpbnRlcm5hbFBhY2thZ2VOYW1lKCJjYW1lcmFzZXJ2ZXIiKTsKICAgICBTdHJpbmc4IGlkID0gU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGNhbWVyYUlkKTsKQEAgLTczNSw4ICs3ODcsNyBAQAogICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD57bnVsbHB0cn0sIGlkLCBjYW1lcmFJZCwKICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oQ0FNRVJBX0hBTF9BUElfVkVSU0lPTl9VTlNQRUNJRklFRCksCiAgICAgICAgICAgICBpbnRlcm5hbFBhY2thZ2VOYW1lLCB1aWQsIFVTRV9DQUxMSU5HX1BJRCwKLSAgICAgICAgICAgIEFQSV8xLCAvKmxlZ2FjeU1vZGUqLyBmYWxzZSwgLypzaGltVXBkYXRlT25seSovIHRydWUsCi0gICAgICAgICAgICAvKm91dCovIHRtcCkKKyAgICAgICAgICAgIEFQSV8xLCAvKnNoaW1VcGRhdGVPbmx5Ki8gdHJ1ZSwgLypvdXQqLyB0bXApCiAgICAgICAgICAgICApLmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yIGluaXRpYWxpemluZyBzaGltIG1ldGFkYXRhOiAlcyIsIF9fRlVOQ1RJT05fXywgcmV0LnRvU3RyaW5nOCgpLnN0cmluZygpKTsKICAgICB9CkBAIC03NzUsOSArODI2LDkgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgIGludDY0X3QgdG9rZW4gPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICByZXQgPSBpbml0aWFsaXplU2hpbU1ldGFkYXRhKGNhbWVyYUlkKTsKLSAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CiAgICAgaWYgKCFyZXQuaXNPaygpKSB7CiAgICAgICAgIC8vIEVycm9yIGFscmVhZHkgbG9nZ2VkIGJ5IGNhbGxlZQogICAgICAgICByZXR1cm4gcmV0OwpAQCAtODE3LDYgKzg2OCwyNSBAQAogICAgIH0KIH0KIAorc3RhdGljIHN0YXR1c190IGdldFVpZEZvclBhY2thZ2UoU3RyaW5nMTYgcGFja2FnZU5hbWUsIGludCB1c2VySWQsIC8qaW5vdXQqL3VpZF90JiB1aWQsIGludCBlcnIpIHsKKyAgICBQZXJtaXNzaW9uQ29udHJvbGxlciBwYzsKKyAgICB1aWQgPSBwYy5nZXRQYWNrYWdlVWlkKHBhY2thZ2VOYW1lLCAwKTsKKyAgICBpZiAodWlkIDw9IDApIHsKKyAgICAgICAgQUxPR0UoIlVua25vd24gcGFja2FnZTogJyVzJyIsIFN0cmluZzgocGFja2FnZU5hbWUpLnN0cmluZygpKTsKKyAgICAgICAgZHByaW50ZihlcnIsICJVbmtub3duIHBhY2thZ2U6ICclcydcbiIsIFN0cmluZzgocGFja2FnZU5hbWUpLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAodXNlcklkIDwgMCkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCB1c2VyOiAlZCIsIHVzZXJJZCk7CisgICAgICAgIGRwcmludGYoZXJyLCAiSW52YWxpZCB1c2VyOiAlZFxuIiwgdXNlcklkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICB1aWQgPSBtdWx0aXVzZXJfZ2V0X3VpZCh1c2VySWQsIHVpZCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6dmFsaWRhdGVDb25uZWN0TG9ja2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICBjb25zdCBTdHJpbmc4JiBjbGllbnROYW1lOCwgLyppbm91dCovaW50JiBjbGllbnRVaWQsIC8qaW5vdXQqL2ludCYgY2xpZW50UGlkLAogICAgICAgICAvKm91dCovaW50JiBvcmlnaW5hbENsaWVudFBpZCkgY29uc3QgewpAQCAtODM0LDcgKzkwNCw3IEBACiAgICAgfQogI2VuZGlmICAvLyBfX0JSSUxMT19fCiAKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAKICAgICBpZiAoIW1Jbml0aWFsaXplZCkgewogICAgICAgICBBTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChQSUQgJWQpIHJlamVjdGVkIChjYW1lcmEgSEFMIG1vZHVsZSBub3QgbG9hZGVkKSIsCkBAIC04NjgsOCArOTM4LDggQEAKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjp2YWxpZGF0ZUNsaWVudFBlcm1pc3Npb25zTG9ja2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICBjb25zdCBTdHJpbmc4JiBjbGllbnROYW1lOCwgaW50JiBjbGllbnRVaWQsIGludCYgY2xpZW50UGlkLAogICAgICAgICAvKm91dCovaW50JiBvcmlnaW5hbENsaWVudFBpZCkgY29uc3QgewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOwotICAgIGludCBjYWxsaW5nVWlkID0gZ2V0Q2FsbGluZ1VpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1VpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CiAKICAgICAvLyBDaGVjayBpZiB3ZSBjYW4gdHJ1c3QgY2xpZW50VWlkCiAgICAgaWYgKGNsaWVudFVpZCA9PSBVU0VfQ0FMTElOR19VSUQpIHsKQEAgLTkwOCwxMSArOTc4LDIyIEBACiAKICAgICAvLyBNYWtlIHN1cmUgdGhlIFVJRCBpcyBpbiBhbiBhY3RpdmUgc3RhdGUgdG8gdXNlIHRoZSBjYW1lcmEKICAgICBpZiAoIW1VaWRQb2xpY3ktPmlzVWlkQWN0aXZlKGNhbGxpbmdVaWQsIFN0cmluZzE2KGNsaWVudE5hbWU4KSkpIHsKKyAgICAgICAgaW50MzJfdCBwcm9jU3RhdGUgPSBtVWlkUG9saWN5LT5nZXRQcm9jU3RhdGUoY2FsbGluZ1VpZCk7CiAgICAgICAgIEFMT0dFKCJBY2Nlc3MgRGVuaWFsOiBjYW4ndCB1c2UgdGhlIGNhbWVyYSBmcm9tIGFuIGlkbGUgVUlEIHBpZD0lZCwgdWlkPSVkIiwKICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkKTsKICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfRElTQUJMRUQsCi0gICAgICAgICAgICAgICAgIkNhbGxlciBcIiVzXCIgKFBJRCAlZCwgVUlEICVkKSBjYW5ub3Qgb3BlbiBjYW1lcmEgXCIlc1wiIGZyb20gYmFja2dyb3VuZCIsCi0gICAgICAgICAgICAgICAgY2xpZW50TmFtZTguc3RyaW5nKCksIGNsaWVudFVpZCwgY2xpZW50UGlkLCBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgIkNhbGxlciBcIiVzXCIgKFBJRCAlZCwgVUlEICVkKSBjYW5ub3Qgb3BlbiBjYW1lcmEgXCIlc1wiIGZyb20gYmFja2dyb3VuZCAoIgorICAgICAgICAgICAgICAgICJjYWxsaW5nIFVJRCAlZCBwcm9jIHN0YXRlICUiIFBSSWQzMiAiKSIsCisgICAgICAgICAgICAgICAgY2xpZW50TmFtZTguc3RyaW5nKCksIGNsaWVudFVpZCwgY2xpZW50UGlkLCBjYW1lcmFJZC5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICBjYWxsaW5nVWlkLCBwcm9jU3RhdGUpOworICAgIH0KKworICAgIC8vIElmIHNlbnNvciBwcml2YWN5IGlzIGVuYWJsZWQgdGhlbiBwcmV2ZW50IGFjY2VzcyB0byB0aGUgY2FtZXJhCisgICAgaWYgKG1TZW5zb3JQcml2YWN5UG9saWN5LT5pc1NlbnNvclByaXZhY3lFbmFibGVkKCkpIHsKKyAgICAgICAgQUxPR0UoIkFjY2VzcyBEZW5pYWw6IGNhbm5vdCB1c2UgdGhlIGNhbWVyYSB3aGVuIHNlbnNvciBwcml2YWN5IGlzIGVuYWJsZWQiKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfRElTQUJMRUQsCisgICAgICAgICAgICAgICAgIkNhbGxlciBcIiVzXCIgKFBJRCAlZCwgVUlEICVkKSBjYW5ub3Qgb3BlbiBjYW1lcmEgXCIlc1wiIHdoZW4gc2Vuc29yIHByaXZhY3kgIgorICAgICAgICAgICAgICAgICJpcyBlbmFibGVkIiwgY2xpZW50TmFtZTguc3RyaW5nKCksIGNsaWVudFVpZCwgY2xpZW50UGlkLCBjYW1lcmFJZC5zdHJpbmcoKSk7CiAgICAgfQogCiAgICAgLy8gT25seSB1c2UgcGFzc2VkIGluIGNsaWVudFBpZCB0byBjaGVjayBwZXJtaXNzaW9uLiBVc2UgY2FsbGluZyBQSUQgYXMgdGhlIGNsaWVudCBQSUQgdGhhdCdzCkBAIC05MjMsOCArMTAwNCw5IEBACiAgICAgdXNlcmlkX3QgY2xpZW50VXNlcklkID0gbXVsdGl1c2VyX2dldF91c2VyX2lkKGNsaWVudFVpZCk7CiAKICAgICAvLyBPbmx5IGFsbG93IGNsaWVudHMgd2hvIGFyZSBiZWluZyB1c2VkIGJ5IHRoZSBjdXJyZW50IGZvcmVncm91bmQgZGV2aWNlIHVzZXIsIHVubGVzcyBjYWxsaW5nCi0gICAgLy8gZnJvbSBvdXIgb3duIHByb2Nlc3MuCi0gICAgaWYgKGNhbGxpbmdQaWQgIT0gZ2V0cGlkKCkgJiYgKG1BbGxvd2VkVXNlcnMuZmluZChjbGllbnRVc2VySWQpID09IG1BbGxvd2VkVXNlcnMuZW5kKCkpKSB7CisgICAgLy8gZnJvbSBvdXIgb3duIHByb2Nlc3MgT1IgdGhlIGNhbGxlciBpcyB1c2luZyB0aGUgY2FtZXJhc2VydmVyJ3MgSElETCBpbnRlcmZhY2UuCisgICAgaWYgKCFoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+aXNTZXJ2aW5nQ2FsbCgpICYmIGNhbGxpbmdQaWQgIT0gZ2V0cGlkKCkgJiYKKyAgICAgICAgICAgIChtQWxsb3dlZFVzZXJzLmZpbmQoY2xpZW50VXNlcklkKSA9PSBtQWxsb3dlZFVzZXJzLmVuZCgpKSkgewogICAgICAgICBBTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChQSUQgJWQpIHJlamVjdGVkIChjYW5ub3QgY29ubmVjdCBmcm9tICIKICAgICAgICAgICAgICAgICAiZGV2aWNlIHVzZXIgJWQsIGN1cnJlbnRseSBhbGxvd2VkIGRldmljZSB1c2VyczogJXMpIiwgY2FsbGluZ1BpZCwgY2xpZW50VXNlcklkLAogICAgICAgICAgICAgICAgIHRvU3RyaW5nKG1BbGxvd2VkVXNlcnMpLnN0cmluZygpKTsKQEAgLTkzOCw3ICsxMDIwLDcgQEAKIAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6Y2hlY2tJZkRldmljZUlzVXNhYmxlKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKSBjb25zdCB7CiAgICAgYXV0byBjYW1lcmFTdGF0ZSA9IGdldENhbWVyYVN0YXRlKGNhbWVyYUlkKTsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgaWYgKGNhbWVyYVN0YXRlID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIkNhbWVyYVNlcnZpY2U6OmNvbm5lY3QgWCAoUElEICVkKSByZWplY3RlZCAoaW52YWxpZCBjYW1lcmEgSUQgJXMpIiwgY2FsbGluZ1BpZCwKICAgICAgICAgICAgICAgICBjYW1lcmFJZC5zdHJpbmcoKSk7CkBAIC0xMDQzLDcgKzExMjUsOCBAQAogICAgICAgICBzdGQ6Om1hcDxpbnQscmVzb3VyY2VfcG9saWN5OjpDbGllbnRQcmlvcml0eT4gcGlkVG9Qcmlvcml0eU1hcDsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvd25lclBpZHMuc2l6ZSgpIC0gMTsgaSsrKSB7CiAgICAgICAgICAgICBwaWRUb1ByaW9yaXR5TWFwLmVtcGxhY2Uob3duZXJQaWRzW2ldLAotICAgICAgICAgICAgICAgICAgICByZXNvdXJjZV9wb2xpY3k6OkNsaWVudFByaW9yaXR5KHByaW9yaXR5U2NvcmVzW2ldLCBzdGF0ZXNbaV0pKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VfcG9saWN5OjpDbGllbnRQcmlvcml0eShwcmlvcml0eVNjb3Jlc1tpXSwgc3RhdGVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlzVmVuZG9yQ2xpZW50IHdvbid0IGdldCBjb3BpZWQgb3ZlciovIGZhbHNlKSk7CiAgICAgICAgIH0KICAgICAgICAgbUFjdGl2ZUNsaWVudE1hbmFnZXIudXBkYXRlUHJpb3JpdGllcyhwaWRUb1ByaW9yaXR5TWFwKTsKIApAQCAtMTE0Miw3ICsxMjI1LDcgQEAKICAgICBtU2VydmljZUxvY2sudW5sb2NrKCk7CiAKICAgICAvLyBDbGVhciBjYWxsZXIgaWRlbnRpdHkgdGVtcG9yYXJpbHkgc28gY2xpZW50IGRpc2Nvbm5lY3QgUElEIGNoZWNrcyB3b3JrIGNvcnJlY3RseQotICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgIGludDY0X3QgdG9rZW4gPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKIAogICAgIC8vIERlc3Ryb3kgZXZpY3RlZCBjbGllbnRzCiAgICAgZm9yIChhdXRvJiBpIDogZXZpY3RlZENsaWVudHMpIHsKQEAgLTExNTAsNyArMTIzMyw3IEBACiAgICAgICAgIGktPmdldFZhbHVlKCktPmRpc2Nvbm5lY3QoKTsgLy8gQ2xpZW50cyB3aWxsIHJlbW92ZSB0aGVtc2VsdmVzIGZyb20gdGhlIGFjdGl2ZSBjbGllbnQgbGlzdAogICAgIH0KIAotICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgIENhbWVyYVRocmVhZFN0YXRlOjpyZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKIAogICAgIGZvciAoY29uc3QgYXV0byYgaSA6IGV2aWN0ZWRDbGllbnRzKSB7CiAgICAgICAgIEFMT0dWKCIlczogV2FpdGluZyBmb3IgZGlzY29ubmVjdCB0byBjb21wbGV0ZSBmb3IgY2xpZW50IGZvciBkZXZpY2UgJXMgKFBJRCAlIiBQUklkMzIgIikiLApAQCAtMTIwMCwxMSArMTI4MywxMCBAQAogICAgIHNwPENsaWVudD4gY2xpZW50ID0gbnVsbHB0cjsKICAgICByZXQgPSBjb25uZWN0SGVscGVyPElDYW1lcmFDbGllbnQsQ2xpZW50PihjYW1lcmFDbGllbnQsIGlkLCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgICAgICBDQU1FUkFfSEFMX0FQSV9WRVJTSU9OX1VOU1BFQ0lGSUVELCBjbGllbnRQYWNrYWdlTmFtZSwgY2xpZW50VWlkLCBjbGllbnRQaWQsIEFQSV8xLAotICAgICAgICAgICAgLypsZWdhY3lNb2RlKi8gZmFsc2UsIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwKLSAgICAgICAgICAgIC8qb3V0Ki9jbGllbnQpOworICAgICAgICAgICAgLypzaGltVXBkYXRlT25seSovIGZhbHNlLCAvKm91dCovY2xpZW50KTsKIAogICAgIGlmKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgIGxvZ1JlamVjdGVkKGlkLCBnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpLAorICAgICAgICBsb2dSZWplY3RlZChpZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSksCiAgICAgICAgICAgICAgICAgcmV0LnRvU3RyaW5nOCgpKTsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CkBAIC0xMjI3LDEyICsxMzA5LDExIEBACiAgICAgU3RhdHVzIHJldCA9IFN0YXR1czo6b2soKTsKICAgICBzcDxDbGllbnQ+IGNsaWVudCA9IG51bGxwdHI7CiAgICAgcmV0ID0gY29ubmVjdEhlbHBlcjxJQ2FtZXJhQ2xpZW50LENsaWVudD4oY2FtZXJhQ2xpZW50LCBpZCwgYXBpMUNhbWVyYUlkLCBoYWxWZXJzaW9uLAotICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsIGNsaWVudFVpZCwgVVNFX0NBTExJTkdfUElELCBBUElfMSwKLSAgICAgICAgICAgIC8qbGVnYWN5TW9kZSovIHRydWUsIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwKKyAgICAgICAgICAgIGNsaWVudFBhY2thZ2VOYW1lLCBjbGllbnRVaWQsIFVTRV9DQUxMSU5HX1BJRCwgQVBJXzEsIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwKICAgICAgICAgICAgIC8qb3V0Ki9jbGllbnQpOwogCiAgICAgaWYoIXJldC5pc09rKCkpIHsKLSAgICAgICAgbG9nUmVqZWN0ZWQoaWQsIGdldENhbGxpbmdQaWQoKSwgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSksCisgICAgICAgIGxvZ1JlamVjdGVkKGlkLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBTdHJpbmc4KGNsaWVudFBhY2thZ2VOYW1lKSwKICAgICAgICAgICAgICAgICByZXQudG9TdHJpbmc4KCkpOwogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KQEAgLTEyNDEsNiArMTMyMiwxOCBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKK2Jvb2wgQ2FtZXJhU2VydmljZTo6c2hvdWxkUmVqZWN0SGlkZGVuQ2FtZXJhQ29ubmVjdGlvbihjb25zdCBTdHJpbmc4ICYgY2FtZXJhSWQpIHsKKyAgICAvLyBJZiB0aGUgdGhyZWFkIHNlcnZpbmcgdGhpcyBjYWxsIGlzIG5vdCBhIGh3YmluZGVyIHRocmVhZCBhbmQgdGhlIGNhbGxlcgorICAgIC8vIGlzbid0IHRoZSBjYW1lcmFzZXJ2ZXIgaXRzZWxmLCBhbmQgdGhlIGNhbWVyYSBpZCBiZWluZyByZXF1ZXN0ZWQgaXMgdG8gYmUKKyAgICAvLyBwdWJsaWNhbGx5IGhpZGRlbiwgd2Ugc2hvdWxkIHJlamVjdCB0aGUgY29ubmVjdGlvbi4KKyAgICBpZiAoIWhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5pc1NlcnZpbmdDYWxsKCkgJiYKKyAgICAgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkgIT0gZ2V0cGlkKCkgJiYKKyAgICAgICAgICAgIG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYShjYW1lcmFJZC5jX3N0cigpKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6Y29ubmVjdERldmljZSgKICAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+JiBjYW1lcmFDYiwKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLApAQCAtMTI1MywxNSArMTM0NiwxNCBAQAogICAgIFN0YXR1cyByZXQgPSBTdGF0dXM6Om9rKCk7CiAgICAgU3RyaW5nOCBpZCA9IFN0cmluZzgoY2FtZXJhSWQpOwogICAgIHNwPENhbWVyYURldmljZUNsaWVudD4gY2xpZW50ID0gbnVsbHB0cjsKKwogICAgIHJldCA9IGNvbm5lY3RIZWxwZXI8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3MsQ2FtZXJhRGV2aWNlQ2xpZW50PihjYW1lcmFDYiwgaWQsCiAgICAgICAgICAgICAvKmFwaTFDYW1lcmFJZCovLTEsCiAgICAgICAgICAgICBDQU1FUkFfSEFMX0FQSV9WRVJTSU9OX1VOU1BFQ0lGSUVELCBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIGNsaWVudFVpZCwgVVNFX0NBTExJTkdfUElELCBBUElfMiwKLSAgICAgICAgICAgIC8qbGVnYWN5TW9kZSovIGZhbHNlLCAvKnNoaW1VcGRhdGVPbmx5Ki8gZmFsc2UsCi0gICAgICAgICAgICAvKm91dCovY2xpZW50KTsKKyAgICAgICAgICAgIGNsaWVudFVpZCwgVVNFX0NBTExJTkdfUElELCBBUElfMiwgLypzaGltVXBkYXRlT25seSovIGZhbHNlLCAvKm91dCovY2xpZW50KTsKIAogICAgIGlmKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgIGxvZ1JlamVjdGVkKGlkLCBnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpLAorICAgICAgICBsb2dSZWplY3RlZChpZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSksCiAgICAgICAgICAgICAgICAgcmV0LnRvU3RyaW5nOCgpKTsKICAgICAgICAgcmV0dXJuIHJldDsKICAgICB9CkBAIC0xMjczLDcgKzEzNjUsNyBAQAogdGVtcGxhdGU8Y2xhc3MgQ0FMTEJBQ0ssIGNsYXNzIENMSUVOVD4KIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjpjb25uZWN0SGVscGVyKGNvbnN0IHNwPENBTExCQUNLPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBpbnQgaGFsVmVyc2lvbiwgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLCBpbnQgY2xpZW50VWlkLAotICAgICAgICBpbnQgY2xpZW50UGlkLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgYm9vbCBsZWdhY3lNb2RlLCBib29sIHNoaW1VcGRhdGVPbmx5LAorICAgICAgICBpbnQgY2xpZW50UGlkLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgYm9vbCBzaGltVXBkYXRlT25seSwKICAgICAgICAgLypvdXQqL3NwPENMSUVOVD4mIGRldmljZSkgewogICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IGJpbmRlcjo6U3RhdHVzOjpvaygpOwogCkBAIC0xMjg2LDYgKzEzNzgsMTQgQEAKICAgICAgICAgICAgIChoYWxWZXJzaW9uID09IC0xKSA/ICJkZWZhdWx0IiA6IHN0ZDo6dG9fc3RyaW5nKGhhbFZlcnNpb24pLmNfc3RyKCksCiAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGVmZmVjdGl2ZUFwaUxldmVsKSk7CiAKKyAgICBpZiAoc2hvdWxkUmVqZWN0SGlkZGVuQ2FtZXJhQ29ubmVjdGlvbihjYW1lcmFJZCkpIHsKKyAgICAgICAgQUxPR1coIkF0dGVtcHRpbmcgdG8gY29ubmVjdCB0byBzeXN0ZW0tb25seSBjYW1lcmEgaWQgJXMsIGNvbm5lY3Rpb24gcmVqZWN0ZWQiLAorICAgICAgICAgICAgICBjYW1lcmFJZC5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfRElTQ09OTkVDVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTm8gY2FtZXJhIGRldmljZSB3aXRoIElEIFwiJXNcIiBjdXJyZW50bHkgYXZhaWxhYmxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCkpOworCisgICAgfQogICAgIHNwPENMSUVOVD4gY2xpZW50ID0gbnVsbHB0cjsKICAgICB7CiAgICAgICAgIC8vIEFjcXVpcmUgbVNlcnZpY2VMb2NrIGFuZCBwcmV2ZW50IG90aGVyIGNsaWVudHMgZnJvbSBjb25uZWN0aW5nCkBAIC0xMzU4LDcgKzE0NTgsNyBAQAogICAgICAgICBzcDxCYXNpY0NsaWVudD4gdG1wID0gbnVsbHB0cjsKICAgICAgICAgaWYoIShyZXQgPSBtYWtlQ2xpZW50KHRoaXMsIGNhbWVyYUNiLCBjbGllbnRQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgYXBpMUNhbWVyYUlkLCBmYWNpbmcsCi0gICAgICAgICAgICAgICAgY2xpZW50UGlkLCBjbGllbnRVaWQsIGdldHBpZCgpLCBsZWdhY3lNb2RlLAorICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLCBnZXRwaWQoKSwKICAgICAgICAgICAgICAgICBoYWxWZXJzaW9uLCBkZXZpY2VWZXJzaW9uLCBlZmZlY3RpdmVBcGlMZXZlbCwKICAgICAgICAgICAgICAgICAvKm91dCovJnRtcCkpLmlzT2soKSkgewogICAgICAgICAgICAgcmV0dXJuIHJldDsKQEAgLTE0NDIsNyArMTU0Miw3IEBACiAgICAgfQogCiAgICAgU3RyaW5nOCBpZCA9IFN0cmluZzgoY2FtZXJhSWQuc3RyaW5nKCkpOwotICAgIGludCB1aWQgPSBnZXRDYWxsaW5nVWlkKCk7CisgICAgaW50IHVpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CiAKICAgICAvLyB2ZXJpZnkgaWQgaXMgdmFsaWQuCiAgICAgYXV0byBzdGF0ZSA9IGdldENhbWVyYVN0YXRlKGlkKTsKQEAgLTE1NDQsMTggKzE2NDQsNDIgQEAKICAgICAgICAgfQogICAgIH0KIAorICAgIGludCBjbGllbnRQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOworICAgIGNvbnN0IGNoYXIgKmlkX2NzdHIgPSBpZC5jX3N0cigpOworICAgIGNvbnN0IGNoYXIgKnRvcmNoU3RhdGUgPSBlbmFibGVkID8gIm9uIiA6ICJvZmYiOworICAgIEFMT0dJKCJUb3JjaCBmb3IgY2FtZXJhIGlkICVzIHR1cm5lZCAlcyBmb3IgY2xpZW50IFBJRCAlZCIsIGlkX2NzdHIsIHRvcmNoU3RhdGUsIGNsaWVudFBpZCk7CisgICAgbG9nVG9yY2hFdmVudChpZF9jc3RyLCB0b3JjaFN0YXRlICwgY2xpZW50UGlkKTsKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6bm90aWZ5U3lzdGVtRXZlbnQoaW50MzJfdCBldmVudElkLAogICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgYXJncykgeworICAgIGNvbnN0IGludCBwaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOworICAgIGNvbnN0IGludCBzZWxmUGlkID0gZ2V0cGlkKCk7CisKKyAgICAvLyBQZXJtaXNzaW9uIGNoZWNrcworICAgIGlmIChwaWQgIT0gc2VsZlBpZCkgeworICAgICAgICAvLyBFbnN1cmUgd2UncmUgYmVpbmcgY2FsbGVkIGJ5IHN5c3RlbV9zZXJ2ZXIsIG9yIHNpbWlsYXIgcHJvY2VzcyB3aXRoCisgICAgICAgIC8vIHBlcm1pc3Npb25zIHRvIG5vdGlmeSB0aGUgY2FtZXJhIHNlcnZpY2UgYWJvdXQgc3lzdGVtIGV2ZW50cworICAgICAgICBpZiAoIWNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oCisgICAgICAgICAgICAgICAgU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkFfU0VORF9TWVNURU1fRVZFTlRTIikpKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgdWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKKyAgICAgICAgICAgIEFMT0dFKCJQZXJtaXNzaW9uIERlbmlhbDogY2Fubm90IHNlbmQgdXBkYXRlcyB0byBjYW1lcmEgc2VydmljZSBhYm91dCBzeXN0ZW0iCisgICAgICAgICAgICAgICAgICAgICIgZXZlbnRzIGZyb20gcGlkPSVkLCB1aWQ9JWQiLCBwaWQsIHVpZCk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9QRVJNSVNTSU9OX0RFTklFRCwKKyAgICAgICAgICAgICAgICAgICAgIk5vIHBlcm1pc3Npb24gdG8gc2VuZCB1cGRhdGVzIHRvIGNhbWVyYSBzZXJ2aWNlIGFib3V0IHN5c3RlbSBldmVudHMiCisgICAgICAgICAgICAgICAgICAgICIgZnJvbSBwaWQ9JWQsIHVpZD0lZCIsIHBpZCwgdWlkKTsKKyAgICAgICAgfQorICAgIH0KKwogICAgIEFUUkFDRV9DQUxMKCk7CiAKICAgICBzd2l0Y2goZXZlbnRJZCkgewogICAgICAgICBjYXNlIElDYW1lcmFTZXJ2aWNlOjpFVkVOVF9VU0VSX1NXSVRDSEVEOiB7Ci0gICAgICAgICAgICAvLyBUcnkgdG8gcmVnaXN0ZXIgZm9yIFVJRCBwb2xpY3kgdXBkYXRlcywgaW4gY2FzZSB3ZSdyZSByZWNvdmVyaW5nCisgICAgICAgICAgICAvLyBUcnkgdG8gcmVnaXN0ZXIgZm9yIFVJRCBhbmQgc2Vuc29yIHByaXZhY3kgcG9saWN5IHVwZGF0ZXMsIGluIGNhc2Ugd2UncmUgcmVjb3ZlcmluZwogICAgICAgICAgICAgLy8gZnJvbSBhIHN5c3RlbSBzZXJ2ZXIgY3Jhc2gKICAgICAgICAgICAgIG1VaWRQb2xpY3ktPnJlZ2lzdGVyU2VsZigpOworICAgICAgICAgICAgbVNlbnNvclByaXZhY3lQb2xpY3ktPnJlZ2lzdGVyU2VsZigpOwogICAgICAgICAgICAgZG9Vc2VyU3dpdGNoKC8qbmV3VXNlcklkcyovIGFyZ3MpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTE1NjksOSArMTY5Myw3MiBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKK3ZvaWQgQ2FtZXJhU2VydmljZTo6bm90aWZ5TW9uaXRvcmVkVWlkcygpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU3RhdHVzTGlzdGVuZXJMb2NrKTsKKworICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiBtTGlzdGVuZXJMaXN0KSB7CisgICAgICAgIGF1dG8gcmV0ID0gaXQuc2Vjb25kLT5nZXRMaXN0ZW5lcigpLT5vbkNhbWVyYUFjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkKCk7CisgICAgICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gdHJpZ2dlciBwZXJtaXNzaW9uIGNhbGxiYWNrOiAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgcmV0LmV4Y2VwdGlvbkNvZGUoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1N0YXR1cyBDYW1lcmFTZXJ2aWNlOjpub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShpbnQ2NF90IG5ld1N0YXRlKSB7CisgICAgY29uc3QgaW50IHBpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CisgICAgY29uc3QgaW50IHNlbGZQaWQgPSBnZXRwaWQoKTsKKworICAgIC8vIFBlcm1pc3Npb24gY2hlY2tzCisgICAgaWYgKHBpZCAhPSBzZWxmUGlkKSB7CisgICAgICAgIC8vIEVuc3VyZSB3ZSdyZSBiZWluZyBjYWxsZWQgYnkgc3lzdGVtX3NlcnZlciwgb3Igc2ltaWxhciBwcm9jZXNzIHdpdGgKKyAgICAgICAgLy8gcGVybWlzc2lvbnMgdG8gbm90aWZ5IHRoZSBjYW1lcmEgc2VydmljZSBhYm91dCBzeXN0ZW0gZXZlbnRzCisgICAgICAgIGlmICghY2hlY2tDYWxsaW5nUGVybWlzc2lvbigKKyAgICAgICAgICAgICAgICBTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQV9TRU5EX1NZU1RFTV9FVkVOVFMiKSkpIHsKKyAgICAgICAgICAgIGNvbnN0IGludCB1aWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpOworICAgICAgICAgICAgQUxPR0UoIlBlcm1pc3Npb24gRGVuaWFsOiBjYW5ub3Qgc2VuZCB1cGRhdGVzIHRvIGNhbWVyYSBzZXJ2aWNlIGFib3V0IGRldmljZSIKKyAgICAgICAgICAgICAgICAgICAgIiBzdGF0ZSBjaGFuZ2VzIGZyb20gcGlkPSVkLCB1aWQ9JWQiLCBwaWQsIHVpZCk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9QRVJNSVNTSU9OX0RFTklFRCwKKyAgICAgICAgICAgICAgICAgICAgIk5vIHBlcm1pc3Npb24gdG8gc2VuZCB1cGRhdGVzIHRvIGNhbWVyYSBzZXJ2aWNlIGFib3V0IGRldmljZSBzdGF0ZSIKKyAgICAgICAgICAgICAgICAgICAgIiBjaGFuZ2VzIGZyb20gcGlkPSVkLCB1aWQ9JWQiLCBwaWQsIHVpZCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgdXNpbmcgaGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlOworICAgIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPERldmljZVN0YXRlPiBuZXdEZXZpY2VTdGF0ZXt9OworICAgIGlmIChuZXdTdGF0ZSAmIElDYW1lcmFTZXJ2aWNlOjpERVZJQ0VfU1RBVEVfQkFDS19DT1ZFUkVEKSB7CisgICAgICAgIG5ld0RldmljZVN0YXRlIHw9IERldmljZVN0YXRlOjpCQUNLX0NPVkVSRUQ7CisgICAgfQorICAgIGlmIChuZXdTdGF0ZSAmIElDYW1lcmFTZXJ2aWNlOjpERVZJQ0VfU1RBVEVfRlJPTlRfQ09WRVJFRCkgeworICAgICAgICBuZXdEZXZpY2VTdGF0ZSB8PSBEZXZpY2VTdGF0ZTo6RlJPTlRfQ09WRVJFRDsKKyAgICB9CisgICAgaWYgKG5ld1N0YXRlICYgSUNhbWVyYVNlcnZpY2U6OkRFVklDRV9TVEFURV9GT0xERUQpIHsKKyAgICAgICAgbmV3RGV2aWNlU3RhdGUgfD0gRGV2aWNlU3RhdGU6OkZPTERFRDsKKyAgICB9CisgICAgLy8gT25seSBtYXAgdmVuZG9yIGJpdHMgZGlyZWN0bHkKKyAgICB1aW50NjRfdCB2ZW5kb3JCaXRzID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KG5ld1N0YXRlKSAmIDB4RkZGRkZGRkYwMDAwMDAwMGw7CisgICAgbmV3RGV2aWNlU3RhdGUgfD0gdmVuZG9yQml0czsKKworICAgIEFMT0dWKCIlczogTmV3IGRldmljZSBzdGF0ZSAweCUiIFBSSXg2NCwgX19GVU5DVElPTl9fLCBuZXdEZXZpY2VTdGF0ZSk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVNlcnZpY2VMb2NrKTsKKyAgICBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5ub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShuZXdEZXZpY2VTdGF0ZSk7CisKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6YWRkTGlzdGVuZXIoY29uc3Qgc3A8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4mIGxpc3RlbmVyLAogICAgICAgICAvKm91dCovCiAgICAgICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdGF0dXM+ICpjYW1lcmFTdGF0dXNlcykgeworICAgIHJldHVybiBhZGRMaXN0ZW5lckhlbHBlcihsaXN0ZW5lciwgY2FtZXJhU3RhdHVzZXMpOworfQorCitTdGF0dXMgQ2FtZXJhU2VydmljZTo6YWRkTGlzdGVuZXJIZWxwZXIoY29uc3Qgc3A8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAvKm91dCovCisgICAgICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdGF0dXM+ICpjYW1lcmFTdGF0dXNlcywKKyAgICAgICAgYm9vbCBpc1ZlbmRvckxpc3RlbmVyKSB7CisKICAgICBBVFJBQ0VfQ0FMTCgpOwogCiAgICAgQUxPR1YoIiVzOiBBZGQgbGlzdGVuZXIgJXAiLCBfX0ZVTkNUSU9OX18sIGxpc3RlbmVyLmdldCgpKTsKQEAgLTE1ODUsMjEgKzE3NzIsMzcgQEAKIAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVN0YXR1c0xpc3RlbmVyTG9jayk7Ci0gICAgICAgIGZvciAoYXV0byYgaXQgOiBtTGlzdGVuZXJMaXN0KSB7Ci0gICAgICAgICAgICBpZiAoSUludGVyZmFjZTo6YXNCaW5kZXIoaXQpID09IElJbnRlcmZhY2U6OmFzQmluZGVyKGxpc3RlbmVyKSkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJml0IDogbUxpc3RlbmVyTGlzdCkgeworICAgICAgICAgICAgaWYgKElJbnRlcmZhY2U6OmFzQmluZGVyKGl0LnNlY29uZC0+Z2V0TGlzdGVuZXIoKSkgPT0gSUludGVyZmFjZTo6YXNCaW5kZXIobGlzdGVuZXIpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBUcmllZCB0byBhZGQgbGlzdGVuZXIgJXAgd2hpY2ggd2FzIGFscmVhZHkgc3Vic2NyaWJlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBsaXN0ZW5lci5nZXQoKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihFUlJPUl9BTFJFQURZX0VYSVNUUywgIkxpc3RlbmVyIGFscmVhZHkgcmVnaXN0ZXJlZCIpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgbUxpc3RlbmVyTGlzdC5wdXNoX2JhY2sobGlzdGVuZXIpOworICAgICAgICBhdXRvIGNsaWVudFVpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CisgICAgICAgIHNwPFNlcnZpY2VMaXN0ZW5lcj4gc2VydmljZUxpc3RlbmVyID0gbmV3IFNlcnZpY2VMaXN0ZW5lcih0aGlzLCBsaXN0ZW5lciwgY2xpZW50VWlkKTsKKyAgICAgICAgYXV0byByZXQgPSBzZXJ2aWNlTGlzdGVuZXItPmluaXRpYWxpemUoKTsKKyAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkZhaWxlZCB0byBpbml0aWFsaXplIHNlcnZpY2UgbGlzdGVuZXI6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmV0KSwgcmV0KTsKKyAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKEVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgbUxpc3RlbmVyTGlzdC5lbXBsYWNlX2JhY2soaXNWZW5kb3JMaXN0ZW5lciwgc2VydmljZUxpc3RlbmVyKTsKKyAgICAgICAgbVVpZFBvbGljeS0+cmVnaXN0ZXJNb25pdG9yVWlkKGNsaWVudFVpZCk7CiAgICAgfQogCiAgICAgLyogQ29sbGVjdCBjdXJyZW50IGRldmljZXMgYW5kIHN0YXR1cyAqLwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUNhbWVyYVN0YXRlc0xvY2spOwogICAgICAgICBmb3IgKGF1dG8mIGkgOiBtQ2FtZXJhU3RhdGVzKSB7CisgICAgICAgICAgICBpZiAoIWlzVmVuZG9yTGlzdGVuZXIgJiYKKyAgICAgICAgICAgICAgICBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5pc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmEoaS5maXJzdC5jX3N0cigpKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJDYW5ub3QgYWRkIHB1YmxpYyBsaXN0ZW5lciBmb3IgaGlkZGVuIHN5c3RlbS1vbmx5ICVzIGZvciBwaWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIGkuZmlyc3QuY19zdHIoKSwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjYW1lcmFTdGF0dXNlcy0+ZW1wbGFjZV9iYWNrKGkuZmlyc3QsIG1hcFRvSW50ZXJmYWNlKGkuc2Vjb25kLT5nZXRTdGF0dXMoKSkpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTYzNCw3ICsxODM3LDkgQEAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TdGF0dXNMaXN0ZW5lckxvY2spOwogICAgICAgICBmb3IgKGF1dG8gaXQgPSBtTGlzdGVuZXJMaXN0LmJlZ2luKCk7IGl0ICE9IG1MaXN0ZW5lckxpc3QuZW5kKCk7IGl0KyspIHsKLSAgICAgICAgICAgIGlmIChJSW50ZXJmYWNlOjphc0JpbmRlcigqaXQpID09IElJbnRlcmZhY2U6OmFzQmluZGVyKGxpc3RlbmVyKSkgeworICAgICAgICAgICAgaWYgKElJbnRlcmZhY2U6OmFzQmluZGVyKGl0LT5zZWNvbmQtPmdldExpc3RlbmVyKCkpID09IElJbnRlcmZhY2U6OmFzQmluZGVyKGxpc3RlbmVyKSkgeworICAgICAgICAgICAgICAgIG1VaWRQb2xpY3ktPnVucmVnaXN0ZXJNb25pdG9yVWlkKGl0LT5zZWNvbmQtPmdldExpc3RlbmVyVWlkKCkpOworICAgICAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGxpc3RlbmVyKS0+dW5saW5rVG9EZWF0aChpdC0+c2Vjb25kKTsKICAgICAgICAgICAgICAgICBtTGlzdGVuZXJMaXN0LmVyYXNlKGl0KTsKICAgICAgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogICAgICAgICAgICAgfQpAQCAtMTY5Miw3ICsxODk3LDcgQEAKICAgICB9CiAKICAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IGdldERldmljZVZlcnNpb24oaWQpOwotICAgIHN3aXRjaChkZXZpY2VWZXJzaW9uKSB7CisgICAgc3dpdGNoIChkZXZpY2VWZXJzaW9uKSB7CiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8xXzA6CiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzA6CiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzE6CkBAIC0xNzA5LDYgKzE5MTQsNyBAQAogICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgogICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18zOgogICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM180OgorICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM181OgogICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgaWQgJXMgdXNlcyBIQUwzLjIgb3IgbmV3ZXIsIHN1cHBvcnRzIGFwaTEvYXBpMiBkaXJlY3RseSIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuc3RyaW5nKCkpOwogICAgICAgICAgICAgKmlzU3VwcG9ydGVkID0gdHJ1ZTsKQEAgLTE3MjksNiArMTkzNSwxOCBAQAogICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiB9CiAKK1N0YXR1cyBDYW1lcmFTZXJ2aWNlOjppc0hpZGRlblBoeXNpY2FsQ2FtZXJhKGNvbnN0IFN0cmluZzE2JiBjYW1lcmFJZCwKKyAgICAgICAgLypvdXQqLyBib29sICppc1N1cHBvcnRlZCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICBjb25zdCBTdHJpbmc4IGlkID0gU3RyaW5nOChjYW1lcmFJZCk7CisKKyAgICBBTE9HVigiJXM6IGZvciBjYW1lcmEgSUQgPSAlcyIsIF9fRlVOQ1RJT05fXywgaWQuc3RyaW5nKCkpOworICAgICppc1N1cHBvcnRlZCA9IG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmlzSGlkZGVuUGh5c2ljYWxDYW1lcmEoaWQuc3RyaW5nKCkpOworCisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKwogdm9pZCBDYW1lcmFTZXJ2aWNlOjpyZW1vdmVCeUNsaWVudChjb25zdCBCYXNpY0NsaWVudCogY2xpZW50KSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVNlcnZpY2VMb2NrKTsKICAgICBmb3IgKGF1dG8mIGkgOiBtQWN0aXZlQ2xpZW50TWFuYWdlci5nZXRBbGwoKSkgewpAQCAtMTg3NiwxMyArMjA5NCwxMyBAQAogICAgIG1TZXJ2aWNlTG9jay51bmxvY2soKTsKIAogICAgIC8vIENsZWFyIGNhbGxlciBpZGVudGl0eSB0ZW1wb3JhcmlseSBzbyBjbGllbnQgZGlzY29ubmVjdCBQSUQgY2hlY2tzIHdvcmsgY29ycmVjdGx5Ci0gICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgaW50NjRfdCB0b2tlbiA9IENhbWVyYVRocmVhZFN0YXRlOjpjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogCiAgICAgZm9yIChhdXRvJiBpIDogZXZpY3RlZCkgewogICAgICAgICBpLT5kaXNjb25uZWN0KCk7CiAgICAgfQogCi0gICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwogCiAgICAgLy8gUmVhY3F1aXJlIG1TZXJ2aWNlTG9jawogICAgIG1TZXJ2aWNlTG9jay5sb2NrKCk7CkBAIC0xOTE1LDYgKzIxMzMsMTIgQEAKICAgICAgICAgICAgIGNhbWVyYUlkLCBjbGllbnRQYWNrYWdlLCBjbGllbnRQaWQsIHJlYXNvbikpOwogfQogCit2b2lkIENhbWVyYVNlcnZpY2U6OmxvZ1RvcmNoRXZlbnQoY29uc3QgY2hhciogY2FtZXJhSWQsIGNvbnN0IGNoYXIgKnRvcmNoU3RhdGUsIGludCBjbGllbnRQaWQpIHsKKyAgICAvLyBMb2cgdG9yY2ggZXZlbnQKKyAgICBsb2dFdmVudChTdHJpbmc4Ojpmb3JtYXQoIlRvcmNoIGZvciBjYW1lcmEgaWQgJXMgdHVybmVkICVzIGZvciBjbGllbnQgUElEICVkIiwgY2FtZXJhSWQsCisgICAgICAgICAgICB0b3JjaFN0YXRlLCBjbGllbnRQaWQpKTsKK30KKwogdm9pZCBDYW1lcmFTZXJ2aWNlOjpsb2dVc2VyU3dpdGNoKGNvbnN0IHN0ZDo6c2V0PHVzZXJpZF90PiYgb2xkVXNlcklkcywKICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8dXNlcmlkX3Q+JiBuZXdVc2VySWRzKSB7CiAgICAgU3RyaW5nOCBuZXdVc2VycyA9IHRvU3RyaW5nKG5ld1VzZXJJZHMpOwpAQCAtMTk1MCw5ICsyMTc0LDYgQEAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6Om9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LAogICAgICAgICB1aW50MzJfdCBmbGFncykgewogCi0gICAgY29uc3QgaW50IHBpZCA9IGdldENhbGxpbmdQaWQoKTsKLSAgICBjb25zdCBpbnQgc2VsZlBpZCA9IGdldHBpZCgpOwotCiAgICAgLy8gUGVybWlzc2lvbiBjaGVja3MKICAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgICAgY2FzZSBTSEVMTF9DT01NQU5EX1RSQU5TQUNUSU9OOiB7CkBAIC0xOTc5LDIwICsyMjAwLDYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQotICAgICAgICBjYXNlIEJuQ2FtZXJhU2VydmljZTo6Tk9USUZZU1lTVEVNRVZFTlQ6IHsKLSAgICAgICAgICAgIGlmIChwaWQgIT0gc2VsZlBpZCkgewotICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB3ZSdyZSBiZWluZyBjYWxsZWQgYnkgc3lzdGVtX3NlcnZlciwgb3Igc2ltaWxhciBwcm9jZXNzIHdpdGgKLSAgICAgICAgICAgICAgICAvLyBwZXJtaXNzaW9ucyB0byBub3RpZnkgdGhlIGNhbWVyYSBzZXJ2aWNlIGFib3V0IHN5c3RlbSBldmVudHMKLSAgICAgICAgICAgICAgICBpZiAoIWNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQV9TRU5EX1NZU1RFTV9FVkVOVFMiKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IHVpZCA9IGdldENhbGxpbmdVaWQoKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlBlcm1pc3Npb24gRGVuaWFsOiBjYW5ub3Qgc2VuZCB1cGRhdGVzIHRvIGNhbWVyYSBzZXJ2aWNlIGFib3V0IHN5c3RlbSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGV2ZW50cyBmcm9tIHBpZD0lZCwgdWlkPSVkIiwgcGlkLCB1aWQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gQm5DYW1lcmFTZXJ2aWNlOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CkBAIC0yMDE4LDMxICsyMjI1LDM3IEBACiAgICAgcmV0dXJuIG1wOwogfQogCi12b2lkIENhbWVyYVNlcnZpY2U6OmxvYWRTb3VuZCgpIHsKK3ZvaWQgQ2FtZXJhU2VydmljZTo6aW5jcmVhc2VTb3VuZFJlZigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU291bmRMb2NrKTsKKyAgICBtU291bmRSZWYrKzsKK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpsb2FkU291bmRMb2NrZWQoc291bmRfa2luZCBraW5kKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIAotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Tb3VuZExvY2spOwotICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OmxvYWRTb3VuZCByZWY9JWQiLCBtU291bmRSZWYpOwotICAgIGlmIChtU291bmRSZWYrKykgcmV0dXJuOwotCi0gICAgbVNvdW5kUGxheWVyW1NPVU5EX1NIVVRURVJdID0gbmV3TWVkaWFQbGF5ZXIoIi9wcm9kdWN0L21lZGlhL2F1ZGlvL3VpL2NhbWVyYV9jbGljay5vZ2ciKTsKLSAgICBpZiAobVNvdW5kUGxheWVyW1NPVU5EX1NIVVRURVJdID09IG51bGxwdHIpIHsKLSAgICAgICAgbVNvdW5kUGxheWVyW1NPVU5EX1NIVVRURVJdID0gbmV3TWVkaWFQbGF5ZXIoIi9zeXN0ZW0vbWVkaWEvYXVkaW8vdWkvY2FtZXJhX2NsaWNrLm9nZyIpOwotICAgIH0KLSAgICBtU291bmRQbGF5ZXJbU09VTkRfUkVDT1JESU5HX1NUQVJUXSA9IG5ld01lZGlhUGxheWVyKCIvcHJvZHVjdC9tZWRpYS9hdWRpby91aS9WaWRlb1JlY29yZC5vZ2ciKTsKLSAgICBpZiAobVNvdW5kUGxheWVyW1NPVU5EX1JFQ09SRElOR19TVEFSVF0gPT0gbnVsbHB0cikgewotICAgICAgICBtU291bmRQbGF5ZXJbU09VTkRfUkVDT1JESU5HX1NUQVJUXSA9CisgICAgTE9HMSgiQ2FtZXJhU2VydmljZTo6bG9hZFNvdW5kTG9ja2VkIHJlZj0lZCIsIG1Tb3VuZFJlZik7CisgICAgaWYgKFNPVU5EX1NIVVRURVIgPT0ga2luZCAmJiBtU291bmRQbGF5ZXJbU09VTkRfU0hVVFRFUl0gPT0gTlVMTCkgeworICAgICAgICBtU291bmRQbGF5ZXJbU09VTkRfU0hVVFRFUl0gPSBuZXdNZWRpYVBsYXllcigiL3Byb2R1Y3QvbWVkaWEvYXVkaW8vdWkvY2FtZXJhX2NsaWNrLm9nZyIpOworICAgICAgICBpZiAobVNvdW5kUGxheWVyW1NPVU5EX1NIVVRURVJdID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1Tb3VuZFBsYXllcltTT1VORF9TSFVUVEVSXSA9IG5ld01lZGlhUGxheWVyKCIvc3lzdGVtL21lZGlhL2F1ZGlvL3VpL2NhbWVyYV9jbGljay5vZ2ciKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoU09VTkRfUkVDT1JESU5HX1NUQVJUID09IGtpbmQgJiYgbVNvdW5kUGxheWVyW1NPVU5EX1JFQ09SRElOR19TVEFSVF0gPT0gIE5VTEwpIHsKKyAgICAgICAgbVNvdW5kUGxheWVyW1NPVU5EX1JFQ09SRElOR19TVEFSVF0gPSBuZXdNZWRpYVBsYXllcigiL3Byb2R1Y3QvbWVkaWEvYXVkaW8vdWkvVmlkZW9SZWNvcmQub2dnIik7CisgICAgICAgIGlmIChtU291bmRQbGF5ZXJbU09VTkRfUkVDT1JESU5HX1NUQVJUXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtU291bmRQbGF5ZXJbU09VTkRfUkVDT1JESU5HX1NUQVJUXSA9CiAgICAgICAgICAgICAgICAgbmV3TWVkaWFQbGF5ZXIoIi9zeXN0ZW0vbWVkaWEvYXVkaW8vdWkvVmlkZW9SZWNvcmQub2dnIik7Ci0gICAgfQotICAgIG1Tb3VuZFBsYXllcltTT1VORF9SRUNPUkRJTkdfU1RPUF0gPSBuZXdNZWRpYVBsYXllcigiL3Byb2R1Y3QvbWVkaWEvYXVkaW8vdWkvVmlkZW9TdG9wLm9nZyIpOwotICAgIGlmIChtU291bmRQbGF5ZXJbU09VTkRfUkVDT1JESU5HX1NUT1BdID09IG51bGxwdHIpIHsKLSAgICAgICAgbVNvdW5kUGxheWVyW1NPVU5EX1JFQ09SRElOR19TVE9QXSA9IG5ld01lZGlhUGxheWVyKCIvc3lzdGVtL21lZGlhL2F1ZGlvL3VpL1ZpZGVvU3RvcC5vZ2ciKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoU09VTkRfUkVDT1JESU5HX1NUT1AgPT0ga2luZCAmJiBtU291bmRQbGF5ZXJbU09VTkRfUkVDT1JESU5HX1NUT1BdID09IE5VTEwpIHsKKyAgICAgICAgbVNvdW5kUGxheWVyW1NPVU5EX1JFQ09SRElOR19TVE9QXSA9IG5ld01lZGlhUGxheWVyKCIvcHJvZHVjdC9tZWRpYS9hdWRpby91aS9WaWRlb1N0b3Aub2dnIik7CisgICAgICAgIGlmIChtU291bmRQbGF5ZXJbU09VTkRfUkVDT1JESU5HX1NUT1BdID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1Tb3VuZFBsYXllcltTT1VORF9SRUNPUkRJTkdfU1RPUF0gPSBuZXdNZWRpYVBsYXllcigiL3N5c3RlbS9tZWRpYS9hdWRpby91aS9WaWRlb1N0b3Aub2dnIik7CisgICAgICAgIH0KICAgICB9CiB9CiAKLXZvaWQgQ2FtZXJhU2VydmljZTo6cmVsZWFzZVNvdW5kKCkgewordm9pZCBDYW1lcmFTZXJ2aWNlOjpkZWNyZWFzZVNvdW5kUmVmKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Tb3VuZExvY2spOwotICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OnJlbGVhc2VTb3VuZCByZWY9JWQiLCBtU291bmRSZWYpOworICAgIExPRzEoIkNhbWVyYVNlcnZpY2U6OmRlY3JlYXNlU291bmRSZWYgcmVmPSVkIiwgbVNvdW5kUmVmKTsKICAgICBpZiAoLS1tU291bmRSZWYpIHJldHVybjsKIAogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1NPVU5EUzsgaSsrKSB7CkBAIC0yMDU4LDYgKzIyNzEsNyBAQAogCiAgICAgTE9HMSgicGxheVNvdW5kKCVkKSIsIGtpbmQpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Tb3VuZExvY2spOworICAgIGxvYWRTb3VuZExvY2tlZChraW5kKTsKICAgICBzcDxNZWRpYVBsYXllcj4gcGxheWVyID0gbVNvdW5kUGxheWVyW2tpbmRdOwogICAgIGlmIChwbGF5ZXIgIT0gMCkgewogICAgICAgICBwbGF5ZXItPnNlZWtUbygwKTsKQEAgLTIwODIsMTIgKzIyOTYsMTIgQEAKICAgICAgICAgICAgICAgICBzZXJ2aWNlUGlkKSwKICAgICAgICAgbUNhbWVyYUlkKGFwaTFDYW1lcmFJZCkKIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgiQ2xpZW50OjpDbGllbnQgRSAocGlkICVkLCBpZCAlZCkiLCBjYWxsaW5nUGlkLCBtQ2FtZXJhSWQpOwogCiAgICAgbVJlbW90ZUNhbGxiYWNrID0gY2FtZXJhQ2xpZW50OwogCi0gICAgY2FtZXJhU2VydmljZS0+bG9hZFNvdW5kKCk7CisgICAgY2FtZXJhU2VydmljZS0+aW5jcmVhc2VTb3VuZFJlZigpOwogCiAgICAgTE9HMSgiQ2xpZW50OjpDbGllbnQgWCAocGlkICVkLCBpZCAlZCkiLCBjYWxsaW5nUGlkLCBtQ2FtZXJhSWQpOwogfQpAQCAtMjA5Nyw3ICsyMzExLDcgQEAKICAgICBBTE9HVigifkNsaWVudCIpOwogICAgIG1EZXN0cnVjdGlvblN0YXJ0ZWQgPSB0cnVlOwogCi0gICAgc0NhbWVyYVNlcnZpY2UtPnJlbGVhc2VTb3VuZCgpOworICAgIHNDYW1lcmFTZXJ2aWNlLT5kZWNyZWFzZVNvdW5kUmVmKCk7CiAgICAgLy8gdW5jb25kaXRpb25hbGx5IGRpc2Nvbm5lY3QuIGZ1bmN0aW9uIGlzIGlkZW1wb3RlbnQKICAgICBDbGllbnQ6OmRpc2Nvbm5lY3QoKTsKIH0KQEAgLTIxNjksNiArMjM4Myw4IEBACiAgICAgc0NhbWVyYVNlcnZpY2UtPnJlbW92ZUJ5Q2xpZW50KHRoaXMpOwogICAgIHNDYW1lcmFTZXJ2aWNlLT5sb2dEaXNjb25uZWN0ZWQobUNhbWVyYUlkU3RyLCBtQ2xpZW50UGlkLAogICAgICAgICAgICAgU3RyaW5nOChtQ2xpZW50UGFja2FnZU5hbWUpKTsKKyAgICBzQ2FtZXJhU2VydmljZS0+bUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+cmVtb3ZlUmVmKENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6RGV2aWNlTW9kZTo6Q0FNRVJBLAorICAgICAgICAgICAgbUNhbWVyYUlkU3RyLmNfc3RyKCkpOwogCiAgICAgc3A8SUJpbmRlcj4gcmVtb3RlID0gZ2V0UmVtb3RlKCk7CiAgICAgaWYgKHJlbW90ZSAhPSBudWxscHRyKSB7CkBAIC0yMTkxLDcgKzI0MDcsNyBAQAogICAgIC8vIE5vIGR1bXBpbmcgb2YgY2xpZW50cyBkaXJlY3RseSBvdmVyIEJpbmRlciwKICAgICAvLyBtdXN0IGdvIHRocm91Z2ggQ2FtZXJhU2VydmljZTo6ZHVtcAogICAgIGFuZHJvaWRfZXJyb3JXcml0ZVdpdGhJbmZvTG9nKFNOX0VWRU5UX0xPR19JRCwgIjI2MjY1NDAzIiwKLSAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSwgTlVMTCwgMCk7CisgICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpLCBOVUxMLCAwKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTIyNTYsNiArMjQ3Miw4IEBACiAgICAgc0NhbWVyYVNlcnZpY2UtPnVwZGF0ZVByb3h5RGV2aWNlU3RhdGUoSUNhbWVyYVNlcnZpY2VQcm94eTo6Q0FNRVJBX1NUQVRFX09QRU4sCiAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIsIG1DYW1lcmFGYWNpbmcsIG1DbGllbnRQYWNrYWdlTmFtZSwgYXBpTGV2ZWwpOwogCisgICAgc0NhbWVyYVNlcnZpY2UtPm1VaWRQb2xpY3ktPnJlZ2lzdGVyTW9uaXRvclVpZChtQ2xpZW50VWlkKTsKKwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMjI5Myw2ICsyNTExLDggQEAKICAgICB9CiAgICAgbU9wc0NhbGxiYWNrLmNsZWFyKCk7CiAKKyAgICBzQ2FtZXJhU2VydmljZS0+bVVpZFBvbGljeS0+dW5yZWdpc3Rlck1vbml0b3JVaWQobUNsaWVudFVpZCk7CisKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTIzMjgsNyArMjU0OCw3IEBACiAKICAgICAvLyBSZXNldCB0aGUgY2xpZW50IFBJRCB0byBhbGxvdyBzZXJ2ZXItaW5pdGlhdGVkIGRpc2Nvbm5lY3QsCiAgICAgLy8gYW5kIHRvIHByZXZlbnQgZnVydGhlciBjYWxscyBieSBjbGllbnQuCi0gICAgbUNsaWVudFBpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBtQ2xpZW50UGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhczsgLy8gYSBkdW1teSByZXN1bHQgKGludmFsaWQpCiAgICAgbm90aWZ5RXJyb3IoaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ESVNBQkxFRCwgcmVzdWx0RXh0cmFzKTsKICAgICBkaXNjb25uZWN0KCk7CkBAIC0yMzgzLDcgKzI2MDMsNyBAQAogICAgIGlmIChtUmVnaXN0ZXJlZCkgcmV0dXJuOwogICAgIGFtLnJlZ2lzdGVyVWlkT2JzZXJ2ZXIodGhpcywgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfR09ORQogICAgICAgICAgICAgfCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9JRExFCi0gICAgICAgICAgICB8IEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX0FDVElWRSwKKyAgICAgICAgICAgIHwgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfQUNUSVZFIHwgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfUFJPQ1NUQVRFLAogICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04sCiAgICAgICAgICAgICBTdHJpbmcxNigiY2FtZXJhc2VydmVyIikpOwogICAgIHN0YXR1c190IHJlcyA9IGFtLmxpbmtUb0RlYXRoKHRoaXMpOwpAQCAtMjQyOSw2ICsyNjQ5LDUxIEBACiAgICAgfQogfQogCit2b2lkIENhbWVyYVNlcnZpY2U6OlVpZFBvbGljeTo6b25VaWRTdGF0ZUNoYW5nZWQodWlkX3QgdWlkLCBpbnQzMl90IHByb2NTdGF0ZSwKKyAgICAgICAgaW50NjRfdCAvKnByb2NTdGF0ZVNlcSovKSB7CisgICAgYm9vbCBwcm9jU3RhdGVDaGFuZ2UgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtVWlkTG9jayk7CisgICAgICAgIGlmICgobU1vbml0b3JlZFVpZHMuZmluZCh1aWQpICE9IG1Nb25pdG9yZWRVaWRzLmVuZCgpKSAmJgorICAgICAgICAgICAgICAgIChtTW9uaXRvcmVkVWlkc1t1aWRdLmZpcnN0ICE9IHByb2NTdGF0ZSkpIHsKKyAgICAgICAgICAgIG1Nb25pdG9yZWRVaWRzW3VpZF0uZmlyc3QgPSBwcm9jU3RhdGU7CisgICAgICAgICAgICBwcm9jU3RhdGVDaGFuZ2UgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHByb2NTdGF0ZUNoYW5nZSkgeworICAgICAgICBzcDxDYW1lcmFTZXJ2aWNlPiBzZXJ2aWNlID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgICAgICBpZiAoc2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzZXJ2aWNlLT5ub3RpZnlNb25pdG9yZWRVaWRzKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6VWlkUG9saWN5OjpyZWdpc3Rlck1vbml0b3JVaWQodWlkX3QgdWlkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1VaWRMb2NrKTsKKyAgICBhdXRvIGl0ID0gbU1vbml0b3JlZFVpZHMuZmluZCh1aWQpOworICAgIGlmIChpdCAhPSBtTW9uaXRvcmVkVWlkcy5lbmQoKSkgeworICAgICAgICBpdC0+c2Vjb25kLnNlY29uZCsrOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Nb25pdG9yZWRVaWRzLmVtcGxhY2UoCisgICAgICAgICAgICAgICAgc3RkOjpwYWlyPHVpZF90LCBzdGQ6OnBhaXI8aW50MzJfdCwgc2l6ZV90Pj4gKHVpZCwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpwYWlyPGludDMyX3QsIHNpemVfdD4gKEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9OT05FWElTVEVOVCwgMSkpKTsKKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6VWlkUG9saWN5Ojp1bnJlZ2lzdGVyTW9uaXRvclVpZCh1aWRfdCB1aWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVVpZExvY2spOworICAgIGF1dG8gaXQgPSBtTW9uaXRvcmVkVWlkcy5maW5kKHVpZCk7CisgICAgaWYgKGl0ICE9IG1Nb25pdG9yZWRVaWRzLmVuZCgpKSB7CisgICAgICAgIGl0LT5zZWNvbmQuc2Vjb25kLS07CisgICAgICAgIGlmIChpdC0+c2Vjb25kLnNlY29uZCA9PSAwKSB7CisgICAgICAgICAgICBtTW9uaXRvcmVkVWlkcy5lcmFzZShpdCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IFRyeWluZyB0byB1bnJlZ2lzdGVyIHVpZDogJWQgd2hpY2ggaXMgbm90IG1vbml0b3JlZCEiLCBfX0ZVTkNUSU9OX18sIHVpZCk7CisgICAgfQorfQorCiBib29sIENhbWVyYVNlcnZpY2U6OlVpZFBvbGljeTo6aXNVaWRBY3RpdmUodWlkX3QgdWlkLCBTdHJpbmcxNiBjYWxsaW5nUGFja2FnZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtVWlkTG9jayk7CiAgICAgcmV0dXJuIGlzVWlkQWN0aXZlTG9ja2VkKHVpZCwgY2FsbGluZ1BhY2thZ2UpOwpAQCAtMjQ5MSw2ICsyNzU2LDE5IEBACiAgICAgcmV0dXJuIGFjdGl2ZTsKIH0KIAoraW50MzJfdCBDYW1lcmFTZXJ2aWNlOjpVaWRQb2xpY3k6OmdldFByb2NTdGF0ZSh1aWRfdCB1aWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVVpZExvY2spOworICAgIHJldHVybiBnZXRQcm9jU3RhdGVMb2NrZWQodWlkKTsKK30KKworaW50MzJfdCBDYW1lcmFTZXJ2aWNlOjpVaWRQb2xpY3k6OmdldFByb2NTdGF0ZUxvY2tlZCh1aWRfdCB1aWQpIHsKKyAgICBpbnQzMl90IHByb2NTdGF0ZSA9IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOOworICAgIGlmIChtTW9uaXRvcmVkVWlkcy5maW5kKHVpZCkgIT0gbU1vbml0b3JlZFVpZHMuZW5kKCkpIHsKKyAgICAgICAgcHJvY1N0YXRlID0gbU1vbml0b3JlZFVpZHNbdWlkXS5maXJzdDsKKyAgICB9CisgICAgcmV0dXJuIHByb2NTdGF0ZTsKK30KKwogdm9pZCBDYW1lcmFTZXJ2aWNlOjpVaWRQb2xpY3k6OlVpZFBvbGljeTo6YWRkT3ZlcnJpZGVVaWQodWlkX3QgdWlkLAogICAgICAgICBTdHJpbmcxNiBjYWxsaW5nUGFja2FnZSwgYm9vbCBhY3RpdmUpIHsKICAgICB1cGRhdGVPdmVycmlkZVVpZCh1aWQsIGNhbGxpbmdQYWNrYWdlLCBhY3RpdmUsIHRydWUpOwpAQCAtMjUyOSw2ICsyODA3LDU5IEBACiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgICAgICAgICAgICAgU2Vuc29yUHJpdmFjeVBvbGljeQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCBDYW1lcmFTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5OjpyZWdpc3RlclNlbGYoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TZW5zb3JQcml2YWN5TG9jayk7CisgICAgaWYgKG1SZWdpc3RlcmVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgU2Vuc29yUHJpdmFjeU1hbmFnZXIgc3BtOworICAgIHNwbS5hZGRTZW5zb3JQcml2YWN5TGlzdGVuZXIodGhpcyk7CisgICAgbVNlbnNvclByaXZhY3lFbmFibGVkID0gc3BtLmlzU2Vuc29yUHJpdmFjeUVuYWJsZWQoKTsKKyAgICBzdGF0dXNfdCByZXMgPSBzcG0ubGlua1RvRGVhdGgodGhpcyk7CisgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICBtUmVnaXN0ZXJlZCA9IHRydWU7CisgICAgICAgIEFMT0dWKCJTZW5zb3JQcml2YWN5UG9saWN5OiBSZWdpc3RlcmVkIHdpdGggU2Vuc29yUHJpdmFjeU1hbmFnZXIiKTsKKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6dW5yZWdpc3RlclNlbGYoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TZW5zb3JQcml2YWN5TG9jayk7CisgICAgU2Vuc29yUHJpdmFjeU1hbmFnZXIgc3BtOworICAgIHNwbS5yZW1vdmVTZW5zb3JQcml2YWN5TGlzdGVuZXIodGhpcyk7CisgICAgc3BtLnVubGlua1RvRGVhdGgodGhpcyk7CisgICAgbVJlZ2lzdGVyZWQgPSBmYWxzZTsKKyAgICBBTE9HVigiU2Vuc29yUHJpdmFjeVBvbGljeTogVW5yZWdpc3RlcmVkIHdpdGggU2Vuc29yUHJpdmFjeU1hbmFnZXIiKTsKK30KKworYm9vbCBDYW1lcmFTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5Ojppc1NlbnNvclByaXZhY3lFbmFibGVkKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vuc29yUHJpdmFjeUxvY2spOworICAgIHJldHVybiBtU2Vuc29yUHJpdmFjeUVuYWJsZWQ7Cit9CisKK2JpbmRlcjo6U3RhdHVzIENhbWVyYVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6Om9uU2Vuc29yUHJpdmFjeUNoYW5nZWQoYm9vbCBlbmFibGVkKSB7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlbnNvclByaXZhY3lMb2NrKTsKKyAgICAgICAgbVNlbnNvclByaXZhY3lFbmFibGVkID0gZW5hYmxlZDsKKyAgICB9CisgICAgLy8gaWYgc2Vuc29yIHByaXZhY3kgaXMgZW5hYmxlZCB0aGVuIGJsb2NrIGFsbCBjbGllbnRzIGZyb20gYWNjZXNzaW5nIHRoZSBjYW1lcmEKKyAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICBzcDxDYW1lcmFTZXJ2aWNlPiBzZXJ2aWNlID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgICAgICBpZiAoc2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzZXJ2aWNlLT5ibG9ja0FsbENsaWVudHMoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgLyp3aG8qLykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vuc29yUHJpdmFjeUxvY2spOworICAgIEFMT0dWKCJTZW5zb3JQcml2YWN5UG9saWN5OiBTZW5zb3JQcml2YWN5TWFuYWdlciBoYXMgZGllZCIpOworICAgIG1SZWdpc3RlcmVkID0gZmFsc2U7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vICAgICAgICAgICAgICAgICAgQ2FtZXJhU3RhdGUKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMjY1NSw4ICsyOTg2LDEyIEBACiAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PFN0cmluZzg+JiBjb25mbGljdGluZ0tleXMsIGludDMyX3Qgc2NvcmUsIGludDMyX3Qgb3duZXJJZCwKICAgICAgICAgaW50MzJfdCBzdGF0ZSkgewogCisgICAgYm9vbCBpc1ZlbmRvckNsaWVudCA9IGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5pc1NlcnZpbmdDYWxsKCk7CisgICAgaW50MzJfdCBzY29yZV9hZGogPSBpc1ZlbmRvckNsaWVudCA/IGtWZW5kb3JDbGllbnRTY29yZSA6IHNjb3JlOworICAgIGludDMyX3Qgc3RhdGVfYWRqID0gaXNWZW5kb3JDbGllbnQgPyBrVmVuZG9yQ2xpZW50U3RhdGU6IHN0YXRlOworCiAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8cmVzb3VyY2VfcG9saWN5OjpDbGllbnREZXNjcmlwdG9yPFN0cmluZzgsIHNwPEJhc2ljQ2xpZW50Pj4+KAotICAgICAgICAgICAga2V5LCB2YWx1ZSwgY29zdCwgY29uZmxpY3RpbmdLZXlzLCBzY29yZSwgb3duZXJJZCwgc3RhdGUpOworICAgICAgICAgICAga2V5LCB2YWx1ZSwgY29zdCwgY29uZmxpY3RpbmdLZXlzLCBzY29yZV9hZGosIG93bmVySWQsIHN0YXRlX2FkaiwgaXNWZW5kb3JDbGllbnQpOwogfQogCiBDYW1lcmFTZXJ2aWNlOjpEZXNjcmlwdG9yUHRyIENhbWVyYVNlcnZpY2U6OkNhbWVyYUNsaWVudE1hbmFnZXI6Om1ha2VDbGllbnREZXNjcmlwdG9yKApAQCAtMjY4OSw4ICszMDI0LDggQEAKIAogICAgIGlmIChjaGVja0NhbGxpbmdQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpKSA9PSBmYWxzZSkgewogICAgICAgICBkcHJpbnRmKGZkLCAiUGVybWlzc2lvbiBEZW5pYWw6IGNhbid0IGR1bXAgQ2FtZXJhU2VydmljZSBmcm9tIHBpZD0lZCwgdWlkPSVkXG4iLAotICAgICAgICAgICAgICAgIGdldENhbGxpbmdQaWQoKSwKLSAgICAgICAgICAgICAgICBnZXRDYWxsaW5nVWlkKCkpOworICAgICAgICAgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksCisgICAgICAgICAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKSk7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAgICAgYm9vbCBsb2NrZWQgPSB0cnlMb2NrKG1TZXJ2aWNlTG9jayk7CkBAIC0yODYzLDcgKzMxOTgsNyBAQAogICAgICAgKiBiaW5kZXIgZHJpdmVyCiAgICAgICAqLwogICAgIC8vIFBJRCBoZXJlIGlzIGFwcHJveGltYXRlIGFuZCBjYW4gYmUgd3JvbmcuCi0gICAgbG9nQ2xpZW50RGllZChnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoIkJpbmRlciBkaWVkIHVuZXhwZWN0ZWRseSIpKTsKKyAgICBsb2dDbGllbnREaWVkKENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoIkJpbmRlciBkaWVkIHVuZXhwZWN0ZWRseSIpKTsKIAogICAgIC8vIGNoZWNrIHRvcmNoIGNsaWVudAogICAgIGhhbmRsZVRvcmNoQ2xpZW50QmluZGVyRGllZCh3aG8pOwpAQCAtMjkxOSw3ICszMjU0LDE0IEBACiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU3RhdHVzTGlzdGVuZXJMb2NrKTsKIAogICAgICAgICAgICAgZm9yIChhdXRvJiBsaXN0ZW5lciA6IG1MaXN0ZW5lckxpc3QpIHsKLSAgICAgICAgICAgICAgICBsaXN0ZW5lci0+b25TdGF0dXNDaGFuZ2VkKG1hcFRvSW50ZXJmYWNlKHN0YXR1cyksIFN0cmluZzE2KGNhbWVyYUlkKSk7CisgICAgICAgICAgICAgICAgaWYgKCFsaXN0ZW5lci5maXJzdCAmJgorICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLT5pc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmEoY2FtZXJhSWQuY19zdHIoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlNraXBwaW5nIGNhbWVyYSBkaXNjb3ZlcnkgY2FsbGJhY2sgZm9yIHN5c3RlbS1vbmx5IGNhbWVyYSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGlzdGVuZXIuc2Vjb25kLT5nZXRMaXN0ZW5lcigpLT5vblN0YXR1c0NoYW5nZWQobWFwVG9JbnRlcmZhY2Uoc3RhdHVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzE2KGNhbWVyYUlkKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0pOwogfQpAQCAtMzAxNCw2ICszMzU2LDE4IEBACiAgICAgfQogfQogCit2b2lkIENhbWVyYVNlcnZpY2U6OmJsb2NrQWxsQ2xpZW50cygpIHsKKyAgICBjb25zdCBhdXRvIGNsaWVudHMgPSBtQWN0aXZlQ2xpZW50TWFuYWdlci5nZXRBbGwoKTsKKyAgICBmb3IgKGF1dG8mIGN1cnJlbnQgOiBjbGllbnRzKSB7CisgICAgICAgIGlmIChjdXJyZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNvbnN0IGF1dG8gYmFzaWNDbGllbnQgPSBjdXJyZW50LT5nZXRWYWx1ZSgpOworICAgICAgICAgICAgaWYgKGJhc2ljQ2xpZW50LmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBiYXNpY0NsaWVudC0+YmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwogLy8gTk9URTogVGhpcyBpcyBhIHJlbW90ZSBBUEkgLSBtYWtlIHN1cmUgYWxsIGFyZ3MgYXJlIHZhbGlkYXRlZAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6c2hlbGxDb21tYW5kKGludCBpbiwgaW50IG91dCwgaW50IGVyciwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgewogICAgIGlmICghY2hlY2tDYWxsaW5nUGVybWlzc2lvbihzTWFuYWdlQ2FtZXJhUGVybWlzc2lvbiwgbnVsbHB0ciwgbnVsbHB0cikpIHsKQEAgLTMwMjIsMTEgKzMzNzYsMTEgQEAKICAgICBpZiAoaW4gPT0gQkFEX1RZUEUgfHwgb3V0ID09IEJBRF9UWVBFIHx8IGVyciA9PSBCQURfVFlQRSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBpZiAoYXJncy5zaXplKCkgPT0gMyAmJiBhcmdzWzBdID09IFN0cmluZzE2KCJzZXQtdWlkLXN0YXRlIikpIHsKKyAgICBpZiAoYXJncy5zaXplKCkgPj0gMyAmJiBhcmdzWzBdID09IFN0cmluZzE2KCJzZXQtdWlkLXN0YXRlIikpIHsKICAgICAgICAgcmV0dXJuIGhhbmRsZVNldFVpZFN0YXRlKGFyZ3MsIGVycik7Ci0gICAgfSBlbHNlIGlmIChhcmdzLnNpemUoKSA9PSAyICYmIGFyZ3NbMF0gPT0gU3RyaW5nMTYoInJlc2V0LXVpZC1zdGF0ZSIpKSB7CisgICAgfSBlbHNlIGlmIChhcmdzLnNpemUoKSA+PSAyICYmIGFyZ3NbMF0gPT0gU3RyaW5nMTYoInJlc2V0LXVpZC1zdGF0ZSIpKSB7CiAgICAgICAgIHJldHVybiBoYW5kbGVSZXNldFVpZFN0YXRlKGFyZ3MsIGVycik7Ci0gICAgfSBlbHNlIGlmIChhcmdzLnNpemUoKSA9PSAyICYmIGFyZ3NbMF0gPT0gU3RyaW5nMTYoImdldC11aWQtc3RhdGUiKSkgeworICAgIH0gZWxzZSBpZiAoYXJncy5zaXplKCkgPj0gMiAmJiBhcmdzWzBdID09IFN0cmluZzE2KCJnZXQtdWlkLXN0YXRlIikpIHsKICAgICAgICAgcmV0dXJuIGhhbmRsZUdldFVpZFN0YXRlKGFyZ3MsIG91dCwgZXJyKTsKICAgICB9IGVsc2UgaWYgKGFyZ3Muc2l6ZSgpID09IDEgJiYgYXJnc1swXSA9PSBTdHJpbmcxNigiaGVscCIpKSB7CiAgICAgICAgIHByaW50SGVscChvdXQpOwpAQCAtMzAzNywxMyArMzM5MSw4IEBACiB9CiAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OmhhbmRsZVNldFVpZFN0YXRlKGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MsIGludCBlcnIpIHsKLSAgICBQZXJtaXNzaW9uQ29udHJvbGxlciBwYzsKLSAgICBpbnQgdWlkID0gcGMuZ2V0UGFja2FnZVVpZChhcmdzWzFdLCAwKTsKLSAgICBpZiAodWlkIDw9IDApIHsKLSAgICAgICAgQUxPR0UoIlVua25vd24gcGFja2FnZTogJyVzJyIsIFN0cmluZzgoYXJnc1sxXSkuc3RyaW5nKCkpOwotICAgICAgICBkcHJpbnRmKGVyciwgIlVua25vd24gcGFja2FnZTogJyVzJ1xuIiwgU3RyaW5nOChhcmdzWzFdKS5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQorICAgIFN0cmluZzE2IHBhY2thZ2VOYW1lID0gYXJnc1sxXTsKKwogICAgIGJvb2wgYWN0aXZlID0gZmFsc2U7CiAgICAgaWYgKGFyZ3NbMl0gPT0gU3RyaW5nMTYoImFjdGl2ZSIpKSB7CiAgICAgICAgIGFjdGl2ZSA9IHRydWU7CkBAIC0zMDUxLDMxICszNDAwLDUyIEBACiAgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBhY3RpdmUgb3IgaWRsZSBidXQgZ290OiAnJXMnIiwgU3RyaW5nOChhcmdzWzJdKS5zdHJpbmcoKSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIG1VaWRQb2xpY3ktPmFkZE92ZXJyaWRlVWlkKHVpZCwgYXJnc1sxXSwgYWN0aXZlKTsKKworICAgIGludCB1c2VySWQgPSAwOworICAgIGlmIChhcmdzLnNpemUoKSA+PSA1ICYmIGFyZ3NbM10gPT0gU3RyaW5nMTYoIi0tdXNlciIpKSB7CisgICAgICAgIHVzZXJJZCA9IGF0b2koU3RyaW5nOChhcmdzWzRdKSk7CisgICAgfQorCisgICAgdWlkX3QgdWlkOworICAgIGlmIChnZXRVaWRGb3JQYWNrYWdlKHBhY2thZ2VOYW1lLCB1c2VySWQsIHVpZCwgZXJyKSA9PSBCQURfVkFMVUUpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBtVWlkUG9saWN5LT5hZGRPdmVycmlkZVVpZCh1aWQsIHBhY2thZ2VOYW1lLCBhY3RpdmUpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6aGFuZGxlUmVzZXRVaWRTdGF0ZShjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzLCBpbnQgZXJyKSB7Ci0gICAgUGVybWlzc2lvbkNvbnRyb2xsZXIgcGM7Ci0gICAgaW50IHVpZCA9IHBjLmdldFBhY2thZ2VVaWQoYXJnc1sxXSwgMCk7Ci0gICAgaWYgKHVpZCA8IDApIHsKLSAgICAgICAgQUxPR0UoIlVua25vd24gcGFja2FnZTogJyVzJyIsIFN0cmluZzgoYXJnc1sxXSkuc3RyaW5nKCkpOwotICAgICAgICBkcHJpbnRmKGVyciwgIlVua25vd24gcGFja2FnZTogJyVzJ1xuIiwgU3RyaW5nOChhcmdzWzFdKS5zdHJpbmcoKSk7CisgICAgU3RyaW5nMTYgcGFja2FnZU5hbWUgPSBhcmdzWzFdOworCisgICAgaW50IHVzZXJJZCA9IDA7CisgICAgaWYgKGFyZ3Muc2l6ZSgpID49IDQgJiYgYXJnc1syXSA9PSBTdHJpbmcxNigiLS11c2VyIikpIHsKKyAgICAgICAgdXNlcklkID0gYXRvaShTdHJpbmc4KGFyZ3NbM10pKTsKKyAgICB9CisKKyAgICB1aWRfdCB1aWQ7CisgICAgaWYgKGdldFVpZEZvclBhY2thZ2UocGFja2FnZU5hbWUsIHVzZXJJZCwgdWlkLCBlcnIpID09IEJBRF9WQUxVRSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBtVWlkUG9saWN5LT5yZW1vdmVPdmVycmlkZVVpZCh1aWQsIGFyZ3NbMV0pOworCisgICAgbVVpZFBvbGljeS0+cmVtb3ZlT3ZlcnJpZGVVaWQodWlkLCBwYWNrYWdlTmFtZSk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpoYW5kbGVHZXRVaWRTdGF0ZShjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzLCBpbnQgb3V0LCBpbnQgZXJyKSB7Ci0gICAgUGVybWlzc2lvbkNvbnRyb2xsZXIgcGM7Ci0gICAgaW50IHVpZCA9IHBjLmdldFBhY2thZ2VVaWQoYXJnc1sxXSwgMCk7Ci0gICAgaWYgKHVpZCA8PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJVbmtub3duIHBhY2thZ2U6ICclcyciLCBTdHJpbmc4KGFyZ3NbMV0pLnN0cmluZygpKTsKLSAgICAgICAgZHByaW50ZihlcnIsICJVbmtub3duIHBhY2thZ2U6ICclcydcbiIsIFN0cmluZzgoYXJnc1sxXSkuc3RyaW5nKCkpOworICAgIFN0cmluZzE2IHBhY2thZ2VOYW1lID0gYXJnc1sxXTsKKworICAgIGludCB1c2VySWQgPSAwOworICAgIGlmIChhcmdzLnNpemUoKSA+PSA0ICYmIGFyZ3NbMl0gPT0gU3RyaW5nMTYoIi0tdXNlciIpKSB7CisgICAgICAgIHVzZXJJZCA9IGF0b2koU3RyaW5nOChhcmdzWzNdKSk7CisgICAgfQorCisgICAgdWlkX3QgdWlkOworICAgIGlmIChnZXRVaWRGb3JQYWNrYWdlKHBhY2thZ2VOYW1lLCB1c2VySWQsIHVpZCwgZXJyKSA9PSBCQURfVkFMVUUpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgaWYgKG1VaWRQb2xpY3ktPmlzVWlkQWN0aXZlKHVpZCwgYXJnc1sxXSkpIHsKKworICAgIGlmIChtVWlkUG9saWN5LT5pc1VpZEFjdGl2ZSh1aWQsIHBhY2thZ2VOYW1lKSkgewogICAgICAgICByZXR1cm4gZHByaW50ZihvdXQsICJhY3RpdmVcbiIpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBkcHJpbnRmKG91dCwgImlkbGVcbiIpOwpAQCAtMzA4NCw5ICszNDU0LDkgQEAKIAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6cHJpbnRIZWxwKGludCBvdXQpIHsKICAgICByZXR1cm4gZHByaW50ZihvdXQsICJDYW1lcmEgc2VydmljZSBjb21tYW5kczpcbiIKLSAgICAgICAgIiAgZ2V0LXVpZC1zdGF0ZSA8UEFDS0FHRT4gZ2V0cyB0aGUgdWlkIHN0YXRlXG4iCi0gICAgICAgICIgIHNldC11aWQtc3RhdGUgPFBBQ0tBR0U+IDxhY3RpdmV8aWRsZT4gb3ZlcnJpZGVzIHRoZSB1aWQgc3RhdGVcbiIKLSAgICAgICAgIiAgcmVzZXQtdWlkLXN0YXRlIDxQQUNLQUdFPiBjbGVhcnMgdGhlIHVpZCBzdGF0ZSBvdmVycmlkZVxuIgorICAgICAgICAiICBnZXQtdWlkLXN0YXRlIDxQQUNLQUdFPiBbLS11c2VyIFVTRVJfSURdIGdldHMgdGhlIHVpZCBzdGF0ZVxuIgorICAgICAgICAiICBzZXQtdWlkLXN0YXRlIDxQQUNLQUdFPiA8YWN0aXZlfGlkbGU+IFstLXVzZXIgVVNFUl9JRF0gb3ZlcnJpZGVzIHRoZSB1aWQgc3RhdGVcbiIKKyAgICAgICAgIiAgcmVzZXQtdWlkLXN0YXRlIDxQQUNLQUdFPiBbLS11c2VyIFVTRVJfSURdIGNsZWFycyB0aGUgdWlkIHN0YXRlIG92ZXJyaWRlXG4iCiAgICAgICAgICIgIGhlbHAgcHJpbnQgdGhpcyBtZXNzYWdlXG4iKTsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCmluZGV4IDhkNGJjZGIuLmI4Y2VjMmMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkFTRVJWSUNFX0gKIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvQm5DYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9CblNlbnNvclByaXZhY3lMaXN0ZW5lci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2VMaXN0ZW5lci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2VQcm94eS5oPgogCkBAIC0xNTMsMTIgKzE1NCwxOSBAQAogICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgICAgbm90aWZ5U3lzdGVtRXZlbnQoaW50MzJfdCBldmVudElkLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGFyZ3MpOwogCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyAgICBub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShpbnQ2NF90IG5ld1N0YXRlKTsKKwogICAgIC8vIE9LID0gc3VwcG9ydHMgYXBpIG9mIHRoYXQgdmVyc2lvbiwgLUVPUE5PVFNVUFAgPSBkb2VzIG5vdCBzdXBwb3J0CiAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyAgICBzdXBwb3J0c0NhbWVyYUFwaSgKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjYW1lcmFJZCwgaW50MzJfdCBhcGlWZXJzaW9uLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpOwogCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyAgICBpc0hpZGRlblBoeXNpY2FsQ2FtZXJhKAorICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpOworCiAgICAgLy8gRXh0cmEgcGVybWlzc2lvbnMgY2hlY2tzCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBvblRyYW5zYWN0KHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCYgZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyY2VsKiByZXBseSwgdWludDMyX3QgZmxhZ3MpOwpAQCAtMTY3LDYgKzE3NSwxMyBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzaGVsbENvbW1hbmQoaW50IGluLCBpbnQgb3V0LCBpbnQgZXJyLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAorICAgIGJpbmRlcjo6U3RhdHVzICAgICAgYWRkTGlzdGVuZXJIZWxwZXIoY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdGF0dXM+KiBjYW1lcmFTdGF0dXNlcywgYm9vbCBpc1ZlbmRvciA9IGZhbHNlKTsKKworICAgIC8vIE1vbml0b3JlZCBVSURzIGF2YWlsYWJpbGl0eSBub3RpZmljYXRpb24KKyAgICB2b2lkICAgICAgICAgICAgICAgIG5vdGlmeU1vbml0b3JlZFVpZHMoKTsKKwogICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgIC8vIENsaWVudCBmdW5jdGlvbmFsaXR5CiAKQEAgLTE3NywxMCArMTkyLDEwIEBACiAgICAgICAgIE5VTV9TT1VORFMKICAgICB9OwogCi0gICAgdm9pZCAgICAgICAgICAgICAgICBsb2FkU291bmQoKTsKICAgICB2b2lkICAgICAgICAgICAgICAgIHBsYXlTb3VuZChzb3VuZF9raW5kIGtpbmQpOwotICAgIHZvaWQgICAgICAgICAgICAgICAgcmVsZWFzZVNvdW5kKCk7Ci0KKyAgICB2b2lkICAgICAgICAgICAgICAgIGxvYWRTb3VuZExvY2tlZChzb3VuZF9raW5kIGtpbmQpOworICAgIHZvaWQgICAgICAgICAgICAgICAgZGVjcmVhc2VTb3VuZFJlZigpOworICAgIHZvaWQgICAgICAgICAgICAgICAgaW5jcmVhc2VTb3VuZFJlZigpOwogICAgIC8qKgogICAgICAqIFVwZGF0ZSB0aGUgc3RhdGUgb2YgYSBnaXZlbiBjYW1lcmEgZGV2aWNlIChvcGVuL2Nsb3NlL2FjdGl2ZS9pZGxlKSB3aXRoCiAgICAgICogdGhlIGNhbWVyYSBwcm94eSBzZXJ2aWNlIGluIHRoZSBzeXN0ZW0gc2VydmljZQpAQCAtNTI3LDI5ICs1NDIsNjQgQEAKICAgICAgICAgdm9pZCB1bnJlZ2lzdGVyU2VsZigpOwogCiAgICAgICAgIGJvb2wgaXNVaWRBY3RpdmUodWlkX3QgdWlkLCBTdHJpbmcxNiBjYWxsaW5nUGFja2FnZSk7CisgICAgICAgIGludDMyX3QgZ2V0UHJvY1N0YXRlKHVpZF90IHVpZCk7CiAKICAgICAgICAgdm9pZCBvblVpZEdvbmUodWlkX3QgdWlkLCBib29sIGRpc2FibGVkKTsKICAgICAgICAgdm9pZCBvblVpZEFjdGl2ZSh1aWRfdCB1aWQpOwogICAgICAgICB2b2lkIG9uVWlkSWRsZSh1aWRfdCB1aWQsIGJvb2wgZGlzYWJsZWQpOworICAgICAgICB2b2lkIG9uVWlkU3RhdGVDaGFuZ2VkKHVpZF90IHVpZCwgaW50MzJfdCBwcm9jU3RhdGUsIGludDY0X3QgcHJvY1N0YXRlU2VxKTsKIAogICAgICAgICB2b2lkIGFkZE92ZXJyaWRlVWlkKHVpZF90IHVpZCwgU3RyaW5nMTYgY2FsbGluZ1BhY2thZ2UsIGJvb2wgYWN0aXZlKTsKICAgICAgICAgdm9pZCByZW1vdmVPdmVycmlkZVVpZCh1aWRfdCB1aWQsIFN0cmluZzE2IGNhbGxpbmdQYWNrYWdlKTsKIAorICAgICAgICB2b2lkIHJlZ2lzdGVyTW9uaXRvclVpZCh1aWRfdCB1aWQpOworICAgICAgICB2b2lkIHVucmVnaXN0ZXJNb25pdG9yVWlkKHVpZF90IHVpZCk7CisKICAgICAgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgaW1wbGVtZW50YXRpb24KICAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJndobyk7CiAgICAgcHJpdmF0ZToKICAgICAgICAgYm9vbCBpc1VpZEFjdGl2ZUxvY2tlZCh1aWRfdCB1aWQsIFN0cmluZzE2IGNhbGxpbmdQYWNrYWdlKTsKKyAgICAgICAgaW50MzJfdCBnZXRQcm9jU3RhdGVMb2NrZWQodWlkX3QgdWlkKTsKICAgICAgICAgdm9pZCB1cGRhdGVPdmVycmlkZVVpZCh1aWRfdCB1aWQsIFN0cmluZzE2IGNhbGxpbmdQYWNrYWdlLCBib29sIGFjdGl2ZSwgYm9vbCBpbnNlcnQpOwogCiAgICAgICAgIE11dGV4IG1VaWRMb2NrOwogICAgICAgICBib29sIG1SZWdpc3RlcmVkOwogICAgICAgICB3cDxDYW1lcmFTZXJ2aWNlPiBtU2VydmljZTsKICAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVpZF90PiBtQWN0aXZlVWlkczsKKyAgICAgICAgLy8gTW9uaXRvcmVkIHVpZCBtYXAgdG8gY2FjaGVkIHByb2NTdGF0ZSBhbmQgcmVmQ291bnQgcGFpcgorICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIHN0ZDo6cGFpcjxpbnQzMl90LCBzaXplX3Q+PiBtTW9uaXRvcmVkVWlkczsKICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBib29sPiBtT3ZlcnJpZGVVaWRzOwogICAgIH07IC8vIGNsYXNzIFVpZFBvbGljeQogCisgICAgLy8gSWYgc2Vuc29yIHByaXZhY3kgaXMgZW5hYmxlZCB0aGVuIGFsbCBhcHBzLCBpbmNsdWRpbmcgdGhvc2UgdGhhdCBhcmUgYWN0aXZlLCBzaG91bGQgYmUKKyAgICAvLyBwcmV2ZW50ZWQgZnJvbSBhY2Nlc3NpbmcgdGhlIGNhbWVyYS4KKyAgICBjbGFzcyBTZW5zb3JQcml2YWN5UG9saWN5IDogcHVibGljIGhhcmR3YXJlOjpCblNlbnNvclByaXZhY3lMaXN0ZW5lciwKKyAgICAgICAgICAgIHB1YmxpYyB2aXJ0dWFsIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgZXhwbGljaXQgU2Vuc29yUHJpdmFjeVBvbGljeSh3cDxDYW1lcmFTZXJ2aWNlPiBzZXJ2aWNlKQorICAgICAgICAgICAgICAgICAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpLCBtU2Vuc29yUHJpdmFjeUVuYWJsZWQoZmFsc2UpLCBtUmVnaXN0ZXJlZChmYWxzZSkge30KKworICAgICAgICAgICAgdm9pZCByZWdpc3RlclNlbGYoKTsKKyAgICAgICAgICAgIHZvaWQgdW5yZWdpc3RlclNlbGYoKTsKKworICAgICAgICAgICAgYm9vbCBpc1NlbnNvclByaXZhY3lFbmFibGVkKCk7CisKKyAgICAgICAgICAgIGJpbmRlcjo6U3RhdHVzIG9uU2Vuc29yUHJpdmFjeUNoYW5nZWQoYm9vbCBlbmFibGVkKTsKKworICAgICAgICAgICAgLy8gSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgaW1wbGVtZW50YXRpb24KKyAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pOworCisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICB3cDxDYW1lcmFTZXJ2aWNlPiBtU2VydmljZTsKKyAgICAgICAgICAgIE11dGV4IG1TZW5zb3JQcml2YWN5TG9jazsKKyAgICAgICAgICAgIGJvb2wgbVNlbnNvclByaXZhY3lFbmFibGVkOworICAgICAgICAgICAgYm9vbCBtUmVnaXN0ZXJlZDsKKyAgICB9OworCiAgICAgc3A8VWlkUG9saWN5PiBtVWlkUG9saWN5OwogCisgICAgc3A8U2Vuc29yUHJpdmFjeVBvbGljeT4gbVNlbnNvclByaXZhY3lQb2xpY3k7CisKICAgICAvLyBEZWxheS1sb2FkIHRoZSBDYW1lcmEgSEFMIG1vZHVsZQogICAgIHZpcnR1YWwgdm9pZCBvbkZpcnN0UmVmKCk7CiAKQEAgLTU4MSwxMiArNjMxLDE1IEBACiAgICAgICAgIHNwPEJhc2ljQ2xpZW50PiogY2xpZW50LAogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8cmVzb3VyY2VfcG9saWN5OjpDbGllbnREZXNjcmlwdG9yPFN0cmluZzgsIHNwPEJhc2ljQ2xpZW50Pj4+KiBwYXJ0aWFsKTsKIAorICAgIC8vIFNob3VsZCBhbiBvcGVyYXRpb24gYXR0ZW1wdCBvbiBhIGNhbWVyYUlkIGJlIHJlamVjdGVkLCBpZiB0aGUgY2FtZXJhIGlkIGlzCisgICAgLy8gYWR2ZXJ0aXNlZCBhcyBhIHB1YmxpY2FsbHkgaGlkZGVuIHNlY3VyZSBjYW1lcmEsIGJ5IHRoZSBjYW1lcmEgSEFMID8KKyAgICBib29sIHNob3VsZFJlamVjdEhpZGRlbkNhbWVyYUNvbm5lY3Rpb24oY29uc3QgU3RyaW5nOCAmIGNhbWVyYUlkKTsKKwogICAgIC8vIFNpbmdsZSBpbXBsZW1lbnRhdGlvbiBzaGFyZWQgYmV0d2VlbiB0aGUgdmFyaW91cyBjb25uZWN0IGNhbGxzCiAgICAgdGVtcGxhdGU8Y2xhc3MgQ0FMTEJBQ0ssIGNsYXNzIENMSUVOVD4KICAgICBiaW5kZXI6OlN0YXR1cyBjb25uZWN0SGVscGVyKGNvbnN0IHNwPENBTExCQUNLPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwgaW50IGhhbFZlcnNpb24sIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIGludCBjbGllbnRVaWQsIGludCBjbGllbnRQaWQsCi0gICAgICAgICAgICBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwgYm9vbCBsZWdhY3lNb2RlLCBib29sIHNoaW1VcGRhdGVPbmx5LAorICAgICAgICAgICAgaW50IGNsaWVudFVpZCwgaW50IGNsaWVudFBpZCwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGJvb2wgc2hpbVVwZGF0ZU9ubHksCiAgICAgICAgICAgICAvKm91dCovc3A8Q0xJRU5UPiYgZGV2aWNlKTsKIAogICAgIC8vIExvY2sgZ3VhcmRpbmcgY2FtZXJhIHNlcnZpY2Ugc3RhdGUKQEAgLTY5NSw2ICs3NDgsMTEgQEAKICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHJlYXNvbik7CiAKICAgICAvKioKKyAgICAgKiBBZGQgYW4gZXZlbnQgbG9nIG1lc3NhZ2Ugd2hlbiBhIGNsaWVudCBjYWxscyBzZXRUb3JjaE1vZGUgc3VjY2VzZnVsbHkuCisgICAgICovCisgICAgdm9pZCBsb2dUb3JjaEV2ZW50KGNvbnN0IGNoYXIqIGNhbWVyYUlkLCBjb25zdCBjaGFyICp0b3JjaFN0YXRlLCBpbnQgY2xpZW50UGlkKTsKKworICAgIC8qKgogICAgICAqIEFkZCBhbiBldmVudCBsb2cgbWVzc2FnZSB0aGF0IHRoZSBjdXJyZW50IGRldmljZSB1c2VyIGhhcyBiZWVuIHN3aXRjaGVkLgogICAgICAqLwogICAgIHZvaWQgbG9nVXNlclN3aXRjaChjb25zdCBzdGQ6OnNldDx1c2VyaWRfdD4mIG9sZFVzZXJJZHMsCkBAIC03NDcsOCArODA1LDM0IEBACiAKICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1DYW1lcmFQcm92aWRlck1hbmFnZXI7CiAKKyAgICBjbGFzcyBTZXJ2aWNlTGlzdGVuZXIgOiBwdWJsaWMgdmlydHVhbCBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIFNlcnZpY2VMaXN0ZW5lcihzcDxDYW1lcmFTZXJ2aWNlPiBwYXJlbnQsIHNwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBsaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgaW50IHVpZCkgOiBtUGFyZW50KHBhcmVudCksIG1MaXN0ZW5lcihsaXN0ZW5lciksIG1MaXN0ZW5lclVpZCh1aWQpIHt9CisKKyAgICAgICAgICAgIHN0YXR1c190IGluaXRpYWxpemUoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIElJbnRlcmZhY2U6OmFzQmluZGVyKG1MaXN0ZW5lciktPmxpbmtUb0RlYXRoKHRoaXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmLyp3aG8qLykgeworICAgICAgICAgICAgICAgIGF1dG8gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmVudC5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmVudC0+cmVtb3ZlTGlzdGVuZXIobUxpc3RlbmVyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBnZXRMaXN0ZW5lclVpZCgpIHsgcmV0dXJuIG1MaXN0ZW5lclVpZDsgfQorICAgICAgICAgICAgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGdldExpc3RlbmVyKCkgeyByZXR1cm4gbUxpc3RlbmVyOyB9CisKKyAgICAgICAgcHJpdmF0ZToKKyAgICAgICAgICAgIHdwPENhbWVyYVNlcnZpY2U+IG1QYXJlbnQ7CisgICAgICAgICAgICBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgICAgICAgICAgaW50IG1MaXN0ZW5lclVpZDsKKyAgICB9OworCiAgICAgLy8gR3VhcmRlZCBieSBtU3RhdHVzTGlzdGVuZXJNdXRleAotICAgIHN0ZDo6dmVjdG9yPHNwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyPj4gbUxpc3RlbmVyTGlzdDsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Ym9vbCwgc3A8U2VydmljZUxpc3RlbmVyPj4+IG1MaXN0ZW5lckxpc3Q7CisKICAgICBNdXRleCAgICAgICBtU3RhdHVzTGlzdGVuZXJMb2NrOwogCiAgICAgLyoqCkBAIC04MjAsNiArOTA0LDkgQEAKICAgICAvLyBCbG9ja3MgYWxsIGNsaWVudHMgZnJvbSB0aGUgVUlECiAgICAgdm9pZCBibG9ja0NsaWVudHNGb3JVaWQodWlkX3QgdWlkKTsKIAorICAgIC8vIEJsb2NrcyBhbGwgYWN0aXZlIGNsaWVudHMuCisgICAgdm9pZCBibG9ja0FsbENsaWVudHMoKTsKKwogICAgIC8vIE92ZXJyaWRlcyB0aGUgVUlEIHN0YXRlIGFzIGlmIGl0IGlzIGlkbGUKICAgICBzdGF0dXNfdCBoYW5kbGVTZXRVaWRTdGF0ZShjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzLCBpbnQgZXJyKTsKIApAQCAtODMyLDEwICs5MTksNiBAQAogICAgIC8vIFByaW50cyB0aGUgc2hlbGwgY29tbWFuZCBoZWxwCiAgICAgc3RhdHVzX3QgcHJpbnRIZWxwKGludCBvdXQpOwogCi0gICAgc3RhdGljIGludCBnZXRDYWxsaW5nUGlkKCk7Ci0KLSAgICBzdGF0aWMgaW50IGdldENhbGxpbmdVaWQoKTsKLQogICAgIC8qKgogICAgICAqIEdldCB0aGUgY3VycmVudCBzeXN0ZW0gdGltZSBhcyBhIGZvcm1hdHRlZCBzdHJpbmcuCiAgICAgICovCkBAIC04NDQsNyArOTI3LDcgQEAKICAgICBzdGF0aWMgYmluZGVyOjpTdGF0dXMgbWFrZUNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKICAgICAgICAgICAgIGNvbnN0IHNwPElJbnRlcmZhY2U+JiBjYW1lcmFDYiwgY29uc3QgU3RyaW5nMTYmIHBhY2thZ2VOYW1lLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGludCBmYWNpbmcsIGludCBjbGllbnRQaWQsIHVpZF90IGNsaWVudFVpZCwgaW50IHNlcnZpY2VQaWQsCi0gICAgICAgICAgICBib29sIGxlZ2FjeU1vZGUsIGludCBoYWxWZXJzaW9uLCBpbnQgZGV2aWNlVmVyc2lvbiwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsCisgICAgICAgICAgICBpbnQgaGFsVmVyc2lvbiwgaW50IGRldmljZVZlcnNpb24sIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLAogICAgICAgICAgICAgLypvdXQqL3NwPEJhc2ljQ2xpZW50PiogY2xpZW50KTsKIAogICAgIHN0YXR1c190IGNoZWNrQ2FtZXJhQWNjZXNzKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lKTsKQEAgLTg1NCw5ICs5MzcsMTYgQEAKICAgICBzdGF0aWMgU3RhdHVzSW50ZXJuYWwgbWFwVG9JbnRlcm5hbChoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyBzdGF0dXMpOwogICAgIHN0YXRpYyBpbnQzMl90IG1hcFRvSW50ZXJmYWNlKFN0YXR1c0ludGVybmFsIHN0YXR1cyk7CiAKKyAgICAvLyBHdWFyZCBtQ2FtZXJhU2VydmljZVByb3h5CisgICAgc3RhdGljIE11dGV4IHNQcm94eU11dGV4OworICAgIC8vIENhY2hlZCBpbnRlcmZhY2UgdG8gdGhlIGNhbWVyYSBzZXJ2aWNlIHByb3h5IGluIHN5c3RlbSBzZXJ2aWNlCisgICAgc3RhdGljIHNwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZVByb3h5PiBzQ2FtZXJhU2VydmljZVByb3h5OworCiAgICAgc3RhdGljIHNwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZVByb3h5PiBnZXRDYW1lcmFTZXJ2aWNlUHJveHkoKTsKICAgICBzdGF0aWMgdm9pZCBwaW5nQ2FtZXJhU2VydmljZVByb3h5KCk7CiAKKyAgICB2b2lkIGJyb2FkY2FzdFRvcmNoTW9kZVN0YXR1cyhjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6VG9yY2hNb2RlU3RhdHVzIHN0YXR1cyk7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9URVNUX01BUFBJTkcgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZkYWM2OAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDcgQEAKK3sKKyAgInByZXN1Ym1pdCI6IFsKKyAgICB7CisgICAgICAgIm5hbWUiOiAiY2FtZXJhc2VydmljZV90ZXN0IgorICAgIH0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKaW5kZXggZDU5YjMxMy4uMTYyYjUwZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCkBAIC0zMywxNyArMzMsMTggQEAKICNpbmNsdWRlICJhcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5oIgogI2luY2x1ZGUgImFwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5oIgogI2luY2x1ZGUgImFwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuaCIKKyNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgogCiAjZGVmaW5lIEFMT0cxKC4uLikgQUxPR0RfSUYoZ0xvZ0xldmVsID49IDEsIF9fVkFfQVJHU19fKTsKICNkZWZpbmUgQUxPRzIoLi4uKSBBTE9HRF9JRihnTG9nTGV2ZWwgPj0gMiwgX19WQV9BUkdTX18pOwogCisjaWZuZGVmIEZBTExUSFJPVUdIX0lOVEVOREVECisjZGVmaW5lIEZBTExUSFJPVUdIX0lOVEVOREVEIFtbZmFsbHRocm91Z2hdXQorI2VuZGlmCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIHVzaW5nIG5hbWVzcGFjZSBjYW1lcmEyOwogCi1zdGF0aWMgaW50IGdldENhbGxpbmdQaWQoKSB7Ci0gICAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLX0KLQogLy8gSW50ZXJmYWNlIHVzZWQgYnkgQ2FtZXJhU2VydmljZQogCiBDYW1lcmEyQ2xpZW50OjpDYW1lcmEyQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLApAQCAtNTQsOCArNTUsNyBAQAogICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICBpbnQgY2xpZW50UGlkLAogICAgICAgICB1aWRfdCBjbGllbnRVaWQsCi0gICAgICAgIGludCBzZXJ2aWNlUGlkLAotICAgICAgICBib29sIGxlZ2FjeU1vZGUpOgorICAgICAgICBpbnQgc2VydmljZVBpZCk6CiAgICAgICAgIENhbWVyYTJDbGllbnRCYXNlKGNhbWVyYVNlcnZpY2UsIGNhbWVyYUNsaWVudCwgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgY2FtZXJhRGV2aWNlSWQsIGFwaTFDYW1lcmFJZCwgY2FtZXJhRmFjaW5nLAogICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKSwKQEAgLTY1LDggKzY1LDYgQEAKIAogICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChtUGFyYW1ldGVycyk7CiAgICAgbC5tUGFyYW1ldGVycy5zdGF0ZSA9IFBhcmFtZXRlcnM6OkRJU0NPTk5FQ1RFRDsKLQotICAgIG1MZWdhY3lNb2RlID0gbGVnYWN5TW9kZTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhMkNsaWVudDo6aW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsIGNvbnN0IFN0cmluZzgmIG1vbml0b3JUYWdzKSB7CkBAIC00MDEsNyArMzk5LDcgQEAKIAogICAgIGJpbmRlcjo6U3RhdHVzIHJlcyA9IGJpbmRlcjo6U3RhdHVzOjpvaygpOwogICAgIC8vIEFsbG93IGJvdGggY2xpZW50IGFuZCB0aGUgY2FtZXJhc2VydmVyIHRvIGRpc2Nvbm5lY3QgYXQgYWxsIHRpbWVzCi0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGlmIChjYWxsaW5nUGlkICE9IG1DbGllbnRQaWQgJiYgY2FsbGluZ1BpZCAhPSBtU2VydmljZVBpZCkgcmV0dXJuIHJlczsKIAogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiByZXM7CkBAIC00NTYsOCArNDU0LDYgQEAKIAogICAgIG1EZXZpY2UtPmRpc2Nvbm5lY3QoKTsKIAotICAgIG1EZXZpY2UuY2xlYXIoKTsKLQogICAgIENhbWVyYVNlcnZpY2U6OkNsaWVudDo6ZGlzY29ubmVjdCgpOwogCiAgICAgcmV0dXJuIHJlczsKQEAgLTQ2OCwxNCArNDY0LDE0IEBACiAgICAgQUxPR1YoIiVzOiBFIiwgX19GVU5DVElPTl9fKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CiAKLSAgICBpZiAobUNsaWVudFBpZCAhPSAwICYmIGdldENhbGxpbmdQaWQoKSAhPSBtQ2xpZW50UGlkKSB7CisgICAgaWYgKG1DbGllbnRQaWQgIT0gMCAmJiBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpICE9IG1DbGllbnRQaWQpIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENvbm5lY3Rpb24gYXR0ZW1wdCBmcm9tIHBpZCAlZDsgIgogICAgICAgICAgICAgICAgICJjdXJyZW50IGxvY2tlZCB0byBwaWQgJWQiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgbUNhbWVyYUlkLCBnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOworICAgICAgICAgICAgICAgIG1DYW1lcmFJZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgbUNsaWVudFBpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBtQ2xpZW50UGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKIAogICAgIG1SZW1vdGVDYWxsYmFjayA9IGNsaWVudDsKICAgICBtU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzID0gY2xpZW50OwpAQCAtNDg4LDE2ICs0ODQsMTYgQEAKICAgICBBTE9HVigiJXM6IEUiLCBfX0ZVTkNUSU9OX18pOwogICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogTG9jayBjYWxsIGZyb20gcGlkICVkOyBjdXJyZW50IGNsaWVudCBwaWQgJWQiLAotICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIGdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CiAKICAgICBpZiAobUNsaWVudFBpZCA9PSAwKSB7Ci0gICAgICAgIG1DbGllbnRQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgICAgIG1DbGllbnRQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCi0gICAgaWYgKG1DbGllbnRQaWQgIT0gZ2V0Q2FsbGluZ1BpZCgpKSB7CisgICAgaWYgKG1DbGllbnRQaWQgIT0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSkgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogTG9jayBjYWxsIGZyb20gcGlkICVkOyBjdXJyZW50bHkgbG9ja2VkIHRvIHBpZCAlZCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIGdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOwogICAgICAgICByZXR1cm4gRUJVU1k7CiAgICAgfQogCkBAIC01MDksOSArNTA1LDkgQEAKICAgICBBTE9HVigiJXM6IEUiLCBfX0ZVTkNUSU9OX18pOwogICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogVW5sb2NrIGNhbGwgZnJvbSBwaWQgJWQ7IGN1cnJlbnQgY2xpZW50IHBpZCAlZCIsCi0gICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgZ2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKIAotICAgIGlmIChtQ2xpZW50UGlkID09IGdldENhbGxpbmdQaWQoKSkgeworICAgIGlmIChtQ2xpZW50UGlkID09IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpIHsKICAgICAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKG1QYXJhbWV0ZXJzKTsKICAgICAgICAgaWYgKGwubVBhcmFtZXRlcnMuc3RhdGUgPT0gUGFyYW1ldGVyczo6UkVDT1JEIHx8CiAgICAgICAgICAgICAgICAgbC5tUGFyYW1ldGVycy5zdGF0ZSA9PSBQYXJhbWV0ZXJzOjpWSURFT19TTkFQU0hPVCkgewpAQCAtNTI1LDcgKzUyMSw3IEBACiAgICAgfQogCiAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVubG9jayBjYWxsIGZyb20gcGlkICVkOyBjdXJyZW50bHkgbG9ja2VkIHRvIHBpZCAlZCIsCi0gICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgZ2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKICAgICByZXR1cm4gRUJVU1k7CiB9CiAKQEAgLTc4MCwzMyArNzc2LDM1IEBACiAgICAgaW50IGxhc3RKcGVnU3RyZWFtSWQgPSBtSnBlZ1Byb2Nlc3Nvci0+Z2V0U3RyZWFtSWQoKTsKICAgICAvLyBJZiBqcGVnIHN0cmVhbSB3aWxsIHNsb3cgZG93biBwcmV2aWV3LCBtYWtlIHN1cmUgd2UgcmVtb3ZlIGl0IGJlZm9yZSBzdGFydGluZyBwcmV2aWV3CiAgICAgaWYgKHBhcmFtcy5zbG93SnBlZ01vZGUpIHsKLSAgICAgICAgLy8gUGF1c2UgcHJldmlldyBpZiB3ZSBhcmUgc3RyZWFtaW5nCi0gICAgICAgIGludDMyX3QgYWN0aXZlUmVxdWVzdElkID0gbVN0cmVhbWluZ1Byb2Nlc3Nvci0+Z2V0QWN0aXZlUmVxdWVzdElkKCk7Ci0gICAgICAgIGlmIChhY3RpdmVSZXF1ZXN0SWQgIT0gMCkgewotICAgICAgICAgICAgcmVzID0gbVN0cmVhbWluZ1Byb2Nlc3Nvci0+dG9nZ2xlUGF1c2VTdHJlYW0oLypwYXVzZSovdHJ1ZSk7Ci0gICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IHBhdXNlIHN0cmVhbWluZzogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIGlmIChsYXN0SnBlZ1N0cmVhbUlkICE9IE5PX1NUUkVBTSkgeworICAgICAgICAgICAgLy8gUGF1c2UgcHJldmlldyBpZiB3ZSBhcmUgc3RyZWFtaW5nCisgICAgICAgICAgICBpbnQzMl90IGFjdGl2ZVJlcXVlc3RJZCA9IG1TdHJlYW1pbmdQcm9jZXNzb3ItPmdldEFjdGl2ZVJlcXVlc3RJZCgpOworICAgICAgICAgICAgaWYgKGFjdGl2ZVJlcXVlc3RJZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgcmVzID0gbVN0cmVhbWluZ1Byb2Nlc3Nvci0+dG9nZ2xlUGF1c2VTdHJlYW0oLypwYXVzZSovdHJ1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgcGF1c2Ugc3RyZWFtaW5nOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcyA9IG1EZXZpY2UtPndhaXRVbnRpbERyYWluZWQoKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBXYWl0aW5nIHRvIHN0b3Agc3RyZWFtaW5nIGZhaWxlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlcyA9IG1EZXZpY2UtPndhaXRVbnRpbERyYWluZWQoKTsKKworICAgICAgICAgICAgcmVzID0gbUpwZWdQcm9jZXNzb3ItPmRlbGV0ZVN0cmVhbSgpOworCiAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFdhaXRpbmcgdG8gc3RvcCBzdHJlYW1pbmcgZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogZGVsZXRlIEpwZWcgc3RyZWFtIGZhaWxlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgfQotICAgICAgICB9CiAKLSAgICAgICAgcmVzID0gbUpwZWdQcm9jZXNzb3ItPmRlbGV0ZVN0cmVhbSgpOwotCi0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBkZWxldGUgSnBlZyBzdHJlYW0gZmFpbGVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhY3RpdmVSZXF1ZXN0SWQgIT0gMCkgewotICAgICAgICAgICAgcmVzID0gbVN0cmVhbWluZ1Byb2Nlc3Nvci0+dG9nZ2xlUGF1c2VTdHJlYW0oLypwYXVzZSovZmFsc2UpOwotICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDYW4ndCB1bnBhdXNlIHN0cmVhbWluZzogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICBpZiAoYWN0aXZlUmVxdWVzdElkICE9IDApIHsKKyAgICAgICAgICAgICAgICByZXMgPSBtU3RyZWFtaW5nUHJvY2Vzc29yLT50b2dnbGVQYXVzZVN0cmVhbSgvKnBhdXNlKi9mYWxzZSk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgdW5wYXVzZSBzdHJlYW1pbmc6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtOTU3LDcgKzk1NSw3IEBACiAgICAgICAgIGNhc2UgUGFyYW1ldGVyczo6VklERU9fU05BUFNIT1Q6CiAgICAgICAgIGNhc2UgUGFyYW1ldGVyczo6U1RJTExfQ0FQVFVSRToKICAgICAgICAgICAgIG1DYXB0dXJlU2VxdWVuY2VyLT53YWl0VW50aWxJZGxlKGtTdG9wQ2FwdHVyZVRpbWVvdXQpOwotICAgICAgICAgICAgLy8gbm8gYnJlYWsKKyAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgICAgICBjYXNlIFBhcmFtZXRlcnM6OlJFQ09SRDoKICAgICAgICAgY2FzZSBQYXJhbWV0ZXJzOjpQUkVWSUVXOgogICAgICAgICAgICAgc3luY1dpdGhEZXZpY2UoKTsKQEAgLTk4Nyw3ICs5ODUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgInN0b3AgcHJldmlldzogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBubyBicmVhaworICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgICAgIGNhc2UgUGFyYW1ldGVyczo6V0FJVElOR19GT1JfUFJFVklFV19XSU5ET1c6IHsKICAgICAgICAgICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChtUGFyYW1ldGVycyk7CiAgICAgICAgICAgICBsLm1QYXJhbWV0ZXJzLnN0YXRlID0gUGFyYW1ldGVyczo6U1RPUFBFRDsKQEAgLTE0NDEsMTMgKzE0MzksMTQgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYTJDbGllbnQ6OnRha2VQaWN0dXJlKGludCBtc2dUeXBlKSB7CitzdGF0dXNfdCBDYW1lcmEyQ2xpZW50Ojp0YWtlUGljdHVyZShpbnQgLyptc2dUeXBlKi8pIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKICAgICBzdGF0dXNfdCByZXM7CiAgICAgaWYgKCAocmVzID0gY2hlY2tQaWQoX19GVU5DVElPTl9fKSApICE9IE9LKSByZXR1cm4gcmVzOwogCiAgICAgaW50IHRha2VQaWN0dXJlQ291bnRlcjsKKyAgICBib29sIHNob3VsZFN5bmNXaXRoRGV2aWNlID0gdHJ1ZTsKICAgICB7CiAgICAgICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChtUGFyYW1ldGVycyk7CiAgICAgICAgIHN3aXRjaCAobC5tUGFyYW1ldGVycy5zdGF0ZSkgewpAQCAtMTUzMywxNCArMTUzMiwyNSBAQAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CiAgICAgICAgICAgICBtWnNsUHJvY2Vzc29yLT5jbGVhclpzbFF1ZXVlKCk7CiAgICAgICAgIH0KKworICAgICAgICAvLyBXZSBzaG91bGQgYWx3YXlzIHN5bmMgd2l0aCB0aGUgZGV2aWNlIGluIGNhc2UgZmxhc2ggaXMgdHVybmVkIG9uLAorICAgICAgICAvLyB0aGUgY2FtZXJhIGRldmljZSBzdWdnZXN0cyB0aGF0IGZsYXNoIGlzIG5lZWRlZCAoQUUgc3RhdGUgRkxBU0hfUkVRVUlSRUQpCisgICAgICAgIC8vIG9yIHdlIGFyZSBpbiBzb21lIG90aGVyIEFFIHN0YXRlIGRpZmZlcmVudCBmcm9tIENPTlZFUkdFRCB0aGF0IG1heSBuZWVkCisgICAgICAgIC8vIHByZWNhcHR1cmUgdHJpZ2dlci4KKyAgICAgICAgaWYgKGwubVBhcmFtZXRlcnMuZmxhc2hNb2RlICE9IFBhcmFtZXRlcnM6OkZMQVNIX01PREVfT04gJiYKKyAgICAgICAgICAgICAgICAobC5tUGFyYW1ldGVycy5hZVN0YXRlID09IEFORFJPSURfQ09OVFJPTF9BRV9TVEFURV9DT05WRVJHRUQpKSB7CisgICAgICAgICAgICBzaG91bGRTeW5jV2l0aERldmljZSAgPSBmYWxzZTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEFUUkFDRV9BU1lOQ19CRUdJTihrVGFrZXBpY3R1cmVMYWJlbCwgdGFrZVBpY3R1cmVDb3VudGVyKTsKIAotICAgIC8vIE5lZWQgSEFMIHRvIGhhdmUgY29ycmVjdCBzZXR0aW5ncyBiZWZvcmUgKHBvc3NpYmx5KSB0cmlnZ2VyaW5nIHByZWNhcHR1cmUKLSAgICBzeW5jV2l0aERldmljZSgpOworICAgIC8vIE1ha2Ugc3VyZSBIQUwgaGFzIGNvcnJlY3Qgc2V0dGluZ3MgaW4gY2FzZSBwcmVjYXB0dXJlIHRyaWdnZXIgaXMgbmVlZGVkLgorICAgIGlmIChzaG91bGRTeW5jV2l0aERldmljZSkgeworICAgICAgICBzeW5jV2l0aERldmljZSgpOworICAgIH0KIAotICAgIHJlcyA9IG1DYXB0dXJlU2VxdWVuY2VyLT5zdGFydENhcHR1cmUobXNnVHlwZSk7CisgICAgcmVzID0gbUNhcHR1cmVTZXF1ZW5jZXItPnN0YXJ0Q2FwdHVyZSgpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byBzdGFydCBjYXB0dXJlOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC0xNTc3LDcgKzE1ODcsNyBAQAogICAgIEFMT0dWKCIlczogQ2FtZXJhICVkIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOwogICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKICAgICAvLyBUaGUgY2FtZXJhIHNlcnZpY2UgY2FuIHVuY29uZGl0aW9uYWxseSBnZXQgdGhlIHBhcmFtZXRlcnMgYXQgYWxsIHRpbWVzCi0gICAgaWYgKGdldENhbGxpbmdQaWQoKSAhPSBtU2VydmljZVBpZCAmJiBjaGVja1BpZChfX0ZVTkNUSU9OX18pICE9IE9LKSByZXR1cm4gU3RyaW5nOCgpOworICAgIGlmIChDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpICE9IG1TZXJ2aWNlUGlkICYmIGNoZWNrUGlkKF9fRlVOQ1RJT05fXykgIT0gT0spIHJldHVybiBTdHJpbmc4KCk7CiAKICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpSZWFkTG9jayBsKG1QYXJhbWV0ZXJzKTsKIApAQCAtMTY2MCwyNyArMTY3MCw2IEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICAvLyB0aGUgY2FtZXJhMiBhcGkgbGVnYWN5IG1vZGUgY2FuIHVuY29uZGl0aW9uYWxseSBkaXNhYmxlIHRoZSBzaHV0dGVyIHNvdW5kCi0gICAgaWYgKG1MZWdhY3lNb2RlKSB7Ci0gICAgICAgIEFMT0dWKCIlczogRGlzYWJsZSBzaHV0dGVyIHNvdW5kIGluIGxlZ2FjeSBtb2RlIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgbC5tUGFyYW1ldGVycy5wbGF5U2h1dHRlclNvdW5kID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICAvLyBEaXNhYmxpbmcgc2h1dHRlciBzb3VuZCBtYXkgbm90IGJlIGFsbG93ZWQuIEluIHRoYXQgY2FzZSBvbmx5Ci0gICAgLy8gYWxsb3cgdGhlIG1lZGlhc2VydmVyIHByb2Nlc3MgdG8gZGlzYWJsZSB0aGUgc291bmQuCi0gICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIHByb3BlcnR5X2dldCgicm8uY2FtZXJhLnNvdW5kLmZvcmNlZCIsIHZhbHVlLCAiMCIpOwotICAgIGlmIChzdHJuY21wKHZhbHVlLCAiMCIsIDIpICE9IDApIHsKLSAgICAgICAgLy8gRGlzYWJsaW5nIHNodXR0ZXIgc291bmQgaXMgbm90IGFsbG93ZWQuIERlbnkgaWYgdGhlIGN1cnJlbnQKLSAgICAgICAgLy8gcHJvY2VzcyBpcyBub3QgbWVkaWFzZXJ2ZXIuCi0gICAgICAgIGlmIChnZXRDYWxsaW5nUGlkKCkgIT0gZ2V0cGlkKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZGlzYWJsZSBzaHV0dGVyIHNvdW5kLiBQZXJtaXNzaW9uIGRlbmllZCAocGlkICVkKSIsCi0gICAgICAgICAgICAgICAgICAgIGdldENhbGxpbmdQaWQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KICAgICBsLm1QYXJhbWV0ZXJzLnBsYXlTaHV0dGVyU291bmQgPSBmYWxzZTsKICAgICByZXR1cm4gT0s7CiB9CkBAIC0xNzc4LDYgKzE3NjcsNyBAQAogICAgICAgICBjYXNlIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfQlVGRkVSOgogICAgICAgICAgICAgQUxPR1coIiVzOiBSZWNlaXZlZCByZWNvdmVyYWJsZSBlcnJvciAlZCBmcm9tIEhBTCAtIGlnbm9yaW5nLCByZXF1ZXN0SWQgJSIgUFJJZDMyLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGVycm9yQ29kZSwgcmVzdWx0RXh0cmFzLnJlcXVlc3RJZCk7CisgICAgICAgICAgICBtQ2FwdHVyZVNlcXVlbmNlci0+bm90aWZ5RXJyb3IoZXJyb3JDb2RlLCByZXN1bHRFeHRyYXMpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgZXJyID0gQ0FNRVJBX0VSUk9SX1VOS05PV047CkBAIC0xODMzLDcgKzE4MjMsNyBAQAogICAgICAgICAgICAgICAgIHN3aXRjaCAobmV3U3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEVfRk9DVVNFRF9MT0NLRUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjZXNzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGJyZWFrCisgICAgICAgICAgICAgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKICAgICAgICAgICAgICAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEVfTk9UX0ZPQ1VTRURfTE9DS0VEOgogICAgICAgICAgICAgICAgICAgICAgICAgc2VuZENvbXBsZXRlZE1lc3NhZ2UgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgbC5tUGFyYW1ldGVycy5jdXJyZW50QWZUcmlnZ2VySWQgPSAtMTsKQEAgLTE4NTcsNyArMTg0Nyw3IEBACiAgICAgICAgICAgICAgICAgc3dpdGNoIChuZXdTdGF0ZSkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9BRl9TVEFURV9GT0NVU0VEX0xPQ0tFRDoKICAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgICAgICAgICAgICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9BRl9TVEFURV9OT1RfRk9DVVNFRF9MT0NLRUQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEb24ndCBzZW5kIG5vdGlmaWNhdGlvbnMgdXBzdHJlYW0gaWYgdGhleSdyZSBub3QgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY3VycmVudCBBRiB0cmlnZ2VyLiBGb3IgZXhhbXBsZSwgaWYgY2FuY2VsIHdhcwpAQCAtMTg4NSw3ICsxODc1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEVfUEFTU0lWRV9TQ0FOOgogICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgcGFzc2l2ZSBzY2FuLCBpbmZvcm0gdXBzdHJlYW0KICAgICAgICAgICAgICAgICAgICAgICAgIGFmSW5Nb3Rpb24gPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwogICAgICAgICAgICAgICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9BRl9TVEFURV9QQVNTSVZFX0ZPQ1VTRUQ6CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9DT05UUk9MX0FGX1NUQVRFX1BBU1NJVkVfVU5GT0NVU0VEOgogICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RvcCBwYXNzaXZlIHNjYW4sIGluZm9ybSB1cHN0cmVhbQpAQCAtMTkyOCwxNCArMTkxOCwxNiBAQAogdm9pZCBDYW1lcmEyQ2xpZW50Ojpub3RpZnlBdXRvRXhwb3N1cmUodWludDhfdCBuZXdTdGF0ZSwgaW50IHRyaWdnZXJJZCkgewogICAgIEFMT0dWKCIlczogQXV0b2V4cG9zdXJlIHN0YXRlIG5vdyAlZCwgbGFzdCB0cmlnZ2VyICVkIiwKICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbmV3U3RhdGUsIHRyaWdnZXJJZCk7CisgICAgeworICAgICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwobVBhcmFtZXRlcnMpOworICAgICAgICAvLyBVcGRhdGUgc3RhdGUKKyAgICAgICAgbC5tUGFyYW1ldGVycy5hZVN0YXRlID0gbmV3U3RhdGU7CisgICAgfQogICAgIG1DYXB0dXJlU2VxdWVuY2VyLT5ub3RpZnlBdXRvRXhwb3N1cmUobmV3U3RhdGUsIHRyaWdnZXJJZCk7CiB9CiAKIHZvaWQgQ2FtZXJhMkNsaWVudDo6bm90aWZ5U2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApIHsKLSAgICAodm9pZClyZXN1bHRFeHRyYXM7Ci0gICAgKHZvaWQpdGltZXN0YW1wOwotCiAgICAgQUxPR1YoIiVzOiBTaHV0dGVyIG5vdGlmaWNhdGlvbiBmb3IgcmVxdWVzdCBpZCAlIiBQUklkMzIgIiBhdCB0aW1lICUiIFBSSWQ2NCwKICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0RXh0cmFzLnJlcXVlc3RJZCwgdGltZXN0YW1wKTsKICAgICBtQ2FwdHVyZVNlcXVlbmNlci0+bm90aWZ5U2h1dHRlcihyZXN1bHRFeHRyYXMsIHRpbWVzdGFtcCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCmluZGV4IDQ0OTI5YzMuLmE5ZWEyNzEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5oCkBAIC05Niw4ICs5Niw3IEBACiAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICAgICAgaW50IGNsaWVudFBpZCwKICAgICAgICAgICAgIHVpZF90IGNsaWVudFVpZCwKLSAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkLAotICAgICAgICAgICAgYm9vbCBsZWdhY3lNb2RlKTsKKyAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkKTsKIAogICAgIHZpcnR1YWwgfkNhbWVyYTJDbGllbnQoKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwCmluZGV4IGYxMjAzZjkuLmQ2NWFjN2IgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAKQEAgLTI1LDI3ICsyNSwyNCBAQAogI2luY2x1ZGUgImFwaTEvQ2FtZXJhQ2xpZW50LmgiCiAjaW5jbHVkZSAiZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5oIgogI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKKyNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKICNkZWZpbmUgTE9HMSguLi4pIEFMT0dEX0lGKGdMb2dMZXZlbCA+PSAxLCBfX1ZBX0FSR1NfXyk7CiAjZGVmaW5lIExPRzIoLi4uKSBBTE9HRF9JRihnTG9nTGV2ZWwgPj0gMiwgX19WQV9BUkdTX18pOwogCi1zdGF0aWMgaW50IGdldENhbGxpbmdQaWQoKSB7Ci0gICAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLX0KLQogQ2FtZXJhQ2xpZW50OjpDYW1lcmFDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50PiYgY2FtZXJhQ2xpZW50LAogICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgIGludCBjYW1lcmFJZCwgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgaW50IGNsaWVudFBpZCwgaW50IGNsaWVudFVpZCwKLSAgICAgICAgaW50IHNlcnZpY2VQaWQsIGJvb2wgbGVnYWN5TW9kZSk6CisgICAgICAgIGludCBzZXJ2aWNlUGlkKToKICAgICAgICAgQ2xpZW50KGNhbWVyYVNlcnZpY2UsIGNhbWVyYUNsaWVudCwgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGNhbWVyYUlkKSwgY2FtZXJhSWQsIGNhbWVyYUZhY2luZywgY2xpZW50UGlkLAogICAgICAgICAgICAgICAgIGNsaWVudFVpZCwgc2VydmljZVBpZCkKIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgiQ2FtZXJhQ2xpZW50OjpDYW1lcmFDbGllbnQgRSAocGlkICVkLCBpZCAlZCkiLCBjYWxsaW5nUGlkLCBjYW1lcmFJZCk7CiAKICAgICBtSGFyZHdhcmUgPSBOVUxMOwpAQCAtNTcsMTQgKzU0LDEzIEBACiAgICAgLy8gQ2FsbGJhY2sgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdAogICAgIG1QcmV2aWV3Q2FsbGJhY2tGbGFnID0gQ0FNRVJBX0ZSQU1FX0NBTExCQUNLX0ZMQUdfTk9PUDsKICAgICBtT3JpZW50YXRpb24gPSBnZXRPcmllbnRhdGlvbigwLCBtQ2FtZXJhRmFjaW5nID09IENBTUVSQV9GQUNJTkdfRlJPTlQpOwotICAgIG1MZWdhY3lNb2RlID0gbGVnYWN5TW9kZTsKICAgICBtUGxheVNodXR0ZXJTb3VuZCA9IHRydWU7CiAgICAgTE9HMSgiQ2FtZXJhQ2xpZW50OjpDYW1lcmFDbGllbnQgWCAocGlkICVkLCBpZCAlZCkiLCBjYWxsaW5nUGlkLCBjYW1lcmFJZCk7CiB9CiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6aW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIC8qbW9uaXRvclRhZ3MqLykgewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBzdGF0dXNfdCByZXM7CiAKICAgICBMT0cxKCJDYW1lcmFDbGllbnQ6OmluaXRpYWxpemUgRSAocGlkICVkLCBpZCAlZCkiLCBjYWxsaW5nUGlkLCBtQ2FtZXJhSWQpOwpAQCAtMTA1LDcgKzEwMSw3IEBACiAvLyB0ZWFyIGRvd24gdGhlIGNsaWVudAogQ2FtZXJhQ2xpZW50Ojp+Q2FtZXJhQ2xpZW50KCkgewogICAgIG1EZXN0cnVjdGlvblN0YXJ0ZWQgPSB0cnVlOwotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBMT0cxKCJDYW1lcmFDbGllbnQ6On5DYW1lcmFDbGllbnQgRSAocGlkICVkLCB0aGlzICVwKSIsIGNhbGxpbmdQaWQsIHRoaXMpOwogCiAgICAgZGlzY29ubmVjdCgpOwpAQCAtMTQ4LDcgKzE0NCw3IEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6Y2hlY2tQaWQoKSBjb25zdCB7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGlmIChjYWxsaW5nUGlkID09IG1DbGllbnRQaWQpIHJldHVybiBOT19FUlJPUjsKIAogICAgIEFMT0dXKCJhdHRlbXB0IHRvIHVzZSBhIGxvY2tlZCBjYW1lcmEgZnJvbSBhIGRpZmZlcmVudCBwcm9jZXNzIgpAQCAtMTU4LDcgKzE1NCw4IEBACiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6Y2hlY2tQaWRBbmRIYXJkd2FyZSgpIGNvbnN0IHsKICAgICBpZiAobUhhcmR3YXJlID09IDApIHsKLSAgICAgICAgQUxPR0UoImF0dGVtcHQgdG8gdXNlIGEgY2FtZXJhIGFmdGVyIGRpc2Nvbm5lY3QoKSAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgICAgIEFMT0dFKCJhdHRlbXB0IHRvIHVzZSBhIGNhbWVyYSBhZnRlciBkaXNjb25uZWN0KCkgKHBpZCAlZCkiLAorICAgICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZCgpOwpAQCAtMTY3LDcgKzE2NCw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6bG9jaygpIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgibG9jayAocGlkICVkKSIsIGNhbGxpbmdQaWQpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKIApAQCAtMTgyLDcgKzE3OSw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6dW5sb2NrKCkgewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBMT0cxKCJ1bmxvY2sgKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAKQEAgLTIwNCw3ICsyMDEsNyBAQAogCiAvLyBjb25uZWN0IGEgbmV3IGNsaWVudCB0byB0aGUgY2FtZXJhCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmNvbm5lY3QoY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmFDbGllbnQ+JiBjbGllbnQpIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgiY29ubmVjdCBFIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogCkBAIC0yNDAsNyArMjM3LDcgQEAKIH0KIAogYmluZGVyOjpTdGF0dXMgQ2FtZXJhQ2xpZW50OjpkaXNjb25uZWN0KCkgewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBMT0cxKCJkaXNjb25uZWN0IEUgKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAKQEAgLTMzNCw3ICszMzEsNyBAQAogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpzZXRQcmV2aWV3VGFyZ2V0KAogICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgYnVmZmVyUHJvZHVjZXIpIHsKICAgICBMT0cxKCJzZXRQcmV2aWV3VGFyZ2V0KCVwKSAocGlkICVkKSIsIGJ1ZmZlclByb2R1Y2VyLmdldCgpLAotICAgICAgICAgICAgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICAgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogCiAgICAgc3A8SUJpbmRlcj4gYmluZGVyOwogICAgIHNwPEFOYXRpdmVXaW5kb3c+IHdpbmRvdzsKQEAgLTM1MSw3ICszNDgsNyBAQAogLy8gc2V0IHRoZSBwcmV2aWV3IGNhbGxiYWNrIGZsYWcgdG8gYWZmZWN0IGhvdyB0aGUgcmVjZWl2ZWQgZnJhbWVzIGZyb20KIC8vIHByZXZpZXcgYXJlIGhhbmRsZWQuCiB2b2lkIENhbWVyYUNsaWVudDo6c2V0UHJldmlld0NhbGxiYWNrRmxhZyhpbnQgY2FsbGJhY2tfZmxhZykgewotICAgIExPRzEoInNldFByZXZpZXdDYWxsYmFja0ZsYWcoJWQpIChwaWQgJWQpIiwgY2FsbGJhY2tfZmxhZywgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJzZXRQcmV2aWV3Q2FsbGJhY2tGbGFnKCVkKSAocGlkICVkKSIsIGNhbGxiYWNrX2ZsYWcsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm47CiAKQEAgLTM3MiwxMyArMzY5LDEzIEBACiAKIC8vIHN0YXJ0IHByZXZpZXcgbW9kZQogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpzdGFydFByZXZpZXcoKSB7Ci0gICAgTE9HMSgic3RhcnRQcmV2aWV3IChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJzdGFydFByZXZpZXcgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICByZXR1cm4gc3RhcnRDYW1lcmFNb2RlKENBTUVSQV9QUkVWSUVXX01PREUpOwogfQogCiAvLyBzdGFydCByZWNvcmRpbmcgbW9kZQogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpzdGFydFJlY29yZGluZygpIHsKLSAgICBMT0cxKCJzdGFydFJlY29yZGluZyAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgic3RhcnRSZWNvcmRpbmcgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICByZXR1cm4gc3RhcnRDYW1lcmFNb2RlKENBTUVSQV9SRUNPUkRJTkdfTU9ERSk7CiB9CiAKQEAgLTQ2MSw3ICs0NTgsNyBAQAogCiAvLyBzdG9wIHByZXZpZXcgbW9kZQogdm9pZCBDYW1lcmFDbGllbnQ6OnN0b3BQcmV2aWV3KCkgewotICAgIExPRzEoInN0b3BQcmV2aWV3IChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJzdG9wUHJldmlldyAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm47CiAKQEAgLTQ3Nyw3ICs0NzQsNyBAQAogCiAvLyBzdG9wIHJlY29yZGluZyBtb2RlCiB2b2lkIENhbWVyYUNsaWVudDo6c3RvcFJlY29yZGluZygpIHsKLSAgICBMT0cxKCJzdG9wUmVjb3JkaW5nIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJzdG9wUmVjb3JkaW5nIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybjsKQEAgLTUwMyw3ICs1MDAsNyBAQAogICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybjsKICAgICBpZiAobWVtID09IG51bGxwdHIpIHsKICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlV2l0aEluZm9Mb2coQ2FtZXJhU2VydmljZTo6U05fRVZFTlRfTE9HX0lELCAiMjYxNjQyNzIiLAotICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSwgbnVsbHB0ciwgMCk7CisgICAgICAgICAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKSwgbnVsbHB0ciwgMCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTYxNSw3ICs2MTIsNyBAQAogfQogCiBib29sIENhbWVyYUNsaWVudDo6cHJldmlld0VuYWJsZWQoKSB7Ci0gICAgTE9HMSgicHJldmlld0VuYWJsZWQgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoInByZXZpZXdFbmFibGVkIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuIGZhbHNlOwpAQCAtNjIzLDcgKzYyMCw3IEBACiB9CiAKIGJvb2wgQ2FtZXJhQ2xpZW50OjpyZWNvcmRpbmdFbmFibGVkKCkgewotICAgIExPRzEoInJlY29yZGluZ0VuYWJsZWQgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoInJlY29yZGluZ0VuYWJsZWQgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm4gZmFsc2U7CkBAIC02MzEsNyArNjI4LDcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjphdXRvRm9jdXMoKSB7Ci0gICAgTE9HMSgiYXV0b0ZvY3VzIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJhdXRvRm9jdXMgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CkBAIC02NDEsNyArNjM4LDcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjpjYW5jZWxBdXRvRm9jdXMoKSB7Ci0gICAgTE9HMSgiY2FuY2VsQXV0b0ZvY3VzIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJjYW5jZWxBdXRvRm9jdXMgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CkBAIC02NTIsNyArNjQ5LDcgQEAKIAogLy8gdGFrZSBhIHBpY3R1cmUgLSBpbWFnZSBpcyByZXR1cm5lZCBpbiBjYWxsYmFjawogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50Ojp0YWtlUGljdHVyZShpbnQgbXNnVHlwZSkgewotICAgIExPRzEoInRha2VQaWN0dXJlIChwaWQgJWQpOiAweCV4IiwgZ2V0Q2FsbGluZ1BpZCgpLCBtc2dUeXBlKTsKKyAgICBMT0cxKCJ0YWtlUGljdHVyZSAocGlkICVkKTogMHgleCIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIG1zZ1R5cGUpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIHN0YXR1c190IHJlc3VsdCA9IGNoZWNrUGlkQW5kSGFyZHdhcmUoKTsKQEAgLTY4MSw3ICs2NzgsNyBAQAogCiAvLyBzZXQgcHJldmlldy9jYXB0dXJlIHBhcmFtZXRlcnMgLSBrZXkvdmFsdWUgcGFpcnMKIHN0YXR1c190IENhbWVyYUNsaWVudDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBwYXJhbXMpIHsKLSAgICBMT0cxKCJzZXRQYXJhbWV0ZXJzIChwaWQgJWQpICglcykiLCBnZXRDYWxsaW5nUGlkKCksIHBhcmFtcy5zdHJpbmcoKSk7CisgICAgTE9HMSgic2V0UGFyYW1ldGVycyAocGlkICVkKSAoJXMpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgcGFyYW1zLnN0cmluZygpKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CkBAIC02OTYsMTYgKzY5MywxOCBAQAogU3RyaW5nOCBDYW1lcmFDbGllbnQ6OmdldFBhcmFtZXRlcnMoKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIC8vIFRoZSBjYW1lcmEgc2VydmljZSBjYW4gdW5jb25kaXRpb25hbGx5IGdldCB0aGUgcGFyYW1ldGVycyBhdCBhbGwgdGltZXMKLSAgICBpZiAoZ2V0Q2FsbGluZ1BpZCgpICE9IG1TZXJ2aWNlUGlkICYmIGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuIFN0cmluZzgoKTsKKyAgICBpZiAoQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSAhPSBtU2VydmljZVBpZCAmJiBjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIFN0cmluZzgoKTsKKyAgICB9CiAKICAgICBTdHJpbmc4IHBhcmFtcyhtSGFyZHdhcmUtPmdldFBhcmFtZXRlcnMoKS5mbGF0dGVuKCkpOwotICAgIExPRzEoImdldFBhcmFtZXRlcnMgKHBpZCAlZCkgKCVzKSIsIGdldENhbGxpbmdQaWQoKSwgcGFyYW1zLnN0cmluZygpKTsKKyAgICBMT0cxKCJnZXRQYXJhbWV0ZXJzIChwaWQgJWQpICglcykiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBwYXJhbXMuc3RyaW5nKCkpOwogICAgIHJldHVybiBwYXJhbXM7CiB9CiAKIC8vIGVuYWJsZSBzaHV0dGVyIHNvdW5kCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmVuYWJsZVNodXR0ZXJTb3VuZChib29sIGVuYWJsZSkgewotICAgIExPRzEoImVuYWJsZVNodXR0ZXJTb3VuZCAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgiZW5hYmxlU2h1dHRlclNvdW5kIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CiAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgcmV0dXJuIHJlc3VsdDsKQEAgLTcxNSwzMiArNzE0LDEyIEBACiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICAvLyB0aGUgY2FtZXJhMiBhcGkgbGVnYWN5IG1vZGUgY2FuIHVuY29uZGl0aW9uYWxseSBkaXNhYmxlIHRoZSBzaHV0dGVyIHNvdW5kCi0gICAgaWYgKG1MZWdhY3lNb2RlKSB7Ci0gICAgICAgIEFMT0dWKCIlczogRGlzYWJsZSBzaHV0dGVyIHNvdW5kIGluIGxlZ2FjeSBtb2RlIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgbVBsYXlTaHV0dGVyU291bmQgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIC8vIERpc2FibGluZyBzaHV0dGVyIHNvdW5kIG1heSBub3QgYmUgYWxsb3dlZC4gSW4gdGhhdCBjYXNlIG9ubHkKLSAgICAvLyBhbGxvdyB0aGUgbWVkaWFzZXJ2ZXIgcHJvY2VzcyB0byBkaXNhYmxlIHRoZSBzb3VuZC4KLSAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgcHJvcGVydHlfZ2V0KCJyby5jYW1lcmEuc291bmQuZm9yY2VkIiwgdmFsdWUsICIwIik7Ci0gICAgaWYgKHN0cmNtcCh2YWx1ZSwgIjAiKSAhPSAwKSB7Ci0gICAgICAgIC8vIERpc2FibGluZyBzaHV0dGVyIHNvdW5kIGlzIG5vdCBhbGxvd2VkLiBEZW55IGlmIHRoZSBjdXJyZW50Ci0gICAgICAgIC8vIHByb2Nlc3MgaXMgbm90IG1lZGlhc2VydmVyLgotICAgICAgICBpZiAoZ2V0Q2FsbGluZ1BpZCgpICE9IGdldHBpZCgpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRpc2FibGUgc2h1dHRlciBzb3VuZC4gUGVybWlzc2lvbiBkZW5pZWQgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOwotICAgICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgbVBsYXlTaHV0dGVyU291bmQgPSBmYWxzZTsKICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6c2VuZENvbW1hbmQoaW50MzJfdCBjbWQsIGludDMyX3QgYXJnMSwgaW50MzJfdCBhcmcyKSB7Ci0gICAgTE9HMSgic2VuZENvbW1hbmQgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoInNlbmRDb21tYW5kIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAgICAgaW50IG9yaWVudGF0aW9uOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaAppbmRleCAxOTEwNTM2Li45NTMwYjZjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmgKQEAgLTY4LDggKzY4LDcgQEAKICAgICAgICAgICAgIGludCBjYW1lcmFGYWNpbmcsCiAgICAgICAgICAgICBpbnQgY2xpZW50UGlkLAogICAgICAgICAgICAgaW50IGNsaWVudFVpZCwKLSAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkLAotICAgICAgICAgICAgYm9vbCBsZWdhY3lNb2RlID0gZmFsc2UpOworICAgICAgICAgICAgaW50IHNlcnZpY2VQaWQpOwogICAgIH5DYW1lcmFDbGllbnQoKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZShzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1hbmFnZXIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAKaW5kZXggYTliMmU3NS4uODg3OTlmOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcApAQCAtNTAsOCArNTAsNyBAQAogICAgICAgICBtU3RhdGVUcmFuc2l0aW9uQ291bnQoMCksCiAgICAgICAgIG1UcmlnZ2VySWQoMCksCiAgICAgICAgIG1UaW1lb3V0Q291bnQoMCksCi0gICAgICAgIG1DYXB0dXJlSWQoQ2FtZXJhMkNsaWVudDo6a0NhcHR1cmVSZXF1ZXN0SWRTdGFydCksCi0gICAgICAgIG1Nc2dUeXBlKDApIHsKKyAgICAgICAgbUNhcHR1cmVJZChDYW1lcmEyQ2xpZW50OjprQ2FwdHVyZVJlcXVlc3RJZFN0YXJ0KSB7CiAgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKIH0KIApAQCAtNjQsNyArNjMsNyBAQAogICAgIG1ac2xQcm9jZXNzb3IgPSBwcm9jZXNzb3I7CiB9CiAKLXN0YXR1c190IENhcHR1cmVTZXF1ZW5jZXI6OnN0YXJ0Q2FwdHVyZShpbnQgbXNnVHlwZSkgeworc3RhdHVzX3QgQ2FwdHVyZVNlcXVlbmNlcjo6c3RhcnRDYXB0dXJlKCkgewogICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5wdXRNdXRleCk7CkBAIC03Myw3ICs3Miw2IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgaWYgKCFtU3RhcnRDYXB0dXJlKSB7Ci0gICAgICAgIG1Nc2dUeXBlID0gbXNnVHlwZTsKICAgICAgICAgbVN0YXJ0Q2FwdHVyZSA9IHRydWU7CiAgICAgICAgIG1TdGFydENhcHR1cmVTaWduYWwuc2lnbmFsKCk7CiAgICAgfQpAQCAtMTE5LDYgKzExNywzMSBAQAogICAgIH0KIH0KIAordm9pZCBDYXB0dXJlU2VxdWVuY2VyOjpub3RpZnlFcnJvcihpbnQzMl90IGVycm9yQ29kZSwgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBib29sIGpwZWdCdWZmZXJMb3N0ID0gZmFsc2U7CisgICAgaWYgKGVycm9yQ29kZSA9PSBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0JVRkZFUikgeworICAgICAgICBzcDxDYW1lcmEyQ2xpZW50PiBjbGllbnQgPSBtQ2xpZW50LnByb21vdGUoKTsKKyAgICAgICAgaWYgKGNsaWVudCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaW50IGNhcHR1cmVTdHJlYW1JZCA9IGNsaWVudC0+Z2V0Q2FwdHVyZVN0cmVhbUlkKCk7CisgICAgICAgIGlmIChjYXB0dXJlU3RyZWFtSWQgPT0gcmVzdWx0RXh0cmFzLmVycm9yU3RyZWFtSWQpIHsKKyAgICAgICAgICAgIGpwZWdCdWZmZXJMb3N0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZXJyb3JDb2RlID09CisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFUVVFU1QpIHsKKyAgICAgICAgaWYgKHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQgPT0gbVNodXR0ZXJDYXB0dXJlSWQpIHsKKyAgICAgICAgICAgIGpwZWdCdWZmZXJMb3N0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChqcGVnQnVmZmVyTG9zdCkgeworICAgICAgICBzcDxNZW1vcnlCYXNlPiBlbXB0eUJ1ZmZlcjsKKyAgICAgICAgb25DYXB0dXJlQXZhaWxhYmxlKC8qdGltZXN0YW1wKi8wLCBlbXB0eUJ1ZmZlciwgLypjYXB0dXJlRXJyb3IqL3RydWUpOworICAgIH0KK30KKwogdm9pZCBDYXB0dXJlU2VxdWVuY2VyOjpvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0ICZyZXN1bHQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogTmV3IHJlc3VsdCBhdmFpbGFibGUuIiwgX19GVU5DVElPTl9fKTsKQEAgLTM4Niw3ICs0MDksNyBAQAogCiAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKGNsaWVudC0+Z2V0UGFyYW1ldGVycygpKTsKICAgICAvKiB3YXJuaW5nOiB0aGlzIGFsc28gbG9ja3MgYSBTaGFyZWRDYW1lcmFDYWxsYmFja3MgKi8KLSAgICBzaHV0dGVyTm90aWZ5TG9ja2VkKGwubVBhcmFtZXRlcnMsIGNsaWVudCwgbU1zZ1R5cGUpOworICAgIHNodXR0ZXJOb3RpZnlMb2NrZWQobC5tUGFyYW1ldGVycywgY2xpZW50KTsKICAgICBtU2h1dHRlck5vdGlmaWVkID0gdHJ1ZTsKICAgICBtVGltZW91dENvdW50ID0ga01heFRpbWVvdXRzRm9yQ2FwdHVyZUVuZDsKICAgICByZXR1cm4gU1RBTkRBUkRfQ0FQVFVSRV9XQUlUOwpAQCAtNDkyLDcgKzUxNSw2IEBACiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwoY2xpZW50LT5nZXRQYXJhbWV0ZXJzKCkpOwogICAgIFZlY3RvcjxpbnQzMl90PiBvdXRwdXRTdHJlYW1zOwotICAgIHVpbnQ4X3QgY2FwdHVyZUludGVudCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KEFORFJPSURfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVF9TVElMTF9DQVBUVVJFKTsKIAogICAgIC8qKgogICAgICAqIFNldCB1cCBvdXRwdXQgc3RyZWFtcyBpbiB0aGUgcmVxdWVzdApAQCAtNTIyLDcgKzU0NCw2IEBACiAKICAgICBpZiAobC5tUGFyYW1ldGVycy5zdGF0ZSA9PSBQYXJhbWV0ZXJzOjpWSURFT19TTkFQU0hPVCkgewogICAgICAgICBvdXRwdXRTdHJlYW1zLnB1c2goY2xpZW50LT5nZXRSZWNvcmRpbmdTdHJlYW1JZCgpKTsKLSAgICAgICAgY2FwdHVyZUludGVudCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KEFORFJPSURfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVF9WSURFT19TTkFQU0hPVCk7CiAgICAgfQogCiAgICAgcmVzID0gbUNhcHR1cmVSZXF1ZXN0LnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfT1VUUFVUX1NUUkVBTVMsCkBAIC01MzIsMTAgKzU1Myw2IEBACiAgICAgICAgICAgICAgICAgJm1DYXB0dXJlSWQsIDEpOwogICAgIH0KICAgICBpZiAocmVzID09IE9LKSB7Ci0gICAgICAgIHJlcyA9IG1DYXB0dXJlUmVxdWVzdC51cGRhdGUoQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5ULAotICAgICAgICAgICAgICAgICZjYXB0dXJlSW50ZW50LCAxKTsKLSAgICB9Ci0gICAgaWYgKHJlcyA9PSBPSykgewogICAgICAgICByZXMgPSBtQ2FwdHVyZVJlcXVlc3Quc29ydCgpOwogICAgIH0KIApAQCAtNjEyLDcgKzYyOSw3IEBACiAgICAgICAgIGlmICghbVNodXR0ZXJOb3RpZmllZCkgewogICAgICAgICAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKGNsaWVudC0+Z2V0UGFyYW1ldGVycygpKTsKICAgICAgICAgICAgIC8qIHdhcm5pbmc6IHRoaXMgYWxzbyBsb2NrcyBhIFNoYXJlZENhbWVyYUNhbGxiYWNrcyAqLwotICAgICAgICAgICAgc2h1dHRlck5vdGlmeUxvY2tlZChsLm1QYXJhbWV0ZXJzLCBjbGllbnQsIG1Nc2dUeXBlKTsKKyAgICAgICAgICAgIHNodXR0ZXJOb3RpZnlMb2NrZWQobC5tUGFyYW1ldGVycywgY2xpZW50KTsKICAgICAgICAgICAgIG1TaHV0dGVyTm90aWZpZWQgPSB0cnVlOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtVGltZW91dENvdW50IDw9IDApIHsKQEAgLTY4NSw2ICs3MDIsOCBAQAogICAgICAgICBzcDxDYW1lcmEyQ2xpZW50PiAmY2xpZW50KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCByZXM7CisgICAgdWludDhfdCBjYXB0dXJlSW50ZW50ID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5UX1NUSUxMX0NBUFRVUkUpOworCiAgICAgaWYgKG1DYXB0dXJlUmVxdWVzdC5lbnRyeUNvdW50KCkgPT0gMCkgewogICAgICAgICByZXMgPSBjbGllbnQtPmdldENhbWVyYURldmljZSgpLT5jcmVhdGVEZWZhdWx0UmVxdWVzdCgKICAgICAgICAgICAgICAgICBDQU1FUkEyX1RFTVBMQVRFX1NUSUxMX0NBUFRVUkUsCkBAIC02OTcsNiArNzE2LDE2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAocGFyYW1zLnN0YXRlID09IFBhcmFtZXRlcnM6OlZJREVPX1NOQVBTSE9UKSB7CisgICAgICAgIGNhcHR1cmVJbnRlbnQgPSBzdGF0aWNfY2FzdDx1aW50OF90PihBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlRfVklERU9fU05BUFNIT1QpOworICAgIH0KKyAgICByZXMgPSBtQ2FwdHVyZVJlcXVlc3QudXBkYXRlKEFORFJPSURfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVCwgJmNhcHR1cmVJbnRlbnQsIDEpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IFVuYWJsZSB0byB1cGRhdGUgY2FwdHVyZSBpbnRlbnQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2xpZW50LT5nZXRDYW1lcmFJZCgpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKICAgICByZXMgPSBwYXJhbXMudXBkYXRlUmVxdWVzdCgmbUNhcHR1cmVSZXF1ZXN0KTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmFibGUgdG8gdXBkYXRlIGNvbW1vbiBlbnRyaWVzIG9mIGNhcHR1cmUgIgpAQCAtNzE3LDEyICs3NDYsMTEgQEAKIH0KIAogLypzdGF0aWMqLyB2b2lkIENhcHR1cmVTZXF1ZW5jZXI6OnNodXR0ZXJOb3RpZnlMb2NrZWQoY29uc3QgUGFyYW1ldGVycyAmcGFyYW1zLAotICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhMkNsaWVudD4mIGNsaWVudCwgaW50IG1zZ1R5cGUpIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYTJDbGllbnQ+JiBjbGllbnQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCiAgICAgaWYgKHBhcmFtcy5zdGF0ZSA9PSBQYXJhbWV0ZXJzOjpTVElMTF9DQVBUVVJFCi0gICAgICAgICYmIHBhcmFtcy5wbGF5U2h1dHRlclNvdW5kCi0gICAgICAgICYmIChtc2dUeXBlICYgQ0FNRVJBX01TR19TSFVUVEVSKSkgeworICAgICAgICAmJiBwYXJhbXMucGxheVNodXR0ZXJTb3VuZCkgewogICAgICAgICBjbGllbnQtPmdldENhbWVyYVNlcnZpY2UoKS0+cGxheVNvdW5kKENhbWVyYVNlcnZpY2U6OlNPVU5EX1NIVVRURVIpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmgKaW5kZXggZjJlMzc1MC4uNzI3ZGQ1MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5oCkBAIC01MSw3ICs1MSw3IEBACiAgICAgdm9pZCBzZXRac2xQcm9jZXNzb3IoY29uc3Qgd3A8WnNsUHJvY2Vzc29yPiYgcHJvY2Vzc29yKTsKIAogICAgIC8vIEJlZ2luIHN0aWxsIGltYWdlIGNhcHR1cmUKLSAgICBzdGF0dXNfdCBzdGFydENhcHR1cmUoaW50IG1zZ1R5cGUpOworICAgIHN0YXR1c190IHN0YXJ0Q2FwdHVyZSgpOwogCiAgICAgLy8gV2FpdCB1bnRpbCBjdXJyZW50IGltYWdlIGNhcHR1cmUgY29tcGxldGVzOyByZXR1cm5zIGltbWVkaWF0ZWx5IGlmIG5vCiAgICAgLy8gY2FwdHVyZSBpcyBhY3RpdmUuIFJldHVybnMgVElNRURfT1VUIGlmIGNhcHR1cmUgZG9lcyBub3QgY29tcGxldGUgZHVyaW5nCkBAIC02NSw2ICs2NSw5IEBACiAgICAgdm9pZCBub3RpZnlTaHV0dGVyKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApOwogCisgICAgLy8gTm90aWZpY2F0aW9ucyBhYm91dCBzaHV0dGVyIChjYXB0dXJlIHN0YXJ0KQorICAgIHZvaWQgbm90aWZ5RXJyb3IoaW50MzJfdCBlcnJvckNvZGUsIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcyk7CisKICAgICAvLyBOb3RpZmljYXRpb24gZnJvbSB0aGUgZnJhbWUgcHJvY2Vzc29yCiAgICAgdmlydHVhbCB2b2lkIG9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQgJnJlc3VsdCk7CiAKQEAgLTE0NSw3ICsxNDgsNiBAQAogICAgIGJvb2wgbUFlSW5QcmVjYXB0dXJlOwogCiAgICAgaW50MzJfdCBtQ2FwdHVyZUlkOwotICAgIGludCBtTXNnVHlwZTsKIAogICAgIC8vIE1haW4gaW50ZXJuYWwgbWV0aG9kcwogCkBAIC0xNzIsNyArMTc0LDcgQEAKIAogICAgIC8vIEVtaXQgU2h1dHRlci9SYXcgY2FsbGJhY2sgdG8gamF2YSwgYW5kIG1heWJlIHBsYXkgYSBzaHV0dGVyIHNvdW5kCiAgICAgc3RhdGljIHZvaWQgc2h1dHRlck5vdGlmeUxvY2tlZChjb25zdCBQYXJhbWV0ZXJzICZwYXJhbXMsCi0gICAgICAgICAgICBjb25zdCBzcDxDYW1lcmEyQ2xpZW50PiYgY2xpZW50LCBpbnQgbXNnVHlwZSk7CisgICAgICAgICAgICBjb25zdCBzcDxDYW1lcmEyQ2xpZW50PiYgY2xpZW50KTsKIH07CiAKIH07IC8vIG5hbWVzcGFjZSBjYW1lcmEyCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmNwcAppbmRleCAwYzczOGU3Li42ODNlODRkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAKQEAgLTMzLDcgKzMzLDEwIEBACiAgICAgRnJhbWVQcm9jZXNzb3JCYXNlKGRldmljZSksCiAgICAgbUNsaWVudChjbGllbnQpLAogICAgIG1MYXN0RnJhbWVOdW1iZXJPZkZhY2VzKDApLAotICAgIG1MYXN0M0FGcmFtZU51bWJlcigtMSkgeworICAgIG1MYXN0M0FGcmFtZU51bWJlcigtMSksCisgICAgbUxhc3RBRUZyYW1lTnVtYmVyKC0xKSwKKyAgICBtTGFzdEFGcmFtZU51bWJlcigtMSksCisgICAgbUxhc3RBV0JGcmFtZU51bWJlcigtMSkgewogCiAgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gZCA9IGRldmljZS5wcm9tb3RlKCk7CiAgICAgbVN5bnRoZXNpemUzQU5vdGlmeSA9ICEoZC0+d2lsbE5vdGlmeTNBKCkpOwpAQCAtMjYyLDI0ICsyNjUsNzMgQEAKICAgICBib29sIGdvdEFsbFN0YXRlcyA9IHRydWU7CiAKICAgICAvLyBUT0RPOiBBbHNvIHVzZSBBRSBtb2RlLCBBRSB0cmlnZ2VyIElECi0gICAgZ290QWxsU3RhdGVzICY9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FGX01PREUsCisgICAgYm9vbCBnb3RBRlN0YXRlID0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUZfTU9ERSwKICAgICAgICAgICAgICZwZW5kaW5nU3RhdGUuYWZNb2RlLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOwogCi0gICAgZ290QWxsU3RhdGVzICY9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FXQl9NT0RFLAorICAgIGJvb2wgZ290QVdCU3RhdGUgPSB1cGRhdGVQZW5kaW5nU3RhdGU8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BV0JfTU9ERSwKICAgICAgICAgICAgICZwZW5kaW5nU3RhdGUuYXdiTW9kZSwgZnJhbWVOdW1iZXIsIGNhbWVyYUlkKTsKIAotICAgIGdvdEFsbFN0YXRlcyAmPSB1cGRhdGVQZW5kaW5nU3RhdGU8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRV9TVEFURSwKKyAgICBib29sIGdvdEFFU3RhdGUgPSB1cGRhdGVQZW5kaW5nU3RhdGU8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRV9TVEFURSwKICAgICAgICAgICAgICZwZW5kaW5nU3RhdGUuYWVTdGF0ZSwgZnJhbWVOdW1iZXIsIGNhbWVyYUlkKTsKIAotICAgIGdvdEFsbFN0YXRlcyAmPSB1cGRhdGVQZW5kaW5nU3RhdGU8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRl9TVEFURSwKKyAgICBnb3RBRlN0YXRlICY9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FGX1NUQVRFLAogICAgICAgICAgICAgJnBlbmRpbmdTdGF0ZS5hZlN0YXRlLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOwogCi0gICAgZ290QWxsU3RhdGVzICY9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FXQl9TVEFURSwKKyAgICBnb3RBV0JTdGF0ZSAmPSB1cGRhdGVQZW5kaW5nU3RhdGU8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BV0JfU1RBVEUsCiAgICAgICAgICAgICAmcGVuZGluZ1N0YXRlLmF3YlN0YXRlLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOwogCiAgICAgcGVuZGluZ1N0YXRlLmFmVHJpZ2dlcklkID0gZnJhbWUubVJlc3VsdEV4dHJhcy5hZlRyaWdnZXJJZDsKICAgICBwZW5kaW5nU3RhdGUuYWVUcmlnZ2VySWQgPSBmcmFtZS5tUmVzdWx0RXh0cmFzLnByZWNhcHR1cmVUcmlnZ2VySWQ7CiAKKyAgICBpZiAoZ290QUVTdGF0ZSAmJiAoZnJhbWVOdW1iZXIgPiBtTGFzdEFFRnJhbWVOdW1iZXIpKSB7CisgICAgICAgIGlmIChwZW5kaW5nU3RhdGUuYWVTdGF0ZSAhPSBtM2FTdGF0ZS5hZVN0YXRlIHx8CisgICAgICAgICAgICAgICAgcGVuZGluZ1N0YXRlLmFlVHJpZ2dlcklkID4gbTNhU3RhdGUuYWVUcmlnZ2VySWQpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBBRSBzdGF0ZSAlZC0+JWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hZVN0YXRlLCBwZW5kaW5nU3RhdGUuYWVTdGF0ZSk7CisgICAgICAgICAgICBjbGllbnQtPm5vdGlmeUF1dG9FeHBvc3VyZShwZW5kaW5nU3RhdGUuYWVTdGF0ZSwgcGVuZGluZ1N0YXRlLmFlVHJpZ2dlcklkKTsKKworICAgICAgICAgICAgbTNhU3RhdGUuYWVTdGF0ZSA9IHBlbmRpbmdTdGF0ZS5hZVN0YXRlOworICAgICAgICAgICAgbTNhU3RhdGUuYWVUcmlnZ2VySWQgPSBwZW5kaW5nU3RhdGUuYWVUcmlnZ2VySWQ7CisgICAgICAgICAgICBtTGFzdEFFRnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChnb3RBRlN0YXRlICYmIChmcmFtZU51bWJlciA+IG1MYXN0QUZyYW1lTnVtYmVyKSkgeworICAgICAgICBpZiAocGVuZGluZ1N0YXRlLmFmU3RhdGUgIT0gbTNhU3RhdGUuYWZTdGF0ZSB8fAorICAgICAgICAgICAgICAgIHBlbmRpbmdTdGF0ZS5hZk1vZGUgIT0gbTNhU3RhdGUuYWZNb2RlIHx8CisgICAgICAgICAgICAgICAgcGVuZGluZ1N0YXRlLmFmVHJpZ2dlcklkICE9IG0zYVN0YXRlLmFmVHJpZ2dlcklkKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQUYgc3RhdGUgJWQtPiVkLiBBRiBtb2RlICVkLT4lZC4gVHJpZ2dlciAlZC0+JWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hZlN0YXRlLCBwZW5kaW5nU3RhdGUuYWZTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgbTNhU3RhdGUuYWZNb2RlLCBwZW5kaW5nU3RhdGUuYWZNb2RlLAorICAgICAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hZlRyaWdnZXJJZCwgcGVuZGluZ1N0YXRlLmFmVHJpZ2dlcklkKTsKKyAgICAgICAgICAgIGNsaWVudC0+bm90aWZ5QXV0b0ZvY3VzKHBlbmRpbmdTdGF0ZS5hZlN0YXRlLCBwZW5kaW5nU3RhdGUuYWZUcmlnZ2VySWQpOworCisgICAgICAgICAgICBtM2FTdGF0ZS5hZlN0YXRlID0gcGVuZGluZ1N0YXRlLmFmU3RhdGU7CisgICAgICAgICAgICBtM2FTdGF0ZS5hZk1vZGUgPSBwZW5kaW5nU3RhdGUuYWZNb2RlOworICAgICAgICAgICAgbTNhU3RhdGUuYWZUcmlnZ2VySWQgPSBwZW5kaW5nU3RhdGUuYWZUcmlnZ2VySWQ7CisgICAgICAgICAgICBtTGFzdEFGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGdvdEFXQlN0YXRlICYmIChmcmFtZU51bWJlciA+IG1MYXN0QVdCRnJhbWVOdW1iZXIpKSB7CisgICAgICAgIGlmIChwZW5kaW5nU3RhdGUuYXdiU3RhdGUgIT0gbTNhU3RhdGUuYXdiU3RhdGUgfHwKKyAgICAgICAgICAgICAgICBwZW5kaW5nU3RhdGUuYXdiTW9kZSAhPSBtM2FTdGF0ZS5hd2JNb2RlKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQVdCIHN0YXRlICVkLT4lZC4gQVdCIG1vZGUgJWQtPiVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgbTNhU3RhdGUuYXdiU3RhdGUsIHBlbmRpbmdTdGF0ZS5hd2JTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgbTNhU3RhdGUuYXdiTW9kZSwgcGVuZGluZ1N0YXRlLmF3Yk1vZGUpOworICAgICAgICAgICAgY2xpZW50LT5ub3RpZnlBdXRvV2hpdGViYWxhbmNlKHBlbmRpbmdTdGF0ZS5hd2JTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgcGVuZGluZ1N0YXRlLmFlVHJpZ2dlcklkKTsKKworICAgICAgICAgICAgbTNhU3RhdGUuYXdiTW9kZSA9IHBlbmRpbmdTdGF0ZS5hd2JNb2RlOworICAgICAgICAgICAgbTNhU3RhdGUuYXdiU3RhdGUgPSBwZW5kaW5nU3RhdGUuYXdiU3RhdGU7CisgICAgICAgICAgICBtTGFzdEFXQkZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBnb3RBbGxTdGF0ZXMgJj0gZ290QUVTdGF0ZSAmIGdvdEFGU3RhdGUgJiBnb3RBV0JTdGF0ZTsKICAgICBpZiAoIWdvdEFsbFN0YXRlcykgewogICAgICAgICAvLyBJZiBub3QgYWxsIHN0YXRlcyBhcmUgcmVjZWl2ZWQsIHB1dCB0aGUgcGVuZGluZyBzdGF0ZSB0byBtUGVuZGluZzNBU3RhdGVzLgogICAgICAgICBpZiAoaW5kZXggPT0gTkFNRV9OT1RfRk9VTkQpIHsKQEAgLTI5MCw0MCArMzQyLDEwIEBACiAgICAgICAgIHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CiAgICAgfQogCi0gICAgLy8gT25jZSBhbGwgM0Egc3RhdGVzIGFyZSByZWNlaXZlZCwgbm90aWZ5IHRoZSBjbGllbnQgYWJvdXQgM0EgY2hhbmdlcy4KLSAgICBpZiAocGVuZGluZ1N0YXRlLmFlU3RhdGUgIT0gbTNhU3RhdGUuYWVTdGF0ZSB8fAotICAgICAgICAgICAgcGVuZGluZ1N0YXRlLmFlVHJpZ2dlcklkID4gbTNhU3RhdGUuYWVUcmlnZ2VySWQpIHsKLSAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEFFIHN0YXRlICVkLT4lZCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hZVN0YXRlLCBwZW5kaW5nU3RhdGUuYWVTdGF0ZSk7Ci0gICAgICAgIGNsaWVudC0+bm90aWZ5QXV0b0V4cG9zdXJlKHBlbmRpbmdTdGF0ZS5hZVN0YXRlLCBwZW5kaW5nU3RhdGUuYWVUcmlnZ2VySWQpOwotICAgIH0KLQotICAgIGlmIChwZW5kaW5nU3RhdGUuYWZTdGF0ZSAhPSBtM2FTdGF0ZS5hZlN0YXRlIHx8Ci0gICAgICAgIHBlbmRpbmdTdGF0ZS5hZk1vZGUgIT0gbTNhU3RhdGUuYWZNb2RlIHx8Ci0gICAgICAgIHBlbmRpbmdTdGF0ZS5hZlRyaWdnZXJJZCAhPSBtM2FTdGF0ZS5hZlRyaWdnZXJJZCkgewotICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQUYgc3RhdGUgJWQtPiVkLiBBRiBtb2RlICVkLT4lZC4gVHJpZ2dlciAlZC0+JWQiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgbTNhU3RhdGUuYWZTdGF0ZSwgcGVuZGluZ1N0YXRlLmFmU3RhdGUsCi0gICAgICAgICAgICAgICAgbTNhU3RhdGUuYWZNb2RlLCBwZW5kaW5nU3RhdGUuYWZNb2RlLAotICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFmVHJpZ2dlcklkLCBwZW5kaW5nU3RhdGUuYWZUcmlnZ2VySWQpOwotICAgICAgICBjbGllbnQtPm5vdGlmeUF1dG9Gb2N1cyhwZW5kaW5nU3RhdGUuYWZTdGF0ZSwgcGVuZGluZ1N0YXRlLmFmVHJpZ2dlcklkKTsKLSAgICB9Ci0gICAgaWYgKHBlbmRpbmdTdGF0ZS5hd2JTdGF0ZSAhPSBtM2FTdGF0ZS5hd2JTdGF0ZSB8fAotICAgICAgICBwZW5kaW5nU3RhdGUuYXdiTW9kZSAhPSBtM2FTdGF0ZS5hd2JNb2RlKSB7Ci0gICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBBV0Igc3RhdGUgJWQtPiVkLiBBV0IgbW9kZSAlZC0+JWQiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgbTNhU3RhdGUuYXdiU3RhdGUsIHBlbmRpbmdTdGF0ZS5hd2JTdGF0ZSwKLSAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hd2JNb2RlLCBwZW5kaW5nU3RhdGUuYXdiTW9kZSk7Ci0gICAgICAgIGNsaWVudC0+bm90aWZ5QXV0b1doaXRlYmFsYW5jZShwZW5kaW5nU3RhdGUuYXdiU3RhdGUsCi0gICAgICAgICAgICAgICAgcGVuZGluZ1N0YXRlLmFlVHJpZ2dlcklkKTsKLSAgICB9Ci0KICAgICBpZiAoaW5kZXggIT0gTkFNRV9OT1RfRk9VTkQpIHsKICAgICAgICAgbVBlbmRpbmczQVN0YXRlcy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKICAgICB9CiAKLSAgICBtM2FTdGF0ZSA9IHBlbmRpbmdTdGF0ZTsKICAgICBtTGFzdDNBRnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKIAogICAgIHJldHVybiBPSzsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmgKaW5kZXggNjJhNGU5MS4uODE4M2MxMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmgKQEAgLTEwNCw4ICsxMDQsNyBAQAogICAgIC8vIFRyYWNrIG1vc3QgcmVjZW50IGZyYW1lIG51bWJlciBmb3Igd2hpY2ggM0Egbm90aWZpY2F0aW9ucyB3ZXJlIHNlbnQgZm9yLgogICAgIC8vIFVzZWQgdG8gZmlsdGVyIGFnYWluc3Qgc2VuZGluZyAzQSBub3RpZmljYXRpb25zIGZvciB0aGUgc2FtZSBmcmFtZQogICAgIC8vIHNldmVyYWwgdGltZXMuCi0gICAgaW50MzJfdCBtTGFzdDNBRnJhbWVOdW1iZXI7Ci0KKyAgICBpbnQzMl90IG1MYXN0M0FGcmFtZU51bWJlciwgbUxhc3RBRUZyYW1lTnVtYmVyLCBtTGFzdEFGcmFtZU51bWJlciwgbUxhc3RBV0JGcmFtZU51bWJlcjsKICAgICAvLyBFbWl0IEZhY2VEZXRlY3Rpb24gZXZlbnQgdG8gamF2YSBpZiBmYWNlcyBjaGFuZ2VkCiAgICAgdm9pZCBjYWxsYmFja0ZhY2VEZXRlY3Rpb24oY29uc3Qgc3A8Q2FtZXJhMkNsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfZnJhbWVfbWV0YWRhdGEgJm1ldGFkYXRhKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcAppbmRleCBiNzAyMGZlLi5kZGZlNWUzIDEwMDc1NQotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwCkBAIC02MiwyNiArNjIsNiBAQAogICAgIH0KIH0KIAotdm9pZCBKcGVnUHJvY2Vzc29yOjpvbkJ1ZmZlckFjcXVpcmVkKGNvbnN0IEJ1ZmZlckluZm8mIC8qYnVmZmVySW5mbyovKSB7Ci0gICAgLy8gSW50ZW50aW9uYWxseSBsZWZ0IGVtcHR5Ci19Ci0KLXZvaWQgSnBlZ1Byb2Nlc3Nvcjo6b25CdWZmZXJSZWxlYXNlZChjb25zdCBCdWZmZXJJbmZvJiBidWZmZXJJbmZvKSB7Ci0gICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKLSAgICBpZiAoYnVmZmVySW5mby5tRXJyb3IpIHsKLSAgICAgICAgLy8gT25seSBsb2NrIGluIGNhc2Ugb2YgZXJyb3IsIHNpbmNlIHdlIGdldCBvbmUgb2YgdGhlc2UgZm9yIGVhY2gKLSAgICAgICAgLy8gb25GcmFtZUF2YWlsYWJsZSBhcyB3ZWxsLCBhbmQgc2NoZWR1bGluZyBtYXkgZGVsYXkgdGhpcyBjYWxsIGxhdGUKLSAgICAgICAgLy8gZW5vdWdoIHRvIHJ1biBpbnRvIGxhdGVyIHByZXZpZXcgcmVzdGFydCBvcGVyYXRpb25zLCBmb3Igbm9uLWVycm9yCi0gICAgICAgIC8vIGNhc2VzLgotICAgICAgICAvLyBiLzI5NTI0NjUxCi0gICAgICAgIEFMT0dWKCIlczogSlBFRyBidWZmZXIgbG9zdCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1JbnB1dE11dGV4KTsKLSAgICAgICAgbUNhcHR1cmVEb25lID0gdHJ1ZTsKLSAgICAgICAgbUNhcHR1cmVTdWNjZXNzID0gZmFsc2U7Ci0gICAgICAgIG1DYXB0dXJlRG9uZVNpZ25hbC5zaWduYWwoKTsKLSAgICB9Ci19Ci0KIHN0YXR1c190IEpwZWdQcm9jZXNzb3I6OnVwZGF0ZVN0cmVhbShjb25zdCBQYXJhbWV0ZXJzICZwYXJhbXMpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CkBAIC0xNzYsMTMgKzE1Niw2IEBACiAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQotCi0gICAgICAgIHJlcyA9IGRldmljZS0+YWRkQnVmZmVyTGlzdGVuZXJGb3JTdHJlYW0obUNhcHR1cmVTdHJlYW1JZCwgdGhpcyk7Ci0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IENhbid0IGFkZCBidWZmZXIgbGlzdGVuZXJpOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgICByZXR1cm4gcmVzOwotICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBPSzsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5oCmluZGV4IDcxODdhZDkuLjk3N2YxMWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuaApAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPGd1aS9DcHVDb25zdW1lci5oPgogCiAjaW5jbHVkZSAiY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00MSw4ICs0Miw3IEBACiAgKiBTdGlsbCBpbWFnZSBjYXB0dXJlIG91dHB1dCBpbWFnZSBwcm9jZXNzaW5nCiAgKi8KIGNsYXNzIEpwZWdQcm9jZXNzb3I6Ci0gICAgICAgICAgICBwdWJsaWMgVGhyZWFkLCBwdWJsaWMgQ3B1Q29uc3VtZXI6OkZyYW1lQXZhaWxhYmxlTGlzdGVuZXIsCi0gICAgICAgICAgICBwdWJsaWMgY2FtZXJhMzo6Q2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyIHsKKyAgICAgICAgICAgIHB1YmxpYyBUaHJlYWQsIHB1YmxpYyBDcHVDb25zdW1lcjo6RnJhbWVBdmFpbGFibGVMaXN0ZW5lciB7CiAgIHB1YmxpYzoKICAgICBKcGVnUHJvY2Vzc29yKHNwPENhbWVyYTJDbGllbnQ+IGNsaWVudCwgd3A8Q2FwdHVyZVNlcXVlbmNlcj4gc2VxdWVuY2VyKTsKICAgICB+SnBlZ1Byb2Nlc3NvcigpOwpAQCAtNTAsMTUgKzUwLDE0IEBACiAgICAgLy8gQ3B1Q29uc3VtZXIgbGlzdGVuZXIgaW1wbGVtZW50YXRpb24KICAgICB2b2lkIG9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgaXRlbSk7CiAKLSAgICAvLyBDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXIgaW1wbGVtZW50YXRpb24KLSAgICB2b2lkIG9uQnVmZmVyQWNxdWlyZWQoY29uc3QgQnVmZmVySW5mbyYgYnVmZmVySW5mbykgb3ZlcnJpZGU7Ci0gICAgdm9pZCBvbkJ1ZmZlclJlbGVhc2VkKGNvbnN0IEJ1ZmZlckluZm8mIGJ1ZmZlckluZm8pIG92ZXJyaWRlOwotCiAgICAgc3RhdHVzX3QgdXBkYXRlU3RyZWFtKGNvbnN0IFBhcmFtZXRlcnMgJnBhcmFtcyk7CiAgICAgc3RhdHVzX3QgZGVsZXRlU3RyZWFtKCk7CiAgICAgaW50IGdldFN0cmVhbUlkKCkgY29uc3Q7CiAKICAgICB2b2lkIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdDsKKworICAgIHN0YXRpYyBzaXplX3QgZmluZEpwZWdTaXplKHVpbnQ4X3QqIGpwZWdCdWZmZXIsIHNpemVfdCBtYXhTaXplKTsKKwogICBwcml2YXRlOgogICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtXYWl0RHVyYXRpb24gPSAxMDAwMDAwMDsgLy8gMTAgbXMKICAgICB3cDxDYW1lcmFEZXZpY2VCYXNlPiBtRGV2aWNlOwpAQCAtODIsNyArODEsNiBAQAogICAgIHZpcnR1YWwgYm9vbCB0aHJlYWRMb29wKCk7CiAKICAgICBzdGF0dXNfdCBwcm9jZXNzTmV3Q2FwdHVyZShib29sIGNhcHR1cmVTdWNjZXNzKTsKLSAgICBzaXplX3QgZmluZEpwZWdTaXplKHVpbnQ4X3QqIGpwZWdCdWZmZXIsIHNpemVfdCBtYXhTaXplKTsKIAogfTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwCmluZGV4IDI4ZDE4NmEuLjE4YWRkYjUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAKQEAgLTY5LDcgKzY5LDcgQEAKICAgICByZXMgPSBidWlsZFF1aXJrcygpOwogICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CiAKLSAgICBjb25zdCBTaXplIE1BWF9QUkVWSUVXX1NJWkUgPSB7IE1BWF9QUkVWSUVXX1dJRFRILCBNQVhfUFJFVklFV19IRUlHSFQgfTsKKyAgICBTaXplIG1heFByZXZpZXdTaXplID0geyBNQVhfUFJFVklFV19XSURUSCwgTUFYX1BSRVZJRVdfSEVJR0hUIH07CiAgICAgLy8gVHJlYXQgdGhlIEguMjY0IG1heCBzaXplIGFzIHRoZSBtYXggc3VwcG9ydGVkIHZpZGVvIHNpemUuCiAgICAgTWVkaWFQcm9maWxlcyAqdmlkZW9FbmNvZGVyUHJvZmlsZXMgPSBNZWRpYVByb2ZpbGVzOjpnZXRJbnN0YW5jZSgpOwogICAgIFZlY3Rvcjx2aWRlb19lbmNvZGVyPiBlbmNvZGVycyA9IHZpZGVvRW5jb2RlclByb2ZpbGVzLT5nZXRWaWRlb0VuY29kZXJzKCk7CkBAIC05MCwxMSArOTAsMTYgQEAKICAgICAgICAgfQogICAgIH0KICAgICAvLyBUaGlzIGlzIGp1c3QgYW4gdXBwZXIgYm91bmQgYW5kIG1heSBub3QgYmUgYW4gYWN0dWFsbHkgdmFsaWQgdmlkZW8gc2l6ZQotICAgIGNvbnN0IFNpemUgVklERU9fU0laRV9VUFBFUl9CT1VORCA9IHttYXhWaWRlb1dpZHRoLCBtYXhWaWRlb0hlaWdodH07CisgICAgU2l6ZSB2aWRlb1NpemVVcHBlckJvdW5kID0ge21heFZpZGVvV2lkdGgsIG1heFZpZGVvSGVpZ2h0fTsKIAotICAgIHJlcyA9IGdldEZpbHRlcmVkU2l6ZXMoTUFYX1BSRVZJRVdfU0laRSwgJmF2YWlsYWJsZVByZXZpZXdTaXplcyk7CisgICAgaWYgKGZhc3RJbmZvLnN1cHBvcnRzUHJlZmVycmVkQ29uZmlncykgeworICAgICAgICBtYXhQcmV2aWV3U2l6ZSA9IGdldE1heFNpemUoZ2V0UHJlZmVycmVkUHJldmlld1NpemVzKCkpOworICAgICAgICB2aWRlb1NpemVVcHBlckJvdW5kID0gZ2V0TWF4U2l6ZShnZXRQcmVmZXJyZWRWaWRlb1NpemVzKCkpOworICAgIH0KKworICAgIHJlcyA9IGdldEZpbHRlcmVkU2l6ZXMobWF4UHJldmlld1NpemUsICZhdmFpbGFibGVQcmV2aWV3U2l6ZXMpOwogICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7Ci0gICAgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyhWSURFT19TSVpFX1VQUEVSX0JPVU5ELCAmYXZhaWxhYmxlVmlkZW9TaXplcyk7CisgICAgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyh2aWRlb1NpemVVcHBlckJvdW5kLCAmYXZhaWxhYmxlVmlkZW9TaXplcyk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKIAogICAgIC8vIFNlbGVjdCBpbml0aWFsIHByZXZpZXcgYW5kIHZpZGVvIHNpemUgdGhhdCdzIHVuZGVyIHRoZSBpbml0aWFsIGJvdW5kIGFuZApAQCAtMjk2LDkgKzMwMSwxMyBAQAogICAgIFZlY3RvcjxTaXplPiBhdmFpbGFibGVKcGVnU2l6ZXMgPSBnZXRBdmFpbGFibGVKcGVnU2l6ZXMoKTsKICAgICBpZiAoIWF2YWlsYWJsZUpwZWdTaXplcy5zaXplKCkpIHJldHVybiBOT19JTklUOwogCi0gICAgLy8gVE9ETzogUGljayBtYXhpbXVtCiAgICAgcGljdHVyZVdpZHRoID0gYXZhaWxhYmxlSnBlZ1NpemVzWzBdLndpZHRoOwogICAgIHBpY3R1cmVIZWlnaHQgPSBhdmFpbGFibGVKcGVnU2l6ZXNbMF0uaGVpZ2h0OworICAgIGlmIChmYXN0SW5mby5zdXBwb3J0c1ByZWZlcnJlZENvbmZpZ3MpIHsKKyAgICAgICAgU2l6ZSBzdWdnZXN0ZWRKcGVnU2l6ZSA9IGdldE1heFNpemUoZ2V0UHJlZmVycmVkSnBlZ1NpemVzKCkpOworICAgICAgICBwaWN0dXJlV2lkdGggPSBzdWdnZXN0ZWRKcGVnU2l6ZS53aWR0aDsKKyAgICAgICAgcGljdHVyZUhlaWdodCA9IHN1Z2dlc3RlZEpwZWdTaXplLmhlaWdodDsKKyAgICB9CiAgICAgcGljdHVyZVdpZHRoTGFzdFNldCA9IHBpY3R1cmVXaWR0aDsKICAgICBwaWN0dXJlSGVpZ2h0TGFzdFNldCA9IHBpY3R1cmVIZWlnaHQ7CiAgICAgcGljdHVyZVNpemVPdmVycmlkZW4gPSBmYWxzZTsKQEAgLTc1Nyw2ICs3NjYsNyBAQAogICAgIGZvY3VzU3RhdGUgPSBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEVfSU5BQ1RJVkU7CiAgICAgc2hhZG93Rm9jdXNNb2RlID0gRk9DVVNfTU9ERV9JTlZBTElEOwogCisgICAgYWVTdGF0ZSA9IEFORFJPSURfQ09OVFJPTF9BRV9TVEFURV9JTkFDVElWRTsKICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBtYXgzYVJlZ2lvbnMgPSBzdGF0aWNJbmZvKEFORFJPSURfQ09OVFJPTF9NQVhfUkVHSU9OUywKICAgICAgICAgICAgIFBhcmFtZXRlcnM6Ok5VTV9SRUdJT04sIFBhcmFtZXRlcnM6Ok5VTV9SRUdJT04pOwogICAgIGlmIChtYXgzYVJlZ2lvbnMuY291bnQgIT0gUGFyYW1ldGVyczo6TlVNX1JFR0lPTikgcmV0dXJuIE5PX0lOSVQ7CkBAIC0xMDEwLDYgKzEwMjAsOSBAQAogICAgICAgICBhcnJheUhlaWdodCA9IGFjdGl2ZUFycmF5U2l6ZS5kYXRhLmkzMlszXTsKICAgICB9IGVsc2UgcmV0dXJuIE5PX0lOSVQ7CiAKKyAgICBmYXN0SW5mby5zdXBwb3J0c1ByZWZlcnJlZENvbmZpZ3MgPQorICAgICAgICBpbmZvLT5leGlzdHMoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OUyk7CisKICAgICAvLyBXZSdsbCBzZXQgdGhlIHRhcmdldCBGUFMgcmFuZ2UgZm9yIHN0aWxsIGNhcHR1cmVzIHRvIGJlIGFzIHdpZGUKICAgICAvLyBhcyBwb3NzaWJsZSB0byBnaXZlIHRoZSBIQUwgbWF4aW11bSBsYXRpdHVkZSBmb3IgZXhwb3N1cmUgc2VsZWN0aW9uCiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlRnBzUmFuZ2VzID0KQEAgLTEwMjEsOCArMTAzNCwxMSBAQAogICAgIC8vIEdldCBzdXBwb3J0ZWQgcHJldmlldyBmcHMgcmFuZ2VzLCB1cCB0byBkZWZhdWx0IG1heGltdW0uCiAgICAgVmVjdG9yPFNpemU+IHN1cHBvcnRlZFByZXZpZXdTaXplczsKICAgICBWZWN0b3I8RnBzUmFuZ2U+IHN1cHBvcnRlZFByZXZpZXdGcHNSYW5nZXM7Ci0gICAgY29uc3QgU2l6ZSBQUkVWSUVXX1NJWkVfQk9VTkQgPSB7IE1BWF9QUkVWSUVXX1dJRFRILCBNQVhfUFJFVklFV19IRUlHSFQgfTsKLSAgICBzdGF0dXNfdCByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKFBSRVZJRVdfU0laRV9CT1VORCwgJnN1cHBvcnRlZFByZXZpZXdTaXplcyk7CisgICAgU2l6ZSBwcmV2aWV3U2l6ZUJvdW5kID0geyBNQVhfUFJFVklFV19XSURUSCwgTUFYX1BSRVZJRVdfSEVJR0hUIH07CisgICAgaWYgKGZhc3RJbmZvLnN1cHBvcnRzUHJlZmVycmVkQ29uZmlncykgeworICAgICAgICBwcmV2aWV3U2l6ZUJvdW5kID0gZ2V0TWF4U2l6ZShnZXRQcmVmZXJyZWRQcmV2aWV3U2l6ZXMoKSk7CisgICAgfQorICAgIHN0YXR1c190IHJlcyA9IGdldEZpbHRlcmVkU2l6ZXMocHJldmlld1NpemVCb3VuZCwgJnN1cHBvcnRlZFByZXZpZXdTaXplcyk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKICAgICBmb3IgKHNpemVfdCBpPTA7IGkgPCBhdmFpbGFibGVGcHNSYW5nZXMuY291bnQ7IGkgKz0gMikgewogICAgICAgICBpZiAoIWlzRnBzU3VwcG9ydGVkKHN1cHBvcnRlZFByZXZpZXdTaXplcywKQEAgLTMxMDYsNiArMzEyMiw2NyBAQAogICAgIHJldHVybiBqcGVnU2l6ZXM7CiB9CiAKK1ZlY3RvcjxQYXJhbWV0ZXJzOjpTdHJlYW1Db25maWd1cmF0aW9uPiBQYXJhbWV0ZXJzOjpnZXRQcmVmZXJyZWRTdHJlYW1Db25maWd1cmF0aW9ucygKKyAgICAgICAgaW50MzJfdCB1c2VjYXNlSWQpIGNvbnN0IHsKKyAgICBjb25zdCBzaXplX3QgU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSA9IDU7CisgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9XSURUSF9PRkZTRVQgPSAwOworICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fSEVJR0hUX09GRlNFVCA9IDE7CisgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9GT1JNQVRfT0ZGU0VUID0gMjsKKyAgICBjb25zdCBzaXplX3QgU1RSRUFNX0lTX0lOUFVUX09GRlNFVCA9IDM7CisgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9VU0VDQVNFX0JJVE1BUF9PRkZTRVQgPSA0OworICAgIFZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPiBzY3M7CisKKyAgICBpZiAoZmFzdEluZm8uc3VwcG9ydHNQcmVmZXJyZWRDb25maWdzKSB7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MgPSBzdGF0aWNJbmZvKAorICAgICAgICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlMpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuY291bnQ7IGkrPSBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFKSB7CisgICAgICAgICAgICBpbnQzMl90IHdpZHRoID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX1dJRFRIX09GRlNFVF07CisgICAgICAgICAgICBpbnQzMl90IGhlaWdodCA9IGF2YWlsYWJsZVN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSArIFNUUkVBTV9IRUlHSFRfT0ZGU0VUXTsKKyAgICAgICAgICAgIGludDMyX3QgZm9ybWF0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0ZPUk1BVF9PRkZTRVRdOworICAgICAgICAgICAgaW50MzJfdCBpc0lucHV0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0lTX0lOUFVUX09GRlNFVF07CisgICAgICAgICAgICBpbnQzMl90IHN1cHBvcnRlZFVzZWNhc2VzID0KKyAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX1VTRUNBU0VfQklUTUFQX09GRlNFVF07CisgICAgICAgICAgICBpZiAoc3VwcG9ydGVkVXNlY2FzZXMgJiAoMSA8PCB1c2VjYXNlSWQpKSB7CisgICAgICAgICAgICAgICAgU3RyZWFtQ29uZmlndXJhdGlvbiBzYyA9IHtmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGlzSW5wdXR9OworICAgICAgICAgICAgICAgIHNjcy5hZGQoc2MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNjczsKK30KKworVmVjdG9yPFBhcmFtZXRlcnM6OlNpemU+IFBhcmFtZXRlcnM6OmdldFByZWZlcnJlZEZpbHRlcmVkU2l6ZXMoaW50MzJfdCB1c2VjYXNlSWQsCisgICAgICAgIGludDMyX3QgZm9ybWF0KSBjb25zdCB7CisgICAgVmVjdG9yPFBhcmFtZXRlcnM6OlNpemU+IHNpemVzOworICAgIFZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPiBzY3MgPSBnZXRQcmVmZXJyZWRTdHJlYW1Db25maWd1cmF0aW9ucyh1c2VjYXNlSWQpOworICAgIGZvciAoY29uc3QgYXV0byAmaXQgOiBzY3MpIHsKKyAgICAgICAgaWYgKGl0LmZvcm1hdCA9PSBmb3JtYXQpIHsKKyAgICAgICAgICAgIHNpemVzLmFkZCh7aXQud2lkdGgsIGl0LmhlaWdodH0pOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHNpemVzOworfQorCitWZWN0b3I8UGFyYW1ldGVyczo6U2l6ZT4gUGFyYW1ldGVyczo6Z2V0UHJlZmVycmVkSnBlZ1NpemVzKCkgY29uc3QgeworICAgIHJldHVybiBnZXRQcmVmZXJyZWRGaWx0ZXJlZFNpemVzKAorICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19TTkFQU0hPVCwKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfQkxPQik7Cit9CisKK1ZlY3RvcjxQYXJhbWV0ZXJzOjpTaXplPiBQYXJhbWV0ZXJzOjpnZXRQcmVmZXJyZWRQcmV2aWV3U2l6ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFByZWZlcnJlZEZpbHRlcmVkU2l6ZXMoCisgICAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1BSRVZJRVcsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpOworfQorCitWZWN0b3I8UGFyYW1ldGVyczo6U2l6ZT4gUGFyYW1ldGVyczo6Z2V0UHJlZmVycmVkVmlkZW9TaXplcygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UHJlZmVycmVkRmlsdGVyZWRTaXplcygKKyAgICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfUkVDT1JELAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEKTsKK30KKwogUGFyYW1ldGVyczo6Q3JvcFJlZ2lvbiBQYXJhbWV0ZXJzOjpjYWxjdWxhdGVDcm9wUmVnaW9uKGJvb2wgcHJldmlld09ubHkpIGNvbnN0IHsKIAogICAgIGZsb2F0IHpvb21MZWZ0LCB6b29tVG9wLCB6b29tV2lkdGgsIHpvb21IZWlnaHQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaAppbmRleCA0MmU3YTQ3Li4zYTcwOWM5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmgKQEAgLTEyMiw2ICsxMjIsNyBAQAogICAgICAgICBpbnQzMl90IGhpZ2g7CiAgICAgfTsKIAorICAgIHVpbnQ4X3QgYWVTdGF0ZTsgLy9sYXRlc3QgQUUgc3RhdGUgZnJvbSBIYWwKICAgICBpbnQzMl90IGV4cG9zdXJlQ29tcGVuc2F0aW9uOwogICAgIGJvb2wgYXV0b0V4cG9zdXJlTG9jazsKICAgICBib29sIGF1dG9FeHBvc3VyZUxvY2tBdmFpbGFibGU7CkBAIC0yNDcsNiArMjQ4LDcgQEAKICAgICAgICAgYm9vbCB1c2VGbGV4aWJsZVl1djsKICAgICAgICAgU2l6ZSBtYXhKcGVnU2l6ZTsKICAgICAgICAgU2l6ZSBtYXhac2xTaXplOworICAgICAgICBib29sIHN1cHBvcnRzUHJlZmVycmVkQ29uZmlnczsKICAgICB9IGZhc3RJbmZvOwogCiAgICAgLy8gUXVpcmtzIGluZm9ybWF0aW9uOyB0aGVzZSBhcmUgc2hvcnQtbGl2ZWQgZmxhZ3MgdG8gZW5hYmxlIHdvcmthcm91bmRzIGZvcgpAQCAtNDE3LDYgKzQxOSw5IEBACiAgICAgLy8gcmV0dXJucyBhbiBlbXB0eSBWZWN0b3IgaWYgZGV2aWNlIEhBTCB2ZXJzaW9uIGRvZXMgc3VwcG9ydCBpdAogICAgIFZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPiBnZXRTdHJlYW1Db25maWd1cmF0aW9ucygpOwogCisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGV4dHJhY3QgdGhlIHN1Z2dlc3RlZCBzdHJlYW0gY29uZmlndXJhdGlvbnMKKyAgICBWZWN0b3I8U3RyZWFtQ29uZmlndXJhdGlvbj4gZ2V0UHJlZmVycmVkU3RyZWFtQ29uZmlndXJhdGlvbnMoaW50MzJfdCB1c2VjYXNlSWQpIGNvbnN0OworCiAgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGdldCBtaW5pbXVtIGZyYW1lIGR1cmF0aW9uIGZvciBhIGpwZWcgc2l6ZQogICAgIC8vIHJldHVybiAtMSBpZiBpbnB1dCBqcGVnIHNpemUgY2Fubm90IGJlIGZvdW5kIGluIHN1cHBvcnRlZCBzaXplIGxpc3QKICAgICBpbnQ2NF90IGdldEpwZWdTdHJlYW1NaW5GcmFtZUR1cmF0aW9uTnMoUGFyYW1ldGVyczo6U2l6ZSBzaXplKTsKQEAgLTQzOCw2ICs0NDMsMTUgQEAKICAgICAvLyBUaGUgbWF4aW11bSBzaXplIGlzIGRlZmluZWQgYnkgY29tcGFyaW5nIHdpZHRoIGZpcnN0LCB3aGVuIHdpZHRoIHRpZXMgY29tcGFyaW5nIGhlaWdodC4KICAgICBTaXplIGdldE1heFNpemUoY29uc3QgVmVjdG9yPFNpemU+JiBzaXplcyk7CiAKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZmlsdGVyIGFuZCBzb3J0IHN1Z2dlc3RlZCBzaXplcworICAgIFZlY3RvcjxQYXJhbWV0ZXJzOjpTaXplPiBnZXRQcmVmZXJyZWRGaWx0ZXJlZFNpemVzKGludDMyX3QgdXNlY2FzZUlkLCBpbnQzMl90IGZvcm1hdCkgY29uc3Q7CisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3VnZ2VzdGVkIGpwZWcgc2l6ZXMKKyAgICBWZWN0b3I8U2l6ZT4gZ2V0UHJlZmVycmVkSnBlZ1NpemVzKCkgY29uc3Q7CisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3VnZ2VzdGVkIHByZXZpZXcgc2l6ZXMKKyAgICBWZWN0b3I8U2l6ZT4gZ2V0UHJlZmVycmVkUHJldmlld1NpemVzKCkgY29uc3Q7CisgICAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3VnZ2VzdGVkIHZpZGVvIHNpemVzCisgICAgVmVjdG9yPFNpemU+IGdldFByZWZlcnJlZFZpZGVvU2l6ZXMoKSBjb25zdDsKKwogICAgIGludCBtRGV2aWNlVmVyc2lvbjsKICAgICB1aW50OF90IG1EZWZhdWx0U2NlbmVNb2RlOwogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcAppbmRleCA5OGQwNTM0Li5jN2E0ZjJiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHV0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgpAQCAtMjYsMTAgKzI3LDE1IEBACiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYVV0aWxzLmg+CiAKICNpbmNsdWRlICJjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oIgorI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM0RldmljZS5oIgorI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oIgogI2luY2x1ZGUgImFwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgiCiAKICNpbmNsdWRlIDxjYW1lcmFfbWV0YWRhdGFfaGlkZGVuLmg+CiAKKyNpbmNsdWRlICJEZXB0aENvbXBvc2l0ZVN0cmVhbS5oIgorI2luY2x1ZGUgIkhlaWNDb21wb3NpdGVTdHJlYW0uaCIKKwogLy8gQ29udmVuaWVuY2UgbWV0aG9kcyBmb3IgY29uc3RydWN0aW5nIGJpbmRlcjo6U3RhdHVzIG9iamVjdHMgZm9yIGVycm9yIHJldHVybnMKIAogI2RlZmluZSBTVEFUVVNfRVJST1IoZXJyb3JDb2RlLCBlcnJvclN0cmluZykgXApAQCAtMTIyLDYgKzEyOCw3IEBACiAgICAgICAgICAgICAgICAgcGh5c2ljYWxLZXlzRW50cnkuZGF0YS5pMzIgKyBwaHlzaWNhbEtleXNFbnRyeS5jb3VudCk7CiAgICAgfQogCisgICAgbVByb3ZpZGVyTWFuYWdlciA9IHByb3ZpZGVyUHRyOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMTM5LDYgKzE0Niw3IEBACiAKIGJpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6aW5zZXJ0R2JwTG9ja2VkKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAsCiAgICAgICAgIFN1cmZhY2VNYXAqIG91dFN1cmZhY2VNYXAsIFZlY3RvcjxpbnQzMl90Piogb3V0cHV0U3RyZWFtSWRzLCBpbnQzMl90ICpjdXJyZW50U3RyZWFtSWQpIHsKKyAgICBpbnQgY29tcG9zaXRlSWR4OwogICAgIGludCBpZHggPSBtU3RyZWFtTWFwLmluZGV4T2ZLZXkoSUludGVyZmFjZTo6YXNCaW5kZXIoZ2JwKSk7CiAKICAgICAvLyBUcnlpbmcgdG8gc3VibWl0IHJlcXVlc3Qgd2l0aCBzdXJmYWNlIHRoYXQgd2Fzbid0IGNyZWF0ZWQKQEAgLTE0OCw2ICsxNTYsMTEgQEAKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CiAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwKICAgICAgICAgICAgICAgICAiUmVxdWVzdCB0YXJnZXRzIFN1cmZhY2UgdGhhdCBpcyBub3QgcGFydCBvZiBjdXJyZW50IGNhcHR1cmUgc2Vzc2lvbiIpOworICAgIH0gZWxzZSBpZiAoKGNvbXBvc2l0ZUlkeCA9IG1Db21wb3NpdGVTdHJlYW1NYXAuaW5kZXhPZktleShJSW50ZXJmYWNlOjphc0JpbmRlcihnYnApKSkKKyAgICAgICAgICAgICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIG1Db21wb3NpdGVTdHJlYW1NYXAudmFsdWVBdChjb21wb3NpdGVJZHgpLT5pbnNlcnRHYnAob3V0U3VyZmFjZU1hcCwgb3V0cHV0U3RyZWFtSWRzLAorICAgICAgICAgICAgICAgIGN1cnJlbnRTdHJlYW1JZCk7CisgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKICAgICB9CiAKICAgICBjb25zdCBTdHJlYW1TdXJmYWNlSWQmIHN0cmVhbVN1cmZhY2VJZCA9IG1TdHJlYW1NYXAudmFsdWVBdChpZHgpOwpAQCAtMjUyLDcgKzI2NSw3IEBACiAgICAgICAgIFZlY3RvcjxpbnQzMl90PiBvdXRwdXRTdHJlYW1JZHM7CiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByZXF1ZXN0ZWRQaHlzaWNhbElkczsKICAgICAgICAgaWYgKHJlcXVlc3QubVN1cmZhY2VMaXN0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGZvciAoc3A8U3VyZmFjZT4gc3VyZmFjZSA6IHJlcXVlc3QubVN1cmZhY2VMaXN0KSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlIDogcmVxdWVzdC5tU3VyZmFjZUxpc3QpIHsKICAgICAgICAgICAgICAgICBpZiAoc3VyZmFjZSA9PSAwKSBjb250aW51ZTsKIAogICAgICAgICAgICAgICAgIGludDMyX3Qgc3RyZWFtSWQ7CkBAIC00NjksNiArNDgyLDc5IEBACiAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVELCAiQ2FtZXJhIGRldmljZSBubyBsb25nZXIgYWxpdmUiKTsKICAgICB9CiAKKyAgICByZXMgPSBjaGVja09wZXJhdGluZ01vZGVMb2NrZWQob3BlcmF0aW5nTW9kZSk7CisgICAgaWYgKCFyZXMuaXNPaygpKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gbURldmljZS0+Y29uZmlndXJlU3RyZWFtcyhzZXNzaW9uUGFyYW1zLCBvcGVyYXRpbmdNb2RlKTsKKyAgICBpZiAoZXJyID09IEJBRF9WQUxVRSkgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBVbnN1cHBvcnRlZCBzZXQgb2YgaW5wdXRzL291dHB1dHMgcHJvdmlkZWQiLAorICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOworICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IEVycm9yIGNvbmZpZ3VyaW5nIHN0cmVhbXM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgbXNnLnN0cmluZygpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db21wb3NpdGVTdHJlYW1NYXAuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGVyciA9IG1Db21wb3NpdGVTdHJlYW1NYXAudmFsdWVBdChpKS0+Y29uZmlndXJlU3RyZWFtKCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LICkgeworICAgICAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IEVycm9yIGNvbmZpZ3VyaW5nIGNvbXBvc2l0ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAic3RyZWFtczogJXMgKCVkKSIsIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXMgPSBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitiaW5kZXI6OlN0YXR1cyBDYW1lcmFEZXZpY2VDbGllbnQ6OmNoZWNrU3VyZmFjZVR5cGVMb2NrZWQoc2l6ZV90IG51bUJ1ZmZlclByb2R1Y2VycywKKyAgICAgICAgYm9vbCBkZWZlcnJlZENvbnN1bWVyLCBpbnQgc3VyZmFjZVR5cGUpIGNvbnN0IHsKKyAgICBpZiAobnVtQnVmZmVyUHJvZHVjZXJzID4gTUFYX1NVUkZBQ0VTX1BFUl9TVFJFQU0pIHsKKyAgICAgICAgQUxPR0UoIiVzOiBHcmFwaGljQnVmZmVyUHJvZHVjZXIgY291bnQgJXp1IGZvciBzdHJlYW0gZXhjZWVkcyBsaW1pdCBvZiAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBudW1CdWZmZXJQcm9kdWNlcnMsIE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiU3VyZmFjZSBjb3VudCBpcyB0b28gaGlnaCIpOworICAgIH0gZWxzZSBpZiAoKG51bUJ1ZmZlclByb2R1Y2VycyA9PSAwKSAmJiAoIWRlZmVycmVkQ29uc3VtZXIpKSB7CisgICAgICAgIEFMT0dFKCIlczogTnVtYmVyIG9mIGNvbnN1bWVycyBjYW5ub3QgYmUgc21hbGxlciB0aGFuIDEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsICJObyB2YWxpZCBjb25zdW1lcnMuIik7CisgICAgfQorCisgICAgYm9vbCB2YWxpZFN1cmZhY2VUeXBlID0gKChzdXJmYWNlVHlwZSA9PSBPdXRwdXRDb25maWd1cmF0aW9uOjpTVVJGQUNFX1RZUEVfU1VSRkFDRV9WSUVXKSB8fAorICAgICAgICAgICAgKHN1cmZhY2VUeXBlID09IE91dHB1dENvbmZpZ3VyYXRpb246OlNVUkZBQ0VfVFlQRV9TVVJGQUNFX1RFWFRVUkUpKTsKKworICAgIGlmIChkZWZlcnJlZENvbnN1bWVyICYmICF2YWxpZFN1cmZhY2VUeXBlKSB7CisgICAgICAgIEFMT0dFKCIlczogVGFyZ2V0IHN1cmZhY2UgaGFzIGludmFsaWQgc3VyZmFjZVR5cGUgPSAlZC4iLCBfX0ZVTkNUSU9OX18sIHN1cmZhY2VUeXBlKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiVGFyZ2V0IFN1cmZhY2UgaXMgaW52YWxpZCIpOworICAgIH0KKworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50OjpjaGVja1BoeXNpY2FsQ2FtZXJhSWRMb2NrZWQoU3RyaW5nOCBwaHlzaWNhbENhbWVyYUlkKSB7CisgICAgaWYgKHBoeXNpY2FsQ2FtZXJhSWQuc2l6ZSgpID4gMCkgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGh5c2ljYWxDYW1lcmFJZHM7CisgICAgICAgIGJvb2wgbG9naWNhbENhbWVyYSA9CisgICAgICAgICAgICBtUHJvdmlkZXJNYW5hZ2VyLT5pc0xvZ2ljYWxDYW1lcmEobUNhbWVyYUlkU3RyLnN0cmluZygpLCAmcGh5c2ljYWxDYW1lcmFJZHMpOworICAgICAgICBpZiAoIWxvZ2ljYWxDYW1lcmEgfHwKKyAgICAgICAgICAgICAgICBzdGQ6OmZpbmQocGh5c2ljYWxDYW1lcmFJZHMuYmVnaW4oKSwgcGh5c2ljYWxDYW1lcmFJZHMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQuc3RyaW5nKCkpID09IHBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpKSB7CisgICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBDYW1lcmEgZG9lc24ndCBzdXBwb3J0IHBoeXNpY2FsQ2FtZXJhSWQgJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBwaHlzaWNhbENhbWVyYUlkLnN0cmluZygpKTsKKyAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6Y2hlY2tPcGVyYXRpbmdNb2RlTG9ja2VkKGludCBvcGVyYXRpbmdNb2RlKSBjb25zdCB7CiAgICAgaWYgKG9wZXJhdGluZ01vZGUgPCAwKSB7CiAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KAogICAgICAgICAgICAgIkNhbWVyYSAlczogSW52YWxpZCBvcGVyYXRpbmcgbW9kZSAlZCByZXF1ZXN0ZWQiLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIG9wZXJhdGluZ01vZGUpOwpAQCAtNDc3LDcgKzU2Myw2IEBACiAgICAgICAgICAgICAgICAgbXNnLnN0cmluZygpKTsKICAgICB9CiAKLSAgICAvLyBTYW5pdGl6ZSB0aGUgaGlnaCBzcGVlZCBzZXNzaW9uIGFnYWluc3QgbmVjZXNzYXJ5IGNhcGFiaWxpdHkgYml0LgogICAgIGJvb2wgaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCA9IChvcGVyYXRpbmdNb2RlID09IElDYW1lcmFEZXZpY2VVc2VyOjpDT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREUpOwogICAgIGlmIChpc0NvbnN0cmFpbmVkSGlnaFNwZWVkKSB7CiAgICAgICAgIENhbWVyYU1ldGFkYXRhIHN0YXRpY0luZm8gPSBtRGV2aWNlLT5pbmZvKCk7CkBAIC01MDAsMTcgKzU4NSwyMDUgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHN0YXR1c190IGVyciA9IG1EZXZpY2UtPmNvbmZpZ3VyZVN0cmVhbXMoc2Vzc2lvblBhcmFtcywgb3BlcmF0aW5nTW9kZSk7Ci0gICAgaWYgKGVyciA9PSBCQURfVkFMVUUpIHsKLSAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogVW5zdXBwb3J0ZWQgc2V0IG9mIGlucHV0cy9vdXRwdXRzIHByb3ZpZGVkIiwKLSAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKwordm9pZCBDYW1lcmFEZXZpY2VDbGllbnQ6Om1hcFN0cmVhbUluZm8oY29uc3QgT3V0cHV0U3RyZWFtSW5mbyAmc3RyZWFtSW5mbywKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIFN0cmluZzggcGh5c2ljYWxJZCwKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtICpzdHJlYW0gLypvdXQqLykgeworICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RyZWFtLT52M18yLnN0cmVhbVR5cGUgPSBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbVR5cGU6Ok9VVFBVVDsKKyAgICBzdHJlYW0tPnYzXzIud2lkdGggPSBzdHJlYW1JbmZvLndpZHRoOworICAgIHN0cmVhbS0+djNfMi5oZWlnaHQgPSBzdHJlYW1JbmZvLmhlaWdodDsKKyAgICBzdHJlYW0tPnYzXzIuZm9ybWF0ID0gQ2FtZXJhM0RldmljZTo6bWFwVG9QaXhlbEZvcm1hdChzdHJlYW1JbmZvLmZvcm1hdCk7CisgICAgYXV0byB1ID0gc3RyZWFtSW5mby5jb25zdW1lclVzYWdlOworICAgIGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW06OmFwcGx5WlNMVXNhZ2VRdWlyayhzdHJlYW1JbmZvLmZvcm1hdCwgJnUpOworICAgIHN0cmVhbS0+djNfMi51c2FnZSA9IENhbWVyYTNEZXZpY2U6Om1hcFRvQ29uc3VtZXJVc2FnZSh1KTsKKyAgICBzdHJlYW0tPnYzXzIuZGF0YVNwYWNlID0gQ2FtZXJhM0RldmljZTo6bWFwVG9IaWRsRGF0YXNwYWNlKHN0cmVhbUluZm8uZGF0YVNwYWNlKTsKKyAgICBzdHJlYW0tPnYzXzIucm90YXRpb24gPSBDYW1lcmEzRGV2aWNlOjptYXBUb1N0cmVhbVJvdGF0aW9uKHJvdGF0aW9uKTsKKyAgICBzdHJlYW0tPnYzXzIuaWQgPSAtMTsgLy8gSW52YWxpZCBzdHJlYW0gaWQKKyAgICBzdHJlYW0tPnBoeXNpY2FsQ2FtZXJhSWQgPSBzdGQ6OnN0cmluZyhwaHlzaWNhbElkLnN0cmluZygpKTsKKyAgICBzdHJlYW0tPmJ1ZmZlclNpemUgPSAwOworfQorCitiaW5kZXI6OlN0YXR1cyBDYW1lcmFEZXZpY2VDbGllbnQ6OmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgIGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBzZXNzaW9uQ29uZmlndXJhdGlvbiwgYm9vbCAqc3RhdHVzIC8qb3V0Ki8pIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgYmluZGVyOjpTdGF0dXMgcmVzOworICAgIGlmICghKHJlcyA9IGNoZWNrUGlkU3RhdHVzKF9fRlVOQ1RJT05fXykpLmlzT2soKSkgcmV0dXJuIHJlczsKKworICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKKworICAgIGlmICghbURldmljZS5nZXQoKSkgeworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0RJU0NPTk5FQ1RFRCwgIkNhbWVyYSBkZXZpY2Ugbm8gbG9uZ2VyIGFsaXZlIik7CisgICAgfQorCisgICAgYXV0byBvcGVyYXRpbmdNb2RlID0gc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0T3BlcmF0aW5nTW9kZSgpOworICAgIHJlcyA9IGNoZWNrT3BlcmF0aW5nTW9kZUxvY2tlZChvcGVyYXRpbmdNb2RlKTsKKyAgICBpZiAoIXJlcy5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzID09IG51bGxwdHIpIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoICJDYW1lcmEgJXM6IEludmFsaWQgc3RhdHVzISIsIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CiAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOwotICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IEVycm9yIGNvbmZpZ3VyaW5nIHN0cmVhbXM6ICVzICglZCkiLAotICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKKyAgICB9CisKKyAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gc3RyZWFtQ29uZmlndXJhdGlvbjsKKyAgICBhdXRvIHJldCA9IENhbWVyYTNEZXZpY2U6Om1hcFRvU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjYW1lcmEzX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdD4gKG9wZXJhdGluZ01vZGUpLAorICAgICAgICAgICAgLypvdXQqLyAmc3RyZWFtQ29uZmlndXJhdGlvbi5vcGVyYXRpb25Nb2RlKTsKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KAorICAgICAgICAgICAgIkNhbWVyYSAlczogRmFpbGVkIG1hcHBpbmcgb3BlcmF0aW5nIG1vZGUgJWQgcmVxdWVzdGVkOiAlcyAoJWQpIiwgbUNhbWVyYUlkU3RyLnN0cmluZygpLAorICAgICAgICAgICAgb3BlcmF0aW5nTW9kZSwgc3RyZXJyb3IoLXJldCksIHJldCk7CiAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAorICAgICAgICAgICAgICAgIG1zZy5zdHJpbmcoKSk7CisgICAgfQorCisgICAgYm9vbCBpc0lucHV0VmFsaWQgPSAoc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0SW5wdXRXaWR0aCgpID4gMCkgJiYKKyAgICAgICAgICAgIChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dEhlaWdodCgpID4gMCkgJiYKKyAgICAgICAgICAgIChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dEZvcm1hdCgpID4gMCk7CisgICAgYXV0byBvdXRwdXRDb25maWdzID0gc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0Q29uZmlndXJhdGlvbnMoKTsKKyAgICBzaXplX3Qgc3RyZWFtQ291bnQgPSBvdXRwdXRDb25maWdzLnNpemUoKTsKKyAgICBzdHJlYW1Db3VudCA9IGlzSW5wdXRWYWxpZCA/IHN0cmVhbUNvdW50ICsgMSA6IHN0cmVhbUNvdW50OworICAgIHN0cmVhbUNvbmZpZ3VyYXRpb24uc3RyZWFtcy5yZXNpemUoc3RyZWFtQ291bnQpOworICAgIHNpemVfdCBzdHJlYW1JZHggPSAwOworICAgIGlmIChpc0lucHV0VmFsaWQpIHsKKyAgICAgICAgc3RyZWFtQ29uZmlndXJhdGlvbi5zdHJlYW1zW3N0cmVhbUlkeCsrXSA9IHt7LypzdHJlYW1JZCovMCwKKyAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbVR5cGU6OklOUFVULAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PiAoc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0SW5wdXRXaWR0aCgpKSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4gKHNlc3Npb25Db25maWd1cmF0aW9uLmdldElucHV0SGVpZ2h0KCkpLAorICAgICAgICAgICAgICAgIENhbWVyYTNEZXZpY2U6Om1hcFRvUGl4ZWxGb3JtYXQoc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0SW5wdXRGb3JtYXQoKSksCisgICAgICAgICAgICAgICAgLyp1c2FnZSovIDAsIEhBTF9EQVRBU1BBQ0VfVU5LTk9XTiwKKyAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbVJvdGF0aW9uOjpST1RBVElPTl8wfSwKKyAgICAgICAgICAgICAgICAvKnBoeXNpY2FsSWQqLyBudWxscHRyLCAvKmJ1ZmZlclNpemUqLzB9OworICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byAmaXQgOiBvdXRwdXRDb25maWdzKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+PiYgYnVmZmVyUHJvZHVjZXJzID0KKyAgICAgICAgICAgIGl0LmdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcnMoKTsKKyAgICAgICAgYm9vbCBkZWZlcnJlZENvbnN1bWVyID0gaXQuaXNEZWZlcnJlZCgpOworICAgICAgICBTdHJpbmc4IHBoeXNpY2FsQ2FtZXJhSWQgPSBTdHJpbmc4KGl0LmdldFBoeXNpY2FsQ2FtZXJhSWQoKSk7CisgICAgICAgIHNpemVfdCBudW1CdWZmZXJQcm9kdWNlcnMgPSBidWZmZXJQcm9kdWNlcnMuc2l6ZSgpOworICAgICAgICBib29sIGlzU3RyZWFtSW5mb1ZhbGlkID0gZmFsc2U7CisgICAgICAgIE91dHB1dFN0cmVhbUluZm8gc3RyZWFtSW5mbzsKKworICAgICAgICByZXMgPSBjaGVja1N1cmZhY2VUeXBlTG9ja2VkKG51bUJ1ZmZlclByb2R1Y2VycywgZGVmZXJyZWRDb25zdW1lciwgaXQuZ2V0U3VyZmFjZVR5cGUoKSk7CisgICAgICAgIGlmICghcmVzLmlzT2soKSkgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorCisgICAgICAgIHJlcyA9IGNoZWNrUGh5c2ljYWxDYW1lcmFJZExvY2tlZChwaHlzaWNhbENhbWVyYUlkKTsKKyAgICAgICAgaWYgKCFyZXMuaXNPaygpKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlZmVycmVkQ29uc3VtZXIpIHsKKyAgICAgICAgICAgIHN0cmVhbUluZm8ud2lkdGggPSBpdC5nZXRXaWR0aCgpOworICAgICAgICAgICAgc3RyZWFtSW5mby5oZWlnaHQgPSBpdC5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIHN0cmVhbUluZm8uZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOworICAgICAgICAgICAgc3RyZWFtSW5mby5kYXRhU3BhY2UgPSBhbmRyb2lkX2RhdGFzcGFjZV90OjpIQUxfREFUQVNQQUNFX1VOS05PV047CisgICAgICAgICAgICBhdXRvIHN1cmZhY2VUeXBlID0gaXQuZ2V0U3VyZmFjZVR5cGUoKTsKKyAgICAgICAgICAgIHN0cmVhbUluZm8uY29uc3VtZXJVc2FnZSA9IEdyYXBoaWNCdWZmZXI6OlVTQUdFX0hXX1RFWFRVUkU7CisgICAgICAgICAgICBpZiAoc3VyZmFjZVR5cGUgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6U1VSRkFDRV9UWVBFX1NVUkZBQ0VfVklFVykgeworICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uY29uc3VtZXJVc2FnZSB8PSBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19DT01QT1NFUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hcFN0cmVhbUluZm8oc3RyZWFtSW5mbywgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMCwgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgJnN0cmVhbUNvbmZpZ3VyYXRpb24uc3RyZWFtc1tzdHJlYW1JZHgrK10pOworICAgICAgICAgICAgaXNTdHJlYW1JbmZvVmFsaWQgPSB0cnVlOworCisgICAgICAgICAgICBpZiAobnVtQnVmZmVyUHJvZHVjZXJzID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoYXV0byYgYnVmZmVyUHJvZHVjZXIgOiBidWZmZXJQcm9kdWNlcnMpIHsKKyAgICAgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2U7CisgICAgICAgICAgICByZXMgPSBjcmVhdGVTdXJmYWNlRnJvbUdicChzdHJlYW1JbmZvLCBpc1N0cmVhbUluZm9WYWxpZCwgc3VyZmFjZSwgYnVmZmVyUHJvZHVjZXIsCisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQpOworCisgICAgICAgICAgICBpZiAoIXJlcy5pc09rKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKworICAgICAgICAgICAgaWYgKCFpc1N0cmVhbUluZm9WYWxpZCkgeworICAgICAgICAgICAgICAgIGJvb2wgaXNEZXB0aENvbXBvc2l0ZVN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEzOjpEZXB0aENvbXBvc2l0ZVN0cmVhbTo6aXNEZXB0aENvbXBvc2l0ZVN0cmVhbShzdXJmYWNlKTsKKyAgICAgICAgICAgICAgICBib29sIGlzSGVpY0NvbXBvc2l0ZVN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEzOjpIZWljQ29tcG9zaXRlU3RyZWFtOjppc0hlaWNDb21wb3NpdGVTdHJlYW0oc3VyZmFjZSk7CisgICAgICAgICAgICAgICAgaWYgKGlzRGVwdGhDb21wb3NpdGVTdHJlYW0gfHwgaXNIZWljQ29tcG9zaXRlU3RyZWFtKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gdGFrZSBpbiB0byBhY2NvdW50IHRoYXQgY29tcG9zaXRlIHN0cmVhbXMgY2FuIGhhdmUKKyAgICAgICAgICAgICAgICAgICAgLy8gYWRkaXRpb25hbCBpbnRlcm5hbCBjYW1lcmEgc3RyZWFtcy4KKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8T3V0cHV0U3RyZWFtSW5mbz4gY29tcG9zaXRlU3RyZWFtczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzRGVwdGhDb21wb3NpdGVTdHJlYW0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGNhbWVyYTM6OkRlcHRoQ29tcG9zaXRlU3RyZWFtOjpnZXRDb21wb3NpdGVTdHJlYW1JbmZvKHN0cmVhbUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2UtPmluZm8oKSwgJmNvbXBvc2l0ZVN0cmVhbXMpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gY2FtZXJhMzo6SGVpY0NvbXBvc2l0ZVN0cmVhbTo6Z2V0Q29tcG9zaXRlU3RyZWFtSW5mbyhzdHJlYW1JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2UtPmluZm8oKSwgJmNvbXBvc2l0ZVN0cmVhbXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhICVzOiBGYWlsZWQgYWRkaW5nIGNvbXBvc2l0ZSBzdHJlYW1zOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBzdHJlcnJvcigtcmV0KSwgcmV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9zaXRlU3RyZWFtcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gaW50ZXJuYWwgc3RyZWFtcyBtZWFucyBjb21wb3NpdGUgc3RyZWFtIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgKnN0YXR1cyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXBvc2l0ZVN0cmVhbXMuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtQ291bnQgKz0gY29tcG9zaXRlU3RyZWFtcy5zaXplKCkgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShzdHJlYW1Db3VudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNvbXBvc2l0ZVN0cmVhbSA6IGNvbXBvc2l0ZVN0cmVhbXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcFN0cmVhbUluZm8oY29tcG9zaXRlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90PiAoaXQuZ2V0Um90YXRpb24oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQsICZzdHJlYW1Db25maWd1cmF0aW9uLnN0cmVhbXNbc3RyZWFtSWR4KytdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1hcFN0cmVhbUluZm8oc3RyZWFtSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90PiAoaXQuZ2V0Um90YXRpb24oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCwgJnN0cmVhbUNvbmZpZ3VyYXRpb24uc3RyZWFtc1tzdHJlYW1JZHgrK10pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpc1N0cmVhbUluZm9WYWxpZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqc3RhdHVzID0gZmFsc2U7CisgICAgcmV0ID0gbVByb3ZpZGVyTWFuYWdlci0+aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZChtQ2FtZXJhSWRTdHIuc3RyaW5nKCksCisgICAgICAgICAgICBzdHJlYW1Db25maWd1cmF0aW9uLCBzdGF0dXMpOworICAgIHN3aXRjaCAocmV0KSB7CisgICAgICAgIGNhc2UgT0s6CisgICAgICAgICAgICAvLyBFeHBlY3RlZCwgZG8gbm90aGluZy4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElOVkFMSURfT1BFUkFUSU9OOiB7CisgICAgICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhICVzOiBTZXNzaW9uIGNvbmZpZ3VyYXRpb24gcXVlcnkgbm90IHN1cHBvcnRlZCEiLAorICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBBTE9HRCgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCggIkNhbWVyYSAlczogRXJyb3I6ICVzICglZCkiLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmV0KSwgcmV0KTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gcmVzOwpAQCAtNTMyLDYgKzgwNSw3IEBACiAgICAgYm9vbCBpc0lucHV0ID0gZmFsc2U7CiAgICAgc3RkOjp2ZWN0b3I8c3A8SUJpbmRlcj4+IHN1cmZhY2VzOwogICAgIHNzaXplX3QgZEluZGV4ID0gTkFNRV9OT1RfRk9VTkQ7CisgICAgc3NpemVfdCBjb21wb3NpdGVJbmRleCAgPSBOQU1FX05PVF9GT1VORDsKIAogICAgIGlmIChtSW5wdXRTdHJlYW0uY29uZmlndXJlZCAmJiBtSW5wdXRTdHJlYW0uaWQgPT0gc3RyZWFtSWQpIHsKICAgICAgICAgaXNJbnB1dCA9IHRydWU7CkBAIC01NTEsNiArODI1LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db21wb3NpdGVTdHJlYW1NYXAuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChzdHJlYW1JZCA9PSBtQ29tcG9zaXRlU3RyZWFtTWFwLnZhbHVlQXQoaSktPmdldFN0cmVhbUlkKCkpIHsKKyAgICAgICAgICAgICAgICBjb21wb3NpdGVJbmRleCA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBpZiAoc3VyZmFjZXMuZW1wdHkoKSAmJiBkSW5kZXggPT0gTkFNRV9OT1RfRk9VTkQpIHsKICAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IEludmFsaWQgc3RyZWFtIElEICglZCkgc3BlY2lmaWVkLCBubyBzdWNoIgogICAgICAgICAgICAgICAgICAgICAiIHN0cmVhbSBjcmVhdGVkIHlldCIsIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgc3RyZWFtSWQpOwpAQCAtNTgwLDYgKzg2MSwxOSBAQAogICAgICAgICAgICAgaWYgKGRJbmRleCAhPSBOQU1FX05PVF9GT1VORCkgewogICAgICAgICAgICAgICAgIG1EZWZlcnJlZFN0cmVhbXMucmVtb3ZlSXRlbXNBdChkSW5kZXgpOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29tcG9zaXRlSW5kZXggIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCByZXQ7CisgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBtQ29tcG9zaXRlU3RyZWFtTWFwLnZhbHVlQXQoY29tcG9zaXRlSW5kZXgpLT5kZWxldGVTdHJlYW0oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IFVuZXhwZWN0ZWQgZXJyb3IgJXMgKCVkKSB3aGVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVsZXRpbmcgY29tcG9zaXRlIHN0cmVhbSAlZCIsIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgc3RyZXJyb3IoLWVyciksIGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNvbXBvc2l0ZVN0cmVhbU1hcC5yZW1vdmVJdGVtc0F0KGNvbXBvc2l0ZUluZGV4KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtNjAzLDQxICs4OTcsMjMgQEAKICAgICBib29sIGRlZmVycmVkQ29uc3VtZXIgPSBvdXRwdXRDb25maWd1cmF0aW9uLmlzRGVmZXJyZWQoKTsKICAgICBib29sIGlzU2hhcmVkID0gb3V0cHV0Q29uZmlndXJhdGlvbi5pc1NoYXJlZCgpOwogICAgIFN0cmluZzggcGh5c2ljYWxDYW1lcmFJZCA9IFN0cmluZzgob3V0cHV0Q29uZmlndXJhdGlvbi5nZXRQaHlzaWNhbENhbWVyYUlkKCkpOwotCi0gICAgaWYgKG51bUJ1ZmZlclByb2R1Y2VycyA+IE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNKSB7Ci0gICAgICAgIEFMT0dFKCIlczogR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGNvdW50ICV6dSBmb3Igc3RyZWFtIGV4Y2VlZHMgbGltaXQgb2YgJWQiLAotICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZmZlclByb2R1Y2Vycy5zaXplKCksIE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiU3VyZmFjZSBjb3VudCBpcyB0b28gaGlnaCIpOwotICAgIH0KICAgICBib29sIGRlZmVycmVkQ29uc3VtZXJPbmx5ID0gZGVmZXJyZWRDb25zdW1lciAmJiBudW1CdWZmZXJQcm9kdWNlcnMgPT0gMDsKLSAgICBpbnQgc3VyZmFjZVR5cGUgPSBvdXRwdXRDb25maWd1cmF0aW9uLmdldFN1cmZhY2VUeXBlKCk7Ci0gICAgYm9vbCB2YWxpZFN1cmZhY2VUeXBlID0gKChzdXJmYWNlVHlwZSA9PSBPdXRwdXRDb25maWd1cmF0aW9uOjpTVVJGQUNFX1RZUEVfU1VSRkFDRV9WSUVXKSB8fAotICAgICAgICAgICAgKHN1cmZhY2VUeXBlID09IE91dHB1dENvbmZpZ3VyYXRpb246OlNVUkZBQ0VfVFlQRV9TVVJGQUNFX1RFWFRVUkUpKTsKIAotICAgIGlmIChkZWZlcnJlZENvbnN1bWVyICYmICF2YWxpZFN1cmZhY2VUeXBlKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVGFyZ2V0IHN1cmZhY2UgaXMgaW52YWxpZDogYnVmZmVyUHJvZHVjZXIgPSAlcCwgc3VyZmFjZVR5cGUgPSAlZC4iLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmZmVyUHJvZHVjZXJzWzBdLmdldCgpLCBzdXJmYWNlVHlwZSk7Ci0gICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgIlRhcmdldCBTdXJmYWNlIGlzIGludmFsaWQiKTsKKyAgICByZXMgPSBjaGVja1N1cmZhY2VUeXBlTG9ja2VkKG51bUJ1ZmZlclByb2R1Y2VycywgZGVmZXJyZWRDb25zdW1lciwKKyAgICAgICAgICAgIG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0U3VyZmFjZVR5cGUoKSk7CisgICAgaWYgKCFyZXMuaXNPaygpKSB7CisgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCiAgICAgaWYgKCFtRGV2aWNlLmdldCgpKSB7CiAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVELCAiQ2FtZXJhIGRldmljZSBubyBsb25nZXIgYWxpdmUiKTsKICAgICB9CiAKLSAgICBpZiAocGh5c2ljYWxDYW1lcmFJZC5zaXplKCkgPiAwKSB7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkczsKLSAgICAgICAgc3RkOjpzdHJpbmcgcGh5c2ljYWxJZChwaHlzaWNhbENhbWVyYUlkLnN0cmluZygpKTsKLSAgICAgICAgYm9vbCBsb2dpY2FsQ2FtZXJhID0KLSAgICAgICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzTG9naWNhbENhbWVyYShtRGV2aWNlLT5pbmZvKCksICZwaHlzaWNhbENhbWVyYUlkcyk7Ci0gICAgICAgIGlmICghbG9naWNhbENhbWVyYSB8fAotICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChwaHlzaWNhbENhbWVyYUlkcy5iZWdpbigpLCBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSwgcGh5c2ljYWxJZCkgPT0KLSAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSkgewotICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogQ2FtZXJhIGRvZXNuJ3Qgc3VwcG9ydCBwaHlzaWNhbENhbWVyYUlkICVzLiIsCi0gICAgICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgcGh5c2ljYWxDYW1lcmFJZC5zdHJpbmcoKSk7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOwotICAgICAgICB9CisgICAgcmVzID0gY2hlY2tQaHlzaWNhbENhbWVyYUlkTG9ja2VkKHBoeXNpY2FsQ2FtZXJhSWQpOworICAgIGlmICghcmVzLmlzT2soKSkgeworICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KKwogICAgIHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiBzdXJmYWNlczsKICAgICBzdGQ6OnZlY3RvcjxzcDxJQmluZGVyPj4gYmluZGVyczsKICAgICBzdGF0dXNfdCBlcnI7CkBAIC02NjEsNyArOTM3LDggQEAKICAgICAgICAgfQogCiAgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2U7Ci0gICAgICAgIHJlcyA9IGNyZWF0ZVN1cmZhY2VGcm9tR2JwKHN0cmVhbUluZm8sIGlzU3RyZWFtSW5mb1ZhbGlkLCBzdXJmYWNlLCBidWZmZXJQcm9kdWNlcik7CisgICAgICAgIHJlcyA9IGNyZWF0ZVN1cmZhY2VGcm9tR2JwKHN0cmVhbUluZm8sIGlzU3RyZWFtSW5mb1ZhbGlkLCBzdXJmYWNlLCBidWZmZXJQcm9kdWNlciwKKyAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkKTsKIAogICAgICAgICBpZiAoIXJlcy5pc09rKCkpCiAgICAgICAgICAgICByZXR1cm4gcmVzOwpAQCAtNjc2LDExICs5NTMsMzIgQEAKIAogICAgIGludCBzdHJlYW1JZCA9IGNhbWVyYTM6OkNBTUVSQTNfU1RSRUFNX0lEX0lOVkFMSUQ7CiAgICAgc3RkOjp2ZWN0b3I8aW50PiBzdXJmYWNlSWRzOwotICAgIGVyciA9IG1EZXZpY2UtPmNyZWF0ZVN0cmVhbShzdXJmYWNlcywgZGVmZXJyZWRDb25zdW1lciwgc3RyZWFtSW5mby53aWR0aCwKLSAgICAgICAgICAgIHN0cmVhbUluZm8uaGVpZ2h0LCBzdHJlYW1JbmZvLmZvcm1hdCwgc3RyZWFtSW5mby5kYXRhU3BhY2UsCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90PihvdXRwdXRDb25maWd1cmF0aW9uLmdldFJvdGF0aW9uKCkpLAotICAgICAgICAgICAgJnN0cmVhbUlkLCBwaHlzaWNhbENhbWVyYUlkLCAmc3VyZmFjZUlkcywgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTdXJmYWNlU2V0SUQoKSwKLSAgICAgICAgICAgIGlzU2hhcmVkKTsKKyAgICBib29sIGlzRGVwdGhDb21wb3NpdGVTdHJlYW0gPSBjYW1lcmEzOjpEZXB0aENvbXBvc2l0ZVN0cmVhbTo6aXNEZXB0aENvbXBvc2l0ZVN0cmVhbShzdXJmYWNlc1swXSk7CisgICAgYm9vbCBpc0hlaWNDb21waXNpdGVTdHJlYW0gPSBjYW1lcmEzOjpIZWljQ29tcG9zaXRlU3RyZWFtOjppc0hlaWNDb21wb3NpdGVTdHJlYW0oc3VyZmFjZXNbMF0pOworICAgIGlmIChpc0RlcHRoQ29tcG9zaXRlU3RyZWFtIHx8IGlzSGVpY0NvbXBpc2l0ZVN0cmVhbSkgeworICAgICAgICBzcDxDb21wb3NpdGVTdHJlYW0+IGNvbXBvc2l0ZVN0cmVhbTsKKyAgICAgICAgaWYgKGlzRGVwdGhDb21wb3NpdGVTdHJlYW0pIHsKKyAgICAgICAgICAgIGNvbXBvc2l0ZVN0cmVhbSA9IG5ldyBjYW1lcmEzOjpEZXB0aENvbXBvc2l0ZVN0cmVhbShtRGV2aWNlLCBnZXRSZW1vdGVDYWxsYmFjaygpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbXBvc2l0ZVN0cmVhbSA9IG5ldyBjYW1lcmEzOjpIZWljQ29tcG9zaXRlU3RyZWFtKG1EZXZpY2UsIGdldFJlbW90ZUNhbGxiYWNrKCkpOworICAgICAgICB9CisKKyAgICAgICAgZXJyID0gY29tcG9zaXRlU3RyZWFtLT5jcmVhdGVTdHJlYW0oc3VyZmFjZXMsIGRlZmVycmVkQ29uc3VtZXIsIHN0cmVhbUluZm8ud2lkdGgsCisgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5oZWlnaHQsIHN0cmVhbUluZm8uZm9ybWF0LAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Q+KG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0Um90YXRpb24oKSksCisgICAgICAgICAgICAgICAgJnN0cmVhbUlkLCBwaHlzaWNhbENhbWVyYUlkLCAmc3VyZmFjZUlkcywgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRTdXJmYWNlU2V0SUQoKSwKKyAgICAgICAgICAgICAgICBpc1NoYXJlZCk7CisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIG1Db21wb3NpdGVTdHJlYW1NYXAuYWRkKElJbnRlcmZhY2U6OmFzQmluZGVyKHN1cmZhY2VzWzBdLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkpLAorICAgICAgICAgICAgICAgICAgICBjb21wb3NpdGVTdHJlYW0pOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyID0gbURldmljZS0+Y3JlYXRlU3RyZWFtKHN1cmZhY2VzLCBkZWZlcnJlZENvbnN1bWVyLCBzdHJlYW1JbmZvLndpZHRoLAorICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uaGVpZ2h0LCBzdHJlYW1JbmZvLmZvcm1hdCwgc3RyZWFtSW5mby5kYXRhU3BhY2UsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2FtZXJhM19zdHJlYW1fcm90YXRpb25fdD4ob3V0cHV0Q29uZmlndXJhdGlvbi5nZXRSb3RhdGlvbigpKSwKKyAgICAgICAgICAgICAgICAmc3RyZWFtSWQsIHBoeXNpY2FsQ2FtZXJhSWQsICZzdXJmYWNlSWRzLCBvdXRwdXRDb25maWd1cmF0aW9uLmdldFN1cmZhY2VTZXRJRCgpLAorICAgICAgICAgICAgICAgIGlzU2hhcmVkKTsKKyAgICB9CiAKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUl9GTVQoQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04sCkBAIC04ODksNiArMTE4Nyw4IEBACiAKICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiA+JiBidWZmZXJQcm9kdWNlcnMgPQogICAgICAgICAgICAgb3V0cHV0Q29uZmlndXJhdGlvbi5nZXRHcmFwaGljQnVmZmVyUHJvZHVjZXJzKCk7CisgICAgU3RyaW5nOCBwaHlzaWNhbENhbWVyYUlkKG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0UGh5c2ljYWxDYW1lcmFJZCgpKTsKKwogICAgIGF1dG8gcHJvZHVjZXJDb3VudCA9IGJ1ZmZlclByb2R1Y2Vycy5zaXplKCk7CiAgICAgaWYgKHByb2R1Y2VyQ291bnQgPT0gMCkgewogICAgICAgICBBTE9HRSgiJXM6IGJ1ZmZlclByb2R1Y2VycyBtdXN0IG5vdCBiZSBlbXB0eSIsIF9fRlVOQ1RJT05fXyk7CkBAIC05NDIsNyArMTI0Miw3IEBACiAgICAgICAgIE91dHB1dFN0cmVhbUluZm8gb3V0SW5mbzsKICAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZTsKICAgICAgICAgcmVzID0gY3JlYXRlU3VyZmFjZUZyb21HYnAob3V0SW5mbywgLyppc1N0cmVhbUluZm9WYWxpZCovIGZhbHNlLCBzdXJmYWNlLAotICAgICAgICAgICAgICAgIG5ld091dHB1dHNNYXAudmFsdWVBdChpKSk7CisgICAgICAgICAgICAgICAgbmV3T3V0cHV0c01hcC52YWx1ZUF0KGkpLCBwaHlzaWNhbENhbWVyYUlkKTsKICAgICAgICAgaWYgKCFyZXMuaXNPaygpKQogICAgICAgICAgICAgcmV0dXJuIHJlczsKIApAQCAtMTAyMSw3ICsxMzIxLDggQEAKIAogYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50OjpjcmVhdGVTdXJmYWNlRnJvbUdicCgKICAgICAgICAgT3V0cHV0U3RyZWFtSW5mbyYgc3RyZWFtSW5mbywgYm9vbCBpc1N0cmVhbUluZm9WYWxpZCwKLSAgICAgICAgc3A8U3VyZmFjZT4mIHN1cmZhY2UsIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnApIHsKKyAgICAgICAgc3A8U3VyZmFjZT4mIHN1cmZhY2UsIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBnYnAsCisgICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsSWQpIHsKIAogICAgIC8vIGJ1ZmZlclByb2R1Y2VyIG11c3QgYmUgbm9uLW51bGwKICAgICBpZiAoZ2JwID09IG51bGxwdHIpIHsKQEAgLTEwOTgsNyArMTM5OSw3IEBACiAgICAgLy8gUm91bmQgZGltZW5zaW9ucyB0byB0aGUgbmVhcmVzdCBkaW1lbnNpb25zIGF2YWlsYWJsZSBmb3IgdGhpcyBmb3JtYXQKICAgICBpZiAoZmxleGlibGVDb25zdW1lciAmJiBpc1B1YmxpY0Zvcm1hdChmb3JtYXQpICYmCiAgICAgICAgICAgICAhQ2FtZXJhRGV2aWNlQ2xpZW50Ojpyb3VuZEJ1ZmZlckRpbWVuc2lvbk5lYXJlc3Qod2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgIGZvcm1hdCwgZGF0YVNwYWNlLCBtRGV2aWNlLT5pbmZvKCksIC8qb3V0Ki8md2lkdGgsIC8qb3V0Ki8maGVpZ2h0KSkgeworICAgICAgICAgICAgZm9ybWF0LCBkYXRhU3BhY2UsIG1EZXZpY2UtPmluZm8ocGh5c2ljYWxJZCksIC8qb3V0Ki8md2lkdGgsIC8qb3V0Ki8maGVpZ2h0KSkgewogICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBObyBzdXBwb3J0ZWQgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIHdpdGggIgogICAgICAgICAgICAgICAgICJmb3JtYXQgJSN4IGRlZmluZWQsIGZhaWxlZCB0byBjcmVhdGUgb3V0cHV0IHN0cmVhbSIsCiAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBmb3JtYXQpOwpAQCAtMTE1OSw2ICsxNDYwLDggQEAKICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgc3RyZWFtQ29uZmlncyA9CiAgICAgICAgICAgICAoZGF0YVNwYWNlID09IEhBTF9EQVRBU1BBQ0VfREVQVEgpID8KICAgICAgICAgICAgIGluZm8uZmluZChBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlMpIDoKKyAgICAgICAgICAgIChkYXRhU3BhY2UgPT0gc3RhdGljX2Nhc3Q8YW5kcm9pZF9kYXRhc3BhY2U+KEhBTF9EQVRBU1BBQ0VfSEVJRikpID8KKyAgICAgICAgICAgIGluZm8uZmluZChBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TKSA6CiAgICAgICAgICAgICBpbmZvLmZpbmQoQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUyk7CiAKICAgICBpbnQzMl90IGJlc3RXaWR0aCA9IC0xOwpAQCAtMTQ2OCw2ICsxNzcxLDcgQEAKIAogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+ID4mIGJ1ZmZlclByb2R1Y2VycyA9CiAgICAgICAgICAgICBvdXRwdXRDb25maWd1cmF0aW9uLmdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcnMoKTsKKyAgICBTdHJpbmc4IHBoeXNpY2FsSWQob3V0cHV0Q29uZmlndXJhdGlvbi5nZXRQaHlzaWNhbENhbWVyYUlkKCkpOwogCiAgICAgaWYgKGJ1ZmZlclByb2R1Y2Vycy5zaXplKCkgPT0gMCkgewogICAgICAgICBBTE9HRSgiJXM6IGJ1ZmZlclByb2R1Y2VycyBtdXN0IG5vdCBiZSBlbXB0eSIsIF9fRlVOQ1RJT05fXyk7CkBAIC0xNTIxLDcgKzE4MjUsNyBAQAogCiAgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2U7CiAgICAgICAgIHJlcyA9IGNyZWF0ZVN1cmZhY2VGcm9tR2JwKG1TdHJlYW1JbmZvTWFwW3N0cmVhbUlkXSwgdHJ1ZSAvKmlzU3RyZWFtSW5mb1ZhbGlkKi8sCi0gICAgICAgICAgICAgICAgc3VyZmFjZSwgYnVmZmVyUHJvZHVjZXIpOworICAgICAgICAgICAgICAgIHN1cmZhY2UsIGJ1ZmZlclByb2R1Y2VyLCBwaHlzaWNhbElkKTsKIAogICAgICAgICBpZiAoIXJlcy5pc09rKCkpCiAgICAgICAgICAgICByZXR1cm4gcmVzOwpAQCAtMTYxMCw3ICsxOTE0LDE0IEBACiAgICAgLy8gVGhyZWFkIHNhZmUuIERvbid0IGJvdGhlciBsb2NraW5nLgogICAgIHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiByZW1vdGVDYiA9IGdldFJlbW90ZUNhbGxiYWNrKCk7CiAKLSAgICBpZiAocmVtb3RlQ2IgIT0gMCkgeworICAgIC8vIENvbXBvc2l0ZXMgY2FuIGhhdmUgbXVsdGlwbGUgaW50ZXJuYWwgc3RyZWFtcy4gRXJyb3Igbm90aWZpY2F0aW9ucyBjb21pbmcgZnJvbSBzdWNoIGludGVybmFsCisgICAgLy8gc3RyZWFtcyBtYXkgbmVlZCB0byByZW1haW4gd2l0aGluIGNhbWVyYSBzZXJ2aWNlLgorICAgIGJvb2wgc2tpcENsaWVudE5vdGlmaWNhdGlvbiA9IGZhbHNlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvbXBvc2l0ZVN0cmVhbU1hcC5zaXplKCk7IGkrKykgeworICAgICAgICBza2lwQ2xpZW50Tm90aWZpY2F0aW9uIHw9IG1Db21wb3NpdGVTdHJlYW1NYXAudmFsdWVBdChpKS0+b25FcnJvcihlcnJvckNvZGUsIHJlc3VsdEV4dHJhcyk7CisgICAgfQorCisgICAgaWYgKChyZW1vdGVDYiAhPSAwKSAmJiAoIXNraXBDbGllbnROb3RpZmljYXRpb24pKSB7CiAgICAgICAgIHJlbW90ZUNiLT5vbkRldmljZUVycm9yKGVycm9yQ29kZSwgcmVzdWx0RXh0cmFzKTsKICAgICB9CiB9CkBAIC0xNjQ0LDYgKzE5NTUsMTAgQEAKICAgICAgICAgcmVtb3RlQ2ItPm9uQ2FwdHVyZVN0YXJ0ZWQocmVzdWx0RXh0cmFzLCB0aW1lc3RhbXApOwogICAgIH0KICAgICBDYW1lcmEyQ2xpZW50QmFzZTo6bm90aWZ5U2h1dHRlcihyZXN1bHRFeHRyYXMsIHRpbWVzdGFtcCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db21wb3NpdGVTdHJlYW1NYXAuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUNvbXBvc2l0ZVN0cmVhbU1hcC52YWx1ZUF0KGkpLT5vblNodXR0ZXIocmVzdWx0RXh0cmFzLCB0aW1lc3RhbXApOworICAgIH0KIH0KIAogdm9pZCBDYW1lcmFEZXZpY2VDbGllbnQ6Om5vdGlmeVByZXBhcmVkKGludCBzdHJlYW1JZCkgewpAQCAtMTY3Nyw5ICsxOTkyLDEyIEBACiAKICAgICAvLyBXT1JLQVJPVU5EOiBIQUwgcmVmdXNlcyB0byBkaXNjb25uZWN0IHdoaWxlIHRoZXJlJ3Mgc3RyZWFtcyBpbiBmbGlnaHQKICAgICB7Ci0gICAgICAgIG1EZXZpY2UtPmNsZWFyU3RyZWFtaW5nUmVxdWVzdCgpOwotCisgICAgICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyOwogICAgICAgICBzdGF0dXNfdCBjb2RlOworICAgICAgICBpZiAoKGNvZGUgPSBtRGV2aWNlLT5mbHVzaCgmbGFzdEZyYW1lTnVtYmVyKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogZmx1c2ggZmFpbGVkIHdpdGggY29kZSAweCV4IiwgX19GVU5DVElPTl9fLCBjb2RlKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmICgoY29kZSA9IG1EZXZpY2UtPndhaXRVbnRpbERyYWluZWQoKSkgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogd2FpdFVudGlsRHJhaW5lZCBmYWlsZWQgd2l0aCBjb2RlIDB4JXgiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgICBjb2RlKTsKQEAgLTE3MDAsNiArMjAxOCwxMCBAQAogICAgICAgICByZW1vdGVDYi0+b25SZXN1bHRSZWNlaXZlZChyZXN1bHQubU1ldGFkYXRhLCByZXN1bHQubVJlc3VsdEV4dHJhcywKICAgICAgICAgICAgICAgICByZXN1bHQubVBoeXNpY2FsTWV0YWRhdGFzKTsKICAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db21wb3NpdGVTdHJlYW1NYXAuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbUNvbXBvc2l0ZVN0cmVhbU1hcC52YWx1ZUF0KGkpLT5vblJlc3VsdEF2YWlsYWJsZShyZXN1bHQpOworICAgIH0KIH0KIAogYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50OjpjaGVja1BpZFN0YXR1cyhjb25zdCBjaGFyKiBjaGVja0xvY2F0aW9uKSB7CkBAIC0xNzE2LDcgKzIwMzgsNyBAQAogLy8gVE9ETzogbW92ZSB0byBDYW1lcmEyQ2xpZW50QmFzZQogYm9vbCBDYW1lcmFEZXZpY2VDbGllbnQ6OmVuZm9yY2VSZXF1ZXN0UGVybWlzc2lvbnMoQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhKSB7CiAKLSAgICBjb25zdCBpbnQgcGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIGNvbnN0IGludCBwaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGNvbnN0IGludCBzZWxmUGlkID0gZ2V0cGlkKCk7CiAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnk7CiAKQEAgLTE3NTUsNyArMjA3Nyw3IEBACiAgICAgICAgIFN0cmluZzE2IHBlcm1pc3Npb25TdHJpbmcgPQogICAgICAgICAgICAgU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkFfRElTQUJMRV9UUkFOU01JVF9MRUQiKTsKICAgICAgICAgaWYgKCFjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHBlcm1pc3Npb25TdHJpbmcpKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQgdWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgICAgICAgICAgY29uc3QgaW50IHVpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CiAgICAgICAgICAgICBBTE9HRSgiUGVybWlzc2lvbiBEZW5pYWw6ICIKICAgICAgICAgICAgICAgICAgICJjYW4ndCBkaXNhYmxlIHRyYW5zbWl0IExFRCBwaWQ9JWQsIHVpZD0lZCIsIHBpZCwgdWlkKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCmluZGV4IDVhYWY1YWEuLjFjNWFiYjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaApAQCAtMjAsMTMgKzIwLDE2IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0JuQ2FtZXJhRGV2aWNlVXNlci5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvU3VibWl0SW5mby5oPgogCiAjaW5jbHVkZSAiQ2FtZXJhU2VydmljZS5oIgogI2luY2x1ZGUgImNvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuaCIKICNpbmNsdWRlICJjb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaCIKKyNpbmNsdWRlICJDb21wb3NpdGVTdHJlYW0uaCIKIAogdXNpbmcgYW5kcm9pZDo6Y2FtZXJhMzo6T3V0cHV0U3RyZWFtSW5mbzsKK3VzaW5nIGFuZHJvaWQ6OmNhbWVyYTM6OkNvbXBvc2l0ZVN0cmVhbTsKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC04OSw2ICs5MiwxMiBAQAogICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgZW5kQ29uZmlndXJlKGludCBvcGVyYXRpbmdNb2RlLAogICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTI6OmltcGw6OkNhbWVyYU1ldGFkYXRhTmF0aXZlJiBzZXNzaW9uUGFyYW1zKSBvdmVycmlkZTsKIAorICAgIC8vIFZlcmlmeSBzcGVjaWZpYyBzZXNzaW9uIGNvbmZpZ3VyYXRpb24uCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBpc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAorICAgICAgICAgICAgY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24mIHNlc3Npb25Db25maWd1cmF0aW9uLAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgYm9vbCogc3RyZWFtU3RhdHVzKSBvdmVycmlkZTsKKwogICAgIC8vIFJldHVybnMgLUVCVVNZIGlmIGRldmljZSBpcyBub3QgaWRsZSBvciBpbiBlcnJvciBzdGF0ZQogICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgZGVsZXRlU3RyZWFtKGludCBzdHJlYW1JZCkgb3ZlcnJpZGU7CiAKQEAgLTIzMCw2ICsyMzksMTMgQEAKIAogICAgIC8qKiBVdGlsaXR5IG1lbWJlcnMgKi8KICAgICBiaW5kZXI6OlN0YXR1cyBjaGVja1BpZFN0YXR1cyhjb25zdCBjaGFyKiBjaGVja0xvY2F0aW9uKTsKKyAgICBiaW5kZXI6OlN0YXR1cyBjaGVja09wZXJhdGluZ01vZGVMb2NrZWQoaW50IG9wZXJhdGluZ01vZGUpIGNvbnN0OworICAgIGJpbmRlcjo6U3RhdHVzIGNoZWNrUGh5c2ljYWxDYW1lcmFJZExvY2tlZChTdHJpbmc4IHBoeXNpY2FsQ2FtZXJhSWQpOworICAgIGJpbmRlcjo6U3RhdHVzIGNoZWNrU3VyZmFjZVR5cGVMb2NrZWQoc2l6ZV90IG51bUJ1ZmZlclByb2R1Y2VycywgYm9vbCBkZWZlcnJlZENvbnN1bWVyLAorICAgICAgICAgICAgaW50IHN1cmZhY2VUeXBlKSBjb25zdDsKKyAgICBzdGF0aWMgdm9pZCBtYXBTdHJlYW1JbmZvKGNvbnN0IE91dHB1dFN0cmVhbUluZm8gJnN0cmVhbUluZm8sCisgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBTdHJpbmc4IHBoeXNpY2FsSWQsCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbSAqc3RyZWFtIC8qb3V0Ki8pOwogICAgIGJvb2wgZW5mb3JjZVJlcXVlc3RQZXJtaXNzaW9ucyhDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEpOwogCiAgICAgLy8gRmluZCB0aGUgc3F1YXJlIG9mIHRoZSBldWNsaWRlYW4gZGlzdGFuY2UgYmV0d2VlbiB0d28gcG9pbnRzCkBAIC0yNTgsNyArMjc0LDggQEAKICAgICAvLyBDcmVhdGUgYSBTdXJmYWNlIGZyb20gYW4gSUdyYXBoaWNCdWZmZXJQcm9kdWNlci4gUmV0dXJucyBlcnJvciBpZgogICAgIC8vIElHcmFwaGljQnVmZmVyUHJvZHVjZXIncyBwcm9wZXJ0eSBkb2Vzbid0IG1hdGNoIHdpdGggc3RyZWFtSW5mbwogICAgIGJpbmRlcjo6U3RhdHVzIGNyZWF0ZVN1cmZhY2VGcm9tR2JwKE91dHB1dFN0cmVhbUluZm8mIHN0cmVhbUluZm8sIGJvb2wgaXNTdHJlYW1JbmZvVmFsaWQsCi0gICAgICAgICAgICBzcDxTdXJmYWNlPiYgc3VyZmFjZSwgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGdicCk7CisgICAgICAgICAgICBzcDxTdXJmYWNlPiYgc3VyZmFjZSwgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGdicCwKKyAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQpOwogCiAKICAgICAvLyBVdGlsaXR5IG1ldGhvZCB0byBpbnNlcnQgdGhlIHN1cmZhY2UgaW50byBTdXJmYWNlTWFwCkBAIC0yOTksNyArMzE2LDEwIEBACiAgICAgLy8gc3RyZWFtIElEIC0+IG91dHB1dFN0cmVhbUluZm8gbWFwcGluZwogICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQzMl90LCBPdXRwdXRTdHJlYW1JbmZvPiBtU3RyZWFtSW5mb01hcDsKIAotICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNID0gMjsKKyAgICBLZXllZFZlY3RvcjxzcDxJQmluZGVyPiwgc3A8Q29tcG9zaXRlU3RyZWFtPj4gbUNvbXBvc2l0ZVN0cmVhbU1hcDsKKworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNID0gNDsKKyAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI+IG1Qcm92aWRlck1hbmFnZXI7CiB9OwogCiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9Db21wb3NpdGVTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9Db21wb3NpdGVTdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NGVhZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NvbXBvc2l0ZVN0cmVhbS5jcHAKQEAgLTAsMCArMSwyMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYTMtQ29tcG9zaXRlU3RyZWFtIgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorCisjaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKKyNpbmNsdWRlICJDYW1lcmFEZXZpY2VDbGllbnQuaCIKKyNpbmNsdWRlICJDb21wb3NpdGVTdHJlYW0uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworCitDb21wb3NpdGVTdHJlYW06OkNvbXBvc2l0ZVN0cmVhbSh3cDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UsCisgICAgICAgIHdwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBjYikgOgorICAgICAgICBtRGV2aWNlKGRldmljZSksCisgICAgICAgIG1SZW1vdGVDYWxsYmFjayhjYiksCisgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cygxKSwKKyAgICAgICAgbUVycm9yU3RhdGUoZmFsc2UpIHsKKyAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBjYW1lcmFEZXZpY2UgPSBkZXZpY2UucHJvbW90ZSgpOworICAgIGlmIChjYW1lcmFEZXZpY2UuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBDYW1lcmFNZXRhZGF0YSBzdGF0aWNJbmZvID0gY2FtZXJhRGV2aWNlLT5pbmZvKCk7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9QQVJUSUFMX1JFU1VMVF9DT1VOVCk7CisgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0cyA9IGVudHJ5LmRhdGEuaTMyWzBdOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBDb21wb3NpdGVTdHJlYW06OmNyZWF0ZVN0cmVhbShjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycywKKyAgICAgICAgYm9vbCBoYXNEZWZlcnJlZENvbnN1bWVyLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAorICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKiBpZCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqIHN1cmZhY2VJZHMsIGludCBzdHJlYW1TZXRJZCwgYm9vbCBpc1NoYXJlZCkgeworICAgIGlmIChoYXNEZWZlcnJlZENvbnN1bWVyKSB7CisgICAgICAgIEFMT0dFKCIlczogRGVmZXJyZWQgY29uc3VtZXJzIG5vdCBzdXBwb3J0ZWQgaW4gY2FzZSBvZiBjb21wb3NpdGUgc3RyZWFtcyEiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKHN0cmVhbVNldElkICE9IGNhbWVyYTM6OkNBTUVSQTNfU1RSRUFNX0lEX0lOVkFMSUQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdXJmYWNlIGdyb3VwcyBub3Qgc3VwcG9ydGVkIGluIGNhc2Ugb2YgY29tcG9zaXRlIHN0cmVhbXMhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChpc1NoYXJlZCkgeworICAgICAgICBBTE9HRSgiJXM6IFNoYXJlZCBzdXJmYWNlcyBub3Qgc3VwcG9ydGVkIGluIGNhc2Ugb2YgY29tcG9zaXRlIHN0cmVhbXMhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHJldHVybiBjcmVhdGVJbnRlcm5hbFN0cmVhbXMoY29uc3VtZXJzLCBoYXNEZWZlcnJlZENvbnN1bWVyLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHJvdGF0aW9uLCBpZCwKKyAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQsIHN1cmZhY2VJZHMsIHN0cmVhbVNldElkLCBpc1NoYXJlZCk7Cit9CisKK3N0YXR1c190IENvbXBvc2l0ZVN0cmVhbTo6ZGVsZXRlU3RyZWFtKCkgeworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKyAgICAgICAgbVBlbmRpbmdDYXB0dXJlUmVzdWx0cy5jbGVhcigpOworICAgICAgICBtQ2FwdHVyZVJlc3VsdHMuY2xlYXIoKTsKKyAgICAgICAgbUZyYW1lTnVtYmVyTWFwLmNsZWFyKCk7CisgICAgICAgIG1FcnJvckZyYW1lTnVtYmVycy5jbGVhcigpOworICAgIH0KKworICAgIHJldHVybiBkZWxldGVJbnRlcm5hbFN0cmVhbXMoKTsKK30KKwordm9pZCBDb21wb3NpdGVTdHJlYW06Om9uQnVmZmVyUmVxdWVzdEZvckZyYW1lTnVtYmVyKHVpbnQ2NF90IGZyYW1lTnVtYmVyLCBpbnQgc3RyZWFtSWQsCisgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiAvKnNldHRpbmdzKi8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgIGlmICghbUVycm9yU3RhdGUgJiYgKHN0cmVhbUlkID09IGdldFN0cmVhbUlkKCkpKSB7CisgICAgICAgIG1QZW5kaW5nQ2FwdHVyZVJlc3VsdHMuZW1wbGFjZShmcmFtZU51bWJlciwgQ2FtZXJhTWV0YWRhdGEoKSk7CisgICAgfQorfQorCit2b2lkIENvbXBvc2l0ZVN0cmVhbTo6b25CdWZmZXJSZWxlYXNlZChjb25zdCBCdWZmZXJJbmZvJiBidWZmZXJJbmZvKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKyAgICBpZiAoIW1FcnJvclN0YXRlICYmICFidWZmZXJJbmZvLm1FcnJvcikgeworICAgICAgICBtRnJhbWVOdW1iZXJNYXAuZW1wbGFjZShidWZmZXJJbmZvLm1GcmFtZU51bWJlciwgYnVmZmVySW5mby5tVGltZXN0YW1wKTsKKyAgICAgICAgbUlucHV0UmVhZHlDb25kaXRpb24uc2lnbmFsKCk7CisgICAgfQorfQorCit2b2lkIENvbXBvc2l0ZVN0cmVhbTo6ZXJhc2VSZXN1bHQoaW50NjRfdCBmcmFtZU51bWJlcikgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisKKyAgICBhdXRvIGl0ID0gbVBlbmRpbmdDYXB0dXJlUmVzdWx0cy5maW5kKGZyYW1lTnVtYmVyKTsKKyAgICBpZiAoaXQgPT0gbVBlbmRpbmdDYXB0dXJlUmVzdWx0cy5lbmQoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaXQgPSBtUGVuZGluZ0NhcHR1cmVSZXN1bHRzLmVyYXNlKGl0KTsKK30KKwordm9pZCBDb21wb3NpdGVTdHJlYW06Om9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQmIHJlc3VsdCkgeworICAgIGJvb2wgcmVzdWx0RXJyb3IgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisKKyAgICAgICAgdWludDY0X3QgZnJhbWVOdW1iZXIgPSByZXN1bHQubVJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcjsKKyAgICAgICAgYm9vbCByZXN1bHRSZWFkeSA9IGZhbHNlOworICAgICAgICBhdXRvIGl0ID0gbVBlbmRpbmdDYXB0dXJlUmVzdWx0cy5maW5kKGZyYW1lTnVtYmVyKTsKKyAgICAgICAgaWYgKGl0ICE9IG1QZW5kaW5nQ2FwdHVyZVJlc3VsdHMuZW5kKCkpIHsKKyAgICAgICAgICAgIGl0LT5zZWNvbmQuYXBwZW5kKHJlc3VsdC5tTWV0YWRhdGEpOworICAgICAgICAgICAgaWYgKHJlc3VsdC5tUmVzdWx0RXh0cmFzLnBhcnRpYWxSZXN1bHRDb3VudCA+PSBtTnVtUGFydGlhbFJlc3VsdHMpIHsKKyAgICAgICAgICAgICAgICBhdXRvIGVudHJ5ID0gaXQtPnNlY29uZC5maW5kKEFORFJPSURfU0VOU09SX1RJTUVTVEFNUCk7CisgICAgICAgICAgICAgICAgaWYgKGVudHJ5LmNvdW50ID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byB0cyA9IGVudHJ5LmRhdGEuaTY0WzBdOworICAgICAgICAgICAgICAgICAgICBtQ2FwdHVyZVJlc3VsdHMuZW1wbGFjZSh0cywgc3RkOjptYWtlX3R1cGxlKGZyYW1lTnVtYmVyLCBpdC0+c2Vjb25kKSk7CisgICAgICAgICAgICAgICAgICAgIHJlc3VsdFJlYWR5ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFRpbWVzdGFtcCBtZXRhZGF0YSBlbnRyeSBtaXNzaW5nIGZvciBmcmFtZU51bWJlcjogJSIgUFJJdTY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1QZW5kaW5nQ2FwdHVyZVJlc3VsdHMuZXJhc2UoaXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlc3VsdFJlYWR5KSB7CisgICAgICAgICAgICBtSW5wdXRSZWFkeUNvbmRpdGlvbi5zaWduYWwoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyZXN1bHRFcnJvcikgeworICAgICAgICBvblJlc3VsdEVycm9yKHJlc3VsdC5tUmVzdWx0RXh0cmFzKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29tcG9zaXRlU3RyZWFtOjpmbGFnQW5FcnJvckZyYW1lTnVtYmVyKGludDY0X3QgZnJhbWVOdW1iZXIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgIG1FcnJvckZyYW1lTnVtYmVycy5lbXBsYWNlKGZyYW1lTnVtYmVyKTsKKyAgICBtSW5wdXRSZWFkeUNvbmRpdGlvbi5zaWduYWwoKTsKK30KKworc3RhdHVzX3QgQ29tcG9zaXRlU3RyZWFtOjpyZWdpc3RlckNvbXBvc2l0ZVN0cmVhbUxpc3RlbmVyKGludDMyX3Qgc3RyZWFtSWQpIHsKKyAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UgPSBtRGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoZGV2aWNlLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgYXV0byByZXQgPSBkZXZpY2UtPmFkZEJ1ZmZlckxpc3RlbmVyRm9yU3RyZWFtKHN0cmVhbUlkLCB0aGlzKTsKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlZ2lzdGVyIGNvbXBvc2l0ZSBzdHJlYW0gbGlzdGVuZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitib29sIENvbXBvc2l0ZVN0cmVhbTo6b25FcnJvcihpbnQzMl90IGVycm9yQ29kZSwgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CisgICAgYXV0byByZXQgPSBmYWxzZTsKKyAgICBzd2l0Y2ggKGVycm9yQ29kZSkgeworICAgICAgICBjYXNlIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVTVUxUOgorICAgICAgICAgICAgb25SZXN1bHRFcnJvcihyZXN1bHRFeHRyYXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9CVUZGRVI6CisgICAgICAgICAgICByZXQgPSBvblN0cmVhbUJ1ZmZlckVycm9yKHJlc3VsdEV4dHJhcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFUVVFU1Q6CisgICAgICAgICAgICAvLyBJbnZhbGlkIHJlcXVlc3QsIHRoaXMgc2hvdWxkbid0IGFmZmVjdCBjb21wb3NpdGUgc3RyZWFtcy4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOiBVbnJlY292ZXJhYmxlIGVycm9yOiAlZCBkZXRlY3RlZCEiLCBfX0ZVTkNUSU9OX18sIGVycm9yQ29kZSk7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgICAgICAgICAgbUVycm9yU3RhdGUgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBDb21wb3NpdGVTdHJlYW06Om5vdGlmeUVycm9yKGludDY0X3QgZnJhbWVOdW1iZXIpIHsKKyAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gcmVtb3RlQ2IgPQorICAgICAgICBtUmVtb3RlQ2FsbGJhY2sucHJvbW90ZSgpOworCisgICAgaWYgKChmcmFtZU51bWJlciA+PSAwKSAmJiAocmVtb3RlQ2IuZ2V0KCkgIT0gbnVsbHB0cikpIHsKKyAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyBleHRyYXM7CisgICAgICAgIGV4dHJhcy5lcnJvclN0cmVhbUlkID0gZ2V0U3RyZWFtSWQoKTsKKyAgICAgICAgZXh0cmFzLmZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CisgICAgICAgIHJlbW90ZUNiLT5vbkRldmljZUVycm9yKAorICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfQlVGRkVSLAorICAgICAgICAgICAgICAgIGV4dHJhcyk7CisgICAgfQorfQorCit9OyAvLyBuYW1lc3BhY2UgY2FtZXJhMworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ29tcG9zaXRlU3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NvbXBvc2l0ZVN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0MDFhODIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NvbXBvc2l0ZVN0cmVhbS5oCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQTNfQ09NUE9TSVRFX1NUUkVBTV9ICisjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBM19DT01QT1NJVEVfU1RSRUFNX0gKKworI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmg+CisjaW5jbHVkZSA8Z3VpL0lQcm9kdWNlckxpc3RlbmVyLmg+CisjaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDYW1lcmFEZXZpY2VDbGllbnQ7CitjbGFzcyBDYW1lcmFNZXRhZGF0YTsKK2NsYXNzIFN1cmZhY2U7CisKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworY2xhc3MgQ29tcG9zaXRlU3RyZWFtIDogcHVibGljIGNhbWVyYTM6OkNhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lciB7CisKK3B1YmxpYzoKKyAgICBDb21wb3NpdGVTdHJlYW0od3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlLCB3cDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gY2IpOworICAgIHZpcnR1YWwgfkNvbXBvc2l0ZVN0cmVhbSgpIHt9CisKKyAgICBzdGF0dXNfdCBjcmVhdGVTdHJlYW0oY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBjb25zdW1lcnMsCisgICAgICAgICAgICBib29sIGhhc0RlZmVycmVkQ29uc3VtZXIsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCisgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkLCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcywgaW50IHN0cmVhbVNldElkLCBib29sIGlzU2hhcmVkKTsKKworICAgIHN0YXR1c190IGRlbGV0ZVN0cmVhbSgpOworCisgICAgLy8gQ3JlYXRlIGFuZCByZWdpc3RlciBhbGwgaW50ZXJuYWwgY2FtZXJhIHN0cmVhbXMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVJbnRlcm5hbFN0cmVhbXMoY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBjb25zdW1lcnMsCisgICAgICAgICAgICBib29sIGhhc0RlZmVycmVkQ29uc3VtZXIsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCisgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkLCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcywgaW50IHN0cmVhbVNldElkLCBib29sIGlzU2hhcmVkKSA9IDA7CisKKyAgICAvLyBSZWxlYXNlIGFsbCBpbnRlcm5hbCBzdHJlYW1zIGFuZCBjb3JyZXNwb25kaW5nIHJlc291cmNlcy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlbGV0ZUludGVybmFsU3RyZWFtcygpID0gMDsKKworICAgIC8vIFN0cmVhbSBjb25maWd1cmF0aW9uIGNvbXBsZXRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVN0cmVhbSgpID0gMDsKKworICAgIC8vIEluc2VydCB0aGUgaW50ZXJuYWwgY29tcG9zaXRlIHN0cmVhbSBpZCBpbiB0aGUgdXNlciBjYXB0dXJlIHJlcXVlc3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbnNlcnRHYnAoU3VyZmFjZU1hcCogLypvdXQqL291dFN1cmZhY2VNYXAsCisgICAgICAgICAgICBWZWN0b3I8aW50MzJfdD4qIC8qb3V0Ki9vdXRwdXRTdHJlYW1JZHMsIGludDMyX3QqIC8qb3V0Ki9jdXJyZW50U3RyZWFtSWQpID0gMDsKKworICAgIC8vIFJldHVybiBjb21wb3NpdGUgc3RyZWFtIGlkLgorICAgIHZpcnR1YWwgaW50IGdldFN0cmVhbUlkKCkgPSAwOworCisgICAgLy8gTm90aWZ5IHdoZW4gc2h1dHRlciBub3RpZnkgaXMgdHJpZ2dlcmVkCisgICAgdmlydHVhbCB2b2lkIG9uU2h1dHRlcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiAvKnJlc3VsdEV4dHJhcyovLCBuc2Vjc190IC8qdGltZXN0YW1wKi8pIHt9CisKKyAgICB2b2lkIG9uUmVzdWx0QXZhaWxhYmxlKGNvbnN0IENhcHR1cmVSZXN1bHQmIHJlc3VsdCk7CisgICAgYm9vbCBvbkVycm9yKGludDMyX3QgZXJyb3JDb2RlLCBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpOworCisgICAgLy8gQ2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyIGltcGxlbWVudGF0aW9uCisgICAgdm9pZCBvbkJ1ZmZlckFjcXVpcmVkKGNvbnN0IEJ1ZmZlckluZm8mIC8qYnVmZmVySW5mbyovKSBvdmVycmlkZSB7IC8qRW1wdHkgZm9yIG5vdyAqLyB9CisgICAgdm9pZCBvbkJ1ZmZlclJlbGVhc2VkKGNvbnN0IEJ1ZmZlckluZm8mIGJ1ZmZlckluZm8pIG92ZXJyaWRlOworICAgIHZvaWQgb25CdWZmZXJSZXF1ZXN0Rm9yRnJhbWVOdW1iZXIodWludDY0X3QgZnJhbWVOdW1iZXIsIGludCBzdHJlYW1JZCwKKyAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzZXR0aW5ncykgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICBzdHJ1Y3QgUHJvZHVjZXJMaXN0ZW5lciA6IHB1YmxpYyBCblByb2R1Y2VyTGlzdGVuZXIgeworICAgICAgICAvLyBQcm9kdWNlckxpc3RlbmVyIGltcGVtZW50YXRpb24KKyAgICAgICAgdm9pZCBvbkJ1ZmZlclJlbGVhc2VkKCkgb3ZlcnJpZGUgeyAvKk5vIGltcGwuIGZvciBub3cqLyB9OworICAgIH07CisKKyAgICBzdGF0dXNfdCByZWdpc3RlckNvbXBvc2l0ZVN0cmVhbUxpc3RlbmVyKGludDMyX3Qgc3RyZWFtSWQpOworICAgIHZvaWQgZXJhc2VSZXN1bHQoaW50NjRfdCBmcmFtZU51bWJlcik7CisgICAgdm9pZCBmbGFnQW5FcnJvckZyYW1lTnVtYmVyKGludDY0X3QgZnJhbWVOdW1iZXIpOworICAgIHZvaWQgbm90aWZ5RXJyb3IoaW50NjRfdCBmcmFtZU51bWJlcik7CisKKyAgICAvLyBTdWJjbGFzc2VzIHNob3VsZCBjaGVjayBmb3IgYnVmZmVyIGVycm9ycyBmcm9tIGludGVybmFsIHN0cmVhbXMgYW5kIHJldHVybiAndHJ1ZScgaW4KKyAgICAvLyBjYXNlIHRoZSBlcnJvciBub3RpZmljYXRpb24gc2hvdWxkIHJlbWFpbiB3aXRoaW4gY2FtZXJhIHNlcnZpY2UuCisgICAgdmlydHVhbCBib29sIG9uU3RyZWFtQnVmZmVyRXJyb3IoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSA9IDA7CisKKyAgICAvLyBTdWJjbGFzc2VzIGNhbiBkZWNpZGUgaG93IHRvIGhhbmRsZSByZXN1bHQgZXJyb3JzIGRlcGVuZGluZyBvbiB3aGV0aGVyIG9yIG5vdCB0aGUKKyAgICAvLyBpbnRlcm5hbCBwcm9jZXNzaW5nIG5lZWRzIHJlc3VsdCBkYXRhLgorICAgIHZpcnR1YWwgdm9pZCBvblJlc3VsdEVycm9yKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgPSAwOworCisgICAgLy8gRGV2aWNlIGFuZC9vciBzZXJ2aWNlIGlzIGluIHVucmVjb3ZlcmFibGUgZXJyb3Igc3RhdGUuCisgICAgLy8gQ29tcG9zaXRlIHN0cmVhbXMgc2hvdWxkIGJlaGF2ZSBhY2NvcmRpbmdseS4KKyAgICB2b2lkIGVuYWJsZUVycm9yU3RhdGUoKTsKKworICAgIHdwPENhbWVyYURldmljZUJhc2U+ICAgbURldmljZTsKKyAgICB3cDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gbVJlbW90ZUNhbGxiYWNrOworCisgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICBtTXV0ZXg7CisgICAgQ29uZGl0aW9uICAgICAgICAgICAgICBtSW5wdXRSZWFkeUNvbmRpdGlvbjsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgIG1OdW1QYXJ0aWFsUmVzdWx0czsKKyAgICBib29sICAgICAgICAgICAgICAgICAgIG1FcnJvclN0YXRlOworCisgICAgLy8gRnJhbWUgbnVtYmVyIHRvIGNhcHR1cmUgcmVzdWx0IG1hcCBvZiBwYXJ0aWFsIHBlbmRpbmcgcmVxdWVzdCByZXN1bHRzLgorICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50NjRfdCwgQ2FtZXJhTWV0YWRhdGE+IG1QZW5kaW5nQ2FwdHVyZVJlc3VsdHM7CisKKyAgICAvLyBUaW1lc3RhbXAgdG8gY2FwdHVyZSAoZnJhbWUgbnVtYmVyLCByZXN1bHQpIG1hcCBvZiBjb21wbGV0ZWQgcGVuZGluZyByZXF1ZXN0IHJlc3VsdHMuCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPGludDY0X3QsIHN0ZDo6dHVwbGU8aW50NjRfdCwgQ2FtZXJhTWV0YWRhdGE+PiBtQ2FwdHVyZVJlc3VsdHM7CisKKyAgICAvLyBGcmFtZSBudW1iZXIgdG8gdGltZXN0YW1wIG1hcAorICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQ2NF90LCBpbnQ2NF90PiBtRnJhbWVOdW1iZXJNYXA7CisKKyAgICAvLyBLZWVwcyBhIHNldCBidWZmZXIvcmVzdWx0IGZyYW1lIG51bWJlcnMgZm9yIGFueSBlcnJvcnMgZGV0ZWN0ZWQgZHVyaW5nIHByb2Nlc3NpbmcuCisgICAgc3RkOjpzZXQ8aW50NjRfdD4gbUVycm9yRnJhbWVOdW1iZXJzOworCit9OworCit9OyAvL25hbWVzcGFjZSBjYW1lcmEzCit9OyAvL25hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9EZXB0aENvbXBvc2l0ZVN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0RlcHRoQ29tcG9zaXRlU3RyZWFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTI1YWQyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9EZXB0aENvbXBvc2l0ZVN0cmVhbS5jcHAKQEAgLTAsMCArMSw4MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYTMtRGVwdGhDb21wb3NpdGVTdHJlYW0iCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgImFwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmgiCisjaW5jbHVkZSAiY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oIgorI2luY2x1ZGUgImRsZmNuLmgiCisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorCisjaW5jbHVkZSAiRGVwdGhDb21wb3NpdGVTdHJlYW0uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworCitEZXB0aENvbXBvc2l0ZVN0cmVhbTo6RGVwdGhDb21wb3NpdGVTdHJlYW0od3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlLAorICAgICAgICB3cDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gY2IpIDoKKyAgICAgICAgQ29tcG9zaXRlU3RyZWFtKGRldmljZSwgY2IpLAorICAgICAgICBtQmxvYlN0cmVhbUlkKC0xKSwKKyAgICAgICAgbUJsb2JTdXJmYWNlSWQoLTEpLAorICAgICAgICBtRGVwdGhTdHJlYW1JZCgtMSksCisgICAgICAgIG1EZXB0aFN1cmZhY2VJZCgtMSksCisgICAgICAgIG1CbG9iV2lkdGgoMCksCisgICAgICAgIG1CbG9iSGVpZ2h0KDApLAorICAgICAgICBtRGVwdGhCdWZmZXJBY3F1aXJlZChmYWxzZSksCisgICAgICAgIG1CbG9iQnVmZmVyQWNxdWlyZWQoZmFsc2UpLAorICAgICAgICBtUHJvZHVjZXJMaXN0ZW5lcihuZXcgUHJvZHVjZXJMaXN0ZW5lcigpKSwKKyAgICAgICAgbU1heEpwZWdTaXplKC0xKSwKKyAgICAgICAgbUlzTG9naWNhbENhbWVyYShmYWxzZSksCisgICAgICAgIG1EZXB0aFBob3RvTGliSGFuZGxlKG51bGxwdHIpLAorICAgICAgICBtRGVwdGhQaG90b1Byb2Nlc3MobnVsbHB0cikgeworICAgIHNwPENhbWVyYURldmljZUJhc2U+IGNhbWVyYURldmljZSA9IGRldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKGNhbWVyYURldmljZS5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIENhbWVyYU1ldGFkYXRhIHN0YXRpY0luZm8gPSBjYW1lcmFEZXZpY2UtPmluZm8oKTsKKyAgICAgICAgYXV0byBlbnRyeSA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX0pQRUdfTUFYX1NJWkUpOworICAgICAgICBpZiAoZW50cnkuY291bnQgPiAwKSB7CisgICAgICAgICAgICBtTWF4SnBlZ1NpemUgPSBlbnRyeS5kYXRhLmkzMlswXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogTWF4aW11bSBqcGVnIHNpemUgYWJzZW50IGZyb20gY2FtZXJhIGNoYXJhY3RlcmlzdGljcyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIH0KKworICAgICAgICBlbnRyeSA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX0xFTlNfSU5UUklOU0lDX0NBTElCUkFUSU9OKTsKKyAgICAgICAgaWYgKGVudHJ5LmNvdW50ID09IDUpIHsKKyAgICAgICAgICAgIG1JbnN0cmluc2ljQ2FsaWJyYXRpb24ucmVzZXJ2ZSg1KTsKKyAgICAgICAgICAgIG1JbnN0cmluc2ljQ2FsaWJyYXRpb24uaW5zZXJ0KG1JbnN0cmluc2ljQ2FsaWJyYXRpb24uZW5kKCksIGVudHJ5LmRhdGEuZiwKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuZGF0YS5mICsgNSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IEludHJpbnNpYyBjYWxpYnJhdGlvbiBhYnNlbnQgZnJvbSBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIH0KKworICAgICAgICBlbnRyeSA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX0xFTlNfRElTVE9SVElPTik7CisgICAgICAgIGlmIChlbnRyeS5jb3VudCA9PSA1KSB7CisgICAgICAgICAgICBtTGVuc0Rpc3RvcnRpb24ucmVzZXJ2ZSg1KTsKKyAgICAgICAgICAgIG1MZW5zRGlzdG9ydGlvbi5pbnNlcnQobUxlbnNEaXN0b3J0aW9uLmVuZCgpLCBlbnRyeS5kYXRhLmYsIGVudHJ5LmRhdGEuZiArIDUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIiVzOiBMZW5zIGRpc3RvcnRpb24gYWJzZW50IGZyb20gY2FtZXJhIGNoYXJhY3RlcmlzdGljcyEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICB9CisKKyAgICAgICAgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgY2FwYWJpbGl0eSA9IGVudHJ5LmRhdGEudThbaV07CisgICAgICAgICAgICBpZiAoY2FwYWJpbGl0eSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19MT0dJQ0FMX01VTFRJX0NBTUVSQSkgeworICAgICAgICAgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmEgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZ2V0U3VwcG9ydGVkRGVwdGhTaXplcyhzdGF0aWNJbmZvLCAmbVN1cHBvcnRlZERlcHRoU2l6ZXMpOworCisgICAgICAgIG1EZXB0aFBob3RvTGliSGFuZGxlID0gZGxvcGVuKGNhbWVyYTM6OmtEZXB0aFBob3RvTGlicmFyeSwgUlRMRF9OT1cgfCBSVExEX0xPQ0FMKTsKKyAgICAgICAgaWYgKG1EZXB0aFBob3RvTGliSGFuZGxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1EZXB0aFBob3RvUHJvY2VzcyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2FtZXJhMzo6cHJvY2Vzc19kZXB0aF9waG90b19mcmFtZT4gKAorICAgICAgICAgICAgICAgICAgICBkbHN5bShtRGVwdGhQaG90b0xpYkhhbmRsZSwgY2FtZXJhMzo6a0RlcHRoUGhvdG9Qcm9jZXNzRnVuY3Rpb24pKTsKKyAgICAgICAgICAgIGlmIChtRGVwdGhQaG90b1Byb2Nlc3MgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGxpbmsgdG8gZGVwdGggcGhvdG8gcHJvY2VzcyBmdW5jdGlvbjogJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICBkbGVycm9yKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gbGluayB0byBkZXB0aCBwaG90byBsaWJyYXJ5OiAlcyIsIF9fRlVOQ1RJT05fXywgZGxlcnJvcigpKTsKKyAgICAgICAgfQorCisgICAgfQorfQorCitEZXB0aENvbXBvc2l0ZVN0cmVhbTo6fkRlcHRoQ29tcG9zaXRlU3RyZWFtKCkgeworICAgIG1CbG9iQ29uc3VtZXIuY2xlYXIoKSwKKyAgICBtQmxvYlN1cmZhY2UuY2xlYXIoKSwKKyAgICBtQmxvYlN0cmVhbUlkID0gLTE7CisgICAgbUJsb2JTdXJmYWNlSWQgPSAtMTsKKyAgICBtRGVwdGhDb25zdW1lci5jbGVhcigpOworICAgIG1EZXB0aFN1cmZhY2UuY2xlYXIoKTsKKyAgICBtRGVwdGhDb25zdW1lciA9IG51bGxwdHI7CisgICAgbURlcHRoU3VyZmFjZSA9IG51bGxwdHI7CisgICAgaWYgKG1EZXB0aFBob3RvTGliSGFuZGxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgZGxjbG9zZShtRGVwdGhQaG90b0xpYkhhbmRsZSk7CisgICAgICAgIG1EZXB0aFBob3RvTGliSGFuZGxlID0gbnVsbHB0cjsKKyAgICB9CisgICAgbURlcHRoUGhvdG9Qcm9jZXNzID0gbnVsbHB0cjsKK30KKwordm9pZCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6Y29tcGlsZVBlbmRpbmdJbnB1dExvY2tlZCgpIHsKKyAgICBDcHVDb25zdW1lcjo6TG9ja2VkQnVmZmVyIGltZ0J1ZmZlcjsKKworICAgIHdoaWxlICghbUlucHV0SnBlZ0J1ZmZlcnMuZW1wdHkoKSAmJiAhbUJsb2JCdWZmZXJBY3F1aXJlZCkgeworICAgICAgICBhdXRvIGl0ID0gbUlucHV0SnBlZ0J1ZmZlcnMuYmVnaW4oKTsKKyAgICAgICAgYXV0byByZXMgPSBtQmxvYkNvbnN1bWVyLT5sb2NrTmV4dEJ1ZmZlcigmaW1nQnVmZmVyKTsKKyAgICAgICAgaWYgKHJlcyA9PSBOT1RfRU5PVUdIX0RBVEEpIHsKKyAgICAgICAgICAgIC8vIENhbiBub3QgbG9jayBhbnkgbW9yZSBidWZmZXJzLgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yIGxvY2tpbmcgYmxvYiBpbWFnZSBidWZmZXI6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1sqaXRdLmVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIG1JbnB1dEpwZWdCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCppdCAhPSBpbWdCdWZmZXIudGltZXN0YW1wKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IEV4cGVjdGluZyBqcGVnIGJ1ZmZlciB3aXRoIHRpbWUgc3RhbXA6ICUiIFBSSWQ2NCAiIHJlY2VpdmVkIGJ1ZmZlciB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgInRpbWUgc3RhbXA6ICUiIFBSSWQ2NCwgX19GVU5DVElPTl9fLCAqaXQsIGltZ0J1ZmZlci50aW1lc3RhbXApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChtUGVuZGluZ0lucHV0RnJhbWVzLmZpbmQoaW1nQnVmZmVyLnRpbWVzdGFtcCkgIT0gbVBlbmRpbmdJbnB1dEZyYW1lcy5lbmQoKSkgJiYKKyAgICAgICAgICAgICAgICAobVBlbmRpbmdJbnB1dEZyYW1lc1tpbWdCdWZmZXIudGltZXN0YW1wXS5lcnJvcikpIHsKKyAgICAgICAgICAgIG1CbG9iQ29uc3VtZXItPnVubG9ja0J1ZmZlcihpbWdCdWZmZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tpbWdCdWZmZXIudGltZXN0YW1wXS5qcGVnQnVmZmVyID0gaW1nQnVmZmVyOworICAgICAgICAgICAgbUJsb2JCdWZmZXJBY3F1aXJlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgbUlucHV0SnBlZ0J1ZmZlcnMuZXJhc2UoaXQpOworICAgIH0KKworICAgIHdoaWxlICghbUlucHV0RGVwdGhCdWZmZXJzLmVtcHR5KCkgJiYgIW1EZXB0aEJ1ZmZlckFjcXVpcmVkKSB7CisgICAgICAgIGF1dG8gaXQgPSBtSW5wdXREZXB0aEJ1ZmZlcnMuYmVnaW4oKTsKKyAgICAgICAgYXV0byByZXMgPSBtRGVwdGhDb25zdW1lci0+bG9ja05leHRCdWZmZXIoJmltZ0J1ZmZlcik7CisgICAgICAgIGlmIChyZXMgPT0gTk9UX0VOT1VHSF9EQVRBKSB7CisgICAgICAgICAgICAvLyBDYW4gbm90IGxvY2sgYW55IG1vcmUgYnVmZmVycy4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvciByZWNlaXZpbmcgZGVwdGggaW1hZ2UgYnVmZmVyOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbKml0XS5lcnJvciA9IHRydWU7CisgICAgICAgICAgICBtSW5wdXREZXB0aEJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKml0ICE9IGltZ0J1ZmZlci50aW1lc3RhbXApIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogRXhwZWN0aW5nIGRlcHRoIGJ1ZmZlciB3aXRoIHRpbWUgc3RhbXA6ICUiIFBSSWQ2NCAiIHJlY2VpdmVkIGJ1ZmZlciB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgInRpbWUgc3RhbXA6ICUiIFBSSWQ2NCwgX19GVU5DVElPTl9fLCAqaXQsIGltZ0J1ZmZlci50aW1lc3RhbXApOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChtUGVuZGluZ0lucHV0RnJhbWVzLmZpbmQoaW1nQnVmZmVyLnRpbWVzdGFtcCkgIT0gbVBlbmRpbmdJbnB1dEZyYW1lcy5lbmQoKSkgJiYKKyAgICAgICAgICAgICAgICAobVBlbmRpbmdJbnB1dEZyYW1lc1tpbWdCdWZmZXIudGltZXN0YW1wXS5lcnJvcikpIHsKKyAgICAgICAgICAgIG1EZXB0aENvbnN1bWVyLT51bmxvY2tCdWZmZXIoaW1nQnVmZmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbaW1nQnVmZmVyLnRpbWVzdGFtcF0uZGVwdGhCdWZmZXIgPSBpbWdCdWZmZXI7CisgICAgICAgICAgICBtRGVwdGhCdWZmZXJBY3F1aXJlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgbUlucHV0RGVwdGhCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICB3aGlsZSAoIW1DYXB0dXJlUmVzdWx0cy5lbXB0eSgpKSB7CisgICAgICAgIGF1dG8gaXQgPSBtQ2FwdHVyZVJlc3VsdHMuYmVnaW4oKTsKKyAgICAgICAgLy8gTmVnYXRpdmUgdGltZXN0YW1wIGluZGljYXRlcyB0aGF0IHNvbWV0aGluZyB3ZW50IHdyb25nIGR1cmluZyB0aGUgY2FwdHVyZSByZXN1bHQKKyAgICAgICAgLy8gY29sbGVjdGlvbiBwcm9jZXNzLgorICAgICAgICBpZiAoaXQtPmZpcnN0ID49IDApIHsKKyAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbaXQtPmZpcnN0XS5mcmFtZU51bWJlciA9IHN0ZDo6Z2V0PDA+KGl0LT5zZWNvbmQpOworICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tpdC0+Zmlyc3RdLnJlc3VsdCA9IHN0ZDo6Z2V0PDE+KGl0LT5zZWNvbmQpOworICAgICAgICB9CisgICAgICAgIG1DYXB0dXJlUmVzdWx0cy5lcmFzZShpdCk7CisgICAgfQorCisgICAgd2hpbGUgKCFtRnJhbWVOdW1iZXJNYXAuZW1wdHkoKSkgeworICAgICAgICBhdXRvIGl0ID0gbUZyYW1lTnVtYmVyTWFwLmJlZ2luKCk7CisgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbaXQtPnNlY29uZF0uZnJhbWVOdW1iZXIgPSBpdC0+Zmlyc3Q7CisgICAgICAgIG1GcmFtZU51bWJlck1hcC5lcmFzZShpdCk7CisgICAgfQorCisgICAgYXV0byBpdCA9IG1FcnJvckZyYW1lTnVtYmVycy5iZWdpbigpOworICAgIHdoaWxlIChpdCAhPSBtRXJyb3JGcmFtZU51bWJlcnMuZW5kKCkpIHsKKyAgICAgICAgYm9vbCBmcmFtZUZvdW5kID0gZmFsc2U7CisgICAgICAgIGZvciAoYXV0byAmaW5wdXRGcmFtZSA6IG1QZW5kaW5nSW5wdXRGcmFtZXMpIHsKKyAgICAgICAgICAgIGlmIChpbnB1dEZyYW1lLnNlY29uZC5mcmFtZU51bWJlciA9PSAqaXQpIHsKKyAgICAgICAgICAgICAgICBpbnB1dEZyYW1lLnNlY29uZC5lcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgZnJhbWVGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZnJhbWVGb3VuZCkgeworICAgICAgICAgICAgaXQgPSBtRXJyb3JGcmFtZU51bWJlcnMuZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIiVzOiBOb3QgYWJsZSB0byBmaW5kIGZhaWxpbmcgaW5wdXQgd2l0aCBmcmFtZSBudW1iZXI6ICUiIFBSSWQ2NCwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAqaXQpOworICAgICAgICAgICAgaXQrKzsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6Z2V0TmV4dFJlYWR5SW5wdXRMb2NrZWQoaW50NjRfdCAqY3VycmVudFRzIC8qaW5vdXQqLykgeworICAgIGlmIChjdXJyZW50VHMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBuZXdJbnB1dEF2YWlsYWJsZSA9IGZhbHNlOworICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiBtUGVuZGluZ0lucHV0RnJhbWVzKSB7CisgICAgICAgIGlmICgoIWl0LnNlY29uZC5lcnJvcikgJiYgKGl0LnNlY29uZC5kZXB0aEJ1ZmZlci5kYXRhICE9IG51bGxwdHIpICYmCisgICAgICAgICAgICAgICAgKGl0LnNlY29uZC5qcGVnQnVmZmVyLmRhdGEgIT0gbnVsbHB0cikgJiYgKGl0LmZpcnN0IDwgKmN1cnJlbnRUcykpIHsKKyAgICAgICAgICAgICpjdXJyZW50VHMgPSBpdC5maXJzdDsKKyAgICAgICAgICAgIG5ld0lucHV0QXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBuZXdJbnB1dEF2YWlsYWJsZTsKK30KKworaW50NjRfdCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6Z2V0TmV4dEZhaWxpbmdJbnB1dExvY2tlZChpbnQ2NF90ICpjdXJyZW50VHMgLyppbm91dCovKSB7CisgICAgaW50NjRfdCByZXQgPSAtMTsKKyAgICBpZiAoY3VycmVudFRzID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogbVBlbmRpbmdJbnB1dEZyYW1lcykgeworICAgICAgICBpZiAoaXQuc2Vjb25kLmVycm9yICYmICFpdC5zZWNvbmQuZXJyb3JOb3RpZmllZCAmJiAoaXQuZmlyc3QgPCAqY3VycmVudFRzKSkgeworICAgICAgICAgICAgKmN1cnJlbnRUcyA9IGl0LmZpcnN0OworICAgICAgICAgICAgcmV0ID0gaXQuc2Vjb25kLmZyYW1lTnVtYmVyOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdHVzX3QgRGVwdGhDb21wb3NpdGVTdHJlYW06OnByb2Nlc3NJbnB1dEZyYW1lKGNvbnN0IElucHV0RnJhbWUgJmlucHV0RnJhbWUpIHsKKyAgICBzdGF0dXNfdCByZXM7CisgICAgc3A8QU5hdGl2ZVdpbmRvdz4gb3V0cHV0QU5XID0gbU91dHB1dFN1cmZhY2U7CisgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciAqYW5iOworICAgIGludCBmZW5jZUZkOworICAgIHZvaWQgKmRzdEJ1ZmZlcjsKKworICAgIGF1dG8ganBlZ1NpemUgPSBhbmRyb2lkOjpjYW1lcmEyOjpKcGVnUHJvY2Vzc29yOjpmaW5kSnBlZ1NpemUoaW5wdXRGcmFtZS5qcGVnQnVmZmVyLmRhdGEsCisgICAgICAgICAgICBpbnB1dEZyYW1lLmpwZWdCdWZmZXIud2lkdGgpOworICAgIGlmIChqcGVnU2l6ZSA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlczogRmFpbGVkIHRvIGZpbmQgaW5wdXQganBlZyBzaXplLCBkZWZhdWx0IHRvIHVzaW5nIGVudGlyZSBidWZmZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAganBlZ1NpemUgPSBpbnB1dEZyYW1lLmpwZWdCdWZmZXIud2lkdGg7CisgICAgfQorCisgICAgc2l6ZV90IG1heERlcHRoSnBlZ1NpemU7CisgICAgaWYgKG1NYXhKcGVnU2l6ZSA+IDApIHsKKyAgICAgICAgbWF4RGVwdGhKcGVnU2l6ZSA9IG1NYXhKcGVnU2l6ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtYXhEZXB0aEpwZWdTaXplID0gc3RkOjptYXg8c2l6ZV90PiAoanBlZ1NpemUsCisgICAgICAgICAgICAgICAgaW5wdXRGcmFtZS5kZXB0aEJ1ZmZlci53aWR0aCAqIGlucHV0RnJhbWUuZGVwdGhCdWZmZXIuaGVpZ2h0ICogMyAvIDIpOworICAgIH0KKyAgICB1aW50OF90IGpwZWdRdWFsaXR5ID0gMTAwOworICAgIGF1dG8gZW50cnkgPSBpbnB1dEZyYW1lLnJlc3VsdC5maW5kKEFORFJPSURfSlBFR19RVUFMSVRZKTsKKyAgICBpZiAoZW50cnkuY291bnQgPiAwKSB7CisgICAgICAgIGpwZWdRdWFsaXR5ID0gZW50cnkuZGF0YS51OFswXTsKKyAgICB9CisKKyAgICAvLyBUaGUgZmluYWwgZGVwdGggcGhvdG8gd2lsbCBjb25zaXN0IG9mIHRoZSBtYWluIGpwZWcgYnVmZmVyLCB0aGUgZGVwdGggbWFwIGJ1ZmZlciAoYWxzbyBpbgorICAgIC8vIGpwZWcgZm9ybWF0KSBhbmQgY29uZmlkZW5jZSBtYXAgKGpwZWcgYXMgd2VsbCkuIEFzc3VtZSB3b3JzdCBjYXNlIHRoYXQgYWxsIDMganBlZyBuZWVkCisgICAgLy8gbWF4IGpwZWcgc2l6ZS4KKyAgICBzaXplX3QgZmluYWxKcGVnQnVmZmVyU2l6ZSA9IG1heERlcHRoSnBlZ1NpemUgKiAzOworCisgICAgaWYgKChyZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RpbWVuc2lvbnMobU91dHB1dFN1cmZhY2UuZ2V0KCksIGZpbmFsSnBlZ0J1ZmZlclNpemUsIDEpKQorICAgICAgICAgICAgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29uZmlndXJlIHN0cmVhbSBidWZmZXIgZGltZW5zaW9ucyIKKyAgICAgICAgICAgICAgICAiICV6dXgldSBmb3Igc3RyZWFtICVkIiwgX19GVU5DVElPTl9fLCBmaW5hbEpwZWdCdWZmZXJTaXplLCAxVSwgbUJsb2JTdHJlYW1JZCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcmVzID0gb3V0cHV0QU5XLT5kZXF1ZXVlQnVmZmVyKG1PdXRwdXRTdXJmYWNlLmdldCgpLCAmYW5iLCAmZmVuY2VGZCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHJldHJpZXZpbmcgb3V0cHV0IGJ1ZmZlcjogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksCisgICAgICAgICAgICAgICAgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBnYiA9IEdyYXBoaWNCdWZmZXI6OmZyb20oYW5iKTsKKyAgICByZXMgPSBnYi0+bG9ja0FzeW5jKEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4sICZkc3RCdWZmZXIsIGZlbmNlRmQpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvciB0cnlpbmcgdG8gbG9jayBvdXRwdXQgYnVmZmVyIGZlbmNlOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICBvdXRwdXRBTlctPmNhbmNlbEJ1ZmZlcihtT3V0cHV0U3VyZmFjZS5nZXQoKSwgYW5iLCAvKmZlbmNlKi8gLTEpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmICgoZ2ItPmdldFdpZHRoKCkgPCBmaW5hbEpwZWdCdWZmZXJTaXplKSB8fCAoZ2ItPmdldEhlaWdodCgpICE9IDEpKSB7CisgICAgICAgIEFMT0dFKCIlczogQmxvYiBidWZmZXIgc2l6ZSBtaXNtYXRjaCwgZXhwZWN0ZWQgJWR4JWQgcmVjZWl2ZWQgJXp1eCV1IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGdiLT5nZXRXaWR0aCgpLCBnYi0+Z2V0SGVpZ2h0KCksIGZpbmFsSnBlZ0J1ZmZlclNpemUsIDFVKTsKKyAgICAgICAgb3V0cHV0QU5XLT5jYW5jZWxCdWZmZXIobU91dHB1dFN1cmZhY2UuZ2V0KCksIGFuYiwgLypmZW5jZSovIC0xKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBEZXB0aFBob3RvSW5wdXRGcmFtZSBkZXB0aFBob3RvOworICAgIGRlcHRoUGhvdG8ubU1haW5KcGVnQnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4gKGlucHV0RnJhbWUuanBlZ0J1ZmZlci5kYXRhKTsKKyAgICBkZXB0aFBob3RvLm1NYWluSnBlZ1dpZHRoID0gbUJsb2JXaWR0aDsKKyAgICBkZXB0aFBob3RvLm1NYWluSnBlZ0hlaWdodCA9IG1CbG9iSGVpZ2h0OworICAgIGRlcHRoUGhvdG8ubU1haW5KcGVnU2l6ZSA9IGpwZWdTaXplOworICAgIGRlcHRoUGhvdG8ubURlcHRoTWFwQnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50MTZfdCo+IChpbnB1dEZyYW1lLmRlcHRoQnVmZmVyLmRhdGEpOworICAgIGRlcHRoUGhvdG8ubURlcHRoTWFwV2lkdGggPSBpbnB1dEZyYW1lLmRlcHRoQnVmZmVyLndpZHRoOworICAgIGRlcHRoUGhvdG8ubURlcHRoTWFwSGVpZ2h0ID0gaW5wdXRGcmFtZS5kZXB0aEJ1ZmZlci5oZWlnaHQ7CisgICAgZGVwdGhQaG90by5tRGVwdGhNYXBTdHJpZGUgPSBpbnB1dEZyYW1lLmRlcHRoQnVmZmVyLnN0cmlkZTsKKyAgICBkZXB0aFBob3RvLm1KcGVnUXVhbGl0eSA9IGpwZWdRdWFsaXR5OworICAgIGRlcHRoUGhvdG8ubUlzTG9naWNhbCA9IG1Jc0xvZ2ljYWxDYW1lcmE7CisgICAgZGVwdGhQaG90by5tTWF4SnBlZ1NpemUgPSBtYXhEZXB0aEpwZWdTaXplOworICAgIC8vIFRoZSBjYW1lcmEgaW50cmluc2ljIGNhbGlicmF0aW9uIGxheW91dCBpcyBhcyBmb2xsb3dzOgorICAgIC8vIFtmb2NhbExlbmd0aFgsIGZvY2FsTGVuZ3RoWSwgb3B0aWNhbENlbnRlclgsIG9wdGljYWxDZW50ZXJZLCBza2V3XQorICAgIGlmIChtSW5zdHJpbnNpY0NhbGlicmF0aW9uLnNpemUoKSA9PSA1KSB7CisgICAgICAgIG1lbWNweShkZXB0aFBob3RvLm1JbnN0cmluc2ljQ2FsaWJyYXRpb24sIG1JbnN0cmluc2ljQ2FsaWJyYXRpb24uZGF0YSgpLAorICAgICAgICAgICAgICAgIHNpemVvZihkZXB0aFBob3RvLm1JbnN0cmluc2ljQ2FsaWJyYXRpb24pKTsKKyAgICAgICAgZGVwdGhQaG90by5tSXNJbnN0cmluc2ljQ2FsaWJyYXRpb25WYWxpZCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVwdGhQaG90by5tSXNJbnN0cmluc2ljQ2FsaWJyYXRpb25WYWxpZCA9IDA7CisgICAgfQorICAgIC8vIFRoZSBjYW1lcmEgbGVucyBkaXN0b3J0aW9uIGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbGVucyBjb3JyZWN0aW9uIGNvZWZmaWNpZW50cy4KKyAgICAvLyBba2FwcGFfMSwga2FwcGFfMiwga2FwcGFfMyBrYXBwYV80LCBrYXBwYV81XQorICAgIGlmIChtTGVuc0Rpc3RvcnRpb24uc2l6ZSgpID09IDUpIHsKKyAgICAgICAgbWVtY3B5KGRlcHRoUGhvdG8ubUxlbnNEaXN0b3J0aW9uLCBtTGVuc0Rpc3RvcnRpb24uZGF0YSgpLAorICAgICAgICAgICAgICAgIHNpemVvZihkZXB0aFBob3RvLm1MZW5zRGlzdG9ydGlvbikpOworICAgICAgICBkZXB0aFBob3RvLm1Jc0xlbnNEaXN0b3J0aW9uVmFsaWQgPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIGRlcHRoUGhvdG8ubUlzTGVuc0Rpc3RvcnRpb25WYWxpZCA9IDA7CisgICAgfQorICAgIGVudHJ5ID0gaW5wdXRGcmFtZS5yZXN1bHQuZmluZChBTkRST0lEX0pQRUdfT1JJRU5UQVRJT04pOworICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgLy8gVGhlIGNhbWVyYSBqcGVnIG9yaWVudGF0aW9uIHZhbHVlcyBtdXN0IGJlIHdpdGhpbiBbMCwgOTAsIDE4MCwgMjcwXS4KKyAgICAgICAgc3dpdGNoIChlbnRyeS5kYXRhLmkzMlswXSkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgY2FzZSA5MDoKKyAgICAgICAgICAgIGNhc2UgMTgwOgorICAgICAgICAgICAgY2FzZSAyNzA6CisgICAgICAgICAgICAgICAgZGVwdGhQaG90by5tT3JpZW50YXRpb24gPSBzdGF0aWNfY2FzdDxEZXB0aFBob3RvT3JpZW50YXRpb24+IChlbnRyeS5kYXRhLmkzMlswXSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVW5leHBlY3RlZCBqcGVnIG9yaWVudGF0aW9uIHZhbHVlOiAlZCwgZGVmYXVsdCB0byAwIGRlZ3JlZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBlbnRyeS5kYXRhLmkzMlswXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzaXplX3QgYWN0dWFsSnBlZ1NpemUgPSAwOworICAgIHJlcyA9IG1EZXB0aFBob3RvUHJvY2VzcyhkZXB0aFBob3RvLCBmaW5hbEpwZWdCdWZmZXJTaXplLCBkc3RCdWZmZXIsICZhY3R1YWxKcGVnU2l6ZSk7CisgICAgaWYgKHJlcyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogRGVwdGggcGhvdG8gcHJvY2Vzc2luZyBmYWlsZWQ6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICBvdXRwdXRBTlctPmNhbmNlbEJ1ZmZlcihtT3V0cHV0U3VyZmFjZS5nZXQoKSwgYW5iLCAvKmZlbmNlKi8gLTEpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHNpemVfdCBmaW5hbEpwZWdTaXplID0gYWN0dWFsSnBlZ1NpemUgKyBzaXplb2Yoc3RydWN0IGNhbWVyYTNfanBlZ19ibG9iKTsKKyAgICBpZiAoZmluYWxKcGVnU2l6ZSA+IGZpbmFsSnBlZ0J1ZmZlclNpemUpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGaW5hbCBqcGVnIGJ1ZmZlciBub3QgbGFyZ2UgZW5vdWdoIGZvciB0aGUganBlZyBibG9iIGhlYWRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIG91dHB1dEFOVy0+Y2FuY2VsQnVmZmVyKG1PdXRwdXRTdXJmYWNlLmdldCgpLCBhbmIsIC8qZmVuY2UqLyAtMSk7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgQUxPR1YoIiVzOiBGaW5hbCBqcGVnIHNpemU6ICV6dSIsIF9fZnVuY19fLCBmaW5hbEpwZWdTaXplKTsKKyAgICB1aW50OF90KiBoZWFkZXIgPSBzdGF0aWNfY2FzdDx1aW50OF90ICo+IChkc3RCdWZmZXIpICsKKyAgICAgICAgKGdiLT5nZXRXaWR0aCgpIC0gc2l6ZW9mKHN0cnVjdCBjYW1lcmEzX2pwZWdfYmxvYikpOworICAgIHN0cnVjdCBjYW1lcmEzX2pwZWdfYmxvYiAqYmxvYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IGNhbWVyYTNfanBlZ19ibG9iKj4gKGhlYWRlcik7CisgICAgYmxvYi0+anBlZ19ibG9iX2lkID0gQ0FNRVJBM19KUEVHX0JMT0JfSUQ7CisgICAgYmxvYi0+anBlZ19zaXplID0gYWN0dWFsSnBlZ1NpemU7CisgICAgb3V0cHV0QU5XLT5xdWV1ZUJ1ZmZlcihtT3V0cHV0U3VyZmFjZS5nZXQoKSwgYW5iLCAvKmZlbmNlKi8gLTEpOworCisgICAgcmV0dXJuIHJlczsKK30KKwordm9pZCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6cmVsZWFzZUlucHV0RnJhbWVMb2NrZWQoSW5wdXRGcmFtZSAqaW5wdXRGcmFtZSAvKm91dCovKSB7CisgICAgaWYgKGlucHV0RnJhbWUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGlucHV0RnJhbWUtPmRlcHRoQnVmZmVyLmRhdGEgIT0gbnVsbHB0cikgeworICAgICAgICBtRGVwdGhDb25zdW1lci0+dW5sb2NrQnVmZmVyKGlucHV0RnJhbWUtPmRlcHRoQnVmZmVyKTsKKyAgICAgICAgaW5wdXRGcmFtZS0+ZGVwdGhCdWZmZXIuZGF0YSA9IG51bGxwdHI7CisgICAgICAgIG1EZXB0aEJ1ZmZlckFjcXVpcmVkID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGlucHV0RnJhbWUtPmpwZWdCdWZmZXIuZGF0YSAhPSBudWxscHRyKSB7CisgICAgICAgIG1CbG9iQ29uc3VtZXItPnVubG9ja0J1ZmZlcihpbnB1dEZyYW1lLT5qcGVnQnVmZmVyKTsKKyAgICAgICAgaW5wdXRGcmFtZS0+anBlZ0J1ZmZlci5kYXRhID0gbnVsbHB0cjsKKyAgICAgICAgbUJsb2JCdWZmZXJBY3F1aXJlZCA9IGZhbHNlOworICAgIH0KKworICAgIGlmICgoaW5wdXRGcmFtZS0+ZXJyb3IgfHwgbUVycm9yU3RhdGUpICYmICFpbnB1dEZyYW1lLT5lcnJvck5vdGlmaWVkKSB7CisgICAgICAgIG5vdGlmeUVycm9yKGlucHV0RnJhbWUtPmZyYW1lTnVtYmVyKTsKKyAgICAgICAgaW5wdXRGcmFtZS0+ZXJyb3JOb3RpZmllZCA9IHRydWU7CisgICAgfQorfQorCit2b2lkIERlcHRoQ29tcG9zaXRlU3RyZWFtOjpyZWxlYXNlSW5wdXRGcmFtZXNMb2NrZWQoaW50NjRfdCBjdXJyZW50VHMpIHsKKyAgICBhdXRvIGl0ID0gbVBlbmRpbmdJbnB1dEZyYW1lcy5iZWdpbigpOworICAgIHdoaWxlIChpdCAhPSBtUGVuZGluZ0lucHV0RnJhbWVzLmVuZCgpKSB7CisgICAgICAgIGlmIChpdC0+Zmlyc3QgPD0gY3VycmVudFRzKSB7CisgICAgICAgICAgICByZWxlYXNlSW5wdXRGcmFtZUxvY2tlZCgmaXQtPnNlY29uZCk7CisgICAgICAgICAgICBpdCA9IG1QZW5kaW5nSW5wdXRGcmFtZXMuZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaXQrKzsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6dGhyZWFkTG9vcCgpIHsKKyAgICBpbnQ2NF90IGN1cnJlbnRUcyA9IElOVDY0X01BWDsKKyAgICBib29sIG5ld0lucHV0QXZhaWxhYmxlID0gZmFsc2U7CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisKKyAgICAgICAgaWYgKG1FcnJvclN0YXRlKSB7CisgICAgICAgICAgICAvLyBJbiBjYXNlIHdlIGxhbmRlZCBpbiBlcnJvciBzdGF0ZSwgcmV0dXJuIGFueSBwZW5kaW5nIGJ1ZmZlcnMgYW5kCisgICAgICAgICAgICAvLyBoYWx0IGFsbCBmdXJ0aGVyIHByb2Nlc3NpbmcuCisgICAgICAgICAgICBjb21waWxlUGVuZGluZ0lucHV0TG9ja2VkKCk7CisgICAgICAgICAgICByZWxlYXNlSW5wdXRGcmFtZXNMb2NrZWQoY3VycmVudFRzKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICghbmV3SW5wdXRBdmFpbGFibGUpIHsKKyAgICAgICAgICAgIGNvbXBpbGVQZW5kaW5nSW5wdXRMb2NrZWQoKTsKKyAgICAgICAgICAgIG5ld0lucHV0QXZhaWxhYmxlID0gZ2V0TmV4dFJlYWR5SW5wdXRMb2NrZWQoJmN1cnJlbnRUcyk7CisgICAgICAgICAgICBpZiAoIW5ld0lucHV0QXZhaWxhYmxlKSB7CisgICAgICAgICAgICAgICAgYXV0byBmYWlsaW5nRnJhbWVOdW1iZXIgPSBnZXROZXh0RmFpbGluZ0lucHV0TG9ja2VkKCZjdXJyZW50VHMpOworICAgICAgICAgICAgICAgIGlmIChmYWlsaW5nRnJhbWVOdW1iZXIgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSBjYW5ub3QgZXJhc2UgJ21QZW5kaW5nSW5wdXRGcmFtZXNbY3VycmVudFRzXScgYXQgdGhpcyBwb2ludCBiZWNhdXNlIGl0IGlzCisgICAgICAgICAgICAgICAgICAgIC8vIHBvc3NpYmxlIGZvciB0d28gaW50ZXJuYWwgc3RyZWFtIGJ1ZmZlcnMgdG8gZmFpbC4gSW4gc3VjaCBzY2VuYXJpbyB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gY29tcG9zaXRlIHN0cmVhbSBzaG91bGQgbm90aWZ5IHRoZSBjbGllbnQgYWJvdXQgYSBzdHJlYW0gYnVmZmVyIGVycm9yIG9ubHkKKyAgICAgICAgICAgICAgICAgICAgLy8gb25jZSBhbmQgdGhpcyBpbmZvcm1hdGlvbiBpcyBrZXB0IHdpdGhpbiAnZXJyb3JOb3RpZmllZCcuCisgICAgICAgICAgICAgICAgICAgIC8vIEFueSBwcmVzZW50IGZhaWxlZCBpbnB1dCBmcmFtZXMgd2lsbCBiZSByZW1vdmVkIG9uIGEgc3Vic2VxdWVudCBjYWxsIHRvCisgICAgICAgICAgICAgICAgICAgIC8vICdyZWxlYXNlSW5wdXRGcmFtZXNMb2NrZWQoKScuCisgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VJbnB1dEZyYW1lTG9ja2VkKCZtUGVuZGluZ0lucHV0RnJhbWVzW2N1cnJlbnRUc10pOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50VHMgPSBJTlQ2NF9NQVg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXV0byByZXQgPSBtSW5wdXRSZWFkeUNvbmRpdGlvbi53YWl0UmVsYXRpdmUobU11dGV4LCBrV2FpdER1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IFRJTUVEX09VVCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldCAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFRpbWVkIHdhaXQgb24gY29uZGl0aW9uIGZhaWxlZDogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmV0KSwgcmV0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGF1dG8gcmVzID0gcHJvY2Vzc0lucHV0RnJhbWUobVBlbmRpbmdJbnB1dEZyYW1lc1tjdXJyZW50VHNdKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgcHJvY2Vzc2luZyBmcmFtZSB3aXRoIHRpbWVzdGFtcDogJSIgUFJJdTY0ICI6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgY3VycmVudFRzLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tjdXJyZW50VHNdLmVycm9yID0gdHJ1ZTsKKyAgICB9CisKKyAgICByZWxlYXNlSW5wdXRGcmFtZXNMb2NrZWQoY3VycmVudFRzKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIERlcHRoQ29tcG9zaXRlU3RyZWFtOjppc0RlcHRoQ29tcG9zaXRlU3RyZWFtKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSB7CisgICAgQU5hdGl2ZVdpbmRvdyAqYW53ID0gc3VyZmFjZS5nZXQoKTsKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgaW50IGZvcm1hdDsKKyAgICBpZiAoKGVyciA9IGFudy0+cXVlcnkoYW53LCBOQVRJVkVfV0lORE9XX0ZPUk1BVCwgJmZvcm1hdCkpICE9IE9LKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJGYWlsZWQgdG8gcXVlcnkgU3VyZmFjZSBmb3JtYXQ6ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwKKyAgICAgICAgICAgICAgICBlcnIpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50IGRhdGFzcGFjZTsKKyAgICBpZiAoKGVyciA9IGFudy0+cXVlcnkoYW53LCBOQVRJVkVfV0lORE9XX0RFRkFVTFRfREFUQVNQQUNFLCAmZGF0YXNwYWNlKSkgIT0gT0spIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkZhaWxlZCB0byBxdWVyeSBTdXJmYWNlIGRhdGFzcGFjZTogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLAorICAgICAgICAgICAgICAgIGVycik7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpICYmIChkYXRhc3BhY2UgPT0gSEFMX0RBVEFTUEFDRV9EWU5BTUlDX0RFUFRIKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXR1c190IERlcHRoQ29tcG9zaXRlU3RyZWFtOjpjcmVhdGVJbnRlcm5hbFN0cmVhbXMoY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBjb25zdW1lcnMsCisgICAgICAgIGJvb2wgLypoYXNEZWZlcnJlZENvbnN1bWVyKi8sIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCisgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMsIGludCAvKnN0cmVhbVNldElkKi8sIGJvb2wgLyppc1NoYXJlZCovKSB7CisgICAgaWYgKG1TdXBwb3J0ZWREZXB0aFNpemVzLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUaGlzIGNhbWVyYSBkZXZpY2UgZG9lc24ndCBzdXBwb3J0IGFueSBkZXB0aCBtYXAgc3RyZWFtcyEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc2l6ZV90IGRlcHRoV2lkdGgsIGRlcHRoSGVpZ2h0OworICAgIGF1dG8gcmV0ID0gZ2V0TWF0Y2hpbmdEZXB0aFNpemUod2lkdGgsIGhlaWdodCwgbVN1cHBvcnRlZERlcHRoU2l6ZXMsICZkZXB0aFdpZHRoLCAmZGVwdGhIZWlnaHQpOworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZmluZCBhbiBhcHByb3ByaWF0ZSBkZXB0aCBzdHJlYW0gc2l6ZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIHNwPENhbWVyYURldmljZUJhc2U+IGRldmljZSA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIGlmICghZGV2aWNlLmdldCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjYW1lcmEgZGV2aWNlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHByb2R1Y2VyOworICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IGNvbnN1bWVyOworICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgbUJsb2JDb25zdW1lciA9IG5ldyBDcHVDb25zdW1lcihjb25zdW1lciwgLyptYXhMb2NrZWRCdWZmZXJzKi8xLCAvKmNvbnRyb2xsZWRCeUFwcCovIHRydWUpOworICAgIG1CbG9iQ29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIodGhpcyk7CisgICAgbUJsb2JDb25zdW1lci0+c2V0TmFtZShTdHJpbmc4KCJDYW1lcmEzLUpwZWdDb21wb3NpdGVTdHJlYW0iKSk7CisgICAgbUJsb2JTdXJmYWNlID0gbmV3IFN1cmZhY2UocHJvZHVjZXIpOworCisgICAgcmV0ID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0obUJsb2JTdXJmYWNlLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGtKcGVnRGF0YVNwYWNlLCByb3RhdGlvbiwKKyAgICAgICAgICAgIGlkLCBwaHlzaWNhbENhbWVyYUlkLCBzdXJmYWNlSWRzKTsKKyAgICBpZiAocmV0ID09IE9LKSB7CisgICAgICAgIG1CbG9iU3RyZWFtSWQgPSAqaWQ7CisgICAgICAgIG1CbG9iU3VyZmFjZUlkID0gKCpzdXJmYWNlSWRzKVswXTsKKyAgICAgICAgbU91dHB1dFN1cmZhY2UgPSBjb25zdW1lcnNbMF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJnByb2R1Y2VyLCAmY29uc3VtZXIpOworICAgIG1EZXB0aENvbnN1bWVyID0gbmV3IENwdUNvbnN1bWVyKGNvbnN1bWVyLCAvKm1heExvY2tlZEJ1ZmZlcnMqLyAxLCAvKmNvbnRyb2xsZWRCeUFwcCovIHRydWUpOworICAgIG1EZXB0aENvbnN1bWVyLT5zZXRGcmFtZUF2YWlsYWJsZUxpc3RlbmVyKHRoaXMpOworICAgIG1EZXB0aENvbnN1bWVyLT5zZXROYW1lKFN0cmluZzgoIkNhbWVyYTMtRGVwdGhDb21wb3NpdGVTdHJlYW0iKSk7CisgICAgbURlcHRoU3VyZmFjZSA9IG5ldyBTdXJmYWNlKHByb2R1Y2VyKTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IGRlcHRoU3VyZmFjZUlkOworICAgIHJldCA9IGRldmljZS0+Y3JlYXRlU3RyZWFtKG1EZXB0aFN1cmZhY2UsIGRlcHRoV2lkdGgsIGRlcHRoSGVpZ2h0LCBrRGVwdGhNYXBQaXhlbEZvcm1hdCwKKyAgICAgICAgICAgIGtEZXB0aE1hcERhdGFTcGFjZSwgcm90YXRpb24sICZtRGVwdGhTdHJlYW1JZCwgcGh5c2ljYWxDYW1lcmFJZCwgJmRlcHRoU3VyZmFjZUlkKTsKKyAgICBpZiAocmV0ID09IE9LKSB7CisgICAgICAgIG1EZXB0aFN1cmZhY2VJZCA9IGRlcHRoU3VyZmFjZUlkWzBdOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0ID0gcmVnaXN0ZXJDb21wb3NpdGVTdHJlYW1MaXN0ZW5lcihnZXRTdHJlYW1JZCgpKTsKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlZ2lzdGVyIGJsb2Igc3RyZWFtIGxpc3RlbmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0ID0gcmVnaXN0ZXJDb21wb3NpdGVTdHJlYW1MaXN0ZW5lcihtRGVwdGhTdHJlYW1JZCk7CisgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWdpc3RlciBkZXB0aCBzdHJlYW0gbGlzdGVuZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBtQmxvYldpZHRoID0gd2lkdGg7CisgICAgbUJsb2JIZWlnaHQgPSBoZWlnaHQ7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6Y29uZmlndXJlU3RyZWFtKCkgeworICAgIGlmIChpc1J1bm5pbmcoKSkgeworICAgICAgICAvLyBQcm9jZXNzaW5nIHRocmVhZCBpcyBhbHJlYWR5IHJ1bm5pbmcsIG5vdGhpbmcgbW9yZSB0byBkby4KKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIGlmICgobURlcHRoUGhvdG9MaWJIYW5kbGUgPT0gbnVsbHB0cikgfHwgKG1EZXB0aFBob3RvUHJvY2VzcyA9PSBudWxscHRyKSkgeworICAgICAgICBBTE9HRSgiJXM6IERlcHRoIHBob3RvIGxpYnJhcnkgaXMgbm90IHByZXNlbnQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgaWYgKG1PdXRwdXRTdXJmYWNlLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyB2YWxpZCBvdXRwdXQgc3VyZmFjZSBzZXQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgYXV0byByZXMgPSBtT3V0cHV0U3VyZmFjZS0+Y29ubmVjdChOQVRJVkVfV0lORE9XX0FQSV9DQU1FUkEsIG1Qcm9kdWNlckxpc3RlbmVyKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbm5lY3QgdG8gbmF0aXZlIHdpbmRvdyBmb3Igc3RyZWFtICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1CbG9iU3RyZWFtSWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmICgocmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19mb3JtYXQobU91dHB1dFN1cmZhY2UuZ2V0KCksIEhBTF9QSVhFTF9GT1JNQVRfQkxPQikpCisgICAgICAgICAgICAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25maWd1cmUgc3RyZWFtIGJ1ZmZlciBmb3JtYXQgZm9yIHN0cmVhbSAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBtQmxvYlN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBpbnQgbWF4UHJvZHVjZXJCdWZmZXJzOworICAgIEFOYXRpdmVXaW5kb3cgKmFudyA9IG1CbG9iU3VyZmFjZS5nZXQoKTsKKyAgICBpZiAoKHJlcyA9IGFudy0+cXVlcnkoYW53LCBOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlMsICZtYXhQcm9kdWNlckJ1ZmZlcnMpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBxdWVyeSBjb25zdW1lciB1bmRlcXVldWVkIgorICAgICAgICAgICAgICAgICIgYnVmZmVyIGNvdW50IGZvciBzdHJlYW0gJWQiLCBfX0ZVTkNUSU9OX18sIG1CbG9iU3RyZWFtSWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIEFOYXRpdmVXaW5kb3cgKmFud0NvbnN1bWVyID0gbU91dHB1dFN1cmZhY2UuZ2V0KCk7CisgICAgaW50IG1heENvbnN1bWVyQnVmZmVyczsKKyAgICBpZiAoKHJlcyA9IGFud0NvbnN1bWVyLT5xdWVyeShhbndDb25zdW1lciwgTkFUSVZFX1dJTkRPV19NSU5fVU5ERVFVRVVFRF9CVUZGRVJTLAorICAgICAgICAgICAgICAgICAgICAmbWF4Q29uc3VtZXJCdWZmZXJzKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gcXVlcnkgY29uc3VtZXIgdW5kZXF1ZXVlZCIKKyAgICAgICAgICAgICAgICAiIGJ1ZmZlciBjb3VudCBmb3Igc3RyZWFtICVkIiwgX19GVU5DVElPTl9fLCBtQmxvYlN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBpZiAoKHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcl9jb3VudCgKKyAgICAgICAgICAgICAgICAgICAgYW53Q29uc3VtZXIsIG1heFByb2R1Y2VyQnVmZmVycyArIG1heENvbnN1bWVyQnVmZmVycykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHNldCBidWZmZXIgY291bnQgZm9yIHN0cmVhbSAlZCIsIF9fRlVOQ1RJT05fXywgbUJsb2JTdHJlYW1JZCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcnVuKCJEZXB0aENvbXBvc2l0ZVN0cmVhbVByb2MiKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgRGVwdGhDb21wb3NpdGVTdHJlYW06OmRlbGV0ZUludGVybmFsU3RyZWFtcygpIHsKKyAgICAvLyBUaGUgJ0NhbWVyYURldmljZUNsaWVudCcgcGFyZW50IHdpbGwgZGVsZXRlIHRoZSBibG9iIHN0cmVhbQorICAgIHJlcXVlc3RFeGl0KCk7CisKKyAgICBhdXRvIHJldCA9IGpvaW4oKTsKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGpvaW4gd2l0aCB0aGUgbWFpbiBwcm9jZXNzaW5nIHRocmVhZDogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmV0KSwgcmV0KTsKKyAgICB9CisKKyAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UgPSBtRGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoIWRldmljZS5nZXQoKSkgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgY2FtZXJhIGRldmljZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBpZiAobURlcHRoU3RyZWFtSWQgPj0gMCkgeworICAgICAgICByZXQgPSBkZXZpY2UtPmRlbGV0ZVN0cmVhbShtRGVwdGhTdHJlYW1JZCk7CisgICAgICAgIG1EZXB0aFN0cmVhbUlkID0gLTE7CisgICAgfQorCisgICAgaWYgKG1PdXRwdXRTdXJmYWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgbU91dHB1dFN1cmZhY2UtPmRpc2Nvbm5lY3QoTkFUSVZFX1dJTkRPV19BUElfQ0FNRVJBKTsKKyAgICAgICAgbU91dHB1dFN1cmZhY2UuY2xlYXIoKTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIERlcHRoQ29tcG9zaXRlU3RyZWFtOjpvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pIHsKKyAgICBpZiAoaXRlbS5tRGF0YVNwYWNlID09IGtKcGVnRGF0YVNwYWNlKSB7CisgICAgICAgIEFMT0dWKCIlczogSnBlZyBidWZmZXIgd2l0aCB0czogJSIgUFJJdTY0ICIgbXMuIGFycml2ZWQhIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbnMybXMoaXRlbS5tVGltZXN0YW1wKSk7CisKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKyAgICAgICAgaWYgKCFtRXJyb3JTdGF0ZSkgeworICAgICAgICAgICAgbUlucHV0SnBlZ0J1ZmZlcnMucHVzaF9iYWNrKGl0ZW0ubVRpbWVzdGFtcCk7CisgICAgICAgICAgICBtSW5wdXRSZWFkeUNvbmRpdGlvbi5zaWduYWwoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoaXRlbS5tRGF0YVNwYWNlID09IGtEZXB0aE1hcERhdGFTcGFjZSkgeworICAgICAgICBBTE9HVigiJXM6IERlcHRoIGJ1ZmZlciB3aXRoIHRzOiAlIiBQUkl1NjQgIiBtcy4gYXJyaXZlZCEiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICBuczJtcyhpdGVtLm1UaW1lc3RhbXApKTsKKworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgICAgICBpZiAoIW1FcnJvclN0YXRlKSB7CisgICAgICAgICAgICBtSW5wdXREZXB0aEJ1ZmZlcnMucHVzaF9iYWNrKGl0ZW0ubVRpbWVzdGFtcCk7CisgICAgICAgICAgICBtSW5wdXRSZWFkeUNvbmRpdGlvbi5zaWduYWwoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogVW5leHBlY3RlZCBkYXRhIHNwYWNlOiAweCV4IiwgX19GVU5DVElPTl9fLCBpdGVtLm1EYXRhU3BhY2UpOworICAgIH0KK30KKworc3RhdHVzX3QgRGVwdGhDb21wb3NpdGVTdHJlYW06Omluc2VydEdicChTdXJmYWNlTWFwKiAvKm91dCovb3V0U3VyZmFjZU1hcCwKKyAgICAgICAgVmVjdG9yPGludDMyX3Q+ICogLypvdXQqL291dHB1dFN0cmVhbUlkcywgaW50MzJfdCogLypvdXQqL2N1cnJlbnRTdHJlYW1JZCkgeworICAgIGlmIChvdXRTdXJmYWNlTWFwLT5maW5kKG1EZXB0aFN0cmVhbUlkKSA9PSBvdXRTdXJmYWNlTWFwLT5lbmQoKSkgeworICAgICAgICAoKm91dFN1cmZhY2VNYXApW21EZXB0aFN0cmVhbUlkXSA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtSWRzLT5wdXNoX2JhY2sobURlcHRoU3RyZWFtSWQpOworICAgIH0KKyAgICAoKm91dFN1cmZhY2VNYXApW21EZXB0aFN0cmVhbUlkXS5wdXNoX2JhY2sobURlcHRoU3VyZmFjZUlkKTsKKworICAgIGlmIChvdXRTdXJmYWNlTWFwLT5maW5kKG1CbG9iU3RyZWFtSWQpID09IG91dFN1cmZhY2VNYXAtPmVuZCgpKSB7CisgICAgICAgICgqb3V0U3VyZmFjZU1hcClbbUJsb2JTdHJlYW1JZF0gPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCk7CisgICAgICAgIG91dHB1dFN0cmVhbUlkcy0+cHVzaF9iYWNrKG1CbG9iU3RyZWFtSWQpOworICAgIH0KKyAgICAoKm91dFN1cmZhY2VNYXApW21CbG9iU3RyZWFtSWRdLnB1c2hfYmFjayhtQmxvYlN1cmZhY2VJZCk7CisKKyAgICBpZiAoY3VycmVudFN0cmVhbUlkICE9IG51bGxwdHIpIHsKKyAgICAgICAgKmN1cnJlbnRTdHJlYW1JZCA9IG1CbG9iU3RyZWFtSWQ7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIERlcHRoQ29tcG9zaXRlU3RyZWFtOjpvblJlc3VsdEVycm9yKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgeworICAgIC8vIFByb2Nlc3NpbmcgY2FuIGNvbnRpbnVlIGV2ZW4gaW4gY2FzZSBvZiByZXN1bHQgZXJyb3JzLgorICAgIC8vIEF0IHRoZSBtb21lbnQgZGVwdGggY29tcG9zaXRlIHN0cmVhbSBwcm9jZXNzaW5nIHJlbGllcyBtYWlubHkgb24gc3RhdGljIGNhbWVyYQorICAgIC8vIGNoYXJhY3RlcmlzdGljcyBkYXRhLiBUaGUgYWN0dWFsIHJlc3VsdCBkYXRhIGNhbiBiZSB1c2VkIGZvciB0aGUganBlZyBxdWFsaXR5IGJ1dAorICAgIC8vIGluIGNhc2UgaXQgaXMgYWJzZW50IHdlIGNhbiBkZWZhdWx0IHRvIG1heGltdW0uCisgICAgZXJhc2VSZXN1bHQocmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKTsKK30KKworYm9vbCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6b25TdHJlYW1CdWZmZXJFcnJvcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKKyAgICBib29sIHJldCA9IGZhbHNlOworICAgIC8vIEJ1ZmZlciBlcnJvcnMgY29uY2VybmluZyBpbnRlcm5hbCBjb21wb3NpdGUgc3RyZWFtcyBzaG91bGQgbm90IGJlIGRpcmVjdGx5IHZpc2libGUgdG8KKyAgICAvLyBjYW1lcmEgY2xpZW50cy4gVGhleSBtdXN0IG9ubHkgcmVjZWl2ZSBhIHNpbmdsZSBidWZmZXIgZXJyb3Igd2l0aCB0aGUgcHVibGljIGNvbXBvc2l0ZQorICAgIC8vIHN0cmVhbSBpZC4KKyAgICBpZiAoKHJlc3VsdEV4dHJhcy5lcnJvclN0cmVhbUlkID09IG1EZXB0aFN0cmVhbUlkKSB8fAorICAgICAgICAgICAgKHJlc3VsdEV4dHJhcy5lcnJvclN0cmVhbUlkID09IG1CbG9iU3RyZWFtSWQpKSB7CisgICAgICAgIGZsYWdBbkVycm9yRnJhbWVOdW1iZXIocmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKTsKKyAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6Z2V0TWF0Y2hpbmdEZXB0aFNpemUoc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4mIHN1cHBvcmVkRGVwdGhTaXplcywKKyAgICAgICAgc2l6ZV90ICpkZXB0aFdpZHRoIC8qb3V0Ki8sIHNpemVfdCAqZGVwdGhIZWlnaHQgLypvdXQqLykgeworICAgIGlmICgoZGVwdGhXaWR0aCA9PSBudWxscHRyKSB8fCAoZGVwdGhIZWlnaHQgPT0gbnVsbHB0cikpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBmbG9hdCBhclRvbCA9IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6a0RlcHRoQVJUb2xlcmFuY2U7CisgICAgKmRlcHRoV2lkdGggPSAqZGVwdGhIZWlnaHQgPSAwOworCisgICAgZmxvYXQgYXNwZWN0UmF0aW8gPSBzdGF0aWNfY2FzdDxmbG9hdD4gKHdpZHRoKSAvIHN0YXRpY19jYXN0PGZsb2F0PiAoaGVpZ2h0KTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogc3VwcG9yZWREZXB0aFNpemVzKSB7CisgICAgICAgIGF1dG8gY3VycmVudFdpZHRoID0gc3RkOjpnZXQ8MD4oaXQpOworICAgICAgICBhdXRvIGN1cnJlbnRIZWlnaHQgPSBzdGQ6OmdldDwxPihpdCk7CisgICAgICAgIGlmICgoY3VycmVudFdpZHRoID09IHdpZHRoKSAmJiAoY3VycmVudEhlaWdodCA9PSBoZWlnaHQpKSB7CisgICAgICAgICAgICAqZGVwdGhXaWR0aCA9IHdpZHRoOworICAgICAgICAgICAgKmRlcHRoSGVpZ2h0ID0gaGVpZ2h0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmbG9hdCBjdXJyZW50UmF0aW8gPSBzdGF0aWNfY2FzdDxmbG9hdD4gKGN1cnJlbnRXaWR0aCkgLworICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4gKGN1cnJlbnRIZWlnaHQpOworICAgICAgICAgICAgYXV0byBjdXJyZW50U2l6ZSA9IGN1cnJlbnRXaWR0aCAqIGN1cnJlbnRIZWlnaHQ7CisgICAgICAgICAgICBhdXRvIG9sZFNpemUgPSAoKmRlcHRoV2lkdGgpICogKCpkZXB0aEhlaWdodCk7CisgICAgICAgICAgICBpZiAoKGZhYnMoYXNwZWN0UmF0aW8gLSBjdXJyZW50UmF0aW8pIDw9IGFyVG9sKSAmJiAoY3VycmVudFNpemUgPiBvbGRTaXplKSkgeworICAgICAgICAgICAgICAgICpkZXB0aFdpZHRoID0gY3VycmVudFdpZHRoOworICAgICAgICAgICAgICAgICpkZXB0aEhlaWdodCA9IGN1cnJlbnRIZWlnaHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKCgqZGVwdGhXaWR0aCA+IDApICYmICgqZGVwdGhIZWlnaHQgPiAwKSkgPyBPSyA6IEJBRF9WQUxVRTsKK30KKwordm9pZCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6Z2V0U3VwcG9ydGVkRGVwdGhTaXplcyhjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2gsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiogZGVwdGhTaXplcyAvKm91dCovKSB7CisgICAgaWYgKGRlcHRoU2l6ZXMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBlbnRyeSA9IGNoLmZpbmQoQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKKyAgICBpZiAoZW50cnkuY291bnQgPiAwKSB7CisgICAgICAgIC8vIERlcHRoIHN0cmVhbSBkaW1lbnNpb25zIGhhdmUgZm91ciBpbnQzMl90IGNvbXBvbmVudHMKKyAgICAgICAgLy8gKHBpeGVsZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCB0eXBlKQorICAgICAgICBzaXplX3QgZW50cnlDb3VudCA9IGVudHJ5LmNvdW50IC8gNDsKKyAgICAgICAgZGVwdGhTaXplcy0+cmVzZXJ2ZShlbnRyeUNvdW50KTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgaSArPSA0KSB7CisgICAgICAgICAgICBpZiAoKGVudHJ5LmRhdGEuaTMyW2ldID09IGtEZXB0aE1hcFBpeGVsRm9ybWF0KSAmJgorICAgICAgICAgICAgICAgICAgICAoZW50cnkuZGF0YS5pMzJbaSszXSA9PQorICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQpKSB7CisgICAgICAgICAgICAgICAgZGVwdGhTaXplcy0+cHVzaF9iYWNrKHN0ZDo6bWFrZV90dXBsZShlbnRyeS5kYXRhLmkzMltpKzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5LmRhdGEuaTMyW2krMl0pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdHVzX3QgRGVwdGhDb21wb3NpdGVTdHJlYW06OmdldENvbXBvc2l0ZVN0cmVhbUluZm8oY29uc3QgT3V0cHV0U3RyZWFtSW5mbyAmc3RyZWFtSW5mbywKKyAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjaCwgc3RkOjp2ZWN0b3I8T3V0cHV0U3RyZWFtSW5mbz4qIGNvbXBvc2l0ZU91dHB1dCAvKm91dCovKSB7CisgICAgaWYgKGNvbXBvc2l0ZU91dHB1dCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+IGRlcHRoU2l6ZXM7CisgICAgZ2V0U3VwcG9ydGVkRGVwdGhTaXplcyhjaCwgJmRlcHRoU2l6ZXMpOworICAgIGlmIChkZXB0aFNpemVzLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBkZXB0aCBzdHJlYW0gY29uZmlndXJhdGlvbnMgcHJlc2VudCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc2l6ZV90IGRlcHRoV2lkdGgsIGRlcHRoSGVpZ2h0OworICAgIGF1dG8gcmV0ID0gZ2V0TWF0Y2hpbmdEZXB0aFNpemUoc3RyZWFtSW5mby53aWR0aCwgc3RyZWFtSW5mby5oZWlnaHQsIGRlcHRoU2l6ZXMsICZkZXB0aFdpZHRoLAorICAgICAgICAgICAgJmRlcHRoSGVpZ2h0KTsKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gbWF0Y2hpbmcgZGVwdGggc3RyZWFtIHNpemUgZm91bmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGNvbXBvc2l0ZU91dHB1dC0+Y2xlYXIoKTsKKyAgICBjb21wb3NpdGVPdXRwdXQtPmluc2VydChjb21wb3NpdGVPdXRwdXQtPmVuZCgpLCAyLCBzdHJlYW1JbmZvKTsKKworICAgIC8vIEpwZWcvQmxvYiBzdHJlYW0gaW5mbworICAgICgqY29tcG9zaXRlT3V0cHV0KVswXS5kYXRhU3BhY2UgPSBrSnBlZ0RhdGFTcGFjZTsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMF0uY29uc3VtZXJVc2FnZSA9IEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTjsKKworICAgIC8vIERlcHRoIHN0cmVhbSBpbmZvCisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzFdLndpZHRoID0gZGVwdGhXaWR0aDsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMV0uaGVpZ2h0ID0gZGVwdGhIZWlnaHQ7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzFdLmZvcm1hdCA9IGtEZXB0aE1hcFBpeGVsRm9ybWF0OworICAgICgqY29tcG9zaXRlT3V0cHV0KVsxXS5kYXRhU3BhY2UgPSBrRGVwdGhNYXBEYXRhU3BhY2U7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzFdLmNvbnN1bWVyVXNhZ2UgPSBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU47CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK307IC8vIG5hbWVzcGFjZSBjYW1lcmEzCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9EZXB0aENvbXBvc2l0ZVN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9EZXB0aENvbXBvc2l0ZVN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZjMxZjQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0RlcHRoQ29tcG9zaXRlU3RyZWFtLmgKQEAgLTAsMCArMSwxNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBM19ERVBUSF9DT01QT1NJVEVfU1RSRUFNX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkEzX0RFUFRIX0NPTVBPU0lURV9TVFJFQU1fSAorCisjaW5jbHVkZSAiY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuaCIKKyNpbmNsdWRlIDxkeW5hbWljX2RlcHRoL2ltYWdpbmdfbW9kZWwuaD4KKyNpbmNsdWRlIDxkeW5hbWljX2RlcHRoL2RlcHRoX21hcC5oPgorCisjaW5jbHVkZSA8Z3VpL0NwdUNvbnN1bWVyLmg+CisKKyNpbmNsdWRlICJDb21wb3NpdGVTdHJlYW0uaCIKKwordXNpbmcgZHluYW1pY19kZXB0aDo6RGVwdGhNYXA7Cit1c2luZyBkeW5hbWljX2RlcHRoOjpJdGVtOwordXNpbmcgZHluYW1pY19kZXB0aDo6SW1hZ2luZ01vZGVsOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIENhbWVyYURldmljZUNsaWVudDsKK2NsYXNzIENhbWVyYU1ldGFkYXRhOworY2xhc3MgU3VyZmFjZTsKKworbmFtZXNwYWNlIGNhbWVyYTMgeworCitjbGFzcyBEZXB0aENvbXBvc2l0ZVN0cmVhbSA6IHB1YmxpYyBDb21wb3NpdGVTdHJlYW0sIHB1YmxpYyBUaHJlYWQsCisgICAgICAgIHB1YmxpYyBDcHVDb25zdW1lcjo6RnJhbWVBdmFpbGFibGVMaXN0ZW5lciB7CisKK3B1YmxpYzoKKyAgICBEZXB0aENvbXBvc2l0ZVN0cmVhbSh3cDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UsCisgICAgICAgICAgICB3cDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gY2IpOworICAgIH5EZXB0aENvbXBvc2l0ZVN0cmVhbSgpIG92ZXJyaWRlOworCisgICAgc3RhdGljIGJvb2wgaXNEZXB0aENvbXBvc2l0ZVN0cmVhbShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSk7CisKKyAgICAvLyBDb21wb3NpdGVTdHJlYW0gb3ZlcnJpZGVzCisgICAgc3RhdHVzX3QgY3JlYXRlSW50ZXJuYWxTdHJlYW1zKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzLAorICAgICAgICAgICAgYm9vbCBoYXNEZWZlcnJlZENvbnN1bWVyLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAorICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMsIGludCBzdHJlYW1TZXRJZCwgYm9vbCBpc1NoYXJlZCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZGVsZXRlSW50ZXJuYWxTdHJlYW1zKCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtKCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgaW5zZXJ0R2JwKFN1cmZhY2VNYXAqIC8qb3V0Ki9vdXRTdXJmYWNlTWFwLCBWZWN0b3I8aW50MzJfdD4qIC8qb3V0Ki9vdXRwdXRTdHJlYW1JZHMsCisgICAgICAgICAgICBpbnQzMl90KiAvKm91dCovY3VycmVudFN0cmVhbUlkKSBvdmVycmlkZTsKKyAgICBpbnQgZ2V0U3RyZWFtSWQoKSBvdmVycmlkZSB7IHJldHVybiBtQmxvYlN0cmVhbUlkOyB9CisKKyAgICAvLyBDcHVDb25zdW1lciBsaXN0ZW5lciBpbXBsZW1lbnRhdGlvbgorICAgIHZvaWQgb25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiBpdGVtKSBvdmVycmlkZTsKKworICAgIC8vIFJldHVybiBzdHJlYW0gaW5mb3JtYXRpb24gYWJvdXQgdGhlIGludGVybmFsIGNhbWVyYSBzdHJlYW1zCisgICAgc3RhdGljIHN0YXR1c190IGdldENvbXBvc2l0ZVN0cmVhbUluZm8oY29uc3QgT3V0cHV0U3RyZWFtSW5mbyAmc3RyZWFtSW5mbywKKyAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjaCwgc3RkOjp2ZWN0b3I8T3V0cHV0U3RyZWFtSW5mbz4qIGNvbXBvc2l0ZU91dHB1dCAvKm91dCovKTsKKworcHJvdGVjdGVkOgorCisgICAgYm9vbCB0aHJlYWRMb29wKCkgb3ZlcnJpZGU7CisgICAgYm9vbCBvblN0cmVhbUJ1ZmZlckVycm9yKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc3VsdEVycm9yKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RydWN0IElucHV0RnJhbWUgeworICAgICAgICBDcHVDb25zdW1lcjo6TG9ja2VkQnVmZmVyIGRlcHRoQnVmZmVyOworICAgICAgICBDcHVDb25zdW1lcjo6TG9ja2VkQnVmZmVyIGpwZWdCdWZmZXI7CisgICAgICAgIENhbWVyYU1ldGFkYXRhICAgICAgICAgICAgcmVzdWx0OworICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgIGVycm9yOworICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgIGVycm9yTm90aWZpZWQ7CisgICAgICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXI7CisKKyAgICAgICAgSW5wdXRGcmFtZSgpIDogZXJyb3IoZmFsc2UpLCBlcnJvck5vdGlmaWVkKGZhbHNlKSwgZnJhbWVOdW1iZXIoLTEpIHsgfQorICAgIH07CisKKyAgICAvLyBIZWxwZXIgbWV0aG9kcworICAgIHN0YXRpYyB2b2lkIGdldFN1cHBvcnRlZERlcHRoU2l6ZXMoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGNoLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+KiBkZXB0aFNpemVzIC8qb3V0Ki8pOworICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNYXRjaGluZ0RlcHRoU2l6ZShzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4mIHN1cHBvcmVkRGVwdGhTaXplcywKKyAgICAgICAgICAgIHNpemVfdCAqZGVwdGhXaWR0aCAvKm91dCovLCBzaXplX3QgKmRlcHRoSGVpZ2h0IC8qb3V0Ki8pOworCisgICAgLy8gRHluYW1pYyBkZXB0aCBwcm9jZXNzaW5nCisgICAgc3RhdHVzX3QgZW5jb2RlR3JheXNjYWxlSnBlZyhzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsIHVpbnQ4X3QgKmluLCB2b2lkICpvdXQsCisgICAgICAgICAgICBjb25zdCBzaXplX3QgbWF4T3V0U2l6ZSwgdWludDhfdCBqcGVnUXVhbGl0eSwgc2l6ZV90ICZhY3R1YWxTaXplKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RGVwdGhNYXA+IHByb2Nlc3NEZXB0aE1hcEZyYW1lKGNvbnN0IENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXIgJmRlcHRoTWFwQnVmZmVyLAorICAgICAgICAgICAgc2l6ZV90IG1heEpwZWdTaXplLCB1aW50OF90IGpwZWdRdWFsaXR5LAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEl0ZW0+PiogaXRlbXMgLypvdXQqLyk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEltYWdpbmdNb2RlbD4gZ2V0SW1hZ2luZ01vZGVsKCk7CisgICAgc3RhdHVzX3QgcHJvY2Vzc0lucHV0RnJhbWUoY29uc3QgSW5wdXRGcmFtZSAmaW5wdXRGcmFtZSk7CisKKyAgICAvLyBCdWZmZXIvUmVzdWx0cyBoYW5kbGluZworICAgIHZvaWQgY29tcGlsZVBlbmRpbmdJbnB1dExvY2tlZCgpOworICAgIHZvaWQgcmVsZWFzZUlucHV0RnJhbWVMb2NrZWQoSW5wdXRGcmFtZSAqaW5wdXRGcmFtZSAvKm91dCovKTsKKyAgICB2b2lkIHJlbGVhc2VJbnB1dEZyYW1lc0xvY2tlZChpbnQ2NF90IGN1cnJlbnRUcyk7CisKKyAgICAvLyBGaW5kIGZpcnN0IGNvbXBsZXRlIGFuZCB2YWxpZCBmcmFtZSB3aXRoIHNtYWxsZXN0IHRpbWVzdGFtcAorICAgIGJvb2wgZ2V0TmV4dFJlYWR5SW5wdXRMb2NrZWQoaW50NjRfdCAqY3VycmVudFRzIC8qaW5vdXQqLyk7CisKKyAgICAvLyBGaW5kIG5leHQgZmFpbGluZyBmcmFtZSBudW1iZXIgd2l0aCBzbWFsbGVzdCB0aW1lc3RhbXAgYW5kIHJldHVybiByZXNwZWN0aXZlIGZyYW1lIG51bWJlcgorICAgIGludDY0X3QgZ2V0TmV4dEZhaWxpbmdJbnB1dExvY2tlZChpbnQ2NF90ICpjdXJyZW50VHMgLyppbm91dCovKTsKKworICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtXYWl0RHVyYXRpb24gPSAxMDAwMDAwMDsgLy8gMTAgbXMKKyAgICBzdGF0aWMgY29uc3QgYXV0byBrRGVwdGhNYXBQaXhlbEZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWTE2OworICAgIHN0YXRpYyBjb25zdCBhdXRvIGtEZXB0aE1hcERhdGFTcGFjZSA9IEhBTF9EQVRBU1BBQ0VfREVQVEg7CisgICAgc3RhdGljIGNvbnN0IGF1dG8ga0pwZWdEYXRhU3BhY2UgPSBIQUxfREFUQVNQQUNFX1YwX0pGSUY7CisKKyAgICBpbnQgICAgICAgICAgICAgICAgICBtQmxvYlN0cmVhbUlkLCBtQmxvYlN1cmZhY2VJZCwgbURlcHRoU3RyZWFtSWQsIG1EZXB0aFN1cmZhY2VJZDsKKyAgICBzaXplX3QgICAgICAgICAgICAgICBtQmxvYldpZHRoLCBtQmxvYkhlaWdodDsKKyAgICBzcDxDcHVDb25zdW1lcj4gICAgICBtQmxvYkNvbnN1bWVyLCBtRGVwdGhDb25zdW1lcjsKKyAgICBib29sICAgICAgICAgICAgICAgICBtRGVwdGhCdWZmZXJBY3F1aXJlZCwgbUJsb2JCdWZmZXJBY3F1aXJlZDsKKyAgICBzcDxTdXJmYWNlPiAgICAgICAgICBtRGVwdGhTdXJmYWNlLCBtQmxvYlN1cmZhY2UsIG1PdXRwdXRTdXJmYWNlOworICAgIHNwPFByb2R1Y2VyTGlzdGVuZXI+IG1Qcm9kdWNlckxpc3RlbmVyOworCisgICAgc3NpemVfdCAgICAgICAgICAgICAgbU1heEpwZWdTaXplOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiBtU3VwcG9ydGVkRGVwdGhTaXplczsKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gICBtSW5zdHJpbnNpY0NhbGlicmF0aW9uLCBtTGVuc0Rpc3RvcnRpb247CisgICAgYm9vbCAgICAgICAgICAgICAgICAgbUlzTG9naWNhbENhbWVyYTsKKyAgICB2b2lkKiAgICAgICAgICAgICAgICBtRGVwdGhQaG90b0xpYkhhbmRsZTsKKyAgICBwcm9jZXNzX2RlcHRoX3Bob3RvX2ZyYW1lIG1EZXB0aFBob3RvUHJvY2VzczsKKworICAgIC8vIEtlZXAgYWxsIGluY29taW5nIERlcHRoIGJ1ZmZlciB0aW1lc3RhbXBzIHBlbmRpbmcgZnVydGhlciBwcm9jZXNzaW5nLgorICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IG1JbnB1dERlcHRoQnVmZmVyczsKKworICAgIC8vIEtlZXAgYWxsIGluY29taW5nIEpwZWcvQmxvYiBidWZmZXIgdGltZXN0YW1wcyBwZW5kaW5nIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBtSW5wdXRKcGVnQnVmZmVyczsKKworICAgIC8vIE1hcCBvZiBhbGwgaW5wdXQgZnJhbWVzIHBlbmRpbmcgZnVydGhlciBwcm9jZXNzaW5nLgorICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQ2NF90LCBJbnB1dEZyYW1lPiBtUGVuZGluZ0lucHV0RnJhbWVzOworfTsKKworfTsgLy9uYW1lc3BhY2UgY2FtZXJhMworfTsgLy9uYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0NvbXBvc2l0ZVN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhODcxMzQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uY3BwCkBAIC0wLDAgKzEsMTcxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQ2FtZXJhMy1IZWljQ29tcG9zaXRlU3RyZWFtIgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxsaW51eC9tZW1mZC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNS90eXBlcy5oPgorI2luY2x1ZGUgPGxpYnl1di5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKworI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorCisjaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKKyNpbmNsdWRlICJ1dGlscy9FeGlmVXRpbHMuaCIKKyNpbmNsdWRlICJIZWljRW5jb2RlckluZm9NYW5hZ2VyLmgiCisjaW5jbHVkZSAiSGVpY0NvbXBvc2l0ZVN0cmVhbS5oIgorCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkNhbWVyYUJsb2I7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkNhbWVyYUJsb2JJZDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworCitIZWljQ29tcG9zaXRlU3RyZWFtOjpIZWljQ29tcG9zaXRlU3RyZWFtKHdwPENhbWVyYURldmljZUJhc2U+IGRldmljZSwKKyAgICAgICAgd3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IGNiKSA6CisgICAgICAgIENvbXBvc2l0ZVN0cmVhbShkZXZpY2UsIGNiKSwKKyAgICAgICAgbVVzZUhlaWMoZmFsc2UpLAorICAgICAgICBtTnVtT3V0cHV0VGlsZXMoMSksCisgICAgICAgIG1PdXRwdXRXaWR0aCgwKSwKKyAgICAgICAgbU91dHB1dEhlaWdodCgwKSwKKyAgICAgICAgbU1heEhlaWNCdWZmZXJTaXplKDApLAorICAgICAgICBtR3JpZFdpZHRoKEhlaWNFbmNvZGVySW5mb01hbmFnZXI6OmtHcmlkV2lkdGgpLAorICAgICAgICBtR3JpZEhlaWdodChIZWljRW5jb2RlckluZm9NYW5hZ2VyOjprR3JpZEhlaWdodCksCisgICAgICAgIG1HcmlkUm93cygxKSwKKyAgICAgICAgbUdyaWRDb2xzKDEpLAorICAgICAgICBtVXNlR3JpZChmYWxzZSksCisgICAgICAgIG1BcHBTZWdtZW50U3RyZWFtSWQoLTEpLAorICAgICAgICBtQXBwU2VnbWVudFN1cmZhY2VJZCgtMSksCisgICAgICAgIG1BcHBTZWdtZW50QnVmZmVyQWNxdWlyZWQoZmFsc2UpLAorICAgICAgICBtTWFpbkltYWdlU3RyZWFtSWQoLTEpLAorICAgICAgICBtTWFpbkltYWdlU3VyZmFjZUlkKC0xKSwKKyAgICAgICAgbVl1dkJ1ZmZlckFjcXVpcmVkKGZhbHNlKSwKKyAgICAgICAgbVByb2R1Y2VyTGlzdGVuZXIobmV3IFByb2R1Y2VyTGlzdGVuZXIoKSksCisgICAgICAgIG1PdXRwdXRCdWZmZXJDb3VudGVyKDApLAorICAgICAgICBtR3JpZFRpbWVzdGFtcFVzKDApIHsKK30KKworSGVpY0NvbXBvc2l0ZVN0cmVhbTo6fkhlaWNDb21wb3NpdGVTdHJlYW0oKSB7CisgICAgLy8gQ2FsbCBkZWluaXRDb2RlYyBpbiBjYXNlIHN0cmVhbSBoYXNuJ3QgYmVlbiBkZWxldGVkIHlldCB0byBhdm9pZCBhbnkKKyAgICAvLyBtZW1vcnkvcmVzb3VyY2UgbGVhay4KKyAgICBkZWluaXRDb2RlYygpOworCisgICAgbUlucHV0QXBwU2VnbWVudEJ1ZmZlcnMuY2xlYXIoKTsKKyAgICBtQ29kZWNPdXRwdXRCdWZmZXJzLmNsZWFyKCk7CisKKyAgICBtQXBwU2VnbWVudFN0cmVhbUlkID0gLTE7CisgICAgbUFwcFNlZ21lbnRTdXJmYWNlSWQgPSAtMTsKKyAgICBtQXBwU2VnbWVudENvbnN1bWVyLmNsZWFyKCk7CisgICAgbUFwcFNlZ21lbnRTdXJmYWNlLmNsZWFyKCk7CisKKyAgICBtTWFpbkltYWdlU3RyZWFtSWQgPSAtMTsKKyAgICBtTWFpbkltYWdlU3VyZmFjZUlkID0gLTE7CisgICAgbU1haW5JbWFnZUNvbnN1bWVyLmNsZWFyKCk7CisgICAgbU1haW5JbWFnZVN1cmZhY2UuY2xlYXIoKTsKK30KKworYm9vbCBIZWljQ29tcG9zaXRlU3RyZWFtOjppc0hlaWNDb21wb3NpdGVTdHJlYW0oY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKKyAgICBBTmF0aXZlV2luZG93ICphbncgPSBzdXJmYWNlLmdldCgpOworICAgIHN0YXR1c190IGVycjsKKyAgICBpbnQgZm9ybWF0OworICAgIGlmICgoZXJyID0gYW53LT5xdWVyeShhbncsIE5BVElWRV9XSU5ET1dfRk9STUFULCAmZm9ybWF0KSkgIT0gT0spIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkZhaWxlZCB0byBxdWVyeSBTdXJmYWNlIGZvcm1hdDogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLAorICAgICAgICAgICAgICAgIGVycik7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQgZGF0YXNwYWNlOworICAgIGlmICgoZXJyID0gYW53LT5xdWVyeShhbncsIE5BVElWRV9XSU5ET1dfREVGQVVMVF9EQVRBU1BBQ0UsICZkYXRhc3BhY2UpKSAhPSBPSykgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiRmFpbGVkIHRvIHF1ZXJ5IFN1cmZhY2UgZGF0YXNwYWNlOiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksCisgICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiAoKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpICYmIChkYXRhc3BhY2UgPT0gSEFMX0RBVEFTUEFDRV9IRUlGKSk7Cit9CisKK3N0YXR1c190IEhlaWNDb21wb3NpdGVTdHJlYW06OmNyZWF0ZUludGVybmFsU3RyZWFtcyhjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycywKKyAgICAgICAgYm9vbCAvKmhhc0RlZmVycmVkQ29uc3VtZXIqLywgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKKyAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcywgaW50IC8qc3RyZWFtU2V0SWQqLywgYm9vbCAvKmlzU2hhcmVkKi8pIHsKKworICAgIHNwPENhbWVyYURldmljZUJhc2U+IGRldmljZSA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIGlmICghZGV2aWNlLmdldCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjYW1lcmEgZGV2aWNlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHN0YXR1c190IHJlcyA9IGluaXRpYWxpemVDb2RlYyh3aWR0aCwgaGVpZ2h0LCBkZXZpY2UpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBIRUlDL0hFVkMgY29kZWM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHByb2R1Y2VyOworICAgIHNwPElHcmFwaGljQnVmZmVyQ29uc3VtZXI+IGNvbnN1bWVyOworICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgbUFwcFNlZ21lbnRDb25zdW1lciA9IG5ldyBDcHVDb25zdW1lcihjb25zdW1lciwgMSk7CisgICAgbUFwcFNlZ21lbnRDb25zdW1lci0+c2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcih0aGlzKTsKKyAgICBtQXBwU2VnbWVudENvbnN1bWVyLT5zZXROYW1lKFN0cmluZzgoIkNhbWVyYTMtSGVpY0NvbXBvc2l0ZS1BcHBTZWdtZW50U3RyZWFtIikpOworICAgIG1BcHBTZWdtZW50U3VyZmFjZSA9IG5ldyBTdXJmYWNlKHByb2R1Y2VyKTsKKworICAgIG1TdGF0aWNJbmZvID0gZGV2aWNlLT5pbmZvKCk7CisKKyAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZVN0cmVhbShtQXBwU2VnbWVudFN1cmZhY2UsIG1BcHBTZWdtZW50TWF4U2l6ZSwgMSwgZm9ybWF0LAorICAgICAgICAgICAga0FwcFNlZ21lbnREYXRhU3BhY2UsIHJvdGF0aW9uLCAmbUFwcFNlZ21lbnRTdHJlYW1JZCwgcGh5c2ljYWxDYW1lcmFJZCwgc3VyZmFjZUlkcyk7CisgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICBtQXBwU2VnbWVudFN1cmZhY2VJZCA9ICgqc3VyZmFjZUlkcylbMF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIEpQRUcgQXBwIHNlZ21lbnQgc3RyZWFtOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmICghbVVzZUdyaWQpIHsKKyAgICAgICAgcmVzID0gbUNvZGVjLT5jcmVhdGVJbnB1dFN1cmZhY2UoJnByb2R1Y2VyKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIGlucHV0IHN1cmZhY2UgZm9yIEhlaWMgY29kZWM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgICAgIG1NYWluSW1hZ2VDb25zdW1lciA9IG5ldyBDcHVDb25zdW1lcihjb25zdW1lciwgMSk7CisgICAgICAgIG1NYWluSW1hZ2VDb25zdW1lci0+c2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgbU1haW5JbWFnZUNvbnN1bWVyLT5zZXROYW1lKFN0cmluZzgoIkNhbWVyYTMtSGVpY0NvbXBvc2l0ZS1IZXZjSW5wdXRZVVZTdHJlYW0iKSk7CisgICAgfQorICAgIG1NYWluSW1hZ2VTdXJmYWNlID0gbmV3IFN1cmZhY2UocHJvZHVjZXIpOworCisgICAgcmVzID0gbUNvZGVjLT5zdGFydCgpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gc3RhcnQgY29kZWM6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8aW50PiBzb3VyY2VTdXJmYWNlSWQ7CisgICAgLy9Vc2UgWVVWXzg4OCBmb3JtYXQgaWYgZnJhbWV3b3JrIHRpbGluZyBpcyBuZWVkZWQuCisgICAgaW50IHNyY1N0cmVhbUZtdCA9IG1Vc2VHcmlkID8gSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4IDoKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDsKKyAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZVN0cmVhbShtTWFpbkltYWdlU3VyZmFjZSwgd2lkdGgsIGhlaWdodCwgc3JjU3RyZWFtRm10LCBrSGVpZkRhdGFTcGFjZSwKKyAgICAgICAgICAgIHJvdGF0aW9uLCBpZCwgcGh5c2ljYWxDYW1lcmFJZCwgJnNvdXJjZVN1cmZhY2VJZCk7CisgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICBtTWFpbkltYWdlU3VyZmFjZUlkID0gc291cmNlU3VyZmFjZUlkWzBdOworICAgICAgICBtTWFpbkltYWdlU3RyZWFtSWQgPSAqaWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIG1haW4gaW1hZ2Ugc3RyZWFtOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIG1PdXRwdXRTdXJmYWNlID0gY29uc3VtZXJzWzBdOworICAgIHJlcyA9IHJlZ2lzdGVyQ29tcG9zaXRlU3RyZWFtTGlzdGVuZXIoZ2V0U3RyZWFtSWQoKSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWdpc3RlciBIQUwgbWFpbiBpbWFnZSBzdHJlYW0iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGluaXRDb3B5Um93RnVuY3Rpb24od2lkdGgpOworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXR1c190IEhlaWNDb21wb3NpdGVTdHJlYW06OmRlbGV0ZUludGVybmFsU3RyZWFtcygpIHsKKyAgICByZXF1ZXN0RXhpdCgpOworICAgIGF1dG8gcmVzID0gam9pbigpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gam9pbiB3aXRoIHRoZSBtYWluIHByb2Nlc3NpbmcgdGhyZWFkOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgIH0KKworICAgIGRlaW5pdENvZGVjKCk7CisKKyAgICBpZiAobUFwcFNlZ21lbnRTdHJlYW1JZCA+PSAwKSB7CisgICAgICAgIHNwPENhbWVyYURldmljZUJhc2U+IGRldmljZSA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgICAgICBpZiAoIWRldmljZS5nZXQoKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNhbWVyYSBkZXZpY2UhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CisKKyAgICAgICAgcmVzID0gZGV2aWNlLT5kZWxldGVTdHJlYW0obUFwcFNlZ21lbnRTdHJlYW1JZCk7CisgICAgICAgIG1BcHBTZWdtZW50U3RyZWFtSWQgPSAtMTsKKyAgICB9CisKKyAgICBpZiAobU91dHB1dFN1cmZhY2UgIT0gbnVsbHB0cikgeworICAgICAgICBtT3V0cHV0U3VyZmFjZS0+ZGlzY29ubmVjdChOQVRJVkVfV0lORE9XX0FQSV9DQU1FUkEpOworICAgICAgICBtT3V0cHV0U3VyZmFjZS5jbGVhcigpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCit2b2lkIEhlaWNDb21wb3NpdGVTdHJlYW06Om9uQnVmZmVyUmVsZWFzZWQoY29uc3QgQnVmZmVySW5mbyYgYnVmZmVySW5mbykgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisKKyAgICBpZiAoYnVmZmVySW5mby5tRXJyb3IpIHJldHVybjsKKworICAgIG1Db2RlY091dHB1dEJ1ZmZlclRpbWVzdGFtcHMucHVzaChidWZmZXJJbmZvLm1UaW1lc3RhbXApOworfQorCisvLyBXZSBuZWVkIHRvIGdldCB0aGUgc2V0dGluZ3MgZWFybHkgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBjb2RlYyBvdXRwdXQKKy8vIGFycml2ZXMgZWFybGllciB0aGFuIHJlc3VsdCBtZXRhZGF0YS4KK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6b25CdWZmZXJSZXF1ZXN0Rm9yRnJhbWVOdW1iZXIodWludDY0X3QgZnJhbWVOdW1iZXIsIGludCBzdHJlYW1JZCwKKyAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHNldHRpbmdzKSB7CisgICAgQVRSQUNFX0FTWU5DX0JFR0lOKCJIRUlDIGNhcHR1cmUiLCBmcmFtZU51bWJlcik7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgIGlmIChtRXJyb3JTdGF0ZSB8fCAoc3RyZWFtSWQgIT0gZ2V0U3RyZWFtSWQoKSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1QZW5kaW5nQ2FwdHVyZVJlc3VsdHMuZW1wbGFjZShmcmFtZU51bWJlciwgQ2FtZXJhTWV0YWRhdGEoKSk7CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgZW50cnk7CisKKyAgICBpbnQzMl90IG9yaWVudGF0aW9uID0gMDsKKyAgICBlbnRyeSA9IHNldHRpbmdzLmZpbmQoQU5EUk9JRF9KUEVHX09SSUVOVEFUSU9OKTsKKyAgICBpZiAoZW50cnkuY291bnQgPT0gMSkgeworICAgICAgICBvcmllbnRhdGlvbiA9IGVudHJ5LmRhdGEuaTMyWzBdOworICAgIH0KKworICAgIGludDMyX3QgcXVhbGl0eSA9IGtEZWZhdWx0SnBlZ1F1YWxpdHk7CisgICAgZW50cnkgPSBzZXR0aW5ncy5maW5kKEFORFJPSURfSlBFR19RVUFMSVRZKTsKKyAgICBpZiAoZW50cnkuY291bnQgPT0gMSkgeworICAgICAgICBxdWFsaXR5ID0gZW50cnkuZGF0YS5pMzJbMF07CisgICAgfQorCisgICAgbVNldHRpbmdzQnlGcmFtZU51bWJlcltmcmFtZU51bWJlcl0gPSBzdGQ6Om1ha2VfcGFpcihvcmllbnRhdGlvbiwgcXVhbGl0eSk7Cit9CisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6b25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiBpdGVtKSB7CisgICAgaWYgKGl0ZW0ubURhdGFTcGFjZSA9PSBzdGF0aWNfY2FzdDxhbmRyb2lkX2RhdGFzcGFjZT4oa0FwcFNlZ21lbnREYXRhU3BhY2UpKSB7CisgICAgICAgIEFMT0dWKCIlczogSlBFRyBBUFAgc2VnbWVudHMgYnVmZmVyIHdpdGggdHM6ICUiIFBSSXU2NCAiIG1zLiBhcnJpdmVkISIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG5zMm1zKGl0ZW0ubVRpbWVzdGFtcCkpOworCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgICAgIGlmICghbUVycm9yU3RhdGUpIHsKKyAgICAgICAgICAgIG1JbnB1dEFwcFNlZ21lbnRCdWZmZXJzLnB1c2hfYmFjayhpdGVtLm1UaW1lc3RhbXApOworICAgICAgICAgICAgbUlucHV0UmVhZHlDb25kaXRpb24uc2lnbmFsKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGl0ZW0ubURhdGFTcGFjZSA9PSBrSGVpZkRhdGFTcGFjZSkgeworICAgICAgICBBTE9HVigiJXM6IFlVVl84ODggYnVmZmVyIHdpdGggdHM6ICUiIFBSSXU2NCAiIG1zLiBhcnJpdmVkISIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG5zMm1zKGl0ZW0ubVRpbWVzdGFtcCkpOworCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgICAgIGlmICghbVVzZUdyaWQpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogWVVWXzg4OCBpbnRlcm5hbCBzdHJlYW0gaXMgb25seSBzdXBwb3J0ZWQgZm9yIEhFVkMgdGlsaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1FcnJvclN0YXRlKSB7CisgICAgICAgICAgICBtSW5wdXRZdXZCdWZmZXJzLnB1c2hfYmFjayhpdGVtLm1UaW1lc3RhbXApOworICAgICAgICAgICAgbUlucHV0UmVhZHlDb25kaXRpb24uc2lnbmFsKCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQgZGF0YSBzcGFjZTogMHgleCIsIF9fRlVOQ1RJT05fXywgaXRlbS5tRGF0YVNwYWNlKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEhlaWNDb21wb3NpdGVTdHJlYW06OmdldENvbXBvc2l0ZVN0cmVhbUluZm8oY29uc3QgT3V0cHV0U3RyZWFtSW5mbyAmc3RyZWFtSW5mbywKKyAgICAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjaCwgc3RkOjp2ZWN0b3I8T3V0cHV0U3RyZWFtSW5mbz4qIGNvbXBvc2l0ZU91dHB1dCAvKm91dCovKSB7CisgICAgaWYgKGNvbXBvc2l0ZU91dHB1dCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgY29tcG9zaXRlT3V0cHV0LT5jbGVhcigpOworCisgICAgYm9vbCB1c2VHcmlkLCB1c2VIZWljOworICAgIGJvb2wgaXNTaXplU3VwcG9ydGVkID0gaXNTaXplU3VwcG9ydGVkQnlIZWlmRW5jb2RlcigKKyAgICAgICAgICAgIHN0cmVhbUluZm8ud2lkdGgsIHN0cmVhbUluZm8uaGVpZ2h0LCAmdXNlSGVpYywgJnVzZUdyaWQsIG51bGxwdHIpOworICAgIGlmICghaXNTaXplU3VwcG9ydGVkKSB7CisgICAgICAgIC8vIFNpemUgaXMgbm90IHN1cHBvcnRlZCBieSBlaXRoZXIgZW5jb2Rlci4KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGNvbXBvc2l0ZU91dHB1dC0+aW5zZXJ0KGNvbXBvc2l0ZU91dHB1dC0+ZW5kKCksIDIsIHN0cmVhbUluZm8pOworCisgICAgLy8gSlBFRyBBUFBTIHNlZ21lbnRzIEJsb2Igc3RyZWFtIGluZm8KKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMF0ud2lkdGggPSBjYWxjQXBwU2VnbWVudE1heFNpemUoY2gpOworICAgICgqY29tcG9zaXRlT3V0cHV0KVswXS5oZWlnaHQgPSAxOworICAgICgqY29tcG9zaXRlT3V0cHV0KVswXS5mb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX0JMT0I7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzBdLmRhdGFTcGFjZSA9IGtBcHBTZWdtZW50RGF0YVNwYWNlOworICAgICgqY29tcG9zaXRlT3V0cHV0KVswXS5jb25zdW1lclVzYWdlID0gR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOOworCisgICAgLy8gWVVWL0lNUExFTUVOVEFUSU9OX0RFRklORUQgc3RyZWFtIGluZm8KKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMV0ud2lkdGggPSBzdHJlYW1JbmZvLndpZHRoOworICAgICgqY29tcG9zaXRlT3V0cHV0KVsxXS5oZWlnaHQgPSBzdHJlYW1JbmZvLmhlaWdodDsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMV0uZm9ybWF0ID0gdXNlR3JpZCA/IEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwXzg4OCA6CisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzFdLmRhdGFTcGFjZSA9IGtIZWlmRGF0YVNwYWNlOworICAgICgqY29tcG9zaXRlT3V0cHV0KVsxXS5jb25zdW1lclVzYWdlID0gdXNlSGVpYyA/IEdSQUxMT0NfVVNBR0VfSFdfSU1BR0VfRU5DT0RFUiA6CisgICAgICAgICAgICB1c2VHcmlkID8gR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIDogR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitib29sIEhlaWNDb21wb3NpdGVTdHJlYW06OmlzU2l6ZVN1cHBvcnRlZEJ5SGVpZkVuY29kZXIoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCisgICAgICAgIGJvb2wqIHVzZUhlaWMsIGJvb2wqIHVzZUdyaWQsIGludDY0X3QqIHN0YWxsLCBBU3RyaW5nKiBoZXZjTmFtZSkgeworICAgIHN0YXRpYyBIZWljRW5jb2RlckluZm9NYW5hZ2VyJiBoZWljTWFuYWdlciA9IEhlaWNFbmNvZGVySW5mb01hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgcmV0dXJuIGhlaWNNYW5hZ2VyLmlzU2l6ZVN1cHBvcnRlZCh3aWR0aCwgaGVpZ2h0LCB1c2VIZWljLCB1c2VHcmlkLCBzdGFsbCwgaGV2Y05hbWUpOworfQorCitib29sIEhlaWNDb21wb3NpdGVTdHJlYW06OmlzSW5NZW1vcnlUZW1wRmlsZVN1cHBvcnRlZCgpIHsKKyAgICBpbnQgbWVtZmQgPSBzeXNjYWxsKF9fTlJfbWVtZmRfY3JlYXRlLCAiSEVJRi10cnktbWVtZmQiLCBNRkRfQ0xPRVhFQyk7CisgICAgaWYgKG1lbWZkID09IC0xKSB7CisgICAgICAgIGlmIChlcnJubyAhPSBFTk9TWVMpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNyZWF0ZSB0bXBmcyBmaWxlLiBlcnJubyAlZCIsIF9fRlVOQ1RJT05fXywgZXJybm8pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY2xvc2UobWVtZmQpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEhlaWNDb21wb3NpdGVTdHJlYW06Om9uSGVpY091dHB1dEZyYW1lQXZhaWxhYmxlKAorICAgICAgICBjb25zdCBDb2RlY091dHB1dEJ1ZmZlckluZm8mIG91dHB1dEJ1ZmZlckluZm8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworCisgICAgQUxPR1YoIiVzOiBpbmRleCAlZCwgb2Zmc2V0ICVkLCBzaXplICVkLCB0aW1lICUiIFBSSWQ2NCAiLCBmbGFncyAweCV4IiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgb3V0cHV0QnVmZmVySW5mby5pbmRleCwgb3V0cHV0QnVmZmVySW5mby5vZmZzZXQsCisgICAgICAgICAgICBvdXRwdXRCdWZmZXJJbmZvLnNpemUsIG91dHB1dEJ1ZmZlckluZm8udGltZVVzLCBvdXRwdXRCdWZmZXJJbmZvLmZsYWdzKTsKKworICAgIGlmICghbUVycm9yU3RhdGUpIHsKKyAgICAgICAgaWYgKChvdXRwdXRCdWZmZXJJbmZvLnNpemUgPiAwKSAmJgorICAgICAgICAgICAgICAgICgob3V0cHV0QnVmZmVySW5mby5mbGFncyAmIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0NPREVDQ09ORklHKSA9PSAwKSkgeworICAgICAgICAgICAgbUNvZGVjT3V0cHV0QnVmZmVycy5wdXNoX2JhY2sob3V0cHV0QnVmZmVySW5mbyk7CisgICAgICAgICAgICBtSW5wdXRSZWFkeUNvbmRpdGlvbi5zaWduYWwoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Db2RlYy0+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+YW5iID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6cmVsZWFzZUlucHV0RnJhbWVzTG9ja2VkKGludDY0X3QgY3VycmVudFRzKSB7CisgICAgYXV0byBpdCA9IG1QZW5kaW5nSW5wdXRGcmFtZXMuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gbVBlbmRpbmdJbnB1dEZyYW1lcy5lbmQoKSkgeworICAgICAgICBpZiAoaXQtPmZpcnN0IDw9IGN1cnJlbnRUcykgeworICAgICAgICAgICAgcmVsZWFzZUlucHV0RnJhbWVMb2NrZWQoJml0LT5zZWNvbmQpOworICAgICAgICAgICAgaXQgPSBtUGVuZGluZ0lucHV0RnJhbWVzLmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGl0Kys7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IEhlaWNDb21wb3NpdGVTdHJlYW06OmluaXRpYWxpemVDb2RlYyh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiYgY2FtZXJhRGV2aWNlKSB7CisgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKKworICAgIGJvb2wgdXNlR3JpZCA9IGZhbHNlOworICAgIEFTdHJpbmcgaGV2Y05hbWU7CisgICAgYm9vbCBpc1NpemVTdXBwb3J0ZWQgPSBpc1NpemVTdXBwb3J0ZWRCeUhlaWZFbmNvZGVyKHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAmbVVzZUhlaWMsICZ1c2VHcmlkLCBudWxscHRyLCAmaGV2Y05hbWUpOworICAgIGlmICghaXNTaXplU3VwcG9ydGVkKSB7CisgICAgICAgIEFMT0dFKCIlczogRW5jb2RlciBkb2VzbnQnIHN1cHBvcnQgc2l6ZSAldSB4ICV1ISIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgTG9vcGVyIGZvciBNZWRpYUNvZGVjLgorICAgIGF1dG8gZGVzaXJlZE1pbWUgPSBtVXNlSGVpYyA/IE1JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQyA6IE1JTUVUWVBFX1ZJREVPX0hFVkM7CisgICAgbUNvZGVjTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgbUNvZGVjTG9vcGVyLT5zZXROYW1lKCJDYW1lcmEzLUhlaWNDb21wb3NpdGUtTWVkaWFDb2RlY0xvb3BlciIpOworICAgIHN0YXR1c190IHJlcyA9IG1Db2RlY0xvb3Blci0+c3RhcnQoCisgICAgICAgICAgICBmYWxzZSwgICAvLyBydW5PbkNhbGxpbmdUaHJlYWQKKyAgICAgICAgICAgIGZhbHNlLCAgICAvLyBjYW5DYWxsSmF2YQorICAgICAgICAgICAgUFJJT1JJVFlfQVVESU8pOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gc3RhcnQgY29kZWMgbG9vcGVyOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgSEVJQy9IRVZDIGNvZGVjLgorICAgIGlmIChtVXNlSGVpYykgeworICAgICAgICBtQ29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeVR5cGUobUNvZGVjTG9vcGVyLCBkZXNpcmVkTWltZSwgdHJ1ZSAvKmVuY29kZXIqLyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKG1Db2RlY0xvb3BlciwgaGV2Y05hbWUpOworICAgIH0KKyAgICBpZiAobUNvZGVjID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIGNvZGVjIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgZGVzaXJlZE1pbWUpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgTG9vcGVyIGFuZCBoYW5kbGVyIGZvciBDb2RlYyBjYWxsYmFjay4KKyAgICBtQ29kZWNDYWxsYmFja0hhbmRsZXIgPSBuZXcgQ29kZWNDYWxsYmFja0hhbmRsZXIodGhpcyk7CisgICAgaWYgKG1Db2RlY0NhbGxiYWNrSGFuZGxlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNyZWF0ZSBjb2RlYyBjYWxsYmFjayBoYW5kbGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgbUNhbGxiYWNrTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgbUNhbGxiYWNrTG9vcGVyLT5zZXROYW1lKCJDYW1lcmEzLUhlaWNDb21wb3NpdGUtTWVkaWFDb2RlY0NhbGxiYWNrTG9vcGVyIik7CisgICAgcmVzID0gbUNhbGxiYWNrTG9vcGVyLT5zdGFydCgKKyAgICAgICAgICAgIGZhbHNlLCAgIC8vIHJ1bk9uQ2FsbGluZ1RocmVhZAorICAgICAgICAgICAgZmFsc2UsICAgIC8vIGNhbkNhbGxKYXZhCisgICAgICAgICAgICBQUklPUklUWV9BVURJTyk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBzdGFydCBtZWRpYSBjYWxsYmFjayBsb29wZXI6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBtQ2FsbGJhY2tMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtQ29kZWNDYWxsYmFja0hhbmRsZXIpOworCisgICAgbUFzeW5jTm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FsbGJhY2tOb3RpZnksIG1Db2RlY0NhbGxiYWNrSGFuZGxlcik7CisgICAgcmVzID0gbUNvZGVjLT5zZXRDYWxsYmFjayhtQXN5bmNOb3RpZnkpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gc2V0IE1lZGlhQ29kZWMgY2FsbGJhY2s6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIG91dHB1dCBmb3JtYXQgYW5kIGNvbmZpZ3VyZSB0aGUgQ29kZWMuCisgICAgc3A8QU1lc3NhZ2U+IG91dHB1dEZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOworICAgIG91dHB1dEZvcm1hdC0+c2V0U3RyaW5nKEtFWV9NSU1FLCBkZXNpcmVkTWltZSk7CisgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfQklUUkFURV9NT0RFLCBCSVRSQVRFX01PREVfQ1EpOworICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX1FVQUxJVFksIGtEZWZhdWx0SnBlZ1F1YWxpdHkpOworICAgIC8vIEFzayBjb2RlYyB0byBza2lwIHRpbWVzdGFtcCBjaGVjayBhbmQgZW5jb2RlIGFsbCBmcmFtZXMuCisgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQ2NChLRVlfTUFYX1BUU19HQVBfVE9fRU5DT0RFUiwga05vRnJhbWVEcm9wTWF4UHRzR2FwKTsKKworICAgIGludDMyX3QgZ3JpZFdpZHRoLCBncmlkSGVpZ2h0LCBncmlkUm93cywgZ3JpZENvbHM7CisgICAgaWYgKHVzZUdyaWQgfHwgbVVzZUhlaWMpIHsKKyAgICAgICAgZ3JpZFdpZHRoID0gSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6a0dyaWRXaWR0aDsKKyAgICAgICAgZ3JpZEhlaWdodCA9IEhlaWNFbmNvZGVySW5mb01hbmFnZXI6OmtHcmlkSGVpZ2h0OworICAgICAgICBncmlkUm93cyA9IChoZWlnaHQgKyBncmlkSGVpZ2h0IC0gMSkvZ3JpZEhlaWdodDsKKyAgICAgICAgZ3JpZENvbHMgPSAod2lkdGggKyBncmlkV2lkdGggLSAxKS9ncmlkV2lkdGg7CisKKyAgICAgICAgaWYgKG1Vc2VIZWljKSB7CisgICAgICAgICAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9USUxFX1dJRFRILCBncmlkV2lkdGgpOworICAgICAgICAgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfVElMRV9IRUlHSFQsIGdyaWRIZWlnaHQpOworICAgICAgICAgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfR1JJRF9DT0xVTU5TLCBncmlkQ29scyk7CisgICAgICAgICAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9HUklEX1JPV1MsIGdyaWRSb3dzKTsKKyAgICAgICAgfQorCisgICAgfSBlbHNlIHsKKyAgICAgICAgZ3JpZFdpZHRoID0gd2lkdGg7CisgICAgICAgIGdyaWRIZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIGdyaWRSb3dzID0gMTsKKyAgICAgICAgZ3JpZENvbHMgPSAxOworICAgIH0KKworICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX1dJRFRILCAhdXNlR3JpZCA/IHdpZHRoIDogZ3JpZFdpZHRoKTsKKyAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9IRUlHSFQsICF1c2VHcmlkID8gaGVpZ2h0IDogZ3JpZEhlaWdodCk7CisgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfSV9GUkFNRV9JTlRFUlZBTCwgMCk7CisgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfRk9STUFULAorICAgICAgICAgICAgdXNlR3JpZCA/IENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlIDogQ09MT1JfRm9ybWF0U3VyZmFjZSk7CisgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfRlJBTUVfUkFURSwgZ3JpZFJvd3MgKiBncmlkQ29scyk7CisgICAgLy8gVGhpcyBvbmx5IHNlcnZlcyBhcyBhIGhpbnQgdG8gZW5jb2RlciB3aGVuIGVuY29kaW5nIGlzIG5vdCByZWFsLXRpbWUuCisgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfT1BFUkFUSU5HX1JBVEUsIHVzZUdyaWQgPyBrR3JpZE9wUmF0ZSA6IGtOb0dyaWRPcFJhdGUpOworCisgICAgcmVzID0gbUNvZGVjLT5jb25maWd1cmUob3V0cHV0Rm9ybWF0LCBudWxscHRyIC8qbmF0aXZlV2luZG93Ki8sCisgICAgICAgICAgICBudWxscHRyIC8qY3J5cHRvKi8sIENPTkZJR1VSRV9GTEFHX0VOQ09ERSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBjb25maWd1cmUgY29kZWM6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgbUdyaWRXaWR0aCA9IGdyaWRXaWR0aDsKKyAgICBtR3JpZEhlaWdodCA9IGdyaWRIZWlnaHQ7CisgICAgbUdyaWRSb3dzID0gZ3JpZFJvd3M7CisgICAgbUdyaWRDb2xzID0gZ3JpZENvbHM7CisgICAgbVVzZUdyaWQgPSB1c2VHcmlkOworICAgIG1PdXRwdXRXaWR0aCA9IHdpZHRoOworICAgIG1PdXRwdXRIZWlnaHQgPSBoZWlnaHQ7CisgICAgbUFwcFNlZ21lbnRNYXhTaXplID0gY2FsY0FwcFNlZ21lbnRNYXhTaXplKGNhbWVyYURldmljZS0+aW5mbygpKTsKKyAgICBtTWF4SGVpY0J1ZmZlclNpemUgPSBtT3V0cHV0V2lkdGggKiBtT3V0cHV0SGVpZ2h0ICogMyAvIDIgKyBtQXBwU2VnbWVudE1heFNpemU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6ZGVpbml0Q29kZWMoKSB7CisgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICBpZiAobUNvZGVjICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUNvZGVjLT5zdG9wKCk7CisgICAgICAgIG1Db2RlYy0+cmVsZWFzZSgpOworICAgICAgICBtQ29kZWMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBpZiAobUNvZGVjTG9vcGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUNvZGVjTG9vcGVyLT5zdG9wKCk7CisgICAgICAgIG1Db2RlY0xvb3Blci5jbGVhcigpOworICAgIH0KKworICAgIGlmIChtQ2FsbGJhY2tMb29wZXIgIT0gbnVsbHB0cikgeworICAgICAgICBtQ2FsbGJhY2tMb29wZXItPnN0b3AoKTsKKyAgICAgICAgbUNhbGxiYWNrTG9vcGVyLmNsZWFyKCk7CisgICAgfQorCisgICAgbUFzeW5jTm90aWZ5LmNsZWFyKCk7CisgICAgbUZvcm1hdC5jbGVhcigpOworfQorCisvLyBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgYXBwIHNlZ21lbnQsIDAgaW5kaWNhdGVzIGZhaWx1cmUKK3NpemVfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpmaW5kQXBwU2VnbWVudHNTaXplKGNvbnN0IHVpbnQ4X3QqIGFwcFNlZ21lbnRCdWZmZXIsCisgICAgICAgIHNpemVfdCBtYXhTaXplLCBzaXplX3QgKmFwcDFTZWdtZW50U2l6ZSkgeworICAgIGlmIChhcHBTZWdtZW50QnVmZmVyID09IG51bGxwdHIgfHwgYXBwMVNlZ21lbnRTaXplID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGlucHV0IGFwcFNlZ21lbnRCdWZmZXIgJXAsIGFwcDFTZWdtZW50U2l6ZSAlcCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBhcHBTZWdtZW50QnVmZmVyLCBhcHAxU2VnbWVudFNpemUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzaXplX3QgZXhwZWN0ZWRTaXplID0gMDsKKyAgICAvLyBGaXJzdCBjaGVjayBmb3IgRVhJRiB0cmFuc3BvcnQgaGVhZGVyIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlcgorICAgIGNvbnN0IHVpbnQ4X3QgKmhlYWRlciA9IGFwcFNlZ21lbnRCdWZmZXIgKyAobWF4U2l6ZSAtIHNpemVvZihzdHJ1Y3QgQ2FtZXJhQmxvYikpOworICAgIGNvbnN0IHN0cnVjdCBDYW1lcmFCbG9iICpibG9iID0gKGNvbnN0IHN0cnVjdCBDYW1lcmFCbG9iKikoaGVhZGVyKTsKKyAgICBpZiAoYmxvYi0+YmxvYklkICE9IENhbWVyYUJsb2JJZDo6SlBFR19BUFBfU0VHTUVOVFMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIEVYSUYgYmxvYklkICVodSIsIF9fRlVOQ1RJT05fXywgYmxvYi0+YmxvYklkKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZXhwZWN0ZWRTaXplID0gYmxvYi0+YmxvYlNpemU7CisgICAgaWYgKGV4cGVjdGVkU2l6ZSA9PSAwIHx8IGV4cGVjdGVkU2l6ZSA+IG1heFNpemUgLSBzaXplb2Yoc3RydWN0IENhbWVyYUJsb2IpKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBibG9iU2l6ZSAlenUuIiwgX19GVU5DVElPTl9fLCBleHBlY3RlZFNpemUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB1aW50MzJfdCB0b3RhbFNpemUgPSAwOworCisgICAgLy8gVmVyaWZ5IEFQUDEgbWFya2VyIChtYW5kYXRvcnkpCisgICAgdWludDhfdCBhcHAxTWFya2VyW10gPSB7MHhGRiwgMHhFMX07CisgICAgaWYgKG1lbWNtcChhcHBTZWdtZW50QnVmZmVyLCBhcHAxTWFya2VyLCBzaXplb2YoYXBwMU1hcmtlcikpKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBBUFAxIG1hcmtlcjogJXgsICV4IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGFwcFNlZ21lbnRCdWZmZXJbMF0sIGFwcFNlZ21lbnRCdWZmZXJbMV0pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgdG90YWxTaXplICs9IHNpemVvZihhcHAxTWFya2VyKTsKKworICAgIHVpbnQxNl90IGFwcDFTaXplID0gKHN0YXRpY19jYXN0PHVpbnQxNl90PihhcHBTZWdtZW50QnVmZmVyW3RvdGFsU2l6ZV0pIDw8IDgpICsKKyAgICAgICAgICAgIGFwcFNlZ21lbnRCdWZmZXJbdG90YWxTaXplKzFdOworICAgIHRvdGFsU2l6ZSArPSBhcHAxU2l6ZTsKKworICAgIEFMT0dWKCIlczogRXhwZWN0ZWQgQVBQIHNlZ21lbnRzIHNpemUgJXp1LCBBUFAxIHNlZ21lbnQgc2l6ZSAldSIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGV4cGVjdGVkU2l6ZSwgYXBwMVNpemUpOworICAgIHdoaWxlICh0b3RhbFNpemUgPCBleHBlY3RlZFNpemUpIHsKKyAgICAgICAgaWYgKGFwcFNlZ21lbnRCdWZmZXJbdG90YWxTaXplXSAhPSAweEZGIHx8CisgICAgICAgICAgICAgICAgYXBwU2VnbWVudEJ1ZmZlclt0b3RhbFNpemUrMV0gPD0gMHhFMSB8fAorICAgICAgICAgICAgICAgIGFwcFNlZ21lbnRCdWZmZXJbdG90YWxTaXplKzFdID4gMHhFRikgeworICAgICAgICAgICAgLy8gSW52YWxpZCBBUFBuIG1hcmtlcgorICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIEFQUG4gbWFya2VyOiAleCwgJXgiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIGFwcFNlZ21lbnRCdWZmZXJbdG90YWxTaXplXSwgYXBwU2VnbWVudEJ1ZmZlclt0b3RhbFNpemUrMV0pOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgdG90YWxTaXplICs9IDI7CisKKyAgICAgICAgdWludDE2X3QgYXBwblNpemUgPSAoc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGFwcFNlZ21lbnRCdWZmZXJbdG90YWxTaXplXSkgPDwgOCkgKworICAgICAgICAgICAgICAgIGFwcFNlZ21lbnRCdWZmZXJbdG90YWxTaXplKzFdOworICAgICAgICB0b3RhbFNpemUgKz0gYXBwblNpemU7CisgICAgfQorCisgICAgaWYgKHRvdGFsU2l6ZSAhPSBleHBlY3RlZFNpemUpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIEpQRUcgQVBQIHNlZ21lbnRzOiB0b3RhbFNpemUgJXUgdnMgZXhwZWN0ZWQgc2l6ZSAlenUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdG90YWxTaXplLCBleHBlY3RlZFNpemUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAqYXBwMVNlZ21lbnRTaXplID0gYXBwMVNpemUgKyBzaXplb2YoYXBwMU1hcmtlcik7CisgICAgcmV0dXJuIGV4cGVjdGVkU2l6ZTsKK30KKworaW50NjRfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpmaW5kVGltZXN0YW1wSW5Oc0xvY2tlZChpbnQ2NF90IHRpbWVJblVzKSB7CisgICAgZm9yIChjb25zdCBhdXRvJiBmbiA6IG1GcmFtZU51bWJlck1hcCkgeworICAgICAgICBpZiAodGltZUluVXMgPT0gbnMydXMoZm4uc2Vjb25kKSkgeworICAgICAgICAgICAgcmV0dXJuIGZuLnNlY29uZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIGlucHV0RnJhbWUgOiBtUGVuZGluZ0lucHV0RnJhbWVzKSB7CisgICAgICAgIGlmICh0aW1lSW5VcyA9PSBuczJ1cyhpbnB1dEZyYW1lLmZpcnN0KSkgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0RnJhbWUuZmlyc3Q7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0dXNfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpjb3B5T25lWXV2VGlsZShzcDxNZWRpYUNvZGVjQnVmZmVyPiYgY29kZWNCdWZmZXIsCisgICAgICAgIGNvbnN0IENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXImIHl1dkJ1ZmZlciwKKyAgICAgICAgc2l6ZV90IHRvcCwgc2l6ZV90IGxlZnQsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICAvLyBHZXQgc3RyaWRlIGluZm9ybWF0aW9uIGZvciBjb2RlY0J1ZmZlcgorICAgIHNwPEFCdWZmZXI+IGltYWdlRGF0YTsKKyAgICBpZiAoIWNvZGVjQnVmZmVyLT5tZXRhKCktPmZpbmRCdWZmZXIoImltYWdlLWRhdGEiLCAmaW1hZ2VEYXRhKSkgeworICAgICAgICBBTE9HRSgiJXM6IENvZGVjIGlucHV0IGJ1ZmZlciBpcyBub3QgZm9yIGltYWdlIGRhdGEhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKGltYWdlRGF0YS0+c2l6ZSgpICE9IHNpemVvZihNZWRpYUltYWdlMikpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNvZGVjIGlucHV0IGltYWdlIHNpemUgJXp1LCBleHBlY3RlZCAlenUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaW1hZ2VEYXRhLT5zaXplKCksIHNpemVvZihNZWRpYUltYWdlMikpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBNZWRpYUltYWdlMiogaW1hZ2VJbmZvID0gcmVpbnRlcnByZXRfY2FzdDxNZWRpYUltYWdlMio+KGltYWdlRGF0YS0+ZGF0YSgpKTsKKyAgICBpZiAoaW1hZ2VJbmZvLT5tVHlwZSAhPSBNZWRpYUltYWdlMjo6TUVESUFfSU1BR0VfVFlQRV9ZVVYgfHwKKyAgICAgICAgICAgIGltYWdlSW5mby0+bUJpdERlcHRoICE9IDggfHwKKyAgICAgICAgICAgIGltYWdlSW5mby0+bUJpdERlcHRoQWxsb2NhdGVkICE9IDggfHwKKyAgICAgICAgICAgIGltYWdlSW5mby0+bU51bVBsYW5lcyAhPSAzKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjb2RlYyBpbnB1dCBpbWFnZSBpbmZvOiBtVHlwZSAlZCwgbUJpdERlcHRoICVkLCAiCisgICAgICAgICAgICAgICAgIm1CaXREZXB0aEFsbG9jYXRlZCAlZCwgbU51bVBsYW5lcyAlZCEiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLT5tVHlwZSwgaW1hZ2VJbmZvLT5tQml0RGVwdGgsCisgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLT5tQml0RGVwdGhBbGxvY2F0ZWQsIGltYWdlSW5mby0+bU51bVBsYW5lcyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgQUxPR1YoIiVzOiB5dXZCdWZmZXIgY2hyb21hU3RlcCAlZCwgY2hyb21hU3RyaWRlICVkIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgeXV2QnVmZmVyLmNocm9tYVN0ZXAsIHl1dkJ1ZmZlci5jaHJvbWFTdHJpZGUpOworICAgIEFMT0dWKCIlczogVSBvZmZzZXQgJXUsIFYgb2Zmc2V0ICV1LCBVIHJvd0luYyAlZCwgViByb3dJbmMgJWQsIFUgY29sSW5jICVkLCBWIGNvbEluYyAlZCIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tT2Zmc2V0LAorICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1PZmZzZXQsCisgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubVJvd0luYywKKyAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tUm93SW5jLAorICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1Db2xJbmMsCisgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubUNvbEluYyk7CisKKyAgICAvLyBZCisgICAgZm9yIChhdXRvIHJvdyA9IHRvcDsgcm93IDwgdG9wK2hlaWdodDsgcm93KyspIHsKKyAgICAgICAgdWludDhfdCAqZHN0ID0gY29kZWNCdWZmZXItPmRhdGEoKSArIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpZXS5tT2Zmc2V0ICsKKyAgICAgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6WV0ubVJvd0luYyAqIChyb3cgLSB0b3ApOworICAgICAgICBtRm5Db3B5Um93KHl1dkJ1ZmZlci5kYXRhK3Jvdyp5dXZCdWZmZXIuc3RyaWRlK2xlZnQsIGRzdCwgd2lkdGgpOworICAgIH0KKworICAgIC8vIFUgaXMgQ2IsIFYgaXMgQ3IKKyAgICBib29sIGNvZGVjVVBsYW5lRmlyc3QgPSBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubU9mZnNldCA+CisgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubU9mZnNldDsKKyAgICB1aW50MzJfdCBjb2RlY1V2T2Zmc2V0RGlmZiA9IGNvZGVjVVBsYW5lRmlyc3QgPworICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1PZmZzZXQgLSBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubU9mZnNldCA6CisgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubU9mZnNldCAtIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tT2Zmc2V0OworICAgIGJvb2wgaXNDb2RlY1V2U2VtaXBsYW5uYXIgPSAoY29kZWNVdk9mZnNldERpZmYgPT0gMSkgJiYKKyAgICAgICAgICAgIChpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubVJvd0luYyA9PQorICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1Sb3dJbmMpICYmCisgICAgICAgICAgICAoaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1Db2xJbmMgPT0gMikgJiYKKyAgICAgICAgICAgIChpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubUNvbEluYyA9PSAyKTsKKyAgICBib29sIGlzQ29kZWNVdlBsYW5uYXIgPQorICAgICAgICAgICAgKChjb2RlY1VQbGFuZUZpcnN0ICYmIGNvZGVjVXZPZmZzZXREaWZmID49CisgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tUm93SW5jICogaW1hZ2VJbmZvLT5tSGVpZ2h0LzIpIHx8CisgICAgICAgICAgICAoKCFjb2RlY1VQbGFuZUZpcnN0ICYmIGNvZGVjVXZPZmZzZXREaWZmID49CisgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tUm93SW5jICogaW1hZ2VJbmZvLT5tSGVpZ2h0LzIpKSkgJiYKKyAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tQ29sSW5jID09IDEgJiYKKyAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tQ29sSW5jID09IDE7CisgICAgYm9vbCBjYW1lcmFVUGxhbmVGaXJzdCA9IHl1dkJ1ZmZlci5kYXRhQ3IgPiB5dXZCdWZmZXIuZGF0YUNiOworCisgICAgaWYgKGlzQ29kZWNVdlNlbWlwbGFubmFyICYmIHl1dkJ1ZmZlci5jaHJvbWFTdGVwID09IDIgJiYKKyAgICAgICAgICAgIChjb2RlY1VQbGFuZUZpcnN0ID09IGNhbWVyYVVQbGFuZUZpcnN0KSkgeworICAgICAgICAvLyBVViBzZW1pcGxhbm5hcgorICAgICAgICAvLyBUaGUgY2hyb21lIHBsYW5lIGNvdWxkIGJlIGVpdGhlciBDYiBmaXJzdCwgb3IgQ3IgZmlyc3QuIFRha2UgdGhlCisgICAgICAgIC8vIHNtYWxsZXIgYWRkcmVzcy4KKyAgICAgICAgdWludDhfdCAqc3JjID0gc3RkOjptaW4oeXV2QnVmZmVyLmRhdGFDYiwgeXV2QnVmZmVyLmRhdGFDcik7CisgICAgICAgIE1lZGlhSW1hZ2UyOjpQbGFuZUluZGV4IGRzdFBsYW5lID0gY29kZWNVdk9mZnNldERpZmYgPiAwID8gTWVkaWFJbWFnZTI6OlUgOiBNZWRpYUltYWdlMjo6VjsKKyAgICAgICAgZm9yIChhdXRvIHJvdyA9IHRvcC8yOyByb3cgPCAodG9wK2hlaWdodCkvMjsgcm93KyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IGNvZGVjQnVmZmVyLT5kYXRhKCkgKyBpbWFnZUluZm8tPm1QbGFuZVtkc3RQbGFuZV0ubU9mZnNldCArCisgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW2RzdFBsYW5lXS5tUm93SW5jICogKHJvdyAtIHRvcC8yKTsKKyAgICAgICAgICAgIG1GbkNvcHlSb3coc3JjK3Jvdyp5dXZCdWZmZXIuY2hyb21hU3RyaWRlK2xlZnQsIGRzdCwgd2lkdGgpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChpc0NvZGVjVXZQbGFubmFyICYmIHl1dkJ1ZmZlci5jaHJvbWFTdGVwID09IDEpIHsKKyAgICAgICAgLy8gVSBwbGFuZQorICAgICAgICBmb3IgKGF1dG8gcm93ID0gdG9wLzI7IHJvdyA8ICh0b3AraGVpZ2h0KS8yOyByb3crKykgeworICAgICAgICAgICAgdWludDhfdCAqZHN0ID0gY29kZWNCdWZmZXItPmRhdGEoKSArIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tT2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1Sb3dJbmMgKiAocm93IC0gdG9wLzIpOworICAgICAgICAgICAgbUZuQ29weVJvdyh5dXZCdWZmZXIuZGF0YUNiK3Jvdyp5dXZCdWZmZXIuY2hyb21hU3RyaWRlK2xlZnQvMiwgZHN0LCB3aWR0aC8yKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFYgcGxhbmUKKyAgICAgICAgZm9yIChhdXRvIHJvdyA9IHRvcC8yOyByb3cgPCAodG9wK2hlaWdodCkvMjsgcm93KyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IGNvZGVjQnVmZmVyLT5kYXRhKCkgKyBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubU9mZnNldCArCisgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tUm93SW5jICogKHJvdyAtIHRvcC8yKTsKKyAgICAgICAgICAgIG1GbkNvcHlSb3coeXV2QnVmZmVyLmRhdGFDcityb3cqeXV2QnVmZmVyLmNocm9tYVN0cmlkZStsZWZ0LzIsIGRzdCwgd2lkdGgvMik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBDb252ZXJ0IGJldHdlZW4gc2VtaXBsYW5uYXIgYW5kIHBsYW5uYXIsIG9yIHdoZW4gVVYgb3JkZXJzIGFyZQorICAgICAgICAvLyBkaWZmZXJlbnQuCisgICAgICAgIHVpbnQ4X3QgKmRzdCA9IGNvZGVjQnVmZmVyLT5kYXRhKCk7CisgICAgICAgIGZvciAoYXV0byByb3cgPSB0b3AvMjsgcm93IDwgKHRvcCtoZWlnaHQpLzI7IHJvdysrKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8gY29sID0gbGVmdC8yOyBjb2wgPCAobGVmdCt3aWR0aCkvMjsgY29sKyspIHsKKyAgICAgICAgICAgICAgICAvLyBVL0NiCisgICAgICAgICAgICAgICAgaW50MzJfdCBkc3RJbmRleCA9IGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tT2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tUm93SW5jICogKHJvdyAtIHRvcC8yKSArCisgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubUNvbEluYyAqIChjb2wgLSBsZWZ0LzIpOworICAgICAgICAgICAgICAgIGludDMyX3Qgc3JjSW5kZXggPSByb3cgKiB5dXZCdWZmZXIuY2hyb21hU3RyaWRlICsgeXV2QnVmZmVyLmNocm9tYVN0ZXAgKiBjb2w7CisgICAgICAgICAgICAgICAgZHN0W2RzdEluZGV4XSA9IHl1dkJ1ZmZlci5kYXRhQ2Jbc3JjSW5kZXhdOworCisgICAgICAgICAgICAgICAgLy8gVi9DcgorICAgICAgICAgICAgICAgIGRzdEluZGV4ID0gaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1PZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1Sb3dJbmMgKiAocm93IC0gdG9wLzIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tQ29sSW5jICogKGNvbCAtIGxlZnQvMik7CisgICAgICAgICAgICAgICAgc3JjSW5kZXggPSByb3cgKiB5dXZCdWZmZXIuY2hyb21hU3RyaWRlICsgeXV2QnVmZmVyLmNocm9tYVN0ZXAgKiBjb2w7CisgICAgICAgICAgICAgICAgZHN0W2RzdEluZGV4XSA9IHl1dkJ1ZmZlci5kYXRhQ3Jbc3JjSW5kZXhdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjppbml0Q29weVJvd0Z1bmN0aW9uKGludDMyX3Qgd2lkdGgpCit7CisgICAgdXNpbmcgbmFtZXNwYWNlIGxpYnl1djsKKworICAgIG1GbkNvcHlSb3cgPSBDb3B5Um93X0M7CisjaWYgZGVmaW5lZChIQVNfQ09QWVJPV19TU0UyKQorICAgIGlmIChUZXN0Q3B1RmxhZyhrQ3B1SGFzU1NFMikpIHsKKyAgICAgICAgbUZuQ29weVJvdyA9IElTX0FMSUdORUQod2lkdGgsIDMyKSA/IENvcHlSb3dfU1NFMiA6IENvcHlSb3dfQW55X1NTRTI7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChIQVNfQ09QWVJPV19BVlgpCisgICAgaWYgKFRlc3RDcHVGbGFnKGtDcHVIYXNBVlgpKSB7CisgICAgICAgIG1GbkNvcHlSb3cgPSBJU19BTElHTkVEKHdpZHRoLCA2NCkgPyBDb3B5Um93X0FWWCA6IENvcHlSb3dfQW55X0FWWDsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKEhBU19DT1BZUk9XX0VSTVMpCisgICAgaWYgKFRlc3RDcHVGbGFnKGtDcHVIYXNFUk1TKSkgeworICAgICAgICBtRm5Db3B5Um93ID0gQ29weVJvd19FUk1TOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoSEFTX0NPUFlST1dfTkVPTikKKyAgICBpZiAoVGVzdENwdUZsYWcoa0NwdUhhc05FT04pKSB7CisgICAgICAgIG1GbkNvcHlSb3cgPSBJU19BTElHTkVEKHdpZHRoLCAzMikgPyBDb3B5Um93X05FT04gOiBDb3B5Um93X0FueV9ORU9OOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoSEFTX0NPUFlST1dfTUlQUykKKyAgICBpZiAoVGVzdENwdUZsYWcoa0NwdUhhc01JUFMpKSB7CisgICAgICAgIG1GbkNvcHlSb3cgPSBDb3B5Um93X01JUFM7CisgICAgfQorI2VuZGlmCit9CisKK3NpemVfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpjYWxjQXBwU2VnbWVudE1heFNpemUoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGluZm8pIHsKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeSA9IGluZm8uZmluZChBTkRST0lEX0hFSUNfSU5GT19NQVhfSlBFR19BUFBfU0VHTUVOVFNfQ09VTlQpOworICAgIHNpemVfdCBtYXhBcHBzU2VnbWVudCA9IDE7CisgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICBtYXhBcHBzU2VnbWVudCA9IGVudHJ5LmRhdGEudThbMF0gPCAxID8gMSA6CisgICAgICAgICAgICAgICAgZW50cnkuZGF0YS51OFswXSA+IDE2ID8gMTYgOiBlbnRyeS5kYXRhLnU4WzBdOworICAgIH0KKyAgICByZXR1cm4gbWF4QXBwc1NlZ21lbnQgKiAoMiArIDB4RkZGRikgKyBzaXplb2Yoc3RydWN0IENhbWVyYUJsb2IpOworfQorCitib29sIEhlaWNDb21wb3NpdGVTdHJlYW06OnRocmVhZExvb3AoKSB7CisgICAgaW50NjRfdCBjdXJyZW50VHMgPSBJTlQ2NF9NQVg7CisgICAgYm9vbCBuZXdJbnB1dEF2YWlsYWJsZSA9IGZhbHNlOworCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgICAgICBpZiAobUVycm9yU3RhdGUpIHsKKyAgICAgICAgICAgIC8vIEluIGNhc2Ugd2UgbGFuZGVkIGluIGVycm9yIHN0YXRlLCByZXR1cm4gYW55IHBlbmRpbmcgYnVmZmVycyBhbmQKKyAgICAgICAgICAgIC8vIGhhbHQgYWxsIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAgICAgICAgICAgIGNvbXBpbGVQZW5kaW5nSW5wdXRMb2NrZWQoKTsKKyAgICAgICAgICAgIHJlbGVhc2VJbnB1dEZyYW1lc0xvY2tlZChjdXJyZW50VHMpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKworICAgICAgICB3aGlsZSAoIW5ld0lucHV0QXZhaWxhYmxlKSB7CisgICAgICAgICAgICBjb21waWxlUGVuZGluZ0lucHV0TG9ja2VkKCk7CisgICAgICAgICAgICBuZXdJbnB1dEF2YWlsYWJsZSA9IGdldE5leHRSZWFkeUlucHV0TG9ja2VkKCZjdXJyZW50VHMpOworCisgICAgICAgICAgICBpZiAoIW5ld0lucHV0QXZhaWxhYmxlKSB7CisgICAgICAgICAgICAgICAgYXV0byBmYWlsaW5nRnJhbWVOdW1iZXIgPSBnZXROZXh0RmFpbGluZ0lucHV0TG9ja2VkKCZjdXJyZW50VHMpOworICAgICAgICAgICAgICAgIGlmIChmYWlsaW5nRnJhbWVOdW1iZXIgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSBjYW5ub3QgZXJhc2UgJ21QZW5kaW5nSW5wdXRGcmFtZXNbY3VycmVudFRzXScgYXQgdGhpcyBwb2ludCBiZWNhdXNlIGl0IGlzCisgICAgICAgICAgICAgICAgICAgIC8vIHBvc3NpYmxlIGZvciB0d28gaW50ZXJuYWwgc3RyZWFtIGJ1ZmZlcnMgdG8gZmFpbC4gSW4gc3VjaCBzY2VuYXJpbyB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gY29tcG9zaXRlIHN0cmVhbSBzaG91bGQgbm90aWZ5IHRoZSBjbGllbnQgYWJvdXQgYSBzdHJlYW0gYnVmZmVyIGVycm9yIG9ubHkKKyAgICAgICAgICAgICAgICAgICAgLy8gb25jZSBhbmQgdGhpcyBpbmZvcm1hdGlvbiBpcyBrZXB0IHdpdGhpbiAnZXJyb3JOb3RpZmllZCcuCisgICAgICAgICAgICAgICAgICAgIC8vIEFueSBwcmVzZW50IGZhaWxlZCBpbnB1dCBmcmFtZXMgd2lsbCBiZSByZW1vdmVkIG9uIGEgc3Vic2VxdWVudCBjYWxsIHRvCisgICAgICAgICAgICAgICAgICAgIC8vICdyZWxlYXNlSW5wdXRGcmFtZXNMb2NrZWQoKScuCisgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VJbnB1dEZyYW1lTG9ja2VkKCZtUGVuZGluZ0lucHV0RnJhbWVzW2N1cnJlbnRUc10pOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50VHMgPSBJTlQ2NF9NQVg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXV0byByZXQgPSBtSW5wdXRSZWFkeUNvbmRpdGlvbi53YWl0UmVsYXRpdmUobU11dGV4LCBrV2FpdER1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IFRJTUVEX09VVCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldCAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFRpbWVkIHdhaXQgb24gY29uZGl0aW9uIGZhaWxlZDogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmV0KSwgcmV0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGF1dG8gcmVzID0gcHJvY2Vzc0lucHV0RnJhbWUoY3VycmVudFRzLCBtUGVuZGluZ0lucHV0RnJhbWVzW2N1cnJlbnRUc10pOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCBwcm9jZXNzaW5nIGZyYW1lIHdpdGggdGltZXN0YW1wOiAlIiBQUkl1NjQgIjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjdXJyZW50VHMsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2N1cnJlbnRUc10uZXJyb3IgPSB0cnVlOworICAgIH0KKworICAgIGlmIChtUGVuZGluZ0lucHV0RnJhbWVzW2N1cnJlbnRUc10uZXJyb3IgfHwKKyAgICAgICAgICAgIChtUGVuZGluZ0lucHV0RnJhbWVzW2N1cnJlbnRUc10uYXBwU2VnbWVudFdyaXR0ZW4gJiYKKyAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbY3VycmVudFRzXS5wZW5kaW5nT3V0cHV0VGlsZXMgPT0gMCkpIHsKKyAgICAgICAgcmVsZWFzZUlucHV0RnJhbWVzTG9ja2VkKGN1cnJlbnRUcyk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6b25TdHJlYW1CdWZmZXJFcnJvcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKKyAgICBib29sIHJlcyA9IGZhbHNlOworICAgIC8vIEJ1ZmZlciBlcnJvcnMgY29uY2VybmluZyBpbnRlcm5hbCBjb21wb3NpdGUgc3RyZWFtcyBzaG91bGQgbm90IGJlIGRpcmVjdGx5IHZpc2libGUgdG8KKyAgICAvLyBjYW1lcmEgY2xpZW50cy4gVGhleSBtdXN0IG9ubHkgcmVjZWl2ZSBhIHNpbmdsZSBidWZmZXIgZXJyb3Igd2l0aCB0aGUgcHVibGljIGNvbXBvc2l0ZQorICAgIC8vIHN0cmVhbSBpZC4KKyAgICBpZiAoKHJlc3VsdEV4dHJhcy5lcnJvclN0cmVhbUlkID09IG1BcHBTZWdtZW50U3RyZWFtSWQpIHx8CisgICAgICAgICAgICAocmVzdWx0RXh0cmFzLmVycm9yU3RyZWFtSWQgPT0gbU1haW5JbWFnZVN0cmVhbUlkKSkgeworICAgICAgICBmbGFnQW5FcnJvckZyYW1lTnVtYmVyKHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcik7CisgICAgICAgIHJlcyA9IHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpvblJlc3VsdEVycm9yKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgeworICAgIC8vIEZvciByZXN1bHQgZXJyb3IsIHNpbmNlIHRoZSBBUFBTX1NFR01FTlQgYnVmZmVyIGFscmVhZHkgY29udGFpbnMgRVhJRiwKKyAgICAvLyBzaW1wbHkgc2tpcCB1c2luZyB0aGUgY2FwdHVyZSByZXN1bHQgbWV0YWRhdGEgdG8gb3ZlcnJpZGUgRVhJRi4KKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworCisgICAgaW50NjRfdCB0aW1lc3RhbXAgPSAtMTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZuIDogbUZyYW1lTnVtYmVyTWFwKSB7CisgICAgICAgIGlmIChmbi5maXJzdCA9PSByZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpIHsKKyAgICAgICAgICAgIHRpbWVzdGFtcCA9IGZuLnNlY29uZDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmICh0aW1lc3RhbXAgPT0gLTEpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBpbnB1dEZyYW1lIDogbVBlbmRpbmdJbnB1dEZyYW1lcykgeworICAgICAgICAgICAgaWYgKGlucHV0RnJhbWUuc2Vjb25kLmZyYW1lTnVtYmVyID09IHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcikgeworICAgICAgICAgICAgICAgIHRpbWVzdGFtcCA9IGlucHV0RnJhbWUuZmlyc3Q7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodGltZXN0YW1wID09IC0xKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGZpbmQgc2h1dHRlciB0aW1lc3RhbXAgZm9yIHJlc3VsdCBlcnJvciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUNhcHR1cmVSZXN1bHRzLmVtcGxhY2UodGltZXN0YW1wLCBzdGQ6Om1ha2VfdHVwbGUocmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyLCBDYW1lcmFNZXRhZGF0YSgpKSk7CisgICAgbUlucHV0UmVhZHlDb25kaXRpb24uc2lnbmFsKCk7Cit9CisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6Q29kZWNDYWxsYmFja0hhbmRsZXI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3A8SGVpY0NvbXBvc2l0ZVN0cmVhbT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHBhcmVudCA9PSBudWxscHRyKSByZXR1cm47CisKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRDYWxsYmFja05vdGlmeTogeworICAgICAgICAgICAgIGludDMyX3QgY2JJRDsKKyAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJjYWxsYmFja0lEIiwgJmNiSUQpKSB7CisgICAgICAgICAgICAgICAgIEFMT0dFKCJrV2hhdENhbGxiYWNrTm90aWZ5OiBjYWxsYmFja0lEIGlzIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICBBTE9HVigia1doYXRDYWxsYmFja05vdGlmeTogY2JJRCA9ICVkIiwgY2JJRCk7CisKKyAgICAgICAgICAgICBzd2l0Y2ggKGNiSUQpIHsKKyAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvZGVjOjpDQl9JTlBVVF9BVkFJTEFCTEU6IHsKKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXg7CisgICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJpbmRleCIsICZpbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ0JfSU5QVVRfQVZBSUxBQkxFOiBpbmRleCBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIHBhcmVudC0+b25IZWljSW5wdXRGcmFtZUF2YWlsYWJsZShpbmRleCk7CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb2RlYzo6Q0JfT1VUUFVUX0FWQUlMQUJMRTogeworICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbmRleDsKKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmbGFnczsKKworICAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiaW5kZXgiLCAmaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNCX09VVFBVVF9BVkFJTEFCTEU6IGluZGV4IGlzIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRTaXplKCJvZmZzZXQiLCAmb2Zmc2V0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDQl9PVVRQVVRfQVZBSUxBQkxFOiBvZmZzZXQgaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZFNpemUoInNpemUiLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ0JfT1VUUFVUX0FWQUlMQUJMRTogc2l6ZSBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNCX09VVFBVVF9BVkFJTEFCTEU6IHRpbWVVcyBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImZsYWdzIiwgJmZsYWdzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDQl9PVVRQVVRfQVZBSUxBQkxFOiBmbGFncyBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgQ29kZWNPdXRwdXRCdWZmZXJJbmZvIGJ1ZmZlckluZm8gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3Qpb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClmbGFnc307CisKKyAgICAgICAgICAgICAgICAgICAgIHBhcmVudC0+b25IZWljT3V0cHV0RnJhbWVBdmFpbGFibGUoYnVmZmVySW5mbyk7CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb2RlYzo6Q0JfT1VUUFVUX0ZPUk1BVF9DSEFOR0VEOiB7CisgICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDQl9PVVRQVVRfRk9STUFUX0NIQU5HRUQ6IGZvcm1hdCBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgcGFyZW50LT5vbkhlaWNGb3JtYXRDaGFuZ2VkKGZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb2RlYzo6Q0JfRVJST1I6IHsKKyAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IGVycjsKKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYWN0aW9uQ29kZTsKKyAgICAgICAgICAgICAgICAgICAgIEFTdHJpbmcgZGV0YWlsOworICAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ0JfRVJST1I6IGVyciBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImFjdGlvbiIsICZhY3Rpb25Db2RlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDQl9FUlJPUjogYWN0aW9uIGlzIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgbXNnLT5maW5kU3RyaW5nKCJkZXRhaWwiLCAmZGV0YWlsKTsKKyAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb2RlYyByZXBvcnRlZCBlcnJvcigweCV4KSwgYWN0aW9uQ29kZSglZCksIGRldGFpbCglcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIsIGFjdGlvbkNvZGUsIGRldGFpbC5jX3N0cigpKTsKKworICAgICAgICAgICAgICAgICAgICAgcGFyZW50LT5vbkhlaWNDb2RlY0Vycm9yKCk7CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJrV2hhdENhbGxiYWNrTm90aWZ5OiBjYWxsYmFja0lEKCVkKSBpcyB1bmV4cGVjdGVkLiIsIGNiSUQpOworICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICB9CisgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoInNob3VsZG4ndCBiZSBoZXJlIik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK307IC8vIG5hbWVzcGFjZSBjYW1lcmEzCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljQ29tcG9zaXRlU3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjBjNjhlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljQ29tcG9zaXRlU3RyZWFtLmgKQEAgLTAsMCArMSwyNTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBM19IRUlDX0NPTVBPU0lURV9TVFJFQU1fSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQTNfSEVJQ19DT01QT1NJVEVfU1RSRUFNX0gKKworI2luY2x1ZGUgPHF1ZXVlPgorCisjaW5jbHVkZSA8Z3VpL0lQcm9kdWNlckxpc3RlbmVyLmg+CisjaW5jbHVkZSA8Z3VpL0NwdUNvbnN1bWVyLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5oPgorCisjaW5jbHVkZSAiQ29tcG9zaXRlU3RyZWFtLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworY2xhc3MgSGVpY0NvbXBvc2l0ZVN0cmVhbSA6IHB1YmxpYyBDb21wb3NpdGVTdHJlYW0sIHB1YmxpYyBUaHJlYWQsCisgICAgICAgIHB1YmxpYyBDcHVDb25zdW1lcjo6RnJhbWVBdmFpbGFibGVMaXN0ZW5lciB7CitwdWJsaWM6CisgICAgSGVpY0NvbXBvc2l0ZVN0cmVhbSh3cDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UsCisgICAgICAgICAgICB3cDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gY2IpOworICAgIH5IZWljQ29tcG9zaXRlU3RyZWFtKCkgb3ZlcnJpZGU7CisKKyAgICBzdGF0aWMgYm9vbCBpc0hlaWNDb21wb3NpdGVTdHJlYW0oY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpOworCisgICAgc3RhdHVzX3QgY3JlYXRlSW50ZXJuYWxTdHJlYW1zKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzLAorICAgICAgICAgICAgYm9vbCBoYXNEZWZlcnJlZENvbnN1bWVyLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAorICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMsIGludCBzdHJlYW1TZXRJZCwgYm9vbCBpc1NoYXJlZCkgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCBkZWxldGVJbnRlcm5hbFN0cmVhbXMoKSBvdmVycmlkZTsKKworICAgIHN0YXR1c190IGNvbmZpZ3VyZVN0cmVhbSgpIG92ZXJyaWRlOworCisgICAgc3RhdHVzX3QgaW5zZXJ0R2JwKFN1cmZhY2VNYXAqIC8qb3V0Ki9vdXRTdXJmYWNlTWFwLCBWZWN0b3I8aW50MzJfdD4qIC8qb3V0Ki9vdXRwdXRTdHJlYW1JZHMsCisgICAgICAgICAgICBpbnQzMl90KiAvKm91dCovY3VycmVudFN0cmVhbUlkKSBvdmVycmlkZTsKKworICAgIHZvaWQgb25TaHV0dGVyKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywgbnNlY3NfdCB0aW1lc3RhbXApIG92ZXJyaWRlOworCisgICAgaW50IGdldFN0cmVhbUlkKCkgb3ZlcnJpZGUgeyByZXR1cm4gbU1haW5JbWFnZVN0cmVhbUlkOyB9CisKKyAgICAvLyBVc2Ugb25TaHV0dGVyIHRvIGtlZXAgdHJhY2sgb2YgZnJhbWUgbnVtYmVyIDwtPiB0aW1lc3RhbXAgbWFwcGluZy4KKyAgICB2b2lkIG9uQnVmZmVyUmVsZWFzZWQoY29uc3QgQnVmZmVySW5mbyYgYnVmZmVySW5mbykgb3ZlcnJpZGU7CisgICAgdm9pZCBvbkJ1ZmZlclJlcXVlc3RGb3JGcmFtZU51bWJlcih1aW50NjRfdCBmcmFtZU51bWJlciwgaW50IHN0cmVhbUlkLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHNldHRpbmdzKSBvdmVycmlkZTsKKworICAgIC8vIENwdUNvbnN1bWVyIGxpc3RlbmVyIGltcGxlbWVudGF0aW9uCisgICAgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pIG92ZXJyaWRlOworCisgICAgLy8gUmV0dXJuIHN0cmVhbSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW50ZXJuYWwgY2FtZXJhIHN0cmVhbXMKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0Q29tcG9zaXRlU3RyZWFtSW5mbyhjb25zdCBPdXRwdXRTdHJlYW1JbmZvICZzdHJlYW1JbmZvLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGNoLCBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW1JbmZvPiogY29tcG9zaXRlT3V0cHV0IC8qb3V0Ki8pOworCisgICAgc3RhdGljIGJvb2wgaXNTaXplU3VwcG9ydGVkQnlIZWlmRW5jb2RlcihpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIGJvb2wqIHVzZUhlaWMsIGJvb2wqIHVzZUdyaWQsIGludDY0X3QqIHN0YWxsLCBBU3RyaW5nKiBoZXZjTmFtZSA9IG51bGxwdHIpOworICAgIHN0YXRpYyBib29sIGlzSW5NZW1vcnlUZW1wRmlsZVN1cHBvcnRlZCgpOworcHJvdGVjdGVkOgorCisgICAgYm9vbCB0aHJlYWRMb29wKCkgb3ZlcnJpZGU7CisgICAgYm9vbCBvblN0cmVhbUJ1ZmZlckVycm9yKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc3VsdEVycm9yKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgLy8KKyAgICAvLyBIRUlDL0hFVkMgQ29kZWMgcmVsYXRlZCBzdHJ1Y3R1cmVzLCB1dGlsaXR5IGZ1bmN0aW9ucywgYW5kIGNhbGxiYWNrcworICAgIC8vCisgICAgc3RydWN0IENvZGVjT3V0cHV0QnVmZmVySW5mbyB7CisgICAgICAgIGludDMyX3QgaW5kZXg7CisgICAgICAgIGludDMyX3Qgb2Zmc2V0OworICAgICAgICBpbnQzMl90IHNpemU7CisgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICB1aW50MzJfdCBmbGFnczsKKyAgICB9OworCisgICAgc3RydWN0IENvZGVjSW5wdXRCdWZmZXJJbmZvIHsKKyAgICAgICAgaW50MzJfdCBpbmRleDsKKyAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgIHNpemVfdCB0aWxlSW5kZXg7CisgICAgfTsKKworICAgIGNsYXNzIENvZGVjQ2FsbGJhY2tIYW5kbGVyIDogcHVibGljIEFIYW5kbGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IENvZGVjQ2FsbGJhY2tIYW5kbGVyKHdwPEhlaWNDb21wb3NpdGVTdHJlYW0+IHBhcmVudCkgeworICAgICAgICAgICAgbVBhcmVudCA9IHBhcmVudDsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHByaXZhdGU6CisgICAgICAgIHdwPEhlaWNDb21wb3NpdGVTdHJlYW0+IG1QYXJlbnQ7CisgICAgfTsKKworICAgIGVudW0geworICAgICAgICBrV2hhdENhbGxiYWNrTm90aWZ5LAorICAgIH07CisKKyAgICBib29sICAgICAgICAgICAgICBtVXNlSGVpYzsKKyAgICBzcDxNZWRpYUNvZGVjPiAgICBtQ29kZWM7CisgICAgc3A8QUxvb3Blcj4gICAgICAgbUNvZGVjTG9vcGVyLCBtQ2FsbGJhY2tMb29wZXI7CisgICAgc3A8Q29kZWNDYWxsYmFja0hhbmRsZXI+IG1Db2RlY0NhbGxiYWNrSGFuZGxlcjsKKyAgICBzcDxBTWVzc2FnZT4gICAgICBtQXN5bmNOb3RpZnk7CisgICAgc3A8QU1lc3NhZ2U+ICAgICAgbUZvcm1hdDsKKyAgICBzaXplX3QgICAgICAgICAgICBtTnVtT3V0cHV0VGlsZXM7CisKKyAgICBpbnQzMl90ICAgICAgICAgICBtT3V0cHV0V2lkdGgsIG1PdXRwdXRIZWlnaHQ7CisgICAgc2l6ZV90ICAgICAgICAgICAgbU1heEhlaWNCdWZmZXJTaXplOworICAgIGludDMyX3QgICAgICAgICAgIG1HcmlkV2lkdGgsIG1HcmlkSGVpZ2h0OworICAgIHNpemVfdCAgICAgICAgICAgIG1HcmlkUm93cywgbUdyaWRDb2xzOworICAgIGJvb2wgICAgICAgICAgICAgIG1Vc2VHcmlkOyAvLyBXaGV0aGVyIHRvIHVzZSBmcmFtZXdvcmsgWVVWIGZyYW1lIHRpbGluZy4KKworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtOb0ZyYW1lRHJvcE1heFB0c0dhcCA9IC0xMDAwMDAwOworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtOb0dyaWRPcFJhdGUgPSAzMDsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrR3JpZE9wUmF0ZSA9IDEyMDsKKworICAgIHZvaWQgb25IZWljT3V0cHV0RnJhbWVBdmFpbGFibGUoY29uc3QgQ29kZWNPdXRwdXRCdWZmZXJJbmZvJiBidWZmZXJJbmZvKTsKKyAgICB2b2lkIG9uSGVpY0lucHV0RnJhbWVBdmFpbGFibGUoaW50MzJfdCBpbmRleCk7ICAvLyBPbmx5IGNhbGxlZCBmb3IgWVVWIGlucHV0IG1vZGUuCisgICAgdm9pZCBvbkhlaWNGb3JtYXRDaGFuZ2VkKHNwPEFNZXNzYWdlPiYgbmV3Rm9ybWF0KTsKKyAgICB2b2lkIG9uSGVpY0NvZGVjRXJyb3IoKTsKKworICAgIHN0YXR1c190IGluaXRpYWxpemVDb2RlYyh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4mIGNhbWVyYURldmljZSk7CisgICAgdm9pZCBkZWluaXRDb2RlYygpOworCisgICAgLy8KKyAgICAvLyBDb21wb3NpdGUgc3RyZWFtIHJlbGF0ZWQgc3RydWN0dXJlcywgdXRpbGl0eSBmdW5jdGlvbnMgYW5kIGNhbGxiYWNrcy4KKyAgICAvLworICAgIHN0cnVjdCBJbnB1dEZyYW1lIHsKKyAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbjsKKyAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICBxdWFsaXR5OworCisgICAgICAgIENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXIgICAgICAgICAgYXBwU2VnbWVudEJ1ZmZlcjsKKyAgICAgICAgc3RkOjp2ZWN0b3I8Q29kZWNPdXRwdXRCdWZmZXJJbmZvPiBjb2RlY091dHB1dEJ1ZmZlcnM7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDYW1lcmFNZXRhZGF0YT4gICAgcmVzdWx0OworCisgICAgICAgIC8vIEZpZWxkcyB0aGF0IGFyZSBvbmx5IGFwcGxpY2FibGUgdG8gSEVWQyB0aWxpbmcuCisgICAgICAgIENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXIgICAgICAgICAgeXV2QnVmZmVyOworICAgICAgICBzdGQ6OnZlY3RvcjxDb2RlY0lucHV0QnVmZmVySW5mbz4gIGNvZGVjSW5wdXRCdWZmZXJzOworCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgZXJyb3I7CisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOb3RpZmllZDsKKyAgICAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlcjsKKworICAgICAgICBzcDxNZWRpYU11eGVyPiAgICAgICAgICAgIG11eGVyOworICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgIGZlbmNlRmQ7CisgICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgZmlsZUZkOworICAgICAgICBzc2l6ZV90ICAgICAgICAgICAgICAgICAgIHRyYWNrSW5kZXg7CisgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIgICAgICAgKmFuYjsKKworICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgIGFwcFNlZ21lbnRXcml0dGVuOworICAgICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgIHBlbmRpbmdPdXRwdXRUaWxlczsKKyAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICBjb2RlY0lucHV0Q291bnRlcjsKKworICAgICAgICBJbnB1dEZyYW1lKCkgOiBvcmllbnRhdGlvbigwKSwgcXVhbGl0eShrRGVmYXVsdEpwZWdRdWFsaXR5KSwgZXJyb3IoZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICBlcnJvck5vdGlmaWVkKGZhbHNlKSwgZnJhbWVOdW1iZXIoLTEpLCBmZW5jZUZkKC0xKSwgZmlsZUZkKC0xKSwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJbmRleCgtMSksIGFuYihudWxscHRyKSwgYXBwU2VnbWVudFdyaXR0ZW4oZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICBwZW5kaW5nT3V0cHV0VGlsZXMoMCksIGNvZGVjSW5wdXRDb3VudGVyKDApIHsgfQorICAgIH07CisKKyAgICB2b2lkIGNvbXBpbGVQZW5kaW5nSW5wdXRMb2NrZWQoKTsKKyAgICAvLyBGaW5kIGZpcnN0IGNvbXBsZXRlIGFuZCB2YWxpZCBmcmFtZSB3aXRoIHNtYWxsZXN0IHRpbWVzdGFtcAorICAgIGJvb2wgZ2V0TmV4dFJlYWR5SW5wdXRMb2NrZWQoaW50NjRfdCAqY3VycmVudFRzIC8qb3V0Ki8pOworICAgIC8vIEZpbmQgbmV4dCBmYWlsaW5nIGZyYW1lIG51bWJlciB3aXRoIHNtYWxsZXN0IHRpbWVzdGFtcCBhbmQgcmV0dXJuIHJlc3BlY3RpdmUgZnJhbWUgbnVtYmVyCisgICAgaW50NjRfdCBnZXROZXh0RmFpbGluZ0lucHV0TG9ja2VkKGludDY0X3QgKmN1cnJlbnRUcyAvKm91dCovKTsKKworICAgIHN0YXR1c190IHByb2Nlc3NJbnB1dEZyYW1lKG5zZWNzX3QgdGltZXN0YW1wLCBJbnB1dEZyYW1lICZpbnB1dEZyYW1lKTsKKyAgICBzdGF0dXNfdCBwcm9jZXNzQ29kZWNJbnB1dEZyYW1lKElucHV0RnJhbWUgJmlucHV0RnJhbWUpOworICAgIHN0YXR1c190IHN0YXJ0TXV4ZXJGb3JJbnB1dEZyYW1lKG5zZWNzX3QgdGltZXN0YW1wLCBJbnB1dEZyYW1lICZpbnB1dEZyYW1lKTsKKyAgICBzdGF0dXNfdCBwcm9jZXNzQXBwU2VnbWVudChuc2Vjc190IHRpbWVzdGFtcCwgSW5wdXRGcmFtZSAmaW5wdXRGcmFtZSk7CisgICAgc3RhdHVzX3QgcHJvY2Vzc09uZUNvZGVjT3V0cHV0RnJhbWUobnNlY3NfdCB0aW1lc3RhbXAsIElucHV0RnJhbWUgJmlucHV0RnJhbWUpOworICAgIHN0YXR1c190IHByb2Nlc3NDb21wbGV0ZWRJbnB1dEZyYW1lKG5zZWNzX3QgdGltZXN0YW1wLCBJbnB1dEZyYW1lICZpbnB1dEZyYW1lKTsKKworICAgIHZvaWQgcmVsZWFzZUlucHV0RnJhbWVMb2NrZWQoSW5wdXRGcmFtZSAqaW5wdXRGcmFtZSAvKm91dCovKTsKKyAgICB2b2lkIHJlbGVhc2VJbnB1dEZyYW1lc0xvY2tlZChpbnQ2NF90IGN1cnJlbnRUcyk7CisKKyAgICBzaXplX3QgZmluZEFwcFNlZ21lbnRzU2l6ZShjb25zdCB1aW50OF90KiBhcHBTZWdtZW50QnVmZmVyLCBzaXplX3QgbWF4U2l6ZSwKKyAgICAgICAgICAgIHNpemVfdCogYXBwMVNlZ21lbnRTaXplKTsKKyAgICBpbnQ2NF90IGZpbmRUaW1lc3RhbXBJbk5zTG9ja2VkKGludDY0X3QgdGltZUluVXMpOworICAgIHN0YXR1c190IGNvcHlPbmVZdXZUaWxlKHNwPE1lZGlhQ29kZWNCdWZmZXI+JiBjb2RlY0J1ZmZlciwKKyAgICAgICAgICAgIGNvbnN0IENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXImIHl1dkJ1ZmZlciwKKyAgICAgICAgICAgIHNpemVfdCB0b3AsIHNpemVfdCBsZWZ0LCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpOworICAgIHZvaWQgaW5pdENvcHlSb3dGdW5jdGlvbihpbnQzMl90IHdpZHRoKTsKKyAgICBzdGF0aWMgc2l6ZV90IGNhbGNBcHBTZWdtZW50TWF4U2l6ZShjb25zdCBDYW1lcmFNZXRhZGF0YSYgaW5mbyk7CisKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrV2FpdER1cmF0aW9uID0gMTAwMDAwMDA7IC8vIDEwIG1zCisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga0RlZmF1bHRKcGVnUXVhbGl0eSA9IDk5OworICAgIHN0YXRpYyBjb25zdCBhdXRvIGtKcGVnRGF0YVNwYWNlID0gSEFMX0RBVEFTUEFDRV9WMF9KRklGOworICAgIHN0YXRpYyBjb25zdCBhbmRyb2lkX2RhdGFzcGFjZSBrQXBwU2VnbWVudERhdGFTcGFjZSA9CisgICAgICAgICAgICBzdGF0aWNfY2FzdDxhbmRyb2lkX2RhdGFzcGFjZT4oSEFMX0RBVEFTUEFDRV9KUEVHX0FQUF9TRUdNRU5UUyk7CisgICAgc3RhdGljIGNvbnN0IGFuZHJvaWRfZGF0YXNwYWNlIGtIZWlmRGF0YVNwYWNlID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGFuZHJvaWRfZGF0YXNwYWNlPihIQUxfREFUQVNQQUNFX0hFSUYpOworCisgICAgaW50ICAgICAgICAgICAgICAgbUFwcFNlZ21lbnRTdHJlYW1JZCwgbUFwcFNlZ21lbnRTdXJmYWNlSWQ7CisgICAgc3A8Q3B1Q29uc3VtZXI+ICAgbUFwcFNlZ21lbnRDb25zdW1lcjsKKyAgICBzcDxTdXJmYWNlPiAgICAgICBtQXBwU2VnbWVudFN1cmZhY2U7CisgICAgYm9vbCAgICAgICAgICAgICAgbUFwcFNlZ21lbnRCdWZmZXJBY3F1aXJlZDsKKyAgICBzaXplX3QgICAgICAgICAgICBtQXBwU2VnbWVudE1heFNpemU7CisgICAgQ2FtZXJhTWV0YWRhdGEgICAgbVN0YXRpY0luZm87CisKKyAgICBpbnQgICAgICAgICAgICAgICBtTWFpbkltYWdlU3RyZWFtSWQsIG1NYWluSW1hZ2VTdXJmYWNlSWQ7CisgICAgc3A8U3VyZmFjZT4gICAgICAgbU1haW5JbWFnZVN1cmZhY2U7CisgICAgc3A8Q3B1Q29uc3VtZXI+ICAgbU1haW5JbWFnZUNvbnN1bWVyOyAvLyBPbmx5IGFwcGxpY2FibGUgZm9yIEhFVkMgY29kZWMuCisgICAgYm9vbCAgICAgICAgICAgICAgbVl1dkJ1ZmZlckFjcXVpcmVkOyAvLyBPbmx5IGFwcGxpY2FibGUgdG8gSEVWQyBjb2RlYworCisgICAgc3A8U3VyZmFjZT4gICAgICAgbU91dHB1dFN1cmZhY2U7CisgICAgc3A8UHJvZHVjZXJMaXN0ZW5lcj4gbVByb2R1Y2VyTGlzdGVuZXI7CisKKworICAgIC8vIE1hcCBmcm9tIGZyYW1lIG51bWJlciB0byBKUEVHIHNldHRpbmcgb2Ygb3JpZW50YXRpb24rcXVhbGl0eQorICAgIHN0ZDo6bWFwPGludDY0X3QsIHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4gbVNldHRpbmdzQnlGcmFtZU51bWJlcjsKKyAgICAvLyBNYXAgZnJvbSB0aW1lc3RhbXAgdG8gSlBFRyBzZXR0aW5nIG9mIG9yaWVudGF0aW9uK3F1YWxpdHkKKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCBzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+IG1TZXR0aW5nc0J5VGltZXN0YW1wOworCisgICAgLy8gS2VlcCBhbGwgaW5jb21pbmcgQVBQIHNlZ21lbnQgQmxvYiBidWZmZXIgcGVuZGluZyBmdXJ0aGVyIHByb2Nlc3NpbmcuCisgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gbUlucHV0QXBwU2VnbWVudEJ1ZmZlcnM7CisKKyAgICAvLyBLZWVwIGFsbCBpbmNvbWluZyBIRUlDIGJsb2IgYnVmZmVyIHBlbmRpbmcgZnVydGhlciBwcm9jZXNzaW5nLgorICAgIHN0ZDo6dmVjdG9yPENvZGVjT3V0cHV0QnVmZmVySW5mbz4gbUNvZGVjT3V0cHV0QnVmZmVyczsKKyAgICBzdGQ6OnF1ZXVlPGludDY0X3Q+IG1Db2RlY091dHB1dEJ1ZmZlclRpbWVzdGFtcHM7CisgICAgc2l6ZV90IG1PdXRwdXRCdWZmZXJDb3VudGVyOworCisgICAgLy8gS2VlcCBhbGwgaW5jb21pbmcgWXV2IGJ1ZmZlciBwZW5kaW5nIHRpbGluZyBhbmQgZW5jb2RpbmcgKGZvciBIRVZDIFlVViB0aWxpbmcgb25seSkKKyAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBtSW5wdXRZdXZCdWZmZXJzOworICAgIC8vIEtlZXAgYWxsIGNvZGVjIGlucHV0IGJ1ZmZlcnMgcmVhZHkgdG8gYmUgZmlsbGVkIG91dCAoZm9yIEhFVkMgWVVWIHRpbGluZyBvbmx5KQorICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IG1Db2RlY0lucHV0QnVmZmVyczsKKworICAgIC8vIEFydGlmaWNpYWwgc3RyaWN0bHkgaW5jcmVtZW50YWwgWVVWIGdyaWQgdGltZXN0YW1wIHRvIG1ha2UgZW5jb2RlciBoYXBweS4KKyAgICBpbnQ2NF90IG1HcmlkVGltZXN0YW1wVXM7CisKKyAgICAvLyBJbiBtb3N0IGNvbW1vbiB1c2UgY2FzZSwgZW50cmllcyBhcmUgYWNjZXNzZWQgaW4gb3JkZXIuCisgICAgc3RkOjptYXA8aW50NjRfdCwgSW5wdXRGcmFtZT4gbVBlbmRpbmdJbnB1dEZyYW1lczsKKworICAgIC8vIEZ1bmN0aW9uIHBvaW50ZXIgb2YgbGlieXV2IHJvdyBjb3B5LgorICAgIHZvaWQgKCptRm5Db3B5Um93KShjb25zdCB1aW50OF90KiBzcmMsIHVpbnQ4X3QqIGRzdCwgaW50IHdpZHRoKTsKK307CisKK307IC8vIG5hbWVzcGFjZSBjYW1lcmEzCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy9BTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQTNfSEVJQ19DT01QT1NJVEVfU1RSRUFNX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0VuY29kZXJJbmZvTWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNFbmNvZGVySW5mb01hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3Y2MyYmYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNFbmNvZGVySW5mb01hbmFnZXIuY3BwCkBAIC0wLDAgKzEsMzQzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJIZWljRW5jb2RlckluZm9NYW5hZ2VyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxyZWdleD4KKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bG9nL2xvZ19tYWluLmg+CisjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisKKyNpbmNsdWRlICJIZWljRW5jb2RlckluZm9NYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6SGVpY0VuY29kZXJJbmZvTWFuYWdlcigpIDoKKyAgICAgICAgbUlzSW5pdGVkKGZhbHNlKSwKKyAgICAgICAgbU1pblNpemVIZWljKDAsIDApLAorICAgICAgICBtTWF4U2l6ZUhlaWMoSU5UMzJfTUFYLCBJTlQzMl9NQVgpLAorICAgICAgICBtSGFzSEVWQyhmYWxzZSksCisgICAgICAgIG1IYXNIRUlDKGZhbHNlKSwKKyAgICAgICAgbURpc2FibGVHcmlkKGZhbHNlKSB7CisgICAgaWYgKGluaXRpYWxpemUoKSA9PSBPSykgeworICAgICAgICBtSXNJbml0ZWQgPSB0cnVlOworICAgIH0KK30KKworSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6fkhlaWNFbmNvZGVySW5mb01hbmFnZXIoKSB7Cit9CisKK2Jvb2wgSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6aXNTaXplU3VwcG9ydGVkKGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0LCBib29sKiB1c2VIZWljLAorICAgICAgICBib29sKiB1c2VHcmlkLCBpbnQ2NF90KiBzdGFsbCwgQVN0cmluZyogaGV2Y05hbWUpIGNvbnN0IHsKKyAgICBpZiAodXNlSGVpYyA9PSBudWxscHRyIHx8IHVzZUdyaWQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgcGFyYW1ldGVyczogdXNlSGVpYyAlcCwgdXNlR3JpZCAlcCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB1c2VIZWljLCB1c2VHcmlkKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIW1Jc0luaXRlZCkgcmV0dXJuIGZhbHNlOworCisgICAgYm9vbCBjaG9vc2VIZWljID0gZmFsc2UsIGVuYWJsZUdyaWQgPSB0cnVlOworICAgIGlmIChtSGFzSEVJQyAmJiB3aWR0aCA+PSBtTWluU2l6ZUhlaWMuZmlyc3QgJiYKKyAgICAgICAgICAgIGhlaWdodCA+PSBtTWluU2l6ZUhlaWMuc2Vjb25kICYmIHdpZHRoIDw9IG1NYXhTaXplSGVpYy5maXJzdCAmJgorICAgICAgICAgICAgaGVpZ2h0IDw9IG1NYXhTaXplSGVpYy5zZWNvbmQpIHsKKyAgICAgICAgY2hvb3NlSGVpYyA9IHRydWU7CisgICAgICAgIGVuYWJsZUdyaWQgPSBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKG1IYXNIRVZDKSB7CisgICAgICAgIGJvb2wgZnVsbFNpemVTdXBwb3J0ZWRCeUhldmMgPSAod2lkdGggPj0gbU1pblNpemVIZXZjLmZpcnN0ICYmCisgICAgICAgICAgICAgICAgaGVpZ2h0ID49IG1NaW5TaXplSGV2Yy5zZWNvbmQgJiYKKyAgICAgICAgICAgICAgICB3aWR0aCA8PSBtTWF4U2l6ZUhldmMuZmlyc3QgJiYKKyAgICAgICAgICAgICAgICBoZWlnaHQgPD0gbU1heFNpemVIZXZjLnNlY29uZCk7CisgICAgICAgIGlmIChmdWxsU2l6ZVN1cHBvcnRlZEJ5SGV2YyAmJiAobURpc2FibGVHcmlkIHx8CisgICAgICAgICAgICAgICAgKHdpZHRoIDw9IDE5MjAgJiYgaGVpZ2h0IDw9IDEwODApKSkgeworICAgICAgICAgICAgZW5hYmxlR3JpZCA9IGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChoZXZjTmFtZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAqaGV2Y05hbWUgPSBtSGV2Y05hbWU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBObyBlbmNvZGVyIGF2YWlsYWJsZSBmb3IgdGhlIHJlcXVlc3RlZCBzaXplLgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHN0YWxsICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gRmluZCBwcmVmZXJyZWQgZW5jb2RlciB3aGljaCBhZHZlcnRpc2UKKyAgICAgICAgLy8gIm1lYXN1cmVkLWZyYW1lLXJhdGUtV0lEVEh4SEVJR0hULXJhbmdlIiBrZXkuCisgICAgICAgIGNvbnN0IEZyYW1lUmF0ZU1hcHMmIG1hcHMgPQorICAgICAgICAgICAgICAgIChjaG9vc2VIZWljICYmIG1IZWljRnJhbWVSYXRlTWFwcy5zaXplKCkgPiAwKSA/CisgICAgICAgICAgICAgICAgbUhlaWNGcmFtZVJhdGVNYXBzIDogbUhldmNGcmFtZVJhdGVNYXBzOworICAgICAgICBjb25zdCBhdXRvJiBjbG9zZXN0U2l6ZSA9IGZpbmRDbG9zZXN0U2l6ZShtYXBzLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgaWYgKGNsb3Nlc3RTaXplID09IG1hcHMuZW5kKCkpIHsKKyAgICAgICAgICAgIC8vIFRoZSAibWVhc3VyZWQtZnJhbWUtcmF0ZS1XSURUSHhIRUlHSFQtcmFuZ2UiIGtleSBpcyBvcHRpb25hbC4KKyAgICAgICAgICAgIC8vIEhhcmRjb2RlIHRvIHNvbWUgZGVmYXVsdCB2YWx1ZSAoMy4zM21zICogdGlsZSBjb3VudCkgYmFzZWQgb24gcmVzb2x1dGlvbi4KKyAgICAgICAgICAgICpzdGFsbCA9IDMzMzMzMzNMTCAqIHdpZHRoICogaGVpZ2h0IC8gKGtHcmlkV2lkdGggKiBrR3JpZEhlaWdodCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERlcml2ZSBzdGFsbCBkdXJhdGlvbnMgYmFzZWQgb24gYXZlcmFnZSBmcHMgb2YgdGhlIGNsb3Nlc3Qgc2l6ZS4KKyAgICAgICAgY29uc3RleHByIGludDY0X3QgTlNFQ19QRVJfU0VDID0gMTAwMDAwMDAwMExMOworICAgICAgICBpbnQzMl90IGF2Z0ZwcyA9IChjbG9zZXN0U2l6ZS0+c2Vjb25kLmZpcnN0ICsgY2xvc2VzdFNpemUtPnNlY29uZC5zZWNvbmQpLzI7CisgICAgICAgIGZsb2F0IHJhdGlvID0gMS4wZiAqIHdpZHRoICogaGVpZ2h0IC8KKyAgICAgICAgICAgICAgICAoY2xvc2VzdFNpemUtPmZpcnN0LmZpcnN0ICogY2xvc2VzdFNpemUtPmZpcnN0LnNlY29uZCk7CisgICAgICAgICpzdGFsbCA9IHJhdGlvICogTlNFQ19QRVJfU0VDIC8gYXZnRnBzOworICAgIH0KKworICAgICp1c2VIZWljID0gY2hvb3NlSGVpYzsKKyAgICAqdXNlR3JpZCA9IGVuYWJsZUdyaWQ7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXR1c190IEhlaWNFbmNvZGVySW5mb01hbmFnZXI6OmluaXRpYWxpemUoKSB7CisgICAgbURpc2FibGVHcmlkID0gcHJvcGVydHlfZ2V0X2Jvb2woImNhbWVyYS5oZWljLmRpc2FibGVfZ3JpZCIsIGZhbHNlKTsKKyAgICBzcDxJTWVkaWFDb2RlY0xpc3Q+IGNvZGVjc0xpc3QgPSBNZWRpYUNvZGVjTGlzdDo6Z2V0SW5zdGFuY2UoKTsKKyAgICBpZiAoY29kZWNzTGlzdCA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIE5vIG1lZGlhIGNvZGVjIGF2YWlsYWJsZS4KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBoZWljRGV0YWlscyA9IGdldENvZGVjRGV0YWlscyhjb2RlY3NMaXN0LCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpOworCisgICAgaWYgKCFnZXRIZXZjQ29kZWNEZXRhaWxzKGNvZGVjc0xpc3QsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpKSB7CisgICAgICAgIGlmIChoZWljRGV0YWlscyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IERldmljZSBtdXN0IHN1cHBvcnQgSEVWQyBjb2RlYyBpZiBIRUlDIGNvZGVjIGlzIGF2YWlsYWJsZSEiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorICAgIG1IYXNIRVZDID0gdHJ1ZTsKKworICAgIC8vIEhFSUMgc2l6ZSByYW5nZQorICAgIGlmIChoZWljRGV0YWlscyAhPSBudWxscHRyKSB7CisgICAgICAgIGF1dG8gcmVzID0gZ2V0Q29kZWNTaXplUmFuZ2UoTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDLAorICAgICAgICAgICAgICAgIGhlaWNEZXRhaWxzLCAmbU1pblNpemVIZWljLCAmbU1heFNpemVIZWljLCAmbUhlaWNGcmFtZVJhdGVNYXBzKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IEhFSUMgY29kZWMgc2l6ZSByYW5nZTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIG1IYXNIRUlDID0gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEhlaWNFbmNvZGVySW5mb01hbmFnZXI6OmdldEZyYW1lUmF0ZU1hcHMoc3A8QU1lc3NhZ2U+IGRldGFpbHMsIEZyYW1lUmF0ZU1hcHMqIG1hcHMpIHsKKyAgICBpZiAoZGV0YWlscyA9PSBudWxscHRyIHx8IG1hcHMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgaW5wdXQ6IGRldGFpbHM6ICVwLCBtYXBzOiAlcCIsIF9fRlVOQ1RJT05fXywgZGV0YWlscy5nZXQoKSwgbWFwcyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZXRhaWxzLT5jb3VudEVudHJpZXMoKTsgaSsrKSB7CisgICAgICAgIEFNZXNzYWdlOjpUeXBlIHR5cGU7CisgICAgICAgIGNvbnN0IGNoYXIqIGVudHJ5TmFtZSA9IGRldGFpbHMtPmdldEVudHJ5TmFtZUF0KGksICZ0eXBlKTsKKyAgICAgICAgaWYgKHR5cGUgIT0gQU1lc3NhZ2U6OmtUeXBlU3RyaW5nKSBjb250aW51ZTsKKyAgICAgICAgc3RkOjpyZWdleCBmcmFtZVJhdGVOYW1lUGF0dGVybigibWVhc3VyZWQtZnJhbWUtcmF0ZS0oWzAtOV0rKVsqeF0oWzAtOV0rKS1yYW5nZSIsCisgICAgICAgICAgICAgICAgc3RkOjpyZWdleF9jb25zdGFudHM6OmljYXNlKTsKKyAgICAgICAgc3RkOjpjbWF0Y2ggc2l6ZU1hdGNoOworICAgICAgICBpZiAoc3RkOjpyZWdleF9tYXRjaChlbnRyeU5hbWUsIHNpemVNYXRjaCwgZnJhbWVSYXRlTmFtZVBhdHRlcm4pICYmCisgICAgICAgICAgICAgICAgc2l6ZU1hdGNoLnNpemUoKSA9PSAzKSB7CisgICAgICAgICAgICBBTWVzc2FnZTo6SXRlbURhdGEgaXRlbSA9IGRldGFpbHMtPmdldEVudHJ5QXQoaSk7CisgICAgICAgICAgICBBU3RyaW5nIGZwc1JhbmdlU3RyOworICAgICAgICAgICAgaWYgKGl0ZW0uZmluZCgmZnBzUmFuZ2VTdHIpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiAlcyIsIGVudHJ5TmFtZSwgZnBzUmFuZ2VTdHIuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgc3RkOjpyZWdleCBmcmFtZVJhdGVQYXR0ZXJuKCIoWzAtOV0rKS0oWzAtOV0rKSIpOworICAgICAgICAgICAgICAgIHN0ZDo6Y21hdGNoIGZwc01hdGNoOworICAgICAgICAgICAgICAgIGlmIChzdGQ6OnJlZ2V4X21hdGNoKGZwc1JhbmdlU3RyLmNfc3RyKCksIGZwc01hdGNoLCBmcmFtZVJhdGVQYXR0ZXJuKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZnBzTWF0Y2guc2l6ZSgpID09IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgbWFwcy0+ZW1wbGFjZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihzdG9pKHNpemVNYXRjaFsxXSksIHN0b2koc2l6ZU1hdGNoWzJdKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoc3RvaShmcHNNYXRjaFsxXSksIHN0b2koZnBzTWF0Y2hbMl0pKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBIZWljRW5jb2RlckluZm9NYW5hZ2VyOjpnZXRDb2RlY1NpemVSYW5nZSgKKyAgICAgICAgY29uc3QgY2hhciogY29kZWNOYW1lLAorICAgICAgICBzcDxBTWVzc2FnZT4gZGV0YWlscywKKyAgICAgICAgc3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+KiBtaW5TaXplLAorICAgICAgICBzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4qIG1heFNpemUsCisgICAgICAgIEZyYW1lUmF0ZU1hcHMqIGZyYW1lUmF0ZU1hcHMpIHsKKyAgICBpZiAoY29kZWNOYW1lID09IG51bGxwdHIgfHwgbWluU2l6ZSA9PSBudWxscHRyIHx8IG1heFNpemUgPT0gbnVsbHB0ciB8fAorICAgICAgICAgICAgZGV0YWlscyA9PSBudWxscHRyIHx8IGZyYW1lUmF0ZU1hcHMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEFTdHJpbmcgc2l6ZVJhbmdlOworICAgIGF1dG8gaGFzSXRlbSA9IGRldGFpbHMtPmZpbmRTdHJpbmcoInNpemUtcmFuZ2UiLCAmc2l6ZVJhbmdlKTsKKyAgICBpZiAoIWhhc0l0ZW0pIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcXVlcnkgc2l6ZSByYW5nZSBmb3IgY29kZWMgJXMiLCBfX0ZVTkNUSU9OX18sIGNvZGVjTmFtZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCIlczogJXMgY29kZWMncyBzaXplIHJhbmdlIGlzICVzIiwgX19GVU5DVElPTl9fLCBjb2RlY05hbWUsIHNpemVSYW5nZS5jX3N0cigpKTsKKyAgICBzdGQ6OnJlZ2V4IHBhdHRlcm4oIihbMC05XSspWyp4XShbMC05XSspLShbMC05XSspWyp4XShbMC05XSspIik7CisgICAgc3RkOjpjbWF0Y2ggbWF0Y2g7CisgICAgaWYgKHN0ZDo6cmVnZXhfbWF0Y2goc2l6ZVJhbmdlLmNfc3RyKCksIG1hdGNoLCBwYXR0ZXJuKSkgeworICAgICAgICBpZiAobWF0Y2guc2l6ZSgpID09IDUpIHsKKyAgICAgICAgICAgIG1pblNpemUtPmZpcnN0ID0gc3RvaShtYXRjaFsxXSk7CisgICAgICAgICAgICBtaW5TaXplLT5zZWNvbmQgPSBzdG9pKG1hdGNoWzJdKTsKKyAgICAgICAgICAgIG1heFNpemUtPmZpcnN0ID0gc3RvaShtYXRjaFszXSk7CisgICAgICAgICAgICBtYXhTaXplLT5zZWNvbmQgPSBzdG9pKG1hdGNoWzRdKTsKKyAgICAgICAgICAgIGlmIChtaW5TaXplLT5maXJzdCA+IG1heFNpemUtPmZpcnN0IHx8CisgICAgICAgICAgICAgICAgICAgIG1pblNpemUtPnNlY29uZCA+IG1heFNpemUtPnNlY29uZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCAlcyBjb2RlIHNpemUgcmFuZ2U6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY29kZWNOYW1lLCBzaXplUmFuZ2UuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdXRvIHJlcyA9IGdldEZyYW1lUmF0ZU1hcHMoZGV0YWlscywgZnJhbWVSYXRlTWFwcyk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6RnJhbWVSYXRlTWFwczo6Y29uc3RfaXRlcmF0b3IgSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6ZmluZENsb3Nlc3RTaXplKAorICAgICAgICBjb25zdCBGcmFtZVJhdGVNYXBzJiBtYXBzLCBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCkgY29uc3QgeworICAgIGludDMyX3QgbWluRGlmZiA9IElOVDMyX01BWDsKKyAgICBGcmFtZVJhdGVNYXBzOjpjb25zdF9pdGVyYXRvciBjbG9zZXN0SXRlciA9IG1hcHMuYmVnaW4oKTsKKyAgICBmb3IgKGF1dG8gaXRlciA9IG1hcHMuYmVnaW4oKTsgaXRlciAhPSBtYXBzLmVuZCgpOyBpdGVyKyspIHsKKyAgICAgICAgLy8gVXNlIGFyZWEgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBzaXplcyB0byBhcHByb3hpbWF0ZSBzaXplCisgICAgICAgIC8vIGRpZmZlcmVuY2UuCisgICAgICAgIGludDMyX3QgZGlmZiA9IGFicyhpdGVyLT5maXJzdC5maXJzdCAqIGl0ZXItPmZpcnN0LnNlY29uZCAtIHdpZHRoICogaGVpZ2h0KTsKKyAgICAgICAgaWYgKGRpZmYgPCBtaW5EaWZmKSB7CisgICAgICAgICAgICBjbG9zZXN0SXRlciA9IGl0ZXI7CisgICAgICAgICAgICBtaW5EaWZmID0gZGlmZjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY2xvc2VzdEl0ZXI7Cit9CisKK3NwPEFNZXNzYWdlPiBIZWljRW5jb2RlckluZm9NYW5hZ2VyOjpnZXRDb2RlY0RldGFpbHMoCisgICAgICAgIHNwPElNZWRpYUNvZGVjTGlzdD4gY29kZWNzTGlzdCwgY29uc3QgY2hhciogbmFtZSkgeworICAgIHNzaXplX3QgaWR4ID0gY29kZWNzTGlzdC0+ZmluZENvZGVjQnlUeXBlKG5hbWUsIHRydWUgLyplbmNvZGVyKi8pOworICAgIGlmIChpZHggPCAwKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gY29kZWNzTGlzdC0+Z2V0Q29kZWNJbmZvKGlkeCk7CisgICAgaWYgKGluZm8gPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgY29kZWMgaW5mbyBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIG5hbWUpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gY2FwcyA9CisgICAgICAgICAgICBpbmZvLT5nZXRDYXBhYmlsaXRpZXNGb3IobmFtZSk7CisgICAgaWYgKGNhcHMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgY2FwYWJpbGl0aWVzIGZvciBjb2RlYyAlcyIsIF9fRlVOQ1RJT05fXywgbmFtZSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjb25zdCBzcDxBTWVzc2FnZT4gZGV0YWlscyA9IGNhcHMtPmdldERldGFpbHMoKTsKKyAgICBpZiAoZGV0YWlscyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGdldCBkZXRhaWxzIGZvciBjb2RlYyAlcyIsIF9fRlVOQ1RJT05fXywgbmFtZSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHJldHVybiBkZXRhaWxzOworfQorCitib29sIEhlaWNFbmNvZGVySW5mb01hbmFnZXI6OmdldEhldmNDb2RlY0RldGFpbHMoCisgICAgICAgIHNwPElNZWRpYUNvZGVjTGlzdD4gY29kZWNzTGlzdCwgY29uc3QgY2hhciogbWltZSkgeworICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICBzc2l6ZV90IGlkeCA9IDA7CisgICAgd2hpbGUgKChpZHggPSBjb2RlY3NMaXN0LT5maW5kQ29kZWNCeVR5cGUobWltZSwgdHJ1ZSAvKmVuY29kZXIqLywgaWR4KSkgPj0gMCkgeworICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IGNvZGVjc0xpc3QtPmdldENvZGVjSW5mbyhpZHgrKyk7CisgICAgICAgIGlmIChpbmZvID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGdldCBjb2RlYyBpbmZvIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgbWltZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZpbHRlciBvdXQgc29mdHdhcmUgb25lcyBhcyB0aGV5IG1heSBiZSB0b28gc2xvdworICAgICAgICBpZiAoIShpbmZvLT5nZXRBdHRyaWJ1dGVzKCkgJiBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc0hhcmR3YXJlQWNjZWxlcmF0ZWQpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM+IGNhcHMgPQorICAgICAgICAgICAgICAgIGluZm8tPmdldENhcGFiaWxpdGllc0ZvcihtaW1lKTsKKyAgICAgICAgaWYgKGNhcHMgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBbJXNdIEZhaWxlZCB0byBnZXQgY2FwYWJpbGl0aWVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBpbmZvLT5nZXRDb2RlY05hbWUoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gZGV0YWlscyA9IGNhcHMtPmdldERldGFpbHMoKTsKKyAgICAgICAgaWYgKGRldGFpbHMgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBbJXNdIEZhaWxlZCB0byBnZXQgZGV0YWlscyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+Z2V0Q29kZWNOYW1lKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBDaGVjayBDUSBtb2RlCisgICAgICAgIEFTdHJpbmcgYml0cmF0ZU1vZGVzOworICAgICAgICBhdXRvIGhhc0l0ZW0gPSBkZXRhaWxzLT5maW5kU3RyaW5nKCJmZWF0dXJlLWJpdHJhdGUtbW9kZXMiLCAmYml0cmF0ZU1vZGVzKTsKKyAgICAgICAgaWYgKCFoYXNJdGVtKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFslc10gRmFpbGVkIHRvIHF1ZXJ5IGJpdHJhdGUgbW9kZXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIGluZm8tPmdldENvZGVjTmFtZSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCIlczogWyVzXSBmZWF0dXJlLWJpdHJhdGUtbW9kZXMgdmFsdWUgaXMgJWQsICVzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGluZm8tPmdldENvZGVjTmFtZSgpLCBoYXNJdGVtLCBiaXRyYXRlTW9kZXMuY19zdHIoKSk7CisgICAgICAgIHN0ZDo6cmVnZXggcGF0dGVybigiKF58LClDUSgkfCwpIiwgc3RkOjpyZWdleF9jb25zdGFudHM6OmljYXNlKTsKKyAgICAgICAgaWYgKCFzdGQ6OnJlZ2V4X3NlYXJjaChiaXRyYXRlTW9kZXMuY19zdHIoKSwgcGF0dGVybikpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBtb3ZlIG9uIHRvIG5leHQgZW5jb2RlcgorICAgICAgICB9CisKKyAgICAgICAgc3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+IG1pblNpemVIZXZjLCBtYXhTaXplSGV2YzsKKyAgICAgICAgRnJhbWVSYXRlTWFwcyBoZXZjRnJhbWVSYXRlTWFwczsKKyAgICAgICAgYXV0byByZXMgPSBnZXRDb2RlY1NpemVSYW5nZShNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDLAorICAgICAgICAgICAgICAgIGRldGFpbHMsICZtaW5TaXplSGV2YywgJm1heFNpemVIZXZjLCAmaGV2Y0ZyYW1lUmF0ZU1hcHMpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFslc10gRmFpbGVkIHRvIGdldCBzaXplIHJhbmdlOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBpbmZvLT5nZXRDb2RlY05hbWUoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoa0dyaWRXaWR0aCA8IG1pblNpemVIZXZjLmZpcnN0CisgICAgICAgICAgICAgICAgfHwga0dyaWRXaWR0aCA+IG1heFNpemVIZXZjLmZpcnN0CisgICAgICAgICAgICAgICAgfHwga0dyaWRIZWlnaHQgPCBtaW5TaXplSGV2Yy5zZWNvbmQKKyAgICAgICAgICAgICAgICB8fCBrR3JpZEhlaWdodCA+IG1heFNpemVIZXZjLnNlY29uZCkgeworICAgICAgICAgICAgY29udGludWU7IC8vIG1vdmUgb24gdG8gbmV4dCBlbmNvZGVyCisgICAgICAgIH0KKworICAgICAgICAvLyBGb3VuZDogc2F2ZSBuYW1lLCBzaXplLCBmcmFtZSByYXRlCisgICAgICAgIG1IZXZjTmFtZSA9IGluZm8tPmdldENvZGVjTmFtZSgpOworICAgICAgICBtTWluU2l6ZUhldmMgPSBtaW5TaXplSGV2YzsKKyAgICAgICAgbU1heFNpemVIZXZjID0gbWF4U2l6ZUhldmM7CisgICAgICAgIG1IZXZjRnJhbWVSYXRlTWFwcyA9IGhldmNGcmFtZVJhdGVNYXBzOworCisgICAgICAgIGZvdW5kID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIGZvdW5kOworfQorCit9IC8vbmFtZXNwYWNlIGNhbWVyYTMKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0VuY29kZXJJbmZvTWFuYWdlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljRW5jb2RlckluZm9NYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThlZGJhMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0VuY29kZXJJbmZvTWFuYWdlci5oCkBAIC0wLDAgKzEsNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkFfSEVJQ0VOQ09ERVJfSU5GT19NQU5BR0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9IRUlDRU5DT0RFUl9JTkZPX01BTkFHRVJfSAorCisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKworI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUNvZGVjTGlzdC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworCitjbGFzcyBIZWljRW5jb2RlckluZm9NYW5hZ2VyIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgSGVpY0VuY29kZXJJbmZvTWFuYWdlciYgZ2V0SW5zdGFuY2UoKSB7CisgICAgICAgIHN0YXRpYyBIZWljRW5jb2RlckluZm9NYW5hZ2VyIGluc3RhbmNlOworICAgICAgICByZXR1cm4gaW5zdGFuY2U7CisgICAgfQorCisgICAgYm9vbCBpc1NpemVTdXBwb3J0ZWQoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICBib29sKiB1c2VIZWljLCBib29sKiB1c2VHcmlkLCBpbnQ2NF90KiBzdGFsbCwgQVN0cmluZyogaGV2Y05hbWUpIGNvbnN0OworCisgICAgc3RhdGljIGNvbnN0IGF1dG8ga0dyaWRXaWR0aCA9IDUxMjsKKyAgICBzdGF0aWMgY29uc3QgYXV0byBrR3JpZEhlaWdodCA9IDUxMjsKK3ByaXZhdGU6CisgICAgc3RydWN0IFNpemVQYWlySGFzaCB7CisgICAgICAgIHN0ZDo6c2l6ZV90IG9wZXJhdG9yICgpIChjb25zdCBzdGQ6OnBhaXI8aW50MzJfdCxpbnQzMl90PiAmcCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHAuZmlyc3QgKiAzMSArIHAuc2Vjb25kOworICAgICAgICB9CisgICAgfTsKKworICAgIHR5cGVkZWYgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90PiwKKyAgICAgICAgICAgIHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90PiwgU2l6ZVBhaXJIYXNoPiBGcmFtZVJhdGVNYXBzOworCisgICAgSGVpY0VuY29kZXJJbmZvTWFuYWdlcigpOworICAgIHZpcnR1YWwgfkhlaWNFbmNvZGVySW5mb01hbmFnZXIoKTsKKworICAgIHN0YXR1c190IGluaXRpYWxpemUoKTsKKyAgICBzdGF0dXNfdCBnZXRGcmFtZVJhdGVNYXBzKHNwPEFNZXNzYWdlPiBkZXRhaWxzLCBGcmFtZVJhdGVNYXBzKiBtYXBzKTsKKyAgICBzdGF0dXNfdCBnZXRDb2RlY1NpemVSYW5nZShjb25zdCBjaGFyKiBjb2RlY05hbWUsIHNwPEFNZXNzYWdlPiBkZXRhaWxzLAorICAgICAgICAgICAgc3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+KiBtaW5TaXplLCBzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4qIG1heFNpemUsCisgICAgICAgICAgICBGcmFtZVJhdGVNYXBzKiBmcmFtZVJhdGVNYXBzKTsKKyAgICBGcmFtZVJhdGVNYXBzOjpjb25zdF9pdGVyYXRvciBmaW5kQ2xvc2VzdFNpemUoY29uc3QgRnJhbWVSYXRlTWFwcyYgbWFwcywKKyAgICAgICAgICAgIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSBjb25zdDsKKyAgICBzcDxBTWVzc2FnZT4gZ2V0Q29kZWNEZXRhaWxzKHNwPElNZWRpYUNvZGVjTGlzdD4gY29kZWNzTGlzdCwgY29uc3QgY2hhciogbmFtZSk7CisgICAgYm9vbCBnZXRIZXZjQ29kZWNEZXRhaWxzKHNwPElNZWRpYUNvZGVjTGlzdD4gY29kZWNzTGlzdCwgY29uc3QgY2hhciogbWltZSk7CisKKyAgICBib29sIG1Jc0luaXRlZDsKKyAgICBzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4gbU1pblNpemVIZWljLCBtTWF4U2l6ZUhlaWM7CisgICAgc3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+IG1NaW5TaXplSGV2YywgbU1heFNpemVIZXZjOworICAgIGJvb2wgbUhhc0hFVkMsIG1IYXNIRUlDOworICAgIEFTdHJpbmcgbUhldmNOYW1lOworICAgIEZyYW1lUmF0ZU1hcHMgbUhlaWNGcmFtZVJhdGVNYXBzLCBtSGV2Y0ZyYW1lUmF0ZU1hcHM7CisgICAgYm9vbCBtRGlzYWJsZUdyaWQ7CisKK307CisKK30gLy8gbmFtZXNwYWNlIGNhbWVyYTMKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfU0VSVkVSU19DQU1FUkFfSEVJQ0VOQ09ERVJfSU5GT19NQU5BR0VSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwCmluZGV4IGNlMDA2YTcuLjc4ZmViM2UgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcApAQCAtMzIsMTQgKzMyLDExIEBACiAjaW5jbHVkZSAiYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaCIKIAogI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM0RldmljZS5oIgorI2luY2x1ZGUgInV0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIHVzaW5nIG5hbWVzcGFjZSBjYW1lcmEyOwogCi1zdGF0aWMgaW50IGdldENhbGxpbmdQaWQoKSB7Ci0gICAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKLX0KLQogLy8gSW50ZXJmYWNlIHVzZWQgYnkgQ2FtZXJhU2VydmljZQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVENsaWVudEJhc2U+CkBAIC01NywxMyArNTQsMTMgQEAKICAgICAgICAgICAgICAgICBjYW1lcmFJZCwgYXBpMUNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLCBzZXJ2aWNlUGlkKSwKICAgICAgICAgbVNoYXJlZENhbWVyYUNhbGxiYWNrcyhyZW1vdGVDYWxsYmFjayksCiAgICAgICAgIG1EZXZpY2VWZXJzaW9uKGNhbWVyYVNlcnZpY2UtPmdldERldmljZVZlcnNpb24oVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0cikpLAorICAgICAgICBtRGV2aWNlKG5ldyBDYW1lcmEzRGV2aWNlKGNhbWVyYUlkKSksCiAgICAgICAgIG1EZXZpY2VBY3RpdmUoZmFsc2UpLCBtQXBpMUNhbWVyYUlkKGFwaTFDYW1lcmFJZCkKIHsKICAgICBBTE9HSSgiQ2FtZXJhICVzOiBPcGVuZWQuIENsaWVudDogJXMgKFBJRCAlZCwgVUlEICVkKSIsIGNhbWVyYUlkLnN0cmluZygpLAogICAgICAgICAgICAgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSkuc3RyaW5nKCksIGNsaWVudFBpZCwgY2xpZW50VWlkKTsKIAogICAgIG1Jbml0aWFsQ2xpZW50UGlkID0gY2xpZW50UGlkOwotICAgIG1EZXZpY2UgPSBuZXcgQ2FtZXJhM0RldmljZShjYW1lcmFJZCk7CiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtRGV2aWNlID09IDAsICJEZXZpY2Ugc2hvdWxkIG5ldmVyIGJlIE5VTEwgaGVyZS4iKTsKIH0KIApAQCAtNzEsNyArNjgsNyBAQAogc3RhdHVzX3QgQ2FtZXJhMkNsaWVudEJhc2U8VENsaWVudEJhc2U+OjpjaGVja1BpZChjb25zdCBjaGFyKiBjaGVja0xvY2F0aW9uKQogICAgICAgICBjb25zdCB7CiAKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgaWYgKGNhbGxpbmdQaWQgPT0gVENsaWVudEJhc2U6Om1DbGllbnRQaWQpIHJldHVybiBOT19FUlJPUjsKIAogICAgIEFMT0dFKCIlczogYXR0ZW1wdCB0byB1c2UgYSBsb2NrZWQgY2FtZXJhIGZyb20gYSBkaWZmZXJlbnQgcHJvY2VzcyIKQEAgLTE4Niw3ICsxODMsNyBAQAogCiAgICAgYmluZGVyOjpTdGF0dXMgcmVzID0gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAgICAgLy8gQWxsb3cgYm90aCBjbGllbnQgYW5kIHRoZSBtZWRpYSBzZXJ2ZXIgdG8gZGlzY29ubmVjdCBhdCBhbGwgdGltZXMKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgaWYgKGNhbGxpbmdQaWQgIT0gVENsaWVudEJhc2U6Om1DbGllbnRQaWQgJiYKICAgICAgICAgY2FsbGluZ1BpZCAhPSBUQ2xpZW50QmFzZTo6bVNlcnZpY2VQaWQpIHJldHVybiByZXM7CiAKQEAgLTIwNiw4ICsyMDMsNiBAQAogICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybjsKICAgICBtRGV2aWNlLT5kaXNjb25uZWN0KCk7CiAKLSAgICBtRGV2aWNlLmNsZWFyKCk7Ci0KICAgICBBTE9HVigiQ2FtZXJhICVzOiBEZXRhY2ggY29tcGxldGUiLCBUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyLnN0cmluZygpKTsKIH0KIApAQCAtMjE5LDE4ICsyMTQsMTggQEAKICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CiAKICAgICBpZiAoVENsaWVudEJhc2U6Om1DbGllbnRQaWQgIT0gMCAmJgotICAgICAgICBnZXRDYWxsaW5nUGlkKCkgIT0gVENsaWVudEJhc2U6Om1DbGllbnRQaWQpIHsKKyAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSAhPSBUQ2xpZW50QmFzZTo6bUNsaWVudFBpZCkgewogCiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzOiBDb25uZWN0aW9uIGF0dGVtcHQgZnJvbSBwaWQgJWQ7ICIKICAgICAgICAgICAgICAgICAiY3VycmVudCBsb2NrZWQgdG8gcGlkICVkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgVENsaWVudEJhc2U6Om1DYW1lcmFJZFN0ci5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICBnZXRDYWxsaW5nUGlkKCksCisgICAgICAgICAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwKICAgICAgICAgICAgICAgICBUQ2xpZW50QmFzZTo6bUNsaWVudFBpZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgVENsaWVudEJhc2U6Om1DbGllbnRQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgVENsaWVudEJhc2U6Om1DbGllbnRQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogCiAgICAgVENsaWVudEJhc2U6Om1SZW1vdGVDYWxsYmFjayA9IGNsaWVudDsKICAgICBtU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzID0gY2xpZW50OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaAppbmRleCBlNzRmYmRmLi42NjkzODQ3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaApAQCAtMTMwLDcgKzEzMCwxMCBAQAogICAgIC8qKiBDYW1lcmFEZXZpY2VCYXNlIGluc3RhbmNlIHdyYXBwaW5nIEhBTDMrIGVudHJ5ICovCiAKICAgICBjb25zdCBpbnQgbURldmljZVZlcnNpb247Ci0gICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gIG1EZXZpY2U7CisKKyAgICAvLyBTZXQgdG8gY29uc3QgdG8gYXZvaWQgbURldmljZSBiZWluZyB1cGRhdGVkICh1cGRhdGUgb2Ygc3A8PiBpcyByYWN5KSBkdXJpbmcKKyAgICAvLyBkdW1wRGV2aWNlICh3aGljaCBpcyBpbXBvcnRhbnQgdG8gYmUgbG9jayBmcmVlIGZvciBkZWJ1Z2dpbmcgcHVycG9zZSkKKyAgICBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiAgbURldmljZTsKIAogICAgIC8qKiBVdGlsaXR5IG1lbWJlcnMgKi8KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgKaW5kZXggMGJhNzQwMy4uOThjMWI1ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYURldmljZUJhc2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5oCkBAIC02OSw2ICs2OSwxMCBAQAogICAgICAqIFRoZSBkZXZpY2UncyBzdGF0aWMgY2hhcmFjdGVyaXN0aWNzIG1ldGFkYXRhIGJ1ZmZlcgogICAgICAqLwogICAgIHZpcnR1YWwgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGluZm8oKSBjb25zdCA9IDA7CisgICAgLyoqCisgICAgICogVGhlIHBoeXNpY2FsIGNhbWVyYSBkZXZpY2UncyBzdGF0aWMgY2hhcmFjdGVyaXN0aWNzIG1ldGFkYXRhIGJ1ZmZlcgorICAgICAqLworICAgIHZpcnR1YWwgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGluZm8oY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxJZCkgY29uc3QgPSAwOwogCiAgICAgc3RydWN0IFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MgewogICAgICAgICBzdGQ6OnN0cmluZyBjYW1lcmFJZDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAKaW5kZXggNDNmMWE5MS4uMDk2MzhkMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHAKQEAgLTIwLDI3ICsyMCw0MiBAQAogCiAjaW5jbHVkZSAiQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgiCiAKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy41L0lDYW1lcmFEZXZpY2UuaD4KKwogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSAiY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuaCIKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPGZ1dHVyZT4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYV9jb21tb24uaD4KICNpbmNsdWRlIDxoaWRsL1NlcnZpY2VNYW5hZ2VtZW50Lmg+CiAjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KICNpbmNsdWRlIDxjYW1lcmFfbWV0YWRhdGFfaGlkZGVuLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlaW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKworI2luY2x1ZGUgImFwaTIvSGVpY0NvbXBvc2l0ZVN0cmVhbS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE7CiB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA7Cit1c2luZyBzdGQ6OmxpdGVyYWxzOjpjaHJvbm9fbGl0ZXJhbHM6Om9wZXJhdG9yIiJzOwogCiBuYW1lc3BhY2UgewogLy8gSGFyZGNvZGVkIG5hbWUgZm9yIHRoZSBwYXNzdGhyb3VnaCBIQUwgaW1wbGVtZW50YXRpb24sIHNpbmNlIGl0IGNhbid0IGJlIGRpc2NvdmVyZWQgdmlhIHRoZQogLy8gc2VydmljZSBtYW5hZ2VyCiBjb25zdCBzdGQ6OnN0cmluZyBrTGVnYWN5UHJvdmlkZXJOYW1lKCJsZWdhY3kvMCIpOwogY29uc3Qgc3RkOjpzdHJpbmcga0V4dGVybmFsUHJvdmlkZXJOYW1lKCJleHRlcm5hbC8wIik7Ci0KK2NvbnN0IGJvb2wga0VuYWJsZUxhenlIYWwocHJvcGVydHlfZ2V0X2Jvb2woInJvLmNhbWVyYS5lbmFibGVMYXp5SGFsIiwgZmFsc2UpKTsKIH0gLy8gYW5vbnltb3VzIG5hbWVzcGFjZQogCitjb25zdCBmbG9hdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmtEZXB0aEFSVG9sZXJhbmNlID0gLjFmOworCiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OkhhcmR3YXJlU2VydmljZUludGVyYWN0aW9uUHJveHkKIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c0hhcmR3YXJlU2VydmljZUludGVyYWN0aW9uUHJveHl7fTsKIApAQCAtNTYsNiArNzEsOCBAQAogICAgIH0KICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKICAgICBtU2VydmljZVByb3h5ID0gcHJveHk7CisgICAgbURldmljZVN0YXRlID0gc3RhdGljX2Nhc3Q8aGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPj4oCisgICAgICAgIHByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZTo6Tk9STUFMKTsKIAogICAgIC8vIFJlZ2lzdGVyaW5nIHdpbGwgdHJpZ2dlciBub3RpZmljYXRpb25zIGZvciBhbGwgYWxyZWFkeS1rbm93biBwcm92aWRlcnMKICAgICBib29sIHN1Y2Nlc3MgPSBtU2VydmljZVByb3h5LT5yZWdpc3RlckZvck5vdGlmaWNhdGlvbnMoCkBAIC03MSw2ICs4OCw4IEBACiAgICAgYWRkUHJvdmlkZXJMb2NrZWQoa0xlZ2FjeVByb3ZpZGVyTmFtZSwgLypleHBlY3RlZCovIGZhbHNlKTsKICAgICBhZGRQcm92aWRlckxvY2tlZChrRXh0ZXJuYWxQcm92aWRlck5hbWUsIC8qZXhwZWN0ZWQqLyBmYWxzZSk7CiAKKyAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CisKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTEwMSw4ICsxMjAsOCBAQAogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcHJvdmlkZXJEZXZpY2VJZHMgPSBwcm92aWRlci0+bVVuaXF1ZUFQSTFDb21wYXRpYmxlQ2FtZXJhSWRzOwogCiAgICAgICAgIC8vIEFQSTEgYXBwIGRvZXNuJ3QgaGFuZGxlIGxvZ2ljYWwgYW5kIHBoeXNpY2FsIGNhbWVyYSBkZXZpY2VzIHdlbGwuIFNvCi0gICAgICAgIC8vIGZvciBlYWNoIFtsb2dpY2FsLCBwaHlzaWNhbDEsIHBoeXNpY2FsMiwgLi4uXSBpZCBjb21ibywgb25seSB0YWtlIHRoZQotICAgICAgICAvLyBmaXJzdCBpZCBhZHZlcnRpc2VkIGJ5IEhBTCwgYW5kIGZpbHRlciBvdXQgdGhlIHJlc3QuCisgICAgICAgIC8vIGZvciBlYWNoIGNhbWVyYSBmYWNpbmcsIG9ubHkgdGFrZSB0aGUgZmlyc3QgaWQgYWR2ZXJ0aXNlZCBieSBIQUwgaW4KKyAgICAgICAgLy8gYWxsIFtsb2dpY2FsLCBwaHlzaWNhbDEsIHBoeXNpY2FsMiwgLi4uXSBpZCBjb21ib3MsIGFuZCBmaWx0ZXIgb3V0IHRoZSByZXN0LgogICAgICAgICBmaWx0ZXJMb2dpY2FsQ2FtZXJhSWRzTG9ja2VkKHByb3ZpZGVyRGV2aWNlSWRzKTsKIAogICAgICAgICBkZXZpY2VJZHMuaW5zZXJ0KGRldmljZUlkcy5lbmQoKSwgcHJvdmlkZXJEZXZpY2VJZHMuYmVnaW4oKSwgcHJvdmlkZXJEZXZpY2VJZHMuZW5kKCkpOwpAQCAtMTc0LDYgKzE5MywxOSBAQAogICAgIHJldHVybiBkZXZpY2VJbmZvLT5nZXRDYW1lcmFJbmZvKGluZm8pOwogfQogCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24sCisgICAgICAgIGJvb2wgKnN0YXR1cyAvKm91dCovKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+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+bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UobURldmljZVN0YXRlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtQWN0aXZlSW50ZXJmYWNlID0gaW50ZXJmYWNlOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJDYW1lcmEgcHJvdmlkZXIgKCVzKSBhbHJlYWR5IGluIHVzZS4gUmUtdXNpbmcgaW5zdGFuY2UuIiwgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIGludGVyZmFjZTsKK30KKwogY29uc3Qgc3RkOjpzdHJpbmcmIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpnZXRUeXBlKCkgY29uc3QgewogICAgIHJldHVybiBtVHlwZTsKIH0KQEAgLTYzMSw3ICsxMzkxLDEyIEBACiAKICAgICBtVW5pcXVlQ2FtZXJhSWRzLmluc2VydChpZCk7CiAgICAgaWYgKGlzQVBJMUNvbXBhdGlibGUpIHsKLSAgICAgICAgbVVuaXF1ZUFQSTFDb21wYXRpYmxlQ2FtZXJhSWRzLnB1c2hfYmFjayhpZCk7CisgICAgICAgIC8vIGFkZERldmljZSBjYW4gYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIGZvciB0aGUgc2FtZSBjYW1lcmEgaWQgaWYgSEFMCisgICAgICAgIC8vIHN1cHBvcnRzIG9wZW5MZWdhY3kuCisgICAgICAgIGlmIChzdGQ6OmZpbmQobVVuaXF1ZUFQSTFDb21wYXRpYmxlQ2FtZXJhSWRzLmJlZ2luKCksIG1VbmlxdWVBUEkxQ29tcGF0aWJsZUNhbWVyYUlkcy5lbmQoKSwKKyAgICAgICAgICAgICAgICBpZCkgPT0gbVVuaXF1ZUFQSTFDb21wYXRpYmxlQ2FtZXJhSWRzLmVuZCgpKSB7CisgICAgICAgICAgICBtVW5pcXVlQVBJMUNvbXBhdGlibGVDYW1lcmFJZHMucHVzaF9iYWNrKGlkKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChwYXJzZWRJZCAhPSBudWxscHRyKSB7CkBAIC02NTYsOCArMTQyMSwxMCBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mKSBjb25zdCB7Ci0gICAgZHByaW50ZihmZCwgIj09IENhbWVyYSBQcm92aWRlciBIQUwgJXMgKHYyLjQsICVzKSBzdGF0aWMgaW5mbzogJXp1IGRldmljZXM6ID09XG4iLAotICAgICAgICAgICAgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBtSW50ZXJmYWNlLT5pc1JlbW90ZSgpID8gInJlbW90ZSIgOiAicGFzc3Rocm91Z2giLAorICAgIGRwcmludGYoZmQsICI9PSBDYW1lcmEgUHJvdmlkZXIgSEFMICVzICh2Mi4lZCwgJXMpIHN0YXRpYyBpbmZvOiAlenUgZGV2aWNlczogPT1cbiIsCisgICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCksCisgICAgICAgICAgICBtTWlub3JWZXJzaW9uLAorICAgICAgICAgICAgbUlzUmVtb3RlID8gInJlbW90ZSIgOiAicGFzc3Rocm91Z2giLAogICAgICAgICAgICAgbURldmljZXMuc2l6ZSgpKTsKIAogICAgIGZvciAoYXV0byYgZGV2aWNlIDogbURldmljZXMpIHsKQEAgLTY5OCw2ICsxNDY1LDI0IEBACiAgICAgICAgICAgICBpbmZvMi5kdW1wKGZkLCAvKnZlcmJvc2l0eSovIDIsIC8qaW5kZW50YXRpb24qLyA0KTsKICAgICAgICAgfQogCisgICAgICAgIC8vIER1bXAgY2hhcmFjdGVyaXN0aWNzIG9mIG5vbi1zdGFuZGFsb25lIHBoeXNpY2FsIGNhbWVyYQorICAgICAgICBpZiAoZGV2aWNlLT5tSXNMb2dpY2FsQ2FtZXJhKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8mIGlkIDogZGV2aWNlLT5tUGh5c2ljYWxJZHMpIHsKKyAgICAgICAgICAgICAgICAvLyBTa2lwIGlmIHBoeXNpY2FsIGlkIGlzIGFuIGluZGVwZW5kZW50IGNhbWVyYQorICAgICAgICAgICAgICAgIGlmIChzdGQ6OmZpbmQobVByb3ZpZGVyUHVibGljQ2FtZXJhSWRzLmJlZ2luKCksIG1Qcm92aWRlclB1YmxpY0NhbWVyYUlkcy5lbmQoKSwgaWQpCisgICAgICAgICAgICAgICAgICAgICAgICAhPSBtUHJvdmlkZXJQdWJsaWNDYW1lcmFJZHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgcGh5c2ljYWxJbmZvOworICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZS0+Z2V0UGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoaWQsICZwaHlzaWNhbEluZm8pOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgZHByaW50ZihmZCwgIiAgUGh5c2ljYWwgY2FtZXJhICVzIGNoYXJhY3RlcmlzdGljczpcbiIsIGlkLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbEluZm8uZHVtcChmZCwgLyp2ZXJib3NpdHkqLyAyLCAvKmluZGVudGF0aW9uKi8gNCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgZHByaW50ZihmZCwgIj09IENhbWVyYSBIQUwgZGV2aWNlICVzICh2JWQuJWQpIGR1bXBTdGF0ZTogPT1cbiIsIGRldmljZS0+bU5hbWUuY19zdHIoKSwKICAgICAgICAgICAgICAgICBkZXZpY2UtPm1WZXJzaW9uLmdldF9tYWpvcigpLCBkZXZpY2UtPm1WZXJzaW9uLmdldF9taW5vcigpKTsKICAgICAgICAgcmVzID0gZGV2aWNlLT5kdW1wU3RhdGUoZmQpOwpAQCAtNzY3LDYgKzE1NTIsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgdG9yY2hTdGF0dXNUb1N0cmluZyhuZXdTdGF0dXMpKTsKICAgICAgICAgICAgICAgICBpZCA9IGRldmljZUluZm8tPm1JZDsKICAgICAgICAgICAgICAgICBrbm93biA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKFRvcmNoTW9kZVN0YXR1czo6QVZBSUxBQkxFX09OICE9IG5ld1N0YXR1cykgeworICAgICAgICAgICAgICAgICAgICBtTWFuYWdlci0+cmVtb3ZlUmVmKERldmljZU1vZGU6OlRPUkNILCBpZCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC03OTUsMTUgKzE1ODMsNzUgQEAKICAgICBtTWFuYWdlci0+cmVtb3ZlUHJvdmlkZXIobVByb3ZpZGVyTmFtZSk7CiB9CiAKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpzZXRVcFZlbmRvclRhZ3MoKSB7CisgICAgaWYgKG1WZW5kb3JUYWdEZXNjcmlwdG9yICE9IG51bGxwdHIpCisgICAgICAgIHJldHVybiBPSzsKKworICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxWZW5kb3JUYWdTZWN0aW9uPiB2dHM7CisgICAgU3RhdHVzIHN0YXR1czsKKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKKyAgICBjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2UgPSBzdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgcmV0ID0gaW50ZXJmYWNlLT5nZXRWZW5kb3JUYWdzKAorICAgICAgICBbJl0oYXV0byBzLCBjb25zdCBhdXRvJiB2ZW5kb3JUYWdTZWNzKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgaWYgKHMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIHZ0cyA9IHZlbmRvclRhZ1NlY3M7CisgICAgICAgICAgICB9CisgICAgfSk7CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgZ2V0dGluZyB2ZW5kb3IgdGFncyBmcm9tIHByb3ZpZGVyICclcyc6ICVzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKKyAgICB9CisKKyAgICAvLyBSZWFkIGFsbCB2ZW5kb3IgdGFnIGRlZmluaXRpb25zIGludG8gYSBkZXNjcmlwdG9yCisgICAgc3RhdHVzX3QgcmVzOworICAgIGlmICgocmVzID0gSGlkbFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNyZWF0ZURlc2NyaXB0b3JGcm9tSGlkbCh2dHMsIC8qb3V0Ki9tVmVuZG9yVGFnRGVzY3JpcHRvcikpCisgICAgICAgICAgICAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBnZW5lcmF0ZSBkZXNjcmlwdG9yIGZyb20gdmVuZG9yIHRhZyBvcGVyYXRpb25zLCIKKyAgICAgICAgICAgICAgICAicmVjZWl2ZWQgZXJyb3IgJXMgKCVkKS4gQ2FtZXJhIGNsaWVudHMgd2lsbCBub3QgYmUgYWJsZSB0byB1c2UiCisgICAgICAgICAgICAgICAgInZlbmRvciB0YWdzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihyZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86Om5vdGlmeURldmljZVN0YXRlQ2hhbmdlKAorICAgICAgICBoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU+IG5ld0RldmljZVN0YXRlKSB7CisgICAgbURldmljZVN0YXRlID0gbmV3RGV2aWNlU3RhdGU7CisgICAgaWYgKG1NaW5vclZlcnNpb24gPj0gNSkgeworICAgICAgICAvLyBDaGVjayBpZiB0aGUgcHJvdmlkZXIgaXMgY3VycmVudGx5IGFjdGl2ZSAtIG5vdCBnb2luZyB0byBzdGFydCBpdCB1cCBmb3IgdGhpcyBub3RpZmljYXRpb24KKyAgICAgICAgYXV0byBpbnRlcmZhY2UgPSBtU2F2ZWRJbnRlcmZhY2UgIT0gbnVsbHB0ciA/IG1TYXZlZEludGVyZmFjZSA6IG1BY3RpdmVJbnRlcmZhY2UucHJvbW90ZSgpOworICAgICAgICBpZiAoaW50ZXJmYWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIC8vIFNlbmQgY3VycmVudCBkZXZpY2Ugc3RhdGUKKyAgICAgICAgICAgIGF1dG8gY2FzdFJlc3VsdCA9IHByb3ZpZGVyOjpWMl81OjpJQ2FtZXJhUHJvdmlkZXI6OmNhc3RGcm9tKGludGVyZmFjZSk7CisgICAgICAgICAgICBpZiAoY2FzdFJlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBzcDxwcm92aWRlcjo6VjJfNTo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2VfMl81ID0gY2FzdFJlc3VsdDsKKyAgICAgICAgICAgICAgICBpZiAoaW50ZXJmYWNlXzJfNSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV8yXzUtPm5vdGlmeURldmljZVN0YXRlQ2hhbmdlKG1EZXZpY2VTdGF0ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwogdGVtcGxhdGU8Y2xhc3MgRGV2aWNlSW5mb1Q+CiBzdGQ6OnVuaXF1ZV9wdHI8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8+CiAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmluaXRpYWxpemVEZXZpY2VJbmZvKAogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgdWludDE2X3QgbWlub3JWZXJzaW9uKSBjb25zdCB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgdWludDE2X3QgbWlub3JWZXJzaW9uKSB7CiAgICAgU3RhdHVzIHN0YXR1czsKIAogICAgIGF1dG8gY2FtZXJhSW50ZXJmYWNlID0KLSAgICAgICAgICAgIGdldERldmljZUludGVyZmFjZTx0eXBlbmFtZSBEZXZpY2VJbmZvVDo6SW50ZXJmYWNlVD4obmFtZSk7CisgICAgICAgICAgICBzdGFydERldmljZUludGVyZmFjZTx0eXBlbmFtZSBEZXZpY2VJbmZvVDo6SW50ZXJmYWNlVD4obmFtZSk7CiAgICAgaWYgKGNhbWVyYUludGVyZmFjZSA9PSBudWxscHRyKSByZXR1cm4gbnVsbHB0cjsKIAogICAgIENhbWVyYVJlc291cmNlQ29zdCByZXNvdXJjZUNvc3Q7CkBAIC04MzAsMTMgKzE2NzgsMTMgQEAKICAgICB9CiAKICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPERldmljZUluZm8+KAotICAgICAgICBuZXcgRGV2aWNlSW5mb1QobmFtZSwgdGFnSWQsIGlkLCBtaW5vclZlcnNpb24sIHJlc291cmNlQ29zdCwKLSAgICAgICAgICAgICAgICBjYW1lcmFJbnRlcmZhY2UpKTsKKyAgICAgICAgbmV3IERldmljZUluZm9UKG5hbWUsIHRhZ0lkLCBpZCwgbWlub3JWZXJzaW9uLCByZXNvdXJjZUNvc3QsIHRoaXMsCisgICAgICAgICAgICAgICAgbVByb3ZpZGVyUHVibGljQ2FtZXJhSWRzLCBjYW1lcmFJbnRlcmZhY2UpKTsKIH0KIAogdGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlVD4KIHNwPEludGVyZmFjZVQ+Ci1DYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6Z2V0RGV2aWNlSW50ZXJmYWNlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSBjb25zdCB7CitDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6c3RhcnREZXZpY2VJbnRlcmZhY2UoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIHsKICAgICBBTE9HRSgiJXM6IERldmljZSAlczogVW5rbm93biBISURMIGRldmljZSBIQUwgbWFqb3IgdmVyc2lvbiAlZDoiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICBuYW1lLmNfc3RyKCksIEludGVyZmFjZVQ6OnZlcnNpb24uZ2V0X21ham9yKCkpOwogICAgIHJldHVybiBudWxscHRyOwpAQCAtODQ0LDEyICsxNjkyLDE2IEBACiAKIHRlbXBsYXRlPD4KIHNwPGRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZT4KLUNhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpnZXREZXZpY2VJbnRlcmZhY2UKLSAgICAgICAgPGRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZT4oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIGNvbnN0IHsKK0NhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpzdGFydERldmljZUludGVyZmFjZQorICAgICAgICA8ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlPihjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgewogICAgIFN0YXR1cyBzdGF0dXM7CiAgICAgc3A8ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlPiBjYW1lcmFJbnRlcmZhY2U7CiAgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7Ci0gICAgcmV0ID0gbUludGVyZmFjZS0+Z2V0Q2FtZXJhRGV2aWNlSW50ZXJmYWNlX1YxX3gobmFtZSwgWyZzdGF0dXMsICZjYW1lcmFJbnRlcmZhY2VdKAorICAgIGNvbnN0IHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZSA9IHN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldCA9IGludGVyZmFjZS0+Z2V0Q2FtZXJhRGV2aWNlSW50ZXJmYWNlX1YxX3gobmFtZSwgWyZzdGF0dXMsICZjYW1lcmFJbnRlcmZhY2VdKAogICAgICAgICBTdGF0dXMgcywgc3A8ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2UpIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwogICAgICAgICAgICAgICAgIGNhbWVyYUludGVyZmFjZSA9IGludGVyZmFjZTsKQEAgLTg2OSwxMiArMTcyMSwxNiBAQAogCiB0ZW1wbGF0ZTw+CiBzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+Ci1DYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6Z2V0RGV2aWNlSW50ZXJmYWNlCi0gICAgICAgIDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSBjb25zdCB7CitDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6c3RhcnREZXZpY2VJbnRlcmZhY2UKKyAgICAgICAgPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIHsKICAgICBTdGF0dXMgc3RhdHVzOwogICAgIHNwPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4gY2FtZXJhSW50ZXJmYWNlOwogICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OwotICAgIHJldCA9IG1JbnRlcmZhY2UtPmdldENhbWVyYURldmljZUludGVyZmFjZV9WM194KG5hbWUsIFsmc3RhdHVzLCAmY2FtZXJhSW50ZXJmYWNlXSgKKyAgICBjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2UgPSBzdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXQgPSBpbnRlcmZhY2UtPmdldENhbWVyYURldmljZUludGVyZmFjZV9WM194KG5hbWUsIFsmc3RhdHVzLCAmY2FtZXJhSW50ZXJmYWNlXSgKICAgICAgICAgU3RhdHVzIHMsIHNwPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4gaW50ZXJmYWNlKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKICAgICAgICAgICAgICAgICBjYW1lcmFJbnRlcmZhY2UgPSBpbnRlcmZhY2U7CkBAIC04OTUsNiArMTc1MSwxOCBAQAogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm86On5EZXZpY2VJbmZvKCkge30KIAogdGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlVD4KK3NwPEludGVyZmFjZVQ+IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvOjpzdGFydERldmljZUludGVyZmFjZSgpIHsKKyAgICBzcDxJbnRlcmZhY2VUPiBkZXZpY2U7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpZiAobVNhdmVkSW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgZGV2aWNlID0gbVBhcmVudFByb3ZpZGVyLT5zdGFydERldmljZUludGVyZmFjZTxJbnRlcmZhY2VUPihtTmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGV2aWNlID0gKEludGVyZmFjZVQgKikgbVNhdmVkSW50ZXJmYWNlLmdldCgpOworICAgIH0KKyAgICByZXR1cm4gZGV2aWNlOworfQorCit0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2VUPgogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm86OnNldFRvcmNoTW9kZShJbnRlcmZhY2VUJiBpbnRlcmZhY2UsCiAgICAgICAgIGJvb2wgZW5hYmxlZCkgewogICAgIFN0YXR1cyBzID0gaW50ZXJmYWNlLT5zZXRUb3JjaE1vZGUoZW5hYmxlZCA/IFRvcmNoTW9kZTo6T04gOiBUb3JjaE1vZGU6Ok9GRik7CkBAIC05MDUsMzAgKzE3NzMsMzEgQEAKICAgICAgICAgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKICAgICAgICAgdWludDE2X3QgbWlub3JWZXJzaW9uLAogICAgICAgICBjb25zdCBDYW1lcmFSZXNvdXJjZUNvc3QmIHJlc291cmNlQ29zdCwKKyAgICAgICAgc3A8UHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlciwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwdWJsaWNDYW1lcmFJZHMsCiAgICAgICAgIHNwPEludGVyZmFjZVQ+IGludGVyZmFjZSkgOgogICAgICAgICBEZXZpY2VJbmZvKG5hbWUsIHRhZ0lkLCBpZCwgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbnsxLCBtaW5vclZlcnNpb259LAotICAgICAgICAgICAgICAgICAgIHJlc291cmNlQ29zdCksCi0gICAgICAgIG1JbnRlcmZhY2UoaW50ZXJmYWNlKSB7CisgICAgICAgICAgICAgICAgICAgcHVibGljQ2FtZXJhSWRzLCByZXNvdXJjZUNvc3QsIHBhcmVudFByb3ZpZGVyKSB7CiAgICAgLy8gR2V0IGRlZmF1bHQgcGFyYW1ldGVycyBhbmQgaW5pdGlhbGl6ZSBmbGFzaCB1bml0IGF2YWlsYWJpbGl0eQogICAgIC8vIFJlcXVpcmVzIHBvd2VyaW5nIG9uIHRoZSBjYW1lcmEgZGV2aWNlCi0gICAgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1JbnRlcmZhY2UtPm9wZW4obnVsbHB0cik7CisgICAgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHN0YXR1cyA9IGludGVyZmFjZS0+b3BlbihudWxscHRyKTsKICAgICBpZiAoIXN0YXR1cy5pc09rKCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBvcGVuaW5nIGNhbWVyYSBkZXZpY2UgJXMgdG8gY2hlY2sgZm9yIGEgZmxhc2ggdW5pdDogJXMiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLmNfc3RyKCksIHN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgc3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIG9wZW4gY2FtZXJhIGRldmljZSAlcyB0byBjaGVjayBmb3IgYSBmbGFzaCB1bml0OiAlcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICBtSWQuY19zdHIoKSwgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzdGF0dXNUb1N0cmluZyhzdGF0dXMpKTsKKyAgICAgICAgICAgICAgICBpZC5jX3N0cigpLCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnN0YXR1c1RvU3RyaW5nKHN0YXR1cykpOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OwotICAgIHJldCA9IG1JbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoW3RoaXNdKGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgcGFybXMpIHsKKyAgICByZXQgPSBpbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoW3RoaXNdKGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgcGFybXMpIHsKICAgICAgICAgICAgICAgICBtRGVmYXVsdFBhcmFtZXRlcnMudW5mbGF0dGVuKFN0cmluZzgocGFybXMuY19zdHIoKSkpOwogICAgICAgICAgICAgfSk7CiAgICAgaWYgKCFyZXQuaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgcmVhZGluZyBjYW1lcmEgZGV2aWNlICVzIHBhcmFtcyB0byBjaGVjayBmb3IgYSBmbGFzaCB1bml0OiAlcyIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQuY19zdHIoKSwgc3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCBzdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBjb25zdCBjaGFyICpmbGFzaE1vZGUgPQpAQCAtOTM3LDI3ICsxODA2LDQzIEBACiAgICAgICAgIG1IYXNGbGFzaFVuaXQgPSB0cnVlOwogICAgIH0KIAotICAgIHJldCA9IG1JbnRlcmZhY2UtPmNsb3NlKCk7CisgICAgc3RhdHVzX3QgcmVzID0gY2FjaGVDYW1lcmFJbmZvKGludGVyZmFjZSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBjYWNoZSBDYW1lcmFJbmZvIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHJldCA9IGludGVyZmFjZS0+Y2xvc2UoKTsKICAgICBpZiAoIXJldC5pc09rKCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBjbG9zaW5nIGNhbWVyYSBkZXZpY2UgJXMgYWZ0ZXIgY2hlY2sgZm9yIGEgZmxhc2ggdW5pdDogJXMiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLmNfc3RyKCksIHN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgc3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorCisgICAgaWYgKCFrRW5hYmxlTGF6eUhhbCkgeworICAgICAgICAvLyBTYXZlIEhBTCByZWZlcmVuY2UgaW5kZWZpbml0ZWx5CisgICAgICAgIG1TYXZlZEludGVyZmFjZSA9IGludGVyZmFjZTsKICAgICB9CiB9CiAKIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMTo6fkRldmljZUluZm8xKCkge30KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8xOjpzZXRUb3JjaE1vZGUoYm9vbCBlbmFibGVkKSB7Ci0gICAgcmV0dXJuIERldmljZUluZm86OnNldFRvcmNoTW9kZShtSW50ZXJmYWNlLCBlbmFibGVkKTsKKyAgICByZXR1cm4gc2V0VG9yY2hNb2RlRm9yRGV2aWNlPEludGVyZmFjZVQ+KGVuYWJsZWQpOwogfQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzE6OmdldENhbWVyYUluZm8oCiAgICAgICAgIGhhcmR3YXJlOjpDYW1lcmFJbmZvICppbmZvKSBjb25zdCB7CiAgICAgaWYgKGluZm8gPT0gbnVsbHB0cikgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAqaW5mbyA9IG1JbmZvOworICAgIHJldHVybiBPSzsKK30KIAorc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8xOjpjYWNoZUNhbWVyYUluZm8oCisgICAgICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMTo6SW50ZXJmYWNlVD4gaW50ZXJmYWNlKSB7CiAgICAgU3RhdHVzIHN0YXR1czsKICAgICBkZXZpY2U6OlYxXzA6OkNhbWVyYUluZm8gY0luZm87CiAgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7Ci0gICAgcmV0ID0gbUludGVyZmFjZS0+Z2V0Q2FtZXJhSW5mbyhbJnN0YXR1cywgJmNJbmZvXShTdGF0dXMgcywgZGV2aWNlOjpWMV8wOjpDYW1lcmFJbmZvIGNhbUluZm8pIHsKKyAgICByZXQgPSBpbnRlcmZhY2UtPmdldENhbWVyYUluZm8oWyZzdGF0dXMsICZjSW5mb10oU3RhdHVzIHMsIGRldmljZTo6VjFfMDo6Q2FtZXJhSW5mbyBjYW1JbmZvKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKICAgICAgICAgICAgICAgICBjSW5mbyA9IGNhbUluZm87CiAgICAgICAgICAgICB9KTsKQEAgLTk3MiwyNyArMTg1NywzMSBAQAogCiAgICAgc3dpdGNoKGNJbmZvLmZhY2luZykgewogICAgICAgICBjYXNlIGRldmljZTo6VjFfMDo6Q2FtZXJhRmFjaW5nOjpCQUNLOgotICAgICAgICAgICAgaW5mby0+ZmFjaW5nID0gaGFyZHdhcmU6OkNBTUVSQV9GQUNJTkdfQkFDSzsKKyAgICAgICAgICAgIG1JbmZvLmZhY2luZyA9IGhhcmR3YXJlOjpDQU1FUkFfRkFDSU5HX0JBQ0s7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBkZXZpY2U6OlYxXzA6OkNhbWVyYUZhY2luZzo6RVhURVJOQUw6CiAgICAgICAgICAgICAvLyBNYXAgZXh0ZXJuYWwgdG8gZnJvbnQgZm9yIGxlZ2FjeSBBUEkKICAgICAgICAgY2FzZSBkZXZpY2U6OlYxXzA6OkNhbWVyYUZhY2luZzo6RlJPTlQ6Ci0gICAgICAgICAgICBpbmZvLT5mYWNpbmcgPSBoYXJkd2FyZTo6Q0FNRVJBX0ZBQ0lOR19GUk9OVDsKKyAgICAgICAgICAgIG1JbmZvLmZhY2luZyA9IGhhcmR3YXJlOjpDQU1FUkFfRkFDSU5HX0ZST05UOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HVygiJXM6IERldmljZSAlczogVW5rbm93biBjYW1lcmEgZmFjaW5nOiAlZCIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLmNfc3RyKCksIGNJbmZvLmZhY2luZyk7Ci0gICAgICAgICAgICBpbmZvLT5mYWNpbmcgPSBoYXJkd2FyZTo6Q0FNRVJBX0ZBQ0lOR19CQUNLOworICAgICAgICAgICAgbUluZm8uZmFjaW5nID0gaGFyZHdhcmU6OkNBTUVSQV9GQUNJTkdfQkFDSzsKICAgICB9Ci0gICAgaW5mby0+b3JpZW50YXRpb24gPSBjSW5mby5vcmllbnRhdGlvbjsKKyAgICBtSW5mby5vcmllbnRhdGlvbiA9IGNJbmZvLm9yaWVudGF0aW9uOwogCiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzE6OmR1bXBTdGF0ZShpbnQgZmQpIGNvbnN0IHsKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMTo6ZHVtcFN0YXRlKGludCBmZCkgewogICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwwKTsKICAgICBoYW5kbGUtPmRhdGFbMF0gPSBmZDsKLSAgICBoYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4gcyA9IG1JbnRlcmZhY2UtPmR1bXBTdGF0ZShoYW5kbGUpOworICAgIGNvbnN0IHNwPEludGVyZmFjZVQ+IGludGVyZmFjZSA9IHN0YXJ0RGV2aWNlSW50ZXJmYWNlPEludGVyZmFjZVQ+KCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHMgPSBpbnRlcmZhY2UtPmR1bXBTdGF0ZShoYW5kbGUpOwogICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7CiAgICAgaWYgKCFzLmlzT2soKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0xMDA0LDE0ICsxODkzLDE1IEBACiAgICAgICAgIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLCBjb25zdCBzdGQ6OnN0cmluZyAmaWQsCiAgICAgICAgIHVpbnQxNl90IG1pbm9yVmVyc2lvbiwKICAgICAgICAgY29uc3QgQ2FtZXJhUmVzb3VyY2VDb3N0JiByZXNvdXJjZUNvc3QsCisgICAgICAgIHNwPFByb3ZpZGVySW5mbz4gcGFyZW50UHJvdmlkZXIsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHVibGljQ2FtZXJhSWRzLAogICAgICAgICBzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UpIDoKICAgICAgICAgRGV2aWNlSW5mbyhuYW1lLCB0YWdJZCwgaWQsIGhhcmR3YXJlOjpoaWRsX3ZlcnNpb257MywgbWlub3JWZXJzaW9ufSwKLSAgICAgICAgICAgICAgICAgICByZXNvdXJjZUNvc3QpLAotICAgICAgICBtSW50ZXJmYWNlKGludGVyZmFjZSkgeworICAgICAgICAgICAgICAgICAgIHB1YmxpY0NhbWVyYUlkcywgcmVzb3VyY2VDb3N0LCBwYXJlbnRQcm92aWRlcikgewogICAgIC8vIEdldCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGFuZCBpbml0aWFsaXplIGZsYXNoIHVuaXQgYXZhaWxhYmlsaXR5CiAgICAgU3RhdHVzIHN0YXR1czsKICAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICByZXQgPSBtSW50ZXJmYWNlLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoWyZzdGF0dXMsIHRoaXNdKFN0YXR1cyBzLAorICAgIHJldCA9IGludGVyZmFjZS0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKFsmc3RhdHVzLCB0aGlzXShTdGF0dXMgcywKICAgICAgICAgICAgICAgICAgICAgZGV2aWNlOjpWM18yOjpDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YSkgewogICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CiAgICAgICAgICAgICAgICAgaWYgKHMgPT0gU3RhdHVzOjpPSykgewpAQCAtMTAzMCwxNSArMTkyMCwzNSBAQAogICAgICAgICAgICAgfSk7CiAgICAgaWYgKCFyZXQuaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgZ2V0dGluZyBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGZvciBkZXZpY2UgJXMiCi0gICAgICAgICAgICAgICAgIiB0byBjaGVjayBmb3IgYSBmbGFzaCB1bml0OiAlcyIsIF9fRlVOQ1RJT05fXywgbUlkLmNfc3RyKCksCisgICAgICAgICAgICAgICAgIiB0byBjaGVjayBmb3IgYSBmbGFzaCB1bml0OiAlcyIsIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwKICAgICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZ2V0IGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgZm9yIGRldmljZSAlczogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQuY19zdHIoKSwgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzdGF0dXNUb1N0cmluZyhzdGF0dXMpLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzdGF0dXNUb1N0cmluZyhzdGF0dXMpLCBzdGF0dXMpOwogICAgICAgICByZXR1cm47CiAgICAgfQorCisgICAgbUlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYSA9IGlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYSgpOworCisgICAgc3RhdHVzX3QgcmVzID0gZml4dXBNb25vY2hyb21lVGFncygpOworICAgIGlmIChPSyAhPSByZXMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZml4IHVwIG1vbm9jaHJvbWUgdGFncyBiYXNlZCBmb3Igb2xkZXIgSEFMIHZlcnNpb246ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYXV0byBzdGF0ID0gYWRkRHluYW1pY0RlcHRoVGFncygpOworICAgIGlmIChPSyAhPSBzdGF0KSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIGFwcGVuZGluZyBkeW5hbWljIGRlcHRoIHRhZ3M6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1zdGF0KSwKKyAgICAgICAgICAgICAgICBzdGF0KTsKKyAgICB9CisgICAgcmVzID0gZGVyaXZlSGVpY1RhZ3MoKTsKKyAgICBpZiAoT0sgIT0gcmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGRlcml2ZSBIRUlDIHRhZ3MgYmFzZWQgb24gY2FtZXJhIGFuZCBtZWRpYSBjYXBhYmlsaXRpZXM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgfQorCiAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGZsYXNoQXZhaWxhYmxlID0KICAgICAgICAgICAgIG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZmluZChBTkRST0lEX0ZMQVNIX0lORk9fQVZBSUxBQkxFKTsKICAgICBpZiAoZmxhc2hBdmFpbGFibGUuY291bnQgPT0gMSAmJgpAQCAtMTA0NywxMiArMTk1Nyw3MSBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIG1IYXNGbGFzaFVuaXQgPSBmYWxzZTsKICAgICB9CisKKyAgICBxdWVyeVBoeXNpY2FsQ2FtZXJhSWRzKCk7CisKKyAgICAvLyBHZXQgcGh5c2ljYWwgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBpZiBhcHBsaWNhYmxlCisgICAgYXV0byBjYXN0UmVzdWx0ID0gZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlOjpjYXN0RnJvbShpbnRlcmZhY2UpOworICAgIGlmICghY2FzdFJlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBVbmFibGUgdG8gY29udmVydCBJQ2FtZXJhRGV2aWNlIGluc3RhbmNlIHRvIHZlcnNpb24gMy41IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2U+IGludGVyZmFjZV8zXzUgPSBjYXN0UmVzdWx0OworICAgIGlmIChpbnRlcmZhY2VfM181ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb252ZXJ0ZWQgSUNhbWVyYURldmljZSBpbnN0YW5jZSB0byBudWxscHRyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtSXNMb2dpY2FsQ2FtZXJhKSB7CisgICAgICAgIGZvciAoYXV0byYgaWQgOiBtUGh5c2ljYWxJZHMpIHsKKyAgICAgICAgICAgIGlmIChzdGQ6OmZpbmQobVB1YmxpY0NhbWVyYUlkcy5iZWdpbigpLCBtUHVibGljQ2FtZXJhSWRzLmVuZCgpLCBpZCkgIT0KKyAgICAgICAgICAgICAgICAgICAgbVB1YmxpY0NhbWVyYUlkcy5lbmQoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF9zdHJpbmcgaGlkbElkKGlkKTsKKyAgICAgICAgICAgIHJldCA9IGludGVyZmFjZV8zXzUtPmdldFBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGhpZGxJZCwKKyAgICAgICAgICAgICAgICAgICAgWyZzdGF0dXMsICZpZCwgdGhpc10oU3RhdHVzIHMsIGRldmljZTo6VjNfMjo6Q2FtZXJhTWV0YWRhdGEgbWV0YWRhdGEpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgIGlmIChzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QgKmJ1ZmZlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KG1ldGFkYXRhLmRhdGEoKSk7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBleHBlY3RlZFNpemUgPSBtZXRhZGF0YS5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIGludCByZXMgPSB2YWxpZGF0ZV9jYW1lcmFfbWV0YWRhdGFfc3RydWN0dXJlKGJ1ZmZlciwgJmV4cGVjdGVkU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gT0sgfHwgcmVzID09IENBTUVSQV9NRVRBREFUQV9WQUxJREFUSU9OX1NISUZURUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldF9jYW1lcmFfbWV0YWRhdGFfdmVuZG9yX2lkKGJ1ZmZlciwgbVByb3ZpZGVyVGFnaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgbVBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzW2lkXSA9IGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogTWFsZm9ybWVkIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIEhBTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBTdGF0dXM6OklOVEVSTkFMX0VSUk9SOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisKKyAgICAgICAgICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgZ2V0dGluZyBwaHlzaWNhbCBjYW1lcmEgJXMgY2hhcmFjdGVyaXN0aWNzIGZvciAlczogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5jX3N0cigpLCBpZC5jX3N0cigpLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBnZXQgcGh5c2ljYWwgY2FtZXJhICVzIGNoYXJhY3RlcmlzdGljcyBmb3IgZGV2aWNlICVzOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgbUlkLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnN0YXR1c1RvU3RyaW5nKHN0YXR1cyksIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFrRW5hYmxlTGF6eUhhbCkgeworICAgICAgICAvLyBTYXZlIEhBTCByZWZlcmVuY2UgaW5kZWZpbml0ZWx5CisgICAgICAgIG1TYXZlZEludGVyZmFjZSA9IGludGVyZmFjZTsKKyAgICB9CiB9CiAKIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6fkRldmljZUluZm8zKCkge30KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpzZXRUb3JjaE1vZGUoYm9vbCBlbmFibGVkKSB7Ci0gICAgcmV0dXJuIERldmljZUluZm86OnNldFRvcmNoTW9kZShtSW50ZXJmYWNlLCBlbmFibGVkKTsKKyAgICByZXR1cm4gc2V0VG9yY2hNb2RlRm9yRGV2aWNlPEludGVyZmFjZVQ+KGVuYWJsZWQpOwogfQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmdldENhbWVyYUluZm8oCkBAIC0xMTAzLDEwICsyMDcyLDE0IEBACiAgICAgcmV0dXJuIGlzQmFja3dhcmRDb21wYXRpYmxlOwogfQogCi1zdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmR1bXBTdGF0ZShpbnQgZmQpIGNvbnN0IHsKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6ZHVtcFN0YXRlKGludCBmZCkgewogICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwwKTsKICAgICBoYW5kbGUtPmRhdGFbMF0gPSBmZDsKLSAgICBhdXRvIHJldCA9IG1JbnRlcmZhY2UtPmR1bXBTdGF0ZShoYW5kbGUpOworICAgIGNvbnN0IHNwPEludGVyZmFjZVQ+IGludGVyZmFjZSA9IHN0YXJ0RGV2aWNlSW50ZXJmYWNlPEludGVyZmFjZVQ+KCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgYXV0byByZXQgPSBpbnRlcmZhY2UtPmR1bXBTdGF0ZShoYW5kbGUpOwogICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7CiAgICAgaWYgKCFyZXQuaXNPaygpKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTExMjIsNiArMjA5NSw2MSBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpnZXRQaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcygKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBoeXNpY2FsQ2FtZXJhSWQsIENhbWVyYU1ldGFkYXRhICpjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IHsKKyAgICBpZiAoY2hhcmFjdGVyaXN0aWNzID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7CisgICAgaWYgKG1QaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcy5maW5kKHBoeXNpY2FsQ2FtZXJhSWQpID09CisgICAgICAgICAgICBtUGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgIH0KKworICAgICpjaGFyYWN0ZXJpc3RpY3MgPSBtUGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MuYXQocGh5c2ljYWxDYW1lcmFJZCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbiwKKyAgICAgICAgYm9vbCAqc3RhdHVzIC8qb3V0Ki8pIHsKKworICAgIGNvbnN0IHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6SW50ZXJmYWNlVD4gaW50ZXJmYWNlID0KKyAgICAgICAgICAgIHRoaXMtPnN0YXJ0RGV2aWNlSW50ZXJmYWNlPENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6SW50ZXJmYWNlVD4oKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBhdXRvIGNhc3RSZXN1bHQgPSBkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2U6OmNhc3RGcm9tKGludGVyZmFjZSk7CisgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2VfM181ID0gY2FzdFJlc3VsdDsKKyAgICBpZiAoaW50ZXJmYWNlXzNfNSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZXM7CisgICAgU3RhdHVzIGNhbGxTdGF0dXM7CisgICAgYXV0byByZXQgPSAgaW50ZXJmYWNlXzNfNS0+aXNTdHJlYW1Db21iaW5hdGlvblN1cHBvcnRlZChjb25maWd1cmF0aW9uLAorICAgICAgICAgICAgWyZjYWxsU3RhdHVzLCAmc3RhdHVzXSAoU3RhdHVzIHMsIGJvb2wgY29tYlN0YXR1cykgeworICAgICAgICAgICAgICAgIGNhbGxTdGF0dXMgPSBzOworICAgICAgICAgICAgICAgICpzdGF0dXMgPSBjb21iU3RhdHVzOworICAgICAgICAgICAgfSk7CisgICAgaWYgKHJldC5pc09rKCkpIHsKKyAgICAgICAgc3dpdGNoIChjYWxsU3RhdHVzKSB7CisgICAgICAgICAgICBjYXNlIFN0YXR1czo6T0s6CisgICAgICAgICAgICAgICAgLy8gRXhwZWN0ZWQgY2FzZSwgZG8gbm90aGluZy4KKyAgICAgICAgICAgICAgICByZXMgPSBPSzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgU3RhdHVzOjpNRVRIT0RfTk9UX1NVUFBPUlRFRDoKKyAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTZXNzaW9uIGNvbmZpZ3VyYXRpb24gcXVlcnkgZmFpbGVkOiAlZCIsIF9fRlVOQ1RJT05fXywgY2FsbFN0YXR1cyk7CisgICAgICAgICAgICAgICAgcmVzID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogVW5leHBlY3RlZCBiaW5kZXIgZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmVzID0gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6cGFyc2VQcm92aWRlck5hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCiAgICAgICAgIHN0ZDo6c3RyaW5nICp0eXBlLCB1aW50MzJfdCAqaWQpIHsKICAgICAvLyBGb3JtYXQgbXVzdCBiZSAiPHR5cGU+LzxpZD4iCkBAIC0xMzY0LDcgKzIzOTIsNyBAQAogCiAKIHN0YXR1c190IEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbUhpZGwoCi0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlZlbmRvclRhZ1NlY3Rpb24+JiB2dHMsCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxjb21tb246OlYxXzA6OlZlbmRvclRhZ1NlY3Rpb24+JiB2dHMsCiAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4mIGRlc2NyaXB0b3IpIHsKIApAQCAtMTM5Miw3ICsyNDIwLDcgQEAKIAogICAgIGludCBpZHggPSAwOwogICAgIGZvciAoc2l6ZV90IHMgPSAwOyBzIDwgdnRzLnNpemUoKTsgcysrKSB7Ci0gICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6VmVuZG9yVGFnU2VjdGlvbiYgc2VjdGlvbiA9IHZ0c1tzXTsKKyAgICAgICAgY29uc3QgY29tbW9uOjpWMV8wOjpWZW5kb3JUYWdTZWN0aW9uJiBzZWN0aW9uID0gdnRzW3NdOwogICAgICAgICBjb25zdCBjaGFyICpzZWN0aW9uTmFtZSA9IHNlY3Rpb24uc2VjdGlvbk5hbWUuY19zdHIoKTsKICAgICAgICAgaWYgKHNlY3Rpb25OYW1lID09IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogbm8gc2VjdGlvbiBuYW1lIGRlZmluZWQgZm9yIHZlbmRvciB0YWcgc2VjdGlvbiAlenUuIiwgX19GVU5DVElPTl9fLCBzKTsKQEAgLTE0NTMsNDkgKzI0ODEsNjkgQEAKIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3NMb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAogICAgICAgICBDYW1lcmFNZXRhZGF0YSogY2hhcmFjdGVyaXN0aWNzKSBjb25zdCB7Ci0gICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQsIC8qbWluVmVyc2lvbiovIHszLDB9LCAvKm1heFZlcnNpb24qLyB7NCwwfSk7Ci0gICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkLCAvKm1pblZlcnNpb24qLyB7MywwfSwgLyptYXhWZXJzaW9uKi8gezUsMH0pOworICAgIGlmIChkZXZpY2VJbmZvICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGRldmljZUluZm8tPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjaGFyYWN0ZXJpc3RpY3MpOworICAgIH0KIAotICAgIHJldHVybiBkZXZpY2VJbmZvLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY2hhcmFjdGVyaXN0aWNzKTsKKyAgICAvLyBGaW5kIGhpZGRlbiBwaHlzaWNhbCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzCisgICAgZm9yIChhdXRvJiBwcm92aWRlciA6IG1Qcm92aWRlcnMpIHsKKyAgICAgICAgZm9yIChhdXRvJiBkZXZpY2VJbmZvIDogcHJvdmlkZXItPm1EZXZpY2VzKSB7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBkZXZpY2VJbmZvLT5nZXRQaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcyhpZCwgY2hhcmFjdGVyaXN0aWNzKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gTkFNRV9OT1RfRk9VTkQpIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CiB9CiAKIHZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpmaWx0ZXJMb2dpY2FsQ2FtZXJhSWRzTG9ja2VkKAogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGRldmljZUlkcykgY29uc3QKIHsKLSAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IHJlbW92ZWRJZHM7CisgICAgLy8gTWFwIGJldHdlZW4gY2FtZXJhIGZhY2luZyBhbmQgY2FtZXJhIElEcyByZWxhdGVkIHRvIGxvZ2ljYWwgY2FtZXJhLgorICAgIHN0ZDo6bWFwPGludCwgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPj4gaWRDb21ib3M7CiAKKyAgICAvLyBDb2xsZWN0IGFsbCBsb2dpY2FsIGFuZCBpdHMgdW5kZXJseWluZyBwaHlzaWNhbCBjYW1lcmEgSURzIGZvciBlYWNoCisgICAgLy8gZmFjaW5nLgogICAgIGZvciAoYXV0byYgZGV2aWNlSWQgOiBkZXZpY2VJZHMpIHsKLSAgICAgICAgQ2FtZXJhTWV0YWRhdGEgaW5mbzsKLSAgICAgICAgc3RhdHVzX3QgcmVzID0gZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzTG9ja2VkKGRldmljZUlkLCAmaW5mbyk7Ci0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyBmb3IgaWQgJXMiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgICAgIGRldmljZUlkLmNfc3RyKCkpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9CisgICAgICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGRldmljZUlkKTsKKyAgICAgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgY29udGludWU7CiAKLSAgICAgICAgLy8gaWRDb21ibyBjb250YWlucyB0aGUgaWRzIG9mIGEgbG9naWNhbCBjYW1lcmEgYW5kIGl0cyBwaHlzaWNhbCBjYW1lcmFzCi0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBpZENvbWJvOwotICAgICAgICBib29sIGxvZ2ljYWxDYW1lcmEgPSBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzTG9naWNhbENhbWVyYShpbmZvLCAmaWRDb21ibyk7Ci0gICAgICAgIGlmICghbG9naWNhbENhbWVyYSkgeworICAgICAgICBpZiAoIWRldmljZUluZm8tPm1Jc0xvZ2ljYWxDYW1lcmEpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIGlkQ29tYm8ucHVzaF9iYWNrKGRldmljZUlkKTsKIAorICAgICAgICAvLyBjb21ibyBjb250YWlucyB0aGUgaWRzIG9mIGEgbG9naWNhbCBjYW1lcmEgYW5kIGl0cyBwaHlzaWNhbCBjYW1lcmFzCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb21ibyA9IGRldmljZUluZm8tPm1QaHlzaWNhbElkczsKKyAgICAgICAgY29tYm8ucHVzaF9iYWNrKGRldmljZUlkKTsKKworICAgICAgICBoYXJkd2FyZTo6Q2FtZXJhSW5mbyBpbmZvOworICAgICAgICBzdGF0dXNfdCByZXMgPSBkZXZpY2VJbmZvLT5nZXRDYW1lcmFJbmZvKCZpbmZvKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvciByZWFkaW5nIGNhbWVyYSBpbmZvOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlkQ29tYm9zW2luZm8uZmFjaW5nXS5pbnNlcnQoY29tYm8uYmVnaW4oKSwgY29tYm8uZW5kKCkpOworICAgIH0KKworICAgIC8vIE9ubHkgZXhwb3NlIG9uZSBjYW1lcmEgSUQgcGVyIGZhY2luZyBmb3IgYWxsIGxvZ2ljYWwgYW5kIHVuZGVybHlpbmcKKyAgICAvLyBwaHlzaWNhbCBjYW1lcmEgSURzLgorICAgIGZvciAoYXV0byYgciA6IGlkQ29tYm9zKSB7CisgICAgICAgIGF1dG8mIHJlbW92ZWRJZHMgPSByLnNlY29uZDsKICAgICAgICAgZm9yIChhdXRvJiBpZCA6IGRldmljZUlkcykgewotICAgICAgICAgICAgYXV0byBmb3VuZElkID0gc3RkOjpmaW5kKGlkQ29tYm8uYmVnaW4oKSwgaWRDb21iby5lbmQoKSwgaWQpOwotICAgICAgICAgICAgaWYgKGZvdW5kSWQgPT0gaWRDb21iby5lbmQoKSkgeworICAgICAgICAgICAgYXV0byBmb3VuZElkID0gc3RkOjpmaW5kKHJlbW92ZWRJZHMuYmVnaW4oKSwgcmVtb3ZlZElkcy5lbmQoKSwgaWQpOworICAgICAgICAgICAgaWYgKGZvdW5kSWQgPT0gcmVtb3ZlZElkcy5lbmQoKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZENvbWJvLmVyYXNlKGZvdW5kSWQpOwotICAgICAgICAgICAgcmVtb3ZlZElkcy5pbnNlcnQoaWRDb21iby5iZWdpbigpLCBpZENvbWJvLmVuZCgpKTsKKyAgICAgICAgICAgIHJlbW92ZWRJZHMuZXJhc2UoZm91bmRJZCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQorICAgICAgICBkZXZpY2VJZHMuZXJhc2Uoc3RkOjpyZW1vdmVfaWYoZGV2aWNlSWRzLmJlZ2luKCksIGRldmljZUlkcy5lbmQoKSwKKyAgICAgICAgICAgICAgICBbJnJlbW92ZWRJZHNdKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlbW92ZWRJZHMuZmluZChzKSAhPSByZW1vdmVkSWRzLmVuZCgpO30pLAorICAgICAgICAgICAgICAgIGRldmljZUlkcy5lbmQoKSk7CiAgICAgfQotCi0gICAgZGV2aWNlSWRzLmVyYXNlKHN0ZDo6cmVtb3ZlX2lmKGRldmljZUlkcy5iZWdpbigpLCBkZXZpY2VJZHMuZW5kKCksCi0gICAgICAgICAgICBbJnJlbW92ZWRJZHNdKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7cmV0dXJuIHJlbW92ZWRJZHMuZmluZChzKSAhPSByZW1vdmVkSWRzLmVuZCgpO30pLAotICAgICAgICAgICAgZGV2aWNlSWRzLmVuZCgpKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oCmluZGV4IGI4YjhiOGMuLmE0MmZiNGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkFQUk9WSURFUl9ICiAKICNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KICNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxtdXRleD4KQEAgLTI3LDggKzI4LDggQEAKICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2NvbW1vbi8xLjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9wcm92aWRlci8yLjQvSUNhbWVyYVByb3ZpZGVyLmg+Ci0vLyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9wcm92aWRlci8yLjQvSUNhbWVyYVByb3ZpZGVyQ2FsbGJhY2tzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvcHJvdmlkZXIvMi41L0lDYW1lcmFQcm92aWRlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjQvSUNhbWVyYURldmljZVNlc3Npb24uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWFuYWdlci8xLjAvSVNlcnZpY2VOb3RpZmljYXRpb24uaD4KICNpbmNsdWRlIDxjYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oPgogCkBAIC0xMTAsNiArMTExLDE0IEBACiAgICAgfTsKIAogICAgIC8qKgorICAgICAqIFJlcHJlc2VudHMgdGhlIG1vZGUgYSBjYW1lcmEgZGV2aWNlIGlzIGN1cnJlbnRseSBpbgorICAgICAqLworICAgIGVudW0gY2xhc3MgRGV2aWNlTW9kZSB7CisgICAgICAgIFRPUkNILAorICAgICAgICBDQU1FUkEKKyAgICB9OworCisgICAgLyoqCiAgICAgICogSW5pdGlhbGl6ZSB0aGUgbWFuYWdlciBhbmQgZ2l2ZSBpdCBhIHN0YXR1cyBsaXN0ZW5lcjsgb3B0aW9uYWxseSBhY2NlcHRzIGEgc2VydmljZQogICAgICAqIGludGVyYWN0aW9uIHByb3h5LgogICAgICAqCkBAIC0xNjYsNiArMTc1LDEzIEBACiAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSogY2hhcmFjdGVyaXN0aWNzKSBjb25zdDsKIAogICAgIC8qKgorICAgICAqIENoZWNrIGZvciBkZXZpY2Ugc3VwcG9ydCBvZiBzcGVjaWZpYyBzdHJlYW0gY29tYmluYXRpb24uCisgICAgICovCisgICAgc3RhdHVzX3QgaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZChjb25zdCBzdGQ6OnN0cmluZyYgaWQsCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICBib29sICpzdGF0dXMgLypvdXQqLykgY29uc3Q7CisKKyAgICAvKioKICAgICAgKiBSZXR1cm4gdGhlIGhpZ2hlc3Qgc3VwcG9ydGVkIGRldmljZSBpbnRlcmZhY2UgdmVyc2lvbiBmb3IgdGhpcyBJRAogICAgICAqLwogICAgIHN0YXR1c190IGdldEhpZ2hlc3RTdXBwb3J0ZWRWZXJzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKQEAgLTE3NCw3ICsxOTAsNyBAQAogICAgIC8qKgogICAgICAqIENoZWNrIGlmIGEgZ2l2ZW4gY2FtZXJhIGRldmljZSBzdXBwb3J0IHNldFRvcmNoTW9kZSBBUEkuCiAgICAgICovCi0gICAgYm9vbCBzdXBwb3J0U2V0VG9yY2hNb2RlKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCk7CisgICAgYm9vbCBzdXBwb3J0U2V0VG9yY2hNb2RlKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCkgY29uc3Q7CiAKICAgICAvKioKICAgICAgKiBUdXJuIG9uIG9yIG9mZiB0aGUgZmxhc2hsaWdodCBvbiBhIGdpdmVuIGNhbWVyYSBkZXZpY2UuCkBAIC0xODksNiArMjA1LDEyIEBACiAgICAgc3RhdHVzX3Qgc2V0VXBWZW5kb3JUYWdzKCk7CiAKICAgICAvKioKKyAgICAgKiBJbmZvcm0gcmVnaXN0ZXJlZCBwcm92aWRlcnMgYWJvdXQgYSBkZXZpY2Ugc3RhdGUgY2hhbmdlLCBzdWNoIGFzIGZvbGRpbmcgb3IgdW5mb2xkaW5nCisgICAgICovCisgICAgc3RhdHVzX3Qgbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoCisgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4gbmV3U3RhdGUpOworCisgICAgLyoqCiAgICAgICogT3BlbiBhbiBhY3RpdmUgc2Vzc2lvbiB0byBhIGNhbWVyYSBkZXZpY2UuCiAgICAgICoKICAgICAgKiBUaGlzIGZ1bGx5IHBvd2VycyBvbiB0aGUgY2FtZXJhIGRldmljZSBoYXJkd2FyZSwgYW5kIHJldHVybnMgYSBoYW5kbGUgdG8gYQpAQCAtMjA1LDYgKzIyNywxNyBAQAogICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlPiAqc2Vzc2lvbik7CiAKICAgICAvKioKKyAgICAgKiBTYXZlIHRoZSBJQ2FtZXJhUHJvdmlkZXIgd2hpbGUgaXQgaXMgYmVpbmcgdXNlZCBieSBhIGNhbWVyYSBvciB0b3JjaCBjbGllbnQKKyAgICAgKi8KKyAgICB2b2lkIHNhdmVSZWYoRGV2aWNlTW9kZSB1c2FnZVR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nICZjYW1lcmFJZCwKKyAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IHByb3ZpZGVyKTsKKworICAgIC8qKgorICAgICAqIE5vdGlmeSB0aGF0IHRoZSBjYW1lcmEgb3IgdG9yY2ggaXMgbm8gbG9uZ2VyIGJlaW5nIHVzZWQgYnkgYSBjYW1lcmEgY2xpZW50CisgICAgICovCisgICAgdm9pZCByZW1vdmVSZWYoRGV2aWNlTW9kZSB1c2FnZVR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nICZjYW1lcmFJZCk7CisKKyAgICAvKioKICAgICAgKiBJU2VydmljZU5vdGlmaWNhdGlvbjo6b25SZWdpc3RyYXRpb24KICAgICAgKiBJbnZva2VkIGJ5IHRoZSBoYXJkd2FyZSBzZXJ2aWNlIG1hbmFnZXIgd2hlbiBhIG5ldyBjYW1lcmEgcHJvdmlkZXIgaXMgcmVnaXN0ZXJlZAogICAgICAqLwpAQCAtMjMxLDEyICsyNjQsMTUgQEAKICAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlcnNpb24gbWF4VmVyc2lvbiA9IGhhcmR3YXJlOjpoaWRsX3ZlcnNpb257MTAwMCwwfSkgY29uc3Q7CiAKICAgICAvKgotICAgICAqIENoZWNrIGlmIGEgY2FtZXJhIHdpdGggc3RhdGljSW5mbyBpcyBhIGxvZ2ljYWwgY2FtZXJhLiBBbmQgaWYgeWVzLCByZXR1cm4KKyAgICAgKiBDaGVjayBpZiBhIGNhbWVyYSBpcyBhIGxvZ2ljYWwgY2FtZXJhLiBBbmQgaWYgeWVzLCByZXR1cm4KICAgICAgKiB0aGUgcGh5c2ljYWwgY2FtZXJhIGlkcy4KICAgICAgKi8KLSAgICBzdGF0aWMgYm9vbCBpc0xvZ2ljYWxDYW1lcmEoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHN0YXRpY0luZm8sCi0gICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4qIHBoeXNpY2FsQ2FtZXJhSWRzKTsKKyAgICBib29sIGlzTG9naWNhbENhbWVyYShjb25zdCBzdGQ6OnN0cmluZyYgaWQsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogcGh5c2ljYWxDYW1lcmFJZHMpOwogCisgICAgYm9vbCBpc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmEoY29uc3Qgc3RkOjpzdHJpbmcmIGlkKTsKKyAgICBib29sIGlzSGlkZGVuUGh5c2ljYWxDYW1lcmEoY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkKTsKKworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBrRGVwdGhBUlRvbGVyYW5jZTsKIHByaXZhdGU6CiAgICAgLy8gQWxsIHByaXZhdGUgbWVtYmVycywgdW5sZXNzIG90aGVyd2lzZSBub3RlZCwgZXhwZWN0IG1JbnRlcmZhY2VNdXRleCB0byBiZSBsb2NrZWQgYmVmb3JlIHVzZQogICAgIG11dGFibGUgc3RkOjptdXRleCBtSW50ZXJmYWNlTXV0ZXg7CkBAIC0yNDYsMjIgKzI4Miw1NyBAQAogICAgIHdwPFN0YXR1c0xpc3RlbmVyPiBtTGlzdGVuZXI7CiAgICAgU2VydmljZUludGVyYWN0aW9uUHJveHkqIG1TZXJ2aWNlUHJveHk7CiAKKyAgICAvLyBDdXJyZW50IG92ZXJhbGwgQW5kcm9pZCBkZXZpY2UgcGh5c2ljYWwgc3RhdHVzCisgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPiBtRGV2aWNlU3RhdGU7CisKKyAgICAvLyBtUHJvdmlkZXJMaWZlY3ljbGVMb2NrIGlzIGxvY2tlZCBkdXJpbmcgb25SZWdpc3RyYXRpb24gYW5kIHJlbW92ZVByb3ZpZGVyCisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1Qcm92aWRlckxpZmVjeWNsZUxvY2s7CisKICAgICBzdGF0aWMgSGFyZHdhcmVTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eSBzSGFyZHdhcmVTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eTsKIAorICAgIC8vIE1hcHBpbmcgZnJvbSBDYW1lcmFEZXZpY2UgSURzIHRvIENhbWVyYVByb3ZpZGVycy4gVGhpcyBtYXAgaXMgdXNlZCB0byBrZWVwIHRoZQorICAgIC8vIElDYW1lcmFQcm92aWRlciBhbGl2ZSB3aGlsZSBpdCBpcyBpbiB1c2UgYnkgdGhlIGNhbWVyYSB3aXRoIHRoZSBnaXZlbiBJRCBmb3IgY2FtZXJhCisgICAgLy8gY2FwYWJpbGl0aWVzCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPj4KKyAgICAgICAgICAgIG1DYW1lcmFQcm92aWRlckJ5Q2FtZXJhSWQ7CisKKyAgICAvLyBNYXBwaW5nIGZyb20gQ2FtZXJhRGV2aWNlIElEcyB0byBDYW1lcmFQcm92aWRlcnMuIFRoaXMgbWFwIGlzIHVzZWQgdG8ga2VlcCB0aGUKKyAgICAvLyBJQ2FtZXJhUHJvdmlkZXIgYWxpdmUgd2hpbGUgaXQgaXMgaW4gdXNlIGJ5IHRoZSBjYW1lcmEgd2l0aCB0aGUgZ2l2ZW4gSUQgZm9yIHRvcmNoCisgICAgLy8gY2FwYWJpbGl0aWVzCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPj4KKyAgICAgICAgICAgIG1Ub3JjaFByb3ZpZGVyQnlDYW1lcmFJZDsKKworICAgIC8vIExvY2sgZm9yIGFjY2Vzc2luZyBtQ2FtZXJhUHJvdmlkZXJCeUNhbWVyYUlkIGFuZCBtVG9yY2hQcm92aWRlckJ5Q2FtZXJhSWQKKyAgICBzdGQ6Om11dGV4IG1Qcm92aWRlckludGVyZmFjZU1hcExvY2s7CisKICAgICBzdHJ1Y3QgUHJvdmlkZXJJbmZvIDoKICAgICAgICAgICAgIHZpcnR1YWwgcHVibGljIGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXJDYWxsYmFjaywKICAgICAgICAgICAgIHZpcnR1YWwgcHVibGljIGhhcmR3YXJlOjpoaWRsX2RlYXRoX3JlY2lwaWVudAogICAgIHsKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgbVByb3ZpZGVyTmFtZTsKLSAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gbUludGVyZmFjZTsKICAgICAgICAgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgbVByb3ZpZGVyVGFnaWQ7CisgICAgICAgIGludCBtTWlub3JWZXJzaW9uOworICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiBtVmVuZG9yVGFnRGVzY3JpcHRvcjsKKyAgICAgICAgYm9vbCBtU2V0VG9yY2hNb2RlU3VwcG9ydGVkOworICAgICAgICBib29sIG1Jc1JlbW90ZTsKKworICAgICAgICAvLyBDdXJyZW50IG92ZXJhbGwgQW5kcm9pZCBkZXZpY2UgcGh5c2ljYWwgc3RhdHVzCisgICAgICAgIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4gbURldmljZVN0YXRlOworCisgICAgICAgIC8vIFRoaXMgcG9pbnRlciBpcyB1c2VkIHRvIGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIElDYW1lcmFQcm92aWRlciB0aGF0IHdhcyBsYXN0IGFjY2Vzc2VkLgorICAgICAgICB3cDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBtQWN0aXZlSW50ZXJmYWNlOworCisgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IG1TYXZlZEludGVyZmFjZTsKIAogICAgICAgICBQcm92aWRlckluZm8oY29uc3Qgc3RkOjpzdHJpbmcgJnByb3ZpZGVyTmFtZSwKLSAgICAgICAgICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiYgaW50ZXJmYWNlLAogICAgICAgICAgICAgICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlciAqbWFuYWdlcik7CiAgICAgICAgIH5Qcm92aWRlckluZm8oKTsKIAotICAgICAgICBzdGF0dXNfdCBpbml0aWFsaXplKCk7CisgICAgICAgIHN0YXR1c190IGluaXRpYWxpemUoc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4mIGludGVyZmFjZSwKKyAgICAgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU+CisgICAgICAgICAgICAgICAgICAgIGN1cnJlbnREZXZpY2VTdGF0ZSk7CisKKyAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gc3RhcnRQcm92aWRlckludGVyZmFjZSgpOwogCiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBnZXRUeXBlKCkgY29uc3Q7CiAKQEAgLTI4Myw4NCArMzU0LDE3MyBAQAogICAgICAgICAvLyBoaWRsX2RlYXRoX3JlY2lwaWVudCBpbnRlcmZhY2UgLSB0aGlzIGxvY2tzIHRoZSBwYXJlbnQgbUludGVyZmFjZU11dGV4CiAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXJ2aWNlRGllZCh1aW50NjRfdCBjb29raWUsIGNvbnN0IHdwPGhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgd2hvKSBvdmVycmlkZTsKIAorICAgICAgICAvKioKKyAgICAgICAgICogU2V0dXAgdmVuZG9yIHRhZ3MgZm9yIHRoaXMgcHJvdmlkZXIKKyAgICAgICAgICovCisgICAgICAgIHN0YXR1c190IHNldFVwVmVuZG9yVGFncygpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBOb3RpZnkgcHJvdmlkZXIgYWJvdXQgdG9wLWxldmVsIGRldmljZSBwaHlzaWNhbCBzdGF0ZSBjaGFuZ2VzCisgICAgICAgICAqLworICAgICAgICBzdGF0dXNfdCBub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZSgKKyAgICAgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU+CisgICAgICAgICAgICAgICAgICAgIG5ld0RldmljZVN0YXRlKTsKKwogICAgICAgICAvLyBCYXNpYyBkZXZpY2UgaW5mb3JtYXRpb24sIGNvbW1vbiB0byBhbGwgY2FtZXJhIGRldmljZXMKICAgICAgICAgc3RydWN0IERldmljZUluZm8gewogICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgbU5hbWU7ICAvLyBGdWxsIGluc3RhbmNlIG5hbWUKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1JZDsgICAgLy8gSUQgc2VjdGlvbiBvZiBmdWxsIG5hbWUKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlcnNpb24gbVZlcnNpb247CiAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCBtUHJvdmlkZXJUYWdpZDsKKyAgICAgICAgICAgIGJvb2wgbUlzTG9naWNhbENhbWVyYTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtUGh5c2ljYWxJZHM7CisgICAgICAgICAgICBoYXJkd2FyZTo6Q2FtZXJhSW5mbyBtSW5mbzsKKyAgICAgICAgICAgIHNwPElCYXNlPiBtU2F2ZWRJbnRlcmZhY2U7CisgICAgICAgICAgICBib29sIG1Jc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmEgPSBmYWxzZTsKIAogICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFSZXNvdXJjZUNvc3QgbVJlc291cmNlQ29zdDsKIAogICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXMgbVN0YXR1czsKIAorICAgICAgICAgICAgc3A8UHJvdmlkZXJJbmZvPiBtUGFyZW50UHJvdmlkZXI7CisKICAgICAgICAgICAgIGJvb2wgaGFzRmxhc2hVbml0KCkgY29uc3QgeyByZXR1cm4gbUhhc0ZsYXNoVW5pdDsgfQogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoYm9vbCBlbmFibGVkKSA9IDA7CiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUluZm8oaGFyZHdhcmU6OkNhbWVyYUluZm8gKmluZm8pIGNvbnN0ID0gMDsKICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBpc0FQSTFDb21wYXRpYmxlKCkgY29uc3QgPSAwOwotICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wU3RhdGUoaW50IGZkKSBjb25zdCA9IDA7CisgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBTdGF0ZShpbnQgZmQpID0gMDsKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKENhbWVyYU1ldGFkYXRhICpjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IHsKICAgICAgICAgICAgICAgICAodm9pZCkgY2hhcmFjdGVyaXN0aWNzOwogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY29uc3Qgc3RkOjpzdHJpbmcmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhICpjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAodm9pZCkgcGh5c2ljYWxDYW1lcmFJZDsKKyAgICAgICAgICAgICAgICAodm9pZCkgY2hhcmFjdGVyaXN0aWNzOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAorICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJi8qY29uZmlndXJhdGlvbiovLAorICAgICAgICAgICAgICAgICAgICBib29sICogLypzdGF0dXMqLykgeworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlVD4KKyAgICAgICAgICAgIHNwPEludGVyZmFjZVQ+IHN0YXJ0RGV2aWNlSW50ZXJmYWNlKCk7CiAKICAgICAgICAgICAgIERldmljZUluZm8oY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmaWQsIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlcnNpb24mIHZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhUmVzb3VyY2VDb3N0JiByZXNvdXJjZUNvc3QpIDoKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwdWJsaWNDYW1lcmFJZHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhUmVzb3VyY2VDb3N0JiByZXNvdXJjZUNvc3QsCisgICAgICAgICAgICAgICAgICAgIHNwPFByb3ZpZGVySW5mbz4gcGFyZW50UHJvdmlkZXIpIDoKICAgICAgICAgICAgICAgICAgICAgbU5hbWUobmFtZSksIG1JZChpZCksIG1WZXJzaW9uKHZlcnNpb24pLCBtUHJvdmlkZXJUYWdpZCh0YWdJZCksCi0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZUNvc3QocmVzb3VyY2VDb3N0KSwKKyAgICAgICAgICAgICAgICAgICAgbUlzTG9naWNhbENhbWVyYShmYWxzZSksIG1SZXNvdXJjZUNvc3QocmVzb3VyY2VDb3N0KSwKICAgICAgICAgICAgICAgICAgICAgbVN0YXR1cyhoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1czo6UFJFU0VOVCksCi0gICAgICAgICAgICAgICAgICAgIG1IYXNGbGFzaFVuaXQoZmFsc2UpIHt9CisgICAgICAgICAgICAgICAgICAgIG1QYXJlbnRQcm92aWRlcihwYXJlbnRQcm92aWRlciksIG1IYXNGbGFzaFVuaXQoZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICBtUHVibGljQ2FtZXJhSWRzKHB1YmxpY0NhbWVyYUlkcykge30KICAgICAgICAgICAgIHZpcnR1YWwgfkRldmljZUluZm8oKTsKICAgICAgICAgcHJvdGVjdGVkOgogICAgICAgICAgICAgYm9vbCBtSGFzRmxhc2hVbml0OworICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBtUHVibGljQ2FtZXJhSWRzOwogCiAgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2VUPgogICAgICAgICAgICAgc3RhdGljIHN0YXR1c190IHNldFRvcmNoTW9kZShJbnRlcmZhY2VUJiBpbnRlcmZhY2UsIGJvb2wgZW5hYmxlZCk7CisKKyAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIEludGVyZmFjZVQ+CisgICAgICAgICAgICBzdGF0dXNfdCBzZXRUb3JjaE1vZGVGb3JEZXZpY2UoYm9vbCBlbmFibGVkKSB7CisgICAgICAgICAgICAgICAgLy8gRG9uJ3Qgc2F2ZSB0aGUgSUNhbWVyYVByb3ZpZGVyIGludGVyZmFjZSBoZXJlIGJlY2F1c2Ugd2UgYXNzdW1lIHRoYXQgdGhpcyB3YXMKKyAgICAgICAgICAgICAgICAvLyBjYWxsZWQgZnJvbSBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnNldFRvcmNoTW9kZSgpLCB3aGljaCBkb2VzIHNhdmUgaXQuCisgICAgICAgICAgICAgICAgY29uc3Qgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlID0gc3RhcnREZXZpY2VJbnRlcmZhY2U8SW50ZXJmYWNlVD4oKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRGV2aWNlSW5mbzo6c2V0VG9yY2hNb2RlKGludGVyZmFjZSwgZW5hYmxlZCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH07CiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxEZXZpY2VJbmZvPj4gbURldmljZXM7CiAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gbVVuaXF1ZUNhbWVyYUlkczsKICAgICAgICAgaW50IG1VbmlxdWVEZXZpY2VDb3VudDsKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1VbmlxdWVBUEkxQ29tcGF0aWJsZUNhbWVyYUlkczsKKyAgICAgICAgLy8gVGhlIGluaXRpYWwgcHVibGljIGNhbWVyYSBJRHMgcHVibGlzaGVkIGJ5IHRoZSBjYW1lcmEgcHJvdmlkZXIuCisgICAgICAgIC8vIEN1cnJlbnRseSBsb2dpY2FsIG11bHRpLWNhbWVyYSBpcyBub3Qgc3VwcG9ydGVkIGZvciBob3QtcGx1ZyBjYW1lcmEuCisgICAgICAgIC8vIEFuZCB3ZSB1c2UgdGhpcyBsaXN0IHRvIGtlZXAgdHJhY2sgb2YgaW5pdGlhbCBwdWJsaWMgY2FtZXJhIElEcworICAgICAgICAvLyBhZHZlcnRpc2VkIGJ5IHRoZSBwcm92aWRlciwgYW5kIHRvIGRpc3Rpbmd1aXNoIGFnYWluc3QgImhpZGRlbiIKKyAgICAgICAgLy8gcGh5c2ljYWwgY2FtZXJhIElEcy4KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1Qcm92aWRlclB1YmxpY0NhbWVyYUlkczsKIAogICAgICAgICAvLyBIQUx2MS1zcGVjaWZpYyBjYW1lcmEgZmllbGRzLCBpbmNsdWRpbmcgdGhlIGFjdHVhbCBkZXZpY2UgaW50ZXJmYWNlCiAgICAgICAgIHN0cnVjdCBEZXZpY2VJbmZvMSA6IHB1YmxpYyBEZXZpY2VJbmZvIHsKICAgICAgICAgICAgIHR5cGVkZWYgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlIEludGVyZmFjZVQ7Ci0gICAgICAgICAgICBjb25zdCBzcDxJbnRlcmZhY2VUPiBtSW50ZXJmYWNlOwogCiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFRvcmNoTW9kZShib29sIGVuYWJsZWQpIG92ZXJyaWRlOwogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYW1lcmFJbmZvKGhhcmR3YXJlOjpDYW1lcmFJbmZvICppbmZvKSBjb25zdCBvdmVycmlkZTsKICAgICAgICAgICAgIC8vSW4gY2FzZSBvZiBEZXZpY2UxSW5mbyBhc3N1bWUgdGhhdCB3ZSBhcmUgYWx3YXlzIEFQSTEgY29tcGF0aWJsZQogICAgICAgICAgICAgdmlydHVhbCBib29sIGlzQVBJMUNvbXBhdGlibGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9Ci0gICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBTdGF0ZShpbnQgZmQpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wU3RhdGUoaW50IGZkKSBvdmVycmlkZTsKICAgICAgICAgICAgIERldmljZUluZm8xKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCB1aW50MTZfdCBtaW5vclZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhUmVzb3VyY2VDb3N0JiByZXNvdXJjZUNvc3QsCisgICAgICAgICAgICAgICAgICAgIHNwPFByb3ZpZGVySW5mbz4gcGFyZW50UHJvdmlkZXIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHVibGljQ2FtZXJhSWRzLAogICAgICAgICAgICAgICAgICAgICBzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UpOwogICAgICAgICAgICAgdmlydHVhbCB+RGV2aWNlSW5mbzEoKTsKICAgICAgICAgcHJpdmF0ZToKICAgICAgICAgICAgIENhbWVyYVBhcmFtZXRlcnMyIG1EZWZhdWx0UGFyYW1ldGVyczsKKyAgICAgICAgICAgIHN0YXR1c190IGNhY2hlQ2FtZXJhSW5mbyhzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UpOwogICAgICAgICB9OwogCiAgICAgICAgIC8vIEhBTHYzLXNwZWNpZmljIGNhbWVyYSBmaWVsZHMsIGluY2x1ZGluZyB0aGUgYWN0dWFsIGRldmljZSBpbnRlcmZhY2UKICAgICAgICAgc3RydWN0IERldmljZUluZm8zIDogcHVibGljIERldmljZUluZm8gewogICAgICAgICAgICAgdHlwZWRlZiBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2UgSW50ZXJmYWNlVDsKLSAgICAgICAgICAgIGNvbnN0IHNwPEludGVyZmFjZVQ+IG1JbnRlcmZhY2U7CiAKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGU7CiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUluZm8oaGFyZHdhcmU6OkNhbWVyYUluZm8gKmluZm8pIGNvbnN0IG92ZXJyaWRlOwogICAgICAgICAgICAgdmlydHVhbCBib29sIGlzQVBJMUNvbXBhdGlibGUoKSBjb25zdCBvdmVycmlkZTsKLSAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcFN0YXRlKGludCBmZCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBTdGF0ZShpbnQgZmQpIG92ZXJyaWRlOwogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCiAgICAgICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhICpjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcyhjb25zdCBzdGQ6OnN0cmluZyYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgKmNoYXJhY3RlcmlzdGljcykgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCAqc3RhdHVzIC8qb3V0Ki8pCisgICAgICAgICAgICAgICAgICAgIG92ZXJyaWRlOwogCiAgICAgICAgICAgICBEZXZpY2VJbmZvMyhjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgdWludDE2X3QgbWlub3JWZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0LAotICAgICAgICAgICAgICAgICAgICBzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UpOworICAgICAgICAgICAgICAgICAgICBzcDxQcm92aWRlckluZm8+IHBhcmVudFByb3ZpZGVyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHB1YmxpY0NhbWVyYUlkcywgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlKTsKICAgICAgICAgICAgIHZpcnR1YWwgfkRldmljZUluZm8zKCk7CiAgICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzOworICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBDYW1lcmFNZXRhZGF0YT4gbVBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzOworICAgICAgICAgICAgdm9pZCBxdWVyeVBoeXNpY2FsQ2FtZXJhSWRzKCk7CisgICAgICAgICAgICBib29sIGlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYSgpOworICAgICAgICAgICAgc3RhdHVzX3QgZml4dXBNb25vY2hyb21lVGFncygpOworICAgICAgICAgICAgc3RhdHVzX3QgYWRkRHluYW1pY0RlcHRoVGFncygpOworICAgICAgICAgICAgc3RhdGljIHZvaWQgZ2V0U3VwcG9ydGVkU2l6ZXMoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGNoLCB1aW50MzJfdCB0YWcsCisgICAgICAgICAgICAgICAgICAgIGFuZHJvaWRfcGl4ZWxfZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4gKnNpemVzIC8qb3V0Ki8pOworICAgICAgICAgICAgdm9pZCBnZXRTdXBwb3J0ZWREdXJhdGlvbnMoIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjaCwgdWludDMyX3QgdGFnLAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX3BpeGVsX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+JiBzaXplcywKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gKmR1cmF0aW9ucy8qb3V0Ki8pOworICAgICAgICAgICAgdm9pZCBnZXRTdXBwb3J0ZWREeW5hbWljRGVwdGhEdXJhdGlvbnMoY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4mIGRlcHRoRHVyYXRpb25zLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiYgYmxvYkR1cmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gKmR5bmFtaWNEZXB0aER1cmF0aW9ucyAvKm91dCovKTsKKyAgICAgICAgICAgIHN0YXRpYyBib29sIGlzRGVwdGhQaG90b0xpYnJhcnlQcmVzZW50KCk7CisgICAgICAgICAgICBzdGF0aWMgdm9pZCBnZXRTdXBwb3J0ZWREeW5hbWljRGVwdGhTaXplcygKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+JiBibG9iU2l6ZXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiYgZGVwdGhTaXplcywKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+ICpkeW5hbWljRGVwdGhTaXplcyAvKm91dCovLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4gKmludGVybmFsRGVwdGhTaXplcyAvKm91dCovKTsKKyAgICAgICAgICAgIHN0YXR1c190IHJlbW92ZUF2YWlsYWJsZUtleXMoQ2FtZXJhTWV0YWRhdGEmIGMsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYga2V5cywKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qga2V5VGFnKTsKKyAgICAgICAgICAgIHN0YXR1c190IGZpbGxIZWljU3RyZWFtQ29tYmluYXRpb25zKHN0ZDo6dmVjdG9yPGludDMyX3Q+KiBvdXRwdXRzLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiogZHVyYXRpb25zLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90Piogc3RhbGxEdXJhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV9lbnRyeSYgaGFsU3RyZWFtQ29uZmlncywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX2VudHJ5JiBoYWxTdHJlYW1EdXJhdGlvbnMpOworICAgICAgICAgICAgc3RhdHVzX3QgZGVyaXZlSGVpY1RhZ3MoKTsKICAgICAgICAgfTsKIAogICAgIHByaXZhdGU6CkBAIC0zNzgsMTEgKzUzOCwxMSBAQAogICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBEZXZpY2VJbmZvVD4KICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPERldmljZUluZm8+IGluaXRpYWxpemVEZXZpY2VJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAogICAgICAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLCBjb25zdCBzdGQ6OnN0cmluZyAmaWQsCi0gICAgICAgICAgICAgICAgdWludDE2X3QgbWlub3JWZXJzaW9uKSBjb25zdDsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBtaW5vclZlcnNpb24pOwogCiAgICAgICAgIC8vIEhlbHBlciBmb3IgaW5pdGlhbGl6ZURldmljZUluZm8gdG8gdXNlIHRoZSByaWdodCBDYW1lcmFQcm92aWRlciBnZXQgbWV0aG9kLgogICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2VUPgotICAgICAgICBzcDxJbnRlcmZhY2VUPiBnZXREZXZpY2VJbnRlcmZhY2UoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIGNvbnN0OworICAgICAgICBzcDxJbnRlcmZhY2VUPiBzdGFydERldmljZUludGVyZmFjZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSk7CiAKICAgICAgICAgLy8gUGFyc2UgcHJvdmlkZXIgaW5zdGFuY2UgbmFtZSBmb3IgdHlwZSBhbmQgaWQKICAgICAgICAgc3RhdGljIHN0YXR1c190IHBhcnNlUHJvdmlkZXJOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLApAQCAtNDE2LDYgKzU3NiwxNCBAQAogCiAgICAgc3RkOjp2ZWN0b3I8c3A8UHJvdmlkZXJJbmZvPj4gbVByb3ZpZGVyczsKIAorICAgIHZvaWQgYWRkUHJvdmlkZXJUb01hcCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZjYW1lcmFJZCwKKyAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IHByb3ZpZGVyLAorICAgICAgICAgICAgYm9vbCBpc1RvcmNoVXNhZ2UpOworICAgIHZvaWQgcmVtb3ZlQ2FtZXJhSWRGcm9tTWFwKAorICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+PiAmbWFwLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmY2FtZXJhSWQpOworCiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRldmljZVN0YXR1c1RvU3RyaW5nKAogICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyYpOwogICAgIHN0YXRpYyBjb25zdCBjaGFyKiB0b3JjaFN0YXR1c1RvU3RyaW5nKApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNzkxNTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRGVwdGhQaG90b1Byb2Nlc3Nvci5jcHAKQEAgLTAsMCArMSw1MDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYTMtRGVwdGhQaG90b1Byb2Nlc3NvciIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorLy8KKworI2luY2x1ZGUgIkRlcHRoUGhvdG9Qcm9jZXNzb3IuaCIKKworI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvY2FtZXJhLmg+CisjaW5jbHVkZSA8ZHluYW1pY19kZXB0aC9jYW1lcmFzLmg+CisjaW5jbHVkZSA8ZHluYW1pY19kZXB0aC9jb250YWluZXIuaD4KKyNpbmNsdWRlIDxkeW5hbWljX2RlcHRoL2RldmljZS5oPgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvZGltZW5zaW9uLmg+CisjaW5jbHVkZSA8ZHluYW1pY19kZXB0aC9keW5hbWljX2RlcHRoLmg+CisjaW5jbHVkZSA8ZHluYW1pY19kZXB0aC9wb2ludC5oPgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvcG9zZS5oPgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvcHJvZmlsZS5oPgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvcHJvZmlsZXMuaD4KKyNpbmNsdWRlIDxqcGVnbGliLmg+CisjaW5jbHVkZSA8bGliZXhpZi9leGlmLWRhdGEuaD4KKyNpbmNsdWRlIDxsaWJleGlmL2V4aWYtc3lzdGVtLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvRXhpZlV0aWxzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8eG1wbWV0YS94bXBfZGF0YS5oPgorI2luY2x1ZGUgPHhtcG1ldGEveG1wX3dyaXRlci5oPgorCit1c2luZyBkeW5hbWljX2RlcHRoOjpDYW1lcmE7Cit1c2luZyBkeW5hbWljX2RlcHRoOjpDYW1lcmFzOwordXNpbmcgZHluYW1pY19kZXB0aDo6Q2FtZXJhUGFyYW1zOwordXNpbmcgZHluYW1pY19kZXB0aDo6Q29udGFpbmVyOwordXNpbmcgZHluYW1pY19kZXB0aDo6RGVwdGhGb3JtYXQ7Cit1c2luZyBkeW5hbWljX2RlcHRoOjpEZXB0aE1hcDsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkRlcHRoTWFwUGFyYW1zOwordXNpbmcgZHluYW1pY19kZXB0aDo6RGVwdGhVbml0czsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkRldmljZTsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkRldmljZVBhcmFtczsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkRpbWVuc2lvbjsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkltYWdlOwordXNpbmcgZHluYW1pY19kZXB0aDo6SW1hZ2luZ01vZGVsOwordXNpbmcgZHluYW1pY19kZXB0aDo6SW1hZ2luZ01vZGVsUGFyYW1zOwordXNpbmcgZHluYW1pY19kZXB0aDo6SXRlbTsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OlBvc2U7Cit1c2luZyBkeW5hbWljX2RlcHRoOjpQcm9maWxlOwordXNpbmcgZHluYW1pY19kZXB0aDo6UHJvZmlsZXM7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworLy8gRGVwdGggc2FtcGxlcyB3aXRoIGxvdyBjb25maWRlbmNlIGNhbiBza2V3IHRoZQorLy8gbmVhci9mYXIgdmFsdWVzIGFuZCBpbXBhY3QgdGhlIHJhbmdlIGludmVyc2UgY29kaW5nLgorc3RhdGljIGNvbnN0IGZsb2F0IENPTkZJREVOQ0VfVEhSRVNIT0xEID0gLjE1ZjsKKworRXhpZk9yaWVudGF0aW9uIGdldEV4aWZPcmllbnRhdGlvbihjb25zdCB1bnNpZ25lZCBjaGFyICpqcGVnQnVmZmVyLCBzaXplX3QganBlZ0J1ZmZlclNpemUpIHsKKyAgICBpZiAoKGpwZWdCdWZmZXIgPT0gbnVsbHB0cikgfHwgKGpwZWdCdWZmZXJTaXplID09IDApKSB7CisgICAgICAgIHJldHVybiBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OX1VOREVGSU5FRDsKKyAgICB9CisKKyAgICBhdXRvIGV4aWZEYXRhID0gZXhpZl9kYXRhX25ldygpOworICAgIGV4aWZfZGF0YV9sb2FkX2RhdGEoZXhpZkRhdGEsIGpwZWdCdWZmZXIsIGpwZWdCdWZmZXJTaXplKTsKKyAgICBFeGlmRW50cnkgKm9yaWVudGF0aW9uID0gZXhpZl9jb250ZW50X2dldF9lbnRyeShleGlmRGF0YS0+aWZkW0VYSUZfSUZEXzBdLAorICAgICAgICAgICAgRVhJRl9UQUdfT1JJRU5UQVRJT04pOworICAgIGlmICgob3JpZW50YXRpb24gPT0gbnVsbHB0cikgfHwgKG9yaWVudGF0aW9uLT5zaXplICE9IHNpemVvZihFeGlmU2hvcnQpKSkgeworICAgICAgICBBTE9HVigiJXM6IE9yaWVudGF0aW9uIEVYSUYgZW50cnkgaW52YWxpZCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBleGlmX2RhdGFfdW5yZWYoZXhpZkRhdGEpOworICAgICAgICByZXR1cm4gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8wX0RFR1JFRVM7CisgICAgfQorCisgICAgYXV0byBvcmllbnRhdGlvblZhbHVlID0gZXhpZl9nZXRfc2hvcnQob3JpZW50YXRpb24tPmRhdGEsIGV4aWZfZGF0YV9nZXRfYnl0ZV9vcmRlcihleGlmRGF0YSkpOworICAgIEV4aWZPcmllbnRhdGlvbiByZXQ7CisgICAgc3dpdGNoIChvcmllbnRhdGlvblZhbHVlKSB7CisgICAgICAgIGNhc2UgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8wX0RFR1JFRVM6CisgICAgICAgIGNhc2UgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl85MF9ERUdSRUVTOgorICAgICAgICBjYXNlIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMTgwX0RFR1JFRVM6CisgICAgICAgIGNhc2UgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8yNzBfREVHUkVFUzoKKyAgICAgICAgICAgIHJldCA9IHN0YXRpY19jYXN0PEV4aWZPcmllbnRhdGlvbj4gKG9yaWVudGF0aW9uVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQgRVhJRiBvcmllbnRhdGlvbiB2YWx1ZTogJWQsIGRlZmF1bHRpbmcgdG8gMCBkZWdyZWVzIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBvcmllbnRhdGlvblZhbHVlKTsKKyAgICAgICAgICAgIHJldCA9IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMF9ERUdSRUVTOworICAgIH0KKworICAgIGV4aWZfZGF0YV91bnJlZihleGlmRGF0YSk7CisKKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBlbmNvZGVHcmF5c2NhbGVKcGVnKHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwgdWludDhfdCAqaW4sIHZvaWQgKm91dCwKKyAgICAgICAgY29uc3Qgc2l6ZV90IG1heE91dFNpemUsIHVpbnQ4X3QganBlZ1F1YWxpdHksIEV4aWZPcmllbnRhdGlvbiBleGlmT3JpZW50YXRpb24sCisgICAgICAgIHNpemVfdCAmYWN0dWFsU2l6ZSkgeworICAgIHN0YXR1c190IHJldDsKKyAgICAvLyBsaWJqcGVnIGlzIGEgQyBsaWJyYXJ5IHNvIHdlIHVzZSBDLXN0eWxlICJpbmhlcml0YW5jZSIgYnkKKyAgICAvLyBwdXR0aW5nIGxpYmpwZWcncyBqcGVnX2Rlc3RpbmF0aW9uX21nciBmaXJzdCBpbiBvdXIgY3VzdG9tCisgICAgLy8gc3RydWN0LiBUaGlzIGFsbG93cyB1cyB0byBjYXN0IGpwZWdfZGVzdGluYXRpb25fbWdyKiB0bworICAgIC8vIEN1c3RvbUpwZWdEZXN0TWdyKiB3aGVuIHdlIGdldCBpdCBwYXNzZWQgdG8gdXMgaW4gYSBjYWxsYmFjay4KKyAgICBzdHJ1Y3QgQ3VzdG9tSnBlZ0Rlc3RNZ3IgOiBwdWJsaWMganBlZ19kZXN0aW5hdGlvbl9tZ3IgeworICAgICAgICBKT0NURVQgKm1CdWZmZXI7CisgICAgICAgIHNpemVfdCBtQnVmZmVyU2l6ZTsKKyAgICAgICAgc2l6ZV90IG1FbmNvZGVkU2l6ZTsKKyAgICAgICAgYm9vbCBtU3VjY2VzczsKKyAgICB9IGRtZ3I7CisKKyAgICBqcGVnX2NvbXByZXNzX3N0cnVjdCBjaW5mbyA9IHt9OworICAgIGpwZWdfZXJyb3JfbWdyIGplcnI7CisKKyAgICAvLyBJbml0aWFsaXplIGVycm9yIGhhbmRsaW5nIHdpdGggc3RhbmRhcmQgY2FsbGJhY2tzLCBidXQKKyAgICAvLyB0aGVuIG92ZXJyaWRlIG91dHB1dF9tZXNzYWdlICh0byBwcmludCB0byBBTE9HKSBhbmQKKyAgICAvLyBlcnJvcl9leGl0IHRvIHNldCBhIGZsYWcgYW5kIHByaW50IGEgbWVzc2FnZSBpbnN0ZWFkCisgICAgLy8gb2Yga2lsbGluZyB0aGUgd2hvbGUgcHJvY2Vzcy4KKyAgICBjaW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmamVycik7CisKKyAgICBjaW5mby5lcnItPm91dHB1dF9tZXNzYWdlID0gW10oal9jb21tb25fcHRyIGNpbmZvKSB7CisgICAgICAgIGNoYXIgYnVmZmVyW0pNU0dfTEVOR1RIX01BWF07CisKKyAgICAgICAgLyogQ3JlYXRlIHRoZSBtZXNzYWdlICovCisgICAgICAgICgqY2luZm8tPmVyci0+Zm9ybWF0X21lc3NhZ2UpKGNpbmZvLCBidWZmZXIpOworICAgICAgICBBTE9HRSgibGlianBlZyBlcnJvcjogJXMiLCBidWZmZXIpOworICAgIH07CisKKyAgICBjaW5mby5lcnItPmVycm9yX2V4aXQgPSBbXShqX2NvbW1vbl9wdHIgY2luZm8pIHsKKyAgICAgICAgKCpjaW5mby0+ZXJyLT5vdXRwdXRfbWVzc2FnZSkoY2luZm8pOworICAgICAgICBpZihjaW5mby0+Y2xpZW50X2RhdGEpIHsKKyAgICAgICAgICAgIGF1dG8gJiBkbWdyID0gKnN0YXRpY19jYXN0PEN1c3RvbUpwZWdEZXN0TWdyKj4oY2luZm8tPmNsaWVudF9kYXRhKTsKKyAgICAgICAgICAgIGRtZ3IubVN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLyBOb3cgdGhhdCB3ZSBpbml0aWFsaXplZCBzb21lIGNhbGxiYWNrcywgbGV0J3MgY3JlYXRlIG91ciBjb21wcmVzc29yCisgICAganBlZ19jcmVhdGVfY29tcHJlc3MoJmNpbmZvKTsKKyAgICBkbWdyLm1CdWZmZXIgPSBzdGF0aWNfY2FzdDxKT0NURVQqPihvdXQpOworICAgIGRtZ3IubUJ1ZmZlclNpemUgPSBtYXhPdXRTaXplOworICAgIGRtZ3IubUVuY29kZWRTaXplID0gMDsKKyAgICBkbWdyLm1TdWNjZXNzID0gdHJ1ZTsKKyAgICBjaW5mby5jbGllbnRfZGF0YSA9IHN0YXRpY19jYXN0PHZvaWQqPigmZG1ncik7CisKKyAgICAvLyBUaGVzZSBsYW1iZGFzIGJlY29tZSBDLXN0eWxlIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZCBhcyBwZXIgQysrMTEgc3BlYworICAgIC8vIG1heSBub3QgY2FwdHVyZSBhbnl0aGluZy4KKyAgICBkbWdyLmluaXRfZGVzdGluYXRpb24gPSBbXShqX2NvbXByZXNzX3B0ciBjaW5mbykgeworICAgICAgICBhdXRvICYgZG1nciA9IHN0YXRpY19jYXN0PEN1c3RvbUpwZWdEZXN0TWdyJj4oKmNpbmZvLT5kZXN0KTsKKyAgICAgICAgZG1nci5uZXh0X291dHB1dF9ieXRlID0gZG1nci5tQnVmZmVyOworICAgICAgICBkbWdyLmZyZWVfaW5fYnVmZmVyID0gZG1nci5tQnVmZmVyU2l6ZTsKKyAgICAgICAgQUxPR1YoIiVzOiVkIGpwZWcgc3RhcnQ6ICVwIFslenVdIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgZG1nci5tQnVmZmVyLCBkbWdyLm1CdWZmZXJTaXplKTsKKyAgICB9OworCisgICAgZG1nci5lbXB0eV9vdXRwdXRfYnVmZmVyID0gW10oal9jb21wcmVzc19wdHIgY2luZm8gX191bnVzZWQpIHsKKyAgICAgICAgQUxPR1YoIiVzOiVkIE91dCBvZiBidWZmZXIiLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfTsKKworICAgIGRtZ3IudGVybV9kZXN0aW5hdGlvbiA9IFtdKGpfY29tcHJlc3NfcHRyIGNpbmZvKSB7CisgICAgICAgIGF1dG8gJiBkbWdyID0gc3RhdGljX2Nhc3Q8Q3VzdG9tSnBlZ0Rlc3RNZ3ImPigqY2luZm8tPmRlc3QpOworICAgICAgICBkbWdyLm1FbmNvZGVkU2l6ZSA9IGRtZ3IubUJ1ZmZlclNpemUgLSBkbWdyLmZyZWVfaW5fYnVmZmVyOworICAgICAgICBBTE9HVigiJXM6JWQgRG9uZSB3aXRoIGpwZWc6ICV6dSIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIGRtZ3IubUVuY29kZWRTaXplKTsKKyAgICB9OworICAgIGNpbmZvLmRlc3QgPSByZWludGVycHJldF9jYXN0PHN0cnVjdCBqcGVnX2Rlc3RpbmF0aW9uX21ncio+KCZkbWdyKTsKKyAgICBjaW5mby5pbWFnZV93aWR0aCA9IHdpZHRoOworICAgIGNpbmZvLmltYWdlX2hlaWdodCA9IGhlaWdodDsKKyAgICBjaW5mby5pbnB1dF9jb21wb25lbnRzID0gMTsKKyAgICBjaW5mby5pbl9jb2xvcl9zcGFjZSA9IEpDU19HUkFZU0NBTEU7CisKKyAgICAvLyBJbml0aWFsaXplIGRlZmF1bHRzIGFuZCB0aGVuIG92ZXJyaWRlIHdoYXQgd2Ugd2FudAorICAgIGpwZWdfc2V0X2RlZmF1bHRzKCZjaW5mbyk7CisKKyAgICBqcGVnX3NldF9xdWFsaXR5KCZjaW5mbywganBlZ1F1YWxpdHksIDEpOworICAgIGpwZWdfc2V0X2NvbG9yc3BhY2UoJmNpbmZvLCBKQ1NfR1JBWVNDQUxFKTsKKyAgICBjaW5mby5yYXdfZGF0YV9pbiA9IDA7CisgICAgY2luZm8uZGN0X21ldGhvZCA9IEpEQ1RfSUZBU1Q7CisKKyAgICBjaW5mby5jb21wX2luZm9bMF0uaF9zYW1wX2ZhY3RvciA9IDE7CisgICAgY2luZm8uY29tcF9pbmZvWzFdLmhfc2FtcF9mYWN0b3IgPSAxOworICAgIGNpbmZvLmNvbXBfaW5mb1syXS5oX3NhbXBfZmFjdG9yID0gMTsKKyAgICBjaW5mby5jb21wX2luZm9bMF0udl9zYW1wX2ZhY3RvciA9IDE7CisgICAgY2luZm8uY29tcF9pbmZvWzFdLnZfc2FtcF9mYWN0b3IgPSAxOworICAgIGNpbmZvLmNvbXBfaW5mb1syXS52X3NhbXBfZmFjdG9yID0gMTsKKworICAgIGpwZWdfc3RhcnRfY29tcHJlc3MoJmNpbmZvLCBUUlVFKTsKKworICAgIGlmIChleGlmT3JpZW50YXRpb24gIT0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl9VTkRFRklORUQpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZVdGlscz4gdXRpbHMoRXhpZlV0aWxzOjpjcmVhdGUoKSk7CisgICAgICAgIHV0aWxzLT5pbml0aWFsaXplRW1wdHkoKTsKKyAgICAgICAgdXRpbHMtPnNldEltYWdlV2lkdGgod2lkdGgpOworICAgICAgICB1dGlscy0+c2V0SW1hZ2VIZWlnaHQoaGVpZ2h0KTsKKyAgICAgICAgdXRpbHMtPnNldE9yaWVudGF0aW9uVmFsdWUoZXhpZk9yaWVudGF0aW9uKTsKKworICAgICAgICBpZiAodXRpbHMtPmdlbmVyYXRlQXBwMSgpKSB7CisgICAgICAgICAgICBjb25zdCB1aW50OF90KiBleGlmQnVmZmVyID0gdXRpbHMtPmdldEFwcDFCdWZmZXIoKTsKKyAgICAgICAgICAgIHNpemVfdCBleGlmQnVmZmVyU2l6ZSA9IHV0aWxzLT5nZXRBcHAxTGVuZ3RoKCk7CisgICAgICAgICAgICBqcGVnX3dyaXRlX21hcmtlcigmY2luZm8sIEpQRUdfQVBQMCArIDEsIHN0YXRpY19jYXN0PGNvbnN0IEpPQ1RFVCo+KGV4aWZCdWZmZXIpLAorICAgICAgICAgICAgICAgICAgICBleGlmQnVmZmVyU2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBnZW5lcmF0ZSBBcHAxIGJ1ZmZlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNpbmZvLmltYWdlX2hlaWdodDsgaSsrKSB7CisgICAgICAgIGF1dG8gY3VycmVudFJvdyAgPSBzdGF0aWNfY2FzdDxKU0FNUFJPVz4oaW4gKyBpKndpZHRoKTsKKyAgICAgICAganBlZ193cml0ZV9zY2FubGluZXMoJmNpbmZvLCAmY3VycmVudFJvdywgLypudW1fbGluZXMqLzEpOworICAgIH0KKworICAgIGpwZWdfZmluaXNoX2NvbXByZXNzKCZjaW5mbyk7CisKKyAgICBhY3R1YWxTaXplID0gZG1nci5tRW5jb2RlZFNpemU7CisgICAgaWYgKGRtZ3IubVN1Y2Nlc3MpIHsKKyAgICAgICAgcmV0ID0gTk9fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitpbmxpbmUgdm9pZCB1bnBhY2tEZXB0aDE2KHVpbnQxNl90IHZhbHVlLCBzdGQ6OnZlY3RvcjxmbG9hdD4gKnBvaW50cyAvKm91dCovLAorICAgICAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gKmNvbmZpZGVuY2UgLypvdXQqLywgZmxvYXQgKm5lYXIgLypvdXQqLywgZmxvYXQgKmZhciAvKm91dCovKSB7CisgICAgLy8gQW5kcm9pZCBkZW5zZWx5IHBhY2tlZCBkZXB0aCBtYXAuIFRoZSB1bml0cyBmb3IgdGhlIHJhbmdlIGFyZSBpbgorICAgIC8vIG1pbGxpbWV0ZXJzIGFuZCBuZWVkIHRvIGJlIHNjYWxlZCB0byBtZXRlcnMuCisgICAgLy8gVGhlIGNvbmZpZGVuY2UgdmFsdWUgaXMgZW5jb2RlZCBpbiB0aGUgMyBtb3N0IHNpZ25pZmljYW50IGJpdHMuCisgICAgLy8gVGhlIGNvbmZpZGVuY2UgZGF0YSBuZWVkcyB0byBiZSBhZGRpdGlvbmFsbHkgbm9ybWFsaXplZCB3aXRoCisgICAgLy8gdmFsdWVzIDEuMGYsIDAuMGYgcmVwcmVzZW50aW5nIG1heGltdW0gYW5kIG1pbmltdW0gY29uZmlkZW5jZQorICAgIC8vIHJlc3BlY3RpdmVseS4KKyAgICBhdXRvIHBvaW50ID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHZhbHVlICYgMHgxRkZGKSAvIDEwMDAuZjsKKyAgICBwb2ludHMtPnB1c2hfYmFjayhwb2ludCk7CisKKyAgICBhdXRvIGNvbmYgPSAodmFsdWUgPj4gMTMpICYgMHg3OworICAgIGZsb2F0IG5vcm1Db25maWRlbmNlID0gKGNvbmYgPT0gMCkgPyAxLmYgOiAoc3RhdGljX2Nhc3Q8ZmxvYXQ+KGNvbmYpIC0gMSkgLyA3LmY7CisgICAgY29uZmlkZW5jZS0+cHVzaF9iYWNrKG5vcm1Db25maWRlbmNlKTsKKyAgICBpZiAobm9ybUNvbmZpZGVuY2UgPCBDT05GSURFTkNFX1RIUkVTSE9MRCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCpuZWFyID4gcG9pbnQpIHsKKyAgICAgICAgKm5lYXIgPSBwb2ludDsKKyAgICB9CisgICAgaWYgKCpmYXIgPCBwb2ludCkgeworICAgICAgICAqZmFyID0gcG9pbnQ7CisgICAgfQorfQorCisvLyBUcml2aWFsIGNhc2UsIHJlYWQgZm9yd2FyZCBmcm9tIHRvcCxsZWZ0IGNvcm5lci4KK3ZvaWQgcm90YXRlMEFuZFVucGFjayhEZXB0aFBob3RvSW5wdXRGcmFtZSBpbnB1dEZyYW1lLCBzdGQ6OnZlY3RvcjxmbG9hdD4gKnBvaW50cyAvKm91dCovLAorICAgICAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gKmNvbmZpZGVuY2UgLypvdXQqLywgZmxvYXQgKm5lYXIgLypvdXQqLywgZmxvYXQgKmZhciAvKm91dCovKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbnB1dEZyYW1lLm1EZXB0aE1hcEhlaWdodDsgaSsrKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaW5wdXRGcmFtZS5tRGVwdGhNYXBXaWR0aDsgaisrKSB7CisgICAgICAgICAgICB1bnBhY2tEZXB0aDE2KGlucHV0RnJhbWUubURlcHRoTWFwQnVmZmVyW2kqaW5wdXRGcmFtZS5tRGVwdGhNYXBTdHJpZGUgKyBqXSwgcG9pbnRzLAorICAgICAgICAgICAgICAgICAgICBjb25maWRlbmNlLCBuZWFyLCBmYXIpOworICAgICAgICB9CisgICAgfQorfQorCisvLyA5MCBkZWdyZWVzIENXIHJvdGF0aW9uIGNhbiBiZSBhcHBsaWVkIGJ5IHN0YXJ0aW5nIHRvIHJlYWQgZnJvbSBib3R0b20sIGxlZnQgY29ybmVyCisvLyB0cmFuc3Bvc2luZyByb3dzIGFuZCBjb2x1bW5zLgordm9pZCByb3RhdGU5MEFuZFVucGFjayhEZXB0aFBob3RvSW5wdXRGcmFtZSBpbnB1dEZyYW1lLCBzdGQ6OnZlY3RvcjxmbG9hdD4gKnBvaW50cyAvKm91dCovLAorICAgICAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gKmNvbmZpZGVuY2UgLypvdXQqLywgZmxvYXQgKm5lYXIgLypvdXQqLywgZmxvYXQgKmZhciAvKm91dCovKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbnB1dEZyYW1lLm1EZXB0aE1hcFdpZHRoOyBpKyspIHsKKyAgICAgICAgZm9yIChzc2l6ZV90IGogPSBpbnB1dEZyYW1lLm1EZXB0aE1hcEhlaWdodC0xOyBqID49IDA7IGotLSkgeworICAgICAgICAgICAgdW5wYWNrRGVwdGgxNihpbnB1dEZyYW1lLm1EZXB0aE1hcEJ1ZmZlcltqKmlucHV0RnJhbWUubURlcHRoTWFwU3RyaWRlICsgaV0sIHBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgY29uZmlkZW5jZSwgbmVhciwgZmFyKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gMTgwIENXIGRlZ3JlZXMgcm90YXRpb24gY2FuIGJlIGFwcGxpZWQgYnkgc3RhcnRpbmcgdG8gcmVhZCBiYWNrd2FyZHMgZnJvbSBib3R0b20sIHJpZ2h0IGNvcm5lci4KK3ZvaWQgcm90YXRlMTgwQW5kVW5wYWNrKERlcHRoUGhvdG9JbnB1dEZyYW1lIGlucHV0RnJhbWUsIHN0ZDo6dmVjdG9yPGZsb2F0PiAqcG9pbnRzIC8qb3V0Ki8sCisgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiAqY29uZmlkZW5jZSAvKm91dCovLCBmbG9hdCAqbmVhciAvKm91dCovLCBmbG9hdCAqZmFyIC8qb3V0Ki8pIHsKKyAgICBmb3IgKHNzaXplX3QgaSA9IGlucHV0RnJhbWUubURlcHRoTWFwSGVpZ2h0LTE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIGZvciAoc3NpemVfdCBqID0gaW5wdXRGcmFtZS5tRGVwdGhNYXBXaWR0aC0xOyBqID49IDA7IGotLSkgeworICAgICAgICAgICAgdW5wYWNrRGVwdGgxNihpbnB1dEZyYW1lLm1EZXB0aE1hcEJ1ZmZlcltpKmlucHV0RnJhbWUubURlcHRoTWFwU3RyaWRlICsgal0sIHBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgY29uZmlkZW5jZSwgbmVhciwgZmFyKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gMjcwIGRlZ3JlZXMgQ1cgcm90YXRpb24gY2FuIGJlIGFwcGxpZWQgYnkgc3RhcnRpbmcgdG8gcmVhZCBmcm9tIHRvcCwgcmlnaHQgY29ybmVyCisvLyB0cmFuc3Bvc2luZyByb3dzIGFuZCBjb2x1bW5zLgordm9pZCByb3RhdGUyNzBBbmRVbnBhY2soRGVwdGhQaG90b0lucHV0RnJhbWUgaW5wdXRGcmFtZSwgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICpwb2ludHMgLypvdXQqLywKKyAgICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICpjb25maWRlbmNlIC8qb3V0Ki8sIGZsb2F0ICpuZWFyIC8qb3V0Ki8sIGZsb2F0ICpmYXIgLypvdXQqLykgeworICAgIGZvciAoc3NpemVfdCBpID0gaW5wdXRGcmFtZS5tRGVwdGhNYXBXaWR0aC0xOyBpID49IDA7IGktLSkgeworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGlucHV0RnJhbWUubURlcHRoTWFwSGVpZ2h0OyBqKyspIHsKKyAgICAgICAgICAgIHVucGFja0RlcHRoMTYoaW5wdXRGcmFtZS5tRGVwdGhNYXBCdWZmZXJbaippbnB1dEZyYW1lLm1EZXB0aE1hcFN0cmlkZSArIGldLCBwb2ludHMsCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZGVuY2UsIG5lYXIsIGZhcik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgcm90YXRlQW5kVW5wYWNrKERlcHRoUGhvdG9JbnB1dEZyYW1lIGlucHV0RnJhbWUsIHN0ZDo6dmVjdG9yPGZsb2F0PiAqcG9pbnRzIC8qb3V0Ki8sCisgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiAqY29uZmlkZW5jZSAvKm91dCovLCBmbG9hdCAqbmVhciAvKm91dCovLCBmbG9hdCAqZmFyIC8qb3V0Ki8pIHsKKyAgICBzd2l0Y2ggKGlucHV0RnJhbWUubU9yaWVudGF0aW9uKSB7CisgICAgICAgIGNhc2UgRGVwdGhQaG90b09yaWVudGF0aW9uOjpERVBUSF9PUklFTlRBVElPTl8wX0RFR1JFRVM6CisgICAgICAgICAgICByb3RhdGUwQW5kVW5wYWNrKGlucHV0RnJhbWUsIHBvaW50cywgY29uZmlkZW5jZSwgbmVhciwgZmFyKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgY2FzZSBEZXB0aFBob3RvT3JpZW50YXRpb246OkRFUFRIX09SSUVOVEFUSU9OXzkwX0RFR1JFRVM6CisgICAgICAgICAgICByb3RhdGU5MEFuZFVucGFjayhpbnB1dEZyYW1lLCBwb2ludHMsIGNvbmZpZGVuY2UsIG5lYXIsIGZhcik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBEZXB0aFBob3RvT3JpZW50YXRpb246OkRFUFRIX09SSUVOVEFUSU9OXzE4MF9ERUdSRUVTOgorICAgICAgICAgICAgcm90YXRlMTgwQW5kVW5wYWNrKGlucHV0RnJhbWUsIHBvaW50cywgY29uZmlkZW5jZSwgbmVhciwgZmFyKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgY2FzZSBEZXB0aFBob3RvT3JpZW50YXRpb246OkRFUFRIX09SSUVOVEFUSU9OXzI3MF9ERUdSRUVTOgorICAgICAgICAgICAgcm90YXRlMjcwQW5kVW5wYWNrKGlucHV0RnJhbWUsIHBvaW50cywgY29uZmlkZW5jZSwgbmVhciwgZmFyKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOiBVbnN1cHBvcnRlZCBkZXB0aCBwaG90byByb3RhdGlvbjogJWQsIGRlZmF1bHQgdG8gMCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRGcmFtZS5tT3JpZW50YXRpb24pOworICAgICAgICAgICAgcm90YXRlMEFuZFVucGFjayhpbnB1dEZyYW1lLCBwb2ludHMsIGNvbmZpZGVuY2UsIG5lYXIsIGZhcik7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8ZHluYW1pY19kZXB0aDo6RGVwdGhNYXA+IHByb2Nlc3NEZXB0aE1hcEZyYW1lKERlcHRoUGhvdG9JbnB1dEZyYW1lIGlucHV0RnJhbWUsCisgICAgICAgIEV4aWZPcmllbnRhdGlvbiBleGlmT3JpZW50YXRpb24sIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxJdGVtPj4gKml0ZW1zIC8qb3V0Ki8sCisgICAgICAgIGJvb2wgKnN3aXRjaERpbWVuc2lvbnMgLypvdXQqLykgeworICAgIGlmICgoaXRlbXMgPT0gbnVsbHB0cikgfHwgKHN3aXRjaERpbWVuc2lvbnMgPT0gbnVsbHB0cikpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IHBvaW50cywgY29uZmlkZW5jZTsKKworICAgIHNpemVfdCBwb2ludENvdW50ID0gaW5wdXRGcmFtZS5tRGVwdGhNYXBXaWR0aCAqIGlucHV0RnJhbWUubURlcHRoTWFwSGVpZ2h0OworICAgIHBvaW50cy5yZXNlcnZlKHBvaW50Q291bnQpOworICAgIGNvbmZpZGVuY2UucmVzZXJ2ZShwb2ludENvdW50KTsKKyAgICBmbG9hdCBuZWFyID0gVUlOVDE2X01BWDsKKyAgICBmbG9hdCBmYXIgPSAuMGY7CisgICAgKnN3aXRjaERpbWVuc2lvbnMgPSBmYWxzZTsKKyAgICAvLyBQaHlzaWNhbCByb3RhdGlvbiBvZiBkZXB0aCBhbmQgY29uZmlkZW5jZSBtYXBzIG1heSBiZSBuZWVkZWQgaW4gY2FzZQorICAgIC8vIHRoZSBFWElGIG9yaWVudGF0aW9uIGlzIHNldCB0byAwIGRlZ3JlZXMgYW5kIHRoZSBkZXB0aCBwaG90byBvcmllbnRhdGlvbgorICAgIC8vIChzb3VyY2UgY29sb3IgaW1hZ2UpIGhhcyBzb21lIGRpZmZlcmVudCB2YWx1ZS4KKyAgICBpZiAoZXhpZk9yaWVudGF0aW9uID09IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMF9ERUdSRUVTKSB7CisgICAgICAgICpzd2l0Y2hEaW1lbnNpb25zID0gcm90YXRlQW5kVW5wYWNrKGlucHV0RnJhbWUsICZwb2ludHMsICZjb25maWRlbmNlLCAmbmVhciwgJmZhcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcm90YXRlMEFuZFVucGFjayhpbnB1dEZyYW1lLCAmcG9pbnRzLCAmY29uZmlkZW5jZSwgJm5lYXIsICZmYXIpOworICAgIH0KKworICAgIHNpemVfdCB3aWR0aCA9IGlucHV0RnJhbWUubURlcHRoTWFwV2lkdGg7CisgICAgc2l6ZV90IGhlaWdodCA9IGlucHV0RnJhbWUubURlcHRoTWFwSGVpZ2h0OworICAgIGlmICgqc3dpdGNoRGltZW5zaW9ucykgeworICAgICAgICB3aWR0aCA9IGlucHV0RnJhbWUubURlcHRoTWFwSGVpZ2h0OworICAgICAgICBoZWlnaHQgPSBpbnB1dEZyYW1lLm1EZXB0aE1hcFdpZHRoOworICAgIH0KKworICAgIGlmIChuZWFyID09IGZhcikgeworICAgICAgICBBTE9HRSgiJXM6IE5lYXIgYW5kIGZhciByYW5nZSB2YWx1ZXMgbXVzdCBub3QgbWF0Y2ghIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcG9pbnRzUXVhbnRpemVkLCBjb25maWRlbmNlUXVhbnRpemVkOworICAgIHBvaW50c1F1YW50aXplZC5yZXNlcnZlKHBvaW50Q291bnQpOyBjb25maWRlbmNlUXVhbnRpemVkLnJlc2VydmUocG9pbnRDb3VudCk7CisgICAgYXV0byBwb2ludEl0ID0gcG9pbnRzLmJlZ2luKCk7CisgICAgYXV0byBjb25maWRlbmNlSXQgPSBjb25maWRlbmNlLmJlZ2luKCk7CisgICAgd2hpbGUgKChwb2ludEl0ICE9IHBvaW50cy5lbmQoKSkgJiYgKGNvbmZpZGVuY2VJdCAhPSBjb25maWRlbmNlLmVuZCgpKSkgeworICAgICAgICBhdXRvIHBvaW50ID0gKnBvaW50SXQ7CisgICAgICAgIGlmICgoKmNvbmZpZGVuY2VJdCkgPCBDT05GSURFTkNFX1RIUkVTSE9MRCkgeworICAgICAgICAgICAgcG9pbnQgPSBzdGQ6OmNsYW1wKHBvaW50LCBuZWFyLCBmYXIpOworICAgICAgICB9CisgICAgICAgIHBvaW50c1F1YW50aXplZC5wdXNoX2JhY2soZmxvb3JmKCgoZmFyICogKHBvaW50IC0gbmVhcikpIC8KKyAgICAgICAgICAgICAgICAocG9pbnQgKiAoZmFyIC0gbmVhcikpKSAqIDI1NS4wZikpOworICAgICAgICBjb25maWRlbmNlUXVhbnRpemVkLnB1c2hfYmFjayhmbG9vcmYoKmNvbmZpZGVuY2VJdCAqIDI1NS4wZikpOworICAgICAgICBjb25maWRlbmNlSXQrKzsgcG9pbnRJdCsrOworICAgIH0KKworICAgIERlcHRoTWFwUGFyYW1zIGRlcHRoUGFyYW1zKERlcHRoRm9ybWF0OjprUmFuZ2VJbnZlcnNlLCBuZWFyLCBmYXIsIERlcHRoVW5pdHM6OmtNZXRlcnMsCisgICAgICAgICAgICAiYW5kcm9pZC9kZXB0aG1hcCIpOworICAgIGRlcHRoUGFyYW1zLmNvbmZpZGVuY2VfdXJpID0gImFuZHJvaWQvY29uZmlkZW5jZW1hcCI7CisgICAgZGVwdGhQYXJhbXMubWltZSA9ICJpbWFnZS9qcGVnIjsKKyAgICBkZXB0aFBhcmFtcy5kZXB0aF9pbWFnZV9kYXRhLnJlc2l6ZShpbnB1dEZyYW1lLm1NYXhKcGVnU2l6ZSk7CisgICAgZGVwdGhQYXJhbXMuY29uZmlkZW5jZV9kYXRhLnJlc2l6ZShpbnB1dEZyYW1lLm1NYXhKcGVnU2l6ZSk7CisgICAgc2l6ZV90IGFjdHVhbEpwZWdTaXplOworICAgIGF1dG8gcmV0ID0gZW5jb2RlR3JheXNjYWxlSnBlZyh3aWR0aCwgaGVpZ2h0LCBwb2ludHNRdWFudGl6ZWQuZGF0YSgpLAorICAgICAgICAgICAgZGVwdGhQYXJhbXMuZGVwdGhfaW1hZ2VfZGF0YS5kYXRhKCksIGlucHV0RnJhbWUubU1heEpwZWdTaXplLAorICAgICAgICAgICAgaW5wdXRGcmFtZS5tSnBlZ1F1YWxpdHksIGV4aWZPcmllbnRhdGlvbiwgYWN0dWFsSnBlZ1NpemUpOworICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBEZXB0aCBtYXAgY29tcHJlc3Npb24gZmFpbGVkISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBkZXB0aFBhcmFtcy5kZXB0aF9pbWFnZV9kYXRhLnJlc2l6ZShhY3R1YWxKcGVnU2l6ZSk7CisKKyAgICByZXQgPSBlbmNvZGVHcmF5c2NhbGVKcGVnKHdpZHRoLCBoZWlnaHQsIGNvbmZpZGVuY2VRdWFudGl6ZWQuZGF0YSgpLAorICAgICAgICAgICAgZGVwdGhQYXJhbXMuY29uZmlkZW5jZV9kYXRhLmRhdGEoKSwgaW5wdXRGcmFtZS5tTWF4SnBlZ1NpemUsCisgICAgICAgICAgICBpbnB1dEZyYW1lLm1KcGVnUXVhbGl0eSwgZXhpZk9yaWVudGF0aW9uLCBhY3R1YWxKcGVnU2l6ZSk7CisgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiJXM6IENvbmZpZGVuY2UgbWFwIGNvbXByZXNzaW9uIGZhaWxlZCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgZGVwdGhQYXJhbXMuY29uZmlkZW5jZV9kYXRhLnJlc2l6ZShhY3R1YWxKcGVnU2l6ZSk7CisKKyAgICByZXR1cm4gRGVwdGhNYXA6OkZyb21EYXRhKGRlcHRoUGFyYW1zLCBpdGVtcyk7Cit9CisKK2V4dGVybiAiQyIgaW50IHByb2Nlc3NEZXB0aFBob3RvRnJhbWUoRGVwdGhQaG90b0lucHV0RnJhbWUgaW5wdXRGcmFtZSwgc2l6ZV90IGRlcHRoUGhvdG9CdWZmZXJTaXplLAorICAgICAgICB2b2lkKiBkZXB0aFBob3RvQnVmZmVyIC8qb3V0Ki8sIHNpemVfdCogZGVwdGhQaG90b0FjdHVhbFNpemUgLypvdXQqLykgeworICAgIGlmICgoaW5wdXRGcmFtZS5tTWFpbkpwZWdCdWZmZXIgPT0gbnVsbHB0cikgfHwgKGlucHV0RnJhbWUubURlcHRoTWFwQnVmZmVyID09IG51bGxwdHIpIHx8CisgICAgICAgICAgICAoZGVwdGhQaG90b0J1ZmZlciA9PSBudWxscHRyKSB8fCAoZGVwdGhQaG90b0FjdHVhbFNpemUgPT0gbnVsbHB0cikpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8SXRlbT4+IGl0ZW1zOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDYW1lcmE+PiBjYW1lcmFMaXN0OworICAgIGF1dG8gaW1hZ2UgPSBJbWFnZTo6RnJvbURhdGFGb3JQcmltYXJ5SW1hZ2UoImFuZHJvaWQvbWFpbmltYWdlIiwgJml0ZW1zKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q2FtZXJhUGFyYW1zPiBjYW1lcmFQYXJhbXMobmV3IENhbWVyYVBhcmFtcyhzdGQ6Om1vdmUoaW1hZ2UpKSk7CisgICAgaWYgKGNhbWVyYVBhcmFtcyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGluaXRpYWxpemUgY2FtZXJhIHBhcmFtZXRlcnMiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEV4aWZPcmllbnRhdGlvbiBleGlmT3JpZW50YXRpb24gPSBnZXRFeGlmT3JpZW50YXRpb24oCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPiAoaW5wdXRGcmFtZS5tTWFpbkpwZWdCdWZmZXIpLAorICAgICAgICAgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdTaXplKTsKKyAgICBib29sIHN3aXRjaERpbWVuc2lvbnM7CisgICAgY2FtZXJhUGFyYW1zLT5kZXB0aF9tYXAgPSBwcm9jZXNzRGVwdGhNYXBGcmFtZShpbnB1dEZyYW1lLCBleGlmT3JpZW50YXRpb24sICZpdGVtcywKKyAgICAgICAgICAgICZzd2l0Y2hEaW1lbnNpb25zKTsKKyAgICBpZiAoY2FtZXJhUGFyYW1zLT5kZXB0aF9tYXAgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IERlcHRoIG1hcCBwcm9jZXNzaW5nIGZhaWxlZCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIEl0IGlzIG5vdCBwb3NzaWJsZSB0byBnZW5lcmF0ZSBhbiBpbWFnaW5nIG1vZGVsIHdpdGhvdXQgaW5zdHJpbnNpYyBjYWxpYnJhdGlvbi4KKyAgICBpZiAoaW5wdXRGcmFtZS5tSXNJbnN0cmluc2ljQ2FsaWJyYXRpb25WYWxpZCkgeworICAgICAgICAvLyBUaGUgY2FtZXJhIGludHJpbnNpYyBjYWxpYnJhdGlvbiBsYXlvdXQgaXMgYXMgZm9sbG93czoKKyAgICAgICAgLy8gW2ZvY2FsTGVuZ3RoWCwgZm9jYWxMZW5ndGhZLCBvcHRpY2FsQ2VudGVyWCwgb3B0aWNhbENlbnRlclksIHNrZXddCisgICAgICAgIGNvbnN0IGR5bmFtaWNfZGVwdGg6OlBvaW50PGRvdWJsZT4gZm9jYWxMZW5ndGgoaW5wdXRGcmFtZS5tSW5zdHJpbnNpY0NhbGlicmF0aW9uWzBdLAorICAgICAgICAgICAgICAgIGlucHV0RnJhbWUubUluc3RyaW5zaWNDYWxpYnJhdGlvblsxXSk7CisgICAgICAgIHNpemVfdCB3aWR0aCA9IGlucHV0RnJhbWUubU1haW5KcGVnV2lkdGg7CisgICAgICAgIHNpemVfdCBoZWlnaHQgPSBpbnB1dEZyYW1lLm1NYWluSnBlZ0hlaWdodDsKKyAgICAgICAgaWYgKHN3aXRjaERpbWVuc2lvbnMpIHsKKyAgICAgICAgICAgIHdpZHRoID0gaW5wdXRGcmFtZS5tTWFpbkpwZWdIZWlnaHQ7CisgICAgICAgICAgICBoZWlnaHQgPSBpbnB1dEZyYW1lLm1NYWluSnBlZ1dpZHRoOworICAgICAgICB9CisgICAgICAgIGNvbnN0IERpbWVuc2lvbiBpbWFnZVNpemUod2lkdGgsIGhlaWdodCk7CisgICAgICAgIEltYWdpbmdNb2RlbFBhcmFtcyBpbWFnaW5nUGFyYW1zKGZvY2FsTGVuZ3RoLCBpbWFnZVNpemUpOworICAgICAgICBpbWFnaW5nUGFyYW1zLnByaW5jaXBhbF9wb2ludC54ID0gaW5wdXRGcmFtZS5tSW5zdHJpbnNpY0NhbGlicmF0aW9uWzJdOworICAgICAgICBpbWFnaW5nUGFyYW1zLnByaW5jaXBhbF9wb2ludC55ID0gaW5wdXRGcmFtZS5tSW5zdHJpbnNpY0NhbGlicmF0aW9uWzNdOworICAgICAgICBpbWFnaW5nUGFyYW1zLnNrZXcgPSBpbnB1dEZyYW1lLm1JbnN0cmluc2ljQ2FsaWJyYXRpb25bNF07CisKKyAgICAgICAgLy8gVGhlIGNhbWVyYSBsZW5zIGRpc3RvcnRpb24gY29udGFpbnMgdGhlIGZvbGxvd2luZyBsZW5zIGNvcnJlY3Rpb24gY29lZmZpY2llbnRzLgorICAgICAgICAvLyBba2FwcGFfMSwga2FwcGFfMiwga2FwcGFfMyBrYXBwYV80LCBrYXBwYV81XQorICAgICAgICBpZiAoaW5wdXRGcmFtZS5tSXNMZW5zRGlzdG9ydGlvblZhbGlkKSB7CisgICAgICAgICAgICAvLyBBY2NvcmRpbmcgdG8gc3BlY2lmaWNhdGlvbiB0aGUgbGVucyBkaXN0b3J0aW9uIGNvZWZmaWNpZW50cyBzaG91bGQgYmUgb3JkZXJlZAorICAgICAgICAgICAgLy8gYXMgWzEsIGthcHBhXzQsIGthcHBhXzEsIGthcHBhXzUsIGthcHBhXzIsIDAsIGthcHBhXzMsIDBdCisgICAgICAgICAgICBmbG9hdCBkaXN0b3J0aW9uRGF0YVtdID0gezEuZiwgaW5wdXRGcmFtZS5tTGVuc0Rpc3RvcnRpb25bM10sCisgICAgICAgICAgICAgICAgICAgIGlucHV0RnJhbWUubUxlbnNEaXN0b3J0aW9uWzBdLCBpbnB1dEZyYW1lLm1MZW5zRGlzdG9ydGlvbls0XSwKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRGcmFtZS5tTGVuc0Rpc3RvcnRpb25bMV0sIDAuZiwgaW5wdXRGcmFtZS5tTGVuc0Rpc3RvcnRpb25bMl0sIDAuZn07CisgICAgICAgICAgICBhdXRvIGRpc3RvcnRpb25EYXRhTGVuZ3RoID0gc2l6ZW9mKGRpc3RvcnRpb25EYXRhKSAvIHNpemVvZihkaXN0b3J0aW9uRGF0YVswXSk7CisgICAgICAgICAgICBpbWFnaW5nUGFyYW1zLmRpc3RvcnRpb24ucmVzZXJ2ZShkaXN0b3J0aW9uRGF0YUxlbmd0aCk7CisgICAgICAgICAgICBpbWFnaW5nUGFyYW1zLmRpc3RvcnRpb24uaW5zZXJ0KGltYWdpbmdQYXJhbXMuZGlzdG9ydGlvbi5lbmQoKSwgZGlzdG9ydGlvbkRhdGEsCisgICAgICAgICAgICAgICAgICAgIGRpc3RvcnRpb25EYXRhICsgZGlzdG9ydGlvbkRhdGFMZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgY2FtZXJhUGFyYW1zLT5pbWFnaW5nX21vZGVsID0gSW1hZ2luZ01vZGVsOjpGcm9tRGF0YShpbWFnaW5nUGFyYW1zKTsKKyAgICB9CisKKyAgICBpZiAoaW5wdXRGcmFtZS5tSXNMb2dpY2FsKSB7CisgICAgICAgIGNhbWVyYVBhcmFtcy0+dHJhaXQgPSBkeW5hbWljX2RlcHRoOjpDYW1lcmFUcmFpdDo6TE9HSUNBTDsKKyAgICB9IGVsc2UgeworICAgICAgICBjYW1lcmFQYXJhbXMtPnRyYWl0ID0gZHluYW1pY19kZXB0aDo6Q2FtZXJhVHJhaXQ6OlBIWVNJQ0FMOworICAgIH0KKworICAgIGNhbWVyYUxpc3QuZW1wbGFjZV9iYWNrKENhbWVyYTo6RnJvbURhdGEoc3RkOjptb3ZlKGNhbWVyYVBhcmFtcykpKTsKKworICAgIGF1dG8gZGV2aWNlUGFyYW1zID0gc3RkOjptYWtlX3VuaXF1ZTxEZXZpY2VQYXJhbXM+IChDYW1lcmFzOjpGcm9tQ2FtZXJhQXJyYXkoJmNhbWVyYUxpc3QpKTsKKyAgICBkZXZpY2VQYXJhbXMtPmNvbnRhaW5lciA9IENvbnRhaW5lcjo6RnJvbUl0ZW1zKCZpdGVtcyk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFByb2ZpbGU+PiBwcm9maWxlTGlzdDsKKyAgICBwcm9maWxlTGlzdC5lbXBsYWNlX2JhY2soUHJvZmlsZTo6RnJvbURhdGEoIkRlcHRoUGhvdG8iLCB7MH0pKTsKKyAgICBkZXZpY2VQYXJhbXMtPnByb2ZpbGVzID0gUHJvZmlsZXM6OkZyb21Qcm9maWxlQXJyYXkoJnByb2ZpbGVMaXN0KTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RGV2aWNlPiBkZXZpY2UgPSBEZXZpY2U6OkZyb21EYXRhKHN0ZDo6bW92ZShkZXZpY2VQYXJhbXMpKTsKKyAgICBpZiAoZGV2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjYW1lcmEgZGV2aWNlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGQ6OmlzdHJpbmdzdHJlYW0gaW5wdXRKcGVnU3RyZWFtKAorICAgICAgICAgICAgc3RkOjpzdHJpbmcoaW5wdXRGcmFtZS5tTWFpbkpwZWdCdWZmZXIsIGlucHV0RnJhbWUubU1haW5KcGVnU2l6ZSkpOworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXRwdXRKcGVnU3RyZWFtOworICAgIGlmICghV3JpdGVJbWFnZUFuZE1ldGFkYXRhQW5kQ29udGFpbmVyKCZpbnB1dEpwZWdTdHJlYW0sIGRldmljZS5nZXQoKSwgJm91dHB1dEpwZWdTdHJlYW0pKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHdyaXRpbmcgZGVwdGggb3V0cHV0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAqZGVwdGhQaG90b0FjdHVhbFNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+IChvdXRwdXRKcGVnU3RyZWFtLnRlbGxwKCkpOworICAgIGlmICgqZGVwdGhQaG90b0FjdHVhbFNpemUgPiBkZXB0aFBob3RvQnVmZmVyU2l6ZSkgeworICAgICAgICBBTE9HRSgiJXM6IERlcHRoIHBob3RvIG91dHB1dCBidWZmZXIgbm90IHN1ZmZpY2llbnQsIG5lZWRlZCAlenUgYWN0dWFsICV6dSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAqZGVwdGhQaG90b0FjdHVhbFNpemUsIGRlcHRoUGhvdG9CdWZmZXJTaXplKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBtZW1jcHkoZGVwdGhQaG90b0J1ZmZlciwgb3V0cHV0SnBlZ1N0cmVhbS5zdHIoKS5jX3N0cigpLCAqZGVwdGhQaG90b0FjdHVhbFNpemUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK307IC8vIG5hbWVzcGFjZSBjYW1lcmEzCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9EZXB0aFBob3RvUHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEyZmJmZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9EZXB0aFBob3RvUHJvY2Vzc29yLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkEzX0RFUFRIX1BST0NFU1NPUl9ICisjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBM19ERVBUSF9QUk9DRVNTT1JfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworZW51bSBEZXB0aFBob3RvT3JpZW50YXRpb24geworICAgIERFUFRIX09SSUVOVEFUSU9OXzBfREVHUkVFUyAgID0gMCwKKyAgICBERVBUSF9PUklFTlRBVElPTl85MF9ERUdSRUVTICA9IDkwLAorICAgIERFUFRIX09SSUVOVEFUSU9OXzE4MF9ERUdSRUVTID0gMTgwLAorICAgIERFUFRIX09SSUVOVEFUSU9OXzI3MF9ERUdSRUVTID0gMjcwLAorfTsKKworc3RydWN0IERlcHRoUGhvdG9JbnB1dEZyYW1lIHsKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgbU1haW5KcGVnQnVmZmVyOworICAgIHNpemVfdCAgICAgICAgICAgICAgICBtTWFpbkpwZWdTaXplOworICAgIHNpemVfdCAgICAgICAgICAgICAgICBtTWFpbkpwZWdXaWR0aCwgbU1haW5KcGVnSGVpZ2h0OworICAgIHVpbnQxNl90KiAgICAgICAgICAgICBtRGVwdGhNYXBCdWZmZXI7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgIG1EZXB0aE1hcFdpZHRoLCBtRGVwdGhNYXBIZWlnaHQsIG1EZXB0aE1hcFN0cmlkZTsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgbU1heEpwZWdTaXplOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBtSnBlZ1F1YWxpdHk7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIG1Jc0xvZ2ljYWw7CisgICAgZmxvYXQgICAgICAgICAgICAgICAgIG1JbnN0cmluc2ljQ2FsaWJyYXRpb25bNV07CisgICAgdWludDhfdCAgICAgICAgICAgICAgIG1Jc0luc3RyaW5zaWNDYWxpYnJhdGlvblZhbGlkOworICAgIGZsb2F0ICAgICAgICAgICAgICAgICBtTGVuc0Rpc3RvcnRpb25bNV07CisgICAgdWludDhfdCAgICAgICAgICAgICAgIG1Jc0xlbnNEaXN0b3J0aW9uVmFsaWQ7CisgICAgRGVwdGhQaG90b09yaWVudGF0aW9uIG1PcmllbnRhdGlvbjsKKworICAgIERlcHRoUGhvdG9JbnB1dEZyYW1lKCkgOgorICAgICAgICAgICAgbU1haW5KcGVnQnVmZmVyKG51bGxwdHIpLAorICAgICAgICAgICAgbU1haW5KcGVnU2l6ZSgwKSwKKyAgICAgICAgICAgIG1NYWluSnBlZ1dpZHRoKDApLAorICAgICAgICAgICAgbU1haW5KcGVnSGVpZ2h0KDApLAorICAgICAgICAgICAgbURlcHRoTWFwQnVmZmVyKG51bGxwdHIpLAorICAgICAgICAgICAgbURlcHRoTWFwV2lkdGgoMCksCisgICAgICAgICAgICBtRGVwdGhNYXBIZWlnaHQoMCksCisgICAgICAgICAgICBtRGVwdGhNYXBTdHJpZGUoMCksCisgICAgICAgICAgICBtTWF4SnBlZ1NpemUoMCksCisgICAgICAgICAgICBtSnBlZ1F1YWxpdHkoMTAwKSwKKyAgICAgICAgICAgIG1Jc0xvZ2ljYWwoMCksCisgICAgICAgICAgICBtSW5zdHJpbnNpY0NhbGlicmF0aW9uezAuZn0sCisgICAgICAgICAgICBtSXNJbnN0cmluc2ljQ2FsaWJyYXRpb25WYWxpZCgwKSwKKyAgICAgICAgICAgIG1MZW5zRGlzdG9ydGlvbnswLmZ9LAorICAgICAgICAgICAgbUlzTGVuc0Rpc3RvcnRpb25WYWxpZCgwKSwKKyAgICAgICAgICAgIG1PcmllbnRhdGlvbihEZXB0aFBob3RvT3JpZW50YXRpb246OkRFUFRIX09SSUVOVEFUSU9OXzBfREVHUkVFUykge30KK307CisKK3N0YXRpYyBjb25zdCBjaGFyICprRGVwdGhQaG90b0xpYnJhcnkgPSAibGliZGVwdGhwaG90by5zbyI7CitzdGF0aWMgY29uc3QgY2hhciAqa0RlcHRoUGhvdG9Qcm9jZXNzRnVuY3Rpb24gPSAicHJvY2Vzc0RlcHRoUGhvdG9GcmFtZSI7Cit0eXBlZGVmIGludCAoKnByb2Nlc3NfZGVwdGhfcGhvdG9fZnJhbWUpIChEZXB0aFBob3RvSW5wdXRGcmFtZSAvKmlucHV0RnJhbWUqLywKKyAgICAgICAgc2l6ZV90IC8qZGVwdGhQaG90b0J1ZmZlclNpemUqLywgdm9pZCogLypkZXB0aFBob3RvQnVmZmVyIG91dCovLAorICAgICAgICBzaXplX3QqIC8qZGVwdGhQaG90b0FjdHVhbFNpemUgb3V0Ki8pOworCit9OyAvLyBuYW1lc3BhY2UgY2FtZXJhMworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuY3BwCmluZGV4IDQxYzk1M2IuLjNkNTZjZDIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuY3BwCkBAIC04OSwxMiArODksMjcgQEAKICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKIAogICAgIENhbWVyYU1ldGFkYXRhIGxhc3RGcmFtZTsKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgQ2FtZXJhTWV0YWRhdGE+IGxhc3RQaHlzaWNhbEZyYW1lczsKICAgICB7CiAgICAgICAgIC8vIERvbid0IHJhY2Ugd2hpbGUgZHVtcGluZyBtZXRhZGF0YQogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobUxhc3RGcmFtZU11dGV4KTsKICAgICAgICAgbGFzdEZyYW1lID0gQ2FtZXJhTWV0YWRhdGEobUxhc3RGcmFtZSk7CisKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwaHlzaWNhbEZyYW1lIDogbUxhc3RQaHlzaWNhbEZyYW1lcykgeworICAgICAgICAgICAgbGFzdFBoeXNpY2FsRnJhbWVzLmVtcGxhY2UoU3RyaW5nOChwaHlzaWNhbEZyYW1lLm1QaHlzaWNhbENhbWVyYUlkKSwKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxGcmFtZS5tUGh5c2ljYWxDYW1lcmFNZXRhZGF0YSk7CisgICAgICAgIH0KICAgICB9Ci0gICAgbGFzdEZyYW1lLmR1bXAoZmQsIDIsIDYpOworICAgIGxhc3RGcmFtZS5kdW1wKGZkLCAvKnZlcmJvc2l0eSovMiwgLyppbmRlbnRhdGlvbiovNik7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHBoeXNpY2FsRnJhbWUgOiBsYXN0UGh5c2ljYWxGcmFtZXMpIHsKKyAgICAgICAgcmVzdWx0ID0gU3RyaW5nODo6Zm9ybWF0KCIgICBMYXRlc3QgcmVjZWl2ZWQgZnJhbWUgZm9yIHBoeXNpY2FsIGNhbWVyYSAlczpcbiIsCisgICAgICAgICAgICAgICAgcGh5c2ljYWxGcmFtZS5maXJzdC5jX3N0cigpKTsKKyAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CisgICAgICAgIENhbWVyYU1ldGFkYXRhIGxhc3RQaHlzaWNhbE1ldGFkYXRhID0gQ2FtZXJhTWV0YWRhdGEocGh5c2ljYWxGcmFtZS5zZWNvbmQpOworICAgICAgICBsYXN0UGh5c2ljYWxNZXRhZGF0YS5zb3J0KCk7CisgICAgICAgIGxhc3RQaHlzaWNhbE1ldGFkYXRhLmR1bXAoZmQsIC8qdmVyYm9zaXR5Ki8yLCAvKmluZGVudGF0aW9uKi82KTsKKyAgICB9CiB9CiAKIGJvb2wgRnJhbWVQcm9jZXNzb3JCYXNlOjp0aHJlYWRMb29wKCkgewpAQCAtMTQ1LDYgKzE2MCw4IEBACiAgICAgICAgIGlmICghcmVzdWx0Lm1NZXRhZGF0YS5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtTGFzdEZyYW1lTXV0ZXgpOwogICAgICAgICAgICAgbUxhc3RGcmFtZS5hY3F1aXJlKHJlc3VsdC5tTWV0YWRhdGEpOworCisgICAgICAgICAgICBtTGFzdFBoeXNpY2FsRnJhbWVzID0gc3RkOjptb3ZlKHJlc3VsdC5tUGh5c2ljYWxNZXRhZGF0YXMpOwogICAgICAgICB9CiAgICAgfQogICAgIGlmIChyZXMgIT0gTk9UX0VOT1VHSF9EQVRBKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmgKaW5kZXggMDA3NjNhNC4uYWU2ZDE1ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuaApAQCAtODMsNiArODMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gJmRldmljZSk7CiAKICAgICBDYW1lcmFNZXRhZGF0YSBtTGFzdEZyYW1lOworICAgIHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+IG1MYXN0UGh5c2ljYWxGcmFtZXM7CisKIH07CiAKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzQnVmZmVyTWFuYWdlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmNwcAppbmRleCA4YzhiOTdhLi5kNmJmODNlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmNwcApAQCAtMjM3LDcgKzIzNyw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNCdWZmZXJNYW5hZ2VyOjpnZXRCdWZmZXJGb3JTdHJlYW0oaW50IHN0cmVhbUlkLCBpbnQgc3RyZWFtU2V0SWQsCi0gICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+KiBnYiwgaW50KiBmZW5jZUZkKSB7CisgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+KiBnYiwgaW50KiBmZW5jZUZkLCBib29sIG5vRnJlZUJ1ZmZlckF0Q29uc3VtZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwpAQCAtMjUzLDE0ICsyNTMsMTkgQEAKICAgICBTdHJlYW1TZXQgJnN0cmVhbVNldCA9IG1TdHJlYW1TZXRNYXAuZWRpdFZhbHVlRm9yKHN0cmVhbVNldElkKTsKICAgICBCdWZmZXJDb3VudE1hcCYgaGFuZE91dEJ1ZmZlckNvdW50cyA9IHN0cmVhbVNldC5oYW5kb3V0QnVmZmVyQ291bnRNYXA7CiAgICAgc2l6ZV90JiBidWZmZXJDb3VudCA9IGhhbmRPdXRCdWZmZXJDb3VudHMuZWRpdFZhbHVlRm9yKHN0cmVhbUlkKTsKKyAgICBCdWZmZXJDb3VudE1hcCYgYXR0YWNoZWRCdWZmZXJDb3VudHMgPSBzdHJlYW1TZXQuYXR0YWNoZWRCdWZmZXJDb3VudE1hcDsKKyAgICBzaXplX3QmIGF0dGFjaGVkQnVmZmVyQ291bnQgPSBhdHRhY2hlZEJ1ZmZlckNvdW50cy5lZGl0VmFsdWVGb3Ioc3RyZWFtSWQpOworCisgICAgaWYgKG5vRnJlZUJ1ZmZlckF0Q29uc3VtZXIpIHsKKyAgICAgICAgYXR0YWNoZWRCdWZmZXJDb3VudCA9IGJ1ZmZlckNvdW50OworICAgIH0KKwogICAgIGlmIChidWZmZXJDb3VudCA+PSBzdHJlYW1TZXQubWF4QWxsb3dlZEJ1ZmZlckNvdW50KSB7CiAgICAgICAgIEFMT0dFKCIlczogYnVmZmVyQ291bnQgKCV6dSkgZXhjZWVkcyB0aGUgbWF4IGFsbG93ZWQgYnVmZmVyIGNvdW50ICglenUpIG9mIHRoaXMgc3RyZWFtIHNldCIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWZmZXJDb3VudCwgc3RyZWFtU2V0Lm1heEFsbG93ZWRCdWZmZXJDb3VudCk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBCdWZmZXJDb3VudE1hcCYgYXR0YWNoZWRCdWZmZXJDb3VudHMgPSBzdHJlYW1TZXQuYXR0YWNoZWRCdWZmZXJDb3VudE1hcDsKLSAgICBzaXplX3QmIGF0dGFjaGVkQnVmZmVyQ291bnQgPSBhdHRhY2hlZEJ1ZmZlckNvdW50cy5lZGl0VmFsdWVGb3Ioc3RyZWFtSWQpOwogICAgIGlmIChhdHRhY2hlZEJ1ZmZlckNvdW50ID4gYnVmZmVyQ291bnQpIHsKICAgICAgICAgLy8gV2UndmUgYWxyZWFkeSBhdHRhY2hlZCBtb3JlIGJ1ZmZlcnMgdG8gdGhpcyBzdHJlYW0gdGhhbiB3ZSBjdXJyZW50bHkgaGF2ZQogICAgICAgICAvLyBvdXRzdGFuZGluZywgc28gaGF2ZSB0aGUgc3RyZWFtIGp1c3QgdXNlIGFuIGFscmVhZHktYXR0YWNoZWQgYnVmZmVyCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmgKaW5kZXggMDI1MDYyZS4uZjBkZTFjMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzQnVmZmVyTWFuYWdlci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0J1ZmZlck1hbmFnZXIuaApAQCAtMTEyLDYgKzExMiwxMCBAQAogICAgICAqCiAgICAgICogQWZ0ZXIgdGhpcyBjYWxsLCB0aGUgY2xpZW50IHRha2VzIG92ZXIgdGhlIG93bmVyc2hpcCBvZiB0aGlzIGJ1ZmZlciBpZiBpdCBpcyBub3QgZnJlZWQuCiAgICAgICoKKyAgICAgKiBTb21ldGltZXMgZnJlZSBidWZmZXJzIGFyZSBkaXNjYXJkZWQgZnJvbSBjb25zdW1lciBzaWRlIGFuZCB0aGUgZGVxdWV1ZUJ1ZmZlciBjYWxsIHJldHVybnMKKyAgICAgKiBUSU1FRF9PVVQsIGluIHRoaXMgY2FzZSBjYWxsaW5nIGdldEJ1ZmZlckZvclN0cmVhbSBhZ2FpbiB3aXRoIG5vRnJlZUJ1ZmZlckF0Q29uc3VtZXIgc2V0IHRvCisgICAgICogdHJ1ZSB3aWxsIG5vdGlmeSBidWZmZXIgbWFuYWdlciB0byB1cGRhdGUgaXRzIHN0YXRlcyBhbmQgYWxzbyB0cmllcyB0byBhbGxvY2F0ZSBhIG5ldyBidWZmZXIuCisgICAgICoKICAgICAgKiBSZXR1cm4gdmFsdWVzOgogICAgICAqCiAgICAgICogIE9LOiAgICAgICAgR2V0dGluZyBidWZmZXIgZm9yIHRoaXMgc3RyZWFtIHdhcyBzdWNjZXNzZnVsLgpAQCAtMTIyLDcgKzEyNiw5IEBACiAgICAgICogICAgICAgICAgICAgdG8gdGhpcyBidWZmZXIgbWFuYWdlciBiZWZvcmUuCiAgICAgICogIE5PX01FTU9SWTogVW5hYmxlIHRvIGFsbG9jYXRlIGEgYnVmZmVyIGZvciB0aGlzIHN0cmVhbSBhdCB0aGlzIHRpbWUuCiAgICAgICovCi0gICAgc3RhdHVzX3QgZ2V0QnVmZmVyRm9yU3RyZWFtKGludCBzdHJlYW1JZCwgaW50IHN0cmVhbVNldElkLCBzcDxHcmFwaGljQnVmZmVyPiogZ2IsIGludCogZmVuY2VGZCk7CisgICAgc3RhdHVzX3QgZ2V0QnVmZmVyRm9yU3RyZWFtKAorICAgICAgICAgICAgaW50IHN0cmVhbUlkLCBpbnQgc3RyZWFtU2V0SWQsIHNwPEdyYXBoaWNCdWZmZXI+KiBnYiwgaW50KiBmZW5jZUZkLAorICAgICAgICAgICAgYm9vbCBub0ZyZWVCdWZmZXJBdENvbnN1bWVyID0gZmFsc2UpOwogCiAgICAgLyoqCiAgICAgICogVGhpcyBtZXRob2Qgbm90aWZpZXMgdGhlIG1hbmFnZXIgdGhhdCBhIGJ1ZmZlciBoYXMgYmVlbiByZWxlYXNlZCBieSB0aGUgY29uc3VtZXIuCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcAppbmRleCAyOGZmYzhiLi4wMGYwZDg2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKQEAgLTU2LDYgKzU2LDkgQEAKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5oIgogI2luY2x1ZGUgImRldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oIgogI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKKyNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgorCisjaW5jbHVkZSA8dHVwbGU+CiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpjYW1lcmEzOwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE7CkBAIC03NCwxNSArNzcsMTYgQEAKICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCgwKSwKICAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlcigwKSwKICAgICAgICAgbU5leHRSZXByb2Nlc3NSZXN1bHRGcmFtZU51bWJlcigwKSwKKyAgICAgICAgbU5leHRac2xTdGlsbFJlc3VsdEZyYW1lTnVtYmVyKDApLAogICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlcigwKSwKICAgICAgICAgbU5leHRSZXByb2Nlc3NTaHV0dGVyRnJhbWVOdW1iZXIoMCksCisgICAgICAgIG1OZXh0WnNsU3RpbGxTaHV0dGVyRnJhbWVOdW1iZXIoMCksCiAgICAgICAgIG1MaXN0ZW5lcihOVUxMKSwKICAgICAgICAgbVZlbmRvclRhZ0lkKENBTUVSQV9NRVRBREFUQV9JTlZBTElEX1ZFTkRPUl9JRCksCi0gICAgICAgIG1MYXN0VGVtcGxhdGVJZCgtMSkKKyAgICAgICAgbUxhc3RUZW1wbGF0ZUlkKC0xKSwKKyAgICAgICAgbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzKGZhbHNlKQogewogICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgY2FtZXJhM19jYWxsYmFja19vcHM6Om5vdGlmeSA9ICZzTm90aWZ5OwotICAgIGNhbWVyYTNfY2FsbGJhY2tfb3BzOjpwcm9jZXNzX2NhcHR1cmVfcmVzdWx0ID0gJnNQcm9jZXNzQ2FwdHVyZVJlc3VsdDsKICAgICBBTE9HVigiJXM6IENyZWF0ZWQgZGV2aWNlIGZvciBjYW1lcmEgJXMiLCBfX0ZVTkNUSU9OX18sIG1JZC5zdHJpbmcoKSk7CiB9CiAKQEAgLTkwLDcgKzk0LDcgQEAKIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dWKCIlczogVGVhcmluZyBkb3duIGZvciBjYW1lcmEgaWQgJXMiLCBfX0ZVTkNUSU9OX18sIG1JZC5zdHJpbmcoKSk7Ci0gICAgZGlzY29ubmVjdCgpOworICAgIGRpc2Nvbm5lY3RJbXBsKCk7CiB9CiAKIGNvbnN0IFN0cmluZzgmIENhbWVyYTNEZXZpY2U6OmdldElkKCkgY29uc3QgewpAQCAtMTIxLDExICsxMjUsMzYgQEAKIAogICAgIHJlcyA9IG1hbmFnZXItPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhtSWQuc3RyaW5nKCksICZtRGV2aWNlSW5mbyk7CiAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICBTRVRfRVJSX0woIkNvdWxkIG5vdCByZXRyaXZlIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3M6ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgU0VUX0VSUl9MKCJDb3VsZCBub3QgcmV0cmlldmUgY2FtZXJhIGNoYXJhY3RlcmlzdGljczogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICBzZXNzaW9uLT5jbG9zZSgpOwogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkczsKKyAgICBib29sIGlzTG9naWNhbCA9IG1hbmFnZXItPmlzTG9naWNhbENhbWVyYShtSWQuc3RyaW5nKCksICZwaHlzaWNhbENhbWVyYUlkcyk7CisgICAgaWYgKGlzTG9naWNhbCkgeworICAgICAgICBmb3IgKGF1dG8mIHBoeXNpY2FsSWQgOiBwaHlzaWNhbENhbWVyYUlkcykgeworICAgICAgICAgICAgcmVzID0gbWFuYWdlci0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAorICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbElkLCAmbVBoeXNpY2FsRGV2aWNlSW5mb01hcFtwaHlzaWNhbElkXSk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgU0VUX0VSUl9MKCJDb3VsZCBub3QgcmV0cmlldmUgY2FtZXJhICVzIGNoYXJhY3RlcmlzdGljczogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbElkLmNfc3RyKCksIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgIHNlc3Npb24tPmNsb3NlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKERpc3RvcnRpb25NYXBwZXI6OmlzRGlzdG9ydGlvblN1cHBvcnRlZChtUGh5c2ljYWxEZXZpY2VJbmZvTWFwW3BoeXNpY2FsSWRdKSkgeworICAgICAgICAgICAgICAgIG1EaXN0b3J0aW9uTWFwcGVyc1twaHlzaWNhbElkXS5zZXR1cFN0YXRpY0luZm8obVBoeXNpY2FsRGV2aWNlSW5mb01hcFtwaHlzaWNhbElkXSk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBTRVRfRVJSX0woIlVuYWJsZSB0byByZWFkIGNhbWVyYSAlcydzIGNhbGlicmF0aW9uIGZpZWxkcyBmb3IgZGlzdG9ydGlvbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvcnJlY3Rpb24iLCBwaHlzaWNhbElkLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5jbG9zZSgpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4gcXVldWU7CiAgICAgYXV0byByZXF1ZXN0UXVldWVSZXQgPSBzZXNzaW9uLT5nZXRDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUoCiAgICAgICAgIFsmcXVldWVdKGNvbnN0IGF1dG8mIGRlc2NyaXB0b3IpIHsKQEAgLTE2MSwxMyArMTkwLDIwIEBACiAgICAgICAgIHNlc3Npb24tPmludGVyZmFjZUNoYWluKFtdKAogICAgICAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM8OjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc+IGludGVyZmFjZUNoYWluKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoIlNlc3Npb24gaW50ZXJmYWNlIGNoYWluOiIpOwotICAgICAgICAgICAgICAgIGZvciAoYXV0byBpZmFjZSA6IGludGVyZmFjZUNoYWluKSB7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBpZmFjZSA6IGludGVyZmFjZUNoYWluKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIgICVzIiwgaWZhY2UuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSk7CiAgICAgfQogCi0gICAgbUludGVyZmFjZSA9IG5ldyBIYWxJbnRlcmZhY2Uoc2Vzc2lvbiwgcXVldWUpOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBidWZNZ3JNb2RlID0KKyAgICAgICAgICAgIG1EZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9JTkZPX1NVUFBPUlRFRF9CVUZGRVJfTUFOQUdFTUVOVF9WRVJTSU9OKTsKKyAgICBpZiAoYnVmTWdyTW9kZS5jb3VudCA+IDApIHsKKyAgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyID0gKGJ1Zk1nck1vZGUuZGF0YS51OFswXSA9PQorICAgICAgICAgICAgQU5EUk9JRF9JTkZPX1NVUFBPUlRFRF9CVUZGRVJfTUFOQUdFTUVOVF9WRVJTSU9OX0hJRExfREVWSUNFXzNfNSk7CisgICAgfQorCisgICAgbUludGVyZmFjZSA9IG5ldyBIYWxJbnRlcmZhY2Uoc2Vzc2lvbiwgcXVldWUsIG1Vc2VIYWxCdWZNYW5hZ2VyKTsKICAgICBzdGQ6OnN0cmluZyBwcm92aWRlclR5cGU7CiAgICAgbVZlbmRvclRhZ0lkID0gbWFuYWdlci0+Z2V0UHJvdmlkZXJUYWdJZExvY2tlZChtSWQuc3RyaW5nKCkpOwogICAgIG1UYWdNb25pdG9yLmluaXRpYWxpemUobVZlbmRvclRhZ0lkKTsKQEAgLTE3NSw2ICsyMTEsMjggQEAKICAgICAgICAgbVRhZ01vbml0b3IucGFyc2VUYWdzVG9Nb25pdG9yKFN0cmluZzgobW9uaXRvclRhZ3MpKTsKICAgICB9CiAKKyAgICAvLyBNZXRhZGF0YSB0YWdzIG5lZWRzIGZpeHVwIGZvciBtb25vY2hyb21lIGNhbWVyYSBkZXZpY2UgdmVyc2lvbiBsZXNzCisgICAgLy8gdGhhbiAzLjUuCisgICAgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtYXhWZXJzaW9uezAsMH07CisgICAgcmVzID0gbWFuYWdlci0+Z2V0SGlnaGVzdFN1cHBvcnRlZFZlcnNpb24obUlkLnN0cmluZygpLCAmbWF4VmVyc2lvbik7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yIGluIGdldHRpbmcgY2FtZXJhIGRldmljZSB2ZXJzaW9uIGlkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTigKKyAgICAgICAgICAgIG1heFZlcnNpb24uZ2V0X21ham9yKCksIG1heFZlcnNpb24uZ2V0X21pbm9yKCkpOworCisgICAgYm9vbCBpc01vbm9jaHJvbWUgPSBmYWxzZTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlbnRyeSA9IG1EZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7IGkrKykgeworICAgICAgICB1aW50OF90IGNhcGFiaWxpdHkgPSBlbnRyeS5kYXRhLnU4W2ldOworICAgICAgICBpZiAoY2FwYWJpbGl0eSA9PSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19NT05PQ0hST01FKSB7CisgICAgICAgICAgICBpc01vbm9jaHJvbWUgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIG1OZWVkRml4dXBNb25vY2hyb21lVGFncyA9IChpc01vbm9jaHJvbWUgJiYgZGV2aWNlVmVyc2lvbiA8IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM181KTsKKwogICAgIHJldHVybiBpbml0aWFsaXplQ29tbW9uTG9ja2VkKCk7CiB9CiAKQEAgLTE5NCw2ICsyNTIsMTcgQEAKICAgICAvKiogUmVnaXN0ZXIgaW4tZmxpZ2h0IG1hcCB0byB0aGUgc3RhdHVzIHRyYWNrZXIgKi8KICAgICBtSW5GbGlnaHRTdGF0dXNJZCA9IG1TdGF0dXNUcmFja2VyLT5hZGRDb21wb25lbnQoKTsKIAorICAgIGlmIChtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICByZXMgPSBtUmVxdWVzdEJ1ZmZlclNNLmluaXRpYWxpemUobVN0YXR1c1RyYWNrZXIpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBTRVRfRVJSX0woIlVuYWJsZSB0byBzdGFydCByZXF1ZXN0IGJ1ZmZlciBzdGF0ZSBtYWNoaW5lOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICBtSW50ZXJmYWNlLT5jbG9zZSgpOworICAgICAgICAgICAgbVN0YXR1c1RyYWNrZXIuY2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvKiogQ3JlYXRlIGJ1ZmZlciBtYW5hZ2VyICovCiAgICAgbUJ1ZmZlck1hbmFnZXIgPSBuZXcgQ2FtZXJhM0J1ZmZlck1hbmFnZXIoKTsKIApAQCAtMjAzLDggKzI3MiwxMCBAQAogICAgIGlmIChzZXNzaW9uS2V5c0VudHJ5LmNvdW50ID4gMCkgewogICAgICAgICBzZXNzaW9uUGFyYW1LZXlzLmluc2VydEFycmF5QXQoc2Vzc2lvbktleXNFbnRyeS5kYXRhLmkzMiwgMCwgc2Vzc2lvbktleXNFbnRyeS5jb3VudCk7CiAgICAgfQorCiAgICAgLyoqIFN0YXJ0IHVwIHJlcXVlc3QgcXVldWUgdGhyZWFkICovCi0gICAgbVJlcXVlc3RUaHJlYWQgPSBuZXcgUmVxdWVzdFRocmVhZCh0aGlzLCBtU3RhdHVzVHJhY2tlciwgbUludGVyZmFjZSwgc2Vzc2lvblBhcmFtS2V5cyk7CisgICAgbVJlcXVlc3RUaHJlYWQgPSBuZXcgUmVxdWVzdFRocmVhZCgKKyAgICAgICAgICAgIHRoaXMsIG1TdGF0dXNUcmFja2VyLCBtSW50ZXJmYWNlLCBzZXNzaW9uUGFyYW1LZXlzLCBtVXNlSGFsQnVmTWFuYWdlcik7CiAgICAgcmVzID0gbVJlcXVlc3RUaHJlYWQtPnJ1bihTdHJpbmc4Ojpmb3JtYXQoIkMzRGV2LSVzLVJlcVF1ZXVlIiwgbUlkLnN0cmluZygpKS5zdHJpbmcoKSk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBTRVRfRVJSX0woIlVuYWJsZSB0byBzdGFydCByZXF1ZXN0IHF1ZXVlIHRocmVhZDogJXMgKCVkKSIsCkBAIC0yNTAsMTcgKzMyMSwyMCBAQAogICAgIH0KIAogICAgIGlmIChEaXN0b3J0aW9uTWFwcGVyOjppc0Rpc3RvcnRpb25TdXBwb3J0ZWQobURldmljZUluZm8pKSB7Ci0gICAgICAgIHJlcyA9IG1EaXN0b3J0aW9uTWFwcGVyLnNldHVwU3RhdGljSW5mbyhtRGV2aWNlSW5mbyk7CisgICAgICAgIHJlcyA9IG1EaXN0b3J0aW9uTWFwcGVyc1ttSWQuY19zdHIoKV0uc2V0dXBTdGF0aWNJbmZvKG1EZXZpY2VJbmZvKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgU0VUX0VSUl9MKCJVbmFibGUgdG8gcmVhZCBuZWNlc3NhcnkgY2FsaWJyYXRpb24gZmllbGRzIGZvciBkaXN0b3J0aW9uIGNvcnJlY3Rpb24iKTsKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KICAgICB9Ci0KICAgICByZXR1cm4gT0s7CiB9CiAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OmRpc2Nvbm5lY3QoKSB7CisgICAgcmV0dXJuIGRpc2Nvbm5lY3RJbXBsKCk7Cit9CisKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmRpc2Nvbm5lY3RJbXBsKCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKIApAQCAtMzI3LDYgKzQwMSw3IEBACiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAgICAgICAgIG1SZXF1ZXN0VGhyZWFkLmNsZWFyKCk7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBzdExvY2sobVRyYWNrZXJMb2NrKTsKICAgICAgICAgbVN0YXR1c1RyYWNrZXIuY2xlYXIoKTsKICAgICAgICAgaW50ZXJmYWNlID0gbUludGVyZmFjZS5nZXQoKTsKICAgICB9CkBAIC03MTksNyArNzk0LDcgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLWNvbnN0IENhbWVyYU1ldGFkYXRhJiBDYW1lcmEzRGV2aWNlOjppbmZvKCkgY29uc3QgeworY29uc3QgQ2FtZXJhTWV0YWRhdGEmIENhbWVyYTNEZXZpY2U6OmluZm8oY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxJZCkgY29uc3QgewogICAgIEFMT0dWVigiJXM6IEUiLCBfX0ZVTkNUSU9OX18pOwogICAgIGlmIChDQ19VTkxJS0VMWShtU3RhdHVzID09IFNUQVRVU19VTklOSVRJQUxJWkVEIHx8CiAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXMgPT0gU1RBVFVTX0VSUk9SKSkgewpAQCAtNzI3LDcgKzgwMiwyMiBAQAogICAgICAgICAgICAgICAgIG1TdGF0dXMgPT0gU1RBVFVTX0VSUk9SID8KICAgICAgICAgICAgICAgICAid2hlbiBpbiBlcnJvciBzdGF0ZSIgOiAiYmVmb3JlIGluaXQiKTsKICAgICB9Ci0gICAgcmV0dXJuIG1EZXZpY2VJbmZvOworICAgIGlmIChwaHlzaWNhbElkLmlzRW1wdHkoKSkgeworICAgICAgICByZXR1cm4gbURldmljZUluZm87CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgaWQocGh5c2ljYWxJZC5jX3N0cigpKTsKKyAgICAgICAgaWYgKG1QaHlzaWNhbERldmljZUluZm9NYXAuZmluZChpZCkgIT0gbVBoeXNpY2FsRGV2aWNlSW5mb01hcC5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIG1QaHlzaWNhbERldmljZUluZm9NYXAuYXQoaWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHBoeXNpY2FsIGNhbWVyYSBpZCAlcyIsIF9fRlVOQ1RJT05fXywgcGh5c2ljYWxJZC5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBtRGV2aWNlSW5mbzsKKyAgICAgICAgfQorICAgIH0KK30KKworY29uc3QgQ2FtZXJhTWV0YWRhdGEmIENhbWVyYTNEZXZpY2U6OmluZm8oKSBjb25zdCB7CisgICAgU3RyaW5nOCBlbXB0eUlkOworICAgIHJldHVybiBpbmZvKGVtcHR5SWQpOwogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjaGVja1N0YXR1c09rVG9DYXB0dXJlTG9ja2VkKCkgewpAQCAtODEwLDE0ICs5MDAsMTQgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IENhbWVyYTNEZXZpY2U6OmNhcHR1cmUoQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QsIGludDY0X3QqIC8qbGFzdEZyYW1lTnVtYmVyKi8pIHsKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OmNhcHR1cmUoQ2FtZXJhTWV0YWRhdGEgJnJlcXVlc3QsIGludDY0X3QqIGxhc3RGcmFtZU51bWJlcikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKICAgICBMaXN0PGNvbnN0IFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NMaXN0PiByZXF1ZXN0c0xpc3Q7CiAgICAgc3RkOjpsaXN0PGNvbnN0IFN1cmZhY2VNYXA+IHN1cmZhY2VNYXBzOwogICAgIGNvbnZlcnRUb1JlcXVlc3RMaXN0KHJlcXVlc3RzTGlzdCwgc3VyZmFjZU1hcHMsIHJlcXVlc3QpOwogCi0gICAgcmV0dXJuIGNhcHR1cmVMaXN0KHJlcXVlc3RzTGlzdCwgc3VyZmFjZU1hcHMsIC8qbGFzdEZyYW1lTnVtYmVyKi9OVUxMKTsKKyAgICByZXR1cm4gY2FwdHVyZUxpc3QocmVxdWVzdHNMaXN0LCBzdXJmYWNlTWFwcywgbGFzdEZyYW1lTnVtYmVyKTsKIH0KIAogdm9pZCBDYW1lcmEzRGV2aWNlOjpjb252ZXJ0VG9SZXF1ZXN0TGlzdChMaXN0PGNvbnN0IFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NMaXN0PiYgcmVxdWVzdHNMaXN0LApAQCAtODg0LDYgKzk3NCwyMzYgQEAKICAgICByZXR1cm4gcmVzOwogfQogCitoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYTNEZXZpY2U6OnJlcXVlc3RTdHJlYW1CdWZmZXJzKAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpCdWZmZXJSZXF1ZXN0PiYgYnVmUmVxcywKKyAgICAgICAgcmVxdWVzdFN0cmVhbUJ1ZmZlcnNfY2IgX2hpZGxfY2IpIHsKKyAgICB1c2luZyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkJ1ZmZlclJlcXVlc3RTdGF0dXM7CisgICAgdXNpbmcgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpTdHJlYW1CdWZmZXJSZXQ7CisgICAgdXNpbmcgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I7CisKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVxdWVzdEJ1ZmZlckludGVyZmFjZUxvY2spOworCisgICAgaGFyZHdhcmU6OmhpZGxfdmVjPFN0cmVhbUJ1ZmZlclJldD4gYnVmUmV0czsKKyAgICBpZiAoIW1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzIGRvZXMgbm90IHN1cHBvcnQgSEFMIGJ1ZmZlciBtYW5hZ2VtZW50IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZC5zdHJpbmcoKSk7CisgICAgICAgIF9oaWRsX2NiKEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9JTExFR0FMX0FSR1VNRU5UUywgYnVmUmV0cyk7CisgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgIH0KKworICAgIFNvcnRlZFZlY3RvcjxpbnQzMl90PiBzdHJlYW1JZHM7CisgICAgc3NpemVfdCBzeiA9IHN0cmVhbUlkcy5zZXRDYXBhY2l0eShidWZSZXFzLnNpemUoKSk7CisgICAgaWYgKHN6IDwgMCB8fCBzdGF0aWNfY2FzdDxzaXplX3Q+KHN6KSAhPSBidWZSZXFzLnNpemUoKSkgeworICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yICV6dSBidWZmZXIgcmVxdWVzdHMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmUmVxcy5zaXplKCkpOworICAgICAgICBfaGlkbF9jYihCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfSUxMRUdBTF9BUkdVTUVOVFMsIGJ1ZlJldHMpOworICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICB9CisKKyAgICBpZiAoYnVmUmVxcy5zaXplKCkgPiBtT3V0cHV0U3RyZWFtcy5zaXplKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiB0b28gbWFueSBidWZmZXIgcmVxdWVzdHMgKCV6dSA+ICMgb2Ygb3V0cHV0IHN0cmVhbXMgJXp1KSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWZSZXFzLnNpemUoKSwgbU91dHB1dFN0cmVhbXMuc2l6ZSgpKTsKKyAgICAgICAgX2hpZGxfY2IoQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX0lMTEVHQUxfQVJHVU1FTlRTLCBidWZSZXRzKTsKKyAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgfQorCisgICAgLy8gQ2hlY2sgZm9yIHJlcGVhdGVkIHN0cmVhbUlkCisgICAgZm9yIChjb25zdCBhdXRvJiBidWZSZXEgOiBidWZSZXFzKSB7CisgICAgICAgIGlmIChzdHJlYW1JZHMuaW5kZXhPZihidWZSZXEuc3RyZWFtSWQpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZCBhcHBlYXIgbXVsdGlwbGUgdGltZXMgaW4gYnVmZmVyIHJlcXVlc3RzIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWZSZXEuc3RyZWFtSWQpOworICAgICAgICAgICAgX2hpZGxfY2IoQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX0lMTEVHQUxfQVJHVU1FTlRTLCBidWZSZXRzKTsKKyAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgICAgICB9CisgICAgICAgIHN0cmVhbUlkcy5hZGQoYnVmUmVxLnN0cmVhbUlkKTsKKyAgICB9CisKKyAgICBpZiAoIW1SZXF1ZXN0QnVmZmVyU00uc3RhcnRSZXF1ZXN0QnVmZmVyKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiByZXF1ZXN0IGJ1ZmZlciBkaXNhbGxvd2VkIHdoaWxlIGNhbWVyYSBzZXJ2aWNlIGlzIGNvbmZpZ3VyaW5nIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICBfaGlkbF9jYihCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfQ09ORklHVVJJTkcsIGJ1ZlJldHMpOworICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICB9CisKKyAgICBidWZSZXRzLnJlc2l6ZShidWZSZXFzLnNpemUoKSk7CisKKyAgICBib29sIGFsbFJlcXNTdWNjZWVkcyA9IHRydWU7CisgICAgYm9vbCBvbmVSZXFTdWNjZWVkcyA9IGZhbHNlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYnVmUmVxcy5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBhdXRvJiBidWZSZXEgPSBidWZSZXFzW2ldOworICAgICAgICBhdXRvJiBidWZSZXQgPSBidWZSZXRzW2ldOworICAgICAgICBpbnQzMl90IHN0cmVhbUlkID0gYnVmUmVxLnN0cmVhbUlkOworICAgICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBvdXRwdXRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoc3RyZWFtSWQpOworICAgICAgICBpZiAob3V0cHV0U3RyZWFtID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogT3V0cHV0IHN0cmVhbSBpZCAlZCBub3QgZm91bmQhIiwgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CisgICAgICAgICAgICBoYXJkd2FyZTo6aGlkbF92ZWM8U3RyZWFtQnVmZmVyUmV0PiBlbXB0eUJ1ZlJldHM7CisgICAgICAgICAgICBfaGlkbF9jYihCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfSUxMRUdBTF9BUkdVTUVOVFMsIGVtcHR5QnVmUmV0cyk7CisgICAgICAgICAgICBtUmVxdWVzdEJ1ZmZlclNNLmVuZFJlcXVlc3RCdWZmZXIoKTsKKyAgICAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG91dHB1dFN0cmVhbS0+aXNBYmFuZG9uZWQoKSkgeworICAgICAgICAgICAgYnVmUmV0LnZhbC5lcnJvcihTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I6OlNUUkVBTV9ESVNDT05ORUNURUQpOworICAgICAgICAgICAgYWxsUmVxc1N1Y2NlZWRzID0gZmFsc2U7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGJ1ZlJldC5zdHJlYW1JZCA9IHN0cmVhbUlkOworICAgICAgICBzaXplX3QgaGFuZE91dEJ1ZmZlckNvdW50ID0gb3V0cHV0U3RyZWFtLT5nZXRPdXRzdGFuZGluZ0J1ZmZlcnNDb3VudCgpOworICAgICAgICB1aW50MzJfdCBudW1CdWZmZXJzUmVxdWVzdGVkID0gYnVmUmVxLm51bUJ1ZmZlcnNSZXF1ZXN0ZWQ7CisgICAgICAgIHNpemVfdCB0b3RhbEhhbmRvdXQgPSBoYW5kT3V0QnVmZmVyQ291bnQgKyBudW1CdWZmZXJzUmVxdWVzdGVkOworICAgICAgICB1aW50MzJfdCBtYXhCdWZmZXJzID0gb3V0cHV0U3RyZWFtLT5hc0hhbFN0cmVhbSgpLT5tYXhfYnVmZmVyczsKKyAgICAgICAgaWYgKHRvdGFsSGFuZG91dCA+IG1heEJ1ZmZlcnMpIHsKKyAgICAgICAgICAgIC8vIE5vdCBhYmxlIHRvIGFsbG9jYXRlIGVub3VnaCBidWZmZXIuIEV4aXQgZWFybHkgZm9yIHRoaXMgc3RyZWFtCisgICAgICAgICAgICBBTE9HRSgiJXM6IHJlcXVlc3QgdG9vIG11Y2ggYnVmZmVycyBmb3Igc3RyZWFtICVkOiBhdCBIQUw6ICV6dSArIHJlcXVlc3Rpbmc6ICVkIgorICAgICAgICAgICAgICAgICAgICAiID4gbWF4OiAlZCIsIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIGhhbmRPdXRCdWZmZXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgbnVtQnVmZmVyc1JlcXVlc3RlZCwgbWF4QnVmZmVycyk7CisgICAgICAgICAgICBidWZSZXQudmFsLmVycm9yKFN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjo6TUFYX0JVRkZFUl9FWENFRURFRCk7CisgICAgICAgICAgICBhbGxSZXFzU3VjY2VlZHMgPSBmYWxzZTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPFN0cmVhbUJ1ZmZlcj4gdG1wUmV0QnVmZmVycyhudW1CdWZmZXJzUmVxdWVzdGVkKTsKKyAgICAgICAgYm9vbCBjdXJyZW50UmVxU3VjY2VlZHMgPSB0cnVlOworICAgICAgICBzdGQ6OnZlY3RvcjxjYW1lcmEzX3N0cmVhbV9idWZmZXJfdD4gc3RyZWFtQnVmZmVycyhudW1CdWZmZXJzUmVxdWVzdGVkKTsKKyAgICAgICAgc2l6ZV90IG51bUFsbG9jYXRlZEJ1ZmZlcnMgPSAwOworICAgICAgICBzaXplX3QgbnVtUHVzaGVkSW5mbGlnaHRCdWZmZXJzID0gMDsKKyAgICAgICAgZm9yIChzaXplX3QgYiA9IDA7IGIgPCBudW1CdWZmZXJzUmVxdWVzdGVkOyBiKyspIHsKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90JiBzYiA9IHN0cmVhbUJ1ZmZlcnNbYl07CisgICAgICAgICAgICAvLyBTaW5jZSB0aGlzIG1ldGhvZCBjYW4gcnVuIGNvbmN1cnJlbnRseSB3aXRoIHJlcXVlc3QgdGhyZWFkCisgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHVwZGF0ZSB0aGUgd2FpdCBkdXJhdGlvbiBldmVyeXRpbWUgd2UgY2FsbCBnZXRidWZmZXIKKyAgICAgICAgICAgIG5zZWNzX3Qgd2FpdER1cmF0aW9uID0ga0Jhc2VHZXRCdWZmZXJXYWl0ICsgZ2V0RXhwZWN0ZWRJbkZsaWdodER1cmF0aW9uKCk7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBvdXRwdXRTdHJlYW0tPmdldEJ1ZmZlcigmc2IsIHdhaXREdXJhdGlvbik7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBOT19JTklUIHx8IHJlcyA9PSBERUFEX09CSkVDVCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IENhbid0IGdldCBvdXRwdXQgYnVmZmVyIGZvciBzdHJlYW0gJWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgICAgICBidWZSZXQudmFsLmVycm9yKFN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjo6U1RSRUFNX0RJU0NPTk5FQ1RFRCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCBnZXQgb3V0cHV0IGJ1ZmZlciBmb3Igc3RyZWFtICVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBUSU1FRF9PVVQgfHwgcmVzID09IE5PX01FTU9SWSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmUmV0LnZhbC5lcnJvcihTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I6Ok5PX0JVRkZFUl9BVkFJTEFCTEUpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmUmV0LnZhbC5lcnJvcihTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I6OlVOS05PV05fRVJST1IpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGN1cnJlbnRSZXFTdWNjZWVkcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbnVtQWxsb2NhdGVkQnVmZmVycysrOworCisgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlciA9IHNiLmJ1ZmZlcjsKKyAgICAgICAgICAgIGF1dG8gcGFpciA9IG1JbnRlcmZhY2UtPmdldEJ1ZmZlcklkKCpidWZmZXIsIHN0cmVhbUlkKTsKKyAgICAgICAgICAgIGJvb2wgaXNOZXdCdWZmZXIgPSBwYWlyLmZpcnN0OworICAgICAgICAgICAgdWludDY0X3QgYnVmZmVySWQgPSBwYWlyLnNlY29uZDsKKyAgICAgICAgICAgIFN0cmVhbUJ1ZmZlciYgaEJ1ZiA9IHRtcFJldEJ1ZmZlcnNbYl07CisKKyAgICAgICAgICAgIGhCdWYuc3RyZWFtSWQgPSBzdHJlYW1JZDsKKyAgICAgICAgICAgIGhCdWYuYnVmZmVySWQgPSBidWZmZXJJZDsKKyAgICAgICAgICAgIGhCdWYuYnVmZmVyID0gKGlzTmV3QnVmZmVyKSA/ICpidWZmZXIgOiBudWxscHRyOworICAgICAgICAgICAgaEJ1Zi5zdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok9LOworICAgICAgICAgICAgaEJ1Zi5yZWxlYXNlRmVuY2UgPSBudWxscHRyOworCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmFjcXVpcmVGZW5jZSA9IG51bGxwdHI7CisgICAgICAgICAgICBpZiAoc2IuYWNxdWlyZV9mZW5jZSAhPSAtMSkgeworICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsMCk7CisgICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlLT5kYXRhWzBdID0gc2IuYWNxdWlyZV9mZW5jZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhCdWYuYWNxdWlyZUZlbmNlLnNldFRvKGFjcXVpcmVGZW5jZSwgLypzaG91bGRPd24qL3RydWUpOworICAgICAgICAgICAgaEJ1Zi5yZWxlYXNlRmVuY2UgPSBudWxscHRyOworCisgICAgICAgICAgICByZXMgPSBtSW50ZXJmYWNlLT5wdXNoSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKGJ1ZmZlcklkLCBidWZmZXIsIHN0cmVhbUlkKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbid0IGdldCByZWdpc3RlciByZXF1ZXN0IGJ1ZmZlcnMgZm9yIHN0cmVhbSAlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICBidWZSZXQudmFsLmVycm9yKFN0cmVhbUJ1ZmZlclJlcXVlc3RFcnJvcjo6VU5LTk9XTl9FUlJPUik7CisgICAgICAgICAgICAgICAgY3VycmVudFJlcVN1Y2NlZWRzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBudW1QdXNoZWRJbmZsaWdodEJ1ZmZlcnMrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoY3VycmVudFJlcVN1Y2NlZWRzKSB7CisgICAgICAgICAgICBidWZSZXQudmFsLmJ1ZmZlcnMoc3RkOjptb3ZlKHRtcFJldEJ1ZmZlcnMpKTsKKyAgICAgICAgICAgIG9uZVJlcVN1Y2NlZWRzID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFsbFJlcXNTdWNjZWVkcyA9IGZhbHNlOworICAgICAgICAgICAgZm9yIChzaXplX3QgYiA9IDA7IGIgPCBudW1QdXNoZWRJbmZsaWdodEJ1ZmZlcnM7IGIrKykgeworICAgICAgICAgICAgICAgIFN0cmVhbUJ1ZmZlciYgaEJ1ZiA9IHRtcFJldEJ1ZmZlcnNbYl07CisgICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90KiBidWZmZXI7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gbUludGVyZmFjZS0+cG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKGhCdWYuYnVmZmVySWQsICZidWZmZXIpOworICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgU0VUX0VSUigiJXM6IHBvcEluZmxpZ2h0UmVxdWVzdEJ1ZmZlciBmYWlsZWQgZm9yIHN0cmVhbSAlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChzaXplX3QgYiA9IDA7IGIgPCBudW1BbGxvY2F0ZWRCdWZmZXJzOyBiKyspIHsKKyAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCYgc2IgPSBzdHJlYW1CdWZmZXJzW2JdOworICAgICAgICAgICAgICAgIHNiLmFjcXVpcmVfZmVuY2UgPSAtMTsKKyAgICAgICAgICAgICAgICBzYi5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKHN0cmVhbUJ1ZmZlcnMuZGF0YSgpLCBudW1BbGxvY2F0ZWRCdWZmZXJzLCAwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9oaWRsX2NiKGFsbFJlcXNTdWNjZWVkcyA/IEJ1ZmZlclJlcXVlc3RTdGF0dXM6Ok9LIDoKKyAgICAgICAgICAgIG9uZVJlcVN1Y2NlZWRzID8gQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX1BBUlRJQUwgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfVU5LTk9XTiwKKyAgICAgICAgICAgIGJ1ZlJldHMpOworICAgIG1SZXF1ZXN0QnVmZmVyU00uZW5kUmVxdWVzdEJ1ZmZlcigpOworICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworfQorCitoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYTNEZXZpY2U6OnJldHVyblN0cmVhbUJ1ZmZlcnMoCisgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUJ1ZmZlcj4mIGJ1ZmZlcnMpIHsKKyAgICBpZiAoIW1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVzIGRvZXMgbm90IHN1cHBvcnQgSEFMIGJ1ZmZlciBtYW5hZ2VybWVudCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGJ1ZiA6IGJ1ZmZlcnMpIHsKKyAgICAgICAgaWYgKGJ1Zi5idWZmZXJJZCA9PSBIYWxJbnRlcmZhY2U6OkJVRkZFUl9JRF9OT19CVUZGRVIpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogY2Fubm90IHJldHVybiBhIGJ1ZmZlciB3aXRob3V0IGJ1ZmZlcklkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgYnVmZmVyX2hhbmRsZV90KiBidWZmZXI7CisgICAgICAgIHN0YXR1c190IHJlcyA9IG1JbnRlcmZhY2UtPnBvcEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcihidWYuYnVmZmVySWQsICZidWZmZXIpOworCisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogY2Fubm90IGZpbmQgaW4tZmxpZ2h0IGJ1ZmZlciAlIiBQUkl1NjQgIiBmb3Igc3RyZWFtICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWYuYnVmZmVySWQsIGJ1Zi5zdHJlYW1JZCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90IHN0cmVhbUJ1ZmZlcjsKKyAgICAgICAgc3RyZWFtQnVmZmVyLmJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICAgICAgc3RyZWFtQnVmZmVyLnN0YXR1cyA9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUjsKKyAgICAgICAgc3RyZWFtQnVmZmVyLmFjcXVpcmVfZmVuY2UgPSAtMTsKKyAgICAgICAgc3RyZWFtQnVmZmVyLnJlbGVhc2VfZmVuY2UgPSAtMTsKKworICAgICAgICBpZiAoYnVmLnJlbGVhc2VGZW5jZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBzdHJlYW1CdWZmZXIucmVsZWFzZV9mZW5jZSA9IC0xOworICAgICAgICB9IGVsc2UgaWYgKGJ1Zi5yZWxlYXNlRmVuY2UtPm51bUZkcyA9PSAxKSB7CisgICAgICAgICAgICBzdHJlYW1CdWZmZXIucmVsZWFzZV9mZW5jZSA9IGR1cChidWYucmVsZWFzZUZlbmNlLT5kYXRhWzBdKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCByZWxlYXNlIGZlbmNlLCBmZCBjb3VudCBpcyAlZCwgbm90IDEiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1Zi5yZWxlYXNlRmVuY2UtPm51bUZkcyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChidWYuc3RyZWFtSWQpOworICAgICAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogT3V0cHV0IHN0cmVhbSBpZCAlZCBub3QgZm91bmQhIiwgX19GVU5DVElPTl9fLCBidWYuc3RyZWFtSWQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3RyZWFtQnVmZmVyLnN0cmVhbSA9IHN0cmVhbS0+YXNIYWxTdHJlYW0oKTsKKyAgICAgICAgcmV0dXJuT3V0cHV0QnVmZmVycygmc3RyZWFtQnVmZmVyLCAvKnNpemUqLzEsIC8qdGltZXN0YW1wKi8gMCk7CisgICAgfQorICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworfQorCiBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYTNEZXZpY2U6OnByb2Nlc3NDYXB0dXJlUmVzdWx0XzNfNCgKICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAogICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIHsKQEAgLTk4OCw3ICsxMzA4LDcgQEAKIHZvaWQgQ2FtZXJhM0RldmljZTo6cHJvY2Vzc09uZUNhcHR1cmVSZXN1bHRMb2NrZWQoCiAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlc3VsdCYgcmVzdWx0LAogICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Ci0gICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpQaHlzaWNhbENhbWVyYU1ldGFkYXRhPiBwaHlzaWNhbENhbWVyYU1ldGFkYXRhcykgeworICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6UGh5c2ljYWxDYW1lcmFNZXRhZGF0YT4gcGh5c2ljYWxDYW1lcmFNZXRhZGF0YSkgewogICAgIGNhbWVyYTNfY2FwdHVyZV9yZXN1bHQgcjsKICAgICBzdGF0dXNfdCByZXM7CiAgICAgci5mcmFtZV9udW1iZXIgPSByZXN1bHQuZnJhbWVOdW1iZXI7CkBAIC0xMDA0LDIxICsxMzI0LDIxIEBACiAgICAgci5yZXN1bHQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90Kj4ocmVzdWx0TWV0YWRhdGEuZGF0YSgpKTsKIAogICAgIC8vIFJlYWQgYW5kIHZhbGlkYXRlIHBoeXNpY2FsIGNhbWVyYSBtZXRhZGF0YQotICAgIHNpemVfdCBwaHlzUmVzdWx0Q291bnQgPSBwaHlzaWNhbENhbWVyYU1ldGFkYXRhcy5zaXplKCk7CisgICAgc2l6ZV90IHBoeXNSZXN1bHRDb3VudCA9IHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEuc2l6ZSgpOwogICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBwaHlzQ2FtSWRzKHBoeXNSZXN1bHRDb3VudCk7CiAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKj4gcGh5Q2FtTWV0YWRhdGFzKHBoeXNSZXN1bHRDb3VudCk7CiAgICAgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYW1lcmFNZXRhZGF0YT4gcGh5c1Jlc3VsdE1ldGFkYXRhOwogICAgIHBoeXNSZXN1bHRNZXRhZGF0YS5yZXNpemUocGh5c1Jlc3VsdENvdW50KTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGFzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHJlcyA9IHJlYWRPbmVDYW1lcmFNZXRhZGF0YUxvY2tlZChwaHlzaWNhbENhbWVyYU1ldGFkYXRhc1tpXS5mbXFNZXRhZGF0YVNpemUsCi0gICAgICAgICAgICAgICAgcGh5c1Jlc3VsdE1ldGFkYXRhW2ldLCBwaHlzaWNhbENhbWVyYU1ldGFkYXRhc1tpXS5tZXRhZGF0YSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzaWNhbENhbWVyYU1ldGFkYXRhLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHJlcyA9IHJlYWRPbmVDYW1lcmFNZXRhZGF0YUxvY2tlZChwaHlzaWNhbENhbWVyYU1ldGFkYXRhW2ldLmZtcU1ldGFkYXRhU2l6ZSwKKyAgICAgICAgICAgICAgICBwaHlzUmVzdWx0TWV0YWRhdGFbaV0sIHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGFbaV0ubWV0YWRhdGEpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBGYWlsZWQgdG8gcmVhZCBjYXB0dXJlIHJlc3VsdCBtZXRhZGF0YSBmb3IgY2FtZXJhICVzIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXN1bHQuZnJhbWVOdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGFzW2ldLnBoeXNpY2FsQ2FtZXJhSWQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGFbaV0ucGh5c2ljYWxDYW1lcmFJZC5jX3N0cigpKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBwaHlzQ2FtSWRzW2ldID0gcGh5c2ljYWxDYW1lcmFNZXRhZGF0YXNbaV0ucGh5c2ljYWxDYW1lcmFJZC5jX3N0cigpOworICAgICAgICBwaHlzQ2FtSWRzW2ldID0gcGh5c2ljYWxDYW1lcmFNZXRhZGF0YVtpXS5waHlzaWNhbENhbWVyYUlkLmNfc3RyKCk7CiAgICAgICAgIHBoeUNhbU1ldGFkYXRhc1tpXSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2FtZXJhX21ldGFkYXRhX3QqPigKICAgICAgICAgICAgICAgICBwaHlzUmVzdWx0TWV0YWRhdGFbaV0uZGF0YSgpKTsKICAgICB9CkBAIC0xMDMyLDI3ICsxMzUyLDUxIEBACiAgICAgICAgIGF1dG8mIGJEc3QgPSBvdXRwdXRCdWZmZXJzW2ldOwogICAgICAgICBjb25zdCBTdHJlYW1CdWZmZXIgJmJTcmMgPSByZXN1bHQub3V0cHV0QnVmZmVyc1tpXTsKIAotICAgICAgICBzc2l6ZV90IGlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoYlNyYy5zdHJlYW1JZCk7Ci0gICAgICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KGJTcmMuc3RyZWFtSWQpOworICAgICAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEJ1ZmZlciAlenU6IEludmFsaWQgb3V0cHV0IHN0cmVhbSBpZCAlZCIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0LmZyYW1lTnVtYmVyLCBpLCBiU3JjLnN0cmVhbUlkKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBiRHN0LnN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLnZhbHVlQXQoaWR4KS0+YXNIYWxTdHJlYW0oKTsKKyAgICAgICAgYkRzdC5zdHJlYW0gPSBzdHJlYW0tPmFzSGFsU3RyZWFtKCk7CiAKLSAgICAgICAgYnVmZmVyX2hhbmRsZV90ICpidWZmZXI7Ci0gICAgICAgIHJlcyA9IG1JbnRlcmZhY2UtPnBvcEluZmxpZ2h0QnVmZmVyKHJlc3VsdC5mcmFtZU51bWJlciwgYlNyYy5zdHJlYW1JZCwgJmJ1ZmZlcik7CisgICAgICAgIGJvb2wgbm9CdWZmZXJSZXR1cm5lZCA9IGZhbHNlOworICAgICAgICBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIGlmIChtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICAgICAgLy8gVGhpcyBpcyBzdXNwaWNpb3VzIG1vc3Qgb2YgdGhlIHRpbWUgYnV0IGNhbiBiZSBjb3JyZWN0IGR1cmluZyBmbHVzaCB3aGVyZSBIQUwKKyAgICAgICAgICAgIC8vIGhhcyB0byByZXR1cm4gY2FwdHVyZSByZXN1bHQgYmVmb3JlIGEgYnVmZmVyIGlzIHJlcXVlc3RlZAorICAgICAgICAgICAgaWYgKGJTcmMuYnVmZmVySWQgPT0gSGFsSW50ZXJmYWNlOjpCVUZGRVJfSURfTk9fQlVGRkVSKSB7CisgICAgICAgICAgICAgICAgaWYgKGJTcmMuc3RhdHVzID09IEJ1ZmZlclN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogQnVmZmVyICV6dTogTm8gYnVmZmVySWQgZm9yIHN0cmVhbSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXN1bHQuZnJhbWVOdW1iZXIsIGksIGJTcmMuc3RyZWFtSWQpOworICAgICAgICAgICAgICAgICAgICAvLyBTdGlsbCBwcm9jZWVkcyBzbyBvdGhlciBidWZmZXJzIGNhbiBiZSByZXR1cm5lZAorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBub0J1ZmZlclJldHVybmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChub0J1ZmZlclJldHVybmVkKSB7CisgICAgICAgICAgICAgICAgcmVzID0gT0s7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlcyA9IG1JbnRlcmZhY2UtPnBvcEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcihiU3JjLmJ1ZmZlcklkLCAmYnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IG1JbnRlcmZhY2UtPnBvcEluZmxpZ2h0QnVmZmVyKHJlc3VsdC5mcmFtZU51bWJlciwgYlNyYy5zdHJlYW1JZCwgJmJ1ZmZlcik7CisgICAgICAgIH0KKwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBCdWZmZXIgJXp1OiBObyBpbi1mbGlnaHQgYnVmZmVyIGZvciBzdHJlYW0gJWQiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlciwgaSwgYlNyYy5zdHJlYW1JZCk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KKwogICAgICAgICBiRHN0LmJ1ZmZlciA9IGJ1ZmZlcjsKICAgICAgICAgYkRzdC5zdGF0dXMgPSBtYXBIaWRsQnVmZmVyU3RhdHVzKGJTcmMuc3RhdHVzKTsKICAgICAgICAgYkRzdC5hY3F1aXJlX2ZlbmNlID0gLTE7CiAgICAgICAgIGlmIChiU3JjLnJlbGVhc2VGZW5jZSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICBiRHN0LnJlbGVhc2VfZmVuY2UgPSAtMTsKICAgICAgICAgfSBlbHNlIGlmIChiU3JjLnJlbGVhc2VGZW5jZS0+bnVtRmRzID09IDEpIHsKKyAgICAgICAgICAgIGlmIChub0J1ZmZlclJldHVybmVkKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBnb3QgcmVsZWFzZUZlbmNlIHdpdGhvdXQgb3V0cHV0IGJ1ZmZlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYkRzdC5yZWxlYXNlX2ZlbmNlID0gZHVwKGJTcmMucmVsZWFzZUZlbmNlLT5kYXRhWzBdKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEludmFsaWQgcmVsZWFzZSBmZW5jZSBmb3IgYnVmZmVyICV6dSwgZmQgY291bnQgaXMgJWQsIG5vdCAxIiwKQEAgLTExMjgsMTMgKzE0NzIsMTMgQEAKICAgICAgICAgICAgIG0udHlwZSA9IENBTUVSQTNfTVNHX0VSUk9SOwogICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmZyYW1lX251bWJlciA9IG1zZy5tc2cuZXJyb3IuZnJhbWVOdW1iZXI7CiAgICAgICAgICAgICBpZiAobXNnLm1zZy5lcnJvci5lcnJvclN0cmVhbUlkID49IDApIHsKLSAgICAgICAgICAgICAgICBzc2l6ZV90IGlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkobXNnLm1zZy5lcnJvci5lcnJvclN0cmVhbUlkKTsKLSAgICAgICAgICAgICAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEludmFsaWQgZXJyb3Igc3RyZWFtIGlkICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG0ubWVzc2FnZS5lcnJvci5mcmFtZV9udW1iZXIsIG1zZy5tc2cuZXJyb3IuZXJyb3JTdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KG1zZy5tc2cuZXJyb3IuZXJyb3JTdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEludmFsaWQgZXJyb3Igc3RyZWFtIGlkICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5mcmFtZV9udW1iZXIsIG1zZy5tc2cuZXJyb3IuZXJyb3JTdHJlYW1JZCk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmVycm9yX3N0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLnZhbHVlQXQoaWR4KS0+YXNIYWxTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZXJyb3Jfc3RyZWFtID0gc3RyZWFtLT5hc0hhbFN0cmVhbSgpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZXJyb3Jfc3RyZWFtID0gbnVsbHB0cjsKICAgICAgICAgICAgIH0KQEAgLTEzMTUsNiArMTY1OSw1NiBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6U3RyZWFtU2V0OjphZGQoCisgICAgICAgIGludCBzdHJlYW1JZCwgc3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtKSB7CisgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogY2Fubm90IGFkZCBudWxsIHN0cmVhbSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbURhdGEuYWRkKHN0cmVhbUlkLCBzdHJlYW0pOworfQorCitzc2l6ZV90IENhbWVyYTNEZXZpY2U6OlN0cmVhbVNldDo6cmVtb3ZlKGludCBzdHJlYW1JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbURhdGEucmVtb3ZlSXRlbShzdHJlYW1JZCk7Cit9CisKK3NwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+CitDYW1lcmEzRGV2aWNlOjpTdHJlYW1TZXQ6OmdldChpbnQgc3RyZWFtSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgc3NpemVfdCBpZHggPSBtRGF0YS5pbmRleE9mS2V5KHN0cmVhbUlkKTsKKyAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gbURhdGEuZWRpdFZhbHVlQXQoaWR4KTsKK30KKworc3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4KK0NhbWVyYTNEZXZpY2U6OlN0cmVhbVNldDo6b3BlcmF0b3JbXSAoc2l6ZV90IGluZGV4KSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIHJldHVybiBtRGF0YS5lZGl0VmFsdWVBdChpbmRleCk7Cit9CisKK3NpemVfdCBDYW1lcmEzRGV2aWNlOjpTdHJlYW1TZXQ6OnNpemUoKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIHJldHVybiBtRGF0YS5zaXplKCk7Cit9CisKK3ZvaWQgQ2FtZXJhM0RldmljZTo6U3RyZWFtU2V0OjpjbGVhcigpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1EYXRhLmNsZWFyKCk7Cit9CisKK3N0ZDo6dmVjdG9yPGludD4gQ2FtZXJhM0RldmljZTo6U3RyZWFtU2V0OjpnZXRTdHJlYW1JZHMoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIHN0ZDo6dmVjdG9yPGludD4gc3RyZWFtSWRzKG1EYXRhLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRGF0YS5zaXplKCk7IGkrKykgeworICAgICAgICBzdHJlYW1JZHNbaV0gPSBtRGF0YS5rZXlBdChpKTsKKyAgICB9CisgICAgcmV0dXJuIHN0cmVhbUlkczsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Y3JlYXRlU3RyZWFtKHNwPFN1cmZhY2U+IGNvbnN1bWVyLAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKICAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwKQEAgLTEzOTMsMTggKzE3ODcsMjAgQEAKIAogICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSB7CiAgICAgICAgIHNzaXplX3QgYmxvYkJ1ZmZlclNpemU7Ci0gICAgICAgIGlmIChkYXRhU3BhY2UgIT0gSEFMX0RBVEFTUEFDRV9ERVBUSCkgewotICAgICAgICAgICAgYmxvYkJ1ZmZlclNpemUgPSBnZXRKcGVnQnVmZmVyU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgICAgIGlmIChibG9iQnVmZmVyU2l6ZSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgU0VUX0VSUl9MKCJJbnZhbGlkIGpwZWcgYnVmZmVyIHNpemUgJXpkIiwgYmxvYkJ1ZmZlclNpemUpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChkYXRhU3BhY2UgPT0gSEFMX0RBVEFTUEFDRV9ERVBUSCkgewogICAgICAgICAgICAgYmxvYkJ1ZmZlclNpemUgPSBnZXRQb2ludENsb3VkQnVmZmVyU2l6ZSgpOwogICAgICAgICAgICAgaWYgKGJsb2JCdWZmZXJTaXplIDw9IDApIHsKICAgICAgICAgICAgICAgICBTRVRfRVJSX0woIkludmFsaWQgcG9pbnQgY2xvdWQgYnVmZmVyIHNpemUgJXpkIiwgYmxvYkJ1ZmZlclNpemUpOwogICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoZGF0YVNwYWNlID09IHN0YXRpY19jYXN0PGFuZHJvaWRfZGF0YXNwYWNlPihIQUxfREFUQVNQQUNFX0pQRUdfQVBQX1NFR01FTlRTKSkgeworICAgICAgICAgICAgYmxvYkJ1ZmZlclNpemUgPSB3aWR0aCAqIGhlaWdodDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJsb2JCdWZmZXJTaXplID0gZ2V0SnBlZ0J1ZmZlclNpemUod2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICBpZiAoYmxvYkJ1ZmZlclNpemUgPD0gMCkgeworICAgICAgICAgICAgICAgIFNFVF9FUlJfTCgiSW52YWxpZCBqcGVnIGJ1ZmZlciBzaXplICV6ZCIsIGJsb2JCdWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG5ld1N0cmVhbSA9IG5ldyBDYW1lcmEzT3V0cHV0U3RyZWFtKG1OZXh0U3RyZWFtSWQsIGNvbnN1bWVyc1swXSwKICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBibG9iQnVmZmVyU2l6ZSwgZm9ybWF0LCBkYXRhU3BhY2UsIHJvdGF0aW9uLApAQCAtMTQyMSw3ICsxODE3LDggQEAKICAgICB9IGVsc2UgaWYgKGlzU2hhcmVkKSB7CiAgICAgICAgIG5ld1N0cmVhbSA9IG5ldyBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtKG1OZXh0U3RyZWFtSWQsIGNvbnN1bWVycywKICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGNvbnN1bWVyVXNhZ2UsIGRhdGFTcGFjZSwgcm90YXRpb24sCi0gICAgICAgICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCwgcGh5c2ljYWxDYW1lcmFJZCwgc3RyZWFtU2V0SWQpOworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBPZmZzZXQsIHBoeXNpY2FsQ2FtZXJhSWQsIHN0cmVhbVNldElkLAorICAgICAgICAgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyKTsKICAgICB9IGVsc2UgaWYgKGNvbnN1bWVycy5zaXplKCkgPT0gMCAmJiBoYXNEZWZlcnJlZENvbnN1bWVyKSB7CiAgICAgICAgIG5ld1N0cmVhbSA9IG5ldyBDYW1lcmEzT3V0cHV0U3RyZWFtKG1OZXh0U3RyZWFtSWQsCiAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBjb25zdW1lclVzYWdlLCBkYXRhU3BhY2UsIHJvdGF0aW9uLApAQCAtMTQ5OCwyMCArMTg5NSwyMCBAQAogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIHNzaXplX3QgaWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShpZCk7Ci0gICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChpZCk7CisgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgaXMgdW5rbm93biIsIGlkKTsKLSAgICAgICAgcmV0dXJuIGlkeDsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBzdHJlYW1JbmZvLT53aWR0aCAgPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5nZXRXaWR0aCgpOwotICAgIHN0cmVhbUluZm8tPmhlaWdodCA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmdldEhlaWdodCgpOwotICAgIHN0cmVhbUluZm8tPmZvcm1hdCA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmdldEZvcm1hdCgpOwotICAgIHN0cmVhbUluZm8tPmRhdGFTcGFjZSA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmdldERhdGFTcGFjZSgpOwotICAgIHN0cmVhbUluZm8tPmZvcm1hdE92ZXJyaWRkZW4gPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5pc0Zvcm1hdE92ZXJyaWRkZW4oKTsKLSAgICBzdHJlYW1JbmZvLT5vcmlnaW5hbEZvcm1hdCA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmdldE9yaWdpbmFsRm9ybWF0KCk7Ci0gICAgc3RyZWFtSW5mby0+ZGF0YVNwYWNlT3ZlcnJpZGRlbiA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmlzRGF0YVNwYWNlT3ZlcnJpZGRlbigpOwotICAgIHN0cmVhbUluZm8tPm9yaWdpbmFsRGF0YVNwYWNlID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0T3JpZ2luYWxEYXRhU3BhY2UoKTsKKyAgICBzdHJlYW1JbmZvLT53aWR0aCAgPSBzdHJlYW0tPmdldFdpZHRoKCk7CisgICAgc3RyZWFtSW5mby0+aGVpZ2h0ID0gc3RyZWFtLT5nZXRIZWlnaHQoKTsKKyAgICBzdHJlYW1JbmZvLT5mb3JtYXQgPSBzdHJlYW0tPmdldEZvcm1hdCgpOworICAgIHN0cmVhbUluZm8tPmRhdGFTcGFjZSA9IHN0cmVhbS0+Z2V0RGF0YVNwYWNlKCk7CisgICAgc3RyZWFtSW5mby0+Zm9ybWF0T3ZlcnJpZGRlbiA9IHN0cmVhbS0+aXNGb3JtYXRPdmVycmlkZGVuKCk7CisgICAgc3RyZWFtSW5mby0+b3JpZ2luYWxGb3JtYXQgPSBzdHJlYW0tPmdldE9yaWdpbmFsRm9ybWF0KCk7CisgICAgc3RyZWFtSW5mby0+ZGF0YVNwYWNlT3ZlcnJpZGRlbiA9IHN0cmVhbS0+aXNEYXRhU3BhY2VPdmVycmlkZGVuKCk7CisgICAgc3RyZWFtSW5mby0+b3JpZ2luYWxEYXRhU3BhY2UgPSBzdHJlYW0tPmdldE9yaWdpbmFsRGF0YVNwYWNlKCk7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0xNTM4LDE0ICsxOTM1LDEyIEBACiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgc3NpemVfdCBpZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KGlkKTsKLSAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7Ci0gICAgICAgIENMT0dFKCJTdHJlYW0gJWQgZG9lcyBub3QgZXhpc3QiLAotICAgICAgICAgICAgICAgIGlkKTsKKyAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoaWQpOworICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgeworICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGRvZXMgbm90IGV4aXN0IiwgaWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLQotICAgIHJldHVybiBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChpZHgpLT5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKKyAgICByZXR1cm4gc3RyZWFtLT5zZXRUcmFuc2Zvcm0odHJhbnNmb3JtKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6ZGVsZXRlU3RyZWFtKGludCBpZCkgewpAQCAtMTU3MCwyMSArMTk2NSwyMSBAQAogICAgIH0KIAogICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IGRlbGV0ZWRTdHJlYW07Ci0gICAgc3NpemVfdCBvdXRwdXRTdHJlYW1JZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KGlkKTsKKyAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoaWQpOwogICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gTlVMTCAmJiBpZCA9PSBtSW5wdXRTdHJlYW0tPmdldElkKCkpIHsKICAgICAgICAgZGVsZXRlZFN0cmVhbSA9IG1JbnB1dFN0cmVhbTsKICAgICAgICAgbUlucHV0U3RyZWFtLmNsZWFyKCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG91dHB1dFN0cmVhbUlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgZG9lcyBub3QgZXhpc3QiLCBpZCk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gRGVsZXRlIG91dHB1dCBzdHJlYW0gb3IgdGhlIG91dHB1dCBwYXJ0IG9mIGEgYmktZGlyZWN0aW9uYWwgc3RyZWFtLgotICAgIGlmIChvdXRwdXRTdHJlYW1JZHggIT0gTkFNRV9OT1RfRk9VTkQpIHsKLSAgICAgICAgZGVsZXRlZFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KG91dHB1dFN0cmVhbUlkeCk7Ci0gICAgICAgIG1PdXRwdXRTdHJlYW1zLnJlbW92ZUl0ZW0oaWQpOworICAgIGlmIChzdHJlYW0gIT0gbnVsbHB0cikgeworICAgICAgICBkZWxldGVkU3RyZWFtID0gc3RyZWFtOworICAgICAgICBtT3V0cHV0U3RyZWFtcy5yZW1vdmUoaWQpOwogICAgIH0KIAogICAgIC8vIEZyZWUgdXAgdGhlIHN0cmVhbSBlbmRwb2ludCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGJ5IHNvbWUgb3RoZXIgc3RyZWFtCkBAIC0xNjY3LDcgKzIwNjIsNyBAQAogCiAgICAgaWYgKHRlbXBsYXRlSWQgPD0gMCB8fCB0ZW1wbGF0ZUlkID49IENBTUVSQTNfVEVNUExBVEVfQ09VTlQpIHsKICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlV2l0aEluZm9Mb2coQ2FtZXJhU2VydmljZTo6U05fRVZFTlRfTE9HX0lELCAiMjY4NjYxMTAiLAotICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSwgbnVsbHB0ciwgMCk7CisgICAgICAgICAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKSwgbnVsbHB0ciwgMCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC0xNzc1LDcgKzIxNzAsMTEgQEAKIAogLy8gUGF1c2UgdG8gcmVjb25maWd1cmUKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OmludGVybmFsUGF1c2VBbmRXYWl0TG9ja2VkKG5zZWNzX3QgbWF4RXhwZWN0ZWREdXJhdGlvbikgewotICAgIG1SZXF1ZXN0VGhyZWFkLT5zZXRQYXVzZWQodHJ1ZSk7CisgICAgaWYgKG1SZXF1ZXN0VGhyZWFkLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVJlcXVlc3RUaHJlYWQtPnNldFBhdXNlZCh0cnVlKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CiAKICAgICBBTE9HVigiJXM6IENhbWVyYSAlczogSW50ZXJuYWwgd2FpdCB1bnRpbCBpZGxlICglICIgUFJJaTY0ICIgbnMpIiwgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCksCiAgICAgICAgICAgbWF4RXhwZWN0ZWREdXJhdGlvbik7CkBAIC0xODIxLDYgKzIyMjAsMTQgQEAKIAogICAgIG1TdGF0dXNXYWl0ZXJzKys7CiAKKyAgICBpZiAoIWFjdGl2ZSAmJiBtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICBhdXRvIHN0cmVhbUlkcyA9IG1PdXRwdXRTdHJlYW1zLmdldFN0cmVhbUlkcygpOworICAgICAgICBpZiAobVN0YXR1cyA9PSBTVEFUVVNfQUNUSVZFKSB7CisgICAgICAgICAgICBtUmVxdWVzdFRocmVhZC0+c2lnbmFsUGlwZWxpbmVEcmFpbihzdHJlYW1JZHMpOworICAgICAgICB9CisgICAgICAgIG1SZXF1ZXN0QnVmZmVyU00ub25XYWl0VW50aWxJZGxlKCk7CisgICAgfQorCiAgICAgYm9vbCBzdGF0ZVNlZW4gPSBmYWxzZTsKICAgICBkbyB7CiAgICAgICAgIGlmIChhY3RpdmUgPT0gKG1TdGF0dXMgPT0gU1RBVFVTX0FDVElWRSkpIHsKQEAgLTE5ODAsNiArMjM4NywxMyBAQAogCiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisKKyAgICAgICAgLy8gYi8xMTY1MTQxMDYgImRpc2Nvbm5lY3QoKSIgY2FuIGdldCBjYWxsZWQgdHdpY2UgZm9yIHRoZSBzYW1lIGRldmljZS4gVGhlCisgICAgICAgIC8vIGNhbWVyYSBkZXZpY2Ugd2lsbCBub3QgYmUgaW5pdGlhbGl6ZWQgZHVyaW5nIHRoZSBzZWNvbmQgcnVuLgorICAgICAgICBpZiAobVN0YXR1cyA9PSBTVEFUVVNfVU5JTklUSUFMSVpFRCkgeworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKICAgICAgICAgbVJlcXVlc3RUaHJlYWQtPmNsZWFyKC8qb3V0Ki9mcmFtZU51bWJlcik7CiAgICAgfQogCkBAIC0xOTk2LDE1ICsyNDEwLDEyIEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKLSAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW07Ci0gICAgc3NpemVfdCBvdXRwdXRTdHJlYW1JZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KHN0cmVhbUlkKTsKLSAgICBpZiAob3V0cHV0U3RyZWFtSWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KHN0cmVhbUlkKTsKKyAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBkb2VzIG5vdCBleGlzdCIsIHN0cmVhbUlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChvdXRwdXRTdHJlYW1JZHgpOwotCiAgICAgaWYgKHN0cmVhbS0+aXNVbnByZXBhcmFibGUoKSB8fCBzdHJlYW0tPmhhc091dHN0YW5kaW5nQnVmZmVycygpICkgewogICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGhhcyBhbHJlYWR5IGJlZW4gYSByZXF1ZXN0IHRhcmdldCIsIHN0cmVhbUlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTIwMjQsMTUgKzI0MzUsMTIgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIAotICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbTsKLSAgICBzc2l6ZV90IG91dHB1dFN0cmVhbUlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoc3RyZWFtSWQpOwotICAgIGlmIChvdXRwdXRTdHJlYW1JZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoc3RyZWFtSWQpOworICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGRvZXMgbm90IGV4aXN0Iiwgc3RyZWFtSWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KG91dHB1dFN0cmVhbUlkeCk7Ci0KICAgICBpZiAoc3RyZWFtLT5oYXNPdXRzdGFuZGluZ0J1ZmZlcnMoKSB8fCBtUmVxdWVzdFRocmVhZC0+aXNTdHJlYW1QZW5kaW5nKHN0cmVhbSkpIHsKICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBpcyBhIHRhcmdldCBvZiBhIGluLXByb2dyZXNzIHJlcXVlc3QiLCBzdHJlYW1JZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC0yMDQ4LDE0ICsyNDU2LDExIEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKLSAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW07Ci0gICAgc3NpemVfdCBvdXRwdXRTdHJlYW1JZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KHN0cmVhbUlkKTsKLSAgICBpZiAob3V0cHV0U3RyZWFtSWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KHN0cmVhbUlkKTsKKyAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBkb2VzIG5vdCBleGlzdCIsIHN0cmVhbUlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0KLSAgICBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChvdXRwdXRTdHJlYW1JZHgpOwogICAgIHN0cmVhbS0+YWRkQnVmZmVyTGlzdGVuZXIobGlzdGVuZXIpOwogCiAgICAgcmV0dXJuIE9LOwpAQCAtMjExNCwxMiArMjUxOSwxNCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHNzaXplX3QgaWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShzdHJlYW1JZCk7Ci0gICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChzdHJlYW1JZCk7CisgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgaXMgdW5rbm93biIsIHN0cmVhbUlkKTsKLSAgICAgICAgcmV0dXJuIGlkeDsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXNbaWR4XTsKKworICAgIC8vIGlzQ29uc3VtZXJDb25maWd1cmF0aW9uRGVmZXJyZWQgd2lsbCBiZSBvZmYgYWZ0ZXIgc2V0Q29uc3VtZXJzCisgICAgYm9vbCBpc0RlZmVycmVkID0gc3RyZWFtLT5pc0NvbnN1bWVyQ29uZmlndXJhdGlvbkRlZmVycmVkKCk7CiAgICAgc3RhdHVzX3QgcmVzID0gc3RyZWFtLT5zZXRDb25zdW1lcnMoY29uc3VtZXJzKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgc2V0IGNvbnN1bWVyIGZhaWxlZCAoZXJyb3IgJWQgJXMpICIsIHN0cmVhbUlkLCByZXMsIHN0cmVycm9yKC1yZXMpKTsKQEAgLTIxMzUsNyArMjU0Miw3IEBACiAgICAgICAgIHN1cmZhY2VJZHMtPnB1c2hfYmFjayhpZCk7CiAgICAgfQogCi0gICAgaWYgKHN0cmVhbS0+aXNDb25zdW1lckNvbmZpZ3VyYXRpb25EZWZlcnJlZCgpKSB7CisgICAgaWYgKGlzRGVmZXJyZWQpIHsKICAgICAgICAgaWYgKCFzdHJlYW0tPmlzQ29uZmlndXJpbmcoKSkgewogICAgICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCB3YXMgYWxyZWFkeSBmdWxseSBjb25maWd1cmVkLiIsIHN0cmVhbUlkKTsKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTIxNjQsMTAgKzI1NzEsMTAgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIAotICAgIHNzaXplX3QgaWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShzdHJlYW1JZCk7Ci0gICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChzdHJlYW1JZCk7CisgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgaXMgdW5rbm93biIsIHN0cmVhbUlkKTsKLSAgICAgICAgcmV0dXJuIGlkeDsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBmb3IgKGNvbnN0IGF1dG8gJml0IDogcmVtb3ZlZFN1cmZhY2VJZHMpIHsKQEAgLTIxNzcsNyArMjU4NCw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtc1tpZHhdOwogICAgIHN0YXR1c190IHJlcyA9IHN0cmVhbS0+dXBkYXRlU3RyZWFtKG5ld1N1cmZhY2VzLCBvdXRwdXRJbmZvLCByZW1vdmVkU3VyZmFjZUlkcywgb3V0cHV0TWFwKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgZmFpbGVkIHRvIHVwZGF0ZSBzdHJlYW0gKGVycm9yICVkICVzKSAiLApAQCAtMjE5NiwxMyArMjYwMiwxMSBAQAogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCi0gICAgaW50IGlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoc3RyZWFtSWQpOwotICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoc3RyZWFtSWQpOworICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZCBpcyBub3QgZm91bmQuIiwgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotCi0gICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQoaWR4KTsKICAgICByZXR1cm4gc3RyZWFtLT5kcm9wQnVmZmVycyhkcm9wcGluZyk7CiB9CiAKQEAgLTIyMTMsNyArMjYxNyw2IEBACiBzcDxDYW1lcmEzRGV2aWNlOjpDYXB0dXJlUmVxdWVzdD4gQ2FtZXJhM0RldmljZTo6Y3JlYXRlQ2FwdHVyZVJlcXVlc3QoCiAgICAgICAgIGNvbnN0IFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NMaXN0ICZyZXF1ZXN0LCBjb25zdCBTdXJmYWNlTWFwICZzdXJmYWNlTWFwKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKLSAgICBzdGF0dXNfdCByZXM7CiAKICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gbmV3UmVxdWVzdCA9IG5ldyBDYXB0dXJlUmVxdWVzdDsKICAgICBuZXdSZXF1ZXN0LT5tU2V0dGluZ3NMaXN0ID0gcmVxdWVzdDsKQEAgLTIyMjcsMTkgKzI2MzAsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdHJlYW1zLmRhdGEudThbMF0pOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgLy8gTGF6eSBjb21wbGV0aW9uIG9mIHN0cmVhbSBjb25maWd1cmF0aW9uIChhbGxvY2F0aW9uL3JlZ2lzdHJhdGlvbikKLSAgICAgICAgLy8gb24gZmlyc3QgdXNlCisKICAgICAgICAgaWYgKG1JbnB1dFN0cmVhbS0+aXNDb25maWd1cmluZygpKSB7Ci0gICAgICAgICAgICByZXMgPSBtSW5wdXRTdHJlYW0tPmZpbmlzaENvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBTRVRfRVJSX0woIlVuYWJsZSB0byBmaW5pc2ggY29uZmlndXJpbmcgaW5wdXQgc3RyZWFtICVkOiIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRTdHJlYW0tPmdldElkKCksIHN0cmVycm9yKC1yZXMpLCByZXMpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgU0VUX0VSUl9MKCIlczogaW5wdXQgc3RyZWFtICVkIGlzIG5vdCBjb25maWd1cmVkISIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlucHV0U3RyZWFtLT5nZXRJZCgpKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9Ci0gICAgICAgIC8vIENoZWNrIGlmIHN0cmVhbSBpcyBiZWluZyBwcmVwYXJlZAotICAgICAgICBpZiAobUlucHV0U3RyZWFtLT5pc1ByZXBhcmluZygpKSB7CisgICAgICAgIC8vIENoZWNrIGlmIHN0cmVhbSBwcmVwYXJlIGlzIGJsb2NraW5nIHJlcXVlc3RzLgorICAgICAgICBpZiAobUlucHV0U3RyZWFtLT5pc0Jsb2NrZWRCeVByZXBhcmUoKSkgewogICAgICAgICAgICAgQ0xPR0UoIlJlcXVlc3QgcmVmZXJlbmNlcyBhbiBpbnB1dCBzdHJlYW0gdGhhdCdzIGJlaW5nIHByZXBhcmVkISIpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KQEAgLTIyNTYsMTUgKzI2NTQsMTIgQEAKICAgICB9CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0cmVhbXMuY291bnQ7IGkrKykgewotICAgICAgICBpbnQgaWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShzdHJlYW1zLmRhdGEuaTMyW2ldKTsKLSAgICAgICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoc3RyZWFtcy5kYXRhLmkzMltpXSk7CisgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgQ0xPR0UoIlJlcXVlc3QgcmVmZXJlbmNlcyB1bmtub3duIHN0cmVhbSAlZCIsCi0gICAgICAgICAgICAgICAgICAgIHN0cmVhbXMuZGF0YS51OFtpXSk7CisgICAgICAgICAgICAgICAgICAgIHN0cmVhbXMuZGF0YS5pMzJbaV0pOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtID0KLSAgICAgICAgICAgICAgICBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChpZHgpOwotCiAgICAgICAgIC8vIEl0IGlzIGlsbGVnYWwgdG8gaW5jbHVkZSBhIGRlZmVycmVkIGNvbnN1bWVyIG91dHB1dCBzdHJlYW0gaW50byBhIHJlcXVlc3QKICAgICAgICAgYXV0byBpdGVyID0gc3VyZmFjZU1hcC5maW5kKHN0cmVhbXMuZGF0YS5pMzJbaV0pOwogICAgICAgICBpZiAoaXRlciAhPSBzdXJmYWNlTWFwLmVuZCgpKSB7CkBAIC0yMjc2LDIxICsyNjcxLDE1IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5ld1JlcXVlc3QtPm1PdXRwdXRTdXJmYWNlc1tpXSA9IHN1cmZhY2VzOworICAgICAgICAgICAgbmV3UmVxdWVzdC0+bU91dHB1dFN1cmZhY2VzW3N0cmVhbXMuZGF0YS5pMzJbaV1dID0gc3VyZmFjZXM7CiAgICAgICAgIH0KIAotICAgICAgICAvLyBMYXp5IGNvbXBsZXRpb24gb2Ygc3RyZWFtIGNvbmZpZ3VyYXRpb24gKGFsbG9jYXRpb24vcmVnaXN0cmF0aW9uKQotICAgICAgICAvLyBvbiBmaXJzdCB1c2UKICAgICAgICAgaWYgKHN0cmVhbS0+aXNDb25maWd1cmluZygpKSB7Ci0gICAgICAgICAgICByZXMgPSBzdHJlYW0tPmZpbmlzaENvbmZpZ3VyYXRpb24oKTsKLSAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBTRVRfRVJSX0woIlVuYWJsZSB0byBmaW5pc2ggY29uZmlndXJpbmcgc3RyZWFtICVkOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS0+Z2V0SWQoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBTRVRfRVJSX0woIiVzOiBzdHJlYW0gJWQgaXMgbm90IGNvbmZpZ3VyZWQhIiwgX19GVU5DVElPTl9fLCBzdHJlYW0tPmdldElkKCkpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KLSAgICAgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIGlzIGJlaW5nIHByZXBhcmVkCi0gICAgICAgIGlmIChzdHJlYW0tPmlzUHJlcGFyaW5nKCkpIHsKKyAgICAgICAgLy8gQ2hlY2sgaWYgc3RyZWFtIHByZXBhcmUgaXMgYmxvY2tpbmcgcmVxdWVzdHMuCisgICAgICAgIGlmIChzdHJlYW0tPmlzQmxvY2tlZEJ5UHJlcGFyZSgpKSB7CiAgICAgICAgICAgICBDTE9HRSgiUmVxdWVzdCByZWZlcmVuY2VzIGFuIG91dHB1dCBzdHJlYW0gdGhhdCdzIGJlaW5nIHByZXBhcmVkISIpOwogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KQEAgLTIzMjUsNyArMjcxNCw3IEBACiAgICAgfQogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0U3RyZWFtcy5zaXplKCk7IGkrKykgewotICAgICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBvdXRwdXRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChpKTsKKyAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gb3V0cHV0U3RyZWFtID0gbU91dHB1dFN0cmVhbXNbaV07CiAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0tPmlzQ29uZmlndXJpbmcoKSkgewogICAgICAgICAgICAgcmVzID0gb3V0cHV0U3RyZWFtLT5jYW5jZWxDb25maWd1cmF0aW9uKCk7CiAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CkBAIC0yNDYwLDcgKzI4NDksNyBAQAogICAgICAgICB9CiAKICAgICAgICAgY2FtZXJhM19zdHJlYW1fdCAqb3V0cHV0U3RyZWFtOwotICAgICAgICBvdXRwdXRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChpKS0+c3RhcnRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIG91dHB1dFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zW2ldLT5zdGFydENvbmZpZ3VyYXRpb24oKTsKICAgICAgICAgaWYgKG91dHB1dFN0cmVhbSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBDTE9HRSgiQ2FuJ3Qgc3RhcnQgb3V0cHV0IHN0cmVhbSBjb25maWd1cmF0aW9uIik7CiAgICAgICAgICAgICBjYW5jZWxTdHJlYW1zQ29uZmlndXJhdGlvbkxvY2tlZCgpOwpAQCAtMjQ2OCwxMiArMjg1NywxOSBAQAogICAgICAgICB9CiAgICAgICAgIHN0cmVhbXMuYWRkKG91dHB1dFN0cmVhbSk7CiAKLSAgICAgICAgaWYgKG91dHB1dFN0cmVhbS0+Zm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQiAmJgotICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS0+ZGF0YV9zcGFjZSA9PSBIQUxfREFUQVNQQUNFX1YwX0pGSUYpIHsKKyAgICAgICAgaWYgKG91dHB1dFN0cmVhbS0+Zm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgewogICAgICAgICAgICAgc2l6ZV90IGsgPSBpICsgKChtSW5wdXRTdHJlYW0gIT0gbnVsbHB0cikgPyAxIDogMCk7IC8vIElucHV0IHN0cmVhbSBpZiBwcmVzZW50IHNob3VsZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBvY2N1cHkgdGhlIGluaXRpYWwgZW50cnkuCi0gICAgICAgICAgICBidWZmZXJTaXplc1trXSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PigKLSAgICAgICAgICAgICAgICAgICAgZ2V0SnBlZ0J1ZmZlclNpemUob3V0cHV0U3RyZWFtLT53aWR0aCwgb3V0cHV0U3RyZWFtLT5oZWlnaHQpKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0tPmRhdGFfc3BhY2UgPT0gSEFMX0RBVEFTUEFDRV9WMF9KRklGKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZXNba10gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRKcGVnQnVmZmVyU2l6ZShvdXRwdXRTdHJlYW0tPndpZHRoLCBvdXRwdXRTdHJlYW0tPmhlaWdodCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChvdXRwdXRTdHJlYW0tPmRhdGFfc3BhY2UgPT0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YW5kcm9pZF9kYXRhc3BhY2U+KEhBTF9EQVRBU1BBQ0VfSlBFR19BUFBfU0VHTUVOVFMpKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZXNba10gPSBvdXRwdXRTdHJlYW0tPndpZHRoICogb3V0cHV0U3RyZWFtLT5oZWlnaHQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlczogQmxvYiBkYXRhU3BhY2UgJWQgbm90IHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG91dHB1dFN0cmVhbS0+ZGF0YV9zcGFjZSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI1MDUsNyArMjkwMSw4IEBACiAgICAgLy8gZmFzdGVyCiAKICAgICBpZiAobUlucHV0U3RyZWFtICE9IE5VTEwgJiYgbUlucHV0U3RyZWFtLT5pc0NvbmZpZ3VyaW5nKCkpIHsKLSAgICAgICAgcmVzID0gbUlucHV0U3RyZWFtLT5maW5pc2hDb25maWd1cmF0aW9uKCk7CisgICAgICAgIGJvb2wgc3RyZWFtUmVDb25maWd1cmVkID0gZmFsc2U7CisgICAgICAgIHJlcyA9IG1JbnB1dFN0cmVhbS0+ZmluaXNoQ29uZmlndXJhdGlvbigmc3RyZWFtUmVDb25maWd1cmVkKTsKICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgQ0xPR0UoIkNhbid0IGZpbmlzaCBjb25maWd1cmluZyBpbnB1dCBzdHJlYW0gJWQ6ICVzICglZCkiLAogICAgICAgICAgICAgICAgICAgICBtSW5wdXRTdHJlYW0tPmdldElkKCksIHN0cmVycm9yKC1yZXMpLCByZXMpOwpAQCAtMjUxNSwxMyArMjkxMiwxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQorICAgICAgICBpZiAoc3RyZWFtUmVDb25maWd1cmVkKSB7CisgICAgICAgICAgICBtSW50ZXJmYWNlLT5vblN0cmVhbVJlQ29uZmlndXJlZChtSW5wdXRTdHJlYW0tPmdldElkKCkpOworICAgICAgICB9CiAgICAgfQogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0U3RyZWFtcy5zaXplKCk7IGkrKykgewotICAgICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBvdXRwdXRTdHJlYW0gPQotICAgICAgICAgICAgbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQoaSk7CisgICAgICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IG91dHB1dFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zW2ldOwogICAgICAgICBpZiAob3V0cHV0U3RyZWFtLT5pc0NvbmZpZ3VyaW5nKCkgJiYgIW91dHB1dFN0cmVhbS0+aXNDb25zdW1lckNvbmZpZ3VyYXRpb25EZWZlcnJlZCgpKSB7Ci0gICAgICAgICAgICByZXMgPSBvdXRwdXRTdHJlYW0tPmZpbmlzaENvbmZpZ3VyYXRpb24oKTsKKyAgICAgICAgICAgIGJvb2wgc3RyZWFtUmVDb25maWd1cmVkID0gZmFsc2U7CisgICAgICAgICAgICByZXMgPSBvdXRwdXRTdHJlYW0tPmZpbmlzaENvbmZpZ3VyYXRpb24oJnN0cmVhbVJlQ29uZmlndXJlZCk7CiAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgQ0xPR0UoIkNhbid0IGZpbmlzaCBjb25maWd1cmluZyBvdXRwdXQgc3RyZWFtICVkOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS0+Z2V0SWQoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CkBAIC0yNTMxLDYgKzI5MzEsOSBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0cmVhbVJlQ29uZmlndXJlZCkgeworICAgICAgICAgICAgICAgIG1JbnRlcmZhY2UtPm9uU3RyZWFtUmVDb25maWd1cmVkKG91dHB1dFN0cmVhbS0+Z2V0SWQoKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI1ODIsNiArMjk4NSwxMCBAQAogICAgICAgICByZXR1cm4gcmM7CiAgICAgfQogCisgICAgaWYgKG1EdW1teVN0cmVhbUlkID09IE5PX1NUUkVBTSkgeworICAgICAgICBtUmVxdWVzdEJ1ZmZlclNNLm9uU3RyZWFtc0NvbmZpZ3VyZWQoKTsKKyAgICB9CisKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTI2MjYsMTUgKzMwMzMsMTIgQEAKICAgICAvLyBPaywgaGF2ZSBhIGR1bW15IHN0cmVhbSBhbmQgdGhlcmUncyBhdCBsZWFzdCBvbmUgb3RoZXIgb3V0cHV0IHN0cmVhbSwKICAgICAvLyBzbyByZW1vdmUgdGhlIGR1bW15CiAKLSAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBkZWxldGVkU3RyZWFtOwotICAgIHNzaXplX3Qgb3V0cHV0U3RyZWFtSWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShtRHVtbXlTdHJlYW1JZCk7Ci0gICAgaWYgKG91dHB1dFN0cmVhbUlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IGRlbGV0ZWRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQobUR1bW15U3RyZWFtSWQpOworICAgIGlmIChkZWxldGVkU3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgU0VUX0VSUl9MKCJEdW1teSBzdHJlYW0gJWQgZG9lcyBub3QgYXBwZWFyIHRvIGV4aXN0IiwgbUR1bW15U3RyZWFtSWQpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotCi0gICAgZGVsZXRlZFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KG91dHB1dFN0cmVhbUlkeCk7Ci0gICAgbU91dHB1dFN0cmVhbXMucmVtb3ZlSXRlbXNBdChvdXRwdXRTdHJlYW1JZHgpOworICAgIG1PdXRwdXRTdHJlYW1zLnJlbW92ZShtRHVtbXlTdHJlYW1JZCk7CiAKICAgICAvLyBGcmVlIHVwIHRoZSBzdHJlYW0gZW5kcG9pbnQgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBieSBzb21lIG90aGVyIHN0cmVhbQogICAgIHJlcyA9IGRlbGV0ZWRTdHJlYW0tPmRpc2Nvbm5lY3QoKTsKQEAgLTI3MDgsMTggKzMxMTIsMjEgQEAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OnJlZ2lzdGVySW5GbGlnaHQodWludDMyX3QgZnJhbWVOdW1iZXIsCiAgICAgICAgIGludDMyX3QgbnVtQnVmZmVycywgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXMsIGJvb2wgaGFzSW5wdXQsCiAgICAgICAgIGJvb2wgaGFzQXBwQ2FsbGJhY2ssIG5zZWNzX3QgbWF4RXhwZWN0ZWREdXJhdGlvbiwKLSAgICAgICAgc3RkOjpzZXQ8U3RyaW5nOD4mIHBoeXNpY2FsQ2FtZXJhSWRzKSB7CisgICAgICAgIHN0ZDo6c2V0PFN0cmluZzg+JiBwaHlzaWNhbENhbWVyYUlkcywgYm9vbCBpc1N0aWxsQ2FwdHVyZSwKKyAgICAgICAgYm9vbCBpc1pzbENhcHR1cmUsIGNvbnN0IFN1cmZhY2VNYXAmIG91dHB1dFN1cmZhY2VzKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5GbGlnaHRMb2NrKTsKIAogICAgIHNzaXplX3QgcmVzOwogICAgIHJlcyA9IG1JbkZsaWdodE1hcC5hZGQoZnJhbWVOdW1iZXIsIEluRmxpZ2h0UmVxdWVzdChudW1CdWZmZXJzLCByZXN1bHRFeHRyYXMsIGhhc0lucHV0LAotICAgICAgICAgICAgaGFzQXBwQ2FsbGJhY2ssIG1heEV4cGVjdGVkRHVyYXRpb24sIHBoeXNpY2FsQ2FtZXJhSWRzKSk7CisgICAgICAgICAgICBoYXNBcHBDYWxsYmFjaywgbWF4RXhwZWN0ZWREdXJhdGlvbiwgcGh5c2ljYWxDYW1lcmFJZHMsIGlzU3RpbGxDYXB0dXJlLCBpc1pzbENhcHR1cmUsCisgICAgICAgICAgICBvdXRwdXRTdXJmYWNlcykpOwogICAgIGlmIChyZXMgPCAwKSByZXR1cm4gcmVzOwogCiAgICAgaWYgKG1JbkZsaWdodE1hcC5zaXplKCkgPT0gMSkgewotICAgICAgICAvLyBob2xkIG1Mb2NrIHRvIHByZXZlbnQgcmFjZSB3aXRoIGRpc2Nvbm5lY3QKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICAvLyBIb2xkIGEgc2VwYXJhdGUgZGVkaWNhdGVkIHRyYWNrZXIgbG9jayB0byBwcmV2ZW50IHJhY2Ugd2l0aCBkaXNjb25uZWN0IGFuZCBhbHNvCisgICAgICAgIC8vIGF2b2lkIGEgZGVhZGxvY2sgZHVyaW5nIHJlcHJvY2VzcyByZXF1ZXN0cy4KKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVRyYWNrZXJMb2NrKTsKICAgICAgICAgaWYgKG1TdGF0dXNUcmFja2VyICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgIG1TdGF0dXNUcmFja2VyLT5tYXJrQ29tcG9uZW50QWN0aXZlKG1JbkZsaWdodFN0YXR1c0lkKTsKICAgICAgICAgfQpAQCAtMjczMSwxNiArMzEzOCw2OCBAQAogCiB2b2lkIENhbWVyYTNEZXZpY2U6OnJldHVybk91dHB1dEJ1ZmZlcnMoCiAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90ICpvdXRwdXRCdWZmZXJzLCBzaXplX3QgbnVtQnVmZmVycywKLSAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApIHsKKyAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZywKKyAgICAgICAgY29uc3QgU3VyZmFjZU1hcCYgb3V0cHV0U3VyZmFjZXMsCisgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMgJmluUmVzdWx0RXh0cmFzKSB7CisKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUJ1ZmZlcnM7IGkrKykKICAgICB7Ci0gICAgICAgIENhbWVyYTNTdHJlYW0gKnN0cmVhbSA9IENhbWVyYTNTdHJlYW06OmNhc3Qob3V0cHV0QnVmZmVyc1tpXS5zdHJlYW0pOwotICAgICAgICBzdGF0dXNfdCByZXMgPSBzdHJlYW0tPnJldHVybkJ1ZmZlcihvdXRwdXRCdWZmZXJzW2ldLCB0aW1lc3RhbXApOworICAgICAgICBpZiAob3V0cHV0QnVmZmVyc1tpXS5idWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgaWYgKCFtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICAgICAgICAgIC8vIFdpdGggSEFMIGJ1ZmZlciBtYW5hZ2VtZW50IEFQSSwgSEFMIHNvbWV0aW1lcyB3aWxsIGhhdmUgdG8gcmV0dXJuIGJ1ZmZlcnMgdGhhdAorICAgICAgICAgICAgICAgIC8vIGhhcyBub3QgZ290IGEgb3V0cHV0IGJ1ZmZlciBoYW5kbGUgZmlsbGVkIHlldC4gVGhpcyBpcyB0aG91Z2ggaWxsZWdhbCBpZiBIQUwKKyAgICAgICAgICAgICAgICAvLyBidWZmZXIgbWFuYWdlbWVudCBBUEkgaXMgbm90IGJlaW5nIHVzZWQuCisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgcmV0dXJuIGEgbnVsbCBidWZmZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgQ2FtZXJhM1N0cmVhbUludGVyZmFjZSAqc3RyZWFtID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChvdXRwdXRCdWZmZXJzW2ldLnN0cmVhbSk7CisgICAgICAgIGludCBzdHJlYW1JZCA9IHN0cmVhbS0+Z2V0SWQoKTsKKyAgICAgICAgY29uc3QgYXV0byYgaXQgPSBvdXRwdXRTdXJmYWNlcy5maW5kKHN0cmVhbUlkKTsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgICAgIGlmIChpdCAhPSBvdXRwdXRTdXJmYWNlcy5lbmQoKSkgeworICAgICAgICAgICAgcmVzID0gc3RyZWFtLT5yZXR1cm5CdWZmZXIoCisgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnNbaV0sIHRpbWVzdGFtcCwgdGltZXN0YW1wSW5jcmVhc2luZywgaXQtPnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgaW5SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzID0gc3RyZWFtLT5yZXR1cm5CdWZmZXIoCisgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnNbaV0sIHRpbWVzdGFtcCwgdGltZXN0YW1wSW5jcmVhc2luZywgc3RkOjp2ZWN0b3I8c2l6ZV90PiAoKSwKKyAgICAgICAgICAgICAgICAgICAgaW5SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpOworICAgICAgICB9CisKICAgICAgICAgLy8gTm90ZTogc3RyZWFtIG1heSBiZSBkZWFsbG9jYXRlZCBhdCB0aGlzIHBvaW50LCBpZiB0aGlzIGJ1ZmZlciB3YXMKICAgICAgICAgLy8gdGhlIGxhc3QgcmVmZXJlbmNlIHRvIGl0LgotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQ2FuJ3QgcmV0dXJuIGJ1ZmZlciB0byBpdHMgc3RyZWFtOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgaWYgKHJlcyA9PSBOT19JTklUIHx8IHJlcyA9PSBERUFEX09CSkVDVCkgeworICAgICAgICAgICAgQUxPR1YoIkNhbid0IHJldHVybiBidWZmZXIgdG8gaXRzIHN0cmVhbTogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICB9IGVsc2UgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkNhbid0IHJldHVybiBidWZmZXIgdG8gaXRzIHN0cmVhbTogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTG9uZyBwcm9jZXNzaW5nIGNvbnN1bWVycyBjYW4gY2F1c2UgcmV0dXJuQnVmZmVyIHRpbWVvdXQgZm9yIHNoYXJlZCBzdHJlYW0KKyAgICAgICAgLy8gSWYgdGhhdCBoYXBwZW5zLCBjYW5jZWwgdGhlIGJ1ZmZlciBhbmQgc2VuZCBhIGJ1ZmZlciBlcnJvciB0byBjbGllbnQKKyAgICAgICAgaWYgKGl0ICE9IG91dHB1dFN1cmZhY2VzLmVuZCgpICYmIHJlcyA9PSBUSU1FRF9PVVQgJiYKKyAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJzW2ldLnN0YXR1cyA9PSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfT0spIHsKKyAgICAgICAgICAgIC8vIGNhbmNlbCB0aGUgYnVmZmVyCisgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCBzYiA9IG91dHB1dEJ1ZmZlcnNbaV07CisgICAgICAgICAgICBzYi5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7CisgICAgICAgICAgICBzdHJlYW0tPnJldHVybkJ1ZmZlcihzYiwgLyp0aW1lc3RhbXAqLzAsIHRpbWVzdGFtcEluY3JlYXNpbmcsIHN0ZDo6dmVjdG9yPHNpemVfdD4gKCksCisgICAgICAgICAgICAgICAgICAgIGluUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKTsKKworICAgICAgICAgICAgLy8gbm90aWZ5IGNsaWVudCBidWZmZXIgZXJyb3IKKyAgICAgICAgICAgIHNwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcjsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtT3V0cHV0TG9jayk7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgZXh0cmFzID0gaW5SZXN1bHRFeHRyYXM7CisgICAgICAgICAgICAgICAgZXh0cmFzLmVycm9yU3RyZWFtSWQgPSBzdHJlYW1JZDsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci0+bm90aWZ5RXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhcyk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0yNzUyLDggKzMyMTEsMTAgQEAKIAogICAgIC8vIEluZGljYXRlIGlkbGUgaW5GbGlnaHRNYXAgdG8gdGhlIHN0YXR1cyB0cmFja2VyCiAgICAgaWYgKG1JbkZsaWdodE1hcC5zaXplKCkgPT0gMCkgewotICAgICAgICAvLyBob2xkIG1Mb2NrIHRvIHByZXZlbnQgcmFjZSB3aXRoIGRpc2Nvbm5lY3QKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICBtUmVxdWVzdEJ1ZmZlclNNLm9uSW5mbGlnaHRNYXBFbXB0eSgpOworICAgICAgICAvLyBIb2xkIGEgc2VwYXJhdGUgZGVkaWNhdGVkIHRyYWNrZXIgbG9jayB0byBwcmV2ZW50IHJhY2Ugd2l0aCBkaXNjb25uZWN0IGFuZCBhbHNvCisgICAgICAgIC8vIGF2b2lkIGEgZGVhZGxvY2sgZHVyaW5nIHJlcHJvY2VzcyByZXF1ZXN0cy4KKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVRyYWNrZXJMb2NrKTsKICAgICAgICAgaWYgKG1TdGF0dXNUcmFja2VyICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgIG1TdGF0dXNUcmFja2VyLT5tYXJrQ29tcG9uZW50SWRsZShtSW5GbGlnaHRTdGF0dXNJZCwgRmVuY2U6Ok5PX0ZFTkNFKTsKICAgICAgICAgfQpAQCAtMjc3OCw2ICszMjM5LDEwIEBACiAgICAgaWYgKHJlcXVlc3QubnVtQnVmZmVyc0xlZnQgPT0gMCAmJgogICAgICAgICAgICAgKHJlcXVlc3Quc2tpcFJlc3VsdE1ldGFkYXRhIHx8CiAgICAgICAgICAgICAocmVxdWVzdC5oYXZlUmVzdWx0TWV0YWRhdGEgJiYgc2h1dHRlclRpbWVzdGFtcCAhPSAwKSkpIHsKKyAgICAgICAgaWYgKHJlcXVlc3Quc3RpbGxDYXB0dXJlKSB7CisgICAgICAgICAgICBBVFJBQ0VfQVNZTkNfRU5EKCJzdGlsbCBjYXB0dXJlIiwgZnJhbWVOdW1iZXIpOworICAgICAgICB9CisKICAgICAgICAgQVRSQUNFX0FTWU5DX0VORCgiZnJhbWUgY2FwdHVyZSIsIGZyYW1lTnVtYmVyKTsKIAogICAgICAgICAvLyBTYW5pdHkgY2hlY2sgLSBpZiBzZW5zb3IgdGltZXN0YW1wIG1hdGNoZXMgc2h1dHRlciB0aW1lc3RhbXAgaW4gdGhlCkBAIC0yNzk0LDcgKzMyNTksOCBAQAogICAgICAgICBhc3NlcnQocmVxdWVzdC5yZXF1ZXN0U3RhdHVzICE9IE9LIHx8CiAgICAgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSA9PSAwKTsKICAgICAgICAgcmV0dXJuT3V0cHV0QnVmZmVycyhyZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLmFycmF5KCksCi0gICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwgMCk7CisgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwgMCwgLyp0aW1lc3RhbXBJbmNyZWFzaW5nKi90cnVlLAorICAgICAgICAgICAgcmVxdWVzdC5vdXRwdXRTdXJmYWNlcywgcmVxdWVzdC5yZXN1bHRFeHRyYXMpOwogCiAgICAgICAgIHJlbW92ZUluRmxpZ2h0TWFwRW50cnlMb2NrZWQoaWR4KTsKICAgICAgICAgQUxPR1ZWKCIlczogcmVtb3ZlZCBmcmFtZSAlZCBmcm9tIEluRmxpZ2h0TWFwIiwgX19GVU5DVElPTl9fLCBmcmFtZU51bWJlcik7CkBAIC0yODE4LDcgKzMyODQsOSBAQAogICAgICAgICBmb3IgKHNpemVfdCBpZHggPSAwOyBpZHggPCBtSW5GbGlnaHRNYXAuc2l6ZSgpOyBpZHgrKykgewogICAgICAgICAgICAgY29uc3QgSW5GbGlnaHRSZXF1ZXN0ICZyZXF1ZXN0ID0gbUluRmxpZ2h0TWFwLnZhbHVlQXQoaWR4KTsKICAgICAgICAgICAgIHJldHVybk91dHB1dEJ1ZmZlcnMocmVxdWVzdC5wZW5kaW5nT3V0cHV0QnVmZmVycy5hcnJheSgpLAotICAgICAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuc2l6ZSgpLCAwKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwgMCwKKyAgICAgICAgICAgICAgICAvKnRpbWVzdGFtcEluY3JlYXNpbmcqL3RydWUsIHJlcXVlc3Qub3V0cHV0U3VyZmFjZXMsCisgICAgICAgICAgICAgICAgcmVxdWVzdC5yZXN1bHRFeHRyYXMpOwogICAgICAgICB9CiAgICAgICAgIG1JbkZsaWdodE1hcC5jbGVhcigpOwogICAgICAgICBtRXhwZWN0ZWRJbmZsaWdodER1cmF0aW9uID0gMDsKQEAgLTI4MjgsNyArMzI5NiwxNSBAQAogICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4gaW5mbGlnaHRLZXlzOwogICAgIG1JbnRlcmZhY2UtPmdldEluZmxpZ2h0QnVmZmVyS2V5cygmaW5mbGlnaHRLZXlzKTsKIAotICAgIGludDMyX3QgaW5wdXRTdHJlYW1JZCA9IChtSW5wdXRTdHJlYW0gIT0gbnVsbHB0cikgPyBtSW5wdXRTdHJlYW0tPmdldElkKCkgOiAtMTsKKyAgICAvLyBJbmZsaWdodCBidWZmZXJzIGZvciBIQUwgYnVmZmVyIG1hbmFnZXIKKyAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gaW5mbGlnaHRSZXF1ZXN0QnVmZmVyS2V5czsKKyAgICBtSW50ZXJmYWNlLT5nZXRJbmZsaWdodFJlcXVlc3RCdWZmZXJLZXlzKCZpbmZsaWdodFJlcXVlc3RCdWZmZXJLZXlzKTsKKworICAgIC8vIChzdHJlYW1JZCwgZnJhbWVOdW1iZXIsIGJ1ZmZlcl9oYW5kbGVfdCopIHR1cGxlIGZvciBhbGwgaW5mbGlnaHQgYnVmZmVycy4KKyAgICAvLyBmcmFtZU51bWJlciB3aWxsIGJlIC0xIGZvciBidWZmZXJzIGZyb20gSEFMIGJ1ZmZlciBtYW5hZ2VyCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxpbnQzMl90LCBpbnQzMl90LCBidWZmZXJfaGFuZGxlX3QqPj4gaW5mbGlnaHRCdWZmZXJzOworICAgIGluZmxpZ2h0QnVmZmVycy5yZXNlcnZlKGluZmxpZ2h0S2V5cy5zaXplKCkgKyBpbmZsaWdodFJlcXVlc3RCdWZmZXJLZXlzLnNpemUoKSk7CisKICAgICBmb3IgKGF1dG8mIHBhaXIgOiBpbmZsaWdodEtleXMpIHsKICAgICAgICAgaW50MzJfdCBmcmFtZU51bWJlciA9IHBhaXIuZmlyc3Q7CiAgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSBwYWlyLnNlY29uZDsKQEAgLTI4MzksNiArMzMxNSwyNiBAQAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGZyYW1lTnVtYmVyLCBzdHJlYW1JZCk7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQorICAgICAgICBpbmZsaWdodEJ1ZmZlcnMucHVzaF9iYWNrKHN0ZDo6bWFrZV90dXBsZShzdHJlYW1JZCwgZnJhbWVOdW1iZXIsIGJ1ZmZlcikpOworICAgIH0KKworICAgIGZvciAoYXV0byYgYnVmZmVySWQgOiBpbmZsaWdodFJlcXVlc3RCdWZmZXJLZXlzKSB7CisgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSAtMTsKKyAgICAgICAgYnVmZmVyX2hhbmRsZV90KiBidWZmZXIgPSBudWxscHRyOworICAgICAgICBzdGF0dXNfdCByZXMgPSBtSW50ZXJmYWNlLT5wb3BJbmZsaWdodFJlcXVlc3RCdWZmZXIoYnVmZmVySWQsICZidWZmZXIsICZzdHJlYW1JZCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogY2Fubm90IGZpbmQgaW4tZmxpZ2h0IGJ1ZmZlciAlIiBQUkl1NjQsIF9fRlVOQ1RJT05fXywgYnVmZmVySWQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaW5mbGlnaHRCdWZmZXJzLnB1c2hfYmFjayhzdGQ6Om1ha2VfdHVwbGUoc3RyZWFtSWQsIC8qZnJhbWVOdW1iZXIqLy0xLCBidWZmZXIpKTsKKyAgICB9CisKKyAgICBpbnQzMl90IGlucHV0U3RyZWFtSWQgPSAobUlucHV0U3RyZWFtICE9IG51bGxwdHIpID8gbUlucHV0U3RyZWFtLT5nZXRJZCgpIDogLTE7CisgICAgZm9yIChhdXRvJiB0dXBsZSA6IGluZmxpZ2h0QnVmZmVycykgeworICAgICAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICAgICAgaW50MzJfdCBzdHJlYW1JZCA9IHN0ZDo6Z2V0PDA+KHR1cGxlKTsKKyAgICAgICAgaW50MzJfdCBmcmFtZU51bWJlciA9IHN0ZDo6Z2V0PDE+KHR1cGxlKTsKKyAgICAgICAgYnVmZmVyX2hhbmRsZV90KiBidWZmZXIgPSBzdGQ6OmdldDwyPih0dXBsZSk7CiAKICAgICAgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3Qgc3RyZWFtQnVmZmVyOwogICAgICAgICBzdHJlYW1CdWZmZXIuYnVmZmVyID0gYnVmZmVyOwpAQCAtMjg1Niw3ICszMzUyLDggQEAKICAgICAgICAgICAgICAgICBzdHJlYW1CdWZmZXIuc3RyZWFtID0gaGFsU3RyZWFtOwogICAgICAgICAgICAgICAgIHN3aXRjaCAoaGFsU3RyZWFtLT5zdHJlYW1fdHlwZSkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIENBTUVSQTNfU1RSRUFNX09VVFBVVDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHN0cmVhbS0+cmV0dXJuQnVmZmVyKHN0cmVhbUJ1ZmZlciwgLyp0aW1lc3RhbXAqLyAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IHN0cmVhbS0+cmV0dXJuQnVmZmVyKHN0cmVhbUJ1ZmZlciwgLyp0aW1lc3RhbXAqLyAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnRpbWVzdGFtcEluY3JlYXNpbmcqL3RydWUsIHN0ZDo6dmVjdG9yPHNpemVfdD4gKCksIGZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbid0IHJldHVybiBvdXRwdXQgYnVmZmVyIGZvciBmcmFtZSAlZCB0byIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHN0cmVhbSAlZDogJXMgKCVkKSIsICBfX0ZVTkNUSU9OX18sCkBAIC0yODkzLDEyICszMzkwLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIsIHN0cmVhbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNzaXplX3QgaWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShzdHJlYW1JZCk7Ci0gICAgICAgICAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoc3RyZWFtSWQpOworICAgICAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBPdXRwdXQgc3RyZWFtIGlkICVkIG5vdCBmb3VuZCEiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0cmVhbUJ1ZmZlci5zdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy52YWx1ZUF0KGlkeCktPmFzSGFsU3RyZWFtKCk7CisgICAgICAgICAgICBzdHJlYW1CdWZmZXIuc3RyZWFtID0gc3RyZWFtLT5hc0hhbFN0cmVhbSgpOwogICAgICAgICAgICAgcmV0dXJuT3V0cHV0QnVmZmVycygmc3RyZWFtQnVmZmVyLCAvKnNpemUqLzEsIC8qdGltZXN0YW1wKi8gMCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0yOTI0LDYgKzM0MjEsMTQgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIC8vIFVwZGF0ZSB2ZW5kb3IgdGFnIGlkIGZvciBwaHlzaWNhbCBtZXRhZGF0YQorICAgIGZvciAoYXV0byYgcGh5c2ljYWxNZXRhZGF0YSA6IHJlc3VsdC0+bVBoeXNpY2FsTWV0YWRhdGFzKSB7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90ICpwbWV0YSA9IGNvbnN0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QgKj4oCisgICAgICAgICAgICAgICAgcGh5c2ljYWxNZXRhZGF0YS5tUGh5c2ljYWxDYW1lcmFNZXRhZGF0YS5nZXRBbmRMb2NrKCkpOworICAgICAgICBzZXRfY2FtZXJhX21ldGFkYXRhX3ZlbmRvcl9pZChwbWV0YSwgbVZlbmRvclRhZ0lkKTsKKyAgICAgICAgcGh5c2ljYWxNZXRhZGF0YS5tUGh5c2ljYWxDYW1lcmFNZXRhZGF0YS51bmxvY2socG1ldGEpOworICAgIH0KKwogICAgIC8vIFZhbGlkIHJlc3VsdCwgaW5zZXJ0IGludG8gcXVldWUKICAgICBMaXN0PENhcHR1cmVSZXN1bHQ+OjppdGVyYXRvciBxdWV1ZWRSZXN1bHQgPQogICAgICAgICAgICAgbVJlc3VsdFF1ZXVlLmluc2VydChtUmVzdWx0UXVldWUuZW5kKCksIENhcHR1cmVSZXN1bHQoKnJlc3VsdCkpOwpAQCAtMjk0Niw2ICszNDUxLDEzIEBACiAgICAgY2FwdHVyZVJlc3VsdC5tUmVzdWx0RXh0cmFzID0gcmVzdWx0RXh0cmFzOwogICAgIGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhID0gcGFydGlhbFJlc3VsdDsKIAorICAgIC8vIEZpeCB1cCByZXN1bHQgbWV0YWRhdGEgZm9yIG1vbm9jaHJvbWUgY2FtZXJhLgorICAgIHN0YXR1c190IHJlcyA9IGZpeHVwTW9ub2Nocm9tZVRhZ3MobURldmljZUluZm8sIGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIFNFVF9FUlIoIkZhaWxlZCB0byBvdmVycmlkZSByZXN1bHQgbWV0YWRhdGE6ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIGluc2VydFJlc3VsdExvY2tlZCgmY2FwdHVyZVJlc3VsdCwgZnJhbWVOdW1iZXIpOwogfQogCkBAIC0yOTU0LDcgKzM0NjYsNyBAQAogICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzICZyZXN1bHRFeHRyYXMsCiAgICAgICAgIENhbWVyYU1ldGFkYXRhICZjb2xsZWN0ZWRQYXJ0aWFsUmVzdWx0LAogICAgICAgICB1aW50MzJfdCBmcmFtZU51bWJlciwKLSAgICAgICAgYm9vbCByZXByb2Nlc3MsCisgICAgICAgIGJvb2wgcmVwcm9jZXNzLCBib29sIHpzbFN0aWxsQ2FwdHVyZSwKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4mIHBoeXNpY2FsTWV0YWRhdGFzKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAocGVuZGluZ01ldGFkYXRhLmlzRW1wdHkoKSkKQEAgLTI5NzEsNiArMzQ4MywxNCBAQAogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgICAgIG1OZXh0UmVwcm9jZXNzUmVzdWx0RnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlciArIDE7CisgICAgfSBlbHNlIGlmICh6c2xTdGlsbENhcHR1cmUpIHsKKyAgICAgICAgaWYgKGZyYW1lTnVtYmVyIDwgbU5leHRac2xTdGlsbFJlc3VsdEZyYW1lTnVtYmVyKSB7CisgICAgICAgICAgICBTRVRfRVJSKCJPdXQtb2Ytb3JkZXIgWlNMIHN0aWxsIGNhcHR1cmUgcmVzdWx0IG1ldGFkYXRhIHN1Ym1pdHRlZCEgIgorICAgICAgICAgICAgICAgICIoZ290IGZyYW1lIG51bWJlciAlZCwgZXhwZWN0aW5nICVkKSIsCisgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIsIG1OZXh0WnNsU3RpbGxSZXN1bHRGcmFtZU51bWJlcik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbU5leHRac2xTdGlsbFJlc3VsdEZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXIgKyAxOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChmcmFtZU51bWJlciA8IG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIpIHsKICAgICAgICAgICAgIFNFVF9FUlIoIk91dC1vZi1vcmRlciBjYXB0dXJlIHJlc3VsdCBtZXRhZGF0YSBzdWJtaXR0ZWQhICIKQEAgLTMwMTEsMTUgKzM1MzEsNTEgQEAKICAgICB9CiAKICAgICAvLyBGaXggdXAgc29tZSByZXN1bHQgbWV0YWRhdGEgdG8gYWNjb3VudCBmb3IgSEFMLWxldmVsIGRpc3RvcnRpb24gY29ycmVjdGlvbgotICAgIHN0YXR1c190IHJlcyA9IG1EaXN0b3J0aW9uTWFwcGVyLmNvcnJlY3RDYXB0dXJlUmVzdWx0KCZjYXB0dXJlUmVzdWx0Lm1NZXRhZGF0YSk7CisgICAgc3RhdHVzX3QgcmVzID0KKyAgICAgICAgICAgIG1EaXN0b3J0aW9uTWFwcGVyc1ttSWQuY19zdHIoKV0uY29ycmVjdENhcHR1cmVSZXN1bHQoJmNhcHR1cmVSZXN1bHQubU1ldGFkYXRhKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIFNFVF9FUlIoIlVuYWJsZSB0byBjb3JyZWN0IGNhcHR1cmUgcmVzdWx0IG1ldGFkYXRhIGZvciBmcmFtZSAlZDogJXMgKCVkKSIsCiAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIsIHN0cmVycm9yKHJlcyksIHJlcyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CisgICAgZm9yIChhdXRvJiBwaHlzaWNhbE1ldGFkYXRhIDogY2FwdHVyZVJlc3VsdC5tUGh5c2ljYWxNZXRhZGF0YXMpIHsKKyAgICAgICAgU3RyaW5nOCBjYW1lcmFJZDgocGh5c2ljYWxNZXRhZGF0YS5tUGh5c2ljYWxDYW1lcmFJZCk7CisgICAgICAgIGlmIChtRGlzdG9ydGlvbk1hcHBlcnMuZmluZChjYW1lcmFJZDguY19zdHIoKSkgPT0gbURpc3RvcnRpb25NYXBwZXJzLmVuZCgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICByZXMgPSBtRGlzdG9ydGlvbk1hcHBlcnNbY2FtZXJhSWQ4LmNfc3RyKCldLmNvcnJlY3RDYXB0dXJlUmVzdWx0KAorICAgICAgICAgICAgICAgICZwaHlzaWNhbE1ldGFkYXRhLm1QaHlzaWNhbENhbWVyYU1ldGFkYXRhKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgU0VUX0VSUigiVW5hYmxlIHRvIGNvcnJlY3QgcGh5c2ljYWwgY2FwdHVyZSByZXN1bHQgbWV0YWRhdGEgZm9yIGZyYW1lICVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVOdW1iZXIsIHN0cmVycm9yKHJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CiAKKyAgICAvLyBGaXggdXAgcmVzdWx0IG1ldGFkYXRhIGZvciBtb25vY2hyb21lIGNhbWVyYS4KKyAgICByZXMgPSBmaXh1cE1vbm9jaHJvbWVUYWdzKG1EZXZpY2VJbmZvLCBjYXB0dXJlUmVzdWx0Lm1NZXRhZGF0YSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBTRVRfRVJSKCJGYWlsZWQgdG8gb3ZlcnJpZGUgcmVzdWx0IG1ldGFkYXRhOiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvJiBwaHlzaWNhbE1ldGFkYXRhIDogY2FwdHVyZVJlc3VsdC5tUGh5c2ljYWxNZXRhZGF0YXMpIHsKKyAgICAgICAgU3RyaW5nOCBjYW1lcmFJZDgocGh5c2ljYWxNZXRhZGF0YS5tUGh5c2ljYWxDYW1lcmFJZCk7CisgICAgICAgIHJlcyA9IGZpeHVwTW9ub2Nocm9tZVRhZ3MobVBoeXNpY2FsRGV2aWNlSW5mb01hcC5hdChjYW1lcmFJZDguY19zdHIoKSksCisgICAgICAgICAgICAgICAgcGh5c2ljYWxNZXRhZGF0YS5tUGh5c2ljYWxDYW1lcmFNZXRhZGF0YSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIFNFVF9FUlIoIkZhaWxlZCB0byBvdmVycmlkZSByZXN1bHQgbWV0YWRhdGE6ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgQ2FtZXJhTWV0YWRhdGE+IG1vbml0b3JlZFBoeXNpY2FsTWV0YWRhdGE7CisgICAgZm9yIChhdXRvJiBtIDogcGh5c2ljYWxNZXRhZGF0YXMpIHsKKyAgICAgICAgbW9uaXRvcmVkUGh5c2ljYWxNZXRhZGF0YS5lbXBsYWNlKFN0cmluZzgobS5tUGh5c2ljYWxDYW1lcmFJZCkuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEobS5tUGh5c2ljYWxDYW1lcmFNZXRhZGF0YSkpOworICAgIH0KICAgICBtVGFnTW9uaXRvci5tb25pdG9yTWV0YWRhdGEoVGFnTW9uaXRvcjo6UkVTVUxULAotICAgICAgICAgICAgZnJhbWVOdW1iZXIsIHRpbWVzdGFtcC5kYXRhLmk2NFswXSwgY2FwdHVyZVJlc3VsdC5tTWV0YWRhdGEpOworICAgICAgICAgICAgZnJhbWVOdW1iZXIsIHRpbWVzdGFtcC5kYXRhLmk2NFswXSwgY2FwdHVyZVJlc3VsdC5tTWV0YWRhdGEsCisgICAgICAgICAgICBtb25pdG9yZWRQaHlzaWNhbE1ldGFkYXRhKTsKIAogICAgIGluc2VydFJlc3VsdExvY2tlZCgmY2FwdHVyZVJlc3VsdCwgZnJhbWVOdW1iZXIpOwogfQpAQCAtMzE3NCw4ICszNzMwLDEwIEBACiAgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLmFwcGVuZEFycmF5KHJlc3VsdC0+b3V0cHV0X2J1ZmZlcnMsCiAgICAgICAgICAgICAgICAgcmVzdWx0LT5udW1fb3V0cHV0X2J1ZmZlcnMpOwogICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nID0gIShyZXF1ZXN0LnpzbENhcHR1cmUgfHwgcmVxdWVzdC5oYXNJbnB1dEJ1ZmZlcik7CiAgICAgICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKHJlc3VsdC0+b3V0cHV0X2J1ZmZlcnMsCi0gICAgICAgICAgICAgICAgcmVzdWx0LT5udW1fb3V0cHV0X2J1ZmZlcnMsIHNodXR0ZXJUaW1lc3RhbXApOworICAgICAgICAgICAgICAgIHJlc3VsdC0+bnVtX291dHB1dF9idWZmZXJzLCBzaHV0dGVyVGltZXN0YW1wLCB0aW1lc3RhbXBJbmNyZWFzaW5nLAorICAgICAgICAgICAgICAgIHJlcXVlc3Qub3V0cHV0U3VyZmFjZXMsIHJlcXVlc3QucmVzdWx0RXh0cmFzKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChyZXN1bHQtPnJlc3VsdCAhPSBOVUxMICYmICFpc1BhcnRpYWxSZXN1bHQpIHsKQEAgLTMxODgsMTIgKzM3NDYsMTMgQEAKICAgICAgICAgICAgIGlmIChzaHV0dGVyVGltZXN0YW1wID09IDApIHsKICAgICAgICAgICAgICAgICByZXF1ZXN0LnBlbmRpbmdNZXRhZGF0YSA9IHJlc3VsdC0+cmVzdWx0OwogICAgICAgICAgICAgICAgIHJlcXVlc3QuY29sbGVjdGVkUGFydGlhbFJlc3VsdCA9IGNvbGxlY3RlZFBhcnRpYWxSZXN1bHQ7Ci0gICAgICAgICAgIH0gZWxzZSBpZiAocmVxdWVzdC5oYXNDYWxsYmFjaykgeworICAgICAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0Lmhhc0NhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGE7CiAgICAgICAgICAgICAgICAgbWV0YWRhdGEgPSByZXN1bHQtPnJlc3VsdDsKICAgICAgICAgICAgICAgICBzZW5kQ2FwdHVyZVJlc3VsdChtZXRhZGF0YSwgcmVxdWVzdC5yZXN1bHRFeHRyYXMsCiAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3RlZFBhcnRpYWxSZXN1bHQsIGZyYW1lTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICBoYXNJbnB1dEJ1ZmZlckluUmVxdWVzdCwgcmVxdWVzdC5waHlzaWNhbE1ldGFkYXRhcyk7CisgICAgICAgICAgICAgICAgICAgIGhhc0lucHV0QnVmZmVySW5SZXF1ZXN0LCByZXF1ZXN0LnpzbENhcHR1cmUgJiYgcmVxdWVzdC5zdGlsbENhcHR1cmUsCisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QucGh5c2ljYWxNZXRhZGF0YXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKQEAgLTMyNzMsMTAgKzM4MzIsMTIgQEAKICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfSU5WQUxJRF9FUlJPUjsKIAogICAgIGludCBzdHJlYW1JZCA9IDA7CisgICAgU3RyaW5nMTYgcGh5c2ljYWxDYW1lcmFJZDsKICAgICBpZiAobXNnLmVycm9yX3N0cmVhbSAhPSBOVUxMKSB7CiAgICAgICAgIENhbWVyYTNTdHJlYW0gKnN0cmVhbSA9CiAgICAgICAgICAgICAgICAgQ2FtZXJhM1N0cmVhbTo6Y2FzdChtc2cuZXJyb3Jfc3RyZWFtKTsKICAgICAgICAgc3RyZWFtSWQgPSBzdHJlYW0tPmdldElkKCk7CisgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQgPSBTdHJpbmcxNihzdHJlYW0tPnBoeXNpY2FsQ2FtZXJhSWQoKSk7CiAgICAgfQogICAgIEFMT0dWKCJDYW1lcmEgJXM6ICVzOiBIQUwgZXJyb3IsIGZyYW1lICVkLCBzdHJlYW0gJWQ6ICVkIiwKICAgICAgICAgICAgIG1JZC5zdHJpbmcoKSwgX19GVU5DVElPTl9fLCBtc2cuZnJhbWVfbnVtYmVyLApAQCAtMzI5OCwxNiArMzg1OSwzNSBAQAogICAgICAgICAgICAgICAgICAgICBJbkZsaWdodFJlcXVlc3QgJnIgPSBtSW5GbGlnaHRNYXAuZWRpdFZhbHVlQXQoaWR4KTsKICAgICAgICAgICAgICAgICAgICAgci5yZXF1ZXN0U3RhdHVzID0gbXNnLmVycm9yX2NvZGU7CiAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEV4dHJhcyA9IHIucmVzdWx0RXh0cmFzOwotICAgICAgICAgICAgICAgICAgICBpZiAoaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVNVTFQgPT0gZXJyb3JDb2RlCisgICAgICAgICAgICAgICAgICAgIGJvb2wgbG9naWNhbERldmljZVJlc3VsdEVycm9yID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGlmIChoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFU1VMVCA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yQ29kZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBoeXNpY2FsQ2FtZXJhSWQuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY2FtZXJhSWQocGh5c2ljYWxDYW1lcmFJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHIucGh5c2ljYWxDYW1lcmFJZHMuZmluZChjYW1lcmFJZCkgPT0gci5waHlzaWNhbENhbWVyYUlkcy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFJlcG9ydGVkIHJlc3VsdCBmYWlsdXJlIGZvciBwaHlzaWNhbCBjYW1lcmEgZGV2aWNlOiAlcyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB3aGljaCBpcyBub3QgcGFydCBvZiB0aGUgcmVzcGVjdGl2ZSByZXF1ZXN0ISIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZC5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRFeHRyYXMuZXJyb3JQaHlzaWNhbENhbWVyYUlkID0gcGh5c2ljYWxDYW1lcmFJZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9naWNhbERldmljZVJlc3VsdEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChsb2dpY2FsRGV2aWNlUmVzdWx0RXJyb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVFVRVNUID09CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByLnNraXBSZXN1bHRNZXRhZGF0YSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVTVUxUID09Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChsb2dpY2FsRGV2aWNlUmVzdWx0RXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgbWlzc2luZyByZXN1bHQgY2hlY2sgd2hldGhlciB0aGUgYnVmZmVycwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuZWQuIElmIHRoZXkgcmV0dXJuZWQsIHRoZW4gcmVtb3ZlIGluZmxpZ2h0CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGNhbGwgdGhpcyBmb3IgRVJST1JfQ0FNRVJBX1JFUVVFU1QgYXMgd2VsbD8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIG90aGVyd2lzZSB3ZSBhcmUgZGVwZW5kaW5nIG9uIEhBTCB0byBzZW5kIHRoZSBidWZmZXJzIGJhY2sgYWZ0ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIGNhbGxpbmcgbm90aWZ5RXJyb3IuIE5vdCBzdXJlIGlmIHRoYXQncyBpbiB0aGUgc3BlYy4KICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZUluRmxpZ2h0UmVxdWVzdElmUmVhZHlMb2NrZWQoaWR4KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0zMzUwLDEyICszOTMwLDIwIEBACiAgICAgICAgICAgICAgICAgLy8gVE9ETzogbmVlZCB0byB0cmFjayBlcnJvcnMgZm9yIHRpZ2h0ZXIgYm91bmRzIG9uIGV4cGVjdGVkIGZyYW1lIG51bWJlci4KICAgICAgICAgICAgICAgICBpZiAoci5oYXNJbnB1dEJ1ZmZlcikgewogICAgICAgICAgICAgICAgICAgICBpZiAobXNnLmZyYW1lX251bWJlciA8IG1OZXh0UmVwcm9jZXNzU2h1dHRlckZyYW1lTnVtYmVyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTRVRfRVJSKCJTaHV0dGVyIG5vdGlmaWNhdGlvbiBvdXQtb2Ytb3JkZXIuIEV4cGVjdGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9FUlIoIlJlcHJvY2VzcyBzaHV0dGVyIG5vdGlmaWNhdGlvbiBvdXQtb2Ytb3JkZXIuIEV4cGVjdGVkICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdGlmaWNhdGlvbiBmb3IgZnJhbWUgJWQsIGdvdCBmcmFtZSAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OZXh0UmVwcm9jZXNzU2h1dHRlckZyYW1lTnVtYmVyLCBtc2cuZnJhbWVfbnVtYmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtTmV4dFJlcHJvY2Vzc1NodXR0ZXJGcmFtZU51bWJlciA9IG1zZy5mcmFtZV9udW1iZXIgKyAxOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoci56c2xDYXB0dXJlICYmIHIuc3RpbGxDYXB0dXJlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtc2cuZnJhbWVfbnVtYmVyIDwgbU5leHRac2xTdGlsbFNodXR0ZXJGcmFtZU51bWJlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0VSUigiWlNMIHN0aWxsIGNhcHR1cmUgc2h1dHRlciBub3RpZmljYXRpb24gb3V0LW9mLW9yZGVyLiBFeHBlY3RlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub3RpZmljYXRpb24gZm9yIGZyYW1lICVkLCBnb3QgZnJhbWUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmV4dFpzbFN0aWxsU2h1dHRlckZyYW1lTnVtYmVyLCBtc2cuZnJhbWVfbnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtTmV4dFpzbFN0aWxsU2h1dHRlckZyYW1lTnVtYmVyID0gbXNnLmZyYW1lX251bWJlciArIDE7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5mcmFtZV9udW1iZXIgPCBtTmV4dFNodXR0ZXJGcmFtZU51bWJlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0VSUigiU2h1dHRlciBub3RpZmljYXRpb24gb3V0LW9mLW9yZGVyLiBFeHBlY3RlZCAiCkBAIC0zMzc5LDEwICszOTY3LDEzIEBACiAgICAgICAgICAgICAgICAgLy8gc2VuZCBwZW5kaW5nIHJlc3VsdCBhbmQgYnVmZmVycwogICAgICAgICAgICAgICAgIHNlbmRDYXB0dXJlUmVzdWx0KHIucGVuZGluZ01ldGFkYXRhLCByLnJlc3VsdEV4dHJhcywKICAgICAgICAgICAgICAgICAgICAgci5jb2xsZWN0ZWRQYXJ0aWFsUmVzdWx0LCBtc2cuZnJhbWVfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICByLmhhc0lucHV0QnVmZmVyLCByLnBoeXNpY2FsTWV0YWRhdGFzKTsKKyAgICAgICAgICAgICAgICAgICAgci5oYXNJbnB1dEJ1ZmZlciwgci56c2xDYXB0dXJlICYmIHIuc3RpbGxDYXB0dXJlLAorICAgICAgICAgICAgICAgICAgICByLnBoeXNpY2FsTWV0YWRhdGFzKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZyA9ICEoci56c2xDYXB0dXJlIHx8IHIuaGFzSW5wdXRCdWZmZXIpOwogICAgICAgICAgICAgcmV0dXJuT3V0cHV0QnVmZmVycyhyLnBlbmRpbmdPdXRwdXRCdWZmZXJzLmFycmF5KCksCi0gICAgICAgICAgICAgICAgci5wZW5kaW5nT3V0cHV0QnVmZmVycy5zaXplKCksIHIuc2h1dHRlclRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgICAgIHIucGVuZGluZ091dHB1dEJ1ZmZlcnMuc2l6ZSgpLCByLnNodXR0ZXJUaW1lc3RhbXAsIHRpbWVzdGFtcEluY3JlYXNpbmcsCisgICAgICAgICAgICAgICAgICAgIHIub3V0cHV0U3VyZmFjZXMsIHIucmVzdWx0RXh0cmFzKTsKICAgICAgICAgICAgIHIucGVuZGluZ091dHB1dEJ1ZmZlcnMuY2xlYXIoKTsKIAogICAgICAgICAgICAgcmVtb3ZlSW5GbGlnaHRSZXF1ZXN0SWZSZWFkeUxvY2tlZChpZHgpOwpAQCAtMzQwOCw4ICszOTk5LDExIEBACiAKIAogdm9pZCBDYW1lcmEzRGV2aWNlOjptb25pdG9yTWV0YWRhdGEoVGFnTW9uaXRvcjo6ZXZlbnRTb3VyY2Ugc291cmNlLAotICAgICAgICBpbnQ2NF90IGZyYW1lTnVtYmVyLCBuc2Vjc190IHRpbWVzdGFtcCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhKSB7Ci0gICAgbVRhZ01vbml0b3IubW9uaXRvck1ldGFkYXRhKHNvdXJjZSwgZnJhbWVOdW1iZXIsIHRpbWVzdGFtcCwgbWV0YWRhdGEpOworICAgICAgICBpbnQ2NF90IGZyYW1lTnVtYmVyLCBuc2Vjc190IHRpbWVzdGFtcCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhLAorICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIENhbWVyYU1ldGFkYXRhPiYgcGh5c2ljYWxNZXRhZGF0YSkgeworCisgICAgbVRhZ01vbml0b3IubW9uaXRvck1ldGFkYXRhKHNvdXJjZSwgZnJhbWVOdW1iZXIsIHRpbWVzdGFtcCwgbWV0YWRhdGEsCisgICAgICAgICAgICBwaHlzaWNhbE1ldGFkYXRhKTsKIH0KIAogLyoqCkBAIC0zNDE4LDExICs0MDEyLDE4IEBACiAKIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6SGFsSW50ZXJmYWNlKAogICAgICAgICAgICAgc3A8SUNhbWVyYURldmljZVNlc3Npb24+ICZzZXNzaW9uLAotICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZSkgOgorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZSwKKyAgICAgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlcikgOgogICAgICAgICBtSGlkbFNlc3Npb24oc2Vzc2lvbiksCi0gICAgICAgIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZShxdWV1ZSkgeworICAgICAgICBtUmVxdWVzdE1ldGFkYXRhUXVldWUocXVldWUpLAorICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcih1c2VIYWxCdWZNYW5hZ2VyKSwKKyAgICAgICAgbUlzUmVjb25maWd1cmF0aW9uUXVlcnlTdXBwb3J0ZWQodHJ1ZSkgewogICAgIC8vIENoZWNrIHdpdGggaGFyZHdhcmUgc2VydmljZSBtYW5hZ2VyIGlmIHdlIGNhbiBkb3duY2FzdCB0aGVzZSBpbnRlcmZhY2VzCiAgICAgLy8gU29tZXdoYXQgZXhwZW5zaXZlLCBzbyBjYWNoZSB0aGUgcmVzdWx0cyBhdCBzdGFydHVwCisgICAgYXV0byBjYXN0UmVzdWx0XzNfNSA9IGRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZVNlc3Npb246OmNhc3RGcm9tKG1IaWRsU2Vzc2lvbik7CisgICAgaWYgKGNhc3RSZXN1bHRfM181LmlzT2soKSkgeworICAgICAgICBtSGlkbFNlc3Npb25fM181ID0gY2FzdFJlc3VsdF8zXzU7CisgICAgfQogICAgIGF1dG8gY2FzdFJlc3VsdF8zXzQgPSBkZXZpY2U6OlYzXzQ6OklDYW1lcmFEZXZpY2VTZXNzaW9uOjpjYXN0RnJvbShtSGlkbFNlc3Npb24pOwogICAgIGlmIChjYXN0UmVzdWx0XzNfNC5pc09rKCkpIHsKICAgICAgICAgbUhpZGxTZXNzaW9uXzNfNCA9IGNhc3RSZXN1bHRfM180OwpAQCAtMzQzMywyNiArNDAzNCwyNCBAQAogICAgIH0KIH0KIAotQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpIYWxJbnRlcmZhY2UoKSB7fQorQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpIYWxJbnRlcmZhY2UoKSA6IG1Vc2VIYWxCdWZNYW5hZ2VyKGZhbHNlKSB7fQogCiBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OkhhbEludGVyZmFjZShjb25zdCBIYWxJbnRlcmZhY2UmIG90aGVyKSA6CiAgICAgICAgIG1IaWRsU2Vzc2lvbihvdGhlci5tSGlkbFNlc3Npb24pLAotICAgICAgICBtUmVxdWVzdE1ldGFkYXRhUXVldWUob3RoZXIubVJlcXVlc3RNZXRhZGF0YVF1ZXVlKSB7fQorICAgICAgICBtUmVxdWVzdE1ldGFkYXRhUXVldWUob3RoZXIubVJlcXVlc3RNZXRhZGF0YVF1ZXVlKSwKKyAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIob3RoZXIubVVzZUhhbEJ1Zk1hbmFnZXIpIHt9CiAKIGJvb2wgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjp2YWxpZCgpIHsKICAgICByZXR1cm4gKG1IaWRsU2Vzc2lvbiAhPSBudWxscHRyKTsKIH0KIAogdm9pZCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmNsZWFyKCkgeworICAgIG1IaWRsU2Vzc2lvbl8zXzUuY2xlYXIoKTsKICAgICBtSGlkbFNlc3Npb25fM180LmNsZWFyKCk7CiAgICAgbUhpZGxTZXNzaW9uXzNfMy5jbGVhcigpOwogICAgIG1IaWRsU2Vzc2lvbi5jbGVhcigpOwogfQogCi1ib29sIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6c3VwcG9ydEJhdGNoUmVxdWVzdCgpIHsKLSAgICByZXR1cm4gbUhpZGxTZXNzaW9uICE9IG51bGxwdHI7Ci19Ci0KIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6Y29uc3RydWN0RGVmYXVsdFJlcXVlc3RTZXR0aW5ncygKICAgICAgICAgY2FtZXJhM19yZXF1ZXN0X3RlbXBsYXRlX3QgdGVtcGxhdGVJZCwKICAgICAgICAgLypvdXQqLyBjYW1lcmFfbWV0YWRhdGFfdCAqKnJlcXVlc3RUZW1wbGF0ZSkgewpAQCAtMzUyMCw2ICs0MTE5LDUyIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAorYm9vbCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmlzUmVjb25maWd1cmF0aW9uUmVxdWlyZWQoQ2FtZXJhTWV0YWRhdGEmIG9sZFNlc3Npb25QYXJhbXMsCisgICAgICAgIENhbWVyYU1ldGFkYXRhJiBuZXdTZXNzaW9uUGFyYW1zKSB7CisgICAgLy8gV2UgZG8gcmVjb25maWd1cmF0aW9uIGJ5IGRlZmF1bHQ7CisgICAgYm9vbCByZXQgPSB0cnVlOworICAgIGlmICgobUhpZGxTZXNzaW9uXzNfNSAhPSBudWxscHRyKSAmJiBtSXNSZWNvbmZpZ3VyYXRpb25RdWVyeVN1cHBvcnRlZCkgeworICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM8dWludDhfdD4gb2xkUGFyYW1zLCBuZXdQYXJhbXM7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90KiBvbGRTZXNzaW9NZXRhID0gY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCo+KAorICAgICAgICAgICAgICAgIG9sZFNlc3Npb25QYXJhbXMuZ2V0QW5kTG9jaygpKTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QqIG5ld1Nlc3Npb01ldGEgPSBjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4oCisgICAgICAgICAgICAgICAgbmV3U2Vzc2lvblBhcmFtcy5nZXRBbmRMb2NrKCkpOworICAgICAgICBvbGRQYXJhbXMuc2V0VG9FeHRlcm5hbChyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihvbGRTZXNzaW9NZXRhKSwKKyAgICAgICAgICAgICAgICBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUob2xkU2Vzc2lvTWV0YSkpOworICAgICAgICBuZXdQYXJhbXMuc2V0VG9FeHRlcm5hbChyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihuZXdTZXNzaW9NZXRhKSwKKyAgICAgICAgICAgICAgICBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUobmV3U2Vzc2lvTWV0YSkpOworICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlN0YXR1cyBjYWxsU3RhdHVzOworICAgICAgICBib29sIHJlcXVpcmVkOworICAgICAgICBhdXRvIGhpZGxDYiA9IFsmY2FsbFN0YXR1cywgJnJlcXVpcmVkXSAoaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpTdGF0dXMgcywKKyAgICAgICAgICAgICAgICBib29sIHJlcXVpcmVkRmxhZykgeworICAgICAgICAgICAgY2FsbFN0YXR1cyA9IHM7CisgICAgICAgICAgICByZXF1aXJlZCA9IHJlcXVpcmVkRmxhZzsKKyAgICAgICAgfTsKKyAgICAgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb25fM181LT5pc1JlY29uZmlndXJhdGlvblJlcXVpcmVkKG9sZFBhcmFtcywgbmV3UGFyYW1zLCBoaWRsQ2IpOworICAgICAgICBvbGRTZXNzaW9uUGFyYW1zLnVubG9jayhvbGRTZXNzaW9NZXRhKTsKKyAgICAgICAgbmV3U2Vzc2lvblBhcmFtcy51bmxvY2sobmV3U2Vzc2lvTWV0YSk7CisgICAgICAgIGlmIChlcnIuaXNPaygpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGNhbGxTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICBjYXNlIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6U3RhdHVzOjpPSzoKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmVxdWlyZWQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpTdGF0dXM6Ok1FVEhPRF9OT1RfU1VQUE9SVEVEOgorICAgICAgICAgICAgICAgICAgICBtSXNSZWNvbmZpZ3VyYXRpb25RdWVyeVN1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IFJlY29uZmlndXJhdGlvbiBxdWVyeSBmYWlsZWQ6ICVkIiwgX19GVU5DVElPTl9fLCBjYWxsU3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5leHBlY3RlZCBiaW5kZXIgZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmNvbmZpZ3VyZVN0cmVhbXMoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnNlc3Npb25QYXJhbXMsCiAgICAgICAgIGNhbWVyYTNfc3RyZWFtX2NvbmZpZ3VyYXRpb24gKmNvbmZpZywgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBidWZmZXJTaXplcykgewogICAgIEFUUkFDRV9OQU1FKCJDYW1lcmFIYWw6OmNvbmZpZ3VyZVN0cmVhbXMiKTsKQEAgLTM1OTksMjYgKzQyNDQsNDkgQEAKIAogICAgIC8vIEludm9rZSBjb25maWd1cmVTdHJlYW1zCiAgICAgZGV2aWNlOjpWM18zOjpIYWxTdHJlYW1Db25maWd1cmF0aW9uIGZpbmFsQ29uZmlndXJhdGlvbjsKKyAgICBkZXZpY2U6OlYzXzQ6OkhhbFN0cmVhbUNvbmZpZ3VyYXRpb24gZmluYWxDb25maWd1cmF0aW9uM180OwogICAgIGNvbW1vbjo6VjFfMDo6U3RhdHVzIHN0YXR1czsKIAotICAgIC8vIFNlZSBpZiB3ZSBoYXZlIHYzLjQgb3IgdjMuMyBIQUwKLSAgICBpZiAobUhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7Ci0gICAgICAgIC8vIFdlIGRvOyB1c2UgdjMuNCBmb3IgdGhlIGNhbGwKLSAgICAgICAgQUxPR1YoIiVzOiB2My40IGRldmljZSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIGRldmljZTo6VjNfNDo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiBmaW5hbENvbmZpZ3VyYXRpb24zXzQ7Ci0gICAgICAgIGF1dG8gZXJyID0gbUhpZGxTZXNzaW9uXzNfNC0+Y29uZmlndXJlU3RyZWFtc18zXzQocmVxdWVzdGVkQ29uZmlndXJhdGlvbjNfNCwKLSAgICAgICAgICAgIFsmc3RhdHVzLCAmZmluYWxDb25maWd1cmF0aW9uM180XQorICAgIGF1dG8gY29uZmlnU3RyZWFtMzRDYiA9IFsmc3RhdHVzLCAmZmluYWxDb25maWd1cmF0aW9uM180XQogICAgICAgICAgICAgKGNvbW1vbjo6VjFfMDo6U3RhdHVzIHMsIGNvbnN0IGRldmljZTo6VjNfNDo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiYgaGFsQ29uZmlndXJhdGlvbikgewogICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbjNfNCA9IGhhbENvbmZpZ3VyYXRpb247CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKLSAgICAgICAgICAgIH0pOwotICAgICAgICBpZiAoIWVyci5pc09rKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgICAgIH07CisKKyAgICBhdXRvIHBvc3Rwcm9jQ29uZmlnU3RyZWFtMzQgPSBbJmZpbmFsQ29uZmlndXJhdGlvbiwgJmZpbmFsQ29uZmlndXJhdGlvbjNfNF0KKyAgICAgICAgICAgIChoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+JiBlcnIpIC0+IHN0YXR1c190IHsKKyAgICAgICAgICAgICAgICBpZiAoIWVyci5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtcy5zaXplKCkpOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmluYWxDb25maWd1cmF0aW9uM180LnN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXNbaV0gPSBmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtc1tpXS52M18zOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICB9OworCisgICAgLy8gU2VlIGlmIHdlIGhhdmUgdjMuNCBvciB2My4zIEhBTAorICAgIGlmIChtSGlkbFNlc3Npb25fM181ICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1YoIiVzOiB2My41IGRldmljZSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGRldmljZTo6VjNfNTo6U3RyZWFtQ29uZmlndXJhdGlvbiByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM181OworICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM181LnYzXzQgPSByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180OworICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM181LnN0cmVhbUNvbmZpZ0NvdW50ZXIgPSBtTmV4dFN0cmVhbUNvbmZpZ0NvdW50ZXIrKzsKKyAgICAgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb25fM181LT5jb25maWd1cmVTdHJlYW1zXzNfNSgKKyAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM181LCBjb25maWdTdHJlYW0zNENiKTsKKyAgICAgICAgcmVzID0gcG9zdHByb2NDb25maWdTdHJlYW0zNChlcnIpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9Ci0gICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtcy5zaXplKCkpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpbmFsQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtc1tpXSA9IGZpbmFsQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zW2ldLnYzXzM7CisgICAgfSBlbHNlIGlmIChtSGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gV2UgZG87IHVzZSB2My40IGZvciB0aGUgY2FsbAorICAgICAgICBBTE9HVigiJXM6IHYzLjQgZGV2aWNlIGZvdW5kIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgZGV2aWNlOjpWM180OjpIYWxTdHJlYW1Db25maWd1cmF0aW9uIGZpbmFsQ29uZmlndXJhdGlvbjNfNDsKKyAgICAgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb25fM180LT5jb25maWd1cmVTdHJlYW1zXzNfNCgKKyAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180LCBjb25maWdTdHJlYW0zNENiKTsKKyAgICAgICAgcmVzID0gcG9zdHByb2NDb25maWdTdHJlYW0zNChlcnIpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtSGlkbFNlc3Npb25fM18zICE9IG51bGxwdHIpIHsKICAgICAgICAgLy8gV2UgZG87IHVzZSB2My4zIGZvciB0aGUgY2FsbApAQCAtMzY2OCwxMiArNDMzNiwxMyBAQAogICAgICAgICAvLyBTdGFydCBzY2FuIGF0IGksIHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgc3RyZWFtIG9yZGVyIG1hdGNoZXMKICAgICAgICAgc2l6ZV90IHJlYWxJZHggPSBpOwogICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgIGZvciAoc2l6ZV90IGlkeCA9IDA7IGlkeCA8IGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zLnNpemUoKTsgaWR4KyspIHsKKyAgICAgICAgc2l6ZV90IGhhbFN0cmVhbUNvdW50ID0gZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXMuc2l6ZSgpOworICAgICAgICBmb3IgKHNpemVfdCBpZHggPSAwOyBpZHggPCBoYWxTdHJlYW1Db3VudDsgaWR4KyspIHsKICAgICAgICAgICAgIGlmIChmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtc1tyZWFsSWR4XS52M18yLmlkID09IHN0cmVhbUlkKSB7CiAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVhbElkeCA9IChyZWFsSWR4ID49IGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zLnNpemUoKSkgPyAwIDogcmVhbElkeCArIDE7CisgICAgICAgICAgICByZWFsSWR4ID0gKHJlYWxJZHggPj0gaGFsU3RyZWFtQ291bnQgLSAxKSA/IDAgOiByZWFsSWR4ICsgMTsKICAgICAgICAgfQogICAgICAgICBpZiAoIWZvdW5kKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZCBub3QgZm91bmQgaW4gc3RyZWFtIGNvbmZpZ3VyYXRpb24gcmVzcG9uc2UgZnJvbSBIQUwiLApAQCAtMzczMCwxNCArNDM5OSwxNSBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLXZvaWQgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjp3cmFwQXNIaWRsUmVxdWVzdChjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90KiByZXF1ZXN0LAorc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjp3cmFwQXNIaWRsUmVxdWVzdChjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90KiByZXF1ZXN0LAogICAgICAgICAvKm91dCovZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVxdWVzdCogY2FwdHVyZVJlcXVlc3QsCi0gICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiogaGFuZGxlc0NyZWF0ZWQpIHsKKyAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+KiBoYW5kbGVzQ3JlYXRlZCwKKyAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4qIGluZmxpZ2h0QnVmZmVycykgewogICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgaWYgKGNhcHR1cmVSZXF1ZXN0ID09IG51bGxwdHIgfHwgaGFuZGxlc0NyZWF0ZWQgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXM6IGNhcHR1cmVSZXF1ZXN0ICglcCkgYW5kIGhhbmRsZXNDcmVhdGVkICglcCkgbXVzdCBub3QgYmUgbnVsbCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYXB0dXJlUmVxdWVzdCwgaGFuZGxlc0NyZWF0ZWQpOwotICAgICAgICByZXR1cm47CisgICAgaWYgKGNhcHR1cmVSZXF1ZXN0ID09IG51bGxwdHIgfHwgaGFuZGxlc0NyZWF0ZWQgPT0gbnVsbHB0ciB8fCBpbmZsaWdodEJ1ZmZlcnMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IGNhcHR1cmVSZXF1ZXN0ICglcCksIGhhbmRsZXNDcmVhdGVkICglcCksIGFuZCBpbmZsaWdodEJ1ZmZlcnMoJXApICIKKyAgICAgICAgICAgICAgICAibXVzdCBub3QgYmUgbnVsbCIsIF9fRlVOQ1RJT05fXywgY2FwdHVyZVJlcXVlc3QsIGhhbmRsZXNDcmVhdGVkLCBpbmZsaWdodEJ1ZmZlcnMpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIGNhcHR1cmVSZXF1ZXN0LT5mcmFtZU51bWJlciA9IHJlcXVlc3QtPmZyYW1lX251bWJlcjsKQEAgLTM3NjYsOCArNDQzNiw4IEBACiAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRCdWZmZXIucmVsZWFzZUZlbmNlID0gbnVsbHB0cjsKIAogICAgICAgICAgICAgcHVzaEluZmxpZ2h0QnVmZmVyTG9ja2VkKGNhcHR1cmVSZXF1ZXN0LT5mcmFtZU51bWJlciwgc3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPmlucHV0X2J1ZmZlci0+YnVmZmVyLAotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5pbnB1dF9idWZmZXItPmFjcXVpcmVfZmVuY2UpOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5pbnB1dF9idWZmZXItPmJ1ZmZlcik7CisgICAgICAgICAgICBpbmZsaWdodEJ1ZmZlcnMtPnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihjYXB0dXJlUmVxdWVzdC0+ZnJhbWVOdW1iZXIsIHN0cmVhbUlkKSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRCdWZmZXIuc3RyZWFtSWQgPSAtMTsKICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5pbnB1dEJ1ZmZlci5idWZmZXJJZCA9IEJVRkZFUl9JRF9OT19CVUZGRVI7CkBAIC0zNzc4LDI2ICs0NDQ4LDU3IEBACiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCAqc3JjID0gcmVxdWVzdC0+b3V0cHV0X2J1ZmZlcnMgKyBpOwogICAgICAgICAgICAgU3RyZWFtQnVmZmVyICZkc3QgPSBjYXB0dXJlUmVxdWVzdC0+b3V0cHV0QnVmZmVyc1tpXTsKICAgICAgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSBDYW1lcmEzU3RyZWFtOjpjYXN0KHNyYy0+c3RyZWFtKS0+Z2V0SWQoKTsKLSAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCBidWYgPSAqKHNyYy0+YnVmZmVyKTsKLSAgICAgICAgICAgIGF1dG8gcGFpciA9IGdldEJ1ZmZlcklkKGJ1Ziwgc3RyZWFtSWQpOwotICAgICAgICAgICAgYm9vbCBpc05ld0J1ZmZlciA9IHBhaXIuZmlyc3Q7Ci0gICAgICAgICAgICBkc3Quc3RyZWFtSWQgPSBzdHJlYW1JZDsKLSAgICAgICAgICAgIGRzdC5idWZmZXJJZCA9IHBhaXIuc2Vjb25kOwotICAgICAgICAgICAgZHN0LmJ1ZmZlciA9IGlzTmV3QnVmZmVyID8gYnVmIDogbnVsbHB0cjsKLSAgICAgICAgICAgIGRzdC5zdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok9LOwotICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICphY3F1aXJlRmVuY2UgPSBudWxscHRyOwotICAgICAgICAgICAgaWYgKHNyYy0+YWNxdWlyZV9mZW5jZSAhPSAtMSkgewotICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsMCk7Ci0gICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlLT5kYXRhWzBdID0gc3JjLT5hY3F1aXJlX2ZlbmNlOwotICAgICAgICAgICAgICAgIGhhbmRsZXNDcmVhdGVkLT5wdXNoX2JhY2soYWNxdWlyZUZlbmNlKTsKKyAgICAgICAgICAgIGlmIChzcmMtPmJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90IGJ1ZiA9ICooc3JjLT5idWZmZXIpOworICAgICAgICAgICAgICAgIGF1dG8gcGFpciA9IGdldEJ1ZmZlcklkKGJ1Ziwgc3RyZWFtSWQpOworICAgICAgICAgICAgICAgIGJvb2wgaXNOZXdCdWZmZXIgPSBwYWlyLmZpcnN0OworICAgICAgICAgICAgICAgIGRzdC5idWZmZXJJZCA9IHBhaXIuc2Vjb25kOworICAgICAgICAgICAgICAgIGRzdC5idWZmZXIgPSBpc05ld0J1ZmZlciA/IGJ1ZiA6IG51bGxwdHI7CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICphY3F1aXJlRmVuY2UgPSBudWxscHRyOworICAgICAgICAgICAgICAgIGlmIChzcmMtPmFjcXVpcmVfZmVuY2UgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwwKTsKKyAgICAgICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlLT5kYXRhWzBdID0gc3JjLT5hY3F1aXJlX2ZlbmNlOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVzQ3JlYXRlZC0+cHVzaF9iYWNrKGFjcXVpcmVGZW5jZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRzdC5hY3F1aXJlRmVuY2UgPSBhY3F1aXJlRmVuY2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgLy8gSEFMIGJ1ZmZlciBtYW5hZ2VtZW50IHBhdGgKKyAgICAgICAgICAgICAgICBkc3QuYnVmZmVySWQgPSBCVUZGRVJfSURfTk9fQlVGRkVSOworICAgICAgICAgICAgICAgIGRzdC5idWZmZXIgPSBudWxscHRyOworICAgICAgICAgICAgICAgIGRzdC5hY3F1aXJlRmVuY2UgPSBudWxscHRyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCBzZW5kIGEgbnVsbCBidWZmZXIgaW4gY2FwdHVyZSByZXF1ZXN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRzdC5hY3F1aXJlRmVuY2UgPSBhY3F1aXJlRmVuY2U7CisgICAgICAgICAgICBkc3Quc3RyZWFtSWQgPSBzdHJlYW1JZDsKKyAgICAgICAgICAgIGRzdC5zdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok9LOwogICAgICAgICAgICAgZHN0LnJlbGVhc2VGZW5jZSA9IG51bGxwdHI7CiAKLSAgICAgICAgICAgIHB1c2hJbmZsaWdodEJ1ZmZlckxvY2tlZChjYXB0dXJlUmVxdWVzdC0+ZnJhbWVOdW1iZXIsIHN0cmVhbUlkLAotICAgICAgICAgICAgICAgICAgICBzcmMtPmJ1ZmZlciwgc3JjLT5hY3F1aXJlX2ZlbmNlKTsKKyAgICAgICAgICAgIC8vIE91dHB1dCBidWZmZXJzIGFyZSBlbXB0eSB3aGVuIHVzaW5nIEhBTCBidWZmZXIgbWFuYWdlcgorICAgICAgICAgICAgaWYgKCFtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICAgICAgICAgIHB1c2hJbmZsaWdodEJ1ZmZlckxvY2tlZChjYXB0dXJlUmVxdWVzdC0+ZnJhbWVOdW1iZXIsIHN0cmVhbUlkLCBzcmMtPmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgaW5mbGlnaHRCdWZmZXJzLT5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoY2FwdHVyZVJlcXVlc3QtPmZyYW1lTnVtYmVyLCBzdHJlYW1JZCkpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQorICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmNsZWFudXBOYXRpdmVIYW5kbGVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiAqaGFuZGxlcywgYm9vbCBjbG9zZUZkKSB7CisgICAgaWYgKGhhbmRsZXMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChjbG9zZUZkKSB7CisgICAgICAgIGZvciAoYXV0byYgaGFuZGxlIDogKmhhbmRsZXMpIHsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoaGFuZGxlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGF1dG8mIGhhbmRsZSA6ICpoYW5kbGVzKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7CisgICAgfQorICAgIGhhbmRsZXMtPmNsZWFyKCk7CisgICAgcmV0dXJuOwogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OnByb2Nlc3NCYXRjaENhcHR1cmVSZXF1ZXN0cygKQEAgLTM4MjAsMTMgKzQ1MjEsMjEgQEAKICAgICAgICAgY2FwdHVyZVJlcXVlc3RzLnJlc2l6ZShiYXRjaFNpemUpOwogICAgIH0KICAgICBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiBoYW5kbGVzQ3JlYXRlZDsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+IGluZmxpZ2h0QnVmZmVyczsKIAorICAgIHN0YXR1c190IHJlcyA9IE9LOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYmF0Y2hTaXplOyBpKyspIHsKICAgICAgICAgaWYgKGhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICB3cmFwQXNIaWRsUmVxdWVzdChyZXF1ZXN0c1tpXSwgLypvdXQqLyZjYXB0dXJlUmVxdWVzdHNfM180W2ldLnYzXzIsCi0gICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8maGFuZGxlc0NyZWF0ZWQpOworICAgICAgICAgICAgcmVzID0gd3JhcEFzSGlkbFJlcXVlc3QocmVxdWVzdHNbaV0sIC8qb3V0Ki8mY2FwdHVyZVJlcXVlc3RzXzNfNFtpXS52M18yLAorICAgICAgICAgICAgICAgICAgICAvKm91dCovJmhhbmRsZXNDcmVhdGVkLCAvKm91dCovJmluZmxpZ2h0QnVmZmVycyk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3cmFwQXNIaWRsUmVxdWVzdChyZXF1ZXN0c1tpXSwgLypvdXQqLyZjYXB0dXJlUmVxdWVzdHNbaV0sIC8qb3V0Ki8maGFuZGxlc0NyZWF0ZWQpOworICAgICAgICAgICAgcmVzID0gd3JhcEFzSGlkbFJlcXVlc3QocmVxdWVzdHNbaV0sIC8qb3V0Ki8mY2FwdHVyZVJlcXVlc3RzW2ldLAorICAgICAgICAgICAgICAgICAgICAvKm91dCovJmhhbmRsZXNDcmVhdGVkLCAvKm91dCovJmluZmxpZ2h0QnVmZmVycyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgcG9wSW5mbGlnaHRCdWZmZXJzKGluZmxpZ2h0QnVmZmVycyk7CisgICAgICAgICAgICBjbGVhbnVwTmF0aXZlSGFuZGxlcygmaGFuZGxlc0NyZWF0ZWQpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzkwOCw0NiArNDYxNyw0MyBAQAogICAgIH0KIAogICAgIGhhcmR3YXJlOjpkZXRhaWxzOjpyZXR1cm5fc3RhdHVzIGVycjsKKyAgICBhdXRvIHJlc3VsdENhbGxiYWNrID0KKyAgICAgICAgWyZzdGF0dXMsICZudW1SZXF1ZXN0UHJvY2Vzc2VkXSAoYXV0byBzLCB1aW50MzJfdCBuKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAqbnVtUmVxdWVzdFByb2Nlc3NlZCA9IG47CisgICAgICAgIH07CiAgICAgaWYgKGhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7CiAgICAgICAgIGVyciA9IGhpZGxTZXNzaW9uXzNfNC0+cHJvY2Vzc0NhcHR1cmVSZXF1ZXN0XzNfNChjYXB0dXJlUmVxdWVzdHNfM180LCBjYWNoZXNUb1JlbW92ZSwKLSAgICAgICAgICAgIFsmc3RhdHVzLCAmbnVtUmVxdWVzdFByb2Nlc3NlZF0gKGF1dG8gcywgdWludDMyX3QgbikgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7Ci0gICAgICAgICAgICAgICAgKm51bVJlcXVlc3RQcm9jZXNzZWQgPSBuOwotICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRDYWxsYmFjayk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZXJyID0gbUhpZGxTZXNzaW9uLT5wcm9jZXNzQ2FwdHVyZVJlcXVlc3QoY2FwdHVyZVJlcXVlc3RzLCBjYWNoZXNUb1JlbW92ZSwKLSAgICAgICAgICAgIFsmc3RhdHVzLCAmbnVtUmVxdWVzdFByb2Nlc3NlZF0gKGF1dG8gcywgdWludDMyX3QgbikgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7Ci0gICAgICAgICAgICAgICAgKm51bVJlcXVlc3RQcm9jZXNzZWQgPSBuOwotICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdENhbGxiYWNrKTsKICAgICB9CiAgICAgaWYgKCFlcnIuaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICBzdGF0dXMgPSBjb21tb246OlYxXzA6OlN0YXR1czo6Q0FNRVJBX0RJU0NPTk5FQ1RFRDsKICAgICB9CisKICAgICBpZiAoc3RhdHVzID09IGNvbW1vbjo6VjFfMDo6U3RhdHVzOjpPSyAmJiAqbnVtUmVxdWVzdFByb2Nlc3NlZCAhPSBiYXRjaFNpemUpIHsKICAgICAgICAgQUxPR0UoIiVzOiBwcm9jZXNzQ2FwdHVyZVJlcXVlc3QgcmV0dXJucyBPSyBidXQgcHJvY2Vzc2VkICVkLyV6dSByZXF1ZXN0cyIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAqbnVtUmVxdWVzdFByb2Nlc3NlZCwgYmF0Y2hTaXplKTsKICAgICAgICAgc3RhdHVzID0gY29tbW9uOjpWMV8wOjpTdGF0dXM6OklOVEVSTkFMX0VSUk9SOwogICAgIH0KIAotICAgIGZvciAoYXV0byYgaGFuZGxlIDogaGFuZGxlc0NyZWF0ZWQpIHsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGFuZGxlKTsKKyAgICByZXMgPSBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVChzdGF0dXMpOworICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgaWYgKG1IaWRsU2Vzc2lvbi0+aXNSZW1vdGUoKSkgeworICAgICAgICAgICAgLy8gT25seSBjbG9zZSBhY3F1aXJlIGZlbmNlIEZEcyB3aGVuIHRoZSBISURMIHRyYW5zYWN0aW9uIHN1Y2NlZWRzIChzbyB0aGUgRkRzIGhhdmUgYmVlbgorICAgICAgICAgICAgLy8gc2VudCB0byBjYW1lcmEgSEFMIHByb2Nlc3NlcykKKyAgICAgICAgICAgIGNsZWFudXBOYXRpdmVIYW5kbGVzKCZoYW5kbGVzQ3JlYXRlZCwgLypjbG9zZUZkKi90cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEluIHBhc3N0aHJvdWdoIG1vZGUgdGhlIEZEcyBhcmUgbm93IG93bmVkIGJ5IEhBTAorICAgICAgICAgICAgY2xlYW51cE5hdGl2ZUhhbmRsZXMoJmhhbmRsZXNDcmVhdGVkKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHBvcEluZmxpZ2h0QnVmZmVycyhpbmZsaWdodEJ1ZmZlcnMpOworICAgICAgICBjbGVhbnVwTmF0aXZlSGFuZGxlcygmaGFuZGxlc0NyZWF0ZWQpOwogICAgIH0KLSAgICByZXR1cm4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptYXBUb1N0YXR1c1Qoc3RhdHVzKTsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpwcm9jZXNzQ2FwdHVyZVJlcXVlc3QoCi0gICAgICAgIGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QgKnJlcXVlc3QpIHsKLSAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpwcm9jZXNzQ2FwdHVyZVJlcXVlc3QiKTsKLSAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICBzdGF0dXNfdCByZXMgPSBPSzsKLQotICAgIHVpbnQzMl90IG51bVJlcXVlc3RQcm9jZXNzZWQgPSAwOwotICAgIHN0ZDo6dmVjdG9yPGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QqPiByZXF1ZXN0cygxKTsKLSAgICByZXF1ZXN0c1swXSA9IHJlcXVlc3Q7Ci0gICAgcmVzID0gcHJvY2Vzc0JhdGNoQ2FwdHVyZVJlcXVlc3RzKHJlcXVlc3RzLCAmbnVtUmVxdWVzdFByb2Nlc3NlZCk7Ci0KICAgICByZXR1cm4gcmVzOwogfQogCkBAIC0zOTkwLDYgKzQ2OTYsMjAgQEAKICAgICByZXR1cm4gcmVzOwogfQogCit2b2lkIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6c2lnbmFsUGlwZWxpbmVEcmFpbihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBzdHJlYW1JZHMpIHsKKyAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpzaWduYWxQaXBlbGluZURyYWluIik7CisgICAgaWYgKCF2YWxpZCgpIHx8IG1IaWRsU2Vzc2lvbl8zXzUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIG9uIGludmFsaWQgY2FtZXJhISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzUtPnNpZ25hbFN0cmVhbUZsdXNoKHN0cmVhbUlkcywgbU5leHRTdHJlYW1Db25maWdDb3VudGVyIC0gMSk7CisgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKwogdm9pZCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmdldEluZmxpZ2h0QnVmZmVyS2V5cygKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+Piogb3V0KSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUluZmxpZ2h0TG9jayk7CkBAIC00MDA0LDExICs0NzI0LDIxIEBACiAgICAgcmV0dXJuOwogfQogCit2b2lkIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6Z2V0SW5mbGlnaHRSZXF1ZXN0QnVmZmVyS2V5cygKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+KiBvdXQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVxdWVzdGVkQnVmZmVyc0xvY2spOworICAgIG91dC0+Y2xlYXIoKTsKKyAgICBvdXQtPnJlc2VydmUobVJlcXVlc3RlZEJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICBmb3IgKGF1dG8mIHBhaXIgOiBtUmVxdWVzdGVkQnVmZmVycykgeworICAgICAgICBvdXQtPnB1c2hfYmFjayhwYWlyLmZpcnN0KTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OnB1c2hJbmZsaWdodEJ1ZmZlckxvY2tlZCgKLSAgICAgICAgaW50MzJfdCBmcmFtZU51bWJlciwgaW50MzJfdCBzdHJlYW1JZCwgYnVmZmVyX2hhbmRsZV90ICpidWZmZXIsIGludCBhY3F1aXJlRmVuY2UpIHsKKyAgICAgICAgaW50MzJfdCBmcmFtZU51bWJlciwgaW50MzJfdCBzdHJlYW1JZCwgYnVmZmVyX2hhbmRsZV90ICpidWZmZXIpIHsKICAgICB1aW50NjRfdCBrZXkgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oZnJhbWVOdW1iZXIpIDw8IDMyIHwgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHN0cmVhbUlkKTsKLSAgICBhdXRvIHBhaXIgPSBzdGQ6Om1ha2VfcGFpcihidWZmZXIsIGFjcXVpcmVGZW5jZSk7Ci0gICAgbUluZmxpZ2h0QnVmZmVyTWFwW2tleV0gPSBwYWlyOworICAgIG1JbmZsaWdodEJ1ZmZlck1hcFtrZXldID0gYnVmZmVyOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtNDAyMCwxNiArNDc1MCw1OCBAQAogICAgIHVpbnQ2NF90IGtleSA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihmcmFtZU51bWJlcikgPDwgMzIgfCBzdGF0aWNfY2FzdDx1aW50NjRfdD4oc3RyZWFtSWQpOwogICAgIGF1dG8gaXQgPSBtSW5mbGlnaHRCdWZmZXJNYXAuZmluZChrZXkpOwogICAgIGlmIChpdCA9PSBtSW5mbGlnaHRCdWZmZXJNYXAuZW5kKCkpIHJldHVybiBOQU1FX05PVF9GT1VORDsKLSAgICBhdXRvIHBhaXIgPSBpdC0+c2Vjb25kOwotICAgICpidWZmZXIgPSBwYWlyLmZpcnN0OwotICAgIGludCBhY3F1aXJlRmVuY2UgPSBwYWlyLnNlY29uZDsKLSAgICBpZiAoYWNxdWlyZUZlbmNlID4gMCkgewotICAgICAgICA6OmNsb3NlKGFjcXVpcmVGZW5jZSk7CisgICAgaWYgKGJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICpidWZmZXIgPSBpdC0+c2Vjb25kOwogICAgIH0KICAgICBtSW5mbGlnaHRCdWZmZXJNYXAuZXJhc2UoaXQpOwogICAgIHJldHVybiBPSzsKIH0KIAordm9pZCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OnBvcEluZmxpZ2h0QnVmZmVycygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+PiYgYnVmZmVycykgeworICAgIGZvciAoY29uc3QgYXV0byYgcGFpciA6IGJ1ZmZlcnMpIHsKKyAgICAgICAgaW50MzJfdCBmcmFtZU51bWJlciA9IHBhaXIuZmlyc3Q7CisgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSBwYWlyLnNlY29uZDsKKyAgICAgICAgcG9wSW5mbGlnaHRCdWZmZXIoZnJhbWVOdW1iZXIsIHN0cmVhbUlkLCBudWxscHRyKTsKKyAgICB9Cit9CisKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6cHVzaEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcigKKyAgICAgICAgdWludDY0X3QgYnVmZmVySWQsIGJ1ZmZlcl9oYW5kbGVfdCogYnVmLCBpbnQzMl90IHN0cmVhbUlkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlcXVlc3RlZEJ1ZmZlcnNMb2NrKTsKKyAgICBhdXRvIHBhaXIgPSBtUmVxdWVzdGVkQnVmZmVycy5pbnNlcnQoe2J1ZmZlcklkLCB7c3RyZWFtSWQsIGJ1Zn19KTsKKyAgICBpZiAoIXBhaXIuc2Vjb25kKSB7CisgICAgICAgIEFMT0dFKCIlczogYnVmSWQgJSIgUFJJdTY0ICIgaXMgYWxyZWFkeSBpbmZsaWdodCEiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmZmVySWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIEZpbmQgYW5kIHBvcCBhIGJ1ZmZlcl9oYW5kbGVfdCBiYXNlZCBvbiBidWZmZXJJZAorc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpwb3BJbmZsaWdodFJlcXVlc3RCdWZmZXIoCisgICAgICAgIHVpbnQ2NF90IGJ1ZmZlcklkLAorICAgICAgICAvKm91dCovIGJ1ZmZlcl9oYW5kbGVfdCoqIGJ1ZmZlciwKKyAgICAgICAgLypvcHRpb25hbCBvdXQqLyBpbnQzMl90KiBzdHJlYW1JZCkgeworICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IGJ1ZmZlciAoJXApIG11c3Qgbm90IGJlIG51bGwiLCBfX0ZVTkNUSU9OX18sIGJ1ZmZlcik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZXF1ZXN0ZWRCdWZmZXJzTG9jayk7CisgICAgYXV0byBpdCA9IG1SZXF1ZXN0ZWRCdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgIGlmIChpdCA9PSBtUmVxdWVzdGVkQnVmZmVycy5lbmQoKSkgeworICAgICAgICBBTE9HRSgiJXM6IGJ1ZklkICUiIFBSSXU2NCAiIGlzIG5vdCBpbmZsaWdodCEiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmZmVySWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICAqYnVmZmVyID0gaXQtPnNlY29uZC5zZWNvbmQ7CisgICAgaWYgKHN0cmVhbUlkICE9IG51bGxwdHIpIHsKKyAgICAgICAgKnN0cmVhbUlkID0gaXQtPnNlY29uZC5maXJzdDsKKyAgICB9CisgICAgbVJlcXVlc3RlZEJ1ZmZlcnMuZXJhc2UoaXQpOworICAgIHJldHVybiBPSzsKK30KKwogc3RkOjpwYWlyPGJvb2wsIHVpbnQ2NF90PiBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmdldEJ1ZmZlcklkKAogICAgICAgICBjb25zdCBidWZmZXJfaGFuZGxlX3QmIGJ1ZiwgaW50IHN0cmVhbUlkKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlcklkTWFwTG9jayk7CkBAIC00MDY0LDcgKzQ4MzYsNyBAQAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaGFuZGxlLCBzdHJlYW1JZCk7CiAgICAgICAgIHJldHVybjsKICAgICB9IGVsc2UgewotICAgICAgICBidWZmZXJJZCA9ICBpdC0+c2Vjb25kOworICAgICAgICBidWZmZXJJZCA9IGl0LT5zZWNvbmQ7CiAgICAgICAgIGJJZE1hcC5lcmFzZShpdCk7CiAgICAgICAgIEFMT0dWKCIlczogc3RyZWFtICVkIG5vdyBoYXZlICV6dSBidWZmZXIgY2FjaGVzIGFmdGVyIHJlbW92aW5nIGJ1ZiAlcCIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCwgYklkTWFwLnNpemUoKSwgaGFuZGxlKTsKQEAgLTQwNzIsMTMgKzQ4NDQsMzAgQEAKICAgICBtRnJlZWRCdWZmZXJzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihzdHJlYW1JZCwgYnVmZmVySWQpKTsKIH0KIAordm9pZCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6Om9uU3RyZWFtUmVDb25maWd1cmVkKGludCBzdHJlYW1JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJJZE1hcExvY2spOworICAgIGF1dG8gbWFwSXQgPSBtQnVmZmVySWRNYXBzLmZpbmQoc3RyZWFtSWQpOworICAgIGlmIChtYXBJdCA9PSBtQnVmZmVySWRNYXBzLmVuZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogc3RyZWFtSWQgJWQgbm90IGZvdW5kISIsIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQnVmZmVySWRNYXAmIGJJZE1hcCA9IG1hcEl0LT5zZWNvbmQ7CisgICAgZm9yIChjb25zdCBhdXRvJiBpdCA6IGJJZE1hcCkgeworICAgICAgICB1aW50NjRfdCBidWZmZXJJZCA9IGl0LnNlY29uZDsKKyAgICAgICAgbUZyZWVkQnVmZmVycy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoc3RyZWFtSWQsIGJ1ZmZlcklkKSk7CisgICAgfQorICAgIGJJZE1hcC5jbGVhcigpOworfQorCiAvKioKICAqIFJlcXVlc3RUaHJlYWQgaW5uZXIgY2xhc3MgbWV0aG9kcwogICovCiAKIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OlJlcXVlc3RUaHJlYWQod3A8Q2FtZXJhM0RldmljZT4gcGFyZW50LAogICAgICAgICBzcDxTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyLAotICAgICAgICBzcDxIYWxJbnRlcmZhY2U+IGludGVyZmFjZSwgY29uc3QgVmVjdG9yPGludDMyX3Q+JiBzZXNzaW9uUGFyYW1LZXlzKSA6CisgICAgICAgIHNwPEhhbEludGVyZmFjZT4gaW50ZXJmYWNlLCBjb25zdCBWZWN0b3I8aW50MzJfdD4mIHNlc3Npb25QYXJhbUtleXMsCisgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlcikgOgogICAgICAgICBUaHJlYWQoLypjYW5DYWxsSmF2YSovZmFsc2UpLAogICAgICAgICBtUGFyZW50KHBhcmVudCksCiAgICAgICAgIG1TdGF0dXNUcmFja2VyKHN0YXR1c1RyYWNrZXIpLApAQCAtNDA4OCw2ICs0ODc3LDcgQEAKICAgICAgICAgbVJlY29uZmlndXJlZChmYWxzZSksCiAgICAgICAgIG1Eb1BhdXNlKGZhbHNlKSwKICAgICAgICAgbVBhdXNlZCh0cnVlKSwKKyAgICAgICAgbU5vdGlmeVBpcGVsaW5lRHJhaW4oZmFsc2UpLAogICAgICAgICBtRnJhbWVOdW1iZXIoMCksCiAgICAgICAgIG1MYXRlc3RSZXF1ZXN0SWQoTkFNRV9OT1RfRk9VTkQpLAogICAgICAgICBtQ3VycmVudEFmVHJpZ2dlcklkKDApLApAQCAtNDA5OCw3ICs0ODg4LDggQEAKICAgICAgICAgbUNvbnN0cmFpbmVkTW9kZShmYWxzZSksCiAgICAgICAgIG1SZXF1ZXN0TGF0ZW5jeShrUmVxdWVzdExhdGVuY3lCaW5TaXplKSwKICAgICAgICAgbVNlc3Npb25QYXJhbUtleXMoc2Vzc2lvblBhcmFtS2V5cyksCi0gICAgICAgIG1MYXRlc3RTZXNzaW9uUGFyYW1zKHNlc3Npb25QYXJhbUtleXMuc2l6ZSgpKSB7CisgICAgICAgIG1MYXRlc3RTZXNzaW9uUGFyYW1zKHNlc3Npb25QYXJhbUtleXMuc2l6ZSgpKSwKKyAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIodXNlSGFsQnVmTWFuYWdlcikgewogICAgIG1TdGF0dXNJZCA9IHN0YXR1c1RyYWNrZXItPmFkZENvbXBvbmVudCgpOwogfQogCkBAIC00Mzg4LDI4ICs1MTc5LDcgQEAKICAgICAgICAgTmV4dFJlcXVlc3QmIG5leHRSZXF1ZXN0ID0gbU5leHRSZXF1ZXN0cy5lZGl0SXRlbUF0KGkpOwogICAgICAgICBuZXh0UmVxdWVzdC5zdWJtaXR0ZWQgPSB0cnVlOwogCi0KLSAgICAgICAgLy8gVXBkYXRlIHRoZSBsYXRlc3QgcmVxdWVzdCBzZW50IHRvIEhBTAotICAgICAgICBpZiAobmV4dFJlcXVlc3QuaGFsUmVxdWVzdC5zZXR0aW5ncyAhPSBOVUxMKSB7IC8vIERvbid0IHVwZGF0ZSBpZiB0aGV5IHdlcmUgdW5jaGFuZ2VkCi0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYWwobUxhdGVzdFJlcXVlc3RNdXRleCk7Ci0KLSAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90KiBjbG9uZWQgPSBjbG9uZV9jYW1lcmFfbWV0YWRhdGEobmV4dFJlcXVlc3QuaGFsUmVxdWVzdC5zZXR0aW5ncyk7Ci0gICAgICAgICAgICBtTGF0ZXN0UmVxdWVzdC5hY3F1aXJlKGNsb25lZCk7Ci0KLSAgICAgICAgICAgIHNwPENhbWVyYTNEZXZpY2U+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOwotICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcGFyZW50LT5tb25pdG9yTWV0YWRhdGEoVGFnTW9uaXRvcjo6UkVRVUVTVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5leHRSZXF1ZXN0LmhhbFJlcXVlc3QuZnJhbWVfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgMCwgbUxhdGVzdFJlcXVlc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5leHRSZXF1ZXN0LmhhbFJlcXVlc3Quc2V0dGluZ3MgIT0gTlVMTCkgewotICAgICAgICAgICAgbmV4dFJlcXVlc3QuY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5nc0xpc3QuYmVnaW4oKS0+bWV0YWRhdGEudW5sb2NrKAotICAgICAgICAgICAgICAgICAgICBuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0LnNldHRpbmdzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNsZWFudXBQaHlzaWNhbFNldHRpbmdzKG5leHRSZXF1ZXN0LmNhcHR1cmVSZXF1ZXN0LCAmbmV4dFJlcXVlc3QuaGFsUmVxdWVzdCk7CisgICAgICAgIHVwZGF0ZU5leHRSZXF1ZXN0KG5leHRSZXF1ZXN0KTsKIAogICAgICAgICBpZiAoIXRyaWdnZXJSZW1vdmVGYWlsZWQpIHsKICAgICAgICAgICAgIC8vIFJlbW92ZSBhbnkgcHJldmlvdXNseSBxdWV1ZWQgdHJpZ2dlcnMgKGFmdGVyIHVubG9jaykKQEAgLTQ0NDIsNjIgKzUyMTIsNiBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnNlbmRSZXF1ZXN0c09uZUJ5T25lKCkgewotICAgIHN0YXR1c190IHJlczsKLQotICAgIGZvciAoYXV0byYgbmV4dFJlcXVlc3QgOiBtTmV4dFJlcXVlc3RzKSB7Ci0gICAgICAgIC8vIFN1Ym1pdCByZXF1ZXN0IGFuZCBibG9jayB1bnRpbCByZWFkeSBmb3IgbmV4dCBvbmUKLSAgICAgICAgQVRSQUNFX0FTWU5DX0JFR0lOKCJmcmFtZSBjYXB0dXJlIiwgbmV4dFJlcXVlc3QuaGFsUmVxdWVzdC5mcmFtZV9udW1iZXIpOwotICAgICAgICByZXMgPSBtSW50ZXJmYWNlLT5wcm9jZXNzQ2FwdHVyZVJlcXVlc3QoJm5leHRSZXF1ZXN0LmhhbFJlcXVlc3QpOwotCi0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIC8vIFNob3VsZCBvbmx5IGdldCBhIGZhaWx1cmUgaGVyZSBmb3IgbWFsZm9ybWVkIHJlcXVlc3RzIG9yIGRldmljZS1sZXZlbAotICAgICAgICAgICAgLy8gZXJyb3JzLCBzbyBjb25zaWRlciBhbGwgZXJyb3JzIGZhdGFsLiAgQmFkIG1ldGFkYXRhIGZhaWx1cmVzIHNob3VsZAotICAgICAgICAgICAgLy8gY29tZSB0aHJvdWdoIG5vdGlmeS4KLSAgICAgICAgICAgIFNFVF9FUlIoIlJlcXVlc3RUaHJlYWQ6IFVuYWJsZSB0byBzdWJtaXQgY2FwdHVyZSByZXF1ZXN0ICVkIHRvIEhBTCIKLSAgICAgICAgICAgICAgICAgICAgIiBkZXZpY2U6ICVzICglZCkiLCBuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0LmZyYW1lX251bWJlciwgc3RyZXJyb3IoLXJlcyksCi0gICAgICAgICAgICAgICAgICAgIHJlcyk7Ci0gICAgICAgICAgICBjbGVhblVwRmFpbGVkUmVxdWVzdHMoLypzZW5kUmVxdWVzdEVycm9yKi8gZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTWFyayB0aGF0IHRoZSByZXF1ZXN0IGhhcyBiZSBzdWJtaXR0ZWQgc3VjY2Vzc2Z1bGx5LgotICAgICAgICBuZXh0UmVxdWVzdC5zdWJtaXR0ZWQgPSB0cnVlOwotCi0gICAgICAgIC8vIFVwZGF0ZSB0aGUgbGF0ZXN0IHJlcXVlc3Qgc2VudCB0byBIQUwKLSAgICAgICAgaWYgKG5leHRSZXF1ZXN0LmhhbFJlcXVlc3Quc2V0dGluZ3MgIT0gTlVMTCkgeyAvLyBEb24ndCB1cGRhdGUgaWYgdGhleSB3ZXJlIHVuY2hhbmdlZAotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1MYXRlc3RSZXF1ZXN0TXV0ZXgpOwotCi0gICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCogY2xvbmVkID0gY2xvbmVfY2FtZXJhX21ldGFkYXRhKG5leHRSZXF1ZXN0LmhhbFJlcXVlc3Quc2V0dGluZ3MpOwotICAgICAgICAgICAgbUxhdGVzdFJlcXVlc3QuYWNxdWlyZShjbG9uZWQpOwotCi0gICAgICAgICAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKLSAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHBhcmVudC0+bW9uaXRvck1ldGFkYXRhKFRhZ01vbml0b3I6OlJFUVVFU1QsIG5leHRSZXF1ZXN0LmhhbFJlcXVlc3QuZnJhbWVfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgMCwgbUxhdGVzdFJlcXVlc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5leHRSZXF1ZXN0LmhhbFJlcXVlc3Quc2V0dGluZ3MgIT0gTlVMTCkgewotICAgICAgICAgICAgbmV4dFJlcXVlc3QuY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5nc0xpc3QuYmVnaW4oKS0+bWV0YWRhdGEudW5sb2NrKAotICAgICAgICAgICAgICAgICAgICBuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0LnNldHRpbmdzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNsZWFudXBQaHlzaWNhbFNldHRpbmdzKG5leHRSZXF1ZXN0LmNhcHR1cmVSZXF1ZXN0LCAmbmV4dFJlcXVlc3QuaGFsUmVxdWVzdCk7Ci0KLSAgICAgICAgLy8gUmVtb3ZlIGFueSBwcmV2aW91c2x5IHF1ZXVlZCB0cmlnZ2VycyAoYWZ0ZXIgdW5sb2NrKQotICAgICAgICByZXMgPSByZW1vdmVUcmlnZ2VycyhtUHJldlJlcXVlc3QpOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBTRVRfRVJSKCJSZXF1ZXN0VGhyZWFkOiBVbmFibGUgdG8gcmVtb3ZlIHRyaWdnZXJzICIKLSAgICAgICAgICAgICAgICAgICIoY2FwdHVyZSByZXF1ZXN0ICVkLCBIQUwgZGV2aWNlOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgIG5leHRSZXF1ZXN0LmhhbFJlcXVlc3QuZnJhbWVfbnVtYmVyLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgICAgIGNsZWFuVXBGYWlsZWRSZXF1ZXN0cygvKnNlbmRSZXF1ZXN0RXJyb3IqLyBmYWxzZSk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KIG5zZWNzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6Y2FsY3VsYXRlTWF4RXhwZWN0ZWREdXJhdGlvbihjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcmVxdWVzdCkgewogICAgIG5zZWNzX3QgbWF4RXhwZWN0ZWREdXJhdGlvbiA9IGtEZWZhdWx0RXhwZWN0ZWREdXJhdGlvbjsKICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlID0gY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QoKTsKQEAgLTQ1NDUsMTMgKzUyNTksNDUgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6dXBkYXRlTmV4dFJlcXVlc3QoTmV4dFJlcXVlc3QmIG5leHRSZXF1ZXN0KSB7CisgICAgLy8gVXBkYXRlIHRoZSBsYXRlc3QgcmVxdWVzdCBzZW50IHRvIEhBTAorICAgIGlmIChuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0LnNldHRpbmdzICE9IE5VTEwpIHsgLy8gRG9uJ3QgdXBkYXRlIGlmIHRoZXkgd2VyZSB1bmNoYW5nZWQKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1MYXRlc3RSZXF1ZXN0TXV0ZXgpOworCisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90KiBjbG9uZWQgPSBjbG9uZV9jYW1lcmFfbWV0YWRhdGEobmV4dFJlcXVlc3QuaGFsUmVxdWVzdC5zZXR0aW5ncyk7CisgICAgICAgIG1MYXRlc3RSZXF1ZXN0LmFjcXVpcmUoY2xvbmVkKTsKKworICAgICAgICBtTGF0ZXN0UGh5c2ljYWxSZXF1ZXN0LmNsZWFyKCk7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0Lm51bV9waHlzY2FtX3NldHRpbmdzOyBpKyspIHsKKyAgICAgICAgICAgIGNsb25lZCA9IGNsb25lX2NhbWVyYV9tZXRhZGF0YShuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0LnBoeXNjYW1fc2V0dGluZ3NbaV0pOworICAgICAgICAgICAgbUxhdGVzdFBoeXNpY2FsUmVxdWVzdC5lbXBsYWNlKG5leHRSZXF1ZXN0LmhhbFJlcXVlc3QucGh5c2NhbV9pZFtpXSwKKyAgICAgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEoY2xvbmVkKSk7CisgICAgICAgIH0KKworICAgICAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICAgICAgaWYgKHBhcmVudCAhPSBOVUxMKSB7CisgICAgICAgICAgICBwYXJlbnQtPm1vbml0b3JNZXRhZGF0YShUYWdNb25pdG9yOjpSRVFVRVNULAorICAgICAgICAgICAgICAgICAgICBuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0LmZyYW1lX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgMCwgbUxhdGVzdFJlcXVlc3QsIG1MYXRlc3RQaHlzaWNhbFJlcXVlc3QpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG5leHRSZXF1ZXN0LmhhbFJlcXVlc3Quc2V0dGluZ3MgIT0gTlVMTCkgeworICAgICAgICBuZXh0UmVxdWVzdC5jYXB0dXJlUmVxdWVzdC0+bVNldHRpbmdzTGlzdC5iZWdpbigpLT5tZXRhZGF0YS51bmxvY2soCisgICAgICAgICAgICAgICAgbmV4dFJlcXVlc3QuaGFsUmVxdWVzdC5zZXR0aW5ncyk7CisgICAgfQorCisgICAgY2xlYW51cFBoeXNpY2FsU2V0dGluZ3MobmV4dFJlcXVlc3QuY2FwdHVyZVJlcXVlc3QsICZuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0KTsKK30KKwogYm9vbCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjp1cGRhdGVTZXNzaW9uUGFyYW1ldGVycyhjb25zdCBDYW1lcmFNZXRhZGF0YSYgc2V0dGluZ3MpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGJvb2wgdXBkYXRlc0RldGVjdGVkID0gZmFsc2U7CiAKKyAgICBDYW1lcmFNZXRhZGF0YSB1cGRhdGVkUGFyYW1zKG1MYXRlc3RTZXNzaW9uUGFyYW1zKTsKICAgICBmb3IgKGF1dG8gdGFnIDogbVNlc3Npb25QYXJhbUtleXMpIHsKICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGVudHJ5ID0gc2V0dGluZ3MuZmluZCh0YWcpOwotICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgbGFzdEVudHJ5ID0gbUxhdGVzdFNlc3Npb25QYXJhbXMuZmluZCh0YWcpOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgbGFzdEVudHJ5ID0gdXBkYXRlZFBhcmFtcy5maW5kKHRhZyk7CiAKICAgICAgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgewogICAgICAgICAgICAgYm9vbCBpc0RpZmZlcmVudCA9IGZhbHNlOwpAQCAtNDU4MCwxNyArNTMyNiwyNiBAQAogICAgICAgICAgICAgICAgIGlmICghc2tpcEhGUlRhcmdldEZQU1VwZGF0ZSh0YWcsIGVudHJ5LCBsYXN0RW50cnkpKSB7CiAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZXNEZXRlY3RlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1MYXRlc3RTZXNzaW9uUGFyYW1zLnVwZGF0ZShlbnRyeSk7CisgICAgICAgICAgICAgICAgdXBkYXRlZFBhcmFtcy51cGRhdGUoZW50cnkpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKGxhc3RFbnRyeS5jb3VudCA+IDApIHsKICAgICAgICAgICAgIC8vIFZhbHVlIGhhcyBiZWVuIHJlbW92ZWQKICAgICAgICAgICAgIEFMT0dWKCIlczogU2Vzc2lvbiBwYXJhbWV0ZXIgdGFnIGlkICVkIHJlbW92ZWQiLCBfX0ZVTkNUSU9OX18sIHRhZyk7Ci0gICAgICAgICAgICBtTGF0ZXN0U2Vzc2lvblBhcmFtcy5lcmFzZSh0YWcpOworICAgICAgICAgICAgdXBkYXRlZFBhcmFtcy5lcmFzZSh0YWcpOwogICAgICAgICAgICAgdXBkYXRlc0RldGVjdGVkID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiB1cGRhdGVzRGV0ZWN0ZWQ7CisgICAgYm9vbCByZWNvbmZpZ3VyZVJlcXVpcmVkOworICAgIGlmICh1cGRhdGVzRGV0ZWN0ZWQpIHsKKyAgICAgICAgcmVjb25maWd1cmVSZXF1aXJlZCA9IG1JbnRlcmZhY2UtPmlzUmVjb25maWd1cmF0aW9uUmVxdWlyZWQobUxhdGVzdFNlc3Npb25QYXJhbXMsCisgICAgICAgICAgICAgICAgdXBkYXRlZFBhcmFtcyk7CisgICAgICAgIG1MYXRlc3RTZXNzaW9uUGFyYW1zID0gdXBkYXRlZFBhcmFtczsKKyAgICB9IGVsc2UgeworICAgICAgICByZWNvbmZpZ3VyZVJlcXVpcmVkID0gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHJlY29uZmlndXJlUmVxdWlyZWQ7CiB9CiAKIGJvb2wgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6dGhyZWFkTG9vcCgpIHsKQEAgLTQ3MDMsMTMgKzU0NTgsMTUgQEAKICAgICBBTE9HVlYoIiVzOiAlZDogc3VibWl0dGluZyAlenUgcmVxdWVzdHMgaW4gYSBiYXRjaC4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAogICAgICAgICAgICAgbU5leHRSZXF1ZXN0cy5zaXplKCkpOwogCisgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHBhcmVudCAhPSBudWxscHRyKSB7CisgICAgICAgIHBhcmVudC0+bVJlcXVlc3RCdWZmZXJTTS5vblN1Ym1pdHRpbmdSZXF1ZXN0KCk7CisgICAgfQorCiAgICAgYm9vbCBzdWJtaXRSZXF1ZXN0U3VjY2VzcyA9IGZhbHNlOwogICAgIG5zZWNzX3QgdFJlcXVlc3RTdGFydCA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBpZiAobUludGVyZmFjZS0+c3VwcG9ydEJhdGNoUmVxdWVzdCgpKSB7Ci0gICAgICAgIHN1Ym1pdFJlcXVlc3RTdWNjZXNzID0gc2VuZFJlcXVlc3RzQmF0Y2goKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzdWJtaXRSZXF1ZXN0U3VjY2VzcyA9IHNlbmRSZXF1ZXN0c09uZUJ5T25lKCk7Ci0gICAgfQorICAgIHN1Ym1pdFJlcXVlc3RTdWNjZXNzID0gc2VuZFJlcXVlc3RzQmF0Y2goKTsKKwogICAgIG5zZWNzX3QgdFJlcXVlc3RFbmQgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7CiAgICAgbVJlcXVlc3RMYXRlbmN5LmFkZCh0UmVxdWVzdFN0YXJ0LCB0UmVxdWVzdEVuZCk7CiAKQEAgLTQ3MjksNiArNTQ4Niw3IEBACiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpwcmVwYXJlSGFsUmVxdWVzdHMoKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIAorICAgIGJvb2wgYmF0Y2hlZFJlcXVlc3QgPSBtTmV4dFJlcXVlc3RzWzBdLmNhcHR1cmVSZXF1ZXN0LT5tQmF0Y2hTaXplID4gMTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OZXh0UmVxdWVzdHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgYXV0byYgbmV4dFJlcXVlc3QgPSBtTmV4dFJlcXVlc3RzLmVkaXRJdGVtQXQoaSk7CiAgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiBjYXB0dXJlUmVxdWVzdCA9IG5leHRSZXF1ZXN0LmNhcHR1cmVSZXF1ZXN0OwpAQCAtNDc1Miw3ICs1NTEwLDEwIEBACiAgICAgICAgIG1QcmV2VHJpZ2dlcnMgPSB0cmlnZ2VyQ291bnQ7CiAKICAgICAgICAgLy8gSWYgdGhlIHJlcXVlc3QgaXMgdGhlIHNhbWUgYXMgbGFzdCwgb3Igd2UgaGFkIHRyaWdnZXJzIGxhc3QgdGltZQotICAgICAgICBib29sIG5ld1JlcXVlc3QgPSBtUHJldlJlcXVlc3QgIT0gY2FwdHVyZVJlcXVlc3QgfHwgdHJpZ2dlcnNNaXhlZEluOworICAgICAgICBib29sIG5ld1JlcXVlc3QgPSAobVByZXZSZXF1ZXN0ICE9IGNhcHR1cmVSZXF1ZXN0IHx8IHRyaWdnZXJzTWl4ZWRJbikgJiYKKyAgICAgICAgICAgICAgICAvLyBSZXF1ZXN0IHNldHRpbmdzIGFyZSBhbGwgdGhlIHNhbWUgd2l0aGluIG9uZSBiYXRjaCwgc28gb25seSB0cmVhdCB0aGUgZmlyc3QKKyAgICAgICAgICAgICAgICAvLyByZXF1ZXN0IGluIGEgYmF0Y2ggYXMgbmV3CisgICAgICAgICAgICAgICAgIShiYXRjaGVkUmVxdWVzdCAmJiBpID4gMCk7CiAgICAgICAgIGlmIChuZXdSZXF1ZXN0KSB7CiAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAqIEhBTCB3b3JrYXJvdW5kOgpAQCAtNDc3MCwxMyArNTUzMSwyMSBAQAogICAgICAgICAgICAgICAgIC8vIENvcnJlY3QgbWV0YWRhdGEgcmVnaW9ucyBmb3IgZGlzdG9ydGlvbiBjb3JyZWN0aW9uIGlmIGVuYWJsZWQKICAgICAgICAgICAgICAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKICAgICAgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzID0gcGFyZW50LT5tRGlzdG9ydGlvbk1hcHBlci5jb3JyZWN0Q2FwdHVyZVJlcXVlc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAmKGNhcHR1cmVSZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmJlZ2luKCktPm1ldGFkYXRhKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9FUlIoIlJlcXVlc3RUaHJlYWQ6IFVuYWJsZSB0byBjb3JyZWN0IGNhcHR1cmUgcmVxdWVzdHMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIGxlbnMgZGlzdG9ydGlvbiBmb3IgcmVxdWVzdCAlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbFJlcXVlc3QtPmZyYW1lX251bWJlciwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgIExpc3Q8UGh5c2ljYWxDYW1lcmFTZXR0aW5ncz46Oml0ZXJhdG9yIGl0OworICAgICAgICAgICAgICAgICAgICBmb3IgKGl0ID0gY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5nc0xpc3QuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBjYXB0dXJlUmVxdWVzdC0+bVNldHRpbmdzTGlzdC5lbmQoKTsgaXQrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudC0+bURpc3RvcnRpb25NYXBwZXJzLmZpbmQoaXQtPmNhbWVyYUlkKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQtPm1EaXN0b3J0aW9uTWFwcGVycy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gcGFyZW50LT5tRGlzdG9ydGlvbk1hcHBlcnNbaXQtPmNhbWVyYUlkXS5jb3JyZWN0Q2FwdHVyZVJlcXVlc3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihpdC0+bWV0YWRhdGEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfRVJSKCJSZXF1ZXN0VGhyZWFkOiBVbmFibGUgdG8gY29ycmVjdCBjYXB0dXJlIHJlcXVlc3RzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgbGVucyBkaXN0b3J0aW9uIGZvciByZXF1ZXN0ICVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbFJlcXVlc3QtPmZyYW1lX251bWJlciwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNDg0NCwxNSArNTYxMywyOCBAQAogICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3RyZWFtcy5zaXplKCkpOwogICAgICAgICBoYWxSZXF1ZXN0LT5vdXRwdXRfYnVmZmVycyA9IG91dHB1dEJ1ZmZlcnMtPmFycmF5KCk7CiAgICAgICAgIHN0ZDo6c2V0PFN0cmluZzg+IHJlcXVlc3RlZFBoeXNpY2FsQ2FtZXJhczsKKworICAgICAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICAgICAgaWYgKHBhcmVudCA9PSBOVUxMKSB7CisgICAgICAgICAgICAvLyBTaG91bGQgbm90IGhhcHBlbiwgYW5kIG5vd2hlcmUgdG8gc2VuZCBlcnJvcnMgdG8sIHNvIGp1c3QgbG9nIGl0CisgICAgICAgICAgICBDTE9HRSgiUmVxdWVzdFRocmVhZDogUGFyZW50IGlzIGdvbmUiKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBuc2Vjc190IHdhaXREdXJhdGlvbiA9IGtCYXNlR2V0QnVmZmVyV2FpdCArIHBhcmVudC0+Z2V0RXhwZWN0ZWRJbkZsaWdodER1cmF0aW9uKCk7CisKKyAgICAgICAgU3VyZmFjZU1hcCB1bmlxdWVTdXJmYWNlSWRNYXA7CiAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdHJlYW1zLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBvdXRwdXRTdHJlYW0gPSBjYXB0dXJlUmVxdWVzdC0+bU91dHB1dFN0cmVhbXMuZWRpdEl0ZW1BdChqKTsKKyAgICAgICAgICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IG91dHB1dFN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3RyZWFtcy5lZGl0SXRlbUF0KGopOworICAgICAgICAgICAgaW50IHN0cmVhbUlkID0gb3V0cHV0U3RyZWFtLT5nZXRJZCgpOwogCiAgICAgICAgICAgICAvLyBQcmVwYXJlIHZpZGVvIGJ1ZmZlcnMgZm9yIGhpZ2ggc3BlZWQgcmVjb3JkaW5nIG9uIHRoZSBmaXJzdCB2aWRlbyByZXF1ZXN0LgogICAgICAgICAgICAgaWYgKG1QcmVwYXJlVmlkZW9TdHJlYW0gJiYgb3V0cHV0U3RyZWFtLT5pc1ZpZGVvU3RyZWFtKCkpIHsKICAgICAgICAgICAgICAgICAvLyBPbmx5IHRyeSB0byBwcmVwYXJlIHZpZGVvIHN0cmVhbSBvbiB0aGUgZmlyc3QgdmlkZW8gcmVxdWVzdC4KICAgICAgICAgICAgICAgICBtUHJlcGFyZVZpZGVvU3RyZWFtID0gZmFsc2U7CiAKLSAgICAgICAgICAgICAgICByZXMgPSBvdXRwdXRTdHJlYW0tPnN0YXJ0UHJlcGFyZShDYW1lcmEzU3RyZWFtSW50ZXJmYWNlOjpBTExPQ0FURV9QSVBFTElORV9NQVgpOworICAgICAgICAgICAgICAgIHJlcyA9IG91dHB1dFN0cmVhbS0+c3RhcnRQcmVwYXJlKENhbWVyYTNTdHJlYW1JbnRlcmZhY2U6OkFMTE9DQVRFX1BJUEVMSU5FX01BWCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qYmxvY2tSZXF1ZXN0Ki8pOwogICAgICAgICAgICAgICAgIHdoaWxlIChyZXMgPT0gTk9UX0VOT1VHSF9EQVRBKSB7CiAgICAgICAgICAgICAgICAgICAgIHJlcyA9IG91dHB1dFN0cmVhbS0+cHJlcGFyZU5leHRCdWZmZXIoKTsKICAgICAgICAgICAgICAgICB9CkBAIC00ODYzLDE2ICs1NjQ1LDYxIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICByZXMgPSBvdXRwdXRTdHJlYW0tPmdldEJ1ZmZlcigmb3V0cHV0QnVmZmVycy0+ZWRpdEl0ZW1BdChqKSwKLSAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdXJmYWNlc1tqXSk7Ci0gICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2FuJ3QgZ2V0IG91dHB1dCBidWZmZXIgZnJvbSBncmFsbG9jIHF1ZXVlIC0gdGhpcyBjb3VsZCBiZSBkdWUgdG8KLSAgICAgICAgICAgICAgICAvLyBhYmFuZG9uZWQgcXVldWUgb3Igb3RoZXIgY29uc3VtZXIgbWlzYmVoYXZpb3IsIHNvIG5vdCBhIGZhdGFsCi0gICAgICAgICAgICAgICAgLy8gZXJyb3IKLSAgICAgICAgICAgICAgICBBTE9HRSgiUmVxdWVzdFRocmVhZDogQ2FuJ3QgZ2V0IG91dHB1dCBidWZmZXIsIHNraXBwaW5nIHJlcXVlc3Q6IgotICAgICAgICAgICAgICAgICAgICAgICAgIiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+IHVuaXF1ZVN1cmZhY2VJZHM7CisgICAgICAgICAgICByZXMgPSBvdXRwdXRTdHJlYW0tPmdldFVuaXF1ZVN1cmZhY2VJZHMoCisgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3VyZmFjZXNbc3RyZWFtSWRdLAorICAgICAgICAgICAgICAgICAgICAmdW5pcXVlU3VyZmFjZUlkcyk7CisgICAgICAgICAgICAvLyBJTlZBTElEX09QRVJBVElPTiBpcyBub3JtYWwgb3V0cHV0IGZvciBzdHJlYW1zIG5vdCBzdXBwb3J0aW5nIHN1cmZhY2VJZHMKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0sgJiYgcmVzICE9IElOVkFMSURfT1BFUkFUSU9OKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gcXVlcnkgc3RyZWFtICVkIHVuaXF1ZSBzdXJmYWNlIElEcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlcyA9PSBPSykgeworICAgICAgICAgICAgICAgIHVuaXF1ZVN1cmZhY2VJZE1hcC5pbnNlcnQoe3N0cmVhbUlkLCBzdGQ6Om1vdmUodW5pcXVlU3VyZmFjZUlkcyl9KTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIHJldHVybiBUSU1FRF9PVVQ7CisgICAgICAgICAgICBpZiAobVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0U3RyZWFtLT5pc0FiYW5kb25lZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogc3RyZWFtICVkIGlzIGFiYW5kb25lZCwgc2tpcHBpbmcgcmVxdWVzdCIsIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVElNRURfT1VUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBIQUwgd2lsbCByZXF1ZXN0IGJ1ZmZlciB0aHJvdWdoIHJlcXVlc3RTdHJlYW1CdWZmZXIgQVBJCisgICAgICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QmIGJ1ZmZlciA9IG91dHB1dEJ1ZmZlcnMtPmVkaXRJdGVtQXQoaik7CisgICAgICAgICAgICAgICAgYnVmZmVyLnN0cmVhbSA9IG91dHB1dFN0cmVhbS0+YXNIYWxTdHJlYW0oKTsKKyAgICAgICAgICAgICAgICBidWZmZXIuYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBidWZmZXIuc3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX09LOworICAgICAgICAgICAgICAgIGJ1ZmZlci5hY3F1aXJlX2ZlbmNlID0gLTE7CisgICAgICAgICAgICAgICAgYnVmZmVyLnJlbGVhc2VfZmVuY2UgPSAtMTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzID0gb3V0cHV0U3RyZWFtLT5nZXRCdWZmZXIoJm91dHB1dEJ1ZmZlcnMtPmVkaXRJdGVtQXQoaiksCisgICAgICAgICAgICAgICAgICAgICAgICB3YWl0RHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bU91dHB1dFN1cmZhY2VzW3N0cmVhbUlkXSk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAvLyBDYW4ndCBnZXQgb3V0cHV0IGJ1ZmZlciBmcm9tIGdyYWxsb2MgcXVldWUgLSB0aGlzIGNvdWxkIGJlIGR1ZSB0bworICAgICAgICAgICAgICAgICAgICAvLyBhYmFuZG9uZWQgcXVldWUgb3Igb3RoZXIgY29uc3VtZXIgbWlzYmVoYXZpb3IsIHNvIG5vdCBhIGZhdGFsCisgICAgICAgICAgICAgICAgICAgIC8vIGVycm9yCisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJSZXF1ZXN0VGhyZWFkOiBDYW4ndCBnZXQgb3V0cHV0IGJ1ZmZlciwgc2tpcHBpbmcgcmVxdWVzdDoiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRJTUVEX09VVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgc3RyZWFtQ2FtZXJhSWQgPSBvdXRwdXRTdHJlYW0tPmdldFBoeXNpY2FsQ2FtZXJhSWQoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBzZXR0aW5ncyA6IGNhcHR1cmVSZXF1ZXN0LT5tU2V0dGluZ3NMaXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHN0cmVhbUNhbWVyYUlkLmlzRW1wdHkoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQtPmdldElkKCkgPT0gc2V0dGluZ3MuY2FtZXJhSWQuY19zdHIoKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtQ2FtZXJhSWQgPT0gc2V0dGluZ3MuY2FtZXJhSWQuY19zdHIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS0+ZmlyZUJ1ZmZlclJlcXVlc3RGb3JGcmFtZU51bWJlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZ3MubWV0YWRhdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBTdHJpbmc4IHBoeXNpY2FsQ2FtZXJhSWQgPSBvdXRwdXRTdHJlYW0tPmdldFBoeXNpY2FsQ2FtZXJhSWQoKTsKQEAgLTQ4OTAsMjYgKzU3MTcsMzYgQEAKICAgICAgICAgdG90YWxOdW1CdWZmZXJzICs9IGhhbFJlcXVlc3QtPm51bV9vdXRwdXRfYnVmZmVyczsKIAogICAgICAgICAvLyBMb2cgcmVxdWVzdCBpbiB0aGUgaW4tZmxpZ2h0IHF1ZXVlCi0gICAgICAgIHNwPENhbWVyYTNEZXZpY2U+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOwotICAgICAgICBpZiAocGFyZW50ID09IE5VTEwpIHsKLSAgICAgICAgICAgIC8vIFNob3VsZCBub3QgaGFwcGVuLCBhbmQgbm93aGVyZSB0byBzZW5kIGVycm9ycyB0bywgc28ganVzdCBsb2cgaXQKLSAgICAgICAgICAgIENMT0dFKCJSZXF1ZXN0VGhyZWFkOiBQYXJlbnQgaXMgZ29uZSIpOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0KICAgICAgICAgLy8gSWYgdGhpcyByZXF1ZXN0IGxpc3QgaXMgZm9yIGNvbnN0cmFpbmVkIGhpZ2ggc3BlZWQgcmVjb3JkaW5nIChub3QKICAgICAgICAgLy8gcHJldmlldyksIGFuZCB0aGUgY3VycmVudCByZXF1ZXN0IGlzIG5vdCB0aGUgbGFzdCBvbmUgaW4gdGhlIGJhdGNoLAogICAgICAgICAvLyBkbyBub3Qgc2VuZCBjYWxsYmFjayB0byB0aGUgYXBwLgogICAgICAgICBib29sIGhhc0NhbGxiYWNrID0gdHJ1ZTsKLSAgICAgICAgaWYgKG1OZXh0UmVxdWVzdHNbMF0uY2FwdHVyZVJlcXVlc3QtPm1CYXRjaFNpemUgPiAxICYmIGkgIT0gbU5leHRSZXF1ZXN0cy5zaXplKCktMSkgeworICAgICAgICBpZiAoYmF0Y2hlZFJlcXVlc3QgJiYgaSAhPSBtTmV4dFJlcXVlc3RzLnNpemUoKS0xKSB7CiAgICAgICAgICAgICBoYXNDYWxsYmFjayA9IGZhbHNlOwogICAgICAgICB9CisgICAgICAgIGJvb2wgaXNTdGlsbENhcHR1cmUgPSBmYWxzZTsKKyAgICAgICAgYm9vbCBpc1pzbENhcHR1cmUgPSBmYWxzZTsKKyAgICAgICAgaWYgKCFtTmV4dFJlcXVlc3RzWzBdLmNhcHR1cmVSZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmJlZ2luKCktPm1ldGFkYXRhLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZSA9IGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90KCk7CisgICAgICAgICAgICBmaW5kX2NhbWVyYV9tZXRhZGF0YV9yb19lbnRyeShoYWxSZXF1ZXN0LT5zZXR0aW5ncywgQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5ULCAmZSk7CisgICAgICAgICAgICBpZiAoKGUuY291bnQgPiAwKSAmJiAoZS5kYXRhLnU4WzBdID09IEFORFJPSURfQ09OVFJPTF9DQVBUVVJFX0lOVEVOVF9TVElMTF9DQVBUVVJFKSkgeworICAgICAgICAgICAgICAgIGlzU3RpbGxDYXB0dXJlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBBVFJBQ0VfQVNZTkNfQkVHSU4oInN0aWxsIGNhcHR1cmUiLCBtTmV4dFJlcXVlc3RzW2ldLmhhbFJlcXVlc3QuZnJhbWVfbnVtYmVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZmluZF9jYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkoaGFsUmVxdWVzdC0+c2V0dGluZ3MsIEFORFJPSURfQ09OVFJPTF9FTkFCTEVfWlNMLCAmZSk7CisgICAgICAgICAgICBpZiAoKGUuY291bnQgPiAwKSAmJiAoZS5kYXRhLnU4WzBdID09IEFORFJPSURfQ09OVFJPTF9FTkFCTEVfWlNMX1RSVUUpKSB7CisgICAgICAgICAgICAgICAgaXNac2xDYXB0dXJlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgICAgICByZXMgPSBwYXJlbnQtPnJlZ2lzdGVySW5GbGlnaHQoaGFsUmVxdWVzdC0+ZnJhbWVfbnVtYmVyLAogICAgICAgICAgICAgICAgIHRvdGFsTnVtQnVmZmVycywgY2FwdHVyZVJlcXVlc3QtPm1SZXN1bHRFeHRyYXMsCiAgICAgICAgICAgICAgICAgLypoYXNJbnB1dCovaGFsUmVxdWVzdC0+aW5wdXRfYnVmZmVyICE9IE5VTEwsCiAgICAgICAgICAgICAgICAgaGFzQ2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgY2FsY3VsYXRlTWF4RXhwZWN0ZWREdXJhdGlvbihoYWxSZXF1ZXN0LT5zZXR0aW5ncyksCi0gICAgICAgICAgICAgICAgcmVxdWVzdGVkUGh5c2ljYWxDYW1lcmFzKTsKKyAgICAgICAgICAgICAgICByZXF1ZXN0ZWRQaHlzaWNhbENhbWVyYXMsIGlzU3RpbGxDYXB0dXJlLCBpc1pzbENhcHR1cmUsCisgICAgICAgICAgICAgICAgKG1Vc2VIYWxCdWZNYW5hZ2VyKSA/IHVuaXF1ZVN1cmZhY2VJZE1hcCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cmZhY2VNYXB7fSk7CiAgICAgICAgIEFMT0dWVigiJXM6IHJlZ2lzdGVyZWQgaW4gZmxpZ2h0IHJlcXVlc3RJZCA9ICUiIFBSSWQzMiAiLCBmcmFtZU51bWJlciA9ICUiIFBSSWQ2NAogICAgICAgICAgICAgICAgIiwgYnVyc3RJZCA9ICUiIFBSSWQzMiAiLiIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLApAQCAtNDk4NSw3ICs1ODIyLDcgQEAKICAgICAgICAgICAgIGlmIChzLmZpcnN0ID09IHN0cmVhbUlkKSB7CiAgICAgICAgICAgICAgICAgY29uc3QgYXV0byAmaXQgPSBzdGQ6OmZpbmQocy5zZWNvbmQuYmVnaW4oKSwgcy5zZWNvbmQuZW5kKCksIHN1cmZhY2VJZCk7CiAgICAgICAgICAgICAgICAgaWYgKGl0ICE9IHMuc2Vjb25kLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC00OTk2LDcgKzU4MzMsNyBAQAogICAgICAgICAgICAgaWYgKHMuZmlyc3QgPT0gc3RyZWFtSWQpIHsKICAgICAgICAgICAgICAgICBjb25zdCBhdXRvICZpdCA9IHN0ZDo6ZmluZChzLnNlY29uZC5iZWdpbigpLCBzLnNlY29uZC5lbmQoKSwgc3VyZmFjZUlkKTsKICAgICAgICAgICAgICAgICBpZiAoaXQgIT0gcy5zZWNvbmQuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTUwMDUsNiArNTg0MiwyMiBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAordm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpzaWduYWxQaXBlbGluZURyYWluKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHN0cmVhbUlkcykgeworICAgIGlmICghbVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgQUxPR0UoIiVzIGNhbGxlZCBmb3IgY2FtZXJhIGRldmljZSBub3Qgc3VwcG9ydGluZyBIQUwgYnVmZmVyIG1hbmFnZW1lbnQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIHBsKG1QYXVzZUxvY2spOworICAgIGlmIChtUGF1c2VkKSB7CisgICAgICAgIG1JbnRlcmZhY2UtPnNpZ25hbFBpcGVsaW5lRHJhaW4oc3RyZWFtSWRzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBJZiByZXF1ZXN0IHRocmVhZCBpcyBzdGlsbCBidXN5LCB3YWl0IHVudGlsIHBhdXNlZCB0aGVuIG5vdGlmeSBIQUwKKyAgICBtTm90aWZ5UGlwZWxpbmVEcmFpbiA9IHRydWU7CisgICAgbVN0cmVhbUlkc1RvQmVEcmFpbmVkID0gc3RyZWFtSWRzOworfQorCiBuc2Vjc190IENhbWVyYTNEZXZpY2U6OmdldEV4cGVjdGVkSW5GbGlnaHREdXJhdGlvbigpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBhbChtSW5GbGlnaHRMb2NrKTsKQEAgLTUwNjIsMTYgKzU5MTUsMjEgQEAKICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tSW5wdXRTdHJlYW0tPnJldHVybklucHV0QnVmZmVyKGNhcHR1cmVSZXF1ZXN0LT5tSW5wdXRCdWZmZXIpOwogICAgICAgICB9CiAKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoYWxSZXF1ZXN0LT5udW1fb3V0cHV0X2J1ZmZlcnM7IGkrKykgewotICAgICAgICAgICAgLy9CdWZmZXJzIHRoYXQgZmFpbGVkIHByb2Nlc3NpbmcgY291bGQgc3RpbGwgaGF2ZQotICAgICAgICAgICAgLy92YWxpZCBhY3F1aXJlIGZlbmNlLgotICAgICAgICAgICAgaW50IGFjcXVpcmVGZW5jZSA9ICgqb3V0cHV0QnVmZmVycylbaV0uYWNxdWlyZV9mZW5jZTsKLSAgICAgICAgICAgIGlmICgwIDw9IGFjcXVpcmVGZW5jZSkgewotICAgICAgICAgICAgICAgIGNsb3NlKGFjcXVpcmVGZW5jZSk7Ci0gICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVycy0+ZWRpdEl0ZW1BdChpKS5hY3F1aXJlX2ZlbmNlID0gLTE7CisgICAgICAgIC8vIE5vIG91dHB1dCBidWZmZXIgY2FuIGJlIHJldHVybmVkIHdoZW4gdXNpbmcgSEFMIGJ1ZmZlciBtYW5hZ2VyCisgICAgICAgIGlmICghbVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGFsUmVxdWVzdC0+bnVtX291dHB1dF9idWZmZXJzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAvL0J1ZmZlcnMgdGhhdCBmYWlsZWQgcHJvY2Vzc2luZyBjb3VsZCBzdGlsbCBoYXZlCisgICAgICAgICAgICAgICAgLy92YWxpZCBhY3F1aXJlIGZlbmNlLgorICAgICAgICAgICAgICAgIGludCBhY3F1aXJlRmVuY2UgPSAoKm91dHB1dEJ1ZmZlcnMpW2ldLmFjcXVpcmVfZmVuY2U7CisgICAgICAgICAgICAgICAgaWYgKDAgPD0gYWNxdWlyZUZlbmNlKSB7CisgICAgICAgICAgICAgICAgICAgIGNsb3NlKGFjcXVpcmVGZW5jZSk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnMtPmVkaXRJdGVtQXQoaSkuYWNxdWlyZV9mZW5jZSA9IC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJzLT5lZGl0SXRlbUF0KGkpLnN0YXR1cyA9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUjsKKyAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bU91dHB1dFN0cmVhbXMuZWRpdEl0ZW1BdChpKS0+cmV0dXJuQnVmZmVyKCgqb3V0cHV0QnVmZmVycylbaV0sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAvKnRpbWVzdGFtcEluY3JlYXNpbmcqL3RydWUsIHN0ZDo6dmVjdG9yPHNpemVfdD4gKCksCisgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bVJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdXRwdXRCdWZmZXJzLT5lZGl0SXRlbUF0KGkpLnN0YXR1cyA9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUjsKLSAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3RyZWFtcy5lZGl0SXRlbUF0KGkpLT5yZXR1cm5CdWZmZXIoKCpvdXRwdXRCdWZmZXJzKVtpXSwgMCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoc2VuZFJlcXVlc3RFcnJvcikgewpAQCAtNTE3NywxMSArNjAzNSwyMCBAQAogICAgICAgICAgICAgaWYgKG1QYXVzZWQgPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IFJlcXVlc3RUaHJlYWQ6IEdvaW5nIGlkbGUiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICAgICAgICAgIG1QYXVzZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChtTm90aWZ5UGlwZWxpbmVEcmFpbikgeworICAgICAgICAgICAgICAgICAgICBtSW50ZXJmYWNlLT5zaWduYWxQaXBlbGluZURyYWluKG1TdHJlYW1JZHNUb0JlRHJhaW5lZCk7CisgICAgICAgICAgICAgICAgICAgIG1Ob3RpZnlQaXBlbGluZURyYWluID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIG1TdHJlYW1JZHNUb0JlRHJhaW5lZC5jbGVhcigpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAvLyBMZXQgdGhlIHRyYWNrZXIga25vdwogICAgICAgICAgICAgICAgIHNwPFN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIgPSBtU3RhdHVzVHJhY2tlci5wcm9tb3RlKCk7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXR1c1RyYWNrZXIgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBzdGF0dXNUcmFja2VyLT5tYXJrQ29tcG9uZW50SWRsZShtU3RhdHVzSWQsIEZlbmNlOjpOT19GRU5DRSk7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNwPENhbWVyYTNEZXZpY2U+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBwYXJlbnQtPm1SZXF1ZXN0QnVmZmVyU00ub25SZXF1ZXN0VGhyZWFkUGF1c2VkKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gU3RvcCB3YWl0aW5nIGZvciBub3cgYW5kIGxldCB0aHJlYWQgbWFuYWdlbWVudCBoYXBwZW4KICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtNTI2MSwxMSArNjEyOCwyMCBAQAogICAgICAgICBpZiAobVBhdXNlZCA9PSBmYWxzZSkgewogICAgICAgICAgICAgbVBhdXNlZCA9IHRydWU7CiAgICAgICAgICAgICBBTE9HVigiJXM6IFJlcXVlc3RUaHJlYWQ6IFBhdXNlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBpZiAobU5vdGlmeVBpcGVsaW5lRHJhaW4pIHsKKyAgICAgICAgICAgICAgICBtSW50ZXJmYWNlLT5zaWduYWxQaXBlbGluZURyYWluKG1TdHJlYW1JZHNUb0JlRHJhaW5lZCk7CisgICAgICAgICAgICAgICAgbU5vdGlmeVBpcGVsaW5lRHJhaW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBtU3RyZWFtSWRzVG9CZURyYWluZWQuY2xlYXIoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIExldCB0aGUgdHJhY2tlciBrbm93CiAgICAgICAgICAgICBzcDxTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyID0gbVN0YXR1c1RyYWNrZXIucHJvbW90ZSgpOwogICAgICAgICAgICAgaWYgKHN0YXR1c1RyYWNrZXIgIT0gMCkgewogICAgICAgICAgICAgICAgIHN0YXR1c1RyYWNrZXItPm1hcmtDb21wb25lbnRJZGxlKG1TdGF0dXNJZCwgRmVuY2U6Ok5PX0ZFTkNFKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPENhbWVyYTNEZXZpY2U+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcGFyZW50LT5tUmVxdWVzdEJ1ZmZlclNNLm9uUmVxdWVzdFRocmVhZFBhdXNlZCgpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgcmVzID0gbURvUGF1c2VTaWduYWwud2FpdFJlbGF0aXZlKG1QYXVzZUxvY2ssIGtSZXF1ZXN0VGltZW91dCk7CkBAIC01NTIzLDcgKzYzOTksNyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKICAgICBzcDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOwogCi0gICAgcmVzID0gc3RyZWFtLT5zdGFydFByZXBhcmUobWF4Q291bnQpOworICAgIHJlcyA9IHN0cmVhbS0+c3RhcnRQcmVwYXJlKG1heENvdW50LCB0cnVlIC8qYmxvY2tSZXF1ZXN0Ki8pOwogICAgIGlmIChyZXMgPT0gT0spIHsKICAgICAgICAgLy8gTm8gcHJlcGFyYXRpb24gbmVlZGVkLCBmaXJlIGxpc3RlbmVyIHJpZ2h0IG9mZgogICAgICAgICBBTE9HVigiJXM6IFN0cmVhbSAlZCBhbHJlYWR5IHByZXBhcmVkIiwgX19GVU5DVElPTl9fLCBzdHJlYW0tPmdldElkKCkpOwpAQCAtNTYxMSw3ICs2NDg3LDcgQEAKIAogICAgIGF1dG8gaXQgPSBtUGVuZGluZ1N0cmVhbXMuYmVnaW4oKTsKICAgICBmb3IgKDsgaXQgIT0gbVBlbmRpbmdTdHJlYW1zLmVuZCgpOykgewotICAgICAgICByZXMgPSBpdC0+c2Vjb25kLT5zdGFydFByZXBhcmUoaXQtPmZpcnN0KTsKKyAgICAgICAgcmVzID0gaXQtPnNlY29uZC0+c3RhcnRQcmVwYXJlKGl0LT5maXJzdCwgdHJ1ZSAvKmJsb2NrUmVxdWVzdCovKTsKICAgICAgICAgaWYgKHJlcyA9PSBPSykgewogICAgICAgICAgICAgaWYgKGxpc3RlbmVyICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBsaXN0ZW5lci0+bm90aWZ5UHJlcGFyZWQoaXQtPnNlY29uZC0+Z2V0SWQoKSk7CkBAIC01NzIxLDIzICs2NTk3LDE3NCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi0vKioKLSAqIFN0YXRpYyBjYWxsYmFjayBmb3J3YXJkaW5nIG1ldGhvZHMgZnJvbSBIQUwgdG8gaW5zdGFuY2UKLSAqLworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6UmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZTo6aW5pdGlhbGl6ZSgKKyAgICAgICAgc3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlcikgeworICAgIGlmIChzdGF0dXNUcmFja2VyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBzdGF0dXNUcmFja2VyIGlzIG51bGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KIAotdm9pZCBDYW1lcmEzRGV2aWNlOjpzUHJvY2Vzc0NhcHR1cmVSZXN1bHQoY29uc3QgY2FtZXJhM19jYWxsYmFja19vcHMgKmNiLAotICAgICAgICBjb25zdCBjYW1lcmEzX2NhcHR1cmVfcmVzdWx0ICpyZXN1bHQpIHsKLSAgICBDYW1lcmEzRGV2aWNlICpkID0KLSAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Q2FtZXJhM0RldmljZSo+KHN0YXRpY19jYXN0PGNvbnN0IENhbWVyYTNEZXZpY2UqPihjYikpOwotCi0gICAgZC0+cHJvY2Vzc0NhcHR1cmVSZXN1bHQocmVzdWx0KTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgbVN0YXR1c1RyYWNrZXIgPSBzdGF0dXNUcmFja2VyOworICAgIG1SZXF1ZXN0QnVmZmVyU3RhdHVzSWQgPSBzdGF0dXNUcmFja2VyLT5hZGRDb21wb25lbnQoKTsKKyAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgQ2FtZXJhM0RldmljZTo6c05vdGlmeShjb25zdCBjYW1lcmEzX2NhbGxiYWNrX29wcyAqY2IsCi0gICAgICAgIGNvbnN0IGNhbWVyYTNfbm90aWZ5X21zZyAqbXNnKSB7Ci0gICAgQ2FtZXJhM0RldmljZSAqZCA9Ci0gICAgICAgICAgICBjb25zdF9jYXN0PENhbWVyYTNEZXZpY2UqPihzdGF0aWNfY2FzdDxjb25zdCBDYW1lcmEzRGV2aWNlKj4oY2IpKTsKLSAgICBkLT5ub3RpZnkobXNnKTsKK2Jvb2wgQ2FtZXJhM0RldmljZTo6UmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZTo6c3RhcnRSZXF1ZXN0QnVmZmVyKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobVN0YXR1cyA9PSBSQl9TVEFUVVNfUkVBRFkgfHwgbVN0YXR1cyA9PSBSQl9TVEFUVVNfUEVORElOR19TVE9QKSB7CisgICAgICAgIG1SZXF1ZXN0QnVmZmVyT25nb2luZyA9IHRydWU7CisgICAgICAgIG5vdGlmeVRyYWNrZXJMb2NrZWQoLyphY3RpdmUqL3RydWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6OmVuZFJlcXVlc3RCdWZmZXIoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGlmICghbVJlcXVlc3RCdWZmZXJPbmdvaW5nKSB7CisgICAgICAgIEFMT0dFKCIlcyBjYWxsZWQgd2l0aG91dCBhIHN1Y2Nlc3NmdWwgc3RhcnRSZXF1ZXN0QnVmZmVyIGNhbGwgZmlyc3QhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtUmVxdWVzdEJ1ZmZlck9uZ29pbmcgPSBmYWxzZTsKKyAgICBpZiAobVN0YXR1cyA9PSBSQl9TVEFUVVNfUEVORElOR19TVE9QKSB7CisgICAgICAgIGNoZWNrU3dpdGNoVG9TdG9wTG9ja2VkKCk7CisgICAgfQorICAgIG5vdGlmeVRyYWNrZXJMb2NrZWQoLyphY3RpdmUqL2ZhbHNlKTsKK30KKwordm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjpvblN0cmVhbXNDb25maWd1cmVkKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBtU3RhdHVzID0gUkJfU1RBVFVTX1JFQURZOworICAgIHJldHVybjsKK30KKwordm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjpvblN1Ym1pdHRpbmdSZXF1ZXN0KCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBtUmVxdWVzdFRocmVhZFBhdXNlZCA9IGZhbHNlOworICAgIC8vIGluZmxpZ2h0IG1hcCByZWdpc3RlciBhY3R1YWxseSBoYXBwZW5zIGluIHByZXBhcmVIYWxSZXF1ZXN0IG5vdywgYnV0IGl0IGlzIGNsb3NlIGVub3VnaAorICAgIC8vIGFwcHJveGltYXRpb24uCisgICAgbUluZmxpZ2h0TWFwRW1wdHkgPSBmYWxzZTsKKyAgICBpZiAobVN0YXR1cyA9PSBSQl9TVEFUVVNfU1RPUFBFRCkgeworICAgICAgICBtU3RhdHVzID0gUkJfU1RBVFVTX1JFQURZOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZTo6b25SZXF1ZXN0VGhyZWFkUGF1c2VkKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBtUmVxdWVzdFRocmVhZFBhdXNlZCA9IHRydWU7CisgICAgaWYgKG1TdGF0dXMgPT0gUkJfU1RBVFVTX1BFTkRJTkdfU1RPUCkgeworICAgICAgICBjaGVja1N3aXRjaFRvU3RvcExvY2tlZCgpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZTo6b25JbmZsaWdodE1hcEVtcHR5KCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBtSW5mbGlnaHRNYXBFbXB0eSA9IHRydWU7CisgICAgaWYgKG1TdGF0dXMgPT0gUkJfU1RBVFVTX1BFTkRJTkdfU1RPUCkgeworICAgICAgICBjaGVja1N3aXRjaFRvU3RvcExvY2tlZCgpOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZTo6b25XYWl0VW50aWxJZGxlKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBpZiAoIWNoZWNrU3dpdGNoVG9TdG9wTG9ja2VkKCkpIHsKKyAgICAgICAgbVN0YXR1cyA9IFJCX1NUQVRVU19QRU5ESU5HX1NUT1A7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjpub3RpZnlUcmFja2VyTG9ja2VkKGJvb2wgYWN0aXZlKSB7CisgICAgc3A8U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciA9IG1TdGF0dXNUcmFja2VyLnByb21vdGUoKTsKKyAgICBpZiAoc3RhdHVzVHJhY2tlciAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgICAgIHN0YXR1c1RyYWNrZXItPm1hcmtDb21wb25lbnRBY3RpdmUobVJlcXVlc3RCdWZmZXJTdGF0dXNJZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXNUcmFja2VyLT5tYXJrQ29tcG9uZW50SWRsZShtUmVxdWVzdEJ1ZmZlclN0YXR1c0lkLCBGZW5jZTo6Tk9fRkVOQ0UpOworICAgICAgICB9CisgICAgfQorfQorCitib29sIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6OmNoZWNrU3dpdGNoVG9TdG9wTG9ja2VkKCkgeworICAgIGlmIChtSW5mbGlnaHRNYXBFbXB0eSAmJiBtUmVxdWVzdFRocmVhZFBhdXNlZCAmJiAhbVJlcXVlc3RCdWZmZXJPbmdvaW5nKSB7CisgICAgICAgIG1TdGF0dXMgPSBSQl9TVEFUVVNfU1RPUFBFRDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6Zml4dXBNb25vY2hyb21lVGFncyhjb25zdCBDYW1lcmFNZXRhZGF0YSYgZGV2aWNlSW5mbywKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEmIHJlc3VsdE1ldGFkYXRhKSB7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgaWYgKCFtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3MpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvLyBSZW1vdmUgdGFncyB0aGF0IGFyZSBub3QgYXBwbGljYWJsZSB0byBtb25vY2hyb21lIGNhbWVyYS4KKyAgICBpbnQzMl90IHRhZ3NUb1JlbW92ZVtdID0geworICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9HUkVFTl9TUExJVCwKKyAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfTkVVVFJBTF9DT0xPUl9QT0lOVCwKKyAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX01PREUsCisgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9UUkFOU0ZPUk0sCisgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9HQUlOUywKKyAgICB9OworICAgIGZvciAoYXV0byB0YWcgOiB0YWdzVG9SZW1vdmUpIHsKKyAgICAgICAgcmVzID0gcmVzdWx0TWV0YWRhdGEuZXJhc2UodGFnKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVtb3ZlIHRhZyAlZCBmb3IgbW9ub2Nocm9tZSBjYW1lcmEiLCBfX0ZVTkNUSU9OX18sIHRhZyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQU5EUk9JRF9TRU5TT1JfRFlOQU1JQ19CTEFDS19MRVZFTAorICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBibEVudHJ5ID0gcmVzdWx0TWV0YWRhdGEuZmluZChBTkRST0lEX1NFTlNPUl9EWU5BTUlDX0JMQUNLX0xFVkVMKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IGJsRW50cnkuY291bnQ7IGkrKykgeworICAgICAgICBibEVudHJ5LmRhdGEuZltpXSA9IGJsRW50cnkuZGF0YS5mWzBdOworICAgIH0KKworICAgIC8vIEFORFJPSURfU0VOU09SX05PSVNFX1BST0ZJTEUKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgbnBFbnRyeSA9IHJlc3VsdE1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TRU5TT1JfTk9JU0VfUFJPRklMRSk7CisgICAgaWYgKG5wRW50cnkuY291bnQgPiAwICYmIG5wRW50cnkuY291bnQgJSAyID09IDApIHsKKyAgICAgICAgZG91YmxlIG5wW10gPSB7bnBFbnRyeS5kYXRhLmRbMF0sIG5wRW50cnkuZGF0YS5kWzFdfTsKKyAgICAgICAgcmVzID0gcmVzdWx0TWV0YWRhdGEudXBkYXRlKEFORFJPSURfU0VOU09SX05PSVNFX1BST0ZJTEUsIG5wLCAyKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHVwZGF0ZSBTRU5TT1JfTk9JU0VfUFJPRklMRTogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQU5EUk9JRF9TVEFUSVNUSUNTX0xFTlNfU0hBRElOR19NQVAKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgbHNTaXplRW50cnkgPSBkZXZpY2VJbmZvLmZpbmQoQU5EUk9JRF9MRU5TX0lORk9fU0hBRElOR19NQVBfU0laRSk7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGxzRW50cnkgPSByZXN1bHRNZXRhZGF0YS5maW5kKEFORFJPSURfU1RBVElTVElDU19MRU5TX1NIQURJTkdfTUFQKTsKKyAgICBpZiAobHNTaXplRW50cnkuY291bnQgPT0gMiAmJiBsc0VudHJ5LmNvdW50ID4gMAorICAgICAgICAgICAgJiYgKGludDMyX3QpbHNFbnRyeS5jb3VudCA9PSA0ICogbHNTaXplRW50cnkuZGF0YS5pMzJbMF0gKiBsc1NpemVFbnRyeS5kYXRhLmkzMlsxXSkgeworICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBsc1NpemVFbnRyeS5kYXRhLmkzMlswXSAqIGxzU2l6ZUVudHJ5LmRhdGEuaTMyWzFdOyBpKyspIHsKKyAgICAgICAgICAgIGxzRW50cnkuZGF0YS5mWzQqaSsxXSA9IGxzRW50cnkuZGF0YS5mWzQqaV07CisgICAgICAgICAgICBsc0VudHJ5LmRhdGEuZls0KmkrMl0gPSBsc0VudHJ5LmRhdGEuZls0KmldOworICAgICAgICAgICAgbHNFbnRyeS5kYXRhLmZbNCppKzNdID0gbHNFbnRyeS5kYXRhLmZbNCppXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEFORFJPSURfVE9ORU1BUF9DVVJWRV9CTFVFCisgICAgLy8gQU5EUk9JRF9UT05FTUFQX0NVUlZFX0dSRUVOCisgICAgLy8gQU5EUk9JRF9UT05FTUFQX0NVUlZFX1JFRAorICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSB0Y2JFbnRyeSA9IHJlc3VsdE1ldGFkYXRhLmZpbmQoQU5EUk9JRF9UT05FTUFQX0NVUlZFX0JMVUUpOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSB0Y2dFbnRyeSA9IHJlc3VsdE1ldGFkYXRhLmZpbmQoQU5EUk9JRF9UT05FTUFQX0NVUlZFX0dSRUVOKTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgdGNyRW50cnkgPSByZXN1bHRNZXRhZGF0YS5maW5kKEFORFJPSURfVE9ORU1BUF9DVVJWRV9SRUQpOworICAgIGlmICh0Y2JFbnRyeS5jb3VudCA+IDAKKyAgICAgICAgICAgICYmIHRjYkVudHJ5LmNvdW50ID09IHRjZ0VudHJ5LmNvdW50CisgICAgICAgICAgICAmJiB0Y2JFbnRyeS5jb3VudCA9PSB0Y3JFbnRyeS5jb3VudCkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRjYkVudHJ5LmNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHRjYkVudHJ5LmRhdGEuZltpXSA9IHRjckVudHJ5LmRhdGEuZltpXTsKKyAgICAgICAgICAgIHRjZ0VudHJ5LmRhdGEuZltpXSA9IHRjckVudHJ5LmRhdGEuZltpXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXM7CiB9CiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oCmluZGV4IGQ4ZmUxOWYuLjZlOGFjODQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oCkBAIC0zMywxMCArMzMsMTEgQEAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy4yL0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuMy9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjQvSUNhbWVyYURldmljZVNlc3Npb24uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy41L0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy40L0lDYW1lcmFEZXZpY2VDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjUvSUNhbWVyYURldmljZUNhbGxiYWNrLmg+CiAjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgotI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYTMuaD4KIAogI2luY2x1ZGUgPGNhbWVyYS9DYXB0dXJlUmVzdWx0Lmg+CiAKQEAgLTUwLDIwICs1MSw2IEBACiAKIHVzaW5nIGFuZHJvaWQ6OmNhbWVyYTM6Ok91dHB1dFN0cmVhbUluZm87CiAKLS8qKgotICogRnVuY3Rpb24gcG9pbnRlciB0eXBlcyB3aXRoIEMgY2FsbGluZyBjb252ZW50aW9uIHRvCi0gKiB1c2UgZm9yIEhBTCBjYWxsYmFjayBmdW5jdGlvbnMuCi0gKi8KLWV4dGVybiAiQyIgewotICAgIHR5cGVkZWYgdm9pZCAoY2FsbGJhY2tzX3Byb2Nlc3NfY2FwdHVyZV9yZXN1bHRfdCkoCi0gICAgICAgIGNvbnN0IHN0cnVjdCBjYW1lcmEzX2NhbGxiYWNrX29wcyAqLAotICAgICAgICBjb25zdCBjYW1lcmEzX2NhcHR1cmVfcmVzdWx0X3QgKik7Ci0KLSAgICB0eXBlZGVmIHZvaWQgKGNhbGxiYWNrc19ub3RpZnlfdCkoCi0gICAgICAgIGNvbnN0IHN0cnVjdCBjYW1lcmEzX2NhbGxiYWNrX29wcyAqLAotICAgICAgICBjb25zdCBjYW1lcmEzX25vdGlmeV9tc2dfdCAqKTsKLX0KLQogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBuYW1lc3BhY2UgY2FtZXJhMyB7CkBAIC04MCw4ICs2Nyw3IEBACiAgKi8KIGNsYXNzIENhbWVyYTNEZXZpY2UgOgogICAgICAgICAgICAgcHVibGljIENhbWVyYURldmljZUJhc2UsCi0gICAgICAgICAgICB2aXJ0dWFsIHB1YmxpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OklDYW1lcmFEZXZpY2VDYWxsYmFjaywKLSAgICAgICAgICAgIHByaXZhdGUgY2FtZXJhM19jYWxsYmFja19vcHMgeworICAgICAgICAgICAgdmlydHVhbCBwdWJsaWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2sgewogICBwdWJsaWM6CiAKICAgICBleHBsaWNpdCBDYW1lcmEzRGV2aWNlKGNvbnN0IFN0cmluZzgmIGlkKTsKQEAgLTEwMSw2ICs4Nyw3IEBACiAgICAgc3RhdHVzX3QgZGlzY29ubmVjdCgpIG92ZXJyaWRlOwogICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+ICZhcmdzKSBvdmVycmlkZTsKICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgaW5mbygpIGNvbnN0IG92ZXJyaWRlOworICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBpbmZvKGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsSWQpIGNvbnN0IG92ZXJyaWRlOwogCiAgICAgLy8gQ2FwdHVyZSBhbmQgc2V0U3RyZWFtaW5nUmVxdWVzdCB3aWxsIGNvbmZpZ3VyZSBzdHJlYW1zIGlmIGN1cnJlbnRseSBpbgogICAgIC8vIGlkbGUgc3RhdGUKQEAgLTIwNyw4ICsxOTQsMzIgQEAKICAgICAgKi8KICAgICBzdGF0dXNfdCBkcm9wU3RyZWFtQnVmZmVycyhib29sIGRyb3BwaW5nLCBpbnQgc3RyZWFtSWQpIG92ZXJyaWRlOwogCisgICAgLyoqCisgICAgICogSGVscGVyIGZ1bmN0aW9ucyB0byBtYXAgYmV0d2VlbiBmcmFtZXdvcmsgYW5kIEhJREwgdmFsdWVzCisgICAgICovCisgICAgc3RhdGljIGhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdCBtYXBUb1BpeGVsRm9ybWF0KGludCBmcmFtZXdvcmtGb3JtYXQpOworICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkRhdGFzcGFjZUZsYWdzIG1hcFRvSGlkbERhdGFzcGFjZSgKKyAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSk7CisgICAgc3RhdGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyVXNhZ2VGbGFncyBtYXBUb0NvbnN1bWVyVXNhZ2UodWludDY0X3QgdXNhZ2UpOworICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbVJvdGF0aW9uIG1hcFRvU3RyZWFtUm90YXRpb24oCisgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uKTsKKyAgICAvLyBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpZiB0aGUgcGFzc2VkLWluIG9wZXJhdGlvbiBtb2RlIGlzIG5vdCB2YWxpZC4KKyAgICBzdGF0aWMgc3RhdHVzX3QgbWFwVG9TdHJlYW1Db25maWd1cmF0aW9uTW9kZShjYW1lcmEzX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdCBvcGVyYXRpb25Nb2RlLAorICAgICAgICAgICAgLypvdXQqLyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlICptb2RlKTsKKyAgICBzdGF0aWMgY2FtZXJhM19idWZmZXJfc3RhdHVzX3QgbWFwSGlkbEJ1ZmZlclN0YXR1cygKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyU3RhdHVzIHN0YXR1cyk7CisgICAgc3RhdGljIGludCBtYXBUb0ZyYW1ld29ya0Zvcm1hdChoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQgcGl4ZWxGb3JtYXQpOworICAgIHN0YXRpYyBhbmRyb2lkX2RhdGFzcGFjZSBtYXBUb0ZyYW1ld29ya0RhdGFzcGFjZSgKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6RGF0YXNwYWNlRmxhZ3MpOworICAgIHN0YXRpYyB1aW50NjRfdCBtYXBDb25zdW1lclRvRnJhbWV3b3JrVXNhZ2UoCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclVzYWdlRmxhZ3MgdXNhZ2UpOworICAgIHN0YXRpYyB1aW50NjRfdCBtYXBQcm9kdWNlclRvRnJhbWV3b3JrVXNhZ2UoCisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclVzYWdlRmxhZ3MgdXNhZ2UpOworCiAgIHByaXZhdGU6CiAKKyAgICBzdGF0dXNfdCBkaXNjb25uZWN0SW1wbCgpOworCiAgICAgLy8gaW50ZXJuYWwgdHlwZWRlZnMKICAgICB1c2luZyBSZXF1ZXN0TWV0YWRhdGFRdWV1ZSA9IGhhcmR3YXJlOjpNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OwogICAgIHVzaW5nIFJlc3VsdE1ldGFkYXRhUXVldWUgID0gaGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT47CkBAIC0yMjAsNiArMjMxLDcgQEAKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90ICAgICAgICBrSW5GbGlnaHRXYXJuTGltaXRIaWdoU3BlZWQgPSAyNTY7IC8vIGJhdGNoIHNpemUgMzIgKiBwaXBlIGRlcHRoIDgKICAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCAgICAgICBrRGVmYXVsdEV4cGVjdGVkRHVyYXRpb24gPSAxMDAwMDAwMDA7IC8vIDEwMCBtcwogICAgIHN0YXRpYyBjb25zdCBuc2Vjc190ICAgICAgIGtNaW5JbmZsaWdodER1cmF0aW9uID0gNTAwMDAwMDAwMDsgLy8gNSBzCisgICAgc3RhdGljIGNvbnN0IG5zZWNzX3QgICAgICAga0Jhc2VHZXRCdWZmZXJXYWl0ID0gMzAwMDAwMDAwMDsgLy8gMyBzZWMuCiAgICAgLy8gU0NIRURfRklGTyBwcmlvcml0eSBmb3IgcmVxdWVzdCBzdWJtaXNzaW9uIHRocmVhZCBpbiBIRlIgbW9kZQogICAgIHN0YXRpYyBjb25zdCBpbnQgICAgICAgICAgIGtSZXF1ZXN0VGhyZWFkUHJpb3JpdHkgPSAxOwogCkBAIC0yNjYsNyArMjc4LDggQEAKICAgICBjbGFzcyBIYWxJbnRlcmZhY2UgOiBwdWJsaWMgY2FtZXJhMzo6Q2FtZXJhM1N0cmVhbUJ1ZmZlckZyZWVkTGlzdGVuZXIgewogICAgICAgcHVibGljOgogICAgICAgICBIYWxJbnRlcmZhY2Uoc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gJnNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlKTsKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4gcXVldWUsCisgICAgICAgICAgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIpOwogICAgICAgICBIYWxJbnRlcmZhY2UoY29uc3QgSGFsSW50ZXJmYWNlICZvdGhlcik7CiAgICAgICAgIEhhbEludGVyZmFjZSgpOwogCkBAIC0yNzYsOSArMjg5LDYgQEAKICAgICAgICAgLy8gUmVzZXQgdGhpcyBIYWxJbnRlcmZhY2Ugb2JqZWN0IChkb2VzIG5vdCBjYWxsIGNsb3NlKCkpCiAgICAgICAgIHZvaWQgY2xlYXIoKTsKIAotICAgICAgICAvLyBDaGVjayBpZiBIYWxJbnRlcmZhY2Ugc3VwcG9ydCBzZW5kaW5nIHJlcXVlc3RzIGluIGJhdGNoCi0gICAgICAgIGJvb2wgc3VwcG9ydEJhdGNoUmVxdWVzdCgpOwotCiAgICAgICAgIC8vIENhbGxzIGludG8gdGhlIEhBTCBpbnRlcmZhY2UKIAogICAgICAgICAvLyBDYWxsZXIgdGFrZXMgb3duZXJzaGlwIG9mIHJlcXVlc3RUZW1wbGF0ZQpAQCAtMjg3LDcgKzI5NywxMSBAQAogICAgICAgICBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW1zKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzZXNzaW9uUGFyYW1zLAogICAgICAgICAgICAgICAgIC8qaW5vdXQqLyBjYW1lcmEzX3N0cmVhbV9jb25maWd1cmF0aW9uICpjb25maWcsCiAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+JiBidWZmZXJTaXplcyk7Ci0gICAgICAgIHN0YXR1c190IHByb2Nlc3NDYXB0dXJlUmVxdWVzdChjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90ICpyZXF1ZXN0KTsKKworICAgICAgICAvLyBXaGVuIHRoZSBjYWxsIHN1Y2NlZWRzLCB0aGUgb3duZXJzaGlwIG9mIGFjcXVpcmUgZmVuY2VzIGluIHJlcXVlc3RzIGlzIHRyYW5zZmVycmVkIHRvCisgICAgICAgIC8vIEhhbEludGVyZmFjZS4gTW9yZSBzcGVjaWZpY2FsbHksIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIHdpbGwgc2VuZCB0aGUgZmVuY2UgdG8KKyAgICAgICAgLy8gSEFMIHByb2Nlc3MgYW5kIGNsb3NlIHRoZSBGRCBpbiBjYW1lcmFzZXJ2ZXIgcHJvY2Vzcy4gV2hlbiB0aGUgY2FsbCBmYWlscywgdGhlIG93bmVyc2hpcAorICAgICAgICAvLyBvZiB0aGUgYWNxdWlyZSBmZW5jZSBzdGlsbCBiZWxvbmdzIHRvIHRoZSBjYWxsZXIuCiAgICAgICAgIHN0YXR1c190IHByb2Nlc3NCYXRjaENhcHR1cmVSZXF1ZXN0cygKICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90Kj4mIHJlcXVlc3RzLAogICAgICAgICAgICAgICAgIC8qb3V0Ki91aW50MzJfdCogbnVtUmVxdWVzdFByb2Nlc3NlZCk7CkBAIC0yOTUsMTQgKzMwOSwzNyBAQAogICAgICAgICBzdGF0dXNfdCBkdW1wKGludCBmZCk7CiAgICAgICAgIHN0YXR1c190IGNsb3NlKCk7CiAKKyAgICAgICAgdm9pZCBzaWduYWxQaXBlbGluZURyYWluKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHN0cmVhbUlkcyk7CisgICAgICAgIGJvb2wgaXNSZWNvbmZpZ3VyYXRpb25SZXF1aXJlZChDYW1lcmFNZXRhZGF0YSYgb2xkU2Vzc2lvblBhcmFtcywKKyAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSYgbmV3U2Vzc2lvblBhcmFtcyk7CisKKyAgICAgICAgLy8gbWV0aG9kIHRvIGV4dHJhY3QgYnVmZmVyJ3MgdW5pcXVlIElECisgICAgICAgIC8vIHJldHVybiBwYWlyIG9mIChuZXdseVNlZW5CdWZmZXI/LCBidWZmZXJJZCkKKyAgICAgICAgc3RkOjpwYWlyPGJvb2wsIHVpbnQ2NF90PiBnZXRCdWZmZXJJZChjb25zdCBidWZmZXJfaGFuZGxlX3QmIGJ1ZiwgaW50IHN0cmVhbUlkKTsKKwogICAgICAgICAvLyBGaW5kIGEgYnVmZmVyX2hhbmRsZV90IGJhc2VkIG9uIGZyYW1lIG51bWJlciBhbmQgc3RyZWFtIElECiAgICAgICAgIHN0YXR1c190IHBvcEluZmxpZ2h0QnVmZmVyKGludDMyX3QgZnJhbWVOdW1iZXIsIGludDMyX3Qgc3RyZWFtSWQsCiAgICAgICAgICAgICAgICAgLypvdXQqLyBidWZmZXJfaGFuZGxlX3QgKipidWZmZXIpOwogCisgICAgICAgIC8vIFJlZ2lzdGVyIGEgYnVmSWQgKHN0cmVhbUlkLCBidWZmZXJfaGFuZGxlX3QpIHRvIGluZmxpZ2h0IHJlcXVlc3QgYnVmZmVyCisgICAgICAgIHN0YXR1c190IHB1c2hJbmZsaWdodFJlcXVlc3RCdWZmZXIoCisgICAgICAgICAgICAgICAgdWludDY0X3QgYnVmZmVySWQsIGJ1ZmZlcl9oYW5kbGVfdCogYnVmLCBpbnQzMl90IHN0cmVhbUlkKTsKKworICAgICAgICAvLyBGaW5kIGEgYnVmZmVyX2hhbmRsZV90IGJhc2VkIG9uIGJ1ZmZlcklkCisgICAgICAgIHN0YXR1c190IHBvcEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcih1aW50NjRfdCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAvKm91dCovIGJ1ZmZlcl9oYW5kbGVfdCoqIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAvKm9wdGlvbmFsIG91dCovIGludDMyX3QqIHN0cmVhbUlkID0gbnVsbHB0cik7CisKICAgICAgICAgLy8gR2V0IGEgdmVjdG9yIG9mIChmcmFtZU51bWJlciwgc3RyZWFtSWQpIHBhaXIgb2YgY3VycmVudGx5IGluZmxpZ2h0CiAgICAgICAgIC8vIGJ1ZmZlcnMKICAgICAgICAgdm9pZCBnZXRJbmZsaWdodEJ1ZmZlcktleXMoc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+Piogb3V0KTsKIAorICAgICAgICAvLyBHZXQgYSB2ZWN0b3Igb2YgYnVmZmVySWQgb2YgY3VycmVudGx5IGluZmxpZ2h0IGJ1ZmZlcnMKKyAgICAgICAgdm9pZCBnZXRJbmZsaWdodFJlcXVlc3RCdWZmZXJLZXlzKHN0ZDo6dmVjdG9yPHVpbnQ2NF90Piogb3V0KTsKKworICAgICAgICB2b2lkIG9uU3RyZWFtUmVDb25maWd1cmVkKGludCBzdHJlYW1JZCk7CisKKyAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IEJVRkZFUl9JRF9OT19CVUZGRVIgPSAwOwogICAgICAgcHJpdmF0ZToKICAgICAgICAgLy8gQWx3YXlzIHZhbGlkCiAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbjsKQEAgLTMxMCw2ICszNDcsOCBAQAogICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzM6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBtSGlkbFNlc3Npb25fM18zOwogICAgICAgICAvLyBWYWxpZCBpZiBJQ2FtZXJhRGV2aWNlU2Vzc2lvbiBpcyBAMy40IG9yIG5ld2VyCiAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbl8zXzQ7CisgICAgICAgIC8vIFZhbGlkIGlmIElDYW1lcmFEZXZpY2VTZXNzaW9uIGlzIEAzLjUgb3IgbmV3ZXIKKyAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gbUhpZGxTZXNzaW9uXzNfNTsKIAogICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZTsKIApAQCAtMzE3LDE1ICszNTYsMjMgQEAKIAogICAgICAgICAvLyBUaGUgb3V0cHV0IEhJREwgcmVxdWVzdCBzdGlsbCBkZXBlbmRzIG9uIGlucHV0IGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QKICAgICAgICAgLy8gRG8gbm90IGZyZWUgaW5wdXQgY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCBiZWZvcmUgb3V0cHV0IEhJREwgcmVxdWVzdAotICAgICAgICB2b2lkIHdyYXBBc0hpZGxSZXF1ZXN0KGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QqIGluLAorICAgICAgICBzdGF0dXNfdCB3cmFwQXNIaWRsUmVxdWVzdChjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90KiBpbiwKICAgICAgICAgICAgICAgICAvKm91dCovaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVxdWVzdCogb3V0LAotICAgICAgICAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiogaGFuZGxlc0NyZWF0ZWQpOworICAgICAgICAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiogaGFuZGxlc0NyZWF0ZWQsCisgICAgICAgICAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4qIGluZmxpZ2h0QnVmZmVycyk7CiAKICAgICAgICAgc3RhdHVzX3QgcHVzaEluZmxpZ2h0QnVmZmVyTG9ja2VkKGludDMyX3QgZnJhbWVOdW1iZXIsIGludDMyX3Qgc3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90ICpidWZmZXIsIGludCBhY3F1aXJlRmVuY2UpOworICAgICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyKTsKKworICAgICAgICAvLyBQb3AgaW5mbGlnaHQgYnVmZmVycyBiYXNlZCBvbiBwYWlycyBvZiAoZnJhbWVOdW1iZXIsc3RyZWFtSWQpCisgICAgICAgIHZvaWQgcG9wSW5mbGlnaHRCdWZmZXJzKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4mIGJ1ZmZlcnMpOworCiAgICAgICAgIC8vIENhY2hlIG9mIGJ1ZmZlciBoYW5kbGVzIGtleWVkIG9mZiAoZnJhbWVOdW1iZXIgPDwgMzIgfCBzdHJlYW1JZCkKLSAgICAgICAgLy8gdmFsdWUgaXMgYSBwYWlyIG9mIChidWZmZXJfaGFuZGxlX3QqLCBhY3F1aXJlX2ZlbmNlIEZEKQotICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIHN0ZDo6cGFpcjxidWZmZXJfaGFuZGxlX3QqLCBpbnQ+PiBtSW5mbGlnaHRCdWZmZXJNYXA7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50NjRfdCwgYnVmZmVyX2hhbmRsZV90Kj4gbUluZmxpZ2h0QnVmZmVyTWFwOworCisgICAgICAgIC8vIERlbGV0ZSBhbmQgb3B0aW9uYWxseSBjbG9zZSBuYXRpdmUgaGFuZGxlcyBhbmQgY2xlYXIgdGhlIGlucHV0IHZlY3RvciBhZnRlcndhcmQKKyAgICAgICAgc3RhdGljIHZvaWQgY2xlYW51cE5hdGl2ZUhhbmRsZXMoCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gKmhhbmRsZXMsIGJvb2wgY2xvc2VGZCA9IGZhbHNlKTsKIAogICAgICAgICBzdHJ1Y3QgQnVmZmVySGFzaGVyIHsKICAgICAgICAgICAgIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IGJ1ZmZlcl9oYW5kbGVfdCYgYnVmKSBjb25zdCB7CkBAIC0zNjEsMjQgKzQwOCwyNSBAQAogICAgICAgICAvLyBzdHJlYW0gSUQgLT4gcGVyIHN0cmVhbSBidWZmZXIgSUQgbWFwCiAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIEJ1ZmZlcklkTWFwPiBtQnVmZmVySWRNYXBzOwogICAgICAgICB1aW50NjRfdCBtTmV4dEJ1ZmZlcklkID0gMTsgLy8gMCBtZWFucyBubyBidWZmZXIKLSAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ2NF90IEJVRkZFUl9JRF9OT19CVUZGRVIgPSAwOwotCi0gICAgICAgIC8vIG1ldGhvZCB0byBleHRyYWN0IGJ1ZmZlcidzIHVuaXF1ZSBJRAotICAgICAgICAvLyBUT0RPOiB3ZSBzaG91bGQgc3dpdGNoIHRvIHVzZSBncmFsbG9jIG1hcHBlcidzIGdldEJhY2tpbmdTdG9yZSBBUEkKLSAgICAgICAgLy8gICAgICAgb25jZSB3ZSByYW4gaW4gYmluZGVyaXplZCBncmFsbG9jIG1vZGUsIGJ1dCBiZWZvcmUgdGhhdCBpcyByZWFkeSwKLSAgICAgICAgLy8gICAgICAgd2UgbmVlZCB0byByZWx5IG9uIHRoZSBjb252ZW50aW9uYWwgYnVmZmVyIHF1ZXVlIGJlaGF2aW9yIHdoZXJlCi0gICAgICAgIC8vICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCdzIEZEIHdvbid0IGNoYW5nZS4KLSAgICAgICAgLy8gcmV0dXJuIHBhaXIgb2YgKG5ld2x5U2VlbkJ1ZmZlcj8sIGJ1ZmZlcklkKQotICAgICAgICBzdGQ6OnBhaXI8Ym9vbCwgdWludDY0X3Q+IGdldEJ1ZmZlcklkKGNvbnN0IGJ1ZmZlcl9oYW5kbGVfdCYgYnVmLCBpbnQgc3RyZWFtSWQpOwogCiAgICAgICAgIHZpcnR1YWwgdm9pZCBvbkJ1ZmZlckZyZWVkKGludCBzdHJlYW1JZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUpIG92ZXJyaWRlOwogCiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQsIHVpbnQ2NF90Pj4gbUZyZWVkQnVmZmVyczsKKworICAgICAgICAvLyBCdWZmZXJzIGdpdmVuIHRvIEhBTCB0aHJvdWdoIHJlcXVlc3RTdHJlYW1CdWZmZXIgQVBJCisgICAgICAgIHN0ZDo6bXV0ZXggbVJlcXVlc3RlZEJ1ZmZlcnNMb2NrOworICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIHN0ZDo6cGFpcjxpbnQzMl90LCBidWZmZXJfaGFuZGxlX3QqPj4gbVJlcXVlc3RlZEJ1ZmZlcnM7CisKKyAgICAgICAgdWludDMyX3QgbU5leHRTdHJlYW1Db25maWdDb3VudGVyID0gMTsKKworICAgICAgICBjb25zdCBib29sIG1Vc2VIYWxCdWZNYW5hZ2VyOworICAgICAgICBib29sIG1Jc1JlY29uZmlndXJhdGlvblF1ZXJ5U3VwcG9ydGVkOwogICAgIH07CiAKICAgICBzcDxIYWxJbnRlcmZhY2U+IG1JbnRlcmZhY2U7CiAKICAgICBDYW1lcmFNZXRhZGF0YSAgICAgICAgICAgICBtRGV2aWNlSW5mbzsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIENhbWVyYU1ldGFkYXRhPiBtUGh5c2ljYWxEZXZpY2VJbmZvTWFwOwogCiAgICAgQ2FtZXJhTWV0YWRhdGEgICAgICAgICAgICAgbVJlcXVlc3RUZW1wbGF0ZUNhY2hlW0NBTUVSQTNfVEVNUExBVEVfQ09VTlRdOwogCkBAIC00MDcsOSArNDU1LDIyIEBACiAgICAgLy8gVHJhY2tpbmcgY2F1c2Ugb2YgZmF0YWwgZXJyb3JzIHdoZW4gaW4gU1RBVFVTX0VSUk9SCiAgICAgU3RyaW5nOCAgICAgICAgICAgICAgICAgICAgbUVycm9yQ2F1c2U7CiAKLSAgICAvLyBNYXBwaW5nIG9mIHN0cmVhbSBJRHMgdG8gc3RyZWFtIGluc3RhbmNlcwotICAgIHR5cGVkZWYgS2V5ZWRWZWN0b3I8aW50LCBzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiA+Ci0gICAgICAgICAgICBTdHJlYW1TZXQ7CisgICAgLy8gU3luY2hyb25pemVkIG1hcHBpbmcgb2Ygc3RyZWFtIElEcyB0byBzdHJlYW0gaW5zdGFuY2VzCisgICAgY2xhc3MgU3RyZWFtU2V0IHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgc3RhdHVzX3QgYWRkKGludCBzdHJlYW1JZCwgc3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4pOworICAgICAgICBzc2l6ZV90IHJlbW92ZShpbnQgc3RyZWFtSWQpOworICAgICAgICBzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBnZXQoaW50IHN0cmVhbUlkKTsKKyAgICAgICAgLy8gZ2V0IGJ5ICh1bmRlcmx5aW5nKSB2ZWN0b3IgaW5kZXgKKyAgICAgICAgc3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gb3BlcmF0b3JbXSAoc2l6ZV90IGluZGV4KTsKKyAgICAgICAgc2l6ZV90IHNpemUoKSBjb25zdDsKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiBnZXRTdHJlYW1JZHMoKTsKKyAgICAgICAgdm9pZCBjbGVhcigpOworCisgICAgICBwcml2YXRlOgorICAgICAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgICAgIEtleWVkVmVjdG9yPGludCwgc3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4+IG1EYXRhOworICAgIH07CiAKICAgICBTdHJlYW1TZXQgICAgICAgICAgICAgICAgICBtT3V0cHV0U3RyZWFtczsKICAgICBzcDxjYW1lcmEzOjpDYW1lcmEzU3RyZWFtPiBtSW5wdXRTdHJlYW07CkBAIC00NzgsOCArNTM5LDkgQEAKIAogCiAgICAgLyoqCi0gICAgICogSW1wbGVtZW50YXRpb24gb2YgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2sKKyAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2VDYWxsYmFjawogICAgICAqLworCiAgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBwcm9jZXNzQ2FwdHVyZVJlc3VsdF8zXzQoCiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CiAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6Q2FwdHVyZVJlc3VsdD4mIHJlc3VsdHMpIG92ZXJyaWRlOwpAQCAtNDkwLDExICs1NTIsMjAgQEAKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKICAgICAgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpOb3RpZnlNc2c+JiBtc2dzKSBvdmVycmlkZTsKIAorICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmVxdWVzdFN0cmVhbUJ1ZmZlcnMoCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CisgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6QnVmZmVyUmVxdWVzdD4mIGJ1ZlJlcXMsCisgICAgICAgICAgICByZXF1ZXN0U3RyZWFtQnVmZmVyc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldHVyblN0cmVhbUJ1ZmZlcnMoCisgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CisgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtQnVmZmVyPiYgYnVmZmVycykgb3ZlcnJpZGU7CisKICAgICAvLyBIYW5kbGUgb25lIGNhcHR1cmUgcmVzdWx0LiBBc3N1bWUgdGhhdCBtUHJvY2Vzc0NhcHR1cmVSZXN1bHRMb2NrIGlzIGhlbGQuCiAgICAgdm9pZCBwcm9jZXNzT25lQ2FwdHVyZVJlc3VsdExvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlc3VsdCYgcmVzdWx0LAogICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpQaHlzaWNhbENhbWVyYU1ldGFkYXRhPiBwaHlzaWNhbENhbWVyYU1ldGFkYXRhcyk7CisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlBoeXNpY2FsQ2FtZXJhTWV0YWRhdGE+IHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpOwogICAgIHN0YXR1c190IHJlYWRPbmVDYW1lcmFNZXRhZGF0YUxvY2tlZCh1aW50NjRfdCBmbXFSZXN1bHRTaXplLAogICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYW1lcmFNZXRhZGF0YSYgcmVzdWx0TWV0YWRhdGEsCiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhJiByZXN1bHQpOwpAQCAtNjUwLDI3ICs3MjEsNiBAQAogICAgICAqLwogICAgIHN0YXRpYyBuc2Vjc190IGdldE1vbm9Ub0Jvb3R0aW1lT2Zmc2V0KCk7CiAKLSAgICAvKioKLSAgICAgKiBIZWxwZXIgZnVuY3Rpb25zIHRvIG1hcCBiZXR3ZWVuIGZyYW1ld29yayBhbmQgSElETCB2YWx1ZXMKLSAgICAgKi8KLSAgICBzdGF0aWMgaGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IG1hcFRvUGl4ZWxGb3JtYXQoaW50IGZyYW1ld29ya0Zvcm1hdCk7Ci0gICAgc3RhdGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6RGF0YXNwYWNlRmxhZ3MgbWFwVG9IaWRsRGF0YXNwYWNlKAotICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlKTsKLSAgICBzdGF0aWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIG1hcFRvQ29uc3VtZXJVc2FnZSh1aW50NjRfdCB1c2FnZSk7Ci0gICAgc3RhdGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtUm90YXRpb24gbWFwVG9TdHJlYW1Sb3RhdGlvbigKLSAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24pOwotICAgIC8vIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGlmIHRoZSBwYXNzZWQtaW4gb3BlcmF0aW9uIG1vZGUgaXMgbm90IHZhbGlkLgotICAgIHN0YXRpYyBzdGF0dXNfdCBtYXBUb1N0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKGNhbWVyYTNfc3RyZWFtX2NvbmZpZ3VyYXRpb25fbW9kZV90IG9wZXJhdGlvbk1vZGUsCi0gICAgICAgICAgICAvKm91dCovIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgKm1vZGUpOwotICAgIHN0YXRpYyBjYW1lcmEzX2J1ZmZlcl9zdGF0dXNfdCBtYXBIaWRsQnVmZmVyU3RhdHVzKGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyU3RhdHVzIHN0YXR1cyk7Ci0gICAgc3RhdGljIGludCBtYXBUb0ZyYW1ld29ya0Zvcm1hdChoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMDo6UGl4ZWxGb3JtYXQgcGl4ZWxGb3JtYXQpOwotICAgIHN0YXRpYyBhbmRyb2lkX2RhdGFzcGFjZSBtYXBUb0ZyYW1ld29ya0RhdGFzcGFjZSgKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6RGF0YXNwYWNlRmxhZ3MpOwotICAgIHN0YXRpYyB1aW50NjRfdCBtYXBDb25zdW1lclRvRnJhbWV3b3JrVXNhZ2UoCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclVzYWdlRmxhZ3MgdXNhZ2UpOwotICAgIHN0YXRpYyB1aW50NjRfdCBtYXBQcm9kdWNlclRvRnJhbWV3b3JrVXNhZ2UoCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclVzYWdlRmxhZ3MgdXNhZ2UpOwotCiAgICAgc3RydWN0IFJlcXVlc3RUcmlnZ2VyIHsKICAgICAgICAgLy8gTWV0YWRhdGEgdGFnIG51bWJlciwgZS5nLiBhbmRyb2lkLmNvbnRyb2wuYWVQcmVjYXB0dXJlVHJpZ2dlcgogICAgICAgICB1aW50MzJfdCBtZXRhZGF0YVRhZzsKQEAgLTY5Nyw3ICs3NDcsOSBAQAogCiAgICAgICAgIFJlcXVlc3RUaHJlYWQod3A8Q2FtZXJhM0RldmljZT4gcGFyZW50LAogICAgICAgICAgICAgICAgIHNwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIsCi0gICAgICAgICAgICAgICAgc3A8SGFsSW50ZXJmYWNlPiBpbnRlcmZhY2UsIGNvbnN0IFZlY3RvcjxpbnQzMl90PiYgc2Vzc2lvblBhcmFtS2V5cyk7CisgICAgICAgICAgICAgICAgc3A8SGFsSW50ZXJmYWNlPiBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPGludDMyX3Q+JiBzZXNzaW9uUGFyYW1LZXlzLAorICAgICAgICAgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlcik7CiAgICAgICAgIH5SZXF1ZXN0VGhyZWFkKCk7CiAKICAgICAgICAgdm9pZCAgICAgc2V0Tm90aWZpY2F0aW9uTGlzdGVuZXIod3A8Tm90aWZpY2F0aW9uTGlzdGVuZXI+IGxpc3RlbmVyKTsKQEAgLTc4NSw2ICs4MzcsOCBAQAogICAgICAgICAgICAgbVJlcXVlc3RMYXRlbmN5LmR1bXAoZmQsIG5hbWUpOwogICAgICAgICB9CiAKKyAgICAgICAgdm9pZCBzaWduYWxQaXBlbGluZURyYWluKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHN0cmVhbUlkcyk7CisKICAgICAgIHByb3RlY3RlZDoKIAogICAgICAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpOwpAQCAtODUwLDkgKzkwNCw2IEBACiAgICAgICAgIC8vIENsZWFyIHJlcGVhdGluZyByZXF1ZXN0cy4gTXVzdCBiZSBjYWxsZWQgd2l0aCBtUmVxdWVzdExvY2sgaGVsZC4KICAgICAgICAgc3RhdHVzX3QgY2xlYXJSZXBlYXRpbmdSZXF1ZXN0c0xvY2tlZCgvKm91dCovIGludDY0X3QgKmxhc3RGcmFtZU51bWJlciA9IE5VTEwpOwogCi0gICAgICAgIC8vIHNlbmQgcmVxdWVzdCBpbiBtTmV4dFJlcXVlc3RzIHRvIEhBTCBvbmUgYnkgb25lLiBSZXR1cm4gdHJ1ZSA9IHN1Y3NzZXNzCi0gICAgICAgIGJvb2wgc2VuZFJlcXVlc3RzT25lQnlPbmUoKTsKLQogICAgICAgICAvLyBzZW5kIHJlcXVlc3QgaW4gbU5leHRSZXF1ZXN0cyB0byBIQUwgaW4gYSBiYXRjaC4gUmV0dXJuIHRydWUgPSBzdWNzc2VzcwogICAgICAgICBib29sIHNlbmRSZXF1ZXN0c0JhdGNoKCk7CiAKQEAgLTg2Nyw4ICs5MTgsOCBAQAogICAgICAgICBib29sIHNraXBIRlJUYXJnZXRGUFNVcGRhdGUoaW50MzJfdCB0YWcsIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90JiBuZXdFbnRyeSwKICAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCYgY3VycmVudEVudHJ5KTsKIAotICAgICAgICAvLyBSZS1jb25maWd1cmUgY2FtZXJhIHVzaW5nIHRoZSBsYXRlc3Qgc2Vzc2lvbiBwYXJhbWV0ZXJzLgotICAgICAgICBib29sIHJlY29uZmlndXJlQ2FtZXJhKCk7CisgICAgICAgIC8vIFVwZGF0ZSBuZXh0IHJlcXVlc3Qgc2VudCB0byBIQUwKKyAgICAgICAgdm9pZCB1cGRhdGVOZXh0UmVxdWVzdChOZXh0UmVxdWVzdCYgbmV4dFJlcXVlc3QpOwogCiAgICAgICAgIHdwPENhbWVyYTNEZXZpY2U+ICBtUGFyZW50OwogICAgICAgICB3cDxjYW1lcmEzOjpTdGF0dXNUcmFja2VyPiAgbVN0YXR1c1RyYWNrZXI7CkBAIC04OTQsMTIgKzk0NSwxMyBAQAogCiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICBtUmVjb25maWd1cmVkOwogCi0gICAgICAgIC8vIFVzZWQgYnkgd2FpdElmUGF1c2VkLCB3YWl0Rm9yTmV4dFJlcXVlc3QsIGFuZCB3YWl0VW50aWxQYXVzZWQKKyAgICAgICAgLy8gVXNlZCBieSB3YWl0SWZQYXVzZWQsIHdhaXRGb3JOZXh0UmVxdWVzdCwgd2FpdFVudGlsUGF1c2VkLCBhbmQgc2lnbmFsUGlwZWxpbmVEcmFpbgogICAgICAgICBNdXRleCAgICAgICAgICAgICAgbVBhdXNlTG9jazsKICAgICAgICAgYm9vbCAgICAgICAgICAgICAgIG1Eb1BhdXNlOwogICAgICAgICBDb25kaXRpb24gICAgICAgICAgbURvUGF1c2VTaWduYWw7CiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICBtUGF1c2VkOwotICAgICAgICBDb25kaXRpb24gICAgICAgICAgbVBhdXNlZFNpZ25hbDsKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgIG1Ob3RpZnlQaXBlbGluZURyYWluOworICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+ICAgbVN0cmVhbUlkc1RvQmVEcmFpbmVkOwogCiAgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiBtUHJldlJlcXVlc3Q7CiAgICAgICAgIGludDMyX3QgICAgICAgICAgICBtUHJldlRyaWdnZXJzOwpAQCAtOTExLDYgKzk2Myw3IEBACiAgICAgICAgIC8vIGFuZHJvaWQucmVxdWVzdC5pZCBmb3IgbGF0ZXN0IHByb2Nlc3NfY2FwdHVyZV9yZXF1ZXN0CiAgICAgICAgIGludDMyX3QgICAgICAgICAgICBtTGF0ZXN0UmVxdWVzdElkOwogICAgICAgICBDYW1lcmFNZXRhZGF0YSAgICAgbUxhdGVzdFJlcXVlc3Q7CisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgQ2FtZXJhTWV0YWRhdGE+IG1MYXRlc3RQaHlzaWNhbFJlcXVlc3Q7CiAKICAgICAgICAgdHlwZWRlZiBLZXllZFZlY3Rvcjx1aW50MzJfdC8qdGFnKi8sIFJlcXVlc3RUcmlnZ2VyPiBUcmlnZ2VyTWFwOwogICAgICAgICBNdXRleCAgICAgICAgICAgICAgbVRyaWdnZXJNdXRleDsKQEAgLTkzMiw2ICs5ODUsOCBAQAogCiAgICAgICAgIFZlY3RvcjxpbnQzMl90PiAgICBtU2Vzc2lvblBhcmFtS2V5czsKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgICAgIG1MYXRlc3RTZXNzaW9uUGFyYW1zOworCisgICAgICAgIGNvbnN0IGJvb2wgICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcjsKICAgICB9OwogICAgIHNwPFJlcXVlc3RUaHJlYWQ+IG1SZXF1ZXN0VGhyZWFkOwogCkBAIC05OTIsNiArMTA0NywxNSBAQAogICAgICAgICAvLyBNYXAgb2YgcGh5c2ljYWxDYW1lcmFJZCA8LT4gTWV0YWRhdGEKICAgICAgICAgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gcGh5c2ljYWxNZXRhZGF0YXM7CiAKKyAgICAgICAgLy8gSW5kaWNhdGVzIGEgc3RpbGwgY2FwdHVyZSByZXF1ZXN0LgorICAgICAgICBib29sIHN0aWxsQ2FwdHVyZTsKKworICAgICAgICAvLyBJbmRpY2F0ZXMgYSBaU0wgY2FwdHVyZSByZXF1ZXN0CisgICAgICAgIGJvb2wgenNsQ2FwdHVyZTsKKworICAgICAgICAvLyBXaGF0IHNoYXJlZCBzdXJmYWNlcyBhbiBvdXRwdXQgc2hvdWxkIGdvIHRvCisgICAgICAgIFN1cmZhY2VNYXAgb3V0cHV0U3VyZmFjZXM7CisKICAgICAgICAgLy8gRGVmYXVsdCBjb25zdHJ1Y3RvciBuZWVkZWQgYnkgS2V5ZWRWZWN0b3IKICAgICAgICAgSW5GbGlnaHRSZXF1ZXN0KCkgOgogICAgICAgICAgICAgICAgIHNodXR0ZXJUaW1lc3RhbXAoMCksCkBAIC0xMDAyLDEyICsxMDY2LDE2IEBACiAgICAgICAgICAgICAgICAgaGFzSW5wdXRCdWZmZXIoZmFsc2UpLAogICAgICAgICAgICAgICAgIGhhc0NhbGxiYWNrKHRydWUpLAogICAgICAgICAgICAgICAgIG1heEV4cGVjdGVkRHVyYXRpb24oa0RlZmF1bHRFeHBlY3RlZER1cmF0aW9uKSwKLSAgICAgICAgICAgICAgICBza2lwUmVzdWx0TWV0YWRhdGEoZmFsc2UpIHsKKyAgICAgICAgICAgICAgICBza2lwUmVzdWx0TWV0YWRhdGEoZmFsc2UpLAorICAgICAgICAgICAgICAgIHN0aWxsQ2FwdHVyZShmYWxzZSksCisgICAgICAgICAgICAgICAgenNsQ2FwdHVyZShmYWxzZSkgewogICAgICAgICB9CiAKICAgICAgICAgSW5GbGlnaHRSZXF1ZXN0KGludCBudW1CdWZmZXJzLCBDYXB0dXJlUmVzdWx0RXh0cmFzIGV4dHJhcywgYm9vbCBoYXNJbnB1dCwKICAgICAgICAgICAgICAgICBib29sIGhhc0FwcENhbGxiYWNrLCBuc2Vjc190IG1heER1cmF0aW9uLAotICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PFN0cmluZzg+JiBwaHlzaWNhbENhbWVyYUlkU2V0KSA6CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8U3RyaW5nOD4mIHBoeXNpY2FsQ2FtZXJhSWRTZXQsIGJvb2wgaXNTdGlsbENhcHR1cmUsCisgICAgICAgICAgICAgICAgYm9vbCBpc1pzbENhcHR1cmUsCisgICAgICAgICAgICAgICAgY29uc3QgU3VyZmFjZU1hcCYgb3V0U3VyZmFjZXMgPSBTdXJmYWNlTWFwe30pIDoKICAgICAgICAgICAgICAgICBzaHV0dGVyVGltZXN0YW1wKDApLAogICAgICAgICAgICAgICAgIHNlbnNvclRpbWVzdGFtcCgwKSwKICAgICAgICAgICAgICAgICByZXF1ZXN0U3RhdHVzKE9LKSwKQEAgLTEwMTgsNyArMTA4NiwxMCBAQAogICAgICAgICAgICAgICAgIGhhc0NhbGxiYWNrKGhhc0FwcENhbGxiYWNrKSwKICAgICAgICAgICAgICAgICBtYXhFeHBlY3RlZER1cmF0aW9uKG1heER1cmF0aW9uKSwKICAgICAgICAgICAgICAgICBza2lwUmVzdWx0TWV0YWRhdGEoZmFsc2UpLAotICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWRzKHBoeXNpY2FsQ2FtZXJhSWRTZXQpIHsKKyAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkcyhwaHlzaWNhbENhbWVyYUlkU2V0KSwKKyAgICAgICAgICAgICAgICBzdGlsbENhcHR1cmUoaXNTdGlsbENhcHR1cmUpLAorICAgICAgICAgICAgICAgIHpzbENhcHR1cmUoaXNac2xDYXB0dXJlKSwKKyAgICAgICAgICAgICAgICBvdXRwdXRTdXJmYWNlcyhvdXRTdXJmYWNlcykgewogICAgICAgICB9CiAgICAgfTsKIApAQCAtMTAzMiwxMCArMTEwMywxMSBAQAogICAgIG5zZWNzX3QgICAgICAgICAgICAgICAgbUV4cGVjdGVkSW5mbGlnaHREdXJhdGlvbiA9IDA7CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICBtSW5GbGlnaHRTdGF0dXNJZDsKIAotCiAgICAgc3RhdHVzX3QgcmVnaXN0ZXJJbkZsaWdodCh1aW50MzJfdCBmcmFtZU51bWJlciwKICAgICAgICAgICAgIGludDMyX3QgbnVtQnVmZmVycywgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXMsIGJvb2wgaGFzSW5wdXQsCi0gICAgICAgICAgICBib29sIGNhbGxiYWNrLCBuc2Vjc190IG1heEV4cGVjdGVkRHVyYXRpb24sIHN0ZDo6c2V0PFN0cmluZzg+JiBwaHlzaWNhbENhbWVyYUlkcyk7CisgICAgICAgICAgICBib29sIGNhbGxiYWNrLCBuc2Vjc190IG1heEV4cGVjdGVkRHVyYXRpb24sIHN0ZDo6c2V0PFN0cmluZzg+JiBwaHlzaWNhbENhbWVyYUlkcywKKyAgICAgICAgICAgIGJvb2wgaXNTdGlsbENhcHR1cmUsIGJvb2wgaXNac2xDYXB0dXJlLAorICAgICAgICAgICAgY29uc3QgU3VyZmFjZU1hcCYgb3V0cHV0U3VyZmFjZXMpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJucyB0aGUgbWF4aW11bSBleHBlY3RlZCB0aW1lIGl0J2xsIHRha2UgZm9yIGFsbCBjdXJyZW50bHkgaW4tZmxpZ2h0CkBAIC0xMTIwLDEwICsxMTkyLDE0IEBACiAgICAgdWludDMyX3QgICAgICAgICAgICAgICBtTmV4dFJlc3VsdEZyYW1lTnVtYmVyOwogICAgIC8vIHRoZSBtaW5pbWFsIGZyYW1lIG51bWJlciBvZiB0aGUgbmV4dCByZXByb2Nlc3MgcmVzdWx0CiAgICAgdWludDMyX3QgICAgICAgICAgICAgICBtTmV4dFJlcHJvY2Vzc1Jlc3VsdEZyYW1lTnVtYmVyOworICAgIC8vIHRoZSBtaW5pbWFsIGZyYW1lIG51bWJlciBvZiB0aGUgbmV4dCBaU0wgc3RpbGwgY2FwdHVyZSByZXN1bHQKKyAgICB1aW50MzJfdCAgICAgICAgICAgICAgIG1OZXh0WnNsU3RpbGxSZXN1bHRGcmFtZU51bWJlcjsKICAgICAvLyB0aGUgbWluaW1hbCBmcmFtZSBudW1iZXIgb2YgdGhlIG5leHQgbm9uLXJlcHJvY2VzcyBzaHV0dGVyCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICBtTmV4dFNodXR0ZXJGcmFtZU51bWJlcjsKICAgICAvLyB0aGUgbWluaW1hbCBmcmFtZSBudW1iZXIgb2YgdGhlIG5leHQgcmVwcm9jZXNzIHNodXR0ZXIKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgIG1OZXh0UmVwcm9jZXNzU2h1dHRlckZyYW1lTnVtYmVyOworICAgIC8vIHRoZSBtaW5pbWFsIGZyYW1lIG51bWJlciBvZiB0aGUgbmV4dCBaU0wgc3RpbGwgY2FwdHVyZSBzaHV0dGVyCisgICAgdWludDMyX3QgICAgICAgICAgICAgICBtTmV4dFpzbFN0aWxsU2h1dHRlckZyYW1lTnVtYmVyOwogICAgIExpc3Q8Q2FwdHVyZVJlc3VsdD4gICBtUmVzdWx0UXVldWU7CiAgICAgQ29uZGl0aW9uICAgICAgICAgICAgICBtUmVzdWx0U2lnbmFsOwogICAgIHdwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiAgbUxpc3RlbmVyOwpAQCAtMTE0NSw3ICsxMjIxLDExIEBACiAKICAgICAvLyBoZWxwZXIgZnVuY3Rpb24gdG8gcmV0dXJuIHRoZSBvdXRwdXQgYnVmZmVycyB0byB0aGUgc3RyZWFtcy4KICAgICB2b2lkIHJldHVybk91dHB1dEJ1ZmZlcnMoY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QgKm91dHB1dEJ1ZmZlcnMsCi0gICAgICAgICAgICBzaXplX3QgbnVtQnVmZmVycywgbnNlY3NfdCB0aW1lc3RhbXApOworICAgICAgICAgICAgc2l6ZV90IG51bUJ1ZmZlcnMsIG5zZWNzX3QgdGltZXN0YW1wLCBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcgPSB0cnVlLAorICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBhcmd1bWVudHMgYXJlIG9ubHkgbWVhbnQgZm9yIHN1cmZhY2Ugc2hhcmluZyB1c2UgY2FzZQorICAgICAgICAgICAgY29uc3QgU3VyZmFjZU1hcCYgb3V0cHV0U3VyZmFjZXMgPSBTdXJmYWNlTWFwe30sCisgICAgICAgICAgICAvLyBVc2VkIHRvIHNlbmQgYnVmZmVyIGVycm9yIGNhbGxiYWNrIHdoZW4gZmFpbGluZyB0byByZXR1cm4gYnVmZmVyCisgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzICZyZXN1bHRFeHRyYXMgPSBDYXB0dXJlUmVzdWx0RXh0cmFze30pOwogCiAgICAgLy8gU2VuZCBhIHBhcnRpYWwgY2FwdHVyZSByZXN1bHQuCiAgICAgdm9pZCBzZW5kUGFydGlhbENhcHR1cmVSZXN1bHQoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKiBwYXJ0aWFsUmVzdWx0LApAQCAtMTE1Niw3ICsxMjM2LDggQEAKICAgICB2b2lkIHNlbmRDYXB0dXJlUmVzdWx0KENhbWVyYU1ldGFkYXRhICZwZW5kaW5nTWV0YWRhdGEsCiAgICAgICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzICZyZXN1bHRFeHRyYXMsCiAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSAmY29sbGVjdGVkUGFydGlhbFJlc3VsdCwgdWludDMyX3QgZnJhbWVOdW1iZXIsCi0gICAgICAgICAgICBib29sIHJlcHJvY2VzcywgY29uc3Qgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4mIHBoeXNpY2FsTWV0YWRhdGFzKTsKKyAgICAgICAgICAgIGJvb2wgcmVwcm9jZXNzLCBib29sIHpzbFN0aWxsQ2FwdHVyZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+JiBwaHlzaWNhbE1ldGFkYXRhcyk7CiAKICAgICBib29sIGlzTGFzdEZ1bGxSZXN1bHQoY29uc3QgSW5GbGlnaHRSZXF1ZXN0JiBpbkZsaWdodFJlcXVlc3QpOwogCkBAIC0xMTgzLDggKzEyNjQsMTAgQEAKICAgICAvKioKICAgICAgKiBEaXN0b3J0aW9uIGNvcnJlY3Rpb24gc3VwcG9ydAogICAgICAqLwotCi0gICAgY2FtZXJhMzo6RGlzdG9ydGlvbk1hcHBlciBtRGlzdG9ydGlvbk1hcHBlcjsKKyAgICAvLyBNYXAgZnJvbSBjYW1lcmEgSURzIHRvIGl0cyBjb3JyZXNwb25kaW5nIGRpc3RvcnRpb24gbWFwcGVyLiBPbmx5IGNvbnRhaW5zCisgICAgLy8gMSBJRCBpZiB0aGUgZGV2aWNlIGlzbid0IGEgbG9naWNhbCBtdWx0aS1jYW1lcmEuIE90aGVyd2lzZSBjb250YWlucyBib3RoCisgICAgLy8gbG9naWNhbCBjYW1lcmEgYW5kIGl0cyBwaHlzaWNhbCBzdWJjYW1lcmFzLgorICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgY2FtZXJhMzo6RGlzdG9ydGlvbk1hcHBlcj4gbURpc3RvcnRpb25NYXBwZXJzOwogCiAgICAgLy8gRGVidWcgdHJhY2tlciBmb3IgbWV0YWRhdGEgdGFnIHZhbHVlIGNoYW5nZXMKICAgICAvLyAtIEVuYWJsZWQgd2l0aCB0aGUgLW0gPHRhZ2xpc3Q+IG9wdGlvbiB0byBkdW1wc3lzLCBzdWNoIGFzCkBAIC0xMTk0LDIwICsxMjc3LDk2IEBACiAgICAgVGFnTW9uaXRvciBtVGFnTW9uaXRvcjsKIAogICAgIHZvaWQgbW9uaXRvck1ldGFkYXRhKFRhZ01vbml0b3I6OmV2ZW50U291cmNlIHNvdXJjZSwgaW50NjRfdCBmcmFtZU51bWJlciwKLSAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEpOworICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgQ2FtZXJhTWV0YWRhdGE+JiBwaHlzaWNhbE1ldGFkYXRhKTsKIAogICAgIG1ldGFkYXRhX3ZlbmRvcl9pZF90IG1WZW5kb3JUYWdJZDsKIAogICAgIC8vIENhY2hlZCBsYXN0IHJlcXVlc3RlZCB0ZW1wbGF0ZSBpZAogICAgIGludCBtTGFzdFRlbXBsYXRlSWQ7CiAKLSAgICAvKioKLSAgICAgKiBTdGF0aWMgY2FsbGJhY2sgZm9yd2FyZGluZyBtZXRob2RzIGZyb20gSEFMIHRvIGluc3RhbmNlCi0gICAgICovCi0gICAgc3RhdGljIGNhbGxiYWNrc19wcm9jZXNzX2NhcHR1cmVfcmVzdWx0X3Qgc1Byb2Nlc3NDYXB0dXJlUmVzdWx0OworICAgIC8vIFN5bmNocm9uaXplcyBhY2Nlc3MgdG8gc3RhdHVzIHRyYWNrZXIgYmV0d2VlbiBpbmZsaWdodCB1cGRhdGVzIGFuZCBkaXNjb25uZWN0LgorICAgIC8vIGIvNzk5NzI4NjUKKyAgICBNdXRleCBtVHJhY2tlckxvY2s7CiAKLSAgICBzdGF0aWMgY2FsbGJhY2tzX25vdGlmeV90IHNOb3RpZnk7CisgICAgLy8gV2hldGhlciBIQUwgcmVxdWVzdCBidWZmZXJzIHRocm91Z2ggcmVxdWVzdFN0cmVhbUJ1ZmZlcnMgQVBJCisgICAgYm9vbCBtVXNlSGFsQnVmTWFuYWdlciA9IGZhbHNlOwogCisgICAgLy8gTG9jayB0byBlbnN1cmUgcmVxdWVzdFN0cmVhbUJ1ZmZlcnMoKSBjYWxsYmFja3MgYXJlIHNlcmlhbGl6ZWQKKyAgICBzdGQ6Om11dGV4IG1SZXF1ZXN0QnVmZmVySW50ZXJmYWNlTG9jazsKKworICAgIC8vIFRoZSBzdGF0ZSBtYWNoaW5lIHRvIGNvbnRyb2wgd2hlbiByZXF1ZXN0U3RyZWFtQnVmZmVycyBzaG91bGQgYWxsb3cKKyAgICAvLyBIQUwgdG8gcmVxdWVzdCBidWZmZXJzLgorICAgIGVudW0gUmVxdWVzdEJ1ZmZlclN0YXRlIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgaXMgdGhlIGluaXRpYWwgc3RhdGUuCisgICAgICAgICAqIHJlcXVlc3RTdHJlYW1CdWZmZXJzIGNhbGwgd2lsbCByZXR1cm4gRkFJTEVEX0NPTkZJR1VSSU5HIGluIHRoaXMgc3RhdGUuCisgICAgICAgICAqIFdpbGwgc3dpdGNoIHRvIFJCX1NUQVRVU19SRUFEWSBhZnRlciBhIHN1Y2Nlc3NmdWwgY29uZmlndXJlU3RyZWFtcyBvcgorICAgICAgICAgKiBwcm9jZXNzQ2FwdHVyZVJlcXVlc3QgY2FsbC4KKyAgICAgICAgICovCisgICAgICAgIFJCX1NUQVRVU19TVE9QUEVELAorCisgICAgICAgIC8qKgorICAgICAgICAgKiByZXF1ZXN0U3RyZWFtQnVmZmVycyBjYWxsIHdpbGwgcHJvY2VlZCBpbiB0aGlzIHN0YXRlLgorICAgICAgICAgKiBXaGVuIGRldmljZSBpcyBhc2tlZCB0byBzdGF5IGlkbGUgdmlhIHdhaXRVbnRpbFN0YXRlVGhlblJlbG9jaygpIGNhbGw6CisgICAgICAgICAqICAgICAtIFN3aXRjaCB0byBSQl9TVEFUVVNfU1RPUFBFRCBpZiB0aGVyZSBpcyBubyBpbmZsaWdodCByZXF1ZXN0cyBhbmQKKyAgICAgICAgICogICAgICAgcmVxdWVzdCB0aHJlYWQgaXMgcGF1c2VkLgorICAgICAgICAgKiAgICAgLSBTd2l0Y2ggdG8gUkJfU1RBVFVTX1BFTkRJTkdfU1RPUCBvdGhlcndpc2UKKyAgICAgICAgICovCisgICAgICAgIFJCX1NUQVRVU19SRUFEWSwKKworICAgICAgICAvKioKKyAgICAgICAgICogcmVxdWVzdFN0cmVhbUJ1ZmZlcnMgY2FsbCB3aWxsIHByb2NlZWQgaW4gdGhpcyBzdGF0ZS4KKyAgICAgICAgICogU3dpdGNoIHRvIFJCX1NUQVRVU19TVE9QUEVEIHdoZW4gYWxsIGluZmxpZ2h0IHJlcXVlc3RzIGFyZSBmdWxmaWxsZWQKKyAgICAgICAgICogYW5kIHJlcXVlc3QgdGhyZWFkIGlzIHBhdXNlZAorICAgICAgICAgKi8KKyAgICAgICAgUkJfU1RBVFVTX1BFTkRJTkdfU1RPUCwKKyAgICB9OworCisgICAgY2xhc3MgUmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZSB7CisgICAgICBwdWJsaWM6CisgICAgICAgIHN0YXR1c190IGluaXRpYWxpemUoc3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlcik7CisKKyAgICAgICAgLy8gUmV0dXJuIGlmIHRoZSBzdGF0ZSBtYWNoaW5lIGN1cnJlbnRseSBhbGxvd3MgZm9yIHJlcXVlc3RCdWZmZXJzCisgICAgICAgIC8vIElmIHRoZSBzdGF0ZSBhbGxvd3MgZm9yIGl0LCBtUmVxdWVzdEJ1ZmZlck9uZ29pbmcgd2lsbCBiZSBzZXQgdG8gdHJ1ZQorICAgICAgICAvLyBhbmQgY2FsbGVyIG11c3QgY2FsbCBlbmRSZXF1ZXN0QnVmZmVyKCkgbGF0ZXIgdG8gdW5zZXQgdGhlIGZsYWcKKyAgICAgICAgYm9vbCBzdGFydFJlcXVlc3RCdWZmZXIoKTsKKyAgICAgICAgdm9pZCBlbmRSZXF1ZXN0QnVmZmVyKCk7CisKKyAgICAgICAgLy8gRXZlbnRzIHRyaWdnZXJlZCBieSBhcHBsaWNhdGlvbiBBUEkgY2FsbAorICAgICAgICB2b2lkIG9uU3RyZWFtc0NvbmZpZ3VyZWQoKTsKKyAgICAgICAgdm9pZCBvbldhaXRVbnRpbElkbGUoKTsKKworICAgICAgICAvLyBFdmVudHMgdXN1YWxseSB0cmlnZ2VyZWQgYnkgaHdCaW5kZXIgcHJvY2Vzc0NhcHR1cmVSZXN1bHQgY2FsbGJhY2sgdGhyZWFkCisgICAgICAgIC8vIEJ1dCBjYW4gYWxzbyBiZSB0cmlnZ2VyZWQgb24gcmVxdWVzdCB0aHJlYWQgZm9yIGZhaWxlZCByZXF1ZXN0LCBvciBvbgorICAgICAgICAvLyBod2JpbmRlciBub3RpZnkgY2FsbGJhY2sgdGhyZWFkIGZvciBzaHV0dGVyL2Vycm9yIGNhbGxiYWNrcworICAgICAgICB2b2lkIG9uSW5mbGlnaHRNYXBFbXB0eSgpOworCisgICAgICAgIC8vIEV2ZW50cyB0cmlnZ2VyZWQgYnkgUmVxdWVzdFRocmVhZAorICAgICAgICB2b2lkIG9uU3VibWl0dGluZ1JlcXVlc3QoKTsKKyAgICAgICAgdm9pZCBvblJlcXVlc3RUaHJlYWRQYXVzZWQoKTsKKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBub3RpZnlUcmFja2VyTG9ja2VkKGJvb2wgYWN0aXZlKTsKKworICAgICAgICAvLyBTd2l0Y2ggdG8gU1RPUFBFRCBzdGF0ZSBhbmQgcmV0dXJuIHRydWUgaWYgYWxsIGNvbmRpdGlvbnMgYWxsb3dzIGZvciBpdC4KKyAgICAgICAgLy8gT3RoZXJ3aXNlIGRvIG5vdGhpbmcgYW5kIHJldHVybiBmYWxzZS4KKyAgICAgICAgYm9vbCBjaGVja1N3aXRjaFRvU3RvcExvY2tlZCgpOworCisgICAgICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgICAgIFJlcXVlc3RCdWZmZXJTdGF0ZSBtU3RhdHVzID0gUkJfU1RBVFVTX1NUT1BQRUQ7CisKKyAgICAgICAgYm9vbCBtUmVxdWVzdFRocmVhZFBhdXNlZCA9IHRydWU7CisgICAgICAgIGJvb2wgbUluZmxpZ2h0TWFwRW1wdHkgPSB0cnVlOworICAgICAgICBib29sIG1SZXF1ZXN0QnVmZmVyT25nb2luZyA9IGZhbHNlOworCisgICAgICAgIHdwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+IG1TdGF0dXNUcmFja2VyOworICAgICAgICBpbnQgIG1SZXF1ZXN0QnVmZmVyU3RhdHVzSWQ7CisgICAgfSBtUmVxdWVzdEJ1ZmZlclNNOworCisgICAgLy8gRml4IHVwIHJlc3VsdCBtZXRhZGF0YSBmb3IgbW9ub2Nocm9tZSBjYW1lcmEuCisgICAgYm9vbCBtTmVlZEZpeHVwTW9ub2Nocm9tZVRhZ3M7CisgICAgc3RhdHVzX3QgZml4dXBNb25vY2hyb21lVGFncyhjb25zdCBDYW1lcmFNZXRhZGF0YSYgZGV2aWNlSW5mbywgQ2FtZXJhTWV0YWRhdGEmIHJlc3VsdE1ldGFkYXRhKTsKIH07IC8vIGNsYXNzIENhbWVyYTNEZXZpY2UKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcAppbmRleCBmYjFmZjc3Li5iNjM3MTYwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwCkBAIC00OCw3ICs0OCw3IEBACiAKIHN0YXR1c190IENhbWVyYTNEdW1teVN0cmVhbTo6cmV0dXJuQnVmZmVyTG9ja2VkKAogICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJiwKLSAgICAgICAgbnNlY3NfdCkgeworICAgICAgICBuc2Vjc190LCBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IER1bW15IHN0cmVhbSBjYW5ub3QgcmV0dXJuIGJ1ZmZlcnMhIiwgX19GVU5DVElPTl9fLCBtSWQpOwogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTU4LDYgKzU4LDcgQEAKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmLAogICAgICAgICAgICAgbnNlY3NfdCwKICAgICAgICAgICAgIGJvb2wsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiwKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiopIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmgKaW5kZXggNDYyNzU0OC4uNGI2N2VhNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5oCkBAIC04Nyw2ICs4Nyw5IEBACiAgICAgICovCiAgICAgdmlydHVhbCBzc2l6ZV90IGdldFN1cmZhY2VJZChjb25zdCBzcDxTdXJmYWNlPiAmLypzdXJmYWNlKi8pIHsgcmV0dXJuIDA7IH0KIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VW5pcXVlU3VyZmFjZUlkcyhjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiwKKyAgICAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxzaXplX3Q+KikgeyByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047IH07CisKICAgICAvKioKICAgICAgKiBVcGRhdGUgdGhlIHN0cmVhbSBvdXRwdXQgc3VyZmFjZXMuCiAgICAgICovCkBAIC0xMDQsNiArMTA3LDcgQEAKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpOwogCkBAIC0xMjgsNyArMTMyLDcgQEAKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckxvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApOworICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlUXVldWVMb2NrZWQoKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAKaW5kZXggM2MxZTQzZC4uZWYwZDkxOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwCkBAIC04Miw2ICs4Miw5IEBACiAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBNYXggc2l6ZTogJXp1XG4iLCBtTWF4U2l6ZSk7CiAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBDb21iaW5lZCB1c2FnZTogJSIgUFJJdTY0ICIsIG1heCBIQUwgYnVmZmVyczogJWRcbiIsCiAgICAgICAgICAgICBtVXNhZ2UgfCBjb25zdW1lclVzYWdlLCBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMpOworICAgIGlmIChzdHJsZW4oY2FtZXJhM19zdHJlYW06OnBoeXNpY2FsX2NhbWVyYV9pZCkgPiAwKSB7CisgICAgICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgUGh5c2ljYWwgY2FtZXJhIGlkOiAlc1xuIiwgY2FtZXJhM19zdHJlYW06OnBoeXNpY2FsX2NhbWVyYV9pZCk7CisgICAgfQogICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgRnJhbWVzIHByb2R1Y2VkOiAlZCwgbGFzdCB0aW1lc3RhbXA6ICUiIFBSSWQ2NCAiIG5zXG4iLAogICAgICAgICAgICAgbUZyYW1lQ291bnQsIG1MYXN0VGltZXN0YW1wKTsKICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIFRvdGFsIGJ1ZmZlcnM6ICV6dSwgY3VycmVudGx5IGRlcXVldWVkOiAlenVcbiIsCkBAIC0xMTYsNyArMTE5LDcgQEAKICAgICByZXR1cm4gbVRvdGFsQnVmZmVyQ291bnQ7CiB9CiAKLXNpemVfdCBDYW1lcmEzSU9TdHJlYW1CYXNlOjpnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKSB7CitzaXplX3QgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6Z2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgY29uc3QgewogICAgIHJldHVybiBtSGFuZG91dE91dHB1dEJ1ZmZlckNvdW50OwogfQogCkBAIC0yMTksNyArMjIyLDggQEAKIHN0YXR1c190IENhbWVyYTNJT1N0cmVhbUJhc2U6OnJldHVybkFueUJ1ZmZlckxvY2tlZCgKICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAotICAgICAgICBib29sIG91dHB1dCkgeworICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpIHsKICAgICBzdGF0dXNfdCByZXM7CiAKICAgICAvLyByZXR1cm5CdWZmZXIgbWF5IGJlIGNhbGxlZCBmcm9tIGEgcmF3IHBvaW50ZXIsIG5vdCBhIHNwPD4sIGFuZCB3ZSdsbCBiZQpAQCAtMjM1LDcgKzIzOSw3IEBACiAgICAgfQogCiAgICAgc3A8RmVuY2U+IHJlbGVhc2VGZW5jZTsKLSAgICByZXMgPSByZXR1cm5CdWZmZXJDaGVja2VkTG9ja2VkKGJ1ZmZlciwgdGltZXN0YW1wLCBvdXRwdXQsCisgICAgcmVzID0gcmV0dXJuQnVmZmVyQ2hlY2tlZExvY2tlZChidWZmZXIsIHRpbWVzdGFtcCwgb3V0cHV0LCBzdXJmYWNlX2lkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZWxlYXNlRmVuY2UpOwogICAgIC8vIFJlcyBtYXkgYmUgYW4gZXJyb3IsIGJ1dCB3ZSBzdGlsbCB3YW50IHRvIGRlY3JlbWVudCBvdXIgb3duZWQgY291bnQKICAgICAvLyB0byBlbmFibGUgY2xlYW4gc2h1dGRvd24uIFNvIHdlJ2xsIGp1c3QgcmV0dXJuIHRoZSBlcnJvciBidXQgb3RoZXJ3aXNlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCmluZGV4IDBhMzFkNDQuLjc1MGY2NGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5oCkBAIC02NiwxMiArNjYsMTQgQEAKICAgICBzdGF0dXNfdCAgICAgICAgIHJldHVybkFueUJ1ZmZlckxvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCi0gICAgICAgICAgICBib29sIG91dHB1dCk7CisgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyQ2hlY2tlZExvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpID0gMDsKIApAQCAtODIsNyArODQsNyBAQAogCiAgICAgdmlydHVhbCBzaXplX3QgICBnZXRCdWZmZXJDb3VudExvY2tlZCgpOwogCi0gICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKTsKKyAgICB2aXJ0dWFsIHNpemVfdCAgIGdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpIGNvbnN0OwogCiAgICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0SW5wdXRCdWZmZXJDb3VudExvY2tlZCgpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKaW5kZXggMDE3ZDdiZS4uZmM4MzY4NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcApAQCAtOTgsNiArOTgsNyBAQAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKICAgICAgICAgICAgIGJvb2wgb3V0cHV0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxGZW5jZT4gKnJlbGVhc2VGZW5jZU91dCkgewogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaAppbmRleCAwNzMyNDY0Li45N2E2MjdhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgKQEAgLTYyLDYgKzYyLDcgQEAKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcAppbmRleCAyYzAyMGEyLi5hY2I4YjNjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAKQEAgLTE4NywxNiArMTg3LDE3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OnF1ZXVlQnVmZmVyVG9Db25zdW1lcihzcDxBTmF0aXZlV2luZG93PiYgY29uc3VtZXIsCi0gICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGludCBhbndSZWxlYXNlRmVuY2UpIHsKKyAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgaW50IGFud1JlbGVhc2VGZW5jZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mKSB7CiAgICAgcmV0dXJuIGNvbnN1bWVyLT5xdWV1ZUJ1ZmZlcihjb25zdW1lci5nZXQoKSwgYnVmZmVyLCBhbndSZWxlYXNlRmVuY2UpOwogfQogCiBzdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpyZXR1cm5CdWZmZXJMb2NrZWQoCiAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCkgeworICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCi0gICAgc3RhdHVzX3QgcmVzID0gcmV0dXJuQW55QnVmZmVyTG9ja2VkKGJ1ZmZlciwgdGltZXN0YW1wLCAvKm91dHB1dCovdHJ1ZSk7CisgICAgc3RhdHVzX3QgcmVzID0gcmV0dXJuQW55QnVmZmVyTG9ja2VkKGJ1ZmZlciwgdGltZXN0YW1wLCAvKm91dHB1dCovdHJ1ZSwgc3VyZmFjZV9pZHMpOwogCiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICByZXR1cm4gcmVzOwpAQCAtMjEyLDYgKzIxMyw3IEBACiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAogICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcywKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiAqcmVsZWFzZUZlbmNlT3V0KSB7CiAKQEAgLTIzMSwyNCArMjMzLDI3IEBACiAgICAgICogcXVldWVCdWZmZXIKICAgICAgKi8KICAgICBzcDxBTmF0aXZlV2luZG93PiBjdXJyZW50Q29uc3VtZXIgPSBtQ29uc3VtZXI7CisgICAgU3RyZWFtU3RhdGUgc3RhdGUgPSBtU3RhdGU7CiAgICAgbUxvY2sudW5sb2NrKCk7CiAKICAgICBBTmF0aXZlV2luZG93QnVmZmVyICphbndCdWZmZXIgPSBjb250YWluZXJfb2YoYnVmZmVyLmJ1ZmZlciwgQU5hdGl2ZVdpbmRvd0J1ZmZlciwgaGFuZGxlKTsKICAgICAvKioKICAgICAgKiBSZXR1cm4gYnVmZmVyIGJhY2sgdG8gQU5hdGl2ZVdpbmRvdwogICAgICAqLwotICAgIGlmIChidWZmZXIuc3RhdHVzID09IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUiB8fCBtRHJvcEJ1ZmZlcnMpIHsKKyAgICBpZiAoYnVmZmVyLnN0YXR1cyA9PSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1IgfHwgbURyb3BCdWZmZXJzIHx8IHRpbWVzdGFtcCA9PSAwKSB7CiAgICAgICAgIC8vIENhbmNlbCBidWZmZXIKICAgICAgICAgaWYgKG1Ecm9wQnVmZmVycykgewogICAgICAgICAgICAgQUxPR1YoIiVzOiBEcm9wcGluZyBhIGZyYW1lIGZvciBzdHJlYW0gJWQuIiwgX19GVU5DVElPTl9fLCBtSWQpOworICAgICAgICB9IGVsc2UgaWYgKGJ1ZmZlci5zdGF0dXMgPT0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IEEgZnJhbWUgaXMgZHJvcHBlZCBmb3Igc3RyZWFtICVkIGR1ZSB0byBidWZmZXIgZXJyb3IuIiwgX19GVU5DVElPTl9fLCBtSWQpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1coIiVzOiBBIGZyYW1lIGlzIGRyb3BwZWQgZm9yIHN0cmVhbSAlZCBkdWUgdG8gYnVmZmVyIGVycm9yLiIsIF9fRlVOQ1RJT05fXywgbUlkKTsKKyAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiB0aW1lc3RhbXAgc2hvdWxkbid0IGJlIDAiLCBfX0ZVTkNUSU9OX18sIG1JZCk7CiAgICAgICAgIH0KIAogICAgICAgICByZXMgPSBjdXJyZW50Q29uc3VtZXItPmNhbmNlbEJ1ZmZlcihjdXJyZW50Q29uc3VtZXIuZ2V0KCksCiAgICAgICAgICAgICAgICAgYW53QnVmZmVyLAogICAgICAgICAgICAgICAgIGFud1JlbGVhc2VGZW5jZSk7Ci0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgaWYgKHNob3VsZExvZ0Vycm9yKHJlcywgc3RhdGUpKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRXJyb3IgY2FuY2VsbGluZyBidWZmZXIgdG8gbmF0aXZlIHdpbmRvdzoiCiAgICAgICAgICAgICAgICAgICAiICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgIH0KQEAgLTI3OSwxMCArMjg0LDEwIEBACiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAKLSAgICAgICAgcmVzID0gcXVldWVCdWZmZXJUb0NvbnN1bWVyKGN1cnJlbnRDb25zdW1lciwgYW53QnVmZmVyLCBhbndSZWxlYXNlRmVuY2UpOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRXJyb3IgcXVldWVpbmcgYnVmZmVyIHRvIG5hdGl2ZSB3aW5kb3c6ICIKLSAgICAgICAgICAgICAgICAgICIlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXMgPSBxdWV1ZUJ1ZmZlclRvQ29uc3VtZXIoY3VycmVudENvbnN1bWVyLCBhbndCdWZmZXIsIGFud1JlbGVhc2VGZW5jZSwgc3VyZmFjZV9pZHMpOworICAgICAgICBpZiAoc2hvdWxkTG9nRXJyb3IocmVzLCBzdGF0ZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBFcnJvciBxdWV1ZWluZyBidWZmZXIgdG8gbmF0aXZlIHdpbmRvdzoiCisgICAgICAgICAgICAgICAgICAiICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgIH0KICAgICB9CiAgICAgbUxvY2subG9jaygpOwpAQCAtMzU1LDcgKzM2MCwxOCBAQAogICAgIC8vIFNldCBkZXF1ZXVlQnVmZmVyL2F0dGFjaEJ1ZmZlciB0aW1lb3V0IGlmIHRoZSBjb25zdW1lciBpcyBub3QgaHcgY29tcG9zZXIgb3IgaHcgdGV4dHVyZS4KICAgICAvLyBXZSBuZWVkIHNraXAgdGhlc2UgY2FzZXMgYXMgdGltZW91dCB3aWxsIGRpc2FibGUgdGhlIG5vbi1ibG9ja2luZyAoYXN5bmMpIG1vZGUuCiAgICAgaWYgKCEoaXNDb25zdW1lZEJ5SFdDb21wb3NlcigpIHx8IGlzQ29uc3VtZWRCeUhXVGV4dHVyZSgpKSkgewotICAgICAgICBtQ29uc3VtZXItPnNldERlcXVldWVUaW1lb3V0KGtEZXF1ZXVlQnVmZmVyVGltZW91dCk7CisgICAgICAgIGlmIChtVXNlQnVmZmVyTWFuYWdlcikgeworICAgICAgICAgICAgLy8gV2hlbiBidWZmZXIgbWFuYWdlciBpcyBoYW5kbGluZyB0aGUgYnVmZmVyLCB3ZSBzaG91bGQgaGF2ZSBhdmFpbGFibGUgYnVmZmVycyBpbgorICAgICAgICAgICAgLy8gYnVmZmVyIHF1ZXVlIGJlZm9yZSB3ZSBjYWxscyBpbnRvIGRlcXVldWVCdWZmZXIgYmVjYXVzZSBidWZmZXIgbWFuYWdlciBpcyB0cmFja2luZworICAgICAgICAgICAgLy8gZnJlZSBidWZmZXJzLgorICAgICAgICAgICAgLy8gVGhlcmUgYXJlIGhvd2V2ZXIgc29tZSBjb25zdW1lciBzaWRlIGZlYXR1cmUgKEltYWdlUmVhZGVyOjpkaXNjYXJkRnJlZUJ1ZmZlcnMpIHRoYXQKKyAgICAgICAgICAgIC8vIGNhbiBkaXNjYXJkIGZyZWUgYnVmZmVycyB3aXRob3V0IG5vdGlmeWluZyBidWZmZXIgbWFuYWdlci4gV2Ugd2FudCB0aGUgdGltZW91dCB0bworICAgICAgICAgICAgLy8gaGFwcGVuIGltbWVkaWF0ZWx5IGhlcmUgc28gYnVmZmVyIG1hbmFnZXIgY2FuIHRyeSB0byB1cGRhdGUgaXRzIGludGVybmFsIHN0YXRlIGFuZAorICAgICAgICAgICAgLy8gdHJ5IHRvIGFsbG9jYXRlIGEgYnVmZmVyIGluc3RlYWQgb2Ygd2FpdGluZy4KKyAgICAgICAgICAgIG1Db25zdW1lci0+c2V0RGVxdWV1ZVRpbWVvdXQoMCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQ29uc3VtZXItPnNldERlcXVldWVUaW1lb3V0KGtEZXF1ZXVlQnVmZmVyVGltZW91dCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gT0s7CkBAIC00NzUsOCArNDkxLDExIEBACiAgICAgICogc2V0cyB0aGUgbUJ1ZmZlck1hbmFnZXIgaWYgZGV2aWNlIHZlcnNpb24gaXMgPiBIQUwzLjIsIHdoaWNoIGd1YXJhbnRlZXMgdGhhdCB0aGUgYnVmZmVyCiAgICAgICogbWFuYWdlciBzZXR1cCBpcyBza2lwcGVkIGluIGJlbG93IGNvZGUuIE5vdGUgdGhhdCBIQUwzLjIgaXMgYWxzbyBleGNsdWRlZCBoZXJlLCBhcyBzb21lCiAgICAgICogSEFMMy4yIGRldmljZXMgbWF5IG5vdCBzdXBwb3J0IHRoZSBkeW5hbWljIGJ1ZmZlciByZWdpc3RlcmF0aW9uLgorICAgICAqIEFsc28gQ2FtZXJhM0J1ZmZlck1hbmFnZXIgZG9lcyBub3Qgc3VwcG9ydCBkaXNwbGF5L3RleHR1cmUgc3RyZWFtcyBhcyB0aGV5IGhhdmUgaXRzIG93bgorICAgICAqIGJ1ZmZlciBtYW5hZ2VtZW50IGxvZ2ljLgogICAgICAqLwotICAgIGlmIChtQnVmZmVyTWFuYWdlciAhPSAwICYmIG1TZXRJZCA+IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElEKSB7CisgICAgaWYgKG1CdWZmZXJNYW5hZ2VyICE9IDAgJiYgbVNldElkID4gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQgJiYKKyAgICAgICAgICAgICEoaXNDb25zdW1lZEJ5SFdDb21wb3NlcigpIHx8IGlzQ29uc3VtZWRCeUhXVGV4dHVyZSgpKSkgewogICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlID0gMDsKICAgICAgICAgZ2V0RW5kcG9pbnRVc2FnZSgmY29uc3VtZXJVc2FnZSk7CiAgICAgICAgIFN0cmVhbUluZm8gc3RyZWFtSW5mbygKQEAgLTUxOSw5ICs1MzgsMTIgQEAKICAgICAgICAgICAgIC8vIHN1Y2Nlc3NmdWwgcmV0dXJuLgogICAgICAgICAgICAgKmFuYiA9IGdiLmdldCgpOwogICAgICAgICAgICAgcmVzID0gbUNvbnN1bWVyLT5hdHRhY2hCdWZmZXIoKmFuYik7Ci0gICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBpZiAoc2hvdWxkTG9nRXJyb3IocmVzLCBtU3RhdGUpKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENhbid0IGF0dGFjaCB0aGUgb3V0cHV0IGJ1ZmZlciB0byB0aGlzIHN1cmZhY2U6ICVzICglZCkiLAogICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIGNoZWNrUmV0QW5kU2V0QWJhbmRvbmVkTG9ja2VkKHJlcyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGdvdEJ1ZmZlckZyb21NYW5hZ2VyID0gdHJ1ZTsKQEAgLTU1OCwzNSArNTgwLDgyIEBACiAgICAgICAgIG1EZXF1ZXVlQnVmZmVyTGF0ZW5jeS5hZGQoZGVxdWV1ZVN0YXJ0LCBkZXF1ZXVlRW5kKTsKIAogICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW4ndCBkZXF1ZXVlIG5leHQgb3V0cHV0IGJ1ZmZlcjogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKIAotICAgICAgICAgICAgLy8gT25seSB0cmFuc2l0aW9uIHRvIFNUQVRFX0FCQU5ET05FRCBmcm9tIFNUQVRFX0NPTkZJR1VSRUQuIChJZiBpdCBpcyBTVEFURV9QUkVQQVJJTkcsCi0gICAgICAgICAgICAvLyBsZXQgcHJlcGFyZU5leHRCdWZmZXIgaGFuZGxlIHRoZSBlcnJvci4pCi0gICAgICAgICAgICBpZiAoKHJlcyA9PSBOT19JTklUIHx8IHJlcyA9PSBERUFEX09CSkVDVCkgJiYgbVN0YXRlID09IFNUQVRFX0NPTkZJR1VSRUQpIHsKLSAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9BQkFORE9ORUQ7CisgICAgICAgIGlmIChtVXNlQnVmZmVyTWFuYWdlciAmJiByZXMgPT0gVElNRURfT1VUKSB7CisgICAgICAgICAgICBjaGVja1JlbW92ZWRCdWZmZXJzTG9ja2VkKCk7CisKKyAgICAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdiOworICAgICAgICAgICAgcmVzID0gbUJ1ZmZlck1hbmFnZXItPmdldEJ1ZmZlckZvclN0cmVhbSgKKyAgICAgICAgICAgICAgICAgICAgZ2V0SWQoKSwgZ2V0U3RyZWFtU2V0SWQoKSwgJmdiLCBmZW5jZUZkLCAvKm5vRnJlZUJ1ZmZlciovdHJ1ZSk7CisKKyAgICAgICAgICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAvLyBBdHRhY2ggdGhpcyBidWZmZXIgdG8gdGhlIGJ1ZmZlclF1ZXVlOiB0aGUgYnVmZmVyIHdpbGwgYmUgaW4gZGVxdWV1ZSBzdGF0ZSBhZnRlcgorICAgICAgICAgICAgICAgIC8vIGEgc3VjY2Vzc2Z1bCByZXR1cm4uCisgICAgICAgICAgICAgICAgKmFuYiA9IGdiLmdldCgpOworICAgICAgICAgICAgICAgIHJlcyA9IG1Db25zdW1lci0+YXR0YWNoQnVmZmVyKCphbmIpOworICAgICAgICAgICAgICAgIGdvdEJ1ZmZlckZyb21NYW5hZ2VyID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBBTE9HVigiU3RyZWFtICVkOiBBdHRhY2hlZCBuZXcgYnVmZmVyIiwgZ2V0SWQoKSk7CisKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRMb2dFcnJvcihyZXMsIG1TdGF0ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW4ndCBhdHRhY2ggdGhlIG91dHB1dCBidWZmZXIgdG8gdGhpcyBzdXJmYWNlOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGNoZWNrUmV0QW5kU2V0QWJhbmRvbmVkTG9ja2VkKHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ2FuJ3QgZ2V0IG5leHQgb3V0cHV0IGJ1ZmZlciBmcm9tIGJ1ZmZlciBtYW5hZ2VyOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICAgICAgfQotCisgICAgICAgIH0gZWxzZSBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBpZiAoc2hvdWxkTG9nRXJyb3IocmVzLCBtU3RhdGUpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENhbid0IGRlcXVldWUgbmV4dCBvdXRwdXQgYnVmZmVyOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNoZWNrUmV0QW5kU2V0QWJhbmRvbmVkTG9ja2VkKHJlcyk7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKHJlcyA9PSBPSykgewotICAgICAgICBzdGQ6OnZlY3RvcjxzcDxHcmFwaGljQnVmZmVyPj4gcmVtb3ZlZEJ1ZmZlcnM7Ci0gICAgICAgIHJlcyA9IG1Db25zdW1lci0+Z2V0QW5kRmx1c2hSZW1vdmVkQnVmZmVycygmcmVtb3ZlZEJ1ZmZlcnMpOwotICAgICAgICBpZiAocmVzID09IE9LKSB7Ci0gICAgICAgICAgICBvbkJ1ZmZlcnNSZW1vdmVkTG9ja2VkKHJlbW92ZWRCdWZmZXJzKTsKLQotICAgICAgICAgICAgaWYgKG1Vc2VCdWZmZXJNYW5hZ2VyICYmIHJlbW92ZWRCdWZmZXJzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBtQnVmZmVyTWFuYWdlci0+b25CdWZmZXJzUmVtb3ZlZChnZXRJZCgpLCBnZXRTdHJlYW1TZXRJZCgpLCByZW1vdmVkQnVmZmVycy5zaXplKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIGNoZWNrUmVtb3ZlZEJ1ZmZlcnNMb2NrZWQoKTsKICAgICB9CiAKICAgICByZXR1cm4gcmVzOwogfQogCit2b2lkIENhbWVyYTNPdXRwdXRTdHJlYW06OmNoZWNrUmVtb3ZlZEJ1ZmZlcnNMb2NrZWQoYm9vbCBub3RpZnlCdWZmZXJNYW5hZ2VyKSB7CisgICAgc3RkOjp2ZWN0b3I8c3A8R3JhcGhpY0J1ZmZlcj4+IHJlbW92ZWRCdWZmZXJzOworICAgIHN0YXR1c190IHJlcyA9IG1Db25zdW1lci0+Z2V0QW5kRmx1c2hSZW1vdmVkQnVmZmVycygmcmVtb3ZlZEJ1ZmZlcnMpOworICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgb25CdWZmZXJzUmVtb3ZlZExvY2tlZChyZW1vdmVkQnVmZmVycyk7CisKKyAgICAgICAgaWYgKG5vdGlmeUJ1ZmZlck1hbmFnZXIgJiYgbVVzZUJ1ZmZlck1hbmFnZXIgJiYgcmVtb3ZlZEJ1ZmZlcnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgbUJ1ZmZlck1hbmFnZXItPm9uQnVmZmVyc1JlbW92ZWQoZ2V0SWQoKSwgZ2V0U3RyZWFtU2V0SWQoKSwgcmVtb3ZlZEJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpjaGVja1JldEFuZFNldEFiYW5kb25lZExvY2tlZChzdGF0dXNfdCByZXMpIHsKKyAgICAvLyBPbmx5IHRyYW5zaXRpb24gdG8gU1RBVEVfQUJBTkRPTkVEIGZyb20gU1RBVEVfQ09ORklHVVJFRC4gKElmIGl0IGlzCisgICAgLy8gU1RBVEVfUFJFUEFSSU5HLCBsZXQgcHJlcGFyZU5leHRCdWZmZXIgaGFuZGxlIHRoZSBlcnJvci4pCisgICAgaWYgKChyZXMgPT0gTk9fSU5JVCB8fCByZXMgPT0gREVBRF9PQkpFQ1QpICYmIG1TdGF0ZSA9PSBTVEFURV9DT05GSUdVUkVEKSB7CisgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0FCQU5ET05FRDsKKyAgICB9Cit9CisKK2Jvb2wgQ2FtZXJhM091dHB1dFN0cmVhbTo6c2hvdWxkTG9nRXJyb3Ioc3RhdHVzX3QgcmVzLCBTdHJlYW1TdGF0ZSBzdGF0ZSkgeworICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoKHJlcyA9PSBERUFEX09CSkVDVCB8fCByZXMgPT0gTk9fSU5JVCkgJiYgc3RhdGUgPT0gU1RBVEVfQUJBTkRPTkVEKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKIHN0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OmRpc2Nvbm5lY3RMb2NrZWQoKSB7CiAgICAgc3RhdHVzX3QgcmVzOwogCkBAIC02NTksMTIgKzcyOCwxMSBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLXN0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OmdldEVuZHBvaW50VXNhZ2VGb3JTdXJmYWNlKHVpbnQ2NF90ICp1c2FnZSwKLSAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpIGNvbnN0IHsKLSAgICBzdGF0dXNfdCByZXM7Ci0gICAgdWludDY0X3QgdSA9IDA7Cit2b2lkIENhbWVyYTNPdXRwdXRTdHJlYW06OmFwcGx5WlNMVXNhZ2VRdWlyayhpbnQgZm9ybWF0LCB1aW50NjRfdCAqY29uc3VtZXJVc2FnZSAvKmlub3V0Ki8pIHsKKyAgICBpZiAoY29uc3VtZXJVc2FnZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAKLSAgICByZXMgPSBuYXRpdmVfd2luZG93X2dldF9jb25zdW1lcl91c2FnZShzdGF0aWNfY2FzdDxBTmF0aXZlV2luZG93Kj4oc3VyZmFjZS5nZXQoKSksICZ1KTsKICAgICAvLyBJZiBhbiBvcGFxdWUgb3V0cHV0IHN0cmVhbSdzIGVuZHBvaW50IGlzIEltYWdlUmVhZGVyLCBhZGQKICAgICAvLyBHUkFMTE9DX1VTQUdFX0hXX0NBTUVSQV9aU0wgdG8gdGhlIHVzYWdlIHNvIEhBTCBrbm93cyBpdCB3aWxsIGJlIHVzZWQKICAgICAvLyBmb3IgdGhlIFpTTCB1c2UgY2FzZS4KQEAgLTY3MywxMiArNzQxLDIwIEBACiAgICAgLy8gICAgIDIuIEdSQUxMT0NfVVNBR0VfSFdfUkVOREVSCiAgICAgLy8gICAgIDMuIEdSQUxMT0NfVVNBR0VfSFdfQ09NUE9TRVIKICAgICAvLyAgICAgNC4gR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSCi0gICAgaWYgKGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEICYmCi0gICAgICAgICAgICAodSAmIChHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUgfCBHUkFMTE9DX1VTQUdFX0hXX1JFTkRFUiB8CisgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQgJiYKKyAgICAgICAgICAgICgqY29uc3VtZXJVc2FnZSAmIChHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUgfCBHUkFMTE9DX1VTQUdFX0hXX1JFTkRFUiB8CiAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSIHwgR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSKSkgPT0gMCkgewotICAgICAgICB1IHw9IEdSQUxMT0NfVVNBR0VfSFdfQ0FNRVJBX1pTTDsKKyAgICAgICAgKmNvbnN1bWVyVXNhZ2UgfD0gR1JBTExPQ19VU0FHRV9IV19DQU1FUkFfWlNMOwogICAgIH0KK30KIAorc3RhdHVzX3QgQ2FtZXJhM091dHB1dFN0cmVhbTo6Z2V0RW5kcG9pbnRVc2FnZUZvclN1cmZhY2UodWludDY0X3QgKnVzYWdlLAorICAgICAgICBjb25zdCBzcDxTdXJmYWNlPiYgc3VyZmFjZSkgY29uc3QgeworICAgIHN0YXR1c190IHJlczsKKyAgICB1aW50NjRfdCB1ID0gMDsKKworICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfZ2V0X2NvbnN1bWVyX3VzYWdlKHN0YXRpY19jYXN0PEFOYXRpdmVXaW5kb3cqPihzdXJmYWNlLmdldCgpKSwgJnUpOworICAgIGFwcGx5WlNMVXNhZ2VRdWlyayhjYW1lcmEzX3N0cmVhbTo6Zm9ybWF0LCAmdSk7CiAgICAgKnVzYWdlID0gdTsKICAgICByZXR1cm4gcmVzOwogfQpAQCAtNzc5LDcgKzg1NSw5IEBACiAgICAgICAgIEFMT0dXKCIlczogdGhlIHJlbGVhc2VkIGJ1ZmZlciBoYXMgYWxyZWFkeSBiZWVuIGZyZWVkIGJ5IHRoZSBidWZmZXIgcXVldWUhIiwgX19GVU5DVElPTl9fKTsKICAgICB9IGVsc2UgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAvLyBUcmVhdCBvdGhlciBlcnJvcnMgYXMgYWJhbmRvbm1lbnQKLSAgICAgICAgQUxPR0UoIiVzOiBkZXRhY2ggbmV4dCBidWZmZXIgZmFpbGVkOiAlcyAoJWQpLiIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIGlmIChzaG91bGRMb2dFcnJvcihyZXMsIG1TdGF0ZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogZGV0YWNoIG5leHQgYnVmZmVyIGZhaWxlZDogJXMgKCVkKS4iLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICB9CiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0FCQU5ET05FRDsKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CkBAIC03OTIsMTEgKzg3MCw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzdGQ6OnZlY3RvcjxzcDxHcmFwaGljQnVmZmVyPj4gcmVtb3ZlZEJ1ZmZlcnM7Ci0gICAgcmVzID0gbUNvbnN1bWVyLT5nZXRBbmRGbHVzaFJlbW92ZWRCdWZmZXJzKCZyZW1vdmVkQnVmZmVycyk7Ci0gICAgaWYgKHJlcyA9PSBPSykgewotICAgICAgICBvbkJ1ZmZlcnNSZW1vdmVkTG9ja2VkKHJlbW92ZWRCdWZmZXJzKTsKLSAgICB9CisgICAgLy8gSGVyZSB3ZSBhc3N1bWUgZGV0YWNoQnVmZmVyIGlzIGNhbGxlZCBieSBidWZmZXIgbWFuYWdlciBzbyBpdCBkb2Vzbid0IG5lZWQgdG8gYmUgbm90aWZpZWQKKyAgICBjaGVja1JlbW92ZWRCdWZmZXJzTG9ja2VkKC8qbm90aWZ5QnVmZmVyTWFuYWdlciovZmFsc2UpOwogICAgIHJldHVybiByZXM7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgKaW5kZXggNmYzNmY5Mi4uNzI5YzY1NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgKQEAgLTE5MCw2ICsxOTAsOSBAQAogICAgICAqLwogICAgIHZpcnR1YWwgc3NpemVfdCBnZXRTdXJmYWNlSWQoY29uc3Qgc3A8U3VyZmFjZT4gJi8qc3VyZmFjZSovKSB7IHJldHVybiAwOyB9CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFVuaXF1ZVN1cmZhY2VJZHMoY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYsCisgICAgICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8c2l6ZV90PiopIHsgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyB9OworCiAgICAgLyoqCiAgICAgICogVXBkYXRlIHRoZSBzdHJlYW0gb3V0cHV0IHN1cmZhY2VzLgogICAgICAqLwpAQCAtMTk4LDYgKzIwMSwxMSBAQAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiAmcmVtb3ZlZFN1cmZhY2VJZHMsCiAgICAgICAgICAgICBLZXllZFZlY3RvcjxzcDxTdXJmYWNlPiwgc2l6ZV90PiAqb3V0cHV0TWFwLypvdXQqLyk7CiAKKyAgICAvKioKKyAgICAgKiBBcHBseSBaU0wgcmVsYXRlZCBjb25zdW1lciB1c2FnZSBxdWlyay4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBhcHBseVpTTFVzYWdlUXVpcmsoaW50IGZvcm1hdCwgdWludDY0X3QgKmNvbnN1bWVyVXNhZ2UgLyppbm91dCovKTsKKwogICBwcm90ZWN0ZWQ6CiAgICAgQ2FtZXJhM091dHB1dFN0cmVhbShpbnQgaWQsIGNhbWVyYTNfc3RyZWFtX3R5cGVfdCB0eXBlLAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKQEAgLTIxMyw2ICsyMjEsNyBAQAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKICAgICAgICAgICAgIGJvb2wgb3V0cHV0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxGZW5jZT4gKnJlbGVhc2VGZW5jZU91dCk7CiAKQEAgLTI4NSwxMCArMjk0LDExIEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckxvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApOworICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVldWVCdWZmZXJUb0NvbnN1bWVyKHNwPEFOYXRpdmVXaW5kb3c+JiBjb25zdW1lciwKLSAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgaW50IGFud1JlbGVhc2VGZW5jZSk7CisgICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGludCBhbndSZWxlYXNlRmVuY2UsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVF1ZXVlTG9ja2VkKCk7CiAKQEAgLTI5OSw2ICszMDksMTcgQEAKICAgICAgKi8KICAgICB2b2lkIG9uQnVmZmVyc1JlbW92ZWRMb2NrZWQoY29uc3Qgc3RkOjp2ZWN0b3I8c3A8R3JhcGhpY0J1ZmZlcj4+Jik7CiAgICAgc3RhdHVzX3QgZGV0YWNoQnVmZmVyTG9ja2VkKHNwPEdyYXBoaWNCdWZmZXI+KiBidWZmZXIsIGludCogZmVuY2VGZCk7CisgICAgLy8gQ2FsbCB0aGlzIGFmdGVyIGVhY2ggZGVxdWV1ZUJ1ZmZlci9hdHRhY2hCdWZmZXIvZGV0YWNoTmV4dEJ1ZmZlciBjYWxsIHRvIGdldCB1cGRhdGUgb24KKyAgICAvLyByZW1vdmVkIGJ1ZmZlcnMuIFNldCBub3RpZnlCdWZmZXJNYW5hZ2VyIHRvIGZhbHNlIHdoZW4gdGhlIGNhbGwgaXMgaW5pdGlhdGVkIGJ5IGJ1ZmZlcgorICAgIC8vIG1hbmFnZXIgc28gYnVmZmVyIG1hbmFnZXIgZG9lc24ndCBuZWVkIHRvIGJlIG5vdGlmaWVkLgorICAgIHZvaWQgY2hlY2tSZW1vdmVkQnVmZmVyc0xvY2tlZChib29sIG5vdGlmeUJ1ZmZlck1hbmFnZXIgPSB0cnVlKTsKKworICAgIC8vIENoZWNrIHJldHVybiBzdGF0dXMgb2YgSUdCUCBjYWxscyBhbmQgc2V0IGFiYW5kb25lZCBzdGF0ZSBhY2NvcmRpbmdseQorICAgIHZvaWQgY2hlY2tSZXRBbmRTZXRBYmFuZG9uZWRMb2NrZWQoc3RhdHVzX3QgcmVzKTsKKworICAgIC8vIElmIHRoZSBzdGF0dXMgaW5kaWNhdGVzIGFiYW5kb25kZWQgc3RyZWFtLCBvbmx5IGxvZyB3aGVuIHN0YXRlIGhhc24ndCBiZWVuIHVwZGF0ZWQgdG8KKyAgICAvLyBTVEFURV9BQkFORE9ORUQKKyAgICBzdGF0aWMgYm9vbCBzaG91bGRMb2dFcnJvcihzdGF0dXNfdCByZXMsIFN0cmVhbVN0YXRlIHN0YXRlKTsKIAogICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtEZXF1ZXVlTGF0ZW5jeUJpblNpemUgPSA1OyAvLyBpbiBtcwogICAgIENhbWVyYUxhdGVuY3lIaXN0b2dyYW0gbURlcXVldWVCdWZmZXJMYXRlbmN5OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaAppbmRleCBhNzExYTZkLi4yYmRlOTQ5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaApAQCAtNjcsNiArNjcsMTggQEAKICAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0U3VyZmFjZUlkKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSA9IDA7CiAKICAgICAvKioKKyAgICAgKiBRdWVyeSB0aGUgdW5pcXVlIHN1cmZhY2UgSURzIG9mIGN1cnJlbnQgc3VyZmFjZUlkcy4KKyAgICAgKiBXaGVuIHBhc3NpbmcgdW5pcXVlIHN1cmZhY2UgSURzIGluIHJldHVybkJ1ZmZlcigpLCBpZiB0aGUKKyAgICAgKiBzdXJmYWNlSWQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBzdHJlYW0sIHRoZSBvdXRwdXQgY29ycmVzcG9uZGluZyB0bworICAgICAqIHRoZSB1bmlxdWUgc3VyZmFjZSBJRCB3aWxsIGJlIGlnbm9yZWQgYW5kIG5vdCBkZWxpdmVyZWQgdG8gY2xpZW50LgorICAgICAqCisgICAgICogUmV0dXJuIElOVkFMSURfT1BFUkFUSU9OIGlmIGFuZCBvbmx5IGlmIHRoZSBzdHJlYW0gZG9lcyBub3Qgc3VwcG9ydAorICAgICAqIHN1cmZhY2Ugc2hhcmluZy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFVuaXF1ZVN1cmZhY2VJZHMoY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZUlkcywKKyAgICAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxzaXplX3Q+KiBvdXRVbmlxdWVJZHMpID0gMDsKKworICAgIC8qKgogICAgICAqIFVwZGF0ZSB0aGUgc3RyZWFtIG91dHB1dCBzdXJmYWNlcy4KICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IHVwZGF0ZVN0cmVhbShjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4gJm91dHB1dFN1cmZhY2VzLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAKaW5kZXggMmJiOWZmNy4uZTNiNzRkNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwCkBAIC0xNCw2ICsxNCwxMCBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorI2RlZmluZSBMT0dfVEFHICJDYW1lcmEzLVNoYXJlZE91U3RybSIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCiAjaW5jbHVkZSAiQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CkBAIC0yOCwxNiArMzIsMTcgQEAKICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSwgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLAogICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLAogICAgICAgICBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgaW50IHNldElkKSA6CisgICAgICAgIGludCBzZXRJZCwgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyKSA6CiAgICAgICAgIENhbWVyYTNPdXRwdXRTdHJlYW0oaWQsIENBTUVSQTNfU1RSRUFNX09VVFBVVCwgd2lkdGgsIGhlaWdodCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sIHBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXJVc2FnZSwgdGltZXN0YW1wT2Zmc2V0LCBzZXRJZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN1bWVyVXNhZ2UsIHRpbWVzdGFtcE9mZnNldCwgc2V0SWQpLAorICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcih1c2VIYWxCdWZNYW5hZ2VyKSB7CiAgICAgc2l6ZV90IGNvbnN1bWVyQ291bnQgPSBzdGQ6Om1pbihzdXJmYWNlcy5zaXplKCksIGtNYXhPdXRwdXRzKTsKICAgICBpZiAoc3VyZmFjZXMuc2l6ZSgpID4gY29uc3VtZXJDb3VudCkgewogICAgICAgICBBTE9HRSgiJXM6IFRyeWluZyB0byBhZGQgbW9yZSBjb25zdW1lcnMgdGhhbiB0aGUgbWF4aW11bSAiLCBfX2Z1bmNfXyk7CiAgICAgfQogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29uc3VtZXJDb3VudDsgaSsrKSB7Ci0gICAgICAgIG1TdXJmYWNlc1tpXSA9IHN1cmZhY2VzW2ldOworICAgICAgICBtU3VyZmFjZVVuaXF1ZUlkc1tpXSA9IHN0ZDo6bWFrZV9wYWlyKHN1cmZhY2VzW2ldLCBtTmV4dFVuaXF1ZVN1cmZhY2VJZCsrKTsKICAgICB9CiB9CiAKQEAgLTQ4LDIxICs1MywyMCBAQAogc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6Y29ubmVjdFN0cmVhbVNwbGl0dGVyTG9ja2VkKCkgewogICAgIHN0YXR1c190IHJlcyA9IE9LOwogCi0gICAgbVN0cmVhbVNwbGl0dGVyID0gbmV3IENhbWVyYTNTdHJlYW1TcGxpdHRlcigpOworICAgIG1TdHJlYW1TcGxpdHRlciA9IG5ldyBDYW1lcmEzU3RyZWFtU3BsaXR0ZXIobVVzZUhhbEJ1Zk1hbmFnZXIpOwogCiAgICAgdWludDY0X3QgdXNhZ2U7CiAgICAgZ2V0RW5kcG9pbnRVc2FnZSgmdXNhZ2UpOwogCiAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHNpemVfdCwgc3A8U3VyZmFjZT4+IGluaXRpYWxTdXJmYWNlczsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhPdXRwdXRzOyBpKyspIHsKLSAgICAgICAgaWYgKG1TdXJmYWNlc1tpXSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBpbml0aWFsU3VyZmFjZXMuZW1wbGFjZShpLCBtU3VyZmFjZXNbaV0pOworICAgICAgICBpZiAobVN1cmZhY2VVbmlxdWVJZHNbaV0uZmlyc3QgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgaW5pdGlhbFN1cmZhY2VzLmVtcGxhY2UoaSwgbVN1cmZhY2VVbmlxdWVJZHNbaV0uZmlyc3QpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgYW5kcm9pZDo6UGl4ZWxGb3JtYXQgZm9ybWF0ID0gaXNGb3JtYXRPdmVycmlkZGVuKCkgPyBnZXRPcmlnaW5hbEZvcm1hdCgpIDogZ2V0Rm9ybWF0KCk7CiAgICAgcmVzID0gbVN0cmVhbVNwbGl0dGVyLT5jb25uZWN0KGluaXRpYWxTdXJmYWNlcywgdXNhZ2UsIG1Vc2FnZSwgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzLAotICAgICAgICAgICAgZ2V0V2lkdGgoKSwgZ2V0SGVpZ2h0KCksIGZvcm1hdCwgJm1Db25zdW1lcik7CisgICAgICAgICAgICBnZXRXaWR0aCgpLCBnZXRIZWlnaHQoKSwgZ2V0Rm9ybWF0KCksICZtQ29uc3VtZXIpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gY29ubmVjdCB0byBzdHJlYW0gc3BsaXR0ZXI6ICVzKCVkKSIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTcyLDYgKzc2LDMxIEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAorc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6YXR0YWNoQnVmZmVyVG9TcGxpdHRlckxvY2tlZCgKKyAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW5iLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcykgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworCisgICAgLy8gQXR0YWNoIHRoZSBidWZmZXIgdG8gdGhlIHNwbGl0dGVyIG91dHB1dCBxdWV1ZXMuIFRoaXMgY291bGQgYmxvY2sgaWYKKyAgICAvLyB0aGUgb3V0cHV0IHF1ZXVlIGRvZXNuJ3QgaGF2ZSBhbnkgZW1wdHkgc2xvdC4gU28gdW5sb2NrIGR1cmluZyB0aGUgY291cnNlCisgICAgLy8gb2YgYXR0YWNoQnVmZmVyVG9PdXRwdXRzLgorICAgIHNwPENhbWVyYTNTdHJlYW1TcGxpdHRlcj4gc3BsaXR0ZXIgPSBtU3RyZWFtU3BsaXR0ZXI7CisgICAgbUxvY2sudW5sb2NrKCk7CisgICAgcmVzID0gc3BsaXR0ZXItPmF0dGFjaEJ1ZmZlclRvT3V0cHV0cyhhbmIsIHN1cmZhY2VfaWRzKTsKKyAgICBtTG9jay5sb2NrKCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ2Fubm90IGF0dGFjaCBzdHJlYW0gc3BsaXR0ZXIgYnVmZmVyIHRvIG91dHB1dHM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgLy8gT25seSB0cmFuc2l0aW9uIHRvIFNUQVRFX0FCQU5ET05FRCBmcm9tIFNUQVRFX0NPTkZJR1VSRUQuIChJZiBpdCBpcyBTVEFURV9QUkVQQVJJTkcsCisgICAgICAgIC8vIGxldCBwcmVwYXJlTmV4dEJ1ZmZlciBoYW5kbGUgdGhlIGVycm9yLikKKyAgICAgICAgaWYgKHJlcyA9PSBOT19JTklUICYmIG1TdGF0ZSA9PSBTVEFURV9DT05GSUdVUkVEKSB7CisgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9BQkFORE9ORUQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworCiBzdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpub3RpZnlCdWZmZXJSZWxlYXNlZChBTmF0aXZlV2luZG93QnVmZmVyICphbndCdWZmZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAgICAgc3RhdHVzX3QgcmVzID0gT0s7CkBAIC05MCw3ICsxMTksNyBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICByZXR1cm4gKG1TdXJmYWNlc1tzdXJmYWNlX2lkXSA9PSBudWxscHRyKTsKKyAgICByZXR1cm4gKG1TdXJmYWNlVW5pcXVlSWRzW3N1cmZhY2VfaWRdLmZpcnN0ID09IG51bGxwdHIpOwogfQogCiBzdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpzZXRDb25zdW1lcnMoY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBzdXJmYWNlcykgewpAQCAtMTEzLDcgKzE0Miw3IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgICAgICB9CiAKLSAgICAgICAgbVN1cmZhY2VzW2lkXSA9IHN1cmZhY2U7CisgICAgICAgIG1TdXJmYWNlVW5pcXVlSWRzW2lkXSA9IHN0ZDo6bWFrZV9wYWlyKHN1cmZhY2UsIG1OZXh0VW5pcXVlU3VyZmFjZUlkKyspOwogCiAgICAgICAgIC8vIE9ubHkgY2FsbCBhZGRPdXRwdXQgaWYgdGhlIHNwbGl0dGVyIGhhcyBiZWVuIGNvbm5lY3RlZC4KICAgICAgICAgaWYgKG1TdHJlYW1TcGxpdHRlciAhPSBudWxscHRyKSB7CkBAIC0xMjksNyArMTU4LDcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6Z2V0QnVmZmVyTG9ja2VkKGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAqYnVmZmVyLAotICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcykgeworICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlSWRzKSB7CiAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW5iOwogICAgIGludCBmZW5jZUZkID0gLTE7CiAKQEAgLTEzOSwyMyArMTY4LDExIEBACiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCi0gICAgLy8gQXR0YWNoIHRoZSBidWZmZXIgdG8gdGhlIHNwbGl0dGVyIG91dHB1dCBxdWV1ZXMuIFRoaXMgY291bGQgYmxvY2sgaWYKLSAgICAvLyB0aGUgb3V0cHV0IHF1ZXVlIGRvZXNuJ3QgaGF2ZSBhbnkgZW1wdHkgc2xvdC4gU28gdW5sb2NrIGR1cmluZyB0aGUgY291cnNlCi0gICAgLy8gb2YgYXR0YWNoQnVmZmVyVG9PdXRwdXRzLgotICAgIHNwPENhbWVyYTNTdHJlYW1TcGxpdHRlcj4gc3BsaXR0ZXIgPSBtU3RyZWFtU3BsaXR0ZXI7Ci0gICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgcmVzID0gc3BsaXR0ZXItPmF0dGFjaEJ1ZmZlclRvT3V0cHV0cyhhbmIsIHN1cmZhY2VfaWRzKTsKLSAgICBtTG9jay5sb2NrKCk7Ci0gICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ2Fubm90IGF0dGFjaCBzdHJlYW0gc3BsaXR0ZXIgYnVmZmVyIHRvIG91dHB1dHM6ICVzICglZCkiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKLSAgICAgICAgLy8gT25seSB0cmFuc2l0aW9uIHRvIFNUQVRFX0FCQU5ET05FRCBmcm9tIFNUQVRFX0NPTkZJR1VSRUQuIChJZiBpdCBpcyBTVEFURV9QUkVQQVJJTkcsCi0gICAgICAgIC8vIGxldCBwcmVwYXJlTmV4dEJ1ZmZlciBoYW5kbGUgdGhlIGVycm9yLikKLSAgICAgICAgaWYgKHJlcyA9PSBOT19JTklUICYmIG1TdGF0ZSA9PSBTVEFURV9DT05GSUdVUkVEKSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9BQkFORE9ORUQ7CisgICAgaWYgKCFtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICByZXMgPSBhdHRhY2hCdWZmZXJUb1NwbGl0dGVyTG9ja2VkKGFuYiwgc3VyZmFjZUlkcyk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KLQotICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAogICAgIC8qKgpAQCAtMTY5LDggKzE4NiwzOCBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpxdWV1ZUJ1ZmZlclRvQ29uc3VtZXIoc3A8QU5hdGl2ZVdpbmRvdz4mIGNvbnN1bWVyLAotICAgICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyLCBpbnQgYW53UmVsZWFzZUZlbmNlKSB7Ci0gICAgc3RhdHVzX3QgcmVzID0gY29uc3VtZXItPnF1ZXVlQnVmZmVyKGNvbnN1bWVyLmdldCgpLCBidWZmZXIsIGFud1JlbGVhc2VGZW5jZSk7CisgICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGludCBhbndSZWxlYXNlRmVuY2UsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiB1bmlxdWVTdXJmYWNlSWRzKSB7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgaWYgKG1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgIGlmICh1bmlxdWVTdXJmYWNlSWRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHVuaXF1ZVN1cmZhY2VJZHMgbXVzdCBub3QgYmUgZW1wdHkhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+IHN1cmZhY2VJZHM7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgdW5pcXVlSWQgOiB1bmlxdWVTdXJmYWNlSWRzKSB7CisgICAgICAgICAgICBib29sIHVuaXF1ZUlkRm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heE91dHB1dHM7IGkrKykgeworICAgICAgICAgICAgICAgIGlmIChtU3VyZmFjZVVuaXF1ZUlkc1tpXS5zZWNvbmQgPT0gdW5pcXVlSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgc3VyZmFjZUlkcy5wdXNoX2JhY2soaSk7CisgICAgICAgICAgICAgICAgICAgIHVuaXF1ZUlkRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIXVuaXF1ZUlkRm91bmQpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXM6IHVua25vd24gdW5pcXVlIHN1cmZhY2UgSUQgJXp1IGZvciBzdHJlYW0gJWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXQgbWlnaHQgaGF2ZSBiZWVuIHJlbW92ZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdW5pcXVlSWQsIG1JZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmVzID0gYXR0YWNoQnVmZmVyVG9TcGxpdHRlckxvY2tlZChidWZmZXIsIHN1cmZhY2VJZHMpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgcmVzID0gY29uc3VtZXItPnF1ZXVlQnVmZmVyKGNvbnN1bWVyLmdldCgpLCBidWZmZXIsIGFud1JlbGVhc2VGZW5jZSk7CiAKICAgICAvLyBBZnRlciBxdWV1aW5nIGJ1ZmZlciB0byB0aGUgaW50ZXJuYWwgY29uc3VtZXIgcXVldWUsIGNoZWNrIHdoZXRoZXIgdGhlIGJ1ZmZlciBpcwogICAgIC8vIHN1Y2Nlc3NmdWxseSBxdWV1ZWQgdG8gdGhlIG91dHB1dCBxdWV1ZXMuCkBAIC0yMjksOCArMjc2LDggQEAKICAgICAgICAgKnVzYWdlID0gZ2V0UHJlc2V0Q29uc3VtZXJVc2FnZSgpOwogCiAgICAgICAgIGZvciAoc2l6ZV90IGlkID0gMDsgaWQgPCBrTWF4T3V0cHV0czsgaWQrKykgewotICAgICAgICAgICAgaWYgKG1TdXJmYWNlc1tpZF0gIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIHJlcyA9IGdldEVuZHBvaW50VXNhZ2VGb3JTdXJmYWNlKCZ1LCBtU3VyZmFjZXNbaWRdKTsKKyAgICAgICAgICAgIGlmIChtU3VyZmFjZVVuaXF1ZUlkc1tpZF0uZmlyc3QgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJlcyA9IGdldEVuZHBvaW50VXNhZ2VGb3JTdXJmYWNlKCZ1LCBtU3VyZmFjZVVuaXF1ZUlkc1tpZF0uZmlyc3QpOwogICAgICAgICAgICAgICAgICp1c2FnZSB8PSB1OwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yNDYsNyArMjkzLDcgQEAKIHNzaXplX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6Z2V0TmV4dFN1cmZhY2VJZExvY2tlZCgpIHsKICAgICBzc2l6ZV90IGlkID0gLTE7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4T3V0cHV0czsgaSsrKSB7Ci0gICAgICAgIGlmIChtU3VyZmFjZXNbaV0gPT0gbnVsbHB0cikgeworICAgICAgICBpZiAobVN1cmZhY2VVbmlxdWVJZHNbaV0uZmlyc3QgPT0gbnVsbHB0cikgewogICAgICAgICAgICAgaWQgPSBpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTI1OSw3ICszMDYsNyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKICAgICBzc2l6ZV90IGlkID0gLTE7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTWF4T3V0cHV0czsgaSsrKSB7Ci0gICAgICAgIGlmIChtU3VyZmFjZXNbaV0gPT0gc3VyZmFjZSkgeworICAgICAgICBpZiAobVN1cmZhY2VVbmlxdWVJZHNbaV0uZmlyc3QgPT0gc3VyZmFjZSkgewogICAgICAgICAgICAgaWQgPSBpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTI2OCw2ICszMTUsMjYgQEAKICAgICByZXR1cm4gaWQ7CiB9CiAKK3N0YXR1c190IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06OmdldFVuaXF1ZVN1cmZhY2VJZHMoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VJZHMsCisgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxzaXplX3Q+KiBvdXRVbmlxdWVJZHMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgaWYgKG91dFVuaXF1ZUlkcyA9PSBudWxscHRyIHx8IHN1cmZhY2VJZHMuc2l6ZSgpID4ga01heE91dHB1dHMpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBvdXRVbmlxdWVJZHMtPmNsZWFyKCk7CisgICAgb3V0VW5pcXVlSWRzLT5yZXNlcnZlKHN1cmZhY2VJZHMuc2l6ZSgpKTsKKworICAgIGZvciAoY29uc3QgYXV0byYgc3VyZmFjZUlkIDogc3VyZmFjZUlkcykgeworICAgICAgICBpZiAoc3VyZmFjZUlkID49IGtNYXhPdXRwdXRzKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIG91dFVuaXF1ZUlkcy0+cHVzaF9iYWNrKG1TdXJmYWNlVW5pcXVlSWRzW3N1cmZhY2VJZF0uc2Vjb25kKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpyZXZlcnRQYXJ0aWFsVXBkYXRlTG9ja2VkKAogICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxzcDxTdXJmYWNlPiwgc2l6ZV90PiAmcmVtb3ZlZFN1cmZhY2VzLAogICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxzcDxTdXJmYWNlPiwgc2l6ZV90PiAmYXR0YWNoZWRTdXJmYWNlcykgewpAQCAtMjgxLDcgKzM0OCw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgbVN1cmZhY2VzW2luZGV4XSA9IG51bGxwdHI7CisgICAgICAgIG1TdXJmYWNlVW5pcXVlSWRzW2luZGV4XSA9IHN0ZDo6bWFrZV9wYWlyKG51bGxwdHIsIG1OZXh0VW5pcXVlU3VyZmFjZUlkKyspOwogICAgIH0KIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVtb3ZlZFN1cmZhY2VzLnNpemUoKTsgaSsrKSB7CkBAIC0yOTIsNyArMzU5LDggQEAKICAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtU3VyZmFjZXNbaW5kZXhdID0gcmVtb3ZlZFN1cmZhY2VzLmtleUF0KGkpOworICAgICAgICBtU3VyZmFjZVVuaXF1ZUlkc1tpbmRleF0gPSBzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICByZW1vdmVkU3VyZmFjZXMua2V5QXQoaSksIG1OZXh0VW5pcXVlU3VyZmFjZUlkKyspOwogICAgIH0KIAogICAgIHJldHVybiByZXQ7CkBAIC0zNDQsOCArNDEyLDggQEAKIAogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1TdXJmYWNlc1tpdF0gPSBudWxscHRyOwotICAgICAgICByZW1vdmVkU3VyZmFjZXMuYWRkKG1TdXJmYWNlc1tpdF0sIGl0KTsKKyAgICAgICAgcmVtb3ZlZFN1cmZhY2VzLmFkZChtU3VyZmFjZVVuaXF1ZUlkc1tpdF0uZmlyc3QsIGl0KTsKKyAgICAgICAgbVN1cmZhY2VVbmlxdWVJZHNbaXRdID0gc3RkOjptYWtlX3BhaXIobnVsbHB0ciwgbU5leHRVbmlxdWVTdXJmYWNlSWQrKyk7CiAgICAgfQogCiAgICAgLy9OZXh0IGFkZCB0aGUgbmV3IG91dHB1dHMKQEAgLTM3MCw3ICs0MzgsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgbVN1cmZhY2VzW3N1cmZhY2VJZF0gPSBpdDsKKyAgICAgICAgbVN1cmZhY2VVbmlxdWVJZHNbc3VyZmFjZUlkXSA9IHN0ZDo6bWFrZV9wYWlyKGl0LCBtTmV4dFVuaXF1ZVN1cmZhY2VJZCsrKTsKICAgICAgICAgb3V0cHV0TWFwLT5hZGQoaXQsIHN1cmZhY2VJZCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oCmluZGV4IDAyYjFjMDkuLmI1ZTM3YzIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5oCkBAIC0xNyw2ICsxNyw3IEBACiAjaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkEzX1NIQVJFRF9PVVRQVVRfU1RSRUFNX0gKICNkZWZpbmUgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQTNfU0hBUkVEX09VVFBVVF9TVFJFQU1fSAogCisjaW5jbHVkZSA8YXJyYXk+CiAjaW5jbHVkZSAiQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmgiCiAjaW5jbHVkZSAiQ2FtZXJhM091dHB1dFN0cmVhbS5oIgogCkBAIC0zNyw3ICszOCw4IEBACiAgICAgICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLCBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsCiAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBuc2Vjc190IHRpbWVzdGFtcE9mZnNldCwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCi0gICAgICAgICAgICBpbnQgc2V0SWQgPSBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCk7CisgICAgICAgICAgICBpbnQgc2V0SWQgPSBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCwKKyAgICAgICAgICAgIGJvb2wgdXNlSGFsQnVmTWFuYWdlciA9IGZhbHNlKTsKIAogICAgIHZpcnR1YWwgfkNhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0oKTsKIApAQCAtNDksNiArNTEsMTUgQEAKIAogICAgIHZpcnR1YWwgc3NpemVfdCBnZXRTdXJmYWNlSWQoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpOwogCisgICAgLyoqCisgICAgICogUXVlcnkgdGhlIHVuaXF1ZSBzdXJmYWNlIElEcyBvZiBjdXJyZW50IHN1cmZhY2VJZHMuCisgICAgICogV2hlbiBwYXNzaW5nIHVuaXF1ZSBzdXJmYWNlIElEcyBpbiByZXR1cm5CdWZmZXIoKSwgaWYgdGhlCisgICAgICogc3VyZmFjZUlkIGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgc3RyZWFtLCB0aGUgb3V0cHV0IGNvcnJlc3BvbmRpbmcgdG8KKyAgICAgKiB0aGUgdW5pcXVlIHN1cmZhY2UgSUQgd2lsbCBiZSBpZ25vcmVkIGFuZCBub3QgZGVsaXZlcmVkIHRvIGNsaWVudC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFVuaXF1ZVN1cmZhY2VJZHMoY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZUlkcywKKyAgICAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxzaXplX3Q+KiBvdXRVbmlxdWVJZHMpIG92ZXJyaWRlOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCB1cGRhdGVTdHJlYW0oY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+ICZvdXRwdXRTdXJmYWNlcywKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE91dHB1dFN0cmVhbUluZm8+ICZvdXRwdXRJbmZvLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiAmcmVtb3ZlZFN1cmZhY2VJZHMsCkBAIC01OCw4ICs2OSwxNyBAQAogCiAgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4T3V0cHV0cyA9IDQ7CiAKLSAgICAvLyBNYXAgc3VyZmFjZUlkIC0+IG91dHB1dCBzdXJmYWNlcwotICAgIHNwPFN1cmZhY2U+IG1TdXJmYWNlc1trTWF4T3V0cHV0c107CisgICAgLy8gV2hldGhlciBIQUwgaXMgaW4gY29udHJvbCBmb3IgYnVmZmVyIG1hbmFnZW1lbnQuIFN1cmZhY2Ugc2hhcmluZyBiZWhhdmlvcgorICAgIC8vIGRlcGVuZHMgb24gdGhpcyBmbGFnLgorICAgIGNvbnN0IGJvb2wgbVVzZUhhbEJ1Zk1hbmFnZXI7CisKKyAgICAvLyBQYWlyIG9mIGFuIG91dHB1dCBTdXJmYWNlIGFuZCBpdHMgdW5pcXVlIElECisgICAgdHlwZWRlZiBzdGQ6OnBhaXI8c3A8U3VyZmFjZT4sIHNpemVfdD4gU3VyZmFjZVVuaXF1ZUlkOworCisgICAgLy8gTWFwIHN1cmZhY2VJZCAtPiAob3V0cHV0IHN1cmZhY2UsIHVuaXF1ZSBzdXJmYWNlIElEKQorICAgIHN0ZDo6YXJyYXk8U3VyZmFjZVVuaXF1ZUlkLCBrTWF4T3V0cHV0cz4gbVN1cmZhY2VVbmlxdWVJZHM7CisKKyAgICBzaXplX3QgbU5leHRVbmlxdWVTdXJmYWNlSWQgPSAwOwogCiAgICAgc3NpemVfdCBnZXROZXh0U3VyZmFjZUlkTG9ja2VkKCk7CiAKQEAgLTc4LDEzICs5OCwyNCBAQAogICAgIHN0YXR1c190IGNvbm5lY3RTdHJlYW1TcGxpdHRlckxvY2tlZCgpOwogCiAgICAgLyoqCisgICAgICogQXR0YWNoIHRoZSBvdXRwdXQgYnVmZmVyIHRvIHN0cmVhbSBzcGxpdHRlci4KKyAgICAgKiBXaGVuIGNhbWVyYSBzZXJ2aWNlIGlzIGRvaW5nIGJ1ZmZlciBtYW5hZ2VtZW50LCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZAorICAgICAqIGJlZm9yZSB0aGUgYnVmZmVyIGlzIGhhbmRlZCBvdXQgdG8gSEFMIGluIHJlcXVlc3QgdGhyZWFkLgorICAgICAqIFdoZW4gSEFMIGlzIGRvaW5nIGJ1ZmZlciBtYW5hZ2VtZW50LCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCB3aGVuCisgICAgICogdGhlIGJ1ZmZlciBpcyByZXR1cm5lZCBmcm9tIEhBTCBpbiBod2JpbmRlciBjYWxsYmFjayB0aHJlYWQuCisgICAgICovCisgICAgc3RhdHVzX3QgYXR0YWNoQnVmZmVyVG9TcGxpdHRlckxvY2tlZChBTmF0aXZlV2luZG93QnVmZmVyKiBhbmIsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyk7CisKKyAgICAvKioKICAgICAgKiBJbnRlcm5hbCBDYW1lcmEzU3RyZWFtIGludGVyZmFjZQogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyTG9ja2VkKGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAqYnVmZmVyLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWV1ZUJ1ZmZlclRvQ29uc3VtZXIoc3A8QU5hdGl2ZVdpbmRvdz4mIGNvbnN1bWVyLAotICAgICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyLCBpbnQgYW53UmVsZWFzZUZlbmNlKTsKKyAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgaW50IGFud1JlbGVhc2VGZW5jZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHVuaXF1ZVN1cmZhY2VJZHMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVRdWV1ZUxvY2tlZCgpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcAppbmRleCA2MDMwZDE1Li5kNzNhMmY5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAKQEAgLTYxLDEyICs2MSwxNCBAQAogICAgIG1PbGRVc2FnZSgwKSwKICAgICBtT2xkTWF4QnVmZmVycygwKSwKICAgICBtUHJlcGFyZWQoZmFsc2UpLAorICAgIG1QcmVwYXJlQmxvY2tSZXF1ZXN0KHRydWUpLAogICAgIG1QcmVwYXJlZEJ1ZmZlcklkeCgwKSwKICAgICBtTGFzdE1heENvdW50KENhbWVyYTNTdHJlYW1JbnRlcmZhY2U6OkFMTE9DQVRFX1BJUEVMSU5FX01BWCksCiAgICAgbUJ1ZmZlckxpbWl0TGF0ZW5jeShrQnVmZmVyTGltaXRMYXRlbmN5QmluU2l6ZSksCiAgICAgbUZvcm1hdE92ZXJyaWRkZW4oZmFsc2UpLAogICAgIG1PcmlnaW5hbEZvcm1hdCgtMSksCi0gICAgbVBoeXNpY2FsQ2FtZXJhSWQocGh5c2ljYWxDYW1lcmFJZCkgeworICAgIG1QaHlzaWNhbENhbWVyYUlkKHBoeXNpY2FsQ2FtZXJhSWQpLAorICAgIG1MYXN0VGltZXN0YW1wKDApIHsKIAogICAgIGNhbWVyYTNfc3RyZWFtOjpzdHJlYW1fdHlwZSA9IHR5cGU7CiAgICAgY2FtZXJhM19zdHJlYW06OndpZHRoID0gd2lkdGg7CkBAIC0yODUsOCArMjg3LDExIEBACiAgICAgcmV0dXJuIChtU3RhdGUgPT0gU1RBVEVfSU5fQ09ORklHKSB8fCAobVN0YXRlID09IFNUQVRFX0lOX1JFQ09ORklHKTsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6ZmluaXNoQ29uZmlndXJhdGlvbigpIHsKK3N0YXR1c190IENhbWVyYTNTdHJlYW06OmZpbmlzaENvbmZpZ3VyYXRpb24oLypvdXQqL2Jvb2wqIHN0cmVhbVJlY29uZmlndXJlZCkgewogICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKHN0cmVhbVJlY29uZmlndXJlZCAhPSBudWxscHRyKSB7CisgICAgICAgICpzdHJlYW1SZWNvbmZpZ3VyZWQgPSBmYWxzZTsKKyAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogICAgIHN3aXRjaCAobVN0YXRlKSB7CiAgICAgICAgIGNhc2UgU1RBVEVfRVJST1I6CkBAIC0zMTEsNyArMzE2LDcgQEAKIAogICAgIC8vIFJlZ2lzdGVyIGZvciBpZGxlIHRyYWNraW5nCiAgICAgc3A8U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciA9IG1TdGF0dXNUcmFja2VyLnByb21vdGUoKTsKLSAgICBpZiAoc3RhdHVzVHJhY2tlciAhPSAwKSB7CisgICAgaWYgKHN0YXR1c1RyYWNrZXIgIT0gMCAmJiBtU3RhdHVzSWQgPT0gU3RhdHVzVHJhY2tlcjo6Tk9fU1RBVFVTX0lEKSB7CiAgICAgICAgIG1TdGF0dXNJZCA9IHN0YXR1c1RyYWNrZXItPmFkZENvbXBvbmVudCgpOwogICAgIH0KIApAQCAtMzE5LDcgKzMyNCw3IEBACiAgICAgLy8gc28uIEFzIGRvY3VtZW50ZWQgaW4gaGFyZHdhcmUvY2FtZXJhMy5oOmNvbmZpZ3VyZV9zdHJlYW1zKCkuCiAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9JTl9SRUNPTkZJRyAmJgogICAgICAgICAgICAgbU9sZFVzYWdlID09IG1Vc2FnZSAmJgotICAgICAgICAgICAgbU9sZE1heEJ1ZmZlcnMgPT0gY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKSB7CisgICAgICAgICAgICBtT2xkTWF4QnVmZmVycyA9PSBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMgJiYgIW1EYXRhU3BhY2VPdmVycmlkZGVuKSB7CiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0NPTkZJR1VSRUQ7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CkBAIC0zMjcsOCArMzMyLDEwIEBACiAgICAgLy8gUmVzZXQgcHJlcGFyZWQgc3RhdGUsIHNpbmNlIGJ1ZmZlciBjb25maWcgaGFzIGNoYW5nZWQsIGFuZCBleGlzdGluZwogICAgIC8vIGFsbG9jYXRpb25zIGFyZSBubyBsb25nZXIgdmFsaWQKICAgICBtUHJlcGFyZWQgPSBmYWxzZTsKKyAgICBtUHJlcGFyZUJsb2NrUmVxdWVzdCA9IHRydWU7CiAgICAgbVN0cmVhbVVucHJlcGFyYWJsZSA9IGZhbHNlOwogCisgICAgYm9vbCByZWNvbmZpZ3VyaW5nID0gKG1TdGF0ZSA9PSBTVEFURV9JTl9SRUNPTkZJRyk7CiAgICAgc3RhdHVzX3QgcmVzOwogICAgIHJlcyA9IGNvbmZpZ3VyZVF1ZXVlTG9ja2VkKCk7CiAgICAgLy8gY29uZmlndXJlUXVldWVMb2NrZWQgY291bGQgcmV0dXJuIGVycm9yIGluIGNhc2Ugb2YgYWJhbmRvbmVkIHN1cmZhY2UuCkBAIC0zNDUsNiArMzUyLDkgQEAKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKKyAgICBpZiAocmVjb25maWd1cmluZyAmJiBzdHJlYW1SZWNvbmZpZ3VyZWQgIT0gbnVsbHB0cikgeworICAgICAgICAqc3RyZWFtUmVjb25maWd1cmVkID0gdHJ1ZTsKKyAgICB9CiAgICAgbVN0YXRlID0gU1RBVEVfQ09ORklHVVJFRDsKIAogICAgIHJldHVybiByZXM7CkBAIC0zODgsNyArMzk4LDcgQEAKICAgICByZXR1cm4gbVN0cmVhbVVucHJlcGFyYWJsZTsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6c3RhcnRQcmVwYXJlKGludCBtYXhDb3VudCkgeworc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6c3RhcnRQcmVwYXJlKGludCBtYXhDb3VudCwgYm9vbCBibG9ja1JlcXVlc3QpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwpAQCAtNDIwLDggKzQzMCw2IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLQotCiAgICAgc2l6ZV90IHBpcGVsaW5lTWF4ID0gZ2V0QnVmZmVyQ291bnRMb2NrZWQoKTsKICAgICBzaXplX3QgY2xhbXBlZENvdW50ID0gKHBpcGVsaW5lTWF4IDwgc3RhdGljX2Nhc3Q8c2l6ZV90PihtYXhDb3VudCkpID8KICAgICAgICAgICAgIHBpcGVsaW5lTWF4IDogc3RhdGljX2Nhc3Q8c2l6ZV90PihtYXhDb3VudCk7CkBAIC00MjksNiArNDM3LDcgQEAKICAgICAgICAgICAgIHBpcGVsaW5lTWF4IDogY2xhbXBlZENvdW50OwogCiAgICAgbVByZXBhcmVkID0gYnVmZmVyQ291bnQgPD0gbUxhc3RNYXhDb3VudDsKKyAgICBtUHJlcGFyZUJsb2NrUmVxdWVzdCA9IGJsb2NrUmVxdWVzdDsKIAogICAgIGlmIChtUHJlcGFyZWQpIHJldHVybiBPSzsKIApAQCAtNDQyLDkgKzQ1MSw5IEBACiAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKIH0KIAotYm9vbCBDYW1lcmEzU3RyZWFtOjppc1ByZXBhcmluZygpIGNvbnN0IHsKK2Jvb2wgQ2FtZXJhM1N0cmVhbTo6aXNCbG9ja2VkQnlQcmVwYXJlKCkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKLSAgICByZXR1cm4gbVN0YXRlID09IFNUQVRFX1BSRVBBUklORzsKKyAgICByZXR1cm4gbVN0YXRlID09IFNUQVRFX1BSRVBBUklORyAmJiBtUHJlcGFyZUJsb2NrUmVxdWVzdDsKIH0KIAogYm9vbCBDYW1lcmEzU3RyZWFtOjppc0FiYW5kb25lZCgpIGNvbnN0IHsKQEAgLTU3Niw2ICs1ODUsNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpnZXRCdWZmZXIoY2FtZXJhM19zdHJlYW1fYnVmZmVyICpidWZmZXIsCisgICAgICAgIG5zZWNzX3Qgd2FpdEJ1ZmZlclRpbWVvdXQsCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CkBAIC01ODUsNyArNTk1LDExIEBACiAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9DT05GSUdVUkVEKSB7CiAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW4ndCBnZXQgYnVmZmVycyBpZiBzdHJlYW0gaXMgbm90IGluIENPTkZJR1VSRUQgc3RhdGUgJWQiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBtU3RhdGUpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfQUJBTkRPTkVEKSB7CisgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBXYWl0IGZvciBuZXcgYnVmZmVyIHJldHVybmVkIGJhY2sgaWYgd2UgYXJlIHJ1bm5pbmcgaW50byB0aGUgbGltaXQuCkBAIC01OTMsMTMgKzYwNywxNiBAQAogICAgICAgICBBTE9HVigiJXM6IEFscmVhZHkgZGVxdWV1ZWQgbWF4IG91dHB1dCBidWZmZXJzICglZCksIHdhaXQgZm9yIG5leHQgcmV0dXJuZWQgb25lLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYTNfc3RyZWFtOjptYXhfYnVmZmVycyk7CiAgICAgICAgIG5zZWNzX3Qgd2FpdFN0YXJ0ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgICAgICByZXMgPSBtT3V0cHV0QnVmZmVyUmV0dXJuZWRTaWduYWwud2FpdFJlbGF0aXZlKG1Mb2NrLCBrV2FpdEZvckJ1ZmZlckR1cmF0aW9uKTsKKyAgICAgICAgaWYgKHdhaXRCdWZmZXJUaW1lb3V0IDwga1dhaXRGb3JCdWZmZXJEdXJhdGlvbikgeworICAgICAgICAgICAgd2FpdEJ1ZmZlclRpbWVvdXQgPSBrV2FpdEZvckJ1ZmZlckR1cmF0aW9uOworICAgICAgICB9CisgICAgICAgIHJlcyA9IG1PdXRwdXRCdWZmZXJSZXR1cm5lZFNpZ25hbC53YWl0UmVsYXRpdmUobUxvY2ssIHdhaXRCdWZmZXJUaW1lb3V0KTsKICAgICAgICAgbnNlY3NfdCB3YWl0RW5kID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwogICAgICAgICBtQnVmZmVyTGltaXRMYXRlbmN5LmFkZCh3YWl0U3RhcnQsIHdhaXRFbmQpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgICAgICBpZiAocmVzID09IFRJTUVEX09VVCkgewogICAgICAgICAgICAgICAgIEFMT0dFKCIlczogd2FpdCBmb3Igb3V0cHV0IGJ1ZmZlciByZXR1cm4gdGltZWQgb3V0IGFmdGVyICVsbGRtcyAobWF4X2J1ZmZlcnMgJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywga1dhaXRGb3JCdWZmZXJEdXJhdGlvbiAvIDEwMDAwMDBMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgd2FpdEJ1ZmZlclRpbWVvdXQgLyAxMDAwMDAwTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHJlczsKQEAgLTY0OSw3ICs2NjYsOCBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpyZXR1cm5CdWZmZXIoY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCi0gICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSB7CisgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcsCisgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcywgdWludDY0X3QgZnJhbWVOdW1iZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIApAQCAtNjYxLDYgKzY3OSwxNSBAQAogCiAgICAgcmVtb3ZlT3V0c3RhbmRpbmdCdWZmZXIoYnVmZmVyKTsKIAorICAgIC8vIEJ1ZmZlciBzdGF0dXMgbWF5IGJlIGNoYW5nZWQsIHNvIG1ha2UgYSBjb3B5IG9mIHRoZSBzdHJlYW1fYnVmZmVyIHN0cnVjdC4KKyAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXIgYiA9IGJ1ZmZlcjsKKyAgICBpZiAodGltZXN0YW1wSW5jcmVhc2luZyAmJiB0aW1lc3RhbXAgIT0gMCAmJiB0aW1lc3RhbXAgPD0gbUxhc3RUaW1lc3RhbXApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IHRpbWVzdGFtcCAlIiBQUklkNjQgIiBpcyBub3QgaW5jcmVhc2luZy4gUHJldiB0aW1lc3RhbXAgJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCB0aW1lc3RhbXAsIG1MYXN0VGltZXN0YW1wKTsKKyAgICAgICAgYi5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7CisgICAgfQorICAgIG1MYXN0VGltZXN0YW1wID0gdGltZXN0YW1wOworCiAgICAgLyoqCiAgICAgICogVE9ETzogQ2hlY2sgdGhhdCB0aGUgc3RhdGUgaXMgdmFsaWQgZmlyc3QuCiAgICAgICoKQEAgLTY2OSw5ICs2OTYsOSBAQAogICAgICAqCiAgICAgICogRG8gdGhpcyBmb3IgZ2V0QnVmZmVyIGFzIHdlbGwuCiAgICAgICovCi0gICAgc3RhdHVzX3QgcmVzID0gcmV0dXJuQnVmZmVyTG9ja2VkKGJ1ZmZlciwgdGltZXN0YW1wKTsKKyAgICBzdGF0dXNfdCByZXMgPSByZXR1cm5CdWZmZXJMb2NrZWQoYiwgdGltZXN0YW1wLCBzdXJmYWNlX2lkcyk7CiAgICAgaWYgKHJlcyA9PSBPSykgewotICAgICAgICBmaXJlQnVmZmVyTGlzdGVuZXJzTG9ja2VkKGJ1ZmZlciwgLyphY3F1aXJlZCovZmFsc2UsIC8qb3V0cHV0Ki90cnVlKTsKKyAgICAgICAgZmlyZUJ1ZmZlckxpc3RlbmVyc0xvY2tlZChiLCAvKmFjcXVpcmVkKi9mYWxzZSwgLypvdXRwdXQqL3RydWUsIHRpbWVzdGFtcCwgZnJhbWVOdW1iZXIpOwogICAgIH0KIAogICAgIC8vIEV2ZW4gaWYgcmV0dXJuaW5nIHRoZSBidWZmZXIgZmFpbGVkLCB3ZSBzdGlsbCB3YW50IHRvIHNpZ25hbCB3aG9ldmVyIGlzIHdhaXRpbmcgZm9yIHRoZQpAQCAtNzQ3LDggKzc3NCwyMiBAQAogICAgIHJldHVybiBnZXRJbnB1dEJ1ZmZlclByb2R1Y2VyTG9ja2VkKHByb2R1Y2VyKTsKIH0KIAordm9pZCBDYW1lcmEzU3RyZWFtOjpmaXJlQnVmZmVyUmVxdWVzdEZvckZyYW1lTnVtYmVyKHVpbnQ2NF90IGZyYW1lTnVtYmVyLAorICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc2V0dGluZ3MpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKworICAgIGZvciAoYXV0byAmaXQgOiBtQnVmZmVyTGlzdGVuZXJMaXN0KSB7CisgICAgICAgIHNwPENhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lcj4gbGlzdGVuZXIgPSBpdC5wcm9tb3RlKCk7CisgICAgICAgIGlmIChsaXN0ZW5lci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBsaXN0ZW5lci0+b25CdWZmZXJSZXF1ZXN0Rm9yRnJhbWVOdW1iZXIoZnJhbWVOdW1iZXIsIGdldElkKCksIHNldHRpbmdzKTsKKyAgICAgICAgfQorICAgIH0KK30KKwogdm9pZCBDYW1lcmEzU3RyZWFtOjpmaXJlQnVmZmVyTGlzdGVuZXJzTG9ja2VkKAotICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXImIGJ1ZmZlciwgYm9vbCBhY3F1aXJlZCwgYm9vbCBvdXRwdXQpIHsKKyAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyJiBidWZmZXIsIGJvb2wgYWNxdWlyZWQsIGJvb2wgb3V0cHV0LCBuc2Vjc190IHRpbWVzdGFtcCwKKyAgICAgICAgdWludDY0X3QgZnJhbWVOdW1iZXIpIHsKICAgICBMaXN0PHdwPENhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lcj4gPjo6aXRlcmF0b3IgaXQsIGVuZDsKIAogICAgIC8vIFRPRE86IGZpbmlzaCBpbXBsZW1lbnRpbmcKQEAgLTc1Nyw2ICs3OTgsOCBAQAogICAgICAgICBDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXI6OkJ1ZmZlckluZm8oKTsKICAgICBpbmZvLm1PdXRwdXQgPSBvdXRwdXQ7CiAgICAgaW5mby5tRXJyb3IgPSAoYnVmZmVyLnN0YXR1cyA9PSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1IpOworICAgIGluZm8ubUZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CisgICAgaW5mby5tVGltZXN0YW1wID0gdGltZXN0YW1wOwogICAgIC8vIFRPRE86IHJlc3Qgb2YgZmllbGRzCiAKICAgICBmb3IgKGl0ID0gbUJ1ZmZlckxpc3RlbmVyTGlzdC5iZWdpbigpLCBlbmQgPSBtQnVmZmVyTGlzdGVuZXJMaXN0LmVuZCgpOwpAQCAtNzgwLDYgKzgyMywxMiBAQAogICAgIHJldHVybiBoYXNPdXRzdGFuZGluZ0J1ZmZlcnNMb2NrZWQoKTsKIH0KIAorc2l6ZV90IENhbWVyYTNTdHJlYW06OmdldE91dHN0YW5kaW5nQnVmZmVyc0NvdW50KCkgY29uc3QgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIHJldHVybiBnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKTsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM1N0cmVhbTo6c2V0U3RhdHVzVHJhY2tlcihzcDxTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogICAgIHNwPFN0YXR1c1RyYWNrZXI+IG9sZFRyYWNrZXIgPSBtU3RhdHVzVHJhY2tlci5wcm9tb3RlKCk7CkBAIC04MjIsNyArODcxLDcgQEAKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiBzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpyZXR1cm5CdWZmZXJMb2NrZWQoY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3QsIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mKSB7CiAgICAgQUxPR0UoIiVzOiBUaGlzIHR5cGUgb2Ygc3RyZWFtIGRvZXMgbm90IHN1cHBvcnQgb3V0cHV0IiwgX19GVU5DVElPTl9fKTsKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oCmluZGV4IDRkZGNmMWEuLmM5MTZmZTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oCkBAIC0xOTcsNiArMTk3LDggQEAKICAgICAgKiBhZnRlciB0aGlzIGNhbGwsIGJ1dCBjYW4gc3RpbGwgYmUgcmVhZCB1bnRpbCB0aGUgZGVzdHJ1Y3Rpb24gb2YgdGhlCiAgICAgICogc3RyZWFtLgogICAgICAqCisgICAgICogc3RyZWFtUmVjb25maWd1cmVkOiBzZXQgdG8gdHJ1ZSB3aGVuIGEgc3RyZWFtIGlzIGJlaW5nIHJlY29uZmlndXJlZC4KKyAgICAgKgogICAgICAqIFJldHVybnM6CiAgICAgICogICBPSyBvbiBhIHN1Y2Nlc3NmdWwgY29uZmlndXJhdGlvbgogICAgICAqICAgTk9fSU5JVCBpbiBjYXNlIG9mIGEgc2VyaW91cyBlcnJvciBmcm9tIHRoZSBIQUwgZGV2aWNlCkBAIC0yMDQsNyArMjA2LDcgQEAKICAgICAgKiAgIElOVkFMSURfT1BFUkFUSU9OIGluIGNhc2UgY29ubmVjdGluZyB0byB0aGUgY29uc3VtZXIgZmFpbGVkIG9yIGNvbnN1bWVyCiAgICAgICogICAgICAgZG9lc24ndCBleGlzdCB5ZXQuCiAgICAgICovCi0gICAgc3RhdHVzX3QgICAgICAgICBmaW5pc2hDb25maWd1cmF0aW9uKCk7CisgICAgc3RhdHVzX3QgICAgICAgICBmaW5pc2hDb25maWd1cmF0aW9uKC8qb3V0Ki9ib29sKiBzdHJlYW1SZWNvbmZpZ3VyZWQgPSBudWxscHRyKTsKIAogICAgIC8qKgogICAgICAqIENhbmNlbHMgdGhlIHN0cmVhbSBjb25maWd1cmF0aW9uIHByb2Nlc3MuIFRoaXMgcmV0dXJucyB0aGUgc3RyZWFtIHRvIHRoZQpAQCAtMjMyLDYgKzIzNCwxMSBAQAogICAgICAqCiAgICAgICogVGhpcyBjYWxsIHBlcmZvcm1zIG5vIGFsbG9jYXRpb24sIHNvIGlzIHF1aWNrIHRvIGNhbGwuCiAgICAgICoKKyAgICAgKiBibG9ja1JlcXVlc3Qgc3BlY2lmaWVzIHdoZXRoZXIgcHJlcGFyZSB3aWxsIGJsb2NrIHVwY29taW5nIGNhcHR1cmUKKyAgICAgKiByZXF1ZXN0LiBUaGlzIGZsYWcgc2hvdWxkIG9ubHkgYmUgc2V0IHRvIGZhbHNlIGlmIHRoZSBjYWxsZXIgZ3VhcmFudGVlcworICAgICAqIHRoZSB3aG9sZSBidWZmZXIgcHJlcGFyYXRpb24gcHJvY2VzcyBpcyBkb25lIGJlZm9yZSBjYXB0dXJlIHJlcXVlc3QKKyAgICAgKiBjb21lcyBpbi4KKyAgICAgKgogICAgICAqIFJldHVybnM6CiAgICAgICogICAgT0sgaWYgbm8gbW9yZSBidWZmZXJzIG5lZWQgdG8gYmUgcHJlYWxsb2NhdGVkCiAgICAgICogICAgTk9UX0VOT1VHSF9EQVRBIGlmIGNhbGxzIHRvIHByZXBhcmVOZXh0QnVmZmVyIGFyZSBuZWVkZWQgdG8gZmluaXNoCkBAIC0yNDAsMTIgKzI0NywxMiBAQAogICAgICAqICAgIElOVkFMSURfT1BFUkFUSU9OIGlmIGNhbGxlZCB3aGVuIG5vdCBpbiBDT05GSUdVUkVEIHN0YXRlLCBvciBhCiAgICAgICogICAgICAgIHZhbGlkIGJ1ZmZlciBoYXMgYWxyZWFkeSBiZWVuIHJldHVybmVkIHRvIHRoaXMgc3RyZWFtLgogICAgICAqLwotICAgIHN0YXR1c190ICAgICAgICAgc3RhcnRQcmVwYXJlKGludCBtYXhDb3VudCk7CisgICAgc3RhdHVzX3QgICAgICAgICBzdGFydFByZXBhcmUoaW50IG1heENvdW50LCBib29sIGJsb2NrUmVxdWVzdCk7CiAKICAgICAvKioKLSAgICAgKiBDaGVjayBpZiB0aGUgc3RyZWFtIGlzIG1pZC1wcmVwYXJpbmcuCisgICAgICogQ2hlY2sgaWYgdGhlIHJlcXVlc3Qgb24gYSBzdHJlYW0gaXMgYmxvY2tlZCBieSBwcmVwYXJlLgogICAgICAqLwotICAgIGJvb2wgICAgICAgICAgICAgaXNQcmVwYXJpbmcoKSBjb25zdDsKKyAgICBib29sICAgICAgICAgICAgIGlzQmxvY2tlZEJ5UHJlcGFyZSgpIGNvbnN0OwogCiAgICAgLyoqCiAgICAgICogQ29udGludWUgc3RyZWFtIGJ1ZmZlciBwcmVwYXJhdGlvbiBieSBhbGxvY2F0aW5nIHRoZSBuZXh0CkBAIC0zMTEsMTYgKzMxOCwyNCBAQAogICAgICAqCiAgICAgICovCiAgICAgc3RhdHVzX3QgICAgICAgICBnZXRCdWZmZXIoY2FtZXJhM19zdHJlYW1fYnVmZmVyICpidWZmZXIsCisgICAgICAgICAgICBuc2Vjc190IHdhaXRCdWZmZXJUaW1lb3V0LAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMgPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCkpOwogCiAgICAgLyoqCiAgICAgICogUmV0dXJuIGEgYnVmZmVyIHRvIHRoZSBzdHJlYW0gYWZ0ZXIgdXNlIGJ5IHRoZSBIQUwuCiAgICAgICoKKyAgICAgKiBNdWx0aXBsZSBzdXJmYWNlcyBjb3VsZCBzaGFyZSB0aGUgc2FtZSBIQUwgc3RyZWFtLCBidXQgYSByZXF1ZXN0IG1heQorICAgICAqIGJlIG9ubHkgZm9yIGEgc3Vic2V0IG9mIHN1cmZhY2VzLiBJbiB0aGlzIGNhc2UsIHRoZQorICAgICAqIENhbWVyYTNTdHJlYW1JbnRlcmZhY2Ugb2JqZWN0IG5lZWRzIHRoZSBzdXJmYWNlIElEIGluZm9ybWF0aW9uIHRvIGF0dGFjaAorICAgICAqIGJ1ZmZlcnMgZm9yIHRob3NlIHN1cmZhY2VzLgorICAgICAqCiAgICAgICogVGhpcyBtZXRob2QgbWF5IG9ubHkgYmUgY2FsbGVkIGZvciBidWZmZXJzIHByb3ZpZGVkIGJ5IGdldEJ1ZmZlcigpLgogICAgICAqIEZvciBiaWRpcmVjdGlvbmFsIHN0cmVhbXMsIHRoaXMgbWV0aG9kIGFwcGxpZXMgdG8gdGhlIG91dHB1dC1zaWRlIGJ1ZmZlcnMKICAgICAgKi8KICAgICBzdGF0dXNfdCAgICAgICAgIHJldHVybkJ1ZmZlcihjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKTsKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKSwKKyAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lTnVtYmVyID0gMCk7CiAKICAgICAvKioKICAgICAgKiBGaWxsIGluIHRoZSBjYW1lcmEzX3N0cmVhbV9idWZmZXIgd2l0aCB0aGUgbmV4dCB2YWxpZCBidWZmZXIgZm9yIHRoaXMKQEAgLTM1NCw2ICszNjksMTEgQEAKICAgICAgKi8KICAgICBib29sICAgICAgICAgICAgIGhhc091dHN0YW5kaW5nQnVmZmVycygpIGNvbnN0OwogCisgICAgLyoqCisgICAgICogR2V0IG51bWJlciBvZiBidWZmZXJzIGN1cnJlbnRseSBoYW5kZWQgb3V0IHRvIEhBTAorICAgICAqLworICAgIHNpemVfdCAgICAgICAgICAgZ2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKSBjb25zdDsKKwogICAgIGVudW0gewogICAgICAgICBUSU1FT1VUX05FVkVSID0gLTEKICAgICB9OwpAQCAtNDEzLDYgKzQzMywxMiBAQAogICAgICAqLwogICAgIHN0YXR1c190ICAgICAgICAgcmVzdG9yZUNvbmZpZ3VyZWRTdGF0ZSgpOwogCisgICAgLyoqCisgICAgICogTm90aWZ5IGJ1ZmZlciBzdHJlYW0gbGlzdGVuZXJzIGFib3V0IGluY29taW5nIHJlcXVlc3Qgd2l0aCBwYXJ0aWN1bGFyIGZyYW1lIG51bWJlci4KKyAgICAgKi8KKyAgICB2b2lkIGZpcmVCdWZmZXJSZXF1ZXN0Rm9yRnJhbWVOdW1iZXIodWludDY0X3QgZnJhbWVOdW1iZXIsCisgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc2V0dGluZ3MpIG92ZXJyaWRlOworCiAgIHByb3RlY3RlZDoKICAgICBjb25zdCBpbnQgbUlkOwogICAgIC8qKgpAQCAtNDM0LDcgKzQ2MCw3IEBACiAgICAgLy8gWmVybyBmb3IgZm9ybWF0cyB3aXRoIGZpeGVkIGJ1ZmZlciBzaXplIGZvciBnaXZlbiBkaW1lbnNpb25zLgogICAgIGNvbnN0IHNpemVfdCBtTWF4U2l6ZTsKIAotICAgIGVudW0geworICAgIGVudW0gU3RyZWFtU3RhdGUgewogICAgICAgICBTVEFURV9FUlJPUiwKICAgICAgICAgU1RBVEVfQ09OU1RSVUNURUQsCiAgICAgICAgIFNUQVRFX0lOX0NPTkZJRywKQEAgLTQ2Nyw3ICs0OTMsOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyTG9ja2VkKGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAqYnVmZmVyLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMgPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCkpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyTG9ja2VkKGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApOworICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlckxvY2tlZChjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlcik7CiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXR1cm5JbnB1dEJ1ZmZlckxvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyKTsKQEAgLTQ4OSw3ICs1MTYsNyBAQAogICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0QnVmZmVyQ291bnRMb2NrZWQoKSA9IDA7CiAKICAgICAvLyBHZXQgaGFuZG91dCBvdXRwdXQgYnVmZmVyIGNvdW50LgotICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgPSAwOworICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgY29uc3QgPSAwOwogCiAgICAgLy8gR2V0IGhhbmRvdXQgaW5wdXQgYnVmZmVyIGNvdW50LgogICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0SGFuZG91dElucHV0QnVmZmVyQ291bnRMb2NrZWQoKSA9IDA7CkBAIC01MjAsNyArNTQ3LDcgQEAKICAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrV2FpdEZvckJ1ZmZlckR1cmF0aW9uID0gMzAwMDAwMDAwMExMOyAvLyAzMDAwIG1zCiAKICAgICB2b2lkIGZpcmVCdWZmZXJMaXN0ZW5lcnNMb2NrZWQoY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyJiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhY3F1aXJlZCwgYm9vbCBvdXRwdXQpOworICAgICAgICAgICAgYm9vbCBhY3F1aXJlZCwgYm9vbCBvdXRwdXQsIG5zZWNzX3QgdGltZXN0YW1wID0gMCwgdWludDY0X3QgZnJhbWVOdW1iZXIgPSAwKTsKICAgICBMaXN0PHdwPENhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lcj4gPiBtQnVmZmVyTGlzdGVuZXJMaXN0OwogCiAgICAgc3RhdHVzX3QgICAgICAgIGNhbmNlbFByZXBhcmVMb2NrZWQoKTsKQEAgLTUzNCw2ICs1NjEsNyBAQAogICAgIC8vIGhhcyBiZWVuIGNhbGxlZCBzdWZmaWNpZW50IG51bWJlciBvZiB0aW1lcywgb3Igc3RyZWFtIGNvbmZpZ3VyYXRpb24KICAgICAvLyBoYWQgdG8gcmVnaXN0ZXIgYnVmZmVycyB3aXRoIHRoZSBIQUwKICAgICBib29sIG1QcmVwYXJlZDsKKyAgICBib29sIG1QcmVwYXJlQmxvY2tSZXF1ZXN0OwogCiAgICAgVmVjdG9yPGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90PiBtUHJlcGFyZWRCdWZmZXJzOwogICAgIHNpemVfdCBtUHJlcGFyZWRCdWZmZXJJZHg7CkBAIC01NTksNiArNTg3LDcgQEAKICAgICBhbmRyb2lkX2RhdGFzcGFjZSBtT3JpZ2luYWxEYXRhU3BhY2U7CiAKICAgICBTdHJpbmc4IG1QaHlzaWNhbENhbWVyYUlkOworICAgIG5zZWNzX3QgbUxhc3RUaW1lc3RhbXA7CiB9OyAvLyBjbGFzcyBDYW1lcmEzU3RyZWFtCiAKIH07IC8vIG5hbWVzcGFjZSBjYW1lcmEzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXIuaAppbmRleCAyZGIzMzNkLi5kMGFlZTI3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQTNfU1RSRUFNQlVGRkVSTElTVEVORVJfSAogI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBM19TVFJFQU1CVUZGRVJMSVNURU5FUl9ICiAKKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIApAQCAtNDEsNiArNDIsOSBAQAogICAgIHZpcnR1YWwgdm9pZCBvbkJ1ZmZlckFjcXVpcmVkKGNvbnN0IEJ1ZmZlckluZm8mIGJ1ZmZlckluZm8pID0gMDsKICAgICAvLyBCdWZmZXIgd2FzIHJlbGVhc2VkIGJ5IHRoZSBIQUwKICAgICB2aXJ0dWFsIHZvaWQgb25CdWZmZXJSZWxlYXNlZChjb25zdCBCdWZmZXJJbmZvJiBidWZmZXJJbmZvKSA9IDA7CisgICAgLy8gTm90aWZ5IGFib3V0IGluY29taW5nIGJ1ZmZlciByZXF1ZXN0IGZyYW1lIG51bWJlcgorICAgIHZpcnR1YWwgdm9pZCBvbkJ1ZmZlclJlcXVlc3RGb3JGcmFtZU51bWJlcih1aW50NjRfdCBmcmFtZU51bWJlciwgaW50IHN0cmVhbUlkLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHNldHRpbmdzKSA9IDA7CiB9OwogCiB9OyAvL25hbWVzcGFjZSBjYW1lcmEzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCmluZGV4IDllZDcxODQuLjczZjUwMWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCkBAIC0xOCw2ICsxOCw4IEBACiAjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkEzX1NUUkVBTV9JTlRFUkZBQ0VfSAogCiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CiAjaW5jbHVkZSAiQ2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyLmgiCiAjaW5jbHVkZSAiQ2FtZXJhM1N0cmVhbUJ1ZmZlckZyZWVkTGlzdGVuZXIuaCIKIApAQCAtMTI4LDEzICsxMzAsMTUgQEAKICAgICAgKiBtb2RpZmllZCBhZnRlciB0aGlzIGNhbGwsIGJ1dCBjYW4gc3RpbGwgYmUgcmVhZCB1bnRpbCB0aGUgZGVzdHJ1Y3Rpb24gb2YKICAgICAgKiB0aGUgc3RyZWFtLgogICAgICAqCisgICAgICogc3RyZWFtUmVjb25maWd1cmVkOiBzZXQgdG8gdHJ1ZSB3aGVuIGEgc3RyZWFtIGlzIGJlaW5nIHJlY29uZmlndXJlZC4KKyAgICAgKgogICAgICAqIFJldHVybnM6CiAgICAgICogICBPSyBvbiBhIHN1Y2Nlc3NmdWwgY29uZmlndXJhdGlvbgogICAgICAqICAgTk9fSU5JVCBpbiBjYXNlIG9mIGEgc2VyaW91cyBlcnJvciBmcm9tIHRoZSBIQUwgZGV2aWNlCiAgICAgICogICBOT19NRU1PUlkgaW4gY2FzZSBvZiBhbiBlcnJvciByZWdpc3RlcmluZyBidWZmZXJzCiAgICAgICogICBJTlZBTElEX09QRVJBVElPTiBpbiBjYXNlIGNvbm5lY3RpbmcgdG8gdGhlIGNvbnN1bWVyIGZhaWxlZAogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZmluaXNoQ29uZmlndXJhdGlvbigpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGZpbmlzaENvbmZpZ3VyYXRpb24oLypvdXQqL2Jvb2wqIHN0cmVhbVJlY29uZmlndXJlZCA9IG51bGxwdHIpID0gMDsKIAogICAgIC8qKgogICAgICAqIENhbmNlbHMgdGhlIHN0cmVhbSBjb25maWd1cmF0aW9uIHByb2Nlc3MuIFRoaXMgcmV0dXJucyB0aGUgc3RyZWFtIHRvIHRoZQpAQCAtMTYwLDYgKzE2NCwxMSBAQAogICAgICAqIFBSRVBBUklORyBzdGF0ZS4gT3RoZXJ3aXNlLCByZXR1cm5zIE5PVF9FTk9VR0hfREFUQSBhbmQgdHJhbnNpdGlvbnMKICAgICAgKiB0byBQUkVQQVJJTkcuCiAgICAgICoKKyAgICAgKiBibG9ja1JlcXVlc3Qgc3BlY2lmaWVzIHdoZXRoZXIgcHJlcGFyZSB3aWxsIGJsb2NrIHVwY29taW5nIGNhcHR1cmUKKyAgICAgKiByZXF1ZXN0LiBUaGlzIGZsYWcgc2hvdWxkIG9ubHkgYmUgc2V0IHRvIGZhbHNlIGlmIHRoZSBjYWxsZXIgZ3VhcmFudGVlcworICAgICAqIHRoZSB3aG9sZSBidWZmZXIgcHJlcGFyYXRpb24gcHJvY2VzcyBpcyBkb25lIGJlZm9yZSBjYXB0dXJlIHJlcXVlc3QKKyAgICAgKiBjb21lcyBpbi4KKyAgICAgKgogICAgICAqIFJldHVybnM6CiAgICAgICogICAgT0sgaWYgbm8gbW9yZSBidWZmZXJzIG5lZWQgdG8gYmUgcHJlYWxsb2NhdGVkCiAgICAgICogICAgTk9UX0VOT1VHSF9EQVRBIGlmIGNhbGxzIHRvIHByZXBhcmVOZXh0QnVmZmVyIGFyZSBuZWVkZWQgdG8gZmluaXNoCkBAIC0xNjgsMTIgKzE3NywxMiBAQAogICAgICAqICAgIElOVkFMSURfT1BFUkFUSU9OIGlmIGNhbGxlZCB3aGVuIG5vdCBpbiBDT05GSUdVUkVEIHN0YXRlLCBvciBhCiAgICAgICogICAgICAgIHZhbGlkIGJ1ZmZlciBoYXMgYWxyZWFkeSBiZWVuIHJldHVybmVkIHRvIHRoaXMgc3RyZWFtLgogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRQcmVwYXJlKGludCBtYXhDb3VudCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRQcmVwYXJlKGludCBtYXhDb3VudCwgYm9vbCBibG9ja1JlcXVlc3QpID0gMDsKIAogICAgIC8qKgotICAgICAqIENoZWNrIGlmIHRoZSBzdHJlYW0gaXMgbWlkLXByZXBhcmluZy4KKyAgICAgKiBDaGVjayBpZiB0aGUgcmVxdWVzdCBvbiBhIHN0cmVhbSBpcyBibG9ja2VkIGJ5IHByZXBhcmUuCiAgICAgICovCi0gICAgdmlydHVhbCBib29sICAgICBpc1ByZXBhcmluZygpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgICAgIGlzQmxvY2tlZEJ5UHJlcGFyZSgpIGNvbnN0ID0gMDsKIAogICAgIC8qKgogICAgICAqIENvbnRpbnVlIHN0cmVhbSBidWZmZXIgcHJlcGFyYXRpb24gYnkgYWxsb2NhdGluZyB0aGUgbmV4dApAQCAtMjM3LDE2ICsyNDYsMjUgQEAKICAgICAgKgogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyKGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAqYnVmZmVyLAorICAgICAgICAgICAgbnNlY3NfdCB3YWl0QnVmZmVyVGltZW91dCwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBSZXR1cm4gYSBidWZmZXIgdG8gdGhlIHN0cmVhbSBhZnRlciB1c2UgYnkgdGhlIEhBTC4KICAgICAgKgorICAgICAqIE11bHRpcGxlIHN1cmZhY2VzIGNvdWxkIHNoYXJlIHRoZSBzYW1lIEhBTCBzdHJlYW0sIGJ1dCBhIHJlcXVlc3QgbWF5CisgICAgICogYmUgb25seSBmb3IgYSBzdWJzZXQgb2Ygc3VyZmFjZXMuIEluIHRoaXMgY2FzZSwgdGhlCisgICAgICogQ2FtZXJhM1N0cmVhbUludGVyZmFjZSBvYmplY3QgbmVlZHMgdGhlIHN1cmZhY2UgSUQgaW5mb3JtYXRpb24gdG8gYXR0YWNoCisgICAgICogYnVmZmVycyBmb3IgdGhvc2Ugc3VyZmFjZXMuIEZvciB0aGUgY2FzZSBvZiBzaW5nbGUgc3VyZmFjZSBmb3IgYSBIQUwKKyAgICAgKiBzdHJlYW0sIHN1cmZhY2VfaWRzIHBhcmFtZXRlciBoYXMgbm8gZWZmZWN0LgorICAgICAqCiAgICAgICogVGhpcyBtZXRob2QgbWF5IG9ubHkgYmUgY2FsbGVkIGZvciBidWZmZXJzIHByb3ZpZGVkIGJ5IGdldEJ1ZmZlcigpLgogICAgICAqIEZvciBiaWRpcmVjdGlvbmFsIHN0cmVhbXMsIHRoaXMgbWV0aG9kIGFwcGxpZXMgdG8gdGhlIG91dHB1dC1zaWRlIGJ1ZmZlcnMKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlcihjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSA9IDA7CisgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nID0gdHJ1ZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpLAorICAgICAgICAgICAgdWludDY0X3QgZnJhbWVOdW1iZXIgPSAwKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBGaWxsIGluIHRoZSBjYW1lcmEzX3N0cmVhbV9idWZmZXIgd2l0aCB0aGUgbmV4dCB2YWxpZCBidWZmZXIgZm9yIHRoaXMKQEAgLTI4Myw2ICszMDEsMTEgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsIGJvb2wgICAgIGhhc091dHN0YW5kaW5nQnVmZmVycygpIGNvbnN0ID0gMDsKIAorICAgIC8qKgorICAgICAqIEdldCBudW1iZXIgb2YgYnVmZmVycyBjdXJyZW50bHkgaGFuZGVkIG91dCB0byBIQUwKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHNpemVfdCAgIGdldE91dHN0YW5kaW5nQnVmZmVyc0NvdW50KCkgY29uc3QgPSAwOworCiAgICAgZW51bSB7CiAgICAgICAgIFRJTUVPVVRfTkVWRVIgPSAtMQogICAgIH07CkBAIC0zMjMsNiArMzQ2LDEyIEBACiAgICAgICogQ2FtZXJhM1N0cmVhbS4KICAgICAgKi8KICAgICB2aXJ0dWFsIHZvaWQgc2V0QnVmZmVyRnJlZWRMaXN0ZW5lcih3cDxDYW1lcmEzU3RyZWFtQnVmZmVyRnJlZWRMaXN0ZW5lcj4gbGlzdGVuZXIpID0gMDsKKworICAgIC8qKgorICAgICAqIE5vdGlmeSBidWZmZXIgc3RyZWFtIGxpc3RlbmVycyBhYm91dCBpbmNvbWluZyByZXF1ZXN0IHdpdGggcGFydGljdWxhciBmcmFtZSBudW1iZXIuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIGZpcmVCdWZmZXJSZXF1ZXN0Rm9yRnJhbWVOdW1iZXIodWludDY0X3QgZnJhbWVOdW1iZXIsCisgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc2V0dGluZ3MpID0gMDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNhbWVyYTMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcAppbmRleCA4YTk0MDJlLi44NGMyZWM3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwCkBAIC04Myw4ICs4Myw4IEBACiAgICAgLy8gZnJvbSBpbnB1dCwgYW5kIGF0dGFjaGVkIHRvIHRoZSBvdXRwdXRzLiBJbiB0aGlzIGNhc2UsIHRoZSBpbnB1dCBxdWV1ZSdzCiAgICAgLy8gZGVxdWV1ZUJ1ZmZlciBjYW4gc3RpbGwgYWxsb2NhdGUgMSBleHRyYSBidWZmZXIgYmVmb3JlIGJlaW5nIGJsb2NrZWQgYnkKICAgICAvLyB0aGUgb3V0cHV0J3MgYXR0YWNoQnVmZmVyKCkuCi0gICAgbUJ1ZmZlckl0ZW1Db25zdW1lciA9IG5ldyBCdWZmZXJJdGVtQ29uc3VtZXIobUNvbnN1bWVyLCBjb25zdW1lclVzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXhDb25zdW1lckJ1ZmZlcnMrMSk7CisgICAgbU1heENvbnN1bWVyQnVmZmVycysrOworICAgIG1CdWZmZXJJdGVtQ29uc3VtZXIgPSBuZXcgQnVmZmVySXRlbUNvbnN1bWVyKG1Db25zdW1lciwgY29uc3VtZXJVc2FnZSwgbU1heENvbnN1bWVyQnVmZmVycyk7CiAgICAgaWYgKG1CdWZmZXJJdGVtQ29uc3VtZXIgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgIH0KQEAgLTEwOCw2ICsxMDgsNyBAQAogICAgIG1IZWlnaHQgPSBoZWlnaHQ7CiAgICAgbUZvcm1hdCA9IGZvcm1hdDsKICAgICBtUHJvZHVjZXJVc2FnZSA9IHByb2R1Y2VyVXNhZ2U7CisgICAgbUFjcXVpcmVkSW5wdXRCdWZmZXJzID0gMDsKIAogICAgIFNQX0xPR1YoIiVzOiBjb25uZWN0ZWQiLCBfX0ZVTkNUSU9OX18pOwogICAgIHJldHVybiByZXM7CkBAIC0xNDcsOSArMTQ4LDEyIEBACiAKICAgICBtTWF4SGFsQnVmZmVycyA9IDA7CiAgICAgbU1heENvbnN1bWVyQnVmZmVycyA9IDA7CisgICAgbUFjcXVpcmVkSW5wdXRCdWZmZXJzID0gMDsKICAgICBTUF9MT0dWKCIlczogRGlzY29ubmVjdGVkIiwgX19GVU5DVElPTl9fKTsKIH0KIAorQ2FtZXJhM1N0cmVhbVNwbGl0dGVyOjpDYW1lcmEzU3RyZWFtU3BsaXR0ZXIoYm9vbCB1c2VIYWxCdWZNYW5hZ2VyKSA6CisgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyKHVzZUhhbEJ1Zk1hbmFnZXIpIHt9CiAKIENhbWVyYTNTdHJlYW1TcGxpdHRlcjo6fkNhbWVyYTNTdHJlYW1TcGxpdHRlcigpIHsKICAgICBkaXNjb25uZWN0KCk7CkBAIC0xNjUsNyArMTY5LDkgQEAKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKLSAgICByZXMgPSBtQ29uc3VtZXItPnNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQobU1heENvbnN1bWVyQnVmZmVycysxKTsKKyAgICBpZiAobU1heENvbnN1bWVyQnVmZmVycyA+IG1BY3F1aXJlZElucHV0QnVmZmVycykgeworICAgICAgICByZXMgPSBtQ29uc3VtZXItPnNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQobU1heENvbnN1bWVyQnVmZmVycyk7CisgICAgfQogCiAgICAgcmV0dXJuIHJlczsKIH0KQEAgLTE4MiwxMiArMTg4LDE5IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gIHN0YXR1c190IHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfZGltZW5zaW9ucyhvdXRwdXRRdWV1ZS5nZXQoKSwKKyAgICBzdGF0dXNfdCByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RpbWVuc2lvbnMob3V0cHV0UXVldWUuZ2V0KCksCiAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOwogICAgIGlmIChyZXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgU1BfTE9HRSgiYWRkT3V0cHV0OiBmYWlsZWQgdG8gc2V0IGJ1ZmZlciBkaW1lbnNpb25zICglZCkiLCByZXMpOwogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KKyAgICByZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2Zvcm1hdChvdXRwdXRRdWV1ZS5nZXQoKSwKKyAgICAgICAgICAgIG1Gb3JtYXQpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29uZmlndXJlIHN0cmVhbSBidWZmZXIgZm9ybWF0ICUjeCBmb3Igc3VyZmFjZUlkICV6dSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtRm9ybWF0LCBzdXJmYWNlSWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KIAogICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGdicCA9IG91dHB1dFF1ZXVlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CiAgICAgLy8gQ29ubmVjdCB0byB0aGUgYnVmZmVyIHByb2R1Y2VyCkBAIC0yMzAsNyArMjQzLDkgQEAKICAgICB1aW50NjRfdCB1c2FnZSA9IDA7CiAgICAgcmVzID0gbmF0aXZlX3dpbmRvd19nZXRfY29uc3VtZXJfdXNhZ2Uoc3RhdGljX2Nhc3Q8QU5hdGl2ZVdpbmRvdyo+KG91dHB1dFF1ZXVlLmdldCgpKSwgJnVzYWdlKTsKICAgICBpZiAoISh1c2FnZSAmIChHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSIHwgR1JBTExPQ19VU0FHRV9IV19URVhUVVJFKSkpIHsKLSAgICAgICAgb3V0cHV0UXVldWUtPnNldERlcXVldWVUaW1lb3V0KGtEZXF1ZXVlQnVmZmVyVGltZW91dCk7CisgICAgICAgIG5zZWNzX3QgdGltZW91dCA9IG1Vc2VIYWxCdWZNYW5hZ2VyID8KKyAgICAgICAgICAgICAgICBrSGFsQnVmTWdyRGVxdWV1ZUJ1ZmZlclRpbWVvdXQgOiBrTm9ybWFsRGVxdWV1ZUJ1ZmZlclRpbWVvdXQ7CisgICAgICAgIG91dHB1dFF1ZXVlLT5zZXREZXF1ZXVlVGltZW91dCh0aW1lb3V0KTsKICAgICB9CiAKICAgICByZXMgPSBnYnAtPmFsbG93QWxsb2NhdGlvbihmYWxzZSk7CkBAIC0yNDIsNiArMjU3LDEwIEBACiAgICAgLy8gQWRkIG5ldyBlbnRyeSBpbnRvIG1PdXRwdXRzCiAgICAgbU91dHB1dHNbc3VyZmFjZUlkXSA9IGdicDsKICAgICBtQ29uc3VtZXJCdWZmZXJDb3VudFtzdXJmYWNlSWRdID0gbWF4Q29uc3VtZXJCdWZmZXJzOworICAgIGlmIChtQ29uc3VtZXJCdWZmZXJDb3VudFtzdXJmYWNlSWRdID4gbU1heEhhbEJ1ZmZlcnMpIHsKKyAgICAgICAgU1BfTE9HVygiJXM6IENvbnN1bWVyIGJ1ZmZlciBjb3VudCAlenUgbGFyZ2VyIHRoYW4gbWF4LiBIYWwgYnVmZmVyczogJXp1IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIG1Db25zdW1lckJ1ZmZlckNvdW50W3N1cmZhY2VJZF0sIG1NYXhIYWxCdWZmZXJzKTsKKyAgICB9CiAgICAgbU5vdGlmaWVyc1tnYnBdID0gbGlzdGVuZXI7CiAgICAgbU91dHB1dFNsb3RzW2dicF0gPSBzdGQ6Om1ha2VfdW5pcXVlPE91dHB1dFNsb3RzPih0b3RhbEJ1ZmZlckNvdW50KTsKIApAQCAtMjU5LDEwICsyNzgsMTIgQEAKICAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKLSAgICByZXMgPSBtQ29uc3VtZXItPnNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQobU1heENvbnN1bWVyQnVmZmVycysxKTsKLSAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgIFNQX0xPR0UoIiVzOiBzZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50IGZhaWxlZCAlZCIsIF9fRlVOQ1RJT05fXywgcmVzKTsKLSAgICAgICAgcmV0dXJuIHJlczsKKyAgICBpZiAobUFjcXVpcmVkSW5wdXRCdWZmZXJzIDwgbU1heENvbnN1bWVyQnVmZmVycykgeworICAgICAgICByZXMgPSBtQ29uc3VtZXItPnNldE1heEFjcXVpcmVkQnVmZmVyQ291bnQobU1heENvbnN1bWVyQnVmZmVycyk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIFNQX0xPR0UoIiVzOiBzZXRNYXhBY3F1aXJlZEJ1ZmZlckNvdW50IGZhaWxlZCAlZCIsIF9fRlVOQ1RJT05fXywgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gcmVzOwpAQCAtMzExLDExICszMzIsNyBAQAogICAgIH0KIAogICAgIG1Ob3RpZmllcnNbZ2JwXSA9IG51bGxwdHI7Ci0gICAgaWYgKG1Db25zdW1lckJ1ZmZlckNvdW50W3N1cmZhY2VJZF0gPCBtTWF4SGFsQnVmZmVycykgewotICAgICAgICBtTWF4Q29uc3VtZXJCdWZmZXJzIC09IG1Db25zdW1lckJ1ZmZlckNvdW50W3N1cmZhY2VJZF07Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgU1BfTE9HRSgiJXM6IENhY2hlZCBjb25zdW1lciBidWZmZXIgY291bnQgbWlzbWF0Y2ghIiwgX19GVU5DVElPTl9fKTsKLSAgICB9CisgICAgbU1heENvbnN1bWVyQnVmZmVycyAtPSBtQ29uc3VtZXJCdWZmZXJDb3VudFtzdXJmYWNlSWRdOwogICAgIG1Db25zdW1lckJ1ZmZlckNvdW50W3N1cmZhY2VJZF0gPSAwOwogCiAgICAgcmV0dXJuIHJlczsKQEAgLTQyMyw4ICs0NDAsOSBAQAogICAgICAgICByZXMgPSBnYnAtPmF0dGFjaEJ1ZmZlcigmc2xvdCwgZ2IpOwogICAgICAgICBtTXV0ZXgubG9jaygpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBTUF9MT0dFKCIlczogQ2Fubm90IGFjcXVpcmVCdWZmZXIgZnJvbSBHcmFwaGljQnVmZmVyUHJvZHVjZXIgJXA6ICVzICglZCkiLAorICAgICAgICAgICAgU1BfTE9HRSgiJXM6IENhbm5vdCBhdHRhY2hCdWZmZXIgZnJvbSBHcmFwaGljQnVmZmVyUHJvZHVjZXIgJXA6ICVzICglZCkiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGdicC5nZXQoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAvLyBUT0RPOiBtaWdodCBuZWVkIHRvIGRldGFjaC9jbGVhbnVwIHRoZSBhbHJlYWR5IGF0dGFjaGVkIGJ1ZmZlcnMgYmVmb3JlIHJldHVybj8KICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KICAgICAgICAgaWYgKChzbG90IDwgMCkgfHwgKHNsb3QgPiBCdWZmZXJRdWV1ZTo6TlVNX0JVRkZFUl9TTE9UUykpIHsKQEAgLTQ5MCw2ICs1MDgsNyBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgbUFjcXVpcmVkSW5wdXRCdWZmZXJzKys7CiAgICAgU1BfTE9HVigiYWNxdWlyZWQgYnVmZmVyICUiIFBSSWQ2NCAiIGZyb20gaW5wdXQgYXQgc2xvdCAlZCIsCiAgICAgICAgICAgICBidWZmZXJJdGVtLm1HcmFwaGljQnVmZmVyLT5nZXRJZCgpLCBidWZmZXJJdGVtLm1TbG90KTsKIApAQCAtNTkyLDYgKzYxMSwxMiBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgU1BfTE9HRSgiJXM6IHJlbGVhc2VCdWZmZXIgcmV0dXJucyAlZCIsIF9fRlVOQ1RJT05fXywgcmVzKTsKICAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtQWNxdWlyZWRJbnB1dEJ1ZmZlcnMgPT0gMCkgeworICAgICAgICAgICAgQUxPR1coIiVzOiBBY3F1aXJlZCBpbnB1dCBidWZmZXIgY291bnQgYWxyZWFkeSBhdCB6ZXJvISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQWNxdWlyZWRJbnB1dEJ1ZmZlcnMtLTsKKyAgICAgICAgfQogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmgKaW5kZXggZmVhMWJkYi4uOTYwZjdhYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5oCkBAIC00OSw3ICs0OSw3IEBACiBwdWJsaWM6CiAKICAgICAvLyBDb25zdHJ1Y3RvcgotICAgIENhbWVyYTNTdHJlYW1TcGxpdHRlcigpID0gZGVmYXVsdDsKKyAgICBDYW1lcmEzU3RyZWFtU3BsaXR0ZXIoYm9vbCB1c2VIYWxCdWZNYW5hZ2VyID0gZmFsc2UpOwogCiAgICAgLy8gQ29ubmVjdCB0byB0aGUgc3RyZWFtIHNwbGl0dGVyIGJ5IGNyZWF0aW5nIGJ1ZmZlciBxdWV1ZSBhbmQgY29ubmVjdGluZyBpdAogICAgIC8vIHdpdGggb3V0cHV0IHN1cmZhY2VzLgpAQCAtMjI2LDcgKzIyNiwxMCBAQAogICAgIGFuZHJvaWQ6OlBpeGVsRm9ybWF0IG1Gb3JtYXQgPSBhbmRyb2lkOjpQSVhFTF9GT1JNQVRfTk9ORTsKICAgICB1aW50NjRfdCBtUHJvZHVjZXJVc2FnZSA9IDA7CiAKLSAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrRGVxdWV1ZUJ1ZmZlclRpbWVvdXQgICA9IHMybnMoMSk7IC8vIDEgc2VjCisgICAgLy8gVGhlIGF0dGFjaEJ1ZmZlciBjYWxsIHdpbGwgaGFwcGVuIG9uIGRpZmZlcmVudCB0aHJlYWQgYWNjb3JkaW5nIHRvIG1Vc2VIYWxCdWZNYW5hZ2VyIGFuZCBoYXZlCisgICAgLy8gZGlmZmVyZW50IHRpbWluZyBjb25zdHJhaW50LgorICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtOb3JtYWxEZXF1ZXVlQnVmZmVyVGltZW91dCAgICA9IHMybnMoMSk7ICAvLyAxIHNlYworICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtIYWxCdWZNZ3JEZXF1ZXVlQnVmZmVyVGltZW91dCA9IG1zMm5zKDEpOyAvLyAxIG1zZWMKIAogICAgIE11dGV4IG1NdXRleDsKIApAQCAtMjY5LDcgKzI3MiwxMiBAQAogICAgIC8vIExhdGVzdCBvbkZyYW1lQXZhaWxhYmxlIHJldHVybiB2YWx1ZQogICAgIHN0ZDo6YXRvbWljPHN0YXR1c190PiBtT25GcmFtZUF2YWlsYWJsZVJlc3swfTsKIAorICAgIC8vIEN1cnJlbnRseSBhY3F1aXJlZCBpbnB1dCBidWZmZXJzCisgICAgc2l6ZV90IG1BY3F1aXJlZElucHV0QnVmZmVyczsKKwogICAgIFN0cmluZzggbUNvbnN1bWVyTmFtZTsKKworICAgIGNvbnN0IGJvb2wgbVVzZUhhbEJ1Zk1hbmFnZXI7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmNwcAppbmRleCA0ZGFmZWZkLi5hZTdhZjhlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvRGlzdG9ydGlvbk1hcHBlci5jcHAKQEAgLTMxMiw4ICszMTIsOCBAQAogICAgICAgICBpbnQzMl90IGNvb3Jkc1s0XSA9IHsKICAgICAgICAgICAgIHJlY3RzW2ldLAogICAgICAgICAgICAgcmVjdHNbaSArIDFdLAotICAgICAgICAgICAgcmVjdHNbaV0gKyByZWN0c1tpICsgMl0sCi0gICAgICAgICAgICByZWN0c1tpICsgMV0gKyByZWN0c1tpICsgM10KKyAgICAgICAgICAgIHJlY3RzW2ldICsgcmVjdHNbaSArIDJdIC0gMSwKKyAgICAgICAgICAgIHJlY3RzW2kgKyAxXSArIHJlY3RzW2kgKyAzXSAtIDEKICAgICAgICAgfTsKIAogICAgICAgICBtYXBSYXdUb0NvcnJlY3RlZChjb29yZHMsIDIsIGNsYW1wLCBzaW1wbGUpOwpAQCAtMzIxLDggKzMyMSw4IEBACiAgICAgICAgIC8vIE1hcCBiYWNrIHRvIChsLCB0LCB3aWR0aCwgaGVpZ2h0KQogICAgICAgICByZWN0c1tpXSA9IGNvb3Jkc1swXTsKICAgICAgICAgcmVjdHNbaSArIDFdID0gY29vcmRzWzFdOwotICAgICAgICByZWN0c1tpICsgMl0gPSBjb29yZHNbMl0gLSBjb29yZHNbMF07Ci0gICAgICAgIHJlY3RzW2kgKyAzXSA9IGNvb3Jkc1szXSAtIGNvb3Jkc1sxXTsKKyAgICAgICAgcmVjdHNbaSArIDJdID0gY29vcmRzWzJdIC0gY29vcmRzWzBdICsgMTsKKyAgICAgICAgcmVjdHNbaSArIDNdID0gY29vcmRzWzNdIC0gY29vcmRzWzFdICsgMTsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CkBAIC00MDAsOCArNDAwLDggQEAKICAgICAgICAgaW50MzJfdCBjb29yZHNbNF0gPSB7CiAgICAgICAgICAgICByZWN0c1tpXSwKICAgICAgICAgICAgIHJlY3RzW2kgKyAxXSwKLSAgICAgICAgICAgIHJlY3RzW2ldICsgcmVjdHNbaSArIDJdLAotICAgICAgICAgICAgcmVjdHNbaSArIDFdICsgcmVjdHNbaSArIDNdCisgICAgICAgICAgICByZWN0c1tpXSArIHJlY3RzW2kgKyAyXSAtIDEsCisgICAgICAgICAgICByZWN0c1tpICsgMV0gKyByZWN0c1tpICsgM10gLSAxCiAgICAgICAgIH07CiAKICAgICAgICAgbWFwQ29ycmVjdGVkVG9SYXcoY29vcmRzLCAyLCBjbGFtcCwgc2ltcGxlKTsKQEAgLTQwOSw4ICs0MDksOCBAQAogICAgICAgICAvLyBNYXAgYmFjayB0byAobCwgdCwgd2lkdGgsIGhlaWdodCkKICAgICAgICAgcmVjdHNbaV0gPSBjb29yZHNbMF07CiAgICAgICAgIHJlY3RzW2kgKyAxXSA9IGNvb3Jkc1sxXTsKLSAgICAgICAgcmVjdHNbaSArIDJdID0gY29vcmRzWzJdIC0gY29vcmRzWzBdOwotICAgICAgICByZWN0c1tpICsgM10gPSBjb29yZHNbM10gLSBjb29yZHNbMV07CisgICAgICAgIHJlY3RzW2kgKyAyXSA9IGNvb3Jkc1syXSAtIGNvb3Jkc1swXSArIDE7CisgICAgICAgIHJlY3RzW2kgKyAzXSA9IGNvb3Jkc1szXSAtIGNvb3Jkc1sxXSArIDE7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA2MzUwNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5jcHAKQEAgLTAsMCArMSwyMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYS5oPgorCisjaW5jbHVkZSA8aGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CisjaW5jbHVkZSA8aGlkbC9Db252ZXJ0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBmcmFtZXdvcmtzIHsKK25hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKK25hbWVzcGFjZSBkZXZpY2UgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgSENhcHR1cmVSZXN1bHRFeHRyYXMgPSBhbmRyb2lkOjpmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXN1bHRFeHRyYXM7Cit1c2luZyBIUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyA9IGFuZHJvaWQ6OmZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbzsKK3VzaW5nIEhDYW1lcmFNZXRhZGF0YSA9IGFuZHJvaWQ6OmZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FtZXJhTWV0YWRhdGE7CisKK2NvbnN0IGNoYXIgKkgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6a1Jlc3VsdEtleSA9ICJDYXB0dXJlUmVzdWx0IjsKKworSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3MoY29uc3Qgc3A8SGFsSW50ZXJmYWNlPiYgYmFzZSkgOiBDQmFzZShiYXNlKSB7IH0KKworYm9vbCBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6OmluaXRpYWxpemVMb29wZXIoKSB7CisgICAgbUNiTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgbUNiTG9vcGVyLT5zZXROYW1lKCJjcy1sb29wZXIiKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtQ2JMb29wZXItPnN0YXJ0KC8qcnVuT25DYWxsaW5nVGhyZWFkKi8gZmFsc2UsIC8qY2FuQ2FsbEphdmEqLyBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBSSU9SSVRZX0RFRkFVTFQpOworICAgIGlmIChlcnIgIT1PSykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHN0YXJ0IGNhbWVyYSBkZXZpY2UgY2FsbGJhY2sgbG9vcGVyIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbUhhbmRsZXIgPSBuZXcgQ2FsbGJhY2tIYW5kbGVyKHRoaXMpOworICAgIG1DYkxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjp+SDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzKCkgeworICAgIGlmIChtQ2JMb29wZXIgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAobUhhbmRsZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUNiTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlci0+aWQoKSk7CisgICAgICAgIH0KKyAgICAgICAgbUNiTG9vcGVyLT5zdG9wKCk7CisgICAgfQorICAgIG1DYkxvb3Blci5jbGVhcigpOworICAgIG1IYW5kbGVyLmNsZWFyKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6b25EZXZpY2VFcnJvcigKKyAgICBpbnQzMl90IGVycm9yQ29kZSwgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CisgICAgdXNpbmcgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpjb252ZXJ0VG9IaWRsOworICAgIEhDYXB0dXJlUmVzdWx0RXh0cmFzIGhDYXB0dXJlUmVzdWx0RXh0cmFzID0gY29udmVydFRvSGlkbChyZXN1bHRFeHRyYXMpOworICAgIGF1dG8gcmV0ID0gbUJhc2UtPm9uRGV2aWNlRXJyb3IoY29udmVydFRvSGlkbChlcnJvckNvZGUpLCBoQ2FwdHVyZVJlc3VsdEV4dHJhcyk7CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlcyBPbkRldmljZUVycm9yIGNhbGxiYWNrIGZhaWxlZCBkdWUgdG8gJXMiLF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworYmluZGVyOjpTdGF0dXMgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpvbkRldmljZUlkbGUoKSB7CisgICAgYXV0byByZXQgPSBtQmFzZS0+b25EZXZpY2VJZGxlKCk7CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgQUxPR0UoIiVzIE9uRGV2aWNlSWRsZSBjYWxsYmFjayBmYWlsZWQgZHVlIHRvICVzIixfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworYmluZGVyOjpTdGF0dXMgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpvbkNhcHR1cmVTdGFydGVkKAorICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywgaW50NjRfdCB0aW1lc3RhbXApIHsKKyAgICB1c2luZyBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmNvbnZlcnRUb0hpZGw7CisgICAgSENhcHR1cmVSZXN1bHRFeHRyYXMgaENhcHR1cmVSZXN1bHRFeHRyYXMgPSBjb252ZXJ0VG9IaWRsKHJlc3VsdEV4dHJhcyk7CisgICAgYXV0byByZXQgPSBtQmFzZS0+b25DYXB0dXJlU3RhcnRlZChoQ2FwdHVyZVJlc3VsdEV4dHJhcywgdGltZXN0YW1wKTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzIE9uQ2FwdHVyZUNhbGxiYWNrIGZhaWxlZCBkdWUgdG8gJXMiLF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKwordm9pZCBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6OmNvbnZlcnRSZXN1bHRNZXRhZGF0YVRvSGlkbChjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcmF3TWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZtcVNpemVPck1ldGFkYXRhICpoUmVzdWx0TWV0YWRhdGEpIHsKKyAgICAvLyBGaXJzdCB0cnkgd3JpdGluZyB0byBmbXEuCisgICAgc2l6ZV90IG1ldGFkYXRhX3NpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUocmF3TWV0YWRhdGEpOworICAgIGlmICgobWV0YWRhdGFfc2l6ZSA+IDApICYmCisgICAgICAgIChtQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKSA+IDApKSB7CisgICAgICAgIGlmIChtQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUtPndyaXRlKCh1aW50OF90ICopcmF3TWV0YWRhdGEsIG1ldGFkYXRhX3NpemUpKSB7CisgICAgICAgICAgICBoUmVzdWx0TWV0YWRhdGEtPmZtcU1ldGFkYXRhU2l6ZShtZXRhZGF0YV9zaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcyBDb3VsZG4ndCB1c2UgZm1xLCBmYWxsaW5nIGJhY2sgdG8gaHdiaW5kZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgSENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhOworICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpjb252ZXJ0VG9IaWRsKHJhd01ldGFkYXRhLCAmbWV0YWRhdGEpOworICAgICAgICAgICAgaFJlc3VsdE1ldGFkYXRhLT5tZXRhZGF0YShzdGQ6Om1vdmUobWV0YWRhdGEpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkNhbGxiYWNrSGFuZGxlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzcDxSZWZCYXNlPiBvYmogPSBudWxscHRyOworICAgIHNwPFJlc3VsdFdyYXBwZXI+IHJlc3VsdFdyYXBwZXIgPSBudWxscHRyOworICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRSZXN1bHRSZWNlaXZlZDoKKyAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kT2JqZWN0KGtSZXN1bHRLZXksICZvYmopOworICAgICAgICAgICAgaWYgKCFmb3VuZCB8fCBvYmogPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgZmluZCByZXN1bHQgb2JqZWN0IGluIGNhbGxiYWNrIG1lc3NhZ2UiKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHRXcmFwcGVyID0gc3RhdGljX2Nhc3Q8UmVzdWx0V3JhcHBlciAqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgcHJvY2Vzc1Jlc3VsdE1lc3NhZ2UocmVzdWx0V3JhcHBlcik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJVbmtub3duIGNhbGxiYWNrIHNlbnQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYWxsYmFja0hhbmRsZXI6OnByb2Nlc3NSZXN1bHRNZXNzYWdlKAorICAgIHNwPFJlc3VsdFdyYXBwZXI+ICZyZXN1bHRXcmFwcGVyKSB7CisgICAgc3A8SDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBjb252ZXJ0ZXIgPSBtQ29udmVydGVyLnByb21vdGUoKTsKKyAgICBpZiAoY29udmVydGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkNhbGxiYWNrIHdyYXBwZXIgaGFzIGRpZWQsIHJlc3VsdCBjYWxsYmFjayBjYW5ub3QgYmUgbWFkZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIENhbWVyYU1ldGFkYXRhTmF0aXZlICZyZXN1bHQgPSByZXN1bHRXcmFwcGVyLT5tUmVzdWx0OworICAgIGF1dG8gcmVzdWx0RXh0cmFzID0gcmVzdWx0V3JhcHBlci0+bVJlc3VsdEV4dHJhczsKKyAgICBIQ2FwdHVyZVJlc3VsdEV4dHJhcyBoUmVzdWx0RXh0cmFzID0KKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6Y29udmVydFRvSGlkbChyZXN1bHRFeHRyYXMpOworCisgICAgLy8gQ29udmVydCBNZXRhZGF0YSBpbnRvIEhDYW1lcmFNZXRhZGF0YTsKKyAgICBGbXFTaXplT3JNZXRhZGF0YSBoUmVzdWx0OworICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpyYXdNZXRhZGF0YSA9IHJlc3VsdC5nZXRBbmRMb2NrKCk7CisgICAgY29udmVydGVyLT5jb252ZXJ0UmVzdWx0TWV0YWRhdGFUb0hpZGwocmF3TWV0YWRhdGEsICZoUmVzdWx0KTsKKyAgICByZXN1bHQudW5sb2NrKHJhd01ldGFkYXRhKTsKKyAgICBhdXRvICZwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcyA9IHJlc3VsdFdyYXBwZXItPm1QaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvczsKKyAgICBoaWRsX3ZlYzxIUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zID0KKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6Y29udmVydFRvSGlkbCgKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MsIGNvbnZlcnRlci0+bUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKTsKKyAgICBhdXRvIHJldCA9IGNvbnZlcnRlci0+bUJhc2UtPm9uUmVzdWx0UmVjZWl2ZWQoaFJlc3VsdCwgaFJlc3VsdEV4dHJhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zKTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICBBTE9HRSgiJXMgT25SZXN1bHRSZWNlaXZlZCBjYWxsYmFjayBmYWlsZWQgZHVlIHRvICVzIixfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorfQorCitiaW5kZXI6OlN0YXR1cyBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6Om9uUmVzdWx0UmVjZWl2ZWQoCisgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGFOYXRpdmUmIHJlc3VsdCwKKyAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCisgICAgY29uc3QgOjpzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MpIHsKKyAgICAvLyBXcmFwIENhbWVyYU1ldGFkYXRhLCByZXN1bHRFeHRyYXMgYW5kIHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zIGluIG9uCisgICAgLy8gc3A8UmVmQmFzZT4tYWJsZSBzdHJ1Y3R1cmUgYW5kIHBvc3QgaXQuCisgICAgc3A8UmVzdWx0V3JhcHBlcj4gcmVzdWx0V3JhcHBlciA9IG5ldyBSZXN1bHRXcmFwcGVyKGNvbnN0X2Nhc3Q8Q2FtZXJhTWV0YWRhdGFOYXRpdmUgJj4ocmVzdWx0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0RXh0cmFzLCBwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcyk7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlc3VsdFJlY2VpdmVkLCBtSGFuZGxlcik7CisgICAgbXNnLT5zZXRPYmplY3Qoa1Jlc3VsdEtleSwgcmVzdWx0V3JhcHBlcik7CisgICAgbXNnLT5wb3N0KCk7CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCitiaW5kZXI6OlN0YXR1cyBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6Om9uUHJlcGFyZWQoaW50MzJfdCBzdHJlYW1JZCkgeworICAgIC8vIG5vdCBpbXBsZW1lbnRlZAorICAgIC8vIFRvIHNpbGVuY2UgV3VudXNlZC1wYXJhbWV0ZXIuCisgICAgKHZvaWQpIHN0cmVhbUlkOworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworYmluZGVyOjpTdGF0dXMgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpvblJlcGVhdGluZ1JlcXVlc3RFcnJvcigKKyAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciwKKyAgICBpbnQzMl90IHJlcGVhdGluZ1JlcXVlc3RJZCkgeworICAgIGF1dG8gcmV0ID0KKyAgICAgICAgbUJhc2UtPm9uUmVwZWF0aW5nUmVxdWVzdEVycm9yKGxhc3RGcmFtZU51bWJlciwgcmVwZWF0aW5nUmVxdWVzdElkKTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzIE9uUmVwZWF0aW5nUmVxdWVzdEVyb3IgY2FsbGJhY2sgZmFpbGVkIGR1ZSB0byAlcyIsX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICB9CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCitiaW5kZXI6OlN0YXR1cyBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6Om9uUmVxdWVzdFF1ZXVlRW1wdHkoKSB7CisgICAgLy8gbm90IGltcGxlbWVudGVkCisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCit9IC8vIGltcGxlbWVudGF0aW9uCit9IC8vIFYyXzAKK30gLy8gZGV2aWNlCit9IC8vIGNhbWVyYXNlcnZpY2UKK30gLy8gZnJhbWV3b3JrcworfSAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiZjUyMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuaApAQCAtMCwwICsxLDEzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9GUkFNRVdPUktTX0FJRExfQ0FNRVJBREVWSUNFQ0FMTEJBQ0tTX0gKKyNkZWZpbmUgQU5EUk9JRF9GUkFNRVdPUktTX0FJRExfQ0FNRVJBREVWSUNFQ0FMTEJBQ0tTX0gKKworI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2NvbW1vbi8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvSUNhbWVyYURldmljZUNhbGxiYWNrLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9CbkNhbWVyYURldmljZUNhbGxiYWNrcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxDYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8aGlkbC9DYW1lcmFIeWJyaWRJbnRlcmZhY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZyYW1ld29ya3MgeworbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UgeworbmFtZXNwYWNlIGRldmljZSB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyBjYW1lcmFoeWJyaWQ6OkgyQkNvbnZlcnRlcjsKK3VzaW5nIEhDYW1lcmFEZXZpY2VDYWxsYmFjayA9IGNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6SUNhbWVyYURldmljZUNhbGxiYWNrOwordXNpbmcgSFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8gPSBjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm87Cit1c2luZyBhbmRyb2lkOjpmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkZtcVNpemVPck1ldGFkYXRhOworCit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6Qm5DYW1lcmFEZXZpY2VDYWxsYmFja3M7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjppbXBsOjpDYXB0dXJlUmVzdWx0RXh0cmFzOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OmltcGw6OkNhbWVyYU1ldGFkYXRhTmF0aXZlOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OmltcGw6OlBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm87Cit1c2luZyBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZTsKK3VzaW5nIGhhcmR3YXJlOjpNZXNzYWdlUXVldWU7Cit1c2luZyBDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBrU3luY2hyb25pemVkUmVhZFdyaXRlPjsKKworc3RydWN0IEgyQkNhbWVyYURldmljZUNhbGxiYWNrcyA6CisgICAgcHVibGljIEgyQkNvbnZlcnRlcjxIQ2FtZXJhRGV2aWNlQ2FsbGJhY2ssIElDYW1lcmFEZXZpY2VDYWxsYmFja3MsIEJuQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiB7CisgICAgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzKGNvbnN0IHNwPEhhbEludGVyZmFjZT4mIGJhc2UpOworCisgICAgfkgyQkNhbWVyYURldmljZUNhbGxiYWNrcygpOworCisgICAgYm9vbCBpbml0aWFsaXplTG9vcGVyKCk7CisKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uRGV2aWNlRXJyb3IoaW50MzJfdCBlcnJvckNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uRGV2aWNlSWRsZSgpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvbkNhcHR1cmVTdGFydGVkKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXApIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvblJlc3VsdFJlY2VpdmVkKAorICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YU5hdGl2ZSYgcmVzdWx0LCBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+JiBwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcykgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uUHJlcGFyZWQoaW50MzJfdCBzdHJlYW1JZCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIG9uUmVwZWF0aW5nUmVxdWVzdEVycm9yKGludDY0X3QgbGFzdEZyYW1lTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByZXBlYXRpbmdSZXF1ZXN0SWQpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvblJlcXVlc3RRdWV1ZUVtcHR5KCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHNldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKHN0ZDo6c2hhcmVkX3B0cjxDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZT4gbWV0YWRhdGFRdWV1ZSkgeworICAgICAgICBtQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUgPSBtZXRhZGF0YVF1ZXVlOworICAgIH0KKworIHByaXZhdGU6CisgICAgLy8gV3JhcHBlciBzdHJ1Y3Qgc28gdGhhdCBwYXJhbWV0ZXJzIHRvIG9uUmVzdWx0UmVjZWl2ZWQgY2FsbGJhY2sgbWF5IGJlCisgICAgLy8gc2VudCB0aHJvdWdoIGFuIEFNZXNzYWdlLgorICAgIHN0cnVjdCBSZXN1bHRXcmFwcGVyIDogcHVibGljIFJlZkJhc2UgeworICAgICAgICBDYW1lcmFNZXRhZGF0YU5hdGl2ZSBtUmVzdWx0OworICAgICAgICBDYXB0dXJlUmVzdWx0RXh0cmFzIG1SZXN1bHRFeHRyYXM7CisgICAgICAgIHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+IG1QaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvczsKKyAgICAgICAgUmVzdWx0V3JhcHBlcihDYW1lcmFNZXRhZGF0YU5hdGl2ZSAmcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+ICZwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcykgOgorICAgICAgLy8gVE9ETzogbWFrZSB0aGlzIHN0ZDo6bW92YWJsZQorICAgICAgbVJlc3VsdChyZXN1bHQpLCBtUmVzdWx0RXh0cmFzKHJlc3VsdEV4dHJhcyksIG1QaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcyhwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcykgeyB9CisgICAgfTsKKworICAgIHN0cnVjdCBDYWxsYmFja0hhbmRsZXIgOiBwdWJsaWMgQUhhbmRsZXIgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKKyAgICAgICAgICAgIENhbGxiYWNrSGFuZGxlcihIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3MgKmNvbnZlcnRlcikgOiBtQ29udmVydGVyKGNvbnZlcnRlcikgeyB9CisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICB2b2lkIHByb2Nlc3NSZXN1bHRNZXNzYWdlKHNwPFJlc3VsdFdyYXBwZXI+ICZyZXN1bHRXcmFwcGVyKTsKKyAgICAgICAgICAgIHdwPEgyQkNhbWVyYURldmljZUNhbGxiYWNrcz4gbUNvbnZlcnRlciA9IG51bGxwdHI7CisgICAgICAgICAgICBNdXRleCBtTWV0YWRhdGFRdWV1ZUxvY2s7CisgICAgfTsKKworICAgIHZvaWQgY29udmVydFJlc3VsdE1ldGFkYXRhVG9IaWRsKGNvbnN0IGNhbWVyYV9tZXRhZGF0YSAqcmF3TWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm1xU2l6ZU9yTWV0YWRhdGEgKnJlc3VsdE1ldGFkYXRhKTsKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRSZXN1bHRSZWNlaXZlZCwKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmtSZXN1bHRLZXk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWU+IG1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IG51bGxwdHI7CisgICAgc3A8Q2FsbGJhY2tIYW5kbGVyPiBtSGFuZGxlciA9IG51bGxwdHI7CisgICAgc3A8QUxvb3Blcj4gbUNiTG9vcGVyID0gbnVsbHB0cjsKK307CisKK30gLy8gaW1wbGVtZW50YXRpb24KK30gLy8gVjJfMAorfSAvLyBkZXZpY2UKK30gLy8gY2FtZXJhc2VydmljZQorfSAvLyBmcmFtZXdvcmtzCit9IC8vIGFuZHJvaWQKKyNlbmRpZiAvLyBBTkRST0lEX0ZSQU1FV09SS1NfQUlETF9DQU1FUkFERVZJQ0VDQUxMQkFDS1NfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTEwZWY4ZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5jcHAKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxoaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxoaWRsL0NvbnZlcnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZyYW1ld29ya3MgeworbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UgeworbmFtZXNwYWNlIHNlcnZpY2UgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpjb252ZXJ0VG9IaWRsQ2FtZXJhRGV2aWNlU3RhdHVzOworCitiaW5kZXI6OlN0YXR1cyBIMkJDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6Om9uU3RhdHVzQ2hhbmdlZCgKKyAgICBpbnQzMl90IHN0YXR1cywgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgY2FtZXJhSWQpIHsKKyAgSENhbWVyYURldmljZVN0YXR1cyBoQ2FtZXJhRGV2aWNlU3RhdHVzID0gY29udmVydFRvSGlkbENhbWVyYURldmljZVN0YXR1cyhzdGF0dXMpOworICBDYW1lcmFTdGF0dXNBbmRJZCBjYW1lcmFTdGF0dXNBbmRJZDsKKyAgY2FtZXJhU3RhdHVzQW5kSWQuZGV2aWNlU3RhdHVzID0gaENhbWVyYURldmljZVN0YXR1czsKKyAgY2FtZXJhU3RhdHVzQW5kSWQuY2FtZXJhSWQgPSBTdHJpbmc4KGNhbWVyYUlkKS5zdHJpbmcoKTsKKyAgYXV0byByZXQgPSBtQmFzZS0+b25TdGF0dXNDaGFuZ2VkKGNhbWVyYVN0YXR1c0FuZElkKTsKKyAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICBBTE9HRSgiJXMgT25TdGF0dXNDaGFuZ2VkIGNhbGxiYWNrIGZhaWxlZCBkdWUgdG8gJXMiLF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICB9CisgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBIMkJDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6Om9uVG9yY2hTdGF0dXNDaGFuZ2VkKAorICAgIGludDMyX3QsIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmKSB7CisgIC8vIFdlIGRvbid0IGltcGxlbWVudCBvblRvcmNoU3RhdHVzQ2hhbmdlZAorICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK30gLy8gaW1wbGVtZW50YXRpb24KK30gLy8gVjJfMAorfSAvLyBjb21tb24KK30gLy8gY2FtZXJhc2VydmljZQorfSAvLyBmcmFtZXdvcmtzCit9IC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY2YmU3OQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvY29tbW9uLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9CbkNhbWVyYVNlcnZpY2VMaXN0ZW5lci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvQnBDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaD4KKworI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8aGlkbC9DYW1lcmFIeWJyaWRJbnRlcmZhY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZyYW1ld29ya3MgeworbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UgeworbmFtZXNwYWNlIHNlcnZpY2UgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgaGFyZHdhcmU6OkJuQ2FtZXJhU2VydmljZUxpc3RlbmVyOwordXNpbmcgaGFyZHdhcmU6OkJwQ2FtZXJhU2VydmljZUxpc3RlbmVyOwordXNpbmcgY2FtZXJhaHlicmlkOjpIMkJDb252ZXJ0ZXI7Cit1c2luZyBIQ2FtZXJhRGV2aWNlU3RhdHVzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzOwordHlwZWRlZiBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyIEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI7CisKK3N0cnVjdCBIMkJDYW1lcmFTZXJ2aWNlTGlzdGVuZXIgOgorICAgIHB1YmxpYyBIMkJDb252ZXJ0ZXI8SENhbWVyYVNlcnZpY2VMaXN0ZW5lciwgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lciwgQm5DYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IHsKKyAgICBIMkJDYW1lcmFTZXJ2aWNlTGlzdGVuZXIoY29uc3Qgc3A8SGFsSW50ZXJmYWNlPiYgYmFzZSkgOiBDQmFzZShiYXNlKSB7IH0KKworICAgIH5IMkJDYW1lcmFTZXJ2aWNlTGlzdGVuZXIoKSB7IH0KKworICAgIHZpcnR1YWwgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBvblN0YXR1c0NoYW5nZWQoaW50MzJfdCBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBjYW1lcmFJZCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgb25Ub3JjaFN0YXR1c0NoYW5nZWQoCisgICAgICAgIGludDMyX3Qgc3RhdHVzLCBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JiBjYW1lcmFJZCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvbkNhbWVyYUFjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkKCkgeworICAgICAgICAvLyBUT0RPOiBubyBpbXBsZW1lbnRhdGlvbiB5ZXQuCisgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKKyAgICB9Cit9OworCit9IC8vIGltcGxlbWVudGF0aW9uCit9IC8vIFYyXzAKK30gLy8gc2VydmljZQorfSAvLyBjYW1lcmFzZXJ2aWNlCit9IC8vIGZyYW1ld29ya3MKK30gLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9DYW1lcmFIeWJyaWRJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ2FtZXJhSHlicmlkSW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFmMDExMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ2FtZXJhSHlicmlkSW50ZXJmYWNlLmgKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQ0FNRVJBX0hZQlJJRElOVEVSRkFDRV9ICisjZGVmaW5lIEFORFJPSURfQ0FNRVJBX0hZQlJJRElOVEVSRkFDRV9ICisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bXV0ZXg+CisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhaHlicmlkIHsKK3R5cGVkZWYgOjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZSBISW50ZXJmYWNlOworCit0ZW1wbGF0ZSA8CisgICAgICAgIHR5cGVuYW1lIEhJTlRFUkZBQ0UsCisgICAgICAgIHR5cGVuYW1lIElOVEVSRkFDRSwKKyAgICAgICAgdHlwZW5hbWUgQk5JTlRFUkZBQ0UgPgorY2xhc3MgSDJCQ29udmVydGVyIDogcHVibGljIEJOSU5URVJGQUNFIHsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIEgyQkNvbnZlcnRlcjxISU5URVJGQUNFLCBJTlRFUkZBQ0UsIEJOSU5URVJGQUNFPiBDQmFzZTsgLy8gQ29udmVydGVyIEJhc2UKKyAgICB0eXBlZGVmIElOVEVSRkFDRSBCYXNlSW50ZXJmYWNlOworICAgIHR5cGVkZWYgSElOVEVSRkFDRSBIYWxJbnRlcmZhY2U7CisKKyAgICBIMkJDb252ZXJ0ZXIoY29uc3Qgc3A8SGFsSW50ZXJmYWNlPiYgYmFzZSkgOiBtQmFzZShiYXNlKSB7fQorICAgIHZpcnR1YWwgc3A8SGFsSW50ZXJmYWNlPiBnZXRIYWxJbnRlcmZhY2UoKSB7IHJldHVybiBtQmFzZTsgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlua1RvRGVhdGgoCisgICAgICAgICAgICBjb25zdCBzcDxJQmluZGVyOjpEZWF0aFJlY2lwaWVudD4mIHJlY2lwaWVudCwKKyAgICAgICAgICAgIHZvaWQqIGNvb2tpZSA9IG51bGxwdHIsCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOworICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5saW5rVG9EZWF0aCgKKyAgICAgICAgICAgIGNvbnN0IHdwPElCaW5kZXI6OkRlYXRoUmVjaXBpZW50PiYgcmVjaXBpZW50LAorICAgICAgICAgICAgdm9pZCogY29va2llID0gbnVsbHB0ciwKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCwKKyAgICAgICAgICAgIHdwPElCaW5kZXI6OkRlYXRoUmVjaXBpZW50Piogb3V0UmVjaXBpZW50ID0gbnVsbHB0cik7CisKK3Byb3RlY3RlZDoKKyAgICBzcDxIYWxJbnRlcmZhY2U+IG1CYXNlOworICAgIHN0cnVjdCBPYml0dWFyeSA6IHB1YmxpYyBoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQgeworICAgICAgICB3cDxJQmluZGVyOjpEZWF0aFJlY2lwaWVudD4gcmVjaXBpZW50OworICAgICAgICB2b2lkKiBjb29raWU7CisgICAgICAgIHVpbnQzMl90IGZsYWdzOworICAgICAgICB3cDxJQmluZGVyPiB3aG87CisgICAgICAgIE9iaXR1YXJ5KAorICAgICAgICAgICAgICAgIGNvbnN0IHdwPElCaW5kZXI6OkRlYXRoUmVjaXBpZW50PiYgciwKKyAgICAgICAgICAgICAgICB2b2lkKiBjLCB1aW50MzJfdCBmLAorICAgICAgICAgICAgICAgIGNvbnN0IHdwPElCaW5kZXI+JiB3KSA6CisgICAgICAgICAgICByZWNpcGllbnQociksIGNvb2tpZShjKSwgZmxhZ3MoZiksIHdobyh3KSB7CisgICAgICAgIH0KKyAgICAgICAgT2JpdHVhcnkoY29uc3QgT2JpdHVhcnkmIG8pIDoKKyAgICAgICAgICAgIHJlY2lwaWVudChvLnJlY2lwaWVudCksCisgICAgICAgICAgICBjb29raWUoby5jb29raWUpLAorICAgICAgICAgICAgZmxhZ3Moby5mbGFncyksCisgICAgICAgICAgICB3aG8oby53aG8pIHsKKyAgICAgICAgfQorICAgICAgICBPYml0dWFyeSYgb3BlcmF0b3I9KGNvbnN0IE9iaXR1YXJ5JiBvKSB7CisgICAgICAgICAgICByZWNpcGllbnQgPSBvLnJlY2lwaWVudDsKKyAgICAgICAgICAgIGNvb2tpZSA9IG8uY29va2llOworICAgICAgICAgICAgZmxhZ3MgPSBvLmZsYWdzOworICAgICAgICAgICAgd2hvID0gby53aG87CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBzZXJ2aWNlRGllZCh1aW50NjRfdCwgY29uc3Qgd3A8SEludGVyZmFjZT4mKSBvdmVycmlkZSB7CisgICAgICAgICAgICBzcDxJQmluZGVyOjpEZWF0aFJlY2lwaWVudD4gZHIgPSByZWNpcGllbnQucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKGRyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBkci0+YmluZGVyRGllZCh3aG8pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKyAgICBzdGQ6Om11dGV4IG1PYml0dWFyaWVzTG9jazsKKyAgICBzdGQ6OnZlY3RvcjxzcDxPYml0dWFyeT4gPiBtT2JpdHVhcmllczsKK307CisKK3RlbXBsYXRlIDwKKyAgICAgICAgdHlwZW5hbWUgSElOVEVSRkFDRSwKKyAgICAgICAgdHlwZW5hbWUgSU5URVJGQUNFLAorICAgICAgICB0eXBlbmFtZSBCTklOVEVSRkFDRT4KK3N0YXR1c190IEgyQkNvbnZlcnRlcjxISU5URVJGQUNFLCBJTlRFUkZBQ0UsIEJOSU5URVJGQUNFPjo6CisgICAgICAgIGxpbmtUb0RlYXRoKAorICAgICAgICBjb25zdCBzcDxJQmluZGVyOjpEZWF0aFJlY2lwaWVudD4mIHJlY2lwaWVudCwKKyAgICAgICAgdm9pZCogY29va2llLCB1aW50MzJfdCBmbGFncykgeworICAgIExPR19BTFdBWVNfRkFUQUxfSUYocmVjaXBpZW50ID09IG51bGxwdHIsCisgICAgICAgICAgICAibGlua1RvRGVhdGgoKTogcmVjaXBpZW50IG11c3QgYmUgbm9uLW51bGxwdHIiKTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1PYml0dWFyaWVzTG9jayk7CisgICAgICAgIG1PYml0dWFyaWVzLnB1c2hfYmFjayhuZXcgT2JpdHVhcnkocmVjaXBpZW50LCBjb29raWUsIGZsYWdzLCB0aGlzKSk7CisgICAgICAgIGlmICghbUJhc2UtPmxpbmtUb0RlYXRoKG1PYml0dWFyaWVzLmJhY2soKSwgMCkpIHsKKyAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordGVtcGxhdGUgPAorICAgICAgICB0eXBlbmFtZSBISU5URVJGQUNFLAorICAgICAgICB0eXBlbmFtZSBJTlRFUkZBQ0UsCisgICAgICAgIHR5cGVuYW1lIEJOSU5URVJGQUNFPgorc3RhdHVzX3QgSDJCQ29udmVydGVyPEhJTlRFUkZBQ0UsIElOVEVSRkFDRSwgQk5JTlRFUkZBQ0U+OjoKKyAgICAgICAgdW5saW5rVG9EZWF0aCgKKyAgICAgICAgY29uc3Qgd3A8SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQ+JiByZWNpcGllbnQsCisgICAgICAgIHZvaWQqIGNvb2tpZSwgdWludDMyX3QgZmxhZ3MsCisgICAgICAgIHdwPElCaW5kZXI6OkRlYXRoUmVjaXBpZW50Piogb3V0UmVjaXBpZW50KSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU9iaXR1YXJpZXNMb2NrKTsKKyAgICBmb3IgKGF1dG8gaSA9IG1PYml0dWFyaWVzLmJlZ2luKCk7IGkgIT0gbU9iaXR1YXJpZXMuZW5kKCk7ICsraSkgeworICAgICAgICBpZiAoKGZsYWdzID0gKCppKS0+ZmxhZ3MpICYmICgKKyAgICAgICAgICAgICAgICAocmVjaXBpZW50ID09ICgqaSktPnJlY2lwaWVudCkgfHwKKyAgICAgICAgICAgICAgICAoKHJlY2lwaWVudCA9PSBudWxscHRyKSAmJiAoY29va2llID09ICgqaSktPmNvb2tpZSkpKSkgeworICAgICAgICAgICAgaWYgKG91dFJlY2lwaWVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgKm91dFJlY2lwaWVudCA9ICgqaSktPnJlY2lwaWVudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2wgc3VjY2VzcyA9IG1CYXNlLT51bmxpbmtUb0RlYXRoKCppKTsKKyAgICAgICAgICAgIG1PYml0dWFyaWVzLmVyYXNlKGkpOworICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3MgPyBOT19FUlJPUiA6IERFQURfT0JKRUNUOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKK30KKworfSAvLyBuYW1lc3BhY2UgY2FtZXJhaHlicmlkCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0NBTUVSQV9IWUJSSURJTlRFUkZBQ0VfSAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NvbnZlcnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9Db252ZXJ0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjZjM2I1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9Db252ZXJ0LmNwcApAQCAtMCwwICsxLDI4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxoaWRsL0NvbnZlcnQuaD4KKyNpbmNsdWRlIDxndWkvYnVmZmVycXVldWUvMS4wL0gyQkdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UgeworbmFtZXNwYWNlIHV0aWxzIHsKK25hbWVzcGFjZSBjb252ZXJzaW9uIHsKKwordXNpbmcgaGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6dXRpbHM6OkgyQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3VzaW5nIGFpbWc6OkFJbWFnZVJlYWRlcl9nZXRIR0JQRnJvbUhhbmRsZTsKKworLy8gTm90ZTogZXhpc3RpbmcgZGF0YSBpbiBkc3Qgd2lsbCBiZSBnb25lLiBDYWxsZXIgc3RpbGwgb3ducyB0aGUgbWVtb3J5IG9mIHNyYwordm9pZCBjb252ZXJ0VG9IaWRsKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzcmMsIEhDYW1lcmFNZXRhZGF0YSogZHN0KSB7CisgICAgaWYgKHNyYyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlczphdHRlbXB0IHRvIGNvbnZlcnQgZW1wdHkgbWV0YWRhdGEgdG8gSGlkbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2l6ZV90IHNpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUoc3JjKTsKKyAgICBkc3QtPnNldFRvRXh0ZXJuYWwoKHVpbnQ4X3QgKikgc3JjLCBzaXplKTsKKyAgICByZXR1cm47Cit9CisKK2ludDMyX3QgY29udmVydEZyb21IaWRsKEhTdHJlYW1Db25maWd1cmF0aW9uTW9kZSBzdHJlYW1Db25maWd1cmF0aW9uTW9kZSkgeworICAgIHN3aXRjaCAoc3RyZWFtQ29uZmlndXJhdGlvbk1vZGUpIHsKKyAgICAgICAgY2FzZSBIU3RyZWFtQ29uZmlndXJhdGlvbk1vZGU6OkNPTlNUUkFJTkVEX0hJR0hfU1BFRURfTU9ERToKKyAgICAgICAgICAgIHJldHVybiBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6Q09OU1RSQUlORURfSElHSF9TUEVFRF9NT0RFOworICAgICAgICBjYXNlIEhTdHJlYW1Db25maWd1cmF0aW9uTW9kZTo6Tk9STUFMX01PREU6CisgICAgICAgICAgICByZXR1cm4gY2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6Ok5PUk1BTF9NT0RFOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gVE9ETzogRml4IHRoaXMKKyAgICAgICAgICAgIHJldHVybiBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6VkVORE9SX01PREVfU1RBUlQ7CisgICAgfQorfQorCitpbnQzMl90IGNvbnZlcnRGcm9tSGlkbChIVGVtcGxhdGVJZCB0ZW1wbGF0ZUlkKSB7CisgICAgc3dpdGNoKHRlbXBsYXRlSWQpIHsKKyAgICAgICAgY2FzZSBIVGVtcGxhdGVJZDo6UFJFVklFVzoKKyAgICAgICAgICAgIHJldHVybiBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6VEVNUExBVEVfUFJFVklFVzsKKyAgICAgICAgY2FzZSBIVGVtcGxhdGVJZDo6U1RJTExfQ0FQVFVSRToKKyAgICAgICAgICAgIHJldHVybiBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6VEVNUExBVEVfU1RJTExfQ0FQVFVSRTsKKyAgICAgICAgY2FzZSBIVGVtcGxhdGVJZDo6UkVDT1JEOgorICAgICAgICAgICAgcmV0dXJuIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpURU1QTEFURV9SRUNPUkQ7CisgICAgICAgIGNhc2UgSFRlbXBsYXRlSWQ6OlZJREVPX1NOQVBTSE9UOgorICAgICAgICAgICAgcmV0dXJuIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpURU1QTEFURV9WSURFT19TTkFQU0hPVDsKKyAgICAgICAgY2FzZSBIVGVtcGxhdGVJZDo6WkVST19TSFVUVEVSX0xBRzoKKyAgICAgICAgICAgIHJldHVybiBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6VEVNUExBVEVfWkVST19TSFVUVEVSX0xBRzsKKyAgICAgICAgY2FzZSBIVGVtcGxhdGVJZDo6TUFOVUFMOgorICAgICAgICAgICAgcmV0dXJuIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpURU1QTEFURV9NQU5VQUw7CisgICAgfQorfQorCitpbnQgY29udmVydEZyb21IaWRsKEhPdXRwdXRDb25maWd1cmF0aW9uOjpSb3RhdGlvbiByb3RhdGlvbikgeworICAgIHN3aXRjaChyb3RhdGlvbikgeworICAgICAgICBjYXNlIEhPdXRwdXRDb25maWd1cmF0aW9uOjpSb3RhdGlvbjo6UjA6CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgY2FzZSBIT3V0cHV0Q29uZmlndXJhdGlvbjo6Um90YXRpb246OlI5MDoKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICBjYXNlIEhPdXRwdXRDb25maWd1cmF0aW9uOjpSb3RhdGlvbjo6UjE4MDoKKyAgICAgICAgICAgIHJldHVybiAyOworICAgICAgICBjYXNlIEhPdXRwdXRDb25maWd1cmF0aW9uOjpSb3RhdGlvbjo6UjI3MDoKKyAgICAgICAgICAgIHJldHVybiAzOworICAgIH0KK30KKworaGFyZHdhcmU6OmNhbWVyYTI6OnBhcmFtczo6T3V0cHV0Q29uZmlndXJhdGlvbiBjb252ZXJ0RnJvbUhpZGwoCisgICAgY29uc3QgSE91dHB1dENvbmZpZ3VyYXRpb24gJmhPdXRwdXRDb25maWd1cmF0aW9uKSB7CisgICAgc3RkOjp2ZWN0b3I8c3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4+IGlHQlBzOworICAgIGF1dG8gJndpbmRvd0hhbmRsZXMgPSBoT3V0cHV0Q29uZmlndXJhdGlvbi53aW5kb3dIYW5kbGVzOworICAgIGlHQlBzLnJlc2VydmUod2luZG93SGFuZGxlcy5zaXplKCkpOworICAgIGZvciAoYXV0byAmaGFuZGxlIDogd2luZG93SGFuZGxlcykgeworICAgICAgICBpR0JQcy5wdXNoX2JhY2sobmV3IEgyQkdyYXBoaWNCdWZmZXJQcm9kdWNlcihBSW1hZ2VSZWFkZXJfZ2V0SEdCUEZyb21IYW5kbGUoaGFuZGxlKSkpOworICAgIH0KKyAgICBTdHJpbmcxNiBwaHlzaWNhbENhbWVyYUlkMTYoaE91dHB1dENvbmZpZ3VyYXRpb24ucGh5c2ljYWxDYW1lcmFJZC5jX3N0cigpKTsKKyAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6cGFyYW1zOjpPdXRwdXRDb25maWd1cmF0aW9uIG91dHB1dENvbmZpZ3VyYXRpb24oCisgICAgICAgIGlHQlBzLCBjb252ZXJ0RnJvbUhpZGwoaE91dHB1dENvbmZpZ3VyYXRpb24ucm90YXRpb24pLCBwaHlzaWNhbENhbWVyYUlkMTYsCisgICAgICAgIGhPdXRwdXRDb25maWd1cmF0aW9uLndpbmRvd0dyb3VwSWQsIE91dHB1dENvbmZpZ3VyYXRpb246OlNVUkZBQ0VfVFlQRV9VTktOT1dOLCAwLCAwLAorICAgICAgICAod2luZG93SGFuZGxlcy5zaXplKCkgPiAxKSk7CisgICAgcmV0dXJuIG91dHB1dENvbmZpZ3VyYXRpb247Cit9CisKK2hhcmR3YXJlOjpjYW1lcmEyOjpwYXJhbXM6OlNlc3Npb25Db25maWd1cmF0aW9uIGNvbnZlcnRGcm9tSGlkbCgKKyAgICBjb25zdCBIU2Vzc2lvbkNvbmZpZ3VyYXRpb24gJmhTZXNzaW9uQ29uZmlndXJhdGlvbikgeworICAgIGhhcmR3YXJlOjpjYW1lcmEyOjpwYXJhbXM6OlNlc3Npb25Db25maWd1cmF0aW9uIHNlc3Npb25Db25maWcoCisgICAgICAgICAgICBoU2Vzc2lvbkNvbmZpZ3VyYXRpb24uaW5wdXRXaWR0aCwgaFNlc3Npb25Db25maWd1cmF0aW9uLmlucHV0SGVpZ2h0LAorICAgICAgICAgICAgaFNlc3Npb25Db25maWd1cmF0aW9uLmlucHV0Rm9ybWF0LAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihoU2Vzc2lvbkNvbmZpZ3VyYXRpb24ub3BlcmF0aW9uTW9kZSkpOworCisgICAgZm9yIChjb25zdCBhdXRvJiBoQ29uZmlnIDogaFNlc3Npb25Db25maWd1cmF0aW9uLm91dHB1dFN0cmVhbXMpIHsKKyAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTI6OnBhcmFtczo6T3V0cHV0Q29uZmlndXJhdGlvbiBjb25maWcgPSBjb252ZXJ0RnJvbUhpZGwoaENvbmZpZyk7CisgICAgICAgIHNlc3Npb25Db25maWcuYWRkT3V0cHV0Q29uZmlndXJhdGlvbihjb25maWcpOworICAgIH0KKworICAgIHJldHVybiBzZXNzaW9uQ29uZmlnOworfQorCisvLyBUaGUgY2FtZXJhIG1ldGFkYXRhIGhlcmUgaXMgY2xvbmVkLiBTaW5jZSB3ZSdyZSByZWFkaW5nIG1ldGFkYXRhIG92ZXIKKy8vIGh3YmluZGVyIHdlIHdvdWxkIG5lZWQgdG8gY2xvbmUgaXQgaW4gb3JkZXIgdG8gYXZvaWQgYWxpZ21lbnQgaXNzdWVzLgorYm9vbCBjb252ZXJ0RnJvbUhpZGwoY29uc3QgSENhbWVyYU1ldGFkYXRhICZzcmMsIENhbWVyYU1ldGFkYXRhICpkc3QpIHsKKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCo+KHNyYy5kYXRhKCkpOworICAgIHNpemVfdCBleHBlY3RlZFNpemUgPSBzcmMuc2l6ZSgpOworICAgIGlmIChidWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICBpbnQgcmVzID0gdmFsaWRhdGVfY2FtZXJhX21ldGFkYXRhX3N0cnVjdHVyZShidWZmZXIsICZleHBlY3RlZFNpemUpOworICAgICAgICBpZiAocmVzID09IE9LIHx8IHJlcyA9PSBDQU1FUkFfTUVUQURBVEFfVkFMSURBVElPTl9TSElGVEVEKSB7CisgICAgICAgICAgICAqZHN0ID0gYnVmZmVyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBNYWxmb3JtZWQgY2FtZXJhIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gSEFMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworSENhbWVyYURldmljZVN0YXR1cyBjb252ZXJ0VG9IaWRsQ2FtZXJhRGV2aWNlU3RhdHVzKGludDMyX3Qgc3RhdHVzKSB7CisgICAgSENhbWVyYURldmljZVN0YXR1cyBkZXZpY2VTdGF0dXMgPSBIQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfVU5LTk9XTjsKKyAgICBzd2l0Y2goc3RhdHVzKSB7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19OT1RfUFJFU0VOVDoKKyAgICAgICAgICAgIGRldmljZVN0YXR1cyA9IEhDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19OT1RfUFJFU0VOVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfUFJFU0VOVDoKKyAgICAgICAgICAgIGRldmljZVN0YXR1cyA9IEhDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19QUkVTRU5UOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19FTlVNRVJBVElORzoKKyAgICAgICAgICAgIGRldmljZVN0YXR1cyA9IEhDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19FTlVNRVJBVElORzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfTk9UX0FWQUlMQUJMRToKKyAgICAgICAgICAgIGRldmljZVN0YXR1cyA9IEhDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19OT1RfQVZBSUxBQkxFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGRldmljZVN0YXR1czsKK30KKworSENhcHR1cmVSZXN1bHRFeHRyYXMgY29udmVydFRvSGlkbChjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzICZjYXB0dXJlUmVzdWx0RXh0cmFzKSB7CisgICAgSENhcHR1cmVSZXN1bHRFeHRyYXMgaENhcHR1cmVSZXN1bHRFeHRyYXM7CisgICAgaENhcHR1cmVSZXN1bHRFeHRyYXMucmVxdWVzdElkID0gY2FwdHVyZVJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQ7CisgICAgaENhcHR1cmVSZXN1bHRFeHRyYXMuYnVyc3RJZCA9IGNhcHR1cmVSZXN1bHRFeHRyYXMuYnVyc3RJZDsKKyAgICBoQ2FwdHVyZVJlc3VsdEV4dHJhcy5mcmFtZU51bWJlciA9IGNhcHR1cmVSZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXI7CisgICAgaENhcHR1cmVSZXN1bHRFeHRyYXMucGFydGlhbFJlc3VsdENvdW50ID0gY2FwdHVyZVJlc3VsdEV4dHJhcy5wYXJ0aWFsUmVzdWx0Q291bnQ7CisgICAgaENhcHR1cmVSZXN1bHRFeHRyYXMuZXJyb3JTdHJlYW1JZCA9IGNhcHR1cmVSZXN1bHRFeHRyYXMuZXJyb3JTdHJlYW1JZDsKKyAgICBoQ2FwdHVyZVJlc3VsdEV4dHJhcy5lcnJvclBoeXNpY2FsQ2FtZXJhSWQgPSBoaWRsX3N0cmluZyhTdHJpbmc4KAorICAgICAgICAgICAgY2FwdHVyZVJlc3VsdEV4dHJhcy5lcnJvclBoeXNpY2FsQ2FtZXJhSWQpLnN0cmluZygpKTsKKyAgICByZXR1cm4gaENhcHR1cmVSZXN1bHRFeHRyYXM7Cit9CisKK0hFcnJvckNvZGUgY29udmVydFRvSGlkbChpbnQzMl90IGVycm9yQ29kZSkgeworICAgIHN3aXRjaChlcnJvckNvZGUpIHsKKyAgICAgICAgY2FzZSBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEOgorICAgICAgICAgICAgcmV0dXJuIEhFcnJvckNvZGU6OkNBTUVSQV9ESVNDT05ORUNURUQ7CisgICAgICAgIGNhc2UgY2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0RFVklDRSA6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yQ29kZTo6Q0FNRVJBX0RFVklDRTsKKyAgICAgICAgY2FzZSBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfU0VSVklDRToKKyAgICAgICAgICAgIHJldHVybiBIRXJyb3JDb2RlOjpDQU1FUkFfU0VSVklDRTsKKyAgICAgICAgY2FzZSBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVRVUVTVDoKKyAgICAgICAgICAgIHJldHVybiBIRXJyb3JDb2RlOjpDQU1FUkFfUkVRVUVTVDsKKyAgICAgICAgY2FzZSBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVTVUxUOgorICAgICAgICAgICAgcmV0dXJuIEhFcnJvckNvZGU6OkNBTUVSQV9SRVNVTFQ7CisgICAgICAgIGNhc2UgY2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0JVRkZFUjoKKyAgICAgICAgICAgIHJldHVybiBIRXJyb3JDb2RlOjpDQU1FUkFfQlVGRkVSOworICAgICAgICBjYXNlIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ESVNBQkxFRDoKKyAgICAgICAgICAgIHJldHVybiBIRXJyb3JDb2RlOjpDQU1FUkFfRElTQUJMRUQ7CisgICAgICAgIGNhc2UgY2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0lOVkFMSURfRVJST1I6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yQ29kZTo6Q0FNRVJBX0lOVkFMSURfRVJST1I7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yQ29kZTo6Q0FNRVJBX1VOS05PV05fRVJST1I7CisgICAgfQorfQorCit2b2lkIGNvbnZlcnRUb0hpZGwoY29uc3Qgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0YXR1cz4gJnNyYywKKyAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxIQ2FtZXJhU3RhdHVzQW5kSWQ+KiBkc3QpIHsKKyAgICBkc3QtPnJlc2l6ZShzcmMuc2l6ZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChhdXRvICZzdGF0dXNBbmRJZCA6IHNyYykgeworICAgICAgICBhdXRvICZhID0gKCpkc3QpW2krK107CisgICAgICAgIGEuY2FtZXJhSWQgPSBzdGF0dXNBbmRJZC5jYW1lcmFJZC5jX3N0cigpOworICAgICAgICBhLmRldmljZVN0YXR1cyA9IGNvbnZlcnRUb0hpZGxDYW1lcmFEZXZpY2VTdGF0dXMoc3RhdHVzQW5kSWQuc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIGNvbnZlcnRUb0hpZGwoCisgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTI6OnV0aWxzOjpTdWJtaXRJbmZvICZzdWJtaXRJbmZvLAorICAgIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6U3VibWl0SW5mbyAqaFN1Ym1pdEluZm8pIHsKKyAgICBoU3VibWl0SW5mby0+cmVxdWVzdElkID0gc3VibWl0SW5mby5tUmVxdWVzdElkOworICAgIGhTdWJtaXRJbmZvLT5sYXN0RnJhbWVOdW1iZXIgPSBzdWJtaXRJbmZvLm1MYXN0RnJhbWVOdW1iZXI7Cit9CisKK0hTdGF0dXMgQjJIU3RhdHVzKGNvbnN0IGJpbmRlcjo6U3RhdHVzICZiU3RhdHVzKSB7CisgICAgSFN0YXR1cyBzdGF0dXMgPSBIU3RhdHVzOjpOT19FUlJPUjsKKyAgICBpZiAoYlN0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgLy8gTk8gRXJyb3IgaGVyZQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBzd2l0Y2goYlN0YXR1cy5zZXJ2aWNlU3BlY2lmaWNFcnJvckNvZGUoKSkgeworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVEOgorICAgICAgICAgICAgc3RhdHVzID0gSFN0YXR1czo6RElTQ09OTkVDVEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9DQU1FUkFfSU5fVVNFOgorICAgICAgICAgICAgc3RhdHVzID0gSFN0YXR1czo6Q0FNRVJBX0lOX1VTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVJST1JfTUFYX0NBTUVSQVNfSU5fVVNFOgorICAgICAgICAgICAgc3RhdHVzID0gSFN0YXR1czo6TUFYX0NBTUVSQVNfSU5fVVNFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5UOgorICAgICAgICAgICAgc3RhdHVzID0gSFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVJST1JfREVQUkVDQVRFRF9IQUw6CisgICAgICAgICAgICAvLyBTaG91bGQgbm90IHJlYWNoIGhlcmUgc2luY2Ugd2UgZmlsdGVyZWQgbGVnYWN5IEhBTHMgZWFybGllcgorICAgICAgICAgICAgc3RhdHVzID0gSFN0YXR1czo6REVQUkVDQVRFRF9IQUw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX0RJU0FCTEVEOgorICAgICAgICAgICAgc3RhdHVzID0gSFN0YXR1czo6RElTQUJMRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX1BFUk1JU1NJT05fREVOSUVEOgorICAgICAgICAgICAgc3RhdHVzID0gSFN0YXR1czo6UEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OOgorICAgICAgICAgICAgc3RhdHVzID0gSFN0YXR1czo6SU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OlVOS05PV05fRVJST1I7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgIHJldHVybiBzdGF0dXM7Cit9CisKK0hQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvIGNvbnZlcnRUb0hpZGwoCisgICAgY29uc3QgUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyAmcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbywKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWU+ICZjYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSkgeworICAgIEhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvIGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvOworICAgIGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvLnBoeXNpY2FsQ2FtZXJhSWQgPQorICAgICAgICBTdHJpbmc4KHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8ubVBoeXNpY2FsQ2FtZXJhSWQpLnN0cmluZygpOworICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpyYXdNZXRhZGF0YSA9CisgICAgICAgIHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8ubVBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEuZ2V0QW5kTG9jaygpOworICAgIC8vIFRyeSB1c2luZyBmbXEgYXQgZmlyc3QuCisgICAgc2l6ZV90IG1ldGFkYXRhX3NpemUgPSBnZXRfY2FtZXJhX21ldGFkYXRhX3NpemUocmF3TWV0YWRhdGEpOworICAgIGlmICgobWV0YWRhdGFfc2l6ZSA+IDApICYmIChjYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpID4gMCkpIHsKKyAgICAgICAgaWYgKGNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlLT53cml0ZSgodWludDhfdCAqKXJhd01ldGFkYXRhLCBtZXRhZGF0YV9zaXplKSkgeworICAgICAgICAgICAgaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8ucGh5c2ljYWxDYW1lcmFNZXRhZGF0YS5mbXFNZXRhZGF0YVNpemUobWV0YWRhdGFfc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiJXMgQ291bGRuJ3QgdXNlIGZtcSwgZmFsbGluZyBiYWNrIHRvIGh3YmluZGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIEhDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YTsKKyAgICAgICAgICAgIGNvbnZlcnRUb0hpZGwocmF3TWV0YWRhdGEsICZtZXRhZGF0YSk7CisgICAgICAgICAgICBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mby5waHlzaWNhbENhbWVyYU1ldGFkYXRhLm1ldGFkYXRhKHN0ZDo6bW92ZShtZXRhZGF0YSkpOworICAgICAgICB9CisgICAgfQorICAgIHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8ubVBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEudW5sb2NrKHJhd01ldGFkYXRhKTsKKyAgICByZXR1cm4gaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm87Cit9CisKK2hpZGxfdmVjPEhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBjb252ZXJ0VG9IaWRsKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+ICZwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcywKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWU+ICZjYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSkgeworICAgIGhpZGxfdmVjPEhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3M7CisgICAgaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zLnJlc2l6ZShwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcy5zaXplKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGF1dG8gJnBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8gOiBwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcykgeworICAgICAgICBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3NbaSsrXSA9IGNvbnZlcnRUb0hpZGwocGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKTsKKyAgICB9CisgICAgcmV0dXJuIGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvczsKK30KKworfSAvL2NvbnZlcnNpb24KK30gLy8gdXRpbHMKK30gLy9jYW1lcmFzZXJ2aWNlCit9IC8vIGhhcmR3YXJlCit9IC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ29udmVydC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9Db252ZXJ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk2ODNmNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ29udmVydC5oCkBAIC0wLDAgKzEsMTAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDQU1FUkFTRVJWRVJfQ09OVkVSVF9ISURMCisjZGVmaW5lIENBTUVSQVNFUlZFUl9DT05WRVJUX0hJREwKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL0lDYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC9JQ2FtZXJhRGV2aWNlVXNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2NvbW1vbi8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9jb21tb24vMS4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0lDYW1lcmFEZXZpY2VVc2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9idWZmZXJxdWV1ZS8xLjAvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKK25hbWVzcGFjZSB1dGlscyB7CituYW1lc3BhY2UgY29udmVyc2lvbiB7CisKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjppbXBsOjpDYXB0dXJlUmVzdWx0RXh0cmFzOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OmltcGw6OlBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm87CisKK3VzaW5nIENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlID0gTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OwordXNpbmcgSENhbWVyYU1ldGFkYXRhID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhTWV0YWRhdGE7Cit1c2luZyBIQ2FtZXJhRGV2aWNlU3RhdHVzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzOwordXNpbmcgSENhbWVyYVN0YXR1c0FuZElkID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhU3RhdHVzQW5kSWQ7Cit1c2luZyBIQ2FtZXJhRGV2aWNlVXNlciA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6SUNhbWVyYURldmljZVVzZXI7Cit1c2luZyBIQ2FwdHVyZVJlc3VsdEV4dHJhcyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlc3VsdEV4dHJhczsKK3VzaW5nIEhDYXB0dXJlUmVxdWVzdCA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlcXVlc3Q7Cit1c2luZyBIRXJyb3JDb2RlID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpFcnJvckNvZGU7Cit1c2luZyBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyID0gaGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3VzaW5nIEhPdXRwdXRDb25maWd1cmF0aW9uID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpPdXRwdXRDb25maWd1cmF0aW9uOwordXNpbmcgSFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M7Cit1c2luZyBIUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbzsKK3VzaW5nIEhTZXNzaW9uQ29uZmlndXJhdGlvbiA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6U2Vzc2lvbkNvbmZpZ3VyYXRpb247Cit1c2luZyBIU3VibWl0SW5mbyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6U3VibWl0SW5mbzsKK3VzaW5nIEhTdGF0dXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlN0YXR1czsKK3VzaW5nIEhTdHJlYW1Db25maWd1cmF0aW9uTW9kZSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6U3RyZWFtQ29uZmlndXJhdGlvbk1vZGU7Cit1c2luZyBIVGVtcGxhdGVJZCA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6VGVtcGxhdGVJZDsKKworLy8gTm90ZTogZXhpc3RpbmcgZGF0YSBpbiBkc3Qgd2lsbCBiZSBnb25lLiBDYWxsZXIgc3RpbGwgb3ducyB0aGUgbWVtb3J5IG9mIHNyYwordm9pZCBjb252ZXJ0VG9IaWRsKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzcmMsIEhDYW1lcmFNZXRhZGF0YSogZHN0KTsKKworaW50MzJfdCBjb252ZXJ0RnJvbUhpZGwoSFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlIHN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKTsKKworaW50MzJfdCBjb252ZXJ0RnJvbUhpZGwoSFRlbXBsYXRlSWQgdGVtcGxhdGVJZCk7CisKK2Jvb2wgY29udmVydEZyb21IaWRsKGNvbnN0IEhDYW1lcmFNZXRhZGF0YSAmc3JjLCBDYW1lcmFNZXRhZGF0YSAqZHN0KTsKKworaGFyZHdhcmU6OmNhbWVyYTI6OnBhcmFtczo6T3V0cHV0Q29uZmlndXJhdGlvbiBjb252ZXJ0RnJvbUhpZGwoCisgICAgY29uc3QgSE91dHB1dENvbmZpZ3VyYXRpb24gJmhPdXRwdXRDb25maWd1cmF0aW9uKTsKKworaGFyZHdhcmU6OmNhbWVyYTI6OnBhcmFtczo6U2Vzc2lvbkNvbmZpZ3VyYXRpb24gY29udmVydEZyb21IaWRsKAorICAgIGNvbnN0IEhTZXNzaW9uQ29uZmlndXJhdGlvbiAmaFNlc3Npb25Db25maWd1cmF0aW9uKTsKKworSENhbWVyYURldmljZVN0YXR1cyBjb252ZXJ0VG9IaWRsQ2FtZXJhRGV2aWNlU3RhdHVzKGludDMyX3Qgc3RhdHVzKTsKKwordm9pZCBjb252ZXJ0VG9IaWRsKGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdGF0dXM+ICZzcmMsCisgICAgICAgICAgICAgICAgICAgaGlkbF92ZWM8SENhbWVyYVN0YXR1c0FuZElkPiogZHN0KTsKKwordm9pZCBjb252ZXJ0VG9IaWRsKGNvbnN0IGhhcmR3YXJlOjpjYW1lcmEyOjp1dGlsczo6U3VibWl0SW5mbyAmc3VibWl0SW5mbywKKyAgICAgICAgICAgICAgICAgICBIU3VibWl0SW5mbyAqaFN1Ym1pdEluZm8pOworCitIRXJyb3JDb2RlIGNvbnZlcnRUb0hpZGwoaW50MzJfdCBlcnJvckNvZGUpOworCitIQ2FwdHVyZVJlc3VsdEV4dHJhcyBjb252ZXJ0VG9IaWRsKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMgJmNhcHR1cmVSZXN1bHRFeHRyYXMpOworCitoaWRsX3ZlYzxIUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gY29udmVydFRvSGlkbCgKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiAmcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MsCisgICAgc3RkOjpzaGFyZWRfcHRyPENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlPiAmY2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUpOworCitIU3RhdHVzIEIySFN0YXR1cyhjb25zdCBiaW5kZXI6OlN0YXR1cyAmYlN0YXR1cyk7CisKK30gLy8gY29udmVyc2lvbgorfSAvLyB1dGlscworfSAvLyBjYW1lcmFzZXJ2aWNlCit9IC8vIGhhcmR3YXJlCit9IC8vYW5kcm9pZAorCisjZW5kaWYgLy9DQU1FUkFTRVJWRVJfQ09OVkVSVF9UT19ISURMCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYURldmljZVVzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3NWFkMjQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmNwcApAQCAtMCwwICsxLDI3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy4yL3R5cGVzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorI2luY2x1ZGUgPGd1aS9idWZmZXJxdWV1ZS8xLjAvSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisKKyNpbmNsdWRlIDxoaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KKyNpbmNsdWRlIDxoaWRsL0NvbnZlcnQuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuMi90eXBlcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZnJhbWV3b3JrcyB7CituYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CituYW1lc3BhY2UgZGV2aWNlIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6Y29udmVydFRvSGlkbDsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6Y29udmVydEZyb21IaWRsOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpCMkhTdGF0dXM7CisKK3VzaW5nIGhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OnV0aWxzOjpIMkJHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyBoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgaGFyZHdhcmU6OlZvaWQ7Cit1c2luZyBIU3VibWl0SW5mbyA9IGRldmljZTo6VjJfMDo6U3VibWl0SW5mbzsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjpwYXJhbXM6Ok91dHB1dENvbmZpZ3VyYXRpb247Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6cGFyYW1zOjpTZXNzaW9uQ29uZmlndXJhdGlvbjsKKworc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IENBTUVSQV9SRVFVRVNUX01FVEFEQVRBX1FVRVVFX1NJWkUgPSAxIDw8IDIwIC8qIDEgTUIgKi87CitzdGF0aWMgY29uc3RleHByIGludDMyX3QgQ0FNRVJBX1JFU1VMVF9NRVRBREFUQV9RVUVVRV9TSVpFID0gMSA8PCAyMCAvKiAxIE1CICovOworCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYURldmljZVVzZXI6OmRpc2Nvbm5lY3QoKSB7CisgICAgbURldmljZVJlbW90ZS0+ZGlzY29ubmVjdCgpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK0hpZGxDYW1lcmFEZXZpY2VVc2VyOjpIaWRsQ2FtZXJhRGV2aWNlVXNlcigKKyAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI+ICZkZXZpY2VSZW1vdGUpCisgIDogbURldmljZVJlbW90ZShkZXZpY2VSZW1vdGUpIHsKKyAgICBtSW5pdFN1Y2Nlc3MgPSBpbml0RGV2aWNlKCk7Cit9CisKK2Jvb2wgSGlkbENhbWVyYURldmljZVVzZXI6OmluaXREZXZpY2UoKSB7CisgICAgLy8gVE9ETzogR2V0IHJlcXVlc3QgYW5kIHJlc3VsdCBtZXRhZGF0YSBxdWV1ZSBzaXplIGZyb20gYSBzeXN0ZW0gcHJvcGVydHkuCisgICAgaW50MzJfdCByZXFGTVFTaXplID0gQ0FNRVJBX1JFUVVFU1RfTUVUQURBVEFfUVVFVUVfU0laRTsKKworICAgIG1DYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUgPQorICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4oc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXFGTVFTaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIG5vbiBibG9ja2luZyAqLyk7CisgICAgaWYgKCFtQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIHJlcXVlc3QgZm1xIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDMyX3QgcmVzRk1RU2l6ZSA9IENBTUVSQV9SRVNVTFRfTUVUQURBVEFfUVVFVUVfU0laRTsKKyAgICBtQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUgPQorICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlPihzdGF0aWNfY2FzdDxzaXplX3Q+KHJlc0ZNUVNpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBub24gYmxvY2tpbmcgKi8pOworICAgIGlmICghbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIHJlc3VsdCBmbXEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYURldmljZVVzZXI6OmdldENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZSgKKyAgICBnZXRDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWVfY2IgX2hpZGxfY2IpIHsKKyAgICBpZiAobUluaXRTdWNjZXNzKSB7CisgICAgICAgIF9oaWRsX2NiKCptQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlLT5nZXREZXNjKCkpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYURldmljZVVzZXI6OmdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKAorICAgIGdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlX2NiIF9oaWRsX2NiKSB7CisgICAgaWYgKG1Jbml0U3VjY2VzcykgeworICAgICAgICBfaGlkbF9jYigqbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlLT5nZXREZXNjKCkpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCisvKioKKyAqIFRvIGJlIHVzZWQgb25seSBieSBzdWJtaXRSZXF1ZXN0TGlzdCBpbXBsZW1lbnRhdGlvbiwgc2luY2UgaXQgcmVxdWlyZXMKKyAqIGNsaWVudHMgdG8gY2FsbCB0aGlzIG1ldGhvZCBzZXJpYWxseSwgaW5jYXNlIGZtcSBpcyB1c2VkIHRvIHNlbmQgbWV0YWRhdGEuCisgKi8KK2Jvb2wgSGlkbENhbWVyYURldmljZVVzZXI6OmNvcHlQaHlzaWNhbENhbWVyYVNldHRpbmdzKAorICAgIGNvbnN0IGhpZGxfdmVjPEhQaHlzaWNhbENhbWVyYVNldHRpbmdzPiAmaFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MsCisgICAgc3RkOjp2ZWN0b3I8Q2FwdHVyZVJlcXVlc3Q6OlBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M+ICpwaHlzaWNhbENhbWVyYVNldHRpbmdzKSB7CisgICAgYm9vbCBjb252ZXJ0ZWQgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8gJmUgOiBoUGh5c2ljYWxDYW1lcmFTZXR0aW5ncykgeworICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzLT5lbXBsYWNlX2JhY2soKTsKKyAgICAgICAgQ2FwdHVyZVJlcXVlc3Q6OlBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MgJnBoeXNpY2FsQ2FtZXJhU2V0dGluZyA9CisgICAgICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmdzLT5iYWNrKCk7CisgICAgICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZy5pZCA9IGUuaWQuY19zdHIoKTsKKworICAgICAgICAvLyBSZWFkIHRoZSBzZXR0aW5ncyBlaXRoZXIgZnJvbSB0aGUgZm1xIG9yIHN0cmFpZ2h0YXdheSBmcm9tIHRoZQorICAgICAgICAvLyByZXF1ZXN0LiBXZSBkb24ndCBuZWVkIGFueSBzeW5jaHJvbml6YXRpb24sIHNpbmNlIHN1Ym1pdFJlcXVlc3RMaXN0CisgICAgICAgIC8vIGlzIGd1YXJhbnRlZWQgdG8gYmUgY2FsbGVkIHNlcmlhbGx5IGJ5IHRoZSBjbGllbnQgaWYgaXQgZGVjaWRlcyB0bworICAgICAgICAvLyB1c2UgZm1xLgorICAgICAgICBpZiAoZS5zZXR0aW5ncy5nZXREaXNjcmltaW5hdG9yKCkgPT0KKyAgICAgICAgICAgIEZtcVNpemVPck1ldGFkYXRhOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmZtcU1ldGFkYXRhU2l6ZSkgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBHZXQgc2V0dGluZ3MgZnJvbSB0aGUgZm1xLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBIQ2FtZXJhTWV0YWRhdGEgc2V0dGluZ3NGbXE7CisgICAgICAgICAgICBzZXR0aW5nc0ZtcS5yZXNpemUoZS5zZXR0aW5ncy5mbXFNZXRhZGF0YVNpemUoKSk7CisgICAgICAgICAgICBib29sIHJlYWQgPSBtQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlLT5yZWFkKHNldHRpbmdzRm1xLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5zZXR0aW5ncy5mbXFNZXRhZGF0YVNpemUoKSk7CisgICAgICAgICAgICBpZiAoIXJlYWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMgY2FwdHVyZSByZXF1ZXN0IHNldHRpbmdzIGNvdWxkJ3QgYmUgcmVhZCBmcm9tIGZtcSBzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgIGNvbnZlcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBjb252ZXJ0RnJvbUhpZGwoc2V0dGluZ3NGbXEsICZwaHlzaWNhbENhbWVyYVNldHRpbmcuc2V0dGluZ3MpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAgKiBUaGUgc2V0dGluZ3MgbWV0YWRhdGEgaXMgY29udGFpbmVkIGluIHJlcXVlc3Qgc2V0dGluZ3MgZmllbGQuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGNvbnZlcnRlZCA9CisgICAgICAgICAgICAgICAgY29udmVydEZyb21IaWRsKGUuc2V0dGluZ3MubWV0YWRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBoeXNpY2FsQ2FtZXJhU2V0dGluZy5zZXR0aW5ncyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjb252ZXJ0ZWQpIHsKKyAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb252ZXJ0IHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MgZnJvbSBISURMIHRvIEFJREwuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSGlkbENhbWVyYURldmljZVVzZXI6OmNvbnZlcnRSZXF1ZXN0RnJvbUhpZGwoY29uc3QgSENhcHR1cmVSZXF1ZXN0ICZoUmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlcXVlc3QgKnJlcXVlc3QpIHsKKyAgICAvLyBObyByZXByb2Nlc3Npbmcgc3VwcG9ydC4KKyAgICByZXF1ZXN0LT5tSXNSZXByb2Nlc3MgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnN0cmVhbUFuZFdpbmRvd0lkIDogaFJlcXVlc3Quc3RyZWFtQW5kV2luZG93SWRzKSB7CisgICAgICAgIHJlcXVlc3QtPm1TdHJlYW1JZHhMaXN0LnB1c2hfYmFjayhzdHJlYW1BbmRXaW5kb3dJZC5zdHJlYW1JZCk7CisgICAgICAgIHJlcXVlc3QtPm1TdXJmYWNlSWR4TGlzdC5wdXNoX2JhY2soc3RyZWFtQW5kV2luZG93SWQud2luZG93SWQpOworICAgIH0KKyAgICByZXR1cm4gY29weVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MoaFJlcXVlc3QucGh5c2ljYWxDYW1lcmFTZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihyZXF1ZXN0LT5tUGh5c2ljYWxDYW1lcmFTZXR0aW5ncykpOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYURldmljZVVzZXI6OnN1Ym1pdFJlcXVlc3RMaXN0KGNvbnN0IGhpZGxfdmVjPEhDYXB0dXJlUmVxdWVzdD4mIGhSZXF1ZXN0TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJlYW1pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1Ym1pdFJlcXVlc3RMaXN0X2NiIF9oaWRsX2NiKSB7CisgICAgaGFyZHdhcmU6OmNhbWVyYTI6OnV0aWxzOjpTdWJtaXRJbmZvIHN1Ym1pdEluZm87CisgICAgSFN1Ym1pdEluZm8gaFN1Ym1pdEluZm87CisgICAgLyoqCisgICAgICogQ3JlYXRlIEFJREwgQ2FwdHVyZVJlcXVlc3QgZnJvbSByZXF1ZXN0TGlzdCBhbmQgZ3JhcGhpY0J1ZmZlclByb2R1Y2Vycy4KKyAgICAgKi8KKyAgICBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Y2FtZXJhMjo6Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3RzOworICAgIGZvciAoYXV0byAmaFJlcXVlc3QgOiBoUmVxdWVzdExpc3QpIHsKKyAgICAgICAgcmVxdWVzdHMuZW1wbGFjZV9iYWNrKCk7CisgICAgICAgIGF1dG8gJnJlcXVlc3QgPSByZXF1ZXN0cy5iYWNrKCk7CisgICAgICAgIGlmICghY29udmVydFJlcXVlc3RGcm9tSGlkbChoUmVxdWVzdCwgJnJlcXVlc3QpKSB7CisgICAgICAgICAgICBfaGlkbF9jYihIU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5ULCBoU3VibWl0SW5mbyk7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisgICAgfQorICAgIG1EZXZpY2VSZW1vdGUtPnN1Ym1pdFJlcXVlc3RMaXN0KHJlcXVlc3RzLCBzdHJlYW1pbmcsICZzdWJtaXRJbmZvKTsKKyAgICBtUmVxdWVzdElkID0gc3VibWl0SW5mby5tUmVxdWVzdElkOworICAgIGNvbnZlcnRUb0hpZGwoc3VibWl0SW5mbywgJmhTdWJtaXRJbmZvKTsKKyAgICBfaGlkbF9jYihIU3RhdHVzOjpOT19FUlJPUiwgaFN1Ym1pdEluZm8pOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6Y2FuY2VsUmVwZWF0aW5nUmVxdWVzdChjYW5jZWxSZXBlYXRpbmdSZXF1ZXN0X2NiIF9oaWRsX2NiKSB7CisgICAgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIgPSAwOworICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IG1EZXZpY2VSZW1vdGUtPmNhbmNlbFJlcXVlc3QobVJlcXVlc3RJZCwgJmxhc3RGcmFtZU51bWJlcik7CisgICAgX2hpZGxfY2IoQjJIU3RhdHVzKHJldCksIGxhc3RGcmFtZU51bWJlcik7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPEhTdGF0dXM+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpiZWdpbkNvbmZpZ3VyZSgpIHsKKyAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBtRGV2aWNlUmVtb3RlLT5iZWdpbkNvbmZpZ3VyZSgpOworICAgIHJldHVybiBCMkhTdGF0dXMocmV0KTsKK30KKworUmV0dXJuPEhTdGF0dXM+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjplbmRDb25maWd1cmUoU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgb3BlcmF0aW5nTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uUGFyYW1zKSB7CisgICAgYW5kcm9pZDo6Q2FtZXJhTWV0YWRhdGEgY2FtZXJhTWV0YWRhdGE7CisgICAgaWYgKCFjb252ZXJ0RnJvbUhpZGwoc2Vzc2lvblBhcmFtcywgJmNhbWVyYU1ldGFkYXRhKSkgeworICAgICAgICByZXR1cm4gSFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVDsKKyAgICB9CisKKyAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBtRGV2aWNlUmVtb3RlLT5lbmRDb25maWd1cmUoY29udmVydEZyb21IaWRsKG9wZXJhdGluZ01vZGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmFNZXRhZGF0YSk7CisgICAgcmV0dXJuIEIySFN0YXR1cyhyZXQpOworfQorCitSZXR1cm48SFN0YXR1cz4gSGlkbENhbWVyYURldmljZVVzZXI6OmRlbGV0ZVN0cmVhbShpbnQzMl90IHN0cmVhbUlkKSB7CisgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gbURldmljZVJlbW90ZS0+ZGVsZXRlU3RyZWFtKHN0cmVhbUlkKTsKKyAgICByZXR1cm4gQjJIU3RhdHVzKHJldCk7Cit9CisKK1JldHVybjx2b2lkPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6Y3JlYXRlU3RyZWFtKGNvbnN0IEhPdXRwdXRDb25maWd1cmF0aW9uJiBoT3V0cHV0Q29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVN0cmVhbV9jYiBoaWRsX2NiXykgeworICAgIE91dHB1dENvbmZpZ3VyYXRpb24gb3V0cHV0Q29uZmlndXJhdGlvbiA9CisgICAgICAgIGNvbnZlcnRGcm9tSGlkbChoT3V0cHV0Q29uZmlndXJhdGlvbik7CisgICAgaW50MzJfdCBuZXdTdHJlYW1JZCA9IDA7CisgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gbURldmljZVJlbW90ZS0+Y3JlYXRlU3RyZWFtKG91dHB1dENvbmZpZ3VyYXRpb24sICZuZXdTdHJlYW1JZCk7CisgICAgSFN0YXR1cyBzdGF0dXMgPSBCMkhTdGF0dXMocmV0KTsKKyAgICBoaWRsX2NiXyhzdGF0dXMsIG5ld1N0cmVhbUlkKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYURldmljZVVzZXI6OmNyZWF0ZURlZmF1bHRSZXF1ZXN0KFRlbXBsYXRlSWQgdGVtcGxhdGVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRGVmYXVsdFJlcXVlc3RfY2IgX2hpZGxfY2IpIHsKKyAgICBhbmRyb2lkOjpDYW1lcmFNZXRhZGF0YSBjYW1lcmFNZXRhZGF0YTsKKyAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBtRGV2aWNlUmVtb3RlLT5jcmVhdGVEZWZhdWx0UmVxdWVzdChjb252ZXJ0RnJvbUhpZGwodGVtcGxhdGVJZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNhbWVyYU1ldGFkYXRhKTsKKyAgICBIU3RhdHVzIGhTdGF0dXMgPSBCMkhTdGF0dXMocmV0KTsKKyAgICBIQ2FtZXJhTWV0YWRhdGEgaGlkbE1ldGFkYXRhOworICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpyYXdNZXRhZGF0YSA9IGNhbWVyYU1ldGFkYXRhLmdldEFuZExvY2soKTsKKyAgICBjb252ZXJ0VG9IaWRsKHJhd01ldGFkYXRhLCAmaGlkbE1ldGFkYXRhKTsKKyAgICBfaGlkbF9jYihoU3RhdHVzLCBoaWRsTWV0YWRhdGEpOworICAgIGNhbWVyYU1ldGFkYXRhLnVubG9jayhyYXdNZXRhZGF0YSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPEhTdGF0dXM+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjp3YWl0VW50aWxJZGxlKCkgeworICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IG1EZXZpY2VSZW1vdGUtPndhaXRVbnRpbElkbGUoKTsKKyAgICByZXR1cm4gQjJIU3RhdHVzKHJldCk7Cit9CisKK1JldHVybjx2b2lkPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6Zmx1c2goZmx1c2hfY2IgX2hpZGxfY2IpIHsKKyAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciA9IDA7CisgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gbURldmljZVJlbW90ZS0+Zmx1c2goJmxhc3RGcmFtZU51bWJlcik7CisgICAgX2hpZGxfY2IoQjJIU3RhdHVzKHJldCksbGFzdEZyYW1lTnVtYmVyKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48SFN0YXR1cz4gSGlkbENhbWVyYURldmljZVVzZXI6OnVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb24oCisgICAgaW50MzJfdCBzdHJlYW1JZCwKKyAgICBjb25zdCBIT3V0cHV0Q29uZmlndXJhdGlvbiYgaE91dHB1dENvbmZpZ3VyYXRpb24pIHsKKyAgICBPdXRwdXRDb25maWd1cmF0aW9uIG91dHB1dENvbmZpZ3VyYXRpb24gPSBjb252ZXJ0RnJvbUhpZGwoaE91dHB1dENvbmZpZ3VyYXRpb24pOworICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IG1EZXZpY2VSZW1vdGUtPnVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb24oc3RyZWFtSWQsIG91dHB1dENvbmZpZ3VyYXRpb24pOworICAgIHJldHVybiBCMkhTdGF0dXMocmV0KTsKK30KKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjppc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAorICAgIGNvbnN0IEhTZXNzaW9uQ29uZmlndXJhdGlvbiYgaFNlc3Npb25Db25maWd1cmF0aW9uLAorICAgIGlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWRfY2IgX2hpZGxfY2IpIHsKKyAgICBib29sIHN1cHBvcnRlZCA9IGZhbHNlOworICAgIFNlc3Npb25Db25maWd1cmF0aW9uIHNlc3Npb25Db25maWd1cmF0aW9uID0gY29udmVydEZyb21IaWRsKGhTZXNzaW9uQ29uZmlndXJhdGlvbik7CisgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gbURldmljZVJlbW90ZS0+aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgICAgIHNlc3Npb25Db25maWd1cmF0aW9uLCAmc3VwcG9ydGVkKTsKKyAgICBIU3RhdHVzIHN0YXR1cyA9IEIySFN0YXR1cyhyZXQpOworICAgIF9oaWRsX2NiKHN0YXR1cywgc3VwcG9ydGVkKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCit9IC8vIGltcGxlbWVudGF0aW9uCit9IC8vIFYyXzAKK30gLy8gZGV2aWNlCit9IC8vIGNhbWVyYXNlcnZpY2UKK30gLy8gZnJhbWV3b3JrcworfSAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNhODBmZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYURldmljZVVzZXIuaApAQCAtMCwwICsxLDEzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9GUkFNRVdPUktTX0NBTUVSQURFVklDRVVTRVJfVjJfMF9DQU1FUkFERVZJQ0VVU0VSX0gKKyNkZWZpbmUgQU5EUk9JRF9GUkFNRVdPUktTX0NBTUVSQURFVklDRVVTRVJfVjJfMF9DQU1FUkFERVZJQ0VVU0VSX0gKKworI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9jb21tb24vMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL0lDYW1lcmFEZXZpY2VVc2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKworI2luY2x1ZGUgPENhbWVyYVNlcnZpY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZyYW1ld29ya3MgeworbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UgeworbmFtZXNwYWNlIGRldmljZSB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OkNhcHR1cmVSZXF1ZXN0OwordXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU7Cit1c2luZyBoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlOwordXNpbmcgaGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7Cit1c2luZyBoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUgPSBNZXNzYWdlUXVldWU8dWludDhfdCwga1N5bmNocm9uaXplZFJlYWRXcml0ZT47Cit1c2luZyBDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUgPSBNZXNzYWdlUXVldWU8dWludDhfdCwga1N5bmNocm9uaXplZFJlYWRXcml0ZT47Cit1c2luZyBUZW1wbGF0ZUlkID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpUZW1wbGF0ZUlkOworCit1c2luZyBIQ2FtZXJhRGV2aWNlVXNlciA9IGRldmljZTo6VjJfMDo6SUNhbWVyYURldmljZVVzZXI7Cit1c2luZyBIQ2FtZXJhTWV0YWRhdGEgPSBjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFNZXRhZGF0YTsKK3VzaW5nIEhDYXB0dXJlUmVxdWVzdCA9IGRldmljZTo6VjJfMDo6Q2FwdHVyZVJlcXVlc3Q7Cit1c2luZyBIU2Vzc2lvbkNvbmZpZ3VyYXRpb24gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlNlc3Npb25Db25maWd1cmF0aW9uOwordXNpbmcgSE91dHB1dENvbmZpZ3VyYXRpb24gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6Ok91dHB1dENvbmZpZ3VyYXRpb247Cit1c2luZyBIUGh5c2ljYWxDYW1lcmFTZXR0aW5ncyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6UGh5c2ljYWxDYW1lcmFTZXR0aW5nczsKK3VzaW5nIEhTdGF0dXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlN0YXR1czsKKworc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IFJFUVVFU1RfSURfTk9ORSA9IC0xOworCitzdHJ1Y3QgSGlkbENhbWVyYURldmljZVVzZXIgZmluYWwgOiBwdWJsaWMgSENhbWVyYURldmljZVVzZXIgeworICAgIEhpZGxDYW1lcmFEZXZpY2VVc2VyKGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcj4gJmRldmljZVJlbW90ZSk7CisKKyAgICB+SGlkbENhbWVyYURldmljZVVzZXIoKSB7IH0KKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGRpc2Nvbm5lY3QoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGdldENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZSgKKyAgICAgICAgZ2V0Q2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKAorICAgICAgICBnZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBzdWJtaXRSZXF1ZXN0TGlzdChjb25zdCBoaWRsX3ZlYzxIQ2FwdHVyZVJlcXVlc3Q+JiByZXF1ZXN0TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0cmVhbWluZywgc3VibWl0UmVxdWVzdExpc3RfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY2FuY2VsUmVwZWF0aW5nUmVxdWVzdChjYW5jZWxSZXBlYXRpbmdSZXF1ZXN0X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPEhTdGF0dXM+IGJlZ2luQ29uZmlndXJlKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjxIU3RhdHVzPiBlbmRDb25maWd1cmUoU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgb3BlcmF0aW5nTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25QYXJhbXMpOworCisgICAgdmlydHVhbCBSZXR1cm48SFN0YXR1cz4gZGVsZXRlU3RyZWFtKGludDMyX3Qgc3RyZWFtSWQpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY3JlYXRlU3RyZWFtKGNvbnN0IEhPdXRwdXRDb25maWd1cmF0aW9uJiBvdXRwdXRDb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVTdHJlYW1fY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgUmV0dXJuPHZvaWQ+IGNyZWF0ZURlZmF1bHRSZXF1ZXN0KFRlbXBsYXRlSWQgdGVtcGxhdGVJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlRGVmYXVsdFJlcXVlc3RfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48SFN0YXR1cz4gd2FpdFVudGlsSWRsZSgpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gZmx1c2goZmx1c2hfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48SFN0YXR1cz4gdXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbigKKyAgICAgICAgaW50MzJfdCBzdHJlYW1JZCwgY29uc3QgSE91dHB1dENvbmZpZ3VyYXRpb24mIG91dHB1dENvbmZpZ3VyYXRpb24pIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgY29uc3QgSFNlc3Npb25Db25maWd1cmF0aW9uJiBzZXNzaW9uQ29uZmlndXJhdGlvbiwKKyAgICAgICAgaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICBib29sIGluaXRTdGF0dXMoKSB7IHJldHVybiBtSW5pdFN1Y2Nlc3M7IH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZT4gZ2V0Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUoKSB7CisgICAgICAgIHJldHVybiBtQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWU7CisgICAgfQorCisgcHJpdmF0ZToKKyAgICBib29sIGluaXREZXZpY2UoKTsKKworICAgIGJvb2wgY29udmVydFJlcXVlc3RGcm9tSGlkbChjb25zdCBIQ2FwdHVyZVJlcXVlc3QgJmhSZXF1ZXN0LCBDYXB0dXJlUmVxdWVzdCAqcmVxdWVzdCk7CisKKyAgICBib29sIGNvcHlQaHlzaWNhbENhbWVyYVNldHRpbmdzKAorICAgICAgICBjb25zdCBoaWRsX3ZlYzxIUGh5c2ljYWxDYW1lcmFTZXR0aW5ncz4gJmhQaHlzaWNhbENhbWVyYVNldHRpbmdzLAorICAgICAgICBzdGQ6OnZlY3RvcjxDYXB0dXJlUmVxdWVzdDo6UGh5c2ljYWxDYW1lcmFTZXR0aW5ncz4gKnBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MpOworCisgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyPiBtRGV2aWNlUmVtb3RlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWU+IG1DYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUgPSBudWxscHRyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZT4gbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlID0gbnVsbHB0cjsKKyAgICBib29sIG1Jbml0U3VjY2VzcyA9IGZhbHNlOworICAgIGludDMyX3QgbVJlcXVlc3RJZCA9IFJFUVVFU1RfSURfTk9ORTsKK307CisKK30gLy8gaW1wbGVtZW50YXRpb24KK30gLy8gVjJfMAorfSAvLyBkZXZpY2UKK30gLy8gY2FtZXJhc2VydmljZQorfSAvLyBmcmFtZXdvcmtzCit9IC8vIGFuZHJvaWQKKyNlbmRpZiAvLyBBTkRST0lEX0ZSQU1FT1dPUktTX0NBTUVSQURFVklDRVVTRVJfVjJfMF9DQU1FUkFERVZJQ0VVU0VSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRjZmU0MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuY3BwCkBAIC0wLDAgKzEsMjc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGhpZGwvQ29udmVydC5oPgorCisjaW5jbHVkZSA8aGlkbC9IaWRsQ2FtZXJhU2VydmljZS5oPgorCisjaW5jbHVkZSA8aGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5oPgorI2luY2x1ZGUgPGhpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5oPgorI2luY2x1ZGUgPGhpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5oPgorCisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZnJhbWV3b3JrcyB7CituYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CituYW1lc3BhY2Ugc2VydmljZSB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6SGlkbENhbWVyYVNlcnZpY2U7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmNvbnZlcnRUb0hpZGw7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OkIySFN0YXR1czsKK3VzaW5nIGhhcmR3YXJlOjpWb2lkOworCit1c2luZyBkZXZpY2U6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M7Cit1c2luZyBkZXZpY2U6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpIaWRsQ2FtZXJhRGV2aWNlVXNlcjsKK3VzaW5nIHNlcnZpY2U6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpIMkJDYW1lcmFTZXJ2aWNlTGlzdGVuZXI7Cit1c2luZyBIQ2FtZXJhTWV0YWRhdGFUeXBlID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpDYW1lcmFNZXRhZGF0YVR5cGU7Cit1c2luZyBIVmVuZG9yVGFnID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpWZW5kb3JUYWc7Cit1c2luZyBIVmVuZG9yVGFnU2VjdGlvbiA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6VmVuZG9yVGFnU2VjdGlvbjsKK3VzaW5nIEhQcm92aWRlcklkQW5kVmVuZG9yVGFnU2VjdGlvbnMgPQorICAgICAgICBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlByb3ZpZGVySWRBbmRWZW5kb3JUYWdTZWN0aW9uczsKKworc3A8SGlkbENhbWVyYVNlcnZpY2U+IGdIaWRsQ2FtZXJhU2VydmljZTsKKworc3A8SGlkbENhbWVyYVNlcnZpY2U+IEhpZGxDYW1lcmFTZXJ2aWNlOjpnZXRJbnN0YW5jZShhbmRyb2lkOjpDYW1lcmFTZXJ2aWNlICpjcykgeworICAgIGdIaWRsQ2FtZXJhU2VydmljZSA9IG5ldyBIaWRsQ2FtZXJhU2VydmljZShjcyk7CisgICAgcmV0dXJuIGdIaWRsQ2FtZXJhU2VydmljZTsKK30KKworUmV0dXJuPHZvaWQ+CitIaWRsQ2FtZXJhU2VydmljZTo6Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNvbnN0IGhpZGxfc3RyaW5nJiBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzX2NiIF9oaWRsX2NiKSB7CisgICAgYW5kcm9pZDo6Q2FtZXJhTWV0YWRhdGEgY2FtZXJhTWV0YWRhdGE7CisgICAgSFN0YXR1cyBzdGF0dXMgPSBIU3RhdHVzOjpOT19FUlJPUjsKKyAgICBiaW5kZXI6OlN0YXR1cyBzZXJ2aWNlUmV0ID0KKyAgICAgICAgbUFpZGxJQ2FtZXJhU2VydmljZS0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKFN0cmluZzE2KGNhbWVyYUlkLmNfc3RyKCkpLCAmY2FtZXJhTWV0YWRhdGEpOworICAgIEhDYW1lcmFNZXRhZGF0YSBoaWRsTWV0YWRhdGE7CisgICAgaWYgKCFzZXJ2aWNlUmV0LmlzT2soKSkgeworICAgICAgICBzd2l0Y2goc2VydmljZVJldC5zZXJ2aWNlU3BlY2lmaWNFcnJvckNvZGUoKSkgeworICAgICAgICAgICAgLy8gTm8gRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRCBzaW5jZSB3ZSdyZSBpbiB0aGUgc2FtZSBwcm9jZXNzLgorICAgICAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgSUQgJXMgZG9lcyBub3QgZXhpc3QhIiwgX19GVU5DVElPTl9fLCBjYW1lcmFJZC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBIU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiR2V0IGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgZnJvbSBjYW1lcmEgc2VydmljZSBmYWlsZWQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlUmV0LnRvU3RyaW5nOCgpLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBCMkhTdGF0dXMoc2VydmljZVJldCk7CisgICAgICAgICAgfQorICAgICAgICBfaGlkbF9jYihzdGF0dXMsIGhpZGxNZXRhZGF0YSk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpyYXdNZXRhZGF0YSA9IGNhbWVyYU1ldGFkYXRhLmdldEFuZExvY2soKTsKKyAgICBjb252ZXJ0VG9IaWRsKHJhd01ldGFkYXRhLCAmaGlkbE1ldGFkYXRhKTsKKyAgICBfaGlkbF9jYihzdGF0dXMsIGhpZGxNZXRhZGF0YSk7CisgICAgY2FtZXJhTWV0YWRhdGEudW5sb2NrKHJhd01ldGFkYXRhKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYVNlcnZpY2U6OmNvbm5lY3REZXZpY2UoY29uc3Qgc3A8SENhbWVyYURldmljZUNhbGxiYWNrPiYgaENhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25uZWN0RGV2aWNlX2NiIF9oaWRsX2NiKSB7CisgICAgLy8gSGVyZSwgd2UgZmlyc3QgZ2V0IElDYW1lcmFEZXZpY2VVc2VyIGZyb20gbUFpZGxJQ2FtZXJhU2VydmljZSwgdGhlbiBzYXZlCisgICAgLy8gdGhhdCBpbnRlcmZhY2UgaW4gdGhlIG5ld2x5IGNyZWF0ZWQgSGlkbENhbWVyYURldmljZVVzZXIgaW1wbCBjbGFzcy4KKyAgICBpZiAobUFpZGxJQ2FtZXJhU2VydmljZSA9PSBudWxscHRyKSB7CisgICAgICAgIF9oaWRsX2NiKEhTdGF0dXM6OlVOS05PV05fRVJST1IsIG51bGxwdHIpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI+IGRldmljZVJlbW90ZSA9IG51bGxwdHI7CisgICAgLy8gQ3JlYXRlIGEgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFjayBvYmplY3Qgd2hpY2ggaW50ZXJuYWxseQorICAgIC8vIGNhbGxzIGNhbGxiYWNrIGZ1bmN0aW9ucyBwYXNzZWQgdGhyb3VnaCBoQ2FsbGJhY2suCisgICAgc3A8SDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBoeWJyaWRDYWxsYmFja3MgPSBuZXcgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzKGhDYWxsYmFjayk7CisgICAgaWYgKCFoeWJyaWRDYWxsYmFja3MtPmluaXRpYWxpemVMb29wZXIoKSkgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGhhbmRsZSBjYWxsYmFja3Mgb24gZGV2aWNlLCBjYW5ub3QgY29ubmVjdCIpOworICAgICAgICBfaGlkbF9jYihIU3RhdHVzOjpVTktOT1dOX0VSUk9SLCBudWxscHRyKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IGNhbGxiYWNrcyA9IGh5YnJpZENhbGxiYWNrczsKKyAgICBiaW5kZXI6OlN0YXR1cyBzZXJ2aWNlUmV0ID0gbUFpZGxJQ2FtZXJhU2VydmljZS0+Y29ubmVjdERldmljZSgKKyAgICAgICAgICAgIGNhbGxiYWNrcywgU3RyaW5nMTYoY2FtZXJhSWQuY19zdHIoKSksIFN0cmluZzE2KCIiKSwKKyAgICAgICAgICAgIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6VVNFX0NBTExJTkdfVUlELCAvKm91dCovJmRldmljZVJlbW90ZSk7CisgICAgSFN0YXR1cyBzdGF0dXMgPSBIU3RhdHVzOjpOT19FUlJPUjsKKyAgICBpZiAoIXNlcnZpY2VSZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbm5lY3QgdG8gY2FtZXJhIGRldmljZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHN0YXR1cyA9IEIySFN0YXR1cyhzZXJ2aWNlUmV0KTsKKyAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBudWxscHRyKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgLy8gTm93IHdlIGNyZWF0ZSBhIEhpZGxDYW1lcmFEZXZpY2VVc2VyIGNsYXNzLCBzdG9yZSB0aGUgZGV2aWNlUmVtb3RlIGluIGl0LAorICAgIC8vIGFuZCByZXR1cm4gdGhhdCBiYWNrLiBBbGwgY2FsbHMgb24gdGhhdCBpbnRlcmZhY2Ugd2lsbCBiZSBmb3J3YXJkZWQgdG8KKyAgICAvLyB0aGUgQUlETCBpbnRlcmZhY2UuCisgICAgc3A8SGlkbENhbWVyYURldmljZVVzZXI+IGhEZXZpY2VSZW1vdGUgPSBuZXcgSGlkbENhbWVyYURldmljZVVzZXIoZGV2aWNlUmVtb3RlKTsKKyAgICBpZiAoIWhEZXZpY2VSZW1vdGUtPmluaXRTdGF0dXMoKSkgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBpbml0aWFsaXplIGNhbWVyYSBkZXZpY2UgSElETCB3cmFwcGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgX2hpZGxfY2IoSFN0YXR1czo6VU5LTk9XTl9FUlJPUiwgbnVsbHB0cik7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIGh5YnJpZENhbGxiYWNrcy0+c2V0Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUoaERldmljZVJlbW90ZS0+Z2V0Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUoKSk7CisgICAgX2hpZGxfY2Ioc3RhdHVzLCBoRGV2aWNlUmVtb3RlKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCit2b2lkIEhpZGxDYW1lcmFTZXJ2aWNlOjphZGRUb0xpc3RlbmVyQ2FjaGVMb2NrZWQoc3A8SENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gaExpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBjc0xpc3RlbmVyKSB7CisgICAgICAgIG1MaXN0ZW5lcnMuZW1wbGFjZV9iYWNrKHN0ZDo6bWFrZV9wYWlyKGhMaXN0ZW5lciwgY3NMaXN0ZW5lcikpOworfQorCitzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4KK0hpZGxDYW1lcmFTZXJ2aWNlOjpzZWFyY2hMaXN0ZW5lckNhY2hlTG9ja2VkKHNwPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGhMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2hvdWxkUmVtb3ZlKSB7CisgICAgLy8gR28gdGhyb3VnaCB0aGUgbUxpc3RlbmVycyBsaXN0IGFuZCBjb21wYXJlIHRoZSBsaXN0ZW5lciB3aXRoIHRoZSBISURMCisgICAgLy8gbGlzdGVuZXIgcmVnaXN0ZXJlZC4KKyAgICBhdXRvIGl0ID0gbUxpc3RlbmVycy5iZWdpbigpOworICAgIHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGNzTGlzdGVuZXIgPSBudWxscHRyOworICAgIGZvciAoO2l0ICE9IG1MaXN0ZW5lcnMuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgaWYgKGhhcmR3YXJlOjppbnRlcmZhY2VzRXF1YWwoaXQtPmZpcnN0LCBoTGlzdGVuZXIpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoaXQgIT0gbUxpc3RlbmVycy5lbmQoKSkgeworICAgICAgICBjc0xpc3RlbmVyID0gaXQtPnNlY29uZDsKKyAgICAgICAgaWYgKHNob3VsZFJlbW92ZSkgeworICAgICAgICAgIG1MaXN0ZW5lcnMuZXJhc2UoaXQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjc0xpc3RlbmVyOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYVNlcnZpY2U6OmFkZExpc3RlbmVyKGNvbnN0IHNwPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+JiBoQ3NMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTGlzdGVuZXJfY2IgX2hpZGxfY2IpIHsKKyAgICBpZiAobUFpZGxJQ2FtZXJhU2VydmljZSA9PSBudWxscHRyKSB7CisgICAgICAgIF9oaWRsX2NiKEhTdGF0dXM6OlVOS05PV05fRVJST1IsIHt9KTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgaWYgKGhDc0xpc3RlbmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzIGxpc3RlbmVyIG11c3Qgbm90IGJlIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBfaGlkbF9jYihIU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5ULCB7fSk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBjc0xpc3RlbmVyID0gbnVsbHB0cjsKKyAgICAvLyBDaGVjayB0aGUgY2FjaGUgZm9yIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCBjYWxsYmFja3MKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1MaXN0ZW5lckxpc3RMb2NrKTsKKyAgICAgICAgY3NMaXN0ZW5lciA9IHNlYXJjaExpc3RlbmVyQ2FjaGVMb2NrZWQoaENzTGlzdGVuZXIpOworICAgICAgICBpZiAoY3NMaXN0ZW5lciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBXcmFwIGFuIGhDc0xpc3RlbmVyIHdpdGggQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lciBhbmQgcGFzcyBpdCB0bworICAgICAgICAgICAgLy8gQ2FtZXJhU2VydmljZS4KKyAgICAgICAgICAgIGNzTGlzdGVuZXIgPSBuZXcgSDJCQ2FtZXJhU2VydmljZUxpc3RlbmVyKGhDc0xpc3RlbmVyKTsKKyAgICAgICAgICAgIC8vIEFkZCB0byBjYWNoZQorICAgICAgICAgICAgYWRkVG9MaXN0ZW5lckNhY2hlTG9ja2VkKGhDc0xpc3RlbmVyLCBjc0xpc3RlbmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVHJ5aW5nIHRvIGFkZCBhIGxpc3RlbmVyICVwIGFscmVhZHkgcmVnaXN0ZXJlZCIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGhDc0xpc3RlbmVyLmdldCgpKTsKKyAgICAgICAgICAgIF9oaWRsX2NiKEhTdGF0dXM6OklMTEVHQUxfQVJHVU1FTlQsIHt9KTsKKyAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0YXR1cz4gY2FtZXJhU3RhdHVzQW5kSWRze307CisgICAgYmluZGVyOjpTdGF0dXMgc2VydmljZVJldCA9CisgICAgICAgIG1BaWRsSUNhbWVyYVNlcnZpY2UtPmFkZExpc3RlbmVySGVscGVyKGNzTGlzdGVuZXIsICZjYW1lcmFTdGF0dXNBbmRJZHMsIHRydWUpOworICAgIEhTdGF0dXMgc3RhdHVzID0gSFN0YXR1czo6Tk9fRVJST1I7CisgICAgaWYgKCFzZXJ2aWNlUmV0LmlzT2soKSkgeworICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gYWRkIGNhbWVyYSBkZXZpY2Ugc3RhdHVzIGxpc3RlbmVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgIHN0YXR1cyA9IEIySFN0YXR1cyhzZXJ2aWNlUmV0KTsKKyAgICAgIF9oaWRsX2NiKHN0YXR1cywge30pOworICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgaGlkbF92ZWM8SENhbWVyYVN0YXR1c0FuZElkPiBoQ2FtZXJhU3RhdHVzQW5kSWRzOworICAgIC8vQ29udmVydCBjYW1lcmFTdGF0dXNBbmRJZHMgdG8gSElETCBhbmQgY2FsbCBjYWxsYmFjaworICAgIGNvbnZlcnRUb0hpZGwoY2FtZXJhU3RhdHVzQW5kSWRzLCAmaENhbWVyYVN0YXR1c0FuZElkcyk7CisgICAgX2hpZGxfY2Ioc3RhdHVzLCBoQ2FtZXJhU3RhdHVzQW5kSWRzKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48SFN0YXR1cz4gSGlkbENhbWVyYVNlcnZpY2U6OnJlbW92ZUxpc3RlbmVyKGNvbnN0IHNwPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+JiBoQ3NMaXN0ZW5lcikgeworICAgIGlmIChoQ3NMaXN0ZW5lciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcyBsaXN0ZW5lciBtdXN0IG5vdCBiZSBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEhTdGF0dXM6OklMTEVHQUxfQVJHVU1FTlQ7CisgICAgfQorICAgIHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGNzTGlzdGVuZXIgPSBudWxscHRyOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxpc3RlbmVyTGlzdExvY2spOworICAgICAgICBjc0xpc3RlbmVyID0gc2VhcmNoTGlzdGVuZXJDYWNoZUxvY2tlZChoQ3NMaXN0ZW5lciwgLypyZW1vdmVJZkZvdW5kKi90cnVlKTsKKyAgICB9CisgICAgaWYgKGNzTGlzdGVuZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgIG1BaWRsSUNhbWVyYVNlcnZpY2UtPnJlbW92ZUxpc3RlbmVyKGNzTGlzdGVuZXIpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlcyBSZW1vdmluZyB1bnJlZ2lzdGVyZWQgbGlzdGVuZXIgJXAiLCBfX0ZVTkNUSU9OX18sIGhDc0xpc3RlbmVyLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIEhTdGF0dXM6OklMTEVHQUxfQVJHVU1FTlQ7CisgICAgfQorICAgIHJldHVybiBIU3RhdHVzOjpOT19FUlJPUjsKK30KKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFTZXJ2aWNlOjpnZXRDYW1lcmFWZW5kb3JUYWdTZWN0aW9ucyhnZXRDYW1lcmFWZW5kb3JUYWdTZWN0aW9uc19jYiBfaGlkbF9jYikgeworICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZT4gZ0NhY2hlID0gVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlOjpnZXRHbG9iYWxWZW5kb3JUYWdDYWNoZSgpOworICAgIGlmIChnQ2FjaGUgPT0gbnVsbHB0cikgeworICAgICAgICBfaGlkbF9jYihIU3RhdHVzOjpVTktOT1dOX0VSUk9SLCB7fSk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxtZXRhZGF0YV92ZW5kb3JfaWRfdCwgc3A8YW5kcm9pZDo6VmVuZG9yVGFnRGVzY3JpcHRvcj4+CisgICAgICAgICAgICAmdmVuZG9ySWRzQW5kVGFnRGVzY3MgPSBnQ2FjaGUtPmdldFZlbmRvcklkc0FuZFRhZ0Rlc2NyaXB0b3JzKCk7CisgICAgaWYgKHZlbmRvcklkc0FuZFRhZ0Rlc2NzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIF9oaWRsX2NiKEhTdGF0dXM6OlVOS05PV05fRVJST1IsIHt9KTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBoaWRsX3ZlYzxIUHJvdmlkZXJJZEFuZFZlbmRvclRhZ1NlY3Rpb25zPiBoVGFnSWRzQW5kVmVuZG9yVGFnU2VjdGlvbnM7CisgICAgaFRhZ0lkc0FuZFZlbmRvclRhZ1NlY3Rpb25zLnJlc2l6ZSh2ZW5kb3JJZHNBbmRUYWdEZXNjcy5zaXplKCkpOworICAgIHNpemVfdCBqID0gMDsKKyAgICBmb3IgKGF1dG8gJnZlbmRvcklkQW5kVGFnRGVzY3MgOiB2ZW5kb3JJZHNBbmRUYWdEZXNjcykgeworICAgICAgICBoaWRsX3ZlYzxIVmVuZG9yVGFnU2VjdGlvbj4gaFZlbmRvclRhZ1NlY3Rpb25zOworICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiBkZXNjID0gdmVuZG9ySWRBbmRUYWdEZXNjcy5zZWNvbmQ7CisgICAgICAgIGNvbnN0IFNvcnRlZFZlY3RvcjxTdHJpbmc4Piogc2VjdGlvbk5hbWVzID0gZGVzYy0+Z2V0QWxsU2VjdGlvbk5hbWVzKCk7CisgICAgICAgIHNpemVfdCBudW1TZWN0aW9ucyA9IHNlY3Rpb25OYW1lcy0+c2l6ZSgpOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxIVmVuZG9yVGFnPj4gdGFnc0J5U2VjdGlvbihudW1TZWN0aW9ucyk7CisgICAgICAgIGludCB0YWdDb3VudCA9IGRlc2MtPmdldFRhZ0NvdW50KCk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiB0YWdzKHRhZ0NvdW50KTsKKyAgICAgICAgZGVzYy0+Z2V0VGFnQXJyYXkodGFncy5kYXRhKCkpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhZ0NvdW50OyBpKyspIHsKKyAgICAgICAgICAgIEhWZW5kb3JUYWcgdnQ7CisgICAgICAgICAgICB2dC50YWdJZCA9IHRhZ3NbaV07CisgICAgICAgICAgICB2dC50YWdOYW1lID0gZGVzYy0+Z2V0VGFnTmFtZSh0YWdzW2ldKTsKKyAgICAgICAgICAgIHZ0LnRhZ1R5cGUgPSAoSENhbWVyYU1ldGFkYXRhVHlwZSkgZGVzYy0+Z2V0VGFnVHlwZSh0YWdzW2ldKTsKKyAgICAgICAgICAgIHNzaXplX3Qgc2VjdGlvbklkeCA9IGRlc2MtPmdldFNlY3Rpb25JbmRleCh0YWdzW2ldKTsKKyAgICAgICAgICAgIHRhZ3NCeVNlY3Rpb25bc2VjdGlvbklkeF0ucHVzaF9iYWNrKHZ0KTsKKyAgICAgICAgfQorICAgICAgICBoVmVuZG9yVGFnU2VjdGlvbnMucmVzaXplKG51bVNlY3Rpb25zKTsKKyAgICAgICAgZm9yIChzaXplX3QgcyA9IDA7IHMgPCBudW1TZWN0aW9uczsgcysrKSB7CisgICAgICAgICAgICBoVmVuZG9yVGFnU2VjdGlvbnNbc10uc2VjdGlvbk5hbWUgPSAoKnNlY3Rpb25OYW1lcylbc10uc3RyaW5nKCk7CisgICAgICAgICAgICBoVmVuZG9yVGFnU2VjdGlvbnNbc10udGFncyA9IHRhZ3NCeVNlY3Rpb25bc107CisgICAgICAgIH0KKyAgICAgICAgSFByb3ZpZGVySWRBbmRWZW5kb3JUYWdTZWN0aW9ucyAmaFByb3ZpZGVySWRBbmRWZW5kb3JUYWdTZWN0aW9ucyA9CisgICAgICAgICAgICAgICAgaFRhZ0lkc0FuZFZlbmRvclRhZ1NlY3Rpb25zW2pdOworICAgICAgICBoUHJvdmlkZXJJZEFuZFZlbmRvclRhZ1NlY3Rpb25zLnByb3ZpZGVySWQgPSB2ZW5kb3JJZEFuZFRhZ0Rlc2NzLmZpcnN0OworICAgICAgICBoUHJvdmlkZXJJZEFuZFZlbmRvclRhZ1NlY3Rpb25zLnZlbmRvclRhZ1NlY3Rpb25zID0gc3RkOjptb3ZlKGhWZW5kb3JUYWdTZWN0aW9ucyk7CisgICAgICAgIGorKzsKKyAgICB9CisgICAgX2hpZGxfY2IoSFN0YXR1czo6Tk9fRVJST1IsIGhUYWdJZHNBbmRWZW5kb3JUYWdTZWN0aW9ucyk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworfSAvLyBpbXBsZW1lbnRhdGlvbgorfSAvLyBWMl8wCit9IC8vIHNlcnZpY2UKK30gLy8gY2FtZXJhc2VydmljZQorfSAvLyBmcmFtZXdvcmtzCit9IC8vIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhU2VydmljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlYWQwYmMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmgKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9GUkFNRVdPUktTX0NBTUVSQVNFUlZJQ0VfVjJfMF9DQU1FUkFTRVJWSUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9GUkFNRVdPUktTX0NBTUVSQVNFUlZJQ0VfVjJfMF9DQU1FUkFTRVJWSUNFX0gKKworI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2NvbW1vbi8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC9JQ2FtZXJhU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC90eXBlcy5oPgorCisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKworI2luY2x1ZGUgPENhbWVyYVNlcnZpY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZyYW1ld29ya3MgeworbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UgeworbmFtZXNwYWNlIHNlcnZpY2UgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgaGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI7Cit1c2luZyBoYXJkd2FyZTo6UmV0dXJuOworCit1c2luZyBIQ2FtZXJhRGV2aWNlQ2FsbGJhY2sgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OklDYW1lcmFEZXZpY2VDYWxsYmFjazsKK3VzaW5nIEhDYW1lcmFNZXRhZGF0YSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYU1ldGFkYXRhOwordXNpbmcgSENhbWVyYVNlcnZpY2UgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpJQ2FtZXJhU2VydmljZTsKK3VzaW5nIEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXIgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyOwordXNpbmcgSFN0YXR1cyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6U3RhdHVzOwordXNpbmcgSENhbWVyYVN0YXR1c0FuZElkID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhU3RhdHVzQW5kSWQ7CisKK3N0cnVjdCBIaWRsQ2FtZXJhU2VydmljZSBmaW5hbCA6IHB1YmxpYyBIQ2FtZXJhU2VydmljZSB7CisKKyAgICB+SGlkbENhbWVyYVNlcnZpY2UoKSB7IH07CisKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMi4wOjpJQ2FtZXJhU2VydmljZSBmb2xsb3cuCisKKyAgICBSZXR1cm48dm9pZD4gY29ubmVjdERldmljZShjb25zdCBzcDxIQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgY2FtZXJhSWQsIGNvbm5lY3REZXZpY2VfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgUmV0dXJuPHZvaWQ+IGFkZExpc3RlbmVyKGNvbnN0IHNwPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkTGlzdGVuZXJfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgUmV0dXJuPEhTdGF0dXM+IHJlbW92ZUxpc3RlbmVyKGNvbnN0IHNwPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+JiBsaXN0ZW5lcikgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48dm9pZD4gZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNvbnN0IGhpZGxfc3RyaW5nJiBjYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENhbWVyYUNoYXJhY3RlcmlzdGljc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48dm9pZD4gZ2V0Q2FtZXJhVmVuZG9yVGFnU2VjdGlvbnMoZ2V0Q2FtZXJhVmVuZG9yVGFnU2VjdGlvbnNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgLy8gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IHRoZSBjYW1lcmFzZXJ2ZXJzIG1haW4gdGhyZWFkIHRvCisgICAgLy8gaW5zdGFudGlhdGUgdGhlIGhpZGwgY2FtZXJhc2VydmVyLgorICAgIHN0YXRpYyBzcDxIaWRsQ2FtZXJhU2VydmljZT4gZ2V0SW5zdGFuY2UoYW5kcm9pZDo6Q2FtZXJhU2VydmljZSAqY3MpOworCitwcml2YXRlOgorICAgIEhpZGxDYW1lcmFTZXJ2aWNlKGFuZHJvaWQ6OkNhbWVyYVNlcnZpY2UgKmNzKSA6IG1BaWRsSUNhbWVyYVNlcnZpY2UoY3MpIHsgfTsKKworICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBzZWFyY2hMaXN0ZW5lckNhY2hlTG9ja2VkKAorICAgICAgICBzcDxIQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBsaXN0ZW5lciwgLypyZW1vdmVJZkZvdW5kKi8gYm9vbCBzaG91bGRSZW1vdmUgPSBmYWxzZSk7CisKKyAgICB2b2lkIGFkZFRvTGlzdGVuZXJDYWNoZUxvY2tlZChzcDxIQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBoTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGNzTGlzdGVuZXIpOworCisgICAgYW5kcm9pZDo6Q2FtZXJhU2VydmljZSAqY29uc3QgbUFpZGxJQ2FtZXJhU2VydmljZSA9IG51bGxwdHI7CisKKyAgICBNdXRleCBtTGlzdGVuZXJMaXN0TG9jazsKKworICAgIHVzaW5nIEhJTGlzdGVuZXJzID0KKyAgICAgICAgc3RkOjpwYWlyPHNwPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+LCBzcDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyPj47CisgICAgc3RkOjpsaXN0PEhJTGlzdGVuZXJzPiBtTGlzdGVuZXJzOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIHNlcnZpY2UKK30gIC8vIG5hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlCit9ICAvLyBuYW1lc3BhY2UgZnJhbWV3b3JrcworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0ZSQU1FV09SS1NfQ0FNRVJBU0VSVklDRV9WMl8wX0NBTUVSQVNFUlZJQ0VfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQubWsKaW5kZXggZjc3MDY5Yy4uYjRlN2MzMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQW5kcm9pZC5taworKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9BbmRyb2lkLm1rCkBAIC0yNywxNyArMjcsMjQgQEAKICAgICBsaWJjYW1lcmFfY2xpZW50IFwKICAgICBsaWJjYW1lcmFfbWV0YWRhdGEgXAogICAgIGxpYnV0aWxzIFwKKyAgICBsaWJqcGVnIFwKKyAgICBsaWJleGlmIFwKICAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5jb21tb25AMS4wIFwKICAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjQgXAorICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNSBcCiAgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDEuMCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMgorICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjIgXAorICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjQKIAogTE9DQUxfQ19JTkNMVURFUyArPSBcCiAgICAgc3lzdGVtL21lZGlhL3ByaXZhdGUvY2FtZXJhL2luY2x1ZGUgXAorICAgIGV4dGVybmFsL2R5bmFtaWNfZGVwdGgvaW5jbHVkZXMgXAorICAgIGV4dGVybmFsL2R5bmFtaWNfZGVwdGgvaW50ZXJuYWwgXAogCiBMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdleHRyYSAtV2Vycm9yCiAKIExPQ0FMX01PRFVMRTo9IGNhbWVyYXNlcnZpY2VfdGVzdAorTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURSA6PSBkZXZpY2UtdGVzdHMKIExPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCiAKIGluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0NhbWVyYVByb3ZpZGVyTWFuYWdlclRlc3QuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyVGVzdC5jcHAKaW5kZXggZWY5M2Q5YS4uZjQ3ZTVhNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyVGVzdC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyVGVzdC5jcHAKQEAgLTMzLDYgKzMzLDcgQEAKIHVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhTWV0YWRhdGFUeXBlOwogdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s7CiB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VTZXNzaW9uOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlOwogCiAvKioKICAqIEJhc2ljIHRlc3QgaW1wbGVtZW50YXRpb24gb2YgYSBjYW1lcmEgdmVyLiAzLjIgZGV2aWNlIGludGVyZmFjZQpAQCAtODcsNyArODgsNyBAQAogLyoqCiAgKiBCYXNpYyB0ZXN0IGltcGxlbWVudGF0aW9uIG9mIGEgY2FtZXJhIHByb3ZpZGVyCiAgKi8KLXN0cnVjdCBUZXN0SUNhbWVyYVByb3ZpZGVyIDogdmlydHVhbCBwdWJsaWMgcHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlciB7CitzdHJ1Y3QgVGVzdElDYW1lcmFQcm92aWRlciA6IHZpcnR1YWwgcHVibGljIHByb3ZpZGVyOjpWMl81OjpJQ2FtZXJhUHJvdmlkZXIgewogICAgIHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXJDYWxsYmFjaz4gbUNhbGxiYWNrczsKICAgICBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6aGlkbF9zdHJpbmc+IG1EZXZpY2VOYW1lczsKICAgICBzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+IG1EZXZpY2VJbnRlcmZhY2U7CkBAIC0xMDEsNiArMTAyLDcgQEAKIAogICAgIHZpcnR1YWwgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHNldENhbGxiYWNrKAogICAgICAgICAgICAgY29uc3Qgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlckNhbGxiYWNrPiYgY2FsbGJhY2tzKSBvdmVycmlkZSB7CisgICAgICAgIG1DYWxsZWRDb3VudGVyW1NFVF9DQUxMQkFDS10rKzsKICAgICAgICAgbUNhbGxiYWNrcyA9IGNhbGxiYWNrczsKICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPihTdGF0dXM6Ok9LKTsKICAgICB9CkBAIC0xMDgsNiArMTEwLDcgQEAKICAgICB1c2luZyBnZXRWZW5kb3JUYWdzX2NiID0gc3RkOjpmdW5jdGlvbjx2b2lkKFN0YXR1cyBzdGF0dXMsCiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8Y29tbW9uOjpWMV8wOjpWZW5kb3JUYWdTZWN0aW9uPiYgc2VjdGlvbnMpPjsKICAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IGdldFZlbmRvclRhZ3MoZ2V0VmVuZG9yVGFnc19jYiBfaGlkbF9jYikgb3ZlcnJpZGUgeworICAgICAgICBtQ2FsbGVkQ291bnRlcltHRVRfVkVORE9SX1RBR1NdKys7CiAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6T0ssIG1WZW5kb3JUYWdTZWN0aW9ucyk7CiAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwogICAgIH0KQEAgLTExNyw2ICsxMjAsNyBAQAogICAgICAgICAgICAgIGJvb2wgc3VwcG9ydCk+OwogICAgIHZpcnR1YWwgOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IGlzU2V0VG9yY2hNb2RlU3VwcG9ydGVkKAogICAgICAgICAgICAgaXNTZXRUb3JjaE1vZGVTdXBwb3J0ZWRfY2IgX2hpZGxfY2IpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNhbGxlZENvdW50ZXJbSVNfU0VUX1RPUkNIX01PREVfU1VQUE9SVEVEXSsrOwogICAgICAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCBmYWxzZSk7CiAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwogICAgIH0KQEAgLTEyNCw2ICsxMjgsNyBAQAogICAgIHVzaW5nIGdldENhbWVyYUlkTGlzdF9jYiA9IHN0ZDo6ZnVuY3Rpb248dm9pZChTdGF0dXMgc3RhdHVzLAogICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpoaWRsX3N0cmluZz4mIGNhbWVyYURldmljZU5hbWVzKT47CiAgICAgdmlydHVhbCBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IGdldENhbWVyYUlkTGlzdChnZXRDYW1lcmFJZExpc3RfY2IgX2hpZGxfY2IpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNhbGxlZENvdW50ZXJbR0VUX0NBTUVSQV9JRF9MSVNUXSsrOwogICAgICAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCBtRGV2aWNlTmFtZXMpOwogICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKICAgICB9CkBAIC0xNDgsNiArMTUzLDI1IEBACiAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwogICAgIH0KIAorICAgIHZpcnR1YWwgaGFyZHdhcmU6OlJldHVybjx2b2lkPiBub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZSgKKyAgICAgICAgICAgIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPERldmljZVN0YXRlPiBuZXdTdGF0ZSkgb3ZlcnJpZGUgeworICAgICAgICBtQ2FsbGVkQ291bnRlcltOT1RJRllfREVWSUNFX1NUQVRFXSsrOworICAgICAgICBtQ3VycmVudFN0YXRlID0gbmV3U3RhdGU7CisgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgIH0KKworICAgIGVudW0gTWV0aG9kTmFtZXMgeworICAgICAgICBTRVRfQ0FMTEJBQ0ssCisgICAgICAgIEdFVF9WRU5ET1JfVEFHUywKKyAgICAgICAgSVNfU0VUX1RPUkNIX01PREVfU1VQUE9SVEVELAorICAgICAgICBOT1RJRllfREVWSUNFX1NUQVRFLAorICAgICAgICBHRVRfQ0FNRVJBX0lEX0xJU1QsCisKKyAgICAgICAgTUVUSE9EX05BTUVfQ09VTlQKKyAgICB9OworICAgIGludCBtQ2FsbGVkQ291bnRlcltNRVRIT0RfTkFNRV9DT1VOVF0gezB9OworCisgICAgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8RGV2aWNlU3RhdGU+IG1DdXJyZW50U3RhdGUgPSAweEZGRkZGRkZGOyAvLyBVbmxpa2VseSB0byBiZSBhIHJlYWwgc3RhdGUKIH07CiAKIC8qKgpAQCAtMTYzLDcgKzE4Nyw3IEBACiAgICAgICAgIG1UZXN0Q2FtZXJhUHJvdmlkZXIgPSBwcm92aWRlcjsKICAgICB9CiAKLSAgICBzdGQ6OnN0cmluZyBtTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lczsKIAogICAgIHZpcnR1YWwgflRlc3RJbnRlcmFjdGlvblByb3h5KCkge30KIApAQCAtMTc3LDcgKzIwMSw3IEBACiAKICAgICB2aXJ0dWFsIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IGdldFNlcnZpY2UoCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc2VydmljZU5hbWUpIG92ZXJyaWRlIHsKLSAgICAgICAgbUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZSA9IHNlcnZpY2VOYW1lOworICAgICAgICBtTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lcy5wdXNoX2JhY2soc2VydmljZU5hbWUpOwogICAgICAgICByZXR1cm4gbVRlc3RDYW1lcmFQcm92aWRlcjsKICAgICB9CiAKQEAgLTIwOSwxMCArMjMzLDM0IEBACiAKICAgICByZXMgPSBwcm92aWRlck1hbmFnZXItPmluaXRpYWxpemUoc3RhdHVzTGlzdGVuZXIsICZzZXJ2aWNlUHJveHkpOwogICAgIEFTU0VSVF9FUShyZXMsIE9LKSA8PCAiVW5hYmxlIHRvIGluaXRpYWxpemUgcHJvdmlkZXIgbWFuYWdlciI7CisgICAgLy8gQ2hlY2sgdGhhdCBib3RoICJsZWdhY3kiIGFuZCAiZXh0ZXJuYWwiIHByb3ZpZGVycyAocmVhbGx5IHRoZSBzYW1lIG9iamVjdCkgYXJlIGNhbGxlZAorICAgIC8vIG9uY2UgZm9yIGFsbCB0aGUgaW5pdCBtZXRob2RzCisgICAgRVhQRUNUX0VRKHByb3ZpZGVyLT5tQ2FsbGVkQ291bnRlcltUZXN0SUNhbWVyYVByb3ZpZGVyOjpTRVRfQ0FMTEJBQ0tdLCAyKSA8PAorICAgICAgICAgICAgIk9ubHkgb25lIGNhbGwgdG8gc2V0Q2FsbGJhY2sgcGVyIHByb3ZpZGVyIGV4cGVjdGVkIGR1cmluZyBpbml0IjsKKyAgICBFWFBFQ1RfRVEocHJvdmlkZXItPm1DYWxsZWRDb3VudGVyW1Rlc3RJQ2FtZXJhUHJvdmlkZXI6OkdFVF9WRU5ET1JfVEFHU10sIDIpIDw8CisgICAgICAgICAgICAiT25seSBvbmUgY2FsbCB0byBnZXRWZW5kb3JUYWdzIHBlciBwcm92aWRlciBleHBlY3RlZCBkdXJpbmcgaW5pdCI7CisgICAgRVhQRUNUX0VRKHByb3ZpZGVyLT5tQ2FsbGVkQ291bnRlcltUZXN0SUNhbWVyYVByb3ZpZGVyOjpJU19TRVRfVE9SQ0hfTU9ERV9TVVBQT1JURURdLCAyKSA8PAorICAgICAgICAgICAgIk9ubHkgb25lIGNhbGwgdG8gaXNTZXRUb3JjaE1vZGVTdXBwb3J0ZWQgcGVyIHByb3ZpZGVyIGV4cGVjdGVkIGR1cmluZyBpbml0IjsKKyAgICBFWFBFQ1RfRVEocHJvdmlkZXItPm1DYWxsZWRDb3VudGVyW1Rlc3RJQ2FtZXJhUHJvdmlkZXI6OkdFVF9DQU1FUkFfSURfTElTVF0sIDIpIDw8CisgICAgICAgICAgICAiT25seSBvbmUgY2FsbCB0byBnZXRDYW1lcmFJZExpc3QgcGVyIHByb3ZpZGVyIGV4cGVjdGVkIGR1cmluZyBpbml0IjsKKyAgICBFWFBFQ1RfRVEocHJvdmlkZXItPm1DYWxsZWRDb3VudGVyW1Rlc3RJQ2FtZXJhUHJvdmlkZXI6Ok5PVElGWV9ERVZJQ0VfU1RBVEVdLCAyKSA8PAorICAgICAgICAgICAgIk9ubHkgb25lIGNhbGwgdG8gbm90aWZ5RGV2aWNlU3RhdGUgcGVyIHByb3ZpZGVyIGV4cGVjdGVkIGR1cmluZyBpbml0IjsKIAotICAgIGhhcmR3YXJlOjpoaWRsX3N0cmluZyBsZWdhY3lJbnN0YW5jZU5hbWUgPSAibGVnYWN5LzAiOwotICAgIEFTU0VSVF9FUShzZXJ2aWNlUHJveHkubUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZSwgbGVnYWN5SW5zdGFuY2VOYW1lKSA8PAorICAgIHN0ZDo6c3RyaW5nIGxlZ2FjeUluc3RhbmNlTmFtZSA9ICJsZWdhY3kvMCI7CisgICAgc3RkOjpzdHJpbmcgZXh0ZXJuYWxJbnN0YW5jZU5hbWUgPSAiZXh0ZXJuYWwvMCI7CisgICAgYm9vbCBnb3RMZWdhY3kgPSBmYWxzZTsKKyAgICBib29sIGdvdEV4dGVybmFsID0gZmFsc2U7CisgICAgRVhQRUNUX0VRKDJ1LCBzZXJ2aWNlUHJveHkubUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZXMuc2l6ZSgpKSA8PAorICAgICAgICAgICAgIk9ubHkgdHdvIHNlcnZpY2UgcXVlcmllcyBleHBlY3RlZCB0byBiZSBzZWVuIGJ5IGhhcmR3YXJlIHNlcnZpY2UgbWFuYWdlciI7CisKKyAgICBmb3IgKGF1dG8mIHNlcnZpY2VOYW1lIDogc2VydmljZVByb3h5Lm1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWVzKSB7CisgICAgICAgIGlmIChzZXJ2aWNlTmFtZSA9PSBsZWdhY3lJbnN0YW5jZU5hbWUpIGdvdExlZ2FjeSA9IHRydWU7CisgICAgICAgIGlmIChzZXJ2aWNlTmFtZSA9PSBleHRlcm5hbEluc3RhbmNlTmFtZSkgZ290RXh0ZXJuYWwgPSB0cnVlOworICAgIH0KKyAgICBBU1NFUlRfVFJVRShnb3RMZWdhY3kpIDw8CiAgICAgICAgICAgICAiTGVnYWN5IGluc3RhbmNlIG5vdCByZXF1ZXN0ZWQgZnJvbSBzZXJ2aWNlIG1hbmFnZXIiOworICAgIEFTU0VSVF9UUlVFKGdvdEV4dGVybmFsKSA8PAorICAgICAgICAgICAgIkV4dGVybmFsIGluc3RhbmNlIG5vdCByZXF1ZXN0ZWQgZnJvbSBzZXJ2aWNlIG1hbmFnZXIiOwogCiAgICAgaGFyZHdhcmU6OmhpZGxfc3RyaW5nIHRlc3RQcm92aWRlckZxSW50ZXJmYWNlTmFtZSA9CiAgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40OjpJQ2FtZXJhUHJvdmlkZXIiOwpAQCAtMjIxLDcgKzI2OSw3IEBACiAgICAgICAgICAgICB0ZXN0UHJvdmlkZXJGcUludGVyZmFjZU5hbWUsCiAgICAgICAgICAgICB0ZXN0UHJvdmlkZXJJbnN0YW5jZU5hbWUsIGZhbHNlKTsKIAotICAgIEFTU0VSVF9FUShzZXJ2aWNlUHJveHkubUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZSwgdGVzdFByb3ZpZGVySW5zdGFuY2VOYW1lKSA8PAorICAgIEFTU0VSVF9FUShzZXJ2aWNlUHJveHkubUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZXMuYmFjaygpLCB0ZXN0UHJvdmlkZXJJbnN0YW5jZU5hbWUpIDw8CiAgICAgICAgICAgICAiSW5jb3JyZWN0IGluc3RhbmNlIHJlcXVlc3RlZCBmcm9tIHNlcnZpY2UgbWFuYWdlciI7CiB9CiAKQEAgLTI1NSw3ICszMDMsNyBAQAogICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNDo6SUNhbWVyYVByb3ZpZGVyIjsKICAgICBzZXJ2aWNlUHJveHkubU1hbmFnZXJOb3RpZmljYXRpb25JbnRlcmZhY2UtPm9uUmVnaXN0cmF0aW9uKAogICAgICAgICAgICAgdGVzdFByb3ZpZGVyRnFJbnRlcmZhY2VOYW1lLCB0ZXN0UHJvdmlkZXJJbnN0YW5jZU5hbWUsIGZhbHNlKTsKLSAgICBBU1NFUlRfRVEoc2VydmljZVByb3h5Lm1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWUsIHRlc3RQcm92aWRlckluc3RhbmNlTmFtZSkgPDwKKyAgICBBU1NFUlRfRVEoc2VydmljZVByb3h5Lm1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWVzLmJhY2soKSwgdGVzdFByb3ZpZGVySW5zdGFuY2VOYW1lKSA8PAogICAgICAgICAgICAgIkluY29ycmVjdCBpbnN0YW5jZSByZXF1ZXN0ZWQgZnJvbSBzZXJ2aWNlIG1hbmFnZXIiOwogCiAgICAgaGFyZHdhcmU6OmhpZGxfc3RyaW5nIHNlY3Rpb25OYW1lU2Vjb25kID0gIlNlY29uZFZlbmRvclRlc3RTZWN0aW9uIjsKQEAgLTI3Myw3ICszMjEsNyBAQAogICAgIGhhcmR3YXJlOjpoaWRsX3N0cmluZyB0ZXN0UHJvdmlkZXJTZWNvbmRJbnN0YW5jZU5hbWUgPSAidGVzdDIvMCI7CiAgICAgc2VydmljZVByb3h5Lm1NYW5hZ2VyTm90aWZpY2F0aW9uSW50ZXJmYWNlLT5vblJlZ2lzdHJhdGlvbigKICAgICAgICAgICAgIHRlc3RQcm92aWRlckZxSW50ZXJmYWNlTmFtZSwgdGVzdFByb3ZpZGVyU2Vjb25kSW5zdGFuY2VOYW1lLCBmYWxzZSk7Ci0gICAgQVNTRVJUX0VRKHNlcnZpY2VQcm94eS5tTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lLAorICAgIEFTU0VSVF9FUShzZXJ2aWNlUHJveHkubUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZXMuYmFjaygpLAogICAgICAgICAgICAgICB0ZXN0UHJvdmlkZXJTZWNvbmRJbnN0YW5jZU5hbWUpIDw8CiAgICAgICAgICAgICAiSW5jb3JyZWN0IGluc3RhbmNlIHJlcXVlc3RlZCBmcm9tIHNlcnZpY2UgbWFuYWdlciI7CiAKQEAgLTM2NiwzICs0MTQsMzUgQEAKICAgICBtZXRhZGF0YUNvcHkuZHVtcCgxLCAyKTsKICAgICBzZWNvbmRNZXRhZGF0YS5kdW1wKDEsIDIpOwogfQorCitURVNUKENhbWVyYVByb3ZpZGVyTWFuYWdlclRlc3QsIE5vdGlmeVN0YXRlQ2hhbmdlVGVzdCkgeworICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpoaWRsX3N0cmluZz4gZGV2aWNlTmFtZXMgeworICAgICAgICAiZGV2aWNlQDMuMi90ZXN0LzAiLAorICAgICAgICAiZGV2aWNlQDEuMC90ZXN0LzAiLAorICAgICAgICAiZGV2aWNlQDMuMi90ZXN0LzEifTsKKworICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxjb21tb246OlYxXzA6OlZlbmRvclRhZ1NlY3Rpb24+IHZlbmRvclNlY3Rpb247CisgICAgc3RhdHVzX3QgcmVzOworICAgIHNwPENhbWVyYVByb3ZpZGVyTWFuYWdlcj4gcHJvdmlkZXJNYW5hZ2VyID0gbmV3IENhbWVyYVByb3ZpZGVyTWFuYWdlcigpOworICAgIHNwPFRlc3RTdGF0dXNMaXN0ZW5lcj4gc3RhdHVzTGlzdGVuZXIgPSBuZXcgVGVzdFN0YXR1c0xpc3RlbmVyKCk7CisgICAgVGVzdEludGVyYWN0aW9uUHJveHkgc2VydmljZVByb3h5OworICAgIHNwPFRlc3RJQ2FtZXJhUHJvdmlkZXI+IHByb3ZpZGVyID0gIG5ldyBUZXN0SUNhbWVyYVByb3ZpZGVyKGRldmljZU5hbWVzLAorICAgICAgICAgICAgdmVuZG9yU2VjdGlvbik7CisgICAgc2VydmljZVByb3h5LnNldFByb3ZpZGVyKHByb3ZpZGVyKTsKKworICAgIHJlcyA9IHByb3ZpZGVyTWFuYWdlci0+aW5pdGlhbGl6ZShzdGF0dXNMaXN0ZW5lciwgJnNlcnZpY2VQcm94eSk7CisgICAgQVNTRVJUX0VRKHJlcywgT0spIDw8ICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBwcm92aWRlciBtYW5hZ2VyIjsKKworICAgIEFTU0VSVF9FUShwcm92aWRlci0+bUN1cnJlbnRTdGF0ZSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPERldmljZVN0YXRlPj4oRGV2aWNlU3RhdGU6Ok5PUk1BTCkpCisgICAgICAgICAgICA8PCAiSW5pdGlhbCBkZXZpY2Ugc3RhdGUgbm90IHNldCI7CisKKyAgICByZXMgPSBwcm92aWRlck1hbmFnZXItPm5vdGlmeURldmljZVN0YXRlQ2hhbmdlKAorICAgICAgICBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxEZXZpY2VTdGF0ZT4+KERldmljZVN0YXRlOjpGT0xERUQpKTsKKworICAgIEFTU0VSVF9FUShyZXMsIE9LKSA8PCAiVW5hYmxlIHRvIGNhbGwgbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UiOworICAgIEFTU0VSVF9FUShwcm92aWRlci0+bUN1cnJlbnRTdGF0ZSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPERldmljZVN0YXRlPj4oRGV2aWNlU3RhdGU6OkZPTERFRCkpCisgICAgICAgICAgICA8PCAiVW5hYmxlIHRvIGNoYW5nZSBkZXZpY2Ugc3RhdGUiOworCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9EZXB0aFByb2Nlc3NvclRlc3QuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvRGVwdGhQcm9jZXNzb3JUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMTYyNTE0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvRGVwdGhQcm9jZXNzb3JUZXN0LmNwcApAQCAtMCwwICsxLDM4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkRlcHRoUHJvY2Vzc29yVGVzdCIKKworI2luY2x1ZGUgPGFycmF5PgorI2luY2x1ZGUgPHJhbmRvbT4KKworI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgIi4uL2NvbW1vbi9EZXB0aFBob3RvUHJvY2Vzc29yLmgiCisjaW5jbHVkZSAiLi4vdXRpbHMvRXhpZlV0aWxzLmgiCisjaW5jbHVkZSAiTlYxMkNvbXByZXNzb3IuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y2FtZXJhMzsKKworc3RhdGljIGNvbnN0IHNpemVfdCBrVGVzdEJ1ZmZlcldpZHRoID0gNjQwOworc3RhdGljIGNvbnN0IHNpemVfdCBrVGVzdEJ1ZmZlckhlaWdodCA9IDQ4MDsKK3N0YXRpYyBjb25zdCBzaXplX3Qga1Rlc3RCdWZmZXJOVjEyU2l6ZSAoKCgoa1Rlc3RCdWZmZXJXaWR0aCkgKiAoa1Rlc3RCdWZmZXJIZWlnaHQpKSAqIDMpIC8gMik7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtUZXN0QnVmZmVyRGVwdGhTaXplIChrVGVzdEJ1ZmZlcldpZHRoICoga1Rlc3RCdWZmZXJIZWlnaHQpOworc3RhdGljIGNvbnN0IHNpemVfdCBrU2VlZCA9IDEyMzQ7CisKK3ZvaWQgbGlua1RvRGVwdGhQaG90b0xpYnJhcnkodm9pZCAqKmxpYkhhbmRsZSAvKm91dCovLAorICAgICAgICBwcm9jZXNzX2RlcHRoX3Bob3RvX2ZyYW1lICpwcm9jZXNzRnJhbWVGdW5jIC8qb3V0Ki8pIHsKKyAgICBBU1NFUlRfTkUobGliSGFuZGxlLCBudWxscHRyKTsKKyAgICBBU1NFUlRfTkUocHJvY2Vzc0ZyYW1lRnVuYywgbnVsbHB0cik7CisKKyAgICAqbGliSGFuZGxlID0gZGxvcGVuKGtEZXB0aFBob3RvTGlicmFyeSwgUlRMRF9OT1cgfCBSVExEX0xPQ0FMKTsKKyAgICBpZiAoKmxpYkhhbmRsZSAhPSBudWxscHRyKSB7CisgICAgICAgICpwcm9jZXNzRnJhbWVGdW5jID0gcmVpbnRlcnByZXRfY2FzdDxjYW1lcmEzOjpwcm9jZXNzX2RlcHRoX3Bob3RvX2ZyYW1lPiAoCisgICAgICAgICAgICAgICAgZGxzeW0oKmxpYkhhbmRsZSwga0RlcHRoUGhvdG9Qcm9jZXNzRnVuY3Rpb24pKTsKKyAgICAgICAgQVNTRVJUX05FKCpwcm9jZXNzRnJhbWVGdW5jLCBudWxscHRyKTsKKyAgICB9Cit9CisKK3ZvaWQgZ2VuZXJhdGVDb2xvckpwZWdCdWZmZXIoaW50IGpwZWdRdWFsaXR5LCBFeGlmT3JpZW50YXRpb24gb3JpZW50YXRpb25WYWx1ZSwgYm9vbCBpbmNsdWRlRXhpZiwKKyAgICAgICAgYm9vbCBzd2l0Y2hEaW1lbnNpb25zLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqY29sb3JKcGVnQnVmZmVyIC8qb3V0Ki8pIHsKKyAgICBBU1NFUlRfTkUoY29sb3JKcGVnQnVmZmVyLCBudWxscHRyKTsKKworICAgIHN0ZDo6YXJyYXk8dWludDhfdCwga1Rlc3RCdWZmZXJOVjEyU2l6ZT4gY29sb3JTb3VyY2VCdWZmZXI7CisgICAgc3RkOjpkZWZhdWx0X3JhbmRvbV9lbmdpbmUgZ2VuKGtTZWVkKTsKKyAgICBzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxpbnQ+IHVuaURpc3QoMCwgVUlOVDhfTUFYIC0gMSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb2xvclNvdXJjZUJ1ZmZlci5zaXplKCk7IGkrKykgeworICAgICAgICBjb2xvclNvdXJjZUJ1ZmZlcltpXSA9IHVuaURpc3QoZ2VuKTsKKyAgICB9CisKKyAgICBzaXplX3Qgd2lkdGggPSBrVGVzdEJ1ZmZlcldpZHRoOworICAgIHNpemVfdCBoZWlnaHQgPSBrVGVzdEJ1ZmZlckhlaWdodDsKKyAgICBpZiAoc3dpdGNoRGltZW5zaW9ucykgeworICAgICAgICB3aWR0aCA9IGtUZXN0QnVmZmVySGVpZ2h0OworICAgICAgICBoZWlnaHQgPSBrVGVzdEJ1ZmZlcldpZHRoOworICAgIH0KKworICAgIE5WMTJDb21wcmVzc29yIGpwZWdDb21wcmVzc29yOworICAgIGlmIChpbmNsdWRlRXhpZikgeworICAgICAgICBBU1NFUlRfVFJVRShqcGVnQ29tcHJlc3Nvci5jb21wcmVzc1dpdGhFeGlmT3JpZW50YXRpb24oCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4gKGNvbG9yU291cmNlQnVmZmVyLmRhdGEoKSksIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAganBlZ1F1YWxpdHksIG9yaWVudGF0aW9uVmFsdWUpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfVFJVRShqcGVnQ29tcHJlc3Nvci5jb21wcmVzcygKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPiAoY29sb3JTb3VyY2VCdWZmZXIuZGF0YSgpKSwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICBqcGVnUXVhbGl0eSkpOworICAgIH0KKworICAgICpjb2xvckpwZWdCdWZmZXIgPSBzdGQ6Om1vdmUoanBlZ0NvbXByZXNzb3IuZ2V0Q29tcHJlc3NlZERhdGEoKSk7CisgICAgQVNTRVJUX0ZBTFNFKGNvbG9ySnBlZ0J1ZmZlci0+ZW1wdHkoKSk7Cit9CisKK3ZvaWQgZ2VuZXJhdGVEZXB0aDE2QnVmZmVyKHN0ZDo6YXJyYXk8dWludDE2X3QsIGtUZXN0QnVmZmVyRGVwdGhTaXplPiAqZGVwdGgxNkJ1ZmZlciAvKm91dCovKSB7CisgICAgQVNTRVJUX05FKGRlcHRoMTZCdWZmZXIsIG51bGxwdHIpOworICAgIHN0ZDo6ZGVmYXVsdF9yYW5kb21fZW5naW5lIGdlbihrU2VlZCsxKTsKKyAgICBzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxpbnQ+IHVuaURpc3QoMCwgVUlOVDE2X01BWCAtIDEpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGVwdGgxNkJ1ZmZlci0+c2l6ZSgpOyBpKyspIHsKKyAgICAgICAgKCpkZXB0aDE2QnVmZmVyKVtpXSA9IHVuaURpc3QoZ2VuKTsKKyAgICB9Cit9CisKK1RFU1QoRGVwdGhQcm9jZXNzb3JUZXN0LCBMaW5rVG9MaWJyYXkpIHsKKyAgICB2b2lkICpsaWJIYW5kbGU7CisgICAgcHJvY2Vzc19kZXB0aF9waG90b19mcmFtZSBwcm9jZXNzRnVuYzsKKyAgICBsaW5rVG9EZXB0aFBob3RvTGlicmFyeSgmbGliSGFuZGxlLCAmcHJvY2Vzc0Z1bmMpOworICAgIGlmIChsaWJIYW5kbGUgIT0gbnVsbHB0cikgeworICAgICAgICBkbGNsb3NlKGxpYkhhbmRsZSk7CisgICAgfQorfQorCitURVNUKERlcHRoUHJvY2Vzc29yVGVzdCwgQmFkSW5wdXQpIHsKKyAgICB2b2lkICpsaWJIYW5kbGU7CisgICAgaW50IGpwZWdRdWFsaXR5ID0gOTU7CisKKyAgICBwcm9jZXNzX2RlcHRoX3Bob3RvX2ZyYW1lIHByb2Nlc3NGdW5jOworICAgIGxpbmtUb0RlcHRoUGhvdG9MaWJyYXJ5KCZsaWJIYW5kbGUsICZwcm9jZXNzRnVuYyk7CisgICAgaWYgKGxpYkhhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIERlcHRoIGxpYnJhcnkgbm8gcHJlc2VudCwgbm90aGluZyBtb3JlIHRvIHRlc3QuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBEZXB0aFBob3RvSW5wdXRGcmFtZSBpbnB1dEZyYW1lOworICAgIC8vIFdvcnN0IGNhc2UgYm90aCBkZXB0aCBhbmQgY29uZmlkZW5jZSBtYXBzIGhhdmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgbWFpbiBjb2xvciBpbWFnZS4KKyAgICBpbnB1dEZyYW1lLm1NYXhKcGVnU2l6ZSA9IGlucHV0RnJhbWUubU1haW5KcGVnU2l6ZSAqIDM7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBjb2xvckpwZWdCdWZmZXI7CisgICAgZ2VuZXJhdGVDb2xvckpwZWdCdWZmZXIoanBlZ1F1YWxpdHksIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fVU5ERUZJTkVELAorICAgICAgICAgICAgLyppbmNsdWRlRXhpZiovIGZhbHNlLCAvKnN3aXRjaERpbWVuc2lvbnMqLyBmYWxzZSwgJmNvbG9ySnBlZ0J1ZmZlcik7CisKKyAgICBzdGQ6OmFycmF5PHVpbnQxNl90LCBrVGVzdEJ1ZmZlckRlcHRoU2l6ZT4gZGVwdGgxNkJ1ZmZlcjsKKyAgICBnZW5lcmF0ZURlcHRoMTZCdWZmZXIoJmRlcHRoMTZCdWZmZXIpOworCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGVwdGhQaG90b0J1ZmZlcihpbnB1dEZyYW1lLm1NYXhKcGVnU2l6ZSk7CisgICAgc2l6ZV90IGFjdHVhbERlcHRoUGhvdG9TaXplID0gMDsKKworICAgIGlucHV0RnJhbWUubU1haW5KcGVnV2lkdGggPSBrVGVzdEJ1ZmZlcldpZHRoOworICAgIGlucHV0RnJhbWUubU1haW5KcGVnSGVpZ2h0ID0ga1Rlc3RCdWZmZXJIZWlnaHQ7CisgICAgaW5wdXRGcmFtZS5tSnBlZ1F1YWxpdHkgPSBqcGVnUXVhbGl0eTsKKyAgICBBU1NFUlRfTkUocHJvY2Vzc0Z1bmMoaW5wdXRGcmFtZSwgZGVwdGhQaG90b0J1ZmZlci5zaXplKCksIGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpLAorICAgICAgICAgICAgICAgICZhY3R1YWxEZXB0aFBob3RvU2l6ZSksIDApOworCisgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdCdWZmZXIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPiAoY29sb3JKcGVnQnVmZmVyLmRhdGEoKSk7CisgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdTaXplID0gY29sb3JKcGVnQnVmZmVyLnNpemUoKTsKKyAgICBBU1NFUlRfTkUocHJvY2Vzc0Z1bmMoaW5wdXRGcmFtZSwgZGVwdGhQaG90b0J1ZmZlci5zaXplKCksIGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpLAorICAgICAgICAgICAgICAgICZhY3R1YWxEZXB0aFBob3RvU2l6ZSksIDApOworCisgICAgaW5wdXRGcmFtZS5tRGVwdGhNYXBCdWZmZXIgPSBkZXB0aDE2QnVmZmVyLmRhdGEoKTsKKyAgICBpbnB1dEZyYW1lLm1EZXB0aE1hcFdpZHRoID0gaW5wdXRGcmFtZS5tRGVwdGhNYXBTdHJpZGUgPSBrVGVzdEJ1ZmZlcldpZHRoOworICAgIGlucHV0RnJhbWUubURlcHRoTWFwSGVpZ2h0ID0ga1Rlc3RCdWZmZXJIZWlnaHQ7CisgICAgQVNTRVJUX05FKHByb2Nlc3NGdW5jKGlucHV0RnJhbWUsIGRlcHRoUGhvdG9CdWZmZXIuc2l6ZSgpLCBudWxscHRyLAorICAgICAgICAgICAgICAgICZhY3R1YWxEZXB0aFBob3RvU2l6ZSksIDApOworCisgICAgQVNTRVJUX05FKHByb2Nlc3NGdW5jKGlucHV0RnJhbWUsIGRlcHRoUGhvdG9CdWZmZXIuc2l6ZSgpLCBkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSwgbnVsbHB0ciksCisgICAgICAgICAgICAwKTsKKworICAgIGRsY2xvc2UobGliSGFuZGxlKTsKK30KKworVEVTVChEZXB0aFByb2Nlc3NvclRlc3QsIEJhc2ljRGVwdGhQaG90b1ZhbGlkYXRpb24pIHsKKyAgICB2b2lkICpsaWJIYW5kbGU7CisgICAgaW50IGpwZWdRdWFsaXR5ID0gOTU7CisKKyAgICBwcm9jZXNzX2RlcHRoX3Bob3RvX2ZyYW1lIHByb2Nlc3NGdW5jOworICAgIGxpbmtUb0RlcHRoUGhvdG9MaWJyYXJ5KCZsaWJIYW5kbGUsICZwcm9jZXNzRnVuYyk7CisgICAgaWYgKGxpYkhhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIERlcHRoIGxpYnJhcnkgbm8gcHJlc2VudCwgbm90aGluZyBtb3JlIHRvIHRlc3QuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBjb2xvckpwZWdCdWZmZXI7CisgICAgZ2VuZXJhdGVDb2xvckpwZWdCdWZmZXIoanBlZ1F1YWxpdHksIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fVU5ERUZJTkVELAorICAgICAgICAgICAgLyppbmNsdWRlRXhpZiovIGZhbHNlLCAvKnN3aXRjaERpbWVuc2lvbnMqLyBmYWxzZSwgJmNvbG9ySnBlZ0J1ZmZlcik7CisKKyAgICBzdGQ6OmFycmF5PHVpbnQxNl90LCBrVGVzdEJ1ZmZlckRlcHRoU2l6ZT4gZGVwdGgxNkJ1ZmZlcjsKKyAgICBnZW5lcmF0ZURlcHRoMTZCdWZmZXIoJmRlcHRoMTZCdWZmZXIpOworCisgICAgRGVwdGhQaG90b0lucHV0RnJhbWUgaW5wdXRGcmFtZTsKKyAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ0J1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+IChjb2xvckpwZWdCdWZmZXIuZGF0YSgpKTsKKyAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ1NpemUgPSBjb2xvckpwZWdCdWZmZXIuc2l6ZSgpOworICAgIC8vIFdvcnN0IGNhc2UgYm90aCBkZXB0aCBhbmQgY29uZmlkZW5jZSBtYXBzIGhhdmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgbWFpbiBjb2xvciBpbWFnZS4KKyAgICBpbnB1dEZyYW1lLm1NYXhKcGVnU2l6ZSA9IGlucHV0RnJhbWUubU1haW5KcGVnU2l6ZSAqIDM7CisgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdXaWR0aCA9IGtUZXN0QnVmZmVyV2lkdGg7CisgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdIZWlnaHQgPSBrVGVzdEJ1ZmZlckhlaWdodDsKKyAgICBpbnB1dEZyYW1lLm1KcGVnUXVhbGl0eSA9IGpwZWdRdWFsaXR5OworICAgIGlucHV0RnJhbWUubURlcHRoTWFwQnVmZmVyID0gZGVwdGgxNkJ1ZmZlci5kYXRhKCk7CisgICAgaW5wdXRGcmFtZS5tRGVwdGhNYXBXaWR0aCA9IGlucHV0RnJhbWUubURlcHRoTWFwU3RyaWRlID0ga1Rlc3RCdWZmZXJXaWR0aDsKKyAgICBpbnB1dEZyYW1lLm1EZXB0aE1hcEhlaWdodCA9IGtUZXN0QnVmZmVySGVpZ2h0OworCisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gZGVwdGhQaG90b0J1ZmZlcihpbnB1dEZyYW1lLm1NYXhKcGVnU2l6ZSk7CisgICAgc2l6ZV90IGFjdHVhbERlcHRoUGhvdG9TaXplID0gMDsKKyAgICBBU1NFUlRfRVEocHJvY2Vzc0Z1bmMoaW5wdXRGcmFtZSwgZGVwdGhQaG90b0J1ZmZlci5zaXplKCksIGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpLAorICAgICAgICAgICAgICAgICZhY3R1YWxEZXB0aFBob3RvU2l6ZSksIDApOworICAgIEFTU0VSVF9UUlVFKChhY3R1YWxEZXB0aFBob3RvU2l6ZSA+IDApICYmIChkZXB0aFBob3RvQnVmZmVyLnNpemUoKSA+PSBhY3R1YWxEZXB0aFBob3RvU2l6ZSkpOworCisgICAgLy8gVGhlIGZpbmFsIGRlcHRoIHBob3RvIG11c3QgY29uc2lzdCBvZiB0aHJlZSBqcGVnIGltYWdlczoKKyAgICAvLyAgLSB0aGUgbWFpbiBjb2xvciBpbWFnZQorICAgIC8vICAtIHRoZSBkZXB0aCBtYXAgaW1hZ2UKKyAgICAvLyAgLSB0aGUgY29uZmlkZW5jZSBtYXAgaW1hZ2UKKyAgICBzaXplX3QgbWFpbkpwZWdTaXplID0gMDsKKyAgICBBU1NFUlRfRVEoTlYxMkNvbXByZXNzb3I6OmZpbmRKcGVnU2l6ZShkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSwgYWN0dWFsRGVwdGhQaG90b1NpemUsCisgICAgICAgICAgICAgICAgJm1haW5KcGVnU2l6ZSksIE9LKTsKKyAgICBBU1NFUlRfVFJVRSgobWFpbkpwZWdTaXplID4gMCkgJiYgKG1haW5KcGVnU2l6ZSA8IGFjdHVhbERlcHRoUGhvdG9TaXplKSk7CisgICAgc2l6ZV90IGRlcHRoTWFwU2l6ZSA9IDA7CisgICAgQVNTRVJUX0VRKE5WMTJDb21wcmVzc29yOjpmaW5kSnBlZ1NpemUoZGVwdGhQaG90b0J1ZmZlci5kYXRhKCkgKyBtYWluSnBlZ1NpemUsCisgICAgICAgICAgICAgICAgYWN0dWFsRGVwdGhQaG90b1NpemUgLSBtYWluSnBlZ1NpemUsICZkZXB0aE1hcFNpemUpLCBPSyk7CisgICAgQVNTRVJUX1RSVUUoKGRlcHRoTWFwU2l6ZSA+IDApICYmIChkZXB0aE1hcFNpemUgPCAoYWN0dWFsRGVwdGhQaG90b1NpemUgLSBtYWluSnBlZ1NpemUpKSk7CisKKyAgICBkbGNsb3NlKGxpYkhhbmRsZSk7Cit9CisKK1RFU1QoRGVwdGhQcm9jZXNzb3JUZXN0LCBUZXN0RGVwdGhQaG90b0V4aWZPcmllbnRhdGlvbikgeworICAgIHZvaWQgKmxpYkhhbmRsZTsKKyAgICBpbnQganBlZ1F1YWxpdHkgPSA5NTsKKworICAgIHByb2Nlc3NfZGVwdGhfcGhvdG9fZnJhbWUgcHJvY2Vzc0Z1bmM7CisgICAgbGlua1RvRGVwdGhQaG90b0xpYnJhcnkoJmxpYkhhbmRsZSwgJnByb2Nlc3NGdW5jKTsKKyAgICBpZiAobGliSGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gRGVwdGggbGlicmFyeSBubyBwcmVzZW50LCBub3RoaW5nIG1vcmUgdG8gdGVzdC4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEV4aWZPcmllbnRhdGlvbiBleGlmT3JpZW50YXRpb25zW10gPSB7IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fVU5ERUZJTkVELAorICAgICAgICAgICAgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8wX0RFR1JFRVMsIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fOTBfREVHUkVFUywKKyAgICAgICAgICAgIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMTgwX0RFR1JFRVMsIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMjcwX0RFR1JFRVMgfTsKKyAgICBmb3IgKGF1dG8gZXhpZk9yaWVudGF0aW9uIDogZXhpZk9yaWVudGF0aW9ucykgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBjb2xvckpwZWdCdWZmZXI7CisgICAgICAgIGdlbmVyYXRlQ29sb3JKcGVnQnVmZmVyKGpwZWdRdWFsaXR5LCBleGlmT3JpZW50YXRpb24sIC8qaW5jbHVkZUV4aWYqLyB0cnVlLAorICAgICAgICAgICAgICAgIC8qc3dpdGNoRGltZW5zaW9ucyovIGZhbHNlLCAmY29sb3JKcGVnQnVmZmVyKTsKKyAgICAgICAgaWYgKGV4aWZPcmllbnRhdGlvbiAhPSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OX1VOREVGSU5FRCkgeworICAgICAgICAgICAgYXV0byBqcGVnRXhpZk9yaWVudGF0aW9uID0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl9VTkRFRklORUQ7CisgICAgICAgICAgICBBU1NFUlRfRVEoTlYxMkNvbXByZXNzb3I6OmdldEV4aWZPcmllbnRhdGlvbihjb2xvckpwZWdCdWZmZXIuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICBjb2xvckpwZWdCdWZmZXIuc2l6ZSgpLCAmanBlZ0V4aWZPcmllbnRhdGlvbiksIE9LKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShleGlmT3JpZW50YXRpb24sIGpwZWdFeGlmT3JpZW50YXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjphcnJheTx1aW50MTZfdCwga1Rlc3RCdWZmZXJEZXB0aFNpemU+IGRlcHRoMTZCdWZmZXI7CisgICAgICAgIGdlbmVyYXRlRGVwdGgxNkJ1ZmZlcigmZGVwdGgxNkJ1ZmZlcik7CisKKyAgICAgICAgRGVwdGhQaG90b0lucHV0RnJhbWUgaW5wdXRGcmFtZTsKKyAgICAgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdCdWZmZXIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPiAoY29sb3JKcGVnQnVmZmVyLmRhdGEoKSk7CisgICAgICAgIGlucHV0RnJhbWUubU1haW5KcGVnU2l6ZSA9IGNvbG9ySnBlZ0J1ZmZlci5zaXplKCk7CisgICAgICAgIC8vIFdvcnN0IGNhc2UgYm90aCBkZXB0aCBhbmQgY29uZmlkZW5jZSBtYXBzIGhhdmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgbWFpbiBjb2xvciBpbWFnZS4KKyAgICAgICAgaW5wdXRGcmFtZS5tTWF4SnBlZ1NpemUgPSBpbnB1dEZyYW1lLm1NYWluSnBlZ1NpemUgKiAzOworICAgICAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ1dpZHRoID0ga1Rlc3RCdWZmZXJXaWR0aDsKKyAgICAgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdIZWlnaHQgPSBrVGVzdEJ1ZmZlckhlaWdodDsKKyAgICAgICAgaW5wdXRGcmFtZS5tSnBlZ1F1YWxpdHkgPSBqcGVnUXVhbGl0eTsKKyAgICAgICAgaW5wdXRGcmFtZS5tRGVwdGhNYXBCdWZmZXIgPSBkZXB0aDE2QnVmZmVyLmRhdGEoKTsKKyAgICAgICAgaW5wdXRGcmFtZS5tRGVwdGhNYXBXaWR0aCA9IGlucHV0RnJhbWUubURlcHRoTWFwU3RyaWRlID0ga1Rlc3RCdWZmZXJXaWR0aDsKKyAgICAgICAgaW5wdXRGcmFtZS5tRGVwdGhNYXBIZWlnaHQgPSBrVGVzdEJ1ZmZlckhlaWdodDsKKworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkZXB0aFBob3RvQnVmZmVyKGlucHV0RnJhbWUubU1heEpwZWdTaXplKTsKKyAgICAgICAgc2l6ZV90IGFjdHVhbERlcHRoUGhvdG9TaXplID0gMDsKKyAgICAgICAgQVNTRVJUX0VRKHByb2Nlc3NGdW5jKGlucHV0RnJhbWUsIGRlcHRoUGhvdG9CdWZmZXIuc2l6ZSgpLCBkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAmYWN0dWFsRGVwdGhQaG90b1NpemUpLCAwKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoKGFjdHVhbERlcHRoUGhvdG9TaXplID4gMCkgJiYKKyAgICAgICAgICAgICAgICAoZGVwdGhQaG90b0J1ZmZlci5zaXplKCkgPj0gYWN0dWFsRGVwdGhQaG90b1NpemUpKTsKKworICAgICAgICBzaXplX3QgbWFpbkpwZWdTaXplID0gMDsKKyAgICAgICAgQVNTRVJUX0VRKE5WMTJDb21wcmVzc29yOjpmaW5kSnBlZ1NpemUoZGVwdGhQaG90b0J1ZmZlci5kYXRhKCksIGFjdHVhbERlcHRoUGhvdG9TaXplLAorICAgICAgICAgICAgICAgICZtYWluSnBlZ1NpemUpLCBPSyk7CisgICAgICAgIEFTU0VSVF9UUlVFKChtYWluSnBlZ1NpemUgPiAwKSAmJiAobWFpbkpwZWdTaXplIDwgYWN0dWFsRGVwdGhQaG90b1NpemUpKTsKKyAgICAgICAgc2l6ZV90IGRlcHRoTWFwU2l6ZSA9IDA7CisgICAgICAgIEFTU0VSVF9FUShOVjEyQ29tcHJlc3Nvcjo6ZmluZEpwZWdTaXplKGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpICsgbWFpbkpwZWdTaXplLAorICAgICAgICAgICAgICAgIGFjdHVhbERlcHRoUGhvdG9TaXplIC0gbWFpbkpwZWdTaXplLCAmZGVwdGhNYXBTaXplKSwgT0spOworICAgICAgICBBU1NFUlRfVFJVRSgoZGVwdGhNYXBTaXplID4gMCkgJiYgKGRlcHRoTWFwU2l6ZSA8IChhY3R1YWxEZXB0aFBob3RvU2l6ZSAtIG1haW5KcGVnU2l6ZSkpKTsKKyAgICAgICAgc2l6ZV90IGNvbmZpZGVuY2VNYXBTaXplID0gYWN0dWFsRGVwdGhQaG90b1NpemUgLSAobWFpbkpwZWdTaXplICsgZGVwdGhNYXBTaXplKTsKKworICAgICAgICAvL0RlcHRoIGFuZCBjb25maWRlbmNlIGltYWdlcyBtdXN0IGhhdmUgdGhlIHNhbWUgRVhJRiBvcmllbnRhdGlvbiBhcyB0aGUgc291cmNlCisgICAgICAgIGF1dG8gZGVwdGhKcGVnRXhpZk9yaWVudGF0aW9uID0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl9VTkRFRklORUQ7CisgICAgICAgIEFTU0VSVF9FUShOVjEyQ29tcHJlc3Nvcjo6Z2V0RXhpZk9yaWVudGF0aW9uKGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpICsgbWFpbkpwZWdTaXplLAorICAgICAgICAgICAgICAgIGRlcHRoTWFwU2l6ZSwgJmRlcHRoSnBlZ0V4aWZPcmllbnRhdGlvbiksIE9LKTsKKyAgICAgICAgaWYgKGV4aWZPcmllbnRhdGlvbiA9PSBPUklFTlRBVElPTl9VTkRFRklORUQpIHsKKyAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgdW5kZWZpbmVkIG9yIG1pc3NpbmcgRVhJRiBvcmllbnRhdGlvbiwgYWx3YXlzIGV4cGVjdCAwIGRlZ3JlZXMgaW4gdGhlCisgICAgICAgICAgICAvLyBkZXB0aCBtYXAuCisgICAgICAgICAgICBBU1NFUlRfRVEoZGVwdGhKcGVnRXhpZk9yaWVudGF0aW9uLCBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzBfREVHUkVFUyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBU1NFUlRfRVEoZGVwdGhKcGVnRXhpZk9yaWVudGF0aW9uLCBleGlmT3JpZW50YXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgYXV0byBjb25maWRlbmNlSnBlZ0V4aWZPcmllbnRhdGlvbiA9IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fVU5ERUZJTkVEOworICAgICAgICBBU1NFUlRfRVEoTlYxMkNvbXByZXNzb3I6OmdldEV4aWZPcmllbnRhdGlvbigKKyAgICAgICAgICAgICAgICBkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSArIG1haW5KcGVnU2l6ZSArIGRlcHRoTWFwU2l6ZSwKKyAgICAgICAgICAgICAgICBjb25maWRlbmNlTWFwU2l6ZSwgJmNvbmZpZGVuY2VKcGVnRXhpZk9yaWVudGF0aW9uKSwgT0spOworICAgICAgICBpZiAoZXhpZk9yaWVudGF0aW9uID09IE9SSUVOVEFUSU9OX1VOREVGSU5FRCkgeworICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiB1bmRlZmluZWQgb3IgbWlzc2luZyBFWElGIG9yaWVudGF0aW9uLCBhbHdheXMgZXhwZWN0IDAgZGVncmVlcyBpbiB0aGUKKyAgICAgICAgICAgIC8vIGNvbmZpZGVuY2UgbWFwLgorICAgICAgICAgICAgQVNTRVJUX0VRKGNvbmZpZGVuY2VKcGVnRXhpZk9yaWVudGF0aW9uLCBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzBfREVHUkVFUyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBU1NFUlRfRVEoY29uZmlkZW5jZUpwZWdFeGlmT3JpZW50YXRpb24sIGV4aWZPcmllbnRhdGlvbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkbGNsb3NlKGxpYkhhbmRsZSk7Cit9CisKK1RFU1QoRGVwdGhQcm9jZXNzb3JUZXN0LCBUZXN0RGVwaHRQaG90b1BoeXNpY2FsUm90YXRpb24pIHsKKyAgICB2b2lkICpsaWJIYW5kbGU7CisgICAgaW50IGpwZWdRdWFsaXR5ID0gOTU7CisKKyAgICBwcm9jZXNzX2RlcHRoX3Bob3RvX2ZyYW1lIHByb2Nlc3NGdW5jOworICAgIGxpbmtUb0RlcHRoUGhvdG9MaWJyYXJ5KCZsaWJIYW5kbGUsICZwcm9jZXNzRnVuYyk7CisgICAgaWYgKGxpYkhhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIERlcHRoIGxpYnJhcnkgbm8gcHJlc2VudCwgbm90aGluZyBtb3JlIHRvIHRlc3QuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBJbiBjYXNlIG9mIHBoeXNpY2FsIHJvdGF0aW9uLCB0aGUgRVhJRiBvcmllbnRhdGlvbiBtdXN0IGFsd2F5cyBiZSAwLgorICAgIGF1dG8gZXhpZk9yaWVudGF0aW9uID0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8wX0RFR1JFRVM7CisgICAgRGVwdGhQaG90b09yaWVudGF0aW9uIGRlcHRoT3JpZW50YXRpb25zW10gPSB7CisgICAgICAgICAgICBEZXB0aFBob3RvT3JpZW50YXRpb246OkRFUFRIX09SSUVOVEFUSU9OXzBfREVHUkVFUywKKyAgICAgICAgICAgIERlcHRoUGhvdG9PcmllbnRhdGlvbjo6REVQVEhfT1JJRU5UQVRJT05fOTBfREVHUkVFUywKKyAgICAgICAgICAgIERlcHRoUGhvdG9PcmllbnRhdGlvbjo6REVQVEhfT1JJRU5UQVRJT05fMTgwX0RFR1JFRVMsCisgICAgICAgICAgICBEZXB0aFBob3RvT3JpZW50YXRpb246OkRFUFRIX09SSUVOVEFUSU9OXzI3MF9ERUdSRUVTIH07CisgICAgZm9yIChhdXRvIGRlcHRoT3JpZW50YXRpb24gOiBkZXB0aE9yaWVudGF0aW9ucykgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBjb2xvckpwZWdCdWZmZXI7CisgICAgICAgIGJvb2wgc3dpdGNoRGltZW5zaW9ucyA9IGZhbHNlOworICAgICAgICBzaXplX3QgZXhwZWN0ZWRXaWR0aCA9IGtUZXN0QnVmZmVyV2lkdGg7CisgICAgICAgIHNpemVfdCBleHBlY3RlZEhlaWdodCA9IGtUZXN0QnVmZmVySGVpZ2h0OworICAgICAgICBpZiAoKGRlcHRoT3JpZW50YXRpb24gPT0gRGVwdGhQaG90b09yaWVudGF0aW9uOjpERVBUSF9PUklFTlRBVElPTl85MF9ERUdSRUVTKSB8fAorICAgICAgICAgICAgICAgIChkZXB0aE9yaWVudGF0aW9uID09IERlcHRoUGhvdG9PcmllbnRhdGlvbjo6REVQVEhfT1JJRU5UQVRJT05fMjcwX0RFR1JFRVMpKSB7CisgICAgICAgICAgICBzd2l0Y2hEaW1lbnNpb25zID0gdHJ1ZTsKKyAgICAgICAgICAgIGV4cGVjdGVkV2lkdGggPSBrVGVzdEJ1ZmZlckhlaWdodDsKKyAgICAgICAgICAgIGV4cGVjdGVkSGVpZ2h0ID0ga1Rlc3RCdWZmZXJXaWR0aDsKKyAgICAgICAgfQorICAgICAgICBnZW5lcmF0ZUNvbG9ySnBlZ0J1ZmZlcihqcGVnUXVhbGl0eSwgZXhpZk9yaWVudGF0aW9uLCAvKmluY2x1ZGVFeGlmKi8gdHJ1ZSwKKyAgICAgICAgICAgICAgICBzd2l0Y2hEaW1lbnNpb25zLCAmY29sb3JKcGVnQnVmZmVyKTsKKyAgICAgICAgYXV0byBqcGVnRXhpZk9yaWVudGF0aW9uID0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl9VTkRFRklORUQ7CisgICAgICAgIEFTU0VSVF9FUShOVjEyQ29tcHJlc3Nvcjo6Z2V0RXhpZk9yaWVudGF0aW9uKGNvbG9ySnBlZ0J1ZmZlci5kYXRhKCksIGNvbG9ySnBlZ0J1ZmZlci5zaXplKCksCisgICAgICAgICAgICAgICAgJmpwZWdFeGlmT3JpZW50YXRpb24pLCBPSyk7CisgICAgICAgIEFTU0VSVF9FUShleGlmT3JpZW50YXRpb24sIGpwZWdFeGlmT3JpZW50YXRpb24pOworCisgICAgICAgIHN0ZDo6YXJyYXk8dWludDE2X3QsIGtUZXN0QnVmZmVyRGVwdGhTaXplPiBkZXB0aDE2QnVmZmVyOworICAgICAgICBnZW5lcmF0ZURlcHRoMTZCdWZmZXIoJmRlcHRoMTZCdWZmZXIpOworCisgICAgICAgIERlcHRoUGhvdG9JbnB1dEZyYW1lIGlucHV0RnJhbWU7CisgICAgICAgIGlucHV0RnJhbWUubU1haW5KcGVnQnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4gKGNvbG9ySnBlZ0J1ZmZlci5kYXRhKCkpOworICAgICAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ1NpemUgPSBjb2xvckpwZWdCdWZmZXIuc2l6ZSgpOworICAgICAgICAvLyBXb3JzdCBjYXNlIGJvdGggZGVwdGggYW5kIGNvbmZpZGVuY2UgbWFwcyBoYXZlIHRoZSBzYW1lIHNpemUgYXMgdGhlIG1haW4gY29sb3IgaW1hZ2UuCisgICAgICAgIGlucHV0RnJhbWUubU1heEpwZWdTaXplID0gaW5wdXRGcmFtZS5tTWFpbkpwZWdTaXplICogMzsKKyAgICAgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdXaWR0aCA9IGtUZXN0QnVmZmVyV2lkdGg7CisgICAgICAgIGlucHV0RnJhbWUubU1haW5KcGVnSGVpZ2h0ID0ga1Rlc3RCdWZmZXJIZWlnaHQ7CisgICAgICAgIGlucHV0RnJhbWUubUpwZWdRdWFsaXR5ID0ganBlZ1F1YWxpdHk7CisgICAgICAgIGlucHV0RnJhbWUubURlcHRoTWFwQnVmZmVyID0gZGVwdGgxNkJ1ZmZlci5kYXRhKCk7CisgICAgICAgIGlucHV0RnJhbWUubURlcHRoTWFwV2lkdGggPSBpbnB1dEZyYW1lLm1EZXB0aE1hcFN0cmlkZSA9IGtUZXN0QnVmZmVyV2lkdGg7CisgICAgICAgIGlucHV0RnJhbWUubURlcHRoTWFwSGVpZ2h0ID0ga1Rlc3RCdWZmZXJIZWlnaHQ7CisgICAgICAgIGlucHV0RnJhbWUubU9yaWVudGF0aW9uID0gZGVwdGhPcmllbnRhdGlvbjsKKworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkZXB0aFBob3RvQnVmZmVyKGlucHV0RnJhbWUubU1heEpwZWdTaXplKTsKKyAgICAgICAgc2l6ZV90IGFjdHVhbERlcHRoUGhvdG9TaXplID0gMDsKKyAgICAgICAgQVNTRVJUX0VRKHByb2Nlc3NGdW5jKGlucHV0RnJhbWUsIGRlcHRoUGhvdG9CdWZmZXIuc2l6ZSgpLCBkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAmYWN0dWFsRGVwdGhQaG90b1NpemUpLCAwKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoKGFjdHVhbERlcHRoUGhvdG9TaXplID4gMCkgJiYKKyAgICAgICAgICAgICAgICAoZGVwdGhQaG90b0J1ZmZlci5zaXplKCkgPj0gYWN0dWFsRGVwdGhQaG90b1NpemUpKTsKKworICAgICAgICBzaXplX3QgbWFpbkpwZWdTaXplID0gMDsKKyAgICAgICAgQVNTRVJUX0VRKE5WMTJDb21wcmVzc29yOjpmaW5kSnBlZ1NpemUoZGVwdGhQaG90b0J1ZmZlci5kYXRhKCksIGFjdHVhbERlcHRoUGhvdG9TaXplLAorICAgICAgICAgICAgICAgICZtYWluSnBlZ1NpemUpLCBPSyk7CisgICAgICAgIEFTU0VSVF9UUlVFKChtYWluSnBlZ1NpemUgPiAwKSAmJiAobWFpbkpwZWdTaXplIDwgYWN0dWFsRGVwdGhQaG90b1NpemUpKTsKKyAgICAgICAgc2l6ZV90IGRlcHRoTWFwU2l6ZSA9IDA7CisgICAgICAgIEFTU0VSVF9FUShOVjEyQ29tcHJlc3Nvcjo6ZmluZEpwZWdTaXplKGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpICsgbWFpbkpwZWdTaXplLAorICAgICAgICAgICAgICAgIGFjdHVhbERlcHRoUGhvdG9TaXplIC0gbWFpbkpwZWdTaXplLCAmZGVwdGhNYXBTaXplKSwgT0spOworICAgICAgICBBU1NFUlRfVFJVRSgoZGVwdGhNYXBTaXplID4gMCkgJiYgKGRlcHRoTWFwU2l6ZSA8IChhY3R1YWxEZXB0aFBob3RvU2l6ZSAtIG1haW5KcGVnU2l6ZSkpKTsKKyAgICAgICAgc2l6ZV90IGNvbmZpZGVuY2VNYXBTaXplID0gYWN0dWFsRGVwdGhQaG90b1NpemUgLSAobWFpbkpwZWdTaXplICsgZGVwdGhNYXBTaXplKTsKKworICAgICAgICAvL0RlcHRoIGFuZCBjb25maWRlbmNlIGltYWdlcyBtdXN0IGhhdmUgdGhlIHNhbWUgRVhJRiBvcmllbnRhdGlvbiBhcyB0aGUgc291cmNlCisgICAgICAgIGF1dG8gZGVwdGhKcGVnRXhpZk9yaWVudGF0aW9uID0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl9VTkRFRklORUQ7CisgICAgICAgIEFTU0VSVF9FUShOVjEyQ29tcHJlc3Nvcjo6Z2V0RXhpZk9yaWVudGF0aW9uKGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpICsgbWFpbkpwZWdTaXplLAorICAgICAgICAgICAgICAgIGRlcHRoTWFwU2l6ZSwgJmRlcHRoSnBlZ0V4aWZPcmllbnRhdGlvbiksIE9LKTsKKyAgICAgICAgQVNTRVJUX0VRKGRlcHRoSnBlZ0V4aWZPcmllbnRhdGlvbiwgZXhpZk9yaWVudGF0aW9uKTsKKyAgICAgICAgc2l6ZV90IGRlcHRoTWFwV2lkdGgsIGRlcHRoTWFwSGVpZ2h0OworICAgICAgICBBU1NFUlRfRVEoTlYxMkNvbXByZXNzb3I6OmdldEpwZWdJbWFnZURpbWVuc2lvbnMoZGVwdGhQaG90b0J1ZmZlci5kYXRhKCkgKyBtYWluSnBlZ1NpemUsCisgICAgICAgICAgICAgICAgZGVwdGhNYXBTaXplLCAmZGVwdGhNYXBXaWR0aCwgJmRlcHRoTWFwSGVpZ2h0KSwgT0spOworICAgICAgICBBU1NFUlRfRVEoZGVwdGhNYXBXaWR0aCwgZXhwZWN0ZWRXaWR0aCk7CisgICAgICAgIEFTU0VSVF9FUShkZXB0aE1hcEhlaWdodCwgZXhwZWN0ZWRIZWlnaHQpOworCisgICAgICAgIGF1dG8gY29uZmlkZW5jZUpwZWdFeGlmT3JpZW50YXRpb24gPSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OX1VOREVGSU5FRDsKKyAgICAgICAgQVNTRVJUX0VRKE5WMTJDb21wcmVzc29yOjpnZXRFeGlmT3JpZW50YXRpb24oCisgICAgICAgICAgICAgICAgZGVwdGhQaG90b0J1ZmZlci5kYXRhKCkgKyBtYWluSnBlZ1NpemUgKyBkZXB0aE1hcFNpemUsIGNvbmZpZGVuY2VNYXBTaXplLAorICAgICAgICAgICAgICAgICZjb25maWRlbmNlSnBlZ0V4aWZPcmllbnRhdGlvbiksIE9LKTsKKyAgICAgICAgQVNTRVJUX0VRKGNvbmZpZGVuY2VKcGVnRXhpZk9yaWVudGF0aW9uLCBleGlmT3JpZW50YXRpb24pOworICAgICAgICBzaXplX3QgY29uZmlkZW5jZU1hcFdpZHRoLCBjb25maWRlbmNlTWFwSGVpZ2h0OworICAgICAgICBBU1NFUlRfRVEoTlYxMkNvbXByZXNzb3I6OmdldEpwZWdJbWFnZURpbWVuc2lvbnMoCisgICAgICAgICAgICAgICAgZGVwdGhQaG90b0J1ZmZlci5kYXRhKCkgKyBtYWluSnBlZ1NpemUgKyBkZXB0aE1hcFNpemUsIGNvbmZpZGVuY2VNYXBTaXplLAorICAgICAgICAgICAgICAgICZjb25maWRlbmNlTWFwV2lkdGgsICZjb25maWRlbmNlTWFwSGVpZ2h0KSwgT0spOworICAgICAgICBBU1NFUlRfRVEoY29uZmlkZW5jZU1hcFdpZHRoLCBleHBlY3RlZFdpZHRoKTsKKyAgICAgICAgQVNTRVJUX0VRKGNvbmZpZGVuY2VNYXBIZWlnaHQsIGV4cGVjdGVkSGVpZ2h0KTsKKyAgICB9CisKKyAgICBkbGNsb3NlKGxpYkhhbmRsZSk7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9EaXN0b3J0aW9uTWFwcGVyVGVzdC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9EaXN0b3J0aW9uTWFwcGVyVGVzdC5jcHAKaW5kZXggMmE2ODljNi4uNTQ5MzVjOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvRGlzdG9ydGlvbk1hcHBlclRlc3QuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0Rpc3RvcnRpb25NYXBwZXJUZXN0LmNwcApAQCAtMTY3LDYgKzE2NywzMCBAQAogICAgIH0KIH0KIAorVEVTVChEaXN0b3J0aW9uTWFwcGVyVGVzdCwgQ2xhbXBDb25zaXN0ZW5jeSkgeworICAgIHN0YXR1c190IHJlczsKKworICAgIHN0ZDo6YXJyYXk8aW50MzJfdCwgND4gYWN0aXZlQXJyYXkgPSB7MCwgMCwgNDAzMiwgMzAyNH07CisgICAgRGlzdG9ydGlvbk1hcHBlciBtOworICAgIHNldHVwVGVzdE1hcHBlcigmbSwgaWRlbnRpdHlEaXN0b3J0aW9uLCB0ZXN0SUNhbCwgLyphY3RpdmVBcnJheSovIGFjdGl2ZUFycmF5LmRhdGEoKSwKKyAgICAgICAgICAgIC8qcHJlQ29ycmVjdGlvbkFjdGl2ZUFycmF5Ki8gYWN0aXZlQXJyYXkuZGF0YSgpKTsKKworICAgIGF1dG8gcmVjdHNPcmlnID0gYWN0aXZlQXJyYXk7CisgICAgcmVzID0gbS5tYXBDb3JyZWN0ZWRSZWN0VG9SYXcoYWN0aXZlQXJyYXkuZGF0YSgpLCAxLCAvKmNsYW1wKi90cnVlLCAvKnNpbXBsZSovIHRydWUpOworICAgIEFTU0VSVF9FUShyZXMsIE9LKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0aXZlQXJyYXkuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgRVhQRUNUX0VRKGFjdGl2ZUFycmF5W2ldLCByZWN0c09yaWdbaV0pOworICAgIH0KKworICAgIHJlcyA9IG0ubWFwUmF3UmVjdFRvQ29ycmVjdGVkKGFjdGl2ZUFycmF5LmRhdGEoKSwgMSwgLypjbGFtcCovdHJ1ZSwgLypzaW1wbGUqLyB0cnVlKTsKKyAgICBBU1NFUlRfRVEocmVzLCBPSyk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFjdGl2ZUFycmF5LnNpemUoKTsgaSsrKSB7CisgICAgICAgIEVYUEVDVF9FUShhY3RpdmVBcnJheVtpXSwgcmVjdHNPcmlnW2ldKTsKKyAgICB9Cit9CisKIFRFU1QoRGlzdG9ydGlvbk1hcHBlclRlc3QsIFNpbXBsZVRyYW5zZm9ybSkgewogICAgIHN0YXR1c190IHJlczsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvTlYxMkNvbXByZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvTlYxMkNvbXByZXNzb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhNDFhMWYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9OVjEyQ29tcHJlc3Nvci5jcHAKQEAgLTAsMCArMSwzNzkgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlRlc3RfTlYxMkNvbXByZXNzb3IiCisKKyNpbmNsdWRlICJOVjEyQ29tcHJlc3Nvci5oIgorCisjaW5jbHVkZSA8bGliZXhpZi9leGlmLWRhdGEuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmNhbWVyYTM7CisKK25hbWVzcGFjZSBzdGQgewordGVtcGxhdGUgPD4KK3N0cnVjdCBkZWZhdWx0X2RlbGV0ZTxFeGlmRW50cnk+IHsKKyAgICBpbmxpbmUgdm9pZCBvcGVyYXRvcigpKEV4aWZFbnRyeSogZW50cnkpIGNvbnN0IHsgZXhpZl9lbnRyeV91bnJlZihlbnRyeSk7IH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgZGVmYXVsdF9kZWxldGU8RXhpZkRhdGE+IHsKKyAgICBpbmxpbmUgdm9pZCBvcGVyYXRvcigpKEV4aWZEYXRhKiBkYXRhKSBjb25zdCB7IGV4aWZfZGF0YV91bnJlZihkYXRhKTsgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIHN0ZAorCitib29sIE5WMTJDb21wcmVzc29yOjpjb21wcmVzcyhjb25zdCB1bnNpZ25lZCBjaGFyKiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBxdWFsaXR5KSB7CisgICAgaWYgKCFjb25maWd1cmVDb21wcmVzc29yKHdpZHRoLCBoZWlnaHQsIHF1YWxpdHkpKSB7CisgICAgICAgIC8vIHRoZSBtZXRob2Qgd2lsbCBoYXZlIGxvZ2dlZCBhIG1vcmUgZGV0YWlsZWQgZXJyb3IgbWVzc2FnZSB0aGFuIHdlIGNhbgorICAgICAgICAvLyBwcm92aWRlIGhlcmUgc28ganVzdCByZXR1cm4uCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gY29tcHJlc3NEYXRhKGRhdGEsIC8qZXhpZkRhdGEqLyBudWxscHRyKTsKK30KKworYm9vbCBOVjEyQ29tcHJlc3Nvcjo6Y29tcHJlc3NXaXRoRXhpZk9yaWVudGF0aW9uKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwKKyAgICAgICAgaW50IHF1YWxpdHksIGFuZHJvaWQ6OmNhbWVyYTM6OkV4aWZPcmllbnRhdGlvbiBleGlmVmFsdWUpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkRhdGE+IGV4aWZEYXRhKGV4aWZfZGF0YV9uZXcoKSk7CisgICAgaWYgKGV4aWZEYXRhLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGV4aWZfZGF0YV9zZXRfb3B0aW9uKGV4aWZEYXRhLmdldCgpLCBFWElGX0RBVEFfT1BUSU9OX0ZPTExPV19TUEVDSUZJQ0FUSU9OKTsKKyAgICBleGlmX2RhdGFfc2V0X2RhdGFfdHlwZShleGlmRGF0YS5nZXQoKSwgRVhJRl9EQVRBX1RZUEVfQ09NUFJFU1NFRCk7CisgICAgZXhpZl9kYXRhX3NldF9ieXRlX29yZGVyKGV4aWZEYXRhLmdldCgpLCBFWElGX0JZVEVfT1JERVJfSU5URUwpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IGV4aWZFbnRyeShleGlmX2VudHJ5X25ldygpKTsKKyAgICBpZiAoZXhpZkVudHJ5LmdldCgpID09ICBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBleGlmRW50cnktPnRhZyA9IEVYSUZfVEFHX09SSUVOVEFUSU9OOworICAgIGV4aWZfY29udGVudF9hZGRfZW50cnkoZXhpZkRhdGEtPmlmZFtFWElGX0lGRF8wXSwgZXhpZkVudHJ5LmdldCgpKTsKKyAgICBleGlmX2VudHJ5X2luaXRpYWxpemUoZXhpZkVudHJ5LmdldCgpLCBleGlmRW50cnktPnRhZyk7CisgICAgZXhpZl9zZXRfc2hvcnQoZXhpZkVudHJ5LT5kYXRhLCBFWElGX0JZVEVfT1JERVJfSU5URUwsIGV4aWZWYWx1ZSk7CisKKyAgICBpZiAoIWNvbmZpZ3VyZUNvbXByZXNzb3Iod2lkdGgsIGhlaWdodCwgcXVhbGl0eSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiBjb21wcmVzc0RhdGEoZGF0YSwgZXhpZkRhdGEuZ2V0KCkpOworfQorCitjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgTlYxMkNvbXByZXNzb3I6OmdldENvbXByZXNzZWREYXRhKCkgY29uc3QgeworICAgIHJldHVybiBtRGVzdE1hbmFnZXIubUJ1ZmZlcjsKK30KKworYm9vbCBOVjEyQ29tcHJlc3Nvcjo6Y29uZmlndXJlQ29tcHJlc3NvcihpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBxdWFsaXR5KSB7CisgICAgbUNvbXByZXNzSW5mby5lcnIgPSBqcGVnX3N0ZF9lcnJvcigmbUVycm9yTWFuYWdlcik7CisgICAgLy8gTk9URSEgREFOR0VSISBEbyBub3QgY29uc3RydWN0IGFueSBub24tdHJpdmlhbCBvYmplY3RzIGJlbG93IHNldGptcCEKKyAgICAvLyBUaGUgY29tcGlsZXIgd2lsbCBub3QgZ2VuZXJhdGUgY29kZSB0byBkZXN0cm95IHRoZW0gZHVyaW5nIHRoZSByZXR1cm4KKyAgICAvLyBiZWxvdyBzbyB0aGV5IHdpbGwgbGVhay4gQWRkaXRpb25hbGx5LCBkbyBub3QgcGxhY2UgYW55IGNhbGxzIHRvIGxpYmpwZWcKKyAgICAvLyB0aGF0IGNhbiBmYWlsIGFib3ZlIHRoaXMgbGluZSBvciBhbnkgZXJyb3Igd2lsbCBjYXVzZSB1bmRlZmluZWQgYmVoYXZpb3IuCisgICAgaWYgKHNldGptcChtRXJyb3JNYW5hZ2VyLm1KdW1wQnVmZmVyKSkgeworICAgICAgICAvLyBUaGlzIGlzIHdoZXJlIHRoZSBlcnJvciBoYW5kbGVyIHdpbGwganVtcCBpbiBjYXNlIHNldHVwIGZhaWxzCisgICAgICAgIC8vIFRoZSBlcnJvciBtYW5hZ2VyIHdpbGwgQUxPRyBhbiBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBqcGVnX2NyZWF0ZV9jb21wcmVzcygmbUNvbXByZXNzSW5mbyk7CisKKyAgICBtQ29tcHJlc3NJbmZvLmltYWdlX3dpZHRoID0gd2lkdGg7CisgICAgbUNvbXByZXNzSW5mby5pbWFnZV9oZWlnaHQgPSBoZWlnaHQ7CisgICAgbUNvbXByZXNzSW5mby5pbnB1dF9jb21wb25lbnRzID0gMzsKKyAgICBtQ29tcHJlc3NJbmZvLmluX2NvbG9yX3NwYWNlID0gSkNTX1lDYkNyOworICAgIGpwZWdfc2V0X2RlZmF1bHRzKCZtQ29tcHJlc3NJbmZvKTsKKworICAgIGpwZWdfc2V0X3F1YWxpdHkoJm1Db21wcmVzc0luZm8sIHF1YWxpdHksIFRSVUUpOworICAgIC8vIEl0IG1heSBzZWVtIHdlaXJkIHRvIHNldCBjb2xvciBzcGFjZSBoZXJlIGFnYWluIGJ1dCB0aGlzIHdpbGwgYWxzbyBzZXQKKyAgICAvLyBvdGhlciBmaWVsZHMuIFRoZXNlIGZpZWxkcyBtaWdodCBiZSBvdmVyd3JpdHRlbiBieSBqcGVnX3NldF9kZWZhdWx0cworICAgIGpwZWdfc2V0X2NvbG9yc3BhY2UoJm1Db21wcmVzc0luZm8sIEpDU19ZQ2JDcik7CisgICAgbUNvbXByZXNzSW5mby5yYXdfZGF0YV9pbiA9IFRSVUU7CisgICAgbUNvbXByZXNzSW5mby5kY3RfbWV0aG9kID0gSkRDVF9JRkFTVDsKKyAgICAvLyBTZXQgc2FtcGxpbmcgZmFjdG9ycworICAgIG1Db21wcmVzc0luZm8uY29tcF9pbmZvWzBdLmhfc2FtcF9mYWN0b3IgPSAyOworICAgIG1Db21wcmVzc0luZm8uY29tcF9pbmZvWzBdLnZfc2FtcF9mYWN0b3IgPSAyOworICAgIG1Db21wcmVzc0luZm8uY29tcF9pbmZvWzFdLmhfc2FtcF9mYWN0b3IgPSAxOworICAgIG1Db21wcmVzc0luZm8uY29tcF9pbmZvWzFdLnZfc2FtcF9mYWN0b3IgPSAxOworICAgIG1Db21wcmVzc0luZm8uY29tcF9pbmZvWzJdLmhfc2FtcF9mYWN0b3IgPSAxOworICAgIG1Db21wcmVzc0luZm8uY29tcF9pbmZvWzJdLnZfc2FtcF9mYWN0b3IgPSAxOworCisgICAgbUNvbXByZXNzSW5mby5kZXN0ID0gJm1EZXN0TWFuYWdlcjsKKworICAgIHJldHVybiB0cnVlOworfQorCitzdGF0aWMgdm9pZCBkZWludGVybGVhdmUoY29uc3QgdWludDhfdCogdnVQbGFuYXIsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiB1Um93cywKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHZSb3dzLCBpbnQgcm93SW5kZXgsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHN0cmlkZSkgeworICAgIGludCBudW1Sb3dzID0gKGhlaWdodCAtIHJvd0luZGV4KSAvIDI7CisgICAgaWYgKG51bVJvd3MgPiA4KSBudW1Sb3dzID0gODsKKyAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPCBudW1Sb3dzOyArK3JvdykgeworICAgICAgICBpbnQgb2Zmc2V0ID0gKChyb3dJbmRleCA+PiAxKSArIHJvdykgKiBzdHJpZGU7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHZ1ID0gdnVQbGFuYXIgKyBvZmZzZXQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKHdpZHRoID4+IDEpOyArK2kpIHsKKyAgICAgICAgICAgIGludCBpbmRleCA9IHJvdyAqICh3aWR0aCA+PiAxKSArIGk7CisgICAgICAgICAgICB1Um93c1tpbmRleF0gPSB2dVsxXTsKKyAgICAgICAgICAgIHZSb3dzW2luZGV4XSA9IHZ1WzBdOworICAgICAgICAgICAgdnUgKz0gMjsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBOVjEyQ29tcHJlc3Nvcjo6Y29tcHJlc3NEYXRhKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRhdGEsIEV4aWZEYXRhKiBleGlmRGF0YSkgeworICAgIGNvbnN0IHVpbnQ4X3QqIHlbMTZdOworICAgIGNvbnN0IHVpbnQ4X3QqIGNiWzhdOworICAgIGNvbnN0IHVpbnQ4X3QqIGNyWzhdOworICAgIGNvbnN0IHVpbnQ4X3QqKiBwbGFuZXNbM10gPSB7IHksIGNiLCBjciB9OworCisgICAgaW50IGksIG9mZnNldDsKKyAgICBpbnQgd2lkdGggPSBtQ29tcHJlc3NJbmZvLmltYWdlX3dpZHRoOworICAgIGludCBoZWlnaHQgPSBtQ29tcHJlc3NJbmZvLmltYWdlX2hlaWdodDsKKyAgICBjb25zdCB1aW50OF90KiB5UGxhbmFyID0gZGF0YTsKKyAgICBjb25zdCB1aW50OF90KiB2dVBsYW5hciA9IGRhdGEgKyAod2lkdGggKiBoZWlnaHQpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHVSb3dzKDggKiAod2lkdGggPj4gMSkpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZSb3dzKDggKiAod2lkdGggPj4gMSkpOworCisgICAgLy8gTk9URSEgREFOR0VSISBEbyBub3QgY29uc3RydWN0IGFueSBub24tdHJpdmlhbCBvYmplY3RzIGJlbG93IHNldGptcCEKKyAgICAvLyBUaGUgY29tcGlsZXIgd2lsbCBub3QgZ2VuZXJhdGUgY29kZSB0byBkZXN0cm95IHRoZW0gZHVyaW5nIHRoZSByZXR1cm4KKyAgICAvLyBiZWxvdyBzbyB0aGV5IHdpbGwgbGVhay4gQWRkaXRpb25hbGx5LCBkbyBub3QgcGxhY2UgYW55IGNhbGxzIHRvIGxpYmpwZWcKKyAgICAvLyB0aGF0IGNhbiBmYWlsIGFib3ZlIHRoaXMgbGluZSBvciBhbnkgZXJyb3Igd2lsbCBjYXVzZSB1bmRlZmluZWQgYmVoYXZpb3IuCisgICAgaWYgKHNldGptcChtRXJyb3JNYW5hZ2VyLm1KdW1wQnVmZmVyKSkgeworICAgICAgICAvLyBUaGlzIGlzIHdoZXJlIHRoZSBlcnJvciBoYW5kbGVyIHdpbGwganVtcCBpbiBjYXNlIGNvbXByZXNzaW9uIGZhaWxzCisgICAgICAgIC8vIFRoZSBlcnJvciBtYW5hZ2VyIHdpbGwgQUxPRyBhbiBhcHByb3ByaWF0ZSBlcnJvciBtZXNzYWdlCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBqcGVnX3N0YXJ0X2NvbXByZXNzKCZtQ29tcHJlc3NJbmZvLCBUUlVFKTsKKworICAgIGF0dGFjaEV4aWZEYXRhKGV4aWZEYXRhKTsKKworICAgIC8vIHByb2Nlc3MgMTYgbGluZXMgb2YgWSBhbmQgOCBsaW5lcyBvZiBVL1YgZWFjaCB0aW1lLgorICAgIHdoaWxlIChtQ29tcHJlc3NJbmZvLm5leHRfc2NhbmxpbmUgPCBtQ29tcHJlc3NJbmZvLmltYWdlX2hlaWdodCkgeworICAgICAgICAvL2RlaW50ZXJsZWF2ZSB1IGFuZCB2CisgICAgICAgIGRlaW50ZXJsZWF2ZSh2dVBsYW5hciwgdVJvd3MsIHZSb3dzLCBtQ29tcHJlc3NJbmZvLm5leHRfc2NhbmxpbmUsCisgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCB3aWR0aCk7CisKKyAgICAgICAgLy8gSnBlZyBsaWJyYXJ5IGlnbm9yZXMgdGhlIHJvd3Mgd2hvc2UgaW5kaWNlcyBhcmUgZ3JlYXRlciB0aGFuIGhlaWdodC4KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDE2OyBpKyspIHsKKyAgICAgICAgICAgIC8vIHkgcm93CisgICAgICAgICAgICB5W2ldID0geVBsYW5hciArIChtQ29tcHJlc3NJbmZvLm5leHRfc2NhbmxpbmUgKyBpKSAqIHdpZHRoOworCisgICAgICAgICAgICAvLyBjb25zdHJ1Y3QgdSByb3cgYW5kIHYgcm93CisgICAgICAgICAgICBpZiAoKGkgJiAxKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gaGVpZ2h0IGFuZCB3aWR0aCBhcmUgYm90aCBoYWx2ZWQgYmVjYXVzZSBvZiBkb3duc2FtcGxpbmcKKyAgICAgICAgICAgICAgICBvZmZzZXQgPSAoaSA+PiAxKSAqICh3aWR0aCA+PiAxKTsKKyAgICAgICAgICAgICAgICBjYltpLzJdID0gJnVSb3dzW29mZnNldF07CisgICAgICAgICAgICAgICAgY3JbaS8yXSA9ICZ2Um93c1tvZmZzZXRdOworICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAganBlZ193cml0ZV9yYXdfZGF0YSgmbUNvbXByZXNzSW5mbywgY29uc3RfY2FzdDxKU0FNUElNQUdFPihwbGFuZXMpLCAxNik7CisgICAgfQorCisgICAganBlZ19maW5pc2hfY29tcHJlc3MoJm1Db21wcmVzc0luZm8pOworICAgIGpwZWdfZGVzdHJveV9jb21wcmVzcygmbUNvbXByZXNzSW5mbyk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBOVjEyQ29tcHJlc3Nvcjo6YXR0YWNoRXhpZkRhdGEoRXhpZkRhdGEqIGV4aWZEYXRhKSB7CisgICAgaWYgKGV4aWZEYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gVGhpcyBpcyBub3QgYW4gZXJyb3IsIHdlIGRvbid0IHJlcXVpcmUgRVhJRiBkYXRhCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIFNhdmUgdGhlIEVYSUYgZGF0YSB0byBtZW1vcnkKKyAgICB1bnNpZ25lZCBjaGFyKiByYXdEYXRhID0gbnVsbHB0cjsKKyAgICB1bnNpZ25lZCBpbnQgc2l6ZSA9IDA7CisgICAgZXhpZl9kYXRhX3NhdmVfZGF0YShleGlmRGF0YSwgJnJhd0RhdGEsICZzaXplKTsKKyAgICBpZiAocmF3RGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIEVYSUYgZGF0YSBibG9jayIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAganBlZ193cml0ZV9tYXJrZXIoJm1Db21wcmVzc0luZm8sIEpQRUdfQVBQMCArIDEsIHJhd0RhdGEsIHNpemUpOworICAgIGZyZWUocmF3RGF0YSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK05WMTJDb21wcmVzc29yOjpFcnJvck1hbmFnZXI6OkVycm9yTWFuYWdlcigpIHsKKyAgICBlcnJvcl9leGl0ID0gJm9uSnBlZ0Vycm9yOworfQorCit2b2lkIE5WMTJDb21wcmVzc29yOjpFcnJvck1hbmFnZXI6Om9uSnBlZ0Vycm9yKGpfY29tbW9uX3B0ciBjaW5mbykgeworICAgIC8vIE5PVEUhIERvIG5vdCBjb25zdHJ1Y3QgYW55IG5vbi10cml2aWFsIG9iamVjdHMgaW4gdGhpcyBtZXRob2QgYXQgdGhlIHRvcAorICAgIC8vIHNjb3BlLiBUaGVpciBkZXN0cnVjdG9ycyB3aWxsIG5vdCBiZSBjYWxsZWQuIElmIHlvdSBkbyBuZWVkIHN1Y2ggYW4KKyAgICAvLyBvYmplY3QgY3JlYXRlIGEgbG9jYWwgc2NvcGUgdGhhdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBsb25nam1wIGNhbGwsCisgICAgLy8gdGhhdCBlbnN1cmVzIHRoZSBvYmplY3QgaXMgZGVzdHJveWVkIGJlZm9yZSBsb25nam1wIGlzIGNhbGxlZC4KKyAgICBFcnJvck1hbmFnZXIqIGVycm9yTWFuYWdlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8RXJyb3JNYW5hZ2VyKj4oY2luZm8tPmVycik7CisKKyAgICAvLyBGb3JtYXQgYW5kIGxvZyBlcnJvciBtZXNzYWdlCisgICAgY2hhciBlcnJvck1lc3NhZ2VbSk1TR19MRU5HVEhfTUFYXTsKKyAgICAoKmVycm9yTWFuYWdlci0+Zm9ybWF0X21lc3NhZ2UpKGNpbmZvLCBlcnJvck1lc3NhZ2UpOworICAgIGVycm9yTWVzc2FnZVtzaXplb2YoZXJyb3JNZXNzYWdlKSAtIDFdID0gJ1wwJzsKKyAgICBBTE9HRSgiSlBFRyBjb21wcmVzc2lvbiBlcnJvcjogJXMiLCBlcnJvck1lc3NhZ2UpOworICAgIGpwZWdfZGVzdHJveShjaW5mbyk7CisKKyAgICAvLyBBbmQgdGhyb3VnaCB0aGUgbG9va2luZyBnbGFzcyB3ZSBnbworICAgIGxvbmdqbXAoZXJyb3JNYW5hZ2VyLT5tSnVtcEJ1ZmZlciwgMSk7Cit9CisKK05WMTJDb21wcmVzc29yOjpEZXN0aW5hdGlvbk1hbmFnZXI6OkRlc3RpbmF0aW9uTWFuYWdlcigpIHsKKyAgICBpbml0X2Rlc3RpbmF0aW9uID0gJmluaXREZXN0aW5hdGlvbjsKKyAgICBlbXB0eV9vdXRwdXRfYnVmZmVyID0gJmVtcHR5T3V0cHV0QnVmZmVyOworICAgIHRlcm1fZGVzdGluYXRpb24gPSAmdGVybURlc3RpbmF0aW9uOworfQorCit2b2lkIE5WMTJDb21wcmVzc29yOjpEZXN0aW5hdGlvbk1hbmFnZXI6OmluaXREZXN0aW5hdGlvbihqX2NvbXByZXNzX3B0ciBjaW5mbykgeworICAgIGF1dG8gbWFuYWdlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8RGVzdGluYXRpb25NYW5hZ2VyKj4oY2luZm8tPmRlc3QpOworCisgICAgLy8gU3RhcnQgb3V0IHdpdGggc29tZSBhcmJpdHJhcnkgYnV0IG5vdCB0b28gbGFyZ2UgYnVmZmVyIHNpemUKKyAgICBtYW5hZ2VyLT5tQnVmZmVyLnJlc2l6ZSgxNiAqIDEwMjQpOworICAgIG1hbmFnZXItPm5leHRfb3V0cHV0X2J5dGUgPSAmbWFuYWdlci0+bUJ1ZmZlclswXTsKKyAgICBtYW5hZ2VyLT5mcmVlX2luX2J1ZmZlciA9IG1hbmFnZXItPm1CdWZmZXIuc2l6ZSgpOworfQorCitib29sZWFuIE5WMTJDb21wcmVzc29yOjpEZXN0aW5hdGlvbk1hbmFnZXI6OmVtcHR5T3V0cHV0QnVmZmVyKAorICAgICAgICBqX2NvbXByZXNzX3B0ciBjaW5mbykgeworICAgIGF1dG8gbWFuYWdlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8RGVzdGluYXRpb25NYW5hZ2VyKj4oY2luZm8tPmRlc3QpOworCisgICAgLy8gS2VlcCBkb3VibGluZyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGZvciBhIHZlcnkgbG93LCBhbW9ydGl6ZWQKKyAgICAvLyBwZXJmb3JtYW5jZSBjb3N0IG9mIHRoZSBhbGxvY2F0aW9ucworICAgIHNpemVfdCBvbGRTaXplID0gbWFuYWdlci0+bUJ1ZmZlci5zaXplKCk7CisgICAgbWFuYWdlci0+bUJ1ZmZlci5yZXNpemUob2xkU2l6ZSAqIDIpOworICAgIG1hbmFnZXItPm5leHRfb3V0cHV0X2J5dGUgPSAmbWFuYWdlci0+bUJ1ZmZlcltvbGRTaXplXTsKKyAgICBtYW5hZ2VyLT5mcmVlX2luX2J1ZmZlciA9IG1hbmFnZXItPm1CdWZmZXIuc2l6ZSgpIC0gb2xkU2l6ZTsKKyAgICByZXR1cm4gbWFuYWdlci0+ZnJlZV9pbl9idWZmZXIgIT0gMDsKK30KKwordm9pZCBOVjEyQ29tcHJlc3Nvcjo6RGVzdGluYXRpb25NYW5hZ2VyOjp0ZXJtRGVzdGluYXRpb24oal9jb21wcmVzc19wdHIgY2luZm8pIHsKKyAgICBhdXRvIG1hbmFnZXIgPSByZWludGVycHJldF9jYXN0PERlc3RpbmF0aW9uTWFuYWdlcio+KGNpbmZvLT5kZXN0KTsKKworICAgIC8vIFJlc2l6ZSBkb3duIHRvIHRoZSBleGFjdCBzaXplIG9mIHRoZSBvdXRwdXQsIHRoYXQgaXMgcmVtb3ZlIGFzIG1hbnkKKyAgICAvLyBieXRlcyBhcyB0aGVyZSBhcmUgbGVmdCBpbiB0aGUgYnVmZmVyCisgICAgbWFuYWdlci0+bUJ1ZmZlci5yZXNpemUobWFuYWdlci0+bUJ1ZmZlci5zaXplKCkgLSBtYW5hZ2VyLT5mcmVlX2luX2J1ZmZlcik7Cit9CisKK3N0YXR1c190IE5WMTJDb21wcmVzc29yOjpmaW5kSnBlZ1NpemUodWludDhfdCAqanBlZ0J1ZmZlciwgc2l6ZV90IG1heFNpemUsIHNpemVfdCAqc2l6ZSAvKm91dCovKSB7CisgICAgaWYgKChzaXplID09IG51bGxwdHIpIHx8IChqcGVnQnVmZmVyID09IG51bGxwdHIpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKGNoZWNrSnBlZ1N0YXJ0KGpwZWdCdWZmZXIpID09IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBSZWFkIEpGSUYgc2VnbWVudCBtYXJrZXJzLCBza2lwIG92ZXIgc2VnbWVudCBkYXRhCisgICAgKnNpemUgPSBrTWFya2VyTGVuZ3RoOyAvL2p1bXAgdG8gU3RhcnQgT2YgSW1hZ2UKKyAgICB3aGlsZSAoKnNpemUgPD0gbWF4U2l6ZSAtIGtNYXJrZXJMZW5ndGgpIHsKKyAgICAgICAgc2VnbWVudF90ICpzZWdtZW50ID0gKHNlZ21lbnRfdCopKGpwZWdCdWZmZXIgKyAqc2l6ZSk7CisgICAgICAgIHVpbnQ4X3QgdHlwZSA9IGNoZWNrSnBlZ01hcmtlcihzZWdtZW50LT5tYXJrZXIpOworICAgICAgICBpZiAodHlwZSA9PSAwKSB7IC8vIGludmFsaWQgbWFya2VyLCBubyBtb3JlIHNlZ21lbnRzLCBiZWdpbiBKUEVHIGRhdGEKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmICh0eXBlID09IGtFbmRPZkltYWdlIHx8ICpzaXplID4gbWF4U2l6ZSAtIHNpemVvZihzZWdtZW50X3QpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IGxlbmd0aCA9IG50b2hzKHNlZ21lbnQtPmxlbmd0aCk7CisgICAgICAgICpzaXplICs9IGxlbmd0aCArIGtNYXJrZXJMZW5ndGg7CisgICAgfQorCisgICAgLy8gRmluZCBFbmQgb2YgSW1hZ2UKKyAgICAvLyBTY2FuIEpQRUcgYnVmZmVyIHVudGlsIEVuZCBvZiBJbWFnZQorICAgIGJvb2wgZm91bmRFbmQgPSBmYWxzZTsKKyAgICBmb3IgKCA7ICpzaXplIDw9IG1heFNpemUgLSBrTWFya2VyTGVuZ3RoOyAoKnNpemUpKyspIHsKKyAgICAgICAgaWYgKGNoZWNrSnBlZ0VuZChqcGVnQnVmZmVyICsgKnNpemUpKSB7CisgICAgICAgICAgICBmb3VuZEVuZCA9IHRydWU7CisgICAgICAgICAgICAqc2l6ZSArPSBrTWFya2VyTGVuZ3RoOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIWZvdW5kRW5kKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKCpzaXplID4gbWF4U2l6ZSkgeworICAgICAgICAqc2l6ZSA9IG1heFNpemU7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOVjEyQ29tcHJlc3Nvcjo6Z2V0SnBlZ0ltYWdlRGltZW5zaW9ucyh1aW50OF90ICpqcGVnQnVmZmVyLAorICAgICAgICBzaXplX3QganBlZ0J1ZmZlclNpemUsIHNpemVfdCAqd2lkdGggLypvdXQqLywgc2l6ZV90ICpoZWlnaHQgLypvdXQqLykgeworICAgIGlmICgoanBlZ0J1ZmZlciA9PSBudWxscHRyKSB8fCAod2lkdGggPT0gbnVsbHB0cikgfHwgKGhlaWdodCA9PSBudWxscHRyKSB8fAorICAgICAgICAgICAgKGpwZWdCdWZmZXJTaXplID09IDB1KSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIFNjYW4gSlBFRyBidWZmZXIgdW50aWwgU3RhcnQgb2YgRnJhbWUKKyAgICBib29sIGZvdW5kU09GID0gZmFsc2U7CisgICAgc2l6ZV90IGN1cnJlbnRQb3M7CisgICAgZm9yIChjdXJyZW50UG9zID0gMDsgY3VycmVudFBvcyA8PSBqcGVnQnVmZmVyU2l6ZSAtIGtNYXJrZXJMZW5ndGg7IGN1cnJlbnRQb3MrKykgeworICAgICAgICBpZiAoY2hlY2tTdGFydE9mRnJhbWUoanBlZ0J1ZmZlciArIGN1cnJlbnRQb3MpKSB7CisgICAgICAgICAgICBmb3VuZFNPRiA9IHRydWU7CisgICAgICAgICAgICBjdXJyZW50UG9zICs9IGtNYXJrZXJMZW5ndGg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghZm91bmRTT0YpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdGFydCBvZiBGcmFtZSBub3QgZm91bmQiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgc29mX3QgKnN0YXJ0T2ZGcmFtZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8c29mX3QgKj4gKGpwZWdCdWZmZXIgKyBjdXJyZW50UG9zKTsKKyAgICAqd2lkdGggPSBudG9ocyhzdGFydE9mRnJhbWUtPndpZHRoKTsKKyAgICAqaGVpZ2h0ID0gbnRvaHMoc3RhcnRPZkZyYW1lLT5oZWlnaHQpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBOVjEyQ29tcHJlc3Nvcjo6Z2V0RXhpZk9yaWVudGF0aW9uKHVpbnQ4X3QgKmpwZWdCdWZmZXIsIHNpemVfdCBqcGVnQnVmZmVyU2l6ZSwKKyAgICAgICAgRXhpZk9yaWVudGF0aW9uICpleGlmVmFsdWUgLypvdXQqLykgeworICAgIGlmICgoanBlZ0J1ZmZlciA9PSBudWxscHRyKSB8fCAoZXhpZlZhbHVlID09IG51bGxwdHIpIHx8IChqcGVnQnVmZmVyU2l6ZSA9PSAwdSkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkRhdGE+IGV4aWZEYXRhKGV4aWZfZGF0YV9uZXcoKSk7CisgICAgZXhpZl9kYXRhX2xvYWRfZGF0YShleGlmRGF0YS5nZXQoKSwganBlZ0J1ZmZlciwganBlZ0J1ZmZlclNpemUpOworICAgIEV4aWZFbnRyeSAqb3JpZW50YXRpb24gPSBleGlmX2NvbnRlbnRfZ2V0X2VudHJ5KGV4aWZEYXRhLT5pZmRbRVhJRl9JRkRfMF0sCisgICAgICAgICAgICBFWElGX1RBR19PUklFTlRBVElPTik7CisgICAgaWYgKChvcmllbnRhdGlvbiA9PSBudWxscHRyKSB8fCAob3JpZW50YXRpb24tPnNpemUgIT0gc2l6ZW9mKEV4aWZTaG9ydCkpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgYXV0byBvcmllbnRhdGlvblZhbHVlID0gZXhpZl9nZXRfc2hvcnQob3JpZW50YXRpb24tPmRhdGEsCisgICAgICAgICAgICBleGlmX2RhdGFfZ2V0X2J5dGVfb3JkZXIoZXhpZkRhdGEuZ2V0KCkpKTsKKyAgICBzdGF0dXNfdCByZXQ7CisgICAgc3dpdGNoIChvcmllbnRhdGlvblZhbHVlKSB7CisgICAgICAgIGNhc2UgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8wX0RFR1JFRVM6CisgICAgICAgIGNhc2UgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl85MF9ERUdSRUVTOgorICAgICAgICBjYXNlIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMTgwX0RFR1JFRVM6CisgICAgICAgIGNhc2UgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8yNzBfREVHUkVFUzoKKyAgICAgICAgICAgICpleGlmVmFsdWUgPSBzdGF0aWNfY2FzdDxFeGlmT3JpZW50YXRpb24+IChvcmllbnRhdGlvblZhbHVlKTsKKyAgICAgICAgICAgIHJldCA9IE9LOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQgRVhJRiBvcmllbnRhdGlvbiB2YWx1ZTogJXUiLCBfX0ZVTkNUSU9OX18sIG9yaWVudGF0aW9uVmFsdWUpOworICAgICAgICAgICAgcmV0ID0gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9OVjEyQ29tcHJlc3Nvci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvTlYxMkNvbXByZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTIyZDVlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvTlYxMkNvbXByZXNzb3IuaApAQCAtMCwwICsxLDEzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVEVTVF9DQU1FUkFfSlBFR19TVFVCX05WMTJfQ09NUFJFU1NPUl9ICisjZGVmaW5lIFRFU1RfQ0FNRVJBX0pQRUdfU1RVQl9OVjEyX0NPTVBSRVNTT1JfSAorCisjaW5jbHVkZSA8c2V0am1wLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CitleHRlcm4gIkMiIHsKKyNpbmNsdWRlIDxqcGVnbGliLmg+CisjaW5jbHVkZSA8amVycm9yLmg+Cit9CisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICIuLi91dGlscy9FeGlmVXRpbHMuaCIKKworc3RydWN0IF9FeGlmRGF0YTsKK3R5cGVkZWYgX0V4aWZEYXRhIEV4aWZEYXRhOworCitjbGFzcyBOVjEyQ29tcHJlc3NvciB7CitwdWJsaWM6CisgICAgTlYxMkNvbXByZXNzb3IoKSB7fQorCisgICAgLyogQ29tcHJlc3MgfGRhdGF8IHdoaWNoIHJlcHJlc2VudHMgcmF3IE5WMjEgZW5jb2RlZCBkYXRhIG9mIGRpbWVuc2lvbnMKKyAgICAgKiB8d2lkdGh8ICogfGhlaWdodHwuCisgICAgICovCisgICAgYm9vbCBjb21wcmVzcyhjb25zdCB1bnNpZ25lZCBjaGFyKiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBxdWFsaXR5KTsKKyAgICBib29sIGNvbXByZXNzV2l0aEV4aWZPcmllbnRhdGlvbihjb25zdCB1bnNpZ25lZCBjaGFyKiBkYXRhLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBxdWFsaXR5LAorICAgICAgICAgICAgYW5kcm9pZDo6Y2FtZXJhMzo6RXhpZk9yaWVudGF0aW9uIGV4aWZWYWx1ZSk7CisKKyAgICAvKiBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIGNvbXByZXNzZWQgZGF0YSwgdGhpcyB3aWxsIHJldHVybiBhbiBlbXB0eSB2ZWN0b3IKKyAgICAgKiBpZiBjb21wcmVzcyBoYXMgbm90IGJlZW4gY2FsbGVkIHlldAorICAgICAqLworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+JiBnZXRDb21wcmVzc2VkRGF0YSgpIGNvbnN0OworCisgICAgLy8gVXRpbGl0eSBtZXRob2RzCisgICAgc3RhdGljIGFuZHJvaWQ6OnN0YXR1c190IGZpbmRKcGVnU2l6ZSh1aW50OF90ICpqcGVnQnVmZmVyLCBzaXplX3QgbWF4U2l6ZSwKKyAgICAgICAgICAgIHNpemVfdCAqc2l6ZSAvKm91dCovKTsKKworICAgIHN0YXRpYyBhbmRyb2lkOjpzdGF0dXNfdCBnZXRFeGlmT3JpZW50YXRpb24odWludDhfdCAqanBlZ0J1ZmZlciwKKyAgICAgICAgICAgIHNpemVfdCBqcGVnQnVmZmVyU2l6ZSwgYW5kcm9pZDo6Y2FtZXJhMzo6RXhpZk9yaWVudGF0aW9uICpleGlmVmFsdWUgLypvdXQqLyk7CisKKyAgICAvKiBHZXQgSnBlZyBpbWFnZSBkaW1lbnNpb25zIGZyb20gdGhlIGZpcnN0IFN0YXJ0IE9mIEZyYW1lLiBQbGVhc2Ugbm90ZSB0aGF0IGR1ZSB0byB0aGUKKyAgICAgKiB3YXkgdGhlIGpwZWcgYnVmZmVyIGlzIHNjYW5uZWQgaWYgdGhlIGltYWdlIGNvbnRhaW5zIGEgdGh1bWJuYWlsLCB0aGVuIHRoZSBzaXplIHJldHVybmVkCisgICAgICogd2lsbCBiZSBvZiB0aGUgdGh1bWJuYWlsIGFuZCBub3QgdGhlIG1haW4gaW1hZ2UuCisgICAgICovCisgICAgc3RhdGljIGFuZHJvaWQ6OnN0YXR1c190IGdldEpwZWdJbWFnZURpbWVuc2lvbnModWludDhfdCAqanBlZ0J1ZmZlciwgc2l6ZV90IGpwZWdCdWZmZXJTaXplLAorICAgICAgICAgICAgc2l6ZV90ICp3aWR0aCAvKm91dCovLCBzaXplX3QgKmhlaWdodCAvKm91dCovKTsKKworcHJpdmF0ZToKKworICAgIHN0cnVjdCBEZXN0aW5hdGlvbk1hbmFnZXIgOiBqcGVnX2Rlc3RpbmF0aW9uX21nciB7CisgICAgICAgIERlc3RpbmF0aW9uTWFuYWdlcigpOworCisgICAgICAgIHN0YXRpYyB2b2lkIGluaXREZXN0aW5hdGlvbihqX2NvbXByZXNzX3B0ciBjaW5mbyk7CisgICAgICAgIHN0YXRpYyBib29sZWFuIGVtcHR5T3V0cHV0QnVmZmVyKGpfY29tcHJlc3NfcHRyIGNpbmZvKTsKKyAgICAgICAgc3RhdGljIHZvaWQgdGVybURlc3RpbmF0aW9uKGpfY29tcHJlc3NfcHRyIGNpbmZvKTsKKworICAgICAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiBtQnVmZmVyOworICAgIH07CisKKyAgICBzdHJ1Y3QgRXJyb3JNYW5hZ2VyIDoganBlZ19lcnJvcl9tZ3IgeworICAgICAgICBFcnJvck1hbmFnZXIoKTsKKworICAgICAgICBzdGF0aWMgdm9pZCBvbkpwZWdFcnJvcihqX2NvbW1vbl9wdHIgY2luZm8pOworCisgICAgICAgIGptcF9idWYgbUp1bXBCdWZmZXI7CisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01hcmtlckxlbmd0aCA9IDI7IC8vIGxlbmd0aCBvZiBhIG1hcmtlcgorICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtNYXJrZXIgPSAweEZGOyAvLyBGaXJzdCBieXRlIG9mIG1hcmtlcgorICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtTdGFydE9mSW1hZ2UgPSAweEQ4OyAvLyBTdGFydCBvZiBJbWFnZQorICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtFbmRPZkltYWdlID0gMHhEOTsgLy8gRW5kIG9mIEltYWdlCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1N0YXJ0T2ZGcmFtZSA9IDB4QzA7IC8vIFN0YXJ0IG9mIEZyYW1lCisKKyAgICBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc2VnbWVudF90IHsKKyAgICAgICAgdWludDhfdCBtYXJrZXJba01hcmtlckxlbmd0aF07CisgICAgICAgIHVpbnQxNl90IGxlbmd0aDsKKyAgICB9OworCisgICAgc3RydWN0IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpIHNvZl90IHsKKyAgICAgICAgdWludDE2X3QgbGVuZ3RoOworICAgICAgICB1aW50OF90IHByZWNpc2lvbjsKKyAgICAgICAgdWludDE2X3QgaGVpZ2h0OworICAgICAgICB1aW50MTZfdCB3aWR0aDsKKyAgICB9OworCisgICAgLy8gY2hlY2sgZm9yIHN0YXJ0IG9mIGltYWdlIG1hcmtlcgorICAgIHN0YXRpYyBib29sIGNoZWNrU3RhcnRPZkZyYW1lKHVpbnQ4X3QqIGJ1ZikgeworICAgICAgICByZXR1cm4gYnVmWzBdID09IGtNYXJrZXIgJiYgYnVmWzFdID09IGtTdGFydE9mRnJhbWU7CisgICAgfQorCisgICAgLy8gY2hlY2sgZm9yIHN0YXJ0IG9mIGltYWdlIG1hcmtlcgorICAgIHN0YXRpYyBib29sIGNoZWNrSnBlZ1N0YXJ0KHVpbnQ4X3QqIGJ1ZikgeworICAgICAgICByZXR1cm4gYnVmWzBdID09IGtNYXJrZXIgJiYgYnVmWzFdID09IGtTdGFydE9mSW1hZ2U7CisgICAgfQorCisgICAgLy8gY2hlY2sgZm9yIEVuZCBvZiBJbWFnZSBtYXJrZXIKKyAgICBzdGF0aWMgYm9vbCBjaGVja0pwZWdFbmQodWludDhfdCAqYnVmKSB7CisgICAgICAgIHJldHVybiBidWZbMF0gPT0ga01hcmtlciAmJiBidWZbMV0gPT0ga0VuZE9mSW1hZ2U7CisgICAgfQorCisgICAgLy8gY2hlY2sgZm9yIGFyYml0cmFyeSBtYXJrZXIsIHJldHVybnMgbWFya2VyIHR5cGUgKHNlY29uZCBieXRlKQorICAgIC8vIHJldHVybnMgMCBpZiBubyBtYXJrZXIgZm91bmQuIE5vdGU6IDB4MDAgaXMgbm90IGEgdmFsaWQgbWFya2VyIHR5cGUKKyAgICBzdGF0aWMgdWludDhfdCBjaGVja0pwZWdNYXJrZXIodWludDhfdCAqYnVmKSB7CisgICAgICAgIHJldHVybiAoYnVmWzBdID09IGtNYXJrZXIpID8gYnVmWzFdIDogMDsKKyAgICB9CisKKyAgICBqcGVnX2NvbXByZXNzX3N0cnVjdCBtQ29tcHJlc3NJbmZvOworICAgIERlc3RpbmF0aW9uTWFuYWdlciBtRGVzdE1hbmFnZXI7CisgICAgRXJyb3JNYW5hZ2VyIG1FcnJvck1hbmFnZXI7CisKKyAgICBib29sIGNvbmZpZ3VyZUNvbXByZXNzb3IoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcXVhbGl0eSk7CisgICAgYm9vbCBjb21wcmVzc0RhdGEoY29uc3QgdW5zaWduZWQgY2hhciogZGF0YSwgRXhpZkRhdGEqIGV4aWZEYXRhKTsKKyAgICBib29sIGF0dGFjaEV4aWZEYXRhKEV4aWZEYXRhKiBleGlmRGF0YSk7Cit9OworCisjZW5kaWYgIC8vIFRFU1RfQ0FNRVJBX0pQRUdfU1RVQl9OVjEyX0NPTVBSRVNTT1JfSAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjllMzQ0YgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmNwcApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkNhbWVyYVRocmVhZFN0YXRlLmgiCisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitpbnQgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKSB7CisgICAgaWYgKGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5pc1NlcnZpbmdDYWxsKCkpIHsKKyAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgfQorICAgIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Cit9CisKK2ludCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpIHsKKyAgICBpZiAoaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmlzU2VydmluZ0NhbGwoKSkgeworICAgICAgICByZXR1cm4gaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKKyAgICB9CisgICAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKK30KKworaW50NjRfdCBDYW1lcmFUaHJlYWRTdGF0ZTo6Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKSB7CisgICAgaWYgKGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5pc1NlcnZpbmdDYWxsKCkpIHsKKyAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgIH0KKyAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKK30KKwordm9pZCBDYW1lcmFUaHJlYWRTdGF0ZTo6cmVzdG9yZUNhbGxpbmdJZGVudGl0eShpbnQ2NF90IHRva2VuKSB7CisgICAgaWYgKGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5pc1NlcnZpbmdDYWxsKCkpIHsKKyAgICAgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgIH0gZWxzZSB7CisgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK30gLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFhNzBkZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworY2xhc3MgQ2FtZXJhVGhyZWFkU3RhdGUgeworcHVibGljOgorICBzdGF0aWMgaW50NjRfdCBjbGVhckNhbGxpbmdJZGVudGl0eSgpOworCisgIHN0YXRpYyB2b2lkIHJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaW50NjRfdCB0b2tlbik7CisKKyAgc3RhdGljIGludCBnZXRDYWxsaW5nVWlkKCk7CisKKyAgc3RhdGljIGludCBnZXRDYWxsaW5nUGlkKCk7Cit9OworCit9IC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NsaWVudE1hbmFnZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NsaWVudE1hbmFnZXIuaAppbmRleCBkNzEzNWYxLi5lYzZmMDFjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DbGllbnRNYW5hZ2VyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2xpZW50TWFuYWdlci5oCkBAIC0zMywxMiArMzMsMzggQEAKIAogY2xhc3MgQ2xpZW50UHJpb3JpdHkgewogcHVibGljOgotICAgIENsaWVudFByaW9yaXR5KGludDMyX3Qgc2NvcmUsIGludDMyX3Qgc3RhdGUpIDoKLSAgICAgICAgbVNjb3JlKHNjb3JlKSwgbVN0YXRlKHN0YXRlKSB7fQorICAgIC8qKgorICAgICAqIENob29zaW5nIHRvIHNldCBtSXNWZW5kb3JDbGllbnQgdGhyb3VnaCBhIHBhcmFtZXRlciBpbnN0ZWFkIG9mIGNhbGxpbmcKKyAgICAgKiBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+aXNTZXJ2aW5nQ2FsbCgpIHRvIHByb3RlY3QgYWdhaW5zdCB0aGUKKyAgICAgKiBjYXNlIHdoZXJlIHRoZSBjb25zdHJ1Y3Rpb24gaXMgb2ZmbG9hZGVkIHRvIGFub3RoZXIgdGhyZWFkIHdoaWNoIGlzbid0IGEKKyAgICAgKiBod2JpbmRlciB0aHJlYWQuCisgICAgICovCisgICAgQ2xpZW50UHJpb3JpdHkoaW50MzJfdCBzY29yZSwgaW50MzJfdCBzdGF0ZSwgYm9vbCBpc1ZlbmRvckNsaWVudCkgOgorICAgICAgICAgICAgbVNjb3JlKHNjb3JlKSwgbVN0YXRlKHN0YXRlKSwgbUlzVmVuZG9yQ2xpZW50KGlzVmVuZG9yQ2xpZW50KSB7IH0KIAogICAgIGludDMyX3QgZ2V0U2NvcmUoKSBjb25zdCB7IHJldHVybiBtU2NvcmU7IH0KICAgICBpbnQzMl90IGdldFN0YXRlKCkgY29uc3QgeyByZXR1cm4gbVN0YXRlOyB9CiAKKyAgICB2b2lkIHNldFNjb3JlKGludDMyX3Qgc2NvcmUpIHsKKyAgICAgICAgLy8gRm9yIHZlbmRvciBjbGllbnRzLCB0aGUgc2NvcmUgaXMgc2V0IG9uY2UgYW5kIGZvciBhbGwgZHVyaW5nCisgICAgICAgIC8vIGNvbnN0cnVjdGlvbi4gT3RoZXJ3aXNlLCBpdCBjYW4gZ2V0IHJlc2V0IGVhY2ggdGltZSBjYW1lcmFzZXJ2ZXIKKyAgICAgICAgLy8gcXVlcmllcyBBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlIGZvciBvb21fYWRqIHNjb3JlcyAvIHN0YXRlcyAuCisgICAgICAgIGlmICghbUlzVmVuZG9yQ2xpZW50KSB7CisgICAgICAgICAgICBtU2NvcmUgPSBzY29yZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc2V0U3RhdGUoaW50MzJfdCBzdGF0ZSkgeworICAgICAgLy8gRm9yIHZlbmRvciBjbGllbnRzLCB0aGUgc2NvcmUgaXMgc2V0IG9uY2UgYW5kIGZvciBhbGwgZHVyaW5nCisgICAgICAvLyBjb25zdHJ1Y3Rpb24uIE90aGVyd2lzZSwgaXQgY2FuIGdldCByZXNldCBlYWNoIHRpbWUgY2FtZXJhc2VydmVyCisgICAgICAvLyBxdWVyaWVzIEFjdGl2aXR5TWFuYWdlclNlcnZpY2UgZm9yIG9vbV9hZGogc2NvcmVzIC8gc3RhdGVzCisgICAgICAvLyAoQWN0aXZpdHlNYW5hZ2VyU2VydmljZSByZXR1cm5zIGEgdmVuZG9yIHByb2Nlc3MnIHN0YXRlIGFzCisgICAgICAvLyBQUk9DRVNTX1NUQVRFX05PTkVYSVNURU5ULgorICAgICAgaWYgKCFtSXNWZW5kb3JDbGllbnQpIHsKKyAgICAgICAgICBtU3RhdGUgPSBzdGF0ZTsKKyAgICAgIH0KKyAgICB9CisKICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgQ2xpZW50UHJpb3JpdHkmIHJocykgY29uc3QgewogICAgICAgICByZXR1cm4gKHRoaXMtPm1TY29yZSA9PSByaHMubVNjb3JlKSAmJiAodGhpcy0+bVN0YXRlID09IHJocy5tU3RhdGUpOwogICAgIH0KQEAgLTY2LDYgKzkyLDcgQEAKIHByaXZhdGU6CiAgICAgICAgIGludDMyX3QgbVNjb3JlOwogICAgICAgICBpbnQzMl90IG1TdGF0ZTsKKyAgICAgICAgYm9vbCBtSXNWZW5kb3JDbGllbnQgPSBmYWxzZTsKIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC04Miw5ICsxMDksMTAgQEAKIGNsYXNzIENsaWVudERlc2NyaXB0b3IgZmluYWwgewogcHVibGljOgogICAgIENsaWVudERlc2NyaXB0b3IoY29uc3QgS0VZJiBrZXksIGNvbnN0IFZBTFVFJiB2YWx1ZSwgaW50MzJfdCBjb3N0LAotICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8S0VZPiYgY29uZmxpY3RpbmdLZXlzLCBpbnQzMl90IHNjb3JlLCBpbnQzMl90IG93bmVySWQsIGludDMyX3Qgc3RhdGUpOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8S0VZPiYgY29uZmxpY3RpbmdLZXlzLCBpbnQzMl90IHNjb3JlLCBpbnQzMl90IG93bmVySWQsIGludDMyX3Qgc3RhdGUsCisgICAgICAgICAgICBib29sIGlzVmVuZG9yQ2xpZW50KTsKICAgICBDbGllbnREZXNjcmlwdG9yKEtFWSYmIGtleSwgVkFMVUUmJiB2YWx1ZSwgaW50MzJfdCBjb3N0LCBzdGQ6OnNldDxLRVk+JiYgY29uZmxpY3RpbmdLZXlzLAotICAgICAgICAgICAgaW50MzJfdCBzY29yZSwgaW50MzJfdCBvd25lcklkLCBpbnQzMl90IHN0YXRlKTsKKyAgICAgICAgICAgIGludDMyX3Qgc2NvcmUsIGludDMyX3Qgb3duZXJJZCwgaW50MzJfdCBzdGF0ZSwgYm9vbCBpc1ZlbmRvckNsaWVudCk7CiAKICAgICB+Q2xpZW50RGVzY3JpcHRvcigpOwogCkBAIC0xNDgsMTcgKzE3NiwxOSBAQAogCiB0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFPgogQ2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPjo6Q2xpZW50RGVzY3JpcHRvcihjb25zdCBLRVkmIGtleSwgY29uc3QgVkFMVUUmIHZhbHVlLCBpbnQzMl90IGNvc3QsCi0gICAgICAgIGNvbnN0IHN0ZDo6c2V0PEtFWT4mIGNvbmZsaWN0aW5nS2V5cywgaW50MzJfdCBzY29yZSwgaW50MzJfdCBvd25lcklkLCBpbnQzMl90IHN0YXRlKSA6CisgICAgICAgIGNvbnN0IHN0ZDo6c2V0PEtFWT4mIGNvbmZsaWN0aW5nS2V5cywgaW50MzJfdCBzY29yZSwgaW50MzJfdCBvd25lcklkLCBpbnQzMl90IHN0YXRlLAorICAgICAgICBib29sIGlzVmVuZG9yQ2xpZW50KSA6CiAgICAgICAgIG1LZXl7a2V5fSwgbVZhbHVle3ZhbHVlfSwgbUNvc3R7Y29zdH0sIG1Db25mbGljdGluZ3tjb25mbGljdGluZ0tleXN9LAotICAgICAgICBtUHJpb3JpdHkoc2NvcmUsIHN0YXRlKSwKKyAgICAgICAgbVByaW9yaXR5KHNjb3JlLCBzdGF0ZSwgaXNWZW5kb3JDbGllbnQpLAogICAgICAgICBtT3duZXJJZHtvd25lcklkfSB7fQogCiB0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFPgogQ2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPjo6Q2xpZW50RGVzY3JpcHRvcihLRVkmJiBrZXksIFZBTFVFJiYgdmFsdWUsIGludDMyX3QgY29zdCwKLSAgICAgICAgc3RkOjpzZXQ8S0VZPiYmIGNvbmZsaWN0aW5nS2V5cywgaW50MzJfdCBzY29yZSwgaW50MzJfdCBvd25lcklkLCBpbnQzMl90IHN0YXRlKSA6CisgICAgICAgIHN0ZDo6c2V0PEtFWT4mJiBjb25mbGljdGluZ0tleXMsIGludDMyX3Qgc2NvcmUsIGludDMyX3Qgb3duZXJJZCwgaW50MzJfdCBzdGF0ZSwKKyAgICAgICAgYm9vbCBpc1ZlbmRvckNsaWVudCkgOgogICAgICAgICBtS2V5e3N0ZDo6Zm9yd2FyZDxLRVk+KGtleSl9LCBtVmFsdWV7c3RkOjpmb3J3YXJkPFZBTFVFPih2YWx1ZSl9LCBtQ29zdHtjb3N0fSwKICAgICAgICAgbUNvbmZsaWN0aW5ne3N0ZDo6Zm9yd2FyZDxzdGQ6OnNldDxLRVk+Pihjb25mbGljdGluZ0tleXMpfSwKLSAgICAgICAgbVByaW9yaXR5KHNjb3JlLCBzdGF0ZSksIG1Pd25lcklke293bmVySWR9IHt9CisgICAgICAgIG1Qcmlvcml0eShzY29yZSwgc3RhdGUsIGlzVmVuZG9yQ2xpZW50KSwgbU93bmVySWR7b3duZXJJZH0ge30KIAogdGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRT4KIENsaWVudERlc2NyaXB0b3I8S0VZLCBWQUxVRT46On5DbGllbnREZXNjcmlwdG9yKCkge30KQEAgLTIwNCw3ICsyMzQsMTMgQEAKIAogdGVtcGxhdGU8Y2xhc3MgS0VZLCBjbGFzcyBWQUxVRT4KIHZvaWQgQ2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPjo6c2V0UHJpb3JpdHkoY29uc3QgQ2xpZW50UHJpb3JpdHkmIHByaW9yaXR5KSB7Ci0gICAgbVByaW9yaXR5ID0gcHJpb3JpdHk7CisgICAgLy8gV2UgZG9uJ3QgdXNlIHRoZSB1c3VhbCBjb3B5IGNvbnN0cnVjdG9yIGhlcmUgc2luY2Ugd2Ugd2FudCB0byByZW1lbWJlcgorICAgIC8vIHdoZXRoZXIgYSBjbGllbnQgaXMgYSB2ZW5kb3IgY2xpZW50IG9yIG5vdC4gVGhpcyBjb3VsZCBoYXZlIGJlZW4gd2lwZWQKKyAgICAvLyBvZmYgaW4gdGhlIGluY29taW5nIHByaW9yaXR5IGFyZ3VtZW50IHNpbmNlIGFuIEFJREwgdGhyZWFkIG1pZ2h0IGhhdmUKKyAgICAvLyBjYWxsZWQgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmlzU2VydmluZ0NhbGwoKSBhZnRlciByZWZyZXNoaW5nCisgICAgLy8gcHJpb3JpdGllcyBmb3Igb2xkIGNsaWVudHMgdGhyb3VnaCBQcm9jZXNzSW5mb1NlcnZpY2U6OmdldFByb2Nlc3NTdGF0ZXNTY29yZXNGcm9tUGlkcygpLgorICAgIG1Qcmlvcml0eS5zZXRTY29yZShwcmlvcml0eS5nZXRTY29yZSgpKTsKKyAgICBtUHJpb3JpdHkuc2V0U3RhdGUocHJpb3JpdHkuZ2V0U3RhdGUoKSk7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9FeGlmVXRpbHMuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvRXhpZlV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMGFmZGMxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvRXhpZlV0aWxzLmNwcApAQCAtMCwwICsxLDExMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYVNlcnZlckV4aWZVdGlscyIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8Y3V0aWxzL2xvZy5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxtYXRoLmg+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+R2V0QXBwMUJ1ZmZlcigpLCBhcHAxTGVuZ3RoKTsKK2NsYXNzIEV4aWZVdGlscyB7CisKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5FeGlmVXRpbHMoKTsKKworICAgIHN0YXRpYyBFeGlmVXRpbHMqIGNyZWF0ZSgpOworCisgICAgLy8gSW5pdGlhbGl6ZSgpIGNhbiBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuIFRoZSBzZXR0aW5nIG9mIEV4aWYgdGFncyB3aWxsIGJlCisgICAgLy8gY2xlYXJlZC4KKyAgICB2aXJ0dWFsIGJvb2wgaW5pdGlhbGl6ZShjb25zdCB1bnNpZ25lZCBjaGFyICphcHAxU2VnbWVudCwgc2l6ZV90IGFwcDFTZWdtZW50U2l6ZSkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBpbml0aWFsaXplRW1wdHkoKSA9IDA7CisKKyAgICAvLyBTZXQgYWxsIGtub3duIGZpZWxkcyBmcm9tIGEgbWV0YWRhdGEgc3RydWN0dXJlCisgICAgdmlydHVhbCBib29sIHNldEZyb21NZXRhZGF0YShjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEsCisgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc3RhdGljSW5mbywKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBpbWFnZVdpZHRoLCBjb25zdCBzaXplX3QgaW1hZ2VIZWlnaHQpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGxlbiBhcGVydHVyZS4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRBcGVydHVyZShmbG9hdCBhcGVydHVyZSkgPSAwOworCisgICAgLy8gc2V0cyB0aGUgY29sb3Igc3BhY2UuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0Q29sb3JTcGFjZSh1aW50MTZfdCBjb2xvcl9zcGFjZSkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgZGF0ZSBhbmQgdGltZSBvZiBpbWFnZSBsYXN0IG1vZGlmaWVkLiBJdCB0YWtlcyBsb2NhbCB0aW1lLiBUaGUKKyAgICAvLyBuYW1lIG9mIHRoZSB0YWcgaXMgRGF0ZVRpbWUgaW4gSUZEMC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXREYXRlVGltZShjb25zdCBzdHJ1Y3QgdG0mIHQpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGRpZ2l0YWwgem9vbSByYXRpby4gSWYgdGhlIG51bWVyYXRvciBpcyAwLCBpdCBtZWFucyBkaWdpdGFsIHpvb20KKyAgICAvLyB3YXMgbm90IHVzZWQuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0RGlnaXRhbFpvb21SYXRpbyh1aW50MzJfdCBjcm9wX3dpZHRoLCB1aW50MzJfdCBjcm9wX2hlaWdodCwKKyAgICAgICAgICAgIHVpbnQzMl90IHNlbnNvcl93aWR0aCwgdWludDMyX3Qgc2Vuc29yX2hlaWdodCkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgZXhwb3N1cmUgYmlhcy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRFeHBvc3VyZUJpYXMoaW50MzJfdCBldiwKKyAgICAgICAgICAgIHVpbnQzMl90IGV2X3N0ZXBfbnVtZXJhdG9yLCB1aW50MzJfdCBldl9zdGVwX2Rlbm9taW5hdG9yKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBleHBvc3VyZSBtb2RlIHNldCB3aGVuIHRoZSBpbWFnZSB3YXMgc2hvdC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRFeHBvc3VyZU1vZGUodWludDhfdCBleHBvc3VyZV9tb2RlKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBleHBvc3VyZSB0aW1lLCBnaXZlbiBpbiBzZWNvbmRzLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEV4cG9zdXJlVGltZShmbG9hdCBleHBvc3VyZV90aW1lKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBzdGF0dXMgb2YgZmxhc2guCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0Rmxhc2godWludDhfdCBmbGFzaF9hdmFpbGFibGUsIHVpbnQ4X3QgZmxhc2hfc3RhdGUsIHVpbnQ4X3QgYWVfbW9kZSkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgRiBudW1iZXIuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0Rk51bWJlcihmbG9hdCBmX251bWJlcikgPSAwOworCisgICAgLy8gU2V0cyB0aGUgZm9jYWwgbGVuZ3RoIG9mIGxlbnMgdXNlZCB0byB0YWtlIHRoZSBpbWFnZSBpbiBtaWxsaW1ldGVycy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRGb2NhbExlbmd0aChmbG9hdCBmb2NhbF9sZW5ndGgpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGZvY2FsIGxlbmd0aCBvZiBsZW5zIGZvciAzNW1tIGZpbG0gdXNlZCB0byB0YWtlIHRoZSBpbWFnZSBpbiBtaWxsaW1ldGVycy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRGb2NhbExlbmd0aEluMzVtbUZpbG0oZmxvYXQgZm9jYWxfbGVuZ3RoLAorICAgICAgICAgICAgZmxvYXQgc2Vuc29yX3NpemVfeCwgZmxvYXQgc2Vuc29yX3NpemVfeSkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgYWx0aXR1ZGUgaW4gbWV0ZXJzLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEdwc0FsdGl0dWRlKGRvdWJsZSBhbHRpdHVkZSkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgbGF0aXR1ZGUgd2l0aCBkZWdyZWVzIG1pbnV0ZXMgc2Vjb25kcyBmb3JtYXQuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0R3BzTGF0aXR1ZGUoZG91YmxlIGxhdGl0dWRlKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBsb25naXR1ZGUgd2l0aCBkZWdyZWVzIG1pbnV0ZXMgc2Vjb25kcyBmb3JtYXQuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0R3BzTG9uZ2l0dWRlKGRvdWJsZSBsb25naXR1ZGUpID0gMDsKKworICAgIC8vIFNldHMgR1BTIHByb2Nlc3NpbmcgbWV0aG9kLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEdwc1Byb2Nlc3NpbmdNZXRob2QoY29uc3Qgc3RkOjpzdHJpbmcmIG1ldGhvZCkgPSAwOworCisgICAgLy8gU2V0cyBHUFMgZGF0ZSBzdGFtcCBhbmQgdGltZSBzdGFtcCAoYXRvbWljIGNsb2NrKS4gSXQgdGFrZXMgVVRDIHRpbWUuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0R3BzVGltZXN0YW1wKGNvbnN0IHN0cnVjdCB0bSYgdCkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgaGVpZ2h0IChudW1iZXIgb2Ygcm93cykgb2YgbWFpbiBpbWFnZS4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRJbWFnZUhlaWdodCh1aW50MzJfdCBsZW5ndGgpID0gMDsKKworICAgIC8vIFNldHMgdGhlIHdpZHRoIChudW1iZXIgb2YgY29sdW1ucykgb2YgbWFpbiBpbWFnZS4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRJbWFnZVdpZHRoKHVpbnQzMl90IHdpZHRoKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBJU08gc3BlZWQuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0SXNvU3BlZWRSYXRpbmcodWludDE2X3QgaXNvX3NwZWVkX3JhdGluZ3MpID0gMDsKKworICAgIC8vIFNldHMgdGhlIHNtYWxsZXN0IEYgbnVtYmVyIG9mIHRoZSBsZW5zLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldE1heEFwZXJ0dXJlKGZsb2F0IGFwZXJ0dXJlKSA9IDA7CisKKyAgICAvLyBTZXRzIGltYWdlIG9yaWVudGF0aW9uLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldE9yaWVudGF0aW9uKHVpbnQxNl90IGRlZ3JlZXMpID0gMDsKKworICAgIC8vIFNldHMgaW1hZ2Ugb3JpZW50YXRpb24uCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0T3JpZW50YXRpb25WYWx1ZShFeGlmT3JpZW50YXRpb24gb3JpZW50YXRpb25WYWx1ZSkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgc2h1dHRlciBzcGVlZC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRTaHV0dGVyU3BlZWQoZmxvYXQgZXhwb3N1cmVfdGltZSkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgZGlzdGFuY2UgdG8gdGhlIHN1YmplY3QsIGdpdmVuIGluIG1ldGVycy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRTdWJqZWN0RGlzdGFuY2UoZmxvYXQgZGlvcHRlcnMpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGZyYWN0aW9ucyBvZiBzZWNvbmRzIGZvciB0aGUgPERhdGVUaW1lPiB0YWcuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0U3Vic2VjVGltZShjb25zdCBzdGQ6OnN0cmluZyYgc3Vic2VjX3RpbWUpID0gMDsKKworICAgIC8vIFNldHMgdGhlIHdoaXRlIGJhbGFuY2UgbW9kZSBzZXQgd2hlbiB0aGUgaW1hZ2Ugd2FzIHNob3QuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0V2hpdGVCYWxhbmNlKHVpbnQ4X3Qgd2hpdGVfYmxhbmFjZSkgPSAwOworCisgICAgLy8gR2VuZXJhdGVzIEFQUDEgc2VnbWVudC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIGdlbmVyYXRpbmcgQVBQMSBzZWdtZW50IGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBnZW5lcmF0ZUFwcDEoKSA9IDA7CisKKyAgICAvLyBHZXRzIGJ1ZmZlciBvZiBBUFAxIHNlZ21lbnQuIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgY2FsbGluZworICAgIC8vIEdlbmVyYXRlQVBQMSgpLgorICAgIHZpcnR1YWwgY29uc3QgdWludDhfdCogZ2V0QXBwMUJ1ZmZlcigpID0gMDsKKworICAgIC8vIEdldHMgbGVuZ3RoIG9mIEFQUDEgc2VnbWVudC4gVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgb25seSBhZnRlciBjYWxsaW5nCisgICAgLy8gR2VuZXJhdGVBUFAxKCkuCisgICAgdmlydHVhbCB1bnNpZ25lZCBpbnQgZ2V0QXBwMUxlbmd0aCgpID0gMDsKK307CisKK30gLy8gbmFtZXNwYWNlIGNhbWVyYTMKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0VYSUZfVVRJTFNfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvTGF0ZW5jeUhpc3RvZ3JhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9MYXRlbmN5SGlzdG9ncmFtLmNwcAppbmRleCA1MzhiYjZlLi5lMmJkYzQzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9MYXRlbmN5SGlzdG9ncmFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9MYXRlbmN5SGlzdG9ncmFtLmNwcApAQCAtNDYsNyArNDYsNyBAQAogfQogCiB2b2lkIENhbWVyYUxhdGVuY3lIaXN0b2dyYW06OnJlc2V0KCkgewotICAgIG1CaW5zLmNsZWFyKCk7CisgICAgbWVtc2V0KG1CaW5zLmRhdGEoKSwgMCwgbUJpbnMuc2l6ZSgpICogc2l6ZW9mKGludDY0X3QpKTsKICAgICBtVG90YWxDb3VudCA9IDA7CiB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1RhZ01vbml0b3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5jcHAKaW5kZXggYzBhMzUzZi4uNDAzN2E2NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5jcHAKQEAgLTQ5LDcgKzQ5LDggQEAKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTW9uaXRvck11dGV4KTsKIAogICAgIC8vIEV4cGFuZCBzaG9ydGhhbmRzCi0gICAgaWYgKHNzaXplX3QgaWR4ID0gdGFnTmFtZXMuZmluZCgiM2EiKSAhPSAtMSkgeworICAgIHNzaXplX3QgaWR4ID0gdGFnTmFtZXMuZmluZCgiM2EiKTsKKyAgICBpZiAoaWR4ICE9IC0xKSB7CiAgICAgICAgIHNzaXplX3QgZW5kID0gdGFnTmFtZXMuZmluZCgiLCIsIGlkeCk7CiAgICAgICAgIGNoYXIqIHN0YXJ0ID0gdGFnTmFtZXMubG9ja0J1ZmZlcih0YWdOYW1lcy5zaXplKCkpOwogICAgICAgICBzdGFydFtpZHhdID0gJ1wwJzsKQEAgLTk5LDEwICsxMDAsMTMgQEAKICAgICBtTW9uaXRvcmluZ0VuYWJsZWQgPSBmYWxzZTsKICAgICBtTGFzdE1vbml0b3JlZFJlcXVlc3RWYWx1ZXMuY2xlYXIoKTsKICAgICBtTGFzdE1vbml0b3JlZFJlc3VsdFZhbHVlcy5jbGVhcigpOworICAgIG1MYXN0TW9uaXRvcmVkUGh5c2ljYWxSZXF1ZXN0S2V5cy5jbGVhcigpOworICAgIG1MYXN0TW9uaXRvcmVkUGh5c2ljYWxSZXN1bHRLZXlzLmNsZWFyKCk7CiB9CiAKIHZvaWQgVGFnTW9uaXRvcjo6bW9uaXRvck1ldGFkYXRhKGV2ZW50U291cmNlIHNvdXJjZSwgaW50NjRfdCBmcmFtZU51bWJlciwgbnNlY3NfdCB0aW1lc3RhbXAsCi0gICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSkgeworICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgQ2FtZXJhTWV0YWRhdGE+JiBwaHlzaWNhbE1ldGFkYXRhKSB7CiAgICAgaWYgKCFtTW9uaXRvcmluZ0VuYWJsZWQpIHJldHVybjsKIAogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Nb25pdG9yTXV0ZXgpOwpAQCAtMTExLDYyICsxMTUsNzcgQEAKICAgICAgICAgdGltZXN0YW1wID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9CT09UVElNRSk7CiAgICAgfQogCisgICAgc3RkOjpzdHJpbmcgZW1wdHlJZDsKICAgICBmb3IgKGF1dG8gdGFnIDogbU1vbml0b3JlZFRhZ0xpc3QpIHsKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGVudHJ5ID0gbWV0YWRhdGEuZmluZCh0YWcpOwotICAgICAgICBDYW1lcmFNZXRhZGF0YSAmbGFzdFZhbHVlcyA9IChzb3VyY2UgPT0gUkVRVUVTVCkgPwotICAgICAgICAgICAgICAgIG1MYXN0TW9uaXRvcmVkUmVxdWVzdFZhbHVlcyA6IG1MYXN0TW9uaXRvcmVkUmVzdWx0VmFsdWVzOwotICAgICAgICBpZiAobGFzdFZhbHVlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIGxhc3RWYWx1ZXMgPSBDYW1lcmFNZXRhZGF0YShtTW9uaXRvcmVkVGFnTGlzdC5zaXplKCkpOwotICAgICAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKm1ldGFCdWZmZXIgPQotICAgICAgICAgICAgICAgICAgICBsYXN0VmFsdWVzLmdldEFuZExvY2soKTsKLSAgICAgICAgICAgIHNldF9jYW1lcmFfbWV0YWRhdGFfdmVuZG9yX2lkKAotICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90ICo+IChtZXRhQnVmZmVyKSwgbVZlbmRvclRhZ0lkKTsKLSAgICAgICAgICAgIGxhc3RWYWx1ZXMudW5sb2NrKG1ldGFCdWZmZXIpOworICAgICAgICBtb25pdG9yU2luZ2xlTWV0YWRhdGEoc291cmNlLCBmcmFtZU51bWJlciwgdGltZXN0YW1wLCBlbXB0eUlkLCB0YWcsIG1ldGFkYXRhKTsKKworICAgICAgICBmb3IgKGF1dG8mIG0gOiBwaHlzaWNhbE1ldGFkYXRhKSB7CisgICAgICAgICAgICBtb25pdG9yU2luZ2xlTWV0YWRhdGEoc291cmNlLCBmcmFtZU51bWJlciwgdGltZXN0YW1wLCBtLmZpcnN0LCB0YWcsIG0uc2Vjb25kKTsKICAgICAgICAgfQorICAgIH0KK30KIAotICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgbGFzdEVudHJ5ID0gbGFzdFZhbHVlcy5maW5kKHRhZyk7Cit2b2lkIFRhZ01vbml0b3I6Om1vbml0b3JTaW5nbGVNZXRhZGF0YShldmVudFNvdXJjZSBzb3VyY2UsIGludDY0X3QgZnJhbWVOdW1iZXIsIG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhSWQsIHVpbnQzMl90IHRhZywgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhKSB7CiAKLSAgICAgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgewotICAgICAgICAgICAgYm9vbCBpc0RpZmZlcmVudCA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKGxhc3RFbnRyeS5jb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAvLyBIYXZlIGEgbGFzdCB2YWx1ZSwgY29tcGFyZSB0byBzZWUgaWYgY2hhbmdlZAotICAgICAgICAgICAgICAgIGlmIChsYXN0RW50cnkudHlwZSA9PSBlbnRyeS50eXBlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0RW50cnkuY291bnQgPT0gZW50cnkuY291bnQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gU2FtZSB0eXBlIGFuZCBjb3VudCwgY29tcGFyZSB2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ5dGVzUGVyVmFsdWUgPSBjYW1lcmFfbWV0YWRhdGFfdHlwZV9zaXplW2xhc3RFbnRyeS50eXBlXTsKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGVudHJ5Qnl0ZXMgPSBieXRlc1BlclZhbHVlICogbGFzdEVudHJ5LmNvdW50OwotICAgICAgICAgICAgICAgICAgICBpbnQgY21wID0gbWVtY21wKGVudHJ5LmRhdGEudTgsIGxhc3RFbnRyeS5kYXRhLnU4LCBlbnRyeUJ5dGVzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNtcCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpc0RpZmZlcmVudCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBDb3VudCBvciB0eXBlIGhhcyBjaGFuZ2VkCisgICAgQ2FtZXJhTWV0YWRhdGEgJmxhc3RWYWx1ZXMgPSAoc291cmNlID09IFJFUVVFU1QpID8KKyAgICAgICAgICAgIChjYW1lcmFJZC5lbXB0eSgpID8gbUxhc3RNb25pdG9yZWRSZXF1ZXN0VmFsdWVzIDoKKyAgICAgICAgICAgICAgICAgICAgbUxhc3RNb25pdG9yZWRQaHlzaWNhbFJlcXVlc3RLZXlzW2NhbWVyYUlkXSkgOgorICAgICAgICAgICAgKGNhbWVyYUlkLmVtcHR5KCkgPyBtTGFzdE1vbml0b3JlZFJlc3VsdFZhbHVlcyA6CisgICAgICAgICAgICAgICAgICAgIG1MYXN0TW9uaXRvcmVkUGh5c2ljYWxSZXN1bHRLZXlzW2NhbWVyYUlkXSk7CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgZW50cnkgPSBtZXRhZGF0YS5maW5kKHRhZyk7CisgICAgaWYgKGxhc3RWYWx1ZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIGxhc3RWYWx1ZXMgPSBDYW1lcmFNZXRhZGF0YShtTW9uaXRvcmVkVGFnTGlzdC5zaXplKCkpOworICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqbWV0YUJ1ZmZlciA9CisgICAgICAgICAgICAgICAgbGFzdFZhbHVlcy5nZXRBbmRMb2NrKCk7CisgICAgICAgIHNldF9jYW1lcmFfbWV0YWRhdGFfdmVuZG9yX2lkKAorICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QgKj4gKG1ldGFCdWZmZXIpLCBtVmVuZG9yVGFnSWQpOworICAgICAgICBsYXN0VmFsdWVzLnVubG9jayhtZXRhQnVmZmVyKTsKKyAgICB9CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgbGFzdEVudHJ5ID0gbGFzdFZhbHVlcy5maW5kKHRhZyk7CisKKyAgICBpZiAoZW50cnkuY291bnQgPiAwKSB7CisgICAgICAgIGJvb2wgaXNEaWZmZXJlbnQgPSBmYWxzZTsKKyAgICAgICAgaWYgKGxhc3RFbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgICAgIC8vIEhhdmUgYSBsYXN0IHZhbHVlLCBjb21wYXJlIHRvIHNlZSBpZiBjaGFuZ2VkCisgICAgICAgICAgICBpZiAobGFzdEVudHJ5LnR5cGUgPT0gZW50cnkudHlwZSAmJgorICAgICAgICAgICAgICAgICAgICBsYXN0RW50cnkuY291bnQgPT0gZW50cnkuY291bnQpIHsKKyAgICAgICAgICAgICAgICAvLyBTYW1lIHR5cGUgYW5kIGNvdW50LCBjb21wYXJlIHZhbHVlcworICAgICAgICAgICAgICAgIHNpemVfdCBieXRlc1BlclZhbHVlID0gY2FtZXJhX21ldGFkYXRhX3R5cGVfc2l6ZVtsYXN0RW50cnkudHlwZV07CisgICAgICAgICAgICAgICAgc2l6ZV90IGVudHJ5Qnl0ZXMgPSBieXRlc1BlclZhbHVlICogbGFzdEVudHJ5LmNvdW50OworICAgICAgICAgICAgICAgIGludCBjbXAgPSBtZW1jbXAoZW50cnkuZGF0YS51OCwgbGFzdEVudHJ5LmRhdGEudTgsIGVudHJ5Qnl0ZXMpOworICAgICAgICAgICAgICAgIGlmIChjbXAgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICBpc0RpZmZlcmVudCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBObyBsYXN0IGVudHJ5LCBzbyBhbHdheXMgY29uc2lkZXIgdG8gYmUgZGlmZmVyZW50CisgICAgICAgICAgICAgICAgLy8gQ291bnQgb3IgdHlwZSBoYXMgY2hhbmdlZAogICAgICAgICAgICAgICAgIGlzRGlmZmVyZW50ID0gdHJ1ZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIE5vIGxhc3QgZW50cnksIHNvIGFsd2F5cyBjb25zaWRlciB0byBiZSBkaWZmZXJlbnQKKyAgICAgICAgICAgIGlzRGlmZmVyZW50ID0gdHJ1ZTsKKyAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAoaXNEaWZmZXJlbnQpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiJXM6IFRhZyAlcyBjaGFuZ2VkIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICAgIGdldF9sb2NhbF9jYW1lcmFfbWV0YWRhdGFfdGFnX25hbWVfdmVuZG9yX2lkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLCBtVmVuZG9yVGFnSWQpKTsKLSAgICAgICAgICAgICAgICBsYXN0VmFsdWVzLnVwZGF0ZShlbnRyeSk7Ci0gICAgICAgICAgICAgICAgbU1vbml0b3JpbmdFdmVudHMuZW1wbGFjZShzb3VyY2UsIGZyYW1lTnVtYmVyLCB0aW1lc3RhbXAsIGVudHJ5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChsYXN0RW50cnkuY291bnQgPiAwKSB7Ci0gICAgICAgICAgICAvLyBWYWx1ZSBoYXMgYmVlbiByZW1vdmVkCi0gICAgICAgICAgICBBTE9HVigiJXM6IFRhZyAlcyByZW1vdmVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICBpZiAoaXNEaWZmZXJlbnQpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogVGFnICVzIGNoYW5nZWQiLCBfX0ZVTkNUSU9OX18sCiAgICAgICAgICAgICAgICAgICBnZXRfbG9jYWxfY2FtZXJhX21ldGFkYXRhX3RhZ19uYW1lX3ZlbmRvcl9pZCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnLCBtVmVuZG9yVGFnSWQpKTsKLSAgICAgICAgICAgIGxhc3RWYWx1ZXMuZXJhc2UodGFnKTsKLSAgICAgICAgICAgIGVudHJ5LnRhZyA9IHRhZzsKLSAgICAgICAgICAgIGVudHJ5LnR5cGUgPSBnZXRfbG9jYWxfY2FtZXJhX21ldGFkYXRhX3RhZ190eXBlX3ZlbmRvcl9pZCh0YWcsCi0gICAgICAgICAgICAgICAgICAgIG1WZW5kb3JUYWdJZCk7Ci0gICAgICAgICAgICBlbnRyeS5jb3VudCA9IDA7Ci0gICAgICAgICAgICBtTW9uaXRvcmluZ0V2ZW50cy5lbXBsYWNlKHNvdXJjZSwgZnJhbWVOdW1iZXIsIHRpbWVzdGFtcCwgZW50cnkpOworICAgICAgICAgICAgbGFzdFZhbHVlcy51cGRhdGUoZW50cnkpOworICAgICAgICAgICAgbU1vbml0b3JpbmdFdmVudHMuZW1wbGFjZShzb3VyY2UsIGZyYW1lTnVtYmVyLCB0aW1lc3RhbXAsIGVudHJ5LCBjYW1lcmFJZCk7CiAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGxhc3RFbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgLy8gVmFsdWUgaGFzIGJlZW4gcmVtb3ZlZAorICAgICAgICBBTE9HVigiJXM6IFRhZyAlcyByZW1vdmVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICBnZXRfbG9jYWxfY2FtZXJhX21ldGFkYXRhX3RhZ19uYW1lX3ZlbmRvcl9pZCgKKyAgICAgICAgICAgICAgICAgICAgICB0YWcsIG1WZW5kb3JUYWdJZCkpOworICAgICAgICBsYXN0VmFsdWVzLmVyYXNlKHRhZyk7CisgICAgICAgIGVudHJ5LnRhZyA9IHRhZzsKKyAgICAgICAgZW50cnkudHlwZSA9IGdldF9sb2NhbF9jYW1lcmFfbWV0YWRhdGFfdGFnX3R5cGVfdmVuZG9yX2lkKHRhZywKKyAgICAgICAgICAgICAgICBtVmVuZG9yVGFnSWQpOworICAgICAgICBlbnRyeS5jb3VudCA9IDA7CisgICAgICAgIG1Nb25pdG9yaW5nRXZlbnRzLmVtcGxhY2Uoc291cmNlLCBmcmFtZU51bWJlciwgdGltZXN0YW1wLCBlbnRyeSwgY2FtZXJhSWQpOwogICAgIH0KIH0KIApAQCAtMTg5LDggKzIwOCw5IEBACiAgICAgICAgIGRwcmludGYoZmQsICIgICAgIE1vbml0b3JlZCB0YWcgZXZlbnQgbG9nOlxuIik7CiAgICAgICAgIGZvciAoY29uc3QgYXV0byYgZXZlbnQgOiBtTW9uaXRvcmluZ0V2ZW50cykgewogICAgICAgICAgICAgaW50IGluZGVudGF0aW9uID0gKGV2ZW50LnNvdXJjZSA9PSBSRVFVRVNUKSA/IDE1IDogMzA7Ci0gICAgICAgICAgICBkcHJpbnRmKGZkLCAiICAgICAgICBmJWQ6JSIgUFJJZDY0ICJuczogJSpzJXMuJXM6ICIsCisgICAgICAgICAgICBkcHJpbnRmKGZkLCAiICAgICAgICBmJWQ6JSIgUFJJZDY0ICJuczolKnMlKnMlcy4lczogIiwKICAgICAgICAgICAgICAgICAgICAgZXZlbnQuZnJhbWVOdW1iZXIsIGV2ZW50LnRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgMiwgZXZlbnQuY2FtZXJhSWQuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgaW5kZW50YXRpb24sCiAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnNvdXJjZSA9PSBSRVFVRVNUID8gIlJFUToiIDogIlJFUzoiLAogICAgICAgICAgICAgICAgICAgICBnZXRfbG9jYWxfY2FtZXJhX21ldGFkYXRhX3NlY3Rpb25fbmFtZV92ZW5kb3JfaWQoZXZlbnQudGFnLApAQCAtMjk1LDEzICszMTUsMTQgQEAKIAogdGVtcGxhdGU8dHlwZW5hbWUgVD4KIFRhZ01vbml0b3I6Ok1vbml0b3JFdmVudDo6TW9uaXRvckV2ZW50KGV2ZW50U291cmNlIHNyYywgdWludDMyX3QgZnJhbWVOdW1iZXIsIG5zZWNzX3QgdGltZXN0YW1wLAotICAgICAgICBjb25zdCBUICZ2YWx1ZSkgOgorICAgICAgICBjb25zdCBUICZ2YWx1ZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkKSA6CiAgICAgICAgIHNvdXJjZShzcmMpLAogICAgICAgICBmcmFtZU51bWJlcihmcmFtZU51bWJlciksCiAgICAgICAgIHRpbWVzdGFtcCh0aW1lc3RhbXApLAogICAgICAgICB0YWcodmFsdWUudGFnKSwKICAgICAgICAgdHlwZSh2YWx1ZS50eXBlKSwKLSAgICAgICAgbmV3RGF0YSh2YWx1ZS5kYXRhLnU4LCB2YWx1ZS5kYXRhLnU4ICsgY2FtZXJhX21ldGFkYXRhX3R5cGVfc2l6ZVt2YWx1ZS50eXBlXSAqIHZhbHVlLmNvdW50KSB7CisgICAgICAgIG5ld0RhdGEodmFsdWUuZGF0YS51OCwgdmFsdWUuZGF0YS51OCArIGNhbWVyYV9tZXRhZGF0YV90eXBlX3NpemVbdmFsdWUudHlwZV0gKiB2YWx1ZS5jb3VudCksCisgICAgICAgIGNhbWVyYUlkKGNhbWVyYUlkKSB7CiB9CiAKIFRhZ01vbml0b3I6Ok1vbml0b3JFdmVudDo6fk1vbml0b3JFdmVudCgpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1RhZ01vbml0b3IuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1RhZ01vbml0b3IuaAppbmRleCAyZGVjZTYyLi4xYjdiMDMzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5oCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPGF0b21pYz4KICNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgogCiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KQEAgLTYyLDcgKzYzLDggQEAKIAogICAgIC8vIFNjYW4gdGhyb3VnaCB0aGUgbWV0YWRhdGEgYW5kIHVwZGF0ZSB0aGUgbW9uaXRvcmluZyBpbmZvcm1hdGlvbgogICAgIHZvaWQgbW9uaXRvck1ldGFkYXRhKGV2ZW50U291cmNlIHNvdXJjZSwgaW50NjRfdCBmcmFtZU51bWJlciwKLSAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEpOworICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgQ2FtZXJhTWV0YWRhdGE+JiBwaHlzaWNhbE1ldGFkYXRhKTsKIAogICAgIC8vIER1bXAgY3VycmVudCBldmVudCBsb2cgdG8gdGhlIHByb3ZpZGVkIGZkCiAgICAgdm9pZCBkdW1wTW9uaXRvcmVkTWV0YWRhdGEoaW50IGZkKTsKQEAgLTcyLDYgKzc0LDEwIEBACiAgICAgc3RhdGljIHZvaWQgcHJpbnREYXRhKGludCBmZCwgY29uc3QgdWludDhfdCAqZGF0YV9wdHIsIHVpbnQzMl90IHRhZywKICAgICAgICAgICAgIGludCB0eXBlLCBpbnQgY291bnQsIGludCBpbmRlbnRhdGlvbik7CiAKKyAgICB2b2lkIG1vbml0b3JTaW5nbGVNZXRhZGF0YShUYWdNb25pdG9yOjpldmVudFNvdXJjZSBzb3VyY2UsIGludDY0X3QgZnJhbWVOdW1iZXIsCisgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkLCB1aW50MzJfdCB0YWcsCisgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEpOworCiAgICAgc3RkOjphdG9taWM8Ym9vbD4gbU1vbml0b3JpbmdFbmFibGVkOwogICAgIHN0ZDo6bXV0ZXggbU1vbml0b3JNdXRleDsKIApAQCAtODIsNiArODgsOSBAQAogICAgIENhbWVyYU1ldGFkYXRhIG1MYXN0TW9uaXRvcmVkUmVxdWVzdFZhbHVlczsKICAgICBDYW1lcmFNZXRhZGF0YSBtTGFzdE1vbml0b3JlZFJlc3VsdFZhbHVlczsKIAorICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgQ2FtZXJhTWV0YWRhdGE+IG1MYXN0TW9uaXRvcmVkUGh5c2ljYWxSZXF1ZXN0S2V5czsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIENhbWVyYU1ldGFkYXRhPiBtTGFzdE1vbml0b3JlZFBoeXNpY2FsUmVzdWx0S2V5czsKKwogICAgIC8qKgogICAgICAqIEEgbW9uaXRvcmluZyBldmVudAogICAgICAqIFN0b3JlcyBhIG5ldyBtZXRhZGF0YSBmaWVsZCB2YWx1ZSBhbmQgdGhlIHRpbWVzdGFtcCBhdCB3aGljaCBpdCBjaGFuZ2VkLgpAQCAtOTAsNyArOTksNyBAQAogICAgIHN0cnVjdCBNb25pdG9yRXZlbnQgewogICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgogICAgICAgICBNb25pdG9yRXZlbnQoZXZlbnRTb3VyY2Ugc3JjLCB1aW50MzJfdCBmcmFtZU51bWJlciwgbnNlY3NfdCB0aW1lc3RhbXAsCi0gICAgICAgICAgICAgICAgY29uc3QgVCAmbmV3VmFsdWUpOworICAgICAgICAgICAgICAgIGNvbnN0IFQgJm5ld1ZhbHVlLCBjb25zdCBzdGQ6OnN0cmluZyYgY2FtZXJhSWQpOwogICAgICAgICB+TW9uaXRvckV2ZW50KCk7CiAKICAgICAgICAgZXZlbnRTb3VyY2Ugc291cmNlOwpAQCAtOTksNiArMTA4LDcgQEAKICAgICAgICAgdWludDMyX3QgdGFnOwogICAgICAgICB1aW50OF90IHR5cGU7CiAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG5ld0RhdGE7CisgICAgICAgIHN0ZDo6c3RyaW5nIGNhbWVyYUlkOwogICAgIH07CiAKICAgICAvLyBBIHJpbmcgYnVmZmVyIGZvciB0cmFja2luZyB0aGUgbGFzdCBrTWF4TW9uaXRvckV2ZW50cyBtZXRhZGF0YSBjaGFuZ2VzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmY0YjUyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvQW5kcm9pZC5icApAQCAtMCwwICsxLDY4IEBACisvLyBNZWRpYSBTdGF0aXN0aWNzIHNlcnZpY2UKKy8vCisKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogIm1lZGlhbWV0cmljcyIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJtYWluX21lZGlhbWV0cmljcy5jcHAiLAorICAgICAgICAiTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcCIsCisgICAgICAgICJpZmFjZV9zdGF0c2QuY3BwIiwKKyAgICAgICAgInN0YXRzZF9hdWRpb3BvbGljeS5jcHAiLAorICAgICAgICAic3RhdHNkX2F1ZGlvcmVjb3JkLmNwcCIsCisgICAgICAgICJzdGF0c2RfYXVkaW90aHJlYWQuY3BwIiwKKyAgICAgICAgInN0YXRzZF9hdWRpb3RyYWNrLmNwcCIsCisgICAgICAgICJzdGF0c2RfY29kZWMuY3BwIiwKKyAgICAgICAgInN0YXRzZF9kcm0uY3BwIiwKKyAgICAgICAgInN0YXRzZF9leHRyYWN0b3IuY3BwIiwKKyAgICAgICAgInN0YXRzZF9udXBsYXllci5jcHAiLAorICAgICAgICAic3RhdHNkX3JlY29yZGVyLmNwcCIsCisgICAgXSwKKworICAgIHByb3RvOiB7CisgICAgICAgIHR5cGU6ICJsaXRlIiwKKyAgICB9LAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmRsIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnN0YXRzbG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnBsYXRmb3JtcHJvdG9zIiwKKyAgICAgICAgImxpYnJlZ2lzdGVybXNleHQiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvaW5jbHVkZS9tZWRpYSIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUvY2FtZXJhIiwKKyAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCisgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL2hhcmR3YXJlIiwKKyAgICAgICAgImV4dGVybmFsL3RyZW1vbG8vVHJlbW9sbyIsCisgICAgXSwKKworICAgIGluaXRfcmM6IFsibWVkaWFtZXRyaWNzLnJjIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCisgICAgXSwKKyAgICBjbGFuZzogdHJ1ZSwKKworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvQW5kcm9pZC5tayBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlZWI3ZmEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLSMgTWVkaWEgU3RhdGlzdGljcyBzZXJ2aWNlCi0jCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFwKLSAgICBtYWluX21lZGlhbWV0cmljcy5jcHAgICAgICAgICAgICAgIFwKLSAgICBNZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmN1dGlscyAgICAgICAgICAgICAgICAgICBcCi0gICAgbGlibG9nICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJtZWRpYSAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYnV0aWxzICAgICAgICAgICAgICAgICAgICBcCi0gICAgbGliYmluZGVyICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJkbCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGxpYmd1aSAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbGlibWVkaWEgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJtZWRpYXV0aWxzICAgICAgICAgICAgICAgXAotICAgIGxpYm1lZGlhbWV0cmljcyAgICAgICAgICAgICBcCi0gICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiAgIFwKLSAgICBsaWJ1dGlscwotCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLSAgICAgICAgbGlicmVnaXN0ZXJtc2V4dAotCi1MT0NBTF9DX0lOQ0xVREVTIDo9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlICAgICAgICAgICAgICAgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AgICAgICAgICAgICAgICAgICBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2lmaS1kaXNwbGF5ICAgICAgICAgIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtICAgICAgICAgICAgICAgICAgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2luY2x1ZGUvbWVkaWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvaW5jbHVkZS9jYW1lcmEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4ICAgICAgICAgICAgICAgICAgXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL2hhcmR3YXJlICAgICAgICAgICAgICAgICBcCi0gICAgJChUT1ApL2V4dGVybmFsL3RyZW1vbG8vVHJlbW9sbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBsaWJjb3JlL2luY2x1ZGUKLQotCi1MT0NBTF9NT0RVTEU6PSBtZWRpYW1ldHJpY3MKLQotTE9DQUxfSU5JVF9SQyA6PSBtZWRpYW1ldHJpY3MucmMKLQotTE9DQUxfQ0ZMQUdTIDo9IC1XZXJyb3IgLVdhbGwgLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucwotTE9DQUxfQ0xBTkcgOj0gdHJ1ZQotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwCmluZGV4IDRiMDUzOTUuLjM2MjZhZDEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcApAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDxzdHJpbmcuaD4KQEAgLTUwLDcgKzUxLDYgQEAKICNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JUmVtb3RlRGlzcGxheS5oPgogI2luY2x1ZGUgPG1lZGlhL0lSZW1vdGVEaXNwbGF5Q2xpZW50Lmg+CkBAIC03NiwxNSArNzYsMTkgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi0gICAgdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmJhc2U7Ci0gICAgdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmNvbnRlbnQ6OnBtOwotCiAvLyBpbmRpdmlkdWFsIHJlY29yZHMga2VwdCBpbiBtZW1vcnk6IGFnZSBvciBjb3VudAotLy8gYWdlOiA8PSAzNiBob3VycyAoMS41IGRheXMpCisvLyBhZ2U6IDw9IDI4IGhvdXJzICgxIDEvNiBkYXlzKQogLy8gY291bnQ6IGhhcmQgbGltaXQgb2YgIyByZWNvcmRzCiAvLyAoMCBmb3IgZWl0aGVyIG9mIHRoZXNlIGRpc2FibGVzIHRoYXQgdGhyZXNob2xkKQotc3RhdGljIGNvbnN0IG5zZWNzX3Qga01heFJlY29yZEFnZU5zID0gIDM2ICogMzYwMCAqICgxMDAwKjEwMDAqMTAwMGxsKTsKLXN0YXRpYyBjb25zdCBpbnQga01heFJlY29yZHMgICAgPSAwOworLy8KK3N0YXRpYyBjb25zdGV4cHIgbnNlY3NfdCBrTWF4UmVjb3JkQWdlTnMgPSAgMjggKiAzNjAwICogKDEwMDAqMTAwMCoxMDAwbGwpOworc3RhdGljIGNvbnN0ZXhwciBpbnQga01heFJlY29yZHMgICAgPSAwOworCisvLyBtYXggd2UgZXhwaXJlIGluIGEgc2luZ2xlIGNhbGwsIHRvIGNvbnN0cmFpbiBob3cgbG9uZyB3ZSBob2xkIHRoZQorLy8gbXV0ZXgsIHdoaWNoIGFsc28gY29uc3RyYWlucyBob3cgbG9uZyBhIGNsaWVudCBtaWdodCB3YWl0Lgorc3RhdGljIGNvbnN0ZXhwciBpbnQga01heEV4cGlyZWRBdE9uY2UgPSA1MDsKKworLy8gVE9ETzogbmVlZCB0byBsb29rIGF0IHR1bmluZyBrTWF4UmVjb3JkcyBhbmQgZnJpZW5kcyBmb3IgbG93LW1lbW9yeSBkZXZpY2VzCiAKIHN0YXRpYyBjb25zdCBjaGFyICprU2VydmljZU5hbWUgPSAibWVkaWEubWV0cmljcyI7CiAKQEAgLTk2LDYgKzEwMCw3IEBACiBNZWRpYUFuYWx5dGljc1NlcnZpY2U6Ok1lZGlhQW5hbHl0aWNzU2VydmljZSgpCiAgICAgICAgIDogbU1heFJlY29yZHMoa01heFJlY29yZHMpLAogICAgICAgICAgIG1NYXhSZWNvcmRBZ2VOcyhrTWF4UmVjb3JkQWdlTnMpLAorICAgICAgICAgIG1NYXhSZWNvcmRzRXhwaXJlZEF0T25jZShrTWF4RXhwaXJlZEF0T25jZSksCiAgICAgICAgICAgbUR1bXBQcm90byhNZWRpYUFuYWx5dGljc0l0ZW06OlBST1RPX1YxKSwKICAgICAgICAgICBtRHVtcFByb3RvRGVmYXVsdChNZWRpYUFuYWx5dGljc0l0ZW06OlBST1RPX1YxKSB7CiAKQEAgLTIwNSwyMSArMjEwLDI0IEBACiAKICAgICAvLyBYWFg6IGlmIHdlIGhhdmUgYSBzZXNzaW9uaWQgaW4gdGhlIG5ldyByZWNvcmQsIGxvb2sgdG8gbWFrZQogICAgIC8vIHN1cmUgaXQgZG9lc24ndCBhcHBlYXIgaW4gdGhlIGZpbmFsaXplZCBsaXN0LgotICAgIC8vIFhYWDogdGhpcyBpcyBmb3Igc2VjdXJpdHkgLyBET1MgcHJldmVudGlvbi4KLSAgICAvLyBtYXkgYWxzbyByZXF1aXJlIHRoYXQgd2UgcGVyc2lzdCB0aGUgdW5pcXVlIHNlc3Npb25JRHMKLSAgICAvLyBhY3Jvc3MgYm9vdHMgW2luc3RlYWQgb2Ygd2l0aGluIGEgc2luZ2xlIGJvb3RdCiAKICAgICBpZiAoaXRlbS0+Y291bnQoKSA9PSAwKSB7Ci0gICAgICAgIC8vIGRyb3AgZW1wdHkgcmVjb3JkcworICAgICAgICBBTE9HVigiZHJvcHBpbmcgZW1wdHkgcmVjb3JkLi4uIik7CiAgICAgICAgIGRlbGV0ZSBpdGVtOwogICAgICAgICBpdGVtID0gTlVMTDsKICAgICAgICAgcmV0dXJuIE1lZGlhQW5hbHl0aWNzSXRlbTo6U2Vzc2lvbklESW52YWxpZDsKICAgICB9CiAKICAgICAvLyBzYXZlIHRoZSBuZXcgcmVjb3JkCisgICAgLy8KKyAgICAvLyBzZW5kIGEgY29weSB0byBzdGF0c2QKKyAgICBkdW1wMlN0YXRzZChpdGVtKTsKKworICAgIC8vIGFuZCBrZWVwIG91ciBjb3B5IGZvciBkdW1wc3lzCiAgICAgTWVkaWFBbmFseXRpY3NJdGVtOjpTZXNzaW9uSURfdCBpZCA9IGl0ZW0tPmdldFNlc3Npb25JRCgpOwogICAgIHNhdmVJdGVtKGl0ZW0pOwogICAgIG1JdGVtc0ZpbmFsaXplZCsrOworCiAgICAgcmV0dXJuIGlkOwogfQogCkBAIC00MzIsMjMgKzQ0MCwyOSBAQAogLy8KIC8vIE91ciBDaGVhcCBpbi1jb3JlLCBub24tcGVyc2lzdGVudCByZWNvcmRzIG1hbmFnZW1lbnQuCiAKLS8vIGluc2VydCBhcHByb3ByaWF0ZWx5IGludG8gcXVldWUKLXZvaWQgTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpzYXZlSXRlbShNZWRpYUFuYWx5dGljc0l0ZW0gKiBpdGVtKQorCisvLyB3ZSBob2xkIG1Mb2NrIHdoZW4gd2UgZ2V0IGhlcmUKKy8vIGlmIGl0ZW0gIT0gTlVMTCwgaXQncyB0aGUgaXRlbSB3ZSBqdXN0IGluc2VydGVkCisvLyB0cnVlID09IG1vcmUgaXRlbXMgZWxpZ2libGUgdG8gYmUgcmVjb3ZlcmVkCitib29sIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6ZXhwaXJhdGlvbnNfbChNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0pCiB7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIC8vIG11dGV4IGJldHdlZW4gaW5zZXJ0aW9uIGFuZCBkdW1waW5nIHRoZSBjb250ZW50cwotCi0gICAgLy8gd2Ugd2FudCB0byBkdW1wICdpbiBGSUZPIG9yZGVyJywgc28gaW5zZXJ0IGF0IHRoZSBlbmQKLSAgICBtSXRlbXMucHVzaF9iYWNrKGl0ZW0pOworICAgIGJvb2wgbW9yZSA9IGZhbHNlOworICAgIGludCBoYW5kbGVkID0gMDsKIAogICAgIC8vIGtlZXAgcmVtb3Zpbmcgb2xkIHJlY29yZHMgdGhlIGZyb250IHVudGlsIHdlJ3JlIGluLWJvdW5kcyAoY291bnQpCisgICAgLy8gc2luY2Ugd2UgaW52b2tlIHRoaXMgd2l0aCBlYWNoIGluc2VydGlvbiwgaXQgc2hvdWxkIGJlIDAvMSBpdGVyYXRpb25zLgogICAgIGlmIChtTWF4UmVjb3JkcyA+IDApIHsKICAgICAgICAgd2hpbGUgKG1JdGVtcy5zaXplKCkgPiAoc2l6ZV90KSBtTWF4UmVjb3JkcykgewogICAgICAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICogb2l0ZW0gPSAqKG1JdGVtcy5iZWdpbigpKTsKICAgICAgICAgICAgIGlmIChvaXRlbSA9PSBpdGVtKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGFuZGxlZCA+PSBtTWF4UmVjb3Jkc0V4cGlyZWRBdE9uY2UpIHsKKyAgICAgICAgICAgICAgICAvLyB1bmxpa2VseSBpbiB0aGlzIGxvb3AKKyAgICAgICAgICAgICAgICBtb3JlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhhbmRsZWQrKzsKICAgICAgICAgICAgIG1JdGVtcy5lcmFzZShtSXRlbXMuYmVnaW4oKSk7CiAgICAgICAgICAgICBkZWxldGUgb2l0ZW07CiAgICAgICAgICAgICBtSXRlbXNEaXNjYXJkZWQrKzsKQEAgLTQ1Niw4ICs0NzAsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8ga2VlcCByZW1vdmluZyBvbGQgcmVjb3JkcyB0aGUgZnJvbnQgdW50aWwgd2UncmUgaW4tYm91bmRzIChjb3VudCkKLSAgICAvLyBOQjogZXhwaXJlZCBlbnRyaWVzIGFyZW4ndCByZW1vdmVkIHVudGlsIHRoZSBuZXh0IGluc2VydGlvbiwgd2hpY2ggY291bGQgYmUgYSB3aGlsZQorICAgIC8vIGtlZXAgcmVtb3Zpbmcgb2xkIHJlY29yZHMgdGhlIGZyb250IHVudGlsIHdlJ3JlIGluLWJvdW5kcyAoYWdlKQorICAgIC8vIGxpbWl0ZWQgdG8gbU1heFJlY29yZHNFeHBpcmVkQXRPbmNlIGl0ZW1zIHBlciBpbnZvY2F0aW9uLgogICAgIGlmIChtTWF4UmVjb3JkQWdlTnMgPiAwKSB7CiAgICAgICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9SRUFMVElNRSk7CiAgICAgICAgIHdoaWxlIChtSXRlbXMuc2l6ZSgpID4gMCkgewpAQCAtNDcxLDE4ICs0ODUsNzIgQEAKICAgICAgICAgICAgICAgICAvLyB0aGlzIChhbmQgdGhlIHJlc3QpIGFyZSByZWNlbnQgZW5vdWdoIHRvIGtlZXAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoYW5kbGVkID49IG1NYXhSZWNvcmRzRXhwaXJlZEF0T25jZSkgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgcmVwcmVzZW50cyAib25lIHRvbyBtYW55IjsgdGVsbCBjYWxsZXIgdGhlcmUgYXJlCisgICAgICAgICAgICAgICAgLy8gbW9yZSB0byBiZSByZWNsYWltZWQuCisgICAgICAgICAgICAgICAgbW9yZSA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoYW5kbGVkKys7CiAgICAgICAgICAgICBtSXRlbXMuZXJhc2UobUl0ZW1zLmJlZ2luKCkpOwogICAgICAgICAgICAgZGVsZXRlIG9pdGVtOwogICAgICAgICAgICAgbUl0ZW1zRGlzY2FyZGVkKys7CiAgICAgICAgICAgICBtSXRlbXNEaXNjYXJkZWRFeHBpcmUrKzsKICAgICAgICAgfQogICAgIH0KKworICAgIC8vIHdlIG9ubHkgaW5kaWNhdGUgd2hldGhlciB0aGVyZSdzIG1vcmUgdG8gY2xlYW47CisgICAgLy8gY2FsbGVyIGNob29zZXMgd2hldGhlciB0byBzY2hlZHVsZSBmdXJ0aGVyIGNsZWFudXAuCisgICAgcmV0dXJuIG1vcmU7Cit9CisKKy8vIHByb2Nlc3MgZXhwaXJhdGlvbnMgaW4gYml0ZSBzaXplZCBjaHVua3MsIGFsbG93aW5nIG5ldyBpbnNlcnRpb25zIHRocm91Z2gKKy8vIHJ1bnMgaW4gYSBwdGhyZWFkIHNwZWNpZmljYWxseSBzdGFydGVkIGZvciB0aGlzICh3aGljaCB0aGVuIGV4aXRzKQorYm9vbCBNZWRpYUFuYWx5dGljc1NlcnZpY2U6OnByb2Nlc3NFeHBpcmF0aW9ucygpCit7CisgICAgYm9vbCBtb3JlOworICAgIGRvIHsKKyAgICAgICAgc2xlZXAoMSk7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgICAgICBtb3JlID0gZXhwaXJhdGlvbnNfbChOVUxMKTsKKyAgICAgICAgICAgIGlmICghbW9yZSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSB3aGlsZSAobW9yZSk7CisgICAgcmV0dXJuIHRydWU7ICAgICAgICAvLyB2YWx1ZSBpcyBmb3Igc3RkOjpmdXR1cmUgdGhyZWFkIHN5bmNocm9uaXphdGlvbgorfQorCisvLyBpbnNlcnQgYXBwcm9wcmlhdGVseSBpbnRvIHF1ZXVlCit2b2lkIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6c2F2ZUl0ZW0oTWVkaWFBbmFseXRpY3NJdGVtICogaXRlbSkKK3sKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgLy8gbXV0ZXggYmV0d2VlbiBpbnNlcnRpb24gYW5kIGR1bXBpbmcgdGhlIGNvbnRlbnRzCisKKyAgICAvLyB3ZSB3YW50IHRvIGR1bXAgJ2luIEZJRk8gb3JkZXInLCBzbyBpbnNlcnQgYXQgdGhlIGVuZAorICAgIG1JdGVtcy5wdXNoX2JhY2soaXRlbSk7CisKKyAgICAvLyBjbGVhbiBvbGQgc3R1ZmYgZnJvbSB0aGUgcXVldWUKKyAgICBib29sIG1vcmUgPSBleHBpcmF0aW9uc19sKGl0ZW0pOworCisgICAgLy8gY29uc2lkZXIgc2NoZWR1bGluZyBzb21lIGFzeW5jaHJvbm91cyBjbGVhbmluZywgaWYgbm90IHJ1bm5pbmcKKyAgICBpZiAobW9yZSkgeworICAgICAgICBpZiAoIW1FeHBpcmVGdXR1cmUudmFsaWQoKQorICAgICAgICAgICAgfHwgbUV4cGlyZUZ1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6c2Vjb25kcygwKSkgPT0gc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSkgeworCisgICAgICAgICAgICBtRXhwaXJlRnV0dXJlID0gc3RkOjphc3luYyhzdGQ6OmxhdW5jaDo6YXN5bmMsIFt0aGlzXSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIHRoaXMtPnByb2Nlc3NFeHBpcmF0aW9ucygpO30pOworICAgICAgICB9CisgICAgfQogfQogCiBzdGF0aWMgc3RkOjpzdHJpbmcgYWxsb3dlZEtleXNbXSA9CiB7CiAgICAgImF1ZGlvcG9saWN5IiwKICAgICAiYXVkaW9yZWNvcmQiLAorICAgICJhdWRpb3RocmVhZCIsCiAgICAgImF1ZGlvdHJhY2siLAogICAgICJjb2RlYyIsCiAgICAgImV4dHJhY3RvciIsCkBAIC01ODEsNyArNjQ5LDggQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChiaW5kZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgc3A8SVBhY2thZ2VNYW5hZ2VyTmF0aXZlPiBwYWNrYWdlX21nciA9IGludGVyZmFjZV9jYXN0PElQYWNrYWdlTWFuYWdlck5hdGl2ZT4oYmluZGVyKTsKKyAgICAgICAgICAgIHNwPGNvbnRlbnQ6OnBtOjpJUGFja2FnZU1hbmFnZXJOYXRpdmU+IHBhY2thZ2VfbWdyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxjb250ZW50OjpwbTo6SVBhY2thZ2VNYW5hZ2VyTmF0aXZlPihiaW5kZXIpOwogICAgICAgICAgICAgYmluZGVyOjpTdGF0dXMgc3RhdHVzOwogCiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHVpZHM7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5oCmluZGV4IGIzYzkwMmEuLjZjOWNiYWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5oCkBAIC0yNiw2ICsyNiw4IEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KIAorI2luY2x1ZGUgPGZ1dHVyZT4KKwogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUFuYWx5dGljc1NlcnZpY2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNDQsNiArNDYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQW5hbHl0aWNzU2VydmljZSgpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5NZWRpYUFuYWx5dGljc1NlcnZpY2UoKTsKIAorICAgIGJvb2wgcHJvY2Vzc0V4cGlyYXRpb25zKCk7CisKICBwcml2YXRlOgogICAgIE1lZGlhQW5hbHl0aWNzSXRlbTo6U2Vzc2lvbklEX3QgZ2VuZXJhdGVVbmlxdWVTZXNzaW9uSUQoKTsKIApAQCAtNjUsNiArNjksOCBAQAogICAgIGludDMyX3QgbU1heFJlY29yZHM7CiAgICAgLy8gYnkgdGltZSAobm9uZSBvbGRlciB0aGFuIHRoaXMgbG9uZyBhZ2FuCiAgICAgbnNlY3NfdCBtTWF4UmVjb3JkQWdlTnM7CisgICAgLy8gbWF4IHRvIGV4cGlyZSBwZXIgZXhwaXJhdGlvbnNfbCgpIGludm9jYXRpb24KKyAgICBpbnQzMl90IG1NYXhSZWNvcmRzRXhwaXJlZEF0T25jZTsKICAgICAvLwogICAgIC8vICMgb2Ygc2V0cyBvZiBzdW1tYXJpZXMKICAgICBpbnQzMl90IG1NYXhSZWNvcmRTZXRzOwpAQCAtNzksNiArODUsOSBAQAogICAgIExpc3Q8TWVkaWFBbmFseXRpY3NJdGVtICo+IG1JdGVtczsKICAgICB2b2lkIHNhdmVJdGVtKE1lZGlhQW5hbHl0aWNzSXRlbSAqKTsKIAorICAgIGJvb2wgZXhwaXJhdGlvbnNfbChNZWRpYUFuYWx5dGljc0l0ZW0gKik7CisgICAgc3RkOjpmdXR1cmU8Ym9vbD4gbUV4cGlyZUZ1dHVyZTsKKwogICAgIC8vIHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgb3V0cHV0CiAgICAgaW50IG1EdW1wUHJvdG87CiAgICAgaW50IG1EdW1wUHJvdG9EZWZhdWx0OwpAQCAtMTAzLDYgKzExMiw5IEBACiAKIH07CiAKKy8vIGhvb2sgdG8gc2VuZCB0aGluZ3Mgb2ZmIHRvIHRoZSBzdGF0c2Qgc3Vic3lzdGVtCitleHRlcm4gYm9vbCBkdW1wMlN0YXRzZChNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0pOworCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9pZmFjZV9zdGF0c2QuY3BwIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvaWZhY2Vfc3RhdHNkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODQ1ZjA2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvaWZhY2Vfc3RhdHNkLmNwcApAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJpZmFjZV9zdGF0c2QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKworI2luY2x1ZGUgIk1lZGlhQW5hbHl0aWNzU2VydmljZS5oIgorI2luY2x1ZGUgImlmYWNlX3N0YXRzZC5oIgorCisjaW5jbHVkZSA8c3RhdHNsb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzZXQgb2Ygcm91dGluZXMgdGhhdCBjcmFjayBhIE1lZGlhQW5hbHl0aWNzSXRlbQorLy8gYW5kIHNlbmQgaXQgb2ZmIHRvIHN0YXRzZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBob29rcworLy8KKy8vIGVhY2ggTWVkaWFBbmFseXRpY3NJdGVtIHR5cGUgKGV4dHJhY3RvciwgY29kZWMsIG51cGxheWVyLCBldGMpCisvLyBoYXMgaXRzIG93biByb3V0aW5lIHRvIGhhbmRsZSB0aGlzLgorLy8KKworYm9vbCBlbmFibGVkX3N0YXRzZCA9IHRydWU7CisKK3N0cnVjdCBzdGF0c2RfaG9va3MgeworICAgIGNvbnN0IGNoYXIgKmtleTsKKyAgICBib29sICgqaGFuZGxlcikoTWVkaWFBbmFseXRpY3NJdGVtICopOworfTsKKworLy8ga2VlcCB0aGlzIHNvcnRlZCwgc28gd2UgY2FuIGRvIGJpbmFyeSBzZWFyY2hlcworc3RydWN0IHN0YXRzZF9ob29rcyAgc3RhdHNkX2hhbmRsZXJzW10gPQoreworICAgIHsgImF1ZGlvcG9saWN5Iiwgc3RhdHNkX2F1ZGlvcG9saWN5IH0sCisgICAgeyAiYXVkaW9yZWNvcmQiLCBzdGF0c2RfYXVkaW9yZWNvcmQgfSwKKyAgICB7ICJhdWRpb3RocmVhZCIsIHN0YXRzZF9hdWRpb3RocmVhZCB9LAorICAgIHsgImF1ZGlvdHJhY2siLCBzdGF0c2RfYXVkaW90cmFjayB9LAorICAgIHsgImNvZGVjIiwgc3RhdHNkX2NvZGVjfSwKKyAgICB7ICJkcm0udmVuZG9yLkdvb2dsZS5XaWRldmluZUNETSIsIHN0YXRzZF93aWRldmluZUNETSB9LAorICAgIHsgImV4dHJhY3RvciIsIHN0YXRzZF9leHRyYWN0b3IgfSwKKyAgICB7ICJtZWRpYWRybSIsIHN0YXRzZF9tZWRpYWRybSB9LAorICAgIHsgIm51cGxheWVyIiwgc3RhdHNkX251cGxheWVyIH0sCisgICAgeyAibnVwbGF5ZXIyIiwgc3RhdHNkX251cGxheWVyIH0sCisgICAgeyAicmVjb3JkZXIiLCBzdGF0c2RfcmVjb3JkZXIgfSwKK307CisKKworLy8gZ2l2ZSBtZSBhIHJlY29yZCwgaSdsbCBsb29rIGF0IHRoZSB0eXBlIGFuZCB1cGxvYWQgYXBwcm9wcmlhdGVseQorYm9vbCBkdW1wMlN0YXRzZChNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0pIHsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBnZXQgdGhlIGtleQorICAgIHN0ZDo6c3RyaW5nIGtleSA9IGl0ZW0tPmdldEtleSgpOworCisgICAgaWYgKCFlbmFibGVkX3N0YXRzZCkgeworICAgICAgICBBTE9HVigic3RhdHNkIGxvZ2dpbmcgZGlzYWJsZWQgZm9yIHJlY29yZCBrZXk9JXMiLCBrZXkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQgaTsKKyAgICBmb3IoaSA9IDA7aSA8IHNpemVvZihzdGF0c2RfaGFuZGxlcnMpIC8gc2l6ZW9mKHN0YXRzZF9oYW5kbGVyc1swXSkgOyBpKyspIHsKKyAgICAgICAgaWYgKGtleSA9PSBzdGF0c2RfaGFuZGxlcnNbaV0ua2V5KSB7CisgICAgICAgICAgICByZXR1cm4gKCpzdGF0c2RfaGFuZGxlcnNbaV0uaGFuZGxlcikoaXRlbSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9pZmFjZV9zdGF0c2QuaCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL2lmYWNlX3N0YXRzZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NWQzMDMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9pZmFjZV9zdGF0c2QuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitleHRlcm4gYm9vbCBlbmFibGVkX3N0YXRzZDsKKworLy8gY29tcG9uZW50IHNwZWNpZmljIGR1bXBlcnMKK2V4dGVybiBib29sIHN0YXRzZF9hdWRpb3BvbGljeShNZWRpYUFuYWx5dGljc0l0ZW0gKik7CitleHRlcm4gYm9vbCBzdGF0c2RfYXVkaW9yZWNvcmQoTWVkaWFBbmFseXRpY3NJdGVtICopOworZXh0ZXJuIGJvb2wgc3RhdHNkX2F1ZGlvdGhyZWFkKE1lZGlhQW5hbHl0aWNzSXRlbSAqKTsKK2V4dGVybiBib29sIHN0YXRzZF9hdWRpb3RyYWNrKE1lZGlhQW5hbHl0aWNzSXRlbSAqKTsKK2V4dGVybiBib29sIHN0YXRzZF9jb2RlYyhNZWRpYUFuYWx5dGljc0l0ZW0gKik7CitleHRlcm4gYm9vbCBzdGF0c2RfZXh0cmFjdG9yKE1lZGlhQW5hbHl0aWNzSXRlbSAqKTsKK2V4dGVybiBib29sIHN0YXRzZF9udXBsYXllcihNZWRpYUFuYWx5dGljc0l0ZW0gKik7CitleHRlcm4gYm9vbCBzdGF0c2RfcmVjb3JkZXIoTWVkaWFBbmFseXRpY3NJdGVtICopOworCitleHRlcm4gYm9vbCBzdGF0c2RfbWVkaWFkcm0oTWVkaWFBbmFseXRpY3NJdGVtICopOworZXh0ZXJuIGJvb2wgc3RhdHNkX3dpZGV2aW5lQ0RNKE1lZGlhQW5hbHl0aWNzSXRlbSAqKTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3Mvc3RhdHNkX2F1ZGlvcG9saWN5LmNwcCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL3N0YXRzZF9hdWRpb3BvbGljeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDZjNGRkZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL3N0YXRzZF9hdWRpb3BvbGljeS5jcHAKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgInN0YXRzZF9hdWRpb3BvbGljeSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHN0YXRzbG9nLmg+CisKKyNpbmNsdWRlICJNZWRpYUFuYWx5dGljc1NlcnZpY2UuaCIKKyNpbmNsdWRlICJmcmFtZXdvcmtzL2Jhc2UvY29yZS9wcm90by9hbmRyb2lkL3N0YXRzL21lZGlhbWV0cmljcy9tZWRpYW1ldHJpY3MucGIuaCIKKyNpbmNsdWRlICJpZmFjZV9zdGF0c2QuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitib29sIHN0YXRzZF9hdWRpb3BvbGljeShNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0pCit7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgICAgLy8gdGhlc2UgZ28gaW50byB0aGUgc3RhdHNkIHdyYXBwZXIKKyAgICBuc2Vjc190IHRpbWVzdGFtcCA9IGl0ZW0tPmdldFRpbWVzdGFtcCgpOworICAgIHN0ZDo6c3RyaW5nIHBrZ05hbWUgPSBpdGVtLT5nZXRQa2dOYW1lKCk7CisgICAgaW50NjRfdCBwa2dWZXJzaW9uQ29kZSA9IGl0ZW0tPmdldFBrZ1ZlcnNpb25Db2RlKCk7CisgICAgaW50NjRfdCBtZWRpYUFwZXhWZXJzaW9uID0gMDsKKworCisgICAgLy8gdGhlIHJlc3QgaW50byBvdXIgb3duIHByb3RvCisgICAgLy8KKyAgICA6OmFuZHJvaWQ6OnN0YXRzOjptZWRpYW1ldHJpY3M6OkF1ZGlvUG9saWN5RGF0YSBtZXRyaWNzX3Byb3RvOworCisgICAgLy8gZmxlc2ggb3V0IHRoZSBwcm90b2J1ZiB3ZSdsbCBoYW5kIG9mZiB3aXRoIG91ciBkYXRhCisgICAgLy8KKyAgICAvL2ludDMyIGNoYXIga0F1ZGlvUG9saWN5U3RhdHVzW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5zdGF0dXMiOworICAgIGludDMyX3Qgc3RhdHVzID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LnN0YXR1cyIsICZzdGF0dXMpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3N0YXR1cyhzdGF0dXMpOworICAgIH0KKyAgICAvL3N0cmluZyBjaGFyIGtBdWRpb1BvbGljeVJxc3RTcmNbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LnJxc3Quc3JjIjsKKyAgICBjaGFyICpycXN0X3NyYyA9IE5VTEw7CisgICAgaWYgKGl0ZW0tPmdldENTdHJpbmcoImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kucnFzdC5zcmMiLCAmcnFzdF9zcmMpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3JlcXVlc3Rfc291cmNlKHJxc3Rfc3JjKTsKKyAgICB9CisgICAgLy9zdHJpbmcgY2hhciBrQXVkaW9Qb2xpY3lScXN0UGtnW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5ycXN0LnBrZyI7CisgICAgY2hhciAqcnFzdF9wa2cgPSBOVUxMOworICAgIGlmIChpdGVtLT5nZXRDU3RyaW5nKCJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LnJxc3QucGtnIiwgJnJxc3RfcGtnKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9yZXF1ZXN0X3BhY2thZ2UocnFzdF9wa2cpOworICAgIH0KKyAgICAvL2ludDMyIGNoYXIga0F1ZGlvUG9saWN5UnFzdFNlc3Npb25bXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LnJxc3Quc2Vzc2lvbiI7CisgICAgaW50MzJfdCBycXN0X3Nlc3Npb24gPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kucnFzdC5zZXNzaW9uIiwgJnJxc3Rfc2Vzc2lvbikpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfcmVxdWVzdF9zZXNzaW9uKHJxc3Rfc2Vzc2lvbik7CisgICAgfQorICAgIC8vc3RyaW5nIGNoYXIga0F1ZGlvUG9saWN5UnFzdERldmljZVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kucnFzdC5kZXZpY2UiOworICAgIGNoYXIgKnJxc3RfZGV2aWNlID0gTlVMTDsKKyAgICBpZiAoaXRlbS0+Z2V0Q1N0cmluZygiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5ycXN0LmRldmljZSIsICZycXN0X2RldmljZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfcmVxdWVzdF9kZXZpY2UocnFzdF9kZXZpY2UpOworICAgIH0KKworICAgIC8vc3RyaW5nIGNoYXIga0F1ZGlvUG9saWN5QWN0aXZlU3JjW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5hY3RpdmUuc3JjIjsKKyAgICBjaGFyICphY3RpdmVfc3JjID0gTlVMTDsKKyAgICBpZiAoaXRlbS0+Z2V0Q1N0cmluZygiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5hY3RpdmUuc3JjIiwgJmFjdGl2ZV9zcmMpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2FjdGl2ZV9zb3VyY2UoYWN0aXZlX3NyYyk7CisgICAgfQorICAgIC8vc3RyaW5nIGNoYXIga0F1ZGlvUG9saWN5QWN0aXZlUGtnW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5hY3RpdmUucGtnIjsKKyAgICBjaGFyICphY3RpdmVfcGtnID0gTlVMTDsKKyAgICBpZiAoaXRlbS0+Z2V0Q1N0cmluZygiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5hY3RpdmUucGtnIiwgJmFjdGl2ZV9wa2cpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2FjdGl2ZV9wYWNrYWdlKGFjdGl2ZV9wa2cpOworICAgIH0KKyAgICAvL2ludDMyIGNoYXIga0F1ZGlvUG9saWN5QWN0aXZlU2Vzc2lvbltdID0gImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kuYWN0aXZlLnNlc3Npb24iOworICAgIGludDMyX3QgYWN0aXZlX3Nlc3Npb24gPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kuYWN0aXZlLnNlc3Npb24iLCAmYWN0aXZlX3Nlc3Npb24pKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2FjdGl2ZV9zZXNzaW9uKGFjdGl2ZV9zZXNzaW9uKTsKKyAgICB9CisgICAgLy9zdHJpbmcgY2hhciBrQXVkaW9Qb2xpY3lBY3RpdmVEZXZpY2VbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LmFjdGl2ZS5kZXZpY2UiOworICAgIGNoYXIgKmFjdGl2ZV9kZXZpY2UgPSBOVUxMOworICAgIGlmIChpdGVtLT5nZXRDU3RyaW5nKCJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LmFjdGl2ZS5kZXZpY2UiLCAmYWN0aXZlX2RldmljZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfYWN0aXZlX2RldmljZShhY3RpdmVfZGV2aWNlKTsKKyAgICB9CisKKworICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQ7CisgICAgaWYgKCFtZXRyaWNzX3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNlcmlhbGl6ZSBhdWRpcG9saWN5IG1ldHJpY3MiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChlbmFibGVkX3N0YXRzZCkgeworICAgICAgICBhbmRyb2lkOjp1dGlsOjpCeXRlc0ZpZWxkIGJmX3NlcmlhbGl6ZWQoIHNlcmlhbGl6ZWQuY19zdHIoKSwgc2VyaWFsaXplZC5zaXplKCkpOworICAgICAgICAodm9pZClhbmRyb2lkOjp1dGlsOjpzdGF0c193cml0ZShhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfQVVESU9QT0xJQ1lfUkVQT1JURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCwgcGtnTmFtZS5jX3N0cigpLCBwa2dWZXJzaW9uQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFBcGV4VmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZfc2VyaWFsaXplZCk7CisKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiTk9UIHNlbmRpbmc6IHByaXZhdGUgZGF0YSAobGVuPSV6dSkiLCBzdHJsZW4oc2VyaWFsaXplZC5jX3N0cigpKSk7CisgICAgfQorCisgICAgLy8gbXVzdCBmcmVlIHRoZSBzdHJpbmdzIHRoYXQgd2Ugd2VyZSBnaXZlbgorICAgIGZyZWUocnFzdF9zcmMpOworICAgIGZyZWUocnFzdF9wa2cpOworICAgIGZyZWUocnFzdF9kZXZpY2UpOworICAgIGZyZWUoYWN0aXZlX3NyYyk7CisgICAgZnJlZShhY3RpdmVfcGtnKTsKKyAgICBmcmVlKGFjdGl2ZV9kZXZpY2UpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK307CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9zdGF0c2RfYXVkaW9yZWNvcmQuY3BwIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3Mvc3RhdHNkX2F1ZGlvcmVjb3JkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWVkYjI3Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3Mvc3RhdHNkX2F1ZGlvcmVjb3JkLmNwcApAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAic3RhdHNkX2F1ZGlvcmVjb3JkIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8c3RhdHNsb2cuaD4KKworI2luY2x1ZGUgIk1lZGlhQW5hbHl0aWNzU2VydmljZS5oIgorI2luY2x1ZGUgImZyYW1ld29ya3MvYmFzZS9jb3JlL3Byb3RvL2FuZHJvaWQvc3RhdHMvbWVkaWFtZXRyaWNzL21lZGlhbWV0cmljcy5wYi5oIgorI2luY2x1ZGUgImlmYWNlX3N0YXRzZC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2Jvb2wgc3RhdHNkX2F1ZGlvcmVjb3JkKE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSkKK3sKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgICAvLyB0aGVzZSBnbyBpbnRvIHRoZSBzdGF0c2Qgd3JhcHBlcgorICAgIG5zZWNzX3QgdGltZXN0YW1wID0gaXRlbS0+Z2V0VGltZXN0YW1wKCk7CisgICAgc3RkOjpzdHJpbmcgcGtnTmFtZSA9IGl0ZW0tPmdldFBrZ05hbWUoKTsKKyAgICBpbnQ2NF90IHBrZ1ZlcnNpb25Db2RlID0gaXRlbS0+Z2V0UGtnVmVyc2lvbkNvZGUoKTsKKyAgICBpbnQ2NF90IG1lZGlhQXBleFZlcnNpb24gPSAwOworCisKKyAgICAvLyB0aGUgcmVzdCBpbnRvIG91ciBvd24gcHJvdG8KKyAgICAvLworICAgIDo6YW5kcm9pZDo6c3RhdHM6Om1lZGlhbWV0cmljczo6QXVkaW9SZWNvcmREYXRhIG1ldHJpY3NfcHJvdG87CisKKyAgICAvLyBmbGVzaCBvdXQgdGhlIHByb3RvYnVmIHdlJ2xsIGhhbmQgb2ZmIHdpdGggb3VyIGRhdGEKKyAgICAvLworICAgIGNoYXIgKmVuY29kaW5nID0gTlVMTDsKKyAgICBpZiAoaXRlbS0+Z2V0Q1N0cmluZygiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5lbmNvZGluZyIsICZlbmNvZGluZykpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfZW5jb2RpbmcoZW5jb2RpbmcpOworICAgIH0KKworICAgIGNoYXIgKnNvdXJjZSA9IE5VTEw7CisgICAgaWYgKGl0ZW0tPmdldENTdHJpbmcoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuc291cmNlIiwgJnNvdXJjZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfc291cmNlKHNvdXJjZSk7CisgICAgfQorCisgICAgaW50MzJfdCBsYXRlbmN5ID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLmxhdGVuY3kiLCAmbGF0ZW5jeSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfbGF0ZW5jeShsYXRlbmN5KTsKKyAgICB9CisKKyAgICBpbnQzMl90IHNhbXBsZXJhdGUgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuc2FtcGxlcmF0ZSIsICZzYW1wbGVyYXRlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9zYW1wbGVyYXRlKHNhbXBsZXJhdGUpOworICAgIH0KKworICAgIGludDMyX3QgY2hhbm5lbHMgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuY2hhbm5lbHMiLCAmY2hhbm5lbHMpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2NoYW5uZWxzKGNoYW5uZWxzKTsKKyAgICB9CisKKyAgICBpbnQ2NF90IGNyZWF0ZWRNcyA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5jcmVhdGVkTXMiLCAmY3JlYXRlZE1zKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9jcmVhdGVkX21pbGxpcyhjcmVhdGVkTXMpOworICAgIH0KKworICAgIGludDY0X3QgZHVyYXRpb25NcyA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5kdXJhdGlvbk1zIiwgJmR1cmF0aW9uTXMpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2R1cmF0aW9uX21pbGxpcyhkdXJhdGlvbk1zKTsKKyAgICB9CisKKyAgICBpbnQzMl90IGNvdW50ID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLm4iLCAmY291bnQpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2NvdW50KGNvdW50KTsKKyAgICB9CisKKyAgICBpbnQzMl90IGVycmNvZGUgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuZXJyY29kZSIsICZlcnJjb2RlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9lcnJvcl9jb2RlKGVycmNvZGUpOworICAgIH0gZWxzZSBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQubGFzdEVycm9yLmNvZGUiLCAmZXJyY29kZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfZXJyb3JfY29kZShlcnJjb2RlKTsKKyAgICB9CisKKyAgICBjaGFyICplcnJmdW5jID0gTlVMTDsKKyAgICBpZiAoaXRlbS0+Z2V0Q1N0cmluZygiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5lcnJmdW5jIiwgJmVycmZ1bmMpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2Vycm9yX2Z1bmN0aW9uKGVycmZ1bmMpOworICAgIH0gZWxzZSBpZiAoaXRlbS0+Z2V0Q1N0cmluZygiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5sYXN0RXJyb3IuYXQiLCAmZXJyZnVuYykpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfZXJyb3JfZnVuY3Rpb24oZXJyZnVuYyk7CisgICAgfQorCisgICAgLy8gcG9ydElkIChpbnQzMikKKyAgICBpbnQzMl90IHBvcnRfaWQgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQucG9ydElkIiwgJnBvcnRfaWQpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3BvcnRfaWQoY291bnQpOworICAgIH0KKyAgICAvLyBmcmFtZUNvdW50IChpbnQzMikKKyAgICBpbnQzMl90IGZyYW1lQ291bnQgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuZnJhbWVDb3VudCIsICZmcmFtZUNvdW50KSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9mcmFtZV9jb3VudChmcmFtZUNvdW50KTsKKyAgICB9CisgICAgLy8gYXR0cmlidXRlcyAoc3RyaW5nKQorICAgIGNoYXIgKmF0dHJpYnV0ZXMgPSBOVUxMOworICAgIGlmIChpdGVtLT5nZXRDU3RyaW5nKCJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLmF0dHJpYnV0ZXMiLCAmYXR0cmlidXRlcykpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfYXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKKyAgICB9CisgICAgLy8gY2hhbm5lbE1hc2sgKGludDY0KQorICAgIGludDY0X3QgY2hhbm5lbE1hc2sgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50NjQoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuY2hhbm5lbE1hc2siLCAmY2hhbm5lbE1hc2spKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2NoYW5uZWxfbWFzayhjaGFubmVsTWFzayk7CisgICAgfQorICAgIC8vIHN0YXJ0Y291bnQgKGludDY0KQorICAgIGludDY0X3Qgc3RhcnRjb3VudCA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5zdGFydGNvdW50IiwgJnN0YXJ0Y291bnQpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3N0YXJ0X2NvdW50KHN0YXJ0Y291bnQpOworICAgIH0KKworCisgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZDsKKyAgICBpZiAoIW1ldHJpY3NfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbGl6ZWQpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2VyaWFsaXplIGF1ZGlvcmVjb3JkIG1ldHJpY3MiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChlbmFibGVkX3N0YXRzZCkgeworICAgICAgICBhbmRyb2lkOjp1dGlsOjpCeXRlc0ZpZWxkIGJmX3NlcmlhbGl6ZWQoIHNlcmlhbGl6ZWQuY19zdHIoKSwgc2VyaWFsaXplZC5zaXplKCkpOworICAgICAgICAodm9pZClhbmRyb2lkOjp1dGlsOjpzdGF0c193cml0ZShhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfQVVESU9SRUNPUkRfUkVQT1JURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCwgcGtnTmFtZS5jX3N0cigpLCBwa2dWZXJzaW9uQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFBcGV4VmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZfc2VyaWFsaXplZCk7CisKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiTk9UIHNlbmRpbmc6IHByaXZhdGUgZGF0YSAobGVuPSV6dSkiLCBzdHJsZW4oc2VyaWFsaXplZC5jX3N0cigpKSk7CisgICAgfQorCisgICAgLy8gbXVzdCBmcmVlIHRoZSBzdHJpbmdzIHRoYXQgd2Ugd2VyZSBnaXZlbgorICAgIGZyZWUoZW5jb2RpbmcpOworICAgIGZyZWUoc291cmNlKTsKKyAgICBmcmVlKGVycmZ1bmMpOworICAgIGZyZWUoYXR0cmlidXRlcyk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL3N0YXRzZF9hdWRpb3RocmVhZC5jcHAgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9zdGF0c2RfYXVkaW90aHJlYWQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyMzI0MjQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9zdGF0c2RfYXVkaW90aHJlYWQuY3BwCkBAIC0wLDAgKzEsMjE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJzdGF0c2RfYXVkaW90aHJlYWQiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxzdGF0c2xvZy5oPgorCisjaW5jbHVkZSAiTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmgiCisjaW5jbHVkZSAiZnJhbWV3b3Jrcy9iYXNlL2NvcmUvcHJvdG8vYW5kcm9pZC9zdGF0cy9tZWRpYW1ldHJpY3MvbWVkaWFtZXRyaWNzLnBiLmgiCisjaW5jbHVkZSAiaWZhY2Vfc3RhdHNkLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworYm9vbCBzdGF0c2RfYXVkaW90aHJlYWQoTWVkaWFBbmFseXRpY3NJdGVtICppdGVtKQoreworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybiBmYWxzZTsKKworICAgIC8vIHRoZXNlIGdvIGludG8gdGhlIHN0YXRzZCB3cmFwcGVyCisgICAgbnNlY3NfdCB0aW1lc3RhbXAgPSBpdGVtLT5nZXRUaW1lc3RhbXAoKTsKKyAgICBzdGQ6OnN0cmluZyBwa2dOYW1lID0gaXRlbS0+Z2V0UGtnTmFtZSgpOworICAgIGludDY0X3QgcGtnVmVyc2lvbkNvZGUgPSBpdGVtLT5nZXRQa2dWZXJzaW9uQ29kZSgpOworICAgIGludDY0X3QgbWVkaWFBcGV4VmVyc2lvbiA9IDA7CisKKworICAgIC8vIHRoZSByZXN0IGludG8gb3VyIG93biBwcm90bworICAgIC8vCisgICAgOjphbmRyb2lkOjpzdGF0czo6bWVkaWFtZXRyaWNzOjpBdWRpb1RocmVhZERhdGEgbWV0cmljc19wcm90bzsKKworI2RlZmluZQlNTV9QUkVGSVggImFuZHJvaWQubWVkaWEuYXVkaW90aHJlYWQuIgorCisgICAgLy8gZmxlc2ggb3V0IHRoZSBwcm90b2J1ZiB3ZSdsbCBoYW5kIG9mZiB3aXRoIG91ciBkYXRhCisgICAgLy8KKyAgICBjaGFyICpteXR5cGUgPSBOVUxMOworICAgIGlmIChpdGVtLT5nZXRDU3RyaW5nKE1NX1BSRUZJWCAidHlwZSIsICZteXR5cGUpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3R5cGUobXl0eXBlKTsKKyAgICB9CisgICAgaW50MzJfdCBmcmFtZWNvdW50ID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKE1NX1BSRUZJWCAiZnJhbWVjb3VudCIsICZmcmFtZWNvdW50KSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9mcmFtZWNvdW50KGZyYW1lY291bnQpOworICAgIH0KKyAgICBpbnQzMl90IHNhbXBsZXJhdGUgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoTU1fUFJFRklYICJzYW1wbGVyYXRlIiwgJnNhbXBsZXJhdGUpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3NhbXBsZXJhdGUoc2FtcGxlcmF0ZSk7CisgICAgfQorICAgIGNoYXIgKndvcmtoaXN0ID0gTlVMTDsKKyAgICBpZiAoaXRlbS0+Z2V0Q1N0cmluZyhNTV9QUkVGSVggIndvcmtNcy5oaXN0IiwgJndvcmtoaXN0KSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF93b3JrX21pbGxpc19oaXN0KHdvcmtoaXN0KTsKKyAgICB9CisgICAgY2hhciAqbGF0ZW5jeWhpc3QgPSBOVUxMOworICAgIGlmIChpdGVtLT5nZXRDU3RyaW5nKE1NX1BSRUZJWCAibGF0ZW5jeU1zLmhpc3QiLCAmbGF0ZW5jeWhpc3QpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2xhdGVuY3lfbWlsbGlzX2hpc3QobGF0ZW5jeWhpc3QpOworICAgIH0KKyAgICBjaGFyICp3YXJtdXBoaXN0ID0gTlVMTDsKKyAgICBpZiAoaXRlbS0+Z2V0Q1N0cmluZyhNTV9QUkVGSVggIndhcm11cE1zLmhpc3QiLCAmd2FybXVwaGlzdCkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfd2FybXVwX21pbGxpc19oaXN0KHdhcm11cGhpc3QpOworICAgIH0KKyAgICBpbnQ2NF90IHVuZGVycnVucyA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQ2NChNTV9QUkVGSVggInVuZGVycnVucyIsICZ1bmRlcnJ1bnMpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3VuZGVycnVucyh1bmRlcnJ1bnMpOworICAgIH0KKyAgICBpbnQ2NF90IG92ZXJydW5zID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDY0KE1NX1BSRUZJWCAib3ZlcnJ1bnMiLCAmb3ZlcnJ1bnMpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X292ZXJydW5zKG92ZXJydW5zKTsKKyAgICB9CisgICAgaW50NjRfdCBhY3RpdmVNcyA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQ2NChNTV9QUkVGSVggImFjdGl2ZU1zIiwgJmFjdGl2ZU1zKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9hY3RpdmVfbWlsbGlzKGFjdGl2ZU1zKTsKKyAgICB9CisgICAgaW50NjRfdCBkdXJhdGlvbk1zID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDY0KE1NX1BSRUZJWCAiZHVyYXRpb25NcyIsICZkdXJhdGlvbk1zKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9kdXJhdGlvbl9taWxsaXMoZHVyYXRpb25Ncyk7CisgICAgfQorCisgICAgLy8gaXRlbS0+c2V0SW50MzIoTU1fUFJFRklYICJpZCIsIChpbnQzMl90KW1JZCk7IC8vIElPIGhhbmRsZQorICAgIGludDMyX3QgaWQgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoTU1fUFJFRklYICJpZCIsICZpZCkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfaWQoaWQpOworICAgIH0KKyAgICAvLyBpdGVtLT5zZXRJbnQzMihNTV9QUkVGSVggInBvcnRJZCIsIChpbnQzMl90KW1Qb3J0SWQpOworICAgIGludDMyX3QgcG9ydF9pZCA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMihNTV9QUkVGSVggInBvcnRJZCIsICZpZCkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfcG9ydF9pZChwb3J0X2lkKTsKKyAgICB9CisgICAgLy8gaXRlbS0+c2V0Q1N0cmluZyhNTV9QUkVGSVggInR5cGUiLCB0aHJlYWRUeXBlVG9TdHJpbmcobVR5cGUpKTsKKyAgICBjaGFyICp0eXBlID0gTlVMTDsKKyAgICBpZiAoaXRlbS0+Z2V0Q1N0cmluZyhNTV9QUkVGSVggInR5cGUiLCAmdHlwZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfdHlwZSh0eXBlKTsKKyAgICB9CisgICAgLy8gaXRlbS0+c2V0SW50MzIoTU1fUFJFRklYICJzYW1wbGVSYXRlIiwgKGludDMyX3QpbVNhbXBsZVJhdGUpOworICAgIGludDMyX3Qgc2FtcGxlX3JhdGUgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoTU1fUFJFRklYICJzYW1wbGVSYXRlIiwgJnNhbXBsZV9yYXRlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9zYW1wbGVfcmF0ZShzYW1wbGVfcmF0ZSk7CisgICAgfQorICAgIC8vIGl0ZW0tPnNldEludDY0KE1NX1BSRUZJWCAiY2hhbm5lbE1hc2siLCAoaW50NjRfdCltQ2hhbm5lbE1hc2spOworICAgIGludDMyX3QgY2hhbm5lbF9tYXNrID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKE1NX1BSRUZJWCAiY2hhbm5lbE1hc2siLCAmY2hhbm5lbF9tYXNrKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9jaGFubmVsX21hc2soY2hhbm5lbF9tYXNrKTsKKyAgICB9CisgICAgLy8gaXRlbS0+c2V0Q1N0cmluZyhNTV9QUkVGSVggImVuY29kaW5nIiwgdG9TdHJpbmcobUZvcm1hdCkuY19zdHIoKSk7CisgICAgY2hhciAqZW5jb2RpbmcgPSBOVUxMOworICAgIGlmIChpdGVtLT5nZXRDU3RyaW5nKE1NX1BSRUZJWCAiZW5jb2RpbmciLCAmZW5jb2RpbmcpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2VuY29kaW5nKGVuY29kaW5nKTsKKyAgICB9CisgICAgLy8gaXRlbS0+c2V0SW50MzIoTU1fUFJFRklYICJmcmFtZUNvdW50IiwgKGludDMyX3QpbUZyYW1lQ291bnQpOworICAgIGludDMyX3QgZnJhbWVfY291bnQgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoTU1fUFJFRklYICJmcmFtZUNvdW50IiwgJmZyYW1lX2NvdW50KSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9mcmFtZV9jb3VudChmcmFtZV9jb3VudCk7CisgICAgfQorICAgIC8vIGl0ZW0tPnNldENTdHJpbmcoTU1fUFJFRklYICJvdXREZXZpY2UiLCB0b1N0cmluZyhtT3V0RGV2aWNlKS5jX3N0cigpKTsKKyAgICBjaGFyICpvdXREZXZpY2UgPSBOVUxMOworICAgIGlmIChpdGVtLT5nZXRDU3RyaW5nKE1NX1BSRUZJWCAib3V0RGV2aWNlIiwgJm91dERldmljZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfb3V0cHV0X2RldmljZShvdXREZXZpY2UpOworICAgIH0KKyAgICAvLyBpdGVtLT5zZXRDU3RyaW5nKE1NX1BSRUZJWCAiaW5EZXZpY2UiLCB0b1N0cmluZyhtSW5EZXZpY2UpLmNfc3RyKCkpOworICAgIGNoYXIgKmluRGV2aWNlID0gTlVMTDsKKyAgICBpZiAoaXRlbS0+Z2V0Q1N0cmluZyhNTV9QUkVGSVggImluRGV2aWNlIiwgJmluRGV2aWNlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9pbnB1dF9kZXZpY2UoaW5EZXZpY2UpOworICAgIH0KKyAgICAvLyBpdGVtLT5zZXREb3VibGUoTU1fUFJFRklYICJpb0ppdHRlck1zLm1lYW4iLCBtSW9KaXR0ZXJNcy5nZXRNZWFuKCkpOworICAgIGRvdWJsZSBpb2ppdHRlcnNfbXNfbWVhbiA9IC0xOworICAgIGlmIChpdGVtLT5nZXREb3VibGUoTU1fUFJFRklYICJpb0ppdHRlck1zLm1lYW4iLCAmaW9qaXR0ZXJzX21zX21lYW4pKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2lvX2ppdHRlcl9tZWFuX21pbGxpcyhpb2ppdHRlcnNfbXNfbWVhbik7CisgICAgfQorICAgIC8vIGl0ZW0tPnNldERvdWJsZShNTV9QUkVGSVggImlvSml0dGVyTXMuc3RkIiwgbUlvSml0dGVyTXMuZ2V0U3RkRGV2KCkpOworICAgIGRvdWJsZSBpb2ppdHRlcnNfbXNfc3RkID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldERvdWJsZShNTV9QUkVGSVggImlvSml0dGVyTXMuc3RkIiwgJmlvaml0dGVyc19tc19zdGQpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2lvX2ppdHRlcl9zdGRkZXZfbWlsbGlzKGlvaml0dGVyc19tc19zdGQpOworICAgIH0KKyAgICAvLyBpdGVtLT5zZXREb3VibGUoTU1fUFJFRklYICJwcm9jZXNzVGltZU1zLm1lYW4iLCBtUHJvY2Vzc1RpbWVNcy5nZXRNZWFuKCkpOworICAgIGRvdWJsZSBwcm9jZXNzX3RpbWVfbXNfbWVhbiA9IC0xOworICAgIGlmIChpdGVtLT5nZXREb3VibGUoTU1fUFJFRklYICJwcm9jZXNzVGltZU1zLm1lYW4iLCAmcHJvY2Vzc190aW1lX21zX21lYW4pKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3Byb2Nlc3NfdGltZV9tZWFuX21pbGxpcyhwcm9jZXNzX3RpbWVfbXNfbWVhbik7CisgICAgfQorICAgIC8vIGl0ZW0tPnNldERvdWJsZShNTV9QUkVGSVggInByb2Nlc3NUaW1lTXMuc3RkIiwgbVByb2Nlc3NUaW1lTXMuZ2V0U3RkRGV2KCkpOworICAgIGRvdWJsZSBwcm9jZXNzX3RpbWVfbXNfc3RkID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldERvdWJsZShNTV9QUkVGSVggInByb2Nlc3NUaW1lTXMuc3RkIiwgJnByb2Nlc3NfdGltZV9tc19zdGQpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3Byb2Nlc3NfdGltZV9zdGRkZXZfbWlsbGlzKHByb2Nlc3NfdGltZV9tc19zdGQpOworICAgIH0KKyAgICAvLyBpdGVtLT5zZXREb3VibGUoTU1fUFJFRklYICJ0aW1lc3RhbXBKaXR0ZXJNcy5tZWFuIiwgdHNqaXR0ZXIuZ2V0TWVhbigpKTsKKyAgICBkb3VibGUgdGltZXN0YW1wX2ppdHRlcl9tc19tZWFuID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldERvdWJsZShNTV9QUkVGSVggInRpbWVzdGFtcEppdHRlck1zLm1lYW4iLCAmdGltZXN0YW1wX2ppdHRlcl9tc19tZWFuKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF90aW1lc3RhbXBfaml0dGVyX21lYW5fbWlsbGlzKHRpbWVzdGFtcF9qaXR0ZXJfbXNfbWVhbik7CisgICAgfQorICAgIC8vIGl0ZW0tPnNldERvdWJsZShNTV9QUkVGSVggInRpbWVzdGFtcEppdHRlck1zLnN0ZCIsIHRzaml0dGVyLmdldFN0ZERldigpKTsKKyAgICBkb3VibGUgdGltZXN0YW1wX2ppdHRlcl9tc19zdGRkZXYgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0RG91YmxlKE1NX1BSRUZJWCAidGltZXN0YW1wSml0dGVyTXMuc3RkIiwgJnRpbWVzdGFtcF9qaXR0ZXJfbXNfc3RkZGV2KSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF90aW1lc3RhbXBfaml0dGVyX3N0ZGRldl9taWxsaXModGltZXN0YW1wX2ppdHRlcl9tc19zdGRkZXYpOworICAgIH0KKyAgICAvLyBpdGVtLT5zZXREb3VibGUoTU1fUFJFRklYICJsYXRlbmN5TXMubWVhbiIsIG1MYXRlbmN5TXMuZ2V0TWVhbigpKTsKKyAgICBkb3VibGUgbGF0ZW5jeV9tc19tZWFuID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldERvdWJsZShNTV9QUkVGSVggImxhdGVuY3lNcy5tZWFuIiwgJmxhdGVuY3lfbXNfbWVhbikpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfbGF0ZW5jeV9tZWFuX21pbGxpcyhsYXRlbmN5X21zX21lYW4pOworICAgIH0KKyAgICAvLyBpdGVtLT5zZXREb3VibGUoTU1fUFJFRklYICJsYXRlbmN5TXMuc3RkIiwgbUxhdGVuY3lNcy5nZXRTdGREZXYoKSk7CisgICAgZG91YmxlIGxhdGVuY3lfbXNfc3RkZGV2ID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldERvdWJsZShNTV9QUkVGSVggImxhdGVuY3lNcy5zdGQiLCAmbGF0ZW5jeV9tc19zdGRkZXYpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2xhdGVuY3lfc3RkZGV2X21pbGxpcyhsYXRlbmN5X21zX3N0ZGRldik7CisgICAgfQorCisKKyAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkOworICAgIGlmICghbWV0cmljc19wcm90by5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZCkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXJpYWxpemUgYXVkaW90aHJlYWQgbWV0cmljcyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGVuYWJsZWRfc3RhdHNkKSB7CisgICAgICAgIGFuZHJvaWQ6OnV0aWw6OkJ5dGVzRmllbGQgYmZfc2VyaWFsaXplZCggc2VyaWFsaXplZC5jX3N0cigpLCBzZXJpYWxpemVkLnNpemUoKSk7CisgICAgICAgICh2b2lkKWFuZHJvaWQ6OnV0aWw6OnN0YXRzX3dyaXRlKGFuZHJvaWQ6OnV0aWw6Ok1FRElBTUVUUklDU19BVURJT1RIUkVBRF9SRVBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLCBwa2dOYW1lLmNfc3RyKCksIHBrZ1ZlcnNpb25Db2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUFwZXhWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZl9zZXJpYWxpemVkKTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJOT1Qgc2VuZGluZzogcHJpdmF0ZSBkYXRhIChsZW49JXp1KSIsIHN0cmxlbihzZXJpYWxpemVkLmNfc3RyKCkpKTsKKyAgICB9CisKKyAgICAvLyBtdXN0IGZyZWUgdGhlIHN0cmluZ3MgdGhhdCB3ZSB3ZXJlIGdpdmVuCisgICAgZnJlZShteXR5cGUpOworICAgIGZyZWUod29ya2hpc3QpOworICAgIGZyZWUobGF0ZW5jeWhpc3QpOworICAgIGZyZWUod2FybXVwaGlzdCk7CisgICAgZnJlZSh0eXBlKTsKKyAgICBmcmVlKGVuY29kaW5nKTsKKyAgICBmcmVlKGluRGV2aWNlKTsKKyAgICBmcmVlKG91dERldmljZSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL3N0YXRzZF9hdWRpb3RyYWNrLmNwcCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL3N0YXRzZF9hdWRpb3RyYWNrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjUwY2VkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3Mvc3RhdHNkX2F1ZGlvdHJhY2suY3BwCkBAIC0wLDAgKzEsMTU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJzdGF0c2RfYXVkaW90cmFjayIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHN0YXRzbG9nLmg+CisKKyNpbmNsdWRlICJNZWRpYUFuYWx5dGljc1NlcnZpY2UuaCIKKyNpbmNsdWRlICJmcmFtZXdvcmtzL2Jhc2UvY29yZS9wcm90by9hbmRyb2lkL3N0YXRzL21lZGlhbWV0cmljcy9tZWRpYW1ldHJpY3MucGIuaCIKKyNpbmNsdWRlICJpZmFjZV9zdGF0c2QuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitib29sIHN0YXRzZF9hdWRpb3RyYWNrKE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSkKK3sKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgICAvLyB0aGVzZSBnbyBpbnRvIHRoZSBzdGF0c2Qgd3JhcHBlcgorICAgIG5zZWNzX3QgdGltZXN0YW1wID0gaXRlbS0+Z2V0VGltZXN0YW1wKCk7CisgICAgc3RkOjpzdHJpbmcgcGtnTmFtZSA9IGl0ZW0tPmdldFBrZ05hbWUoKTsKKyAgICBpbnQ2NF90IHBrZ1ZlcnNpb25Db2RlID0gaXRlbS0+Z2V0UGtnVmVyc2lvbkNvZGUoKTsKKyAgICBpbnQ2NF90IG1lZGlhQXBleFZlcnNpb24gPSAwOworCisKKyAgICAvLyB0aGUgcmVzdCBpbnRvIG91ciBvd24gcHJvdG8KKyAgICAvLworICAgIDo6YW5kcm9pZDo6c3RhdHM6Om1lZGlhbWV0cmljczo6QXVkaW9UcmFja0RhdGEgbWV0cmljc19wcm90bzsKKworICAgIC8vIGZsZXNoIG91dCB0aGUgcHJvdG9idWYgd2UnbGwgaGFuZCBvZmYgd2l0aCBvdXIgZGF0YQorICAgIC8vCisKKyAgICAvLyBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvVHJhY2tTdHJlYW1UeXBlW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLnN0cmVhbXR5cGUiOworICAgIC8vIG9wdGlvbmFsIHN0cmluZyBzdHJlYW1UeXBlOworICAgIGNoYXIgKnN0cmVhbXR5cGUgPSBOVUxMOworICAgIGlmIChpdGVtLT5nZXRDU3RyaW5nKCJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suc3RyZWFtdHlwZSIsICZzdHJlYW10eXBlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9zdHJlYW1fdHlwZShzdHJlYW10eXBlKTsKKyAgICB9CisKKyAgICAvLyBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvVHJhY2tDb250ZW50VHlwZVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay50eXBlIjsKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgY29udGVudFR5cGU7CisgICAgY2hhciAqY29udGVudHR5cGUgPSBOVUxMOworICAgIGlmIChpdGVtLT5nZXRDU3RyaW5nKCJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2sudHlwZSIsICZjb250ZW50dHlwZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfY29udGVudF90eXBlKGNvbnRlbnR0eXBlKTsKKyAgICB9CisKKyAgICAvLyBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvVHJhY2tVc2FnZVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay51c2FnZSI7CisgICAgLy8gb3B0aW9uYWwgc3RyaW5nIHRyYWNrVXNhZ2U7CisgICAgY2hhciAqdHJhY2t1c2FnZSA9IE5VTEw7CisgICAgaWYgKGl0ZW0tPmdldENTdHJpbmcoImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay51c2FnZSIsICZ0cmFja3VzYWdlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF90cmFja191c2FnZSh0cmFja3VzYWdlKTsKKyAgICB9CisKKyAgICAvLyBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvVHJhY2tTYW1wbGVSYXRlW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLnNhbXBsZXJhdGUiOworICAgIC8vIG9wdGlvbmFsIGludDMyIHNhbXBsZXJhdGU7CisgICAgaW50MzJfdCBzYW1wbGVyYXRlID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suc2FtcGxlcmF0ZSIsICZzYW1wbGVyYXRlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9zYW1wbGVfcmF0ZShzYW1wbGVyYXRlKTsKKyAgICB9CisKKyAgICAvLyBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvVHJhY2tDaGFubmVsTWFza1tdID0gImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay5jaGFubmVsbWFzayI7CisgICAgLy8gb3B0aW9uYWwgaW50NjQgY2hhbm5lbE1hc2s7CisgICAgaW50NjRfdCBjaGFubmVsTWFzayA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLmNoYW5uZWxtYXNrIiwgJmNoYW5uZWxNYXNrKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9jaGFubmVsX21hc2soY2hhbm5lbE1hc2spOworICAgIH0KKworICAgIC8vIE5COiBUaGVzZSBhcmUgbm90IHlldCBleHBvc2VkIGFzIHB1YmxpYyBKYXZhIEFQSSBjb25zdGFudHMuCisgICAgLy8gc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1RyYWNrVW5kZXJydW5GcmFtZXNbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2sudW5kZXJydW5mcmFtZXMiOworICAgIC8vIG9wdGlvbmFsIGludDMyIHVuZGVycnVuZnJhbWVzOworICAgIGludDMyX3QgdW5kZXJydW5mcmFtZXMgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay51bmRlcnJ1bmZyYW1lcyIsICZ1bmRlcnJ1bmZyYW1lcykpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfdW5kZXJydW5fZnJhbWVzKHVuZGVycnVuZnJhbWVzKTsKKyAgICB9CisKKyAgICAvLyBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvVHJhY2tTdGFydHVwR2xpdGNoW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLmdsaXRjaC5zdGFydHVwIjsKKyAgICAvLyBvcHRpb25hbCBpbnQzMiBzdGFydHVwZ2xpdGNoOworICAgIGludDMyX3Qgc3RhcnR1cGdsaXRjaCA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLmdsaXRjaC5zdGFydHVwIiwgJnN0YXJ0dXBnbGl0Y2gpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3N0YXJ0dXBfZ2xpdGNoKHN0YXJ0dXBnbGl0Y2gpOworICAgIH0KKworICAgIC8vIHBvcnRJZCAoaW50MzIpCisgICAgaW50MzJfdCBwb3J0X2lkID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2sucG9ydElkIiwgJnBvcnRfaWQpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3BvcnRfaWQocG9ydF9pZCk7CisgICAgfQorICAgIC8vIGVuY29kaW5nIChzdHJpbmcpCisgICAgY2hhciAqZW5jb2RpbmcgPSBOVUxMOworICAgIGlmIChpdGVtLT5nZXRDU3RyaW5nKCJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suZW5jb2RpbmciLCAmZW5jb2RpbmcpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2VuY29kaW5nKGVuY29kaW5nKTsKKyAgICB9CisgICAgLy8gZnJhbWVDb3VudCAoaW50MzIpCisgICAgaW50MzJfdCBmcmFtZV9jb3VudCA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLmZyYW1lQ291bnQiLCAmZnJhbWVfY291bnQpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2ZyYW1lX2NvdW50KGZyYW1lX2NvdW50KTsKKyAgICB9CisgICAgLy8gYXR0cmlidXRlcyAoc3RyaW5nKQorICAgIGNoYXIgKmF0dHJpYnV0ZXMgPSBOVUxMOworICAgIGlmIChpdGVtLT5nZXRDU3RyaW5nKCJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suYXR0cmlidXRlcyIsICZhdHRyaWJ1dGVzKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9hdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQ7CisgICAgaWYgKCFtZXRyaWNzX3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNlcmlhbGl6ZSBhdWRpb3RyYWNrIG1ldHJpY3MiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChlbmFibGVkX3N0YXRzZCkgeworICAgICAgICBhbmRyb2lkOjp1dGlsOjpCeXRlc0ZpZWxkIGJmX3NlcmlhbGl6ZWQoIHNlcmlhbGl6ZWQuY19zdHIoKSwgc2VyaWFsaXplZC5zaXplKCkpOworICAgICAgICAodm9pZClhbmRyb2lkOjp1dGlsOjpzdGF0c193cml0ZShhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfQVVESU9UUkFDS19SRVBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLCBwa2dOYW1lLmNfc3RyKCksIHBrZ1ZlcnNpb25Db2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUFwZXhWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZl9zZXJpYWxpemVkKTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJOT1Qgc2VuZGluZzogcHJpdmF0ZSBkYXRhIChsZW49JXp1KSIsIHN0cmxlbihzZXJpYWxpemVkLmNfc3RyKCkpKTsKKyAgICB9CisKKyAgICAvLyBtdXN0IGZyZWUgdGhlIHN0cmluZ3MgdGhhdCB3ZSB3ZXJlIGdpdmVuCisgICAgZnJlZShzdHJlYW10eXBlKTsKKyAgICBmcmVlKGNvbnRlbnR0eXBlKTsKKyAgICBmcmVlKHRyYWNrdXNhZ2UpOworICAgIGZyZWUoZW5jb2RpbmcpOworICAgIGZyZWUoYXR0cmlidXRlcyk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL3N0YXRzZF9jb2RlYy5jcHAgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9zdGF0c2RfY29kZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjOGU0ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9zdGF0c2RfY29kZWMuY3BwCkBAIC0wLDAgKzEsMTg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJzdGF0c2RfY29kZWMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxzdGF0c2xvZy5oPgorCisjaW5jbHVkZSAiTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmgiCisjaW5jbHVkZSAiZnJhbWV3b3Jrcy9iYXNlL2NvcmUvcHJvdG8vYW5kcm9pZC9zdGF0cy9tZWRpYW1ldHJpY3MvbWVkaWFtZXRyaWNzLnBiLmgiCisjaW5jbHVkZSAiaWZhY2Vfc3RhdHNkLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworYm9vbCBzdGF0c2RfY29kZWMoTWVkaWFBbmFseXRpY3NJdGVtICppdGVtKQoreworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybiBmYWxzZTsKKworICAgIC8vIHRoZXNlIGdvIGludG8gdGhlIHN0YXRzZCB3cmFwcGVyCisgICAgbnNlY3NfdCB0aW1lc3RhbXAgPSBpdGVtLT5nZXRUaW1lc3RhbXAoKTsKKyAgICBzdGQ6OnN0cmluZyBwa2dOYW1lID0gaXRlbS0+Z2V0UGtnTmFtZSgpOworICAgIGludDY0X3QgcGtnVmVyc2lvbkNvZGUgPSBpdGVtLT5nZXRQa2dWZXJzaW9uQ29kZSgpOworICAgIGludDY0X3QgbWVkaWFBcGV4VmVyc2lvbiA9IDA7CisKKworICAgIC8vIHRoZSByZXN0IGludG8gb3VyIG93biBwcm90bworICAgIC8vCisgICAgOjphbmRyb2lkOjpzdGF0czo6bWVkaWFtZXRyaWNzOjpDb2RlY0RhdGEgbWV0cmljc19wcm90bzsKKworICAgIC8vIGZsZXNoIG91dCB0aGUgcHJvdG9idWYgd2UnbGwgaGFuZCBvZmYgd2l0aCBvdXIgZGF0YQorICAgIC8vCisgICAgLy8gYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmNvZGVjICAgc3RyaW5nCisgICAgY2hhciAqY29kZWMgPSBOVUxMOworICAgIGlmIChpdGVtLT5nZXRDU3RyaW5nKCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuY29kZWMiLCAmY29kZWMpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2NvZGVjKGNvZGVjKTsKKyAgICB9CisgICAgLy8gYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLm1pbWUgICAgc3RyaW5nCisgICAgY2hhciAqbWltZSA9IE5VTEw7CisgICAgaWYgKGl0ZW0tPmdldENTdHJpbmcoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5taW1lIiwgJm1pbWUpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X21pbWUobWltZSk7CisgICAgfQorICAgIC8vIGFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5tb2RlICAgIHN0cmluZworICAgIGNoYXIgKm1vZGUgPSBOVUxMOworICAgIGlmICggaXRlbS0+Z2V0Q1N0cmluZygiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLm1vZGUiLCAmbW9kZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfbW9kZShtb2RlKTsKKyAgICB9CisgICAgLy8gYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmVuY29kZXIgaW50MzIKKyAgICBpbnQzMl90IGVuY29kZXIgPSAtMTsKKyAgICBpZiAoIGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuZW5jb2RlciIsICZlbmNvZGVyKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9lbmNvZGVyKGVuY29kZXIpOworICAgIH0KKyAgICAvLyBhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuc2VjdXJlICBpbnQzMgorICAgIGludDMyX3Qgc2VjdXJlID0gLTE7CisgICAgaWYgKCBpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnNlY3VyZSIsICZzZWN1cmUpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3NlY3VyZShzZWN1cmUpOworICAgIH0KKyAgICAvLyBhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMud2lkdGggICBpbnQzMgorICAgIGludDMyX3Qgd2lkdGggPSAtMTsKKyAgICBpZiAoIGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMud2lkdGgiLCAmd2lkdGgpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3dpZHRoKHdpZHRoKTsKKyAgICB9CisgICAgLy8gYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmhlaWdodCAgaW50MzIKKyAgICBpbnQzMl90IGhlaWdodCA9IC0xOworICAgIGlmICggaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5oZWlnaHQiLCAmaGVpZ2h0KSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9oZWlnaHQoaGVpZ2h0KTsKKyAgICB9CisgICAgLy8gYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnJvdGF0aW9uLWRlZ3JlZXMgICAgICAgIGludDMyCisgICAgaW50MzJfdCByb3RhdGlvbiA9IC0xOworICAgIGlmICggaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5yb3RhdGlvbi1kZWdyZWVzIiwgJnJvdGF0aW9uKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9yb3RhdGlvbihyb3RhdGlvbik7CisgICAgfQorICAgIC8vIGFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5jcnlwdG8gIGludDMyIChhbHRob3VnaCBtaXNzaW5nIGlmIG5vdCBuZWVkZWQKKyAgICBpbnQzMl90IGNyeXB0byA9IC0xOworICAgIGlmICggaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5jcnlwdG8iLCAmY3J5cHRvKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9jcnlwdG8oY3J5cHRvKTsKKyAgICB9CisgICAgLy8gYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnByb2ZpbGUgaW50MzIKKyAgICBpbnQzMl90IHByb2ZpbGUgPSAtMTsKKyAgICBpZiAoIGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMucHJvZmlsZSIsICZwcm9maWxlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9wcm9maWxlKHByb2ZpbGUpOworICAgIH0KKyAgICAvLyBhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMubGV2ZWwgICBpbnQzMgorICAgIGludDMyX3QgbGV2ZWwgPSAtMTsKKyAgICBpZiAoIGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMubGV2ZWwiLCAmbGV2ZWwpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2xldmVsKGxldmVsKTsKKyAgICB9CisgICAgLy8gYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLm1heHdpZHRoICAgICAgICBpbnQzMgorICAgIGludDMyX3QgbWF4d2lkdGggPSAtMTsKKyAgICBpZiAoIGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMubWF4d2lkdGgiLCAmbWF4d2lkdGgpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X21heF93aWR0aChtYXh3aWR0aCk7CisgICAgfQorICAgIC8vIGFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5tYXhoZWlnaHQgICAgICAgaW50MzIKKyAgICBpbnQzMl90IG1heGhlaWdodCA9IC0xOworICAgIGlmICggaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5tYXhoZWlnaHQiLCAmbWF4aGVpZ2h0KSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9tYXhfaGVpZ2h0KG1heGhlaWdodCk7CisgICAgfQorICAgIC8vIGFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5lcnJjb2RlICAgICAgICAgaW50MzIKKyAgICBpbnQzMl90IGVycmNvZGUgPSAtMTsKKyAgICBpZiAoIGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuZXJyY29kZSIsICZlcnJjb2RlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9lcnJvcl9jb2RlKGVycmNvZGUpOworICAgIH0KKyAgICAvLyBhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuZXJyc3RhdGUgICAgICAgIHN0cmluZworICAgIGNoYXIgKmVycnN0YXRlID0gTlVMTDsKKyAgICBpZiAoIGl0ZW0tPmdldENTdHJpbmcoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5lcnJzdGF0ZSIsICZlcnJzdGF0ZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfZXJyb3Jfc3RhdGUoZXJyc3RhdGUpOworICAgIH0KKyAgICAvLyBhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMubGF0ZW5jeS5tYXggIGludDY0CisgICAgaW50NjRfdCBsYXRlbmN5X21heCA9IC0xOworICAgIGlmICggaXRlbS0+Z2V0SW50NjQoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5sYXRlbmN5Lm1heCIsICZsYXRlbmN5X21heCkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfbGF0ZW5jeV9tYXgobGF0ZW5jeV9tYXgpOworICAgIH0KKyAgICAvLyBhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMubGF0ZW5jeS5taW4gIGludDY0CisgICAgaW50NjRfdCBsYXRlbmN5X21pbiA9IC0xOworICAgIGlmICggaXRlbS0+Z2V0SW50NjQoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5sYXRlbmN5Lm1pbiIsICZsYXRlbmN5X21pbikpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfbGF0ZW5jeV9taW4obGF0ZW5jeV9taW4pOworICAgIH0KKyAgICAvLyBhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMubGF0ZW5jeS5hdmcgIGludDY0CisgICAgaW50NjRfdCBsYXRlbmN5X2F2ZyA9IC0xOworICAgIGlmICggaXRlbS0+Z2V0SW50NjQoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5sYXRlbmN5LmF2ZyIsICZsYXRlbmN5X2F2ZykpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfbGF0ZW5jeV9hdmcobGF0ZW5jeV9hdmcpOworICAgIH0KKyAgICAvLyBhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMubGF0ZW5jeS5uICAgIGludDY0CisgICAgaW50NjRfdCBsYXRlbmN5X2NvdW50ID0gLTE7CisgICAgaWYgKCBpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmxhdGVuY3kubiIsICZsYXRlbmN5X2NvdW50KSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9sYXRlbmN5X2NvdW50KGxhdGVuY3lfY291bnQpOworICAgIH0KKyAgICAvLyBhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMubGF0ZW5jeS51bmtub3duICAgIGludDY0CisgICAgaW50NjRfdCBsYXRlbmN5X3Vua25vd24gPSAtMTsKKyAgICBpZiAoIGl0ZW0tPmdldEludDY0KCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMubGF0ZW5jeS51bmtub3duIiwgJmxhdGVuY3lfdW5rbm93bikpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfbGF0ZW5jeV91bmtub3duKGxhdGVuY3lfdW5rbm93bik7CisgICAgfQorICAgIC8vIGFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5sYXRlbmN5Lmhpc3QgICAgTk9UIEVNSVRURUQKKworICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQ7CisgICAgaWYgKCFtZXRyaWNzX3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNlcmlhbGl6ZSBjb2RlYyBtZXRyaWNzIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoZW5hYmxlZF9zdGF0c2QpIHsKKyAgICAgICAgYW5kcm9pZDo6dXRpbDo6Qnl0ZXNGaWVsZCBiZl9zZXJpYWxpemVkKCBzZXJpYWxpemVkLmNfc3RyKCksIHNlcmlhbGl6ZWQuc2l6ZSgpKTsKKyAgICAgICAgKHZvaWQpYW5kcm9pZDo6dXRpbDo6c3RhdHNfd3JpdGUoYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX0NPREVDX1JFUE9SVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAsIHBrZ05hbWUuY19zdHIoKSwgcGtnVmVyc2lvbkNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhQXBleFZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmX3NlcmlhbGl6ZWQpOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIk5PVCBzZW5kaW5nOiBwcml2YXRlIGRhdGEgKGxlbj0lenUpIiwgc3RybGVuKHNlcmlhbGl6ZWQuY19zdHIoKSkpOworICAgIH0KKworICAgIC8vIG11c3QgZnJlZSB0aGUgc3RyaW5ncyB0aGF0IHdlIHdlcmUgZ2l2ZW4KKyAgICBmcmVlKGNvZGVjKTsKKyAgICBmcmVlKG1pbWUpOworICAgIGZyZWUobW9kZSk7CisgICAgZnJlZShlcnJzdGF0ZSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL3N0YXRzZF9kcm0uY3BwIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3Mvc3RhdHNkX2RybS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAyNDgzYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL3N0YXRzZF9kcm0uY3BwCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJzdGF0c2RfZHJtIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8cHdkLmg+CisKKyNpbmNsdWRlICJNZWRpYUFuYWx5dGljc1NlcnZpY2UuaCIKKyNpbmNsdWRlICJpZmFjZV9zdGF0c2QuaCIKKworI2luY2x1ZGUgPHN0YXRzbG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gbWVkaWFkcm0KK2Jvb2wgc3RhdHNkX21lZGlhZHJtKE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSkKK3sKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgICBuc2Vjc190IHRpbWVzdGFtcCA9IGl0ZW0tPmdldFRpbWVzdGFtcCgpOworICAgIHN0ZDo6c3RyaW5nIHBrZ05hbWUgPSBpdGVtLT5nZXRQa2dOYW1lKCk7CisgICAgaW50NjRfdCBwa2dWZXJzaW9uQ29kZSA9IGl0ZW0tPmdldFBrZ1ZlcnNpb25Db2RlKCk7CisgICAgaW50NjRfdCBtZWRpYUFwZXhWZXJzaW9uID0gMDsKKworICAgIGNoYXIgKnZlbmRvciA9IE5VTEw7CisgICAgKHZvaWQpIGl0ZW0tPmdldENTdHJpbmcoInZlbmRvciIsICZ2ZW5kb3IpOworICAgIGNoYXIgKmRlc2NyaXB0aW9uID0gTlVMTDsKKyAgICAodm9pZCkgaXRlbS0+Z2V0Q1N0cmluZygiZGVzY3JpcHRpb24iLCAmZGVzY3JpcHRpb24pOworICAgIGNoYXIgKnNlcmlhbGl6ZWRfbWV0cmljcyA9IE5VTEw7CisgICAgKHZvaWQpIGl0ZW0tPmdldENTdHJpbmcoInNlcmlhbGl6ZWRfbWV0cmljcyIsICZzZXJpYWxpemVkX21ldHJpY3MpOworCisgICAgaWYgKGVuYWJsZWRfc3RhdHNkKSB7CisgICAgICAgIGFuZHJvaWQ6OnV0aWw6OkJ5dGVzRmllbGQgYmZfc2VyaWFsaXplZChzZXJpYWxpemVkX21ldHJpY3MgPyBzZXJpYWxpemVkX21ldHJpY3MgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZF9tZXRyaWNzID8gc3RybGVuKHNlcmlhbGl6ZWRfbWV0cmljcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDApOworICAgICAgICBhbmRyb2lkOjp1dGlsOjpzdGF0c193cml0ZShhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfTUVESUFEUk1fUkVQT1JURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCwgcGtnTmFtZS5jX3N0cigpLCBwa2dWZXJzaW9uQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFBcGV4VmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yLCBkZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZfc2VyaWFsaXplZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIk5PVCBzZW5kaW5nOiBtZWRpYWRybSBwcml2YXRlIGRhdGEgKGxlbj0lenUpIiwKKyAgICAgICAgICAgICAgc2VyaWFsaXplZF9tZXRyaWNzID8gc3RybGVuKHNlcmlhbGl6ZWRfbWV0cmljcykgOiAwKTsKKyAgICB9CisKKyAgICBmcmVlKHZlbmRvcik7CisgICAgZnJlZShkZXNjcmlwdGlvbik7CisgICAgZnJlZShzZXJpYWxpemVkX21ldHJpY3MpOworICAgIHJldHVybiB0cnVlOworfQorCisvLyB3aWRldmluZUNETQorYm9vbCBzdGF0c2Rfd2lkZXZpbmVDRE0oTWVkaWFBbmFseXRpY3NJdGVtICppdGVtKQoreworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybiBmYWxzZTsKKworICAgIG5zZWNzX3QgdGltZXN0YW1wID0gaXRlbS0+Z2V0VGltZXN0YW1wKCk7CisgICAgc3RkOjpzdHJpbmcgcGtnTmFtZSA9IGl0ZW0tPmdldFBrZ05hbWUoKTsKKyAgICBpbnQ2NF90IHBrZ1ZlcnNpb25Db2RlID0gaXRlbS0+Z2V0UGtnVmVyc2lvbkNvZGUoKTsKKyAgICBpbnQ2NF90IG1lZGlhQXBleFZlcnNpb24gPSAwOworCisgICAgY2hhciAqc2VyaWFsaXplZF9tZXRyaWNzID0gTlVMTDsKKyAgICAodm9pZCkgaXRlbS0+Z2V0Q1N0cmluZygic2VyaWFsaXplZF9tZXRyaWNzIiwgJnNlcmlhbGl6ZWRfbWV0cmljcyk7CisKKyAgICBpZiAoZW5hYmxlZF9zdGF0c2QpIHsKKyAgICAgICAgYW5kcm9pZDo6dXRpbDo6Qnl0ZXNGaWVsZCBiZl9zZXJpYWxpemVkKHNlcmlhbGl6ZWRfbWV0cmljcyA/IHNlcmlhbGl6ZWRfbWV0cmljcyA6IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkX21ldHJpY3MgPyBzdHJsZW4oc2VyaWFsaXplZF9tZXRyaWNzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMCk7CisgICAgICAgIGFuZHJvaWQ6OnV0aWw6OnN0YXRzX3dyaXRlKGFuZHJvaWQ6OnV0aWw6Ok1FRElBTUVUUklDU19EUk1fV0lERVZJTkVfUkVQT1JURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCwgcGtnTmFtZS5jX3N0cigpLCBwa2dWZXJzaW9uQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFBcGV4VmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZfc2VyaWFsaXplZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIk5PVCBzZW5kaW5nOiB3aWRldmluZSBwcml2YXRlIGRhdGEgKGxlbj0lenUpIiwKKyAgICAgICAgICAgICAgc2VyaWFsaXplZF9tZXRyaWNzID8gc3RybGVuKHNlcmlhbGl6ZWRfbWV0cmljcykgOiAwKTsKKyAgICB9CisKKyAgICBmcmVlKHNlcmlhbGl6ZWRfbWV0cmljcyk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL3N0YXRzZF9leHRyYWN0b3IuY3BwIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3Mvc3RhdHNkX2V4dHJhY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk1YzkxMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL3N0YXRzZF9leHRyYWN0b3IuY3BwCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgInN0YXRzZF9leHRyYWN0b3IiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxzdGF0c2xvZy5oPgorCisjaW5jbHVkZSAiTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmgiCisjaW5jbHVkZSAiZnJhbWV3b3Jrcy9iYXNlL2NvcmUvcHJvdG8vYW5kcm9pZC9zdGF0cy9tZWRpYW1ldHJpY3MvbWVkaWFtZXRyaWNzLnBiLmgiCisjaW5jbHVkZSAiaWZhY2Vfc3RhdHNkLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworYm9vbCBzdGF0c2RfZXh0cmFjdG9yKE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSkKK3sKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgICAvLyB0aGVzZSBnbyBpbnRvIHRoZSBzdGF0c2Qgd3JhcHBlcgorICAgIG5zZWNzX3QgdGltZXN0YW1wID0gaXRlbS0+Z2V0VGltZXN0YW1wKCk7CisgICAgc3RkOjpzdHJpbmcgcGtnTmFtZSA9IGl0ZW0tPmdldFBrZ05hbWUoKTsKKyAgICBpbnQ2NF90IHBrZ1ZlcnNpb25Db2RlID0gaXRlbS0+Z2V0UGtnVmVyc2lvbkNvZGUoKTsKKyAgICBpbnQ2NF90IG1lZGlhQXBleFZlcnNpb24gPSAwOworCisKKyAgICAvLyB0aGUgcmVzdCBpbnRvIG91ciBvd24gcHJvdG8KKyAgICAvLworICAgIDo6YW5kcm9pZDo6c3RhdHM6Om1lZGlhbWV0cmljczo6RXh0cmFjdG9yRGF0YSBtZXRyaWNzX3Byb3RvOworCisgICAgLy8gZmxlc2ggb3V0IHRoZSBwcm90b2J1ZiB3ZSdsbCBoYW5kIG9mZiB3aXRoIG91ciBkYXRhCisgICAgLy8KKworICAgIC8vIGFuZHJvaWQubWVkaWEubWVkaWFleHRyYWN0b3IuZm10ICAgICAgICAgc3RyaW5nCisgICAgY2hhciAqZm10ID0gTlVMTDsKKyAgICBpZiAoaXRlbS0+Z2V0Q1N0cmluZygiYW5kcm9pZC5tZWRpYS5tZWRpYWV4dHJhY3Rvci5mbXQiLCAmZm10KSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9mb3JtYXQoZm10KTsKKyAgICB9CisgICAgLy8gYW5kcm9pZC5tZWRpYS5tZWRpYWV4dHJhY3Rvci5taW1lICAgICAgICBzdHJpbmcKKyAgICBjaGFyICptaW1lID0gTlVMTDsKKyAgICBpZiAoaXRlbS0+Z2V0Q1N0cmluZygiYW5kcm9pZC5tZWRpYS5tZWRpYWV4dHJhY3Rvci5taW1lIiwgJm1pbWUpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X21pbWUobWltZSk7CisgICAgfQorICAgIC8vIGFuZHJvaWQubWVkaWEubWVkaWFleHRyYWN0b3IubnRyayAgICAgICAgaW50MzIKKyAgICBpbnQzMl90IG50cmsgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFleHRyYWN0b3IubnRyayIsICZudHJrKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF90cmFja3MobnRyayk7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZDsKKyAgICBpZiAoIW1ldHJpY3NfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbGl6ZWQpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2VyaWFsaXplIGV4dHJhY3RvciBtZXRyaWNzIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoZW5hYmxlZF9zdGF0c2QpIHsKKyAgICAgICAgYW5kcm9pZDo6dXRpbDo6Qnl0ZXNGaWVsZCBiZl9zZXJpYWxpemVkKCBzZXJpYWxpemVkLmNfc3RyKCksIHNlcmlhbGl6ZWQuc2l6ZSgpKTsKKyAgICAgICAgKHZvaWQpYW5kcm9pZDo6dXRpbDo6c3RhdHNfd3JpdGUoYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX0VYVFJBQ1RPUl9SRVBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLCBwa2dOYW1lLmNfc3RyKCksIHBrZ1ZlcnNpb25Db2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUFwZXhWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZl9zZXJpYWxpemVkKTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJOT1Qgc2VuZGluZzogcHJpdmF0ZSBkYXRhIChsZW49JXp1KSIsIHN0cmxlbihzZXJpYWxpemVkLmNfc3RyKCkpKTsKKyAgICB9CisKKyAgICAvLyBtdXN0IGZyZWUgdGhlIHN0cmluZ3MgdGhhdCB3ZSB3ZXJlIGdpdmVuCisgICAgZnJlZShmbXQpOworICAgIGZyZWUobWltZSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL3N0YXRzZF9udXBsYXllci5jcHAgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9zdGF0c2RfbnVwbGF5ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYzExOGEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9zdGF0c2RfbnVwbGF5ZXIuY3BwCkBAIC0wLDAgKzEsMTc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJzdGF0c2RfbnVwbGF5ZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxzdGF0c2xvZy5oPgorCisjaW5jbHVkZSAiTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmgiCisjaW5jbHVkZSAiZnJhbWV3b3Jrcy9iYXNlL2NvcmUvcHJvdG8vYW5kcm9pZC9zdGF0cy9tZWRpYW1ldHJpY3MvbWVkaWFtZXRyaWNzLnBiLmgiCisjaW5jbHVkZSAiaWZhY2Vfc3RhdHNkLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoKKyAqICBoYW5kbGVzIG51cGxheWVyIEFORCBudXBsYXllcjIKKyAqICBjaGVja3MgZm9yIHRoZSB1bmlvbiBvZiB3aGF0IHRoZSB0d28gcGxheWVycyBnZW5lcmF0ZQorICovCitib29sIHN0YXRzZF9udXBsYXllcihNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0pCit7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgICAgLy8gdGhlc2UgZ28gaW50byB0aGUgc3RhdHNkIHdyYXBwZXIKKyAgICBuc2Vjc190IHRpbWVzdGFtcCA9IGl0ZW0tPmdldFRpbWVzdGFtcCgpOworICAgIHN0ZDo6c3RyaW5nIHBrZ05hbWUgPSBpdGVtLT5nZXRQa2dOYW1lKCk7CisgICAgaW50NjRfdCBwa2dWZXJzaW9uQ29kZSA9IGl0ZW0tPmdldFBrZ1ZlcnNpb25Db2RlKCk7CisgICAgaW50NjRfdCBtZWRpYUFwZXhWZXJzaW9uID0gMDsKKworCisgICAgLy8gdGhlIHJlc3QgaW50byBvdXIgb3duIHByb3RvCisgICAgLy8KKyAgICA6OmFuZHJvaWQ6OnN0YXRzOjptZWRpYW1ldHJpY3M6Ok51UGxheWVyRGF0YSBtZXRyaWNzX3Byb3RvOworCisgICAgLy8gZmxlc2ggb3V0IHRoZSBwcm90b2J1ZiB3ZSdsbCBoYW5kIG9mZiB3aXRoIG91ciBkYXRhCisgICAgLy8KKworICAgIC8vIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBudXBsYXllciBhbmQgbnVwbGF5ZXIyCisgICAgbWV0cmljc19wcm90by5zZXRfd2hpY2hwbGF5ZXIoaXRlbS0+Z2V0S2V5KCkuY19zdHIoKSk7CisKKyAgICBjaGFyICp2aWRlb19taW1lID0gTlVMTDsKKyAgICBpZiAoaXRlbS0+Z2V0Q1N0cmluZygiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci52aWRlby5taW1lIiwgJnZpZGVvX21pbWUpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3ZpZGVvX21pbWUodmlkZW9fbWltZSk7CisgICAgfQorICAgIGNoYXIgKnZpZGVvX2NvZGVjID0gTlVMTDsKKyAgICBpZiAoaXRlbS0+Z2V0Q1N0cmluZygiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci52aWRlby5jb2RlYyIsICZ2aWRlb19jb2RlYykpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfdmlkZW9fY29kZWModmlkZW9fY29kZWMpOworICAgIH0KKworICAgIGludDMyX3Qgd2lkdGggPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIud2lkdGgiLCAmd2lkdGgpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3dpZHRoKHdpZHRoKTsKKyAgICB9CisgICAgaW50MzJfdCBoZWlnaHQgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuaGVpZ2h0IiwgJmhlaWdodCkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfaGVpZ2h0KGhlaWdodCk7CisgICAgfQorCisgICAgaW50NjRfdCBmcmFtZXMgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50NjQoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZnJhbWVzIiwgJmZyYW1lcykpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfZnJhbWVzKGZyYW1lcyk7CisgICAgfQorICAgIGludDY0X3QgZnJhbWVzX2Ryb3BwZWQgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50NjQoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZHJvcHBlZCIsICZmcmFtZXNfZHJvcHBlZCkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfZnJhbWVzX2Ryb3BwZWQoZnJhbWVzX2Ryb3BwZWQpOworICAgIH0KKyAgICBpbnQ2NF90IGZyYW1lc19kcm9wcGVkX3N0YXJ0dXAgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50NjQoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuc3RhcnR1cGRyb3BwZWQiLCAmZnJhbWVzX2Ryb3BwZWRfc3RhcnR1cCkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfZnJhbWVzX2Ryb3BwZWRfc3RhcnR1cChmcmFtZXNfZHJvcHBlZF9zdGFydHVwKTsKKyAgICB9CisgICAgZG91YmxlIGZwcyA9IC0xLjA7CisgICAgaWYgKGl0ZW0tPmdldERvdWJsZSgiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5mcHMiLCAmZnBzKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9mcmFtZXJhdGUoZnBzKTsKKyAgICB9CisKKyAgICBjaGFyICphdWRpb19taW1lID0gTlVMTDsKKyAgICBpZiAoaXRlbS0+Z2V0Q1N0cmluZygiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5hdWRpby5taW1lIiwgJmF1ZGlvX21pbWUpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2F1ZGlvX21pbWUoYXVkaW9fbWltZSk7CisgICAgfQorICAgIGNoYXIgKmF1ZGlvX2NvZGVjID0gTlVMTDsKKyAgICBpZiAoaXRlbS0+Z2V0Q1N0cmluZygiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5hdWRpby5jb2RlYyIsICZhdWRpb19jb2RlYykpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfYXVkaW9fY29kZWMoYXVkaW9fY29kZWMpOworICAgIH0KKworICAgIGludDY0X3QgZHVyYXRpb25fbXMgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50NjQoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZHVyYXRpb25NcyIsICZkdXJhdGlvbl9tcykpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfZHVyYXRpb25fbWlsbGlzKGR1cmF0aW9uX21zKTsKKyAgICB9CisgICAgaW50NjRfdCBwbGF5aW5nX21zID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDY0KCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnBsYXlpbmdNcyIsICZwbGF5aW5nX21zKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9wbGF5aW5nX21pbGxpcyhwbGF5aW5nX21zKTsKKyAgICB9CisKKyAgICBpbnQzMl90IGVyciA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5lcnIiLCAmZXJyKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9lcnJvcihlcnIpOworICAgIH0KKyAgICBpbnQzMl90IGVycm9yX2NvZGUgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZXJyY29kZSIsICZlcnJvcl9jb2RlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9lcnJvcl9jb2RlKGVycm9yX2NvZGUpOworICAgIH0KKyAgICBjaGFyICplcnJvcl9zdGF0ZSA9IE5VTEw7CisgICAgaWYgKGl0ZW0tPmdldENTdHJpbmcoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZXJyc3RhdGUiLCAmZXJyb3Jfc3RhdGUpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2Vycm9yX3N0YXRlKGVycm9yX3N0YXRlKTsKKyAgICB9CisKKyAgICBjaGFyICpkYXRhX3NvdXJjZV90eXBlID0gTlVMTDsKKyAgICBpZiAoaXRlbS0+Z2V0Q1N0cmluZygiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5kYXRhU291cmNlIiwgJmRhdGFfc291cmNlX3R5cGUpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2RhdGFfc291cmNlX3R5cGUoZGF0YV9zb3VyY2VfdHlwZSk7CisgICAgfQorCisgICAgaW50NjRfdCByZWJ1ZmZlcmluZ01zID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDY0KCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnJlYnVmZmVyaW5nTXMiLCAmcmVidWZmZXJpbmdNcykpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfcmVidWZmZXJpbmdfbWlsbGlzKHJlYnVmZmVyaW5nTXMpOworICAgIH0KKyAgICBpbnQzMl90IHJlYnVmZmVycyA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5yZWJ1ZmZlcnMiLCAmcmVidWZmZXJzKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9yZWJ1ZmZlcnMocmVidWZmZXJzKTsKKyAgICB9CisgICAgaW50MzJfdCByZWJ1ZmZlckV4aXQgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIucmVidWZmZXJFeGl0IiwgJnJlYnVmZmVyRXhpdCkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfcmVidWZmZXJfYXRfZXhpdChyZWJ1ZmZlckV4aXQpOworICAgIH0KKworCisgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZDsKKyAgICBpZiAoIW1ldHJpY3NfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbGl6ZWQpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2VyaWFsaXplIG51cGxheWVyIG1ldHJpY3MiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChlbmFibGVkX3N0YXRzZCkgeworICAgICAgICBhbmRyb2lkOjp1dGlsOjpCeXRlc0ZpZWxkIGJmX3NlcmlhbGl6ZWQoIHNlcmlhbGl6ZWQuY19zdHIoKSwgc2VyaWFsaXplZC5zaXplKCkpOworICAgICAgICAodm9pZClhbmRyb2lkOjp1dGlsOjpzdGF0c193cml0ZShhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfTlVQTEFZRVJfUkVQT1JURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCwgcGtnTmFtZS5jX3N0cigpLCBwa2dWZXJzaW9uQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFBcGV4VmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZfc2VyaWFsaXplZCk7CisKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiTk9UIHNlbmRpbmc6IHByaXZhdGUgZGF0YSAobGVuPSV6dSkiLCBzdHJsZW4oc2VyaWFsaXplZC5jX3N0cigpKSk7CisgICAgfQorCisgICAgLy8gbXVzdCBmcmVlIHRoZSBzdHJpbmdzIHRoYXQgd2Ugd2VyZSBnaXZlbgorICAgIGZyZWUodmlkZW9fbWltZSk7CisgICAgZnJlZSh2aWRlb19jb2RlYyk7CisgICAgZnJlZShhdWRpb19taW1lKTsKKyAgICBmcmVlKGF1ZGlvX2NvZGVjKTsKKyAgICBmcmVlKGVycm9yX3N0YXRlKTsKKyAgICBmcmVlKGRhdGFfc291cmNlX3R5cGUpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK307CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9zdGF0c2RfcmVjb3JkZXIuY3BwIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3Mvc3RhdHNkX3JlY29yZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDk4MWI0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3Mvc3RhdHNkX3JlY29yZGVyLmNwcApAQCAtMCwwICsxLDE5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAic3RhdHNkX3JlY29yZGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8c3RhdHNsb2cuaD4KKworI2luY2x1ZGUgIk1lZGlhQW5hbHl0aWNzU2VydmljZS5oIgorI2luY2x1ZGUgImZyYW1ld29ya3MvYmFzZS9jb3JlL3Byb3RvL2FuZHJvaWQvc3RhdHMvbWVkaWFtZXRyaWNzL21lZGlhbWV0cmljcy5wYi5oIgorI2luY2x1ZGUgImlmYWNlX3N0YXRzZC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2Jvb2wgc3RhdHNkX3JlY29yZGVyKE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSkKK3sKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgICAvLyB0aGVzZSBnbyBpbnRvIHRoZSBzdGF0c2Qgd3JhcHBlcgorICAgIG5zZWNzX3QgdGltZXN0YW1wID0gaXRlbS0+Z2V0VGltZXN0YW1wKCk7CisgICAgc3RkOjpzdHJpbmcgcGtnTmFtZSA9IGl0ZW0tPmdldFBrZ05hbWUoKTsKKyAgICBpbnQ2NF90IHBrZ1ZlcnNpb25Db2RlID0gaXRlbS0+Z2V0UGtnVmVyc2lvbkNvZGUoKTsKKyAgICBpbnQ2NF90IG1lZGlhQXBleFZlcnNpb24gPSAwOworCisKKyAgICAvLyB0aGUgcmVzdCBpbnRvIG91ciBvd24gcHJvdG8KKyAgICAvLworICAgIDo6YW5kcm9pZDo6c3RhdHM6Om1lZGlhbWV0cmljczo6UmVjb3JkZXJEYXRhIG1ldHJpY3NfcHJvdG87CisKKyAgICAvLyBmbGVzaCBvdXQgdGhlIHByb3RvYnVmIHdlJ2xsIGhhbmQgb2ZmIHdpdGggb3VyIGRhdGEKKyAgICAvLworCisgICAgLy8gc3RyaW5nIGtSZWNvcmRlckF1ZGlvTWltZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuYXVkaW8ubWltZSI7CisgICAgY2hhciAqYXVkaW9fbWltZSA9IE5VTEw7CisgICAgaWYgKGl0ZW0tPmdldENTdHJpbmcoImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5hdWRpby5taW1lIiwgJmF1ZGlvX21pbWUpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2F1ZGlvX21pbWUoYXVkaW9fbWltZSk7CisgICAgfQorICAgIC8vIHN0cmluZyBrUmVjb3JkZXJWaWRlb01pbWUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLnZpZGVvLm1pbWUiOworICAgIGNoYXIgKnZpZGVvX21pbWUgPSBOVUxMOworICAgIGlmIChpdGVtLT5nZXRDU3RyaW5nKCJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIudmlkZW8ubWltZSIsICZ2aWRlb19taW1lKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF92aWRlb19taW1lKHZpZGVvX21pbWUpOworICAgIH0KKyAgICAvLyBpbnQzMiBrUmVjb3JkZXJWaWRlb1Byb2ZpbGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLnZpZGVvLWVuY29kZXItcHJvZmlsZSI7CisgICAgaW50MzJfdCB2aWRlb1Byb2ZpbGUgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci52aWRlby1lbmNvZGVyLXByb2ZpbGUiLCAmdmlkZW9Qcm9maWxlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF92aWRlb19wcm9maWxlKHZpZGVvUHJvZmlsZSk7CisgICAgfQorICAgIC8vIGludDMyIGtSZWNvcmRlclZpZGVvTGV2ZWwgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLnZpZGVvLWVuY29kZXItbGV2ZWwiOworICAgIGludDMyX3QgdmlkZW9MZXZlbCA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLnZpZGVvLWVuY29kZXItbGV2ZWwiLCAmdmlkZW9MZXZlbCkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfdmlkZW9fbGV2ZWwodmlkZW9MZXZlbCk7CisgICAgfQorICAgIC8vIGludDMyIGtSZWNvcmRlcldpZHRoID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci53aWR0aCI7CisgICAgaW50MzJfdCB3aWR0aCA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLndpZHRoIiwgJndpZHRoKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF93aWR0aCh3aWR0aCk7CisgICAgfQorICAgIC8vIGludDMyIGtSZWNvcmRlckhlaWdodCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuaGVpZ2h0IjsKKyAgICBpbnQzMl90IGhlaWdodCA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmhlaWdodCIsICZoZWlnaHQpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2hlaWdodChoZWlnaHQpOworICAgIH0KKyAgICAvLyBpbnQzMiBrUmVjb3JkZXJSb3RhdGlvbiA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIucm90YXRpb24iOworICAgIGludDMyX3Qgcm90YXRpb24gPSAtMTsgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCB0byAwPworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLnJvdGF0aW9uIiwgJnJvdGF0aW9uKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9yb3RhdGlvbihyb3RhdGlvbik7CisgICAgfQorICAgIC8vIGludDMyIGtSZWNvcmRlckZyYW1lUmF0ZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuZnJhbWUtcmF0ZSI7CisgICAgaW50MzJfdCBmcmFtZXJhdGUgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5mcmFtZS1yYXRlIiwgJmZyYW1lcmF0ZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfZnJhbWVyYXRlKGZyYW1lcmF0ZSk7CisgICAgfQorCisgICAgLy8gaW50MzIga1JlY29yZGVyQ2FwdHVyZUZwcyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuY2FwdHVyZS1mcHMiOworICAgIGludDMyX3QgY2FwdHVyZUZwcyA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmNhcHR1cmUtZnBzIiwgJmNhcHR1cmVGcHMpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2NhcHR1cmVfZnBzKGNhcHR1cmVGcHMpOworICAgIH0KKyAgICAvLyBkb3VibGUga1JlY29yZGVyQ2FwdHVyZUZwc0VuYWJsZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuY2FwdHVyZS1mcHNlbmFibGUiOworICAgIGRvdWJsZSBjYXB0dXJlRnBzRW5hYmxlID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldERvdWJsZSgiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmNhcHR1cmUtZnBzZW5hYmxlIiwgJmNhcHR1cmVGcHNFbmFibGUpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2NhcHR1cmVfZnBzX2VuYWJsZShjYXB0dXJlRnBzRW5hYmxlKTsKKyAgICB9CisKKyAgICAvLyBpbnQ2NCBrUmVjb3JkZXJEdXJhdGlvbk1zID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5kdXJhdGlvbk1zIjsKKyAgICBpbnQ2NF90IGR1cmF0aW9uTXMgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50NjQoImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5kdXJhdGlvbk1zIiwgJmR1cmF0aW9uTXMpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2R1cmF0aW9uX21pbGxpcyhkdXJhdGlvbk1zKTsKKyAgICB9CisgICAgLy8gaW50NjQga1JlY29yZGVyUGF1c2VkID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5wYXVzZWRNcyI7CisgICAgaW50NjRfdCBwYXVzZWRNcyA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLnBhdXNlZE1zIiwgJnBhdXNlZE1zKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9wYXVzZWRfbWlsbGlzKHBhdXNlZE1zKTsKKyAgICB9CisgICAgLy8gaW50MzIga1JlY29yZGVyTnVtUGF1c2VzID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5OUGF1c2VzIjsKKyAgICBpbnQzMl90IHBhdXNlZENvdW50ID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuTlBhdXNlcyIsICZwYXVzZWRDb3VudCkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfcGF1c2VkX2NvdW50KHBhdXNlZENvdW50KTsKKyAgICB9CisKKyAgICAvLyBpbnQzMiBrUmVjb3JkZXJBdWRpb0JpdHJhdGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmF1ZGlvLWJpdHJhdGUiOworICAgIGludDMyX3QgYXVkaW9CaXRyYXRlID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuYXVkaW8tYml0cmF0ZSIsICZhdWRpb0JpdHJhdGUpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2F1ZGlvX2JpdHJhdGUoYXVkaW9CaXRyYXRlKTsKKyAgICB9CisgICAgLy8gaW50MzIga1JlY29yZGVyQXVkaW9DaGFubmVscyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuYXVkaW8tY2hhbm5lbHMiOworICAgIGludDMyX3QgYXVkaW9DaGFubmVscyA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmF1ZGlvLWNoYW5uZWxzIiwgJmF1ZGlvQ2hhbm5lbHMpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2F1ZGlvX2NoYW5uZWxzKGF1ZGlvQ2hhbm5lbHMpOworICAgIH0KKyAgICAvLyBpbnQzMiBrUmVjb3JkZXJBdWRpb1NhbXBsZVJhdGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmF1ZGlvLXNhbXBsZXJhdGUiOworICAgIGludDMyX3QgYXVkaW9TYW1wbGVSYXRlID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuYXVkaW8tc2FtcGxlcmF0ZSIsICZhdWRpb1NhbXBsZVJhdGUpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2F1ZGlvX3NhbXBsZXJhdGUoYXVkaW9TYW1wbGVSYXRlKTsKKyAgICB9CisKKyAgICAvLyBpbnQzMiBrUmVjb3JkZXJNb3ZpZVRpbWVzY2FsZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIubW92aWUtdGltZXNjYWxlIjsKKyAgICBpbnQzMl90IG1vdmllVGltZXNjYWxlID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIubW92aWUtdGltZXNjYWxlIiwgJm1vdmllVGltZXNjYWxlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9tb3ZpZV90aW1lc2NhbGUobW92aWVUaW1lc2NhbGUpOworICAgIH0KKyAgICAvLyBpbnQzMiBrUmVjb3JkZXJBdWRpb1RpbWVzY2FsZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuYXVkaW8tdGltZXNjYWxlIjsKKyAgICBpbnQzMl90IGF1ZGlvVGltZXNjYWxlID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuYXVkaW8tdGltZXNjYWxlIiwgJmF1ZGlvVGltZXNjYWxlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9hdWRpb190aW1lc2NhbGUoYXVkaW9UaW1lc2NhbGUpOworICAgIH0KKyAgICAvLyBpbnQzMiBrUmVjb3JkZXJWaWRlb1RpbWVzY2FsZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIudmlkZW8tdGltZXNjYWxlIjsKKyAgICBpbnQzMl90IHZpZGVvVGltZXNjYWxlID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIudmlkZW8tdGltZXNjYWxlIiwgJnZpZGVvVGltZXNjYWxlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF92aWRlb190aW1lc2NhbGUodmlkZW9UaW1lc2NhbGUpOworICAgIH0KKworICAgIC8vIGludDMyIGtSZWNvcmRlclZpZGVvQml0cmF0ZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIudmlkZW8tYml0cmF0ZSI7CisgICAgaW50MzJfdCB2aWRlb0JpdFJhdGUgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci52aWRlby1iaXRyYXRlIiwgJnZpZGVvQml0UmF0ZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfdmlkZW9fYml0cmF0ZSh2aWRlb0JpdFJhdGUpOworICAgIH0KKyAgICAvLyBpbnQzMiBrUmVjb3JkZXJWaWRlb0lmcmFtZUludGVydmFsID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci52aWRlby1pZnJhbWUtaW50ZXJ2YWwiOworICAgIGludDMyX3QgaUZyYW1lSW50ZXJ2YWwgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci52aWRlby1pZnJhbWUtaW50ZXJ2YWwiLCAmaUZyYW1lSW50ZXJ2YWwpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2lmcmFtZV9pbnRlcnZhbChpRnJhbWVJbnRlcnZhbCk7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZDsKKyAgICBpZiAoIW1ldHJpY3NfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbGl6ZWQpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2VyaWFsaXplIHJlY29yZGVyIG1ldHJpY3MiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChlbmFibGVkX3N0YXRzZCkgeworICAgICAgICBhbmRyb2lkOjp1dGlsOjpCeXRlc0ZpZWxkIGJmX3NlcmlhbGl6ZWQoIHNlcmlhbGl6ZWQuY19zdHIoKSwgc2VyaWFsaXplZC5zaXplKCkpOworICAgICAgICAodm9pZClhbmRyb2lkOjp1dGlsOjpzdGF0c193cml0ZShhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfUkVDT1JERVJfUkVQT1JURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCwgcGtnTmFtZS5jX3N0cigpLCBwa2dWZXJzaW9uQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFBcGV4VmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZfc2VyaWFsaXplZCk7CisKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiTk9UIHNlbmRpbmc6IHByaXZhdGUgZGF0YSAobGVuPSV6dSkiLCBzdHJsZW4oc2VyaWFsaXplZC5jX3N0cigpKSk7CisgICAgfQorCisgICAgLy8gbXVzdCBmcmVlIHRoZSBzdHJpbmdzIHRoYXQgd2Ugd2VyZSBnaXZlbgorICAgIGZyZWUoYXVkaW9fbWltZSk7CisgICAgZnJlZSh2aWRlb19taW1lKTsKKworICAgIHJldHVybiB0cnVlOworfQorCit9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyZDJmZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2NyBAQAorY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAibWVkaWFzd2NvZGVjIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAibWFpbl9zd2NvZGVjc2VydmljZS5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXZzZXJ2aWNlc19taW5pamFpbCIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAorICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhX2NvZGVjc2VydmljZXJlZ2lzdHJhbnQiLAorICAgIF0sCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgdmVuZG9yOiB7CisgICAgICAgICAgICBleGNsdWRlX3NoYXJlZF9saWJzOiBbImxpYmF2c2VydmljZXNfbWluaWphaWwiXSwKKyAgICAgICAgICAgIHNoYXJlZF9saWJzOiBbImxpYmF2c2VydmljZXNfbWluaWphaWxfdmVuZG9yIl0sCisgICAgICAgIH0sCisgICAgICAgIGFuZHJvaWQ6IHsKKyAgICAgICAgICAgIHByb2R1Y3RfdmFyaWFibGVzOiB7CisgICAgICAgICAgICAgICAgbWFsbG9jX25vdF9zdmVsdGU6IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2N1ZG8gaW5jcmVhc2VzIG1lbW9yeSBmb290cHJpbnQsIHNvIG9ubHkgZW5hYmxlIG9uCisgICAgICAgICAgICAgICAgICAgIC8vIG5vbi1zdmVsdGUgZGV2aWNlcy4KKyAgICAgICAgICAgICAgICAgICAgc2hhcmVkX2xpYnM6IFsibGliY19zY3VkbyJdLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgIH0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgXSwKKworICAgIGluaXRfcmM6IFsibWVkaWFzd2NvZGVjLnJjIl0sCisKKyAgICByZXF1aXJlZDogWyJtZWRpYXN3Y29kZWMucG9saWN5Il0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCisgICAgXSwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAibWVkaWFzd2NvZGVjLnBvbGljeSIsCisgICAgc3ViX2RpcjogInNlY2NvbXBfcG9saWN5IiwKKyAgICBhcmNoOiB7CisgICAgICAgIGFybTogeworICAgICAgICAgICAgc3JjOiAic2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLWFybS5wb2xpY3kiLAorICAgICAgICB9LAorICAgICAgICBhcm02NDogeworICAgICAgICAgICAgc3JjOiAic2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLWFybTY0LnBvbGljeSIsCisgICAgICAgIH0sCisgICAgICAgIHg4NjogeworICAgICAgICAgICAgc3JjOiAic2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy14ODYucG9saWN5IiwKKyAgICAgICAgfSwKKyAgICAgICAgeDg2XzY0OiB7CisgICAgICAgICAgICBzcmM6ICJzZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLXg4Ni5wb2xpY3kiLAorICAgICAgICB9LAorICAgIH0sCisgICAgcmVxdWlyZWQ6IFsiY3Jhc2hfZHVtcC5wb2xpY3kiXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5tayBiL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5tawppbmRleCA4NjMxYzM5Li5lY2Q0MzdiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLm1rCkBAIC0yMiwxOCArMjIsMTcgQEAKICAgICBsaWJzdGFnZWZyaWdodF9zb2Z0X3ZvcmJpc2RlYyBcCiAgICAgbGlic3RhZ2VmcmlnaHRfc29mdF92cHhkZWMgXAogICAgIGxpYnN0YWdlZnJpZ2h0X3NvZnRfdnB4ZW5jIFwKKyAgICBsaWJzdGFnZWZyaWdodF9zb2Z0b214X3BsdWdpbiBcCiAKICMgc2VydmljZSBleGVjdXRhYmxlCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKICMgc2VjY29tcCBpcyBub3QgcmVxdWlyZWQgZm9yIGNvdmVyYWdlIGJ1aWxkLgogaWZuZXEgKCQoTkFUSVZFX0NPVkVSQUdFKSx0cnVlKQotTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBjcmFzaF9kdW1wLnBvbGljeQogTE9DQUxfUkVRVUlSRURfTU9EVUxFU19hcm0gOj0gbWVkaWFjb2RlYy5wb2xpY3kKIExPQ0FMX1JFUVVJUkVEX01PRFVMRVNfeDg2IDo9IG1lZGlhY29kZWMucG9saWN5CiBlbmRpZgogTE9DQUxfU1JDX0ZJTEVTIDo9IG1haW5fY29kZWNzZXJ2aWNlLmNwcAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGlibWVkaWFfb214IFwKICAgICBsaWJiaW5kZXIgXAogICAgIGxpYnV0aWxzIFwKICAgICBsaWJsb2cgXApAQCAtNjQsMTIgKzYzLDE1IEBACiAKIGluY2x1ZGUgJChCVUlMRF9FWEVDVVRBQkxFKQogCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCiAjIHNlcnZpY2Ugc2VjY29tcCBwb2xpY3kKIGlmZXEgKCQoVEFSR0VUX0FSQ0gpLCAkKGZpbHRlciAkKFRBUkdFVF9BUkNIKSwgeDg2IHg4Nl82NCBhcm0gYXJtNjQpKQogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiBMT0NBTF9NT0RVTEUgOj0gbWVkaWFjb2RlYy5wb2xpY3kKIExPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKIExPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVCkvZXRjL3NlY2NvbXBfcG9saWN5CitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IGNyYXNoX2R1bXAucG9saWN5CiAjIG1lZGlhY29kZWMgcnVucyBpbiAzMi1iaXQgY29tYmF0aWJpbGl0eSBtb2RlLiBGb3IgNjQgYml0IGFyY2hpdGVjdHVyZXMsCiAjIHVzZSB0aGUgMzIgYml0IHBvbGljeQogaWZkZWYgVEFSR0VUXzJORF9BUkNICkBAIC04NCw0ICs4Niw3IEBACiBpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCiBlbmRpZgogCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKIGluY2x1ZGUgJChjYWxsIGFsbC1tYWtlZmlsZXMtdW5kZXIsICQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fY29kZWNzZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhY29kZWMvbWFpbl9jb2RlY3NlcnZpY2UuY3BwCmluZGV4IDUxNjE5ZjYuLmY2NjhjMzMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhY29kZWMvbWFpbl9jb2RlY3NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvbWFpbl9jb2RlY3NlcnZpY2UuY3BwCkBAIC0yNSw3ICsyNSw2IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXguaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9Db2RlY1NlcnZpY2VSZWdpc3RyYW50Lmg+CiAjaW5jbHVkZSA8ZGxmY24uaD4KIAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CkBAIC00OCwzNyArNDcsMjEgQEAKIAogICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2woNjQsIGZhbHNlKTsKIAotICAgIC8vIFJlZ2lzdHJhdGlvbiBvZiBjdXN0b21pemVkIGNvZGVjIHNlcnZpY2VzCi0gICAgdm9pZCAqcmVnaXN0cmFudExpYiA9IGRsb3BlbigKLSAgICAgICAgICAgICJsaWJtZWRpYV9jb2RlY3NlcnZpY2VyZWdpc3RyYW50LnNvIiwKLSAgICAgICAgICAgIFJUTERfTk9XIHwgUlRMRF9MT0NBTCk7Ci0gICAgaWYgKHJlZ2lzdHJhbnRMaWIpIHsKLSAgICAgICAgUmVnaXN0ZXJDb2RlY1NlcnZpY2VzRnVuYyByZWdpc3RlckNvZGVjU2VydmljZXMgPQotICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UmVnaXN0ZXJDb2RlY1NlcnZpY2VzRnVuYz4oCi0gICAgICAgICAgICAgICAgZGxzeW0ocmVnaXN0cmFudExpYiwgIlJlZ2lzdGVyQ29kZWNTZXJ2aWNlcyIpKTsKLSAgICAgICAgaWYgKHJlZ2lzdGVyQ29kZWNTZXJ2aWNlcykgewotICAgICAgICAgICAgcmVnaXN0ZXJDb2RlY1NlcnZpY2VzKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkNhbm5vdCByZWdpc3RlciBhZGRpdGlvbmFsIHNlcnZpY2VzICIKLSAgICAgICAgICAgICAgICAgICAgIi0tIGNvcnJ1cHRlZCBsaWJyYXJ5LiI7Ci0gICAgICAgIH0KKyAgICAvLyBEZWZhdWx0IGNvZGVjIHNlcnZpY2VzCisgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA7CisgICAgc3A8SU9teD4gb214ID0gbmV3IGltcGxlbWVudGF0aW9uOjpPbXgoKTsKKyAgICBpZiAob214ID09IG51bGxwdHIpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IGNyZWF0ZSBJT214IEhBTCBzZXJ2aWNlLiI7CisgICAgfSBlbHNlIGlmIChvbXgtPnJlZ2lzdGVyQXNTZXJ2aWNlKCkgIT0gT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IHJlZ2lzdGVyIElPbXggSEFMIHNlcnZpY2UuIjsKICAgICB9IGVsc2UgewotICAgICAgICAvLyBEZWZhdWx0IGNvZGVjIHNlcnZpY2VzCi0gICAgICAgIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOwotICAgICAgICBzcDxJT214U3RvcmU+IG9teFN0b3JlID0gbmV3IGltcGxlbWVudGF0aW9uOjpPbXhTdG9yZSgpOwotICAgICAgICBpZiAob214U3RvcmUgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IGNyZWF0ZSBJT214U3RvcmUgSEFMIHNlcnZpY2UuIjsKLSAgICAgICAgfSBlbHNlIGlmIChvbXhTdG9yZS0+cmVnaXN0ZXJBc1NlcnZpY2UoKSAhPSBPSykgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IHJlZ2lzdGVyIElPbXhTdG9yZSBIQUwgc2VydmljZS4iOwotICAgICAgICB9Ci0gICAgICAgIHNwPElPbXg+IG9teCA9IG5ldyBpbXBsZW1lbnRhdGlvbjo6T214KCk7Ci0gICAgICAgIGlmIChvbXggPT0gbnVsbHB0cikgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IGNyZWF0ZSBJT214IEhBTCBzZXJ2aWNlLiI7Ci0gICAgICAgIH0gZWxzZSBpZiAob214LT5yZWdpc3RlckFzU2VydmljZSgpICE9IE9LKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgcmVnaXN0ZXIgSU9teCBIQUwgc2VydmljZS4iOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTE9HKElORk8pIDw8ICJJT214IEhBTCBzZXJ2aWNlIGNyZWF0ZWQuIjsKLSAgICAgICAgfQorICAgICAgICBMT0coSU5GTykgPDwgIklPbXggSEFMIHNlcnZpY2UgY3JlYXRlZC4iOworICAgIH0KKyAgICBzcDxJT214U3RvcmU+IG9teFN0b3JlID0gbmV3IGltcGxlbWVudGF0aW9uOjpPbXhTdG9yZShvbXgpOworICAgIGlmIChvbXhTdG9yZSA9PSBudWxscHRyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCBjcmVhdGUgSU9teFN0b3JlIEhBTCBzZXJ2aWNlLiI7CisgICAgfSBlbHNlIGlmIChvbXhTdG9yZS0+cmVnaXN0ZXJBc1NlcnZpY2UoKSAhPSBPSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgcmVnaXN0ZXIgSU9teFN0b3JlIEhBTCBzZXJ2aWNlLiI7CiAgICAgfQogCiAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6am9pblJwY1RocmVhZHBvb2woKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvbWFpbl9zd2NvZGVjc2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fc3djb2RlY3NlcnZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5MWI3ODgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fc3djb2RlY3NlcnZpY2UuY3BwCkBAIC0wLDAgKzEsNDggQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisvLyBmcm9tIExPQ0FMX0NfSU5DTFVERVMKKyNpbmNsdWRlICJtaW5pamFpbC5oIgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKy8vIGtTeXN0ZW1TZWNjb21wUG9saWN5UGF0aCBwb2ludHMgdG8gdGhlIHBvbGljeSBmb3IgdGhlIHN3Y29kZWNzIHRoZW1zZWx2ZXMgYW5kCisvLyBpcyBwYXJ0IG9mIHRoZSB1cGRhdGVzLiBrVmVuZG9yU2VjY29tcFBvbGljeVBhdGggcG9pbnRzIHRvIGFueSBhZGRpdGlvbmFsCisvLyBwb2xpY2llcyB0aGF0IHRoZSB2ZW5kb3IgbWF5IG5lZWQgZm9yIHRoZSBkZXZpY2UuCitzdGF0aWMgY29uc3QgY2hhciBrU3lzdGVtU2VjY29tcFBvbGljeVBhdGhbXSA9CisgICAgICAgICIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjL2V0Yy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMucG9saWN5IjsKK3N0YXRpYyBjb25zdCBjaGFyIGtWZW5kb3JTZWNjb21wUG9saWN5UGF0aFtdID0KKyAgICAgICAgIi92ZW5kb3IvZXRjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy5wb2xpY3kiOworCitleHRlcm4gIkMiIHZvaWQgUmVnaXN0ZXJDb2RlY1NlcnZpY2VzKCk7CisKK2ludCBtYWluKGludCBhcmdjIF9fdW51c2VkLCBjaGFyKiogYXJndikKK3sKKyAgICBMT0coSU5GTykgPDwgIm1lZGlhIHN3Y29kZWMgc2VydmljZSBzdGFydGluZyI7CisgICAgc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworICAgIFNldFVwTWluaWphaWwoa1N5c3RlbVNlY2NvbXBQb2xpY3lQYXRoLCBrVmVuZG9yU2VjY29tcFBvbGljeVBhdGgpOworICAgIHN0cmNweShhcmd2WzBdLCAibWVkaWEuc3djb2RlYyIpOworCisgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbCg2NCwgZmFsc2UpOworCisgICAgUmVnaXN0ZXJDb2RlY1NlcnZpY2VzKCk7CisKKyAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpqb2luUnBjVGhyZWFkcG9vbCgpOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9tZWRpYXN3Y29kZWMucmMgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL21lZGlhc3djb2RlYy5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTQ5NjY2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9tZWRpYXN3Y29kZWMucmMKQEAgLTAsMCArMSw3IEBACitzZXJ2aWNlIG1lZGlhLnN3Y29kZWMgL3N5c3RlbS9iaW4vbWVkaWFzd2NvZGVjCisgICAgY2xhc3MgbWFpbgorICAgIHVzZXIgbWVkaWFjb2RlYworICAgIGdyb3VwIGNhbWVyYSBkcm1ycGMgbWVkaWFkcm0KKyAgICB1cGRhdGFibGUKKyAgICBpb3ByaW8gcnQgNAorICAgIHdyaXRlcGlkIC9kZXYvY3B1c2V0L2ZvcmVncm91bmQvdGFza3MKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFjb2RlYy9yZWdpc3RyYW50L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdjMmUwMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTQgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGlibWVkaWFfY29kZWNzZXJ2aWNlcmVnaXN0cmFudCIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJDb2RlY1NlcnZpY2VSZWdpc3RyYW50LmNwcCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliY29kZWMyX2hpZGxAMS4wIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgLy8gQ29kZWNzCisgICAgcnVudGltZV9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9hdmNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfYXZjZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2FhY2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9hYWNlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfYW1ybmJkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfYW1ybmJlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfYW1yd2JkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfYW1yd2JlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfaGV2Y2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9oZXZjZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2c3MTFhbGF3ZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2c3MTFtbGF3ZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X21wZWcyZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2gyNjNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfaDI2M2VuYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9tcGVnNGRlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9tcGVnNGVuYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9tcDNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfdm9yYmlzZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X29wdXNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfb3B1c2VuYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF92cDhkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfdnA5ZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2F2MWRlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF92cDhlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfdnA5ZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Jhd2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9mbGFjZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2ZsYWNlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfZ3NtZGVjIiwKKyAgICBdLAorfQorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvQ29kZWNTZXJ2aWNlUmVnaXN0cmFudC5jcHAgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvQ29kZWNTZXJ2aWNlUmVnaXN0cmFudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2ZWJlZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9Db2RlY1NlcnZpY2VSZWdpc3RyYW50LmNwcApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjU2VydmljZVJlZ2lzdHJhbnQiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9Db2RlY1NlcnZpY2VSZWdpc3RyYW50Lmg+CisKK2V4dGVybiAiQyIgdm9pZCBSZWdpc3RlckNvZGVjU2VydmljZXMoKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDsKKyAgICBMT0coSU5GTykgPDwgIkNyZWF0aW5nIHNvZnR3YXJlIENvZGVjMiBzZXJ2aWNlLi4uIjsKKyAgICBhbmRyb2lkOjpzcDxJQ29tcG9uZW50U3RvcmU+IHN0b3JlID0KKyAgICAgICAgbmV3IHV0aWxzOjpDb21wb25lbnRTdG9yZSgKKyAgICAgICAgICAgICAgICBhbmRyb2lkOjpHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCkpOworICAgIGlmIChzdG9yZSA9PSBudWxscHRyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwKKyAgICAgICAgICAgICAgICAiQ2Fubm90IGNyZWF0ZSBzb2Z0d2FyZSBDb2RlYzIgc2VydmljZS4iOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzdG9yZS0+cmVnaXN0ZXJBc1NlcnZpY2UoInNvZnR3YXJlIikgIT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwKKyAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZWdpc3RlciBzb2Z0d2FyZSBDb2RlYzIgc2VydmljZS4iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HKElORk8pIDw8CisgICAgICAgICAgICAgICAgICAgICJTb2Z0d2FyZSBDb2RlYzIgc2VydmljZSBjcmVhdGVkLiI7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy1hcm0ucG9saWN5IGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLWFybS5wb2xpY3kKaW5kZXggNmVjODg5NS4uMzg3MGExMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLWFybS5wb2xpY3kKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLWFybS5wb2xpY3kKQEAgLTEzLDYgKzEzLDkgQEAKIHBwb2xsOiAxCiBtbWFwMjogMQogZ2V0cmFuZG9tOiAxCittZW1mZF9jcmVhdGU6IDEKK2Z0cnVuY2F0ZTogMQorZnRydW5jYXRlNjQ6IDEKIAogIyBtcmVtYXA6IEVuc3VyZSB8ZmxhZ3N8IGFyZSAoTVJFTUFQX01BWU1PVkUgfCBNUkVNQVBfRklYRUQpIFRPRE86IE9uY2UgbWluaWphaWwKICMgcGFyc2VyIHN1cHBvcnQgZm9yICc8JyBpcyBpbiB0aGlzIG5lZWRzIHRvIGJlIG1vZGlmaWVkIHRvIGFsc28gcHJldmVudApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLXg4Ni5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMteDg2LnBvbGljeQppbmRleCBiYmJlNTUyLi5kOWM0MDQ1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMteDg2LnBvbGljeQorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhY29kZWMteDg2LnBvbGljeQpAQCAtMTgsMTQgKzE4LDIwIEBACiBvcGVuYXQ6IDEKIG9wZW46IDEKIGdldHVpZDMyOiAxCitnZXR1aWQ6IDEKK2dldHJsaW1pdDogMQogd3JpdGV2OiAxCiBpb2N0bDogMQogY2xvc2U6IDEKIG1tYXAyOiAxCittbWFwOiAxCiBmc3RhdDY0OiAxCitmc3RhdDogMQogc3RhdDY0OiAxCitzdGF0ZnM2NDogMQogbWFkdmlzZTogMQogZnN0YXRhdDY0OiAxCituZXdmc3RhdGF0OiAxCiBmdXRleDogMQogbXVubWFwOiAxCiBmYWNjZXNzYXQ6IDEKQEAgLTM5LDE1ICs0NSwyMiBAQAogZXhpdF9ncm91cDogMQogcnRfc2lncmV0dXJuOiAxCiB1Z2V0cmxpbWl0OiAxCityZWFkbGluazogMQogcmVhZGxpbmthdDogMQogX2xsc2VlazogMQogZnN0YXRmczY0OiAxCitmc3RhdGZzOiAxCiBwcmVhZDY0OiAxCiBtcmVtYXA6IDEKIGR1cDogMQogc2V0X3RpZF9hZGRyZXNzOiAxCiB3cml0ZTogMQogbmFub3NsZWVwOiAxCitzY2hlZF9zZXRzY2hlZHVsZXI6IDEKK3VuYW1lOiAxCittZW1mZF9jcmVhdGU6IDEKK2Z0cnVuY2F0ZTogMQorZnRydW5jYXRlNjQ6IDEKIAogIyBSZXF1aXJlZCBieSBBZGRyZXNzU2FuaXRpemVyCiBnZXR0aWQ6IDEKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLWFybS5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy1hcm0ucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwNDJjZDcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy1hcm0ucG9saWN5CkBAIC0wLDAgKzEsODYgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2Z1dGV4OiAxCisjIGlvY3RsIGNhbGxzIGFyZSBmaWx0ZXJlZCB2aWEgdGhlIHNlbGludXggcG9saWN5LgoraW9jdGw6IDEKK3NjaGVkX3lpZWxkOiAxCitjbG9zZTogMQorZHVwOiAxCitwcG9sbDogMQorbXByb3RlY3Q6IGFyZzIgaW4gflBST1RfRVhFQyB8fCBhcmcyIGluIH5QUk9UX1dSSVRFCittbWFwMjogYXJnMiBpbiB+UFJPVF9FWEVDIHx8IGFyZzIgaW4gflBST1RfV1JJVEUKK21lbWZkX2NyZWF0ZTogMQorZnRydW5jYXRlOiAxCitmdHJ1bmNhdGU2NDogMQorCisjIG1yZW1hcDogRW5zdXJlIHxmbGFnc3wgYXJlIChNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCkgVE9ETzogT25jZSBtaW5pamFpbAorIyBwYXJzZXIgc3VwcG9ydCBmb3IgJzwnIGlzIGluIHRoaXMgbmVlZHMgdG8gYmUgbW9kaWZpZWQgdG8gYWxzbyBwcmV2ZW50CisjIHxvbGRfYWRkcmVzc3wgYW5kIHxuZXdfYWRkcmVzc3wgZnJvbSB0b3VjaGluZyB0aGUgZXhjZXB0aW9uIHZlY3RvciBwYWdlLCB3aGljaAorIyBvbiBBUk0gaXMgc3RhdGljYWxseSBsb2FkZWQgYXQgMHhmZmZmIDAwMDAuIFNlZQorIyBodHRwOi8vaW5mb2NlbnRlci5hcm0uY29tL2hlbHAvaW5kZXguanNwP3RvcGljPS9jb20uYXJtLmRvYy5kZGkwMjExaC9CYWJmZWVnYS5odG1sCisjIGZvciBtb3JlIGRldGFpbHMuCittcmVtYXA6IGFyZzMgPT0gMworbXVubWFwOiAxCitwcmN0bDogMQorZ2V0dWlkMzI6IDEKK3dyaXRldjogMQorc2lnYWx0c3RhY2s6IDEKK2Nsb25lOiAxCitleGl0OiAxCitsc2VlazogMQorcnRfc2lncHJvY21hc2s6IDEKK29wZW5hdDogMQorb3BlbjogMQorZnN0YXQ2NDogMQord3JpdGU6IDEKK25hbm9zbGVlcDogMQorc2V0cHJpb3JpdHk6IDEKK3NldF90aWRfYWRkcmVzczogMQorZ2V0ZGVudHM2NDogMQorcmVhZGxpbmthdDogMQorcmVhZGxpbms6IDEKK3JlYWQ6IDEKK3ByZWFkNjQ6IDEKK2ZzdGF0ZnM2NDogMQorZ2V0dGltZW9mZGF5OiAxCitmYWNjZXNzYXQ6IDEKK19sbHNlZWs6IDEKK2ZzdGF0YXQ2NDogMQordWdldHJsaW1pdDogMQorZXhpdF9ncm91cDogMQorcmVzdGFydF9zeXNjYWxsOiAxCitydF9zaWdyZXR1cm46IDEKK2dldHJhbmRvbTogMQorbWFkdmlzZTogMQorCisjIGNyYXNoIGR1bXAgcG9saWN5IGFkZGl0aW9ucworc2lncmV0dXJuOiAxCitjbG9ja19nZXR0aW1lOiAxCitmdXRleDogMQorZ2V0cGlkOiAxCitnZXR0aWQ6IDEKK3BpcGUyOiAxCityZWN2bXNnOiAxCitwcm9jZXNzX3ZtX3JlYWR2OiAxCit0Z2tpbGw6IDEKK3J0X3NpZ2FjdGlvbjogMQorcnRfdGdzaWdxdWV1ZWluZm86IDEKKyNwcmN0bDogYXJnMCA9PSBQUl9HRVRfTk9fTkVXX1BSSVZTIHx8IGFyZzAgPT0gMHg1MzU2NGQ0MQorI21wcm90ZWN0OiBhcmcyIGluIDB4MXwweDIKKyNtbWFwMjogYXJnMiBpbiAweDF8MHgyCitnZXRldWlkMzI6IDEKK2dldGdpZDMyOiAxCitnZXRlZ2lkMzI6IDEKK2dldGdyb3VwczMyOiAxCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy1hcm02NC5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy1hcm02NC5wb2xpY3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGZhZjhiMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLWFybTY0LnBvbGljeQpAQCAtMCwwICsxLDgxIEBACisjIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitmdXRleDogMQorIyBpb2N0bCBjYWxscyBhcmUgZmlsdGVyZWQgdmlhIHRoZSBzZWxpbnV4IHBvbGljeS4KK2lvY3RsOiAxCitzY2hlZF95aWVsZDogMQorY2xvc2U6IDEKK2R1cDogMQorcHBvbGw6IDEKK21wcm90ZWN0OiBhcmcyIGluIH5QUk9UX0VYRUMgfHwgYXJnMiBpbiB+UFJPVF9XUklURQorbW1hcDogYXJnMiBpbiB+UFJPVF9FWEVDIHx8IGFyZzIgaW4gflBST1RfV1JJVEUKK2dldHVpZDogMQorZ2V0cmxpbWl0OiAxCitmc3RhdDogMQorbmV3ZnN0YXRhdDogMQorZnN0YXRmczogMQorbWVtZmRfY3JlYXRlOiAxCitmdHJ1bmNhdGU6IDEKKworIyBtcmVtYXA6IEVuc3VyZSB8ZmxhZ3N8IGFyZSAoTVJFTUFQX01BWU1PVkUgfCBNUkVNQVBfRklYRUQpIFRPRE86IE9uY2UgbWluaWphaWwKKyMgcGFyc2VyIHN1cHBvcnQgZm9yICc8JyBpcyBpbiB0aGlzIG5lZWRzIHRvIGJlIG1vZGlmaWVkIHRvIGFsc28gcHJldmVudAorIyB8b2xkX2FkZHJlc3N8IGFuZCB8bmV3X2FkZHJlc3N8IGZyb20gdG91Y2hpbmcgdGhlIGV4Y2VwdGlvbiB2ZWN0b3IgcGFnZSwgd2hpY2gKKyMgb24gQVJNIGlzIHN0YXRpY2FsbHkgbG9hZGVkIGF0IDB4ZmZmZiAwMDAwLiBTZWUKKyMgaHR0cDovL2luZm9jZW50ZXIuYXJtLmNvbS9oZWxwL2luZGV4LmpzcD90b3BpYz0vY29tLmFybS5kb2MuZGRpMDIxMWgvQmFiZmVlZ2EuaHRtbAorIyBmb3IgbW9yZSBkZXRhaWxzLgorbXJlbWFwOiBhcmczID09IDMKK211bm1hcDogMQorcHJjdGw6IDEKK3dyaXRldjogMQorc2lnYWx0c3RhY2s6IDEKK2Nsb25lOiAxCitleGl0OiAxCitsc2VlazogMQorcnRfc2lncHJvY21hc2s6IDEKK29wZW5hdDogMQord3JpdGU6IDEKK25hbm9zbGVlcDogMQorc2V0cHJpb3JpdHk6IDEKK3NldF90aWRfYWRkcmVzczogMQorZ2V0ZGVudHM2NDogMQorcmVhZGxpbmthdDogMQorcmVhZDogMQorcHJlYWQ2NDogMQorZ2V0dGltZW9mZGF5OiAxCitmYWNjZXNzYXQ6IDEKK2V4aXRfZ3JvdXA6IDEKK3Jlc3RhcnRfc3lzY2FsbDogMQorcnRfc2lncmV0dXJuOiAxCitnZXRyYW5kb206IDEKK21hZHZpc2U6IDEKKworIyBjcmFzaCBkdW1wIHBvbGljeSBhZGRpdGlvbnMKK2Nsb2NrX2dldHRpbWU6IDEKK2dldHBpZDogMQorZ2V0dGlkOiAxCitwaXBlMjogMQorcmVjdm1zZzogMQorcHJvY2Vzc192bV9yZWFkdjogMQordGdraWxsOiAxCitydF9zaWdhY3Rpb246IDEKK3J0X3Rnc2lncXVldWVpbmZvOiAxCisjbXByb3RlY3Q6IGFyZzIgaW4gMHgxfDB4MgorbXVubWFwOiAxCisjbW1hcDogYXJnMiBpbiAweDF8MHgyCitnZXRldWlkOiAxCitnZXRnaWQ6IDEKK2dldGVnaWQ6IDEKK2dldGdyb3VwczogMQorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy14ODYucG9saWN5IGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMteDg2LnBvbGljeQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5hYjI1OTJhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMteDg2LnBvbGljeQpAQCAtMCwwICsxIEBACittZWRpYWNvZGVjLXg4Ni5wb2xpY3kKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy14ODZfNjQucG9saWN5IGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMteDg2XzY0LnBvbGljeQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5hYjI1OTJhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMteDg2XzY0LnBvbGljeQpAQCAtMCwwICsxIEBACittZWRpYWNvZGVjLXg4Ni5wb2xpY3kKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWRybS9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWVkaWFkcm0vQW5kcm9pZC5tawppbmRleCBlODcwOTY1Li4yMjdhMjlkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWRybS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL21lZGlhZHJtL0FuZHJvaWQubWsKQEAgLTI5LDcgKzI5LDggQEAKICAgICBsaWJoaWRsbWVtb3J5IFwKICAgICBsaWJoaWRsdHJhbnNwb3J0IFwKICAgICBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMQorICAgIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMSBcCisgICAgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yCiAKIExPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2V4dHJhIC1XZXJyb3IKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFkcm0vdGVzdHMvQW5kcm9pZC5tayBiL3NlcnZpY2VzL21lZGlhZHJtL3Rlc3RzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyZjczOTkuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvbWVkaWFkcm0vdGVzdHMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLSMgQnVpbGQgdGhlIHVuaXQgdGVzdHMuCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gRHJtU2Vzc2lvbk1hbmFnZXJfdGVzdAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotCURybVNlc3Npb25NYW5hZ2VyX3Rlc3QuY3BwIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGlibG9nIFwKLQlsaWJtZWRpYXBsYXllcnNlcnZpY2UgXAotCWxpYnV0aWxzIFwKLQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0JZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIFwKLQlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZSBcCi0KLUxPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCi0KLUxPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKLQotaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWRybS90ZXN0cy9Ecm1TZXNzaW9uTWFuYWdlcl90ZXN0LmNwcCBiL3NlcnZpY2VzL21lZGlhZHJtL3Rlc3RzL0RybVNlc3Npb25NYW5hZ2VyX3Rlc3QuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTM1MGExLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhZHJtL3Rlc3RzL0RybVNlc3Npb25NYW5hZ2VyX3Rlc3QuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkRybVNlc3Npb25NYW5hZ2VyX3Rlc3QiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi0jaW5jbHVkZSAiRHJtLmgiCi0jaW5jbHVkZSAiRHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZS5oIgotI2luY2x1ZGUgIkRybVNlc3Npb25NYW5hZ2VyLmgiCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Qcm9jZXNzSW5mb0ludGVyZmFjZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBGYWtlUHJvY2Vzc0luZm8gOiBwdWJsaWMgUHJvY2Vzc0luZm9JbnRlcmZhY2UgewotICAgIEZha2VQcm9jZXNzSW5mbygpIHt9Ci0gICAgdmlydHVhbCB+RmFrZVByb2Nlc3NJbmZvKCkge30KLQotICAgIHZpcnR1YWwgYm9vbCBnZXRQcmlvcml0eShpbnQgcGlkLCBpbnQqIHByaW9yaXR5KSB7Ci0gICAgICAgIC8vIEZvciB0ZXN0aW5nLCB1c2UgcGlkIGFzIHByaW9yaXR5LgotICAgICAgICAvLyBMb3dlciB0aGUgdmFsdWUgaGlnaGVyIHRoZSBwcmlvcml0eS4KLSAgICAgICAgKnByaW9yaXR5ID0gcGlkOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRmFrZVByb2Nlc3NJbmZvKTsKLX07Ci0KLXN0cnVjdCBGYWtlRHJtIDogcHVibGljIERybVNlc3Npb25DbGllbnRJbnRlcmZhY2UgewotICAgIEZha2VEcm0oKSB7fQotICAgIHZpcnR1YWwgfkZha2VEcm0oKSB7fQotCi0gICAgdmlydHVhbCBib29sIHJlY2xhaW1TZXNzaW9uKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7Ci0gICAgICAgIG1SZWNsYWltZWRTZXNzaW9ucy5wdXNoX2JhY2soc2Vzc2lvbklkKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgY29uc3QgVmVjdG9yPFZlY3Rvcjx1aW50OF90PiA+JiByZWNsYWltZWRTZXNzaW9ucygpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1SZWNsYWltZWRTZXNzaW9uczsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgVmVjdG9yPFZlY3Rvcjx1aW50OF90PiA+IG1SZWNsYWltZWRTZXNzaW9uczsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZha2VEcm0pOwotfTsKLQotc3RhdGljIGNvbnN0IGludCBrVGVzdFBpZDEgPSAzMDsKLXN0YXRpYyBjb25zdCBpbnQga1Rlc3RQaWQyID0gMjA7Ci1zdGF0aWMgY29uc3QgdWludDhfdCBrVGVzdFNlc3Npb25JZDFbXSA9IHsxLCAyLCAzfTsKLXN0YXRpYyBjb25zdCB1aW50OF90IGtUZXN0U2Vzc2lvbklkMltdID0gezQsIDUsIDYsIDcsIDh9Owotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1Rlc3RTZXNzaW9uSWQzW10gPSB7OSwgMH07Ci0KLWNsYXNzIERybVNlc3Npb25NYW5hZ2VyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgewotcHVibGljOgotICAgIERybVNlc3Npb25NYW5hZ2VyVGVzdCgpCi0gICAgICAgIDogbURybVNlc3Npb25NYW5hZ2VyKG5ldyBEcm1TZXNzaW9uTWFuYWdlcihuZXcgRmFrZVByb2Nlc3NJbmZvKCkpKSwKLSAgICAgICAgICBtVGVzdERybTEobmV3IEZha2VEcm0oKSksCi0gICAgICAgICAgbVRlc3REcm0yKG5ldyBGYWtlRHJtKCkpIHsKLSAgICAgICAgR2V0U2Vzc2lvbklkKGtUZXN0U2Vzc2lvbklkMSwgQVJSQVlfU0laRShrVGVzdFNlc3Npb25JZDEpLCAmbVNlc3Npb25JZDEpOwotICAgICAgICBHZXRTZXNzaW9uSWQoa1Rlc3RTZXNzaW9uSWQyLCBBUlJBWV9TSVpFKGtUZXN0U2Vzc2lvbklkMiksICZtU2Vzc2lvbklkMik7Ci0gICAgICAgIEdldFNlc3Npb25JZChrVGVzdFNlc3Npb25JZDMsIEFSUkFZX1NJWkUoa1Rlc3RTZXNzaW9uSWQzKSwgJm1TZXNzaW9uSWQzKTsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICBzdGF0aWMgdm9pZCBHZXRTZXNzaW9uSWQoY29uc3QgdWludDhfdCogaWRzLCBzaXplX3QgbnVtLCBWZWN0b3I8dWludDhfdD4qIHNlc3Npb25JZCkgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bTsgKytpKSB7Ci0gICAgICAgICAgICBzZXNzaW9uSWQtPnB1c2hfYmFjayhpZHNbaV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgRXhwZWN0RXFTZXNzaW9uSW5mbyhjb25zdCBTZXNzaW9uSW5mbyYgaW5mbywgc3A8RHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZT4gZHJtLAotICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsIGludDY0X3QgdGltZVN0YW1wKSB7Ci0gICAgICAgIEVYUEVDVF9FUShkcm0sIGluZm8uZHJtKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoaXNFcXVhbFNlc3Npb25JZChzZXNzaW9uSWQsIGluZm8uc2Vzc2lvbklkKSk7Ci0gICAgICAgIEVYUEVDVF9FUSh0aW1lU3RhbXAsIGluZm8udGltZVN0YW1wKTsKLSAgICB9Ci0KLSAgICB2b2lkIGFkZFNlc3Npb24oKSB7Ci0gICAgICAgIG1Ecm1TZXNzaW9uTWFuYWdlci0+YWRkU2Vzc2lvbihrVGVzdFBpZDEsIG1UZXN0RHJtMSwgbVNlc3Npb25JZDEpOwotICAgICAgICBtRHJtU2Vzc2lvbk1hbmFnZXItPmFkZFNlc3Npb24oa1Rlc3RQaWQyLCBtVGVzdERybTIsIG1TZXNzaW9uSWQyKTsKLSAgICAgICAgbURybVNlc3Npb25NYW5hZ2VyLT5hZGRTZXNzaW9uKGtUZXN0UGlkMiwgbVRlc3REcm0yLCBtU2Vzc2lvbklkMyk7Ci0gICAgICAgIGNvbnN0IFBpZFNlc3Npb25JbmZvc01hcCYgbWFwID0gc2Vzc2lvbk1hcCgpOwotICAgICAgICBFWFBFQ1RfRVEoMnUsIG1hcC5zaXplKCkpOwotICAgICAgICBzc2l6ZV90IGluZGV4MSA9IG1hcC5pbmRleE9mS2V5KGtUZXN0UGlkMSk7Ci0gICAgICAgIEFTU0VSVF9HRShpbmRleDEsIDApOwotICAgICAgICBjb25zdCBTZXNzaW9uSW5mb3MmIGluZm9zMSA9IG1hcFtpbmRleDFdOwotICAgICAgICBFWFBFQ1RfRVEoMXUsIGluZm9zMS5zaXplKCkpOwotICAgICAgICBFeHBlY3RFcVNlc3Npb25JbmZvKGluZm9zMVswXSwgbVRlc3REcm0xLCBtU2Vzc2lvbklkMSwgMCk7Ci0KLSAgICAgICAgc3NpemVfdCBpbmRleDIgPSBtYXAuaW5kZXhPZktleShrVGVzdFBpZDIpOwotICAgICAgICBBU1NFUlRfR0UoaW5kZXgyLCAwKTsKLSAgICAgICAgY29uc3QgU2Vzc2lvbkluZm9zJiBpbmZvczIgPSBtYXBbaW5kZXgyXTsKLSAgICAgICAgRVhQRUNUX0VRKDJ1LCBpbmZvczIuc2l6ZSgpKTsKLSAgICAgICAgRXhwZWN0RXFTZXNzaW9uSW5mbyhpbmZvczJbMF0sIG1UZXN0RHJtMiwgbVNlc3Npb25JZDIsIDEpOwotICAgICAgICBFeHBlY3RFcVNlc3Npb25JbmZvKGluZm9zMlsxXSwgbVRlc3REcm0yLCBtU2Vzc2lvbklkMywgMik7Ci0gICAgfQotCi0gICAgY29uc3QgUGlkU2Vzc2lvbkluZm9zTWFwJiBzZXNzaW9uTWFwKCkgewotICAgICAgICByZXR1cm4gbURybVNlc3Npb25NYW5hZ2VyLT5tU2Vzc2lvbk1hcDsKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RHZXRMb3dlc3RQcmlvcml0eSgpIHsKLSAgICAgICAgaW50IHBpZDsKLSAgICAgICAgaW50IHByaW9yaXR5OwotICAgICAgICBFWFBFQ1RfRkFMU0UobURybVNlc3Npb25NYW5hZ2VyLT5nZXRMb3dlc3RQcmlvcml0eV9sKCZwaWQsICZwcmlvcml0eSkpOwotCi0gICAgICAgIGFkZFNlc3Npb24oKTsKLSAgICAgICAgRVhQRUNUX1RSVUUobURybVNlc3Npb25NYW5hZ2VyLT5nZXRMb3dlc3RQcmlvcml0eV9sKCZwaWQsICZwcmlvcml0eSkpOwotCi0gICAgICAgIEVYUEVDVF9FUShrVGVzdFBpZDEsIHBpZCk7Ci0gICAgICAgIEZha2VQcm9jZXNzSW5mbyBwcm9jZXNzSW5mbzsKLSAgICAgICAgaW50IHByaW9yaXR5MTsKLSAgICAgICAgcHJvY2Vzc0luZm8uZ2V0UHJpb3JpdHkoa1Rlc3RQaWQxLCAmcHJpb3JpdHkxKTsKLSAgICAgICAgRVhQRUNUX0VRKHByaW9yaXR5MSwgcHJpb3JpdHkpOwotICAgIH0KLQotICAgIHZvaWQgdGVzdEdldExlYXN0VXNlZFNlc3Npb24oKSB7Ci0gICAgICAgIHNwPERybVNlc3Npb25DbGllbnRJbnRlcmZhY2U+IGRybTsKLSAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZDsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKG1Ecm1TZXNzaW9uTWFuYWdlci0+Z2V0TGVhc3RVc2VkU2Vzc2lvbl9sKGtUZXN0UGlkMSwgJmRybSwgJnNlc3Npb25JZCkpOwotCi0gICAgICAgIGFkZFNlc3Npb24oKTsKLQotICAgICAgICBFWFBFQ1RfVFJVRShtRHJtU2Vzc2lvbk1hbmFnZXItPmdldExlYXN0VXNlZFNlc3Npb25fbChrVGVzdFBpZDEsICZkcm0sICZzZXNzaW9uSWQpKTsKLSAgICAgICAgRVhQRUNUX0VRKG1UZXN0RHJtMSwgZHJtKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoaXNFcXVhbFNlc3Npb25JZChtU2Vzc2lvbklkMSwgc2Vzc2lvbklkKSk7Ci0KLSAgICAgICAgRVhQRUNUX1RSVUUobURybVNlc3Npb25NYW5hZ2VyLT5nZXRMZWFzdFVzZWRTZXNzaW9uX2woa1Rlc3RQaWQyLCAmZHJtLCAmc2Vzc2lvbklkKSk7Ci0gICAgICAgIEVYUEVDVF9FUShtVGVzdERybTIsIGRybSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGlzRXF1YWxTZXNzaW9uSWQobVNlc3Npb25JZDIsIHNlc3Npb25JZCkpOwotCi0gICAgICAgIC8vIG1TZXNzaW9uSWQyIGlzIG5vIGxvbmdlciB0aGUgbGVhc3QgdXNlZCBzZXNzaW9uLgotICAgICAgICBtRHJtU2Vzc2lvbk1hbmFnZXItPnVzZVNlc3Npb24obVNlc3Npb25JZDIpOwotICAgICAgICBFWFBFQ1RfVFJVRShtRHJtU2Vzc2lvbk1hbmFnZXItPmdldExlYXN0VXNlZFNlc3Npb25fbChrVGVzdFBpZDIsICZkcm0sICZzZXNzaW9uSWQpKTsKLSAgICAgICAgRVhQRUNUX0VRKG1UZXN0RHJtMiwgZHJtKTsKLSAgICAgICAgRVhQRUNUX1RSVUUoaXNFcXVhbFNlc3Npb25JZChtU2Vzc2lvbklkMywgc2Vzc2lvbklkKSk7Ci0gICAgfQotCi0gICAgc3A8RHJtU2Vzc2lvbk1hbmFnZXI+IG1Ecm1TZXNzaW9uTWFuYWdlcjsKLSAgICBzcDxGYWtlRHJtPiBtVGVzdERybTE7Ci0gICAgc3A8RmFrZURybT4gbVRlc3REcm0yOwotICAgIFZlY3Rvcjx1aW50OF90PiBtU2Vzc2lvbklkMTsKLSAgICBWZWN0b3I8dWludDhfdD4gbVNlc3Npb25JZDI7Ci0gICAgVmVjdG9yPHVpbnQ4X3Q+IG1TZXNzaW9uSWQzOwotfTsKLQotVEVTVF9GKERybVNlc3Npb25NYW5hZ2VyVGVzdCwgYWRkU2Vzc2lvbikgewotICAgIGFkZFNlc3Npb24oKTsKLX0KLQotVEVTVF9GKERybVNlc3Npb25NYW5hZ2VyVGVzdCwgdXNlU2Vzc2lvbikgewotICAgIGFkZFNlc3Npb24oKTsKLQotICAgIG1Ecm1TZXNzaW9uTWFuYWdlci0+dXNlU2Vzc2lvbihtU2Vzc2lvbklkMSk7Ci0gICAgbURybVNlc3Npb25NYW5hZ2VyLT51c2VTZXNzaW9uKG1TZXNzaW9uSWQzKTsKLQotICAgIGNvbnN0IFBpZFNlc3Npb25JbmZvc01hcCYgbWFwID0gc2Vzc2lvbk1hcCgpOwotICAgIGNvbnN0IFNlc3Npb25JbmZvcyYgaW5mb3MxID0gbWFwLnZhbHVlRm9yKGtUZXN0UGlkMSk7Ci0gICAgY29uc3QgU2Vzc2lvbkluZm9zJiBpbmZvczIgPSBtYXAudmFsdWVGb3Ioa1Rlc3RQaWQyKTsKLSAgICBFeHBlY3RFcVNlc3Npb25JbmZvKGluZm9zMVswXSwgbVRlc3REcm0xLCBtU2Vzc2lvbklkMSwgMyk7Ci0gICAgRXhwZWN0RXFTZXNzaW9uSW5mbyhpbmZvczJbMV0sIG1UZXN0RHJtMiwgbVNlc3Npb25JZDMsIDQpOwotfQotCi1URVNUX0YoRHJtU2Vzc2lvbk1hbmFnZXJUZXN0LCByZW1vdmVTZXNzaW9uKSB7Ci0gICAgYWRkU2Vzc2lvbigpOwotCi0gICAgbURybVNlc3Npb25NYW5hZ2VyLT5yZW1vdmVTZXNzaW9uKG1TZXNzaW9uSWQyKTsKLQotICAgIGNvbnN0IFBpZFNlc3Npb25JbmZvc01hcCYgbWFwID0gc2Vzc2lvbk1hcCgpOwotICAgIEVYUEVDVF9FUSgydSwgbWFwLnNpemUoKSk7Ci0gICAgY29uc3QgU2Vzc2lvbkluZm9zJiBpbmZvczEgPSBtYXAudmFsdWVGb3Ioa1Rlc3RQaWQxKTsKLSAgICBjb25zdCBTZXNzaW9uSW5mb3MmIGluZm9zMiA9IG1hcC52YWx1ZUZvcihrVGVzdFBpZDIpOwotICAgIEVYUEVDVF9FUSgxdSwgaW5mb3MxLnNpemUoKSk7Ci0gICAgRVhQRUNUX0VRKDF1LCBpbmZvczIuc2l6ZSgpKTsKLSAgICAvLyBtU2Vzc2lvbklkMiBoYXMgYmVlbiByZW1vdmVkLgotICAgIEV4cGVjdEVxU2Vzc2lvbkluZm8oaW5mb3MyWzBdLCBtVGVzdERybTIsIG1TZXNzaW9uSWQzLCAyKTsKLX0KLQotVEVTVF9GKERybVNlc3Npb25NYW5hZ2VyVGVzdCwgcmVtb3ZlRHJtKSB7Ci0gICAgYWRkU2Vzc2lvbigpOwotCi0gICAgc3A8RmFrZURybT4gZHJtID0gbmV3IEZha2VEcm07Ci0gICAgY29uc3QgdWludDhfdCBpZHNbXSA9IHsxMjN9OwotICAgIFZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQ7Ci0gICAgR2V0U2Vzc2lvbklkKGlkcywgQVJSQVlfU0laRShpZHMpLCAmc2Vzc2lvbklkKTsKLSAgICBtRHJtU2Vzc2lvbk1hbmFnZXItPmFkZFNlc3Npb24oa1Rlc3RQaWQyLCBkcm0sIHNlc3Npb25JZCk7Ci0KLSAgICBtRHJtU2Vzc2lvbk1hbmFnZXItPnJlbW92ZURybShtVGVzdERybTIpOwotCi0gICAgY29uc3QgUGlkU2Vzc2lvbkluZm9zTWFwJiBtYXAgPSBzZXNzaW9uTWFwKCk7Ci0gICAgY29uc3QgU2Vzc2lvbkluZm9zJiBpbmZvczIgPSBtYXAudmFsdWVGb3Ioa1Rlc3RQaWQyKTsKLSAgICBFWFBFQ1RfRVEoMXUsIGluZm9zMi5zaXplKCkpOwotICAgIC8vIG1UZXN0RHJtMiBoYXMgYmVlbiByZW1vdmVkLgotICAgIEV4cGVjdEVxU2Vzc2lvbkluZm8oaW5mb3MyWzBdLCBkcm0sIHNlc3Npb25JZCwgMyk7Ci19Ci0KLVRFU1RfRihEcm1TZXNzaW9uTWFuYWdlclRlc3QsIHJlY2xhaW1TZXNzaW9uKSB7Ci0gICAgRVhQRUNUX0ZBTFNFKG1Ecm1TZXNzaW9uTWFuYWdlci0+cmVjbGFpbVNlc3Npb24oa1Rlc3RQaWQxKSk7Ci0gICAgYWRkU2Vzc2lvbigpOwotCi0gICAgLy8gY2FsbGluZyBwaWQgcHJpb3JpdHkgaXMgdG9vIGxvdwotICAgIEVYUEVDVF9GQUxTRShtRHJtU2Vzc2lvbk1hbmFnZXItPnJlY2xhaW1TZXNzaW9uKDUwKSk7Ci0KLSAgICBFWFBFQ1RfVFJVRShtRHJtU2Vzc2lvbk1hbmFnZXItPnJlY2xhaW1TZXNzaW9uKDEwKSk7Ci0gICAgRVhQRUNUX0VRKDF1LCBtVGVzdERybTEtPnJlY2xhaW1lZFNlc3Npb25zKCkuc2l6ZSgpKTsKLSAgICBFWFBFQ1RfVFJVRShpc0VxdWFsU2Vzc2lvbklkKG1TZXNzaW9uSWQxLCBtVGVzdERybTEtPnJlY2xhaW1lZFNlc3Npb25zKClbMF0pKTsKLQotICAgIG1Ecm1TZXNzaW9uTWFuYWdlci0+cmVtb3ZlU2Vzc2lvbihtU2Vzc2lvbklkMSk7Ci0KLSAgICAvLyBhZGQgYSBzZXNzaW9uIGZyb20gYSBoaWdoZXIgcHJpb3JpdHkgcHJvY2Vzcy4KLSAgICBzcDxGYWtlRHJtPiBkcm0gPSBuZXcgRmFrZURybTsKLSAgICBjb25zdCB1aW50OF90IGlkc1tdID0gezEsIDMsIDV9OwotICAgIFZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQ7Ci0gICAgR2V0U2Vzc2lvbklkKGlkcywgQVJSQVlfU0laRShpZHMpLCAmc2Vzc2lvbklkKTsKLSAgICBtRHJtU2Vzc2lvbk1hbmFnZXItPmFkZFNlc3Npb24oMTUsIGRybSwgc2Vzc2lvbklkKTsKLQotICAgIEVYUEVDVF9UUlVFKG1Ecm1TZXNzaW9uTWFuYWdlci0+cmVjbGFpbVNlc3Npb24oMTgpKTsKLSAgICBFWFBFQ1RfRVEoMXUsIG1UZXN0RHJtMi0+cmVjbGFpbWVkU2Vzc2lvbnMoKS5zaXplKCkpOwotICAgIC8vIG1TZXNzaW9uSWQyIGlzIHJlY2xhaW1lZC4KLSAgICBFWFBFQ1RfVFJVRShpc0VxdWFsU2Vzc2lvbklkKG1TZXNzaW9uSWQyLCBtVGVzdERybTItPnJlY2xhaW1lZFNlc3Npb25zKClbMF0pKTsKLX0KLQotVEVTVF9GKERybVNlc3Npb25NYW5hZ2VyVGVzdCwgZ2V0TG93ZXN0UHJpb3JpdHkpIHsKLSAgICB0ZXN0R2V0TG93ZXN0UHJpb3JpdHkoKTsKLX0KLQotVEVTVF9GKERybVNlc3Npb25NYW5hZ2VyVGVzdCwgZ2V0TGVhc3RVc2VkU2Vzc2lvbl9sKSB7Ci0gICAgdGVzdEdldExlYXN0VXNlZFNlc3Npb24oKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgxMjI0NAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw3MSBAQAorLy8gc2VydmljZSBsaWJyYXJ5CitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYm1lZGlhZXh0cmFjdG9yc2VydmljZSIsCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorICAgIHNyY3M6IFsiTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcCJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKK30KKworLy8gc2VydmljZSBleGVjdXRhYmxlCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJtZWRpYWV4dHJhY3RvciIsCisKKyAgICBzcmNzOiBbIm1haW5fZXh0cmFjdG9yc2VydmljZS5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFleHRyYWN0b3JzZXJ2aWNlIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliYXZzZXJ2aWNlc19taW5pamFpbCIsCisgICAgXSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgYW5kcm9pZDogeworICAgICAgICAgICAgcHJvZHVjdF92YXJpYWJsZXM6IHsKKyAgICAgICAgICAgICAgICBtYWxsb2Nfbm90X3N2ZWx0ZTogeworICAgICAgICAgICAgICAgICAgICAvLyBTY3VkbyBpbmNyZWFzZXMgbWVtb3J5IGZvb3RwcmludCwgc28gb25seSBlbmFibGUgb24KKyAgICAgICAgICAgICAgICAgICAgLy8gbm9uLXN2ZWx0ZSBkZXZpY2VzLgorICAgICAgICAgICAgICAgICAgICBzaGFyZWRfbGliczogWyJsaWJjX3NjdWRvIl0sCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgfSwKKyAgICBpbml0X3JjOiBbIm1lZGlhZXh0cmFjdG9yLnJjIl0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYSJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorfQorCitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJtZWRpYWV4dHJhY3Rvci5wb2xpY3kiLAorICAgIHN1Yl9kaXI6ICJzZWNjb21wX3BvbGljeSIsCisgICAgYXJjaDogeworICAgICAgICBhcm06IHsKKyAgICAgICAgICAgIHNyYzogInNlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLWFybS5wb2xpY3kiLAorICAgICAgICB9LAorICAgICAgICBhcm02NDogeworICAgICAgICAgICAgc3JjOiAic2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3ItYXJtNjQucG9saWN5IiwKKyAgICAgICAgfSwKKyAgICAgICAgeDg2OiB7CisgICAgICAgICAgICBzcmM6ICJzZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci14ODYucG9saWN5IiwKKyAgICAgICAgfSwKKyAgICAgICAgeDg2XzY0OiB7CisgICAgICAgICAgICBzcmM6ICJzZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci14ODZfNjQucG9saWN5IiwKKyAgICAgICAgfSwKKyAgICB9LAorICAgIHJlcXVpcmVkOiBbImNyYXNoX2R1bXAucG9saWN5Il0sCit9CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YzY1MjdmLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLSMgc2VydmljZSBsaWJyYXJ5Ci1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotICAgIE1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAgXAotICAgIE1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5jcHAgXAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYm1lZGlhIGxpYnN0YWdlZnJpZ2h0IGxpYmJpbmRlciBsaWJ1dGlscyBsaWJsb2cKLUxPQ0FMX01PRFVMRTo9IGxpYm1lZGlhZXh0cmFjdG9yc2VydmljZQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi0KLSMgc2VydmljZSBleGVjdXRhYmxlCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLSMgc2VjY29tcCBmaWx0ZXJzIGFyZSBkZWZpbmVkIGZvciB0aGUgZm9sbG93aW5nIGFyY2hpdGVjdHVyZXM6Ci1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IGNyYXNoX2R1bXAucG9saWN5Ci1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTX2FybSA6PSBtZWRpYWV4dHJhY3Rvci5wb2xpY3kKLUxPQ0FMX1JFUVVJUkVEX01PRFVMRVNfYXJtNjQgOj0gbWVkaWFleHRyYWN0b3IucG9saWN5Ci1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTX3g4NiA6PSBtZWRpYWV4dHJhY3Rvci5wb2xpY3kKLQotIyBleHRyYWN0b3IgbGlicmFyaWVzCi1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTICs9IFwKLSAgICBsaWJhYWNleHRyYWN0b3IgXAotICAgIGxpYmFtcmV4dHJhY3RvciBcCi0gICAgbGliZmxhY2V4dHJhY3RvciBcCi0gICAgbGlibWlkaWV4dHJhY3RvciBcCi0gICAgbGlibWt2ZXh0cmFjdG9yIFwKLSAgICBsaWJtcDNleHRyYWN0b3IgXAotICAgIGxpYm1wNGV4dHJhY3RvciBcCi0gICAgbGlibXBlZzJleHRyYWN0b3IgXAotICAgIGxpYm9nZ2V4dHJhY3RvciBcCi0gICAgbGlid2F2ZXh0cmFjdG9yIFwKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IG1haW5fZXh0cmFjdG9yc2VydmljZS5jcHAKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlibWVkaWEgbGlibWVkaWFleHRyYWN0b3JzZXJ2aWNlIGxpYmJpbmRlciBsaWJ1dGlscyBcCi0gICAgbGlibG9nIGxpYmJhc2UgbGliaWN1dWMgbGliYXZzZXJ2aWNlc19taW5pamFpbAotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBsaWJpY3VhbmRyb2lkX3V0aWxzCi1MT0NBTF9NT0RVTEU6PSBtZWRpYWV4dHJhY3RvcgotTE9DQUxfSU5JVF9SQyA6PSBtZWRpYWV4dHJhY3Rvci5yYwotTE9DQUxfQ19JTkNMVURFUyA6PSBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhCi1MT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLSMgc2VydmljZSBzZWNjb21wIGZpbHRlcgotaWZlcSAoJChUQVJHRVRfQVJDSCksICQoZmlsdGVyICQoVEFSR0VUX0FSQ0gpLCBhcm0gYXJtNjQgeDg2IHg4Nl82NCkpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBtZWRpYWV4dHJhY3Rvci5wb2xpY3kKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVCkvZXRjL3NlY2NvbXBfcG9saWN5Ci1MT0NBTF9TUkNfRklMRVMgOj0gc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3ItJChUQVJHRVRfQVJDSCkucG9saWN5Ci1pbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCi1lbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKaW5kZXggZjBmNDRmNS4uMzZlMDg0YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCkBAIC0yMSw3ICsyMSw2IEBACiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CkBAIC0zMCw2ICsyOSwxMSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK01lZGlhRXh0cmFjdG9yU2VydmljZTo6TWVkaWFFeHRyYWN0b3JTZXJ2aWNlKCkKKyAgICAgICAgOiBCbk1lZGlhRXh0cmFjdG9yU2VydmljZSgpIHsKKyAgICBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkxvYWRFeHRyYWN0b3JzKCk7Cit9CisKIHNwPElNZWRpYUV4dHJhY3Rvcj4gTWVkaWFFeHRyYWN0b3JTZXJ2aWNlOjptYWtlRXh0cmFjdG9yKAogICAgICAgICBjb25zdCBzcDxJRGF0YVNvdXJjZT4gJnJlbW90ZVNvdXJjZSwgY29uc3QgY2hhciAqbWltZSkgewogICAgIEFMT0dWKCJAQEAgTWVkaWFFeHRyYWN0b3JTZXJ2aWNlOjptYWtlRXh0cmFjdG9yIGZvciAlcyIsIG1pbWUpOwpAQCAtNTUsNiArNTksMTAgQEAKICAgICByZXR1cm4gQ3JlYXRlSURhdGFTb3VyY2VGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogfQogCitzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IE1lZGlhRXh0cmFjdG9yU2VydmljZTo6Z2V0U3VwcG9ydGVkVHlwZXMoKSB7CisgICAgcmV0dXJuIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Z2V0U3VwcG9ydGVkVHlwZXMoKTsKK30KKwogc3RhdHVzX3QgTWVkaWFFeHRyYWN0b3JTZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgewogICAgIHJldHVybiBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmR1bXAoZmQsIGFyZ3MpIHx8IGR1bXBFeHRyYWN0b3JzKGZkLCBhcmdzKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yU2VydmljZS5oIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmgKaW5kZXggOWRmM2VjZC4uYzljZWJjZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmgKQEAgLTI3LDcgKzI3LDcgQEAKIHsKICAgICBmcmllbmQgY2xhc3MgQmluZGVyU2VydmljZTxNZWRpYUV4dHJhY3RvclNlcnZpY2U+OyAgICAvLyBmb3IgTWVkaWFFeHRyYWN0b3JTZXJ2aWNlKCkKIHB1YmxpYzoKLSAgICBNZWRpYUV4dHJhY3RvclNlcnZpY2UoKSA6IEJuTWVkaWFFeHRyYWN0b3JTZXJ2aWNlKCkgeyB9CisgICAgTWVkaWFFeHRyYWN0b3JTZXJ2aWNlKCk7CiAgICAgdmlydHVhbCB+TWVkaWFFeHRyYWN0b3JTZXJ2aWNlKCkgeyB9CiAgICAgdmlydHVhbCB2b2lkIG9uRmlyc3RSZWYoKSB7IH0KIApAQCAtMzcsNiArMzcsOCBAQAogCiAgICAgdmlydHVhbCBzcDxJRGF0YVNvdXJjZT4gbWFrZUlEYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKIAorICAgIHZpcnR1YWwgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBnZXRTdXBwb3J0ZWRUeXBlcygpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3M2E2OTguLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlIgotI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgotCi0jaW5jbHVkZSAiTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWJpbmRlcjo6U3RhdHVzIE1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZTo6bG9hZFBsdWdpbnMoY29uc3QgOjpzdGQ6OnN0cmluZyYgYXBrUGF0aCkgewotICAgIEFMT0dWKCJsb2FkUGx1Z2lucyAlcyIsIGFwa1BhdGguY19zdHIoKSk7Ci0gICAgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpMb2FkUGx1Z2lucyhhcGtQYXRoKTsKLSAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Ci19Ci0KLX0gICAvLyBuYW1lc3BhY2UgbWVkaWEKLX0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmggYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDExNWY2ZC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9NRURJQV9FWFRSQUNUT1JfVVBEQVRFX1NFUlZJQ0VfSAotI2RlZmluZSBBTkRST0lEX01FRElBX0VYVFJBQ1RPUl9VUERBVEVfU0VSVklDRV9ICi0KLSNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQm5NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlCi0gICAgOiBwdWJsaWMgQmluZGVyU2VydmljZTxNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2U+LCBwdWJsaWMgQm5NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UKLXsKLSAgICBmcmllbmQgY2xhc3MgQmluZGVyU2VydmljZTxNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2U+OwotcHVibGljOgotICAgIE1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZSgpIDogQm5NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UoKSB7IH0KLSAgICB2aXJ0dWFsIH5NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UoKSB7IH0KLSAgICBzdGF0aWMgY29uc3QgY2hhciogZ2V0U2VydmljZU5hbWUoKSB7IHJldHVybiAibWVkaWEuZXh0cmFjdG9yLnVwZGF0ZSI7IH0KLSAgICBiaW5kZXI6OlN0YXR1cyBsb2FkUGx1Z2lucyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBhcGtQYXRoKTsKLX07Ci0KLX0gICAvLyBuYW1lc3BhY2UgbWVkaWEKLX0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFORFJPSURfTUVESUFfRVhUUkFDVE9SX1VQREFURV9TRVJWSUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL21haW5fZXh0cmFjdG9yc2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9tYWluX2V4dHJhY3RvcnNlcnZpY2UuY3BwCmluZGV4IDhkMzM1OWEuLjNjNDEyNWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL21haW5fZXh0cmFjdG9yc2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvbWFpbl9leHRyYWN0b3JzZXJ2aWNlLmNwcApAQCAtMjksMTYgKzI5LDE0IEBACiAjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgogCiAvLyBmcm9tIExPQ0FMX0NfSU5DTFVERVMKLSNpbmNsdWRlICJJY3VVdGlscy5oIgogI2luY2x1ZGUgIk1lZGlhRXh0cmFjdG9yU2VydmljZS5oIgotI2luY2x1ZGUgIk1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5oIgogI2luY2x1ZGUgIk1lZGlhVXRpbHMuaCIKICNpbmNsdWRlICJtaW5pamFpbC5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAogc3RhdGljIGNvbnN0IGNoYXIga1N5c3RlbVNlY2NvbXBQb2xpY3lQYXRoW10gPQotICAgICAgICAiL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3IucG9saWN5IjsKKyAgICAgICAgIi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhL2V0Yy9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci5wb2xpY3kiOwogc3RhdGljIGNvbnN0IGNoYXIga1ZlbmRvclNlY2NvbXBQb2xpY3lQYXRoW10gPQogICAgICAgICAiL3ZlbmRvci9ldGMvc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3IucG9saWN5IjsKIApAQCAtNTksMTggKzU3LDExIEBACiAKICAgICBTZXRVcE1pbmlqYWlsKGtTeXN0ZW1TZWNjb21wUG9saWN5UGF0aCwga1ZlbmRvclNlY2NvbXBQb2xpY3lQYXRoKTsKIAotICAgIEluaXRpYWxpemVJY3VPckRpZSgpOwotCiAgICAgc3RyY3B5KGFyZ3ZbMF0sICJtZWRpYS5leHRyYWN0b3IiKTsKICAgICBzcDxQcm9jZXNzU3RhdGU+IHByb2MoUHJvY2Vzc1N0YXRlOjpzZWxmKCkpOwogICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKICAgICBNZWRpYUV4dHJhY3RvclNlcnZpY2U6Omluc3RhbnRpYXRlKCk7CiAKLSAgICBzdGQ6OnN0cmluZyB2YWx1ZSA9IGJhc2U6OkdldFByb3BlcnR5KCJyby5idWlsZC50eXBlIiwgInVua25vd24iKTsKLSAgICBpZiAodmFsdWUgPT0gInVzZXJkZWJ1ZyIgfHwgdmFsdWUgPT0gImVuZyIpIHsKLSAgICAgICAgbWVkaWE6Ok1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZTo6aW5zdGFudGlhdGUoKTsKLSAgICB9Ci0KICAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+am9pblRocmVhZFBvb2woKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLWFybS5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci1hcm0ucG9saWN5CmluZGV4IDg3MDE4ZWQuLjk2NGFjZjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLWFybS5wb2xpY3kKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3Ivc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3ItYXJtLnBvbGljeQpAQCAtMTQsNiArMTQsNyBAQAogc2V0cHJpb3JpdHk6IDEKIHNpZ2FsdHN0YWNrOiAxCiBvcGVuYXQ6IDEKK29wZW46IDEKIGNsb25lOiAxCiByZWFkOiAxCiBjbG9ja19nZXR0aW1lOiAxCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci1hcm02NC5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci1hcm02NC5wb2xpY3kKaW5kZXggZDcwZTI3Yi4uZTZjNjc2YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3Ivc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3ItYXJtNjQucG9saWN5CisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLWFybTY0LnBvbGljeQpAQCAtNDAsNCArNDAsNyBAQAogcHJlYWQ2NDogMQogbXJlbWFwOiAxCiAKKyMgUmVxdWlyZWQgYnkgU2FuaXRpemVycworc2NoZWRfeWllbGQ6IDEKKwogQGluY2x1ZGUgL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC5hcm02NC5wb2xpY3kKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLXg4Ni5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci14ODYucG9saWN5CmluZGV4IGQ3MzliYTEuLjU2YWQ4ZGYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLXg4Ni5wb2xpY3kKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3Ivc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3IteDg2LnBvbGljeQpAQCAtMTEsNiArMTEsNyBAQAogbW1hcDI6IDEKIG1hZHZpc2U6IDEKIG9wZW5hdDogMQorb3BlbjogMQogY2xvY2tfZ2V0dGltZTogMQogd3JpdGV2OiAxCiBicms6IDEKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLXg4Nl82NC5wb2xpY3kgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci14ODZfNjQucG9saWN5Cm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKaW5kZXggNjNjNzc4MC4uNjA3YTAzZQotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci14ODZfNjQucG9saWN5CisrKyBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLXg4Nl82NC5wb2xpY3kKQEAgLTExLDYgKzExLDcgQEAKIG1tYXA6IDEKIG1hZHZpc2U6IDEKIG9wZW5hdDogMQorb3BlbjogMQogY2xvY2tfZ2V0dGltZTogMQogd3JpdGV2OiAxCiBicms6IDEKQEAgLTIxLDYgKzIyLDggQEAKIGdldHVpZDogMQogc2V0cHJpb3JpdHk6IDEKIHNpZ2FsdHN0YWNrOiAxCitmc3RhdDogMQorZnN0YXRmczogMQogbmV3ZnN0YXRhdDogMQogcmVzdGFydF9zeXNjYWxsOiAxCiBleGl0OiAxCkBAIC0zMCwyOCArMzMsMjEgQEAKIHNjaGVkX3NldHNjaGVkdWxlcjogMQogZ2V0cmxpbWl0OiAxCiBuYW5vc2xlZXA6IDEKK2dldHJhbmRvbTogMQorCisjIGZvciBkeW5hbWljYWxseSBsb2FkaW5nIGV4dHJhY3RvcnMKK2dldGRlbnRzNjQ6IDEKK3JlYWRsaW5rYXQ6IDEKK3ByZWFkNjQ6IDEKK21yZW1hcDogMQogCiAjIGZvciBGaWxlU291cmNlCiByZWFkbGlua2F0OiAxCiAKLSMgZm9yIGF0dGFjaGluZyB0byBkZWJ1Z2dlcmQgb24gcHJvY2VzcyBjcmFzaAotdGdraWxsOiAxCi1zb2NrZXQ6IGFyZzAgPT0gMQotY29ubmVjdDogMQotZmNudGw6IDEKLXJ0X3NpZ3Byb2NtYXNrOiAxCi1ydF9zaWdhY3Rpb246IDEKLXJ0X3Rnc2lncXVldWVpbmZvOiAxCi1nZXRldWlkOiAxCi1nZXRnaWQ6IDEKLWdldGVnaWQ6IDEKLWdldGdyb3VwczogMQotZ2V0ZGVudHM2NDogMQotcGlwZTI6IDEKLXBwb2xsOiAxCi0KICMgUmVxdWlyZWQgYnkgQWRkcmVzc1Nhbml0aXplcgogZ2V0dGlkOiAxCiBzY2hlZF95aWVsZDogMQogZ2V0cGlkOiAxCiBnZXR0aWQ6IDEKKworQGluY2x1ZGUgL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC54ODZfNjQucG9saWN5CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5icAppbmRleCAyOWU2ZGZjLi5iZWU1ZDI1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQuYnAKQEAgLTEwLDcgKzEwLDcgQEAKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJuYmFpbyIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKICAgICAgICAgImxpYm5ibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5jcHAKaW5kZXggMWJlNTU0NC4uOTAyYWY2NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuY3BwCkBAIC0yMCw4ICsyMCw5IEBACiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNhY2hlLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTWVyZ2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KLSNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlICJNZWRpYUxvZ1NlcnZpY2UuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNTMsMjcgKzU0LDI4IEBACiAKIHZvaWQgTWVkaWFMb2dTZXJ2aWNlOjpyZWdpc3RlcldyaXRlcihjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqbmFtZSkKIHsKLSAgICBpZiAoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpICE9IEFJRF9BVURJT1NFUlZFUiB8fCBzaGFyZWQgPT0gMCB8fAorICAgIGlmICghaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSB8fCBzaGFyZWQgPT0gMCB8fAogICAgICAgICAgICAgc2l6ZSA8IGtNaW5TaXplIHx8IHNpemUgPiBrTWF4U2l6ZSB8fCBuYW1lID09IE5VTEwgfHwKICAgICAgICAgICAgIHNoYXJlZC0+c2l6ZSgpIDwgTkJMb2c6OlRpbWVsaW5lOjpzaGFyZWRTaXplKHNpemUpKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgc3A8TkJMb2c6OlJlYWRlcj4gcmVhZGVyKG5ldyBOQkxvZzo6UmVhZGVyKHNoYXJlZCwgc2l6ZSkpOwotICAgIE5CTG9nOjpOYW1lZFJlYWRlciBuYW1lZFJlYWRlcihyZWFkZXIsIG5hbWUpOworICAgIHNwPE5CTG9nOjpSZWFkZXI+IHJlYWRlcihuZXcgTkJMb2c6OlJlYWRlcihzaGFyZWQsIHNpemUsIG5hbWUpKTsgLy8gUmVhZGVyIGhhbmRsZWQgYnkgbWVyZ2VyCisgICAgc3A8TkJMb2c6OkR1bXBSZWFkZXI+IGR1bXBSZWFkZXIobmV3IE5CTG9nOjpEdW1wUmVhZGVyKHNoYXJlZCwgc2l6ZSwgbmFtZSkpOyAvLyBmb3IgZHVtcHN5cwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbU5hbWVkUmVhZGVycy5hZGQobmFtZWRSZWFkZXIpOwotICAgIG1NZXJnZXIuYWRkUmVhZGVyKG5hbWVkUmVhZGVyKTsKKyAgICBtRHVtcFJlYWRlcnMuYWRkKGR1bXBSZWFkZXIpOworICAgIG1NZXJnZXIuYWRkUmVhZGVyKHJlYWRlcik7CiB9CiAKIHZvaWQgTWVkaWFMb2dTZXJ2aWNlOjp1bnJlZ2lzdGVyV3JpdGVyKGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWQpCiB7Ci0gICAgaWYgKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSAhPSBBSURfQVVESU9TRVJWRVIgfHwgc2hhcmVkID09IDApIHsKKyAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkgfHwgc2hhcmVkID09IDApIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU5hbWVkUmVhZGVycy5zaXplKCk7ICkgewotICAgICAgICBpZiAobU5hbWVkUmVhZGVyc1tpXS5yZWFkZXIoKS0+aXNJTWVtb3J5KHNoYXJlZCkpIHsKLSAgICAgICAgICAgIG1OYW1lZFJlYWRlcnMucmVtb3ZlQXQoaSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRHVtcFJlYWRlcnMuc2l6ZSgpOyApIHsKKyAgICAgICAgaWYgKG1EdW1wUmVhZGVyc1tpXS0+aXNJTWVtb3J5KHNoYXJlZCkpIHsKKyAgICAgICAgICAgIG1EdW1wUmVhZGVycy5yZW1vdmVBdChpKTsKKyAgICAgICAgICAgIC8vIFRPRE8gbU1lcmdlci5yZW1vdmVSZWFkZXJzKHNoYXJlZCkKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGkrKzsKICAgICAgICAgfQpAQCAtOTUsMTAgKzk3LDggQEAKIAogc3RhdHVzX3QgTWVkaWFMb2dTZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKLSAgICAvLyBGSVhNRSBtZXJnZSB3aXRoIHNpbWlsYXIgYnV0IG5vdCBpZGVudGljYWwgY29kZSBhdCBzZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAKLSAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0R1bXAoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIik7Ci0gICAgaWYgKCEoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpID09IEFJRF9BVURJT1NFUlZFUiB8fAotICAgICAgICAgICAgUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNEdW1wKSkpIHsKKyAgICBpZiAoIShpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpCisgICAgICAgICAgICB8fCBkdW1wQWxsb3dlZCgpKSkgewogICAgICAgICBkcHJpbnRmKGZkLCAiUGVybWlzc2lvbiBEZW5pYWw6IGNhbid0IGR1bXAgbWVkaWEubG9nIGZyb20gcGlkPSVkLCB1aWQ9JWRcbiIsCiAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAogICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CkBAIC0xMDgsNyArMTA4LDcgQEAKICAgICBpZiAoYXJncy5zaXplKCkgPiAwKSB7CiAgICAgICAgIGNvbnN0IFN0cmluZzggYXJnMChhcmdzWzBdKTsKICAgICAgICAgaWYgKCFzdHJjbXAoYXJnMC5zdHJpbmcoKSwgIi1yIikpIHsKLSAgICAgICAgICAgIC8vIG5lZWRlZCBiZWNhdXNlIG1OYW1lZFJlYWRlcnMgaXMgcHJvdGVjdGVkIGJ5IG1Mb2NrCisgICAgICAgICAgICAvLyBuZWVkZWQgYmVjYXVzZSBtUmVhZGVycyBpcyBwcm90ZWN0ZWQgYnkgbUxvY2sKICAgICAgICAgICAgIGJvb2wgbG9ja2VkID0gZHVtcFRyeUxvY2sobUxvY2spOwogCiAgICAgICAgICAgICAvLyBmYWlsZWQgdG8gbG9jayAtIE1lZGlhTG9nU2VydmljZSBpcyBwcm9iYWJseSBkZWFkbG9ja2VkCkBAIC0xMTksMjEgKzExOSwyMiBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlczoiLCByZXN1bHQuc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBUT0RPIHNob3VsZCB3ZSBpbnN0ZWFkIHByb2NlZWQgdG8gbU1lcmdlUmVhZGVyLmR1bXA/IGRvZXMgaXQgbmVlZCBsb2NrPwogICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBuYW1lZFJlYWRlciA6IG1OYW1lZFJlYWRlcnMpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmZHVtcFJlYWRlciA6IG1EdW1wUmVhZGVycykgewogICAgICAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICJcbiVzOlxuIiwgbmFtZWRSZWFkZXIubmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZHByaW50ZihmZCwgIlxuJXM6XG4iLCBkdW1wUmVhZGVyLT5uYW1lKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGR1bXBSZWFkZXItPmR1bXAoZmQsIDAgLyppbmRlbnQqLyk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0koIiVzOiIsIG5hbWVkUmVhZGVyLm5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dJKCIlczoiLCBkdW1wUmVhZGVyLT5uYW1lKCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTWVyZ2VSZWFkZXIuZHVtcChmZCwgYXJncyk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbU1lcmdlUmVhZGVyLmR1bXAoZmQpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmggYi9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuaAppbmRleCBjOTQ1ZDFmLi4yMWRmODk4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuaApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0JpbmRlclNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFMb2dTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTWVyZ2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNTUsNyArNTYsNyBAQAogCiAgICAgTXV0ZXggICAgICAgICAgICAgICBtTG9jazsKIAotICAgIFZlY3RvcjxOQkxvZzo6TmFtZWRSZWFkZXI+IG1OYW1lZFJlYWRlcnM7ICAgLy8gcHJvdGVjdGVkIGJ5IG1Mb2NrCisgICAgVmVjdG9yPHNwPE5CTG9nOjpEdW1wUmVhZGVyPj4gbUR1bXBSZWFkZXJzOyAgIC8vIHByb3RlY3RlZCBieSBtTG9jawogCiAgICAgLy8gRklYTUUgTmVlZCBjb21tZW50cyBvbiBhbGwgb2YgdGhlc2UsIGVzcGVjaWFsbHkgYWJvdXQgbG9ja2luZwogICAgIE5CTG9nOjpTaGFyZWQgKm1NZXJnZXJTaGFyZWQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzMzOWEwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDI2IEBACisKKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJyZXNvdXJjZW1hbmFnZXJzZXJ2aWNlIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlJlc291cmNlTWFuYWdlclNlcnZpY2UuY3BwIiwKKyAgICAgICAgIlNlcnZpY2VMb2cuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWyJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvQW5kcm9pZC5tayBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4MjMwMzYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmNwcCBTZXJ2aWNlTG9nLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYm1lZGlhIGxpYm1lZGlhdXRpbHMgbGliYmluZGVyIGxpYnV0aWxzIGxpYmxvZwotCi1MT0NBTF9NT0RVTEU6PSBsaWJyZXNvdXJjZW1hbmFnZXJzZXJ2aWNlCi0KLUxPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9pbmNsdWRlCi0KLUxPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZTg4MzMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0MSBAQAorLy8gQnVpbGQgdGhlIHVuaXQgdGVzdHMuCitjY190ZXN0IHsKKyAgICBuYW1lOiAiUmVzb3VyY2VNYW5hZ2VyU2VydmljZV90ZXN0IiwKKyAgICBzcmNzOiBbIlJlc291cmNlTWFuYWdlclNlcnZpY2VfdGVzdC5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJyZXNvdXJjZW1hbmFnZXJzZXJ2aWNlIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJTZXJ2aWNlTG9nX3Rlc3QiLAorICAgIHNyY3M6IFsiU2VydmljZUxvZ190ZXN0LmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlicmVzb3VyY2VtYW5hZ2Vyc2VydmljZSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvaW5jbHVkZSIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YWJjZjkyLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLSMgQnVpbGQgdGhlIHVuaXQgdGVzdHMuCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gUmVzb3VyY2VNYW5hZ2VyU2VydmljZV90ZXN0Ci0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gIFJlc291cmNlTWFuYWdlclNlcnZpY2VfdGVzdC5jcHAgXAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgbGliYmluZGVyIFwKLSAgbGlibG9nIFwKLSAgbGlibWVkaWEgXAotICBsaWJyZXNvdXJjZW1hbmFnZXJzZXJ2aWNlIFwKLSAgbGlidXRpbHMgXAotCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIFwKLSAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlciBcCi0KLUxPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCi0KLUxPQ0FMXzMyX0JJVF9PTkxZIDo9IHRydWUKLQotaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IFNlcnZpY2VMb2dfdGVzdAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotICBTZXJ2aWNlTG9nX3Rlc3QuY3BwIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gIGxpYmxvZyBcCi0gIGxpYm1lZGlhIFwKLSAgbGlicmVzb3VyY2VtYW5hZ2Vyc2VydmljZSBcCi0gIGxpYnV0aWxzIFwKLQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gIGZyYW1ld29ya3MvYXYvaW5jbHVkZSBcCi0gIGZyYW1ld29ya3MvYXYvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIgXAotCi1MT0NBTF9DRkxBR1MgKz0gLVdlcnJvciAtV2FsbAotCi1MT0NBTF8zMl9CSVRfT05MWSA6PSB0cnVlCi0KLWluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0NsaWVudFRyYWNrZXIuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvQ2xpZW50VHJhY2tlci5jcHAKaW5kZXggNzI2NGE5Yi4uODU3MjU2MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvQ2xpZW50VHJhY2tlci5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvQ2xpZW50VHJhY2tlci5jcHAKQEAgLTY3LDYgKzY3LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElBQXVkaW9DbGllbnQ+JiBjbGllbnQpIHsKICAgICBBTE9HVigicmVnaXN0ZXJDbGllbnQoKSwgY2FsbGluZyBwaWQgPSAlZCwgZ2V0cGlkKCkgPSAlZFxuIiwgcGlkLCBnZXRwaWQoKSk7CiAKKyAgICBpZiAoY2xpZW50LmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkFBdWRpb0NsaWVudFRyYWNrZXI6OiVzKCkgY2xpZW50IGlzIE5VTEwhIiwgX19mdW5jX18pOworICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjExNjIzMDQ1MyIpOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX05VTEw7CisgICAgfQorCiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOwogICAgIGlmIChtTm90aWZpY2F0aW9uQ2xpZW50cy5jb3VudChwaWQpID09IDApIHsKICAgICAgICAgc3A8Tm90aWZpY2F0aW9uQ2xpZW50PiBub3RpZmljYXRpb25DbGllbnQgPSBuZXcgTm90aWZpY2F0aW9uQ2xpZW50KHBpZCk7CkBAIC0xMDEsNyArMTA3LDcgQEAKIGFhdWRpb19yZXN1bHRfdAogQUF1ZGlvQ2xpZW50VHJhY2tlcjo6cmVnaXN0ZXJDbGllbnRTdHJlYW0ocGlkX3QgcGlkLCBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSkgewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7Ci0gICAgQUxPR1YoInJlZ2lzdGVyQ2xpZW50U3RyZWFtKCVkLCAlcClcbiIsIHBpZCwgc2VydmljZVN0cmVhbS5nZXQoKSk7CisgICAgQUxPR1YoInJlZ2lzdGVyQ2xpZW50U3RyZWFtKCVkLClcbiIsIHBpZCk7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOwogICAgIHNwPE5vdGlmaWNhdGlvbkNsaWVudD4gbm90aWZpY2F0aW9uQ2xpZW50ID0gbU5vdGlmaWNhdGlvbkNsaWVudHNbcGlkXTsKICAgICBpZiAobm90aWZpY2F0aW9uQ2xpZW50ID09IDApIHsKQEAgLTExOCwyNyArMTI0LDIzIEBACiBhYXVkaW9fcmVzdWx0X3QKIEFBdWRpb0NsaWVudFRyYWNrZXI6OnVucmVnaXN0ZXJDbGllbnRTdHJlYW0ocGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZT4gc2VydmljZVN0cmVhbSkgewotICAgIEFMT0dWKCJ1bnJlZ2lzdGVyQ2xpZW50U3RyZWFtKCVkLCAlcClcbiIsIHBpZCwgc2VydmljZVN0cmVhbS5nZXQoKSk7CisgICAgQUxPR1YoInVucmVnaXN0ZXJDbGllbnRTdHJlYW0oJWQsKVxuIiwgcGlkKTsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CiAgICAgYXV0byBpdCA9IG1Ob3RpZmljYXRpb25DbGllbnRzLmZpbmQocGlkKTsKICAgICBpZiAoaXQgIT0gbU5vdGlmaWNhdGlvbkNsaWVudHMuZW5kKCkpIHsKLSAgICAgICAgQUxPR1YoInVucmVnaXN0ZXJDbGllbnRTdHJlYW0oJWQsICVwKSBmb3VuZCBOb3RpZmljYXRpb25DbGllbnRcbiIsCi0gICAgICAgICAgICAgIHBpZCwgc2VydmljZVN0cmVhbS5nZXQoKSk7CisgICAgICAgIEFMT0dWKCJ1bnJlZ2lzdGVyQ2xpZW50U3RyZWFtKCVkLCkgZm91bmQgTm90aWZpY2F0aW9uQ2xpZW50XG4iLCBwaWQpOwogICAgICAgICBpdC0+c2Vjb25kLT51bnJlZ2lzdGVyQ2xpZW50U3RyZWFtKHNlcnZpY2VTdHJlYW0pOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJ1bnJlZ2lzdGVyQ2xpZW50U3RyZWFtKCVkLCAlcCkgbWlzc2luZyBOb3RpZmljYXRpb25DbGllbnRcbiIsCi0gICAgICAgICAgICAgIHBpZCwgc2VydmljZVN0cmVhbS5nZXQoKSk7CisgICAgICAgIEFMT0dFKCJ1bnJlZ2lzdGVyQ2xpZW50U3RyZWFtKCVkLCkgbWlzc2luZyBOb3RpZmljYXRpb25DbGllbnRcbiIsIHBpZCk7CiAgICAgfQogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKIEFBdWRpb0NsaWVudFRyYWNrZXI6Ok5vdGlmaWNhdGlvbkNsaWVudDo6Tm90aWZpY2F0aW9uQ2xpZW50KHBpZF90IHBpZCkKICAgICAgICAgOiBtUHJvY2Vzc0lkKHBpZCkgewotICAgIC8vQUxPR0QoIk5vdGlmaWNhdGlvbkNsaWVudCglZCkgY3JlYXRlZCAlcFxuIiwgcGlkLCB0aGlzKTsKIH0KIAogQUF1ZGlvQ2xpZW50VHJhY2tlcjo6Tm90aWZpY2F0aW9uQ2xpZW50Ojp+Tm90aWZpY2F0aW9uQ2xpZW50KCkgewotICAgIC8vQUxPR0QoIn5Ob3RpZmljYXRpb25DbGllbnQoKSBkZXN0cm95ZWQgJXBcbiIsIHRoaXMpOwogfQogCiBpbnQzMl90IEFBdWRpb0NsaWVudFRyYWNrZXI6Ok5vdGlmaWNhdGlvbkNsaWVudDo6Z2V0U3RyZWFtQ291bnQoKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmNwcAppbmRleCAwNGZlZTEzLi5hMWZjMGVhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5jcHAKQEAgLTEwOCw3ICsxMDgsNyBAQAogICAgICAgICBjb25zdCBBQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uKSB7CiAgICAgc3A8QUF1ZGlvU2VydmljZUVuZHBvaW50PiBlbmRwb2ludDsKICAgICBtRXhjbHVzaXZlU2VhcmNoQ291bnQrKzsKLSAgICBmb3IgKGNvbnN0IGF1dG8gZXAgOiBtRXhjbHVzaXZlU3RyZWFtcykgeworICAgIGZvciAoY29uc3QgYXV0byYgZXAgOiBtRXhjbHVzaXZlU3RyZWFtcykgewogICAgICAgICBpZiAoZXAtPm1hdGNoZXMoY29uZmlndXJhdGlvbikpIHsKICAgICAgICAgICAgIG1FeGNsdXNpdmVGb3VuZENvdW50Kys7CiAgICAgICAgICAgICBlbmRwb2ludCA9IGVwOwpAQCAtMTI2LDcgKzEyNiw3IEBACiAgICAgICAgIGNvbnN0IEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24pIHsKICAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ+IGVuZHBvaW50OwogICAgIG1TaGFyZWRTZWFyY2hDb3VudCsrOwotICAgIGZvciAoY29uc3QgYXV0byBlcCAgOiBtU2hhcmVkU3RyZWFtcykgeworICAgIGZvciAoY29uc3QgYXV0byYgZXAgIDogbVNoYXJlZFN0cmVhbXMpIHsKICAgICAgICAgaWYgKGVwLT5tYXRjaGVzKGNvbmZpZ3VyYXRpb24pKSB7CiAgICAgICAgICAgICBtU2hhcmVkRm91bmRDb3VudCsrOwogICAgICAgICAgICAgZW5kcG9pbnQgPSBlcDsKQEAgLTE0MCw5ICsxNDAsOCBAQAogfQogCiBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6b3BlbkVuZHBvaW50KEFBdWRpb1NlcnZpY2UgJmF1ZGlvU2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHNoYXJpbmdNb2RlKSB7Ci0gICAgaWYgKHNoYXJpbmdNb2RlID09IEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSB7CisgICAgaWYgKHJlcXVlc3QuZ2V0Q29uc3RhbnRDb25maWd1cmF0aW9uKCkuZ2V0U2hhcmluZ01vZGUoKSA9PSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSkgewogICAgICAgICByZXR1cm4gb3BlbkV4Y2x1c2l2ZUVuZHBvaW50KGF1ZGlvU2VydmljZSwgcmVxdWVzdCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIG9wZW5TaGFyZWRFbmRwb2ludChhdWRpb1NlcnZpY2UsIHJlcXVlc3QpOwpAQCAtMTczLDcgKzE3Miw3IEBACiAKICAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGVuZHBvaW50LT5vcGVuKHJlcXVlc3QpOwogICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgQUxPR0UoIm9wZW5FeGNsdXNpdmVFbmRwb2ludCgpLCBvcGVuIGZhaWxlZCIpOworICAgICAgICAgICAgQUxPR1YoIm9wZW5FeGNsdXNpdmVFbmRwb2ludCgpLCBvcGVuIGZhaWxlZCIpOwogICAgICAgICAgICAgZW5kcG9pbnQuY2xlYXIoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1FeGNsdXNpdmVTdHJlYW1zLnB1c2hfYmFjayhlbmRwb2ludE1NYXApOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuaAppbmRleCAxOTNiZGVlLi5iYTE3ODUzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuaApAQCAtNTYsOCArNTYsNyBAQAogICAgICAqIEByZXR1cm4gZW5kcG9pbnQgb3IgbnVsbAogICAgICAqLwogICAgIGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gb3BlbkVuZHBvaW50KGFuZHJvaWQ6OkFBdWRpb1NlcnZpY2UgJmF1ZGlvU2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHNoYXJpbmdNb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpOwogCiAgICAgdm9pZCBjbG9zZUVuZHBvaW50KGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gc2VydmljZUVuZHBvaW50KTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvTWl4ZXIuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvTWl4ZXIuY3BwCmluZGV4IGIwMzE4ODguLjFjMDNiN2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb01peGVyLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9NaXhlci5jcHAKQEAgLTk5LDcgKzk5LDcgQEAKICAgICAgICAgfQogICAgICAgICBwYXJ0SW5kZXgrKzsKICAgICB9Ci0gICAgZmlmby0+Z2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmFkdmFuY2VSZWFkSW5kZXgoZnJhbWVzRGVzaXJlZCk7CisgICAgZmlmby0+YWR2YW5jZVJlYWRJbmRleChmcmFtZXNEZXNpcmVkKTsKIAogI2lmIEFBVURJT19NSVhFUl9BVFJBQ0VfRU5BQkxFRAogICAgIEFUUkFDRV9FTkQoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5jcHAKaW5kZXggNmE3MmU1Yi4uZTZhODM3NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKIAogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KIAogI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU2VydmljZU1lc3NhZ2UuaCIKQEAgLTMzLDcgKzM0LDYgQEAKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuaCIKICNpbmNsdWRlICJiaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmgiCi0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87CkBAIC01OCw3ICs1OCw3IEBACiAKICAgICBpZiAoIWR1bXBBbGxvd2VkKCkpIHsKICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7Ci0gICAgICAgIHNzIDw8ICJQZXJtaXNzaW9uIGRlbmlhbDogY2FuJ3QgZHVtcCBBQXVkaW9TZXJ2aWNlIGZyb20gcGlkPSIKKyAgICAgICAgc3MgPDwgIlBlcm1pc3Npb24gRGVuaWFsOiBjYW4ndCBkdW1wIEFBdWRpb1NlcnZpY2UgZnJvbSBwaWQ9IgogICAgICAgICAgICAgICAgIDw8IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSA8PCAiLCB1aWQ9IgogICAgICAgICAgICAgICAgIDw8IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSA8PCAiXG4iOwogICAgICAgICByZXN1bHQgPSBzcy5zdHIoKTsKQEAgLTExOCwyMSArMTE4LDI0IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBpZiBTSEFSRUQgcmVxdWVzdGVkIG9yIGlmIEVYQ0xVU0lWRSBmYWlsZWQKLSAgICBpZiAoc2hhcmluZ01vZGUgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQKLSAgICAgICAgIHx8IChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIgJiYgIXNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCkpIHsKKyAgICAvLyBUcnkgU0hBUkVEIGlmIFNIQVJFRCByZXF1ZXN0ZWQgb3IgaWYgRVhDTFVTSVZFIGZhaWxlZC4KKyAgICBpZiAoc2hhcmluZ01vZGUgPT0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQpIHsKICAgICAgICAgc2VydmljZVN0cmVhbSA9ICBuZXcgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZCgqdGhpcyk7CiAgICAgICAgIHJlc3VsdCA9IHNlcnZpY2VTdHJlYW0tPm9wZW4ocmVxdWVzdCk7CisgICAgfSBlbHNlIGlmIChzZXJ2aWNlU3RyZWFtLmdldCgpID09IG51bGxwdHIgJiYgIXNoYXJpbmdNb2RlTWF0Y2hSZXF1aXJlZCkgeworICAgICAgICBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgbW9kaWZpZWRSZXF1ZXN0ID0gcmVxdWVzdDsKKyAgICAgICAgLy8gT3ZlcndyaXRlIHRoZSBvcmlnaW5hbCBFWENMVVNJVkUgbW9kZSB3aXRoIFNIQVJFRC4KKyAgICAgICAgbW9kaWZpZWRSZXF1ZXN0LmdldENvbmZpZ3VyYXRpb24oKS5zZXRTaGFyaW5nTW9kZShBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCk7CisgICAgICAgIHNlcnZpY2VTdHJlYW0gPSAgbmV3IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQoKnRoaXMpOworICAgICAgICByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5vcGVuKG1vZGlmaWVkUmVxdWVzdCk7CiAgICAgfQogCiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgc2VydmljZVN0cmVhbS5jbGVhcigpOwotICAgICAgICBBTE9HRSgib3BlblN0cmVhbSgpOiBmYWlsZWQsIHJldHVybiAlZCA9ICVzIiwKLSAgICAgICAgICAgICAgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9IGVsc2UgewogICAgICAgICBhYXVkaW9faGFuZGxlX3QgaGFuZGxlID0gbVN0cmVhbVRyYWNrZXIuYWRkU3RyZWFtRm9ySGFuZGxlKHNlcnZpY2VTdHJlYW0uZ2V0KCkpOwotICAgICAgICBBTE9HRCgib3BlblN0cmVhbSgpOiBoYW5kbGUgPSAweCUwOFgiLCBoYW5kbGUpOworICAgICAgICBBTE9HVigib3BlblN0cmVhbSgpOiBoYW5kbGUgPSAweCUwOFgiLCBoYW5kbGUpOwogICAgICAgICBzZXJ2aWNlU3RyZWFtLT5zZXRIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgcGlkX3QgcGlkID0gcmVxdWVzdC5nZXRQcm9jZXNzSWQoKTsKICAgICAgICAgQUF1ZGlvQ2xpZW50VHJhY2tlcjo6Z2V0SW5zdGFuY2UoKS5yZWdpc3RlckNsaWVudFN0cmVhbShwaWQsIHNlcnZpY2VTdHJlYW0pOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5jcHAKaW5kZXggMDM0OTAzNC4uNTUzNzU0ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuY3BwCkBAIC0zOCwxMCArMzgsNiBAQAogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7ICAvLyBUT0RPIGp1c3QgaW1wb3J0IG5hbWVzIG5lZWRlZAogdXNpbmcgbmFtZXNwYWNlIGFhdWRpbzsgICAvLyBUT0RPIGp1c3QgaW1wb3J0IG5hbWVzIG5lZWRlZAogCi1BQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6On5BQXVkaW9TZXJ2aWNlRW5kcG9pbnQoKSB7Ci0gICAgQUxPR0QoIiVzKCVwKSBkZXN0cm95ZWQiLCBfX2Z1bmNfXywgdGhpcyk7Ci19Ci0KIHN0ZDo6c3RyaW5nIEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6ZHVtcCgpIGNvbnN0IHsKICAgICBzdGQ6OnN0cmluZ3N0cmVhbSByZXN1bHQ7CiAKQEAgLTU5LDYgKzU1LDcgQEAKICAgICByZXN1bHQgPDwgIiAgICBEZXZpY2UgSWQ6ICAgICAgICAgICAgIiA8PCBnZXREZXZpY2VJZCgpIDw8ICJcbiI7CiAgICAgcmVzdWx0IDw8ICIgICAgU2FtcGxlIFJhdGU6ICAgICAgICAgICIgPDwgZ2V0U2FtcGxlUmF0ZSgpIDw8ICJcbiI7CiAgICAgcmVzdWx0IDw8ICIgICAgQ2hhbm5lbCBDb3VudDogICAgICAgICIgPDwgZ2V0U2FtcGxlc1BlckZyYW1lKCkgPDwgIlxuIjsKKyAgICByZXN1bHQgPDwgIiAgICBGb3JtYXQ6ICAgICAgICAgICAgICAgIiA8PCBnZXRGb3JtYXQoKSA8PCAiXG4iOwogICAgIHJlc3VsdCA8PCAiICAgIEZyYW1lcyBQZXIgQnVyc3Q6ICAgICAiIDw8IG1GcmFtZXNQZXJCdXJzdCA8PCAiXG4iOwogICAgIHJlc3VsdCA8PCAiICAgIFVzYWdlOiAgICAgICAgICAgICAgICAiIDw8IGdldFVzYWdlKCkgPDwgIlxuIjsKICAgICByZXN1bHQgPDwgIiAgICBDb250ZW50VHlwZTogICAgICAgICAgIiA8PCBnZXRDb250ZW50VHlwZSgpIDw8ICJcbiI7CkBAIC02OCw3ICs2NSw3IEBACiAgICAgcmVzdWx0IDw8ICIgICAgQ29ubmVjdGVkOiAgICAgICAgICAgICIgPDwgbUNvbm5lY3RlZC5sb2FkKCkgPDwgIlxuIjsKICAgICByZXN1bHQgPDwgIiAgICBSZWdpc3RlcmVkIFN0cmVhbXM6IiA8PCAiXG4iOwogICAgIHJlc3VsdCA8PCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpkdW1wSGVhZGVyKCkgPDwgIlxuIjsKLSAgICBmb3IgKGNvbnN0IGF1dG8gc3RyZWFtIDogbVJlZ2lzdGVyZWRTdHJlYW1zKSB7CisgICAgZm9yIChjb25zdCBhdXRvJiBzdHJlYW0gOiBtUmVnaXN0ZXJlZFN0cmVhbXMpIHsKICAgICAgICAgcmVzdWx0IDw8IHN0cmVhbS0+ZHVtcCgpIDw8ICJcbiI7CiAgICAgfQogCkBAIC04MSw3ICs3OCw3IEBACiAvLyBAcmV0dXJuIHRydWUgaWYgc3RyZWFtIGZvdW5kCiBib29sIEFBdWRpb1NlcnZpY2VFbmRwb2ludDo6aXNTdHJlYW1SZWdpc3RlcmVkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydEhhbmRsZSkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrU3RyZWFtcyk7Ci0gICAgZm9yIChjb25zdCBhdXRvIHN0cmVhbSA6IG1SZWdpc3RlcmVkU3RyZWFtcykgeworICAgIGZvciAoY29uc3QgYXV0byYgc3RyZWFtIDogbVJlZ2lzdGVyZWRTdHJlYW1zKSB7CiAgICAgICAgIGlmIChzdHJlYW0tPmdldFBvcnRIYW5kbGUoKSA9PSBwb3J0SGFuZGxlKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQpAQCAtOTIsOCArODksOSBAQAogdm9pZCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6OmRpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtcygpIHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9ja1N0cmVhbXMpOwogICAgIG1Db25uZWN0ZWQuc3RvcmUoZmFsc2UpOwotICAgIGZvciAoY29uc3QgYXV0byBzdHJlYW0gOiBtUmVnaXN0ZXJlZFN0cmVhbXMpIHsKLSAgICAgICAgQUxPR0QoImRpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtcygpIHN0b3AgYW5kIGRpc2Nvbm5lY3QgJXAiLCBzdHJlYW0uZ2V0KCkpOworICAgIGZvciAoY29uc3QgYXV0byYgc3RyZWFtIDogbVJlZ2lzdGVyZWRTdHJlYW1zKSB7CisgICAgICAgIEFMT0dEKCJkaXNjb25uZWN0UmVnaXN0ZXJlZFN0cmVhbXMoKSBzdG9wIGFuZCBkaXNjb25uZWN0IHBvcnQgJWQiLAorICAgICAgICAgICAgICBzdHJlYW0tPmdldFBvcnRIYW5kbGUoKSk7CiAgICAgICAgIHN0cmVhbS0+c3RvcCgpOwogICAgICAgICBzdHJlYW0tPmRpc2Nvbm5lY3QoKTsKICAgICB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5oCmluZGV4IDI1M2YyOTAuLmEyZjY2YTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5oCkBAIC00MSw3ICs0MSw3IEBACiAgICAgICAgICwgcHVibGljIEFBdWRpb1N0cmVhbVBhcmFtZXRlcnMgewogcHVibGljOgogCi0gICAgdmlydHVhbCB+QUF1ZGlvU2VydmljZUVuZHBvaW50KCk7CisgICAgdmlydHVhbCB+QUF1ZGlvU2VydmljZUVuZHBvaW50KCkgPSBkZWZhdWx0OwogCiAgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBkdW1wKCkgY29uc3Q7CiAKQEAgLTYxLDcgKzYxLDcgQEAKIAogICAgIHZpcnR1YWwgYWF1ZGlvX3Jlc3VsdF90IHN0YXJ0Q2xpZW50KGNvbnN0IGFuZHJvaWQ6OkF1ZGlvQ2xpZW50JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqY2xpZW50SGFuZGxlKSB7Ci0gICAgICAgIEFMT0dEKCJBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6OnN0YXJ0Q2xpZW50KCVwLCAuLi4pIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRSIsICZjbGllbnQpOworICAgICAgICBBTE9HRCgiQUF1ZGlvU2VydmljZUVuZHBvaW50OjpzdGFydENsaWVudCguLi4pIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRSIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOwogICAgIH0KIApAQCAtNzcsNiArNzcsMTMgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpID0gMDsKIAorICAgIC8qKgorICAgICAqIFNldCB0aW1lIHRoYXQgdGhlIGFzc29jaWF0ZWQgZnJhbWUgd2FzIHByZXNlbnRlZCB0byB0aGUgaGFyZHdhcmUuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcG9zaXRpb25GcmFtZXMgcmVjZWl2ZSBwb3NpdGlvbiwgaW5wdXQgdmFsdWUgaXMgaWdub3JlZAorICAgICAqIEBwYXJhbSB0aW1lTmFub3MgcmVjZWl2ZSB0aW1lLCBpbnB1dCB2YWx1ZSBpcyBpZ25vcmVkCisgICAgICogQHJldHVybiBBQVVESU9fT0sgb3IgQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFIG9yIG90aGVyIG5lZ2F0aXZlIGVycm9yCisgICAgICovCiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgZ2V0VGltZXN0YW1wKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpID0gMDsKIAogICAgIGludDMyX3QgZ2V0RnJhbWVzUGVyQnVyc3QoKSBjb25zdCB7CkBAIC0xMTQsNyArMTIxLDcgQEAKICAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggICAgICAgbUxvY2tTdHJlYW1zOwogICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPj4gbVJlZ2lzdGVyZWRTdHJlYW1zOwogCi0gICAgU2ltcGxlRG91YmxlQnVmZmVyPFRpbWVzdGFtcD4gIG1BdG9taWNUaW1lc3RhbXA7CisgICAgU2ltcGxlRG91YmxlQnVmZmVyPFRpbWVzdGFtcD4gIG1BdG9taWNFbmRwb2ludFRpbWVzdGFtcDsKIAogICAgIGFuZHJvaWQ6OkF1ZGlvQ2xpZW50ICAgICBtTW1hcENsaWVudDsgICAvLyBzZXQgaW4gb3BlbiwgdXNlZCBpbiBvcGVuIGFuZCBzdGFydFN0cmVhbQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRDYXB0dXJlLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuY3BwCmluZGV4IGVmYWM3ODguLjM3ZDEwNWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuY3BwCkBAIC04MSw5ICs4MSwxMCBAQAogICAgICAgICB7IC8vIGJyYWNrZXRzIGFyZSBmb3IgbG9ja19ndWFyZAogCiAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQgPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2tTdHJlYW1zKTsKLSAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byBjbGllbnRTdHJlYW0gOiBtUmVnaXN0ZXJlZFN0cmVhbXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoY2xpZW50U3RyZWFtLT5pc1J1bm5pbmcoKSkgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnRTdHJlYW0gOiBtUmVnaXN0ZXJlZFN0cmVhbXMpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2xpZW50U3RyZWFtLT5pc1J1bm5pbmcoKSAmJiAhY2xpZW50U3RyZWFtLT5pc1N1c3BlbmRlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY2xpZW50RnJhbWVzV3JpdHRlbiA9IDA7CisKICAgICAgICAgICAgICAgICAgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZD4gc3RyZWFtU2hhcmVkID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkICo+KGNsaWVudFN0cmVhbS5nZXQoKSk7CiAKQEAgLTEwMiw3ICsxMDMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbVNoYXJlZC0+c2V0VGltZXN0YW1wUG9zaXRpb25PZmZzZXQocG9zaXRpb25PZmZzZXQpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXMgdGhlIGJ1ZmZlciB0b28gZnVsbCB0byB3cml0ZSBhIGJ1cnN0PwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWZvLT5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKSA8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpZm8tPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCkgPAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RnJhbWVzUGVyQnVyc3QoKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TaGFyZWQtPmluY3JlbWVudFhSdW5Db3VudCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuY3BwCmluZGV4IGY5ZTIxZmIuLmIwNWJhYTQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAuY3BwCkBAIC03Nyw5ICs3Nyw2IEBACiAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWc7CiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZDsKIAotICAgIGludDMyX3QgYnVyc3RNaW5NaWNyb3MgPSBBQXVkaW9Qcm9wZXJ0eV9nZXRIYXJkd2FyZUJ1cnN0TWluTWljcm9zKCk7Ci0gICAgaW50MzJfdCBidXJzdE1pY3JvcyA9IDA7Ci0KICAgICBjb3B5RnJvbShyZXF1ZXN0LmdldENvbnN0YW50Q29uZmlndXJhdGlvbigpKTsKIAogICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24gPSBnZXREaXJlY3Rpb24oKTsKQEAgLTkzLDE2ICs5MCwxNiBAQAogICAgIGNvbnN0IGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IChkaXJlY3Rpb24gPT0gQUFVRElPX0RJUkVDVElPTl9JTlBVVCkKICAgICAgICAgICAgID8gQUF1ZGlvQ29udmVydF9pbnB1dFByZXNldFRvQXVkaW9Tb3VyY2UoZ2V0SW5wdXRQcmVzZXQoKSkKICAgICAgICAgICAgIDogQVVESU9fU09VUkNFX0RFRkFVTFQ7CisgICAgY29uc3QgYXVkaW9fZmxhZ3NfbWFza190IGZsYWdzID0gQVVESU9fRkxBR19MT1dfTEFURU5DWSB8CisgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2FsbG93Q2FwdHVyZVBvbGljeVRvQXVkaW9GbGFnc01hc2soZ2V0QWxsb3dlZENhcHR1cmVQb2xpY3koKSk7CiAKICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHsKICAgICAgICAgICAgIC5jb250ZW50X3R5cGUgPSBjb250ZW50VHlwZSwKICAgICAgICAgICAgIC51c2FnZSA9IHVzYWdlLAogICAgICAgICAgICAgLnNvdXJjZSA9IHNvdXJjZSwKLSAgICAgICAgICAgIC5mbGFncyA9IEFVRElPX0ZMQUdfTE9XX0xBVEVOQ1ksCisgICAgICAgICAgICAuZmxhZ3MgPSBmbGFncywKICAgICAgICAgICAgIC50YWdzID0gIiIKICAgICB9OwotICAgIEFMT0dEKCIlcyglcCkgTU1BUCBhdHRyaWJ1dGVzLnVzYWdlID0gJWQsIGNvbnRlbnRfdHlwZSA9ICVkLCBzb3VyY2UgPSAlZCIsCi0gICAgICAgICAgX19mdW5jX18sIHRoaXMsIGF0dHJpYnV0ZXMudXNhZ2UsIGF0dHJpYnV0ZXMuY29udGVudF90eXBlLCBhdHRyaWJ1dGVzLnNvdXJjZSk7CiAKICAgICBtTW1hcENsaWVudC5jbGllbnRVaWQgPSByZXF1ZXN0LmdldFVzZXJJZCgpOwogICAgIG1NbWFwQ2xpZW50LmNsaWVudFBpZCA9IHJlcXVlc3QuZ2V0UHJvY2Vzc0lkKCk7CkBAIC0xMTEsMTEgKzEwOCwxMSBAQAogICAgIG1SZXF1ZXN0ZWREZXZpY2VJZCA9IGRldmljZUlkID0gZ2V0RGV2aWNlSWQoKTsKIAogICAgIC8vIEZpbGwgaW4gY29uZmlnCi0gICAgYWF1ZGlvX2Zvcm1hdF90IGFhdWRpb0Zvcm1hdCA9IGdldEZvcm1hdCgpOwotICAgIGlmIChhYXVkaW9Gb3JtYXQgPT0gQUFVRElPX1VOU1BFQ0lGSUVEIHx8IGFhdWRpb0Zvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICBhYXVkaW9Gb3JtYXQgPSBBQVVESU9fRk9STUFUX1BDTV9JMTY7CisgICAgYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQgPSBnZXRGb3JtYXQoKTsKKyAgICBpZiAoYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX0RFRkFVTFQgfHwgYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgICAgICBhdWRpb0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgIH0KLSAgICBjb25maWcuZm9ybWF0ID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWREYXRhRm9ybWF0KGFhdWRpb0Zvcm1hdCk7CisgICAgY29uZmlnLmZvcm1hdCA9IGF1ZGlvRm9ybWF0OwogCiAgICAgaW50MzJfdCBhYXVkaW9TYW1wbGVSYXRlID0gZ2V0U2FtcGxlUmF0ZSgpOwogICAgIGlmIChhYXVkaW9TYW1wbGVSYXRlID09IEFBVURJT19VTlNQRUNJRklFRCkgewpAQCAtMTYzLDEyICsxNjAsMTQgQEAKICAgICBBTE9HRCgiJXMoKSBtTWFwQ2xpZW50LnVpZCA9ICVkLCBwaWQgPSAlZCA9PiBwb3J0SGFuZGxlID0gJWRcbiIsCiAgICAgICAgICAgX19mdW5jX18sIG1NbWFwQ2xpZW50LmNsaWVudFVpZCwgIG1NbWFwQ2xpZW50LmNsaWVudFBpZCwgbVBvcnRIYW5kbGUpOwogICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzKCkgb3Blbk1tYXBTdHJlYW0oKSByZXR1cm5lZCBzdGF0dXMgJWQiLCAgX19mdW5jX18sIHN0YXR1cyk7CisgICAgICAgIC8vIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgcmVzb3VyY2UgaXMgYnVzeSBvciB0aGUgY29uZmlnIGRvZXMKKyAgICAgICAgLy8gbm90IG1hdGNoIHRoZSBoYXJkd2FyZS4KKyAgICAgICAgQUxPR0QoIiVzKCkgLSBvcGVuTW1hcFN0cmVhbSgpIHJldHVybmVkIHN0YXR1cyAlZCIsICBfX2Z1bmNfXywgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKICAgICB9CiAKICAgICBpZiAoZGV2aWNlSWQgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7Ci0gICAgICAgIEFMT0dXKCIlcygpIG9wZW5NbWFwU3RyZWFtKCkgZmFpbGVkIHRvIHNldCBkZXZpY2VJZCIsIF9fZnVuY19fKTsKKyAgICAgICAgQUxPR1coIiVzKCkgLSBvcGVuTW1hcFN0cmVhbSgpIGZhaWxlZCB0byBzZXQgZGV2aWNlSWQiLCBfX2Z1bmNfXyk7CiAgICAgfQogICAgIHNldERldmljZUlkKGRldmljZUlkKTsKIApAQCAtMTg5LDM0ICsxODgsMjcgQEAKICAgICAgICAgbWluU2l6ZUZyYW1lcyA9IEFBVURJT19CVUZGRVJfQ0FQQUNJVFlfTUlOOwogICAgIH0KICAgICBzdGF0dXMgPSBtTW1hcFN0cmVhbS0+Y3JlYXRlTW1hcEJ1ZmZlcihtaW5TaXplRnJhbWVzLCAmbU1tYXBCdWZmZXJpbmZvKTsKKyAgICBib29sIGlzQnVmZmVyU2hhcmVhYmxlID0gbU1tYXBCdWZmZXJpbmZvLmZsYWdzICYgQVVESU9fTU1BUF9BUFBMSUNBVElPTl9TSEFSRUFCTEU7CiAgICAgaWYgKHN0YXR1cyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXMoKSAtIGNyZWF0ZU1tYXBCdWZmZXIoKSBmYWlsZWQgd2l0aCBzdGF0dXMgJWQgJXMiLAogICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RhdHVzLCBzdHJlcnJvcigtc3RhdHVzKSk7CiAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HRCgiJXMoKSBjcmVhdGVNbWFwQnVmZmVyKCkgcmV0dXJuZWQgPSAlZCwgYnVmZmVyX3NpemUgPSAlZCwgYnVyc3Rfc2l6ZSAlZCIKKyAgICAgICAgQUxPR0QoIiVzKCkgY3JlYXRlTW1hcEJ1ZmZlcigpIGJ1ZmZlcl9zaXplID0gJWQgZnIsIGJ1cnN0X3NpemUgJWQgZnIiCiAgICAgICAgICAgICAgICAgICAgICAgIiwgU2hhcmFibGUgRkQ6ICVzIiwKLSAgICAgICAgICAgICAgX19mdW5jX18sIHN0YXR1cywKLSAgICAgICAgICAgICAgYWJzKG1NbWFwQnVmZmVyaW5mby5idWZmZXJfc2l6ZV9mcmFtZXMpLAorICAgICAgICAgICAgICBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgbU1tYXBCdWZmZXJpbmZvLmJ1ZmZlcl9zaXplX2ZyYW1lcywKICAgICAgICAgICAgICAgbU1tYXBCdWZmZXJpbmZvLmJ1cnN0X3NpemVfZnJhbWVzLAotICAgICAgICAgICAgICBtTW1hcEJ1ZmZlcmluZm8uYnVmZmVyX3NpemVfZnJhbWVzIDwgMCA/ICJZZXMiIDogIk5vIik7CisgICAgICAgICAgICAgIGlzQnVmZmVyU2hhcmVhYmxlID8gIlllcyIgOiAiTm8iKTsKICAgICB9CiAKICAgICBzZXRCdWZmZXJDYXBhY2l0eShtTW1hcEJ1ZmZlcmluZm8uYnVmZmVyX3NpemVfZnJhbWVzKTsKLSAgICAvLyBUaGUgYXVkaW8gSEFMIGluZGljYXRlcyBpZiB0aGUgc2hhcmVkIG1lbW9yeSBmZCBjYW4gYmUgc2hhcmVkIG91dHNpZGUgb2YgYXVkaW9zZXJ2ZXIKLSAgICAvLyBieSByZXR1cm5pbmcgYSBuZWdhdGl2ZSBidWZmZXIgc2l6ZQotICAgIGlmIChnZXRCdWZmZXJDYXBhY2l0eSgpIDwgMCkgewotICAgICAgICAvLyBFeGNsdXNpdmUgbW9kZSBjYW4gYmUgdXNlZCBieSBjbGllbnQgb3Igc2VydmljZS4KLSAgICAgICAgc2V0QnVmZmVyQ2FwYWNpdHkoLWdldEJ1ZmZlckNhcGFjaXR5KCkpOwotICAgIH0gZWxzZSB7CisgICAgaWYgKCFpc0J1ZmZlclNoYXJlYWJsZSkgewogICAgICAgICAvLyBFeGNsdXNpdmUgbW9kZSBjYW4gb25seSBiZSB1c2VkIGJ5IHRoZSBzZXJ2aWNlIGJlY2F1c2UgdGhlIEZEIGNhbm5vdCBiZSBzaGFyZWQuCiAgICAgICAgIHVpZF90IGF1ZGlvU2VydmljZVVpZCA9IGdldHVpZCgpOwogICAgICAgICBpZiAoKG1NbWFwQ2xpZW50LmNsaWVudFVpZCAhPSBhdWRpb1NlcnZpY2VVaWQpICYmCiAgICAgICAgICAgICBnZXRTaGFyaW5nTW9kZSgpID09IEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFKSB7Ci0gICAgICAgICAgICAvLyBGYWxsYmFjayBpcyBoYW5kbGVkIGJ5IGNhbGxlciBidXQgaW5kaWNhdGUgd2hhdCBpcyBwb3NzaWJsZSBpbiBjYXNlCi0gICAgICAgICAgICAvLyB0aGlzIGlzIHVzZWQgaW4gdGhlIGZ1dHVyZQotICAgICAgICAgICAgc2V0U2hhcmluZ01vZGUoQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQpOwogICAgICAgICAgICAgQUxPR1coIiVzKCkgLSBleGNsdXNpdmUgRkQgY2Fubm90IGJlIHVzZWQgYnkgY2xpZW50IiwgX19mdW5jX18pOwogICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFOwogICAgICAgICAgICAgZ290byBlcnJvcjsKQEAgLTIzNywyNiArMjI5LDE2IEBACiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogICAgIG1GcmFtZXNQZXJCdXJzdCA9IG1NbWFwQnVmZmVyaW5mby5idXJzdF9zaXplX2ZyYW1lczsKLSAgICBzZXRGb3JtYXQoQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9EYXRhRm9ybWF0KGNvbmZpZy5mb3JtYXQpKTsKKyAgICBzZXRGb3JtYXQoY29uZmlnLmZvcm1hdCk7CiAgICAgc2V0U2FtcGxlUmF0ZShjb25maWcuc2FtcGxlX3JhdGUpOwogCi0gICAgLy8gU2NhbGUgdXAgdGhlIGJ1cnN0IHNpemUgdG8gbWVldCB0aGUgbWluaW11bSBlcXVpdmFsZW50IGluIG1pY3Jvc2Vjb25kcy4KLSAgICAvLyBUaGlzIGlzIHRvIGF2b2lkIHdha2luZyB0aGUgQ1BVIHRvbyBvZnRlbiB3aGVuIHRoZSBIVyBidXJzdCBpcyB2ZXJ5IHNtYWxsCi0gICAgLy8gb3IgYXQgaGlnaCBzYW1wbGUgcmF0ZXMuCi0gICAgZG8gewotICAgICAgICBpZiAoYnVyc3RNaWNyb3MgPiAwKSB7ICAvLyBza2lwIGZpcnN0IGxvb3AKLSAgICAgICAgICAgIG1GcmFtZXNQZXJCdXJzdCAqPSAyOwotICAgICAgICB9Ci0gICAgICAgIGJ1cnN0TWljcm9zID0gbUZyYW1lc1BlckJ1cnN0ICogc3RhdGljX2Nhc3Q8aW50NjRfdD4oMTAwMDAwMCkgLyBnZXRTYW1wbGVSYXRlKCk7Ci0gICAgfSB3aGlsZSAoYnVyc3RNaWNyb3MgPCBidXJzdE1pbk1pY3Jvcyk7Ci0KLSAgICBBTE9HRCgiJXMoKSBvcmlnaW5hbCBidXJzdCA9ICVkLCBtaW5NaWNyb3MgPSAlZCwgdG8gYnVyc3QgPSAlZFxuIiwKLSAgICAgICAgICBfX2Z1bmNfXywgbU1tYXBCdWZmZXJpbmZvLmJ1cnN0X3NpemVfZnJhbWVzLCBidXJzdE1pbk1pY3JvcywgbUZyYW1lc1BlckJ1cnN0KTsKLQogICAgIEFMT0dEKCIlcygpIGFjdHVhbCByYXRlID0gJWQsIGNoYW5uZWxzID0gJWQiCiAgICAgICAgICAgIiwgZGV2aWNlSWQgPSAlZCwgY2FwYWNpdHkgPSAlZFxuIiwKICAgICAgICAgICBfX2Z1bmNfXywgZ2V0U2FtcGxlUmF0ZSgpLCBnZXRTYW1wbGVzUGVyRnJhbWUoKSwgZGV2aWNlSWQsIGdldEJ1ZmZlckNhcGFjaXR5KCkpOwogCisgICAgQUxPR0QoIiVzKCkgZm9ybWF0ID0gMHglMDh4LCBmcmFtZSBzaXplID0gJWQsIGJ1cnN0IHNpemUgPSAlZCIsCisgICAgICAgICAgX19mdW5jX18sIGdldEZvcm1hdCgpLCBjYWxjdWxhdGVCeXRlc1BlckZyYW1lKCksIG1GcmFtZXNQZXJCdXJzdCk7CisKICAgICByZXR1cm4gcmVzdWx0OwogCiBlcnJvcjoKQEAgLTI2Niw3ICsyNDgsNiBAQAogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6Y2xvc2UoKSB7CiAgICAgaWYgKG1NbWFwU3RyZWFtICE9IDApIHsKLSAgICAgICAgQUxPR0QoIiVzKCkgY2xlYXIoKSBlbmRwb2ludCIsIF9fZnVuY19fKTsKICAgICAgICAgLy8gTmVlZHMgdG8gYmUgZXhwbGljaXRseSBjbGVhcmVkIG9yIENUUyB3aWxsIGZhaWwgYnV0IGl0IGlzIG5vdCBjbGVhciB3aHkuCiAgICAgICAgIG1NbWFwU3RyZWFtLmNsZWFyKCk7CiAgICAgICAgIC8vIEFwcGFyZW50bHkgdGhlIGFib3ZlIGNsb3NlIGlzIGFzeW5jaHJvbm91cy4gQW4gYXR0ZW1wdCB0byBvcGVuIGEgbmV3IGRldmljZQpAQCAtMjg4LDcgKzI2OSw3IEBACiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRih0ZW1wSGFuZGxlICE9IG1Qb3J0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCkgcG9ydCBoYW5kbGUgbm90IGV4cGVjdGVkIHRvIGNoYW5nZSBmcm9tICVkIHRvICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydEhhbmRsZSwgdGVtcEhhbmRsZSk7Ci0gICAgQUxPR1YoIiVzKCVwKSBtUG9ydEhhbmRsZSA9ICVkIiwgX19mdW5jX18sIHN0cmVhbS5nZXQoKSwgbVBvcnRIYW5kbGUpOworICAgIEFMT0dWKCIlcygpIG1Qb3J0SGFuZGxlID0gJWQiLCBfX2Z1bmNfXywgbVBvcnRIYW5kbGUpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTMwMywyNiArMjg0LDIwIEBACiAgICAgbUZyYW1lc1RyYW5zZmVycmVkLnJvdW5kVXA2NChnZXRCdWZmZXJDYXBhY2l0eSgpKTsKIAogICAgIC8vIFVzZSB0aGUgcG9ydCBoYW5kbGUgdGhhdCB3YXMgcHJvdmlkZWQgYnkgb3Blbk1tYXBTdHJlYW0oKS4KLSAgICBBTE9HVigiJXMoJXApIG1Qb3J0SGFuZGxlID0gJWQiLCBfX2Z1bmNfXywgc3RyZWFtLmdldCgpLCBtUG9ydEhhbmRsZSk7CisgICAgQUxPR1YoIiVzKCkgbVBvcnRIYW5kbGUgPSAlZCIsIF9fZnVuY19fLCBtUG9ydEhhbmRsZSk7CiAgICAgcmV0dXJuIHN0b3BDbGllbnQobVBvcnRIYW5kbGUpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6c3RhcnRDbGllbnQoY29uc3QgYW5kcm9pZDo6QXVkaW9DbGllbnQmIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpjbGllbnRIYW5kbGUpIHsKICAgICBpZiAobU1tYXBTdHJlYW0gPT0gbnVsbHB0cikgcmV0dXJuIEFBVURJT19FUlJPUl9OVUxMOwotICAgIEFMT0dEKCIlcyglcCh1aWQ9JWQsIHBpZD0lZCkpIiwgX19mdW5jX18sICZjbGllbnQsIGNsaWVudC5jbGllbnRVaWQsIGNsaWVudC5jbGllbnRQaWQpOwotICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgb3JpZ2luYWxIYW5kbGUgPSAgKmNsaWVudEhhbmRsZTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtTW1hcFN0cmVhbS0+c3RhcnQoY2xpZW50LCBjbGllbnRIYW5kbGUpOwotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChzdGF0dXMpOwotICAgIEFMT0dEKCIlcygpICwgcG9ydEhhbmRsZSAlZCA9PiAlZCwgcmV0dXJucyAlZCIsIF9fZnVuY19fLCBvcmlnaW5hbEhhbmRsZSwgKmNsaWVudEhhbmRsZSwgcmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChzdGF0dXMpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUDo6c3RvcENsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IGNsaWVudEhhbmRsZSkgewotICAgIEFMT0dEKCIlcyhwb3J0SGFuZGxlID0gJWQpLCBjYWxsZWQiLCBfX2Z1bmNfXywgY2xpZW50SGFuZGxlKTsKICAgICBpZiAobU1tYXBTdHJlYW0gPT0gbnVsbHB0cikgcmV0dXJuIEFBVURJT19FUlJPUl9OVUxMOwogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChtTW1hcFN0cmVhbS0+c3RvcChjbGllbnRIYW5kbGUpKTsKLSAgICBBTE9HRCgiJXMocG9ydEhhbmRsZSA9ICVkKSwgcmV0dXJucyAlZCIsIF9fZnVuY19fLCBjbGllbnRIYW5kbGUsIHJlc3VsdCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMzc1LDE1ICszNTAsMTUgQEAKICAgICAvLyBUT0RPIERvIHdlIHJlYWxseSBuZWVkIGEgZGlmZmVyZW50IHZvbHVtZSBmb3IgZWFjaCBjaGFubmVsPwogICAgIC8vIFdlIGdldCBjYWxsZWQgd2l0aCBhbiBhcnJheSBmaWxsZWQgd2l0aCBhIHNpbmdsZSB2YWx1ZSEKICAgICBmbG9hdCB2b2x1bWUgPSB2YWx1ZXNbMF07Ci0gICAgQUxPR0QoIiVzKCVwKSB2b2x1bWVbMF0gPSAlZiIsIF9fZnVuY19fLCB0aGlzLCB2b2x1bWUpOworICAgIEFMT0dEKCIlcygpIHZvbHVtZVswXSA9ICVmIiwgX19mdW5jX18sIHZvbHVtZSk7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2tTdHJlYW1zKTsKLSAgICBmb3IoY29uc3QgYXV0byBzdHJlYW0gOiBtUmVnaXN0ZXJlZFN0cmVhbXMpIHsKKyAgICBmb3IoY29uc3QgYXV0byYgc3RyZWFtIDogbVJlZ2lzdGVyZWRTdHJlYW1zKSB7CiAgICAgICAgIHN0cmVhbS0+b25Wb2x1bWVDaGFuZ2VkKHZvbHVtZSk7CiAgICAgfQogfTsKIAogdm9pZCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpvblJvdXRpbmdDaGFuZ2VkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIHsKLSAgICBBTE9HRCgiJXMoJXApIGNhbGxlZCB3aXRoIGRldiAlZCwgb2xkID0gJWQiLCBfX2Z1bmNfXywgdGhpcywgZGV2aWNlSWQsIGdldERldmljZUlkKCkpOworICAgIEFMT0dEKCIlcygpIGNhbGxlZCB3aXRoIGRldiAlZCwgb2xkID0gJWQiLCBfX2Z1bmNfXywgZGV2aWNlSWQsIGdldERldmljZUlkKCkpOwogICAgIGlmIChnZXREZXZpY2VJZCgpICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUgICYmIGdldERldmljZUlkKCkgIT0gZGV2aWNlSWQpIHsKICAgICAgICAgZGlzY29ubmVjdFJlZ2lzdGVyZWRTdHJlYW1zKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmNwcAppbmRleCBhMjc0NDY2Li5iZGE0YjkwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmNwcApAQCAtNDMsMTQgKzQzLDkgQEAKIAogQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheTo6QUF1ZGlvU2VydmljZUVuZHBvaW50UGxheShBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UpCiAgICAgICAgIDogbVN0cmVhbUludGVybmFsUGxheShhdWRpb1NlcnZpY2UsIHRydWUpIHsKLSAgICBBTE9HRCgiJXMoJXApIGNyZWF0ZWQiLCBfX2Z1bmNfXywgdGhpcyk7CiAgICAgbVN0cmVhbUludGVybmFsID0gJm1TdHJlYW1JbnRlcm5hbFBsYXk7CiB9CiAKLUFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXk6On5BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5KCkgewotICAgIEFMT0dEKCIlcyglcCkgZGVzdHJveWVkIiwgX19mdW5jX18sIHRoaXMpOwotfQotCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheTo6b3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkOjpvcGVuKHJlcXVlc3QpOwogICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CkBAIC04NCwxMCArNzksMTQgQEAKICAgICAgICAgICAgIGludDY0X3QgbW1hcEZyYW1lc1dyaXR0ZW4gPSBnZXRTdHJlYW1JbnRlcm5hbCgpLT5nZXRGcmFtZXNXcml0dGVuKCk7CiAKICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZCA8c3RkOjptdXRleD4gbG9jayhtTG9ja1N0cmVhbXMpOwotICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvIGNsaWVudFN0cmVhbSA6IG1SZWdpc3RlcmVkU3RyZWFtcykgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnRTdHJlYW0gOiBtUmVnaXN0ZXJlZFN0cmVhbXMpIHsKICAgICAgICAgICAgICAgICBpbnQ2NF90IGNsaWVudEZyYW1lc1JlYWQgPSAwOwogICAgICAgICAgICAgICAgIGJvb2wgYWxsb3dVbmRlcmZsb3cgPSB0cnVlOwogCisgICAgICAgICAgICAgICAgaWYgKGNsaWVudFN0cmVhbS0+aXNTdXNwZW5kZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gZGVhZCBzdHJlYW0KKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGUgPSBjbGllbnRTdHJlYW0tPmdldFN0YXRlKCk7CiAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09IEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkcpIHsKICAgICAgICAgICAgICAgICAgICAgYWxsb3dVbmRlcmZsb3cgPSBmYWxzZTsgLy8ganVzdCByZWFkIHdoYXQgaXMgYWxyZWFkeSBpbiB0aGUgRklGTwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5oCmluZGV4IGEwYTM4M2MuLjk4MWU0MzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmgKQEAgLTM5LDcgKzM5LDYgQEAKIGNsYXNzIEFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkgOiBwdWJsaWMgQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkIHsKIHB1YmxpYzoKICAgICBleHBsaWNpdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5KGFuZHJvaWQ6OkFBdWRpb1NlcnZpY2UgJmF1ZGlvU2VydmljZSk7Ci0gICAgdmlydHVhbCB+QUF1ZGlvU2VydmljZUVuZHBvaW50UGxheSgpOwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90IG9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSBvdmVycmlkZTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5jcHAKaW5kZXggNjNiOTk4My4uMGE0MTVmZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuY3BwCkBAIC03OCw2ICs3OCw3IEBACiAgICAgc2V0U2FtcGxlc1BlckZyYW1lKG1TdHJlYW1JbnRlcm5hbC0+Z2V0U2FtcGxlc1BlckZyYW1lKCkpOwogICAgIHNldERldmljZUlkKG1TdHJlYW1JbnRlcm5hbC0+Z2V0RGV2aWNlSWQoKSk7CiAgICAgc2V0U2Vzc2lvbklkKG1TdHJlYW1JbnRlcm5hbC0+Z2V0U2Vzc2lvbklkKCkpOworICAgIHNldEZvcm1hdChBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsgLy8gZm9yY2UgZm9yIG1peGVyCiAgICAgbUZyYW1lc1BlckJ1cnN0ID0gbVN0cmVhbUludGVybmFsLT5nZXRGcmFtZXNQZXJCdXJzdCgpOwogCiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTE4MCw4ICsxODEsOCBAQAogLy8gR2V0IHRpbWVzdGFtcCB0aGF0IHdhcyB3cml0dGVuIGJ5IHRoZSByZWFsLXRpbWUgc2VydmljZSB0aHJlYWQsIGVnLiBtaXhlci4KIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQ6OmdldEZyZWVSdW5uaW5nUG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3MpIHsKLSAgICBpZiAobUF0b21pY1RpbWVzdGFtcC5pc1ZhbGlkKCkpIHsKLSAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9IG1BdG9taWNUaW1lc3RhbXAucmVhZCgpOworICAgIGlmIChtQXRvbWljRW5kcG9pbnRUaW1lc3RhbXAuaXNWYWxpZCgpKSB7CisgICAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAgPSBtQXRvbWljRW5kcG9pbnRUaW1lc3RhbXAucmVhZCgpOwogICAgICAgICAqcG9zaXRpb25GcmFtZXMgPSB0aW1lc3RhbXAuZ2V0UG9zaXRpb24oKTsKICAgICAgICAgKnRpbWVOYW5vcyA9IHRpbWVzdGFtcC5nZXROYW5vc2Vjb25kcygpOwogICAgICAgICByZXR1cm4gQUFVRElPX09LOwpAQCAtMTkyLDUgKzE5MywxMyBAQAogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkOjpnZXRUaW1lc3RhbXAoaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zKSB7Ci0gICAgcmV0dXJuIG1TdHJlYW1JbnRlcm5hbC0+Z2V0VGltZXN0YW1wKENMT0NLX01PTk9UT05JQywgcG9zaXRpb25GcmFtZXMsIHRpbWVOYW5vcyk7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IG1TdHJlYW1JbnRlcm5hbC0+Z2V0VGltZXN0YW1wKENMT0NLX01PTk9UT05JQywgcG9zaXRpb25GcmFtZXMsIHRpbWVOYW5vcyk7CisgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURSkgeworICAgICAgICAvLyBnZXRUaW1lc3RhbXAoKSBjYW4gcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFIGlmIHRoZSBzdHJlYW0gaGFzCisgICAgICAgIC8vIG5vdCBjb21wbGV0ZWx5IHN0YXJ0ZWQuIFRoaXMgY2FuIGNhdXNlIGEgcmFjZSBjb25kaXRpb24gdGhhdCBraWxscyB0aGUKKyAgICAgICAgLy8gdGltZXN0YW1wIHNlcnZpY2UgdGhyZWFkLiAgU28gd2UgcmVkdWNlIHRoZSBlcnJvciB0byBhIGxlc3Mgc2VyaW91cyBvbmUKKyAgICAgICAgLy8gdGhhdCBhbGxvd3MgdGhlIHRpbWVzdGFtcCB0aHJlYWQgdG8gY29udGludWUuCisgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmgKaW5kZXggZDY3MTcxMC4uYmZjMTc0NCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmgKQEAgLTUyLDggKzUyLDcgQEAKIAogICAgIGFhdWRpb19yZXN1bHRfdCBnZXRUaW1lc3RhbXAoaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsIGludDY0X3QgKnRpbWVOYW5vcykgb3ZlcnJpZGU7CiAKLSAgICB2aXJ0dWFsIHZvaWQgICAgICAgICAgICAqY2FsbGJhY2tMb29wKCkgPSAwOwotCisgICAgdmlydHVhbCB2b2lkICAgKmNhbGxiYWNrTG9vcCgpID0gMDsKIAogcHJvdGVjdGVkOgogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5jcHAKaW5kZXggOWFmOGFmMy4uODgwYTNkNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmNwcApAQCAtNDMsNyArNDMsNyBAQAogQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlKEFBdWRpb1NlcnZpY2UgJmF1ZGlvU2VydmljZSkKICAgICAgICAgOiBtVXBNZXNzYWdlUXVldWUobnVsbHB0cikKICAgICAgICAgLCBtVGltZXN0YW1wVGhyZWFkKCJBQVRpbWUiKQotICAgICAgICAsIG1BdG9taWNUaW1lc3RhbXAoKQorICAgICAgICAsIG1BdG9taWNTdHJlYW1UaW1lc3RhbXAoKQogICAgICAgICAsIG1BdWRpb1NlcnZpY2UoYXVkaW9TZXJ2aWNlKSB7CiAgICAgbU1tYXBDbGllbnQuY2xpZW50VWlkID0gLTE7CiAgICAgbU1tYXBDbGllbnQuY2xpZW50UGlkID0gLTE7CkBAIC01MSw3ICs1MSw2IEBACiB9CiAKIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjp+QUF1ZGlvU2VydmljZVN0cmVhbUJhc2UoKSB7Ci0gICAgQUxPR0QoIn5BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZSgpIGRlc3Ryb3lpbmcgJXAiLCB0aGlzKTsKICAgICAvLyBJZiB0aGUgc3RyZWFtIGlzIGRlbGV0ZWQgd2hlbiBPUEVOIG9yIGluIHVzZSB0aGVuIGF1ZGlvIHJlc291cmNlcyB3aWxsIGxlYWsuCiAgICAgLy8gVGhpcyB3b3VsZCBpbmRpY2F0ZSBhbiBpbnRlcm5hbCBlcnJvci4gU28gd2Ugd2FudCB0byBmaW5kIHRoaXMgQVNBUC4KICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCEoZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NFRApAQCAtODEsOCArODAsNyBAQAogICAgIHJldHVybiByZXN1bHQuc3RyKCk7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6b3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHNoYXJpbmdNb2RlKSB7CithYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6Om9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSB7CiAgICAgQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyICZtRW5kcG9pbnRNYW5hZ2VyID0gQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOwogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CiAKQEAgLTEwOSwxMCArMTA3LDggQEAKICAgICAgICAgLy8gcmVmZXJlbmNlZCB1bnRpbCB0aGUgc2VydmljZSByZXR1cm5zIGEgaGFuZGxlIHRvIHRoZSBjbGllbnQuCiAgICAgICAgIC8vIFNvIG9ubHkgb25lIHRocmVhZCBjYW4gb3BlbiBhIHN0cmVhbS4KICAgICAgICAgbVNlcnZpY2VFbmRwb2ludCA9IG1FbmRwb2ludE1hbmFnZXIub3BlbkVuZHBvaW50KG1BdWRpb1NlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmluZ01vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCk7CiAgICAgICAgIGlmIChtU2VydmljZUVuZHBvaW50ID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlcygpIG9wZW5FbmRwb2ludCgpIGZhaWxlZCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KQEAgLTE4Myw5ICsxNzksMTAgQEAKICAgICB9CiAKICAgICBzZXRGbG93aW5nKGZhbHNlKTsKKyAgICBzZXRTdXNwZW5kZWQoZmFsc2UpOwogCiAgICAgLy8gU3RhcnQgd2l0aCBmcmVzaCBwcmVzZW50YXRpb24gdGltZXN0YW1wcy4KLSAgICBtQXRvbWljVGltZXN0YW1wLmNsZWFyKCk7CisgICAgbUF0b21pY1N0cmVhbVRpbWVzdGFtcC5jbGVhcigpOwogCiAgICAgbUNsaWVudEhhbmRsZSA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CiAgICAgcmVzdWx0ID0gc3RhcnREZXZpY2UoKTsKQEAgLTI5NCwxNiArMjkxLDIwIEBACiB9CiAKIC8vIGltcGxlbWVudCBSdW5uYWJsZSwgcGVyaW9kaWNhbGx5IHNlbmQgdGltZXN0YW1wcyB0byBjbGllbnQKK19fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJpbnRlZ2VyIikpKQogdm9pZCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6cnVuKCkgewogICAgIEFMT0dEKCIlcygpICVzIGVudGVyaW5nID4+Pj4+Pj4+Pj4+Pj4+IFRJTUVTVEFNUFMiLCBfX2Z1bmNfXywgZ2V0VHlwZVRleHQoKSk7CiAgICAgVGltZXN0YW1wU2NoZWR1bGVyIHRpbWVzdGFtcFNjaGVkdWxlcjsKICAgICB0aW1lc3RhbXBTY2hlZHVsZXIuc2V0QnVyc3RQZXJpb2QobUZyYW1lc1BlckJ1cnN0LCBnZXRTYW1wbGVSYXRlKCkpOwogICAgIHRpbWVzdGFtcFNjaGVkdWxlci5zdGFydChBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpKTsKICAgICBpbnQ2NF90IG5leHRUaW1lID0gdGltZXN0YW1wU2NoZWR1bGVyLm5leHRBYnNvbHV0ZVRpbWUoKTsKKyAgICBpbnQzMl90IGxvb3BDb3VudCA9IDA7CiAgICAgd2hpbGUobVRocmVhZEVuYWJsZWQubG9hZCgpKSB7CisgICAgICAgIGxvb3BDb3VudCsrOwogICAgICAgICBpZiAoQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSA+PSBuZXh0VGltZSkgewogICAgICAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHNlbmRDdXJyZW50VGltZXN0YW1wKCk7CiAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlcygpIHRpbWVzdGFtcCB0aHJlYWQgZ290IHJlc3VsdCA9ICVkIiwgX19mdW5jX18sIHJlc3VsdCk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBuZXh0VGltZSA9IHRpbWVzdGFtcFNjaGVkdWxlci5uZXh0QWJzb2x1dGVUaW1lKCk7CkBAIC0zMTMsNyArMzE0LDggQEAKICAgICAgICAgICAgIEF1ZGlvQ2xvY2s6OnNsZWVwVW50aWxOYW5vVGltZShuZXh0VGltZSk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgQUxPR0QoIiVzKCkgJXMgZXhpdGluZyA8PDw8PDw8PDw8PDw8PCBUSU1FU1RBTVBTIiwgX19mdW5jX18sIGdldFR5cGVUZXh0KCkpOworICAgIEFMT0dEKCIlcygpICVzIGV4aXRpbmcgYWZ0ZXIgJWQgbG9vcHMgPDw8PDw8PDw8PDw8PDwgVElNRVNUQU1QUyIsCisgICAgICAgICAgX19mdW5jX18sIGdldFR5cGVUZXh0KCksIGxvb3BDb3VudCk7CiB9CiAKIHZvaWQgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OmRpc2Nvbm5lY3QoKSB7CkBAIC0zNDEsNiArMzQzLDIwIEBACiAgICAgcmV0dXJuIHdyaXRlVXBNZXNzYWdlUXVldWUoJmNvbW1hbmQpOwogfQogCitib29sIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjppc1VwTWVzc2FnZVF1ZXVlQnVzeSgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXBNZXNzYWdlUXVldWVMb2NrKTsKKyAgICBpZiAobVVwTWVzc2FnZVF1ZXVlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzKCk6IG1VcE1lc3NhZ2VRdWV1ZSBudWxsISAtIHN0cmVhbSBub3Qgb3BlbiIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGludDMyX3QgZnJhbWVzQXZhaWxhYmxlID0gbVVwTWVzc2FnZVF1ZXVlLT5nZXRGaWZvQnVmZmVyKCkKKyAgICAgICAgLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CisgICAgaW50MzJfdCBjYXBhY2l0eSA9IG1VcE1lc3NhZ2VRdWV1ZS0+Z2V0Rmlmb0J1ZmZlcigpCisgICAgICAgIC0+Z2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcygpOworICAgIC8vIElzIGl0IGhhbGYgZnVsbCBvciBtb3JlCisgICAgcmV0dXJuIGZyYW1lc0F2YWlsYWJsZSA+PSAoY2FwYWNpdHkgLyAyKTsKK30KKwogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjp3cml0ZVVwTWVzc2FnZVF1ZXVlKEFBdWRpb1NlcnZpY2VNZXNzYWdlICpjb21tYW5kKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVwTWVzc2FnZVF1ZXVlTG9jayk7CiAgICAgaWYgKG1VcE1lc3NhZ2VRdWV1ZSA9PSBudWxscHRyKSB7CkBAIC0zNDksNyArMzY1LDkgQEAKICAgICB9CiAgICAgaW50MzJfdCBjb3VudCA9IG1VcE1lc3NhZ2VRdWV1ZS0+Z2V0Rmlmb0J1ZmZlcigpLT53cml0ZShjb21tYW5kLCAxKTsKICAgICBpZiAoY291bnQgIT0gMSkgewotICAgICAgICBBTE9HRSgiJXMoKTogUXVldWUgZnVsbC4gRGlkIGNsaWVudCBkaWU/ICVzIiwgX19mdW5jX18sIGdldFR5cGVUZXh0KCkpOworICAgICAgICBBTE9HVygiJXMoKTogUXVldWUgZnVsbC4gRGlkIGNsaWVudCBzdG9wPyBTdXNwZW5kaW5nIHN0cmVhbS4gd2hhdCA9ICV1LCAlcyIsCisgICAgICAgICAgICAgIF9fZnVuY19fLCBjb21tYW5kLT53aGF0LCBnZXRUeXBlVGV4dCgpKTsKKyAgICAgICAgc2V0U3VzcGVuZGVkKHRydWUpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX1dPVUxEX0JMT0NLOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CkBAIC0zNjIsNiArMzgwLDEzIEBACiAKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6c2VuZEN1cnJlbnRUaW1lc3RhbXAoKSB7CiAgICAgQUF1ZGlvU2VydmljZU1lc3NhZ2UgY29tbWFuZDsKKyAgICAvLyBJdCBpcyBub3Qgd29ydGggZmlsbGluZyB1cCB0aGUgcXVldWUgd2l0aCB0aW1lc3RhbXBzLgorICAgIC8vIFRoYXQgY2FuIGNhdXNlIHRoZSBzdHJlYW0gdG8gZ2V0IHN1c3BlbmRlZC4KKyAgICAvLyBTbyBqdXN0IGRyb3AgdGhlIHRpbWVzdGFtcCBpZiB0aGUgcXVldWUgaXMgZ2V0dGluZyBmdWxsLgorICAgIGlmIChpc1VwTWVzc2FnZVF1ZXVlQnVzeSgpKSB7CisgICAgICAgIHJldHVybiBBQVVESU9fT0s7CisgICAgfQorCiAgICAgLy8gU2VuZCBhIHRpbWVzdGFtcCBmb3IgdGhlIGNsb2NrIG1vZGVsLgogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKCZjb21tYW5kLnRpbWVzdGFtcC5wb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tbWFuZC50aW1lc3RhbXAudGltZXN0YW1wKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5oCmluZGV4IGExODE1ZDAuLjA5N2JjNjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmgKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaApAQCAtMjA0LDYgKzIwNCwyMCBAQAogICAgIH0KIAogICAgIC8qKgorICAgICAqIFNldCBmYWxzZSB3aGVuIHRoZSBzdHJlYW0gc2hvdWxkIG5vdCBsb25nZXIgYmUgcHJvY2Vzc2VkLgorICAgICAqIFRoaXMgbWF5IGJlIGNhdXNlZCBieSBhIG1lc3NhZ2UgcXVldWUgb3ZlcmZsb3cuCisgICAgICogU2V0IHRydWUgd2hlbiBzdHJlYW0gaXMgc3RhcnRlZC4KKyAgICAgKiBAcGFyYW0gc3VzcGVuZGVkCisgICAgICovCisgICAgdm9pZCBzZXRTdXNwZW5kZWQoYm9vbCBzdXNwZW5kZWQpIHsKKyAgICAgICAgbVN1c3BlbmRlZCA9IHN1c3BlbmRlZDsKKyAgICB9CisKKyAgICBib29sIGlzU3VzcGVuZGVkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVN1c3BlbmRlZDsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBBdG9taWNhbGx5IGluY3JlbWVudCB0aGUgbnVtYmVyIG9mIGFjdGl2ZSByZWZlcmVuY2VzIHRvIHRoZSBzdHJlYW0gYnkgQUF1ZGlvU2VydmljZS4KICAgICAgKgogICAgICAqIFRoaXMgaXMgY2FsbGVkIHVuZGVyIGEgZ2xvYmFsIGxvY2sgaW4gQUF1ZGlvU3RyZWFtVHJhY2tlci4KQEAgLTI4Nyw3ICszMDEsNyBAQAogICAgIC8vIFRPRE8gcmVuYW1lIG1DbGllbnRIYW5kbGUgdG8gbVBvcnRIYW5kbGUgdG8gYmUgbW9yZSBjb25zaXN0ZW50IHdpdGggQXVkaW9GbGluZ2VyLgogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1DbGllbnRIYW5kbGUgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogCi0gICAgU2ltcGxlRG91YmxlQnVmZmVyPFRpbWVzdGFtcD4gIG1BdG9taWNUaW1lc3RhbXA7CisgICAgU2ltcGxlRG91YmxlQnVmZmVyPFRpbWVzdGFtcD4gIG1BdG9taWNTdHJlYW1UaW1lc3RhbXA7CiAKICAgICBhbmRyb2lkOjpBQXVkaW9TZXJ2aWNlICZtQXVkaW9TZXJ2aWNlOwogCkBAIC0yOTgsMTMgKzMxMiwyNCBAQAogICAgIGFuZHJvaWQ6OndwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gbVNlcnZpY2VFbmRwb2ludFdlYWs7CiAKIHByaXZhdGU6CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHF1ZXVlIGlzIGdldHRpbmcgZnVsbC4KKyAgICAgKi8KKyAgICBib29sIGlzVXBNZXNzYWdlUXVldWVCdXN5KCk7CisKICAgICBhYXVkaW9faGFuZGxlX3QgICAgICAgICBtSGFuZGxlID0gLTE7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbUZsb3dpbmcgPSBmYWxzZTsKIAogICAgIC8vIFRoaXMgaXMgbW9kaWZpZWQgdW5kZXIgYSBnbG9iYWwgbG9jayBpbiBBQXVkaW9TdHJlYW1UcmFja2VyLgogICAgIGludDMyX3QgICAgICAgICAgICAgICAgIG1DYWxsaW5nQ291bnQgPSAwOwogCisgICAgLy8gVGhpcyBpbmRpY2F0ZXMgdGhhdCBhIHN0cmVhbSB0aGF0IGlzIGJlaW5nIHJlZmVyZW5jZWQgYnkgYSBiaW5kZXIgY2FsbCBuZWVkcyB0byBjbG9zZWQuCiAgICAgc3RkOjphdG9taWM8Ym9vbD4gICAgICAgbUNsb3NlTmVlZGVke2ZhbHNlfTsKKworICAgIC8vIFRoaXMgaW5kaWNhdGUgdGhhdCBhIHJ1bm5pbmcgc3RyZWFtIHNob3VsZCBub3QgYmUgcHJvY2Vzc2VkIGJlY2F1c2Ugb2YgYW4gZXJyb3IsCisgICAgLy8gZm9yIGV4YW1wbGUgYSBmdWxsIG1lc3NhZ2UgcXVldWUuIE5vdGUgdGhhdCB0aGlzIGF0b21pYyBpcyB1bnJlbGF0ZWQgdG8gbUNsb3NlTmVlZGVkLgorICAgIHN0ZDo6YXRvbWljPGJvb2w+ICAgICAgIG1TdXNwZW5kZWR7ZmFsc2V9OwogfTsKIAogfSAvKiBuYW1lc3BhY2UgYWF1ZGlvICovCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5jcHAKaW5kZXggYzg0NTMwOS4uODM3YjA4MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmNwcApAQCAtNjQsOCArNjQsMTMgQEAKIAogICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1NTUFQPiBrZWVwKHRoaXMpOwogCi0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFKTsKKyAgICBpZiAocmVxdWVzdC5nZXRDb25zdGFudENvbmZpZ3VyYXRpb24oKS5nZXRTaGFyaW5nTW9kZSgpICE9IEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFKSB7CisgICAgICAgIEFMT0dFKCIlcygpIHNoYXJpbmdNb2RlIG1pc21hdGNoICVkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgIHJlcXVlc3QuZ2V0Q29uc3RhbnRDb25maWd1cmF0aW9uKCkuZ2V0U2hhcmluZ01vZGUoKSk7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5URVJOQUw7CisgICAgfQorCisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKHJlcXVlc3QpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQpAQCAtMTU3LDcgKzE2Miw3IEBACiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IHNlcnZpY2VFbmRwb2ludE1NQVAtPmdldEZyZWVSdW5uaW5nUG9zaXRpb24ocG9zaXRpb25GcmFtZXMsIHRpbWVOYW5vcyk7CiAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKICAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCgqcG9zaXRpb25GcmFtZXMsICp0aW1lTmFub3MpOwotICAgICAgICBtQXRvbWljVGltZXN0YW1wLndyaXRlKHRpbWVzdGFtcCk7CisgICAgICAgIG1BdG9taWNTdHJlYW1UaW1lc3RhbXAud3JpdGUodGltZXN0YW1wKTsKICAgICAgICAgKnBvc2l0aW9uRnJhbWVzID0gdGltZXN0YW1wLmdldFBvc2l0aW9uKCk7CiAgICAgICAgICp0aW1lTmFub3MgPSB0aW1lc3RhbXAuZ2V0TmFub3NlY29uZHMoKTsKICAgICB9IGVsc2UgaWYgKHJlc3VsdCAhPSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEUpIHsKQEAgLTE3OSw4ICsxODQsOCBAQAogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUCAqPihlbmRwb2ludC5nZXQoKSk7CiAKICAgICAvLyBUT0RPIEdldCBwcmVzZW50YXRpb24gdGltZXN0YW1wIGZyb20gdGhlIEhBTAotICAgIGlmIChtQXRvbWljVGltZXN0YW1wLmlzVmFsaWQoKSkgewotICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gbUF0b21pY1RpbWVzdGFtcC5yZWFkKCk7CisgICAgaWYgKG1BdG9taWNTdHJlYW1UaW1lc3RhbXAuaXNWYWxpZCgpKSB7CisgICAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAgPSBtQXRvbWljU3RyZWFtVGltZXN0YW1wLnJlYWQoKTsKICAgICAgICAgKnBvc2l0aW9uRnJhbWVzID0gdGltZXN0YW1wLmdldFBvc2l0aW9uKCk7CiAgICAgICAgICp0aW1lTmFub3MgPSB0aW1lc3RhbXAuZ2V0TmFub3NlY29uZHMoKSArIHNlcnZpY2VFbmRwb2ludE1NQVAtPmdldEhhcmR3YXJlVGltZU9mZnNldE5hbm9zKCk7CiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuY3BwCmluZGV4IDA1YzU3MzUuLjJjYTg0N2EgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuY3BwCkBAIC0xMTEsNyArMTExLDcgQEAKICAgICAgICAgICAgICAgY2FwYWNpdHlJbkZyYW1lcywgTUFYX0ZSQU1FU19QRVJfQlVGRkVSKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgfQotICAgIEFMT0dEKCJjYWxjdWxhdGVCdWZmZXJDYXBhY2l0eSgpIHJlcXVlc3RlZCAlZCBmcmFtZXMsIGFjdHVhbCA9ICVkIiwKKyAgICBBTE9HVigiY2FsY3VsYXRlQnVmZmVyQ2FwYWNpdHkoKSByZXF1ZXN0ZWQgJWQgZnJhbWVzLCBhY3R1YWwgPSAlZCIsCiAgICAgICAgICAgcmVxdWVzdGVkQ2FwYWNpdHlGcmFtZXMsIGNhcGFjaXR5SW5GcmFtZXMpOwogICAgIHJldHVybiBjYXBhY2l0eUluRnJhbWVzOwogfQpAQCAtMTIwLDkgKzEyMCwxNCBAQAogCiAgICAgc3A8QUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZD4ga2VlcCh0aGlzKTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6b3BlbihyZXF1ZXN0LCBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCk7CisgICAgaWYgKHJlcXVlc3QuZ2V0Q29uc3RhbnRDb25maWd1cmF0aW9uKCkuZ2V0U2hhcmluZ01vZGUoKSAhPSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRCkgeworICAgICAgICBBTE9HRSgiJXMoKSBzaGFyaW5nTW9kZSBtaXNtYXRjaCAlZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICByZXF1ZXN0LmdldENvbnN0YW50Q29uZmlndXJhdGlvbigpLmdldFNoYXJpbmdNb2RlKCkpOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVEVSTkFMOworICAgIH0KKworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6b3BlbihyZXF1ZXN0KTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICBBTE9HRSgiJXMoKSByZXR1cm5lZCAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIApAQCAtMTM2LDEwICsxNDEsMTAgQEAKIAogICAgIC8vIElzIHRoZSByZXF1ZXN0IGNvbXBhdGlibGUgd2l0aCB0aGUgc2hhcmVkIGVuZHBvaW50PwogICAgIHNldEZvcm1hdChjb25maWd1cmF0aW9uSW5wdXQuZ2V0Rm9ybWF0KCkpOwotICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEKSB7Ci0gICAgICAgIHNldEZvcm1hdChBQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7Ci0gICAgfSBlbHNlIGlmIChnZXRGb3JtYXQoKSAhPSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICBBTE9HRCgiJXMoKSBtQXVkaW9Gb3JtYXQgPSAlZCwgbmVlZCBGTE9BVCIsIF9fZnVuY19fLCBnZXRGb3JtYXQoKSk7CisgICAgaWYgKGdldEZvcm1hdCgpID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgIHNldEZvcm1hdChBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKKyAgICB9IGVsc2UgaWYgKGdldEZvcm1hdCgpICE9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICAgICAgQUxPR0QoIiVzKCkgYXVkaW9fZm9ybWF0X3QgbUF1ZGlvRm9ybWF0ID0gJWQsIG5lZWQgRkxPQVQiLCBfX2Z1bmNfXywgZ2V0Rm9ybWF0KCkpOwogICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSU5WQUxJRF9GT1JNQVQ7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQpAQCAtMTg1LDkgKzE5MCw2IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBBTE9HRCgiQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6b3BlbigpIGFjdHVhbCByYXRlID0gJWQsIGNoYW5uZWxzID0gJWQsIGRldmljZUlkID0gJWQiLAotICAgICAgICAgIGdldFNhbXBsZVJhdGUoKSwgZ2V0U2FtcGxlc1BlckZyYW1lKCksIGVuZHBvaW50LT5nZXREZXZpY2VJZCgpKTsKLQogICAgIHJlc3VsdCA9IGVuZHBvaW50LT5yZWdpc3RlclN0cmVhbShrZWVwKTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICBnb3RvIGVycm9yOwpAQCAtMjIyLDcgKzIyNCw3IEBACiB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUF1ZGlvRGF0YVF1ZXVlTG9jayk7CiAgICAgaWYgKG1BdWRpb0RhdGFRdWV1ZSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCIlcygpOiBtVXBNZXNzYWdlUXVldWUgbnVsbCEgLSBzdHJlYW0gbm90IG9wZW4iLCBfX2Z1bmNfXyk7CisgICAgICAgIEFMT0dXKCIlcygpOiBtVXBNZXNzYWdlUXVldWUgbnVsbCEgLSBzdHJlYW0gbm90IG9wZW4iLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfTlVMTDsKICAgICB9CiAgICAgLy8gR2F0aGVyIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIHF1ZXVlLgpAQCAtMjMzLDE1ICsyMzUsMTUgQEAKIH0KIAogdm9pZCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjptYXJrVHJhbnNmZXJUaW1lKFRpbWVzdGFtcCAmdGltZXN0YW1wKSB7Ci0gICAgbUF0b21pY1RpbWVzdGFtcC53cml0ZSh0aW1lc3RhbXApOworICAgIG1BdG9taWNTdHJlYW1UaW1lc3RhbXAud3JpdGUodGltZXN0YW1wKTsKIH0KIAogLy8gR2V0IHRpbWVzdGFtcCB0aGF0IHdhcyB3cml0dGVuIGJ5IG1peGVyIG9yIGRpc3RyaWJ1dG9yLgogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6OmdldEZyZWVSdW5uaW5nUG9zaXRpb24oaW50NjRfdCAqcG9zaXRpb25GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3MpIHsKICAgICAvLyBUT0RPIEdldCBwcmVzZW50YXRpb24gdGltZXN0YW1wIGZyb20gdGhlIEhBTAotICAgIGlmIChtQXRvbWljVGltZXN0YW1wLmlzVmFsaWQoKSkgewotICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gbUF0b21pY1RpbWVzdGFtcC5yZWFkKCk7CisgICAgaWYgKG1BdG9taWNTdHJlYW1UaW1lc3RhbXAuaXNWYWxpZCgpKSB7CisgICAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAgPSBtQXRvbWljU3RyZWFtVGltZXN0YW1wLnJlYWQoKTsKICAgICAgICAgKnBvc2l0aW9uRnJhbWVzID0gdGltZXN0YW1wLmdldFBvc2l0aW9uKCk7CiAgICAgICAgICp0aW1lTmFub3MgPSB0aW1lc3RhbXAuZ2V0TmFub3NlY29uZHMoKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19PSzsKQEAgLTI1Nyw3ICsyNTksNyBAQAogICAgIGludDY0X3QgcG9zaXRpb24gPSAwOwogICAgIHNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gZW5kcG9pbnQgPSBtU2VydmljZUVuZHBvaW50V2Vhay5wcm9tb3RlKCk7CiAgICAgaWYgKGVuZHBvaW50ID09IG51bGxwdHIpIHsKLSAgICAgICAgQUxPR0UoIiVzKCkgaGFzIG5vIGVuZHBvaW50IiwgX19mdW5jX18pOworICAgICAgICBBTE9HVygiJXMoKSBoYXMgbm8gZW5kcG9pbnQiLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BbmRyb2lkLm1rCmluZGV4IDU4NGIyZWYuLjNkNWYxNDAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQW5kcm9pZC5tawpAQCAtNTMsNyArNTMsNiBAQAogICAgIGxpYmJpbmRlciBcCiAgICAgbGliY3V0aWxzIFwKICAgICBsaWJtZWRpYXV0aWxzIFwKLSAgICBsaWJzZXJ2aWNldXRpbGl0eSBcCiAgICAgbGlidXRpbHMgXAogICAgIGxpYmxvZwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5icCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMDJmNDgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDU1IEBACisvLyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYnNvdW5kdHJpZ2dlcnNlcnZpY2UiLAorCisgICAgc3JjczogWworICAgICAgICAiU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcCIsCisgICAgICAgICJTb3VuZFRyaWdnZXJIYWxIaWRsLmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJoYXJkd2FyZSIsCisgICAgICAgICJsaWJzb3VuZHRyaWdnZXIiLAorICAgICAgICAibGliYXVkaW9jbGllbnQiLAorICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKworICAgICAgICAibGliaHdiaW5kZXIiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCisgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYXVkaW9oYWwiLAorICAgICAgICAibGliYXVkaW9oYWxfZGVhdGhoYW5kbGVyIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuc291bmR0cmlnZ2VyQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnNvdW5kdHJpZ2dlckAyLjEiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5zb3VuZHRyaWdnZXJAMi4yIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhpZGwubWVtb3J5QDEuMCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWyJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlciJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQzNjY2ZS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1pZmVxICgkKFNPVU5EX1RSSUdHRVJfVVNFX1NUVUJfTU9EVUxFKSwgMSkKLSAgICBpZm5lcSAoJChVU0VfTEVHQUNZX0xPQ0FMX0FVRElPX0hBTCksIHRydWUpCi0gICAgICAgICQoZXJyb3IgUmVxdWlyZXMgYnVpbGRpbmcgd2l0aCBVU0VfTEVHQUNZX0xPQ0FMX0FVRElPX0hBTD10cnVlKQotICAgIGVuZGlmCi0gICAgTE9DQUxfQ0ZMQUdTICs9IC1EU09VTkRfVFJJR0dFUl9VU0VfU1RVQl9NT0RVTEUKLWVuZGlmCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgXAotICAgIFNvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUzo9IFwKLSAgICBsaWJsb2cgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJiaW5kZXIgXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGliaGFyZHdhcmUgXAotICAgIGxpYnNvdW5kdHJpZ2dlciBcCi0gICAgbGliYXVkaW9jbGllbnQgXAotICAgIGxpYnNlcnZpY2V1dGlsaXR5Ci0KLQotaWZlcSAoJChVU0VfTEVHQUNZX0xPQ0FMX0FVRElPX0hBTCksdHJ1ZSkKLSMgbGliaGFyZHdhcmUgY29uZmlndXJhdGlvbgotTE9DQUxfU1JDX0ZJTEVTICs9ICAgICAgICAgICAgICAgXAotICAgIFNvdW5kVHJpZ2dlckhhbExlZ2FjeS5jcHAKLWVsc2UKLSMgVHJlYmxlIGNvbmZpZ3VyYXRpb24KLUxPQ0FMX1NSQ19GSUxFUyArPSAgICAgICAgICAgICAgIFwKLSAgICBTb3VuZFRyaWdnZXJIYWxIaWRsLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IFwKLSAgICBsaWJod2JpbmRlciBcCi0gICAgbGliaGlkbGJhc2UgXAotICAgIGxpYmhpZGxtZW1vcnkgXAotICAgIGxpYmhpZGx0cmFuc3BvcnQgXAotICAgIGxpYmJhc2UgXAotICAgIGxpYmF1ZGlvaGFsIFwKLSAgICBsaWJhdWRpb2hhbF9kZWF0aGhhbmRsZXIgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuc291bmR0cmlnZ2VyQDIuMCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5zb3VuZHRyaWdnZXJAMi4xIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAgXAotICAgIGFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIFwKLSAgICBhbmRyb2lkLmhpZGwubWVtb3J5QDEuMAotZW5kaWYKLQotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlcgotCi1MT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQotCi1MT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgotCi1MT0NBTF9NT0RVTEU6PSBsaWJzb3VuZHRyaWdnZXJzZXJ2aWNlCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmNwcCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmNwcAppbmRleCBhZGYyNTJlLi42OGQ1NGM3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5jcHAKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEhpZGwuY3BwCkBAIC0xNjgsMTggKzE2OCwyMyBAQAogICAgIGludCByZXQ7CiAgICAgU291bmRNb2RlbEhhbmRsZSBoYWxIYW5kbGU7CiAgICAgc3A8VjJfMV9JU291bmRUcmlnZ2VySHc+IHNvdW5kdHJpZ2dlcl8yXzEgPSB0b1NlcnZpY2UyXzEoc291bmR0cmlnZ2VyKTsKKyAgICBzcDxWMl8yX0lTb3VuZFRyaWdnZXJIdz4gc291bmR0cmlnZ2VyXzJfMiA9IHRvU2VydmljZTJfMihzb3VuZHRyaWdnZXIpOwogICAgIGlmIChzb3VuZF9tb2RlbC0+dHlwZSA9PSBTT1VORF9NT0RFTF9UWVBFX0tFWVBIUkFTRSkgewotICAgICAgICBpZiAoIXNvdW5kdHJpZ2dlcl8yXzEpIHsKLSAgICAgICAgICAgIElTb3VuZFRyaWdnZXJIdzo6UGhyYXNlU291bmRNb2RlbCBoYWxTb3VuZE1vZGVsOwotICAgICAgICAgICAgY29udmVydFBocmFzZVNvdW5kTW9kZWxUb0hhbCgmaGFsU291bmRNb2RlbCwgc291bmRfbW9kZWwpOwotICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUhhbExvY2spOwotICAgICAgICAgICAgaGlkbFJldHVybiA9IHNvdW5kdHJpZ2dlci0+bG9hZFBocmFzZVNvdW5kTW9kZWwoCi0gICAgICAgICAgICAgICAgICAgIGhhbFNvdW5kTW9kZWwsCi0gICAgICAgICAgICAgICAgICAgIHRoaXMsIG1vZGVsSWQsIFsmXShpbnQzMl90IHJldHZhbCwgYXV0byByZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHJldHZhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGhhbEhhbmRsZSA9IHJlczsKLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzb3VuZHRyaWdnZXJfMl8yKSB7CisgICAgICAgICAgICBWMl8yX0lTb3VuZFRyaWdnZXJIdzo6UGhyYXNlU291bmRNb2RlbCBoYWxTb3VuZE1vZGVsOworICAgICAgICAgICAgYXV0byByZXN1bHQgPSBjb252ZXJ0UGhyYXNlU291bmRNb2RlbFRvSGFsKCZoYWxTb3VuZE1vZGVsLCBzb3VuZF9tb2RlbCk7CisgICAgICAgICAgICBpZiAocmVzdWx0LmZpcnN0KSB7CisgICAgICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUhhbExvY2spOworICAgICAgICAgICAgICAgIGhpZGxSZXR1cm4gPSBzb3VuZHRyaWdnZXJfMl8yLT5sb2FkUGhyYXNlU291bmRNb2RlbF8yXzEoCisgICAgICAgICAgICAgICAgICAgICAgICBoYWxTb3VuZE1vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgbW9kZWxJZCwgWyZdKGludDMyX3QgcmV0dmFsLCBhdXRvIHJlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHJldHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxIYW5kbGUgPSByZXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzb3VuZHRyaWdnZXJfMl8xKSB7CiAgICAgICAgICAgICBWMl8xX0lTb3VuZFRyaWdnZXJIdzo6UGhyYXNlU291bmRNb2RlbCBoYWxTb3VuZE1vZGVsOwogICAgICAgICAgICAgYXV0byByZXN1bHQgPSBjb252ZXJ0UGhyYXNlU291bmRNb2RlbFRvSGFsKCZoYWxTb3VuZE1vZGVsLCBzb3VuZF9tb2RlbCk7CiAgICAgICAgICAgICBpZiAocmVzdWx0LmZpcnN0KSB7CkBAIC0xOTMsMTggKzE5OCwzMiBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFzb3VuZHRyaWdnZXJfMl8xKSB7Ci0gICAgICAgICAgICBJU291bmRUcmlnZ2VySHc6OlNvdW5kTW9kZWwgaGFsU291bmRNb2RlbDsKLSAgICAgICAgICAgIGNvbnZlcnRTb3VuZE1vZGVsVG9IYWwoJmhhbFNvdW5kTW9kZWwsIHNvdW5kX21vZGVsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIElTb3VuZFRyaWdnZXJIdzo6UGhyYXNlU291bmRNb2RlbCBoYWxTb3VuZE1vZGVsOworICAgICAgICAgICAgY29udmVydFBocmFzZVNvdW5kTW9kZWxUb0hhbCgmaGFsU291bmRNb2RlbCwgc291bmRfbW9kZWwpOwogICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUhhbExvY2spOwotICAgICAgICAgICAgaGlkbFJldHVybiA9IHNvdW5kdHJpZ2dlci0+bG9hZFNvdW5kTW9kZWwoaGFsU291bmRNb2RlbCwKKyAgICAgICAgICAgIGhpZGxSZXR1cm4gPSBzb3VuZHRyaWdnZXItPmxvYWRQaHJhc2VTb3VuZE1vZGVsKAorICAgICAgICAgICAgICAgICAgICBoYWxTb3VuZE1vZGVsLAogICAgICAgICAgICAgICAgICAgICB0aGlzLCBtb2RlbElkLCBbJl0oaW50MzJfdCByZXR2YWwsIGF1dG8gcmVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSByZXR2YWw7CiAgICAgICAgICAgICAgICAgICAgICAgICBoYWxIYW5kbGUgPSByZXM7CiAgICAgICAgICAgICAgICAgICAgIH0pOwotICAgICAgICB9IGVsc2UgeworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHNvdW5kdHJpZ2dlcl8yXzIpIHsKKyAgICAgICAgICAgIFYyXzJfSVNvdW5kVHJpZ2dlckh3OjpTb3VuZE1vZGVsIGhhbFNvdW5kTW9kZWw7CisgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IGNvbnZlcnRTb3VuZE1vZGVsVG9IYWwoJmhhbFNvdW5kTW9kZWwsIHNvdW5kX21vZGVsKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQuZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFsTG9jayk7CisgICAgICAgICAgICAgICAgaGlkbFJldHVybiA9IHNvdW5kdHJpZ2dlcl8yXzItPmxvYWRTb3VuZE1vZGVsXzJfMShoYWxTb3VuZE1vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgbW9kZWxJZCwgWyZdKGludDMyX3QgcmV0dmFsLCBhdXRvIHJlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHJldHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYWxIYW5kbGUgPSByZXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChzb3VuZHRyaWdnZXJfMl8xKSB7CiAgICAgICAgICAgICBWMl8xX0lTb3VuZFRyaWdnZXJIdzo6U291bmRNb2RlbCBoYWxTb3VuZE1vZGVsOwogICAgICAgICAgICAgYXV0byByZXN1bHQgPSBjb252ZXJ0U291bmRNb2RlbFRvSGFsKCZoYWxTb3VuZE1vZGVsLCBzb3VuZF9tb2RlbCk7CiAgICAgICAgICAgICBpZiAocmVzdWx0LmZpcnN0KSB7CkBAIC0yMTcsNiArMjM2LDE1IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBJU291bmRUcmlnZ2VySHc6OlNvdW5kTW9kZWwgaGFsU291bmRNb2RlbDsKKyAgICAgICAgICAgIGNvbnZlcnRTb3VuZE1vZGVsVG9IYWwoJmhhbFNvdW5kTW9kZWwsIHNvdW5kX21vZGVsKTsKKyAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1IYWxMb2NrKTsKKyAgICAgICAgICAgIGhpZGxSZXR1cm4gPSBzb3VuZHRyaWdnZXItPmxvYWRTb3VuZE1vZGVsKGhhbFNvdW5kTW9kZWwsCisgICAgICAgICAgICAgICAgICAgIHRoaXMsIG1vZGVsSWQsIFsmXShpbnQzMl90IHJldHZhbCwgYXV0byByZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHJldHZhbDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbEhhbmRsZSA9IHJlczsKKyAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTI4MiwxNiArMzEwLDIwIEBACiAgICAgbW9kZWwtPm1SZWNvZ25pdGlvbkNvb2tpZSA9IGNvb2tpZTsKIAogICAgIHNwPFYyXzFfSVNvdW5kVHJpZ2dlckh3PiBzb3VuZHRyaWdnZXJfMl8xID0gdG9TZXJ2aWNlMl8xKHNvdW5kdHJpZ2dlcik7CisgICAgc3A8VjJfMl9JU291bmRUcmlnZ2VySHc+IHNvdW5kdHJpZ2dlcl8yXzIgPSB0b1NlcnZpY2UyXzIoc291bmR0cmlnZ2VyKTsKICAgICBSZXR1cm48aW50MzJfdD4gaGlkbFJldHVybigwKTsKIAotICAgIGlmICghc291bmR0cmlnZ2VyXzJfMSkgewotICAgICAgICBJU291bmRUcmlnZ2VySHc6OlJlY29nbml0aW9uQ29uZmlnIGhhbENvbmZpZzsKLSAgICAgICAgY29udmVydFJlY29nbml0aW9uQ29uZmlnVG9IYWwoJmhhbENvbmZpZywgY29uZmlnKTsKLSAgICAgICAgeworICAgIGlmIChzb3VuZHRyaWdnZXJfMl8yKSB7CisgICAgICAgIFYyXzJfSVNvdW5kVHJpZ2dlckh3OjpSZWNvZ25pdGlvbkNvbmZpZyBoYWxDb25maWc7CisgICAgICAgIGF1dG8gcmVzdWx0ID0gY29udmVydFJlY29nbml0aW9uQ29uZmlnVG9IYWwoJmhhbENvbmZpZywgY29uZmlnKTsKKyAgICAgICAgaWYgKHJlc3VsdC5maXJzdCkgewogICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUhhbExvY2spOwotICAgICAgICAgICAgaGlkbFJldHVybiA9IHNvdW5kdHJpZ2dlci0+c3RhcnRSZWNvZ25pdGlvbihtb2RlbC0+bUhhbEhhbmRsZSwgaGFsQ29uZmlnLCB0aGlzLCBoYW5kbGUpOworICAgICAgICAgICAgaGlkbFJldHVybiA9IHNvdW5kdHJpZ2dlcl8yXzItPnN0YXJ0UmVjb2duaXRpb25fMl8xKAorICAgICAgICAgICAgICAgICAgICBtb2RlbC0+bUhhbEhhbmRsZSwgaGFsQ29uZmlnLCB0aGlzLCBoYW5kbGUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICAgICAgfQotICAgIH0gZWxzZSB7CisgICAgfSBlbHNlIGlmIChzb3VuZHRyaWdnZXJfMl8xKSB7CiAgICAgICAgIFYyXzFfSVNvdW5kVHJpZ2dlckh3OjpSZWNvZ25pdGlvbkNvbmZpZyBoYWxDb25maWc7CiAgICAgICAgIGF1dG8gcmVzdWx0ID0gY29udmVydFJlY29nbml0aW9uQ29uZmlnVG9IYWwoJmhhbENvbmZpZywgY29uZmlnKTsKICAgICAgICAgaWYgKHJlc3VsdC5maXJzdCkgewpAQCAtMzAxLDYgKzMzMywxMyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIElTb3VuZFRyaWdnZXJIdzo6UmVjb2duaXRpb25Db25maWcgaGFsQ29uZmlnOworICAgICAgICBjb252ZXJ0UmVjb2duaXRpb25Db25maWdUb0hhbCgmaGFsQ29uZmlnLCBjb25maWcpOworICAgICAgICB7CisgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFsTG9jayk7CisgICAgICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyLT5zdGFydFJlY29nbml0aW9uKG1vZGVsLT5tSGFsSGFuZGxlLCBoYWxDb25maWcsIHRoaXMsIGhhbmRsZSk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoIWhpZGxSZXR1cm4uaXNPaygpKSB7CkBAIC0zNTYsNiArMzk1LDM4IEBACiAgICAgcmV0dXJuIGhpZGxSZXR1cm47CiB9CiAKK2ludCBTb3VuZFRyaWdnZXJIYWxIaWRsOjpnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBzcDxJU291bmRUcmlnZ2VySHc+IHNvdW5kdHJpZ2dlciA9IGdldFNlcnZpY2UoKTsKKyAgICBpZiAoc291bmR0cmlnZ2VyID09IDApIHsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorCisgICAgc3A8VjJfMl9JU291bmRUcmlnZ2VySHc+IHNvdW5kdHJpZ2dlcl8yXzIgPSB0b1NlcnZpY2UyXzIoc291bmR0cmlnZ2VyKTsKKyAgICBpZiAoc291bmR0cmlnZ2VyXzJfMiA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJnZXRNb2RlbFN0YXRlIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIC1FTk9ERVY7CisgICAgfQorCisgICAgc3A8U291bmRNb2RlbD4gbW9kZWwgPSBnZXRNb2RlbChoYW5kbGUpOworICAgIGlmIChtb2RlbCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJnZXRNb2RlbFN0YXRlIG1vZGVsIG5vdCBmb3VuZCBmb3IgaGFuZGxlICV1IiwgaGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQorCisgICAgaW50IHJldCA9IE5PX0VSUk9SOworICAgIFJldHVybjxpbnQzMl90PiBoaWRsUmV0dXJuKDApOworICAgIHsKKyAgICAgICAgQXV0b011dGV4IGxvY2sobUhhbExvY2spOworICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyXzJfMi0+Z2V0TW9kZWxTdGF0ZShtb2RlbC0+bUhhbEhhbmRsZSk7CisgICAgfQorICAgIGlmICghaGlkbFJldHVybi5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoImdldE1vZGVsU3RhdGUgZXJyb3IgJXMiLCBoaWRsUmV0dXJuLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldCA9IEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwogU291bmRUcmlnZ2VySGFsSGlkbDo6U291bmRUcmlnZ2VySGFsSGlkbChjb25zdCBjaGFyICptb2R1bGVOYW1lKQogICAgIDogbU1vZHVsZU5hbWUobW9kdWxlTmFtZSksIG1OZXh0VW5pcXVlSWQoMSkKIHsKQEAgLTM4OCw2ICs0NTksMTIgQEAKICAgICByZXR1cm4gY2FzdFJlc3VsdF8yXzEuaXNPaygpID8gc3RhdGljX2Nhc3Q8c3A8VjJfMV9JU291bmRUcmlnZ2VySHc+PihjYXN0UmVzdWx0XzJfMSkgOiBudWxscHRyOwogfQogCitzcDxWMl8yX0lTb3VuZFRyaWdnZXJIdz4gU291bmRUcmlnZ2VySGFsSGlkbDo6dG9TZXJ2aWNlMl8yKGNvbnN0IHNwPElTb3VuZFRyaWdnZXJIdz4mIHMpCit7CisgICAgYXV0byBjYXN0UmVzdWx0XzJfMiA9IFYyXzJfSVNvdW5kVHJpZ2dlckh3OjpjYXN0RnJvbShzKTsKKyAgICByZXR1cm4gY2FzdFJlc3VsdF8yXzIuaXNPaygpID8gc3RhdGljX2Nhc3Q8c3A8VjJfMl9JU291bmRUcmlnZ2VySHc+PihjYXN0UmVzdWx0XzJfMikgOiBudWxscHRyOworfQorCiBzcDxTb3VuZFRyaWdnZXJIYWxIaWRsOjpTb3VuZE1vZGVsPiBTb3VuZFRyaWdnZXJIYWxIaWRsOjpnZXRNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCiB7CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEhpZGwuaCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmgKaW5kZXggMGI0NGFlMC4uZmI5ZTM5ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEhpZGwuaAorKysgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5oCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSAiU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlLmgiCiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9zb3VuZHRyaWdnZXIvMi4wL3R5cGVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9zb3VuZHRyaWdnZXIvMi4xL0lTb3VuZFRyaWdnZXJIdy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvc291bmR0cmlnZ2VyLzIuMi9JU291bmRUcmlnZ2VySHcuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3NvdW5kdHJpZ2dlci8yLjAvSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2suaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3NvdW5kdHJpZ2dlci8yLjEvSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2suaD4KIApAQCAtNDYsNiArNDcsOCBAQAogdXNpbmcgVjJfMV9JU291bmRUcmlnZ2VySHdDYWxsYmFjayA9CiAgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OnNvdW5kdHJpZ2dlcjo6VjJfMTo6SVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2s7CiB1c2luZyA6OmFuZHJvaWQ6OmhpZGw6Om1lbW9yeTo6VjFfMDo6SU1lbW9yeTsKK3VzaW5nIFYyXzJfSVNvdW5kVHJpZ2dlckh3ID0KKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6c291bmR0cmlnZ2VyOjpWMl8yOjpJU291bmRUcmlnZ2VySHc7CiAKIGNsYXNzIFNvdW5kVHJpZ2dlckhhbEhpZGwgOiBwdWJsaWMgU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2aXJ0dWFsIFYyXzFfSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2sKQEAgLTkyLDYgKzk1LDE0IEBACiAgICAgICAgICAqLwogICAgICAgICB2aXJ0dWFsIGludCBzdG9wQWxsUmVjb2duaXRpb25zKCk7CiAKKyAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgZ2l2ZW4gbW9kZWwuCisgICAgICAgICAqIFJldHVybnMgMCBvciBhbiBlcnJvciBjb2RlLiBJZiBzdWNjZXNzZnVsIHRoZSBzdGF0ZSB3aWxsIGJlIHJldHVybmVkIGFzeW5jaHJvbm91c2x5CisgICAgICAgICAqIHZpYSBhIHJlY29nbml0aW9uIGV2ZW50IGluIHRoZSBjYWxsYmFjayBtZXRob2QgdGhhdCB3YXMgcmVnaXN0ZXJlZCBpbiB0aGUKKyAgICAgICAgICogc3RhcnRSZWNvZ25pdGlvbigpIG1ldGhvZC4KKyAgICAgICAgICogT25seSBzdXBwb3J0ZWQgZm9yIGRldmljZSBhcGkgdmVyc2lvbnMgU09VTkRfVFJJR0dFUl9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8yIG9yIGFib3ZlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBpbnQgZ2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOworCiAgICAgICAgIC8vIElTb3VuZFRyaWdnZXJId0NhbGxiYWNrCiAgICAgICAgIHZpcnR1YWwgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJlY29nbml0aW9uQ2FsbGJhY2soCiAgICAgICAgICAgICAgICAgY29uc3QgVjJfMF9JU291bmRUcmlnZ2VySHdDYWxsYmFjazo6UmVjb2duaXRpb25FdmVudCYgZXZlbnQsIENhbGxiYWNrQ29va2llIGNvb2tpZSk7CkBAIC0xODIsNiArMTkzLDcgQEAKICAgICAgICAgdWludDMyX3QgbmV4dFVuaXF1ZUlkKCk7CiAgICAgICAgIHNwPElTb3VuZFRyaWdnZXJIdz4gZ2V0U2VydmljZSgpOwogICAgICAgICBzcDxWMl8xX0lTb3VuZFRyaWdnZXJIdz4gdG9TZXJ2aWNlMl8xKGNvbnN0IHNwPElTb3VuZFRyaWdnZXJIdz4mIHMpOworICAgICAgICBzcDxWMl8yX0lTb3VuZFRyaWdnZXJIdz4gdG9TZXJ2aWNlMl8yKGNvbnN0IHNwPElTb3VuZFRyaWdnZXJIdz4mIHMpOwogICAgICAgICBzcDxTb3VuZE1vZGVsPiBnZXRNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOwogICAgICAgICBzcDxTb3VuZE1vZGVsPiByZW1vdmVNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlLmgKaW5kZXggYzA4MzE5NS4uMDE4M2VjZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2UuaApAQCAtNzEsNiArNzEsMTQgQEAKICAgICAgICAgICovCiAgICAgICAgIHZpcnR1YWwgaW50IHN0b3BBbGxSZWNvZ25pdGlvbnMoKSA9IDA7CiAKKyAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IHN0YXRlIG9mIGEgZ2l2ZW4gbW9kZWwuCisgICAgICAgICAqIFJldHVybnMgMCBvciBhbiBlcnJvciBjb2RlLiBJZiBzdWNjZXNzZnVsIHRoZSBzdGF0ZSB3aWxsIGJlIHJldHVybmVkIGFzeW5jaHJvbm91c2x5CisgICAgICAgICAqIHZpYSBhIHJlY29nbml0aW9uIGV2ZW50IGluIHRoZSBjYWxsYmFjayBtZXRob2QgdGhhdCB3YXMgcmVnaXN0ZXJlZCBpbiB0aGUKKyAgICAgICAgICogc3RhcnRSZWNvZ25pdGlvbigpIG1ldGhvZC4KKyAgICAgICAgICogT25seSBzdXBwb3J0ZWQgZm9yIGRldmljZSBhcGkgdmVyc2lvbnMgU09VTkRfVFJJR0dFUl9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8yIG9yIGFib3ZlLgorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCBpbnQgZ2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpID0gMDsKKwogcHJvdGVjdGVkOgogICAgICAgICBTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2UoKSB7fQogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxMZWdhY3kuY3BwIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbExlZ2FjeS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNzg4MTguLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbExlZ2FjeS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlICJTb3VuZFRyaWdnZXJIYWxMZWdhY3kuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKiBzdGF0aWMgKi8KLXNwPFNvdW5kVHJpZ2dlckhhbEludGVyZmFjZT4gU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlOjpjb25uZWN0TW9kdWxlKGNvbnN0IGNoYXIgKm1vZHVsZU5hbWUpCi17Ci0gICAgcmV0dXJuIG5ldyBTb3VuZFRyaWdnZXJIYWxMZWdhY3kobW9kdWxlTmFtZSk7Ci19Ci0KLVNvdW5kVHJpZ2dlckhhbExlZ2FjeTo6U291bmRUcmlnZ2VySGFsTGVnYWN5KGNvbnN0IGNoYXIgKm1vZHVsZU5hbWUpCi0gICAgOiBtTW9kdWxlTmFtZShtb2R1bGVOYW1lKSwgbUh3RGV2aWNlKE5VTEwpCi17Ci19Ci0KLXZvaWQgU291bmRUcmlnZ2VySGFsTGVnYWN5OjpvbkZpcnN0UmVmKCkKLXsKLSAgICBjb25zdCBod19tb2R1bGVfdCAqbW9kOwotICAgIGludCByYzsKLQotICAgIGlmIChtTW9kdWxlTmFtZSA9PSBOVUxMKSB7Ci0gICAgICAgIG1Nb2R1bGVOYW1lID0gInByaW1hcnkiOwotICAgIH0KLQotICAgIHJjID0gaHdfZ2V0X21vZHVsZV9ieV9jbGFzcyhTT1VORF9UUklHR0VSX0hBUkRXQVJFX01PRFVMRV9JRCwgbU1vZHVsZU5hbWUsICZtb2QpOwotICAgIGlmIChyYyAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJjb3VsZG4ndCBsb2FkIHNvdW5kIHRyaWdnZXIgbW9kdWxlICVzLiVzICglcykiLAotICAgICAgICAgICAgICBTT1VORF9UUklHR0VSX0hBUkRXQVJFX01PRFVMRV9JRCwgbU1vZHVsZU5hbWUsIHN0cmVycm9yKC1yYykpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHJjID0gc291bmRfdHJpZ2dlcl9od19kZXZpY2Vfb3Blbihtb2QsICZtSHdEZXZpY2UpOwotICAgIGlmIChyYyAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJjb3VsZG4ndCBvcGVuIHNvdW5kIHRyaWdnZXIgaHcgZGV2aWNlIGluICVzLiVzICglcykiLAotICAgICAgICAgICAgICBTT1VORF9UUklHR0VSX0hBUkRXQVJFX01PRFVMRV9JRCwgbU1vZHVsZU5hbWUsIHN0cmVycm9yKC1yYykpOwotICAgICAgICBtSHdEZXZpY2UgPSBOVUxMOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmIChtSHdEZXZpY2UtPmNvbW1vbi52ZXJzaW9uIDwgU09VTkRfVFJJR0dFUl9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8wIHx8Ci0gICAgICAgICAgICBtSHdEZXZpY2UtPmNvbW1vbi52ZXJzaW9uID4gU09VTkRfVFJJR0dFUl9ERVZJQ0VfQVBJX1ZFUlNJT05fQ1VSUkVOVCkgewotICAgICAgICBBTE9HRSgid3Jvbmcgc291bmQgdHJpZ2dlciBodyBkZXZpY2UgdmVyc2lvbiAlMDR4IiwgbUh3RGV2aWNlLT5jb21tb24udmVyc2lvbik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci19Ci0KLVNvdW5kVHJpZ2dlckhhbExlZ2FjeTo6flNvdW5kVHJpZ2dlckhhbExlZ2FjeSgpCi17Ci0gICAgaWYgKG1Id0RldmljZSAhPSBOVUxMKSB7Ci0gICAgICAgIHNvdW5kX3RyaWdnZXJfaHdfZGV2aWNlX2Nsb3NlKG1Id0RldmljZSk7Ci0gICAgfQotfQotCi1pbnQgU291bmRUcmlnZ2VySGFsTGVnYWN5OjpnZXRQcm9wZXJ0aWVzKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3Byb3BlcnRpZXMgKnByb3BlcnRpZXMpCi17Ci0gICAgaWYgKG1Id0RldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByZXR1cm4gbUh3RGV2aWNlLT5nZXRfcHJvcGVydGllcyhtSHdEZXZpY2UsIHByb3BlcnRpZXMpOwotfQotCi1pbnQgU291bmRUcmlnZ2VySGFsTGVnYWN5Ojpsb2FkU291bmRNb2RlbChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9zb3VuZF9tb2RlbCAqc291bmRfbW9kZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF9tb2RlbF9jYWxsYmFja190IGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llLAotICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfbW9kZWxfaGFuZGxlX3QgKmhhbmRsZSkKLXsKLSAgICBpZiAobUh3RGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJldHVybiBtSHdEZXZpY2UtPmxvYWRfc291bmRfbW9kZWwobUh3RGV2aWNlLCBzb3VuZF9tb2RlbCwgY2FsbGJhY2ssIGNvb2tpZSwgaGFuZGxlKTsKLX0KLQotaW50IFNvdW5kVHJpZ2dlckhhbExlZ2FjeTo6dW5sb2FkU291bmRNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCi17Ci0gICAgaWYgKG1Id0RldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByZXR1cm4gbUh3RGV2aWNlLT51bmxvYWRfc291bmRfbW9kZWwobUh3RGV2aWNlLCBoYW5kbGUpOwotfQotCi1pbnQgU291bmRUcmlnZ2VySGFsTGVnYWN5OjpzdGFydFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICByZWNvZ25pdGlvbl9jYWxsYmFja190IGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvb2tpZSkKLXsKLSAgICBpZiAobUh3RGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJldHVybiBtSHdEZXZpY2UtPnN0YXJ0X3JlY29nbml0aW9uKG1Id0RldmljZSwgaGFuZGxlLCBjb25maWcsIGNhbGxiYWNrLCBjb29raWUpOwotfQotCi1pbnQgU291bmRUcmlnZ2VySGFsTGVnYWN5OjpzdG9wUmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQotewotICAgIGlmIChtSHdEZXZpY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcmV0dXJuIG1Id0RldmljZS0+c3RvcF9yZWNvZ25pdGlvbihtSHdEZXZpY2UsIGhhbmRsZSk7Ci19Ci0KLWludCBTb3VuZFRyaWdnZXJIYWxMZWdhY3k6OnN0b3BBbGxSZWNvZ25pdGlvbnMoKQotewotICAgIGlmIChtSHdEZXZpY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgaWYgKG1Id0RldmljZS0+Y29tbW9uLnZlcnNpb24gPj0gU09VTkRfVFJJR0dFUl9ERVZJQ0VfQVBJX1ZFUlNJT05fMV8xICYmCi0gICAgIG1Id0RldmljZS0+c3RvcF9hbGxfcmVjb2duaXRpb25zKSB7Ci0gICAgICAgIHJldHVybiBtSHdEZXZpY2UtPnN0b3BfYWxsX3JlY29nbml0aW9ucyhtSHdEZXZpY2UpOwotICAgIH0KLSAgICByZXR1cm4gLUVOT1NZUzsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbExlZ2FjeS5oIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbExlZ2FjeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjQ4OGRlLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxMZWdhY3kuaAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU09VTkRUUklHR0VSX0hBTF9MRUdBQ1lfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NPVU5EVFJJR0dFUl9IQUxfTEVHQUNZX0gKLQotI2luY2x1ZGUgIlNvdW5kVHJpZ2dlckhhbEludGVyZmFjZS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFNvdW5kVHJpZ2dlckhhbExlZ2FjeSA6IHB1YmxpYyBTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2UKLQotewotcHVibGljOgotICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5Tb3VuZFRyaWdnZXJIYWxMZWdhY3koKTsKLQotICAgICAgICB2aXJ0dWFsIGludCBnZXRQcm9wZXJ0aWVzKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3Byb3BlcnRpZXMgKnByb3BlcnRpZXMpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIExvYWQgYSBzb3VuZCBtb2RlbC4gT25jZSBsb2FkZWQsIHJlY29nbml0aW9uIG9mIHRoaXMgbW9kZWwgY2FuIGJlIHN0YXJ0ZWQgYW5kIHN0b3BwZWQuCi0gICAgICAgICAqIE9ubHkgb25lIGFjdGl2ZSByZWNvZ25pdGlvbiBwZXIgbW9kZWwgYXQgYSB0aW1lLiBUaGUgU291bmRUcmlnZ2VyIHNlcnZpY2Ugd2lsbCBoYW5kbGUKLSAgICAgICAgICogY29uY3VycmVudCByZWNvZ25pdGlvbiByZXF1ZXN0cyBieSBkaWZmZXJlbnQgdXNlcnMvYXBwbGljYXRpb25zIG9uIHRoZSBzYW1lIG1vZGVsLgotICAgICAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gcmV0dXJucyBhIHVuaXF1ZSBoYW5kbGUgdXNlZCBieSBvdGhlciBmdW5jdGlvbnMgKHVubG9hZF9zb3VuZF9tb2RlbCgpLAotICAgICAgICAgKiBzdGFydF9yZWNvZ25pdGlvbigpLCBldGMuLi4KLSAgICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgaW50IGxvYWRTb3VuZE1vZGVsKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3NvdW5kX21vZGVsICpzb3VuZF9tb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRfbW9kZWxfY2FsbGJhY2tfdCBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCAqaGFuZGxlKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBVbmxvYWQgYSBzb3VuZCBtb2RlbC4gQSBzb3VuZCBtb2RlbCBjYW4gYmUgdW5sb2FkZWQgdG8gbWFrZSByb29tIGZvciBhIG5ldyBvbmUgdG8gb3ZlcmNvbWUKLSAgICAgICAgICogaW1wbGVtZW50YXRpb24gbGltaXRhdGlvbnMuCi0gICAgICAgICAqLwotICAgICAgICB2aXJ0dWFsIGludCB1bmxvYWRTb3VuZE1vZGVsKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7Ci0KLSAgICAgICAgLyogU3RhcnQgcmVjb2duaXRpb24gb24gYSBnaXZlbiBtb2RlbC4gT25seSBvbmUgcmVjb2duaXRpb24gYWN0aXZlIGF0IGEgdGltZSBwZXIgbW9kZWwuCi0gICAgICAgICAqIE9uY2UgcmVjb2duaXRpb24gc3VjY2VlZHMgb2YgZmFpbHMsIHRoZSBjYWxsYmFjayBpcyBjYWxsZWQuCi0gICAgICAgICAqIFRPRE86IGdyb3VwIHJlY29nbml0aW9uIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBpbnRvIG9uZSBzdHJ1Y3QgYW5kIGFkZCBrZXkgcGhyYXNlIG9wdGlvbnMuCi0gICAgICAgICAqLwotICAgICAgICB2aXJ0dWFsIGludCBzdGFydFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb2duaXRpb25fY2FsbGJhY2tfdCBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvb2tpZSk7Ci0KLSAgICAgICAgLyogU3RvcCByZWNvZ25pdGlvbiBvbiBhIGdpdmVuIG1vZGVsLgotICAgICAgICAgKiBUaGUgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgaGF2ZSB0byBjYWxsIHRoZSBjYWxsYmFjayB3aGVuIHN0b3BwZWQgdmlhIHRoaXMgbWV0aG9kLgotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCBpbnQgc3RvcFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7Ci0KLSAgICAgICAgLyogU3RvcCByZWNvZ25pdGlvbiBvbiBhbGwgbW9kZWxzLgotICAgICAgICAgKiBPbmx5IHN1cHBvcnRlZCBmb3IgZGV2aWNlIGFwaSB2ZXJzaW9ucyBTT1VORF9UUklHR0VSX0RFVklDRV9BUElfVkVSU0lPTl8xXzEgb3IgYWJvdmUuCi0gICAgICAgICAqIElmIG5vIGltcGxlbWVudGF0aW9uIGlzIHByb3ZpZGVkLCBzdG9wX3JlY29nbml0aW9uIHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoIHJ1bm5pbmcgbW9kZWwuCi0gICAgICAgICAqLwotICAgICAgICBpbnQgc3RvcEFsbFJlY29nbml0aW9ucygpOwotCi0gICAgICAgIC8vIFJlZkJhc2UKLSAgICAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgb25GaXJzdFJlZigpOwotCi1wcml2YXRlOgotCi0gICAgICAgIGZyaWVuZCBjbGFzcyBTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2U7Ci0KLSAgICAgICAgZXhwbGljaXQgU291bmRUcmlnZ2VySGFsTGVnYWN5KGNvbnN0IGNoYXIgKm1vZHVsZU5hbWUgPSBOVUxMKTsKLQotICAgICAgICBjb25zdCBjaGFyICptTW9kdWxlTmFtZTsKLSAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfaHdfZGV2aWNlKiAgICAgICAgbUh3RGV2aWNlOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TT1VORFRSSUdHRVJfSEFMX0xFR0FDWV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCmluZGV4IGE3ZDZlODMuLjM3N2QzMGIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCkBAIC0yMiwyNSArMjIsMjIgQEAKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KICNpbmNsdWRlIDxwdGhyZWFkLmg+CiAKKyNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgogI2luY2x1ZGUgPHN5c3RlbS9zb3VuZF90cmlnZ2VyLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2F0b21pYy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvaGFyZHdhcmUuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5QmFzZS5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgogI2luY2x1ZGUgPHN5c3RlbS9zb3VuZF90cmlnZ2VyLmg+Ci0jaW5jbHVkZSA8U2VydmljZVV0aWxpdGllcy5oPgogI2luY2x1ZGUgIlNvdW5kVHJpZ2dlckh3U2VydmljZS5oIgogCi0jaWZkZWYgU09VTkRfVFJJR0dFUl9VU0VfU1RVQl9NT0RVTEUKLSNkZWZpbmUgSFdfTU9EVUxFX1BSRUZJWCAic3R1YiIKLSNlbHNlCiAjZGVmaW5lIEhXX01PRFVMRV9QUkVGSVggInByaW1hcnkiCi0jZW5kaWYKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpTb3VuZFRyaWdnZXJId1NlcnZpY2UoKQpAQCAtODUsMTEgKzgyLDEzIEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Omxpc3RNb2R1bGVzKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yICptb2R1bGVzLAorc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpsaXN0TW9kdWxlcyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgKm1vZHVsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKQogewogICAgIEFMT0dWKCJsaXN0TW9kdWxlcyIpOwotICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKKyAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZChvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CkBAIC0xMDYsMTIgKzEwNSwxNCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjphdHRhY2goY29uc3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgaGFuZGxlLAorc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjphdHRhY2goY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgc3A8SVNvdW5kVHJpZ2dlcj4mIG1vZHVsZUludGVyZmFjZSkKIHsKICAgICBBTE9HVigiYXR0YWNoIG1vZHVsZSAlZCIsIGhhbmRsZSk7Ci0gICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAorICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KQEAgLTEyNyw3ICsxMjgsNyBAQAogICAgIH0KICAgICBzcDxNb2R1bGU+IG1vZHVsZSA9IG1Nb2R1bGVzLnZhbHVlQXQoaW5kZXgpOwogCi0gICAgc3A8TW9kdWxlQ2xpZW50PiBtb2R1bGVDbGllbnQgPSBtb2R1bGUtPmFkZENsaWVudChjbGllbnQpOworICAgIHNwPE1vZHVsZUNsaWVudD4gbW9kdWxlQ2xpZW50ID0gbW9kdWxlLT5hZGRDbGllbnQoY2xpZW50LCBvcFBhY2thZ2VOYW1lKTsKICAgICBpZiAobW9kdWxlQ2xpZW50ID09IDApIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQpAQCAtMTUwLDIwICsxNTEsMTIgQEAKIH0KIAogCi1zdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1JldHJpZXMgPSA1MDsKLXN0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrU2xlZXAgPSA2MDAwMDsKK3N0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrVGltZW91dE5zID0gMSAqIE5BTk9TX1BFUl9TRUNPTkQ7CiAKLXN0YXRpYyBib29sIHRyeUxvY2soTXV0ZXgmIG11dGV4KQorc3RhdGljIGJvb2wgZHVtcFRyeUxvY2soTXV0ZXgmIG11dGV4KQogewotICAgIGJvb2wgbG9ja2VkID0gZmFsc2U7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrRHVtcExvY2tSZXRyaWVzOyArK2kpIHsKLSAgICAgICAgaWYgKG11dGV4LnRyeUxvY2soKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgbG9ja2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHVzbGVlcChrRHVtcExvY2tTbGVlcCk7Ci0gICAgfQotICAgIHJldHVybiBsb2NrZWQ7CisgICAgc3RhdHVzX3QgZXJyID0gbXV0ZXgudGltZWRMb2NrKGtEdW1wTG9ja1RpbWVvdXROcyk7CisgICAgcmV0dXJuIGVyciA9PSBOT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkgewpAQCAtMTcyLDcgKzE2NSw3IEBACiAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlBlcm1pc3Npb24gRGVuaWFsOiBjYW4ndCBkdW1wIFNvdW5kVHJpZ2dlckh3U2VydmljZSIpOwogICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICB9IGVsc2UgewotICAgICAgICBib29sIGxvY2tlZCA9IHRyeUxvY2sobVNlcnZpY2VMb2NrKTsKKyAgICAgICAgYm9vbCBsb2NrZWQgPSBkdW1wVHJ5TG9jayhtU2VydmljZUxvY2spOwogICAgICAgICAvLyBmYWlsZWQgdG8gbG9jayAtIFNvdW5kVHJpZ2dlckh3U2VydmljZSBpcyBwcm9iYWJseSBkZWFkbG9ja2VkCiAgICAgICAgIGlmICghbG9ja2VkKSB7CiAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJTb3VuZFRyaWdnZXJId1NlcnZpY2UgbWF5IGJlIGRlYWRsb2NrZWRcbiIpOwpAQCAtNDkwLDcgKzQ4Myw4IEBACiB9CiAKIHNwPFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlQ2xpZW50PgotU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGU6OmFkZENsaWVudChjb25zdCBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiYgY2xpZW50KQorU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGU6OmFkZENsaWVudChjb25zdCBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSkKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgc3A8TW9kdWxlQ2xpZW50PiBtb2R1bGVDbGllbnQ7CkBAIC01MDEsNyArNDk1LDcgQEAKICAgICAgICAgICAgIHJldHVybiBtb2R1bGVDbGllbnQ7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbW9kdWxlQ2xpZW50ID0gbmV3IE1vZHVsZUNsaWVudCh0aGlzLCBjbGllbnQpOworICAgIG1vZHVsZUNsaWVudCA9IG5ldyBNb2R1bGVDbGllbnQodGhpcywgY2xpZW50LCBvcFBhY2thZ2VOYW1lKTsKIAogICAgIEFMT0dWKCJhZGRDbGllbnQoKSBjbGllbnQgJXAiLCBtb2R1bGVDbGllbnQuZ2V0KCkpOwogICAgIG1Nb2R1bGVDbGllbnRzLmFkZChtb2R1bGVDbGllbnQpOwpAQCAtNTYyLDEwICs1NTYsNyBAQAogICAgIGlmIChtSGFsSW50ZXJmYWNlID09IDApIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIGlmIChtb2RlbE1lbW9yeSA9PSAwIHx8IG1vZGVsTWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgibG9hZFNvdW5kTW9kZWwoKSBtb2RlbE1lbW9yeSBpcyAwIG9yIGhhcyBOVUxMIHBvaW50ZXIoKSIpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KKwogICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX3NvdW5kX21vZGVsICpzb3VuZF9tb2RlbCA9CiAgICAgICAgICAgICAoc3RydWN0IHNvdW5kX3RyaWdnZXJfc291bmRfbW9kZWwgKiltb2RlbE1lbW9yeS0+cG9pbnRlcigpOwogCkBAIC02NTksMTEgKzY1MCw2IEBACiAgICAgaWYgKG1IYWxJbnRlcmZhY2UgPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgaWYgKGRhdGFNZW1vcnkgPT0gMCB8fCBkYXRhTWVtb3J5LT5wb2ludGVyKCkgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgic3RhcnRSZWNvZ25pdGlvbigpIGRhdGFNZW1vcnkgaXMgMCBvciBoYXMgTlVMTCBwb2ludGVyKCkiKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLQotICAgIH0KIAogICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2NvbmZpZyAqY29uZmlnID0KICAgICAgICAgICAgIChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9yZWNvZ25pdGlvbl9jb25maWcgKilkYXRhTWVtb3J5LT5wb2ludGVyKCk7CkBAIC03MjUsNiArNzExLDI1IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitzdGF0dXNfdCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZTo6Z2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgQUxPR1YoImdldE1vZGVsU3RhdGUoKSBtb2RlbCBoYW5kbGUgJWQiLCBoYW5kbGUpOworICAgIGlmIChtSGFsSW50ZXJmYWNlID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBzcDxNb2RlbD4gbW9kZWwgPSBnZXRNb2RlbChoYW5kbGUpOworICAgIGlmIChtb2RlbCA9PSAwKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKG1vZGVsLT5tU3RhdGUgIT0gTW9kZWw6OlNUQVRFX0FDVElWRSkgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgcmV0dXJuIG1IYWxJbnRlcmZhY2UtPmdldE1vZGVsU3RhdGUoaGFuZGxlKTsKK30KKwogdm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZTo6b25DYWxsYmFja0V2ZW50KGNvbnN0IHNwPENhbGxiYWNrRXZlbnQ+JiBldmVudCkKIHsKICAgICBBTE9HVigib25DYWxsYmFja0V2ZW50IHR5cGUgJWQiLCBldmVudC0+bVR5cGUpOwpAQCAtOTEzLDggKzkxOCw5IEBACiAjZGVmaW5lIExPR19UQUcgIlNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlQ2xpZW50IgogCiBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6TW9kdWxlQ2xpZW50KGNvbnN0IHNwPE1vZHVsZT4mIG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4mIGNsaWVudCkKLSA6IG1Nb2R1bGUobW9kdWxlKSwgbUNsaWVudChjbGllbnQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lKQorIDogbU1vZHVsZShtb2R1bGUpLCBtQ2xpZW50KGNsaWVudCksIG1PcFBhY2thZ2VOYW1lKG9wUGFja2FnZU5hbWUpCiB7CiB9CiAKQEAgLTkzOCw3ICs5NDQsOCBAQAogCiB2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlQ2xpZW50OjpkZXRhY2goKSB7CiAgICAgQUxPR1YoImRldGFjaCgpIik7Ci0gICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAorICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKG1PcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC05NjIsMTAgKzk2OSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCAqaGFuZGxlKQogewogICAgIEFMT0dWKCJsb2FkU291bmRNb2RlbCgpIGhhbmRsZSIpOwotICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKKyAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZChtT3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQorICAgIGlmIChjaGVja0lNZW1vcnkobW9kZWxNZW1vcnkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogCiAgICAgc3A8TW9kdWxlPiBtb2R1bGUgPSBtTW9kdWxlLnByb21vdGUoKTsKICAgICBpZiAobW9kdWxlID09IDApIHsKQEAgLTk3Nyw3ICs5ODgsOCBAQAogc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OnVubG9hZFNvdW5kTW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQogewogICAgIEFMT0dWKCJ1bmxvYWRTb3VuZE1vZGVsKCkgbW9kZWwgaGFuZGxlICVkIiwgaGFuZGxlKTsKLSAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCisgICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQobU9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KQEAgLTk5MywxMCArMTAwNSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFNZW1vcnkpCiB7CiAgICAgQUxPR1YoInN0YXJ0UmVjb2duaXRpb24oKSBtb2RlbCBoYW5kbGUgJWQiLCBoYW5kbGUpOwotICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKKyAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZChtT3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQorICAgIGlmIChjaGVja0lNZW1vcnkoZGF0YU1lbW9yeSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAKICAgICBzcDxNb2R1bGU+IG1vZHVsZSA9IG1Nb2R1bGUucHJvbW90ZSgpOwogICAgIGlmIChtb2R1bGUgPT0gMCkgewpAQCAtMTAwOCw3ICsxMDI0LDggQEAKIHN0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlQ2xpZW50OjpzdG9wUmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQogewogICAgIEFMT0dWKCJzdG9wUmVjb2duaXRpb24oKSBtb2RlbCBoYW5kbGUgJWQiLCBoYW5kbGUpOwotICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKKyAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZChtT3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQpAQCAtMTAyMCw2ICsxMDM3LDIyIEBACiAgICAgcmV0dXJuIG1vZHVsZS0+c3RvcFJlY29nbml0aW9uKGhhbmRsZSk7CiB9CiAKK3N0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlQ2xpZW50OjpnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBBTE9HVigiZ2V0TW9kZWxTdGF0ZSgpIG1vZGVsIGhhbmRsZSAlZCIsIGhhbmRsZSk7CisgICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQobU9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIHNwPE1vZHVsZT4gbW9kdWxlID0gbU1vZHVsZS5wcm9tb3RlKCk7CisgICAgaWYgKG1vZHVsZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gbW9kdWxlLT5nZXRNb2RlbFN0YXRlKGhhbmRsZSk7Cit9CisKIHZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OnNldENhcHR1cmVTdGF0ZV9sKGJvb2wgYWN0aXZlKQogewogICAgIEFMT0dWKCJNb2R1bGVDbGllbnQ6OnNldENhcHR1cmVTdGF0ZV9sICVkIiwgYWN0aXZlKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuaCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuaAppbmRleCA3MDhmYzk4Li40M2FkNjExIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5oCkBAIC00NywxMCArNDcsMTIgQEAKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5Tb3VuZFRyaWdnZXJId1NlcnZpY2UoKTsKIAogICAgIC8vIElTb3VuZFRyaWdnZXJId1NlcnZpY2UKLSAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RNb2R1bGVzKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yICptb2R1bGVzLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdE1vZHVsZXMoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciAqbW9kdWxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgYXR0YWNoKGNvbnN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90IGhhbmRsZSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IGF0dGFjaChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJU291bmRUcmlnZ2VyPiYgbW9kdWxlKTsKIApAQCAtMTIyLDYgKzEyNCw3IEBACiAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFNZW1vcnkpOwogICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CisgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CiAKICAgICAgICBzcDxTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2U+IGhhbEludGVyZmFjZSgpIGNvbnN0IHsgcmV0dXJuIG1IYWxJbnRlcmZhY2U7IH0KICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciBkZXNjcmlwdG9yKCkgeyByZXR1cm4gbURlc2NyaXB0b3I7IH0KQEAgLTEzMiw3ICsxMzUsOCBAQAogCiAgICAgICAgdm9pZCBzZXRDYXB0dXJlU3RhdGVfbChib29sIGFjdGl2ZSk7CiAKLSAgICAgICBzcDxNb2R1bGVDbGllbnQ+IGFkZENsaWVudChjb25zdCBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiYgY2xpZW50KTsKKyAgICAgICBzcDxNb2R1bGVDbGllbnQ+IGFkZENsaWVudChjb25zdCBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lKTsKIAogICAgICAgIHZvaWQgZGV0YWNoKGNvbnN0IHNwPE1vZHVsZUNsaWVudD4mIG1vZHVsZUNsaWVudCk7CiAKQEAgLTE1NSw3ICsxNTksOCBAQAogICAgIHB1YmxpYzoKIAogICAgICAgIE1vZHVsZUNsaWVudChjb25zdCBzcDxNb2R1bGU+JiBtb2R1bGUsCi0gICAgICAgICAgICAgIGNvbnN0IHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+JiBjbGllbnQpOworICAgICAgICAgICAgICBjb25zdCBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSk7CiAKICAgICAgICB2aXJ0dWFsIH5Nb2R1bGVDbGllbnQoKTsKIApAQCAtMTY5LDYgKzE3NCw3IEBACiAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIGRhdGFNZW1vcnkpOwogICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CisgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CiAKICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIApAQCAtMTg4LDYgKzE5NCw3IEBACiAgICAgICAgIG11dGFibGUgTXV0ZXggICAgICAgICAgICAgICBtTG9jazsKICAgICAgICAgd3A8TW9kdWxlPiAgICAgICAgICAgICAgICAgIG1Nb2R1bGU7CiAgICAgICAgIHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+ICAgICBtQ2xpZW50OworICAgICAgICBjb25zdCBTdHJpbmcxNiAgICAgICAgICAgICAgbU9wUGFja2FnZU5hbWU7CiAgICAgfTsgLy8gY2xhc3MgTW9kdWxlQ2xpZW50CiAKICAgICBjbGFzcyBDYWxsYmFja1RocmVhZCA6IHB1YmxpYyBUaHJlYWQgewpkaWZmIC0tZ2l0IGEvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuY3BwIGIvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuY3BwCmluZGV4IDI1MzMyYTQuLmY1YjRiNTkgMTAwNjQ0Ci0tLSBhL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmNwcAorKysgYi9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5jcHAKQEAgLTMyLDYgKzMyLDcgQEAKICAgICBVTkxPQURfU09VTkRfTU9ERUwsCiAgICAgU1RBUlRfUkVDT0dOSVRJT04sCiAgICAgU1RPUF9SRUNPR05JVElPTiwKKyAgICBHRVRfTU9ERUxfU1RBVEUsCiB9OwogCiBjbGFzcyBCcFNvdW5kVHJpZ2dlcjogcHVibGljIEJwSW50ZXJmYWNlPElTb3VuZFRyaWdnZXI+CkBAIC0xMTMsNiArMTE0LDE4IEBACiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTb3VuZFRyaWdnZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGUoJmhhbmRsZSwgc2l6ZW9mKHNvdW5kX21vZGVsX2hhbmRsZV90KSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfTU9ERUxfU1RBVEUsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKwogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKFNvdW5kVHJpZ2dlciwgImFuZHJvaWQuaGFyZHdhcmUuSVNvdW5kVHJpZ2dlciIpOwpAQCAtMTY5LDYgKzE4MiwxNyBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQorICAgICAgICBjYXNlIEdFVF9NT0RFTF9TVEFURTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTb3VuZFRyaWdnZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IFVOS05PV05fRVJST1I7CisgICAgICAgICAgICBzdGF0dXNfdCByZXQgPSBkYXRhLnJlYWQoJmhhbmRsZSwgc2l6ZW9mKHNvdW5kX21vZGVsX2hhbmRsZV90KSk7CisgICAgICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gZ2V0TW9kZWxTdGF0ZShoYW5kbGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwIGIvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCmluZGV4IGQ0NGY1Y2IuLmJkMTA3YjQgMTAwNjQ0Ci0tLSBhL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcAorKysgYi9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKQEAgLTUwLDcgKzUwLDggQEAKICAgICB7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0TW9kdWxlcyhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciAqbW9kdWxlcywKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RNb2R1bGVzKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgKm1vZHVsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcykKICAgICB7CiAgICAgICAgIGlmIChudW1Nb2R1bGVzID09IE5VTEwgfHwgKCpudW1Nb2R1bGVzICE9IDAgJiYgbW9kdWxlcyA9PSBOVUxMKSkgewpAQCAtNTgsNiArNTksNyBAQAogICAgICAgICB9CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTb3VuZFRyaWdnZXJId1NlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcxNihvcFBhY2thZ2VOYW1lKTsKICAgICAgICAgdW5zaWduZWQgaW50IG51bU1vZHVsZXNSZXEgPSAobW9kdWxlcyA9PSBOVUxMKSA/IDAgOiAqbnVtTW9kdWxlczsKICAgICAgICAgZGF0YS53cml0ZUludDMyKG51bU1vZHVsZXNSZXEpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTElTVF9NT0RVTEVTLCBkYXRhLCAmcmVwbHkpOwpAQCAtNzcsMTIgKzc5LDE0IEBACiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhdHRhY2goY29uc3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgaGFuZGxlLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgYXR0YWNoKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90IGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElTb3VuZFRyaWdnZXI+JiBtb2R1bGUpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYob3BQYWNrYWdlTmFtZSk7CiAgICAgICAgIGRhdGEud3JpdGUoJmhhbmRsZSwgc2l6ZW9mKHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90KSk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoY2xpZW50KSk7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChBVFRBQ0gsIGRhdGEsICZyZXBseSk7CkBAIC0xMjAsNiArMTI0LDExIEBACiAgICAgc3dpdGNoKGNvZGUpIHsKICAgICAgICAgY2FzZSBMSVNUX01PRFVMRVM6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU291bmRUcmlnZ2VySHdTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBTdHJpbmcxNiBvcFBhY2thZ2VOYW1lOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkU3RyaW5nMTYoJm9wUGFja2FnZU5hbWUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtTW9kdWxlc1JlcSA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBpZiAobnVtTW9kdWxlc1JlcSA+IE1BWF9JVEVNU19QRVJfTElTVCkgewogICAgICAgICAgICAgICAgIG51bU1vZHVsZXNSZXEgPSBNQVhfSVRFTVNfUEVSX0xJU1Q7CkBAIC0xMzMsNyArMTQyLDcgQEAKICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigwKTsKICAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBsaXN0TW9kdWxlcyhtb2R1bGVzLCAmbnVtTW9kdWxlcyk7CisgICAgICAgICAgICBzdGF0dXMgPSBsaXN0TW9kdWxlcyhvcFBhY2thZ2VOYW1lLCBtb2R1bGVzLCAmbnVtTW9kdWxlcyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobnVtTW9kdWxlcyk7CiAgICAgICAgICAgICBBTE9HVigiTElTVF9NT0RVTEVTIHN0YXR1cyAlZCBnb3QgbnVtTW9kdWxlcyAlZCIsIHN0YXR1cywgbnVtTW9kdWxlcyk7CkBAIC0xNTEsMTIgKzE2MCwxNyBAQAogCiAgICAgICAgIGNhc2UgQVRUQUNIOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVNvdW5kVHJpZ2dlckh3U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgU3RyaW5nMTYgb3BQYWNrYWdlTmFtZTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZFN0cmluZzE2KCZvcFBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQogICAgICAgICAgICAgc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgaGFuZGxlOwogICAgICAgICAgICAgZGF0YS5yZWFkKCZoYW5kbGUsIHNpemVvZihzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCkpOwogICAgICAgICAgICAgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4gY2xpZW50ID0KICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SVNvdW5kVHJpZ2dlckNsaWVudD4oZGF0YS5yZWFkU3Ryb25nQmluZGVyKCkpOwogICAgICAgICAgICAgc3A8SVNvdW5kVHJpZ2dlcj4gbW9kdWxlOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXR0YWNoKGhhbmRsZSwgY2xpZW50LCBtb2R1bGUpOworICAgICAgICAgICAgc3RhdHVzID0gYXR0YWNoKG9wUGFja2FnZU5hbWUsIGhhbmRsZSwgY2xpZW50LCBtb2R1bGUpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIGlmIChtb2R1bGUgIT0gMCkgewogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDEpOwpkaWZmIC0tZ2l0IGEvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5jcHAgYi9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmNwcAppbmRleCAyODliN2IxLi45NzA4ZWE3IDEwMDY0NAotLS0gYS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmNwcAorKysgYi9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmNwcApAQCAtODAsMTkgKzgwLDIxIEBACiB9CiAKIC8vIFN0YXRpYyBtZXRob2RzCi1zdGF0dXNfdCBTb3VuZFRyaWdnZXI6Omxpc3RNb2R1bGVzKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yICptb2R1bGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpCitzdGF0dXNfdCBTb3VuZFRyaWdnZXI6Omxpc3RNb2R1bGVzKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciAqbW9kdWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpCiB7CiAgICAgQUxPR1YoImxpc3RNb2R1bGVzKCkiKTsKICAgICBjb25zdCBzcDxJU291bmRUcmlnZ2VySHdTZXJ2aWNlPiBzZXJ2aWNlID0gZ2V0U291bmRUcmlnZ2VySHdTZXJ2aWNlKCk7CiAgICAgaWYgKHNlcnZpY2UgPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgcmV0dXJuIHNlcnZpY2UtPmxpc3RNb2R1bGVzKG1vZHVsZXMsIG51bU1vZHVsZXMpOworICAgIHJldHVybiBzZXJ2aWNlLT5saXN0TW9kdWxlcyhvcFBhY2thZ2VOYW1lLCBtb2R1bGVzLCBudW1Nb2R1bGVzKTsKIH0KIAotc3A8U291bmRUcmlnZ2VyPiBTb3VuZFRyaWdnZXI6OmF0dGFjaChjb25zdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFNvdW5kVHJpZ2dlckNhbGxiYWNrPiYgY2FsbGJhY2spCitzcDxTb3VuZFRyaWdnZXI+IFNvdW5kVHJpZ2dlcjo6YXR0YWNoKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFNvdW5kVHJpZ2dlckNhbGxiYWNrPiYgY2FsbGJhY2spCiB7CiAgICAgQUxPR1YoImF0dGFjaCgpIik7CiAgICAgc3A8U291bmRUcmlnZ2VyPiBzb3VuZFRyaWdnZXI7CkBAIC0xMDEsNyArMTAzLDggQEAKICAgICAgICAgcmV0dXJuIHNvdW5kVHJpZ2dlcjsKICAgICB9CiAgICAgc291bmRUcmlnZ2VyID0gbmV3IFNvdW5kVHJpZ2dlcihtb2R1bGUsIGNhbGxiYWNrKTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXJ2aWNlLT5hdHRhY2gobW9kdWxlLCBzb3VuZFRyaWdnZXIsIHNvdW5kVHJpZ2dlci0+bUlTb3VuZFRyaWdnZXIpOworICAgIHN0YXR1c190IHN0YXR1cyA9IHNlcnZpY2UtPmF0dGFjaChvcFBhY2thZ2VOYW1lLCBtb2R1bGUsIHNvdW5kVHJpZ2dlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291bmRUcmlnZ2VyLT5tSVNvdW5kVHJpZ2dlcik7CiAKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIHNvdW5kVHJpZ2dlci0+bUlTb3VuZFRyaWdnZXIgIT0gMCkgewogICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihzb3VuZFRyaWdnZXItPm1JU291bmRUcmlnZ2VyKS0+bGlua1RvRGVhdGgoc291bmRUcmlnZ2VyKTsKQEAgLTE4OCw2ICsxOTEsMTUgQEAKICAgICByZXR1cm4gbUlTb3VuZFRyaWdnZXItPnN0b3BSZWNvZ25pdGlvbihoYW5kbGUpOwogfQogCitzdGF0dXNfdCBTb3VuZFRyaWdnZXI6OmdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1JU291bmRUcmlnZ2VyID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtSVNvdW5kVHJpZ2dlci0+Z2V0TW9kZWxTdGF0ZShoYW5kbGUpOworfQorCiAvLyBCcFNvdW5kVHJpZ2dlckNsaWVudAogdm9pZCBTb3VuZFRyaWdnZXI6Om9uUmVjb2duaXRpb25FdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpCiB7Cg==